ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXVzYiBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXVzYgppbmRleCA3NzcyOTI4Li5kZWI2YjQ4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy11c2IKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtdXNiCkBAIC0xNDQsMyArMTQ0LDE2IEBACiAKIAkJV3JpdGUgYSAxIHRvIGZvcmNlIHRoZSBkZXZpY2UgdG8gZGlzY29ubmVjdAogCQkoZXF1aXZhbGVudCB0byB1bnBsdWdnaW5nIGEgd2lyZWQgVVNCIGRldmljZSkuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZHJpdmVycy8uLi4vcmVtb3ZlX2lkCitEYXRlOgkJTm92ZW1iZXIgMjAwOQorQ29udGFjdDoJQ0hFTkcgUmVucXVhbiA8cnFjaGVuZ0BzbXUuZWR1LnNnPgorRGVzY3JpcHRpb246CisJCVdyaXRpbmcgYSBkZXZpY2UgSUQgdG8gdGhpcyBmaWxlIHdpbGwgcmVtb3ZlIGFuIElECisJCXRoYXQgd2FzIGR5bmFtaWNhbGx5IGFkZGVkIHZpYSB0aGUgbmV3X2lkIHN5c2ZzIGVudHJ5LgorCQlUaGUgZm9ybWF0IGZvciB0aGUgZGV2aWNlIElEIGlzOgorCQlpZFZlbmRvciBpZFByb2R1Y3QuCUFmdGVyIHN1Y2Nlc3NmdWxseQorCQlyZW1vdmluZyBhbiBJRCwgdGhlIGRyaXZlciB3aWxsIG5vIGxvbmdlciBzdXBwb3J0IHRoZQorCQlkZXZpY2UuICBUaGlzIGlzIHVzZWZ1bCB0byBlbnN1cmUgYXV0byBwcm9iaW5nIHdvbid0CisJCW1hdGNoIHRoZSBkcml2ZXIgdG8gdGhlIGRldmljZS4gIEZvciBleGFtcGxlOgorCQkjIGVjaG8gIjA0NmQgYzMxNSIgPiAvc3lzL2J1cy91c2IvZHJpdmVycy9mb28vcmVtb3ZlX2lkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXV3Yl9yYy13dXNiaGMgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXV3Yl9yYy13dXNiaGMKaW5kZXggNGU4MTA2Zi4uMjViMWU3NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy11d2JfcmMtd3VzYmhjCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtdXdiX3JjLXd1c2JoYwpAQCAtMjMsMyArMjMsMTYgQEAKICAgICAgICAgICAgICAgICBTaW5jZSB0aGlzIHJlbGF0ZXMgdG8gc2VjdXJpdHkgKHNwZWNpZmljYWxseSwgdGhlCiAgICAgICAgICAgICAgICAgbGlmZXRpbWUgb2YgUFRLcyBhbmQgR1RLcykgaXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkCiAgICAgICAgICAgICAgICAgZnJvbSB0aGUgZGVmYXVsdC4KKworV2hhdDogICAgICAgICAgIC9zeXMvY2xhc3MvdXdiX3JjL3V3Yk4vd3VzYmhjL3d1c2JfcGh5X3JhdGUKK0RhdGU6ICAgICAgICAgICBBdWd1c3QgMjAwOQorS2VybmVsVmVyc2lvbjogIDIuNi4zMgorQ29udGFjdDogICAgICAgIERhdmlkIFZyYWJlbCA8ZGF2aWQudnJhYmVsQGNzci5jb20+CitEZXNjcmlwdGlvbjoKKyAgICAgICAgICAgICAgICBUaGUgbWF4aW11bSBQSFkgcmF0ZSB0byB1c2UgZm9yIGFsbCBjb25uZWN0ZWQgZGV2aWNlcy4KKyAgICAgICAgICAgICAgICBUaGlzIGlzIG9ubHkgb2YgbGltaXRlZCB1c2UgZm9yIHRlc3RpbmcgYW5kCisgICAgICAgICAgICAgICAgZGV2ZWxvcG1lbnQgYXMgdGhlIGhhcmR3YXJlJ3MgYXV0b21hdGljIHJhdGUKKyAgICAgICAgICAgICAgICBhZGFwdGF0aW9uIGlzIGJldHRlciB0aGVuIHRoaXMgc2ltcGxlIGNvbnRyb2wuCisKKyAgICAgICAgICAgICAgICBSZWZlciB0byBbRUNNQS0zNjhdIHNlY3Rpb24gMTAuMy4xLjEgZm9yIHRoZSB2YWx1ZSB0bworICAgICAgICAgICAgICAgIHVzZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1zeXN0ZW0tY3B1IGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1jcHUKaW5kZXggYTcwM2I5ZS4uOTc0ZTI5ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1jcHUKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1jcHUKQEAgLTEzNiw2ICsxMzYsMjQgQEAKIAkJU2VlIGZpbGVzIGluIERvY3VtZW50YXRpb24vY3B1aWRsZS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKIAorV2hhdDoJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSMvY3B1ZnJlcS8qCitEYXRlOgkJcHJlLWdpdCBoaXN0b3J5CitDb250YWN0OgljcHVmcmVxQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CURpc2NvdmVyIGFuZCBjaGFuZ2UgY2xvY2sgc3BlZWQgb2YgQ1BVcworCisJCUNsb2NrIHNjYWxpbmcgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIGNsb2NrIHNwZWVkIG9mIHRoZQorCQlDUFVzIG9uIHRoZSBmbHkuIFRoaXMgaXMgYSBuaWNlIG1ldGhvZCB0byBzYXZlIGJhdHRlcnkKKwkJcG93ZXIsIGJlY2F1c2UgdGhlIGxvd2VyIHRoZSBjbG9jayBzcGVlZCwgdGhlIGxlc3MgcG93ZXIKKwkJdGhlIENQVSBjb25zdW1lcy4KKworCQlUaGVyZSBhcmUgbWFueSBrbm9icyB0byB0d2VhayBpbiB0aGlzIGRpcmVjdG9yeS4KKworCQlTZWUgZmlsZXMgaW4gRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKwkJSW4gcGFydGljdWxhciwgcmVhZCBEb2N1bWVudGF0aW9uL2NwdS1mcmVxL3VzZXItZ3VpZGUudHh0CisJCXRvIGxlYXJuIGhvdyB0byBjb250cm9sIHRoZSBrbm9icy4KKworCiBXaGF0OiAgICAgIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSovY2FjaGUvaW5kZXgqL2NhY2hlX2Rpc2FibGVfWAogRGF0ZTogICAgICBBdWd1c3QgMjAwOAogS2VybmVsVmVyc2lvbjoJMi42LjI3CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FybS9PTUFQL0RTUyBiL0RvY3VtZW50YXRpb24vYXJtL09NQVAvRFNTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZjBlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2FybS9PTUFQL0RTUwpAQCAtMCwwICsxLDMxNyBAQAorT01BUDIvMyBEaXNwbGF5IFN1YnN5c3RlbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGlzIGFuIGFsbW9zdCB0b3RhbCByZXdyaXRlIG9mIHRoZSBPTUFQIEZCIGRyaXZlciBpbiBkcml2ZXJzL3ZpZGVvL29tYXAKKyhsZXQncyBjYWxsIGl0IERTUzEpLiBUaGUgbWFpbiBkaWZmZXJlbmNlcyBiZXR3ZWVuIERTUzEgYW5kIERTUzIgYXJlIERTSSwKK1RWLW91dCBhbmQgbXVsdGlwbGUgZGlzcGxheSBzdXBwb3J0LCBidXQgdGhlcmUgYXJlIGxvdHMgb2Ygc21hbGwgaW1wcm92ZW1lbnRzCithbHNvLgorCitUaGUgRFNTMiBkcml2ZXIgKG9tYXBkc3MgbW9kdWxlKSBpcyBpbiBhcmNoL2FybS9wbGF0LW9tYXAvZHNzLywgYW5kIHRoZSBGQiwKK3BhbmVsIGFuZCBjb250cm9sbGVyIGRyaXZlcnMgYXJlIGluIGRyaXZlcnMvdmlkZW8vb21hcDIvLiBEU1MxIGFuZCBEU1MyIGxpdmUKK2N1cnJlbnRseSBzaWRlIGJ5IHNpZGUsIHlvdSBjYW4gY2hvb3NlIHdoaWNoIG9uZSB0byB1c2UuCisKK0ZlYXR1cmVzCistLS0tLS0tLQorCitXb3JraW5nIGFuZCB0ZXN0ZWQgZmVhdHVyZXMgaW5jbHVkZToKKworLSBNSVBJIERQSSAocGFyYWxsZWwpIG91dHB1dAorLSBNSVBJIERTSSBvdXRwdXQgaW4gY29tbWFuZCBtb2RlCistIE1JUEkgREJJIChSRkJJKSBvdXRwdXQKKy0gU0RJIG91dHB1dAorLSBUViBvdXRwdXQKKy0gQWxsIHBpZWNlcyBjYW4gYmUgY29tcGlsZWQgYXMgYSBtb2R1bGUgb3IgaW5zaWRlIGtlcm5lbAorLSBVc2UgRElTUEMgdG8gdXBkYXRlIGFueSBvZiB0aGUgb3V0cHV0cworLSBVc2UgQ1BVIHRvIHVwZGF0ZSBSRkJJIG9yIERTSSBvdXRwdXQKKy0gT01BUCBESVNQQyBwbGFuZXMKKy0gUkdCMTYsIFJHQjI0IHBhY2tlZCwgUkdCMjQgdW5wYWNrZWQKKy0gWVVWMiwgVVlWWQorLSBTY2FsaW5nCistIEFkanVzdGluZyBEU1MgRkNLIHRvIGZpbmQgYSBnb29kIHBpeGVsIGNsb2NrCistIFVzZSBEU0kgRFBMTCB0byBjcmVhdGUgRFNTIEZDSworCitUZXN0ZWQgYm9hcmRzIGluY2x1ZGU6CistIE9NQVAzIFNEUCBib2FyZAorLSBCZWFnbGUgYm9hcmQKKy0gTjgxMAorCitvbWFwZHNzIGRyaXZlcgorLS0tLS0tLS0tLS0tLS0KKworVGhlIERTUyBkcml2ZXIgZG9lcyBub3QgaXRzZWxmIGhhdmUgYW55IHN1cHBvcnQgZm9yIExpbnV4IGZyYW1lYnVmZmVyLCBWNEwgb3IKK3N1Y2ggbGlrZSB0aGUgY3VycmVudCBvbmVzLCBidXQgaXQgaGFzIGFuIGludGVybmFsIGtlcm5lbCBBUEkgdGhhdCB1cHBlciBsZXZlbAorZHJpdmVycyBjYW4gdXNlLgorCitUaGUgRFNTIGRyaXZlciBtb2RlbHMgT01BUCdzIG92ZXJsYXlzLCBvdmVybGF5IG1hbmFnZXJzIGFuZCBkaXNwbGF5cyBpbiBhCitmbGV4aWJsZSB3YXkgdG8gZW5hYmxlIG5vbi1jb21tb24gbXVsdGktZGlzcGxheSBjb25maWd1cmF0aW9uLiBJbiBhZGRpdGlvbiB0bworbW9kZWxsaW5nIHRoZSBoYXJkd2FyZSBvdmVybGF5cywgb21hcGRzcyBzdXBwb3J0cyB2aXJ0dWFsIG92ZXJsYXlzIGFuZCBvdmVybGF5CittYW5hZ2Vycy4gVGhlc2UgY2FuIGJlIHVzZWQgd2hlbiB1cGRhdGluZyBhIGRpc3BsYXkgd2l0aCBDUFUgb3Igc3lzdGVtIERNQS4KKworUGFuZWwgYW5kIGNvbnRyb2xsZXIgZHJpdmVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZHJpdmVycyBpbXBsZW1lbnQgcGFuZWwgb3IgY29udHJvbGxlciBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5IGFuZCBhcmUgbm90Cit1c3VhbGx5IHZpc2libGUgdG8gdXNlcnMgZXhjZXB0IHRocm91Z2ggb21hcGZiIGRyaXZlci4gIFRoZXkgcmVnaXN0ZXIKK3RoZW1zZWx2ZXMgdG8gdGhlIERTUyBkcml2ZXIuCisKK29tYXBmYiBkcml2ZXIKKy0tLS0tLS0tLS0tLS0KKworVGhlIG9tYXBmYiBkcml2ZXIgaW1wbGVtZW50cyBhcmJpdHJhcnkgbnVtYmVyIG9mIHN0YW5kYXJkIGxpbnV4IGZyYW1lYnVmZmVycy4KK1RoZXNlIGZyYW1lYnVmZmVycyBjYW4gYmUgcm91dGVkIGZsZXhpYmx5IHRvIGFueSBvdmVybGF5cywgdGh1cyBhbGxvd2luZyB2ZXJ5CitkeW5hbWljIGRpc3BsYXkgYXJjaGl0ZWN0dXJlLgorCitUaGUgZHJpdmVyIGV4cG9ydHMgc29tZSBvbWFwZmIgc3BlY2lmaWMgaW9jdGxzLCB3aGljaCBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZQoraW9jdGxzIGluIHRoZSBvbGQgZHJpdmVyLgorCitUaGUgcmVzdCBvZiB0aGUgbm9uIHN0YW5kYXJkIGZlYXR1cmVzIGFyZSBleHBvcnRlZCB2aWEgc3lzZnMuIFdoZXRoZXIgdGhlIGZpbmFsCitpbXBsZW1lbnRhdGlvbiB3aWxsIHVzZSBzeXNmcywgb3IgaW9jdGxzLCBpcyBzdGlsbCBvcGVuLgorCitWNEwyIGRyaXZlcnMKKy0tLS0tLS0tLS0tLQorCitWNEwyIGlzIGJlaW5nIGltcGxlbWVudGVkIGluIFRJLgorCitGcm9tIG9tYXBkc3MgcG9pbnQgb2YgdmlldyB0aGUgVjRMMiBkcml2ZXJzIHNob3VsZCBiZSBzaW1pbGFyIHRvIGZyYW1lYnVmZmVyCitkcml2ZXIuCisKK0FyY2hpdGVjdHVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU29tZSBjbGFyaWZpY2F0aW9uIHdoYXQgdGhlIGRpZmZlcmVudCBjb21wb25lbnRzIGRvOgorCisgICAgLSBGcmFtZWJ1ZmZlciBpcyBhIG1lbW9yeSBhcmVhIGluc2lkZSBPTUFQJ3MgU1JBTS9TRFJBTSB0aGF0IGNvbnRhaW5zIHRoZQorICAgICAgcGl4ZWwgZGF0YSBmb3IgdGhlIGltYWdlLiBGcmFtZWJ1ZmZlciBoYXMgd2lkdGggYW5kIGhlaWdodCBhbmQgY29sb3IKKyAgICAgIGRlcHRoLgorICAgIC0gT3ZlcmxheSBkZWZpbmVzIHdoZXJlIHRoZSBwaXhlbHMgYXJlIHJlYWQgZnJvbSBhbmQgd2hlcmUgdGhleSBnbyBvbiB0aGUKKyAgICAgIHNjcmVlbi4gVGhlIG92ZXJsYXkgbWF5IGJlIHNtYWxsZXIgdGhhbiBmcmFtZWJ1ZmZlciwgdGh1cyBkaXNwbGF5aW5nIG9ubHkKKyAgICAgIHBhcnQgb2YgdGhlIGZyYW1lYnVmZmVyLiBUaGUgcG9zaXRpb24gb2YgdGhlIG92ZXJsYXkgbWF5IGJlIGNoYW5nZWQgaWYKKyAgICAgIHRoZSBvdmVybGF5IGlzIHNtYWxsZXIgdGhhbiB0aGUgZGlzcGxheS4KKyAgICAtIE92ZXJsYXkgbWFuYWdlciBjb21iaW5lcyB0aGUgb3ZlcmxheXMgaW4gdG8gb25lIGltYWdlIGFuZCBmZWVkcyB0aGVtIHRvCisgICAgICBkaXNwbGF5LgorICAgIC0gRGlzcGxheSBpcyB0aGUgYWN0dWFsIHBoeXNpY2FsIGRpc3BsYXkgZGV2aWNlLgorCitBIGZyYW1lYnVmZmVyIGNhbiBiZSBjb25uZWN0ZWQgdG8gbXVsdGlwbGUgb3ZlcmxheXMgdG8gc2hvdyB0aGUgc2FtZSBwaXhlbCBkYXRhCitvbiBhbGwgb2YgdGhlIG92ZXJsYXlzLiBOb3RlIHRoYXQgaW4gdGhpcyBjYXNlIHRoZSBvdmVybGF5IGlucHV0IHNpemVzIG11c3QgYmUKK3RoZSBzYW1lLCBidXQsIGluIGNhc2Ugb2YgdmlkZW8gb3ZlcmxheXMsIHRoZSBvdXRwdXQgc2l6ZSBjYW4gYmUgZGlmZmVyZW50LiBBbnkKK2ZyYW1lYnVmZmVyIGNhbiBiZSBjb25uZWN0ZWQgdG8gYW55IG92ZXJsYXkuCisKK0FuIG92ZXJsYXkgY2FuIGJlIGNvbm5lY3RlZCB0byBvbmUgb3ZlcmxheSBtYW5hZ2VyLiBBbHNvIERJU1BDIG92ZXJsYXlzIGNhbiBiZQorY29ubmVjdGVkIG9ubHkgdG8gRElTUEMgb3ZlcmxheSBtYW5hZ2VycywgYW5kIHZpcnR1YWwgb3ZlcmxheXMgY2FuIGJlIG9ubHkKK2Nvbm5lY3RlZCB0byB2aXJ0dWFsIG92ZXJsYXlzLgorCitBbiBvdmVybGF5IG1hbmFnZXIgY2FuIGJlIGNvbm5lY3RlZCB0byBvbmUgZGlzcGxheS4gVGhlcmUgYXJlIGNlcnRhaW4KK3Jlc3RyaWN0aW9ucyB3aGljaCBraW5kcyBvZiBkaXNwbGF5cyBhbiBvdmVybGF5IG1hbmFnZXIgY2FuIGJlIGNvbm5lY3RlZDoKKworICAgIC0gRElTUEMgVFYgb3ZlcmxheSBtYW5hZ2VyIGNhbiBiZSBvbmx5IGNvbm5lY3RlZCB0byBUViBkaXNwbGF5LgorICAgIC0gVmlydHVhbCBvdmVybGF5IG1hbmFnZXJzIGNhbiBvbmx5IGJlIGNvbm5lY3RlZCB0byBEQkkgb3IgRFNJIGRpc3BsYXlzLgorICAgIC0gRElTUEMgTENEIG92ZXJsYXkgbWFuYWdlciBjYW4gYmUgY29ubmVjdGVkIHRvIGFsbCBkaXNwbGF5cywgZXhjZXB0IFRWCisgICAgICBkaXNwbGF5LgorCitTeXNmcworLS0tLS0KK1RoZSBzeXNmcyBpbnRlcmZhY2UgaXMgbWFpbmx5IHVzZWQgZm9yIHRlc3RpbmcuIEkgZG9uJ3QgdGhpbmsgc3lzZnMKK2ludGVyZmFjZSBpcyB0aGUgYmVzdCBmb3IgdGhpcyBpbiB0aGUgZmluYWwgdmVyc2lvbiwgYnV0IEkgZG9uJ3QgcXVpdGUga25vdword2hhdCB3b3VsZCBiZSB0aGUgYmVzdCBpbnRlcmZhY2VzIGZvciB0aGVzZSB0aGluZ3MuCisKK1RoZSBzeXNmcyBpbnRlcmZhY2UgaXMgZGl2aWRlZCB0byB0d28gcGFydHM6IERTUyBhbmQgRkIuCisKKy9zeXMvY2xhc3MvZ3JhcGhpY3MvZmI/IGRpcmVjdG9yeToKK21pcnJvcgkJMD1vZmYsIDE9b24KK3JvdGF0ZQkJUm90YXRpb24gMC0zIGZvciAwLCA5MCwgMTgwLCAyNzAgZGVncmVlcworcm90YXRlX3R5cGUJMCA9IERNQSByb3RhdGlvbiwgMSA9IFZSRkIgcm90YXRpb24KK292ZXJsYXlzCUxpc3Qgb2Ygb3ZlcmxheSBudW1iZXJzIHRvIHdoaWNoIGZyYW1lYnVmZmVyIHBpeGVscyBnbworcGh5c19hZGRyCVBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGZyYW1lYnVmZmVyCit2aXJ0X2FkZHIJVmlydHVhbCBhZGRyZXNzIG9mIHRoZSBmcmFtZWJ1ZmZlcgorc2l6ZQkJU2l6ZSBvZiB0aGUgZnJhbWVidWZmZXIKKworL3N5cy9kZXZpY2VzL3BsYXRmb3JtL29tYXBkc3Mvb3ZlcmxheT8gZGlyZWN0b3J5OgorZW5hYmxlZAkJMD1vZmYsIDE9b24KK2lucHV0X3NpemUJd2lkdGgsaGVpZ2h0IChpZS4gdGhlIGZyYW1lYnVmZmVyIHNpemUpCittYW5hZ2VyCQlEZXN0aW5hdGlvbiBvdmVybGF5IG1hbmFnZXIgbmFtZQorbmFtZQorb3V0cHV0X3NpemUJd2lkdGgsaGVpZ2h0Citwb3NpdGlvbgl4LHkKK3NjcmVlbl93aWR0aAl3aWR0aAorZ2xvYmFsX2FscGhhICAgCWdsb2JhbCBhbHBoYSAwLTI1NSAwPXRyYW5zcGFyZW50IDI1NT1vcGFxdWUKKworL3N5cy9kZXZpY2VzL3BsYXRmb3JtL29tYXBkc3MvbWFuYWdlcj8gZGlyZWN0b3J5OgorZGlzcGxheQkJCQlEZXN0aW5hdGlvbiBkaXNwbGF5CituYW1lCithbHBoYV9ibGVuZGluZ19lbmFibGVkCQkwPW9mZiwgMT1vbgordHJhbnNfa2V5X2VuYWJsZWQJCTA9b2ZmLCAxPW9uCit0cmFuc19rZXlfdHlwZQkJCWdmeC1kZXN0aW5hdGlvbiwgdmlkZW8tc291cmNlCit0cmFuc19rZXlfdmFsdWUJCQl0cmFuc3BhcmVuY3kgY29sb3Iga2V5IChSR0IyNCkKK2RlZmF1bHRfY29sb3IJCQlkZWZhdWx0IGJhY2tncm91bmQgY29sb3IgKFJHQjI0KQorCisvc3lzL2RldmljZXMvcGxhdGZvcm0vb21hcGRzcy9kaXNwbGF5PyBkaXJlY3Rvcnk6CitjdHJsX25hbWUJQ29udHJvbGxlciBuYW1lCittaXJyb3IJCTA9b2ZmLCAxPW9uCit1cGRhdGVfbW9kZQkwPW9mZiwgMT1hdXRvLCAyPW1hbnVhbAorZW5hYmxlZAkJMD1vZmYsIDE9b24KK25hbWUKK3JvdGF0ZQkJUm90YXRpb24gMC0zIGZvciAwLCA5MCwgMTgwLCAyNzAgZGVncmVlcwordGltaW5ncwkJRGlzcGxheSB0aW1pbmdzIChwaXhjbG9jayx4cmVzL2hmcC9oYnAvaHN3LHlyZXMvdmZwL3ZicC92c3cpCisJCVdoZW4gd3JpdGluZywgdHdvIHNwZWNpYWwgdGltaW5ncyBhcmUgYWNjZXB0ZWQgZm9yIHR2LW91dDoKKwkJInBhbCIgYW5kICJudHNjIgorcGFuZWxfbmFtZQordGVhcl9lbGltCVRlYXJpbmcgZWxpbWluYXRpb24gMD1vZmYsIDE9b24KKworVGhlcmUgYXJlIGFsc28gc29tZSBkZWJ1Z2ZzIGZpbGVzIGF0IDxkZWJ1Z2ZzPi9vbWFwZHNzLyB3aGljaCBzaG93IGluZm9ybWF0aW9uCithYm91dCBjbG9ja3MgYW5kIHJlZ2lzdGVycy4KKworRXhhbXBsZXMKKy0tLS0tLS0tCisKK1RoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgaGF2ZSBiZWVuIG1hZGUgZm9yIHRoZSBleGFtcGxlcyBiZWxvdzoKKworb3ZsMD0vc3lzL2RldmljZXMvcGxhdGZvcm0vb21hcGRzcy9vdmVybGF5MAorb3ZsMT0vc3lzL2RldmljZXMvcGxhdGZvcm0vb21hcGRzcy9vdmVybGF5MQorb3ZsMj0vc3lzL2RldmljZXMvcGxhdGZvcm0vb21hcGRzcy9vdmVybGF5MgorCittZ3IwPS9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9vbWFwZHNzL21hbmFnZXIwCittZ3IxPS9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9vbWFwZHNzL21hbmFnZXIxCisKK2xjZD0vc3lzL2RldmljZXMvcGxhdGZvcm0vb21hcGRzcy9kaXNwbGF5MAorZHZpPS9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9vbWFwZHNzL2Rpc3BsYXkxCit0dj0vc3lzL2RldmljZXMvcGxhdGZvcm0vb21hcGRzcy9kaXNwbGF5MgorCitmYjA9L3N5cy9jbGFzcy9ncmFwaGljcy9mYjAKK2ZiMT0vc3lzL2NsYXNzL2dyYXBoaWNzL2ZiMQorZmIyPS9zeXMvY2xhc3MvZ3JhcGhpY3MvZmIyCisKK0RlZmF1bHQgc2V0dXAgb24gT01BUDMgU0RQCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitIZXJlJ3MgdGhlIGRlZmF1bHQgc2V0dXAgb24gT01BUDMgU0RQIGJvYXJkLiBBbGwgcGxhbmVzIGdvIHRvIExDRC4gRFZJCithbmQgVFYtb3V0IGFyZSBub3QgaW4gdXNlLiBUaGUgY29sdW1ucyBmcm9tIGxlZnQgdG8gcmlnaHQgYXJlOgorZnJhbWVidWZmZXJzLCBvdmVybGF5cywgb3ZlcmxheSBtYW5hZ2VycywgZGlzcGxheXMuIEZyYW1lYnVmZmVycyBhcmUKK2hhbmRsZWQgYnkgb21hcGZiLCBhbmQgdGhlIHJlc3QgYnkgdGhlIERTUy4KKworRkIwIC0tLSBHRlggIC1cICAgICAgICAgICAgRFZJCitGQjEgLS0tIFZJRDEgLS0rLSBMQ0QgLS0tLSBMQ0QKK0ZCMiAtLS0gVklEMiAtLyAgIFRWIC0tLS0tIFRWCisKK0V4YW1wbGU6IFN3aXRjaCBmcm9tIExDRCB0byBEVkkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordz1gY2F0ICRkdmkvdGltaW5ncyB8IGN1dCAtZCAiLCIgLWYgMiB8IGN1dCAtZCAiLyIgLWYgMWAKK2g9YGNhdCAkZHZpL3RpbWluZ3MgfCBjdXQgLWQgIiwiIC1mIDMgfCBjdXQgLWQgIi8iIC1mIDFgCisKK2VjaG8gIjAiID4gJGxjZC9lbmFibGVkCitlY2hvICIiID4gJG1ncjAvZGlzcGxheQorZmJzZXQgLWZiIC9kZXYvZmIwIC14cmVzICR3IC15cmVzICRoIC12eHJlcyAkdyAtdnlyZXMgJGgKKyMgYXQgdGhpcyBwb2ludCB5b3UgaGF2ZSB0byBzd2l0Y2ggdGhlIGR2aS9sY2QgZGlwLXN3aXRjaCBmcm9tIHRoZSBvbWFwIGJvYXJkCitlY2hvICJkdmkiID4gJG1ncjAvZGlzcGxheQorZWNobyAiMSIgPiAkZHZpL2VuYWJsZWQKKworQWZ0ZXIgdGhpcyB0aGUgY29uZmlndXJhdGlvbiBsb29rcyBsaWtlOgorCitGQjAgLS0tIEdGWCAgLVwgICAgICAgICAtLSBEVkkKK0ZCMSAtLS0gVklEMSAtLSstIExDRCAtLyAgIExDRAorRkIyIC0tLSBWSUQyIC0vICAgVFYgLS0tLS0gVFYKKworRXhhbXBsZTogQ2xvbmUgR0ZYIG92ZXJsYXkgdG8gTENEIGFuZCBUVgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3PWBjYXQgJHR2L3RpbWluZ3MgfCBjdXQgLWQgIiwiIC1mIDIgfCBjdXQgLWQgIi8iIC1mIDFgCitoPWBjYXQgJHR2L3RpbWluZ3MgfCBjdXQgLWQgIiwiIC1mIDMgfCBjdXQgLWQgIi8iIC1mIDFgCisKK2VjaG8gIjAiID4gJG92bDAvZW5hYmxlZAorZWNobyAiMCIgPiAkb3ZsMS9lbmFibGVkCisKK2VjaG8gIiIgPiAkZmIxL292ZXJsYXlzCitlY2hvICIwLDEiID4gJGZiMC9vdmVybGF5cworCitlY2hvICIkdywkaCIgPiAkb3ZsMS9vdXRwdXRfc2l6ZQorZWNobyAidHYiID4gJG92bDEvbWFuYWdlcgorCitlY2hvICIxIiA+ICRvdmwwL2VuYWJsZWQKK2VjaG8gIjEiID4gJG92bDEvZW5hYmxlZAorCitlY2hvICIxIiA+ICR0di9lbmFibGVkCisKK0FmdGVyIHRoaXMgdGhlIGNvbmZpZ3VyYXRpb24gbG9va3MgbGlrZSAob25seSByZWxldmFudCBwYXJ0cyBzaG93bik6CisKK0ZCMCArLS0gR0ZYICAtLS0tIExDRCAtLS0tIExDRAorICAgICBcLSBWSUQxIC0tLS0gVFYgIC0tLS0gVFYKKworTWlzYyBub3RlcworLS0tLS0tLS0tLQorCitPTUFQIEZCIGFsbG9jYXRlcyB0aGUgZnJhbWVidWZmZXIgbWVtb3J5IHVzaW5nIHRoZSBPTUFQIFZSQU0gYWxsb2NhdG9yLgorCitVc2luZyBEU0kgRFBMTCB0byBnZW5lcmF0ZSBwaXhlbCBjbG9jayBpdCBpcyBwb3NzaWJsZSBwcm9kdWNlIHRoZSBwaXhlbCBjbG9jaworb2YgODYuNU1IeiAobWF4IHBvc3NpYmxlKSwgYW5kIHdpdGggdGhhdCB5b3UgZ2V0IDEyODB4MTAyNEA1NyBvdXRwdXQgZnJvbSBEVkkuCisKK1JvdGF0aW9uIGFuZCBtaXJyb3JpbmcgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgUkdCNTY1IGFuZCBSR0I4ODg4IG1vZGVzLiBWUkZCCitkb2VzIG5vdCBzdXBwb3J0IG1pcnJvcmluZy4KKworVlJGQiByb3RhdGlvbiByZXF1aXJlcyBtdWNoIG1vcmUgbWVtb3J5IHRoYW4gbm9uLXJvdGF0ZWQgZnJhbWVidWZmZXIsIHNvIHlvdQorcHJvYmFibHkgbmVlZCB0byBpbmNyZWFzZSB5b3VyIHZyYW0gc2V0dGluZyBiZWZvcmUgdXNpbmcgVlJGQiByb3RhdGlvbi4gQWxzbywKK21hbnkgYXBwbGljYXRpb25zIG1heSBub3Qgd29yayB3aXRoIFZSRkIgaWYgdGhleSBkbyBub3QgcGF5IGF0dGVudGlvbiB0byBhbGwKK2ZyYW1lYnVmZmVyIHBhcmFtZXRlcnMuCisKK0tlcm5lbCBib290IGFyZ3VtZW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZyYW09PHNpemU+CisJLSBBbW91bnQgb2YgdG90YWwgVlJBTSB0byBwcmVhbGxvY2F0ZS4gRm9yIGV4YW1wbGUsICIxME0iLiBvbWFwZmIKKwkgIGFsbG9jYXRlcyBtZW1vcnkgZm9yIGZyYW1lYnVmZmVycyBmcm9tIFZSQU0uCisKK29tYXBmYi5tb2RlPTxkaXNwbGF5Pjo8bW9kZT5bLC4uLl0KKwktIERlZmF1bHQgdmlkZW8gbW9kZSBmb3Igc3BlY2lmaWVkIGRpc3BsYXlzLiBGb3IgZXhhbXBsZSwKKwkgICJkdmk6ODAweDQwME1SLTI0QDYwIi4gIFNlZSBkcml2ZXJzL3ZpZGVvL21vZGVkYi5jLgorCSAgVGhlcmUgYXJlIGFsc28gdHdvIHNwZWNpYWwgbW9kZXM6ICJwYWwiIGFuZCAibnRzYyIgdGhhdAorCSAgY2FuIGJlIHVzZWQgdG8gdHYgb3V0LgorCitvbWFwZmIudnJhbT08ZmJudW0+OjxzaXplPltAPHBoeXNhZGRyPl1bLC4uLl0KKwktIFZSQU0gYWxsb2NhdGVkIGZvciBhIGZyYW1lYnVmZmVyLiBOb3JtYWxseSBvbWFwZmIgYWxsb2NhdGVzIHZyYW0KKwkgIGRlcGVuZGluZyBvbiB0aGUgZGlzcGxheSBzaXplLiBXaXRoIHRoaXMgeW91IGNhbiBtYW51YWxseSBhbGxvY2F0ZQorCSAgbW9yZSBvciBkZWZpbmUgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgZWFjaCBmcmFtZWJ1ZmZlci4gRm9yIGV4YW1wbGUsCisJICAiMTo0TSIgdG8gYWxsb2NhdGUgNE0gZm9yIGZiMS4KKworb21hcGZiLmRlYnVnPTx5fG4+CisJLSBFbmFibGUgZGVidWcgcHJpbnRpbmcuIFlvdSBoYXZlIHRvIGhhdmUgT01BUEZCIGRlYnVnIHN1cHBvcnQgZW5hYmxlZAorCSAgaW4ga2VybmVsIGNvbmZpZy4KKworb21hcGZiLnRlc3Q9PHl8bj4KKwktIERyYXcgdGVzdCBwYXR0ZXJuIHRvIGZyYW1lYnVmZmVyIHdoZW5ldmVyIGZyYW1lYnVmZmVyIHNldHRpbmdzIGNoYW5nZS4KKwkgIFlvdSBuZWVkIHRvIGhhdmUgT01BUEZCIGRlYnVnIHN1cHBvcnQgZW5hYmxlZCBpbiBrZXJuZWwgY29uZmlnLgorCitvbWFwZmIudnJmYj08eXxuPgorCS0gVXNlIFZSRkIgcm90YXRpb24gZm9yIGFsbCBmcmFtZWJ1ZmZlcnMuCisKK29tYXBmYi5yb3RhdGU9PGFuZ2xlPgorCS0gRGVmYXVsdCByb3RhdGlvbiBhcHBsaWVkIHRvIGFsbCBmcmFtZWJ1ZmZlcnMuCisJICAwIC0gMCBkZWdyZWUgcm90YXRpb24KKwkgIDEgLSA5MCBkZWdyZWUgcm90YXRpb24KKwkgIDIgLSAxODAgZGVncmVlIHJvdGF0aW9uCisJICAzIC0gMjcwIGRlZ3JlZSByb3RhdGlvbgorCitvbWFwZmIubWlycm9yPTx5fG4+CisJLSBEZWZhdWx0IG1pcnJvciBmb3IgYWxsIGZyYW1lYnVmZmVycy4gT25seSB3b3JrcyB3aXRoIERNQSByb3RhdGlvbi4KKworb21hcGRzcy5kZWZfZGlzcD08ZGlzcGxheT4KKwktIE5hbWUgb2YgZGVmYXVsdCBkaXNwbGF5LCB0byB3aGljaCBhbGwgb3ZlcmxheXMgd2lsbCBiZSBjb25uZWN0ZWQuCisJICBDb21tb24gZXhhbXBsZXMgYXJlICJsY2QiIG9yICJ0diIuCisKK29tYXBkc3MuZGVidWc9PHl8bj4KKwktIEVuYWJsZSBkZWJ1ZyBwcmludGluZy4gWW91IGhhdmUgdG8gaGF2ZSBEU1MgZGVidWcgc3VwcG9ydCBlbmFibGVkIGluCisJICBrZXJuZWwgY29uZmlnLgorCitUT0RPCistLS0tCisKK0RTUyBsb2NraW5nCisKK0Vycm9yIGNoZWNraW5nCistIExvdHMgb2YgY2hlY2tzIGFyZSBtaXNzaW5nIG9yIGltcGxlbWVudGVkIGp1c3QgYXMgQlVHKCkKKworU3lzdGVtIERNQSB1cGRhdGUgZm9yIERTSQorLSBDYW4gYmUgdXNlZCBmb3IgUkdCMTYgYW5kIFJHQjI0UCBtb2Rlcy4gUHJvYmFibHkgbm90IGZvciBSR0IyNFUgKGhvdworICB0byBza2lwIHRoZSBlbXB0eSBieXRlPykKKworT01BUDEgc3VwcG9ydAorLSBOb3Qgc3VyZSBpZiBuZWVkZWQKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9jcHUtZHJpdmVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdS1kcml2ZXJzLnR4dAppbmRleCA3NWE1OGQxLi42YzMwZTkzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdS1kcml2ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdS1kcml2ZXJzLnR4dApAQCAtOTIsOSArOTIsOSBAQAogCQkJCShpbiBrSHopIHdoaWNoIGlzIHN1cHBvcnRlZCBieSAKIAkJCQl0aGlzIENQVQogcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSAgIHRoZSB0aW1lIGl0IHRha2VzIG9uIHRoaXMgQ1BVIHRvCi0JCQkJc3dpdGNoIGJldHdlZW4gdHdvIGZyZXF1ZW5jaWVzIChpZgotCQkJCWFwcHJvcHJpYXRlLCBlbHNlIHNwZWNpZnkKLQkJCQlDUFVGUkVRX0VURVJOQUwpCisJCQkJc3dpdGNoIGJldHdlZW4gdHdvIGZyZXF1ZW5jaWVzIGluCisJCQkJbmFub3NlY29uZHMgKGlmIGFwcHJvcHJpYXRlLCBlbHNlCisJCQkJc3BlY2lmeSBDUFVGUkVRX0VURVJOQUwpCiAKIHBvbGljeS0+Y3VyCQkJVGhlIGN1cnJlbnQgb3BlcmF0aW5nIGZyZXF1ZW5jeSBvZgogCQkJCXRoaXMgQ1BVIChpZiBhcHByb3ByaWF0ZSkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvdXNlci1ndWlkZS50eHQgYi9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL3VzZXItZ3VpZGUudHh0CmluZGV4IDJhNWI4NTAuLjA0ZjZiMzIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvdXNlci1ndWlkZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS91c2VyLWd1aWRlLnR4dApAQCAtMjAzLDYgKzIwMywxNyBAQAogCQkJCXRoZSBmcmVxdWVuY3kgdGhlIGtlcm5lbCB0aGlua3MgdGhlIENQVSBydW5zCiAJCQkJYXQuCiAKK2Jpb3NfbGltaXQgOgkJCUlmIHRoZSBCSU9TIHRlbGxzIHRoZSBPUyB0byBsaW1pdCBhIENQVSB0bworCQkJCWxvd2VyIGZyZXF1ZW5jaWVzLCB0aGUgdXNlciBjYW4gcmVhZCBvdXQgdGhlCisJCQkJbWF4aW11bSBhdmFpbGFibGUgZnJlcXVlbmN5IGZyb20gdGhpcyBmaWxlLgorCQkJCVRoaXMgdHlwaWNhbGx5IGNhbiBoYXBwZW4gdGhyb3VnaCAob2Z0ZW4gbm90CisJCQkJaW50ZW5kZWQpIEJJT1Mgc2V0dGluZ3MsIHJlc3RyaWN0aW9ucworCQkJCXRyaWdnZXJlZCB0aHJvdWdoIGEgc2VydmljZSBwcm9jZXNzb3Igb3Igb3RoZXIKKwkJCQlCSU9TL0hXIGJhc2VkIGltcGxlbWVudGF0aW9ucy4KKwkJCQlUaGlzIGRvZXMgbm90IGNvdmVyIHRoZXJtYWwgQUNQSSBsaW1pdGF0aW9ucworCQkJCXdoaWNoIGNhbiBiZSBkZXRlY3RlZCB0aHJvdWdoIHRoZSBnZW5lcmljCisJCQkJdGhlcm1hbCBkcml2ZXIuCisKIElmIHlvdSBoYXZlIHNlbGVjdGVkIHRoZSAidXNlcnNwYWNlIiBnb3Zlcm5vciB3aGljaCBhbGxvd3MgeW91IHRvCiBzZXQgdGhlIENQVSBvcGVyYXRpbmcgZnJlcXVlbmN5IHRvIGEgc3BlY2lmaWMgdmFsdWUsIHlvdSBjYW4gcmVhZCBvdXQKIHRoZSBjdXJyZW50IGZyZXF1ZW5jeSBpbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0My50eHQKaW5kZXggMDVkNWNmMS4uODY3YzViNTAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0My50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQzLnR4dApAQCAtMzIsOCArMzIsOCBAQAogCQkJaWRlbnRpZmllZCB0aHJvdWdoIGl0cyBuZXcgbWFqb3IvbWlub3IgbnVtYmVycyBlbmNvZGVkCiAJCQlpbiBkZXZudW0uCiAKLW5vbG9hZAkJCURvbid0IGxvYWQgdGhlIGpvdXJuYWwgb24gbW91bnRpbmcuIE5vdGUgdGhhdCB0aGlzIGZvcmNlcwotCQkJbW91bnQgb2YgaW5jb25zaXN0ZW50IGZpbGVzeXN0ZW0sIHdoaWNoIGNhbiBsZWFkIHRvCitub3JlY292ZXJ5CQlEb24ndCBsb2FkIHRoZSBqb3VybmFsIG9uIG1vdW50aW5nLiBOb3RlIHRoYXQgdGhpcyBmb3JjZXMKK25vbG9hZAkJCW1vdW50IG9mIGluY29uc2lzdGVudCBmaWxlc3lzdGVtLCB3aGljaCBjYW4gbGVhZCB0bwogCQkJdmFyaW91cyBwcm9ibGVtcy4KIAogZGF0YT1qb3VybmFsCQlBbGwgZGF0YSBhcmUgY29tbWl0dGVkIGludG8gdGhlIGpvdXJuYWwgcHJpb3IgdG8gYmVpbmcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbmlsZnMyLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbmlsZnMyLnR4dAppbmRleCAwMTUzOWY0Li40OTQ5ZmNhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL25pbGZzMi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9uaWxmczIudHh0CkBAIC00OSw4ICs0OSw3IEBACiBOSUxGUzIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBtb3VudCBvcHRpb25zOgogKCopID09IGRlZmF1bHQKIAotYmFycmllcj1vbigqKQkJVGhpcyBlbmFibGVzL2Rpc2FibGVzIGJhcnJpZXJzLiBiYXJyaWVyPW9mZiBkaXNhYmxlcwotCQkJaXQsIGJhcnJpZXI9b24gZW5hYmxlcyBpdC4KK25vYmFycmllcgkJRGlzYWJsZXMgYmFycmllcnMuCiBlcnJvcnM9Y29udGludWUoKikJS2VlcCBnb2luZyBvbiBhIGZpbGVzeXN0ZW0gZXJyb3IuCiBlcnJvcnM9cmVtb3VudC1ybwlSZW1vdW50IHRoZSBmaWxlc3lzdGVtIHJlYWQtb25seSBvbiBhbiBlcnJvci4KIGVycm9ycz1wYW5pYwkJUGFuaWMgYW5kIGhhbHQgdGhlIG1hY2hpbmUgaWYgYW4gZXJyb3Igb2NjdXJzLgpAQCAtNzEsNiArNzAsMTAgQEAKIAkJCWJsb2Nrcy4gIFRoYXQgbWVhbnMsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBubwogCQkJb3ZlcnRha2luZyBvZiBldmVudHMgb2NjdXJzIGluIHRoZSByZWNvdmVyZWQgZmlsZQogCQkJc3lzdGVtIGFmdGVyIGEgY3Jhc2guCitub3JlY292ZXJ5CQlEaXNhYmxlIHJlY292ZXJ5IG9mIHRoZSBmaWxlc3lzdGVtIG9uIG1vdW50LgorCQkJVGhpcyBkaXNhYmxlcyBldmVyeSB3cml0ZSBhY2Nlc3Mgb24gdGhlIGRldmljZSBmb3IKKwkJCXJlYWQtb25seSBtb3VudHMgb3Igc25hcHNob3RzLiAgVGhpcyBvcHRpb24gd2lsbCBmYWlsCisJCQlmb3Igci93IG1vdW50cyBvbiBhbiB1bmNsZWFuIHZvbHVtZS4KIAogTklMRlMyIHVzYWdlCiA9PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dAppbmRleCA2MjNmMDk0Li4zZGUyZjMyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CkBAIC00NzIsNyArNDcyLDcgQEAKIHdyaXRpbmcgb3V0IHRoZSB3aG9sZSBhZGRyZXNzX3NwYWNlLgogCiBUaGUgV3JpdGViYWNrIHRhZyBpcyB1c2VkIGJ5IGZpbGVtYXAqd2FpdCogYW5kIHN5bmNfcGFnZSogZnVuY3Rpb25zLAotdmlhIHdhaXRfb25fcGFnZV93cml0ZWJhY2tfcmFuZ2UsIHRvIHdhaXQgZm9yIGFsbCB3cml0ZWJhY2sgdG8KK3ZpYSBmaWxlbWFwX2ZkYXRhd2FpdF9yYW5nZSwgdG8gd2FpdCBmb3IgYWxsIHdyaXRlYmFjayB0bwogY29tcGxldGUuICBXaGlsZSB3YWl0aW5nIC0+c3luY19wYWdlIChpZiBkZWZpbmVkKSB3aWxsIGJlIGNhbGxlZCBvbgogZWFjaCBwYWdlIHRoYXQgaXMgZm91bmQgdG8gcmVxdWlyZSB3cml0ZWJhY2suCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKaW5kZXggNzc3ZGM4YS4uM2Y4ODZlMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKQEAgLTI2NjMsNiArMjY2Myw4IEBACiAJCQl0byBhIGNvbW1vbiB1c2Itc3RvcmFnZSBxdWlyayBmbGFnIGFzIGZvbGxvd3M6CiAJCQkJYSA9IFNBTkVfU0VOU0UgKGNvbGxlY3QgbW9yZSB0aGFuIDE4IGJ5dGVzCiAJCQkJCW9mIHNlbnNlIGRhdGEpOworCQkJCWIgPSBCQURfU0VOU0UgKGRvbid0IGNvbGxlY3QgbW9yZSB0aGFuIDE4CisJCQkJCWJ5dGVzIG9mIHNlbnNlIGRhdGEpOwogCQkJCWMgPSBGSVhfQ0FQQUNJVFkgKGRlY3JlYXNlIHRoZSByZXBvcnRlZAogCQkJCQlkZXZpY2UgY2FwYWNpdHkgYnkgb25lIHNlY3Rvcik7CiAJCQkJaCA9IENBUEFDSVRZX0hFVVJJU1RJQ1MgKGRlY3JlYXNlIHRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9sb2Nrc3RhdC50eHQgYi9Eb2N1bWVudGF0aW9uL2xvY2tzdGF0LnR4dAppbmRleCA5Y2I5MTM4Li42NWY0Yzc5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2xvY2tzdGF0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2xvY2tzdGF0LnR4dApAQCAtNjIsOCArNjIsMjAgQEAKIEl0IGFsc28gdHJhY2tzIDQgY29udGVudGlvbiBwb2ludHMgcGVyIGNsYXNzLiBBIGNvbnRlbnRpb24gcG9pbnQgaXMgYSBjYWxsIHNpdGUKIHRoYXQgaGFkIHRvIHdhaXQgb24gbG9jayBhY3F1aXNpdGlvbi4KIAorIC0gQ09ORklHVVJBVElPTgorCitMb2NrIHN0YXRpc3RpY3MgYXJlIGVuYWJsZWQgdmlhIENPTkZJR19MT0NLX1NUQVRTLgorCiAgLSBVU0FHRQogCitFbmFibGUgY29sbGVjdGlvbiBvZiBzdGF0aXN0aWNzOgorCisjIGVjaG8gMSA+L3Byb2Mvc3lzL2tlcm5lbC9sb2NrX3N0YXQKKworRGlzYWJsZSBjb2xsZWN0aW9uIG9mIHN0YXRpc3RpY3M6CisKKyMgZWNobyAwID4vcHJvYy9zeXMva2VybmVsL2xvY2tfc3RhdAorCiBMb29rIGF0IHRoZSBjdXJyZW50IGxvY2sgc3RhdGlzdGljczoKIAogKCBsaW5lIG51bWJlcnMgbm90IHBhcnQgb2YgYWN0dWFsIG91dHB1dCwgZG9uZSBmb3IgY2xhcml0eSBpbiB0aGUgZXhwbGFuYXRpb24KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MveGlsaW54LnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MveGlsaW54LnR4dAppbmRleCA4MDMzOWZlLi5lYTY4MDQ2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzL3hpbGlueC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy94aWxpbngudHh0CkBAIC0yOTIsNCArMjkyLDE1IEBACiAgICAgICAgLSByZWctb2Zmc2V0IDogQSB2YWx1ZSBvZiAzIGlzIHJlcXVpcmVkCiAgICAgICAgLSByZWctc2hpZnQgOiBBIHZhbHVlIG9mIDIgaXMgcmVxdWlyZWQKIAorICAgICAgdmlpKSBYaWxpbnggVVNCIEhvc3QgY29udHJvbGxlcgorCisgICAgICBUaGUgWGlsaW54IFVTQiBob3N0IGNvbnRyb2xsZXIgaXMgRUhDSSBjb21wYXRpYmxlIGJ1dCB3aXRoIGEgZGlmZmVyZW50CisgICAgICBiYXNlIGFkZHJlc3MgZm9yIHRoZSBFSENJIHJlZ2lzdGVycywgYW5kIGl0IGlzIGFsd2F5cyBhIGJpZy1lbmRpYW4KKyAgICAgIFVTQiBIb3N0IGNvbnRyb2xsZXIuIFRoZSBoYXJkd2FyZSBjYW4gYmUgY29uZmlndXJlZCBhcyBoaWdoIHNwZWVkIG9ubHksCisgICAgICBvciBoaWdoIHNwZWVkL2Z1bGwgc3BlZWQgaHlicmlkLgorCisgICAgICBSZXF1aXJlZCBwcm9wZXJ0aWVzOgorICAgICAgLSB4bG54LHN1cHBvcnQtdXNiLWZzOiBBIHZhbHVlIDAgbWVhbnMgdGhlIGNvcmUgaXMgYnVpbHQgYXMgaGlnaCBzcGVlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5LiBBIHZhbHVlIDEgbWVhbnMgdGhlIGNvcmUgYWxzbyBzdXBwb3J0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsIHNwZWVkIGRldmljZXMuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2VyaWFsL2hheWVzLWVzcC50eHQgYi9Eb2N1bWVudGF0aW9uL3NlcmlhbC9oYXllcy1lc3AudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWI1ZDU4Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vc2VyaWFsL2hheWVzLWVzcC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotSEFZRVMgRVNQIERSSVZFUiBWRVJTSU9OIDIuMQotCi1BIGJpZyB0aGFua3MgdG8gdGhlIHBlb3BsZSBhdCBIYXllcywgZXNwZWNpYWxseSBBbGFuIEFkYW1zb24uICBUaGVpciBzdXBwb3J0Ci1oYXMgZW5hYmxlZCBtZSB0byBwcm92aWRlIGVuaGFuY2VtZW50cyB0byB0aGUgZHJpdmVyLgotCi1QbGVhc2UgcmVwb3J0IHlvdXIgZXhwZXJpZW5jZXMgd2l0aCB0aGlzIGRyaXZlciB0byBtZSAoYXJvYmluc29Abnl4Lm5ldCkuICBJCi1hbSBsb29raW5nIGZvciBib3RoIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBmZWVkYmFjay4KLQotKioqIElNUE9SVEFOVCBDSEFOR0VTIEZPUiAyLjEgKioqCi1TdXBwb3J0IGZvciBQSU8gbW9kZS4gIEZpdmUgc2l0dWF0aW9ucyB3aWxsIGNhdXNlIFBJTyBtb2RlIHRvIGJlIHVzZWQ6Ci0xKSBBIG11bHRpcG9ydCBjYXJkIGlzIGRldGVjdGVkLiAgUElPIG1vZGUgd2lsbCBhbHdheXMgYmUgdXNlZC4gICg4IHBvcnQgY2FyZHMKLWRvIG5vdCBzdXBwb3J0IERNQSkuCi0yKSBUaGUgRE1BIGNoYW5uZWwgaXMgc2V0IHRvIGFuIGludmFsaWQgdmFsdWUgKGFueXRoaW5nIG90aGVyIHRoYW4gMSBvciAzKS4KLTMpIFRoZSBETUEgYnVmZmVyL2NoYW5uZWwgY291bGQgbm90IGJlIGFsbG9jYXRlZC4gIFRoZSBwb3J0IHdpbGwgcmV2ZXJ0IHRvIFBJTwotbW9kZSB1bnRpbCBpdCBpcyByZW9wZW5lZC4KLTQpIExlc3MgdGhhbiBhIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgbmVlZCB0byBiZSB0cmFuc2ZlcnJlZCB0by9mcm9tIHRoZQotRklGT3MuICBQSU8gbW9kZSB3aWxsIGJlIHVzZWQgZm9yIHRoYXQgdHJhbnNmZXIgb25seS4KLTUpIEEgcG9ydCBuZWVkcyB0byBkbyBhIERNQSB0cmFuc2ZlciBhbmQgYW5vdGhlciBwb3J0IGlzIGFscmVhZHkgdXNpbmcgdGhlCi1ETUEgY2hhbm5lbC4gIFBJTyBtb2RlIHdpbGwgYmUgdXNlZCBmb3IgdGhhdCB0cmFuc2ZlciBvbmx5LgotCi1TaW5jZSB0aGUgSGF5ZXMgRVNQIHNlZW1zIHRvIGNvbmZsaWN0IHdpdGggb3RoZXIgY2FyZHMgKG5vdGFibHkgc291bmQgY2FyZHMpCi13aGVuIHVzaW5nIERNQSwgRE1BIGlzIHR1cm5lZCBvZmYgYnkgZGVmYXVsdC4gIFRvIHVzZSBETUEsIGl0IG11c3QgYmUgdHVybmVkCi1vbiBleHBsaWNpdGx5LCBlaXRoZXIgd2l0aCB0aGUgImRtYT0iIG9wdGlvbiBkZXNjcmliZWQgYmVsb3cgb3Igd2l0aAotc2V0c2VyaWFsLiAgQSBtdWx0aXBvcnQgY2FyZCBjYW4gYmUgZm9yY2VkIGludG8gRE1BIG1vZGUgYnkgdXNpbmcgc2V0c2VyaWFsOwotaG93ZXZlciwgbW9zdCBtdWx0aXBvcnQgY2FyZHMgZG9uJ3Qgc3VwcG9ydCBETUEuCi0KLVRoZSBsYXRlc3QgdmVyc2lvbiBvZiBzZXRzZXJpYWwgYWxsb3dzIHRoZSBlbmhhbmNlZCBjb25maWd1cmF0aW9uIG9mIHRoZSBFU1AKLWNhcmQgdG8gYmUgdmlld2VkIGFuZCBtb2RpZmllZC4KLSoqKgotCi1UaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIGZpbGVzIG5lZWRlZCB0byBjb21waWxlIGEgbW9kdWxlIHRvIHN1cHBvcnQgdGhlIEhheWVzCi1FU1AgY2FyZC4gIFRoZSBkcml2ZXJzIGFyZSBiYXNpY2FsbHkgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBzZXJpYWwgZHJpdmVycy4KLQotRmVhdHVyZXM6Ci0KLS0gVXNlcyB0aGUgZW5oYW5jZWQgbW9kZSBvZiB0aGUgRVNQIGNhcmQsIGFsbG93aW5nIGEgd2lkZXIgcmFuZ2Ugb2YKLSAgaW50ZXJydXB0cyBhbmQgZmVhdHVyZXMgdGhhbiBjb21wYXRpYmlsaXR5IG1vZGUKLS0gVXNlcyBETUEgYW5kIDE2IGJpdCBQSU8gbW9kZSB0byB0cmFuc2ZlciBkYXRhIHRvIGFuZCBmcm9tIHRoZSBFU1AncyBGSUZPcywKLSAgcmVkdWNpbmcgQ1BVIGxvYWQKLS0gU3VwcG9ydHMgcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IHBvcnRzCi0KLQotSWYgdGhlIGRyaXZlciBpcyBjb21waWxlZCBhcyBhIG1vZHVsZSwgdGhlIElSUXMgdG8gdXNlIGNhbiBiZSBzcGVjaWZpZWQgYnkKLXVzaW5nIHRoZSBpcnE9IG9wdGlvbi4gIFRoZSBmb3JtYXQgaXM6Ci0KLWlycT1bMHgxMDBdLFsweDE0MF0sWzB4MTgwXSxbMHgyMDBdLFsweDI0MF0sWzB4MjgwXSxbMHgzMDBdLFsweDM4MF0KLQotVGhlIGFkZHJlc3MgaW4gYnJhY2tldHMgaXMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgY2FyZC4gIFRoZSBJUlEgb2YKLW5vbmV4aXN0ZW50IGNhcmRzIGNhbiBiZSBzZXQgdG8gMC4gIElmIGFuIElSUSBvZiBhIGNhcmQgdGhhdCBkb2VzIGV4aXN0IGlzIHNldAotdG8gMCwgdGhlIGRyaXZlciB3aWxsIGF0dGVtcHQgdG8gZ3Vlc3MgYXQgdGhlIGNvcnJlY3QgSVJRLiAgRm9yIGV4YW1wbGUsIHRvIHNldAotdGhlIElSUSBvZiB0aGUgY2FyZCBhdCBhZGRyZXNzIDB4MzAwIHRvIDEyLCB0aGUgaW5zbW9kIGNvbW1hbmQgd291bGQgYmU6Ci0KLWluc21vZCBlc3AgaXJxPTAsMCwwLDAsMCwwLDEyLDAKLQotVGhlIGN1c3RvbSBkaXZpc29yIGNhbiBiZSBzZXQgYnkgdXNpbmcgdGhlIGRpdmlzb3I9IG9wdGlvbi4gIFRoZSBmb3JtYXQgaXMgdGhlCi1zYW1lIGFzIGZvciB0aGUgaXJxPSBvcHRpb24uICBFYWNoIGRpdmlzb3IgdmFsdWUgaXMgYSBzZXJpZXMgb2YgaGV4IGRpZ2l0cywKLXdpdGggZWFjaCBkaWdpdCByZXByZXNlbnRpbmcgdGhlIGRpdmlzb3IgdG8gdXNlIGZvciBhIGNvcnJlc3BvbmRpbmcgcG9ydC4gIFRoZQotZGl2aXNvciB2YWx1ZSBpcyBjb25zdHJ1Y3RlZCBSSUdIVCBUTyBMRUZULiAgU3BlY2lmeWluZyBhIG5vbnplcm8gZGl2aXNvciB2YWx1ZQotd2lsbCBhdXRvbWF0aWNhbGx5IHNldCB0aGUgc3BkX2N1c3QgZmxhZy4gIFRvIGNhbGN1bGF0ZSB0aGUgZGl2aXNvciB0byB1c2UgZm9yCi1hIGNlcnRhaW4gYmF1ZCByYXRlLCBkaXZpZGUgdGhlIHBvcnQncyBiYXNlIGJhdWQgKGdlbmVyYWxseSA5MjE2MDApIGJ5IHRoZQotZGVzaXJlZCByYXRlLiAgRm9yIGV4YW1wbGUsIHRvIHNldCB0aGUgZGl2aXNvciBvZiB0aGUgcHJpbWFyeSBwb3J0IGF0IDB4MzAwIHRvCi00IGFuZCB0aGUgZGl2aXNvciBvZiB0aGUgc2Vjb25kYXJ5IHBvcnQgYXQgMHgzMDggdG8gOCwgdGhlIGluc21vZCBjb21tYW5kIHdvdWxkCi1iZToKLQotaW5zbW9kIGVzcCBkaXZpc29yPTAsMCwwLDAsMCwwLDB4ODQsMAotCi1UaGUgZG1hPSBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBETUEgY2hhbm5lbC4gIFRoZSBjaGFubmVsIGNhbiBiZSBlaXRoZXIKLTEgb3IgMy4gIFNwZWNpZnlpbmcgYW55IG90aGVyIHZhbHVlIHdpbGwgZm9yY2UgdGhlIGRyaXZlciB0byB1c2UgUElPIG1vZGUuCi1Gb3IgZXhhbXBsZSwgdG8gc2V0IHRoZSBETUEgY2hhbm5lbCB0byAzLCB0aGUgaW5zbW9kIGNvbW1hbmQgd291bGQgYmU6Ci0KLWluc21vZCBlc3AgZG1hPTMKLQotVGhlIHJ4X3RyaWdnZXI9IGFuZCB0eF90cmlnZ2VyPSBvcHRpb25zIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgRklGTyB0cmlnZ2VyCi1sZXZlbHMuICBUaGV5IHNwZWNpZnkgd2hlbiB0aGUgRVNQIGNhcmQgc2hvdWxkIHNlbmQgYW4gaW50ZXJydXB0LiAgTGFyZ2VyCi12YWx1ZXMgd2lsbCBkZWNyZWFzZSB0aGUgbnVtYmVyIG9mIGludGVycnVwdHM7IGhvd2V2ZXIsIGEgdmFsdWUgdG9vIGhpZ2ggbWF5Ci1yZXN1bHQgaW4gZGF0YSBsb3NzLiAgVmFsaWQgdmFsdWVzIGFyZSAxIHRocm91Z2ggMTAyMywgd2l0aCA3NjggYmVpbmcgdGhlCi1kZWZhdWx0LiAgRm9yIGV4YW1wbGUsIHRvIHNldCB0aGUgcmVjZWl2ZSB0cmlnZ2VyIGxldmVsIHRvIDUxMiBieXRlcyBhbmQgdGhlCi10cmFuc21pdCB0cmlnZ2VyIGxldmVsIHRvIDcwMCBieXRlcywgdGhlIGluc21vZCBjb21tYW5kIHdvdWxkIGJlOgotCi1pbnNtb2QgZXNwIHJ4X3RyaWdnZXI9NTEyIHR4X3RyaWdnZXI9NzAwCi0KLVRoZSBmbG93X29mZj0gYW5kIGZsb3dfb249IG9wdGlvbnMgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBoYXJkd2FyZSBmbG93IG9mZi8KLWZsb3cgb24gbGV2ZWxzLiAgVGhlIGZsb3cgb24gbGV2ZWwgbXVzdCBiZSBsb3dlciB0aGFuIHRoZSBmbG93IG9mZiBsZXZlbCwgYW5kCi10aGUgZmxvdyBvZmYgbGV2ZWwgc2hvdWxkIGJlIGhpZ2hlciB0aGFuIHJ4X3RyaWdnZXIuICBWYWxpZCB2YWx1ZXMgYXJlIDEKLXRocm91Z2ggMTAyMywgd2l0aCAxMDE2IGJlaW5nIHRoZSBkZWZhdWx0IGZsb3cgb2ZmIGxldmVsIGFuZCA5NDQgYmVpbmcgdGhlCi1kZWZhdWx0IGZsb3cgb24gbGV2ZWwuICBGb3IgZXhhbXBsZSwgdG8gc2V0IHRoZSBmbG93IG9mZiBsZXZlbCB0byAxMDAwIGJ5dGVzCi1hbmQgdGhlIGZsb3cgb24gbGV2ZWwgdG8gOTM1IGJ5dGVzLCB0aGUgaW5zbW9kIGNvbW1hbmQgd291bGQgYmU6Ci0KLWluc21vZCBlc3AgZmxvd19vZmY9MTAwMCBmbG93X29uPTkzNQotCi1UaGUgcnhfdGltZW91dD0gb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcmVjZWl2ZSB0aW1lb3V0IHZhbHVlLiAgVGhpcwotdmFsdWUgaW5kaWNhdGVzIGhvdyBsb25nIGFmdGVyIHJlY2VpdmluZyB0aGUgbGFzdCBjaGFyYWN0ZXIgdGhhdCB0aGUgRVNQIGNhcmQKLXNob3VsZCB3YWl0IGJlZm9yZSBzaWduYWxsaW5nIGFuIGludGVycnVwdC4gIFZhbGlkIHZhbHVlcyBhcmUgMCB0aG91Z2ggMjU1LAotd2l0aCAxMjggYmVpbmcgdGhlIGRlZmF1bHQuICBBIHZhbHVlIHRvbyBoaWdoIHdpbGwgaW5jcmVhc2UgbGF0ZW5jeSwgYW5kIGEKLXZhbHVlIHRvbyBsb3cgd2lsbCBjYXVzZSB1bm5lY2Vzc2FyeSBpbnRlcnJ1cHRzLiAgRm9yIGV4YW1wbGUsIHRvIHNldCB0aGUKLXJlY2VpdmUgdGltZW91dCB0byAyNTUsIHRoZSBpbnNtb2QgY29tbWFuZCB3b3VsZCBiZToKLQotaW5zbW9kIGVzcCByeF90aW1lb3V0PTI1NQotCi1UaGUgcGlvX3RocmVzaG9sZD0gb3B0aW9uIHNldHMgdGhlIHRocmVzaG9sZCAoaW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMpIGZvcgotdXNpbmcgUElPIG1vZGUgaW5zdGVhZCBvZiBETUEgbW9kZS4gIEZvciBleGFtcGxlLCBpZiB0aGlzIHZhbHVlIGlzIDMyLAotdHJhbnNmZXJzIG9mIDMyIGJ5dGVzIG9yIGxlc3Mgd2lsbCBhbHdheXMgdXNlIFBJTyBtb2RlLgotCi1pbnNtb2QgZXNwIHBpb190aHJlc2hvbGQ9MzIKLQotTXVsdGlwbGUgb3B0aW9ucyBjYW4gYmUgbGlzdGVkIG9uIHRoZSBpbnNtb2QgY29tbWFuZCBsaW5lIGJ5IHNlcGFyYXRpbmcgZWFjaAotb3B0aW9uIHdpdGggYSBzcGFjZS4gIEZvciBleGFtcGxlOgotCi1pbnNtb2QgZXNwIGRtYT0zIHRyaWdnZXI9NTEyCi0KLVRoZSBlc3AgbW9kdWxlIGNhbiBiZSBhdXRvbWF0aWNhbGx5IGxvYWRlZCB3aGVuIG5lZWRlZC4gIFRvIGNhdXNlIHRoaXMgdG8KLWhhcHBlbiwgYWRkIHRoZSBmb2xsb3dpbmcgbGluZXMgdG8gL2V0Yy9tb2Rwcm9iZS5jb25mIChyZXBsYWNpbmcgdGhlIGxhc3QgbGluZQotd2l0aCBvcHRpb25zIGZvciB5b3VyIGNvbmZpZ3VyYXRpb24pOgotCi1hbGlhcyBjaGFyLW1ham9yLTU3IGVzcAotYWxpYXMgY2hhci1tYWpvci01OCBlc3AKLW9wdGlvbnMgZXNwIGlycT0wLDAsMCwwLDAsMCwzLDAgZGl2aXNvcj0wLDAsMCwwLDAsMCwweDQsMAotCi1Zb3UgbWF5IGFsc28gbmVlZCB0byBydW4gJ2RlcG1vZCAtYScuCi0KLURldmljZXMgbXVzdCBiZSBjcmVhdGVkIG1hbnVhbGx5LiAgVG8gY3JlYXRlIHRoZSBkZXZpY2VzLCBub3RlIHRoZSBvdXRwdXQgZnJvbQotdGhlIG1vZHVsZSBhZnRlciBpdCBpcyBpbnNlcnRlZC4gIFRoZSBvdXRwdXQgd2lsbCBhcHBlYXIgaW4gdGhlIGxvY2F0aW9uIHdoZXJlCi1rZXJuZWwgbWVzc2FnZXMgdXN1YWxseSBhcHBlYXIgKHVzdWFsbHkgL3Zhci9hZG0vbWVzc2FnZXMpLiAgQ3JlYXRlIHR3byBkZXZpY2VzCi1mb3IgZWFjaCAndHR5JyBtZW50aW9uZWQsIG9uZSB3aXRoIG1ham9yIG9mIDU3IGFuZCB0aGUgb3RoZXIgd2l0aCBtYWpvciBvZiA1OC4KLVRoZSBtaW5vciBudW1iZXIgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSB0dHkgbnVtYmVyIHJlcG9ydGVkLiAgVGhlIGNvbW1hbmRzCi13b3VsZCBiZSAocmVwbGFjZSA/IHdpdGggdGhlIHR0eSBudW1iZXIpOgotCi1ta25vZCAvZGV2L3R0eVA/IGMgNTcgPwotbWtub2QgL2Rldi9jdXA/IGMgNTggPwotCi1Gb3IgZXhhbXBsZSwgaWYgdGhlIGZvbGxvd2luZyBsaW5lIGFwcGVhcnM6Ci0KLU9jdCAyNCAxODoxNzoyMyB0ZWNobm8ga2VybmVsOiB0dHlQOCBhdCAweDAxNDAgKGlycSA9IDMpIGlzIGFuIEVTUCBwcmltYXJ5IHBvcnQKLQotLi4udHdvIGRldmljZXMgc2hvdWxkIGJlIGNyZWF0ZWQ6Ci0KLW1rbm9kIC9kZXYvdHR5UDggYyA1NyA4Ci1ta25vZCAvZGV2L2N1cDggYyA1OCA4Ci0KLVlvdSBtYXkgbmVlZCB0byBzZXQgdGhlIHBlcm1pc3Npb25zIG9uIHRoZSBkZXZpY2VzOgotCi1jaG1vZCA2NjYgL2Rldi90dHlQKgotY2htb2QgNjY2IC9kZXYvY3VwKgotCi1UaGUgRVNQIG1vZHVsZSBhbmQgdGhlIHNlcmlhbCBtb2R1bGUgc2hvdWxkIG5vdCBjb25mbGljdCAodGhleSBjYW4gYmUgdXNlZCBhdAotdGhlIHNhbWUgdGltZSkuICBBZnRlciB0aGUgRVNQIG1vZHVsZSBoYXMgYmVlbiBsb2FkZWQgdGhlIHBvcnRzIG9uIHRoZSBFU1AgY2FyZAotd2lsbCBubyBsb25nZXIgYmUgYWNjZXNzaWJsZSBieSB0aGUgc2VyaWFsIGRyaXZlci4KLQotSWYgSS9PIGVycm9ycyBhcmUgZXhwZXJpZW5jZWQgd2hlbiBhY2Nlc3NpbmcgdGhlIHBvcnQsIGNoZWNrIGZvciBJUlEgYW5kIERNQQotY29uZmxpY3RzICgnY2F0IC9wcm9jL2ludGVycnVwdHMnIGFuZCAnY2F0IC9wcm9jL2RtYScgZm9yIGEgbGlzdCBvZiBJUlFzIGFuZAotRE1BcyBjdXJyZW50bHkgaW4gdXNlKS4KLQotRW5qb3khCi1BbmRyZXcgSi4gUm9iaW5zb24gPGFyb2JpbnNvQG55eC5uZXQ+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NlcmlhbC90dHkudHh0IGIvRG9jdW1lbnRhdGlvbi9zZXJpYWwvdHR5LnR4dAppbmRleCA4ZTY1YzQ0Li41ZTUzNDlhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NlcmlhbC90dHkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2VyaWFsL3R0eS50eHQKQEAgLTQyLDcgKzQyLDggQEAKIG9wZW4oKQkJLQlDYWxsZWQgd2hlbiB0aGUgbGluZSBkaXNjaXBsaW5lIGlzIGF0dGFjaGVkIHRvCiAJCQl0aGUgdGVybWluYWwuIE5vIG90aGVyIGNhbGwgaW50byB0aGUgbGluZQogCQkJZGlzY2lwbGluZSBmb3IgdGhpcyB0dHkgd2lsbCBvY2N1ciB1bnRpbCBpdAotCQkJY29tcGxldGVzIHN1Y2Nlc3NmdWxseS4gQ2FuIHNsZWVwLgorCQkJY29tcGxldGVzIHN1Y2Nlc3NmdWxseS4gUmV0dXJuaW5nIGFuIGVycm9yIHdpbGwKKwkJCXByZXZlbnQgdGhlIGxkaXNjIGZyb20gYmVpbmcgYXR0YWNoZWQuIENhbiBzbGVlcC4KIAogY2xvc2UoKQkJLQlUaGlzIGlzIGNhbGxlZCBvbiBhIHRlcm1pbmFsIHdoZW4gdGhlIGxpbmUKIAkJCWRpc2NpcGxpbmUgaXMgYmVpbmcgdW5wbHVnZ2VkLiBBdCB0aGUgcG9pbnQgb2YKQEAgLTUyLDcgKzUzLDcgQEAKIGhhbmd1cCgpCS0JQ2FsbGVkIHdoZW4gdGhlIHR0eSBsaW5lIGlzIGh1bmcgdXAuCiAJCQlUaGUgbGluZSBkaXNjaXBsaW5lIHNob3VsZCBjZWFzZSBJL08gdG8gdGhlIHR0eS4KIAkJCU5vIGZ1cnRoZXIgY2FsbHMgaW50byB0aGUgbGRpc2MgY29kZSB3aWxsIG9jY3VyLgotCQkJQ2FuIHNsZWVwLgorCQkJVGhlIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLiBDYW4gc2xlZXAuCiAKIHdyaXRlKCkJCS0JQSBwcm9jZXNzIGlzIHdyaXRpbmcgZGF0YSB0aHJvdWdoIHRoZSBsaW5lCiAJCQlkaXNjaXBsaW5lLiAgTXVsdGlwbGUgd3JpdGUgY2FsbHMgYXJlIHNlcmlhbGl6ZWQKQEAgLTgzLDYgKzg0LDEwIEBACiAJCQl0aGF0IG1pZ2h0IGJlIGZvciB0aGUgbGRpc2MuIE11bHRpcGxlIGlvY3RsIGNhbGxzCiAJCQltYXkgb2NjdXIgaW4gcGFyYWxsZWwuIE1heSBzbGVlcC4gCiAKK2NvbXBhdF9pb2N0bCgpCS0JQ2FsbGVkIHdoZW4gYSAzMiBiaXQgaW9jdGwgaXMgaGFuZGVkIHRvIHRoZSB0dHkgbGF5ZXIKKwkJCXRoYXQgbWlnaHQgYmUgZm9yIHRoZSBsZGlzYy4gTXVsdGlwbGUgaW9jdGwgY2FsbHMKKwkJCW1heSBvY2N1ciBpbiBwYXJhbGxlbC4gTWF5IHNsZWVwLgorCiBEcml2ZXIgU2lkZSBJbnRlcmZhY2VzOgogCiByZWNlaXZlX2J1ZigpCS0JSGFuZCBidWZmZXJzIG9mIGJ5dGVzIGZyb20gdGhlIGRyaXZlciB0byB0aGUgbGRpc2MKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNiL3Bvd2VyLW1hbmFnZW1lbnQudHh0IGIvRG9jdW1lbnRhdGlvbi91c2IvcG93ZXItbWFuYWdlbWVudC50eHQKaW5kZXggYWQ2NDI2MS4uYzdjMWRjMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi91c2IvcG93ZXItbWFuYWdlbWVudC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91c2IvcG93ZXItbWFuYWdlbWVudC50eHQKQEAgLTIsNyArMiw3IEBACiAKIAkJIEFsYW4gU3Rlcm4gPHN0ZXJuQHJvd2xhbmQuaGFydmFyZC5lZHU+CiAKLQkJCSAgICBPY3RvYmVyIDUsIDIwMDcKKwkJCSAgICBOb3ZlbWJlciAxMCwgMjAwOQogCiAKIApAQCAtMTIzLDkgKzEyMyw5IEBACiAKIAlwb3dlci9sZXZlbAogCi0JCVRoaXMgZmlsZSBjb250YWlucyBvbmUgb2YgdGhyZWUgd29yZHM6ICJvbiIsICJhdXRvIiwKLQkJb3IgInN1c3BlbmQiLiAgWW91IGNhbiB3cml0ZSB0aG9zZSB3b3JkcyB0byB0aGUgZmlsZQotCQl0byBjaGFuZ2UgdGhlIGRldmljZSdzIHNldHRpbmcuCisJCVRoaXMgZmlsZSBjb250YWlucyBvbmUgb2YgdHdvIHdvcmRzOiAib24iIG9yICJhdXRvIi4KKwkJWW91IGNhbiB3cml0ZSB0aG9zZSB3b3JkcyB0byB0aGUgZmlsZSB0byBjaGFuZ2UgdGhlCisJCWRldmljZSdzIHNldHRpbmcuCiAKIAkJIm9uIiBtZWFucyB0aGF0IHRoZSBkZXZpY2Ugc2hvdWxkIGJlIHJlc3VtZWQgYW5kCiAJCWF1dG9zdXNwZW5kIGlzIG5vdCBhbGxvd2VkLiAgKE9mIGNvdXJzZSwgc3lzdGVtCkBAIC0xMzQsMTAgKzEzNCwxMCBAQAogCQkiYXV0byIgaXMgdGhlIG5vcm1hbCBzdGF0ZSBpbiB3aGljaCB0aGUga2VybmVsIGlzCiAJCWFsbG93ZWQgdG8gYXV0b3N1c3BlbmQgYW5kIGF1dG9yZXN1bWUgdGhlIGRldmljZS4KIAotCQkic3VzcGVuZCIgbWVhbnMgdGhhdCB0aGUgZGV2aWNlIHNob3VsZCByZW1haW4KLQkJc3VzcGVuZGVkLCBhbmQgYXV0b3Jlc3VtZSBpcyBub3QgYWxsb3dlZC4gIChCdXQgcmVtb3RlCi0JCXdha2V1cCBtYXkgc3RpbGwgYmUgYWxsb3dlZCwgc2luY2UgaXQgaXMgY29udHJvbGxlZAotCQlzZXBhcmF0ZWx5IGJ5IHRoZSBwb3dlci93YWtldXAgYXR0cmlidXRlLikKKwkJKEluIGtlcm5lbHMgdXAgdG8gMi42LjMyLCB5b3UgY291bGQgYWxzbyBzcGVjaWZ5CisJCSJzdXNwZW5kIiwgbWVhbmluZyB0aGF0IHRoZSBkZXZpY2Ugc2hvdWxkIHJlbWFpbgorCQlzdXNwZW5kZWQgYW5kIGF1dG9yZXN1bWUgd2FzIG5vdCBhbGxvd2VkLiAgVGhpcworCQlzZXR0aW5nIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuKQogCiAJcG93ZXIvYXV0b3N1c3BlbmQKIApAQCAtMzEzLDEzICszMTMsMTQgQEAKIHRoYXQgaXQgc3VwcG9ydHMgYXV0b3N1c3BlbmQgYnkgc2V0dGluZyB0aGUgLnN1cHBvcnRzX2F1dG9zdXNwZW5kIGZsYWcKIGluIGl0cyB1c2JfZHJpdmVyIHN0cnVjdHVyZS4gIEl0IGlzIHRoZW4gcmVzcG9uc2libGUgZm9yIGluZm9ybWluZyB0aGUKIFVTQiBjb3JlIHdoZW5ldmVyIG9uZSBvZiBpdHMgaW50ZXJmYWNlcyBiZWNvbWVzIGJ1c3kgb3IgaWRsZS4gIFRoZQotZHJpdmVyIGRvZXMgc28gYnkgY2FsbGluZyB0aGVzZSBmaXZlIGZ1bmN0aW9uczoKK2RyaXZlciBkb2VzIHNvIGJ5IGNhbGxpbmcgdGhlc2Ugc2l4IGZ1bmN0aW9uczoKIAogCWludCAgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIAl2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7Ci0JaW50ICB1c2JfYXV0b3BtX3NldF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogCWludCAgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIAl2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9hc3luYyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CisJdm9pZCB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2Vfbm9fcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKKwl2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9ub19zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIAogVGhlIGZ1bmN0aW9ucyB3b3JrIGJ5IG1haW50YWluaW5nIGEgY291bnRlciBpbiB0aGUgdXNiX2ludGVyZmFjZQogc3RydWN0dXJlLiAgV2hlbiBpbnRmLT5wbV91c2FnZV9jb3VudCBpcyA+IDAgdGhlbiB0aGUgaW50ZXJmYWNlIGlzCkBAIC0zMzEsMTEgKzMzMiwxMyBAQAogYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UgaXRzZWxmIHJhdGhlciB0aGFuIGFueSBvZiBpdHMgaW50ZXJmYWNlcy4KIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IHRoZSBVU0IgY29yZS4pCiAKLVRoZSBkcml2ZXIgb3ducyBpbnRmLT5wbV91c2FnZV9jb3VudDsgaXQgY2FuIG1vZGlmeSB0aGUgdmFsdWUgaG93ZXZlcgotYW5kIHdoZW5ldmVyIGl0IGxpa2VzLiAgQSBuaWNlIGFzcGVjdCBvZiB0aGUgbm9uLWFzeW5jIHVzYl9hdXRvcG1fKgotcm91dGluZXMgaXMgdGhhdCB0aGUgY2hhbmdlcyB0aGV5IG1ha2UgYXJlIHByb3RlY3RlZCBieSB0aGUgdXNiX2RldmljZQotc3RydWN0dXJlJ3MgUE0gbXV0ZXggKHVkZXYtPnBtX211dGV4KTsgaG93ZXZlciBkcml2ZXJzIG1heSBjaGFuZ2UKLXBtX3VzYWdlX2NvdW50IHdpdGhvdXQgaG9sZGluZyB0aGUgbXV0ZXguICBEcml2ZXJzIHVzaW5nIHRoZSBhc3luYworRHJpdmVycyBtdXN0IG5vdCBtb2RpZnkgaW50Zi0+cG1fdXNhZ2VfY291bnQgZGlyZWN0bHk7IGl0cyB2YWx1ZQorc2hvdWxkIGJlIGNoYW5nZWQgb25seSBiZSB1c2luZyB0aGUgZnVuY3Rpb25zIGxpc3RlZCBhYm92ZS4gIERyaXZlcnMKK2FyZSByZXNwb25zaWJsZSBmb3IgaW5zdXJpbmcgdGhhdCB0aGUgb3ZlcmFsbCBjaGFuZ2UgdG8gcG1fdXNhZ2VfY291bnQKK2R1cmluZyB0aGVpciBsaWZldGltZSBiYWxhbmNlcyBvdXQgdG8gMCAoaXQgbWF5IGJlIG5lY2Vzc2FyeSBmb3IgdGhlCitkaXNjb25uZWN0IG1ldGhvZCB0byBjYWxsIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZSgpIG9uZSBvciBtb3JlIHRpbWVzCit0byBmdWxmaWxsIHRoaXMgcmVxdWlyZW1lbnQpLiAgVGhlIGZpcnN0IHR3byByb3V0aW5lcyB1c2UgdGhlIFBNIG11dGV4CitpbiBzdHJ1Y3QgdXNiX2RldmljZSBmb3IgbXV0dWFsIGV4Y2x1c2lvbjsgZHJpdmVycyB1c2luZyB0aGUgYXN5bmMKIHJvdXRpbmVzIGFyZSByZXNwb25zaWJsZSBmb3IgdGhlaXIgb3duIHN5bmNocm9uaXphdGlvbiBhbmQgbXV0dWFsCiBleGNsdXNpb24uCiAKQEAgLTM0NywxMSArMzUwLDYgQEAKIAlhdHRlbXB0cyBhbiBhdXRvc3VzcGVuZCBpZiB0aGUgbmV3IHZhbHVlIGlzIDw9IDAgYW5kIHRoZQogCWRldmljZSBpc24ndCBzdXNwZW5kZWQuCiAKLQl1c2JfYXV0b3BtX3NldF9pbnRlcmZhY2UoKSBsZWF2ZXMgcG1fdXNhZ2VfY291bnQgYWxvbmUuCi0JSXQgYXR0ZW1wdHMgYW4gYXV0b3Jlc3VtZSBpZiB0aGUgdmFsdWUgaXMgPiAwIGFuZCB0aGUgZGV2aWNlCi0JaXMgc3VzcGVuZGVkLCBhbmQgaXQgYXR0ZW1wdHMgYW4gYXV0b3N1c3BlbmQgaWYgdGhlIHZhbHVlIGlzCi0JPD0gMCBhbmQgdGhlIGRldmljZSBpc24ndCBzdXNwZW5kZWQuCi0KIAl1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2VfYXN5bmMoKSBhbmQKIAl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2VfYXN5bmMoKSBkbyBhbG1vc3QgdGhlIHNhbWUgdGhpbmdzIGFzCiAJdGhlaXIgbm9uLWFzeW5jIGNvdW50ZXJwYXJ0cy4gIFRoZSBkaWZmZXJlbmNlcyBhcmU6IHRoZXkgZG8KQEAgLTM2MCwxMyArMzU4LDExIEBACiAJc3VjaCBhcyBhbiBVUkIncyBjb21wbGV0aW9uIGhhbmRsZXIsIGJ1dCB3aGVuIHRoZXkgcmV0dXJuIHRoZQogCWRldmljZSB3aWxsIG5vdCBnZW5lcmFsbHkgbm90IHlldCBiZSBpbiB0aGUgZGVzaXJlZCBzdGF0ZS4KIAotVGhlcmUgYWxzbyBhcmUgYSBjb3VwbGUgb2YgdXRpbGl0eSByb3V0aW5lcyBkcml2ZXJzIGNhbiB1c2U6Ci0KLQl1c2JfYXV0b3BtX2VuYWJsZSgpIHNldHMgcG1fdXNhZ2VfY250IHRvIDAgYW5kIHRoZW4gY2FsbHMKLQl1c2JfYXV0b3BtX3NldF9pbnRlcmZhY2UoKSwgd2hpY2ggd2lsbCBhdHRlbXB0IGFuIGF1dG9zdXNwZW5kLgotCi0JdXNiX2F1dG9wbV9kaXNhYmxlKCkgc2V0cyBwbV91c2FnZV9jbnQgdG8gMSBhbmQgdGhlbiBjYWxscwotCXVzYl9hdXRvcG1fc2V0X2ludGVyZmFjZSgpLCB3aGljaCB3aWxsIGF0dGVtcHQgYW4gYXV0b3Jlc3VtZS4KKwl1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2Vfbm9fcmVzdW1lKCkgYW5kCisJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX25vX3N1c3BlbmQoKSBtZXJlbHkgaW5jcmVtZW50IG9yCisJZGVjcmVtZW50IHRoZSBwbV91c2FnZV9jb3VudCB2YWx1ZTsgdGhleSBkbyBub3QgYXR0ZW1wdCB0bworCWNhcnJ5IG91dCBhbiBhdXRvcmVzdW1lIG9yIGFuIGF1dG9zdXNwZW5kLiAgSGVuY2UgdGhleSBjYW4gYmUKKwljYWxsZWQgaW4gYW4gYXRvbWljIGNvbnRleHQuCiAKIFRoZSBjb252ZW50aW9uYWwgdXNhZ2UgcGF0dGVybiBpcyB0aGF0IGEgZHJpdmVyIGNhbGxzCiB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoKSBpbiBpdHMgb3BlbiByb3V0aW5lIGFuZApAQCAtNDAwLDExICszOTYsMTEgQEAKIE5vcm1hbGx5IGEgZHJpdmVyIHdvdWxkIHNldCB0aGlzIGZsYWcgaW4gaXRzIHByb2JlIG1ldGhvZCwgYXQgd2hpY2gKIHRpbWUgdGhlIGRldmljZSBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBhdXRvc3VzcGVuZGVkLikKIAotVGhlIHVzYl9hdXRvcG1fKiByb3V0aW5lcyBoYXZlIHRvIHJ1biBpbiBhIHNsZWVwYWJsZSBwcm9jZXNzIGNvbnRleHQ7Ci10aGV5IG11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCBoYW5kbGVyIG9yIHdoaWxlIGhvbGRpbmcgYQotc3BpbmxvY2suICBJbiBmYWN0LCB0aGUgZW50aXJlIGF1dG9zdXNwZW5kIG1lY2hhbmlzbSBpcyBub3Qgd2VsbCBnZWFyZWQKLXRvd2FyZCBpbnRlcnJ1cHQtZHJpdmVuIG9wZXJhdGlvbi4gIEhvd2V2ZXIgdGhlcmUgaXMgb25lIHRoaW5nIGEKLWRyaXZlciBjYW4gZG8gaW4gYW4gaW50ZXJydXB0IGhhbmRsZXI6CitUaGUgc3luY2hyb25vdXMgdXNiX2F1dG9wbV8qIHJvdXRpbmVzIGhhdmUgdG8gcnVuIGluIGEgc2xlZXBhYmxlCitwcm9jZXNzIGNvbnRleHQ7IHRoZXkgbXVzdCBub3QgYmUgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0IGhhbmRsZXIgb3IKK3doaWxlIGhvbGRpbmcgYSBzcGlubG9jay4gIEluIGZhY3QsIHRoZSBlbnRpcmUgYXV0b3N1c3BlbmQgbWVjaGFuaXNtCitpcyBub3Qgd2VsbCBnZWFyZWQgdG93YXJkIGludGVycnVwdC1kcml2ZW4gb3BlcmF0aW9uLiAgSG93ZXZlciB0aGVyZQoraXMgb25lIHRoaW5nIGEgZHJpdmVyIGNhbiBkbyBpbiBhbiBpbnRlcnJ1cHQgaGFuZGxlcjoKIAogCXVzYl9tYXJrX2xhc3RfYnVzeShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldik7CiAKQEAgLTQyMywxNSArNDE5LDE2IEBACiAKIEV4dGVybmFsIHN1c3BlbmQgY2FsbHMgc2hvdWxkIG5ldmVyIGJlIGFsbG93ZWQgdG8gZmFpbCBpbiB0aGlzIHdheSwKIG9ubHkgYXV0b3N1c3BlbmQgY2FsbHMuICBUaGUgZHJpdmVyIGNhbiB0ZWxsIHRoZW0gYXBhcnQgYnkgY2hlY2tpbmcKLXVkZXYtPmF1dG9fcG07IHRoaXMgZmxhZyB3aWxsIGJlIHNldCB0byAxIGZvciBpbnRlcm5hbCBQTSBldmVudHMKLShhdXRvc3VzcGVuZCBvciBhdXRvcmVzdW1lKSBhbmQgMCBmb3IgZXh0ZXJuYWwgUE0gZXZlbnRzLgordGhlIFBNX0VWRU5UX0FVVE8gYml0IGluIHRoZSBtZXNzYWdlLmV2ZW50IGFyZ3VtZW50IHRvIHRoZSBzdXNwZW5kCittZXRob2Q7IHRoaXMgYml0IHdpbGwgYmUgc2V0IGZvciBpbnRlcm5hbCBQTSBldmVudHMgKGF1dG9zdXNwZW5kKSBhbmQKK2NsZWFyIGZvciBleHRlcm5hbCBQTSBldmVudHMuCiAKIE1hbnkgb2YgdGhlIGluZ3JlZGllbnRzIGluIHRoZSBhdXRvc3VzcGVuZCBmcmFtZXdvcmsgYXJlIG9yaWVudGVkCiB0b3dhcmRzIGludGVyZmFjZXM6IFRoZSB1c2JfaW50ZXJmYWNlIHN0cnVjdHVyZSBjb250YWlucyB0aGUKIHBtX3VzYWdlX2NudCBmaWVsZCwgYW5kIHRoZSB1c2JfYXV0b3BtXyogcm91dGluZXMgdGFrZSBhbiBpbnRlcmZhY2UKIHBvaW50ZXIgYXMgdGhlaXIgYXJndW1lbnQuICBCdXQgc29tZXdoYXQgY29uZnVzaW5nbHksIGEgZmV3IG9mIHRoZQotcGllY2VzICh1c2JfbWFya19sYXN0X2J1c3koKSBhbmQgdWRldi0+YXV0b19wbSkgdXNlIHRoZSB1c2JfZGV2aWNlCi1zdHJ1Y3R1cmUgaW5zdGVhZC4gIERyaXZlcnMgbmVlZCB0byBrZWVwIHRoaXMgc3RyYWlnaHQ7IHRoZXkgY2FuIGNhbGwKK3BpZWNlcyAoaS5lLiwgdXNiX21hcmtfbGFzdF9idXN5KCkpIHVzZSB0aGUgdXNiX2RldmljZSBzdHJ1Y3R1cmUKK2luc3RlYWQuICBEcml2ZXJzIG5lZWQgdG8ga2VlcCB0aGlzIHN0cmFpZ2h0OyB0aGV5IGNhbiBjYWxsCiBpbnRlcmZhY2VfdG9fdXNiZGV2KCkgdG8gZmluZCB0aGUgZGV2aWNlIHN0cnVjdHVyZSBmb3IgYSBnaXZlbgogaW50ZXJmYWNlLgogCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IGQ3Zjg2NjguLjE0ZWFiOTcgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC04MDEsNiArODAxLDE5IEBACiBXOglodHRwOi8vd2lraS5vcGVubW9rby5vcmcvd2lraS9OZW9fRnJlZVJ1bm5lcgogUzoJU3VwcG9ydGVkCiAKK0FSTS9RVUFMQ09NTSBNU00gTUFDSElORSBTVVBQT1JUCitNOglEYXZpZCBCcm93biA8ZGF2aWRiQGNvZGVhdXJvcmEub3JnPgorTToJRGFuaWVsIFdhbGtlciA8ZHdhbGtlckBjb2RlYXVyb3JhLm9yZz4KK006CUJyeWFuIEh1bnRzbWFuIDxicnlhbmhAY29kZWF1cm9yYS5vcmc+CitGOglhcmNoL2FybS9tYWNoLW1zbS8KK0Y6CWRyaXZlcnMvdmlkZW8vbXNtLworRjoJZHJpdmVycy9tbWMvaG9zdC9tc21fc2RjYy5jCitGOglkcml2ZXJzL21tYy9ob3N0L21zbV9zZGNjLmgKK0Y6CWRyaXZlcnMvc2VyaWFsL21zbV9zZXJpYWwuaAorRjoJZHJpdmVycy9zZXJpYWwvbXNtX3NlcmlhbC5jCitUOglnaXQgZ2l0Oi8vY29kZWF1cm9yYS5vcmcvcXVpYy9rZXJuZWwvZHdhbGtlci9saW51eC1tc20uZ2l0CitTOglNYWludGFpbmVkCisKIEFSTS9UT1NBIE1BQ0hJTkUgU1VQUE9SVAogTToJRG1pdHJ5IEVyZW1pbi1Tb2xlbmlrb3YgPGRiYXJ5c2hrb3ZAZ21haWwuY29tPgogTToJRGlyayBPcGZlciA8ZGlya0BvcGZlci1vbmxpbmUuZGU+CkBAIC0zOTAzLDYgKzM5MTYsMjMgQEAKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvdmlkZW8vb21hcC8KIAorT01BUCBESVNQTEFZIFNVQlNZU1RFTSBTVVBQT1JUIChEU1MyKQorTToJVG9taSBWYWxrZWluZW4gPHRvbWkudmFsa2VpbmVuQG5va2lhLmNvbT4KK0w6CWxpbnV4LW9tYXBAdmdlci5rZXJuZWwub3JnCitMOglsaW51eC1mYmRldkB2Z2VyLmtlcm5lbC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQorUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy92aWRlby9vbWFwMi9kc3MvCitGOglkcml2ZXJzL3ZpZGVvL29tYXAyL3ZyZmIuYworRjoJZHJpdmVycy92aWRlby9vbWFwMi92cmFtLmMKK0Y6CURvY3VtZW50YXRpb24vYXJtL09NQVAvRFNTCisKK09NQVAgRlJBTUVCVUZGRVIgU1VQUE9SVCAoRk9SIERTUzIpCitNOglUb21pIFZhbGtlaW5lbiA8dG9taS52YWxrZWluZW5Abm9raWEuY29tPgorTDoJbGludXgtb21hcEB2Z2VyLmtlcm5lbC5vcmcKK0w6CWxpbnV4LWZiZGV2QHZnZXIua2VybmVsLm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi8KKwogT01BUCBNTUMgU1VQUE9SVAogTToJSmFya2tvIExhdmluZW4gPGphcmtrby5sYXZpbmVuQG5va2lhLmNvbT4KIEw6CWxpbnV4LW9tYXBAdmdlci5rZXJuZWwub3JnCkBAIC01NjYzLDkgKzU2OTMsMTEgQEAKIEY6CWRyaXZlcnMvbmV0L3dpcmVsZXNzL3JuZGlzX3dsYW4uYwogCiBVU0IgWEhDSSBEUklWRVIKLU06CVNhcmFoIFNoYXJwIDxzYXJhaC5hLnNoYXJwQGludGVsLmNvbT4KK006CVNhcmFoIFNoYXJwIDxzYXJhaC5hLnNoYXJwQGxpbnV4LmludGVsLmNvbT4KIEw6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKIFM6CVN1cHBvcnRlZAorRjoJZHJpdmVycy91c2IvaG9zdC94aGNpKgorRjoJZHJpdmVycy91c2IvaG9zdC9wY2ktcXVpcmtzKgogCiBVU0IgWkMwMzAxIERSSVZFUgogTToJTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PgpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9mY250bC5oIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9mY250bC5oCmluZGV4IDI1ZGEwMDEuLjIxYjExMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vZmNudGwuaAorKysgYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2ZjbnRsLmgKQEAgLTEsOCArMSw2IEBACiAjaWZuZGVmIF9BTFBIQV9GQ05UTF9ICiAjZGVmaW5lIF9BTFBIQV9GQ05UTF9ICiAKLS8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKLSAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwogI2RlZmluZSBPX0NSRUFUCQkgMDEwMDAJLyogbm90IGZjbnRsICovCiAjZGVmaW5lIE9fVFJVTkMJCSAwMjAwMAkvKiBub3QgZmNudGwgKi8KICNkZWZpbmUgT19FWENMCQkgMDQwMDAJLyogbm90IGZjbnRsICovCkBAIC0xMCwxMyArOCwyOCBAQAogCiAjZGVmaW5lIE9fTk9OQkxPQ0sJIDAwMDA0CiAjZGVmaW5lIE9fQVBQRU5ECSAwMDAxMAotI2RlZmluZSBPX1NZTkMJCTA0MDAwMAorI2RlZmluZSBPX0RTWU5DCQkwNDAwMDAJLyogdXNlZCB0byBiZSBPX1NZTkMsIHNlZSBiZWxvdyAqLwogI2RlZmluZSBPX0RJUkVDVE9SWQkwMTAwMDAwCS8qIG11c3QgYmUgYSBkaXJlY3RvcnkgKi8KICNkZWZpbmUgT19OT0ZPTExPVwkwMjAwMDAwIC8qIGRvbid0IGZvbGxvdyBsaW5rcyAqLwogI2RlZmluZSBPX0xBUkdFRklMRQkwNDAwMDAwIC8qIHdpbGwgYmUgc2V0IGJ5IHRoZSBrZXJuZWwgb24gZXZlcnkgb3BlbiAqLwogI2RlZmluZSBPX0RJUkVDVAkwMjAwMDAwMCAvKiBkaXJlY3QgZGlzayBhY2Nlc3MgLSBzaG91bGQgY2hlY2sgd2l0aCBPU0YvMSAqLwogI2RlZmluZSBPX05PQVRJTUUJMDQwMDAwMDAKICNkZWZpbmUgT19DTE9FWEVDCTAxMDAwMDAwMCAvKiBzZXQgY2xvc2Vfb25fZXhlYyAqLworLyoKKyAqIEJlZm9yZSBMaW51eCAyLjYuMzIgb25seSBPX0RTWU5DIHNlbWFudGljcyB3ZXJlIGltcGxlbWVudGVkLCBidXQgdXNpbmcKKyAqIHRoZSBPX1NZTkMgZmxhZy4gIFdlIGNvbnRpbnVlIHRvIHVzZSB0aGUgZXhpc3RpbmcgbnVtZXJpY2FsIHZhbHVlCisgKiBmb3IgT19EU1lOQyBzZW1hbnRpY3Mgbm93LCBidXQgdXNpbmcgdGhlIGNvcnJlY3Qgc3ltYm9saWMgbmFtZSBmb3IgaXQuCisgKiBUaGlzIG5ldyB2YWx1ZSBpcyB1c2VkIHRvIHJlcXVlc3QgdHJ1ZSBQb3NpeCBPX1NZTkMgc2VtYW50aWNzLiAgSXQgaXMKKyAqIGRlZmluZWQgaW4gdGhpcyBzdHJhbmdlIHdheSB0byBtYWtlIHN1cmUgYXBwbGljYXRpb25zIGNvbXBpbGVkIGFnYWluc3QKKyAqIG5ldyBoZWFkZXJzIGdldCBhdCBsZWFzdCBPX0RTWU5DIHNlbWFudGljcyBvbiBvbGRlciBrZXJuZWxzLgorICoKKyAqIFRoaXMgaGFzIHRoZSBuaWNlIHNpZGUtZWZmZWN0IHRoYXQgd2UgY2FuIHNpbXBseSB0ZXN0IGZvciBPX0RTWU5DCisgKiB3aGVyZXZlciB3ZSBkbyBub3QgY2FyZSBpZiBPX0RTWU5DIG9yIE9fU1lOQyBpcyB1c2VkLgorICoKKyAqIE5vdGU6IF9fT19TWU5DIG11c3QgbmV2ZXIgYmUgdXNlZCBkaXJlY3RseS4KKyAqLworI2RlZmluZSBfX09fU1lOQwkwMjAwMDAwMDAKKyNkZWZpbmUgT19TWU5DCQkoX19PX1NZTkN8T19EU1lOQykKIAogI2RlZmluZSBGX0dFVExLCQk3CiAjZGVmaW5lIEZfU0VUTEsJCTgKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL29zZl9zeXMuYyBiL2FyY2gvYWxwaGEva2VybmVsL29zZl9zeXMuYwppbmRleCA5YTMzMzRhLi42MjYxOWYyIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9vc2Zfc3lzLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvb3NmX3N5cy5jCkBAIC0xNzgsMjUgKzE3OCwxOCBAQAogCQl1bnNpZ25lZCBsb25nLCBwcm90LCB1bnNpZ25lZCBsb25nLCBmbGFncywgdW5zaWduZWQgbG9uZywgZmQsCiAJCXVuc2lnbmVkIGxvbmcsIG9mZikKIHsKLQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyByZXQgPSAtRUJBREY7CisJdW5zaWduZWQgbG9uZyByZXQgPSAtRUlOVkFMOwogCiAjaWYgMAogCWlmIChmbGFncyAmIChfTUFQX0hBU1NFTUFQSE9SRSB8IF9NQVBfSU5IRVJJVCB8IF9NQVBfVU5BTElHTkVEKSkKIAkJcHJpbnRrKCIlczogdW5pbXBsZW1lbnRlZCBPU0YgbW1hcCBmbGFncyAlMDRseFxuIiwgCiAJCQljdXJyZW50LT5jb21tLCBmbGFncyk7CiAjZW5kaWYKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCXJldCA9IGRvX21tYXAoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgb2ZmKTsKLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQlpZiAoZmlsZSkKLQkJZnB1dChmaWxlKTsKKwlpZiAoKG9mZiArIFBBR0VfQUxJR04obGVuKSkgPCBvZmYpCisJCWdvdG8gb3V0OworCWlmIChvZmYgJiB+UEFHRV9NQVNLKQorCQlnb3RvIG91dDsKKwlyZXQgPSBzeXNfbW1hcF9wZ29mZihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgb2ZmID4+IFBBR0VfU0hJRlQpOwogIG91dDoKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9vbWFwXzM0MzBzZHBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9vbWFwXzM0MzBzZHBfZGVmY29uZmlnCmluZGV4IDg0ODI5NTguLjU5MjQ1N2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF8zNDMwc2RwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL29tYXBfMzQzMHNkcF9kZWZjb25maWcKQEAgLTk2MywxMCArOTYzLDMyIEBACiAjCiAjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9PTUFQPXkKLSMgQ09ORklHX0ZCX09NQVBfTENEQ19FWFRFUk5BTCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NRVRST05PTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUI4NjJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9CUk9BRFNIRUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX09NQVBfTENEX1ZHQSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9PTUFQX0JPT1RMT0FERVJfSU5JVCBpcyBub3Qgc2V0Ci1DT05GSUdfRkJfT01BUF9DT05TSVNURU5UX0RNQV9TSVpFPTIKK0NPTkZJR19PTUFQMl9WUkFNPXkKK0NPTkZJR19PTUFQMl9WUkZCPXkKK0NPTkZJR19PTUFQMl9EU1M9eQorQ09ORklHX09NQVAyX1ZSQU1fU0laRT00CitDT05GSUdfT01BUDJfRFNTX0RFQlVHX1NVUFBPUlQ9eQorIyBDT05GSUdfT01BUDJfRFNTX1JGQkkgaXMgbm90IHNldAorQ09ORklHX09NQVAyX0RTU19WRU5DPXkKKyMgQ09ORklHX09NQVAyX0RTU19TREkgaXMgbm90IHNldAorIyBDT05GSUdfT01BUDJfRFNTX0RTSSBpcyBub3Qgc2V0CisjIENPTkZJR19PTUFQMl9EU1NfRkFLRV9WU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfT01BUDJfRFNTX01JTl9GQ0tfUEVSX1BDSz0wCitDT05GSUdfRkJfT01BUDI9eQorQ09ORklHX0ZCX09NQVAyX0RFQlVHX1NVUFBPUlQ9eQorIyBDT05GSUdfRkJfT01BUDJfRk9SQ0VfQVVUT19VUERBVEUgaXMgbm90IHNldAorQ09ORklHX0ZCX09NQVAyX05VTV9GQlM9MworCisjCisjIE9NQVAyLzMgRGlzcGxheSBEZXZpY2UgRHJpdmVycworIworQ09ORklHX1BBTkVMX0dFTkVSSUM9eQorQ09ORklHX1BBTkVMX1NIQVJQX0xTMDM3VjdEVzAxPXkKICMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21tYW4uaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21tYW4uaAppbmRleCA4ZWViZjg5Li40MWY5OWM1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tbWFuLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbW1hbi5oCkBAIC0xICsxLDQgQEAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tbWFuLmg+CisKKyNkZWZpbmUgYXJjaF9tbWFwX2NoZWNrKGFkZHIsIGxlbiwgZmxhZ3MpIFwKKwkoKChmbGFncykgJiBNQVBfRklYRUQgJiYgKGFkZHIpIDwgRklSU1RfVVNFUl9BRERSRVNTKSA/IC1FSU5WQUwgOiAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2NhbGxzLlMgYi9hcmNoL2FybS9rZXJuZWwvY2FsbHMuUwppbmRleCBmNThjMTE1Li45MzE0YTJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvY2FsbHMuUworKysgYi9hcmNoL2FybS9rZXJuZWwvY2FsbHMuUwpAQCAtMTcyLDcgKzE3Miw3IEBACiAvKiAxNjAgKi8JQ0FMTChzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbikKIAkJQ0FMTChzeXNfc2NoZWRfcnJfZ2V0X2ludGVydmFsKQogCQlDQUxMKHN5c19uYW5vc2xlZXApCi0JCUNBTEwoc3lzX2FybV9tcmVtYXApCisJCUNBTEwoc3lzX21yZW1hcCkKIAkJQ0FMTChzeXNfc2V0cmVzdWlkMTYpCiAvKiAxNjUgKi8JQ0FMTChzeXNfZ2V0cmVzdWlkMTYpCiAJCUNBTEwoc3lzX25pX3N5c2NhbGwpCQkvKiB2bTg2ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlMgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlMKaW5kZXggZjBmZTk1Yi4uMmMxZGI3NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2VudHJ5LWNvbW1vbi5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1jb21tb24uUwpAQCAtNDE2LDEyICs0MTYsMTIgQEAKIAkJdHN0CXI1LCAjUEdPRkZfTUFTSwogCQltb3ZlcQlyNSwgcjUsIGxzciAjUEFHRV9TSElGVCAtIDEyCiAJCXN0cmVxCXI1LCBbc3AsICM0XQotCQliZXEJZG9fbW1hcDIKKwkJYmVxCXN5c19tbWFwX3Bnb2ZmCiAJCW1vdglyMCwgIy1FSU5WQUwKIAkJbW92CXBjLCBscgogI2Vsc2UKIAkJc3RyCXI1LCBbc3AsICM0XQotCQliCWRvX21tYXAyCisJCWIJc3lzX21tYXBfcGdvZmYKICNlbmRpZgogRU5EUFJPQyhzeXNfbW1hcDIpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zeXNfYXJtLmMgYi9hcmNoL2FybS9rZXJuZWwvc3lzX2FybS5jCmluZGV4IDc4ZWNhYWMuLmFlNDAyN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zeXNfYXJtLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3N5c19hcm0uYwpAQCAtMjgsNDEgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pcGMuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGRvX21yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgb2xkX2xlbiwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIG5ld19sZW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBuZXdfYWRkcik7Ci0KLS8qIGNvbW1vbiBjb2RlIGZvciBvbGQgYW5kIG5ldyBtbWFwcyAqLwotaW5saW5lIGxvbmcgZG9fbW1hcDIoCi0JdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLQlpbnQgZXJyb3IgPSAtRUlOVkFMOwotCXN0cnVjdCBmaWxlICogZmlsZSA9IE5VTEw7Ci0KLQlmbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7Ci0KLQlpZiAoZmxhZ3MgJiBNQVBfRklYRUQgJiYgYWRkciA8IEZJUlNUX1VTRVJfQUREUkVTUykKLQkJZ290byBvdXQ7Ci0KLQllcnJvciA9IC1FQkFERjsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCi0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCiBzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0IHsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAJdW5zaWduZWQgbG9uZyBsZW47CkBAIC04NCwyOSArNDksMTEgQEAKIAlpZiAoYS5vZmZzZXQgJiB+UEFHRV9NQVNLKQogCQlnb3RvIG91dDsKIAotCWVycm9yID0gZG9fbW1hcDIoYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLCBhLmZkLCBhLm9mZnNldCA+PiBQQUdFX1NISUZUKTsKKwllcnJvciA9IHN5c19tbWFwX3Bnb2ZmKGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywgYS5mZCwgYS5vZmZzZXQgPj4gUEFHRV9TSElGVCk7CiBvdXQ6CiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIHVuc2lnbmVkIGxvbmcKLXN5c19hcm1fbXJlbWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBvbGRfbGVuLAotCSAgICAgICB1bnNpZ25lZCBsb25nIG5ld19sZW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JICAgICAgIHVuc2lnbmVkIGxvbmcgbmV3X2FkZHIpCi17Ci0JdW5zaWduZWQgbG9uZyByZXQgPSAtRUlOVkFMOwotCi0JaWYgKGZsYWdzICYgTVJFTUFQX0ZJWEVEICYmIG5ld19hZGRyIDwgRklSU1RfVVNFUl9BRERSRVNTKQotCQlnb3RvIG91dDsKLQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JcmV0ID0gZG9fbXJlbWFwKGFkZHIsIG9sZF9sZW4sIG5ld19sZW4sIGZsYWdzLCBuZXdfYWRkcik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCiAvKgogICogUGVyZm9ybSB0aGUgc2VsZWN0KG5kLCBpbiwgb3V0LCBleCwgdHYpIGFuZCBtbWFwKCkgc3lzdGVtCiAgKiBjYWxscy4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLW1zbS9LY29uZmlnCmluZGV4IGQxNDBhYmMuLmY3ODAwODYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vS2NvbmZpZwpAQCAtMyw2ICszLDMwIEBACiBjb21tZW50ICJNU00gQm9hcmQgVHlwZSIKIAlkZXBlbmRzIG9uIEFSQ0hfTVNNCiAKK2NvbmZpZyBNU01fREVCVUdfVUFSVAorCWludAorCWRlZmF1bHQgMSBpZiBNU01fREVCVUdfVUFSVDEKKwlkZWZhdWx0IDIgaWYgTVNNX0RFQlVHX1VBUlQyCisJZGVmYXVsdCAzIGlmIE1TTV9ERUJVR19VQVJUMworCitjaG9pY2UKKwlwcm9tcHQgIkRlYnVnIFVBUlQiCisKKwlkZWZhdWx0IE1TTV9ERUJVR19VQVJUX05PTkUKKworCWNvbmZpZyBNU01fREVCVUdfVUFSVF9OT05FCisJCWJvb2wgIk5vbmUiCisKKwljb25maWcgTVNNX0RFQlVHX1VBUlQxCisJCWJvb2wgIlVBUlQxIgorCisJY29uZmlnIE1TTV9ERUJVR19VQVJUMgorCQlib29sICJVQVJUMiIKKworCWNvbmZpZyBNU01fREVCVUdfVUFSVDMKKwkJYm9vbCAiVUFSVDMiCitlbmRjaG9pY2UKKwogY29uZmlnIE1BQ0hfSEFMSUJVVAogCWRlcGVuZHMgb24gQVJDSF9NU00KIAlkZWZhdWx0IHkKQEAgLTEwLDQgKzM0LDEwIEBACiAJaGVscAogCSAgU3VwcG9ydCBmb3IgdGhlIFF1YWxjb21tIFNVUkY3MjAxQSBldmFsIGJvYXJkLgogCitjb25maWcgTUFDSF9UUk9VVAorCWRlZmF1bHQgeQorCWJvb2wgIkhUQyBEcmVhbSAoYWthIHRyb3V0KSIKKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgSFRDIERyZWFtLCBULU1vYmlsZSBHMSwgQW5kcm9pZCBBRFAxIGRldmljZXMuCisKIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtbXNtL01ha2VmaWxlCmluZGV4IDFhYTQ3MDAuLjkxZTZmNWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL01ha2VmaWxlCkBAIC02LDMgKzYsNCBAQAogCiBvYmotJChDT05GSUdfTUFDSF9IQUxJQlVUKSArPSBib2FyZC1oYWxpYnV0Lm8KIAorb2JqLSQoQ09ORklHX01BQ0hfVFJPVVQpICs9IGJvYXJkLWRyZWFtLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLWRyZWFtLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1kcmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYWZhODUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1kcmVhbS5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLWRyZWFtLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlLCBJbmMuCisgKiBBdXRob3I6IEJyaWFuIFN3ZXRsYW5kIDxzd2V0bGFuZEBnb29nbGUuY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKworI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9tc21faW9tYXAuaD4KKworI2luY2x1ZGUgImRldmljZXMuaCIKKyNpbmNsdWRlICJib2FyZC1kcmVhbS5oIgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJm1zbV9kZXZpY2VfdWFydDMsCisJJm1zbV9kZXZpY2Vfc21kLAorCSZtc21fZGV2aWNlX25hbmQsCisJJm1zbV9kZXZpY2VfaHN1c2IsCisJJm1zbV9kZXZpY2VfaTJjLAorfTsKKworZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgbXNtX3RpbWVyOworCitzdGF0aWMgdm9pZCBfX2luaXQgdHJvdXRfaW5pdF9pcnEodm9pZCkKK3sKKwltc21faW5pdF9pcnEoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHRyb3V0X2ZpeHVwKHN0cnVjdCBtYWNoaW5lX2Rlc2MgKmRlc2MsIHN0cnVjdCB0YWcgKnRhZ3MsCisJCQkJY2hhciAqKmNtZGxpbmUsIHN0cnVjdCBtZW1pbmZvICptaSkKK3sKKwltaS0+bnJfYmFua3MgPSAxOworCW1pLT5iYW5rWzBdLnN0YXJ0ID0gUEhZU19PRkZTRVQ7CisJbWktPmJhbmtbMF0ubm9kZSA9IFBIWVNfVE9fTklEKFBIWVNfT0ZGU0VUKTsKKwltaS0+YmFua1swXS5zaXplID0gKDEwMSoxMDI0KjEwMjQpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgdHJvdXRfaW5pdCh2b2lkKQoreworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOworfQorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHRyb3V0X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCXsKKwkJLnZpcnR1YWwgPSBUUk9VVF9DUExEX0JBU0UsCisJCS5wZm4gICAgID0gX19waHlzX3RvX3BmbihUUk9VVF9DUExEX1NUQVJUKSwKKwkJLmxlbmd0aCAgPSBUUk9VVF9DUExEX1NJWkUsCisJCS50eXBlICAgID0gTVRfREVWSUNFX05PTlNIQVJFRAorCX0KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0cm91dF9tYXBfaW8odm9pZCkKK3sKKwltc21fbWFwX2NvbW1vbl9pbygpOworCWlvdGFibGVfaW5pdCh0cm91dF9pb19kZXNjLCBBUlJBWV9TSVpFKHRyb3V0X2lvX2Rlc2MpKTsKKworI2lmZGVmIENPTkZJR19NU01fREVCVUdfVUFSVDMKKwkvKiByb3V0ZSBVQVJUMyB0byB0aGUgIkgyVyIgZXh0ZW5kZWQgdXNiIGNvbm5lY3RvciAqLworCXdyaXRlYigweDgwLCBUUk9VVF9DUExEX0JBU0UgKyAweDAwKTsKKyNlbmRpZgorCisJbXNtX2Nsb2NrX2luaXQoKTsKK30KKworTUFDSElORV9TVEFSVChUUk9VVCwgIkhUQyBEcmVhbSIpCisJLnBoeXNfaW8JPSBNU01fREVCVUdfVUFSVF9QSFlTLAorCS5pb19wZ19vZmZzdAk9ICgoTVNNX0RFQlVHX1VBUlRfQkFTRSkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCisJLmZpeHVwCQk9IHRyb3V0X2ZpeHVwLAorCS5tYXBfaW8JCT0gdHJvdXRfbWFwX2lvLAorCS5pbml0X2lycQk9IHRyb3V0X2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSB0cm91dF9pbml0LAorCS50aW1lcgkJPSAmbXNtX3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLWRyZWFtLmggYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1kcmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMzQ1YTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1kcmVhbS5oCkBAIC0wLDAgKzEsNSBAQAorCisjZGVmaW5lIFRST1VUX0NQTERfQkFTRSAgIDB4RTgxMDAwMDAKKyNkZWZpbmUgVFJPVVRfQ1BMRF9TVEFSVCAgMHg5ODAwMDAwMAorI2RlZmluZSBUUk9VVF9DUExEX1NJWkUgICBTWl80SworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDFkYjNjOTcuLmQ0ODc0N2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xNCwxNSArMTQsMTggQEAKICAqCiAgKi8KIAorCisKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9tc21faW9tYXAuaD4KIAorI2lmZGVmIENPTkZJR19NU01fREVCVUdfVUFSVAogCS5tYWNybwlhZGRydWFydCxyeAogCUAgc2VlIGlmIHRoZSBNTVUgaXMgZW5hYmxlZCBhbmQgc2VsZWN0IGFwcHJvcHJpYXRlIGJhc2UgYWRkcmVzcwogCW1yYwlwMTUsIDAsIFxyeCwgYzEsIGMwCiAJdHN0CVxyeCwgIzEKLQlsZHJlcQlccngsID1NU01fVUFSVDFfUEhZUwotCW1vdm5lCVxyeCwgIzAKKwlsZHJlcQlccngsID1NU01fREVCVUdfVUFSVF9QSFlTCisJbGRybmUJXHJ4LCA9TVNNX0RFQlVHX1VBUlRfQkFTRQogCS5lbmRtCiAKIAkubWFjcm8Jc2VuZHVhcnQscmQscngKQEAgLTMyLDEzICszNSwyMCBAQAogCiAJLm1hY3JvCXdhaXR1YXJ0LHJkLHJ4CiAJQCB3YWl0IGZvciBUWF9SRUFEWQotCXRlcQlccngsICMwCi0JYm5lCTJmCi0xOglsZHIJXHJkLCBbXHJ4LCAjMHgwOF0KKzEwMDE6CWxkcglccmQsIFtccngsICMweDA4XQogCXRzdAlccmQsICMweDA0Ci0JYmVxCTFiCi0yOgorCWJlcQkxMDAxYgogCS5lbmRtCisjZWxzZQorCS5tYWNybwlhZGRydWFydCxyeAorCS5lbmRtCisKKwkubWFjcm8Jc2VuZHVhcnQscmQscngKKwkuZW5kbQorCisJLm1hY3JvCXdhaXR1YXJ0LHJkLHJ4CisJLmVuZG0KKyNlbmRpZgogCiAJLm1hY3JvCWJ1c3l1YXJ0LHJkLHJ4CiAJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tbWMuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tbWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWNmMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21tYy5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiAgYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9tbWMuaAorICovCisjaWZuZGVmIEFTTUFSTV9NQUNIX01NQ19ICisjZGVmaW5lIEFTTUFSTV9NQUNIX01NQ19ICisKKyNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9jYXJkLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL3NkaW9fZnVuYy5oPgorCitzdHJ1Y3QgZW1iZWRkZWRfc2Rpb19kYXRhIHsKKwlzdHJ1Y3Qgc2Rpb19jaXMgY2lzOworCXN0cnVjdCBzZGlvX2NjY3IgY2NjcjsKKwlzdHJ1Y3Qgc2Rpb19lbWJlZGRlZF9mdW5jICpmdW5jczsKKwlpbnQgbnVtX2Z1bmNzOworfTsKKworc3RydWN0IG1tY19wbGF0Zm9ybV9kYXRhIHsKKwl1bnNpZ25lZCBpbnQgb2NyX21hc2s7CQkJLyogYXZhaWxhYmxlIHZvbHRhZ2VzICovCisJdTMyICgqdHJhbnNsYXRlX3ZkZCkoc3RydWN0IGRldmljZSAqLCB1bnNpZ25lZCBpbnQpOworCXVuc2lnbmVkIGludCAoKnN0YXR1cykoc3RydWN0IGRldmljZSAqKTsKKwlzdHJ1Y3QgZW1iZWRkZWRfc2Rpb19kYXRhICplbWJlZGRlZF9zZGlvOworCWludCAoKnJlZ2lzdGVyX3N0YXR1c19ub3RpZnkpKHZvaWQgKCpjYWxsYmFjaykoaW50IGNhcmRfcHJlc2VudCwgdm9pZCAqZGV2X2lkKSwgdm9pZCAqZGV2X2lkKTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC5oCmluZGV4IDJmN2I0YzguLjlkYWUxYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAuaAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLmgKQEAgLTg0LDYgKzg0LDE4IEBACiAjZGVmaW5lIE1TTV9VQVJUM19QSFlTICAgICAgICAweEE5QzAwMDAwCiAjZGVmaW5lIE1TTV9VQVJUM19TSVpFICAgICAgICBTWl80SwogCisjaWZkZWYgQ09ORklHX01TTV9ERUJVR19VQVJUCisjZGVmaW5lIE1TTV9ERUJVR19VQVJUX0JBU0UgICAweEUxMDAwMDAwCisjaWYgQ09ORklHX01TTV9ERUJVR19VQVJUID09IDEKKyNkZWZpbmUgTVNNX0RFQlVHX1VBUlRfUEhZUyAgIE1TTV9VQVJUMV9QSFlTCisjZWxpZiBDT05GSUdfTVNNX0RFQlVHX1VBUlQgPT0gMgorI2RlZmluZSBNU01fREVCVUdfVUFSVF9QSFlTICAgTVNNX1VBUlQyX1BIWVMKKyNlbGlmIENPTkZJR19NU01fREVCVUdfVUFSVCA9PSAzCisjZGVmaW5lIE1TTV9ERUJVR19VQVJUX1BIWVMgICBNU01fVUFSVDNfUEhZUworI2VuZGlmCisjZGVmaW5lIE1TTV9ERUJVR19VQVJUX1NJWkUgICBTWl80SworI2VuZGlmCisKICNkZWZpbmUgTVNNX1NEQzFfUEhZUyAgICAgICAgIDB4QTA0MDAwMDAKICNkZWZpbmUgTVNNX1NEQzFfU0laRSAgICAgICAgIFNaXzRLCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCmluZGV4IDAyNmU4OTUuLmQ5NDI5MmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaApAQCAtMTYsOSArMTYsMTYgQEAKICNpZm5kZWYgX19BU01fQVJDSF9NU01fVU5DT01QUkVTU19ICiAKICNpbmNsdWRlICJoYXJkd2FyZS5oIgorI2luY2x1ZGUgImxpbnV4L2lvLmgiCisjaW5jbHVkZSAibWFjaC9tc21faW9tYXAuaCIKIAogc3RhdGljIHZvaWQgcHV0YyhpbnQgYykKIHsKKyNpZiBkZWZpbmVkKE1TTV9ERUJVR19VQVJUX1BIWVMpCisJdW5zaWduZWQgYmFzZSA9IE1TTV9ERUJVR19VQVJUX1BIWVM7CisJd2hpbGUgKCEocmVhZGwoYmFzZSArIDB4MDgpICYgMHgwNCkpIDsKKwl3cml0ZWwoYywgYmFzZSArIDB4MGMpOworI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW8uYyBiL2FyY2gvYXJtL21hY2gtbXNtL2lvLmMKaW5kZXggNmU3NjkyZi4uMWM1ZTdkYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW8uYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9pby5jCkBAIC00Miw2ICs0Miw5IEBACiAJTVNNX0RFVklDRShHUElPMSksCiAJTVNNX0RFVklDRShHUElPMiksCiAJTVNNX0RFVklDRShDTEtfQ1RMKSwKKyNpZmRlZiBDT05GSUdfTVNNX0RFQlVHX1VBUlQKKwlNU01fREVWSUNFKERFQlVHX1VBUlQpLAorI2VuZGlmCiAJewogCQkudmlydHVhbCA9ICAodW5zaWduZWQgbG9uZykgTVNNX1NIQVJFRF9SQU1fQkFTRSwKIAkJLnBmbiA9ICAgICAgX19waHlzX3RvX3BmbihNU01fU0hBUkVEX1JBTV9QSFlTKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtbm9raWE3NzAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtbm9raWE3NzAuYwppbmRleCA1YTI3NWJhLi43MWUxYTNmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW5va2lhNzcwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1ub2tpYTc3MC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9vbWFwZmIuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvYWRzNzg0Ni5oPgpAQCAtMzIsNyArMzMsNiBAQAogI2luY2x1ZGUgPHBsYXQva2V5cGFkLmg+CiAjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KICNpbmNsdWRlIDxwbGF0L2RzcF9jb21tb24uaD4KLSNpbmNsdWRlIDxwbGF0L29tYXBmYi5oPgogI2luY2x1ZGUgPHBsYXQvaHdhNzQyLmg+CiAjaW5jbHVkZSA8cGxhdC9sY2RfbWlwaWQuaD4KICNpbmNsdWRlIDxwbGF0L21tYy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNDMwc2RwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTM0MzBzZHAuYwppbmRleCA0OTEzNjRlLi41YmRhOWZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTM0MzBzZHAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTM0MzBzZHAuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+CiAjaW5jbHVkZSA8cGxhdC9kbWEuaD4KICNpbmNsdWRlIDxwbGF0L2dwbWMuaD4KKyNpbmNsdWRlIDxwbGF0L2Rpc3BsYXkuaD4KIAogI2luY2x1ZGUgPHBsYXQvY29udHJvbC5oPgogI2luY2x1ZGUgPHBsYXQvZ3BtYy1zbWM5MXguaD4KQEAgLTE1MiwzMSArMTUzLDE1MiBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZHAzNDMwX2xjZF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gInNkcDI0MzBfbGNkIiwKKworI2RlZmluZSBTRFAzNDMwX0xDRF9QQU5FTF9CQUNLTElHSFRfR1BJTwk4CisjZGVmaW5lIFNEUDM0MzBfTENEX1BBTkVMX0VOQUJMRV9HUElPCQk1CisKK3N0YXRpYyB1bnNpZ25lZCBiYWNrbGlnaHRfZ3BpbzsKK3N0YXRpYyB1bnNpZ25lZCBlbmFibGVfZ3BpbzsKK3N0YXRpYyBpbnQgbGNkX2VuYWJsZWQ7CitzdGF0aWMgaW50IGR2aV9lbmFibGVkOworCitzdGF0aWMgdm9pZCBfX2luaXQgc2RwMzQzMF9kaXNwbGF5X2luaXQodm9pZCkKK3sKKwlpbnQgcjsKKworCWVuYWJsZV9ncGlvICAgID0gU0RQMzQzMF9MQ0RfUEFORUxfRU5BQkxFX0dQSU87CisJYmFja2xpZ2h0X2dwaW8gPSBTRFAzNDMwX0xDRF9QQU5FTF9CQUNLTElHSFRfR1BJTzsKKworCXIgPSBncGlvX3JlcXVlc3QoZW5hYmxlX2dwaW8sICJMQ0QgcmVzZXQiKTsKKwlpZiAocikgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBnZXQgTENEIHJlc2V0IEdQSU9cbiIpOworCQlnb3RvIGVycjA7CisJfQorCisJciA9IGdwaW9fcmVxdWVzdChiYWNrbGlnaHRfZ3BpbywgIkxDRCBCYWNrbGlnaHQiKTsKKwlpZiAocikgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBnZXQgTENEIGJhY2tsaWdodCBHUElPXG4iKTsKKwkJZ290byBlcnIxOworCX0KKworCWdwaW9fZGlyZWN0aW9uX291dHB1dChlbmFibGVfZ3BpbywgMCk7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGJhY2tsaWdodF9ncGlvLCAwKTsKKworCXJldHVybjsKK2VycjE6CisJZ3Bpb19mcmVlKGVuYWJsZV9ncGlvKTsKK2VycjA6CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHNkcDM0MzBfcGFuZWxfZW5hYmxlX2xjZChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJaWYgKGR2aV9lbmFibGVkKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY2Fubm90IGVuYWJsZSBMQ0QsIERWSSBpcyBlbmFibGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGVuYWJsZV9ncGlvLCAxKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoYmFja2xpZ2h0X2dwaW8sIDEpOworCisJbGNkX2VuYWJsZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNkcDM0MzBfcGFuZWxfZGlzYWJsZV9sY2Qoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWxjZF9lbmFibGVkID0gMDsKKworCWdwaW9fZGlyZWN0aW9uX291dHB1dChlbmFibGVfZ3BpbywgMCk7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGJhY2tsaWdodF9ncGlvLCAwKTsKK30KKworc3RhdGljIGludCBzZHAzNDMwX3BhbmVsX2VuYWJsZV9kdmkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWlmIChsY2RfZW5hYmxlZCkgeworCQlwcmludGsoS0VSTl9FUlIgImNhbm5vdCBlbmFibGUgRFZJLCBMQ0QgaXMgZW5hYmxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWR2aV9lbmFibGVkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZHAzNDMwX3BhbmVsX2Rpc2FibGVfZHZpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlkdmlfZW5hYmxlZCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgc2RwMzQzMF9wYW5lbF9lbmFibGVfdHYoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZHAzNDMwX3BhbmVsX2Rpc2FibGVfdHYoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIHNkcDM0MzBfbGNkX2RldmljZSA9IHsKKwkubmFtZQkJCT0gImxjZCIsCisJLmRyaXZlcl9uYW1lCQk9ICJzaGFycF9sc19wYW5lbCIsCisJLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKKwkucGh5LmRwaS5kYXRhX2xpbmVzCT0gMTYsCisJLnBsYXRmb3JtX2VuYWJsZQk9IHNkcDM0MzBfcGFuZWxfZW5hYmxlX2xjZCwKKwkucGxhdGZvcm1fZGlzYWJsZQk9IHNkcDM0MzBfcGFuZWxfZGlzYWJsZV9sY2QsCit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBzZHAzNDMwX2R2aV9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJkdmkiLAorCS5kcml2ZXJfbmFtZQkJPSAiZ2VuZXJpY19wYW5lbCIsCisJLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKKwkucGh5LmRwaS5kYXRhX2xpbmVzCT0gMjQsCisJLnBsYXRmb3JtX2VuYWJsZQk9IHNkcDM0MzBfcGFuZWxfZW5hYmxlX2R2aSwKKwkucGxhdGZvcm1fZGlzYWJsZQk9IHNkcDM0MzBfcGFuZWxfZGlzYWJsZV9kdmksCit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBzZHAzNDMwX3R2X2RldmljZSA9IHsKKwkubmFtZQkJCT0gInR2IiwKKwkuZHJpdmVyX25hbWUJCT0gInZlbmMiLAorCS50eXBlCQkJPSBPTUFQX0RJU1BMQVlfVFlQRV9WRU5DLAorCS5waHkudmVuYy50eXBlCQk9IE9NQVBfRFNTX1ZFTkNfVFlQRV9TVklERU8sCisJLnBsYXRmb3JtX2VuYWJsZQk9IHNkcDM0MzBfcGFuZWxfZW5hYmxlX3R2LAorCS5wbGF0Zm9ybV9kaXNhYmxlCT0gc2RwMzQzMF9wYW5lbF9kaXNhYmxlX3R2LAorfTsKKworCitzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSAqc2RwMzQzMF9kc3NfZGV2aWNlc1tdID0geworCSZzZHAzNDMwX2xjZF9kZXZpY2UsCisJJnNkcDM0MzBfZHZpX2RldmljZSwKKwkmc2RwMzQzMF90dl9kZXZpY2UsCit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2JvYXJkX2luZm8gc2RwMzQzMF9kc3NfZGF0YSA9IHsKKwkubnVtX2RldmljZXMJPSBBUlJBWV9TSVpFKHNkcDM0MzBfZHNzX2RldmljZXMpLAorCS5kZXZpY2VzCT0gc2RwMzQzMF9kc3NfZGV2aWNlcywKKwkuZGVmYXVsdF9kZXZpY2UJPSAmc2RwMzQzMF9sY2RfZGV2aWNlLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2RwMzQzMF9kc3NfZGV2aWNlID0geworCS5uYW1lCQk9ICJvbWFwZHNzIiwKIAkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJnNkcDM0MzBfZHNzX2RhdGEsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBzZHAzNDMwX3ZkYWNfc3VwcGx5ID0gewotCS5zdXBwbHkJCT0gInZkYWMiLAotCS5kZXYJCT0gJnNkcDM0MzBfbGNkX2RldmljZS5kZXYsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgc2RwMzQzMF92ZHZpX3N1cHBseSA9IHsKLQkuc3VwcGx5CQk9ICJ2ZHZpIiwKLQkuZGV2CQk9ICZzZHAzNDMwX2xjZF9kZXZpY2UuZGV2LAorc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHNkcDM0MzBfdmRkYV9kYWNfc3VwcGx5ID0geworCS5zdXBwbHkJCT0gInZkZGFfZGFjIiwKKwkuZGV2CQk9ICZzZHAzNDMwX2Rzc19kZXZpY2UuZGV2LAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNkcDM0MzBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JJnNkcDM0MzBfbGNkX2RldmljZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9sY2RfY29uZmlnIHNkcDM0MzBfbGNkX2NvbmZpZyBfX2luaXRkYXRhID0gewotCS5jdHJsX25hbWUJPSAiaW50ZXJuYWwiLAorCSZzZHAzNDMwX2Rzc19kZXZpY2UsCiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBzZHAzNDMwX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7Ci0JeyBPTUFQX1RBR19MQ0QsCQkmc2RwMzQzMF9sY2RfY29uZmlnIH0sCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF8zNDMwc2RwX2luaXRfaXJxKHZvaWQpCkBAIC0zOTIsMjIgKzUxNCwzNCBAQAogCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCX0sCiAJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gJnNkcDM0MzBfdmRhY19zdXBwbHksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gJnNkcDM0MzBfdmRkYV9kYWNfc3VwcGx5LAogfTsKIAogLyogVlBMTDIgZm9yIGRpZ2l0YWwgdmlkZW8gb3V0cHV0cyAqLworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHNkcDM0MzBfdnBsbDJfc3VwcGxpZXNbXSA9IHsKKwl7CisJCS5zdXBwbHkJCT0gInZkdmkiLAorCQkuZGV2CQk9ICZzZHAzNDMwX2xjZF9kZXZpY2UuZGV2LAorCX0sCisJeworCQkuc3VwcGx5CQk9ICJ2ZGRzX2RzaSIsCisJCS5kZXYJCT0gJnNkcDM0MzBfZHNzX2RldmljZS5kZXYsCisJfQorfTsKKwogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHNkcDM0MzBfdnBsbDIgPSB7CiAJLmNvbnN0cmFpbnRzID0gewogCQkubmFtZQkJCT0gIlZEVkkiLAogCQkubWluX3VWCQkJPSAxODAwMDAwLAogCQkubWF4X3VWCQkJPSAxODAwMDAwLAorCQkuYXBwbHlfdVYJCT0gdHJ1ZSwKIAkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKIAkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAogCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCiAJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCiAJfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSAmc2RwMzQzMF92ZHZpX3N1cHBseSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShzZHAzNDMwX3ZwbGwyX3N1cHBsaWVzKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBzZHAzNDMwX3ZwbGwyX3N1cHBsaWVzLAogfTsKIAogc3RhdGljIHN0cnVjdCB0d2w0MDMwX2NvZGVjX2F1ZGlvX2RhdGEgc2RwMzQzMF9hdWRpbyA9IHsKQEAgLTUyMSw2ICs2NTUsNyBAQAogCW9tYXBfc2VyaWFsX2luaXQoKTsKIAl1c2JfbXVzYl9pbml0KCk7CiAJYm9hcmRfc21jOTF4X2luaXQoKTsKKwlzZHAzNDMwX2Rpc3BsYXlfaW5pdCgpOwogCWVuYWJsZV9ib2FyZF93YWtldXBfc291cmNlKCk7CiAJdXNiX2VoY2lfaW5pdCgmZWhjaV9wZGF0YSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMjR4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0eHguYwppbmRleCBlNzBlN2UwLi44NDViNDc4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMjR4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2syNHh4LmMKQEAgLTExNiwxMCArMTE2LDEwIEBACiAJQ0xLKE5VTEwsCSJtZG1faWNrIiwJJm1kbV9pY2ssCUNLXzI0M1gpLAogCUNMSyhOVUxMLAkibWRtX29zY19jayIsCSZtZG1fb3NjX2NrLAlDS18yNDNYKSwKIAkvKiBEU1MgZG9tYWluIGNsb2NrcyAqLwotCUNMSygib21hcGZiIiwJImljayIsCQkmZHNzX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSygib21hcGZiIiwJImRzczFfZmNrIiwJJmRzczFfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKCJvbWFwZmIiLAkiZHNzMl9mY2siLAkmZHNzMl9mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoIm9tYXBmYiIsCSJ0dl9mY2siLAkmZHNzXzU0bV9mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoIm9tYXBkc3MiLAkiaWNrIiwJCSZkc3NfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKCJvbWFwZHNzIiwJImRzczFfZmNrIiwJJmRzczFfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKCJvbWFwZHNzIiwJImRzczJfZmNrIiwJJmRzczJfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKCJvbWFwZHNzIiwJInR2X2ZjayIsCSZkc3NfNTRtX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAogCS8qIEwzIGRvbWFpbiBjbG9ja3MgKi8KIAlDTEsoTlVMTCwJImNvcmVfbDNfY2siLAkmY29yZV9sM19jaywJQ0tfMjQzWCB8IENLXzI0MlgpLAogCUNMSyhOVUxMLAkic3NpX2ZjayIsCSZzc2lfc3NyX3NzdF9mY2ssIENLXzI0M1ggfCBDS18yNDJYKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2szNHh4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMzR4eC5jCmluZGV4IDlmMmZlYWYuLmVjYmI1Y2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2szNHh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazM0eHguYwpAQCAtMjM2LDEzICsyMzYsMTMgQEAKIAlDTEsoIm9tYXBfcm5nIiwJImljayIsCQkmcm5nX2ljaywJQ0tfMzQzWCksCiAJQ0xLKE5VTEwsCSJzaGExMV9pY2siLAkmc2hhMTFfaWNrLAlDS18zNDNYKSwKIAlDTEsoTlVMTCwJImRlczFfaWNrIiwJJmRlczFfaWNrLAlDS18zNDNYKSwKLQlDTEsoIm9tYXBmYiIsCSJkc3MxX2ZjayIsCSZkc3MxX2Fsd29uX2Zja18zNDMwZXMxLCBDS18zNDMwRVMxKSwKLQlDTEsoIm9tYXBmYiIsCSJkc3MxX2ZjayIsCSZkc3MxX2Fsd29uX2Zja18zNDMwZXMyLCBDS18zNDMwRVMyKSwKLQlDTEsoIm9tYXBmYiIsCSJ0dl9mY2siLAkmZHNzX3R2X2ZjaywJQ0tfMzQzWCksCi0JQ0xLKCJvbWFwZmIiLAkidmlkZW9fZmNrIiwJJmRzc185Nm1fZmNrLAlDS18zNDNYKSwKLQlDTEsoIm9tYXBmYiIsCSJkc3MyX2ZjayIsCSZkc3MyX2Fsd29uX2ZjaywgQ0tfMzQzWCksCi0JQ0xLKCJvbWFwZmIiLAkiaWNrIiwJCSZkc3NfaWNrXzM0MzBlczEsCUNLXzM0MzBFUzEpLAotCUNMSygib21hcGZiIiwJImljayIsCQkmZHNzX2lja18zNDMwZXMyLAlDS18zNDMwRVMyKSwKKwlDTEsoIm9tYXBkc3MiLAkiZHNzMV9mY2siLAkmZHNzMV9hbHdvbl9mY2tfMzQzMGVzMSwgQ0tfMzQzMEVTMSksCisJQ0xLKCJvbWFwZHNzIiwJImRzczFfZmNrIiwJJmRzczFfYWx3b25fZmNrXzM0MzBlczIsIENLXzM0MzBFUzIpLAorCUNMSygib21hcGRzcyIsCSJ0dl9mY2siLAkmZHNzX3R2X2ZjaywJQ0tfMzQzWCksCisJQ0xLKCJvbWFwZHNzIiwJInZpZGVvX2ZjayIsCSZkc3NfOTZtX2ZjaywJQ0tfMzQzWCksCisJQ0xLKCJvbWFwZHNzIiwJImRzczJfZmNrIiwJJmRzczJfYWx3b25fZmNrLCBDS18zNDNYKSwKKwlDTEsoIm9tYXBkc3MiLAkiaWNrIiwJCSZkc3NfaWNrXzM0MzBlczEsCUNLXzM0MzBFUzEpLAorCUNMSygib21hcGRzcyIsCSJpY2siLAkJJmRzc19pY2tfMzQzMGVzMiwJQ0tfMzQzMEVTMiksCiAJQ0xLKE5VTEwsCSJjYW1fbWNsayIsCSZjYW1fbWNsaywJQ0tfMzQzWCksCiAJQ0xLKE5VTEwsCSJjYW1faWNrIiwJJmNhbV9pY2ssCUNLXzM0M1gpLAogCUNMSyhOVUxMLAkiY3NpMl85Nm1fZmNrIiwJJmNzaTJfOTZtX2ZjaywJQ0tfMzQzWCksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2lvLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2lvLmMKaW5kZXggNTlkMjhiMi4uNmE0ZDhlNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pby5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaW8uYwpAQCAtMjIsMTcgKzIyLDE4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvb21hcGZiLmg+CiAKICNpbmNsdWRlIDxhc20vdGxiLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+Ci0jaW5jbHVkZSA8cGxhdC9vbWFwZmIuaD4KICNpbmNsdWRlIDxwbGF0L3NyYW0uaD4KICNpbmNsdWRlIDxwbGF0L3NkcmMuaD4KICNpbmNsdWRlIDxwbGF0L2dwbWMuaD4KICNpbmNsdWRlIDxwbGF0L3NlcmlhbC5oPgorI2luY2x1ZGUgPHBsYXQvdnJhbS5oPgogCiAjaWZuZGVmIENPTkZJR19BUkNIX09NQVA0CS8qIEZJWE1FOiBSZW1vdmUgdGhpcyBvbmNlIGNsa2RldiBpcyByZWFkeSAqLwogI2luY2x1ZGUgImNsb2NrLmgiCkBAIC0yNjQsNiArMjY1LDcgQEAKIAlvbWFwMl9jaGVja19yZXZpc2lvbigpOwogCW9tYXBfc3JhbV9pbml0KCk7CiAJb21hcGZiX3Jlc2VydmVfc2RyYW0oKTsKKwlvbWFwX3ZyYW1fcmVzZXJ2ZV9zZHJhbSgpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9zZHJjLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3NkcmMuYwppbmRleCA5YTU5MjE5Li5jYmZiZDE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3NkcmMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3NkcmMuYwpAQCAtMTYwLDMgKzE2MCwxOSBAQAogCXNkcmNfd3JpdGVfcmVnKGwsIFNEUkNfUE9XRVIpOwogCW9tYXAyX3Ntc19zYXZlX2NvbnRleHQoKTsKIH0KKwordm9pZCBvbWFwMl9zbXNfd3JpdGVfcm90X2NvbnRyb2wodTMyIHZhbCwgdW5zaWduZWQgY3R4KQoreworCXNtc193cml0ZV9yZWcodmFsLCBTTVNfUk9UX0NPTlRST0woY3R4KSk7Cit9CisKK3ZvaWQgb21hcDJfc21zX3dyaXRlX3JvdF9zaXplKHUzMiB2YWwsIHVuc2lnbmVkIGN0eCkKK3sKKwlzbXNfd3JpdGVfcmVnKHZhbCwgU01TX1JPVF9TSVpFKGN0eCkpOworfQorCit2b2lkIG9tYXAyX3Ntc193cml0ZV9yb3RfcGh5c2ljYWxfYmEodTMyIHZhbCwgdW5zaWduZWQgY3R4KQoreworCXNtc193cml0ZV9yZWcodmFsLCBTTVNfUk9UX1BIWVNJQ0FMX0JBKGN0eCkpOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9tbWFwLmMgYi9hcmNoL2FybS9tbS9tbWFwLmMKaW5kZXggMmI3OTk2NC4uZjVhYmM1MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vbW1hcC5jCisrKyBiL2FyY2gvYXJtL21tL21tYXAuYwpAQCAtNTQsNyArNTQsOCBAQAogCSAqIFdlIGVuZm9yY2UgdGhlIE1BUF9GSVhFRCBjYXNlLgogCSAqLwogCWlmIChmbGFncyAmIE1BUF9GSVhFRCkgewotCQlpZiAoYWxpYXNpbmcgJiYgZmxhZ3MgJiBNQVBfU0hBUkVEICYmIGFkZHIgJiAoU0hNTEJBIC0gMSkpCisJCWlmIChhbGlhc2luZyAmJiBmbGFncyAmIE1BUF9TSEFSRUQgJiYKKwkJICAgIChhZGRyIC0gKHBnb2ZmIDw8IFBBR0VfU0hJRlQpKSAmIChTSE1MQkEgLSAxKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlyZXR1cm4gYWRkcjsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9NYWtlZmlsZSBiL2FyY2gvYXJtL3BsYXQtbXhjL01ha2VmaWxlCmluZGV4IDRjYmNhOWQuLjk5NmNiYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL01ha2VmaWxlCkBAIC05LDYgKzksNyBAQAogb2JqLSQoQ09ORklHX0FSQ0hfTVgyKSArPSBpb211eC1teDEtbXgyLm8gZG1hLW14MS1teDIubwogb2JqLSQoQ09ORklHX0FSQ0hfTVhDX0lPTVVYX1YzKSArPSBpb211eC12My5vCiBvYmotJChDT05GSUdfTVhDX1BXTSkgICs9IHB3bS5vCitvYmotJChDT05GSUdfVVNCX0VIQ0lfTVhDKSArPSBlaGNpLm8KIG9iai0kKENPTkZJR19NWENfVUxQSSkgKz0gdWxwaS5vCiBvYmotJChDT05GSUdfQVJDSF9NWENfQVVETVVYX1YxKSArPSBhdWRtdXgtdjEubwogb2JqLSQoQ09ORklHX0FSQ0hfTVhDX0FVRE1VWF9WMikgKz0gYXVkbXV4LXYyLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2VoY2kuYyBiL2FyY2gvYXJtL3BsYXQtbXhjL2VoY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTU5OWJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZWhjaS5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgRGFuaWVsIE1hY2sgPGRhbmllbEBjYWlhcS5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCisgKiBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL214Y19laGNpLmg+CisKKyNkZWZpbmUgVVNCQ1RSTF9PVEdCQVNFX09GRlNFVAkweDYwMAorCisjZGVmaW5lIE1YMzFfT1RHX1NJQ19TSElGVAkyOQorI2RlZmluZSBNWDMxX09UR19TSUNfTUFTSwkoMHhmIDw8IE1YMzFfT1RHX1NJQ19TSElGVCkKKyNkZWZpbmUgTVgzMV9PVEdfUE1fQklUCQkoMSA8PCAyNCkKKworI2RlZmluZSBNWDMxX0gyX1NJQ19TSElGVAkyMQorI2RlZmluZSBNWDMxX0gyX1NJQ19NQVNLCSgweGYgPDwgTVgzMV9IMl9TSUNfU0hJRlQpCisjZGVmaW5lIE1YMzFfSDJfUE1fQklUCQkoMSA8PCAxNikKKyNkZWZpbmUgTVgzMV9IMl9EVF9CSVQJCSgxIDw8IDUpCisKKyNkZWZpbmUgTVgzMV9IMV9TSUNfU0hJRlQJMTMKKyNkZWZpbmUgTVgzMV9IMV9TSUNfTUFTSwkoMHhmIDw8IE1YMzFfSDFfU0lDX1NISUZUKQorI2RlZmluZSBNWDMxX0gxX1BNX0JJVAkJKDEgPDwgOCkKKyNkZWZpbmUgTVgzMV9IMV9EVF9CSVQJCSgxIDw8IDQpCisKK2ludCBteGNfc2V0X3VzYmNvbnRyb2woaW50IHBvcnQsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwl1bnNpZ25lZCBpbnQgdjsKKworCWlmIChjcHVfaXNfbXgzMSgpKSB7CisJCXYgPSByZWFkbChJT19BRERSRVNTKE1YMzFfT1RHX0JBU0VfQUREUiArCisJCQkJICAgICBVU0JDVFJMX09UR0JBU0VfT0ZGU0VUKSk7CisKKwkJc3dpdGNoIChwb3J0KSB7CisJCWNhc2UgMDoJLyogT1RHIHBvcnQgKi8KKwkJCXYgJj0gfihNWDMxX09UR19TSUNfTUFTSyB8IE1YMzFfT1RHX1BNX0JJVCk7CisJCQl2IHw9IChmbGFncyAmIE1YQ19FSENJX0lOVEVSRkFDRV9NQVNLKQorCQkJCQk8PCBNWDMxX09UR19TSUNfU0hJRlQ7CisJCQlpZiAoZmxhZ3MgJiBNWENfRUhDSV9QT1dFUl9QSU5TX0VOQUJMRUQpCisJCQkJdiB8PSBNWDMxX09UR19QTV9CSVQ7CisKKwkJCWJyZWFrOworCQljYXNlIDE6IC8qIEgxIHBvcnQgKi8KKwkJCXYgJj0gfihNWDMxX0gxX1NJQ19NQVNLIHwgTVgzMV9IMV9QTV9CSVQpOworCQkJdiB8PSAoZmxhZ3MgJiBNWENfRUhDSV9JTlRFUkZBQ0VfTUFTSykKKwkJCQkJCTw8IE1YMzFfSDFfU0lDX1NISUZUOworCQkJaWYgKGZsYWdzICYgTVhDX0VIQ0lfUE9XRVJfUElOU19FTkFCTEVEKQorCQkJCXYgfD0gTVgzMV9IMV9QTV9CSVQ7CisKKwkJCWlmICghKGZsYWdzICYgTVhDX0VIQ0lfVFRMX0VOQUJMRUQpKQorCQkJCXYgfD0gTVgzMV9IMV9EVF9CSVQ7CisKKwkJCWJyZWFrOworCQljYXNlIDI6CS8qIEgyIHBvcnQgKi8KKwkJCXYgJj0gfihNWDMxX0gyX1NJQ19NQVNLIHwgTVgzMV9IMl9QTV9CSVQpOworCQkJdiB8PSAoZmxhZ3MgJiBNWENfRUhDSV9JTlRFUkZBQ0VfTUFTSykKKwkJCQkJCTw8IE1YMzFfSDJfU0lDX1NISUZUOworCQkJaWYgKCEoZmxhZ3MgJiBNWENfRUhDSV9QT1dFUl9QSU5TX0VOQUJMRUQpKQorCQkJCXYgfD0gTVgzMV9IMl9QTV9CSVQ7CisKKwkJCWlmICghKGZsYWdzICYgTVhDX0VIQ0lfVFRMX0VOQUJMRUQpKQorCQkJCXYgfD0gTVgzMV9IMl9EVF9CSVQ7CisKKwkJCWJyZWFrOworCQl9CisKKwkJd3JpdGVsKHYsIElPX0FERFJFU1MoTVgzMV9PVEdfQkFTRV9BRERSICsKKwkJCQkgICAgIFVTQkNUUkxfT1RHQkFTRV9PRkZTRVQpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJpbnRrKEtFUk5fV0FSTklORworCQkiJXMoKSB1bmFibGUgdG8gc2V0dXAgVVNCQ09OVFJPTCBmb3IgdGhpcyBDUFVcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0wobXhjX3NldF91c2Jjb250cm9sKTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214Y19laGNpLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXhjX2VoY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjc5NjIzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214Y19laGNpLmgKQEAgLTAsMCArMSwzNyBAQAorI2lmbmRlZiBfX0lOQ0xVREVfQVNNX0FSQ0hfTVhDX0VIQ0lfSAorI2RlZmluZSBfX0lOQ0xVREVfQVNNX0FSQ0hfTVhDX0VIQ0lfSAorCisvKiB2YWx1ZXMgZm9yIHBvcnRzYyBmaWVsZCAqLworI2RlZmluZSBNWENfRUhDSV9QSFlfTE9XX1BPV0VSX1NVU1BFTkQJKDEgPDwgMjMpCisjZGVmaW5lIE1YQ19FSENJX0ZPUkNFX0ZTCQkoMSA8PCAyNCkKKyNkZWZpbmUgTVhDX0VIQ0lfVVRNSV84QklUCQkoMCA8PCAyOCkKKyNkZWZpbmUgTVhDX0VIQ0lfVVRNSV8xNkJJVAkJKDEgPDwgMjgpCisjZGVmaW5lIE1YQ19FSENJX1NFUklBTAkJCSgxIDw8IDI5KQorI2RlZmluZSBNWENfRUhDSV9NT0RFX1VUTUkJCSgwIDw8IDMwKQorI2RlZmluZSBNWENfRUhDSV9NT0RFX1BISUxJUFMJCSgxIDw8IDMwKQorI2RlZmluZSBNWENfRUhDSV9NT0RFX1VMUEkJCSgyIDw8IDMwKQorI2RlZmluZSBNWENfRUhDSV9NT0RFX1NFUklBTAkJKDMgPDwgMzApCisKKy8qIHZhbHVlcyBmb3IgZmxhZ3MgZmllbGQgKi8KKyNkZWZpbmUgTVhDX0VIQ0lfSU5URVJGQUNFX0RJRkZfVU5JCSgwIDw8IDApCisjZGVmaW5lIE1YQ19FSENJX0lOVEVSRkFDRV9ESUZGX0JJCSgxIDw8IDApCisjZGVmaW5lIE1YQ19FSENJX0lOVEVSRkFDRV9TSU5HTEVfVU5JCSgyIDw8IDApCisjZGVmaW5lIE1YQ19FSENJX0lOVEVSRkFDRV9TSU5HTEVfQkkJKDMgPDwgMCkKKyNkZWZpbmUgTVhDX0VIQ0lfSU5URVJGQUNFX01BU0sJCSgweGYpCisKKyNkZWZpbmUgTVhDX0VIQ0lfUE9XRVJfUElOU19FTkFCTEVECSgxIDw8IDUpCisjZGVmaW5lIE1YQ19FSENJX1RUTF9FTkFCTEVECQkoMSA8PCA2KQorCitzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSB7CisJaW50ICgqaW5pdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisJaW50ICgqZXhpdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisKKwl1bnNpZ25lZCBpbnQJCSBwb3J0c2M7CisJdW5zaWduZWQgaW50CQkgZmxhZ3M7CisJc3RydWN0IG90Z190cmFuc2NlaXZlcgkqb3RnOworfTsKKworaW50IG14Y19zZXRfdXNiY29udHJvbChpbnQgcG9ydCwgdW5zaWduZWQgaW50IGZsYWdzKTsKKworI2VuZGlmIC8qIF9fSU5DTFVERV9BU01fQVJDSF9NWENfRUhDSV9IICovCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9mYi5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2ZiLmMKaW5kZXggNzhhNGNlNS4uZDNlZWE0ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2ZiLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2ZiLmMKQEAgLTI4LDEzICsyOCwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29tYXBmYi5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8cGxhdC9ib2FyZC5oPgogI2luY2x1ZGUgPHBsYXQvc3JhbS5oPgotI2luY2x1ZGUgPHBsYXQvb21hcGZiLmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19GQl9PTUFQKSB8fCBkZWZpbmVkKENPTkZJR19GQl9PTUFQX01PRFVMRSkKIApAQCAtNTUsNiArNTUsMTAgQEAKIAkubnVtX3Jlc291cmNlcyA9IDAsCiB9OwogCit2b2lkIG9tYXBmYl9zZXRfcGxhdGZvcm1fZGF0YShzdHJ1Y3Qgb21hcGZiX3BsYXRmb3JtX2RhdGEgKmRhdGEpCit7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IHJhbmdlc19vdmVybGFwKHVuc2lnbmVkIGxvbmcgc3RhcnQxLCB1bnNpZ25lZCBsb25nIHNpemUxLAogCQkJCSB1bnNpZ25lZCBsb25nIHN0YXJ0MiwgdW5zaWduZWQgbG9uZyBzaXplMikKIHsKQEAgLTMyNyw3ICszMzEsMzMgQEAKIAogYXJjaF9pbml0Y2FsbChvbWFwX2luaXRfZmIpOwogCi0jZWxzZQorI2VsaWYgZGVmaW5lZChDT05GSUdfRkJfT01BUDIpIHx8IGRlZmluZWQoQ09ORklHX0ZCX09NQVAyX01PRFVMRSkKKworc3RhdGljIHU2NCBvbWFwX2ZiX2RtYV9tYXNrID0gfih1MzIpMDsKK3N0YXRpYyBzdHJ1Y3Qgb21hcGZiX3BsYXRmb3JtX2RhdGEgb21hcGZiX2NvbmZpZzsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcF9mYl9kZXZpY2UgPSB7CisJLm5hbWUJCT0gIm9tYXBmYiIsCisJLmlkCQk9IC0xLAorCS5kZXYgPSB7CisJCS5kbWFfbWFzawkJPSAmb21hcF9mYl9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gfih1MzIpMCwKKwkJLnBsYXRmb3JtX2RhdGEJCT0gJm9tYXBmYl9jb25maWcsCisJfSwKKwkubnVtX3Jlc291cmNlcyA9IDAsCit9OworCit2b2lkIG9tYXBmYl9zZXRfcGxhdGZvcm1fZGF0YShzdHJ1Y3Qgb21hcGZiX3BsYXRmb3JtX2RhdGEgKmRhdGEpCit7CisJb21hcGZiX2NvbmZpZyA9ICpkYXRhOworfQorCitzdGF0aWMgaW5saW5lIGludCBvbWFwX2luaXRfZmIodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZvbWFwX2ZiX2RldmljZSk7Cit9CisKK2FyY2hfaW5pdGNhbGwob21hcF9pbml0X2ZiKTsKIAogdm9pZCBvbWFwZmJfcmVzZXJ2ZV9zZHJhbSh2b2lkKSB7fQogdW5zaWduZWQgbG9uZyBvbWFwZmJfcmVzZXJ2ZV9zcmFtKHVuc2lnbmVkIGxvbmcgc3JhbV9wc3RhcnQsCkBAIC0zMzksNSArMzY5LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKKyNlbHNlCisKK3ZvaWQgb21hcGZiX3NldF9wbGF0Zm9ybV9kYXRhKHN0cnVjdCBvbWFwZmJfcGxhdGZvcm1fZGF0YSAqZGF0YSkKK3sKK30KKwordm9pZCBvbWFwZmJfcmVzZXJ2ZV9zZHJhbSh2b2lkKSB7fQordW5zaWduZWQgbG9uZyBvbWFwZmJfcmVzZXJ2ZV9zcmFtKHVuc2lnbmVkIGxvbmcgc3JhbV9wc3RhcnQsCisJCQkJICB1bnNpZ25lZCBsb25nIHNyYW1fdnN0YXJ0LAorCQkJCSAgdW5zaWduZWQgbG9uZyBzcmFtX3NpemUsCisJCQkJICB1bnNpZ25lZCBsb25nIHN0YXJ0X2F2YWlsLAorCQkJCSAgdW5zaWduZWQgbG9uZyBzaXplX2F2YWlsKQoreworCXJldHVybiAwOworfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvZGlzcGxheS5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9kaXNwbGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2ZTQ2NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvZGlzcGxheS5oCkBAIC0wLDAgKzEsNTc1IEBACisvKgorICogbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kaXNwbGF5LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogVG9taSBWYWxrZWluZW4gPHRvbWkudmFsa2VpbmVuQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9PTUFQX0RJU1BMQVlfSAorI2RlZmluZSBfX0FTTV9BUkNIX09NQVBfRElTUExBWV9ICisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworI2RlZmluZSBESVNQQ19JUlFfRlJBTUVET05FCQkoMSA8PCAwKQorI2RlZmluZSBESVNQQ19JUlFfVlNZTkMJCQkoMSA8PCAxKQorI2RlZmluZSBESVNQQ19JUlFfRVZTWU5DX0VWRU4JCSgxIDw8IDIpCisjZGVmaW5lIERJU1BDX0lSUV9FVlNZTkNfT0RECQkoMSA8PCAzKQorI2RlZmluZSBESVNQQ19JUlFfQUNCSUFTX0NPVU5UX1NUQVQJKDEgPDwgNCkKKyNkZWZpbmUgRElTUENfSVJRX1BST0dfTElORV9OVU0JCSgxIDw8IDUpCisjZGVmaW5lIERJU1BDX0lSUV9HRlhfRklGT19VTkRFUkZMT1cJKDEgPDwgNikKKyNkZWZpbmUgRElTUENfSVJRX0dGWF9FTkRfV0lOCQkoMSA8PCA3KQorI2RlZmluZSBESVNQQ19JUlFfUEFMX0dBTU1BX01BU0sJKDEgPDwgOCkKKyNkZWZpbmUgRElTUENfSVJRX09DUF9FUlIJCSgxIDw8IDkpCisjZGVmaW5lIERJU1BDX0lSUV9WSUQxX0ZJRk9fVU5ERVJGTE9XCSgxIDw8IDEwKQorI2RlZmluZSBESVNQQ19JUlFfVklEMV9FTkRfV0lOCQkoMSA8PCAxMSkKKyNkZWZpbmUgRElTUENfSVJRX1ZJRDJfRklGT19VTkRFUkZMT1cJKDEgPDwgMTIpCisjZGVmaW5lIERJU1BDX0lSUV9WSUQyX0VORF9XSU4JCSgxIDw8IDEzKQorI2RlZmluZSBESVNQQ19JUlFfU1lOQ19MT1NUCQkoMSA8PCAxNCkKKyNkZWZpbmUgRElTUENfSVJRX1NZTkNfTE9TVF9ESUdJVAkoMSA8PCAxNSkKKyNkZWZpbmUgRElTUENfSVJRX1dBS0VVUAkJKDEgPDwgMTYpCisKK3N0cnVjdCBvbWFwX2Rzc19kZXZpY2U7CitzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXI7CisKK2VudW0gb21hcF9kaXNwbGF5X3R5cGUgeworCU9NQVBfRElTUExBWV9UWVBFX05PTkUJCT0gMCwKKwlPTUFQX0RJU1BMQVlfVFlQRV9EUEkJCT0gMSA8PCAwLAorCU9NQVBfRElTUExBWV9UWVBFX0RCSQkJPSAxIDw8IDEsCisJT01BUF9ESVNQTEFZX1RZUEVfU0RJCQk9IDEgPDwgMiwKKwlPTUFQX0RJU1BMQVlfVFlQRV9EU0kJCT0gMSA8PCAzLAorCU9NQVBfRElTUExBWV9UWVBFX1ZFTkMJCT0gMSA8PCA0LAorfTsKKworZW51bSBvbWFwX3BsYW5lIHsKKwlPTUFQX0RTU19HRlgJPSAwLAorCU9NQVBfRFNTX1ZJREVPMQk9IDEsCisJT01BUF9EU1NfVklERU8yCT0gMgorfTsKKworZW51bSBvbWFwX2NoYW5uZWwgeworCU9NQVBfRFNTX0NIQU5ORUxfTENECT0gMCwKKwlPTUFQX0RTU19DSEFOTkVMX0RJR0lUCT0gMSwKK307CisKK2VudW0gb21hcF9jb2xvcl9tb2RlIHsKKwlPTUFQX0RTU19DT0xPUl9DTFVUMQk9IDEgPDwgMCwgIC8qIEJJVE1BUCAxICovCisJT01BUF9EU1NfQ09MT1JfQ0xVVDIJPSAxIDw8IDEsICAvKiBCSVRNQVAgMiAqLworCU9NQVBfRFNTX0NPTE9SX0NMVVQ0CT0gMSA8PCAyLCAgLyogQklUTUFQIDQgKi8KKwlPTUFQX0RTU19DT0xPUl9DTFVUOAk9IDEgPDwgMywgIC8qIEJJVE1BUCA4ICovCisJT01BUF9EU1NfQ09MT1JfUkdCMTJVCT0gMSA8PCA0LCAgLyogUkdCMTIsIDE2LWJpdCBjb250YWluZXIgKi8KKwlPTUFQX0RTU19DT0xPUl9BUkdCMTYJPSAxIDw8IDUsICAvKiBBUkdCMTYgKi8KKwlPTUFQX0RTU19DT0xPUl9SR0IxNgk9IDEgPDwgNiwgIC8qIFJHQjE2ICovCisJT01BUF9EU1NfQ09MT1JfUkdCMjRVCT0gMSA8PCA3LCAgLyogUkdCMjQsIDMyLWJpdCBjb250YWluZXIgKi8KKwlPTUFQX0RTU19DT0xPUl9SR0IyNFAJPSAxIDw8IDgsICAvKiBSR0IyNCwgMjQtYml0IGNvbnRhaW5lciAqLworCU9NQVBfRFNTX0NPTE9SX1lVVjIJPSAxIDw8IDksICAvKiBZVVYyIDQ6MjoyIGNvLXNpdGVkICovCisJT01BUF9EU1NfQ09MT1JfVVlWWQk9IDEgPDwgMTAsIC8qIFVZVlkgNDoyOjIgY28tc2l0ZWQgKi8KKwlPTUFQX0RTU19DT0xPUl9BUkdCMzIJPSAxIDw8IDExLCAvKiBBUkdCMzIgKi8KKwlPTUFQX0RTU19DT0xPUl9SR0JBMzIJPSAxIDw8IDEyLCAvKiBSR0JBMzIgKi8KKwlPTUFQX0RTU19DT0xPUl9SR0JYMzIJPSAxIDw8IDEzLCAvKiBSR0J4MzIgKi8KKworCU9NQVBfRFNTX0NPTE9SX0dGWF9PTUFQMiA9CisJCU9NQVBfRFNTX0NPTE9SX0NMVVQxIHwgT01BUF9EU1NfQ09MT1JfQ0xVVDIgfAorCQlPTUFQX0RTU19DT0xPUl9DTFVUNCB8IE9NQVBfRFNTX0NPTE9SX0NMVVQ4IHwKKwkJT01BUF9EU1NfQ09MT1JfUkdCMTJVIHwgT01BUF9EU1NfQ09MT1JfUkdCMTYgfAorCQlPTUFQX0RTU19DT0xPUl9SR0IyNFUgfCBPTUFQX0RTU19DT0xPUl9SR0IyNFAsCisKKwlPTUFQX0RTU19DT0xPUl9WSURfT01BUDIgPQorCQlPTUFQX0RTU19DT0xPUl9SR0IxNiB8IE9NQVBfRFNTX0NPTE9SX1JHQjI0VSB8CisJCU9NQVBfRFNTX0NPTE9SX1JHQjI0UCB8IE9NQVBfRFNTX0NPTE9SX1lVVjIgfAorCQlPTUFQX0RTU19DT0xPUl9VWVZZLAorCisJT01BUF9EU1NfQ09MT1JfR0ZYX09NQVAzID0KKwkJT01BUF9EU1NfQ09MT1JfQ0xVVDEgfCBPTUFQX0RTU19DT0xPUl9DTFVUMiB8CisJCU9NQVBfRFNTX0NPTE9SX0NMVVQ0IHwgT01BUF9EU1NfQ09MT1JfQ0xVVDggfAorCQlPTUFQX0RTU19DT0xPUl9SR0IxMlUgfCBPTUFQX0RTU19DT0xPUl9BUkdCMTYgfAorCQlPTUFQX0RTU19DT0xPUl9SR0IxNiB8IE9NQVBfRFNTX0NPTE9SX1JHQjI0VSB8CisJCU9NQVBfRFNTX0NPTE9SX1JHQjI0UCB8IE9NQVBfRFNTX0NPTE9SX0FSR0IzMiB8CisJCU9NQVBfRFNTX0NPTE9SX1JHQkEzMiB8IE9NQVBfRFNTX0NPTE9SX1JHQlgzMiwKKworCU9NQVBfRFNTX0NPTE9SX1ZJRDFfT01BUDMgPQorCQlPTUFQX0RTU19DT0xPUl9SR0IxMlUgfCBPTUFQX0RTU19DT0xPUl9SR0IxNiB8CisJCU9NQVBfRFNTX0NPTE9SX1JHQjI0VSB8IE9NQVBfRFNTX0NPTE9SX1JHQjI0UCB8CisJCU9NQVBfRFNTX0NPTE9SX1lVVjIgfCBPTUFQX0RTU19DT0xPUl9VWVZZLAorCisJT01BUF9EU1NfQ09MT1JfVklEMl9PTUFQMyA9CisJCU9NQVBfRFNTX0NPTE9SX1JHQjEyVSB8IE9NQVBfRFNTX0NPTE9SX0FSR0IxNiB8CisJCU9NQVBfRFNTX0NPTE9SX1JHQjE2IHwgT01BUF9EU1NfQ09MT1JfUkdCMjRVIHwKKwkJT01BUF9EU1NfQ09MT1JfUkdCMjRQIHwgT01BUF9EU1NfQ09MT1JfWVVWMiB8CisJCU9NQVBfRFNTX0NPTE9SX1VZVlkgfCBPTUFQX0RTU19DT0xPUl9BUkdCMzIgfAorCQlPTUFQX0RTU19DT0xPUl9SR0JBMzIgfCBPTUFQX0RTU19DT0xPUl9SR0JYMzIsCit9OworCitlbnVtIG9tYXBfbGNkX2Rpc3BsYXlfdHlwZSB7CisJT01BUF9EU1NfTENEX0RJU1BMQVlfU1ROLAorCU9NQVBfRFNTX0xDRF9ESVNQTEFZX1RGVCwKK307CisKK2VudW0gb21hcF9kc3NfbG9hZF9tb2RlIHsKKwlPTUFQX0RTU19MT0FEX0NMVVRfQU5EX0ZSQU1FCT0gMCwKKwlPTUFQX0RTU19MT0FEX0NMVVRfT05MWQkJPSAxLAorCU9NQVBfRFNTX0xPQURfRlJBTUVfT05MWQk9IDIsCisJT01BUF9EU1NfTE9BRF9DTFVUX09OQ0VfRlJBTUUJPSAzLAorfTsKKworZW51bSBvbWFwX2Rzc190cmFuc19rZXlfdHlwZSB7CisJT01BUF9EU1NfQ09MT1JfS0VZX0dGWF9EU1QgPSAwLAorCU9NQVBfRFNTX0NPTE9SX0tFWV9WSURfU1JDID0gMSwKK307CisKK2VudW0gb21hcF9yZmJpX3RlX21vZGUgeworCU9NQVBfRFNTX1JGQklfVEVfTU9ERV8xID0gMSwKKwlPTUFQX0RTU19SRkJJX1RFX01PREVfMiA9IDIsCit9OworCitlbnVtIG9tYXBfcGFuZWxfY29uZmlnIHsKKwlPTUFQX0RTU19MQ0RfSVZTCQk9IDE8PDAsCisJT01BUF9EU1NfTENEX0lIUwkJPSAxPDwxLAorCU9NQVBfRFNTX0xDRF9JUEMJCT0gMTw8MiwKKwlPTUFQX0RTU19MQ0RfSUVPCQk9IDE8PDMsCisJT01BUF9EU1NfTENEX1JGCQkJPSAxPDw0LAorCU9NQVBfRFNTX0xDRF9PTk9GRgkJPSAxPDw1LAorCisJT01BUF9EU1NfTENEX1RGVAkJPSAxPDwyMCwKK307CisKK2VudW0gb21hcF9kc3NfdmVuY190eXBlIHsKKwlPTUFQX0RTU19WRU5DX1RZUEVfQ09NUE9TSVRFLAorCU9NQVBfRFNTX1ZFTkNfVFlQRV9TVklERU8sCit9OworCitlbnVtIG9tYXBfZGlzcGxheV9jYXBzIHsKKwlPTUFQX0RTU19ESVNQTEFZX0NBUF9NQU5VQUxfVVBEQVRFCT0gMSA8PCAwLAorCU9NQVBfRFNTX0RJU1BMQVlfQ0FQX1RFQVJfRUxJTQkJPSAxIDw8IDEsCit9OworCitlbnVtIG9tYXBfZHNzX3VwZGF0ZV9tb2RlIHsKKwlPTUFQX0RTU19VUERBVEVfRElTQUJMRUQgPSAwLAorCU9NQVBfRFNTX1VQREFURV9BVVRPLAorCU9NQVBfRFNTX1VQREFURV9NQU5VQUwsCit9OworCitlbnVtIG9tYXBfZHNzX2Rpc3BsYXlfc3RhdGUgeworCU9NQVBfRFNTX0RJU1BMQVlfRElTQUJMRUQgPSAwLAorCU9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFLAorCU9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVELAorfTsKKworLyogWFhYIHBlcmhhcHMgdGhpcyBzaG91bGQgYmUgcmVtb3ZlZCAqLworZW51bSBvbWFwX2Rzc19vdmVybGF5X21hbmFnZXJzIHsKKwlPTUFQX0RTU19PVkxfTUdSX0xDRCwKKwlPTUFQX0RTU19PVkxfTUdSX1RWLAorfTsKKworZW51bSBvbWFwX2Rzc19yb3RhdGlvbl90eXBlIHsKKwlPTUFQX0RTU19ST1RfRE1BID0gMCwKKwlPTUFQX0RTU19ST1RfVlJGQiA9IDEsCit9OworCisvKiBjbG9ja3dpc2Ugcm90YXRpb24gYW5nbGUgKi8KK2VudW0gb21hcF9kc3Nfcm90YXRpb25fYW5nbGUgeworCU9NQVBfRFNTX1JPVF8wICAgPSAwLAorCU9NQVBfRFNTX1JPVF85MCAgPSAxLAorCU9NQVBfRFNTX1JPVF8xODAgPSAyLAorCU9NQVBfRFNTX1JPVF8yNzAgPSAzLAorfTsKKworZW51bSBvbWFwX292ZXJsYXlfY2FwcyB7CisJT01BUF9EU1NfT1ZMX0NBUF9TQ0FMRSA9IDEgPDwgMCwKKwlPTUFQX0RTU19PVkxfQ0FQX0RJU1BDID0gMSA8PCAxLAorfTsKKworZW51bSBvbWFwX292ZXJsYXlfbWFuYWdlcl9jYXBzIHsKKwlPTUFQX0RTU19PVkxfTUdSX0NBUF9ESVNQQyA9IDEgPDwgMCwKK307CisKKy8qIFJGQkkgKi8KKworc3RydWN0IHJmYmlfdGltaW5ncyB7CisJaW50IGNzX29uX3RpbWU7CisJaW50IGNzX29mZl90aW1lOworCWludCB3ZV9vbl90aW1lOworCWludCB3ZV9vZmZfdGltZTsKKwlpbnQgcmVfb25fdGltZTsKKwlpbnQgcmVfb2ZmX3RpbWU7CisJaW50IHdlX2N5Y2xlX3RpbWU7CisJaW50IHJlX2N5Y2xlX3RpbWU7CisJaW50IGNzX3B1bHNlX3dpZHRoOworCWludCBhY2Nlc3NfdGltZTsKKworCWludCBjbGtfZGl2OworCisJdTMyIHRpbVs1XTsgICAgICAgICAgICAgLyogc2V0IGJ5IHJmYmlfY29udmVydF90aW1pbmdzKCkgKi8KKworCWludCBjb252ZXJ0ZWQ7Cit9OworCit2b2lkIG9tYXBfcmZiaV93cml0ZV9jb21tYW5kKGNvbnN0IHZvaWQgKmJ1ZiwgdTMyIGxlbik7Cit2b2lkIG9tYXBfcmZiaV9yZWFkX2RhdGEodm9pZCAqYnVmLCB1MzIgbGVuKTsKK3ZvaWQgb21hcF9yZmJpX3dyaXRlX2RhdGEoY29uc3Qgdm9pZCAqYnVmLCB1MzIgbGVuKTsKK3ZvaWQgb21hcF9yZmJpX3dyaXRlX3BpeGVscyhjb25zdCB2b2lkIF9faW9tZW0gKmJ1ZiwgaW50IHNjcl93aWR0aCwKKwkJdTE2IHgsIHUxNiB5LAorCQl1MTYgdywgdTE2IGgpOworaW50IG9tYXBfcmZiaV9lbmFibGVfdGUoYm9vbCBlbmFibGUsIHVuc2lnbmVkIGxpbmUpOworaW50IG9tYXBfcmZiaV9zZXR1cF90ZShlbnVtIG9tYXBfcmZiaV90ZV9tb2RlIG1vZGUsCisJCQkgICAgIHVuc2lnbmVkIGhzX3B1bHNlX3RpbWUsIHVuc2lnbmVkIHZzX3B1bHNlX3RpbWUsCisJCQkgICAgIGludCBoc19wb2xfaW52LCBpbnQgdnNfcG9sX2ludiwgaW50IGV4dGlmX2Rpdik7CisKKy8qIERTSSAqLwordm9pZCBkc2lfYnVzX2xvY2sodm9pZCk7Cit2b2lkIGRzaV9idXNfdW5sb2NrKHZvaWQpOworaW50IGRzaV92Y19kY3Nfd3JpdGUoaW50IGNoYW5uZWwsIHU4ICpkYXRhLCBpbnQgbGVuKTsKK2ludCBkc2lfdmNfZGNzX3dyaXRlX25vc3luYyhpbnQgY2hhbm5lbCwgdTggKmRhdGEsIGludCBsZW4pOworaW50IGRzaV92Y19kY3NfcmVhZChpbnQgY2hhbm5lbCwgdTggZGNzX2NtZCwgdTggKmJ1ZiwgaW50IGJ1Zmxlbik7CitpbnQgZHNpX3ZjX3NldF9tYXhfcnhfcGFja2V0X3NpemUoaW50IGNoYW5uZWwsIHUxNiBsZW4pOworaW50IGRzaV92Y19zZW5kX251bGwoaW50IGNoYW5uZWwpOworaW50IGRzaV92Y19zZW5kX2J0YV9zeW5jKGludCBjaGFubmVsKTsKKworLyogQm9hcmQgc3BlY2lmaWMgZGF0YSAqLworc3RydWN0IG9tYXBfZHNzX2JvYXJkX2luZm8geworCWludCAoKmdldF9sYXN0X29mZl9vbl90cmFuc2FjdGlvbl9pZCkoc3RydWN0IGRldmljZSAqZGV2KTsKKwlpbnQgbnVtX2RldmljZXM7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqKmRldmljZXM7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGVmYXVsdF9kZXZpY2U7Cit9OworCitzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzIHsKKwkvKiBVbml0OiBwaXhlbHMgKi8KKwl1MTYgeF9yZXM7CisJLyogVW5pdDogcGl4ZWxzICovCisJdTE2IHlfcmVzOworCS8qIFVuaXQ6IEtIeiAqLworCXUzMiBwaXhlbF9jbG9jazsKKwkvKiBVbml0OiBwaXhlbCBjbG9ja3MgKi8KKwl1MTYgaHN3OwkvKiBIb3Jpem9udGFsIHN5bmNocm9uaXphdGlvbiBwdWxzZSB3aWR0aCAqLworCS8qIFVuaXQ6IHBpeGVsIGNsb2NrcyAqLworCXUxNiBoZnA7CS8qIEhvcml6b250YWwgZnJvbnQgcG9yY2ggKi8KKwkvKiBVbml0OiBwaXhlbCBjbG9ja3MgKi8KKwl1MTYgaGJwOwkvKiBIb3Jpem9udGFsIGJhY2sgcG9yY2ggKi8KKwkvKiBVbml0OiBsaW5lIGNsb2NrcyAqLworCXUxNiB2c3c7CS8qIFZlcnRpY2FsIHN5bmNocm9uaXphdGlvbiBwdWxzZSB3aWR0aCAqLworCS8qIFVuaXQ6IGxpbmUgY2xvY2tzICovCisJdTE2IHZmcDsJLyogVmVydGljYWwgZnJvbnQgcG9yY2ggKi8KKwkvKiBVbml0OiBsaW5lIGNsb2NrcyAqLworCXUxNiB2YnA7CS8qIFZlcnRpY2FsIGJhY2sgcG9yY2ggKi8KK307CisKKyNpZmRlZiBDT05GSUdfT01BUDJfRFNTX1ZFTkMKKy8qIEhhcmRjb2RlZCB0aW1pbmdzIGZvciB0diBtb2Rlcy4gVmVuYyBvbmx5IHVzZXMgdGhlc2UgdG8KKyAqIGlkZW50aWZ5IHRoZSBtb2RlLCBhbmQgZG9lcyBub3QgYWN0dWFsbHkgdXNlIHRoZSBjb25maWdzCisgKiBpdHNlbGYuIEhvd2V2ZXIsIHRoZSBjb25maWdzIHNob3VsZCBiZSBzb21ldGhpbmcgdGhhdAorICogYSBub3JtYWwgbW9uaXRvciBjYW4gYWxzbyBzaG93ICovCitjb25zdCBleHRlcm4gc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyBvbWFwX2Rzc19wYWxfdGltaW5nczsKK2NvbnN0IGV4dGVybiBzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzIG9tYXBfZHNzX250c2NfdGltaW5nczsKKyNlbmRpZgorCitzdHJ1Y3Qgb21hcF9vdmVybGF5X2luZm8geworCWJvb2wgZW5hYmxlZDsKKworCXUzMiBwYWRkcjsKKwl2b2lkIF9faW9tZW0gKnZhZGRyOworCXUxNiBzY3JlZW5fd2lkdGg7CisJdTE2IHdpZHRoOworCXUxNiBoZWlnaHQ7CisJZW51bSBvbWFwX2NvbG9yX21vZGUgY29sb3JfbW9kZTsKKwl1OCByb3RhdGlvbjsKKwllbnVtIG9tYXBfZHNzX3JvdGF0aW9uX3R5cGUgcm90YXRpb25fdHlwZTsKKwlib29sIG1pcnJvcjsKKworCXUxNiBwb3NfeDsKKwl1MTYgcG9zX3k7CisJdTE2IG91dF93aWR0aDsJLyogaWYgMCwgb3V0X3dpZHRoID09IHdpZHRoICovCisJdTE2IG91dF9oZWlnaHQ7CS8qIGlmIDAsIG91dF9oZWlnaHQgPT0gaGVpZ2h0ICovCisJdTggZ2xvYmFsX2FscGhhOworfTsKKworc3RydWN0IG9tYXBfb3ZlcmxheSB7CisJc3RydWN0IGtvYmplY3Qga29iajsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiBzdGF0aWMgZmllbGRzICovCisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgaWQ7CisJZW51bSBvbWFwX2NvbG9yX21vZGUgc3VwcG9ydGVkX21vZGVzOworCWVudW0gb21hcF9vdmVybGF5X2NhcHMgY2FwczsKKworCS8qIGR5bmFtaWMgZmllbGRzICovCisJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptYW5hZ2VyOworCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyBpbmZvOworCisJLyogaWYgdHJ1ZSwgaW5mbyBoYXMgYmVlbiBjaGFuZ2VkLCBidXQgbm90IGFwcGxpZWQoKSB5ZXQgKi8KKwlib29sIGluZm9fZGlydHk7CisKKwlpbnQgKCpzZXRfbWFuYWdlcikoc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsLAorCQlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncik7CisJaW50ICgqdW5zZXRfbWFuYWdlcikoc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsKTsKKworCWludCAoKnNldF9vdmVybGF5X2luZm8pKHN0cnVjdCBvbWFwX292ZXJsYXkgKm92bCwKKwkJCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyAqaW5mbyk7CisJdm9pZCAoKmdldF9vdmVybGF5X2luZm8pKHN0cnVjdCBvbWFwX292ZXJsYXkgKm92bCwKKwkJCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyAqaW5mbyk7CisKKwlpbnQgKCp3YWl0X2Zvcl9nbykoc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsKTsKK307CisKK3N0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlcl9pbmZvIHsKKwl1MzIgZGVmYXVsdF9jb2xvcjsKKworCWVudW0gb21hcF9kc3NfdHJhbnNfa2V5X3R5cGUgdHJhbnNfa2V5X3R5cGU7CisJdTMyIHRyYW5zX2tleTsKKwlib29sIHRyYW5zX2VuYWJsZWQ7CisKKwlib29sIGFscGhhX2VuYWJsZWQ7Cit9OworCitzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgeworCXN0cnVjdCBrb2JqZWN0IGtvYmo7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJLyogc3RhdGljIGZpZWxkcyAqLworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGlkOworCWVudW0gb21hcF9vdmVybGF5X21hbmFnZXJfY2FwcyBjYXBzOworCWludCBudW1fb3ZlcmxheXM7CisJc3RydWN0IG9tYXBfb3ZlcmxheSAqKm92ZXJsYXlzOworCWVudW0gb21hcF9kaXNwbGF5X3R5cGUgc3VwcG9ydGVkX2Rpc3BsYXlzOworCisJLyogZHluYW1pYyBmaWVsZHMgKi8KKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkZXZpY2U7CisJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyX2luZm8gaW5mbzsKKworCWJvb2wgZGV2aWNlX2NoYW5nZWQ7CisJLyogaWYgdHJ1ZSwgaW5mbyBoYXMgYmVlbiBjaGFuZ2VkIGJ1dCBub3QgYXBwbGllZCgpIHlldCAqLworCWJvb2wgaW5mb19kaXJ0eTsKKworCWludCAoKnNldF9kZXZpY2UpKHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyLAorCQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpOworCWludCAoKnVuc2V0X2RldmljZSkoc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IpOworCisJaW50ICgqc2V0X21hbmFnZXJfaW5mbykoc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IsCisJCQlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXJfaW5mbyAqaW5mbyk7CisJdm9pZCAoKmdldF9tYW5hZ2VyX2luZm8pKHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyLAorCQkJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyX2luZm8gKmluZm8pOworCisJaW50ICgqYXBwbHkpKHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyKTsKKwlpbnQgKCp3YWl0X2Zvcl9nbykoc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IpOworfTsKKworc3RydWN0IG9tYXBfZHNzX2RldmljZSB7CisJc3RydWN0IGRldmljZSBkZXY7CisKKwllbnVtIG9tYXBfZGlzcGxheV90eXBlIHR5cGU7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1OCBkYXRhX2xpbmVzOworCQl9IGRwaTsKKworCQlzdHJ1Y3QgeworCQkJdTggY2hhbm5lbDsKKwkJCXU4IGRhdGFfbGluZXM7CisJCX0gcmZiaTsKKworCQlzdHJ1Y3QgeworCQkJdTggZGF0YXBhaXJzOworCQl9IHNkaTsKKworCQlzdHJ1Y3QgeworCQkJdTggY2xrX2xhbmU7CisJCQl1OCBjbGtfcG9sOworCQkJdTggZGF0YTFfbGFuZTsKKwkJCXU4IGRhdGExX3BvbDsKKwkJCXU4IGRhdGEyX2xhbmU7CisJCQl1OCBkYXRhMl9wb2w7CisKKwkJCXN0cnVjdCB7CisJCQkJdTE2IHJlZ247CisJCQkJdTE2IHJlZ207CisJCQkJdTE2IHJlZ20zOworCQkJCXUxNiByZWdtNDsKKworCQkJCXUxNiBscF9jbGtfZGl2OworCisJCQkJdTE2IGxja19kaXY7CisJCQkJdTE2IHBja19kaXY7CisJCQl9IGRpdjsKKworCQkJYm9vbCBleHRfdGU7CisJCQl1OCBleHRfdGVfZ3BpbzsKKwkJfSBkc2k7CisKKwkJc3RydWN0IHsKKwkJCWVudW0gb21hcF9kc3NfdmVuY190eXBlIHR5cGU7CisJCQlib29sIGludmVydF9wb2xhcml0eTsKKwkJfSB2ZW5jOworCX0gcGh5OworCisJc3RydWN0IHsKKwkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyB0aW1pbmdzOworCisJCWludCBhY2JpOwkvKiBhYy1iaWFzIHBpbiB0cmFuc2l0aW9ucyBwZXIgaW50ZXJydXB0ICovCisJCS8qIFVuaXQ6IGxpbmUgY2xvY2tzICovCisJCWludCBhY2I7CS8qIGFjLWJpYXMgcGluIGZyZXF1ZW5jeSAqLworCisJCWVudW0gb21hcF9wYW5lbF9jb25maWcgY29uZmlnOworCisJCXU4IHJlY29tbWVuZGVkX2JwcDsKKworCQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpjdHJsOworCX0gcGFuZWw7CisKKwlzdHJ1Y3QgeworCQl1OCBwaXhlbF9zaXplOworCQlzdHJ1Y3QgcmZiaV90aW1pbmdzIHJmYmlfdGltaW5nczsKKwkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqcGFuZWw7CisJfSBjdHJsOworCisJaW50IHJlc2V0X2dwaW87CisKKwlpbnQgbWF4X2JhY2tsaWdodF9sZXZlbDsKKworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkvKiB1c2VkIHRvIG1hdGNoIGRldmljZSB0byBkcml2ZXIgKi8KKwljb25zdCBjaGFyICpkcml2ZXJfbmFtZTsKKworCXZvaWQgKmRhdGE7CisKKwlzdHJ1Y3Qgb21hcF9kc3NfZHJpdmVyICpkcml2ZXI7CisKKwkvKiBoZWxwZXIgdmFyaWFibGUgZm9yIGRyaXZlciBzdXNwZW5kL3Jlc3VtZSAqLworCWJvb2wgYWN0aXZhdGVfYWZ0ZXJfcmVzdW1lOworCisJZW51bSBvbWFwX2Rpc3BsYXlfY2FwcyBjYXBzOworCisJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptYW5hZ2VyOworCisJZW51bSBvbWFwX2Rzc19kaXNwbGF5X3N0YXRlIHN0YXRlOworCisJaW50ICgqZW5hYmxlKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpOworCXZvaWQgKCpkaXNhYmxlKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpOworCisJaW50ICgqc3VzcGVuZCkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KTsKKwlpbnQgKCpyZXN1bWUpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CisKKwl2b2lkICgqZ2V0X3Jlc29sdXRpb24pKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJCXUxNiAqeHJlcywgdTE2ICp5cmVzKTsKKwlpbnQgKCpnZXRfcmVjb21tZW5kZWRfYnBwKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpOworCisJaW50ICgqY2hlY2tfdGltaW5ncykoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncyk7CisJdm9pZCAoKnNldF90aW1pbmdzKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCisJCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKTsKKwl2b2lkICgqZ2V0X3RpbWluZ3MpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpOworCWludCAoKnVwZGF0ZSkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQkJICAgICAgIHUxNiB4LCB1MTYgeSwgdTE2IHcsIHUxNiBoKTsKKwlpbnQgKCpzeW5jKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpOworCWludCAoKndhaXRfdnN5bmMpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CisKKwlpbnQgKCpzZXRfdXBkYXRlX21vZGUpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJCWVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUpOworCWVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUgKCpnZXRfdXBkYXRlX21vZGUpCisJCShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpOworCisJaW50ICgqZW5hYmxlX3RlKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGJvb2wgZW5hYmxlKTsKKwlpbnQgKCpnZXRfdGUpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CisKKwl1OCAoKmdldF9yb3RhdGUpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CisJaW50ICgqc2V0X3JvdGF0ZSkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCB1OCByb3RhdGUpOworCisJYm9vbCAoKmdldF9taXJyb3IpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CisJaW50ICgqc2V0X21pcnJvcikoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBib29sIGVuYWJsZSk7CisKKwlpbnQgKCpydW5fdGVzdCkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgdGVzdCk7CisJaW50ICgqbWVtb3J5X3JlYWQpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJCXZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUsCisJCQl1MTYgeCwgdTE2IHksIHUxNiB3LCB1MTYgaCk7CisKKwlpbnQgKCpzZXRfd3NzKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIHUzMiB3c3MpOworCXUzMiAoKmdldF93c3MpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CisKKwkvKiBwbGF0Zm9ybSBzcGVjaWZpYyAgKi8KKwlpbnQgKCpwbGF0Zm9ybV9lbmFibGUpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CisJdm9pZCAoKnBsYXRmb3JtX2Rpc2FibGUpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CisJaW50ICgqc2V0X2JhY2tsaWdodCkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgbGV2ZWwpOworCWludCAoKmdldF9iYWNrbGlnaHQpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7Cit9OworCitzdHJ1Y3Qgb21hcF9kc3NfZHJpdmVyIHsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcml2ZXI7CisKKwlpbnQgKCpwcm9iZSkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqKTsKKwl2b2lkICgqcmVtb3ZlKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICopOworCisJaW50ICgqZW5hYmxlKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5KTsKKwl2b2lkICgqZGlzYWJsZSkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheSk7CisJaW50ICgqc3VzcGVuZCkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheSk7CisJaW50ICgqcmVzdW1lKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5KTsKKwlpbnQgKCpydW5fdGVzdCkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheSwgaW50IHRlc3QpOworCisJdm9pZCAoKnNldHVwX3VwZGF0ZSkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQkJdTE2IHgsIHUxNiB5LCB1MTYgdywgdTE2IGgpOworCisJaW50ICgqZW5hYmxlX3RlKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGJvb2wgZW5hYmxlKTsKKwlpbnQgKCp3YWl0X2Zvcl90ZSkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KTsKKworCXU4ICgqZ2V0X3JvdGF0ZSkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KTsKKwlpbnQgKCpzZXRfcm90YXRlKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIHU4IHJvdGF0ZSk7CisKKwlib29sICgqZ2V0X21pcnJvcikoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KTsKKwlpbnQgKCpzZXRfbWlycm9yKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGJvb2wgZW5hYmxlKTsKKworCWludCAoKm1lbW9yeV9yZWFkKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCisJCQl2b2lkICpidWYsIHNpemVfdCBzaXplLAorCQkJdTE2IHgsIHUxNiB5LCB1MTYgdywgdTE2IGgpOworfTsKKworaW50IG9tYXBfZHNzX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3Qgb21hcF9kc3NfZHJpdmVyICopOwordm9pZCBvbWFwX2Rzc191bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3Qgb21hcF9kc3NfZHJpdmVyICopOworCitpbnQgb21hcF9kc3NfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKik7Cit2b2lkIG9tYXBfZHNzX3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKik7CisKK3ZvaWQgb21hcF9kc3NfZ2V0X2RldmljZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpOwordm9pZCBvbWFwX2Rzc19wdXRfZGV2aWNlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CisjZGVmaW5lIGZvcl9lYWNoX2Rzc19kZXYoZCkgd2hpbGUgKChkID0gb21hcF9kc3NfZ2V0X25leHRfZGV2aWNlKGQpKSAhPSBOVUxMKQorc3RydWN0IG9tYXBfZHNzX2RldmljZSAqb21hcF9kc3NfZ2V0X25leHRfZGV2aWNlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmZyb20pOworc3RydWN0IG9tYXBfZHNzX2RldmljZSAqb21hcF9kc3NfZmluZF9kZXZpY2Uodm9pZCAqZGF0YSwKKwkJaW50ICgqbWF0Y2gpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldiwgdm9pZCAqZGF0YSkpOworCitpbnQgb21hcF9kc3Nfc3RhcnRfZGV2aWNlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7Cit2b2lkIG9tYXBfZHNzX3N0b3BfZGV2aWNlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CisKK2ludCBvbWFwX2Rzc19nZXRfbnVtX292ZXJsYXlfbWFuYWdlcnModm9pZCk7CitzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm9tYXBfZHNzX2dldF9vdmVybGF5X21hbmFnZXIoaW50IG51bSk7CisKK2ludCBvbWFwX2Rzc19nZXRfbnVtX292ZXJsYXlzKHZvaWQpOworc3RydWN0IG9tYXBfb3ZlcmxheSAqb21hcF9kc3NfZ2V0X292ZXJsYXkoaW50IG51bSk7CisKK3R5cGVkZWYgdm9pZCAoKm9tYXBfZGlzcGNfaXNyX3QpICh2b2lkICphcmcsIHUzMiBtYXNrKTsKK2ludCBvbWFwX2Rpc3BjX3JlZ2lzdGVyX2lzcihvbWFwX2Rpc3BjX2lzcl90IGlzciwgdm9pZCAqYXJnLCB1MzIgbWFzayk7CitpbnQgb21hcF9kaXNwY191bnJlZ2lzdGVyX2lzcihvbWFwX2Rpc3BjX2lzcl90IGlzciwgdm9pZCAqYXJnLCB1MzIgbWFzayk7CisKK2ludCBvbWFwX2Rpc3BjX3dhaXRfZm9yX2lycV90aW1lb3V0KHUzMiBpcnFtYXNrLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpOworaW50IG9tYXBfZGlzcGNfd2FpdF9mb3JfaXJxX2ludGVycnVwdGlibGVfdGltZW91dCh1MzIgaXJxbWFzaywKKwkJdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKKworI2RlZmluZSB0b19kc3NfZHJpdmVyKHgpIGNvbnRhaW5lcl9vZigoeCksIHN0cnVjdCBvbWFwX2Rzc19kcml2ZXIsIGRyaXZlcikKKyNkZWZpbmUgdG9fZHNzX2RldmljZSh4KSBjb250YWluZXJfb2YoKHgpLCBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlLCBkZXYpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9vbWFwZmIuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcGZiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZWY3YWIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9vbWFwZmIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKgotICogRmlsZTogYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9vbWFwZmIuaAotICoKLSAqIEZyYW1lYnVmZmVyIGRyaXZlciBmb3IgVEkgT01BUCBib2FyZHMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgQ29ycG9yYXRpb24KLSAqIEF1dGhvcjogSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotICovCi0KLSNpZm5kZWYgX19PTUFQRkJfSAotI2RlZmluZSBfX09NQVBGQl9ICi0KLSNpbmNsdWRlIDxhc20vaW9jdGwuaD4KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLQotLyogSU9DVEwgY29tbWFuZHMuICovCi0KLSNkZWZpbmUgT01BUF9JT1cobnVtLCBkdHlwZSkJX0lPVygnTycsIG51bSwgZHR5cGUpCi0jZGVmaW5lIE9NQVBfSU9SKG51bSwgZHR5cGUpCV9JT1IoJ08nLCBudW0sIGR0eXBlKQotI2RlZmluZSBPTUFQX0lPV1IobnVtLCBkdHlwZSkJX0lPV1IoJ08nLCBudW0sIGR0eXBlKQotI2RlZmluZSBPTUFQX0lPKG51bSkJCV9JTygnTycsIG51bSkKLQotI2RlZmluZSBPTUFQRkJfTUlSUk9SCQlPTUFQX0lPVygzMSwgaW50KQotI2RlZmluZSBPTUFQRkJfU1lOQ19HRlgJCU9NQVBfSU8oMzcpCi0jZGVmaW5lIE9NQVBGQl9WU1lOQwkJT01BUF9JTygzOCkKLSNkZWZpbmUgT01BUEZCX1NFVF9VUERBVEVfTU9ERQlPTUFQX0lPVyg0MCwgaW50KQotI2RlZmluZSBPTUFQRkJfR0VUX0NBUFMJCU9NQVBfSU9SKDQyLCBzdHJ1Y3Qgb21hcGZiX2NhcHMpCi0jZGVmaW5lIE9NQVBGQl9HRVRfVVBEQVRFX01PREUJT01BUF9JT1coNDMsIGludCkKLSNkZWZpbmUgT01BUEZCX0xDRF9URVNUCQlPTUFQX0lPVyg0NSwgaW50KQotI2RlZmluZSBPTUFQRkJfQ1RSTF9URVNUCU9NQVBfSU9XKDQ2LCBpbnQpCi0jZGVmaW5lIE9NQVBGQl9VUERBVEVfV0lORE9XX09MRCBPTUFQX0lPVyg0Nywgc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93X29sZCkKLSNkZWZpbmUgT01BUEZCX1NFVF9DT0xPUl9LRVkJT01BUF9JT1coNTAsIHN0cnVjdCBvbWFwZmJfY29sb3Jfa2V5KQotI2RlZmluZSBPTUFQRkJfR0VUX0NPTE9SX0tFWQlPTUFQX0lPVyg1MSwgc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkpCi0jZGVmaW5lIE9NQVBGQl9TRVRVUF9QTEFORQlPTUFQX0lPVyg1Miwgc3RydWN0IG9tYXBmYl9wbGFuZV9pbmZvKQotI2RlZmluZSBPTUFQRkJfUVVFUllfUExBTkUJT01BUF9JT1coNTMsIHN0cnVjdCBvbWFwZmJfcGxhbmVfaW5mbykKLSNkZWZpbmUgT01BUEZCX1VQREFURV9XSU5ET1cJT01BUF9JT1coNTQsIHN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdykKLSNkZWZpbmUgT01BUEZCX1NFVFVQX01FTQlPTUFQX0lPVyg1NSwgc3RydWN0IG9tYXBmYl9tZW1faW5mbykKLSNkZWZpbmUgT01BUEZCX1FVRVJZX01FTQlPTUFQX0lPVyg1Niwgc3RydWN0IG9tYXBmYl9tZW1faW5mbykKLQotI2RlZmluZSBPTUFQRkJfQ0FQU19HRU5FUklDX01BU0sJMHgwMDAwMGZmZgotI2RlZmluZSBPTUFQRkJfQ0FQU19MQ0RDX01BU0sJCTB4MDBmZmYwMDAKLSNkZWZpbmUgT01BUEZCX0NBUFNfUEFORUxfTUFTSwkJMHhmZjAwMDAwMAotCi0jZGVmaW5lIE9NQVBGQl9DQVBTX01BTlVBTF9VUERBVEUJMHgwMDAwMTAwMAotI2RlZmluZSBPTUFQRkJfQ0FQU19URUFSU1lOQwkJMHgwMDAwMjAwMAotI2RlZmluZSBPTUFQRkJfQ0FQU19QTEFORV9SRUxPQ0FURV9NRU0JMHgwMDAwNDAwMAotI2RlZmluZSBPTUFQRkJfQ0FQU19QTEFORV9TQ0FMRQkJMHgwMDAwODAwMAotI2RlZmluZSBPTUFQRkJfQ0FQU19XSU5ET1dfUElYRUxfRE9VQkxFCTB4MDAwMTAwMDAKLSNkZWZpbmUgT01BUEZCX0NBUFNfV0lORE9XX1NDQUxFCTB4MDAwMjAwMDAKLSNkZWZpbmUgT01BUEZCX0NBUFNfV0lORE9XX09WRVJMQVkJMHgwMDA0MDAwMAotI2RlZmluZSBPTUFQRkJfQ0FQU19XSU5ET1dfUk9UQVRFCTB4MDAwODAwMDAKLSNkZWZpbmUgT01BUEZCX0NBUFNfU0VUX0JBQ0tMSUdIVAkweDAxMDAwMDAwCi0KLS8qIFZhbHVlcyBmcm9tIERTUCBtdXN0IG1hcCB0byBsb3dlciAxNi1iaXRzICovCi0jZGVmaW5lIE9NQVBGQl9GT1JNQVRfTUFTSwkJMHgwMGZmCi0jZGVmaW5lIE9NQVBGQl9GT1JNQVRfRkxBR19ET1VCTEUJMHgwMTAwCi0jZGVmaW5lIE9NQVBGQl9GT1JNQVRfRkxBR19URUFSU1lOQwkweDAyMDAKLSNkZWZpbmUgT01BUEZCX0ZPUk1BVF9GTEFHX0ZPUkNFX1ZTWU5DCTB4MDQwMAotI2RlZmluZSBPTUFQRkJfRk9STUFUX0ZMQUdfRU5BQkxFX09WRVJMQVkJMHgwODAwCi0jZGVmaW5lIE9NQVBGQl9GT1JNQVRfRkxBR19ESVNBQkxFX09WRVJMQVkJMHgxMDAwCi0KLSNkZWZpbmUgT01BUEZCX0VWRU5UX1JFQURZCTEKLSNkZWZpbmUgT01BUEZCX0VWRU5UX0RJU0FCTEVECTIKLQotI2RlZmluZSBPTUFQRkJfTUVNVFlQRV9TRFJBTQkJMAotI2RlZmluZSBPTUFQRkJfTUVNVFlQRV9TUkFNCQkxCi0jZGVmaW5lIE9NQVBGQl9NRU1UWVBFX01BWAkJMQotCi1lbnVtIG9tYXBmYl9jb2xvcl9mb3JtYXQgewotCU9NQVBGQl9DT0xPUl9SR0I1NjUgPSAwLAotCU9NQVBGQl9DT0xPUl9ZVVY0MjIsCi0JT01BUEZCX0NPTE9SX1lVVjQyMCwKLQlPTUFQRkJfQ09MT1JfQ0xVVF84QlBQLAotCU9NQVBGQl9DT0xPUl9DTFVUXzRCUFAsCi0JT01BUEZCX0NPTE9SX0NMVVRfMkJQUCwKLQlPTUFQRkJfQ09MT1JfQ0xVVF8xQlBQLAotCU9NQVBGQl9DT0xPUl9SR0I0NDQsCi0JT01BUEZCX0NPTE9SX1lVWTQyMiwKLX07Ci0KLXN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyB7Ci0JX191MzIgeCwgeTsKLQlfX3UzMiB3aWR0aCwgaGVpZ2h0OwotCV9fdTMyIGZvcm1hdDsKLQlfX3UzMiBvdXRfeCwgb3V0X3k7Ci0JX191MzIgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0OwotCV9fdTMyIHJlc2VydmVkWzhdOwotfTsKLQotc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93X29sZCB7Ci0JX191MzIgeCwgeTsKLQlfX3UzMiB3aWR0aCwgaGVpZ2h0OwotCV9fdTMyIGZvcm1hdDsKLX07Ci0KLWVudW0gb21hcGZiX3BsYW5lIHsKLQlPTUFQRkJfUExBTkVfR0ZYID0gMCwKLQlPTUFQRkJfUExBTkVfVklEMSwKLQlPTUFQRkJfUExBTkVfVklEMiwKLX07Ci0KLWVudW0gb21hcGZiX2NoYW5uZWxfb3V0IHsKLQlPTUFQRkJfQ0hBTk5FTF9PVVRfTENEID0gMCwKLQlPTUFQRkJfQ0hBTk5FTF9PVVRfRElHSVQsCi19OwotCi1zdHJ1Y3Qgb21hcGZiX3BsYW5lX2luZm8gewotCV9fdTMyIHBvc194OwotCV9fdTMyIHBvc195OwotCV9fdTggIGVuYWJsZWQ7Ci0JX191OCAgY2hhbm5lbF9vdXQ7Ci0JX191OCAgbWlycm9yOwotCV9fdTggIHJlc2VydmVkMTsKLQlfX3UzMiBvdXRfd2lkdGg7Ci0JX191MzIgb3V0X2hlaWdodDsKLQlfX3UzMiByZXNlcnZlZDJbMTJdOwotfTsKLQotc3RydWN0IG9tYXBmYl9tZW1faW5mbyB7Ci0JX191MzIgc2l6ZTsKLQlfX3U4ICB0eXBlOwotCV9fdTggIHJlc2VydmVkWzNdOwotfTsKLQotc3RydWN0IG9tYXBmYl9jYXBzIHsKLQlfX3UzMiBjdHJsOwotCV9fdTMyIHBsYW5lX2NvbG9yOwotCV9fdTMyIHduZF9jb2xvcjsKLX07Ci0KLWVudW0gb21hcGZiX2NvbG9yX2tleV90eXBlIHsKLQlPTUFQRkJfQ09MT1JfS0VZX0RJU0FCTEVEID0gMCwKLQlPTUFQRkJfQ09MT1JfS0VZX0dGWF9EU1QsCi0JT01BUEZCX0NPTE9SX0tFWV9WSURfU1JDLAotfTsKLQotc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkgewotCV9fdTggIGNoYW5uZWxfb3V0OwotCV9fdTMyIGJhY2tncm91bmQ7Ci0JX191MzIgdHJhbnNfa2V5OwotCV9fdTggIGtleV90eXBlOwotfTsKLQotZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgewotCU9NQVBGQl9VUERBVEVfRElTQUJMRUQgPSAwLAotCU9NQVBGQl9BVVRPX1VQREFURSwKLQlPTUFQRkJfTUFOVUFMX1VQREFURQotfTsKLQotI2lmZGVmIF9fS0VSTkVMX18KLQotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9mYi5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+Ci0KLSNkZWZpbmUgT01BUF9MQ0RDX0lOVl9WU1lOQyAgICAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgT01BUF9MQ0RDX0lOVl9IU1lOQyAgICAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgT01BUF9MQ0RDX0lOVl9QSVhfQ0xPQ0sgICAgICAgICAweDAwMDQKLSNkZWZpbmUgT01BUF9MQ0RDX0lOVl9PVVRQVVRfRU4gICAgICAgICAweDAwMDgKLSNkZWZpbmUgT01BUF9MQ0RDX0hTVlNfUklTSU5HX0VER0UgICAgICAweDAwMTAKLSNkZWZpbmUgT01BUF9MQ0RDX0hTVlNfT1BQT1NJVEUgICAgICAgICAweDAwMjAKLQotI2RlZmluZSBPTUFQX0xDRENfU0lHTkFMX01BU0sJCTB4MDAzZgotCi0jZGVmaW5lIE9NQVBfTENEQ19QQU5FTF9URlQJCTB4MDEwMAotCi0jZGVmaW5lIE9NQVBGQl9QTEFORV9YUkVTX01JTgkJOAotI2RlZmluZSBPTUFQRkJfUExBTkVfWVJFU19NSU4JCTgKLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxCi0jZGVmaW5lIE9NQVBGQl9QTEFORV9OVU0JCTEKLSNlbHNlCi0jZGVmaW5lIE9NQVBGQl9QTEFORV9OVU0JCTMKLSNlbmRpZgotCi1zdHJ1Y3Qgb21hcGZiX2RldmljZTsKLQotc3RydWN0IGxjZF9wYW5lbCB7Ci0JY29uc3QgY2hhcgkqbmFtZTsKLQlpbnQJCWNvbmZpZzsJCS8qIFRGVC9TVE4sIHNpZ25hbCBpbnZlcnNpb24gKi8KLQlpbnQJCWJwcDsJCS8qIFBpeGVsIGZvcm1hdCBpbiBmYiBtZW0gKi8KLQlpbnQJCWRhdGFfbGluZXM7CS8qIExpbmVzIG9uIExDRCBIVyBpbnRlcmZhY2UgKi8KLQotCWludAkJeF9yZXMsIHlfcmVzOwotCWludAkJcGl4ZWxfY2xvY2s7CS8qIEluIGtIeiAqLwotCWludAkJaHN3OwkJLyogSG9yaXpvbnRhbCBzeW5jaHJvbml6YXRpb24KLQkJCQkJICAgcHVsc2Ugd2lkdGggKi8KLQlpbnQJCWhmcDsJCS8qIEhvcml6b250YWwgZnJvbnQgcG9yY2ggKi8KLQlpbnQJCWhicDsJCS8qIEhvcml6b250YWwgYmFjayBwb3JjaCAqLwotCWludAkJdnN3OwkJLyogVmVydGljYWwgc3luY2hyb25pemF0aW9uCi0JCQkJCSAgIHB1bHNlIHdpZHRoICovCi0JaW50CQl2ZnA7CQkvKiBWZXJ0aWNhbCBmcm9udCBwb3JjaCAqLwotCWludAkJdmJwOwkJLyogVmVydGljYWwgYmFjayBwb3JjaCAqLwotCWludAkJYWNiOwkJLyogYWMtYmlhcyBwaW4gZnJlcXVlbmN5ICovCi0JaW50CQlwY2Q7CQkvKiBwaXhlbCBjbG9jayBkaXZpZGVyLgotCQkJCQkgICBPYnNvbGV0ZSB1c2UgcGl4ZWxfY2xvY2sgaW5zdGVhZCAqLwotCi0JaW50CQkoKmluaXQpCQkoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCi0JCQkJCSBzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpOwotCXZvaWQJCSgqY2xlYW51cCkJKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKTsKLQlpbnQJCSgqZW5hYmxlKQkoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpOwotCXZvaWQJCSgqZGlzYWJsZSkJKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKTsKLQl1bnNpZ25lZCBsb25nCSgqZ2V0X2NhcHMpCShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCk7Ci0JaW50CQkoKnNldF9ia2xpZ2h0X2xldmVsKShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwKLQkJCQkJICAgICB1bnNpZ25lZCBpbnQgbGV2ZWwpOwotCXVuc2lnbmVkIGludAkoKmdldF9ia2xpZ2h0X2xldmVsKShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCk7Ci0JdW5zaWduZWQgaW50CSgqZ2V0X2JrbGlnaHRfbWF4KSAgKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKTsKLQlpbnQJCSgqcnVuX3Rlc3QpCShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwgaW50IHRlc3RfbnVtKTsKLX07Ci0KLXN0cnVjdCBleHRpZl90aW1pbmdzIHsKLQlpbnQgY3Nfb25fdGltZTsKLQlpbnQgY3Nfb2ZmX3RpbWU7Ci0JaW50IHdlX29uX3RpbWU7Ci0JaW50IHdlX29mZl90aW1lOwotCWludCByZV9vbl90aW1lOwotCWludCByZV9vZmZfdGltZTsKLQlpbnQgd2VfY3ljbGVfdGltZTsKLQlpbnQgcmVfY3ljbGVfdGltZTsKLQlpbnQgY3NfcHVsc2Vfd2lkdGg7Ci0JaW50IGFjY2Vzc190aW1lOwotCi0JaW50IGNsa19kaXY7Ci0KLQl1MzIgdGltWzVdOwkJLyogc2V0IGJ5IGV4dGlmLT5jb252ZXJ0X3RpbWluZ3MgKi8KLQotCWludCBjb252ZXJ0ZWQ7Ci19OwotCi1zdHJ1Y3QgbGNkX2N0cmxfZXh0aWYgewotCWludCAgKCppbml0KQkJKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldik7Ci0Jdm9pZCAoKmNsZWFudXApCQkodm9pZCk7Ci0Jdm9pZCAoKmdldF9jbGtfaW5mbykJKHUzMiAqY2xrX3BlcmlvZCwgdTMyICptYXhfY2xrX2Rpdik7Ci0JdW5zaWduZWQgbG9uZyAoKmdldF9tYXhfdHhfcmF0ZSkodm9pZCk7Ci0JaW50ICAoKmNvbnZlcnRfdGltaW5ncykJKHN0cnVjdCBleHRpZl90aW1pbmdzICp0aW1pbmdzKTsKLQl2b2lkICgqc2V0X3RpbWluZ3MpCShjb25zdCBzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdGltaW5ncyk7Ci0Jdm9pZCAoKnNldF9iaXRzX3Blcl9jeWNsZSkoaW50IGJwYyk7Ci0Jdm9pZCAoKndyaXRlX2NvbW1hbmQpCShjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pOwotCXZvaWQgKCpyZWFkX2RhdGEpCSh2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pOwotCXZvaWQgKCp3cml0ZV9kYXRhKQkoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKTsKLQl2b2lkICgqdHJhbnNmZXJfYXJlYSkJKGludCB3aWR0aCwgaW50IGhlaWdodCwKLQkJCQkgdm9pZCAoY2FsbGJhY2spKHZvaWQgKiBkYXRhKSwgdm9pZCAqZGF0YSk7Ci0JaW50ICAoKnNldHVwX3RlYXJzeW5jKQkodW5zaWduZWQgcGluX2NudCwKLQkJCQkgdW5zaWduZWQgaHNfcHVsc2VfdGltZSwgdW5zaWduZWQgdnNfcHVsc2VfdGltZSwKLQkJCQkgaW50IGhzX3BvbF9pbnYsIGludCB2c19wb2xfaW52LCBpbnQgZGl2KTsKLQlpbnQgICgqZW5hYmxlX3RlYXJzeW5jKSAoaW50IGVuYWJsZSwgdW5zaWduZWQgbGluZSk7Ci0KLQl1bnNpZ25lZCBsb25nCQltYXhfdHJhbnNtaXRfc2l6ZTsKLX07Ci0KLXN0cnVjdCBvbWFwZmJfbm90aWZpZXJfYmxvY2sgewotCXN0cnVjdCBub3RpZmllcl9ibG9jawluYjsKLQl2b2lkCQkJKmRhdGE7Ci0JaW50CQkJcGxhbmVfaWR4OwotfTsKLQotdHlwZWRlZiBpbnQgKCpvbWFwZmJfbm90aWZpZXJfY2FsbGJhY2tfdCkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICosCi0JCQkJCSAgdW5zaWduZWQgbG9uZyBldmVudCwKLQkJCQkJICB2b2lkICpmYmkpOwotCi1zdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gewotCXUzMgkJcGFkZHI7Ci0Jdm9pZCBfX2lvbWVtCSp2YWRkcjsKLQl1bnNpZ25lZCBsb25nCXNpemU7Ci0JdTgJCXR5cGU7CQkvKiBPTUFQRkJfUExBTkVfTUVNXyogKi8KLQl1bnNpZ25lZAlhbGxvYzoxOwkvKiBhbGxvY2F0ZWQgYnkgdGhlIGRyaXZlciAqLwotCXVuc2lnbmVkCW1hcDoxOwkJLyoga2VybmVsIG1hcHBlZCBieSB0aGUgZHJpdmVyICovCi19OwotCi1zdHJ1Y3Qgb21hcGZiX21lbV9kZXNjIHsKLQlpbnQJCQkJcmVnaW9uX2NudDsKLQlzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24JcmVnaW9uW09NQVBGQl9QTEFORV9OVU1dOwotfTsKLQotc3RydWN0IGxjZF9jdHJsIHsKLQljb25zdCBjaGFyCSpuYW1lOwotCXZvaWQJCSpkYXRhOwotCi0JaW50CQkoKmluaXQpCQkgIChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsCi0JCQkJCSAgIGludCBleHRfbW9kZSwKLQkJCQkJICAgc3RydWN0IG9tYXBmYl9tZW1fZGVzYyAqcmVxX21kKTsKLQl2b2lkCQkoKmNsZWFudXApCSAgKHZvaWQpOwotCXZvaWQJCSgqYmluZF9jbGllbnQpCSAgKHN0cnVjdCBvbWFwZmJfbm90aWZpZXJfYmxvY2sgKm5iKTsKLQl2b2lkCQkoKmdldF9jYXBzKQkgIChpbnQgcGxhbmUsIHN0cnVjdCBvbWFwZmJfY2FwcyAqY2Fwcyk7Ci0JaW50CQkoKnNldF91cGRhdGVfbW9kZSkoZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgbW9kZSk7Ci0JZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgKCpnZXRfdXBkYXRlX21vZGUpKHZvaWQpOwotCWludAkJKCpzZXR1cF9wbGFuZSkJICAoaW50IHBsYW5lLCBpbnQgY2hhbm5lbF9vdXQsCi0JCQkJCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotCQkJCQkgICBpbnQgc2NyZWVuX3dpZHRoLAotCQkJCQkgICBpbnQgcG9zX3gsIGludCBwb3NfeSwgaW50IHdpZHRoLAotCQkJCQkgICBpbnQgaGVpZ2h0LCBpbnQgY29sb3JfbW9kZSk7Ci0JaW50CQkoKnNldF9yb3RhdGUpCSAgKGludCBhbmdsZSk7Ci0JaW50CQkoKnNldHVwX21lbSkJICAoaW50IHBsYW5lLCBzaXplX3Qgc2l6ZSwKLQkJCQkJICAgaW50IG1lbV90eXBlLCB1bnNpZ25lZCBsb25nICpwYWRkcik7Ci0JaW50CQkoKm1tYXApCQkgIChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKLQkJCQkJICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwotCWludAkJKCpzZXRfc2NhbGUpCSAgKGludCBwbGFuZSwKLQkJCQkJICAgaW50IG9yaWdfd2lkdGgsIGludCBvcmlnX2hlaWdodCwKLQkJCQkJICAgaW50IG91dF93aWR0aCwgaW50IG91dF9oZWlnaHQpOwotCWludAkJKCplbmFibGVfcGxhbmUpCSAgKGludCBwbGFuZSwgaW50IGVuYWJsZSk7Ci0JaW50CQkoKnVwZGF0ZV93aW5kb3cpICAoc3RydWN0IGZiX2luZm8gKmZiaSwKLQkJCQkJICAgc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93ICp3aW4sCi0JCQkJCSAgIHZvaWQgKCpjYWxsYmFjaykodm9pZCAqKSwKLQkJCQkJICAgdm9pZCAqY2FsbGJhY2tfZGF0YSk7Ci0Jdm9pZAkJKCpzeW5jKQkJICAodm9pZCk7Ci0Jdm9pZAkJKCpzdXNwZW5kKQkgICh2b2lkKTsKLQl2b2lkCQkoKnJlc3VtZSkJICAodm9pZCk7Ci0JaW50CQkoKnJ1bl90ZXN0KQkgIChpbnQgdGVzdF9udW0pOwotCWludAkJKCpzZXRjb2xyZWcpCSAgKHVfaW50IHJlZ25vLCB1MTYgcmVkLCB1MTYgZ3JlZW4sCi0JCQkJCSAgIHUxNiBibHVlLCB1MTYgdHJhbnNwLAotCQkJCQkgICBpbnQgdXBkYXRlX2h3X21lbSk7Ci0JaW50CQkoKnNldF9jb2xvcl9rZXkpICAoc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkgKmNrKTsKLQlpbnQJCSgqZ2V0X2NvbG9yX2tleSkgIChzdHJ1Y3Qgb21hcGZiX2NvbG9yX2tleSAqY2spOwotfTsKLQotZW51bSBvbWFwZmJfc3RhdGUgewotCU9NQVBGQl9ESVNBQkxFRAk9IDAsCi0JT01BUEZCX1NVU1BFTkRFRD0gOTksCi0JT01BUEZCX0FDVElWRQk9IDEwMAotfTsKLQotc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgewotCWludAkJCQlpZHg7Ci0Jc3RydWN0IG9tYXBmYl9wbGFuZV9pbmZvCWluZm87Ci0JZW51bSBvbWFwZmJfY29sb3JfZm9ybWF0CWNvbG9yX21vZGU7Ci0Jc3RydWN0IG9tYXBmYl9kZXZpY2UJCSpmYmRldjsKLX07Ci0KLXN0cnVjdCBvbWFwZmJfZGV2aWNlIHsKLQlpbnQJCQlzdGF0ZTsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBleHRfbGNkYzsgICAgICAgICAgICAgICAvKiBVc2luZyBleHRlcm5hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ0QgY29udHJvbGxlciAqLwotCXN0cnVjdCBtdXRleAkJcnF1ZXVlX211dGV4OwotCi0JaW50CQkJcGFsZXR0ZV9zaXplOwotCXUzMgkJCXBzZXVkb19wYWxldHRlWzE3XTsKLQotCXN0cnVjdCBsY2RfcGFuZWwJKnBhbmVsOwkJCS8qIExDRCBwYW5lbCAqLwotCWNvbnN0IHN0cnVjdCBsY2RfY3RybAkqY3RybDsJCQkvKiBMQ0QgY29udHJvbGxlciAqLwotCWNvbnN0IHN0cnVjdCBsY2RfY3RybAkqaW50X2N0cmw7CQkvKiBpbnRlcm5hbCBMQ0QgY3RybCAqLwotCXN0cnVjdCBsY2RfY3RybF9leHRpZgkqZXh0X2lmOwkJLyogTENEIGN0cmwgZXh0ZXJuYWwKLQkJCQkJCQkgICBpbnRlcmZhY2UgKi8KLQlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwotCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbwluZXdfdmFyOwkvKiBmb3IgbW9kZSBjaGFuZ2VzICovCi0KLQlzdHJ1Y3Qgb21hcGZiX21lbV9kZXNjCQltZW1fZGVzYzsKLQlzdHJ1Y3QgZmJfaW5mbwkJCSpmYl9pbmZvW09NQVBGQl9QTEFORV9OVU1dOwotfTsKLQotc3RydWN0IG9tYXBmYl9wbGF0Zm9ybV9kYXRhIHsKLQlzdHJ1Y3Qgb21hcF9sY2RfY29uZmlnCQlsY2Q7Ci0Jc3RydWN0IG9tYXBmYl9tZW1fZGVzYwkJbWVtX2Rlc2M7Ci0Jdm9pZAkJCQkqY3RybF9wbGF0Zm9ybV9kYXRhOwotfTsKLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxCi1leHRlcm4gc3RydWN0IGxjZF9jdHJsIG9tYXAxX2xjZF9jdHJsOwotI2Vsc2UKLWV4dGVybiBzdHJ1Y3QgbGNkX2N0cmwgb21hcDJfZGlzcF9jdHJsOwotI2VuZGlmCi0KLWV4dGVybiB2b2lkIG9tYXBmYl9yZXNlcnZlX3NkcmFtKHZvaWQpOwotZXh0ZXJuIHZvaWQgb21hcGZiX3JlZ2lzdGVyX3BhbmVsKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKTsKLWV4dGVybiB2b2lkIG9tYXBmYl93cml0ZV9maXJzdF9waXhlbChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsIHUxNiBwaXh2YWwpOwotZXh0ZXJuIHZvaWQgb21hcGZiX25vdGlmeV9jbGllbnRzKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgZXZlbnQpOwotZXh0ZXJuIGludCAgb21hcGZiX3JlZ2lzdGVyX2NsaWVudChzdHJ1Y3Qgb21hcGZiX25vdGlmaWVyX2Jsb2NrICpuYiwKLQkJCQkgICBvbWFwZmJfbm90aWZpZXJfY2FsbGJhY2tfdCBjYWxsYmFjaywKLQkJCQkgICB2b2lkICpjYWxsYmFja19kYXRhKTsKLWV4dGVybiBpbnQgIG9tYXBmYl91bnJlZ2lzdGVyX2NsaWVudChzdHJ1Y3Qgb21hcGZiX25vdGlmaWVyX2Jsb2NrICpuYik7Ci1leHRlcm4gaW50ICBvbWFwZmJfdXBkYXRlX3dpbmRvd19hc3luYyhzdHJ1Y3QgZmJfaW5mbyAqZmJpLAotCQkJCSAgICAgICBzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgKndpbiwKLQkJCQkgICAgICAgdm9pZCAoKmNhbGxiYWNrKSh2b2lkICopLAotCQkJCSAgICAgICB2b2lkICpjYWxsYmFja19kYXRhKTsKLQotLyogaW4gYXJjaC9hcm0vcGxhdC1vbWFwL2ZiLmMgKi8KLWV4dGVybiB2b2lkIG9tYXBmYl9zZXRfY3RybF9wbGF0Zm9ybV9kYXRhKHZvaWQgKnBkYXRhKTsKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2VuZGlmIC8qIF9fT01BUEZCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvc2RyYy5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9zZHJjLmgKaW5kZXggZjcwNDAzMC4uN2I3NmY1MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9zZHJjLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9zZHJjLmgKQEAgLTk0LDcgKzk0LDEwIEBACiAKIC8qIFNNUyByZWdpc3RlciBvZmZzZXRzIC0gcmVhZC93cml0ZSB3aXRoIHNtc197cmVhZCx3cml0ZX1fcmVnKCkgKi8KIAotI2RlZmluZSBTTVNfU1lTQ09ORklHCQkweDAxMAorI2RlZmluZSBTTVNfU1lTQ09ORklHCQkJMHgwMTAKKyNkZWZpbmUgU01TX1JPVF9DT05UUk9MKGNvbnRleHQpCSgweDE4MCArIDB4MTAgKiBjb250ZXh0KQorI2RlZmluZSBTTVNfUk9UX1NJWkUoY29udGV4dCkJCSgweDE4NCArIDB4MTAgKiBjb250ZXh0KQorI2RlZmluZSBTTVNfUk9UX1BIWVNJQ0FMX0JBKGNvbnRleHQpCSgweDE4OCArIDB4MTAgKiBjb250ZXh0KQogLyogUkVWSVNJVDogZmlsbCBpbiBvdGhlciBTTVMgcmVnaXN0ZXJzIGhlcmUgKi8KIAogCkBAIC0xMjksNiArMTMyLDEwIEBACiB2b2lkIG9tYXAyX3Ntc19zYXZlX2NvbnRleHQodm9pZCk7CiB2b2lkIG9tYXAyX3Ntc19yZXN0b3JlX2NvbnRleHQodm9pZCk7CiAKK3ZvaWQgb21hcDJfc21zX3dyaXRlX3JvdF9jb250cm9sKHUzMiB2YWwsIHVuc2lnbmVkIGN0eCk7Cit2b2lkIG9tYXAyX3Ntc193cml0ZV9yb3Rfc2l6ZSh1MzIgdmFsLCB1bnNpZ25lZCBjdHgpOwordm9pZCBvbWFwMl9zbXNfd3JpdGVfcm90X3BoeXNpY2FsX2JhKHUzMiB2YWwsIHVuc2lnbmVkIGN0eCk7CisKICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMgogCiBzdHJ1Y3QgbWVtb3J5X3RpbWluZ3MgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC92cmFtLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L3ZyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGQ0OTg3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC92cmFtLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIFZSQU0gbWFuYWdlciBmb3IgT01BUAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBUb21pIFZhbGtlaW5lbiA8dG9taS52YWxrZWluZW5Abm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19PTUFQX1ZSQU1fSF9fCisjZGVmaW5lIF9fT01BUF9WUkFNX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBPTUFQX1ZSQU1fTUVNVFlQRV9TRFJBTQkJMAorI2RlZmluZSBPTUFQX1ZSQU1fTUVNVFlQRV9TUkFNCQkxCisjZGVmaW5lIE9NQVBfVlJBTV9NRU1UWVBFX01BWAkJMQorCitleHRlcm4gaW50IG9tYXBfdnJhbV9hZGRfcmVnaW9uKHVuc2lnbmVkIGxvbmcgcGFkZHIsIHNpemVfdCBzaXplKTsKK2V4dGVybiBpbnQgb21hcF92cmFtX2ZyZWUodW5zaWduZWQgbG9uZyBwYWRkciwgc2l6ZV90IHNpemUpOworZXh0ZXJuIGludCBvbWFwX3ZyYW1fYWxsb2MoaW50IG10eXBlLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgbG9uZyAqcGFkZHIpOworZXh0ZXJuIGludCBvbWFwX3ZyYW1fcmVzZXJ2ZSh1bnNpZ25lZCBsb25nIHBhZGRyLCBzaXplX3Qgc2l6ZSk7CitleHRlcm4gdm9pZCBvbWFwX3ZyYW1fZ2V0X2luZm8odW5zaWduZWQgbG9uZyAqdnJhbSwgdW5zaWduZWQgbG9uZyAqZnJlZV92cmFtLAorCQl1bnNpZ25lZCBsb25nICpsYXJnZXN0X2ZyZWVfYmxvY2spOworCisjaWZkZWYgQ09ORklHX09NQVAyX1ZSQU0KK2V4dGVybiB2b2lkIG9tYXBfdnJhbV9zZXRfc2RyYW1fdnJhbSh1MzIgc2l6ZSwgdTMyIHN0YXJ0KTsKK2V4dGVybiB2b2lkIG9tYXBfdnJhbV9zZXRfc3JhbV92cmFtKHUzMiBzaXplLCB1MzIgc3RhcnQpOworCitleHRlcm4gdm9pZCBvbWFwX3ZyYW1fcmVzZXJ2ZV9zZHJhbSh2b2lkKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIG9tYXBfdnJhbV9yZXNlcnZlX3NyYW0odW5zaWduZWQgbG9uZyBzcmFtX3BzdGFydCwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgc3JhbV92c3RhcnQsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIHNyYW1fc2l6ZSwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgcHN0YXJ0X2F2YWlsLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBzaXplX2F2YWlsKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF92cmFtX3NldF9zZHJhbV92cmFtKHUzMiBzaXplLCB1MzIgc3RhcnQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIG9tYXBfdnJhbV9zZXRfc3JhbV92cmFtKHUzMiBzaXplLCB1MzIgc3RhcnQpIHsgfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF92cmFtX3Jlc2VydmVfc2RyYW0odm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgb21hcF92cmFtX3Jlc2VydmVfc3JhbSh1bnNpZ25lZCBsb25nIHNyYW1fcHN0YXJ0LAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBzcmFtX3ZzdGFydCwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgc3JhbV9zaXplLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBwc3RhcnRfYXZhaWwsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemVfYXZhaWwpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L3ZyZmIuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvdnJmYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YTAzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L3ZyZmIuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogVlJGQiBSb3RhdGlvbiBFbmdpbmUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogVG9taSBWYWxrZWluZW4gPHRvbWkudmFsa2VpbmVuQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fT01BUF9WUkZCX0hfXworI2RlZmluZSBfX09NQVBfVlJGQl9IX18KKworI2RlZmluZSBPTUFQX1ZSRkJfTElORV9MRU4gMjA0OAorCitzdHJ1Y3QgdnJmYiB7CisJdTggY29udGV4dDsKKwl2b2lkIF9faW9tZW0gKnZhZGRyWzRdOworCXVuc2lnbmVkIGxvbmcgcGFkZHJbNF07CisJdTE2IHhyZXM7CisJdTE2IHlyZXM7CisJdTE2IHhvZmZzZXQ7CisJdTE2IHlvZmZzZXQ7CisJdTggYnl0ZXNwcDsKKwlib29sIHl1dl9tb2RlOworfTsKKworZXh0ZXJuIGludCBvbWFwX3ZyZmJfcmVxdWVzdF9jdHgoc3RydWN0IHZyZmIgKnZyZmIpOworZXh0ZXJuIHZvaWQgb21hcF92cmZiX3JlbGVhc2VfY3R4KHN0cnVjdCB2cmZiICp2cmZiKTsKK2V4dGVybiB2b2lkIG9tYXBfdnJmYl9hZGp1c3Rfc2l6ZSh1MTYgKndpZHRoLCB1MTYgKmhlaWdodCwKKwkJdTggYnl0ZXNwcCk7CitleHRlcm4gdTMyIG9tYXBfdnJmYl9taW5fcGh5c19zaXplKHUxNiB3aWR0aCwgdTE2IGhlaWdodCwgdTggYnl0ZXNwcCk7CitleHRlcm4gdTE2IG9tYXBfdnJmYl9tYXhfaGVpZ2h0KHUzMiBwaHlzX3NpemUsIHUxNiB3aWR0aCwgdTggYnl0ZXNwcCk7CitleHRlcm4gdm9pZCBvbWFwX3ZyZmJfc2V0dXAoc3RydWN0IHZyZmIgKnZyZmIsIHVuc2lnbmVkIGxvbmcgcGFkZHIsCisJCXUxNiB3aWR0aCwgdTE2IGhlaWdodCwKKwkJdW5zaWduZWQgYnl0ZXNwcCwgYm9vbCB5dXZfbW9kZSk7CitleHRlcm4gaW50IG9tYXBfdnJmYl9tYXBfYW5nbGUoc3RydWN0IHZyZmIgKnZyZmIsIHUxNiBoZWlnaHQsIHU4IHJvdCk7CitleHRlcm4gdm9pZCBvbWFwX3ZyZmJfcmVzdG9yZV9jb250ZXh0KHZvaWQpOworCisjZW5kaWYgLyogX19WUkZCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5jCmluZGV4IDNlOTIzNjYuLmFkMmJmMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3NyYW0uYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPHBsYXQvc3JhbS5oPgogI2luY2x1ZGUgPHBsYXQvYm9hcmQuaD4KICNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvdnJhbS5oPgogCiAjaW5jbHVkZSA8cGxhdC9jb250cm9sLmg+CiAKQEAgLTE4NSw2ICsxODYsMTMgQEAKIAkJCQkgICAgICAgb21hcF9zcmFtX3N0YXJ0ICsgU1JBTV9CT09UTE9BREVSX1NaLAogCQkJCSAgICAgICBvbWFwX3NyYW1fc2l6ZSAtIFNSQU1fQk9PVExPQURFUl9TWik7CiAJb21hcF9zcmFtX3NpemUgLT0gcmVzZXJ2ZWQ7CisKKwlyZXNlcnZlZCA9IG9tYXBfdnJhbV9yZXNlcnZlX3NyYW0ob21hcF9zcmFtX3N0YXJ0LCBvbWFwX3NyYW1fYmFzZSwKKwkJCW9tYXBfc3JhbV9zaXplLAorCQkJb21hcF9zcmFtX3N0YXJ0ICsgU1JBTV9CT09UTE9BREVSX1NaLAorCQkJb21hcF9zcmFtX3NpemUgLSBTUkFNX0JPT1RMT0FERVJfU1opOworCW9tYXBfc3JhbV9zaXplIC09IHJlc2VydmVkOworCiAJb21hcF9zcmFtX2NlaWwgPSBvbWFwX3NyYW1fYmFzZSArIG9tYXBfc3JhbV9zaXplOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3N5c2NhbGxzLmggYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3N5c2NhbGxzLmgKaW5kZXggNDgzZDY2Ni4uNjZhMTk3MiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9zeXNjYWxscy5oCisrKyBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vc3lzY2FsbHMuaApAQCAtMjksMTAgKzI5LDYgQEAKIAkJCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqKTsKIGFzbWxpbmthZ2UgaW50IHN5c19ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKik7CiAKLS8qIGtlcm5lbC9zeXNfYXZyMzIuYyAqLwotYXNtbGlua2FnZSBsb25nIHN5c19tbWFwMih1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAotCQkJICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBvZmZfdCk7Ci0KIC8qIG1tL2NhY2hlLmMgKi8KIGFzbWxpbmthZ2UgaW50IHN5c19jYWNoZWZsdXNoKGludCwgdm9pZCBfX3VzZXIgKiwgc2l6ZV90KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvc3lzX2F2cjMyLmMgYi9hcmNoL2F2cjMyL2tlcm5lbC9zeXNfYXZyMzIuYwppbmRleCA1ZDJkYWVhLi40NTkzNDliIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC9zeXNfYXZyMzIuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9zeXNfYXZyMzIuYwpAQCAtNSwzOSArNSw4IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAKLSNpbmNsdWRlIDxhc20vbW1hbi5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+Ci0KLWFzbWxpbmthZ2UgbG9uZyBzeXNfbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJCSAgdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAotCQkJICB1bnNpZ25lZCBsb25nIGZkLCBvZmZfdCBvZmZzZXQpCi17Ci0JaW50IGVycm9yID0gLUVCQURGOwotCXN0cnVjdCBmaWxlICpmaWxlID0gTlVMTDsKLQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJcmV0dXJuIGVycm9yOwotCX0KLQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JZXJyb3IgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIG9mZnNldCk7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0KLQlpZiAoZmlsZSkKLQkJZnB1dChmaWxlKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KIGludCBrZXJuZWxfZXhlY3ZlKGNvbnN0IGNoYXIgKmZpbGUsIGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCkKIHsKIAlyZWdpc3RlciBsb25nIHNjbm8gYXNtKCJyOCIpID0gX19OUl9leGVjdmU7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9zeXNjYWxsLXN0dWJzLlMgYi9hcmNoL2F2cjMyL2tlcm5lbC9zeXNjYWxsLXN0dWJzLlMKaW5kZXggZjcyNDRjZC4uMDQ0N2EzZSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvc3lzY2FsbC1zdHVicy5TCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3N5c2NhbGwtc3R1YnMuUwpAQCAtNjEsNyArNjEsNyBAQAogX19zeXNfbW1hcDI6CiAJcHVzaG0JbHIKIAlzdC53CS0tc3AsIEFSRzYKLQljYWxsCXN5c19tbWFwMgorCWNhbGwJc3lzX21tYXBfcGdvZmYKIAlzdWIJc3AsIC00CiAJcG9wbQlwYwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2ZjbnRsLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2ZjbnRsLmgKaW5kZXggODcyN2IyYi4uMjUxYzkxMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9mY250bC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZmNudGwuaApAQCAtNyw4ICs3LDYgQEAKICNpZm5kZWYgX0JGSU5fRkNOVExfSAogI2RlZmluZSBfQkZJTl9GQ05UTF9ICiAKLS8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKLSAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwogI2RlZmluZSBPX0RJUkVDVE9SWQkgMDQwMDAwCS8qIG11c3QgYmUgYSBkaXJlY3RvcnkgKi8KICNkZWZpbmUgT19OT0ZPTExPVwkwMTAwMDAwCS8qIGRvbid0IGZvbGxvdyBsaW5rcyAqLwogI2RlZmluZSBPX0RJUkVDVAkwMjAwMDAwCS8qIGRpcmVjdCBkaXNrIGFjY2VzcyBoaW50IC0gY3VycmVudGx5IGlnbm9yZWQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3N5c19iZmluLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9zeXNfYmZpbi5jCmluZGV4IGFmY2VmMTIuLjJlN2Y4ZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3N5c19iZmluLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc3lzX2JmaW4uYwpAQCAtMjIsMzkgKzIyLDYgQEAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KIAotLyogY29tbW9uIGNvZGUgZm9yIG9sZCBhbmQgbmV3IG1tYXBzICovCi1zdGF0aWMgaW5saW5lIGxvbmcKLWRvX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCi0JIHVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKLQkgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLQlpbnQgZXJyb3IgPSAtRUJBREY7Ci0Jc3RydWN0IGZpbGUgKmZpbGUgPSBOVUxMOwotCi0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCWlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLQkJZmlsZSA9IGZnZXQoZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCWVycm9yID0gZG9fbW1hcF9wZ29mZihmaWxlLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBwZ29mZik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0KLQlpZiAoZmlsZSkKLQkJZnB1dChmaWxlKTsKLSBvdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCi1hc21saW5rYWdlIGxvbmcgc3lzX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCi0JCQkgIHVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKLQkJCSAgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLQlyZXR1cm4gZG9fbW1hcDIoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIHBnb2ZmKTsKLX0KLQogYXNtbGlua2FnZSB2b2lkICpzeXNfc3JhbV9hbGxvYyhzaXplX3Qgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlyZXR1cm4gc3JhbV9hbGxvY193aXRoX2xzbChzaXplLCBmbGFncyk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2VudHJ5LlMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2VudHJ5LlMKaW5kZXggYTUwNjM3YS4uZjNmOGJiNCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9lbnRyeS5TCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZW50cnkuUwpAQCAtMTQyMiw3ICsxNDIyLDcgQEAKIAkubG9uZyBfc3lzX25pX3N5c2NhbGwJLyogc3RyZWFtczIgKi8KIAkubG9uZyBfc3lzX3Zmb3JrCQkvKiAxOTAgKi8KIAkubG9uZyBfc3lzX2dldHJsaW1pdAotCS5sb25nIF9zeXNfbW1hcDIKKwkubG9uZyBfc3lzX21tYXBfcGdvZmYKIAkubG9uZyBfc3lzX3RydW5jYXRlNjQKIAkubG9uZyBfc3lzX2Z0cnVuY2F0ZTY0CiAJLmxvbmcgX3N5c19zdGF0NjQJLyogMTk1ICovCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMva2VybmVsL3N5c19jcmlzLmMgYi9hcmNoL2NyaXMva2VybmVsL3N5c19jcmlzLmMKaW5kZXggMmFkOTYyYy4uYzJiYmIxYSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2tlcm5lbC9zeXNfY3Jpcy5jCisrKyBiL2FyY2gvY3Jpcy9rZXJuZWwvc3lzX2NyaXMuYwpAQCAtMjYsMzEgKzI2LDYgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAKLS8qIGNvbW1vbiBjb2RlIGZvciBvbGQgYW5kIG5ldyBtbWFwcyAqLwotc3RhdGljIGlubGluZSBsb25nCi1kb19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHByb3QsCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCi17Ci0gICAgICAgIGludCBlcnJvciA9IC1FQkFERjsKLSAgICAgICAgc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKLQotICAgICAgICBmbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7Ci0gICAgICAgIGlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLSAgICAgICAgICAgICAgICBmaWxlID0gZmdldChmZCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFmaWxlKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotICAgICAgICBlcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotICAgICAgICB1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQotICAgICAgICBpZiAoZmlsZSkKLSAgICAgICAgICAgICAgICBmcHV0KGZpbGUpOwotb3V0OgotICAgICAgICByZXR1cm4gZXJyb3I7Ci19Ci0KIGFzbWxpbmthZ2UgdW5zaWduZWQgbG9uZyBvbGRfbW1hcCh1bnNpZ25lZCBsb25nIF9fdXNlciAqYXJncykKIHsgICAgICAgIAogCXVuc2lnbmVkIGxvbmcgYnVmZmVyWzZdOwpAQCAtNjMsNyArMzgsNyBAQAogCWlmIChidWZmZXJbNV0gJiB+UEFHRV9NQVNLKSAvKiB2ZXJpZnkgdGhhdCBvZmZzZXQgaXMgb24gcGFnZSBib3VuZGFyeSAqLwogCQlnb3RvIG91dDsKIAotCWVyciA9IGRvX21tYXAyKGJ1ZmZlclswXSwgYnVmZmVyWzFdLCBidWZmZXJbMl0sIGJ1ZmZlclszXSwKKwllcnIgPSBzeXNfbW1hcF9wZ29mZihidWZmZXJbMF0sIGJ1ZmZlclsxXSwgYnVmZmVyWzJdLCBidWZmZXJbM10sCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcls0XSwgYnVmZmVyWzVdID4+IFBBR0VfU0hJRlQpOwogb3V0OgogCXJldHVybiBlcnI7CkBAIC03Myw3ICs0OCw4IEBACiBzeXNfbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwcm90LAogICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCiB7Ci0gICAgICAgIHJldHVybiBkb19tbWFwMihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgcGdvZmYpOworCS8qIGJ1Zyg/KTogOEtiIHBhZ2VzIGhlcmUgKi8KKyAgICAgICAgcmV0dXJuIHN5c19tbWFwX3Bnb2ZmKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBwZ29mZik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvc3lzX2Zydi5jIGIvYXJjaC9mcnYva2VybmVsL3N5c19mcnYuYwppbmRleCAyYjZiNTI4Li4xZDNkNGM5IDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvc3lzX2Zydi5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9zeXNfZnJ2LmMKQEAgLTMxLDkgKzMxLDYgQEAKIAkJCSAgdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAogCQkJICB1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQogewotCWludCBlcnJvciA9IC1FQkFERjsKLQlzdHJ1Y3QgZmlsZSAqIGZpbGUgPSBOVUxMOwotCiAJLyogQXMgd2l0aCBzcGFyYzMyLCBtYWtlIHN1cmUgdGhlIHNoaWZ0IGZvciBtbWFwMiBpcyBjb25zdGFudAogCSAgICgxMiksIG5vIG1hdHRlciB3aGF0IFBBR0VfU0laRSB3ZSBoYXZlLi4uLiAqLwogCkBAIC00MSw3MCArMzgsMTEgQEAKIAkgICB0cnlpbmcgdG8gbWFwIHNvbWV0aGluZyB3ZSBjYW4ndCAqLwogCWlmIChwZ29mZiAmICgoMSA8PCAoUEFHRV9TSElGVCAtIDEyKSkgLSAxKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JcGdvZmYgPj49IFBBR0VfU0hJRlQgLSAxMjsKIAotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCi0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOworCXJldHVybiBzeXNfbW1hcF9wZ29mZihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwKKwkJCSAgICAgIHBnb2ZmID4+IChQQUdFX1NISUZUIC0gMTIpKTsKIH0KIAotI2lmIDAgLyogREFWSURNIC0gZG8gd2Ugd2FudCB0aGlzICovCi1zdHJ1Y3QgbW1hcF9hcmdfc3RydWN0NjQgewotCV9fdTMyIGFkZHI7Ci0JX191MzIgbGVuOwotCV9fdTMyIHByb3Q7Ci0JX191MzIgZmxhZ3M7Ci0JX191NjQgb2Zmc2V0OyAvKiA2NCBiaXRzICovCi0JX191MzIgZmQ7Ci19OwotCi1hc21saW5rYWdlIGxvbmcgc3lzX21tYXA2NChzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0NjQgKmFyZykKLXsKLQlpbnQgZXJyb3IgPSAtRUZBVUxUOwotCXN0cnVjdCBmaWxlICogZmlsZSA9IE5VTEw7Ci0Jc3RydWN0IG1tYXBfYXJnX3N0cnVjdDY0IGE7Ci0JdW5zaWduZWQgbG9uZyBwZ29mZjsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmYSwgYXJnLCBzaXplb2YoYSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmICgobG9uZylhLm9mZnNldCAmIH5QQUdFX01BU0spCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcGdvZmYgPSBhLm9mZnNldCA+PiBQQUdFX1NISUZUOwotCWlmICgoYS5vZmZzZXQgPj4gUEFHRV9TSElGVCkgIT0gcGdvZmYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCEoYS5mbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWVycm9yID0gLUVCQURGOwotCQlmaWxlID0gZmdldChhLmZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCWEuZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLCBwZ29mZik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotI2VuZGlmCi0KIC8qCiAgKiBzeXNfaXBjKCkgaXMgdGhlIGRlLW11bHRpcGxleGVyIGZvciB0aGUgU3lzViBJUEMgY2FsbHMuLgogICoKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL3N5c19oODMwMC5jIGIvYXJjaC9oODMwMC9rZXJuZWwvc3lzX2g4MzAwLmMKaW5kZXggOGNiNWQ3My4uYjU5NjlkYiAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9rZXJuZWwvc3lzX2g4MzAwLmMKKysrIGIvYXJjaC9oODMwMC9rZXJuZWwvc3lzX2g4MzAwLmMKQEAgLTI2LDM5ICsyNiw2IEBACiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogCi0vKiBjb21tb24gY29kZSBmb3Igb2xkIGFuZCBuZXcgbW1hcHMgKi8KLXN0YXRpYyBpbmxpbmUgbG9uZyBkb19tbWFwMigKLQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAotCXVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKLQl1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCWludCBlcnJvciA9IC1FQkFERjsKLQlzdHJ1Y3QgZmlsZSAqIGZpbGUgPSBOVUxMOwotCi0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCWlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLQkJZmlsZSA9IGZnZXQoZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCWVycm9yID0gZG9fbW1hcF9wZ29mZihmaWxlLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBwZ29mZik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0KLQlpZiAoZmlsZSkKLQkJZnB1dChmaWxlKTsKLW91dDoKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLWFzbWxpbmthZ2UgbG9uZyBzeXNfbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLQlyZXR1cm4gZG9fbW1hcDIoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIHBnb2ZmKTsKLX0KLQogLyoKICAqIFBlcmZvcm0gdGhlIHNlbGVjdChuZCwgaW4sIG91dCwgZXgsIHR2KSBhbmQgbW1hcCgpIHN5c3RlbQogICogY2FsbHMuIExpbnV4L202OGsgY2xvbmVkIExpbnV4L2kzODYsIHdoaWNoIGRpZG4ndCB1c2UgdG8gYmUgYWJsZSB0bwpAQCAtODcsNTggKzU0LDEyIEBACiAJaWYgKGEub2Zmc2V0ICYgflBBR0VfTUFTSykKIAkJZ290byBvdXQ7CiAKLQlhLmZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQotCWVycm9yID0gZG9fbW1hcDIoYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLCBhLmZkLCBhLm9mZnNldCA+PiBQQUdFX1NISUZUKTsKKwllcnJvciA9IHN5c19tbWFwX3Bnb2ZmKGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywgYS5mZCwKKwkJCSAgICAgICBhLm9mZnNldCA+PiBQQUdFX1NISUZUKTsKIG91dDoKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLSNpZiAwIC8qIERBVklETSAtIGRvIHdlIHdhbnQgdGhpcyAqLwotc3RydWN0IG1tYXBfYXJnX3N0cnVjdDY0IHsKLQlfX3UzMiBhZGRyOwotCV9fdTMyIGxlbjsKLQlfX3UzMiBwcm90OwotCV9fdTMyIGZsYWdzOwotCV9fdTY0IG9mZnNldDsgLyogNjQgYml0cyAqLwotCV9fdTMyIGZkOwotfTsKLQotYXNtbGlua2FnZSBsb25nIHN5c19tbWFwNjQoc3RydWN0IG1tYXBfYXJnX3N0cnVjdDY0ICphcmcpCi17Ci0JaW50IGVycm9yID0gLUVGQVVMVDsKLQlzdHJ1Y3QgZmlsZSAqIGZpbGUgPSBOVUxMOwotCXN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3Q2NCBhOwotCXVuc2lnbmVkIGxvbmcgcGdvZmY7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmEsIGFyZywgc2l6ZW9mKGEpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoKGxvbmcpYS5vZmZzZXQgJiB+UEFHRV9NQVNLKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBnb2ZmID0gYS5vZmZzZXQgPj4gUEFHRV9TSElGVDsKLQlpZiAoKGEub2Zmc2V0ID4+IFBBR0VfU0hJRlQpICE9IHBnb2ZmKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghKGEuZmxhZ3MgJiBNQVBfQU5PTllNT1VTKSkgewotCQllcnJvciA9IC1FQkFERjsKLQkJZmlsZSA9IGZnZXQoYS5mZCk7Ci0JCWlmICghZmlsZSkKLQkJCWdvdG8gb3V0OwotCX0KLQlhLmZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JZXJyb3IgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOwotb3V0OgotCXJldHVybiBlcnJvcjsKLX0KLSNlbmRpZgotCiBzdHJ1Y3Qgc2VsX2FyZ19zdHJ1Y3QgewogCXVuc2lnbmVkIGxvbmcgbjsKIAlmZF9zZXQgKmlucCwgKm91dHAsICpleHA7CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2tlcm5lbC9zeXNjYWxscy5TIGIvYXJjaC9oODMwMC9rZXJuZWwvc3lzY2FsbHMuUwppbmRleCA0ZWI2N2ZhLi4yZDY5ODgxIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2tlcm5lbC9zeXNjYWxscy5TCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL3N5c2NhbGxzLlMKQEAgLTIwNiw3ICsyMDYsNyBAQAogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19uaV9zeXNjYWxsKQkvKiBzdHJlYW1zMiAqLwogCS5sb25nIFNZTUJPTF9OQU1FKHN5c192Zm9yaykgICAgICAgICAgICAvKiAxOTAgKi8KIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfZ2V0cmxpbWl0KQotCS5sb25nIFNZTUJPTF9OQU1FKHN5c19tbWFwMikKKwkubG9uZyBTWU1CT0xfTkFNRShzeXNfbW1hcF9wZ29mZikKIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfdHJ1bmNhdGU2NCkKIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfZnRydW5jYXRlNjQpCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX3N0YXQ2NCkJCS8qIDE5NSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2lhMzIvc3lzX2lhMzIuYyBiL2FyY2gvaWE2NC9pYTMyL3N5c19pYTMyLmMKaW5kZXggNDI5ZWM5Ni4uMDQ1Yjc0NiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2lhMzIvc3lzX2lhMzIuYworKysgYi9hcmNoL2lhNjQvaWEzMi9zeXNfaWEzMi5jCkBAIC04NTgsNiArODU4LDkgQEAKIAogCXByb3QgPSBnZXRfcHJvdDMyKHByb3QpOwogCisJaWYgKGZsYWdzICYgTUFQX0hVR0VUTEIpCisJCXJldHVybiAtRU5PTUVNOworCiAjaWYgUEFHRV9TSElGVCA+IElBMzJfUEFHRV9TSElGVAogCW11dGV4X2xvY2soJmlhMzJfbW1hcF9tdXRleCk7CiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3hlbi9oeXBlcnZpc29yLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20veGVuL2h5cGVydmlzb3IuaAppbmRleCA4OGFmYjU0Li42NzQ1NWMyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20veGVuL2h5cGVydmlzb3IuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20veGVuL2h5cGVydmlzb3IuaApAQCAtMzcsMzUgKzM3LDkgQEAKICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3hlbi5oPgogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvdmVyc2lvbi5oPgkvKiB0byBjb21waWxlIGZlYXR1cmUuYyAqLwogI2luY2x1ZGUgPHhlbi9mZWF0dXJlcy5oPgkJLyogdG8gY29taXBsZSB4ZW4tbmV0ZnJvbnQuYyAqLworI2luY2x1ZGUgPHhlbi94ZW4uaD4KICNpbmNsdWRlIDxhc20veGVuL2h5cGVyY2FsbC5oPgogCi0vKiB4ZW5fZG9tYWluX3R5cGUgaXMgc2V0IGJlZm9yZSBleGVjdXRpbmcgYW55IEMgY29kZSBieSBlYXJseV94ZW5fc2V0dXAgKi8KLWVudW0geGVuX2RvbWFpbl90eXBlIHsKLQlYRU5fTkFUSVZFLAkvKiBydW5uaW5nIG9uIGJhcmUgaGFyZHdhcmUgKi8KLQlYRU5fUFZfRE9NQUlOLAkvKiBydW5uaW5nIGluIGEgUFYgZG9tYWluICovCi0JWEVOX0hWTV9ET01BSU4sCS8qIHJ1bm5pbmcgaW4gYSBYZW4gaHZtIGRvbWFpbiovCi19OwotCi0jaWZkZWYgQ09ORklHX1hFTgotZXh0ZXJuIGVudW0geGVuX2RvbWFpbl90eXBlIHhlbl9kb21haW5fdHlwZTsKLSNlbHNlCi0jZGVmaW5lIHhlbl9kb21haW5fdHlwZQkJWEVOX05BVElWRQotI2VuZGlmCi0KLSNkZWZpbmUgeGVuX2RvbWFpbigpCQkoeGVuX2RvbWFpbl90eXBlICE9IFhFTl9OQVRJVkUpCi0jZGVmaW5lIHhlbl9wdl9kb21haW4oKQkJKHhlbl9kb21haW4oKSAmJgkJCVwKLQkJCQkgeGVuX2RvbWFpbl90eXBlID09IFhFTl9QVl9ET01BSU4pCi0jZGVmaW5lIHhlbl9odm1fZG9tYWluKCkJKHhlbl9kb21haW4oKSAmJgkJCVwKLQkJCQkgeGVuX2RvbWFpbl90eXBlID09IFhFTl9IVk1fRE9NQUlOKQotCi0jaWZkZWYgQ09ORklHX1hFTl9ET00wCi0jZGVmaW5lIHhlbl9pbml0aWFsX2RvbWFpbigpCSh4ZW5fcHZfZG9tYWluKCkgJiYJCQlcCi0JCQkJICh4ZW5fc3RhcnRfaW5mby0+ZmxhZ3MgJiBTSUZfSU5JVERPTUFJTikpCi0jZWxzZQotI2RlZmluZSB4ZW5faW5pdGlhbF9kb21haW4oKQkoMCkKLSNlbmRpZgotCi0KICNpZmRlZiBDT05GSUdfWEVOCiBleHRlcm4gc3RydWN0IHNoYXJlZF9pbmZvICpIWVBFUlZJU09SX3NoYXJlZF9pbmZvOwogZXh0ZXJuIHN0cnVjdCBzdGFydF9pbmZvICp4ZW5fc3RhcnRfaW5mbzsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvc3lzX2lhNjQuYyBiL2FyY2gvaWE2NC9rZXJuZWwvc3lzX2lhNjQuYwppbmRleCA5MmVkODNmLi42MDlkNTAwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3N5c19pYTY0LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9zeXNfaWE2NC5jCkBAIC0xMDAsNTEgKzEwMCw3IEBACiBhc21saW5rYWdlIHVuc2lnbmVkIGxvbmcKIGlhNjRfYnJrICh1bnNpZ25lZCBsb25nIGJyaykKIHsKLQl1bnNpZ25lZCBsb25nIHJsaW0sIHJldHZhbCwgbmV3YnJrLCBvbGRicms7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKLQotCS8qCi0JICogTW9zdCBvZiB0aGlzIHJlcGxpY2F0ZXMgdGhlIGNvZGUgaW4gc3lzX2JyaygpIGV4Y2VwdCBmb3IgYW4gYWRkaXRpb25hbCBzYWZldHkKLQkgKiBjaGVjayBhbmQgdGhlIGNsZWFyaW5nIG9mIHI4LiAgSG93ZXZlciwgd2UgY2FuJ3QgY2FsbCBzeXNfYnJrKCkgYmVjYXVzZSB3ZSBuZWVkCi0JICogdG8gYWNxdWlyZSB0aGUgbW1hcF9zZW0gYmVmb3JlIHdlIGNhbiBkbyB0aGUgdGVzdC4uLgotCSAqLwotCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7Ci0KLQlpZiAoYnJrIDwgbW0tPmVuZF9jb2RlKQotCQlnb3RvIG91dDsKLQluZXdicmsgPSBQQUdFX0FMSUdOKGJyayk7Ci0Jb2xkYnJrID0gUEFHRV9BTElHTihtbS0+YnJrKTsKLQlpZiAob2xkYnJrID09IG5ld2JyaykKLQkJZ290byBzZXRfYnJrOwotCi0JLyogQWx3YXlzIGFsbG93IHNocmlua2luZyBicmsuICovCi0JaWYgKGJyayA8PSBtbS0+YnJrKSB7Ci0JCWlmICghZG9fbXVubWFwKG1tLCBuZXdicmssIG9sZGJyay1uZXdicmspKQotCQkJZ290byBzZXRfYnJrOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBDaGVjayBhZ2FpbnN0IHVuaW1wbGVtZW50ZWQvdW5tYXBwZWQgYWRkcmVzc2VzOiAqLwotCWlmICgobmV3YnJrIC0gb2xkYnJrKSA+IFJHTl9NQVBfTElNSVQgfHwgUkVHSU9OX09GRlNFVChuZXdicmspID4gUkdOX01BUF9MSU1JVCkKLQkJZ290byBvdXQ7Ci0KLQkvKiBDaGVjayBhZ2FpbnN0IHJsaW1pdC4uICovCi0JcmxpbSA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfREFUQV0ucmxpbV9jdXI7Ci0JaWYgKHJsaW0gPCBSTElNX0lORklOSVRZICYmIGJyayAtIG1tLT5zdGFydF9kYXRhID4gcmxpbSkKLQkJZ290byBvdXQ7Ci0KLQkvKiBDaGVjayBhZ2FpbnN0IGV4aXN0aW5nIG1tYXAgbWFwcGluZ3MuICovCi0JaWYgKGZpbmRfdm1hX2ludGVyc2VjdGlvbihtbSwgb2xkYnJrLCBuZXdicmsrUEFHRV9TSVpFKSkKLQkJZ290byBvdXQ7Ci0KLQkvKiBPaywgbG9va3MgZ29vZCAtIGxldCBpdCByaXAuICovCi0JaWYgKGRvX2JyayhvbGRicmssIG5ld2Jyay1vbGRicmspICE9IG9sZGJyaykKLQkJZ290byBvdXQ7Ci1zZXRfYnJrOgotCW1tLT5icmsgPSBicms7Ci1vdXQ6Ci0JcmV0dmFsID0gbW0tPmJyazsKLQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwl1bnNpZ25lZCBsb25nIHJldHZhbCA9IHN5c19icmsoYnJrKTsKIAlmb3JjZV9zdWNjZXNzZnVsX3N5c2NhbGxfcmV0dXJuKCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTE4NSwzOSArMTQxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1kb19tbWFwMiAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgaW50IHByb3QsIGludCBmbGFncywgaW50IGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCXN0cnVjdCBmaWxlICpmaWxlID0gTlVMTDsKLQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJcmV0dXJuIC1FQkFERjsKLQotCQlpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPm1tYXApIHsKLQkJCWFkZHIgPSAtRU5PREVWOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQkvKiBDYXJlZnVsIGFib3V0IG92ZXJmbG93cy4uICovCi0JbGVuID0gUEFHRV9BTElHTihsZW4pOwotCWlmICghbGVuIHx8IGxlbiA+IFRBU0tfU0laRSkgewotCQlhZGRyID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQlhZGRyID0gZG9fbW1hcF9wZ29mZihmaWxlLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBwZ29mZik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0KLW91dDoJaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci0JcmV0dXJuIGFkZHI7Ci19Ci0KIC8qCiAgKiBtbWFwMigpIGlzIGxpa2UgbW1hcCgpIGV4Y2VwdCB0aGF0IHRoZSBvZmZzZXQgaXMgZXhwcmVzc2VkIGluIHVuaXRzCiAgKiBvZiBQQUdFX1NJWkUgKGluc3RlYWQgb2YgYnl0ZXMpLiAgVGhpcyBhbGxvd3MgdG8gbW1hcDIoKSAocGllY2VzCkBAIC0yMjYsNyArMTQ5LDcgQEAKIGFzbWxpbmthZ2UgdW5zaWduZWQgbG9uZwogc3lzX21tYXAyICh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgcHJvdCwgaW50IGZsYWdzLCBpbnQgZmQsIGxvbmcgcGdvZmYpCiB7Ci0JYWRkciA9IGRvX21tYXAyKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBwZ29mZik7CisJYWRkciA9IHN5c19tbWFwX3Bnb2ZmKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBwZ29mZik7CiAJaWYgKCFJU19FUlIoKHZvaWQgKikgYWRkcikpCiAJCWZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4oKTsKIAlyZXR1cm4gYWRkcjsKQEAgLTIzOCw3ICsxNjEsNyBAQAogCWlmIChvZmZzZXRfaW5fcGFnZShvZmYpICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JYWRkciA9IGRvX21tYXAyKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBvZmYgPj4gUEFHRV9TSElGVCk7CisJYWRkciA9IHN5c19tbWFwX3Bnb2ZmKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBvZmYgPj4gUEFHRV9TSElGVCk7CiAJaWYgKCFJU19FUlIoKHZvaWQgKikgYWRkcikpCiAJCWZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4oKTsKIAlyZXR1cm4gYWRkcjsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9wY2kvcGNpLmMgYi9hcmNoL2lhNjQvcGNpL3BjaS5jCmluZGV4IGMwZmNhMmMuLmRmNjM5ZGI3IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvcGNpL3BjaS5jCisrKyBiL2FyY2gvaWE2NC9wY2kvcGNpLmMKQEAgLTEzMSw2ICsxMzEsNyBAQAogfQogCiBzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyB7CisJc3RydWN0IGFjcGlfZGV2aWNlICpicmlkZ2U7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpjb250cm9sbGVyOwogCWNoYXIgKm5hbWU7CiB9OwpAQCAtMjk3LDkgKzI5OCwyMCBAQAogCXdpbmRvdy0+b2Zmc2V0ID0gb2Zmc2V0OwogCiAJaWYgKGluc2VydF9yZXNvdXJjZShyb290LCAmd2luZG93LT5yZXNvdXJjZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhbGxvYyAweCVsbHgtMHglbGx4IGZyb20gJXMgZm9yICVzIGZhaWxlZFxuIiwKLQkJCXdpbmRvdy0+cmVzb3VyY2Uuc3RhcnQsIHdpbmRvdy0+cmVzb3VyY2UuZW5kLAotCQkJcm9vdC0+bmFtZSwgaW5mby0+bmFtZSk7CisJCWRldl9lcnIoJmluZm8tPmJyaWRnZS0+ZGV2LAorCQkJImNhbid0IGFsbG9jYXRlIGhvc3QgYnJpZGdlIHdpbmRvdyAlcFJcbiIsCisJCQkmd2luZG93LT5yZXNvdXJjZSk7CisJfSBlbHNlIHsKKwkJaWYgKG9mZnNldCkKKwkJCWRldl9pbmZvKCZpbmZvLT5icmlkZ2UtPmRldiwgImhvc3QgYnJpZGdlIHdpbmRvdyAlcFIgIgorCQkJCSAiKFBDSSBhZGRyZXNzIFslI2xseC0lI2xseF0pXG4iLAorCQkJCSAmd2luZG93LT5yZXNvdXJjZSwKKwkJCQkgd2luZG93LT5yZXNvdXJjZS5zdGFydCAtIG9mZnNldCwKKwkJCQkgd2luZG93LT5yZXNvdXJjZS5lbmQgLSBvZmZzZXQpOworCQllbHNlCisJCQlkZXZfaW5mbygmaW5mby0+YnJpZGdlLT5kZXYsCisJCQkJICJob3N0IGJyaWRnZSB3aW5kb3cgJXBSXG4iLAorCQkJCSAmd2luZG93LT5yZXNvdXJjZSk7CiAJfQogCiAJcmV0dXJuIEFFX09LOwpAQCAtMzE5LDggKzMzMSw5IEBACiAJCSAgICAocmVzLT5lbmQgLSByZXMtPnN0YXJ0IDwgMTYpKQogCQkJY29udGludWU7CiAJCWlmIChqID49IFBDSV9CVVNfTlVNX1JFU09VUkNFUykgewotCQkJcHJpbnRrKCJJZ25vcmluZyByYW5nZSBbJSNsbHgtJSNsbHhdICglbHgpXG4iLAotCQkJCQlyZXMtPnN0YXJ0LCByZXMtPmVuZCwgcmVzLT5mbGFncyk7CisJCQlkZXZfd2FybigmYnVzLT5kZXYsCisJCQkJICJpZ25vcmluZyBob3N0IGJyaWRnZSB3aW5kb3cgJXBSIChubyBzcGFjZSlcbiIsCisJCQkJIHJlcyk7CiAJCQljb250aW51ZTsKIAkJfQogCQlidXMtPnJlc291cmNlW2orK10gPSByZXM7CkBAIC0zNjQsNiArMzc3LDcgQEAKIAkJCWdvdG8gb3V0MzsKIAogCQlzcHJpbnRmKG5hbWUsICJQQ0kgQnVzICUwNHg6JTAyeCIsIGRvbWFpbiwgYnVzKTsKKwkJaW5mby5icmlkZ2UgPSBkZXZpY2U7CiAJCWluZm8uY29udHJvbGxlciA9IGNvbnRyb2xsZXI7CiAJCWluZm8ubmFtZSA9IG5hbWU7CiAJCWFjcGlfd2Fsa19yZXNvdXJjZXMoZGV2aWNlLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsCkBAIC03MjAsOSArNzM0LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBJdCdzIGRlZmluZWQgaW4gZHJpdmVycy9wY2kvcGNpLmMgKi8KLWV4dGVybiB1OCBwY2lfY2FjaGVfbGluZV9zaXplOwotCiAvKioKICAqIHNldF9wY2lfY2FjaGVsaW5lX3NpemUgLSBkZXRlcm1pbmUgY2FjaGVsaW5lIHNpemUgZm9yIFBDSSBkZXZpY2VzCiAgKgpAQCAtNzMxLDcgKzc0Miw3IEBACiAgKgogICogQ29kZSBtb3N0bHkgdGFrZW4gZnJvbSBhcmNoL2lhNjQva2VybmVsL3BhbGluZm8uYzpjYWNoZV9pbmZvKCkuCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfcGNpX2NhY2hlbGluZV9zaXplKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0X3BjaV9kZmxfY2FjaGVsaW5lX3NpemUodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGxldmVscywgdW5pcXVlX2NhY2hlczsKIAlsb25nIHN0YXR1czsKQEAgLTc1MSw3ICs3NjIsNyBAQAogCQkJIihzdGF0dXM9JWxkKVxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9Ci0JcGNpX2NhY2hlX2xpbmVfc2l6ZSA9ICgxIDw8IGNjaS5wY2NpX2xpbmVfc2l6ZSkgLyA0OworCXBjaV9kZmxfY2FjaGVfbGluZV9zaXplID0gKDEgPDwgY2NpLnBjY2lfbGluZV9zaXplKSAvIDQ7CiB9CiAKIHU2NCBpYTY0X2RtYV9nZXRfcmVxdWlyZWRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC03ODIsNyArNzkzLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgcGNpYmlvc19pbml0KHZvaWQpCiB7Ci0Jc2V0X3BjaV9jYWNoZWxpbmVfc2l6ZSgpOworCXNldF9wY2lfZGZsX2NhY2hlbGluZV9zaXplKCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc3lzX20zMnIuYyBiL2FyY2gvbTMyci9rZXJuZWwvc3lzX20zMnIuYwppbmRleCAzMDVhYzg1Li5kM2M4NjVjIDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3N5c19tMzJyLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zeXNfbTMyci5jCkBAIC03NiwzMCArNzYsNiBAQAogCXJldHVybiBvbGR2YWw7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLQlpbnQgZXJyb3IgPSAtRUJBREY7Ci0Jc3RydWN0IGZpbGUgKmZpbGUgPSBOVUxMOwotCi0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCWlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLQkJZmlsZSA9IGZnZXQoZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCWVycm9yID0gZG9fbW1hcF9wZ29mZihmaWxlLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBwZ29mZik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0KLQlpZiAoZmlsZSkKLQkJZnB1dChmaWxlKTsKLW91dDoKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KIC8qCiAgKiBzeXNfaXBjKCkgaXMgdGhlIGRlLW11bHRpcGxleGVyIGZvciB0aGUgU3lzViBJUEMgY2FsbHMuLgogICoKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc3lzY2FsbF90YWJsZS5TIGIvYXJjaC9tMzJyL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKaW5kZXggYWEzYmY0Yy4uNjA1MzZlMiAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKQEAgLTE5MSw3ICsxOTEsNyBAQAogCS5sb25nIHN5c19uaV9zeXNjYWxsCQkvKiBzdHJlYW1zMiAqLwogCS5sb25nIHN5c192Zm9yawkJCS8qIDE5MCAqLwogCS5sb25nIHN5c19nZXRybGltaXQKLQkubG9uZyBzeXNfbW1hcDIKKwkubG9uZyBzeXNfbW1hcF9wZ29mZgogCS5sb25nIHN5c190cnVuY2F0ZTY0CiAJLmxvbmcgc3lzX2Z0cnVuY2F0ZTY0CiAJLmxvbmcgc3lzX3N0YXQ2NAkJLyogMTk1ICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3N5c19tNjhrLmMgYi9hcmNoL202OGsva2VybmVsL3N5c19tNjhrLmMKaW5kZXggN2RlYjQwMi4uMjE4ZjQ0MSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9zeXNfbTY4ay5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvc3lzX202OGsuYwpAQCAtMjksMzcgKzI5LDE2IEBACiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAKLS8qIGNvbW1vbiBjb2RlIGZvciBvbGQgYW5kIG5ldyBtbWFwcyAqLwotc3RhdGljIGlubGluZSBsb25nIGRvX21tYXAyKAotCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCi0JdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAotCXVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCi17Ci0JaW50IGVycm9yID0gLUVCQURGOwotCXN0cnVjdCBmaWxlICogZmlsZSA9IE5VTEw7Ci0KLQlmbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7Ci0JaWYgKCEoZmxhZ3MgJiBNQVBfQU5PTllNT1VTKSkgewotCQlmaWxlID0gZmdldChmZCk7Ci0JCWlmICghZmlsZSkKLQkJCWdvdG8gb3V0OwotCX0KLQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JZXJyb3IgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIHBnb2ZmKTsKLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOwotb3V0OgotCXJldHVybiBlcnJvcjsKLX0KLQogYXNtbGlua2FnZSBsb25nIHN5c19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAogCXVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKIAl1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQogewotCXJldHVybiBkb19tbWFwMihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgcGdvZmYpOworCS8qCisJICogVGhpcyBpcyB3cm9uZyBmb3Igc3VuMyAtIHRoZXJlIFBBR0VfU0laRSBpcyA4S2IsCisJICogc28gd2UgbmVlZCB0byBzaGlmdCB0aGUgYXJndW1lbnQgZG93biBieSAxOyBtNjhrIG1tYXA2NCgzKQorCSAqIChpbiBsaWJjKSBleHBlY3RzIHRoZSBsYXN0IGFyZ3VtZW50IG9mIG1tYXAyIGluIDRLYiB1bml0cy4KKwkgKi8KKwlyZXR1cm4gc3lzX21tYXBfcGdvZmYoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIHBnb2ZmKTsKIH0KIAogLyoKQEAgLTkwLDU4ICs2OSwxMiBAQAogCWlmIChhLm9mZnNldCAmIH5QQUdFX01BU0spCiAJCWdvdG8gb3V0OwogCi0JYS5mbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7Ci0KLQllcnJvciA9IGRvX21tYXAyKGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywgYS5mZCwgYS5vZmZzZXQgPj4gUEFHRV9TSElGVCk7CisJZXJyb3IgPSBzeXNfbW1hcF9wZ29mZihhLmFkZHIsIGEubGVuLCBhLnByb3QsIGEuZmxhZ3MsIGEuZmQsCisJCQkgICAgICAgYS5vZmZzZXQgPj4gUEFHRV9TSElGVCk7CiBvdXQ6CiAJcmV0dXJuIGVycm9yOwogfQogCi0jaWYgMAotc3RydWN0IG1tYXBfYXJnX3N0cnVjdDY0IHsKLQlfX3UzMiBhZGRyOwotCV9fdTMyIGxlbjsKLQlfX3UzMiBwcm90OwotCV9fdTMyIGZsYWdzOwotCV9fdTY0IG9mZnNldDsgLyogNjQgYml0cyAqLwotCV9fdTMyIGZkOwotfTsKLQotYXNtbGlua2FnZSBsb25nIHN5c19tbWFwNjQoc3RydWN0IG1tYXBfYXJnX3N0cnVjdDY0ICphcmcpCi17Ci0JaW50IGVycm9yID0gLUVGQVVMVDsKLQlzdHJ1Y3QgZmlsZSAqIGZpbGUgPSBOVUxMOwotCXN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3Q2NCBhOwotCXVuc2lnbmVkIGxvbmcgcGdvZmY7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmEsIGFyZywgc2l6ZW9mKGEpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoKGxvbmcpYS5vZmZzZXQgJiB+UEFHRV9NQVNLKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBnb2ZmID0gYS5vZmZzZXQgPj4gUEFHRV9TSElGVDsKLQlpZiAoKGEub2Zmc2V0ID4+IFBBR0VfU0hJRlQpICE9IHBnb2ZmKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghKGEuZmxhZ3MgJiBNQVBfQU5PTllNT1VTKSkgewotCQllcnJvciA9IC1FQkFERjsKLQkJZmlsZSA9IGZnZXQoYS5mZCk7Ci0JCWlmICghZmlsZSkKLQkJCWdvdG8gb3V0OwotCX0KLQlhLmZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JZXJyb3IgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOwotb3V0OgotCXJldHVybiBlcnJvcjsKLX0KLSNlbmRpZgotCiBzdHJ1Y3Qgc2VsX2FyZ19zdHJ1Y3QgewogCXVuc2lnbmVkIGxvbmcgbjsKIAlmZF9zZXQgX191c2VyICppbnAsICpvdXRwLCAqZXhwOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3N5c19tNjhrLmMgYi9hcmNoL202OGtub21tdS9rZXJuZWwvc3lzX202OGsuYwppbmRleCBlZmRkMDkwLi5iNjdjYmM3IDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvc3lzX202OGsuYworKysgYi9hcmNoL202OGtub21tdS9rZXJuZWwvc3lzX202OGsuYwpAQCAtMjcsMzkgKzI3LDYgQEAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KIAotLyogY29tbW9uIGNvZGUgZm9yIG9sZCBhbmQgbmV3IG1tYXBzICovCi1zdGF0aWMgaW5saW5lIGxvbmcgZG9fbW1hcDIoCi0JdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLQlpbnQgZXJyb3IgPSAtRUJBREY7Ci0Jc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKLQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCi0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCi1hc21saW5rYWdlIGxvbmcgc3lzX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCi0JdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAotCXVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCi17Ci0JcmV0dXJuIGRvX21tYXAyKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBwZ29mZik7Ci19Ci0KIC8qCiAgKiBQZXJmb3JtIHRoZSBzZWxlY3QobmQsIGluLCBvdXQsIGV4LCB0dikgYW5kIG1tYXAoKSBzeXN0ZW0KICAqIGNhbGxzLiBMaW51eC9tNjhrIGNsb25lZCBMaW51eC9pMzg2LCB3aGljaCBkaWRuJ3QgdXNlIHRvIGJlIGFibGUgdG8KQEAgLTg4LDkgKzU1LDggQEAKIAlpZiAoYS5vZmZzZXQgJiB+UEFHRV9NQVNLKQogCQlnb3RvIG91dDsKIAotCWEuZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCi0JZXJyb3IgPSBkb19tbWFwMihhLmFkZHIsIGEubGVuLCBhLnByb3QsIGEuZmxhZ3MsIGEuZmQsIGEub2Zmc2V0ID4+IFBBR0VfU0hJRlQpOworCWVycm9yID0gc3lzX21tYXBfcGdvZmYoYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLCBhLmZkLAorCQkJCWEub2Zmc2V0ID4+IFBBR0VfU0hJRlQpOwogb3V0OgogCXJldHVybiBlcnJvcjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zeXNjYWxsdGFibGUuUyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zeXNjYWxsdGFibGUuUwppbmRleCAyMzUzNWNjLi40ODY4MzdlIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvc3lzY2FsbHRhYmxlLlMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3N5c2NhbGx0YWJsZS5TCkBAIC0yMTAsNyArMjEwLDcgQEAKIAkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBzdHJlYW1zMiAqLwogCS5sb25nIHN5c192Zm9yawkJLyogMTkwICovCiAJLmxvbmcgc3lzX2dldHJsaW1pdAotCS5sb25nIHN5c19tbWFwMgorCS5sb25nIHN5c19tbWFwX3Bnb2ZmCiAJLmxvbmcgc3lzX3RydW5jYXRlNjQKIAkubG9uZyBzeXNfZnRydW5jYXRlNjQKIAkubG9uZyBzeXNfc3RhdDY0CS8qIDE5NSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9zeXNfbWljcm9ibGF6ZS5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9zeXNfbWljcm9ibGF6ZS5jCmluZGV4IDA3Y2FiZWQuLjlmM2MyMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvc3lzX21pY3JvYmxhemUuYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3N5c19taWNyb2JsYXplLmMKQEAgLTYyLDQ2ICs2MiwxNCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nCi1zeXNfbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IE5VTEw7Ci0JaW50IHJldCA9IC1FQkFERjsKLQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJubyBmZCBpbiBtbWFwXHJcbiIpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCXJldCA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOwotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KIGFzbWxpbmthZ2UgbG9uZyBzeXNfbW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAogCQkJdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAogCQkJdW5zaWduZWQgbG9uZyBmZCwgb2ZmX3QgcGdvZmYpCiB7Ci0JaW50IGVyciA9IC1FSU5WQUw7CisJaWYgKHBnb2ZmICYgflBBR0VfTUFTSykKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAocGdvZmYgJiB+UEFHRV9NQVNLKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIm5vIHBhZ2VtYXNrIGluIG1tYXBcclxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWVyciA9IHN5c19tbWFwMihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgcGdvZmYgPj4gUEFHRV9TSElGVCk7Ci1vdXQ6Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gc3lzX21tYXBfcGdvZmYoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIHBnb2ZmID4+IFBBR0VfU0hJRlQpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3N5c2NhbGxfdGFibGUuUwppbmRleCBjMWFiMWRjLi5iOTZmMzY1IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3N5c2NhbGxfdGFibGUuUworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3N5c2NhbGxfdGFibGUuUwpAQCAtMTk2LDcgKzE5Niw3IEBACiAJLmxvbmcgc3lzX25pX3N5c2NhbGwJCS8qIHJlc2VydmVkIGZvciBzdHJlYW1zMiAqLwogCS5sb25nIHN5c192Zm9yawkJLyogMTkwICovCiAJLmxvbmcgc3lzX2dldHJsaW1pdAotCS5sb25nIHN5c19tbWFwMgkJCS8qIG1tYXAyICovCisJLmxvbmcgc3lzX21tYXBfcGdvZmYJCS8qIG1tYXAyICovCiAJLmxvbmcgc3lzX3RydW5jYXRlNjQKIAkubG9uZyBzeXNfZnRydW5jYXRlNjQKIAkubG9uZyBzeXNfc3RhdDY0CQkvKiAxOTUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mY250bC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2ZjbnRsLmgKaW5kZXggMmE1MjMzMy4uN2M2NjgxYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2ZjbnRsLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2ZjbnRsLmgKQEAgLTEwLDcgKzEwLDcgQEAKIAogCiAjZGVmaW5lIE9fQVBQRU5ECTB4MDAwOAotI2RlZmluZSBPX1NZTkMJCTB4MDAxMAorI2RlZmluZSBPX0RTWU5DCQkweDAwMTAJLyogdXNlZCB0byBiZSBPX1NZTkMsIHNlZSBiZWxvdyAqLwogI2RlZmluZSBPX05PTkJMT0NLCTB4MDA4MAogI2RlZmluZSBPX0NSRUFUICAgICAgICAgMHgwMTAwCS8qIG5vdCBmY250bCAqLwogI2RlZmluZSBPX1RSVU5DCQkweDAyMDAJLyogbm90IGZjbnRsICovCkBAIC0xOCw2ICsxOCwyMSBAQAogI2RlZmluZSBPX05PQ1RUWQkweDA4MDAJLyogbm90IGZjbnRsICovCiAjZGVmaW5lIEZBU1lOQwkJMHgxMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgT19MQVJHRUZJTEUJMHgyMDAwCS8qIGFsbG93IGxhcmdlIGZpbGUgb3BlbnMgKi8KKy8qCisgKiBCZWZvcmUgTGludXggMi42LjMyIG9ubHkgT19EU1lOQyBzZW1hbnRpY3Mgd2VyZSBpbXBsZW1lbnRlZCwgYnV0IHVzaW5nCisgKiB0aGUgT19TWU5DIGZsYWcuICBXZSBjb250aW51ZSB0byB1c2UgdGhlIGV4aXN0aW5nIG51bWVyaWNhbCB2YWx1ZQorICogZm9yIE9fRFNZTkMgc2VtYW50aWNzIG5vdywgYnV0IHVzaW5nIHRoZSBjb3JyZWN0IHN5bWJvbGljIG5hbWUgZm9yIGl0LgorICogVGhpcyBuZXcgdmFsdWUgaXMgdXNlZCB0byByZXF1ZXN0IHRydWUgUG9zaXggT19TWU5DIHNlbWFudGljcy4gIEl0IGlzCisgKiBkZWZpbmVkIGluIHRoaXMgc3RyYW5nZSB3YXkgdG8gbWFrZSBzdXJlIGFwcGxpY2F0aW9ucyBjb21waWxlZCBhZ2FpbnN0CisgKiBuZXcgaGVhZGVycyBnZXQgYXQgbGVhc3QgT19EU1lOQyBzZW1hbnRpY3Mgb24gb2xkZXIga2VybmVscy4KKyAqCisgKiBUaGlzIGhhcyB0aGUgbmljZSBzaWRlLWVmZmVjdCB0aGF0IHdlIGNhbiBzaW1wbHkgdGVzdCBmb3IgT19EU1lOQworICogd2hlcmV2ZXIgd2UgZG8gbm90IGNhcmUgaWYgT19EU1lOQyBvciBPX1NZTkMgaXMgdXNlZC4KKyAqCisgKiBOb3RlOiBfX09fU1lOQyBtdXN0IG5ldmVyIGJlIHVzZWQgZGlyZWN0bHkuCisgKi8KKyNkZWZpbmUgX19PX1NZTkMJMHg0MDAwCisjZGVmaW5lIE9fU1lOQwkJKF9fT19TWU5DfE9fRFNZTkMpCiAjZGVmaW5lIE9fRElSRUNUCTB4ODAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAqLwogCiAjZGVmaW5lIEZfR0VUTEsJCTE0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2tzcGQuYyBiL2FyY2gvbWlwcy9rZXJuZWwva3NwZC5jCmluZGV4IGFkNGUwMTcuLjgwZTJiYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwva3NwZC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwva3NwZC5jCkBAIC04Miw2ICs4Miw3IEBACiAjZGVmaW5lIE1UU1BfT19TSExPQ0sJCTB4MDAxMAogI2RlZmluZSBNVFNQX09fRVhMT0NLCQkweDAwMjAKICNkZWZpbmUgTVRTUF9PX0FTWU5DCQkweDAwNDAKKy8qIFhYWDogY2hlY2sgd2hpY2ggb2YgdGhlc2UgaXMgYWN0dWFsbHkgT19TWU5DIHZzIE9fRFNZTkMgKi8KICNkZWZpbmUgTVRTUF9PX0ZTWU5DCQlPX1NZTkMKICNkZWZpbmUgTVRTUF9PX05PRk9MTE9XCQkweDAxMDAKICNkZWZpbmUgTVRTUF9PX1NZTkMJCTB4MDA4MApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9saW51eDMyLmMgYi9hcmNoL21pcHMva2VybmVsL2xpbnV4MzIuYwppbmRleCAxYTI3OTNlLi5mMDQyNTYzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2xpbnV4MzIuYworKysgYi9hcmNoL21pcHMva2VybmVsL2xpbnV4MzIuYwpAQCAtNjcsMjggKzY3LDEzIEBACiAJdW5zaWduZWQgbG9uZywgcHJvdCwgdW5zaWduZWQgbG9uZywgZmxhZ3MsIHVuc2lnbmVkIGxvbmcsIGZkLAogCXVuc2lnbmVkIGxvbmcsIHBnb2ZmKQogewotCXN0cnVjdCBmaWxlICogZmlsZSA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBlcnJvcjsKIAogCWVycm9yID0gLUVJTlZBTDsKIAlpZiAocGdvZmYgJiAoflBBR0VfTUFTSyA+PiAxMikpCiAJCWdvdG8gb3V0OwotCXBnb2ZmID4+PSBQQUdFX1NISUZULTEyOwotCi0JaWYgKCEoZmxhZ3MgJiBNQVBfQU5PTllNT1VTKSkgewotCQllcnJvciA9IC1FQkFERjsKLQkJZmlsZSA9IGZnZXQoZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlnb3RvIG91dDsKLQl9Ci0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOwotCisJZXJyb3IgPSBzeXNfbW1hcF9wZ29mZihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwKKwkJCSAgICAgICBwZ29mZiA+PiAoUEFHRV9TSElGVC0xMikpOwogb3V0OgogCXJldHVybiBlcnJvcjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc3lzY2FsbC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zeXNjYWxsLmMKaW5kZXggZmUwZDc5OC4uM2Y3ZjQ2NiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zeXNjYWxsLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zeXNjYWxsLmMKQEAgLTkzLDcgKzkzLDggQEAKIAkJICogV2UgZG8gbm90IGFjY2VwdCBhIHNoYXJlZCBtYXBwaW5nIGlmIGl0IHdvdWxkIHZpb2xhdGUKIAkJICogY2FjaGUgYWxpYXNpbmcgY29uc3RyYWludHMuCiAJCSAqLwotCQlpZiAoKGZsYWdzICYgTUFQX1NIQVJFRCkgJiYgKGFkZHIgJiBzaG1fYWxpZ25fbWFzaykpCisJCWlmICgoZmxhZ3MgJiBNQVBfU0hBUkVEKSAmJgorCQkgICAgKChhZGRyIC0gKHBnb2ZmIDw8IFBBR0VfU0hJRlQpKSAmIHNobV9hbGlnbl9tYXNrKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlyZXR1cm4gYWRkcjsKIAl9CkBAIC0xMjksMzEgKzEzMCw2IEBACiAJfQogfQogCi0vKiBjb21tb24gY29kZSBmb3Igb2xkIGFuZCBuZXcgbW1hcHMgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotZG9fbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwcm90LAotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCXVuc2lnbmVkIGxvbmcgZXJyb3IgPSAtRUJBREY7Ci0Jc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKLQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCi0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCiBTWVNDQUxMX0RFRklORTYobWlwc19tbWFwLCB1bnNpZ25lZCBsb25nLCBhZGRyLCB1bnNpZ25lZCBsb25nLCBsZW4sCiAJdW5zaWduZWQgbG9uZywgcHJvdCwgdW5zaWduZWQgbG9uZywgZmxhZ3MsIHVuc2lnbmVkIGxvbmcsCiAJZmQsIG9mZl90LCBvZmZzZXQpCkBAIC0xNjQsNyArMTQwLDcgQEAKIAlpZiAob2Zmc2V0ICYgflBBR0VfTUFTSykKIAkJZ290byBvdXQ7CiAKLQlyZXN1bHQgPSBkb19tbWFwMihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgb2Zmc2V0ID4+IFBBR0VfU0hJRlQpOworCXJlc3VsdCA9IHN5c19tbWFwX3Bnb2ZmKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBvZmZzZXQgPj4gUEFHRV9TSElGVCk7CiAKIG91dDoKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMTc3LDcgKzE1Myw3IEBACiAJaWYgKHBnb2ZmICYgKH5QQUdFX01BU0sgPj4gMTIpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiBkb19tbWFwMihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgcGdvZmYgPj4gKFBBR0VfU0hJRlQtMTIpKTsKKwlyZXR1cm4gc3lzX21tYXBfcGdvZmYoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIHBnb2ZmID4+IChQQUdFX1NISUZULTEyKSk7CiB9CiAKIHNhdmVfc3RhdGljX2Z1bmN0aW9uKHN5c19mb3JrKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vbWVtLmMgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL21lbS5jCmluZGV4IDdjOTJmNzkuLmU5NGVmMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vbWVtLmMKKysrIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9tZW0uYwpAQCAtMjYsNyArMjYsNyBAQAogLyogb3ZlcnJpZGUgb2YgYXJjaC9taXBzL21tL2NhY2hlLmM6IF9fdW5jYWNoZWRfYWNjZXNzICovCiBpbnQgX191bmNhY2hlZF9hY2Nlc3Moc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fRFNZTkMpCiAJCXJldHVybiAxOwogCiAJcmV0dXJuIGFkZHIgPj0gX19wYShoaWdoX21lbW9yeSkgfHwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jYWNoZS5jIGIvYXJjaC9taXBzL21tL2NhY2hlLmMKaW5kZXggNjk0ZDUxZi4uMTAyYjJkZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2NhY2hlLmMKKysrIGIvYXJjaC9taXBzL21tL2NhY2hlLmMKQEAgLTE5NCw3ICsxOTQsNyBAQAogCiBpbnQgX193ZWFrIF9fdW5jYWNoZWRfYWNjZXNzKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX1NZTkMpCisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0RTWU5DKQogCQlyZXR1cm4gMTsKIAogCXJldHVybiBhZGRyID49IF9fcGEoaGlnaF9tZW1vcnkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL21tYW4uaCBiL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9tbWFuLmgKaW5kZXggOGVlYmY4OS4uZGI1YzUzZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9tbWFuLmgKKysrIGIvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL21tYW4uaApAQCAtMSArMSw2IEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbW1hbi5oPgorCisjZGVmaW5lIE1JTl9NQVBfQUREUglQQUdFX1NJWkUJLyogbWluaW11bSBmaXhlZCBtbWFwIGFkZHJlc3MgKi8KKworI2RlZmluZSBhcmNoX21tYXBfY2hlY2soYWRkciwgbGVuLCBmbGFncykgXAorCSgoKGZsYWdzKSAmIE1BUF9GSVhFRCAmJiAoYWRkcikgPCBNSU5fTUFQX0FERFIpID8gLUVJTlZBTCA6IDApCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL2VudHJ5LlMgYi9hcmNoL21uMTAzMDAva2VybmVsL2VudHJ5LlMKaW5kZXggYTk0ZTdlYS4uYzllZTZjMCAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvZW50cnkuUwpAQCAtNTc4LDcgKzU3OCw3IEBACiAJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogcmVzZXJ2ZWQgZm9yIHN0cmVhbXMyICovCiAJLmxvbmcgc3lzX3Zmb3JrCQkvKiAxOTAgKi8KIAkubG9uZyBzeXNfZ2V0cmxpbWl0Ci0JLmxvbmcgc3lzX21tYXAyCisJLmxvbmcgc3lzX21tYXBfcGdvZmYKIAkubG9uZyBzeXNfdHJ1bmNhdGU2NAogCS5sb25nIHN5c19mdHJ1bmNhdGU2NAogCS5sb25nIHN5c19zdGF0NjQJLyogMTk1ICovCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL3N5c19tbjEwMzAwLmMgYi9hcmNoL21uMTAzMDAva2VybmVsL3N5c19tbjEwMzAwLmMKaW5kZXggOGNhNWFmMC4uMTdjYzZjZSAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9zeXNfbW4xMDMwMC5jCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvc3lzX21uMTAzMDAuYwpAQCAtMjMsNDcgKzIzLDEzIEBACiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jZGVmaW5lIE1JTl9NQVBfQUREUglQQUdFX1NJWkUJLyogbWluaW11bSBmaXhlZCBtbWFwIGFkZHJlc3MgKi8KLQotLyoKLSAqIG1lbW9yeSBtYXBwaW5nIHN5c2NhbGwKLSAqLwotYXNtbGlua2FnZSBsb25nIHN5c19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAotCQkJICB1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JCQkgIHVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCi17Ci0Jc3RydWN0IGZpbGUgKmZpbGUgPSBOVUxMOwotCWxvbmcgZXJyb3IgPSAtRUlOVkFMOwotCi0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCi0JaWYgKGZsYWdzICYgTUFQX0ZJWEVEICYmIGFkZHIgPCBNSU5fTUFQX0FERFIpCi0JCWdvdG8gb3V0OwotCi0JZXJyb3IgPSAtRUJBREY7Ci0JaWYgKCEoZmxhZ3MgJiBNQVBfQU5PTllNT1VTKSkgewotCQlmaWxlID0gZmdldChmZCk7Ci0JCWlmICghZmlsZSkKLQkJCWdvdG8gb3V0OwotCX0KLQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JZXJyb3IgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIHBnb2ZmKTsKLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOwotb3V0OgotCXJldHVybiBlcnJvcjsKLX0KLQogYXNtbGlua2FnZSBsb25nIG9sZF9tbWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCiAJCQkgdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAogCQkJIHVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQogewogCWlmIChvZmZzZXQgJiB+UEFHRV9NQVNLKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gc3lzX21tYXAyKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBvZmZzZXQgPj4gUEFHRV9TSElGVCk7CisJcmV0dXJuIHN5c19tbWFwX3Bnb2ZmKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBvZmZzZXQgPj4gUEFHRV9TSElGVCk7CiB9CiAKIHN0cnVjdCBzZWxfYXJnX3N0cnVjdCB7CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9mY250bC5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vZmNudGwuaAppbmRleCAxZTFjODI0Li5mMzU3ZmM2IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9mY250bC5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2ZjbnRsLmgKQEAgLTEsMTQgKzEsMTMgQEAKICNpZm5kZWYgX1BBUklTQ19GQ05UTF9ICiAjZGVmaW5lIF9QQVJJU0NfRkNOVExfSAogCi0vKiBvcGVuL2ZjbnRsIC0gT19TWU5DIGlzIG9ubHkgaW1wbGVtZW50ZWQgb24gYmxvY2tzIGRldmljZXMgYW5kIG9uIGZpbGVzCi0gICBsb2NhdGVkIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KICNkZWZpbmUgT19BUFBFTkQJMDAwMDAwMDEwCiAjZGVmaW5lIE9fQkxLU0VFSwkwMDAwMDAxMDAgLyogSFBVWCBvbmx5ICovCiAjZGVmaW5lIE9fQ1JFQVQJCTAwMDAwMDQwMCAvKiBub3QgZmNudGwgKi8KICNkZWZpbmUgT19FWENMCQkwMDAwMDIwMDAgLyogbm90IGZjbnRsICovCiAjZGVmaW5lIE9fTEFSR0VGSUxFCTAwMDAwNDAwMAotI2RlZmluZSBPX1NZTkMJCTAwMDEwMDAwMAorI2RlZmluZSBfX09fU1lOQwkwMDAxMDAwMDAKKyNkZWZpbmUgT19TWU5DCQkoX19PX1NZTkN8T19EU1lOQykKICNkZWZpbmUgT19OT05CTE9DSwkwMDAyMDAwMDQgLyogSFBVWCBoYXMgc2VwYXJhdGUgTkRFTEFZICYgTk9OQkxPQ0sgKi8KICNkZWZpbmUgT19OT0NUVFkJMDAwNDAwMDAwIC8qIG5vdCBmY250bCAqLwogI2RlZmluZSBPX0RTWU5DCQkwMDEwMDAwMDAgLyogSFBVWCBvbmx5ICovCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzX3BhcmlzYy5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3N5c19wYXJpc2MuYwppbmRleCA3MWIzMTk1Li45MTQ3MzkxIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzX3BhcmlzYy5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNfcGFyaXNjLmMKQEAgLTExMCwzNyArMTEwLDE0IEBACiAJcmV0dXJuIGFkZHI7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRvX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCi0JdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIGZkLAotCXVuc2lnbmVkIGxvbmcgcGdvZmYpCi17Ci0Jc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGVycm9yID0gLUVCQURGOwotCWlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLQkJZmlsZSA9IGZnZXQoZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlmbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7Ci0KLQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCWVycm9yID0gZG9fbW1hcF9wZ29mZihmaWxlLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBwZ29mZik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0KLQlpZiAoZmlsZSAhPSBOVUxMKQotCQlmcHV0KGZpbGUpOwotb3V0OgotCXJldHVybiBlcnJvcjsKLX0KLQogYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIHN5c19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAogCXVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBmZCwKIAl1bnNpZ25lZCBsb25nIHBnb2ZmKQogewogCS8qIE1ha2Ugc3VyZSB0aGUgc2hpZnQgZm9yIG1tYXAyIGlzIGNvbnN0YW50ICgxMiksIG5vIG1hdHRlciB3aGF0IFBBR0VfU0laRQogCSAgIHdlIGhhdmUuICovCi0JcmV0dXJuIGRvX21tYXAyKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBwZ29mZiA+PiAoUEFHRV9TSElGVCAtIDEyKSk7CisJcmV0dXJuIHN5c19tbWFwX3Bnb2ZmKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLAorCQkJICAgICAgcGdvZmYgPj4gKFBBR0VfU0hJRlQgLSAxMikpOwogfQogCiBhc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc3lzX21tYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKQEAgLTE0OCw3ICsxMjUsOCBAQAogCQl1bnNpZ25lZCBsb25nIG9mZnNldCkKIHsKIAlpZiAoIShvZmZzZXQgJiB+UEFHRV9NQVNLKSkgewotCQlyZXR1cm4gZG9fbW1hcDIoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIG9mZnNldCA+PiBQQUdFX1NISUZUKTsKKwkJcmV0dXJuIHN5c19tbWFwX3Bnb2ZmKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLAorCQkJCQlvZmZzZXQgPj4gUEFHRV9TSElGVCk7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNjYWxscy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNjYWxscy5jCmluZGV4IGMwNDgzMmMuLjMzNzBlNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzY2FsbHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2NhbGxzLmMKQEAgLTE0MCw3ICsxNDAsNiBAQAogCQkJdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAogCQkJdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBvZmYsIGludCBzaGlmdCkKIHsKLQlzdHJ1Y3QgZmlsZSAqIGZpbGUgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgcmV0ID0gLUVJTlZBTDsKIAogCWlmICghYXJjaF92YWxpZGF0ZV9wcm90KHByb3QpKQpAQCAtMTUxLDIwICsxNTAsOCBAQAogCQkJZ290byBvdXQ7CiAJCW9mZiA+Pj0gc2hpZnQ7CiAJfQotCQkKLQlyZXQgPSAtRUJBREY7Ci0JaWYgKCEoZmxhZ3MgJiBNQVBfQU5PTllNT1VTKSkgewotCQlpZiAoIShmaWxlID0gZmdldChmZCkpKQotCQkJZ290byBvdXQ7Ci0JfQogCi0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQlyZXQgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIG9mZik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7CisJcmV0ID0gc3lzX21tYXBfcGdvZmYoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIG9mZik7CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jCmluZGV4IDI1YzMxZDYuLjIyYzllNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYwpAQCAtNjI0LDM4ICs2MjQsNiBAQAogCXUzMglvZmZzZXQ7CiB9OwogCi0vKiBjb21tb24gY29kZSBmb3Igb2xkIGFuZCBuZXcgbW1hcHMgKi8KLXN0YXRpYyBpbmxpbmUgbG9uZyBkb19tbWFwMigKLQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAotCXVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKLQl1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCXN0cnVjdCBmaWxlICogZmlsZSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBlcnJvciA9IC1FQkFERjsKLQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCWlmICghSVNfRVJSKCh2b2lkICopIGVycm9yKSAmJiBlcnJvciArIGxlbiA+PSAweDgwMDAwMDAwVUxMKSB7Ci0JCS8qIFJlc3VsdCBpcyBvdXQgb2YgYm91bmRzLiAgKi8KLQkJZG9fbXVubWFwKGN1cnJlbnQtPm1tLCBhZGRyLCBsZW4pOwotCQllcnJvciA9IC1FTk9NRU07Ci0JfQotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCi0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6ICAgIAotCXJldHVybiBlcnJvcjsKLX0KLQotCiBhc21saW5rYWdlIHVuc2lnbmVkIGxvbmcKIG9sZDMyX21tYXAoc3RydWN0IG1tYXBfYXJnX3N0cnVjdF9lbXUzMSBfX3VzZXIgKmFyZykKIHsKQEAgLTY2OSw3ICs2MzcsOCBAQAogCWlmIChhLm9mZnNldCAmIH5QQUdFX01BU0spCiAJCWdvdG8gb3V0OwogCi0JZXJyb3IgPSBkb19tbWFwMihhLmFkZHIsIGEubGVuLCBhLnByb3QsIGEuZmxhZ3MsIGEuZmQsIGEub2Zmc2V0ID4+IFBBR0VfU0hJRlQpOyAKKwllcnJvciA9IHN5c19tbWFwX3Bnb2ZmKGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywgYS5mZCwKKwkJCSAgICAgICBhLm9mZnNldCA+PiBQQUdFX1NISUZUKTsKIG91dDoKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC02ODIsNyArNjUxLDcgQEAKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmYSwgYXJnLCBzaXplb2YoYSkpKQogCQlnb3RvIG91dDsKLQllcnJvciA9IGRvX21tYXAyKGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywgYS5mZCwgYS5vZmZzZXQpOworCWVycm9yID0gc3lzX21tYXBfcGdvZmYoYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLCBhLmZkLCBhLm9mZnNldCk7CiBvdXQ6CiAJcmV0dXJuIGVycm9yOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zeXNfczM5MC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zeXNfczM5MC5jCmluZGV4IGU5ZDk0ZjYuLjg2YTc0YzkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc3lzX3MzOTAuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3N5c19zMzkwLmMKQEAgLTMyLDMyICszMiw2IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJlbnRyeS5oIgogCi0vKiBjb21tb24gY29kZSBmb3Igb2xkIGFuZCBuZXcgbW1hcHMgKi8KLXN0YXRpYyBpbmxpbmUgbG9uZyBkb19tbWFwMigKLQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAotCXVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKLQl1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCWxvbmcgZXJyb3IgPSAtRUJBREY7Ci0Jc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKLQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCi0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCiAvKgogICogUGVyZm9ybSB0aGUgc2VsZWN0KG5kLCBpbiwgb3V0LCBleCwgdHYpIGFuZCBtbWFwKCkgc3lzdGVtCiAgKiBjYWxscy4gTGludXggZm9yIFMvMzkwIGlzbid0IGFibGUgdG8gaGFuZGxlIG1vcmUgdGhhbiA1CkBAIC04MSw3ICs1NSw3IEBACiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmEsIGFyZywgc2l6ZW9mKGEpKSkKIAkJZ290byBvdXQ7Ci0JZXJyb3IgPSBkb19tbWFwMihhLmFkZHIsIGEubGVuLCBhLnByb3QsIGEuZmxhZ3MsIGEuZmQsIGEub2Zmc2V0KTsKKwllcnJvciA9IHN5c19tbWFwX3Bnb2ZmKGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywgYS5mZCwgYS5vZmZzZXQpOwogb3V0OgogCXJldHVybiBlcnJvcjsKIH0KQEAgLTk4LDcgKzcyLDcgQEAKIAlpZiAoYS5vZmZzZXQgJiB+UEFHRV9NQVNLKQogCQlnb3RvIG91dDsKIAotCWVycm9yID0gZG9fbW1hcDIoYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLCBhLmZkLCBhLm9mZnNldCA+PiBQQUdFX1NISUZUKTsKKwllcnJvciA9IHN5c19tbWFwX3Bnb2ZmKGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywgYS5mZCwgYS5vZmZzZXQgPj4gUEFHRV9TSElGVCk7CiBvdXQ6CiAJcmV0dXJuIGVycm9yOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zY29yZS9rZXJuZWwvc3lzX3Njb3JlLmMgYi9hcmNoL3Njb3JlL2tlcm5lbC9zeXNfc2NvcmUuYwppbmRleCAwMDEyNDk0Li44NTZlZDY4IDEwMDY0NAotLS0gYS9hcmNoL3Njb3JlL2tlcm5lbC9zeXNfc2NvcmUuYworKysgYi9hcmNoL3Njb3JlL2tlcm5lbC9zeXNfc2NvcmUuYwpAQCAtMzYsMzQgKzM2LDE2IEBACiBzeXNfbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwcm90LAogCSAgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKIHsKLQlpbnQgZXJyb3IgPSAtRUJBREY7Ci0Jc3RydWN0IGZpbGUgKmZpbGUgPSBOVUxMOwotCi0JaWYgKHBnb2ZmICYgKH5QQUdFX01BU0sgPj4gMTIpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJcmV0dXJuIGVycm9yOwotCX0KLQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JZXJyb3IgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIHBnb2ZmKTsKLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOwotCi0JcmV0dXJuIGVycm9yOworCXJldHVybiBzeXNfbW1hcF9wZ29mZihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgcGdvZmYpOwogfQogCiBhc21saW5rYWdlIGxvbmcKIHN5c19tbWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgcHJvdCwKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIGZkLCBvZmZfdCBwZ29mZikKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIGZkLCBvZmZfdCBvZmZzZXQpCiB7Ci0JcmV0dXJuIHN5c19tbWFwMihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgcGdvZmYgPj4gUEFHRV9TSElGVCk7CisJaWYgKHVubGlrZWx5KG9mZnNldCAmIH5QQUdFX01BU0spKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gc3lzX21tYXBfcGdvZmYoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIG9mZnNldCA+PiBQQUdFX1NISUZUKTsKIH0KIAogYXNtbGlua2FnZSBsb25nCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zeXNfc2guYyBiL2FyY2gvc2gva2VybmVsL3N5c19zaC5jCmluZGV4IDhhYTVkMWMuLjcxMzk5Y2QgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3N5c19zaC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3N5c19zaC5jCkBAIC0yOCwzNyArMjgsMTMgQEAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWN0bC5oPgogCi1zdGF0aWMgaW5saW5lIGxvbmcKLWRvX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgcHJvdCwKLQkgdW5zaWduZWQgbG9uZyBmbGFncywgaW50IGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCWludCBlcnJvciA9IC1FQkFERjsKLQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IE5VTEw7Ci0KLQlmbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7Ci0JaWYgKCEoZmxhZ3MgJiBNQVBfQU5PTllNT1VTKSkgewotCQlmaWxlID0gZmdldChmZCk7Ci0JCWlmICghZmlsZSkKLQkJCWdvdG8gb3V0OwotCX0KLQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JZXJyb3IgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIHBnb2ZmKTsKLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOwotb3V0OgotCXJldHVybiBlcnJvcjsKLX0KLQogYXNtbGlua2FnZSBpbnQgb2xkX21tYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKIAl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJaW50IGZkLCB1bnNpZ25lZCBsb25nIG9mZikKIHsKIAlpZiAob2ZmICYgflBBR0VfTUFTSykKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIGRvX21tYXAyKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBvZmY+PlBBR0VfU0hJRlQpOworCXJldHVybiBzeXNfbW1hcF9wZ29mZihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgb2ZmPj5QQUdFX1NISUZUKTsKIH0KIAogYXNtbGlua2FnZSBsb25nIHN5c19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLApAQCAtNzQsNyArNTAsNyBAQAogCiAJcGdvZmYgPj49IFBBR0VfU0hJRlQgLSAxMjsKIAotCXJldHVybiBkb19tbWFwMihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgcGdvZmYpOworCXJldHVybiBzeXNfbW1hcF9wZ29mZihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgcGdvZmYpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9tbWFwLmMgYi9hcmNoL3NoL21tL21tYXAuYwppbmRleCBkMjk4NGZhLi5hZmViNzEwIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL21tYXAuYworKysgYi9hcmNoL3NoL21tL21tYXAuYwpAQCAtNTQsNyArNTQsOCBAQAogCQkvKiBXZSBkbyBub3QgYWNjZXB0IGEgc2hhcmVkIG1hcHBpbmcgaWYgaXQgd291bGQgdmlvbGF0ZQogCQkgKiBjYWNoZSBhbGlhc2luZyBjb25zdHJhaW50cy4KIAkJICovCi0JCWlmICgoZmxhZ3MgJiBNQVBfU0hBUkVEKSAmJiAoYWRkciAmIHNobV9hbGlnbl9tYXNrKSkKKwkJaWYgKChmbGFncyAmIE1BUF9TSEFSRUQpICYmCisJCSAgICAoKGFkZHIgLSAocGdvZmYgPDwgUEFHRV9TSElGVCkpICYgc2htX2FsaWduX21hc2spKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXJldHVybiBhZGRyOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZmNudGwuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZmNudGwuaAppbmRleCBkNGQ5YzlkLi4zYjljZmIzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2ZjbnRsLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mY250bC5oCkBAIC0xLDE0ICsxLDEyIEBACiAjaWZuZGVmIF9TUEFSQ19GQ05UTF9ICiAjZGVmaW5lIF9TUEFSQ19GQ05UTF9ICiAKLS8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKLSAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwogI2RlZmluZSBPX0FQUEVORAkweDAwMDgKICNkZWZpbmUgRkFTWU5DCQkweDAwNDAJLyogZmNudGwsIGZvciBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBPX0NSRUFUCQkweDAyMDAJLyogbm90IGZjbnRsICovCiAjZGVmaW5lIE9fVFJVTkMJCTB4MDQwMAkvKiBub3QgZmNudGwgKi8KICNkZWZpbmUgT19FWENMCQkweDA4MDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fU1lOQwkJMHgyMDAwCisjZGVmaW5lIE9fRFNZTkMJCTB4MjAwMAkvKiB1c2VkIHRvIGJlIE9fU1lOQywgc2VlIGJlbG93ICovCiAjZGVmaW5lIE9fTk9OQkxPQ0sJMHg0MDAwCiAjaWYgZGVmaW5lZChfX3NwYXJjX18pICYmIGRlZmluZWQoX19hcmNoNjRfXykKICNkZWZpbmUgT19OREVMQVkJMHgwMDA0CkBAIC0yMCw2ICsxOCwyMSBAQAogI2RlZmluZSBPX0RJUkVDVCAgICAgICAgMHgxMDAwMDAgLyogZGlyZWN0IGRpc2sgYWNjZXNzIGhpbnQgKi8KICNkZWZpbmUgT19OT0FUSU1FCTB4MjAwMDAwCiAjZGVmaW5lIE9fQ0xPRVhFQwkweDQwMDAwMAorLyoKKyAqIEJlZm9yZSBMaW51eCAyLjYuMzIgb25seSBPX0RTWU5DIHNlbWFudGljcyB3ZXJlIGltcGxlbWVudGVkLCBidXQgdXNpbmcKKyAqIHRoZSBPX1NZTkMgZmxhZy4gIFdlIGNvbnRpbnVlIHRvIHVzZSB0aGUgZXhpc3RpbmcgbnVtZXJpY2FsIHZhbHVlCisgKiBmb3IgT19EU1lOQyBzZW1hbnRpY3Mgbm93LCBidXQgdXNpbmcgdGhlIGNvcnJlY3Qgc3ltYm9saWMgbmFtZSBmb3IgaXQuCisgKiBUaGlzIG5ldyB2YWx1ZSBpcyB1c2VkIHRvIHJlcXVlc3QgdHJ1ZSBQb3NpeCBPX1NZTkMgc2VtYW50aWNzLiAgSXQgaXMKKyAqIGRlZmluZWQgaW4gdGhpcyBzdHJhbmdlIHdheSB0byBtYWtlIHN1cmUgYXBwbGljYXRpb25zIGNvbXBpbGVkIGFnYWluc3QKKyAqIG5ldyBoZWFkZXJzIGdldCBhdCBsZWFzdCBPX0RTWU5DIHNlbWFudGljcyBvbiBvbGRlciBrZXJuZWxzLgorICoKKyAqIFRoaXMgaGFzIHRoZSBuaWNlIHNpZGUtZWZmZWN0IHRoYXQgd2UgY2FuIHNpbXBseSB0ZXN0IGZvciBPX0RTWU5DCisgKiB3aGVyZXZlciB3ZSBkbyBub3QgY2FyZSBpZiBPX0RTWU5DIG9yIE9fU1lOQyBpcyB1c2VkLgorICoKKyAqIE5vdGU6IF9fT19TWU5DIG11c3QgbmV2ZXIgYmUgdXNlZCBkaXJlY3RseS4KKyAqLworI2RlZmluZSBfX09fU1lOQwkweDgwMDAwMAorI2RlZmluZSBPX1NZTkMJCShfX09fU1lOQ3xPX0RTWU5DKQogCiAjZGVmaW5lIEZfR0VUT1dOCTUJLyogIGZvciBzb2NrZXRzLiAqLwogI2RlZmluZSBGX1NFVE9XTgk2CS8qICBmb3Igc29ja2V0cy4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGNpXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BjaV82NC5oCmluZGV4IGI2M2U1MWMuLmIwNTc2ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGNpXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wY2lfNjQuaApAQCAtMTYsOCArMTYsNiBAQAogCiAjZGVmaW5lIFBDSV9JUlFfTk9ORQkJMHhmZmZmZmZmZgogCi0jZGVmaW5lIFBDSV9DQUNIRV9MSU5FX0JZVEVTCTY0Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAkvKiBObyBzcGVjaWFsIGJ1cyBtYXN0ZXJpbmcgc2V0dXAgaGFuZGxpbmcgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMKaW5kZXggYzY4NjQ4Ni4uYjg1Mzc0ZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMKQEAgLTEwODEsMyArMTA4MSwxMCBAQAogCSpzdGFydCA9IHJwLT5zdGFydCAtIG9mZnNldDsKIAkqZW5kID0gcnAtPmVuZCAtIG9mZnNldDsKIH0KKworc3RhdGljIGludCBfX2luaXQgcGNpYmlvc19pbml0KHZvaWQpCit7CisJcGNpX2RmbF9jYWNoZV9saW5lX3NpemUgPSA2NCA+PiAyOworCXJldHVybiAwOworfQorc3Vic3lzX2luaXRjYWxsKHBjaWJpb3NfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmMzMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjMzIuYwppbmRleCAwMGFiZTg3Li5kYzBhYzE5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmMzMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyYzMyLmMKQEAgLTU2NCwyOCArNTY0LDYgQEAKIAlyZXR1cm4gZG9fc3lzX29wZW4oQVRfRkRDV0QsIGZpbGVuYW1lLCBmbGFncywgbW9kZSk7CiB9CiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGRvX21yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsCi0JdW5zaWduZWQgbG9uZyBvbGRfbGVuLCB1bnNpZ25lZCBsb25nIG5ld19sZW4sCi0JdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBuZXdfYWRkcik7Ci0gICAgICAgICAgICAgICAgCi1hc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc3lzMzJfbXJlbWFwKHVuc2lnbmVkIGxvbmcgYWRkciwKLQl1bnNpZ25lZCBsb25nIG9sZF9sZW4sIHVuc2lnbmVkIGxvbmcgbmV3X2xlbiwKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCB1MzIgX19uZXdfYWRkcikKLXsKLQl1bnNpZ25lZCBsb25nIHJldCA9IC1FSU5WQUw7Ci0JdW5zaWduZWQgbG9uZyBuZXdfYWRkciA9IF9fbmV3X2FkZHI7Ci0KLQlpZiAodW5saWtlbHkoc3BhcmNfbW1hcF9jaGVjayhhZGRyLCBvbGRfbGVuKSkpCi0JCWdvdG8gb3V0OwotCWlmICh1bmxpa2VseShzcGFyY19tbWFwX2NoZWNrKG5ld19hZGRyLCBuZXdfbGVuKSkpCi0JCWdvdG8gb3V0OwotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JcmV0ID0gZG9fbXJlbWFwKGFkZHIsIG9sZF9sZW4sIG5ld19sZW4sIGZsYWdzLCBuZXdfYWRkcik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsgICAgICAgCi19Ci0KIGxvbmcgc3lzMzJfbG9va3VwX2Rjb29raWUodW5zaWduZWQgbG9uZyBjb29raWVfaGlnaCwKIAkJCSAgdW5zaWduZWQgbG9uZyBjb29raWVfbG93LAogCQkJICBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjXzMyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmNfMzIuYwppbmRleCAwMzAzNWM4Li4zYTgyZTY1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmNfMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmNfMzIuYwpAQCAtNDUsNyArNDUsOCBAQAogCQkvKiBXZSBkbyBub3QgYWNjZXB0IGEgc2hhcmVkIG1hcHBpbmcgaWYgaXQgd291bGQgdmlvbGF0ZQogCQkgKiBjYWNoZSBhbGlhc2luZyBjb25zdHJhaW50cy4KIAkJICovCi0JCWlmICgoZmxhZ3MgJiBNQVBfU0hBUkVEKSAmJiAoYWRkciAmIChTSE1MQkEgLSAxKSkpCisJCWlmICgoZmxhZ3MgJiBNQVBfU0hBUkVEKSAmJgorCQkgICAgKChhZGRyIC0gKHBnb2ZmIDw8IFBBR0VfU0hJRlQpKSAmIChTSE1MQkEgLSAxKSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcmV0dXJuIGFkZHI7CiAJfQpAQCAtNzksMTUgKzgwLDYgQEAKIAl9CiB9CiAKLWFzbWxpbmthZ2UgdW5zaWduZWQgbG9uZyBzcGFyY19icmsodW5zaWduZWQgbG9uZyBicmspCi17Ci0JaWYoQVJDSF9TVU40QykgewotCQlpZiAoKGJyayAmIDB4ZTAwMDAwMDApICE9IChjdXJyZW50LT5tbS0+YnJrICYgMHhlMDAwMDAwMCkpCi0JCQlyZXR1cm4gY3VycmVudC0+bW0tPmJyazsKLQl9Ci0JcmV0dXJuIHN5c19icmsoYnJrKTsKLX0KLQogLyoKICAqIHN5c19waXBlKCkgaXMgdGhlIG5vcm1hbCBDIGNhbGxpbmcgc3RhbmRhcmQgZm9yIGNyZWF0aW5nCiAgKiBhIHBpcGUuIEl0J3Mgbm90IHRoZSB3YXkgdW5peCB0cmFkaXRpb25hbGx5IGRvZXMgdGhpcywgdGhvdWdoLgpAQCAtMjM0LDMxICsyMjYsNiBAQAogfQogCiAvKiBMaW51eCB2ZXJzaW9uIG9mIG1tYXAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRvX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCi0JdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIGZkLAotCXVuc2lnbmVkIGxvbmcgcGdvZmYpCi17Ci0Jc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIHJldHZhbCA9IC1FQkFERjsKLQotCWlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLQkJZmlsZSA9IGZnZXQoZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlsZW4gPSBQQUdFX0FMSUdOKGxlbik7Ci0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQlyZXR2YWwgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIHBnb2ZmKTsKLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOwotb3V0OgotCXJldHVybiByZXR2YWw7Ci19CiAKIGFzbWxpbmthZ2UgdW5zaWduZWQgbG9uZyBzeXNfbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKIAl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgZmQsCkBAIC0yNjYsMTQgKzIzMywxNiBAQAogewogCS8qIE1ha2Ugc3VyZSB0aGUgc2hpZnQgZm9yIG1tYXAyIGlzIGNvbnN0YW50ICgxMiksIG5vIG1hdHRlciB3aGF0IFBBR0VfU0laRQogCSAgIHdlIGhhdmUuICovCi0JcmV0dXJuIGRvX21tYXAyKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBwZ29mZiA+PiAoUEFHRV9TSElGVCAtIDEyKSk7CisJcmV0dXJuIHN5c19tbWFwX3Bnb2ZmKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLAorCQkJICAgICAgcGdvZmYgPj4gKFBBR0VfU0hJRlQgLSAxMikpOwogfQogCiBhc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc3lzX21tYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKIAl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgZmQsCiAJdW5zaWduZWQgbG9uZyBvZmYpCiB7Ci0JcmV0dXJuIGRvX21tYXAyKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBvZmYgPj4gUEFHRV9TSElGVCk7CisJLyogbm8gYWxpZ25tZW50IGNoZWNrPyAqLworCXJldHVybiBzeXNfbW1hcF9wZ29mZihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgb2ZmID4+IFBBR0VfU0hJRlQpOwogfQogCiBsb25nIHNwYXJjX3JlbWFwX2ZpbGVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplLApAQCAtMjg3LDI3ICsyNTYsNiBAQAogCQkJCSAgICAocGdvZmYgPj4gKFBBR0VfU0hJRlQgLSAxMikpLCBmbGFncyk7CiB9CiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGRvX21yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsCi0JdW5zaWduZWQgbG9uZyBvbGRfbGVuLCB1bnNpZ25lZCBsb25nIG5ld19sZW4sCi0JdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBuZXdfYWRkcik7Ci0gICAgICAgICAgICAgICAgCi1hc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc3BhcmNfbXJlbWFwKHVuc2lnbmVkIGxvbmcgYWRkciwKLQl1bnNpZ25lZCBsb25nIG9sZF9sZW4sIHVuc2lnbmVkIGxvbmcgbmV3X2xlbiwKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIG5ld19hZGRyKQotewotCXVuc2lnbmVkIGxvbmcgcmV0ID0gLUVJTlZBTDsKLQotCWlmICh1bmxpa2VseShzcGFyY19tbWFwX2NoZWNrKGFkZHIsIG9sZF9sZW4pKSkKLQkJZ290byBvdXQ7Ci0JaWYgKHVubGlrZWx5KHNwYXJjX21tYXBfY2hlY2sobmV3X2FkZHIsIG5ld19sZW4pKSkKLQkJZ290byBvdXQ7Ci0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQlyZXQgPSBkb19tcmVtYXAoYWRkciwgb2xkX2xlbiwgbmV3X2xlbiwgZmxhZ3MsIG5ld19hZGRyKTsKLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLW91dDoKLQlyZXR1cm4gcmV0OyAgICAgICAKLX0KLQogLyogd2UgY29tZSB0byBoZXJlIHZpYSBzeXNfbmlzX3N5c2NhbGwgc28gaXQgY2FuIHNldHVwIHRoZSByZWdzIGFyZ3VtZW50ICovCiBhc21saW5rYWdlIHVuc2lnbmVkIGxvbmcKIGNfc3lzX25pc19zeXNjYWxsIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyY182NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjXzY0LmMKaW5kZXggZTJkMTAyNC4uY2ZhMGUxOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjXzY0LmMKQEAgLTMxNywxMCArMzE3LDE0IEBACiB1bnNpZ25lZCBsb25nIGdldF9mYl91bm1hcHBlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIG9yaWdfYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgcGdvZmYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyBhbGlnbl9nb2FsLCBhZGRyID0gLUVOT01FTTsKKwl1bnNpZ25lZCBsb25nICgqZ2V0X2FyZWEpKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGxvbmcsCisJCQkJICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKKworCWdldF9hcmVhID0gY3VycmVudC0+bW0tPmdldF91bm1hcHBlZF9hcmVhOwogCiAJaWYgKGZsYWdzICYgTUFQX0ZJWEVEKSB7CiAJCS8qIE9rLCBkb24ndCBtZXNzIHdpdGggaXQuICovCi0JCXJldHVybiBnZXRfdW5tYXBwZWRfYXJlYShOVUxMLCBvcmlnX2FkZHIsIGxlbiwgcGdvZmYsIGZsYWdzKTsKKwkJcmV0dXJuIGdldF9hcmVhKE5VTEwsIG9yaWdfYWRkciwgbGVuLCBwZ29mZiwgZmxhZ3MpOwogCX0KIAlmbGFncyAmPSB+TUFQX1NIQVJFRDsKIApAQCAtMzMzLDcgKzMzNyw3IEBACiAJCWFsaWduX2dvYWwgPSAoNjRVTCAqIDEwMjQpOwogCiAJZG8gewotCQlhZGRyID0gZ2V0X3VubWFwcGVkX2FyZWEoTlVMTCwgb3JpZ19hZGRyLCBsZW4gKyAoYWxpZ25fZ29hbCAtIFBBR0VfU0laRSksIHBnb2ZmLCBmbGFncyk7CisJCWFkZHIgPSBnZXRfYXJlYShOVUxMLCBvcmlnX2FkZHIsIGxlbiArIChhbGlnbl9nb2FsIC0gUEFHRV9TSVpFKSwgcGdvZmYsIGZsYWdzKTsKIAkJaWYgKCEoYWRkciAmIH5QQUdFX01BU0spKSB7CiAJCQlhZGRyID0gKGFkZHIgKyAoYWxpZ25fZ29hbCAtIDFVTCkpICYgfihhbGlnbl9nb2FsIC0gMVVMKTsKIAkJCWJyZWFrOwpAQCAtMzUxLDcgKzM1NSw3IEBACiAJICogYmUgb2J0YWluZWQuCiAJICovCiAJaWYgKGFkZHIgJiB+UEFHRV9NQVNLKQotCQlhZGRyID0gZ2V0X3VubWFwcGVkX2FyZWEoTlVMTCwgb3JpZ19hZGRyLCBsZW4sIHBnb2ZmLCBmbGFncyk7CisJCWFkZHIgPSBnZXRfYXJlYShOVUxMLCBvcmlnX2FkZHIsIGxlbiwgcGdvZmYsIGZsYWdzKTsKIAogCXJldHVybiBhZGRyOwogfQpAQCAtMzk5LDE4ICs0MDMsNiBAQAogCX0KIH0KIAotU1lTQ0FMTF9ERUZJTkUxKHNwYXJjX2JyaywgdW5zaWduZWQgbG9uZywgYnJrKQotewotCS8qIFBlb3BsZSBjb3VsZCB0cnkgdG8gYmUgbmFzdHkgYW5kIHVzZSB0YSAweDZkIGluIDMyYml0IHByb2dyYW1zICovCi0JaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKSAmJiBicmsgPj0gU1RBQ0tfVE9QMzIpCi0JCXJldHVybiBjdXJyZW50LT5tbS0+YnJrOwotCi0JaWYgKHVubGlrZWx5KHN0cmFkZGxlc182NGJpdF92YV9ob2xlKGN1cnJlbnQtPm1tLT5icmssIGJyaykpKQotCQlyZXR1cm4gY3VycmVudC0+bW0tPmJyazsKLQotCXJldHVybiBzeXNfYnJrKGJyayk7Ci19Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAvKgogICogc3lzX3BpcGUoKSBpcyB0aGUgbm9ybWFsIEMgY2FsbGluZyBzdGFuZGFyZCBmb3IgY3JlYXRpbmcKICAqIGEgcGlwZS4gSXQncyBub3QgdGhlIHdheSB1bml4IHRyYWRpdGlvbmFsbHkgZG9lcyB0aGlzLCB0aG91Z2guCkBAIC01NjgsMjMgKzU2MCwxMyBAQAogCQl1bnNpZ25lZCBsb25nLCBwcm90LCB1bnNpZ25lZCBsb25nLCBmbGFncywgdW5zaWduZWQgbG9uZywgZmQsCiAJCXVuc2lnbmVkIGxvbmcsIG9mZikKIHsKLQlzdHJ1Y3QgZmlsZSAqIGZpbGUgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgcmV0dmFsID0gLUVCQURGOworCXVuc2lnbmVkIGxvbmcgcmV0dmFsID0gLUVJTlZBTDsKIAotCWlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLQkJZmlsZSA9IGZnZXQoZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlnb3RvIG91dDsKLQl9Ci0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCWxlbiA9IFBBR0VfQUxJR04obGVuKTsKLQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JcmV0dmFsID0gZG9fbW1hcChmaWxlLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCi0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7CisJaWYgKChvZmYgKyBQQUdFX0FMSUdOKGxlbikpIDwgb2ZmKQorCQlnb3RvIG91dDsKKwlpZiAob2ZmICYgflBBR0VfTUFTSykKKwkJZ290byBvdXQ7CisJcmV0dmFsID0gc3lzX21tYXBfcGdvZmYoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIG9mZiA+PiBQQUdFX1NISUZUKTsKIG91dDoKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtNjE0LDEyICs1OTYsNiBAQAogCiAJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKSkKIAkJZ290byBvdXQ7Ci0JaWYgKHVubGlrZWx5KG5ld19sZW4gPj0gVkFfRVhDTFVERV9TVEFSVCkpCi0JCWdvdG8gb3V0OwotCWlmICh1bmxpa2VseShzcGFyY19tbWFwX2NoZWNrKGFkZHIsIG9sZF9sZW4pKSkKLQkJZ290byBvdXQ7Ci0JaWYgKHVubGlrZWx5KHNwYXJjX21tYXBfY2hlY2sobmV3X2FkZHIsIG5ld19sZW4pKSkKLQkJZ290byBvdXQ7CiAKIAlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCXJldCA9IGRvX21yZW1hcChhZGRyLCBvbGRfbGVuLCBuZXdfbGVuLCBmbGFncywgbmV3X2FkZHIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJscy5oIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJscy5oCmluZGV4IGE2M2M1ZDIuLmQyZjk5OWEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHMuaAorKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzLmgKQEAgLTksNyArOSw2IEBACiBzdHJ1Y3QgbmV3X3V0c25hbWU7CiAKIGV4dGVybiBhc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc3lzX2dldHBhZ2VzaXplKHZvaWQpOwotZXh0ZXJuIGFzbWxpbmthZ2UgdW5zaWduZWQgbG9uZyBzcGFyY19icmsodW5zaWduZWQgbG9uZyBicmspOwogZXh0ZXJuIGFzbWxpbmthZ2UgbG9uZyBzcGFyY19waXBlKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiBhc21saW5rYWdlIGxvbmcgc3lzX2lwYyh1bnNpZ25lZCBpbnQgY2FsbCwgaW50IGZpcnN0LAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2Vjb25kLApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc18zMi5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc18zMi5TCmluZGV4IGNlYjE1MzAuLjgwMWZjOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHNfMzIuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzXzMyLlMKQEAgLTE5LDcgKzE5LDcgQEAKIC8qMCovCS5sb25nIHN5c19yZXN0YXJ0X3N5c2NhbGwsIHN5c19leGl0LCBzeXNfZm9yaywgc3lzX3JlYWQsIHN5c193cml0ZQogLyo1Ki8JLmxvbmcgc3lzX29wZW4sIHN5c19jbG9zZSwgc3lzX3dhaXQ0LCBzeXNfY3JlYXQsIHN5c19saW5rCiAvKjEwKi8gIC5sb25nIHN5c191bmxpbmssIHN1bm9zX2V4ZWN2LCBzeXNfY2hkaXIsIHN5c19jaG93bjE2LCBzeXNfbWtub2QKLS8qMTUqLwkubG9uZyBzeXNfY2htb2QsIHN5c19sY2hvd24xNiwgc3BhcmNfYnJrLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19sc2VlaworLyoxNSovCS5sb25nIHN5c19jaG1vZCwgc3lzX2xjaG93bjE2LCBzeXNfYnJrLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19sc2VlawogLyoyMCovCS5sb25nIHN5c19nZXRwaWQsIHN5c19jYXBnZXQsIHN5c19jYXBzZXQsIHN5c19zZXR1aWQxNiwgc3lzX2dldHVpZDE2CiAvKjI1Ki8JLmxvbmcgc3lzX3Ztc3BsaWNlLCBzeXNfcHRyYWNlLCBzeXNfYWxhcm0sIHN5c19zaWdhbHRzdGFjaywgc3lzX3BhdXNlCiAvKjMwKi8JLmxvbmcgc3lzX3V0aW1lLCBzeXNfbGNob3duLCBzeXNfZmNob3duLCBzeXNfYWNjZXNzLCBzeXNfbmljZQpAQCAtNjcsNyArNjcsNyBAQAogLyoyMzUqLwkubG9uZyBzeXNfZnN0YXRmczY0LCBzeXNfbGxzZWVrLCBzeXNfbWxvY2ssIHN5c19tdW5sb2NrLCBzeXNfbWxvY2thbGwKIC8qMjQwKi8JLmxvbmcgc3lzX211bmxvY2thbGwsIHN5c19zY2hlZF9zZXRwYXJhbSwgc3lzX3NjaGVkX2dldHBhcmFtLCBzeXNfc2NoZWRfc2V0c2NoZWR1bGVyLCBzeXNfc2NoZWRfZ2V0c2NoZWR1bGVyCiAvKjI0NSovCS5sb25nIHN5c19zY2hlZF95aWVsZCwgc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgsIHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWluLCBzeXNfc2NoZWRfcnJfZ2V0X2ludGVydmFsLCBzeXNfbmFub3NsZWVwCi0vKjI1MCovCS5sb25nIHNwYXJjX21yZW1hcCwgc3lzX3N5c2N0bCwgc3lzX2dldHNpZCwgc3lzX2ZkYXRhc3luYywgc3lzX25mc3NlcnZjdGwKKy8qMjUwKi8JLmxvbmcgc3lzX21yZW1hcCwgc3lzX3N5c2N0bCwgc3lzX2dldHNpZCwgc3lzX2ZkYXRhc3luYywgc3lzX25mc3NlcnZjdGwKIC8qMjU1Ki8JLmxvbmcgc3lzX3N5bmNfZmlsZV9yYW5nZSwgc3lzX2Nsb2NrX3NldHRpbWUsIHN5c19jbG9ja19nZXR0aW1lLCBzeXNfY2xvY2tfZ2V0cmVzLCBzeXNfY2xvY2tfbmFub3NsZWVwCiAvKjI2MCovCS5sb25nIHN5c19zY2hlZF9nZXRhZmZpbml0eSwgc3lzX3NjaGVkX3NldGFmZmluaXR5LCBzeXNfdGltZXJfc2V0dGltZSwgc3lzX3RpbWVyX2dldHRpbWUsIHN5c190aW1lcl9nZXRvdmVycnVuCiAvKjI2NSovCS5sb25nIHN5c190aW1lcl9kZWxldGUsIHN5c190aW1lcl9jcmVhdGUsIHN5c19uaXNfc3lzY2FsbCwgc3lzX2lvX3NldHVwLCBzeXNfaW9fZGVzdHJveQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc182NC5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc182NC5TCmluZGV4IGNjOGU3ODYuLmU1NzViNDYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHNfNjQuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzXzY0LlMKQEAgLTIxLDcgKzIxLDcgQEAKIC8qMCovCS53b3JkIHN5c19yZXN0YXJ0X3N5c2NhbGwsIHN5czMyX2V4aXQsIHN5c19mb3JrLCBzeXNfcmVhZCwgc3lzX3dyaXRlCiAvKjUqLwkud29yZCBzeXMzMl9vcGVuLCBzeXNfY2xvc2UsIHN5czMyX3dhaXQ0LCBzeXMzMl9jcmVhdCwgc3lzX2xpbmsKIC8qMTAqLyAgLndvcmQgc3lzX3VubGluaywgc3Vub3NfZXhlY3YsIHN5c19jaGRpciwgc3lzX2Nob3duMTYsIHN5czMyX21rbm9kCi0vKjE1Ki8JLndvcmQgc3lzX2NobW9kLCBzeXNfbGNob3duMTYsIHN5c19zcGFyY19icmssIHN5czMyX3BlcmZjdHIsIHN5czMyX2xzZWVrCisvKjE1Ki8JLndvcmQgc3lzX2NobW9kLCBzeXNfbGNob3duMTYsIHN5c19icmssIHN5czMyX3BlcmZjdHIsIHN5czMyX2xzZWVrCiAvKjIwKi8JLndvcmQgc3lzX2dldHBpZCwgc3lzX2NhcGdldCwgc3lzX2NhcHNldCwgc3lzX3NldHVpZDE2LCBzeXNfZ2V0dWlkMTYKIC8qMjUqLwkud29yZCBzeXMzMl92bXNwbGljZSwgY29tcGF0X3N5c19wdHJhY2UsIHN5c19hbGFybSwgc3lzMzJfc2lnYWx0c3RhY2ssIHN5c19wYXVzZQogLyozMCovCS53b3JkIGNvbXBhdF9zeXNfdXRpbWUsIHN5c19sY2hvd24sIHN5c19mY2hvd24sIHN5czMyX2FjY2Vzcywgc3lzMzJfbmljZQpAQCAtNjgsNyArNjgsNyBAQAogCS53b3JkIGNvbXBhdF9zeXNfZnN0YXRmczY0LCBzeXNfbGxzZWVrLCBzeXNfbWxvY2ssIHN5c19tdW5sb2NrLCBzeXMzMl9tbG9ja2FsbAogLyoyNDAqLwkud29yZCBzeXNfbXVubG9ja2FsbCwgc3lzMzJfc2NoZWRfc2V0cGFyYW0sIHN5czMyX3NjaGVkX2dldHBhcmFtLCBzeXMzMl9zY2hlZF9zZXRzY2hlZHVsZXIsIHN5czMyX3NjaGVkX2dldHNjaGVkdWxlcgogCS53b3JkIHN5c19zY2hlZF95aWVsZCwgc3lzMzJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heCwgc3lzMzJfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiwgc3lzMzJfc2NoZWRfcnJfZ2V0X2ludGVydmFsLCBjb21wYXRfc3lzX25hbm9zbGVlcAotLyoyNTAqLwkud29yZCBzeXMzMl9tcmVtYXAsIGNvbXBhdF9zeXNfc3lzY3RsLCBzeXMzMl9nZXRzaWQsIHN5c19mZGF0YXN5bmMsIHN5czMyX25mc3NlcnZjdGwKKy8qMjUwKi8JLndvcmQgc3lzX21yZW1hcCwgY29tcGF0X3N5c19zeXNjdGwsIHN5czMyX2dldHNpZCwgc3lzX2ZkYXRhc3luYywgc3lzMzJfbmZzc2VydmN0bAogCS53b3JkIHN5czMyX3N5bmNfZmlsZV9yYW5nZSwgY29tcGF0X3N5c19jbG9ja19zZXR0aW1lLCBjb21wYXRfc3lzX2Nsb2NrX2dldHRpbWUsIGNvbXBhdF9zeXNfY2xvY2tfZ2V0cmVzLCBzeXMzMl9jbG9ja19uYW5vc2xlZXAKIC8qMjYwKi8JLndvcmQgY29tcGF0X3N5c19zY2hlZF9nZXRhZmZpbml0eSwgY29tcGF0X3N5c19zY2hlZF9zZXRhZmZpbml0eSwgc3lzMzJfdGltZXJfc2V0dGltZSwgY29tcGF0X3N5c190aW1lcl9nZXR0aW1lLCBzeXNfdGltZXJfZ2V0b3ZlcnJ1bgogCS53b3JkIHN5c190aW1lcl9kZWxldGUsIGNvbXBhdF9zeXNfdGltZXJfY3JlYXRlLCBzeXNfbmlfc3lzY2FsbCwgY29tcGF0X3N5c19pb19zZXR1cCwgc3lzX2lvX2Rlc3Ryb3kKQEAgLTk2LDcgKzk2LDcgQEAKIC8qMCovCS53b3JkIHN5c19yZXN0YXJ0X3N5c2NhbGwsIHNwYXJjX2V4aXQsIHN5c19mb3JrLCBzeXNfcmVhZCwgc3lzX3dyaXRlCiAvKjUqLwkud29yZCBzeXNfb3Blbiwgc3lzX2Nsb3NlLCBzeXNfd2FpdDQsIHN5c19jcmVhdCwgc3lzX2xpbmsKIC8qMTAqLyAgLndvcmQgc3lzX3VubGluaywgc3lzX25pc19zeXNjYWxsLCBzeXNfY2hkaXIsIHN5c19jaG93biwgc3lzX21rbm9kCi0vKjE1Ki8JLndvcmQgc3lzX2NobW9kLCBzeXNfbGNob3duLCBzeXNfc3BhcmNfYnJrLCBzeXNfcGVyZmN0ciwgc3lzX2xzZWVrCisvKjE1Ki8JLndvcmQgc3lzX2NobW9kLCBzeXNfbGNob3duLCBzeXNfYnJrLCBzeXNfcGVyZmN0ciwgc3lzX2xzZWVrCiAvKjIwKi8JLndvcmQgc3lzX2dldHBpZCwgc3lzX2NhcGdldCwgc3lzX2NhcHNldCwgc3lzX3NldHVpZCwgc3lzX2dldHVpZAogLyoyNSovCS53b3JkIHN5c192bXNwbGljZSwgc3lzX3B0cmFjZSwgc3lzX2FsYXJtLCBzeXNfc2lnYWx0c3RhY2ssIHN5c19uaXNfc3lzY2FsbAogLyozMCovCS53b3JkIHN5c191dGltZSwgc3lzX25pc19zeXNjYWxsLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19hY2Nlc3MsIHN5c19uaWNlCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9zeXNjYWxsLmMgYi9hcmNoL3VtL2tlcm5lbC9zeXNjYWxsLmMKaW5kZXggYTQ2MjVjNy4uY2NjYWI4NSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc3lzY2FsbC5jCisrKyBiL2FyY2gvdW0va2VybmVsL3N5c2NhbGwuYwpAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlICJsaW51eC9tbS5oIgogI2luY2x1ZGUgImxpbnV4L3NjaGVkLmgiCiAjaW5jbHVkZSAibGludXgvdXRzbmFtZS5oIgorI2luY2x1ZGUgImxpbnV4L3N5c2NhbGxzLmgiCiAjaW5jbHVkZSAiYXNtL2N1cnJlbnQuaCIKICNpbmNsdWRlICJhc20vbW1hbi5oIgogI2luY2x1ZGUgImFzbS91YWNjZXNzLmgiCkBAIC0zNywzMSArMzgsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIGNvbW1vbiBjb2RlIGZvciBvbGQgYW5kIG5ldyBtbWFwcyAqLwotbG9uZyBzeXNfbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkgICAgICAgdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAotCSAgICAgICB1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCWxvbmcgZXJyb3IgPSAtRUJBREY7Ci0Jc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKLQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCi0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci0gb3V0OgotCXJldHVybiBlcnJvcjsKLX0KLQogbG9uZyBvbGRfbW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAogCSAgICAgIHVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKIAkgICAgICB1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKQEAgLTcwLDcgKzQ2LDcgQEAKIAlpZiAob2Zmc2V0ICYgflBBR0VfTUFTSykKIAkJZ290byBvdXQ7CiAKLQllcnIgPSBzeXNfbW1hcDIoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIG9mZnNldCA+PiBQQUdFX1NISUZUKTsKKwllcnIgPSBzeXNfbW1hcF9wZ29mZihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgb2Zmc2V0ID4+IFBBR0VfU0hJRlQpOwogIG91dDoKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL3N5c2NhbGxzLmggYi9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvc3lzY2FsbHMuaAppbmRleCA5MDU2OTgxLi5lNzc4NzY3IDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvc3lzY2FsbHMuaAorKysgYi9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvc3lzY2FsbHMuaApAQCAtMjAsNyArMjAsMyBAQAogI2RlZmluZSBFWEVDVVRFX1NZU0NBTEwoc3lzY2FsbCwgcmVncykgXAogCSgobG9uZyAoKikoc3RydWN0IHN5c2NhbGxfYXJncykpIFwKIAkgKCpzeXNfY2FsbF90YWJsZVtzeXNjYWxsXSkpKFNZU0NBTExfQVJHUygmcmVncy0+cmVncykpCi0KLWV4dGVybiBsb25nIHN5c19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAotCQkgICAgICB1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JCSAgICAgIHVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvS2NvbmZpZy5kZWJ1ZyBiL2FyY2gveDg2L0tjb25maWcuZGVidWcKaW5kZXggNzMxMzE4ZS4uYmMwMWUzZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL3g4Ni9LY29uZmlnLmRlYnVnCkBAIC0xODcsOCArMTg3LDggQEAKIAlkZWZfYm9vbCB5CiAKIGNvbmZpZyBYODZfREVDT0RFUl9TRUxGVEVTVAotICAgICBib29sICJ4ODYgaW5zdHJ1Y3Rpb24gZGVjb2RlciBzZWxmdGVzdCIKLSAgICAgZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwlib29sICJ4ODYgaW5zdHJ1Y3Rpb24gZGVjb2RlciBzZWxmdGVzdCIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBLUFJPQkVTCiAJLS0taGVscC0tLQogCSBQZXJmb3JtIHg4NiBpbnN0cnVjdGlvbiBkZWNvZGVyIHNlbGZ0ZXN0cyBhdCBidWlsZCB0aW1lLgogCSBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgZm9yIGNoZWNraW5nIHRoZSBzYW5pdHkgb2YgeDg2IGluc3RydWN0aW9uCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pYTMyL2lhMzJlbnRyeS5TIGIvYXJjaC94ODYvaWEzMi9pYTMyZW50cnkuUwppbmRleCA0ZWVmZGNhLi41MzE0N2FkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pYTMyL2lhMzJlbnRyeS5TCisrKyBiL2FyY2gveDg2L2lhMzIvaWEzMmVudHJ5LlMKQEAgLTY5Niw3ICs2OTYsNyBAQAogCS5xdWFkIHF1aWV0X25pX3N5c2NhbGwJCS8qIHN0cmVhbXMyICovCiAJLnF1YWQgc3R1YjMyX3Zmb3JrICAgICAgICAgICAgLyogMTkwICovCiAJLnF1YWQgY29tcGF0X3N5c19nZXRybGltaXQKLQkucXVhZCBzeXMzMl9tbWFwMgorCS5xdWFkIHN5c19tbWFwX3Bnb2ZmCiAJLnF1YWQgc3lzMzJfdHJ1bmNhdGU2NAogCS5xdWFkIHN5czMyX2Z0cnVuY2F0ZTY0CiAJLnF1YWQgc3lzMzJfc3RhdDY0CQkvKiAxOTUgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2lhMzIvc3lzX2lhMzIuYyBiL2FyY2gveDg2L2lhMzIvc3lzX2lhMzIuYwppbmRleCBkZjgyYzBlLi40MjI1NzJjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pYTMyL3N5c19pYTMyLmMKKysrIGIvYXJjaC94ODYvaWEzMi9zeXNfaWEzMi5jCkBAIC0xNTUsOSArMTU1LDYgQEAKIGFzbWxpbmthZ2UgbG9uZyBzeXMzMl9tbWFwKHN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3QgX191c2VyICphcmcpCiB7CiAJc3RydWN0IG1tYXBfYXJnX3N0cnVjdCBhOwotCXN0cnVjdCBmaWxlICpmaWxlID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIHJldHZhbDsKLQlzdHJ1Y3QgbW1fc3RydWN0ICptbSA7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmEsIGFyZywgc2l6ZW9mKGEpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0xNjUsMjIgKzE2Miw4IEBACiAJaWYgKGEub2Zmc2V0ICYgflBBR0VfTUFTSykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIShhLmZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLQkJZmlsZSA9IGZnZXQoYS5mZCk7Ci0JCWlmICghZmlsZSkKLQkJCXJldHVybiAtRUJBREY7Ci0JfQotCi0JbW0gPSBjdXJyZW50LT5tbTsKLQlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwotCXJldHZhbCA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLAorCXJldHVybiBzeXNfbW1hcF9wZ29mZihhLmFkZHIsIGEubGVuLCBhLnByb3QsIGEuZmxhZ3MsIGEuZmQsCiAJCQkgICAgICAgYS5vZmZzZXQ+PlBBR0VfU0hJRlQpOwotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOwotCi0JdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7Ci0KLQlyZXR1cm4gcmV0dmFsOwogfQogCiBhc21saW5rYWdlIGxvbmcgc3lzMzJfbXByb3RlY3QodW5zaWduZWQgbG9uZyBzdGFydCwgc2l6ZV90IGxlbiwKQEAgLTQ4MywzMCArNDY2LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJCSAgICB1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLQlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwotCXVuc2lnbmVkIGxvbmcgZXJyb3I7Ci0Jc3RydWN0IGZpbGUgKmZpbGUgPSBOVUxMOwotCi0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCWlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLQkJZmlsZSA9IGZnZXQoZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlyZXR1cm4gLUVCQURGOwotCX0KLQotCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7Ci0JZXJyb3IgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIHBnb2ZmKTsKLQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOwotCXJldHVybiBlcnJvcjsKLX0KLQogYXNtbGlua2FnZSBsb25nIHN5czMyX29sZHVuYW1lKHN0cnVjdCBvbGRvbGRfdXRzbmFtZSBfX3VzZXIgKm5hbWUpCiB7CiAJY2hhciAqYXJjaCA9ICJ4ODZfNjQiOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX2lvbW11X3Byb3RvLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbWRfaW9tbXVfcHJvdG8uaAppbmRleCA4NDc4NmZiLi40ZDgxN2Y5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbWRfaW9tbXVfcHJvdG8uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbWRfaW9tbXVfcHJvdG8uaApAQCAtMjgsNyArMjgsOSBAQAogZXh0ZXJuIHZvaWQgYW1kX2lvbW11X2ZsdXNoX2FsbF9kZXZpY2VzKHZvaWQpOwogZXh0ZXJuIHZvaWQgYW1kX2lvbW11X2FwcGx5X2VycmF0dW1fNjModTE2IGRldmlkKTsKIGV4dGVybiB2b2lkIGFtZF9pb21tdV9yZXNldF9jbWRfYnVmZmVyKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KTsKLQorZXh0ZXJuIGludCBhbWRfaW9tbXVfaW5pdF9kZXZpY2VzKHZvaWQpOworZXh0ZXJuIHZvaWQgYW1kX2lvbW11X3VuaW5pdF9kZXZpY2VzKHZvaWQpOworZXh0ZXJuIHZvaWQgYW1kX2lvbW11X2luaXRfbm90aWZpZXIodm9pZCk7CiAjaWZuZGVmIENPTkZJR19BTURfSU9NTVVfU1RBVFMKIAogc3RhdGljIGlubGluZSB2b2lkIGFtZF9pb21tdV9zdGF0c19pbml0KHZvaWQpIHsgfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGNpX3g4Ni5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGNpX3g4Ni5oCmluZGV4IGIzOTk5ODguLmI0YmY5YTkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaV94ODYuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wY2lfeDg2LmgKQEAgLTExOCwxMSArMTE4LDI3IEBACiAKIC8qIHBjaS1tbWNvbmZpZy5jICovCiAKKy8qICJQQ0kgTU1DT05GSUcgJTA0eCBbYnVzICUwMngtJTAyeF0iICovCisjZGVmaW5lIFBDSV9NTUNGR19SRVNPVVJDRV9OQU1FX0xFTiAoMjIgKyA0ICsgMiArIDIpCisKK3N0cnVjdCBwY2lfbW1jZmdfcmVnaW9uIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwl1NjQgYWRkcmVzczsKKwljaGFyIF9faW9tZW0gKnZpcnQ7CisJdTE2IHNlZ21lbnQ7CisJdTggc3RhcnRfYnVzOworCXU4IGVuZF9idXM7CisJY2hhciBuYW1lW1BDSV9NTUNGR19SRVNPVVJDRV9OQU1FX0xFTl07Cit9OworCiBleHRlcm4gaW50IF9faW5pdCBwY2lfbW1jZmdfYXJjaF9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IHBjaV9tbWNmZ19hcmNoX2ZyZWUodm9pZCk7CitleHRlcm4gc3RydWN0IHBjaV9tbWNmZ19yZWdpb24gKnBjaV9tbWNvbmZpZ19sb29rdXAoaW50IHNlZ21lbnQsIGludCBidXMpOwogCi1leHRlcm4gc3RydWN0IGFjcGlfbWNmZ19hbGxvY2F0aW9uICpwY2lfbW1jZmdfY29uZmlnOwotZXh0ZXJuIGludCBwY2lfbW1jZmdfY29uZmlnX251bTsKK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHBjaV9tbWNmZ19saXN0OworCisjZGVmaW5lIFBDSV9NTUNGR19CVVNfT0ZGU0VUKGJ1cykgICAgICAoKGJ1cykgPDwgMjApCiAKIC8qCiAgKiBBTUQgRmFtMTBoIENQVXMgYXJlIGJ1Z2d5LCBhbmQgY2Fubm90IGFjY2VzcyBNTUlPIGNvbmZpZyBzcGFjZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3lzX2lhMzIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N5c19pYTMyLmgKaW5kZXggOWFmOWRlYy4uNGE1YTA4OWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N5c19pYTMyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3lzX2lhMzIuaApAQCAtNTcsOSArNTcsNiBAQAogYXNtbGlua2FnZSBsb25nIHN5czMyX3BlcnNvbmFsaXR5KHVuc2lnbmVkIGxvbmcpOwogYXNtbGlua2FnZSBsb25nIHN5czMyX3NlbmRmaWxlKGludCwgaW50LCBjb21wYXRfb2ZmX3QgX191c2VyICosIHMzMik7CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9tbWFwMih1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAotCQkJICAgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwotCiBzdHJ1Y3Qgb2xkb2xkX3V0c25hbWU7CiBzdHJ1Y3Qgb2xkX3V0c25hbWU7CiBhc21saW5rYWdlIGxvbmcgc3lzMzJfb2xkdW5hbWUoc3RydWN0IG9sZG9sZF91dHNuYW1lIF9fdXNlciAqKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N5c2NhbGxzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zeXNjYWxscy5oCmluZGV4IDM3MmI3NmUuLjFiYjZlMzkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N5c2NhbGxzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3lzY2FsbHMuaApAQCAtNTUsOCArNTUsNiBAQAogc3RydWN0IG9sZG9sZF91dHNuYW1lOwogc3RydWN0IG9sZF91dHNuYW1lOwogCi1hc21saW5rYWdlIGxvbmcgc3lzX21tYXAyKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCi0JCQkgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogYXNtbGlua2FnZSBpbnQgb2xkX21tYXAoc3RydWN0IG1tYXBfYXJnX3N0cnVjdCBfX3VzZXIgKik7CiBhc21saW5rYWdlIGludCBvbGRfc2VsZWN0KHN0cnVjdCBzZWxfYXJnX3N0cnVjdCBfX3VzZXIgKik7CiBhc21saW5rYWdlIGludCBzeXNfaXBjKHVpbnQsIGludCwgaW50LCBpbnQsIHZvaWQgX191c2VyICosIGxvbmcpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3lzdGVtLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zeXN0ZW0uaAppbmRleCAwMjJhODQzLi5lY2I1NDRlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zeXN0ZW0uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zeXN0ZW0uaApAQCAtMjMsNiArMjMsNyBAQAogc3RydWN0IHRzc19zdHJ1Y3Q7CiB2b2lkIF9fc3dpdGNoX3RvX3h0cmEoc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2X3AsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dF9wLAogCQkgICAgICBzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzKTsKK2V4dGVybiB2b2lkIHNob3dfcmVnc19jb21tb24odm9pZCk7CiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9oeXBlcnZpc29yLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vaHlwZXJ2aXNvci5oCmluZGV4IGQ1YjdlOTAuLjM5NmZmNGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9oeXBlcnZpc29yLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2h5cGVydmlzb3IuaApAQCAtMzcsMzEgKzM3LDQgQEAKIGV4dGVybiBzdHJ1Y3Qgc2hhcmVkX2luZm8gKkhZUEVSVklTT1Jfc2hhcmVkX2luZm87CiBleHRlcm4gc3RydWN0IHN0YXJ0X2luZm8gKnhlbl9zdGFydF9pbmZvOwogCi1lbnVtIHhlbl9kb21haW5fdHlwZSB7Ci0JWEVOX05BVElWRSwJCS8qIHJ1bm5pbmcgb24gYmFyZSBoYXJkd2FyZSAgICAqLwotCVhFTl9QVl9ET01BSU4sCQkvKiBydW5uaW5nIGluIGEgUFYgZG9tYWluICAgICAgKi8KLQlYRU5fSFZNX0RPTUFJTiwJCS8qIHJ1bm5pbmcgaW4gYSBYZW4gaHZtIGRvbWFpbiAqLwotfTsKLQotI2lmZGVmIENPTkZJR19YRU4KLWV4dGVybiBlbnVtIHhlbl9kb21haW5fdHlwZSB4ZW5fZG9tYWluX3R5cGU7Ci0jZWxzZQotI2RlZmluZSB4ZW5fZG9tYWluX3R5cGUJCVhFTl9OQVRJVkUKLSNlbmRpZgotCi0jZGVmaW5lIHhlbl9kb21haW4oKQkJKHhlbl9kb21haW5fdHlwZSAhPSBYRU5fTkFUSVZFKQotI2RlZmluZSB4ZW5fcHZfZG9tYWluKCkJCSh4ZW5fZG9tYWluKCkgJiYJCQlcCi0JCQkJIHhlbl9kb21haW5fdHlwZSA9PSBYRU5fUFZfRE9NQUlOKQotI2RlZmluZSB4ZW5faHZtX2RvbWFpbigpCSh4ZW5fZG9tYWluKCkgJiYJCQlcCi0JCQkJIHhlbl9kb21haW5fdHlwZSA9PSBYRU5fSFZNX0RPTUFJTikKLQotI2lmZGVmIENPTkZJR19YRU5fRE9NMAotI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UveGVuLmg+Ci0KLSNkZWZpbmUgeGVuX2luaXRpYWxfZG9tYWluKCkJKHhlbl9wdl9kb21haW4oKSAmJiBcCi0JCQkJIHhlbl9zdGFydF9pbmZvLT5mbGFncyAmIFNJRl9JTklURE9NQUlOKQotI2Vsc2UgIC8qICFDT05GSUdfWEVOX0RPTTAgKi8KLSNkZWZpbmUgeGVuX2luaXRpYWxfZG9tYWluKCkJKDApCi0jZW5kaWYJLyogQ09ORklHX1hFTl9ET00wICovCi0KICNlbmRpZiAvKiBfQVNNX1g4Nl9YRU5fSFlQRVJWSVNPUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11LmMKaW5kZXggMWMwZmI0ZC4uYjk5MGI1YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUuYwpAQCAtMTY2LDYgKzE2Niw0MyBAQAogewogCWtmcmVlKGRldi0+YXJjaGRhdGEuaW9tbXUpOwogfQorCit2b2lkIF9faW5pdCBhbWRfaW9tbXVfdW5pbml0X2RldmljZXModm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisKKwlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKKworCQlpZiAoIWNoZWNrX2RldmljZSgmcGRldi0+ZGV2KSkKKwkJCWNvbnRpbnVlOworCisJCWlvbW11X3VuaW5pdF9kZXZpY2UoJnBkZXYtPmRldik7CisJfQorfQorCitpbnQgX19pbml0IGFtZF9pb21tdV9pbml0X2RldmljZXModm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKKworCQlpZiAoIWNoZWNrX2RldmljZSgmcGRldi0+ZGV2KSkKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IGlvbW11X2luaXRfZGV2aWNlKCZwZGV2LT5kZXYpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWU6CisKKwlhbWRfaW9tbXVfdW5pbml0X2RldmljZXMoKTsKKworCXJldHVybiByZXQ7Cit9CiAjaWZkZWYgQ09ORklHX0FNRF9JT01NVV9TVEFUUwogCiAvKgpAQCAtMTU4Nyw2ICsxNjI0LDExIEBACiAJLm5vdGlmaWVyX2NhbGwgPSBkZXZpY2VfY2hhbmdlX25vdGlmaWVyLAogfTsKIAordm9pZCBhbWRfaW9tbXVfaW5pdF9ub3RpZmllcih2b2lkKQoreworCWJ1c19yZWdpc3Rlcl9ub3RpZmllcigmcGNpX2J1c190eXBlLCAmZGV2aWNlX25iKTsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogVGhlIG5leHQgZnVuY3Rpb25zIGJlbG9uZyB0byB0aGUgZG1hX29wcyBtYXBwaW5nL3VubWFwcGluZyBjb2RlLgpAQCAtMjE0NSw4ICsyMTg3LDYgQEAKIAkJaWYgKCFjaGVja19kZXZpY2UoJmRldi0+ZGV2KSkKIAkJCWNvbnRpbnVlOwogCi0JCWlvbW11X2luaXRfZGV2aWNlKCZkZXYtPmRldik7Ci0KIAkJLyogSXMgdGhlcmUgYWxyZWFkeSBhbnkgZG9tYWluIGZvciBpdD8gKi8KIAkJaWYgKGRvbWFpbl9mb3JfZGV2aWNlKCZkZXYtPmRldikpCiAJCQljb250aW51ZTsKQEAgLTIyMTUsOCArMjI1NSw2IEBACiAKIAlyZWdpc3Rlcl9pb21tdSgmYW1kX2lvbW11X29wcyk7CiAKLQlidXNfcmVnaXN0ZXJfbm90aWZpZXIoJnBjaV9idXNfdHlwZSwgJmRldmljZV9uYik7Ci0KIAlhbWRfaW9tbXVfc3RhdHNfaW5pdCgpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11X2luaXQuYyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXVfaW5pdC5jCmluZGV4IDdmZmMzOTkuLjFkY2E5YzMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXVfaW5pdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXVfaW5pdC5jCkBAIC0xMjc0LDYgKzEyNzQsMTAgQEAKIAlpZiAocmV0KQogCQlnb3RvIGZyZWU7CiAKKwlyZXQgPSBhbWRfaW9tbXVfaW5pdF9kZXZpY2VzKCk7CisJaWYgKHJldCkKKwkJZ290byBmcmVlOworCiAJaWYgKGlvbW11X3Bhc3NfdGhyb3VnaCkKIAkJcmV0ID0gYW1kX2lvbW11X2luaXRfcGFzc3Rocm91Z2goKTsKIAllbHNlCkBAIC0xMjgxLDYgKzEyODUsOCBAQAogCWlmIChyZXQpCiAJCWdvdG8gZnJlZTsKIAorCWFtZF9pb21tdV9pbml0X25vdGlmaWVyKCk7CisKIAllbmFibGVfaW9tbXVzKCk7CiAKIAlpZiAoaW9tbXVfcGFzc190aHJvdWdoKQpAQCAtMTI5Niw2ICsxMzAyLDkgQEAKIAlyZXR1cm4gcmV0OwogCiBmcmVlOgorCisJYW1kX2lvbW11X3VuaW5pdF9kZXZpY2VzKCk7CisKIAlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWFtZF9pb21tdV9wZF9hbGxvY19iaXRtYXAsCiAJCSAgIGdldF9vcmRlcihNQVhfRE9NQUlOX0lELzgpKTsKIApAQCAtMTMzNiw2ICsxMzQ1LDkgQEAKIAkJaW9tbXVfZGV0ZWN0ZWQgPSAxOwogCQlhbWRfaW9tbXVfZGV0ZWN0ZWQgPSAxOwogCQl4ODZfaW5pdC5pb21tdS5pb21tdV9pbml0ID0gYW1kX2lvbW11X2luaXQ7CisKKwkJLyogTWFrZSBzdXJlIEFDUyB3aWxsIGJlIGVuYWJsZWQgKi8KKwkJcGNpX3JlcXVlc3RfYWNzKCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX25vb3AuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbm9vcC5jCmluZGV4IGQ5YWNjM2IuLmUzMWI5ZmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbm9vcC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbm9vcC5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIAogc3RhdGljIHZvaWQgbm9vcF9hcGljX3dyaXRlKHUzMiByZWcsIHUzMiB2KQogewotCVdBUk5fT05fT05DRSgoY3B1X2hhc19hcGljIHx8ICFkaXNhYmxlX2FwaWMpKTsKKwlXQVJOX09OX09OQ0UoY3B1X2hhc19hcGljICYmICFkaXNhYmxlX2FwaWMpOwogfQogCiBzdHJ1Y3QgYXBpYyBhcGljX25vb3AgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9lczcwMDBfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2VzNzAwMF8zMi5jCmluZGV4IGU4NWY4ZmIuLmRkMmI1ZjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2VzNzAwMF8zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2VzNzAwMF8zMi5jCkBAIC0yNyw2ICsyNyw5IEBACiAgKgogICogaHR0cDovL3d3dy51bmlzeXMuY29tCiAgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KQEAgLTIyMyw5ICsyMjYsOSBAQAogCQkJbWlwX2FkZHIgPSB2YWw7CiAJCQltaXAgPSAoc3RydWN0IG1pcF9yZWcgKil2YWw7CiAJCQltaXBfcmVnID0gX192YShtaXApOwotCQkJcHJfZGVidWcoImVzNzAwMF9taXBjZmc6IGhvc3RfcmVnID0gMHglbHggXG4iLAorCQkJcHJfZGVidWcoImhvc3RfcmVnID0gMHglbHhcbiIsCiAJCQkJICh1bnNpZ25lZCBsb25nKWhvc3RfcmVnKTsKLQkJCXByX2RlYnVnKCJlczcwMDBfbWlwY2ZnOiBtaXBfcmVnID0gMHglbHggXG4iLAorCQkJcHJfZGVidWcoIm1pcF9yZWcgPSAweCVseFxuIiwKIAkJCQkgKHVuc2lnbmVkIGxvbmcpbWlwX3JlZyk7CiAJCQlzdWNjZXNzKys7CiAJCQlicmVhazsKQEAgLTQwMSw3ICs0MDQsNyBAQAogCWlmICghZXM3MDAwX3BsYXQpCiAJCXJldHVybjsKIAotCXByaW50ayhLRVJOX0lORk8gIkVTNzAwMDogRW5hYmxpbmcgQVBJQyBtb2RlLlxuIik7CisJcHJfaW5mbygiRW5hYmxpbmcgQVBJQyBtb2RlLlxuIik7CiAJbWVtc2V0KCZlczcwMDBfbWlwX3JlZywgMCwgc2l6ZW9mKHN0cnVjdCBtaXBfcmVnKSk7CiAJZXM3MDAwX21pcF9yZWcub2ZmXzB4MDAgPSBNSVBfU1dfQVBJQzsKIAllczcwMDBfbWlwX3JlZy5vZmZfMHgzOCA9IE1JUF9WQUxJRDsKQEAgLTUxNCw4ICs1MTcsNyBAQAogewogCWludCBhcGljID0gcGVyX2NwdSh4ODZfYmlvc19jcHVfYXBpY2lkLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCi0JcHJpbnRrKEtFUk5fSU5GTwotCSAgIkVuYWJsaW5nIEFQSUMgbW9kZTogICVzLiBVc2luZyAlZCBJL08gQVBJQ3MsIHRhcmdldCBjcHVzICVseFxuIiwKKwlwcl9pbmZvKCJFbmFibGluZyBBUElDIG1vZGU6ICAlcy4gVXNpbmcgJWQgSS9PIEFQSUNzLCB0YXJnZXQgY3B1cyAlbHhcbiIsCiAJCShhcGljX3ZlcnNpb25bYXBpY10gPT0gMHgxNCkgPwogCQkJIlBoeXNpY2FsIENsdXN0ZXIiIDogIkxvZ2ljYWwgQ2x1c3RlciIsCiAJCW5yX2lvYXBpY3MsIGNwdW1hc2tfYml0cyhlczcwMDBfdGFyZ2V0X2NwdXMoKSlbMF0pOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCmluZGV4IDhiNTgxZDMuLmQyZTdjNzcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKQEAgLTc2NCwxNCArNzY0LDE1IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIGFjcGlfY3B1ZnJlcV9kcml2ZXIgPSB7Ci0JLnZlcmlmeSA9IGFjcGlfY3B1ZnJlcV92ZXJpZnksCi0JLnRhcmdldCA9IGFjcGlfY3B1ZnJlcV90YXJnZXQsCi0JLmluaXQgPSBhY3BpX2NwdWZyZXFfY3B1X2luaXQsCi0JLmV4aXQgPSBhY3BpX2NwdWZyZXFfY3B1X2V4aXQsCi0JLnJlc3VtZSA9IGFjcGlfY3B1ZnJlcV9yZXN1bWUsCi0JLm5hbWUgPSAiYWNwaS1jcHVmcmVxIiwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkuYXR0ciA9IGFjcGlfY3B1ZnJlcV9hdHRyLAorCS52ZXJpZnkJCT0gYWNwaV9jcHVmcmVxX3ZlcmlmeSwKKwkudGFyZ2V0CQk9IGFjcGlfY3B1ZnJlcV90YXJnZXQsCisJLmJpb3NfbGltaXQJPSBhY3BpX3Byb2Nlc3Nvcl9nZXRfYmlvc19saW1pdCwKKwkuaW5pdAkJPSBhY3BpX2NwdWZyZXFfY3B1X2luaXQsCisJLmV4aXQJCT0gYWNwaV9jcHVmcmVxX2NwdV9leGl0LAorCS5yZXN1bWUJCT0gYWNwaV9jcHVmcmVxX3Jlc3VtZSwKKwkubmFtZQkJPSAiYWNwaS1jcHVmcmVxIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmF0dHIJCT0gYWNwaV9jcHVmcmVxX2F0dHIsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX2NwdWZyZXFfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs2LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazYuYwppbmRleCBmMTBkZWE0Li5jYjAxZGFjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazYuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazYuYwpAQCAtMTY0LDcgKzE2NCw3IEBACiAJfQogCiAJLyogY3B1aW5mbyBhbmQgZGVmYXVsdCBwb2xpY3kgdmFsdWVzICovCi0JcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IENQVUZSRVFfRVRFUk5BTDsKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gMjAwMDAwOwogCXBvbGljeS0+Y3VyID0gYnVzZnJlcSAqIG1heF9tdWx0aXBsaWVyOwogCiAJcmVzdWx0ID0gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksIGNsb2NrX3JhdGlvKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNy5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs3LmMKaW5kZXggZDQ3Yzc3NS4uOWE5NzExNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs3LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs3LmMKQEAgLTcxNCwxNCArNzE0LDE3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIHBvd2Vybm93X2RyaXZlciA9IHsKLQkudmVyaWZ5CT0gcG93ZXJub3dfdmVyaWZ5LAotCS50YXJnZXQJPSBwb3dlcm5vd190YXJnZXQsCi0JLmdldAk9IHBvd2Vybm93X2dldCwKLQkuaW5pdAk9IHBvd2Vybm93X2NwdV9pbml0LAotCS5leGl0CT0gcG93ZXJub3dfY3B1X2V4aXQsCi0JLm5hbWUJPSAicG93ZXJub3ctazciLAotCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCS5hdHRyCT0gcG93ZXJub3dfdGFibGVfYXR0ciwKKwkudmVyaWZ5CQk9IHBvd2Vybm93X3ZlcmlmeSwKKwkudGFyZ2V0CQk9IHBvd2Vybm93X3RhcmdldCwKKwkuZ2V0CQk9IHBvd2Vybm93X2dldCwKKyNpZmRlZiBDT05GSUdfWDg2X1BPV0VSTk9XX0s3X0FDUEkKKwkuYmlvc19saW1pdAk9IGFjcGlfcHJvY2Vzc29yX2dldF9iaW9zX2xpbWl0LAorI2VuZGlmCisJLmluaXQJCT0gcG93ZXJub3dfY3B1X2luaXQsCisJLmV4aXQJCT0gcG93ZXJub3dfY3B1X2V4aXQsCisJLm5hbWUJCT0gInBvd2Vybm93LWs3IiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmF0dHIJCT0gcG93ZXJub3dfdGFibGVfYXR0ciwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHBvd2Vybm93X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKaW5kZXggM2YxMmRhYi4uYTlkZjk0NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKQEAgLTExMTgsNyArMTExOCw3IEBACiBzdGF0aWMgaW50IHBvd2Vybm93azhfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9sLAogCQl1bnNpZ25lZCB0YXJnZnJlcSwgdW5zaWduZWQgcmVsYXRpb24pCiB7Ci0JY3B1bWFza190IG9sZG1hc2s7CisJY3B1bWFza192YXJfdCBvbGRtYXNrOwogCXN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhID0gcGVyX2NwdShwb3dlcm5vd19kYXRhLCBwb2wtPmNwdSk7CiAJdTMyIGNoZWNrZmlkOwogCXUzMiBjaGVja3ZpZDsKQEAgLTExMzEsOSArMTEzMSwxMyBAQAogCWNoZWNrZmlkID0gZGF0YS0+Y3VycmZpZDsKIAljaGVja3ZpZCA9IGRhdGEtPmN1cnJ2aWQ7CiAKLQkvKiBvbmx5IHJ1biBvbiBzcGVjaWZpYyBDUFUgZnJvbSBoZXJlIG9uICovCi0Jb2xkbWFzayA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKLQlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCAmY3B1bWFza19vZl9jcHUocG9sLT5jcHUpKTsKKwkvKiBvbmx5IHJ1biBvbiBzcGVjaWZpYyBDUFUgZnJvbSBoZXJlIG9uLiAqLworCS8qIFRoaXMgaXMgcG9vciBmb3JtOiB1c2UgYSB3b3JrcXVldWUgb3Igc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlICovCisJaWYgKCFhbGxvY19jcHVtYXNrX3Zhcigmb2xkbWFzaywgR0ZQX0tFUk5FTCkpCisJCXJldHVybiAtRU5PTUVNOworCisJY3B1bWFza19jb3B5KG9sZG1hc2ssIHRza19jcHVtYXNrKGN1cnJlbnQpKTsKKwlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBjcHVtYXNrX29mKHBvbC0+Y3B1KSk7CiAKIAlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IHBvbC0+Y3B1KSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggImxpbWl0aW5nIHRvIGNwdSAldSBmYWlsZWRcbiIsIHBvbC0+Y3B1KTsKQEAgLTExOTMsNyArMTE5Nyw4IEBACiAJcmV0ID0gMDsKIAogZXJyX291dDoKLQlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCAmb2xkbWFzayk7CisJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgb2xkbWFzayk7CisJZnJlZV9jcHVtYXNrX3ZhcihvbGRtYXNrKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMzkzLDE0ICsxMzk4LDE1IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIGNwdWZyZXFfYW1kNjRfZHJpdmVyID0gewotCS52ZXJpZnkgPSBwb3dlcm5vd2s4X3ZlcmlmeSwKLQkudGFyZ2V0ID0gcG93ZXJub3drOF90YXJnZXQsCi0JLmluaXQgPSBwb3dlcm5vd2s4X2NwdV9pbml0LAotCS5leGl0ID0gX19kZXZleGl0X3AocG93ZXJub3drOF9jcHVfZXhpdCksCi0JLmdldCA9IHBvd2Vybm93azhfZ2V0LAotCS5uYW1lID0gInBvd2Vybm93LWs4IiwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkuYXR0ciA9IHBvd2Vybm93X2s4X2F0dHIsCisJLnZlcmlmeQkJPSBwb3dlcm5vd2s4X3ZlcmlmeSwKKwkudGFyZ2V0CQk9IHBvd2Vybm93azhfdGFyZ2V0LAorCS5iaW9zX2xpbWl0CT0gYWNwaV9wcm9jZXNzb3JfZ2V0X2Jpb3NfbGltaXQsCisJLmluaXQJCT0gcG93ZXJub3drOF9jcHVfaW5pdCwKKwkuZXhpdAkJPSBfX2RldmV4aXRfcChwb3dlcm5vd2s4X2NwdV9leGl0KSwKKwkuZ2V0CQk9IHBvd2Vybm93azhfZ2V0LAorCS5uYW1lCQk9ICJwb3dlcm5vdy1rOCIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5hdHRyCQk9IHBvd2Vybm93X2s4X2F0dHIsCiB9OwogCiAvKiBkcml2ZXIgZW50cnkgcG9pbnQgZm9yIGluaXQgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtaWNoLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWljaC5jCmluZGV4IDNhZTVhN2EuLjJjZThlMGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtaWNoLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1pY2guYwpAQCAtMzksNyArMzksNyBAQAogCiAvKiBzcGVlZHN0ZXBfcHJvY2Vzc29yCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3BlZWRzdGVwX3Byb2Nlc3NvcjsKK3N0YXRpYyBlbnVtIHNwZWVkc3RlcF9wcm9jZXNzb3Igc3BlZWRzdGVwX3Byb2Nlc3NvcjsKIAogc3RhdGljIHUzMiBwbWJhc2U7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5jCmluZGV4IGY0YzI5MGIuLmFkMDA4M2EgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1saWIuYwpAQCAtMzQsNyArMzQsNyBAQAogICogICAgICAgICAgICAgICAgICAgR0VUIFBST0NFU1NPUiBDT1JFIFNQRUVEIElOIEtIWiAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCBwZW50aXVtM19nZXRfZnJlcXVlbmN5KHVuc2lnbmVkIGludCBwcm9jZXNzb3IpCitzdGF0aWMgdW5zaWduZWQgaW50IHBlbnRpdW0zX2dldF9mcmVxdWVuY3koZW51bSBzcGVlZHN0ZXBfcHJvY2Vzc29yIHByb2Nlc3NvcikKIHsKIAkvKiBTZWUgdGFibGUgMTQgb2YgcDNfZHMucGRmIGFuZCB0YWJsZSAyMiBvZiAyOTgzNDAwMy5wZGYgKi8KIAlzdHJ1Y3QgewpAQCAtMjI3LDcgKzIyNyw3IEBACiAKIAogLyogV2FybmluZzogbWF5IGdldCBjYWxsZWQgZnJvbSBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUuICovCi11bnNpZ25lZCBpbnQgc3BlZWRzdGVwX2dldF9mcmVxdWVuY3kodW5zaWduZWQgaW50IHByb2Nlc3NvcikKK3Vuc2lnbmVkIGludCBzcGVlZHN0ZXBfZ2V0X2ZyZXF1ZW5jeShlbnVtIHNwZWVkc3RlcF9wcm9jZXNzb3IgcHJvY2Vzc29yKQogewogCXN3aXRjaCAocHJvY2Vzc29yKSB7CiAJY2FzZSBTUEVFRFNURVBfQ1BVX1BDT1JFOgpAQCAtMzgwLDcgKzM4MCw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgIERFVEVDVCBTUEVFRFNURVAgU1BFRURTICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11bnNpZ25lZCBpbnQgc3BlZWRzdGVwX2dldF9mcmVxcyh1bnNpZ25lZCBpbnQgcHJvY2Vzc29yLAordW5zaWduZWQgaW50IHNwZWVkc3RlcF9nZXRfZnJlcXMoZW51bSBzcGVlZHN0ZXBfcHJvY2Vzc29yIHByb2Nlc3NvciwKIAkJCQkgIHVuc2lnbmVkIGludCAqbG93X3NwZWVkLAogCQkJCSAgdW5zaWduZWQgaW50ICpoaWdoX3NwZWVkLAogCQkJCSAgdW5zaWduZWQgaW50ICp0cmFuc2l0aW9uX2xhdGVuY3ksCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5oIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1saWIuaAppbmRleCAyYjZjMDRlLi43MGQ5Y2VhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5oCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmgKQEAgLTExLDE4ICsxMSwxOCBAQAogCiAKIC8qIHByb2Nlc3NvcnMgKi8KLQotI2RlZmluZSBTUEVFRFNURVBfQ1BVX1BJSUlfQ19FQVJMWQkweDAwMDAwMDAxICAvKiBDb3BwZXJtaW5lIGNvcmUgKi8KLSNkZWZpbmUgU1BFRURTVEVQX0NQVV9QSUlJX0MJCTB4MDAwMDAwMDIgIC8qIENvcHBlcm1pbmUgY29yZSAqLwotI2RlZmluZSBTUEVFRFNURVBfQ1BVX1BJSUlfVAkJMHgwMDAwMDAwMyAgLyogVHVhbGF0aW4gY29yZSAqLwotI2RlZmluZSBTUEVFRFNURVBfQ1BVX1A0TQkJMHgwMDAwMDAwNCAgLyogUDQtTSAgKi8KLQorZW51bSBzcGVlZHN0ZXBfcHJvY2Vzc29yIHsKKwlTUEVFRFNURVBfQ1BVX1BJSUlfQ19FQVJMWSA9IDB4MDAwMDAwMDEsICAvKiBDb3BwZXJtaW5lIGNvcmUgKi8KKwlTUEVFRFNURVBfQ1BVX1BJSUlfQwkgICA9IDB4MDAwMDAwMDIsICAvKiBDb3BwZXJtaW5lIGNvcmUgKi8KKwlTUEVFRFNURVBfQ1BVX1BJSUlfVAkgICA9IDB4MDAwMDAwMDMsICAvKiBUdWFsYXRpbiBjb3JlICovCisJU1BFRURTVEVQX0NQVV9QNE0JICAgPSAweDAwMDAwMDA0LCAgLyogUDQtTSAgKi8KIC8qIHRoZSBmb2xsb3dpbmcgcHJvY2Vzc29ycyBhcmUgbm90IHNwZWVkc3RlcC1jYXBhYmxlIGFuZCBhcmUgbm90IGF1dG8tZGV0ZWN0ZWQKICAqIGluIHNwZWVkc3RlcF9kZXRlY3RfcHJvY2Vzc29yKCkuIEhvd2V2ZXIsIHRoZWlyIHNwZWVkIGNhbiBiZSBkZXRlY3RlZCB1c2luZwogICogdGhlIHNwZWVkc3RlcF9nZXRfZnJlcXVlbmN5KCkgY2FsbC4gKi8KLSNkZWZpbmUgU1BFRURTVEVQX0NQVV9QTQkJMHhGRkZGRkYwMyAgLyogUGVudGl1bSBNICAqLwotI2RlZmluZSBTUEVFRFNURVBfQ1BVX1A0RAkJMHhGRkZGRkYwNCAgLyogZGVza3RvcCBQNCAgKi8KLSNkZWZpbmUgU1BFRURTVEVQX0NQVV9QQ09SRQkJMHhGRkZGRkYwNSAgLyogQ29yZSAqLworCVNQRUVEU1RFUF9DUFVfUE0JICAgPSAweEZGRkZGRjAzLCAgLyogUGVudGl1bSBNICAqLworCVNQRUVEU1RFUF9DUFVfUDRECSAgID0gMHhGRkZGRkYwNCwgIC8qIGRlc2t0b3AgUDQgICovCisJU1BFRURTVEVQX0NQVV9QQ09SRQkgICA9IDB4RkZGRkZGMDUsICAvKiBDb3JlICovCit9OwogCiAvKiBzcGVlZHN0ZXAgc3RhdGVzIC0tIG9ubHkgdHdvIG9mIHRoZW0gKi8KIApAQCAtMzEsMTAgKzMxLDEwIEBACiAKIAogLyogZGV0ZWN0IGEgc3BlZWRzdGVwLWNhcGFibGUgcHJvY2Vzc29yICovCi1leHRlcm4gdW5zaWduZWQgaW50IHNwZWVkc3RlcF9kZXRlY3RfcHJvY2Vzc29yICh2b2lkKTsKK2V4dGVybiBlbnVtIHNwZWVkc3RlcF9wcm9jZXNzb3Igc3BlZWRzdGVwX2RldGVjdF9wcm9jZXNzb3Iodm9pZCk7CiAKIC8qIGRldGVjdCB0aGUgY3VycmVudCBzcGVlZCAoaW4ga2h6KSBvZiB0aGUgcHJvY2Vzc29yICovCi1leHRlcm4gdW5zaWduZWQgaW50IHNwZWVkc3RlcF9nZXRfZnJlcXVlbmN5KHVuc2lnbmVkIGludCBwcm9jZXNzb3IpOworZXh0ZXJuIHVuc2lnbmVkIGludCBzcGVlZHN0ZXBfZ2V0X2ZyZXF1ZW5jeShlbnVtIHNwZWVkc3RlcF9wcm9jZXNzb3IgcHJvY2Vzc29yKTsKIAogCiAvKiBkZXRlY3QgdGhlIGxvdyBhbmQgaGlnaCBzcGVlZHMgb2YgdGhlIHByb2Nlc3Nvci4gVGhlIGNhbGxiYWNrCkBAIC00Miw3ICs0Miw3IEBACiAgKiBTUEVFRFNURVBfTE9XOyB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIHplcm8gc28gdGhhdCBubwogICogY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbiBjYWxscyBhcmUgaW5pdGlhdGVkLgogICovCi1leHRlcm4gdW5zaWduZWQgaW50IHNwZWVkc3RlcF9nZXRfZnJlcXModW5zaWduZWQgaW50IHByb2Nlc3NvciwKK2V4dGVybiB1bnNpZ25lZCBpbnQgc3BlZWRzdGVwX2dldF9mcmVxcyhlbnVtIHNwZWVkc3RlcF9wcm9jZXNzb3IgcHJvY2Vzc29yLAogCXVuc2lnbmVkIGludCAqbG93X3NwZWVkLAogCXVuc2lnbmVkIGludCAqaGlnaF9zcGVlZCwKIAl1bnNpZ25lZCBpbnQgKnRyYW5zaXRpb25fbGF0ZW5jeSwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtc21pLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLXNtaS5jCmluZGV4IGJlZmVhMDguLjA0ZDczYzEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtc21pLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1zbWkuYwpAQCAtMzUsNyArMzUsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBzbWlfc2lnOwogCiAvKiBpbmZvIGFib3V0IHRoZSBwcm9jZXNzb3IgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3BlZWRzdGVwX3Byb2Nlc3NvcjsKK3N0YXRpYyBlbnVtIHNwZWVkc3RlcF9wcm9jZXNzb3Igc3BlZWRzdGVwX3Byb2Nlc3NvcjsKIAogLyoKICAqIFRoZXJlIGFyZSBvbmx5IHR3byBmcmVxdWVuY3kgc3RhdGVzIGZvciBlYWNoIHByb2Nlc3Nvci4gVmFsdWVzCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jCmluZGV4IGQ3ZWJmMjUuLmE4YWFjZDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jCkBAIC0xMzg4LDEzICsxMzg4LDE0IEBACiAJc3RydWN0IHRpbWVyX2xpc3QgKnQgPSAmX19nZXRfY3B1X3ZhcihtY2VfdGltZXIpOwogCWludCAqbiA9ICZfX2dldF9jcHVfdmFyKG1jZV9uZXh0X2ludGVydmFsKTsKIAorCXNldHVwX3RpbWVyKHQsIG1jZV9zdGFydF90aW1lciwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwogCWlmIChtY2VfaWdub3JlX2NlKQogCQlyZXR1cm47CiAKIAkqbiA9IGNoZWNrX2ludGVydmFsICogSFo7CiAJaWYgKCEqbikKIAkJcmV0dXJuOwotCXNldHVwX3RpbWVyKHQsIG1jZV9zdGFydF90aW1lciwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAl0LT5leHBpcmVzID0gcm91bmRfamlmZmllcyhqaWZmaWVzICsgKm4pOwogCWFkZF90aW1lcl9vbih0LCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogfQpAQCAtMTkyOCw3ICsxOTI5LDcgQEAKIAkJc3lzZGV2X3JlbW92ZV9maWxlKCZwZXJfY3B1KG1jZV9kZXYsIGNwdSksICZtY2VfYmFua3Nbal0uYXR0cik7CiBlcnJvcjoKIAl3aGlsZSAoLS1pID49IDApCi0JCXN5c2Rldl9yZW1vdmVfZmlsZSgmcGVyX2NwdShtY2VfZGV2LCBjcHUpLCAmbWNlX2JhbmtzW2ldLmF0dHIpOworCQlzeXNkZXZfcmVtb3ZlX2ZpbGUoJnBlcl9jcHUobWNlX2RldiwgY3B1KSwgbWNlX2F0dHJzW2ldKTsKIAogCXN5c2Rldl91bnJlZ2lzdGVyKCZwZXJfY3B1KG1jZV9kZXYsIGNwdSkpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5jCmluZGV4IGFiMWE4YTguLjQ1NTA2ZDUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5jCkBAIC0xNjMyLDYgKzE2MzIsNyBAQAogCiAJZGF0YS5wZXJpb2QJPSBldmVudC0+aHcubGFzdF9wZXJpb2Q7CiAJZGF0YS5hZGRyCT0gMDsKKwlkYXRhLnJhdwk9IE5VTEw7CiAJcmVncy5pcAkJPSAwOwogCiAJLyoKQEAgLTE3NDksNiArMTc1MCw3IEBACiAJdTY0IHZhbDsKIAogCWRhdGEuYWRkciA9IDA7CisJZGF0YS5yYXcgPSBOVUxMOwogCiAJY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOwogCkBAIC0xNzk0LDYgKzE3OTYsNyBAQAogCXU2NCBhY2ssIHN0YXR1czsKIAogCWRhdGEuYWRkciA9IDA7CisJZGF0YS5yYXcgPSBOVUxMOwogCiAJY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOwogCkBAIC0xODU3LDYgKzE4NjAsNyBAQAogCXU2NCB2YWw7CiAKIAlkYXRhLmFkZHIgPSAwOworCWRhdGEucmF3ID0gTlVMTDsKIAogCWNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKIApAQCAtMjA2MiwxMiArMjA2Niw2IEBACiAKIAl4ODZfcG11ID0gcDZfcG11OwogCi0JaWYgKCFjcHVfaGFzX2FwaWMpIHsKLQkJcHJfaW5mbygibm8gQVBJQywgYm9vdCB3aXRoIHRoZSBcImxhcGljXCIgYm9vdCBwYXJhbWV0ZXIgdG8gZm9yY2UtZW5hYmxlIGl0LlxuIik7Ci0JCXByX2luZm8oIm5vIGhhcmR3YXJlIHNhbXBsaW5nIGludGVycnVwdCBhdmFpbGFibGUuXG4iKTsKLQkJeDg2X3BtdS5hcGljID0gMDsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjE1OSw2ICsyMTU3LDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBwbXVfY2hlY2tfYXBpYyh2b2lkKQoreworCWlmIChjcHVfaGFzX2FwaWMpCisJCXJldHVybjsKKworCXg4Nl9wbXUuYXBpYyA9IDA7CisJcHJfaW5mbygibm8gQVBJQywgYm9vdCB3aXRoIHRoZSBcImxhcGljXCIgYm9vdCBwYXJhbWV0ZXIgdG8gZm9yY2UtZW5hYmxlIGl0LlxuIik7CisJcHJfaW5mbygibm8gaGFyZHdhcmUgc2FtcGxpbmcgaW50ZXJydXB0IGF2YWlsYWJsZS5cbiIpOworfQorCiB2b2lkIF9faW5pdCBpbml0X2h3X3BlcmZfZXZlbnRzKHZvaWQpCiB7CiAJaW50IGVycjsKQEAgLTIxODAsNiArMjE4OCw4IEBACiAJCXJldHVybjsKIAl9CiAKKwlwbXVfY2hlY2tfYXBpYygpOworCiAJcHJfY29udCgiJXMgUE1VIGRyaXZlci5cbiIsIHg4Nl9wbXUubmFtZSk7CiAKIAlpZiAoeDg2X3BtdS5udW1fZXZlbnRzID4gWDg2X1BNQ19NQVhfR0VORVJJQykgewpAQCAtMjI4Nyw3ICsyMjk3LDcgQEAKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSwgcG1jX2lycV9lbnRyeSk7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5LCBwbWNfbm1pX2VudHJ5KTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIGluX25taV9mcmFtZSk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBpbl9pZ25vcmVkX2ZyYW1lKTsKIAogCiBzdGF0aWMgdm9pZApAQCAtMjMwMyw4ICsyMzEzLDkgQEAKIAogc3RhdGljIGludCBiYWNrdHJhY2Vfc3RhY2sodm9pZCAqZGF0YSwgY2hhciAqbmFtZSkKIHsKLQlwZXJfY3B1KGluX25taV9mcmFtZSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSA9Ci0JCQl4ODZfaXNfc3RhY2tfaWQoTk1JX1NUQUNLLCBuYW1lKTsKKwlwZXJfY3B1KGluX2lnbm9yZWRfZnJhbWUsIHNtcF9wcm9jZXNzb3JfaWQoKSkgPQorCQkJeDg2X2lzX3N0YWNrX2lkKE5NSV9TVEFDSywgbmFtZSkgfHwKKwkJCXg4Nl9pc19zdGFja19pZChERUJVR19TVEFDSywgbmFtZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIzMTMsNyArMjMyNCw3IEBACiB7CiAJc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICplbnRyeSA9IGRhdGE7CiAKLQlpZiAocGVyX2NwdShpbl9ubWlfZnJhbWUsIHNtcF9wcm9jZXNzb3JfaWQoKSkpCisJaWYgKHBlcl9jcHUoaW5faWdub3JlZF9mcmFtZSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSkKIAkJcmV0dXJuOwogCiAJaWYgKHJlbGlhYmxlKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jCmluZGV4IDhlNzQwOTMuLmIxM2FmNTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzY0LmMKQEAgLTEwMyw2ICsxMDMsMzUgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQKK2luX2lycV9zdGFjayh1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyAqaXJxX3N0YWNrLAorCSAgICAgdW5zaWduZWQgbG9uZyAqaXJxX3N0YWNrX2VuZCkKK3sKKwlyZXR1cm4gKHN0YWNrID49IGlycV9zdGFjayAmJiBzdGFjayA8IGlycV9zdGFja19lbmQpOworfQorCisvKgorICogV2UgYXJlIHJldHVybmluZyBmcm9tIHRoZSBpcnEgc3RhY2sgYW5kIGdvIHRvIHRoZSBwcmV2aW91cyBvbmUuCisgKiBJZiB0aGUgcHJldmlvdXMgc3RhY2sgaXMgYWxzbyBpbiB0aGUgaXJxIHN0YWNrLCB0aGVuIGJwIGluIHRoZSBmaXJzdAorICogZnJhbWUgb2YgdGhlIGlycSBzdGFjayBwb2ludHMgdG8gdGhlIHByZXZpb3VzLCBpbnRlcnJ1cHRlZCBvbmUuCisgKiBPdGhlcndpc2Ugd2UgaGF2ZSBhbm90aGVyIGxldmVsIG9mIGluZGlyZWN0aW9uOiBXZSBmaXJzdCBzYXZlCisgKiB0aGUgYnAgb2YgdGhlIHByZXZpb3VzIHN0YWNrLCB0aGVuIHdlIHN3aXRjaCB0aGUgc3RhY2sgdG8gdGhlIGlycSBvbmUKKyAqIGFuZCBzYXZlIGEgbmV3IGJwIHRoYXQgbGlua3MgdG8gdGhlIHByZXZpb3VzIG9uZS4KKyAqIChTZWUgc2F2ZV9hcmdzKCkpCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworZml4dXBfYnBfaXJxX2xpbmsodW5zaWduZWQgbG9uZyBicCwgdW5zaWduZWQgbG9uZyAqc3RhY2ssCisJCSAgdW5zaWduZWQgbG9uZyAqaXJxX3N0YWNrLCB1bnNpZ25lZCBsb25nICppcnFfc3RhY2tfZW5kKQoreworI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCisJc3RydWN0IHN0YWNrX2ZyYW1lICpmcmFtZSA9IChzdHJ1Y3Qgc3RhY2tfZnJhbWUgKilicDsKKworCWlmICghaW5faXJxX3N0YWNrKHN0YWNrLCBpcnFfc3RhY2ssIGlycV9zdGFja19lbmQpKQorCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpZnJhbWUtPm5leHRfZnJhbWU7CisjZW5kaWYKKwlyZXR1cm4gYnA7Cit9CisKIC8qCiAgKiB4ODYtNjQgY2FuIGhhdmUgdXAgdG8gdGhyZWUga2VybmVsIHN0YWNrczoKICAqIHByb2Nlc3Mgc3RhY2sKQEAgLTE3NSw3ICsyMDQsNyBAQAogCQkJaXJxX3N0YWNrID0gaXJxX3N0YWNrX2VuZCAtCiAJCQkJKElSUV9TVEFDS19TSVpFIC0gNjQpIC8gc2l6ZW9mKCppcnFfc3RhY2spOwogCi0JCQlpZiAoc3RhY2sgPj0gaXJxX3N0YWNrICYmIHN0YWNrIDwgaXJxX3N0YWNrX2VuZCkgeworCQkJaWYgKGluX2lycV9zdGFjayhzdGFjaywgaXJxX3N0YWNrLCBpcnFfc3RhY2tfZW5kKSkgewogCQkJCWlmIChvcHMtPnN0YWNrKGRhdGEsICJJUlEiKSA8IDApCiAJCQkJCWJyZWFrOwogCQkJCWJwID0gcHJpbnRfY29udGV4dF9zdGFjayh0aW5mbywgc3RhY2ssIGJwLApAQCAtMTg2LDYgKzIxNSw4IEBACiAJCQkJICogcG9pbnRlciAoaW5kZXggLTEgdG8gZW5kKSBpbiB0aGUgSVJRIHN0YWNrOgogCQkJCSAqLwogCQkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKikgKGlycV9zdGFja19lbmRbLTFdKTsKKwkJCQlicCA9IGZpeHVwX2JwX2lycV9saW5rKGJwLCBzdGFjaywgaXJxX3N0YWNrLAorCQkJCQkJICAgICAgIGlycV9zdGFja19lbmQpOwogCQkJCWlycV9zdGFja19lbmQgPSBOVUxMOwogCQkJCW9wcy0+c3RhY2soZGF0YSwgIkVPSSIpOwogCQkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMgYi9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUwppbmRleCA2M2JjYTc5Li42NzNmNjkzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUwpAQCAtMTA3NiwxMCArMTA3NiwxMCBAQAogCVRSQUNFX0lSUVNfT0ZGCiAJbW92cSAlcnNwLCVyZGkJCS8qIHB0X3JlZ3MgcG9pbnRlciAqLwogCXhvcmwgJWVzaSwlZXNpCQkvKiBubyBlcnJvciBjb2RlICovCi0JUEVSX0NQVShpbml0X3RzcywgJXJicCkKLQlzdWJxICRFWENFUFRJT05fU1RLU1osIFRTU19pc3QgKyAoXGlzdCAtIDEpICogOCglcmJwKQorCVBFUl9DUFUoaW5pdF90c3MsICVyMTIpCisJc3VicSAkRVhDRVBUSU9OX1NUS1NaLCBUU1NfaXN0ICsgKFxpc3QgLSAxKSAqIDgoJXIxMikKIAljYWxsIFxkb19zeW0KLQlhZGRxICRFWENFUFRJT05fU1RLU1osIFRTU19pc3QgKyAoXGlzdCAtIDEpICogOCglcmJwKQorCWFkZHEgJEVYQ0VQVElPTl9TVEtTWiwgVFNTX2lzdCArIChcaXN0IC0gMSkgKiA4KCVyMTIpCiAJam1wIHBhcmFub2lkX2V4aXQJLyogJWVieDogbm8gc3dhcGdzIGZsYWcgKi8KIAlDRklfRU5EUFJPQwogRU5EKFxzeW0pCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaHdfYnJlYWtwb2ludC5jIGIvYXJjaC94ODYva2VybmVsL2h3X2JyZWFrcG9pbnQuYwppbmRleCBkNDJmNjVhLi4wNWQ1ZmVjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9od19icmVha3BvaW50LmMKQEAgLTM2Miw4ICszNjIsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmIChicC0+Y2FsbGJhY2spCi0JCXJldCA9IGFyY2hfc3RvcmVfaW5mbyhicCk7CisJcmV0ID0gYXJjaF9zdG9yZV9pbmZvKGJwKTsKIAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtNTE5LDcgKzUxOCw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCShicC0+Y2FsbGJhY2spKGJwLCBhcmdzLT5yZWdzKTsKKwkJcGVyZl9icF9ldmVudChicCwgYXJncy0+cmVncyk7CiAKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2tnZGIuYyBiL2FyY2gveDg2L2tlcm5lbC9rZ2RiLmMKaW5kZXggMjBhNWIzNi4uZGQ3NGZlNzIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9rZ2RiLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2tnZGIuYwpAQCAtODYsOSArODYsMTUgQEAKIAlnZGJfcmVnc1tHREJfRFNdCT0gcmVncy0+ZHM7CiAJZ2RiX3JlZ3NbR0RCX0VTXQk9IHJlZ3MtPmVzOwogCWdkYl9yZWdzW0dEQl9DU10JPSByZWdzLT5jczsKLQlnZGJfcmVnc1tHREJfU1NdCT0gX19LRVJORUxfRFM7CiAJZ2RiX3JlZ3NbR0RCX0ZTXQk9IDB4RkZGRjsKIAlnZGJfcmVnc1tHREJfR1NdCT0gMHhGRkZGOworCWlmICh1c2VyX21vZGVfdm0ocmVncykpIHsKKwkJZ2RiX3JlZ3NbR0RCX1NTXSA9IHJlZ3MtPnNzOworCQlnZGJfcmVnc1tHREJfU1BdID0gcmVncy0+c3A7CisJfSBlbHNlIHsKKwkJZ2RiX3JlZ3NbR0RCX1NTXSA9IF9fS0VSTkVMX0RTOworCQlnZGJfcmVnc1tHREJfU1BdID0ga2VybmVsX3N0YWNrX3BvaW50ZXIocmVncyk7CisJfQogI2Vsc2UKIAlnZGJfcmVnc1tHREJfUjhdCT0gcmVncy0+cjg7CiAJZ2RiX3JlZ3NbR0RCX1I5XQk9IHJlZ3MtPnI5OwpAQCAtMTAxLDggKzEwNyw4IEBACiAJZ2RiX3JlZ3MzMltHREJfUFNdCT0gcmVncy0+ZmxhZ3M7CiAJZ2RiX3JlZ3MzMltHREJfQ1NdCT0gcmVncy0+Y3M7CiAJZ2RiX3JlZ3MzMltHREJfU1NdCT0gcmVncy0+c3M7Ci0jZW5kaWYKIAlnZGJfcmVnc1tHREJfU1BdCT0ga2VybmVsX3N0YWNrX3BvaW50ZXIocmVncyk7CisjZW5kaWYKIH0KIAogLyoqCkBAIC0yMjAsOCArMjI2LDcgQEAKIAkJCWRyNyB8PSAoKGJyZWFraW5mb1ticmVha25vXS5sZW4gPDwgMikgfAogCQkJCSBicmVha2luZm9bYnJlYWtub10udHlwZSkgPDwKIAkJCSAgICAgICAoKGJyZWFrbm8gPDwgMikgKyAxNik7Ci0JCQlpZiAoYnJlYWtubyA+PSAwICYmIGJyZWFrbm8gPD0gMykKLQkJCQlzZXRfZGVidWdyZWcoYnJlYWtpbmZvW2JyZWFrbm9dLmFkZHIsIGJyZWFrbm8pOworCQkJc2V0X2RlYnVncmVnKGJyZWFraW5mb1ticmVha25vXS5hZGRyLCBicmVha25vKTsKIAogCQl9IGVsc2UgewogCQkJaWYgKChkcjcgJiBicmVha2JpdCkgJiYgIWJyZWFraW5mb1ticmVha25vXS5lbmFibGVkKSB7CkBAIC0zOTUsNyArNDAwLDYgQEAKIAkJLyogc2V0IHRoZSB0cmFjZSBiaXQgaWYgd2UncmUgc3RlcHBpbmcgKi8KIAkJaWYgKHJlbWNvbUluQnVmZmVyWzBdID09ICdzJykgewogCQkJbGludXhfcmVncy0+ZmxhZ3MgfD0gWDg2X0VGTEFHU19URjsKLQkJCWtnZGJfc2luZ2xlX3N0ZXAgPSAxOwogCQkJYXRvbWljX3NldCgma2dkYl9jcHVfZG9pbmdfc2luZ2xlX3N0ZXAsCiAJCQkJICAgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfYW1kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2FtZC5jCmluZGV4IDYzMTIzZDkuLjM3NTQyYjY3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2FtZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfYW1kLmMKQEAgLTEzLDYgKzEzLDkgQEAKICAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogIExpY2Vuc2UgdmVyc2lvbiAyLiBTZWUgZmlsZSBDT1BZSU5HIGZvciBkZXRhaWxzLgogICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KQEAgLTgxLDcgKzg0LDcgQEAKIAogCW1lbXNldChjc2lnLCAwLCBzaXplb2YoKmNzaWcpKTsKIAlyZG1zcihNU1JfQU1ENjRfUEFUQ0hfTEVWRUwsIGNzaWctPnJldiwgZHVtbXkpOwotCXByX2luZm8oIm1pY3JvY29kZTogQ1BVJWQ6IHBhdGNoX2xldmVsPTB4JXhcbiIsIGNwdSwgY3NpZy0+cmV2KTsKKwlwcl9pbmZvKCJDUFUlZDogcGF0Y2hfbGV2ZWw9MHgleFxuIiwgY3B1LCBjc2lnLT5yZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0xMTEsOCArMTE0LDggQEAKIAogCS8qIHVjb2RlIG1pZ2h0IGJlIGNoaXBzZXQgc3BlY2lmaWMgLS0gY3VycmVudGx5IHdlIGRvbid0IHN1cHBvcnQgdGhpcyAqLwogCWlmIChtY19oZWFkZXItPm5iX2Rldl9pZCB8fCBtY19oZWFkZXItPnNiX2Rldl9pZCkgewotCQlwcl9lcnIoS0VSTl9FUlIgIm1pY3JvY29kZTogQ1BVJWQ6IGxvYWRpbmcgb2YgY2hpcHNldCAiCi0JCSAgICAgICAic3BlY2lmaWMgY29kZSBub3QgeWV0IHN1cHBvcnRlZFxuIiwgY3B1KTsKKwkJcHJfZXJyKCJDUFUlZDogbG9hZGluZyBvZiBjaGlwc2V0IHNwZWNpZmljIGNvZGUgbm90IHlldCBzdXBwb3J0ZWRcbiIsCisJCSAgICAgICBjcHUpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE0MSwxMiArMTQ0LDEyIEBACiAKIAkvKiBjaGVjayBjdXJyZW50IHBhdGNoIGlkIGFuZCBwYXRjaCdzIGlkIGZvciBtYXRjaCAqLwogCWlmIChyZXYgIT0gbWNfYW1kLT5oZHIucGF0Y2hfaWQpIHsKLQkJcHJfZXJyKCJtaWNyb2NvZGU6IENQVSVkOiB1cGRhdGUgZmFpbGVkICIKLQkJICAgICAgICIoZm9yIHBhdGNoX2xldmVsPTB4JXgpXG4iLCBjcHUsIG1jX2FtZC0+aGRyLnBhdGNoX2lkKTsKKwkJcHJfZXJyKCJDUFUlZDogdXBkYXRlIGZhaWxlZCAoZm9yIHBhdGNoX2xldmVsPTB4JXgpXG4iLAorCQkgICAgICAgY3B1LCBtY19hbWQtPmhkci5wYXRjaF9pZCk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlwcl9pbmZvKCJtaWNyb2NvZGU6IENQVSVkOiB1cGRhdGVkIChuZXcgcGF0Y2hfbGV2ZWw9MHgleClcbiIsIGNwdSwgcmV2KTsKKwlwcl9pbmZvKCJDUFUlZDogdXBkYXRlZCAobmV3IHBhdGNoX2xldmVsPTB4JXgpXG4iLCBjcHUsIHJldik7CiAJdWNpLT5jcHVfc2lnLnJldiA9IHJldjsKIAogCXJldHVybiAwOwpAQCAtMTY5LDE1ICsxNzIsMTQgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoc2VjdGlvbl9oZHJbMF0gIT0gVUNPREVfVUNPREVfVFlQRSkgewotCQlwcl9lcnIoIm1pY3JvY29kZTogZXJyb3I6IGludmFsaWQgdHlwZSBmaWVsZCBpbiAiCi0JCSAgICAgICAiY29udGFpbmVyIGZpbGUgc2VjdGlvbiBoZWFkZXJcbiIpOworCQlwcl9lcnIoImVycm9yOiBpbnZhbGlkIHR5cGUgZmllbGQgaW4gY29udGFpbmVyIGZpbGUgc2VjdGlvbiBoZWFkZXJcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAl0b3RhbF9zaXplID0gKHVuc2lnbmVkIGxvbmcpIChzZWN0aW9uX2hkcls0XSArIChzZWN0aW9uX2hkcls1XSA8PCA4KSk7CiAKIAlpZiAodG90YWxfc2l6ZSA+IHNpemUgfHwgdG90YWxfc2l6ZSA+IFVDT0RFX01BWF9TSVpFKSB7Ci0JCXByX2VycigibWljcm9jb2RlOiBlcnJvcjogc2l6ZSBtaXNtYXRjaFxuIik7CisJCXByX2VycigiZXJyb3I6IHNpemUgbWlzbWF0Y2hcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTIwNiwxNCArMjA4LDEzIEBACiAJc2l6ZSA9IGJ1Zl9wb3NbMl07CiAKIAlpZiAoYnVmX3Bvc1sxXSAhPSBVQ09ERV9FUVVJVl9DUFVfVEFCTEVfVFlQRSB8fCAhc2l6ZSkgewotCQlwcl9lcnIoIm1pY3JvY29kZTogZXJyb3I6IGludmFsaWQgdHlwZSBmaWVsZCBpbiAiCi0JCSAgICAgICAiY29udGFpbmVyIGZpbGUgc2VjdGlvbiBoZWFkZXJcbiIpOworCQlwcl9lcnIoImVycm9yOiBpbnZhbGlkIHR5cGUgZmllbGQgaW4gY29udGFpbmVyIGZpbGUgc2VjdGlvbiBoZWFkZXJcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAllcXVpdl9jcHVfdGFibGUgPSAoc3RydWN0IGVxdWl2X2NwdV9lbnRyeSAqKSB2bWFsbG9jKHNpemUpOwogCWlmICghZXF1aXZfY3B1X3RhYmxlKSB7Ci0JCXByX2VycigibWljcm9jb2RlOiBmYWlsZWQgdG8gYWxsb2NhdGUgZXF1aXZhbGVudCBDUFUgdGFibGVcbiIpOworCQlwcl9lcnIoImZhaWxlZCB0byBhbGxvY2F0ZSBlcXVpdmFsZW50IENQVSB0YWJsZVxuIik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMjQ2LDcgKzI0Nyw3IEBACiAKIAlvZmZzZXQgPSBpbnN0YWxsX2VxdWl2X2NwdV90YWJsZSh1Y29kZV9wdHIpOwogCWlmICghb2Zmc2V0KSB7Ci0JCXByX2VycigibWljcm9jb2RlOiBmYWlsZWQgdG8gY3JlYXRlIGVxdWl2YWxlbnQgY3B1IHRhYmxlXG4iKTsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gY3JlYXRlIGVxdWl2YWxlbnQgY3B1IHRhYmxlXG4iKTsKIAkJcmV0dXJuIFVDT0RFX0VSUk9SOwogCX0KIApAQCAtMjc3LDggKzI3OCw3IEBACiAJCWlmICghbGVmdG92ZXIpIHsKIAkJCXZmcmVlKHVjaS0+bWMpOwogCQkJdWNpLT5tYyA9IG5ld19tYzsKLQkJCXByX2RlYnVnKCJtaWNyb2NvZGU6IENQVSVkIGZvdW5kIGEgbWF0Y2hpbmcgbWljcm9jb2RlICIKLQkJCQkgInVwZGF0ZSB3aXRoIHZlcnNpb24gMHgleCAoY3VycmVudD0weCV4KVxuIiwKKwkJCXByX2RlYnVnKCJDUFUlZCBmb3VuZCBhIG1hdGNoaW5nIG1pY3JvY29kZSB1cGRhdGUgd2l0aCB2ZXJzaW9uIDB4JXggKGN1cnJlbnQ9MHgleClcbiIsCiAJCQkJIGNwdSwgbmV3X3JldiwgdWNpLT5jcHVfc2lnLnJldik7CiAJCX0gZWxzZSB7CiAJCQl2ZnJlZShuZXdfbWMpOwpAQCAtMzAwLDcgKzMwMCw3IEBACiAJCXJldHVybiBVQ09ERV9ORk9VTkQ7CiAKIAlpZiAoKih1MzIgKilmaXJtd2FyZS0+ZGF0YSAhPSBVQ09ERV9NQUdJQykgewotCQlwcl9lcnIoIm1pY3JvY29kZTogaW52YWxpZCBVQ09ERV9NQUdJQyAoMHglMDh4KVxuIiwKKwkJcHJfZXJyKCJpbnZhbGlkIFVDT0RFX01BR0lDICgweCUwOHgpXG4iLAogCQkgICAgICAgKih1MzIgKilmaXJtd2FyZS0+ZGF0YSk7CiAJCXJldHVybiBVQ09ERV9FUlJPUjsKIAl9CkBAIC0zMTMsOCArMzEzLDcgQEAKIHN0YXRpYyBlbnVtIHVjb2RlX3N0YXRlCiByZXF1ZXN0X21pY3JvY29kZV91c2VyKGludCBjcHUsIGNvbnN0IHZvaWQgX191c2VyICpidWYsIHNpemVfdCBzaXplKQogewotCXByX2luZm8oIm1pY3JvY29kZTogQU1EIG1pY3JvY29kZSB1cGRhdGUgdmlhICIKLQkJIi9kZXYvY3B1L21pY3JvY29kZSBub3Qgc3VwcG9ydGVkXG4iKTsKKwlwcl9pbmZvKCJBTUQgbWljcm9jb2RlIHVwZGF0ZSB2aWEgL2Rldi9jcHUvbWljcm9jb2RlIG5vdCBzdXBwb3J0ZWRcbiIpOwogCXJldHVybiBVQ09ERV9FUlJPUjsKIH0KIApAQCAtMzM0LDE0ICszMzMsMTMgQEAKIAlXQVJOX09OKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9BTUQpOwogCiAJaWYgKGMtPng4NiA8IDB4MTApIHsKLQkJcHJfd2FybmluZygibWljcm9jb2RlOiBBTUQgQ1BVIGZhbWlseSAweCV4IG5vdCBzdXBwb3J0ZWRcbiIsCi0JCQkgICBjLT54ODYpOworCQlwcl93YXJuaW5nKCJBTUQgQ1BVIGZhbWlseSAweCV4IG5vdCBzdXBwb3J0ZWRcbiIsIGMtPng4Nik7CiAJCXJldHVybjsKIAl9CiAJc3VwcG9ydGVkX2NwdSA9IDE7CiAKIAlpZiAocmVxdWVzdF9maXJtd2FyZSgmZmlybXdhcmUsIGZ3X25hbWUsIGRldmljZSkpCi0JCXByX2VycigibWljcm9jb2RlOiBmYWlsZWQgdG8gbG9hZCBmaWxlICVzXG4iLCBmd19uYW1lKTsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gbG9hZCBmaWxlICVzXG4iLCBmd19uYW1lKTsKIH0KIAogdm9pZCBmaW5pX21pY3JvY29kZV9hbWQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfY29yZS5jIGIvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9jb3JlLmMKaW5kZXggZTY4YWFlMy4uODQ0YzAyYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9jb3JlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9jb3JlLmMKQEAgLTcwLDYgKzcwLDkgQEAKICAqCQlGaXggc2lnbWF0Y2goKSBtYWNybyB0byBoYW5kbGUgb2xkIENQVXMgd2l0aCBwZiA9PSAwLgogICoJCVRoYW5rcyB0byBTdHVhcnQgU3dhbGVzIGZvciBwb2ludGluZyBvdXQgdGhpcyBidWcuCiAgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KQEAgLTIwOSw3ICsyMTIsNyBAQAogCXNzaXplX3QgcmV0ID0gLUVJTlZBTDsKIAogCWlmICgobGVuID4+IFBBR0VfU0hJRlQpID4gdG90YWxyYW1fcGFnZXMpIHsKLQkJcHJfZXJyKCJtaWNyb2NvZGU6IHRvbyBtdWNoIGRhdGEgKG1heCAlbGQgcGFnZXMpXG4iLCB0b3RhbHJhbV9wYWdlcyk7CisJCXByX2VycigidG9vIG11Y2ggZGF0YSAobWF4ICVsZCBwYWdlcylcbiIsIHRvdGFscmFtX3BhZ2VzKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTI0NCw3ICsyNDcsNyBAQAogCiAJZXJyb3IgPSBtaXNjX3JlZ2lzdGVyKCZtaWNyb2NvZGVfZGV2KTsKIAlpZiAoZXJyb3IpIHsKLQkJcHJfZXJyKCJtaWNyb2NvZGU6IGNhbid0IG1pc2NfcmVnaXN0ZXIgb24gbWlub3I9JWRcbiIsIE1JQ1JPQ09ERV9NSU5PUik7CisJCXByX2VycigiY2FuJ3QgbWlzY19yZWdpc3RlciBvbiBtaW5vcj0lZFxuIiwgTUlDUk9DT0RFX01JTk9SKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KIApAQCAtMzU5LDcgKzM2Miw3IEBACiAJaWYgKCF1Y2ktPm1jKQogCQlyZXR1cm4gVUNPREVfTkZPVU5EOwogCi0JcHJfZGVidWcoIm1pY3JvY29kZTogQ1BVJWQgdXBkYXRlZCB1cG9uIHJlc3VtZVxuIiwgY3B1KTsKKwlwcl9kZWJ1ZygiQ1BVJWQgdXBkYXRlZCB1cG9uIHJlc3VtZVxuIiwgY3B1KTsKIAlhcHBseV9taWNyb2NvZGVfb25fdGFyZ2V0KGNwdSk7CiAKIAlyZXR1cm4gVUNPREVfT0s7CkBAIC0zNzksNyArMzgyLDcgQEAKIAl1c3RhdGUgPSBtaWNyb2NvZGVfb3BzLT5yZXF1ZXN0X21pY3JvY29kZV9mdyhjcHUsICZtaWNyb2NvZGVfcGRldi0+ZGV2KTsKIAogCWlmICh1c3RhdGUgPT0gVUNPREVfT0spIHsKLQkJcHJfZGVidWcoIm1pY3JvY29kZTogQ1BVJWQgdXBkYXRlZCB1cG9uIGluaXRcbiIsIGNwdSk7CisJCXByX2RlYnVnKCJDUFUlZCB1cGRhdGVkIHVwb24gaW5pdFxuIiwgY3B1KTsKIAkJYXBwbHlfbWljcm9jb2RlX29uX3RhcmdldChjcHUpOwogCX0KIApAQCAtNDA2LDcgKzQwOSw3IEBACiAJaWYgKCFjcHVfb25saW5lKGNwdSkpCiAJCXJldHVybiAwOwogCi0JcHJfZGVidWcoIm1pY3JvY29kZTogQ1BVJWQgYWRkZWRcbiIsIGNwdSk7CisJcHJfZGVidWcoIkNQVSVkIGFkZGVkXG4iLCBjcHUpOwogCiAJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZzeXNfZGV2LT5rb2JqLCAmbWNfYXR0cl9ncm91cCk7CiAJaWYgKGVycikKQEAgLTQyNSw3ICs0MjgsNyBAQAogCWlmICghY3B1X29ubGluZShjcHUpKQogCQlyZXR1cm4gMDsKIAotCXByX2RlYnVnKCJtaWNyb2NvZGU6IENQVSVkIHJlbW92ZWRcbiIsIGNwdSk7CisJcHJfZGVidWcoIkNQVSVkIHJlbW92ZWRcbiIsIGNwdSk7CiAJbWljcm9jb2RlX2ZpbmlfY3B1KGNwdSk7CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZzeXNfZGV2LT5rb2JqLCAmbWNfYXR0cl9ncm91cCk7CiAJcmV0dXJuIDA7CkBAIC00NzMsMTUgKzQ3NiwxNSBAQAogCQltaWNyb2NvZGVfdXBkYXRlX2NwdShjcHUpOwogCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgogCWNhc2UgQ1BVX0RPV05fRkFJTEVEX0ZST1pFTjoKLQkJcHJfZGVidWcoIm1pY3JvY29kZTogQ1BVJWQgYWRkZWRcbiIsIGNwdSk7CisJCXByX2RlYnVnKCJDUFUlZCBhZGRlZFxuIiwgY3B1KTsKIAkJaWYgKHN5c2ZzX2NyZWF0ZV9ncm91cCgmc3lzX2Rldi0+a29iaiwgJm1jX2F0dHJfZ3JvdXApKQotCQkJcHJfZXJyKCJtaWNyb2NvZGU6IEZhaWxlZCB0byBjcmVhdGUgZ3JvdXAgZm9yIENQVSVkXG4iLCBjcHUpOworCQkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIGdyb3VwIGZvciBDUFUlZFxuIiwgY3B1KTsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgogCWNhc2UgQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU46CiAJCS8qIFN1c3BlbmQgaXMgaW4gcHJvZ3Jlc3MsIG9ubHkgcmVtb3ZlIHRoZSBpbnRlcmZhY2UgKi8KIAkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZzeXNfZGV2LT5rb2JqLCAmbWNfYXR0cl9ncm91cCk7Ci0JCXByX2RlYnVnKCJtaWNyb2NvZGU6IENQVSVkIHJlbW92ZWRcbiIsIGNwdSk7CisJCXByX2RlYnVnKCJDUFUlZCByZW1vdmVkXG4iLCBjcHUpOwogCQlicmVhazsKIAljYXNlIENQVV9ERUFEOgogCWNhc2UgQ1BVX1VQX0NBTkNFTEVEX0ZST1pFTjoKQEAgLTUwNyw3ICs1MTAsNyBAQAogCQltaWNyb2NvZGVfb3BzID0gaW5pdF9hbWRfbWljcm9jb2RlKCk7CiAKIAlpZiAoIW1pY3JvY29kZV9vcHMpIHsKLQkJcHJfZXJyKCJtaWNyb2NvZGU6IG5vIHN1cHBvcnQgZm9yIHRoaXMgQ1BVIHZlbmRvclxuIik7CisJCXByX2Vycigibm8gc3VwcG9ydCBmb3IgdGhpcyBDUFUgdmVuZG9yXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC01NDEsOCArNTQ0LDcgQEAKIAlyZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJm1jX2NwdV9ub3RpZmllcik7CiAKIAlwcl9pbmZvKCJNaWNyb2NvZGUgVXBkYXRlIERyaXZlcjogdiIgTUlDUk9DT0RFX1ZFUlNJT04KLQkgICAgICAgIiA8dGlncmFuQGFpdmF6aWFuLmZzbmV0LmNvLnVrPiwiCi0JICAgICAgICIgUGV0ZXIgT3J1YmFcbiIpOworCQkiIDx0aWdyYW5AYWl2YXppYW4uZnNuZXQuY28udWs+LCBQZXRlciBPcnViYVxuIik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfaW50ZWwuYyBiL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfaW50ZWwuYwppbmRleCAwZDMzNGRkLi5lYmQxOTNlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2ludGVsLmMKKysrIGIvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9pbnRlbC5jCkBAIC03MCw2ICs3MCw5IEBACiAgKgkJRml4IHNpZ21hdGNoKCkgbWFjcm8gdG8gaGFuZGxlIG9sZCBDUFVzIHdpdGggcGYgPT0gMC4KICAqCQlUaGFua3MgdG8gU3R1YXJ0IFN3YWxlcyBmb3IgcG9pbnRpbmcgb3V0IHRoaXMgYnVnLgogICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMTQ2LDggKzE0OSw3IEBACiAKIAlpZiAoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0lOVEVMIHx8IGMtPng4NiA8IDYgfHwKIAkgICAgY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9JQTY0KSkgewotCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogQ1BVJWQgbm90IGEgY2FwYWJsZSBJbnRlbCAiCi0JCQkicHJvY2Vzc29yXG4iLCBjcHVfbnVtKTsKKwkJcHJfZXJyKCJDUFUlZCBub3QgYSBjYXBhYmxlIEludGVsIHByb2Nlc3NvclxuIiwgY3B1X251bSk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTE2NSw4ICsxNjcsOCBAQAogCS8qIGdldCB0aGUgY3VycmVudCByZXZpc2lvbiBmcm9tIE1TUiAweDhCICovCiAJcmRtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCB2YWxbMF0sIGNzaWctPnJldik7CiAKLQlwcmludGsoS0VSTl9JTkZPICJtaWNyb2NvZGU6IENQVSVkIHNpZz0weCV4LCBwZj0weCV4LCByZXZpc2lvbj0weCV4XG4iLAotCQkJY3B1X251bSwgY3NpZy0+c2lnLCBjc2lnLT5wZiwgY3NpZy0+cmV2KTsKKwlwcl9pbmZvKCJDUFUlZCBzaWc9MHgleCwgcGY9MHgleCwgcmV2aXNpb249MHgleFxuIiwKKwkJY3B1X251bSwgY3NpZy0+c2lnLCBjc2lnLT5wZiwgY3NpZy0+cmV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTk0LDI4ICsxOTYsMjQgQEAKIAlkYXRhX3NpemUgPSBnZXRfZGF0YXNpemUobWNfaGVhZGVyKTsKIAogCWlmIChkYXRhX3NpemUgKyBNQ19IRUFERVJfU0laRSA+IHRvdGFsX3NpemUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISAiCi0JCQkJIkJhZCBkYXRhIHNpemUgaW4gbWljcm9jb2RlIGRhdGEgZmlsZVxuIik7CisJCXByX2VycigiZXJyb3IhIEJhZCBkYXRhIHNpemUgaW4gbWljcm9jb2RlIGRhdGEgZmlsZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChtY19oZWFkZXItPmxkcnZlciAhPSAxIHx8IG1jX2hlYWRlci0+aGRydmVyICE9IDEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISAiCi0JCQkJIlVua25vd24gbWljcm9jb2RlIHVwZGF0ZSBmb3JtYXRcbiIpOworCQlwcl9lcnIoImVycm9yISBVbmtub3duIG1pY3JvY29kZSB1cGRhdGUgZm9ybWF0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWV4dF90YWJsZV9zaXplID0gdG90YWxfc2l6ZSAtIChNQ19IRUFERVJfU0laRSArIGRhdGFfc2l6ZSk7CiAJaWYgKGV4dF90YWJsZV9zaXplKSB7CiAJCWlmICgoZXh0X3RhYmxlX3NpemUgPCBFWFRfSEVBREVSX1NJWkUpCiAJCSB8fCAoKGV4dF90YWJsZV9zaXplIC0gRVhUX0hFQURFUl9TSVpFKSAlIEVYVF9TSUdOQVRVUkVfU0laRSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgIgotCQkJCSJTbWFsbCBleHR0YWJsZSBzaXplIGluIG1pY3JvY29kZSBkYXRhIGZpbGVcbiIpOworCQkJcHJfZXJyKCJlcnJvciEgU21hbGwgZXh0dGFibGUgc2l6ZSBpbiBtaWNyb2NvZGUgZGF0YSBmaWxlXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWV4dF9oZWFkZXIgPSBtYyArIE1DX0hFQURFUl9TSVpFICsgZGF0YV9zaXplOwogCQlpZiAoZXh0X3RhYmxlX3NpemUgIT0gZXh0dGFibGVfc2l6ZShleHRfaGVhZGVyKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISAiCi0JCQkJIkJhZCBleHR0YWJsZSBzaXplIGluIG1pY3JvY29kZSBkYXRhIGZpbGVcbiIpOworCQkJcHJfZXJyKCJlcnJvciEgQmFkIGV4dHRhYmxlIHNpemUgaW4gbWljcm9jb2RlIGRhdGEgZmlsZVxuIik7CiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCQlleHRfc2lnY291bnQgPSBleHRfaGVhZGVyLT5jb3VudDsKQEAgLTIzMCw4ICsyMjgsNyBAQAogCQl3aGlsZSAoaS0tKQogCQkJZXh0X3RhYmxlX3N1bSArPSBleHRfdGFibGVwW2ldOwogCQlpZiAoZXh0X3RhYmxlX3N1bSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWljcm9jb2RlOiBhYm9ydGluZywgIgotCQkJCSJiYWQgZXh0ZW5kZWQgc2lnbmF0dXJlIHRhYmxlIGNoZWNrc3VtXG4iKTsKKwkJCXByX3dhcm5pbmcoImFib3J0aW5nLCBiYWQgZXh0ZW5kZWQgc2lnbmF0dXJlIHRhYmxlIGNoZWNrc3VtXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMjQyLDcgKzIzOSw3IEBACiAJd2hpbGUgKGktLSkKIAkJb3JpZ19zdW0gKz0gKChpbnQgKiltYylbaV07CiAJaWYgKG9yaWdfc3VtKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBhYm9ydGluZywgYmFkIGNoZWNrc3VtXG4iKTsKKwkJcHJfZXJyKCJhYm9ydGluZywgYmFkIGNoZWNrc3VtXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmICghZXh0X3RhYmxlX3NpemUpCkBAIC0yNTUsNyArMjUyLDcgQEAKIAkJCS0gKG1jX2hlYWRlci0+c2lnICsgbWNfaGVhZGVyLT5wZiArIG1jX2hlYWRlci0+Y2tzdW0pCiAJCQkrIChleHRfc2lnLT5zaWcgKyBleHRfc2lnLT5wZiArIGV4dF9zaWctPmNrc3VtKTsKIAkJaWYgKHN1bSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGFib3J0aW5nLCBiYWQgY2hlY2tzdW1cbiIpOworCQkJcHJfZXJyKCJhYm9ydGluZywgYmFkIGNoZWNrc3VtXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMzI3LDEzICszMjQsMTEgQEAKIAlyZG1zcihNU1JfSUEzMl9VQ09ERV9SRVYsIHZhbFswXSwgdmFsWzFdKTsKIAogCWlmICh2YWxbMV0gIT0gbWNfaW50ZWwtPmhkci5yZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IENQVSVkIHVwZGF0ZSAiCi0JCQkJInRvIHJldmlzaW9uIDB4JXggZmFpbGVkXG4iLAotCQkJY3B1X251bSwgbWNfaW50ZWwtPmhkci5yZXYpOworCQlwcl9lcnIoIkNQVSVkIHVwZGF0ZSB0byByZXZpc2lvbiAweCV4IGZhaWxlZFxuIiwKKwkJICAgICAgIGNwdV9udW0sIG1jX2ludGVsLT5oZHIucmV2KTsKIAkJcmV0dXJuIC0xOwogCX0KLQlwcmludGsoS0VSTl9JTkZPICJtaWNyb2NvZGU6IENQVSVkIHVwZGF0ZWQgdG8gcmV2aXNpb24gIgotCQkJICIweCV4LCBkYXRlID0gJTA0eC0lMDJ4LSUwMnggXG4iLAorCXByX2luZm8oIkNQVSVkIHVwZGF0ZWQgdG8gcmV2aXNpb24gMHgleCwgZGF0ZSA9ICUwNHgtJTAyeC0lMDJ4IFxuIiwKIAkJY3B1X251bSwgdmFsWzFdLAogCQltY19pbnRlbC0+aGRyLmRhdGUgJiAweGZmZmYsCiAJCW1jX2ludGVsLT5oZHIuZGF0ZSA+PiAyNCwKQEAgLTM2Miw4ICszNTcsNyBAQAogCiAJCW1jX3NpemUgPSBnZXRfdG90YWxzaXplKCZtY19oZWFkZXIpOwogCQlpZiAoIW1jX3NpemUgfHwgbWNfc2l6ZSA+IGxlZnRvdmVyKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIgotCQkJCQkiQmFkIGRhdGEgaW4gbWljcm9jb2RlIGRhdGEgZmlsZVxuIik7CisJCQlwcl9lcnIoImVycm9yISBCYWQgZGF0YSBpbiBtaWNyb2NvZGUgZGF0YSBmaWxlXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTQwNSw5ICszOTksOCBAQAogCQl2ZnJlZSh1Y2ktPm1jKTsKIAl1Y2ktPm1jID0gKHN0cnVjdCBtaWNyb2NvZGVfaW50ZWwgKiluZXdfbWM7CiAKLQlwcl9kZWJ1ZygibWljcm9jb2RlOiBDUFUlZCBmb3VuZCBhIG1hdGNoaW5nIG1pY3JvY29kZSB1cGRhdGUgd2l0aCIKLQkJICIgdmVyc2lvbiAweCV4IChjdXJyZW50PTB4JXgpXG4iLAotCQkJY3B1LCBuZXdfcmV2LCB1Y2ktPmNwdV9zaWcucmV2KTsKKwlwcl9kZWJ1ZygiQ1BVJWQgZm91bmQgYSBtYXRjaGluZyBtaWNyb2NvZGUgdXBkYXRlIHdpdGggdmVyc2lvbiAweCV4IChjdXJyZW50PTB4JXgpXG4iLAorCQkgY3B1LCBuZXdfcmV2LCB1Y2ktPmNwdV9zaWcucmV2KTsKIG91dDoKIAlyZXR1cm4gc3RhdGU7CiB9CkBAIC00MjksNyArNDIyLDcgQEAKIAkJYy0+eDg2LCBjLT54ODZfbW9kZWwsIGMtPng4Nl9tYXNrKTsKIAogCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmaXJtd2FyZSwgbmFtZSwgZGV2aWNlKSkgewotCQlwcl9kZWJ1ZygibWljcm9jb2RlOiBkYXRhIGZpbGUgJXMgbG9hZCBmYWlsZWRcbiIsIG5hbWUpOworCQlwcl9kZWJ1ZygiZGF0YSBmaWxlICVzIGxvYWQgZmFpbGVkXG4iLCBuYW1lKTsKIAkJcmV0dXJuIFVDT0RFX05GT1VORDsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDVlMmJhNjMuLjdhN2JkNGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYwpAQCAtMTAsNiArMTAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC91c2VyLXJldHVybi1ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcG93ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9od19icmVha3BvaW50Lmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtOTAsNiArOTIsMjUgQEAKIAl9CiB9CiAKK3ZvaWQgc2hvd19yZWdzX2NvbW1vbih2b2lkKQoreworCWNvbnN0IGNoYXIgKmJvYXJkLCAqcHJvZHVjdDsKKworCWJvYXJkID0gZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfQk9BUkRfTkFNRSk7CisJaWYgKCFib2FyZCkKKwkJYm9hcmQgPSAiIjsKKwlwcm9kdWN0ID0gZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfUFJPRFVDVF9OQU1FKTsKKwlpZiAoIXByb2R1Y3QpCisJCXByb2R1Y3QgPSAiIjsKKworCXByaW50aygiXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJQaWQ6ICVkLCBjb21tOiAlLjIwcyAlcyAlcyAlLipzICVzLyVzXG4iLAorCQljdXJyZW50LT5waWQsIGN1cnJlbnQtPmNvbW0sIHByaW50X3RhaW50ZWQoKSwKKwkJaW5pdF91dHNuYW1lKCktPnJlbGVhc2UsCisJCShpbnQpc3RyY3Nwbihpbml0X3V0c25hbWUoKS0+dmVyc2lvbiwgIiAiKSwKKwkJaW5pdF91dHNuYW1lKCktPnZlcnNpb24sIGJvYXJkLCBwcm9kdWN0KTsKK30KKwogdm9pZCBmbHVzaF90aHJlYWQodm9pZCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYwppbmRleCAwNzU1ODBiLi4xMjBiODg3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvdXNlci5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTM1LDcgKzM0LDYgQEAKICNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJjdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KQEAgLTEyOCw3ICsxMjYsNiBAQAogCXVuc2lnbmVkIGxvbmcgZDAsIGQxLCBkMiwgZDMsIGQ2LCBkNzsKIAl1bnNpZ25lZCBsb25nIHNwOwogCXVuc2lnbmVkIHNob3J0IHNzLCBnczsKLQljb25zdCBjaGFyICpib2FyZDsKIAogCWlmICh1c2VyX21vZGVfdm0ocmVncykpIHsKIAkJc3AgPSByZWdzLT5zcDsKQEAgLTE0MCwxNiArMTM3LDcgQEAKIAkJc2F2ZXNlZ21lbnQoZ3MsIGdzKTsKIAl9CiAKLQlwcmludGsoIlxuIik7Ci0KLQlib2FyZCA9IGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX1BST0RVQ1RfTkFNRSk7Ci0JaWYgKCFib2FyZCkKLQkJYm9hcmQgPSAiIjsKLQlwcmludGsoIlBpZDogJWQsIGNvbW06ICVzICVzICglcyAlLipzKSAlc1xuIiwKLQkJCXRhc2tfcGlkX25yKGN1cnJlbnQpLCBjdXJyZW50LT5jb21tLAotCQkJcHJpbnRfdGFpbnRlZCgpLCBpbml0X3V0c25hbWUoKS0+cmVsZWFzZSwKLQkJCShpbnQpc3RyY3Nwbihpbml0X3V0c25hbWUoKS0+dmVyc2lvbiwgIiAiKSwKLQkJCWluaXRfdXRzbmFtZSgpLT52ZXJzaW9uLCBib2FyZCk7CisJc2hvd19yZWdzX2NvbW1vbigpOwogCiAJcHJpbnRrKCJFSVA6ICUwNHg6WzwlMDhseD5dIEVGTEFHUzogJTA4bHggQ1BVOiAlZFxuIiwKIAkJCSh1MTYpcmVncy0+Y3MsIHJlZ3MtPmlwLCByZWdzLT5mbGFncywKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCmluZGV4IGM5NWM4ZjQuLmU1YWIwY2QgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91c2VyLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CkBAIC0zOCw3ICszNyw2IEBACiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1pLmg+CiAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTE2MywxOCArMTYxLDggQEAKIAl1bnNpZ25lZCBsb25nIGQwLCBkMSwgZDIsIGQzLCBkNiwgZDc7CiAJdW5zaWduZWQgaW50IGZzaW5kZXgsIGdzaW5kZXg7CiAJdW5zaWduZWQgaW50IGRzLCBjcywgZXM7Ci0JY29uc3QgY2hhciAqYm9hcmQ7CiAKLQlwcmludGsoIlxuIik7Ci0JcHJpbnRfbW9kdWxlcygpOwotCWJvYXJkID0gZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfUFJPRFVDVF9OQU1FKTsKLQlpZiAoIWJvYXJkKQotCQlib2FyZCA9ICIiOwotCXByaW50ayhLRVJOX0lORk8gIlBpZDogJWQsIGNvbW06ICUuMjBzICVzICVzICUuKnMgJXNcbiIsCi0JCWN1cnJlbnQtPnBpZCwgY3VycmVudC0+Y29tbSwgcHJpbnRfdGFpbnRlZCgpLAotCQlpbml0X3V0c25hbWUoKS0+cmVsZWFzZSwKLQkJKGludClzdHJjc3BuKGluaXRfdXRzbmFtZSgpLT52ZXJzaW9uLCAiICIpLAotCQlpbml0X3V0c25hbWUoKS0+dmVyc2lvbiwgYm9hcmQpOworCXNob3dfcmVnc19jb21tb24oKTsKIAlwcmludGsoS0VSTl9JTkZPICJSSVA6ICUwNGx4Ols8JTAxNmx4Pl0gIiwgcmVncy0+Y3MgJiAweGZmZmYsIHJlZ3MtPmlwKTsKIAlwcmludGtfYWRkcmVzcyhyZWdzLT5pcCwgMSk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiUlNQOiAlMDRseDolMDE2bHggIEVGTEFHUzogJTA4bHhcbiIsIHJlZ3MtPnNzLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jCmluZGV4IDA0ZDE4MmEuLjcwNzlkZGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHRyYWNlLmMKQEAgLTU1NSw3ICs1NTUsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHB0cmFjZV90cmlnZ2VyZWQoc3RydWN0IHBlcmZfZXZlbnQgKmJwLCB2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgcHRyYWNlX3RyaWdnZXJlZChzdHJ1Y3QgcGVyZl9ldmVudCAqYnAsIGludCBubWksCisJCQkgICAgIHN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhICpkYXRhLAorCQkJICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdGhyZWFkID0gJihjdXJyZW50LT50aHJlYWQpOwpAQCAtNTkzLDEzICs1OTUsMTMgQEAKIAlyZXR1cm4gZHI3OwogfQogCi1zdGF0aWMgc3RydWN0IHBlcmZfZXZlbnQgKgorc3RhdGljIGludAogcHRyYWNlX21vZGlmeV9icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2ZW50ICpicCwgaW50IGxlbiwgaW50IHR5cGUsCiAJCQkgc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBkaXNhYmxlZCkKIHsKIAlpbnQgZXJyOwogCWludCBnZW5fbGVuLCBnZW5fdHlwZTsKLQlERUZJTkVfQlJFQUtQT0lOVF9BVFRSKGF0dHIpOworCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgYXR0cjsKIAogCS8qCiAJICogV2Ugc2hvdWQgaGF2ZSBhdCBsZWFzdCBhbiBpbmFjdGl2ZSBicmVha3BvaW50IGF0IHRoaXMKQEAgLTYwNywxOCArNjA5LDE4IEBACiAJICogd3JpdHRlbiB0aGUgYWRkcmVzcyByZWdpc3RlciBmaXJzdAogCSAqLwogCWlmICghYnApCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCWVyciA9IGFyY2hfYnBfZ2VuZXJpY19maWVsZHMobGVuLCB0eXBlLCAmZ2VuX2xlbiwgJmdlbl90eXBlKTsKIAlpZiAoZXJyKQotCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCQlyZXR1cm4gZXJyOwogCiAJYXR0ciA9IGJwLT5hdHRyOwogCWF0dHIuYnBfbGVuID0gZ2VuX2xlbjsKIAlhdHRyLmJwX3R5cGUgPSBnZW5fdHlwZTsKIAlhdHRyLmRpc2FibGVkID0gZGlzYWJsZWQ7CiAKLQlyZXR1cm4gbW9kaWZ5X3VzZXJfaHdfYnJlYWtwb2ludChicCwgJmF0dHIsIGJwLT5jYWxsYmFjaywgdHNrKTsKKwlyZXR1cm4gbW9kaWZ5X3VzZXJfaHdfYnJlYWtwb2ludChicCwgJmF0dHIpOwogfQogCiAvKgpAQCAtNjU2LDI4ICs2NTgsMTcgQEAKIAkJCQlpZiAoIXNlY29uZF9wYXNzKQogCQkJCQljb250aW51ZTsKIAotCQkJCXRocmVhZC0+cHRyYWNlX2Jwc1tpXSA9IE5VTEw7Ci0JCQkJYnAgPSBwdHJhY2VfbW9kaWZ5X2JyZWFrcG9pbnQoYnAsIGxlbiwgdHlwZSwKKwkJCQlyYyA9IHB0cmFjZV9tb2RpZnlfYnJlYWtwb2ludChicCwgbGVuLCB0eXBlLAogCQkJCQkJCSAgICAgIHRzaywgMSk7Ci0JCQkJaWYgKElTX0VSUihicCkpIHsKLQkJCQkJcmMgPSBQVFJfRVJSKGJwKTsKLQkJCQkJdGhyZWFkLT5wdHJhY2VfYnBzW2ldID0gTlVMTDsKKwkJCQlpZiAocmMpCiAJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQl0aHJlYWQtPnB0cmFjZV9icHNbaV0gPSBicDsKIAkJCX0KIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJYnAgPSBwdHJhY2VfbW9kaWZ5X2JyZWFrcG9pbnQoYnAsIGxlbiwgdHlwZSwgdHNrLCAwKTsKLQotCQkvKiBJbmNvcnJlY3QgYnAsIG9yIHdlIGhhdmUgYSBidWcgaW4gYnAgQVBJICovCi0JCWlmIChJU19FUlIoYnApKSB7Ci0JCQlyYyA9IFBUUl9FUlIoYnApOwotCQkJdGhyZWFkLT5wdHJhY2VfYnBzW2ldID0gTlVMTDsKKwkJcmMgPSBwdHJhY2VfbW9kaWZ5X2JyZWFrcG9pbnQoYnAsIGxlbiwgdHlwZSwgdHNrLCAwKTsKKwkJaWYgKHJjKQogCQkJYnJlYWs7Ci0JCX0KLQkJdGhyZWFkLT5wdHJhY2VfYnBzW2ldID0gYnA7CiAJfQogCS8qCiAJICogTWFrZSBhIHNlY29uZCBwYXNzIHRvIGZyZWUgdGhlIHJlbWFpbmluZyB1bnVzZWQgYnJlYWtwb2ludHMKQEAgLTcyMSw5ICs3MTIsMTAgQEAKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudCAqYnA7CiAJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnQgPSAmdHNrLT50aHJlYWQ7Ci0JREVGSU5FX0JSRUFLUE9JTlRfQVRUUihhdHRyKTsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIGF0dHI7CiAKIAlpZiAoIXQtPnB0cmFjZV9icHNbbnJdKSB7CisJCWh3X2JyZWFrcG9pbnRfaW5pdCgmYXR0cik7CiAJCS8qCiAJCSAqIFB1dCBzdHViIGxlbiBhbmQgdHlwZSB0byByZWdpc3RlciAocmVzZXJ2ZSkgYW4gaW5hY3RpdmUgYnV0CiAJCSAqIGNvcnJlY3QgYnAKQEAgLTczNCwyNiArNzI2LDMyIEBACiAJCWF0dHIuZGlzYWJsZWQgPSAxOwogCiAJCWJwID0gcmVnaXN0ZXJfdXNlcl9od19icmVha3BvaW50KCZhdHRyLCBwdHJhY2VfdHJpZ2dlcmVkLCB0c2spOworCisJCS8qCisJCSAqIENIRUNLTUU6IHRoZSBwcmV2aW91cyBjb2RlIHJldHVybmVkIC1FSU8gaWYgdGhlIGFkZHIgd2Fzbid0CisJCSAqIGEgdmFsaWQgdGFzayB2aXJ0dWFsIGFkZHIuIFRoZSBuZXcgb25lIHdpbGwgcmV0dXJuIC1FSU5WQUwgaW4KKwkJICogIHRoaXMgY2FzZS4KKwkJICogLUVJTlZBTCBtYXkgYmUgd2hhdCB3ZSB3YW50IGZvciBpbi1rZXJuZWwgYnJlYWtwb2ludHMgdXNlcnMsCisJCSAqIGJ1dCAtRUlPIGxvb2tzIGJldHRlciBmb3IgcHRyYWNlLCBzaW5jZSB3ZSByZWZ1c2UgYSByZWdpc3RlcgorCQkgKiB3cml0aW5nIGZvciB0aGUgdXNlci4gQW5kIGFueXdheSB0aGlzIGlzIHRoZSBwcmV2aW91cworCQkgKiBiZWhhdmlvdXIuCisJCSAqLworCQlpZiAoSVNfRVJSKGJwKSkKKwkJCXJldHVybiBQVFJfRVJSKGJwKTsKKworCQl0LT5wdHJhY2VfYnBzW25yXSA9IGJwOwogCX0gZWxzZSB7CisJCWludCBlcnI7CisKIAkJYnAgPSB0LT5wdHJhY2VfYnBzW25yXTsKLQkJdC0+cHRyYWNlX2Jwc1tucl0gPSBOVUxMOwogCiAJCWF0dHIgPSBicC0+YXR0cjsKIAkJYXR0ci5icF9hZGRyID0gYWRkcjsKLQkJYnAgPSBtb2RpZnlfdXNlcl9od19icmVha3BvaW50KGJwLCAmYXR0ciwgYnAtPmNhbGxiYWNrLCB0c2spOworCQllcnIgPSBtb2RpZnlfdXNlcl9od19icmVha3BvaW50KGJwLCAmYXR0cik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KLQkvKgotCSAqIENIRUNLTUU6IHRoZSBwcmV2aW91cyBjb2RlIHJldHVybmVkIC1FSU8gaWYgdGhlIGFkZHIgd2Fzbid0IGEKLQkgKiB2YWxpZCB0YXNrIHZpcnR1YWwgYWRkci4gVGhlIG5ldyBvbmUgd2lsbCByZXR1cm4gLUVJTlZBTCBpbiB0aGlzCi0JICogY2FzZS4KLQkgKiAtRUlOVkFMIG1heSBiZSB3aGF0IHdlIHdhbnQgZm9yIGluLWtlcm5lbCBicmVha3BvaW50cyB1c2VycywgYnV0Ci0JICogLUVJTyBsb29rcyBiZXR0ZXIgZm9yIHB0cmFjZSwgc2luY2Ugd2UgcmVmdXNlIGEgcmVnaXN0ZXIgd3JpdGluZwotCSAqIGZvciB0aGUgdXNlci4gQW5kIGFueXdheSB0aGlzIGlzIHRoZSBwcmV2aW91cyBiZWhhdmlvdXIuCi0JICovCi0JaWYgKElTX0VSUihicCkpCi0JCXJldHVybiBQVFJfRVJSKGJwKTsKIAotCXQtPnB0cmFjZV9icHNbbnJdID0gYnA7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYyBiL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYwppbmRleCAyYjk3ZmM1Li4xNTQ1YmMwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCkBAIC0yNTksNiArMjU5LDE0IEBACiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlNCQy1GSVRQQzIiKSwKIAkJfSwKIAl9LAorCXsgICAgICAgLyogSGFuZGxlIHByb2JsZW1zIHdpdGggcmVib290aW5nIG9uIEFTVVMgUDRTODAwICovCisJCS5jYWxsYmFjayA9IHNldF9iaW9zX3JlYm9vdCwKKwkJLmlkZW50ID0gIkFTVVMgUDRTODAwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DLiIpLAorCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiUDRTODAwIiksCisJCX0sCisJfSwKIAl7IH0KIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zZXR1cF9wZXJjcHUuYyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cF9wZXJjcHUuYwppbmRleCBkNTU5YWY5Li4zNWFiY2I4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc2V0dXBfcGVyY3B1LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3NldHVwX3BlcmNwdS5jCkBAIC0xLDMgKzEsNSBAQAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMjAsOSArMjIsOSBAQAogI2luY2x1ZGUgPGFzbS9zdGFja3Byb3RlY3Rvci5oPgogCiAjaWZkZWYgQ09ORklHX0RFQlVHX1BFUl9DUFVfTUFQUwotIyBkZWZpbmUgREJHKHguLi4pIHByaW50ayhLRVJOX0RFQlVHIHgpCisjIGRlZmluZSBEQkcoZm10LCAuLi4pIHByX2RiZyhmbXQsICMjX19WQV9BUkdTX18pCiAjZWxzZQotIyBkZWZpbmUgREJHKHguLi4pCisjIGRlZmluZSBEQkcoZm10LCAuLi4pIGRvIHsgaWYgKDApIHByX2RiZyhmbXQsICMjX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQogI2VuZGlmCiAKIERFRklORV9QRVJfQ1BVKGludCwgY3B1X251bWJlcik7CkBAIC0xMTYsOCArMTE4LDggQEAKIAl9IGVsc2UgewogCQlwdHIgPSBfX2FsbG9jX2Jvb3RtZW1fbm9kZV9ub3BhbmljKE5PREVfREFUQShub2RlKSwKIAkJCQkJCSAgIHNpemUsIGFsaWduLCBnb2FsKTsKLQkJcHJfZGVidWcoInBlciBjcHUgZGF0YSBmb3IgY3B1JWQgJWx1IGJ5dGVzIG9uIG5vZGUlZCBhdCAiCi0JCQkgIiUwMTZseFxuIiwgY3B1LCBzaXplLCBub2RlLCBfX3BhKHB0cikpOworCQlwcl9kZWJ1ZygicGVyIGNwdSBkYXRhIGZvciBjcHUlZCAlbHUgYnl0ZXMgb24gbm9kZSVkIGF0ICUwMTZseFxuIiwKKwkJCSBjcHUsIHNpemUsIG5vZGUsIF9fcGEocHRyKSk7CiAJfQogCXJldHVybiBwdHI7CiAjZWxzZQpAQCAtMTk4LDggKzIwMCw3IEBACiAJCQkJCSAgICBwY3B1X2NwdV9kaXN0YW5jZSwKIAkJCQkJICAgIHBjcHVfZmNfYWxsb2MsIHBjcHVfZmNfZnJlZSk7CiAJCWlmIChyYyA8IDApCi0JCQlwcl93YXJuaW5nKCJQRVJDUFU6ICVzIGFsbG9jYXRvciBmYWlsZWQgKCVkKSwgIgotCQkJCSAgICJmYWxsaW5nIGJhY2sgdG8gcGFnZSBzaXplXG4iLAorCQkJcHJfd2FybmluZygiJXMgYWxsb2NhdG9yIGZhaWxlZCAoJWQpLCBmYWxsaW5nIGJhY2sgdG8gcGFnZSBzaXplXG4iLAogCQkJCSAgIHBjcHVfZmNfbmFtZXNbcGNwdV9jaG9zZW5fZmNdLCByYyk7CiAJfQogCWlmIChyYyA8IDApCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc3lzX2kzODZfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9zeXNfaTM4Nl8zMi5jCmluZGV4IDE4ODRhOGQuLmRlZTFmZjcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zeXNfaTM4Nl8zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zeXNfaTM4Nl8zMi5jCkBAIC0yNCwzMSArMjQsNiBAQAogCiAjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJCSAgdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAotCQkJICB1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCWludCBlcnJvciA9IC1FQkFERjsKLQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IE5VTEw7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKLQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwotCi0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCiAvKgogICogUGVyZm9ybSB0aGUgc2VsZWN0KG5kLCBpbiwgb3V0LCBleCwgdHYpIGFuZCBtbWFwKCkgc3lzdGVtCiAgKiBjYWxscy4gTGludXgvaTM4NiBkaWRuJ3QgdXNlIHRvIGJlIGFibGUgdG8gaGFuZGxlIG1vcmUgdGhhbgpAQCAtNzcsNyArNTIsNyBAQAogCWlmIChhLm9mZnNldCAmIH5QQUdFX01BU0spCiAJCWdvdG8gb3V0OwogCi0JZXJyID0gc3lzX21tYXAyKGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywKKwllcnIgPSBzeXNfbW1hcF9wZ29mZihhLmFkZHIsIGEubGVuLCBhLnByb3QsIGEuZmxhZ3MsCiAJCQlhLmZkLCBhLm9mZnNldCA+PiBQQUdFX1NISUZUKTsKIG91dDoKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3N5c194ODZfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9zeXNfeDg2XzY0LmMKaW5kZXggNDVlMDBlYi4uOGFhMjA1NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3N5c194ODZfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc3lzX3g4Nl82NC5jCkBAIC0yMywyNiArMjMsMTEgQEAKIAkJdW5zaWduZWQgbG9uZywgZmQsIHVuc2lnbmVkIGxvbmcsIG9mZikKIHsKIAlsb25nIGVycm9yOwotCXN0cnVjdCBmaWxlICpmaWxlOwotCiAJZXJyb3IgPSAtRUlOVkFMOwogCWlmIChvZmYgJiB+UEFHRV9NQVNLKQogCQlnb3RvIG91dDsKIAotCWVycm9yID0gLUVCQURGOwotCWZpbGUgPSBOVUxMOwotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JZXJyb3IgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIG9mZiA+PiBQQUdFX1NISUZUKTsKLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOworCWVycm9yID0gc3lzX21tYXBfcGdvZmYoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIG9mZiA+PiBQQUdFX1NISUZUKTsKIG91dDoKIAlyZXR1cm4gZXJyb3I7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZV8zMi5TIGIvYXJjaC94ODYva2VybmVsL3N5c2NhbGxfdGFibGVfMzIuUwppbmRleCA3MGMyMTI1Li4xNTIyOGI1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZV8zMi5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zeXNjYWxsX3RhYmxlXzMyLlMKQEAgLTE5MSw3ICsxOTEsNyBAQAogCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHJlc2VydmVkIGZvciBzdHJlYW1zMiAqLwogCS5sb25nIHB0cmVnc192Zm9yawkvKiAxOTAgKi8KIAkubG9uZyBzeXNfZ2V0cmxpbWl0Ci0JLmxvbmcgc3lzX21tYXAyCisJLmxvbmcgc3lzX21tYXBfcGdvZmYKIAkubG9uZyBzeXNfdHJ1bmNhdGU2NAogCS5sb25nIHN5c19mdHJ1bmNhdGU2NAogCS5sb25nIHN5c19zdGF0NjQJLyogMTk1ICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vaTgyNTQuYyBiL2FyY2gveDg2L2t2bS9pODI1NC5jCmluZGV4IGZhYjc0NDAuLjI5NmFiYTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9pODI1NC5jCisrKyBiL2FyY2gveDg2L2t2bS9pODI1NC5jCkBAIC0yOSw2ICsyOSw4IEBACiAgKiAgIEJhc2VkIG9uIFFFTVUgYW5kIFhlbi4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpICJwaXQ6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogCiAjaW5jbHVkZSAiaXJxLmgiCkBAIC0yNjIsNyArMjY0LDcgQEAKIAogc3RhdGljIHZvaWQgZGVzdHJveV9waXRfdGltZXIoc3RydWN0IGt2bV90aW1lciAqcHQpCiB7Ci0JcHJfZGVidWcoInBpdDogZXhlY3V0ZSBkZWwgdGltZXIhXG4iKTsKKwlwcl9kZWJ1ZygiZXhlY3V0ZSBkZWwgdGltZXIhXG4iKTsKIAlocnRpbWVyX2NhbmNlbCgmcHQtPnRpbWVyKTsKIH0KIApAQCAtMjg0LDcgKzI4Niw3IEBACiAKIAlpbnRlcnZhbCA9IG11bGRpdjY0KHZhbCwgTlNFQ19QRVJfU0VDLCBLVk1fUElUX0ZSRVEpOwogCi0JcHJfZGVidWcoInBpdDogY3JlYXRlIHBpdCB0aW1lciwgaW50ZXJ2YWwgaXMgJWxsdSBuc2VjXG4iLCBpbnRlcnZhbCk7CisJcHJfZGVidWcoImNyZWF0ZSBwaXQgdGltZXIsIGludGVydmFsIGlzICVsbHUgbnNlY1xuIiwgaW50ZXJ2YWwpOwogCiAJLyogVE9ETyBUaGUgbmV3IHZhbHVlIG9ubHkgYWZmZWN0ZWQgYWZ0ZXIgdGhlIHJldHJpZ2dlcmVkICovCiAJaHJ0aW1lcl9jYW5jZWwoJnB0LT50aW1lcik7CkBAIC0zMDksNyArMzExLDcgQEAKIAogCVdBUk5fT04oIW11dGV4X2lzX2xvY2tlZCgmcHMtPmxvY2spKTsKIAotCXByX2RlYnVnKCJwaXQ6IGxvYWRfY291bnQgdmFsIGlzICVkLCBjaGFubmVsIGlzICVkXG4iLCB2YWwsIGNoYW5uZWwpOworCXByX2RlYnVnKCJsb2FkX2NvdW50IHZhbCBpcyAlZCwgY2hhbm5lbCBpcyAlZFxuIiwgdmFsLCBjaGFubmVsKTsKIAogCS8qCiAJICogVGhlIGxhcmdlc3QgcG9zc2libGUgaW5pdGlhbCBjb3VudCBpcyAwOyB0aGlzIGlzIGVxdWl2YWxlbnQKQEAgLTM5NSw4ICszOTcsOCBAQAogCW11dGV4X2xvY2soJnBpdF9zdGF0ZS0+bG9jayk7CiAKIAlpZiAodmFsICE9IDApCi0JCXByX2RlYnVnKCJwaXQ6IHdyaXRlIGFkZHIgaXMgMHgleCwgbGVuIGlzICVkLCB2YWwgaXMgMHgleFxuIiwKLQkJCSAgKHVuc2lnbmVkIGludClhZGRyLCBsZW4sIHZhbCk7CisJCXByX2RlYnVnKCJ3cml0ZSBhZGRyIGlzIDB4JXgsIGxlbiBpcyAlZCwgdmFsIGlzIDB4JXhcbiIsCisJCQkgKHVuc2lnbmVkIGludClhZGRyLCBsZW4sIHZhbCk7CiAKIAlpZiAoYWRkciA9PSAzKSB7CiAJCWNoYW5uZWwgPSB2YWwgPj4gNjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi9NYWtlZmlsZSBiL2FyY2gveDg2L2xpYi9NYWtlZmlsZQppbmRleCBhMmQ2NDcyLi40NWIyMGU0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvbGliL01ha2VmaWxlCkBAIC01LDcgKzUsNyBAQAogaW5hdF90YWJsZXNfc2NyaXB0ID0gJChzcmN0cmVlKS9hcmNoL3g4Ni90b29scy9nZW4taW5zbi1hdHRyLXg4Ni5hd2sKIGluYXRfdGFibGVzX21hcHMgPSAkKHNyY3RyZWUpL2FyY2gveDg2L2xpYi94ODYtb3Bjb2RlLW1hcC50eHQKIHF1aWV0X2NtZF9pbmF0X3RhYmxlcyA9IEdFTiAgICAgJEAKLSAgICAgIGNtZF9pbmF0X3RhYmxlcyA9ICQoQVdLKSAtZiAkKGluYXRfdGFibGVzX3NjcmlwdCkgJChpbmF0X3RhYmxlc19tYXBzKSA+ICRACisgICAgICBjbWRfaW5hdF90YWJsZXMgPSAkKEFXSykgLWYgJChpbmF0X3RhYmxlc19zY3JpcHQpICQoaW5hdF90YWJsZXNfbWFwcykgPiAkQCB8fCBybSAtZiAkQAogCiAkKG9iaikvaW5hdC10YWJsZXMuYzogJChpbmF0X3RhYmxlc19zY3JpcHQpICQoaW5hdF90YWJsZXNfbWFwcykKIAkkKGNhbGwgY21kLGluYXRfdGFibGVzKQpAQCAtMjAsNyArMjAsNyBAQAogbGliLXkgKz0gdGh1bmtfJChCSVRTKS5vCiBsaWIteSArPSB1c2VyY29weV8kKEJJVFMpLm8gZ2V0dXNlci5vIHB1dHVzZXIubwogbGliLXkgKz0gbWVtY3B5XyQoQklUUykubwotbGliLXkgKz0gaW5zbi5vIGluYXQubworbGliLSQoQ09ORklHX0tQUk9CRVMpICs9IGluc24ubyBpbmF0Lm8KIAogb2JqLXkgKz0gbXNyLXJlZy5vIG1zci1yZWctZXhwb3J0Lm8KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0va21taW8uYyBiL2FyY2gveDg2L21tL2ttbWlvLmMKaW5kZXggMDdiY2MzMC4uYzBmNjE5OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0va21taW8uYworKysgYi9hcmNoL3g4Ni9tbS9rbW1pby5jCkBAIC01LDYgKzUsOCBAQAogICogICAgIDIwMDggUGVra2EgUGFhbGFuZW4gPHBxQGlraS5maT4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CkBAIC0xMzYsNyArMTM4LDcgQEAKIAlwdGVfdCAqcHRlID0gbG9va3VwX2FkZHJlc3MoZi0+cGFnZSwgJmxldmVsKTsKIAogCWlmICghcHRlKSB7Ci0JCXByX2Vycigia21taW86IG5vIHB0ZSBmb3IgcGFnZSAweCUwOGx4XG4iLCBmLT5wYWdlKTsKKwkJcHJfZXJyKCJubyBwdGUgZm9yIHBhZ2UgMHglMDhseFxuIiwgZi0+cGFnZSk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTE0OCw3ICsxNTAsNyBAQAogCQljbGVhcl9wdGVfcHJlc2VuY2UocHRlLCBjbGVhciwgJmYtPm9sZF9wcmVzZW5jZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByX2Vycigia21taW86IHVuZXhwZWN0ZWQgcGFnZSBsZXZlbCAweCV4LlxuIiwgbGV2ZWwpOworCQlwcl9lcnIoInVuZXhwZWN0ZWQgcGFnZSBsZXZlbCAweCV4LlxuIiwgbGV2ZWwpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xNzAsMTMgKzE3MiwxNCBAQAogc3RhdGljIGludCBhcm1fa21taW9fZmF1bHRfcGFnZShzdHJ1Y3Qga21taW9fZmF1bHRfcGFnZSAqZikKIHsKIAlpbnQgcmV0OwotCVdBUk5fT05DRShmLT5hcm1lZCwgS0VSTl9FUlIgImttbWlvIHBhZ2UgYWxyZWFkeSBhcm1lZC5cbiIpOworCVdBUk5fT05DRShmLT5hcm1lZCwgS0VSTl9FUlIgcHJfZm10KCJrbW1pbyBwYWdlIGFscmVhZHkgYXJtZWQuXG4iKSk7CiAJaWYgKGYtPmFybWVkKSB7Ci0JCXByX3dhcm5pbmcoImttbWlvIGRvdWJsZS1hcm06IHBhZ2UgMHglMDhseCwgcmVmICVkLCBvbGQgJWRcbiIsCi0JCQkJCWYtPnBhZ2UsIGYtPmNvdW50LCAhIWYtPm9sZF9wcmVzZW5jZSk7CisJCXByX3dhcm5pbmcoImRvdWJsZS1hcm06IHBhZ2UgMHglMDhseCwgcmVmICVkLCBvbGQgJWRcbiIsCisJCQkgICBmLT5wYWdlLCBmLT5jb3VudCwgISFmLT5vbGRfcHJlc2VuY2UpOwogCX0KIAlyZXQgPSBjbGVhcl9wYWdlX3ByZXNlbmNlKGYsIHRydWUpOwotCVdBUk5fT05DRShyZXQgPCAwLCBLRVJOX0VSUiAia21taW8gYXJtaW5nIDB4JTA4bHggZmFpbGVkLlxuIiwgZi0+cGFnZSk7CisJV0FSTl9PTkNFKHJldCA8IDAsIEtFUk5fRVJSIHByX2ZtdCgiYXJtaW5nIDB4JTA4bHggZmFpbGVkLlxuIiksCisJCSAgZi0+cGFnZSk7CiAJZi0+YXJtZWQgPSB0cnVlOwogCXJldHVybiByZXQ7CiB9CkBAIC0yNDAsMjQgKzI0MywyMSBAQAogCQkJICogY29uZGl0aW9uIG5lZWRzIGhhbmRsaW5nIGJ5IGRvX3BhZ2VfZmF1bHQoKSwgdGhlCiAJCQkgKiBwYWdlIHJlYWxseSBub3QgYmVpbmcgcHJlc2VudCBpcyB0aGUgbW9zdCBjb21tb24uCiAJCQkgKi8KLQkJCXByX2RlYnVnKCJrbW1pbzogc2Vjb25kYXJ5IGhpdCBmb3IgMHglMDhseCBDUFUgJWQuXG4iLAotCQkJCQlhZGRyLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCQkJcHJfZGVidWcoInNlY29uZGFyeSBoaXQgZm9yIDB4JTA4bHggQ1BVICVkLlxuIiwKKwkJCQkgYWRkciwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAogCQkJaWYgKCFmYXVsdHBhZ2UtPm9sZF9wcmVzZW5jZSkKLQkJCQlwcl9pbmZvKCJrbW1pbzogdW5leHBlY3RlZCBzZWNvbmRhcnkgaGl0IGZvciAiCi0JCQkJCSJhZGRyZXNzIDB4JTA4bHggb24gQ1BVICVkLlxuIiwgYWRkciwKLQkJCQkJc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwkJCQlwcl9pbmZvKCJ1bmV4cGVjdGVkIHNlY29uZGFyeSBoaXQgZm9yIGFkZHJlc3MgMHglMDhseCBvbiBDUFUgJWQuXG4iLAorCQkJCQlhZGRyLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIFByZXZlbnQgb3ZlcndyaXRpbmcgYWxyZWFkeSBpbi1mbGlnaHQgY29udGV4dC4KIAkJCSAqIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGxldCdzIGhvcGUgZGlzYXJtaW5nIGF0CiAJCQkgKiBsZWFzdCBwcmV2ZW50cyBhIHBhbmljLgogCQkJICovCi0JCQlwcl9lbWVyZygia21taW86IHJlY3Vyc2l2ZSBwcm9iZSBoaXQgb24gQ1BVICVkLCAiCi0JCQkJCSJmb3IgYWRkcmVzcyAweCUwOGx4LiBJZ25vcmluZy5cbiIsCi0JCQkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgYWRkcik7Ci0JCQlwcl9lbWVyZygia21taW86IHByZXZpb3VzIGhpdCB3YXMgYXQgMHglMDhseC5cbiIsCi0JCQkJCQljdHgtPmFkZHIpOworCQkJcHJfZW1lcmcoInJlY3Vyc2l2ZSBwcm9iZSBoaXQgb24gQ1BVICVkLCBmb3IgYWRkcmVzcyAweCUwOGx4LiBJZ25vcmluZy5cbiIsCisJCQkJIHNtcF9wcm9jZXNzb3JfaWQoKSwgYWRkcik7CisJCQlwcl9lbWVyZygicHJldmlvdXMgaGl0IHdhcyBhdCAweCUwOGx4LlxuIiwgY3R4LT5hZGRyKTsKIAkJCWRpc2FybV9rbW1pb19mYXVsdF9wYWdlKGZhdWx0cGFnZSk7CiAJCX0KIAkJZ290byBub19rbW1pb19jdHg7CkBAIC0zMTYsOCArMzE2LDggQEAKIAkJICogc29tZXRoaW5nIGV4dGVybmFsIGNhdXNpbmcgdGhlbSAoZi5lLiB1c2luZyBhIGRlYnVnZ2VyIHdoaWxlCiAJCSAqIG1taW8gdHJhY2luZyBlbmFibGVkKSwgb3IgZXJyb25lb3VzIGJlaGF2aW91cgogCQkgKi8KLQkJcHJfd2FybmluZygia21taW86IHVuZXhwZWN0ZWQgZGVidWcgdHJhcCBvbiBDUFUgJWQuXG4iLAotCQkJCQkJCXNtcF9wcm9jZXNzb3JfaWQoKSk7CisJCXByX3dhcm5pbmcoInVuZXhwZWN0ZWQgZGVidWcgdHJhcCBvbiBDUFUgJWQuXG4iLAorCQkJICAgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC00MjUsNyArNDI1LDcgQEAKIAlsaXN0X2FkZF9yY3UoJnAtPmxpc3QsICZrbW1pb19wcm9iZXMpOwogCXdoaWxlIChzaXplIDwgc2l6ZV9saW0pIHsKIAkJaWYgKGFkZF9rbW1pb19mYXVsdF9wYWdlKHAtPmFkZHIgKyBzaXplKSkKLQkJCXByX2Vycigia21taW86IFVuYWJsZSB0byBzZXQgcGFnZSBmYXVsdC5cbiIpOworCQkJcHJfZXJyKCJVbmFibGUgdG8gc2V0IHBhZ2UgZmF1bHQuXG4iKTsKIAkJc2l6ZSArPSBQQUdFX1NJWkU7CiAJfQogb3V0OgpAQCAtNDkwLDcgKzQ5MCw3IEBACiAgKiAyLiByZW1vdmVfa21taW9fZmF1bHRfcGFnZXMoKQogICogICAgUmVtb3ZlIHRoZSBwYWdlcyBmcm9tIGttbWlvX3BhZ2VfdGFibGUuCiAgKiAzLiByY3VfZnJlZV9rbW1pb19mYXVsdF9wYWdlcygpCi0gKiAgICBBY3RhbGx5IGZyZWUgdGhlIGttbWlvX2ZhdWx0X3BhZ2Ugc3RydWN0cyBhcyB3aXRoIFJDVS4KKyAqICAgIEFjdHVhbGx5IGZyZWUgdGhlIGttbWlvX2ZhdWx0X3BhZ2Ugc3RydWN0cyBhcyB3aXRoIFJDVS4KICAqLwogdm9pZCB1bnJlZ2lzdGVyX2ttbWlvX3Byb2JlKHN0cnVjdCBrbW1pb19wcm9iZSAqcCkKIHsKQEAgLTUxMSw3ICs1MTEsNyBAQAogCiAJZHJlbGVhc2UgPSBrbWFsbG9jKHNpemVvZigqZHJlbGVhc2UpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWRyZWxlYXNlKSB7Ci0JCXByX2NyaXQoImttbWlvOiBsZWFraW5nIGttbWlvX2ZhdWx0X3BhZ2Ugb2JqZWN0cy5cbiIpOworCQlwcl9jcml0KCJsZWFraW5nIGttbWlvX2ZhdWx0X3BhZ2Ugb2JqZWN0cy5cbiIpOwogCQlyZXR1cm47CiAJfQogCWRyZWxlYXNlLT5yZWxlYXNlX2xpc3QgPSByZWxlYXNlX2xpc3Q7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9tbWlvLW1vZC5jIGIvYXJjaC94ODYvbW0vbW1pby1tb2QuYwppbmRleCAxMzI3NzJhLi40Yzc2NWU5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9tbWlvLW1vZC5jCisrKyBiL2FyY2gveDg2L21tL21taW8tbW9kLmMKQEAgLTE5LDYgKzE5LDkgQEAKICAqCiAgKiBEZXJpdmVkIGZyb20gdGhlIHJlYWQtbW9kIGV4YW1wbGUgZnJvbSByZWxheS1leGFtcGxlcyBieSBUb20gWmFudXNzaS4KICAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpICJtbWlvdHJhY2U6ICIKKwogI2RlZmluZSBERUJVRyAxCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTM2LDggKzM5LDYgQEAKIAogI2luY2x1ZGUgInBmX2luLmgiCiAKLSNkZWZpbmUgTkFNRSAibW1pb3RyYWNlOiAiCi0KIHN0cnVjdCB0cmFwX3JlYXNvbiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCXVuc2lnbmVkIGxvbmcgaXA7CkBAIC05NiwxNyArOTcsMTggQEAKIAlwdGVfdCAqcHRlID0gbG9va3VwX2FkZHJlc3MoYWRkcmVzcywgJmxldmVsKTsKIAogCWlmICghcHRlKSB7Ci0JCXByX2VycihOQU1FICJFcnJvciBpbiAlczogbm8gcHRlIGZvciBwYWdlIDB4JTA4bHhcbiIsCi0JCQkJCQkJX19mdW5jX18sIGFkZHJlc3MpOworCQlwcl9lcnIoIkVycm9yIGluICVzOiBubyBwdGUgZm9yIHBhZ2UgMHglMDhseFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBhZGRyZXNzKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmIChsZXZlbCA9PSBQR19MRVZFTF8yTSkgewotCQlwcl9lbWVyZyhOQU1FICI0TUIgcGFnZXMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkOiAiCi0JCQkJCQkJIjB4JTA4bHhcbiIsIGFkZHJlc3MpOworCQlwcl9lbWVyZygiNE1CIHBhZ2VzIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZDogMHglMDhseFxuIiwKKwkJCSBhZGRyZXNzKTsKIAkJQlVHKCk7CiAJfQotCXByX2luZm8oTkFNRSAicHRlIGZvciAweCVseDogMHglbGx4IDB4JWxseFxuIiwgYWRkcmVzcywKKwlwcl9pbmZvKCJwdGUgZm9yIDB4JWx4OiAweCVsbHggMHglbGx4XG4iLAorCQlhZGRyZXNzLAogCQkodW5zaWduZWQgbG9uZyBsb25nKXB0ZV92YWwoKnB0ZSksCiAJCSh1bnNpZ25lZCBsb25nIGxvbmcpcHRlX3ZhbCgqcHRlKSAmIF9QQUdFX1BSRVNFTlQpOwogfQpAQCAtMTE4LDIyICsxMjAsMjEgQEAKIHN0YXRpYyB2b2lkIGRpZV9rbW1pb19uZXN0aW5nX2Vycm9yKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJY29uc3Qgc3RydWN0IHRyYXBfcmVhc29uICpteV9yZWFzb24gPSAmZ2V0X2NwdV92YXIocGZfcmVhc29uKTsKLQlwcl9lbWVyZyhOQU1FICJ1bmV4cGVjdGVkIGZhdWx0IGZvciBhZGRyZXNzOiAweCUwOGx4LCAiCi0JCQkJCSJsYXN0IGZhdWx0IGZvciBhZGRyZXNzOiAweCUwOGx4XG4iLAotCQkJCQlhZGRyLCBteV9yZWFzb24tPmFkZHIpOworCXByX2VtZXJnKCJ1bmV4cGVjdGVkIGZhdWx0IGZvciBhZGRyZXNzOiAweCUwOGx4LCBsYXN0IGZhdWx0IGZvciBhZGRyZXNzOiAweCUwOGx4XG4iLAorCQkgYWRkciwgbXlfcmVhc29uLT5hZGRyKTsKIAlwcmludF9wdGUoYWRkcik7CiAJcHJpbnRfc3ltYm9sKEtFUk5fRU1FUkcgImZhdWx0aW5nIElQIGlzIGF0ICVzXG4iLCByZWdzLT5pcCk7CiAJcHJpbnRfc3ltYm9sKEtFUk5fRU1FUkcgImxhc3QgZmF1bHRpbmcgSVAgd2FzIGF0ICVzXG4iLCBteV9yZWFzb24tPmlwKTsKICNpZmRlZiBfX2kzODZfXwogCXByX2VtZXJnKCJlYXg6ICUwOGx4ICAgZWJ4OiAlMDhseCAgIGVjeDogJTA4bHggICBlZHg6ICUwOGx4XG4iLAotCQkJcmVncy0+YXgsIHJlZ3MtPmJ4LCByZWdzLT5jeCwgcmVncy0+ZHgpOworCQkgcmVncy0+YXgsIHJlZ3MtPmJ4LCByZWdzLT5jeCwgcmVncy0+ZHgpOwogCXByX2VtZXJnKCJlc2k6ICUwOGx4ICAgZWRpOiAlMDhseCAgIGVicDogJTA4bHggICBlc3A6ICUwOGx4XG4iLAotCQkJcmVncy0+c2ksIHJlZ3MtPmRpLCByZWdzLT5icCwgcmVncy0+c3ApOworCQkgcmVncy0+c2ksIHJlZ3MtPmRpLCByZWdzLT5icCwgcmVncy0+c3ApOwogI2Vsc2UKIAlwcl9lbWVyZygicmF4OiAlMDE2bHggICByY3g6ICUwMTZseCAgIHJkeDogJTAxNmx4XG4iLAotCQkJCQlyZWdzLT5heCwgcmVncy0+Y3gsIHJlZ3MtPmR4KTsKKwkJIHJlZ3MtPmF4LCByZWdzLT5jeCwgcmVncy0+ZHgpOwogCXByX2VtZXJnKCJyc2k6ICUwMTZseCAgIHJkaTogJTAxNmx4ICAgcmJwOiAlMDE2bHggICByc3A6ICUwMTZseFxuIiwKLQkJCQlyZWdzLT5zaSwgcmVncy0+ZGksIHJlZ3MtPmJwLCByZWdzLT5zcCk7CisJCSByZWdzLT5zaSwgcmVncy0+ZGksIHJlZ3MtPmJwLCByZWdzLT5zcCk7CiAjZW5kaWYKIAlwdXRfY3B1X3ZhcihwZl9yZWFzb24pOwogCUJVRygpOwpAQCAtMjEzLDcgKzIxNCw3IEBACiAJLyogdGhpcyBzaG91bGQgYWx3YXlzIHJldHVybiB0aGUgYWN0aXZlX3RyYWNlIGNvdW50IHRvIDAgKi8KIAlteV9yZWFzb24tPmFjdGl2ZV90cmFjZXMtLTsKIAlpZiAobXlfcmVhc29uLT5hY3RpdmVfdHJhY2VzKSB7Ci0JCXByX2VtZXJnKE5BTUUgInVuZXhwZWN0ZWQgcG9zdCBoYW5kbGVyIik7CisJCXByX2VtZXJnKCJ1bmV4cGVjdGVkIHBvc3QgaGFuZGxlciIpOwogCQlCVUcoKTsKIAl9CiAKQEAgLTI0NCw3ICsyNDUsNyBAQAogCX07CiAKIAlpZiAoIXRyYWNlKSB7Ci0JCXByX2VycihOQU1FICJrbWFsbG9jIGZhaWxlZCBpbiBpb3JlbWFwXG4iKTsKKwkJcHJfZXJyKCJrbWFsbG9jIGZhaWxlZCBpbiBpb3JlbWFwXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjgyLDggKzI4Myw4IEBACiAJaWYgKCFpc19lbmFibGVkKCkpIC8qIHJlY2hlY2sgYW5kIHByb3BlciBsb2NraW5nIGluICpfY29yZSgpICovCiAJCXJldHVybjsKIAotCXByX2RlYnVnKE5BTUUgImlvcmVtYXBfKigweCVsbHgsIDB4JWx4KSA9ICVwXG4iLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpb2Zmc2V0LCBzaXplLCBhZGRyKTsKKwlwcl9kZWJ1ZygiaW9yZW1hcF8qKDB4JWxseCwgMHglbHgpID0gJXBcbiIsCisJCSAodW5zaWduZWQgbG9uZyBsb25nKW9mZnNldCwgc2l6ZSwgYWRkcik7CiAJaWYgKChmaWx0ZXJfb2Zmc2V0KSAmJiAob2Zmc2V0ICE9IGZpbHRlcl9vZmZzZXQpKQogCQlyZXR1cm47CiAJaW9yZW1hcF90cmFjZV9jb3JlKG9mZnNldCwgc2l6ZSwgYWRkcik7CkBAIC0zMDEsNyArMzAyLDcgQEAKIAlzdHJ1Y3QgcmVtYXBfdHJhY2UgKnRtcDsKIAlzdHJ1Y3QgcmVtYXBfdHJhY2UgKmZvdW5kX3RyYWNlID0gTlVMTDsKIAotCXByX2RlYnVnKE5BTUUgIlVubWFwcGluZyAlcC5cbiIsIGFkZHIpOworCXByX2RlYnVnKCJVbm1hcHBpbmcgJXAuXG4iLCBhZGRyKTsKIAogCXNwaW5fbG9ja19pcnEoJnRyYWNlX2xvY2spOwogCWlmICghaXNfZW5hYmxlZCgpKQpAQCAtMzYzLDkgKzM2NCw4IEBACiAJICogQ2FsbGVyIGFsc28gZW5zdXJlcyBpc19lbmFibGVkKCkgY2Fubm90IGNoYW5nZS4KIAkgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyYWNlLCAmdHJhY2VfbGlzdCwgbGlzdCkgewotCQlwcl9ub3RpY2UoTkFNRSAicHVyZ2luZyBub24taW91bm1hcHBlZCAiCi0JCQkJCSJ0cmFjZSBAMHglMDhseCwgc2l6ZSAweCVseC5cbiIsCi0JCQkJCXRyYWNlLT5wcm9iZS5hZGRyLCB0cmFjZS0+cHJvYmUubGVuKTsKKwkJcHJfbm90aWNlKCJwdXJnaW5nIG5vbi1pb3VubWFwcGVkIHRyYWNlIEAweCUwOGx4LCBzaXplIDB4JWx4LlxuIiwKKwkJCSAgdHJhY2UtPnByb2JlLmFkZHIsIHRyYWNlLT5wcm9iZS5sZW4pOwogCQlpZiAoIW5vbW1pb3RyYWNlKQogCQkJdW5yZWdpc3Rlcl9rbW1pb19wcm9iZSgmdHJhY2UtPnByb2JlKTsKIAl9CkBAIC0zODcsNyArMzg3LDcgQEAKIAogCWlmIChkb3duZWRfY3B1cyA9PSBOVUxMICYmCiAJICAgICFhbGxvY19jcHVtYXNrX3ZhcigmZG93bmVkX2NwdXMsIEdGUF9LRVJORUwpKSB7Ci0JCXByX25vdGljZShOQU1FICJGYWlsZWQgdG8gYWxsb2NhdGUgbWFza1xuIik7CisJCXByX25vdGljZSgiRmFpbGVkIHRvIGFsbG9jYXRlIG1hc2tcbiIpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTM5NSwyMCArMzk1LDE5IEBACiAJY3B1bWFza19jb3B5KGRvd25lZF9jcHVzLCBjcHVfb25saW5lX21hc2spOwogCWNwdW1hc2tfY2xlYXJfY3B1KGNwdW1hc2tfZmlyc3QoY3B1X29ubGluZV9tYXNrKSwgZG93bmVkX2NwdXMpOwogCWlmIChudW1fb25saW5lX2NwdXMoKSA+IDEpCi0JCXByX25vdGljZShOQU1FICJEaXNhYmxpbmcgbm9uLWJvb3QgQ1BVcy4uLlxuIik7CisJCXByX25vdGljZSgiRGlzYWJsaW5nIG5vbi1ib290IENQVXMuLi5cbiIpOwogCXB1dF9vbmxpbmVfY3B1cygpOwogCiAJZm9yX2VhY2hfY3B1KGNwdSwgZG93bmVkX2NwdXMpIHsKIAkJZXJyID0gY3B1X2Rvd24oY3B1KTsKIAkJaWYgKCFlcnIpCi0JCQlwcl9pbmZvKE5BTUUgIkNQVSVkIGlzIGRvd24uXG4iLCBjcHUpOworCQkJcHJfaW5mbygiQ1BVJWQgaXMgZG93bi5cbiIsIGNwdSk7CiAJCWVsc2UKLQkJCXByX2VycihOQU1FICJFcnJvciB0YWtpbmcgQ1BVJWQgZG93bjogJWRcbiIsIGNwdSwgZXJyKTsKKwkJCXByX2VycigiRXJyb3IgdGFraW5nIENQVSVkIGRvd246ICVkXG4iLCBjcHUsIGVycik7CiAJfQogb3V0OgogCWlmIChudW1fb25saW5lX2NwdXMoKSA+IDEpCi0JCXByX3dhcm5pbmcoTkFNRSAibXVsdGlwbGUgQ1BVcyBzdGlsbCBvbmxpbmUsICIKLQkJCQkJCSJtYXkgbWlzcyBldmVudHMuXG4iKTsKKwkJcHJfd2FybmluZygibXVsdGlwbGUgQ1BVcyBzdGlsbCBvbmxpbmUsIG1heSBtaXNzIGV2ZW50cy5cbiIpOwogfQogCiAvKiBfX3JlZiBiZWNhdXNlIGxlYXZlX3VuaXByb2Nlc3NvciBjYWxscyBjcHVfdXAgd2hpY2ggaXMgX19jcHVpbml0LApAQCAtNDIwLDEzICs0MTksMTMgQEAKIAogCWlmIChkb3duZWRfY3B1cyA9PSBOVUxMIHx8IGNwdW1hc2tfd2VpZ2h0KGRvd25lZF9jcHVzKSA9PSAwKQogCQlyZXR1cm47Ci0JcHJfbm90aWNlKE5BTUUgIlJlLWVuYWJsaW5nIENQVXMuLi5cbiIpOworCXByX25vdGljZSgiUmUtZW5hYmxpbmcgQ1BVcy4uLlxuIik7CiAJZm9yX2VhY2hfY3B1KGNwdSwgZG93bmVkX2NwdXMpIHsKIAkJZXJyID0gY3B1X3VwKGNwdSk7CiAJCWlmICghZXJyKQotCQkJcHJfaW5mbyhOQU1FICJlbmFibGVkIENQVSVkLlxuIiwgY3B1KTsKKwkJCXByX2luZm8oImVuYWJsZWQgQ1BVJWQuXG4iLCBjcHUpOwogCQllbHNlCi0JCQlwcl9lcnIoTkFNRSAiY2Fubm90IHJlLWVuYWJsZSBDUFUlZDogJWRcbiIsIGNwdSwgZXJyKTsKKwkJCXByX2VycigiY2Fubm90IHJlLWVuYWJsZSBDUFUlZDogJWRcbiIsIGNwdSwgZXJyKTsKIAl9CiB9CiAKQEAgLTQzNCw4ICs0MzMsOCBAQAogc3RhdGljIHZvaWQgZW50ZXJfdW5pcHJvY2Vzc29yKHZvaWQpCiB7CiAJaWYgKG51bV9vbmxpbmVfY3B1cygpID4gMSkKLQkJcHJfd2FybmluZyhOQU1FICJtdWx0aXBsZSBDUFVzIGFyZSBvbmxpbmUsIG1heSBtaXNzIGV2ZW50cy4gIgotCQkJIlN1Z2dlc3QgYm9vdGluZyB3aXRoIG1heGNwdXM9MSBrZXJuZWwgYXJndW1lbnQuXG4iKTsKKwkJcHJfd2FybmluZygibXVsdGlwbGUgQ1BVcyBhcmUgb25saW5lLCBtYXkgbWlzcyBldmVudHMuICIKKwkJCSAgICJTdWdnZXN0IGJvb3Rpbmcgd2l0aCBtYXhjcHVzPTEga2VybmVsIGFyZ3VtZW50LlxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIGxlYXZlX3VuaXByb2Nlc3Nvcih2b2lkKQpAQCAtNDUwLDEzICs0NDksMTMgQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAobm9tbWlvdHJhY2UpCi0JCXByX2luZm8oTkFNRSAiTU1JTyB0cmFjaW5nIGRpc2FibGVkLlxuIik7CisJCXByX2luZm8oIk1NSU8gdHJhY2luZyBkaXNhYmxlZC5cbiIpOwogCWttbWlvX2luaXQoKTsKIAllbnRlcl91bmlwcm9jZXNzb3IoKTsKIAlzcGluX2xvY2tfaXJxKCZ0cmFjZV9sb2NrKTsKIAlhdG9taWNfaW5jKCZtbWlvdHJhY2VfZW5hYmxlZCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZ0cmFjZV9sb2NrKTsKLQlwcl9pbmZvKE5BTUUgImVuYWJsZWQuXG4iKTsKKwlwcl9pbmZvKCJlbmFibGVkLlxuIik7CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZtbWlvdHJhY2VfbXV0ZXgpOwogfQpAQCAtNDc1LDcgKzQ3NCw3IEBACiAJY2xlYXJfdHJhY2VfbGlzdCgpOyAvKiBndWFyYW50ZWVzOiBubyBtb3JlIGttbWlvIGNhbGxiYWNrcyAqLwogCWxlYXZlX3VuaXByb2Nlc3NvcigpOwogCWttbWlvX2NsZWFudXAoKTsKLQlwcl9pbmZvKE5BTUUgImRpc2FibGVkLlxuIik7CisJcHJfaW5mbygiZGlzYWJsZWQuXG4iKTsKIG91dDoKIAltdXRleF91bmxvY2soJm1taW90cmFjZV9tdXRleCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9wYXQuYyBiL2FyY2gveDg2L21tL3BhdC5jCmluZGV4IDY2YjU1ZDYuLmFlOTY0OGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL3BhdC5jCisrKyBiL2FyY2gveDg2L21tL3BhdC5jCkBAIC03MDQsOSArNzA0LDggQEAKIAlpZiAoIXJhbmdlX2lzX2FsbG93ZWQocGZuLCBzaXplKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykgeworCWlmIChmaWxlLT5mX2ZsYWdzICYgT19EU1lOQykKIAkJZmxhZ3MgPSBfUEFHRV9DQUNIRV9VQ19NSU5VUzsKLQl9CiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9NYWtlZmlsZSBiL2FyY2gveDg2L3BjaS9NYWtlZmlsZQppbmRleCBkNDkyMDJlLi41NjRiMDA4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvcGNpL01ha2VmaWxlCkBAIC0xNSwzICsxNSw4IEBACiAKIG9iai15CQkJCSs9IGNvbW1vbi5vIGVhcmx5Lm8KIG9iai15CQkJCSs9IGFtZF9idXMubworb2JqLSQoQ09ORklHX1g4Nl82NCkJCSs9IGJ1c19udW1hLm8gaW50ZWxfYnVzLm8KKworaWZlcSAoJChDT05GSUdfUENJX0RFQlVHKSx5KQorRVhUUkFfQ0ZMQUdTICs9IC1EREVCVUcKK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvYWNwaS5jIGIvYXJjaC94ODYvcGNpL2FjcGkuYwppbmRleCAxMDE0ZWI0Li45NTllNTQ4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvYWNwaS5jCisrKyBiL2FyY2gveDg2L3BjaS9hY3BpLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8YXNtL3BjaV94ODYuaD4KIAogc3RydWN0IHBjaV9yb290X2luZm8geworCXN0cnVjdCBhY3BpX2RldmljZSAqYnJpZGdlOwogCWNoYXIgKm5hbWU7CiAJdW5zaWduZWQgaW50IHJlc19udW07CiAJc3RydWN0IHJlc291cmNlICpyZXM7CkBAIC01OCw2ICs1OSwzMCBAQAogCXJldHVybiBmYWxzZTsKIH0KIAorc3RhdGljIHZvaWQKK2FsaWduX3Jlc291cmNlKHN0cnVjdCBhY3BpX2RldmljZSAqYnJpZGdlLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKK3sKKwlpbnQgYWxpZ24gPSAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSA/IDE2IDogNDsKKworCS8qCisJICogSG9zdCBicmlkZ2Ugd2luZG93cyBhcmUgbm90IEJBUnMsIGJ1dCB0aGUgZGVjb2RlcnMgb24gdGhlIFBDSSBzaWRlCisJICogdGhhdCBjbGFpbSB0aGlzIGFkZHJlc3Mgc3BhY2UgaGF2ZSBzdGFydGluZyBhbGlnbm1lbnQgYW5kIGxlbmd0aAorCSAqIGNvbnN0cmFpbnRzLCBzbyBmaXggYW55IG9idmlvdXMgQklPUyBnb29mcy4KKwkgKi8KKwlpZiAoIUlTX0FMSUdORUQocmVzLT5zdGFydCwgYWxpZ24pKSB7CisJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmJyaWRnZS0+ZGV2LAorCQkJICAgImhvc3QgYnJpZGdlIHdpbmRvdyAlcFIgaW52YWxpZDsgIgorCQkJICAgImFsaWduaW5nIHN0YXJ0IHRvICVkLWJ5dGUgYm91bmRhcnlcbiIsIHJlcywgYWxpZ24pOworCQlyZXMtPnN0YXJ0ICY9IH4oYWxpZ24gLSAxKTsKKwl9CisJaWYgKCFJU19BTElHTkVEKHJlcy0+ZW5kICsgMSwgYWxpZ24pKSB7CisJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmJyaWRnZS0+ZGV2LAorCQkJICAgImhvc3QgYnJpZGdlIHdpbmRvdyAlcFIgaW52YWxpZDsgIgorCQkJICAgImFsaWduaW5nIGVuZCB0byAlZC1ieXRlIGJvdW5kYXJ5XG4iLCByZXMsIGFsaWduKTsKKwkJcmVzLT5lbmQgPSBBTElHTihyZXMtPmVuZCwgYWxpZ24pIC0gMTsKKwl9Cit9CisKIHN0YXRpYyBhY3BpX3N0YXR1cwogc2V0dXBfcmVzb3VyY2Uoc3RydWN0IGFjcGlfcmVzb3VyY2UgKmFjcGlfcmVzLCB2b2lkICpkYXRhKQogewpAQCAtOTEsMTEgKzExNiwxMiBAQAogCXN0YXJ0ID0gYWRkci5taW5pbXVtICsgYWRkci50cmFuc2xhdGlvbl9vZmZzZXQ7CiAJZW5kID0gc3RhcnQgKyBhZGRyLmFkZHJlc3NfbGVuZ3RoIC0gMTsKIAlpZiAoaW5mby0+cmVzX251bSA+PSBtYXhfcm9vdF9idXNfcmVzb3VyY2VzKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlBDSTogRmFpbGVkIHRvIGFsbG9jYXRlIDB4JWx4LTB4JWx4ICIKLQkJCSJmcm9tICVzIGZvciAlcyBkdWUgdG8gX0NSUyByZXR1cm5pbmcgbW9yZSB0aGFuICIKLQkJCSIlZCByZXNvdXJjZSBkZXNjcmlwdG9yc1xuIiwgKHVuc2lnbmVkIGxvbmcpIHN0YXJ0LAotCQkJKHVuc2lnbmVkIGxvbmcpIGVuZCwgcm9vdC0+bmFtZSwgaW5mby0+bmFtZSwKLQkJCW1heF9yb290X2J1c19yZXNvdXJjZXMpOworCQlpZiAocGNpX3Byb2JlICYgUENJX1VTRV9fQ1JTKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiBGYWlsZWQgdG8gYWxsb2NhdGUgIgorCQkJICAgICAgICIweCVseC0weCVseCBmcm9tICVzIGZvciAlcyBkdWUgdG8gX0NSUyAiCisJCQkgICAgICAgInJldHVybmluZyBtb3JlIHRoYW4gJWQgcmVzb3VyY2UgZGVzY3JpcHRvcnNcbiIsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHN0YXJ0LCAodW5zaWduZWQgbG9uZykgZW5kLAorCQkJICAgICAgIHJvb3QtPm5hbWUsIGluZm8tPm5hbWUsIG1heF9yb290X2J1c19yZXNvdXJjZXMpOwogCQlyZXR1cm4gQUVfT0s7CiAJfQogCkBAIC0xMDUsMTQgKzEzMSwyOCBAQAogCXJlcy0+c3RhcnQgPSBzdGFydDsKIAlyZXMtPmVuZCA9IGVuZDsKIAlyZXMtPmNoaWxkID0gTlVMTDsKKwlhbGlnbl9yZXNvdXJjZShpbmZvLT5icmlkZ2UsIHJlcyk7CisKKwlpZiAoIShwY2lfcHJvYmUgJiBQQ0lfVVNFX19DUlMpKSB7CisJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmluZm8tPmJyaWRnZS0+ZGV2LAorCQkJICAgImhvc3QgYnJpZGdlIHdpbmRvdyAlcFIgKGlnbm9yZWQpXG4iLCByZXMpOworCQlyZXR1cm4gQUVfT0s7CisJfQogCiAJaWYgKGluc2VydF9yZXNvdXJjZShyb290LCByZXMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUENJOiBGYWlsZWQgdG8gYWxsb2NhdGUgMHglbHgtMHglbHggIgotCQkJImZyb20gJXMgZm9yICVzXG4iLCAodW5zaWduZWQgbG9uZykgcmVzLT5zdGFydCwKLQkJCSh1bnNpZ25lZCBsb25nKSByZXMtPmVuZCwgcm9vdC0+bmFtZSwgaW5mby0+bmFtZSk7CisJCWRldl9lcnIoJmluZm8tPmJyaWRnZS0+ZGV2LAorCQkJImNhbid0IGFsbG9jYXRlIGhvc3QgYnJpZGdlIHdpbmRvdyAlcFJcbiIsIHJlcyk7CiAJfSBlbHNlIHsKIAkJaW5mby0+YnVzLT5yZXNvdXJjZVtpbmZvLT5yZXNfbnVtXSA9IHJlczsKIAkJaW5mby0+cmVzX251bSsrOworCQlpZiAoYWRkci50cmFuc2xhdGlvbl9vZmZzZXQpCisJCQlkZXZfaW5mbygmaW5mby0+YnJpZGdlLT5kZXYsICJob3N0IGJyaWRnZSB3aW5kb3cgJXBSICIKKwkJCQkgIihQQ0kgYWRkcmVzcyBbJSNsbHgtJSNsbHhdKVxuIiwKKwkJCQkgcmVzLCByZXMtPnN0YXJ0IC0gYWRkci50cmFuc2xhdGlvbl9vZmZzZXQsCisJCQkJIHJlcy0+ZW5kIC0gYWRkci50cmFuc2xhdGlvbl9vZmZzZXQpOworCQllbHNlCisJCQlkZXZfaW5mbygmaW5mby0+YnJpZGdlLT5kZXYsCisJCQkJICJob3N0IGJyaWRnZSB3aW5kb3cgJXBSXG4iLCByZXMpOwogCX0KIAlyZXR1cm4gQUVfT0s7CiB9CkBAIC0xMjQsNiArMTY0LDEyIEBACiAJc3RydWN0IHBjaV9yb290X2luZm8gaW5mbzsKIAlzaXplX3Qgc2l6ZTsKIAorCWlmICghKHBjaV9wcm9iZSAmIFBDSV9VU0VfX0NSUykpCisJCWRldl9pbmZvKCZkZXZpY2UtPmRldiwKKwkJCSAiaWdub3JpbmcgaG9zdCBicmlkZ2Ugd2luZG93cyBmcm9tIEFDUEk7ICIKKwkJCSAiYm9vdCB3aXRoIFwicGNpPXVzZV9jcnNcIiB0byB1c2UgdGhlbVxuIik7CisKKwlpbmZvLmJyaWRnZSA9IGRldmljZTsKIAlpbmZvLmJ1cyA9IGJ1czsKIAlpbmZvLnJlc19udW0gPSAwOwogCWFjcGlfd2Fsa19yZXNvdXJjZXMoZGV2aWNlLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsIGNvdW50X3Jlc291cmNlLApAQCAtMTYzLDggKzIwOSw5IEBACiAjZW5kaWYKIAogCWlmIChkb21haW4gJiYgIXBjaV9kb21haW5zX3N1cHBvcnRlZCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IE11bHRpcGxlIGRvbWFpbnMgbm90IHN1cHBvcnRlZCAiCi0JCSAgICAgICAiKGRvbSAlZCwgYnVzICVkKVxuIiwgZG9tYWluLCBidXNudW0pOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJwY2lfYnVzICUwNHg6JTAyeDogIgorCQkgICAgICAgImlnbm9yZWQgKG11bHRpcGxlIGRvbWFpbnMgbm90IHN1cHBvcnRlZClcbiIsCisJCSAgICAgICBkb21haW4sIGJ1c251bSk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMTg4LDcgKzIzNSw4IEBACiAJICovCiAJc2QgPSBremFsbG9jKHNpemVvZigqc2QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUENJOiBPT00sIG5vdCBwcm9iaW5nIFBDSSBidXMgJTAyeFxuIiwgYnVzbnVtKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicGNpX2J1cyAlMDR4OiUwMng6ICIKKwkJICAgICAgICJpZ25vcmVkIChvdXQgb2YgbWVtb3J5KVxuIiwgZG9tYWluLCBidXNudW0pOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTIwOSw5ICsyNTcsNyBAQAogCX0gZWxzZSB7CiAJCWJ1cyA9IHBjaV9jcmVhdGVfYnVzKE5VTEwsIGJ1c251bSwgJnBjaV9yb290X29wcywgc2QpOwogCQlpZiAoYnVzKSB7Ci0JCQlpZiAocGNpX3Byb2JlICYgUENJX1VTRV9fQ1JTKQotCQkJCWdldF9jdXJyZW50X3Jlc291cmNlcyhkZXZpY2UsIGJ1c251bSwgZG9tYWluLAotCQkJCQkJCWJ1cyk7CisJCQlnZXRfY3VycmVudF9yZXNvdXJjZXMoZGV2aWNlLCBidXNudW0sIGRvbWFpbiwgYnVzKTsKIAkJCWJ1cy0+c3Vib3JkaW5hdGUgPSBwY2lfc2Nhbl9jaGlsZF9idXMoYnVzKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9hbWRfYnVzLmMgYi9hcmNoL3g4Ni9wY2kvYW1kX2J1cy5jCmluZGV4IDU3MmVlOTcuLjk1ZWNiZDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9hbWRfYnVzLmMKKysrIGIvYXJjaC94ODYvcGNpL2FtZF9idXMuYwpAQCAtNiwxMCArNiwxMCBAQAogCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogI2luY2x1ZGUgPGFzbS9wY2ktZGlyZWN0Lmg+Ci0jaW5jbHVkZSA8YXNtL21wc3BlYy5oPgotI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KICNlbmRpZgogCisjaW5jbHVkZSAiYnVzX251bWEuaCIKKwogLyoKICAqIFRoaXMgZGlzY292ZXJzIHRoZSBwY2lidXMgPC0+IG5vZGUgbWFwcGluZyBvbiBBTUQgSzguCiAgKiBhbHNvIGdldCBwZWVyIHJvb3QgYnVzIHJlc291cmNlIGZvciBpbyxtbWlvCkBAIC0xNyw2NyArMTcsNiBAQAogCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogCi0vKgotICogc3ViIGJ1cyAodHJhbnNwYXJlbnQpIHdpbGwgdXNlIGVudHJlcyBmcm9tIDMgdG8gc3RvcmUgZXh0cmEgZnJvbSByb290LAotICogc28gbmVlZCB0byBtYWtlIHN1cmUgaGF2ZSBlbm91Z2h0IHNsb3QgdGhlcmUsIGluY3JlYXNlIFBDSV9CVVNfTlVNX1JFU09VUkNFUz8KLSAqLwotI2RlZmluZSBSRVNfTlVNIDE2Ci1zdHJ1Y3QgcGNpX3Jvb3RfaW5mbyB7Ci0JY2hhciBuYW1lWzEyXTsKLQl1bnNpZ25lZCBpbnQgcmVzX251bTsKLQlzdHJ1Y3QgcmVzb3VyY2UgcmVzW1JFU19OVU1dOwotCWludCBidXNfbWluOwotCWludCBidXNfbWF4OwotCWludCBub2RlOwotCWludCBsaW5rOwotfTsKLQotLyogNCBhdCB0aGlzIHRpbWUsIGl0IG1heSBiZWNvbWUgdG8gMzIgKi8KLSNkZWZpbmUgUENJX1JPT1RfTlIgNAotc3RhdGljIGludCBwY2lfcm9vdF9udW07Ci1zdGF0aWMgc3RydWN0IHBjaV9yb290X2luZm8gcGNpX3Jvb3RfaW5mb1tQQ0lfUk9PVF9OUl07Ci0KLXZvaWQgeDg2X3BjaV9yb290X2J1c19yZXNfcXVpcmtzKHN0cnVjdCBwY2lfYnVzICpiKQotewotCWludCBpOwotCWludCBqOwotCXN0cnVjdCBwY2lfcm9vdF9pbmZvICppbmZvOwotCi0JLyogZG9uJ3QgZ28gZm9yIGl0IGlmIF9DUlMgaXMgdXNlZCBhbHJlYWR5ICovCi0JaWYgKGItPnJlc291cmNlWzBdICE9ICZpb3BvcnRfcmVzb3VyY2UgfHwKLQkgICAgYi0+cmVzb3VyY2VbMV0gIT0gJmlvbWVtX3Jlc291cmNlKQotCQlyZXR1cm47Ci0KLQkvKiBpZiBvbmx5IG9uZSByb290IGJ1cywgZG9uJ3QgbmVlZCB0byBhbnl0aGluZyAqLwotCWlmIChwY2lfcm9vdF9udW0gPCAyKQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGNpX3Jvb3RfbnVtOyBpKyspIHsKLQkJaWYgKHBjaV9yb290X2luZm9baV0uYnVzX21pbiA9PSBiLT5udW1iZXIpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoaSA9PSBwY2lfcm9vdF9udW0pCi0JCXJldHVybjsKLQotCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6IHBlZXIgcm9vdCBidXMgJTAyeCByZXMgdXBkYXRlZCBmcm9tIHBjaSBjb25mXG4iLAotCQkJYi0+bnVtYmVyKTsKLQotCWluZm8gPSAmcGNpX3Jvb3RfaW5mb1tpXTsKLQlmb3IgKGogPSAwOyBqIDwgaW5mby0+cmVzX251bTsgaisrKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCQlzdHJ1Y3QgcmVzb3VyY2UgKnJvb3Q7Ci0KLQkJcmVzID0gJmluZm8tPnJlc1tqXTsKLQkJYi0+cmVzb3VyY2Vbal0gPSByZXM7Ci0JCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKLQkJCXJvb3QgPSAmaW9wb3J0X3Jlc291cmNlOwotCQllbHNlCi0JCQlyb290ID0gJmlvbWVtX3Jlc291cmNlOwotCQlpbnNlcnRfcmVzb3VyY2Uocm9vdCwgcmVzKTsKLQl9Ci19Ci0KICNkZWZpbmUgUkFOR0VfTlVNIDE2CiAKIHN0cnVjdCByZXNfcmFuZ2UgewpAQCAtMTMwLDUyICs2OSw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgdXBkYXRlX3JlcyhzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbywgc2l6ZV90IHN0YXJ0LAotCQkJICAgICAgc2l6ZV90IGVuZCwgdW5zaWduZWQgbG9uZyBmbGFncywgaW50IG1lcmdlKQotewotCWludCBpOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCi0JaWYgKCFtZXJnZSkKLQkJZ290byBhZGRpdDsKLQotCS8qIHRyeSB0byBtZXJnZSBpdCB3aXRoIG9sZCBvbmUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+cmVzX251bTsgaSsrKSB7Ci0JCXNpemVfdCBmaW5hbF9zdGFydCwgZmluYWxfZW5kOwotCQlzaXplX3QgY29tbW9uX3N0YXJ0LCBjb21tb25fZW5kOwotCi0JCXJlcyA9ICZpbmZvLT5yZXNbaV07Ci0JCWlmIChyZXMtPmZsYWdzICE9IGZsYWdzKQotCQkJY29udGludWU7Ci0KLQkJY29tbW9uX3N0YXJ0ID0gbWF4KChzaXplX3QpcmVzLT5zdGFydCwgc3RhcnQpOwotCQljb21tb25fZW5kID0gbWluKChzaXplX3QpcmVzLT5lbmQsIGVuZCk7Ci0JCWlmIChjb21tb25fc3RhcnQgPiBjb21tb25fZW5kICsgMSkKLQkJCWNvbnRpbnVlOwotCi0JCWZpbmFsX3N0YXJ0ID0gbWluKChzaXplX3QpcmVzLT5zdGFydCwgc3RhcnQpOwotCQlmaW5hbF9lbmQgPSBtYXgoKHNpemVfdClyZXMtPmVuZCwgZW5kKTsKLQotCQlyZXMtPnN0YXJ0ID0gZmluYWxfc3RhcnQ7Ci0JCXJlcy0+ZW5kID0gZmluYWxfZW5kOwotCQlyZXR1cm47Ci0JfQotCi1hZGRpdDoKLQotCS8qIG5lZWQgdG8gYWRkIHRoYXQgKi8KLQlpZiAoaW5mby0+cmVzX251bSA+PSBSRVNfTlVNKQotCQlyZXR1cm47Ci0KLQlyZXMgPSAmaW5mby0+cmVzW2luZm8tPnJlc19udW1dOwotCXJlcy0+bmFtZSA9IGluZm8tPm5hbWU7Ci0JcmVzLT5mbGFncyA9IGZsYWdzOwotCXJlcy0+c3RhcnQgPSBzdGFydDsKLQlyZXMtPmVuZCA9IGVuZDsKLQlyZXMtPmNoaWxkID0gTlVMTDsKLQlpbmZvLT5yZXNfbnVtKys7Ci19Ci0KIHN0cnVjdCBwY2lfaG9zdGJyaWRnZV9wcm9iZSB7CiAJdTMyIGJ1czsKIAl1MzIgc2xvdDsKQEAgLTIzMCw3ICsxMjMsNiBAQAogCWludCBqOwogCXVuc2lnbmVkIGJ1czsKIAl1bnNpZ25lZCBzbG90OwotCWludCBmb3VuZDsKIAlpbnQgbm9kZTsKIAlpbnQgbGluazsKIAlpbnQgZGVmX25vZGU7CkBAIC0yNDcsNyArMTM5LDcgQEAKIAlpZiAoIWVhcmx5X3BjaV9hbGxvd2VkKCkpCiAJCXJldHVybiAtMTsKIAotCWZvdW5kID0gMDsKKwlmb3VuZF9hbGxfbnVtYV9lYXJseSA9IDA7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGNpX3Byb2Jlcyk7IGkrKykgewogCQl1MzIgaWQ7CiAJCXUxNiBkZXZpY2U7CkBAIC0yNjEsMTIgKzE1MywxMiBAQAogCQlkZXZpY2UgPSAoaWQ+PjE2KSAmIDB4ZmZmZjsKIAkJaWYgKHBjaV9wcm9iZXNbaV0udmVuZG9yID09IHZlbmRvciAmJgogCQkgICAgcGNpX3Byb2Jlc1tpXS5kZXZpY2UgPT0gZGV2aWNlKSB7Ci0JCQlmb3VuZCA9IDE7CisJCQlmb3VuZF9hbGxfbnVtYV9lYXJseSA9IDE7CiAJCQlicmVhazsKIAkJfQogCX0KIAotCWlmICghZm91bmQpCisJaWYgKCFmb3VuZF9hbGxfbnVtYV9lYXJseSkKIAkJcmV0dXJuIDA7CiAKIAlwY2lfcm9vdF9udW0gPSAwOwpAQCAtNDg4LDcgKzM4MCw3IEBACiAJCWluZm8gPSAmcGNpX3Jvb3RfaW5mb1tpXTsKIAkJcmVzX251bSA9IGluZm8tPnJlc19udW07CiAJCWJ1c251bSA9IGluZm8tPmJ1c19taW47Ci0JCXByaW50ayhLRVJOX0RFQlVHICJidXM6IFslMDJ4LCUwMnhdIG9uIG5vZGUgJXggbGluayAleFxuIiwKKwkJcHJpbnRrKEtFUk5fREVCVUcgImJ1czogWyUwMngsICUwMnhdIG9uIG5vZGUgJXggbGluayAleFxuIiwKIAkJICAgICAgIGluZm8tPmJ1c19taW4sIGluZm8tPmJ1c19tYXgsIGluZm8tPm5vZGUsIGluZm8tPmxpbmspOwogCQlmb3IgKGogPSAwOyBqIDwgcmVzX251bTsgaisrKSB7CiAJCQlyZXMgPSAmaW5mby0+cmVzW2pdOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2J1c19udW1hLmMgYi9hcmNoL3g4Ni9wY2kvYnVzX251bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDVkZjAwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvcGNpL2J1c19udW1hLmMKQEAgLTAsMCArMSwxMDEgQEAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlICJidXNfbnVtYS5oIgorCitpbnQgcGNpX3Jvb3RfbnVtOworc3RydWN0IHBjaV9yb290X2luZm8gcGNpX3Jvb3RfaW5mb1tQQ0lfUk9PVF9OUl07CitpbnQgZm91bmRfYWxsX251bWFfZWFybHk7CisKK3ZvaWQgeDg2X3BjaV9yb290X2J1c19yZXNfcXVpcmtzKHN0cnVjdCBwY2lfYnVzICpiKQoreworCWludCBpOworCWludCBqOworCXN0cnVjdCBwY2lfcm9vdF9pbmZvICppbmZvOworCisJLyogZG9uJ3QgZ28gZm9yIGl0IGlmIF9DUlMgaXMgdXNlZCBhbHJlYWR5ICovCisJaWYgKGItPnJlc291cmNlWzBdICE9ICZpb3BvcnRfcmVzb3VyY2UgfHwKKwkgICAgYi0+cmVzb3VyY2VbMV0gIT0gJmlvbWVtX3Jlc291cmNlKQorCQlyZXR1cm47CisKKwlpZiAoIXBjaV9yb290X251bSkKKwkJcmV0dXJuOworCisJLyogZm9yIGFtZCwgaWYgb25seSBvbmUgcm9vdCBidXMsIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgKi8KKwlpZiAocGNpX3Jvb3RfbnVtIDwgMiAmJiBmb3VuZF9hbGxfbnVtYV9lYXJseSkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IHBjaV9yb290X251bTsgaSsrKSB7CisJCWlmIChwY2lfcm9vdF9pbmZvW2ldLmJ1c19taW4gPT0gYi0+bnVtYmVyKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcGNpX3Jvb3RfbnVtKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBwZWVyIHJvb3QgYnVzICUwMnggcmVzIHVwZGF0ZWQgZnJvbSBwY2kgY29uZlxuIiwKKwkJCWItPm51bWJlcik7CisKKwlpbmZvID0gJnBjaV9yb290X2luZm9baV07CisJZm9yIChqID0gMDsgaiA8IGluZm8tPnJlc19udW07IGorKykgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwkJc3RydWN0IHJlc291cmNlICpyb290OworCisJCXJlcyA9ICZpbmZvLT5yZXNbal07CisJCWItPnJlc291cmNlW2pdID0gcmVzOworCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCQlyb290ID0gJmlvcG9ydF9yZXNvdXJjZTsKKwkJZWxzZQorCQkJcm9vdCA9ICZpb21lbV9yZXNvdXJjZTsKKwkJaW5zZXJ0X3Jlc291cmNlKHJvb3QsIHJlcyk7CisJfQorfQorCit2b2lkIF9faW5pdCB1cGRhdGVfcmVzKHN0cnVjdCBwY2lfcm9vdF9pbmZvICppbmZvLCBzaXplX3Qgc3RhcnQsCisJCQkgICAgICBzaXplX3QgZW5kLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgbWVyZ2UpCit7CisJaW50IGk7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwlpZiAoc3RhcnQgPiBlbmQpCisJCXJldHVybjsKKworCWlmICghbWVyZ2UpCisJCWdvdG8gYWRkaXQ7CisKKwkvKiB0cnkgdG8gbWVyZ2UgaXQgd2l0aCBvbGQgb25lICovCisJZm9yIChpID0gMDsgaSA8IGluZm8tPnJlc19udW07IGkrKykgeworCQlzaXplX3QgZmluYWxfc3RhcnQsIGZpbmFsX2VuZDsKKwkJc2l6ZV90IGNvbW1vbl9zdGFydCwgY29tbW9uX2VuZDsKKworCQlyZXMgPSAmaW5mby0+cmVzW2ldOworCQlpZiAocmVzLT5mbGFncyAhPSBmbGFncykKKwkJCWNvbnRpbnVlOworCisJCWNvbW1vbl9zdGFydCA9IG1heCgoc2l6ZV90KXJlcy0+c3RhcnQsIHN0YXJ0KTsKKwkJY29tbW9uX2VuZCA9IG1pbigoc2l6ZV90KXJlcy0+ZW5kLCBlbmQpOworCQlpZiAoY29tbW9uX3N0YXJ0ID4gY29tbW9uX2VuZCArIDEpCisJCQljb250aW51ZTsKKworCQlmaW5hbF9zdGFydCA9IG1pbigoc2l6ZV90KXJlcy0+c3RhcnQsIHN0YXJ0KTsKKwkJZmluYWxfZW5kID0gbWF4KChzaXplX3QpcmVzLT5lbmQsIGVuZCk7CisKKwkJcmVzLT5zdGFydCA9IGZpbmFsX3N0YXJ0OworCQlyZXMtPmVuZCA9IGZpbmFsX2VuZDsKKwkJcmV0dXJuOworCX0KKworYWRkaXQ6CisKKwkvKiBuZWVkIHRvIGFkZCB0aGF0ICovCisJaWYgKGluZm8tPnJlc19udW0gPj0gUkVTX05VTSkKKwkJcmV0dXJuOworCisJcmVzID0gJmluZm8tPnJlc1tpbmZvLT5yZXNfbnVtXTsKKwlyZXMtPm5hbWUgPSBpbmZvLT5uYW1lOworCXJlcy0+ZmxhZ3MgPSBmbGFnczsKKwlyZXMtPnN0YXJ0ID0gc3RhcnQ7CisJcmVzLT5lbmQgPSBlbmQ7CisJcmVzLT5jaGlsZCA9IE5VTEw7CisJaW5mby0+cmVzX251bSsrOworfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2J1c19udW1hLmggYi9hcmNoL3g4Ni9wY2kvYnVzX251bWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGJjMjNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvcGNpL2J1c19udW1hLmgKQEAgLTAsMCArMSwyNyBAQAorI2lmZGVmIENPTkZJR19YODZfNjQKKworLyoKKyAqIHN1YiBidXMgKHRyYW5zcGFyZW50KSB3aWxsIHVzZSBlbnRyZXMgZnJvbSAzIHRvIHN0b3JlIGV4dHJhIGZyb20KKyAqIHJvb3QsIHNvIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHNsb3QgdGhlcmUsIFNob3VsZCB3ZQorICogaW5jcmVhc2UgUENJX0JVU19OVU1fUkVTT1VSQ0VTPworICovCisjZGVmaW5lIFJFU19OVU0gMTYKK3N0cnVjdCBwY2lfcm9vdF9pbmZvIHsKKwljaGFyIG5hbWVbMTJdOworCXVuc2lnbmVkIGludCByZXNfbnVtOworCXN0cnVjdCByZXNvdXJjZSByZXNbUkVTX05VTV07CisJaW50IGJ1c19taW47CisJaW50IGJ1c19tYXg7CisJaW50IG5vZGU7CisJaW50IGxpbms7Cit9OworCisvKiA0IGF0IHRoaXMgdGltZSwgaXQgbWF5IGJlY29tZSB0byAzMiAqLworI2RlZmluZSBQQ0lfUk9PVF9OUiA0CitleHRlcm4gaW50IHBjaV9yb290X251bTsKK2V4dGVybiBzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyBwY2lfcm9vdF9pbmZvW1BDSV9ST09UX05SXTsKK2V4dGVybiBpbnQgZm91bmRfYWxsX251bWFfZWFybHk7CisKK2V4dGVybiB2b2lkIHVwZGF0ZV9yZXMoc3RydWN0IHBjaV9yb290X2luZm8gKmluZm8sIHNpemVfdCBzdGFydCwKKwkJCSAgICAgIHNpemVfdCBlbmQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBtZXJnZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9jb21tb24uYyBiL2FyY2gveDg2L3BjaS9jb21tb24uYwppbmRleCAxMzMxZmNmLi5kMjU1MmM2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvY29tbW9uLmMKKysrIGIvYXJjaC94ODYvcGNpL2NvbW1vbi5jCkBAIC00MTAsOCArNDEwLDYgQEAKIAlyZXR1cm4gYnVzOwogfQogCi1leHRlcm4gdTggcGNpX2NhY2hlX2xpbmVfc2l6ZTsKLQogaW50IF9faW5pdCBwY2liaW9zX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmYm9vdF9jcHVfZGF0YTsKQEAgLTQyMiwxNSArNDIwLDE5IEBACiAJfQogCiAJLyoKLQkgKiBBc3N1bWUgUENJIGNhY2hlbGluZSBzaXplIG9mIDMyIGJ5dGVzIGZvciBhbGwgeDg2cyBleGNlcHQgSzcvSzgKLQkgKiBhbmQgUDQuIEl0J3MgYWxzbyBnb29kIGZvciAzODYvNDg2cyAod2hpY2ggYWN0dWFsbHkgaGF2ZSAxNikKKwkgKiBTZXQgUENJIGNhY2hlbGluZSBzaXplIHRvIHRoYXQgb2YgdGhlIENQVSBpZiB0aGUgQ1BVIGhhcyByZXBvcnRlZCBpdC4KKwkgKiAoRm9yIG9sZGVyIENQVXMgdGhhdCBkb24ndCBzdXBwb3J0IGNwdWlkLCB3ZSBzZSBpdCB0byAzMiBieXRlcworCSAqIEl0J3MgYWxzbyBnb29kIGZvciAzODYvNDg2cyAod2hpY2ggYWN0dWFsbHkgaGF2ZSAxNikKIAkgKiBhcyBxdWl0ZSBhIGZldyBQQ0kgZGV2aWNlcyBkbyBub3Qgc3VwcG9ydCBzbWFsbGVyIHZhbHVlcy4KIAkgKi8KLQlwY2lfY2FjaGVfbGluZV9zaXplID0gMzIgPj4gMjsKLQlpZiAoYy0+eDg2ID49IDYgJiYgYy0+eDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCkKLQkJcGNpX2NhY2hlX2xpbmVfc2l6ZSA9IDY0ID4+IDI7CS8qIEs3ICYgSzggKi8KLQllbHNlIGlmIChjLT54ODYgPiA2ICYmIGMtPng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkKLQkJcGNpX2NhY2hlX2xpbmVfc2l6ZSA9IDEyOCA+PiAyOwkvKiBQNCAqLworCWlmIChjLT54ODZfY2xmbHVzaF9zaXplID4gMCkgeworCQlwY2lfZGZsX2NhY2hlX2xpbmVfc2l6ZSA9IGMtPng4Nl9jbGZsdXNoX3NpemUgPj4gMjsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlBDSTogcGNpX2NhY2hlX2xpbmVfc2l6ZSBzZXQgdG8gJWQgYnl0ZXNcbiIsCisJCQlwY2lfZGZsX2NhY2hlX2xpbmVfc2l6ZSA8PCAyKTsKKwl9IGVsc2UgeworIAkJcGNpX2RmbF9jYWNoZV9saW5lX3NpemUgPSAzMiA+PiAyOworCQlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBVbmtub3duIGNhY2hlbGluZSBzaXplLiBTZXR0aW5nIHRvIDMyIGJ5dGVzXG4iKTsKKwl9CiAKIAlwY2liaW9zX3Jlc291cmNlX3N1cnZleSgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvZWFybHkuYyBiL2FyY2gveDg2L3BjaS9lYXJseS5jCmluZGV4IGFhZjI2YWUuLmQxMDY3ZDUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9lYXJseS5jCisrKyBiL2FyY2gveDg2L3BjaS9lYXJseS5jCkBAIC0xMiw4ICsxMiw2IEBACiAJdTMyIHY7CiAJb3V0bCgweDgwMDAwMDAwIHwgKGJ1czw8MTYpIHwgKHNsb3Q8PDExKSB8IChmdW5jPDw4KSB8IG9mZnNldCwgMHhjZjgpOwogCXYgPSBpbmwoMHhjZmMpOwotCWlmICh2ICE9IDB4ZmZmZmZmZmYpCi0JCXByX2RlYnVnKCIleCByZWFkaW5nIDQgZnJvbSAleDogJXhcbiIsIHNsb3QsIG9mZnNldCwgdik7CiAJcmV0dXJuIHY7CiB9CiAKQEAgLTIyLDcgKzIwLDYgQEAKIAl1OCB2OwogCW91dGwoMHg4MDAwMDAwMCB8IChidXM8PDE2KSB8IChzbG90PDwxMSkgfCAoZnVuYzw8OCkgfCBvZmZzZXQsIDB4Y2Y4KTsKIAl2ID0gaW5iKDB4Y2ZjICsgKG9mZnNldCYzKSk7Ci0JcHJfZGVidWcoIiV4IHJlYWRpbmcgMSBmcm9tICV4OiAleFxuIiwgc2xvdCwgb2Zmc2V0LCB2KTsKIAlyZXR1cm4gdjsKIH0KIApAQCAtMzEsMjggKzI4LDI0IEBACiAJdTE2IHY7CiAJb3V0bCgweDgwMDAwMDAwIHwgKGJ1czw8MTYpIHwgKHNsb3Q8PDExKSB8IChmdW5jPDw4KSB8IG9mZnNldCwgMHhjZjgpOwogCXYgPSBpbncoMHhjZmMgKyAob2Zmc2V0JjIpKTsKLQlwcl9kZWJ1ZygiJXggcmVhZGluZyAyIGZyb20gJXg6ICV4XG4iLCBzbG90LCBvZmZzZXQsIHYpOwogCXJldHVybiB2OwogfQogCiB2b2lkIHdyaXRlX3BjaV9jb25maWcodTggYnVzLCB1OCBzbG90LCB1OCBmdW5jLCB1OCBvZmZzZXQsCiAJCQkJICAgIHUzMiB2YWwpCiB7Ci0JcHJfZGVidWcoIiV4IHdyaXRpbmcgdG8gJXg6ICV4XG4iLCBzbG90LCBvZmZzZXQsIHZhbCk7CiAJb3V0bCgweDgwMDAwMDAwIHwgKGJ1czw8MTYpIHwgKHNsb3Q8PDExKSB8IChmdW5jPDw4KSB8IG9mZnNldCwgMHhjZjgpOwogCW91dGwodmFsLCAweGNmYyk7CiB9CiAKIHZvaWQgd3JpdGVfcGNpX2NvbmZpZ19ieXRlKHU4IGJ1cywgdTggc2xvdCwgdTggZnVuYywgdTggb2Zmc2V0LCB1OCB2YWwpCiB7Ci0JcHJfZGVidWcoIiV4IHdyaXRpbmcgdG8gJXg6ICV4XG4iLCBzbG90LCBvZmZzZXQsIHZhbCk7CiAJb3V0bCgweDgwMDAwMDAwIHwgKGJ1czw8MTYpIHwgKHNsb3Q8PDExKSB8IChmdW5jPDw4KSB8IG9mZnNldCwgMHhjZjgpOwogCW91dGIodmFsLCAweGNmYyArIChvZmZzZXQmMykpOwogfQogCiB2b2lkIHdyaXRlX3BjaV9jb25maWdfMTYodTggYnVzLCB1OCBzbG90LCB1OCBmdW5jLCB1OCBvZmZzZXQsIHUxNiB2YWwpCiB7Ci0JcHJfZGVidWcoIiV4IHdyaXRpbmcgdG8gJXg6ICV4XG4iLCBzbG90LCBvZmZzZXQsIHZhbCk7CiAJb3V0bCgweDgwMDAwMDAwIHwgKGJ1czw8MTYpIHwgKHNsb3Q8PDExKSB8IChmdW5jPDw4KSB8IG9mZnNldCwgMHhjZjgpOwogCW91dHcodmFsLCAweGNmYyArIChvZmZzZXQmMikpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2kzODYuYyBiL2FyY2gveDg2L3BjaS9pMzg2LmMKaW5kZXggYjIyZDEzYi4uNWRjOWU4YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2kzODYuYworKysgYi9hcmNoL3g4Ni9wY2kvaTM4Ni5jCkBAIC0xMjksNyArMTI5LDkgQEAKIAkJCQkJY29udGludWU7CiAJCQkJaWYgKCFyLT5zdGFydCB8fAogCQkJCSAgICBwY2lfY2xhaW1fcmVzb3VyY2UoZGV2LCBpZHgpIDwgMCkgewotCQkJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJCQVIgJWQ6IGNhbid0IGFsbG9jYXRlIHJlc291cmNlXG4iLCBpZHgpOworCQkJCQlkZXZfaW5mbygmZGV2LT5kZXYsCisJCQkJCQkgImNhbid0IHJlc2VydmUgd2luZG93ICVwUlxuIiwKKwkJCQkJCSByKTsKIAkJCQkJLyoKIAkJCQkJICogU29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlIHJlZ2lvbi4KIAkJCQkJICogSW52YWxpZGF0ZSB0aGUgcmVzb3VyY2UgdG8gcHJldmVudApAQCAtMTQ0LDE2ICsxNDYsMjkgQEAKIAl9CiB9CiAKK3N0cnVjdCBwY2lfY2hlY2tfaWR4X3JhbmdlIHsKKwlpbnQgc3RhcnQ7CisJaW50IGVuZDsKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBwY2liaW9zX2FsbG9jYXRlX3Jlc291cmNlcyhpbnQgcGFzcykKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQlpbnQgaWR4LCBkaXNhYmxlZDsKKwlpbnQgaWR4LCBkaXNhYmxlZCwgaTsKIAl1MTYgY29tbWFuZDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAKKwlzdHJ1Y3QgcGNpX2NoZWNrX2lkeF9yYW5nZSBpZHhfcmFuZ2VbXSA9IHsKKwkJeyBQQ0lfU1REX1JFU09VUkNFUywgUENJX1NURF9SRVNPVVJDRV9FTkQgfSwKKyNpZmRlZiBDT05GSUdfUENJX0lPVgorCQl7IFBDSV9JT1ZfUkVTT1VSQ0VTLCBQQ0lfSU9WX1JFU09VUkNFX0VORCB9LAorI2VuZGlmCisJfTsKKwogCWZvcl9lYWNoX3BjaV9kZXYoZGV2KSB7CiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjb21tYW5kKTsKLQkJZm9yIChpZHggPSAwOyBpZHggPCBQQ0lfUk9NX1JFU09VUkNFOyBpZHgrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpZHhfcmFuZ2UpOyBpKyspCisJCWZvciAoaWR4ID0gaWR4X3JhbmdlW2ldLnN0YXJ0OyBpZHggPD0gaWR4X3JhbmdlW2ldLmVuZDsgaWR4KyspIHsKIAkJCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOwogCQkJaWYgKHItPnBhcmVudCkJCS8qIEFscmVhZHkgYWxsb2NhdGVkICovCiAJCQkJY29udGludWU7CkBAIC0xNjQsMTIgKzE3OSwxMiBAQAogCQkJZWxzZQogCQkJCWRpc2FibGVkID0gIShjb21tYW5kICYgUENJX0NPTU1BTkRfTUVNT1JZKTsKIAkJCWlmIChwYXNzID09IGRpc2FibGVkKSB7Ci0JCQkJZGV2X2RiZygmZGV2LT5kZXYsICJyZXNvdXJjZSAlIzA4bGx4LSUjMDhsbHggKGY9JWx4LCBkPSVkLCBwPSVkKVxuIiwKLQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgci0+c3RhcnQsCi0JCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHItPmVuZCwKLQkJCQkJci0+ZmxhZ3MsIGRpc2FibGVkLCBwYXNzKTsKKwkJCQlkZXZfZGJnKCZkZXYtPmRldiwKKwkJCQkJIkJBUiAlZDogcmVzZXJ2aW5nICVwciAoZD0lZCwgcD0lZClcbiIsCisJCQkJCWlkeCwgciwgZGlzYWJsZWQsIHBhc3MpOwogCQkJCWlmIChwY2lfY2xhaW1fcmVzb3VyY2UoZGV2LCBpZHgpIDwgMCkgewotCQkJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJCQVIgJWQ6IGNhbid0IGFsbG9jYXRlIHJlc291cmNlXG4iLCBpZHgpOworCQkJCQlkZXZfaW5mbygmZGV2LT5kZXYsCisJCQkJCQkgImNhbid0IHJlc2VydmUgJXBSXG4iLCByKTsKIAkJCQkJLyogV2UnbGwgYXNzaWduIGEgbmV3IGFkZHJlc3MgbGF0ZXIgKi8KIAkJCQkJci0+ZW5kIC09IHItPnN0YXJ0OwogCQkJCQlyLT5zdGFydCA9IDA7CkBAIC0xODIsNyArMTk3LDcgQEAKIAkJCQkvKiBUdXJuIHRoZSBST00gb2ZmLCBsZWF2ZSB0aGUgcmVzb3VyY2UgcmVnaW9uLAogCQkJCSAqIGJ1dCBrZWVwIGl0IHVucmVnaXN0ZXJlZC4gKi8KIAkJCQl1MzIgcmVnOwotCQkJCWRldl9kYmcoJmRldi0+ZGV2LCAiZGlzYWJsaW5nIFJPTVxuIik7CisJCQkJZGV2X2RiZygmZGV2LT5kZXYsICJkaXNhYmxpbmcgUk9NICVwUlxuIiwgcik7CiAJCQkJci0+ZmxhZ3MgJj0gfklPUkVTT1VSQ0VfUk9NX0VOQUJMRTsKIAkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LAogCQkJCQkJZGV2LT5yb21fYmFzZV9yZWcsICZyZWcpOwpAQCAtMjgyLDYgKzI5NywxNSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXByb3QgPSBwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KTsKKworCS8qCisgCSAqIFJldHVybiBlcnJvciBpZiBwYXQgaXMgbm90IGVuYWJsZWQgYW5kIHdyaXRlX2NvbWJpbmUgaXMgcmVxdWVzdGVkLgorIAkgKiBDYWxsZXIgY2FuIGZvbGxvd3VwIHdpdGggVUMgTUlOVVMgcmVxdWVzdCBhbmQgYWRkIGEgV0MgbXRyciBpZiB0aGVyZQorIAkgKiBpcyBhIGZyZWUgbXRyciBzbG90LgorIAkgKi8KKwlpZiAoIXBhdF9lbmFibGVkICYmIHdyaXRlX2NvbWJpbmUpCisJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKHBhdF9lbmFibGVkICYmIHdyaXRlX2NvbWJpbmUpCiAJCXByb3QgfD0gX1BBR0VfQ0FDSEVfV0M7CiAJZWxzZSBpZiAocGF0X2VuYWJsZWQgfHwgYm9vdF9jcHVfZGF0YS54ODYgPiAzKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2ludGVsX2J1cy5jIGIvYXJjaC94ODYvcGNpL2ludGVsX2J1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YTU1ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9wY2kvaW50ZWxfYnVzLmMKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIHRvIHJlYWQgaW8gcmFuZ2UgZnJvbSBJT0ggcGNpIGNvbmYsIG5lZWQgdG8gZG8gaXQgYWZ0ZXIgbW1jb25maWcgaXMgdGhlcmUKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3BjaV94ODYuaD4KKworI2luY2x1ZGUgImJ1c19udW1hLmgiCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmludF9pb2hfcmVzb3VyY2VzKHN0cnVjdCBwY2lfcm9vdF9pbmZvICppbmZvKQoreworCWludCByZXNfbnVtOworCWludCBidXNudW07CisJaW50IGk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiSU9IIGJ1czogWyUwMngsICUwMnhdXG4iLAorCQkJaW5mby0+YnVzX21pbiwgaW5mby0+YnVzX21heCk7CisJcmVzX251bSA9IGluZm8tPnJlc19udW07CisJYnVzbnVtID0gaW5mby0+YnVzX21pbjsKKwlmb3IgKGkgPSAwOyBpIDwgcmVzX251bTsgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJCXJlcyA9ICZpbmZvLT5yZXNbaV07CisJCXByaW50ayhLRVJOX0RFQlVHICJJT0ggYnVzOiAlMDJ4IGluZGV4ICV4ICVzOiBbJWxseCwgJWxseF1cbiIsCisJCQlidXNudW0sIGksCisJCQkocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pID8gImlvIHBvcnQiIDoKKwkJCQkJCQkibW1pbyIsCisJCQlyZXMtPnN0YXJ0LCByZXMtPmVuZCk7CisJfQorfQorCisjZGVmaW5lIElPSF9MSU8JCQkweDEwOAorI2RlZmluZSBJT0hfTE1NSU9MCQkweDEwYworI2RlZmluZSBJT0hfTE1NSU9ICQkweDExMAorI2RlZmluZSBJT0hfTE1NSU9IX0JBU0VVCTB4MTE0CisjZGVmaW5lIElPSF9MTU1JT0hfTElNSVRVCTB4MTE4CisjZGVmaW5lIElPSF9MQ0ZHQlVTCQkweDExYworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpX3Jvb3RfYnVzX3JlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXUxNiB3b3JkOworCXUzMiBkd29yZDsKKwlzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbzsKKwl1MTYgaW9fYmFzZSwgaW9fZW5kOworCXUzMiBtbWlvbF9iYXNlLCBtbWlvbF9lbmQ7CisJdTY0IG1taW9oX2Jhc2UsIG1taW9oX2VuZDsKKwlpbnQgYnVzX2Jhc2UsIGJ1c19lbmQ7CisKKwlpZiAocGNpX3Jvb3RfbnVtID49IFBDSV9ST09UX05SKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpbnRlbF9idXMuYzogUENJX1JPT1RfTlIgaXMgdG9vIHNtYWxsXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWluZm8gPSAmcGNpX3Jvb3RfaW5mb1twY2lfcm9vdF9udW1dOworCXBjaV9yb290X251bSsrOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBJT0hfTENGR0JVUywgJndvcmQpOworCWJ1c19iYXNlID0gKHdvcmQgJiAweGZmKTsKKwlidXNfZW5kID0gKHdvcmQgJiAweGZmMDApID4+IDg7CisJc3ByaW50ZihpbmZvLT5uYW1lLCAiUENJIEJ1cyAjJTAyeCIsIGJ1c19iYXNlKTsKKwlpbmZvLT5idXNfbWluID0gYnVzX2Jhc2U7CisJaW5mby0+YnVzX21heCA9IGJ1c19lbmQ7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIElPSF9MSU8sICZ3b3JkKTsKKwlpb19iYXNlID0gKHdvcmQgJiAweGYwKSA8PCAoMTIgLSA0KTsKKwlpb19lbmQgPSAod29yZCAmIDB4ZjAwMCkgfCAweGZmZjsKKwl1cGRhdGVfcmVzKGluZm8sIGlvX2Jhc2UsIGlvX2VuZCwgSU9SRVNPVVJDRV9JTywgMCk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBJT0hfTE1NSU9MLCAmZHdvcmQpOworCW1taW9sX2Jhc2UgPSAoZHdvcmQgJiAweGZmMDApIDw8ICgyNCAtIDgpOworCW1taW9sX2VuZCA9IChkd29yZCAmIDB4ZmYwMDAwMDApIHwgMHhmZmZmZmY7CisJdXBkYXRlX3JlcyhpbmZvLCBtbWlvbF9iYXNlLCBtbWlvbF9lbmQsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIElPSF9MTU1JT0gsICZkd29yZCk7CisJbW1pb2hfYmFzZSA9ICgodTY0KShkd29yZCAmIDB4ZmMwMCkpIDw8ICgyNiAtIDEwKTsKKwltbWlvaF9lbmQgPSAoKHU2NCkoZHdvcmQgJiAweGZjMDAwMDAwKSB8IDB4M2ZmZmZmZik7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgSU9IX0xNTUlPSF9CQVNFVSwgJmR3b3JkKTsKKwltbWlvaF9iYXNlIHw9ICgodTY0KShkd29yZCAmIDB4N2ZmZmYpKSA8PCAzMjsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBJT0hfTE1NSU9IX0xJTUlUVSwgJmR3b3JkKTsKKwltbWlvaF9lbmQgfD0gKCh1NjQpKGR3b3JkICYgMHg3ZmZmZikpIDw8IDMyOworCXVwZGF0ZV9yZXMoaW5mbywgbW1pb2hfYmFzZSwgbW1pb2hfZW5kLCBJT1JFU09VUkNFX01FTSwgMCk7CisKKwlwcmludF9pb2hfcmVzb3VyY2VzKGluZm8pOworfQorCisvKiBpbnRlbCBJT0ggKi8KK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MzQyZSwgcGNpX3Jvb3RfYnVzX3Jlcyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvbW1jb25maWctc2hhcmVkLmMgYi9hcmNoL3g4Ni9wY2kvbW1jb25maWctc2hhcmVkLmMKaW5kZXggNjAyYzE3Mi4uYjE5ZDFlNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL21tY29uZmlnLXNoYXJlZC5jCisrKyBiL2FyY2gveDg2L3BjaS9tbWNvbmZpZy1zaGFyZWQuYwpAQCAtMTUsNDggKzE1LDk4IEBACiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NmaV9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvc29ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGFzbS9lODIwLmg+CiAjaW5jbHVkZSA8YXNtL3BjaV94ODYuaD4KICNpbmNsdWRlIDxhc20vYWNwaS5oPgogCiAjZGVmaW5lIFBSRUZJWCAiUENJOiAiCiAKLS8qIGFwZXJ0dXJlIGlzIHVwIHRvIDI1Nk1CIGJ1dCBCSU9TIG1heSByZXNlcnZlIGxlc3MgKi8KLSNkZWZpbmUgTU1DT05GSUdfQVBFUl9NSU4JKDIgKiAxMDI0KjEwMjQpCi0jZGVmaW5lIE1NQ09ORklHX0FQRVJfTUFYCSgyNTYgKiAxMDI0KjEwMjQpCi0KIC8qIEluZGljYXRlIGlmIHRoZSBtbWNmZyByZXNvdXJjZXMgaGF2ZSBiZWVuIHBsYWNlZCBpbnRvIHRoZSByZXNvdXJjZSB0YWJsZS4gKi8KIHN0YXRpYyBpbnQgX19pbml0ZGF0YSBwY2lfbW1jZmdfcmVzb3VyY2VzX2luc2VydGVkOwogCi1zdGF0aWMgX19pbml0IGludCBleHRlbmRfbW1jZmcoaW50IG51bSkKK0xJU1RfSEVBRChwY2lfbW1jZmdfbGlzdCk7CisKK3N0YXRpYyBfX2luaXQgdm9pZCBwY2lfbW1jb25maWdfcmVtb3ZlKHN0cnVjdCBwY2lfbW1jZmdfcmVnaW9uICpjZmcpCiB7Ci0Jc3RydWN0IGFjcGlfbWNmZ19hbGxvY2F0aW9uICpuZXc7Ci0JaW50IG5ld19udW0gPSBwY2lfbW1jZmdfY29uZmlnX251bSArIG51bTsKLQotCW5ldyA9IGt6YWxsb2Moc2l6ZW9mKHBjaV9tbWNmZ19jb25maWdbMF0pICogbmV3X251bSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuZXcpCi0JCXJldHVybiAtMTsKLQotCWlmIChwY2lfbW1jZmdfY29uZmlnKSB7Ci0JCW1lbWNweShuZXcsIHBjaV9tbWNmZ19jb25maWcsCi0JCQkgc2l6ZW9mKHBjaV9tbWNmZ19jb25maWdbMF0pICogbmV3X251bSk7Ci0JCWtmcmVlKHBjaV9tbWNmZ19jb25maWcpOwotCX0KLQlwY2lfbW1jZmdfY29uZmlnID0gbmV3OwotCi0JcmV0dXJuIDA7CisJaWYgKGNmZy0+cmVzLnBhcmVudCkKKwkJcmVsZWFzZV9yZXNvdXJjZSgmY2ZnLT5yZXMpOworCWxpc3RfZGVsKCZjZmctPmxpc3QpOworCWtmcmVlKGNmZyk7CiB9CiAKLXN0YXRpYyBfX2luaXQgdm9pZCBmaWxsX29uZV9tbWNmZyh1NjQgYWRkciwgaW50IHNlZ21lbnQsIGludCBzdGFydCwgaW50IGVuZCkKK3N0YXRpYyBfX2luaXQgdm9pZCBmcmVlX2FsbF9tbWNmZyh2b2lkKQogewotCWludCBpID0gcGNpX21tY2ZnX2NvbmZpZ19udW07CisJc3RydWN0IHBjaV9tbWNmZ19yZWdpb24gKmNmZywgKnRtcDsKIAotCXBjaV9tbWNmZ19jb25maWdfbnVtKys7Ci0JcGNpX21tY2ZnX2NvbmZpZ1tpXS5hZGRyZXNzID0gYWRkcjsKLQlwY2lfbW1jZmdfY29uZmlnW2ldLnBjaV9zZWdtZW50ID0gc2VnbWVudDsKLQlwY2lfbW1jZmdfY29uZmlnW2ldLnN0YXJ0X2J1c19udW1iZXIgPSBzdGFydDsKLQlwY2lfbW1jZmdfY29uZmlnW2ldLmVuZF9idXNfbnVtYmVyID0gZW5kOworCXBjaV9tbWNmZ19hcmNoX2ZyZWUoKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2ZnLCB0bXAsICZwY2lfbW1jZmdfbGlzdCwgbGlzdCkKKwkJcGNpX21tY29uZmlnX3JlbW92ZShjZmcpOworfQorCitzdGF0aWMgX19pbml0IHZvaWQgbGlzdF9hZGRfc29ydGVkKHN0cnVjdCBwY2lfbW1jZmdfcmVnaW9uICpuZXcpCit7CisJc3RydWN0IHBjaV9tbWNmZ19yZWdpb24gKmNmZzsKKworCS8qIGtlZXAgbGlzdCBzb3J0ZWQgYnkgc2VnbWVudCBhbmQgc3RhcnRpbmcgYnVzIG51bWJlciAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2ZnLCAmcGNpX21tY2ZnX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGNmZy0+c2VnbWVudCA+IG5ldy0+c2VnbWVudCB8fAorCQkgICAgKGNmZy0+c2VnbWVudCA9PSBuZXctPnNlZ21lbnQgJiYKKwkJICAgICBjZmctPnN0YXJ0X2J1cyA+PSBuZXctPnN0YXJ0X2J1cykpIHsKKwkJCWxpc3RfYWRkX3RhaWwoJm5ldy0+bGlzdCwgJmNmZy0+bGlzdCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJbGlzdF9hZGRfdGFpbCgmbmV3LT5saXN0LCAmcGNpX21tY2ZnX2xpc3QpOworfQorCitzdGF0aWMgX19pbml0IHN0cnVjdCBwY2lfbW1jZmdfcmVnaW9uICpwY2lfbW1jb25maWdfYWRkKGludCBzZWdtZW50LCBpbnQgc3RhcnQsCisJCQkJCQkJaW50IGVuZCwgdTY0IGFkZHIpCit7CisJc3RydWN0IHBjaV9tbWNmZ19yZWdpb24gKm5ldzsKKwlpbnQgbnVtX2J1c2VzOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJaWYgKGFkZHIgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwluZXcgPSBremFsbG9jKHNpemVvZigqbmV3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXcpCisJCXJldHVybiBOVUxMOworCisJbmV3LT5hZGRyZXNzID0gYWRkcjsKKwluZXctPnNlZ21lbnQgPSBzZWdtZW50OworCW5ldy0+c3RhcnRfYnVzID0gc3RhcnQ7CisJbmV3LT5lbmRfYnVzID0gZW5kOworCisJbGlzdF9hZGRfc29ydGVkKG5ldyk7CisKKwludW1fYnVzZXMgPSBlbmQgLSBzdGFydCArIDE7CisJcmVzID0gJm5ldy0+cmVzOworCXJlcy0+c3RhcnQgPSBhZGRyICsgUENJX01NQ0ZHX0JVU19PRkZTRVQoc3RhcnQpOworCXJlcy0+ZW5kID0gYWRkciArIFBDSV9NTUNGR19CVVNfT0ZGU0VUKG51bV9idXNlcykgLSAxOworCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfQlVTWTsKKwlzbnByaW50ZihuZXctPm5hbWUsIFBDSV9NTUNGR19SRVNPVVJDRV9OQU1FX0xFTiwKKwkJICJQQ0kgTU1DT05GSUcgJTA0eCBbYnVzICUwMngtJTAyeF0iLCBzZWdtZW50LCBzdGFydCwgZW5kKTsKKwlyZXMtPm5hbWUgPSBuZXctPm5hbWU7CisKKwlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiTU1DT05GSUcgZm9yIGRvbWFpbiAlMDR4IFtidXMgJTAyeC0lMDJ4XSBhdCAiCisJICAgICAgICIlcFIgKGJhc2UgJSNseClcbiIsIHNlZ21lbnQsIHN0YXJ0LCBlbmQsICZuZXctPnJlcywKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGFkZHIpOworCisJcmV0dXJuIG5ldzsKK30KKworc3RydWN0IHBjaV9tbWNmZ19yZWdpb24gKnBjaV9tbWNvbmZpZ19sb29rdXAoaW50IHNlZ21lbnQsIGludCBidXMpCit7CisJc3RydWN0IHBjaV9tbWNmZ19yZWdpb24gKmNmZzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2ZnLCAmcGNpX21tY2ZnX2xpc3QsIGxpc3QpCisJCWlmIChjZmctPnNlZ21lbnQgPT0gc2VnbWVudCAmJgorCQkgICAgY2ZnLT5zdGFydF9idXMgPD0gYnVzICYmIGJ1cyA8PSBjZmctPmVuZF9idXMpCisJCQlyZXR1cm4gY2ZnOworCisJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyIF9faW5pdCAqcGNpX21tY2ZnX2U3NTIwKHZvaWQpCkBAIC02OCwxMSArMTE4LDkgQEAKIAlpZiAod2luID09IDB4MDAwMCB8fCB3aW4gPT0gMHhmMDAwKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChleHRlbmRfbW1jZmcoMSkgPT0gLTEpCisJaWYgKHBjaV9tbWNvbmZpZ19hZGQoMCwgMCwgMjU1LCB3aW4gPDwgMTYpID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCi0JZmlsbF9vbmVfbW1jZmcod2luIDw8IDE2LCAwLCAwLCAyNTUpOwotCiAJcmV0dXJuICJJbnRlbCBDb3Jwb3JhdGlvbiBFNzUyMCBNZW1vcnkgQ29udHJvbGxlciBIdWIiOwogfQogCkBAIC0xMTQsMTEgKzE2Miw5IEBACiAJaWYgKChwY2lleGJhciAmIG1hc2spID49IDB4ZjAwMDAwMDBVKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChleHRlbmRfbW1jZmcoMSkgPT0gLTEpCisJaWYgKHBjaV9tbWNvbmZpZ19hZGQoMCwgMCwgKGxlbiA+PiAyMCkgLSAxLCBwY2lleGJhciAmIG1hc2spID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCi0JZmlsbF9vbmVfbW1jZmcocGNpZXhiYXIgJiBtYXNrLCAwLCAwLCAobGVuID4+IDIwKSAtIDEpOwotCiAJcmV0dXJuICJJbnRlbCBDb3Jwb3JhdGlvbiA5NDVHL0daL1AvUEwgRXhwcmVzcyBNZW1vcnkgQ29udHJvbGxlciBIdWIiOwogfQogCkBAIC0xMjcsNyArMTczLDcgQEAKIAl1MzIgbG93LCBoaWdoLCBhZGRyZXNzOwogCXU2NCBiYXNlLCBtc3I7CiAJaW50IGk7Ci0JdW5zaWduZWQgc2VnbmJpdHMgPSAwLCBidXNuYml0czsKKwl1bnNpZ25lZCBzZWduYml0cyA9IDAsIGJ1c25iaXRzLCBlbmRfYnVzOwogCiAJaWYgKCEocGNpX3Byb2JlICYgUENJX0NIRUNLX0VOQUJMRV9BTURfTU1DT05GKSkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xNjEsMTEgKzIwNywxMyBAQAogCQlidXNuYml0cyA9IDg7CiAJfQogCi0JaWYgKGV4dGVuZF9tbWNmZygxIDw8IHNlZ25iaXRzKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0KKwllbmRfYnVzID0gKDEgPDwgYnVzbmJpdHMpIC0gMTsKIAlmb3IgKGkgPSAwOyBpIDwgKDEgPDwgc2VnbmJpdHMpOyBpKyspCi0JCWZpbGxfb25lX21tY2ZnKGJhc2UgKyAoMTw8MjgpICogaSwgaSwgMCwgKDEgPDwgYnVzbmJpdHMpIC0gMSk7CisJCWlmIChwY2lfbW1jb25maWdfYWRkKGksIDAsIGVuZF9idXMsCisJCQkJICAgICBiYXNlICsgKDE8PDI4KSAqIGkpID09IE5VTEwpIHsKKwkJCWZyZWVfYWxsX21tY2ZnKCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQogCiAJcmV0dXJuICJBTUQgRmFtaWx5IDEwaCBOQiI7CiB9CkBAIC0xOTAsNyArMjM4LDcgQEAKIAkvKgogCSAqIGRvIGNoZWNrIGlmIGFtZCBmYW0xMGggYWxyZWFkeSB0b29rIG92ZXIKIAkgKi8KLQlpZiAoIWFjcGlfZGlzYWJsZWQgfHwgcGNpX21tY2ZnX2NvbmZpZ19udW0gfHwgbWNwNTVfY2hlY2tlZCkKKwlpZiAoIWFjcGlfZGlzYWJsZWQgfHwgIWxpc3RfZW1wdHkoJnBjaV9tbWNmZ19saXN0KSB8fCBtY3A1NV9jaGVja2VkKQogCQlyZXR1cm4gTlVMTDsKIAogCW1jcDU1X2NoZWNrZWQgPSB0cnVlOwpAQCAtMjEzLDE2ICsyNjEsMTQgQEAKIAkJaWYgKCEoZXh0Y2ZnICYgZXh0Y2ZnX2VuYWJsZV9tYXNrKSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChleHRlbmRfbW1jZmcoMSkgPT0gLTEpCi0JCQljb250aW51ZTsKLQogCQlzaXplX2luZGV4ID0gKGV4dGNmZyAmIGV4dGNmZ19zaXplX21hc2spID4+IGV4dGNmZ19zaXplX3NoaWZ0OwogCQliYXNlID0gZXh0Y2ZnICYgZXh0Y2ZnX2Jhc2VfbWFza1tzaXplX2luZGV4XTsKIAkJLyogYmFzZSBjb3VsZCA+IDRHICovCiAJCWJhc2UgPDw9IGV4dGNmZ19iYXNlX2xzaGlmdDsKIAkJc3RhcnQgPSAoZXh0Y2ZnICYgZXh0Y2ZnX3N0YXJ0X21hc2spID4+IGV4dGNmZ19zdGFydF9zaGlmdDsKIAkJZW5kID0gc3RhcnQgKyBleHRjZmdfc2l6ZWJ1c1tzaXplX2luZGV4XSAtIDE7Ci0JCWZpbGxfb25lX21tY2ZnKGJhc2UsIDAsIHN0YXJ0LCBlbmQpOworCQlpZiAocGNpX21tY29uZmlnX2FkZCgwLCBzdGFydCwgZW5kLCBiYXNlKSA9PSBOVUxMKQorCQkJY29udGludWU7CiAJCW1jcDU1X21tY29uZl9mb3VuZCsrOwogCX0KIApAQCAtMjUzLDQ1ICsyOTksMjcgQEAKIAkgIDB4MDM2OSwgcGNpX21tY2ZnX252aWRpYV9tY3A1NSB9LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgY21wX21tY2ZnKGNvbnN0IHZvaWQgKngxLCBjb25zdCB2b2lkICp4MikKLXsKLQljb25zdCB0eXBlb2YocGNpX21tY2ZnX2NvbmZpZ1swXSkgKm0xID0geDE7Ci0JY29uc3QgdHlwZW9mKHBjaV9tbWNmZ19jb25maWdbMF0pICptMiA9IHgyOwotCWludCBzdGFydDEsIHN0YXJ0MjsKLQotCXN0YXJ0MSA9IG0xLT5zdGFydF9idXNfbnVtYmVyOwotCXN0YXJ0MiA9IG0yLT5zdGFydF9idXNfbnVtYmVyOwotCi0JcmV0dXJuIHN0YXJ0MSAtIHN0YXJ0MjsKLX0KLQogc3RhdGljIHZvaWQgX19pbml0IHBjaV9tbWNmZ19jaGVja19lbmRfYnVzX251bWJlcih2b2lkKQogewotCWludCBpOwotCXR5cGVvZihwY2lfbW1jZmdfY29uZmlnWzBdKSAqY2ZnLCAqY2ZneDsKLQotCS8qIHNvcnQgdGhlbSBhdCBmaXJzdCAqLwotCXNvcnQocGNpX21tY2ZnX2NvbmZpZywgcGNpX21tY2ZnX2NvbmZpZ19udW0sCi0JCSBzaXplb2YocGNpX21tY2ZnX2NvbmZpZ1swXSksIGNtcF9tbWNmZywgTlVMTCk7CisJc3RydWN0IHBjaV9tbWNmZ19yZWdpb24gKmNmZywgKmNmZ3g7CiAKIAkvKiBsYXN0IG9uZSovCi0JaWYgKHBjaV9tbWNmZ19jb25maWdfbnVtID4gMCkgewotCQlpID0gcGNpX21tY2ZnX2NvbmZpZ19udW0gLSAxOwotCQljZmcgPSAmcGNpX21tY2ZnX2NvbmZpZ1tpXTsKLQkJaWYgKGNmZy0+ZW5kX2J1c19udW1iZXIgPCBjZmctPnN0YXJ0X2J1c19udW1iZXIpCi0JCQljZmctPmVuZF9idXNfbnVtYmVyID0gMjU1OwotCX0KKwljZmcgPSBsaXN0X2VudHJ5KHBjaV9tbWNmZ19saXN0LnByZXYsIHR5cGVvZigqY2ZnKSwgbGlzdCk7CisJaWYgKGNmZykKKwkJaWYgKGNmZy0+ZW5kX2J1cyA8IGNmZy0+c3RhcnRfYnVzKQorCQkJY2ZnLT5lbmRfYnVzID0gMjU1OworCisJaWYgKGxpc3RfaXNfc2luZ3VsYXIoJnBjaV9tbWNmZ19saXN0KSkKKwkJcmV0dXJuOwogCiAJLyogZG9uJ3Qgb3ZlcmxhcCBwbGVhc2UgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGNpX21tY2ZnX2NvbmZpZ19udW0gLSAxOyBpKyspIHsKLQkJY2ZnID0gJnBjaV9tbWNmZ19jb25maWdbaV07Ci0JCWNmZ3ggPSAmcGNpX21tY2ZnX2NvbmZpZ1tpKzFdOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2ZnLCAmcGNpX21tY2ZnX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGNmZy0+ZW5kX2J1cyA8IGNmZy0+c3RhcnRfYnVzKQorCQkJY2ZnLT5lbmRfYnVzID0gMjU1OwogCi0JCWlmIChjZmctPmVuZF9idXNfbnVtYmVyIDwgY2ZnLT5zdGFydF9idXNfbnVtYmVyKQotCQkJY2ZnLT5lbmRfYnVzX251bWJlciA9IDI1NTsKLQotCQlpZiAoY2ZnLT5lbmRfYnVzX251bWJlciA+PSBjZmd4LT5zdGFydF9idXNfbnVtYmVyKQotCQkJY2ZnLT5lbmRfYnVzX251bWJlciA9IGNmZ3gtPnN0YXJ0X2J1c19udW1iZXIgLSAxOworCQljZmd4ID0gbGlzdF9lbnRyeShjZmctPmxpc3QubmV4dCwgdHlwZW9mKCpjZmcpLCBsaXN0KTsKKwkJaWYgKGNmZyAhPSBjZmd4ICYmIGNmZy0+ZW5kX2J1cyA+PSBjZmd4LT5zdGFydF9idXMpCisJCQljZmctPmVuZF9idXMgPSBjZmd4LT5zdGFydF9idXMgLSAxOwogCX0KIH0KIApAQCAtMzA2LDggKzMzNCw3IEBACiAJaWYgKCFyYXdfcGNpX29wcykKIAkJcmV0dXJuIDA7CiAKLQlwY2lfbW1jZmdfY29uZmlnX251bSA9IDA7Ci0JcGNpX21tY2ZnX2NvbmZpZyA9IE5VTEw7CisJZnJlZV9hbGxfbW1jZmcoKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBjaV9tbWNmZ19wcm9iZXMpOyBpKyspIHsKIAkJYnVzID0gIHBjaV9tbWNmZ19wcm9iZXNbaV0uYnVzOwpAQCAtMzIyLDQ1ICszNDksMjIgQEAKIAkJCW5hbWUgPSBwY2lfbW1jZmdfcHJvYmVzW2ldLnByb2JlKCk7CiAKIAkJaWYgKG5hbWUpCi0JCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IEZvdW5kICVzIHdpdGggTU1DT05GSUcgc3VwcG9ydC5cbiIsCisJCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgd2l0aCBNTUNPTkZJRyBzdXBwb3J0XG4iLAogCQkJICAgICAgIG5hbWUpOwogCX0KIAogCS8qIHNvbWUgZW5kX2J1c19udW1iZXIgaXMgY3JhenksIGZpeCBpdCAqLwogCXBjaV9tbWNmZ19jaGVja19lbmRfYnVzX251bWJlcigpOwogCi0JcmV0dXJuIHBjaV9tbWNmZ19jb25maWdfbnVtICE9IDA7CisJcmV0dXJuICFsaXN0X2VtcHR5KCZwY2lfbW1jZmdfbGlzdCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBwY2lfbW1jZmdfaW5zZXJ0X3Jlc291cmNlcyh2b2lkKQogewotI2RlZmluZSBQQ0lfTU1DRkdfUkVTT1VSQ0VfTkFNRV9MRU4gMjQKLQlpbnQgaTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQljaGFyICpuYW1lczsKLQl1bnNpZ25lZCBudW1fYnVzZXM7CisJc3RydWN0IHBjaV9tbWNmZ19yZWdpb24gKmNmZzsKIAotCXJlcyA9IGtjYWxsb2MoUENJX01NQ0ZHX1JFU09VUkNFX05BTUVfTEVOICsgc2l6ZW9mKCpyZXMpLAotCQkJcGNpX21tY2ZnX2NvbmZpZ19udW0sIEdGUF9LRVJORUwpOwotCWlmICghcmVzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUENJOiBVbmFibGUgdG8gYWxsb2NhdGUgTU1DT05GSUcgcmVzb3VyY2VzXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCW5hbWVzID0gKHZvaWQgKikmcmVzW3BjaV9tbWNmZ19jb25maWdfbnVtXTsKLQlmb3IgKGkgPSAwOyBpIDwgcGNpX21tY2ZnX2NvbmZpZ19udW07IGkrKywgcmVzKyspIHsKLQkJc3RydWN0IGFjcGlfbWNmZ19hbGxvY2F0aW9uICpjZmcgPSAmcGNpX21tY2ZnX2NvbmZpZ1tpXTsKLQkJbnVtX2J1c2VzID0gY2ZnLT5lbmRfYnVzX251bWJlciAtIGNmZy0+c3RhcnRfYnVzX251bWJlciArIDE7Ci0JCXJlcy0+bmFtZSA9IG5hbWVzOwotCQlzbnByaW50ZihuYW1lcywgUENJX01NQ0ZHX1JFU09VUkNFX05BTUVfTEVOLAotCQkJICJQQ0kgTU1DT05GSUcgJXUgWyUwMngtJTAyeF0iLCBjZmctPnBjaV9zZWdtZW50LAotCQkJIGNmZy0+c3RhcnRfYnVzX251bWJlciwgY2ZnLT5lbmRfYnVzX251bWJlcik7Ci0JCXJlcy0+c3RhcnQgPSBjZmctPmFkZHJlc3MgKyAoY2ZnLT5zdGFydF9idXNfbnVtYmVyIDw8IDIwKTsKLQkJcmVzLT5lbmQgPSByZXMtPnN0YXJ0ICsgKG51bV9idXNlcyA8PCAyMCkgLSAxOwotCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9NRU0gfCBJT1JFU09VUkNFX0JVU1k7Ci0JCWluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIHJlcyk7Ci0JCW5hbWVzICs9IFBDSV9NTUNGR19SRVNPVVJDRV9OQU1FX0xFTjsKLQl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZmcsICZwY2lfbW1jZmdfbGlzdCwgbGlzdCkKKwkJaW5zZXJ0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJmNmZy0+cmVzKTsKIAogCS8qIE1hcmsgdGhhdCB0aGUgcmVzb3VyY2VzIGhhdmUgYmVlbiBpbnNlcnRlZC4gKi8KIAlwY2lfbW1jZmdfcmVzb3VyY2VzX2luc2VydGVkID0gMTsKQEAgLTQzNywxMSArNDQxLDEyIEBACiB0eXBlZGVmIGludCAoKmNoZWNrX3Jlc2VydmVkX3QpKHU2NCBzdGFydCwgdTY0IGVuZCwgdW5zaWduZWQgdHlwZSk7CiAKIHN0YXRpYyBpbnQgX19pbml0IGlzX21tY29uZl9yZXNlcnZlZChjaGVja19yZXNlcnZlZF90IGlzX3Jlc2VydmVkLAotCQl1NjQgYWRkciwgdTY0IHNpemUsIGludCBpLAotCQl0eXBlb2YocGNpX21tY2ZnX2NvbmZpZ1swXSkgKmNmZywgaW50IHdpdGhfZTgyMCkKKwkJCQkgICAgc3RydWN0IHBjaV9tbWNmZ19yZWdpb24gKmNmZywgaW50IHdpdGhfZTgyMCkKIHsKKwl1NjQgYWRkciA9IGNmZy0+cmVzLnN0YXJ0OworCXU2NCBzaXplID0gcmVzb3VyY2Vfc2l6ZSgmY2ZnLT5yZXMpOwogCXU2NCBvbGRfc2l6ZSA9IHNpemU7Ci0JaW50IHZhbGlkID0gMDsKKwlpbnQgdmFsaWQgPSAwLCBudW1fYnVzZXM7CiAKIAl3aGlsZSAoIWlzX3Jlc2VydmVkKGFkZHIsIGFkZHIgKyBzaXplLCBFODIwX1JFU0VSVkVEKSkgewogCQlzaXplID4+PSAxOwpAQCAtNDUwLDE5ICs0NTUsMjUgQEAKIAl9CiAKIAlpZiAoc2l6ZSA+PSAoMTZVTDw8MjApIHx8IHNpemUgPT0gb2xkX3NpemUpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFCi0JCSAgICAgICAiUENJOiBNQ0ZHIGFyZWEgYXQgJUx4IHJlc2VydmVkIGluICVzXG4iLAotCQkJYWRkciwgd2l0aF9lODIwPyJFODIwIjoiQUNQSSBtb3RoZXJib2FyZCByZXNvdXJjZXMiKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIk1NQ09ORklHIGF0ICVwUiByZXNlcnZlZCBpbiAlc1xuIiwKKwkJICAgICAgICZjZmctPnJlcywKKwkJICAgICAgIHdpdGhfZTgyMCA/ICJFODIwIiA6ICJBQ1BJIG1vdGhlcmJvYXJkIHJlc291cmNlcyIpOwogCQl2YWxpZCA9IDE7CiAKIAkJaWYgKG9sZF9zaXplICE9IHNpemUpIHsKLQkJCS8qIHVwZGF0ZSBlbmRfYnVzX251bWJlciAqLwotCQkJY2ZnLT5lbmRfYnVzX251bWJlciA9IGNmZy0+c3RhcnRfYnVzX251bWJlciArICgoc2l6ZT4+MjApIC0gMSk7Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgIlBDSTogdXBkYXRlZCBNQ0ZHIGNvbmZpZ3VyYXRpb24gJWQ6IGJhc2UgJWx4ICIKLQkJCSAgICAgICAic2VnbWVudCAlaHUgYnVzZXMgJXUgLSAldVxuIiwKLQkJCSAgICAgICBpLCAodW5zaWduZWQgbG9uZyljZmctPmFkZHJlc3MsIGNmZy0+cGNpX3NlZ21lbnQsCi0JCQkgICAgICAgKHVuc2lnbmVkIGludCljZmctPnN0YXJ0X2J1c19udW1iZXIsCi0JCQkgICAgICAgKHVuc2lnbmVkIGludCljZmctPmVuZF9idXNfbnVtYmVyKTsKKwkJCS8qIHVwZGF0ZSBlbmRfYnVzICovCisJCQljZmctPmVuZF9idXMgPSBjZmctPnN0YXJ0X2J1cyArICgoc2l6ZT4+MjApIC0gMSk7CisJCQludW1fYnVzZXMgPSBjZmctPmVuZF9idXMgLSBjZmctPnN0YXJ0X2J1cyArIDE7CisJCQljZmctPnJlcy5lbmQgPSBjZmctPnJlcy5zdGFydCArCisJCQkgICAgUENJX01NQ0ZHX0JVU19PRkZTRVQobnVtX2J1c2VzKSAtIDE7CisJCQlzbnByaW50ZihjZmctPm5hbWUsIFBDSV9NTUNGR19SRVNPVVJDRV9OQU1FX0xFTiwKKwkJCQkgIlBDSSBNTUNPTkZJRyAlMDR4IFtidXMgJTAyeC0lMDJ4XSIsCisJCQkJIGNmZy0+c2VnbWVudCwgY2ZnLT5zdGFydF9idXMsIGNmZy0+ZW5kX2J1cyk7CisJCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAorCQkJICAgICAgICJNTUNPTkZJRyBmb3IgJTA0eCBbYnVzJTAyeC0lMDJ4XSAiCisJCQkgICAgICAgImF0ICVwUiAoYmFzZSAlI2x4KSAoc2l6ZSByZWR1Y2VkISlcbiIsCisJCQkgICAgICAgY2ZnLT5zZWdtZW50LCBjZmctPnN0YXJ0X2J1cywgY2ZnLT5lbmRfYnVzLAorCQkJICAgICAgICZjZmctPnJlcywgKHVuc2lnbmVkIGxvbmcpIGNmZy0+YWRkcmVzcyk7CiAJCX0KIAl9CiAKQEAgLTQ3MSw0NSArNDgyLDI2IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBwY2lfbW1jZmdfcmVqZWN0X2Jyb2tlbihpbnQgZWFybHkpCiB7Ci0JdHlwZW9mKHBjaV9tbWNmZ19jb25maWdbMF0pICpjZmc7Ci0JaW50IGk7CisJc3RydWN0IHBjaV9tbWNmZ19yZWdpb24gKmNmZzsKIAotCWlmICgocGNpX21tY2ZnX2NvbmZpZ19udW0gPT0gMCkgfHwKLQkgICAgKHBjaV9tbWNmZ19jb25maWcgPT0gTlVMTCkgfHwKLQkgICAgKHBjaV9tbWNmZ19jb25maWdbMF0uYWRkcmVzcyA9PSAwKSkKLQkJcmV0dXJuOwotCi0JZm9yIChpID0gMDsgaSA8IHBjaV9tbWNmZ19jb25maWdfbnVtOyBpKyspIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNmZywgJnBjaV9tbWNmZ19saXN0LCBsaXN0KSB7CiAJCWludCB2YWxpZCA9IDA7Ci0JCXU2NCBhZGRyLCBzaXplOwotCi0JCWNmZyA9ICZwY2lfbW1jZmdfY29uZmlnW2ldOwotCQlhZGRyID0gY2ZnLT5zdGFydF9idXNfbnVtYmVyOwotCQlhZGRyIDw8PSAyMDsKLQkJYWRkciArPSBjZmctPmFkZHJlc3M7Ci0JCXNpemUgPSBjZmctPmVuZF9idXNfbnVtYmVyICsgMSAtIGNmZy0+c3RhcnRfYnVzX251bWJlcjsKLQkJc2l6ZSA8PD0gMjA7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiUENJOiBNQ0ZHIGNvbmZpZ3VyYXRpb24gJWQ6IGJhc2UgJWx4ICIKLQkJICAgICAgICJzZWdtZW50ICVodSBidXNlcyAldSAtICV1XG4iLAotCQkgICAgICAgaSwgKHVuc2lnbmVkIGxvbmcpY2ZnLT5hZGRyZXNzLCBjZmctPnBjaV9zZWdtZW50LAotCQkgICAgICAgKHVuc2lnbmVkIGludCljZmctPnN0YXJ0X2J1c19udW1iZXIsCi0JCSAgICAgICAodW5zaWduZWQgaW50KWNmZy0+ZW5kX2J1c19udW1iZXIpOwogCiAJCWlmICghZWFybHkgJiYgIWFjcGlfZGlzYWJsZWQpCi0JCQl2YWxpZCA9IGlzX21tY29uZl9yZXNlcnZlZChpc19hY3BpX3Jlc2VydmVkLCBhZGRyLCBzaXplLCBpLCBjZmcsIDApOworCQkJdmFsaWQgPSBpc19tbWNvbmZfcmVzZXJ2ZWQoaXNfYWNwaV9yZXNlcnZlZCwgY2ZnLCAwKTsKIAogCQlpZiAodmFsaWQpCiAJCQljb250aW51ZTsKIAogCQlpZiAoIWVhcmx5KQotCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IEJJT1MgQnVnOiBNQ0ZHIGFyZWEgYXQgJUx4IGlzIG5vdCIKLQkJCSAgICAgICAiIHJlc2VydmVkIGluIEFDUEkgbW90aGVyYm9hcmQgcmVzb3VyY2VzXG4iLAotCQkJICAgICAgIGNmZy0+YWRkcmVzcyk7CisJCQlwcmludGsoS0VSTl9FUlIgRldfQlVHIFBSRUZJWAorCQkJICAgICAgICJNTUNPTkZJRyBhdCAlcFIgbm90IHJlc2VydmVkIGluICIKKwkJCSAgICAgICAiQUNQSSBtb3RoZXJib2FyZCByZXNvdXJjZXNcbiIsICZjZmctPnJlcyk7CiAKIAkJLyogRG9uJ3QgdHJ5IHRvIGRvIHRoaXMgY2hlY2sgdW5sZXNzIGNvbmZpZ3VyYXRpb24KIAkJICAgdHlwZSAxIGlzIGF2YWlsYWJsZS4gaG93IGFib3V0IHR5cGUgMiA/Ki8KIAkJaWYgKHJhd19wY2lfb3BzKQotCQkJdmFsaWQgPSBpc19tbWNvbmZfcmVzZXJ2ZWQoZTgyMF9hbGxfbWFwcGVkLCBhZGRyLCBzaXplLCBpLCBjZmcsIDEpOworCQkJdmFsaWQgPSBpc19tbWNvbmZfcmVzZXJ2ZWQoZTgyMF9hbGxfbWFwcGVkLCBjZmcsIDEpOwogCiAJCWlmICghdmFsaWQpCiAJCQlnb3RvIHJlamVjdDsKQEAgLTUxOCwzNCArNTEwLDQxIEBACiAJcmV0dXJuOwogCiByZWplY3Q6Ci0JcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBOb3QgdXNpbmcgTU1DT05GSUcuXG4iKTsKLQlwY2lfbW1jZmdfYXJjaF9mcmVlKCk7Ci0Ja2ZyZWUocGNpX21tY2ZnX2NvbmZpZyk7Ci0JcGNpX21tY2ZnX2NvbmZpZyA9IE5VTEw7Ci0JcGNpX21tY2ZnX2NvbmZpZ19udW0gPSAwOworCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJub3QgdXNpbmcgTU1DT05GSUdcbiIpOworCWZyZWVfYWxsX21tY2ZnKCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0ZGF0YSBrbm93bl9icmlkZ2U7CiAKLXN0YXRpYyBpbnQgYWNwaV9tY2ZnXzY0Yml0X2Jhc2VfYWRkciBfX2luaXRkYXRhID0gRkFMU0U7Ci0KLS8qIFRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBNTUNPTkZJRyBhcGVydHVyZS4gIFNldCBmcm9tIEFDUEkgdGFibGVzLiAqLwotc3RydWN0IGFjcGlfbWNmZ19hbGxvY2F0aW9uICpwY2lfbW1jZmdfY29uZmlnOwotaW50IHBjaV9tbWNmZ19jb25maWdfbnVtOwotCi1zdGF0aWMgaW50IF9faW5pdCBhY3BpX21jZmdfb2VtX2NoZWNrKHN0cnVjdCBhY3BpX3RhYmxlX21jZmcgKm1jZmcpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX21jZmdfY2hlY2tfZW50cnkoc3RydWN0IGFjcGlfdGFibGVfbWNmZyAqbWNmZywKKwkJCQkJc3RydWN0IGFjcGlfbWNmZ19hbGxvY2F0aW9uICpjZmcpCiB7Ci0JaWYgKCFzdHJjbXAobWNmZy0+aGVhZGVyLm9lbV9pZCwgIlNHSSIpKQotCQlhY3BpX21jZmdfNjRiaXRfYmFzZV9hZGRyID0gVFJVRTsKKwlpbnQgeWVhcjsKIAotCXJldHVybiAwOworCWlmIChjZmctPmFkZHJlc3MgPCAweEZGRkZGRkZGKQorCQlyZXR1cm4gMDsKKworCWlmICghc3RyY21wKG1jZmctPmhlYWRlci5vZW1faWQsICJTR0kiKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobWNmZy0+aGVhZGVyLnJldmlzaW9uID49IDEpIHsKKwkJaWYgKGRtaV9nZXRfZGF0ZShETUlfQklPU19EQVRFLCAmeWVhciwgTlVMTCwgTlVMTCkgJiYKKwkJICAgIHllYXIgPj0gMjAxMCkKKwkJCXJldHVybiAwOworCX0KKworCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIk1DRkcgcmVnaW9uIGZvciAlMDR4IFtidXMgJTAyeC0lMDJ4XSBhdCAlI2xseCAiCisJICAgICAgICJpcyBhYm92ZSA0R0IsIGlnbm9yZWRcbiIsIGNmZy0+cGNpX3NlZ21lbnQsCisJICAgICAgIGNmZy0+c3RhcnRfYnVzX251bWJlciwgY2ZnLT5lbmRfYnVzX251bWJlciwgY2ZnLT5hZGRyZXNzKTsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGludCBfX2luaXQgcGNpX3BhcnNlX21jZmcoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXIpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfbWNmZyAqbWNmZzsKKwlzdHJ1Y3QgYWNwaV9tY2ZnX2FsbG9jYXRpb24gKmNmZ190YWJsZSwgKmNmZzsKIAl1bnNpZ25lZCBsb25nIGk7Ci0JaW50IGNvbmZpZ19zaXplOworCWludCBlbnRyaWVzOwogCiAJaWYgKCFoZWFkZXIpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTUzLDM4ICs1NTIsMzMgQEAKIAltY2ZnID0gKHN0cnVjdCBhY3BpX3RhYmxlX21jZmcgKiloZWFkZXI7CiAKIAkvKiBob3cgbWFueSBjb25maWcgc3RydWN0dXJlcyBkbyB3ZSBoYXZlICovCi0JcGNpX21tY2ZnX2NvbmZpZ19udW0gPSAwOworCWZyZWVfYWxsX21tY2ZnKCk7CisJZW50cmllcyA9IDA7CiAJaSA9IGhlYWRlci0+bGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX21jZmcpOwogCXdoaWxlIChpID49IHNpemVvZihzdHJ1Y3QgYWNwaV9tY2ZnX2FsbG9jYXRpb24pKSB7Ci0JCSsrcGNpX21tY2ZnX2NvbmZpZ19udW07CisJCWVudHJpZXMrKzsKIAkJaSAtPSBzaXplb2Yoc3RydWN0IGFjcGlfbWNmZ19hbGxvY2F0aW9uKTsKIAl9OwotCWlmIChwY2lfbW1jZmdfY29uZmlnX251bSA9PSAwKSB7CisJaWYgKGVudHJpZXMgPT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJNTUNPTkZJRyBoYXMgbm8gZW50cmllc1xuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWNvbmZpZ19zaXplID0gcGNpX21tY2ZnX2NvbmZpZ19udW0gKiBzaXplb2YoKnBjaV9tbWNmZ19jb25maWcpOwotCXBjaV9tbWNmZ19jb25maWcgPSBrbWFsbG9jKGNvbmZpZ19zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBjaV9tbWNmZ19jb25maWcpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKLQkJICAgICAgICJObyBtZW1vcnkgZm9yIE1DRkcgY29uZmlnIHRhYmxlc1xuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW1lbWNweShwY2lfbW1jZmdfY29uZmlnLCAmbWNmZ1sxXSwgY29uZmlnX3NpemUpOwotCi0JYWNwaV9tY2ZnX29lbV9jaGVjayhtY2ZnKTsKLQotCWZvciAoaSA9IDA7IGkgPCBwY2lfbW1jZmdfY29uZmlnX251bTsgKytpKSB7Ci0JCWlmICgocGNpX21tY2ZnX2NvbmZpZ1tpXS5hZGRyZXNzID4gMHhGRkZGRkZGRikgJiYKLQkJICAgICFhY3BpX21jZmdfNjRiaXRfYmFzZV9hZGRyKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCi0JCQkgICAgICAgIk1NQ09ORklHIG5vdCBpbiBsb3cgNEdCIG9mIG1lbW9yeVxuIik7Ci0JCQlrZnJlZShwY2lfbW1jZmdfY29uZmlnKTsKLQkJCXBjaV9tbWNmZ19jb25maWdfbnVtID0gMDsKKwljZmdfdGFibGUgPSAoc3RydWN0IGFjcGlfbWNmZ19hbGxvY2F0aW9uICopICZtY2ZnWzFdOworCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKKwkJY2ZnID0gJmNmZ190YWJsZVtpXTsKKwkJaWYgKGFjcGlfbWNmZ19jaGVja19lbnRyeShtY2ZnLCBjZmcpKSB7CisJCQlmcmVlX2FsbF9tbWNmZygpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KKworCQlpZiAocGNpX21tY29uZmlnX2FkZChjZmctPnBjaV9zZWdtZW50LCBjZmctPnN0YXJ0X2J1c19udW1iZXIsCisJCQkJICAgY2ZnLT5lbmRfYnVzX251bWJlciwgY2ZnLT5hZGRyZXNzKSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAorCQkJICAgICAgICJubyBtZW1vcnkgZm9yIE1DRkcgZW50cmllc1xuIik7CisJCQlmcmVlX2FsbF9tbWNmZygpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTYxNCw5ICs2MDgsNyBAQAogCiAJcGNpX21tY2ZnX3JlamVjdF9icm9rZW4oZWFybHkpOwogCi0JaWYgKChwY2lfbW1jZmdfY29uZmlnX251bSA9PSAwKSB8fAotCSAgICAocGNpX21tY2ZnX2NvbmZpZyA9PSBOVUxMKSB8fAotCSAgICAocGNpX21tY2ZnX2NvbmZpZ1swXS5hZGRyZXNzID09IDApKQorCWlmIChsaXN0X2VtcHR5KCZwY2lfbW1jZmdfbGlzdCkpCiAJCXJldHVybjsKIAogCWlmIChwY2lfbW1jZmdfYXJjaF9pbml0KCkpCkBAIC02NDgsOSArNjQwLDcgQEAKIAkgKi8KIAlpZiAoKHBjaV9tbWNmZ19yZXNvdXJjZXNfaW5zZXJ0ZWQgPT0gMSkgfHwKIAkgICAgKHBjaV9wcm9iZSAmIFBDSV9QUk9CRV9NTUNPTkYpID09IDAgfHwKLQkgICAgKHBjaV9tbWNmZ19jb25maWdfbnVtID09IDApIHx8Ci0JICAgIChwY2lfbW1jZmdfY29uZmlnID09IE5VTEwpIHx8Ci0JICAgIChwY2lfbW1jZmdfY29uZmlnWzBdLmFkZHJlc3MgPT0gMCkpCisJICAgIGxpc3RfZW1wdHkoJnBjaV9tbWNmZ19saXN0KSkKIAkJcmV0dXJuIDE7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL21tY29uZmlnXzMyLmMgYi9hcmNoL3g4Ni9wY2kvbW1jb25maWdfMzIuYwppbmRleCBmMTBhN2U5Li45MGQ1ZmQ0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvbW1jb25maWdfMzIuYworKysgYi9hcmNoL3g4Ni9wY2kvbW1jb25maWdfMzIuYwpAQCAtMjcsMTggKzI3LDEwIEBACiAgKi8KIHN0YXRpYyB1MzIgZ2V0X2Jhc2VfYWRkcih1bnNpZ25lZCBpbnQgc2VnLCBpbnQgYnVzLCB1bnNpZ25lZCBkZXZmbikKIHsKLQlzdHJ1Y3QgYWNwaV9tY2ZnX2FsbG9jYXRpb24gKmNmZzsKLQlpbnQgY2ZnX251bTsKKwlzdHJ1Y3QgcGNpX21tY2ZnX3JlZ2lvbiAqY2ZnID0gcGNpX21tY29uZmlnX2xvb2t1cChzZWcsIGJ1cyk7CiAKLQlmb3IgKGNmZ19udW0gPSAwOyBjZmdfbnVtIDwgcGNpX21tY2ZnX2NvbmZpZ19udW07IGNmZ19udW0rKykgewotCQljZmcgPSAmcGNpX21tY2ZnX2NvbmZpZ1tjZmdfbnVtXTsKLQkJaWYgKGNmZy0+cGNpX3NlZ21lbnQgPT0gc2VnICYmCi0JCSAgICAoY2ZnLT5zdGFydF9idXNfbnVtYmVyIDw9IGJ1cykgJiYKLQkJICAgIChjZmctPmVuZF9idXNfbnVtYmVyID49IGJ1cykpCi0JCQlyZXR1cm4gY2ZnLT5hZGRyZXNzOwotCX0KLQotCS8qIEZhbGwgYmFjayB0byB0eXBlIDAgKi8KKwlpZiAoY2ZnKQorCQlyZXR1cm4gY2ZnLT5hZGRyZXNzOwogCXJldHVybiAwOwogfQogCkBAIC00Nyw3ICszOSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHBjaV9leHBfc2V0X2Rldl9iYXNlKHVuc2lnbmVkIGludCBiYXNlLCBpbnQgYnVzLCBpbnQgZGV2Zm4pCiB7Ci0JdTMyIGRldl9iYXNlID0gYmFzZSB8IChidXMgPDwgMjApIHwgKGRldmZuIDw8IDEyKTsKKwl1MzIgZGV2X2Jhc2UgPSBiYXNlIHwgUENJX01NQ0ZHX0JVU19PRkZTRVQoYnVzKSB8IChkZXZmbiA8PCAxMik7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlpZiAoZGV2X2Jhc2UgIT0gbW1jZmdfbGFzdF9hY2Nlc3NlZF9kZXZpY2UgfHwKIAkgICAgY3B1ICE9IG1tY2ZnX2xhc3RfYWNjZXNzZWRfY3B1KSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvbW1jb25maWdfNjQuYyBiL2FyY2gveDg2L3BjaS9tbWNvbmZpZ182NC5jCmluZGV4IDk0MzQ5ZjguLmU3ODM4NDEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9tbWNvbmZpZ182NC5jCisrKyBiL2FyY2gveDg2L3BjaS9tbWNvbmZpZ182NC5jCkBAIC0xMiwzOCArMTIsMTUgQEAKICNpbmNsdWRlIDxhc20vZTgyMC5oPgogI2luY2x1ZGUgPGFzbS9wY2lfeDg2Lmg+CiAKLS8qIFN0YXRpYyB2aXJ0dWFsIG1hcHBpbmcgb2YgdGhlIE1NQ09ORklHIGFwZXJ0dXJlICovCi1zdHJ1Y3QgbW1jZmdfdmlydCB7Ci0Jc3RydWN0IGFjcGlfbWNmZ19hbGxvY2F0aW9uICpjZmc7Ci0JY2hhciBfX2lvbWVtICp2aXJ0OwotfTsKLXN0YXRpYyBzdHJ1Y3QgbW1jZmdfdmlydCAqcGNpX21tY2ZnX3ZpcnQ7Ci0KLXN0YXRpYyBjaGFyIF9faW9tZW0gKmdldF92aXJ0KHVuc2lnbmVkIGludCBzZWcsIHVuc2lnbmVkIGJ1cykKLXsKLQlzdHJ1Y3QgYWNwaV9tY2ZnX2FsbG9jYXRpb24gKmNmZzsKLQlpbnQgY2ZnX251bTsKLQotCWZvciAoY2ZnX251bSA9IDA7IGNmZ19udW0gPCBwY2lfbW1jZmdfY29uZmlnX251bTsgY2ZnX251bSsrKSB7Ci0JCWNmZyA9IHBjaV9tbWNmZ192aXJ0W2NmZ19udW1dLmNmZzsKLQkJaWYgKGNmZy0+cGNpX3NlZ21lbnQgPT0gc2VnICYmCi0JCSAgICAoY2ZnLT5zdGFydF9idXNfbnVtYmVyIDw9IGJ1cykgJiYKLQkJICAgIChjZmctPmVuZF9idXNfbnVtYmVyID49IGJ1cykpCi0JCQlyZXR1cm4gcGNpX21tY2ZnX3ZpcnRbY2ZnX251bV0udmlydDsKLQl9Ci0KLQkvKiBGYWxsIGJhY2sgdG8gdHlwZSAwICovCi0JcmV0dXJuIE5VTEw7Ci19CisjZGVmaW5lIFBSRUZJWCAiUENJOiAiCiAKIHN0YXRpYyBjaGFyIF9faW9tZW0gKnBjaV9kZXZfYmFzZSh1bnNpZ25lZCBpbnQgc2VnLCB1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4pCiB7Ci0JY2hhciBfX2lvbWVtICphZGRyOworCXN0cnVjdCBwY2lfbW1jZmdfcmVnaW9uICpjZmcgPSBwY2lfbW1jb25maWdfbG9va3VwKHNlZywgYnVzKTsKIAotCWFkZHIgPSBnZXRfdmlydChzZWcsIGJ1cyk7Ci0JaWYgKCFhZGRyKQotCQlyZXR1cm4gTlVMTDsKLSAJcmV0dXJuIGFkZHIgKyAoKGJ1cyA8PCAyMCkgfCAoZGV2Zm4gPDwgMTIpKTsKKwlpZiAoY2ZnICYmIGNmZy0+dmlydCkKKwkJcmV0dXJuIGNmZy0+dmlydCArIChQQ0lfTU1DRkdfQlVTX09GRlNFVChidXMpIHwgKGRldmZuIDw8IDEyKSk7CisJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQgcGNpX21tY2ZnX3JlYWQodW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGJ1cywKQEAgLTEwOSw0MiArODYsMzAgQEAKIAkud3JpdGUgPQlwY2lfbW1jZmdfd3JpdGUsCiB9OwogCi1zdGF0aWMgdm9pZCBfX2lvbWVtICogX19pbml0IG1jZmdfaW9yZW1hcChzdHJ1Y3QgYWNwaV9tY2ZnX2FsbG9jYXRpb24gKmNmZykKK3N0YXRpYyB2b2lkIF9faW9tZW0gKiBfX2luaXQgbWNmZ19pb3JlbWFwKHN0cnVjdCBwY2lfbW1jZmdfcmVnaW9uICpjZmcpCiB7CiAJdm9pZCBfX2lvbWVtICphZGRyOwogCXU2NCBzdGFydCwgc2l6ZTsKKwlpbnQgbnVtX2J1c2VzOwogCi0Jc3RhcnQgPSBjZmctPnN0YXJ0X2J1c19udW1iZXI7Ci0Jc3RhcnQgPDw9IDIwOwotCXN0YXJ0ICs9IGNmZy0+YWRkcmVzczsKLQlzaXplID0gY2ZnLT5lbmRfYnVzX251bWJlciArIDEgLSBjZmctPnN0YXJ0X2J1c19udW1iZXI7Ci0Jc2l6ZSA8PD0gMjA7CisJc3RhcnQgPSBjZmctPmFkZHJlc3MgKyBQQ0lfTU1DRkdfQlVTX09GRlNFVChjZmctPnN0YXJ0X2J1cyk7CisJbnVtX2J1c2VzID0gY2ZnLT5lbmRfYnVzIC0gY2ZnLT5zdGFydF9idXMgKyAxOworCXNpemUgPSBQQ0lfTU1DRkdfQlVTX09GRlNFVChudW1fYnVzZXMpOwogCWFkZHIgPSBpb3JlbWFwX25vY2FjaGUoc3RhcnQsIHNpemUpOwotCWlmIChhZGRyKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlBDSTogVXNpbmcgTU1DT05GSUcgYXQgJUx4IC0gJUx4XG4iLAotCQkgICAgICAgc3RhcnQsIHN0YXJ0ICsgc2l6ZSAtIDEpOwotCQlhZGRyIC09IGNmZy0+c3RhcnRfYnVzX251bWJlciA8PCAyMDsKLQl9CisJaWYgKGFkZHIpCisJCWFkZHIgLT0gUENJX01NQ0ZHX0JVU19PRkZTRVQoY2ZnLT5zdGFydF9idXMpOwogCXJldHVybiBhZGRyOwogfQogCiBpbnQgX19pbml0IHBjaV9tbWNmZ19hcmNoX2luaXQodm9pZCkKIHsKLQlpbnQgaTsKLQlwY2lfbW1jZmdfdmlydCA9IGt6YWxsb2Moc2l6ZW9mKCpwY2lfbW1jZmdfdmlydCkgKgotCQkJCSBwY2lfbW1jZmdfY29uZmlnX251bSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBjaV9tbWNmZ192aXJ0ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IENhbiBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBtbWNvbmZpZyBzdHJ1Y3R1cmVzXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQorCXN0cnVjdCBwY2lfbW1jZmdfcmVnaW9uICpjZmc7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcGNpX21tY2ZnX2NvbmZpZ19udW07ICsraSkgewotCQlwY2lfbW1jZmdfdmlydFtpXS5jZmcgPSAmcGNpX21tY2ZnX2NvbmZpZ1tpXTsKLQkJcGNpX21tY2ZnX3ZpcnRbaV0udmlydCA9IG1jZmdfaW9yZW1hcCgmcGNpX21tY2ZnX2NvbmZpZ1tpXSk7Ci0JCWlmICghcGNpX21tY2ZnX3ZpcnRbaV0udmlydCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IENhbm5vdCBtYXAgbW1jb25maWcgYXBlcnR1cmUgZm9yICIKLQkJCQkJInNlZ21lbnQgJWRcbiIsCi0JCQkJcGNpX21tY2ZnX2NvbmZpZ1tpXS5wY2lfc2VnbWVudCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZmcsICZwY2lfbW1jZmdfbGlzdCwgbGlzdCkgeworCQljZmctPnZpcnQgPSBtY2ZnX2lvcmVtYXAoY2ZnKTsKKwkJaWYgKCFjZmctPnZpcnQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggImNhbid0IG1hcCBNTUNPTkZJRyBhdCAlcFJcbiIsCisJCQkgICAgICAgJmNmZy0+cmVzKTsKIAkJCXBjaV9tbWNmZ19hcmNoX2ZyZWUoKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0xNTUsMTkgKzEyMCwxMiBAQAogCiB2b2lkIF9faW5pdCBwY2lfbW1jZmdfYXJjaF9mcmVlKHZvaWQpCiB7Ci0JaW50IGk7CisJc3RydWN0IHBjaV9tbWNmZ19yZWdpb24gKmNmZzsKIAotCWlmIChwY2lfbW1jZmdfdmlydCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGNpX21tY2ZnX2NvbmZpZ19udW07ICsraSkgewotCQlpZiAocGNpX21tY2ZnX3ZpcnRbaV0udmlydCkgewotCQkJaW91bm1hcChwY2lfbW1jZmdfdmlydFtpXS52aXJ0ICsgKHBjaV9tbWNmZ192aXJ0W2ldLmNmZy0+c3RhcnRfYnVzX251bWJlciA8PCAyMCkpOwotCQkJcGNpX21tY2ZnX3ZpcnRbaV0udmlydCA9IE5VTEw7Ci0JCQlwY2lfbW1jZmdfdmlydFtpXS5jZmcgPSBOVUxMOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2ZnLCAmcGNpX21tY2ZnX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGNmZy0+dmlydCkgeworCQkJaW91bm1hcChjZmctPnZpcnQgKyBQQ0lfTU1DRkdfQlVTX09GRlNFVChjZmctPnN0YXJ0X2J1cykpOworCQkJY2ZnLT52aXJ0ID0gTlVMTDsKIAkJfQogCX0KLQotCWtmcmVlKHBjaV9tbWNmZ192aXJ0KTsKLQlwY2lfbW1jZmdfdmlydCA9IE5VTEw7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni90b29scy90ZXN0X2dldF9sZW4uYyBiL2FyY2gveDg2L3Rvb2xzL3Rlc3RfZ2V0X2xlbi5jCmluZGV4IGQ4MjE0ZGMuLmJlZThkNmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Rvb2xzL3Rlc3RfZ2V0X2xlbi5jCisrKyBiL2FyY2gveDg2L3Rvb2xzL3Rlc3RfZ2V0X2xlbi5jCkBAIC0xMTMsNyArMTEzLDcgQEAKIAljaGFyIGxpbmVbQlVGU0laRV0sIHN5bVtCVUZTSVpFXSA9ICI8dW5rbm93bj4iOwogCXVuc2lnbmVkIGNoYXIgaW5zbl9idWZbMTZdOwogCXN0cnVjdCBpbnNuIGluc247Ci0JaW50IGluc25zID0gMCwgYzsKKwlpbnQgaW5zbnMgPSAwOwogCWludCB3YXJuaW5ncyA9IDA7CiAKIAlwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jIGIvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCmluZGV4IGI4ZTQ1ZjEuLjJiMjZkZDUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYworKysgYi9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKQEAgLTI3LDcgKzI3LDkgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlLWZsYWdzLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAorI2luY2x1ZGUgPHhlbi94ZW4uaD4KICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3hlbi5oPgogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvcGh5c2Rldi5oPgpAQCAtMTE3NSw3ICsxMTc3LDExIEBACiAJCWFkZF9wcmVmZXJyZWRfY29uc29sZSgieGVuYm9vdCIsIDAsIE5VTEwpOwogCQlhZGRfcHJlZmVycmVkX2NvbnNvbGUoInR0eSIsIDAsIE5VTEwpOwogCQlhZGRfcHJlZmVycmVkX2NvbnNvbGUoImh2YyIsIDAsIE5VTEwpOworCX0gZWxzZSB7CisJCS8qIE1ha2Ugc3VyZSBBQ1Mgd2lsbCBiZSBlbmFibGVkICovCisJCXBjaV9yZXF1ZXN0X2FjcygpOwogCX0KKwkJCiAKIAl4ZW5fcmF3X2NvbnNvbGVfd3JpdGUoImFib3V0IHRvIGdldCBzdGFydGVkLi4uXG4iKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3lzY2FsbC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3lzY2FsbC5oCmluZGV4IDA1Y2ViZjguLjQzNTJkYmUgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3N5c2NhbGwuaAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zeXNjYWxsLmgKQEAgLTEzLDggKzEzLDYgQEAKIGFzbWxpbmthZ2UgbG9uZyB4dGVuc2FfZXhlY3ZlKGNoYXIqLCBjaGFyKiosIGNoYXIqKiwgc3RydWN0IHB0X3JlZ3MqKTsKIGFzbWxpbmthZ2UgbG9uZyB4dGVuc2FfY2xvbmUodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgc3RydWN0IHB0X3JlZ3MqKTsKIGFzbWxpbmthZ2UgbG9uZyB4dGVuc2FfcGlwZShpbnQgX191c2VyICopOwotYXNtbGlua2FnZSBsb25nIHh0ZW5zYV9tbWFwMih1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAotICAgIAkJCSAgICAgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CiBhc21saW5rYWdlIGxvbmcgeHRlbnNhX3B0cmFjZShsb25nLCBsb25nLCBsb25nLCBsb25nKTsKIGFzbWxpbmthZ2UgbG9uZyB4dGVuc2Ffc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzKik7CiBhc21saW5rYWdlIGxvbmcgeHRlbnNhX3J0X3NpZ3JldHVybihzdHJ1Y3QgcHRfcmVncyopOwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdW5pc3RkLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS91bmlzdGQuaAppbmRleCA0ZTU1ZGM3Li5mYmYzMThiIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS91bmlzdGQuaAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS91bmlzdGQuaApAQCAtMTg5LDcgKzE4OSw3IEBACiAvKiBGaWxlIE1hcCAvIFNoYXJlZCBNZW1vcnkgT3BlcmF0aW9ucyAqLwogCiAjZGVmaW5lIF9fTlJfbW1hcDIgCQkJCSA4MAotX19TWVNDQUxMKCA4MCwgeHRlbnNhX21tYXAyLCA2KQorX19TWVNDQUxMKCA4MCwgc3lzX21tYXBfcGdvZmYsIDYpCiAjZGVmaW5lIF9fTlJfbXVubWFwIAkJCQkgODEKIF9fU1lTQ0FMTCggODEsIHN5c19tdW5tYXAsIDIpCiAjZGVmaW5lIF9fTlJfbXByb3RlY3QgCQkJCSA4MgpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3N5c2NhbGwuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9zeXNjYWxsLmMKaW5kZXggYWMxNWVjYi4uMWU2N2JhYiAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3N5c2NhbGwuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvc3lzY2FsbC5jCkBAIC01NywzMSArNTcsNiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotCi1hc21saW5rYWdlIGxvbmcgeHRlbnNhX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCi0gICAJCQkgICAgIHVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLQlpbnQgZXJyb3IgPSAtRUJBREY7Ci0Jc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKLQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCi0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCiBhc21saW5rYWdlIGxvbmcgeHRlbnNhX3NobWF0KGludCBzaG1pZCwgY2hhciBfX3VzZXIgKnNobWFkZHIsIGludCBzaG1mbGcpCiB7CiAJdW5zaWduZWQgbG9uZyByZXQ7CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL2NvbnNvbGUuYyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvY29uc29sZS5jCmluZGV4IDRjNTU5Y2YuLmU2MGExZjUgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvY29uc29sZS5jCisrKyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvY29uc29sZS5jCkBAIC0xOTYsNyArMTk2LDcgQEAKIAkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAotc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBzZXJpYWxfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBzZXJpYWxfb3BzID0gewogCS5vcGVuID0gcnNfb3BlbiwKIAkuY2xvc2UgPSByc19jbG9zZSwKIAkud3JpdGUgPSByc193cml0ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9NYWtlZmlsZSBiL2RyaXZlcnMvYWNwaS9NYWtlZmlsZQppbmRleCA3NzAyMTE4Li5jN2IxMGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9hY3BpL01ha2VmaWxlCkBAIC0xOSw2ICsxOSw3IEBACiAKICMgQWxsIHRoZSBidWlsdGluIGZpbGVzIGFyZSBpbiB0aGUgImFjcGkuIiBtb2R1bGVfcGFyYW0gbmFtZXNwYWNlLgogYWNwaS15CQkJCSs9IG9zbC5vIHV0aWxzLm8gcmVib290Lm8KK2FjcGkteQkJCQkrPSBoZXN0Lm8KIAogIyBzbGVlcCByZWxhdGVkIGZpbGVzCiBhY3BpLXkJCQkJKz0gd2FrZXVwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9oZXN0LmMgYi9kcml2ZXJzL2FjcGkvaGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYjE4YzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvaGVzdC5jCkBAIC0wLDAgKzEsMTM1IEBACisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjZGVmaW5lIFBSRUZJWCAiQUNQSTogIgorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGFyc2VfYWNwaV9oZXN0X2lhX21hY2hpbmVfY2hlY2soc3RydWN0IGFjcGlfaGVzdF9pYV9tYWNoaW5lX2NoZWNrICpwKQoreworCXJldHVybiBzaXplb2YoKnApICsKKwkJKHNpemVvZihzdHJ1Y3QgYWNwaV9oZXN0X2lhX2Vycm9yX2JhbmspICogcC0+bnVtX2hhcmR3YXJlX2JhbmtzKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBhcnNlX2FjcGlfaGVzdF9pYV9jb3JyZWN0ZWQoc3RydWN0IGFjcGlfaGVzdF9pYV9jb3JyZWN0ZWQgKnApCit7CisJcmV0dXJuIHNpemVvZigqcCkgKworCQkoc2l6ZW9mKHN0cnVjdCBhY3BpX2hlc3RfaWFfZXJyb3JfYmFuaykgKiBwLT5udW1faGFyZHdhcmVfYmFua3MpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGFyc2VfYWNwaV9oZXN0X2lhX25taShzdHJ1Y3QgYWNwaV9oZXN0X2lhX25taSAqcCkKK3sKKwlyZXR1cm4gc2l6ZW9mKCpwKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBhcnNlX2FjcGlfaGVzdF9nZW5lcmljKHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpYyAqcCkKK3sKKwlyZXR1cm4gc2l6ZW9mKCpwKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaGVzdF9tYXRjaF9wY2koc3RydWN0IGFjcGlfaGVzdF9hZXJfY29tbW9uICpwLCBzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXJldHVybgkoMCAgICAgICAgICAgPT0gcGNpX2RvbWFpbl9ucihwY2ktPmJ1cykgJiYKKwkJIHAtPmJ1cyAgICAgID09IHBjaS0+YnVzLT5udW1iZXIgJiYKKwkJIHAtPmRldmljZSAgID09IFBDSV9TTE9UKHBjaS0+ZGV2Zm4pICYmCisJCSBwLT5mdW5jdGlvbiA9PSBQQ0lfRlVOQyhwY2ktPmRldmZuKSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhcnNlX2FjcGlfaGVzdF9hZXIodm9pZCAqaGRyLCBpbnQgdHlwZSwgc3RydWN0IHBjaV9kZXYgKnBjaSwgaW50ICpmaXJtd2FyZV9maXJzdCkKK3sKKwlzdHJ1Y3QgYWNwaV9oZXN0X2Flcl9jb21tb24gKnAgPSBoZHIgKyBzaXplb2Yoc3RydWN0IGFjcGlfaGVzdF9oZWFkZXIpOworCXVuc2lnbmVkIGxvbmcgcmM9MDsKKwl1OCBwY2llX3R5cGUgPSAwOworCXU4IGJyaWRnZSA9IDA7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBBQ1BJX0hFU1RfVFlQRV9BRVJfUk9PVF9QT1JUOgorCQlyYyA9IHNpemVvZihzdHJ1Y3QgYWNwaV9oZXN0X2Flcl9yb290KTsKKwkJcGNpZV90eXBlID0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVDsKKwkJYnJlYWs7CisJY2FzZSBBQ1BJX0hFU1RfVFlQRV9BRVJfRU5EUE9JTlQ6CisJCXJjID0gc2l6ZW9mKHN0cnVjdCBhY3BpX2hlc3RfYWVyKTsKKwkJcGNpZV90eXBlID0gUENJX0VYUF9UWVBFX0VORFBPSU5UOworCQlicmVhazsKKwljYXNlIEFDUElfSEVTVF9UWVBFX0FFUl9CUklER0U6CisJCXJjID0gc2l6ZW9mKHN0cnVjdCBhY3BpX2hlc3RfYWVyX2JyaWRnZSk7CisJCWlmICgocGNpLT5jbGFzcyA+PiAxNikgPT0gUENJX0JBU0VfQ0xBU1NfQlJJREdFKQorCQkJYnJpZGdlID0gMTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHAtPmZsYWdzICYgQUNQSV9IRVNUX0dMT0JBTCkgeworCQlpZiAoKHBjaS0+aXNfcGNpZSAmJiAocGNpLT5wY2llX3R5cGUgPT0gcGNpZV90eXBlKSkgfHwgYnJpZGdlKQorCQkJKmZpcm13YXJlX2ZpcnN0ID0gISEocC0+ZmxhZ3MgJiBBQ1BJX0hFU1RfRklSTVdBUkVfRklSU1QpOworCX0KKwllbHNlCisJCWlmIChoZXN0X21hdGNoX3BjaShwLCBwY2kpKQorCQkJKmZpcm13YXJlX2ZpcnN0ID0gISEocC0+ZmxhZ3MgJiBBQ1BJX0hFU1RfRklSTVdBUkVfRklSU1QpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBhY3BpX2hlc3RfZmlybXdhcmVfZmlyc3Qoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpzdGRoZWFkZXIsIHN0cnVjdCBwY2lfZGV2ICpwY2kpCit7CisJc3RydWN0IGFjcGlfdGFibGVfaGVzdCAqaGVzdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZXN0ICopc3RkaGVhZGVyOworCXZvaWQgKnAgPSAodm9pZCAqKWhlc3QgKyBzaXplb2YoKmhlc3QpOyAvKiBkZWZpbmVkIGJ5IHRoZSBBQ1BJIDQuMCBzcGVjICovCisJc3RydWN0IGFjcGlfaGVzdF9oZWFkZXIgKmhkciA9IHA7CisKKwlpbnQgaTsKKwlpbnQgZmlybXdhcmVfZmlyc3QgPSAwOworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHByaW50ZWRfdW51c2VkID0gMDsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBwcmludGVkX3Jlc2VydmVkID0gMDsKKworCWZvciAoaT0wLCBoZHI9cDsgcCA8ICgoKHZvaWQgKiloZXN0KSArIGhlc3QtPmhlYWRlci5sZW5ndGgpICYmIGkgPCBoZXN0LT5lcnJvcl9zb3VyY2VfY291bnQ7IGkrKykgeworCQlzd2l0Y2ggKGhkci0+dHlwZSkgeworCQljYXNlIEFDUElfSEVTVF9UWVBFX0lBMzJfQ0hFQ0s6CisJCQlwICs9IHBhcnNlX2FjcGlfaGVzdF9pYV9tYWNoaW5lX2NoZWNrKHApOworCQkJYnJlYWs7CisJCWNhc2UgQUNQSV9IRVNUX1RZUEVfSUEzMl9DT1JSRUNURURfQ0hFQ0s6CisJCQlwICs9IHBhcnNlX2FjcGlfaGVzdF9pYV9jb3JyZWN0ZWQocCk7CisJCQlicmVhazsKKwkJY2FzZSBBQ1BJX0hFU1RfVFlQRV9JQTMyX05NSToKKwkJCXAgKz0gcGFyc2VfYWNwaV9oZXN0X2lhX25taShwKTsKKwkJCWJyZWFrOworCQkvKiBUaGVzZSB0aHJlZSBzaG91bGQgbmV2ZXIgYXBwZWFyICovCisJCWNhc2UgQUNQSV9IRVNUX1RZUEVfTk9UX1VTRUQzOgorCQljYXNlIEFDUElfSEVTVF9UWVBFX05PVF9VU0VENDoKKwkJY2FzZSBBQ1BJX0hFU1RfVFlQRV9OT1RfVVNFRDU6CisJCQlpZiAoIXByaW50ZWRfdW51c2VkKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYCisJCQkJICAgICAgICJIRVNUIEVycm9yIFNvdXJjZSBsaXN0IGNvbnRhaW5zIGFuIG9ic29sZXRlIHR5cGUgKCVkKS5cbiIsIGhkci0+dHlwZSk7CisJCQkJcHJpbnRlZF91bnVzZWQgPSAxOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQUNQSV9IRVNUX1RZUEVfQUVSX1JPT1RfUE9SVDoKKwkJY2FzZSBBQ1BJX0hFU1RfVFlQRV9BRVJfRU5EUE9JTlQ6CisJCWNhc2UgQUNQSV9IRVNUX1RZUEVfQUVSX0JSSURHRToKKwkJCXAgKz0gcGFyc2VfYWNwaV9oZXN0X2FlcihwLCBoZHItPnR5cGUsIHBjaSwgJmZpcm13YXJlX2ZpcnN0KTsKKwkJCWJyZWFrOworCQljYXNlIEFDUElfSEVTVF9UWVBFX0dFTkVSSUNfRVJST1I6CisJCQlwICs9IHBhcnNlX2FjcGlfaGVzdF9nZW5lcmljKHApOworCQkJYnJlYWs7CisJCS8qIFRoZXNlIHNob3VsZCBuZXZlciBhcHBlYXIgZWl0aGVyICovCisJCWNhc2UgQUNQSV9IRVNUX1RZUEVfUkVTRVJWRUQ6CisJCWRlZmF1bHQ6CisJCQlpZiAoIXByaW50ZWRfcmVzZXJ2ZWQpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyBQUkVGSVgKKwkJCQkgICAgICAgIkhFU1QgRXJyb3IgU291cmNlIGxpc3QgY29udGFpbnMgYSByZXNlcnZlZCB0eXBlICglZCkuXG4iLCBoZHItPnR5cGUpOworCQkJCXByaW50ZWRfcmVzZXJ2ZWQgPSAxOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGZpcm13YXJlX2ZpcnN0OworfQorCitpbnQgYWNwaV9oZXN0X2Zpcm13YXJlX2ZpcnN0X3BjaShzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX05PVF9GT1VORDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlc3QgPSBOVUxMOworCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfU0lHX0hFU1QsIDEsICZoZXN0KTsKKworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlpZiAoYWNwaV9oZXN0X2Zpcm13YXJlX2ZpcnN0KGhlc3QsIHBjaSkpIHsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWNwaV9oZXN0X2Zpcm13YXJlX2ZpcnN0X3BjaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCmluZGV4IDhiYTBlZDAuLjAxZTM2NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCkBAIC0xNjcsNiArMTY3LDE5IEBACiAJCXJldHVybiBjcHVmcmVxX3VwZGF0ZV9wb2xpY3kocHItPmlkKTsKIH0KIAoraW50IGFjcGlfcHJvY2Vzc29yX2dldF9iaW9zX2xpbWl0KGludCBjcHUsIHVuc2lnbmVkIGludCAqbGltaXQpCit7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcjsKKworCXByID0gcGVyX2NwdShwcm9jZXNzb3JzLCBjcHUpOworCWlmICghcHIgfHwgIXByLT5wZXJmb3JtYW5jZSB8fCAhcHItPnBlcmZvcm1hbmNlLT5zdGF0ZV9jb3VudCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJKmxpbWl0ID0gcHItPnBlcmZvcm1hbmNlLT5zdGF0ZXNbcHItPnBlcmZvcm1hbmNlX3BsYXRmb3JtX2xpbWl0XS4KKwkJY29yZV9mcmVxdWVuY3kgKiAxMDAwOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChhY3BpX3Byb2Nlc3Nvcl9nZXRfYmlvc19saW1pdCk7CisKIHZvaWQgYWNwaV9wcm9jZXNzb3JfcHBjX2luaXQodm9pZCkKIHsKIAlpZiAoIWNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jb3JlLmMgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCmluZGV4IDZiZWU2YWYuLmYxMjkwY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jb3JlLmMKKysrIGIvZHJpdmVycy9iYXNlL2NvcmUuYwpAQCAtNTYsNyArNTYsMTQgQEAKICAqLwogY29uc3QgY2hhciAqZGV2X2RyaXZlcl9zdHJpbmcoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQogewotCXJldHVybiBkZXYtPmRyaXZlciA/IGRldi0+ZHJpdmVyLT5uYW1lIDoKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2OworCisJLyogZGV2LT5kcml2ZXIgY2FuIGNoYW5nZSB0byBOVUxMIHVuZGVybmVhdGggdXMgYmVjYXVzZSBvZiB1bmJpbmRpbmcsCisJICogc28gYmUgY2FyZWZ1bCBhYm91dCBhY2Nlc3NpbmcgaXQuICBkZXYtPmJ1cyBhbmQgZGV2LT5jbGFzcyBzaG91bGQKKwkgKiBuZXZlciBjaGFuZ2Ugb25jZSB0aGV5IGFyZSBzZXQsIHNvIHRoZXkgZG9uJ3QgbmVlZCBzcGVjaWFsIGNhcmUuCisJICovCisJZHJ2ID0gQUNDRVNTX09OQ0UoZGV2LT5kcml2ZXIpOworCXJldHVybiBkcnYgPyBkcnYtPm5hbWUgOgogCQkJKGRldi0+YnVzID8gZGV2LT5idXMtPm5hbWUgOgogCQkJKGRldi0+Y2xhc3MgPyBkZXYtPmNsYXNzLT5uYW1lIDogIiIpKTsKIH0KQEAgLTk4Nyw2ICs5OTQsOCBAQAogCWRldmljZV9yZW1vdmVfY2xhc3Nfc3ltbGlua3MoZGV2KTsKICBTeW1saW5rRXJyb3I6CiAJaWYgKE1BSk9SKGRldi0+ZGV2dCkpCisJCWRldnRtcGZzX2RlbGV0ZV9ub2RlKGRldik7CisJaWYgKE1BSk9SKGRldi0+ZGV2dCkpCiAJCWRldmljZV9yZW1vdmVfc3lzX2Rldl9lbnRyeShkZXYpOwogIGRldnRhdHRyRXJyb3I6CiAJaWYgKE1BSk9SKGRldi0+ZGV2dCkpCkBAIC0xNzI4LDggKzE3MzcsNSBAQAogCQkJZGV2LT5kcml2ZXItPnNodXRkb3duKGRldik7CiAJCX0KIAl9Ci0Ja29iamVjdF9wdXQoc3lzZnNfZGV2X2NoYXJfa29iaik7Ci0Ja29iamVjdF9wdXQoc3lzZnNfZGV2X2Jsb2NrX2tvYmopOwotCWtvYmplY3RfcHV0KGRldl9rb2JqKTsKIAlhc3luY19zeW5jaHJvbml6ZV9mdWxsKCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZGV2dG1wZnMuYyBiL2RyaXZlcnMvYmFzZS9kZXZ0bXBmcy5jCmluZGV4IGExY2I1YWYuLjUwMzc1YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kZXZ0bXBmcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9kZXZ0bXBmcy5jCkBAIC0zMiw2ICszMiw4IEBACiBzdGF0aWMgaW50IGRldl9tb3VudDsKICNlbmRpZgogCitzdGF0aWMgcndsb2NrX3QgZGlybG9jazsKKwogc3RhdGljIGludCBfX2luaXQgbW91bnRfcGFyYW0oY2hhciAqc3RyKQogewogCWRldl9tb3VudCA9IHNpbXBsZV9zdHJ0b3VsKHN0ciwgTlVMTCwgMCk7CkBAIC03NCw0NyArNzYsMzUgQEAKIAlkZW50cnkgPSBsb29rdXBfY3JlYXRlKCZuZCwgMSk7CiAJaWYgKCFJU19FUlIoZGVudHJ5KSkgewogCQllcnIgPSB2ZnNfbWtkaXIobmQucGF0aC5kZW50cnktPmRfaW5vZGUsIGRlbnRyeSwgbW9kZSk7CisJCWlmICghZXJyKQorCQkJLyogbWFyayBhcyBrZXJuZWwtY3JlYXRlZCBpbm9kZSAqLworCQkJZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGUgPSAmZGV2X21udDsKIAkJZHB1dChkZW50cnkpOwogCX0gZWxzZSB7CiAJCWVyciA9IFBUUl9FUlIoZGVudHJ5KTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKKwltdXRleF91bmxvY2soJm5kLnBhdGguZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAlwYXRoX3B1dCgmbmQucGF0aCk7CiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBjcmVhdGVfcGF0aChjb25zdCBjaGFyICpub2RlcGF0aCkKIHsKLQljaGFyICpwYXRoOwotCXN0cnVjdCBuYW1laWRhdGEgbmQ7Ci0JaW50IGVyciA9IDA7CisJaW50IGVycjsKIAotCXBhdGggPSBrc3RyZHVwKG5vZGVwYXRoLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBhdGgpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZXJyID0gdmZzX3BhdGhfbG9va3VwKGRldl9tbnQtPm1udF9yb290LCBkZXZfbW50LAotCQkJICAgICAgcGF0aCwgTE9PS1VQX1BBUkVOVCwgJm5kKTsKLQlpZiAoZXJyID09IDApIHsKLQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwotCi0JCS8qIGNyZWF0ZSBkaXJlY3RvcnkgcmlnaHQgYXdheSAqLwotCQlkZW50cnkgPSBsb29rdXBfY3JlYXRlKCZuZCwgMSk7Ci0JCWlmICghSVNfRVJSKGRlbnRyeSkpIHsKLQkJCWVyciA9IHZmc19ta2RpcihuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZSwKLQkJCQkJZGVudHJ5LCAwNzU1KTsKLQkJCWRwdXQoZGVudHJ5KTsKLQkJfQotCQltdXRleF91bmxvY2soJm5kLnBhdGguZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKLQotCQlwYXRoX3B1dCgmbmQucGF0aCk7Ci0JfSBlbHNlIGlmIChlcnIgPT0gLUVOT0VOVCkgeworCXJlYWRfbG9jaygmZGlybG9jayk7CisJZXJyID0gZGV2X21rZGlyKG5vZGVwYXRoLCAwNzU1KTsKKwlpZiAoZXJyID09IC1FTk9FTlQpIHsKKwkJY2hhciAqcGF0aDsKIAkJY2hhciAqczsKIAogCQkvKiBwYXJlbnQgZGlyZWN0b3JpZXMgZG8gbm90IGV4aXN0LCBjcmVhdGUgdGhlbSAqLworCQlwYXRoID0ga3N0cmR1cChub2RlcGF0aCwgR0ZQX0tFUk5FTCk7CisJCWlmICghcGF0aCkKKwkJCXJldHVybiAtRU5PTUVNOwogCQlzID0gcGF0aDsKLQkJd2hpbGUgKDEpIHsKKwkJZm9yICg7OykgewogCQkJcyA9IHN0cmNocihzLCAnLycpOwogCQkJaWYgKCFzKQogCQkJCWJyZWFrOwpAQCAtMTI1LDkgKzExNSw5IEBACiAJCQlzWzBdID0gJy8nOwogCQkJcysrOwogCQl9CisJCWtmcmVlKHBhdGgpOwogCX0KLQotCWtmcmVlKHBhdGgpOworCXJlYWRfdW5sb2NrKCZkaXJsb2NrKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xNTYsMzQgKzE0Niw0MCBAQAogCQltb2RlIHw9IFNfSUZDSFI7CiAKIAljdXJyX2NyZWQgPSBvdmVycmlkZV9jcmVkcygmaW5pdF9jcmVkKTsKKwogCWVyciA9IHZmc19wYXRoX2xvb2t1cChkZXZfbW50LT5tbnRfcm9vdCwgZGV2X21udCwKIAkJCSAgICAgIG5vZGVuYW1lLCBMT09LVVBfUEFSRU5ULCAmbmQpOwogCWlmIChlcnIgPT0gLUVOT0VOVCkgewotCQkvKiBjcmVhdGUgbWlzc2luZyBwYXJlbnQgZGlyZWN0b3JpZXMgKi8KIAkJY3JlYXRlX3BhdGgobm9kZW5hbWUpOwogCQllcnIgPSB2ZnNfcGF0aF9sb29rdXAoZGV2X21udC0+bW50X3Jvb3QsIGRldl9tbnQsCiAJCQkJICAgICAgbm9kZW5hbWUsIExPT0tVUF9QQVJFTlQsICZuZCk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dDsKIAl9CisJaWYgKGVycikKKwkJZ290byBvdXQ7CiAKIAlkZW50cnkgPSBsb29rdXBfY3JlYXRlKCZuZCwgMCk7CiAJaWYgKCFJU19FUlIoZGVudHJ5KSkgewotCQlpbnQgdW1hc2s7Ci0KLQkJdW1hc2sgPSBzeXNfdW1hc2soMDAwMCk7CiAJCWVyciA9IHZmc19ta25vZChuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZSwKIAkJCQlkZW50cnksIG1vZGUsIGRldi0+ZGV2dCk7Ci0JCXN5c191bWFzayh1bWFzayk7Ci0JCS8qIG1hcmsgYXMga2VybmVsIGNyZWF0ZWQgaW5vZGUgKi8KLQkJaWYgKCFlcnIpCisJCWlmICghZXJyKSB7CisJCQlzdHJ1Y3QgaWF0dHIgbmV3YXR0cnM7CisKKwkJCS8qIGZpeHVwIHBvc3NpYmx5IHVtYXNrZWQgbW9kZSAqLworCQkJbmV3YXR0cnMuaWFfbW9kZSA9IG1vZGU7CisJCQluZXdhdHRycy5pYV92YWxpZCA9IEFUVFJfTU9ERTsKKwkJCW11dGV4X2xvY2soJmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CisJCQlub3RpZnlfY2hhbmdlKGRlbnRyeSwgJm5ld2F0dHJzKTsKKwkJCW11dGV4X3VubG9jaygmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKKworCQkJLyogbWFyayBhcyBrZXJuZWwtY3JlYXRlZCBpbm9kZSAqLwogCQkJZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGUgPSAmZGV2X21udDsKKwkJfQogCQlkcHV0KGRlbnRyeSk7CiAJfSBlbHNlIHsKIAkJZXJyID0gUFRSX0VSUihkZW50cnkpOwogCX0KLQltdXRleF91bmxvY2soJm5kLnBhdGguZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAorCW11dGV4X3VubG9jaygmbmQucGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCXBhdGhfcHV0KCZuZC5wYXRoKTsKIG91dDoKIAlrZnJlZSh0bXApOwpAQCAtMjA1LDE2ICsyMDEsMjEgQEAKIAltdXRleF9sb2NrX25lc3RlZCgmbmQucGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgsIElfTVVURVhfUEFSRU5UKTsKIAlkZW50cnkgPSBsb29rdXBfb25lX2xlbihuZC5sYXN0Lm5hbWUsIG5kLnBhdGguZGVudHJ5LCBuZC5sYXN0Lmxlbik7CiAJaWYgKCFJU19FUlIoZGVudHJ5KSkgewotCQlpZiAoZGVudHJ5LT5kX2lub2RlKQotCQkJZXJyID0gdmZzX3JtZGlyKG5kLnBhdGguZGVudHJ5LT5kX2lub2RlLCBkZW50cnkpOwotCQllbHNlCisJCWlmIChkZW50cnktPmRfaW5vZGUpIHsKKwkJCWlmIChkZW50cnktPmRfaW5vZGUtPmlfcHJpdmF0ZSA9PSAmZGV2X21udCkKKwkJCQllcnIgPSB2ZnNfcm1kaXIobmQucGF0aC5kZW50cnktPmRfaW5vZGUsCisJCQkJCQlkZW50cnkpOworCQkJZWxzZQorCQkJCWVyciA9IC1FUEVSTTsKKwkJfSBlbHNlIHsKIAkJCWVyciA9IC1FTk9FTlQ7CisJCX0KIAkJZHB1dChkZW50cnkpOwogCX0gZWxzZSB7CiAJCWVyciA9IFBUUl9FUlIoZGVudHJ5KTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKKwltdXRleF91bmxvY2soJm5kLnBhdGguZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAlwYXRoX3B1dCgmbmQucGF0aCk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTIyOCw3ICsyMjksOCBAQAogCWlmICghcGF0aCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQl3aGlsZSAoMSkgeworCXdyaXRlX2xvY2soJmRpcmxvY2spOworCWZvciAoOzspIHsKIAkJY2hhciAqYmFzZTsKIAogCQliYXNlID0gc3RycmNocihwYXRoLCAnLycpOwpAQCAtMjM5LDYgKzI0MSw3IEBACiAJCWlmIChlcnIpCiAJCQlicmVhazsKIAl9CisJd3JpdGVfdW5sb2NrKCZkaXJsb2NrKTsKIAogCWtmcmVlKHBhdGgpOwogCXJldHVybiBlcnI7CkBAIC0zMjIsOSArMzI1LDggQEAKICAqIElmIGNvbmZpZ3VyZWQsIG9yIHJlcXVlc3RlZCBieSB0aGUgY29tbWFuZGxpbmUsIGRldnRtcGZzIHdpbGwgYmUKICAqIGF1dG8tbW91bnRlZCBhZnRlciB0aGUga2VybmVsIG1vdW50ZWQgdGhlIHJvb3QgZmlsZXN5c3RlbS4KICAqLwotaW50IGRldnRtcGZzX21vdW50KGNvbnN0IGNoYXIgKm1vdW50cG9pbnQpCitpbnQgZGV2dG1wZnNfbW91bnQoY29uc3QgY2hhciAqbW50ZGlyKQogewotCXN0cnVjdCBwYXRoIHBhdGg7CiAJaW50IGVycjsKIAogCWlmICghZGV2X21vdW50KQpAQCAtMzMzLDE1ICszMzUsMTEgQEAKIAlpZiAoIWRldl9tbnQpCiAJCXJldHVybiAwOwogCi0JZXJyID0ga2Vybl9wYXRoKG1vdW50cG9pbnQsIExPT0tVUF9GT0xMT1csICZwYXRoKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IGRvX2FkZF9tb3VudChkZXZfbW50LCAmcGF0aCwgMCwgTlVMTCk7CisJZXJyID0gc3lzX21vdW50KCJkZXZ0bXBmcyIsIChjaGFyICopbW50ZGlyLCAiZGV2dG1wZnMiLCBNU19TSUxFTlQsIE5VTEwpOwogCWlmIChlcnIpCiAJCXByaW50ayhLRVJOX0lORk8gImRldnRtcGZzOiBlcnJvciBtb3VudGluZyAlaVxuIiwgZXJyKTsKIAllbHNlCiAJCXByaW50ayhLRVJOX0lORk8gImRldnRtcGZzOiBtb3VudGVkXG4iKTsKLQlwYXRoX3B1dCgmcGF0aCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMzU0LDYgKzM1Miw4IEBACiAJaW50IGVycjsKIAlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKIAorCXJ3bG9ja19pbml0KCZkaXJsb2NrKTsKKwogCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmRldl9mc190eXBlKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZGV2dG1wZnM6IHVuYWJsZSB0byByZWdpc3RlciBkZXZ0bXBmcyAiCkBAIC0zNjEsNyArMzYxLDcgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQltbnQgPSBrZXJuX21vdW50KCZkZXZfZnNfdHlwZSk7CisJbW50ID0ga2Vybl9tb3VudF9kYXRhKCZkZXZfZnNfdHlwZSwgIm1vZGU9MDc1NSIpOwogCWlmIChJU19FUlIobW50KSkgewogCQllcnIgPSBQVFJfRVJSKG1udCk7CiAJCXByaW50ayhLRVJOX0VSUiAiZGV2dG1wZnM6IHVuYWJsZSB0byBjcmVhdGUgZGV2dG1wZnMgJWlcbiIsIGVycik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCmluZGV4IDczNzYzNjcuLmE5NTAyNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCkBAIC02MDEsMTIgKzYwMSw5IEBACiAJfQogCXJldCA9IF9yZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfd29yay0+bmFtZSwgZndfd29yay0+ZGV2aWNlLAogCQlmd193b3JrLT51ZXZlbnQpOwotCWlmIChyZXQgPCAwKQotCQlmd193b3JrLT5jb250KE5VTEwsIGZ3X3dvcmstPmNvbnRleHQpOwotCWVsc2UgewotCQlmd193b3JrLT5jb250KGZ3LCBmd193b3JrLT5jb250ZXh0KTsKLQkJcmVsZWFzZV9maXJtd2FyZShmdyk7Ci0JfQorCisJZndfd29yay0+Y29udChmdywgZndfd29yay0+Y29udGV4dCk7CisKIAltb2R1bGVfcHV0KGZ3X3dvcmstPm1vZHVsZSk7CiAJa2ZyZWUoZndfd29yayk7CiAJcmV0dXJuIHJldDsKQEAgLTYxOSw2ICs2MTYsNyBAQAogICoJaXMgbm9uLXplcm8gZWxzZSB0aGUgZmlybXdhcmUgY29weSBtdXN0IGJlIGRvbmUgbWFudWFsbHkuCiAgKiBAbmFtZTogbmFtZSBvZiBmaXJtd2FyZSBmaWxlCiAgKiBAZGV2aWNlOiBkZXZpY2UgZm9yIHdoaWNoIGZpcm13YXJlIGlzIGJlaW5nIGxvYWRlZAorICogQGdmcDogYWxsb2NhdGlvbiBmbGFncwogICogQGNvbnRleHQ6IHdpbGwgYmUgcGFzc2VkIG92ZXIgdG8gQGNvbnQsIGFuZAogICoJQGZ3IG1heSBiZSAlTlVMTCBpZiBmaXJtd2FyZSByZXF1ZXN0IGZhaWxzLgogICogQGNvbnQ6IGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFzeW5jaHJvbm91c2x5IHdoZW4gdGhlIGZpcm13YXJlCkBAIC02MzEsMTIgKzYyOSwxMiBAQAogaW50CiByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdCgKIAlzdHJ1Y3QgbW9kdWxlICptb2R1bGUsIGludCB1ZXZlbnQsCi0JY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRldmljZSAqZGV2aWNlLCB2b2lkICpjb250ZXh0LAorCWNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSwgZ2ZwX3QgZ2ZwLCB2b2lkICpjb250ZXh0LAogCXZvaWQgKCpjb250KShjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LCB2b2lkICpjb250ZXh0KSkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiAJc3RydWN0IGZpcm13YXJlX3dvcmsgKmZ3X3dvcmsgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGZpcm13YXJlX3dvcmspLAotCQkJCQkJR0ZQX0FUT01JQyk7CisJCQkJCQlnZnApOwogCiAJaWYgKCFmd193b3JrKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKaW5kZXggNGZhOTU0Yi4uOWQyZWUyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKQEAgLTEwMDAsNyArMTAwMCw3IEBACiBpbnQgX19pbml0IGVhcmx5X3BsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgZWFybHlfcGxhdGZvcm1fZHJpdmVyICplcGRydiwKIAkJCQkJICBjaGFyICpidWYpCiB7Ci0JdW5zaWduZWQgbG9uZyBpbmRleDsKKwljaGFyICp0bXA7CiAJaW50IG47CiAKIAkvKiBTaW1wbHkgYWRkIHRoZSBkcml2ZXIgdG8gdGhlIGVuZCBvZiB0aGUgZ2xvYmFsIGxpc3QuCkBAIC0xMDE5LDEzICsxMDE5LDI4IEBACiAJaWYgKGJ1ZiAmJiAhc3RybmNtcChidWYsIGVwZHJ2LT5wZHJ2LT5kcml2ZXIubmFtZSwgbikpIHsKIAkJbGlzdF9tb3ZlKCZlcGRydi0+bGlzdCwgJmVhcmx5X3BsYXRmb3JtX2RyaXZlcl9saXN0KTsKIAotCQlpZiAoIXN0cmNtcChidWYsIGVwZHJ2LT5wZHJ2LT5kcml2ZXIubmFtZSkpCisJCS8qIEFsbG93IHBhc3NpbmcgcGFyYW1ldGVycyBhZnRlciBkZXZpY2UgbmFtZSAqLworCQlpZiAoYnVmW25dID09ICdcMCcgfHwgYnVmW25dID09ICcsJykKIAkJCWVwZHJ2LT5yZXF1ZXN0ZWRfaWQgPSAtMTsKLQkJZWxzZSBpZiAoYnVmW25dID09ICcuJyAmJiBzdHJpY3Rfc3RydG91bCgmYnVmW24gKyAxXSwgMTAsCi0JCQkJCQkJICZpbmRleCkgPT0gMCkKLQkJCWVwZHJ2LT5yZXF1ZXN0ZWRfaWQgPSBpbmRleDsKLQkJZWxzZQotCQkJZXBkcnYtPnJlcXVlc3RlZF9pZCA9IEVBUkxZX1BMQVRGT1JNX0lEX0VSUk9SOworCQllbHNlIHsKKwkJCWVwZHJ2LT5yZXF1ZXN0ZWRfaWQgPSBzaW1wbGVfc3RydG91bCgmYnVmW24gKyAxXSwKKwkJCQkJCQkgICAgICZ0bXAsIDEwKTsKKworCQkJaWYgKGJ1ZltuXSAhPSAnLicgfHwgKHRtcCA9PSAmYnVmW24gKyAxXSkpIHsKKwkJCQllcGRydi0+cmVxdWVzdGVkX2lkID0gRUFSTFlfUExBVEZPUk1fSURfRVJST1I7CisJCQkJbiA9IDA7CisJCQl9IGVsc2UKKwkJCQluICs9IHN0cmNzcG4oJmJ1ZltuICsgMV0sICIsIikgKyAxOworCQl9CisKKwkJaWYgKGJ1ZltuXSA9PSAnLCcpCisJCQluKys7CisKKwkJaWYgKGVwZHJ2LT5idWZzaXplKSB7CisJCQltZW1jcHkoZXBkcnYtPmJ1ZmZlciwgJmJ1ZltuXSwKKwkJCSAgICAgICBtaW5fdChpbnQsIGVwZHJ2LT5idWZzaXplLCBzdHJsZW4oJmJ1ZltuXSkgKyAxKSk7CisJCQllcGRydi0+YnVmZmVyW2VwZHJ2LT5idWZzaXplIC0gMV0gPSAnXDAnOworCQl9CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtmcm9udC5jIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYwppbmRleCBiODU3OGJiLi4wNWEzMWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtmcm9udC5jCisrKyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCisjaW5jbHVkZSA8eGVuL3hlbi5oPgogI2luY2x1ZGUgPHhlbi94ZW5idXMuaD4KICNpbmNsdWRlIDx4ZW4vZ3JhbnRfdGFibGUuaD4KICNpbmNsdWRlIDx4ZW4vZXZlbnRzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idHVzYi5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYwppbmRleCA0NGJjOGJiLi40ZDI5MDU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9idHVzYi5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dXNiLmMKQEAgLTEwNjYsNyArMTA2Niw3IEBACiAJCXJldHVybiAwOwogCiAJc3Bpbl9sb2NrX2lycSgmZGF0YS0+dHhsb2NrKTsKLQlpZiAoIShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLT5hdXRvX3BtICYmIGRhdGEtPnR4X2luX2ZsaWdodCkpIHsKKwlpZiAoISgobWVzc2FnZS5ldmVudCAmIFBNX0VWRU5UX0FVVE8pICYmIGRhdGEtPnR4X2luX2ZsaWdodCkpIHsKIAkJc2V0X2JpdChCVFVTQl9TVVNQRU5ESU5HLCAmZGF0YS0+ZmxhZ3MpOwogCQlzcGluX3VubG9ja19pcnEoJmRhdGEtPnR4bG9jayk7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9LY29uZmlnIGIvZHJpdmVycy9jaGFyL0tjb25maWcKaW5kZXggNmFhZDk5ZS4uNmYzMWM5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL0tjb25maWcKQEAgLTIwMSwxOSArMjAxLDYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGVwY2EuCiAKLWNvbmZpZyBFU1BTRVJJQUwKLQl0cmlzdGF0ZSAiSGF5ZXMgRVNQIHNlcmlhbCBwb3J0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQgJiYgSVNBICYmIElTQV9ETUFfQVBJICYmIEJST0tFTgotCWhlbHAKLQkgIFRoaXMgaXMgYSBkcml2ZXIgd2hpY2ggc3VwcG9ydHMgSGF5ZXMgRVNQIHNlcmlhbCBwb3J0cy4gIEJvdGggc2luZ2xlCi0JICBwb3J0IGNhcmRzIGFuZCBtdWx0aXBvcnQgY2FyZHMgYXJlIHN1cHBvcnRlZC4gIE1ha2Ugc3VyZSB0byByZWFkCi0JICA8ZmlsZTpEb2N1bWVudGF0aW9uL2hheWVzLWVzcC50eHQ+LgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBlc3AuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBNT1hBX0lOVEVMTElPCiAJdHJpc3RhdGUgIk1veGEgSW50ZWxsaW8gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiAoSVNBIHx8IEVJU0EgfHwgUENJKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCmluZGV4IDE5YTc5ZGQuLmY5NTdlZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKQEAgLTE4LDcgKzE4LDYgQEAKIG9iai0kKENPTkZJR19IV19DT05TT0xFKQkrPSB2dC5vIGRlZmtleW1hcC5vCiBvYmotJChDT05GSUdfQVVESVQpCQkrPSB0dHlfYXVkaXQubwogb2JqLSQoQ09ORklHX01BR0lDX1NZU1JRKQkrPSBzeXNycS5vCi1vYmotJChDT05GSUdfRVNQU0VSSUFMKQkJKz0gZXNwLm8KIG9iai0kKENPTkZJR19NVk1FMTQ3X1NDQykJKz0gZ2VuZXJpY19zZXJpYWwubyB2bWVfc2NjLm8KIG9iai0kKENPTkZJR19NVk1FMTYyX1NDQykJKz0gZ2VuZXJpY19zZXJpYWwubyB2bWVfc2NjLm8KIG9iai0kKENPTkZJR19CVk1FNjAwMF9TQ0MpCSs9IGdlbmVyaWNfc2VyaWFsLm8gdm1lX3NjYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYwppbmRleCAzY2I1NmEwLi4zMGMzNmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMKQEAgLTM2LDEwICszNiwxMCBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTY1R01FX0lHICAgICAweDJBMTIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84Mjk0NUdNRV9IQiAgICAgMHgyN0FDCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NDVHTUVfSUcgICAgIDB4MjdBRQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lHREdNX0hCICAgICAgICAweEEwMTAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JR0RHTV9JRyAgICAgICAgMHhBMDExCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUdER19IQiAgICAgICAgIDB4QTAwMAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lHREdfSUcgICAgICAgICAweEEwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9QSU5FVklFV19NX0hCICAgICAgICAweEEwMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9QSU5FVklFV19NX0lHICAgICAgICAweEEwMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9QSU5FVklFV19IQiAgICAgICAgIDB4QTAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1BJTkVWSUVXX0lHICAgICAgICAgMHhBMDAxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfRzMzX0hCICAgICAgICAgIDB4MjlDMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0czM19JRyAgICAgICAgICAweDI5QzIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9RMzVfSEIgICAgICAgICAgMHgyOUIwCkBAIC01MCwyMCArNTAsMjAgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9CNDNfSUcgICAgICAgICAgMHgyRTQyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfR000NV9IQiAgICAgICAgIDB4MkE0MAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0dNNDVfSUcgICAgICAgICAweDJBNDIKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JR0RfRV9IQiAgICAgICAgMHgyRTAwCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUdEX0VfSUcgICAgICAgIDB4MkUwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0VBR0xFTEFLRV9IQiAgICAgICAgMHgyRTAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfRUFHTEVMQUtFX0lHICAgICAgICAweDJFMDIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9RNDVfSEIgICAgICAgICAgMHgyRTEwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfUTQ1X0lHICAgICAgICAgIDB4MkUxMgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0c0NV9IQiAgICAgICAgICAweDJFMjAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9HNDVfSUcgICAgICAgICAgMHgyRTIyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfRzQxX0hCICAgICAgICAgIDB4MkUzMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0c0MV9JRyAgICAgICAgICAweDJFMzIKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JR0ROR19EX0hCCSAgICAweDAwNDAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JR0ROR19EX0lHCSAgICAweDAwNDIKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JR0ROR19NX0hCCSAgICAweDAwNDQKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JR0ROR19NQV9IQgkgICAgMHgwMDYyCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUdETkdfTUMyX0hCICAgIDB4MDA2YQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lHRE5HX01fSUcJICAgIDB4MDA0NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lST05MQUtFX0RfSEIJICAgIDB4MDA0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lST05MQUtFX0RfSUcJICAgIDB4MDA0MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lST05MQUtFX01fSEIJICAgIDB4MDA0NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lST05MQUtFX01BX0hCCSAgICAweDAwNjIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JUk9OTEFLRV9NQzJfSEIgICAgMHgwMDZhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSVJPTkxBS0VfTV9JRwkgICAgMHgwMDQ2CiAKIC8qIGNvdmVyIDkxNSBhbmQgOTQ1IHZhcmlhbnRzICovCiAjZGVmaW5lIElTX0k5MTUgKGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfRTcyMjFfSEIgfHwgXApAQCAtODMsMjIgKzgzLDIyIEBACiAjZGVmaW5lIElTX0czMyAoYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9HMzNfSEIgfHwgXAogCQlhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX1EzNV9IQiB8fCBcCiAJCWFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfUTMzX0hCIHx8IFwKLQkJYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9JR0RHTV9IQiB8fCBcCi0JCWFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfSUdER19IQikKKwkJYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9QSU5FVklFV19NX0hCIHx8IFwKKwkJYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9QSU5FVklFV19IQikKIAotI2RlZmluZSBJU19JR0QgKGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfSUdER01fSEIgfHwgXAotCQlhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lHREdfSEIpCisjZGVmaW5lIElTX1BJTkVWSUVXIChhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX1BJTkVWSUVXX01fSEIgfHwgXAorCQlhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX1BJTkVWSUVXX0hCKQogCi0jZGVmaW5lIElTX0c0WCAoYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9JR0RfRV9IQiB8fCBcCisjZGVmaW5lIElTX0c0WCAoYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9FQUdMRUxBS0VfSEIgfHwgXAogCQlhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX1E0NV9IQiB8fCBcCiAJCWFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfRzQ1X0hCIHx8IFwKIAkJYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9HTTQ1X0hCIHx8IFwKIAkJYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9HNDFfSEIgfHwgXAogCQlhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX0I0M19IQiB8fCBcCi0JCWFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfSUdETkdfRF9IQiB8fCBcCi0JCWFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfSUdETkdfTV9IQiB8fCBcCi0JCWFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfSUdETkdfTUFfSEIgfHwgXAotCQlhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lHRE5HX01DMl9IQikKKwkJYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9JUk9OTEFLRV9EX0hCIHx8IFwKKwkJYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9JUk9OTEFLRV9NX0hCIHx8IFwKKwkJYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9JUk9OTEFLRV9NQV9IQiB8fCBcCisJCWFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfSVJPTkxBS0VfTUMyX0hCKQogCiBleHRlcm4gaW50IGFncF9tZW1vcnlfcmVzZXJ2ZWQ7CiAKQEAgLTE3OCw2ICsxNzgsNyBAQAogCSAqIHBvcHVwIGFuZCBmb3IgdGhlIEdUVC4KIAkgKi8KIAlpbnQgZ3R0X2VudHJpZXM7CQkJLyogaTgzMCsgKi8KKwlpbnQgZ3R0X3RvdGFsX3NpemU7CiAJdW5pb24gewogCQl2b2lkIF9faW9tZW0gKmk5eHhfZmx1c2hfcGFnZTsKIAkJdm9pZCAqaTh4eF9mbHVzaF9wYWdlOwpAQCAtNjUzLDcgKzY1NCw3IEBACiAJCQlzaXplID0gNTEyOwogCQl9CiAJCXNpemUgKz0gNDsgLyogYWRkIGluIEJJT1MgcG9wdXAgc3BhY2UgKi8KLQl9IGVsc2UgaWYgKElTX0czMyAmJiAhSVNfSUdEKSB7CisJfSBlbHNlIGlmIChJU19HMzMgJiYgIUlTX1BJTkVWSUVXKSB7CiAJLyogRzMzJ3MgR1RUIHNpemUgZGVmaW5lZCBpbiBnbWNoX2N0cmwgKi8KIAkJc3dpdGNoIChnbWNoX2N0cmwgJiBHMzNfUEdFVEJMX1NJWkVfTUFTSykgewogCQljYXNlIEczM19QR0VUQkxfU0laRV8xTToKQEAgLTY2OSw3ICs2NzAsNyBAQAogCQkJc2l6ZSA9IDUxMjsKIAkJfQogCQlzaXplICs9IDQ7Ci0JfSBlbHNlIGlmIChJU19HNFggfHwgSVNfSUdEKSB7CisJfSBlbHNlIGlmIChJU19HNFggfHwgSVNfUElORVZJRVcpIHsKIAkJLyogT24gNCBzZXJpZXMgaGFyZHdhcmUsIEdUVCBzdG9sZW4gaXMgc2VwYXJhdGUgZnJvbSBncmFwaGljcwogCQkgKiBzdG9sZW4sIGlnbm9yZSBpdCBpbiBzdG9sZW4gZ3R0IGVudHJpZXMgY291bnRpbmcuICBIb3dldmVyLAogCQkgKiA0S0Igb2YgdGhlIHN0b2xlbiBtZW1vcnkgZG9lc24ndCBnZXQgbWFwcGVkIHRvIHRoZSBHVFQuCkBAIC0xMTUzLDcgKzExNTQsNyBAQAogCXJlYWRsKGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUEdFVEJMX0NUTCk7CS8qIFBDSSBQb3N0aW5nLiAqLwogCiAJaWYgKGFncF9icmlkZ2UtPmRyaXZlci0+bmVlZHNfc2NyYXRjaF9wYWdlKSB7Ci0JCWZvciAoaSA9IGludGVsX3ByaXZhdGUuZ3R0X2VudHJpZXM7IGkgPCBjdXJyZW50X3NpemUtPm51bV9lbnRyaWVzOyBpKyspIHsKKwkJZm9yIChpID0gaW50ZWxfcHJpdmF0ZS5ndHRfZW50cmllczsgaSA8IGludGVsX3ByaXZhdGUuZ3R0X3RvdGFsX3NpemU7IGkrKykgewogCQkJd3JpdGVsKGFncF9icmlkZ2UtPnNjcmF0Y2hfcGFnZSwgaW50ZWxfcHJpdmF0ZS5ndHQraSk7CiAJCX0KIAkJcmVhZGwoaW50ZWxfcHJpdmF0ZS5ndHQraS0xKTsJLyogUENJIFBvc3RpbmcuICovCkBAIC0xMzA4LDYgKzEzMDksOCBAQAogCWlmICghaW50ZWxfcHJpdmF0ZS5ndHQpCiAJCXJldHVybiAtRU5PTUVNOwogCisJaW50ZWxfcHJpdmF0ZS5ndHRfdG90YWxfc2l6ZSA9IGd0dF9tYXBfc2l6ZSAvIDQ7CisKIAl0ZW1wICY9IDB4ZmZmODAwMDA7CiAKIAlpbnRlbF9wcml2YXRlLnJlZ2lzdGVycyA9IGlvcmVtYXAodGVtcCwgMTI4ICogNDA5Nik7CkBAIC0xMzUyLDE1ICsxMzU1LDE1IEBACiB7CiAJc3dpdGNoIChhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSkgewogCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9HTTQ1X0hCOgotCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JR0RfRV9IQjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfRUFHTEVMQUtFX0hCOgogCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9RNDVfSEI6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0c0NV9IQjoKIAljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfRzQxX0hCOgogCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9CNDNfSEI6Ci0JY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lHRE5HX0RfSEI6Ci0JY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lHRE5HX01fSEI6Ci0JY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lHRE5HX01BX0hCOgotCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JR0ROR19NQzJfSEI6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lST05MQUtFX0RfSEI6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lST05MQUtFX01fSEI6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lST05MQUtFX01BX0hCOgorCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JUk9OTEFLRV9NQzJfSEI6CiAJCSpndHRfb2Zmc2V0ID0gKmd0dF9zaXplID0gTUIoMik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xMzk1LDYgKzEzOTgsOCBAQAogCWlmICghaW50ZWxfcHJpdmF0ZS5ndHQpCiAJCXJldHVybiAtRU5PTUVNOwogCisJaW50ZWxfcHJpdmF0ZS5ndHRfdG90YWxfc2l6ZSA9IGd0dF9zaXplIC8gNDsKKwogCWludGVsX3ByaXZhdGUucmVnaXN0ZXJzID0gaW9yZW1hcCh0ZW1wLCAxMjggKiA0MDk2KTsKIAlpZiAoIWludGVsX3ByaXZhdGUucmVnaXN0ZXJzKSB7CiAJCWlvdW5tYXAoaW50ZWxfcHJpdmF0ZS5ndHQpOwpAQCAtMjM0MCwxNCArMjM0NSwxNCBAQAogCQlOVUxMLCAmaW50ZWxfZzMzX2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9RMzNfSEIsIFBDSV9ERVZJQ0VfSURfSU5URUxfUTMzX0lHLCAwLCAiUTMzIiwKIAkJTlVMTCwgJmludGVsX2czM19kcml2ZXIgfSwKLQl7IFBDSV9ERVZJQ0VfSURfSU5URUxfSUdER01fSEIsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUdER01fSUcsIDAsICJJR0QiLAorCXsgUENJX0RFVklDRV9JRF9JTlRFTF9QSU5FVklFV19NX0hCLCBQQ0lfREVWSUNFX0lEX0lOVEVMX1BJTkVWSUVXX01fSUcsIDAsICJQaW5ldmlldyIsCiAJCU5VTEwsICZpbnRlbF9nMzNfZHJpdmVyIH0sCi0JeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0lHREdfSEIsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUdER19JRywgMCwgIklHRCIsCisJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX1BJTkVWSUVXX0hCLCBQQ0lfREVWSUNFX0lEX0lOVEVMX1BJTkVWSUVXX0lHLCAwLCAiUGluZXZpZXciLAogCQlOVUxMLCAmaW50ZWxfZzMzX2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9HTTQ1X0hCLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0dNNDVfSUcsIDAsCi0JICAgICJNb2JpbGUgSW50ZWzCriBHTTQ1IEV4cHJlc3MiLCBOVUxMLCAmaW50ZWxfaTk2NV9kcml2ZXIgfSwKLQl7IFBDSV9ERVZJQ0VfSURfSU5URUxfSUdEX0VfSEIsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUdEX0VfSUcsIDAsCi0JICAgICJJbnRlbCBJbnRlZ3JhdGVkIEdyYXBoaWNzIERldmljZSIsIE5VTEwsICZpbnRlbF9pOTY1X2RyaXZlciB9LAorCSAgICAiR000NSIsIE5VTEwsICZpbnRlbF9pOTY1X2RyaXZlciB9LAorCXsgUENJX0RFVklDRV9JRF9JTlRFTF9FQUdMRUxBS0VfSEIsIFBDSV9ERVZJQ0VfSURfSU5URUxfRUFHTEVMQUtFX0lHLCAwLAorCSAgICAiRWFnbGVsYWtlIiwgTlVMTCwgJmludGVsX2k5NjVfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX1E0NV9IQiwgUENJX0RFVklDRV9JRF9JTlRFTF9RNDVfSUcsIDAsCiAJICAgICJRNDUvUTQzIiwgTlVMTCwgJmludGVsX2k5NjVfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0c0NV9IQiwgUENJX0RFVklDRV9JRF9JTlRFTF9HNDVfSUcsIDAsCkBAIC0yMzU2LDE0ICsyMzYxLDE0IEBACiAJICAgICJCNDMiLCBOVUxMLCAmaW50ZWxfaTk2NV9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfRzQxX0hCLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0c0MV9JRywgMCwKIAkgICAgIkc0MSIsIE5VTEwsICZpbnRlbF9pOTY1X2RyaXZlciB9LAotCXsgUENJX0RFVklDRV9JRF9JTlRFTF9JR0ROR19EX0hCLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lHRE5HX0RfSUcsIDAsCi0JICAgICJJR0RORy9EIiwgTlVMTCwgJmludGVsX2k5NjVfZHJpdmVyIH0sCi0JeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0lHRE5HX01fSEIsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUdETkdfTV9JRywgMCwKLQkgICAgIklHRE5HL00iLCBOVUxMLCAmaW50ZWxfaTk2NV9kcml2ZXIgfSwKLQl7IFBDSV9ERVZJQ0VfSURfSU5URUxfSUdETkdfTUFfSEIsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUdETkdfTV9JRywgMCwKLQkgICAgIklHRE5HL01BIiwgTlVMTCwgJmludGVsX2k5NjVfZHJpdmVyIH0sCi0JeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0lHRE5HX01DMl9IQiwgUENJX0RFVklDRV9JRF9JTlRFTF9JR0ROR19NX0lHLCAwLAotCSAgICAiSUdETkcvTUMyIiwgTlVMTCwgJmludGVsX2k5NjVfZHJpdmVyIH0sCisJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0lST05MQUtFX0RfSEIsIFBDSV9ERVZJQ0VfSURfSU5URUxfSVJPTkxBS0VfRF9JRywgMCwKKwkgICAgIklyb25sYWtlL0QiLCBOVUxMLCAmaW50ZWxfaTk2NV9kcml2ZXIgfSwKKwl7IFBDSV9ERVZJQ0VfSURfSU5URUxfSVJPTkxBS0VfTV9IQiwgUENJX0RFVklDRV9JRF9JTlRFTF9JUk9OTEFLRV9NX0lHLCAwLAorCSAgICAiSXJvbmxha2UvTSIsIE5VTEwsICZpbnRlbF9pOTY1X2RyaXZlciB9LAorCXsgUENJX0RFVklDRV9JRF9JTlRFTF9JUk9OTEFLRV9NQV9IQiwgUENJX0RFVklDRV9JRF9JTlRFTF9JUk9OTEFLRV9NX0lHLCAwLAorCSAgICAiSXJvbmxha2UvTUEiLCBOVUxMLCAmaW50ZWxfaTk2NV9kcml2ZXIgfSwKKwl7IFBDSV9ERVZJQ0VfSURfSU5URUxfSVJPTkxBS0VfTUMyX0hCLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lST05MQUtFX01fSUcsIDAsCisJICAgICJJcm9ubGFrZS9NQzIiLCBOVUxMLCAmaW50ZWxfaTk2NV9kcml2ZXIgfSwKIAl7IDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfQogfTsKIApAQCAtMjU0NSw4ICsyNTUwLDggQEAKIAlJRChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTQ1R19IQiksCiAJSUQoUENJX0RFVklDRV9JRF9JTlRFTF84Mjk0NUdNX0hCKSwKIAlJRChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTQ1R01FX0hCKSwKLQlJRChQQ0lfREVWSUNFX0lEX0lOVEVMX0lHREdNX0hCKSwKLQlJRChQQ0lfREVWSUNFX0lEX0lOVEVMX0lHREdfSEIpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfUElORVZJRVdfTV9IQiksCisJSUQoUENJX0RFVklDRV9JRF9JTlRFTF9QSU5FVklFV19IQiksCiAJSUQoUENJX0RFVklDRV9JRF9JTlRFTF84Mjk0NkdaX0hCKSwKIAlJRChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyRzM1X0hCKSwKIAlJRChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTY1UV9IQiksCkBAIC0yNTU3LDE1ICsyNTYyLDE1IEBACiAJSUQoUENJX0RFVklDRV9JRF9JTlRFTF9RMzVfSEIpLAogCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfUTMzX0hCKSwKIAlJRChQQ0lfREVWSUNFX0lEX0lOVEVMX0dNNDVfSEIpLAotCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfSUdEX0VfSEIpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfRUFHTEVMQUtFX0hCKSwKIAlJRChQQ0lfREVWSUNFX0lEX0lOVEVMX1E0NV9IQiksCiAJSUQoUENJX0RFVklDRV9JRF9JTlRFTF9HNDVfSEIpLAogCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfRzQxX0hCKSwKIAlJRChQQ0lfREVWSUNFX0lEX0lOVEVMX0I0M19IQiksCi0JSUQoUENJX0RFVklDRV9JRF9JTlRFTF9JR0ROR19EX0hCKSwKLQlJRChQQ0lfREVWSUNFX0lEX0lOVEVMX0lHRE5HX01fSEIpLAotCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfSUdETkdfTUFfSEIpLAotCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfSUdETkdfTUMyX0hCKSwKKwlJRChQQ0lfREVWSUNFX0lEX0lOVEVMX0lST05MQUtFX0RfSEIpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfSVJPTkxBS0VfTV9IQiksCisJSUQoUENJX0RFVklDRV9JRF9JTlRFTF9JUk9OTEFLRV9NQV9IQiksCisJSUQoUENJX0RFVklDRV9JRF9JTlRFTF9JUk9OTEFLRV9NQzJfSEIpLAogCXsgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2JmaW5fanRhZ19jb21tLmMgYi9kcml2ZXJzL2NoYXIvYmZpbl9qdGFnX2NvbW0uYwppbmRleCAxZDdjMzRjLi4yNjI4Yzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYmZpbl9qdGFnX2NvbW0uYworKysgYi9kcml2ZXJzL2NoYXIvYmZpbl9qdGFnX2NvbW0uYwpAQCAtMjI2LDcgKzIyNiw3IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIGJmaW5famNfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBiZmluX2pjX29wcyA9IHsKIAkub3BlbiAgICAgICAgICAgID0gYmZpbl9qY19vcGVuLAogCS5jbG9zZSAgICAgICAgICAgPSBiZmluX2pjX2Nsb3NlLAogCS53cml0ZSAgICAgICAgICAgPSBiZmluX2pjX3dyaXRlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2VwY2EuYyBiL2RyaXZlcnMvY2hhci9lcGNhLmMKaW5kZXggZGRlNTEzNC4uMTdiMDQ0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2VwY2EuYworKysgYi9kcml2ZXJzL2NoYXIvZXBjYS5jCkBAIC05MzUsNyArOTM1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBpbmZvX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgaW5mb19vcHMgPSB7CiAJLm9wZW4gPSBpbmZvX29wZW4sCiAJLmlvY3RsID0gaW5mb19pb2N0bCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZXNwLmMgYi9kcml2ZXJzL2NoYXIvZXNwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOWQ0M2MuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2VzcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUzMyArMCwwIEBACi0vKgotICogIGVzcC5jIC0gZHJpdmVyIGZvciBIYXllcyBFU1Agc2VyaWFsIGNhcmRzCi0gKgotICogIC0tLSBOb3RpY2VzIGZyb20gc2VyaWFsLmMsIHVwb24gd2hpY2ggdGhpcyBkcml2ZXIgaXMgYmFzZWQgLS0tCi0gKgotICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKLSAqCi0gKiAgRXh0ZW5zaXZlbHkgcmV3cml0dGVuIGJ5IFRoZW9kb3JlIFRzJ28sIDgvMTYvOTIgLS0gOS8xNC85Mi4gIE5vdwotICogIG11Y2ggbW9yZSBleHRlbnNpYmxlIHRvIHN1cHBvcnQgb3RoZXIgc2VyaWFsIGNhcmRzIGJhc2VkIG9uIHRoZQotICogIDE2NDUwLzE2NTUwQSBVQVJUJ3MuICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgQVNUIEZvdXJQb3J0IGFuZCB0aGUKLSAqICBBY2NlbnQgQXN5bmMgYm9hcmQuCi0gKgotICogIHNldF9zZXJpYWxfaW5mbyBmaXhlZCB0byBzZXQgdGhlIGZsYWdzLCBjdXN0b20gZGl2aXNvciwgYW5kIHVhcnQKLSAqIAl0eXBlIGZpZWxkcy4gIEZpeCBzdWdnZXN0ZWQgYnkgTWljaGFlbCBLLiBKb2huc29uIDEyLzEyLzkyLgotICoKLSAqICAxMS85NTogVElPQ01JV0FJVCwgVElPQ0dJQ09VTlQgYnkgQW5nZWxvIEhhcml0c2lzIDxhaEBkb2MuaWMuYWMudWs+Ci0gKgotICogIDAzLzk2OiBNb2R1bGFyaXNlZCBieSBBbmdlbG8gSGFyaXRzaXMgPGFoQGRvYy5pYy5hYy51az4KLSAqCi0gKiAgcnNfc2V0X3Rlcm1pb3MgZml4ZWQgdG8gbG9vayBhbHNvIGZvciBjaGFuZ2VzIG9mIHRoZSBpbnB1dAotICogICAgICBmbGFncyBJTlBDSywgQlJLSU5ULCBQQVJNUkssIElHTlBBUiBhbmQgSUdOQlJLLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlcm5kIEFuaMOkdXBsIDA1LzE3Lzk2LgotICoKLSAqIC0tLSBFbmQgb2Ygbm90aWNlcyBmcm9tIHNlcmlhbC5jIC0tLQotICoKLSAqIFN1cHBvcnQgZm9yIHRoZSBFU1Agc2VyaWFsIGNhcmQgYnkgQW5kcmV3IEouIFJvYmluc29uCi0gKiAgICAgPGFyb2JpbnNvQG55eC5uZXQ+IChDYXJkIGRldGVjdGlvbiByb3V0aW5lIHRha2VuIGZyb20gYSBwYXRjaAotICogICAgIGJ5IERlbm5pcyBKLiBCb3lsYW4pLiAgUGF0Y2hlcyB0byBhbGxvdyB1c2Ugd2l0aCAyLjEueCBjb250cmlidXRlZAotICogICAgIGJ5IENocmlzIEZheWxvci4KLSAqCi0gKiBNb3N0IHJlY2VudCBjaGFuZ2VzOiAoQW5kcmV3IEouIFJvYmluc29uKQotICogICBTdXBwb3J0IGZvciBQSU8gbW9kZS4gIFRoaXMgYWxsb3dzIHRoZSBkcml2ZXIgdG8gd29yayBwcm9wZXJseSB3aXRoCi0gKiAgICAgbXVsdGlwb3J0IGNhcmRzLgotICoKLSAqIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiAtCi0gKiBzZXZlcmFsIGNsZWFudXBzLCB1c2UgbW9kdWxlX2luaXQvbW9kdWxlX2V4aXQsIGV0YwotICoKLSAqIFRoaXMgbW9kdWxlIGV4cG9ydHMgdGhlIGZvbGxvd2luZyByczIzMiBpbyBmdW5jdGlvbnM6Ci0gKgotICoJaW50IGVzcHNlcmlhbF9pbml0KHZvaWQpOwotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxQLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgotI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2hheWVzZXNwLmg+Ci0KLSNkZWZpbmUgTlJfUE9SVFMgNjQJLyogbWF4aW11bSBudW1iZXIgb2YgcG9ydHMgKi8KLSNkZWZpbmUgTlJfUFJJTUFSWSA4CS8qIG1heGltdW0gbnVtYmVyIG9mIHByaW1hcnkgcG9ydHMgKi8KLSNkZWZpbmUgUkVHSU9OX1NJWkUgOCAgIC8qIHNpemUgb2YgaW8gcmVnaW9uIHRvIHJlcXVlc3QgKi8KLQotLyogVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgY2FuIGJlIHNldCBieSBnaXZpbmcgbW9kdWxlIG9wdGlvbnMgKi8KLXN0YXRpYyBpbnQgaXJxW05SX1BSSU1BUlldOwkvKiBJUlEgZm9yIGVhY2ggYmFzZSBwb3J0ICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGRpdmlzb3JbTlJfUFJJTUFSWV07IC8qIGN1c3RvbSBkaXZpc29yIGZvciBlYWNoIHBvcnQgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZG1hID0gRVNQX0RNQV9DSEFOTkVMOyAvKiBETUEgY2hhbm5lbCAqLwotc3RhdGljIHVuc2lnbmVkIGludCByeF90cmlnZ2VyID0gRVNQX1JYX1RSSUdHRVI7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHR4X3RyaWdnZXIgPSBFU1BfVFhfVFJJR0dFUjsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZmxvd19vZmYgPSBFU1BfRkxPV19PRkY7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGZsb3dfb24gPSBFU1BfRkxPV19PTjsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcnhfdGltZW91dCA9IEVTUF9SWF9UTU9VVDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGlvX3RocmVzaG9sZCA9IEVTUF9QSU9fVEhSRVNIT0xEOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLW1vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Ci1tb2R1bGVfcGFyYW1fYXJyYXkoZGl2aXNvciwgdWludCwgTlVMTCwgMCk7Ci1tb2R1bGVfcGFyYW0oZG1hLCB1aW50LCAwKTsKLW1vZHVsZV9wYXJhbShyeF90cmlnZ2VyLCB1aW50LCAwKTsKLW1vZHVsZV9wYXJhbSh0eF90cmlnZ2VyLCB1aW50LCAwKTsKLW1vZHVsZV9wYXJhbShmbG93X29mZiwgdWludCwgMCk7Ci1tb2R1bGVfcGFyYW0oZmxvd19vbiwgdWludCwgMCk7Ci1tb2R1bGVfcGFyYW0ocnhfdGltZW91dCwgdWludCwgMCk7Ci1tb2R1bGVfcGFyYW0ocGlvX3RocmVzaG9sZCwgdWludCwgMCk7Ci0KLS8qIEVORCAqLwotCi1zdGF0aWMgY2hhciAqZG1hX2J1ZmZlcjsKLXN0YXRpYyBpbnQgZG1hX2J5dGVzOwotc3RhdGljIHN0cnVjdCBlc3BfcGlvX2J1ZmZlciAqZnJlZV9waW9fYnVmOwotCi0jZGVmaW5lIERNQV9CVUZGRVJfU1ogMTAyNAotCi0jZGVmaW5lIFdBS0VVUF9DSEFSUyAxMDI0Ci0KLXN0YXRpYyBjaGFyIHNlcmlhbF9uYW1lW10gX19pbml0ZGF0YSA9ICJFU1Agc2VyaWFsIGRyaXZlciI7Ci1zdGF0aWMgY2hhciBzZXJpYWxfdmVyc2lvbltdIF9faW5pdGRhdGEgPSAiMi4yIjsKLQotc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICplc3BfZHJpdmVyOwotCi0vKgotICogU2VyaWFsIGRyaXZlciBjb25maWd1cmF0aW9uIHNlY3Rpb24uICBIZXJlIGFyZSB0aGUgdmFyaW91cyBvcHRpb25zOgotICoKLSAqIFNFUklBTF9QQVJBTk9JQV9DSEVDSwotICogCQlDaGVjayB0aGUgbWFnaWMgbnVtYmVyIGZvciB0aGUgZXNwX3N0cnVjdHVyZSB3aGVyZQotICogCQlldmVyIHBvc3NpYmxlLgotICovCi0KLSN1bmRlZiBTRVJJQUxfUEFSQU5PSUFfQ0hFQ0sKLSNkZWZpbmUgU0VSSUFMX0RPX1JFU1RBUlQKLQotI3VuZGVmIFNFUklBTF9ERUJVR19JTlRSCi0jdW5kZWYgU0VSSUFMX0RFQlVHX09QRU4KLSN1bmRlZiBTRVJJQUxfREVCVUdfRkxPVwotCi0jaWYgZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoU0VSSUFMX0RFQlVHX01DT1VOVCkKLSNkZWZpbmUgREJHX0NOVChzKSBwcmludGsoS0VSTl9ERUJVRyAiKCVzKTogWyV4XSByZWZjPSVkLCBzZXJjPSVkLCB0dHljPSVkIC0+ICVzXG4iLCBcCi0JCQkJdHR5LT5uYW1lLCBpbmZvLT5wb3J0LmZsYWdzLCBcCi0JCQkJc2VyaWFsX2RyaXZlci5yZWZjb3VudCwgXAotCQkJCWluZm8tPnBvcnQuY291bnQsIHR0eS0+Y291bnQsIHMpCi0jZWxzZQotI2RlZmluZSBEQkdfQ05UKHMpCi0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBlc3Bfc3RydWN0ICpwb3J0czsKLQotc3RhdGljIHZvaWQgY2hhbmdlX3NwZWVkKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvKTsKLXN0YXRpYyB2b2lkIHJzX3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBpbnQpOwotCi0vKgotICogVGhlIEVTUCBjYXJkIGhhcyBhIGNsb2NrIHJhdGUgb2YgMTQuNzQ1NiBNSHogKHRoYXQgaXMsIDIqKkVTUENfU0NBTEUKLSAqIHRpbWVzIHRoZSBub3JtYWwgMS44NDMyIE1oeiBjbG9jayBvZiBtb3N0IHNlcmlhbCBib2FyZHMpLgotICovCi0jZGVmaW5lIEJBU0VfQkFVRCAoKDE4NDMyMDAgLyAxNikgKiAoMSA8PCBFU1BDX1NDQUxFKSkKLQotLyogU3RhbmRhcmQgQ09NIGZsYWdzIChleGNlcHQgZm9yIENPTTQsIGJlY2F1c2Ugb2YgdGhlIDg1MTQgcHJvYmxlbSkgKi8KLSNkZWZpbmUgU1REX0NPTV9GTEFHUyAoQVNZTkNfQk9PVF9BVVRPQ09ORiB8IEFTWU5DX1NLSVBfVEVTVCkKLQotc3RhdGljIGlubGluZSBpbnQgc2VyaWFsX3BhcmFub2lhX2NoZWNrKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLAotCQkJCQljaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQotewotI2lmZGVmIFNFUklBTF9QQVJBTk9JQV9DSEVDSwotCXN0YXRpYyBjb25zdCBjaGFyIGJhZG1hZ2ljW10gPSBLRVJOX1dBUk5JTkcKLQkJIldhcm5pbmc6IGJhZCBtYWdpYyBudW1iZXIgZm9yIHNlcmlhbCBzdHJ1Y3QgKCVzKSBpbiAlc1xuIjsKLQlzdGF0aWMgY29uc3QgY2hhciBiYWRpbmZvW10gPSBLRVJOX1dBUk5JTkcKLQkJIldhcm5pbmc6IG51bGwgZXNwX3N0cnVjdCBmb3IgKCVzKSBpbiAlc1xuIjsKLQotCWlmICghaW5mbykgewotCQlwcmludGsoYmFkaW5mbywgbmFtZSwgcm91dGluZSk7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoaW5mby0+bWFnaWMgIT0gRVNQX01BR0lDKSB7Ci0JCXByaW50ayhiYWRtYWdpYywgbmFtZSwgcm91dGluZSk7Ci0JCXJldHVybiAxOwotCX0KLSNlbmRpZgotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzZXJpYWxfaW4oc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8sIGludCBvZmZzZXQpCi17Ci0JcmV0dXJuIGluYihpbmZvLT5pb19wb3J0ICsgb2Zmc2V0KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNlcmlhbF9vdXQoc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8sIGludCBvZmZzZXQsCi0JCQkgICAgICB1bnNpZ25lZCBjaGFyIHZhbHVlKQotewotCW91dGIodmFsdWUsIGluZm8tPmlvX3BvcnQrb2Zmc2V0KTsKLX0KLQotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogcnNfc3RvcCgpIGFuZCByc19zdGFydCgpCi0gKgotICogVGhpcyByb3V0aW5lcyBhcmUgY2FsbGVkIGJlZm9yZSBzZXR0aW5nIG9yIHJlc2V0dGluZyB0dHktPnN0b3BwZWQuCi0gKiBUaGV5IGVuYWJsZSBvciBkaXNhYmxlIHRyYW5zbWl0dGVyIGludGVycnVwdHMsIGFzIG5lY2Vzc2FyeS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi1zdGF0aWMgdm9pZCByc19zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3N0b3AiKSkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlpZiAoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkgewotCQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCByc19zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19zdGFydCIpKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCWlmIChpbmZvLT54bWl0X2NudCAmJiBpbmZvLT54bWl0X2J1ZiAmJiAhKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpKSB7Ci0JCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfU1JWX01BU0spOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPklFUik7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLX0KLQotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBIZXJlIHN0YXJ0cyB0aGUgaW50ZXJydXB0IGhhbmRsaW5nIHJvdXRpbmVzLiAgQWxsIG9mIHRoZSBmb2xsb3dpbmcKLSAqIHN1YnJvdXRpbmVzIGFyZSBkZWNsYXJlZCBhcyBpbmxpbmUgYW5kIGFyZSBmb2xkZWQgaW50bwotICogcnNfaW50ZXJydXB0KCkuICBUaGV5IHdlcmUgc2VwYXJhdGVkIG91dCBmb3IgcmVhZGFiaWxpdHkncyBzYWtlLgotICoKLSAqIE5vdGU6IHJzX2ludGVycnVwdCgpIGlzIGEgImZhc3QiIGludGVycnVwdCwgd2hpY2ggbWVhbnMgdGhhdCBpdAotICogcnVucyB3aXRoIGludGVycnVwdHMgdHVybmVkIG9mZi4gIFBlb3BsZSB3aG8gbWF5IHdhbnQgdG8gbW9kaWZ5Ci0gKiByc19pbnRlcnJ1cHQoKSBzaG91bGQgdHJ5IHRvIGtlZXAgdGhlIGludGVycnVwdCBoYW5kbGVyIGFzIGZhc3QgYXMKLSAqIHBvc3NpYmxlLiAgQWZ0ZXIgeW91IGFyZSBkb25lIG1ha2luZyBtb2RpZmljYXRpb25zLCBpdCBpcyBub3QgYSBiYWQKLSAqIGlkZWEgdG8gZG86Ci0gKgotICogZ2NjIC1TIC1ES0VSTkVMIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIHNlcmlhbC5jCi0gKgotICogYW5kIGxvb2sgYXQgdGhlIHJlc3VsdGluZyBhc3NlbWJsZSBjb2RlIGluIHNlcmlhbC5zLgotICoKLSAqIAkJCQktIFRlZCBUcydvICh0eXRzb0BtaXQuZWR1KSwgNy1NYXItOTMKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotc3RhdGljIERFRklORV9TUElOTE9DSyhwaW9fbG9jayk7Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGVzcF9waW9fYnVmZmVyICpnZXRfcGlvX2J1ZmZlcih2b2lkKQotewotCXN0cnVjdCBlc3BfcGlvX2J1ZmZlciAqYnVmOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGlvX2xvY2ssIGZsYWdzKTsKLQlpZiAoZnJlZV9waW9fYnVmKSB7Ci0JCWJ1ZiA9IGZyZWVfcGlvX2J1ZjsKLQkJZnJlZV9waW9fYnVmID0gYnVmLT5uZXh0OwotCX0gZWxzZSB7Ci0JCWJ1ZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlc3BfcGlvX2J1ZmZlciksIEdGUF9BVE9NSUMpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaW9fbG9jaywgZmxhZ3MpOwotCXJldHVybiBidWY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByZWxlYXNlX3Bpb19idWZmZXIoc3RydWN0IGVzcF9waW9fYnVmZmVyICpidWYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGlvX2xvY2ssIGZsYWdzKTsKLQlidWYtPm5leHQgPSBmcmVlX3Bpb19idWY7Ci0JZnJlZV9waW9fYnVmID0gYnVmOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBpb19sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByZWNlaXZlX2NoYXJzX3BpbyhzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywgaW50IG51bV9ieXRlcykKLXsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaW5mby0+cG9ydC50dHk7Ci0JaW50IGk7Ci0Jc3RydWN0IGVzcF9waW9fYnVmZmVyICpwaW9fYnVmOwotCXN0cnVjdCBlc3BfcGlvX2J1ZmZlciAqZXJyX2J1ZjsKLQl1bnNpZ25lZCBjaGFyIHN0YXR1c19tYXNrOwotCi0JcGlvX2J1ZiA9IGdldF9waW9fYnVmZmVyKCk7Ci0KLQlpZiAoIXBpb19idWYpCi0JCXJldHVybjsKLQotCWVycl9idWYgPSBnZXRfcGlvX2J1ZmZlcigpOwotCi0JaWYgKCFlcnJfYnVmKSB7Ci0JCXJlbGVhc2VfcGlvX2J1ZmZlcihwaW9fYnVmKTsKLQkJcmV0dXJuOwotCX0KLQotCXN0YXR1c19tYXNrID0gKGluZm8tPnJlYWRfc3RhdHVzX21hc2sgPj4gMikgJiAweDA3OwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9ieXRlcyAtIDE7IGkgKz0gMikgewotCQkqKCh1bnNpZ25lZCBzaG9ydCAqKShwaW9fYnVmLT5kYXRhICsgaSkpID0KLQkJCWludyhpbmZvLT5pb19wb3J0ICsgVUFSVF9FU0lfUlgpOwotCQllcnJfYnVmLT5kYXRhW2ldID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1JXUyk7Ci0JCWVycl9idWYtPmRhdGFbaSArIDFdID0gKGVycl9idWYtPmRhdGFbaV0gPj4gMykgJiBzdGF0dXNfbWFzazsKLQkJZXJyX2J1Zi0+ZGF0YVtpXSAmPSBzdGF0dXNfbWFzazsKLQl9Ci0KLQlpZiAobnVtX2J5dGVzICYgMHgwMDAxKSB7Ci0JCXBpb19idWYtPmRhdGFbbnVtX2J5dGVzIC0gMV0gPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfUlgpOwotCQllcnJfYnVmLT5kYXRhW251bV9ieXRlcyAtIDFdID0KLQkJCShzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfUldTKSA+PiAzKSAmIHN0YXR1c19tYXNrOwotCX0KLQotCS8qIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHN0aWxsIG9rIHNpbmNlIGludGVycnVwdHMgd2VyZSBlbmFibGVkICovCi0JdHR5ID0gaW5mby0+cG9ydC50dHk7Ci0KLQlpZiAoIXR0eSkgewotCQlyZWxlYXNlX3Bpb19idWZmZXIocGlvX2J1Zik7Ci0JCXJlbGVhc2VfcGlvX2J1ZmZlcihlcnJfYnVmKTsKLQkJaW5mby0+c3RhdF9mbGFncyAmPSB+RVNQX1NUQVRfUlhfVElNRU9VVDsKLQkJcmV0dXJuOwotCX0KLQotCXN0YXR1c19tYXNrID0gKGluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayA+PiAyKSAmIDB4MDc7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2J5dGVzOyBpKyspIHsKLQkJaWYgKCEoZXJyX2J1Zi0+ZGF0YVtpXSAmIHN0YXR1c19tYXNrKSkgewotCQkJaW50IGZsYWcgPSAwOwotCi0JCQlpZiAoZXJyX2J1Zi0+ZGF0YVtpXSAmIDB4MDQpIHsKLQkJCQlmbGFnID0gVFRZX0JSRUFLOwotCQkJCWlmIChpbmZvLT5wb3J0LmZsYWdzICYgQVNZTkNfU0FLKQotCQkJCQlkb19TQUsodHR5KTsKLQkJCX0gZWxzZSBpZiAoZXJyX2J1Zi0+ZGF0YVtpXSAmIDB4MDIpCi0JCQkJZmxhZyA9IFRUWV9GUkFNRTsKLQkJCWVsc2UgaWYgKGVycl9idWYtPmRhdGFbaV0gJiAweDAxKQotCQkJCWZsYWcgPSBUVFlfUEFSSVRZOwotCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBwaW9fYnVmLT5kYXRhW2ldLCBmbGFnKTsKLQkJfQotCX0KLQotCXR0eV9zY2hlZHVsZV9mbGlwKHR0eSk7Ci0KLQlpbmZvLT5zdGF0X2ZsYWdzICY9IH5FU1BfU1RBVF9SWF9USU1FT1VUOwotCXJlbGVhc2VfcGlvX2J1ZmZlcihwaW9fYnVmKTsKLQlyZWxlYXNlX3Bpb19idWZmZXIoZXJyX2J1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkIHByb2dyYW1faXNhX2RtYShpbnQgZG1hLCBpbnQgZGlyLCB1bnNpZ25lZCBsb25nIGFkZHIsIGludCBsZW4pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKLQlkaXNhYmxlX2RtYShkbWEpOwotCWNsZWFyX2RtYV9mZihkbWEpOwotCXNldF9kbWFfbW9kZShkbWEsIGRpcik7Ci0Jc2V0X2RtYV9hZGRyKGRtYSwgYWRkcik7Ci0Jc2V0X2RtYV9jb3VudChkbWEsIGxlbik7Ci0JZW5hYmxlX2RtYShkbWEpOwotCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCByZWNlaXZlX2NoYXJzX2RtYShzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywgaW50IG51bV9ieXRlcykKLXsKLQlpbmZvLT5zdGF0X2ZsYWdzICY9IH5FU1BfU1RBVF9SWF9USU1FT1VUOwotCWRtYV9ieXRlcyA9IG51bV9ieXRlczsKLQlpbmZvLT5zdGF0X2ZsYWdzIHw9IEVTUF9TVEFUX0RNQV9SWDsKLQotCXByb2dyYW1faXNhX2RtYShkbWEsIERNQV9NT0RFX1JFQUQsIGlzYV92aXJ0X3RvX2J1cyhkbWFfYnVmZmVyKSwKLQkJCQkJCQkJZG1hX2J5dGVzKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TVEFSVF9ETUFfUlgpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVjZWl2ZV9jaGFyc19kbWFfZG9uZShzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywKLQkJCQkJICAgIGludCBzdGF0dXMpCi17Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnBvcnQudHR5OwotCWludCBudW1fYnl0ZXM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKLQlkaXNhYmxlX2RtYShkbWEpOwotCWNsZWFyX2RtYV9mZihkbWEpOwotCi0JaW5mby0+c3RhdF9mbGFncyAmPSB+RVNQX1NUQVRfRE1BX1JYOwotCW51bV9ieXRlcyA9IGRtYV9ieXRlcyAtIGdldF9kbWFfcmVzaWR1ZShkbWEpOwotCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOwotCi0JaW5mby0+aWNvdW50LnJ4ICs9IG51bV9ieXRlczsKLQotCWlmIChudW1fYnl0ZXMgPiAwKSB7Ci0JCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBkbWFfYnVmZmVyLCBudW1fYnl0ZXMgLSAxKTsKLQotCQlzdGF0dXMgJj0gKDB4MWMgJiBpbmZvLT5yZWFkX3N0YXR1c19tYXNrKTsKLQotCQkvKiBJcyB0aGUgc3RhdHVzIHNpZ25pZmljYW50IG9yIGRvIHdlIHRocm93IHRoZSBsYXN0IGJ5dGUgPyAqLwotCQlpZiAoIShzdGF0dXMgJiBpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2spKSB7Ci0JCQlpbnQgc3RhdGZsYWcgPSAwOwotCi0JCQlpZiAoc3RhdHVzICYgMHgxMCkgewotCQkJCXN0YXRmbGFnID0gVFRZX0JSRUFLOwotCQkJCShpbmZvLT5pY291bnQuYnJrKSsrOwotCQkJCWlmIChpbmZvLT5wb3J0LmZsYWdzICYgQVNZTkNfU0FLKQotCQkJCQlkb19TQUsodHR5KTsKLQkJCX0gZWxzZSBpZiAoc3RhdHVzICYgMHgwOCkgewotCQkJCXN0YXRmbGFnID0gVFRZX0ZSQU1FOwotCQkJCWluZm8tPmljb3VudC5mcmFtZSsrOwotCQkJfSBlbHNlIGlmIChzdGF0dXMgJiAweDA0KSB7Ci0JCQkJc3RhdGZsYWcgPSBUVFlfUEFSSVRZOwotCQkJCWluZm8tPmljb3VudC5wYXJpdHkrKzsKLQkJCX0KLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgZG1hX2J1ZmZlcltudW1fYnl0ZXMgLSAxXSwKLQkJCQkJCQkJc3RhdGZsYWcpOwotCQl9Ci0JCXR0eV9zY2hlZHVsZV9mbGlwKHR0eSk7Ci0JfQotCi0JaWYgKGRtYV9ieXRlcyAhPSBudW1fYnl0ZXMpIHsKLQkJbnVtX2J5dGVzID0gZG1hX2J5dGVzIC0gbnVtX2J5dGVzOwotCQlkbWFfYnl0ZXMgPSAwOwotCQlyZWNlaXZlX2NoYXJzX2RtYShpbmZvLCBudW1fYnl0ZXMpOwotCX0gZWxzZQotCQlkbWFfYnl0ZXMgPSAwOwotfQotCi0vKiBDYWxsZXIgbXVzdCBob2xkIGluZm8tPmxvY2sgKi8KLQotc3RhdGljIGlubGluZSB2b2lkIHRyYW5zbWl0X2NoYXJzX3BpbyhzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywKLQkJCQkJaW50IHNwYWNlX2F2YWlsKQotewotCWludCBpOwotCXN0cnVjdCBlc3BfcGlvX2J1ZmZlciAqcGlvX2J1ZjsKLQotCXBpb19idWYgPSBnZXRfcGlvX2J1ZmZlcigpOwotCi0JaWYgKCFwaW9fYnVmKQotCQlyZXR1cm47Ci0KLQl3aGlsZSAoc3BhY2VfYXZhaWwgJiYgaW5mby0+eG1pdF9jbnQpIHsKLQkJaWYgKGluZm8tPnhtaXRfdGFpbCArIHNwYWNlX2F2YWlsIDw9IEVTUF9YTUlUX1NJWkUpIHsKLQkJCW1lbWNweShwaW9fYnVmLT5kYXRhLAotCQkJICAgICAgICYoaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF90YWlsXSksCi0JCQkgICAgICAgc3BhY2VfYXZhaWwpOwotCQl9IGVsc2UgewotCQkJaSA9IEVTUF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X3RhaWw7Ci0JCQltZW1jcHkocGlvX2J1Zi0+ZGF0YSwKLQkJCSAgICAgICAmKGluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbF0pLCBpKTsKLQkJCW1lbWNweSgmKHBpb19idWYtPmRhdGFbaV0pLCBpbmZvLT54bWl0X2J1ZiwKLQkJCSAgICAgICBzcGFjZV9hdmFpbCAtIGkpOwotCQl9Ci0KLQkJaW5mby0+eG1pdF9jbnQgLT0gc3BhY2VfYXZhaWw7Ci0JCWluZm8tPnhtaXRfdGFpbCA9IChpbmZvLT54bWl0X3RhaWwgKyBzcGFjZV9hdmFpbCkgJgotCQkJKEVTUF9YTUlUX1NJWkUgLSAxKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgc3BhY2VfYXZhaWwgLSAxOyBpICs9IDIpIHsKLQkJCW91dHcoKigodW5zaWduZWQgc2hvcnQgKikocGlvX2J1Zi0+ZGF0YSArIGkpKSwKLQkJCSAgICAgaW5mby0+aW9fcG9ydCArIFVBUlRfRVNJX1RYKTsKLQkJfQotCi0JCWlmIChzcGFjZV9hdmFpbCAmIDB4MDAwMSkKLQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfVFgsCi0JCQkJICAgcGlvX2J1Zi0+ZGF0YVtzcGFjZV9hdmFpbCAtIDFdKTsKLQotCQlpZiAoaW5mby0+eG1pdF9jbnQpIHsKLQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX05PX0NPTU1BTkQpOwotCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1RYX0FWQUlMKTsKLQkJCXNwYWNlX2F2YWlsID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKSA8PCA4OwotCQkJc3BhY2VfYXZhaWwgfD0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKTsKLQotCQkJaWYgKHNwYWNlX2F2YWlsID4gaW5mby0+eG1pdF9jbnQpCi0JCQkJc3BhY2VfYXZhaWwgPSBpbmZvLT54bWl0X2NudDsKLQkJfQotCX0KLQotCWlmIChpbmZvLT54bWl0X2NudCA8IFdBS0VVUF9DSEFSUykgewotCQlpZiAoaW5mby0+cG9ydC50dHkpCi0JCQl0dHlfd2FrZXVwKGluZm8tPnBvcnQudHR5KTsKLQotI2lmZGVmIFNFUklBTF9ERUJVR19JTlRSCi0JCXByaW50aygiVEhSRS4uLiIpOwotI2VuZGlmCi0KLQkJaWYgKGluZm8tPnhtaXRfY250IDw9IDApIHsKLQkJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKLQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwKLQkJCQkgICBFU0lfU0VUX1NSVl9NQVNLKTsKLQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKLQkJfQotCX0KLQotCXJlbGVhc2VfcGlvX2J1ZmZlcihwaW9fYnVmKTsKLX0KLQotLyogQ2FsbGVyIG11c3QgaG9sZCBpbmZvLT5sb2NrICovCi1zdGF0aWMgaW5saW5lIHZvaWQgdHJhbnNtaXRfY2hhcnNfZG1hKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLCBpbnQgbnVtX2J5dGVzKQotewotCWRtYV9ieXRlcyA9IG51bV9ieXRlczsKLQotCWlmIChpbmZvLT54bWl0X3RhaWwgKyBkbWFfYnl0ZXMgPD0gRVNQX1hNSVRfU0laRSkgewotCQltZW1jcHkoZG1hX2J1ZmZlciwgJihpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X3RhaWxdKSwKLQkJICAgICAgIGRtYV9ieXRlcyk7Ci0JfSBlbHNlIHsKLQkJaW50IGkgPSBFU1BfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF90YWlsOwotCQltZW1jcHkoZG1hX2J1ZmZlciwgJihpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X3RhaWxdKSwKLQkJCWkpOwotCQltZW1jcHkoJihkbWFfYnVmZmVyW2ldKSwgaW5mby0+eG1pdF9idWYsIGRtYV9ieXRlcyAtIGkpOwotCX0KLQotCWluZm8tPnhtaXRfY250IC09IGRtYV9ieXRlczsKLQlpbmZvLT54bWl0X3RhaWwgPSAoaW5mby0+eG1pdF90YWlsICsgZG1hX2J5dGVzKSAmIChFU1BfWE1JVF9TSVpFIC0gMSk7Ci0KLQlpZiAoaW5mby0+eG1pdF9jbnQgPCBXQUtFVVBfQ0hBUlMpIHsKLQkJaWYgKGluZm8tPnBvcnQudHR5KQotCQkJdHR5X3dha2V1cChpbmZvLT5wb3J0LnR0eSk7Ci0KLSNpZmRlZiBTRVJJQUxfREVCVUdfSU5UUgotCQlwcmludGsoIlRIUkUuLi4iKTsKLSNlbmRpZgotCi0JCWlmIChpbmZvLT54bWl0X2NudCA8PSAwKSB7Ci0JCQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7Ci0JCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfU1JWX01BU0spOwotCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5JRVIpOwotCQl9Ci0JfQotCi0JaW5mby0+c3RhdF9mbGFncyB8PSBFU1BfU1RBVF9ETUFfVFg7Ci0KLQlwcm9ncmFtX2lzYV9kbWEoZG1hLCBETUFfTU9ERV9XUklURSwgaXNhX3ZpcnRfdG9fYnVzKGRtYV9idWZmZXIpLAotCQkJCQkJCQlkbWFfYnl0ZXMpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NUQVJUX0RNQV9UWCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc21pdF9jaGFyc19kbWFfZG9uZShzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbykKLXsKLQlpbnQgbnVtX2J5dGVzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7Ci0JZGlzYWJsZV9kbWEoZG1hKTsKLQljbGVhcl9kbWFfZmYoZG1hKTsKLQotCW51bV9ieXRlcyA9IGRtYV9ieXRlcyAtIGdldF9kbWFfcmVzaWR1ZShkbWEpOwotCWluZm8tPmljb3VudC50eCArPSBkbWFfYnl0ZXM7Ci0JcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7Ci0KLQlpZiAoZG1hX2J5dGVzICE9IG51bV9ieXRlcykgewotCQlkbWFfYnl0ZXMgLT0gbnVtX2J5dGVzOwotCQltZW1tb3ZlKGRtYV9idWZmZXIsIGRtYV9idWZmZXIgKyBudW1fYnl0ZXMsIGRtYV9ieXRlcyk7Ci0KLQkJcHJvZ3JhbV9pc2FfZG1hKGRtYSwgRE1BX01PREVfV1JJVEUsCi0JCQkJaXNhX3ZpcnRfdG9fYnVzKGRtYV9idWZmZXIpLCBkbWFfYnl0ZXMpOwotCi0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NUQVJUX0RNQV9UWCk7Ci0JfSBlbHNlIHsKLQkJZG1hX2J5dGVzID0gMDsKLQkJaW5mby0+c3RhdF9mbGFncyAmPSB+RVNQX1NUQVRfRE1BX1RYOwotCX0KLX0KLQotc3RhdGljIHZvaWQgY2hlY2tfbW9kZW1fc3RhdHVzKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvKQotewotCWludAlzdGF0dXM7Ci0KLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9HRVRfVUFSVF9TVEFUKTsKLQlzdGF0dXMgPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDIpOwotCi0JaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0FOWV9ERUxUQSkgewotCQkvKiB1cGRhdGUgaW5wdXQgbGluZSBjb3VudGVycyAqLwotCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfVEVSSSkKLQkJCWluZm8tPmljb3VudC5ybmcrKzsKLQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REU1IpCi0JCQlpbmZvLT5pY291bnQuZHNyKys7Ci0JCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERENEKQotCQkJaW5mby0+aWNvdW50LmRjZCsrOwotCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRENUUykKLQkJCWluZm8tPmljb3VudC5jdHMrKzsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5wb3J0LmRlbHRhX21zcl93YWl0KTsKLQl9Ci0KLQlpZiAoKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkgJiYgKHN0YXR1cyAmIFVBUlRfTVNSX0REQ0QpKSB7Ci0jaWYgKGRlZmluZWQoU0VSSUFMX0RFQlVHX09QRU4pIHx8IGRlZmluZWQoU0VSSUFMX0RFQlVHX0lOVFIpKQotCQlwcmludGsoInR0eXMlZCBDRCBub3cgJXMuLi4iLCBpbmZvLT5saW5lLAotCQkgICAgICAgKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCkgPyAib24iIDogIm9mZiIpOwotI2VuZGlmCi0JCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ0QpCi0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPnBvcnQub3Blbl93YWl0KTsKLQkJZWxzZSB7Ci0jaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KLQkJCXByaW50aygic2NoZWR1bGluZyBoYW5ndXAuLi4iKTsKLSNlbmRpZgotCQkJdHR5X2hhbmd1cChpbmZvLT5wb3J0LnR0eSk7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIHRoZSBzZXJpYWwgZHJpdmVyJ3MgaW50ZXJydXB0IHJvdXRpbmUKLSAqLwotc3RhdGljIGlycXJldHVybl90IHJzX2ludGVycnVwdF9zaW5nbGUoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvOwotCXVuc2lnbmVkIGVycl9zdGF0dXM7Ci0JdW5zaWduZWQgaW50IHNjcmF0Y2g7Ci0KLSNpZmRlZiBTRVJJQUxfREVCVUdfSU5UUgotCXByaW50aygicnNfaW50ZXJydXB0X3NpbmdsZSglZCkuLi4iLCBpcnEpOwotI2VuZGlmCi0JaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKWRldl9pZDsKLQllcnJfc3RhdHVzID0gMDsKLQlzY3JhdGNoID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NJRCk7Ci0KLQlzcGluX2xvY2soJmluZm8tPmxvY2spOwotCi0JaWYgKCFpbmZvLT5wb3J0LnR0eSkgewotCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0KLQlpZiAoc2NyYXRjaCAmIDB4MDQpIHsgLyogZXJyb3IgKi8KLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX0VSUl9TVEFUKTsKLQkJZXJyX3N0YXR1cyA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMSk7Ci0JCXNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMik7Ci0KLQkJaWYgKGVycl9zdGF0dXMgJiAweDAxKQotCQkJaW5mby0+c3RhdF9mbGFncyB8PSBFU1BfU1RBVF9SWF9USU1FT1VUOwotCi0JCWlmIChlcnJfc3RhdHVzICYgMHgyMCkgLyogVUFSVCBzdGF0dXMgKi8KLQkJCWNoZWNrX21vZGVtX3N0YXR1cyhpbmZvKTsKLQotCQlpZiAoZXJyX3N0YXR1cyAmIDB4ODApIC8qIFN0YXJ0IGJyZWFrICovCi0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmJyZWFrX3dhaXQpOwotCX0KLQotCWlmICgoc2NyYXRjaCAmIDB4ODgpIHx8IC8qIERNQSBjb21wbGV0ZWQgb3IgdGltZWQgb3V0ICovCi0JICAgIChlcnJfc3RhdHVzICYgMHgxYykgLyogcmVjZWl2ZSBlcnJvciAqLykgewotCQlpZiAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX0RNQV9SWCkKLQkJCXJlY2VpdmVfY2hhcnNfZG1hX2RvbmUoaW5mbywgZXJyX3N0YXR1cyk7Ci0JCWVsc2UgaWYgKGluZm8tPnN0YXRfZmxhZ3MgJiBFU1BfU1RBVF9ETUFfVFgpCi0JCQl0cmFuc21pdF9jaGFyc19kbWFfZG9uZShpbmZvKTsKLQl9Ci0KLQlpZiAoIShpbmZvLT5zdGF0X2ZsYWdzICYgKEVTUF9TVEFUX0RNQV9SWCB8IEVTUF9TVEFUX0RNQV9UWCkpICYmCi0JICAgICgoc2NyYXRjaCAmIDB4MDEpIHx8IChpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfUlhfVElNRU9VVCkpICYmCi0JICAgIChpbmZvLT5JRVIgJiBVQVJUX0lFUl9SREkpKSB7Ci0JCWludCBudW1fYnl0ZXM7Ci0KLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfTk9fQ09NTUFORCk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX0dFVF9SWF9BVkFJTCk7Ci0JCW51bV9ieXRlcyA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMSkgPDwgODsKLQkJbnVtX2J5dGVzIHw9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMik7Ci0KLQkJbnVtX2J5dGVzID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20oaW5mby0+cG9ydC50dHksIG51bV9ieXRlcyk7Ci0KLQkJaWYgKG51bV9ieXRlcykgewotCQkJaWYgKGRtYV9ieXRlcyB8fAotCQkJICAgIChpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfVVNFX1BJTykgfHwKLQkJCSAgICAobnVtX2J5dGVzIDw9IGluZm8tPmNvbmZpZy5waW9fdGhyZXNob2xkKSkKLQkJCQlyZWNlaXZlX2NoYXJzX3BpbyhpbmZvLCBudW1fYnl0ZXMpOwotCQkJZWxzZQotCQkJCXJlY2VpdmVfY2hhcnNfZG1hKGluZm8sIG51bV9ieXRlcyk7Ci0JCX0KLQl9Ci0KLQlpZiAoIShpbmZvLT5zdGF0X2ZsYWdzICYgKEVTUF9TVEFUX0RNQV9SWCB8IEVTUF9TVEFUX0RNQV9UWCkpICYmCi0JICAgIChzY3JhdGNoICYgMHgwMikgJiYgKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpKSB7Ci0JCWlmICgoaW5mby0+eG1pdF9jbnQgPD0gMCkgfHwgaW5mby0+cG9ydC50dHktPnN0b3BwZWQpIHsKLQkJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKLQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7Ci0JCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPklFUik7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgbnVtX2J5dGVzOwotCi0JCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9OT19DT01NQU5EKTsKLQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX0dFVF9UWF9BVkFJTCk7Ci0JCQludW1fYnl0ZXMgPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDEpIDw8IDg7Ci0JCQludW1fYnl0ZXMgfD0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKTsKLQotCQkJaWYgKG51bV9ieXRlcyA+IGluZm8tPnhtaXRfY250KQotCQkJCW51bV9ieXRlcyA9IGluZm8tPnhtaXRfY250OwotCi0JCQlpZiAobnVtX2J5dGVzKSB7Ci0JCQkJaWYgKGRtYV9ieXRlcyB8fAotCQkJCSAgICAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX1VTRV9QSU8pIHx8Ci0JCQkJICAgIChudW1fYnl0ZXMgPD0gaW5mby0+Y29uZmlnLnBpb190aHJlc2hvbGQpKQotCQkJCQl0cmFuc21pdF9jaGFyc19waW8oaW5mbywgbnVtX2J5dGVzKTsKLQkJCQllbHNlCi0JCQkJCXRyYW5zbWl0X2NoYXJzX2RtYShpbmZvLCBudW1fYnl0ZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOwotCi0jaWZkZWYgU0VSSUFMX0RFQlVHX0lOVFIKLQlwcmludGsoImVuZC5cbiIpOwotI2VuZGlmCi0Jc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEhlcmUgZW5kcyB0aGUgc2VyaWFsIGludGVycnVwdCByb3V0aW5lcy4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0vKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb3cgbGV2ZWwgdXRpbGl0eSBzdWJyb3V0aW5lcyBmb3IgdGhlIHNlcmlhbCBkcml2ZXI6ICByb3V0aW5lcyB0bwotICogZmlndXJlIG91dCB0aGUgYXBwcm9wcmlhdGUgdGltZW91dCBmb3IgYW4gaW50ZXJydXB0IGNoYWluLCByb3V0aW5lcwotICogdG8gaW5pdGlhbGl6ZSBhbmQgc3RhcnR1cCBhIHNlcmlhbCBwb3J0LCBhbmQgcm91dGluZXMgdG8gc2h1dGRvd24gYQotICogc2VyaWFsIHBvcnQuICBVc2VmdWwgc3R1ZmYgbGlrZSB0aGF0LgotICoKLSAqIENhbGxlciBzaG91bGQgaG9sZCBsb2NrCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi1zdGF0aWMgdm9pZCBlc3BfYmFzaWNfaW5pdChzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbykKLXsKLQkvKiBwdXQgRVNQQyBpbiBlbmhhbmNlZCBtb2RlICovCi0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX01PREUpOwotCi0JaWYgKGluZm8tPnN0YXRfZmxhZ3MgJiBFU1BfU1RBVF9ORVZFUl9ETUEpCi0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwMSk7Ci0JZWxzZQotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MzEpOwotCi0JLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGZvciBub3cgKi8KLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfU1JWX01BU0spOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwMCk7Ci0KLQkvKiBzZXQgaW50ZXJydXB0IGFuZCBETUEgY2hhbm5lbCAqLwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9JUlEpOwotCi0JaWYgKGluZm8tPnN0YXRfZmxhZ3MgJiBFU1BfU1RBVF9ORVZFUl9ETUEpCi0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwMSk7Ci0JZWxzZQotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIChkbWEgPDwgNCkgfCAweDAxKTsKLQotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9FTkhfSVJRKTsKLQotCWlmIChpbmZvLT5saW5lICUgOCkJLyogc2Vjb25kYXJ5IHBvcnQgKi8KLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDBkKTsJLyogc2hhcmVkICovCi0JZWxzZSBpZiAoaW5mby0+aXJxID09IDkpCi0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwMik7Ci0JZWxzZQotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPmlycSk7Ci0KLQkvKiBzZXQgZXJyb3Igc3RhdHVzIG1hc2sgKGNoZWNrIHRoaXMpICovCi0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX0VSUl9NQVNLKTsKLQotCWlmIChpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfTkVWRVJfRE1BKQotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4YTEpOwotCWVsc2UKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweGJkKTsKLQotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwMCk7Ci0KLQkvKiBzZXQgRE1BIHRpbWVvdXQgKi8KLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfRE1BX1RNT1VUKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4ZmYpOwotCi0JLyogc2V0IEZJRk8gdHJpZ2dlciBsZXZlbHMgKi8KLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfVFJJR0dFUik7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5jb25maWcucnhfdHJpZ2dlciA+PiA4KTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPmNvbmZpZy5yeF90cmlnZ2VyKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPmNvbmZpZy50eF90cmlnZ2VyID4+IDgpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+Y29uZmlnLnR4X3RyaWdnZXIpOwotCi0JLyogU2V0IGNsb2NrIHNjYWxpbmcgYW5kIHdhaXQgc3RhdGVzICovCi0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1BSRVNDQUxBUik7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDA0IHwgRVNQQ19TQ0FMRSk7Ci0KLQkvKiBzZXQgcmVpbnRlcnJ1cHQgcGFjaW5nICovCi0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1JFSU5UUik7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweGZmKTsKLX0KLQotc3RhdGljIGludCBzdGFydHVwKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50CXJldHZhbCA9IDA7Ci0JdW5zaWduZWQgaW50IG51bV9jaGFyczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoaW5mby0+cG9ydC5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKQotCQlnb3RvIG91dDsKLQotCWlmICghaW5mby0+eG1pdF9idWYpIHsKLQkJaW5mby0+eG1pdF9idWYgPSAodW5zaWduZWQgY2hhciAqKWdldF96ZXJvZWRfcGFnZShHRlBfQVRPTUlDKTsKLQkJcmV0dmFsID0gLUVOT01FTTsKLQkJaWYgKCFpbmZvLT54bWl0X2J1ZikKLQkJCWdvdG8gb3V0OwotCX0KLQotI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCi0JcHJpbnRrKEtFUk5fREVCVUcgInN0YXJ0aW5nIHVwIHR0eXMlZCAoaXJxICVkKS4uLiIsCi0JCQkJCQlpbmZvLT5saW5lLCBpbmZvLT5pcnEpOwotI2VuZGlmCi0KLQkvKiBGbHVzaCB0aGUgUlggYnVmZmVyLiAgVXNpbmcgdGhlIEVTSSBmbHVzaCBjb21tYW5kIG1heSBjYXVzZSAqLwotCS8qIHdpbGQgaW50ZXJydXB0cywgc28gcmVhZCBhbGwgdGhlIGRhdGEgaW5zdGVhZC4gKi8KLQotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX05PX0NPTU1BTkQpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX0dFVF9SWF9BVkFJTCk7Ci0JbnVtX2NoYXJzID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKSA8PCA4OwotCW51bV9jaGFycyB8PSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDIpOwotCi0Jd2hpbGUgKG51bV9jaGFycyA+IDEpIHsKLQkJaW53KGluZm8tPmlvX3BvcnQgKyBVQVJUX0VTSV9SWCk7Ci0JCW51bV9jaGFycyAtPSAyOwotCX0KLQotCWlmIChudW1fY2hhcnMpCi0JCXNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9SWCk7Ci0KLQkvKiBzZXQgcmVjZWl2ZSBjaGFyYWN0ZXIgdGltZW91dCAqLwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9SWF9USU1FT1VUKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPmNvbmZpZy5yeF90aW1lb3V0KTsKLQotCS8qIGNsZWFyIGFsbCBmbGFncyBleGNlcHQgdGhlICJuZXZlciBETUEiIGZsYWcgKi8KLQlpbmZvLT5zdGF0X2ZsYWdzICY9IEVTUF9TVEFUX05FVkVSX0RNQTsKLQotCWlmIChpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfTkVWRVJfRE1BKQotCQlpbmZvLT5zdGF0X2ZsYWdzIHw9IEVTUF9TVEFUX1VTRV9QSU87Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0KLQkvKgotCSAqIEFsbG9jYXRlIHRoZSBJUlEKLQkgKi8KLQotCXJldHZhbCA9IHJlcXVlc3RfaXJxKGluZm8tPmlycSwgcnNfaW50ZXJydXB0X3NpbmdsZSwgSVJRRl9TSEFSRUQsCi0JCQkgICAgICJlc3Agc2VyaWFsIiwgaW5mbyk7Ci0KLQlpZiAocmV0dmFsKSB7Ci0JCWlmIChjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7Ci0JCQlpZiAoaW5mby0+cG9ydC50dHkpCi0JCQkJc2V0X2JpdChUVFlfSU9fRVJST1IsCi0JCQkJCSZpbmZvLT5wb3J0LnR0eS0+ZmxhZ3MpOwotCQkJcmV0dmFsID0gMDsKLQkJfQotCQlnb3RvIG91dF91bmxvY2tlZDsKLQl9Ci0KLQlpZiAoIShpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfVVNFX1BJTykgJiYgIWRtYV9idWZmZXIpIHsKLQkJZG1hX2J1ZmZlciA9IChjaGFyICopX19nZXRfZG1hX3BhZ2VzKAotCQkJR0ZQX0tFUk5FTCwgZ2V0X29yZGVyKERNQV9CVUZGRVJfU1opKTsKLQotCQkvKiB1c2UgUElPIG1vZGUgaWYgRE1BIGJ1Zi9jaGFuIGNhbm5vdCBiZSBhbGxvY2F0ZWQgKi8KLQkJaWYgKCFkbWFfYnVmZmVyKQotCQkJaW5mby0+c3RhdF9mbGFncyB8PSBFU1BfU1RBVF9VU0VfUElPOwotCQllbHNlIGlmIChyZXF1ZXN0X2RtYShkbWEsICJlc3Agc2VyaWFsIikpIHsKLQkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpZG1hX2J1ZmZlciwKLQkJCQkgICBnZXRfb3JkZXIoRE1BX0JVRkZFUl9TWikpOwotCQkJZG1hX2J1ZmZlciA9IE5VTEw7Ci0JCQlpbmZvLT5zdGF0X2ZsYWdzIHw9IEVTUF9TVEFUX1VTRV9QSU87Ci0JCX0KLQotCX0KLQotCWluZm8tPk1DUiA9IFVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUyB8IFVBUlRfTUNSX09VVDI7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1dSSVRFX1VBUlQpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+TUNSKTsKLQotCS8qCi0JICogRmluYWxseSwgZW5hYmxlIGludGVycnVwdHMKLQkgKi8KLQkvKiBpbmZvLT5JRVIgPSBVQVJUX0lFUl9NU0kgfCBVQVJUX0lFUl9STFNJIHwgVUFSVF9JRVJfUkRJOyAqLwotCWluZm8tPklFUiA9IFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREkgfCBVQVJUX0lFUl9ETUFfVE1PVVQgfAotCQkJVUFSVF9JRVJfRE1BX1RDOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5JRVIpOwotCi0JaWYgKGluZm8tPnBvcnQudHR5KQotCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+cG9ydC50dHktPmZsYWdzKTsKLQlpbmZvLT54bWl0X2NudCA9IGluZm8tPnhtaXRfaGVhZCA9IGluZm8tPnhtaXRfdGFpbCA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCi0JLyoKLQkgKiBTZXQgdXAgdGhlIHR0eS0+YWx0X3NwZWVkIGtsdWRnZQotCSAqLwotCWlmIChpbmZvLT5wb3J0LnR0eSkgewotCQlpZiAoKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQotCQkJaW5mby0+cG9ydC50dHktPmFsdF9zcGVlZCA9IDU3NjAwOwotCQlpZiAoKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1ZISSkKLQkJCWluZm8tPnBvcnQudHR5LT5hbHRfc3BlZWQgPSAxMTUyMDA7Ci0JCWlmICgoaW5mby0+cG9ydC5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfU0hJKQotCQkJaW5mby0+cG9ydC50dHktPmFsdF9zcGVlZCA9IDIzMDQwMDsKLQkJaWYgKChpbmZvLT5wb3J0LmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9XQVJQKQotCQkJaW5mby0+cG9ydC50dHktPmFsdF9zcGVlZCA9IDQ2MDgwMDsKLQl9Ci0KLQkvKgotCSAqIHNldCB0aGUgc3BlZWQgb2YgdGhlIHNlcmlhbCBwb3J0Ci0JICovCi0JY2hhbmdlX3NwZWVkKGluZm8pOwotCWluZm8tPnBvcnQuZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7Ci0JcmV0dXJuIDA7Ci0KLW91dDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci1vdXRfdW5sb2NrZWQ6Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSB3aWxsIHNodXRkb3duIGEgc2VyaWFsIHBvcnQ7IGludGVycnVwdHMgYXJlIGRpc2FibGVkLCBhbmQKLSAqIERUUiBpcyBkcm9wcGVkIGlmIHRoZSBoYW5ndXAgb24gY2xvc2UgdGVybWlvIGZsYWcgaXMgb24uCi0gKi8KLXN0YXRpYyB2b2lkIHNodXRkb3duKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvKQotewotCXVuc2lnbmVkIGxvbmcJZmxhZ3MsIGY7Ci0KLQlpZiAoIShpbmZvLT5wb3J0LmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKQotCQlyZXR1cm47Ci0KLSNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgotCXByaW50aygiU2h1dHRpbmcgZG93biBzZXJpYWwgcG9ydCAlZCAoaXJxICVkKS4uLi4iLCBpbmZvLT5saW5lLAotCSAgICAgICBpbmZvLT5pcnEpOwotI2VuZGlmCi0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCS8qCi0JICogY2xlYXIgZGVsdGFfbXNyX3dhaXQgcXVldWUgdG8gYXZvaWQgbWVtIGxlYWtzOiB3ZSBtYXkgZnJlZSB0aGUgaXJxCi0JICogaGVyZSBzbyB0aGUgcXVldWUgbWlnaHQgbmV2ZXIgYmUgd2FrZW4gdXAKLQkgKi8KLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPnBvcnQuZGVsdGFfbXNyX3dhaXQpOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+YnJlYWtfd2FpdCk7Ci0KLQkvKiBzdG9wIGEgRE1BIHRyYW5zZmVyIG9uIHRoZSBwb3J0IGJlaW5nIGNsb3NlZCAqLwotCS8qIERNQSBsb2NrIGlzIGhpZ2hlciBwcmlvcml0eSBhbHdheXMgKi8KLQlpZiAoaW5mby0+c3RhdF9mbGFncyAmIChFU1BfU1RBVF9ETUFfUlggfCBFU1BfU1RBVF9ETUFfVFgpKSB7Ci0JCWYgPSBjbGFpbV9kbWFfbG9jaygpOwotCQlkaXNhYmxlX2RtYShkbWEpOwotCQljbGVhcl9kbWFfZmYoZG1hKTsKLQkJcmVsZWFzZV9kbWFfbG9jayhmKTsKLQotCQlkbWFfYnl0ZXMgPSAwOwotCX0KLQotCS8qCi0JICogRnJlZSB0aGUgSVJRCi0JICovCi0JZnJlZV9pcnEoaW5mby0+aXJxLCBpbmZvKTsKLQotCWlmIChkbWFfYnVmZmVyKSB7Ci0JCXN0cnVjdCBlc3Bfc3RydWN0ICpjdXJyZW50X3BvcnQgPSBwb3J0czsKLQotCQl3aGlsZSAoY3VycmVudF9wb3J0KSB7Ci0JCQlpZiAoKGN1cnJlbnRfcG9ydCAhPSBpbmZvKSAmJgotCQkJICAgIChjdXJyZW50X3BvcnQtPnBvcnQuZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCi0JCQkJYnJlYWs7Ci0KLQkJCWN1cnJlbnRfcG9ydCA9IGN1cnJlbnRfcG9ydC0+bmV4dF9wb3J0OwotCQl9Ci0KLQkJaWYgKCFjdXJyZW50X3BvcnQpIHsKLQkJCWZyZWVfZG1hKGRtYSk7Ci0JCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWRtYV9idWZmZXIsCi0JCQkJICAgZ2V0X29yZGVyKERNQV9CVUZGRVJfU1opKTsKLQkJCWRtYV9idWZmZXIgPSBOVUxMOwotCQl9Ci0JfQotCi0JaWYgKGluZm8tPnhtaXRfYnVmKSB7Ci0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgaW5mby0+eG1pdF9idWYpOwotCQlpbmZvLT54bWl0X2J1ZiA9IE5VTEw7Ci0JfQotCi0JaW5mby0+SUVSID0gMDsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfU1JWX01BU0spOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwMCk7Ci0KLQlpZiAoIWluZm8tPnBvcnQudHR5IHx8IChpbmZvLT5wb3J0LnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSkKLQkJaW5mby0+TUNSICY9IH4oVUFSVF9NQ1JfRFRSfFVBUlRfTUNSX1JUUyk7Ci0KLQlpbmZvLT5NQ1IgJj0gflVBUlRfTUNSX09VVDI7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfV1JJVEVfVUFSVCk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBVQVJUX01DUik7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5NQ1IpOwotCi0JaWYgKGluZm8tPnBvcnQudHR5KQotCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnBvcnQudHR5LT5mbGFncyk7Ci0KLQlpbmZvLT5wb3J0LmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci19Ci0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIHNldCB0aGUgVUFSVCBkaXZpc29yIHJlZ2lzdGVycyB0byBtYXRjaAotICogdGhlIHNwZWNpZmllZCBiYXVkIHJhdGUgZm9yIGEgc2VyaWFsIHBvcnQuCi0gKi8KLXN0YXRpYyB2b2lkIGNoYW5nZV9zcGVlZChzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbykKLXsKLQl1bnNpZ25lZCBzaG9ydCBwb3J0OwotCWludAlxdW90ID0gMDsKLQl1bnNpZ25lZCBjZmxhZywgY3ZhbDsKLQlpbnQJYmF1ZCwgYml0czsKLQl1bnNpZ25lZCBjaGFyIGZsb3cxID0gMCwgZmxvdzIgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIWluZm8tPnBvcnQudHR5IHx8ICFpbmZvLT5wb3J0LnR0eS0+dGVybWlvcykKLQkJcmV0dXJuOwotCWNmbGFnID0gaW5mby0+cG9ydC50dHktPnRlcm1pb3MtPmNfY2ZsYWc7Ci0JcG9ydCA9IGluZm8tPmlvX3BvcnQ7Ci0KLQkvKiBieXRlIHNpemUgYW5kIHBhcml0eSAqLwotCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgewotCWNhc2UgQ1M1OiBjdmFsID0gMHgwMDsgYml0cyA9IDc7IGJyZWFrOwotCWNhc2UgQ1M2OiBjdmFsID0gMHgwMTsgYml0cyA9IDg7IGJyZWFrOwotCWNhc2UgQ1M3OiBjdmFsID0gMHgwMjsgYml0cyA9IDk7IGJyZWFrOwotCWNhc2UgQ1M4OiBjdmFsID0gMHgwMzsgYml0cyA9IDEwOyBicmVhazsKLQlkZWZhdWx0OiAgY3ZhbCA9IDB4MDA7IGJpdHMgPSA3OyBicmVhazsKLQl9Ci0JaWYgKGNmbGFnICYgQ1NUT1BCKSB7Ci0JCWN2YWwgfD0gMHgwNDsKLQkJYml0cysrOwotCX0KLQlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKLQkJY3ZhbCB8PSBVQVJUX0xDUl9QQVJJVFk7Ci0JCWJpdHMrKzsKLQl9Ci0JaWYgKCEoY2ZsYWcgJiBQQVJPREQpKQotCQljdmFsIHw9IFVBUlRfTENSX0VQQVI7Ci0jaWZkZWYgQ01TUEFSCi0JaWYgKGNmbGFnICYgQ01TUEFSKQotCQljdmFsIHw9IFVBUlRfTENSX1NQQVI7Ci0jZW5kaWYKLQliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+cG9ydC50dHkpOwotCWlmIChiYXVkID09IDM4NDAwICYmCi0JCSgoaW5mby0+cG9ydC5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCkpCi0JCXF1b3QgPSBpbmZvLT5jdXN0b21fZGl2aXNvcjsKLQllbHNlIHsKLQkJaWYgKGJhdWQgPT0gMTM0KSAvKiBTcGVjaWFsIGNhc2Ugc2luY2UgMTM0IGlzIHJlYWxseSAxMzQuNSAqLwotCQkJcXVvdCA9ICgyKkJBU0VfQkFVRCAvIDI2OSk7Ci0JCWVsc2UgaWYgKGJhdWQpCi0JCQlxdW90ID0gQkFTRV9CQVVEIC8gYmF1ZDsKLQl9Ci0JLyogSWYgdGhlIHF1b3RpZW50IGlzIGV2ZXIgemVybywgZGVmYXVsdCB0byA5NjAwIGJwcyAqLwotCWlmICghcXVvdCkKLQkJcXVvdCA9IEJBU0VfQkFVRCAvIDk2MDA7Ci0KLQlpZiAoYmF1ZCkgewotCQkvKiBBY3R1YWwgcmF0ZSAqLwotCQliYXVkID0gQkFTRV9CQVVEL3F1b3Q7Ci0JCXR0eV9lbmNvZGVfYmF1ZF9yYXRlKGluZm8tPnBvcnQudHR5LCBiYXVkLCBiYXVkKTsKLQl9Ci0JaW5mby0+dGltZW91dCA9ICgoMTAyNCAqIEhaICogYml0cyAqIHF1b3QpIC8gQkFTRV9CQVVEKSArIChIWiAvIDUwKTsKLQotCS8qIENUUyBmbG93IGNvbnRyb2wgZmxhZyBhbmQgbW9kZW0gc3RhdHVzIGludGVycnVwdHMgKi8KLQkvKiBpbmZvLT5JRVIgJj0gflVBUlRfSUVSX01TSTsgKi8KLQlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7Ci0JCWluZm8tPnBvcnQuZmxhZ3MgfD0gQVNZTkNfQ1RTX0ZMT1c7Ci0JCS8qIGluZm8tPklFUiB8PSBVQVJUX0lFUl9NU0k7ICovCi0JCWZsb3cxID0gMHgwNDsKLQkJZmxvdzIgPSAweDEwOwotCX0gZWxzZQotCQlpbmZvLT5wb3J0LmZsYWdzICY9IH5BU1lOQ19DVFNfRkxPVzsKLQlpZiAoY2ZsYWcgJiBDTE9DQUwpCi0JCWluZm8tPnBvcnQuZmxhZ3MgJj0gfkFTWU5DX0NIRUNLX0NEOwotCWVsc2UKLQkJaW5mby0+cG9ydC5mbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKLQotCS8qCi0JICogU2V0IHVwIHBhcml0eSBjaGVjayBmbGFnCi0JICovCi0JaW5mby0+cmVhZF9zdGF0dXNfbWFzayA9IFVBUlRfTFNSX09FIHwgVUFSVF9MU1JfVEhSRSB8IFVBUlRfTFNSX0RSOwotCWlmIChJX0lOUENLKGluZm8tPnBvcnQudHR5KSkKLQkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9GRSB8IFVBUlRfTFNSX1BFOwotCWlmIChJX0JSS0lOVChpbmZvLT5wb3J0LnR0eSkgfHwgSV9QQVJNUksoaW5mby0+cG9ydC50dHkpKQotCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOwotCi0JaW5mby0+aWdub3JlX3N0YXR1c19tYXNrID0gMDsKLSNpZiAwCi0JLyogVGhpcyBzaG91bGQgYmUgc2FmZSwgYnV0IGZvciBzb21lIGJyb2tlbiBiaXRzIG9mIGhhcmR3YXJlLi4uICovCi0JaWYgKElfSUdOUEFSKGluZm8tPnBvcnQudHR5KSkgewotCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfUEUgfCBVQVJUX0xTUl9GRTsKLQkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9QRSB8IFVBUlRfTFNSX0ZFOwotCX0KLSNlbmRpZgotCWlmIChJX0lHTkJSSyhpbmZvLT5wb3J0LnR0eSkpIHsKLQkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOwotCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOwotCQkvKgotCQkgKiBJZiB3ZSdyZSBpZ25vcmUgcGFyaXR5IGFuZCBicmVhayBpbmRpY2F0b3JzLCBpZ25vcmUKLQkJICogb3ZlcnJ1bnMgdG9vLiAgKEZvciByZWFsIHJhdyBzdXBwb3J0KS4KLQkJICovCi0JCWlmIChJX0lHTlBBUihpbmZvLT5wb3J0LnR0eSkpIHsKLQkJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9PRSB8IFwKLQkJCQlVQVJUX0xTUl9QRSB8IFVBUlRfTFNSX0ZFOwotCQkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9PRSB8IFwKLQkJCQlVQVJUX0xTUl9QRSB8IFVBUlRfTFNSX0ZFOwotCQl9Ci0JfQotCi0JaWYgKElfSVhPRkYoaW5mby0+cG9ydC50dHkpKQotCQlmbG93MSB8PSAweDgxOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkvKiBzZXQgYmF1ZCAqLwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9CQVVEKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIHF1b3QgPj4gOCk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBxdW90ICYgMHhmZik7Ci0KLQkvKiBzZXQgZGF0YSBiaXRzLCBwYXJpdHksIGV0Yy4gKi8KLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9XUklURV9VQVJUKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIFVBUlRfTENSKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGN2YWwpOwotCi0JLyogRW5hYmxlIGZsb3cgY29udHJvbCAqLwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9GTE9XX0NOVEwpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgZmxvdzEpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgZmxvdzIpOwotCi0JLyogc2V0IGZsb3cgY29udHJvbCBjaGFyYWN0ZXJzIChYT04vWE9GRiBvbmx5KSAqLwotCWlmIChJX0lYT0ZGKGluZm8tPnBvcnQudHR5KSkgewotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfRkxPV19DSEFSUyk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgU1RBUlRfQ0hBUihpbmZvLT5wb3J0LnR0eSkpOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIFNUT1BfQ0hBUihpbmZvLT5wb3J0LnR0eSkpOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MTApOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MjEpOwotCQlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKLQkJY2FzZSBDUzU6Ci0JCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ1M2OgotCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDNmKTsKLQkJCWJyZWFrOwotCQljYXNlIENTNzoKLQkJY2FzZSBDUzg6Ci0JCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4N2YpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4ZmYpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiBTZXQgaGlnaC9sb3cgd2F0ZXIgKi8KLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfRkxPV19MVkwpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+Y29uZmlnLmZsb3dfb2ZmID4+IDgpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+Y29uZmlnLmZsb3dfb2ZmKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPmNvbmZpZy5mbG93X29uID4+IDgpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+Y29uZmlnLmZsb3dfb24pOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IHJzX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpCi17Ci0Jc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3B1dF9jaGFyIikpCi0JCXJldHVybiAwOwotCi0JaWYgKCFpbmZvLT54bWl0X2J1ZikKLQkJcmV0dXJuIDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCWlmIChpbmZvLT54bWl0X2NudCA8IEVTUF9YTUlUX1NJWkUgLSAxKSB7Ci0JCWluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfaGVhZCsrXSA9IGNoOwotCQlpbmZvLT54bWl0X2hlYWQgJj0gRVNQX1hNSVRfU0laRS0xOwotCQlpbmZvLT54bWl0X2NudCsrOwotCQlyZXQgPSAxOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgcnNfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfZmx1c2hfY2hhcnMiKSkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQotCWlmIChpbmZvLT54bWl0X2NudCA8PSAwIHx8IHR0eS0+c3RvcHBlZCB8fCAhaW5mby0+eG1pdF9idWYpCi0JCWdvdG8gb3V0OwotCi0JaWYgKCEoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkpIHsKLQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKLQl9Ci1vdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IHJzX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCi0JCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKLXsKLQlpbnQJYywgdCwgcmV0ID0gMDsKLQlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfd3JpdGUiKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWluZm8tPnhtaXRfYnVmKQotCQlyZXR1cm4gMDsKLQotCXdoaWxlICgxKSB7Ci0JCS8qIFRoYW5rcyB0byBSLiBXb2xmZiBmb3Igc3VnZ2VzdGluZyBob3cgdG8gZG8gdGhpcyB3aXRoICovCi0JCS8qIGludGVycnVwdHMgZW5hYmxlZCAqLwotCi0JCWMgPSBjb3VudDsKLQkJdCA9IEVTUF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2NudCAtIDE7Ci0KLQkJaWYgKHQgPCBjKQotCQkJYyA9IHQ7Ci0KLQkJdCA9IEVTUF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2hlYWQ7Ci0KLQkJaWYgKHQgPCBjKQotCQkJYyA9IHQ7Ci0KLQkJaWYgKGMgPD0gMCkKLQkJCWJyZWFrOwotCi0JCW1lbWNweShpbmZvLT54bWl0X2J1ZiArIGluZm8tPnhtaXRfaGVhZCwgYnVmLCBjKTsKLQotCQlpbmZvLT54bWl0X2hlYWQgPSAoaW5mby0+eG1pdF9oZWFkICsgYykgJiAoRVNQX1hNSVRfU0laRS0xKTsKLQkJaW5mby0+eG1pdF9jbnQgKz0gYzsKLQkJYnVmICs9IGM7Ci0JCWNvdW50IC09IGM7Ci0JCXJldCArPSBjOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoaW5mby0+eG1pdF9jbnQgJiYgIXR0eS0+c3RvcHBlZCAmJiAhKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpKSB7Ci0JCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfU1JWX01BU0spOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPklFUik7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcnNfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpbnQJcmV0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3dyaXRlX3Jvb20iKSkKLQkJcmV0dXJuIDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCi0JcmV0ID0gRVNQX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0ID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByc19jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2NoYXJzX2luX2J1ZmZlciIpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gaW5mby0+eG1pdF9jbnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHJzX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19mbHVzaF9idWZmZXIiKSkKLQkJcmV0dXJuOwotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQl0dHlfd2FrZXVwKHR0eSk7Ci19Ci0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHJzX3Rocm90dGxlKCkKLSAqCi0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSB1cHBlci1sYXllciB0dHkgbGF5ZXIgdG8gc2lnbmFsIHRoYXQKLSAqIGluY29taW5nIGNoYXJhY3RlcnMgc2hvdWxkIGJlIHRocm90dGxlZC4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi1zdGF0aWMgdm9pZCByc190aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotI2lmZGVmIFNFUklBTF9ERUJVR19USFJPVFRMRQotCWNoYXIJYnVmWzY0XTsKLQotCXByaW50aygidGhyb3R0bGUgJXM6ICVkLi4uLlxuIiwgdHR5X25hbWUodHR5LCBidWYpLAotCQkJCQkJdHR5X2NoYXJzX2luX2J1ZmZlcih0dHkpKTsKLSNlbmRpZgotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc190aHJvdHRsZSIpKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfUkRJOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5JRVIpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9SWF9USU1FT1VUKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MDApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgcnNfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotI2lmZGVmIFNFUklBTF9ERUJVR19USFJPVFRMRQotCWNoYXIJYnVmWzY0XTsKLQotCXByaW50ayhLRVJOX0RFQlVHICJ1bnRocm90dGxlICVzOiAlZC4uLi5cbiIsIHR0eV9uYW1lKHR0eSwgYnVmKSwKLQkgICAgICAgdHR5X2NoYXJzX2luX2J1ZmZlcih0dHkpKTsKLSNlbmRpZgotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc191bnRocm90dGxlIikpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JaW5mby0+SUVSIHw9IFVBUlRfSUVSX1JESTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfU1JWX01BU0spOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfUlhfVElNRU9VVCk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5jb25maWcucnhfdGltZW91dCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotfQotCi0vKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiByc19pb2N0bCgpIGFuZCBmcmllbmRzCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi1zdGF0aWMgaW50IGdldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywKLQkJCSAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqcmV0aW5mbykKLXsKLQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB0bXA7Ci0KLQlsb2NrX2tlcm5lbCgpOwotCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7Ci0JdG1wLnR5cGUgPSBQT1JUXzE2NTUwQTsKLQl0bXAubGluZSA9IGluZm8tPmxpbmU7Ci0JdG1wLnBvcnQgPSBpbmZvLT5pb19wb3J0OwotCXRtcC5pcnEgPSBpbmZvLT5pcnE7Ci0JdG1wLmZsYWdzID0gaW5mby0+cG9ydC5mbGFnczsKLQl0bXAueG1pdF9maWZvX3NpemUgPSAxMDI0OwotCXRtcC5iYXVkX2Jhc2UgPSBCQVNFX0JBVUQ7Ci0JdG1wLmNsb3NlX2RlbGF5ID0gaW5mby0+Y2xvc2VfZGVsYXk7Ci0JdG1wLmNsb3Npbmdfd2FpdCA9IGluZm8tPmNsb3Npbmdfd2FpdDsKLQl0bXAuY3VzdG9tX2Rpdmlzb3IgPSBpbmZvLT5jdXN0b21fZGl2aXNvcjsKLQl0bXAuaHViNiA9IDA7Ci0JdW5sb2NrX2tlcm5lbCgpOwotCWlmIChjb3B5X3RvX3VzZXIocmV0aW5mbywgJnRtcCwgc2l6ZW9mKCpyZXRpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGdldF9lc3BfY29uZmlnKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLAotCQkJICBzdHJ1Y3QgaGF5ZXNfZXNwX2NvbmZpZyBfX3VzZXIgKnJldGluZm8pCi17Ci0Jc3RydWN0IGhheWVzX2VzcF9jb25maWcgdG1wOwotCi0JaWYgKCFyZXRpbmZvKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7Ci0JbG9ja19rZXJuZWwoKTsKLQl0bXAucnhfdGltZW91dCA9IGluZm8tPmNvbmZpZy5yeF90aW1lb3V0OwotCXRtcC5yeF90cmlnZ2VyID0gaW5mby0+Y29uZmlnLnJ4X3RyaWdnZXI7Ci0JdG1wLnR4X3RyaWdnZXIgPSBpbmZvLT5jb25maWcudHhfdHJpZ2dlcjsKLQl0bXAuZmxvd19vZmYgPSBpbmZvLT5jb25maWcuZmxvd19vZmY7Ci0JdG1wLmZsb3dfb24gPSBpbmZvLT5jb25maWcuZmxvd19vbjsKLQl0bXAucGlvX3RocmVzaG9sZCA9IGluZm8tPmNvbmZpZy5waW9fdGhyZXNob2xkOwotCXRtcC5kbWFfY2hhbm5lbCA9IChpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfTkVWRVJfRE1BID8gMCA6IGRtYSk7Ci0JdW5sb2NrX2tlcm5lbCgpOwotCi0JcmV0dXJuIGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSA/IC1FRkFVTFQgOiAwOwotfQotCi1zdGF0aWMgaW50IHNldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywKLQkJCSAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqbmV3X2luZm8pCi17Ci0Jc3RydWN0IHNlcmlhbF9zdHJ1Y3QgbmV3X3NlcmlhbDsKLQlzdHJ1Y3QgZXNwX3N0cnVjdCBvbGRfaW5mbzsKLQl1bnNpZ25lZCBpbnQgY2hhbmdlX2lycTsKLQlpbnQgcmV0dmFsID0gMDsKLQlzdHJ1Y3QgZXNwX3N0cnVjdCAqY3VycmVudF9hc3luYzsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3NlcmlhbCwgbmV3X2luZm8sIHNpemVvZihuZXdfc2VyaWFsKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCW9sZF9pbmZvID0gKmluZm87Ci0KLQlpZiAoKG5ld19zZXJpYWwudHlwZSAhPSBQT1JUXzE2NTUwQSkgfHwKLQkgICAgKG5ld19zZXJpYWwuaHViNikgfHwKLQkgICAgKGluZm8tPmlvX3BvcnQgIT0gbmV3X3NlcmlhbC5wb3J0KSB8fAotCSAgICAobmV3X3NlcmlhbC5iYXVkX2Jhc2UgIT0gQkFTRV9CQVVEKSB8fAotCSAgICAobmV3X3NlcmlhbC5pcnEgPiAxNSkgfHwKLQkgICAgKG5ld19zZXJpYWwuaXJxIDwgMikgfHwKLQkgICAgKG5ld19zZXJpYWwuaXJxID09IDYpIHx8Ci0JICAgIChuZXdfc2VyaWFsLmlycSA9PSA4KSB8fAotCSAgICAobmV3X3NlcmlhbC5pcnEgPT0gMTMpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNoYW5nZV9pcnEgPSBuZXdfc2VyaWFsLmlycSAhPSBpbmZvLT5pcnE7Ci0KLQlpZiAoY2hhbmdlX2lycSAmJiAoaW5mby0+bGluZSAlIDgpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewotCQlpZiAoY2hhbmdlX2lycSB8fAotCQkgICAgKG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgIT0gaW5mby0+Y2xvc2VfZGVsYXkpIHx8Ci0JCSAgICAoKG5ld19zZXJpYWwuZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spICE9Ci0JCSAgICAgKGluZm8tPnBvcnQuZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spKSkKLQkJCXJldHVybiAtRVBFUk07Ci0JCWluZm8tPnBvcnQuZmxhZ3MgPSAoKGluZm8tPnBvcnQuZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spIHwKLQkJCSAgICAgICAobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX1VTUl9NQVNLKSk7Ci0JCWluZm8tPmN1c3RvbV9kaXZpc29yID0gbmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvcjsKLQl9IGVsc2UgewotCQlpZiAobmV3X3NlcmlhbC5pcnEgPT0gMikKLQkJCW5ld19zZXJpYWwuaXJxID0gOTsKLQotCQlpZiAoY2hhbmdlX2lycSkgewotCQkJY3VycmVudF9hc3luYyA9IHBvcnRzOwotCi0JCQl3aGlsZSAoY3VycmVudF9hc3luYykgewotCQkJCWlmICgoY3VycmVudF9hc3luYy0+bGluZSA+PSBpbmZvLT5saW5lKSAmJgotCQkJCSAgICAoY3VycmVudF9hc3luYy0+bGluZSA8IChpbmZvLT5saW5lICsgOCkpKSB7Ci0JCQkJCWlmIChjdXJyZW50X2FzeW5jID09IGluZm8pIHsKLQkJCQkJCWlmIChjdXJyZW50X2FzeW5jLT5wb3J0LmNvdW50ID4gMSkKLQkJCQkJCQlyZXR1cm4gLUVCVVNZOwotCQkJCQl9IGVsc2UgaWYgKGN1cnJlbnRfYXN5bmMtPnBvcnQuY291bnQpCi0JCQkJCQlyZXR1cm4gLUVCVVNZOwotCQkJCX0KLQotCQkJCWN1cnJlbnRfYXN5bmMgPSBjdXJyZW50X2FzeW5jLT5uZXh0X3BvcnQ7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBPSywgcGFzdCB0aGlzIHBvaW50LCBhbGwgdGhlIGVycm9yIGNoZWNraW5nIGhhcyBiZWVuIGRvbmUuCi0JCSAqIEF0IHRoaXMgcG9pbnQsIHdlIHN0YXJ0IG1ha2luZyBjaGFuZ2VzLi4uLi4KLQkJICovCi0KLQkJaW5mby0+cG9ydC5mbGFncyA9ICgoaW5mby0+cG9ydC5mbGFncyAmIH5BU1lOQ19GTEFHUykgfAotCQkJICAgICAgIChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfRkxBR1MpKTsKLQkJaW5mby0+Y3VzdG9tX2Rpdmlzb3IgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOwotCQlpbmZvLT5jbG9zZV9kZWxheSA9IG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgKiBIWi8xMDA7Ci0JCWluZm8tPmNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0ICogSFovMTAwOwotCi0JCWlmIChjaGFuZ2VfaXJxKSB7Ci0JCQkvKgotCQkJICogV2UgbmVlZCB0byBzaHV0ZG93biB0aGUgc2VyaWFsIHBvcnQgYXQgdGhlIG9sZAotCQkJICogcG9ydC9pcnEgY29tYmluYXRpb24uCi0JCQkgKi8KLQkJCXNodXRkb3duKGluZm8pOwotCi0JCQljdXJyZW50X2FzeW5jID0gcG9ydHM7Ci0KLQkJCXdoaWxlIChjdXJyZW50X2FzeW5jKSB7Ci0JCQkJaWYgKChjdXJyZW50X2FzeW5jLT5saW5lID49IGluZm8tPmxpbmUpICYmCi0JCQkJICAgIChjdXJyZW50X2FzeW5jLT5saW5lIDwgKGluZm8tPmxpbmUgKyA4KSkpCi0JCQkJCWN1cnJlbnRfYXN5bmMtPmlycSA9IG5ld19zZXJpYWwuaXJxOwotCi0JCQkJY3VycmVudF9hc3luYyA9IGN1cnJlbnRfYXN5bmMtPm5leHRfcG9ydDsKLQkJCX0KLQotCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX0VOSF9JUlEpOwotCQkJaWYgKGluZm8tPmlycSA9PSA5KQotCQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwMik7Ci0JCQllbHNlCi0JCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5pcnEpOwotCQl9Ci0JfQotCi0JaWYgKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgewotCQlpZiAoKChvbGRfaW5mby5wb3J0LmZsYWdzICYgQVNZTkNfU1BEX01BU0spICE9Ci0JCSAgICAgKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykpIHx8Ci0JCSAgICAob2xkX2luZm8uY3VzdG9tX2Rpdmlzb3IgIT0gaW5mby0+Y3VzdG9tX2Rpdmlzb3IpKSB7Ci0JCQlpZiAoKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQotCQkJCWluZm8tPnBvcnQudHR5LT5hbHRfc3BlZWQgPSA1NzYwMDsKLQkJCWlmICgoaW5mby0+cG9ydC5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQotCQkJCWluZm8tPnBvcnQudHR5LT5hbHRfc3BlZWQgPSAxMTUyMDA7Ci0JCQlpZiAoKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1NISSkKLQkJCQlpbmZvLT5wb3J0LnR0eS0+YWx0X3NwZWVkID0gMjMwNDAwOwotCQkJaWYgKChpbmZvLT5wb3J0LmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9XQVJQKQotCQkJCWluZm8tPnBvcnQudHR5LT5hbHRfc3BlZWQgPSA0NjA4MDA7Ci0JCQljaGFuZ2Vfc3BlZWQoaW5mbyk7Ci0JCX0KLQl9IGVsc2UKLQkJcmV0dmFsID0gc3RhcnR1cChpbmZvKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X2VzcF9jb25maWcoc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8sCi0JCQkgIHN0cnVjdCBoYXllc19lc3BfY29uZmlnIF9fdXNlciAqbmV3X2luZm8pCi17Ci0Jc3RydWN0IGhheWVzX2VzcF9jb25maWcgbmV3X2NvbmZpZzsKLQl1bnNpZ25lZCBpbnQgY2hhbmdlX2RtYTsKLQlpbnQgcmV0dmFsID0gMDsKLQlzdHJ1Y3QgZXNwX3N0cnVjdCAqY3VycmVudF9hc3luYzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogUGVyaGFwcyBhIG5vbi1zeXNhZG1pbiB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRvIHNvbWUgb2YgdGhlc2UgKi8KLQkvKiBvcGVyYXRpb25zLiAgSSBoYXZlbid0IGRlY2lkZWQgeWV0LiAqLwotCi0JaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfY29uZmlnLCBuZXdfaW5mbywgc2l6ZW9mKG5ld19jb25maWcpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoKG5ld19jb25maWcuZmxvd19vbiA+PSBuZXdfY29uZmlnLmZsb3dfb2ZmKSB8fAotCSAgICAobmV3X2NvbmZpZy5yeF90cmlnZ2VyIDwgMSkgfHwKLQkgICAgKG5ld19jb25maWcudHhfdHJpZ2dlciA8IDEpIHx8Ci0JICAgIChuZXdfY29uZmlnLmZsb3dfb2ZmIDwgMSkgfHwKLQkgICAgKG5ld19jb25maWcuZmxvd19vbiA8IDEpIHx8Ci0JICAgIChuZXdfY29uZmlnLnJ4X3RyaWdnZXIgPiAxMDIzKSB8fAotCSAgICAobmV3X2NvbmZpZy50eF90cmlnZ2VyID4gMTAyMykgfHwKLQkgICAgKG5ld19jb25maWcuZmxvd19vZmYgPiAxMDIzKSB8fAotCSAgICAobmV3X2NvbmZpZy5mbG93X29uID4gMTAyMykgfHwKLQkgICAgKG5ld19jb25maWcucGlvX3RocmVzaG9sZCA8IDApIHx8Ci0JICAgIChuZXdfY29uZmlnLnBpb190aHJlc2hvbGQgPiAxMDI0KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoKG5ld19jb25maWcuZG1hX2NoYW5uZWwgIT0gMSkgJiYgKG5ld19jb25maWcuZG1hX2NoYW5uZWwgIT0gMykpCi0JCW5ld19jb25maWcuZG1hX2NoYW5uZWwgPSAwOwotCi0JaWYgKGluZm8tPnN0YXRfZmxhZ3MgJiBFU1BfU1RBVF9ORVZFUl9ETUEpCi0JCWNoYW5nZV9kbWEgPSBuZXdfY29uZmlnLmRtYV9jaGFubmVsOwotCWVsc2UKLQkJY2hhbmdlX2RtYSA9IChuZXdfY29uZmlnLmRtYV9jaGFubmVsICE9IGRtYSk7Ci0KLQlpZiAoY2hhbmdlX2RtYSkgewotCQlpZiAobmV3X2NvbmZpZy5kbWFfY2hhbm5lbCkgewotCQkJLyogUElPIG1vZGUgdG8gRE1BIG1vZGUgdHJhbnNpdGlvbiBPUiAqLwotCQkJLyogY2hhbmdlIGN1cnJlbnQgRE1BIGNoYW5uZWwgKi8KLQkJCWN1cnJlbnRfYXN5bmMgPSBwb3J0czsKLQotCQkJd2hpbGUgKGN1cnJlbnRfYXN5bmMpIHsKLQkJCQlpZiAoY3VycmVudF9hc3luYyA9PSBpbmZvKSB7Ci0JCQkJCWlmIChjdXJyZW50X2FzeW5jLT5wb3J0LmNvdW50ID4gMSkKLQkJCQkJCXJldHVybiAtRUJVU1k7Ci0JCQkJfSBlbHNlIGlmIChjdXJyZW50X2FzeW5jLT5wb3J0LmNvdW50KQotCQkJCQlyZXR1cm4gLUVCVVNZOwotCi0JCQkJY3VycmVudF9hc3luYyA9IGN1cnJlbnRfYXN5bmMtPm5leHRfcG9ydDsKLQkJCX0KLQotCQkJc2h1dGRvd24oaW5mbyk7Ci0JCQlkbWEgPSBuZXdfY29uZmlnLmRtYV9jaGFubmVsOwotCQkJaW5mby0+c3RhdF9mbGFncyAmPSB+RVNQX1NUQVRfTkVWRVJfRE1BOwotCi0JCQkvKiBhbGwgcG9ydHMgbXVzdCB1c2UgdGhlIHNhbWUgRE1BIGNoYW5uZWwgKi8KLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJCWN1cnJlbnRfYXN5bmMgPSBwb3J0czsKLQotCQkJd2hpbGUgKGN1cnJlbnRfYXN5bmMpIHsKLQkJCQllc3BfYmFzaWNfaW5pdChjdXJyZW50X2FzeW5jKTsKLQkJCQljdXJyZW50X2FzeW5jID0gY3VycmVudF9hc3luYy0+bmV4dF9wb3J0OwotCQkJfQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQl9IGVsc2UgewotCQkJLyogRE1BIG1vZGUgdG8gUElPIG1vZGUgb25seSAqLwotCQkJaWYgKGluZm8tPnBvcnQuY291bnQgPiAxKQotCQkJCXJldHVybiAtRUJVU1k7Ci0KLQkJCXNodXRkb3duKGluZm8pOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJCWluZm8tPnN0YXRfZmxhZ3MgfD0gRVNQX1NUQVRfTkVWRVJfRE1BOwotCQkJZXNwX2Jhc2ljX2luaXQoaW5mbyk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCX0KLQl9Ci0KLQlpbmZvLT5jb25maWcucGlvX3RocmVzaG9sZCA9IG5ld19jb25maWcucGlvX3RocmVzaG9sZDsKLQotCWlmICgobmV3X2NvbmZpZy5mbG93X29mZiAhPSBpbmZvLT5jb25maWcuZmxvd19vZmYpIHx8Ci0JICAgIChuZXdfY29uZmlnLmZsb3dfb24gIT0gaW5mby0+Y29uZmlnLmZsb3dfb24pKSB7Ci0JCWluZm8tPmNvbmZpZy5mbG93X29mZiA9IG5ld19jb25maWcuZmxvd19vZmY7Ci0JCWluZm8tPmNvbmZpZy5mbG93X29uID0gbmV3X2NvbmZpZy5mbG93X29uOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9GTE9XX0xWTCk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgbmV3X2NvbmZpZy5mbG93X29mZiA+PiA4KTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBuZXdfY29uZmlnLmZsb3dfb2ZmKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBuZXdfY29uZmlnLmZsb3dfb24gPj4gOCk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgbmV3X2NvbmZpZy5mbG93X29uKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCX0KLQotCWlmICgobmV3X2NvbmZpZy5yeF90cmlnZ2VyICE9IGluZm8tPmNvbmZpZy5yeF90cmlnZ2VyKSB8fAotCSAgICAobmV3X2NvbmZpZy50eF90cmlnZ2VyICE9IGluZm8tPmNvbmZpZy50eF90cmlnZ2VyKSkgewotCQlpbmZvLT5jb25maWcucnhfdHJpZ2dlciA9IG5ld19jb25maWcucnhfdHJpZ2dlcjsKLQkJaW5mby0+Y29uZmlnLnR4X3RyaWdnZXIgPSBuZXdfY29uZmlnLnR4X3RyaWdnZXI7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9UUklHR0VSKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLAotCQkJICAgbmV3X2NvbmZpZy5yeF90cmlnZ2VyID4+IDgpOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIG5ld19jb25maWcucnhfdHJpZ2dlcik7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwKLQkJCSAgIG5ld19jb25maWcudHhfdHJpZ2dlciA+PiA4KTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBuZXdfY29uZmlnLnR4X3RyaWdnZXIpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JfQotCi0JaWYgKG5ld19jb25maWcucnhfdGltZW91dCAhPSBpbmZvLT5jb25maWcucnhfdGltZW91dCkgewotCQlpbmZvLT5jb25maWcucnhfdGltZW91dCA9IG5ld19jb25maWcucnhfdGltZW91dDsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAoaW5mby0+SUVSICYgVUFSVF9JRVJfUkRJKSB7Ci0JCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsCi0JCQkJICAgRVNJX1NFVF9SWF9USU1FT1VUKTsKLQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwKLQkJCQkgICBuZXdfY29uZmlnLnJ4X3RpbWVvdXQpOwotCQl9Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCX0KLQotCWlmICghKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCi0JCXJldHZhbCA9IHN0YXJ0dXAoaW5mbyk7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKgotICogZ2V0X2xzcl9pbmZvIC0gZ2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyIGluZm8KLSAqCi0gKiBQdXJwb3NlOiBMZXQgdXNlciBjYWxsIGlvY3RsKCkgdG8gZ2V0IGluZm8gd2hlbiB0aGUgVUFSVCBwaHlzaWNhbGx5Ci0gKiAJICAgIGlzIGVtcHRpZWQuICBPbiBidXMgdHlwZXMgbGlrZSBSUzQ4NSwgdGhlIHRyYW5zbWl0dGVyIG11c3QKLSAqIAkgICAgcmVsZWFzZSB0aGUgYnVzIGFmdGVyIHRyYW5zbWl0dGluZy4gVGhpcyBtdXN0IGJlIGRvbmUgd2hlbgotICogCSAgICB0aGUgdHJhbnNtaXQgc2hpZnQgcmVnaXN0ZXIgaXMgZW1wdHksIG5vdCBiZSBkb25lIHdoZW4gdGhlCi0gKiAJICAgIHRyYW5zbWl0IGhvbGRpbmcgcmVnaXN0ZXIgaXMgZW1wdHkuICBUaGlzIGZ1bmN0aW9uYWxpdHkKLSAqIAkgICAgYWxsb3dzIGFuIFJTNDg1IGRyaXZlciB0byBiZSB3cml0dGVuIGluIHVzZXIgc3BhY2UuCi0gKi8KLXN0YXRpYyBpbnQgZ2V0X2xzcl9pbmZvKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLCB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSkKLXsKLQl1bnNpZ25lZCBjaGFyIHN0YXR1czsKLQl1bnNpZ25lZCBpbnQgcmVzdWx0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX0dFVF9VQVJUX1NUQVQpOwotCXN0YXR1cyA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCXJlc3VsdCA9ICgoc3RhdHVzICYgVUFSVF9MU1JfVEVNVCkgPyBUSU9DU0VSX1RFTVQgOiAwKTsKLQlyZXR1cm4gcHV0X3VzZXIocmVzdWx0LCB2YWx1ZSk7Ci19Ci0KLQotc3RhdGljIGludCBlc3BfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGNoYXIgY29udHJvbCwgc3RhdHVzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgX19mdW5jX18pKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCi0JCXJldHVybiAtRUlPOwotCi0JY29udHJvbCA9IGluZm8tPk1DUjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1VBUlRfU1RBVCk7Ci0Jc3RhdHVzID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gICAgKChjb250cm9sICYgVUFSVF9NQ1JfUlRTKSA/IFRJT0NNX1JUUyA6IDApCi0JCXwgKChjb250cm9sICYgVUFSVF9NQ1JfRFRSKSA/IFRJT0NNX0RUUiA6IDApCi0JCXwgKChzdGF0dXMgICYgVUFSVF9NU1JfRENEKSA/IFRJT0NNX0NBUiA6IDApCi0JCXwgKChzdGF0dXMgICYgVUFSVF9NU1JfUkkpID8gVElPQ01fUk5HIDogMCkKLQkJfCAoKHN0YXR1cyAgJiBVQVJUX01TUl9EU1IpID8gVElPQ01fRFNSIDogMCkKLQkJfCAoKHN0YXR1cyAgJiBVQVJUX01TUl9DVFMpID8gVElPQ01fQ1RTIDogMCk7Ci19Ci0KLXN0YXRpYyBpbnQgZXNwX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQotewotCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsIF9fZnVuY19fKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQotCQlyZXR1cm4gLUVJTzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoc2V0ICYgVElPQ01fUlRTKQotCQlpbmZvLT5NQ1IgfD0gVUFSVF9NQ1JfUlRTOwotCWlmIChzZXQgJiBUSU9DTV9EVFIpCi0JCWluZm8tPk1DUiB8PSBVQVJUX01DUl9EVFI7Ci0KLQlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCi0JCWluZm8tPk1DUiAmPSB+VUFSVF9NQ1JfUlRTOwotCWlmIChjbGVhciAmIFRJT0NNX0RUUikKLQkJaW5mby0+TUNSICY9IH5VQVJUX01DUl9EVFI7Ci0KLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9XUklURV9VQVJUKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIFVBUlRfTUNSKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPk1DUik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiByc19icmVhaygpIC0tLSByb3V0aW5lIHdoaWNoIHR1cm5zIHRoZSBicmVhayBoYW5kbGluZyBvbiBvciBvZmYKLSAqLwotc3RhdGljIGludCBlc3BfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKQotewotCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJlc3BfYnJlYWsiKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfSVNTVUVfQlJFQUspOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MDEpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0KLQkJLyogRklYTUUgLSBuZXcgc3R5bGUgd2FpdCBuZWVkZWQgaGVyZSAqLwotCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5icmVha193YWl0KTsKLQl9IGVsc2UgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9JU1NVRV9CUkVBSyk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwMCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnNfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IGFzeW5jX2ljb3VudCBjcHJldiwgY25vdzsJLyoga2VybmVsIGNvdW50ZXIgdGVtcHMgKi8KLQlzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCBfX3VzZXIgKnBfY3VzZXI7CS8qIHVzZXIgc3BhY2UgKi8KLQl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQ7Ci0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2lvY3RsIikpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKChjbWQgIT0gVElPQ0dTRVJJQUwpICYmIChjbWQgIT0gVElPQ1NTRVJJQUwpICYmCi0JICAgIChjbWQgIT0gVElPQ1NFUkNPTkZJRykgJiYgKGNtZCAhPSBUSU9DU0VSR1dJTEQpICAmJgotCSAgICAoY21kICE9IFRJT0NTRVJTV0lMRCkgJiYgKGNtZCAhPSBUSU9DU0VSR1NUUlVDVCkgJiYKLQkgICAgKGNtZCAhPSBUSU9DTUlXQUlUKSAmJiAoY21kICE9IFRJT0NHSUNPVU5UKSAmJgotCSAgICAoY21kICE9IFRJT0NHSEFZRVNFU1ApICYmIChjbWQgIT0gVElPQ1NIQVlFU0VTUCkpIHsKLQkJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQotCQkgICAgcmV0dXJuIC1FSU87Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFRJT0NHU0VSSUFMOgotCQlyZXR1cm4gZ2V0X3NlcmlhbF9pbmZvKGluZm8sIGFyZ3ApOwotCWNhc2UgVElPQ1NTRVJJQUw6Ci0JCWxvY2tfa2VybmVsKCk7Ci0JCXJldCA9IHNldF9zZXJpYWxfaW5mbyhpbmZvLCBhcmdwKTsKLQkJdW5sb2NrX2tlcm5lbCgpOwotCQlyZXR1cm4gcmV0OwotCWNhc2UgVElPQ1NFUkdXSUxEOgotCQlyZXR1cm4gcHV0X3VzZXIoMEwsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZ3ApOwotCWNhc2UgVElPQ1NFUkdFVExTUjogLyogR2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyICovCi0JCXJldHVybiBnZXRfbHNyX2luZm8oaW5mbywgYXJncCk7Ci0JY2FzZSBUSU9DU0VSU1dJTEQ6Ci0JCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJCXJldHVybiAtRVBFUk07Ci0JCXJldHVybiAwOwotCS8qCi0JICogV2FpdCBmb3IgYW55IG9mIHRoZSA0IG1vZGVtIGlucHV0cyAoRENELFJJLERTUixDVFMpIHRvIGNoYW5nZQotCSAqIC0gbWFzayBwYXNzZWQgaW4gYXJnIGZvciBsaW5lcyBvZiBpbnRlcmVzdAotCSAqICAgKHVzZSB8J2VkIFRJT0NNX1JORy9EU1IvQ0QvQ1RTIGZvciBtYXNraW5nKQotCSAqIENhbGxlciBzaG91bGQgdXNlIFRJT0NHSUNPVU5UIHRvIHNlZSB3aGljaCBvbmUgaXQgd2FzCi0JICovCi0JY2FzZSBUSU9DTUlXQUlUOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQljcHJldiA9IGluZm8tPmljb3VudDsJLyogbm90ZSB0aGUgY291bnRlcnMgb24gZW50cnkgKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQl3aGlsZSAoMSkgewotCQkJLyogRklYTUU6IGNvbnZlcnQgdG8gbmV3IHN0eWxlIHdha2V1cCAqLwotCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmaW5mby0+cG9ydC5kZWx0YV9tc3Jfd2FpdCk7Ci0JCQkvKiBzZWUgaWYgYSBzaWduYWwgZGlkIGl0ICovCi0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCQljbm93ID0gaW5mby0+aWNvdW50OwkvKiBhdG9taWMgY29weSAqLwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQkJaWYgKGNub3cucm5nID09IGNwcmV2LnJuZyAmJgotCQkJICAgIGNub3cuZHNyID09IGNwcmV2LmRzciAmJgotCQkJICAgIGNub3cuZGNkID09IGNwcmV2LmRjZCAmJgotCQkJICAgIGNub3cuY3RzID09IGNwcmV2LmN0cykKLQkJCQlyZXR1cm4gLUVJTzsgLyogbm8gY2hhbmdlID0+IGVycm9yICovCi0JCQlpZiAoKChhcmcgJiBUSU9DTV9STkcpICYmCi0JCQkgICAgIChjbm93LnJuZyAhPSBjcHJldi5ybmcpKSB8fAotCQkJICAgICAoKGFyZyAmIFRJT0NNX0RTUikgJiYKLQkJCSAgICAgIChjbm93LmRzciAhPSBjcHJldi5kc3IpKSB8fAotCQkJICAgICAoKGFyZyAmIFRJT0NNX0NEKSAmJgotCQkJICAgICAgKGNub3cuZGNkICE9IGNwcmV2LmRjZCkpIHx8Ci0JCQkgICAgICgoYXJnICYgVElPQ01fQ1RTKSAmJgotCQkJICAgICAgKGNub3cuY3RzICE9IGNwcmV2LmN0cykpKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQljcHJldiA9IGNub3c7Ci0JCX0KLQkJLyogTk9UUkVBQ0hFRCAqLwotCS8qCi0JICogR2V0IGNvdW50ZXIgb2YgaW5wdXQgc2VyaWFsIGxpbmUgaW50ZXJydXB0cyAoRENELFJJLERTUixDVFMpCi0JICogUmV0dXJuOiB3cml0ZSBjb3VudGVycyB0byB0aGUgdXNlciBwYXNzZWQgY291bnRlciBzdHJ1Y3QKLQkgKiBOQjogYm90aCAxLT4wIGFuZCAwLT4xIHRyYW5zaXRpb25zIGFyZSBjb3VudGVkIGV4Y2VwdCBmb3IKLQkgKiAgICAgUkkgd2hlcmUgb25seSAwLT4xIGlzIGNvdW50ZWQuCi0JICovCi0JY2FzZSBUSU9DR0lDT1VOVDoKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJY25vdyA9IGluZm8tPmljb3VudDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQlwX2N1c2VyID0gYXJncDsKLQkJaWYgKHB1dF91c2VyKGNub3cuY3RzLCAmcF9jdXNlci0+Y3RzKSB8fAotCQkgICAgcHV0X3VzZXIoY25vdy5kc3IsICZwX2N1c2VyLT5kc3IpIHx8Ci0JCSAgICBwdXRfdXNlcihjbm93LnJuZywgJnBfY3VzZXItPnJuZykgfHwKLQkJICAgIHB1dF91c2VyKGNub3cuZGNkLCAmcF9jdXNlci0+ZGNkKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7Ci0JY2FzZSBUSU9DR0hBWUVTRVNQOgotCQlyZXR1cm4gZ2V0X2VzcF9jb25maWcoaW5mbywgYXJncCk7Ci0JY2FzZSBUSU9DU0hBWUVTRVNQOgotCQlsb2NrX2tlcm5lbCgpOwotCQlyZXQgPSBzZXRfZXNwX2NvbmZpZyhpbmZvLCBhcmdwKTsKLQkJdW5sb2NrX2tlcm5lbCgpOwotCQlyZXR1cm4gcmV0OwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCByc19zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQotewotCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JY2hhbmdlX3NwZWVkKGluZm8pOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQotCS8qIEhhbmRsZSB0cmFuc2l0aW9uIHRvIEIwIHN0YXR1cyAqLwotCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgJiYKLQkJISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkpIHsKLQkJaW5mby0+TUNSICY9IH4oVUFSVF9NQ1JfRFRSfFVBUlRfTUNSX1JUUyk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1dSSVRFX1VBUlQpOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIFVBUlRfTUNSKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5NQ1IpOwotCX0KLQotCS8qIEhhbmRsZSB0cmFuc2l0aW9uIGF3YXkgZnJvbSBCMCBzdGF0dXMgKi8KLQlpZiAoIShvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAmJgotCQkodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpKSB7Ci0JCWluZm8tPk1DUiB8PSAoVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfV1JJVEVfVUFSVCk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPk1DUik7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCi0JLyogSGFuZGxlIHR1cm5pbmcgb2YgQ1JUU0NUUyAqLwotCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgotCSAgICAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7Ci0JCXJzX3N0YXJ0KHR0eSk7Ci0JfQotfQotCi0vKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiByc19jbG9zZSgpCi0gKgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBzZXJpYWwgcG9ydCBnZXRzIGNsb3NlZC4gIEZpcnN0LCB3ZQotICogd2FpdCBmb3IgdGhlIGxhc3QgcmVtYWluaW5nIGRhdGEgdG8gYmUgc2VudC4gIFRoZW4sIHdlIHVubGluayBpdHMKLSAqIGFzeW5jIHN0cnVjdHVyZSBmcm9tIHRoZSBpbnRlcnJ1cHQgY2hhaW4gaWYgbmVjZXNzYXJ5LCBhbmQgd2UgZnJlZQotICogdGhhdCBJUlEgaWYgbm90aGluZyBpcyBsZWZ0IGluIHRoZSBjaGFpbi4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi1zdGF0aWMgdm9pZCByc19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghaW5mbyB8fCBzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfY2xvc2UiKSkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQotCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKSB7Ci0JCURCR19DTlQoImJlZm9yZSBERUMtaHVuZyIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLSNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgotCXByaW50ayhLRVJOX0RFQlVHICJyc19jbG9zZSB0dHlzJWQsIGNvdW50ID0gJWRcbiIsCi0JCQkJCQlpbmZvLT5saW5lLCBpbmZvLT5wb3J0LmNvdW50KTsKLSNlbmRpZgotCWlmICh0dHktPmNvdW50ID09IDEgJiYgaW5mby0+cG9ydC5jb3VudCAhPSAxKSB7Ci0JCS8qCi0JCSAqIFVoLCBvaC4gIHR0eS0+Y291bnQgaXMgMSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdHR5Ci0JCSAqIHN0cnVjdHVyZSB3aWxsIGJlIGZyZWVkLiAgSW5mby0+Y291bnQgc2hvdWxkIGFsd2F5cwotCQkgKiBiZSBvbmUgaW4gdGhlc2UgY29uZGl0aW9ucy4gIElmIGl0J3MgZ3JlYXRlciB0aGFuCi0JCSAqIG9uZSwgd2UndmUgZ290IHJlYWwgcHJvYmxlbXMsIHNpbmNlIGl0IG1lYW5zIHRoZQotCQkgKiBzZXJpYWwgcG9ydCB3b24ndCBiZSBzaHV0ZG93bi4KLQkJICovCi0JCXByaW50ayhLRVJOX0RFQlVHICJyc19jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50OyB0dHktPmNvdW50IGlzIDEsIGluZm8tPnBvcnQuY291bnQgaXMgJWRcbiIsIGluZm8tPnBvcnQuY291bnQpOwotCQlpbmZvLT5wb3J0LmNvdW50ID0gMTsKLQl9Ci0JaWYgKC0taW5mby0+cG9ydC5jb3VudCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJyc19jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50IGZvciB0dHlzJWQ6ICVkXG4iLAotCQkgICAgICAgaW5mby0+bGluZSwgaW5mby0+cG9ydC5jb3VudCk7Ci0JCWluZm8tPnBvcnQuY291bnQgPSAwOwotCX0KLQlpZiAoaW5mby0+cG9ydC5jb3VudCkgewotCQlEQkdfQ05UKCJiZWZvcmUgREVDLTIiKTsKLQkJZ290byBvdXQ7Ci0JfQotCWluZm8tPnBvcnQuZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkvKgotCSAqIE5vdyB3ZSB3YWl0IGZvciB0aGUgdHJhbnNtaXQgYnVmZmVyIHRvIGNsZWFyOyBhbmQgd2Ugbm90aWZ5Ci0JICogdGhlIGxpbmUgZGlzY2lwbGluZSB0byBvbmx5IHByb2Nlc3MgWE9OL1hPRkYgY2hhcmFjdGVycy4KLQkgKi8KLQl0dHktPmNsb3NpbmcgPSAxOwotCWlmIChpbmZvLT5jbG9zaW5nX3dhaXQgIT0gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUpCi0JCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT5jbG9zaW5nX3dhaXQpOwotCS8qCi0JICogQXQgdGhpcyBwb2ludCB3ZSBzdG9wIGFjY2VwdGluZyBpbnB1dC4gIFRvIGRvIHRoaXMsIHdlCi0JICogZGlzYWJsZSB0aGUgcmVjZWl2ZSBsaW5lIHN0YXR1cyBpbnRlcnJ1cHRzLCBhbmQgdGVsbCB0aGUKLQkgKiBpbnRlcnJ1cHQgZHJpdmVyIHRvIHN0b3AgY2hlY2tpbmcgdGhlIGRhdGEgcmVhZHkgYml0IGluIHRoZQotCSAqIGxpbmUgc3RhdHVzIHJlZ2lzdGVyLgotCSAqLwotCS8qIGluZm8tPklFUiAmPSB+VUFSVF9JRVJfUkxTSTsgKi8KLQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1JESTsKLQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrICY9IH5VQVJUX0xTUl9EUjsKLQlpZiAoaW5mby0+cG9ydC5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5JRVIpOwotCi0JCS8qIGRpc2FibGUgcmVjZWl2ZSB0aW1lb3V0ICovCi0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9SWF9USU1FT1VUKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAwKTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0KLQkJLyoKLQkJICogQmVmb3JlIHdlIGRyb3AgRFRSLCBtYWtlIHN1cmUgdGhlIFVBUlQgdHJhbnNtaXR0ZXIKLQkJICogaGFzIGNvbXBsZXRlbHkgZHJhaW5lZDsgdGhpcyBpcyBlc3BlY2lhbGx5Ci0JCSAqIGltcG9ydGFudCBpZiB0aGVyZSBpcyBhIHRyYW5zbWl0IEZJRk8hCi0JCSAqLwotCQlyc193YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT50aW1lb3V0KTsKLQl9Ci0Jc2h1dGRvd24oaW5mbyk7Ci0JcnNfZmx1c2hfYnVmZmVyKHR0eSk7Ci0JdHR5X2xkaXNjX2ZsdXNoKHR0eSk7Ci0JdHR5LT5jbG9zaW5nID0gMDsKLQlpbmZvLT5wb3J0LnR0eSA9IE5VTEw7Ci0KLQlpZiAoaW5mby0+cG9ydC5ibG9ja2VkX29wZW4pIHsKLQkJaWYgKGluZm8tPmNsb3NlX2RlbGF5KQotCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhpbmZvLT5jbG9zZV9kZWxheSkpOwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPnBvcnQub3Blbl93YWl0KTsKLQl9Ci0JaW5mby0+cG9ydC5mbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkV8QVNZTkNfQ0xPU0lORyk7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5wb3J0LmNsb3NlX3dhaXQpOwotCXJldHVybjsKLQotb3V0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgcnNfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQotewotCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIG9yaWdfamlmZmllcywgY2hhcl90aW1lOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3dhaXRfdW50aWxfc2VudCIpKQotCQlyZXR1cm47Ci0KLQlvcmlnX2ppZmZpZXMgPSBqaWZmaWVzOwotCWNoYXJfdGltZSA9ICgoaW5mby0+dGltZW91dCAtIEhaIC8gNTApIC8gMTAyNCkgLyA1OwotCi0JaWYgKCFjaGFyX3RpbWUpCi0JCWNoYXJfdGltZSA9IDE7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX05PX0NPTU1BTkQpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX0dFVF9UWF9BVkFJTCk7Ci0KLQl3aGlsZSAoKHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMSkgIT0gMHgwMykgfHwKLQkJKHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMikgIT0gMHhmZikpIHsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoY2hhcl90aW1lKSk7Ci0KLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJcmV0dXJuOwotCi0JCWlmICh0aW1lb3V0ICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgb3JpZ19qaWZmaWVzICsgdGltZW91dCkpCi0JCQlyZXR1cm47Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfTk9fQ09NTUFORCk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX0dFVF9UWF9BVkFJTCk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotfQotCi0vKgotICogZXNwX2hhbmd1cCgpIC0tLSBjYWxsZWQgYnkgdHR5X2hhbmd1cCgpIHdoZW4gYSBoYW5ndXAgaXMgc2lnbmFsZWQuCi0gKi8KLXN0YXRpYyB2b2lkIGVzcF9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImVzcF9oYW5ndXAiKSkKLQkJcmV0dXJuOwotCi0JcnNfZmx1c2hfYnVmZmVyKHR0eSk7Ci0Jc2h1dGRvd24oaW5mbyk7Ci0JaW5mby0+cG9ydC5jb3VudCA9IDA7Ci0JaW5mby0+cG9ydC5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKLQlpbmZvLT5wb3J0LnR0eSA9IE5VTEw7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5wb3J0Lm9wZW5fd2FpdCk7Ci19Ci0KLXN0YXRpYyBpbnQgZXNwX2NhcnJpZXJfcmFpc2VkKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKLXsKLQlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgZXNwX3N0cnVjdCwgcG9ydCk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1VBUlRfU1RBVCk7Ci0JaWYgKHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMikgJiBVQVJUX01TUl9EQ0QpCi0JCXJldHVybiAxOwotCXJldHVybiAwOwotfQotCi0vKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBlc3Bfb3BlbigpIGFuZCBmcmllbmRzCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotc3RhdGljIGludCBibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkgICBzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbykKLXsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQlpbnQJCXJldHZhbDsKLQlpbnQJCWRvX2Nsb2NhbCA9IDA7Ci0JdW5zaWduZWQgbG9uZwlmbGFnczsKLQlpbnQJCWNkOwotCXN0cnVjdCB0dHlfcG9ydCAqcG9ydCA9ICZpbmZvLT5wb3J0OwotCi0JLyoKLQkgKiBJZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBtaWRkbGUgb2YgYmVpbmcgY2xvc2VkLCB0aGVuIGJsb2NrCi0JICogdW50aWwgaXQncyBkb25lLCBhbmQgdGhlbiB0cnkgYWdhaW4uCi0JICovCi0JaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKLQkgICAgKHBvcnQtPmZsYWdzICYgQVNZTkNfQ0xPU0lORykpIHsKLQkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfQ0xPU0lORykKLQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnBvcnQtPmNsb3NlX3dhaXQpOwotI2lmZGVmIFNFUklBTF9ET19SRVNUQVJUCi0JCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCi0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJZWxzZQotCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLSNlbHNlCi0JCXJldHVybiAtRUFHQUlOOwotI2VuZGlmCi0JfQotCi0JLyoKLQkgKiBJZiBub24tYmxvY2tpbmcgbW9kZSBpcyBzZXQsIG9yIHRoZSBwb3J0IGlzIG5vdCBlbmFibGVkLAotCSAqIHRoZW4gbWFrZSB0aGUgY2hlY2sgdXAgZnJvbnQgYW5kIHRoZW4gZXhpdC4KLQkgKi8KLQlpZiAoKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fAotCSAgICAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7Ci0JCXBvcnQtPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpCi0JCWRvX2Nsb2NhbCA9IDE7Ci0KLQkvKgotCSAqIEJsb2NrIHdhaXRpbmcgZm9yIHRoZSBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lCi0JICogZnJlZSAoaS5lLiwgbm90IGluIHVzZSBieSB0aGUgY2FsbG91dCkuICBXaGlsZSB3ZSBhcmUgaW4KLQkgKiB0aGlzIGxvb3AsIHBvcnQtPmNvdW50IGlzIGRyb3BwZWQgYnkgb25lLCBzbyB0aGF0Ci0JICogcnNfY2xvc2UoKSBrbm93cyB3aGVuIHRvIGZyZWUgdGhpbmdzLiAgV2UgcmVzdG9yZSBpdCB1cG9uCi0JICogZXhpdCwgZWl0aGVyIG5vcm1hbCBvciBhYm5vcm1hbC4KLQkgKi8KLQlyZXR2YWwgPSAwOwotCWFkZF93YWl0X3F1ZXVlKCZwb3J0LT5vcGVuX3dhaXQsICZ3YWl0KTsKLSNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgotCXByaW50ayhLRVJOX0RFQlVHICJibG9ja190aWxfcmVhZHkgYmVmb3JlIGJsb2NrOiB0dHlzJWQsIGNvdW50ID0gJWRcbiIsCi0JICAgICAgIGluZm8tPmxpbmUsIHBvcnQtPmNvdW50KTsKLSNlbmRpZgotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKQotCQlwb3J0LT5jb3VudC0tOwotCXBvcnQtPmJsb2NrZWRfb3BlbisrOwotCXdoaWxlICgxKSB7Ci0JCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpKSB7Ci0JCQl1bnNpZ25lZCBpbnQgc2NyYXRjaDsKLQotCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfUkVBRF9VQVJUKTsKLQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOwotCQkJc2NyYXRjaCA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMSk7Ci0JCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9XUklURV9VQVJUKTsKLQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOwotCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLAotCQkJCXNjcmF0Y2ggfCBVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMpOwotCQl9Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8Ci0JCSAgICAhKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7Ci0jaWZkZWYgU0VSSUFMX0RPX1JFU1RBUlQKLQkJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCi0JCQkJcmV0dmFsID0gLUVBR0FJTjsKLQkJCWVsc2UKLQkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7Ci0jZWxzZQotCQkJcmV0dmFsID0gLUVBR0FJTjsKLSNlbmRpZgotCQkJYnJlYWs7Ci0JCX0KLQotCQljZCA9IHR0eV9wb3J0X2NhcnJpZXJfcmFpc2VkKHBvcnQpOwotCi0JCWlmICghKHBvcnQtPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgJiYKLQkJICAgIChkb19jbG9jYWwpKQotCQkJYnJlYWs7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOwotCQkJYnJlYWs7Ci0JCX0KLSNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgotCQlwcmludGsoS0VSTl9ERUJVRyAiYmxvY2tfdGlsX3JlYWR5IGJsb2NraW5nOiB0dHlzJWQsIGNvdW50ID0gJWRcbiIsCi0JCSAgICAgICBpbmZvLT5saW5lLCBwb3J0LT5jb3VudCk7Ci0jZW5kaWYKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQlzY2hlZHVsZSgpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCX0KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZwb3J0LT5vcGVuX3dhaXQsICZ3YWl0KTsKLQlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCi0JCXBvcnQtPmNvdW50Kys7Ci0JcG9ydC0+YmxvY2tlZF9vcGVuLS07Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCi0JcHJpbnRrKEtFUk5fREVCVUcgImJsb2NrX3RpbF9yZWFkeSBhZnRlciBibG9ja2luZzogdHR5cyVkLCBjb3VudCA9ICVkXG4iLAotCSAgICAgICBpbmZvLT5saW5lLCBwb3J0LT5jb3VudCk7Ci0jZW5kaWYKLQlpZiAocmV0dmFsKQotCQlyZXR1cm4gcmV0dmFsOwotCXBvcnQtPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW5ldmVyIGEgc2VyaWFsIHBvcnQgaXMgb3BlbmVkLiAgSXQKLSAqIGVuYWJsZXMgaW50ZXJydXB0cyBmb3IgYSBzZXJpYWwgcG9ydCwgbGlua2luZyBpbiBpdHMgYXN5bmMgc3RydWN0dXJlIGludG8KLSAqIHRoZSBJUlEgY2hhaW4uICAgSXQgYWxzbyBwZXJmb3JtcyB0aGUgc2VyaWFsLXNwZWNpZmljCi0gKiBpbml0aWFsaXphdGlvbiBmb3IgdGhlIHR0eSBzdHJ1Y3R1cmUuCi0gKi8KLXN0YXRpYyBpbnQgZXNwX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCi17Ci0Jc3RydWN0IGVzcF9zdHJ1Y3QJKmluZm87Ci0JaW50IAkJCXJldHZhbCwgbGluZTsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQotCWxpbmUgPSB0dHktPmluZGV4OwotCWlmICgobGluZSA8IDApIHx8IChsaW5lID49IE5SX1BPUlRTKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKiBmaW5kIHRoZSBwb3J0IGluIHRoZSBjaGFpbiAqLwotCi0JaW5mbyA9IHBvcnRzOwotCi0Jd2hpbGUgKGluZm8gJiYgKGluZm8tPmxpbmUgIT0gbGluZSkpCi0JCWluZm8gPSBpbmZvLT5uZXh0X3BvcnQ7Ci0KLQlpZiAoIWluZm8pIHsKLQkJc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImVzcF9vcGVuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCi0JcHJpbnRrKEtFUk5fREVCVUcgImVzcF9vcGVuICVzLCBjb3VudCA9ICVkXG4iLCB0dHktPm5hbWUsIGluZm8tPnBvcnQuY291bnQpOwotI2VuZGlmCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlpbmZvLT5wb3J0LmNvdW50Kys7Ci0JdHR5LT5kcml2ZXJfZGF0YSA9IGluZm87Ci0JaW5mby0+cG9ydC50dHkgPSB0dHk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0KLQkvKgotCSAqIFN0YXJ0IHVwIHNlcmlhbCBwb3J0Ci0JICovCi0JcmV0dmFsID0gc3RhcnR1cChpbmZvKTsKLQlpZiAocmV0dmFsKQotCQlyZXR1cm4gcmV0dmFsOwotCi0JcmV0dmFsID0gYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgaW5mbyk7Ci0JaWYgKHJldHZhbCkgewotI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCi0JCXByaW50ayhLRVJOX0RFQlVHICJlc3Bfb3BlbiByZXR1cm5pbmcgYWZ0ZXIgYmxvY2tfdGlsX3JlYWR5IHdpdGggJWRcbiIsCi0JCSAgICAgICByZXR2YWwpOwotI2VuZGlmCi0JCXJldHVybiByZXR2YWw7Ci0JfQotI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCi0JcHJpbnRrKEtFUk5fREVCVUcgImVzcF9vcGVuICVzIHN1Y2Nlc3NmdWwuLi4iLCB0dHktPm5hbWUpOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIGVzcHNlcmlhbF9pbml0KCkgYW5kIGZyaWVuZHMKLSAqCi0gKiBlc3BzZXJpYWxfaW5pdCgpIGlzIGNhbGxlZCBhdCBib290LXRpbWUgdG8gaW5pdGlhbGl6ZSB0aGUgc2VyaWFsIGRyaXZlci4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgcHJpbnRzIG91dCB0aGUgYXBwcm9wcmlhdGUgc2VyaWFsIGRyaXZlciB2ZXJzaW9uCi0gKiBudW1iZXIsIGFuZCBpZGVudGlmaWVzIHdoaWNoIG9wdGlvbnMgd2VyZSBjb25maWd1cmVkIGludG8gdGhpcwotICogZHJpdmVyLgotICovCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBzaG93X3NlcmlhbF92ZXJzaW9uKHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXMgdmVyc2lvbiAlcyAoRE1BICV1KVxuIiwKLQkJc2VyaWFsX25hbWUsIHNlcmlhbF92ZXJzaW9uLCBkbWEpOwotfQotCi0vKgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBlc3BzZXJpYWxfaW5pdCgpIHRvIGluaXRpYWxpemUgYSBzcGVjaWZpYyBzZXJpYWwKLSAqIHBvcnQuCi0gKi8KLXN0YXRpYyBpbnQgYXV0b2NvbmZpZyhzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbykKLXsKLQlpbnQgcG9ydF9kZXRlY3RlZCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghcmVxdWVzdF9yZWdpb24oaW5mby0+aW9fcG9ydCwgUkVHSU9OX1NJWkUsICJlc3Agc2VyaWFsIikpCi0JCXJldHVybiAtRUlPOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkvKgotCSAqIENoZWNrIGZvciBFU1AgY2FyZAotCSAqLwotCi0JaWYgKHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9CQVNFKSA9PSAweGYzKSB7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgMHgwMCk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgMHgwMSk7Ci0KLQkJaWYgKChzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDIpICYgMHg3MCkgPT0gMHgyMCkgewotCQkJcG9ydF9kZXRlY3RlZCA9IDE7Ci0KLQkJCWlmICghKGluZm8tPmlycSkpIHsKLQkJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIDB4MDIpOwotCi0JCQkJaWYgKHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMSkgJiAweDAxKQotCQkJCQlpbmZvLT5pcnEgPSAzOwotCQkJCWVsc2UKLQkJCQkJaW5mby0+aXJxID0gNDsKLQkJCX0KLQotCi0JCQkvKiBwdXQgY2FyZCBpbiBlbmhhbmNlZCBtb2RlICovCi0JCQkvKiB0aGlzIHByZXZlbnRzIGFjY2VzcyB0aHJvdWdoICovCi0JCQkvKiB0aGUgIm9sZCIgSU8gcG9ydHMgKi8KLQkJCWVzcF9iYXNpY19pbml0KGluZm8pOwotCi0JCQkvKiBjbGVhciBvdXQgTUNSICovCi0JCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9XUklURV9VQVJUKTsKLQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOwotCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAwKTsKLQkJfQotCX0KLQlpZiAoIXBvcnRfZGV0ZWN0ZWQpCi0JCXJlbGVhc2VfcmVnaW9uKGluZm8tPmlvX3BvcnQsIFJFR0lPTl9TSVpFKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gKHBvcnRfZGV0ZWN0ZWQpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9vcGVyYXRpb25zIGVzcF9vcHMgPSB7Ci0JLm9wZW4gPSBlc3Bfb3BlbiwKLQkuY2xvc2UgPSByc19jbG9zZSwKLQkud3JpdGUgPSByc193cml0ZSwKLQkucHV0X2NoYXIgPSByc19wdXRfY2hhciwKLQkuZmx1c2hfY2hhcnMgPSByc19mbHVzaF9jaGFycywKLQkud3JpdGVfcm9vbSA9IHJzX3dyaXRlX3Jvb20sCi0JLmNoYXJzX2luX2J1ZmZlciA9IHJzX2NoYXJzX2luX2J1ZmZlciwKLQkuZmx1c2hfYnVmZmVyID0gcnNfZmx1c2hfYnVmZmVyLAotCS5pb2N0bCA9IHJzX2lvY3RsLAotCS50aHJvdHRsZSA9IHJzX3Rocm90dGxlLAotCS51bnRocm90dGxlID0gcnNfdW50aHJvdHRsZSwKLQkuc2V0X3Rlcm1pb3MgPSByc19zZXRfdGVybWlvcywKLQkuc3RvcCA9IHJzX3N0b3AsCi0JLnN0YXJ0ID0gcnNfc3RhcnQsCi0JLmhhbmd1cCA9IGVzcF9oYW5ndXAsCi0JLmJyZWFrX2N0bCA9IGVzcF9icmVhaywKLQkud2FpdF91bnRpbF9zZW50ID0gcnNfd2FpdF91bnRpbF9zZW50LAotCS50aW9jbWdldCA9IGVzcF90aW9jbWdldCwKLQkudGlvY21zZXQgPSBlc3BfdGlvY21zZXQsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9wb3J0X29wZXJhdGlvbnMgZXNwX3BvcnRfb3BzID0gewotCS5lc3BfY2Fycmllcl9yYWlzZWQsCi19OwotCi0vKgotICogVGhlIHNlcmlhbCBkcml2ZXIgYm9vdC10aW1lIGluaXRpYWxpemF0aW9uIGNvZGUhCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGVzcHNlcmlhbF9pbml0KHZvaWQpCi17Ci0JaW50IGksIG9mZnNldDsKLQlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbzsKLQlzdHJ1Y3QgZXNwX3N0cnVjdCAqbGFzdF9wcmltYXJ5ID0gTlVMTDsKLQlpbnQgZXNwW10gPSB7IDB4MTAwLCAweDE0MCwgMHgxODAsIDB4MjAwLCAweDI0MCwgMHgyODAsIDB4MzAwLCAweDM4MCB9OwotCi0JZXNwX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTlJfUE9SVFMpOwotCWlmICghZXNwX2RyaXZlcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfUFJJTUFSWTsgaSsrKSB7Ci0JCWlmIChpcnFbaV0gIT0gMCkgewotCQkJaWYgKChpcnFbaV0gPCAyKSB8fCAoaXJxW2ldID4gMTUpIHx8IChpcnFbaV0gPT0gNikgfHwKLQkJCSAgICAoaXJxW2ldID09IDgpIHx8IChpcnFbaV0gPT0gMTMpKQotCQkJCWlycVtpXSA9IDA7Ci0JCQllbHNlIGlmIChpcnFbaV0gPT0gMikKLQkJCQlpcnFbaV0gPSA5OwotCQl9Ci0JfQotCi0JaWYgKChkbWEgIT0gMSkgJiYgKGRtYSAhPSAzKSkKLQkJZG1hID0gMDsKLQotCWlmICgocnhfdHJpZ2dlciA8IDEpIHx8IChyeF90cmlnZ2VyID4gMTAyMykpCi0JCXJ4X3RyaWdnZXIgPSA3Njg7Ci0KLQlpZiAoKHR4X3RyaWdnZXIgPCAxKSB8fCAodHhfdHJpZ2dlciA+IDEwMjMpKQotCQl0eF90cmlnZ2VyID0gNzY4OwotCi0JaWYgKChmbG93X29mZiA8IDEpIHx8IChmbG93X29mZiA+IDEwMjMpKQotCQlmbG93X29mZiA9IDEwMTY7Ci0KLQlpZiAoKGZsb3dfb24gPCAxKSB8fCAoZmxvd19vbiA+IDEwMjMpKQotCQlmbG93X29uID0gOTQ0OwotCi0JaWYgKChyeF90aW1lb3V0IDwgMCkgfHwgKHJ4X3RpbWVvdXQgPiAyNTUpKQotCQlyeF90aW1lb3V0ID0gMTI4OwotCi0JaWYgKGZsb3dfb24gPj0gZmxvd19vZmYpCi0JCWZsb3dfb24gPSBmbG93X29mZiAtIDE7Ci0KLQlzaG93X3NlcmlhbF92ZXJzaW9uKCk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSB0dHlfZHJpdmVyIHN0cnVjdHVyZSAqLwotCi0JZXNwX2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKLQllc3BfZHJpdmVyLT5uYW1lID0gInR0eVAiOwotCWVzcF9kcml2ZXItPm1ham9yID0gRVNQX0lOX01BSk9SOwotCWVzcF9kcml2ZXItPm1pbm9yX3N0YXJ0ID0gMDsKLQllc3BfZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKLQllc3BfZHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOwotCWVzcF9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKLQllc3BfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9Ci0JCUI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKLQllc3BfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19pc3BlZWQgPSA5NjAwOwotCWVzcF9kcml2ZXItPmluaXRfdGVybWlvcy5jX29zcGVlZCA9IDk2MDA7Ci0JZXNwX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOwotCXR0eV9zZXRfb3BlcmF0aW9ucyhlc3BfZHJpdmVyLCAmZXNwX29wcyk7Ci0JaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIoZXNwX2RyaXZlcikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCByZWdpc3RlciBlc3Agc2VyaWFsIGRyaXZlciIpOwotCQlwdXRfdHR5X2RyaXZlcihlc3BfZHJpdmVyKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlc3Bfc3RydWN0KSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIWluZm8pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGVzcCBzZXJpYWwgZGV2aWNlIGluZm9ybWF0aW9uXG4iKTsKLQkJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGVzcF9kcml2ZXIpOwotCQlwdXRfdHR5X2RyaXZlcihlc3BfZHJpdmVyKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0Jc3Bpbl9sb2NrX2luaXQoJmluZm8tPmxvY2spOwotCS8qIHJ4X3RyaWdnZXIsIHR4X3RyaWdnZXIgYXJlIG5lZWRlZCBieSBhdXRvY29uZmlnICovCi0JaW5mby0+Y29uZmlnLnJ4X3RyaWdnZXIgPSByeF90cmlnZ2VyOwotCWluZm8tPmNvbmZpZy50eF90cmlnZ2VyID0gdHhfdHJpZ2dlcjsKLQotCWkgPSAwOwotCW9mZnNldCA9IDA7Ci0KLQlkbyB7Ci0JCXR0eV9wb3J0X2luaXQoJmluZm8tPnBvcnQpOwotCQlpbmZvLT5wb3J0Lm9wcyA9ICZlc3BfcG9ydF9vcHM7Ci0JCWluZm8tPmlvX3BvcnQgPSBlc3BbaV0gKyBvZmZzZXQ7Ci0JCWluZm8tPmlycSA9IGlycVtpXTsKLQkJaW5mby0+bGluZSA9IChpICogOCkgKyAob2Zmc2V0IC8gOCk7Ci0KLQkJaWYgKCFhdXRvY29uZmlnKGluZm8pKSB7Ci0JCQlpKys7Ci0JCQlvZmZzZXQgPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpbmZvLT5jdXN0b21fZGl2aXNvciA9IChkaXZpc29yW2ldID4+IChvZmZzZXQgLyAyKSkgJiAweGY7Ci0JCWluZm8tPnBvcnQuZmxhZ3MgPSBTVERfQ09NX0ZMQUdTOwotCQlpZiAoaW5mby0+Y3VzdG9tX2Rpdmlzb3IpCi0JCQlpbmZvLT5wb3J0LmZsYWdzIHw9IEFTWU5DX1NQRF9DVVNUOwotCQlpbmZvLT5tYWdpYyA9IEVTUF9NQUdJQzsKLQkJaW5mby0+Y2xvc2VfZGVsYXkgPSA1KkhaLzEwOwotCQlpbmZvLT5jbG9zaW5nX3dhaXQgPSAzMCpIWjsKLQkJaW5mby0+Y29uZmlnLnJ4X3RpbWVvdXQgPSByeF90aW1lb3V0OwotCQlpbmZvLT5jb25maWcuZmxvd19vbiA9IGZsb3dfb247Ci0JCWluZm8tPmNvbmZpZy5mbG93X29mZiA9IGZsb3dfb2ZmOwotCQlpbmZvLT5jb25maWcucGlvX3RocmVzaG9sZCA9IHBpb190aHJlc2hvbGQ7Ci0JCWluZm8tPm5leHRfcG9ydCA9IHBvcnRzOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5icmVha193YWl0KTsKLQkJcG9ydHMgPSBpbmZvOwotCQlwcmludGsoS0VSTl9JTkZPICJ0dHlQJWQgYXQgMHglMDR4IChpcnEgPSAlZCkgaXMgYW4gRVNQICIsCi0JCQlpbmZvLT5saW5lLCBpbmZvLT5pb19wb3J0LCBpbmZvLT5pcnEpOwotCi0JCWlmIChpbmZvLT5saW5lICUgOCkgewotCQkJcHJpbnRrKCJzZWNvbmRhcnkgcG9ydFxuIik7Ci0JCQkvKiA4IHBvcnQgY2FyZHMgY2FuJ3QgZG8gRE1BICovCi0JCQlpbmZvLT5zdGF0X2ZsYWdzIHw9IEVTUF9TVEFUX05FVkVSX0RNQTsKLQotCQkJaWYgKGxhc3RfcHJpbWFyeSkKLQkJCQlsYXN0X3ByaW1hcnktPnN0YXRfZmxhZ3MgfD0gRVNQX1NUQVRfTkVWRVJfRE1BOwotCQl9IGVsc2UgewotCQkJcHJpbnRrKCJwcmltYXJ5IHBvcnRcbiIpOwotCQkJbGFzdF9wcmltYXJ5ID0gaW5mbzsKLQkJCWlycVtpXSA9IGluZm8tPmlycTsKLQkJfQotCi0JCWlmICghZG1hKQotCQkJaW5mby0+c3RhdF9mbGFncyB8PSBFU1BfU1RBVF9ORVZFUl9ETUE7Ci0KLQkJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlc3Bfc3RydWN0KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghaW5mbykgewotCQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGVzcCBzZXJpYWwgZGV2aWNlIGluZm9ybWF0aW9uXG4iKTsKLQkJCS8qIGFsbG93IHVzZSBvZiB0aGUgYWxyZWFkeSBkZXRlY3RlZCBwb3J0cyAqLwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlzcGluX2xvY2tfaW5pdCgmaW5mby0+bG9jayk7Ci0JCS8qIHJ4X3RyaWdnZXIsIHR4X3RyaWdnZXIgYXJlIG5lZWRlZCBieSBhdXRvY29uZmlnICovCi0JCWluZm8tPmNvbmZpZy5yeF90cmlnZ2VyID0gcnhfdHJpZ2dlcjsKLQkJaW5mby0+Y29uZmlnLnR4X3RyaWdnZXIgPSB0eF90cmlnZ2VyOwotCi0JCWlmIChvZmZzZXQgPT0gNTYpIHsKLQkJCWkrKzsKLQkJCW9mZnNldCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlvZmZzZXQgKz0gODsKLQkJfQotCX0gd2hpbGUgKGkgPCBOUl9QUklNQVJZKTsKLQotCS8qIGZyZWUgdGhlIGxhc3QgcG9ydCBtZW1vcnkgYWxsb2NhdGlvbiAqLwotCWtmcmVlKGluZm8pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBlc3BzZXJpYWxfZXhpdCh2b2lkKQotewotCWludCBlMTsKLQlzdHJ1Y3QgZXNwX3N0cnVjdCAqdGVtcF9hc3luYzsKLQlzdHJ1Y3QgZXNwX3Bpb19idWZmZXIgKnBpb19idWY7Ci0KLQllMSA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihlc3BfZHJpdmVyKTsKLQlpZiAoZTEpCi0JCXByaW50ayhLRVJOX0VSUiAiZXNwOiBmYWlsZWQgdG8gdW5yZWdpc3RlciBkcml2ZXIgKCVkKVxuIiwgZTEpOwotCXB1dF90dHlfZHJpdmVyKGVzcF9kcml2ZXIpOwotCi0Jd2hpbGUgKHBvcnRzKSB7Ci0JCWlmIChwb3J0cy0+aW9fcG9ydCkKLQkJCXJlbGVhc2VfcmVnaW9uKHBvcnRzLT5pb19wb3J0LCBSRUdJT05fU0laRSk7Ci0JCXRlbXBfYXN5bmMgPSBwb3J0cy0+bmV4dF9wb3J0OwotCQlrZnJlZShwb3J0cyk7Ci0JCXBvcnRzID0gdGVtcF9hc3luYzsKLQl9Ci0KLQlpZiAoZG1hX2J1ZmZlcikKLQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylkbWFfYnVmZmVyLAotCQkJZ2V0X29yZGVyKERNQV9CVUZGRVJfU1opKTsKLQotCXdoaWxlIChmcmVlX3Bpb19idWYpIHsKLQkJcGlvX2J1ZiA9IGZyZWVfcGlvX2J1Zi0+bmV4dDsKLQkJa2ZyZWUoZnJlZV9waW9fYnVmKTsKLQkJZnJlZV9waW9fYnVmID0gcGlvX2J1ZjsKLQl9Ci19Ci0KLW1vZHVsZV9pbml0KGVzcHNlcmlhbF9pbml0KTsKLW1vZHVsZV9leGl0KGVzcHNlcmlhbF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNfeGVuLmMgYi9kcml2ZXJzL2NoYXIvaHZjX3hlbi5jCmluZGV4IGE2ZWUzMmIuLmIxYTcxNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9odmNfeGVuLmMKKysrIGIvZHJpdmVycy9jaGFyL2h2Y194ZW4uYwpAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KKworI2luY2x1ZGUgPHhlbi94ZW4uaD4KICNpbmNsdWRlIDx4ZW4vcGFnZS5oPgogI2luY2x1ZGUgPHhlbi9ldmVudHMuaD4KICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL2lvL2NvbnNvbGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pc2ljb20uYyBiL2RyaXZlcnMvY2hhci9pc2ljb20uYwppbmRleCA0MjZiZmRkLi4zMDBkNWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXNpY29tLmMKKysrIGIvZHJpdmVycy9jaGFyL2lzaWNvbS5jCkBAIC03OTMsMzUgKzc5MywzMCBAQAogewogCWludCBjaGFubmVsOwogCXN0cnVjdCBpc2lfcG9ydCAqcG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5jYXJkX2xvY2ssIGZsYWdzKTsKLQlpZiAoYnAtPnN0YXR1cyAmIEJPQVJEX0FDVElWRSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+Y2FyZF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKKwlicC0+Y291bnQrKzsKKwlpZiAoIShicC0+c3RhdHVzICYgQk9BUkRfSU5JVCkpIHsKKwkJcG9ydCA9IGJwLT5wb3J0czsKKwkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGJwLT5wb3J0X2NvdW50OyBjaGFubmVsKyssIHBvcnQrKykKKwkJCWRyb3BfZHRyX3J0cyhwb3J0KTsKIAl9Ci0JcG9ydCA9IGJwLT5wb3J0czsKLQlicC0+c3RhdHVzIHw9IEJPQVJEX0FDVElWRTsKLQlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgYnAtPnBvcnRfY291bnQ7IGNoYW5uZWwrKywgcG9ydCsrKQotCQlkcm9wX2R0cl9ydHMocG9ydCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmNhcmRfbG9jaywgZmxhZ3MpOworCWJwLT5zdGF0dXMgfD0gQk9BUkRfQUNUSVZFIHwgQk9BUkRfSU5JVDsKIH0KIAotc3RhdGljIGludCBpc2ljb21fc2V0dXBfcG9ydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQorLyogQWN0aXZhdGUgYW5kIHRodXMgc2V0dXAgYm9hcmQgYXJlIHByb3RlY3RlZCBmcm9tIHJhY2VzIGFnYWluc3Qgc2h1dGRvd24KKyAgIGJ5IHRoZSB0dHlfcG9ydCBtdXRleCAqLworCitzdGF0aWMgaW50IGlzaWNvbV9hY3RpdmF0ZShzdHJ1Y3QgdHR5X3BvcnQgKnRwb3J0LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBpc2lfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaV9wb3J0ICpwb3J0ID0gY29udGFpbmVyX29mKHRwb3J0LCBzdHJ1Y3QgaXNpX3BvcnQsIHBvcnQpOwogCXN0cnVjdCBpc2lfYm9hcmQgKmNhcmQgPSBwb3J0LT5jYXJkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAocG9ydC0+cG9ydC5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKQotCQlyZXR1cm4gMDsKLQlpZiAodHR5X3BvcnRfYWxsb2NfeG1pdF9idWYoJnBvcnQtPnBvcnQpIDwgMCkKKwlpZiAodHR5X3BvcnRfYWxsb2NfeG1pdF9idWYodHBvcnQpIDwgMCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Ci0JY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOwotCWlmIChwb3J0LT5wb3J0LmNvdW50ID09IDEpCi0JCWNhcmQtPmNvdW50Kys7CisJaXNpY29tX3NldHVwX2JvYXJkKGNhcmQpOwogCiAJcG9ydC0+eG1pdF9jbnQgPSBwb3J0LT54bWl0X2hlYWQgPSBwb3J0LT54bWl0X3RhaWwgPSAwOwogCkBAIC04MzIsOSArODI3LDcgQEAKIAkJb3V0dygoKElTSUNPTV9LSUxMVFggfCBJU0lDT01fS0lMTFJYKSA8PCA4KSB8IDB4MDYsIGNhcmQtPmJhc2UpOwogCQlJbnRlcnJ1cHRUaGVDYXJkKGNhcmQtPmJhc2UpOwogCX0KLQogCWlzaWNvbV9jb25maWdfcG9ydCh0dHkpOwotCXBvcnQtPnBvcnQuZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKQEAgLTg3MSw4NSArODY0LDM3IEBACiAKIAlyZXR1cm4gJnBvcnQtPnBvcnQ7CiB9Ci0JCisKIHN0YXRpYyBpbnQgaXNpY29tX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJc3RydWN0IGlzaV9wb3J0ICpwb3J0OwogCXN0cnVjdCBpc2lfYm9hcmQgKmNhcmQ7CiAJc3RydWN0IHR0eV9wb3J0ICp0cG9ydDsKLQlpbnQgZXJyb3IgPSAwOwogCiAJdHBvcnQgPSBpc2ljb21fZmluZF9wb3J0KHR0eSk7CiAJaWYgKHRwb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCXBvcnQgPSBjb250YWluZXJfb2YodHBvcnQsIHN0cnVjdCBpc2lfcG9ydCwgcG9ydCk7CiAJY2FyZCA9ICZpc2lfY2FyZFtCT0FSRCh0dHktPmluZGV4KV07Ci0JaXNpY29tX3NldHVwX2JvYXJkKGNhcmQpOwogCi0JLyogRklYTUU6IGxvY2tpbmcgb24gcG9ydC5jb3VudCBldGMgKi8KLQlwb3J0LT5wb3J0LmNvdW50Kys7Ci0JdHR5LT5kcml2ZXJfZGF0YSA9IHBvcnQ7Ci0JdHR5X3BvcnRfdHR5X3NldCgmcG9ydC0+cG9ydCwgdHR5KTsKLQkvKiBGSVhNRTogTG9ja2luZyBvbiBJbml0aWFsaXplZCBmbGFnICovCi0JaWYgKCF0ZXN0X2JpdChBU1lOQ0JfSU5JVElBTElaRUQsICZ0cG9ydC0+ZmxhZ3MpKQotCQllcnJvciA9IGlzaWNvbV9zZXR1cF9wb3J0KHR0eSk7Ci0JaWYgKGVycm9yID09IDApCi0JCWVycm9yID0gdHR5X3BvcnRfYmxvY2tfdGlsX3JlYWR5KCZwb3J0LT5wb3J0LCB0dHksIGZpbHApOwotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gdHR5X3BvcnRfb3Blbih0cG9ydCwgdHR5LCBmaWxwKTsKIH0KIAogLyogY2xvc2UgZXQgYWxsICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpc2ljb21fc2h1dGRvd25fYm9hcmQoc3RydWN0IGlzaV9ib2FyZCAqYnApCi17Ci0JaWYgKGJwLT5zdGF0dXMgJiBCT0FSRF9BQ1RJVkUpCi0JCWJwLT5zdGF0dXMgJj0gfkJPQVJEX0FDVElWRTsKLX0KLQogLyogY2FyZC0+bG9jayBIQVMgdG8gYmUgaGVsZCAqLwogc3RhdGljIHZvaWQgaXNpY29tX3NodXRkb3duX3BvcnQoc3RydWN0IGlzaV9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBpc2lfYm9hcmQgKmNhcmQgPSBwb3J0LT5jYXJkOwotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7Ci0KLQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKLQotCWlmICghKHBvcnQtPnBvcnQuZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKLQkJdHR5X2tyZWZfcHV0KHR0eSk7Ci0JCXJldHVybjsKLQl9Ci0KLQl0dHlfcG9ydF9mcmVlX3htaXRfYnVmKCZwb3J0LT5wb3J0KTsKLQlwb3J0LT5wb3J0LmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKLQkvKiAzcmQgT2N0b2JlciAyMDAwIDogVmluYXlhayBQIFJpc2J1ZCAqLwotCXR0eV9wb3J0X3R0eV9zZXQoJnBvcnQtPnBvcnQsIE5VTEwpOwotCi0JLypGaXggZG9uZSBieSBBbmlsIC5TIG9uIDMwLTA0LTIwMDEKLQlyZW1vdGUgbG9naW4gdGhyb3VnaCBpc2kgcG9ydCBoYXMgZHRyIHRvZ2dsZSBwcm9ibGVtCi0JZHVlIHRvIHdoaWNoIHRoZSBjYXJyaWVyIGRyb3BzIGJlZm9yZSB0aGUgcGFzc3dvcmQgcHJvbXB0Ci0JYXBwZWFycyBvbiB0aGUgcmVtb3RlIGVuZC4gTm93IHdlIGRyb3AgdGhlIGR0ciBvbmx5IGlmIHRoZQotCUhVUENMKEhhbmd1cCBvbiBjbG9zZSkgZmxhZyBpcyBzZXQgZm9yIHRoZSB0dHkqLwotCi0JaWYgKENfSFVQQ0wodHR5KSkKLQkJLyogZHJvcCBkdHIgb24gdGhpcyBwb3J0ICovCi0JCWRyb3BfZHRyKHBvcnQpOwotCi0JLyogYW55IG90aGVyIHBvcnQgdW5pbml0cyAgKi8KLQlpZiAodHR5KQotCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOwogCiAJaWYgKC0tY2FyZC0+Y291bnQgPCAwKSB7CiAJCXByX2RiZygiaXNpY29tX3NodXRkb3duX3BvcnQ6IGJhZCBib2FyZCgweCVseCkgY291bnQgJWQuXG4iLAogCQkJY2FyZC0+YmFzZSwgY2FyZC0+Y291bnQpOwogCQljYXJkLT5jb3VudCA9IDA7CiAJfQotCi0JLyogbGFzdCBwb3J0IHdhcyBjbG9zZWQsIHNodXRkb3duIHRoYXQgYm9hZCB0b28gKi8KLQlpZiAoQ19IVVBDTCh0dHkpKSB7Ci0JCWlmICghY2FyZC0+Y291bnQpCi0JCQlpc2ljb21fc2h1dGRvd25fYm9hcmQoY2FyZCk7Ci0JfQotCXR0eV9rcmVmX3B1dCh0dHkpOworCS8qIGxhc3QgcG9ydCB3YXMgY2xvc2VkLCBzaHV0ZG93biB0aGF0IGJvYXJkIHRvbyAqLworCWlmICghY2FyZC0+Y291bnQpCisJCWNhcmQtPnN0YXR1cyAmPSBCT0FSRF9BQ1RJVkU7CiB9CiAKIHN0YXRpYyB2b2lkIGlzaWNvbV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKQEAgLTk2OCw3ICs5MTMsNyBAQAogCXR0eV93YWtldXAodHR5KTsKIH0KIAotc3RhdGljIHZvaWQgaXNpY29tX2Nsb3NlX3BvcnQoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQorc3RhdGljIHZvaWQgaXNpY29tX3NodXRkb3duKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgaXNpX3BvcnQgKmlwID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBpc2lfcG9ydCwgcG9ydCk7CiAJc3RydWN0IGlzaV9ib2FyZCAqY2FyZCA9IGlwLT5jYXJkOwpAQCAtOTc3LDEyICs5MjIsMTEgQEAKIAkvKiBpbmRpY2F0ZSB0byB0aGUgY2FyZCB0aGF0IG5vIG1vcmUgZGF0YSBjYW4gYmUgcmVjZWl2ZWQKIAkgICBvbiB0aGlzIHBvcnQgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Ci0JaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKLQkJY2FyZC0+cG9ydF9zdGF0dXMgJj0gfigxIDw8IGlwLT5jaGFubmVsKTsKLQkJb3V0dyhjYXJkLT5wb3J0X3N0YXR1cywgY2FyZC0+YmFzZSArIDB4MDIpOwotCX0KKwljYXJkLT5wb3J0X3N0YXR1cyAmPSB+KDEgPDwgaXAtPmNoYW5uZWwpOworCW91dHcoY2FyZC0+cG9ydF9zdGF0dXMsIGNhcmQtPmJhc2UgKyAweDAyKTsKIAlpc2ljb21fc2h1dGRvd25fcG9ydChpcCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJdHR5X3BvcnRfZnJlZV94bWl0X2J1Zihwb3J0KTsKIH0KIAogc3RhdGljIHZvaWQgaXNpY29tX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQpAQCAtOTkxLDEyICs5MzUsNyBAQAogCXN0cnVjdCB0dHlfcG9ydCAqcG9ydCA9ICZpcC0+cG9ydDsKIAlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKGlwLCB0dHktPm5hbWUsICJpc2ljb21fY2xvc2UiKSkKIAkJcmV0dXJuOwotCi0JaWYgKHR0eV9wb3J0X2Nsb3NlX3N0YXJ0KHBvcnQsIHR0eSwgZmlscCkgPT0gMCkKLQkJcmV0dXJuOwotCWlzaWNvbV9jbG9zZV9wb3J0KHBvcnQpOwotCWlzaWNvbV9mbHVzaF9idWZmZXIodHR5KTsKLQl0dHlfcG9ydF9jbG9zZV9lbmQocG9ydCwgdHR5KTsKKwl0dHlfcG9ydF9jbG9zZShwb3J0LCB0dHksIGZpbHApOwogfQogCiAvKiB3cml0ZSBldCBhbGwgKi8KQEAgLTEzMjYsMTUgKzEyNjUsOSBAQAogc3RhdGljIHZvaWQgaXNpY29tX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCXN0cnVjdCBpc2lfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX2hhbmd1cCIpKQogCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+Y2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Ci0JaXNpY29tX3NodXRkb3duX3BvcnQocG9ydCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+Y2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Ci0KIAl0dHlfcG9ydF9oYW5ndXAoJnBvcnQtPnBvcnQpOwogfQogCkBAIC0xMzY3LDYgKzEzMDAsOCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfcG9ydF9vcGVyYXRpb25zIGlzaWNvbV9wb3J0X29wcyA9IHsKIAkuY2Fycmllcl9yYWlzZWQJCT0gaXNpY29tX2NhcnJpZXJfcmFpc2VkLAogCS5kdHJfcnRzCQk9IGlzaWNvbV9kdHJfcnRzLAorCS5hY3RpdmF0ZQkJPSBpc2ljb21fYWN0aXZhdGUsCisJLnNodXRkb3duCQk9IGlzaWNvbV9zaHV0ZG93biwKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHJlc2V0X2NhcmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMgYi9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMKaW5kZXggNDAyODM4Zi4uNGNkNmM1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jCisrKyBiL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYwpAQCAtMjEzLDcgKzIxMyw2IEBACiAgKgl3aXRoIHRoZSBzbGF2ZS4gTW9zdCBvZiB0aGVtIG5lZWQgdG8gYmUgdXBkYXRlZCBhdG9taWNhbGx5LCBzbyBhbHdheXMKICAqCXVzZSB0aGUgYml0IHNldHRpbmcgb3BlcmF0aW9ucyAodW5sZXNzIHByb3RlY3RlZCBieSBjbGkvc3RpKS4KICAqLwotI2RlZmluZQlTVF9JTklUSUFMSVpJTkcJMQogI2RlZmluZQlTVF9PUEVOSU5HCTIKICNkZWZpbmUJU1RfQ0xPU0lORwkzCiAjZGVmaW5lCVNUX0NNRElORwk0CkBAIC02MjEsNyArNjIwLDcgQEAKIHN0YXRpYyBpbnQJc3RsaV9zdGFydGJyZChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCk7CiBzdGF0aWMgc3NpemVfdAlzdGxpX21lbXJlYWQoc3RydWN0IGZpbGUgKmZwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmcCk7CiBzdGF0aWMgc3NpemVfdAlzdGxpX21lbXdyaXRlKHN0cnVjdCBmaWxlICpmcCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnApOwotc3RhdGljIGludAlzdGxpX21lbWlvY3RsKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGxvbmcJc3RsaV9tZW1pb2N0bChzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIHN0YXRpYyB2b2lkCXN0bGlfYnJkcG9sbChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgY2RraGRyX3QgX19pb21lbSAqaGRycCk7CiBzdGF0aWMgdm9pZAlzdGxpX3BvbGwodW5zaWduZWQgbG9uZyBhcmcpOwogc3RhdGljIGludAlzdGxpX2hvc3RjbWQoc3RydWN0IHN0bGlicmQgKmJyZHAsIHN0cnVjdCBzdGxpcG9ydCAqcG9ydHApOwpAQCAtNzA0LDcgKzcwMyw3IEBACiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5yZWFkCQk9IHN0bGlfbWVtcmVhZCwKIAkud3JpdGUJCT0gc3RsaV9tZW13cml0ZSwKLQkuaW9jdGwJCT0gc3RsaV9tZW1pb2N0bCwKKwkudW5sb2NrZWRfaW9jdGwJPSBzdGxpX21lbWlvY3RsLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNzgzLDEzICs3ODIsMzIgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisvKgorICoJT24gdGhlIGZpcnN0IG9wZW4gb2YgdGhlIGRldmljZSBzZXR1cCB0aGUgcG9ydCBoYXJkd2FyZSwgYW5kCisgKglpbml0aWFsaXplIHRoZSBwZXIgcG9ydCBkYXRhIHN0cnVjdHVyZS4gU2luY2UgaW5pdGlhbGl6aW5nIHRoZSBwb3J0CisgKglyZXF1aXJlcyBzZXZlcmFsIGNvbW1hbmRzIHRvIHRoZSBib2FyZCB3ZSB3aWxsIG5lZWQgdG8gd2FpdCBmb3IgYW55CisgKglvdGhlciBvcGVuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXppbmcgdGhlIHBvcnQuCisgKgorICoJTG9ja2luZzogcHJvdGVjdGVkIGJ5IHRoZSBwb3J0IG11dGV4LgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9hY3RpdmF0ZShzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHN0bGlwb3J0ICpwb3J0cCA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3Qgc3RsaXBvcnQsIHBvcnQpOworCXN0cnVjdCBzdGxpYnJkICpicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaW50IHJjOworCisJaWYgKChyYyA9IHN0bGlfaW5pdG9wZW4odHR5LCBicmRwLCBwb3J0cCkpID49IDApCisJCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnRwLT5yYXdfd2FpdCk7CisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgaW50IHN0bGlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3Qgc3RsaWJyZCAqYnJkcDsKIAlzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwOwotCXN0cnVjdCB0dHlfcG9ydCAqcG9ydDsKIAl1bnNpZ25lZCBpbnQgbWlub3JkZXYsIGJyZG5yLCBwb3J0bnI7Ci0JaW50IHJjOwogCiAJbWlub3JkZXYgPSB0dHktPmluZGV4OwogCWJyZG5yID0gTUlOT1IyQlJEKG1pbm9yZGV2KTsKQEAgLTgwOSw5NSArODI3LDU2IEBACiAJCXJldHVybiAtRU5PREVWOwogCWlmIChwb3J0cC0+ZGV2bnIgPCAxKQogCQlyZXR1cm4gLUVOT0RFVjsKLQlwb3J0ID0gJnBvcnRwLT5wb3J0OwotCi0vKgotICoJT24gdGhlIGZpcnN0IG9wZW4gb2YgdGhlIGRldmljZSBzZXR1cCB0aGUgcG9ydCBoYXJkd2FyZSwgYW5kCi0gKglpbml0aWFsaXplIHRoZSBwZXIgcG9ydCBkYXRhIHN0cnVjdHVyZS4gU2luY2UgaW5pdGlhbGl6aW5nIHRoZSBwb3J0Ci0gKglyZXF1aXJlcyBzZXZlcmFsIGNvbW1hbmRzIHRvIHRoZSBib2FyZCB3ZSB3aWxsIG5lZWQgdG8gd2FpdCBmb3IgYW55Ci0gKglvdGhlciBvcGVuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXppbmcgdGhlIHBvcnQuCi0gKgotICoJUmV2aWV3IC0gbG9ja2luZwotICovCi0JdHR5X3BvcnRfdHR5X3NldChwb3J0LCB0dHkpOwotCXR0eS0+ZHJpdmVyX2RhdGEgPSBwb3J0cDsKLQlwb3J0LT5jb3VudCsrOwotCi0Jd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBvcnRwLT5yYXdfd2FpdCwKLQkJCSF0ZXN0X2JpdChTVF9JTklUSUFMSVpJTkcsICZwb3J0cC0+c3RhdGUpKTsKLQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0KLQlpZiAoKHBvcnRwLT5wb3J0LmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpID09IDApIHsKLQkJc2V0X2JpdChTVF9JTklUSUFMSVpJTkcsICZwb3J0cC0+c3RhdGUpOwotCQlpZiAoKHJjID0gc3RsaV9pbml0b3Blbih0dHksIGJyZHAsIHBvcnRwKSkgPj0gMCkgewotCQkJLyogTG9ja2luZyAqLwotCQkJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7Ci0JCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7Ci0JCX0KLQkJY2xlYXJfYml0KFNUX0lOSVRJQUxJWklORywgJnBvcnRwLT5zdGF0ZSk7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydHAtPnJhd193YWl0KTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQl9Ci0JcmV0dXJuIHR0eV9wb3J0X2Jsb2NrX3RpbF9yZWFkeSgmcG9ydHAtPnBvcnQsIHR0eSwgZmlscCk7CisJcmV0dXJuIHR0eV9wb3J0X29wZW4oJnBvcnRwLT5wb3J0LCB0dHksIGZpbHApOwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgc3RsaV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyB2b2lkIHN0bGlfc2h1dGRvd24oc3RydWN0IHR0eV9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBzdGxpYnJkICpicmRwOwotCXN0cnVjdCBzdGxpcG9ydCAqcG9ydHA7Ci0Jc3RydWN0IHR0eV9wb3J0ICpwb3J0OworCXVuc2lnbmVkIGxvbmcgZnR5cGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBzdGxpcG9ydCwgcG9ydCk7CiAKLQlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykKKwkJcmV0dXJuOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKgorCSAqCU1heSB3YW50IHRvIHdhaXQgZm9yIGRhdGEgdG8gZHJhaW4gYmVmb3JlIGNsb3NpbmcuIFRoZSBCVVNZCisJICoJZmxhZyBrZWVwcyB0cmFjayBvZiB3aGV0aGVyIHdlIGFyZSBzdGlsbCB0cmFuc21pdHRpbmcgb3Igbm90LgorCSAqCUl0IGlzIHVwZGF0ZWQgYnkgbWVzc2FnZXMgZnJvbSB0aGUgc2xhdmUgLSBpbmRpY2F0aW5nIHdoZW4gYWxsCisJICoJY2hhcnMgcmVhbGx5IGhhdmUgZHJhaW5lZC4KKwkgKi8KKworCWlmICghdGVzdF9iaXQoU1RfQ0xPU0lORywgJnBvcnRwLT5zdGF0ZSkpCisJCXN0bGlfcmF3Y2xvc2UoYnJkcCwgcG9ydHAsIDAsIDApOworCisgCXNwaW5fbG9ja19pcnFzYXZlKCZzdGxpX2xvY2ssIGZsYWdzKTsKKwljbGVhcl9iaXQoU1RfVFhCVVNZLCAmcG9ydHAtPnN0YXRlKTsKKwljbGVhcl9iaXQoU1RfUlhTVE9QLCAmcG9ydHAtPnN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGxpX2xvY2ssIGZsYWdzKTsKKworCWZ0eXBlID0gRkxVU0hUWCB8IEZMVVNIUlg7CisJc3RsaV9jbWR3YWl0KGJyZHAsIHBvcnRwLCBBX0ZMVVNILCAmZnR5cGUsIHNpemVvZih1MzIpLCAwKTsKK30KKworc3RhdGljIHZvaWQgc3RsaV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm47Ci0JcG9ydCA9ICZwb3J0cC0+cG9ydDsKLQotCWlmICh0dHlfcG9ydF9jbG9zZV9zdGFydChwb3J0LCB0dHksIGZpbHApID09IDApCi0JCXJldHVybjsKLQotLyoKLSAqCU1heSB3YW50IHRvIHdhaXQgZm9yIGRhdGEgdG8gZHJhaW4gYmVmb3JlIGNsb3NpbmcuIFRoZSBCVVNZIGZsYWcKLSAqCWtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgd2UgYXJlIHN0aWxsIHRyYW5zbWl0dGluZyBvciBub3QuIEl0IGlzCi0gKgl1cGRhdGVkIGJ5IG1lc3NhZ2VzIGZyb20gdGhlIHNsYXZlIC0gaW5kaWNhdGluZyB3aGVuIGFsbCBjaGFycwotICoJcmVhbGx5IGhhdmUgZHJhaW5lZC4KLSAqLwogIAlzcGluX2xvY2tfaXJxc2F2ZSgmc3RsaV9sb2NrLCBmbGFncyk7CisJLyoJRmx1c2ggYW55IGludGVybmFsIGJ1ZmZlcmluZyBvdXQgZmlyc3QgKi8KIAlpZiAodHR5ID09IHN0bGlfdHhjb29rdHR5KQogCQlzdGxpX2ZsdXNoY2hhcnModHR5KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGxpX2xvY2ssIGZsYWdzKTsKLQotCS8qIFdlIGVuZCB1cCBkb2luZyB0aGlzIHR3aWNlIGZvciB0aGUgbW9tZW50LiBUaGlzIG5lZWRzIGxvb2tpbmcgYXQKLQkgICBldmVudHVhbGx5LiBOb3RlIHdlIHN0aWxsIHVzZSBwb3J0cC0+Y2xvc2luZ193YWl0IGFzIGEgcmVzdWx0ICovCi0JaWYgKHBvcnRwLT5jbG9zaW5nX3dhaXQgIT0gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUpCi0JCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBwb3J0cC0+Y2xvc2luZ193YWl0KTsKLQotCS8qIEZJWE1FOiBwb3J0IGxvY2tpbmcgaGVyZSBuZWVkcyBhdHRlbmRpbmcgdG8gKi8KLQlwb3J0LT5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7Ci0KLQlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07Ci0Jc3RsaV9yYXdjbG9zZShicmRwLCBwb3J0cCwgMCwgMCk7Ci0JaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSB7Ci0JCXN0bGlfbWthc3lzaWdzKCZwb3J0cC0+YXNpZywgMCwgMCk7Ci0JCWlmICh0ZXN0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpKQotCQkJc2V0X2JpdChTVF9ET1NJR1MsICZwb3J0cC0+c3RhdGUpOwotCQllbHNlCi0JCQlzdGxpX3NlbmRjbWQoYnJkcCwgcG9ydHAsIEFfU0VUU0lHTkFMUywgJnBvcnRwLT5hc2lnLAotCQkJCXNpemVvZihhc3lzaWdzX3QpLCAwKTsKLQl9Ci0JY2xlYXJfYml0KFNUX1RYQlVTWSwgJnBvcnRwLT5zdGF0ZSk7Ci0JY2xlYXJfYml0KFNUX1JYU1RPUCwgJnBvcnRwLT5zdGF0ZSk7Ci0Jc2V0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKLQl0dHlfbGRpc2NfZmx1c2godHR5KTsKLQlzZXRfYml0KFNUX0RPRkxVU0hSWCwgJnBvcnRwLT5zdGF0ZSk7Ci0Jc3RsaV9mbHVzaGJ1ZmZlcih0dHkpOwotCi0JdHR5X3BvcnRfY2xvc2VfZW5kKHBvcnQsIHR0eSk7Ci0JdHR5X3BvcnRfdHR5X3NldChwb3J0LCBOVUxMKTsKKwl0dHlfcG9ydF9jbG9zZSgmcG9ydHAtPnBvcnQsIHR0eSwgZmlscCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE3MjQsNiArMTcwMyw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorCiAvKgogICoJSGFuZ3VwIHRoaXMgcG9ydC4gVGhpcyBpcyBwcmV0dHkgbXVjaCBsaWtlIGNsb3NpbmcgdGhlIHBvcnQsIG9ubHkKICAqCWEgbGl0dGxlIG1vcmUgYnJ1dGFsLiBObyB3YWl0aW5nIGZvciBkYXRhIHRvIGRyYWluLiBTaHV0ZG93biB0aGUKQEAgLTE3MzMsNDcgKzE3MTMsOCBAQAogCiBzdGF0aWMgdm9pZCBzdGxpX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBzdGxpcG9ydCAqcG9ydHA7Ci0Jc3RydWN0IHN0bGlicmQgKmJyZHA7Ci0Jc3RydWN0IHR0eV9wb3J0ICpwb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKHBvcnRwID09IE5VTEwpCi0JCXJldHVybjsKLQlpZiAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKQotCQlyZXR1cm47Ci0JYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOwotCWlmIChicmRwID09IE5VTEwpCi0JCXJldHVybjsKLQlwb3J0ID0gJnBvcnRwLT5wb3J0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQlwb3J0LT5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKCF0ZXN0X2JpdChTVF9DTE9TSU5HLCAmcG9ydHAtPnN0YXRlKSkKLQkJc3RsaV9yYXdjbG9zZShicmRwLCBwb3J0cCwgMCwgMCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RsaV9sb2NrLCBmbGFncyk7Ci0JaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSB7Ci0JCXN0bGlfbWthc3lzaWdzKCZwb3J0cC0+YXNpZywgMCwgMCk7Ci0JCWlmICh0ZXN0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpKSB7Ci0JCQlzZXRfYml0KFNUX0RPU0lHUywgJnBvcnRwLT5zdGF0ZSk7Ci0JCQlzZXRfYml0KFNUX0RPRkxVU0hUWCwgJnBvcnRwLT5zdGF0ZSk7Ci0JCQlzZXRfYml0KFNUX0RPRkxVU0hSWCwgJnBvcnRwLT5zdGF0ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdGxpX3NlbmRjbWQoYnJkcCwgcG9ydHAsIEFfU0VUU0lHTkFMU0YsCi0JCQkJJnBvcnRwLT5hc2lnLCBzaXplb2YoYXN5c2lnc190KSwgMCk7Ci0JCX0KLQl9Ci0KLQljbGVhcl9iaXQoU1RfVFhCVVNZLCAmcG9ydHAtPnN0YXRlKTsKLQljbGVhcl9iaXQoU1RfUlhTVE9QLCAmcG9ydHAtPnN0YXRlKTsKLQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0bGlfbG9jaywgZmxhZ3MpOwotCi0JdHR5X3BvcnRfaGFuZ3VwKHBvcnQpOworCXN0cnVjdCBzdGxpcG9ydCAqcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCXR0eV9wb3J0X2hhbmd1cCgmcG9ydHAtPnBvcnQpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MzExLDcgKzQyNTIsNyBAQAogICoJcmVzZXQgaXQsIGFuZCBzdGFydC9zdG9wIGl0LgogICovCiAKLXN0YXRpYyBpbnQgc3RsaV9tZW1pb2N0bChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGxvbmcgc3RsaV9tZW1pb2N0bChzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBzdGxpYnJkICpicmRwOwogCWludCBicmRuciwgcmMsIGRvbmU7CkBAIC00MzU2LDcgKzQyOTcsNyBAQAogICoJTm93IGhhbmRsZSB0aGUgYm9hcmQgc3BlY2lmaWMgaW9jdGxzLiBUaGVzZSBhbGwgZGVwZW5kIG9uIHRoZQogICoJbWlub3IgbnVtYmVyIG9mIHRoZSBkZXZpY2UgdGhleSB3ZXJlIGNhbGxlZCBmcm9tLgogICovCi0JYnJkbnIgPSBpbWlub3IoaXApOworCWJyZG5yID0gaW1pbm9yKGZwLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CiAJaWYgKGJyZG5yID49IFNUTF9NQVhCUkRTKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlicmRwID0gc3RsaV9icmRzW2JyZG5yXTsKQEAgLTQ0MjAsNiArNDM2MSw4IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9wb3J0X29wZXJhdGlvbnMgc3RsaV9wb3J0X29wcyA9IHsKIAkuY2Fycmllcl9yYWlzZWQgPSBzdGxpX2NhcnJpZXJfcmFpc2VkLAogCS5kdHJfcnRzID0gc3RsaV9kdHJfcnRzLAorCS5hY3RpdmF0ZSA9IHN0bGlfYWN0aXZhdGUsCisJLnNodXRkb3duID0gc3RsaV9zaHV0ZG93biwKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tZW0uYyBiL2RyaXZlcnMvY2hhci9tZW0uYwppbmRleCAzMGVmZjgwLi5mYmE3NmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWVtLmMKKysrIGIvZHJpdmVycy9jaGFyL21lbS5jCkBAIC00Myw3ICs0Myw3IEBACiB7CiAjaWYgZGVmaW5lZChDT05GSUdfSUE2NCkKIAkvKgotCSAqIE9uIGlhNjQsIHdlIGlnbm9yZSBPX1NZTkMgYmVjYXVzZSB3ZSBjYW5ub3QgdG9sZXJhdGUgbWVtb3J5IGF0dHJpYnV0ZSBhbGlhc2VzLgorCSAqIE9uIGlhNjQsIHdlIGlnbm9yZSBPX0RTWU5DIGJlY2F1c2Ugd2UgY2Fubm90IHRvbGVyYXRlIG1lbW9yeSBhdHRyaWJ1dGUgYWxpYXNlcy4KIAkgKi8KIAlyZXR1cm4gIShlZmlfbWVtX2F0dHJpYnV0ZXMoYWRkcikgJiBFRklfTUVNT1JZX1dCKTsKICNlbGlmIGRlZmluZWQoQ09ORklHX01JUFMpCkBAIC01Niw5ICs1Niw5IEBACiAjZWxzZQogCS8qCiAJICogQWNjZXNzaW5nIG1lbW9yeSBhYm92ZSB0aGUgdG9wIHRoZSBrZXJuZWwga25vd3MgYWJvdXQgb3IgdGhyb3VnaCBhIGZpbGUgcG9pbnRlcgotCSAqIHRoYXQgd2FzIG1hcmtlZCBPX1NZTkMgd2lsbCBiZSBkb25lIG5vbi1jYWNoZWQuCisJICogdGhhdCB3YXMgbWFya2VkIE9fRFNZTkMgd2lsbCBiZSBkb25lIG5vbi1jYWNoZWQuCiAJICovCi0JaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX1NZTkMpCisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0RTWU5DKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gYWRkciA+PSBfX3BhKGhpZ2hfbWVtb3J5KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21veGEuYyBiL2RyaXZlcnMvY2hhci9tb3hhLmMKaW5kZXggZGQwMDgzYi4uNjNlZTNiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21veGEuYworKysgYi9kcml2ZXJzL2NoYXIvbW94YS5jCkBAIC0zNCw3ICszNCw2IEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KQEAgLTEzOSw3ICsxMzgsNyBAQAogCWludCBjZmxhZzsKIAl1bnNpZ25lZCBsb25nIHN0YXR1c2ZsYWdzOwogCi0JdTggRENEU3RhdGU7CisJdTggRENEU3RhdGU7CQkvKiBQcm90ZWN0ZWQgYnkgdGhlIHBvcnQgbG9jayAqLwogCXU4IGxpbmVDdHJsOwogCXU4IGxvd0Noa0ZsYWc7CiB9OwpAQCAtMTUxLDEwICsxNTAsOSBAQAogfTsKIAogLyogc3RhdHVzZmxhZ3MgKi8KLSNkZWZpbmUgVFhTVE9QUEVECTB4MQotI2RlZmluZSBMT1dXQUlUIAkweDIKLSNkZWZpbmUgRU1QVFlXQUlUCTB4NAotI2RlZmluZSBUSFJPVFRMRQkweDgKKyNkZWZpbmUgVFhTVE9QUEVECTEKKyNkZWZpbmUgTE9XV0FJVCAJMgorI2RlZmluZSBFTVBUWVdBSVQJMwogCiAjZGVmaW5lIFNFUklBTF9ET19SRVNUQVJUCiAKQEAgLTE2NSw2ICsxNjMsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBtb3hhRnVuY1RvdXQgPSBIWiAvIDI7CiBzdGF0aWMgdW5zaWduZWQgaW50IG1veGFMb3dXYXRlckNoazsKIHN0YXRpYyBERUZJTkVfTVVURVgobW94YV9vcGVubG9jayk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1veGFfbG9jayk7CiAvKiBWYXJpYWJsZXMgZm9yIGluc21vZCAqLwogI2lmZGVmIE1PRFVMRQogc3RhdGljIHVuc2lnbmVkIGxvbmcgYmFzZWFkZHJbTUFYX0JPQVJEU107CkBAIC0xOTQsOCArMTkzLDYgQEAKIHN0YXRpYyBpbnQgbW94YV93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICopOwogc3RhdGljIHZvaWQgbW94YV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CiBzdGF0aWMgaW50IG1veGFfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICopOwotc3RhdGljIHZvaWQgbW94YV90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKLXN0YXRpYyB2b2lkIG1veGFfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKIHN0YXRpYyB2b2lkIG1veGFfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGt0ZXJtaW9zICopOwogc3RhdGljIHZvaWQgbW94YV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICopOwogc3RhdGljIHZvaWQgbW94YV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKQEAgLTIwNSw5ICsyMDIsOSBAQAogCQkJIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcik7CiBzdGF0aWMgdm9pZCBtb3hhX3BvbGwodW5zaWduZWQgbG9uZyk7CiBzdGF0aWMgdm9pZCBtb3hhX3NldF90dHlfcGFyYW0oc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGt0ZXJtaW9zICopOwotc3RhdGljIHZvaWQgbW94YV9zZXR1cF9lbXB0eV9ldmVudChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKLXN0YXRpYyB2b2lkIG1veGFfc2h1dF9kb3duKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgbW94YV9zaHV0ZG93bihzdHJ1Y3QgdHR5X3BvcnQgKik7CiBzdGF0aWMgaW50IG1veGFfY2Fycmllcl9yYWlzZWQoc3RydWN0IHR0eV9wb3J0ICopOworc3RhdGljIHZvaWQgbW94YV9kdHJfcnRzKHN0cnVjdCB0dHlfcG9ydCAqLCBpbnQpOwogLyoKICAqIG1veGEgYm9hcmQgaW50ZXJmYWNlIGZ1bmN0aW9uczoKICAqLwpAQCAtMjM0LDYgKzIzMSw4IEBACiAgKiBJL08gZnVuY3Rpb25zCiAgKi8KIAorc3RhdGljIERFRklORV9TUElOTE9DSyhtb3hhZnVuY19sb2NrKTsKKwogc3RhdGljIHZvaWQgbW94YV93YWl0X2ZpbmlzaCh2b2lkIF9faW9tZW0gKm9mc0FkZHIpCiB7CiAJdW5zaWduZWQgbG9uZyBlbmQgPSBqaWZmaWVzICsgbW94YUZ1bmNUb3V0OwpAQCAtMjQ3LDkgKzI0NiwyNSBAQAogCiBzdGF0aWMgdm9pZCBtb3hhZnVuYyh2b2lkIF9faW9tZW0gKm9mc0FkZHIsIHUxNiBjbWQsIHUxNiBhcmcpCiB7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtb3hhZnVuY19sb2NrLCBmbGFncyk7CiAJd3JpdGV3KGFyZywgb2ZzQWRkciArIEZ1bmNBcmcpOwogCXdyaXRldyhjbWQsIG9mc0FkZHIgKyBGdW5jQ29kZSk7CiAJbW94YV93YWl0X2ZpbmlzaChvZnNBZGRyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb3hhZnVuY19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbW94YWZ1bmNyZXQodm9pZCBfX2lvbWVtICpvZnNBZGRyLCB1MTYgY21kLCB1MTYgYXJnKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICB1MTYgcmV0OworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbW94YWZ1bmNfbG9jaywgZmxhZ3MpOworCXdyaXRldyhhcmcsIG9mc0FkZHIgKyBGdW5jQXJnKTsKKwl3cml0ZXcoY21kLCBvZnNBZGRyICsgRnVuY0NvZGUpOworCW1veGFfd2FpdF9maW5pc2gob2ZzQWRkcik7CisJcmV0ID0gcmVhZHcob2ZzQWRkciArIEZ1bmNBcmcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1veGFmdW5jX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBtb3hhX2xvd193YXRlcl9jaGVjayh2b2lkIF9faW9tZW0gKm9mc0FkZHIpCkBAIC0yOTksMjIgKzMxNCwyMCBAQAogCQlzdHJ1Y3QgbW94YV9wb3J0ICpwOwogCQl1bnNpZ25lZCBpbnQgaSwgajsKIAotCQltdXRleF9sb2NrKCZtb3hhX29wZW5sb2NrKTsKIAkJZm9yIChpID0gMDsgaSA8IE1BWF9CT0FSRFM7IGkrKykgewogCQkJcCA9IG1veGFfYm9hcmRzW2ldLnBvcnRzOwogCQkJZm9yIChqID0gMDsgaiA8IE1BWF9QT1JUU19QRVJfQk9BUkQ7IGorKywgcCsrLCBhcmdtKyspIHsKIAkJCQltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOworCQkJCXNwaW5fbG9ja19iaCgmbW94YV9sb2NrKTsKIAkJCQlpZiAobW94YV9ib2FyZHNbaV0ucmVhZHkpIHsKIAkJCQkJdG1wLmlucSA9IE1veGFQb3J0UnhRdWV1ZShwKTsKIAkJCQkJdG1wLm91dHEgPSBNb3hhUG9ydFR4UXVldWUocCk7CiAJCQkJfQotCQkJCWlmIChjb3B5X3RvX3VzZXIoYXJnbSwgJnRtcCwgc2l6ZW9mKHRtcCkpKSB7Ci0JCQkJCW11dGV4X3VubG9jaygmbW94YV9vcGVubG9jayk7CisJCQkJc3Bpbl91bmxvY2tfYmgoJm1veGFfbG9jayk7CisJCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdtLCAmdG1wLCBzaXplb2YodG1wKSkpCiAJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KIAkJCX0KIAkJfQotCQltdXRleF91bmxvY2soJm1veGFfb3BlbmxvY2spOwogCQlicmVhazsKIAl9IGNhc2UgTU9YQV9HRVRfT1FVRVVFOgogCQlzdGF0dXMgPSBNb3hhUG9ydFR4UXVldWUoY2gpOwpAQCAtMzMwLDE2ICszNDMsMjAgQEAKIAkJc3RydWN0IG1veGFfcG9ydCAqcDsKIAkJdW5zaWduZWQgaW50IGksIGo7CiAKLQkJbXV0ZXhfbG9jaygmbW94YV9vcGVubG9jayk7CiAJCWZvciAoaSA9IDA7IGkgPCBNQVhfQk9BUkRTOyBpKyspIHsKIAkJCXAgPSBtb3hhX2JvYXJkc1tpXS5wb3J0czsKIAkJCWZvciAoaiA9IDA7IGogPCBNQVhfUE9SVFNfUEVSX0JPQVJEOyBqKyssIHArKywgYXJnbSsrKSB7CiAJCQkJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eXA7CiAJCQkJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKLQkJCQlpZiAoIW1veGFfYm9hcmRzW2ldLnJlYWR5KQorCQkJCXNwaW5fbG9ja19iaCgmbW94YV9sb2NrKTsKKwkJCQlpZiAoIW1veGFfYm9hcmRzW2ldLnJlYWR5KSB7CisJCQkJICAgICAgICBzcGluX3VubG9ja19iaCgmbW94YV9sb2NrKTsKIAkJCQkJZ290byBjb3B5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKIAkJCQlzdGF0dXMgPSBNb3hhUG9ydExpbmVTdGF0dXMocCk7CisJCQkJc3Bpbl91bmxvY2tfYmgoJm1veGFfbG9jayk7CisKIAkJCQlpZiAoc3RhdHVzICYgMSkKIAkJCQkJdG1wLmN0cyA9IDE7CiAJCQkJaWYgKHN0YXR1cyAmIDIpCkBAIC0zNTQsMjQgKzM3MSwyMSBAQAogCQkJCQl0bXAuY2ZsYWcgPSB0dHlwLT50ZXJtaW9zLT5jX2NmbGFnOwogCQkJCXR0eV9rcmVmX3B1dCh0dHkpOwogY29weToKLQkJCQlpZiAoY29weV90b191c2VyKGFyZ20sICZ0bXAsIHNpemVvZih0bXApKSkgewotCQkJCQltdXRleF91bmxvY2soJm1veGFfb3BlbmxvY2spOworCQkJCWlmIChjb3B5X3RvX3VzZXIoYXJnbSwgJnRtcCwgc2l6ZW9mKHRtcCkpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl9CiAJCQl9CiAJCX0KLQkJbXV0ZXhfdW5sb2NrKCZtb3hhX29wZW5sb2NrKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgVElPQ0dTRVJJQUw6Ci0JCW11dGV4X2xvY2soJm1veGFfb3BlbmxvY2spOworCSAgICAgICAgbXV0ZXhfbG9jaygmY2gtPnBvcnQubXV0ZXgpOwogCQlyZXQgPSBtb3hhX2dldF9zZXJpYWxfaW5mbyhjaCwgYXJncCk7Ci0JCW11dGV4X3VubG9jaygmbW94YV9vcGVubG9jayk7CisJCW11dGV4X3VubG9jaygmY2gtPnBvcnQubXV0ZXgpOwogCQlicmVhazsKIAljYXNlIFRJT0NTU0VSSUFMOgotCQltdXRleF9sb2NrKCZtb3hhX29wZW5sb2NrKTsKKwkgICAgICAgIG11dGV4X2xvY2soJmNoLT5wb3J0Lm11dGV4KTsKIAkJcmV0ID0gbW94YV9zZXRfc2VyaWFsX2luZm8oY2gsIGFyZ3ApOwotCQltdXRleF91bmxvY2soJm1veGFfb3BlbmxvY2spOworCQltdXRleF91bmxvY2soJmNoLT5wb3J0Lm11dGV4KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVOT0lPQ1RMQ01EOwpAQCAtMzk2LDggKzQxMCw2IEBACiAJLmZsdXNoX2J1ZmZlciA9IG1veGFfZmx1c2hfYnVmZmVyLAogCS5jaGFyc19pbl9idWZmZXIgPSBtb3hhX2NoYXJzX2luX2J1ZmZlciwKIAkuaW9jdGwgPSBtb3hhX2lvY3RsLAotCS50aHJvdHRsZSA9IG1veGFfdGhyb3R0bGUsCi0JLnVudGhyb3R0bGUgPSBtb3hhX3VudGhyb3R0bGUsCiAJLnNldF90ZXJtaW9zID0gbW94YV9zZXRfdGVybWlvcywKIAkuc3RvcCA9IG1veGFfc3RvcCwKIAkuc3RhcnQgPSBtb3hhX3N0YXJ0LApAQCAtNDA5LDExICs0MjEsMTIgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfcG9ydF9vcGVyYXRpb25zIG1veGFfcG9ydF9vcHMgPSB7CiAJLmNhcnJpZXJfcmFpc2VkID0gbW94YV9jYXJyaWVyX3JhaXNlZCwKKwkuZHRyX3J0cyA9IG1veGFfZHRyX3J0cywKKwkuc2h1dGRvd24gPSBtb3hhX3NodXRkb3duLAogfTsKIAogc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICptb3hhRHJpdmVyOwogc3RhdGljIERFRklORV9USU1FUihtb3hhVGltZXIsIG1veGFfcG9sbCwgMCwgMCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1veGFfbG9jayk7CiAKIC8qCiAgKiBIVyBpbml0CkBAIC0xMTEyLDE0ICsxMTI1LDEyIEBACiBtb2R1bGVfaW5pdChtb3hhX2luaXQpOwogbW9kdWxlX2V4aXQobW94YV9leGl0KTsKIAotc3RhdGljIHZvaWQgbW94YV9jbG9zZV9wb3J0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCitzdGF0aWMgdm9pZCBtb3hhX3NodXRkb3duKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKIHsKLQlzdHJ1Y3QgbW94YV9wb3J0ICpjaCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JbW94YV9zaHV0X2Rvd24odHR5KTsKKwlzdHJ1Y3QgbW94YV9wb3J0ICpjaCA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgbW94YV9wb3J0LCBwb3J0KTsKKyAgICAgICAgTW94YVBvcnREaXNhYmxlKGNoKTsKIAlNb3hhUG9ydEZsdXNoRGF0YShjaCwgMik7Ci0JY2gtPnBvcnQuZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7Ci0JdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0JdHR5X3BvcnRfdHR5X3NldCgmY2gtPnBvcnQsIE5VTEwpOworCWNsZWFyX2JpdChBU1lOQ0JfTk9STUFMX0FDVElWRSwgJnBvcnQtPmZsYWdzKTsKIH0KIAogc3RhdGljIGludCBtb3hhX2NhcnJpZXJfcmFpc2VkKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKQEAgLTExMjcsNDUgKzExMzgsMTkgQEAKIAlzdHJ1Y3QgbW94YV9wb3J0ICpjaCA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgbW94YV9wb3J0LCBwb3J0KTsKIAlpbnQgZGNkOwogCi0Jc3Bpbl9sb2NrX2JoKCZtb3hhX2xvY2spOworCXNwaW5fbG9ja19pcnEoJnBvcnQtPmxvY2spOwogCWRjZCA9IGNoLT5EQ0RTdGF0ZTsKLQlzcGluX3VubG9ja19iaCgmbW94YV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOwogCXJldHVybiBkY2Q7CiB9CiAKLXN0YXRpYyBpbnQgbW94YV9ibG9ja190aWxsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwLAotCQkJICAgIHN0cnVjdCBtb3hhX3BvcnQgKmNoKQorc3RhdGljIHZvaWQgbW94YV9kdHJfcnRzKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCwgaW50IG9ub2ZmKQogewotCXN0cnVjdCB0dHlfcG9ydCAqcG9ydCA9ICZjaC0+cG9ydDsKLQlERUZJTkVfV0FJVCh3YWl0KTsKLQlpbnQgcmV0dmFsID0gMDsKLQl1OCBkY2Q7Ci0KLQl3aGlsZSAoMSkgewotCQlwcmVwYXJlX3RvX3dhaXQoJnBvcnQtPm9wZW5fd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKSB7Ci0jaWZkZWYgU0VSSUFMX0RPX1JFU1RBUlQKLQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKLSNlbHNlCi0JCQlyZXR2YWwgPSAtRUFHQUlOOwotI2VuZGlmCi0JCQlicmVhazsKLQkJfQotCQlkY2QgPSB0dHlfcG9ydF9jYXJyaWVyX3JhaXNlZChwb3J0KTsKLQkJaWYgKGRjZCkKLQkJCWJyZWFrOwotCi0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOwotCQkJYnJlYWs7Ci0JCX0KLQkJc2NoZWR1bGUoKTsKLQl9Ci0JZmluaXNoX3dhaXQoJnBvcnQtPm9wZW5fd2FpdCwgJndhaXQpOwotCi0JcmV0dXJuIHJldHZhbDsKKwlzdHJ1Y3QgbW94YV9wb3J0ICpjaCA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgbW94YV9wb3J0LCBwb3J0KTsKKwlNb3hhUG9ydExpbmVDdHJsKGNoLCBvbm9mZiwgb25vZmYpOwogfQogCisKIHN0YXRpYyBpbnQgbW94YV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXN0cnVjdCBtb3hhX2JvYXJkX2NvbmYgKmJyZDsKQEAgLTExOTQsNiArMTE3OSw3IEBACiAJY2gtPnBvcnQuY291bnQrKzsKIAl0dHktPmRyaXZlcl9kYXRhID0gY2g7CiAJdHR5X3BvcnRfdHR5X3NldCgmY2gtPnBvcnQsIHR0eSk7CisJbXV0ZXhfbG9jaygmY2gtPnBvcnQubXV0ZXgpOwogCWlmICghKGNoLT5wb3J0LmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7CiAJCWNoLT5zdGF0dXNmbGFncyA9IDA7CiAJCW1veGFfc2V0X3R0eV9wYXJhbSh0dHksIHR0eS0+dGVybWlvcyk7CkBAIC0xMjAyLDU4ICsxMTg4LDIwIEBACiAJCU1veGFTZXRGaWZvKGNoLCBjaC0+dHlwZSA9PSBQT1JUXzE2NTUwQSk7CiAJCWNoLT5wb3J0LmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOwogCX0KKwltdXRleF91bmxvY2soJmNoLT5wb3J0Lm11dGV4KTsKIAltdXRleF91bmxvY2soJm1veGFfb3BlbmxvY2spOwogCi0JcmV0dmFsID0gMDsKLQlpZiAoIShmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYgIUNfQ0xPQ0FMKHR0eSkpCi0JCXJldHZhbCA9IG1veGFfYmxvY2tfdGlsbF9yZWFkeSh0dHksIGZpbHAsIGNoKTsKLQltdXRleF9sb2NrKCZtb3hhX29wZW5sb2NrKTsKLQlpZiAocmV0dmFsKSB7Ci0JCWlmIChjaC0+cG9ydC5jb3VudCkgLyogMCBtZWFucyBhbHJlYWR5IGh1bmcgdXAuLi4gKi8KLQkJCWlmICgtLWNoLT5wb3J0LmNvdW50ID09IDApCi0JCQkJbW94YV9jbG9zZV9wb3J0KHR0eSk7Ci0JfSBlbHNlCi0JCWNoLT5wb3J0LmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7Ci0JbXV0ZXhfdW5sb2NrKCZtb3hhX29wZW5sb2NrKTsKLQorCXJldHZhbCA9IHR0eV9wb3J0X2Jsb2NrX3RpbF9yZWFkeSgmY2gtPnBvcnQsIHR0eSwgZmlscCk7CisJaWYgKHJldHZhbCA9PSAwKQorCSAgICAgICAgc2V0X2JpdChBU1lOQ0JfTk9STUFMX0FDVElWRSwgJmNoLT5wb3J0LmZsYWdzKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgdm9pZCBtb3hhX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewotCXN0cnVjdCBtb3hhX3BvcnQgKmNoOwotCWludCBwb3J0OwotCi0JcG9ydCA9IHR0eS0+aW5kZXg7Ci0JaWYgKHBvcnQgPT0gTUFYX1BPUlRTIHx8IHR0eV9odW5nX3VwX3AoZmlscCkpCi0JCXJldHVybjsKLQotCW11dGV4X2xvY2soJm1veGFfb3BlbmxvY2spOwotCWNoID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoY2ggPT0gTlVMTCkKLQkJZ290byB1bmxvY2s7Ci0JaWYgKHR0eS0+Y291bnQgPT0gMSAmJiBjaC0+cG9ydC5jb3VudCAhPSAxKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIm1veGFfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudDsgIgotCQkJInR0eS0+Y291bnQgaXMgMSwgY2gtPnBvcnQuY291bnQgaXMgJWRcbiIsIGNoLT5wb3J0LmNvdW50KTsKLQkJY2gtPnBvcnQuY291bnQgPSAxOwotCX0KLQlpZiAoLS1jaC0+cG9ydC5jb3VudCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAibW94YV9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50LCAiCi0JCQkiZGV2aWNlPSVzXG4iLCB0dHktPm5hbWUpOwotCQljaC0+cG9ydC5jb3VudCA9IDA7Ci0JfQotCWlmIChjaC0+cG9ydC5jb3VudCkKLQkJZ290byB1bmxvY2s7Ci0KKwlzdHJ1Y3QgbW94YV9wb3J0ICpjaCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJY2gtPmNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOwotCWlmIChjaC0+cG9ydC5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7Ci0JCW1veGFfc2V0dXBfZW1wdHlfZXZlbnQodHR5KTsKLQkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDMwICogSFopOwkvKiAzMCBzZWNvbmRzIHRpbWVvdXQgKi8KLQl9Ci0KLQltb3hhX2Nsb3NlX3BvcnQodHR5KTsKLXVubG9jazoKLQltdXRleF91bmxvY2soJm1veGFfb3BlbmxvY2spOworCXR0eV9wb3J0X2Nsb3NlKCZjaC0+cG9ydCwgdHR5LCBmaWxwKTsKIH0KIAogc3RhdGljIGludCBtb3hhX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCkBAIC0xMjY5LDcgKzEyMTcsNyBAQAogCWxlbiA9IE1veGFQb3J0V3JpdGVEYXRhKHR0eSwgYnVmLCBjb3VudCk7CiAJc3Bpbl91bmxvY2tfYmgoJm1veGFfbG9jayk7CiAKLQljaC0+c3RhdHVzZmxhZ3MgfD0gTE9XV0FJVDsKKwlzZXRfYml0KExPV1dBSVQsICZjaC0+c3RhdHVzZmxhZ3MpOwogCXJldHVybiBsZW47CiB9CiAKQEAgLTEzMDAsNDAgKzEyNDgsMjEgQEAKIAlzdHJ1Y3QgbW94YV9wb3J0ICpjaCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaW50IGNoYXJzOwogCi0JLyoKLQkgKiBTaWdoLi4uSSBoYXZlIHRvIGNoZWNrIGlmIGRyaXZlcl9kYXRhIGlzIE5VTEwgaGVyZSwgYmVjYXVzZQotCSAqIGlmIGFuIG9wZW4oKSBmYWlscywgdGhlIFRUWSBzdWJzeXN0ZW0gZXZlbnR1YWxseSBjYWxscwotCSAqIHR0eV93YWl0X3VudGlsX3NlbnQoKSwgd2hpY2ggY2FsbHMgdGhlIGRyaXZlcidzIGNoYXJzX2luX2J1ZmZlcigpCi0JICogcm91dGluZS4gIEFuZCBzaW5jZSB0aGUgb3BlbigpIGZhaWxlZCwgd2UgcmV0dXJuIDAgaGVyZS4gIFRESgotCSAqLwotCWlmIChjaCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlsb2NrX2tlcm5lbCgpOwogCWNoYXJzID0gTW94YVBvcnRUeFF1ZXVlKGNoKTsKLQlpZiAoY2hhcnMpIHsKKwlpZiAoY2hhcnMpCiAJCS8qCiAJCSAqIE1ha2UgaXQgcG9zc2libGUgdG8gd2FrZXVwIGFueXRoaW5nIHdhaXRpbmcgZm9yIG91dHB1dAogCQkgKiBpbiB0dHlfaW9jdGwuYywgZXRjLgogCQkgKi8KLQkJaWYgKCEoY2gtPnN0YXR1c2ZsYWdzICYgRU1QVFlXQUlUKSkKLQkJCW1veGFfc2V0dXBfZW1wdHlfZXZlbnQodHR5KTsKLQl9Ci0JdW5sb2NrX2tlcm5lbCgpOworICAgICAgICAJc2V0X2JpdChFTVBUWVdBSVQsICZjaC0+c3RhdHVzZmxhZ3MpOwogCXJldHVybiBjaGFyczsKIH0KIAogc3RhdGljIGludCBtb3hhX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBtb3hhX3BvcnQgKmNoOworCXN0cnVjdCBtb3hhX3BvcnQgKmNoID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpbnQgZmxhZyA9IDAsIGR0ciwgcnRzOwogCi0JbXV0ZXhfbG9jaygmbW94YV9vcGVubG9jayk7Ci0JY2ggPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghY2gpIHsKLQkJbXV0ZXhfdW5sb2NrKCZtb3hhX29wZW5sb2NrKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJTW94YVBvcnRHZXRMaW5lT3V0KGNoLCAmZHRyLCAmcnRzKTsKIAlpZiAoZHRyKQogCQlmbGFnIHw9IFRJT0NNX0RUUjsKQEAgLTEzNDYsNyArMTI3NSw2IEBACiAJCWZsYWcgfD0gVElPQ01fRFNSOwogCWlmIChkdHIgJiA0KQogCQlmbGFnIHw9IFRJT0NNX0NEOwotCW11dGV4X3VubG9jaygmbW94YV9vcGVubG9jayk7CiAJcmV0dXJuIGZsYWc7CiB9CiAKQEAgLTEzNzksMjAgKzEzMDcsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBtb3hhX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IG1veGFfcG9ydCAqY2ggPSB0dHktPmRyaXZlcl9kYXRhOwotCi0JY2gtPnN0YXR1c2ZsYWdzIHw9IFRIUk9UVExFOwotfQotCi1zdGF0aWMgdm9pZCBtb3hhX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgbW94YV9wb3J0ICpjaCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0KLQljaC0+c3RhdHVzZmxhZ3MgJj0gflRIUk9UVExFOwotfQotCiBzdGF0aWMgdm9pZCBtb3hhX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCiAJCXN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CkBAIC0xNDEyLDcgKzEzMjYsNyBAQAogCWlmIChjaCA9PSBOVUxMKQogCQlyZXR1cm47CiAJTW94YVBvcnRUeERpc2FibGUoY2gpOwotCWNoLT5zdGF0dXNmbGFncyB8PSBUWFNUT1BQRUQ7CisJc2V0X2JpdChUWFNUT1BQRUQsICZjaC0+c3RhdHVzZmxhZ3MpOwogfQogCiAKQEAgLTE0MjcsMzggKzEzNDEsMzIgQEAKIAkJcmV0dXJuOwogCiAJTW94YVBvcnRUeEVuYWJsZShjaCk7Ci0JY2gtPnN0YXR1c2ZsYWdzICY9IH5UWFNUT1BQRUQ7CisJY2xlYXJfYml0KFRYU1RPUFBFRCwgJmNoLT5zdGF0dXNmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1veGFfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc3RydWN0IG1veGFfcG9ydCAqY2g7Ci0KLQltdXRleF9sb2NrKCZtb3hhX29wZW5sb2NrKTsKLQljaCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKGNoID09IE5VTEwpIHsKLQkJbXV0ZXhfdW5sb2NrKCZtb3hhX29wZW5sb2NrKTsKLQkJcmV0dXJuOwotCX0KLQljaC0+cG9ydC5jb3VudCA9IDA7Ci0JbW94YV9jbG9zZV9wb3J0KHR0eSk7Ci0JbXV0ZXhfdW5sb2NrKCZtb3hhX29wZW5sb2NrKTsKLQotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPnBvcnQub3Blbl93YWl0KTsKKwlzdHJ1Y3QgbW94YV9wb3J0ICpjaCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdHR5X3BvcnRfaGFuZ3VwKCZjaC0+cG9ydCk7CiB9CiAKIHN0YXRpYyB2b2lkIG1veGFfbmV3X2RjZHN0YXRlKHN0cnVjdCBtb3hhX3BvcnQgKnAsIHU4IGRjZCkKIHsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJZGNkID0gISFkY2Q7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+cG9ydC5sb2NrLCBmbGFncyk7CiAJaWYgKGRjZCAhPSBwLT5EQ0RTdGF0ZSkgeworICAgICAgICAJcC0+RENEU3RhdGUgPSBkY2Q7CisgICAgICAgIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIAkJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcC0+cG9ydCk7CiAJCWlmICh0dHkgJiYgQ19DTE9DQUwodHR5KSAmJiAhZGNkKQogCQkJdHR5X2hhbmd1cCh0dHkpOwogCQl0dHlfa3JlZl9wdXQodHR5KTsKIAl9Ci0JcC0+RENEU3RhdGUgPSBkY2Q7CisJZWxzZQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGludCBtb3hhX3BvbGxfcG9ydChzdHJ1Y3QgbW94YV9wb3J0ICpwLCB1bnNpZ25lZCBpbnQgaGFuZGxlLApAQCAtMTQ3MCwyNCArMTM3OCwyNCBAQAogCXUxNiBpbnRyOwogCiAJaWYgKHR0eSkgewotCQlpZiAoKHAtPnN0YXR1c2ZsYWdzICYgRU1QVFlXQUlUKSAmJgorCQlpZiAodGVzdF9iaXQoRU1QVFlXQUlULCAmcC0+c3RhdHVzZmxhZ3MpICYmCiAJCQkJTW94YVBvcnRUeFF1ZXVlKHApID09IDApIHsKLQkJCXAtPnN0YXR1c2ZsYWdzICY9IH5FTVBUWVdBSVQ7CisJCQljbGVhcl9iaXQoRU1QVFlXQUlULCAmcC0+c3RhdHVzZmxhZ3MpOwogCQkJdHR5X3dha2V1cCh0dHkpOwogCQl9Ci0JCWlmICgocC0+c3RhdHVzZmxhZ3MgJiBMT1dXQUlUKSAmJiAhdHR5LT5zdG9wcGVkICYmCisJCWlmICh0ZXN0X2JpdChMT1dXQUlULCAmcC0+c3RhdHVzZmxhZ3MpICYmICF0dHktPnN0b3BwZWQgJiYKIAkJCQlNb3hhUG9ydFR4UXVldWUocCkgPD0gV0FLRVVQX0NIQVJTKSB7Ci0JCQlwLT5zdGF0dXNmbGFncyAmPSB+TE9XV0FJVDsKKwkJCWNsZWFyX2JpdChMT1dXQUlULCAmcC0+c3RhdHVzZmxhZ3MpOwogCQkJdHR5X3dha2V1cCh0dHkpOwogCQl9CiAKLQkJaWYgKGluaXRlZCAmJiAhKHAtPnN0YXR1c2ZsYWdzICYgVEhST1RUTEUpICYmCisJCWlmIChpbml0ZWQgJiYgIXRlc3RfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKSAmJgogCQkJCU1veGFQb3J0UnhRdWV1ZShwKSA+IDApIHsgLyogUlggKi8KIAkJCU1veGFQb3J0UmVhZERhdGEocCk7CiAJCQl0dHlfc2NoZWR1bGVfZmxpcCh0dHkpOwogCQl9CiAJfSBlbHNlIHsKLQkJcC0+c3RhdHVzZmxhZ3MgJj0gfkVNUFRZV0FJVDsKKwkJY2xlYXJfYml0KEVNUFRZV0FJVCwgJnAtPnN0YXR1c2ZsYWdzKTsKIAkJTW94YVBvcnRGbHVzaERhdGEocCwgMCk7IC8qIGZsdXNoIFJYICovCiAJfQogCkBAIC0xNTg4LDM1ICsxNDk2LDYgQEAKIAl0dHlfZW5jb2RlX2JhdWRfcmF0ZSh0dHksIGJhdWQsIGJhdWQpOwogfQogCi1zdGF0aWMgdm9pZCBtb3hhX3NldHVwX2VtcHR5X2V2ZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IG1veGFfcG9ydCAqY2ggPSB0dHktPmRyaXZlcl9kYXRhOwotCi0Jc3Bpbl9sb2NrX2JoKCZtb3hhX2xvY2spOwotCWNoLT5zdGF0dXNmbGFncyB8PSBFTVBUWVdBSVQ7Ci0Jc3Bpbl91bmxvY2tfYmgoJm1veGFfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1veGFfc2h1dF9kb3duKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IG1veGFfcG9ydCAqY2ggPSB0dHktPmRyaXZlcl9kYXRhOwotCi0JaWYgKCEoY2gtPnBvcnQuZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCi0JCXJldHVybjsKLQotCU1veGFQb3J0RGlzYWJsZShjaCk7Ci0KLQkvKgotCSAqIElmIHdlJ3JlIGEgbW9kZW0gY29udHJvbCBkZXZpY2UgYW5kIEhVUENMIGlzIG9uLCBkcm9wIFJUUyAmIERUUi4KLQkgKi8KLQlpZiAoQ19IVVBDTCh0dHkpKQotCQlNb3hhUG9ydExpbmVDdHJsKGNoLCAwLCAwKTsKLQotCXNwaW5fbG9ja19iaCgmbW94YV9sb2NrKTsKLQljaC0+cG9ydC5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7Ci0Jc3Bpbl91bmxvY2tfYmgoJm1veGFfbG9jayk7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJRHJpdmVyIGxldmVsIGZ1bmN0aW9uczogCQkJCQkgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE5MTgsMTAgKzE3OTcsMTIgQEAKIAliYXVkID0gTW94YVBvcnRTZXRCYXVkKHBvcnQsIGJhdWQpOwogCiAJaWYgKHRlcm1pby0+Y19pZmxhZyAmIChJWE9OIHwgSVhPRkYgfCBJWEFOWSkpIHsKKwkgICAgICAgIHNwaW5fbG9ja19pcnEoJm1veGFmdW5jX2xvY2spOwogCQl3cml0ZWIodGVybWlvLT5jX2NjW1ZTVEFSVF0sIG9mc0FkZHIgKyBGdW5jQXJnKTsKIAkJd3JpdGViKHRlcm1pby0+Y19jY1tWU1RPUF0sIG9mc0FkZHIgKyBGdW5jQXJnMSk7CiAJCXdyaXRlYihGQ19TZXRYb25Yb2ZmLCBvZnNBZGRyICsgRnVuY0NvZGUpOwogCQltb3hhX3dhaXRfZmluaXNoKG9mc0FkZHIpOworCQlzcGluX3VubG9ja19pcnEoJm1veGFmdW5jX2xvY2spOwogCiAJfQogCXJldHVybiBiYXVkOwpAQCAtMTk3NCwxOCArMTg1NSwxNCBAQAogCWludCB2YWw7CiAKIAlvZnNBZGRyID0gcG9ydC0+dGFibGVBZGRyOwotCWlmIChNT1hBX0lTXzMyMChwb3J0LT5ib2FyZCkpIHsKLQkJbW94YWZ1bmMob2ZzQWRkciwgRkNfTGluZVN0YXR1cywgMCk7Ci0JCXZhbCA9IHJlYWR3KG9mc0FkZHIgKyBGdW5jQXJnKTsKLQl9IGVsc2UgeworCWlmIChNT1hBX0lTXzMyMChwb3J0LT5ib2FyZCkpCisJCXZhbCA9IG1veGFmdW5jcmV0KG9mc0FkZHIsIEZDX0xpbmVTdGF0dXMsIDApOworCWVsc2UKIAkJdmFsID0gcmVhZHcob2ZzQWRkciArIEZsYWdTdGF0KSA+PiA0OwotCX0KIAl2YWwgJj0gMHgwQjsKIAlpZiAodmFsICYgOCkKIAkJdmFsIHw9IDQ7Ci0Jc3Bpbl9sb2NrX2JoKCZtb3hhX2xvY2spOwogCW1veGFfbmV3X2RjZHN0YXRlKHBvcnQsIHZhbCAmIDgpOwotCXNwaW5fdW5sb2NrX2JoKCZtb3hhX2xvY2spOwogCXZhbCAmPSA3OwogCXJldHVybiB2YWw7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXhzZXIuYyBiL2RyaXZlcnMvY2hhci9teHNlci5jCmluZGV4IDVlMjhkMzkuLjNkOTIzMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9teHNlci5jCisrKyBiL2RyaXZlcnMvY2hhci9teHNlci5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KQEAgLTg1Niw5ICs4NTUsOSBAQAogCX0KIH0KIAotc3RhdGljIGludCBteHNlcl9zdGFydHVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCitzdGF0aWMgaW50IG14c2VyX2FjdGl2YXRlKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IG14c2VyX3BvcnQsIHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgcGFnZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC04NjgsMjIgKzg2NywxMyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAKLQlpZiAoaW5mby0+cG9ydC5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7Ci0JCWZyZWVfcGFnZShwYWdlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCiAJaWYgKCFpbmZvLT5pb2FkZHIgfHwgIWluZm8tPnR5cGUpIHsKIAkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKIAkJZnJlZV9wYWdlKHBhZ2UpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gMDsKIAl9Ci0JaWYgKGluZm8tPnBvcnQueG1pdF9idWYpCi0JCWZyZWVfcGFnZShwYWdlKTsKLQllbHNlCi0JCWluZm8tPnBvcnQueG1pdF9idWYgPSAodW5zaWduZWQgY2hhciAqKSBwYWdlOworCWluZm8tPnBvcnQueG1pdF9idWYgPSAodW5zaWduZWQgY2hhciAqKSBwYWdlOwogCiAJLyoKIAkgKiBDbGVhciB0aGUgRklGTyBidWZmZXJzIGFuZCBkaXNhYmxlIHRoZW0KQEAgLTk1MSwyNCArOTQxLDE5IEBACiAJICogYW5kIHNldCB0aGUgc3BlZWQgb2YgdGhlIHNlcmlhbCBwb3J0CiAJICovCiAJbXhzZXJfY2hhbmdlX3NwZWVkKHR0eSwgTlVMTCk7Ci0JaW5mby0+cG9ydC5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CiAKIC8qCi0gKiBUaGlzIHJvdXRpbmUgd2lsbCBzaHV0ZG93biBhIHNlcmlhbCBwb3J0OyBpbnRlcnJ1cHRzIG1heWJlIGRpc2FibGVkLCBhbmQKLSAqIERUUiBpcyBkcm9wcGVkIGlmIHRoZSBoYW5ndXAgb24gY2xvc2UgdGVybWlvIGZsYWcgaXMgb24uCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBzaHV0ZG93biBhIHNlcmlhbCBwb3J0CiAgKi8KLXN0YXRpYyB2b2lkIG14c2VyX3NodXRkb3duKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCitzdGF0aWMgdm9pZCBteHNlcl9zaHV0ZG93bl9wb3J0KHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKIHsKLQlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IG14c2VyX3BvcnQsIHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoIShpbmZvLT5wb3J0LmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKQotCQlyZXR1cm47Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAogCS8qCkBAIC05NzgsNyArOTYzLDcgQEAKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPnBvcnQuZGVsdGFfbXNyX3dhaXQpOwogCiAJLyoKLQkgKiBGcmVlIHRoZSBJUlEsIGlmIG5lY2Vzc2FyeQorCSAqIEZyZWUgdGhlIHhtaXQgYnVmZmVyLCBpZiBuZWNlc3NhcnkKIAkgKi8KIAlpZiAoaW5mby0+cG9ydC54bWl0X2J1ZikgewogCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGluZm8tPnBvcnQueG1pdF9idWYpOwpAQCAtOTg4LDEwICs5NzMsNiBAQAogCWluZm8tPklFUiA9IDA7CiAJb3V0YigweDAwLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7CiAKLQlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpCi0JCWluZm8tPk1DUiAmPSB+KFVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUyk7Ci0Jb3V0YihpbmZvLT5NQ1IsIGluZm8tPmlvYWRkciArIFVBUlRfTUNSKTsKLQogCS8qIGNsZWFyIFJ4L1R4IEZJRk8ncyAqLwogCWlmIChpbmZvLT5ib2FyZC0+Y2hpcF9mbGFnKQogCQlvdXRiKFVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUIHwKQEAgLTEwMDQsOSArOTg1LDYgQEAKIAkvKiByZWFkIGRhdGEgcG9ydCB0byByZXNldCB0aGluZ3MgKi8KIAkodm9pZCkgaW5iKGluZm8tPmlvYWRkciArIFVBUlRfUlgpOwogCi0Jc2V0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKLQotCWluZm8tPnBvcnQuZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOwogCiAJaWYgKGluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpCiAJCVNFVF9NT1hBX01VU1RfTk9fU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmlvYWRkcik7CkBAIC0xMDIzLDggKzEwMDEsNyBAQAogc3RhdGljIGludCBteHNlcl9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldHZhbCwgbGluZTsKKwlpbnQgbGluZTsKIAogCWxpbmUgPSB0dHktPmluZGV4OwogCWlmIChsaW5lID09IE1YU0VSX1BPUlRTKQpAQCAtMTAzNSwyMyArMTAxMiw3IEBACiAJaWYgKCFpbmZvLT5pb2FkZHIpCiAJCXJldHVybiAtRU5PREVWOwogCi0JdHR5LT5kcml2ZXJfZGF0YSA9IGluZm87Ci0JdHR5X3BvcnRfdHR5X3NldCgmaW5mby0+cG9ydCwgdHR5KTsKLQkvKgotCSAqIFN0YXJ0IHVwIHNlcmlhbCBwb3J0Ci0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnBvcnQubG9jaywgZmxhZ3MpOwotCWluZm8tPnBvcnQuY291bnQrKzsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5wb3J0LmxvY2ssIGZsYWdzKTsKLQlyZXR2YWwgPSBteHNlcl9zdGFydHVwKHR0eSk7Ci0JaWYgKHJldHZhbCkKLQkJcmV0dXJuIHJldHZhbDsKLQotCXJldHZhbCA9IHR0eV9wb3J0X2Jsb2NrX3RpbF9yZWFkeSgmaW5mby0+cG9ydCwgdHR5LCBmaWxwKTsKLQlpZiAocmV0dmFsKQotCQlyZXR1cm4gcmV0dmFsOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHR0eV9wb3J0X29wZW4oJmluZm8tPnBvcnQsIHR0eSwgZmlscCk7CiB9CiAKIHN0YXRpYyB2b2lkIG14c2VyX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQpAQCAtMTA3NSwxOSArMTAzNiwxMSBAQAogfQogCiAKLXN0YXRpYyB2b2lkIG14c2VyX2Nsb3NlX3BvcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHR0eV9wb3J0ICpwb3J0KQorc3RhdGljIHZvaWQgbXhzZXJfY2xvc2VfcG9ydChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IG14c2VyX3BvcnQsIHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAkvKgotCSAqIFNhdmUgdGhlIHRlcm1pb3Mgc3RydWN0dXJlLCBzaW5jZSB0aGlzIHBvcnQgbWF5IGhhdmUKLQkgKiBzZXBhcmF0ZSB0ZXJtaW9zIGZvciBjYWxsb3V0IGFuZCBkaWFsaW4uCi0JICoKLQkgKiBGSVhNRTogQ2FuIHRoaXMgZ28gPwotCSAqLwotCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX05PUk1BTF9BQ1RJVkUpCi0JCWluZm8tPm5vcm1hbF90ZXJtaW9zID0gKnR0eS0+dGVybWlvczsKLQkvKgogCSAqIEF0IHRoaXMgcG9pbnQgd2Ugc3RvcCBhY2NlcHRpbmcgaW5wdXQuICBUbyBkbyB0aGlzLCB3ZQogCSAqIGRpc2FibGUgdGhlIHJlY2VpdmUgbGluZSBzdGF0dXMgaW50ZXJydXB0cywgYW5kIHRlbGwgdGhlCiAJICogaW50ZXJydXB0IGRyaXZlciB0byBzdG9wIGNoZWNraW5nIHRoZSBkYXRhIHJlYWR5IGJpdCBpbiB0aGUKQEAgLTEwOTcsMjIgKzEwNTAsMTggQEAKIAlpZiAoaW5mby0+Ym9hcmQtPmNoaXBfZmxhZykKIAkJaW5mby0+SUVSICY9IH5NT1hBX01VU1RfUkVDVl9JU1I7CiAKLQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgewotCQlvdXRiKGluZm8tPklFUiwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOwotCQkvKgotCQkgKiBCZWZvcmUgd2UgZHJvcCBEVFIsIG1ha2Ugc3VyZSB0aGUgVUFSVCB0cmFuc21pdHRlcgotCQkgKiBoYXMgY29tcGxldGVseSBkcmFpbmVkOyB0aGlzIGlzIGVzcGVjaWFsbHkKLQkJICogaW1wb3J0YW50IGlmIHRoZXJlIGlzIGEgdHJhbnNtaXQgRklGTyEKLQkJICovCi0JCXRpbWVvdXQgPSBqaWZmaWVzICsgSFo7Ci0JCXdoaWxlICghKGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UKSkgewotCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDUpOwotCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCi0JCQkJYnJlYWs7Ci0JCX0KKwlvdXRiKGluZm8tPklFUiwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOworCS8qCisJICogQmVmb3JlIHdlIGRyb3AgRFRSLCBtYWtlIHN1cmUgdGhlIFVBUlQgdHJhbnNtaXR0ZXIKKwkgKiBoYXMgY29tcGxldGVseSBkcmFpbmVkOyB0aGlzIGlzIGVzcGVjaWFsbHkKKwkgKiBpbXBvcnRhbnQgaWYgdGhlcmUgaXMgYSB0cmFuc21pdCBGSUZPIQorCSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisJd2hpbGUgKCEoaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTFNSKSAmIFVBUlRfTFNSX1RFTVQpKSB7CisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSg1KTsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQlicmVhazsKIAl9Ci0JbXhzZXJfc2h1dGRvd24odHR5KTsKLQogfQogCiAvKgpAQCAtMTEzMCw4ICsxMDc5LDEyIEBACiAJCXJldHVybjsKIAlpZiAodHR5X3BvcnRfY2xvc2Vfc3RhcnQocG9ydCwgdHR5LCBmaWxwKSA9PSAwKQogCQlyZXR1cm47Ci0JbXhzZXJfY2xvc2VfcG9ydCh0dHksIHBvcnQpOworCW11dGV4X2xvY2soJnBvcnQtPm11dGV4KTsKKwlteHNlcl9jbG9zZV9wb3J0KHBvcnQpOwogCW14c2VyX2ZsdXNoX2J1ZmZlcih0dHkpOworCW14c2VyX3NodXRkb3duX3BvcnQocG9ydCk7CisJY2xlYXJfYml0KEFTWU5DQl9JTklUSUFMSVpFRCwgJnBvcnQtPmZsYWdzKTsKKwltdXRleF91bmxvY2soJnBvcnQtPm11dGV4KTsKIAkvKiBSaWdodCBub3cgdGhlIHR0eV9wb3J0IHNldCBpcyBkb25lIG91dHNpZGUgb2YgdGhlIGNsb3NlX2VuZCBoZWxwZXIKIAkgICBhcyB3ZSBkb24ndCB5ZXQgaGF2ZSBldmVyeW9uZSB1c2luZyByZWZjb3VudHMgKi8JCiAJdHR5X3BvcnRfY2xvc2VfZW5kKHBvcnQsIHR0eSk7CkBAIC0xMjc1LDYgKzEyMjgsNyBAQAogCQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKm5ld19pbmZvKQogewogCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQgPSAmaW5mby0+cG9ydDsKIAlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBuZXdfc2VyaWFsOwogCXNwZWVkX3QgYmF1ZDsKIAl1bnNpZ25lZCBsb25nIHNsX2ZsYWdzOwpAQCAtMTI5MCw3ICsxMjQ0LDcgQEAKIAkJCW5ld19zZXJpYWwucG9ydCAhPSBpbmZvLT5pb2FkZHIpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZmxhZ3MgPSBpbmZvLT5wb3J0LmZsYWdzICYgQVNZTkNfU1BEX01BU0s7CisJZmxhZ3MgPSBwb3J0LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLOwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CiAJCWlmICgobmV3X3NlcmlhbC5iYXVkX2Jhc2UgIT0gaW5mby0+YmF1ZF9iYXNlKSB8fApAQCAtMTMwNCwxNiArMTI1OCwxNyBAQAogCQkgKiBPSywgcGFzdCB0aGlzIHBvaW50LCBhbGwgdGhlIGVycm9yIGNoZWNraW5nIGhhcyBiZWVuIGRvbmUuCiAJCSAqIEF0IHRoaXMgcG9pbnQsIHdlIHN0YXJ0IG1ha2luZyBjaGFuZ2VzLi4uLi4KIAkJICovCi0JCWluZm8tPnBvcnQuZmxhZ3MgPSAoKGluZm8tPnBvcnQuZmxhZ3MgJiB+QVNZTkNfRkxBR1MpIHwKKwkJcG9ydC0+ZmxhZ3MgPSAoKHBvcnQtPmZsYWdzICYgfkFTWU5DX0ZMQUdTKSB8CiAJCQkJKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19GTEFHUykpOwotCQlpbmZvLT5wb3J0LmNsb3NlX2RlbGF5ID0gbmV3X3NlcmlhbC5jbG9zZV9kZWxheSAqIEhaIC8gMTAwOwotCQlpbmZvLT5wb3J0LmNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0ICogSFogLyAxMDA7Ci0JCXR0eS0+bG93X2xhdGVuY3kgPSAoaW5mby0+cG9ydC5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKQotCQkJCQkJCQk/IDEgOiAwOwotCQlpZiAoKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0NVU1QgJiYKKwkJcG9ydC0+Y2xvc2VfZGVsYXkgPSBuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICogSFogLyAxMDA7CisJCXBvcnQtPmNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0ICogSFogLyAxMDA7CisJCXR0eS0+bG93X2xhdGVuY3kgPSAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKKwkJaWYgKChwb3J0LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCAmJgogCQkJCShuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBpbmZvLT5iYXVkX2Jhc2UgfHwKIAkJCQluZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yICE9CiAJCQkJaW5mby0+Y3VzdG9tX2Rpdmlzb3IpKSB7CisJCQlpZiAobmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvciA9PSAwKQorCQkJCXJldHVybiAtRUlOVkFMOwogCQkJYmF1ZCA9IG5ld19zZXJpYWwuYmF1ZF9iYXNlIC8gbmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvcjsKIAkJCXR0eV9lbmNvZGVfYmF1ZF9yYXRlKHR0eSwgYmF1ZCwgYmF1ZCk7CiAJCX0KQEAgLTEzMjMsMTUgKzEyNzgsMTcgQEAKIAogCXByb2Nlc3NfdHhyeF9maWZvKGluZm8pOwogCi0JaWYgKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgewotCQlpZiAoZmxhZ3MgIT0gKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykpIHsKKwlpZiAodGVzdF9iaXQoQVNZTkNCX0lOSVRJQUxJWkVELCAmcG9ydC0+ZmxhZ3MpKSB7CisJCWlmIChmbGFncyAhPSAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykpIHsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgc2xfZmxhZ3MpOwogCQkJbXhzZXJfY2hhbmdlX3NwZWVkKHR0eSwgTlVMTCk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgc2xfZmxhZ3MpOwogCQl9Ci0JfSBlbHNlCi0JCXJldHZhbCA9IG14c2VyX3N0YXJ0dXAodHR5KTsKLQorCX0gZWxzZSB7CisJCXJldHZhbCA9IG14c2VyX2FjdGl2YXRlKHBvcnQsIHR0eSk7CisJCWlmIChyZXR2YWwgPT0gMCkKKwkJCXNldF9iaXQoQVNZTkNCX0lOSVRJQUxJWkVELCAmcG9ydC0+ZmxhZ3MpOworCX0KIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0xNTIwLDcgKzE0NzcsOCBAQAogCiBzdGF0aWMgaW50IG14c2VyX2lvY3RsX3NwZWNpYWwodW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZ3ApCiB7Ci0Jc3RydWN0IG14c2VyX3BvcnQgKnBvcnQ7CisJc3RydWN0IG14c2VyX3BvcnQgKmlwOworCXN0cnVjdCB0dHlfcG9ydCAqcG9ydDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWludCByZXN1bHQsIHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgaSwgajsKQEAgLTE1MzYsMzggKzE0OTQsMzkgQEAKIAogCWNhc2UgTU9YQV9DSEtQT1JURU5BQkxFOgogCQlyZXN1bHQgPSAwOwotCQlsb2NrX2tlcm5lbCgpOwogCQlmb3IgKGkgPSAwOyBpIDwgTVhTRVJfQk9BUkRTOyBpKyspCiAJCQlmb3IgKGogPSAwOyBqIDwgTVhTRVJfUE9SVFNfUEVSX0JPQVJEOyBqKyspCiAJCQkJaWYgKG14c2VyX2JvYXJkc1tpXS5wb3J0c1tqXS5pb2FkZHIpCiAJCQkJCXJlc3VsdCB8PSAoMSA8PCBpKTsKLQkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gcHV0X3VzZXIocmVzdWx0LCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmdwKTsKIAljYXNlIE1PWEFfR0VUREFUQUNPVU5UOgotCQlsb2NrX2tlcm5lbCgpOworCQkvKiBUaGUgcmVjZWl2ZSBzaWRlIGlzIGxvY2tlZCBieSBwb3J0LT5zbG9jayBidXQgaXQgaXNuJ3QKKwkJICAgY2xlYXIgdGhhdCBhbiBleGFjdCBzbmFwc2hvdCBpcyB3b3J0aCBjb3B5aW5nIGhlcmUgKi8KIAkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmbXh2YXJfbG9nLCBzaXplb2YobXh2YXJfbG9nKSkpCiAJCQlyZXQgPSAtRUZBVUxUOwotCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiByZXQ7CiAJY2FzZSBNT1hBX0dFVE1TVEFUVVM6IHsKIAkJc3RydWN0IG14c2VyX21zdGF0dXMgbXMsIF9fdXNlciAqbXN1ID0gYXJncDsKLQkJbG9ja19rZXJuZWwoKTsKIAkJZm9yIChpID0gMDsgaSA8IE1YU0VSX0JPQVJEUzsgaSsrKQogCQkJZm9yIChqID0gMDsgaiA8IE1YU0VSX1BPUlRTX1BFUl9CT0FSRDsgaisrKSB7Ci0JCQkJcG9ydCA9ICZteHNlcl9ib2FyZHNbaV0ucG9ydHNbal07CisJCQkJaXAgPSAmbXhzZXJfYm9hcmRzW2ldLnBvcnRzW2pdOworCQkJCXBvcnQgPSAmaXAtPnBvcnQ7CiAJCQkJbWVtc2V0KCZtcywgMCwgc2l6ZW9mKG1zKSk7CiAKLQkJCQlpZiAoIXBvcnQtPmlvYWRkcikKKwkJCQltdXRleF9sb2NrKCZwb3J0LT5tdXRleCk7CisJCQkJaWYgKCFpcC0+aW9hZGRyKQogCQkJCQlnb3RvIGNvcHk7CiAJCQkJCi0JCQkJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CisJCQkJdHR5ID0gdHR5X3BvcnRfdHR5X2dldChwb3J0KTsKIAogCQkJCWlmICghdHR5IHx8ICF0dHktPnRlcm1pb3MpCi0JCQkJCW1zLmNmbGFnID0gcG9ydC0+bm9ybWFsX3Rlcm1pb3MuY19jZmxhZzsKKwkJCQkJbXMuY2ZsYWcgPSBpcC0+bm9ybWFsX3Rlcm1pb3MuY19jZmxhZzsKIAkJCQllbHNlCiAJCQkJCW1zLmNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOwogCQkJCXR0eV9rcmVmX3B1dCh0dHkpOwotCQkJCXN0YXR1cyA9IGluYihwb3J0LT5pb2FkZHIgKyBVQVJUX01TUik7CisJCQkJc3Bpbl9sb2NrX2lycSgmaXAtPnNsb2NrKTsKKwkJCQlzdGF0dXMgPSBpbmIoaXAtPmlvYWRkciArIFVBUlRfTVNSKTsKKwkJCQlzcGluX3VubG9ja19pcnEoJmlwLT5zbG9jayk7CiAJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCkKIAkJCQkJbXMuZGNkID0gMTsKIAkJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRFNSKQpAQCAtMTU3NSwxMyArMTUzNCwxMSBAQAogCQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9DVFMpCiAJCQkJCW1zLmN0cyA9IDE7CiAJCQljb3B5OgotCQkJCWlmIChjb3B5X3RvX3VzZXIobXN1LCAmbXMsIHNpemVvZihtcykpKSB7Ci0JCQkJCXVubG9ja19rZXJuZWwoKTsKKwkJCQltdXRleF91bmxvY2soJnBvcnQtPm11dGV4KTsKKwkJCQlpZiAoY29weV90b191c2VyKG1zdSwgJm1zLCBzaXplb2YobXMpKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQogCQkJCW1zdSsrOwogCQkJfQotCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAwOwogCX0KIAljYXNlIE1PWEFfQVNQUF9NT05fRVhUOiB7CkBAIC0xNTkzLDQxICsxNTUwLDQ4IEBACiAJCWlmICghbWUpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAotCQlsb2NrX2tlcm5lbCgpOwogCQlmb3IgKGkgPSAwLCBwID0gMDsgaSA8IE1YU0VSX0JPQVJEUzsgaSsrKSB7CiAJCQlmb3IgKGogPSAwOyBqIDwgTVhTRVJfUE9SVFNfUEVSX0JPQVJEOyBqKyssIHArKykgewogCQkJCWlmIChwID49IEFSUkFZX1NJWkUobWUtPnJ4X2NudCkpIHsKIAkJCQkJaSA9IE1YU0VSX0JPQVJEUzsKIAkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCXBvcnQgPSAmbXhzZXJfYm9hcmRzW2ldLnBvcnRzW2pdOwotCQkJCWlmICghcG9ydC0+aW9hZGRyKQotCQkJCQljb250aW51ZTsKKwkJCQlpcCA9ICZteHNlcl9ib2FyZHNbaV0ucG9ydHNbal07CisJCQkJcG9ydCA9ICZpcC0+cG9ydDsKIAotCQkJCXN0YXR1cyA9IG14c2VyX2dldF9tc3IocG9ydC0+aW9hZGRyLCAwLCBwKTsKKwkJCQltdXRleF9sb2NrKCZwb3J0LT5tdXRleCk7CisJCQkJaWYgKCFpcC0+aW9hZGRyKSB7CisJCQkJCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlzcGluX2xvY2tfaXJxKCZpcC0+c2xvY2spOworCQkJCXN0YXR1cyA9IG14c2VyX2dldF9tc3IoaXAtPmlvYWRkciwgMCwgcCk7CiAKIAkJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfVEVSSSkKLQkJCQkJcG9ydC0+aWNvdW50LnJuZysrOworCQkJCQlpcC0+aWNvdW50LnJuZysrOwogCQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERFNSKQotCQkJCQlwb3J0LT5pY291bnQuZHNyKys7CisJCQkJCWlwLT5pY291bnQuZHNyKys7CiAJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REQ0QpCi0JCQkJCXBvcnQtPmljb3VudC5kY2QrKzsKKwkJCQkJaXAtPmljb3VudC5kY2QrKzsKIAkJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRENUUykKLQkJCQkJcG9ydC0+aWNvdW50LmN0cysrOworCQkJCQlpcC0+aWNvdW50LmN0cysrOwogCi0JCQkJcG9ydC0+bW9uX2RhdGEubW9kZW1fc3RhdHVzID0gc3RhdHVzOwotCQkJCW1lLT5yeF9jbnRbcF0gPSBwb3J0LT5tb25fZGF0YS5yeGNudDsKLQkJCQltZS0+dHhfY250W3BdID0gcG9ydC0+bW9uX2RhdGEudHhjbnQ7Ci0JCQkJbWUtPnVwX3J4Y250W3BdID0gcG9ydC0+bW9uX2RhdGEudXBfcnhjbnQ7Ci0JCQkJbWUtPnVwX3R4Y250W3BdID0gcG9ydC0+bW9uX2RhdGEudXBfdHhjbnQ7CisJCQkJaXAtPm1vbl9kYXRhLm1vZGVtX3N0YXR1cyA9IHN0YXR1czsKKwkJCQltZS0+cnhfY250W3BdID0gaXAtPm1vbl9kYXRhLnJ4Y250OworCQkJCW1lLT50eF9jbnRbcF0gPSBpcC0+bW9uX2RhdGEudHhjbnQ7CisJCQkJbWUtPnVwX3J4Y250W3BdID0gaXAtPm1vbl9kYXRhLnVwX3J4Y250OworCQkJCW1lLT51cF90eGNudFtwXSA9IGlwLT5tb25fZGF0YS51cF90eGNudDsKIAkJCQltZS0+bW9kZW1fc3RhdHVzW3BdID0KLQkJCQkJcG9ydC0+bW9uX2RhdGEubW9kZW1fc3RhdHVzOwotCQkJCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOworCQkJCQlpcC0+bW9uX2RhdGEubW9kZW1fc3RhdHVzOworCQkJCXNwaW5fdW5sb2NrX2lycSgmaXAtPnNsb2NrKTsKKworCQkJCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJmlwLT5wb3J0KTsKIAogCQkJCWlmICghdHR5IHx8ICF0dHktPnRlcm1pb3MpIHsKLQkJCQkJY2ZsYWcgPSBwb3J0LT5ub3JtYWxfdGVybWlvcy5jX2NmbGFnOwotCQkJCQlpZmxhZyA9IHBvcnQtPm5vcm1hbF90ZXJtaW9zLmNfaWZsYWc7Ci0JCQkJCW1lLT5iYXVkcmF0ZVtwXSA9IHR0eV90ZXJtaW9zX2JhdWRfcmF0ZSgmcG9ydC0+bm9ybWFsX3Rlcm1pb3MpOworCQkJCQljZmxhZyA9IGlwLT5ub3JtYWxfdGVybWlvcy5jX2NmbGFnOworCQkJCQlpZmxhZyA9IGlwLT5ub3JtYWxfdGVybWlvcy5jX2lmbGFnOworCQkJCQltZS0+YmF1ZHJhdGVbcF0gPSB0dHlfdGVybWlvc19iYXVkX3JhdGUoJmlwLT5ub3JtYWxfdGVybWlvcyk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJY2ZsYWcgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7CiAJCQkJCWlmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2lmbGFnOwpAQCAtMTY0NiwxNiArMTYxMCwxNSBAQAogCQkJCWlmIChpZmxhZyAmIChJWE9OIHwgSVhPRkYpKQogCQkJCQltZS0+Zmxvd2N0cmxbcF0gfD0gMHgwQzsKIAotCQkJCWlmIChwb3J0LT50eXBlID09IFBPUlRfMTY1NTBBKQorCQkJCWlmIChpcC0+dHlwZSA9PSBQT1JUXzE2NTUwQSkKIAkJCQkJbWUtPmZpZm9bcF0gPSAxOwogCi0JCQkJb3Btb2RlID0gaW5iKHBvcnQtPm9wbW9kZV9pb2FkZHIpID4+Ci0JCQkJCQkoKHAgJSA0KSAqIDIpOworCQkJCW9wbW9kZSA9IGluYihpcC0+b3Btb2RlX2lvYWRkcik+PigocCAlIDQpICogMik7CiAJCQkJb3Btb2RlICY9IE9QX01PREVfTUFTSzsKIAkJCQltZS0+aWZ0eXBlW3BdID0gb3Btb2RlOworCQkJCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOwogCQkJfQogCQl9Ci0JCXVubG9ja19rZXJuZWwoKTsKIAkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBtZSwgc2l6ZW9mKCptZSkpKQogCQkJcmV0ID0gLUVGQVVMVDsKIAkJa2ZyZWUobWUpOwpAQCAtMTY5Miw2ICsxNjU1LDcgQEAKIAkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCB0dHlfcG9ydCAqcG9ydCA9ICZpbmZvLT5wb3J0OwogCXN0cnVjdCBhc3luY19pY291bnQgY25vdzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwpAQCAtMTcxNiwyMCArMTY4MCwyMCBAQAogCQkJCQlvcG1vZGUgIT0gUlM0MjJfTU9ERSAmJgogCQkJCQlvcG1vZGUgIT0gUlM0ODVfNFdJUkVfTU9ERSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWxvY2tfa2VybmVsKCk7CiAJCQltYXNrID0gTW9kZU1hc2tbcF07CiAJCQlzaGlmdGJpdCA9IHAgKiAyOworCQkJc3Bpbl9sb2NrX2lycSgmaW5mby0+c2xvY2spOwogCQkJdmFsID0gaW5iKGluZm8tPm9wbW9kZV9pb2FkZHIpOwogCQkJdmFsICY9IG1hc2s7CiAJCQl2YWwgfD0gKG9wbW9kZSA8PCBzaGlmdGJpdCk7CiAJCQlvdXRiKHZhbCwgaW5mby0+b3Btb2RlX2lvYWRkcik7Ci0JCQl1bmxvY2tfa2VybmVsKCk7CisJCQlzcGluX3VubG9ja19pcnEoJmluZm8tPnNsb2NrKTsKIAkJfSBlbHNlIHsKLQkJCWxvY2tfa2VybmVsKCk7CiAJCQlzaGlmdGJpdCA9IHAgKiAyOworCQkJc3Bpbl9sb2NrX2lycSgmaW5mby0+c2xvY2spOwogCQkJb3Btb2RlID0gaW5iKGluZm8tPm9wbW9kZV9pb2FkZHIpID4+IHNoaWZ0Yml0OworCQkJc3Bpbl91bmxvY2tfaXJxKCZpbmZvLT5zbG9jayk7CiAJCQlvcG1vZGUgJj0gT1BfTU9ERV9NQVNLOwotCQkJdW5sb2NrX2tlcm5lbCgpOwogCQkJaWYgKHB1dF91c2VyKG9wbW9kZSwgKGludCBfX3VzZXIgKilhcmdwKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQpAQCAtMTc0MiwxNCArMTcwNiwxNCBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFRJT0NHU0VSSUFMOgotCQlsb2NrX2tlcm5lbCgpOworCQltdXRleF9sb2NrKCZwb3J0LT5tdXRleCk7CiAJCXJldHZhbCA9IG14c2VyX2dldF9zZXJpYWxfaW5mbyh0dHksIGFyZ3ApOwotCQl1bmxvY2tfa2VybmVsKCk7CisJCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOwogCQlyZXR1cm4gcmV0dmFsOwogCWNhc2UgVElPQ1NTRVJJQUw6Ci0JCWxvY2tfa2VybmVsKCk7CisJCW11dGV4X2xvY2soJnBvcnQtPm11dGV4KTsKIAkJcmV0dmFsID0gbXhzZXJfc2V0X3NlcmlhbF9pbmZvKHR0eSwgYXJncCk7Ci0JCXVubG9ja19rZXJuZWwoKTsKKwkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5tdXRleCk7CiAJCXJldHVybiByZXR2YWw7CiAJY2FzZSBUSU9DU0VSR0VUTFNSOgkvKiBHZXQgbGluZSBzdGF0dXMgcmVnaXN0ZXIgKi8KIAkJcmV0dXJuICBteHNlcl9nZXRfbHNyX2luZm8oaW5mbywgYXJncCk7CkBAIC0xNzk1LDMxICsxNzU5LDMzIEBACiAJY2FzZSBNT1hBX0hpZ2hTcGVlZE9uOgogCQlyZXR1cm4gcHV0X3VzZXIoaW5mby0+YmF1ZF9iYXNlICE9IDExNTIwMCA/IDEgOiAwLCAoaW50IF9fdXNlciAqKWFyZ3ApOwogCWNhc2UgTU9YQV9TRFNfUlNUSUNPVU5URVI6Ci0JCWxvY2tfa2VybmVsKCk7CisJCXNwaW5fbG9ja19pcnEoJmluZm8tPnNsb2NrKTsKIAkJaW5mby0+bW9uX2RhdGEucnhjbnQgPSAwOwogCQlpbmZvLT5tb25fZGF0YS50eGNudCA9IDA7Ci0JCXVubG9ja19rZXJuZWwoKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZpbmZvLT5zbG9jayk7CiAJCXJldHVybiAwOwogCiAJY2FzZSBNT1hBX0FTUFBfT1FVRVVFOnsKIAkJaW50IGxlbiwgbHNyOwogCi0JCWxvY2tfa2VybmVsKCk7CiAJCWxlbiA9IG14c2VyX2NoYXJzX2luX2J1ZmZlcih0dHkpOworCQlzcGluX2xvY2soJmluZm8tPnNsb2NrKTsKIAkJbHNyID0gaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTFNSKSAmIFVBUlRfTFNSX1RIUkU7CisJCXNwaW5fdW5sb2NrX2lycSgmaW5mby0+c2xvY2spOwogCQlsZW4gKz0gKGxzciA/IDAgOiAxKTsKLQkJdW5sb2NrX2tlcm5lbCgpOwogCiAJCXJldHVybiBwdXRfdXNlcihsZW4sIChpbnQgX191c2VyICopYXJncCk7CiAJfQogCWNhc2UgTU9YQV9BU1BQX01PTjogewogCQlpbnQgbWNyLCBzdGF0dXM7CiAKLQkJbG9ja19rZXJuZWwoKTsKKwkJc3Bpbl9sb2NrKCZpbmZvLT5zbG9jayk7CiAJCXN0YXR1cyA9IG14c2VyX2dldF9tc3IoaW5mby0+aW9hZGRyLCAxLCB0dHktPmluZGV4KTsKIAkJbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKHR0eSwgaW5mbywgc3RhdHVzKTsKIAogCQltY3IgPSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9NQ1IpOworCQlzcGluX3VubG9jaygmaW5mby0+c2xvY2spOworCiAJCWlmIChtY3IgJiBNT1hBX01VU1RfTUNSX1hPTl9GTEFHKQogCQkJaW5mby0+bW9uX2RhdGEuaG9sZF9yZWFzb24gJj0gfk5QUElfTk9USUZZX1hPRkZIT0xEOwogCQllbHNlCkBAIC0xODM0LDcgKzE4MDAsNyBAQAogCQkJaW5mby0+bW9uX2RhdGEuaG9sZF9yZWFzb24gfD0gTlBQSV9OT1RJRllfQ1RTSE9MRDsKIAkJZWxzZQogCQkJaW5mby0+bW9uX2RhdGEuaG9sZF9yZWFzb24gJj0gfk5QUElfTk9USUZZX0NUU0hPTEQ7Ci0JCXVubG9ja19rZXJuZWwoKTsKKwogCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpbmZvLT5tb25fZGF0YSwKIAkJCQlzaXplb2Yoc3RydWN0IG14c2VyX21vbikpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0xOTkzLDYgKzE5NTksNyBAQAogewogCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIG9yaWdfamlmZmllcywgY2hhcl90aW1lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGxzcjsKIAogCWlmIChpbmZvLT50eXBlID09IFBPUlRfVU5LTk9XTikKQEAgLTIwMzIsMTkgKzE5OTksMjEgQEAKIAkJdGltZW91dCwgY2hhcl90aW1lKTsKIAlwcmludGsoImppZmY9JWx1Li4uIiwgamlmZmllcyk7CiAjZW5kaWYKLQlsb2NrX2tlcm5lbCgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogCXdoaWxlICghKChsc3IgPSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9MU1IpKSAmIFVBUlRfTFNSX1RFTVQpKSB7CiAjaWZkZWYgU0VSSUFMX0RFQlVHX1JTX1dBSVRfVU5USUxfU0VOVAogCQlwcmludGsoImxzciA9ICVkIChqaWZmPSVsdSkuLi4iLCBsc3IsIGppZmZpZXMpOwogI2VuZGlmCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShjaGFyX3RpbWUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJYnJlYWs7CiAJCWlmICh0aW1lb3V0ICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgb3JpZ19qaWZmaWVzICsgdGltZW91dCkpCiAJCQlicmVhazsKIAl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCXVubG9ja19rZXJuZWwoKTsKIAogI2lmZGVmIFNFUklBTF9ERUJVR19SU19XQUlUX1VOVElMX1NFTlQKIAlwcmludGsoImxzciA9ICVkIChqaWZmPSVsdSkuLi5kb25lXG4iLCBsc3IsIGppZmZpZXMpOwpAQCAtMjA1OSw3ICsyMDI4LDYgQEAKIAlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKIAlteHNlcl9mbHVzaF9idWZmZXIodHR5KTsKLQlteHNlcl9zaHV0ZG93bih0dHkpOwogCXR0eV9wb3J0X2hhbmd1cCgmaW5mby0+cG9ydCk7CiB9CiAKQEAgLTIzNjMsNiArMjMzMSw4IEBACiBzdHJ1Y3QgdHR5X3BvcnRfb3BlcmF0aW9ucyBteHNlcl9wb3J0X29wcyA9IHsKIAkuY2Fycmllcl9yYWlzZWQgPSBteHNlcl9jYXJyaWVyX3JhaXNlZCwKIAkuZHRyX3J0cyA9IG14c2VyX2R0cl9ydHMsCisJLmFjdGl2YXRlID0gbXhzZXJfYWN0aXZhdGUsCisJLnNodXRkb3duID0gbXhzZXJfc2h1dGRvd25fcG9ydCwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcGNtY2lhL2lwd2lyZWxlc3MvdHR5LmMgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL2lwd2lyZWxlc3MvdHR5LmMKaW5kZXggNjc0YjNhYi4uMmJiNzg3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3BjbWNpYS9pcHdpcmVsZXNzL3R0eS5jCisrKyBiL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy90dHkuYwpAQCAtNjAzLDcgKzYwMyw3IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIHR0eV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9vcGVyYXRpb25zIHR0eV9vcHMgPSB7CiAJLm9wZW4gPSBpcHdfb3BlbiwKIAkuY2xvc2UgPSBpcHdfY2xvc2UsCiAJLmhhbmd1cCA9IGlwd19oYW5ndXAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcHR5LmMgYi9kcml2ZXJzL2NoYXIvcHR5LmMKaW5kZXggZDg2YzBiYy4uMzg1YzQ0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3B0eS5jCisrKyBiL2RyaXZlcnMvY2hhci9wdHkuYwpAQCAtNjU5LDcgKzY1OSw3IEBACiAJaWYgKCFyZXR2YWwpCiAJCXJldHVybiAwOwogb3V0MToKLQl0dHlfcmVsZWFzZV9kZXYoZmlscCk7CisJdHR5X3JlbGVhc2UoaW5vZGUsIGZpbHApOwogCXJldHVybiByZXR2YWw7CiBvdXQ6CiAJZGV2cHRzX2tpbGxfaW5kZXgoaW5vZGUsIGluZGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaXNjb204LmMgYi9kcml2ZXJzL2NoYXIvcmlzY29tOC5jCmluZGV4IDNjZmEyMmQuLjBhOGQxZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaXNjb204LmMKKysrIGIvZHJpdmVycy9jaGFyL3Jpc2NvbTguYwpAQCAtNzkzLDI2ICs3OTMsMjEgQEAKIH0KIAogLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQgKi8KLXN0YXRpYyBpbnQgcmNfc2V0dXBfcG9ydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgcmlzY29tX2JvYXJkICpicCwKLQkJCQkJCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCkKK3N0YXRpYyBpbnQgcmNfYWN0aXZhdGVfcG9ydChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpycCA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgcmlzY29tX3BvcnQsIHBvcnQpOworCXN0cnVjdCByaXNjb21fYm9hcmQgKmJwID0gcG9ydF9Cb2FyZChycCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmIChwb3J0LT5wb3J0LmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpCi0JCXJldHVybiAwOwotCi0JaWYgKHR0eV9wb3J0X2FsbG9jX3htaXRfYnVmKCZwb3J0LT5wb3J0KSA8IDApCisJaWYgKHR0eV9wb3J0X2FsbG9jX3htaXRfYnVmKHBvcnQpIDwgMCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcmlzY29tX2xvY2ssIGZsYWdzKTsKIAogCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKLQlpZiAocG9ydC0+cG9ydC5jb3VudCA9PSAxKQotCQlicC0+Y291bnQrKzsKLQlwb3J0LT54bWl0X2NudCA9IHBvcnQtPnhtaXRfaGVhZCA9IHBvcnQtPnhtaXRfdGFpbCA9IDA7Ci0JcmNfY2hhbmdlX3NwZWVkKHR0eSwgYnAsIHBvcnQpOwotCXBvcnQtPnBvcnQuZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7Ci0KKwlicC0+Y291bnQrKzsKKwlycC0+eG1pdF9jbnQgPSBycC0+eG1pdF9oZWFkID0gcnAtPnhtaXRfdGFpbCA9IDA7CisJcmNfY2hhbmdlX3NwZWVkKHR0eSwgYnAsIHJwKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyaXNjb21fbG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQpAQCAtODIxLDkgKzgxNiw2IEBACiBzdGF0aWMgdm9pZCByY19zaHV0ZG93bl9wb3J0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCiAJCQlzdHJ1Y3QgcmlzY29tX2JvYXJkICpicCwgc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0KQogewotCWlmICghKHBvcnQtPnBvcnQuZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCi0JCXJldHVybjsKLQogI2lmZGVmIFJDX1JFUE9SVF9PVkVSUlVOCiAJcHJpbnRrKEtFUk5fSU5GTyAicmMlZDogcG9ydCAlZDogVG90YWwgJWxkIG92ZXJydW5zIHdlcmUgZGV0ZWN0ZWQuXG4iLAogCSAgICAgICBib2FyZF9ObyhicCksIHBvcnRfTm8ocG9ydCksIHBvcnQtPm92ZXJydW4pOwpAQCAtODQwLDExICs4MzIsNiBAQAogCX0KICNlbmRpZgogCXR0eV9wb3J0X2ZyZWVfeG1pdF9idWYoJnBvcnQtPnBvcnQpOwotCWlmIChDX0hVUENMKHR0eSkpIHsKLQkJLyogRHJvcCBEVFIgKi8KLQkJYnAtPkRUUiB8PSAoMXUgPDwgcG9ydF9Obyhwb3J0KSk7Ci0JCXJjX291dChicCwgUkNfRFRSLCBicC0+RFRSKTsKLQl9CiAKIAkvKiBTZWxlY3QgcG9ydCAqLwogCXJjX291dChicCwgQ0QxODBfQ0FSLCBwb3J0X05vKHBvcnQpKTsKQEAgLTg1Niw3ICs4NDMsNiBAQAogCXJjX291dChicCwgQ0QxODBfSUVSLCBwb3J0LT5JRVIpOwogCiAJc2V0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKLQlwb3J0LT5wb3J0LmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKIAogCWlmICgtLWJwLT5jb3VudCA8IDApICB7CiAJCXByaW50ayhLRVJOX0lORk8gInJjJWQ6IHJjX3NodXRkb3duX3BvcnQ6ICIKQEAgLTg4OSw2ICs4NzUsMjAgQEAKIAlyZXR1cm4gQ0Q7CiB9CiAKK3N0YXRpYyB2b2lkIGR0cl9ydHMoc3RydWN0IHR0eV9wb3J0ICpwb3J0LCBpbnQgb25vZmYpCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCByaXNjb21fcG9ydCwgcG9ydCk7CisJc3RydWN0IHJpc2NvbV9ib2FyZCAqYnAgPSBwb3J0X0JvYXJkKHApOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmlzY29tX2xvY2ssIGZsYWdzKTsKKwlicC0+RFRSICY9IH4oMXUgPDwgcG9ydF9ObyhwKSk7CisJaWYgKG9ub2ZmID09IDApCisJCWJwLT5EVFIgfD0gKDF1IDw8IHBvcnRfTm8ocCkpOworCXJjX291dChicCwgUkNfRFRSLCBicC0+RFRSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyaXNjb21fbG9jaywgZmxhZ3MpOworfQorCiBzdGF0aWMgaW50IHJjX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJaW50IGJvYXJkOwpAQCAtOTA5LDE0ICs5MDksNyBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0JcG9ydC0+cG9ydC5jb3VudCsrOwotCXR0eS0+ZHJpdmVyX2RhdGEgPSBwb3J0OwotCXR0eV9wb3J0X3R0eV9zZXQoJnBvcnQtPnBvcnQsIHR0eSk7Ci0KLQllcnJvciA9IHJjX3NldHVwX3BvcnQodHR5LCBicCwgcG9ydCk7Ci0JaWYgKGVycm9yID09IDApCi0JCWVycm9yID0gdHR5X3BvcnRfYmxvY2tfdGlsX3JlYWR5KCZwb3J0LT5wb3J0LCB0dHksIGZpbHApOwotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gdHR5X3BvcnRfb3BlbigmcG9ydC0+cG9ydCwgdHR5LCBmaWxwKTsKIH0KIAogc3RhdGljIHZvaWQgcmNfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCkBAIC05NTAsMjQgKzk0MywyMyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJpc2NvbV9sb2NrLCBmbGFncyk7CiAJcnAtPklFUiAmPSB+SUVSX1JYRDsKLQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgewotCQlycC0+SUVSICY9IH5JRVJfVFhSRFk7Ci0JCXJwLT5JRVIgfD0gSUVSX1RYRU1QVFk7Ci0JCXJjX291dChicCwgQ0QxODBfQ0FSLCBwb3J0X05vKHJwKSk7Ci0JCXJjX291dChicCwgQ0QxODBfSUVSLCBycC0+SUVSKTsKLQkJLyoKLQkJICogQmVmb3JlIHdlIGRyb3AgRFRSLCBtYWtlIHN1cmUgdGhlIFVBUlQgdHJhbnNtaXR0ZXIKLQkJICogaGFzIGNvbXBsZXRlbHkgZHJhaW5lZDsgdGhpcyBpcyBlc3BlY2lhbGx5Ci0JCSAqIGltcG9ydGFudCBpZiB0aGVyZSBpcyBhIHRyYW5zbWl0IEZJRk8hCi0JCSAqLwotCQl0aW1lb3V0ID0gamlmZmllcyArIEhaOwotCQl3aGlsZSAocnAtPklFUiAmIElFUl9UWEVNUFRZKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyaXNjb21fbG9jaywgZmxhZ3MpOwotCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhycC0+dGltZW91dCkpOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJpc2NvbV9sb2NrLCBmbGFncyk7Ci0JCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKLQkJCQlicmVhazsKLQkJfQorCisJcnAtPklFUiAmPSB+SUVSX1RYUkRZOworCXJwLT5JRVIgfD0gSUVSX1RYRU1QVFk7CisJcmNfb3V0KGJwLCBDRDE4MF9DQVIsIHBvcnRfTm8ocnApKTsKKwlyY19vdXQoYnAsIENEMTgwX0lFUiwgcnAtPklFUik7CisJLyoKKwkgKiBCZWZvcmUgd2UgZHJvcCBEVFIsIG1ha2Ugc3VyZSB0aGUgVUFSVCB0cmFuc21pdHRlcgorCSAqIGhhcyBjb21wbGV0ZWx5IGRyYWluZWQ7IHRoaXMgaXMgZXNwZWNpYWxseQorCSAqIGltcG9ydGFudCBpZiB0aGVyZSBpcyBhIHRyYW5zbWl0IEZJRk8hCisJICovCisJdGltZW91dCA9IGppZmZpZXMgKyBIWjsKKwl3aGlsZSAocnAtPklFUiAmIElFUl9UWEVNUFRZKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJpc2NvbV9sb2NrLCBmbGFncyk7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MocnAtPnRpbWVvdXQpKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJpc2NvbV9sb2NrLCBmbGFncyk7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJYnJlYWs7CiAJfQogCXJjX3NodXRkb3duX3BvcnQocG9ydC0+dHR5LCBicCwgcnApOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJpc2NvbV9sb2NrLCBmbGFncyk7CkBAIC0xMzU0LDcgKzEzNDYsNiBAQAogCWlmIChyY19wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJyY19oYW5ndXAiKSkKIAkJcmV0dXJuOwogCi0JcmNfc2h1dGRvd25fcG9ydCh0dHksIHBvcnRfQm9hcmQocG9ydCksIHBvcnQpOwogCXR0eV9wb3J0X2hhbmd1cCgmcG9ydC0+cG9ydCk7CiB9CiAKQEAgLTE0MDEsNyArMTM5Miw5IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X3BvcnRfb3BlcmF0aW9ucyByaXNjb21fcG9ydF9vcHMgPSB7CiAJLmNhcnJpZXJfcmFpc2VkID0gY2Fycmllcl9yYWlzZWQsCisJLmR0cl9ydHMgPSBkdHJfcnRzLAogCS5zaHV0ZG93biA9IHJjX2Nsb3NlX3BvcnQsCisJLmFjdGl2YXRlID0gcmNfYWN0aXZhdGVfcG9ydCwKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N0YWxsaW9uLmMgYi9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYwppbmRleCBkYjZkY2ZhLi4wZTUxMWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYworKysgYi9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYwpAQCAtNDA3LDcgKzQwNyw3IEBACiAgKglEZWNsYXJlIGFsbCB0aG9zZSBmdW5jdGlvbnMgaW4gdGhpcyBkcml2ZXIhCiAgKi8KIAotc3RhdGljIGludAlzdGxfbWVtaW9jdGwoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGZpbGUgKmZwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgbG9uZwlzdGxfbWVtaW9jdGwoc3RydWN0IGZpbGUgKmZwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBzdGF0aWMgaW50CXN0bF9icmRpbml0KHN0cnVjdCBzdGxicmQgKmJyZHApOwogc3RhdGljIGludAlzdGxfZ2V0cG9ydHN0YXRzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgY29tc3RhdHNfdCBfX3VzZXIgKmNwKTsKIHN0YXRpYyBpbnQJc3RsX2NscnBvcnRzdGF0cyhzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGNvbXN0YXRzX3QgX191c2VyICpjcCk7CkBAIC02MDcsNyArNjA3LDcgQEAKICAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMJc3RsX2ZzaW9tZW0gPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5pb2N0bAkJPSBzdGxfbWVtaW9jdGwsCisJLnVubG9ja2VkX2lvY3RsCT0gc3RsX21lbWlvY3RsLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGFzcyAqc3RhbGxpb25fY2xhc3M7CkBAIC03MDIsNiArNzAyLDI0IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorc3RhdGljIGludCBzdGxfYWN0aXZhdGUoc3RydWN0IHR0eV9wb3J0ICpwb3J0LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzdGxwb3J0ICpwb3J0cCA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3Qgc3RscG9ydCwgcG9ydCk7CisJaWYgKCFwb3J0cC0+dHguYnVmKSB7CisJCXBvcnRwLT50eC5idWYgPSBrbWFsbG9jKFNUTF9UWEJVRlNJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoIXBvcnRwLT50eC5idWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcG9ydHAtPnR4LmhlYWQgPSBwb3J0cC0+dHguYnVmOworCQlwb3J0cC0+dHgudGFpbCA9IHBvcnRwLT50eC5idWY7CisJfQorCXN0bF9zZXRwb3J0KHBvcnRwLCB0dHktPnRlcm1pb3MpOworCXBvcnRwLT5zaWdzID0gc3RsX2dldHNpZ25hbHMocG9ydHApOworCXN0bF9zZXRzaWduYWxzKHBvcnRwLCAxLCAxKTsKKwlzdGxfZW5hYmxlcnh0eChwb3J0cCwgMSwgMSk7CisJc3RsX3N0YXJ0cnh0eChwb3J0cCwgMSwgMCk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgc3RsX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJc3RydWN0IHN0bHBvcnQJKnBvcnRwOwpAQCAtNzM3LDMyICs3NTUsOCBAQAogCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlwb3J0ID0gJnBvcnRwLT5wb3J0OworCXJldHVybiB0dHlfcG9ydF9vcGVuKCZwb3J0cC0+cG9ydCwgdHR5LCBmaWxwKTsKIAotLyoKLSAqCU9uIHRoZSBmaXJzdCBvcGVuIG9mIHRoZSBkZXZpY2Ugc2V0dXAgdGhlIHBvcnQgaGFyZHdhcmUsIGFuZAotICoJaW5pdGlhbGl6ZSB0aGUgcGVyIHBvcnQgZGF0YSBzdHJ1Y3R1cmUuCi0gKi8KLQl0dHlfcG9ydF90dHlfc2V0KHBvcnQsIHR0eSk7Ci0JdHR5LT5kcml2ZXJfZGF0YSA9IHBvcnRwOwotCXBvcnQtPmNvdW50Kys7Ci0KLQlpZiAoKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpID09IDApIHsKLQkJaWYgKCFwb3J0cC0+dHguYnVmKSB7Ci0JCQlwb3J0cC0+dHguYnVmID0ga21hbGxvYyhTVExfVFhCVUZTSVpFLCBHRlBfS0VSTkVMKTsKLQkJCWlmICghcG9ydHAtPnR4LmJ1ZikKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCXBvcnRwLT50eC5oZWFkID0gcG9ydHAtPnR4LmJ1ZjsKLQkJCXBvcnRwLT50eC50YWlsID0gcG9ydHAtPnR4LmJ1ZjsKLQkJfQotCQlzdGxfc2V0cG9ydChwb3J0cCwgdHR5LT50ZXJtaW9zKTsKLQkJcG9ydHAtPnNpZ3MgPSBzdGxfZ2V0c2lnbmFscyhwb3J0cCk7Ci0JCXN0bF9zZXRzaWduYWxzKHBvcnRwLCAxLCAxKTsKLQkJc3RsX2VuYWJsZXJ4dHgocG9ydHAsIDEsIDEpOwotCQlzdGxfc3RhcnRyeHR4KHBvcnRwLCAxLCAwKTsKLQkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOwotCQlwb3J0LT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKLQl9Ci0JcmV0dXJuIHR0eV9wb3J0X2Jsb2NrX3RpbF9yZWFkeShwb3J0LCB0dHksIGZpbHApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC04MjYsMzggKzgyMCwxMiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIHN0bF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyB2b2lkIHN0bF9zaHV0ZG93bihzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IHN0bHBvcnQJKnBvcnRwOwotCXN0cnVjdCB0dHlfcG9ydCAqcG9ydDsKLQl1bnNpZ25lZCBsb25nCWZsYWdzOwotCi0JcHJfZGVidWcoInN0bF9jbG9zZSh0dHk9JXAsZmlscD0lcClcbiIsIHR0eSwgZmlscCk7Ci0KLQlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JQlVHX09OKHBvcnRwID09IE5VTEwpOwotCi0JcG9ydCA9ICZwb3J0cC0+cG9ydDsKLQotCWlmICh0dHlfcG9ydF9jbG9zZV9zdGFydChwb3J0LCB0dHksIGZpbHApID09IDApCi0JCXJldHVybjsKLS8qCi0gKglNYXkgd2FudCB0byB3YWl0IGZvciBhbnkgZGF0YSB0byBkcmFpbiBiZWZvcmUgY2xvc2luZy4gVGhlIEJVU1kKLSAqCWZsYWcga2VlcHMgdHJhY2sgb2Ygd2hldGhlciB3ZSBhcmUgc3RpbGwgc2VuZGluZyBvciBub3QgLSBpdCBpcwotICoJdmVyeSBhY2N1cmF0ZSBmb3IgdGhlIGNkMTQwMCwgbm90IHF1aXRlIHNvIGZvciB0aGUgc2MyNjE5OC4KLSAqCShUaGUgc2MyNjE5OCBoYXMgbm8gImVuZC1vZi1kYXRhIiBpbnRlcnJ1cHQgb25seSBlbXB0eSBGSUZPKQotICovCi0Jc3RsX3dhaXR1bnRpbHNlbnQodHR5LCAoSFogLyAyKSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCXBvcnRwLT5wb3J0LmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0KKwlzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IHN0bHBvcnQsIHBvcnQpOwogCXN0bF9kaXNhYmxlaW50cnMocG9ydHApOwotCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkKLQkJc3RsX3NldHNpZ25hbHMocG9ydHAsIDAsIDApOwogCXN0bF9lbmFibGVyeHR4KHBvcnRwLCAwLCAwKTsKLQlzdGxfZmx1c2hidWZmZXIodHR5KTsKKwlzdGxfZmx1c2gocG9ydHApOwogCXBvcnRwLT5pc3RhdGUgPSAwOwogCWlmIChwb3J0cC0+dHguYnVmICE9IE5VTEwpIHsKIAkJa2ZyZWUocG9ydHAtPnR4LmJ1Zik7CkBAIC04NjUsOSArODMzLDE2IEBACiAJCXBvcnRwLT50eC5oZWFkID0gTlVMTDsKIAkJcG9ydHAtPnR4LnRhaWwgPSBOVUxMOwogCX0KK30KIAotCXR0eV9wb3J0X2Nsb3NlX2VuZChwb3J0LCB0dHkpOwotCXR0eV9wb3J0X3R0eV9zZXQocG9ydCwgTlVMTCk7CitzdGF0aWMgdm9pZCBzdGxfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHN0bHBvcnQqcG9ydHA7CisJcHJfZGVidWcoInN0bF9jbG9zZSh0dHk9JXAsZmlscD0lcClcbiIsIHR0eSwgZmlscCk7CisKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJQlVHX09OKHBvcnRwID09IE5VTEwpOworCXR0eV9wb3J0X2Nsb3NlKCZwb3J0cC0+cG9ydCwgdHR5LCBmaWxwKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTMxNCwzNSArMTI4OSwxMiBAQAogCiBzdGF0aWMgdm9pZCBzdGxfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc3RydWN0IHN0bHBvcnQJKnBvcnRwOwotCXN0cnVjdCB0dHlfcG9ydCAqcG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCisJc3RydWN0IHN0bHBvcnQJKnBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlwcl9kZWJ1Zygic3RsX2hhbmd1cCh0dHk9JXApXG4iLCB0dHkpOwogCi0JcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwogCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm47Ci0JcG9ydCA9ICZwb3J0cC0+cG9ydDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0JcG9ydC0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQotCXN0bF9kaXNhYmxlaW50cnMocG9ydHApOwotCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkKLQkJc3RsX3NldHNpZ25hbHMocG9ydHAsIDAsIDApOwotCXN0bF9lbmFibGVyeHR4KHBvcnRwLCAwLCAwKTsKLQlzdGxfZmx1c2hidWZmZXIodHR5KTsKLQlwb3J0cC0+aXN0YXRlID0gMDsKLQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOwotCWlmIChwb3J0cC0+dHguYnVmICE9IE5VTEwpIHsKLQkJa2ZyZWUocG9ydHAtPnR4LmJ1Zik7Ci0JCXBvcnRwLT50eC5idWYgPSBOVUxMOwotCQlwb3J0cC0+dHguaGVhZCA9IE5VTEw7Ci0JCXBvcnRwLT50eC50YWlsID0gTlVMTDsKLQl9Ci0JdHR5X3BvcnRfaGFuZ3VwKHBvcnQpOworCXR0eV9wb3J0X2hhbmd1cCgmcG9ydHAtPnBvcnQpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNDg2LDE4ICsyNDM4LDE5IEBACiAgKgljb2xsZWN0aW9uLgogICovCiAKLXN0YXRpYyBpbnQgc3RsX21lbWlvY3RsKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgbG9uZyBzdGxfbWVtaW9jdGwoc3RydWN0IGZpbGUgKmZwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlpbnQJYnJkbnIsIHJjOwogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCi0JcHJfZGVidWcoInN0bF9tZW1pb2N0bChpcD0lcCxmcD0lcCxjbWQ9JXgsYXJnPSVseClcbiIsIGlwLCBmcCwgY21kLGFyZyk7CisJcHJfZGVidWcoInN0bF9tZW1pb2N0bChmcD0lcCxjbWQ9JXgsYXJnPSVseClcbiIsIGZwLCBjbWQsYXJnKTsKIAotCWJyZG5yID0gaW1pbm9yKGlwKTsKKwlicmRuciA9IGltaW5vcihmcC0+Zl9kZW50cnktPmRfaW5vZGUpOwogCWlmIChicmRuciA+PSBTVExfTUFYQlJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CiAJcmMgPSAwOwogCisJbG9ja19rZXJuZWwoKTsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgQ09NX0dFVFBPUlRTVEFUUzoKIAkJcmMgPSBzdGxfZ2V0cG9ydHN0YXRzKE5VTEwsIE5VTEwsIGFyZ3ApOwpAQCAtMjUxOCw3ICsyNDcxLDcgQEAKIAkJcmMgPSAtRU5PSU9DVExDTUQ7CiAJCWJyZWFrOwogCX0KLQorCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTI1NDksNiArMjUwMiw4IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9wb3J0X29wZXJhdGlvbnMgc3RsX3BvcnRfb3BzID0gewogCS5jYXJyaWVyX3JhaXNlZCA9IHN0bF9jYXJyaWVyX3JhaXNlZCwKIAkuZHRyX3J0cyA9IHN0bF9kdHJfcnRzLAorCS5hY3RpdmF0ZSA9IHN0bF9hY3RpdmF0ZSwKKwkuc2h1dGRvd24gPSBzdGxfc2h1dGRvd24sCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHR5X2lvLmMgYi9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKaW5kZXggNTk0OTllZS4uNjg0ZjBlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3R0eV9pby5jCisrKyBiL2RyaXZlcnMvY2hhci90dHlfaW8uYwpAQCAtMTQyLDcgKzE0Miw2IEBACiAJCQkJCQkJc2l6ZV90LCBsb2ZmX3QgKik7CiBzdGF0aWMgdW5zaWduZWQgaW50IHR0eV9wb2xsKHN0cnVjdCBmaWxlICosIHBvbGxfdGFibGUgKik7CiBzdGF0aWMgaW50IHR0eV9vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKLXN0YXRpYyBpbnQgdHR5X3JlbGVhc2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogbG9uZyB0dHlfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKICNpZmRlZiBDT05GSUdfQ09NUEFUCiBzdGF0aWMgbG9uZyB0dHlfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLApAQCAtNTA2LDggKzUwNSw2IEBACiAJaWYgKCF0dHkpCiAJCXJldHVybjsKIAotCS8qIGludXNlX2ZpbHBzIGlzIHByb3RlY3RlZCBieSB0aGUgc2luZ2xlIGtlcm5lbCBsb2NrICovCi0JbG9ja19rZXJuZWwoKTsKIAogCXNwaW5fbG9jaygmcmVkaXJlY3RfbG9jayk7CiAJaWYgKHJlZGlyZWN0ICYmIHJlZGlyZWN0LT5wcml2YXRlX2RhdGEgPT0gdHR5KSB7CkBAIC01MTYsNyArNTEzLDExIEBACiAJfQogCXNwaW5fdW5sb2NrKCZyZWRpcmVjdF9sb2NrKTsKIAorCS8qIGludXNlX2ZpbHBzIGlzIHByb3RlY3RlZCBieSB0aGUgc2luZ2xlIGtlcm5lbCBsb2NrICovCisJbG9ja19rZXJuZWwoKTsKIAljaGVja190dHlfY291bnQodHR5LCAiZG9fdHR5X2hhbmd1cCIpOworCXVubG9ja19rZXJuZWwoKTsKKwogCWZpbGVfbGlzdF9sb2NrKCk7CiAJLyogVGhpcyBicmVha3MgZm9yIGZpbGUgaGFuZGxlcyBiZWluZyBzZW50IG92ZXIgQUZfVU5JWCBzb2NrZXRzID8gKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZpbHAsICZ0dHktPnR0eV9maWxlcywgZl91LmZ1X2xpc3QpIHsKQEAgLTUzMCw2ICs1MzEsNyBAQAogCX0KIAlmaWxlX2xpc3RfdW5sb2NrKCk7CiAKKwlsb2NrX2tlcm5lbCgpOwogCXR0eV9sZGlzY19oYW5ndXAodHR5KTsKIAogCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CkBAIC03MDgsNiArNzEwLDggQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCXN0cnVjdCBwaWQgKnR0eV9wZ3JwID0gTlVMTDsKIAorCWlmICghY3VycmVudC0+c2lnbmFsLT5sZWFkZXIpCisJCXJldHVybjsKIAogCXR0eSA9IGdldF9jdXJyZW50X3R0eSgpOwogCWlmICh0dHkpIHsKQEAgLTc3Myw4ICs3NzcsNyBAQAogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKIAlsb2NrX2tlcm5lbCgpOwotCWlmICh0c2stPnNpZ25hbC0+bGVhZGVyKQotCQlkaXNhc3NvY2lhdGVfY3R0eSgwKTsKKwlkaXNhc3NvY2lhdGVfY3R0eSgwKTsKIAl1bmxvY2tfa2VybmVsKCk7CiAJcHJvY19jbGVhcl90dHkodHNrKTsKIH0KQEAgLTEwMTcsMTQgKzEwMjAsMTYgQEAKIAogdm9pZCB0dHlfd3JpdGVfbWVzc2FnZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyICptc2cpCiB7Ci0JbG9ja19rZXJuZWwoKTsKIAlpZiAodHR5KSB7CiAJCW11dGV4X2xvY2soJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spOwotCQlpZiAodHR5LT5vcHMtPndyaXRlICYmICF0ZXN0X2JpdChUVFlfQ0xPU0lORywgJnR0eS0+ZmxhZ3MpKQorCQlsb2NrX2tlcm5lbCgpOworCQlpZiAodHR5LT5vcHMtPndyaXRlICYmICF0ZXN0X2JpdChUVFlfQ0xPU0lORywgJnR0eS0+ZmxhZ3MpKSB7CisJCQl1bmxvY2tfa2VybmVsKCk7CiAJCQl0dHktPm9wcy0+d3JpdGUodHR5LCBtc2csIHN0cmxlbihtc2cpKTsKKwkJfSBlbHNlCisJCQl1bmxvY2tfa2VybmVsKCk7CiAJCXR0eV93cml0ZV91bmxvY2sodHR5KTsKIAl9Ci0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybjsKIH0KIApAQCAtMTIwMiwxNCArMTIwNywyMSBAQAogCQkJCQkJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAlpbnQgaWR4ID0gdHR5LT5pbmRleDsKKwlpbnQgcmV0OwogCi0JaWYgKGRyaXZlci0+b3BzLT5pbnN0YWxsKQotCQlyZXR1cm4gZHJpdmVyLT5vcHMtPmluc3RhbGwoZHJpdmVyLCB0dHkpOworCWlmIChkcml2ZXItPm9wcy0+aW5zdGFsbCkgeworCQlsb2NrX2tlcm5lbCgpOworCQlyZXQgPSBkcml2ZXItPm9wcy0+aW5zdGFsbChkcml2ZXIsIHR0eSk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAlpZiAodHR5X2luaXRfdGVybWlvcyh0dHkpID09IDApIHsKKwkJbG9ja19rZXJuZWwoKTsKIAkJdHR5X2RyaXZlcl9rcmVmX2dldChkcml2ZXIpOwogCQl0dHktPmNvdW50Kys7CiAJCWRyaXZlci0+dHR5c1tpZHhdID0gdHR5OworCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gLUVOT01FTTsKQEAgLTEzMDIsMTAgKzEzMTQsMTQgQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWludCByZXR2YWw7CiAKKwlsb2NrX2tlcm5lbCgpOwogCS8qIENoZWNrIGlmIHB0eSBtYXN0ZXIgaXMgYmVpbmcgb3BlbmVkIG11bHRpcGxlIHRpbWVzICovCiAJaWYgKGRyaXZlci0+c3VidHlwZSA9PSBQVFlfVFlQRV9NQVNURVIgJiYKLQkJKGRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0RFVlBUU19NRU0pICYmICFmaXJzdF9vaykKKwkJKGRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0RFVlBUU19NRU0pICYmICFmaXJzdF9vaykgeworCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiBFUlJfUFRSKC1FSU8pOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CiAKIAkvKgogCSAqIEZpcnN0IHRpbWUgb3BlbiBpcyBjb21wbGV4LCBlc3BlY2lhbGx5IGZvciBQVFkgZGV2aWNlcy4KQEAgLTEzMzUsNyArMTM1MSw2IEBACiAJICogSWYgd2UgZmFpbCBoZXJlIGp1c3QgY2FsbCByZWxlYXNlX3R0eSB0byBjbGVhbiB1cC4gIE5vIG5lZWQKIAkgKiB0byBkZWNyZW1lbnQgdGhlIHVzZSBjb3VudHMsIGFzIHJlbGVhc2VfdHR5IGRvZXNuJ3QgY2FyZS4KIAkgKi8KLQogCXJldHZhbCA9IHR0eV9sZGlzY19zZXR1cCh0dHksIHR0eS0+bGluayk7CiAJaWYgKHJldHZhbCkKIAkJZ290byByZWxlYXNlX21lbV9vdXQ7CkBAIC0xMzUwLDcgKzEzNjUsOSBAQAogCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCiAJCXByaW50ayhLRVJOX0lORk8gInR0eV9pbml0X2RldjogbGRpc2Mgb3BlbiBmYWlsZWQsICIKIAkJCQkgImNsZWFyaW5nIHNsb3QgJWRcbiIsIGlkeCk7CisJbG9ja19rZXJuZWwoKTsKIAlyZWxlYXNlX3R0eSh0dHksIGlkeCk7CisJdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiBFUlJfUFRSKHJldHZhbCk7CiB9CiAKQEAgLTE0NjQsNyArMTQ4MSwxNyBAQAogCXR0eV9rcmVmX3B1dCh0dHkpOwogfQogCi0vKgorLyoqCisgKgl0dHlfcmVsZWFzZQkJLQl2ZnMgY2FsbGJhY2sgZm9yIGNsb3NlCisgKglAaW5vZGU6IGlub2RlIG9mIHR0eQorICoJQGZpbHA6IGZpbGUgcG9pbnRlciBmb3IgaGFuZGxlIHRvIHR0eQorICoKKyAqCUNhbGxlZCB0aGUgbGFzdCB0aW1lIGVhY2ggZmlsZSBoYW5kbGUgaXMgY2xvc2VkIHRoYXQgcmVmZXJlbmNlcworICoJdGhpcyB0dHkuIFRoZXJlIG1heSBob3dldmVyIGJlIHNldmVyYWwgc3VjaCByZWZlcmVuY2VzLgorICoKKyAqCUxvY2tpbmc6CisgKgkJVGFrZXMgYmtsLiBTZWUgdHR5X3JlbGVhc2VfZGV2CisgKgogICogRXZlbiByZWxlYXNpbmcgdGhlIHR0eSBzdHJ1Y3R1cmVzIGlzIGEgdHJpY2t5IGJ1c2luZXNzLi4gV2UgaGF2ZQogICogdG8gYmUgdmVyeSBjYXJlZnVsIHRoYXQgdGhlIHN0cnVjdHVyZXMgYXJlIGFsbCByZWxlYXNlZCBhdCB0aGUKICAqIHNhbWUgdGltZSwgYXMgaW50ZXJydXB0cyBtaWdodCBvdGhlcndpc2UgZ2V0IHRoZSB3cm9uZyBwb2ludGVycy4KQEAgLTE0NzIsMjAgKzE0OTksMjAgQEAKICAqIFdTSCAwOS8wOS85NzogcmV3cml0dGVuIHRvIGF2b2lkIHNvbWUgbmFzdHkgcmFjZSBjb25kaXRpb25zIHRoYXQgY291bGQKICAqIGxlYWQgdG8gZG91YmxlIGZyZWVzIG9yIHJlbGVhc2luZyBtZW1vcnkgc3RpbGwgaW4gdXNlLgogICovCi12b2lkIHR0eV9yZWxlYXNlX2RldihzdHJ1Y3QgZmlsZSAqZmlscCkKKworaW50IHR0eV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHksICpvX3R0eTsKIAlpbnQJcHR5X21hc3RlciwgdHR5X2Nsb3NpbmcsIG9fdHR5X2Nsb3NpbmcsIGRvX3NsZWVwOwogCWludAlkZXZwdHM7CiAJaW50CWlkeDsKIAljaGFyCWJ1Zls2NF07Ci0Jc3RydWN0IAlpbm9kZSAqaW5vZGU7CiAKLQlpbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJdHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0ICopZmlscC0+cHJpdmF0ZV9kYXRhOwogCWlmICh0dHlfcGFyYW5vaWFfY2hlY2sodHR5LCBpbm9kZSwgInR0eV9yZWxlYXNlX2RldiIpKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCisJbG9ja19rZXJuZWwoKTsKIAljaGVja190dHlfY291bnQodHR5LCAidHR5X3JlbGVhc2VfZGV2Iik7CiAKIAl0dHlfZmFzeW5jKC0xLCBmaWxwLCAwKTsKQEAgLTE1MDAsMTkgKzE1MjcsMjIgQEAKIAlpZiAoaWR4IDwgMCB8fCBpZHggPj0gdHR5LT5kcml2ZXItPm51bSkgewogCQlwcmludGsoS0VSTl9ERUJVRyAidHR5X3JlbGVhc2VfZGV2OiBiYWQgaWR4IHdoZW4gdHJ5aW5nIHRvICIKIAkJCQkgICJmcmVlICglcylcbiIsIHR0eS0+bmFtZSk7Ci0JCXJldHVybjsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gMDsKIAl9CiAJaWYgKCFkZXZwdHMpIHsKIAkJaWYgKHR0eSAhPSB0dHktPmRyaXZlci0+dHR5c1tpZHhdKSB7CisJCQl1bmxvY2tfa2VybmVsKCk7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAidHR5X3JlbGVhc2VfZGV2OiBkcml2ZXIudGFibGVbJWRdIG5vdCB0dHkgIgogCQkJICAgICAgICJmb3IgKCVzKVxuIiwgaWR4LCB0dHktPm5hbWUpOwotCQkJcmV0dXJuOworCQkJcmV0dXJuIDA7CiAJCX0KIAkJaWYgKHR0eS0+dGVybWlvcyAhPSB0dHktPmRyaXZlci0+dGVybWlvc1tpZHhdKSB7CisJCQl1bmxvY2tfa2VybmVsKCk7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAidHR5X3JlbGVhc2VfZGV2OiBkcml2ZXIudGVybWlvc1slZF0gbm90IHRlcm1pb3MgIgogCQkJICAgICAgICJmb3IgKCVzKVxuIiwKIAkJCSAgICAgICBpZHgsIHR0eS0+bmFtZSk7Ci0JCQlyZXR1cm47CisJCQlyZXR1cm4gMDsKIAkJfQogCX0KICNlbmRpZgpAQCAtMTUyNiwyNiArMTU1NiwzMCBAQAogCWlmICh0dHktPmRyaXZlci0+b3RoZXIgJiYKIAkgICAgICEodHR5LT5kcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9ERVZQVFNfTUVNKSkgewogCQlpZiAob190dHkgIT0gdHR5LT5kcml2ZXItPm90aGVyLT50dHlzW2lkeF0pIHsKKwkJCXVubG9ja19rZXJuZWwoKTsKIAkJCXByaW50ayhLRVJOX0RFQlVHICJ0dHlfcmVsZWFzZV9kZXY6IG90aGVyLT50YWJsZVslZF0gIgogCQkJCQkgICJub3Qgb190dHkgZm9yICglcylcbiIsCiAJCQkgICAgICAgaWR4LCB0dHktPm5hbWUpOwotCQkJcmV0dXJuOworCQkJcmV0dXJuIDAgOwogCQl9CiAJCWlmIChvX3R0eS0+dGVybWlvcyAhPSB0dHktPmRyaXZlci0+b3RoZXItPnRlcm1pb3NbaWR4XSkgeworCQkJdW5sb2NrX2tlcm5lbCgpOwogCQkJcHJpbnRrKEtFUk5fREVCVUcgInR0eV9yZWxlYXNlX2Rldjogb3RoZXItPnRlcm1pb3NbJWRdICIKIAkJCQkJICAibm90IG9fdGVybWlvcyBmb3IgKCVzKVxuIiwKIAkJCSAgICAgICBpZHgsIHR0eS0+bmFtZSk7Ci0JCQlyZXR1cm47CisJCQlyZXR1cm4gMDsKIAkJfQogCQlpZiAob190dHktPmxpbmsgIT0gdHR5KSB7CisJCQl1bmxvY2tfa2VybmVsKCk7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAidHR5X3JlbGVhc2VfZGV2OiBiYWQgcHR5IHBvaW50ZXJzXG4iKTsKLQkJCXJldHVybjsKKwkJCXJldHVybiAwOwogCQl9CiAJfQogI2VuZGlmCiAJaWYgKHR0eS0+b3BzLT5jbG9zZSkKIAkJdHR5LT5vcHMtPmNsb3NlKHR0eSwgZmlscCk7CiAKKwl1bmxvY2tfa2VybmVsKCk7CiAJLyoKIAkgKiBTYW5pdHkgY2hlY2s6IGlmIHR0eS0+Y291bnQgaXMgZ29pbmcgdG8gemVybywgdGhlcmUgc2hvdWxkbid0IGJlCiAJICogYW55IHdhaXRlcnMgb24gdHR5LT5yZWFkX3dhaXQgb3IgdHR5LT53cml0ZV93YWl0LiAgV2UgdGVzdCB0aGUKQEAgLTE1NjgsNiArMTYwMiw3IEBACiAJCSAgIG9wZW5zIG9uIC9kZXYvdHR5ICovCiAKIAkJbXV0ZXhfbG9jaygmdHR5X211dGV4KTsKKwkJbG9ja19rZXJuZWwoKTsKIAkJdHR5X2Nsb3NpbmcgPSB0dHktPmNvdW50IDw9IDE7CiAJCW9fdHR5X2Nsb3NpbmcgPSBvX3R0eSAmJgogCQkJKG9fdHR5LT5jb3VudCA8PSAocHR5X21hc3RlciA/IDEgOiAwKSk7CkBAIC0xNTk4LDYgKzE2MzMsNyBAQAogCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInR0eV9yZWxlYXNlX2RldjogJXM6IHJlYWQvd3JpdGUgd2FpdCBxdWV1ZSAiCiAJCQkJICAgICJhY3RpdmUhXG4iLCB0dHlfbmFtZSh0dHksIGJ1ZikpOworCQl1bmxvY2tfa2VybmVsKCk7CiAJCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKIAkJc2NoZWR1bGUoKTsKIAl9CkBAIC0xNjYxLDggKzE2OTcsMTAgQEAKIAltdXRleF91bmxvY2soJnR0eV9tdXRleCk7CiAKIAkvKiBjaGVjayB3aGV0aGVyIGJvdGggc2lkZXMgYXJlIGNsb3NpbmcgLi4uICovCi0JaWYgKCF0dHlfY2xvc2luZyB8fCAob190dHkgJiYgIW9fdHR5X2Nsb3NpbmcpKQotCQlyZXR1cm47CisJaWYgKCF0dHlfY2xvc2luZyB8fCAob190dHkgJiYgIW9fdHR5X2Nsb3NpbmcpKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIDA7CisJfQogCiAjaWZkZWYgVFRZX0RFQlVHX0hBTkdVUAogCXByaW50ayhLRVJOX0RFQlVHICJmcmVlaW5nIHR0eSBzdHJ1Y3R1cmUuLi4iKTsKQEAgLTE2ODAsMTAgKzE3MTgsMTIgQEAKIAkvKiBNYWtlIHRoaXMgcHR5IG51bWJlciBhdmFpbGFibGUgZm9yIHJlYWxsb2NhdGlvbiAqLwogCWlmIChkZXZwdHMpCiAJCWRldnB0c19raWxsX2luZGV4KGlub2RlLCBpZHgpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKglfX3R0eV9vcGVuCQktCW9wZW4gYSB0dHkgZGV2aWNlCisgKgl0dHlfb3BlbgkJLQlvcGVuIGEgdHR5IGRldmljZQogICoJQGlub2RlOiBpbm9kZSBvZiBkZXZpY2UgZmlsZQogICoJQGZpbHA6IGZpbGUgcG9pbnRlciB0byB0dHkKICAqCkBAIC0xNzAzLDcgKzE3NDMsNyBAQAogICoJCSAtPnNpZ2xvY2sgcHJvdGVjdHMgLT5zaWduYWwvLT5zaWdoYW5kCiAgKi8KIAotc3RhdGljIGludCBfX3R0eV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIGludCB0dHlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gTlVMTDsKIAlpbnQgbm9jdHR5LCByZXR2YWw7CkBAIC0xNzIwLDEwICsxNzYwLDEyIEBACiAJcmV0dmFsID0gMDsKIAogCW11dGV4X2xvY2soJnR0eV9tdXRleCk7CisJbG9ja19rZXJuZWwoKTsKIAogCWlmIChkZXZpY2UgPT0gTUtERVYoVFRZQVVYX01BSk9SLCAwKSkgewogCQl0dHkgPSBnZXRfY3VycmVudF90dHkoKTsKIAkJaWYgKCF0dHkpIHsKKwkJCXVubG9ja19rZXJuZWwoKTsKIAkJCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKIAkJCXJldHVybiAtRU5YSU87CiAJCX0KQEAgLTE3NTUsMTIgKzE3OTcsMTQgQEAKIAkJCQlnb3RvIGdvdF9kcml2ZXI7CiAJCQl9CiAJCX0KKwkJdW5sb2NrX2tlcm5lbCgpOwogCQltdXRleF91bmxvY2soJnR0eV9tdXRleCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWRyaXZlciA9IGdldF90dHlfZHJpdmVyKGRldmljZSwgJmluZGV4KTsKIAlpZiAoIWRyaXZlcikgeworCQl1bmxvY2tfa2VybmVsKCk7CiAJCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtMTc3MCw2ICsxODE0LDcgQEAKIAkJdHR5ID0gdHR5X2RyaXZlcl9sb29rdXBfdHR5KGRyaXZlciwgaW5vZGUsIGluZGV4KTsKIAogCQlpZiAoSVNfRVJSKHR0eSkpIHsKKwkJCXVubG9ja19rZXJuZWwoKTsKIAkJCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKIAkJCXJldHVybiBQVFJfRVJSKHR0eSk7CiAJCX0KQEAgLTE3ODQsOCArMTgyOSwxMCBAQAogCiAJbXV0ZXhfdW5sb2NrKCZ0dHlfbXV0ZXgpOwogCXR0eV9kcml2ZXJfa3JlZl9wdXQoZHJpdmVyKTsKLQlpZiAoSVNfRVJSKHR0eSkpCisJaWYgKElTX0VSUih0dHkpKSB7CisJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIFBUUl9FUlIodHR5KTsKKwl9CiAKIAlmaWxwLT5wcml2YXRlX2RhdGEgPSB0dHk7CiAJZmlsZV9tb3ZlKGZpbHAsICZ0dHktPnR0eV9maWxlcyk7CkBAIC0xODEzLDExICsxODYwLDE1IEBACiAJCXByaW50ayhLRVJOX0RFQlVHICJlcnJvciAlZCBpbiBvcGVuaW5nICVzLi4uIiwgcmV0dmFsLAogCQkgICAgICAgdHR5LT5uYW1lKTsKICNlbmRpZgotCQl0dHlfcmVsZWFzZV9kZXYoZmlscCk7Ci0JCWlmIChyZXR2YWwgIT0gLUVSRVNUQVJUU1lTKQorCQl0dHlfcmVsZWFzZShpbm9kZSwgZmlscCk7CisJCWlmIChyZXR2YWwgIT0gLUVSRVNUQVJUU1lTKSB7CisJCQl1bmxvY2tfa2VybmVsKCk7CiAJCQlyZXR1cm4gcmV0dmFsOwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCX0KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQl1bmxvY2tfa2VybmVsKCk7CiAJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJCXNjaGVkdWxlKCk7CiAJCS8qCiAJCSAqIE5lZWQgdG8gcmVzZXQgZl9vcCBpbiBjYXNlIGEgaGFuZ3VwIGhhcHBlbmVkLgpAQCAtMTgyNiw4ICsxODc3LDExIEBACiAJCQlmaWxwLT5mX29wID0gJnR0eV9mb3BzOwogCQlnb3RvIHJldHJ5X29wZW47CiAJfQorCXVubG9ja19rZXJuZWwoKTsKKwogCiAJbXV0ZXhfbG9jaygmdHR5X211dGV4KTsKKwlsb2NrX2tlcm5lbCgpOwogCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCWlmICghbm9jdHR5ICYmCiAJICAgIGN1cnJlbnQtPnNpZ25hbC0+bGVhZGVyICYmCkBAIC0xODM1LDQzICsxODg5LDEyIEBACiAJICAgIHR0eS0+c2Vzc2lvbiA9PSBOVUxMKQogCQlfX3Byb2Nfc2V0X3R0eShjdXJyZW50LCB0dHkpOwogCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJdW5sb2NrX2tlcm5lbCgpOwogCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKIAlyZXR1cm4gMDsKIH0KIAotLyogQktMIHB1c2hkb3duOiBzY2FyeSBjb2RlIGF2b2lkYW5jZSB3cmFwcGVyICovCi1zdGF0aWMgaW50IHR0eV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCWludCByZXQ7CiAKLQlsb2NrX2tlcm5lbCgpOwotCXJldCA9IF9fdHR5X29wZW4oaW5vZGUsIGZpbHApOwotCXVubG9ja19rZXJuZWwoKTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLQotCi0vKioKLSAqCXR0eV9yZWxlYXNlCQktCXZmcyBjYWxsYmFjayBmb3IgY2xvc2UKLSAqCUBpbm9kZTogaW5vZGUgb2YgdHR5Ci0gKglAZmlscDogZmlsZSBwb2ludGVyIGZvciBoYW5kbGUgdG8gdHR5Ci0gKgotICoJQ2FsbGVkIHRoZSBsYXN0IHRpbWUgZWFjaCBmaWxlIGhhbmRsZSBpcyBjbG9zZWQgdGhhdCByZWZlcmVuY2VzCi0gKgl0aGlzIHR0eS4gVGhlcmUgbWF5IGhvd2V2ZXIgYmUgc2V2ZXJhbCBzdWNoIHJlZmVyZW5jZXMuCi0gKgotICoJTG9ja2luZzoKLSAqCQlUYWtlcyBia2wuIFNlZSB0dHlfcmVsZWFzZV9kZXYKLSAqLwotCi1zdGF0aWMgaW50IHR0eV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCWxvY2tfa2VybmVsKCk7Ci0JdHR5X3JlbGVhc2VfZGV2KGZpbHApOwotCXVubG9ja19rZXJuZWwoKTsKLQlyZXR1cm4gMDsKLX0KIAogLyoqCiAgKgl0dHlfcG9sbAktCWNoZWNrIHR0eSBzdGF0dXMKQEAgLTIzMTcsOSArMjM0MCw3IEBACiAJaWYgKGdldF91c2VyKGxkaXNjLCBwKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlsb2NrX2tlcm5lbCgpOwogCXJldCA9IHR0eV9zZXRfbGRpc2ModHR5LCBsZGlzYyk7Ci0JdW5sb2NrX2tlcm5lbCgpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90dHlfbGRpc2MuYyBiL2RyaXZlcnMvY2hhci90dHlfbGRpc2MuYwppbmRleCBmZWI1NTA3Li4zZjY1M2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHR5X2xkaXNjLmMKKysrIGIvZHJpdmVycy9jaGFyL3R0eV9sZGlzYy5jCkBAIC0zNCw2ICszNCw4IEBACiAjaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbGVjdGlvbi5oPgogCisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4JLyogRm9yIHRoZSBtb21lbnQgKi8KKwogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CiAKQEAgLTQ0Myw4ICs0NDUsMTQgQEAKIHN0YXRpYyBpbnQgdHR5X2xkaXNjX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHR0eV9sZGlzYyAqbGQpCiB7CiAJV0FSTl9PTih0ZXN0X2FuZF9zZXRfYml0KFRUWV9MRElTQ19PUEVOLCAmdHR5LT5mbGFncykpOwotCWlmIChsZC0+b3BzLT5vcGVuKQotCQlyZXR1cm4gbGQtPm9wcy0+b3Blbih0dHkpOworCWlmIChsZC0+b3BzLT5vcGVuKSB7CisJCWludCByZXQ7CisgICAgICAgICAgICAgICAgLyogQktMIGhlcmUgbG9ja3MgdmVydXMgYSBoYW5ndXAgZXZlbnQgKi8KKwkJbG9ja19rZXJuZWwoKTsKKwkJcmV0ID0gbGQtPm9wcy0+b3Blbih0dHkpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiByZXQ7CisJfQogCXJldHVybiAwOwogfQogCkBAIC01NDUsNiArNTUzLDcgQEAKIAlpZiAoSVNfRVJSKG5ld19sZGlzYykpCiAJCXJldHVybiBQVFJfRVJSKG5ld19sZGlzYyk7CiAKKwlsb2NrX2tlcm5lbCgpOwogCS8qCiAJICoJV2UgbmVlZCB0byBsb29rIGF0IHRoZSB0dHkgbG9ja2luZyBoZXJlIGZvciBwdHkvdHR5IHBhaXJzCiAJICoJd2hlbiBib3RoIHNpZGVzIHRyeSB0byBjaGFuZ2UgaW4gcGFyYWxsZWwuCkBAIC01NTgsMTAgKzU2NywxMiBAQAogCSAqLwogCiAJaWYgKHR0eS0+bGRpc2MtPm9wcy0+bnVtID09IGxkaXNjKSB7CisJCXVubG9ja19rZXJuZWwoKTsKIAkJdHR5X2xkaXNjX3B1dChuZXdfbGRpc2MpOwogCQlyZXR1cm4gMDsKIAl9CiAKKwl1bmxvY2tfa2VybmVsKCk7CiAJLyoKIAkgKglQcm9ibGVtOiBXaGF0IGRvIHdlIGRvIGlmIHRoaXMgYmxvY2tzID8KIAkgKglXZSBjb3VsZCBkZWFkbG9jayBoZXJlCkBAIC01ODIsNiArNTkzLDkgQEAKIAkJCXRlc3RfYml0KFRUWV9MRElTQ19DSEFOR0lORywgJnR0eS0+ZmxhZ3MpID09IDApOwogCQltdXRleF9sb2NrKCZ0dHktPmxkaXNjX211dGV4KTsKIAl9CisKKwlsb2NrX2tlcm5lbCgpOworCiAJc2V0X2JpdChUVFlfTERJU0NfQ0hBTkdJTkcsICZ0dHktPmZsYWdzKTsKIAogCS8qCkBAIC01OTIsNiArNjA2LDggQEAKIAl0dHktPnJlY2VpdmVfcm9vbSA9IDA7CiAKIAlvX2xkaXNjID0gdHR5LT5sZGlzYzsKKworCXVubG9ja19rZXJuZWwoKTsKIAkvKgogCSAqCU1ha2Ugc3VyZSB3ZSBkb24ndCBjaGFuZ2Ugd2hpbGUgc29tZW9uZSBob2xkcyBhCiAJICoJcmVmZXJlbmNlIHRvIHRoZSBsaW5lIGRpc2NpcGxpbmUuIFRoZSBUVFlfTERJU0MgYml0CkBAIC02MTcsMTIgKzYzMywxNCBAQAogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiAKIAltdXRleF9sb2NrKCZ0dHktPmxkaXNjX211dGV4KTsKKwlsb2NrX2tlcm5lbCgpOwogCWlmICh0ZXN0X2JpdChUVFlfSFVQUEVELCAmdHR5LT5mbGFncykpIHsKIAkJLyogV2Ugd2VyZSByYWNlZCBieSB0aGUgaGFuZ3VwIG1ldGhvZC4gSXQgd2lsbCBoYXZlIHN0b21wZWQKIAkJICAgdGhlIGxkaXNjIGRhdGEgYW5kIGNsb3NlZCB0aGUgbGRpc2MgZG93biAqLwogCQljbGVhcl9iaXQoVFRZX0xESVNDX0NIQU5HSU5HLCAmdHR5LT5mbGFncyk7CiAJCW11dGV4X3VubG9jaygmdHR5LT5sZGlzY19tdXRleCk7CiAJCXR0eV9sZGlzY19wdXQobmV3X2xkaXNjKTsKKwkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTY2NCw2ICs2ODIsNyBAQAogCWlmIChvX3dvcmspCiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmb190dHktPmJ1Zi53b3JrLCAxKTsKIAltdXRleF91bmxvY2soJnR0eS0+bGRpc2NfbXV0ZXgpOworCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHR5X3BvcnQuYyBiL2RyaXZlcnMvY2hhci90dHlfcG9ydC5jCmluZGV4IGM2M2YzZDMuLmJlNDkyZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90dHlfcG9ydC5jCisrKyBiL2RyaXZlcnMvY2hhci90dHlfcG9ydC5jCkBAIC0yNSwxOSArMjUsMjEgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5jbG9zZV93YWl0KTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5kZWx0YV9tc3Jfd2FpdCk7CiAJbXV0ZXhfaW5pdCgmcG9ydC0+bXV0ZXgpOworCW11dGV4X2luaXQoJnBvcnQtPmJ1Zl9tdXRleCk7CiAJc3Bpbl9sb2NrX2luaXQoJnBvcnQtPmxvY2spOwogCXBvcnQtPmNsb3NlX2RlbGF5ID0gKDUwICogSFopIC8gMTAwOwogCXBvcnQtPmNsb3Npbmdfd2FpdCA9ICgzMDAwICogSFopIC8gMTAwOworCWtyZWZfaW5pdCgmcG9ydC0+a3JlZik7CiB9CiBFWFBPUlRfU1lNQk9MKHR0eV9wb3J0X2luaXQpOwogCiBpbnQgdHR5X3BvcnRfYWxsb2NfeG1pdF9idWYoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQogewogCS8qIFdlIG1heSBzbGVlcCBpbiBnZXRfemVyb2VkX3BhZ2UoKSAqLwotCW11dGV4X2xvY2soJnBvcnQtPm11dGV4KTsKKwltdXRleF9sb2NrKCZwb3J0LT5idWZfbXV0ZXgpOwogCWlmIChwb3J0LT54bWl0X2J1ZiA9PSBOVUxMKQogCQlwb3J0LT54bWl0X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmcG9ydC0+YnVmX211dGV4KTsKIAlpZiAocG9ydC0+eG1pdF9idWYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJcmV0dXJuIDA7CkBAIC00NiwxNSArNDgsMzIgQEAKIAogdm9pZCB0dHlfcG9ydF9mcmVlX3htaXRfYnVmKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKIHsKLQltdXRleF9sb2NrKCZwb3J0LT5tdXRleCk7CisJbXV0ZXhfbG9jaygmcG9ydC0+YnVmX211dGV4KTsKIAlpZiAocG9ydC0+eG1pdF9idWYgIT0gTlVMTCkgewogCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcG9ydC0+eG1pdF9idWYpOwogCQlwb3J0LT54bWl0X2J1ZiA9IE5VTEw7CiAJfQotCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmcG9ydC0+YnVmX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0wodHR5X3BvcnRfZnJlZV94bWl0X2J1Zik7CiAKK3N0YXRpYyB2b2lkIHR0eV9wb3J0X2Rlc3RydWN0b3Ioc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHR0eV9wb3J0ICpwb3J0ID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCB0dHlfcG9ydCwga3JlZik7CisJaWYgKHBvcnQtPnhtaXRfYnVmKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcG9ydC0+eG1pdF9idWYpOworCWlmIChwb3J0LT5vcHMtPmRlc3RydWN0KQorCQlwb3J0LT5vcHMtPmRlc3RydWN0KHBvcnQpOworCWVsc2UKKwkJa2ZyZWUocG9ydCk7Cit9CisKK3ZvaWQgdHR5X3BvcnRfcHV0KHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKK3sKKwlpZiAocG9ydCkKKwkJa3JlZl9wdXQoJnBvcnQtPmtyZWYsIHR0eV9wb3J0X2Rlc3RydWN0b3IpOworfQorRVhQT1JUX1NZTUJPTCh0dHlfcG9ydF9wdXQpOwogCiAvKioKICAqCXR0eV9wb3J0X3R0eV9nZXQJLQlnZXQgYSB0dHkgcmVmZXJlbmNlCkBAIC05OSwxMCArMTE4LDExIEBACiAKIHN0YXRpYyB2b2lkIHR0eV9wb3J0X3NodXRkb3duKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKIHsKKwltdXRleF9sb2NrKCZwb3J0LT5tdXRleCk7CiAJaWYgKHBvcnQtPm9wcy0+c2h1dGRvd24gJiYKIAkJdGVzdF9hbmRfY2xlYXJfYml0KEFTWU5DQl9JTklUSUFMSVpFRCwgJnBvcnQtPmZsYWdzKSkKIAkJCXBvcnQtPm9wcy0+c2h1dGRvd24ocG9ydCk7Ci0KKwltdXRleF91bmxvY2soJnBvcnQtPm11dGV4KTsKIH0KIAogLyoqCkBAIC0xMjAsOCArMTQwLDEwIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAlwb3J0LT5jb3VudCA9IDA7CiAJcG9ydC0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7Ci0JaWYgKHBvcnQtPnR0eSkKKwlpZiAocG9ydC0+dHR5KSB7CisJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmcG9ydC0+dHR5LT5mbGFncyk7CiAJCXR0eV9rcmVmX3B1dChwb3J0LT50dHkpOworCX0KIAlwb3J0LT50dHkgPSBOVUxMOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPm9wZW5fd2FpdCk7CkBAIC0xOTgsNyArMjIwLDcgQEAKICAqCW1hbmFnZW1lbnQgb2YgdGhlc2UgbGluZXMuIE5vdGUgdGhhdCB0aGUgZHRyL3J0cyByYWlzZSBpcyBkb25lIGVhY2gKICAqCWl0ZXJhdGlvbiBhcyBhIGhhbmd1cCBtYXkgaGF2ZSBwcmV2aW91c2x5IGRyb3BwZWQgdGhlbSB3aGlsZSB3ZSB3YWl0LgogICovCi0gCisKIGludCB0dHlfcG9ydF9ibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9wb3J0ICpwb3J0LAogCQkJCXN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewpAQCAtMjUzLDcgKzI3NSw4IEBACiAJCQl0dHlfcG9ydF9yYWlzZV9kdHJfcnRzKHBvcnQpOwogCiAJCXByZXBhcmVfdG9fd2FpdCgmcG9ydC0+b3Blbl93YWl0LCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJLyogQ2hlY2sgZm9yIGEgaGFuZ3VwIG9yIHVuaW5pdGlhbGlzZWQgcG9ydC4gUmV0dXJuIGFjY29yZGluZ2x5ICovCisJCS8qIENoZWNrIGZvciBhIGhhbmd1cCBvciB1bmluaXRpYWxpc2VkIHBvcnQuCisJCQkJCQkJUmV0dXJuIGFjY29yZGluZ2x5ICovCiAJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8ICEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKIAkJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCiAJCQkJcmV0dmFsID0gLUVBR0FJTjsKQEAgLTI4NSwxMSArMzA4LDExIEBACiAJCXBvcnQtPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCXJldHVybiByZXR2YWw7Ci0JCiB9CiBFWFBPUlRfU1lNQk9MKHR0eV9wb3J0X2Jsb2NrX3RpbF9yZWFkeSk7CiAKLWludCB0dHlfcG9ydF9jbG9zZV9zdGFydChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoraW50IHR0eV9wb3J0X2Nsb3NlX3N0YXJ0KHN0cnVjdCB0dHlfcG9ydCAqcG9ydCwKKwkJCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yOTksNyArMzIyLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYoIHR0eS0+Y291bnQgPT0gMSAmJiBwb3J0LT5jb3VudCAhPSAxKSB7CisJaWYgKHR0eS0+Y291bnQgPT0gMSAmJiBwb3J0LT5jb3VudCAhPSAxKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICJ0dHlfcG9ydF9jbG9zZV9zdGFydDogdHR5LT5jb3VudCA9IDEgcG9ydCBjb3VudCA9ICVkLlxuIiwKIAkJCQkJCQkJcG9ydC0+Y291bnQpOwpAQCAtMzMxLDEyICszNTQsMjAgQEAKIAkJbG9uZyB0aW1lb3V0OwogCiAJCWlmIChicHMgPiAxMjAwKQotCQkJdGltZW91dCA9IG1heF90KGxvbmcsIChIWiAqIDEwICogcG9ydC0+ZHJhaW5fZGVsYXkpIC8gYnBzLAotCQkJCQkJCQlIWiAvIDEwKTsKKwkJCXRpbWVvdXQgPSBtYXhfdChsb25nLAorCQkJCShIWiAqIDEwICogcG9ydC0+ZHJhaW5fZGVsYXkpIC8gYnBzLCBIWiAvIDEwKTsKIAkJZWxzZQogCQkJdGltZW91dCA9IDIgKiBIWjsKIAkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHRpbWVvdXQpOwogCX0KKwkvKiBGbHVzaCB0aGUgbGRpc2MgYnVmZmVyaW5nICovCisJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CisKKwkvKiBEcm9wIERUUi9SVFMgaWYgSFVQQ0wgaXMgc2V0LiBUaGlzIGNhdXNlcyBhbnkgYXR0YWNoZWQgbW9kZW0gdG8KKwkgICBoYW5nIHVwIHRoZSBsaW5lICovCisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKQorCQl0dHlfcG9ydF9sb3dlcl9kdHJfcnRzKHBvcnQpOworCiAJLyogRG9uJ3QgY2FsbCBwb3J0LT5kcm9wIGZvciB0aGUgbGFzdCByZWZlcmVuY2UuIENhbGxlcnMgd2lsbCB3YW50CiAJICAgdG8gZHJvcCB0aGUgbGFzdCBhY3RpdmUgcmVmZXJlbmNlIGluIC0+c2h1dGRvd24oKSBvciB0aGUgdHR5CiAJICAgc2h1dGRvd24gcGF0aCAqLwpAQCAtMzQ4LDExICszNzksNiBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQl0dHlfbGRpc2NfZmx1c2godHR5KTsKLQotCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkKLQkJdHR5X3BvcnRfbG93ZXJfZHRyX3J0cyhwb3J0KTsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAJdHR5LT5jbG9zaW5nID0gMDsKIApAQCAtMzc3LDcgKzQwMyw0MiBAQAogCWlmICh0dHlfcG9ydF9jbG9zZV9zdGFydChwb3J0LCB0dHksIGZpbHApID09IDApCiAJCXJldHVybjsKIAl0dHlfcG9ydF9zaHV0ZG93bihwb3J0KTsKKwlzZXRfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOwogCXR0eV9wb3J0X2Nsb3NlX2VuZChwb3J0LCB0dHkpOwogCXR0eV9wb3J0X3R0eV9zZXQocG9ydCwgTlVMTCk7CiB9CiBFWFBPUlRfU1lNQk9MKHR0eV9wb3J0X2Nsb3NlKTsKKworaW50IHR0eV9wb3J0X29wZW4oc3RydWN0IHR0eV9wb3J0ICpwb3J0LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJCQkJCXN0cnVjdCBmaWxlICpmaWxwKQoreworCXNwaW5fbG9ja19pcnEoJnBvcnQtPmxvY2spOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJKytwb3J0LT5jb3VudDsKKwlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOworCXR0eV9wb3J0X3R0eV9zZXQocG9ydCwgdHR5KTsKKworCS8qCisJICogRG8gdGhlIGRldmljZS1zcGVjaWZpYyBvcGVuIG9ubHkgaWYgdGhlIGhhcmR3YXJlIGlzbid0CisJICogYWxyZWFkeSBpbml0aWFsaXplZC4gU2VyaWFsaXplIG9wZW4gYW5kIHNodXRkb3duIHVzaW5nIHRoZQorCSAqIHBvcnQgbXV0ZXguCisJICovCisKKwltdXRleF9sb2NrKCZwb3J0LT5tdXRleCk7CisKKwlpZiAoIXRlc3RfYml0KEFTWU5DQl9JTklUSUFMSVpFRCwgJnBvcnQtPmZsYWdzKSkgeworCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7CisJCWlmIChwb3J0LT5vcHMtPmFjdGl2YXRlKSB7CisJCQlpbnQgcmV0dmFsID0gcG9ydC0+b3BzLT5hY3RpdmF0ZShwb3J0LCB0dHkpOworCQkJaWYgKHJldHZhbCkgeworCQkJCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCX0KKwkJc2V0X2JpdChBU1lOQ0JfSU5JVElBTElaRUQsICZwb3J0LT5mbGFncyk7CisJfQorCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOworCXJldHVybiB0dHlfcG9ydF9ibG9ja190aWxfcmVhZHkocG9ydCwgdHR5LCBmaWxwKTsKK30KKworRVhQT1JUX1NZTUJPTCh0dHlfcG9ydF9vcGVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCmluZGV4IGZmNTdjNDAuLmYyMDY2OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYwpAQCAtNjQ3LDYgKzY0NywyMSBAQAogCXJldHVybiBwb2xpY3ktPmdvdmVybm9yLT5zaG93X3NldHNwZWVkKHBvbGljeSwgYnVmKTsKIH0KIAorLyoqCisgKiBzaG93X3NjYWxpbmdfZHJpdmVyIC0gc2hvdyB0aGUgY3VycmVudCBjcHVmcmVxIEhXL0JJT1MgbGltaXRhdGlvbgorICovCitzdGF0aWMgc3NpemVfdCBzaG93X2Jpb3NfbGltaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIGNoYXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBpbnQgbGltaXQ7CisJaW50IHJldDsKKwlpZiAoY3B1ZnJlcV9kcml2ZXItPmJpb3NfbGltaXQpIHsKKwkJcmV0ID0gY3B1ZnJlcV9kcml2ZXItPmJpb3NfbGltaXQocG9saWN5LT5jcHUsICZsaW1pdCk7CisJCWlmICghcmV0KQorCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGxpbWl0KTsKKwl9CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcSk7Cit9CisKICNkZWZpbmUgZGVmaW5lX29uZV9ybyhfbmFtZSkgXAogc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIgX25hbWUgPSBcCiBfX0FUVFIoX25hbWUsIDA0NDQsIHNob3dfIyNfbmFtZSwgTlVMTCkKQEAgLTY2Niw2ICs2ODEsNyBAQAogZGVmaW5lX29uZV9ybyhzY2FsaW5nX2F2YWlsYWJsZV9nb3Zlcm5vcnMpOwogZGVmaW5lX29uZV9ybyhzY2FsaW5nX2RyaXZlcik7CiBkZWZpbmVfb25lX3JvKHNjYWxpbmdfY3VyX2ZyZXEpOworZGVmaW5lX29uZV9ybyhiaW9zX2xpbWl0KTsKIGRlZmluZV9vbmVfcm8ocmVsYXRlZF9jcHVzKTsKIGRlZmluZV9vbmVfcm8oYWZmZWN0ZWRfY3B1cyk7CiBkZWZpbmVfb25lX3J3KHNjYWxpbmdfbWluX2ZyZXEpOwpAQCAtNzY3LDggKzc4Myw5IEBACiAgKiAgIDA6ICAgICAgICBTdWNjZXNzCiAgKiAgIFBvc2l0aXZlOiBXaGVuIHdlIGhhdmUgYSBtYW5hZ2VkIENQVSBhbmQgdGhlIHN5c2ZzIGdvdCBzeW1saW5rZWQKICAqLwotaW50IGNwdWZyZXFfYWRkX2Rldl9wb2xpY3kodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCi0JCXN0cnVjdCBzeXNfZGV2aWNlICpzeXNfZGV2KQorc3RhdGljIGludCBjcHVmcmVxX2FkZF9kZXZfcG9saWN5KHVuc2lnbmVkIGludCBjcHUsCisJCQkJICBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKKwkJCQkgIHN0cnVjdCBzeXNfZGV2aWNlICpzeXNfZGV2KQogewogCWludCByZXQgPSAwOwogI2lmZGVmIENPTkZJR19TTVAKQEAgLTg0Miw3ICs4NTksOCBAQAogCiAKIC8qIHN5bWxpbmsgYWZmZWN0ZWQgQ1BVcyAqLwotaW50IGNwdWZyZXFfYWRkX2Rldl9zeW1saW5rKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQorc3RhdGljIGludCBjcHVmcmVxX2FkZF9kZXZfc3ltbGluayh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCSAgIHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQogewogCXVuc2lnbmVkIGludCBqOwogCWludCByZXQgPSAwOwpAQCAtODY5LDggKzg4Nyw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGNwdWZyZXFfYWRkX2Rldl9pbnRlcmZhY2UodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCi0JCXN0cnVjdCBzeXNfZGV2aWNlICpzeXNfZGV2KQorc3RhdGljIGludCBjcHVmcmVxX2FkZF9kZXZfaW50ZXJmYWNlKHVuc2lnbmVkIGludCBjcHUsCisJCQkJICAgICBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKKwkJCQkgICAgIHN0cnVjdCBzeXNfZGV2aWNlICpzeXNfZGV2KQogewogCXN0cnVjdCBjcHVmcmVxX3BvbGljeSBuZXdfcG9saWN5OwogCXN0cnVjdCBmcmVxX2F0dHIgKipkcnZfYXR0cjsKQEAgLTkwMiw2ICs5MjEsMTEgQEAKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyX291dF9rb2JqX3B1dDsKIAl9CisJaWYgKGNwdWZyZXFfZHJpdmVyLT5iaW9zX2xpbWl0KSB7CisJCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZwb2xpY3ktPmtvYmosICZiaW9zX2xpbWl0LmF0dHIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfb3V0X2tvYmpfcHV0OworCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjcHVmcmVxX2RyaXZlcl9sb2NrLCBmbGFncyk7CiAJZm9yX2VhY2hfY3B1KGosIHBvbGljeS0+Y3B1cykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfY29uc2VydmF0aXZlLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9jb25zZXJ2YXRpdmUuYwppbmRleCBjN2IwODFiLi41OTlhNDBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9jb25zZXJ2YXRpdmUuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9jb25zZXJ2YXRpdmUuYwpAQCAtMTY0LDIwICsxNjQsMjIgQEAKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBzeXNmcyBpbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHNzaXplX3Qgc2hvd19zYW1wbGluZ19yYXRlX21heChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19zYW1wbGluZ19yYXRlX21heChzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJcHJpbnRrX29uY2UoS0VSTl9JTkZPICJDUFVGUkVROiBjb25zZXJ2YXRpdmUgc2FtcGxpbmdfcmF0ZV9tYXggIgogCQkgICAgInN5c2ZzIGZpbGUgaXMgZGVwcmVjYXRlZCAtIHVzZWQgYnk6ICVzXG4iLCBjdXJyZW50LT5jb21tKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgLTFVKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19zYW1wbGluZ19yYXRlX21pbihzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19zYW1wbGluZ19yYXRlX21pbihzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIG1pbl9zYW1wbGluZ19yYXRlKTsKIH0KIAogI2RlZmluZSBkZWZpbmVfb25lX3JvKF9uYW1lKQkJXAotc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIgX25hbWUgPQkJXAorc3RhdGljIHN0cnVjdCBnbG9iYWxfYXR0ciBfbmFtZSA9CVwKIF9fQVRUUihfbmFtZSwgMDQ0NCwgc2hvd18jI19uYW1lLCBOVUxMKQogCiBkZWZpbmVfb25lX3JvKHNhbXBsaW5nX3JhdGVfbWF4KTsKQEAgLTE4Niw3ICsxODgsNyBAQAogLyogY3B1ZnJlcV9jb25zZXJ2YXRpdmUgR292ZXJub3IgVHVuYWJsZXMgKi8KICNkZWZpbmUgc2hvd19vbmUoZmlsZV9uYW1lLCBvYmplY3QpCQkJCQlcCiBzdGF0aWMgc3NpemVfdCBzaG93XyMjZmlsZV9uYW1lCQkJCQkJXAotKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqdW51c2VkLCBjaGFyICpidWYpCQkJCVwKKyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAogewkJCQkJCQkJCVwKIAlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGJzX3R1bmVyc19pbnMub2JqZWN0KTsJCVwKIH0KQEAgLTE5Nyw4ICsxOTksNDAgQEAKIHNob3dfb25lKGlnbm9yZV9uaWNlX2xvYWQsIGlnbm9yZV9uaWNlKTsKIHNob3dfb25lKGZyZXFfc3RlcCwgZnJlcV9zdGVwKTsKIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfc2FtcGxpbmdfZG93bl9mYWN0b3Ioc3RydWN0IGNwdWZyZXFfcG9saWN5ICp1bnVzZWQsCi0JCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorLyoqKiBkZWxldGUgYWZ0ZXIgZGVwcmVjYXRpb24gdGltZSAqKiovCisjZGVmaW5lIERFUFJFQ0FUSU9OX01TRyhmaWxlX25hbWUpCQkJCQlcCisJcHJpbnRrX29uY2UoS0VSTl9JTkZPICJDUFVGUkVROiBQZXIgY29yZSBjb25zZXJ2YXRpdmUgc3lzZnMgIglcCisJCSJpbnRlcmZhY2UgaXMgZGVwcmVjYXRlZCAtICIgI2ZpbGVfbmFtZSAiXG4iKTsKKworI2RlZmluZSBzaG93X29uZV9vbGQoZmlsZV9uYW1lKQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNmaWxlX25hbWUjI19vbGQJCQkJCVwKKyhzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnVudXNlZCwgY2hhciAqYnVmKQkJCQlcCit7CQkJCQkJCQkJXAorCXByaW50a19vbmNlKEtFUk5fSU5GTyAiQ1BVRlJFUTogUGVyIGNvcmUgY29uc2VydmF0aXZlIHN5c2ZzICIJXAorCQkiaW50ZXJmYWNlIGlzIGRlcHJlY2F0ZWQgLSAiICNmaWxlX25hbWUgIlxuIik7CQlcCisJcmV0dXJuIHNob3dfIyNmaWxlX25hbWUoTlVMTCwgTlVMTCwgYnVmKTsJCQlcCit9CitzaG93X29uZV9vbGQoc2FtcGxpbmdfcmF0ZSk7CitzaG93X29uZV9vbGQoc2FtcGxpbmdfZG93bl9mYWN0b3IpOworc2hvd19vbmVfb2xkKHVwX3RocmVzaG9sZCk7CitzaG93X29uZV9vbGQoZG93bl90aHJlc2hvbGQpOworc2hvd19vbmVfb2xkKGlnbm9yZV9uaWNlX2xvYWQpOworc2hvd19vbmVfb2xkKGZyZXFfc3RlcCk7CitzaG93X29uZV9vbGQoc2FtcGxpbmdfcmF0ZV9taW4pOworc2hvd19vbmVfb2xkKHNhbXBsaW5nX3JhdGVfbWF4KTsKKworI2RlZmluZSBkZWZpbmVfb25lX3JvX29sZChvYmplY3QsIF9uYW1lKQlcCitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciBvYmplY3QgPQkJXAorX19BVFRSKF9uYW1lLCAwNDQ0LCBzaG93XyMjX25hbWUjI19vbGQsIE5VTEwpCisKK2RlZmluZV9vbmVfcm9fb2xkKHNhbXBsaW5nX3JhdGVfbWluX29sZCwgc2FtcGxpbmdfcmF0ZV9taW4pOworZGVmaW5lX29uZV9yb19vbGQoc2FtcGxpbmdfcmF0ZV9tYXhfb2xkLCBzYW1wbGluZ19yYXRlX21heCk7CisKKy8qKiogZGVsZXRlIGFmdGVyIGRlcHJlY2F0aW9uIHRpbWUgKioqLworCitzdGF0aWMgc3NpemVfdCBzdG9yZV9zYW1wbGluZ19kb3duX2ZhY3RvcihzdHJ1Y3Qga29iamVjdCAqYSwKKwkJCQkJICBzdHJ1Y3QgYXR0cmlidXRlICpiLAorCQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXVuc2lnbmVkIGludCBpbnB1dDsKIAlpbnQgcmV0OwpAQCAtMjE0LDggKzI0OCw4IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9zYW1wbGluZ19yYXRlKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqdW51c2VkLAotCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3NhbXBsaW5nX3JhdGUoc3RydWN0IGtvYmplY3QgKmEsIHN0cnVjdCBhdHRyaWJ1dGUgKmIsCisJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJdW5zaWduZWQgaW50IGlucHV0OwogCWludCByZXQ7CkBAIC0yMzEsOCArMjY1LDggQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX3VwX3RocmVzaG9sZChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnVudXNlZCwKLQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBzdG9yZV91cF90aHJlc2hvbGQoc3RydWN0IGtvYmplY3QgKmEsIHN0cnVjdCBhdHRyaWJ1dGUgKmIsCisJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAl1bnNpZ25lZCBpbnQgaW5wdXQ7CiAJaW50IHJldDsKQEAgLTI1MSw4ICsyODUsOCBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfZG93bl90aHJlc2hvbGQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICp1bnVzZWQsCi0JCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3Qgc3RvcmVfZG93bl90aHJlc2hvbGQoc3RydWN0IGtvYmplY3QgKmEsIHN0cnVjdCBhdHRyaWJ1dGUgKmIsCisJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXVuc2lnbmVkIGludCBpbnB1dDsKIAlpbnQgcmV0OwpAQCAtMjcyLDggKzMwNiw4IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9pZ25vcmVfbmljZV9sb2FkKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAotCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2lnbm9yZV9uaWNlX2xvYWQoc3RydWN0IGtvYmplY3QgKmEsIHN0cnVjdCBhdHRyaWJ1dGUgKmIsCisJCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJdW5zaWduZWQgaW50IGlucHV0OwogCWludCByZXQ7CkBAIC0zMDgsOCArMzQyLDggQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2ZyZXFfc3RlcChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKLQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBzdG9yZV9mcmVxX3N0ZXAoc3RydWN0IGtvYmplY3QgKmEsIHN0cnVjdCBhdHRyaWJ1dGUgKmIsCisJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJdW5zaWduZWQgaW50IGlucHV0OwogCWludCByZXQ7CkBAIC0zMzEsNyArMzY1LDcgQEAKIH0KIAogI2RlZmluZSBkZWZpbmVfb25lX3J3KF9uYW1lKSBcCi1zdGF0aWMgc3RydWN0IGZyZXFfYXR0ciBfbmFtZSA9IFwKK3N0YXRpYyBzdHJ1Y3QgZ2xvYmFsX2F0dHIgX25hbWUgPSBcCiBfX0FUVFIoX25hbWUsIDA2NDQsIHNob3dfIyNfbmFtZSwgc3RvcmVfIyNfbmFtZSkKIAogZGVmaW5lX29uZV9ydyhzYW1wbGluZ19yYXRlKTsKQEAgLTM1OCw2ICszOTIsNTMgQEAKIAkubmFtZSA9ICJjb25zZXJ2YXRpdmUiLAogfTsKIAorLyoqKiBkZWxldGUgYWZ0ZXIgZGVwcmVjYXRpb24gdGltZSAqKiovCisKKyNkZWZpbmUgd3JpdGVfb25lX29sZChmaWxlX25hbWUpCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzdG9yZV8jI2ZpbGVfbmFtZSMjX29sZAkJCQkJXAorKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqdW51c2VkLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCVwKK3sJCQkJCQkJCQlcCisJcHJpbnRrX29uY2UoS0VSTl9JTkZPICJDUFVGUkVROiBQZXIgY29yZSBjb25zZXJ2YXRpdmUgc3lzZnMgIglcCisJCSJpbnRlcmZhY2UgaXMgZGVwcmVjYXRlZCAtICIgI2ZpbGVfbmFtZSAiXG4iKTsJXAorCXJldHVybiBzdG9yZV8jI2ZpbGVfbmFtZShOVUxMLCBOVUxMLCBidWYsIGNvdW50KTsJCVwKK30KK3dyaXRlX29uZV9vbGQoc2FtcGxpbmdfcmF0ZSk7Cit3cml0ZV9vbmVfb2xkKHNhbXBsaW5nX2Rvd25fZmFjdG9yKTsKK3dyaXRlX29uZV9vbGQodXBfdGhyZXNob2xkKTsKK3dyaXRlX29uZV9vbGQoZG93bl90aHJlc2hvbGQpOword3JpdGVfb25lX29sZChpZ25vcmVfbmljZV9sb2FkKTsKK3dyaXRlX29uZV9vbGQoZnJlcV9zdGVwKTsKKworI2RlZmluZSBkZWZpbmVfb25lX3J3X29sZChvYmplY3QsIF9uYW1lKQlcCitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciBvYmplY3QgPQkJXAorX19BVFRSKF9uYW1lLCAwNjQ0LCBzaG93XyMjX25hbWUjI19vbGQsIHN0b3JlXyMjX25hbWUjI19vbGQpCisKK2RlZmluZV9vbmVfcndfb2xkKHNhbXBsaW5nX3JhdGVfb2xkLCBzYW1wbGluZ19yYXRlKTsKK2RlZmluZV9vbmVfcndfb2xkKHNhbXBsaW5nX2Rvd25fZmFjdG9yX29sZCwgc2FtcGxpbmdfZG93bl9mYWN0b3IpOworZGVmaW5lX29uZV9yd19vbGQodXBfdGhyZXNob2xkX29sZCwgdXBfdGhyZXNob2xkKTsKK2RlZmluZV9vbmVfcndfb2xkKGRvd25fdGhyZXNob2xkX29sZCwgZG93bl90aHJlc2hvbGQpOworZGVmaW5lX29uZV9yd19vbGQoaWdub3JlX25pY2VfbG9hZF9vbGQsIGlnbm9yZV9uaWNlX2xvYWQpOworZGVmaW5lX29uZV9yd19vbGQoZnJlcV9zdGVwX29sZCwgZnJlcV9zdGVwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmRic19hdHRyaWJ1dGVzX29sZFtdID0geworCSZzYW1wbGluZ19yYXRlX21heF9vbGQuYXR0ciwKKwkmc2FtcGxpbmdfcmF0ZV9taW5fb2xkLmF0dHIsCisJJnNhbXBsaW5nX3JhdGVfb2xkLmF0dHIsCisJJnNhbXBsaW5nX2Rvd25fZmFjdG9yX29sZC5hdHRyLAorCSZ1cF90aHJlc2hvbGRfb2xkLmF0dHIsCisJJmRvd25fdGhyZXNob2xkX29sZC5hdHRyLAorCSZpZ25vcmVfbmljZV9sb2FkX29sZC5hdHRyLAorCSZmcmVxX3N0ZXBfb2xkLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZGJzX2F0dHJfZ3JvdXBfb2xkID0geworCS5hdHRycyA9IGRic19hdHRyaWJ1dGVzX29sZCwKKwkubmFtZSA9ICJjb25zZXJ2YXRpdmUiLAorfTsKKworLyoqKiBkZWxldGUgYWZ0ZXIgZGVwcmVjYXRpb24gdGltZSAqKiovCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBzeXNmcyBlbmQgKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZCBkYnNfY2hlY2tfY3B1KHN0cnVjdCBjcHVfZGJzX2luZm9fcyAqdGhpc19kYnNfaW5mbykKQEAgLTUzMCw3ICs2MTEsNyBAQAogCiAJCW11dGV4X2xvY2soJmRic19tdXRleCk7CiAKLQkJcmMgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBvbGljeS0+a29iaiwgJmRic19hdHRyX2dyb3VwKTsKKwkJcmMgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBvbGljeS0+a29iaiwgJmRic19hdHRyX2dyb3VwX29sZCk7CiAJCWlmIChyYykgewogCQkJbXV0ZXhfdW5sb2NrKCZkYnNfbXV0ZXgpOwogCQkJcmV0dXJuIHJjOwpAQCAtNTY0LDYgKzY0NSwxMyBAQAogCQkJaWYgKGxhdGVuY3kgPT0gMCkKIAkJCQlsYXRlbmN5ID0gMTsKIAorCQkJcmMgPSBzeXNmc19jcmVhdGVfZ3JvdXAoY3B1ZnJlcV9nbG9iYWxfa29iamVjdCwKKwkJCQkJCSZkYnNfYXR0cl9ncm91cCk7CisJCQlpZiAocmMpIHsKKwkJCQltdXRleF91bmxvY2soJmRic19tdXRleCk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCiAJCQkvKgogCQkJICogY29uc2VydmF0aXZlIGRvZXMgbm90IGltcGxlbWVudCBtaWNybyBsaWtlIG9uZGVtYW5kCiAJCQkgKiBnb3Zlcm5vciwgdGh1cyB3ZSBhcmUgYm91bmQgdG8gamlmZmVzL0haCkBAIC01OTEsNyArNjc5LDcgQEAKIAkJZGJzX3RpbWVyX2V4aXQodGhpc19kYnNfaW5mbyk7CiAKIAkJbXV0ZXhfbG9jaygmZGJzX211dGV4KTsKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwb2xpY3ktPmtvYmosICZkYnNfYXR0cl9ncm91cCk7CisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmcG9saWN5LT5rb2JqLCAmZGJzX2F0dHJfZ3JvdXBfb2xkKTsKIAkJZGJzX2VuYWJsZS0tOwogCQltdXRleF9kZXN0cm95KCZ0aGlzX2Ric19pbmZvLT50aW1lcl9tdXRleCk7CiAKQEAgLTYwNSw2ICs2OTMsOSBAQAogCQkJCQlDUFVGUkVRX1RSQU5TSVRJT05fTk9USUZJRVIpOwogCiAJCW11dGV4X3VubG9jaygmZGJzX211dGV4KTsKKwkJaWYgKCFkYnNfZW5hYmxlKQorCQkJc3lzZnNfcmVtb3ZlX2dyb3VwKGNwdWZyZXFfZ2xvYmFsX2tvYmplY3QsCisJCQkJCSAgICZkYnNfYXR0cl9ncm91cCk7CiAKIAkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5jCmluZGV4IGEzODgzMWMuLjVmZGQ2ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuYwpAQCAtMTksMjYgKzE5LDQ4IEBACiBzdGF0aWMgc3RydWN0IGFtZDY0X3B2dCAqcHZ0X2xvb2t1cFtFREFDX01BWF9OVU1OT0RFU107CiAKIC8qCi0gKiBTZWUgRjJ4ODAgZm9yIEs4IGFuZCBGMnhbMSwwXTgwIGZvciBGYW0xMCBhbmQgbGF0ZXIuIFRoZSB0YWJsZSBiZWxvdyBpcyBvbmx5Ci0gKiBmb3IgRERSMiBEUkFNIG1hcHBpbmcuCisgKiBBZGRyZXNzIHRvIERSQU0gYmFuayBtYXBwaW5nOiBzZWUgRjJ4ODAgZm9yIEs4IGFuZCBGMnhbMSwwXTgwIGZvciBGYW0xMCBhbmQKKyAqIGxhdGVyLgogICovCi11MzIgcmV2Zl9xdWFkX2RkcjJfc2hpZnRbXSA9IHsKLQkwLAkvKiAwMDAwYiBOVUxMIERJTU0gKDEyOG1iKSAqLwotCTI4LAkvKiAwMDAxYiAyNTZtYiAqLwotCTI5LAkvKiAwMDEwYiA1MTJtYiAqLwotCTI5LAkvKiAwMDExYiA1MTJtYiAqLwotCTI5LAkvKiAwMTAwYiA1MTJtYiAqLwotCTMwLAkvKiAwMTAxYiAxZ2IgKi8KLQkzMCwJLyogMDExMGIgMWdiICovCi0JMzEsCS8qIDAxMTFiIDJnYiAqLwotCTMxLAkvKiAxMDAwYiAyZ2IgKi8KLQkzMiwJLyogMTAwMWIgNGdiICovCi0JMzIsCS8qIDEwMTBiIDRnYiAqLwotCTMzLAkvKiAxMDExYiA4Z2IgKi8KLQkwLAkvKiAxMTAwYiBmdXR1cmUgKi8KLQkwLAkvKiAxMTAxYiBmdXR1cmUgKi8KLQkwLAkvKiAxMTEwYiBmdXR1cmUgKi8KLQkwCS8qIDExMTFiIGZ1dHVyZSAqLworc3RhdGljIGludCBkZHIyX2RiYW1fcmV2Q0dbXSA9IHsKKwkJCSAgIFswXQkJPSAzMiwKKwkJCSAgIFsxXQkJPSA2NCwKKwkJCSAgIFsyXQkJPSAxMjgsCisJCQkgICBbM10JCT0gMjU2LAorCQkJICAgWzRdCQk9IDUxMiwKKwkJCSAgIFs1XQkJPSAxMDI0LAorCQkJICAgWzZdCQk9IDIwNDgsCit9OworCitzdGF0aWMgaW50IGRkcjJfZGJhbV9yZXZEW10gPSB7CisJCQkgICBbMF0JCT0gMzIsCisJCQkgICBbMV0JCT0gNjQsCisJCQkgICBbMiAuLi4gM10JPSAxMjgsCisJCQkgICBbNF0JCT0gMjU2LAorCQkJICAgWzVdCQk9IDUxMiwKKwkJCSAgIFs2XQkJPSAyNTYsCisJCQkgICBbN10JCT0gNTEyLAorCQkJICAgWzggLi4uIDldCT0gMTAyNCwKKwkJCSAgIFsxMF0JCT0gMjA0OCwKK307CisKK3N0YXRpYyBpbnQgZGRyMl9kYmFtW10gPSB7IFswXQkJPSAxMjgsCisJCQkgICBbMV0JCT0gMjU2LAorCQkJICAgWzIgLi4uIDRdCT0gNTEyLAorCQkJICAgWzUgLi4uIDZdCT0gMTAyNCwKKwkJCSAgIFs3IC4uLiA4XQk9IDIwNDgsCisJCQkgICBbOSAuLi4gMTBdCT0gNDA5NiwKKwkJCSAgIFsxMV0JCT0gODE5MiwKK307CisKK3N0YXRpYyBpbnQgZGRyM19kYmFtW10gPSB7IFswXQkJPSAtMSwKKwkJCSAgIFsxXQkJPSAyNTYsCisJCQkgICBbMl0JCT0gNTEyLAorCQkJICAgWzMgLi4uIDRdCT0gLTEsCisJCQkgICBbNSAuLi4gNl0JPSAxMDI0LAorCQkJICAgWzcgLi4uIDhdCT0gMjA0OCwKKwkJCSAgIFs5IC4uLiAxMF0JPSA0MDk2LAorCQkJICAgWzExXQk9IDgxOTIsCiB9OwogCiAvKgpAQCAtMTY0LDExICsxODYsOSBAQAogewogCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CiAJdTMyIHNjcnVidmFsID0gMDsKLQlpbnQgc3RhdHVzID0gLTEsIGksIHJldCA9IDA7CisJaW50IHN0YXR1cyA9IC0xLCBpOwogCi0JcmV0ID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+bWlzY19mM19jdGwsIEs4X1NDUkNUUkwsICZzY3J1YnZhbCk7Ci0JaWYgKHJldCkKLQkJZGVidWdmMCgiUmVhZGluZyBLOF9TQ1JDVFJMIGZhaWxlZFxuIik7CisJYW1kNjRfcmVhZF9wY2lfY2ZnKHB2dC0+bWlzY19mM19jdGwsIEs4X1NDUkNUUkwsICZzY3J1YnZhbCk7CiAKIAlzY3J1YnZhbCA9IHNjcnVidmFsICYgMHgwMDFGOwogCkBAIC0xODksNyArMjA5LDcgQEAKIC8qIE1hcCBmcm9tIGEgQ1NST1cgZW50cnkgdG8gdGhlIG1hc2sgZW50cnkgdGhhdCBvcGVyYXRlcyBvbiBpdCAqLwogc3RhdGljIGlubGluZSB1MzIgYW1kNjRfbWFwX3RvX2Rjc19tYXNrKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCwgaW50IGNzcm93KQogewotCWlmIChib290X2NwdV9kYXRhLng4NiA9PSAweGYgJiYgcHZ0LT5leHRfbW9kZWwgPCBPUFRFUk9OX0NQVV9SRVZfRikKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMHhmICYmIHB2dC0+ZXh0X21vZGVsIDwgSzhfUkVWX0YpCiAJCXJldHVybiBjc3JvdzsKIAllbHNlCiAJCXJldHVybiBjc3JvdyA+PiAxOwpAQCAtNDM3LDcgKzQ1Nyw3IEBACiAJdTY0IGJhc2U7CiAKIAkvKiBvbmx5IHJldkUgYW5kIGxhdGVyIGhhdmUgdGhlIERSQU0gSG9sZSBBZGRyZXNzIFJlZ2lzdGVyICovCi0JaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDB4ZiAmJiBwdnQtPmV4dF9tb2RlbCA8IE9QVEVST05fQ1BVX1JFVl9FKSB7CisJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDB4ZiAmJiBwdnQtPmV4dF9tb2RlbCA8IEs4X1JFVl9FKSB7CiAJCWRlYnVnZjEoIiAgcmV2aXNpb24gJWQgZm9yIG5vZGUgJWQgZG9lcyBub3Qgc3VwcG9ydCBESEFSXG4iLAogCQkJcHZ0LT5leHRfbW9kZWwsIHB2dC0+bWNfbm9kZV9pZCk7CiAJCXJldHVybiAxOwpAQCAtNzQzLDIxICs3NjMsNiBAQAogCSppbnB1dF9hZGRyX21heCA9IGJhc2UgfCBtYXNrIHwgcHZ0LT5kY3NfbWFza19ub3R1c2VkOwogfQogCi0vKgotICogRXh0cmFjdCBlcnJvciBhZGRyZXNzIGZyb20gTUNBIE5CIEFkZHJlc3MgTG93IChzZWN0aW9uIDMuNi40LjUpIGFuZCBNQ0EgTkIKLSAqIEFkZHJlc3MgSGlnaCAoc2VjdGlvbiAzLjYuNC42KSByZWdpc3RlciB2YWx1ZXMgYW5kIHJldHVybiB0aGUgcmVzdWx0LiBBZGRyZXNzCi0gKiBpcyBsb2NhdGVkIGluIHRoZSBpbmZvIHN0cnVjdHVyZSAobmJlYWggYW5kIG5iZWFsKSwgdGhlIGVuY29kaW5nIGlzIGRldmljZQotICogc3BlY2lmaWMuCi0gKi8KLXN0YXRpYyB1NjQgZXh0cmFjdF9lcnJvcl9hZGRyZXNzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKLQkJCQkgc3RydWN0IGVycl9yZWdzICppbmZvKQotewotCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87Ci0KLQlyZXR1cm4gcHZ0LT5vcHMtPmdldF9lcnJvcl9hZGRyZXNzKG1jaSwgaW5mbyk7Ci19Ci0KLQogLyogTWFwIHRoZSBFcnJvciBhZGRyZXNzIHRvIGEgUEFHRSBhbmQgUEFHRSBPRkZTRVQuICovCiBzdGF0aWMgaW5saW5lIHZvaWQgZXJyb3JfYWRkcmVzc190b19wYWdlX2FuZF9vZmZzZXQodTY0IGVycm9yX2FkZHJlc3MsCiAJCQkJCQkgICAgdTMyICpwYWdlLCB1MzIgKm9mZnNldCkKQEAgLTc4Nyw3ICs3OTIsNyBAQAogCXJldHVybiBjc3JvdzsKIH0KIAotc3RhdGljIGludCBnZXRfY2hhbm5lbF9mcm9tX2VjY19zeW5kcm9tZSh1bnNpZ25lZCBzaG9ydCBzeW5kcm9tZSk7CitzdGF0aWMgaW50IGdldF9jaGFubmVsX2Zyb21fZWNjX3N5bmRyb21lKHN0cnVjdCBtZW1fY3RsX2luZm8gKiwgdTE2KTsKIAogc3RhdGljIHZvaWQgYW1kNjRfY3B1X2Rpc3BsYXlfaW5mbyhzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQpCiB7CkBAIC03OTcsNyArODAyLDcgQEAKIAkJZWRhY19wcmludGsoS0VSTl9ERUJVRywgRURBQ19NQywgIkYxMGggQ1BVIGRldGVjdGVkXG4iKTsKIAllbHNlIGlmIChib290X2NwdV9kYXRhLng4NiA9PSAweGYpCiAJCWVkYWNfcHJpbnRrKEtFUk5fREVCVUcsIEVEQUNfTUMsICIlcyBkZXRlY3RlZFxuIiwKLQkJCShwdnQtPmV4dF9tb2RlbCA+PSBPUFRFUk9OX0NQVV9SRVZfRikgPworCQkJKHB2dC0+ZXh0X21vZGVsID49IEs4X1JFVl9GKSA/CiAJCQkiUmV2IEYgb3IgbGF0ZXIiIDogIlJldiBFIG9yIGVhcmxpZXIiKTsKIAllbHNlCiAJCS8qIHdlJ2xsIGhhcmRseSBldmVyIGV2ZXIgZ2V0IGhlcmUgKi8KQEAgLTgxMyw3ICs4MTgsNyBAQAogCWludCBiaXQ7CiAJZW51bSBkZXZfdHlwZSBlZGFjX2NhcCA9IEVEQUNfRkxBR19OT05FOwogCi0JYml0ID0gKGJvb3RfY3B1X2RhdGEueDg2ID4gMHhmIHx8IHB2dC0+ZXh0X21vZGVsID49IE9QVEVST05fQ1BVX1JFVl9GKQorCWJpdCA9IChib290X2NwdV9kYXRhLng4NiA+IDB4ZiB8fCBwdnQtPmV4dF9tb2RlbCA+PSBLOF9SRVZfRikKIAkJPyAxOQogCQk6IDE3OwogCkBAIC04MjQsNzUgKzgyOSw2NiBAQAogfQogCiAKLXN0YXRpYyB2b2lkIGYxMF9kZWJ1Z19kaXNwbGF5X2RpbW1fc2l6ZXMoaW50IGN0cmwsIHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCwKLQkJCQkJIGludCBnYW5nZWQpOworc3RhdGljIHZvaWQgYW1kNjRfZGVidWdfZGlzcGxheV9kaW1tX3NpemVzKGludCBjdHJsLCBzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQpOworCitzdGF0aWMgdm9pZCBhbWQ2NF9kdW1wX2RyYW1jZmdfbG93KHUzMiBkY2xyLCBpbnQgY2hhbikKK3sKKwlkZWJ1Z2YxKCJGMnglZDkwIChEUkFNIENmZyBMb3cpOiAweCUwOHhcbiIsIGNoYW4sIGRjbHIpOworCisJZGVidWdmMSgiICBESU1NIHR5cGU6ICVzYnVmZmVyZWQ7IGFsbCBESU1NcyBzdXBwb3J0IEVDQzogJXNcbiIsCisJCShkY2xyICYgQklUKDE2KSkgPyAgInVuIiA6ICIiLAorCQkoZGNsciAmIEJJVCgxOSkpID8gInllcyIgOiAibm8iKTsKKworCWRlYnVnZjEoIiAgUEFSL0VSUiBwYXJpdHk6ICVzXG4iLAorCQkoZGNsciAmIEJJVCg4KSkgPyAgImVuYWJsZWQiIDogImRpc2FibGVkIik7CisKKwlkZWJ1Z2YxKCIgIERDVCAxMjhiaXQgbW9kZSB3aWR0aDogJXNcbiIsCisJCShkY2xyICYgQklUKDExKSkgPyAgIjEyOGIiIDogIjY0YiIpOworCisJZGVidWdmMSgiICB4NCBsb2dpY2FsIERJTU1zIHByZXNlbnQ6IEwwOiAlcyBMMTogJXMgTDI6ICVzIEwzOiAlc1xuIiwKKwkJKGRjbHIgJiBCSVQoMTIpKSA/ICAieWVzIiA6ICJubyIsCisJCShkY2xyICYgQklUKDEzKSkgPyAgInllcyIgOiAibm8iLAorCQkoZGNsciAmIEJJVCgxNCkpID8gICJ5ZXMiIDogIm5vIiwKKwkJKGRjbHIgJiBCSVQoMTUpKSA/ICAieWVzIiA6ICJubyIpOworfQogCiAvKiBEaXNwbGF5IGFuZCBkZWNvZGUgdmFyaW91cyBOQiByZWdpc3RlcnMgZm9yIGRlYnVnIHB1cnBvc2VzLiAqLwogc3RhdGljIHZvaWQgYW1kNjRfZHVtcF9taXNjX3JlZ3Moc3RydWN0IGFtZDY0X3B2dCAqcHZ0KQogewogCWludCBnYW5nZWQ7CiAKLQlkZWJ1Z2YxKCIgIG5iY2FwOjB4JTguMDh4IERjdER1YWxDYXA9JXMgRHVhbE5vZGU9JXMgOC1Ob2RlPSVzXG4iLAotCQlwdnQtPm5iY2FwLAotCQkocHZ0LT5uYmNhcCAmIEs4X05CQ0FQX0RDVF9EVUFMKSA/ICJUcnVlIiA6ICJGYWxzZSIsCi0JCShwdnQtPm5iY2FwICYgSzhfTkJDQVBfRFVBTF9OT0RFKSA/ICJUcnVlIiA6ICJGYWxzZSIsCi0JCShwdnQtPm5iY2FwICYgSzhfTkJDQVBfOF9OT0RFKSA/ICJUcnVlIiA6ICJGYWxzZSIpOwotCWRlYnVnZjEoIiAgICBFQ0MgQ2FwYWJsZT0lcyAgIENoaXBLaWxsIENhcGFibGU9JXNcbiIsCi0JCShwdnQtPm5iY2FwICYgSzhfTkJDQVBfU0VDREVEKSA/ICJUcnVlIiA6ICJGYWxzZSIsCi0JCShwdnQtPm5iY2FwICYgSzhfTkJDQVBfQ0hJUEtJTEwpID8gIlRydWUiIDogIkZhbHNlIik7Ci0JZGVidWdmMSgiICBEcmFtQ2ZnMC1sb3c9MHglMDh4IERJTU0tRUNDPSVzIFBhcml0eT0lcyBXaWR0aD0lc1xuIiwKLQkJcHZ0LT5kY2xyMCwKLQkJKHB2dC0+ZGNscjAgJiBCSVQoMTkpKSA/ICAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiLAotCQkocHZ0LT5kY2xyMCAmIEJJVCg4KSkgPyAgIkVuYWJsZWQiIDogIkRpc2FibGVkIiwKLQkJKHB2dC0+ZGNscjAgJiBCSVQoMTEpKSA/ICAiMTI4YiIgOiAiNjRiIik7Ci0JZGVidWdmMSgiICAgIERJTU0geDQgUHJlc2VudDogTDA9JXMgTDE9JXMgTDI9JXMgTDM9JXMgIERJTU0gVHlwZT0lc1xuIiwKLQkJKHB2dC0+ZGNscjAgJiBCSVQoMTIpKSA/ICAiWSIgOiAiTiIsCi0JCShwdnQtPmRjbHIwICYgQklUKDEzKSkgPyAgIlkiIDogIk4iLAotCQkocHZ0LT5kY2xyMCAmIEJJVCgxNCkpID8gICJZIiA6ICJOIiwKLQkJKHB2dC0+ZGNscjAgJiBCSVQoMTUpKSA/ICAiWSIgOiAiTiIsCi0JCShwdnQtPmRjbHIwICYgQklUKDE2KSkgPyAgIlVOLUJ1ZmZlcmVkIiA6ICJCdWZmZXJlZCIpOworCWRlYnVnZjEoIkYzeEU4IChOQiBDYXApOiAweCUwOHhcbiIsIHB2dC0+bmJjYXApOwogCisJZGVidWdmMSgiICBOQiB0d28gY2hhbm5lbCBEUkFNIGNhcGFibGU6ICVzXG4iLAorCQkocHZ0LT5uYmNhcCAmIEs4X05CQ0FQX0RDVF9EVUFMKSA/ICJ5ZXMiIDogIm5vIik7CiAKLQlkZWJ1Z2YxKCIgIG9ubGluZS1zcGFyZTogMHglOC4wOHhcbiIsIHB2dC0+b25saW5lX3NwYXJlKTsKKwlkZWJ1Z2YxKCIgIEVDQyBjYXBhYmxlOiAlcywgQ2hpcEtpbGwgRUNDIGNhcGFibGU6ICVzXG4iLAorCQkocHZ0LT5uYmNhcCAmIEs4X05CQ0FQX1NFQ0RFRCkgPyAieWVzIiA6ICJubyIsCisJCShwdnQtPm5iY2FwICYgSzhfTkJDQVBfQ0hJUEtJTEwpID8gInllcyIgOiAibm8iKTsKIAorCWFtZDY0X2R1bXBfZHJhbWNmZ19sb3cocHZ0LT5kY2xyMCwgMCk7CisKKwlkZWJ1Z2YxKCJGM3hCMCAoT25saW5lIFNwYXJlKTogMHglMDh4XG4iLCBwdnQtPm9ubGluZV9zcGFyZSk7CisKKwlkZWJ1Z2YxKCJGMXhGMCAoRFJBTSBIb2xlIEFkZHJlc3MpOiAweCUwOHgsIGJhc2U6IDB4JTA4eCwgIgorCQkJIm9mZnNldDogMHglMDh4XG4iLAorCQkJcHZ0LT5kaGFyLAorCQkJZGhhcl9iYXNlKHB2dC0+ZGhhciksCisJCQkoYm9vdF9jcHVfZGF0YS54ODYgPT0gMHhmKSA/IGs4X2RoYXJfb2Zmc2V0KHB2dC0+ZGhhcikKKwkJCQkJCSAgIDogZjEwX2RoYXJfb2Zmc2V0KHB2dC0+ZGhhcikpOworCisJZGVidWdmMSgiICBEcmFtSG9sZVZhbGlkOiAlc1xuIiwKKwkJKHB2dC0+ZGhhciAmIERIQVJfVkFMSUQpID8gInllcyIgOiAibm8iKTsKKworCS8qIGV2ZXJ5dGhpbmcgYmVsb3cgdGhpcyBwb2ludCBpcyBGYW0xMGggYW5kIGFib3ZlICovCiAJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDB4ZikgewotCQlkZWJ1Z2YxKCIgIGRoYXI6IDB4JTguMDh4IEJhc2U9MHglMDh4IE9mZnNldD0weCUwOHhcbiIsCi0JCQlwdnQtPmRoYXIsIGRoYXJfYmFzZShwdnQtPmRoYXIpLAotCQkJazhfZGhhcl9vZmZzZXQocHZ0LT5kaGFyKSk7Ci0JCWRlYnVnZjEoIiAgICAgIERyYW1Ib2xlVmFsaWQ9JXNcbiIsCi0JCQkocHZ0LT5kaGFyICYgREhBUl9WQUxJRCkgPyAgIlRydWUiIDogIkZhbHNlIik7Ci0KLQkJZGVidWdmMSgiICBkYmFtLWRrdDogMHglOC4wOHhcbiIsIHB2dC0+ZGJhbTApOwotCi0JCS8qIGV2ZXJ5dGhpbmcgYmVsb3cgdGhpcyBwb2ludCBpcyBGYW0xMGggYW5kIGFib3ZlICovCisJCWFtZDY0X2RlYnVnX2Rpc3BsYXlfZGltbV9zaXplcygwLCBwdnQpOwogCQlyZXR1cm47Ci0KLQl9IGVsc2UgewotCQlkZWJ1Z2YxKCIgIGRoYXI6IDB4JTguMDh4IEJhc2U9MHglMDh4IE9mZnNldD0weCUwOHhcbiIsCi0JCQlwdnQtPmRoYXIsIGRoYXJfYmFzZShwdnQtPmRoYXIpLAotCQkJZjEwX2RoYXJfb2Zmc2V0KHB2dC0+ZGhhcikpOwotCQlkZWJ1Z2YxKCIgICAgRHJhbU1lbUhvaXN0VmFsaWQ9JXMgRHJhbUhvbGVWYWxpZD0lc1xuIiwKLQkJCShwdnQtPmRoYXIgJiBGMTBfRFJBTV9NRU1fSE9JU1RfVkFMSUQpID8KLQkJCSJUcnVlIiA6ICJGYWxzZSIsCi0JCQkocHZ0LT5kaGFyICYgREhBUl9WQUxJRCkgPwotCQkJIlRydWUiIDogIkZhbHNlIik7CiAJfQogCi0JLyogT25seSBpZiBOT1QgZ2FuZ2VkIGRvZXMgZGNsMSBoYXZlIHZhbGlkIGluZm8gKi8KLQlpZiAoIWRjdF9nYW5naW5nX2VuYWJsZWQocHZ0KSkgewotCQlkZWJ1Z2YxKCIgIERyYW1DZmcxLWxvdz0weCUwOHggRElNTS1FQ0M9JXMgUGFyaXR5PSVzICIKLQkJCSJXaWR0aD0lc1xuIiwgcHZ0LT5kY2xyMSwKLQkJCShwdnQtPmRjbHIxICYgQklUKDE5KSkgPyAgIkVuYWJsZWQiIDogIkRpc2FibGVkIiwKLQkJCShwdnQtPmRjbHIxICYgQklUKDgpKSA/ICAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiLAotCQkJKHB2dC0+ZGNscjEgJiBCSVQoMTEpKSA/ICAiMTI4YiIgOiAiNjRiIik7Ci0JCWRlYnVnZjEoIiAgICBESU1NIHg0IFByZXNlbnQ6IEwwPSVzIEwxPSVzIEwyPSVzIEwzPSVzICAiCi0JCQkiRElNTSBUeXBlPSVzXG4iLAotCQkJKHB2dC0+ZGNscjEgJiBCSVQoMTIpKSA/ICAiWSIgOiAiTiIsCi0JCQkocHZ0LT5kY2xyMSAmIEJJVCgxMykpID8gICJZIiA6ICJOIiwKLQkJCShwdnQtPmRjbHIxICYgQklUKDE0KSkgPyAgIlkiIDogIk4iLAotCQkJKHB2dC0+ZGNscjEgJiBCSVQoMTUpKSA/ICAiWSIgOiAiTiIsCi0JCQkocHZ0LT5kY2xyMSAmIEJJVCgxNikpID8gICJVTi1CdWZmZXJlZCIgOiAiQnVmZmVyZWQiKTsKLQl9CisJLyogT25seSBpZiBOT1QgZ2FuZ2VkIGRvZXMgZGNscjEgaGF2ZSB2YWxpZCBpbmZvICovCisJaWYgKCFkY3RfZ2FuZ2luZ19lbmFibGVkKHB2dCkpCisJCWFtZDY0X2R1bXBfZHJhbWNmZ19sb3cocHZ0LT5kY2xyMSwgMSk7CiAKIAkvKgogCSAqIERldGVybWluZSBpZiBnYW5nZWQgYW5kIHRoZW4gZHVtcCBtZW1vcnkgc2l6ZXMgZm9yIGZpcnN0IGNvbnRyb2xsZXIsCkBAIC05MDAsMzUgKzg5NiwxOSBAQAogCSAqLwogCWdhbmdlZCA9IGRjdF9nYW5naW5nX2VuYWJsZWQocHZ0KTsKIAotCWYxMF9kZWJ1Z19kaXNwbGF5X2RpbW1fc2l6ZXMoMCwgcHZ0LCBnYW5nZWQpOworCWFtZDY0X2RlYnVnX2Rpc3BsYXlfZGltbV9zaXplcygwLCBwdnQpOwogCiAJaWYgKCFnYW5nZWQpCi0JCWYxMF9kZWJ1Z19kaXNwbGF5X2RpbW1fc2l6ZXMoMSwgcHZ0LCBnYW5nZWQpOworCQlhbWQ2NF9kZWJ1Z19kaXNwbGF5X2RpbW1fc2l6ZXMoMSwgcHZ0KTsKIH0KIAogLyogUmVhZCBpbiBib3RoIG9mIERCQU0gcmVnaXN0ZXJzICovCiBzdGF0aWMgdm9pZCBhbWQ2NF9yZWFkX2RiYW1fcmVnKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCkKIHsKLQlpbnQgZXJyID0gMDsKLQl1bnNpZ25lZCBpbnQgcmVnOworCWFtZDY0X3JlYWRfcGNpX2NmZyhwdnQtPmRyYW1fZjJfY3RsLCBEQkFNMCwgJnB2dC0+ZGJhbTApOwogCi0JcmVnID0gREJBTTA7Ci0JZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+ZHJhbV9mMl9jdGwsIHJlZywgJnB2dC0+ZGJhbTApOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3JlZzsKLQotCWlmIChib290X2NwdV9kYXRhLng4NiA+PSAweDEwKSB7Ci0JCXJlZyA9IERCQU0xOwotCQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5kcmFtX2YyX2N0bCwgcmVnLCAmcHZ0LT5kYmFtMSk7Ci0KLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyX3JlZzsKLQl9Ci0KLQlyZXR1cm47Ci0KLWVycl9yZWc6Ci0JZGVidWdmMCgiRXJyb3IgcmVhZGluZyBGMnglMDN4LlxuIiwgcmVnKTsKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPj0gMHgxMCkKKwkJYW1kNjRfcmVhZF9wY2lfY2ZnKHB2dC0+ZHJhbV9mMl9jdGwsIERCQU0xLCAmcHZ0LT5kYmFtMSk7CiB9CiAKIC8qCkBAIC05NjMsNyArOTQzLDcgQEAKIHN0YXRpYyB2b2lkIGFtZDY0X3NldF9kY3RfYmFzZV9hbmRfbWFzayhzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQpCiB7CiAKLQlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMHhmICYmIHB2dC0+ZXh0X21vZGVsIDwgT1BURVJPTl9DUFVfUkVWX0YpIHsKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMHhmICYmIHB2dC0+ZXh0X21vZGVsIDwgSzhfUkVWX0YpIHsKIAkJcHZ0LT5kY3NiX2Jhc2UJCT0gUkVWX0VfRENTQl9CQVNFX0JJVFM7CiAJCXB2dC0+ZGNzbV9tYXNrCQk9IFJFVl9FX0RDU01fTUFTS19CSVRTOwogCQlwdnQtPmRjc19tYXNrX25vdHVzZWQJPSBSRVZfRV9EQ1NfTk9UVVNFRF9CSVRTOwpAQCAtOTkxLDI4ICs5NzEsMjEgQEAKICAqLwogc3RhdGljIHZvaWQgYW1kNjRfcmVhZF9kY3RfYmFzZV9tYXNrKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCkKIHsKLQlpbnQgY3MsIHJlZywgZXJyID0gMDsKKwlpbnQgY3MsIHJlZzsKIAogCWFtZDY0X3NldF9kY3RfYmFzZV9hbmRfbWFzayhwdnQpOwogCiAJZm9yIChjcyA9IDA7IGNzIDwgcHZ0LT5jc19jb3VudDsgY3MrKykgewogCQlyZWcgPSBLOF9EQ1NCMCArIChjcyAqIDQpOwotCQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5kcmFtX2YyX2N0bCwgcmVnLAotCQkJCQkJJnB2dC0+ZGNzYjBbY3NdKTsKLQkJaWYgKHVubGlrZWx5KGVycikpCi0JCQlkZWJ1Z2YwKCJSZWFkaW5nIEs4X0RDU0IwWyVkXSBmYWlsZWRcbiIsIGNzKTsKLQkJZWxzZQorCQlpZiAoIWFtZDY0X3JlYWRfcGNpX2NmZyhwdnQtPmRyYW1fZjJfY3RsLCByZWcsICZwdnQtPmRjc2IwW2NzXSkpCiAJCQlkZWJ1Z2YwKCIgIERDU0IwWyVkXT0weCUwOHggcmVnOiBGMngleFxuIiwKIAkJCQljcywgcHZ0LT5kY3NiMFtjc10sIHJlZyk7CiAKIAkJLyogSWYgRENUIGFyZSBOT1QgZ2FuZ2VkLCB0aGVuIHJlYWQgaW4gRENUMSdzIGJhc2UgKi8KIAkJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID49IDB4MTAgJiYgIWRjdF9nYW5naW5nX2VuYWJsZWQocHZ0KSkgewogCQkJcmVnID0gRjEwX0RDU0IxICsgKGNzICogNCk7Ci0JCQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5kcmFtX2YyX2N0bCwgcmVnLAotCQkJCQkJCSZwdnQtPmRjc2IxW2NzXSk7Ci0JCQlpZiAodW5saWtlbHkoZXJyKSkKLQkJCQlkZWJ1Z2YwKCJSZWFkaW5nIEYxMF9EQ1NCMVslZF0gZmFpbGVkXG4iLCBjcyk7Ci0JCQllbHNlCisJCQlpZiAoIWFtZDY0X3JlYWRfcGNpX2NmZyhwdnQtPmRyYW1fZjJfY3RsLCByZWcsCisJCQkJCQkmcHZ0LT5kY3NiMVtjc10pKQogCQkJCWRlYnVnZjAoIiAgRENTQjFbJWRdPTB4JTA4eCByZWc6IEYyeCV4XG4iLAogCQkJCQljcywgcHZ0LT5kY3NiMVtjc10sIHJlZyk7CiAJCX0gZWxzZSB7CkBAIC0xMDIyLDI2ICs5OTUsMjAgQEAKIAogCWZvciAoY3MgPSAwOyBjcyA8IHB2dC0+bnVtX2Rjc207IGNzKyspIHsKIAkJcmVnID0gSzhfRENTTTAgKyAoY3MgKiA0KTsKLQkJZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+ZHJhbV9mMl9jdGwsIHJlZywKLQkJCQkJJnB2dC0+ZGNzbTBbY3NdKTsKLQkJaWYgKHVubGlrZWx5KGVycikpCi0JCQlkZWJ1Z2YwKCJSZWFkaW5nIEs4X0RDU00wIGZhaWxlZFxuIik7Ci0JCWVsc2UKKwkJaWYgKCFhbWQ2NF9yZWFkX3BjaV9jZmcocHZ0LT5kcmFtX2YyX2N0bCwgcmVnLCAmcHZ0LT5kY3NtMFtjc10pKQogCQkJZGVidWdmMCgiICAgIERDU00wWyVkXT0weCUwOHggcmVnOiBGMngleFxuIiwKIAkJCQljcywgcHZ0LT5kY3NtMFtjc10sIHJlZyk7CiAKIAkJLyogSWYgRENUIGFyZSBOT1QgZ2FuZ2VkLCB0aGVuIHJlYWQgaW4gRENUMSdzIG1hc2sgKi8KIAkJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID49IDB4MTAgJiYgIWRjdF9nYW5naW5nX2VuYWJsZWQocHZ0KSkgewogCQkJcmVnID0gRjEwX0RDU00xICsgKGNzICogNCk7Ci0JCQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5kcmFtX2YyX2N0bCwgcmVnLAotCQkJCQkmcHZ0LT5kY3NtMVtjc10pOwotCQkJaWYgKHVubGlrZWx5KGVycikpCi0JCQkJZGVidWdmMCgiUmVhZGluZyBGMTBfRENTTTFbJWRdIGZhaWxlZFxuIiwgY3MpOwotCQkJZWxzZQorCQkJaWYgKCFhbWQ2NF9yZWFkX3BjaV9jZmcocHZ0LT5kcmFtX2YyX2N0bCwgcmVnLAorCQkJCQkJJnB2dC0+ZGNzbTFbY3NdKSkKIAkJCQlkZWJ1Z2YwKCIgICAgRENTTTFbJWRdPTB4JTA4eCByZWc6IEYyeCV4XG4iLAogCQkJCQljcywgcHZ0LT5kY3NtMVtjc10sIHJlZyk7Ci0JCX0gZWxzZQorCQl9IGVsc2UgewogCQkJcHZ0LT5kY3NtMVtjc10gPSAwOworCQl9CiAJfQogfQogCkBAIC0xMDQ5LDE4ICsxMDE2LDE2IEBACiB7CiAJZW51bSBtZW1fdHlwZSB0eXBlOwogCi0JaWYgKGJvb3RfY3B1X2RhdGEueDg2ID49IDB4MTAgfHwgcHZ0LT5leHRfbW9kZWwgPj0gT1BURVJPTl9DUFVfUkVWX0YpIHsKLQkJLyogUmV2IEYgYW5kIGxhdGVyICovCi0JCXR5cGUgPSAocHZ0LT5kY2xyMCAmIEJJVCgxNikpID8gTUVNX0REUjIgOiBNRU1fUkREUjI7CisJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID49IDB4MTAgfHwgcHZ0LT5leHRfbW9kZWwgPj0gSzhfUkVWX0YpIHsKKwkJaWYgKHB2dC0+ZGNocjAgJiBERFIzX01PREUpCisJCQl0eXBlID0gKHB2dC0+ZGNscjAgJiBCSVQoMTYpKSA/CU1FTV9ERFIzIDogTUVNX1JERFIzOworCQllbHNlCisJCQl0eXBlID0gKHB2dC0+ZGNscjAgJiBCSVQoMTYpKSA/IE1FTV9ERFIyIDogTUVNX1JERFIyOwogCX0gZWxzZSB7Ci0JCS8qIFJldiBFIGFuZCBlYXJsaWVyICovCiAJCXR5cGUgPSAocHZ0LT5kY2xyMCAmIEJJVCgxOCkpID8gTUVNX0REUiA6IE1FTV9SRERSOwogCX0KIAotCWRlYnVnZjEoIiAgTWVtb3J5IHR5cGUgaXM6ICVzXG4iLAotCQkodHlwZSA9PSBNRU1fRERSMikgPyAiTUVNX0REUjIiIDoKLQkJKHR5cGUgPT0gTUVNX1JERFIyKSA/ICJNRU1fUkREUjIiIDoKLQkJKHR5cGUgPT0gTUVNX0REUikgPyAiTUVNX0REUiIgOiAiTUVNX1JERFIiKTsKKwlkZWJ1Z2YxKCIgIE1lbW9yeSB0eXBlIGlzOiAlc1xuIiwgZWRhY19tZW1fdHlwZXNbdHlwZV0pOwogCiAJcmV0dXJuIHR5cGU7CiB9CkBAIC0xMDc4LDExICsxMDQzLDExIEBACiB7CiAJaW50IGZsYWcsIGVyciA9IDA7CiAKLQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5kcmFtX2YyX2N0bCwgRjEwX0RDTFJfMCwgJnB2dC0+ZGNscjApOworCWVyciA9IGFtZDY0X3JlYWRfcGNpX2NmZyhwdnQtPmRyYW1fZjJfY3RsLCBGMTBfRENMUl8wLCAmcHZ0LT5kY2xyMCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmICgoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPj4gNCkgPj0gT1BURVJPTl9DUFVfUkVWX0YpIHsKKwlpZiAoKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID4+IDQpID49IEs4X1JFVl9GKSB7CiAJCS8qIFJldkYgKE5QVCkgYW5kIGxhdGVyICovCiAJCWZsYWcgPSBwdnQtPmRjbHIwICYgRjEwX1dJRFRIXzEyODsKIAl9IGVsc2UgewpAQCAtMTExNCwyMiArMTA3OSwxNSBAQAogewogCXUzMiBsb3c7CiAJdTMyIG9mZiA9IGRyYW0gPDwgMzsJLyogOCBieXRlcyBiZXR3ZWVuIERSQU0gZW50cmllcyAqLwotCWludCBlcnI7CiAKLQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5hZGRyX2YxX2N0bCwKLQkJCQkgICAgSzhfRFJBTV9CQVNFX0xPVyArIG9mZiwgJmxvdyk7Ci0JaWYgKGVycikKLQkJZGVidWdmMCgiUmVhZGluZyBLOF9EUkFNX0JBU0VfTE9XIGZhaWxlZFxuIik7CisJYW1kNjRfcmVhZF9wY2lfY2ZnKHB2dC0+YWRkcl9mMV9jdGwsIEs4X0RSQU1fQkFTRV9MT1cgKyBvZmYsICZsb3cpOwogCiAJLyogRXh0cmFjdCBwYXJ0cyBpbnRvIHNlcGFyYXRlIGRhdGEgZW50cmllcyAqLwogCXB2dC0+ZHJhbV9iYXNlW2RyYW1dID0gKCh1NjQpIGxvdyAmIDB4RkZGRjAwMDApIDw8IDg7CiAJcHZ0LT5kcmFtX0ludGx2RW5bZHJhbV0gPSAobG93ID4+IDgpICYgMHg3OwogCXB2dC0+ZHJhbV9yd19lbltkcmFtXSA9IChsb3cgJiAweDMpOwogCi0JZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+YWRkcl9mMV9jdGwsCi0JCQkJICAgIEs4X0RSQU1fTElNSVRfTE9XICsgb2ZmLCAmbG93KTsKLQlpZiAoZXJyKQotCQlkZWJ1Z2YwKCJSZWFkaW5nIEs4X0RSQU1fTElNSVRfTE9XIGZhaWxlZFxuIik7CisJYW1kNjRfcmVhZF9wY2lfY2ZnKHB2dC0+YWRkcl9mMV9jdGwsIEs4X0RSQU1fTElNSVRfTE9XICsgb2ZmLCAmbG93KTsKIAogCS8qCiAJICogRXh0cmFjdCBwYXJ0cyBpbnRvIHNlcGFyYXRlIGRhdGEgZW50cmllcy4gTGltaXQgaXMgdGhlIEhJR0hFU1QgbWVtb3J5CkBAIC0xMTQyLDcgKzExMDAsNyBAQAogCiBzdGF0aWMgdm9pZCBrOF9tYXBfc3lzYWRkcl90b19jc3JvdyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCiAJCQkJCXN0cnVjdCBlcnJfcmVncyAqaW5mbywKLQkJCQkJdTY0IFN5c3RlbUFkZHJlc3MpCisJCQkJCXU2NCBzeXNfYWRkcikKIHsKIAlzdHJ1Y3QgbWVtX2N0bF9pbmZvICpzcmNfbWNpOwogCXVuc2lnbmVkIHNob3J0IHN5bmRyb21lOwpAQCAtMTE1NSw3ICsxMTEzLDcgQEAKIAogCS8qIENISVBLSUxMIGVuYWJsZWQgKi8KIAlpZiAoaW5mby0+bmJjZmcgJiBLOF9OQkNGR19DSElQS0lMTCkgewotCQljaGFubmVsID0gZ2V0X2NoYW5uZWxfZnJvbV9lY2Nfc3luZHJvbWUoc3luZHJvbWUpOworCQljaGFubmVsID0gZ2V0X2NoYW5uZWxfZnJvbV9lY2Nfc3luZHJvbWUobWNpLCBzeW5kcm9tZSk7CiAJCWlmIChjaGFubmVsIDwgMCkgewogCQkJLyoKIAkJCSAqIFN5bmRyb21lIGRpZG4ndCBtYXAsIHNvIHdlIGRvbid0IGtub3cgd2hpY2ggb2YgdGhlCkBAIC0xMTc3LDY0ICsxMTM1LDQ2IEBACiAJCSAqIHdhcyBvYnRhaW5lZCBmcm9tIGVtYWlsIGNvbW11bmljYXRpb24gd2l0aCBzb21lb25lIGF0IEFNRC4KIAkJICogKFdpc2ggdGhlIGVtYWlsIHdhcyBwbGFjZWQgaW4gdGhpcyBjb21tZW50IC0gbm9yc2spCiAJCSAqLwotCQljaGFubmVsID0gKChTeXN0ZW1BZGRyZXNzICYgQklUKDMpKSAhPSAwKTsKKwkJY2hhbm5lbCA9ICgoc3lzX2FkZHIgJiBCSVQoMykpICE9IDApOwogCX0KIAogCS8qCiAJICogRmluZCBvdXQgd2hpY2ggbm9kZSB0aGUgZXJyb3IgYWRkcmVzcyBiZWxvbmdzIHRvLiBUaGlzIG1heSBiZQogCSAqIGRpZmZlcmVudCBmcm9tIHRoZSBub2RlIHRoYXQgZGV0ZWN0ZWQgdGhlIGVycm9yLgogCSAqLwotCXNyY19tY2kgPSBmaW5kX21jX2J5X3N5c19hZGRyKG1jaSwgU3lzdGVtQWRkcmVzcyk7CisJc3JjX21jaSA9IGZpbmRfbWNfYnlfc3lzX2FkZHIobWNpLCBzeXNfYWRkcik7CiAJaWYgKCFzcmNfbWNpKSB7CiAJCWFtZDY0X21jX3ByaW50ayhtY2ksIEtFUk5fRVJSLAogCQkJICAgICAiZmFpbGVkIHRvIG1hcCBlcnJvciBhZGRyZXNzIDB4JWx4IHRvIGEgbm9kZVxuIiwKLQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpU3lzdGVtQWRkcmVzcyk7CisJCQkgICAgICh1bnNpZ25lZCBsb25nKXN5c19hZGRyKTsKIAkJZWRhY19tY19oYW5kbGVfY2Vfbm9faW5mbyhtY2ksIEVEQUNfTU9EX1NUUik7CiAJCXJldHVybjsKIAl9CiAKLQkvKiBOb3cgbWFwIHRoZSBTeXN0ZW1BZGRyZXNzIHRvIGEgQ1NST1cgKi8KLQljc3JvdyA9IHN5c19hZGRyX3RvX2Nzcm93KHNyY19tY2ksIFN5c3RlbUFkZHJlc3MpOworCS8qIE5vdyBtYXAgdGhlIHN5c19hZGRyIHRvIGEgQ1NST1cgKi8KKwljc3JvdyA9IHN5c19hZGRyX3RvX2Nzcm93KHNyY19tY2ksIHN5c19hZGRyKTsKIAlpZiAoY3Nyb3cgPCAwKSB7CiAJCWVkYWNfbWNfaGFuZGxlX2NlX25vX2luZm8oc3JjX21jaSwgRURBQ19NT0RfU1RSKTsKIAl9IGVsc2UgewotCQllcnJvcl9hZGRyZXNzX3RvX3BhZ2VfYW5kX29mZnNldChTeXN0ZW1BZGRyZXNzLCAmcGFnZSwgJm9mZnNldCk7CisJCWVycm9yX2FkZHJlc3NfdG9fcGFnZV9hbmRfb2Zmc2V0KHN5c19hZGRyLCAmcGFnZSwgJm9mZnNldCk7CiAKIAkJZWRhY19tY19oYW5kbGVfY2Uoc3JjX21jaSwgcGFnZSwgb2Zmc2V0LCBzeW5kcm9tZSwgY3Nyb3csCiAJCQkJICBjaGFubmVsLCBFREFDX01PRF9TVFIpOwogCX0KIH0KIAotLyoKLSAqIGRldGVybXJpbmUgdGhlIG51bWJlciBvZiBQQUdFUyBpbiBmb3IgdGhpcyBESU1NJ3Mgc2l6ZSBiYXNlZCBvbiBpdHMgRFJBTQotICogQWRkcmVzcyBNYXBwaW5nLgotICoKLSAqIEZpcnN0IHN0ZXAgaXMgdG8gY2FsYyB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgYSB2YWx1ZSBvZiAxIGxlZnQgdG8KLSAqIGluZGljYXRlIHNob3cgbWFueSBwYWdlcy4gU3RhcnQgd2l0aCB0aGUgREJBTSB2YWx1ZSBhcyB0aGUgc3RhcnRpbmcgYml0cywKLSAqIHRoZW4gcHJvY2VlZCB0byBhZGp1c3QgdGhvc2Ugc2hpZnQgYml0cywgYmFzZWQgb24gQ1BVIHJldiBhbmQgdGhlIHRhYmxlLgotICogU2VlIEJLREcgb24gdGhlIERCQU0KLSAqLwotc3RhdGljIGludCBrOF9kYmFtX21hcF90b19wYWdlcyhzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQsIGludCBkcmFtX21hcCkKK3N0YXRpYyBpbnQgazhfZGJhbV90b19jaGlwX3NlbGVjdChzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQsIGludCBjc19tb2RlKQogewotCWludCBucl9wYWdlczsKKwlpbnQgKmRiYW1fbWFwOwogCi0JaWYgKHB2dC0+ZXh0X21vZGVsID49IE9QVEVST05fQ1BVX1JFVl9GKSB7Ci0JCW5yX3BhZ2VzID0gMSA8PCAocmV2Zl9xdWFkX2RkcjJfc2hpZnRbZHJhbV9tYXBdIC0gUEFHRV9TSElGVCk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogUmV2RSBhbmQgbGVzcyBzZWN0aW9uOyB0aGlzIGxpbmUgaXMgdHJpY2t5LiBJdCBjb2xsYXBzZXMgdGhlCi0JCSAqIHRhYmxlIHVzZWQgYnkgUmV2RCBhbmQgbGF0ZXIgdG8gb25lIHRoYXQgbWF0Y2hlcyByZXZpc2lvbnMgQ0cKLQkJICogYW5kIGVhcmxpZXIuCi0JCSAqLwotCQlkcmFtX21hcCAtPSAocHZ0LT5leHRfbW9kZWwgPj0gT1BURVJPTl9DUFVfUkVWX0QpID8KLQkJCQkoZHJhbV9tYXAgPiA4ID8gNCA6IChkcmFtX21hcCA+IDUgPwotCQkJCTMgOiAoZHJhbV9tYXAgPiAyID8gMSA6IDApKSkgOiAwOworCWlmIChwdnQtPmV4dF9tb2RlbCA+PSBLOF9SRVZfRikKKwkJZGJhbV9tYXAgPSBkZHIyX2RiYW07CisJZWxzZSBpZiAocHZ0LT5leHRfbW9kZWwgPj0gSzhfUkVWX0QpCisJCWRiYW1fbWFwID0gZGRyMl9kYmFtX3JldkQ7CisJZWxzZQorCQlkYmFtX21hcCA9IGRkcjJfZGJhbV9yZXZDRzsKIAotCQkvKiAyNSBzaGlmdCBpcyAzMk1pQiBtaW5pbXVtIERJTU0gc2l6ZSBpbiBSZXZFIGFuZCBwcmlvciAqLwotCQlucl9wYWdlcyA9IDEgPDwgKGRyYW1fbWFwICsgMjUgLSBQQUdFX1NISUZUKTsKLQl9Ci0KLQlyZXR1cm4gbnJfcGFnZXM7CisJcmV0dXJuIGRiYW1fbWFwW2NzX21vZGVdOwogfQogCiAvKgpAQCAtMTI0OCwzNCArMTE4OCwyNCBAQAogc3RhdGljIGludCBmMTBfZWFybHlfY2hhbm5lbF9jb3VudChzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQpCiB7CiAJaW50IGRiYW1zW10gPSB7IERCQU0wLCBEQkFNMSB9OwotCWludCBlcnIgPSAwLCBjaGFubmVscyA9IDA7Ci0JaW50IGksIGo7CisJaW50IGksIGosIGNoYW5uZWxzID0gMDsKIAl1MzIgZGJhbTsKIAotCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmRyYW1fZjJfY3RsLCBGMTBfRENMUl8wLCAmcHZ0LT5kY2xyMCk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfcmVnOwotCi0JZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+ZHJhbV9mMl9jdGwsIEYxMF9EQ0xSXzEsICZwdnQtPmRjbHIxKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9yZWc7Ci0KIAkvKiBJZiB3ZSBhcmUgaW4gMTI4IGJpdCBtb2RlLCB0aGVuIHdlIGFyZSB1c2luZyAyIGNoYW5uZWxzICovCiAJaWYgKHB2dC0+ZGNscjAgJiBGMTBfV0lEVEhfMTI4KSB7Ci0JCWRlYnVnZjAoIkRhdGEgV0lEVEggaXMgMTI4IGJpdHMgLSAyIGNoYW5uZWxzXG4iKTsKIAkJY2hhbm5lbHMgPSAyOwogCQlyZXR1cm4gY2hhbm5lbHM7CiAJfQogCiAJLyoKLQkgKiBOZWVkIHRvIGNoZWNrIGlmIGluIFVOLWdhbmdlZCBtb2RlOiBJbiBzdWNoLCB0aGVyZSBhcmUgMiBjaGFubmVscywKLQkgKiBidXQgdGhleSBhcmUgTk9UIGluIDEyOCBiaXQgbW9kZSBhbmQgdGh1cyB0aGUgYWJvdmUgJ2RjbDAnIHN0YXR1cyBiaXQKLQkgKiB3aWxsIGJlIE9GRi4KKwkgKiBOZWVkIHRvIGNoZWNrIGlmIGluIHVuZ2FuZ2VkIG1vZGU6IEluIHN1Y2gsIHRoZXJlIGFyZSAyIGNoYW5uZWxzLAorCSAqIGJ1dCB0aGV5IGFyZSBub3QgaW4gMTI4IGJpdCBtb2RlIGFuZCB0aHVzIHRoZSBhYm92ZSAnZGNscjAnIHN0YXR1cworCSAqIGJpdCB3aWxsIGJlIE9GRi4KIAkgKgogCSAqIE5lZWQgdG8gY2hlY2sgRENUMFswXSBhbmQgRENUMVswXSB0byBzZWUgaWYgb25seSBvbmUgb2YgdGhlbSBoYXMKIAkgKiB0aGVpciBDU0VuYWJsZSBiaXQgb24uIElmIHNvLCB0aGVuIFNJTkdMRSBESU1NIGNhc2UuCiAJICovCi0JZGVidWdmMCgiRGF0YSBXSURUSCBpcyBOT1QgMTI4IGJpdHMgLSBuZWVkIG1vcmUgZGVjb2RpbmdcbiIpOworCWRlYnVnZjAoIkRhdGEgd2lkdGggaXMgbm90IDEyOCBiaXRzIC0gbmVlZCBtb3JlIGRlY29kaW5nXG4iKTsKIAogCS8qCiAJICogQ2hlY2sgRFJBTSBCYW5rIEFkZHJlc3MgTWFwcGluZyB2YWx1ZXMgZm9yIGVhY2ggRElNTSB0byBzZWUgaWYgdGhlcmUKQEAgLTEyODMsOCArMTIxMyw3IEBACiAJICogYm90aCBjb250cm9sbGVycyBzaW5jZSBESU1NcyBjYW4gYmUgcGxhY2VkIGluIGVpdGhlciBvbmUuCiAJICovCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGJhbXMpOyBpKyspIHsKLQkJZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+ZHJhbV9mMl9jdGwsIGRiYW1zW2ldLCAmZGJhbSk7Ci0JCWlmIChlcnIpCisJCWlmIChhbWQ2NF9yZWFkX3BjaV9jZmcocHZ0LT5kcmFtX2YyX2N0bCwgZGJhbXNbaV0sICZkYmFtKSkKIAkJCWdvdG8gZXJyX3JlZzsKIAogCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CkBAIC0xMjk1LDYgKzEyMjQsOSBAQAogCQl9CiAJfQogCisJaWYgKGNoYW5uZWxzID4gMikKKwkJY2hhbm5lbHMgPSAyOworCiAJZGVidWdmMCgiTUNUIGNoYW5uZWwgY291bnQ6ICVkXG4iLCBjaGFubmVscyk7CiAKIAlyZXR1cm4gY2hhbm5lbHM7CkBAIC0xMzA0LDkgKzEyMzYsMTYgQEAKIAogfQogCi1zdGF0aWMgaW50IGYxMF9kYmFtX21hcF90b19wYWdlcyhzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQsIGludCBkcmFtX21hcCkKK3N0YXRpYyBpbnQgZjEwX2RiYW1fdG9fY2hpcF9zZWxlY3Qoc3RydWN0IGFtZDY0X3B2dCAqcHZ0LCBpbnQgY3NfbW9kZSkKIHsKLQlyZXR1cm4gMSA8PCAocmV2Zl9xdWFkX2RkcjJfc2hpZnRbZHJhbV9tYXBdIC0gUEFHRV9TSElGVCk7CisJaW50ICpkYmFtX21hcDsKKworCWlmIChwdnQtPmRjaHIwICYgRERSM19NT0RFIHx8IHB2dC0+ZGNocjEgJiBERFIzX01PREUpCisJCWRiYW1fbWFwID0gZGRyM19kYmFtOworCWVsc2UKKwkJZGJhbV9tYXAgPSBkZHIyX2RiYW07CisKKwlyZXR1cm4gZGJhbV9tYXBbY3NfbW9kZV07CiB9CiAKIC8qIEVuYWJsZSBleHRlbmRlZCBjb25maWd1cmF0aW9uIGFjY2VzcyB2aWEgMHhDRjggZmVhdHVyZSAqLwpAQCAtMTMxNCw3ICsxMjUzLDcgQEAKIHsKIAl1MzIgcmVnOwogCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+bWlzY19mM19jdGwsIEYxMF9OQl9DRkdfSElHSCwgJnJlZyk7CisJYW1kNjRfcmVhZF9wY2lfY2ZnKHB2dC0+bWlzY19mM19jdGwsIEYxMF9OQl9DRkdfSElHSCwgJnJlZyk7CiAKIAlwdnQtPmZsYWdzLmNmOF9leHRjZmcgPSAhIShyZWcgJiBGMTBfTkJfQ0ZHX0xPV19FTkFCTEVfRVhUX0NGRyk7CiAJcmVnIHw9IEYxMF9OQl9DRkdfTE9XX0VOQUJMRV9FWFRfQ0ZHOwpAQCAtMTMyNiw3ICsxMjY1LDcgQEAKIHsKIAl1MzIgcmVnOwogCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+bWlzY19mM19jdGwsIEYxMF9OQl9DRkdfSElHSCwgJnJlZyk7CisJYW1kNjRfcmVhZF9wY2lfY2ZnKHB2dC0+bWlzY19mM19jdGwsIEYxMF9OQl9DRkdfSElHSCwgJnJlZyk7CiAKIAlyZWcgJj0gfkYxMF9OQl9DRkdfTE9XX0VOQUJMRV9FWFRfQ0ZHOwogCWlmIChwdnQtPmZsYWdzLmNmOF9leHRjZmcpCkBAIC0xMzU1LDEwICsxMjk0LDEwIEBACiAJaGlnaF9vZmZzZXQgPSBGMTBfRFJBTV9CQVNFX0hJR0ggKyAoZHJhbSA8PCAzKTsKIAogCS8qIHJlYWQgdGhlICdyYXcnIERSQU0gQkFTRSBBZGRyZXNzIHJlZ2lzdGVyICovCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+YWRkcl9mMV9jdGwsIGxvd19vZmZzZXQsICZsb3dfYmFzZSk7CisJYW1kNjRfcmVhZF9wY2lfY2ZnKHB2dC0+YWRkcl9mMV9jdGwsIGxvd19vZmZzZXQsICZsb3dfYmFzZSk7CiAKIAkvKiBSZWFkIGZyb20gdGhlIEVDUyBkYXRhIHJlZ2lzdGVyICovCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+YWRkcl9mMV9jdGwsIGhpZ2hfb2Zmc2V0LCAmaGlnaF9iYXNlKTsKKwlhbWQ2NF9yZWFkX3BjaV9jZmcocHZ0LT5hZGRyX2YxX2N0bCwgaGlnaF9vZmZzZXQsICZoaWdoX2Jhc2UpOwogCiAJLyogRXh0cmFjdCBwYXJ0cyBpbnRvIHNlcGFyYXRlIGRhdGEgZW50cmllcyAqLwogCXB2dC0+ZHJhbV9yd19lbltkcmFtXSA9IChsb3dfYmFzZSAmIDB4Myk7CkBAIC0xMzc1LDEzICsxMzE0LDEwIEBACiAJaGlnaF9vZmZzZXQgPSBGMTBfRFJBTV9MSU1JVF9ISUdIICsgKGRyYW0gPDwgMyk7CiAKIAkvKiByZWFkIHRoZSAncmF3JyBMSU1JVCByZWdpc3RlcnMgKi8KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5hZGRyX2YxX2N0bCwgbG93X29mZnNldCwgJmxvd19saW1pdCk7CisJYW1kNjRfcmVhZF9wY2lfY2ZnKHB2dC0+YWRkcl9mMV9jdGwsIGxvd19vZmZzZXQsICZsb3dfbGltaXQpOwogCiAJLyogUmVhZCBmcm9tIHRoZSBFQ1MgZGF0YSByZWdpc3RlciBmb3IgdGhlIEhJR0ggcG9ydGlvbiAqLwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmFkZHJfZjFfY3RsLCBoaWdoX29mZnNldCwgJmhpZ2hfbGltaXQpOwotCi0JZGVidWdmMCgiICBIVyBSZWdzOiBCQVNFPTB4JTA4eC0lMDh4ICAgICAgTElNSVQ9ICAweCUwOHgtJTA4eFxuIiwKLQkJaGlnaF9iYXNlLCBsb3dfYmFzZSwgaGlnaF9saW1pdCwgbG93X2xpbWl0KTsKKwlhbWQ2NF9yZWFkX3BjaV9jZmcocHZ0LT5hZGRyX2YxX2N0bCwgaGlnaF9vZmZzZXQsICZoaWdoX2xpbWl0KTsKIAogCXB2dC0+ZHJhbV9Ec3ROb2RlW2RyYW1dID0gKGxvd19saW1pdCAmIDB4Nyk7CiAJcHZ0LT5kcmFtX0ludGx2U2VsW2RyYW1dID0gKGxvd19saW1pdCA+PiA4KSAmIDB4NzsKQEAgLTEzOTcsMzIgKzEzMzMsMzUgQEAKIAogc3RhdGljIHZvaWQgZjEwX3JlYWRfZHJhbV9jdGxfcmVnaXN0ZXIoc3RydWN0IGFtZDY0X3B2dCAqcHZ0KQogewotCWludCBlcnIgPSAwOwogCi0JZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+ZHJhbV9mMl9jdGwsIEYxMF9EQ1RMX1NFTF9MT1csCi0JCQkJICAgICZwdnQtPmRyYW1fY3RsX3NlbGVjdF9sb3cpOwotCWlmIChlcnIpIHsKLQkJZGVidWdmMCgiUmVhZGluZyBGMTBfRENUTF9TRUxfTE9XIGZhaWxlZFxuIik7Ci0JfSBlbHNlIHsKLQkJZGVidWdmMCgiRFJBTV9EQ1RMX1NFTF9MT1c9MHgleCAgRGN0U2VsQmFzZUFkZHI9MHgleFxuIiwKLQkJCXB2dC0+ZHJhbV9jdGxfc2VsZWN0X2xvdywgZGN0X3NlbF9iYXNlYWRkcihwdnQpKTsKKwlpZiAoIWFtZDY0X3JlYWRfcGNpX2NmZyhwdnQtPmRyYW1fZjJfY3RsLCBGMTBfRENUTF9TRUxfTE9XLAorCQkJCSZwdnQtPmRyYW1fY3RsX3NlbGVjdF9sb3cpKSB7CisJCWRlYnVnZjAoIkYyeDExMCAoRENUTCBTZWwuIExvdyk6IDB4JTA4eCwgIgorCQkJIkhpZ2ggcmFuZ2UgYWRkcmVzc2VzIGF0OiAweCV4XG4iLAorCQkJcHZ0LT5kcmFtX2N0bF9zZWxlY3RfbG93LAorCQkJZGN0X3NlbF9iYXNlYWRkcihwdnQpKTsKIAotCQlkZWJ1Z2YwKCIgIERSQU0gRENUcyBhcmU9JXMgRFJBTSBJcz0lcyBEUkFNLUN0bC0iCi0JCQkJInNlbC1oaS1yYW5nZT0lc1xuIiwKLQkJCShkY3RfZ2FuZ2luZ19lbmFibGVkKHB2dCkgPyAiR0FOR0VEIiA6ICJOT1QgR0FOR0VEIiksCi0JCQkoZGN0X2RyYW1fZW5hYmxlZChwdnQpID8gIkVuYWJsZWQiICAgOiAiRGlzYWJsZWQiKSwKLQkJCShkY3RfaGlnaF9yYW5nZV9lbmFibGVkKHB2dCkgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKSk7CisJCWRlYnVnZjAoIiAgRENUIG1vZGU6ICVzLCBBbGwgRENUcyBvbjogJXNcbiIsCisJCQkoZGN0X2dhbmdpbmdfZW5hYmxlZChwdnQpID8gImdhbmdlZCIgOiAidW5nYW5nZWQiKSwKKwkJCShkY3RfZHJhbV9lbmFibGVkKHB2dCkgPyAieWVzIiAgIDogIm5vIikpOwogCi0JCWRlYnVnZjAoIiAgRGN0RGF0SW50THY9JXMgTWVtQ2xlYXJlZD0lcyBEY3RTZWxJbnRMdkFkZHI9MHgleFxuIiwKLQkJCShkY3RfZGF0YV9pbnRsdl9lbmFibGVkKHB2dCkgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKSwKLQkJCShkY3RfbWVtb3J5X2NsZWFyZWQocHZ0KSA/ICJUcnVlICIgOiAiRmFsc2UgIiksCisJCWlmICghZGN0X2dhbmdpbmdfZW5hYmxlZChwdnQpKQorCQkJZGVidWdmMCgiICBBZGRyZXNzIHJhbmdlIHNwbGl0IHBlciBEQ1Q6ICVzXG4iLAorCQkJCShkY3RfaGlnaF9yYW5nZV9lbmFibGVkKHB2dCkgPyAieWVzIiA6ICJubyIpKTsKKworCQlkZWJ1Z2YwKCIgIERDVCBkYXRhIGludGVybGVhdmUgZm9yIEVDQzogJXMsICIKKwkJCSJEUkFNIGNsZWFyZWQgc2luY2UgbGFzdCB3YXJtIHJlc2V0OiAlc1xuIiwKKwkJCShkY3RfZGF0YV9pbnRsdl9lbmFibGVkKHB2dCkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKSwKKwkJCShkY3RfbWVtb3J5X2NsZWFyZWQocHZ0KSA/ICJ5ZXMiIDogIm5vIikpOworCisJCWRlYnVnZjAoIiAgRENUIGNoYW5uZWwgaW50ZXJsZWF2ZTogJXMsICIKKwkJCSJEQ1QgaW50ZXJsZWF2ZSBiaXRzIHNlbGVjdG9yOiAweCV4XG4iLAorCQkJKGRjdF9pbnRlcmxlYXZlX2VuYWJsZWQocHZ0KSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpLAogCQkJZGN0X3NlbF9pbnRlcmxlYXZlX2FkZHIocHZ0KSk7CiAJfQogCi0JZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+ZHJhbV9mMl9jdGwsIEYxMF9EQ1RMX1NFTF9ISUdILAotCQkJCSAgICAmcHZ0LT5kcmFtX2N0bF9zZWxlY3RfaGlnaCk7Ci0JaWYgKGVycikKLQkJZGVidWdmMCgiUmVhZGluZyBGMTBfRENUTF9TRUxfSElHSCBmYWlsZWRcbiIpOworCWFtZDY0X3JlYWRfcGNpX2NmZyhwdnQtPmRyYW1fZjJfY3RsLCBGMTBfRENUTF9TRUxfSElHSCwKKwkJCSAgICZwdnQtPmRyYW1fY3RsX3NlbGVjdF9oaWdoKTsKIH0KIAogLyoKQEAgLTE3MDYsMTAgKzE2NDUsMTEgQEAKIH0KIAogLyoKLSAqIFRoaXMgdGhlIEYxMGggcmVmZXJlbmNlIGNvZGUgZnJvbSBBTUQgdG8gbWFwIGEgQHN5c19hZGRyIHRvIE5vZGVJRCwKLSAqIENTUk9XLCBDaGFubmVsLgorICogRm9yIHJlZmVyZW5jZSBzZWUgIjIuOC41IFJvdXRpbmcgRFJBTSBSZXF1ZXN0cyIgaW4gRjEwIEJLREcuIFRoaXMgY29kZSBtYXBzCisgKiBhIEBzeXNfYWRkciB0byBOb2RlSUQsIERDVCAoY2hhbm5lbCkgYW5kIGNoaXAgc2VsZWN0IChDU1JPVykuCiAgKgotICogVGhlIEBzeXNfYWRkciBpcyB1c3VhbGx5IGFuIGVycm9yIGFkZHJlc3MgcmVjZWl2ZWQgZnJvbSB0aGUgaGFyZHdhcmUuCisgKiBUaGUgQHN5c19hZGRyIGlzIHVzdWFsbHkgYW4gZXJyb3IgYWRkcmVzcyByZWNlaXZlZCBmcm9tIHRoZSBoYXJkd2FyZQorICogKE1DWF9BRERSKS4KICAqLwogc3RhdGljIHZvaWQgZjEwX21hcF9zeXNhZGRyX3RvX2Nzcm93KHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKIAkJCQkgICAgIHN0cnVjdCBlcnJfcmVncyAqaW5mbywKQEAgLTE3MjIsMTM2ICsxNjYyLDc5IEBACiAKIAljc3JvdyA9IGYxMF90cmFuc2xhdGVfc3lzYWRkcl90b19jcyhwdnQsIHN5c19hZGRyLCAmbmlkLCAmY2hhbik7CiAKLQlpZiAoY3Nyb3cgPj0gMCkgewotCQllcnJvcl9hZGRyZXNzX3RvX3BhZ2VfYW5kX29mZnNldChzeXNfYWRkciwgJnBhZ2UsICZvZmZzZXQpOwotCi0JCXN5bmRyb21lICA9IEhJR0hfU1lORFJPTUUoaW5mby0+bmJzbCkgPDwgODsKLQkJc3luZHJvbWUgfD0gTE9XX1NZTkRST01FKGluZm8tPm5ic2gpOwotCi0JCS8qCi0JCSAqIElzIENISVBLSUxMIG9uPyBJZiBzbywgdGhlbiB3ZSBjYW4gYXR0ZW1wdCB0byB1c2UgdGhlCi0JCSAqIHN5bmRyb21lIHRvIGlzb2xhdGUgd2hpY2ggY2hhbm5lbCB0aGUgZXJyb3Igd2FzIG9uLgotCQkgKi8KLQkJaWYgKHB2dC0+bmJjZmcgJiBLOF9OQkNGR19DSElQS0lMTCkKLQkJCWNoYW4gPSBnZXRfY2hhbm5lbF9mcm9tX2VjY19zeW5kcm9tZShzeW5kcm9tZSk7Ci0KLQkJaWYgKGNoYW4gPj0gMCkgewotCQkJZWRhY19tY19oYW5kbGVfY2UobWNpLCBwYWdlLCBvZmZzZXQsIHN5bmRyb21lLAotCQkJCQljc3JvdywgY2hhbiwgRURBQ19NT0RfU1RSKTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBDaGFubmVsIHVua25vd24sIHJlcG9ydCBhbGwgY2hhbm5lbHMgb24gdGhpcwotCQkJICogQ1NST1cgYXMgZmFpbGVkLgotCQkJICovCi0JCQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbWNpLT5jc3Jvd3NbY3Nyb3ddLm5yX2NoYW5uZWxzOwotCQkJCQkJCQljaGFuKyspIHsKLQkJCQkJZWRhY19tY19oYW5kbGVfY2UobWNpLCBwYWdlLCBvZmZzZXQsCi0JCQkJCQkJc3luZHJvbWUsCi0JCQkJCQkJY3Nyb3csIGNoYW4sCi0JCQkJCQkJRURBQ19NT0RfU1RSKTsKLQkJCX0KLQkJfQotCi0JfSBlbHNlIHsKKwlpZiAoY3Nyb3cgPCAwKSB7CiAJCWVkYWNfbWNfaGFuZGxlX2NlX25vX2luZm8obWNpLCBFREFDX01PRF9TVFIpOworCQlyZXR1cm47CiAJfQorCisJZXJyb3JfYWRkcmVzc190b19wYWdlX2FuZF9vZmZzZXQoc3lzX2FkZHIsICZwYWdlLCAmb2Zmc2V0KTsKKworCXN5bmRyb21lICA9IEhJR0hfU1lORFJPTUUoaW5mby0+bmJzbCkgPDwgODsKKwlzeW5kcm9tZSB8PSBMT1dfU1lORFJPTUUoaW5mby0+bmJzaCk7CisKKwkvKgorCSAqIFdlIG5lZWQgdGhlIHN5bmRyb21lcyBmb3IgY2hhbm5lbCBkZXRlY3Rpb24gb25seSB3aGVuIHdlJ3JlCisJICogZ2FuZ2VkLiBPdGhlcndpc2UgQGNoYW4gc2hvdWxkIGFscmVhZHkgY29udGFpbiB0aGUgY2hhbm5lbCBhdAorCSAqIHRoaXMgcG9pbnQuCisJICovCisJaWYgKGRjdF9nYW5naW5nX2VuYWJsZWQocHZ0KSAmJiBwdnQtPm5iY2ZnICYgSzhfTkJDRkdfQ0hJUEtJTEwpCisJCWNoYW4gPSBnZXRfY2hhbm5lbF9mcm9tX2VjY19zeW5kcm9tZShtY2ksIHN5bmRyb21lKTsKKworCWlmIChjaGFuID49IDApCisJCWVkYWNfbWNfaGFuZGxlX2NlKG1jaSwgcGFnZSwgb2Zmc2V0LCBzeW5kcm9tZSwgY3Nyb3csIGNoYW4sCisJCQkJICBFREFDX01PRF9TVFIpOworCWVsc2UKKwkJLyoKKwkJICogQ2hhbm5lbCB1bmtub3duLCByZXBvcnQgYWxsIGNoYW5uZWxzIG9uIHRoaXMgQ1NST1cgYXMgZmFpbGVkLgorCQkgKi8KKwkJZm9yIChjaGFuID0gMDsgY2hhbiA8IG1jaS0+Y3Nyb3dzW2Nzcm93XS5ucl9jaGFubmVsczsgY2hhbisrKQorCQkJZWRhY19tY19oYW5kbGVfY2UobWNpLCBwYWdlLCBvZmZzZXQsIHN5bmRyb21lLAorCQkJCQkgIGNzcm93LCBjaGFuLCBFREFDX01PRF9TVFIpOwogfQogCiAvKgotICogSW5wdXQgKEBpbmRleCkgaXMgdGhlIERCQU0gRElNTSB2YWx1ZSAoMSBvZiA0KSB1c2VkIGFzIGFuIGluZGV4IGludG8gYSBzaGlmdAotICogdGFibGUgKHJldmZfcXVhZF9kZHIyX3NoaWZ0KSB3aGljaCBzdGFydHMgYXQgMTI4TUIgRElNTSBzaXplLiBJbmRleCBvZiAwCi0gKiBpbmRpY2F0ZXMgYW4gZW1wdHkgRElNTSBzbG90LCBhcyByZXBvcnRlZCBieSBIYXJkd2FyZSBvbiBlbXB0eSBzbG90cy4KLSAqCi0gKiBOb3JtYWxpemUgdG8gMTI4TUIgYnkgc3VicmFjdGluZyAyNyBiaXQgc2hpZnQuCi0gKi8KLXN0YXRpYyBpbnQgbWFwX2RiYW1fdG9fY3Nyb3dfc2l6ZShpbnQgaW5kZXgpCi17Ci0JaW50IG1lZ2FfYnl0ZXMgPSAwOwotCi0JaWYgKGluZGV4ID4gMCAmJiBpbmRleCA8PSBEQkFNX01BWF9WQUxVRSkKLQkJbWVnYV9ieXRlcyA9ICgoMTI4IDw8IChyZXZmX3F1YWRfZGRyMl9zaGlmdFtpbmRleF0tMjcpKSk7Ci0KLQlyZXR1cm4gbWVnYV9ieXRlczsKLX0KLQotLyoKLSAqIGRlYnVnIHJvdXRpbmUgdG8gZGlzcGxheSB0aGUgbWVtb3J5IHNpemVzIG9mIGEgRElNTSAoZ2FuZ2VkIG9yIG5vdCkgYW5kIGl0CisgKiBkZWJ1ZyByb3V0aW5lIHRvIGRpc3BsYXkgdGhlIG1lbW9yeSBzaXplcyBvZiBhbGwgbG9naWNhbCBESU1NcyBhbmQgaXRzCiAgKiBDU1JPV3MgYXMgd2VsbAogICovCi1zdGF0aWMgdm9pZCBmMTBfZGVidWdfZGlzcGxheV9kaW1tX3NpemVzKGludCBjdHJsLCBzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQsCi0JCQkJCSBpbnQgZ2FuZ2VkKQorc3RhdGljIHZvaWQgYW1kNjRfZGVidWdfZGlzcGxheV9kaW1tX3NpemVzKGludCBjdHJsLCBzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQpCiB7CiAJaW50IGRpbW0sIHNpemUwLCBzaXplMTsKIAl1MzIgZGJhbTsKIAl1MzIgKmRjc2I7CiAKLQlkZWJ1Z2YxKCIgIGRiYW0lZDogMHglOC4wOHggIENTUk9XIGlzICVzXG4iLCBjdHJsLAotCQkJY3RybCA/IHB2dC0+ZGJhbTEgOiBwdnQtPmRiYW0wLAotCQkJZ2FuZ2VkID8gIkdBTkdFRCAtIGRiYW0xIG5vdCB1c2VkIiA6ICJOT04tR0FOR0VEIik7CisJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDB4ZikgeworCQkvKiBLOCBmYW1pbGllcyA8IHJldkYgbm90IHN1cHBvcnRlZCB5ZXQgKi8KKwkgICAgICAgaWYgKHB2dC0+ZXh0X21vZGVsIDwgSzhfUkVWX0YpCisJCQlyZXR1cm47CisJICAgICAgIGVsc2UKKwkJICAgICAgIFdBUk5fT04oY3RybCAhPSAwKTsKKwl9CisKKwlkZWJ1Z2YxKCJGMnglZDgwIChEUkFNIEJhbmsgQWRkcmVzcyBNYXBwaW5nKTogMHglMDh4XG4iLAorCQljdHJsLCBjdHJsID8gcHZ0LT5kYmFtMSA6IHB2dC0+ZGJhbTApOwogCiAJZGJhbSA9IGN0cmwgPyBwdnQtPmRiYW0xIDogcHZ0LT5kYmFtMDsKIAlkY3NiID0gY3RybCA/IHB2dC0+ZGNzYjEgOiBwdnQtPmRjc2IwOwogCisJZWRhY19wcmludGsoS0VSTl9ERUJVRywgRURBQ19NQywgIkRDVCVkIGNoaXAgc2VsZWN0czpcbiIsIGN0cmwpOworCiAJLyogRHVtcCBtZW1vcnkgc2l6ZXMgZm9yIERJTU0gYW5kIGl0cyBDU1JPV3MgKi8KIAlmb3IgKGRpbW0gPSAwOyBkaW1tIDwgNDsgZGltbSsrKSB7CiAKIAkJc2l6ZTAgPSAwOwogCQlpZiAoZGNzYltkaW1tKjJdICYgSzhfRENTQl9DU19FTkFCTEUpCi0JCQlzaXplMCA9IG1hcF9kYmFtX3RvX2Nzcm93X3NpemUoREJBTV9ESU1NKGRpbW0sIGRiYW0pKTsKKwkJCXNpemUwID0gcHZ0LT5vcHMtPmRiYW1fdG9fY3MocHZ0LCBEQkFNX0RJTU0oZGltbSwgZGJhbSkpOwogCiAJCXNpemUxID0gMDsKIAkJaWYgKGRjc2JbZGltbSoyICsgMV0gJiBLOF9EQ1NCX0NTX0VOQUJMRSkKLQkJCXNpemUxID0gbWFwX2RiYW1fdG9fY3Nyb3dfc2l6ZShEQkFNX0RJTU0oZGltbSwgZGJhbSkpOworCQkJc2l6ZTEgPSBwdnQtPm9wcy0+ZGJhbV90b19jcyhwdnQsIERCQU1fRElNTShkaW1tLCBkYmFtKSk7CiAKLQkJZGVidWdmMSgiICAgICBDVFJMLSVkIERJTU0tJWQ9JTVkTUIgICBDU1JPVy0lZD0lNWRNQiAiCi0JCQkJIkNTUk9XLSVkPSU1ZE1CXG4iLAotCQkJCWN0cmwsCi0JCQkJZGltbSwKLQkJCQlzaXplMCArIHNpemUxLAotCQkJCWRpbW0gKiAyLAotCQkJCXNpemUwLAotCQkJCWRpbW0gKiAyICsgMSwKLQkJCQlzaXplMSk7CisJCWVkYWNfcHJpbnRrKEtFUk5fREVCVUcsIEVEQUNfTUMsICIgJWQ6ICU1ZE1CICVkOiAlNWRNQlxuIiwKKwkJCSAgICBkaW1tICogMiwgc2l6ZTAsIGRpbW0gKiAyICsgMSwgc2l6ZTEpOwogCX0KIH0KIAogLyoKLSAqIFZlcnkgZWFybHkgaGFyZHdhcmUgcHJvYmUgb24gcGNpX3Byb2JlIHRocmVhZCB0byBkZXRlcm1pbmUgaWYgdGhpcyBtb2R1bGUKLSAqIHN1cHBvcnRzIHRoZSBoYXJkd2FyZS4KLSAqCi0gKiBSZXR1cm46Ci0gKiAgICAgIDAgZm9yIE9LCi0gKiAgICAgIDEgZm9yIGVycm9yCi0gKi8KLXN0YXRpYyBpbnQgZjEwX3Byb2JlX3ZhbGlkX2hhcmR3YXJlKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCS8qCi0JICogSWYgd2UgYXJlIG9uIGEgRERSMyBtYWNoaW5lLCB3ZSBkb24ndCBrbm93IHlldCBpZgotCSAqIHdlIHN1cHBvcnQgdGhhdCBwcm9wZXJseSBhdCB0aGlzIHRpbWUKLQkgKi8KLQlpZiAoKHB2dC0+ZGNocjAgJiBGMTBfRENIUl9EZHIzTW9kZSkgfHwKLQkgICAgKHB2dC0+ZGNocjEgJiBGMTBfRENIUl9EZHIzTW9kZSkpIHsKLQotCQlhbWQ2NF9wcmludGsoS0VSTl9XQVJOSU5HLAotCQkJIiVzKCkgVGhpcyBtYWNoaW5lIGlzIHJ1bm5pbmcgd2l0aCBERFIzIG1lbW9yeS4gIgotCQkJIlRoaXMgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuICIKLQkJCSJEQ0hSMD0weCV4IERDSFIxPTB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgcHZ0LT5kY2hyMCwgcHZ0LT5kY2hyMSk7Ci0KLQkJYW1kNjRfcHJpbnRrKEtFUk5fV0FSTklORywKLQkJCSIgICBDb250YWN0ICclcycgbW9kdWxlIE1BSU5UQUlORVIgdG8gaGVscCBhZGQiCi0JCQkiIHN1cHBvcnQuXG4iLAotCQkJRURBQ19NT0RfU1RSKTsKLQotCQlyZXQgPSAxOwotCi0JfQotCXJldHVybiByZXQ7Ci19Ci0KLS8qCiAgKiBUaGVyZSBjdXJyZW50bHkgYXJlIDMgdHlwZXMgdHlwZSBvZiBNQyBkZXZpY2VzIGZvciBBTUQgQXRobG9uL09wdGVyb25zCiAgKiAoYXMgcGVyIFBDSSBERVZJQ0VfSURzKToKICAqCkBAIC0xODY4LDExICsxNzUxLDExIEBACiAJCS5hZGRyX2YxX2N0bCA9IFBDSV9ERVZJQ0VfSURfQU1EX0s4X05CX0FERFJNQVAsCiAJCS5taXNjX2YzX2N0bCA9IFBDSV9ERVZJQ0VfSURfQU1EX0s4X05CX01JU0MsCiAJCS5vcHMgPSB7Ci0JCQkuZWFybHlfY2hhbm5lbF9jb3VudCA9IGs4X2Vhcmx5X2NoYW5uZWxfY291bnQsCi0JCQkuZ2V0X2Vycm9yX2FkZHJlc3MgPSBrOF9nZXRfZXJyb3JfYWRkcmVzcywKLQkJCS5yZWFkX2RyYW1fYmFzZV9saW1pdCA9IGs4X3JlYWRfZHJhbV9iYXNlX2xpbWl0LAotCQkJLm1hcF9zeXNhZGRyX3RvX2Nzcm93ID0gazhfbWFwX3N5c2FkZHJfdG9fY3Nyb3csCi0JCQkuZGJhbV9tYXBfdG9fcGFnZXMgPSBrOF9kYmFtX21hcF90b19wYWdlcywKKwkJCS5lYXJseV9jaGFubmVsX2NvdW50CT0gazhfZWFybHlfY2hhbm5lbF9jb3VudCwKKwkJCS5nZXRfZXJyb3JfYWRkcmVzcwk9IGs4X2dldF9lcnJvcl9hZGRyZXNzLAorCQkJLnJlYWRfZHJhbV9iYXNlX2xpbWl0CT0gazhfcmVhZF9kcmFtX2Jhc2VfbGltaXQsCisJCQkubWFwX3N5c2FkZHJfdG9fY3Nyb3cJPSBrOF9tYXBfc3lzYWRkcl90b19jc3JvdywKKwkJCS5kYmFtX3RvX2NzCQk9IGs4X2RiYW1fdG9fY2hpcF9zZWxlY3QsCiAJCX0KIAl9LAogCVtGMTBfQ1BVU10gPSB7CkBAIC0xODgwLDEzICsxNzYzLDEyIEBACiAJCS5hZGRyX2YxX2N0bCA9IFBDSV9ERVZJQ0VfSURfQU1EXzEwSF9OQl9NQVAsCiAJCS5taXNjX2YzX2N0bCA9IFBDSV9ERVZJQ0VfSURfQU1EXzEwSF9OQl9NSVNDLAogCQkub3BzID0gewotCQkJLnByb2JlX3ZhbGlkX2hhcmR3YXJlID0gZjEwX3Byb2JlX3ZhbGlkX2hhcmR3YXJlLAotCQkJLmVhcmx5X2NoYW5uZWxfY291bnQgPSBmMTBfZWFybHlfY2hhbm5lbF9jb3VudCwKLQkJCS5nZXRfZXJyb3JfYWRkcmVzcyA9IGYxMF9nZXRfZXJyb3JfYWRkcmVzcywKLQkJCS5yZWFkX2RyYW1fYmFzZV9saW1pdCA9IGYxMF9yZWFkX2RyYW1fYmFzZV9saW1pdCwKLQkJCS5yZWFkX2RyYW1fY3RsX3JlZ2lzdGVyID0gZjEwX3JlYWRfZHJhbV9jdGxfcmVnaXN0ZXIsCi0JCQkubWFwX3N5c2FkZHJfdG9fY3Nyb3cgPSBmMTBfbWFwX3N5c2FkZHJfdG9fY3Nyb3csCi0JCQkuZGJhbV9tYXBfdG9fcGFnZXMgPSBmMTBfZGJhbV9tYXBfdG9fcGFnZXMsCisJCQkuZWFybHlfY2hhbm5lbF9jb3VudAk9IGYxMF9lYXJseV9jaGFubmVsX2NvdW50LAorCQkJLmdldF9lcnJvcl9hZGRyZXNzCT0gZjEwX2dldF9lcnJvcl9hZGRyZXNzLAorCQkJLnJlYWRfZHJhbV9iYXNlX2xpbWl0CT0gZjEwX3JlYWRfZHJhbV9iYXNlX2xpbWl0LAorCQkJLnJlYWRfZHJhbV9jdGxfcmVnaXN0ZXIJPSBmMTBfcmVhZF9kcmFtX2N0bF9yZWdpc3RlciwKKwkJCS5tYXBfc3lzYWRkcl90b19jc3Jvdwk9IGYxMF9tYXBfc3lzYWRkcl90b19jc3JvdywKKwkJCS5kYmFtX3RvX2NzCQk9IGYxMF9kYmFtX3RvX2NoaXBfc2VsZWN0LAogCQl9CiAJfSwKIAlbRjExX0NQVVNdID0gewpAQCAtMTg5NCwxMyArMTc3NiwxMiBAQAogCQkuYWRkcl9mMV9jdGwgPSBQQ0lfREVWSUNFX0lEX0FNRF8xMUhfTkJfTUFQLAogCQkubWlzY19mM19jdGwgPSBQQ0lfREVWSUNFX0lEX0FNRF8xMUhfTkJfTUlTQywKIAkJLm9wcyA9IHsKLQkJCS5wcm9iZV92YWxpZF9oYXJkd2FyZSA9IGYxMF9wcm9iZV92YWxpZF9oYXJkd2FyZSwKLQkJCS5lYXJseV9jaGFubmVsX2NvdW50ID0gZjEwX2Vhcmx5X2NoYW5uZWxfY291bnQsCi0JCQkuZ2V0X2Vycm9yX2FkZHJlc3MgPSBmMTBfZ2V0X2Vycm9yX2FkZHJlc3MsCi0JCQkucmVhZF9kcmFtX2Jhc2VfbGltaXQgPSBmMTBfcmVhZF9kcmFtX2Jhc2VfbGltaXQsCi0JCQkucmVhZF9kcmFtX2N0bF9yZWdpc3RlciA9IGYxMF9yZWFkX2RyYW1fY3RsX3JlZ2lzdGVyLAotCQkJLm1hcF9zeXNhZGRyX3RvX2Nzcm93ID0gZjEwX21hcF9zeXNhZGRyX3RvX2Nzcm93LAotCQkJLmRiYW1fbWFwX3RvX3BhZ2VzID0gZjEwX2RiYW1fbWFwX3RvX3BhZ2VzLAorCQkJLmVhcmx5X2NoYW5uZWxfY291bnQJPSBmMTBfZWFybHlfY2hhbm5lbF9jb3VudCwKKwkJCS5nZXRfZXJyb3JfYWRkcmVzcwk9IGYxMF9nZXRfZXJyb3JfYWRkcmVzcywKKwkJCS5yZWFkX2RyYW1fYmFzZV9saW1pdAk9IGYxMF9yZWFkX2RyYW1fYmFzZV9saW1pdCwKKwkJCS5yZWFkX2RyYW1fY3RsX3JlZ2lzdGVyCT0gZjEwX3JlYWRfZHJhbV9jdGxfcmVnaXN0ZXIsCisJCQkubWFwX3N5c2FkZHJfdG9fY3Nyb3cJPSBmMTBfbWFwX3N5c2FkZHJfdG9fY3Nyb3csCisJCQkuZGJhbV90b19jcwkJPSBmMTBfZGJhbV90b19jaGlwX3NlbGVjdCwKIAkJfQogCX0sCiB9OwpAQCAtMTkyMywxNDIgKzE4MDQsMTcwIEBACiB9CiAKIC8qCi0gKiBzeW5kcm9tZSBtYXBwaW5nIHRhYmxlIGZvciBFQ0MgQ2hpcEtpbGwgZGV2aWNlcworICogVGhlc2UgYXJlIHRhYmxlcyBvZiBlaWdlbnZlY3RvcnMgKG9uZSBwZXIgbGluZSkgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRoZQorICogY29uc3RydWN0aW9uIG9mIHRoZSBzeW5kcm9tZSB0YWJsZXMuIFRoZSBtb2RpZmllZCBzeW5kcm9tZSBzZWFyY2ggYWxnb3JpdGhtCisgKiB1c2VzIHRob3NlIHRvIGZpbmQgdGhlIHN5bWJvbCBpbiBlcnJvciBhbmQgdGh1cyB0aGUgRElNTS4KICAqCi0gKiBUaGUgY29tbWVudCBpbiBlYWNoIHJvdyBpcyB0aGUgdG9rZW4gKG5pYmJsZSkgbnVtYmVyIHRoYXQgaXMgaW4gZXJyb3IuCi0gKiBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgbmliYmxlIG9mIHRoZSBzeW5kcm9tZSBpcyB0aGUgbWFzayBmb3IgdGhlIGJpdHMKLSAqIHRoYXQgYXJlIGluIGVycm9yIChuZWVkIHRvIGJlIHRvZ2dsZWQpIGZvciB0aGUgcGFydGljdWxhciBuaWJibGUuCi0gKgotICogRWFjaCByb3cgY29udGFpbnMgMTYgZW50cmllcy4KLSAqIFRoZSBmaXJzdCBlbnRyeSAoMHRoKSBpcyB0aGUgY2hhbm5lbCBudW1iZXIgZm9yIHRoYXQgcm93IG9mIHN5bmRyb21lcy4KLSAqIFRoZSByZW1haW5pbmcgMTUgZW50cmllcyBhcmUgdGhlIHN5bmRyb21lcyBmb3IgdGhlIHJlc3BlY3RpdmUgRXJyb3IKLSAqIGJpdCBtYXNrIGluZGV4LgotICoKLSAqIDFzdCBpbmRleCBlbnRyeSBpcyAweDAwMDEgbWFzaywgaW5kaWNhdGluZyB0aGF0IHRoZSByaWdodG1vc3QgYml0IGlzIHRoZQotICogYml0IGluIGVycm9yLgotICogVGhlIDJuZCBpbmRleCBlbnRyeSBpcyAweDAwMTAgdGhhdCB0aGUgc2Vjb25kIGJpdCBpcyBkYW1hZ2VkLgotICogVGhlIDNyZCBpbmRleCBlbnRyeSBpcyAweDAwMTEgaW5kaWNhdGluZyB0aGF0IHRoZSByaWdodG1vc3QgMiBiaXRzCi0gKiBhcmUgZGFtYWdlZC4KLSAqIFRodXMgc28gb24gdW50aWwgaW5kZXggMTUsIDB4MTExMSwgd2hvc2UgZW50cnkgaGFzIHRoZSBzeW5kcm9tZQotICogaW5kaWNhdGluZyB0aGF0IGFsbCA0IGJpdHMgYXJlIGRhbWFnZWQuCi0gKgotICogQSBzZWFyY2ggaXMgcGVyZm9ybWVkIG9uIHRoaXMgdGFibGUgbG9va2luZyBmb3IgYSBnaXZlbiBzeW5kcm9tZS4KLSAqCi0gKiBTZWUgdGhlIEFNRCBkb2N1bWVudGF0aW9uIGZvciBFQ0Mgc3luZHJvbWVzLiBUaGlzIEVDQyB0YWJsZSBpcyB2YWxpZAotICogYWNyb3NzIGFsbCB0aGUgdmVyc2lvbnMgb2YgdGhlIEFNRDY0IHByb2Nlc3NvcnMuCi0gKgotICogQSBmYXN0IGxvb2t1cCBpcyB0byB1c2UgdGhlIExBU1QgZm91ciBiaXRzIG9mIHRoZSAxNi1iaXQgc3luZHJvbWUgYXMgYQotICogQ09MVU1OIGluZGV4LCB0aGVuIHNlYXJjaCBhbGwgUk9XUyBvZiB0aGF0IGNvbHVtbiwgbG9va2luZyBmb3IgYSBtYXRjaAotICogd2l0aCB0aGUgaW5wdXQgc3luZHJvbWUuIFRoZSBST1cgdmFsdWUgd2lsbCBiZSB0aGUgdG9rZW4gbnVtYmVyLgotICoKLSAqIFRoZSAwJ3RoIGVudHJ5IG9uIHRoYXQgcm93LCBjYW4gYmUgcmV0dXJuZWQgYXMgdGhlIENIQU5ORUwgKDAgb3IgMSkgb2YgdGhpcwotICogZXJyb3IuCisgKiBBbGdvcml0aG0gY291cnRlc3kgb2YgUm9zcyBMYUZldHJhIGZyb20gQU1ELgogICovCi0jZGVmaW5lIE5VTUJFUl9FQ0NfUk9XUyAgMzYKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBlY2NfY2hpcGtpbGxfc3luZHJvbWVzW05VTUJFUl9FQ0NfUk9XU11bMTZdID0gewotCS8qIENoYW5uZWwgMCBzeW5kcm9tZXMgKi8KLQl7LyowKi8gIDAsIDB4ZTgyMSwgMHg3YzMyLCAweDk0MTMsIDB4YmI0NCwgMHg1MzY1LCAweGM3NzYsIDB4MmY1NywKLQkgICAweGRkODgsIDB4MzVhOSwgMHhhMWJhLCAweDQ5OWIsIDB4NjZjYywgMHg4ZWVkLCAweDFhZmUsIDB4ZjJkZiB9LAotCXsvKjEqLyAgMCwgMHg1ZDMxLCAweGE2MTIsIDB4ZmIyMywgMHg5NTg0LCAweGM4YjUsIDB4MzM5NiwgMHg2ZWE3LAotCSAgIDB4ZWFjOCwgMHhiN2Y5LCAweDRjZGEsIDB4MTFlYiwgMHg3ZjRjLCAweDIyN2QsIDB4ZDk1ZSwgMHg4NDZmIH0sCi0Jey8qMiovICAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLCAweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCi0JICAgMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLCAweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYgfSwKLQl7LyozKi8gIDAsIDB4MjAyMSwgMHgzMDMyLCAweDEwMTMsIDB4NDA0NCwgMHg2MDY1LCAweDcwNzYsIDB4NTA1NywKLQkgICAweDgwODgsIDB4YTBhOSwgMHhiMGJhLCAweDkwOWIsIDB4YzBjYywgMHhlMGVkLCAweGYwZmUsIDB4ZDBkZiB9LAotCXsvKjQqLyAgMCwgMHg1MDQxLCAweGEwODIsIDB4ZjBjMywgMHg5MDU0LCAweGMwMTUsIDB4MzBkNiwgMHg2MDk3LAotCSAgIDB4ZTBhOCwgMHhiMGU5LCAweDQwMmEsIDB4MTA2YiwgMHg3MGZjLCAweDIwYmQsIDB4ZDA3ZSwgMHg4MDNmIH0sCi0Jey8qNSovICAwLCAweGJlMjEsIDB4ZDczMiwgMHg2OTEzLCAweDIxNDQsIDB4OWY2NSwgMHhmNjc2LCAweDQ4NTcsCi0JICAgMHgzMjg4LCAweDhjYTksIDB4ZTViYSwgMHg1YjliLCAweDEzY2MsIDB4YWRlZCwgMHhjNGZlLCAweDdhZGYgfSwKLQl7Lyo2Ki8gIDAsIDB4NDk1MSwgMHg4ZWEyLCAweGM3ZjMsIDB4NTM5NCwgMHgxYWM1LCAweGRkMzYsIDB4OTQ2NywKLQkgICAweGExZTgsIDB4ZThiOSwgMHgyZjRhLCAweDY2MWIsIDB4ZjI3YywgMHhiYjJkLCAweDdjZGUsIDB4MzU4ZiB9LAotCXsvKjcqLyAgMCwgMHg3NGUxLCAweDk4NzIsIDB4ZWM5MywgMHhkNmI0LCAweGEyNTUsIDB4NGVjNiwgMHgzYTI3LAotCSAgIDB4NmJkOCwgMHgxZjM5LCAweGYzYWEsIDB4ODc0YiwgMHhiZDZjLCAweGM5OGQsIDB4MjUxZSwgMHg1MWZmIH0sCi0Jey8qOCovICAwLCAweDE1YzEsIDB4MmE0MiwgMHgzZjgzLCAweGNlZjQsIDB4ZGIzNSwgMHhlNGI2LCAweGYxNzcsCi0JICAgMHg0NzU4LCAweDUyOTksIDB4NmQxYSwgMHg3OGRiLCAweDg5YWMsIDB4OWM2ZCwgMHhhM2VlLCAweGI2MmYgfSwKLQl7Lyo5Ki8gIDAsIDB4M2QwMSwgMHgxNjAyLCAweDJiMDMsIDB4ODUwNCwgMHhiODA1LCAweDkzMDYsIDB4YWUwNywKLQkgICAweGNhMDgsIDB4ZjcwOSwgMHhkYzBhLCAweGUxMGIsIDB4NGYwYywgMHg3MjBkLCAweDU5MGUsIDB4NjQwZiB9LAotCXsvKmEqLyAgMCwgMHg5ODAxLCAweGVjMDIsIDB4NzQwMywgMHg2YjA0LCAweGYzMDUsIDB4ODcwNiwgMHgxZjA3LAotCSAgIDB4YmQwOCwgMHgyNTA5LCAweDUxMGEsIDB4YzkwYiwgMHhkNjBjLCAweDRlMGQsIDB4M2EwZSwgMHhhMjBmIH0sCi0Jey8qYiovICAwLCAweGQxMzEsIDB4NjIxMiwgMHhiMzIzLCAweDM4ODQsIDB4ZTliNSwgMHg1YTk2LCAweDhiYTcsCi0JICAgMHgxY2M4LCAweGNkZjksIDB4N2VkYSwgMHhhZmViLCAweDI0NGMsIDB4ZjU3ZCwgMHg0NjVlLCAweDk3NmYgfSwKLQl7LypjKi8gIDAsIDB4ZTFkMSwgMHg3MjYyLCAweDkzYjMsIDB4YjgzNCwgMHg1OWU1LCAweGNhNTYsIDB4MmI4NywKLQkgICAweGRjMTgsIDB4M2RjOSwgMHhhZTdhLCAweDRmYWIsIDB4NTQyYywgMHg4NWZkLCAweDE2NGUsIDB4Zjc5ZiB9LAotCXsvKmQqLyAgMCwgMHg2MDUxLCAweGIwYTIsIDB4ZDBmMywgMHgxMDk0LCAweDcwYzUsIDB4YTAzNiwgMHhjMDY3LAotCSAgIDB4MjBlOCwgMHg0MGI5LCAweDkwNGEsIDB4NjAxYiwgMHgzMDdjLCAweDUwMmQsIDB4ODBkZSwgMHhlMDhmIH0sCi0Jey8qZSovICAwLCAweGE0YzEsIDB4Zjg0MiwgMHg1YzgzLCAweGU2ZjQsIDB4NDIzNSwgMHgxZWI2LCAweGJhNzcsCi0JICAgMHg3YjU4LCAweGRmOTksIDB4ODMxYSwgMHgyN2RiLCAweDlkYWMsIDB4Mzk2ZCwgMHg2NWVlLCAweGMxMmYgfSwKLQl7LypmKi8gIDAsIDB4MTFjMSwgMHgyMjQyLCAweDMzODMsIDB4YzhmNCwgMHhkOTM1LCAweGVhYjYsIDB4ZmI3NywKLQkgICAweDRjNTgsIDB4NWQ5OSwgMHg2ZTFhLCAweDdmZGIsIDB4ODRhYywgMHg5NTZkLCAweGE2ZWUsIDB4YjcyZiB9LAotCi0JLyogQ2hhbm5lbCAxIHN5bmRyb21lcyAqLwotCXsvKjEwKi8gMSwgMHg0NWQxLCAweDhhNjIsIDB4Y2ZiMywgMHg1ZTM0LCAweDFiZTUsIDB4ZDQ1NiwgMHg5MTg3LAotCSAgIDB4YTcxOCwgMHhlMmM5LCAweDJkN2EsIDB4NjhhYiwgMHhmOTJjLCAweGJjZmQsIDB4NzM0ZSwgMHgzNjlmIH0sCi0Jey8qMTEqLyAxLCAweDYzZTEsIDB4YjE3MiwgMHhkMjkzLCAweDE0YjQsIDB4Nzc1NSwgMHhhNWM2LCAweGM2MjcsCi0JICAgMHgyOGQ4LCAweDRiMzksIDB4OTlhYSwgMHhmYTRiLCAweDNjNmMsIDB4NWY4ZCwgMHg4ZDFlLCAweGVlZmYgfSwKLQl7LyoxMiovIDEsIDB4Yjc0MSwgMHhkOTgyLCAweDZlYzMsIDB4MjI1NCwgMHg5NTE1LCAweGZiZDYsIDB4NGM5NywKLQkgICAweDMzYTgsIDB4ODRlOSwgMHhlYTJhLCAweDVkNmIsIDB4MTFmYywgMHhhNmJkLCAweGM4N2UsIDB4N2YzZiB9LAotCXsvKjEzKi8gMSwgMHhkZDQxLCAweDY2ODIsIDB4YmJjMywgMHgzNTU0LCAweGU4MTUsIDB4NTNkNiwgMHhjZTk3LAotCSAgIDB4MWFhOCwgMHhjN2U5LCAweDdjMmEsIDB4YTFmYiwgMHgyZmZjLCAweGYyYmQsIDB4NDk3ZSwgMHg5NDNmIH0sCi0Jey8qMTQqLyAxLCAweDJiZDEsIDB4M2Q2MiwgMHgxNmIzLCAweDRmMzQsIDB4NjRlNSwgMHg3MjU2LCAweDU5ODcsCi0JICAgMHg4NTE4LCAweGFlYzksIDB4Yjg3YSwgMHg5M2FiLCAweGNhMmMsIDB4ZTFmZCwgMHhmNzRlLCAweGRjOWYgfSwKLQl7LyoxNSovIDEsIDB4ODNjMSwgMHhjMTQyLCAweDQyODMsIDB4YTRmNCwgMHgyNzM1LCAweDY1YjYsIDB4ZTY3NywKLQkgICAweGY4NTgsIDB4N2I5OSwgMHgzOTFhLCAweGJhZGIsIDB4NWNhYywgMHhkZjZkLCAweDlkZWUsIDB4MWUyZiB9LAotCXsvKjE2Ki8gMSwgMHg4ZmQxLCAweGM1NjIsIDB4NGFiMywgMHhhOTM0LCAweDI2ZTUsIDB4NmM1NiwgMHhlMzg3LAotCSAgIDB4ZmUxOCwgMHg3MWM5LCAweDNiN2EsIDB4YjRhYiwgMHg1NzJjLCAweGQ4ZmQsIDB4OTI0ZSwgMHgxZDlmIH0sCi0Jey8qMTcqLyAxLCAweDQ3OTEsIDB4ODllMiwgMHhjZTczLCAweDUyNjQsIDB4MTVmNSwgMHhkYjg2LCAweDljMTcsCi0JICAgMHhhM2I4LCAweGU0MjksIDB4MmE1YSwgMHg2ZGNiLCAweGYxZGMsIDB4YjY0ZCwgMHg3ODNlLCAweDNmYWYgfSwKLQl7LyoxOCovIDEsIDB4NTc4MSwgMHhhOWMyLCAweGZlNDMsIDB4OTJhNCwgMHhjNTI1LCAweDNiNjYsIDB4NmNlNywKLQkgICAweGUzZjgsIDB4YjQ3OSwgMHg0YTNhLCAweDFkYmIsIDB4NzE1YywgMHgyNmRkLCAweGQ4OWUsIDB4OGYxZiB9LAotCXsvKjE5Ki8gMSwgMHhiZjQxLCAweGQ1ODIsIDB4NmFjMywgMHgyOTU0LCAweDk2MTUsIDB4ZmNkNiwgMHg0Mzk3LAotCSAgIDB4M2VhOCwgMHg4MWU5LCAweGViMmEsIDB4NTQ2YiwgMHgxN2ZjLCAweGE4YmQsIDB4YzI3ZSwgMHg3ZDNmIH0sCi0Jey8qMWEqLyAxLCAweDk4OTEsIDB4ZTFlMiwgMHg3MjczLCAweDY0NjQsIDB4ZjdmNSwgMHg4NTg2LCAweDE2MTcsCi0JICAgMHhiOGI4LCAweDJiMjksIDB4NTk1YSwgMHhjYWNiLCAweGRjZGMsIDB4NGY0ZCwgMHgzZDNlLCAweGFlYWYgfSwKLQl7LyoxYiovIDEsIDB4Y2NlMSwgMHg0NDcyLCAweDg4OTMsIDB4ZmRiNCwgMHgzZjU1LCAweGI5YzYsIDB4NzUyNywKLQkgICAweDU2ZDgsIDB4OWEzOSwgMHgxMmFhLCAweGRlNGIsIDB4YWI2YywgMHg2NzhkLCAweGVmMWUsIDB4MjNmZiB9LAotCXsvKjFjKi8gMSwgMHhhNzYxLCAweGY5YjIsIDB4NWVkMywgMHhlMjE0LCAweDQ1NzUsIDB4MWJhNiwgMHhiY2M3LAotCSAgIDB4NzMyOCwgMHhkNDQ5LCAweDhhOWEsIDB4MmRmYiwgMHg5MTNjLCAweDM2NWQsIDB4Njg4ZSwgMHhjZmVmIH0sCi0Jey8qMWQqLyAxLCAweGZmNjEsIDB4NTViMiwgMHhhYWQzLCAweDc5MTQsIDB4ODY3NSwgMHgyY2E2LCAweGQzYzcsCi0JICAgMHg5ZTI4LCAweDYxNDksIDB4Y2I5YSwgMHgzNGZiLCAweGU3M2MsIDB4MTg1ZCwgMHhiMjhlLCAweDRkZWYgfSwKLQl7LyoxZSovIDEsIDB4NTQ1MSwgMHhhOGEyLCAweGZjZjMsIDB4OTY5NCwgMHhjMmM1LCAweDNlMzYsIDB4NmE2NywKLQkgICAweGViZTgsIDB4YmZiOSwgMHg0MzRhLCAweDE3MWIsIDB4N2Q3YywgMHgyOTJkLCAweGQ1ZGUsIDB4ODE4ZiB9LAotCXsvKjFmKi8gMSwgMHg2ZmMxLCAweGI1NDIsIDB4ZGE4MywgMHgxOWY0LCAweDc2MzUsIDB4YWNiNiwgMHhjMzc3LAotCSAgIDB4MmU1OCwgMHg0MTk5LCAweDliMWEsIDB4ZjRkYiwgMHgzN2FjLCAweDU4NmQsIDB4ODJlZSwgMHhlZDJmIH0sCi0KLQkvKiBFQ0MgYml0cyBhcmUgYWxzbyBpbiB0aGUgc2V0IG9mIHRva2VucyBhbmQgdGhleSB0b28gY2FuIGdvIGJhZAotCSAqIGZpcnN0IDIgY292ZXIgY2hhbm5lbCAwLCB3aGlsZSB0aGUgc2Vjb25kIDIgY292ZXIgY2hhbm5lbCAxCi0JICovCi0Jey8qMjAqLyAwLCAweGJlMDEsIDB4ZDcwMiwgMHg2OTAzLCAweDIxMDQsIDB4OWYwNSwgMHhmNjA2LCAweDQ4MDcsCi0JICAgMHgzMjA4LCAweDhjMDksIDB4ZTUwYSwgMHg1YjBiLCAweDEzMGMsIDB4YWQwZCwgMHhjNDBlLCAweDdhMGYgfSwKLQl7LyoyMSovIDAsIDB4NDEwMSwgMHg4MjAyLCAweGMzMDMsIDB4NTgwNCwgMHgxOTA1LCAweGRhMDYsIDB4OWIwNywKLQkgICAweGFjMDgsIDB4ZWQwOSwgMHgyZTBhLCAweDZmMGIsIDB4NjQwYywgMHhiNTBkLCAweDc2MGUsIDB4MzcwZiB9LAotCXsvKjIyKi8gMSwgMHhjNDQxLCAweDQ4ODIsIDB4OGNjMywgMHhmNjU0LCAweDMyMTUsIDB4YmVkNiwgMHg3YTk3LAotCSAgIDB4NWJhOCwgMHg5ZmU5LCAweDEzMmEsIDB4ZDc2YiwgMHhhZGZjLCAweDY5YmQsIDB4ZTU3ZSwgMHgyMTNmIH0sCi0Jey8qMjMqLyAxLCAweDc2MjEsIDB4OWIzMiwgMHhlZDEzLCAweGRhNDQsIDB4YWM2NSwgMHg0MTc2LCAweDM3NTcsCi0JICAgMHg2Zjg4LCAweDE5YTksIDB4ZjRiYSwgMHg4MjliLCAweGI1Y2MsIDB4YzNlZCwgMHgyZWZlLCAweDU4ZGYgfQorc3RhdGljIHUxNiB4NF92ZWN0b3JzW10gPSB7CisJMHgyZjU3LCAweDFhZmUsIDB4NjZjYywgMHhkZDg4LAorCTB4MTFlYiwgMHgzMzk2LCAweDdmNGMsIDB4ZWFjOCwKKwkweDAwMDEsIDB4MDAwMiwgMHgwMDA0LCAweDAwMDgsCisJMHgxMDEzLCAweDMwMzIsIDB4NDA0NCwgMHg4MDg4LAorCTB4MTA2YiwgMHgzMGQ2LCAweDcwZmMsIDB4ZTBhOCwKKwkweDQ4NTcsIDB4YzRmZSwgMHgxM2NjLCAweDMyODgsCisJMHgxYWM1LCAweDJmNGEsIDB4NTM5NCwgMHhhMWU4LAorCTB4MWYzOSwgMHgyNTFlLCAweGJkNmMsIDB4NmJkOCwKKwkweDE1YzEsIDB4MmE0MiwgMHg4OWFjLCAweDQ3NTgsCisJMHgyYjAzLCAweDE2MDIsIDB4NGYwYywgMHhjYTA4LAorCTB4MWYwNywgMHgzYTBlLCAweDZiMDQsIDB4YmQwOCwKKwkweDhiYTcsIDB4NDY1ZSwgMHgyNDRjLCAweDFjYzgsCisJMHgyYjg3LCAweDE2NGUsIDB4NjQyYywgMHhkYzE4LAorCTB4NDBiOSwgMHg4MGRlLCAweDEwOTQsIDB4MjBlOCwKKwkweDI3ZGIsIDB4MWViNiwgMHg5ZGFjLCAweDdiNTgsCisJMHgxMWMxLCAweDIyNDIsIDB4ODRhYywgMHg0YzU4LAorCTB4MWJlNSwgMHgyZDdhLCAweDVlMzQsIDB4YTcxOCwKKwkweDRiMzksIDB4OGQxZSwgMHgxNGI0LCAweDI4ZDgsCisJMHg0Yzk3LCAweGM4N2UsIDB4MTFmYywgMHgzM2E4LAorCTB4OGU5NywgMHg0OTdlLCAweDJmZmMsIDB4MWFhOCwKKwkweDE2YjMsIDB4M2Q2MiwgMHg0ZjM0LCAweDg1MTgsCisJMHgxZTJmLCAweDM5MWEsIDB4NWNhYywgMHhmODU4LAorCTB4MWQ5ZiwgMHgzYjdhLCAweDU3MmMsIDB4ZmUxOCwKKwkweDE1ZjUsIDB4MmE1YSwgMHg1MjY0LCAweGEzYjgsCisJMHgxZGJiLCAweDNiNjYsIDB4NzE1YywgMHhlM2Y4LAorCTB4NDM5NywgMHhjMjdlLCAweDE3ZmMsIDB4M2VhOCwKKwkweDE2MTcsIDB4M2QzZSwgMHg2NDY0LCAweGI4YjgsCisJMHgyM2ZmLCAweDEyYWEsIDB4YWI2YywgMHg1NmQ4LAorCTB4MmRmYiwgMHgxYmE2LCAweDkxM2MsIDB4NzMyOCwKKwkweDE4NWQsIDB4MmNhNiwgMHg3OTE0LCAweDllMjgsCisJMHgxNzFiLCAweDNlMzYsIDB4N2Q3YywgMHhlYmU4LAorCTB4NDE5OSwgMHg4MmVlLCAweDE5ZjQsIDB4MmU1OCwKKwkweDQ4MDcsIDB4YzQwZSwgMHgxMzBjLCAweDMyMDgsCisJMHgxOTA1LCAweDJlMGEsIDB4NTgwNCwgMHhhYzA4LAorCTB4MjEzZiwgMHgxMzJhLCAweGFkZmMsIDB4NWJhOCwKKwkweDE5YTksIDB4MmVmZSwgMHhiNWNjLCAweDZmODgsCiB9OwogCi0vKgotICogR2l2ZW4gdGhlIHN5bmRyb21lIGFyZ3VtZW50LCBzY2FuIGVhY2ggb2YgdGhlIGNoYW5uZWwgdGFibGVzIGZvciBhIHN5bmRyb21lCi0gKiBtYXRjaC4gRGVwZW5kaW5nIG9uIHdoaWNoIHRhYmxlIGl0IGlzIGZvdW5kLCByZXR1cm4gdGhlIGNoYW5uZWwgbnVtYmVyLgotICovCi1zdGF0aWMgaW50IGdldF9jaGFubmVsX2Zyb21fZWNjX3N5bmRyb21lKHVuc2lnbmVkIHNob3J0IHN5bmRyb21lKQorc3RhdGljIHUxNiB4OF92ZWN0b3JzW10gPSB7CisJMHgwMTQ1LCAweDAyOGEsIDB4MjM3NCwgMHg0M2M4LCAweGExZjAsIDB4MDUyMCwgMHgwYTQwLCAweDE0ODAsCisJMHgwMjExLCAweDA0MjIsIDB4MDg0NCwgMHgxMDg4LCAweDAxYjAsIDB4NDRlMCwgMHgyM2MwLCAweGVkODAsCisJMHgxMDExLCAweDAxMTYsIDB4MDIyYywgMHgwNDU4LCAweDA4YjAsIDB4OGM2MCwgMHgyNzQwLCAweDRlODAsCisJMHgwNDExLCAweDA4MjIsIDB4MTA0NCwgMHgwMTU4LCAweDAyYjAsIDB4MjM2MCwgMHg0NmMwLCAweGFiODAsCisJMHgwODExLCAweDEwMjIsIDB4MDEyYywgMHgwMjU4LCAweDA0YjAsIDB4NDY2MCwgMHg4Y2MwLCAweDI3ODAsCisJMHgyMDcxLCAweDQwZTIsIDB4YTBjNCwgMHgwMTA4LCAweDAyMTAsIDB4MDQyMCwgMHgwODQwLCAweDEwODAsCisJMHg0MDcxLCAweDgwZTIsIDB4MDEwNCwgMHgwMjA4LCAweDA0MTAsIDB4MDgyMCwgMHgxMDQwLCAweDIwODAsCisJMHg4MDcxLCAweDAxMDIsIDB4MDIwNCwgMHgwNDA4LCAweDA4MTAsIDB4MTAyMCwgMHgyMDQwLCAweDQwODAsCisJMHgwMTlkLCAweDAzZDYsIDB4MTM2YywgMHgyMTk4LCAweDUwYjAsIDB4YjJlMCwgMHgwNzQwLCAweDBlODAsCisJMHgwMTg5LCAweDAzZWEsIDB4MDcyYywgMHgwZTU4LCAweDFjYjAsIDB4NTZlMCwgMHgzN2MwLCAweGY1ODAsCisJMHgwMWZkLCAweDAzNzYsIDB4MDZlYywgMHgwYmI4LCAweDExMTAsIDB4MjIyMCwgMHg0NDQwLCAweDg4ODAsCisJMHgwMTYzLCAweDAyYzYsIDB4MTEwNCwgMHgwNzU4LCAweDBlYjAsIDB4MmJlMCwgMHg2MTQwLCAweGMyODAsCisJMHgwMmZkLCAweDAxYzYsIDB4MGI1YywgMHgxMTA4LCAweDA3YjAsIDB4MjVhMCwgMHg4ODQwLCAweDYxODAsCisJMHgwODAxLCAweDAxMmUsIDB4MDI1YywgMHgwNGI4LCAweDEzNzAsIDB4MjZlMCwgMHg1N2MwLCAweGI1ODAsCisJMHgwNDAxLCAweDA4MDIsIDB4MDE1YywgMHgwMmI4LCAweDIyYjAsIDB4MTNlMCwgMHg3MTQwLCAweGUyODAsCisJMHgwMjAxLCAweDA0MDIsIDB4MDgwNCwgMHgwMWI4LCAweDExYjAsIDB4MzFhMCwgMHg4MDQwLCAweDcxODAsCisJMHgwMTAxLCAweDAyMDIsIDB4MDQwNCwgMHgwODA4LCAweDEwMTAsIDB4MjAyMCwgMHg0MDQwLCAweDgwODAsCisJMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsCisJMHgwMTAwLCAweDAyMDAsIDB4MDQwMCwgMHgwODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwLCAweDgwMDAsCit9OworCitzdGF0aWMgaW50IGRlY29kZV9zeW5kcm9tZSh1MTYgc3luZHJvbWUsIHUxNiAqdmVjdG9ycywgaW50IG51bV92ZWNzLAorCQkJCSBpbnQgdl9kaW0pCiB7Ci0JaW50IHJvdzsKLQlpbnQgY29sdW1uOworCXVuc2lnbmVkIGludCBpLCBlcnJfc3ltOwogCi0JLyogRGV0ZXJtaW5lIGNvbHVtbiB0byBzY2FuICovCi0JY29sdW1uID0gc3luZHJvbWUgJiAweEY7CisJZm9yIChlcnJfc3ltID0gMDsgZXJyX3N5bSA8IG51bV92ZWNzIC8gdl9kaW07IGVycl9zeW0rKykgeworCQl1MTYgcyA9IHN5bmRyb21lOworCQlpbnQgdl9pZHggPSAgZXJyX3N5bSAqIHZfZGltOworCQlpbnQgdl9lbmQgPSAoZXJyX3N5bSArIDEpICogdl9kaW07CiAKLQkvKiBTY2FuIGFsbCByb3dzLCBsb29raW5nIGZvciBzeW5kcm9tZSwgb3IgZW5kIG9mIHRhYmxlICovCi0JZm9yIChyb3cgPSAwOyByb3cgPCBOVU1CRVJfRUNDX1JPV1M7IHJvdysrKSB7Ci0JCWlmIChlY2NfY2hpcGtpbGxfc3luZHJvbWVzW3Jvd11bY29sdW1uXSA9PSBzeW5kcm9tZSkKLQkJCXJldHVybiBlY2NfY2hpcGtpbGxfc3luZHJvbWVzW3Jvd11bMF07CisJCS8qIHdhbGsgb3ZlciBhbGwgMTYgYml0cyBvZiB0aGUgc3luZHJvbWUgKi8KKwkJZm9yIChpID0gMTsgaSA8ICgxVSA8PCAxNik7IGkgPDw9IDEpIHsKKworCQkJLyogaWYgYml0IGlzIHNldCBpbiB0aGF0IGVpZ2VudmVjdG9yLi4uICovCisJCQlpZiAodl9pZHggPCB2X2VuZCAmJiB2ZWN0b3JzW3ZfaWR4XSAmIGkpIHsKKwkJCQl1MTYgZXZfY29tcCA9IHZlY3RvcnNbdl9pZHgrK107CisKKwkJCQkvKiAuLi4gYW5kIGJpdCBzZXQgaW4gdGhlIG1vZGlmaWVkIHN5bmRyb21lLCAqLworCQkJCWlmIChzICYgaSkgeworCQkJCQkvKiByZW1vdmUgaXQuICovCisJCQkJCXMgXj0gZXZfY29tcDsKKworCQkJCQlpZiAoIXMpCisJCQkJCQlyZXR1cm4gZXJyX3N5bTsKKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAocyAmIGkpCisJCQkJLyogY2FuJ3QgZ2V0IHRvIHplcm8sIG1vdmUgdG8gbmV4dCBzeW1ib2wgKi8KKwkJCQlicmVhazsKKwkJfQogCX0KIAogCWRlYnVnZjAoInN5bmRyb21lKCV4KSBub3QgZm91bmRcbiIsIHN5bmRyb21lKTsKIAlyZXR1cm4gLTE7CiB9CiAKK3N0YXRpYyBpbnQgbWFwX2Vycl9zeW1fdG9fY2hhbm5lbChpbnQgZXJyX3N5bSwgaW50IHN5bV9zaXplKQoreworCWlmIChzeW1fc2l6ZSA9PSA0KQorCQlzd2l0Y2ggKGVycl9zeW0pIHsKKwkJY2FzZSAweDIwOgorCQljYXNlIDB4MjE6CisJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCQljYXNlIDB4MjI6CisJCWNhc2UgMHgyMzoKKwkJCXJldHVybiAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gZXJyX3N5bSA+PiA0OworCQkJYnJlYWs7CisJCX0KKwkvKiB4OCBzeW1ib2xzICovCisJZWxzZQorCQlzd2l0Y2ggKGVycl9zeW0pIHsKKwkJLyogaW1hZ2luYXJ5IGJpdHMgbm90IGluIGEgRElNTSAqLworCQljYXNlIDB4MTA6CisJCQlXQVJOKDEsIEtFUk5fRVJSICJJbnZhbGlkIGVycm9yIHN5bWJvbDogMHgleFxuIiwKKwkJCQkJICBlcnJfc3ltKTsKKwkJCXJldHVybiAtMTsKKwkJCWJyZWFrOworCisJCWNhc2UgMHgxMToKKwkJCXJldHVybiAwOworCQkJYnJlYWs7CisJCWNhc2UgMHgxMjoKKwkJCXJldHVybiAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gZXJyX3N5bSA+PiAzOworCQkJYnJlYWs7CisJCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2NoYW5uZWxfZnJvbV9lY2Nfc3luZHJvbWUoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCB1MTYgc3luZHJvbWUpCit7CisJc3RydWN0IGFtZDY0X3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwl1MzIgdmFsdWUgPSAwOworCWludCBlcnJfc3ltID0gMDsKKworCWFtZDY0X3JlYWRfcGNpX2NmZyhwdnQtPm1pc2NfZjNfY3RsLCAweDE4MCwgJnZhbHVlKTsKKworCS8qIEYzeDE4MFtFY2NTeW1ib2xTaXplXT0xLCB4OCBzeW1ib2xzICovCisJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDB4MTAgJiYKKwkgICAgYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPiA3ICYmCisJICAgIHZhbHVlICYgQklUKDI1KSkgeworCQllcnJfc3ltID0gZGVjb2RlX3N5bmRyb21lKHN5bmRyb21lLCB4OF92ZWN0b3JzLAorCQkJCQkgIEFSUkFZX1NJWkUoeDhfdmVjdG9ycyksIDgpOworCQlyZXR1cm4gbWFwX2Vycl9zeW1fdG9fY2hhbm5lbChlcnJfc3ltLCA4KTsKKwl9IGVsc2UgeworCQllcnJfc3ltID0gZGVjb2RlX3N5bmRyb21lKHN5bmRyb21lLCB4NF92ZWN0b3JzLAorCQkJCQkgIEFSUkFZX1NJWkUoeDRfdmVjdG9ycyksIDQpOworCQlyZXR1cm4gbWFwX2Vycl9zeW1fdG9fY2hhbm5lbChlcnJfc3ltLCA0KTsKKwl9Cit9CisKIC8qCiAgKiBDaGVjayBmb3IgdmFsaWQgZXJyb3IgaW4gdGhlIE5CIFN0YXR1cyBIaWdoIHJlZ2lzdGVyLiBJZiBzbywgcHJvY2VlZCB0byByZWFkCiAgKiBOQiBTdGF0dXMgTG93LCBOQiBBZGRyZXNzIExvdyBhbmQgTkIgQWRkcmVzcyBIaWdoIHJlZ2lzdGVycyBhbmQgc3RvcmUgZGF0YQpAQCAtMjA3Myw0MCArMTk4MiwyNCBAQAogewogCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dDsKIAlzdHJ1Y3QgcGNpX2RldiAqbWlzY19mM19jdGw7Ci0JaW50IGVyciA9IDA7CiAKIAlwdnQgPSBtY2ktPnB2dF9pbmZvOwogCW1pc2NfZjNfY3RsID0gcHZ0LT5taXNjX2YzX2N0bDsKIAotCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChtaXNjX2YzX2N0bCwgSzhfTkJTSCwgJnJlZ3MtPm5ic2gpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3JlZzsKKwlpZiAoYW1kNjRfcmVhZF9wY2lfY2ZnKG1pc2NfZjNfY3RsLCBLOF9OQlNILCAmcmVncy0+bmJzaCkpCisJCXJldHVybiAwOwogCiAJaWYgKCEocmVncy0+bmJzaCAmIEs4X05CU0hfVkFMSURfQklUKSkKIAkJcmV0dXJuIDA7CiAKIAkvKiB2YWxpZCBlcnJvciwgcmVhZCByZW1haW5pbmcgZXJyb3IgaW5mb3JtYXRpb24gcmVnaXN0ZXJzICovCi0JZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKG1pc2NfZjNfY3RsLCBLOF9OQlNMLCAmcmVncy0+bmJzbCk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfcmVnOwotCi0JZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKG1pc2NfZjNfY3RsLCBLOF9OQkVBTCwgJnJlZ3MtPm5iZWFsKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9yZWc7Ci0KLQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQobWlzY19mM19jdGwsIEs4X05CRUFILCAmcmVncy0+bmJlYWgpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3JlZzsKLQotCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChtaXNjX2YzX2N0bCwgSzhfTkJDRkcsICZyZWdzLT5uYmNmZyk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfcmVnOworCWlmIChhbWQ2NF9yZWFkX3BjaV9jZmcobWlzY19mM19jdGwsIEs4X05CU0wsICZyZWdzLT5uYnNsKSB8fAorCSAgICBhbWQ2NF9yZWFkX3BjaV9jZmcobWlzY19mM19jdGwsIEs4X05CRUFMLCAmcmVncy0+bmJlYWwpIHx8CisJICAgIGFtZDY0X3JlYWRfcGNpX2NmZyhtaXNjX2YzX2N0bCwgSzhfTkJFQUgsICZyZWdzLT5uYmVhaCkgfHwKKwkgICAgYW1kNjRfcmVhZF9wY2lfY2ZnKG1pc2NfZjNfY3RsLCBLOF9OQkNGRywgJnJlZ3MtPm5iY2ZnKSkKKwkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gMTsKLQotZXJyX3JlZzoKLQlkZWJ1Z2YwKCJSZWFkaW5nIGVycm9yIGluZm8gcmVnaXN0ZXIgZmFpbGVkXG4iKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTIxODQsNyArMjA3Nyw3IEBACiAJCQkgICAgc3RydWN0IGVycl9yZWdzICppbmZvKQogewogCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87Ci0JdTY0IFN5c3RlbUFkZHJlc3M7CisJdTY0IHN5c19hZGRyOwogCiAJLyogRW5zdXJlIHRoYXQgdGhlIEVycm9yIEFkZHJlc3MgaXMgVkFMSUQgKi8KIAlpZiAoKGluZm8tPm5ic2ggJiBLOF9OQlNIX1ZBTElEX0VSUk9SX0FERFIpID09IDApIHsKQEAgLTIxOTQsMjIgKzIwODcsMjMgQEAKIAkJcmV0dXJuOwogCX0KIAotCVN5c3RlbUFkZHJlc3MgPSBleHRyYWN0X2Vycm9yX2FkZHJlc3MobWNpLCBpbmZvKTsKKwlzeXNfYWRkciA9IHB2dC0+b3BzLT5nZXRfZXJyb3JfYWRkcmVzcyhtY2ksIGluZm8pOwogCiAJYW1kNjRfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsCi0JCSJDRSBFUlJPUl9BRERSRVNTPSAweCVsbHhcbiIsIFN5c3RlbUFkZHJlc3MpOworCQkiQ0UgRVJST1JfQUREUkVTUz0gMHglbGx4XG4iLCBzeXNfYWRkcik7CiAKLQlwdnQtPm9wcy0+bWFwX3N5c2FkZHJfdG9fY3Nyb3cobWNpLCBpbmZvLCBTeXN0ZW1BZGRyZXNzKTsKKwlwdnQtPm9wcy0+bWFwX3N5c2FkZHJfdG9fY3Nyb3cobWNpLCBpbmZvLCBzeXNfYWRkcik7CiB9CiAKIC8qIEhhbmRsZSBhbnkgVW4tY29ycmVjdGFibGUgRXJyb3JzIChVRXMpICovCiBzdGF0aWMgdm9pZCBhbWQ2NF9oYW5kbGVfdWUoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAogCQkJICAgIHN0cnVjdCBlcnJfcmVncyAqaW5mbykKIHsKLQlpbnQgY3Nyb3c7Ci0JdTY0IFN5c3RlbUFkZHJlc3M7Ci0JdTMyIHBhZ2UsIG9mZnNldDsKKwlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOwogCXN0cnVjdCBtZW1fY3RsX2luZm8gKmxvZ19tY2ksICpzcmNfbWNpID0gTlVMTDsKKwlpbnQgY3Nyb3c7CisJdTY0IHN5c19hZGRyOworCXUzMiBwYWdlLCBvZmZzZXQ7CiAKIAlsb2dfbWNpID0gbWNpOwogCkBAIC0yMjIwLDMxICsyMTE0LDMxIEBACiAJCXJldHVybjsKIAl9CiAKLQlTeXN0ZW1BZGRyZXNzID0gZXh0cmFjdF9lcnJvcl9hZGRyZXNzKG1jaSwgaW5mbyk7CisJc3lzX2FkZHIgPSBwdnQtPm9wcy0+Z2V0X2Vycm9yX2FkZHJlc3MobWNpLCBpbmZvKTsKIAogCS8qCiAJICogRmluZCBvdXQgd2hpY2ggbm9kZSB0aGUgZXJyb3IgYWRkcmVzcyBiZWxvbmdzIHRvLiBUaGlzIG1heSBiZQogCSAqIGRpZmZlcmVudCBmcm9tIHRoZSBub2RlIHRoYXQgZGV0ZWN0ZWQgdGhlIGVycm9yLgogCSAqLwotCXNyY19tY2kgPSBmaW5kX21jX2J5X3N5c19hZGRyKG1jaSwgU3lzdGVtQWRkcmVzcyk7CisJc3JjX21jaSA9IGZpbmRfbWNfYnlfc3lzX2FkZHIobWNpLCBzeXNfYWRkcik7CiAJaWYgKCFzcmNfbWNpKSB7CiAJCWFtZDY0X21jX3ByaW50ayhtY2ksIEtFUk5fQ1JJVCwKIAkJCSJFUlJPUiBBRERSRVNTICgweCVseCkgdmFsdWUgTk9UIG1hcHBlZCB0byBhIE1DXG4iLAotCQkJKHVuc2lnbmVkIGxvbmcpU3lzdGVtQWRkcmVzcyk7CisJCQkodW5zaWduZWQgbG9uZylzeXNfYWRkcik7CiAJCWVkYWNfbWNfaGFuZGxlX3VlX25vX2luZm8obG9nX21jaSwgRURBQ19NT0RfU1RSKTsKIAkJcmV0dXJuOwogCX0KIAogCWxvZ19tY2kgPSBzcmNfbWNpOwogCi0JY3Nyb3cgPSBzeXNfYWRkcl90b19jc3Jvdyhsb2dfbWNpLCBTeXN0ZW1BZGRyZXNzKTsKKwljc3JvdyA9IHN5c19hZGRyX3RvX2Nzcm93KGxvZ19tY2ksIHN5c19hZGRyKTsKIAlpZiAoY3Nyb3cgPCAwKSB7CiAJCWFtZDY0X21jX3ByaW50ayhtY2ksIEtFUk5fQ1JJVCwKIAkJCSJFUlJPUl9BRERSRVNTICgweCVseCkgdmFsdWUgTk9UIG1hcHBlZCB0byAnY3Nyb3cnXG4iLAotCQkJKHVuc2lnbmVkIGxvbmcpU3lzdGVtQWRkcmVzcyk7CisJCQkodW5zaWduZWQgbG9uZylzeXNfYWRkcik7CiAJCWVkYWNfbWNfaGFuZGxlX3VlX25vX2luZm8obG9nX21jaSwgRURBQ19NT0RfU1RSKTsKIAl9IGVsc2UgewotCQllcnJvcl9hZGRyZXNzX3RvX3BhZ2VfYW5kX29mZnNldChTeXN0ZW1BZGRyZXNzLCAmcGFnZSwgJm9mZnNldCk7CisJCWVycm9yX2FkZHJlc3NfdG9fcGFnZV9hbmRfb2Zmc2V0KHN5c19hZGRyLCAmcGFnZSwgJm9mZnNldCk7CiAJCWVkYWNfbWNfaGFuZGxlX3VlKGxvZ19tY2ksIHBhZ2UsIG9mZnNldCwgY3Nyb3csIEVEQUNfTU9EX1NUUik7CiAJfQogfQpAQCAtMjM4NCwzMCArMjI3OCwyNiBAQAogc3RhdGljIHZvaWQgYW1kNjRfcmVhZF9tY19yZWdpc3RlcnMoc3RydWN0IGFtZDY0X3B2dCAqcHZ0KQogewogCXU2NCBtc3JfdmFsOwotCWludCBkcmFtLCBlcnIgPSAwOworCWludCBkcmFtOwogCiAJLyoKIAkgKiBSZXRyaWV2ZSBUT1BfTUVNIGFuZCBUT1BfTUVNMjsgbm8gbWFza2luZyBvZmYgb2YgcmVzZXJ2ZWQgYml0cyBzaW5jZQogCSAqIHRob3NlIGFyZSBSZWFkLUFzLVplcm8KIAkgKi8KLQlyZG1zcmwoTVNSX0s4X1RPUF9NRU0xLCBtc3JfdmFsKTsKLQlwdnQtPnRvcF9tZW0gPSBtc3JfdmFsID4+IDIzOwotCWRlYnVnZjAoIiAgVE9QX01FTT0weCUwOGxseFxuIiwgcHZ0LT50b3BfbWVtKTsKKwlyZG1zcmwoTVNSX0s4X1RPUF9NRU0xLCBwdnQtPnRvcF9tZW0pOworCWRlYnVnZjAoIiAgVE9QX01FTTogIDB4JTAxNmxseFxuIiwgcHZ0LT50b3BfbWVtKTsKIAogCS8qIGNoZWNrIGZpcnN0IHdoZXRoZXIgVE9QX01FTTIgaXMgZW5hYmxlZCAqLwogCXJkbXNybChNU1JfSzhfU1lTQ0ZHLCBtc3JfdmFsKTsKIAlpZiAobXNyX3ZhbCAmICgxVSA8PCAyMSkpIHsKLQkJcmRtc3JsKE1TUl9LOF9UT1BfTUVNMiwgbXNyX3ZhbCk7Ci0JCXB2dC0+dG9wX21lbTIgPSBtc3JfdmFsID4+IDIzOwotCQlkZWJ1Z2YwKCIgIFRPUF9NRU0yPTB4JTA4bGx4XG4iLCBwdnQtPnRvcF9tZW0yKTsKKwkJcmRtc3JsKE1TUl9LOF9UT1BfTUVNMiwgcHZ0LT50b3BfbWVtMik7CisJCWRlYnVnZjAoIiAgVE9QX01FTTI6IDB4JTAxNmxseFxuIiwgcHZ0LT50b3BfbWVtMik7CiAJfSBlbHNlCiAJCWRlYnVnZjAoIiAgVE9QX01FTTIgZGlzYWJsZWQuXG4iKTsKIAogCWFtZDY0X2NwdV9kaXNwbGF5X2luZm8ocHZ0KTsKIAotCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPm1pc2NfZjNfY3RsLCBLOF9OQkNBUCwgJnB2dC0+bmJjYXApOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3JlZzsKKwlhbWQ2NF9yZWFkX3BjaV9jZmcocHZ0LT5taXNjX2YzX2N0bCwgSzhfTkJDQVAsICZwdnQtPm5iY2FwKTsKIAogCWlmIChwdnQtPm9wcy0+cmVhZF9kcmFtX2N0bF9yZWdpc3RlcikKIAkJcHZ0LT5vcHMtPnJlYWRfZHJhbV9jdGxfcmVnaXN0ZXIocHZ0KTsKQEAgLTI0MjUsMTMgKzIzMTUsMTIgQEAKIAkJICogZGVidWcgb3V0cHV0IGJsb2NrIGF3YXkuCiAJCSAqLwogCQlpZiAocHZ0LT5kcmFtX3J3X2VuW2RyYW1dICE9IDApIHsKLQkJCWRlYnVnZjEoIiAgRFJBTV9CQVNFWyVkXTogMHglOC4wOHgtJTguMDh4ICIKLQkJCQkiRFJBTV9MSU1JVDogIDB4JTguMDh4LSU4LjA4eFxuIiwKKwkJCWRlYnVnZjEoIiAgRFJBTS1CQVNFWyVkXTogMHglMDE2bGx4ICIKKwkJCQkiRFJBTS1MSU1JVDogIDB4JTAxNmxseFxuIiwKIAkJCQlkcmFtLAotCQkJCSh1MzIpKHB2dC0+ZHJhbV9iYXNlW2RyYW1dID4+IDMyKSwKLQkJCQkodTMyKShwdnQtPmRyYW1fYmFzZVtkcmFtXSAmIDB4RkZGRkZGRkYpLAotCQkJCSh1MzIpKHB2dC0+ZHJhbV9saW1pdFtkcmFtXSA+PiAzMiksCi0JCQkJKHUzMikocHZ0LT5kcmFtX2xpbWl0W2RyYW1dICYgMHhGRkZGRkZGRikpOworCQkJCXB2dC0+ZHJhbV9iYXNlW2RyYW1dLAorCQkJCXB2dC0+ZHJhbV9saW1pdFtkcmFtXSk7CisKIAkJCWRlYnVnZjEoIiAgICAgICAgSW50bHZFbj0lcyAlcyAlcyAiCiAJCQkJIkludGx2U2VsPSVkIERzdE5vZGU9JWRcbiIsCiAJCQkJcHZ0LT5kcmFtX0ludGx2RW5bZHJhbV0gPwpAQCAtMjQ0NSw0NCArMjMzNCwyMCBAQAogCiAJYW1kNjRfcmVhZF9kY3RfYmFzZV9tYXNrKHB2dCk7CiAKLQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5hZGRyX2YxX2N0bCwgSzhfREhBUiwgJnB2dC0+ZGhhcik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfcmVnOwotCisJYW1kNjRfcmVhZF9wY2lfY2ZnKHB2dC0+YWRkcl9mMV9jdGwsIEs4X0RIQVIsICZwdnQtPmRoYXIpOwogCWFtZDY0X3JlYWRfZGJhbV9yZWcocHZ0KTsKIAotCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPm1pc2NfZjNfY3RsLAotCQkJCUYxMF9PTkxJTkVfU1BBUkUsICZwdnQtPm9ubGluZV9zcGFyZSk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfcmVnOworCWFtZDY0X3JlYWRfcGNpX2NmZyhwdnQtPm1pc2NfZjNfY3RsLAorCQkJICAgRjEwX09OTElORV9TUEFSRSwgJnB2dC0+b25saW5lX3NwYXJlKTsKIAotCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmRyYW1fZjJfY3RsLCBGMTBfRENMUl8wLCAmcHZ0LT5kY2xyMCk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfcmVnOwotCi0JZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+ZHJhbV9mMl9jdGwsIEYxMF9EQ0hSXzAsICZwdnQtPmRjaHIwKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9yZWc7CisJYW1kNjRfcmVhZF9wY2lfY2ZnKHB2dC0+ZHJhbV9mMl9jdGwsIEYxMF9EQ0xSXzAsICZwdnQtPmRjbHIwKTsKKwlhbWQ2NF9yZWFkX3BjaV9jZmcocHZ0LT5kcmFtX2YyX2N0bCwgRjEwX0RDSFJfMCwgJnB2dC0+ZGNocjApOwogCiAJaWYgKCFkY3RfZ2FuZ2luZ19lbmFibGVkKHB2dCkpIHsKLQkJZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+ZHJhbV9mMl9jdGwsIEYxMF9EQ0xSXzEsCi0JCQkJCQkmcHZ0LT5kY2xyMSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycl9yZWc7Ci0KLQkJZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+ZHJhbV9mMl9jdGwsIEYxMF9EQ0hSXzEsCi0JCQkJCQkmcHZ0LT5kY2hyMSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycl9yZWc7CisJCWFtZDY0X3JlYWRfcGNpX2NmZyhwdnQtPmRyYW1fZjJfY3RsLCBGMTBfRENMUl8xLCAmcHZ0LT5kY2xyMSk7CisJCWFtZDY0X3JlYWRfcGNpX2NmZyhwdnQtPmRyYW1fZjJfY3RsLCBGMTBfRENIUl8xLCAmcHZ0LT5kY2hyMSk7CiAJfQotCiAJYW1kNjRfZHVtcF9taXNjX3JlZ3MocHZ0KTsKLQotCXJldHVybjsKLQotZXJyX3JlZzoKLQlkZWJ1Z2YwKCJSZWFkaW5nIGFuIE1DIHJlZ2lzdGVyIGZhaWxlZFxuIik7Ci0KIH0KIAogLyoKQEAgLTI1MjEsNyArMjM4Niw3IEBACiAgKi8KIHN0YXRpYyB1MzIgYW1kNjRfY3Nyb3dfbnJfcGFnZXMoaW50IGNzcm93X25yLCBzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQpCiB7Ci0JdTMyIGRyYW1fbWFwLCBucl9wYWdlczsKKwl1MzIgY3NfbW9kZSwgbnJfcGFnZXM7CiAKIAkvKgogCSAqIFRoZSBtYXRoIG9uIHRoaXMgZG9lc24ndCBsb29rIHJpZ2h0IG9uIHRoZSBzdXJmYWNlIGJlY2F1c2UgeC8yKjQgY2FuCkBAIC0yNTMwLDkgKzIzOTUsOSBAQAogCSAqIG51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IHRoZSBEQkFNIHJlZ2lzdGVyIHRvIGV4dHJhY3QgdGhlIHByb3BlciBDU1JPVwogCSAqIGZpZWxkLgogCSAqLwotCWRyYW1fbWFwID0gKHB2dC0+ZGJhbTAgPj4gKChjc3Jvd19uciAvIDIpICogNCkpICYgMHhGOworCWNzX21vZGUgPSAocHZ0LT5kYmFtMCA+PiAoKGNzcm93X25yIC8gMikgKiA0KSkgJiAweEY7CiAKLQlucl9wYWdlcyA9IHB2dC0+b3BzLT5kYmFtX21hcF90b19wYWdlcyhwdnQsIGRyYW1fbWFwKTsKKwlucl9wYWdlcyA9IHB2dC0+b3BzLT5kYmFtX3RvX2NzKHB2dCwgY3NfbW9kZSkgPDwgKDIwIC0gUEFHRV9TSElGVCk7CiAKIAkvKgogCSAqIElmIGR1YWwgY2hhbm5lbCB0aGVuIGRvdWJsZSB0aGUgbWVtb3J5IHNpemUgb2Ygc2luZ2xlIGNoYW5uZWwuCkBAIC0yNTQwLDcgKzI0MDUsNyBAQAogCSAqLwogCW5yX3BhZ2VzIDw8PSAocHZ0LT5jaGFubmVsX2NvdW50IC0gMSk7CiAKLQlkZWJ1Z2YwKCIgIChjc3Jvdz0lZCkgREJBTSBtYXAgaW5kZXg9ICVkXG4iLCBjc3Jvd19uciwgZHJhbV9tYXApOworCWRlYnVnZjAoIiAgKGNzcm93PSVkKSBEQkFNIG1hcCBpbmRleD0gJWRcbiIsIGNzcm93X25yLCBjc19tb2RlKTsKIAlkZWJ1Z2YwKCIgICAgbnJfcGFnZXM9ICV1ICBjaGFubmVsLWNvdW50ID0gJWRcbiIsCiAJCW5yX3BhZ2VzLCBwdnQtPmNoYW5uZWxfY291bnQpOwogCkBAIC0yNTU2LDEzICsyNDIxLDExIEBACiAJc3RydWN0IGNzcm93X2luZm8gKmNzcm93OwogCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dDsKIAl1NjQgaW5wdXRfYWRkcl9taW4sIGlucHV0X2FkZHJfbWF4LCBzeXNfYWRkcjsKLQlpbnQgaSwgZXJyID0gMCwgZW1wdHkgPSAxOworCWludCBpLCBlbXB0eSA9IDE7CiAKIAlwdnQgPSBtY2ktPnB2dF9pbmZvOwogCi0JZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+bWlzY19mM19jdGwsIEs4X05CQ0ZHLCAmcHZ0LT5uYmNmZyk7Ci0JaWYgKGVycikKLQkJZGVidWdmMCgiUmVhZGluZyBLOF9OQkNGRyBmYWlsZWRcbiIpOworCWFtZDY0X3JlYWRfcGNpX2NmZyhwdnQtPm1pc2NfZjNfY3RsLCBLOF9OQkNGRywgJnB2dC0+bmJjZmcpOwogCiAJZGVidWdmMCgiTkJDRkc9IDB4JXggIENISVBLSUxMPSAlcyBEUkFNIEVDQz0gJXNcbiIsIHB2dC0+bmJjZmcsCiAJCShwdnQtPm5iY2ZnICYgSzhfTkJDRkdfQ0hJUEtJTEwpID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIiwKQEAgLTI2MTgsNiArMjQ4MSwxMDkgQEAKIAlyZXR1cm4gZW1wdHk7CiB9CiAKKy8qIGdldCBhbGwgY29yZXMgb24gdGhpcyBEQ1QgKi8KK3N0YXRpYyB2b2lkIGdldF9jcHVzX29uX3RoaXNfZGN0X2NwdW1hc2soc3RydWN0IGNwdW1hc2sgKm1hc2ssIGludCBuaWQpCit7CisJaW50IGNwdTsKKworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQlpZiAoYW1kX2dldF9uYl9pZChjcHUpID09IG5pZCkKKwkJCWNwdW1hc2tfc2V0X2NwdShjcHUsIG1hc2spOworfQorCisvKiBjaGVjayBNQ0dfQ1RMIG9uIGFsbCB0aGUgY3B1cyBvbiB0aGlzIG5vZGUgKi8KK3N0YXRpYyBib29sIGFtZDY0X25iX21jZV9iYW5rX2VuYWJsZWRfb25fbm9kZShpbnQgbmlkKQoreworCWNwdW1hc2tfdmFyX3QgbWFzazsKKwlzdHJ1Y3QgbXNyICptc3JzOworCWludCBjcHUsIG5iZSwgaWR4ID0gMDsKKwlib29sIHJldCA9IGZhbHNlOworCisJaWYgKCF6YWxsb2NfY3B1bWFza192YXIoJm1hc2ssIEdGUF9LRVJORUwpKSB7CisJCWFtZDY0X3ByaW50ayhLRVJOX1dBUk5JTkcsICIlczogZXJyb3IgYWxsb2NhdGluZyBtYXNrXG4iLAorCQkJICAgICBfX2Z1bmNfXyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlnZXRfY3B1c19vbl90aGlzX2RjdF9jcHVtYXNrKG1hc2ssIG5pZCk7CisKKwltc3JzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zcikgKiBjcHVtYXNrX3dlaWdodChtYXNrKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtc3JzKSB7CisJCWFtZDY0X3ByaW50ayhLRVJOX1dBUk5JTkcsICIlczogZXJyb3IgYWxsb2NhdGluZyBtc3JzXG4iLAorCQkJICAgICAgX19mdW5jX18pOworCQlmcmVlX2NwdW1hc2tfdmFyKG1hc2spOworCQkgcmV0dXJuIGZhbHNlOworCX0KKworCXJkbXNyX29uX2NwdXMobWFzaywgTVNSX0lBMzJfTUNHX0NUTCwgbXNycyk7CisKKwlmb3JfZWFjaF9jcHUoY3B1LCBtYXNrKSB7CisJCW5iZSA9IG1zcnNbaWR4XS5sICYgSzhfTVNSX01DR0NUTF9OQkU7CisKKwkJZGVidWdmMCgiY29yZTogJXUsIE1DR19DVEw6IDB4JWxseCwgTkIgTVNSIGlzICVzXG4iLAorCQkJY3B1LCBtc3JzW2lkeF0ucSwKKwkJCShuYmUgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKSk7CisKKwkJaWYgKCFuYmUpCisJCQlnb3RvIG91dDsKKworCQlpZHgrKzsKKwl9CisJcmV0ID0gdHJ1ZTsKKworb3V0OgorCWtmcmVlKG1zcnMpOworCWZyZWVfY3B1bWFza192YXIobWFzayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhbWQ2NF90b2dnbGVfZWNjX2Vycl9yZXBvcnRpbmcoc3RydWN0IGFtZDY0X3B2dCAqcHZ0LCBib29sIG9uKQoreworCWNwdW1hc2tfdmFyX3QgY21hc2s7CisJc3RydWN0IG1zciAqbXNycyA9IE5VTEw7CisJaW50IGNwdSwgaWR4ID0gMDsKKworCWlmICghemFsbG9jX2NwdW1hc2tfdmFyKCZjbWFzaywgR0ZQX0tFUk5FTCkpIHsKKwkJYW1kNjRfcHJpbnRrKEtFUk5fV0FSTklORywgIiVzOiBlcnJvciBhbGxvY2F0aW5nIG1hc2tcbiIsCisJCQkgICAgIF9fZnVuY19fKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWdldF9jcHVzX29uX3RoaXNfZGN0X2NwdW1hc2soY21hc2ssIHB2dC0+bWNfbm9kZV9pZCk7CisKKwltc3JzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zcikgKiBjcHVtYXNrX3dlaWdodChjbWFzayksIEdGUF9LRVJORUwpOworCWlmICghbXNycykgeworCQlhbWQ2NF9wcmludGsoS0VSTl9XQVJOSU5HLCAiJXM6IGVycm9yIGFsbG9jYXRpbmcgbXNyc1xuIiwKKwkJCSAgICAgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZG1zcl9vbl9jcHVzKGNtYXNrLCBNU1JfSUEzMl9NQ0dfQ1RMLCBtc3JzKTsKKworCWZvcl9lYWNoX2NwdShjcHUsIGNtYXNrKSB7CisKKwkJaWYgKG9uKSB7CisJCQlpZiAobXNyc1tpZHhdLmwgJiBLOF9NU1JfTUNHQ1RMX05CRSkKKwkJCQlwdnQtPmZsYWdzLmVjY19yZXBvcnQgPSAxOworCisJCQltc3JzW2lkeF0ubCB8PSBLOF9NU1JfTUNHQ1RMX05CRTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBUdXJuIG9mZiBFQ0MgcmVwb3J0aW5nIG9ubHkgd2hlbiBpdCB3YXMgb2ZmIGJlZm9yZQorCQkJICovCisJCQlpZiAoIXB2dC0+ZmxhZ3MuZWNjX3JlcG9ydCkKKwkJCQltc3JzW2lkeF0ubCAmPSB+SzhfTVNSX01DR0NUTF9OQkU7CisJCX0KKwkJaWR4Kys7CisJfQorCXdybXNyX29uX2NwdXMoY21hc2ssIE1TUl9JQTMyX01DR19DVEwsIG1zcnMpOworCisJa2ZyZWUobXNycyk7CisJZnJlZV9jcHVtYXNrX3ZhcihjbWFzayk7CisKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIE9ubHkgaWYgJ2VjY19lbmFibGVfb3ZlcnJpZGUnIGlzIHNldCBBTkQgQklPUyBoYWQgRUNDIGRpc2FibGVkLCBkbyAid2UiCiAgKiBlbmFibGUgaXQuCkBAIC0yNjI1LDI0ICsyNTkxLDE2IEBACiBzdGF0aWMgdm9pZCBhbWQ2NF9lbmFibGVfZWNjX2Vycm9yX3JlcG9ydGluZyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCiB7CiAJc3RydWN0IGFtZDY0X3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKLQljb25zdCBjcHVtYXNrX3QgKmNwdW1hc2sgPSBjcHVtYXNrX29mX25vZGUocHZ0LT5tY19ub2RlX2lkKTsKLQlpbnQgY3B1LCBpZHggPSAwLCBlcnIgPSAwOwotCXN0cnVjdCBtc3IgbXNyc1tjcHVtYXNrX3dlaWdodChjcHVtYXNrKV07Ci0JdTMyIHZhbHVlOwotCXUzMiBtYXNrID0gSzhfTkJDVExfQ0VDQ0VuIHwgSzhfTkJDVExfVUVDQ0VuOworCXUzMiB2YWx1ZSwgbWFzayA9IEs4X05CQ1RMX0NFQ0NFbiB8IEs4X05CQ1RMX1VFQ0NFbjsKIAogCWlmICghZWNjX2VuYWJsZV9vdmVycmlkZSkKIAkJcmV0dXJuOwogCi0JbWVtc2V0KG1zcnMsIDAsIHNpemVvZihtc3JzKSk7Ci0KIAlhbWQ2NF9wcmludGsoS0VSTl9XQVJOSU5HLAogCQkiJ2VjY19lbmFibGVfb3ZlcnJpZGUnIHBhcmFtZXRlciBpcyBhY3RpdmUsICIKIAkJIkVuYWJsaW5nIEFNRCBFQ0MgaGFyZHdhcmUgbm93OiBDQVVUSU9OXG4iKTsKIAotCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPm1pc2NfZjNfY3RsLCBLOF9OQkNUTCwgJnZhbHVlKTsKLQlpZiAoZXJyKQotCQlkZWJ1Z2YwKCJSZWFkaW5nIEs4X05CQ1RMIGZhaWxlZFxuIik7CisJYW1kNjRfcmVhZF9wY2lfY2ZnKHB2dC0+bWlzY19mM19jdGwsIEs4X05CQ1RMLCAmdmFsdWUpOwogCiAJLyogdHVybiBvbiBVRUNDbiBhbmQgQ0VDQ0VuIGJpdHMgKi8KIAlwdnQtPm9sZF9uYmN0bCA9IHZhbHVlICYgbWFzazsKQEAgLTI2NTEsMjAgKzI2MDksMTEgQEAKIAl2YWx1ZSB8PSBtYXNrOwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQocHZ0LT5taXNjX2YzX2N0bCwgSzhfTkJDVEwsIHZhbHVlKTsKIAotCXJkbXNyX29uX2NwdXMoY3B1bWFzaywgSzhfTVNSX01DR0NUTCwgbXNycyk7CisJaWYgKGFtZDY0X3RvZ2dsZV9lY2NfZXJyX3JlcG9ydGluZyhwdnQsIE9OKSkKKwkJYW1kNjRfcHJpbnRrKEtFUk5fV0FSTklORywgIkVycm9yIGVuYWJsaW5nIEVDQyByZXBvcnRpbmcgb3ZlciAiCisJCQkJCSAgICJNQ0dDVEwhXG4iKTsKIAotCWZvcl9lYWNoX2NwdShjcHUsIGNwdW1hc2spIHsKLQkJaWYgKG1zcnNbaWR4XS5sICYgSzhfTVNSX01DR0NUTF9OQkUpCi0JCQlzZXRfYml0KGlkeCwgJnB2dC0+b2xkX21jZ2N0bCk7Ci0KLQkJbXNyc1tpZHhdLmwgfD0gSzhfTVNSX01DR0NUTF9OQkU7Ci0JCWlkeCsrOwotCX0KLQl3cm1zcl9vbl9jcHVzKGNwdW1hc2ssIEs4X01TUl9NQ0dDVEwsIG1zcnMpOwotCi0JZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+bWlzY19mM19jdGwsIEs4X05CQ0ZHLCAmdmFsdWUpOwotCWlmIChlcnIpCi0JCWRlYnVnZjAoIlJlYWRpbmcgSzhfTkJDRkcgZmFpbGVkXG4iKTsKKwlhbWQ2NF9yZWFkX3BjaV9jZmcocHZ0LT5taXNjX2YzX2N0bCwgSzhfTkJDRkcsICZ2YWx1ZSk7CiAKIAlkZWJ1Z2YwKCJOQkNGRygxKT0gMHgleCAgQ0hJUEtJTEw9ICVzIEVDQ19FTkFCTEU9ICVzXG4iLCB2YWx1ZSwKIAkJKHZhbHVlICYgSzhfTkJDRkdfQ0hJUEtJTEwpID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIiwKQEAgLTI2NzksOSArMjYyOCw3IEBACiAJCXZhbHVlIHw9IEs4X05CQ0ZHX0VDQ19FTkFCTEU7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocHZ0LT5taXNjX2YzX2N0bCwgSzhfTkJDRkcsIHZhbHVlKTsKIAotCQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5taXNjX2YzX2N0bCwgSzhfTkJDRkcsICZ2YWx1ZSk7Ci0JCWlmIChlcnIpCi0JCQlkZWJ1Z2YwKCJSZWFkaW5nIEs4X05CQ0ZHIGZhaWxlZFxuIik7CisJCWFtZDY0X3JlYWRfcGNpX2NmZyhwdnQtPm1pc2NfZjNfY3RsLCBLOF9OQkNGRywgJnZhbHVlKTsKIAogCQlpZiAoISh2YWx1ZSAmIEs4X05CQ0ZHX0VDQ19FTkFCTEUpKSB7CiAJCQlhbWQ2NF9wcmludGsoS0VSTl9XQVJOSU5HLApAQCAtMjcwMSw4NiArMjY0OCwyMSBAQAogCiBzdGF0aWMgdm9pZCBhbWQ2NF9yZXN0b3JlX2VjY19lcnJvcl9yZXBvcnRpbmcoc3RydWN0IGFtZDY0X3B2dCAqcHZ0KQogewotCWNvbnN0IGNwdW1hc2tfdCAqY3B1bWFzayA9IGNwdW1hc2tfb2Zfbm9kZShwdnQtPm1jX25vZGVfaWQpOwotCWludCBjcHUsIGlkeCA9IDAsIGVyciA9IDA7Ci0Jc3RydWN0IG1zciBtc3JzW2NwdW1hc2tfd2VpZ2h0KGNwdW1hc2spXTsKLQl1MzIgdmFsdWU7Ci0JdTMyIG1hc2sgPSBLOF9OQkNUTF9DRUNDRW4gfCBLOF9OQkNUTF9VRUNDRW47CisJdTMyIHZhbHVlLCBtYXNrID0gSzhfTkJDVExfQ0VDQ0VuIHwgSzhfTkJDVExfVUVDQ0VuOwogCiAJaWYgKCFwdnQtPm5iY3RsX21jZ2N0bF9zYXZlZCkKIAkJcmV0dXJuOwogCi0JbWVtc2V0KG1zcnMsIDAsIHNpemVvZihtc3JzKSk7Ci0KLQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5taXNjX2YzX2N0bCwgSzhfTkJDVEwsICZ2YWx1ZSk7Ci0JaWYgKGVycikKLQkJZGVidWdmMCgiUmVhZGluZyBLOF9OQkNUTCBmYWlsZWRcbiIpOworCWFtZDY0X3JlYWRfcGNpX2NmZyhwdnQtPm1pc2NfZjNfY3RsLCBLOF9OQkNUTCwgJnZhbHVlKTsKIAl2YWx1ZSAmPSB+bWFzazsKIAl2YWx1ZSB8PSBwdnQtPm9sZF9uYmN0bDsKIAogCS8qIHJlc3RvcmUgdGhlIE5CIEVuYWJsZSBNQ0dDVEwgYml0ICovCiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwdnQtPm1pc2NfZjNfY3RsLCBLOF9OQkNUTCwgdmFsdWUpOwogCi0JcmRtc3Jfb25fY3B1cyhjcHVtYXNrLCBLOF9NU1JfTUNHQ1RMLCBtc3JzKTsKLQotCWZvcl9lYWNoX2NwdShjcHUsIGNwdW1hc2spIHsKLQkJbXNyc1tpZHhdLmwgJj0gfks4X01TUl9NQ0dDVExfTkJFOwotCQltc3JzW2lkeF0ubCB8PQotCQkJdGVzdF9iaXQoaWR4LCAmcHZ0LT5vbGRfbWNnY3RsKSA8PCBLOF9NU1JfTUNHQ1RMX05CRTsKLQkJaWR4Kys7Ci0JfQotCi0Jd3Jtc3Jfb25fY3B1cyhjcHVtYXNrLCBLOF9NU1JfTUNHQ1RMLCBtc3JzKTsKLX0KLQotLyogZ2V0IGFsbCBjb3JlcyBvbiB0aGlzIERDVCAqLwotc3RhdGljIHZvaWQgZ2V0X2NwdXNfb25fdGhpc19kY3RfY3B1bWFzayhjcHVtYXNrX3QgKm1hc2ssIGludCBuaWQpCi17Ci0JaW50IGNwdTsKLQotCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQotCQlpZiAoYW1kX2dldF9uYl9pZChjcHUpID09IG5pZCkKLQkJCWNwdW1hc2tfc2V0X2NwdShjcHUsIG1hc2spOwotfQotCi0vKiBjaGVjayBNQ0dfQ1RMIG9uIGFsbCB0aGUgY3B1cyBvbiB0aGlzIG5vZGUgKi8KLXN0YXRpYyBib29sIGFtZDY0X25iX21jZV9iYW5rX2VuYWJsZWRfb25fbm9kZShpbnQgbmlkKQotewotCWNwdW1hc2tfdCBtYXNrOwotCXN0cnVjdCBtc3IgKm1zcnM7Ci0JaW50IGNwdSwgbmJlLCBpZHggPSAwOwotCWJvb2wgcmV0ID0gZmFsc2U7Ci0KLQljcHVtYXNrX2NsZWFyKCZtYXNrKTsKLQotCWdldF9jcHVzX29uX3RoaXNfZGN0X2NwdW1hc2soJm1hc2ssIG5pZCk7Ci0KLQltc3JzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zcikgKiBjcHVtYXNrX3dlaWdodCgmbWFzayksIEdGUF9LRVJORUwpOwotCWlmICghbXNycykgewotCQlhbWQ2NF9wcmludGsoS0VSTl9XQVJOSU5HLCAiJXM6IGVycm9yIGFsbG9jYXRpbmcgbXNyc1xuIiwKLQkJCSAgICAgIF9fZnVuY19fKTsKLQkJIHJldHVybiBmYWxzZTsKLQl9Ci0KLQlyZG1zcl9vbl9jcHVzKCZtYXNrLCBNU1JfSUEzMl9NQ0dfQ1RMLCBtc3JzKTsKLQotCWZvcl9lYWNoX2NwdShjcHUsICZtYXNrKSB7Ci0JCW5iZSA9IG1zcnNbaWR4XS5sICYgSzhfTVNSX01DR0NUTF9OQkU7Ci0KLQkJZGVidWdmMCgiY29yZTogJXUsIE1DR19DVEw6IDB4JWxseCwgTkIgTVNSIGlzICVzXG4iLAotCQkJY3B1LCBtc3JzW2lkeF0ucSwKLQkJCShuYmUgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKSk7Ci0KLQkJaWYgKCFuYmUpCi0JCQlnb3RvIG91dDsKLQotCQlpZHgrKzsKLQl9Ci0JcmV0ID0gdHJ1ZTsKLQotb3V0OgotCWtmcmVlKG1zcnMpOwotCXJldHVybiByZXQ7CisJaWYgKGFtZDY0X3RvZ2dsZV9lY2NfZXJyX3JlcG9ydGluZyhwdnQsIE9GRikpCisJCWFtZDY0X3ByaW50ayhLRVJOX1dBUk5JTkcsICJFcnJvciByZXN0b3JpbmcgRUNDIHJlcG9ydGluZyBvdmVyICIKKwkJCQkJICAgIk1DR0NUTCFcbiIpOwogfQogCiAvKgpAQCAtMjc5NywxMyArMjY3OSwxMCBAQAogc3RhdGljIGludCBhbWQ2NF9jaGVja19lY2NfZW5hYmxlZChzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQpCiB7CiAJdTMyIHZhbHVlOwotCWludCBlcnIgPSAwOwogCXU4IGVjY19lbmFibGVkID0gMDsKIAlib29sIG5iX21jZV9lbiA9IGZhbHNlOwogCi0JZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+bWlzY19mM19jdGwsIEs4X05CQ0ZHLCAmdmFsdWUpOwotCWlmIChlcnIpCi0JCWRlYnVnZjAoIlJlYWRpbmcgSzhfTkJDVEwgZmFpbGVkXG4iKTsKKwlhbWQ2NF9yZWFkX3BjaV9jZmcocHZ0LT5taXNjX2YzX2N0bCwgSzhfTkJDRkcsICZ2YWx1ZSk7CiAKIAllY2NfZW5hYmxlZCA9ICEhKHZhbHVlICYgSzhfTkJDRkdfRUNDX0VOQUJMRSk7CiAJaWYgKCFlY2NfZW5hYmxlZCkKQEAgLTI5MDksNyArMjc4OCw2IEBACiAJcHZ0LT5leHRfbW9kZWwJCT0gYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPj4gNDsKIAlwdnQtPm1jX3R5cGVfaW5kZXgJPSBtY190eXBlX2luZGV4OwogCXB2dC0+b3BzCQk9IGZhbWlseV9vcHMobWNfdHlwZV9pbmRleCk7Ci0JcHZ0LT5vbGRfbWNnY3RsCQk9IDA7CiAKIAkvKgogCSAqIFdlIGhhdmUgdGhlIGRyYW1fZjJfY3RsIGRldmljZSBhcyBhbiBhcmd1bWVudCwgbm93IGdvIHJlc2VydmUgaXRzCkBAIC0yOTU5LDE3ICsyODM3LDEwIEBACiB7CiAJaW50IG5vZGVfaWQgPSBwdnQtPm1jX25vZGVfaWQ7CiAJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOwotCWludCByZXQsIGVyciA9IDA7CisJaW50IHJldCA9IC1FTk9ERVY7CiAKIAlhbWQ2NF9yZWFkX21jX3JlZ2lzdGVycyhwdnQpOwogCi0JcmV0ID0gLUVOT0RFVjsKLQlpZiAocHZ0LT5vcHMtPnByb2JlX3ZhbGlkX2hhcmR3YXJlKSB7Ci0JCWVyciA9IHB2dC0+b3BzLT5wcm9iZV92YWxpZF9oYXJkd2FyZShwdnQpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfZXhpdDsKLQl9Ci0KIAkvKgogCSAqIFdlIG5lZWQgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IG1lbW9yeSBjaGFubmVscyB0aGVyZSBhcmUuIFRoZW4gdXNlCiAJICogdGhhdCBpbmZvcm1hdGlvbiBmb3IgY2FsY3VsYXRpbmcgdGhlIHNpemUgb2YgdGhlIGR5bmFtaWMgaW5zdGFuY2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmggYi9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5oCmluZGV4IGM2ZjM1OWEuLjQxYmM1NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmgKKysrIGIvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuaApAQCAtMTI5LDI0ICsxMjksMjIgQEAKICAqICAgICAgICAgc2VjdGlvbnMgMy41LjQgYW5kIDMuNS41IGZvciBtb3JlIGluZm9ybWF0aW9uLgogICovCiAKLSNkZWZpbmUgRURBQ19BTUQ2NF9WRVJTSU9OCQkiIFZlcjogMy4yLjAgIiBfX0RBVEVfXworI2RlZmluZSBFREFDX0FNRDY0X1ZFUlNJT04JCSIgVmVyOiAzLjMuMCAiIF9fREFURV9fCiAjZGVmaW5lIEVEQUNfTU9EX1NUUgkJCSJhbWQ2NF9lZGFjIgogCiAjZGVmaW5lIEVEQUNfTUFYX05VTU5PREVTCQk4CiAKIC8qIEV4dGVuZGVkIE1vZGVsIGZyb20gQ1BVSUQsIGZvciBDUFUgUmV2aXNpb24gbnVtYmVycyAqLwotI2RlZmluZSBPUFRFUk9OX0NQVV9MRV9SRVZfQwkJMAotI2RlZmluZSBPUFRFUk9OX0NQVV9SRVZfRAkJMQotI2RlZmluZSBPUFRFUk9OX0NQVV9SRVZfRQkJMgotCi0vKiBOUFQgcHJvY2Vzc29ycyBoYXZlIHRoZSBmb2xsb3dpbmcgRXh0ZW5kZWQgTW9kZWxzICovCi0jZGVmaW5lIE9QVEVST05fQ1BVX1JFVl9GCQk0Ci0jZGVmaW5lIE9QVEVST05fQ1BVX1JFVl9GQQkJNQorI2RlZmluZSBLOF9SRVZfRAkJCTEKKyNkZWZpbmUgSzhfUkVWX0UJCQkyCisjZGVmaW5lIEs4X1JFVl9GCQkJNAogCiAvKiBIYXJkd2FyZSBsaW1pdCBvbiBDaGlwU2VsZWN0IHJvd3MgcGVyIE1DIGFuZCBwcm9jZXNzb3JzIHBlciBzeXN0ZW0gKi8KICNkZWZpbmUgTUFYX0NTX0NPVU5UCQkJOAogI2RlZmluZSBEUkFNX1JFR19DT1VOVAkJCTgKIAorI2RlZmluZSBPTiB0cnVlCisjZGVmaW5lIE9GRiBmYWxzZQogCiAvKgogICogUENJLWRlZmluZWQgY29uZmlndXJhdGlvbiBzcGFjZSByZWdpc3RlcnMKQEAgLTI0MSw3ICsyMzksNyBAQAogI2RlZmluZSBGMTBfRENIUl8xCQkJMHgxOTQKIAogI2RlZmluZSBGMTBfRENIUl9GT1VSX1JBTktfRElNTQkJQklUKDE4KQotI2RlZmluZSBGMTBfRENIUl9EZHIzTW9kZQkJQklUKDgpCisjZGVmaW5lIEREUjNfTU9ERQkJCUJJVCg4KQogI2RlZmluZSBGMTBfRENIUl9NYmxNb2RlCQlCSVQoNikKIAogCkBAIC0zODIsMTQgKzM4MCw5IEBACiAjZGVmaW5lIEs4X05CQ0FQX0NPUkVTCQkJKEJJVCgxMil8QklUKDEzKSkKICNkZWZpbmUgSzhfTkJDQVBfQ0hJUEtJTEwJCUJJVCg0KQogI2RlZmluZSBLOF9OQkNBUF9TRUNERUQJCQlCSVQoMykKLSNkZWZpbmUgSzhfTkJDQVBfOF9OT0RFCQkJQklUKDIpCi0jZGVmaW5lIEs4X05CQ0FQX0RVQUxfTk9ERQkJQklUKDEpCiAjZGVmaW5lIEs4X05CQ0FQX0RDVF9EVUFMCQlCSVQoMCkKIAotLyoKLSAqIE1TUiBSZWdzCi0gKi8KLSNkZWZpbmUgSzhfTVNSX01DR0NUTAkJCTB4MDE3YgorLyogTVNScyAqLwogI2RlZmluZSBLOF9NU1JfTUNHQ1RMX05CRQkJQklUKDQpCiAKICNkZWZpbmUgSzhfTVNSX01DNENUTAkJCTB4MDQxMApAQCAtNDg3LDcgKzQ4MCw2IEBACiAJLyogU2F2ZSBvbGQgaHcgcmVnaXN0ZXJzJyB2YWx1ZXMgYmVmb3JlIHdlIG1vZGlmaWVkIHRoZW0gKi8KIAl1MzIgbmJjdGxfbWNnY3RsX3NhdmVkOwkJLyogV2hlbiB0cnVlLCBmb2xsb3dpbmcgMiBhcmUgdmFsaWQgKi8KIAl1MzIgb2xkX25iY3RsOwotCXVuc2lnbmVkIGxvbmcgb2xkX21jZ2N0bDsJLyogcGVyIGNvcmUgb24gdGhpcyBub2RlICovCiAKIAkvKiBNQyBUeXBlIEluZGV4IHZhbHVlOiBzb2NrZXQgRiB2cyBGYW1pbHkgMTBoICovCiAJdTMyIG1jX3R5cGVfaW5kZXg7CkBAIC00OTUsNiArNDg3LDcgQEAKIAkvKiBtaXNjIHNldHRpbmdzICovCiAJc3RydWN0IGZsYWdzIHsKIAkJdW5zaWduZWQgbG9uZyBjZjhfZXh0Y2ZnOjE7CisJCXVuc2lnbmVkIGxvbmcgZWNjX3JlcG9ydDoxOwogCX0gZmxhZ3M7CiB9OwogCkBAIC01MDQsNyArNDk3LDYgQEAKIH07CiAKIGV4dGVybiBzdHJ1Y3Qgc2NydWJyYXRlIHNjcnVicmF0ZXNbMjNdOwotZXh0ZXJuIHUzMiByZXZmX3F1YWRfZGRyMl9zaGlmdFsxNl07CiBleHRlcm4gY29uc3QgY2hhciAqdHRfbXNnc1s0XTsKIGV4dGVybiBjb25zdCBjaGFyICpsbF9tc2dzWzRdOwogZXh0ZXJuIGNvbnN0IGNoYXIgKnJycnJfbXNnc1sxNl07CkBAIC01MzQsMTcgKzUyNiwxNSBAQAogICogZnVuY3Rpb25zIGFuZCBwZXIgZGV2aWNlIGVuY29kaW5nL2RlY29kaW5nIGxvZ2ljLgogICovCiBzdHJ1Y3QgbG93X29wcyB7Ci0JaW50ICgqcHJvYmVfdmFsaWRfaGFyZHdhcmUpKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCk7Ci0JaW50ICgqZWFybHlfY2hhbm5lbF9jb3VudCkoc3RydWN0IGFtZDY0X3B2dCAqcHZ0KTsKKwlpbnQgKCplYXJseV9jaGFubmVsX2NvdW50KQkoc3RydWN0IGFtZDY0X3B2dCAqcHZ0KTsKIAotCXU2NCAoKmdldF9lcnJvcl9hZGRyZXNzKShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCi0JCQlzdHJ1Y3QgZXJyX3JlZ3MgKmluZm8pOwotCXZvaWQgKCpyZWFkX2RyYW1fYmFzZV9saW1pdCkoc3RydWN0IGFtZDY0X3B2dCAqcHZ0LCBpbnQgZHJhbSk7Ci0Jdm9pZCAoKnJlYWRfZHJhbV9jdGxfcmVnaXN0ZXIpKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCk7Ci0Jdm9pZCAoKm1hcF9zeXNhZGRyX3RvX2Nzcm93KShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCi0JCQkJCXN0cnVjdCBlcnJfcmVncyAqaW5mbywKLQkJCQkJdTY0IFN5c3RlbUFkZHIpOwotCWludCAoKmRiYW1fbWFwX3RvX3BhZ2VzKShzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQsIGludCBkcmFtX21hcCk7CisJdTY0ICgqZ2V0X2Vycm9yX2FkZHJlc3MpCShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJCSBzdHJ1Y3QgZXJyX3JlZ3MgKmluZm8pOworCXZvaWQgKCpyZWFkX2RyYW1fYmFzZV9saW1pdCkJKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCwgaW50IGRyYW0pOworCXZvaWQgKCpyZWFkX2RyYW1fY3RsX3JlZ2lzdGVyKQkoc3RydWN0IGFtZDY0X3B2dCAqcHZ0KTsKKwl2b2lkICgqbWFwX3N5c2FkZHJfdG9fY3Nyb3cpCShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJCSBzdHJ1Y3QgZXJyX3JlZ3MgKmluZm8sIHU2NCBTeXN0ZW1BZGRyKTsKKwlpbnQgKCpkYmFtX3RvX2NzKQkJKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCwgaW50IGNzX21vZGUpOwogfTsKIAogc3RydWN0IGFtZDY0X2ZhbWlseV90eXBlIHsKQEAgLTU2Niw2ICs1NTYsMjIgQEAKIAlyZXR1cm4gJmFtZDY0X2ZhbWlseV90eXBlc1tpbmRleF0ub3BzOwogfQogCitzdGF0aWMgaW5saW5lIGludCBhbWQ2NF9yZWFkX3BjaV9jZmdfZHdvcmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBvZmZzZXQsCisJCQkJCSAgIHUzMiAqdmFsLCBjb25zdCBjaGFyICpmdW5jKQoreworCWludCBlcnIgPSAwOworCisJZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIG9mZnNldCwgdmFsKTsKKwlpZiAoZXJyKQorCQlhbWQ2NF9wcmludGsoS0VSTl9XQVJOSU5HLCAiJXM6IGVycm9yIHJlYWRpbmcgRiVkeCV4LlxuIiwKKwkJCSAgICAgZnVuYywgUENJX0ZVTkMocGRldi0+ZGV2Zm4pLCBvZmZzZXQpOworCisJcmV0dXJuIGVycjsKK30KKworI2RlZmluZSBhbWQ2NF9yZWFkX3BjaV9jZmcocGRldiwgb2Zmc2V0LCB2YWwpCVwKKwlhbWQ2NF9yZWFkX3BjaV9jZmdfZHdvcmQocGRldiwgb2Zmc2V0LCB2YWwsIF9fZnVuY19fKQorCiAvKgogICogRm9yIGZ1dHVyZSBDUFUgdmVyc2lvbnMsIHZlcmlmeSB0aGUgZm9sbG93aW5nIGFzIG5ldyAnc2xvdycgcmF0ZXMgYXBwZWFyIGFuZAogICogbW9kaWZ5IHRoZSBuZWNlc3Nhcnkgc2tpcCB2YWx1ZXMgZm9yIHRoZSBzdXBwb3J0ZWQgQ1BVLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2VkYWNfY29yZS5oIGIvZHJpdmVycy9lZGFjL2VkYWNfY29yZS5oCmluZGV4IDEyZjM1NWMuLjAwMWIyZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX2NvcmUuaAorKysgYi9kcml2ZXJzL2VkYWMvZWRhY19jb3JlLmgKQEAgLTc0LDYgKzc0LDcgQEAKIAogI2lmZGVmIENPTkZJR19FREFDX0RFQlVHCiBleHRlcm4gaW50IGVkYWNfZGVidWdfbGV2ZWw7CitleHRlcm4gY29uc3QgY2hhciAqZWRhY19tZW1fdHlwZXNbXTsKIAogI2lmbmRlZiBDT05GSUdfRURBQ19ERUJVR19WRVJCT1NFCiAjZGVmaW5lIGVkYWNfZGVidWdfcHJpbnRrKGxldmVsLCBmbXQsIGFyZy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZWRhY19tYy5jIGIvZHJpdmVycy9lZGFjL2VkYWNfbWMuYwppbmRleCBiNjI5YzQxLi4zNjMwMzA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvZWRhY19tYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9lZGFjX21jLmMKQEAgLTc2LDYgKzc2LDMwIEBACiAJZGVidWdmMygiXHRwdnRfaW5mbyA9ICVwXG5cbiIsIG1jaS0+cHZ0X2luZm8pOwogfQogCisvKgorICoga2VlcCB0aG9zZSBpbiBzeW5jIHdpdGggdGhlIGVudW0gbWVtX3R5cGUKKyAqLworY29uc3QgY2hhciAqZWRhY19tZW1fdHlwZXNbXSA9IHsKKwkiRW1wdHkgY3Nyb3ciLAorCSJSZXNlcnZlZCBjc3JvdyB0eXBlIiwKKwkiVW5rbm93biBjc3JvdyB0eXBlIiwKKwkiRmFzdCBwYWdlIG1vZGUgUkFNIiwKKwkiRXh0ZW5kZWQgZGF0YSBvdXQgUkFNIiwKKwkiQnVyc3QgRXh0ZW5kZWQgZGF0YSBvdXQgUkFNIiwKKwkiU2luZ2xlIGRhdGEgcmF0ZSBTRFJBTSIsCisJIlJlZ2lzdGVyZWQgc2luZ2xlIGRhdGEgcmF0ZSBTRFJBTSIsCisJIkRvdWJsZSBkYXRhIHJhdGUgU0RSQU0iLAorCSJSZWdpc3RlcmVkIERvdWJsZSBkYXRhIHJhdGUgU0RSQU0iLAorCSJSYW1idXMgRFJBTSIsCisJIlVuYnVmZmVyZWQgRERSMiBSQU0iLAorCSJGdWxseSBidWZmZXJlZCBERFIyIiwKKwkiUmVnaXN0ZXJlZCBERFIyIFJBTSIsCisJIlJhbWJ1cyBYRFIiLAorCSJVbmJ1ZmZlcmVkIEREUjMgUkFNIiwKKwkiUmVnaXN0ZXJlZCBERFIzIFJBTSIsCit9OworRVhQT1JUX1NZTUJPTF9HUEwoZWRhY19tZW1fdHlwZXMpOworCiAjZW5kaWYJCQkJLyogQ09ORklHX0VEQUNfREVCVUcgKi8KIAogLyogJ3B0cicgcG9pbnRzIHRvIGEgcG9zc2libHkgdW5hbGlnbmVkIGl0ZW0gWCBzdWNoIHRoYXQgc2l6ZW9mKFgpIGlzICdzaXplJy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX21jZV9hbWQuYyBiL2RyaXZlcnMvZWRhYy9lZGFjX21jZV9hbWQuYwppbmRleCA2ODljYzZhLi5jNjkzZmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvZWRhY19tY2VfYW1kLmMKKysrIGIvZHJpdmVycy9lZGFjL2VkYWNfbWNlX2FtZC5jCkBAIC0zMDYsNyArMzA2LDcgQEAKIAkgKiB2YWx1ZSBlbmNvZGluZyBoYXMgY2hhbmdlZCBzbyBpbnRlcnByZXQgdGhvc2UgZGlmZmVyZW50bHkKIAkgKi8KIAlpZiAoKGJvb3RfY3B1X2RhdGEueDg2ID09IDB4MTApICYmCi0JICAgIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCA+IDgpKSB7CisJICAgIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCA+IDcpKSB7CiAJCWlmIChyZWdzLT5uYnNoICYgSzhfTkJTSF9FUlJfQ1BVX1ZBTCkKIAkJCXByX2NvbnQoIiwgY29yZTogJXVcbiIsICh1OCkocmVncy0+bmJzaCAmIDB4ZikpOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL29oY2kuYyBiL2RyaXZlcnMvZmlyZXdpcmUvb2hjaS5jCmluZGV4IGFlNDU1NmYuLjk2NzY4ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvb2hjaS5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvb2hjaS5jCkBAIC0yMjE4LDYgKzIyMTgsMTMgQEAKIAlwYWdlICAgICA9IHBheWxvYWQgPj4gUEFHRV9TSElGVDsKIAlvZmZzZXQgICA9IHBheWxvYWQgJiB+UEFHRV9NQVNLOwogCXJlc3QgICAgID0gcC0+cGF5bG9hZF9sZW5ndGg7CisJLyoKKwkgKiBUaGUgY29udHJvbGxlcnMgSSd2ZSB0ZXN0ZWQgaGF2ZSBub3Qgd29ya2VkIGNvcnJlY3RseSB3aGVuCisJICogc2Vjb25kX3JlcV9jb3VudCBpcyB6ZXJvLiAgUmF0aGVyIHRoYW4gZG8gc29tZXRoaW5nIHdlIGtub3cgd29uJ3QKKwkgKiB3b3JrLCByZXR1cm4gYW4gZXJyb3IKKwkgKi8KKwlpZiAocmVzdCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIEZJWE1FOiBtYWtlIHBhY2tldC1wZXItYnVmZmVyL2R1YWwtYnVmZmVyIGEgY29udGV4dCBvcHRpb24gKi8KIAl3aGlsZSAocmVzdCA+IDApIHsKQEAgLTIyNzEsNyArMjI3OCw3IEBACiAJCQkJCXVuc2lnbmVkIGxvbmcgcGF5bG9hZCkKIHsKIAlzdHJ1Y3QgaXNvX2NvbnRleHQgKmN0eCA9IGNvbnRhaW5lcl9vZihiYXNlLCBzdHJ1Y3QgaXNvX2NvbnRleHQsIGJhc2UpOwotCXN0cnVjdCBkZXNjcmlwdG9yICpkID0gTlVMTCwgKnBkID0gTlVMTDsKKwlzdHJ1Y3QgZGVzY3JpcHRvciAqZCwgKnBkOwogCXN0cnVjdCBmd19pc29fcGFja2V0ICpwID0gcGFja2V0OwogCWRtYV9hZGRyX3QgZF9idXMsIHBhZ2VfYnVzOwogCXUzMiB6LCBoZWFkZXJfeiwgcmVzdDsKQEAgLTIzMDksOCArMjMxNiw5IEBACiAJCWQtPmRhdGFfYWRkcmVzcyA9IGNwdV90b19sZTMyKGRfYnVzICsgKHogKiBzaXplb2YoKmQpKSk7CiAKIAkJcmVzdCA9IHBheWxvYWRfcGVyX2J1ZmZlcjsKKwkJcGQgPSBkOwogCQlmb3IgKGogPSAxOyBqIDwgejsgaisrKSB7Ci0JCQlwZCA9IGQgKyBqOworCQkJcGQrKzsKIAkJCXBkLT5jb250cm9sID0gY3B1X3RvX2xlMTYoREVTQ1JJUFRPUl9TVEFUVVMgfAogCQkJCQkJICBERVNDUklQVE9SX0lOUFVUX01PUkUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RlbGxfcmJ1LmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RlbGxfcmJ1LmMKaW5kZXggYjQ3MDRlMS4uYjNhMGNmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9kZWxsX3JidS5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZGVsbF9yYnUuYwpAQCAtNTQ0LDkgKzU0NCwxMiBAQAogewogCXJidV9kYXRhLmVudHJ5X2NyZWF0ZWQgPSAwOwogCi0JaWYgKCFmdyB8fCAhZnctPnNpemUpCisJaWYgKCFmdykKIAkJcmV0dXJuOwogCisJaWYgKCFmdy0+c2l6ZSkKKwkJZ290byBvdXQ7CisKIAlzcGluX2xvY2soJnJidV9kYXRhLmxvY2spOwogCWlmICghc3RyY21wKGltYWdlX3R5cGUsICJtb25vIikpIHsKIAkJaWYgKCFpbWdfdXBkYXRlX3JlYWxsb2MoZnctPnNpemUpKQpAQCAtNTY4LDYgKzU3MSw4IEBACiAJfSBlbHNlCiAJCXByX2RlYnVnKCJpbnZhbGlkIGltYWdlIHR5cGUgc3BlY2lmaWVkLlxuIik7CiAJc3Bpbl91bmxvY2soJnJidV9kYXRhLmxvY2spOworIG91dDoKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIH0KIAogc3RhdGljIHNzaXplX3QgcmVhZF9yYnVfaW1hZ2VfdHlwZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKQEAgLTYxNSw3ICs2MjAsNyBAQAogCQkJc3Bpbl91bmxvY2soJnJidV9kYXRhLmxvY2spOwogCQkJcmVxX2Zpcm1fcmMgPSByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdChUSElTX01PRFVMRSwKIAkJCQlGV19BQ1RJT05fTk9IT1RQTFVHLCAiZGVsbF9yYnUiLAotCQkJCSZyYnVfZGV2aWNlLT5kZXYsICZjb250ZXh0LAorCQkJCSZyYnVfZGV2aWNlLT5kZXYsIEdGUF9LRVJORUwsICZjb250ZXh0LAogCQkJCWNhbGxiYWNrZm5fcmJ1KTsKIAkJCWlmIChyZXFfZmlybV9yYykgewogCQkJCXByaW50ayhLRVJOX0VSUgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlCmluZGV4IDNjODgyN2EuLjQ3MGVmNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUKQEAgLTE1LDcgKzE1LDcgQEAKIAogZHJtLSQoQ09ORklHX0NPTVBBVCkgKz0gZHJtX2lvYzMyLm8KIAotZHJtX2ttc19oZWxwZXIteSA6PSBkcm1fZmJfaGVscGVyLm8gZHJtX2NydGNfaGVscGVyLm8KK2RybV9rbXNfaGVscGVyLXkgOj0gZHJtX2ZiX2hlbHBlci5vIGRybV9jcnRjX2hlbHBlci5vIGRybV9kcF9pMmNfaGVscGVyLm8KIAogb2JqLSQoQ09ORklHX0RSTV9LTVNfSEVMUEVSKSArPSBkcm1fa21zX2hlbHBlci5vCiAKQEAgLTMxLDMgKzMxLDUgQEAKIG9iai0kKENPTkZJR19EUk1fU0lTKSAgICs9IHNpcy8KIG9iai0kKENPTkZJR19EUk1fU0FWQUdFKSs9IHNhdmFnZS8KIG9iai0kKENPTkZJR19EUk1fVklBKQkrPXZpYS8KK29iai0kKENPTkZJR19EUk1fTk9VVkVBVSkgKz1ub3V2ZWF1Lworb2JqLXkJCQkrPSBpMmMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jCmluZGV4IDNmN2M1MDAuLjUxMjQ0MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jCkBAIC0xMjUsNiArMTI1LDE1IEBACiBEUk1fRU5VTV9OQU1FX0ZOKGRybV9nZXRfdHZfc3ViY29ubmVjdG9yX25hbWUsCiAJCSBkcm1fdHZfc3ViY29ubmVjdG9yX2VudW1fbGlzdCkKIAorc3RhdGljIHN0cnVjdCBkcm1fcHJvcF9lbnVtX2xpc3QgZHJtX2RpcnR5X2luZm9fZW51bV9saXN0W10gPSB7CisJeyBEUk1fTU9ERV9ESVJUWV9PRkYsICAgICAgIk9mZiIgICAgICB9LAorCXsgRFJNX01PREVfRElSVFlfT04sICAgICAgICJPbiIgICAgICAgfSwKKwl7IERSTV9NT0RFX0RJUlRZX0FOTk9UQVRFLCAiQW5ub3RhdGUiIH0sCit9OworCitEUk1fRU5VTV9OQU1FX0ZOKGRybV9nZXRfZGlydHlfaW5mb19uYW1lLAorCQkgZHJtX2RpcnR5X2luZm9fZW51bV9saXN0KQorCiBzdHJ1Y3QgZHJtX2Nvbm5fcHJvcF9lbnVtX2xpc3QgewogCWludCB0eXBlOwogCWNoYXIgKm5hbWU7CkBAIC0yNDcsNyArMjU2LDggQEAKIAltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcuaWRyX211dGV4KTsKIH0KIAotdm9pZCAqZHJtX21vZGVfb2JqZWN0X2ZpbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgaWQsIHVpbnQzMl90IHR5cGUpCitzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpkcm1fbW9kZV9vYmplY3RfZmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQl1aW50MzJfdCBpZCwgdWludDMyX3QgdHlwZSkKIHsKIAlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmogPSBOVUxMOwogCkBAIC04MDIsNiArODEyLDM2IEBACiBFWFBPUlRfU1lNQk9MKGRybV9tb2RlX2NyZWF0ZV9kaXRoZXJpbmdfcHJvcGVydHkpOwogCiAvKioKKyAqIGRybV9tb2RlX2NyZWF0ZV9kaXJ0eV9wcm9wZXJ0eSAtIGNyZWF0ZSBkaXJ0eSBwcm9wZXJ0eQorICogQGRldjogRFJNIGRldmljZQorICoKKyAqIENhbGxlZCBieSBhIGRyaXZlciB0aGUgZmlyc3QgdGltZSBpdCdzIG5lZWRlZCwgbXVzdCBiZSBhdHRhY2hlZCB0byBkZXNpcmVkCisgKiBjb25uZWN0b3JzLgorICovCitpbnQgZHJtX21vZGVfY3JlYXRlX2RpcnR5X2luZm9fcHJvcGVydHkoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpkaXJ0eV9pbmZvOworCWludCBpOworCisJaWYgKGRldi0+bW9kZV9jb25maWcuZGlydHlfaW5mb19wcm9wZXJ0eSkKKwkJcmV0dXJuIDA7CisKKwlkaXJ0eV9pbmZvID0KKwkJZHJtX3Byb3BlcnR5X2NyZWF0ZShkZXYsIERSTV9NT0RFX1BST1BfRU5VTSB8CisJCQkJICAgIERSTV9NT0RFX1BST1BfSU1NVVRBQkxFLAorCQkJCSAgICAiZGlydHkiLAorCQkJCSAgICBBUlJBWV9TSVpFKGRybV9kaXJ0eV9pbmZvX2VudW1fbGlzdCkpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRybV9kaXJ0eV9pbmZvX2VudW1fbGlzdCk7IGkrKykKKwkJZHJtX3Byb3BlcnR5X2FkZF9lbnVtKGRpcnR5X2luZm8sIGksCisJCQkJICAgICAgZHJtX2RpcnR5X2luZm9fZW51bV9saXN0W2ldLnR5cGUsCisJCQkJICAgICAgZHJtX2RpcnR5X2luZm9fZW51bV9saXN0W2ldLm5hbWUpOworCWRldi0+bW9kZV9jb25maWcuZGlydHlfaW5mb19wcm9wZXJ0eSA9IGRpcnR5X2luZm87CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX21vZGVfY3JlYXRlX2RpcnR5X2luZm9fcHJvcGVydHkpOworCisvKioKICAqIGRybV9tb2RlX2NvbmZpZ19pbml0IC0gaW5pdGlhbGl6ZSBEUk0gbW9kZV9jb25maWd1cmF0aW9uIHN0cnVjdHVyZQogICogQGRldjogRFJNIGRldmljZQogICoKQEAgLTE3NTMsNiArMTc5Myw3MSBAQAogCXJldHVybiByZXQ7CiB9CiAKK2ludCBkcm1fbW9kZV9kaXJ0eWZiX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBfX3VzZXIgKmNsaXBzX3B0cjsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqY2xpcHMgPSBOVUxMOworCXN0cnVjdCBkcm1fbW9kZV9mYl9kaXJ0eV9jbWQgKnIgPSBkYXRhOworCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYjsKKwl1bnNpZ25lZCBmbGFnczsKKwlpbnQgbnVtX2NsaXBzOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJb2JqID0gZHJtX21vZGVfb2JqZWN0X2ZpbmQoZGV2LCByLT5mYl9pZCwgRFJNX01PREVfT0JKRUNUX0ZCKTsKKwlpZiAoIW9iaikgeworCQlEUk1fRVJST1IoImludmFsaWQgZnJhbWVidWZmZXIgaWRcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF9lcnIxOworCX0KKwlmYiA9IG9ial90b19mYihvYmopOworCisJbnVtX2NsaXBzID0gci0+bnVtX2NsaXBzOworCWNsaXBzX3B0ciA9IChzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqKSh1bnNpZ25lZCBsb25nKXItPmNsaXBzX3B0cjsKKworCWlmICghbnVtX2NsaXBzICE9ICFjbGlwc19wdHIpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZXJyMTsKKwl9CisKKwlmbGFncyA9IERSTV9NT0RFX0ZCX0RJUlRZX0ZMQUdTICYgci0+ZmxhZ3M7CisKKwkvKiBJZiB1c2Vyc3BhY2UgYW5ub3RhdGVzIGNvcHksIGNsaXBzIG11c3QgY29tZSBpbiBwYWlycyAqLworCWlmIChmbGFncyAmIERSTV9NT0RFX0ZCX0RJUlRZX0FOTk9UQVRFX0NPUFkgJiYgKG51bV9jbGlwcyAlIDIpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2VycjE7CisJfQorCisJaWYgKG51bV9jbGlwcyAmJiBjbGlwc19wdHIpIHsKKwkJY2xpcHMgPSBremFsbG9jKG51bV9jbGlwcyAqIHNpemVvZigqY2xpcHMpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjbGlwcykgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2VycjE7CisJCX0KKworCQlyZXQgPSBjb3B5X2Zyb21fdXNlcihjbGlwcywgY2xpcHNfcHRyLAorCQkJCSAgICAgbnVtX2NsaXBzICogc2l6ZW9mKCpjbGlwcykpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZXJyMjsKKwl9CisKKwlpZiAoZmItPmZ1bmNzLT5kaXJ0eSkgeworCQlyZXQgPSBmYi0+ZnVuY3MtPmRpcnR5KGZiLCBmbGFncywgci0+Y29sb3IsIGNsaXBzLCBudW1fY2xpcHMpOworCX0gZWxzZSB7CisJCXJldCA9IC1FTk9TWVM7CisJCWdvdG8gb3V0X2VycjI7CisJfQorCitvdXRfZXJyMjoKKwlrZnJlZShjbGlwcyk7CitvdXRfZXJyMToKKwltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKwogLyoqCiAgKiBkcm1fZmJfcmVsZWFzZSAtIHJlbW92ZSBhbmQgZnJlZSB0aGUgRkJzIG9uIHRoaXMgZmlsZQogICogQGZpbHA6IGZpbGUgKiBmcm9tIHRoZSBpb2N0bApAQCAtMjQ3OCwzICsyNTgzLDcyIEBACiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKIAlyZXR1cm4gcmV0OwogfQorCitpbnQgZHJtX21vZGVfcGFnZV9mbGlwX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fbW9kZV9jcnRjX3BhZ2VfZmxpcCAqcGFnZV9mbGlwID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmo7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiOworCXN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmUgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlpZiAocGFnZV9mbGlwLT5mbGFncyAmIH5EUk1fTU9ERV9QQUdFX0ZMSVBfRkxBR1MgfHwKKwkgICAgcGFnZV9mbGlwLT5yZXNlcnZlZCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCW9iaiA9IGRybV9tb2RlX29iamVjdF9maW5kKGRldiwgcGFnZV9mbGlwLT5jcnRjX2lkLCBEUk1fTU9ERV9PQkpFQ1RfQ1JUQyk7CisJaWYgKCFvYmopCisJCWdvdG8gb3V0OworCWNydGMgPSBvYmpfdG9fY3J0YyhvYmopOworCisJaWYgKGNydGMtPmZ1bmNzLT5wYWdlX2ZsaXAgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlvYmogPSBkcm1fbW9kZV9vYmplY3RfZmluZChkZXYsIHBhZ2VfZmxpcC0+ZmJfaWQsIERSTV9NT0RFX09CSkVDVF9GQik7CisJaWYgKCFvYmopCisJCWdvdG8gb3V0OworCWZiID0gb2JqX3RvX2ZiKG9iaik7CisKKwlpZiAocGFnZV9mbGlwLT5mbGFncyAmIERSTV9NT0RFX1BBR0VfRkxJUF9FVkVOVCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJCWlmIChmaWxlX3ByaXYtPmV2ZW50X3NwYWNlIDwgc2l6ZW9mIGUtPmV2ZW50KSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZpbGVfcHJpdi0+ZXZlbnRfc3BhY2UgLT0gc2l6ZW9mIGUtPmV2ZW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKworCQllID0ga3phbGxvYyhzaXplb2YgKmUsIEdGUF9LRVJORUwpOworCQlpZiAoZSA9PSBOVUxMKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJCQlmaWxlX3ByaXYtPmV2ZW50X3NwYWNlICs9IHNpemVvZiBlLT5ldmVudDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCQkJZ290byBvdXQ7CisJCX0KKworCQllLT5ldmVudC5iYXNlLnR5cGUgPSBEUk1fRVZFTlRfRkxJUF9DT01QTEVURTsKKwkJZS0+ZXZlbnQuYmFzZS5sZW5ndGggPSBzaXplb2YgZS0+ZXZlbnQ7CisJCWUtPmV2ZW50LnVzZXJfZGF0YSA9IHBhZ2VfZmxpcC0+dXNlcl9kYXRhOworCQllLT5iYXNlLmV2ZW50ID0gJmUtPmV2ZW50LmJhc2U7CisJCWUtPmJhc2UuZmlsZV9wcml2ID0gZmlsZV9wcml2OworCQllLT5iYXNlLmRlc3Ryb3kgPQorCQkJKHZvaWQgKCopIChzdHJ1Y3QgZHJtX3BlbmRpbmdfZXZlbnQgKikpIGtmcmVlOworCX0KKworCXJldCA9IGNydGMtPmZ1bmNzLT5wYWdlX2ZsaXAoY3J0YywgZmIsIGUpOworCWlmIChyZXQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCQlmaWxlX3ByaXYtPmV2ZW50X3NwYWNlICs9IHNpemVvZiBlLT5ldmVudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJCWtmcmVlKGUpOworCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Y19oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Y19oZWxwZXIuYwppbmRleCBiYmZkMTEwLi40MjMxZDZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGNfaGVscGVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjX2hlbHBlci5jCkBAIC0xMDksNyArMTA5LDcgQEAKIAogCWNvdW50ID0gKCpjb25uZWN0b3JfZnVuY3MtPmdldF9tb2RlcykoY29ubmVjdG9yKTsKIAlpZiAoIWNvdW50KSB7Ci0JCWNvdW50ID0gZHJtX2FkZF9tb2Rlc19ub2VkaWQoY29ubmVjdG9yLCA4MDAsIDYwMCk7CisJCWNvdW50ID0gZHJtX2FkZF9tb2Rlc19ub2VkaWQoY29ubmVjdG9yLCAxMDI0LCA3NjgpOwogCQlpZiAoIWNvdW50KQogCQkJcmV0dXJuIDA7CiAJfQpAQCAtMTAyMCw2ICsxMDIwLDkgQEAKIHsKIAlpbnQgY291bnQgPSAwOwogCisJLyogZGlzYWJsZSBhbGwgdGhlIHBvc3NpYmxlIG91dHB1dHMvY3J0Y3MgYmVmb3JlIGVudGVyaW5nIEtNUyBtb2RlICovCisJZHJtX2hlbHBlcl9kaXNhYmxlX3VudXNlZF9mdW5jdGlvbnMoZGV2KTsKKwogCWRybV9mYl9oZWxwZXJfcGFyc2VfY29tbWFuZF9saW5lKGRldik7CiAKIAljb3VudCA9IGRybV9oZWxwZXJfcHJvYmVfY29ubmVjdG9yX21vZGVzKGRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHBfaTJjX2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9kcF9pMmNfaGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4ODg3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHBfaTJjX2hlbHBlci5jCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDkgS2VpdGggUGFja2FyZAorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQKKyAqIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgbWFrZSBubyByZXByZXNlbnRhdGlvbnMKKyAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcworICogaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUyBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSAiZHJtX2RwX2hlbHBlci5oIgorI2luY2x1ZGUgImRybVAuaCIKKworLyogUnVuIGEgc2luZ2xlIEFVWF9DSCBJMkMgdHJhbnNhY3Rpb24sIHdyaXRpbmcvcmVhZGluZyBkYXRhIGFzIG5lY2Vzc2FyeSAqLworc3RhdGljIGludAoraTJjX2FsZ29fZHBfYXV4X3RyYW5zYWN0aW9uKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IG1vZGUsCisJCQkgICAgdWludDhfdCB3cml0ZV9ieXRlLCB1aW50OF90ICpyZWFkX2J5dGUpCit7CisJc3RydWN0IGkyY19hbGdvX2RwX2F1eF9kYXRhICphbGdvX2RhdGEgPSBhZGFwdGVyLT5hbGdvX2RhdGE7CisJaW50IHJldDsKKwkKKwlyZXQgPSAoKmFsZ29fZGF0YS0+YXV4X2NoKShhZGFwdGVyLCBtb2RlLAorCQkJCSAgIHdyaXRlX2J5dGUsIHJlYWRfYnl0ZSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEkyQyBvdmVyIEFVWCBDSAorICovCisKKy8qCisgKiBTZW5kIHRoZSBhZGRyZXNzLiBJZiB0aGUgSTJDIGxpbmsgaXMgcnVubmluZywgdGhpcyAncmVzdGFydHMnCisgKiB0aGUgY29ubmVjdGlvbiB3aXRoIHRoZSBuZXcgYWRkcmVzcywgdGhpcyBpcyB1c2VkIGZvciBkb2luZworICogYSB3cml0ZSBmb2xsb3dlZCBieSBhIHJlYWQgKGFzIG5lZWRlZCBmb3IgRERDKQorICovCitzdGF0aWMgaW50CitpMmNfYWxnb19kcF9hdXhfYWRkcmVzcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBhZGRyZXNzLCBib29sIHJlYWRpbmcpCit7CisJc3RydWN0IGkyY19hbGdvX2RwX2F1eF9kYXRhICphbGdvX2RhdGEgPSBhZGFwdGVyLT5hbGdvX2RhdGE7CisJaW50IG1vZGUgPSBNT0RFX0kyQ19TVEFSVDsKKwlpbnQgcmV0OworCisJaWYgKHJlYWRpbmcpCisJCW1vZGUgfD0gTU9ERV9JMkNfUkVBRDsKKwllbHNlCisJCW1vZGUgfD0gTU9ERV9JMkNfV1JJVEU7CisJYWxnb19kYXRhLT5hZGRyZXNzID0gYWRkcmVzczsKKwlhbGdvX2RhdGEtPnJ1bm5pbmcgPSB0cnVlOworCXJldCA9IGkyY19hbGdvX2RwX2F1eF90cmFuc2FjdGlvbihhZGFwdGVyLCBtb2RlLCAwLCBOVUxMKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogU3RvcCB0aGUgSTJDIHRyYW5zYWN0aW9uLiBUaGlzIGNsb3NlcyBvdXQgdGhlIGxpbmssIHNlbmRpbmcKKyAqIGEgYmFyZSBhZGRyZXNzIHBhY2tldCB3aXRoIHRoZSBNT1QgYml0IHR1cm5lZCBvZmYKKyAqLworc3RhdGljIHZvaWQKK2kyY19hbGdvX2RwX2F1eF9zdG9wKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgYm9vbCByZWFkaW5nKQoreworCXN0cnVjdCBpMmNfYWxnb19kcF9hdXhfZGF0YSAqYWxnb19kYXRhID0gYWRhcHRlci0+YWxnb19kYXRhOworCWludCBtb2RlID0gTU9ERV9JMkNfU1RPUDsKKworCWlmIChyZWFkaW5nKQorCQltb2RlIHw9IE1PREVfSTJDX1JFQUQ7CisJZWxzZQorCQltb2RlIHw9IE1PREVfSTJDX1dSSVRFOworCWlmIChhbGdvX2RhdGEtPnJ1bm5pbmcpIHsKKwkJKHZvaWQpIGkyY19hbGdvX2RwX2F1eF90cmFuc2FjdGlvbihhZGFwdGVyLCBtb2RlLCAwLCBOVUxMKTsKKwkJYWxnb19kYXRhLT5ydW5uaW5nID0gZmFsc2U7CisJfQorfQorCisvKgorICogV3JpdGUgYSBzaW5nbGUgYnl0ZSB0byB0aGUgY3VycmVudCBJMkMgYWRkcmVzcywgdGhlCisgKiB0aGUgSTJDIGxpbmsgbXVzdCBiZSBydW5uaW5nIG9yIHRoaXMgcmV0dXJucyAtRUlPCisgKi8KK3N0YXRpYyBpbnQKK2kyY19hbGdvX2RwX2F1eF9wdXRfYnl0ZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IGJ5dGUpCit7CisJc3RydWN0IGkyY19hbGdvX2RwX2F1eF9kYXRhICphbGdvX2RhdGEgPSBhZGFwdGVyLT5hbGdvX2RhdGE7CisJaW50IHJldDsKKworCWlmICghYWxnb19kYXRhLT5ydW5uaW5nKQorCQlyZXR1cm4gLUVJTzsKKworCXJldCA9IGkyY19hbGdvX2RwX2F1eF90cmFuc2FjdGlvbihhZGFwdGVyLCBNT0RFX0kyQ19XUklURSwgYnl0ZSwgTlVMTCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlYWQgYSBzaW5nbGUgYnl0ZSBmcm9tIHRoZSBjdXJyZW50IEkyQyBhZGRyZXNzLCB0aGUKKyAqIEkyQyBsaW5rIG11c3QgYmUgcnVubmluZyBvciB0aGlzIHJldHVybnMgLUVJTworICovCitzdGF0aWMgaW50CitpMmNfYWxnb19kcF9hdXhfZ2V0X2J5dGUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCB1OCAqYnl0ZV9yZXQpCit7CisJc3RydWN0IGkyY19hbGdvX2RwX2F1eF9kYXRhICphbGdvX2RhdGEgPSBhZGFwdGVyLT5hbGdvX2RhdGE7CisJaW50IHJldDsKKworCWlmICghYWxnb19kYXRhLT5ydW5uaW5nKQorCQlyZXR1cm4gLUVJTzsKKworCXJldCA9IGkyY19hbGdvX2RwX2F1eF90cmFuc2FjdGlvbihhZGFwdGVyLCBNT0RFX0kyQ19SRUFELCAwLCBieXRlX3JldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAoraTJjX2FsZ29fZHBfYXV4X3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAorCQkgICAgIHN0cnVjdCBpMmNfbXNnICptc2dzLAorCQkgICAgIGludCBudW0pCit7CisJaW50IHJldCA9IDA7CisJYm9vbCByZWFkaW5nID0gZmFsc2U7CisJaW50IG07CisJaW50IGI7CisKKwlmb3IgKG0gPSAwOyBtIDwgbnVtOyBtKyspIHsKKwkJdTE2IGxlbiA9IG1zZ3NbbV0ubGVuOworCQl1OCAqYnVmID0gbXNnc1ttXS5idWY7CisJCXJlYWRpbmcgPSAobXNnc1ttXS5mbGFncyAmIEkyQ19NX1JEKSAhPSAwOworCQlyZXQgPSBpMmNfYWxnb19kcF9hdXhfYWRkcmVzcyhhZGFwdGVyLCBtc2dzW21dLmFkZHIsIHJlYWRpbmcpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCQlpZiAocmVhZGluZykgeworCQkJZm9yIChiID0gMDsgYiA8IGxlbjsgYisrKSB7CisJCQkJcmV0ID0gaTJjX2FsZ29fZHBfYXV4X2dldF9ieXRlKGFkYXB0ZXIsICZidWZbYl0pOworCQkJCWlmIChyZXQgPCAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoYiA9IDA7IGIgPCBsZW47IGIrKykgeworCQkJCXJldCA9IGkyY19hbGdvX2RwX2F1eF9wdXRfYnl0ZShhZGFwdGVyLCBidWZbYl0pOworCQkJCWlmIChyZXQgPCAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCX0KKwlpZiAocmV0ID49IDApCisJCXJldCA9IG51bTsKKwlpMmNfYWxnb19kcF9hdXhfc3RvcChhZGFwdGVyLCByZWFkaW5nKTsKKwlEUk1fREVCVUdfS01TKCJkcF9hdXhfeGZlciByZXR1cm4gJWRcbiIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUzMgoraTJjX2FsZ29fZHBfYXV4X2Z1bmN0aW9uYWxpdHkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19FTVVMIHwKKwkgICAgICAgSTJDX0ZVTkNfU01CVVNfUkVBRF9CTE9DS19EQVRBIHwKKwkgICAgICAgSTJDX0ZVTkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMIHwKKwkgICAgICAgSTJDX0ZVTkNfMTBCSVRfQUREUjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIGkyY19kcF9hdXhfYWxnbyA9IHsKKwkubWFzdGVyX3hmZXIJPSBpMmNfYWxnb19kcF9hdXhfeGZlciwKKwkuZnVuY3Rpb25hbGl0eQk9IGkyY19hbGdvX2RwX2F1eF9mdW5jdGlvbmFsaXR5LAorfTsKKworc3RhdGljIHZvaWQKK2kyY19kcF9hdXhfcmVzZXRfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwkodm9pZCkgaTJjX2FsZ29fZHBfYXV4X2FkZHJlc3MoYWRhcHRlciwgMCwgZmFsc2UpOworCSh2b2lkKSBpMmNfYWxnb19kcF9hdXhfc3RvcChhZGFwdGVyLCBmYWxzZSk7CisJCQkJCSAgIAorfQorCitzdGF0aWMgaW50CitpMmNfZHBfYXV4X3ByZXBhcmVfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlhZGFwdGVyLT5hbGdvID0gJmkyY19kcF9hdXhfYWxnbzsKKwlhZGFwdGVyLT5yZXRyaWVzID0gMzsKKwlpMmNfZHBfYXV4X3Jlc2V0X2J1cyhhZGFwdGVyKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitpMmNfZHBfYXV4X2FkZF9idXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWludCBlcnJvcjsKKwkKKwllcnJvciA9IGkyY19kcF9hdXhfcHJlcGFyZV9idXMoYWRhcHRlcik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJZXJyb3IgPSBpMmNfYWRkX2FkYXB0ZXIoYWRhcHRlcik7CisJcmV0dXJuIGVycm9yOworfQorRVhQT1JUX1NZTUJPTChpMmNfZHBfYXV4X2FkZF9idXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHJ2LmMKaW5kZXggYTc1Y2E2My4uZmYyZjEwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2Rydi5jCkBAIC0xNDUsNiArMTQ1LDggQEAKIAlEUk1fSU9DVExfREVGKERSTV9JT0NUTF9NT0RFX0dFVEZCLCBkcm1fbW9kZV9nZXRmYiwgRFJNX01BU1RFUnxEUk1fQ09OVFJPTF9BTExPVyksCiAJRFJNX0lPQ1RMX0RFRihEUk1fSU9DVExfTU9ERV9BRERGQiwgZHJtX21vZGVfYWRkZmIsIERSTV9NQVNURVJ8RFJNX0NPTlRST0xfQUxMT1cpLAogCURSTV9JT0NUTF9ERUYoRFJNX0lPQ1RMX01PREVfUk1GQiwgZHJtX21vZGVfcm1mYiwgRFJNX01BU1RFUnxEUk1fQ09OVFJPTF9BTExPVyksCisJRFJNX0lPQ1RMX0RFRihEUk1fSU9DVExfTU9ERV9QQUdFX0ZMSVAsIGRybV9tb2RlX3BhZ2VfZmxpcF9pb2N0bCwgRFJNX01BU1RFUnxEUk1fQ09OVFJPTF9BTExPVyksCisJRFJNX0lPQ1RMX0RFRihEUk1fSU9DVExfTU9ERV9ESVJUWUZCLCBkcm1fbW9kZV9kaXJ0eWZiX2lvY3RsLCBEUk1fTUFTVEVSfERSTV9DT05UUk9MX0FMTE9XKQogfTsKIAogI2RlZmluZSBEUk1fQ09SRV9JT0NUTF9DT1VOVAlBUlJBWV9TSVpFKCBkcm1faW9jdGxzICkKQEAgLTM2Niw2ICszNjgsMjkgQEAKIG1vZHVsZV9leGl0KGRybV9jb3JlX2V4aXQpOwogCiAvKioKKyAqIENvcHkgYW5kIElPQ1RMIHJldHVybiBzdHJpbmcgdG8gdXNlciBzcGFjZQorICovCitzdGF0aWMgaW50IGRybV9jb3B5X2ZpZWxkKGNoYXIgKmJ1Ziwgc2l6ZV90ICpidWZfbGVuLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpbnQgbGVuOworCisJLyogZG9uJ3Qgb3ZlcmZsb3cgdXNlcmJ1ZiAqLworCWxlbiA9IHN0cmxlbih2YWx1ZSk7CisJaWYgKGxlbiA+ICpidWZfbGVuKQorCQlsZW4gPSAqYnVmX2xlbjsKKworCS8qIGxldCB1c2Vyc3BhY2Uga25vdyBleGFjdCBsZW5ndGggb2YgZHJpdmVyIHZhbHVlICh3aGljaCBjb3VsZCBiZQorCSAqIGxhcmdlciB0aGFuIHRoZSB1c2Vyc3BhY2Utc3VwcGxpZWQgYnVmZmVyKSAqLworCSpidWZfbGVuID0gc3RybGVuKHZhbHVlKTsKKworCS8qIGZpbmFsbHksIHRyeSBmaWxsaW5nIGluIHRoZSB1c2VyYnVmICovCisJaWYgKGxlbiAmJiBidWYpCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCB2YWx1ZSwgbGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKioKICAqIEdldCB2ZXJzaW9uIGluZm9ybWF0aW9uCiAgKgogICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KQEAgLTM4MCwxNiArNDA1LDIxIEBACiAJCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlzdHJ1Y3QgZHJtX3ZlcnNpb24gKnZlcnNpb24gPSBkYXRhOwotCWludCBsZW47CisJaW50IGVycjsKIAogCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBkZXYtPmRyaXZlci0+bWFqb3I7CiAJdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IGRldi0+ZHJpdmVyLT5taW5vcjsKIAl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBkZXYtPmRyaXZlci0+cGF0Y2hsZXZlbDsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5uYW1lLCBkZXYtPmRyaXZlci0+bmFtZSk7Ci0JRFJNX0NPUFkodmVyc2lvbi0+ZGF0ZSwgZGV2LT5kcml2ZXItPmRhdGUpOwotCURSTV9DT1BZKHZlcnNpb24tPmRlc2MsIGRldi0+ZHJpdmVyLT5kZXNjKTsKKwllcnIgPSBkcm1fY29weV9maWVsZCh2ZXJzaW9uLT5uYW1lLCAmdmVyc2lvbi0+bmFtZV9sZW4sCisJCQlkZXYtPmRyaXZlci0+bmFtZSk7CisJaWYgKCFlcnIpCisJCWVyciA9IGRybV9jb3B5X2ZpZWxkKHZlcnNpb24tPmRhdGUsICZ2ZXJzaW9uLT5kYXRlX2xlbiwKKwkJCQlkZXYtPmRyaXZlci0+ZGF0ZSk7CisJaWYgKCFlcnIpCisJCWVyciA9IGRybV9jb3B5X2ZpZWxkKHZlcnNpb24tPmRlc2MsICZ2ZXJzaW9uLT5kZXNjX2xlbiwKKwkJCQlkZXYtPmRyaXZlci0+ZGVzYyk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMKaW5kZXggYjU0YmE2My4uYzM5YjI2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMKQEAgLTEyMywxOCArMTIzLDIwIEBACiAgKi8KIHN0YXRpYyBib29sIGVkaWRfaXNfdmFsaWQoc3RydWN0IGVkaWQgKmVkaWQpCiB7Ci0JaW50IGk7CisJaW50IGksIHNjb3JlID0gMDsKIAl1OCBjc3VtID0gMDsKIAl1OCAqcmF3X2VkaWQgPSAodTggKillZGlkOwogCi0JaWYgKG1lbWNtcChlZGlkLT5oZWFkZXIsIGVkaWRfaGVhZGVyLCBzaXplb2YoZWRpZF9oZWFkZXIpKSkKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGVkaWRfaGVhZGVyKTsgaSsrKQorCQlpZiAocmF3X2VkaWRbaV0gPT0gZWRpZF9oZWFkZXJbaV0pCisJCQlzY29yZSsrOworCisJaWYgKHNjb3JlID09IDgpIDsKKwllbHNlIGlmIChzY29yZSA+PSA2KSB7CisJCURSTV9ERUJVRygiRml4aW5nIEVESUQgaGVhZGVyLCB5b3VyIGhhcmR3YXJlIG1heSBiZSBmYWlsaW5nXG4iKTsKKwkJbWVtY3B5KHJhd19lZGlkLCBlZGlkX2hlYWRlciwgc2l6ZW9mKGVkaWRfaGVhZGVyKSk7CisJfSBlbHNlCiAJCWdvdG8gYmFkOwotCWlmIChlZGlkLT52ZXJzaW9uICE9IDEpIHsKLQkJRFJNX0VSUk9SKCJFRElEIGhhcyBtYWpvciB2ZXJzaW9uICVkLCBpbnN0ZWFkIG9mIDFcbiIsIGVkaWQtPnZlcnNpb24pOwotCQlnb3RvIGJhZDsKLQl9Ci0JaWYgKGVkaWQtPnJldmlzaW9uID4gNCkKLQkJRFJNX0RFQlVHKCJFRElEIG1pbm9yID4gNCwgYXNzdW1pbmcgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgRURJRF9MRU5HVEg7IGkrKykKIAkJY3N1bSArPSByYXdfZWRpZFtpXTsKQEAgLTE0Myw2ICsxNDUsMTQgQEAKIAkJZ290byBiYWQ7CiAJfQogCisJaWYgKGVkaWQtPnZlcnNpb24gIT0gMSkgeworCQlEUk1fRVJST1IoIkVESUQgaGFzIG1ham9yIHZlcnNpb24gJWQsIGluc3RlYWQgb2YgMVxuIiwgZWRpZC0+dmVyc2lvbik7CisJCWdvdG8gYmFkOworCX0KKworCWlmIChlZGlkLT5yZXZpc2lvbiA+IDQpCisJCURSTV9ERUJVRygiRURJRCBtaW5vciA+IDQsIGFzc3VtaW5nIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiIpOworCiAJcmV0dXJuIDE7CiAKIGJhZDoKQEAgLTQ4MSwxNiArNDkxLDE3IEBACiAJCSAgIDMwNDgsIDM1MzYsIDAsIDE2MDAsIDE2MDMsIDE2MDksIDE2ODIsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCiB9Oworc3RhdGljIGNvbnN0IGludCBkcm1fbnVtX2RtdF9tb2RlcyA9CisJc2l6ZW9mKGRybV9kbXRfbW9kZXMpIC8gc2l6ZW9mKHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlKTsKIAogc3RhdGljIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkcm1fZmluZF9kbXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCWludCBoc2l6ZSwgaW50IHZzaXplLCBpbnQgZnJlc2gpCiB7Ci0JaW50IGksIGNvdW50OworCWludCBpOwogCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpwdHIsICptb2RlOwogCi0JY291bnQgPSBzaXplb2YoZHJtX2RtdF9tb2RlcykgLyBzaXplb2Yoc3RydWN0IGRybV9kaXNwbGF5X21vZGUpOwogCW1vZGUgPSBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGRybV9udW1fZG10X21vZGVzOyBpKyspIHsKIAkJcHRyID0gJmRybV9kbXRfbW9kZXNbaV07CiAJCWlmIChoc2l6ZSA9PSBwdHItPmhkaXNwbGF5ICYmCiAJCQl2c2l6ZSA9PSBwdHItPnZkaXNwbGF5ICYmCkBAIC04MzQsOCArODQ1LDE2NSBAQAogCXJldHVybiBtb2RlczsKIH0KIAorLyoKKyAqIFhYWCBmaXggdGhpcyBmb3I6CisgKiAtIEdURiBzZWNvbmRhcnkgY3VydmUgZm9ybXVsYQorICogLSBFRElEIDEuNCByYW5nZSBvZmZzZXRzCisgKiAtIENWVCBleHRlbmRlZCBiaXRzCisgKi8KK3N0YXRpYyBib29sCittb2RlX2luX3JhbmdlKHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLCBzdHJ1Y3QgZGV0YWlsZWRfdGltaW5nICp0aW1pbmcpCit7CisJc3RydWN0IGRldGFpbGVkX2RhdGFfbW9uaXRvcl9yYW5nZSAqcmFuZ2U7CisJaW50IGhzeW5jLCB2cmVmcmVzaDsKKworCXJhbmdlID0gJnRpbWluZy0+ZGF0YS5vdGhlcl9kYXRhLmRhdGEucmFuZ2U7CisKKwloc3luYyA9IGRybV9tb2RlX2hzeW5jKG1vZGUpOworCXZyZWZyZXNoID0gZHJtX21vZGVfdnJlZnJlc2gobW9kZSk7CisKKwlpZiAoaHN5bmMgPCByYW5nZS0+bWluX2hmcmVxX2toeiB8fCBoc3luYyA+IHJhbmdlLT5tYXhfaGZyZXFfa2h6KQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAodnJlZnJlc2ggPCByYW5nZS0+bWluX3ZmcmVxIHx8IHZyZWZyZXNoID4gcmFuZ2UtPm1heF92ZnJlcSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKHJhbmdlLT5waXhlbF9jbG9ja19taHogJiYgcmFuZ2UtPnBpeGVsX2Nsb2NrX21oeiAhPSAweGZmKSB7CisJCS8qIGJlIGZvcmdpdmluZyBzaW5jZSBpdCdzIGluIHVuaXRzIG9mIDEwTUh6ICovCisJCWludCBtYXhfY2xvY2sgPSByYW5nZS0+cGl4ZWxfY2xvY2tfbWh6ICogMTAgKyA5OworCQltYXhfY2xvY2sgKj0gMTAwMDsKKwkJaWYgKG1vZGUtPmNsb2NrID4gbWF4X2Nsb2NrKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCisvKgorICogWFhYIElmIGRybV9kbXRfbW9kZXMgZXZlciByZWdyb3dzIHRoZSBDVlQtUiBtb2RlcyAoYW5kIGl0IHdpbGwpIHRoaXMgd2lsbAorICogbmVlZCB0byBhY2NvdW50IGZvciB0aGVtLgorICovCitzdGF0aWMgaW50IGRybV9ndGZfbW9kZXNfZm9yX3JhbmdlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJICAgc3RydWN0IGRldGFpbGVkX3RpbWluZyAqdGltaW5nKQoreworCWludCBpLCBtb2RlcyA9IDA7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm5ld21vZGU7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCisJZm9yIChpID0gMDsgaSA8IGRybV9udW1fZG10X21vZGVzOyBpKyspIHsKKwkJaWYgKG1vZGVfaW5fcmFuZ2UoZHJtX2RtdF9tb2RlcyArIGksIHRpbWluZykpIHsKKwkJCW5ld21vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCAmZHJtX2RtdF9tb2Rlc1tpXSk7CisJCQlpZiAobmV3bW9kZSkgeworCQkJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBuZXdtb2RlKTsKKwkJCQltb2RlcysrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIG1vZGVzOworfQorCitzdGF0aWMgaW50IGRybV9jdnRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCSBzdHJ1Y3QgZGV0YWlsZWRfdGltaW5nICp0aW1pbmcpCit7CisJaW50IGksIGosIG1vZGVzID0gMDsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbmV3bW9kZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IGN2dF90aW1pbmcgKmN2dDsKKwljb25zdCBpbnQgcmF0ZXNbXSA9IHsgNjAsIDg1LCA3NSwgNjAsIDUwIH07CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWludCB3aWR0aCwgaGVpZ2h0OworCQljdnQgPSAmKHRpbWluZy0+ZGF0YS5vdGhlcl9kYXRhLmRhdGEuY3Z0W2ldKTsKKworCQloZWlnaHQgPSAoY3Z0LT5jb2RlWzBdICsgKChjdnQtPmNvZGVbMV0gJiAweGYwKSA8PCA4KSArIDEpICogMjsKKwkJc3dpdGNoIChjdnQtPmNvZGVbMV0gJiAweGMwKSB7CisJCWNhc2UgMHgwMDoKKwkJCXdpZHRoID0gaGVpZ2h0ICogNCAvIDM7CisJCQlicmVhazsKKwkJY2FzZSAweDQwOgorCQkJd2lkdGggPSBoZWlnaHQgKiAxNiAvIDk7CisJCQlicmVhazsKKwkJY2FzZSAweDgwOgorCQkJd2lkdGggPSBoZWlnaHQgKiAxNiAvIDEwOworCQkJYnJlYWs7CisJCWNhc2UgMHhjMDoKKwkJCXdpZHRoID0gaGVpZ2h0ICogMTUgLyA5OworCQkJYnJlYWs7CisJCX0KKworCQlmb3IgKGogPSAxOyBqIDwgNTsgaisrKSB7CisJCQlpZiAoY3Z0LT5jb2RlWzJdICYgKDEgPDwgaikpIHsKKwkJCQluZXdtb2RlID0gZHJtX2N2dF9tb2RlKGRldiwgd2lkdGgsIGhlaWdodCwKKwkJCQkJCSAgICAgICByYXRlc1tqXSwgaiA9PSAwLAorCQkJCQkJICAgICAgIGZhbHNlLCBmYWxzZSk7CisJCQkJaWYgKG5ld21vZGUpIHsKKwkJCQkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG5ld21vZGUpOworCQkJCQltb2RlcysrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBtb2RlczsKK30KKworc3RhdGljIGludCBhZGRfZGV0YWlsZWRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCSAgICAgIHN0cnVjdCBkZXRhaWxlZF90aW1pbmcgKnRpbWluZywKKwkJCSAgICAgIHN0cnVjdCBlZGlkICplZGlkLCB1MzIgcXVpcmtzLCBpbnQgcHJlZmVycmVkKQoreworCWludCBpLCBtb2RlcyA9IDA7CisJc3RydWN0IGRldGFpbGVkX25vbl9waXhlbCAqZGF0YSA9ICZ0aW1pbmctPmRhdGEub3RoZXJfZGF0YTsKKwlpbnQgdGltaW5nX2xldmVsID0gc3RhbmRhcmRfdGltaW5nX2xldmVsKGVkaWQpOworCWludCBndGYgPSAoZWRpZC0+ZmVhdHVyZXMgJiBEUk1fRURJRF9GRUFUVVJFX0RFRkFVTFRfR1RGKTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbmV3bW9kZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisKKwlpZiAodGltaW5nLT5waXhlbF9jbG9jaykgeworCQluZXdtb2RlID0gZHJtX21vZGVfZGV0YWlsZWQoZGV2LCBlZGlkLCB0aW1pbmcsIHF1aXJrcyk7CisJCWlmICghbmV3bW9kZSkKKwkJCXJldHVybiAwOworCisJCWlmIChwcmVmZXJyZWQpCisJCQluZXdtb2RlLT50eXBlIHw9IERSTV9NT0RFX1RZUEVfUFJFRkVSUkVEOworCisJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBuZXdtb2RlKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogb3RoZXIgdGltaW5nIHR5cGVzICovCisJc3dpdGNoIChkYXRhLT50eXBlKSB7CisJY2FzZSBFRElEX0RFVEFJTF9NT05JVE9SX1JBTkdFOgorCQlpZiAoZ3RmKQorCQkJbW9kZXMgKz0gZHJtX2d0Zl9tb2Rlc19mb3JfcmFuZ2UoY29ubmVjdG9yLCB0aW1pbmcpOworCQlicmVhazsKKwljYXNlIEVESURfREVUQUlMX1NURF9NT0RFUzoKKwkJLyogU2l4IG1vZGVzIHBlciBkZXRhaWxlZCBzZWN0aW9uICovCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCXN0cnVjdCBzdGRfdGltaW5nICpzdGQ7CisJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbmV3bW9kZTsKKworCQkJc3RkID0gJmRhdGEtPmRhdGEudGltaW5nc1tpXTsKKwkJCW5ld21vZGUgPSBkcm1fbW9kZV9zdGQoZGV2LCBzdGQsIGVkaWQtPnJldmlzaW9uLAorCQkJCQkgICAgICAgdGltaW5nX2xldmVsKTsKKwkJCWlmIChuZXdtb2RlKSB7CisJCQkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG5ld21vZGUpOworCQkJCW1vZGVzKys7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFRElEX0RFVEFJTF9DVlRfM0JZVEU6CisJCW1vZGVzICs9IGRybV9jdnRfbW9kZXMoY29ubmVjdG9yLCB0aW1pbmcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gbW9kZXM7Cit9CisKIC8qKgotICogYWRkX2RldGFpbGVkX21vZGVzIC0gZ2V0IGRldGFpbGVkIG1vZGUgaW5mbyBmcm9tIEVESUQgZGF0YQorICogYWRkX2RldGFpbGVkX2luZm8gLSBnZXQgZGV0YWlsZWQgbW9kZSBpbmZvIGZyb20gRURJRCBkYXRhCiAgKiBAY29ubmVjdG9yOiBhdHRhY2hlZCBjb25uZWN0b3IKICAqIEBlZGlkOiBFRElEIGJsb2NrIHRvIHNjYW4KICAqIEBxdWlya3M6IHF1aXJrcyB0byBhcHBseQpAQCAtODQ2LDY3ICsxMDE0LDI0IEBACiBzdGF0aWMgaW50IGFkZF9kZXRhaWxlZF9pbmZvKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCiAJCQkgICAgIHN0cnVjdCBlZGlkICplZGlkLCB1MzIgcXVpcmtzKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKLQlpbnQgaSwgaiwgbW9kZXMgPSAwOwotCWludCB0aW1pbmdfbGV2ZWw7Ci0KLQl0aW1pbmdfbGV2ZWwgPSBzdGFuZGFyZF90aW1pbmdfbGV2ZWwoZWRpZCk7CisJaW50IGksIG1vZGVzID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBFRElEX0RFVEFJTEVEX1RJTUlOR1M7IGkrKykgewogCQlzdHJ1Y3QgZGV0YWlsZWRfdGltaW5nICp0aW1pbmcgPSAmZWRpZC0+ZGV0YWlsZWRfdGltaW5nc1tpXTsKLQkJc3RydWN0IGRldGFpbGVkX25vbl9waXhlbCAqZGF0YSA9ICZ0aW1pbmctPmRhdGEub3RoZXJfZGF0YTsKLQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm5ld21vZGU7CisJCWludCBwcmVmZXJyZWQgPSAoaSA9PSAwKSAmJiAoZWRpZC0+ZmVhdHVyZXMgJiBEUk1fRURJRF9GRUFUVVJFX1BSRUZFUlJFRF9USU1JTkcpOwogCi0JCS8qIFggc2VydmVyIGNoZWNrIGlzIHZlcnNpb24gMS4xIG9yIGhpZ2hlciAqLwotCQlpZiAoZWRpZC0+dmVyc2lvbiA9PSAxICYmIGVkaWQtPnJldmlzaW9uID49IDEgJiYKLQkJICAgICF0aW1pbmctPnBpeGVsX2Nsb2NrKSB7Ci0JCQkvKiBPdGhlciB0aW1pbmcgb3IgaW5mbyAqLwotCQkJc3dpdGNoIChkYXRhLT50eXBlKSB7Ci0JCQljYXNlIEVESURfREVUQUlMX01PTklUT1JfU0VSSUFMOgotCQkJCWJyZWFrOwotCQkJY2FzZSBFRElEX0RFVEFJTF9NT05JVE9SX1NUUklORzoKLQkJCQlicmVhazsKLQkJCWNhc2UgRURJRF9ERVRBSUxfTU9OSVRPUl9SQU5HRToKLQkJCQkvKiBHZXQgbW9uaXRvciByYW5nZSBkYXRhICovCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEVESURfREVUQUlMX01PTklUT1JfTkFNRToKLQkJCQlicmVhazsKLQkJCWNhc2UgRURJRF9ERVRBSUxfTU9OSVRPUl9DUERBVEE6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVESURfREVUQUlMX1NURF9NT0RFUzoKLQkJCQlmb3IgKGogPSAwOyBqIDwgNjsgaSsrKSB7Ci0JCQkJCXN0cnVjdCBzdGRfdGltaW5nICpzdGQ7Ci0JCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpuZXdtb2RlOworCQkvKiBJbiAxLjAsIG9ubHkgdGltaW5ncyBhcmUgYWxsb3dlZCAqLworCQlpZiAoIXRpbWluZy0+cGl4ZWxfY2xvY2sgJiYgZWRpZC0+dmVyc2lvbiA9PSAxICYmCisJCQllZGlkLT5yZXZpc2lvbiA9PSAwKQorCQkJY29udGludWU7CiAKLQkJCQkJc3RkID0gJmRhdGEtPmRhdGEudGltaW5nc1tqXTsKLQkJCQkJbmV3bW9kZSA9IGRybV9tb2RlX3N0ZChkZXYsIHN0ZCwKLQkJCQkJCQkgICAgICAgZWRpZC0+cmV2aXNpb24sCi0JCQkJCQkJICAgICAgIHRpbWluZ19sZXZlbCk7Ci0JCQkJCWlmIChuZXdtb2RlKSB7Ci0JCQkJCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbmV3bW9kZSk7Ci0JCQkJCQltb2RlcysrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW5ld21vZGUgPSBkcm1fbW9kZV9kZXRhaWxlZChkZXYsIGVkaWQsIHRpbWluZywgcXVpcmtzKTsKLQkJCWlmICghbmV3bW9kZSkKLQkJCQljb250aW51ZTsKLQotCQkJLyogRmlyc3QgZGV0YWlsZWQgbW9kZSBpcyBwcmVmZXJyZWQgKi8KLQkJCWlmIChpID09IDAgJiYgKGVkaWQtPmZlYXR1cmVzICYgRFJNX0VESURfRkVBVFVSRV9QUkVGRVJSRURfVElNSU5HKSkKLQkJCQluZXdtb2RlLT50eXBlIHw9IERSTV9NT0RFX1RZUEVfUFJFRkVSUkVEOwotCQkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG5ld21vZGUpOwotCi0JCQltb2RlcysrOwotCQl9CisJCW1vZGVzICs9IGFkZF9kZXRhaWxlZF9tb2Rlcyhjb25uZWN0b3IsIHRpbWluZywgZWRpZCwgcXVpcmtzLAorCQkJCQkgICAgcHJlZmVycmVkKTsKIAl9CiAKIAlyZXR1cm4gbW9kZXM7CiB9CisKIC8qKgogICogYWRkX2RldGFpbGVkX21vZGVfZWVkaWQgLSBnZXQgZGV0YWlsZWQgbW9kZSBpbmZvIGZyb20gYWRkdGlvbmFsIHRpbWluZwogICogCQkJRURJRCBibG9jawpAQCAtOTIwLDEyICsxMDQ1LDkgQEAKIHN0YXRpYyBpbnQgYWRkX2RldGFpbGVkX2luZm9fZWVkaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKIAkJCSAgICAgc3RydWN0IGVkaWQgKmVkaWQsIHUzMiBxdWlya3MpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OwotCWludCBpLCBqLCBtb2RlcyA9IDA7CisJaW50IGksIG1vZGVzID0gMDsKIAljaGFyICplZGlkX2V4dCA9IE5VTEw7CiAJc3RydWN0IGRldGFpbGVkX3RpbWluZyAqdGltaW5nOwotCXN0cnVjdCBkZXRhaWxlZF9ub25fcGl4ZWwgKmRhdGE7Ci0Jc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm5ld21vZGU7CiAJaW50IGVkaWRfZXh0X251bTsKIAlpbnQgc3RhcnRfb2Zmc2V0LCBlbmRfb2Zmc2V0OwogCWludCB0aW1pbmdfbGV2ZWw7CkBAIC05NzYsNTEgKzEwOTgsNyBAQAogCWZvciAoaSA9IHN0YXJ0X29mZnNldDsgaSA8IGVuZF9vZmZzZXQ7CiAJCQlpICs9IHNpemVvZihzdHJ1Y3QgZGV0YWlsZWRfdGltaW5nKSkgewogCQl0aW1pbmcgPSAoc3RydWN0IGRldGFpbGVkX3RpbWluZyAqKShlZGlkX2V4dCArIGkpOwotCQlkYXRhID0gJnRpbWluZy0+ZGF0YS5vdGhlcl9kYXRhOwotCQkvKiBEZXRhaWxlZCBtb2RlIHRpbWluZyAqLwotCQlpZiAodGltaW5nLT5waXhlbF9jbG9jaykgewotCQkJbmV3bW9kZSA9IGRybV9tb2RlX2RldGFpbGVkKGRldiwgZWRpZCwgdGltaW5nLCBxdWlya3MpOwotCQkJaWYgKCFuZXdtb2RlKQotCQkJCWNvbnRpbnVlOwotCi0JCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbmV3bW9kZSk7Ci0KLQkJCW1vZGVzKys7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIE90aGVyIHRpbWluZyBvciBpbmZvICovCi0JCXN3aXRjaCAoZGF0YS0+dHlwZSkgewotCQljYXNlIEVESURfREVUQUlMX01PTklUT1JfU0VSSUFMOgotCQkJYnJlYWs7Ci0JCWNhc2UgRURJRF9ERVRBSUxfTU9OSVRPUl9TVFJJTkc6Ci0JCQlicmVhazsKLQkJY2FzZSBFRElEX0RFVEFJTF9NT05JVE9SX1JBTkdFOgotCQkJLyogR2V0IG1vbml0b3IgcmFuZ2UgZGF0YSAqLwotCQkJYnJlYWs7Ci0JCWNhc2UgRURJRF9ERVRBSUxfTU9OSVRPUl9OQU1FOgotCQkJYnJlYWs7Ci0JCWNhc2UgRURJRF9ERVRBSUxfTU9OSVRPUl9DUERBVEE6Ci0JCQlicmVhazsKLQkJY2FzZSBFRElEX0RFVEFJTF9TVERfTU9ERVM6Ci0JCQkvKiBGaXZlIG1vZGVzIHBlciBkZXRhaWxlZCBzZWN0aW9uICovCi0JCQlmb3IgKGogPSAwOyBqIDwgNTsgaSsrKSB7Ci0JCQkJc3RydWN0IHN0ZF90aW1pbmcgKnN0ZDsKLQkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbmV3bW9kZTsKLQotCQkJCXN0ZCA9ICZkYXRhLT5kYXRhLnRpbWluZ3Nbal07Ci0JCQkJbmV3bW9kZSA9IGRybV9tb2RlX3N0ZChkZXYsIHN0ZCwKLQkJCQkJCSAgICAgICBlZGlkLT5yZXZpc2lvbiwKLQkJCQkJCSAgICAgICB0aW1pbmdfbGV2ZWwpOwotCQkJCWlmIChuZXdtb2RlKSB7Ci0JCQkJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBuZXdtb2RlKTsKLQkJCQkJbW9kZXMrKzsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9CisJCW1vZGVzICs9IGFkZF9kZXRhaWxlZF9tb2Rlcyhjb25uZWN0b3IsIHRpbWluZywgZWRpZCwgcXVpcmtzLCAwKTsKIAl9CiAKIAlyZXR1cm4gbW9kZXM7CkBAIC0xMDY2LDE5ICsxMTQ0LDE5IEBACiAJCQkgICAgIHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKIAkJCSAgICAgY2hhciAqYnVmLCBpbnQgbGVuKQogewotCWludCByZXQ7CisJaW50IGk7CiAKLQlyZXQgPSBkcm1fZG9fcHJvYmVfZGRjX2VkaWQoYWRhcHRlciwgYnVmLCBsZW4pOwotCWlmIChyZXQgIT0gMCkgewotCQlnb3RvIGVuZDsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmIChkcm1fZG9fcHJvYmVfZGRjX2VkaWQoYWRhcHRlciwgYnVmLCBsZW4pKQorCQkJcmV0dXJuIC0xOworCQlpZiAoZWRpZF9pc192YWxpZCgoc3RydWN0IGVkaWQgKilidWYpKQorCQkJcmV0dXJuIDA7CiAJfQotCWlmICghZWRpZF9pc192YWxpZCgoc3RydWN0IGVkaWQgKilidWYpKSB7Ci0JCWRldl93YXJuKCZjb25uZWN0b3ItPmRldi0+cGRldi0+ZGV2LCAiJXM6IEVESUQgaW52YWxpZC5cbiIsCi0JCQkgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKLQkJcmV0ID0gLTE7Ci0JfQotZW5kOgotCXJldHVybiByZXQ7CisKKwkvKiByZXBlYXRlZCBjaGVja3N1bSBmYWlsdXJlczsgd2FybiwgYnV0IGNhcnJ5IG9uICovCisJZGV2X3dhcm4oJmNvbm5lY3Rvci0+ZGV2LT5wZGV2LT5kZXYsICIlczogRURJRCBpbnZhbGlkLlxuIiwKKwkJIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJcmV0dXJuIC0xOwogfQogCiAvKioKQEAgLTEyOTYsNiArMTM3NCw4IEBACiAJCQkJCXB0ci0+dmRpc3BsYXkgPiB2ZGlzcGxheSkKIAkJCQljb250aW51ZTsKIAkJfQorCQlpZiAoZHJtX21vZGVfdnJlZnJlc2gocHRyKSA+IDYxKQorCQkJY29udGludWU7CiAJCW1vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCBwdHIpOwogCQlpZiAobW9kZSkgewogCQkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG1vZGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMKaW5kZXggNjVlZjAxMS4uMWI0OWZhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCkBAIC0zNzMsMTEgKzM3Myw5IEBACiAJCQkJCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CiAJCQkJfQogCQkJfQotCQkJaWYgKGRwbXNfbW9kZSA9PSBEUk1fTU9ERV9EUE1TX09GRikgewotCQkJCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOwotCQkJCWNydGNfZnVuY3MtPmRwbXMoY3J0YywgZHBtc19tb2RlKTsKLQkJCQltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOwotCQkJfQorCQkJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJCQljcnRjX2Z1bmNzLT5kcG1zKGNydGMsIERSTV9NT0RFX0RQTVNfT0ZGKTsKKwkJCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CiAJCX0KIAl9CiB9CkBAIC0zODUsMTggKzM4MywyMyBAQAogaW50IGRybV9mYl9oZWxwZXJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKIAlzd2l0Y2ggKGJsYW5rKSB7CisJLyogRGlzcGxheTogT247IEhTeW5jOiBPbiwgVlN5bmM6IE9uICovCiAJY2FzZSBGQl9CTEFOS19VTkJMQU5LOgogCQlkcm1fZmJfaGVscGVyX29uKGluZm8pOwogCQlicmVhazsKKwkvKiBEaXNwbGF5OiBPZmY7IEhTeW5jOiBPbiwgVlN5bmM6IE9uICovCiAJY2FzZSBGQl9CTEFOS19OT1JNQUw6Ci0JCWRybV9mYl9oZWxwZXJfb2ZmKGluZm8sIERSTV9NT0RFX0RQTVNfU1RBTkRCWSk7CisJCWRybV9mYl9oZWxwZXJfb2ZmKGluZm8sIERSTV9NT0RFX0RQTVNfT04pOwogCQlicmVhazsKKwkvKiBEaXNwbGF5OiBPZmY7IEhTeW5jOiBPZmYsIFZTeW5jOiBPbiAqLwogCWNhc2UgRkJfQkxBTktfSFNZTkNfU1VTUEVORDoKIAkJZHJtX2ZiX2hlbHBlcl9vZmYoaW5mbywgRFJNX01PREVfRFBNU19TVEFOREJZKTsKIAkJYnJlYWs7CisJLyogRGlzcGxheTogT2ZmOyBIU3luYzogT24sIFZTeW5jOiBPZmYgKi8KIAljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6CiAJCWRybV9mYl9oZWxwZXJfb2ZmKGluZm8sIERSTV9NT0RFX0RQTVNfU1VTUEVORCk7CiAJCWJyZWFrOworCS8qIERpc3BsYXk6IE9mZjsgSFN5bmM6IE9mZiwgVlN5bmM6IE9mZiAqLwogCWNhc2UgRkJfQkxBTktfUE9XRVJET1dOOgogCQlkcm1fZmJfaGVscGVyX29mZihpbmZvLCBEUk1fTU9ERV9EUE1TX09GRik7CiAJCWJyZWFrOwpAQCAtOTA1LDggKzkwOCwxMyBAQAogCiAJaWYgKG5ld19mYikgewogCQlpbmZvLT52YXIucGl4Y2xvY2sgPSAwOwotCQlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbykgPCAwKQorCQlyZXQgPSBmYl9hbGxvY19jbWFwKCZpbmZvLT5jbWFwLCBtb2Rlc2V0LT5jcnRjLT5nYW1tYV9zaXplLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWlmIChyZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKSA8IDApIHsKKwkJCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCX0gZWxzZSB7CiAJCWRybV9mYl9oZWxwZXJfc2V0X3BhcihpbmZvKTsKIAl9CkBAIC05MzYsNiArOTQ0LDcgQEAKIAkJdW5yZWdpc3Rlcl9zeXNycV9rZXkoJ3YnLCAmc3lzcnFfZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX29wKTsKIAl9CiAJZHJtX2ZiX2hlbHBlcl9jcnRjX2ZyZWUoaGVscGVyKTsKKwlmYl9kZWFsbG9jX2NtYXAoJmhlbHBlci0+ZmItPmZiZGV2LT5jbWFwKTsKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2ZiX2hlbHBlcl9mcmVlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYwppbmRleCAyNTFiYzBlLi4wOGQxNGRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYwpAQCAtMjU3LDYgKzI1Nyw5IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmcHJpdi0+bGhlYWQpOwogCUlOSVRfTElTVF9IRUFEKCZwcml2LT5mYnMpOworCUlOSVRfTElTVF9IRUFEKCZwcml2LT5ldmVudF9saXN0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT5ldmVudF93YWl0KTsKKwlwcml2LT5ldmVudF9zcGFjZSA9IDQwOTY7IC8qIHNldCBhc2lkZSA0ayBmb3IgZXZlbnQgYnVmZmVyICovCiAKIAlpZiAoZGV2LT5kcml2ZXItPmRyaXZlcl9mZWF0dXJlcyAmIERSSVZFUl9HRU0pCiAJCWRybV9nZW1fb3BlbihkZXYsIHByaXYpOwpAQCAtMjk3LDYgKzMwMCwxOCBAQAogCQkJCWdvdG8gb3V0X2ZyZWU7CiAJCQl9CiAJCX0KKwkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlpZiAoZGV2LT5kcml2ZXItPm1hc3Rlcl9zZXQpIHsKKwkJCXJldCA9IGRldi0+ZHJpdmVyLT5tYXN0ZXJfc2V0KGRldiwgcHJpdiwgdHJ1ZSk7CisJCQlpZiAocmV0KSB7CisJCQkJLyogZHJvcCBib3RoIHJlZmVyZW5jZXMgaWYgdGhpcyBmYWlscyAqLworCQkJCWRybV9tYXN0ZXJfcHV0KCZwcml2LT5taW5vci0+bWFzdGVyKTsKKwkJCQlkcm1fbWFzdGVyX3B1dCgmcHJpdi0+bWFzdGVyKTsKKwkJCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJCQlnb3RvIG91dF9mcmVlOworCQkJfQorCQl9CisJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCX0gZWxzZSB7CiAJCS8qIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgbWFzdGVyICovCiAJCXByaXYtPm1hc3RlciA9IGRybV9tYXN0ZXJfZ2V0KHByaXYtPm1pbm9yLT5tYXN0ZXIpOwpAQCAtNDEzLDYgKzQyOCwzMCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgZHJtX2V2ZW50c19yZWxlYXNlKHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBmaWxlX3ByaXYtPm1pbm9yLT5kZXY7CisJc3RydWN0IGRybV9wZW5kaW5nX2V2ZW50ICplLCAqZXQ7CisJc3RydWN0IGRybV9wZW5kaW5nX3ZibGFua19ldmVudCAqdiwgKnZ0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisKKwkvKiBSZW1vdmUgcGVuZGluZyBmbGlwcyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2LCB2dCwgJmRldi0+dmJsYW5rX2V2ZW50X2xpc3QsIGJhc2UubGluaykKKwkJaWYgKHYtPmJhc2UuZmlsZV9wcml2ID09IGZpbGVfcHJpdikgeworCQkJbGlzdF9kZWwoJnYtPmJhc2UubGluayk7CisJCQlkcm1fdmJsYW5rX3B1dChkZXYsIHYtPnBpcGUpOworCQkJdi0+YmFzZS5kZXN0cm95KCZ2LT5iYXNlKTsKKwkJfQorCisJLyogUmVtb3ZlIHVuY29uc3VtZWQgZXZlbnRzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIGV0LCAmZmlsZV9wcml2LT5ldmVudF9saXN0LCBsaW5rKQorCQllLT5kZXN0cm95KGUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7Cit9CisKIC8qKgogICogUmVsZWFzZSBmaWxlLgogICoKQEAgLTQ1MSw2ICs0OTAsOCBAQAogCWlmIChmaWxlX3ByaXYtPm1pbm9yLT5tYXN0ZXIpCiAJCWRybV9tYXN0ZXJfcmVsZWFzZShkZXYsIGZpbHApOwogCisJZHJtX2V2ZW50c19yZWxlYXNlKGZpbGVfcHJpdik7CisKIAlpZiAoZGV2LT5kcml2ZXItPmRyaXZlcl9mZWF0dXJlcyAmIERSSVZFUl9HRU0pCiAJCWRybV9nZW1fcmVsZWFzZShkZXYsIGZpbGVfcHJpdik7CiAKQEAgLTUwNCw2ICs1NDUsOCBAQAogCiAJCWlmIChmaWxlX3ByaXYtPm1pbm9yLT5tYXN0ZXIgPT0gZmlsZV9wcml2LT5tYXN0ZXIpIHsKIAkJCS8qIGRyb3AgdGhlIHJlZmVyZW5jZSBoZWxkIG15IHRoZSBtaW5vciAqLworCQkJaWYgKGRldi0+ZHJpdmVyLT5tYXN0ZXJfZHJvcCkKKwkJCQlkZXYtPmRyaXZlci0+bWFzdGVyX2Ryb3AoZGV2LCBmaWxlX3ByaXYsIHRydWUpOwogCQkJZHJtX21hc3Rlcl9wdXQoJmZpbGVfcHJpdi0+bWlub3ItPm1hc3Rlcik7CiAJCX0KIAl9CkBAIC01NDQsOSArNTg3LDc0IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9yZWxlYXNlKTsKIAotLyoqIE5vLW9wLiAqLworc3RhdGljIGJvb2wKK2RybV9kZXF1ZXVlX2V2ZW50KHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkgIHNpemVfdCB0b3RhbCwgc2l6ZV90IG1heCwgc3RydWN0IGRybV9wZW5kaW5nX2V2ZW50ICoqb3V0KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBmaWxlX3ByaXYtPm1pbm9yLT5kZXY7CisJc3RydWN0IGRybV9wZW5kaW5nX2V2ZW50ICplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCByZXQgPSBmYWxzZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKworCSpvdXQgPSBOVUxMOworCWlmIChsaXN0X2VtcHR5KCZmaWxlX3ByaXYtPmV2ZW50X2xpc3QpKQorCQlnb3RvIG91dDsKKwllID0gbGlzdF9maXJzdF9lbnRyeSgmZmlsZV9wcml2LT5ldmVudF9saXN0LAorCQkJICAgICBzdHJ1Y3QgZHJtX3BlbmRpbmdfZXZlbnQsIGxpbmspOworCWlmIChlLT5ldmVudC0+bGVuZ3RoICsgdG90YWwgPiBtYXgpCisJCWdvdG8gb3V0OworCisJZmlsZV9wcml2LT5ldmVudF9zcGFjZSArPSBlLT5ldmVudC0+bGVuZ3RoOworCWxpc3RfZGVsKCZlLT5saW5rKTsKKwkqb3V0ID0gZTsKKwlyZXQgPSB0cnVlOworCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3NpemVfdCBkcm1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZzZXQpCit7CisJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9wZW5kaW5nX2V2ZW50ICplOworCXNpemVfdCB0b3RhbDsKKwlzc2l6ZV90IHJldDsKKworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShmaWxlX3ByaXYtPmV2ZW50X3dhaXQsCisJCQkJICAgICAgICFsaXN0X2VtcHR5KCZmaWxlX3ByaXYtPmV2ZW50X2xpc3QpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXRvdGFsID0gMDsKKwl3aGlsZSAoZHJtX2RlcXVldWVfZXZlbnQoZmlsZV9wcml2LCB0b3RhbCwgY291bnQsICZlKSkgeworCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciArIHRvdGFsLAorCQkJCSBlLT5ldmVudCwgZS0+ZXZlbnQtPmxlbmd0aCkpIHsKKwkJCXRvdGFsID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJdG90YWwgKz0gZS0+ZXZlbnQtPmxlbmd0aDsKKwkJZS0+ZGVzdHJveShlKTsKKwl9CisKKwlyZXR1cm4gdG90YWw7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9yZWFkKTsKKwogdW5zaWduZWQgaW50IGRybV9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCiB7Ci0JcmV0dXJuIDA7CisJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJcG9sbF93YWl0KGZpbHAsICZmaWxlX3ByaXYtPmV2ZW50X3dhaXQsIHdhaXQpOworCisJaWYgKCFsaXN0X2VtcHR5KCZmaWxlX3ByaXYtPmV2ZW50X2xpc3QpKQorCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisKKwlyZXR1cm4gbWFzazsKIH0KIEVYUE9SVF9TWU1CT0woZHJtX3BvbGwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1faXJxLmMKaW5kZXggMGE2ZjBiMy4uNzk5OGVlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2lycS5jCkBAIC00MjksMTUgKzQyOSwyMSBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzKTsKIAkvKiBHb2luZyBmcm9tIDAtPjEgbWVhbnMgd2UgaGF2ZSB0byBlbmFibGUgaW50ZXJydXB0cyBhZ2FpbiAqLwotCWlmIChhdG9taWNfYWRkX3JldHVybigxLCAmZGV2LT52YmxhbmtfcmVmY291bnRbY3J0Y10pID09IDEgJiYKLQkgICAgIWRldi0+dmJsYW5rX2VuYWJsZWRbY3J0Y10pIHsKLQkJcmV0ID0gZGV2LT5kcml2ZXItPmVuYWJsZV92YmxhbmsoZGV2LCBjcnRjKTsKLQkJRFJNX0RFQlVHKCJlbmFibGluZyB2Ymxhbmsgb24gY3J0YyAlZCwgcmV0OiAlZFxuIiwgY3J0YywgcmV0KTsKLQkJaWYgKHJldCkKKwlpZiAoYXRvbWljX2FkZF9yZXR1cm4oMSwgJmRldi0+dmJsYW5rX3JlZmNvdW50W2NydGNdKSA9PSAxKSB7CisJCWlmICghZGV2LT52YmxhbmtfZW5hYmxlZFtjcnRjXSkgeworCQkJcmV0ID0gZGV2LT5kcml2ZXItPmVuYWJsZV92YmxhbmsoZGV2LCBjcnRjKTsKKwkJCURSTV9ERUJVRygiZW5hYmxpbmcgdmJsYW5rIG9uIGNydGMgJWQsIHJldDogJWRcbiIsIGNydGMsIHJldCk7CisJCQlpZiAocmV0KQorCQkJCWF0b21pY19kZWMoJmRldi0+dmJsYW5rX3JlZmNvdW50W2NydGNdKTsKKwkJCWVsc2UgeworCQkJCWRldi0+dmJsYW5rX2VuYWJsZWRbY3J0Y10gPSAxOworCQkJCWRybV91cGRhdGVfdmJsYW5rX2NvdW50KGRldiwgY3J0Yyk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIWRldi0+dmJsYW5rX2VuYWJsZWRbY3J0Y10pIHsKIAkJCWF0b21pY19kZWMoJmRldi0+dmJsYW5rX3JlZmNvdW50W2NydGNdKTsKLQkJZWxzZSB7Ci0JCQlkZXYtPnZibGFua19lbmFibGVkW2NydGNdID0gMTsKLQkJCWRybV91cGRhdGVfdmJsYW5rX2NvdW50KGRldiwgY3J0Yyk7CisJCQlyZXQgPSAtRUlOVkFMOwogCQl9CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzKTsKQEAgLTQ2NCw2ICs0NzAsMTggQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX3ZibGFua19wdXQpOwogCit2b2lkIGRybV92Ymxhbmtfb2ZmKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKQoreworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOworCURSTV9XQUtFVVAoJmRldi0+dmJsX3F1ZXVlW2NydGNdKTsKKwlkZXYtPnZibGFua19lbmFibGVkW2NydGNdID0gMDsKKwlkZXYtPmxhc3RfdmJsYW5rW2NydGNdID0gZGV2LT5kcml2ZXItPmdldF92YmxhbmtfY291bnRlcihkZXYsIGNydGMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX3ZibGFua19vZmYpOworCiAvKioKICAqIGRybV92YmxhbmtfcHJlX21vZGVzZXQgLSBhY2NvdW50IGZvciB2YmxhbmtzIGFjcm9zcyBtb2RlIHNldHMKICAqIEBkZXY6IERSTSBkZXZpY2UKQEAgLTU1MCw2ICs1NjgsNjMgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGRybV9xdWV1ZV92YmxhbmtfZXZlbnQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUsCisJCQkJICB1bmlvbiBkcm1fd2FpdF92YmxhbmsgKnZibHdhaXQsCisJCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICplOworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBzZXE7CisKKwllID0ga3phbGxvYyhzaXplb2YgKmUsIEdGUF9LRVJORUwpOworCWlmIChlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZS0+cGlwZSA9IHBpcGU7CisJZS0+ZXZlbnQuYmFzZS50eXBlID0gRFJNX0VWRU5UX1ZCTEFOSzsKKwllLT5ldmVudC5iYXNlLmxlbmd0aCA9IHNpemVvZiBlLT5ldmVudDsKKwllLT5ldmVudC51c2VyX2RhdGEgPSB2Ymx3YWl0LT5yZXF1ZXN0LnNpZ25hbDsKKwllLT5iYXNlLmV2ZW50ID0gJmUtPmV2ZW50LmJhc2U7CisJZS0+YmFzZS5maWxlX3ByaXYgPSBmaWxlX3ByaXY7CisJZS0+YmFzZS5kZXN0cm95ID0gKHZvaWQgKCopIChzdHJ1Y3QgZHJtX3BlbmRpbmdfZXZlbnQgKikpIGtmcmVlOworCisJZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKworCWlmIChmaWxlX3ByaXYtPmV2ZW50X3NwYWNlIDwgc2l6ZW9mIGUtPmV2ZW50KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCQlrZnJlZShlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZmlsZV9wcml2LT5ldmVudF9zcGFjZSAtPSBzaXplb2YgZS0+ZXZlbnQ7CisJc2VxID0gZHJtX3ZibGFua19jb3VudChkZXYsIHBpcGUpOworCWlmICgodmJsd2FpdC0+cmVxdWVzdC50eXBlICYgX0RSTV9WQkxBTktfTkVYVE9OTUlTUykgJiYKKwkgICAgKHNlcSAtIHZibHdhaXQtPnJlcXVlc3Quc2VxdWVuY2UpIDw9ICgxIDw8IDIzKSkgeworCQl2Ymx3YWl0LT5yZXF1ZXN0LnNlcXVlbmNlID0gc2VxICsgMTsKKwkJdmJsd2FpdC0+cmVwbHkuc2VxdWVuY2UgPSB2Ymx3YWl0LT5yZXF1ZXN0LnNlcXVlbmNlOworCX0KKworCURSTV9ERUJVRygiZXZlbnQgb24gdmJsYW5rIGNvdW50ICVkLCBjdXJyZW50ICVkLCBjcnRjICVkXG4iLAorCQkgIHZibHdhaXQtPnJlcXVlc3Quc2VxdWVuY2UsIHNlcSwgcGlwZSk7CisKKwllLT5ldmVudC5zZXF1ZW5jZSA9IHZibHdhaXQtPnJlcXVlc3Quc2VxdWVuY2U7CisJaWYgKChzZXEgLSB2Ymx3YWl0LT5yZXF1ZXN0LnNlcXVlbmNlKSA8PSAoMSA8PCAyMykpIHsKKwkJZS0+ZXZlbnQudHZfc2VjID0gbm93LnR2X3NlYzsKKwkJZS0+ZXZlbnQudHZfdXNlYyA9IG5vdy50dl91c2VjOworCQlkcm1fdmJsYW5rX3B1dChkZXYsIGUtPnBpcGUpOworCQlsaXN0X2FkZF90YWlsKCZlLT5iYXNlLmxpbmssICZlLT5iYXNlLmZpbGVfcHJpdi0+ZXZlbnRfbGlzdCk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZS0+YmFzZS5maWxlX3ByaXYtPmV2ZW50X3dhaXQpOworCX0gZWxzZSB7CisJCWxpc3RfYWRkX3RhaWwoJmUtPmJhc2UubGluaywgJmRldi0+dmJsYW5rX2V2ZW50X2xpc3QpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKIC8qKgogICogV2FpdCBmb3IgVkJMQU5LLgogICoKQEAgLTYwOSw2ICs2ODQsOSBAQAogCQlnb3RvIGRvbmU7CiAJfQogCisJaWYgKGZsYWdzICYgX0RSTV9WQkxBTktfRVZFTlQpCisJCXJldHVybiBkcm1fcXVldWVfdmJsYW5rX2V2ZW50KGRldiwgY3J0YywgdmJsd2FpdCwgZmlsZV9wcml2KTsKKwogCWlmICgoZmxhZ3MgJiBfRFJNX1ZCTEFOS19ORVhUT05NSVNTKSAmJgogCSAgICAoc2VxIC0gdmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZSkgPD0gKDE8PDIzKSkgewogCQl2Ymx3YWl0LT5yZXF1ZXN0LnNlcXVlbmNlID0gc2VxICsgMTsKQEAgLTY0MSw2ICs3MTksMzggQEAKIAlyZXR1cm4gcmV0OwogfQogCit2b2lkIGRybV9oYW5kbGVfdmJsYW5rX2V2ZW50cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICplLCAqdDsKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgc2VxOworCisJZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCXNlcSA9IGRybV92YmxhbmtfY291bnQoZGV2LCBjcnRjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCB0LCAmZGV2LT52YmxhbmtfZXZlbnRfbGlzdCwgYmFzZS5saW5rKSB7CisJCWlmIChlLT5waXBlICE9IGNydGMpCisJCQljb250aW51ZTsKKwkJaWYgKChzZXEgLSBlLT5ldmVudC5zZXF1ZW5jZSkgPiAoMTw8MjMpKQorCQkJY29udGludWU7CisKKwkJRFJNX0RFQlVHKCJ2YmxhbmsgZXZlbnQgb24gJWQsIGN1cnJlbnQgJWRcbiIsCisJCQkgIGUtPmV2ZW50LnNlcXVlbmNlLCBzZXEpOworCisJCWUtPmV2ZW50LnNlcXVlbmNlID0gc2VxOworCQllLT5ldmVudC50dl9zZWMgPSBub3cudHZfc2VjOworCQllLT5ldmVudC50dl91c2VjID0gbm93LnR2X3VzZWM7CisJCWRybV92YmxhbmtfcHV0KGRldiwgZS0+cGlwZSk7CisJCWxpc3RfbW92ZV90YWlsKCZlLT5iYXNlLmxpbmssICZlLT5iYXNlLmZpbGVfcHJpdi0+ZXZlbnRfbGlzdCk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZS0+YmFzZS5maWxlX3ByaXYtPmV2ZW50X3dhaXQpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworfQorCiAvKioKICAqIGRybV9oYW5kbGVfdmJsYW5rIC0gaGFuZGxlIGEgdmJsYW5rIGV2ZW50CiAgKiBAZGV2OiBEUk0gZGV2aWNlCkBAIC02NTEsNyArNzYxLDExIEBACiAgKi8KIHZvaWQgZHJtX2hhbmRsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpCiB7CisJaWYgKCFkZXYtPm51bV9jcnRjcykKKwkJcmV0dXJuOworCiAJYXRvbWljX2luYygmZGV2LT5fdmJsYW5rX2NvdW50W2NydGNdKTsKIAlEUk1fV0FLRVVQKCZkZXYtPnZibF9xdWV1ZVtjcnRjXSk7CisJZHJtX2hhbmRsZV92YmxhbmtfZXZlbnRzKGRldiwgY3J0Yyk7CiB9CiBFWFBPUlRfU1lNQk9MKGRybV9oYW5kbGVfdmJsYW5rKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW0uYwppbmRleCA5N2RjNWE0Li5kN2Q3ZWFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21tLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9tbS5jCkBAIC0yMjYsNiArMjI2LDQ0IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9tbV9nZXRfYmxvY2tfZ2VuZXJpYyk7CiAKK3N0cnVjdCBkcm1fbW1fbm9kZSAqZHJtX21tX2dldF9ibG9ja19yYW5nZV9nZW5lcmljKHN0cnVjdCBkcm1fbW1fbm9kZSAqbm9kZSwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkJCXVuc2lnbmVkIGFsaWdubWVudCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJCQl1bnNpZ25lZCBsb25nIGVuZCwKKwkJCQkJCWludCBhdG9taWMpCit7CisJc3RydWN0IGRybV9tbV9ub2RlICphbGlnbl9zcGxpdG9mZiA9IE5VTEw7CisJdW5zaWduZWQgdG1wID0gMDsKKwl1bnNpZ25lZCB3YXN0ZWQgPSAwOworCisJaWYgKG5vZGUtPnN0YXJ0IDwgc3RhcnQpCisJCXdhc3RlZCArPSBzdGFydCAtIG5vZGUtPnN0YXJ0OworCWlmIChhbGlnbm1lbnQpCisJCXRtcCA9ICgobm9kZS0+c3RhcnQgKyB3YXN0ZWQpICUgYWxpZ25tZW50KTsKKworCWlmICh0bXApCisJCXdhc3RlZCArPSBhbGlnbm1lbnQgLSB0bXA7CisJaWYgKHdhc3RlZCkgeworCQlhbGlnbl9zcGxpdG9mZiA9IGRybV9tbV9zcGxpdF9hdF9zdGFydChub2RlLCB3YXN0ZWQsIGF0b21pYyk7CisJCWlmICh1bmxpa2VseShhbGlnbl9zcGxpdG9mZiA9PSBOVUxMKSkKKwkJCXJldHVybiBOVUxMOworCX0KKworCWlmIChub2RlLT5zaXplID09IHNpemUpIHsKKwkJbGlzdF9kZWxfaW5pdCgmbm9kZS0+ZmxfZW50cnkpOworCQlub2RlLT5mcmVlID0gMDsKKwl9IGVsc2UgeworCQlub2RlID0gZHJtX21tX3NwbGl0X2F0X3N0YXJ0KG5vZGUsIHNpemUsIGF0b21pYyk7CisJfQorCisJaWYgKGFsaWduX3NwbGl0b2ZmKQorCQlkcm1fbW1fcHV0X2Jsb2NrKGFsaWduX3NwbGl0b2ZmKTsKKworCXJldHVybiBub2RlOworfQorRVhQT1JUX1NZTUJPTChkcm1fbW1fZ2V0X2Jsb2NrX3JhbmdlX2dlbmVyaWMpOworCiAvKgogICogUHV0IGEgYmxvY2suIE1lcmdlIHdpdGggdGhlIHByZXZpb3VzIGFuZCAvIG9yIG5leHQgYmxvY2sgaWYgdGhleSBhcmUgZnJlZS4KICAqIE90aGVyd2lzZSBhZGQgdG8gdGhlIGZyZWUgc3RhY2suCkBAIC0zMzEsNiArMzY5LDU2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9tbV9zZWFyY2hfZnJlZSk7CiAKK3N0cnVjdCBkcm1fbW1fbm9kZSAqZHJtX21tX3NlYXJjaF9mcmVlX2luX3JhbmdlKGNvbnN0IHN0cnVjdCBkcm1fbW0gKm1tLAorCQkJCQkJdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCQkJdW5zaWduZWQgYWxpZ25tZW50LAorCQkJCQkJdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgZW5kLAorCQkJCQkJaW50IGJlc3RfbWF0Y2gpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwljb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICpmcmVlX3N0YWNrID0gJm1tLT5mbF9lbnRyeTsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKmVudHJ5OworCXN0cnVjdCBkcm1fbW1fbm9kZSAqYmVzdDsKKwl1bnNpZ25lZCBsb25nIGJlc3Rfc2l6ZTsKKwl1bnNpZ25lZCB3YXN0ZWQ7CisKKwliZXN0ID0gTlVMTDsKKwliZXN0X3NpemUgPSB+MFVMOworCisJbGlzdF9mb3JfZWFjaChsaXN0LCBmcmVlX3N0YWNrKSB7CisJCWVudHJ5ID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZHJtX21tX25vZGUsIGZsX2VudHJ5KTsKKwkJd2FzdGVkID0gMDsKKworCQlpZiAoZW50cnktPnNpemUgPCBzaXplKQorCQkJY29udGludWU7CisKKwkJaWYgKGVudHJ5LT5zdGFydCA+IGVuZCB8fCAoZW50cnktPnN0YXJ0K2VudHJ5LT5zaXplKSA8IHN0YXJ0KQorCQkJY29udGludWU7CisKKwkJaWYgKGVudHJ5LT5zdGFydCA8IHN0YXJ0KQorCQkJd2FzdGVkICs9IHN0YXJ0IC0gZW50cnktPnN0YXJ0OworCisJCWlmIChhbGlnbm1lbnQpIHsKKwkJCXJlZ2lzdGVyIHVuc2lnbmVkIHRtcCA9IChlbnRyeS0+c3RhcnQgKyB3YXN0ZWQpICUgYWxpZ25tZW50OworCQkJaWYgKHRtcCkKKwkJCQl3YXN0ZWQgKz0gYWxpZ25tZW50IC0gdG1wOworCQl9CisKKwkJaWYgKGVudHJ5LT5zaXplID49IHNpemUgKyB3YXN0ZWQpIHsKKwkJCWlmICghYmVzdF9tYXRjaCkKKwkJCQlyZXR1cm4gZW50cnk7CisJCQlpZiAoc2l6ZSA8IGJlc3Rfc2l6ZSkgeworCQkJCWJlc3QgPSBlbnRyeTsKKwkJCQliZXN0X3NpemUgPSBlbnRyeS0+c2l6ZTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBiZXN0OworfQorRVhQT1JUX1NZTUJPTChkcm1fbW1fc2VhcmNoX2ZyZWVfaW5fcmFuZ2UpOworCiBpbnQgZHJtX21tX2NsZWFuKHN0cnVjdCBkcm1fbW0gKiBtbSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJm1tLT5tbF9lbnRyeTsKQEAgLTM4MSw2ICs0NjksMjYgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX21tX3Rha2Vkb3duKTsKIAordm9pZCBkcm1fbW1fZGVidWdfdGFibGUoc3RydWN0IGRybV9tbSAqbW0sIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKmVudHJ5OworCWludCB0b3RhbF91c2VkID0gMCwgdG90YWxfZnJlZSA9IDAsIHRvdGFsID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZtbS0+bWxfZW50cnksIG1sX2VudHJ5KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlcyAweCUwOGx4LTB4JTA4bHg6ICU4bGQ6ICVzXG4iLAorCQkJcHJlZml4LCBlbnRyeS0+c3RhcnQsIGVudHJ5LT5zdGFydCArIGVudHJ5LT5zaXplLAorCQkJZW50cnktPnNpemUsIGVudHJ5LT5mcmVlID8gImZyZWUiIDogInVzZWQiKTsKKwkJdG90YWwgKz0gZW50cnktPnNpemU7CisJCWlmIChlbnRyeS0+ZnJlZSkKKwkJCXRvdGFsX2ZyZWUgKz0gZW50cnktPnNpemU7CisJCWVsc2UKKwkJCXRvdGFsX3VzZWQgKz0gZW50cnktPnNpemU7CisJfQorCXByaW50ayhLRVJOX0RFQlVHICIlcyB0b3RhbDogJWQsIHVzZWQgJWQgZnJlZSAlZFxuIiwgcHJlZml4LCB0b3RhbCwKKwkJdG90YWxfdXNlZCwgdG90YWxfZnJlZSk7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9tbV9kZWJ1Z190YWJsZSk7CisKICNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykKIGludCBkcm1fbW1fZHVtcF90YWJsZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBkcm1fbW0gKm1tKQogewpAQCAtMzk1LDcgKzUwMyw3IEBACiAJCWVsc2UKIAkJCXRvdGFsX3VzZWQgKz0gZW50cnktPnNpemU7CiAJfQotCXNlcV9wcmludGYobSwgInRvdGFsOiAlZCwgdXNlZCAlZCBmcmVlICVkXG4iLCB0b3RhbCwgdG90YWxfZnJlZSwgdG90YWxfdXNlZCk7CisJc2VxX3ByaW50ZihtLCAidG90YWw6ICVkLCB1c2VkICVkIGZyZWUgJWRcbiIsIHRvdGFsLCB0b3RhbF91c2VkLCB0b3RhbF9mcmVlKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woZHJtX21tX2R1bXBfdGFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9tb2Rlcy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9tb2Rlcy5jCmluZGV4IDUxZjY3NzIuLjZkODFhMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW9kZXMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX21vZGVzLmMKQEAgLTU1Myw2ICs1NTMsMzIgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX21vZGVfaGVpZ2h0KTsKIAorLyoqIGRybV9tb2RlX2hzeW5jIC0gZ2V0IHRoZSBoc3luYyBvZiBhIG1vZGUKKyAqIEBtb2RlOiBtb2RlCisgKgorICogTE9DS0lORzoKKyAqIE5vbmUuCisgKgorICogUmV0dXJuIEBtb2RlcydzIGhzeW5jIHJhdGUgaW4ga0h6LCByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IGludC4KKyAqLworaW50IGRybV9tb2RlX2hzeW5jKHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXVuc2lnbmVkIGludCBjYWxjX3ZhbDsKKworCWlmIChtb2RlLT5oc3luYykKKwkJcmV0dXJuIG1vZGUtPmhzeW5jOworCisJaWYgKG1vZGUtPmh0b3RhbCA8IDApCisJCXJldHVybiAwOworCisJY2FsY192YWwgPSAobW9kZS0+Y2xvY2sgKiAxMDAwKSAvIG1vZGUtPmh0b3RhbDsgLyogaHN5bmMgaW4gSHogKi8KKwljYWxjX3ZhbCArPSA1MDA7CQkJCS8qIHJvdW5kIHRvIDEwMDBIeiAqLworCWNhbGNfdmFsIC89IDEwMDA7CQkJCS8qIHRydW5jYXRlIHRvIGtIeiAqLworCisJcmV0dXJuIGNhbGNfdmFsOworfQorRVhQT1JUX1NZTUJPTChkcm1fbW9kZV9oc3luYyk7CisKIC8qKgogICogZHJtX21vZGVfdnJlZnJlc2ggLSBnZXQgdGhlIHZyZWZyZXNoIG9mIGEgbW9kZQogICogQG1vZGU6IG1vZGUKQEAgLTU2MCw3ICs1ODYsNyBAQAogICogTE9DS0lORzoKICAqIE5vbmUuCiAgKgotICogUmV0dXJuIEBtb2RlJ3MgdnJlZnJlc2ggcmF0ZSBvciBjYWxjdWxhdGUgaXQgaWYgbmVjZXNzYXJ5LgorICogUmV0dXJuIEBtb2RlJ3MgdnJlZnJlc2ggcmF0ZSBpbiBIeiBvciBjYWxjdWxhdGUgaXQgaWYgbmVjZXNzYXJ5LgogICoKICAqIEZJWE1FOiB3aHkgaXMgdGhpcyBuZWVkZWQ/ICBzaG91bGRuJ3QgdnJlZnJlc2ggYmUgc2V0IGFscmVhZHk/CiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9zdHViLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3N0dWIuYwppbmRleCA1NWJiOGE4Li5hZDczZTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3N0dWIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3N0dWIuYwpAQCAtMTI4LDYgKzEyOCw3IEBACiAJa3JlZl9nZXQoJm1hc3Rlci0+cmVmY291bnQpOwogCXJldHVybiBtYXN0ZXI7CiB9CitFWFBPUlRfU1lNQk9MKGRybV9tYXN0ZXJfZ2V0KTsKIAogc3RhdGljIHZvaWQgZHJtX21hc3Rlcl9kZXN0cm95KHN0cnVjdCBrcmVmICprcmVmKQogewpAQCAtMTcwLDEwICsxNzEsMTMgQEAKIAlrcmVmX3B1dCgmKCptYXN0ZXIpLT5yZWZjb3VudCwgZHJtX21hc3Rlcl9kZXN0cm95KTsKIAkqbWFzdGVyID0gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0woZHJtX21hc3Rlcl9wdXQpOwogCiBpbnQgZHJtX3NldG1hc3Rlcl9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CisJaW50IHJldCA9IDA7CisKIAlpZiAoZmlsZV9wcml2LT5pc19tYXN0ZXIpCiAJCXJldHVybiAwOwogCkBAIC0xODgsNiArMTkyLDEzIEBACiAJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAkJZmlsZV9wcml2LT5taW5vci0+bWFzdGVyID0gZHJtX21hc3Rlcl9nZXQoZmlsZV9wcml2LT5tYXN0ZXIpOwogCQlmaWxlX3ByaXYtPmlzX21hc3RlciA9IDE7CisJCWlmIChkZXYtPmRyaXZlci0+bWFzdGVyX3NldCkgeworCQkJcmV0ID0gZGV2LT5kcml2ZXItPm1hc3Rlcl9zZXQoZGV2LCBmaWxlX3ByaXYsIGZhbHNlKTsKKwkJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJCQlmaWxlX3ByaXYtPmlzX21hc3RlciA9IDA7CisJCQkJZHJtX21hc3Rlcl9wdXQoJmZpbGVfcHJpdi0+bWlub3ItPm1hc3Rlcik7CisJCQl9CisJCX0KIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJfQogCkBAIC0yMDQsNiArMjE1LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJaWYgKGRldi0+ZHJpdmVyLT5tYXN0ZXJfZHJvcCkKKwkJZGV2LT5kcml2ZXItPm1hc3Rlcl9kcm9wKGRldiwgZmlsZV9wcml2LCBmYWxzZSk7CiAJZHJtX21hc3Rlcl9wdXQoJmZpbGVfcHJpdi0+bWlub3ItPm1hc3Rlcik7CiAJZmlsZV9wcml2LT5pc19tYXN0ZXIgPSAwOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpAQCAtMjIwLDkgKzIzMywxMSBAQAogCUlOSVRfTElTVF9IRUFEKCZkZXYtPmN0eGxpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPnZtYWxpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPm1hcGxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPnZibGFua19ldmVudF9saXN0KTsKIAogCXNwaW5fbG9ja19pbml0KCZkZXYtPmNvdW50X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPmRyd19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5ldmVudF9sb2NrKTsKIAlpbml0X3RpbWVyKCZkZXYtPnRpbWVyKTsKIAltdXRleF9pbml0KCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJbXV0ZXhfaW5pdCgmZGV2LT5jdHhsaXN0X211dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pMmMvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vaTJjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMmFiYWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTJjL01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorY2NmbGFncy15IDo9IC1JaW5jbHVkZS9kcm0KKworY2g3MDA2LXkgOj0gY2g3MDA2X2Rydi5vIGNoNzAwNl9tb2RlLm8KK29iai0kKENPTkZJR19EUk1fSTJDX0NINzAwNikgKz0gY2g3MDA2Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pMmMvY2g3MDA2X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2kyYy9jaDcwMDZfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQyMmE3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pMmMvY2g3MDA2X2Rydi5jCkBAIC0wLDAgKzEsNTMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEZyYW5jaXNjbyBKZXJlei4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJjaDcwMDZfcHJpdi5oIgorCisvKiBEUk0gZW5jb2RlciBmdW5jdGlvbnMgKi8KKworc3RhdGljIHZvaWQgY2g3MDA2X2VuY29kZXJfc2V0X2NvbmZpZyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJICAgICAgdm9pZCAqcGFyYW1zKQoreworCXN0cnVjdCBjaDcwMDZfcHJpdiAqcHJpdiA9IHRvX2NoNzAwNl9wcml2KGVuY29kZXIpOworCisJcHJpdi0+cGFyYW1zID0gcGFyYW1zOworfQorCitzdGF0aWMgdm9pZCBjaDcwMDZfZW5jb2Rlcl9kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgY2g3MDA2X3ByaXYgKnByaXYgPSB0b19jaDcwMDZfcHJpdihlbmNvZGVyKTsKKworCWRybV9wcm9wZXJ0eV9kZXN0cm95KGVuY29kZXItPmRldiwgcHJpdi0+c2NhbGVfcHJvcGVydHkpOworCisJa2ZyZWUocHJpdik7CisJdG9fZW5jb2Rlcl9zbGF2ZShlbmNvZGVyKS0+c2xhdmVfcHJpdiA9IE5VTEw7CisKKwlkcm1faTJjX2VuY29kZXJfZGVzdHJveShlbmNvZGVyKTsKK30KKworc3RhdGljIHZvaWQgIGNoNzAwNl9lbmNvZGVyX2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZHJtX2kyY19lbmNvZGVyX2dldF9jbGllbnQoZW5jb2Rlcik7CisJc3RydWN0IGNoNzAwNl9wcml2ICpwcml2ID0gdG9fY2g3MDA2X3ByaXYoZW5jb2Rlcik7CisJc3RydWN0IGNoNzAwNl9zdGF0ZSAqc3RhdGUgPSAmcHJpdi0+c3RhdGU7CisKKwljaDcwMDZfZGJnKGNsaWVudCwgIlxuIik7CisKKwlpZiAobW9kZSA9PSBwcml2LT5sYXN0X2RwbXMpCisJCXJldHVybjsKKwlwcml2LT5sYXN0X2RwbXMgPSBtb2RlOworCisJY2g3MDA2X3NldHVwX3Bvd2VyX3N0YXRlKGVuY29kZXIpOworCisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9QT1dFUik7Cit9CisKK3N0YXRpYyB2b2lkIGNoNzAwNl9lbmNvZGVyX3NhdmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkcm1faTJjX2VuY29kZXJfZ2V0X2NsaWVudChlbmNvZGVyKTsKKwlzdHJ1Y3QgY2g3MDA2X3ByaXYgKnByaXYgPSB0b19jaDcwMDZfcHJpdihlbmNvZGVyKTsKKworCWNoNzAwNl9kYmcoY2xpZW50LCAiXG4iKTsKKworCWNoNzAwNl9zdGF0ZV9zYXZlKGNsaWVudCwgJnByaXYtPnNhdmVkX3N0YXRlKTsKK30KKworc3RhdGljIHZvaWQgY2g3MDA2X2VuY29kZXJfcmVzdG9yZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRybV9pMmNfZW5jb2Rlcl9nZXRfY2xpZW50KGVuY29kZXIpOworCXN0cnVjdCBjaDcwMDZfcHJpdiAqcHJpdiA9IHRvX2NoNzAwNl9wcml2KGVuY29kZXIpOworCisJY2g3MDA2X2RiZyhjbGllbnQsICJcbiIpOworCisJY2g3MDA2X3N0YXRlX2xvYWQoY2xpZW50LCAmcHJpdi0+c2F2ZWRfc3RhdGUpOworfQorCitzdGF0aWMgYm9vbCBjaDcwMDZfZW5jb2Rlcl9tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlzdHJ1Y3QgY2g3MDA2X3ByaXYgKnByaXYgPSB0b19jaDcwMDZfcHJpdihlbmNvZGVyKTsKKworCS8qIFRoZSBjaDcwMDYgaXMgcGFpbmZ1bGx5IHBpY2t5IHdpdGggdGhlIGlucHV0IHRpbWluZ3Mgc28gbm8KKwkgKiBjdXN0b20gbW9kZXMgZm9yIG5vdy4uLiAqLworCisJcHJpdi0+bW9kZSA9IGNoNzAwNl9sb29rdXBfbW9kZShlbmNvZGVyLCBtb2RlKTsKKworCXJldHVybiAhIXByaXYtPm1vZGU7Cit9CisKK3N0YXRpYyBpbnQgY2g3MDA2X2VuY29kZXJfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlpZiAoY2g3MDA2X2xvb2t1cF9tb2RlKGVuY29kZXIsIG1vZGUpKQorCQlyZXR1cm4gTU9ERV9PSzsKKwllbHNlCisJCXJldHVybiBNT0RFX0JBRDsKK30KKworc3RhdGljIHZvaWQgY2g3MDA2X2VuY29kZXJfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmRybV9tb2RlLAorCQkJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRybV9pMmNfZW5jb2Rlcl9nZXRfY2xpZW50KGVuY29kZXIpOworCXN0cnVjdCBjaDcwMDZfcHJpdiAqcHJpdiA9IHRvX2NoNzAwNl9wcml2KGVuY29kZXIpOworCXN0cnVjdCBjaDcwMDZfZW5jb2Rlcl9wYXJhbXMgKnBhcmFtcyA9IHByaXYtPnBhcmFtczsKKwlzdHJ1Y3QgY2g3MDA2X3N0YXRlICpzdGF0ZSA9ICZwcml2LT5zdGF0ZTsKKwl1aW50OF90ICpyZWdzID0gc3RhdGUtPnJlZ3M7CisJc3RydWN0IGNoNzAwNl9tb2RlICptb2RlID0gcHJpdi0+bW9kZTsKKwlzdHJ1Y3QgY2g3MDA2X3R2X25vcm1faW5mbyAqbm9ybSA9ICZjaDcwMDZfdHZfbm9ybXNbcHJpdi0+bm9ybV07CisJaW50IHN0YXJ0X2FjdGl2ZTsKKworCWNoNzAwNl9kYmcoY2xpZW50LCAiXG4iKTsKKworCXJlZ3NbQ0g3MDA2X0RJU1BNT0RFXSA9IG5vcm0tPmRpc3Btb2RlIHwgbW9kZS0+ZGlzcG1vZGU7CisJcmVnc1tDSDcwMDZfQldJRFRIXSA9IDA7CisJcmVnc1tDSDcwMDZfSU5QVVRfRk9STUFUXSA9IGJpdGYoQ0g3MDA2X0lOUFVUX0ZPUk1BVF9GT1JNQVQsCisJCQkJCSBwYXJhbXMtPmlucHV0X2Zvcm1hdCk7CisKKwlyZWdzW0NINzAwNl9DTEtNT0RFXSA9IENINzAwNl9DTEtNT0RFX1NVQkNfTE9DSworCQl8IGJpdGYoQ0g3MDA2X0NMS01PREVfWENNLCBwYXJhbXMtPnhjbSkKKwkJfCBiaXRmKENINzAwNl9DTEtNT0RFX1BDTSwgcGFyYW1zLT5wY20pOworCWlmIChwYXJhbXMtPmNsb2NrX21vZGUpCisJCXJlZ3NbQ0g3MDA2X0NMS01PREVdIHw9IENINzAwNl9DTEtNT0RFX01BU1RFUjsKKwlpZiAocGFyYW1zLT5jbG9ja19lZGdlKQorCQlyZWdzW0NINzAwNl9DTEtNT0RFXSB8PSBDSDcwMDZfQ0xLTU9ERV9QT1NfRURHRTsKKworCXN0YXJ0X2FjdGl2ZSA9IChkcm1fbW9kZS0+aHRvdGFsICYgfjB4NykgLSAoZHJtX21vZGUtPmhzeW5jX3N0YXJ0ICYgfjB4Nyk7CisJcmVnc1tDSDcwMDZfUE9WXSA9IGJpdGYoQ0g3MDA2X1BPVl9TVEFSVF9BQ1RJVkVfOCwgc3RhcnRfYWN0aXZlKTsKKwlyZWdzW0NINzAwNl9TVEFSVF9BQ1RJVkVdID0gYml0ZihDSDcwMDZfU1RBUlRfQUNUSVZFXzAsIHN0YXJ0X2FjdGl2ZSk7CisKKwlyZWdzW0NINzAwNl9JTlBVVF9TWU5DXSA9IDA7CisJaWYgKHBhcmFtcy0+c3luY19kaXJlY3Rpb24pCisJCXJlZ3NbQ0g3MDA2X0lOUFVUX1NZTkNdIHw9IENINzAwNl9JTlBVVF9TWU5DX09VVFBVVDsKKwlpZiAocGFyYW1zLT5zeW5jX2VuY29kaW5nKQorCQlyZWdzW0NINzAwNl9JTlBVVF9TWU5DXSB8PSBDSDcwMDZfSU5QVVRfU1lOQ19FTUJFRERFRDsKKwlpZiAoZHJtX21vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QVlNZTkMpCisJCXJlZ3NbQ0g3MDA2X0lOUFVUX1NZTkNdIHw9IENINzAwNl9JTlBVVF9TWU5DX1BWU1lOQzsKKwlpZiAoZHJtX21vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QSFNZTkMpCisJCXJlZ3NbQ0g3MDA2X0lOUFVUX1NZTkNdIHw9IENINzAwNl9JTlBVVF9TWU5DX1BIU1lOQzsKKworCXJlZ3NbQ0g3MDA2X0RFVEVDVF0gPSAwOworCXJlZ3NbQ0g3MDA2X0JDTEtPVVRdID0gMDsKKworCXJlZ3NbQ0g3MDA2X1NVQkNfSU5DM10gPSAwOworCWlmIChwYXJhbXMtPnBvdXRfbGV2ZWwpCisJCXJlZ3NbQ0g3MDA2X1NVQkNfSU5DM10gfD0gQ0g3MDA2X1NVQkNfSU5DM19QT1VUXzNfM1Y7CisKKwlyZWdzW0NINzAwNl9TVUJDX0lOQzRdID0gMDsKKwlpZiAocGFyYW1zLT5hY3RpdmVfZGV0ZWN0KQorCQlyZWdzW0NINzAwNl9TVUJDX0lOQzRdIHw9IENINzAwNl9TVUJDX0lOQzRfRFNfSU5QVVQ7CisKKwlyZWdzW0NINzAwNl9QTExfQ09OVFJPTF0gPSBwcml2LT5zYXZlZF9zdGF0ZS5yZWdzW0NINzAwNl9QTExfQ09OVFJPTF07CisKKwljaDcwMDZfc2V0dXBfbGV2ZWxzKGVuY29kZXIpOworCWNoNzAwNl9zZXR1cF9zdWJjYXJyaWVyKGVuY29kZXIpOworCWNoNzAwNl9zZXR1cF9wbGwoZW5jb2Rlcik7CisJY2g3MDA2X3NldHVwX3Bvd2VyX3N0YXRlKGVuY29kZXIpOworCWNoNzAwNl9zZXR1cF9wcm9wZXJ0aWVzKGVuY29kZXIpOworCisJY2g3MDA2X3N0YXRlX2xvYWQoY2xpZW50LCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIGNoNzAwNl9lbmNvZGVyX2RldGVjdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJCQkgICAgICAgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZHJtX2kyY19lbmNvZGVyX2dldF9jbGllbnQoZW5jb2Rlcik7CisJc3RydWN0IGNoNzAwNl9wcml2ICpwcml2ID0gdG9fY2g3MDA2X3ByaXYoZW5jb2Rlcik7CisJc3RydWN0IGNoNzAwNl9zdGF0ZSAqc3RhdGUgPSAmcHJpdi0+c3RhdGU7CisJaW50IGRldDsKKworCWNoNzAwNl9kYmcoY2xpZW50LCAiXG4iKTsKKworCWNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfREVURUNUKTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1BPV0VSKTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0NMS01PREUpOworCisJY2g3MDA2X3dyaXRlKGNsaWVudCwgQ0g3MDA2X1BPV0VSLCBDSDcwMDZfUE9XRVJfUkVTRVQgfAorCQkJCQkgICBiaXRmcyhDSDcwMDZfUE9XRVJfTEVWRUwsIE5PUk1BTCkpOworCWNoNzAwNl93cml0ZShjbGllbnQsIENINzAwNl9DTEtNT0RFLCBDSDcwMDZfQ0xLTU9ERV9NQVNURVIpOworCisJY2g3MDA2X3dyaXRlKGNsaWVudCwgQ0g3MDA2X0RFVEVDVCwgQ0g3MDA2X0RFVEVDVF9TRU5TRSk7CisKKwljaDcwMDZfd3JpdGUoY2xpZW50LCBDSDcwMDZfREVURUNULCAwKTsKKworCWRldCA9IGNoNzAwNl9yZWFkKGNsaWVudCwgQ0g3MDA2X0RFVEVDVCk7CisKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0NMS01PREUpOworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfUE9XRVIpOworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfREVURUNUKTsKKworCWlmICgoZGV0ICYgKENINzAwNl9ERVRFQ1RfU1ZJREVPX1lfVEVTVHwKKwkJICAgIENINzAwNl9ERVRFQ1RfU1ZJREVPX0NfVEVTVHwKKwkJICAgIENINzAwNl9ERVRFQ1RfQ1ZCU19URVNUKSkgPT0gMCkKKwkJcHJpdi0+c3ViY29ubmVjdG9yID0gRFJNX01PREVfU1VCQ09OTkVDVE9SX1NDQVJUOworCWVsc2UgaWYgKChkZXQgJiAoQ0g3MDA2X0RFVEVDVF9TVklERU9fWV9URVNUfAorCQkJIENINzAwNl9ERVRFQ1RfU1ZJREVPX0NfVEVTVCkpID09IDApCisJCXByaXYtPnN1YmNvbm5lY3RvciA9IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9TVklERU87CisJZWxzZSBpZiAoKGRldCAmIENINzAwNl9ERVRFQ1RfQ1ZCU19URVNUKSA9PSAwKQorCQlwcml2LT5zdWJjb25uZWN0b3IgPSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfQ29tcG9zaXRlOworCWVsc2UKKwkJcHJpdi0+c3ViY29ubmVjdG9yID0gRFJNX01PREVfU1VCQ09OTkVDVE9SX1Vua25vd247CisKKwlkcm1fY29ubmVjdG9yX3Byb3BlcnR5X3NldF92YWx1ZShjb25uZWN0b3IsCisJCQllbmNvZGVyLT5kZXYtPm1vZGVfY29uZmlnLnR2X3N1YmNvbm5lY3Rvcl9wcm9wZXJ0eSwKKwkJCQkJCQlwcml2LT5zdWJjb25uZWN0b3IpOworCisJcmV0dXJuIHByaXYtPnN1YmNvbm5lY3RvciA/IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkIDoKKwkJCQkJY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Cit9CisKK3N0YXRpYyBpbnQgY2g3MDA2X2VuY29kZXJfZ2V0X21vZGVzKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkgICAgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgY2g3MDA2X3ByaXYgKnByaXYgPSB0b19jaDcwMDZfcHJpdihlbmNvZGVyKTsKKwlzdHJ1Y3QgY2g3MDA2X21vZGUgKm1vZGU7CisJaW50IG4gPSAwOworCisJZm9yIChtb2RlID0gY2g3MDA2X21vZGVzOyBtb2RlLT5tb2RlLmNsb2NrOyBtb2RlKyspIHsKKwkJaWYgKH5tb2RlLT52YWxpZF9zY2FsZXMgJiAxPDxwcml2LT5zY2FsZSB8fAorCQkgICAgfm1vZGUtPnZhbGlkX25vcm1zICYgMTw8cHJpdi0+bm9ybSkKKwkJCWNvbnRpbnVlOworCisJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLAorCQkJCWRybV9tb2RlX2R1cGxpY2F0ZShlbmNvZGVyLT5kZXYsICZtb2RlLT5tb2RlKSk7CisKKwkJbisrOworCX0KKworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IGNoNzAwNl9lbmNvZGVyX2NyZWF0ZV9yZXNvdXJjZXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCQkgICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBjaDcwMDZfcHJpdiAqcHJpdiA9IHRvX2NoNzAwNl9wcml2KGVuY29kZXIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9tb2RlX2NvbmZpZyAqY29uZiA9ICZkZXYtPm1vZGVfY29uZmlnOworCisJZHJtX21vZGVfY3JlYXRlX3R2X3Byb3BlcnRpZXMoZGV2LCBOVU1fVFZfTk9STVMsIGNoNzAwNl90dl9ub3JtX25hbWVzKTsKKworCXByaXYtPnNjYWxlX3Byb3BlcnR5ID0gZHJtX3Byb3BlcnR5X2NyZWF0ZShkZXYsIERSTV9NT0RFX1BST1BfUkFOR0UsCisJCQkJCQkgICAic2NhbGUiLCAyKTsKKwlwcml2LT5zY2FsZV9wcm9wZXJ0eS0+dmFsdWVzWzBdID0gMDsKKwlwcml2LT5zY2FsZV9wcm9wZXJ0eS0+dmFsdWVzWzFdID0gMjsKKworCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwgY29uZi0+dHZfc2VsZWN0X3N1YmNvbm5lY3Rvcl9wcm9wZXJ0eSwKKwkJCQkgICAgICBwcml2LT5zZWxlY3Rfc3ViY29ubmVjdG9yKTsKKwlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsIGNvbmYtPnR2X3N1YmNvbm5lY3Rvcl9wcm9wZXJ0eSwKKwkJCQkgICAgICBwcml2LT5zdWJjb25uZWN0b3IpOworCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwgY29uZi0+dHZfbGVmdF9tYXJnaW5fcHJvcGVydHksCisJCQkJICAgICAgcHJpdi0+aG1hcmdpbik7CisJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLCBjb25mLT50dl9ib3R0b21fbWFyZ2luX3Byb3BlcnR5LAorCQkJCSAgICAgIHByaXYtPnZtYXJnaW4pOworCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwgY29uZi0+dHZfbW9kZV9wcm9wZXJ0eSwKKwkJCQkgICAgICBwcml2LT5ub3JtKTsKKwlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsIGNvbmYtPnR2X2JyaWdodG5lc3NfcHJvcGVydHksCisJCQkJICAgICAgcHJpdi0+YnJpZ2h0bmVzcyk7CisJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLCBjb25mLT50dl9jb250cmFzdF9wcm9wZXJ0eSwKKwkJCQkgICAgICBwcml2LT5jb250cmFzdCk7CisJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLCBjb25mLT50dl9mbGlja2VyX3JlZHVjdGlvbl9wcm9wZXJ0eSwKKwkJCQkgICAgICBwcml2LT5mbGlja2VyKTsKKwlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsIHByaXYtPnNjYWxlX3Byb3BlcnR5LAorCQkJCSAgICAgIHByaXYtPnNjYWxlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoNzAwNl9lbmNvZGVyX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJICAgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJICAgICAgIHN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LAorCQkJCSAgICAgICB1aW50NjRfdCB2YWwpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRybV9pMmNfZW5jb2Rlcl9nZXRfY2xpZW50KGVuY29kZXIpOworCXN0cnVjdCBjaDcwMDZfcHJpdiAqcHJpdiA9IHRvX2NoNzAwNl9wcml2KGVuY29kZXIpOworCXN0cnVjdCBjaDcwMDZfc3RhdGUgKnN0YXRlID0gJnByaXYtPnN0YXRlOworCXN0cnVjdCBkcm1fbW9kZV9jb25maWcgKmNvbmYgPSAmZW5jb2Rlci0+ZGV2LT5tb2RlX2NvbmZpZzsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBlbmNvZGVyLT5jcnRjOworCWJvb2wgbW9kZXNfY2hhbmdlZCA9IGZhbHNlOworCisJY2g3MDA2X2RiZyhjbGllbnQsICJcbiIpOworCisJaWYgKHByb3BlcnR5ID09IGNvbmYtPnR2X3NlbGVjdF9zdWJjb25uZWN0b3JfcHJvcGVydHkpIHsKKwkJcHJpdi0+c2VsZWN0X3N1YmNvbm5lY3RvciA9IHZhbDsKKworCQljaDcwMDZfc2V0dXBfcG93ZXJfc3RhdGUoZW5jb2Rlcik7CisKKwkJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9QT1dFUik7CisKKwl9IGVsc2UgaWYgKHByb3BlcnR5ID09IGNvbmYtPnR2X2xlZnRfbWFyZ2luX3Byb3BlcnR5KSB7CisJCXByaXYtPmhtYXJnaW4gPSB2YWw7CisKKwkJY2g3MDA2X3NldHVwX3Byb3BlcnRpZXMoZW5jb2Rlcik7CisKKwkJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9QT1YpOworCQljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0hQT1MpOworCisJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBjb25mLT50dl9ib3R0b21fbWFyZ2luX3Byb3BlcnR5KSB7CisJCXByaXYtPnZtYXJnaW4gPSB2YWw7CisKKwkJY2g3MDA2X3NldHVwX3Byb3BlcnRpZXMoZW5jb2Rlcik7CisKKwkJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9QT1YpOworCQljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1ZQT1MpOworCisJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBjb25mLT50dl9tb2RlX3Byb3BlcnR5KSB7CisJCWlmIChjb25uZWN0b3ItPmRwbXMgIT0gRFJNX01PREVfRFBNU19PRkYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwcml2LT5ub3JtID0gdmFsOworCisJCW1vZGVzX2NoYW5nZWQgPSB0cnVlOworCisJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBjb25mLT50dl9icmlnaHRuZXNzX3Byb3BlcnR5KSB7CisJCXByaXYtPmJyaWdodG5lc3MgPSB2YWw7CisKKwkJY2g3MDA2X3NldHVwX2xldmVscyhlbmNvZGVyKTsKKworCQljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0JMQUNLX0xFVkVMKTsKKworCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gY29uZi0+dHZfY29udHJhc3RfcHJvcGVydHkpIHsKKwkJcHJpdi0+Y29udHJhc3QgPSB2YWw7CisKKwkJY2g3MDA2X3NldHVwX3Byb3BlcnRpZXMoZW5jb2Rlcik7CisKKwkJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9DT05UUkFTVCk7CisKKwl9IGVsc2UgaWYgKHByb3BlcnR5ID09IGNvbmYtPnR2X2ZsaWNrZXJfcmVkdWN0aW9uX3Byb3BlcnR5KSB7CisJCXByaXYtPmZsaWNrZXIgPSB2YWw7CisKKwkJY2g3MDA2X3NldHVwX3Byb3BlcnRpZXMoZW5jb2Rlcik7CisKKwkJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9GRklMVEVSKTsKKworCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gcHJpdi0+c2NhbGVfcHJvcGVydHkpIHsKKwkJaWYgKGNvbm5lY3Rvci0+ZHBtcyAhPSBEUk1fTU9ERV9EUE1TX09GRikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXByaXYtPnNjYWxlID0gdmFsOworCisJCW1vZGVzX2NoYW5nZWQgPSB0cnVlOworCisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG1vZGVzX2NoYW5nZWQpIHsKKwkJZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzKGNvbm5lY3RvciwgMCwgMCk7CisKKwkJLyogRGlzYWJsZSB0aGUgY3J0YyB0byBlbnN1cmUgYSBmdWxsIG1vZGVzZXQgaXMKKwkJICogcGVyZm9ybWVkIHdoZW5ldmVyIGl0J3MgdHVybmVkIG9uIGFnYWluLiAqLworCQlpZiAoY3J0YykgeworCQkJc3RydWN0IGRybV9tb2RlX3NldCBtb2Rlc2V0ID0geworCQkJCS5jcnRjID0gY3J0YywKKwkJCX07CisKKwkJCWNydGMtPmZ1bmNzLT5zZXRfY29uZmlnKCZtb2Rlc2V0KTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyX3NsYXZlX2Z1bmNzIGNoNzAwNl9lbmNvZGVyX2Z1bmNzID0geworCS5zZXRfY29uZmlnID0gY2g3MDA2X2VuY29kZXJfc2V0X2NvbmZpZywKKwkuZGVzdHJveSA9IGNoNzAwNl9lbmNvZGVyX2Rlc3Ryb3ksCisJLmRwbXMgPSBjaDcwMDZfZW5jb2Rlcl9kcG1zLAorCS5zYXZlID0gY2g3MDA2X2VuY29kZXJfc2F2ZSwKKwkucmVzdG9yZSA9IGNoNzAwNl9lbmNvZGVyX3Jlc3RvcmUsCisJLm1vZGVfZml4dXAgPSBjaDcwMDZfZW5jb2Rlcl9tb2RlX2ZpeHVwLAorCS5tb2RlX3ZhbGlkID0gY2g3MDA2X2VuY29kZXJfbW9kZV92YWxpZCwKKwkubW9kZV9zZXQgPSBjaDcwMDZfZW5jb2Rlcl9tb2RlX3NldCwKKwkuZGV0ZWN0ID0gY2g3MDA2X2VuY29kZXJfZGV0ZWN0LAorCS5nZXRfbW9kZXMgPSBjaDcwMDZfZW5jb2Rlcl9nZXRfbW9kZXMsCisJLmNyZWF0ZV9yZXNvdXJjZXMgPSBjaDcwMDZfZW5jb2Rlcl9jcmVhdGVfcmVzb3VyY2VzLAorCS5zZXRfcHJvcGVydHkgPSBjaDcwMDZfZW5jb2Rlcl9zZXRfcHJvcGVydHksCit9OworCisKKy8qIEkyQyBkcml2ZXIgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbnQgY2g3MDA2X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwl1aW50OF90IGFkZHIgPSBDSDcwMDZfVkVSU0lPTl9JRDsKKwl1aW50OF90IHZhbDsKKwlpbnQgcmV0OworCisJY2g3MDA2X2RiZyhjbGllbnQsICJcbiIpOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmFpbDsKKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsICZ2YWwsIHNpemVvZih2YWwpKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmYWlsOworCisJY2g3MDA2X2luZm8oY2xpZW50LCAiRGV0ZWN0ZWQgdmVyc2lvbiBJRDogJXhcbiIsIHZhbCk7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwljaDcwMDZfZXJyKGNsaWVudCwgIkVycm9yICVkIHJlYWRpbmcgdmVyc2lvbiBJRFxuIiwgcmV0KTsKKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGNoNzAwNl9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwljaDcwMDZfZGJnKGNsaWVudCwgIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaDcwMDZfZW5jb2Rlcl9pbml0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgICAgc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2VuY29kZXJfc2xhdmUgKmVuY29kZXIpCit7CisJc3RydWN0IGNoNzAwNl9wcml2ICpwcml2OworCWludCBpOworCisJY2g3MDA2X2RiZyhjbGllbnQsICJcbiIpOworCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVuY29kZXItPnNsYXZlX3ByaXYgPSBwcml2OworCWVuY29kZXItPnNsYXZlX2Z1bmNzID0gJmNoNzAwNl9lbmNvZGVyX2Z1bmNzOworCisJcHJpdi0+bm9ybSA9IFRWX05PUk1fUEFMOworCXByaXYtPnNlbGVjdF9zdWJjb25uZWN0b3IgPSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfQXV0b21hdGljOworCXByaXYtPnN1YmNvbm5lY3RvciA9IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9Vbmtub3duOworCXByaXYtPnNjYWxlID0gMTsKKwlwcml2LT5jb250cmFzdCA9IDUwOworCXByaXYtPmJyaWdodG5lc3MgPSA1MDsKKwlwcml2LT5mbGlja2VyID0gNTA7CisJcHJpdi0+aG1hcmdpbiA9IDUwOworCXByaXYtPnZtYXJnaW4gPSA1MDsKKwlwcml2LT5sYXN0X2RwbXMgPSAtMTsKKworCWlmIChjaDcwMDZfdHZfbm9ybSkgeworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1RWX05PUk1TOyBpKyspIHsKKwkJCWlmICghc3RyY21wKGNoNzAwNl90dl9ub3JtX25hbWVzW2ldLCBjaDcwMDZfdHZfbm9ybSkpIHsKKwkJCQlwcml2LT5ub3JtID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChpID09IE5VTV9UVl9OT1JNUykKKwkJCWNoNzAwNl9lcnIoY2xpZW50LCAiSW52YWxpZCBUViBub3JtIHNldHRpbmcgXCIlc1wiLlxuIiwKKwkJCQkgICBjaDcwMDZfdHZfbm9ybSk7CisJfQorCisJaWYgKGNoNzAwNl9zY2FsZSA+PSAwICYmIGNoNzAwNl9zY2FsZSA8PSAyKQorCQlwcml2LT5zY2FsZSA9IGNoNzAwNl9zY2FsZTsKKwllbHNlCisJCWNoNzAwNl9lcnIoY2xpZW50LCAiSW52YWxpZCBzY2FsZSBzZXR0aW5nIFwiJWRcIi5cbiIsCisJCQkgICBjaDcwMDZfc2NhbGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RldmljZV9pZCBjaDcwMDZfaWRzW10gPSB7CisJeyAiY2g3MDA2IiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBjaDcwMDZfaWRzKTsKKworc3RhdGljIHN0cnVjdCBkcm1faTJjX2VuY29kZXJfZHJpdmVyIGNoNzAwNl9kcml2ZXIgPSB7CisJLmkyY19kcml2ZXIgPSB7CisJCS5wcm9iZSA9IGNoNzAwNl9wcm9iZSwKKwkJLnJlbW92ZSA9IGNoNzAwNl9yZW1vdmUsCisKKwkJLmRyaXZlciA9IHsKKwkJCS5uYW1lID0gImNoNzAwNiIsCisJCX0sCisKKwkJLmlkX3RhYmxlID0gY2g3MDA2X2lkcywKKwl9LAorCisJLmVuY29kZXJfaW5pdCA9IGNoNzAwNl9lbmNvZGVyX2luaXQsCit9OworCisKKy8qIE1vZHVsZSBpbml0aWFsaXphdGlvbiAqLworCitzdGF0aWMgaW50IF9faW5pdCBjaDcwMDZfaW5pdCh2b2lkKQoreworCXJldHVybiBkcm1faTJjX2VuY29kZXJfcmVnaXN0ZXIoVEhJU19NT0RVTEUsICZjaDcwMDZfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNoNzAwNl9leGl0KHZvaWQpCit7CisJZHJtX2kyY19lbmNvZGVyX3VucmVnaXN0ZXIoJmNoNzAwNl9kcml2ZXIpOworfQorCitpbnQgY2g3MDA2X2RlYnVnOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBjaDcwMDZfZGVidWcsIGludCwgMDYwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRW5hYmxlIGRlYnVnIG91dHB1dC4iKTsKKworY2hhciAqY2g3MDA2X3R2X25vcm07Cittb2R1bGVfcGFyYW1fbmFtZWQodHZfbm9ybSwgY2g3MDA2X3R2X25vcm0sIGNoYXJwLCAwNjAwKTsKK01PRFVMRV9QQVJNX0RFU0ModHZfbm9ybSwgIkRlZmF1bHQgVFYgbm9ybS5cbiIKKwkJICJcdFx0U3VwcG9ydGVkOiBQQUwsIFBBTC1NLCBQQUwtTiwgUEFMLU5jLCBQQUwtNjAsIE5UU0MtTSwgTlRTQy1KLlxuIgorCQkgIlx0XHREZWZhdWx0OiBQQUwiKTsKKworaW50IGNoNzAwNl9zY2FsZSA9IDE7Cittb2R1bGVfcGFyYW1fbmFtZWQoc2NhbGUsIGNoNzAwNl9zY2FsZSwgaW50LCAwNjAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc2NhbGUsICJEZWZhdWx0IHNjYWxlLlxuIgorCQkgIlx0XHRTdXBwb3J0ZWQ6IDAgLT4gU2VsZWN0IHZpZGVvIG1vZGVzIHdpdGggYSBoaWdoZXIgYmxhbmtpbmcgcmF0aW8uXG4iCisJCSAiXHRcdFx0MSAtPiBTZWxlY3QgZGVmYXVsdCB2aWRlbyBtb2Rlcy5cbiIKKwkJICJcdFx0XHQyIC0+IFNlbGVjdCB2aWRlbyBtb2RlcyB3aXRoIGEgbG93ZXIgYmxhbmtpbmcgcmF0aW8uIik7CisKK01PRFVMRV9BVVRIT1IoIkZyYW5jaXNjbyBKZXJleiA8Y3Vycm9qZXJlekByaXNldXAubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDaHJvbnRlbCBjaDcwMDYgVFYgZW5jb2RlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CisKK21vZHVsZV9pbml0KGNoNzAwNl9pbml0KTsKK21vZHVsZV9leGl0KGNoNzAwNl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pMmMvY2g3MDA2X21vZGUuYyBiL2RyaXZlcnMvZ3B1L2RybS9pMmMvY2g3MDA2X21vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2Y1NDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2kyYy9jaDcwMDZfbW9kZS5jCkBAIC0wLDAgKzEsNDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEZyYW5jaXNjbyBKZXJlei4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJjaDcwMDZfcHJpdi5oIgorCitjaGFyICpjaDcwMDZfdHZfbm9ybV9uYW1lc1tdID0geworCVtUVl9OT1JNX1BBTF0gPSAiUEFMIiwKKwlbVFZfTk9STV9QQUxfTV0gPSAiUEFMLU0iLAorCVtUVl9OT1JNX1BBTF9OXSA9ICJQQUwtTiIsCisJW1RWX05PUk1fUEFMX05DXSA9ICJQQUwtTmMiLAorCVtUVl9OT1JNX1BBTF82MF0gPSAiUEFMLTYwIiwKKwlbVFZfTk9STV9OVFNDX01dID0gIk5UU0MtTSIsCisJW1RWX05PUk1fTlRTQ19KXSA9ICJOVFNDLUoiLAorfTsKKworI2RlZmluZSBOVFNDX0xJS0VfVElNSU5HUyAudnJlZnJlc2ggPSA2MCAqIGZpeGVkMS8xLjAwMSwJCVwKKwkJLnZkaXNwbGF5ID0gNDgwLAkJCQkJXAorCQkudnRvdGFsID0gNTI1LAkJCQkJCVwKKwkJLmh2aXJ0dWFsID0gNjYwCisKKyNkZWZpbmUgUEFMX0xJS0VfVElNSU5HUyAudnJlZnJlc2ggPSA1MCAqIGZpeGVkMSwJCVwKKwkJLnZkaXNwbGF5ID0gNTc2LAkJCQlcCisJCS52dG90YWwgPSA2MjUsCQkJCQlcCisJCS5odmlydHVhbCA9IDgxMAorCitzdHJ1Y3QgY2g3MDA2X3R2X25vcm1faW5mbyBjaDcwMDZfdHZfbm9ybXNbXSA9IHsKKwlbVFZfTk9STV9OVFNDX01dID0geworCQlOVFNDX0xJS0VfVElNSU5HUywKKwkJLmJsYWNrX2xldmVsID0gMC4zMzkgKiBmaXhlZDEsCisJCS5zdWJjX2ZyZXEgPSAzNTc5NTQ1ICogZml4ZWQxLAorCQkuZGlzcG1vZGUgPSBiaXRmcyhDSDcwMDZfRElTUE1PREVfT1VUUFVUX1NURCwgTlRTQyksCisJCS52b2Zmc2V0ID0gMCwKKwl9LAorCVtUVl9OT1JNX05UU0NfSl0gPSB7CisJCU5UU0NfTElLRV9USU1JTkdTLAorCQkuYmxhY2tfbGV2ZWwgPSAwLjI4NiAqIGZpeGVkMSwKKwkJLnN1YmNfZnJlcSA9IDM1Nzk1NDUgKiBmaXhlZDEsCisJCS5kaXNwbW9kZSA9IGJpdGZzKENINzAwNl9ESVNQTU9ERV9PVVRQVVRfU1RELCBOVFNDX0opLAorCQkudm9mZnNldCA9IDAsCisJfSwKKwlbVFZfTk9STV9QQUxdID0geworCQlQQUxfTElLRV9USU1JTkdTLAorCQkuYmxhY2tfbGV2ZWwgPSAwLjMgKiBmaXhlZDEsCisJCS5zdWJjX2ZyZXEgPSA0NDMzNjE4Ljc1ICogZml4ZWQxLAorCQkuZGlzcG1vZGUgPSBiaXRmcyhDSDcwMDZfRElTUE1PREVfT1VUUFVUX1NURCwgUEFMKSwKKwkJLnZvZmZzZXQgPSAwLAorCX0sCisJW1RWX05PUk1fUEFMX01dID0geworCQlOVFNDX0xJS0VfVElNSU5HUywKKwkJLmJsYWNrX2xldmVsID0gMC4zMzkgKiBmaXhlZDEsCisJCS5zdWJjX2ZyZXEgPSAzNTc1NjExLjQzMyAqIGZpeGVkMSwKKwkJLmRpc3Btb2RlID0gYml0ZnMoQ0g3MDA2X0RJU1BNT0RFX09VVFBVVF9TVEQsIFBBTF9NKSwKKwkJLnZvZmZzZXQgPSAxNiwKKwl9LAorCisJLyogVGhlIGZvbGxvd2luZyBtb2RlcyBzZWVtIHRvIHdvcmsgcmlnaHQgYnV0IHRoZXkncmUKKwkgKiB1bmRvY3VtZW50ZWQgKi8KKworCVtUVl9OT1JNX1BBTF9OXSA9IHsKKwkJUEFMX0xJS0VfVElNSU5HUywKKwkJLmJsYWNrX2xldmVsID0gMC4zMzkgKiBmaXhlZDEsCisJCS5zdWJjX2ZyZXEgPSA0NDMzNjE4Ljc1ICogZml4ZWQxLAorCQkuZGlzcG1vZGUgPSBiaXRmcyhDSDcwMDZfRElTUE1PREVfT1VUUFVUX1NURCwgUEFMKSwKKwkJLnZvZmZzZXQgPSAwLAorCX0sCisJW1RWX05PUk1fUEFMX05DXSA9IHsKKwkJUEFMX0xJS0VfVElNSU5HUywKKwkJLmJsYWNrX2xldmVsID0gMC4zICogZml4ZWQxLAorCQkuc3ViY19mcmVxID0gMzU4MjA1Ni4yNSAqIGZpeGVkMSwKKwkJLmRpc3Btb2RlID0gYml0ZnMoQ0g3MDA2X0RJU1BNT0RFX09VVFBVVF9TVEQsIFBBTCksCisJCS52b2Zmc2V0ID0gMCwKKwl9LAorCVtUVl9OT1JNX1BBTF82MF0gPSB7CisJCU5UU0NfTElLRV9USU1JTkdTLAorCQkuYmxhY2tfbGV2ZWwgPSAwLjMgKiBmaXhlZDEsCisJCS5zdWJjX2ZyZXEgPSA0NDMzNjE4Ljc1ICogZml4ZWQxLAorCQkuZGlzcG1vZGUgPSBiaXRmcyhDSDcwMDZfRElTUE1PREVfT1VUUFVUX1NURCwgUEFMX00pLAorCQkudm9mZnNldCA9IDE2LAorCX0sCit9OworCisjZGVmaW5lIF9fTU9ERShmLCBoZCwgdmQsIGh0LCB2dCwgaHN5bnAsIHZzeW5wLAkJCQlcCisJICAgICAgIHN1YmMsIHNjYWxlLCBzY2FsZV9tYXNrLCBub3JtX21hc2ssIGVfaGQsIGVfdmQpIHsJXAorCQkubW9kZSA9IHsJCQkJCQlcCisJCQkubmFtZSA9ICNoZCAieCIgI3ZkLAkJCQlcCisJCQkuc3RhdHVzID0gMCwJCQkJCVwKKwkJCS50eXBlID0gRFJNX01PREVfVFlQRV9EUklWRVIsCQkJXAorCQkJLmNsb2NrID0gZiwJCQkJCVwKKwkJCS5oZGlzcGxheSA9IGhkLAkJCQkJXAorCQkJLmhzeW5jX3N0YXJ0ID0gZV9oZCArIDE2LAkJCVwKKwkJCS5oc3luY19lbmQgPSBlX2hkICsgODAsCQkJCVwKKwkJCS5odG90YWwgPSBodCwJCQkJCVwKKwkJCS5oc2tldyA9IDAsCQkJCQlcCisJCQkudmRpc3BsYXkgPSB2ZCwJCQkJCVwKKwkJCS52c3luY19zdGFydCA9IHZkICsgMTAsCQkJCVwKKwkJCS52c3luY19lbmQgPSB2ZCArIDI2LAkJCQlcCisJCQkudnRvdGFsID0gdnQsCQkJCQlcCisJCQkudnNjYW4gPSAwLAkJCQkJXAorCQkJLmZsYWdzID0gRFJNX01PREVfRkxBR18jI2hzeW5wIyNIU1lOQyB8CQlcCisJCQkJRFJNX01PREVfRkxBR18jI3ZzeW5wIyNWU1lOQywJCVwKKwkJCS52cmVmcmVzaCA9IDAsCQkJCQlcCisJCX0sCQkJCQkJCVwKKwkJLmVuY19oZGlzcCA9IGVfaGQsCQkJCQlcCisJCS5lbmNfdmRpc3AgPSBlX3ZkLAkJCQkJXAorCQkuc3ViY19jb2VmZiA9IHN1YmMgKiBmaXhlZDEsCQkJCVwKKwkJLmRpc3Btb2RlID0gYml0ZnMoQ0g3MDA2X0RJU1BNT0RFX1NDQUxJTkdfUkFUSU8sIHNjYWxlKSB8IFwKKwkJCSAgICBiaXRmcyhDSDcwMDZfRElTUE1PREVfSU5QVVRfUkVTLCBlX2hkIyN4IyNlX3ZkKSwgXAorCQkudmFsaWRfc2NhbGVzID0gc2NhbGVfbWFzaywJCQkJXAorCQkudmFsaWRfbm9ybXMgPSBub3JtX21hc2sJCQkJXAorCSB9CisKKyNkZWZpbmUgTU9ERShmLCBoZCwgdmQsIGh0LCB2dCwgaHN5bnAsIHZzeW5wLAkJCQlcCisJICAgICBzdWJjLCBzY2FsZSwgc2NhbGVfbWFzaywgbm9ybV9tYXNrKQkJCVwKKwlfX01PREUoZiwgaGQsIHZkLCBodCwgdnQsIGhzeW5wLCB2c3lucCwgc3ViYywgc2NhbGUsCQlcCisJICAgICAgIHNjYWxlX21hc2ssIG5vcm1fbWFzaywgaGQsIHZkKQorCisjZGVmaW5lIE5UU0NfTElLRSAoMSA8PCBUVl9OT1JNX05UU0NfTSB8IDEgPDwgVFZfTk9STV9OVFNDX0ogfAkJXAorCQkgICAxIDw8IFRWX05PUk1fUEFMX00gfCAxIDw8IFRWX05PUk1fUEFMXzYwKQorCisjZGVmaW5lIFBBTF9MSUtFICgxIDw8IFRWX05PUk1fUEFMIHwgMSA8PCBUVl9OT1JNX1BBTF9OIHwgMSA8PCBUVl9OT1JNX1BBTF9OQykKKworc3RydWN0IGNoNzAwNl9tb2RlIGNoNzAwNl9tb2Rlc1tdID0geworCU1PREUoMjEwMDAsIDUxMiwgMzg0LCA4NDAsIDUwMCwgTiwgTiwgMTgxLjc5NzU1NzU4MiwgNV80LCAweDYsIFBBTF9MSUtFKSwKKwlNT0RFKDI2MjUwLCA1MTIsIDM4NCwgODQwLCA2MjUsIE4sIE4sIDE0NS40MzgwNDYwNjYsIDFfMSwgMHgxLCBQQUxfTElLRSksCisJTU9ERSgyMDE0MCwgNTEyLCAzODQsIDgwMCwgNDIwLCBOLCBOLCAyMTMuMjU3MDgzNzkxLCA1XzQsIDB4NCwgTlRTQ19MSUtFKSwKKwlNT0RFKDI0NjcxLCA1MTIsIDM4NCwgNzg0LCA1MjUsIE4sIE4sIDE3NC4wODc0MTUzLCAxXzEsIDB4MywgTlRTQ19MSUtFKSwKKwlNT0RFKDI4MTI1LCA3MjAsIDQwMCwgMTEyNSwgNTAwLCBOLCBOLCAxMzUuNzQyMTc2Mjk4LCA1XzQsIDB4NiwgUEFMX0xJS0UpLAorCU1PREUoMzQ4NzUsIDcyMCwgNDAwLCAxMTE2LCA2MjUsIE4sIE4sIDEwOS40Njk0OTY4OTgsIDFfMSwgMHgxLCBQQUxfTElLRSksCisJTU9ERSgyMzc5MCwgNzIwLCA0MDAsIDk0NSwgNDIwLCBOLCBOLCAxNjAuNDc1NjQyMDE2LCA1XzQsIDB4NCwgTlRTQ19MSUtFKSwKKwlNT0RFKDI5NDU1LCA3MjAsIDQwMCwgOTM2LCA1MjUsIE4sIE4sIDEyOS42MTQ5NDE4NDMsIDFfMSwgMHgzLCBOVFNDX0xJS0UpLAorCU1PREUoMjUwMDAsIDY0MCwgNDAwLCAxMDAwLCA1MDAsIE4sIE4sIDE1Mi43MDk5NDgyNzksIDVfNCwgMHg2LCBQQUxfTElLRSksCisJTU9ERSgzMTUwMCwgNjQwLCA0MDAsIDEwMDgsIDYyNSwgTiwgTiwgMTIxLjE5ODM3MTY0NiwgMV8xLCAweDEsIFBBTF9MSUtFKSwKKwlNT0RFKDIxMTQ3LCA2NDAsIDQwMCwgODQwLCA0MjAsIE4sIE4sIDE4MC41MzUwOTczMzgsIDVfNCwgMHg0LCBOVFNDX0xJS0UpLAorCU1PREUoMjY0MzQsIDY0MCwgNDAwLCA4NDAsIDUyNSwgTiwgTiwgMTQ0LjQyODA3Nzg3LCAxXzEsIDB4MiwgTlRTQ19MSUtFKSwKKwlNT0RFKDMwMjEwLCA2NDAsIDQwMCwgODQwLCA2MDAsIE4sIE4sIDEyNi4zNzQ1NjgyNzYsIDdfOCwgMHgxLCBOVFNDX0xJS0UpLAorCU1PREUoMjEwMDAsIDY0MCwgNDgwLCA4NDAsIDUwMCwgTiwgTiwgMTgxLjc5NzU1NzU4MiwgNV80LCAweDQsIFBBTF9MSUtFKSwKKwlNT0RFKDI2MjUwLCA2NDAsIDQ4MCwgODQwLCA2MjUsIE4sIE4sIDE0NS40MzgwNDYwNjYsIDFfMSwgMHgyLCBQQUxfTElLRSksCisJTU9ERSgzMTUwMCwgNjQwLCA0ODAsIDg0MCwgNzUwLCBOLCBOLCAxMjEuMTk4MzcxNjQ2LCA1XzYsIDB4MSwgUEFMX0xJS0UpLAorCU1PREUoMjQ2NzEsIDY0MCwgNDgwLCA3ODQsIDUyNSwgTiwgTiwgMTc0LjA4NzQxNTMsIDFfMSwgMHg0LCBOVFNDX0xJS0UpLAorCU1PREUoMjgxOTYsIDY0MCwgNDgwLCA3ODQsIDYwMCwgTiwgTiwgMTUyLjMyNjQ4ODQyMiwgN184LCAweDIsIE5UU0NfTElLRSksCisJTU9ERSgzMDIxMCwgNjQwLCA0ODAsIDgwMCwgNjMwLCBOLCBOLCAxNDIuMTcxMzg5MTAxLCA1XzYsIDB4MSwgTlRTQ19MSUtFKSwKKwlfX01PREUoMjk1MDAsIDcyMCwgNTc2LCA5NDQsIDYyNSwgUCwgUCwgMTQ1LjU5MjExMTYzNiwgMV8xLCAweDcsIFBBTF9MSUtFLCA4MDAsIDYwMCksCisJTU9ERSgzNjAwMCwgODAwLCA2MDAsIDk2MCwgNzUwLCBQLCBQLCAxMTkuMzA0NjQ3MDIyLCA1XzYsIDB4NiwgUEFMX0xJS0UpLAorCU1PREUoMzkwMDAsIDgwMCwgNjAwLCA5MzYsIDgzNiwgUCwgUCwgMTEwLjEyNzM2NjQ5OSwgM180LCAweDEsIFBBTF9MSUtFKSwKKwlNT0RFKDM5MjczLCA4MDAsIDYwMCwgMTA0MCwgNjMwLCBQLCBQLCAxNDUuODE2ODA5Mzk5LCA1XzYsIDB4NCwgTlRTQ19MSUtFKSwKKwlNT0RFKDQzNjM2LCA4MDAsIDYwMCwgMTA0MCwgNzAwLCBQLCBQLCAxMzEuMjM1MTI4NDg3LCAzXzQsIDB4MiwgTlRTQ19MSUtFKSwKKwlNT0RFKDQ3ODMyLCA4MDAsIDYwMCwgMTA2NCwgNzUwLCBQLCBQLCAxMTkuNzIzMjc1MTY1LCA3XzEwLCAweDEsIE5UU0NfTElLRSksCisJe30KK307CisKK3N0cnVjdCBjaDcwMDZfbW9kZSAqY2g3MDA2X2xvb2t1cF9tb2RlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmRybV9tb2RlKQoreworCXN0cnVjdCBjaDcwMDZfcHJpdiAqcHJpdiA9IHRvX2NoNzAwNl9wcml2KGVuY29kZXIpOworCXN0cnVjdCBjaDcwMDZfbW9kZSAqbW9kZTsKKworCWZvciAobW9kZSA9IGNoNzAwNl9tb2RlczsgbW9kZS0+bW9kZS5jbG9jazsgbW9kZSsrKSB7CisKKwkJaWYgKH5tb2RlLT52YWxpZF9ub3JtcyAmIDE8PHByaXYtPm5vcm0pCisJCQljb250aW51ZTsKKworCQlpZiAobW9kZS0+bW9kZS5oZGlzcGxheSAhPSBkcm1fbW9kZS0+aGRpc3BsYXkgfHwKKwkJICAgIG1vZGUtPm1vZGUudmRpc3BsYXkgIT0gZHJtX21vZGUtPnZkaXNwbGF5IHx8CisJCSAgICBtb2RlLT5tb2RlLnZ0b3RhbCAhPSBkcm1fbW9kZS0+dnRvdGFsIHx8CisJCSAgICBtb2RlLT5tb2RlLmh0b3RhbCAhPSBkcm1fbW9kZS0+aHRvdGFsIHx8CisJCSAgICBtb2RlLT5tb2RlLmNsb2NrICE9IGRybV9tb2RlLT5jbG9jaykKKwkJCWNvbnRpbnVlOworCisJCXJldHVybiBtb2RlOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBTb21lIGNvbW1vbiBIVyBzdGF0ZSBjYWxjdWxhdGlvbiBjb2RlICovCisKK3ZvaWQgY2g3MDA2X3NldHVwX2xldmVscyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRybV9pMmNfZW5jb2Rlcl9nZXRfY2xpZW50KGVuY29kZXIpOworCXN0cnVjdCBjaDcwMDZfcHJpdiAqcHJpdiA9IHRvX2NoNzAwNl9wcml2KGVuY29kZXIpOworCXVpbnQ4X3QgKnJlZ3MgPSBwcml2LT5zdGF0ZS5yZWdzOworCXN0cnVjdCBjaDcwMDZfdHZfbm9ybV9pbmZvICpub3JtID0gJmNoNzAwNl90dl9ub3Jtc1twcml2LT5ub3JtXTsKKwlpbnQgZ2FpbjsKKwlpbnQgYmxhY2tfbGV2ZWw7CisKKwkvKiBTZXQgREFDX0dBSU4gaWYgdGhlIHZvbHRhZ2UgZHJvcCBiZXR3ZWVuIHdoaXRlIGFuZCBibGFjayBpcworCSAqIGhpZ2ggZW5vdWdoLiAqLworCWlmIChub3JtLT5ibGFja19sZXZlbCA8IDMzOSpmaXhlZDEvMTAwMCkgeworCQlnYWluID0gNzY7CisKKwkJcmVnc1tDSDcwMDZfSU5QVVRfRk9STUFUXSB8PSBDSDcwMDZfSU5QVVRfRk9STUFUX0RBQ19HQUlOOworCX0gZWxzZSB7CisJCWdhaW4gPSA3MTsKKworCQlyZWdzW0NINzAwNl9JTlBVVF9GT1JNQVRdICY9IH5DSDcwMDZfSU5QVVRfRk9STUFUX0RBQ19HQUlOOworCX0KKworCWJsYWNrX2xldmVsID0gcm91bmRfZml4ZWQobm9ybS0+YmxhY2tfbGV2ZWwqMjY2MjUpL2dhaW47CisKKwkvKiBDb3JyZWN0IGl0IHdpdGggdGhlIHNwZWNpZmllZCBicmlnaHRuZXNzLiAqLworCWJsYWNrX2xldmVsID0gaW50ZXJwb2xhdGUoOTAsIGJsYWNrX2xldmVsLCAyMDgsIHByaXYtPmJyaWdodG5lc3MpOworCisJcmVnc1tDSDcwMDZfQkxBQ0tfTEVWRUxdID0gYml0ZihDSDcwMDZfQkxBQ0tfTEVWRUxfMCwgYmxhY2tfbGV2ZWwpOworCisJY2g3MDA2X2RiZyhjbGllbnQsICJibGFjayBsZXZlbDogJWRcbiIsIGJsYWNrX2xldmVsKTsKK30KKwordm9pZCBjaDcwMDZfc2V0dXBfc3ViY2FycmllcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRybV9pMmNfZW5jb2Rlcl9nZXRfY2xpZW50KGVuY29kZXIpOworCXN0cnVjdCBjaDcwMDZfcHJpdiAqcHJpdiA9IHRvX2NoNzAwNl9wcml2KGVuY29kZXIpOworCXN0cnVjdCBjaDcwMDZfc3RhdGUgKnN0YXRlID0gJnByaXYtPnN0YXRlOworCXN0cnVjdCBjaDcwMDZfdHZfbm9ybV9pbmZvICpub3JtID0gJmNoNzAwNl90dl9ub3Jtc1twcml2LT5ub3JtXTsKKwlzdHJ1Y3QgY2g3MDA2X21vZGUgKm1vZGUgPSBwcml2LT5tb2RlOworCXVpbnQzMl90IHN1YmNfaW5jOworCisJc3ViY19pbmMgPSByb3VuZF9maXhlZCgobW9kZS0+c3ViY19jb2VmZiA+PiA4KQorCQkJICAgICAgICogKG5vcm0tPnN1YmNfZnJlcSA+PiAyNCkpOworCisJc2V0Yml0ZihzdGF0ZSwgQ0g3MDA2X1NVQkNfSU5DMCwgMjgsIHN1YmNfaW5jKTsKKwlzZXRiaXRmKHN0YXRlLCBDSDcwMDZfU1VCQ19JTkMxLCAyNCwgc3ViY19pbmMpOworCXNldGJpdGYoc3RhdGUsIENINzAwNl9TVUJDX0lOQzIsIDIwLCBzdWJjX2luYyk7CisJc2V0Yml0ZihzdGF0ZSwgQ0g3MDA2X1NVQkNfSU5DMywgMTYsIHN1YmNfaW5jKTsKKwlzZXRiaXRmKHN0YXRlLCBDSDcwMDZfU1VCQ19JTkM0LCAxMiwgc3ViY19pbmMpOworCXNldGJpdGYoc3RhdGUsIENINzAwNl9TVUJDX0lOQzUsIDgsIHN1YmNfaW5jKTsKKwlzZXRiaXRmKHN0YXRlLCBDSDcwMDZfU1VCQ19JTkM2LCA0LCBzdWJjX2luYyk7CisJc2V0Yml0ZihzdGF0ZSwgQ0g3MDA2X1NVQkNfSU5DNywgMCwgc3ViY19pbmMpOworCisJY2g3MDA2X2RiZyhjbGllbnQsICJzdWJjYXJyaWVyIGluYzogJXVcbiIsIHN1YmNfaW5jKTsKK30KKwordm9pZCBjaDcwMDZfc2V0dXBfcGxsKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZHJtX2kyY19lbmNvZGVyX2dldF9jbGllbnQoZW5jb2Rlcik7CisJc3RydWN0IGNoNzAwNl9wcml2ICpwcml2ID0gdG9fY2g3MDA2X3ByaXYoZW5jb2Rlcik7CisJdWludDhfdCAqcmVncyA9IHByaXYtPnN0YXRlLnJlZ3M7CisJc3RydWN0IGNoNzAwNl9tb2RlICptb2RlID0gcHJpdi0+bW9kZTsKKwlpbnQgbiwgYmVzdF9uID0gMDsKKwlpbnQgbSwgYmVzdF9tID0gMDsKKwlpbnQgZnJlcSwgYmVzdF9mcmVxID0gMDsKKworCWZvciAobiA9IDA7IG4gPCBDSDcwMDZfTUFYTjsgbisrKSB7CisJCWZvciAobSA9IDA7IG0gPCBDSDcwMDZfTUFYTTsgbSsrKSB7CisJCQlmcmVxID0gQ0g3MDA2X0ZSRVEwKihuKzIpLyhtKzIpOworCisJCQlpZiAoYWJzKGZyZXEgLSBtb2RlLT5tb2RlLmNsb2NrKSA8CisJCQkgICAgYWJzKGJlc3RfZnJlcSAtIG1vZGUtPm1vZGUuY2xvY2spKSB7CisJCQkJYmVzdF9mcmVxID0gZnJlcTsKKwkJCQliZXN0X24gPSBuOworCQkJCWJlc3RfbSA9IG07CisJCQl9CisJCX0KKwl9CisKKwlyZWdzW0NINzAwNl9QTExPVl0gPSBiaXRmKENINzAwNl9QTExPVl9OXzgsIGJlc3RfbikgfAorCQliaXRmKENINzAwNl9QTExPVl9NXzgsIGJlc3RfbSk7CisKKwlyZWdzW0NINzAwNl9QTExNXSA9IGJpdGYoQ0g3MDA2X1BMTE1fMCwgYmVzdF9tKTsKKwlyZWdzW0NINzAwNl9QTExOXSA9IGJpdGYoQ0g3MDA2X1BMTE5fMCwgYmVzdF9uKTsKKworCWlmIChiZXN0X24gPCAxMDgpCisJCXJlZ3NbQ0g3MDA2X1BMTF9DT05UUk9MXSB8PSBDSDcwMDZfUExMX0NPTlRST0xfQ0FQQUNJVE9SOworCWVsc2UKKwkJcmVnc1tDSDcwMDZfUExMX0NPTlRST0xdICY9IH5DSDcwMDZfUExMX0NPTlRST0xfQ0FQQUNJVE9SOworCisJY2g3MDA2X2RiZyhjbGllbnQsICJuPSVkIG09JWQgZj0lZCBjPSVkXG4iLAorCQkgICBiZXN0X24sIGJlc3RfbSwgYmVzdF9mcmVxLCBiZXN0X24gPCAxMDgpOworfQorCit2b2lkIGNoNzAwNl9zZXR1cF9wb3dlcl9zdGF0ZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGNoNzAwNl9wcml2ICpwcml2ID0gdG9fY2g3MDA2X3ByaXYoZW5jb2Rlcik7CisJdWludDhfdCAqcG93ZXIgPSAmcHJpdi0+c3RhdGUucmVnc1tDSDcwMDZfUE9XRVJdOworCWludCBzdWJjb25uZWN0b3I7CisKKwlzdWJjb25uZWN0b3IgPSBwcml2LT5zZWxlY3Rfc3ViY29ubmVjdG9yID8gcHJpdi0+c2VsZWN0X3N1YmNvbm5lY3RvciA6CisJCQkJCQkJcHJpdi0+c3ViY29ubmVjdG9yOworCisJKnBvd2VyID0gQ0g3MDA2X1BPV0VSX1JFU0VUOworCisJaWYgKHByaXYtPmxhc3RfZHBtcyA9PSBEUk1fTU9ERV9EUE1TX09OKSB7CisJCXN3aXRjaCAoc3ViY29ubmVjdG9yKSB7CisJCWNhc2UgRFJNX01PREVfU1VCQ09OTkVDVE9SX1NWSURFTzoKKwkJCSpwb3dlciB8PSBiaXRmcyhDSDcwMDZfUE9XRVJfTEVWRUwsIENWQlNfT0ZGKTsKKwkJCWJyZWFrOworCQljYXNlIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9Db21wb3NpdGU6CisJCQkqcG93ZXIgfD0gYml0ZnMoQ0g3MDA2X1BPV0VSX0xFVkVMLCBTVklERU9fT0ZGKTsKKwkJCWJyZWFrOworCQljYXNlIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9TQ0FSVDoKKwkJCSpwb3dlciB8PSBiaXRmcyhDSDcwMDZfUE9XRVJfTEVWRUwsIE5PUk1BTCkgfAorCQkJCUNINzAwNl9QT1dFUl9TQ0FSVDsKKwkJCWJyZWFrOworCQl9CisKKwl9IGVsc2UgeworCQkqcG93ZXIgfD0gYml0ZnMoQ0g3MDA2X1BPV0VSX0xFVkVMLCBGVUxMX1BPV0VSX09GRik7CisJfQorfQorCit2b2lkIGNoNzAwNl9zZXR1cF9wcm9wZXJ0aWVzKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZHJtX2kyY19lbmNvZGVyX2dldF9jbGllbnQoZW5jb2Rlcik7CisJc3RydWN0IGNoNzAwNl9wcml2ICpwcml2ID0gdG9fY2g3MDA2X3ByaXYoZW5jb2Rlcik7CisJc3RydWN0IGNoNzAwNl9zdGF0ZSAqc3RhdGUgPSAmcHJpdi0+c3RhdGU7CisJc3RydWN0IGNoNzAwNl90dl9ub3JtX2luZm8gKm5vcm0gPSAmY2g3MDA2X3R2X25vcm1zW3ByaXYtPm5vcm1dOworCXN0cnVjdCBjaDcwMDZfbW9kZSAqY2hfbW9kZSA9IHByaXYtPm1vZGU7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSAmY2hfbW9kZS0+bW9kZTsKKwl1aW50OF90ICpyZWdzID0gc3RhdGUtPnJlZ3M7CisJaW50IGZsaWNrZXIsIGNvbnRyYXN0LCBocG9zLCB2cG9zOworCXVpbnQ2NF90IHNjYWxlLCBhc3BlY3Q7CisKKwlmbGlja2VyID0gaW50ZXJwb2xhdGUoMCwgMiwgMywgcHJpdi0+ZmxpY2tlcik7CisJcmVnc1tDSDcwMDZfRkZJTFRFUl0gPSBiaXRmKENINzAwNl9GRklMVEVSX1RFWFQsIGZsaWNrZXIpIHwKKwkJYml0ZihDSDcwMDZfRkZJTFRFUl9MVU1BLCBmbGlja2VyKSB8CisJCWJpdGYoQ0g3MDA2X0ZGSUxURVJfQ0hST01BLCAxKTsKKworCWNvbnRyYXN0ID0gaW50ZXJwb2xhdGUoMCwgNSwgNywgcHJpdi0+Y29udHJhc3QpOworCXJlZ3NbQ0g3MDA2X0NPTlRSQVNUXSA9IGJpdGYoQ0g3MDA2X0NPTlRSQVNUXzAsIGNvbnRyYXN0KTsKKworCXNjYWxlID0gbm9ybS0+dnRvdGFsKmZpeGVkMTsKKwlkb19kaXYoc2NhbGUsIG1vZGUtPnZ0b3RhbCk7CisKKwlhc3BlY3QgPSBjaF9tb2RlLT5lbmNfaGRpc3AqZml4ZWQxOworCWRvX2Rpdihhc3BlY3QsIGNoX21vZGUtPmVuY192ZGlzcCk7CisKKwlocG9zID0gcm91bmRfZml4ZWQoKG5vcm0tPmh2aXJ0dWFsICogYXNwZWN0IC0gbW9kZS0+aGRpc3BsYXkgKiBzY2FsZSkKKwkJCSAgICogcHJpdi0+aG1hcmdpbiAqIG1vZGUtPnZ0b3RhbCkgLyBub3JtLT52dG90YWwgLyAxMDAgLyA0OworCisJc2V0Yml0ZihzdGF0ZSwgQ0g3MDA2X1BPViwgSFBPU184LCBocG9zKTsKKwlzZXRiaXRmKHN0YXRlLCBDSDcwMDZfSFBPUywgMCwgaHBvcyk7CisKKwl2cG9zID0gbWF4KDAsIG5vcm0tPnZkaXNwbGF5IC0gcm91bmRfZml4ZWQobW9kZS0+dmRpc3BsYXkqc2NhbGUpCisJCSAgICsgbm9ybS0+dm9mZnNldCkgKiBwcml2LT52bWFyZ2luIC8gMTAwIC8gMjsKKworCXNldGJpdGYoc3RhdGUsIENINzAwNl9QT1YsIFZQT1NfOCwgdnBvcyk7CisJc2V0Yml0ZihzdGF0ZSwgQ0g3MDA2X1ZQT1MsIDAsIHZwb3MpOworCisJY2g3MDA2X2RiZyhjbGllbnQsICJocG9zOiAlZCwgdnBvczogJWRcbiIsIGhwb3MsIHZwb3MpOworfQorCisvKiBIVyBhY2Nlc3MgZnVuY3Rpb25zICovCisKK3ZvaWQgY2g3MDA2X3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVpbnQ4X3QgYWRkciwgdWludDhfdCB2YWwpCit7CisJdWludDhfdCBidWZbXSA9IHthZGRyLCB2YWx9OworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIEFSUkFZX1NJWkUoYnVmKSk7CisJaWYgKHJldCA8IDApCisJCWNoNzAwNl9lcnIoY2xpZW50LCAiRXJyb3IgJWQgd3JpdGluZyB0byBzdWJhZGRyZXNzIDB4JXhcbiIsCisJCQkgICByZXQsIGFkZHIpOworfQorCit1aW50OF90IGNoNzAwNl9yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVpbnQ4X3QgYWRkcikKK3sKKwl1aW50OF90IHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmFpbDsKKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsICZ2YWwsIHNpemVvZih2YWwpKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmYWlsOworCisJcmV0dXJuIHZhbDsKKworZmFpbDoKKwljaDcwMDZfZXJyKGNsaWVudCwgIkVycm9yICVkIHJlYWRpbmcgZnJvbSBzdWJhZGRyZXNzIDB4JXhcbiIsCisJCSAgIHJldCwgYWRkcik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2g3MDA2X3N0YXRlX2xvYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJICAgICAgIHN0cnVjdCBjaDcwMDZfc3RhdGUgKnN0YXRlKQoreworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfUE9XRVIpOworCisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9ESVNQTU9ERSk7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9GRklMVEVSKTsKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0JXSURUSCk7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9JTlBVVF9GT1JNQVQpOworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfQ0xLTU9ERSk7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9TVEFSVF9BQ1RJVkUpOworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfUE9WKTsKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0JMQUNLX0xFVkVMKTsKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0hQT1MpOworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfVlBPUyk7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9JTlBVVF9TWU5DKTsKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0RFVEVDVCk7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9DT05UUkFTVCk7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9QTExPVik7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9QTExNKTsKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1BMTE4pOworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfQkNMS09VVCk7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9TVUJDX0lOQzApOworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfU1VCQ19JTkMxKTsKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1NVQkNfSU5DMik7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9TVUJDX0lOQzMpOworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfU1VCQ19JTkM0KTsKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1NVQkNfSU5DNSk7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9TVUJDX0lOQzYpOworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfU1VCQ19JTkM3KTsKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1BMTF9DT05UUk9MKTsKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0NBTENfU1VCQ19JTkMwKTsKKworCS8qIEkgZG9uJ3Qga25vdyB3aGF0IHRoaXMgaXMgZm9yLCBidXQgb3RoZXJ3aXNlIEkgZ2V0IG5vCisJICogc2lnbmFsLgorCSAqLworCWNoNzAwNl93cml0ZShjbGllbnQsIDB4M2QsIDB4MCk7Cit9CisKK3ZvaWQgY2g3MDA2X3N0YXRlX3NhdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJICAgICAgIHN0cnVjdCBjaDcwMDZfc3RhdGUgKnN0YXRlKQoreworCWNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfUE9XRVIpOworCisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9ESVNQTU9ERSk7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9GRklMVEVSKTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0JXSURUSCk7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9JTlBVVF9GT1JNQVQpOworCWNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfQ0xLTU9ERSk7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9TVEFSVF9BQ1RJVkUpOworCWNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfUE9WKTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0JMQUNLX0xFVkVMKTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0hQT1MpOworCWNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfVlBPUyk7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9JTlBVVF9TWU5DKTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0RFVEVDVCk7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9DT05UUkFTVCk7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9QTExPVik7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9QTExNKTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1BMTE4pOworCWNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfQkNMS09VVCk7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9TVUJDX0lOQzApOworCWNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfU1VCQ19JTkMxKTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1NVQkNfSU5DMik7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9TVUJDX0lOQzMpOworCWNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfU1VCQ19JTkM0KTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1NVQkNfSU5DNSk7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9TVUJDX0lOQzYpOworCWNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfU1VCQ19JTkM3KTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1BMTF9DT05UUk9MKTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0NBTENfU1VCQ19JTkMwKTsKKworCXN0YXRlLT5yZWdzW0NINzAwNl9GRklMVEVSXSA9IChzdGF0ZS0+cmVnc1tDSDcwMDZfRkZJTFRFUl0gJiAweGYwKSB8CisJCShzdGF0ZS0+cmVnc1tDSDcwMDZfRkZJTFRFUl0gJiAweDBjKSA+PiAyIHwKKwkJKHN0YXRlLT5yZWdzW0NINzAwNl9GRklMVEVSXSAmIDB4MDMpIDw8IDI7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTJjL2NoNzAwNl9wcml2LmggYi9kcml2ZXJzL2dwdS9kcm0vaTJjL2NoNzAwNl9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA2ZDNkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pMmMvY2g3MDA2X3ByaXYuaApAQCAtMCwwICsxLDM0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBGcmFuY2lzY28gSmVyZXouCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9fRFJNX0kyQ19DSDcwMDZfUFJJVl9IX18KKyNkZWZpbmUgX19EUk1fSTJDX0NINzAwNl9QUklWX0hfXworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgorI2luY2x1ZGUgImRybV9lbmNvZGVyX3NsYXZlLmgiCisjaW5jbHVkZSAiaTJjL2NoNzAwNi5oIgorCit0eXBlZGVmIGludDY0X3QgZml4ZWQ7CisjZGVmaW5lIGZpeGVkMSAoMUxMIDw8IDMyKQorCitlbnVtIGNoNzAwNl90dl9ub3JtIHsKKwlUVl9OT1JNX1BBTCwKKwlUVl9OT1JNX1BBTF9NLAorCVRWX05PUk1fUEFMX04sCisJVFZfTk9STV9QQUxfTkMsCisJVFZfTk9STV9QQUxfNjAsCisJVFZfTk9STV9OVFNDX00sCisJVFZfTk9STV9OVFNDX0osCisJTlVNX1RWX05PUk1TCit9OworCitzdHJ1Y3QgY2g3MDA2X3R2X25vcm1faW5mbyB7CisJZml4ZWQgdnJlZnJlc2g7CisJaW50IHZkaXNwbGF5OworCWludCB2dG90YWw7CisJaW50IGh2aXJ0dWFsOworCisJZml4ZWQgc3ViY19mcmVxOworCWZpeGVkIGJsYWNrX2xldmVsOworCisJdWludDMyX3QgZGlzcG1vZGU7CisJaW50IHZvZmZzZXQ7Cit9OworCitzdHJ1Y3QgY2g3MDA2X21vZGUgeworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIG1vZGU7CisKKwlpbnQgZW5jX2hkaXNwOworCWludCBlbmNfdmRpc3A7CisKKwlmaXhlZCBzdWJjX2NvZWZmOworCXVpbnQzMl90IGRpc3Btb2RlOworCisJdWludDMyX3QgdmFsaWRfc2NhbGVzOworCXVpbnQzMl90IHZhbGlkX25vcm1zOworfTsKKworc3RydWN0IGNoNzAwNl9zdGF0ZSB7CisJdWludDhfdCByZWdzWzB4MjZdOworfTsKKworc3RydWN0IGNoNzAwNl9wcml2IHsKKwlzdHJ1Y3QgY2g3MDA2X2VuY29kZXJfcGFyYW1zICpwYXJhbXM7CisJc3RydWN0IGNoNzAwNl9tb2RlICptb2RlOworCisJc3RydWN0IGNoNzAwNl9zdGF0ZSBzdGF0ZTsKKwlzdHJ1Y3QgY2g3MDA2X3N0YXRlIHNhdmVkX3N0YXRlOworCisJc3RydWN0IGRybV9wcm9wZXJ0eSAqc2NhbGVfcHJvcGVydHk7CisKKwlpbnQgc2VsZWN0X3N1YmNvbm5lY3RvcjsKKwlpbnQgc3ViY29ubmVjdG9yOworCWludCBobWFyZ2luOworCWludCB2bWFyZ2luOworCWVudW0gY2g3MDA2X3R2X25vcm0gbm9ybTsKKwlpbnQgYnJpZ2h0bmVzczsKKwlpbnQgY29udHJhc3Q7CisJaW50IGZsaWNrZXI7CisJaW50IHNjYWxlOworCisJaW50IGxhc3RfZHBtczsKK307CisKKyNkZWZpbmUgdG9fY2g3MDA2X3ByaXYoeCkgXAorCSgoc3RydWN0IGNoNzAwNl9wcml2ICopdG9fZW5jb2Rlcl9zbGF2ZSh4KS0+c2xhdmVfcHJpdikKKworZXh0ZXJuIGludCBjaDcwMDZfZGVidWc7CitleHRlcm4gY2hhciAqY2g3MDA2X3R2X25vcm07CitleHRlcm4gaW50IGNoNzAwNl9zY2FsZTsKKworZXh0ZXJuIGNoYXIgKmNoNzAwNl90dl9ub3JtX25hbWVzW107CitleHRlcm4gc3RydWN0IGNoNzAwNl90dl9ub3JtX2luZm8gY2g3MDA2X3R2X25vcm1zW107CitleHRlcm4gc3RydWN0IGNoNzAwNl9tb2RlIGNoNzAwNl9tb2Rlc1tdOworCitzdHJ1Y3QgY2g3MDA2X21vZGUgKmNoNzAwNl9sb29rdXBfbW9kZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkcm1fbW9kZSk7CisKK3ZvaWQgY2g3MDA2X3NldHVwX2xldmVscyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwordm9pZCBjaDcwMDZfc2V0dXBfc3ViY2FycmllcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwordm9pZCBjaDcwMDZfc2V0dXBfcGxsKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7Cit2b2lkIGNoNzAwNl9zZXR1cF9wb3dlcl9zdGF0ZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwordm9pZCBjaDcwMDZfc2V0dXBfcHJvcGVydGllcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOworCit2b2lkIGNoNzAwNl93cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1aW50OF90IGFkZHIsIHVpbnQ4X3QgdmFsKTsKK3VpbnQ4X3QgY2g3MDA2X3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdWludDhfdCBhZGRyKTsKKwordm9pZCBjaDcwMDZfc3RhdGVfbG9hZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkgICAgICAgc3RydWN0IGNoNzAwNl9zdGF0ZSAqc3RhdGUpOwordm9pZCBjaDcwMDZfc3RhdGVfc2F2ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkgICAgICAgc3RydWN0IGNoNzAwNl9zdGF0ZSAqc3RhdGUpOworCisvKiBTb21lIGhlbHBlciBtYWNyb3MgKi8KKworI2RlZmluZSBjaDcwMDZfZGJnKGNsaWVudCwgZm9ybWF0LCAuLi4pIGRvIHsJCQkJXAorCQlpZiAoY2g3MDA2X2RlYnVnKQkJCQkJXAorCQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmY2xpZW50LT5kZXYsCQlcCisJCQkJICAgIiVzOiAiIGZvcm1hdCwgX19mdW5jX18sICMjIF9fVkFfQVJHU19fKTsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIGNoNzAwNl9pbmZvKGNsaWVudCwgZm9ybWF0LCAuLi4pIFwKKwkJCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsIGZvcm1hdCwgX19WQV9BUkdTX18pCisjZGVmaW5lIGNoNzAwNl9lcnIoY2xpZW50LCBmb3JtYXQsIC4uLikgXAorCQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCBmb3JtYXQsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIF9fbWFzayhzcmMsIGJpdGZpZWxkKSBcCisJCSgoKDIgPDwgKDEgPyBiaXRmaWVsZCkpIC0gMSkgJiB+KCgxIDw8ICgwID8gYml0ZmllbGQpKSAtIDEpKQorI2RlZmluZSBtYXNrKGJpdGZpZWxkKSBfX21hc2soYml0ZmllbGQpCisKKyNkZWZpbmUgX19iaXRmKHNyYywgYml0ZmllbGQsIHgpIFwKKwkJKCgoeCkgPj4gKHNyYykgPDwgKDAgPyBiaXRmaWVsZCkpICYgIF9fbWFzayhzcmMsIGJpdGZpZWxkKSkKKyNkZWZpbmUgYml0ZihiaXRmaWVsZCwgeCkgX19iaXRmKGJpdGZpZWxkLCB4KQorI2RlZmluZSBiaXRmcyhiaXRmaWVsZCwgcykgX19iaXRmKGJpdGZpZWxkLCBiaXRmaWVsZCMjXyMjcykKKyNkZWZpbmUgc2V0Yml0ZihzdGF0ZSwgcmVnLCBiaXRmaWVsZCwgeCkJCQkJXAorCXN0YXRlLT5yZWdzW3JlZ10gPSAoc3RhdGUtPnJlZ3NbcmVnXSAmIH5tYXNrKHJlZyMjXyMjYml0ZmllbGQpKQlcCisJCXwgYml0ZihyZWcjI18jI2JpdGZpZWxkLCB4KQorCisjZGVmaW5lIF9fdW5iaXRmKHNyYywgYml0ZmllbGQsIHgpIFwKKwkJKCh4ICYgX19tYXNrKHNyYywgYml0ZmllbGQpKSA+PiAoMCA/IGJpdGZpZWxkKSA8PCAoc3JjKSkKKyNkZWZpbmUgdW5iaXRmKGJpdGZpZWxkLCB4KSBfX3VuYml0ZihiaXRmaWVsZCwgeCkKKworc3RhdGljIGlubGluZSBpbnQgaW50ZXJwb2xhdGUoaW50IHkwLCBpbnQgeTEsIGludCB5MiwgaW50IHgpCit7CisJcmV0dXJuIHkxICsgKHggPCA1MCA/IHkxIC0geTAgOiB5MiAtIHkxKSAqICh4IC0gNTApIC8gNTA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50MzJfdCByb3VuZF9maXhlZChmaXhlZCB4KQoreworCXJldHVybiAoeCArIGZpeGVkMS8yKSA+PiAzMjsKK30KKworI2RlZmluZSBjaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgcmVnKSBjaDcwMDZfd3JpdGUoY2xpZW50LCByZWcsIHN0YXRlLT5yZWdzW3JlZ10pCisjZGVmaW5lIGNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCByZWcpIHN0YXRlLT5yZWdzW3JlZ10gPSBjaDcwMDZfcmVhZChjbGllbnQsIHJlZykKKworLyogRml4ZWQgaGFyZHdhcmUgc3BlY3MgKi8KKworI2RlZmluZSBDSDcwMDZfRlJFUTAJCQkJMTQzMTgKKyNkZWZpbmUgQ0g3MDA2X01BWE4JCQkJNjUwCisjZGVmaW5lIENINzAwNl9NQVhNCQkJCTMxNQorCisvKiBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIENINzAwNl9ESVNQTU9ERQkJCQkweDAwCisjZGVmaW5lIENINzAwNl9ESVNQTU9ERV9JTlBVVF9SRVMJCTAsIDc6NQorI2RlZmluZSBDSDcwMDZfRElTUE1PREVfSU5QVVRfUkVTXzUxMngzODQJMHgwCisjZGVmaW5lIENINzAwNl9ESVNQTU9ERV9JTlBVVF9SRVNfNzIweDQwMAkweDEKKyNkZWZpbmUgQ0g3MDA2X0RJU1BNT0RFX0lOUFVUX1JFU182NDB4NDAwCTB4MgorI2RlZmluZSBDSDcwMDZfRElTUE1PREVfSU5QVVRfUkVTXzY0MHg0ODAJMHgzCisjZGVmaW5lIENINzAwNl9ESVNQTU9ERV9JTlBVVF9SRVNfODAweDYwMAkweDQKKyNkZWZpbmUgQ0g3MDA2X0RJU1BNT0RFX0lOUFVUX1JFU19OQVRJVkUJMHg1CisjZGVmaW5lIENINzAwNl9ESVNQTU9ERV9PVVRQVVRfU1RECQkwLCA0OjMKKyNkZWZpbmUgQ0g3MDA2X0RJU1BNT0RFX09VVFBVVF9TVERfUEFMCQkweDAKKyNkZWZpbmUgQ0g3MDA2X0RJU1BNT0RFX09VVFBVVF9TVERfTlRTQwkJMHgxCisjZGVmaW5lIENINzAwNl9ESVNQTU9ERV9PVVRQVVRfU1REX1BBTF9NCTB4MgorI2RlZmluZSBDSDcwMDZfRElTUE1PREVfT1VUUFVUX1NURF9OVFNDX0oJMHgzCisjZGVmaW5lIENINzAwNl9ESVNQTU9ERV9TQ0FMSU5HX1JBVElPCQkwLCAyOjAKKyNkZWZpbmUgQ0g3MDA2X0RJU1BNT0RFX1NDQUxJTkdfUkFUSU9fNV80CTB4MAorI2RlZmluZSBDSDcwMDZfRElTUE1PREVfU0NBTElOR19SQVRJT18xXzEJMHgxCisjZGVmaW5lIENINzAwNl9ESVNQTU9ERV9TQ0FMSU5HX1JBVElPXzdfOAkweDIKKyNkZWZpbmUgQ0g3MDA2X0RJU1BNT0RFX1NDQUxJTkdfUkFUSU9fNV82CTB4MworI2RlZmluZSBDSDcwMDZfRElTUE1PREVfU0NBTElOR19SQVRJT18zXzQJMHg0CisjZGVmaW5lIENINzAwNl9ESVNQTU9ERV9TQ0FMSU5HX1JBVElPXzdfMTAJMHg1CisKKyNkZWZpbmUgQ0g3MDA2X0ZGSUxURVIJCQkJMHgwMQorI2RlZmluZSBDSDcwMDZfRkZJTFRFUl9URVhUCQkJMCwgNTo0CisjZGVmaW5lIENINzAwNl9GRklMVEVSX0xVTUEJCQkwLCAzOjIKKyNkZWZpbmUgQ0g3MDA2X0ZGSUxURVJfQ0hST01BCQkJMCwgMTowCisjZGVmaW5lIENINzAwNl9GRklMVEVSX0NIUk9NQV9OT19EQ1JBV0wJCTB4MworCisjZGVmaW5lIENINzAwNl9CV0lEVEgJCQkJMHgwMworI2RlZmluZSBDSDcwMDZfQldJRFRIXzVMX0ZGSUxFUgkJCSgxIDw8IDcpCisjZGVmaW5lIENINzAwNl9CV0lEVEhfQ1ZCU19OT19DSFJPTUEJCSgxIDw8IDYpCisjZGVmaW5lIENINzAwNl9CV0lEVEhfQ0hST01BCQkJMCwgNTo0CisjZGVmaW5lIENINzAwNl9CV0lEVEhfU1ZJREVPX1lQRUFLCQkoMSA8PCAzKQorI2RlZmluZSBDSDcwMDZfQldJRFRIX1NWSURFT19MVU1BCQkwLCAyOjEKKyNkZWZpbmUgQ0g3MDA2X0JXSURUSF9DVkJTX0xVTUEJCQkwLCAwOjAKKworI2RlZmluZSBDSDcwMDZfSU5QVVRfRk9STUFUCQkJMHgwNAorI2RlZmluZSBDSDcwMDZfSU5QVVRfRk9STUFUX0RBQ19HQUlOCQkoMSA8PCA2KQorI2RlZmluZSBDSDcwMDZfSU5QVVRfRk9STUFUX1JHQl9QQVNTX1RIUk9VR0gJKDEgPDwgNSkKKyNkZWZpbmUgQ0g3MDA2X0lOUFVUX0ZPUk1BVF9GT1JNQVQJCTAsIDM6MAorI2RlZmluZSBDSDcwMDZfSU5QVVRfRk9STUFUX0ZPUk1BVF9SR0IxNgkweDAKKyNkZWZpbmUgQ0g3MDA2X0lOUFVUX0ZPUk1BVF9GT1JNQVRfWUNyQ2IyNG0xNgkweDEKKyNkZWZpbmUgQ0g3MDA2X0lOUFVUX0ZPUk1BVF9GT1JNQVRfUkdCMjRtMTYJMHgyCisjZGVmaW5lIENINzAwNl9JTlBVVF9GT1JNQVRfRk9STUFUX1JHQjE1CTB4MworI2RlZmluZSBDSDcwMDZfSU5QVVRfRk9STUFUX0ZPUk1BVF9SR0IyNG0xMkMJMHg0CisjZGVmaW5lIENINzAwNl9JTlBVVF9GT1JNQVRfRk9STUFUX1JHQjI0bTEySQkweDUKKyNkZWZpbmUgQ0g3MDA2X0lOUFVUX0ZPUk1BVF9GT1JNQVRfUkdCMjRtOAkweDYKKyNkZWZpbmUgQ0g3MDA2X0lOUFVUX0ZPUk1BVF9GT1JNQVRfUkdCMTZtOAkweDcKKyNkZWZpbmUgQ0g3MDA2X0lOUFVUX0ZPUk1BVF9GT1JNQVRfUkdCMTVtOAkweDgKKyNkZWZpbmUgQ0g3MDA2X0lOUFVUX0ZPUk1BVF9GT1JNQVRfWUNyQ2IyNG04CTB4OQorCisjZGVmaW5lIENINzAwNl9DTEtNT0RFCQkJCTB4MDYKKyNkZWZpbmUgQ0g3MDA2X0NMS01PREVfU1VCQ19MT0NLCQkoMSA8PCA3KQorI2RlZmluZSBDSDcwMDZfQ0xLTU9ERV9NQVNURVIJCQkoMSA8PCA2KQorI2RlZmluZSBDSDcwMDZfQ0xLTU9ERV9QT1NfRURHRQkJCSgxIDw8IDQpCisjZGVmaW5lIENINzAwNl9DTEtNT0RFX1hDTQkJCTAsIDM6MgorI2RlZmluZSBDSDcwMDZfQ0xLTU9ERV9QQ00JCQkwLCAxOjAKKworI2RlZmluZSBDSDcwMDZfU1RBUlRfQUNUSVZFCQkJMHgwNworI2RlZmluZSBDSDcwMDZfU1RBUlRfQUNUSVZFXzAJCQkwLCA3OjAKKworI2RlZmluZSBDSDcwMDZfUE9WCQkJCTB4MDgKKyNkZWZpbmUgQ0g3MDA2X1BPVl9TVEFSVF9BQ1RJVkVfOAkJOCwgMjoyCisjZGVmaW5lIENINzAwNl9QT1ZfSFBPU184CQkJOCwgMToxCisjZGVmaW5lIENINzAwNl9QT1ZfVlBPU184CQkJOCwgMDowCisKKyNkZWZpbmUgQ0g3MDA2X0JMQUNLX0xFVkVMCQkJMHgwOQorI2RlZmluZSBDSDcwMDZfQkxBQ0tfTEVWRUxfMAkJCTAsIDc6MAorCisjZGVmaW5lIENINzAwNl9IUE9TCQkJCTB4MGEKKyNkZWZpbmUgQ0g3MDA2X0hQT1NfMAkJCQkwLCA3OjAKKworI2RlZmluZSBDSDcwMDZfVlBPUwkJCQkweDBiCisjZGVmaW5lIENINzAwNl9WUE9TXzAJCQkJMCwgNzowCisKKyNkZWZpbmUgQ0g3MDA2X0lOUFVUX1NZTkMJCQkweDBkCisjZGVmaW5lIENINzAwNl9JTlBVVF9TWU5DX0VNQkVEREVECQkoMSA8PCAzKQorI2RlZmluZSBDSDcwMDZfSU5QVVRfU1lOQ19PVVRQVVQJCSgxIDw8IDIpCisjZGVmaW5lIENINzAwNl9JTlBVVF9TWU5DX1BWU1lOQwkJKDEgPDwgMSkKKyNkZWZpbmUgQ0g3MDA2X0lOUFVUX1NZTkNfUEhTWU5DCQkoMSA8PCAwKQorCisjZGVmaW5lIENINzAwNl9QT1dFUgkJCQkweDBlCisjZGVmaW5lIENINzAwNl9QT1dFUl9TQ0FSVAkJCSgxIDw8IDQpCisjZGVmaW5lIENINzAwNl9QT1dFUl9SRVNFVAkJCSgxIDw8IDMpCisjZGVmaW5lIENINzAwNl9QT1dFUl9MRVZFTAkJCTAsIDI6MAorI2RlZmluZSBDSDcwMDZfUE9XRVJfTEVWRUxfQ1ZCU19PRkYJCTB4MAorI2RlZmluZSBDSDcwMDZfUE9XRVJfTEVWRUxfUE9XRVJfT0ZGCQkweDEKKyNkZWZpbmUgQ0g3MDA2X1BPV0VSX0xFVkVMX1NWSURFT19PRkYJCTB4MgorI2RlZmluZSBDSDcwMDZfUE9XRVJfTEVWRUxfTk9STUFMCQkweDMKKyNkZWZpbmUgQ0g3MDA2X1BPV0VSX0xFVkVMX0ZVTExfUE9XRVJfT0ZGCTB4NAorCisjZGVmaW5lIENINzAwNl9ERVRFQ1QJCQkJMHgxMAorI2RlZmluZSBDSDcwMDZfREVURUNUX1NWSURFT19ZX1RFU1QJCSgxIDw8IDMpCisjZGVmaW5lIENINzAwNl9ERVRFQ1RfU1ZJREVPX0NfVEVTVAkJKDEgPDwgMikKKyNkZWZpbmUgQ0g3MDA2X0RFVEVDVF9DVkJTX1RFU1QJCQkoMSA8PCAxKQorI2RlZmluZSBDSDcwMDZfREVURUNUX1NFTlNFCQkJKDEgPDwgMCkKKworI2RlZmluZSBDSDcwMDZfQ09OVFJBU1QJCQkJMHgxMQorI2RlZmluZSBDSDcwMDZfQ09OVFJBU1RfMAkJCTAsIDI6MAorCisjZGVmaW5lIENINzAwNl9QTExPVgkgCQkJMHgxMworI2RlZmluZSBDSDcwMDZfUExMT1ZfTl84CSAJCTgsIDI6MQorI2RlZmluZSBDSDcwMDZfUExMT1ZfTV84CSAJCTgsIDA6MAorCisjZGVmaW5lIENINzAwNl9QTExNCSAJCQkweDE0CisjZGVmaW5lIENINzAwNl9QTExNXzAJIAkJCTAsIDc6MAorCisjZGVmaW5lIENINzAwNl9QTExOCSAJCQkweDE1CisjZGVmaW5lIENINzAwNl9QTExOXzAJIAkJCTAsIDc6MAorCisjZGVmaW5lIENINzAwNl9CQ0xLT1VUCSAJCQkweDE3CisKKyNkZWZpbmUgQ0g3MDA2X1NVQkNfSU5DMAkJCTB4MTgKKyNkZWZpbmUgQ0g3MDA2X1NVQkNfSU5DMF8yOAkJCTI4LCAzOjAKKworI2RlZmluZSBDSDcwMDZfU1VCQ19JTkMxCQkJMHgxOQorI2RlZmluZSBDSDcwMDZfU1VCQ19JTkMxXzI0CQkJMjQsIDM6MAorCisjZGVmaW5lIENINzAwNl9TVUJDX0lOQzIJCQkweDFhCisjZGVmaW5lIENINzAwNl9TVUJDX0lOQzJfMjAJCQkyMCwgMzowCisKKyNkZWZpbmUgQ0g3MDA2X1NVQkNfSU5DMwkJCTB4MWIKKyNkZWZpbmUgQ0g3MDA2X1NVQkNfSU5DM19HUElPMV9WQUwJCSgxIDw8IDcpCisjZGVmaW5lIENINzAwNl9TVUJDX0lOQzNfR1BJTzBfVkFMCQkoMSA8PCA2KQorI2RlZmluZSBDSDcwMDZfU1VCQ19JTkMzX1BPVVRfM18zVgkJKDEgPDwgNSkKKyNkZWZpbmUgQ0g3MDA2X1NVQkNfSU5DM19QT1VUX0lOVgkJKDEgPDwgNCkKKyNkZWZpbmUgQ0g3MDA2X1NVQkNfSU5DM18xNgkJCTE2LCAzOjAKKworI2RlZmluZSBDSDcwMDZfU1VCQ19JTkM0CQkJMHgxYworI2RlZmluZSBDSDcwMDZfU1VCQ19JTkM0X0dQSU8xX0lOCQkoMSA8PCA3KQorI2RlZmluZSBDSDcwMDZfU1VCQ19JTkM0X0dQSU8wX0lOCQkoMSA8PCA2KQorI2RlZmluZSBDSDcwMDZfU1VCQ19JTkM0X0RTX0lOUFVUCQkoMSA8PCA0KQorI2RlZmluZSBDSDcwMDZfU1VCQ19JTkM0XzEyCQkJMTIsIDM6MAorCisjZGVmaW5lIENINzAwNl9TVUJDX0lOQzUJCQkweDFkCisjZGVmaW5lIENINzAwNl9TVUJDX0lOQzVfOAkJCTgsIDM6MAorCisjZGVmaW5lIENINzAwNl9TVUJDX0lOQzYJCQkweDFlCisjZGVmaW5lIENINzAwNl9TVUJDX0lOQzZfNAkJCTQsIDM6MAorCisjZGVmaW5lIENINzAwNl9TVUJDX0lOQzcJCQkweDFmCisjZGVmaW5lIENINzAwNl9TVUJDX0lOQzdfMAkJCTAsIDM6MAorCisjZGVmaW5lIENINzAwNl9QTExfQ09OVFJPTAkJCTB4MjAKKyNkZWZpbmUgQ0g3MDA2X1BMTF9DT05UUk9MX0NQSQkJCSgxIDw8IDUpCisjZGVmaW5lIENINzAwNl9QTExfQ09OVFJPTF9DQVBBQ0lUT1IJCSgxIDw8IDQpCisjZGVmaW5lIENINzAwNl9QTExfQ09OVFJPTF83U1RBR0VTCQkoMSA8PCAzKQorI2RlZmluZSBDSDcwMDZfUExMX0NPTlRST0xfRElHSVRBTF81VgkJKDEgPDwgMikKKyNkZWZpbmUgQ0g3MDA2X1BMTF9DT05UUk9MX0FOQUxPR181VgkJKDEgPDwgMSkKKyNkZWZpbmUgQ0g3MDA2X1BMTF9DT05UUk9MX01FTU9SWV81VgkJKDEgPDwgMCkKKworI2RlZmluZSBDSDcwMDZfQ0FMQ19TVUJDX0lOQzAJCQkweDIxCisjZGVmaW5lIENINzAwNl9DQUxDX1NVQkNfSU5DMF8yNAkJMjQsIDQ6MworI2RlZmluZSBDSDcwMDZfQ0FMQ19TVUJDX0lOQzBfSFlTVAkJMCwgMjoxCisjZGVmaW5lIENINzAwNl9DQUxDX1NVQkNfSU5DMF9BVVRPCQkoMSA8PCAwKQorCisjZGVmaW5lIENINzAwNl9DQUxDX1NVQkNfSU5DMQkJCTB4MjIKKyNkZWZpbmUgQ0g3MDA2X0NBTENfU1VCQ19JTkMxXzE2CQkxNiwgNzowCisKKyNkZWZpbmUgQ0g3MDA2X0NBTENfU1VCQ19JTkMyCQkJMHgyMworI2RlZmluZSBDSDcwMDZfQ0FMQ19TVUJDX0lOQzJfOAkJCTgsIDc6MAorCisjZGVmaW5lIENINzAwNl9DQUxDX1NVQkNfSU5DMwkJCTB4MjQKKyNkZWZpbmUgQ0g3MDA2X0NBTENfU1VCQ19JTkMzXzAJCQkwLCA3OjAKKworI2RlZmluZSBDSDcwMDZfVkVSU0lPTl9JRAkJCTB4MjUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCmluZGV4IGZhN2I5YmUuLjk5MjlmODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCkBAIC0xNSw3ICsxNSw2IEBACiAJICBpbnRlbF9sdmRzLm8gXAogCSAgaW50ZWxfYmlvcy5vIFwKIAkgIGludGVsX2RwLm8gXAotCSAgaW50ZWxfZHBfaTJjLm8gXAogCSAgaW50ZWxfaGRtaS5vIFwKIAkgIGludGVsX3Nkdm8ubyBcCiAJICBpbnRlbF9tb2Rlcy5vIFwKQEAgLTIzLDYgKzIyLDcgQEAKIAkgIGludGVsX2ZiLm8gXAogCSAgaW50ZWxfdHYubyBcCiAJICBpbnRlbF9kdm8ubyBcCisJICBpbnRlbF9vdmVybGF5Lm8gXAogCSAgZHZvX2NoN3h4eC5vIFwKIAkgIGR2b19jaDcwMTcubyBcCiAJICBkdm9faXZjaC5vIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19jaDcwMTcuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19jaDcwMTcuYwppbmRleCA2MjE4MTViLi4xMTg0YzE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fY2g3MDE3LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX2NoNzAxNy5jCkBAIC0yNDksNyArMjQ5LDggQEAKIAlpZiAodmFsICE9IENINzAxN19ERVZJQ0VfSURfVkFMVUUgJiYKIAkgICAgdmFsICE9IENINzAxOF9ERVZJQ0VfSURfVkFMVUUgJiYKIAkgICAgdmFsICE9IENINzAxOV9ERVZJQ0VfSURfVkFMVUUpIHsKLQkJRFJNX0RFQlVHKCJjaDcwMXggbm90IGRldGVjdGVkLCBnb3QgJWQ6IGZyb20gJXMgU2xhdmUgJWQuXG4iLAorCQlEUk1fREVCVUdfS01TKCJjaDcwMXggbm90IGRldGVjdGVkLCBnb3QgJWQ6IGZyb20gJXMgIgorCQkJCSJTbGF2ZSAlZC5cbiIsCiAJCQkgIHZhbCwgaTJjYnVzLT5hZGFwdGVyLm5hbWUsZHZvLT5zbGF2ZV9hZGRyKTsKIAkJZ290byBmYWlsOwogCX0KQEAgLTI4NCw3ICsyODUsNyBAQAogCXVpbnQ4X3QgaG9yaXpvbnRhbF9hY3RpdmVfcGl4ZWxfb3V0cHV0LCB2ZXJ0aWNhbF9hY3RpdmVfbGluZV9vdXRwdXQ7CiAJdWludDhfdCBhY3RpdmVfaW5wdXRfbGluZV9vdXRwdXQ7CiAKLQlEUk1fREVCVUcoIlJlZ2lzdGVycyBiZWZvcmUgbW9kZSBzZXR0aW5nXG4iKTsKKwlEUk1fREVCVUdfS01TKCJSZWdpc3RlcnMgYmVmb3JlIG1vZGUgc2V0dGluZ1xuIik7CiAJY2g3MDE3X2R1bXBfcmVncyhkdm8pOwogCiAJLyogTFZEUyBQTEwgc2V0dGluZ3MgZnJvbSBwYWdlIDc1IG9mIDcwMTctNzAxN2RzLnBkZiovCkBAIC0zNDYsNyArMzQ3LDcgQEAKIAkvKiBUdXJuIHRoZSBMVkRTIGJhY2sgb24gd2l0aCBuZXcgc2V0dGluZ3MuICovCiAJY2g3MDE3X3dyaXRlKGR2bywgQ0g3MDE3X0xWRFNfUE9XRVJfRE9XTiwgbHZkc19wb3dlcl9kb3duKTsKIAotCURSTV9ERUJVRygiUmVnaXN0ZXJzIGFmdGVyIG1vZGUgc2V0dGluZ1xuIik7CisJRFJNX0RFQlVHX0tNUygiUmVnaXN0ZXJzIGFmdGVyIG1vZGUgc2V0dGluZ1xuIik7CiAJY2g3MDE3X2R1bXBfcmVncyhkdm8pOwogfQogCkBAIC0zODYsNyArMzg3LDcgQEAKICNkZWZpbmUgRFVNUChyZWcpCQkJCQlcCiBkbyB7CQkJCQkJCVwKIAljaDcwMTdfcmVhZChkdm8sIHJlZywgJnZhbCk7CQkJXAotCURSTV9ERUJVRygjcmVnICI6ICUwMnhcbiIsIHZhbCk7CQlcCisJRFJNX0RFQlVHX0tNUygjcmVnICI6ICUwMnhcbiIsIHZhbCk7CQlcCiB9IHdoaWxlICgwKQogCiAJRFVNUChDSDcwMTdfSE9SSVpPTlRBTF9BQ1RJVkVfUElYRUxfSU5QVVQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX2NoN3h4eC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX2NoN3h4eC5jCmluZGV4IGE5Yjg5NjIuLmQ1NmZmNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19jaDd4eHguYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fY2g3eHh4LmMKQEAgLTE1Miw3ICsxNTIsNyBAQAogCX07CiAKIAlpZiAoIWNoN3h4eC0+cXVpZXQpIHsKLQkJRFJNX0RFQlVHKCJVbmFibGUgdG8gcmVhZCByZWdpc3RlciAweCUwMnggZnJvbSAlczolMDJ4LlxuIiwKKwkJRFJNX0RFQlVHX0tNUygiVW5hYmxlIHRvIHJlYWQgcmVnaXN0ZXIgMHglMDJ4IGZyb20gJXM6JTAyeC5cbiIsCiAJCQkgIGFkZHIsIGkyY2J1cy0+YWRhcHRlci5uYW1lLCBkdm8tPnNsYXZlX2FkZHIpOwogCX0KIAlyZXR1cm4gZmFsc2U7CkBAIC0xNzksNyArMTc5LDcgQEAKIAkJcmV0dXJuIHRydWU7CiAKIAlpZiAoIWNoN3h4eC0+cXVpZXQpIHsKLQkJRFJNX0RFQlVHKCJVbmFibGUgdG8gd3JpdGUgcmVnaXN0ZXIgMHglMDJ4IHRvICVzOiVkLlxuIiwKKwkJRFJNX0RFQlVHX0tNUygiVW5hYmxlIHRvIHdyaXRlIHJlZ2lzdGVyIDB4JTAyeCB0byAlczolZC5cbiIsCiAJCQkgIGFkZHIsIGkyY2J1cy0+YWRhcHRlci5uYW1lLCBkdm8tPnNsYXZlX2FkZHIpOwogCX0KIApAQCAtMjA3LDcgKzIwNyw4IEBACiAKIAluYW1lID0gY2g3eHh4X2dldF9pZCh2ZW5kb3IpOwogCWlmICghbmFtZSkgewotCQlEUk1fREVCVUcoImNoN3h4eCBub3QgZGV0ZWN0ZWQ7IGdvdCAweCUwMnggZnJvbSAlcyBzbGF2ZSAlZC5cbiIsCisJCURSTV9ERUJVR19LTVMoImNoN3h4eCBub3QgZGV0ZWN0ZWQ7IGdvdCAweCUwMnggZnJvbSAlcyAiCisJCQkJInNsYXZlICVkLlxuIiwKIAkJCSAgdmVuZG9yLCBhZGFwdGVyLT5uYW1lLCBkdm8tPnNsYXZlX2FkZHIpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yMTcsMTMgKzIxOCwxNCBAQAogCQlnb3RvIG91dDsKIAogCWlmIChkZXZpY2UgIT0gQ0g3eHh4X0RJRCkgewotCQlEUk1fREVCVUcoImNoN3h4eCBub3QgZGV0ZWN0ZWQ7IGdvdCAweCUwMnggZnJvbSAlcyBzbGF2ZSAlZC5cbiIsCisJCURSTV9ERUJVR19LTVMoImNoN3h4eCBub3QgZGV0ZWN0ZWQ7IGdvdCAweCUwMnggZnJvbSAlcyAiCisJCQkJInNsYXZlICVkLlxuIiwKIAkJCSAgdmVuZG9yLCBhZGFwdGVyLT5uYW1lLCBkdm8tPnNsYXZlX2FkZHIpOwogCQlnb3RvIG91dDsKIAl9CiAKIAljaDd4eHgtPnF1aWV0ID0gZmFsc2U7Ci0JRFJNX0RFQlVHKCJEZXRlY3RlZCAlcyBjaGlwc2V0LCB2ZW5kb3IvZGV2aWNlIElEIDB4JTAyeC8weCUwMnhcbiIsCisJRFJNX0RFQlVHX0tNUygiRGV0ZWN0ZWQgJXMgY2hpcHNldCwgdmVuZG9yL2RldmljZSBJRCAweCUwMngvMHglMDJ4XG4iLAogCQkgIG5hbWUsIHZlbmRvciwgZGV2aWNlKTsKIAlyZXR1cm4gdHJ1ZTsKIG91dDoKQEAgLTMxNSw4ICszMTcsOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IENIN3h4eF9OVU1fUkVHUzsgaSsrKSB7CiAJCWlmICgoaSAlIDgpID09IDAgKQotCQkJRFJNX0RFQlVHKCJcbiAlMDJYOiAiLCBpKTsKLQkJRFJNX0RFQlVHKCIlMDJYICIsIGNoN3h4eC0+bW9kZV9yZWcucmVnc1tpXSk7CisJCQlEUk1fTE9HX0tNUygiXG4gJTAyWDogIiwgaSk7CisJCURSTV9MT0dfS01TKCIlMDJYICIsIGNoN3h4eC0+bW9kZV9yZWcucmVnc1tpXSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9faXZjaC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX2l2Y2guYwppbmRleCBhYTE3NmY5Li4yNDE2OWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9faXZjaC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19pdmNoLmMKQEAgLTIwMiw3ICsyMDIsOCBAQAogCX07CiAKIAlpZiAoIXByaXYtPnF1aWV0KSB7Ci0JCURSTV9ERUJVRygiVW5hYmxlIHRvIHJlYWQgcmVnaXN0ZXIgMHglMDJ4IGZyb20gJXM6JTAyeC5cbiIsCisJCURSTV9ERUJVR19LTVMoIlVuYWJsZSB0byByZWFkIHJlZ2lzdGVyIDB4JTAyeCBmcm9tICIKKwkJCQkiJXM6JTAyeC5cbiIsCiAJCQkgIGFkZHIsIGkyY2J1cy0+YWRhcHRlci5uYW1lLCBkdm8tPnNsYXZlX2FkZHIpOwogCX0KIAlyZXR1cm4gZmFsc2U7CkBAIC0yMzAsNyArMjMxLDcgQEAKIAkJcmV0dXJuIHRydWU7CiAKIAlpZiAoIXByaXYtPnF1aWV0KSB7Ci0JCURSTV9ERUJVRygiVW5hYmxlIHRvIHdyaXRlIHJlZ2lzdGVyIDB4JTAyeCB0byAlczolZC5cbiIsCisJCURSTV9ERUJVR19LTVMoIlVuYWJsZSB0byB3cml0ZSByZWdpc3RlciAweCUwMnggdG8gJXM6JWQuXG4iLAogCQkJICBhZGRyLCBpMmNidXMtPmFkYXB0ZXIubmFtZSwgZHZvLT5zbGF2ZV9hZGRyKTsKIAl9CiAKQEAgLTI2MSw3ICsyNjIsNyBAQAogCSAqIHRoZSBhZGRyZXNzIGl0J3MgcmVzcG9uZGluZyBvbi4KIAkgKi8KIAlpZiAoKHRlbXAgJiBWUjAwX0JBU0VfQUREUkVTU19NQVNLKSAhPSBkdm8tPnNsYXZlX2FkZHIpIHsKLQkJRFJNX0RFQlVHKCJpdmNoIGRldGVjdCBmYWlsZWQgZHVlIHRvIGFkZHJlc3MgbWlzbWF0Y2ggIgorCQlEUk1fREVCVUdfS01TKCJpdmNoIGRldGVjdCBmYWlsZWQgZHVlIHRvIGFkZHJlc3MgbWlzbWF0Y2ggIgogCQkJICAiKCVkIHZzICVkKVxuIiwKIAkJCSAgKHRlbXAgJiBWUjAwX0JBU0VfQUREUkVTU19NQVNLKSwgZHZvLT5zbGF2ZV9hZGRyKTsKIAkJZ290byBvdXQ7CkBAIC0zNjcsNDEgKzM2OCw0MSBAQAogCXVpbnQxNl90IHZhbDsKIAogCWl2Y2hfcmVhZChkdm8sIFZSMDAsICZ2YWwpOwotCURSTV9ERUJVRygiVlIwMDogMHglMDR4XG4iLCB2YWwpOworCURSTV9MT0dfS01TKCJWUjAwOiAweCUwNHhcbiIsIHZhbCk7CiAJaXZjaF9yZWFkKGR2bywgVlIwMSwgJnZhbCk7Ci0JRFJNX0RFQlVHKCJWUjAxOiAweCUwNHhcbiIsIHZhbCk7CisJRFJNX0xPR19LTVMoIlZSMDE6IDB4JTA0eFxuIiwgdmFsKTsKIAlpdmNoX3JlYWQoZHZvLCBWUjMwLCAmdmFsKTsKLQlEUk1fREVCVUcoIlZSMzA6IDB4JTA0eFxuIiwgdmFsKTsKKwlEUk1fTE9HX0tNUygiVlIzMDogMHglMDR4XG4iLCB2YWwpOwogCWl2Y2hfcmVhZChkdm8sIFZSNDAsICZ2YWwpOwotCURSTV9ERUJVRygiVlI0MDogMHglMDR4XG4iLCB2YWwpOworCURSTV9MT0dfS01TKCJWUjQwOiAweCUwNHhcbiIsIHZhbCk7CiAKIAkvKiBHUElPIHJlZ2lzdGVycyAqLwogCWl2Y2hfcmVhZChkdm8sIFZSODAsICZ2YWwpOwotCURSTV9ERUJVRygiVlI4MDogMHglMDR4XG4iLCB2YWwpOworCURSTV9MT0dfS01TKCJWUjgwOiAweCUwNHhcbiIsIHZhbCk7CiAJaXZjaF9yZWFkKGR2bywgVlI4MSwgJnZhbCk7Ci0JRFJNX0RFQlVHKCJWUjgxOiAweCUwNHhcbiIsIHZhbCk7CisJRFJNX0xPR19LTVMoIlZSODE6IDB4JTA0eFxuIiwgdmFsKTsKIAlpdmNoX3JlYWQoZHZvLCBWUjgyLCAmdmFsKTsKLQlEUk1fREVCVUcoIlZSODI6IDB4JTA0eFxuIiwgdmFsKTsKKwlEUk1fTE9HX0tNUygiVlI4MjogMHglMDR4XG4iLCB2YWwpOwogCWl2Y2hfcmVhZChkdm8sIFZSODMsICZ2YWwpOwotCURSTV9ERUJVRygiVlI4MzogMHglMDR4XG4iLCB2YWwpOworCURSTV9MT0dfS01TKCJWUjgzOiAweCUwNHhcbiIsIHZhbCk7CiAJaXZjaF9yZWFkKGR2bywgVlI4NCwgJnZhbCk7Ci0JRFJNX0RFQlVHKCJWUjg0OiAweCUwNHhcbiIsIHZhbCk7CisJRFJNX0xPR19LTVMoIlZSODQ6IDB4JTA0eFxuIiwgdmFsKTsKIAlpdmNoX3JlYWQoZHZvLCBWUjg1LCAmdmFsKTsKLQlEUk1fREVCVUcoIlZSODU6IDB4JTA0eFxuIiwgdmFsKTsKKwlEUk1fTE9HX0tNUygiVlI4NTogMHglMDR4XG4iLCB2YWwpOwogCWl2Y2hfcmVhZChkdm8sIFZSODYsICZ2YWwpOwotCURSTV9ERUJVRygiVlI4NjogMHglMDR4XG4iLCB2YWwpOworCURSTV9MT0dfS01TKCJWUjg2OiAweCUwNHhcbiIsIHZhbCk7CiAJaXZjaF9yZWFkKGR2bywgVlI4NywgJnZhbCk7Ci0JRFJNX0RFQlVHKCJWUjg3OiAweCUwNHhcbiIsIHZhbCk7CisJRFJNX0xPR19LTVMoIlZSODc6IDB4JTA0eFxuIiwgdmFsKTsKIAlpdmNoX3JlYWQoZHZvLCBWUjg4LCAmdmFsKTsKLQlEUk1fREVCVUcoIlZSODg6IDB4JTA0eFxuIiwgdmFsKTsKKwlEUk1fTE9HX0tNUygiVlI4ODogMHglMDR4XG4iLCB2YWwpOwogCiAJLyogU2NyYXRjaCByZWdpc3RlciAwIC0gQUlNIFBhbmVsIHR5cGUgKi8KIAlpdmNoX3JlYWQoZHZvLCBWUjhFLCAmdmFsKTsKLQlEUk1fREVCVUcoIlZSOEU6IDB4JTA0eFxuIiwgdmFsKTsKKwlEUk1fTE9HX0tNUygiVlI4RTogMHglMDR4XG4iLCB2YWwpOwogCiAJLyogU2NyYXRjaCByZWdpc3RlciAxIC0gU3RhdHVzIHJlZ2lzdGVyICovCiAJaXZjaF9yZWFkKGR2bywgVlI4RiwgJnZhbCk7Ci0JRFJNX0RFQlVHKCJWUjhGOiAweCUwNHhcbiIsIHZhbCk7CisJRFJNX0xPR19LTVMoIlZSOEY6IDB4JTA0eFxuIiwgdmFsKTsKIH0KIAogc3RhdGljIHZvaWQgaXZjaF9zYXZlKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8pCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fc2lsMTY0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fc2lsMTY0LmMKaW5kZXggZTFjMWY3My4uMDAwMWMxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX3NpbDE2NC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19zaWwxNjQuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJfTsKIAogCWlmICghc2lsLT5xdWlldCkgewotCQlEUk1fREVCVUcoIlVuYWJsZSB0byByZWFkIHJlZ2lzdGVyIDB4JTAyeCBmcm9tICVzOiUwMnguXG4iLAorCQlEUk1fREVCVUdfS01TKCJVbmFibGUgdG8gcmVhZCByZWdpc3RlciAweCUwMnggZnJvbSAlczolMDJ4LlxuIiwKIAkJCSAgYWRkciwgaTJjYnVzLT5hZGFwdGVyLm5hbWUsIGR2by0+c2xhdmVfYWRkcik7CiAJfQogCXJldHVybiBmYWxzZTsKQEAgLTEzMSw3ICsxMzEsNyBAQAogCQlyZXR1cm4gdHJ1ZTsKIAogCWlmICghc2lsLT5xdWlldCkgewotCQlEUk1fREVCVUcoIlVuYWJsZSB0byB3cml0ZSByZWdpc3RlciAweCUwMnggdG8gJXM6JWQuXG4iLAorCQlEUk1fREVCVUdfS01TKCJVbmFibGUgdG8gd3JpdGUgcmVnaXN0ZXIgMHglMDJ4IHRvICVzOiVkLlxuIiwKIAkJCSAgYWRkciwgaTJjYnVzLT5hZGFwdGVyLm5hbWUsIGR2by0+c2xhdmVfYWRkcik7CiAJfQogCkBAIC0xNTgsNyArMTU4LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAoY2ggIT0gKFNJTDE2NF9WSUQgJiAweGZmKSkgewotCQlEUk1fREVCVUcoInNpbDE2NCBub3QgZGV0ZWN0ZWQgZ290ICVkOiBmcm9tICVzIFNsYXZlICVkLlxuIiwKKwkJRFJNX0RFQlVHX0tNUygic2lsMTY0IG5vdCBkZXRlY3RlZCBnb3QgJWQ6IGZyb20gJXMgU2xhdmUgJWQuXG4iLAogCQkJICBjaCwgYWRhcHRlci0+bmFtZSwgZHZvLT5zbGF2ZV9hZGRyKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTY3LDEzICsxNjcsMTMgQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAoY2ggIT0gKFNJTDE2NF9ESUQgJiAweGZmKSkgewotCQlEUk1fREVCVUcoInNpbDE2NCBub3QgZGV0ZWN0ZWQgZ290ICVkOiBmcm9tICVzIFNsYXZlICVkLlxuIiwKKwkJRFJNX0RFQlVHX0tNUygic2lsMTY0IG5vdCBkZXRlY3RlZCBnb3QgJWQ6IGZyb20gJXMgU2xhdmUgJWQuXG4iLAogCQkJICBjaCwgYWRhcHRlci0+bmFtZSwgZHZvLT5zbGF2ZV9hZGRyKTsKIAkJZ290byBvdXQ7CiAJfQogCXNpbC0+cXVpZXQgPSBmYWxzZTsKIAotCURSTV9ERUJVRygiaW5pdCBzaWwxNjQgZHZvIGNvbnRyb2xsZXIgc3VjY2Vzc2Z1bGx5IVxuIik7CisJRFJNX0RFQlVHX0tNUygiaW5pdCBzaWwxNjQgZHZvIGNvbnRyb2xsZXIgc3VjY2Vzc2Z1bGx5IVxuIik7CiAJcmV0dXJuIHRydWU7CiAKIG91dDoKQEAgLTI0MSwxNSArMjQxLDE1IEBACiAJdWludDhfdCB2YWw7CiAKIAlzaWwxNjRfcmVhZGIoZHZvLCBTSUwxNjRfRlJFUV9MTywgJnZhbCk7Ci0JRFJNX0RFQlVHKCJTSUwxNjRfRlJFUV9MTzogMHglMDJ4XG4iLCB2YWwpOworCURSTV9MT0dfS01TKCJTSUwxNjRfRlJFUV9MTzogMHglMDJ4XG4iLCB2YWwpOwogCXNpbDE2NF9yZWFkYihkdm8sIFNJTDE2NF9GUkVRX0hJLCAmdmFsKTsKLQlEUk1fREVCVUcoIlNJTDE2NF9GUkVRX0hJOiAweCUwMnhcbiIsIHZhbCk7CisJRFJNX0xPR19LTVMoIlNJTDE2NF9GUkVRX0hJOiAweCUwMnhcbiIsIHZhbCk7CiAJc2lsMTY0X3JlYWRiKGR2bywgU0lMMTY0X1JFRzgsICZ2YWwpOwotCURSTV9ERUJVRygiU0lMMTY0X1JFRzg6IDB4JTAyeFxuIiwgdmFsKTsKKwlEUk1fTE9HX0tNUygiU0lMMTY0X1JFRzg6IDB4JTAyeFxuIiwgdmFsKTsKIAlzaWwxNjRfcmVhZGIoZHZvLCBTSUwxNjRfUkVHOSwgJnZhbCk7Ci0JRFJNX0RFQlVHKCJTSUwxNjRfUkVHOTogMHglMDJ4XG4iLCB2YWwpOworCURSTV9MT0dfS01TKCJTSUwxNjRfUkVHOTogMHglMDJ4XG4iLCB2YWwpOwogCXNpbDE2NF9yZWFkYihkdm8sIFNJTDE2NF9SRUdDLCAmdmFsKTsKLQlEUk1fREVCVUcoIlNJTDE2NF9SRUdDOiAweCUwMnhcbiIsIHZhbCk7CisJRFJNX0xPR19LTVMoIlNJTDE2NF9SRUdDOiAweCUwMnhcbiIsIHZhbCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNpbDE2NF9zYXZlKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8pCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fdGZwNDEwLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fdGZwNDEwLmMKaW5kZXggOWVjYzkwNy4uYzdjMzkxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX3RmcDQxMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b190ZnA0MTAuYwpAQCAtMTMwLDcgKzEzMCw3IEBACiAJfTsKIAogCWlmICghdGZwLT5xdWlldCkgewotCQlEUk1fREVCVUcoIlVuYWJsZSB0byByZWFkIHJlZ2lzdGVyIDB4JTAyeCBmcm9tICVzOiUwMnguXG4iLAorCQlEUk1fREVCVUdfS01TKCJVbmFibGUgdG8gcmVhZCByZWdpc3RlciAweCUwMnggZnJvbSAlczolMDJ4LlxuIiwKIAkJCSAgYWRkciwgaTJjYnVzLT5hZGFwdGVyLm5hbWUsIGR2by0+c2xhdmVfYWRkcik7CiAJfQogCXJldHVybiBmYWxzZTsKQEAgLTE1Niw3ICsxNTYsNyBAQAogCQlyZXR1cm4gdHJ1ZTsKIAogCWlmICghdGZwLT5xdWlldCkgewotCQlEUk1fREVCVUcoIlVuYWJsZSB0byB3cml0ZSByZWdpc3RlciAweCUwMnggdG8gJXM6JWQuXG4iLAorCQlEUk1fREVCVUdfS01TKCJVbmFibGUgdG8gd3JpdGUgcmVnaXN0ZXIgMHglMDJ4IHRvICVzOiVkLlxuIiwKIAkJCSAgYWRkciwgaTJjYnVzLT5hZGFwdGVyLm5hbWUsIGR2by0+c2xhdmVfYWRkcik7CiAJfQogCkBAIC0xOTEsMTMgKzE5MSwxNSBAQAogCXRmcC0+cXVpZXQgPSB0cnVlOwogCiAJaWYgKChpZCA9IHRmcDQxMF9nZXRpZChkdm8sIFRGUDQxMF9WSURfTE8pKSAhPSBURlA0MTBfVklEKSB7Ci0JCURSTV9ERUJVRygidGZwNDEwIG5vdCBkZXRlY3RlZCBnb3QgVklEICVYOiBmcm9tICVzIFNsYXZlICVkLlxuIiwKKwkJRFJNX0RFQlVHX0tNUygidGZwNDEwIG5vdCBkZXRlY3RlZCBnb3QgVklEICVYOiBmcm9tICVzICIKKwkJCQkiU2xhdmUgJWQuXG4iLAogCQkJICBpZCwgYWRhcHRlci0+bmFtZSwgZHZvLT5zbGF2ZV9hZGRyKTsKIAkJZ290byBvdXQ7CiAJfQogCiAJaWYgKChpZCA9IHRmcDQxMF9nZXRpZChkdm8sIFRGUDQxMF9ESURfTE8pKSAhPSBURlA0MTBfRElEKSB7Ci0JCURSTV9ERUJVRygidGZwNDEwIG5vdCBkZXRlY3RlZCBnb3QgRElEICVYOiBmcm9tICVzIFNsYXZlICVkLlxuIiwKKwkJRFJNX0RFQlVHX0tNUygidGZwNDEwIG5vdCBkZXRlY3RlZCBnb3QgRElEICVYOiBmcm9tICVzICIKKwkJCQkiU2xhdmUgJWQuXG4iLAogCQkJICBpZCwgYWRhcHRlci0+bmFtZSwgZHZvLT5zbGF2ZV9hZGRyKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMjYyLDMzICsyNjQsMzMgQEAKIAl1aW50OF90IHZhbCwgdmFsMjsKIAogCXRmcDQxMF9yZWFkYihkdm8sIFRGUDQxMF9SRVYsICZ2YWwpOwotCURSTV9ERUJVRygiVEZQNDEwX1JFVjogMHglMDJYXG4iLCB2YWwpOworCURSTV9MT0dfS01TKCJURlA0MTBfUkVWOiAweCUwMlhcbiIsIHZhbCk7CiAJdGZwNDEwX3JlYWRiKGR2bywgVEZQNDEwX0NUTF8xLCAmdmFsKTsKLQlEUk1fREVCVUcoIlRGUDQxMF9DVEwxOiAweCUwMlhcbiIsIHZhbCk7CisJRFJNX0xPR19LTVMoIlRGUDQxMF9DVEwxOiAweCUwMlhcbiIsIHZhbCk7CiAJdGZwNDEwX3JlYWRiKGR2bywgVEZQNDEwX0NUTF8yLCAmdmFsKTsKLQlEUk1fREVCVUcoIlRGUDQxMF9DVEwyOiAweCUwMlhcbiIsIHZhbCk7CisJRFJNX0xPR19LTVMoIlRGUDQxMF9DVEwyOiAweCUwMlhcbiIsIHZhbCk7CiAJdGZwNDEwX3JlYWRiKGR2bywgVEZQNDEwX0NUTF8zLCAmdmFsKTsKLQlEUk1fREVCVUcoIlRGUDQxMF9DVEwzOiAweCUwMlhcbiIsIHZhbCk7CisJRFJNX0xPR19LTVMoIlRGUDQxMF9DVEwzOiAweCUwMlhcbiIsIHZhbCk7CiAJdGZwNDEwX3JlYWRiKGR2bywgVEZQNDEwX1VTRVJDRkcsICZ2YWwpOwotCURSTV9ERUJVRygiVEZQNDEwX1VTRVJDRkc6IDB4JTAyWFxuIiwgdmFsKTsKKwlEUk1fTE9HX0tNUygiVEZQNDEwX1VTRVJDRkc6IDB4JTAyWFxuIiwgdmFsKTsKIAl0ZnA0MTBfcmVhZGIoZHZvLCBURlA0MTBfREVfRExZLCAmdmFsKTsKLQlEUk1fREVCVUcoIlRGUDQxMF9ERV9ETFk6IDB4JTAyWFxuIiwgdmFsKTsKKwlEUk1fTE9HX0tNUygiVEZQNDEwX0RFX0RMWTogMHglMDJYXG4iLCB2YWwpOwogCXRmcDQxMF9yZWFkYihkdm8sIFRGUDQxMF9ERV9DVEwsICZ2YWwpOwotCURSTV9ERUJVRygiVEZQNDEwX0RFX0NUTDogMHglMDJYXG4iLCB2YWwpOworCURSTV9MT0dfS01TKCJURlA0MTBfREVfQ1RMOiAweCUwMlhcbiIsIHZhbCk7CiAJdGZwNDEwX3JlYWRiKGR2bywgVEZQNDEwX0RFX1RPUCwgJnZhbCk7Ci0JRFJNX0RFQlVHKCJURlA0MTBfREVfVE9QOiAweCUwMlhcbiIsIHZhbCk7CisJRFJNX0xPR19LTVMoIlRGUDQxMF9ERV9UT1A6IDB4JTAyWFxuIiwgdmFsKTsKIAl0ZnA0MTBfcmVhZGIoZHZvLCBURlA0MTBfREVfQ05UX0xPLCAmdmFsKTsKIAl0ZnA0MTBfcmVhZGIoZHZvLCBURlA0MTBfREVfQ05UX0hJLCAmdmFsMik7Ci0JRFJNX0RFQlVHKCJURlA0MTBfREVfQ05UOiAweCUwMlglMDJYXG4iLCB2YWwyLCB2YWwpOworCURSTV9MT0dfS01TKCJURlA0MTBfREVfQ05UOiAweCUwMlglMDJYXG4iLCB2YWwyLCB2YWwpOwogCXRmcDQxMF9yZWFkYihkdm8sIFRGUDQxMF9ERV9MSU5fTE8sICZ2YWwpOwogCXRmcDQxMF9yZWFkYihkdm8sIFRGUDQxMF9ERV9MSU5fSEksICZ2YWwyKTsKLQlEUk1fREVCVUcoIlRGUDQxMF9ERV9MSU46IDB4JTAyWCUwMlhcbiIsIHZhbDIsIHZhbCk7CisJRFJNX0xPR19LTVMoIlRGUDQxMF9ERV9MSU46IDB4JTAyWCUwMlhcbiIsIHZhbDIsIHZhbCk7CiAJdGZwNDEwX3JlYWRiKGR2bywgVEZQNDEwX0hfUkVTX0xPLCAmdmFsKTsKIAl0ZnA0MTBfcmVhZGIoZHZvLCBURlA0MTBfSF9SRVNfSEksICZ2YWwyKTsKLQlEUk1fREVCVUcoIlRGUDQxMF9IX1JFUzogMHglMDJYJTAyWFxuIiwgdmFsMiwgdmFsKTsKKwlEUk1fTE9HX0tNUygiVEZQNDEwX0hfUkVTOiAweCUwMlglMDJYXG4iLCB2YWwyLCB2YWwpOwogCXRmcDQxMF9yZWFkYihkdm8sIFRGUDQxMF9WX1JFU19MTywgJnZhbCk7CiAJdGZwNDEwX3JlYWRiKGR2bywgVEZQNDEwX1ZfUkVTX0hJLCAmdmFsMik7Ci0JRFJNX0RFQlVHKCJURlA0MTBfVl9SRVM6IDB4JTAyWCUwMlhcbiIsIHZhbDIsIHZhbCk7CisJRFJNX0xPR19LTVMoIlRGUDQxMF9WX1JFUzogMHglMDJYJTAyWFxuIiwgdmFsMiwgdmFsKTsKIH0KIAogc3RhdGljIHZvaWQgdGZwNDEwX3NhdmUoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdmcy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMKaW5kZXggMjZiZjA1NS4uMTg0NzZiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMKQEAgLTI3LDYgKzI3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybS5oIgogI2luY2x1ZGUgImk5MTVfZHJtLmgiCkBAIC05NiwxMyArOTcsMTQgQEAKIAl7CiAJCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gb2JqX3ByaXYtPm9iajsKIAotCQlzZXFfcHJpbnRmKG0sICIgICAgJXA6ICVzICU4emQgJTA4eCAlMDh4ICVkICVzIiwKKwkJc2VxX3ByaW50ZihtLCAiICAgICVwOiAlcyAlOHpkICUwOHggJTA4eCAlZCVzJXMiLAogCQkJICAgb2JqLAogCQkJICAgZ2V0X3Bpbl9mbGFnKG9ial9wcml2KSwKIAkJCSAgIG9iai0+c2l6ZSwKIAkJCSAgIG9iai0+cmVhZF9kb21haW5zLCBvYmotPndyaXRlX2RvbWFpbiwKIAkJCSAgIG9ial9wcml2LT5sYXN0X3JlbmRlcmluZ19zZXFubywKLQkJCSAgIG9ial9wcml2LT5kaXJ0eSA/ICJkaXJ0eSIgOiAiIik7CisJCQkgICBvYmpfcHJpdi0+ZGlydHkgPyAiIGRpcnR5IiA6ICIiLAorCQkJICAgb2JqX3ByaXYtPm1hZHYgPT0gSTkxNV9NQURWX0RPTlRORUVEID8gIiBwdXJnZWFibGUiIDogIiIpOwogCiAJCWlmIChvYmotPm5hbWUpCiAJCQlzZXFfcHJpbnRmKG0sICIgKG5hbWU6ICVkKSIsIG9iai0+bmFtZSk7CkBAIC0xNjAsNyArMTYyLDcgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAotCWlmICghSVNfSUdETkcoZGV2KSkgeworCWlmICghSVNfSVJPTkxBS0UoZGV2KSkgewogCQlzZXFfcHJpbnRmKG0sICJJbnRlcnJ1cHQgZW5hYmxlOiAgICAlMDh4XG4iLAogCQkJICAgSTkxNV9SRUFEKElFUikpOwogCQlzZXFfcHJpbnRmKG0sICJJbnRlcnJ1cHQgaWRlbnRpdHk6ICAlMDh4XG4iLApAQCAtNDEyLDYgKzQxNCwxMDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludAoraTkxNV93ZWRnZWRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgc3RydWN0IGZpbGUgKmZpbHApCit7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QKK2k5MTVfd2VkZ2VkX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsCisJCSBjaGFyIF9fdXNlciAqdWJ1ZiwKKwkJIHNpemVfdCBtYXgsCisJCSBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwljaGFyIGJ1Zls4MF07CisJaW50IGxlbjsKKworCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mIChidWYpLAorCQkgICAgICAgIndlZGdlZCA6ICAlZFxuIiwKKwkJICAgICAgIGF0b21pY19yZWFkKCZkZXZfcHJpdi0+bW0ud2VkZ2VkKSk7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodWJ1ZiwgbWF4LCBwcG9zLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpOTE1X3dlZGdlZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICBjb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiwKKwkJICBzaXplX3QgY250LAorCQkgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWNoYXIgYnVmWzIwXTsKKwlpbnQgdmFsID0gMTsKKworCWlmIChjbnQgPiAwKSB7CisJCWlmIChjbnQgPiBzaXplb2YgKGJ1ZikgLSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdWJ1ZiwgY250KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlidWZbY250XSA9IDA7CisKKwkJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKKwl9CisKKwlEUk1fSU5GTygiTWFudWFsbHkgc2V0dGluZyB3ZWRnZWQgdG8gJWRcbiIsIHZhbCk7CisKKwlhdG9taWNfc2V0KCZkZXZfcHJpdi0+bW0ud2VkZ2VkLCB2YWwpOworCWlmICh2YWwpIHsKKwkJRFJNX1dBS0VVUCgmZGV2X3ByaXYtPmlycV9xdWV1ZSk7CisJCXF1ZXVlX3dvcmsoZGV2X3ByaXYtPndxLCAmZGV2X3ByaXYtPmVycm9yX3dvcmspOworCX0KKworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGk5MTVfd2VkZ2VkX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBpOTE1X3dlZGdlZF9vcGVuLAorCS5yZWFkID0gaTkxNV93ZWRnZWRfcmVhZCwKKwkud3JpdGUgPSBpOTE1X3dlZGdlZF93cml0ZSwKK307CisKKy8qIEFzIHRoZSBkcm1fZGVidWdmc19pbml0KCkgcm91dGluZXMgYXJlIGNhbGxlZCBiZWZvcmUgZGV2LT5kZXZfcHJpdmF0ZSBpcworICogYWxsb2NhdGVkIHdlIG5lZWQgdG8gaG9vayBpbnRvIHRoZSBtaW5vciBmb3IgcmVsZWFzZS4gKi8KK3N0YXRpYyBpbnQKK2RybV9hZGRfZmFrZV9pbmZvX25vZGUoc3RydWN0IGRybV9taW5vciAqbWlub3IsCisJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICplbnQsCisJCSAgICAgICBjb25zdCB2b2lkICprZXkpCit7CisJc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGU7CisKKwlub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRybV9pbmZvX25vZGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAobm9kZSA9PSBOVUxMKSB7CisJCWRlYnVnZnNfcmVtb3ZlKGVudCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW5vZGUtPm1pbm9yID0gbWlub3I7CisJbm9kZS0+ZGVudCA9IGVudDsKKwlub2RlLT5pbmZvX2VudCA9ICh2b2lkICopIGtleTsKKwlsaXN0X2FkZCgmbm9kZS0+bGlzdCwgJm1pbm9yLT5kZWJ1Z2ZzX25vZGVzLmxpc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTkxNV93ZWRnZWRfY3JlYXRlKHN0cnVjdCBkZW50cnkgKnJvb3QsIHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBtaW5vci0+ZGV2OworCXN0cnVjdCBkZW50cnkgKmVudDsKKworCWVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImk5MTVfd2VkZ2VkIiwKKwkJCQkgIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJCSAgcm9vdCwgZGV2LAorCQkJCSAgJmk5MTVfd2VkZ2VkX2ZvcHMpOworCWlmIChJU19FUlIoZW50KSkKKwkJcmV0dXJuIFBUUl9FUlIoZW50KTsKKworCXJldHVybiBkcm1fYWRkX2Zha2VfaW5mb19ub2RlKG1pbm9yLCBlbnQsICZpOTE1X3dlZGdlZF9mb3BzKTsKK30KIAogc3RhdGljIHN0cnVjdCBkcm1faW5mb19saXN0IGk5MTVfZGVidWdmc19saXN0W10gPSB7CiAJeyJpOTE1X3JlZ3MiLCBpOTE1X3JlZ2lzdGVyc19pbmZvLCAwfSwKQEAgLTQzMiw2ICs1MzcsMTIgQEAKIAogaW50IGk5MTVfZGVidWdmc19pbml0KHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yKQogeworCWludCByZXQ7CisKKwlyZXQgPSBpOTE1X3dlZGdlZF9jcmVhdGUobWlub3ItPmRlYnVnZnNfcm9vdCwgbWlub3IpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlyZXR1cm4gZHJtX2RlYnVnZnNfY3JlYXRlX2ZpbGVzKGk5MTVfZGVidWdmc19saXN0LAogCQkJCQlJOTE1X0RFQlVHRlNfRU5UUklFUywKIAkJCQkJbWlub3ItPmRlYnVnZnNfcm9vdCwgbWlub3IpOwpAQCAtNDQxLDcgKzU1Miw4IEBACiB7CiAJZHJtX2RlYnVnZnNfcmVtb3ZlX2ZpbGVzKGk5MTVfZGVidWdmc19saXN0LAogCQkJCSBJOTE1X0RFQlVHRlNfRU5UUklFUywgbWlub3IpOworCWRybV9kZWJ1Z2ZzX3JlbW92ZV9maWxlcygoc3RydWN0IGRybV9pbmZvX2xpc3QgKikgJmk5MTVfd2VkZ2VkX2ZvcHMsCisJCQkJIDEsIG1pbm9yKTsKIH0KIAogI2VuZGlmIC8qIENPTkZJR19ERUJVR19GUyAqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYwppbmRleCBlNWIxMzhiLi43MDFiZmVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKQEAgLTgwNyw2ICs4MDcsMTIgQEAKIAljYXNlIEk5MTVfUEFSQU1fTlVNX0ZFTkNFU19BVkFJTDoKIAkJdmFsdWUgPSBkZXZfcHJpdi0+bnVtX2ZlbmNlX3JlZ3MgLSBkZXZfcHJpdi0+ZmVuY2VfcmVnX3N0YXJ0OwogCQlicmVhazsKKwljYXNlIEk5MTVfUEFSQU1fSEFTX09WRVJMQVk6CisJCXZhbHVlID0gZGV2X3ByaXYtPm92ZXJsYXkgPyAxIDogMDsKKwkJYnJlYWs7CisJY2FzZSBJOTE1X1BBUkFNX0hBU19QQUdFRkxJUFBJTkc6CisJCXZhbHVlID0gMTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJRFJNX0RFQlVHX0RSSVZFUigiVW5rbm93biBwYXJhbWV0ZXIgJWRcbiIsCiAJCQkJCXBhcmFtLT5wYXJhbSk7CkBAIC05NjIsNyArOTY4LDcgQEAKIAkgKiBTb21lIG9mIHRoZSBwcmVhbGxvY2F0ZWQgc3BhY2UgaXMgdGFrZW4gYnkgdGhlIEdUVAogCSAqIGFuZCBwb3B1cC4gIEdUVCBpcyAxSyBwZXIgTUIgb2YgYXBlcnR1cmUgc2l6ZSwgYW5kIHBvcHVwIGlzIDRLLgogCSAqLwotCWlmIChJU19HNFgoZGV2KSB8fCBJU19JR0QoZGV2KSB8fCBJU19JR0RORyhkZXYpKQorCWlmIChJU19HNFgoZGV2KSB8fCBJU19QSU5FVklFVyhkZXYpIHx8IElTX0lST05MQUtFKGRldikpCiAJCW92ZXJoZWFkID0gNDA5NjsKIAllbHNlCiAJCW92ZXJoZWFkID0gKCphcGVydHVyZV9zaXplIC8gMTAyNCkgKyA0MDk2OwpAQCAtMTA0OCw3ICsxMDU0LDcgQEAKIAlpbnQgZ3R0X29mZnNldCwgZ3R0X3NpemU7CiAKIAlpZiAoSVNfSTk2NUcoZGV2KSkgewotCQlpZiAoSVNfRzRYKGRldikgfHwgSVNfSUdETkcoZGV2KSkgeworCQlpZiAoSVNfRzRYKGRldikgfHwgSVNfSVJPTkxBS0UoZGV2KSkgewogCQkJZ3R0X29mZnNldCA9IDIqMTAyNCoxMDI0OwogCQkJZ3R0X3NpemUgPSAyKjEwMjQqMTAyNDsKIAkJfSBlbHNlIHsKQEAgLTEwNzAsNyArMTA3Niw3IEBACiAKIAllbnRyeSA9ICoodm9sYXRpbGUgdTMyICopKGd0dCArIChndHRfYWRkciAvIDEwMjQpKTsKIAotCURSTV9ERUJVRygiR1RUIGFkZHI6IDB4JTA4bHgsIFBURTogMHglMDhseFxuIiwgZ3R0X2FkZHIsIGVudHJ5KTsKKwlEUk1fREVCVUdfRFJJVkVSKCJHVFQgYWRkcjogMHglMDhseCwgUFRFOiAweCUwOGx4XG4iLCBndHRfYWRkciwgZW50cnkpOwogCiAJLyogTWFzayBvdXQgdGhlc2UgcmVzZXJ2ZWQgYml0cyBvbiB0aGlzIGhhcmR3YXJlLiAqLwogCWlmICghSVNfSTlYWChkZXYpIHx8IElTX0k5MTVHKGRldikgfHwgSVNfSTkxNUdNKGRldikgfHwKQEAgLTEwOTYsNyArMTEwMiw3IEBACiAJcGh5cyA9KGVudHJ5ICYgUFRFX0FERFJFU1NfTUFTSykgfAogCQkoKHVpbnQ2NF90KShlbnRyeSAmIFBURV9BRERSRVNTX01BU0tfSElHSCkgPDwgKDMyIC0gNCkpOwogCi0JRFJNX0RFQlVHKCJHVFQgYWRkcjogMHglMDhseCwgcGh5cyBhZGRyOiAweCUwOGx4XG4iLCBndHRfYWRkciwgcGh5cyk7CisJRFJNX0RFQlVHX0RSSVZFUigiR1RUIGFkZHI6IDB4JTA4bHgsIHBoeXMgYWRkcjogMHglMDhseFxuIiwgZ3R0X2FkZHIsIHBoeXMpOwogCiAJcmV0dXJuIHBoeXM7CiB9CkBAIC0xMzA2LDcgKzEzMTIsNyBAQAogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiB0bXA7CiAKLQlpZiAoIUlTX0lHRChkZXYpKQorCWlmICghSVNfUElORVZJRVcoZGV2KSkKIAkJcmV0dXJuOwogCiAJdG1wID0gSTkxNV9SRUFEKENMS0NGRyk7CkBAIC0xNDEzLDcgKzE0MTksNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2lvbWFwZnJlZTsKIAotCWRldl9wcml2LT53cSA9IGNyZWF0ZV93b3JrcXVldWUoImk5MTUiKTsKKwlkZXZfcHJpdi0+d3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiaTkxNSIpOwogCWlmIChkZXZfcHJpdi0+d3EgPT0gTlVMTCkgewogCQlEUk1fRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgb3VyIHdvcmtxdWV1ZS5cbiIpOwogCQlyZXQgPSAtRU5PTUVNOwpAQCAtMTQzNCw3ICsxNDQwLDcgQEAKIAogCWRldi0+ZHJpdmVyLT5nZXRfdmJsYW5rX2NvdW50ZXIgPSBpOTE1X2dldF92YmxhbmtfY291bnRlcjsKIAlkZXYtPm1heF92YmxhbmtfY291bnQgPSAweGZmZmZmZjsgLyogb25seSAyNCBiaXRzIG9mIGZyYW1lIGNvdW50ICovCi0JaWYgKElTX0c0WChkZXYpIHx8IElTX0lHRE5HKGRldikpIHsKKwlpZiAoSVNfRzRYKGRldikgfHwgSVNfSVJPTkxBS0UoZGV2KSkgewogCQlkZXYtPm1heF92YmxhbmtfY291bnQgPSAweGZmZmZmZmZmOyAvKiBmdWxsIDMyIGJpdCBjb3VudGVyICovCiAJCWRldi0+ZHJpdmVyLT5nZXRfdmJsYW5rX2NvdW50ZXIgPSBnbTQ1X2dldF92YmxhbmtfY291bnRlcjsKIAl9CkBAIC0xNDg5LDkgKzE0OTUsNyBAQAogCX0KIAogCS8qIE11c3QgYmUgZG9uZSBhZnRlciBwcm9iaW5nIG91dHB1dHMgKi8KLQkvKiBGSVhNRTogdmVyaWZ5IG9uIElHRE5HICovCi0JaWYgKCFJU19JR0RORyhkZXYpKQotCQlpbnRlbF9vcHJlZ2lvbl9pbml0KGRldiwgMCk7CisJaW50ZWxfb3ByZWdpb25faW5pdChkZXYsIDApOwogCiAJc2V0dXBfdGltZXIoJmRldl9wcml2LT5oYW5nY2hlY2tfdGltZXIsIGk5MTVfaGFuZ2NoZWNrX2VsYXBzZWQsCiAJCSAgICAodW5zaWduZWQgbG9uZykgZGV2KTsKQEAgLTE1MjUsNiArMTUyOSwxNSBAQAogCX0KIAogCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKSB7CisJCS8qCisJCSAqIGZyZWUgdGhlIG1lbW9yeSBzcGFjZSBhbGxvY2F0ZWQgZm9yIHRoZSBjaGlsZCBkZXZpY2UKKwkJICogY29uZmlnIHBhcnNlZCBmcm9tIFZCVAorCQkgKi8KKwkJaWYgKGRldl9wcml2LT5jaGlsZF9kZXYgJiYgZGV2X3ByaXYtPmNoaWxkX2Rldl9udW0pIHsKKwkJCWtmcmVlKGRldl9wcml2LT5jaGlsZF9kZXYpOworCQkJZGV2X3ByaXYtPmNoaWxkX2RldiA9IE5VTEw7CisJCQlkZXZfcHJpdi0+Y2hpbGRfZGV2X251bSA9IDA7CisJCX0KIAkJZHJtX2lycV91bmluc3RhbGwoZGV2KTsKIAkJdmdhX2NsaWVudF9yZWdpc3RlcihkZXYtPnBkZXYsIE5VTEwsIE5VTEwsIE5VTEwpOwogCX0KQEAgLTE1MzUsOCArMTU0OCw3IEBACiAJaWYgKGRldl9wcml2LT5yZWdzICE9IE5VTEwpCiAJCWlvdW5tYXAoZGV2X3ByaXYtPnJlZ3MpOwogCi0JaWYgKCFJU19JR0RORyhkZXYpKQotCQlpbnRlbF9vcHJlZ2lvbl9mcmVlKGRldiwgMCk7CisJaW50ZWxfb3ByZWdpb25fZnJlZShkZXYsIDApOwogCiAJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKIAkJaW50ZWxfbW9kZXNldF9jbGVhbnVwKGRldik7CkBAIC0xNTQ4LDYgKzE1NjAsOCBAQAogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAkJZHJtX21tX3Rha2Vkb3duKCZkZXZfcHJpdi0+dnJhbSk7CiAJCWk5MTVfZ2VtX2xhc3RjbG9zZShkZXYpOworCisJCWludGVsX2NsZWFudXBfb3ZlcmxheShkZXYpOwogCX0KIAogCXBjaV9kZXZfcHV0KGRldl9wcml2LT5icmlkZ2VfZGV2KTsKQEAgLTE2NTYsNiArMTY3MCw4IEBACiAJRFJNX0lPQ1RMX0RFRihEUk1fSTkxNV9HRU1fR0VUX0FQRVJUVVJFLCBpOTE1X2dlbV9nZXRfYXBlcnR1cmVfaW9jdGwsIDApLAogCURSTV9JT0NUTF9ERUYoRFJNX0k5MTVfR0VUX1BJUEVfRlJPTV9DUlRDX0lELCBpbnRlbF9nZXRfcGlwZV9mcm9tX2NydGNfaWQsIDApLAogCURSTV9JT0NUTF9ERUYoRFJNX0k5MTVfR0VNX01BRFZJU0UsIGk5MTVfZ2VtX21hZHZpc2VfaW9jdGwsIDApLAorCURSTV9JT0NUTF9ERUYoRFJNX0k5MTVfT1ZFUkxBWV9QVVRfSU1BR0UsIGludGVsX292ZXJsYXlfcHV0X2ltYWdlLCBEUk1fTUFTVEVSfERSTV9DT05UUk9MX0FMTE9XKSwKKwlEUk1fSU9DVExfREVGKERSTV9JOTE1X09WRVJMQVlfQVRUUlMsIGludGVsX292ZXJsYXlfYXR0cnMsIERSTV9NQVNURVJ8RFJNX0NPTlRST0xfQUxMT1cpLAogfTsKIAogaW50IGk5MTVfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUoaTkxNV9pb2N0bHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKaW5kZXggN2Y0MzZlYy4uMmZhMjE3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCkBAIC0zMzMsNiArMzMzLDcgQEAKIAkJIC5tbWFwID0gZHJtX2dlbV9tbWFwLAogCQkgLnBvbGwgPSBkcm1fcG9sbCwKIAkJIC5mYXN5bmMgPSBkcm1fZmFzeW5jLAorCQkgLnJlYWQgPSBkcm1fcmVhZCwKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJCSAuY29tcGF0X2lvY3RsID0gaTkxNV9jb21wYXRfaW9jdGwsCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCmluZGV4IGE3MjVmNjU5Li5mYmVjYWM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKQEAgLTE3MCw2ICsxNzAsOCBAQAogCS8qIGNsb2NrIGdhdGluZyBpbml0ICovCiB9OwogCitzdHJ1Y3QgaW50ZWxfb3ZlcmxheTsKKwogdHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIApAQCAtMTg3LDYgKzE4OSw3IEBACiAJdW5zaWduZWQgaW50IHN0YXR1c19nZnhfYWRkcjsKIAlkcm1fbG9jYWxfbWFwX3QgaHdzX21hcDsKIAlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmh3c19vYmo7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpwd3JjdHg7CiAKIAlzdHJ1Y3QgcmVzb3VyY2UgbWNoX3JlczsKIApAQCAtMjA2LDExICsyMDksMTMgQEAKIAkvKiogQ2FjaGVkIHZhbHVlIG9mIElNUiB0byBhdm9pZCByZWFkcyBpbiB1cGRhdGluZyB0aGUgYml0ZmllbGQgKi8KIAl1MzIgaXJxX21hc2tfcmVnOwogCXUzMiBwaXBlc3RhdFsyXTsKLQkvKiogc3BsaXR0ZWQgaXJxIHJlZ3MgZm9yIGdyYXBoaWNzIGFuZCBkaXNwbGF5IGVuZ2luZSBvbiBJR0RORywKKwkvKiogc3BsaXR0ZWQgaXJxIHJlZ3MgZm9yIGdyYXBoaWNzIGFuZCBkaXNwbGF5IGVuZ2luZSBvbiBJcm9ubGFrZSwKIAkgICAgaXJxX21hc2tfcmVnIGlzIHN0aWxsIHVzZWQgZm9yIGRpc3BsYXkgaXJxLiAqLwogCXUzMiBndF9pcnFfbWFza19yZWc7CiAJdTMyIGd0X2lycV9lbmFibGVfcmVnOwogCXUzMiBkZV9pcnFfZW5hYmxlX3JlZzsKKwl1MzIgcGNoX2lycV9tYXNrX3JlZzsKKwl1MzIgcGNoX2lycV9lbmFibGVfcmVnOwogCiAJdTMyIGhvdHBsdWdfc3VwcG9ydGVkX21hc2s7CiAJc3RydWN0IHdvcmtfc3RydWN0IGhvdHBsdWdfd29yazsKQEAgLTI0MCw2ICsyNDUsOSBAQAogCiAJc3RydWN0IGludGVsX29wcmVnaW9uIG9wcmVnaW9uOwogCisJLyogb3ZlcmxheSAqLworCXN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5OworCiAJLyogTFZEUyBpbmZvICovCiAJaW50IGJhY2tsaWdodF9kdXR5X2N5Y2xlOyAgLyogcmVzdG9yZSBiYWNrbGlnaHQgdG8gdGhpcyB2YWx1ZSAqLwogCWJvb2wgcGFuZWxfd2FudHNfZGl0aGVyOwpAQCAtMjU4LDcgKzI2Niw3IEBACiAKIAlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbGlkX25vdGlmaWVyOwogCi0JaW50IGNydF9kZGNfYnVzOyAvKiAtMSA9IHVua25vd24sIGVsc2UgR1BJTyB0byB1c2UgZm9yIENSVCBEREMgKi8KKwlpbnQgY3J0X2RkY19idXM7IC8qIDAgPSB1bmtub3duLCBlbHNlIEdQSU8gdG8gdXNlIGZvciBDUlQgRERDICovCiAJc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyBmZW5jZV9yZWdzWzE2XTsgLyogYXNzdW1lIDk2NSAqLwogCWludCBmZW5jZV9yZWdfc3RhcnQ7IC8qIDQgaWYgdXNlcmxhbmQgaGFzbid0IGlvY3RsJ2QgdXMgeWV0ICovCiAJaW50IG51bV9mZW5jZV9yZWdzOyAvKiA4IG9uIHByZS05NjUsIDE2IG90aGVyd2lzZSAqLwpAQCAtMjgwLDYgKzI4OCw3IEBACiAJdTMyIHNhdmVEU1BCQ05UUjsKIAl1MzIgc2F2ZURTUEFSQjsKIAl1MzIgc2F2ZVJFTkRFUlNUQU5EQlk7CisJdTMyIHNhdmVQV1JDVFhBOwogCXUzMiBzYXZlSFdTOwogCXUzMiBzYXZlUElQRUFDT05GOwogCXUzMiBzYXZlUElQRUJDT05GOwpAQCAtMzc0LDggKzM4Myw2IEBACiAJdTMyIHNhdmVGRElfUlhBX0lNUjsKIAl1MzIgc2F2ZUZESV9SWEJfSU1SOwogCXUzMiBzYXZlQ0FDSEVfTU9ERV8wOwotCXUzMiBzYXZlRF9TVEFURTsKLQl1MzIgc2F2ZURTUENMS19HQVRFX0Q7CiAJdTMyIHNhdmVNSV9BUkJfU1RBVEU7CiAJdTMyIHNhdmVTV0YwWzE2XTsKIAl1MzIgc2F2ZVNXRjFbMTZdOwpAQCAtNTM5LDEzICs1NDYsMjEgQEAKIAkvKiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBMVkRTX0JPUkRFUiBzaG91bGQgYmUgZW5hYmxlZCBvciBub3QgKi8KIAl1bnNpZ25lZCBpbnQgbHZkc19ib3JkZXJfYml0czsKIAorCXN0cnVjdCBkcm1fY3J0YyAqcGxhbmVfdG9fY3J0Y19tYXBwaW5nWzJdOworCXN0cnVjdCBkcm1fY3J0YyAqcGlwZV90b19jcnRjX21hcHBpbmdbMl07CisJd2FpdF9xdWV1ZV9oZWFkX3QgcGVuZGluZ19mbGlwX3F1ZXVlOworCiAJLyogUmVjbG9ja2luZyBzdXBwb3J0ICovCiAJYm9vbCByZW5kZXJfcmVjbG9ja19hdmFpbDsKIAlib29sIGx2ZHNfZG93bmNsb2NrX2F2YWlsOworCS8qIGluZGljYXRlcyB0aGUgcmVkdWNlZCBkb3duY2xvY2sgZm9yIExWRFMqLworCWludCBsdmRzX2Rvd25jbG9jazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaWRsZV93b3JrOwogCXN0cnVjdCB0aW1lcl9saXN0IGlkbGVfdGltZXI7CiAJYm9vbCBidXN5OwogCXUxNiBvcmlnX2Nsb2NrOworCWludCBjaGlsZF9kZXZfbnVtOworCXN0cnVjdCBjaGlsZF9kZXZpY2VfY29uZmlnICpjaGlsZF9kZXY7CiB9IGRybV9pOTE1X3ByaXZhdGVfdDsKIAogLyoqIGRyaXZlciBwcml2YXRlIHN0cnVjdHVyZSBhdHRhY2hlZCB0byBlYWNoIGRybV9nZW1fb2JqZWN0ICovCkBAIC02MzgsNiArNjUzLDEzIEBACiAJICogQWR2aWNlOiBhcmUgdGhlIGJhY2tpbmcgcGFnZXMgcHVyZ2VhYmxlPwogCSAqLwogCWludCBtYWR2OworCisJLyoqCisJICogTnVtYmVyIG9mIGNydGNzIHdoZXJlIHRoaXMgb2JqZWN0IGlzIGN1cnJlbnRseSB0aGUgZmIsIGJ1dAorCSAqIHdpbGwgYmUgcGFnZSBmbGlwcGVkIGF3YXkgb24gdGhlIG5leHQgdmJsYW5rLiAgV2hlbiBpdAorCSAqIHJlYWNoZXMgMCwgZGV2X3ByaXYtPnBlbmRpbmdfZmxpcF9xdWV1ZSB3aWxsIGJlIHdva2VuIHVwLgorCSAqLworCWF0b21pY190IHBlbmRpbmdfZmxpcDsKIH07CiAKIC8qKgpAQCAtNzM4LDYgKzc2MCw4IEBACiB2b2lkCiBpOTE1X2Rpc2FibGVfcGlwZXN0YXQoZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IHBpcGUsIHUzMiBtYXNrKTsKIAordm9pZCBpbnRlbF9lbmFibGVfYXNsZSAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisKIAogLyogaTkxNV9tZW0uYyAqLwogZXh0ZXJuIGludCBpOTE1X21lbV9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLApAQCAtODEzLDYgKzgzNyw5IEBACiBpbnQgaTkxNV9nZW1fZG9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHN0YXJ0LAogCQkgICAgIHVuc2lnbmVkIGxvbmcgZW5kKTsKIGludCBpOTE1X2dlbV9pZGxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwordWludDMyX3QgaTkxNV9hZGRfcmVxdWVzdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJCSAgdWludDMyX3QgZmx1c2hfZG9tYWlucyk7CitpbnQgaTkxNV9kb193YWl0X3JlcXVlc3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3Qgc2Vxbm8sIGludCBpbnRlcnJ1cHRpYmxlKTsKIGludCBpOTE1X2dlbV9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpOwogaW50IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKIAkJCQkgICAgICBpbnQgd3JpdGUpOwpAQCAtODI0LDYgKzg1MSw3IEBACiBpbnQgaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlcyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CiB2b2lkIGk5MTVfZ2VtX29iamVjdF9wdXRfcGFnZXMoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwogdm9pZCBpOTE1X2dlbV9yZWxlYXNlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7Cit2b2lkIGk5MTVfZ2VtX29iamVjdF9mbHVzaF93cml0ZV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwogCiB2b2lkIGk5MTVfZ2VtX3Nocmlua2VyX2luaXQodm9pZCk7CiB2b2lkIGk5MTVfZ2VtX3Nocmlua2VyX2V4aXQodm9pZCk7CkBAIC04NjMsMTEgKzg5MSwxMyBAQAogZXh0ZXJuIGludCBpbnRlbF9vcHJlZ2lvbl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCByZXN1bWUpOwogZXh0ZXJuIHZvaWQgaW50ZWxfb3ByZWdpb25fZnJlZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgc3VzcGVuZCk7CiBleHRlcm4gdm9pZCBvcHJlZ2lvbl9hc2xlX2ludHIoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBpcm9ubGFrZV9vcHJlZ2lvbl9nc2VfaW50cihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIG9wcmVnaW9uX2VuYWJsZV9hc2xlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IGludGVsX29wcmVnaW9uX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHJlc3VtZSkgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSB2b2lkIGludGVsX29wcmVnaW9uX2ZyZWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHN1c3BlbmQpIHsgcmV0dXJuOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgb3ByZWdpb25fYXNsZV9pbnRyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpIHsgcmV0dXJuOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgaXJvbmxha2Vfb3ByZWdpb25fZ3NlX2ludHIoc3RydWN0IGRybV9kZXZpY2UgKmRldikgeyByZXR1cm47IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBvcHJlZ2lvbl9lbmFibGVfYXNsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KSB7IHJldHVybjsgfQogI2VuZGlmCiAKQEAgLTk1NSw4ICs5ODUsOCBAQAogI2RlZmluZSBJU19JODMwKGRldikgKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MzU3NykKICNkZWZpbmUgSVNfODQ1RyhkZXYpICgoZGV2KS0+cGNpX2RldmljZSA9PSAweDI1NjIpCiAjZGVmaW5lIElTX0k4NVgoZGV2KSAoKGRldiktPnBjaV9kZXZpY2UgPT0gMHgzNTgyKQotI2RlZmluZSBJU19JODU1KGRldikgKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MzU4MikKICNkZWZpbmUgSVNfSTg2NUcoZGV2KSAoKGRldiktPnBjaV9kZXZpY2UgPT0gMHgyNTcyKQorI2RlZmluZSBJU19JOFhYKGRldikgKElTX0k4MzAoZGV2KSB8fCBJU184NDVHKGRldikgfHwgSVNfSTg1WChkZXYpIHx8IElTX0k4NjVHKGRldikpCiAKICNkZWZpbmUgSVNfSTkxNUcoZGV2KSAoKGRldiktPnBjaV9kZXZpY2UgPT0gMHgyNTgyIHx8IChkZXYpLT5wY2lfZGV2aWNlID09IDB4MjU4YSkKICNkZWZpbmUgSVNfSTkxNUdNKGRldikgKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MjU5MikKQEAgLTk5MCw0NyArMTAyMCw1MSBAQAogCQkgICAgIChkZXYpLT5wY2lfZGV2aWNlID09IDB4MkU0MiB8fCBcCiAJCSAgICAgSVNfR000NShkZXYpKQogCi0jZGVmaW5lIElTX0lHREcoZGV2KSAoKGRldiktPnBjaV9kZXZpY2UgPT0gMHhhMDAxKQotI2RlZmluZSBJU19JR0RHTShkZXYpICgoZGV2KS0+cGNpX2RldmljZSA9PSAweGEwMTEpCi0jZGVmaW5lIElTX0lHRChkZXYpIChJU19JR0RHKGRldikgfHwgSVNfSUdER00oZGV2KSkKKyNkZWZpbmUgSVNfUElORVZJRVdfRyhkZXYpICgoZGV2KS0+cGNpX2RldmljZSA9PSAweGEwMDEpCisjZGVmaW5lIElTX1BJTkVWSUVXX00oZGV2KSAoKGRldiktPnBjaV9kZXZpY2UgPT0gMHhhMDExKQorI2RlZmluZSBJU19QSU5FVklFVyhkZXYpIChJU19QSU5FVklFV19HKGRldikgfHwgSVNfUElORVZJRVdfTShkZXYpKQogCiAjZGVmaW5lIElTX0czMyhkZXYpICAgICgoZGV2KS0+cGNpX2RldmljZSA9PSAweDI5QzIgfHwJXAogCQkJKGRldiktPnBjaV9kZXZpY2UgPT0gMHgyOUIyIHx8CVwKIAkJCShkZXYpLT5wY2lfZGV2aWNlID09IDB4MjlEMiB8fCAgXAotCQkJKElTX0lHRChkZXYpKSkKKwkJCShJU19QSU5FVklFVyhkZXYpKSkKIAotI2RlZmluZSBJU19JR0ROR19EKGRldikJKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MDA0MikKLSNkZWZpbmUgSVNfSUdETkdfTShkZXYpCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweDAwNDYpCi0jZGVmaW5lIElTX0lHRE5HKGRldikJKElTX0lHRE5HX0QoZGV2KSB8fCBJU19JR0ROR19NKGRldikpCisjZGVmaW5lIElTX0lST05MQUtFX0QoZGV2KQkoKGRldiktPnBjaV9kZXZpY2UgPT0gMHgwMDQyKQorI2RlZmluZSBJU19JUk9OTEFLRV9NKGRldikJKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MDA0NikKKyNkZWZpbmUgSVNfSVJPTkxBS0UoZGV2KQkoSVNfSVJPTkxBS0VfRChkZXYpIHx8IElTX0lST05MQUtFX00oZGV2KSkKIAogI2RlZmluZSBJU19JOVhYKGRldikgKElTX0k5MTVHKGRldikgfHwgSVNfSTkxNUdNKGRldikgfHwgSVNfSTk0NUcoZGV2KSB8fCBcCiAJCSAgICAgIElTX0k5NDVHTShkZXYpIHx8IElTX0k5NjVHKGRldikgfHwgSVNfRzMzKGRldikgfHwgXAotCQkgICAgICBJU19JR0RORyhkZXYpKQorCQkgICAgICBJU19JUk9OTEFLRShkZXYpKQogCiAjZGVmaW5lIElTX01PQklMRShkZXYpIChJU19JODMwKGRldikgfHwgSVNfSTg1WChkZXYpIHx8IElTX0k5MTVHTShkZXYpIHx8IFwKIAkJCUlTX0k5NDVHTShkZXYpIHx8IElTX0k5NjVHTShkZXYpIHx8IElTX0dNNDUoZGV2KSB8fCBcCi0JCQlJU19JR0QoZGV2KSB8fCBJU19JR0ROR19NKGRldikpCisJCQlJU19QSU5FVklFVyhkZXYpIHx8IElTX0lST05MQUtFX00oZGV2KSkKIAogI2RlZmluZSBJOTE1X05FRURfR0ZYX0hXUyhkZXYpIChJU19HMzMoZGV2KSB8fCBJU19HTTQ1KGRldikgfHwgSVNfRzRYKGRldikgfHwgXAotCQkJCUlTX0lHRE5HKGRldikpCisJCQkJSVNfSVJPTkxBS0UoZGV2KSkKIC8qIFdpdGggdGhlIDk0NSBhbmQgbGF0ZXIsIFkgdGlsaW5nIGdvdCBhZGp1c3RlZCBzbyB0aGF0IGl0IHdhcyAzMiAxMjgtYnl0ZQogICogcm93cywgd2hpY2ggY2hhbmdlZCB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBhbmQgZmVuY2UgcHJvZ3JhbW1pbmcuCiAgKi8KICNkZWZpbmUgSEFTXzEyOF9CWVRFX1lfVElMSU5HKGRldikgKElTX0k5WFgoZGV2KSAmJiAhKElTX0k5MTVHKGRldikgfHwgXAogCQkJCQkJICAgICAgSVNfSTkxNUdNKGRldikpKQotI2RlZmluZSBTVVBQT1JUU19JTlRFR1JBVEVEX0hETUkoZGV2KQkoSVNfRzRYKGRldikgfHwgSVNfSUdETkcoZGV2KSkKLSNkZWZpbmUgU1VQUE9SVFNfSU5URUdSQVRFRF9EUChkZXYpCShJU19HNFgoZGV2KSB8fCBJU19JR0RORyhkZXYpKQotI2RlZmluZSBTVVBQT1JUU19FRFAoZGV2KQkJKElTX0lHRE5HX00oZGV2KSkKKyNkZWZpbmUgU1VQUE9SVFNfRElHSVRBTF9PVVRQVVRTKGRldikJKElTX0k5WFgoZGV2KSAmJiAhSVNfUElORVZJRVcoZGV2KSkKKyNkZWZpbmUgU1VQUE9SVFNfSU5URUdSQVRFRF9IRE1JKGRldikJKElTX0c0WChkZXYpIHx8IElTX0lST05MQUtFKGRldikpCisjZGVmaW5lIFNVUFBPUlRTX0lOVEVHUkFURURfRFAoZGV2KQkoSVNfRzRYKGRldikgfHwgSVNfSVJPTkxBS0UoZGV2KSkKKyNkZWZpbmUgU1VQUE9SVFNfRURQKGRldikJCShJU19JUk9OTEFLRV9NKGRldikpCisjZGVmaW5lIFNVUFBPUlRTX1RWKGRldikJCShJU19JOVhYKGRldikgJiYgSVNfTU9CSUxFKGRldikgJiYgXAorCQkJCQkhSVNfSVJPTkxBS0UoZGV2KSAmJiAhSVNfUElORVZJRVcoZGV2KSkKICNkZWZpbmUgSTkxNV9IQVNfSE9UUExVRyhkZXYpIChJU19JOTQ1RyhkZXYpIHx8IElTX0k5NDVHTShkZXYpIHx8IElTX0czMyhkZXYpIHx8IElTX0k5NjVHKGRldikpCiAvKiBkc3BhcmIgY29udHJvbGxlZCBieSBodyBvbmx5ICovCi0jZGVmaW5lIERTUEFSQl9IV0NPTlRST0woZGV2KSAoSVNfRzRYKGRldikgfHwgSVNfSUdETkcoZGV2KSkKKyNkZWZpbmUgRFNQQVJCX0hXQ09OVFJPTChkZXYpIChJU19HNFgoZGV2KSB8fCBJU19JUk9OTEFLRShkZXYpKQogCi0jZGVmaW5lIEhBU19GV19CTEMoZGV2KSAoSVNfSTlYWChkZXYpIHx8IElTX0c0WChkZXYpIHx8IElTX0lHRE5HKGRldikpCi0jZGVmaW5lIEhBU19QSVBFX0NYU1IoZGV2KSAoSVNfRzRYKGRldikgfHwgSVNfSUdETkcoZGV2KSkKKyNkZWZpbmUgSEFTX0ZXX0JMQyhkZXYpIChJU19JOVhYKGRldikgfHwgSVNfRzRYKGRldikgfHwgSVNfSVJPTkxBS0UoZGV2KSkKKyNkZWZpbmUgSEFTX1BJUEVfQ1hTUihkZXYpIChJU19HNFgoZGV2KSB8fCBJU19JUk9OTEFLRShkZXYpKQogI2RlZmluZSBJOTE1X0hBU19GQkMoZGV2KSAoSVNfTU9CSUxFKGRldikgJiYgXAogCQkJICAgKElTX0k5WFgoZGV2KSB8fCBJU19HTTQ1KGRldikpICYmIFwKLQkJCSAgICFJU19JR0QoZGV2KSAmJiBcCi0JCQkgICAhSVNfSUdETkcoZGV2KSkKKwkJCSAgICFJU19QSU5FVklFVyhkZXYpICYmIFwKKwkJCSAgICFJU19JUk9OTEFLRShkZXYpKQorI2RlZmluZSBJOTE1X0hBU19SQzYoZGV2KSAoSVNfSTk2NUdNKGRldikgfHwgSVNfR000NShkZXYpIHx8IElTX0lST05MQUtFX00oZGV2KSkKIAogI2RlZmluZSBQUklNQVJZX1JJTkdCVUZGRVJfU0laRSAgICAgICAgICgxMjgqMTAyNCkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKaW5kZXggYTJhM2ZhNS4uOGM0NjNjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCkBAIC0xMjg4LDYgKzEyODgsNyBAQAogCWxpc3QtPmhhc2gua2V5ID0gbGlzdC0+ZmlsZV9vZmZzZXRfbm9kZS0+c3RhcnQ7CiAJaWYgKGRybV9odF9pbnNlcnRfaXRlbSgmbW0tPm9mZnNldF9oYXNoLCAmbGlzdC0+aGFzaCkpIHsKIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYWRkIHRvIG1hcCBoYXNoXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXRfZnJlZV9tbTsKIAl9CiAKQEAgLTE1ODMsNyArMTU4NCw3IEBACiAgKgogICogUmV0dXJuZWQgc2VxdWVuY2UgbnVtYmVycyBhcmUgbm9uemVybyBvbiBzdWNjZXNzLgogICovCi1zdGF0aWMgdWludDMyX3QKK3VpbnQzMl90CiBpOTE1X2FkZF9yZXF1ZXN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAogCQkgdWludDMyX3QgZmx1c2hfZG9tYWlucykKIHsKQEAgLTE2MTcsNyArMTYxOCw3IEBACiAJT1VUX1JJTkcoTUlfVVNFUl9JTlRFUlJVUFQpOwogCUFEVkFOQ0VfTFBfUklORygpOwogCi0JRFJNX0RFQlVHKCIlZFxuIiwgc2Vxbm8pOworCURSTV9ERUJVR19EUklWRVIoIiVkXG4iLCBzZXFubyk7CiAKIAlyZXF1ZXN0LT5zZXFubyA9IHNlcW5vOwogCXJlcXVlc3QtPmVtaXR0ZWRfamlmZmllcyA9IGppZmZpZXM7CkBAIC0xODIwLDEyICsxODIxLDggQEAKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIH0KIAotLyoqCi0gKiBXYWl0cyBmb3IgYSBzZXF1ZW5jZSBudW1iZXIgdG8gYmUgc2lnbmFsZWQsIGFuZCBjbGVhbnMgdXAgdGhlCi0gKiByZXF1ZXN0IGFuZCBvYmplY3QgbGlzdHMgYXBwcm9wcmlhdGVseSBmb3IgdGhhdCBldmVudC4KLSAqLwotc3RhdGljIGludAotaTkxNV93YWl0X3JlcXVlc3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3Qgc2Vxbm8pCitpbnQKK2k5MTVfZG9fd2FpdF9yZXF1ZXN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHNlcW5vLCBpbnQgaW50ZXJydXB0aWJsZSkKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgaWVyOwpAQCAtMTgzNyw3ICsxODM0LDcgQEAKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAoIWk5MTVfc2Vxbm9fcGFzc2VkKGk5MTVfZ2V0X2dlbV9zZXFubyhkZXYpLCBzZXFubykpIHsKLQkJaWYgKElTX0lHRE5HKGRldikpCisJCWlmIChJU19JUk9OTEFLRShkZXYpKQogCQkJaWVyID0gSTkxNV9SRUFEKERFSUVSKSB8IEk5MTVfUkVBRChHVElFUik7CiAJCWVsc2UKIAkJCWllciA9IEk5MTVfUkVBRChJRVIpOwpAQCAtMTg1MiwxMCArMTg0OSwxNSBAQAogCiAJCWRldl9wcml2LT5tbS53YWl0aW5nX2dlbV9zZXFubyA9IHNlcW5vOwogCQlpOTE1X3VzZXJfaXJxX2dldChkZXYpOwotCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGV2X3ByaXYtPmlycV9xdWV1ZSwKLQkJCQkJICAgICAgIGk5MTVfc2Vxbm9fcGFzc2VkKGk5MTVfZ2V0X2dlbV9zZXFubyhkZXYpLAotCQkJCQkJCQkgc2Vxbm8pIHx8Ci0JCQkJCSAgICAgICBhdG9taWNfcmVhZCgmZGV2X3ByaXYtPm1tLndlZGdlZCkpOworCQlpZiAoaW50ZXJydXB0aWJsZSkKKwkJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkZXZfcHJpdi0+aXJxX3F1ZXVlLAorCQkJCWk5MTVfc2Vxbm9fcGFzc2VkKGk5MTVfZ2V0X2dlbV9zZXFubyhkZXYpLCBzZXFubykgfHwKKwkJCQlhdG9taWNfcmVhZCgmZGV2X3ByaXYtPm1tLndlZGdlZCkpOworCQllbHNlCisJCQl3YWl0X2V2ZW50KGRldl9wcml2LT5pcnFfcXVldWUsCisJCQkJaTkxNV9zZXFub19wYXNzZWQoaTkxNV9nZXRfZ2VtX3NlcW5vKGRldiksIHNlcW5vKSB8fAorCQkJCWF0b21pY19yZWFkKCZkZXZfcHJpdi0+bW0ud2VkZ2VkKSk7CisKIAkJaTkxNV91c2VyX2lycV9wdXQoZGV2KTsKIAkJZGV2X3ByaXYtPm1tLndhaXRpbmdfZ2VtX3NlcW5vID0gMDsKIApAQCAtMTg3OSw2ICsxODgxLDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiBXYWl0cyBmb3IgYSBzZXF1ZW5jZSBudW1iZXIgdG8gYmUgc2lnbmFsZWQsIGFuZCBjbGVhbnMgdXAgdGhlCisgKiByZXF1ZXN0IGFuZCBvYmplY3QgbGlzdHMgYXBwcm9wcmlhdGVseSBmb3IgdGhhdCBldmVudC4KKyAqLworc3RhdGljIGludAoraTkxNV93YWl0X3JlcXVlc3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3Qgc2Vxbm8pCit7CisJcmV0dXJuIGk5MTVfZG9fd2FpdF9yZXF1ZXN0KGRldiwgc2Vxbm8sIDEpOworfQorCiBzdGF0aWMgdm9pZAogaTkxNV9nZW1fZmx1c2goc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkgICAgICAgdWludDMyX3QgaW52YWxpZGF0ZV9kb21haW5zLApAQCAtMTk0Nyw3ICsxOTU5LDcgQEAKICNlbmRpZgogCQlCRUdJTl9MUF9SSU5HKDIpOwogCQlPVVRfUklORyhjbWQpOwotCQlPVVRfUklORygwKTsgLyogbm9vcCAqLworCQlPVVRfUklORyhNSV9OT09QKTsKIAkJQURWQU5DRV9MUF9SSU5HKCk7CiAJfQogfQpAQCAtMjc2MCw2ICsyNzcyLDIyIEBACiAJCQkJCSAgICBvbGRfd3JpdGVfZG9tYWluKTsKIH0KIAordm9pZAoraTkxNV9nZW1fb2JqZWN0X2ZsdXNoX3dyaXRlX2RvbWFpbihzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKK3sKKwlzd2l0Y2ggKG9iai0+d3JpdGVfZG9tYWluKSB7CisJY2FzZSBJOTE1X0dFTV9ET01BSU5fR1RUOgorCQlpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3R0X3dyaXRlX2RvbWFpbihvYmopOworCQlicmVhazsKKwljYXNlIEk5MTVfR0VNX0RPTUFJTl9DUFU6CisJCWk5MTVfZ2VtX29iamVjdF9mbHVzaF9jcHVfd3JpdGVfZG9tYWluKG9iaik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWk5MTVfZ2VtX29iamVjdF9mbHVzaF9ncHVfd3JpdGVfZG9tYWluKG9iaik7CisJCWJyZWFrOworCX0KK30KKwogLyoqCiAgKiBNb3ZlcyBhIHNpbmdsZSBvYmplY3QgdG8gdGhlIEdUVCByZWFkLCBhbmQgcG9zc2libHkgd3JpdGUgZG9tYWluLgogICoKQEAgLTM1MjUsNiArMzU1Myw0MSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50CitpOTE1X2dlbV93YWl0X2Zvcl9wZW5kaW5nX2ZsaXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKipvYmplY3RfbGlzdCwKKwkJCSAgICAgICBpbnQgY291bnQpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCURFRklORV9XQUlUKHdhaXQpOworCWludCBpLCByZXQgPSAwOworCisJZm9yICg7OykgeworCQlwcmVwYXJlX3RvX3dhaXQoJmRldl9wcml2LT5wZW5kaW5nX2ZsaXBfcXVldWUsCisJCQkJJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlvYmpfcHJpdiA9IG9iamVjdF9saXN0W2ldLT5kcml2ZXJfcHJpdmF0ZTsKKwkJCWlmIChhdG9taWNfcmVhZCgmb2JqX3ByaXYtPnBlbmRpbmdfZmxpcCkgPiAwKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChpID09IGNvdW50KQorCQkJYnJlYWs7CisKKwkJaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCQlzY2hlZHVsZSgpOworCQkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQkJY29udGludWU7CisJCX0KKwkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQlicmVhazsKKwl9CisJZmluaXNoX3dhaXQoJmRldl9wcml2LT5wZW5kaW5nX2ZsaXBfcXVldWUsICZ3YWl0KTsKKworCXJldHVybiByZXQ7Cit9CisKIGludAogaTkxNV9nZW1fZXhlY2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCkBAIC0zNTQwLDcgKzM2MDMsNyBAQAogCWludCByZXQsIHJldDIsIGksIHBpbm5lZCA9IDA7CiAJdWludDY0X3QgZXhlY19vZmZzZXQ7CiAJdWludDMyX3Qgc2Vxbm8sIGZsdXNoX2RvbWFpbnMsIHJlbG9jX2luZGV4OwotCWludCBwaW5fdHJpZXM7CisJaW50IHBpbl90cmllcywgZmxpcHM7CiAKICNpZiBXQVRDSF9FWEVDCiAJRFJNX0lORk8oImJ1ZmZlcnNfcHRyICVkIGJ1ZmZlcl9jb3VudCAlZCBsZW4gJTA4eFxuIiwKQEAgLTM1NTIsOCArMzYxNSw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAkvKiBDb3B5IGluIHRoZSBleGVjIGxpc3QgZnJvbSB1c2VybGFuZCAqLwotCWV4ZWNfbGlzdCA9IGRybV9jYWxsb2NfbGFyZ2Uoc2l6ZW9mKCpleGVjX2xpc3QpLCBhcmdzLT5idWZmZXJfY291bnQpOwotCW9iamVjdF9saXN0ID0gZHJtX2NhbGxvY19sYXJnZShzaXplb2YoKm9iamVjdF9saXN0KSwgYXJncy0+YnVmZmVyX2NvdW50KTsKKwlleGVjX2xpc3QgPSBkcm1fbWFsbG9jX2FiKHNpemVvZigqZXhlY19saXN0KSwgYXJncy0+YnVmZmVyX2NvdW50KTsKKwlvYmplY3RfbGlzdCA9IGRybV9tYWxsb2NfYWIoc2l6ZW9mKCpvYmplY3RfbGlzdCksIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7CiAJaWYgKGV4ZWNfbGlzdCA9PSBOVUxMIHx8IG9iamVjdF9saXN0ID09IE5VTEwpIHsKIAkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgZXhlYyBvciBvYmplY3QgbGlzdCAiCiAJCQkgICJmb3IgJWQgYnVmZmVyc1xuIiwKQEAgLTM1OTgsMjAgKzM2NjEsMTkgQEAKIAlpOTE1X3ZlcmlmeV9pbmFjdGl2ZShkZXYsIF9fRklMRV9fLCBfX0xJTkVfXyk7CiAKIAlpZiAoYXRvbWljX3JlYWQoJmRldl9wcml2LT5tbS53ZWRnZWQpKSB7Ci0JCURSTV9FUlJPUigiRXhlY2J1ZiB3aGlsZSB3ZWRnZWRcbiIpOwogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBwcmVfbXV0ZXhfZXJyOwogCX0KIAogCWlmIChkZXZfcHJpdi0+bW0uc3VzcGVuZGVkKSB7Ci0JCURSTV9FUlJPUigiRXhlY2J1ZiB3aGlsZSBWVC1zd2l0Y2hlZC5cbiIpOwogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIHByZV9tdXRleF9lcnI7CiAJfQogCiAJLyogTG9vayB1cCBvYmplY3QgaGFuZGxlcyAqLworCWZsaXBzID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgYXJncy0+YnVmZmVyX2NvdW50OyBpKyspIHsKIAkJb2JqZWN0X2xpc3RbaV0gPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsCiAJCQkJCQkgICAgICAgZXhlY19saXN0W2ldLmhhbmRsZSk7CkBAIC0zNjMwLDYgKzM2OTIsMTQgQEAKIAkJCWdvdG8gZXJyOwogCQl9CiAJCW9ial9wcml2LT5pbl9leGVjYnVmZmVyID0gdHJ1ZTsKKwkJZmxpcHMgKz0gYXRvbWljX3JlYWQoJm9ial9wcml2LT5wZW5kaW5nX2ZsaXApOworCX0KKworCWlmIChmbGlwcyA+IDApIHsKKwkJcmV0ID0gaTkxNV9nZW1fd2FpdF9mb3JfcGVuZGluZ19mbGlwKGRldiwgb2JqZWN0X2xpc3QsCisJCQkJCQkgICAgIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKIAl9CiAKIAkvKiBQaW4gYW5kIHJlbG9jYXRlICovCkBAIC00MzU2LDcgKzQ0MjYsNyBAQAogCW1lbXNldChkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UsIDAsIFBBR0VfU0laRSk7CiAJSTkxNV9XUklURShIV1NfUEdBLCBkZXZfcHJpdi0+c3RhdHVzX2dmeF9hZGRyKTsKIAlJOTE1X1JFQUQoSFdTX1BHQSk7IC8qIHBvc3RpbmcgcmVhZCAqLwotCURSTV9ERUJVRygiaHdzIG9mZnNldDogMHglMDh4XG4iLCBkZXZfcHJpdi0+c3RhdHVzX2dmeF9hZGRyKTsKKwlEUk1fREVCVUdfRFJJVkVSKCJod3Mgb2Zmc2V0OiAweCUwOHhcbiIsIGRldl9wcml2LT5zdGF0dXNfZ2Z4X2FkZHIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NjE0LDggKzQ2ODQsOCBAQAogCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKIAkJCQlJOTE1X1dSSVRFKEZFTkNFX1JFR185NDVfOCArIChpICogNCksIDApOwogCX0KLQogCWk5MTVfZ2VtX2RldGVjdF9iaXRfNl9zd2l6emxlKGRldik7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2X3ByaXYtPnBlbmRpbmdfZmxpcF9xdWV1ZSk7CiB9CiAKIC8qCkBAIC00NzkwLDcgKzQ4NjAsNyBAQAogCXVzZXJfZGF0YSA9IChjaGFyIF9fdXNlciAqKSAodWludHB0cl90KSBhcmdzLT5kYXRhX3B0cjsKIAlvYmpfYWRkciA9IG9ial9wcml2LT5waHlzX29iai0+aGFuZGxlLT52YWRkciArIGFyZ3MtPm9mZnNldDsKIAotCURSTV9ERUJVRygib2JqX2FkZHIgJXAsICVsbGRcbiIsIG9ial9hZGRyLCBhcmdzLT5zaXplKTsKKwlEUk1fREVCVUdfRFJJVkVSKCJvYmpfYWRkciAlcCwgJWxsZFxuIiwgb2JqX2FkZHIsIGFyZ3MtPnNpemUpOwogCXJldCA9IGNvcHlfZnJvbV91c2VyKG9ial9hZGRyLCB1c2VyX2RhdGEsIGFyZ3MtPnNpemUpOwogCWlmIChyZXQpCiAJCXJldHVybiAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdGlsaW5nLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV90aWxpbmcuYwppbmRleCAyMDBlMzk4Li4zMGQ2YWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV90aWxpbmcuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV90aWxpbmcuYwpAQCAtMTIxLDcgKzEyMSw3IEBACiAJCQkJICAgICAwLCAgIHBjaWJpb3NfYWxpZ25fcmVzb3VyY2UsCiAJCQkJICAgICBkZXZfcHJpdi0+YnJpZGdlX2Rldik7CiAJaWYgKHJldCkgewotCQlEUk1fREVCVUcoImZhaWxlZCBidXMgYWxsb2M6ICVkXG4iLCByZXQpOworCQlEUk1fREVCVUdfRFJJVkVSKCJmYWlsZWQgYnVzIGFsbG9jOiAlZFxuIiwgcmV0KTsKIAkJZGV2X3ByaXYtPm1jaF9yZXMuc3RhcnQgPSAwOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yMDksOCArMjA5LDggQEAKIAl1aW50MzJfdCBzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfVU5LTk9XTjsKIAlib29sIG5lZWRfZGlzYWJsZTsKIAotCWlmIChJU19JR0RORyhkZXYpKSB7Ci0JCS8qIE9uIElHRE5HIHdoYXRldmVyIERSQU0gY29uZmlnLCBHUFUgYWx3YXlzIGRvCisJaWYgKElTX0lST05MQUtFKGRldikpIHsKKwkJLyogT24gSXJvbmxha2Ugd2hhdGV2ZXIgRFJBTSBjb25maWcsIEdQVSBhbHdheXMgZG8KIAkJICogc2FtZSBzd2l6emxpbmcgc2V0dXAuCiAJCSAqLwogCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCmluZGV4IGFhN2ZkODIuLjg1ZjRjNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYwpAQCAtNDMsMTAgKzQzLDEzIEBACiAgKiB3ZSBsZWF2ZSB0aGVtIGFsd2F5cyB1bm1hc2tlZCBpbiBJTVIgYW5kIHRoZW4gY29udHJvbCBlbmFibGluZyB0aGVtIHRocm91Z2gKICAqIFBJUEVTVEFUIGFsb25lLgogICovCi0jZGVmaW5lIEk5MTVfSU5URVJSVVBUX0VOQUJMRV9GSVggKEk5MTVfQVNMRV9JTlRFUlJVUFQgfAkJIFwKLQkJCQkgICBJOTE1X0RJU1BMQVlfUElQRV9BX0VWRU5UX0lOVEVSUlVQVCB8IFwKLQkJCQkgICBJOTE1X0RJU1BMQVlfUElQRV9CX0VWRU5UX0lOVEVSUlVQVCB8IFwKLQkJCQkgICBJOTE1X1JFTkRFUl9DT01NQU5EX1BBUlNFUl9FUlJPUl9JTlRFUlJVUFQpCisjZGVmaW5lIEk5MTVfSU5URVJSVVBUX0VOQUJMRV9GSVgJCQlcCisJKEk5MTVfQVNMRV9JTlRFUlJVUFQgfAkJCQlcCisJIEk5MTVfRElTUExBWV9QSVBFX0FfRVZFTlRfSU5URVJSVVBUIHwJCVwKKwkgSTkxNV9ESVNQTEFZX1BJUEVfQl9FVkVOVF9JTlRFUlJVUFQgfAkJXAorCSBJOTE1X0RJU1BMQVlfUExBTkVfQV9GTElQX1BFTkRJTkdfSU5URVJSVVBUIHwJXAorCSBJOTE1X0RJU1BMQVlfUExBTkVfQl9GTElQX1BFTkRJTkdfSU5URVJSVVBUIHwJXAorCSBJOTE1X1JFTkRFUl9DT01NQU5EX1BBUlNFUl9FUlJPUl9JTlRFUlJVUFQpCiAKIC8qKiBJbnRlcnJ1cHRzIHRoYXQgd2UgbWFzayBhbmQgdW5tYXNrIGF0IHJ1bnRpbWUuICovCiAjZGVmaW5lIEk5MTVfSU5URVJSVVBUX0VOQUJMRV9WQVIgKEk5MTVfVVNFUl9JTlRFUlJVUFQpCkBAIC02MSw3ICs2NCw3IEBACiAJCQkJCSBEUk1fSTkxNV9WQkxBTktfUElQRV9CKQogCiB2b2lkCi1pZ2RuZ19lbmFibGVfZ3JhcGhpY3NfaXJxKGRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYsIHUzMiBtYXNrKQoraXJvbmxha2VfZW5hYmxlX2dyYXBoaWNzX2lycShkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2LCB1MzIgbWFzaykKIHsKIAlpZiAoKGRldl9wcml2LT5ndF9pcnFfbWFza19yZWcgJiBtYXNrKSAhPSAwKSB7CiAJCWRldl9wcml2LT5ndF9pcnFfbWFza19yZWcgJj0gfm1hc2s7CkBAIC03MSw3ICs3NCw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotaWdkbmdfZGlzYWJsZV9ncmFwaGljc19pcnEoZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiwgdTMyIG1hc2spCitpcm9ubGFrZV9kaXNhYmxlX2dyYXBoaWNzX2lycShkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2LCB1MzIgbWFzaykKIHsKIAlpZiAoKGRldl9wcml2LT5ndF9pcnFfbWFza19yZWcgJiBtYXNrKSAhPSBtYXNrKSB7CiAJCWRldl9wcml2LT5ndF9pcnFfbWFza19yZWcgfD0gbWFzazsKQEAgLTgyLDcgKzg1LDcgQEAKIAogLyogRm9yIGRpc3BsYXkgaG90cGx1ZyBpbnRlcnJ1cHQgKi8KIHZvaWQKLWlnZG5nX2VuYWJsZV9kaXNwbGF5X2lycShkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2LCB1MzIgbWFzaykKK2lyb25sYWtlX2VuYWJsZV9kaXNwbGF5X2lycShkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2LCB1MzIgbWFzaykKIHsKIAlpZiAoKGRldl9wcml2LT5pcnFfbWFza19yZWcgJiBtYXNrKSAhPSAwKSB7CiAJCWRldl9wcml2LT5pcnFfbWFza19yZWcgJj0gfm1hc2s7CkBAIC05Miw3ICs5NSw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotaWdkbmdfZGlzYWJsZV9kaXNwbGF5X2lycShkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2LCB1MzIgbWFzaykKK2lyb25sYWtlX2Rpc2FibGVfZGlzcGxheV9pcnEoZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiwgdTMyIG1hc2spCiB7CiAJaWYgKChkZXZfcHJpdi0+aXJxX21hc2tfcmVnICYgbWFzaykgIT0gbWFzaykgewogCQlkZXZfcHJpdi0+aXJxX21hc2tfcmVnIHw9IG1hc2s7CkBAIC0xNTcsNiArMTYwLDIwIEBACiB9CiAKIC8qKgorICogaW50ZWxfZW5hYmxlX2FzbGUgLSBlbmFibGUgQVNMRSBpbnRlcnJ1cHQgZm9yIE9wUmVnaW9uCisgKi8KK3ZvaWQgaW50ZWxfZW5hYmxlX2FzbGUgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChJU19JUk9OTEFLRShkZXYpKQorCQlpcm9ubGFrZV9lbmFibGVfZGlzcGxheV9pcnEoZGV2X3ByaXYsIERFX0dTRSk7CisJZWxzZQorCQlpOTE1X2VuYWJsZV9waXBlc3RhdChkZXZfcHJpdiwgMSwKKwkJCQkgICAgIEk5MTVfTEVHQUNZX0JMQ19FVkVOVF9FTkFCTEUpOworfQorCisvKioKICAqIGk5MTVfcGlwZV9lbmFibGVkIC0gY2hlY2sgaWYgYSBwaXBlIGlzIGVuYWJsZWQKICAqIEBkZXY6IERSTSBkZXZpY2UKICAqIEBwaXBlOiBwaXBlIHRvIGNoZWNrCkBAIC0xOTEsNyArMjA4LDggQEAKIAlsb3dfZnJhbWUgPSBwaXBlID8gUElQRUJGUkFNRVBJWEVMIDogUElQRUFGUkFNRVBJWEVMOwogCiAJaWYgKCFpOTE1X3BpcGVfZW5hYmxlZChkZXYsIHBpcGUpKSB7Ci0JCURSTV9ERUJVRygidHJ5aW5nIHRvIGdldCB2YmxhbmsgY291bnQgZm9yIGRpc2FibGVkIHBpcGUgJWRcbiIsIHBpcGUpOworCQlEUk1fREVCVUdfRFJJVkVSKCJ0cnlpbmcgdG8gZ2V0IHZibGFuayBjb3VudCBmb3IgZGlzYWJsZWQgIgorCQkJCSJwaXBlICVkXG4iLCBwaXBlKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yMjAsNyArMjM4LDggQEAKIAlpbnQgcmVnID0gcGlwZSA/IFBJUEVCX0ZSTUNPVU5UX0dNNDUgOiBQSVBFQV9GUk1DT1VOVF9HTTQ1OwogCiAJaWYgKCFpOTE1X3BpcGVfZW5hYmxlZChkZXYsIHBpcGUpKSB7Ci0JCURSTV9ERUJVRygidHJ5aW5nIHRvIGdldCB2YmxhbmsgY291bnQgZm9yIGRpc2FibGVkIHBpcGUgJWRcbiIsIHBpcGUpOworCQlEUk1fREVCVUdfRFJJVkVSKCJ0cnlpbmcgdG8gZ2V0IHZibGFuayBjb3VudCBmb3IgZGlzYWJsZWQgIgorCQkJCQkicGlwZSAlZFxuIiwgcGlwZSk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMjUwLDEyICsyNjksMTIgQEAKIAlkcm1fc3lzZnNfaG90cGx1Z19ldmVudChkZXYpOwogfQogCi1pcnFyZXR1cm5fdCBpZ2RuZ19pcnFfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoraXJxcmV0dXJuX3QgaXJvbmxha2VfaXJxX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCWludCByZXQgPSBJUlFfTk9ORTsKLQl1MzIgZGVfaWlyLCBndF9paXIsIGRlX2llcjsKLQl1MzIgbmV3X2RlX2lpciwgbmV3X2d0X2lpcjsKKwl1MzIgZGVfaWlyLCBndF9paXIsIGRlX2llciwgcGNoX2lpcjsKKwl1MzIgbmV3X2RlX2lpciwgbmV3X2d0X2lpciwgbmV3X3BjaF9paXI7CiAJc3RydWN0IGRybV9pOTE1X21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdjsKIAogCS8qIGRpc2FibGUgbWFzdGVyIGludGVycnVwdCBiZWZvcmUgY2xlYXJpbmcgaWlyICAqLwpAQCAtMjY1LDEzICsyODQsMTggQEAKIAogCWRlX2lpciA9IEk5MTVfUkVBRChERUlJUik7CiAJZ3RfaWlyID0gSTkxNV9SRUFEKEdUSUlSKTsKKwlwY2hfaWlyID0gSTkxNV9SRUFEKFNERUlJUik7CiAKIAlmb3IgKDs7KSB7Ci0JCWlmIChkZV9paXIgPT0gMCAmJiBndF9paXIgPT0gMCkKKwkJaWYgKGRlX2lpciA9PSAwICYmIGd0X2lpciA9PSAwICYmIHBjaF9paXIgPT0gMCkKIAkJCWJyZWFrOwogCiAJCXJldCA9IElSUV9IQU5ETEVEOwogCisJCS8qIHNob3VsZCBjbGVhciBQQ0ggaG90cGx1ZyBldmVudCBiZWZvcmUgY2xlYXIgQ1BVIGlycSAqLworCQlJOTE1X1dSSVRFKFNERUlJUiwgcGNoX2lpcik7CisJCW5ld19wY2hfaWlyID0gSTkxNV9SRUFEKFNERUlJUik7CisKIAkJSTkxNV9XUklURShERUlJUiwgZGVfaWlyKTsKIAkJbmV3X2RlX2lpciA9IEk5MTVfUkVBRChERUlJUik7CiAJCUk5MTVfV1JJVEUoR1RJSVIsIGd0X2lpcik7CkBAIC0yOTEsOCArMzE1LDE4IEBACiAJCQlEUk1fV0FLRVVQKCZkZXZfcHJpdi0+aXJxX3F1ZXVlKTsKIAkJfQogCisJCWlmIChkZV9paXIgJiBERV9HU0UpCisJCQlpcm9ubGFrZV9vcHJlZ2lvbl9nc2VfaW50cihkZXYpOworCisJCS8qIGNoZWNrIGV2ZW50IGZyb20gUENIICovCisJCWlmICgoZGVfaWlyICYgREVfUENIX0VWRU5UKSAmJgorCQkJKHBjaF9paXIgJiBTREVfSE9UUExVR19NQVNLKSkgeworCQkJcXVldWVfd29yayhkZXZfcHJpdi0+d3EsICZkZXZfcHJpdi0+aG90cGx1Z193b3JrKTsKKwkJfQorCiAJCWRlX2lpciA9IG5ld19kZV9paXI7CiAJCWd0X2lpciA9IG5ld19ndF9paXI7CisJCXBjaF9paXIgPSBuZXdfcGNoX2lpcjsKIAl9CiAKIAlJOTE1X1dSSVRFKERFSUVSLCBkZV9pZXIpOwpAQCAtMzE3LDE5ICszNTEsMTkgQEAKIAljaGFyICpyZXNldF9ldmVudFtdID0geyAiUkVTRVQ9MSIsIE5VTEwgfTsKIAljaGFyICpyZXNldF9kb25lX2V2ZW50W10gPSB7ICJFUlJPUj0wIiwgTlVMTCB9OwogCi0JRFJNX0RFQlVHKCJnZW5lcmF0aW5nIGVycm9yIGV2ZW50XG4iKTsKKwlEUk1fREVCVUdfRFJJVkVSKCJnZW5lcmF0aW5nIGVycm9yIGV2ZW50XG4iKTsKIAlrb2JqZWN0X3VldmVudF9lbnYoJmRldi0+cHJpbWFyeS0+a2Rldi5rb2JqLCBLT0JKX0NIQU5HRSwgZXJyb3JfZXZlbnQpOwogCiAJaWYgKGF0b21pY19yZWFkKCZkZXZfcHJpdi0+bW0ud2VkZ2VkKSkgewogCQlpZiAoSVNfSTk2NUcoZGV2KSkgewotCQkJRFJNX0RFQlVHKCJyZXNldHRpbmcgY2hpcFxuIik7CisJCQlEUk1fREVCVUdfRFJJVkVSKCJyZXNldHRpbmcgY2hpcFxuIik7CiAJCQlrb2JqZWN0X3VldmVudF9lbnYoJmRldi0+cHJpbWFyeS0+a2Rldi5rb2JqLCBLT0JKX0NIQU5HRSwgcmVzZXRfZXZlbnQpOwogCQkJaWYgKCFpOTY1X3Jlc2V0KGRldiwgR0RSU1RfUkVOREVSKSkgewogCQkJCWF0b21pY19zZXQoJmRldl9wcml2LT5tbS53ZWRnZWQsIDApOwogCQkJCWtvYmplY3RfdWV2ZW50X2VudigmZGV2LT5wcmltYXJ5LT5rZGV2LmtvYmosIEtPQkpfQ0hBTkdFLCByZXNldF9kb25lX2V2ZW50KTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCXByaW50aygicmVib290IHJlcXVpcmVkXG4iKTsKKwkJCURSTV9ERUJVR19EUklWRVIoInJlYm9vdCByZXF1aXJlZFxuIik7CiAJCX0KIAl9CiB9CkBAIC0zNTUsNyArMzg5LDcgQEAKIAogCWVycm9yID0ga21hbGxvYyhzaXplb2YoKmVycm9yKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFlcnJvcikgewotCQlEUk1fREVCVUcoIm91dCBvdCBtZW1vcnksIG5vdCBjYXB0dXJpbmcgZXJyb3Igc3RhdGVcbiIpOworCQlEUk1fREVCVUdfRFJJVkVSKCJvdXQgb3QgbWVtb3J5LCBub3QgY2FwdHVyaW5nIGVycm9yIHN0YXRlXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC01MTIsNyArNTQ2LDYgQEAKIAkJLyoKIAkJICogV2FrZXVwIHdhaXRpbmcgcHJvY2Vzc2VzIHNvIHRoZXkgZG9uJ3QgaGFuZwogCQkgKi8KLQkJcHJpbnRrKCJpOTE1OiBXYWtpbmcgdXAgc2xlZXBpbmcgcHJvY2Vzc2VzXG4iKTsKIAkJRFJNX1dBS0VVUCgmZGV2X3ByaXYtPmlycV9xdWV1ZSk7CiAJfQogCkBAIC01MzUsOCArNTY4LDggQEAKIAogCWF0b21pY19pbmMoJmRldl9wcml2LT5pcnFfcmVjZWl2ZWQpOwogCi0JaWYgKElTX0lHRE5HKGRldikpCi0JCXJldHVybiBpZ2RuZ19pcnFfaGFuZGxlcihkZXYpOworCWlmIChJU19JUk9OTEFLRShkZXYpKQorCQlyZXR1cm4gaXJvbmxha2VfaXJxX2hhbmRsZXIoZGV2KTsKIAogCWlpciA9IEk5MTVfUkVBRChJSVIpOwogCkBAIC01NjgsMTQgKzYwMSwxNCBAQAogCQkgKi8KIAkJaWYgKHBpcGVhX3N0YXRzICYgMHg4MDAwZmZmZikgewogCQkJaWYgKHBpcGVhX3N0YXRzICYgIFBJUEVfRklGT19VTkRFUlJVTl9TVEFUVVMpCi0JCQkJRFJNX0RFQlVHKCJwaXBlIGEgdW5kZXJydW5cbiIpOworCQkJCURSTV9ERUJVR19EUklWRVIoInBpcGUgYSB1bmRlcnJ1blxuIik7CiAJCQlJOTE1X1dSSVRFKFBJUEVBU1RBVCwgcGlwZWFfc3RhdHMpOwogCQkJaXJxX3JlY2VpdmVkID0gMTsKIAkJfQogCiAJCWlmIChwaXBlYl9zdGF0cyAmIDB4ODAwMGZmZmYpIHsKIAkJCWlmIChwaXBlYl9zdGF0cyAmICBQSVBFX0ZJRk9fVU5ERVJSVU5fU1RBVFVTKQotCQkJCURSTV9ERUJVRygicGlwZSBiIHVuZGVycnVuXG4iKTsKKwkJCQlEUk1fREVCVUdfRFJJVkVSKCJwaXBlIGIgdW5kZXJydW5cbiIpOwogCQkJSTkxNV9XUklURShQSVBFQlNUQVQsIHBpcGViX3N0YXRzKTsKIAkJCWlycV9yZWNlaXZlZCA9IDE7CiAJCX0KQEAgLTU5MSw3ICs2MjQsNyBAQAogCQkgICAgKGlpciAmIEk5MTVfRElTUExBWV9QT1JUX0lOVEVSUlVQVCkpIHsKIAkJCXUzMiBob3RwbHVnX3N0YXR1cyA9IEk5MTVfUkVBRChQT1JUX0hPVFBMVUdfU1RBVCk7CiAKLQkJCURSTV9ERUJVRygiaG90cGx1ZyBldmVudCByZWNlaXZlZCwgc3RhdCAweCUwOHhcbiIsCisJCQlEUk1fREVCVUdfRFJJVkVSKCJob3RwbHVnIGV2ZW50IHJlY2VpdmVkLCBzdGF0IDB4JTA4eFxuIiwKIAkJCQkgIGhvdHBsdWdfc3RhdHVzKTsKIAkJCWlmIChob3RwbHVnX3N0YXR1cyAmIGRldl9wcml2LT5ob3RwbHVnX3N1cHBvcnRlZF9tYXNrKQogCQkJCXF1ZXVlX3dvcmsoZGV2X3ByaXYtPndxLApAQCAtNTk5LDI3ICs2MzIsNiBAQAogCiAJCQlJOTE1X1dSSVRFKFBPUlRfSE9UUExVR19TVEFULCBob3RwbHVnX3N0YXR1cyk7CiAJCQlJOTE1X1JFQUQoUE9SVF9IT1RQTFVHX1NUQVQpOwotCi0JCQkvKiBFT1MgaW50ZXJydXB0cyBvY2N1cnMgKi8KLQkJCWlmIChJU19JR0QoZGV2KSAmJgotCQkJCShob3RwbHVnX3N0YXR1cyAmIENSVF9FT1NfSU5UX1NUQVRVUykpIHsKLQkJCQl1MzIgdGVtcDsKLQotCQkJCURSTV9ERUJVRygiRU9TIGludGVycnVwdCBvY2N1cnNcbiIpOwotCQkJCS8qIHN0YXR1cyBpcyBhbHJlYWR5IGNsZWFyZWQgKi8KLQkJCQl0ZW1wID0gSTkxNV9SRUFEKEFEUEEpOwotCQkJCXRlbXAgJj0gfkFEUEFfREFDX0VOQUJMRTsKLQkJCQlJOTE1X1dSSVRFKEFEUEEsIHRlbXApOwotCi0JCQkJdGVtcCA9IEk5MTVfUkVBRChQT1JUX0hPVFBMVUdfRU4pOwotCQkJCXRlbXAgJj0gfkNSVF9FT1NfSU5UX0VOOwotCQkJCUk5MTVfV1JJVEUoUE9SVF9IT1RQTFVHX0VOLCB0ZW1wKTsKLQotCQkJCXRlbXAgPSBJOTE1X1JFQUQoUE9SVF9IT1RQTFVHX1NUQVQpOwotCQkJCWlmICh0ZW1wICYgQ1JUX0VPU19JTlRfU1RBVFVTKQotCQkJCQlJOTE1X1dSSVRFKFBPUlRfSE9UUExVR19TVEFULAotCQkJCQkJQ1JUX0VPU19JTlRfU1RBVFVTKTsKLQkJCX0KIAkJfQogCiAJCUk5MTVfV1JJVEUoSUlSLCBpaXIpOwpAQCAtNjQxLDE0ICs2NTMsMjIgQEAKIAkJCW1vZF90aW1lcigmZGV2X3ByaXYtPmhhbmdjaGVja190aW1lciwgamlmZmllcyArIERSTV9JOTE1X0hBTkdDSEVDS19QRVJJT0QpOwogCQl9CiAKKwkJaWYgKGlpciAmIEk5MTVfRElTUExBWV9QTEFORV9BX0ZMSVBfUEVORElOR19JTlRFUlJVUFQpCisJCQlpbnRlbF9wcmVwYXJlX3BhZ2VfZmxpcChkZXYsIDApOworCisJCWlmIChpaXIgJiBJOTE1X0RJU1BMQVlfUExBTkVfQl9GTElQX1BFTkRJTkdfSU5URVJSVVBUKQorCQkJaW50ZWxfcHJlcGFyZV9wYWdlX2ZsaXAoZGV2LCAxKTsKKwogCQlpZiAocGlwZWFfc3RhdHMgJiB2Ymxhbmtfc3RhdHVzKSB7CiAJCQl2YmxhbmsrKzsKIAkJCWRybV9oYW5kbGVfdmJsYW5rKGRldiwgMCk7CisJCQlpbnRlbF9maW5pc2hfcGFnZV9mbGlwKGRldiwgMCk7CiAJCX0KIAogCQlpZiAocGlwZWJfc3RhdHMgJiB2Ymxhbmtfc3RhdHVzKSB7CiAJCQl2YmxhbmsrKzsKIAkJCWRybV9oYW5kbGVfdmJsYW5rKGRldiwgMSk7CisJCQlpbnRlbF9maW5pc2hfcGFnZV9mbGlwKGRldiwgMSk7CiAJCX0KIAogCQlpZiAoKHBpcGViX3N0YXRzICYgSTkxNV9MRUdBQ1lfQkxDX0VWRU5UX1NUQVRVUykgfHwKQEAgLTY4NCw3ICs3MDQsNyBAQAogCiAJaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CiAKLQlEUk1fREVCVUcoIlxuIik7CisJRFJNX0RFQlVHX0RSSVZFUigiXG4iKTsKIAogCWRldl9wcml2LT5jb3VudGVyKys7CiAJaWYgKGRldl9wcml2LT5jb3VudGVyID4gMHg3RkZGRkZGRlVMKQpAQCAtNzA5LDggKzcyOSw4IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPnVzZXJfaXJxX2xvY2ssIGlycWZsYWdzKTsKIAlpZiAoZGV2LT5pcnFfZW5hYmxlZCAmJiAoKytkZXZfcHJpdi0+dXNlcl9pcnFfcmVmY291bnQgPT0gMSkpIHsKLQkJaWYgKElTX0lHRE5HKGRldikpCi0JCQlpZ2RuZ19lbmFibGVfZ3JhcGhpY3NfaXJxKGRldl9wcml2LCBHVF9VU0VSX0lOVEVSUlVQVCk7CisJCWlmIChJU19JUk9OTEFLRShkZXYpKQorCQkJaXJvbmxha2VfZW5hYmxlX2dyYXBoaWNzX2lycShkZXZfcHJpdiwgR1RfVVNFUl9JTlRFUlJVUFQpOwogCQllbHNlCiAJCQlpOTE1X2VuYWJsZV9pcnEoZGV2X3ByaXYsIEk5MTVfVVNFUl9JTlRFUlJVUFQpOwogCX0KQEAgLTcyNSw4ICs3NDUsOCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+dXNlcl9pcnFfbG9jaywgaXJxZmxhZ3MpOwogCUJVR19PTihkZXYtPmlycV9lbmFibGVkICYmIGRldl9wcml2LT51c2VyX2lycV9yZWZjb3VudCA8PSAwKTsKIAlpZiAoZGV2LT5pcnFfZW5hYmxlZCAmJiAoLS1kZXZfcHJpdi0+dXNlcl9pcnFfcmVmY291bnQgPT0gMCkpIHsKLQkJaWYgKElTX0lHRE5HKGRldikpCi0JCQlpZ2RuZ19kaXNhYmxlX2dyYXBoaWNzX2lycShkZXZfcHJpdiwgR1RfVVNFUl9JTlRFUlJVUFQpOworCQlpZiAoSVNfSVJPTkxBS0UoZGV2KSkKKwkJCWlyb25sYWtlX2Rpc2FibGVfZ3JhcGhpY3NfaXJxKGRldl9wcml2LCBHVF9VU0VSX0lOVEVSUlVQVCk7CiAJCWVsc2UKIAkJCWk5MTVfZGlzYWJsZV9pcnEoZGV2X3ByaXYsIEk5MTVfVVNFUl9JTlRFUlJVUFQpOwogCX0KQEAgLTc0OSw3ICs3NjksNyBAQAogCXN0cnVjdCBkcm1faTkxNV9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXYgPSBkZXYtPnByaW1hcnktPm1hc3Rlci0+ZHJpdmVyX3ByaXY7CiAJaW50IHJldCA9IDA7CiAKLQlEUk1fREVCVUcoImlycV9ucj0lZCBicmVhZGNydW1iPSVkXG4iLCBpcnFfbnIsCisJRFJNX0RFQlVHX0RSSVZFUigiaXJxX25yPSVkIGJyZWFkY3J1bWI9JWRcbiIsIGlycV9uciwKIAkJICBSRUFEX0JSRUFEQ1JVTUIoZGV2X3ByaXYpKTsKIAogCWlmIChSRUFEX0JSRUFEQ1JVTUIoZGV2X3ByaXYpID49IGlycV9ucikgewpAQCAtODMyLDcgKzg1Miw3IEBACiAJaWYgKCEocGlwZWNvbmYgJiBQSVBFQUNPTkZfRU5BQkxFKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoSVNfSUdETkcoZGV2KSkKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkKIAkJcmV0dXJuIDA7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPnVzZXJfaXJxX2xvY2ssIGlycWZsYWdzKTsKQEAgLTg1NCw3ICs4NzQsNyBAQAogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKIAotCWlmIChJU19JR0RORyhkZXYpKQorCWlmIChJU19JUk9OTEFLRShkZXYpKQogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPnVzZXJfaXJxX2xvY2ssIGlycWZsYWdzKTsKQEAgLTg2OCw3ICs4ODgsNyBAQAogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLQlpZiAoIUlTX0lHRE5HKGRldikpCisJaWYgKCFJU19JUk9OTEFLRShkZXYpKQogCQlvcHJlZ2lvbl9lbmFibGVfYXNsZShkZXYpOwogCWRldl9wcml2LT5pcnFfZW5hYmxlZCA9IDE7CiB9CkBAIC05NzYsNyArOTk2LDcgQEAKIAogLyogZHJtX2RtYS5oIGhvb2tzCiAqLwotc3RhdGljIHZvaWQgaWdkbmdfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGlyb25sYWtlX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtOTkyLDE0ICsxMDEyLDIxIEBACiAJSTkxNV9XUklURShHVElNUiwgMHhmZmZmZmZmZik7CiAJSTkxNV9XUklURShHVElFUiwgMHgwKTsKIAkodm9pZCkgSTkxNV9SRUFEKEdUSUVSKTsKKworCS8qIHNvdXRoIGRpc3BsYXkgaXJxICovCisJSTkxNV9XUklURShTREVJTVIsIDB4ZmZmZmZmZmYpOworCUk5MTVfV1JJVEUoU0RFSUVSLCAweDApOworCSh2b2lkKSBJOTE1X1JFQUQoU0RFSUVSKTsKIH0KIAotc3RhdGljIGludCBpZ2RuZ19pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgaXJvbmxha2VfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAkvKiBlbmFibGUga2luZCBvZiBpbnRlcnJ1cHRzIGFsd2F5cyBlbmFibGVkICovCi0JdTMyIGRpc3BsYXlfbWFzayA9IERFX01BU1RFUl9JUlFfQ09OVFJPTCAvKnwgREVfUENIX0VWRU5UICovOworCXUzMiBkaXNwbGF5X21hc2sgPSBERV9NQVNURVJfSVJRX0NPTlRST0wgfCBERV9HU0UgfCBERV9QQ0hfRVZFTlQ7CiAJdTMyIHJlbmRlcl9tYXNrID0gR1RfVVNFUl9JTlRFUlJVUFQ7CisJdTMyIGhvdHBsdWdfbWFzayA9IFNERV9DUlRfSE9UUExVRyB8IFNERV9QT1JUQl9IT1RQTFVHIHwKKwkJCSAgIFNERV9QT1JUQ19IT1RQTFVHIHwgU0RFX1BPUlREX0hPVFBMVUc7CiAKIAlkZXZfcHJpdi0+aXJxX21hc2tfcmVnID0gfmRpc3BsYXlfbWFzazsKIAlkZXZfcHJpdi0+ZGVfaXJxX2VuYWJsZV9yZWcgPSBkaXNwbGF5X21hc2s7CkBAIC0xMDE5LDYgKzEwNDYsMTQgQEAKIAlJOTE1X1dSSVRFKEdUSUVSLCBkZXZfcHJpdi0+Z3RfaXJxX2VuYWJsZV9yZWcpOwogCSh2b2lkKSBJOTE1X1JFQUQoR1RJRVIpOwogCisJZGV2X3ByaXYtPnBjaF9pcnFfbWFza19yZWcgPSB+aG90cGx1Z19tYXNrOworCWRldl9wcml2LT5wY2hfaXJxX2VuYWJsZV9yZWcgPSBob3RwbHVnX21hc2s7CisKKwlJOTE1X1dSSVRFKFNERUlJUiwgSTkxNV9SRUFEKFNERUlJUikpOworCUk5MTVfV1JJVEUoU0RFSU1SLCBkZXZfcHJpdi0+cGNoX2lycV9tYXNrX3JlZyk7CisJSTkxNV9XUklURShTREVJRVIsIGRldl9wcml2LT5wY2hfaXJxX2VuYWJsZV9yZWcpOworCSh2b2lkKSBJOTE1X1JFQUQoU0RFSUVSKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMDMxLDggKzEwNjYsOCBAQAogCUlOSVRfV09SSygmZGV2X3ByaXYtPmhvdHBsdWdfd29yaywgaTkxNV9ob3RwbHVnX3dvcmtfZnVuYyk7CiAJSU5JVF9XT1JLKCZkZXZfcHJpdi0+ZXJyb3Jfd29yaywgaTkxNV9lcnJvcl93b3JrX2Z1bmMpOwogCi0JaWYgKElTX0lHRE5HKGRldikpIHsKLQkJaWdkbmdfaXJxX3ByZWluc3RhbGwoZGV2KTsKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkgeworCQlpcm9ubGFrZV9pcnFfcHJlaW5zdGFsbChkZXYpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMDU5LDggKzEwOTQsOCBAQAogCiAJZGV2X3ByaXYtPnZibGFua19waXBlID0gRFJNX0k5MTVfVkJMQU5LX1BJUEVfQSB8IERSTV9JOTE1X1ZCTEFOS19QSVBFX0I7CiAKLQlpZiAoSVNfSUdETkcoZGV2KSkKLQkJcmV0dXJuIGlnZG5nX2lycV9wb3N0aW5zdGFsbChkZXYpOworCWlmIChJU19JUk9OTEFLRShkZXYpKQorCQlyZXR1cm4gaXJvbmxha2VfaXJxX3Bvc3RpbnN0YWxsKGRldik7CiAKIAkvKiBVbm1hc2sgdGhlIGludGVycnVwdHMgdGhhdCB3ZSBhbHdheXMgd2FudCBvbi4gKi8KIAlkZXZfcHJpdi0+aXJxX21hc2tfcmVnID0gfkk5MTVfSU5URVJSVVBUX0VOQUJMRV9GSVg7CkBAIC0xMTIwLDcgKzExNTUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpZ2RuZ19pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBpcm9ubGFrZV9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAlJOTE1X1dSSVRFKEhXU1RBTSwgMHhmZmZmZmZmZik7CkBAIC0xMTQzLDggKzExNzgsOCBAQAogCiAJZGV2X3ByaXYtPnZibGFua19waXBlID0gMDsKIAotCWlmIChJU19JR0RORyhkZXYpKSB7Ci0JCWlnZG5nX2lycV91bmluc3RhbGwoZGV2KTsKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkgeworCQlpcm9ubGFrZV9pcnFfdW5pbnN0YWxsKGRldik7CiAJCXJldHVybjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfb3ByZWdpb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfb3ByZWdpb24uYwppbmRleCAyZDUxOTM1Li43Y2M4NDEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X29wcmVnaW9uLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9vcHJlZ2lvbi5jCkBAIC0xMTgsNiArMTE4LDEwIEBACiAjZGVmaW5lIEFTTEVfQkFDS0xJR0hUX0ZBSUwgICAgKDI8PDEyKQogI2RlZmluZSBBU0xFX1BGSVRfRkFJTCAgICAgICAgICgyPDwxNCkKICNkZWZpbmUgQVNMRV9QV01fRlJFUV9GQUlMICAgICAoMjw8MTYpCisjZGVmaW5lIEFTTEVfQUxTX0lMTFVNX0ZBSUxFRAkoMTw8MTApCisjZGVmaW5lIEFTTEVfQkFDS0xJR0hUX0ZBSUxFRAkoMTw8MTIpCisjZGVmaW5lIEFTTEVfUEZJVF9GQUlMRUQJKDE8PDE0KQorI2RlZmluZSBBU0xFX1BXTV9GUkVRX0ZBSUxFRAkoMTw8MTYpCiAKIC8qIEFTTEUgYmFja2xpZ2h0IGJyaWdodG5lc3MgdG8gc2V0ICovCiAjZGVmaW5lIEFTTEVfQkNMUF9WQUxJRCAgICAgICAgICAgICAgICAoMTw8MzEpCkBAIC0xNjMsNyArMTY3LDcgQEAKIAlpZiAoSVNfSTk2NUcoZGV2KSAmJiAoYmxjX3B3bV9jdGwyICYgQkxNX0NPTUJJTkFUSU9OX01PREUpKQogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldi0+cGRldiwgUENJX0xCUEMsIGJjbHApOwogCWVsc2UgewotCQlpZiAoSVNfSUdEKGRldikpIHsKKwkJaWYgKElTX1BJTkVWSUVXKGRldikpIHsKIAkJCWJsY19wd21fY3RsICY9IH4oQkFDS0xJR0hUX0RVVFlfQ1lDTEVfTUFTSyAtIDEpOwogCQkJbWF4X2JhY2tsaWdodCA9IChibGNfcHdtX2N0bCAmIEJBQ0tMSUdIVF9NT0RVTEFUSU9OX0ZSRVFfTUFTSykgPj4gCiAJCQkJCUJBQ0tMSUdIVF9NT0RVTEFUSU9OX0ZSRVFfU0hJRlQ7CkBAIC0yMjQsNyArMjI4LDcgQEAKIAlhc2xlX3JlcSA9IGFzbGUtPmFzbGMgJiBBU0xFX1JFUV9NU0s7CiAKIAlpZiAoIWFzbGVfcmVxKSB7Ci0JCURSTV9ERUJVRygibm9uIGFzbGUgc2V0IHJlcXVlc3Q/P1xuIik7CisJCURSTV9ERUJVR19EUklWRVIoIm5vbiBhc2xlIHNldCByZXF1ZXN0Pz9cbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yNDMsNiArMjQ3LDczIEBACiAJYXNsZS0+YXNsYyA9IGFzbGVfc3RhdDsKIH0KIAorc3RhdGljIHUzMiBhc2xlX3NldF9iYWNrbGlnaHRfaXJvbmxha2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIGJjbHApCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgb3ByZWdpb25fYXNsZSAqYXNsZSA9IGRldl9wcml2LT5vcHJlZ2lvbi5hc2xlOworCXUzMiBjcHVfcHdtX2N0bCwgcGNoX3B3bV9jdGwyOworCXUzMiBtYXhfYmFja2xpZ2h0LCBsZXZlbDsKKworCWlmICghKGJjbHAgJiBBU0xFX0JDTFBfVkFMSUQpKQorCQlyZXR1cm4gQVNMRV9CQUNLTElHSFRfRkFJTEVEOworCisJYmNscCAmPSBBU0xFX0JDTFBfTVNLOworCWlmIChiY2xwIDwgMCB8fCBiY2xwID4gMjU1KQorCQlyZXR1cm4gQVNMRV9CQUNLTElHSFRfRkFJTEVEOworCisJY3B1X3B3bV9jdGwgPSBJOTE1X1JFQUQoQkxDX1BXTV9DUFVfQ1RMKTsKKwlwY2hfcHdtX2N0bDIgPSBJOTE1X1JFQUQoQkxDX1BXTV9QQ0hfQ1RMMik7CisJLyogZ2V0IHRoZSBtYXggUFdNIGZyZXF1ZW5jeSAqLworCW1heF9iYWNrbGlnaHQgPSAocGNoX3B3bV9jdGwyID4+IDE2KSAmIEJBQ0tMSUdIVF9EVVRZX0NZQ0xFX01BU0s7CisJLyogY2FsY3VsYXRlIHRoZSBleHBlY3RlZCBQTVcgZnJlcXVlbmN5ICovCisJbGV2ZWwgPSAoYmNscCAqIG1heF9iYWNrbGlnaHQpIC8gMjU1OworCS8qIHJlc2VydmUgdGhlIGhpZ2ggMTYgYml0cyAqLworCWNwdV9wd21fY3RsICY9IH4oQkFDS0xJR0hUX0RVVFlfQ1lDTEVfTUFTSyk7CisJLyogd3JpdGUgdGhlIHVwZGF0ZWQgUFdNIGZyZXF1ZW5jeSAqLworCUk5MTVfV1JJVEUoQkxDX1BXTV9DUFVfQ1RMLCBjcHVfcHdtX2N0bCB8IGxldmVsKTsKKworCWFzbGUtPmNibHYgPSAoYmNscCoweDY0KS8weGZmIHwgQVNMRV9DQkxWX1ZBTElEOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaXJvbmxha2Vfb3ByZWdpb25fZ3NlX2ludHIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBvcHJlZ2lvbl9hc2xlICphc2xlID0gZGV2X3ByaXYtPm9wcmVnaW9uLmFzbGU7CisJdTMyIGFzbGVfc3RhdCA9IDA7CisJdTMyIGFzbGVfcmVxOworCisJaWYgKCFhc2xlKQorCQlyZXR1cm47CisKKwlhc2xlX3JlcSA9IGFzbGUtPmFzbGMgJiBBU0xFX1JFUV9NU0s7CisKKwlpZiAoIWFzbGVfcmVxKSB7CisJCURSTV9ERUJVR19EUklWRVIoIm5vbiBhc2xlIHNldCByZXF1ZXN0Pz9cbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGFzbGVfcmVxICYgQVNMRV9TRVRfQUxTX0lMTFVNKSB7CisJCURSTV9ERUJVR19EUklWRVIoIklsbHVtIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlhc2xlX3N0YXQgfD0gQVNMRV9BTFNfSUxMVU1fRkFJTEVEOworCX0KKworCWlmIChhc2xlX3JlcSAmIEFTTEVfU0VUX0JBQ0tMSUdIVCkKKwkJYXNsZV9zdGF0IHw9IGFzbGVfc2V0X2JhY2tsaWdodF9pcm9ubGFrZShkZXYsIGFzbGUtPmJjbHApOworCisJaWYgKGFzbGVfcmVxICYgQVNMRV9TRVRfUEZJVCkgeworCQlEUk1fREVCVUdfRFJJVkVSKCJQZml0IGlzIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlhc2xlX3N0YXQgfD0gQVNMRV9QRklUX0ZBSUxFRDsKKwl9CisKKwlpZiAoYXNsZV9yZXEgJiBBU0xFX1NFVF9QV01fRlJFUSkgeworCQlEUk1fREVCVUdfRFJJVkVSKCJQV00gZnJlcSBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJYXNsZV9zdGF0IHw9IEFTTEVfUFdNX0ZSRVFfRkFJTEVEOworCX0KKworCWFzbGUtPmFzbGMgPSBhc2xlX3N0YXQ7Cit9CiAjZGVmaW5lIEFTTEVfQUxTX0VOICAgICgxPDwwKQogI2RlZmluZSBBU0xFX0JMQ19FTiAgICAoMTw8MSkKICNkZWZpbmUgQVNMRV9QRklUX0VOICAgKDE8PDIpCkBAIC0yNTgsOCArMzI5LDcgQEAKIAkJCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CiAKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+dXNlcl9pcnFfbG9jaywgaXJxZmxhZ3MpOwotCQkJaTkxNV9lbmFibGVfcGlwZXN0YXQoZGV2X3ByaXYsIDEsCi0JCQkJCSAgICAgSTkxNV9MRUdBQ1lfQkxDX0VWRU5UX0VOQUJMRSk7CisJCQlpbnRlbF9lbmFibGVfYXNsZShkZXYpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPnVzZXJfaXJxX2xvY2ssCiAJCQkJCSAgICAgICBpcnFmbGFncyk7CiAJCX0KQEAgLTM2MSw5ICs0MzEsOSBAQAogCWludCBlcnIgPSAwOwogCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldi0+cGRldiwgUENJX0FTTFMsICZhc2xzKTsKLQlEUk1fREVCVUcoImdyYXBoaWMgb3ByZWdpb24gcGh5c2ljYWwgYWRkcjogMHgleFxuIiwgYXNscyk7CisJRFJNX0RFQlVHX0RSSVZFUigiZ3JhcGhpYyBvcHJlZ2lvbiBwaHlzaWNhbCBhZGRyOiAweCV4XG4iLCBhc2xzKTsKIAlpZiAoYXNscyA9PSAwKSB7Ci0JCURSTV9ERUJVRygiQUNQSSBPcFJlZ2lvbiBub3Qgc3VwcG9ydGVkIVxuIik7CisJCURSTV9ERUJVR19EUklWRVIoIkFDUEkgT3BSZWdpb24gbm90IHN1cHBvcnRlZCFcbiIpOwogCQlyZXR1cm4gLUVOT1RTVVBQOwogCX0KIApAQCAtMzczLDMwICs0NDMsMzAgQEAKIAogCW9wcmVnaW9uLT5oZWFkZXIgPSBiYXNlOwogCWlmIChtZW1jbXAob3ByZWdpb24tPmhlYWRlci0+c2lnbmF0dXJlLCBPUFJFR0lPTl9TSUdOQVRVUkUsIDE2KSkgewotCQlEUk1fREVCVUcoIm9wcmVnaW9uIHNpZ25hdHVyZSBtaXNtYXRjaFxuIik7CisJCURSTV9ERUJVR19EUklWRVIoIm9wcmVnaW9uIHNpZ25hdHVyZSBtaXNtYXRjaFxuIik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX291dDsKIAl9CiAKIAltYm94ZXMgPSBvcHJlZ2lvbi0+aGVhZGVyLT5tYm94ZXM7CiAJaWYgKG1ib3hlcyAmIE1CT1hfQUNQSSkgewotCQlEUk1fREVCVUcoIlB1YmxpYyBBQ1BJIG1ldGhvZHMgc3VwcG9ydGVkXG4iKTsKKwkJRFJNX0RFQlVHX0RSSVZFUigiUHVibGljIEFDUEkgbWV0aG9kcyBzdXBwb3J0ZWRcbiIpOwogCQlvcHJlZ2lvbi0+YWNwaSA9IGJhc2UgKyBPUFJFR0lPTl9BQ1BJX09GRlNFVDsKIAkJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCiAJCQlpbnRlbF9kaWRsX291dHB1dHMoZGV2KTsKIAl9IGVsc2UgewotCQlEUk1fREVCVUcoIlB1YmxpYyBBQ1BJIG1ldGhvZHMgbm90IHN1cHBvcnRlZFxuIik7CisJCURSTV9ERUJVR19EUklWRVIoIlB1YmxpYyBBQ1BJIG1ldGhvZHMgbm90IHN1cHBvcnRlZFxuIik7CiAJCWVyciA9IC1FTk9UU1VQUDsKIAkJZ290byBlcnJfb3V0OwogCX0KIAlvcHJlZ2lvbi0+ZW5hYmxlZCA9IDE7CiAKIAlpZiAobWJveGVzICYgTUJPWF9TV1NDSSkgewotCQlEUk1fREVCVUcoIlNXU0NJIHN1cHBvcnRlZFxuIik7CisJCURSTV9ERUJVR19EUklWRVIoIlNXU0NJIHN1cHBvcnRlZFxuIik7CiAJCW9wcmVnaW9uLT5zd3NjaSA9IGJhc2UgKyBPUFJFR0lPTl9TV1NDSV9PRkZTRVQ7CiAJfQogCWlmIChtYm94ZXMgJiBNQk9YX0FTTEUpIHsKLQkJRFJNX0RFQlVHKCJBU0xFIHN1cHBvcnRlZFxuIik7CisJCURSTV9ERUJVR19EUklWRVIoIkFTTEUgc3VwcG9ydGVkXG4iKTsKIAkJb3ByZWdpb24tPmFzbGUgPSBiYXNlICsgT1BSRUdJT05fQVNMRV9PRkZTRVQ7CiAJCW9wcmVnaW9uX2VuYWJsZV9hc2xlKGRldik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKaW5kZXggMTY4N2VkZi4uOTc0YjNjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCkBAIC0xNDAsNiArMTQwLDcgQEAKICNkZWZpbmUgTUlfTk9PUAkJCU1JX0lOU1RSKDAsIDApCiAjZGVmaW5lIE1JX1VTRVJfSU5URVJSVVBUCU1JX0lOU1RSKDB4MDIsIDApCiAjZGVmaW5lIE1JX1dBSVRfRk9SX0VWRU5UICAgICAgIE1JX0lOU1RSKDB4MDMsIDApCisjZGVmaW5lICAgTUlfV0FJVF9GT1JfT1ZFUkxBWV9GTElQCSgxPDwxNikKICNkZWZpbmUgICBNSV9XQUlUX0ZPUl9QTEFORV9CX0ZMSVAgICAgICAoMTw8NikKICNkZWZpbmUgICBNSV9XQUlUX0ZPUl9QTEFORV9BX0ZMSVAgICAgICAoMTw8MikKICNkZWZpbmUgICBNSV9XQUlUX0ZPUl9QTEFORV9BX1NDQU5MSU5FUyAoMTw8MSkKQEAgLTE1MSw3ICsxNTIsMTMgQEAKICNkZWZpbmUgICBNSV9FTkRfU0NFTkUJCSgxIDw8IDQpIC8qIGZsdXNoIGJpbm5lciBhbmQgaW5jciBzY2VuZSBjb3VudCAqLwogI2RlZmluZSBNSV9CQVRDSF9CVUZGRVJfRU5ECU1JX0lOU1RSKDB4MGEsIDApCiAjZGVmaW5lIE1JX1JFUE9SVF9IRUFECQlNSV9JTlNUUigweDA3LCAwKQorI2RlZmluZSBNSV9PVkVSTEFZX0ZMSVAJCU1JX0lOU1RSKDB4MTEsMCkKKyNkZWZpbmUgICBNSV9PVkVSTEFZX0NPTlRJTlVFCSgweDA8PDIxKQorI2RlZmluZSAgIE1JX09WRVJMQVlfT04JCSgweDE8PDIxKQorI2RlZmluZSAgIE1JX09WRVJMQVlfT0ZGCSgweDI8PDIxKQogI2RlZmluZSBNSV9MT0FEX1NDQU5fTElORVNfSU5DTCBNSV9JTlNUUigweDEyLCAwKQorI2RlZmluZSBNSV9ESVNQTEFZX0ZMSVAJCU1JX0lOU1RSKDB4MTQsIDIpCisjZGVmaW5lICAgTUlfRElTUExBWV9GTElQX1BMQU5FKG4pICgobikgPDwgMjApCiAjZGVmaW5lIE1JX1NUT1JFX0RXT1JEX0lNTQlNSV9JTlNUUigweDIwLCAxKQogI2RlZmluZSAgIE1JX01FTV9WSVJUVUFMCSgxIDw8IDIyKSAvKiA5NjUrIG9ubHkgKi8KICNkZWZpbmUgTUlfU1RPUkVfRFdPUkRfSU5ERVgJTUlfSU5TVFIoMHgyMSwgMSkKQEAgLTI2MCw2ICsyNjcsOCBAQAogI2RlZmluZSBIV1NfUEdBCQkweDAyMDgwCiAjZGVmaW5lIEhXU19BRERSRVNTX01BU0sJMHhmZmZmZjAwMAogI2RlZmluZSBIV1NfU1RBUlRfQUREUkVTU19TSElGVAk0CisjZGVmaW5lIFBXUkNUWEEJCTB4MjA4OCAvKiA5NjVHTSsgb25seSAqLworI2RlZmluZSAgIFBXUkNUWF9FTgkoMTw8MCkKICNkZWZpbmUgSVBFSVIJCTB4MDIwODgKICNkZWZpbmUgSVBFSFIJCTB4MDIwOGMKICNkZWZpbmUgSU5TVERPTkUJMHgwMjA5MApAQCAtNDA1LDYgKzQxNCwxMyBAQAogIyBkZWZpbmUgR1BJT19EQVRBX1ZBTF9JTgkJKDEgPDwgMTIpCiAjIGRlZmluZSBHUElPX0RBVEFfUFVMTFVQX0RJU0FCTEUJKDEgPDwgMTMpCiAKKyNkZWZpbmUgR01CVVMwCQkJMHg1MTAwCisjZGVmaW5lIEdNQlVTMQkJCTB4NTEwNAorI2RlZmluZSBHTUJVUzIJCQkweDUxMDgKKyNkZWZpbmUgR01CVVMzCQkJMHg1MTBjCisjZGVmaW5lIEdNQlVTNAkJCTB4NTExMAorI2RlZmluZSBHTUJVUzUJCQkweDUxMjAKKwogLyoKICAqIENsb2NrIGNvbnRyb2wgJiBwb3dlciBtYW5hZ2VtZW50CiAgKi8KQEAgLTQzNSw3ICs0NTEsNyBAQAogI2RlZmluZSAgIERQTExCX0xWRFNfUDJfQ0xPQ0tfRElWXzcJKDEgPDwgMjQpIC8qIGk5MTUgKi8KICNkZWZpbmUgICBEUExMX1AyX0NMT0NLX0RJVl9NQVNLCTB4MDMwMDAwMDAgLyogaTkxNSAqLwogI2RlZmluZSAgIERQTExfRlBBMDFfUDFfUE9TVF9ESVZfTUFTSwkweDAwZmYwMDAwIC8qIGk5MTUgKi8KLSNkZWZpbmUgICBEUExMX0ZQQTAxX1AxX1BPU1RfRElWX01BU0tfSUdECTB4MDBmZjgwMDAgLyogSUdEICovCisjZGVmaW5lICAgRFBMTF9GUEEwMV9QMV9QT1NUX0RJVl9NQVNLX1BJTkVWSUVXCTB4MDBmZjgwMDAgLyogUGluZXZpZXcgKi8KIAogI2RlZmluZSBJOTE1X0ZJRk9fVU5ERVJSVU5fU1RBVFVTCQkoMVVMPDwzMSkKICNkZWZpbmUgSTkxNV9DUkNfRVJST1JfRU5BQkxFCQkJKDFVTDw8MjkpCkBAIC01MTIsNyArNTI4LDcgQEAKICAqLwogI2RlZmluZSAgIERQTExfRlBBMDFfUDFfUE9TVF9ESVZfTUFTS19JODMwX0xWRFMJMHgwMDNmMDAwMAogI2RlZmluZSAgIERQTExfRlBBMDFfUDFfUE9TVF9ESVZfU0hJRlQJMTYKLSNkZWZpbmUgICBEUExMX0ZQQTAxX1AxX1BPU1RfRElWX1NISUZUX0lHRCAxNQorI2RlZmluZSAgIERQTExfRlBBMDFfUDFfUE9TVF9ESVZfU0hJRlRfUElORVZJRVcgMTUKIC8qIGk4MzAsIHJlcXVpcmVkIGluIERWTyBub24tZ2FuZyAqLwogI2RlZmluZSAgIFBMTF9QMl9ESVZJREVfQllfNAkJKDEgPDwgMjMpCiAjZGVmaW5lICAgUExMX1AxX0RJVklERV9CWV9UV08JCSgxIDw8IDIxKSAvKiBpODMwICovCkBAIC01MjIsNyArNTM4LDcgQEAKICNkZWZpbmUgICBQTExCX1JFRl9JTlBVVF9TUFJFQURTUEVDVFJVTUlOICgzIDw8IDEzKQogI2RlZmluZSAgIFBMTF9SRUZfSU5QVVRfTUFTSwkJKDMgPDwgMTMpCiAjZGVmaW5lICAgUExMX0xPQURfUFVMU0VfUEhBU0VfU0hJRlQJCTkKLS8qIElHRE5HICovCisvKiBJcm9ubGFrZSAqLwogIyBkZWZpbmUgUExMX1JFRl9TRFZPX0hETUlfTVVMVElQTElFUl9TSElGVCAgICAgOQogIyBkZWZpbmUgUExMX1JFRl9TRFZPX0hETUlfTVVMVElQTElFUl9NQVNLICAgICAgKDcgPDwgOSkKICMgZGVmaW5lIFBMTF9SRUZfU0RWT19IRE1JX01VTFRJUExJRVIoeCkJKCgoeCktMSkgPDwgOSkKQEAgLTU4NiwxMiArNjAyLDEyIEBACiAjZGVmaW5lIEZQQjAJMHgwNjA0OAogI2RlZmluZSBGUEIxCTB4MDYwNGMKICNkZWZpbmUgICBGUF9OX0RJVl9NQVNLCQkweDAwM2YwMDAwCi0jZGVmaW5lICAgRlBfTl9JR0RfRElWX01BU0sJMHgwMGZmMDAwMAorI2RlZmluZSAgIEZQX05fUElORVZJRVdfRElWX01BU0sJMHgwMGZmMDAwMAogI2RlZmluZSAgIEZQX05fRElWX1NISUZUCQkxNgogI2RlZmluZSAgIEZQX00xX0RJVl9NQVNLCTB4MDAwMDNmMDAKICNkZWZpbmUgICBGUF9NMV9ESVZfU0hJRlQJCSA4CiAjZGVmaW5lICAgRlBfTTJfRElWX01BU0sJMHgwMDAwMDAzZgotI2RlZmluZSAgIEZQX00yX0lHRF9ESVZfTUFTSwkweDAwMDAwMGZmCisjZGVmaW5lICAgRlBfTTJfUElORVZJRVdfRElWX01BU0sJMHgwMDAwMDBmZgogI2RlZmluZSAgIEZQX00yX0RJVl9TSElGVAkJIDAKICNkZWZpbmUgRFBMTF9URVNUCTB4NjA2YwogI2RlZmluZSAgIERQTExCX1RFU1RfU0RWT19ESVZfMQkJKDAgPDwgMjIpCkBAIC03NjksNyArNzg1LDggQEAKIAogLyoqIEdNOTY1IEdNNDUgcmVuZGVyIHN0YW5kYnkgcmVnaXN0ZXIgKi8KICNkZWZpbmUgTUNIQkFSX1JFTkRFUl9TVEFOREJZCTB4MTExQjgKLQorI2RlZmluZSAgIFJDWF9TV19FWElUCQkoMTw8MjMpCisjZGVmaW5lICAgUlNYX1NUQVRVU19NQVNLCTB4MDA3MDAwMDAKICNkZWZpbmUgUEVHX0JBTkRfR0FQX0RBVEEJMHgxNGQ2OAogCiAvKgpAQCAtODQ0LDcgKzg2MSw2IEBACiAjZGVmaW5lICAgU0RWT0JfSE9UUExVR19JTlRfRU4JCQkoMSA8PCAyNikKICNkZWZpbmUgICBTRFZPQ19IT1RQTFVHX0lOVF9FTgkJCSgxIDw8IDI1KQogI2RlZmluZSAgIFRWX0hPVFBMVUdfSU5UX0VOCQkJKDEgPDwgMTgpCi0jZGVmaW5lICAgQ1JUX0VPU19JTlRfRU4JCQkoMSA8PCAxMCkKICNkZWZpbmUgICBDUlRfSE9UUExVR19JTlRfRU4JCQkoMSA8PCA5KQogI2RlZmluZSAgIENSVF9IT1RQTFVHX0ZPUkNFX0RFVEVDVAkJKDEgPDwgMykKICNkZWZpbmUgQ1JUX0hPVFBMVUdfQUNUSVZBVElPTl9QRVJJT0RfMzIJKDAgPDwgOCkKQEAgLTg2OCw3ICs4ODQsNiBAQAogCQkJIEhETUlEX0hPVFBMVUdfSU5UX0VOIHwJICBcCiAJCQkgU0RWT0JfSE9UUExVR19JTlRfRU4gfAkgIFwKIAkJCSBTRFZPQ19IT1RQTFVHX0lOVF9FTiB8CSAgXAotCQkJIFRWX0hPVFBMVUdfSU5UX0VOIHwJICBcCiAJCQkgQ1JUX0hPVFBMVUdfSU5UX0VOKQogCiAKQEAgLTg3OSw3ICs4OTQsNiBAQAogI2RlZmluZSAgIERQQ19IT1RQTFVHX0lOVF9TVEFUVVMJCSgxIDw8IDI4KQogI2RlZmluZSAgIEhETUlEX0hPVFBMVUdfSU5UX1NUQVRVUwkJKDEgPDwgMjcpCiAjZGVmaW5lICAgRFBEX0hPVFBMVUdfSU5UX1NUQVRVUwkJKDEgPDwgMjcpCi0jZGVmaW5lICAgQ1JUX0VPU19JTlRfU1RBVFVTCQkJKDEgPDwgMTIpCiAjZGVmaW5lICAgQ1JUX0hPVFBMVUdfSU5UX1NUQVRVUwkJKDEgPDwgMTEpCiAjZGVmaW5lICAgVFZfSE9UUExVR19JTlRfU1RBVFVTCQkJKDEgPDwgMTApCiAjZGVmaW5lICAgQ1JUX0hPVFBMVUdfTU9OSVRPUl9NQVNLCQkoMyA8PCA4KQpAQCAtMTYyMCw3ICsxNjM0LDcgQEAKICNkZWZpbmUgICBEUF9DTE9DS19PVVRQVVRfRU5BQkxFCSgxIDw8IDEzKQogCiAjZGVmaW5lICAgRFBfU0NSQU1CTElOR19ESVNBQkxFCQkoMSA8PCAxMikKLSNkZWZpbmUgICBEUF9TQ1JBTUJMSU5HX0RJU0FCTEVfSUdETkcJKDEgPDwgNykKKyNkZWZpbmUgICBEUF9TQ1JBTUJMSU5HX0RJU0FCTEVfSVJPTkxBS0UJKDEgPDwgNykKIAogLyoqIGxpbWl0IFJHQiB2YWx1ZXMgdG8gYXZvaWQgY29uZnVzaW5nIFRWcyAqLwogI2RlZmluZSAgIERQX0NPTE9SX1JBTkdFXzE2XzIzNQkJKDEgPDwgOCkKQEAgLTE4MDgsNyArMTgyMiw3IEBACiAjZGVmaW5lIERTUEZXMwkJCTB4NzAwM2MKICNkZWZpbmUgICBEU1BGV19IUExMX1NSX0VOCSgxPDwzMSkKICNkZWZpbmUgICBEU1BGV19DVVJTT1JfU1JfU0hJRlQJMjQKLSNkZWZpbmUgICBJR0RfU0VMRl9SRUZSRVNIX0VOCSgxPDwzMCkKKyNkZWZpbmUgICBQSU5FVklFV19TRUxGX1JFRlJFU0hfRU4JKDE8PDMwKQogCiAvKiBGSUZPIHdhdGVybWFyayBzaXplcyBldGMgKi8KICNkZWZpbmUgRzRYX0ZJRk9fTElORV9TSVpFCTY0CkBAIC0xODI0LDE2ICsxODM4LDE2IEBACiAjZGVmaW5lIEc0WF9NQVhfV00JCTB4M2YKICNkZWZpbmUgSTkxNV9NQVhfV00JCTB4M2YKIAotI2RlZmluZSBJR0RfRElTUExBWV9GSUZPCTUxMiAvKiBpbiA2NGJ5dGUgdW5pdCAqLwotI2RlZmluZSBJR0RfRklGT19MSU5FX1NJWkUJNjQKLSNkZWZpbmUgSUdEX01BWF9XTQkJMHgxZmYKLSNkZWZpbmUgSUdEX0RGVF9XTQkJMHgzZgotI2RlZmluZSBJR0RfREZUX0hQTExPRkZfV00JMAotI2RlZmluZSBJR0RfR1VBUkRfV00JCTEwCi0jZGVmaW5lIElHRF9DVVJTT1JfRklGTwkJNjQKLSNkZWZpbmUgSUdEX0NVUlNPUl9NQVhfV00JMHgzZgotI2RlZmluZSBJR0RfQ1VSU09SX0RGVF9XTQkwCi0jZGVmaW5lIElHRF9DVVJTT1JfR1VBUkRfV00JNQorI2RlZmluZSBQSU5FVklFV19ESVNQTEFZX0ZJRk8JNTEyIC8qIGluIDY0Ynl0ZSB1bml0ICovCisjZGVmaW5lIFBJTkVWSUVXX0ZJRk9fTElORV9TSVpFCTY0CisjZGVmaW5lIFBJTkVWSUVXX01BWF9XTQkJMHgxZmYKKyNkZWZpbmUgUElORVZJRVdfREZUX1dNCQkweDNmCisjZGVmaW5lIFBJTkVWSUVXX0RGVF9IUExMT0ZGX1dNCTAKKyNkZWZpbmUgUElORVZJRVdfR1VBUkRfV00JCTEwCisjZGVmaW5lIFBJTkVWSUVXX0NVUlNPUl9GSUZPCQk2NAorI2RlZmluZSBQSU5FVklFV19DVVJTT1JfTUFYX1dNCTB4M2YKKyNkZWZpbmUgUElORVZJRVdfQ1VSU09SX0RGVF9XTQkwCisjZGVmaW5lIFBJTkVWSUVXX0NVUlNPUl9HVUFSRF9XTQk1CiAKIC8qCiAgKiBUaGUgdHdvIHBpcGUgZnJhbWUgY291bnRlciByZWdpc3RlcnMgYXJlIG5vdCBzeW5jaHJvbml6ZWQsIHNvCkBAIC0xOTA3LDYgKzE5MjEsNyBAQAogI2RlZmluZSAgIERJU1BQTEFORV8xNkJQUAkJCSgweDU8PDI2KQogI2RlZmluZSAgIERJU1BQTEFORV8zMkJQUF9OT19BTFBIQQkJKDB4Njw8MjYpCiAjZGVmaW5lICAgRElTUFBMQU5FXzMyQlBQCQkJKDB4Nzw8MjYpCisjZGVmaW5lICAgRElTUFBMQU5FXzMyQlBQXzMwQklUX05PX0FMUEhBCSgweGE8PDI2KQogI2RlZmluZSAgIERJU1BQTEFORV9TVEVSRU9fRU5BQkxFCQkoMTw8MjUpCiAjZGVmaW5lICAgRElTUFBMQU5FX1NURVJFT19ESVNBQkxFCQkwCiAjZGVmaW5lICAgRElTUFBMQU5FX1NFTF9QSVBFX01BU0sJCSgxPDwyNCkKQEAgLTE5MTgsNyArMTkzMyw3IEBACiAjZGVmaW5lICAgRElTUFBMQU5FX05PX0xJTkVfRE9VQkxFCQkwCiAjZGVmaW5lICAgRElTUFBMQU5FX1NURVJFT19QT0xBUklUWV9GSVJTVAkwCiAjZGVmaW5lICAgRElTUFBMQU5FX1NURVJFT19QT0xBUklUWV9TRUNPTkQJKDE8PDE4KQotI2RlZmluZSAgIERJU1BQTEFORV9UUklDS0xFX0ZFRURfRElTQUJMRQkoMTw8MTQpIC8qIElHRE5HICovCisjZGVmaW5lICAgRElTUFBMQU5FX1RSSUNLTEVfRkVFRF9ESVNBQkxFCSgxPDwxNCkgLyogSXJvbmxha2UgKi8KICNkZWZpbmUgICBESVNQUExBTkVfVElMRUQJCQkoMTw8MTApCiAjZGVmaW5lIERTUEFBRERSCQkweDcwMTg0CiAjZGVmaW5lIERTUEFTVFJJREUJCTB4NzAxODgKQEAgLTE5NzEsNyArMTk4Niw3IEBACiAjIGRlZmluZSBWR0FfMlhfTU9ERQkJCQkoMSA8PCAzMCkKICMgZGVmaW5lIFZHQV9QSVBFX0JfU0VMRUNUCQkJKDEgPDwgMjkpCiAKLS8qIElHRE5HICovCisvKiBJcm9ubGFrZSAqLwogCiAjZGVmaW5lIENQVV9WR0FDTlRSTAkweDQxMDAwCiAKQEAgLTIxMTcsNiArMjEzMiw3IEBACiAjZGVmaW5lIFNERV9QT1JUQ19IT1RQTFVHICAgICAgICgxIDw8IDkpCiAjZGVmaW5lIFNERV9QT1JUQl9IT1RQTFVHICAgICAgICgxIDw8IDgpCiAjZGVmaW5lIFNERV9TRFZPQl9IT1RQTFVHICAgICAgICgxIDw8IDYpCisjZGVmaW5lIFNERV9IT1RQTFVHX01BU0sJKDB4ZiA8PCA4KQogCiAjZGVmaW5lIFNERUlTUiAgMHhjNDAwMAogI2RlZmluZSBTREVJTVIgIDB4YzQwMDQKQEAgLTIxNTcsNiArMjE3MywxMyBAQAogI2RlZmluZSBQQ0hfR1BJT0UgICAgICAgICAgICAgICAweGM1MDIwCiAjZGVmaW5lIFBDSF9HUElPRiAgICAgICAgICAgICAgIDB4YzUwMjQKIAorI2RlZmluZSBQQ0hfR01CVVMwCQkweGM1MTAwCisjZGVmaW5lIFBDSF9HTUJVUzEJCTB4YzUxMDQKKyNkZWZpbmUgUENIX0dNQlVTMgkJMHhjNTEwOAorI2RlZmluZSBQQ0hfR01CVVMzCQkweGM1MTBjCisjZGVmaW5lIFBDSF9HTUJVUzQJCTB4YzUxMTAKKyNkZWZpbmUgUENIX0dNQlVTNQkJMHhjNTEyMAorCiAjZGVmaW5lIFBDSF9EUExMX0EgICAgICAgICAgICAgIDB4YzYwMTQKICNkZWZpbmUgUENIX0RQTExfQiAgICAgICAgICAgICAgMHhjNjAxOAogCkBAIC0yMjkyLDcgKzIzMTUsNyBAQAogI2RlZmluZSAgRkRJX0RQX1BPUlRfV0lEVEhfWDMgICAgICAgICAgICgyPDwxOSkKICNkZWZpbmUgIEZESV9EUF9QT1JUX1dJRFRIX1g0ICAgICAgICAgICAoMzw8MTkpCiAjZGVmaW5lICBGRElfVFhfRU5IQU5DRV9GUkFNRV9FTkFCTEUgICAgKDE8PDE4KQotLyogSUdETkc6IGhhcmR3aXJlZCB0byAxICovCisvKiBJcm9ubGFrZTogaGFyZHdpcmVkIHRvIDEgKi8KICNkZWZpbmUgIEZESV9UWF9QTExfRU5BQkxFICAgICAgICAgICAgICAoMTw8MTQpCiAvKiBib3RoIFR4IGFuZCBSeCAqLwogI2RlZmluZSAgRkRJX1NDUkFNQkxJTkdfRU5BQkxFICAgICAgICAgICgwPDw3KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zdXNwZW5kLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYwppbmRleCA2ZWVjODE3Li5kNWViYjAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYwpAQCAtMjcsMTQgKzI3LDE0IEBACiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybS5oIgogI2luY2x1ZGUgImk5MTVfZHJtLmgiCi0jaW5jbHVkZSAiaTkxNV9kcnYuaCIKKyNpbmNsdWRlICJpbnRlbF9kcnYuaCIKIAogc3RhdGljIGJvb2wgaTkxNV9waXBlX2VuYWJsZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBwaXBlIHBpcGUpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIJZHBsbF9yZWc7CiAKLQlpZiAoSVNfSUdETkcoZGV2KSkgeworCWlmIChJU19JUk9OTEFLRShkZXYpKSB7CiAJCWRwbGxfcmVnID0gKHBpcGUgPT0gUElQRV9BKSA/IFBDSF9EUExMX0E6IFBDSF9EUExMX0I7CiAJfSBlbHNlIHsKIAkJZHBsbF9yZWcgPSAocGlwZSA9PSBQSVBFX0EpID8gRFBMTF9BOiBEUExMX0I7CkBAIC01Myw3ICs1Myw3IEBACiAJaWYgKCFpOTE1X3BpcGVfZW5hYmxlZChkZXYsIHBpcGUpKQogCQlyZXR1cm47CiAKLQlpZiAoSVNfSUdETkcoZGV2KSkKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkKIAkJcmVnID0gKHBpcGUgPT0gUElQRV9BKSA/IExHQ19QQUxFVFRFX0EgOiBMR0NfUEFMRVRURV9COwogCiAJaWYgKHBpcGUgPT0gUElQRV9BKQpAQCAtNzUsNyArNzUsNyBAQAogCWlmICghaTkxNV9waXBlX2VuYWJsZWQoZGV2LCBwaXBlKSkKIAkJcmV0dXJuOwogCi0JaWYgKElTX0lHRE5HKGRldikpCisJaWYgKElTX0lST05MQUtFKGRldikpCiAJCXJlZyA9IChwaXBlID09IFBJUEVfQSkgPyBMR0NfUEFMRVRURV9BIDogTEdDX1BBTEVUVEVfQjsKIAogCWlmIChwaXBlID09IFBJUEVfQSkKQEAgLTIzOSw3ICsyMzksNyBAQAogCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQogCQlyZXR1cm47CiAKLQlpZiAoSVNfSUdETkcoZGV2KSkgeworCWlmIChJU19JUk9OTEFLRShkZXYpKSB7CiAJCWRldl9wcml2LT5zYXZlUENIX0RSRUZfQ09OVFJPTCA9IEk5MTVfUkVBRChQQ0hfRFJFRl9DT05UUk9MKTsKIAkJZGV2X3ByaXYtPnNhdmVESVNQX0FSQl9DVEwgPSBJOTE1X1JFQUQoRElTUF9BUkJfQ1RMKTsKIAl9CkBAIC0yNDcsNyArMjQ3LDcgQEAKIAkvKiBQaXBlICYgcGxhbmUgQSBpbmZvICovCiAJZGV2X3ByaXYtPnNhdmVQSVBFQUNPTkYgPSBJOTE1X1JFQUQoUElQRUFDT05GKTsKIAlkZXZfcHJpdi0+c2F2ZVBJUEVBU1JDID0gSTkxNV9SRUFEKFBJUEVBU1JDKTsKLQlpZiAoSVNfSUdETkcoZGV2KSkgeworCWlmIChJU19JUk9OTEFLRShkZXYpKSB7CiAJCWRldl9wcml2LT5zYXZlRlBBMCA9IEk5MTVfUkVBRChQQ0hfRlBBMCk7CiAJCWRldl9wcml2LT5zYXZlRlBBMSA9IEk5MTVfUkVBRChQQ0hfRlBBMSk7CiAJCWRldl9wcml2LT5zYXZlRFBMTF9BID0gSTkxNV9SRUFEKFBDSF9EUExMX0EpOwpAQCAtMjU2LDcgKzI1Niw3IEBACiAJCWRldl9wcml2LT5zYXZlRlBBMSA9IEk5MTVfUkVBRChGUEExKTsKIAkJZGV2X3ByaXYtPnNhdmVEUExMX0EgPSBJOTE1X1JFQUQoRFBMTF9BKTsKIAl9Ci0JaWYgKElTX0k5NjVHKGRldikgJiYgIUlTX0lHRE5HKGRldikpCisJaWYgKElTX0k5NjVHKGRldikgJiYgIUlTX0lST05MQUtFKGRldikpCiAJCWRldl9wcml2LT5zYXZlRFBMTF9BX01EID0gSTkxNV9SRUFEKERQTExfQV9NRCk7CiAJZGV2X3ByaXYtPnNhdmVIVE9UQUxfQSA9IEk5MTVfUkVBRChIVE9UQUxfQSk7CiAJZGV2X3ByaXYtPnNhdmVIQkxBTktfQSA9IEk5MTVfUkVBRChIQkxBTktfQSk7CkBAIC0yNjQsMTAgKzI2NCwxMCBAQAogCWRldl9wcml2LT5zYXZlVlRPVEFMX0EgPSBJOTE1X1JFQUQoVlRPVEFMX0EpOwogCWRldl9wcml2LT5zYXZlVkJMQU5LX0EgPSBJOTE1X1JFQUQoVkJMQU5LX0EpOwogCWRldl9wcml2LT5zYXZlVlNZTkNfQSA9IEk5MTVfUkVBRChWU1lOQ19BKTsKLQlpZiAoIUlTX0lHRE5HKGRldikpCisJaWYgKCFJU19JUk9OTEFLRShkZXYpKQogCQlkZXZfcHJpdi0+c2F2ZUJDTFJQQVRfQSA9IEk5MTVfUkVBRChCQ0xSUEFUX0EpOwogCi0JaWYgKElTX0lHRE5HKGRldikpIHsKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkgewogCQlkZXZfcHJpdi0+c2F2ZVBJUEVBX0RBVEFfTTEgPSBJOTE1X1JFQUQoUElQRUFfREFUQV9NMSk7CiAJCWRldl9wcml2LT5zYXZlUElQRUFfREFUQV9OMSA9IEk5MTVfUkVBRChQSVBFQV9EQVRBX04xKTsKIAkJZGV2X3ByaXYtPnNhdmVQSVBFQV9MSU5LX00xID0gSTkxNV9SRUFEKFBJUEVBX0xJTktfTTEpOwpAQCAtMzA0LDcgKzMwNCw3IEBACiAJLyogUGlwZSAmIHBsYW5lIEIgaW5mbyAqLwogCWRldl9wcml2LT5zYXZlUElQRUJDT05GID0gSTkxNV9SRUFEKFBJUEVCQ09ORik7CiAJZGV2X3ByaXYtPnNhdmVQSVBFQlNSQyA9IEk5MTVfUkVBRChQSVBFQlNSQyk7Ci0JaWYgKElTX0lHRE5HKGRldikpIHsKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkgewogCQlkZXZfcHJpdi0+c2F2ZUZQQjAgPSBJOTE1X1JFQUQoUENIX0ZQQjApOwogCQlkZXZfcHJpdi0+c2F2ZUZQQjEgPSBJOTE1X1JFQUQoUENIX0ZQQjEpOwogCQlkZXZfcHJpdi0+c2F2ZURQTExfQiA9IEk5MTVfUkVBRChQQ0hfRFBMTF9CKTsKQEAgLTMxMyw3ICszMTMsNyBAQAogCQlkZXZfcHJpdi0+c2F2ZUZQQjEgPSBJOTE1X1JFQUQoRlBCMSk7CiAJCWRldl9wcml2LT5zYXZlRFBMTF9CID0gSTkxNV9SRUFEKERQTExfQik7CiAJfQotCWlmIChJU19JOTY1RyhkZXYpICYmICFJU19JR0RORyhkZXYpKQorCWlmIChJU19JOTY1RyhkZXYpICYmICFJU19JUk9OTEFLRShkZXYpKQogCQlkZXZfcHJpdi0+c2F2ZURQTExfQl9NRCA9IEk5MTVfUkVBRChEUExMX0JfTUQpOwogCWRldl9wcml2LT5zYXZlSFRPVEFMX0IgPSBJOTE1X1JFQUQoSFRPVEFMX0IpOwogCWRldl9wcml2LT5zYXZlSEJMQU5LX0IgPSBJOTE1X1JFQUQoSEJMQU5LX0IpOwpAQCAtMzIxLDEwICszMjEsMTAgQEAKIAlkZXZfcHJpdi0+c2F2ZVZUT1RBTF9CID0gSTkxNV9SRUFEKFZUT1RBTF9CKTsKIAlkZXZfcHJpdi0+c2F2ZVZCTEFOS19CID0gSTkxNV9SRUFEKFZCTEFOS19CKTsKIAlkZXZfcHJpdi0+c2F2ZVZTWU5DX0IgPSBJOTE1X1JFQUQoVlNZTkNfQik7Ci0JaWYgKCFJU19JR0RORyhkZXYpKQorCWlmICghSVNfSVJPTkxBS0UoZGV2KSkKIAkJZGV2X3ByaXYtPnNhdmVCQ0xSUEFUX0IgPSBJOTE1X1JFQUQoQkNMUlBBVF9CKTsKIAotCWlmIChJU19JR0RORyhkZXYpKSB7CisJaWYgKElTX0lST05MQUtFKGRldikpIHsKIAkJZGV2X3ByaXYtPnNhdmVQSVBFQl9EQVRBX00xID0gSTkxNV9SRUFEKFBJUEVCX0RBVEFfTTEpOwogCQlkZXZfcHJpdi0+c2F2ZVBJUEVCX0RBVEFfTjEgPSBJOTE1X1JFQUQoUElQRUJfREFUQV9OMSk7CiAJCWRldl9wcml2LT5zYXZlUElQRUJfTElOS19NMSA9IEk5MTVfUkVBRChQSVBFQl9MSU5LX00xKTsKQEAgLTM2OSw3ICszNjksNyBAQAogCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQogCQlyZXR1cm47CiAKLQlpZiAoSVNfSUdETkcoZGV2KSkgeworCWlmIChJU19JUk9OTEFLRShkZXYpKSB7CiAJCWRwbGxfYV9yZWcgPSBQQ0hfRFBMTF9BOwogCQlkcGxsX2JfcmVnID0gUENIX0RQTExfQjsKIAkJZnBhMF9yZWcgPSBQQ0hfRlBBMDsKQEAgLTM4NSw3ICszODUsNyBAQAogCQlmcGIxX3JlZyA9IEZQQjE7CiAJfQogCi0JaWYgKElTX0lHRE5HKGRldikpIHsKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkgewogCQlJOTE1X1dSSVRFKFBDSF9EUkVGX0NPTlRST0wsIGRldl9wcml2LT5zYXZlUENIX0RSRUZfQ09OVFJPTCk7CiAJCUk5MTVfV1JJVEUoRElTUF9BUkJfQ1RMLCBkZXZfcHJpdi0+c2F2ZURJU1BfQVJCX0NUTCk7CiAJfQpAQCAtNDAyLDcgKzQwMiw3IEBACiAJLyogQWN0dWFsbHkgZW5hYmxlIGl0ICovCiAJSTkxNV9XUklURShkcGxsX2FfcmVnLCBkZXZfcHJpdi0+c2F2ZURQTExfQSk7CiAJRFJNX1VERUxBWSgxNTApOwotCWlmIChJU19JOTY1RyhkZXYpICYmICFJU19JR0RORyhkZXYpKQorCWlmIChJU19JOTY1RyhkZXYpICYmICFJU19JUk9OTEFLRShkZXYpKQogCQlJOTE1X1dSSVRFKERQTExfQV9NRCwgZGV2X3ByaXYtPnNhdmVEUExMX0FfTUQpOwogCURSTV9VREVMQVkoMTUwKTsKIApAQCAtNDEzLDEwICs0MTMsMTAgQEAKIAlJOTE1X1dSSVRFKFZUT1RBTF9BLCBkZXZfcHJpdi0+c2F2ZVZUT1RBTF9BKTsKIAlJOTE1X1dSSVRFKFZCTEFOS19BLCBkZXZfcHJpdi0+c2F2ZVZCTEFOS19BKTsKIAlJOTE1X1dSSVRFKFZTWU5DX0EsIGRldl9wcml2LT5zYXZlVlNZTkNfQSk7Ci0JaWYgKCFJU19JR0RORyhkZXYpKQorCWlmICghSVNfSVJPTkxBS0UoZGV2KSkKIAkJSTkxNV9XUklURShCQ0xSUEFUX0EsIGRldl9wcml2LT5zYXZlQkNMUlBBVF9BKTsKIAotCWlmIChJU19JR0RORyhkZXYpKSB7CisJaWYgKElTX0lST05MQUtFKGRldikpIHsKIAkJSTkxNV9XUklURShQSVBFQV9EQVRBX00xLCBkZXZfcHJpdi0+c2F2ZVBJUEVBX0RBVEFfTTEpOwogCQlJOTE1X1dSSVRFKFBJUEVBX0RBVEFfTjEsIGRldl9wcml2LT5zYXZlUElQRUFfREFUQV9OMSk7CiAJCUk5MTVfV1JJVEUoUElQRUFfTElOS19NMSwgZGV2X3ByaXYtPnNhdmVQSVBFQV9MSU5LX00xKTsKQEAgLTQ2Nyw3ICs0NjcsNyBAQAogCS8qIEFjdHVhbGx5IGVuYWJsZSBpdCAqLwogCUk5MTVfV1JJVEUoZHBsbF9iX3JlZywgZGV2X3ByaXYtPnNhdmVEUExMX0IpOwogCURSTV9VREVMQVkoMTUwKTsKLQlpZiAoSVNfSTk2NUcoZGV2KSAmJiAhSVNfSUdETkcoZGV2KSkKKwlpZiAoSVNfSTk2NUcoZGV2KSAmJiAhSVNfSVJPTkxBS0UoZGV2KSkKIAkJSTkxNV9XUklURShEUExMX0JfTUQsIGRldl9wcml2LT5zYXZlRFBMTF9CX01EKTsKIAlEUk1fVURFTEFZKDE1MCk7CiAKQEAgLTQ3OCwxMCArNDc4LDEwIEBACiAJSTkxNV9XUklURShWVE9UQUxfQiwgZGV2X3ByaXYtPnNhdmVWVE9UQUxfQik7CiAJSTkxNV9XUklURShWQkxBTktfQiwgZGV2X3ByaXYtPnNhdmVWQkxBTktfQik7CiAJSTkxNV9XUklURShWU1lOQ19CLCBkZXZfcHJpdi0+c2F2ZVZTWU5DX0IpOwotCWlmICghSVNfSUdETkcoZGV2KSkKKwlpZiAoIUlTX0lST05MQUtFKGRldikpCiAJCUk5MTVfV1JJVEUoQkNMUlBBVF9CLCBkZXZfcHJpdi0+c2F2ZUJDTFJQQVRfQik7CiAKLQlpZiAoSVNfSUdETkcoZGV2KSkgeworCWlmIChJU19JUk9OTEFLRShkZXYpKSB7CiAJCUk5MTVfV1JJVEUoUElQRUJfREFUQV9NMSwgZGV2X3ByaXYtPnNhdmVQSVBFQl9EQVRBX00xKTsKIAkJSTkxNV9XUklURShQSVBFQl9EQVRBX04xLCBkZXZfcHJpdi0+c2F2ZVBJUEVCX0RBVEFfTjEpOwogCQlJOTE1X1dSSVRFKFBJUEVCX0xJTktfTTEsIGRldl9wcml2LT5zYXZlUElQRUJfTElOS19NMSk7CkBAIC01NDYsMTQgKzU0NiwxNCBAQAogCQlkZXZfcHJpdi0+c2F2ZUNVUlNJWkUgPSBJOTE1X1JFQUQoQ1VSU0laRSk7CiAKIAkvKiBDUlQgc3RhdGUgKi8KLQlpZiAoSVNfSUdETkcoZGV2KSkgeworCWlmIChJU19JUk9OTEFLRShkZXYpKSB7CiAJCWRldl9wcml2LT5zYXZlQURQQSA9IEk5MTVfUkVBRChQQ0hfQURQQSk7CiAJfSBlbHNlIHsKIAkJZGV2X3ByaXYtPnNhdmVBRFBBID0gSTkxNV9SRUFEKEFEUEEpOwogCX0KIAogCS8qIExWRFMgc3RhdGUgKi8KLQlpZiAoSVNfSUdETkcoZGV2KSkgeworCWlmIChJU19JUk9OTEFLRShkZXYpKSB7CiAJCWRldl9wcml2LT5zYXZlUFBfQ09OVFJPTCA9IEk5MTVfUkVBRChQQ0hfUFBfQ09OVFJPTCk7CiAJCWRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwgPSBJOTE1X1JFQUQoQkxDX1BXTV9QQ0hfQ1RMMSk7CiAJCWRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwyID0gSTkxNV9SRUFEKEJMQ19QV01fUENIX0NUTDIpOwpAQCAtNTcxLDEwICs1NzEsMTAgQEAKIAkJCWRldl9wcml2LT5zYXZlTFZEUyA9IEk5MTVfUkVBRChMVkRTKTsKIAl9CiAKLQlpZiAoIUlTX0k4MzAoZGV2KSAmJiAhSVNfODQ1RyhkZXYpICYmICFJU19JR0RORyhkZXYpKQorCWlmICghSVNfSTgzMChkZXYpICYmICFJU184NDVHKGRldikgJiYgIUlTX0lST05MQUtFKGRldikpCiAJCWRldl9wcml2LT5zYXZlUEZJVF9DT05UUk9MID0gSTkxNV9SRUFEKFBGSVRfQ09OVFJPTCk7CiAKLQlpZiAoSVNfSUdETkcoZGV2KSkgeworCWlmIChJU19JUk9OTEFLRShkZXYpKSB7CiAJCWRldl9wcml2LT5zYXZlUFBfT05fREVMQVlTID0gSTkxNV9SRUFEKFBDSF9QUF9PTl9ERUxBWVMpOwogCQlkZXZfcHJpdi0+c2F2ZVBQX09GRl9ERUxBWVMgPSBJOTE1X1JFQUQoUENIX1BQX09GRl9ERUxBWVMpOwogCQlkZXZfcHJpdi0+c2F2ZVBQX0RJVklTT1IgPSBJOTE1X1JFQUQoUENIX1BQX0RJVklTT1IpOwpAQCAtNjE0LDcgKzYxNCw3IEBACiAJZGV2X3ByaXYtPnNhdmVWR0EwID0gSTkxNV9SRUFEKFZHQTApOwogCWRldl9wcml2LT5zYXZlVkdBMSA9IEk5MTVfUkVBRChWR0ExKTsKIAlkZXZfcHJpdi0+c2F2ZVZHQV9QRCA9IEk5MTVfUkVBRChWR0FfUEQpOwotCWlmIChJU19JR0RORyhkZXYpKQorCWlmIChJU19JUk9OTEFLRShkZXYpKQogCQlkZXZfcHJpdi0+c2F2ZVZHQUNOVFJMID0gSTkxNV9SRUFEKENQVV9WR0FDTlRSTCk7CiAJZWxzZQogCQlkZXZfcHJpdi0+c2F2ZVZHQUNOVFJMID0gSTkxNV9SRUFEKFZHQUNOVFJMKTsKQEAgLTY1NiwyNCArNjU2LDI0IEBACiAJCUk5MTVfV1JJVEUoQ1VSU0laRSwgZGV2X3ByaXYtPnNhdmVDVVJTSVpFKTsKIAogCS8qIENSVCBzdGF0ZSAqLwotCWlmIChJU19JR0RORyhkZXYpKQorCWlmIChJU19JUk9OTEFLRShkZXYpKQogCQlJOTE1X1dSSVRFKFBDSF9BRFBBLCBkZXZfcHJpdi0+c2F2ZUFEUEEpOwogCWVsc2UKIAkJSTkxNV9XUklURShBRFBBLCBkZXZfcHJpdi0+c2F2ZUFEUEEpOwogCiAJLyogTFZEUyBzdGF0ZSAqLwotCWlmIChJU19JOTY1RyhkZXYpICYmICFJU19JR0RORyhkZXYpKQorCWlmIChJU19JOTY1RyhkZXYpICYmICFJU19JUk9OTEFLRShkZXYpKQogCQlJOTE1X1dSSVRFKEJMQ19QV01fQ1RMMiwgZGV2X3ByaXYtPnNhdmVCTENfUFdNX0NUTDIpOwogCi0JaWYgKElTX0lHRE5HKGRldikpIHsKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkgewogCQlJOTE1X1dSSVRFKFBDSF9MVkRTLCBkZXZfcHJpdi0+c2F2ZUxWRFMpOwogCX0gZWxzZSBpZiAoSVNfTU9CSUxFKGRldikgJiYgIUlTX0k4MzAoZGV2KSkKIAkJSTkxNV9XUklURShMVkRTLCBkZXZfcHJpdi0+c2F2ZUxWRFMpOwogCi0JaWYgKCFJU19JODMwKGRldikgJiYgIUlTXzg0NUcoZGV2KSAmJiAhSVNfSUdETkcoZGV2KSkKKwlpZiAoIUlTX0k4MzAoZGV2KSAmJiAhSVNfODQ1RyhkZXYpICYmICFJU19JUk9OTEFLRShkZXYpKQogCQlJOTE1X1dSSVRFKFBGSVRfQ09OVFJPTCwgZGV2X3ByaXYtPnNhdmVQRklUX0NPTlRST0wpOwogCi0JaWYgKElTX0lHRE5HKGRldikpIHsKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkgewogCQlJOTE1X1dSSVRFKEJMQ19QV01fUENIX0NUTDEsIGRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwpOwogCQlJOTE1X1dSSVRFKEJMQ19QV01fUENIX0NUTDIsIGRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwyKTsKIAkJSTkxNV9XUklURShCTENfUFdNX0NQVV9DVEwsIGRldl9wcml2LT5zYXZlQkxDX0NQVV9QV01fQ1RMKTsKQEAgLTcxMyw3ICs3MTMsNyBAQAogCX0KIAogCS8qIFZHQSBzdGF0ZSAqLwotCWlmIChJU19JR0RORyhkZXYpKQorCWlmIChJU19JUk9OTEFLRShkZXYpKQogCQlJOTE1X1dSSVRFKENQVV9WR0FDTlRSTCwgZGV2X3ByaXYtPnNhdmVWR0FDTlRSTCk7CiAJZWxzZQogCQlJOTE1X1dSSVRFKFZHQUNOVFJMLCBkZXZfcHJpdi0+c2F2ZVZHQUNOVFJMKTsKQEAgLTczMyw4ICs3MzMsMTAgQEAKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYtPnBkZXYsIExCQiwgJmRldl9wcml2LT5zYXZlTEJCKTsKIAogCS8qIFJlbmRlciBTdGFuZGJ5ICovCi0JaWYgKElTX0k5NjVHKGRldikgJiYgSVNfTU9CSUxFKGRldikpCisJaWYgKEk5MTVfSEFTX1JDNihkZXYpKSB7CiAJCWRldl9wcml2LT5zYXZlUkVOREVSU1RBTkRCWSA9IEk5MTVfUkVBRChNQ0hCQVJfUkVOREVSX1NUQU5EQlkpOworCQlkZXZfcHJpdi0+c2F2ZVBXUkNUWEEgPSBJOTE1X1JFQUQoUFdSQ1RYQSk7CisJfQogCiAJLyogSGFyZHdhcmUgc3RhdHVzIHBhZ2UgKi8KIAlkZXZfcHJpdi0+c2F2ZUhXUyA9IEk5MTVfUkVBRChIV1NfUEdBKTsKQEAgLTc0Miw3ICs3NDQsNyBAQAogCWk5MTVfc2F2ZV9kaXNwbGF5KGRldik7CiAKIAkvKiBJbnRlcnJ1cHQgc3RhdGUgKi8KLQlpZiAoSVNfSUdETkcoZGV2KSkgeworCWlmIChJU19JUk9OTEFLRShkZXYpKSB7CiAJCWRldl9wcml2LT5zYXZlREVJRVIgPSBJOTE1X1JFQUQoREVJRVIpOwogCQlkZXZfcHJpdi0+c2F2ZURFSU1SID0gSTkxNV9SRUFEKERFSU1SKTsKIAkJZGV2X3ByaXYtPnNhdmVHVElFUiA9IEk5MTVfUkVBRChHVElFUik7CkBAIC03NTQsMTAgKzc1Niw2IEBACiAJCWRldl9wcml2LT5zYXZlSU1SID0gSTkxNV9SRUFEKElNUik7CiAJfQogCi0JLyogQ2xvY2sgZ2F0aW5nIHN0YXRlICovCi0JZGV2X3ByaXYtPnNhdmVEX1NUQVRFID0gSTkxNV9SRUFEKERfU1RBVEUpOwotCWRldl9wcml2LT5zYXZlRFNQQ0xLX0dBVEVfRCA9IEk5MTVfUkVBRChEU1BDTEtfR0FURV9EKTsgLyogTm90IHN1cmUgYWJvdXQgdGhpcyAqLwotCiAJLyogQ2FjaGUgbW9kZSBzdGF0ZSAqLwogCWRldl9wcml2LT5zYXZlQ0FDSEVfTU9ERV8wID0gSTkxNV9SRUFEKENBQ0hFX01PREVfMCk7CiAKQEAgLTc5Niw4ICs3OTQsMTAgQEAKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LT5wZGV2LCBMQkIsIGRldl9wcml2LT5zYXZlTEJCKTsKIAogCS8qIFJlbmRlciBTdGFuZGJ5ICovCi0JaWYgKElTX0k5NjVHKGRldikgJiYgSVNfTU9CSUxFKGRldikpCisJaWYgKEk5MTVfSEFTX1JDNihkZXYpKSB7CiAJCUk5MTVfV1JJVEUoTUNIQkFSX1JFTkRFUl9TVEFOREJZLCBkZXZfcHJpdi0+c2F2ZVJFTkRFUlNUQU5EQlkpOworCQlJOTE1X1dSSVRFKFBXUkNUWEEsIGRldl9wcml2LT5zYXZlUFdSQ1RYQSk7CisJfQogCiAJLyogSGFyZHdhcmUgc3RhdHVzIHBhZ2UgKi8KIAlJOTE1X1dSSVRFKEhXU19QR0EsIGRldl9wcml2LT5zYXZlSFdTKTsKQEAgLTgxNyw3ICs4MTcsNyBAQAogCWk5MTVfcmVzdG9yZV9kaXNwbGF5KGRldik7CiAKIAkvKiBJbnRlcnJ1cHQgc3RhdGUgKi8KLQlpZiAoSVNfSUdETkcoZGV2KSkgeworCWlmIChJU19JUk9OTEFLRShkZXYpKSB7CiAJCUk5MTVfV1JJVEUoREVJRVIsIGRldl9wcml2LT5zYXZlREVJRVIpOwogCQlJOTE1X1dSSVRFKERFSU1SLCBkZXZfcHJpdi0+c2F2ZURFSU1SKTsKIAkJSTkxNV9XUklURShHVElFUiwgZGV2X3ByaXYtPnNhdmVHVElFUik7CkBAIC04MzAsOCArODMwLDcgQEAKIAl9CiAKIAkvKiBDbG9jayBnYXRpbmcgc3RhdGUgKi8KLQlJOTE1X1dSSVRFIChEX1NUQVRFLCBkZXZfcHJpdi0+c2F2ZURfU1RBVEUpOwotCUk5MTVfV1JJVEUgKERTUENMS19HQVRFX0QsIGRldl9wcml2LT5zYXZlRFNQQ0xLX0dBVEVfRCk7CisJaW50ZWxfaW5pdF9jbG9ja19nYXRpbmcoZGV2KTsKIAogCS8qIENhY2hlIG1vZGUgc3RhdGUgKi8KIAlJOTE1X1dSSVRFIChDQUNIRV9NT0RFXzAsIGRldl9wcml2LT5zYXZlQ0FDSEVfTU9ERV8wIHwgMHhmZmZmMDAwMCk7CkBAIC04NDYsNiArODQ1LDkgQEAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQogCQlJOTE1X1dSSVRFKFNXRjMwICsgKGkgPDwgMiksIGRldl9wcml2LT5zYXZlU1dGMltpXSk7CiAKKwkvKiBJMkMgc3RhdGUgKi8KKwlpbnRlbF9pMmNfcmVzZXRfZ21idXMoZGV2KTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9iaW9zLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9iaW9zLmMKaW5kZXggOTZjZDI1Ni4uZjI3NTY3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Jpb3MuYwpAQCAtMTE0LDYgKzExNCw4IEBACiAJc3RydWN0IGx2ZHNfZHZvX3RpbWluZyAqZHZvX3RpbWluZzsKIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqcGFuZWxfZml4ZWRfbW9kZTsKIAlpbnQgbGZwX2RhdGFfc2l6ZSwgZHZvX3RpbWluZ19vZmZzZXQ7CisJaW50IGksIHRlbXBfZG93bmNsb2NrOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICp0ZW1wX21vZGU7CiAKIAkvKiBEZWZhdWx0cyBpZiB3ZSBjYW4ndCBmaW5kIFZCVCBpbmZvICovCiAJZGV2X3ByaXYtPmx2ZHNfZGl0aGVyID0gMDsKQEAgLTE1OSw5ICsxNjEsNDkgQEAKIAogCWRldl9wcml2LT5sZnBfbHZkc192YnRfbW9kZSA9IHBhbmVsX2ZpeGVkX21vZGU7CiAKLQlEUk1fREVCVUcoIkZvdW5kIHBhbmVsIG1vZGUgaW4gQklPUyBWQlQgdGFibGVzOlxuIik7CisJRFJNX0RFQlVHX0tNUygiRm91bmQgcGFuZWwgbW9kZSBpbiBCSU9TIFZCVCB0YWJsZXM6XG4iKTsKIAlkcm1fbW9kZV9kZWJ1Z19wcmludG1vZGVsaW5lKHBhbmVsX2ZpeGVkX21vZGUpOwogCisJdGVtcF9tb2RlID0ga3phbGxvYyhzaXplb2YoKnRlbXBfbW9kZSksIEdGUF9LRVJORUwpOworCXRlbXBfZG93bmNsb2NrID0gcGFuZWxfZml4ZWRfbW9kZS0+Y2xvY2s7CisJLyoKKwkgKiBlbnVtZXJhdGUgdGhlIExWRFMgcGFuZWwgdGltaW5nIGluZm8gZW50cnkgaW4gVkJUIHRvIGNoZWNrIHdoZXRoZXIKKwkgKiB0aGUgTFZEUyBkb3duY2xvY2sgaXMgZm91bmQuCisJICovCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJZW50cnkgPSAoc3RydWN0IGJkYl9sdmRzX2xmcF9kYXRhX2VudHJ5ICopCisJCQkoKHVpbnQ4X3QgKilsdmRzX2xmcF9kYXRhLT5kYXRhICsgKGxmcF9kYXRhX3NpemUgKiBpKSk7CisJCWR2b190aW1pbmcgPSAoc3RydWN0IGx2ZHNfZHZvX3RpbWluZyAqKQorCQkJKCh1bnNpZ25lZCBjaGFyICopZW50cnkgKyBkdm9fdGltaW5nX29mZnNldCk7CisKKwkJZmlsbF9kZXRhaWxfdGltaW5nX2RhdGEodGVtcF9tb2RlLCBkdm9fdGltaW5nKTsKKworCQlpZiAodGVtcF9tb2RlLT5oZGlzcGxheSA9PSBwYW5lbF9maXhlZF9tb2RlLT5oZGlzcGxheSAmJgorCQl0ZW1wX21vZGUtPmhzeW5jX3N0YXJ0ID09IHBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX3N0YXJ0ICYmCisJCXRlbXBfbW9kZS0+aHN5bmNfZW5kID09IHBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX2VuZCAmJgorCQl0ZW1wX21vZGUtPmh0b3RhbCA9PSBwYW5lbF9maXhlZF9tb2RlLT5odG90YWwgJiYKKwkJdGVtcF9tb2RlLT52ZGlzcGxheSA9PSBwYW5lbF9maXhlZF9tb2RlLT52ZGlzcGxheSAmJgorCQl0ZW1wX21vZGUtPnZzeW5jX3N0YXJ0ID09IHBhbmVsX2ZpeGVkX21vZGUtPnZzeW5jX3N0YXJ0ICYmCisJCXRlbXBfbW9kZS0+dnN5bmNfZW5kID09IHBhbmVsX2ZpeGVkX21vZGUtPnZzeW5jX2VuZCAmJgorCQl0ZW1wX21vZGUtPnZ0b3RhbCA9PSBwYW5lbF9maXhlZF9tb2RlLT52dG90YWwgJiYKKwkJdGVtcF9tb2RlLT5jbG9jayA8IHRlbXBfZG93bmNsb2NrKSB7CisJCQkvKgorCQkJICogZG93bmNsb2NrIGlzIGFscmVhZHkgZm91bmQuIEJ1dCB3ZSBleHBlY3QKKwkJCSAqIHRvIGZpbmQgdGhlIGxvd2VyIGRvd25jbG9jay4KKwkJCSAqLworCQkJdGVtcF9kb3duY2xvY2sgPSB0ZW1wX21vZGUtPmNsb2NrOworCQl9CisJCS8qIGNsZWFyIGl0IHRvIHplcm8gKi8KKwkJbWVtc2V0KHRlbXBfbW9kZSwgMCwgc2l6ZW9mKCp0ZW1wX21vZGUpKTsKKwl9CisJa2ZyZWUodGVtcF9tb2RlKTsKKwlpZiAodGVtcF9kb3duY2xvY2sgPCBwYW5lbF9maXhlZF9tb2RlLT5jbG9jaykgeworCQlkZXZfcHJpdi0+bHZkc19kb3duY2xvY2tfYXZhaWwgPSAxOworCQlkZXZfcHJpdi0+bHZkc19kb3duY2xvY2sgPSB0ZW1wX2Rvd25jbG9jazsKKwkJRFJNX0RFQlVHX0tNUygiTFZEUyBkb3duY2xvY2sgaXMgZm91bmQgaW4gVkJULiAiLAorCQkJCSJOb3JtYWwgQ2xvY2sgJWRLSHosIGRvd25jbG9jayAlZEtIelxuIiwKKwkJCQl0ZW1wX2Rvd25jbG9jaywgcGFuZWxfZml4ZWRfbW9kZS0+Y2xvY2spOworCX0KIAlyZXR1cm47CiB9CiAKQEAgLTIxNyw3ICsyNTksNyBAQAogCQkJaWYgKElTX0k4NVgoZGV2X3ByaXYtPmRldikpCiAJCQkJZGV2X3ByaXYtPmx2ZHNfc3NjX2ZyZXEgPQogCQkJCQlnZW5lcmFsLT5zc2NfZnJlcSA/IDY2IDogNDg7Ci0JCQllbHNlIGlmIChJU19JR0RORyhkZXZfcHJpdi0+ZGV2KSkKKwkJCWVsc2UgaWYgKElTX0lST05MQUtFKGRldl9wcml2LT5kZXYpKQogCQkJCWRldl9wcml2LT5sdmRzX3NzY19mcmVxID0KIAkJCQkJZ2VuZXJhbC0+c3NjX2ZyZXEgPyAxMDAgOiAxMjA7CiAJCQllbHNlCkBAIC0yNDEsMjIgKzI4MywxOCBAQAogCQlHUElPRiwKIAl9OwogCi0JLyogU2V0IHNlbnNpYmxlIGRlZmF1bHRzIGluIGNhc2Ugd2UgY2FuJ3QgZmluZCB0aGUgZ2VuZXJhbCBibG9jawotCSAgIG9yIGl0IGlzIHRoZSB3cm9uZyBjaGlwc2V0ICovCi0JZGV2X3ByaXYtPmNydF9kZGNfYnVzID0gLTE7Ci0KIAlnZW5lcmFsID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX0dFTkVSQUxfREVGSU5JVElPTlMpOwogCWlmIChnZW5lcmFsKSB7CiAJCXUxNiBibG9ja19zaXplID0gZ2V0X2Jsb2Nrc2l6ZShnZW5lcmFsKTsKIAkJaWYgKGJsb2NrX3NpemUgPj0gc2l6ZW9mKCpnZW5lcmFsKSkgewogCQkJaW50IGJ1c19waW4gPSBnZW5lcmFsLT5jcnRfZGRjX2dtYnVzX3BpbjsKLQkJCURSTV9ERUJVRygiY3J0X2RkY19idXNfcGluOiAlZFxuIiwgYnVzX3Bpbik7CisJCQlEUk1fREVCVUdfS01TKCJjcnRfZGRjX2J1c19waW46ICVkXG4iLCBidXNfcGluKTsKIAkJCWlmICgoYnVzX3BpbiA+PSAxKSAmJiAoYnVzX3BpbiA8PSA2KSkgewogCQkJCWRldl9wcml2LT5jcnRfZGRjX2J1cyA9CiAJCQkJCWNydF9idXNfbWFwX3RhYmxlW2J1c19waW4tMV07CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlEUk1fREVCVUcoIkJEQl9HRCB0b28gc21hbGwgKCVkKS4gSW52YWxpZC5cbiIsCisJCQlEUk1fREVCVUdfS01TKCJCREJfR0QgdG9vIHNtYWxsICglZCkuIEludmFsaWQuXG4iLAogCQkJCSAgYmxvY2tfc2l6ZSk7CiAJCX0KIAl9CkBAIC0yNzQsNyArMzEyLDcgQEAKIAogCXBfZGVmcyA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9HRU5FUkFMX0RFRklOSVRJT05TKTsKIAlpZiAoIXBfZGVmcykgewotCQlEUk1fREVCVUcoIk5vIGdlbmVyYWwgZGVmaW5pdGlvbiBibG9jayBpcyBmb3VuZFxuIik7CisJCURSTV9ERUJVR19LTVMoIk5vIGdlbmVyYWwgZGVmaW5pdGlvbiBibG9jayBpcyBmb3VuZFxuIik7CiAJCXJldHVybjsKIAl9CiAJLyoganVkZ2Ugd2hldGhlciB0aGUgc2l6ZSBvZiBjaGlsZCBkZXZpY2UgbWVldHMgdGhlIHJlcXVpcmVtZW50cy4KQEAgLTI4NCw3ICszMjIsNyBAQAogCSAqLwogCWlmIChwX2RlZnMtPmNoaWxkX2Rldl9zaXplICE9IHNpemVvZigqcF9jaGlsZCkpIHsKIAkJLyogZGlmZmVyZW50IGNoaWxkIGRldiBzaXplIC4gSWdub3JlIGl0ICovCi0JCURSTV9ERUJVRygiZGlmZmVyZW50IGNoaWxkIHNpemUgaXMgZm91bmQuIEludmFsaWQuXG4iKTsKKwkJRFJNX0RFQlVHX0tNUygiZGlmZmVyZW50IGNoaWxkIHNpemUgaXMgZm91bmQuIEludmFsaWQuXG4iKTsKIAkJcmV0dXJuOwogCX0KIAkvKiBnZXQgdGhlIGJsb2NrIHNpemUgb2YgZ2VuZXJhbCBkZWZpbml0aW9ucyAqLwpAQCAtMzEwLDExICszNDgsMTEgQEAKIAkJaWYgKHBfY2hpbGQtPmR2b19wb3J0ICE9IERFVklDRV9QT1JUX0RWT0IgJiYKIAkJCXBfY2hpbGQtPmR2b19wb3J0ICE9IERFVklDRV9QT1JUX0RWT0MpIHsKIAkJCS8qIHNraXAgdGhlIGluY29ycmVjdCBTRFZPIHBvcnQgKi8KLQkJCURSTV9ERUJVRygiSW5jb3JyZWN0IFNEVk8gcG9ydC4gU2tpcCBpdCBcbiIpOworCQkJRFJNX0RFQlVHX0tNUygiSW5jb3JyZWN0IFNEVk8gcG9ydC4gU2tpcCBpdCBcbiIpOwogCQkJY29udGludWU7CiAJCX0KLQkJRFJNX0RFQlVHKCJ0aGUgU0RWTyBkZXZpY2Ugd2l0aCBzbGF2ZSBhZGRyICUyeCBpcyBmb3VuZCBvbiAiCi0JCQkJIiVzIHBvcnRcbiIsCisJCURSTV9ERUJVR19LTVMoInRoZSBTRFZPIGRldmljZSB3aXRoIHNsYXZlIGFkZHIgJTJ4IGlzIGZvdW5kIG9uIgorCQkJCSIgJXMgcG9ydFxuIiwKIAkJCQlwX2NoaWxkLT5zbGF2ZV9hZGRyLAogCQkJCShwX2NoaWxkLT5kdm9fcG9ydCA9PSBERVZJQ0VfUE9SVF9EVk9CKSA/CiAJCQkJCSJTRFZPQiIgOiAiU0RWT0MiKTsKQEAgLTMyNSwyMSArMzYzLDIxIEBACiAJCQlwX21hcHBpbmctPmR2b193aXJpbmcgPSBwX2NoaWxkLT5kdm9fd2lyaW5nOwogCQkJcF9tYXBwaW5nLT5pbml0aWFsaXplZCA9IDE7CiAJCX0gZWxzZSB7Ci0JCQlEUk1fREVCVUcoIk1heWJlIG9uZSBTRFZPIHBvcnQgaXMgc2hhcmVkIGJ5ICIKKwkJCURSTV9ERUJVR19LTVMoIk1heWJlIG9uZSBTRFZPIHBvcnQgaXMgc2hhcmVkIGJ5ICIKIAkJCQkJICJ0d28gU0RWTyBkZXZpY2UuXG4iKTsKIAkJfQogCQlpZiAocF9jaGlsZC0+c2xhdmUyX2FkZHIpIHsKIAkJCS8qIE1heWJlIHRoaXMgaXMgYSBTRFZPIGRldmljZSB3aXRoIG11bHRpcGxlIGlucHV0cyAqLwogCQkJLyogQW5kIHRoZSBtYXBwaW5nIGluZm8gaXMgbm90IGFkZGVkICovCi0JCQlEUk1fREVCVUcoInRoZXJlIGV4aXN0cyB0aGUgc2xhdmUyX2FkZHIuIE1heWJlIHRoaXMgIgotCQkJCSJpcyBhIFNEVk8gZGV2aWNlIHdpdGggbXVsdGlwbGUgaW5wdXRzLlxuIik7CisJCQlEUk1fREVCVUdfS01TKCJ0aGVyZSBleGlzdHMgdGhlIHNsYXZlMl9hZGRyLiBNYXliZSB0aGlzIgorCQkJCSIgaXMgYSBTRFZPIGRldmljZSB3aXRoIG11bHRpcGxlIGlucHV0cy5cbiIpOwogCQl9CiAJCWNvdW50Kys7CiAJfQogCiAJaWYgKCFjb3VudCkgewogCQkvKiBObyBTRFZPIGRldmljZSBpbmZvIGlzIGZvdW5kICovCi0JCURSTV9ERUJVRygiTm8gU0RWTyBkZXZpY2UgaW5mbyBpcyBmb3VuZCBpbiBWQlRcbiIpOworCQlEUk1fREVCVUdfS01TKCJObyBTRFZPIGRldmljZSBpbmZvIGlzIGZvdW5kIGluIFZCVFxuIik7CiAJfQogCXJldHVybjsKIH0KQEAgLTM2Niw2ICs0MDQsNzAgQEAKIAkJZGV2X3ByaXYtPnJlbmRlcl9yZWNsb2NrX2F2YWlsID0gdHJ1ZTsKIH0KIAorc3RhdGljIHZvaWQKK3BhcnNlX2RldmljZV9tYXBwaW5nKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKKwkJICAgICAgIHN0cnVjdCBiZGJfaGVhZGVyICpiZGIpCit7CisJc3RydWN0IGJkYl9nZW5lcmFsX2RlZmluaXRpb25zICpwX2RlZnM7CisJc3RydWN0IGNoaWxkX2RldmljZV9jb25maWcgKnBfY2hpbGQsICpjaGlsZF9kZXZfcHRyOworCWludCBpLCBjaGlsZF9kZXZpY2VfbnVtLCBjb3VudDsKKwl1MTYJYmxvY2tfc2l6ZTsKKworCXBfZGVmcyA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9HRU5FUkFMX0RFRklOSVRJT05TKTsKKwlpZiAoIXBfZGVmcykgeworCQlEUk1fREVCVUdfS01TKCJObyBnZW5lcmFsIGRlZmluaXRpb24gYmxvY2sgaXMgZm91bmRcbiIpOworCQlyZXR1cm47CisJfQorCS8qIGp1ZGdlIHdoZXRoZXIgdGhlIHNpemUgb2YgY2hpbGQgZGV2aWNlIG1lZXRzIHRoZSByZXF1aXJlbWVudHMuCisJICogSWYgdGhlIGNoaWxkIGRldmljZSBzaXplIG9idGFpbmVkIGZyb20gZ2VuZXJhbCBkZWZpbml0aW9uIGJsb2NrCisJICogaXMgZGlmZmVyZW50IHdpdGggc2l6ZW9mKHN0cnVjdCBjaGlsZF9kZXZpY2VfY29uZmlnKSwgc2tpcCB0aGUKKwkgKiBwYXJzaW5nIG9mIHNkdm8gZGV2aWNlIGluZm8KKwkgKi8KKwlpZiAocF9kZWZzLT5jaGlsZF9kZXZfc2l6ZSAhPSBzaXplb2YoKnBfY2hpbGQpKSB7CisJCS8qIGRpZmZlcmVudCBjaGlsZCBkZXYgc2l6ZSAuIElnbm9yZSBpdCAqLworCQlEUk1fREVCVUdfS01TKCJkaWZmZXJlbnQgY2hpbGQgc2l6ZSBpcyBmb3VuZC4gSW52YWxpZC5cbiIpOworCQlyZXR1cm47CisJfQorCS8qIGdldCB0aGUgYmxvY2sgc2l6ZSBvZiBnZW5lcmFsIGRlZmluaXRpb25zICovCisJYmxvY2tfc2l6ZSA9IGdldF9ibG9ja3NpemUocF9kZWZzKTsKKwkvKiBnZXQgdGhlIG51bWJlciBvZiBjaGlsZCBkZXZpY2UgKi8KKwljaGlsZF9kZXZpY2VfbnVtID0gKGJsb2NrX3NpemUgLSBzaXplb2YoKnBfZGVmcykpIC8KKwkJCQlzaXplb2YoKnBfY2hpbGQpOworCWNvdW50ID0gMDsKKwkvKiBnZXQgdGhlIG51bWJlciBvZiBjaGlsZCBkZXZpY2UgdGhhdCBpcyBwcmVzZW50ICovCisJZm9yIChpID0gMDsgaSA8IGNoaWxkX2RldmljZV9udW07IGkrKykgeworCQlwX2NoaWxkID0gJihwX2RlZnMtPmRldmljZXNbaV0pOworCQlpZiAoIXBfY2hpbGQtPmRldmljZV90eXBlKSB7CisJCQkvKiBza2lwIHRoZSBkZXZpY2UgYmxvY2sgaWYgZGV2aWNlIHR5cGUgaXMgaW52YWxpZCAqLworCQkJY29udGludWU7CisJCX0KKwkJY291bnQrKzsKKwl9CisJaWYgKCFjb3VudCkgeworCQlEUk1fREVCVUdfS01TKCJubyBjaGlsZCBkZXYgaXMgcGFyc2VkIGZyb20gVkJUIFxuIik7CisJCXJldHVybjsKKwl9CisJZGV2X3ByaXYtPmNoaWxkX2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpwX2NoaWxkKSAqIGNvdW50LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldl9wcml2LT5jaGlsZF9kZXYpIHsKKwkJRFJNX0RFQlVHX0tNUygiTm8gbWVtb3J5IHNwYWNlIGZvciBjaGlsZCBkZXZpY2VcbiIpOworCQlyZXR1cm47CisJfQorCisJZGV2X3ByaXYtPmNoaWxkX2Rldl9udW0gPSBjb3VudDsKKwljb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGNoaWxkX2RldmljZV9udW07IGkrKykgeworCQlwX2NoaWxkID0gJihwX2RlZnMtPmRldmljZXNbaV0pOworCQlpZiAoIXBfY2hpbGQtPmRldmljZV90eXBlKSB7CisJCQkvKiBza2lwIHRoZSBkZXZpY2UgYmxvY2sgaWYgZGV2aWNlIHR5cGUgaXMgaW52YWxpZCAqLworCQkJY29udGludWU7CisJCX0KKwkJY2hpbGRfZGV2X3B0ciA9IGRldl9wcml2LT5jaGlsZF9kZXYgKyBjb3VudDsKKwkJY291bnQrKzsKKwkJbWVtY3B5KCh2b2lkICopY2hpbGRfZGV2X3B0ciwgKHZvaWQgKilwX2NoaWxkLAorCQkJCQlzaXplb2YoKnBfY2hpbGQpKTsKKwl9CisJcmV0dXJuOworfQogLyoqCiAgKiBpbnRlbF9pbml0X2Jpb3MgLSBpbml0aWFsaXplIFZCSU9TIHNldHRpbmdzICYgZmluZCBWQlQKICAqIEBkZXY6IERSTSBkZXZpY2UKQEAgLTQxNyw2ICs1MTksNyBAQAogCXBhcnNlX2xmcF9wYW5lbF9kYXRhKGRldl9wcml2LCBiZGIpOwogCXBhcnNlX3Nkdm9fcGFuZWxfZGF0YShkZXZfcHJpdiwgYmRiKTsKIAlwYXJzZV9zZHZvX2RldmljZV9tYXBwaW5nKGRldl9wcml2LCBiZGIpOworCXBhcnNlX2RldmljZV9tYXBwaW5nKGRldl9wcml2LCBiZGIpOwogCXBhcnNlX2RyaXZlcl9mZWF0dXJlcyhkZXZfcHJpdiwgYmRiKTsKIAogCXBjaV91bm1hcF9yb20ocGRldiwgYmlvcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9iaW9zLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9iaW9zLmgKaW5kZXggMGY4ZTVmNi4uNDI1YWM5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Jpb3MuaApAQCAtNTQ5LDQgKzU0OSwyMSBAQAogI2RlZmluZSAgIFNXRjE0X0FQTV9TVEFOREJZCTB4MQogI2RlZmluZSAgIFNXRjE0X0FQTV9SRVNUT1JFCTB4MAogCisvKiBBZGQgdGhlIGRldmljZSBjbGFzcyBmb3IgTEZQLCBUViwgSERNSSAqLworI2RlZmluZQkgREVWSUNFX1RZUEVfSU5UX0xGUAkweDEwMjIKKyNkZWZpbmUJIERFVklDRV9UWVBFX0lOVF9UVgkweDEwMDkKKyNkZWZpbmUJIERFVklDRV9UWVBFX0hETUkJMHg2MEQyCisjZGVmaW5lCSBERVZJQ0VfVFlQRV9EUAkJMHg2OEM2CisjZGVmaW5lCSBERVZJQ0VfVFlQRV9lRFAJMHg3OEM2CisKKy8qIGRlZmluZSB0aGUgRFZPIHBvcnQgZm9yIEhETUkgb3V0cHV0IHR5cGUgKi8KKyNkZWZpbmUJCURWT19CCQkxCisjZGVmaW5lCQlEVk9fQwkJMgorI2RlZmluZQkJRFZPX0QJCTMKKworLyogZGVmaW5lIHRoZSBQT1JUIGZvciBEUCBvdXRwdXQgdHlwZSAqLworI2RlZmluZQkJUE9SVF9JRFBCCTcKKyNkZWZpbmUJCVBPUlRfSURQQwk4CisjZGVmaW5lCQlQT1JUX0lEUEQJOQorCiAjZW5kaWYgLyogX0k4MzBfQklPU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3J0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jcnQuYwppbmRleCBlNTA1MTQ0Li45ZjNkM2U1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jcnQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jcnQuYwpAQCAtMzksNyArMzksNyBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHRlbXAsIHJlZzsKIAotCWlmIChJU19JR0RORyhkZXYpKQorCWlmIChJU19JUk9OTEFLRShkZXYpKQogCQlyZWcgPSBQQ0hfQURQQTsKIAllbHNlCiAJCXJlZyA9IEFEUEE7CkBAIC02NCwzNCArNjQsNiBAQAogCX0KIAogCUk5MTVfV1JJVEUocmVnLCB0ZW1wKTsKLQotCWlmIChJU19JR0QoZGV2KSkgewotCQlpZiAobW9kZSA9PSBEUk1fTU9ERV9EUE1TX09GRikgewotCQkJLyogdHVybiBvZmYgREFDICovCi0JCQl0ZW1wID0gSTkxNV9SRUFEKFBPUlRfSE9UUExVR19FTik7Ci0JCQl0ZW1wICY9IH5DUlRfRU9TX0lOVF9FTjsKLQkJCUk5MTVfV1JJVEUoUE9SVF9IT1RQTFVHX0VOLCB0ZW1wKTsKLQotCQkJdGVtcCA9IEk5MTVfUkVBRChQT1JUX0hPVFBMVUdfU1RBVCk7Ci0JCQlpZiAodGVtcCAmIENSVF9FT1NfSU5UX1NUQVRVUykKLQkJCQlJOTE1X1dSSVRFKFBPUlRfSE9UUExVR19TVEFULAotCQkJCQlDUlRfRU9TX0lOVF9TVEFUVVMpOwotCQl9IGVsc2UgewotCQkJLyogdHVybiBvbiBEQUMuIEVPUyBpbnRlcnJ1cHQgbXVzdCBiZSBlbmFibGVkIGFmdGVyIERBQwotCQkJICogaXMgZW5hYmxlZCwgc28gaXQgc291bmRzIG5vdCBnb29kIHRvIGVuYWJsZSBpdCBpbgotCQkJICogaTkxNV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKCkKLQkJCSAqIHdhaXQgMTIuNW1zIGFmdGVyIERBQyBpcyBlbmFibGVkCi0JCQkgKi8KLQkJCW1zbGVlcCgxMyk7Ci0JCQl0ZW1wID0gSTkxNV9SRUFEKFBPUlRfSE9UUExVR19TVEFUKTsKLQkJCWlmICh0ZW1wICYgQ1JUX0VPU19JTlRfU1RBVFVTKQotCQkJCUk5MTVfV1JJVEUoUE9SVF9IT1RQTFVHX1NUQVQsCi0JCQkJCUNSVF9FT1NfSU5UX1NUQVRVUyk7Ci0JCQl0ZW1wID0gSTkxNV9SRUFEKFBPUlRfSE9UUExVR19FTik7Ci0JCQl0ZW1wIHw9IENSVF9FT1NfSU5UX0VOOwotCQkJSTkxNV9XUklURShQT1JUX0hPVFBMVUdfRU4sIHRlbXApOwotCQl9Ci0JfQogfQogCiBzdGF0aWMgaW50IGludGVsX2NydF9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCkBAIC0xNDEsNyArMTEzLDcgQEAKIAllbHNlCiAJCWRwbGxfbWRfcmVnID0gRFBMTF9CX01EOwogCi0JaWYgKElTX0lHRE5HKGRldikpCisJaWYgKElTX0lST05MQUtFKGRldikpCiAJCWFkcGFfcmVnID0gUENIX0FEUEE7CiAJZWxzZQogCQlhZHBhX3JlZyA9IEFEUEE7CkBAIC0xNTAsNyArMTIyLDcgQEAKIAkgKiBEaXNhYmxlIHNlcGFyYXRlIG1vZGUgbXVsdGlwbGllciB1c2VkIHdoZW4gY2xvbmluZyBTRFZPIHRvIENSVAogCSAqIFhYWCB0aGlzIG5lZWRzIHRvIGJlIGFkanVzdGVkIHdoZW4gd2UgcmVhbGx5IGFyZSBjbG9uaW5nCiAJICovCi0JaWYgKElTX0k5NjVHKGRldikgJiYgIUlTX0lHRE5HKGRldikpIHsKKwlpZiAoSVNfSTk2NUcoZGV2KSAmJiAhSVNfSVJPTkxBS0UoZGV2KSkgewogCQlkcGxsX21kID0gSTkxNV9SRUFEKGRwbGxfbWRfcmVnKTsKIAkJSTkxNV9XUklURShkcGxsX21kX3JlZywKIAkJCSAgIGRwbGxfbWQgJiB+RFBMTF9NRF9VRElfTVVMVElQTElFUl9NQVNLKTsKQEAgLTE2NCwxOCArMTM2LDE4IEBACiAKIAlpZiAoaW50ZWxfY3J0Yy0+cGlwZSA9PSAwKSB7CiAJCWFkcGEgfD0gQURQQV9QSVBFX0FfU0VMRUNUOwotCQlpZiAoIUlTX0lHRE5HKGRldikpCisJCWlmICghSVNfSVJPTkxBS0UoZGV2KSkKIAkJCUk5MTVfV1JJVEUoQkNMUlBBVF9BLCAwKTsKIAl9IGVsc2UgewogCQlhZHBhIHw9IEFEUEFfUElQRV9CX1NFTEVDVDsKLQkJaWYgKCFJU19JR0RORyhkZXYpKQorCQlpZiAoIUlTX0lST05MQUtFKGRldikpCiAJCQlJOTE1X1dSSVRFKEJDTFJQQVRfQiwgMCk7CiAJfQogCiAJSTkxNV9XUklURShhZHBhX3JlZywgYWRwYSk7CiB9CiAKLXN0YXRpYyBib29sIGludGVsX2lnZG5nX2NydF9kZXRlY3RfaG90cGx1ZyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQorc3RhdGljIGJvb2wgaW50ZWxfaXJvbmxha2VfY3J0X2RldGVjdF9ob3RwbHVnKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xOTQsNyArMTY2LDcgQEAKIAkJCUFEUEFfQ1JUX0hPVFBMVUdfRU5BQkxFIHwKIAkJCUFEUEFfQ1JUX0hPVFBMVUdfRk9SQ0VfVFJJR0dFUik7CiAKLQlEUk1fREVCVUcoInBjaCBjcnQgYWRwYSAweCV4IiwgYWRwYSk7CisJRFJNX0RFQlVHX0tNUygicGNoIGNydCBhZHBhIDB4JXgiLCBhZHBhKTsKIAlJOTE1X1dSSVRFKFBDSF9BRFBBLCBhZHBhKTsKIAogCXdoaWxlICgoSTkxNV9SRUFEKFBDSF9BRFBBKSAmIEFEUEFfQ1JUX0hPVFBMVUdfRk9SQ0VfVFJJR0dFUikgIT0gMCkKQEAgLTIyNyw4ICsxOTksOCBAQAogCXUzMiBob3RwbHVnX2VuOwogCWludCBpLCB0cmllcyA9IDA7CiAKLQlpZiAoSVNfSUdETkcoZGV2KSkKLQkJcmV0dXJuIGludGVsX2lnZG5nX2NydF9kZXRlY3RfaG90cGx1Zyhjb25uZWN0b3IpOworCWlmIChJU19JUk9OTEFLRShkZXYpKQorCQlyZXR1cm4gaW50ZWxfaXJvbmxha2VfY3J0X2RldGVjdF9ob3RwbHVnKGNvbm5lY3Rvcik7CiAKIAkvKgogCSAqIE9uIDQgc2VyaWVzIGRlc2t0b3AsIENSVCBkZXRlY3Qgc2VxdWVuY2UgbmVlZCB0byBiZSBkb25lIHR3aWNlCkBAIC01NDksMTIgKzUyMSwxMiBAQAogCQkJCQkgICZpbnRlbF9vdXRwdXQtPmVuYyk7CiAKIAkvKiBTZXQgdXAgdGhlIEREQyBidXMuICovCi0JaWYgKElTX0lHRE5HKGRldikpCisJaWYgKElTX0lST05MQUtFKGRldikpCiAJCWkyY19yZWcgPSBQQ0hfR1BJT0E7CiAJZWxzZSB7CiAJCWkyY19yZWcgPSBHUElPQTsKIAkJLyogVXNlIFZCVCBpbmZvcm1hdGlvbiBmb3IgQ1JUIEREQyBpZiBhdmFpbGFibGUgKi8KLQkJaWYgKGRldl9wcml2LT5jcnRfZGRjX2J1cyAhPSAtMSkKKwkJaWYgKGRldl9wcml2LT5jcnRfZGRjX2J1cyAhPSAwKQogCQkJaTJjX3JlZyA9IGRldl9wcml2LT5jcnRfZGRjX2J1czsKIAl9CiAJaW50ZWxfb3V0cHV0LT5kZGNfYnVzID0gaW50ZWxfaTJjX2NyZWF0ZShkZXYsIGkyY19yZWcsICJDUlRERENfQSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCmluZGV4IDA5OWY0MjAuLjUyY2Q5YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlICJpbnRlbF9kcnYuaCIKICNpbmNsdWRlICJpOTE1X2RybS5oIgogI2luY2x1ZGUgImk5MTVfZHJ2LmgiCi0jaW5jbHVkZSAiaW50ZWxfZHAuaCIKKyNpbmNsdWRlICJkcm1fZHBfaGVscGVyLmgiCiAKICNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKIApAQCAtMTAyLDMyICsxMDIsMzIgQEAKICNkZWZpbmUgSTlYWF9ET1RfTUFYCQkgNDAwMDAwCiAjZGVmaW5lIEk5WFhfVkNPX01JTgkJMTQwMDAwMAogI2RlZmluZSBJOVhYX1ZDT19NQVgJCTI4MDAwMDAKLSNkZWZpbmUgSUdEX1ZDT19NSU4JCTE3MDAwMDAKLSNkZWZpbmUgSUdEX1ZDT19NQVgJCTM1MDAwMDAKKyNkZWZpbmUgUElORVZJRVdfVkNPX01JTgkJMTcwMDAwMAorI2RlZmluZSBQSU5FVklFV19WQ09fTUFYCQkzNTAwMDAwCiAjZGVmaW5lIEk5WFhfTl9NSU4JCSAgICAgIDEKICNkZWZpbmUgSTlYWF9OX01BWAkJICAgICAgNgotLyogSUdEJ3MgTmNvdW50ZXIgaXMgYSByaW5nIGNvdW50ZXIgKi8KLSNkZWZpbmUgSUdEX05fTUlOCQkgICAgICAzCi0jZGVmaW5lIElHRF9OX01BWAkJICAgICAgNgorLyogUGluZXZpZXcncyBOY291bnRlciBpcyBhIHJpbmcgY291bnRlciAqLworI2RlZmluZSBQSU5FVklFV19OX01JTgkJICAgICAgMworI2RlZmluZSBQSU5FVklFV19OX01BWAkJICAgICAgNgogI2RlZmluZSBJOVhYX01fTUlOCQkgICAgIDcwCiAjZGVmaW5lIEk5WFhfTV9NQVgJCSAgICAxMjAKLSNkZWZpbmUgSUdEX01fTUlOCQkgICAgICAyCi0jZGVmaW5lIElHRF9NX01BWAkJICAgIDI1NgorI2RlZmluZSBQSU5FVklFV19NX01JTgkJICAgICAgMgorI2RlZmluZSBQSU5FVklFV19NX01BWAkJICAgIDI1NgogI2RlZmluZSBJOVhYX00xX01JTgkJICAgICAxMAogI2RlZmluZSBJOVhYX00xX01BWAkJICAgICAyMgogI2RlZmluZSBJOVhYX00yX01JTgkJICAgICAgNQogI2RlZmluZSBJOVhYX00yX01BWAkJICAgICAgOQotLyogSUdEIE0xIGlzIHJlc2VydmVkLCBhbmQgbXVzdCBiZSAwICovCi0jZGVmaW5lIElHRF9NMV9NSU4JCSAgICAgIDAKLSNkZWZpbmUgSUdEX00xX01BWAkJICAgICAgMAotI2RlZmluZSBJR0RfTTJfTUlOCQkgICAgICAwCi0jZGVmaW5lIElHRF9NMl9NQVgJCSAgICAgIDI1NAorLyogUGluZXZpZXcgTTEgaXMgcmVzZXJ2ZWQsIGFuZCBtdXN0IGJlIDAgKi8KKyNkZWZpbmUgUElORVZJRVdfTTFfTUlOCQkgICAgICAwCisjZGVmaW5lIFBJTkVWSUVXX00xX01BWAkJICAgICAgMAorI2RlZmluZSBQSU5FVklFV19NMl9NSU4JCSAgICAgIDAKKyNkZWZpbmUgUElORVZJRVdfTTJfTUFYCQkgICAgICAyNTQKICNkZWZpbmUgSTlYWF9QX1NEVk9fREFDX01JTgkgICAgICA1CiAjZGVmaW5lIEk5WFhfUF9TRFZPX0RBQ19NQVgJICAgICA4MAogI2RlZmluZSBJOVhYX1BfTFZEU19NSU4JCSAgICAgIDcKICNkZWZpbmUgSTlYWF9QX0xWRFNfTUFYCQkgICAgIDk4Ci0jZGVmaW5lIElHRF9QX0xWRFNfTUlOCQkgICAgICA3Ci0jZGVmaW5lIElHRF9QX0xWRFNfTUFYCQkgICAgIDExMgorI2RlZmluZSBQSU5FVklFV19QX0xWRFNfTUlOCQkgICAgICA3CisjZGVmaW5lIFBJTkVWSUVXX1BfTFZEU19NQVgJCSAgICAgMTEyCiAjZGVmaW5lIEk5WFhfUDFfTUlOCQkgICAgICAxCiAjZGVmaW5lIEk5WFhfUDFfTUFYCQkgICAgICA4CiAjZGVmaW5lIEk5WFhfUDJfU0RWT19EQUNfU0xPVwkJICAgICAxMApAQCAtMjM0LDMzICsyMzQsMzMgQEAKICNkZWZpbmUgRzRYX1AyX0RJU1BMQVlfUE9SVF9GQVNUICAgICAgICAgICAxMAogI2RlZmluZSBHNFhfUDJfRElTUExBWV9QT1JUX0xJTUlUICAgICAgICAgIDAKIAotLyogSUdETkcgKi8KKy8qIElyb25sYWtlICovCiAvKiBhcyB3ZSBjYWxjdWxhdGUgY2xvY2sgdXNpbmcgKHJlZ2lzdGVyX3ZhbHVlICsgMikgZm9yCiAgICBOL00xL00yLCBzbyBoZXJlIHRoZSByYW5nZSB2YWx1ZSBmb3IgdGhlbSBpcyAoYWN0dWFsX3ZhbHVlLTIpLgogICovCi0jZGVmaW5lIElHRE5HX0RPVF9NSU4gICAgICAgICAyNTAwMAotI2RlZmluZSBJR0ROR19ET1RfTUFYICAgICAgICAgMzUwMDAwCi0jZGVmaW5lIElHRE5HX1ZDT19NSU4gICAgICAgICAxNzYwMDAwCi0jZGVmaW5lIElHRE5HX1ZDT19NQVggICAgICAgICAzNTEwMDAwCi0jZGVmaW5lIElHRE5HX05fTUlOICAgICAgICAgICAxCi0jZGVmaW5lIElHRE5HX05fTUFYICAgICAgICAgICA1Ci0jZGVmaW5lIElHRE5HX01fTUlOICAgICAgICAgICA3OQotI2RlZmluZSBJR0ROR19NX01BWCAgICAgICAgICAgMTE4Ci0jZGVmaW5lIElHRE5HX00xX01JTiAgICAgICAgICAxMgotI2RlZmluZSBJR0ROR19NMV9NQVggICAgICAgICAgMjMKLSNkZWZpbmUgSUdETkdfTTJfTUlOICAgICAgICAgIDUKLSNkZWZpbmUgSUdETkdfTTJfTUFYICAgICAgICAgIDkKLSNkZWZpbmUgSUdETkdfUF9TRFZPX0RBQ19NSU4gIDUKLSNkZWZpbmUgSUdETkdfUF9TRFZPX0RBQ19NQVggIDgwCi0jZGVmaW5lIElHRE5HX1BfTFZEU19NSU4gICAgICAyOAotI2RlZmluZSBJR0ROR19QX0xWRFNfTUFYICAgICAgMTEyCi0jZGVmaW5lIElHRE5HX1AxX01JTiAgICAgICAgICAxCi0jZGVmaW5lIElHRE5HX1AxX01BWCAgICAgICAgICA4Ci0jZGVmaW5lIElHRE5HX1AyX1NEVk9fREFDX1NMT1cgMTAKLSNkZWZpbmUgSUdETkdfUDJfU0RWT19EQUNfRkFTVCA1Ci0jZGVmaW5lIElHRE5HX1AyX0xWRFNfU0xPVyAgICAxNCAvKiBzaW5nbGUgY2hhbm5lbCAqLwotI2RlZmluZSBJR0ROR19QMl9MVkRTX0ZBU1QgICAgNyAgLyogZG91YmxlIGNoYW5uZWwgKi8KLSNkZWZpbmUgSUdETkdfUDJfRE9UX0xJTUlUICAgIDIyNTAwMCAvKiAyMjVNaHogKi8KKyNkZWZpbmUgSVJPTkxBS0VfRE9UX01JTiAgICAgICAgIDI1MDAwCisjZGVmaW5lIElST05MQUtFX0RPVF9NQVggICAgICAgICAzNTAwMDAKKyNkZWZpbmUgSVJPTkxBS0VfVkNPX01JTiAgICAgICAgIDE3NjAwMDAKKyNkZWZpbmUgSVJPTkxBS0VfVkNPX01BWCAgICAgICAgIDM1MTAwMDAKKyNkZWZpbmUgSVJPTkxBS0VfTl9NSU4gICAgICAgICAgIDEKKyNkZWZpbmUgSVJPTkxBS0VfTl9NQVggICAgICAgICAgIDUKKyNkZWZpbmUgSVJPTkxBS0VfTV9NSU4gICAgICAgICAgIDc5CisjZGVmaW5lIElST05MQUtFX01fTUFYICAgICAgICAgICAxMTgKKyNkZWZpbmUgSVJPTkxBS0VfTTFfTUlOICAgICAgICAgIDEyCisjZGVmaW5lIElST05MQUtFX00xX01BWCAgICAgICAgICAyMworI2RlZmluZSBJUk9OTEFLRV9NMl9NSU4gICAgICAgICAgNQorI2RlZmluZSBJUk9OTEFLRV9NMl9NQVggICAgICAgICAgOQorI2RlZmluZSBJUk9OTEFLRV9QX1NEVk9fREFDX01JTiAgNQorI2RlZmluZSBJUk9OTEFLRV9QX1NEVk9fREFDX01BWCAgODAKKyNkZWZpbmUgSVJPTkxBS0VfUF9MVkRTX01JTiAgICAgIDI4CisjZGVmaW5lIElST05MQUtFX1BfTFZEU19NQVggICAgICAxMTIKKyNkZWZpbmUgSVJPTkxBS0VfUDFfTUlOICAgICAgICAgIDEKKyNkZWZpbmUgSVJPTkxBS0VfUDFfTUFYICAgICAgICAgIDgKKyNkZWZpbmUgSVJPTkxBS0VfUDJfU0RWT19EQUNfU0xPVyAxMAorI2RlZmluZSBJUk9OTEFLRV9QMl9TRFZPX0RBQ19GQVNUIDUKKyNkZWZpbmUgSVJPTkxBS0VfUDJfTFZEU19TTE9XICAgIDE0IC8qIHNpbmdsZSBjaGFubmVsICovCisjZGVmaW5lIElST05MQUtFX1AyX0xWRFNfRkFTVCAgICA3ICAvKiBkb3VibGUgY2hhbm5lbCAqLworI2RlZmluZSBJUk9OTEFLRV9QMl9ET1RfTElNSVQgICAgMjI1MDAwIC8qIDIyNU1oeiAqLwogCiBzdGF0aWMgYm9vbAogaW50ZWxfZmluZF9iZXN0X1BMTChjb25zdCBpbnRlbF9saW1pdF90ICpsaW1pdCwgc3RydWN0IGRybV9jcnRjICpjcnRjLApAQCAtMjcyLDE1ICsyNzIsMTUgQEAKIGludGVsX2c0eF9maW5kX2Jlc3RfUExMKGNvbnN0IGludGVsX2xpbWl0X3QgKmxpbWl0LCBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCQlpbnQgdGFyZ2V0LCBpbnQgcmVmY2xrLCBpbnRlbF9jbG9ja190ICpiZXN0X2Nsb2NrKTsKIHN0YXRpYyBib29sCi1pbnRlbF9pZ2RuZ19maW5kX2Jlc3RfUExMKGNvbnN0IGludGVsX2xpbWl0X3QgKmxpbWl0LCBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCi0JCQlpbnQgdGFyZ2V0LCBpbnQgcmVmY2xrLCBpbnRlbF9jbG9ja190ICpiZXN0X2Nsb2NrKTsKK2ludGVsX2lyb25sYWtlX2ZpbmRfYmVzdF9QTEwoY29uc3QgaW50ZWxfbGltaXRfdCAqbGltaXQsIHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCSAgICAgaW50IHRhcmdldCwgaW50IHJlZmNsaywgaW50ZWxfY2xvY2tfdCAqYmVzdF9jbG9jayk7CiAKIHN0YXRpYyBib29sCiBpbnRlbF9maW5kX3BsbF9nNHhfZHAoY29uc3QgaW50ZWxfbGltaXRfdCAqLCBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCSAgICAgIGludCB0YXJnZXQsIGludCByZWZjbGssIGludGVsX2Nsb2NrX3QgKmJlc3RfY2xvY2spOwogc3RhdGljIGJvb2wKLWludGVsX2ZpbmRfcGxsX2lnZG5nX2RwKGNvbnN0IGludGVsX2xpbWl0X3QgKiwgc3RydWN0IGRybV9jcnRjICpjcnRjLAotCQkgICAgICBpbnQgdGFyZ2V0LCBpbnQgcmVmY2xrLCBpbnRlbF9jbG9ja190ICpiZXN0X2Nsb2NrKTsKK2ludGVsX2ZpbmRfcGxsX2lyb25sYWtlX2RwKGNvbnN0IGludGVsX2xpbWl0X3QgKiwgc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJICAgaW50IHRhcmdldCwgaW50IHJlZmNsaywgaW50ZWxfY2xvY2tfdCAqYmVzdF9jbG9jayk7CiAKIHN0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90IGludGVsX2xpbWl0c19pOHh4X2R2byA9IHsKICAgICAgICAgLmRvdCA9IHsgLm1pbiA9IEk4WFhfRE9UX01JTiwJCS5tYXggPSBJOFhYX0RPVF9NQVggfSwKQEAgLTQ1MywxMyArNDUzLDEzIEBACiAgICAgICAgIC5maW5kX3BsbCA9IGludGVsX2ZpbmRfcGxsX2c0eF9kcCwKIH07CiAKLXN0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90IGludGVsX2xpbWl0c19pZ2Rfc2R2byA9IHsKK3N0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90IGludGVsX2xpbWl0c19waW5ldmlld19zZHZvID0gewogICAgICAgICAuZG90ID0geyAubWluID0gSTlYWF9ET1RfTUlOLAkJLm1heCA9IEk5WFhfRE9UX01BWH0sCi0gICAgICAgIC52Y28gPSB7IC5taW4gPSBJR0RfVkNPX01JTiwJCS5tYXggPSBJR0RfVkNPX01BWCB9LAotICAgICAgICAubiAgID0geyAubWluID0gSUdEX05fTUlOLAkJLm1heCA9IElHRF9OX01BWCB9LAotICAgICAgICAubSAgID0geyAubWluID0gSUdEX01fTUlOLAkJLm1heCA9IElHRF9NX01BWCB9LAotICAgICAgICAubTEgID0geyAubWluID0gSUdEX00xX01JTiwJCS5tYXggPSBJR0RfTTFfTUFYIH0sCi0gICAgICAgIC5tMiAgPSB7IC5taW4gPSBJR0RfTTJfTUlOLAkJLm1heCA9IElHRF9NMl9NQVggfSwKKyAgICAgICAgLnZjbyA9IHsgLm1pbiA9IFBJTkVWSUVXX1ZDT19NSU4sCQkubWF4ID0gUElORVZJRVdfVkNPX01BWCB9LAorICAgICAgICAubiAgID0geyAubWluID0gUElORVZJRVdfTl9NSU4sCQkubWF4ID0gUElORVZJRVdfTl9NQVggfSwKKyAgICAgICAgLm0gICA9IHsgLm1pbiA9IFBJTkVWSUVXX01fTUlOLAkJLm1heCA9IFBJTkVWSUVXX01fTUFYIH0sCisgICAgICAgIC5tMSAgPSB7IC5taW4gPSBQSU5FVklFV19NMV9NSU4sCQkubWF4ID0gUElORVZJRVdfTTFfTUFYIH0sCisgICAgICAgIC5tMiAgPSB7IC5taW4gPSBQSU5FVklFV19NMl9NSU4sCQkubWF4ID0gUElORVZJRVdfTTJfTUFYIH0sCiAgICAgICAgIC5wICAgPSB7IC5taW4gPSBJOVhYX1BfU0RWT19EQUNfTUlOLCAgICAubWF4ID0gSTlYWF9QX1NEVk9fREFDX01BWCB9LAogICAgICAgICAucDEgID0geyAubWluID0gSTlYWF9QMV9NSU4sCQkubWF4ID0gSTlYWF9QMV9NQVggfSwKIAkucDIgID0geyAuZG90X2xpbWl0ID0gSTlYWF9QMl9TRFZPX0RBQ19TTE9XX0xJTUlULApAQCAtNDY4LDU5ICs0NjgsNTkgQEAKIAkuZmluZF9yZWR1Y2VkX3BsbCA9IGludGVsX2ZpbmRfYmVzdF9yZWR1Y2VkX1BMTCwKIH07CiAKLXN0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90IGludGVsX2xpbWl0c19pZ2RfbHZkcyA9IHsKK3N0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90IGludGVsX2xpbWl0c19waW5ldmlld19sdmRzID0gewogICAgICAgICAuZG90ID0geyAubWluID0gSTlYWF9ET1RfTUlOLAkJLm1heCA9IEk5WFhfRE9UX01BWCB9LAotICAgICAgICAudmNvID0geyAubWluID0gSUdEX1ZDT19NSU4sCQkubWF4ID0gSUdEX1ZDT19NQVggfSwKLSAgICAgICAgLm4gICA9IHsgLm1pbiA9IElHRF9OX01JTiwJCS5tYXggPSBJR0RfTl9NQVggfSwKLSAgICAgICAgLm0gICA9IHsgLm1pbiA9IElHRF9NX01JTiwJCS5tYXggPSBJR0RfTV9NQVggfSwKLSAgICAgICAgLm0xICA9IHsgLm1pbiA9IElHRF9NMV9NSU4sCQkubWF4ID0gSUdEX00xX01BWCB9LAotICAgICAgICAubTIgID0geyAubWluID0gSUdEX00yX01JTiwJCS5tYXggPSBJR0RfTTJfTUFYIH0sCi0gICAgICAgIC5wICAgPSB7IC5taW4gPSBJR0RfUF9MVkRTX01JTiwJLm1heCA9IElHRF9QX0xWRFNfTUFYIH0sCisgICAgICAgIC52Y28gPSB7IC5taW4gPSBQSU5FVklFV19WQ09fTUlOLAkJLm1heCA9IFBJTkVWSUVXX1ZDT19NQVggfSwKKyAgICAgICAgLm4gICA9IHsgLm1pbiA9IFBJTkVWSUVXX05fTUlOLAkJLm1heCA9IFBJTkVWSUVXX05fTUFYIH0sCisgICAgICAgIC5tICAgPSB7IC5taW4gPSBQSU5FVklFV19NX01JTiwJCS5tYXggPSBQSU5FVklFV19NX01BWCB9LAorICAgICAgICAubTEgID0geyAubWluID0gUElORVZJRVdfTTFfTUlOLAkJLm1heCA9IFBJTkVWSUVXX00xX01BWCB9LAorICAgICAgICAubTIgID0geyAubWluID0gUElORVZJRVdfTTJfTUlOLAkJLm1heCA9IFBJTkVWSUVXX00yX01BWCB9LAorICAgICAgICAucCAgID0geyAubWluID0gUElORVZJRVdfUF9MVkRTX01JTiwJLm1heCA9IFBJTkVWSUVXX1BfTFZEU19NQVggfSwKICAgICAgICAgLnAxICA9IHsgLm1pbiA9IEk5WFhfUDFfTUlOLAkJLm1heCA9IEk5WFhfUDFfTUFYIH0sCi0JLyogSUdEIG9ubHkgc3VwcG9ydHMgc2luZ2xlLWNoYW5uZWwgbW9kZS4gKi8KKwkvKiBQaW5ldmlldyBvbmx5IHN1cHBvcnRzIHNpbmdsZS1jaGFubmVsIG1vZGUuICovCiAJLnAyICA9IHsgLmRvdF9saW1pdCA9IEk5WFhfUDJfTFZEU19TTE9XX0xJTUlULAogCQkgLnAyX3Nsb3cgPSBJOVhYX1AyX0xWRFNfU0xPVywJLnAyX2Zhc3QgPSBJOVhYX1AyX0xWRFNfU0xPVyB9LAogCS5maW5kX3BsbCA9IGludGVsX2ZpbmRfYmVzdF9QTEwsCiAJLmZpbmRfcmVkdWNlZF9wbGwgPSBpbnRlbF9maW5kX2Jlc3RfcmVkdWNlZF9QTEwsCiB9OwogCi1zdGF0aWMgY29uc3QgaW50ZWxfbGltaXRfdCBpbnRlbF9saW1pdHNfaWdkbmdfc2R2byA9IHsKLQkuZG90ID0geyAubWluID0gSUdETkdfRE9UX01JTiwgICAgICAgICAgLm1heCA9IElHRE5HX0RPVF9NQVggfSwKLQkudmNvID0geyAubWluID0gSUdETkdfVkNPX01JTiwgICAgICAgICAgLm1heCA9IElHRE5HX1ZDT19NQVggfSwKLQkubiAgID0geyAubWluID0gSUdETkdfTl9NSU4sICAgICAgICAgICAgLm1heCA9IElHRE5HX05fTUFYIH0sCi0JLm0gICA9IHsgLm1pbiA9IElHRE5HX01fTUlOLCAgICAgICAgICAgIC5tYXggPSBJR0ROR19NX01BWCB9LAotCS5tMSAgPSB7IC5taW4gPSBJR0ROR19NMV9NSU4sICAgICAgICAgICAubWF4ID0gSUdETkdfTTFfTUFYIH0sCi0JLm0yICA9IHsgLm1pbiA9IElHRE5HX00yX01JTiwgICAgICAgICAgIC5tYXggPSBJR0ROR19NMl9NQVggfSwKLQkucCAgID0geyAubWluID0gSUdETkdfUF9TRFZPX0RBQ19NSU4sICAgLm1heCA9IElHRE5HX1BfU0RWT19EQUNfTUFYIH0sCi0JLnAxICA9IHsgLm1pbiA9IElHRE5HX1AxX01JTiwgICAgICAgICAgIC5tYXggPSBJR0ROR19QMV9NQVggfSwKLQkucDIgID0geyAuZG90X2xpbWl0ID0gSUdETkdfUDJfRE9UX0xJTUlULAotCQkgLnAyX3Nsb3cgPSBJR0ROR19QMl9TRFZPX0RBQ19TTE9XLAotCQkgLnAyX2Zhc3QgPSBJR0ROR19QMl9TRFZPX0RBQ19GQVNUIH0sCi0JLmZpbmRfcGxsID0gaW50ZWxfaWdkbmdfZmluZF9iZXN0X1BMTCwKK3N0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90IGludGVsX2xpbWl0c19pcm9ubGFrZV9zZHZvID0geworCS5kb3QgPSB7IC5taW4gPSBJUk9OTEFLRV9ET1RfTUlOLCAgICAgICAgICAubWF4ID0gSVJPTkxBS0VfRE9UX01BWCB9LAorCS52Y28gPSB7IC5taW4gPSBJUk9OTEFLRV9WQ09fTUlOLCAgICAgICAgICAubWF4ID0gSVJPTkxBS0VfVkNPX01BWCB9LAorCS5uICAgPSB7IC5taW4gPSBJUk9OTEFLRV9OX01JTiwgICAgICAgICAgICAubWF4ID0gSVJPTkxBS0VfTl9NQVggfSwKKwkubSAgID0geyAubWluID0gSVJPTkxBS0VfTV9NSU4sICAgICAgICAgICAgLm1heCA9IElST05MQUtFX01fTUFYIH0sCisJLm0xICA9IHsgLm1pbiA9IElST05MQUtFX00xX01JTiwgICAgICAgICAgIC5tYXggPSBJUk9OTEFLRV9NMV9NQVggfSwKKwkubTIgID0geyAubWluID0gSVJPTkxBS0VfTTJfTUlOLCAgICAgICAgICAgLm1heCA9IElST05MQUtFX00yX01BWCB9LAorCS5wICAgPSB7IC5taW4gPSBJUk9OTEFLRV9QX1NEVk9fREFDX01JTiwgICAubWF4ID0gSVJPTkxBS0VfUF9TRFZPX0RBQ19NQVggfSwKKwkucDEgID0geyAubWluID0gSVJPTkxBS0VfUDFfTUlOLCAgICAgICAgICAgLm1heCA9IElST05MQUtFX1AxX01BWCB9LAorCS5wMiAgPSB7IC5kb3RfbGltaXQgPSBJUk9OTEFLRV9QMl9ET1RfTElNSVQsCisJCSAucDJfc2xvdyA9IElST05MQUtFX1AyX1NEVk9fREFDX1NMT1csCisJCSAucDJfZmFzdCA9IElST05MQUtFX1AyX1NEVk9fREFDX0ZBU1QgfSwKKwkuZmluZF9wbGwgPSBpbnRlbF9pcm9ubGFrZV9maW5kX2Jlc3RfUExMLAogfTsKIAotc3RhdGljIGNvbnN0IGludGVsX2xpbWl0X3QgaW50ZWxfbGltaXRzX2lnZG5nX2x2ZHMgPSB7Ci0JLmRvdCA9IHsgLm1pbiA9IElHRE5HX0RPVF9NSU4sICAgICAgICAgIC5tYXggPSBJR0ROR19ET1RfTUFYIH0sCi0JLnZjbyA9IHsgLm1pbiA9IElHRE5HX1ZDT19NSU4sICAgICAgICAgIC5tYXggPSBJR0ROR19WQ09fTUFYIH0sCi0JLm4gICA9IHsgLm1pbiA9IElHRE5HX05fTUlOLCAgICAgICAgICAgIC5tYXggPSBJR0ROR19OX01BWCB9LAotCS5tICAgPSB7IC5taW4gPSBJR0ROR19NX01JTiwgICAgICAgICAgICAubWF4ID0gSUdETkdfTV9NQVggfSwKLQkubTEgID0geyAubWluID0gSUdETkdfTTFfTUlOLCAgICAgICAgICAgLm1heCA9IElHRE5HX00xX01BWCB9LAotCS5tMiAgPSB7IC5taW4gPSBJR0ROR19NMl9NSU4sICAgICAgICAgICAubWF4ID0gSUdETkdfTTJfTUFYIH0sCi0JLnAgICA9IHsgLm1pbiA9IElHRE5HX1BfTFZEU19NSU4sICAgICAgIC5tYXggPSBJR0ROR19QX0xWRFNfTUFYIH0sCi0JLnAxICA9IHsgLm1pbiA9IElHRE5HX1AxX01JTiwgICAgICAgICAgIC5tYXggPSBJR0ROR19QMV9NQVggfSwKLQkucDIgID0geyAuZG90X2xpbWl0ID0gSUdETkdfUDJfRE9UX0xJTUlULAotCQkgLnAyX3Nsb3cgPSBJR0ROR19QMl9MVkRTX1NMT1csCi0JCSAucDJfZmFzdCA9IElHRE5HX1AyX0xWRFNfRkFTVCB9LAotCS5maW5kX3BsbCA9IGludGVsX2lnZG5nX2ZpbmRfYmVzdF9QTEwsCitzdGF0aWMgY29uc3QgaW50ZWxfbGltaXRfdCBpbnRlbF9saW1pdHNfaXJvbmxha2VfbHZkcyA9IHsKKwkuZG90ID0geyAubWluID0gSVJPTkxBS0VfRE9UX01JTiwgICAgICAgICAgLm1heCA9IElST05MQUtFX0RPVF9NQVggfSwKKwkudmNvID0geyAubWluID0gSVJPTkxBS0VfVkNPX01JTiwgICAgICAgICAgLm1heCA9IElST05MQUtFX1ZDT19NQVggfSwKKwkubiAgID0geyAubWluID0gSVJPTkxBS0VfTl9NSU4sICAgICAgICAgICAgLm1heCA9IElST05MQUtFX05fTUFYIH0sCisJLm0gICA9IHsgLm1pbiA9IElST05MQUtFX01fTUlOLCAgICAgICAgICAgIC5tYXggPSBJUk9OTEFLRV9NX01BWCB9LAorCS5tMSAgPSB7IC5taW4gPSBJUk9OTEFLRV9NMV9NSU4sICAgICAgICAgICAubWF4ID0gSVJPTkxBS0VfTTFfTUFYIH0sCisJLm0yICA9IHsgLm1pbiA9IElST05MQUtFX00yX01JTiwgICAgICAgICAgIC5tYXggPSBJUk9OTEFLRV9NMl9NQVggfSwKKwkucCAgID0geyAubWluID0gSVJPTkxBS0VfUF9MVkRTX01JTiwgICAgICAgLm1heCA9IElST05MQUtFX1BfTFZEU19NQVggfSwKKwkucDEgID0geyAubWluID0gSVJPTkxBS0VfUDFfTUlOLCAgICAgICAgICAgLm1heCA9IElST05MQUtFX1AxX01BWCB9LAorCS5wMiAgPSB7IC5kb3RfbGltaXQgPSBJUk9OTEFLRV9QMl9ET1RfTElNSVQsCisJCSAucDJfc2xvdyA9IElST05MQUtFX1AyX0xWRFNfU0xPVywKKwkJIC5wMl9mYXN0ID0gSVJPTkxBS0VfUDJfTFZEU19GQVNUIH0sCisJLmZpbmRfcGxsID0gaW50ZWxfaXJvbmxha2VfZmluZF9iZXN0X1BMTCwKIH07CiAKLXN0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90ICppbnRlbF9pZ2RuZ19saW1pdChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCitzdGF0aWMgY29uc3QgaW50ZWxfbGltaXRfdCAqaW50ZWxfaXJvbmxha2VfbGltaXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQogewogCWNvbnN0IGludGVsX2xpbWl0X3QgKmxpbWl0OwogCWlmIChpbnRlbF9waXBlX2hhc190eXBlKGNydGMsIElOVEVMX09VVFBVVF9MVkRTKSkKLQkJbGltaXQgPSAmaW50ZWxfbGltaXRzX2lnZG5nX2x2ZHM7CisJCWxpbWl0ID0gJmludGVsX2xpbWl0c19pcm9ubGFrZV9sdmRzOwogCWVsc2UKLQkJbGltaXQgPSAmaW50ZWxfbGltaXRzX2lnZG5nX3Nkdm87CisJCWxpbWl0ID0gJmludGVsX2xpbWl0c19pcm9ubGFrZV9zZHZvOwogCiAJcmV0dXJuIGxpbWl0OwogfQpAQCAtNTU3LDIwICs1NTcsMjAgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwogCWNvbnN0IGludGVsX2xpbWl0X3QgKmxpbWl0OwogCi0JaWYgKElTX0lHRE5HKGRldikpCi0JCWxpbWl0ID0gaW50ZWxfaWdkbmdfbGltaXQoY3J0Yyk7CisJaWYgKElTX0lST05MQUtFKGRldikpCisJCWxpbWl0ID0gaW50ZWxfaXJvbmxha2VfbGltaXQoY3J0Yyk7CiAJZWxzZSBpZiAoSVNfRzRYKGRldikpIHsKIAkJbGltaXQgPSBpbnRlbF9nNHhfbGltaXQoY3J0Yyk7Ci0JfSBlbHNlIGlmIChJU19JOVhYKGRldikgJiYgIUlTX0lHRChkZXYpKSB7CisJfSBlbHNlIGlmIChJU19JOVhYKGRldikgJiYgIUlTX1BJTkVWSUVXKGRldikpIHsKIAkJaWYgKGludGVsX3BpcGVfaGFzX3R5cGUoY3J0YywgSU5URUxfT1VUUFVUX0xWRFMpKQogCQkJbGltaXQgPSAmaW50ZWxfbGltaXRzX2k5eHhfbHZkczsKIAkJZWxzZQogCQkJbGltaXQgPSAmaW50ZWxfbGltaXRzX2k5eHhfc2R2bzsKLQl9IGVsc2UgaWYgKElTX0lHRChkZXYpKSB7CisJfSBlbHNlIGlmIChJU19QSU5FVklFVyhkZXYpKSB7CiAJCWlmIChpbnRlbF9waXBlX2hhc190eXBlKGNydGMsIElOVEVMX09VVFBVVF9MVkRTKSkKLQkJCWxpbWl0ID0gJmludGVsX2xpbWl0c19pZ2RfbHZkczsKKwkJCWxpbWl0ID0gJmludGVsX2xpbWl0c19waW5ldmlld19sdmRzOwogCQllbHNlCi0JCQlsaW1pdCA9ICZpbnRlbF9saW1pdHNfaWdkX3Nkdm87CisJCQlsaW1pdCA9ICZpbnRlbF9saW1pdHNfcGluZXZpZXdfc2R2bzsKIAl9IGVsc2UgewogCQlpZiAoaW50ZWxfcGlwZV9oYXNfdHlwZShjcnRjLCBJTlRFTF9PVVRQVVRfTFZEUykpCiAJCQlsaW1pdCA9ICZpbnRlbF9saW1pdHNfaTh4eF9sdmRzOwpAQCAtNTgwLDggKzU4MCw4IEBACiAJcmV0dXJuIGxpbWl0OwogfQogCi0vKiBtMSBpcyByZXNlcnZlZCBhcyAwIGluIElHRCwgbiBpcyBhIHJpbmcgY291bnRlciAqLwotc3RhdGljIHZvaWQgaWdkX2Nsb2NrKGludCByZWZjbGssIGludGVsX2Nsb2NrX3QgKmNsb2NrKQorLyogbTEgaXMgcmVzZXJ2ZWQgYXMgMCBpbiBQaW5ldmlldywgbiBpcyBhIHJpbmcgY291bnRlciAqLworc3RhdGljIHZvaWQgcGluZXZpZXdfY2xvY2soaW50IHJlZmNsaywgaW50ZWxfY2xvY2tfdCAqY2xvY2spCiB7CiAJY2xvY2stPm0gPSBjbG9jay0+bTIgKyAyOwogCWNsb2NrLT5wID0gY2xvY2stPnAxICogY2xvY2stPnAyOwpAQCAtNTkxLDggKzU5MSw4IEBACiAKIHN0YXRpYyB2b2lkIGludGVsX2Nsb2NrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCByZWZjbGssIGludGVsX2Nsb2NrX3QgKmNsb2NrKQogewotCWlmIChJU19JR0QoZGV2KSkgewotCQlpZ2RfY2xvY2socmVmY2xrLCBjbG9jayk7CisJaWYgKElTX1BJTkVWSUVXKGRldikpIHsKKwkJcGluZXZpZXdfY2xvY2socmVmY2xrLCBjbG9jayk7CiAJCXJldHVybjsKIAl9CiAJY2xvY2stPm0gPSA1ICogKGNsb2NrLT5tMSArIDIpICsgKGNsb2NrLT5tMiArIDIpOwpAQCAtNjU3LDcgKzY1Nyw3IEBACiAJCUlOVEVMUGxsSW52YWxpZCAoIm0yIG91dCBvZiByYW5nZVxuIik7CiAJaWYgKGNsb2NrLT5tMSAgPCBsaW1pdC0+bTEubWluICB8fCBsaW1pdC0+bTEubWF4ICA8IGNsb2NrLT5tMSkKIAkJSU5URUxQbGxJbnZhbGlkICgibTEgb3V0IG9mIHJhbmdlXG4iKTsKLQlpZiAoY2xvY2stPm0xIDw9IGNsb2NrLT5tMiAmJiAhSVNfSUdEKGRldikpCisJaWYgKGNsb2NrLT5tMSA8PSBjbG9jay0+bTIgJiYgIUlTX1BJTkVWSUVXKGRldikpCiAJCUlOVEVMUGxsSW52YWxpZCAoIm0xIDw9IG0yXG4iKTsKIAlpZiAoY2xvY2stPm0gICA8IGxpbWl0LT5tLm1pbiAgIHx8IGxpbWl0LT5tLm1heCAgIDwgY2xvY2stPm0pCiAJCUlOVEVMUGxsSW52YWxpZCAoIm0gb3V0IG9mIHJhbmdlXG4iKTsKQEAgLTcwNiwxNiArNzA2LDE3IEBACiAKIAltZW1zZXQgKGJlc3RfY2xvY2ssIDAsIHNpemVvZiAoKmJlc3RfY2xvY2spKTsKIAotCWZvciAoY2xvY2sucDEgPSBsaW1pdC0+cDEubWF4OyBjbG9jay5wMSA+PSBsaW1pdC0+cDEubWluOyBjbG9jay5wMS0tKSB7Ci0JCWZvciAoY2xvY2subTEgPSBsaW1pdC0+bTEubWluOyBjbG9jay5tMSA8PSBsaW1pdC0+bTEubWF4OwotCQkgICAgIGNsb2NrLm0xKyspIHsKLQkJCWZvciAoY2xvY2subTIgPSBsaW1pdC0+bTIubWluOwotCQkJICAgICBjbG9jay5tMiA8PSBsaW1pdC0+bTIubWF4OyBjbG9jay5tMisrKSB7Ci0JCQkJLyogbTEgaXMgYWx3YXlzIDAgaW4gSUdEICovCi0JCQkJaWYgKGNsb2NrLm0yID49IGNsb2NrLm0xICYmICFJU19JR0QoZGV2KSkKLQkJCQkJYnJlYWs7Ci0JCQkJZm9yIChjbG9jay5uID0gbGltaXQtPm4ubWluOwotCQkJCSAgICAgY2xvY2subiA8PSBsaW1pdC0+bi5tYXg7IGNsb2NrLm4rKykgeworCWZvciAoY2xvY2subTEgPSBsaW1pdC0+bTEubWluOyBjbG9jay5tMSA8PSBsaW1pdC0+bTEubWF4OworCSAgICAgY2xvY2subTErKykgeworCQlmb3IgKGNsb2NrLm0yID0gbGltaXQtPm0yLm1pbjsKKwkJICAgICBjbG9jay5tMiA8PSBsaW1pdC0+bTIubWF4OyBjbG9jay5tMisrKSB7CisJCQkvKiBtMSBpcyBhbHdheXMgMCBpbiBQaW5ldmlldyAqLworCQkJaWYgKGNsb2NrLm0yID49IGNsb2NrLm0xICYmICFJU19QSU5FVklFVyhkZXYpKQorCQkJCWJyZWFrOworCQkJZm9yIChjbG9jay5uID0gbGltaXQtPm4ubWluOworCQkJICAgICBjbG9jay5uIDw9IGxpbWl0LT5uLm1heDsgY2xvY2subisrKSB7CisJCQkJZm9yIChjbG9jay5wMSA9IGxpbWl0LT5wMS5taW47CisJCQkJCWNsb2NrLnAxIDw9IGxpbWl0LT5wMS5tYXg7IGNsb2NrLnAxKyspIHsKIAkJCQkJaW50IHRoaXNfZXJyOwogCiAJCQkJCWludGVsX2Nsb2NrKGRldiwgcmVmY2xrLCAmY2xvY2spOwpAQCAtNzUxLDggKzc1Miw4IEBACiAKIAlmb3IgKGNsb2NrLm0xID0gbGltaXQtPm0xLm1pbjsgY2xvY2subTEgPD0gbGltaXQtPm0xLm1heDsgY2xvY2subTErKykgewogCQlmb3IgKGNsb2NrLm0yID0gbGltaXQtPm0yLm1pbjsgY2xvY2subTIgPD0gbGltaXQtPm0yLm1heDsgY2xvY2subTIrKykgewotCQkJLyogbTEgaXMgYWx3YXlzIDAgaW4gSUdEICovCi0JCQlpZiAoY2xvY2subTIgPj0gY2xvY2subTEgJiYgIUlTX0lHRChkZXYpKQorCQkJLyogbTEgaXMgYWx3YXlzIDAgaW4gUGluZXZpZXcgKi8KKwkJCWlmIChjbG9jay5tMiA+PSBjbG9jay5tMSAmJiAhSVNfUElORVZJRVcoZGV2KSkKIAkJCQlicmVhazsKIAkJCWZvciAoY2xvY2subiA9IGxpbWl0LT5uLm1pbjsgY2xvY2subiA8PSBsaW1pdC0+bi5tYXg7CiAJCQkgICAgIGNsb2NrLm4rKykgewpAQCAtODMzLDggKzgzNCw4IEBACiB9CiAKIHN0YXRpYyBib29sCi1pbnRlbF9maW5kX3BsbF9pZ2RuZ19kcChjb25zdCBpbnRlbF9saW1pdF90ICpsaW1pdCwgc3RydWN0IGRybV9jcnRjICpjcnRjLAotCQkgICAgICBpbnQgdGFyZ2V0LCBpbnQgcmVmY2xrLCBpbnRlbF9jbG9ja190ICpiZXN0X2Nsb2NrKQoraW50ZWxfZmluZF9wbGxfaXJvbmxha2VfZHAoY29uc3QgaW50ZWxfbGltaXRfdCAqbGltaXQsIHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCSAgIGludCB0YXJnZXQsIGludCByZWZjbGssIGludGVsX2Nsb2NrX3QgKmJlc3RfY2xvY2spCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKIAlpbnRlbF9jbG9ja190IGNsb2NrOwpAQCAtODU3LDggKzg1OCw4IEBACiB9CiAKIHN0YXRpYyBib29sCi1pbnRlbF9pZ2RuZ19maW5kX2Jlc3RfUExMKGNvbnN0IGludGVsX2xpbWl0X3QgKmxpbWl0LCBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCi0JCQlpbnQgdGFyZ2V0LCBpbnQgcmVmY2xrLCBpbnRlbF9jbG9ja190ICpiZXN0X2Nsb2NrKQoraW50ZWxfaXJvbmxha2VfZmluZF9iZXN0X1BMTChjb25zdCBpbnRlbF9saW1pdF90ICpsaW1pdCwgc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJICAgICBpbnQgdGFyZ2V0LCBpbnQgcmVmY2xrLCBpbnRlbF9jbG9ja190ICpiZXN0X2Nsb2NrKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTg3MSw3ICs4NzIsNyBAQAogCQlyZXR1cm4gdHJ1ZTsKIAogCWlmIChpbnRlbF9waXBlX2hhc190eXBlKGNydGMsIElOVEVMX09VVFBVVF9ESVNQTEFZUE9SVCkpCi0JCXJldHVybiBpbnRlbF9maW5kX3BsbF9pZ2RuZ19kcChsaW1pdCwgY3J0YywgdGFyZ2V0LAorCQlyZXR1cm4gaW50ZWxfZmluZF9wbGxfaXJvbmxha2VfZHAobGltaXQsIGNydGMsIHRhcmdldCwKIAkJCQkJICAgICAgIHJlZmNsaywgYmVzdF9jbG9jayk7CiAKIAlpZiAoaW50ZWxfcGlwZV9oYXNfdHlwZShjcnRjLCBJTlRFTF9PVVRQVVRfTFZEUykpIHsKQEAgLTk0OSw3ICs5NTAsNyBAQAogaW50ZWxfd2FpdF9mb3JfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJLyogV2FpdCBmb3IgMjBtcywgaS5lLiBvbmUgY3ljbGUgYXQgNTBoei4gKi8KLQltZGVsYXkoMjApOworCW1zbGVlcCgyMCk7CiB9CiAKIC8qIFBhcmFtZXRlcnMgaGF2ZSBjaGFuZ2VkLCB1cGRhdGUgRkJDIGluZm8gKi8KQEAgLTk5NCw3ICs5OTUsNyBAQAogCQlmYmNfY3RsIHw9IGRldl9wcml2LT5jZmJfZmVuY2U7CiAJSTkxNV9XUklURShGQkNfQ09OVFJPTCwgZmJjX2N0bCk7CiAKLQlEUk1fREVCVUcoImVuYWJsZWQgRkJDLCBwaXRjaCAlbGQsIHlvZmYgJWQsIHBsYW5lICVkLCAiLAorCURSTV9ERUJVR19LTVMoImVuYWJsZWQgRkJDLCBwaXRjaCAlbGQsIHlvZmYgJWQsIHBsYW5lICVkLCAiLAogCQkgIGRldl9wcml2LT5jZmJfcGl0Y2gsIGNydGMtPnksIGRldl9wcml2LT5jZmJfcGxhbmUpOwogfQogCkBAIC0xMDE3LDcgKzEwMTgsNyBAQAogCiAJaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGRldik7CiAKLQlEUk1fREVCVUcoImRpc2FibGVkIEZCQ1xuIik7CisJRFJNX0RFQlVHX0tNUygiZGlzYWJsZWQgRkJDXG4iKTsKIH0KIAogc3RhdGljIGJvb2wgaTh4eF9mYmNfZW5hYmxlZChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCkBAIC0xMDYyLDcgKzEwNjMsNyBAQAogCS8qIGVuYWJsZSBpdC4uLiAqLwogCUk5MTVfV1JJVEUoRFBGQ19DT05UUk9MLCBJOTE1X1JFQUQoRFBGQ19DT05UUk9MKSB8IERQRkNfQ1RMX0VOKTsKIAotCURSTV9ERUJVRygiZW5hYmxlZCBmYmMgb24gcGxhbmUgJWRcbiIsIGludGVsX2NydGMtPnBsYW5lKTsKKwlEUk1fREVCVUdfS01TKCJlbmFibGVkIGZiYyBvbiBwbGFuZSAlZFxuIiwgaW50ZWxfY3J0Yy0+cGxhbmUpOwogfQogCiB2b2lkIGc0eF9kaXNhYmxlX2ZiYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtMTA3Niw3ICsxMDc3LDcgQEAKIAlJOTE1X1dSSVRFKERQRkNfQ09OVFJPTCwgZHBmY19jdGwpOwogCWludGVsX3dhaXRfZm9yX3ZibGFuayhkZXYpOwogCi0JRFJNX0RFQlVHKCJkaXNhYmxlZCBGQkNcbiIpOworCURSTV9ERUJVR19LTVMoImRpc2FibGVkIEZCQ1xuIik7CiB9CiAKIHN0YXRpYyBib29sIGc0eF9mYmNfZW5hYmxlZChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCkBAIC0xMTQxLDI1ICsxMTQyLDI3IEBACiAJICogICAtIGdvaW5nIHRvIGFuIHVuc3VwcG9ydGVkIGNvbmZpZyAoaW50ZXJsYWNlLCBwaXhlbCBtdWx0aXBseSwgZXRjLikKIAkgKi8KIAlpZiAoaW50ZWxfZmItPm9iai0+c2l6ZSA+IGRldl9wcml2LT5jZmJfc2l6ZSkgewotCQlEUk1fREVCVUcoImZyYW1lYnVmZmVyIHRvbyBsYXJnZSwgZGlzYWJsaW5nIGNvbXByZXNzaW9uXG4iKTsKKwkJRFJNX0RFQlVHX0tNUygiZnJhbWVidWZmZXIgdG9vIGxhcmdlLCBkaXNhYmxpbmcgIgorCQkJCSJjb21wcmVzc2lvblxuIik7CiAJCWdvdG8gb3V0X2Rpc2FibGU7CiAJfQogCWlmICgobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkgfHwKIAkgICAgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19EQkxTQ0FOKSkgewotCQlEUk1fREVCVUcoIm1vZGUgaW5jb21wYXRpYmxlIHdpdGggY29tcHJlc3Npb24sIGRpc2FibGluZ1xuIik7CisJCURSTV9ERUJVR19LTVMoIm1vZGUgaW5jb21wYXRpYmxlIHdpdGggY29tcHJlc3Npb24sICIKKwkJCQkiZGlzYWJsaW5nXG4iKTsKIAkJZ290byBvdXRfZGlzYWJsZTsKIAl9CiAJaWYgKChtb2RlLT5oZGlzcGxheSA+IDIwNDgpIHx8CiAJICAgIChtb2RlLT52ZGlzcGxheSA+IDE1MzYpKSB7Ci0JCURSTV9ERUJVRygibW9kZSB0b28gbGFyZ2UgZm9yIGNvbXByZXNzaW9uLCBkaXNhYmxpbmdcbiIpOworCQlEUk1fREVCVUdfS01TKCJtb2RlIHRvbyBsYXJnZSBmb3IgY29tcHJlc3Npb24sIGRpc2FibGluZ1xuIik7CiAJCWdvdG8gb3V0X2Rpc2FibGU7CiAJfQogCWlmICgoSVNfSTkxNUdNKGRldikgfHwgSVNfSTk0NUdNKGRldikpICYmIHBsYW5lICE9IDApIHsKLQkJRFJNX0RFQlVHKCJwbGFuZSBub3QgMCwgZGlzYWJsaW5nIGNvbXByZXNzaW9uXG4iKTsKKwkJRFJNX0RFQlVHX0tNUygicGxhbmUgbm90IDAsIGRpc2FibGluZyBjb21wcmVzc2lvblxuIik7CiAJCWdvdG8gb3V0X2Rpc2FibGU7CiAJfQogCWlmIChvYmpfcHJpdi0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfWCkgewotCQlEUk1fREVCVUcoImZyYW1lYnVmZmVyIG5vdCB0aWxlZCwgZGlzYWJsaW5nIGNvbXByZXNzaW9uXG4iKTsKKwkJRFJNX0RFQlVHX0tNUygiZnJhbWVidWZmZXIgbm90IHRpbGVkLCBkaXNhYmxpbmcgY29tcHJlc3Npb25cbiIpOwogCQlnb3RvIG91dF9kaXNhYmxlOwogCX0KIApAQCAtMTE4MSwxMyArMTE4NCw1NyBAQAogCXJldHVybjsKIAogb3V0X2Rpc2FibGU6Ci0JRFJNX0RFQlVHKCJ1bnN1cHBvcnRlZCBjb25maWcsIGRpc2FibGluZyBGQkNcbiIpOworCURSTV9ERUJVR19LTVMoInVuc3VwcG9ydGVkIGNvbmZpZywgZGlzYWJsaW5nIEZCQ1xuIik7CiAJLyogTXVsdGlwbGUgZGlzYWJsZXMgc2hvdWxkIGJlIGhhcm1sZXNzICovCiAJaWYgKGRldl9wcml2LT5kaXNwbGF5LmZiY19lbmFibGVkKGNydGMpKQogCQlkZXZfcHJpdi0+ZGlzcGxheS5kaXNhYmxlX2ZiYyhkZXYpOwogfQogCiBzdGF0aWMgaW50CitpbnRlbF9waW5fYW5kX2ZlbmNlX2ZiX29iaihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSBvYmotPmRyaXZlcl9wcml2YXRlOworCXUzMiBhbGlnbm1lbnQ7CisJaW50IHJldDsKKworCXN3aXRjaCAob2JqX3ByaXYtPnRpbGluZ19tb2RlKSB7CisJY2FzZSBJOTE1X1RJTElOR19OT05FOgorCQlhbGlnbm1lbnQgPSA2NCAqIDEwMjQ7CisJCWJyZWFrOworCWNhc2UgSTkxNV9USUxJTkdfWDoKKwkJLyogcGluKCkgd2lsbCBhbGlnbiB0aGUgb2JqZWN0IGFzIHJlcXVpcmVkIGJ5IGZlbmNlICovCisJCWFsaWdubWVudCA9IDA7CisJCWJyZWFrOworCWNhc2UgSTkxNV9USUxJTkdfWToKKwkJLyogRklYTUU6IElzIHRoaXMgdHJ1ZT8gKi8KKwkJRFJNX0VSUk9SKCJZIHRpbGVkIG5vdCBhbGxvd2VkIGZvciBzY2FuIG91dCBidWZmZXJzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihvYmosIGFsaWdubWVudCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJLyogSW5zdGFsbCBhIGZlbmNlIGZvciB0aWxlZCBzY2FuLW91dC4gUHJlLWk5NjUgYWx3YXlzIG5lZWRzIGEKKwkgKiBmZW5jZSwgd2hlcmVhcyA5NjUrIG9ubHkgcmVxdWlyZXMgYSBmZW5jZSBpZiB1c2luZworCSAqIGZyYW1lYnVmZmVyIGNvbXByZXNzaW9uLiAgRm9yIHNpbXBsaWNpdHksIHdlIGFsd2F5cyBpbnN0YWxsCisJICogYSBmZW5jZSBhcyB0aGUgY29zdCBpcyBub3QgdGhhdCBvbmVyb3VzLgorCSAqLworCWlmIChvYmpfcHJpdi0+ZmVuY2VfcmVnID09IEk5MTVfRkVOQ0VfUkVHX05PTkUgJiYKKwkgICAgb2JqX3ByaXYtPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkUpIHsKKwkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2dldF9mZW5jZV9yZWcob2JqKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAogaW50ZWxfcGlwZV9zZXRfYmFzZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCB4LCBpbnQgeSwKIAkJICAgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm9sZF9mYikKIHsKQEAgLTEyMDYsMTIgKzEyNTMsMTIgQEAKIAlpbnQgZHNwc3RyaWRlID0gKHBsYW5lID09IDApID8gRFNQQVNUUklERSA6IERTUEJTVFJJREU7CiAJaW50IGRzcHRpbGVvZmYgPSAocGxhbmUgPT0gMCA/IERTUEFUSUxFT0ZGIDogRFNQQlRJTEVPRkYpOwogCWludCBkc3BjbnRyX3JlZyA9IChwbGFuZSA9PSAwKSA/IERTUEFDTlRSIDogRFNQQkNOVFI7Ci0JdTMyIGRzcGNudHIsIGFsaWdubWVudDsKKwl1MzIgZHNwY250cjsKIAlpbnQgcmV0OwogCiAJLyogbm8gZmIgYm91bmQgKi8KIAlpZiAoIWNydGMtPmZiKSB7Ci0JCURSTV9ERUJVRygiTm8gRkIgYm91bmRcbiIpOworCQlEUk1fREVCVUdfS01TKCJObyBGQiBib3VuZFxuIik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTIyOCwyNCArMTI3NSw4IEBACiAJb2JqID0gaW50ZWxfZmItPm9iajsKIAlvYmpfcHJpdiA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CiAKLQlzd2l0Y2ggKG9ial9wcml2LT50aWxpbmdfbW9kZSkgewotCWNhc2UgSTkxNV9USUxJTkdfTk9ORToKLQkJYWxpZ25tZW50ID0gNjQgKiAxMDI0OwotCQlicmVhazsKLQljYXNlIEk5MTVfVElMSU5HX1g6Ci0JCS8qIHBpbigpIHdpbGwgYWxpZ24gdGhlIG9iamVjdCBhcyByZXF1aXJlZCBieSBmZW5jZSAqLwotCQlhbGlnbm1lbnQgPSAwOwotCQlicmVhazsKLQljYXNlIEk5MTVfVElMSU5HX1k6Ci0JCS8qIEZJWE1FOiBJcyB0aGlzIHRydWU/ICovCi0JCURSTV9FUlJPUigiWSB0aWxlZCBub3QgYWxsb3dlZCBmb3Igc2NhbiBvdXQgYnVmZmVyc1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLQogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKG9iaiwgYWxpZ25tZW50KTsKKwlyZXQgPSBpbnRlbF9waW5fYW5kX2ZlbmNlX2ZiX29iaihkZXYsIG9iaik7CiAJaWYgKHJldCAhPSAwKSB7CiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlyZXR1cm4gcmV0OwpAQCAtMTI1OCwyMCArMTI4OSw2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JLyogSW5zdGFsbCBhIGZlbmNlIGZvciB0aWxlZCBzY2FuLW91dC4gUHJlLWk5NjUgYWx3YXlzIG5lZWRzIGEgZmVuY2UsCi0JICogd2hlcmVhcyA5NjUrIG9ubHkgcmVxdWlyZXMgYSBmZW5jZSBpZiB1c2luZyBmcmFtZWJ1ZmZlciBjb21wcmVzc2lvbi4KLQkgKiBGb3Igc2ltcGxpY2l0eSwgd2UgYWx3YXlzIGluc3RhbGwgYSBmZW5jZSBhcyB0aGUgY29zdCBpcyBub3QgdGhhdCBvbmVyb3VzLgotCSAqLwotCWlmIChvYmpfcHJpdi0+ZmVuY2VfcmVnID09IEk5MTVfRkVOQ0VfUkVHX05PTkUgJiYKLQkgICAgb2JqX3ByaXYtPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkUpIHsKLQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2dldF9mZW5jZV9yZWcob2JqKTsKLQkJaWYgKHJldCAhPSAwKSB7Ci0JCQlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKLQkJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQogCWRzcGNudHIgPSBJOTE1X1JFQUQoZHNwY250cl9yZWcpOwogCS8qIE1hc2sgb3V0IHBpeGVsIGZvcm1hdCBiaXRzIGluIGNhc2Ugd2UgY2hhbmdlIGl0ICovCiAJZHNwY250ciAmPSB+RElTUFBMQU5FX1BJWEZPUk1BVF9NQVNLOwpAQCAtMTI4Nyw3ICsxMzA0LDEwIEBACiAJCWJyZWFrOwogCWNhc2UgMjQ6CiAJY2FzZSAzMjoKLQkJZHNwY250ciB8PSBESVNQUExBTkVfMzJCUFBfTk9fQUxQSEE7CisJCWlmIChjcnRjLT5mYi0+ZGVwdGggPT0gMzApCisJCQlkc3BjbnRyIHw9IERJU1BQTEFORV8zMkJQUF8zMEJJVF9OT19BTFBIQTsKKwkJZWxzZQorCQkJZHNwY250ciB8PSBESVNQUExBTkVfMzJCUFBfTk9fQUxQSEE7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCURSTV9FUlJPUigiVW5rbm93biBjb2xvciBkZXB0aFxuIik7CkBAIC0xMzAyLDcgKzEzMjIsNyBAQAogCQkJZHNwY250ciAmPSB+RElTUFBMQU5FX1RJTEVEOwogCX0KIAotCWlmIChJU19JR0RORyhkZXYpKQorCWlmIChJU19JUk9OTEFLRShkZXYpKQogCQkvKiBtdXN0IGRpc2FibGUgKi8KIAkJZHNwY250ciB8PSBESVNQUExBTkVfVFJJQ0tMRV9GRUVEX0RJU0FCTEU7CiAKQEAgLTEzMTEsNyArMTMzMSw3IEBACiAJU3RhcnQgPSBvYmpfcHJpdi0+Z3R0X29mZnNldDsKIAlPZmZzZXQgPSB5ICogY3J0Yy0+ZmItPnBpdGNoICsgeCAqIChjcnRjLT5mYi0+Yml0c19wZXJfcGl4ZWwgLyA4KTsKIAotCURSTV9ERUJVRygiV3JpdGluZyBiYXNlICUwOGxYICUwOGxYICVkICVkXG4iLCBTdGFydCwgT2Zmc2V0LCB4LCB5KTsKKwlEUk1fREVCVUdfS01TKCJXcml0aW5nIGJhc2UgJTA4bFggJTA4bFggJWQgJWRcbiIsIFN0YXJ0LCBPZmZzZXQsIHgsIHkpOwogCUk5MTVfV1JJVEUoZHNwc3RyaWRlLCBjcnRjLT5mYi0+cGl0Y2gpOwogCWlmIChJU19JOTY1RyhkZXYpKSB7CiAJCUk5MTVfV1JJVEUoZHNwYmFzZSwgT2Zmc2V0KTsKQEAgLTEzNjMsNyArMTM4Myw3IEBACiAJdTggc3IxOwogCXUzMiB2Z2FfcmVnOwogCi0JaWYgKElTX0lHRE5HKGRldikpCisJaWYgKElTX0lST05MQUtFKGRldikpCiAJCXZnYV9yZWcgPSBDUFVfVkdBQ05UUkw7CiAJZWxzZQogCQl2Z2FfcmVnID0gVkdBQ05UUkw7CkBAIC0xMzc5LDE5ICsxMzk5LDE5IEBACiAJSTkxNV9XUklURSh2Z2FfcmVnLCBWR0FfRElTUF9ESVNBQkxFKTsKIH0KIAotc3RhdGljIHZvaWQgaWdkbmdfZGlzYWJsZV9wbGxfZWRwIChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCitzdGF0aWMgdm9pZCBpcm9ubGFrZV9kaXNhYmxlX3BsbF9lZHAgKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIGRwYV9jdGw7CiAKLQlEUk1fREVCVUcoIlxuIik7CisJRFJNX0RFQlVHX0tNUygiXG4iKTsKIAlkcGFfY3RsID0gSTkxNV9SRUFEKERQX0EpOwogCWRwYV9jdGwgJj0gfkRQX1BMTF9FTkFCTEU7CiAJSTkxNV9XUklURShEUF9BLCBkcGFfY3RsKTsKIH0KIAotc3RhdGljIHZvaWQgaWdkbmdfZW5hYmxlX3BsbF9lZHAgKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3N0YXRpYyB2b2lkIGlyb25sYWtlX2VuYWJsZV9wbGxfZWRwIChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTQwNCwxMyArMTQyNCwxMyBAQAogfQogCiAKLXN0YXRpYyB2b2lkIGlnZG5nX3NldF9wbGxfZWRwIChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCBjbG9jaykKK3N0YXRpYyB2b2lkIGlyb25sYWtlX3NldF9wbGxfZWRwIChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCBjbG9jaykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIGRwYV9jdGw7CiAKLQlEUk1fREVCVUcoImVEUCBQTEwgZW5hYmxlIGZvciBjbG9jayAlZFxuIiwgY2xvY2spOworCURSTV9ERUJVR19LTVMoImVEUCBQTEwgZW5hYmxlIGZvciBjbG9jayAlZFxuIiwgY2xvY2spOwogCWRwYV9jdGwgPSBJOTE1X1JFQUQoRFBfQSk7CiAJZHBhX2N0bCAmPSB+RFBfUExMX0ZSRVFfTUFTSzsKIApAQCAtMTQ0MCw3ICsxNDYwLDcgQEAKIAl1ZGVsYXkoNTAwKTsKIH0KIAotc3RhdGljIHZvaWQgaWdkbmdfY3J0Y19kcG1zKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IG1vZGUpCitzdGF0aWMgdm9pZCBpcm9ubGFrZV9jcnRjX2RwbXMoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgbW9kZSkKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xNDgxLDEwICsxNTAxLDE5IEBACiAJY2FzZSBEUk1fTU9ERV9EUE1TX09OOgogCWNhc2UgRFJNX01PREVfRFBNU19TVEFOREJZOgogCWNhc2UgRFJNX01PREVfRFBNU19TVVNQRU5EOgotCQlEUk1fREVCVUcoImNydGMgJWQgZHBtcyBvblxuIiwgcGlwZSk7CisJCURSTV9ERUJVR19LTVMoImNydGMgJWQgZHBtcyBvblxuIiwgcGlwZSk7CisKKwkJaWYgKGludGVsX3BpcGVfaGFzX3R5cGUoY3J0YywgSU5URUxfT1VUUFVUX0xWRFMpKSB7CisJCQl0ZW1wID0gSTkxNV9SRUFEKFBDSF9MVkRTKTsKKwkJCWlmICgodGVtcCAmIExWRFNfUE9SVF9FTikgPT0gMCkgeworCQkJCUk5MTVfV1JJVEUoUENIX0xWRFMsIHRlbXAgfCBMVkRTX1BPUlRfRU4pOworCQkJCVBPU1RJTkdfUkVBRChQQ0hfTFZEUyk7CisJCQl9CisJCX0KKwogCQlpZiAoSEFTX2VEUCkgewogCQkJLyogZW5hYmxlIGVEUCBQTEwgKi8KLQkJCWlnZG5nX2VuYWJsZV9wbGxfZWRwKGNydGMpOworCQkJaXJvbmxha2VfZW5hYmxlX3BsbF9lZHAoY3J0Yyk7CiAJCX0gZWxzZSB7CiAJCQkvKiBlbmFibGUgUENIIERQTEwgKi8KIAkJCXRlbXAgPSBJOTE1X1JFQUQocGNoX2RwbGxfcmVnKTsKQEAgLTE1MDEsNyArMTUzMCw3IEBACiAJCQlJOTE1X1JFQUQoZmRpX3J4X3JlZyk7CiAJCQl1ZGVsYXkoMjAwKTsKIAotCQkJLyogRW5hYmxlIENQVSBGREkgVFggUExMLCBhbHdheXMgb24gZm9yIElHRE5HICovCisJCQkvKiBFbmFibGUgQ1BVIEZESSBUWCBQTEwsIGFsd2F5cyBvbiBmb3IgSXJvbmxha2UgKi8KIAkJCXRlbXAgPSBJOTE1X1JFQUQoZmRpX3R4X3JlZyk7CiAJCQlpZiAoKHRlbXAgJiBGRElfVFhfUExMX0VOQUJMRSkgPT0gMCkgewogCQkJCUk5MTVfV1JJVEUoZmRpX3R4X3JlZywgdGVtcCB8IEZESV9UWF9QTExfRU5BQkxFKTsKQEAgLTE1NjgsMTIgKzE1OTcsMTMgQEAKIAkJCXVkZWxheSgxNTApOwogCiAJCQl0ZW1wID0gSTkxNV9SRUFEKGZkaV9yeF9paXJfcmVnKTsKLQkJCURSTV9ERUJVRygiRkRJX1JYX0lJUiAweCV4XG4iLCB0ZW1wKTsKKwkJCURSTV9ERUJVR19LTVMoIkZESV9SWF9JSVIgMHgleFxuIiwgdGVtcCk7CiAKIAkJCWlmICgodGVtcCAmIEZESV9SWF9CSVRfTE9DSykgPT0gMCkgewogCQkJCWZvciAoaiA9IDA7IGogPCB0cmllczsgaisrKSB7CiAJCQkJCXRlbXAgPSBJOTE1X1JFQUQoZmRpX3J4X2lpcl9yZWcpOwotCQkJCQlEUk1fREVCVUcoIkZESV9SWF9JSVIgMHgleFxuIiwgdGVtcCk7CisJCQkJCURSTV9ERUJVR19LTVMoIkZESV9SWF9JSVIgMHgleFxuIiwKKwkJCQkJCQkJdGVtcCk7CiAJCQkJCWlmICh0ZW1wICYgRkRJX1JYX0JJVF9MT0NLKQogCQkJCQkJYnJlYWs7CiAJCQkJCXVkZWxheSgyMDApOwpAQCAtMTU4MiwxMSArMTYxMiwxMSBAQAogCQkJCQlJOTE1X1dSSVRFKGZkaV9yeF9paXJfcmVnLAogCQkJCQkJCXRlbXAgfCBGRElfUlhfQklUX0xPQ0spOwogCQkJCWVsc2UKLQkJCQkJRFJNX0RFQlVHKCJ0cmFpbiAxIGZhaWxcbiIpOworCQkJCQlEUk1fREVCVUdfS01TKCJ0cmFpbiAxIGZhaWxcbiIpOwogCQkJfSBlbHNlIHsKIAkJCQlJOTE1X1dSSVRFKGZkaV9yeF9paXJfcmVnLAogCQkJCQkJdGVtcCB8IEZESV9SWF9CSVRfTE9DSyk7Ci0JCQkJRFJNX0RFQlVHKCJ0cmFpbiAxIG9rIDIhXG4iKTsKKwkJCQlEUk1fREVCVUdfS01TKCJ0cmFpbiAxIG9rIDIhXG4iKTsKIAkJCX0KIAkJCXRlbXAgPSBJOTE1X1JFQUQoZmRpX3R4X3JlZyk7CiAJCQl0ZW1wICY9IH5GRElfTElOS19UUkFJTl9OT05FOwpAQCAtMTYwMSwxMiArMTYzMSwxMyBAQAogCQkJdWRlbGF5KDE1MCk7CiAKIAkJCXRlbXAgPSBJOTE1X1JFQUQoZmRpX3J4X2lpcl9yZWcpOwotCQkJRFJNX0RFQlVHKCJGRElfUlhfSUlSIDB4JXhcbiIsIHRlbXApOworCQkJRFJNX0RFQlVHX0tNUygiRkRJX1JYX0lJUiAweCV4XG4iLCB0ZW1wKTsKIAogCQkJaWYgKCh0ZW1wICYgRkRJX1JYX1NZTUJPTF9MT0NLKSA9PSAwKSB7CiAJCQkJZm9yIChqID0gMDsgaiA8IHRyaWVzOyBqKyspIHsKIAkJCQkJdGVtcCA9IEk5MTVfUkVBRChmZGlfcnhfaWlyX3JlZyk7Ci0JCQkJCURSTV9ERUJVRygiRkRJX1JYX0lJUiAweCV4XG4iLCB0ZW1wKTsKKwkJCQkJRFJNX0RFQlVHX0tNUygiRkRJX1JYX0lJUiAweCV4XG4iLAorCQkJCQkJCQl0ZW1wKTsKIAkJCQkJaWYgKHRlbXAgJiBGRElfUlhfU1lNQk9MX0xPQ0spCiAJCQkJCQlicmVhazsKIAkJCQkJdWRlbGF5KDIwMCk7CkBAIC0xNjE0LDE1ICsxNjQ1LDE1IEBACiAJCQkJaWYgKGogIT0gdHJpZXMpIHsKIAkJCQkJSTkxNV9XUklURShmZGlfcnhfaWlyX3JlZywKIAkJCQkJCQl0ZW1wIHwgRkRJX1JYX1NZTUJPTF9MT0NLKTsKLQkJCQkJRFJNX0RFQlVHKCJ0cmFpbiAyIG9rIDEhXG4iKTsKKwkJCQkJRFJNX0RFQlVHX0tNUygidHJhaW4gMiBvayAxIVxuIik7CiAJCQkJfSBlbHNlCi0JCQkJCURSTV9ERUJVRygidHJhaW4gMiBmYWlsXG4iKTsKKwkJCQkJRFJNX0RFQlVHX0tNUygidHJhaW4gMiBmYWlsXG4iKTsKIAkJCX0gZWxzZSB7CiAJCQkJSTkxNV9XUklURShmZGlfcnhfaWlyX3JlZywKIAkJCQkJCXRlbXAgfCBGRElfUlhfU1lNQk9MX0xPQ0spOwotCQkJCURSTV9ERUJVRygidHJhaW4gMiBvayAyIVxuIik7CisJCQkJRFJNX0RFQlVHX0tNUygidHJhaW4gMiBvayAyIVxuIik7CiAJCQl9Ci0JCQlEUk1fREVCVUcoInRyYWluIGRvbmVcbiIpOworCQkJRFJNX0RFQlVHX0tNUygidHJhaW4gZG9uZVxuIik7CiAKIAkJCS8qIHNldCB0cmFuc2NvZGVyIHRpbWluZyAqLwogCQkJSTkxNV9XUklURSh0cmFuc19odG90X3JlZywgSTkxNV9SRUFEKGNwdV9odG90X3JlZykpOwpAQCAtMTY2NCw5ICsxNjk1LDcgQEAKIAogCWJyZWFrOwogCWNhc2UgRFJNX01PREVfRFBNU19PRkY6Ci0JCURSTV9ERUJVRygiY3J0YyAlZCBkcG1zIG9mZlxuIiwgcGlwZSk7Ci0KLQkJaTkxNV9kaXNhYmxlX3ZnYShkZXYpOworCQlEUk1fREVCVUdfS01TKCJjcnRjICVkIGRwbXMgb2ZmXG4iLCBwaXBlKTsKIAogCQkvKiBEaXNhYmxlIGRpc3BsYXkgcGxhbmUgKi8KIAkJdGVtcCA9IEk5MTVfUkVBRChkc3BjbnRyX3JlZyk7CkBAIC0xNjc3LDYgKzE3MDYsOCBAQAogCQkJSTkxNV9SRUFEKGRzcGJhc2VfcmVnKTsKIAkJfQogCisJCWk5MTVfZGlzYWJsZV92Z2EoZGV2KTsKKwogCQkvKiBkaXNhYmxlIGNwdSBwaXBlLCBkaXNhYmxlIGFmdGVyIGFsbCBwbGFuZXMgZGlzYWJsZWQgKi8KIAkJdGVtcCA9IEk5MTVfUkVBRChwaXBlY29uZl9yZWcpOwogCQlpZiAoKHRlbXAgJiBQSVBFQUNPTkZfRU5BQkxFKSAhPSAwKSB7CkBAIC0xNjkwLDE2ICsxNzIxLDIzIEBACiAJCQkJCXVkZWxheSg1MDApOwogCQkJCQljb250aW51ZTsKIAkJCQl9IGVsc2UgewotCQkJCQlEUk1fREVCVUcoInBpcGUgJWQgb2ZmIGRlbGF5XG4iLCBwaXBlKTsKKwkJCQkJRFJNX0RFQlVHX0tNUygicGlwZSAlZCBvZmYgZGVsYXlcbiIsCisJCQkJCQkJCXBpcGUpOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CiAJCX0gZWxzZQotCQkJRFJNX0RFQlVHKCJjcnRjICVkIGlzIGRpc2FibGVkXG4iLCBwaXBlKTsKKwkJCURSTV9ERUJVR19LTVMoImNydGMgJWQgaXMgZGlzYWJsZWRcbiIsIHBpcGUpOwogCi0JCWlmIChIQVNfZURQKSB7Ci0JCQlpZ2RuZ19kaXNhYmxlX3BsbF9lZHAoY3J0Yyk7CisJCXVkZWxheSgxMDApOworCisJCS8qIERpc2FibGUgUEYgKi8KKwkJdGVtcCA9IEk5MTVfUkVBRChwZl9jdGxfcmVnKTsKKwkJaWYgKCh0ZW1wICYgUEZfRU5BQkxFKSAhPSAwKSB7CisJCQlJOTE1X1dSSVRFKHBmX2N0bF9yZWcsIHRlbXAgJiB+UEZfRU5BQkxFKTsKKwkJCUk5MTVfUkVBRChwZl9jdGxfcmVnKTsKIAkJfQorCQlJOTE1X1dSSVRFKHBmX3dpbl9zaXplLCAwKTsKIAogCQkvKiBkaXNhYmxlIENQVSBGREkgdHggYW5kIFBDSCBGREkgcnggKi8KIAkJdGVtcCA9IEk5MTVfUkVBRChmZGlfdHhfcmVnKTsKQEAgLTE3MjUsNiArMTc2MywxMyBAQAogCiAJCXVkZWxheSgxMDApOwogCisJCWlmIChpbnRlbF9waXBlX2hhc190eXBlKGNydGMsIElOVEVMX09VVFBVVF9MVkRTKSkgeworCQkJdGVtcCA9IEk5MTVfUkVBRChQQ0hfTFZEUyk7CisJCQlJOTE1X1dSSVRFKFBDSF9MVkRTLCB0ZW1wICYgfkxWRFNfUE9SVF9FTik7CisJCQlJOTE1X1JFQUQoUENIX0xWRFMpOworCQkJdWRlbGF5KDEwMCk7CisJCX0KKwogCQkvKiBkaXNhYmxlIFBDSCB0cmFuc2NvZGVyICovCiAJCXRlbXAgPSBJOTE1X1JFQUQodHJhbnNjb25mX3JlZyk7CiAJCWlmICgodGVtcCAmIFRSQU5TX0VOQUJMRSkgIT0gMCkgewpAQCAtMTczOCwxMiArMTc4MywxNSBAQAogCQkJCQl1ZGVsYXkoNTAwKTsKIAkJCQkJY29udGludWU7CiAJCQkJfSBlbHNlIHsKLQkJCQkJRFJNX0RFQlVHKCJ0cmFuc2NvZGVyICVkIG9mZiBkZWxheVxuIiwgcGlwZSk7CisJCQkJCURSTV9ERUJVR19LTVMoInRyYW5zY29kZXIgJWQgb2ZmICIKKwkJCQkJCQkiZGVsYXlcbiIsIHBpcGUpOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CiAJCX0KIAorCQl1ZGVsYXkoMTAwKTsKKwogCQkvKiBkaXNhYmxlIFBDSCBEUExMICovCiAJCXRlbXAgPSBJOTE1X1JFQUQocGNoX2RwbGxfcmVnKTsKIAkJaWYgKCh0ZW1wICYgRFBMTF9WQ09fRU5BQkxFKSAhPSAwKSB7CkBAIC0xNzUxLDE0ICsxNzk5LDIwIEBACiAJCQlJOTE1X1JFQUQocGNoX2RwbGxfcmVnKTsKIAkJfQogCi0JCXRlbXAgPSBJOTE1X1JFQUQoZmRpX3J4X3JlZyk7Ci0JCWlmICgodGVtcCAmIEZESV9SWF9QTExfRU5BQkxFKSAhPSAwKSB7Ci0JCQl0ZW1wICY9IH5GRElfU0VMX1BDRENMSzsKLQkJCXRlbXAgJj0gfkZESV9SWF9QTExfRU5BQkxFOwotCQkJSTkxNV9XUklURShmZGlfcnhfcmVnLCB0ZW1wKTsKLQkJCUk5MTVfUkVBRChmZGlfcnhfcmVnKTsKKwkJaWYgKEhBU19lRFApIHsKKwkJCWlyb25sYWtlX2Rpc2FibGVfcGxsX2VkcChjcnRjKTsKIAkJfQogCisJCXRlbXAgPSBJOTE1X1JFQUQoZmRpX3J4X3JlZyk7CisJCXRlbXAgJj0gfkZESV9TRUxfUENEQ0xLOworCQlJOTE1X1dSSVRFKGZkaV9yeF9yZWcsIHRlbXApOworCQlJOTE1X1JFQUQoZmRpX3J4X3JlZyk7CisKKwkJdGVtcCA9IEk5MTVfUkVBRChmZGlfcnhfcmVnKTsKKwkJdGVtcCAmPSB+RkRJX1JYX1BMTF9FTkFCTEU7CisJCUk5MTVfV1JJVEUoZmRpX3J4X3JlZywgdGVtcCk7CisJCUk5MTVfUkVBRChmZGlfcnhfcmVnKTsKKwogCQkvKiBEaXNhYmxlIENQVSBGREkgVFggUExMICovCiAJCXRlbXAgPSBJOTE1X1JFQUQoZmRpX3R4X3JlZyk7CiAJCWlmICgodGVtcCAmIEZESV9UWF9QTExfRU5BQkxFKSAhPSAwKSB7CkBAIC0xNzY3LDIwICsxODIxLDQzIEBACiAJCQl1ZGVsYXkoMTAwKTsKIAkJfQogCi0JCS8qIERpc2FibGUgUEYgKi8KLQkJdGVtcCA9IEk5MTVfUkVBRChwZl9jdGxfcmVnKTsKLQkJaWYgKCh0ZW1wICYgUEZfRU5BQkxFKSAhPSAwKSB7Ci0JCQlJOTE1X1dSSVRFKHBmX2N0bF9yZWcsIHRlbXAgJiB+UEZfRU5BQkxFKTsKLQkJCUk5MTVfUkVBRChwZl9jdGxfcmVnKTsKLQkJfQotCQlJOTE1X1dSSVRFKHBmX3dpbl9zaXplLCAwKTsKLQogCQkvKiBXYWl0IGZvciB0aGUgY2xvY2tzIHRvIHR1cm4gb2ZmLiAqLwotCQl1ZGVsYXkoMTUwKTsKKwkJdWRlbGF5KDEwMCk7CiAJCWJyZWFrOwogCX0KIH0KIAorc3RhdGljIHZvaWQgaW50ZWxfY3J0Y19kcG1zX292ZXJsYXkoc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5OworCWludCByZXQ7CisKKwlpZiAoIWVuYWJsZSAmJiBpbnRlbF9jcnRjLT5vdmVybGF5KSB7CisJCW92ZXJsYXkgPSBpbnRlbF9jcnRjLT5vdmVybGF5OworCQltdXRleF9sb2NrKCZvdmVybGF5LT5kZXYtPnN0cnVjdF9tdXRleCk7CisJCWZvciAoOzspIHsKKwkJCXJldCA9IGludGVsX292ZXJsYXlfc3dpdGNoX29mZihvdmVybGF5KTsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlicmVhazsKKworCQkJcmV0ID0gaW50ZWxfb3ZlcmxheV9yZWNvdmVyX2Zyb21faW50ZXJydXB0KG92ZXJsYXksIDApOworCQkJaWYgKHJldCAhPSAwKSB7CisJCQkJLyogb3ZlcmxheSBkb2Vzbid0IHJlYWN0IGFueW1vcmUuIFVzdWFsbHkKKwkJCQkgKiByZXN1bHRzIGluIGEgYmxhY2sgc2NyZWVuIGFuZCBhbiB1bmtpbGxhYmxlCisJCQkJICogWCBzZXJ2ZXIuICovCisJCQkJQlVHKCk7CisJCQkJb3ZlcmxheS0+aHdfd2VkZ2VkID0gSFdfV0VER0VEOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCW11dGV4X3VubG9jaygmb3ZlcmxheS0+ZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCX0KKwkvKiBMZXQgdXNlcnNwYWNlIHN3aXRjaCB0aGUgb3ZlcmxheSBvbiBhZ2Fpbi4gSW4gbW9zdCBjYXNlcyB1c2Vyc3BhY2UKKwkgKiBoYXMgdG8gcmVjb21wdXRlIHdoZXJlIHRvIHB1dCBpdCBhbnl3YXkuICovCisKKwlyZXR1cm47Cit9CisKIHN0YXRpYyB2b2lkIGk5eHhfY3J0Y19kcG1zKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IG1vZGUpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKQEAgLTE4MzksMTIgKzE5MTYsMTQgQEAKIAkJCWludGVsX3VwZGF0ZV9mYmMoY3J0YywgJmNydGMtPm1vZGUpOwogCiAJCS8qIEdpdmUgdGhlIG92ZXJsYXkgc2NhbGVyIGEgY2hhbmNlIHRvIGVuYWJsZSBpZiBpdCdzIG9uIHRoaXMgcGlwZSAqLwotCQkvL2ludGVsX2NydGNfZHBtc192aWRlbyhjcnRjLCB0cnVlKTsgVE9ETworCQlpbnRlbF9jcnRjX2RwbXNfb3ZlcmxheShpbnRlbF9jcnRjLCB0cnVlKTsKIAlicmVhazsKIAljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgogCQlpbnRlbF91cGRhdGVfd2F0ZXJtYXJrcyhkZXYpOworCiAJCS8qIEdpdmUgdGhlIG92ZXJsYXkgc2NhbGVyIGEgY2hhbmNlIHRvIGRpc2FibGUgaWYgaXQncyBvbiB0aGlzIHBpcGUgKi8KLQkJLy9pbnRlbF9jcnRjX2RwbXNfdmlkZW8oY3J0YywgRkFMU0UpOyBUT0RPCisJCWludGVsX2NydGNfZHBtc19vdmVybGF5KGludGVsX2NydGMsIGZhbHNlKTsKKwkJZHJtX3ZibGFua19vZmYoZGV2LCBwaXBlKTsKIAogCQlpZiAoZGV2X3ByaXYtPmNmYl9wbGFuZSA9PSBwbGFuZSAmJgogCQkgICAgZGV2X3ByaXYtPmRpc3BsYXkuZGlzYWJsZV9mYmMpCkBAIC0xOTYzLDcgKzIwNDIsNyBAQAogCQkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKLQlpZiAoSVNfSUdETkcoZGV2KSkgeworCWlmIChJU19JUk9OTEFLRShkZXYpKSB7CiAJCS8qIEZESSBsaW5rIGNsb2NrIGlzIGZpeGVkIGF0IDIuN0cgKi8KIAkJaWYgKG1vZGUtPmNsb2NrICogMyA+IDI3MDAwICogNCkKIAkJCXJldHVybiBNT0RFX0NMT0NLX0hJR0g7CkBAIC0yMDM5LDcgKzIxMTgsNyBAQAogICogUmV0dXJuIHRoZSBwaXBlIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gdGhlIHBhbmVsIGZpdHRlciwKICAqIG9yIC0xIGlmIHRoZSBwYW5lbCBmaXR0ZXIgaXMgbm90IHByZXNlbnQgb3Igbm90IGluIHVzZQogICovCi1zdGF0aWMgaW50IGludGVsX3BhbmVsX2ZpdHRlcl9waXBlIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoraW50IGludGVsX3BhbmVsX2ZpdHRlcl9waXBlIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyICBwZml0X2NvbnRyb2w7CkBAIC0yMDgzLDkgKzIxNjIsOCBAQAogI2RlZmluZSBMSU5LX04gMHg4MDAwMAogCiBzdGF0aWMgdm9pZAotaWdkbmdfY29tcHV0ZV9tX24oaW50IGJpdHNfcGVyX3BpeGVsLCBpbnQgbmxhbmVzLAotCQlpbnQgcGl4ZWxfY2xvY2ssIGludCBsaW5rX2Nsb2NrLAotCQlzdHJ1Y3QgZmRpX21fbiAqbV9uKQoraXJvbmxha2VfY29tcHV0ZV9tX24oaW50IGJpdHNfcGVyX3BpeGVsLCBpbnQgbmxhbmVzLCBpbnQgcGl4ZWxfY2xvY2ssCisJCSAgICAgaW50IGxpbmtfY2xvY2ssIHN0cnVjdCBmZGlfbV9uICptX24pCiB7CiAJdTY0IHRlbXA7CiAKQEAgLTIxMTMsMzQgKzIxOTEsMzQgQEAKIAl1bnNpZ25lZCBsb25nIGNhY2hlbGluZV9zaXplOwogfTsKIAotLyogSUdEIGhhcyBkaWZmZXJlbnQgdmFsdWVzIGZvciB2YXJpb3VzIGNvbmZpZ3MgKi8KLXN0YXRpYyBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyBpZ2RfZGlzcGxheV93bSA9IHsKLQlJR0RfRElTUExBWV9GSUZPLAotCUlHRF9NQVhfV00sCi0JSUdEX0RGVF9XTSwKLQlJR0RfR1VBUkRfV00sCi0JSUdEX0ZJRk9fTElORV9TSVpFCisvKiBQaW5ldmlldyBoYXMgZGlmZmVyZW50IHZhbHVlcyBmb3IgdmFyaW91cyBjb25maWdzICovCitzdGF0aWMgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgcGluZXZpZXdfZGlzcGxheV93bSA9IHsKKwlQSU5FVklFV19ESVNQTEFZX0ZJRk8sCisJUElORVZJRVdfTUFYX1dNLAorCVBJTkVWSUVXX0RGVF9XTSwKKwlQSU5FVklFV19HVUFSRF9XTSwKKwlQSU5FVklFV19GSUZPX0xJTkVfU0laRQogfTsKLXN0YXRpYyBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyBpZ2RfZGlzcGxheV9ocGxsb2ZmX3dtID0gewotCUlHRF9ESVNQTEFZX0ZJRk8sCi0JSUdEX01BWF9XTSwKLQlJR0RfREZUX0hQTExPRkZfV00sCi0JSUdEX0dVQVJEX1dNLAotCUlHRF9GSUZPX0xJTkVfU0laRQorc3RhdGljIHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zIHBpbmV2aWV3X2Rpc3BsYXlfaHBsbG9mZl93bSA9IHsKKwlQSU5FVklFV19ESVNQTEFZX0ZJRk8sCisJUElORVZJRVdfTUFYX1dNLAorCVBJTkVWSUVXX0RGVF9IUExMT0ZGX1dNLAorCVBJTkVWSUVXX0dVQVJEX1dNLAorCVBJTkVWSUVXX0ZJRk9fTElORV9TSVpFCiB9Owotc3RhdGljIHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zIGlnZF9jdXJzb3Jfd20gPSB7Ci0JSUdEX0NVUlNPUl9GSUZPLAotCUlHRF9DVVJTT1JfTUFYX1dNLAotCUlHRF9DVVJTT1JfREZUX1dNLAotCUlHRF9DVVJTT1JfR1VBUkRfV00sCi0JSUdEX0ZJRk9fTElORV9TSVpFLAorc3RhdGljIHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zIHBpbmV2aWV3X2N1cnNvcl93bSA9IHsKKwlQSU5FVklFV19DVVJTT1JfRklGTywKKwlQSU5FVklFV19DVVJTT1JfTUFYX1dNLAorCVBJTkVWSUVXX0NVUlNPUl9ERlRfV00sCisJUElORVZJRVdfQ1VSU09SX0dVQVJEX1dNLAorCVBJTkVWSUVXX0ZJRk9fTElORV9TSVpFLAogfTsKLXN0YXRpYyBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyBpZ2RfY3Vyc29yX2hwbGxvZmZfd20gPSB7Ci0JSUdEX0NVUlNPUl9GSUZPLAotCUlHRF9DVVJTT1JfTUFYX1dNLAotCUlHRF9DVVJTT1JfREZUX1dNLAotCUlHRF9DVVJTT1JfR1VBUkRfV00sCi0JSUdEX0ZJRk9fTElORV9TSVpFCitzdGF0aWMgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgcGluZXZpZXdfY3Vyc29yX2hwbGxvZmZfd20gPSB7CisJUElORVZJRVdfQ1VSU09SX0ZJRk8sCisJUElORVZJRVdfQ1VSU09SX01BWF9XTSwKKwlQSU5FVklFV19DVVJTT1JfREZUX1dNLAorCVBJTkVWSUVXX0NVUlNPUl9HVUFSRF9XTSwKKwlQSU5FVklFV19GSUZPX0xJTkVfU0laRQogfTsKIHN0YXRpYyBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyBnNHhfd21faW5mbyA9IHsKIAlHNFhfRklGT19TSVpFLApAQCAtMjIxMywxMSArMjI5MSwxMSBAQAogCQkxMDAwOwogCWVudHJpZXNfcmVxdWlyZWQgLz0gd20tPmNhY2hlbGluZV9zaXplOwogCi0JRFJNX0RFQlVHKCJGSUZPIGVudHJpZXMgcmVxdWlyZWQgZm9yIG1vZGU6ICVkXG4iLCBlbnRyaWVzX3JlcXVpcmVkKTsKKwlEUk1fREVCVUdfS01TKCJGSUZPIGVudHJpZXMgcmVxdWlyZWQgZm9yIG1vZGU6ICVkXG4iLCBlbnRyaWVzX3JlcXVpcmVkKTsKIAogCXdtX3NpemUgPSB3bS0+Zmlmb19zaXplIC0gKGVudHJpZXNfcmVxdWlyZWQgKyB3bS0+Z3VhcmRfc2l6ZSk7CiAKLQlEUk1fREVCVUcoIkZJRk8gd2F0ZXJtYXJrIGxldmVsOiAlZFxuIiwgd21fc2l6ZSk7CisJRFJNX0RFQlVHX0tNUygiRklGTyB3YXRlcm1hcmsgbGV2ZWw6ICVkXG4iLCB3bV9zaXplKTsKIAogCS8qIERvbid0IHByb21vdGUgd21fc2l6ZSB0byB1bnNpZ25lZC4uLiAqLwogCWlmICh3bV9zaXplID4gKGxvbmcpd20tPm1heF93bSkKQEAgLTIyNzksNTAgKzIzNTcsNTAgQEAKIAkJCXJldHVybiBsYXRlbmN5OwogCX0KIAotCURSTV9ERUJVRygiVW5rbm93biBGU0IvTUVNIGZvdW5kLCBkaXNhYmxlIEN4U1JcbiIpOworCURSTV9ERUJVR19LTVMoIlVua25vd24gRlNCL01FTSBmb3VuZCwgZGlzYWJsZSBDeFNSXG4iKTsKIAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBpZ2RfZGlzYWJsZV9jeHNyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBwaW5ldmlld19kaXNhYmxlX2N4c3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiByZWc7CiAKIAkvKiBkZWFjdGl2YXRlIGN4c3IgKi8KIAlyZWcgPSBJOTE1X1JFQUQoRFNQRlczKTsKLQlyZWcgJj0gfihJR0RfU0VMRl9SRUZSRVNIX0VOKTsKKwlyZWcgJj0gfihQSU5FVklFV19TRUxGX1JFRlJFU0hfRU4pOwogCUk5MTVfV1JJVEUoRFNQRlczLCByZWcpOwogCURSTV9JTkZPKCJCaWcgRklGTyBpcyBkaXNhYmxlZFxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIGlnZF9lbmFibGVfY3hzcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGNsb2NrLAotCQkJICAgIGludCBwaXhlbF9zaXplKQorc3RhdGljIHZvaWQgcGluZXZpZXdfZW5hYmxlX2N4c3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBjbG9jaywKKwkJCQkgaW50IHBpeGVsX3NpemUpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgcmVnOwogCXVuc2lnbmVkIGxvbmcgd207CiAJc3RydWN0IGN4c3JfbGF0ZW5jeSAqbGF0ZW5jeTsKIAotCWxhdGVuY3kgPSBpbnRlbF9nZXRfY3hzcl9sYXRlbmN5KElTX0lHREcoZGV2KSwgZGV2X3ByaXYtPmZzYl9mcmVxLAorCWxhdGVuY3kgPSBpbnRlbF9nZXRfY3hzcl9sYXRlbmN5KElTX1BJTkVWSUVXX0coZGV2KSwgZGV2X3ByaXYtPmZzYl9mcmVxLAogCQlkZXZfcHJpdi0+bWVtX2ZyZXEpOwogCWlmICghbGF0ZW5jeSkgewotCQlEUk1fREVCVUcoIlVua25vd24gRlNCL01FTSBmb3VuZCwgZGlzYWJsZSBDeFNSXG4iKTsKLQkJaWdkX2Rpc2FibGVfY3hzcihkZXYpOworCQlEUk1fREVCVUdfS01TKCJVbmtub3duIEZTQi9NRU0gZm91bmQsIGRpc2FibGUgQ3hTUlxuIik7CisJCXBpbmV2aWV3X2Rpc2FibGVfY3hzcihkZXYpOwogCQlyZXR1cm47CiAJfQogCiAJLyogRGlzcGxheSBTUiAqLwotCXdtID0gaW50ZWxfY2FsY3VsYXRlX3dtKGNsb2NrLCAmaWdkX2Rpc3BsYXlfd20sIHBpeGVsX3NpemUsCisJd20gPSBpbnRlbF9jYWxjdWxhdGVfd20oY2xvY2ssICZwaW5ldmlld19kaXNwbGF5X3dtLCBwaXhlbF9zaXplLAogCQkJCWxhdGVuY3ktPmRpc3BsYXlfc3IpOwogCXJlZyA9IEk5MTVfUkVBRChEU1BGVzEpOwogCXJlZyAmPSAweDdmZmZmZjsKIAlyZWcgfD0gd20gPDwgMjM7CiAJSTkxNV9XUklURShEU1BGVzEsIHJlZyk7Ci0JRFJNX0RFQlVHKCJEU1BGVzEgcmVnaXN0ZXIgaXMgJXhcbiIsIHJlZyk7CisJRFJNX0RFQlVHX0tNUygiRFNQRlcxIHJlZ2lzdGVyIGlzICV4XG4iLCByZWcpOwogCiAJLyogY3Vyc29yIFNSICovCi0Jd20gPSBpbnRlbF9jYWxjdWxhdGVfd20oY2xvY2ssICZpZ2RfY3Vyc29yX3dtLCBwaXhlbF9zaXplLAorCXdtID0gaW50ZWxfY2FsY3VsYXRlX3dtKGNsb2NrLCAmcGluZXZpZXdfY3Vyc29yX3dtLCBwaXhlbF9zaXplLAogCQkJCWxhdGVuY3ktPmN1cnNvcl9zcik7CiAJcmVnID0gSTkxNV9SRUFEKERTUEZXMyk7CiAJcmVnICY9IH4oMHgzZiA8PCAyNCk7CkBAIC0yMzMwLDcgKzI0MDgsNyBAQAogCUk5MTVfV1JJVEUoRFNQRlczLCByZWcpOwogCiAJLyogRGlzcGxheSBIUExMIG9mZiBTUiAqLwotCXdtID0gaW50ZWxfY2FsY3VsYXRlX3dtKGNsb2NrLCAmaWdkX2Rpc3BsYXlfaHBsbG9mZl93bSwKKwl3bSA9IGludGVsX2NhbGN1bGF0ZV93bShjbG9jaywgJnBpbmV2aWV3X2Rpc3BsYXlfaHBsbG9mZl93bSwKIAkJbGF0ZW5jeS0+ZGlzcGxheV9ocGxsX2Rpc2FibGUsIEk5MTVfRklGT19MSU5FX1NJWkUpOwogCXJlZyA9IEk5MTVfUkVBRChEU1BGVzMpOwogCXJlZyAmPSAweGZmZmZmZTAwOwpAQCAtMjMzOCwxNyArMjQxNiwxNyBAQAogCUk5MTVfV1JJVEUoRFNQRlczLCByZWcpOwogCiAJLyogY3Vyc29yIEhQTEwgb2ZmIFNSICovCi0Jd20gPSBpbnRlbF9jYWxjdWxhdGVfd20oY2xvY2ssICZpZ2RfY3Vyc29yX2hwbGxvZmZfd20sIHBpeGVsX3NpemUsCisJd20gPSBpbnRlbF9jYWxjdWxhdGVfd20oY2xvY2ssICZwaW5ldmlld19jdXJzb3JfaHBsbG9mZl93bSwgcGl4ZWxfc2l6ZSwKIAkJCQlsYXRlbmN5LT5jdXJzb3JfaHBsbF9kaXNhYmxlKTsKIAlyZWcgPSBJOTE1X1JFQUQoRFNQRlczKTsKIAlyZWcgJj0gfigweDNmIDw8IDE2KTsKIAlyZWcgfD0gKHdtICYgMHgzZikgPDwgMTY7CiAJSTkxNV9XUklURShEU1BGVzMsIHJlZyk7Ci0JRFJNX0RFQlVHKCJEU1BGVzMgcmVnaXN0ZXIgaXMgJXhcbiIsIHJlZyk7CisJRFJNX0RFQlVHX0tNUygiRFNQRlczIHJlZ2lzdGVyIGlzICV4XG4iLCByZWcpOwogCiAJLyogYWN0aXZhdGUgY3hzciAqLwogCXJlZyA9IEk5MTVfUkVBRChEU1BGVzMpOwotCXJlZyB8PSBJR0RfU0VMRl9SRUZSRVNIX0VOOworCXJlZyB8PSBQSU5FVklFV19TRUxGX1JFRlJFU0hfRU47CiAJSTkxNV9XUklURShEU1BGVzMsIHJlZyk7CiAKIAlEUk1fSU5GTygiQmlnIEZJRk8gaXMgZW5hYmxlZFxuIik7CkBAIC0yMzg0LDggKzI0NjIsOCBAQAogCQlzaXplID0gKChkc3BhcmIgPj4gRFNQQVJCX0NTVEFSVF9TSElGVCkgJiAweDdmKSAtCiAJCQkoZHNwYXJiICYgMHg3Zik7CiAKLQlEUk1fREVCVUcoIkZJRk8gc2l6ZSAtICgweCUwOHgpICVzOiAlZFxuIiwgZHNwYXJiLCBwbGFuZSA/ICJCIiA6ICJBIiwKLQkJICBzaXplKTsKKwlEUk1fREVCVUdfS01TKCJGSUZPIHNpemUgLSAoMHglMDh4KSAlczogJWRcbiIsIGRzcGFyYiwKKwkJCXBsYW5lID8gIkIiIDogIkEiLCBzaXplKTsKIAogCXJldHVybiBzaXplOwogfQpAQCAtMjQwMyw4ICsyNDgxLDggQEAKIAkJCShkc3BhcmIgJiAweDFmZik7CiAJc2l6ZSA+Pj0gMTsgLyogQ29udmVydCB0byBjYWNoZWxpbmVzICovCiAKLQlEUk1fREVCVUcoIkZJRk8gc2l6ZSAtICgweCUwOHgpICVzOiAlZFxuIiwgZHNwYXJiLCBwbGFuZSA/ICJCIiA6ICJBIiwKLQkJICBzaXplKTsKKwlEUk1fREVCVUdfS01TKCJGSUZPIHNpemUgLSAoMHglMDh4KSAlczogJWRcbiIsIGRzcGFyYiwKKwkJCXBsYW5lID8gIkIiIDogIkEiLCBzaXplKTsKIAogCXJldHVybiBzaXplOwogfQpAQCAtMjQxOCw3ICsyNDk2LDggQEAKIAlzaXplID0gZHNwYXJiICYgMHg3ZjsKIAlzaXplID4+PSAyOyAvKiBDb252ZXJ0IHRvIGNhY2hlbGluZXMgKi8KIAotCURSTV9ERUJVRygiRklGTyBzaXplIC0gKDB4JTA4eCkgJXM6ICVkXG4iLCBkc3BhcmIsIHBsYW5lID8gIkIiIDogIkEiLAorCURSTV9ERUJVR19LTVMoIkZJRk8gc2l6ZSAtICgweCUwOHgpICVzOiAlZFxuIiwgZHNwYXJiLAorCQkJcGxhbmUgPyAiQiIgOiAiQSIsCiAJCSAgc2l6ZSk7CiAKIAlyZXR1cm4gc2l6ZTsKQEAgLTI0MzMsOCArMjUxMiw4IEBACiAJc2l6ZSA9IGRzcGFyYiAmIDB4N2Y7CiAJc2l6ZSA+Pj0gMTsgLyogQ29udmVydCB0byBjYWNoZWxpbmVzICovCiAKLQlEUk1fREVCVUcoIkZJRk8gc2l6ZSAtICgweCUwOHgpICVzOiAlZFxuIiwgZHNwYXJiLCBwbGFuZSA/ICJCIiA6ICJBIiwKLQkJICBzaXplKTsKKwlEUk1fREVCVUdfS01TKCJGSUZPIHNpemUgLSAoMHglMDh4KSAlczogJWRcbiIsIGRzcGFyYiwKKwkJCXBsYW5lID8gIkIiIDogIkEiLCBzaXplKTsKIAogCXJldHVybiBzaXplOwogfQpAQCAtMjUwOSwxNSArMjU4OCwzOSBAQAogCQkgICAoY3Vyc29yX3NyIDw8IERTUEZXX0NVUlNPUl9TUl9TSElGVCkpOwogfQogCi1zdGF0aWMgdm9pZCBpOTY1X3VwZGF0ZV93bShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgdW51c2VkLCBpbnQgdW51c2VkMiwKLQkJCSAgIGludCB1bnVzZWQzLCBpbnQgdW51c2VkNCkKK3N0YXRpYyB2b2lkIGk5NjVfdXBkYXRlX3dtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwbGFuZWFfY2xvY2ssCisJCQkgICBpbnQgcGxhbmViX2Nsb2NrLCBpbnQgc3JfaGRpc3BsYXksIGludCBwaXhlbF9zaXplKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgbG9uZyBsaW5lX3RpbWVfdXM7CisJaW50IHNyX2Nsb2NrLCBzcl9lbnRyaWVzLCBzcndtID0gMTsKIAotCURSTV9ERUJVRygiU2V0dGluZyBGSUZPIHdhdGVybWFya3MgLSBBOiA4LCBCOiA4LCBDOiA4LCBTUiA4XG4iKTsKKwkvKiBDYWxjIHNyIGVudHJpZXMgZm9yIG9uZSBwbGFuZSBjb25maWdzICovCisJaWYgKHNyX2hkaXNwbGF5ICYmICghcGxhbmVhX2Nsb2NrIHx8ICFwbGFuZWJfY2xvY2spKSB7CisJCS8qIHNlbGYtcmVmcmVzaCBoYXMgbXVjaCBoaWdoZXIgbGF0ZW5jeSAqLworCQljb25zdCBzdGF0aWMgaW50IHNyX2xhdGVuY3lfbnMgPSAxMjAwMDsKKworCQlzcl9jbG9jayA9IHBsYW5lYV9jbG9jayA/IHBsYW5lYV9jbG9jayA6IHBsYW5lYl9jbG9jazsKKwkJbGluZV90aW1lX3VzID0gKChzcl9oZGlzcGxheSAqIDEwMDApIC8gc3JfY2xvY2spOworCisJCS8qIFVzZSBucy91cyB0aGVuIGRpdmlkZSB0byBwcmVzZXJ2ZSBwcmVjaXNpb24gKi8KKwkJc3JfZW50cmllcyA9ICgoKHNyX2xhdGVuY3lfbnMgLyBsaW5lX3RpbWVfdXMpICsgMSkgKgorCQkJICAgICAgcGl4ZWxfc2l6ZSAqIHNyX2hkaXNwbGF5KSAvIDEwMDA7CisJCXNyX2VudHJpZXMgPSByb3VuZHVwKHNyX2VudHJpZXMgLyBJOTE1X0ZJRk9fTElORV9TSVpFLCAxKTsKKwkJRFJNX0RFQlVHKCJzZWxmLXJlZnJlc2ggZW50cmllczogJWRcbiIsIHNyX2VudHJpZXMpOworCQlzcndtID0gSTk0NV9GSUZPX1NJWkUgLSBzcl9lbnRyaWVzOworCQlpZiAoc3J3bSA8IDApCisJCQlzcndtID0gMTsKKwkJc3J3bSAmPSAweDNmOworCQlJOTE1X1dSSVRFKEZXX0JMQ19TRUxGLCBGV19CTENfU0VMRl9FTik7CisJfQorCisJRFJNX0RFQlVHX0tNUygiU2V0dGluZyBGSUZPIHdhdGVybWFya3MgLSBBOiA4LCBCOiA4LCBDOiA4LCBTUiAlZFxuIiwKKwkJICAgICAgc3J3bSk7CiAKIAkvKiA5NjUgaGFzIGxpbWl0YXRpb25zLi4uICovCi0JSTkxNV9XUklURShEU1BGVzEsICg4IDw8IDE2KSB8ICg4IDw8IDgpIHwgKDggPDwgMCkpOworCUk5MTVfV1JJVEUoRFNQRlcxLCAoc3J3bSA8PCBEU1BGV19TUl9TSElGVCkgfCAoOCA8PCAxNikgfCAoOCA8PCA4KSB8CisJCSAgICg4IDw8IDApKTsKIAlJOTE1X1dSSVRFKERTUEZXMiwgKDggPDwgOCkgfCAoOCA8PCAwKSk7CiB9CiAKQEAgLTI1NTMsNyArMjY1Niw3IEBACiAJCQkJICAgICAgIHBpeGVsX3NpemUsIGxhdGVuY3lfbnMpOwogCXBsYW5lYl93bSA9IGludGVsX2NhbGN1bGF0ZV93bShwbGFuZWJfY2xvY2ssICZwbGFuZWJfcGFyYW1zLAogCQkJCSAgICAgICBwaXhlbF9zaXplLCBsYXRlbmN5X25zKTsKLQlEUk1fREVCVUcoIkZJRk8gd2F0ZXJtYXJrcyAtIEE6ICVkLCBCOiAlZFxuIiwgcGxhbmVhX3dtLCBwbGFuZWJfd20pOworCURSTV9ERUJVR19LTVMoIkZJRk8gd2F0ZXJtYXJrcyAtIEE6ICVkLCBCOiAlZFxuIiwgcGxhbmVhX3dtLCBwbGFuZWJfd20pOwogCiAJLyoKIAkgKiBPdmVybGF5IGdldHMgYW4gYWdncmVzc2l2ZSBkZWZhdWx0IHNpbmNlIHZpZGVvIGppdHRlciBpcyBiYWQuCkBAIC0yNTczLDE0ICsyNjc2LDE0IEBACiAJCXNyX2VudHJpZXMgPSAoKChzcl9sYXRlbmN5X25zIC8gbGluZV90aW1lX3VzKSArIDEpICoKIAkJCSAgICAgIHBpeGVsX3NpemUgKiBzcl9oZGlzcGxheSkgLyAxMDAwOwogCQlzcl9lbnRyaWVzID0gcm91bmR1cChzcl9lbnRyaWVzIC8gY2FjaGVsaW5lX3NpemUsIDEpOwotCQlEUk1fREVCVUcoInNlbGYtcmVmcmVzaCBlbnRyaWVzOiAlZFxuIiwgc3JfZW50cmllcyk7CisJCURSTV9ERUJVR19LTVMoInNlbGYtcmVmcmVzaCBlbnRyaWVzOiAlZFxuIiwgc3JfZW50cmllcyk7CiAJCXNyd20gPSB0b3RhbF9zaXplIC0gc3JfZW50cmllczsKIAkJaWYgKHNyd20gPCAwKQogCQkJc3J3bSA9IDE7CiAJCUk5MTVfV1JJVEUoRldfQkxDX1NFTEYsIEZXX0JMQ19TRUxGX0VOIHwgKHNyd20gJiAweDNmKSk7CiAJfQogCi0JRFJNX0RFQlVHKCJTZXR0aW5nIEZJRk8gd2F0ZXJtYXJrcyAtIEE6ICVkLCBCOiAlZCwgQzogJWQsIFNSICVkXG4iLAorCURSTV9ERUJVR19LTVMoIlNldHRpbmcgRklGTyB3YXRlcm1hcmtzIC0gQTogJWQsIEI6ICVkLCBDOiAlZCwgU1IgJWRcbiIsCiAJCSAgcGxhbmVhX3dtLCBwbGFuZWJfd20sIGN3bSwgc3J3bSk7CiAKIAlmd2F0ZXJfbG8gPSAoKHBsYW5lYl93bSAmIDB4M2YpIDw8IDE2KSB8IChwbGFuZWFfd20gJiAweDNmKTsKQEAgLTI2MDcsNyArMjcxMCw3IEBACiAJCQkJICAgICAgIHBpeGVsX3NpemUsIGxhdGVuY3lfbnMpOwogCWZ3YXRlcl9sbyB8PSAoMzw8OCkgfCBwbGFuZWFfd207CiAKLQlEUk1fREVCVUcoIlNldHRpbmcgRklGTyB3YXRlcm1hcmtzIC0gQTogJWRcbiIsIHBsYW5lYV93bSk7CisJRFJNX0RFQlVHX0tNUygiU2V0dGluZyBGSUZPIHdhdGVybWFya3MgLSBBOiAlZFxuIiwgcGxhbmVhX3dtKTsKIAogCUk5MTVfV1JJVEUoRldfQkxDLCBmd2F0ZXJfbG8pOwogfQpAQCAtMjY2MSwxMSArMjc2NCwxMSBAQAogCQlpZiAoY3J0Yy0+ZW5hYmxlZCkgewogCQkJZW5hYmxlZCsrOwogCQkJaWYgKGludGVsX2NydGMtPnBsYW5lID09IDApIHsKLQkJCQlEUk1fREVCVUcoInBsYW5lIEEgKHBpcGUgJWQpIGNsb2NrOiAlZFxuIiwKKwkJCQlEUk1fREVCVUdfS01TKCJwbGFuZSBBIChwaXBlICVkKSBjbG9jazogJWRcbiIsCiAJCQkJCSAgaW50ZWxfY3J0Yy0+cGlwZSwgY3J0Yy0+bW9kZS5jbG9jayk7CiAJCQkJcGxhbmVhX2Nsb2NrID0gY3J0Yy0+bW9kZS5jbG9jazsKIAkJCX0gZWxzZSB7Ci0JCQkJRFJNX0RFQlVHKCJwbGFuZSBCIChwaXBlICVkKSBjbG9jazogJWRcbiIsCisJCQkJRFJNX0RFQlVHX0tNUygicGxhbmUgQiAocGlwZSAlZCkgY2xvY2s6ICVkXG4iLAogCQkJCQkgIGludGVsX2NydGMtPnBpcGUsIGNydGMtPm1vZGUuY2xvY2spOwogCQkJCXBsYW5lYl9jbG9jayA9IGNydGMtPm1vZGUuY2xvY2s7CiAJCQl9CkBAIC0yNjgyLDEwICsyNzg1LDEwIEBACiAJCXJldHVybjsKIAogCS8qIFNpbmdsZSBwbGFuZSBjb25maWdzIGNhbiBlbmFibGUgc2VsZiByZWZyZXNoICovCi0JaWYgKGVuYWJsZWQgPT0gMSAmJiBJU19JR0QoZGV2KSkKLQkJaWdkX2VuYWJsZV9jeHNyKGRldiwgc3JfY2xvY2ssIHBpeGVsX3NpemUpOwotCWVsc2UgaWYgKElTX0lHRChkZXYpKQotCQlpZ2RfZGlzYWJsZV9jeHNyKGRldik7CisJaWYgKGVuYWJsZWQgPT0gMSAmJiBJU19QSU5FVklFVyhkZXYpKQorCQlwaW5ldmlld19lbmFibGVfY3hzcihkZXYsIHNyX2Nsb2NrLCBwaXhlbF9zaXplKTsKKwllbHNlIGlmIChJU19QSU5FVklFVyhkZXYpKQorCQlwaW5ldmlld19kaXNhYmxlX2N4c3IoZGV2KTsKIAogCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bShkZXYsIHBsYW5lYV9jbG9jaywgcGxhbmViX2Nsb2NrLAogCQkJCSAgICBzcl9oZGlzcGxheSwgcGl4ZWxfc2l6ZSk7CkBAIC0yNzc5LDEwICsyODgyLDExIEBACiAKIAlpZiAoaXNfbHZkcyAmJiBkZXZfcHJpdi0+bHZkc191c2Vfc3NjICYmIG51bV9vdXRwdXRzIDwgMikgewogCQlyZWZjbGsgPSBkZXZfcHJpdi0+bHZkc19zc2NfZnJlcSAqIDEwMDA7Ci0JCURSTV9ERUJVRygidXNpbmcgU1NDIHJlZmVyZW5jZSBjbG9jayBvZiAlZCBNSHpcbiIsIHJlZmNsayAvIDEwMDApOworCQlEUk1fREVCVUdfS01TKCJ1c2luZyBTU0MgcmVmZXJlbmNlIGNsb2NrIG9mICVkIE1IelxuIiwKKwkJCQkJcmVmY2xrIC8gMTAwMCk7CiAJfSBlbHNlIGlmIChJU19JOVhYKGRldikpIHsKIAkJcmVmY2xrID0gOTYwMDA7Ci0JCWlmIChJU19JR0RORyhkZXYpKQorCQlpZiAoSVNfSVJPTkxBS0UoZGV2KSkKIAkJCXJlZmNsayA9IDEyMDAwMDsgLyogMTIwTWh6IHJlZmNsayAqLwogCX0gZWxzZSB7CiAJCXJlZmNsayA9IDQ4MDAwOwpAQCAtMjgwMiwxNCArMjkwNiwyNSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAobGltaXQtPmZpbmRfcmVkdWNlZF9wbGwgJiYgZGV2X3ByaXYtPmx2ZHNfZG93bmNsb2NrX2F2YWlsKSB7CisJaWYgKGlzX2x2ZHMgJiYgbGltaXQtPmZpbmRfcmVkdWNlZF9wbGwgJiYKKwkJCWRldl9wcml2LT5sdmRzX2Rvd25jbG9ja19hdmFpbCkgewogCQltZW1jcHkoJnJlZHVjZWRfY2xvY2ssICZjbG9jaywgc2l6ZW9mKGludGVsX2Nsb2NrX3QpKTsKIAkJaGFzX3JlZHVjZWRfY2xvY2sgPSBsaW1pdC0+ZmluZF9yZWR1Y2VkX3BsbChsaW1pdCwgY3J0YywKLQkJCQkJCQkgICAgKGFkanVzdGVkX21vZGUtPmNsb2NrKjMvNCksCisJCQkJCQkJICAgIGRldl9wcml2LT5sdmRzX2Rvd25jbG9jaywKIAkJCQkJCQkgICAgcmVmY2xrLAogCQkJCQkJCSAgICAmcmVkdWNlZF9jbG9jayk7CisJCWlmIChoYXNfcmVkdWNlZF9jbG9jayAmJiAoY2xvY2sucCAhPSByZWR1Y2VkX2Nsb2NrLnApKSB7CisJCQkvKgorCQkJICogSWYgdGhlIGRpZmZlcmVudCBQIGlzIGZvdW5kLCBpdCBtZWFucyB0aGF0IHdlIGNhbid0CisJCQkgKiBzd2l0Y2ggdGhlIGRpc3BsYXkgY2xvY2sgYnkgdXNpbmcgdGhlIEZQMC9GUDEuCisJCQkgKiBJbiBzdWNoIGNhc2Ugd2Ugd2lsbCBkaXNhYmxlIHRoZSBMVkRTIGRvd25jbG9jaworCQkJICogZmVhdHVyZS4KKwkJCSAqLworCQkJRFJNX0RFQlVHX0tNUygiRGlmZmVyZW50IFAgaXMgZm91bmQgZm9yICIKKwkJCQkJCSJMVkRTIGNsb2NrL2Rvd25jbG9ja1xuIik7CisJCQloYXNfcmVkdWNlZF9jbG9jayA9IDA7CisJCX0KIAl9Ci0KIAkvKiBTRFZPIFRWIGhhcyBmaXhlZCBQTEwgdmFsdWVzIGRlcGVuZCBvbiBpdHMgY2xvY2sgcmFuZ2UsCiAJICAgdGhpcyBtaXJyb3JzIHZiaW9zIHNldHRpbmcuICovCiAJaWYgKGlzX3Nkdm8gJiYgaXNfdHYpIHsKQEAgLTI4MzEsNyArMjk0Niw3IEBACiAJfQogCiAJLyogRkRJIGxpbmsgKi8KLQlpZiAoSVNfSUdETkcoZGV2KSkgeworCWlmIChJU19JUk9OTEFLRShkZXYpKSB7CiAJCWludCBsYW5lLCBsaW5rX2J3LCBicHA7CiAJCS8qIGVEUCBkb2Vzbid0IHJlcXVpcmUgRkRJIGxpbmssIHNvIGp1c3Qgc2V0IERQIE0vTgogCQkgICBhY2NvcmRpbmcgdG8gY3VycmVudCBsaW5rIGNvbmZpZyAqLwpAQCAtMjg3Myw4ICsyOTg4LDcgQEAKIAkJCWJwcCA9IDI0OwogCQl9CiAKLQkJaWdkbmdfY29tcHV0ZV9tX24oYnBwLCBsYW5lLCB0YXJnZXRfY2xvY2ssCi0JCQkJICBsaW5rX2J3LCAmbV9uKTsKKwkJaXJvbmxha2VfY29tcHV0ZV9tX24oYnBwLCBsYW5lLCB0YXJnZXRfY2xvY2ssIGxpbmtfYncsICZtX24pOwogCX0KIAogCS8qIElyb25sYWtlOiB0cnkgdG8gc2V0dXAgZGlzcGxheSByZWYgY2xvY2sgYmVmb3JlIERQTEwKQEAgLTI4ODIsNyArMjk5Niw3IEBACiAJICogUENIIEIgc3RlcHBpbmcsIHByZXZpb3VzIGNoaXBzZXQgc3RlcHBpbmcgc2hvdWxkIGJlCiAJICogaWdub3JpbmcgdGhpcyBzZXR0aW5nLgogCSAqLwotCWlmIChJU19JR0RORyhkZXYpKSB7CisJaWYgKElTX0lST05MQUtFKGRldikpIHsKIAkJdGVtcCA9IEk5MTVfUkVBRChQQ0hfRFJFRl9DT05UUk9MKTsKIAkJLyogQWx3YXlzIGVuYWJsZSBub25zcHJlYWQgc291cmNlICovCiAJCXRlbXAgJj0gfkRSRUZfTk9OU1BSRUFEX1NPVVJDRV9NQVNLOwpAQCAtMjkxNyw3ICszMDMxLDcgQEAKIAkJfQogCX0KIAotCWlmIChJU19JR0QoZGV2KSkgeworCWlmIChJU19QSU5FVklFVyhkZXYpKSB7CiAJCWZwID0gKDEgPDwgY2xvY2subikgPDwgMTYgfCBjbG9jay5tMSA8PCA4IHwgY2xvY2subTI7CiAJCWlmIChoYXNfcmVkdWNlZF9jbG9jaykKIAkJCWZwMiA9ICgxIDw8IHJlZHVjZWRfY2xvY2subikgPDwgMTYgfApAQCAtMjkyOSw3ICszMDQzLDcgQEAKIAkJCQlyZWR1Y2VkX2Nsb2NrLm0yOwogCX0KIAotCWlmICghSVNfSUdETkcoZGV2KSkKKwlpZiAoIUlTX0lST05MQUtFKGRldikpCiAJCWRwbGwgPSBEUExMX1ZHQV9NT0RFX0RJUzsKIAogCWlmIChJU19JOVhYKGRldikpIHsKQEAgLTI5NDIsMTkgKzMwNTYsMTkgQEAKIAkJCXNkdm9fcGl4ZWxfbXVsdGlwbHkgPSBhZGp1c3RlZF9tb2RlLT5jbG9jayAvIG1vZGUtPmNsb2NrOwogCQkJaWYgKElTX0k5NDVHKGRldikgfHwgSVNfSTk0NUdNKGRldikgfHwgSVNfRzMzKGRldikpCiAJCQkJZHBsbCB8PSAoc2R2b19waXhlbF9tdWx0aXBseSAtIDEpIDw8IFNEVk9fTVVMVElQTElFUl9TSElGVF9ISVJFUzsKLQkJCWVsc2UgaWYgKElTX0lHRE5HKGRldikpCisJCQllbHNlIGlmIChJU19JUk9OTEFLRShkZXYpKQogCQkJCWRwbGwgfD0gKHNkdm9fcGl4ZWxfbXVsdGlwbHkgLSAxKSA8PCBQTExfUkVGX1NEVk9fSERNSV9NVUxUSVBMSUVSX1NISUZUOwogCQl9CiAJCWlmIChpc19kcCkKIAkJCWRwbGwgfD0gRFBMTF9EVk9fSElHSF9TUEVFRDsKIAogCQkvKiBjb21wdXRlIGJpdG1hc2sgZnJvbSBwMSB2YWx1ZSAqLwotCQlpZiAoSVNfSUdEKGRldikpCi0JCQlkcGxsIHw9ICgxIDw8IChjbG9jay5wMSAtIDEpKSA8PCBEUExMX0ZQQTAxX1AxX1BPU1RfRElWX1NISUZUX0lHRDsKKwkJaWYgKElTX1BJTkVWSUVXKGRldikpCisJCQlkcGxsIHw9ICgxIDw8IChjbG9jay5wMSAtIDEpKSA8PCBEUExMX0ZQQTAxX1AxX1BPU1RfRElWX1NISUZUX1BJTkVWSUVXOwogCQllbHNlIHsKIAkJCWRwbGwgfD0gKDEgPDwgKGNsb2NrLnAxIC0gMSkpIDw8IERQTExfRlBBMDFfUDFfUE9TVF9ESVZfU0hJRlQ7CiAJCQkvKiBhbHNvIEZQQTEgKi8KLQkJCWlmIChJU19JR0RORyhkZXYpKQorCQkJaWYgKElTX0lST05MQUtFKGRldikpCiAJCQkJZHBsbCB8PSAoMSA8PCAoY2xvY2sucDEgLSAxKSkgPDwgRFBMTF9GUEExX1AxX1BPU1RfRElWX1NISUZUOwogCQkJaWYgKElTX0c0WChkZXYpICYmIGhhc19yZWR1Y2VkX2Nsb2NrKQogCQkJCWRwbGwgfD0gKDEgPDwgKHJlZHVjZWRfY2xvY2sucDEgLSAxKSkgPDwgRFBMTF9GUEExX1AxX1BPU1RfRElWX1NISUZUOwpAQCAtMjk3Myw3ICszMDg3LDcgQEAKIAkJCWRwbGwgfD0gRFBMTEJfTFZEU19QMl9DTE9DS19ESVZfMTQ7CiAJCQlicmVhazsKIAkJfQotCQlpZiAoSVNfSTk2NUcoZGV2KSAmJiAhSVNfSUdETkcoZGV2KSkKKwkJaWYgKElTX0k5NjVHKGRldikgJiYgIUlTX0lST05MQUtFKGRldikpCiAJCQlkcGxsIHw9ICg2IDw8IFBMTF9MT0FEX1BVTFNFX1BIQVNFX1NISUZUKTsKIAl9IGVsc2UgewogCQlpZiAoaXNfbHZkcykgewpAQCAtMzAwNSw5ICszMTE5LDkgQEAKIAkvKiBTZXQgdXAgdGhlIGRpc3BsYXkgcGxhbmUgcmVnaXN0ZXIgKi8KIAlkc3BjbnRyID0gRElTUFBMQU5FX0dBTU1BX0VOQUJMRTsKIAotCS8qIElHRE5HJ3MgcGxhbmUgaXMgZm9yY2VkIHRvIHBpcGUsIGJpdCAyNCBpcyB0bworCS8qIElyb25sYWtlJ3MgcGxhbmUgaXMgZm9yY2VkIHRvIHBpcGUsIGJpdCAyNCBpcyB0bwogCSAgIGVuYWJsZSBjb2xvciBzcGFjZSBjb252ZXJzaW9uICovCi0JaWYgKCFJU19JR0RORyhkZXYpKSB7CisJaWYgKCFJU19JUk9OTEFLRShkZXYpKSB7CiAJCWlmIChwaXBlID09IDApCiAJCQlkc3BjbnRyICY9IH5ESVNQUExBTkVfU0VMX1BJUEVfTUFTSzsKIAkJZWxzZQpAQCAtMzAzNCwyMCArMzE0OCwyMCBAQAogCiAKIAkvKiBEaXNhYmxlIHRoZSBwYW5lbCBmaXR0ZXIgaWYgaXQgd2FzIG9uIG91ciBwaXBlICovCi0JaWYgKCFJU19JR0RORyhkZXYpICYmIGludGVsX3BhbmVsX2ZpdHRlcl9waXBlKGRldikgPT0gcGlwZSkKKwlpZiAoIUlTX0lST05MQUtFKGRldikgJiYgaW50ZWxfcGFuZWxfZml0dGVyX3BpcGUoZGV2KSA9PSBwaXBlKQogCQlJOTE1X1dSSVRFKFBGSVRfQ09OVFJPTCwgMCk7CiAKLQlEUk1fREVCVUcoIk1vZGUgZm9yIHBpcGUgJWM6XG4iLCBwaXBlID09IDAgPyAnQScgOiAnQicpOworCURSTV9ERUJVR19LTVMoIk1vZGUgZm9yIHBpcGUgJWM6XG4iLCBwaXBlID09IDAgPyAnQScgOiAnQicpOwogCWRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUobW9kZSk7CiAKLQkvKiBhc3NpZ24gdG8gSUdETkcgcmVnaXN0ZXJzICovCi0JaWYgKElTX0lHRE5HKGRldikpIHsKKwkvKiBhc3NpZ24gdG8gSXJvbmxha2UgcmVnaXN0ZXJzICovCisJaWYgKElTX0lST05MQUtFKGRldikpIHsKIAkJZnBfcmVnID0gcGNoX2ZwX3JlZzsKIAkJZHBsbF9yZWcgPSBwY2hfZHBsbF9yZWc7CiAJfQogCiAJaWYgKGlzX2VkcCkgewotCQlpZ2RuZ19kaXNhYmxlX3BsbF9lZHAoY3J0Yyk7CisJCWlyb25sYWtlX2Rpc2FibGVfcGxsX2VkcChjcnRjKTsKIAl9IGVsc2UgaWYgKChkcGxsICYgRFBMTF9WQ09fRU5BQkxFKSkgewogCQlJOTE1X1dSSVRFKGZwX3JlZywgZnApOwogCQlJOTE1X1dSSVRFKGRwbGxfcmVnLCBkcGxsICYgfkRQTExfVkNPX0VOQUJMRSk7CkBAIC0zMDYyLDcgKzMxNzYsNyBAQAogCWlmIChpc19sdmRzKSB7CiAJCXUzMiBsdmRzOwogCi0JCWlmIChJU19JR0RORyhkZXYpKQorCQlpZiAoSVNfSVJPTkxBS0UoZGV2KSkKIAkJCWx2ZHNfcmVnID0gUENIX0xWRFM7CiAKIAkJbHZkcyA9IEk5MTVfUkVBRChsdmRzX3JlZyk7CkBAIC0zMDk1LDcgKzMyMDksNyBAQAogCQkvKiBXYWl0IGZvciB0aGUgY2xvY2tzIHRvIHN0YWJpbGl6ZS4gKi8KIAkJdWRlbGF5KDE1MCk7CiAKLQkJaWYgKElTX0k5NjVHKGRldikgJiYgIUlTX0lHRE5HKGRldikpIHsKKwkJaWYgKElTX0k5NjVHKGRldikgJiYgIUlTX0lST05MQUtFKGRldikpIHsKIAkJCWlmIChpc19zZHZvKSB7CiAJCQkJc2R2b19waXhlbF9tdWx0aXBseSA9IGFkanVzdGVkX21vZGUtPmNsb2NrIC8gbW9kZS0+Y2xvY2s7CiAJCQkJSTkxNV9XUklURShkcGxsX21kX3JlZywgKDAgPDwgRFBMTF9NRF9VRElfRElWSURFUl9TSElGVCkgfApAQCAtMzExNSwxNCArMzIyOSwxNCBAQAogCQlJOTE1X1dSSVRFKGZwX3JlZyArIDQsIGZwMik7CiAJCWludGVsX2NydGMtPmxvd2ZyZXFfYXZhaWwgPSB0cnVlOwogCQlpZiAoSEFTX1BJUEVfQ1hTUihkZXYpKSB7Ci0JCQlEUk1fREVCVUcoImVuYWJsaW5nIEN4U1IgZG93bmNsb2NraW5nXG4iKTsKKwkJCURSTV9ERUJVR19LTVMoImVuYWJsaW5nIEN4U1IgZG93bmNsb2NraW5nXG4iKTsKIAkJCXBpcGVjb25mIHw9IFBJUEVDT05GX0NYU1JfRE9XTkNMT0NLOwogCQl9CiAJfSBlbHNlIHsKIAkJSTkxNV9XUklURShmcF9yZWcgKyA0LCBmcCk7CiAJCWludGVsX2NydGMtPmxvd2ZyZXFfYXZhaWwgPSBmYWxzZTsKIAkJaWYgKEhBU19QSVBFX0NYU1IoZGV2KSkgewotCQkJRFJNX0RFQlVHKCJkaXNhYmxpbmcgQ3hTUiBkb3duY2xvY2tpbmdcbiIpOworCQkJRFJNX0RFQlVHX0tNUygiZGlzYWJsaW5nIEN4U1IgZG93bmNsb2NraW5nXG4iKTsKIAkJCXBpcGVjb25mICY9IH5QSVBFQ09ORl9DWFNSX0RPV05DTE9DSzsKIAkJfQogCX0KQEAgLTMxNDIsMjEgKzMyNTYsMjEgQEAKIAkvKiBwaXBlc3JjIGFuZCBkc3BzaXplIGNvbnRyb2wgdGhlIHNpemUgdGhhdCBpcyBzY2FsZWQgZnJvbSwgd2hpY2ggc2hvdWxkCiAJICogYWx3YXlzIGJlIHRoZSB1c2VyJ3MgcmVxdWVzdGVkIHNpemUuCiAJICovCi0JaWYgKCFJU19JR0RORyhkZXYpKSB7CisJaWYgKCFJU19JUk9OTEFLRShkZXYpKSB7CiAJCUk5MTVfV1JJVEUoZHNwc2l6ZV9yZWcsICgobW9kZS0+dmRpc3BsYXkgLSAxKSA8PCAxNikgfAogCQkJCShtb2RlLT5oZGlzcGxheSAtIDEpKTsKIAkJSTkxNV9XUklURShkc3Bwb3NfcmVnLCAwKTsKIAl9CiAJSTkxNV9XUklURShwaXBlc3JjX3JlZywgKChtb2RlLT5oZGlzcGxheSAtIDEpIDw8IDE2KSB8IChtb2RlLT52ZGlzcGxheSAtIDEpKTsKIAotCWlmIChJU19JR0RORyhkZXYpKSB7CisJaWYgKElTX0lST05MQUtFKGRldikpIHsKIAkJSTkxNV9XUklURShkYXRhX20xX3JlZywgVFVfU0laRShtX24udHUpIHwgbV9uLmdtY2hfbSk7CiAJCUk5MTVfV1JJVEUoZGF0YV9uMV9yZWcsIFRVX1NJWkUobV9uLnR1KSB8IG1fbi5nbWNoX24pOwogCQlJOTE1X1dSSVRFKGxpbmtfbTFfcmVnLCBtX24ubGlua19tKTsKIAkJSTkxNV9XUklURShsaW5rX24xX3JlZywgbV9uLmxpbmtfbik7CiAKIAkJaWYgKGlzX2VkcCkgewotCQkJaWdkbmdfc2V0X3BsbF9lZHAoY3J0YywgYWRqdXN0ZWRfbW9kZS0+Y2xvY2spOworCQkJaXJvbmxha2Vfc2V0X3BsbF9lZHAoY3J0YywgYWRqdXN0ZWRfbW9kZS0+Y2xvY2spOwogCQl9IGVsc2UgewogCQkJLyogZW5hYmxlIEZESSBSWCBQTEwgdG9vICovCiAJCQl0ZW1wID0gSTkxNV9SRUFEKGZkaV9yeF9yZWcpOwpAQCAtMzE3MCw3ICszMjg0LDcgQEAKIAogCWludGVsX3dhaXRfZm9yX3ZibGFuayhkZXYpOwogCi0JaWYgKElTX0lHRE5HKGRldikpIHsKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkgewogCQkvKiBlbmFibGUgYWRkcmVzcyBzd2l6emxlIGZvciB0aWxpbmcgYnVmZmVyICovCiAJCXRlbXAgPSBJOTE1X1JFQUQoRElTUF9BUkJfQ1RMKTsKIAkJSTkxNV9XUklURShESVNQX0FSQl9DVEwsIHRlbXAgfCBESVNQX1RJTEVfU1VSRkFDRV9TV0laWkxJTkcpOwpAQCAtMzIwNCw4ICszMzE4LDggQEAKIAlpZiAoIWNydGMtPmVuYWJsZWQpCiAJCXJldHVybjsKIAotCS8qIHVzZSBsZWdhY3kgcGFsZXR0ZSBmb3IgSUdETkcgKi8KLQlpZiAoSVNfSUdETkcoZGV2KSkKKwkvKiB1c2UgbGVnYWN5IHBhbGV0dGUgZm9yIElyb25sYWtlICovCisJaWYgKElTX0lST05MQUtFKGRldikpCiAJCXBhbHJlZyA9IChpbnRlbF9jcnRjLT5waXBlID09IDApID8gTEdDX1BBTEVUVEVfQSA6CiAJCQkJCQkgICBMR0NfUEFMRVRURV9COwogCkBAIC0zMjM0LDExICszMzQ4LDExIEBACiAJc2l6ZV90IGFkZHI7CiAJaW50IHJldDsKIAotCURSTV9ERUJVRygiXG4iKTsKKwlEUk1fREVCVUdfS01TKCJcbiIpOwogCiAJLyogaWYgd2Ugd2FudCB0byB0dXJuIG9mZiB0aGUgY3Vyc29yIGlnbm9yZSB3aWR0aCBhbmQgaGVpZ2h0ICovCiAJaWYgKCFoYW5kbGUpIHsKLQkJRFJNX0RFQlVHKCJjdXJzb3Igb2ZmXG4iKTsKKwkJRFJNX0RFQlVHX0tNUygiY3Vyc29yIG9mZlxuIik7CiAJCWlmIChJU19NT0JJTEUoZGV2KSB8fCBJU19JOVhYKGRldikpIHsKIAkJCXRlbXAgJj0gfihDVVJTT1JfTU9ERSB8IE1DVVJTT1JfR0FNTUFfRU5BQkxFKTsKIAkJCXRlbXAgfD0gQ1VSU09SX01PREVfRElTQUJMRTsKQEAgLTM1NDYsMTggKzM2NjAsMTggQEAKIAkJZnAgPSBJOTE1X1JFQUQoKHBpcGUgPT0gMCkgPyBGUEExIDogRlBCMSk7CiAKIAljbG9jay5tMSA9IChmcCAmIEZQX00xX0RJVl9NQVNLKSA+PiBGUF9NMV9ESVZfU0hJRlQ7Ci0JaWYgKElTX0lHRChkZXYpKSB7Ci0JCWNsb2NrLm4gPSBmZnMoKGZwICYgRlBfTl9JR0RfRElWX01BU0spID4+IEZQX05fRElWX1NISUZUKSAtIDE7Ci0JCWNsb2NrLm0yID0gKGZwICYgRlBfTTJfSUdEX0RJVl9NQVNLKSA+PiBGUF9NMl9ESVZfU0hJRlQ7CisJaWYgKElTX1BJTkVWSUVXKGRldikpIHsKKwkJY2xvY2subiA9IGZmcygoZnAgJiBGUF9OX1BJTkVWSUVXX0RJVl9NQVNLKSA+PiBGUF9OX0RJVl9TSElGVCkgLSAxOworCQljbG9jay5tMiA9IChmcCAmIEZQX00yX1BJTkVWSUVXX0RJVl9NQVNLKSA+PiBGUF9NMl9ESVZfU0hJRlQ7CiAJfSBlbHNlIHsKIAkJY2xvY2subiA9IChmcCAmIEZQX05fRElWX01BU0spID4+IEZQX05fRElWX1NISUZUOwogCQljbG9jay5tMiA9IChmcCAmIEZQX00yX0RJVl9NQVNLKSA+PiBGUF9NMl9ESVZfU0hJRlQ7CiAJfQogCiAJaWYgKElTX0k5WFgoZGV2KSkgewotCQlpZiAoSVNfSUdEKGRldikpCi0JCQljbG9jay5wMSA9IGZmcygoZHBsbCAmIERQTExfRlBBMDFfUDFfUE9TVF9ESVZfTUFTS19JR0QpID4+Ci0JCQkJRFBMTF9GUEEwMV9QMV9QT1NUX0RJVl9TSElGVF9JR0QpOworCQlpZiAoSVNfUElORVZJRVcoZGV2KSkKKwkJCWNsb2NrLnAxID0gZmZzKChkcGxsICYgRFBMTF9GUEEwMV9QMV9QT1NUX0RJVl9NQVNLX1BJTkVWSUVXKSA+PgorCQkJCURQTExfRlBBMDFfUDFfUE9TVF9ESVZfU0hJRlRfUElORVZJRVcpOwogCQllbHNlCiAJCQljbG9jay5wMSA9IGZmcygoZHBsbCAmIERQTExfRlBBMDFfUDFfUE9TVF9ESVZfTUFTSykgPj4KIAkJCSAgICAgICBEUExMX0ZQQTAxX1AxX1BPU1RfRElWX1NISUZUKTsKQEAgLTM1NzIsNyArMzY4Niw3IEBACiAJCQkJNyA6IDE0OwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlEUk1fREVCVUcoIlVua25vd24gRFBMTCBtb2RlICUwOHggaW4gcHJvZ3JhbW1lZCAiCisJCQlEUk1fREVCVUdfS01TKCJVbmtub3duIERQTEwgbW9kZSAlMDh4IGluIHByb2dyYW1tZWQgIgogCQkJCSAgIm1vZGVcbiIsIChpbnQpKGRwbGwgJiBEUExMX01PREVfTUFTSykpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTM2NTgsNyArMzc3Miw3IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKWFyZzsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAotCURSTV9ERUJVRygiaWRsZSB0aW1lciBmaXJlZCwgZG93bmNsb2NraW5nXG4iKTsKKwlEUk1fREVCVUdfRFJJVkVSKCJpZGxlIHRpbWVyIGZpcmVkLCBkb3duY2xvY2tpbmdcbiIpOwogCiAJZGV2X3ByaXYtPmJ1c3kgPSBmYWxzZTsKIApAQCAtMzY2OSwxMSArMzc4MywxMSBAQAogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCi0JaWYgKElTX0lHRE5HKGRldikpCisJaWYgKElTX0lST05MQUtFKGRldikpCiAJCXJldHVybjsKIAogCWlmICghZGV2X3ByaXYtPnJlbmRlcl9yZWNsb2NrX2F2YWlsKSB7Ci0JCURSTV9ERUJVRygibm90IHJlY2xvY2tpbmcgcmVuZGVyIGNsb2NrXG4iKTsKKwkJRFJNX0RFQlVHX0RSSVZFUigibm90IHJlY2xvY2tpbmcgcmVuZGVyIGNsb2NrXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzY4Miw3ICszNzk2LDcgQEAKIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldi0+cGRldiwgR0NGR0MsIGRldl9wcml2LT5vcmlnX2Nsb2NrKTsKIAllbHNlIGlmIChJU19JODVYKGRldikpCiAJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYtPnBkZXYsIEhQTExDQywgZGV2X3ByaXYtPm9yaWdfY2xvY2spOwotCURSTV9ERUJVRygiaW5jcmVhc2luZyByZW5kZXIgY2xvY2sgZnJlcXVlbmN5XG4iKTsKKwlEUk1fREVCVUdfRFJJVkVSKCJpbmNyZWFzaW5nIHJlbmRlciBjbG9jayBmcmVxdWVuY3lcbiIpOwogCiAJLyogU2NoZWR1bGUgZG93bmNsb2NrICovCiAJaWYgKHNjaGVkdWxlKQpAQCAtMzY5NCwxMSArMzgwOCwxMSBAQAogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCi0JaWYgKElTX0lHRE5HKGRldikpCisJaWYgKElTX0lST05MQUtFKGRldikpCiAJCXJldHVybjsKIAogCWlmICghZGV2X3ByaXYtPnJlbmRlcl9yZWNsb2NrX2F2YWlsKSB7Ci0JCURSTV9ERUJVRygibm90IHJlY2xvY2tpbmcgcmVuZGVyIGNsb2NrXG4iKTsKKwkJRFJNX0RFQlVHX0RSSVZFUigibm90IHJlY2xvY2tpbmcgcmVuZGVyIGNsb2NrXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzc1OCw3ICszODcyLDcgQEAKIAogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LT5wZGV2LCBIUExMQ0MsIGhwbGxjYyk7CiAJfQotCURSTV9ERUJVRygiZGVjcmVhc2luZyByZW5kZXIgY2xvY2sgZnJlcXVlbmN5XG4iKTsKKwlEUk1fREVCVUdfRFJJVkVSKCJkZWNyZWFzaW5nIHJlbmRlciBjbG9jayBmcmVxdWVuY3lcbiIpOwogfQogCiAvKiBOb3RlIHRoYXQgbm8gaW5jcmVhc2UgZnVuY3Rpb24gaXMgbmVlZGVkIGZvciB0aGlzIC0gaW5jcmVhc2VfcmVuZGVyY2xvY2soKQpAQCAtMzc2Niw3ICszODgwLDcgQEAKICAqLwogdm9pZCBpbnRlbF9kZWNyZWFzZV9kaXNwbGF5Y2xvY2soc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlpZiAoSVNfSUdETkcoZGV2KSkKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkKIAkJcmV0dXJuOwogCiAJaWYgKElTX0k5NDVHKGRldikgfHwgSVNfSTk0NUdNKGRldikgfHwgSVNfSTkxNUcoZGV2KSB8fApAQCAtMzc5Miw3ICszOTA2LDcgQEAKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSAmaW50ZWxfY3J0Yy0+YmFzZTsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gY3J0Yy0+ZGV2LT5kZXZfcHJpdmF0ZTsKIAotCURSTV9ERUJVRygiaWRsZSB0aW1lciBmaXJlZCwgZG93bmNsb2NraW5nXG4iKTsKKwlEUk1fREVCVUdfRFJJVkVSKCJpZGxlIHRpbWVyIGZpcmVkLCBkb3duY2xvY2tpbmdcbiIpOwogCiAJaW50ZWxfY3J0Yy0+YnVzeSA9IGZhbHNlOwogCkBAIC0zODA4LDE0ICszOTIyLDE0IEBACiAJaW50IGRwbGxfcmVnID0gKHBpcGUgPT0gMCkgPyBEUExMX0EgOiBEUExMX0I7CiAJaW50IGRwbGwgPSBJOTE1X1JFQUQoZHBsbF9yZWcpOwogCi0JaWYgKElTX0lHRE5HKGRldikpCisJaWYgKElTX0lST05MQUtFKGRldikpCiAJCXJldHVybjsKIAogCWlmICghZGV2X3ByaXYtPmx2ZHNfZG93bmNsb2NrX2F2YWlsKQogCQlyZXR1cm47CiAKIAlpZiAoIUhBU19QSVBFX0NYU1IoZGV2KSAmJiAoZHBsbCAmIERJU1BMQVlfUkFURV9TRUxFQ1RfRlBBMSkpIHsKLQkJRFJNX0RFQlVHKCJ1cGNsb2NraW5nIExWRFNcbiIpOworCQlEUk1fREVCVUdfRFJJVkVSKCJ1cGNsb2NraW5nIExWRFNcbiIpOwogCiAJCS8qIFVubG9jayBwYW5lbCByZWdzICovCiAJCUk5MTVfV1JJVEUoUFBfQ09OVFJPTCwgSTkxNV9SRUFEKFBQX0NPTlRST0wpIHwgKDB4YWJjZCA8PCAxNikpOwpAQCAtMzgyNiw3ICszOTQwLDcgQEAKIAkJaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGRldik7CiAJCWRwbGwgPSBJOTE1X1JFQUQoZHBsbF9yZWcpOwogCQlpZiAoZHBsbCAmIERJU1BMQVlfUkFURV9TRUxFQ1RfRlBBMSkKLQkJCURSTV9ERUJVRygiZmFpbGVkIHRvIHVwY2xvY2sgTFZEUyFcbiIpOworCQkJRFJNX0RFQlVHX0RSSVZFUigiZmFpbGVkIHRvIHVwY2xvY2sgTFZEUyFcbiIpOwogCiAJCS8qIC4uLmFuZCBsb2NrIHRoZW0gYWdhaW4gKi8KIAkJSTkxNV9XUklURShQUF9DT05UUk9MLCBJOTE1X1JFQUQoUFBfQ09OVFJPTCkgJiAweDMpOwpAQCAtMzg0Nyw3ICszOTYxLDcgQEAKIAlpbnQgZHBsbF9yZWcgPSAocGlwZSA9PSAwKSA/IERQTExfQSA6IERQTExfQjsKIAlpbnQgZHBsbCA9IEk5MTVfUkVBRChkcGxsX3JlZyk7CiAKLQlpZiAoSVNfSUdETkcoZGV2KSkKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkKIAkJcmV0dXJuOwogCiAJaWYgKCFkZXZfcHJpdi0+bHZkc19kb3duY2xvY2tfYXZhaWwpCkBAIC0zODU4LDcgKzM5NzIsNyBAQAogCSAqIHRoZSBtYW51YWwgY2FzZS4KIAkgKi8KIAlpZiAoIUhBU19QSVBFX0NYU1IoZGV2KSAmJiBpbnRlbF9jcnRjLT5sb3dmcmVxX2F2YWlsKSB7Ci0JCURSTV9ERUJVRygiZG93bmNsb2NraW5nIExWRFNcbiIpOworCQlEUk1fREVCVUdfRFJJVkVSKCJkb3duY2xvY2tpbmcgTFZEU1xuIik7CiAKIAkJLyogVW5sb2NrIHBhbmVsIHJlZ3MgKi8KIAkJSTkxNV9XUklURShQUF9DT05UUk9MLCBJOTE1X1JFQUQoUFBfQ09OVFJPTCkgfCAoMHhhYmNkIDw8IDE2KSk7CkBAIC0zODY5LDcgKzM5ODMsNyBAQAogCQlpbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2KTsKIAkJZHBsbCA9IEk5MTVfUkVBRChkcGxsX3JlZyk7CiAJCWlmICghKGRwbGwgJiBESVNQTEFZX1JBVEVfU0VMRUNUX0ZQQTEpKQotCQkJRFJNX0RFQlVHKCJmYWlsZWQgdG8gZG93bmNsb2NrIExWRFMhXG4iKTsKKwkJCURSTV9ERUJVR19EUklWRVIoImZhaWxlZCB0byBkb3duY2xvY2sgTFZEUyFcbiIpOwogCiAJCS8qIC4uLmFuZCBsb2NrIHRoZW0gYWdhaW4gKi8KIAkJSTkxNV9XUklURShQUF9DT05UUk9MLCBJOTE1X1JFQUQoUFBfQ09OVFJPTCkgJiAweDMpOwpAQCAtMzkzNiw4ICs0MDUwLDEzIEBACiAJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQogCQlyZXR1cm47CiAKLQlkZXZfcHJpdi0+YnVzeSA9IHRydWU7Ci0JaW50ZWxfaW5jcmVhc2VfcmVuZGVyY2xvY2soZGV2LCB0cnVlKTsKKwlpZiAoIWRldl9wcml2LT5idXN5KSB7CisJCWRldl9wcml2LT5idXN5ID0gdHJ1ZTsKKwkJaW50ZWxfaW5jcmVhc2VfcmVuZGVyY2xvY2soZGV2LCB0cnVlKTsKKwl9IGVsc2UgeworCQltb2RfdGltZXIoJmRldl9wcml2LT5pZGxlX3RpbWVyLCBqaWZmaWVzICsKKwkJCSAgbXNlY3NfdG9famlmZmllcyhHUFVfSURMRV9USU1FT1VUKSk7CisJfQogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKIAkJaWYgKCFjcnRjLT5mYikKQEAgLTM5NjcsNiArNDA4NiwxNTggQEAKIAlrZnJlZShpbnRlbF9jcnRjKTsKIH0KIAorc3RydWN0IGludGVsX3VucGluX3dvcmsgeworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CisJc3RydWN0IGRybV9wZW5kaW5nX3ZibGFua19ldmVudCAqZXZlbnQ7CisJaW50IHBlbmRpbmc7Cit9OworCitzdGF0aWMgdm9pZCBpbnRlbF91bnBpbl93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqX193b3JrKQoreworCXN0cnVjdCBpbnRlbF91bnBpbl93b3JrICp3b3JrID0KKwkJY29udGFpbmVyX29mKF9fd29yaywgc3RydWN0IGludGVsX3VucGluX3dvcmssIHdvcmspOworCisJbXV0ZXhfbG9jaygmd29yay0+ZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCWk5MTVfZ2VtX29iamVjdF91bnBpbih3b3JrLT5vYmopOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKHdvcmstPm9iaik7CisJbXV0ZXhfdW5sb2NrKCZ3b3JrLT5kZXYtPnN0cnVjdF9tdXRleCk7CisJa2ZyZWUod29yayk7Cit9CisKK3ZvaWQgaW50ZWxfZmluaXNoX3BhZ2VfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSkKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBkZXZfcHJpdi0+cGlwZV90b19jcnRjX21hcHBpbmdbcGlwZV07CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCXN0cnVjdCBpbnRlbF91bnBpbl93b3JrICp3b3JrOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICplOworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogSWdub3JlIGVhcmx5IHZibGFuayBpcnFzICovCisJaWYgKGludGVsX2NydGMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCXdvcmsgPSBpbnRlbF9jcnRjLT51bnBpbl93b3JrOworCWlmICh3b3JrID09IE5VTEwgfHwgIXdvcmstPnBlbmRpbmcpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlpbnRlbF9jcnRjLT51bnBpbl93b3JrID0gTlVMTDsKKwlkcm1fdmJsYW5rX3B1dChkZXYsIGludGVsX2NydGMtPnBpcGUpOworCisJaWYgKHdvcmstPmV2ZW50KSB7CisJCWUgPSB3b3JrLT5ldmVudDsKKwkJZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCQllLT5ldmVudC5zZXF1ZW5jZSA9IGRybV92YmxhbmtfY291bnQoZGV2LCBpbnRlbF9jcnRjLT5waXBlKTsKKwkJZS0+ZXZlbnQudHZfc2VjID0gbm93LnR2X3NlYzsKKwkJZS0+ZXZlbnQudHZfdXNlYyA9IG5vdy50dl91c2VjOworCQlsaXN0X2FkZF90YWlsKCZlLT5iYXNlLmxpbmssCisJCQkgICAgICAmZS0+YmFzZS5maWxlX3ByaXYtPmV2ZW50X2xpc3QpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmUtPmJhc2UuZmlsZV9wcml2LT5ldmVudF93YWl0KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKworCW9ial9wcml2ID0gd29yay0+b2JqLT5kcml2ZXJfcHJpdmF0ZTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmb2JqX3ByaXYtPnBlbmRpbmdfZmxpcCkpCisJCURSTV9XQUtFVVAoJmRldl9wcml2LT5wZW5kaW5nX2ZsaXBfcXVldWUpOworCXNjaGVkdWxlX3dvcmsoJndvcmstPndvcmspOworfQorCit2b2lkIGludGVsX3ByZXBhcmVfcGFnZV9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwbGFuZSkKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9CisJCXRvX2ludGVsX2NydGMoZGV2X3ByaXYtPnBsYW5lX3RvX2NydGNfbWFwcGluZ1twbGFuZV0pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJaWYgKGludGVsX2NydGMtPnVucGluX3dvcmspCisJCWludGVsX2NydGMtPnVucGluX3dvcmstPnBlbmRpbmcgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGludGVsX2NydGNfcGFnZV9mbGlwKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQlzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCXN0cnVjdCBpbnRlbF91bnBpbl93b3JrICp3b3JrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKwlSSU5HX0xPQ0FMUzsKKworCXdvcmsgPSBremFsbG9jKHNpemVvZiAqd29yaywgR0ZQX0tFUk5FTCk7CisJaWYgKHdvcmsgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwl3b3JrLT5ldmVudCA9IGV2ZW50OworCXdvcmstPmRldiA9IGNydGMtPmRldjsKKwlpbnRlbF9mYiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVyKGNydGMtPmZiKTsKKwl3b3JrLT5vYmogPSBpbnRlbF9mYi0+b2JqOworCUlOSVRfV09SSygmd29yay0+d29yaywgaW50ZWxfdW5waW5fd29ya19mbik7CisKKwkvKiBXZSBib3Jyb3cgdGhlIGV2ZW50IHNwaW4gbG9jayBmb3IgcHJvdGVjdGluZyB1bnBpbl93b3JrICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCWlmIChpbnRlbF9jcnRjLT51bnBpbl93b3JrKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCQlrZnJlZSh3b3JrKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWludGVsX2NydGMtPnVucGluX3dvcmsgPSB3b3JrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCisJaW50ZWxfZmIgPSB0b19pbnRlbF9mcmFtZWJ1ZmZlcihmYik7CisJb2JqID0gaW50ZWxfZmItPm9iajsKKworCXJldCA9IGludGVsX3Bpbl9hbmRfZmVuY2VfZmJfb2JqKGRldiwgb2JqKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJa2ZyZWUod29yayk7CisJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFJlZmVyZW5jZSB0aGUgb2xkIGZiIG9iamVjdCBmb3IgdGhlIHNjaGVkdWxlZCB3b3JrLiAqLworCWRybV9nZW1fb2JqZWN0X3JlZmVyZW5jZSh3b3JrLT5vYmopOworCisJY3J0Yy0+ZmIgPSBmYjsKKwlpOTE1X2dlbV9vYmplY3RfZmx1c2hfd3JpdGVfZG9tYWluKG9iaik7CisJZHJtX3ZibGFua19nZXQoZGV2LCBpbnRlbF9jcnRjLT5waXBlKTsKKwlvYmpfcHJpdiA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CisJYXRvbWljX2luYygmb2JqX3ByaXYtPnBlbmRpbmdfZmxpcCk7CisKKwlCRUdJTl9MUF9SSU5HKDQpOworCU9VVF9SSU5HKE1JX0RJU1BMQVlfRkxJUCB8CisJCSBNSV9ESVNQTEFZX0ZMSVBfUExBTkUoaW50ZWxfY3J0Yy0+cGxhbmUpKTsKKwlPVVRfUklORyhmYi0+cGl0Y2gpOworCWlmIChJU19JOTY1RyhkZXYpKSB7CisJCU9VVF9SSU5HKG9ial9wcml2LT5ndHRfb2Zmc2V0IHwgb2JqX3ByaXYtPnRpbGluZ19tb2RlKTsKKwkJT1VUX1JJTkcoKGZiLT53aWR0aCA8PCAxNikgfCBmYi0+aGVpZ2h0KTsKKwl9IGVsc2UgeworCQlPVVRfUklORyhvYmpfcHJpdi0+Z3R0X29mZnNldCk7CisJCU9VVF9SSU5HKE1JX05PT1ApOworCX0KKwlBRFZBTkNFX0xQX1JJTkcoKTsKKworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzIGludGVsX2hlbHBlcl9mdW5jcyA9IHsKIAkuZHBtcyA9IGludGVsX2NydGNfZHBtcywKIAkubW9kZV9maXh1cCA9IGludGVsX2NydGNfbW9kZV9maXh1cCwKQEAgLTM5ODMsMTEgKzQyNTQsMTMgQEAKIAkuZ2FtbWFfc2V0ID0gaW50ZWxfY3J0Y19nYW1tYV9zZXQsCiAJLnNldF9jb25maWcgPSBkcm1fY3J0Y19oZWxwZXJfc2V0X2NvbmZpZywKIAkuZGVzdHJveSA9IGludGVsX2NydGNfZGVzdHJveSwKKwkucGFnZV9mbGlwID0gaW50ZWxfY3J0Y19wYWdlX2ZsaXAsCiB9OwogCiAKIHN0YXRpYyB2b2lkIGludGVsX2NydGNfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSkKIHsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YzsKIAlpbnQgaTsKIApAQCAtNDAxMCwxMCArNDI4MywxNSBAQAogCWludGVsX2NydGMtPnBpcGUgPSBwaXBlOwogCWludGVsX2NydGMtPnBsYW5lID0gcGlwZTsKIAlpZiAoSVNfTU9CSUxFKGRldikgJiYgKElTX0k5WFgoZGV2KSAmJiAhSVNfSTk2NUcoZGV2KSkpIHsKLQkJRFJNX0RFQlVHKCJzd2FwcGluZyBwaXBlcyAmIHBsYW5lcyBmb3IgRkJDXG4iKTsKKwkJRFJNX0RFQlVHX0tNUygic3dhcHBpbmcgcGlwZXMgJiBwbGFuZXMgZm9yIEZCQ1xuIik7CiAJCWludGVsX2NydGMtPnBsYW5lID0gKChwaXBlID09IDApID8gMSA6IDApOwogCX0KIAorCUJVR19PTihwaXBlID49IEFSUkFZX1NJWkUoZGV2X3ByaXYtPnBsYW5lX3RvX2NydGNfbWFwcGluZykgfHwKKwkgICAgICAgZGV2X3ByaXYtPnBsYW5lX3RvX2NydGNfbWFwcGluZ1tpbnRlbF9jcnRjLT5wbGFuZV0gIT0gTlVMTCk7CisJZGV2X3ByaXYtPnBsYW5lX3RvX2NydGNfbWFwcGluZ1tpbnRlbF9jcnRjLT5wbGFuZV0gPSAmaW50ZWxfY3J0Yy0+YmFzZTsKKwlkZXZfcHJpdi0+cGlwZV90b19jcnRjX21hcHBpbmdbaW50ZWxfY3J0Yy0+cGlwZV0gPSAmaW50ZWxfY3J0Yy0+YmFzZTsKKwogCWludGVsX2NydGMtPmN1cnNvcl9hZGRyID0gMDsKIAlpbnRlbF9jcnRjLT5kcG1zX21vZGUgPSBEUk1fTU9ERV9EUE1TX09GRjsKIAlkcm1fY3J0Y19oZWxwZXJfYWRkKCZpbnRlbF9jcnRjLT5iYXNlLCAmaW50ZWxfaGVscGVyX2Z1bmNzKTsKQEAgLTQwOTAsNyArNDM2OCw3IEBACiAJaWYgKElTX01PQklMRShkZXYpICYmICFJU19JODMwKGRldikpCiAJCWludGVsX2x2ZHNfaW5pdChkZXYpOwogCi0JaWYgKElTX0lHRE5HKGRldikpIHsKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkgewogCQlpbnQgZm91bmQ7CiAKIAkJaWYgKElTX01PQklMRShkZXYpICYmIChJOTE1X1JFQUQoRFBfQSkgJiBEUF9ERVRFQ1RFRCkpCkBAIC00MTE4LDcgKzQzOTYsNyBAQAogCQlpZiAoSTkxNV9SRUFEKFBDSF9EUF9EKSAmIERQX0RFVEVDVEVEKQogCQkJaW50ZWxfZHBfaW5pdChkZXYsIFBDSF9EUF9EKTsKIAotCX0gZWxzZSBpZiAoSVNfSTlYWChkZXYpKSB7CisJfSBlbHNlIGlmIChTVVBQT1JUU19ESUdJVEFMX09VVFBVVFMoZGV2KSkgewogCQlib29sIGZvdW5kID0gZmFsc2U7CiAKIAkJaWYgKEk5MTVfUkVBRChTRFZPQikgJiBTRFZPX0RFVEVDVEVEKSB7CkBAIC00MTQ1LDEwICs0NDIzLDEwIEBACiAKIAkJaWYgKFNVUFBPUlRTX0lOVEVHUkFURURfRFAoZGV2KSAmJiAoSTkxNV9SRUFEKERQX0QpICYgRFBfREVURUNURUQpKQogCQkJaW50ZWxfZHBfaW5pdChkZXYsIERQX0QpOwotCX0gZWxzZQorCX0gZWxzZSBpZiAoSVNfSThYWChkZXYpKQogCQlpbnRlbF9kdm9faW5pdChkZXYpOwogCi0JaWYgKElTX0k5WFgoZGV2KSAmJiBJU19NT0JJTEUoZGV2KSAmJiAhSVNfSUdETkcoZGV2KSkKKwlpZiAoU1VQUE9SVFNfVFYoZGV2KSkKIAkJaW50ZWxfdHZfaW5pdChkZXYpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CkBAIC00MjU3LDcgKzQ1MzUsNyBAQAogCSAqIERpc2FibGUgY2xvY2sgZ2F0aW5nIHJlcG9ydGVkIHRvIHdvcmsgaW5jb3JyZWN0bHkgYWNjb3JkaW5nIHRvIHRoZQogCSAqIHNwZWNzLCBidXQgZW5hYmxlIGFzIG11Y2ggZWxzZSBhcyB3ZSBjYW4uCiAJICovCi0JaWYgKElTX0lHRE5HKGRldikpIHsKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkgewogCQlyZXR1cm47CiAJfSBlbHNlIGlmIChJU19HNFgoZGV2KSkgewogCQl1aW50MzJfdCBkc3BjbGtfZ2F0ZTsKQEAgLTQyOTEsMTEgKzQ1NjksNTIgQEAKIAkJZHN0YXRlIHw9IERTVEFURV9QTExfRDNfT0ZGIHwgRFNUQVRFX0dGWF9DTE9DS19HQVRJTkcgfAogCQkJRFNUQVRFX0RPVF9DTE9DS19HQVRJTkc7CiAJCUk5MTVfV1JJVEUoRF9TVEFURSwgZHN0YXRlKTsKLQl9IGVsc2UgaWYgKElTX0k4NTUoZGV2KSB8fCBJU19JODY1RyhkZXYpKSB7CisJfSBlbHNlIGlmIChJU19JODVYKGRldikgfHwgSVNfSTg2NUcoZGV2KSkgewogCQlJOTE1X1dSSVRFKFJFTkNMS19HQVRFX0QxLCBTVl9DTE9DS19HQVRFX0RJU0FCTEUpOwogCX0gZWxzZSBpZiAoSVNfSTgzMChkZXYpKSB7CiAJCUk5MTVfV1JJVEUoRFNQQ0xLX0dBVEVfRCwgT1ZSVU5JVF9DTE9DS19HQVRFX0RJU0FCTEUpOwogCX0KKworCS8qCisJICogR1BVIGNhbiBhdXRvbWF0aWNhbGx5IHBvd2VyIGRvd24gdGhlIHJlbmRlciB1bml0IGlmIGdpdmVuIGEgcGFnZQorCSAqIHRvIHNhdmUgc3RhdGUuCisJICovCisJaWYgKEk5MTVfSEFTX1JDNihkZXYpKSB7CisJCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqcHdyY3R4OworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJCWludCByZXQ7CisKKwkJaWYgKGRldl9wcml2LT5wd3JjdHgpIHsKKwkJCW9ial9wcml2ID0gZGV2X3ByaXYtPnB3cmN0eC0+ZHJpdmVyX3ByaXZhdGU7CisJCX0gZWxzZSB7CisJCQlwd3JjdHggPSBkcm1fZ2VtX29iamVjdF9hbGxvYyhkZXYsIDQwOTYpOworCQkJaWYgKCFwd3JjdHgpIHsKKwkJCQlEUk1fREVCVUcoImZhaWxlZCB0byBhbGxvYyBwb3dlciBjb250ZXh0LCAiCisJCQkJCSAgIlJDNiBkaXNhYmxlZFxuIik7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4ocHdyY3R4LCA0MDk2KTsKKwkJCWlmIChyZXQpIHsKKwkJCQlEUk1fRVJST1IoImZhaWxlZCB0byBwaW4gcG93ZXIgY29udGV4dDogJWRcbiIsCisJCQkJCSAgcmV0KTsKKwkJCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShwd3JjdHgpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4ocHdyY3R4LCAxKTsKKworCQkJZGV2X3ByaXYtPnB3cmN0eCA9IHB3cmN0eDsKKwkJCW9ial9wcml2ID0gcHdyY3R4LT5kcml2ZXJfcHJpdmF0ZTsKKwkJfQorCisJCUk5MTVfV1JJVEUoUFdSQ1RYQSwgb2JqX3ByaXYtPmd0dF9vZmZzZXQgfCBQV1JDVFhfRU4pOworCQlJOTE1X1dSSVRFKE1DSEJBUl9SRU5ERVJfU1RBTkRCWSwKKwkJCSAgIEk5MTVfUkVBRChNQ0hCQVJfUkVOREVSX1NUQU5EQlkpICYgflJDWF9TV19FWElUKTsKKwl9CisKK291dDoKKwlyZXR1cm47CiB9CiAKIC8qIFNldCB1cCBjaGlwIHNwZWNpZmljIGRpc3BsYXkgZnVuY3Rpb25zICovCkBAIC00MzA0LDggKzQ2MjMsOCBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKIAkvKiBXZSBhbHdheXMgd2FudCBhIERQTVMgZnVuY3Rpb24gKi8KLQlpZiAoSVNfSUdETkcoZGV2KSkKLQkJZGV2X3ByaXYtPmRpc3BsYXkuZHBtcyA9IGlnZG5nX2NydGNfZHBtczsKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkKKwkJZGV2X3ByaXYtPmRpc3BsYXkuZHBtcyA9IGlyb25sYWtlX2NydGNfZHBtczsKIAllbHNlCiAJCWRldl9wcml2LT5kaXNwbGF5LmRwbXMgPSBpOXh4X2NydGNfZHBtczsKIApAQCAtNDMyNCwxMyArNDY0MywxMyBAQAogCX0KIAogCS8qIFJldHVybnMgdGhlIGNvcmUgZGlzcGxheSBjbG9jayBzcGVlZCAqLwotCWlmIChJU19JOTQ1RyhkZXYpKQorCWlmIChJU19JOTQ1RyhkZXYpIHx8IChJU19HMzMoZGV2KSAmJiAhIElTX1BJTkVWSUVXX00oZGV2KSkpCiAJCWRldl9wcml2LT5kaXNwbGF5LmdldF9kaXNwbGF5X2Nsb2NrX3NwZWVkID0KIAkJCWk5NDVfZ2V0X2Rpc3BsYXlfY2xvY2tfc3BlZWQ7CiAJZWxzZSBpZiAoSVNfSTkxNUcoZGV2KSkKIAkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2Rpc3BsYXlfY2xvY2tfc3BlZWQgPQogCQkJaTkxNV9nZXRfZGlzcGxheV9jbG9ja19zcGVlZDsKLQllbHNlIGlmIChJU19JOTQ1R00oZGV2KSB8fCBJU184NDVHKGRldikgfHwgSVNfSUdER00oZGV2KSkKKwllbHNlIGlmIChJU19JOTQ1R00oZGV2KSB8fCBJU184NDVHKGRldikgfHwgSVNfUElORVZJRVdfTShkZXYpKQogCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfZGlzcGxheV9jbG9ja19zcGVlZCA9CiAJCQlpOXh4X21pc2NfZ2V0X2Rpc3BsYXlfY2xvY2tfc3BlZWQ7CiAJZWxzZSBpZiAoSVNfSTkxNUdNKGRldikpCkBAIC00MzM5LDcgKzQ2NTgsNyBAQAogCWVsc2UgaWYgKElTX0k4NjVHKGRldikpCiAJCWRldl9wcml2LT5kaXNwbGF5LmdldF9kaXNwbGF5X2Nsb2NrX3NwZWVkID0KIAkJCWk4NjVfZ2V0X2Rpc3BsYXlfY2xvY2tfc3BlZWQ7Ci0JZWxzZSBpZiAoSVNfSTg1NShkZXYpKQorCWVsc2UgaWYgKElTX0k4NVgoZGV2KSkKIAkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2Rpc3BsYXlfY2xvY2tfc3BlZWQgPQogCQkJaTg1NV9nZXRfZGlzcGxheV9jbG9ja19zcGVlZDsKIAllbHNlIC8qIDg1MiwgODMwICovCkBAIC00MzQ3LDcgKzQ2NjYsNyBAQAogCQkJaTgzMF9nZXRfZGlzcGxheV9jbG9ja19zcGVlZDsKIAogCS8qIEZvciBGSUZPIHdhdGVybWFyayB1cGRhdGVzICovCi0JaWYgKElTX0lHRE5HKGRldikpCisJaWYgKElTX0lST05MQUtFKGRldikpCiAJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IE5VTEw7CiAJZWxzZSBpZiAoSVNfRzRYKGRldikpCiAJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IGc0eF91cGRhdGVfd207CkBAIC00NDAzLDcgKzQ3MjIsNyBAQAogCQludW1fcGlwZSA9IDI7CiAJZWxzZQogCQludW1fcGlwZSA9IDE7Ci0JRFJNX0RFQlVHKCIlZCBkaXNwbGF5IHBpcGUlcyBhdmFpbGFibGUuXG4iLAorCURSTV9ERUJVR19LTVMoIiVkIGRpc3BsYXkgcGlwZSVzIGF2YWlsYWJsZS5cbiIsCiAJCSAgbnVtX3BpcGUsIG51bV9waXBlID4gMSA/ICJzIiA6ICIiKTsKIAogCWlmIChJU19JODVYKGRldikpCkBAIC00NDIyLDYgKzQ3NDEsMTUgQEAKIAlJTklUX1dPUksoJmRldl9wcml2LT5pZGxlX3dvcmssIGludGVsX2lkbGVfdXBkYXRlKTsKIAlzZXR1cF90aW1lcigmZGV2X3ByaXYtPmlkbGVfdGltZXIsIGludGVsX2dwdV9pZGxlX3RpbWVyLAogCQkgICAgKHVuc2lnbmVkIGxvbmcpZGV2KTsKKworCWludGVsX3NldHVwX292ZXJsYXkoZGV2KTsKKworCWlmIChJU19QSU5FVklFVyhkZXYpICYmICFpbnRlbF9nZXRfY3hzcl9sYXRlbmN5KElTX1BJTkVWSUVXX0coZGV2KSwKKwkJCQkJCQlkZXZfcHJpdi0+ZnNiX2ZyZXEsCisJCQkJCQkJZGV2X3ByaXYtPm1lbV9mcmVxKSkKKwkJRFJNX0lORk8oImZhaWxlZCB0byBmaW5kIGtub3duIEN4U1IgbGF0ZW5jeSAiCisJCQkgIihmb3VuZCBmc2IgZnJlcSAlZCwgbWVtIGZyZXEgJWQpLCBkaXNhYmxpbmcgQ3hTUlxuIiwKKwkJCSBkZXZfcHJpdi0+ZnNiX2ZyZXEsIGRldl9wcml2LT5tZW1fZnJlcSk7CiB9CiAKIHZvaWQgaW50ZWxfbW9kZXNldF9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC00NDQ1LDExICs0NzczLDIxIEBACiAJaW50ZWxfaW5jcmVhc2VfcmVuZGVyY2xvY2soZGV2LCBmYWxzZSk7CiAJZGVsX3RpbWVyX3N5bmMoJmRldl9wcml2LT5pZGxlX3RpbWVyKTsKIAotCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCiAJaWYgKGRldl9wcml2LT5kaXNwbGF5LmRpc2FibGVfZmJjKQogCQlkZXZfcHJpdi0+ZGlzcGxheS5kaXNhYmxlX2ZiYyhkZXYpOwogCisJaWYgKGRldl9wcml2LT5wd3JjdHgpIHsKKwkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCisJCW9ial9wcml2ID0gZGV2X3ByaXYtPnB3cmN0eC0+ZHJpdmVyX3ByaXZhdGU7CisJCUk5MTVfV1JJVEUoUFdSQ1RYQSwgb2JqX3ByaXYtPmd0dF9vZmZzZXQgJn4gUFdSQ1RYX0VOKTsKKwkJSTkxNV9SRUFEKFBXUkNUWEEpOworCQlpOTE1X2dlbV9vYmplY3RfdW5waW4oZGV2X3ByaXYtPnB3cmN0eCk7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGRldl9wcml2LT5wd3JjdHgpOworCX0KKworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCiAJZHJtX21vZGVfY29uZmlnX2NsZWFudXAoZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMKaW5kZXggZDgzNDQ3NS4uNGU3YWE4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcC5jCkBAIC0zMyw3ICszMyw4IEBACiAjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCiAjaW5jbHVkZSAiaTkxNV9kcm0uaCIKICNpbmNsdWRlICJpOTE1X2Rydi5oIgotI2luY2x1ZGUgImludGVsX2RwLmgiCisjaW5jbHVkZSAiZHJtX2RwX2hlbHBlci5oIgorCiAKICNkZWZpbmUgRFBfTElOS19TVEFUVVNfU0laRQk2CiAjZGVmaW5lIERQX0xJTktfQ0hFQ0tfVElNRU9VVAkoMTAgKiAxMDAwKQpAQCAtMjIzLDggKzIyNCw4IEBACiAJICovCiAJaWYgKElTX2VEUChpbnRlbF9vdXRwdXQpKQogCQlhdXhfY2xvY2tfZGl2aWRlciA9IDIyNTsgLyogZURQIGlucHV0IGNsb2NrIGF0IDQ1ME1oeiAqLwotCWVsc2UgaWYgKElTX0lHRE5HKGRldikpCi0JCWF1eF9jbG9ja19kaXZpZGVyID0gNjI7IC8qIElHRE5HOiBpbnB1dCBjbG9jayBmaXhlZCBhdCAxMjVNaHogKi8KKwllbHNlIGlmIChJU19JUk9OTEFLRShkZXYpKQorCQlhdXhfY2xvY2tfZGl2aWRlciA9IDYyOyAvKiBJUkwgaW5wdXQgY2xvY2sgZml4ZWQgYXQgMTI1TWh6ICovCiAJZWxzZQogCQlhdXhfY2xvY2tfZGl2aWRlciA9IGludGVsX2hyYXdjbGsoZGV2KSAvIDI7CiAKQEAgLTI4Miw3ICsyODMsNyBAQAogCS8qIFRpbWVvdXRzIG9jY3VyIHdoZW4gdGhlIGRldmljZSBpc24ndCBjb25uZWN0ZWQsIHNvIHRoZXkncmUKIAkgKiAibm9ybWFsIiAtLSBkb24ndCBmaWxsIHRoZSBrZXJuZWwgbG9nIHdpdGggdGhlc2UgKi8KIAlpZiAoc3RhdHVzICYgRFBfQVVYX0NIX0NUTF9USU1FX09VVF9FUlJPUikgewotCQlEUk1fREVCVUcoImRwX2F1eF9jaCB0aW1lb3V0IHN0YXR1cyAweCUwOHhcbiIsIHN0YXR1cyk7CisJCURSTV9ERUJVR19LTVMoImRwX2F1eF9jaCB0aW1lb3V0IHN0YXR1cyAweCUwOHhcbiIsIHN0YXR1cyk7CiAJCXJldHVybiAtRVRJTUVET1VUOwogCX0KIApAQCAtMzgyLDE3ICszODMsNzcgQEAKIH0KIAogc3RhdGljIGludAotaW50ZWxfZHBfaTJjX2F1eF9jaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCSAgICB1aW50OF90ICpzZW5kLCBpbnQgc2VuZF9ieXRlcywKLQkJICAgIHVpbnQ4X3QgKnJlY3YsIGludCByZWN2X2J5dGVzKQoraW50ZWxfZHBfaTJjX2F1eF9jaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBtb2RlLAorCQkgICAgdWludDhfdCB3cml0ZV9ieXRlLCB1aW50OF90ICpyZWFkX2J5dGUpCiB7CisJc3RydWN0IGkyY19hbGdvX2RwX2F1eF9kYXRhICphbGdvX2RhdGEgPSBhZGFwdGVyLT5hbGdvX2RhdGE7CiAJc3RydWN0IGludGVsX2RwX3ByaXYgKmRwX3ByaXYgPSBjb250YWluZXJfb2YoYWRhcHRlciwKIAkJCQkJCSAgICAgc3RydWN0IGludGVsX2RwX3ByaXYsCiAJCQkJCQkgICAgIGFkYXB0ZXIpOwogCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IGRwX3ByaXYtPmludGVsX291dHB1dDsKKwl1aW50MTZfdCBhZGRyZXNzID0gYWxnb19kYXRhLT5hZGRyZXNzOworCXVpbnQ4X3QgbXNnWzVdOworCXVpbnQ4X3QgcmVwbHlbMl07CisJaW50IG1zZ19ieXRlczsKKwlpbnQgcmVwbHlfYnl0ZXM7CisJaW50IHJldDsKIAotCXJldHVybiBpbnRlbF9kcF9hdXhfY2goaW50ZWxfb3V0cHV0LAotCQkJICAgICAgIHNlbmQsIHNlbmRfYnl0ZXMsIHJlY3YsIHJlY3ZfYnl0ZXMpOworCS8qIFNldCB1cCB0aGUgY29tbWFuZCBieXRlICovCisJaWYgKG1vZGUgJiBNT0RFX0kyQ19SRUFEKQorCQltc2dbMF0gPSBBVVhfSTJDX1JFQUQgPDwgNDsKKwllbHNlCisJCW1zZ1swXSA9IEFVWF9JMkNfV1JJVEUgPDwgNDsKKworCWlmICghKG1vZGUgJiBNT0RFX0kyQ19TVE9QKSkKKwkJbXNnWzBdIHw9IEFVWF9JMkNfTU9UIDw8IDQ7CisKKwltc2dbMV0gPSBhZGRyZXNzID4+IDg7CisJbXNnWzJdID0gYWRkcmVzczsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgTU9ERV9JMkNfV1JJVEU6CisJCW1zZ1szXSA9IDA7CisJCW1zZ1s0XSA9IHdyaXRlX2J5dGU7CisJCW1zZ19ieXRlcyA9IDU7CisJCXJlcGx5X2J5dGVzID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNT0RFX0kyQ19SRUFEOgorCQltc2dbM10gPSAwOworCQltc2dfYnl0ZXMgPSA0OworCQlyZXBseV9ieXRlcyA9IDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1zZ19ieXRlcyA9IDM7CisJCXJlcGx5X2J5dGVzID0gMTsKKwkJYnJlYWs7CisJfQorCisJZm9yICg7OykgeworCSAgcmV0ID0gaW50ZWxfZHBfYXV4X2NoKGludGVsX291dHB1dCwKKwkJCQltc2csIG1zZ19ieXRlcywKKwkJCQlyZXBseSwgcmVwbHlfYnl0ZXMpOworCQlpZiAocmV0IDwgMCkgeworCQkJRFJNX0RFQlVHX0tNUygiYXV4X2NoIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJc3dpdGNoIChyZXBseVswXSAmIEFVWF9JMkNfUkVQTFlfTUFTSykgeworCQljYXNlIEFVWF9JMkNfUkVQTFlfQUNLOgorCQkJaWYgKG1vZGUgPT0gTU9ERV9JMkNfUkVBRCkgeworCQkJCSpyZWFkX2J5dGUgPSByZXBseVsxXTsKKwkJCX0KKwkJCXJldHVybiByZXBseV9ieXRlcyAtIDE7CisJCWNhc2UgQVVYX0kyQ19SRVBMWV9OQUNLOgorCQkJRFJNX0RFQlVHX0tNUygiYXV4X2NoIG5hY2tcbiIpOworCQkJcmV0dXJuIC1FUkVNT1RFSU87CisJCWNhc2UgQVVYX0kyQ19SRVBMWV9ERUZFUjoKKwkJCURSTV9ERUJVR19LTVMoImF1eF9jaCBkZWZlclxuIik7CisJCQl1ZGVsYXkoMTAwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRFJNX0VSUk9SKCJhdXhfY2ggaW52YWxpZCByZXBseSAweCUwMnhcbiIsIHJlcGx5WzBdKTsKKwkJCXJldHVybiAtRVJFTU9URUlPOworCQl9CisJfQogfQogCiBzdGF0aWMgaW50CkBAIC00MzUsNyArNDk2LDggQEAKIAkJCQlkcF9wcml2LT5saW5rX2J3ID0gYndzW2Nsb2NrXTsKIAkJCQlkcF9wcml2LT5sYW5lX2NvdW50ID0gbGFuZV9jb3VudDsKIAkJCQlhZGp1c3RlZF9tb2RlLT5jbG9jayA9IGludGVsX2RwX2xpbmtfY2xvY2soZHBfcHJpdi0+bGlua19idyk7Ci0JCQkJRFJNX0RFQlVHKCJEaXNwbGF5IHBvcnQgbGluayBidyAlMDJ4IGxhbmUgY291bnQgJWQgY2xvY2sgJWRcbiIsCisJCQkJRFJNX0RFQlVHX0tNUygiRGlzcGxheSBwb3J0IGxpbmsgYncgJTAyeCBsYW5lICIKKwkJCQkJCSJjb3VudCAlZCBjbG9jayAlZFxuIiwKIAkJCQkgICAgICAgZHBfcHJpdi0+bGlua19idywgZHBfcHJpdi0+bGFuZV9jb3VudCwKIAkJCQkgICAgICAgYWRqdXN0ZWRfbW9kZS0+Y2xvY2spOwogCQkJCXJldHVybiB0cnVlOwpAQCAtNTE0LDcgKzU3Niw3IEBACiAJaW50ZWxfZHBfY29tcHV0ZV9tX24oMywgbGFuZV9jb3VudCwKIAkJCSAgICAgbW9kZS0+Y2xvY2ssIGFkanVzdGVkX21vZGUtPmNsb2NrLCAmbV9uKTsKIAotCWlmIChJU19JR0RORyhkZXYpKSB7CisJaWYgKElTX0lST05MQUtFKGRldikpIHsKIAkJaWYgKGludGVsX2NydGMtPnBpcGUgPT0gMCkgewogCQkJSTkxNV9XUklURShUUkFOU0FfREFUQV9NMSwKIAkJCQkgICAoKG1fbi50dSAtIDEpIDw8IFBJUEVfR01DSF9EQVRBX01fVFVfU0laRV9TSElGVCkgfApAQCAtNjA2LDIzICs2NjgsMjMgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGlnZG5nX2VkcF9iYWNrbGlnaHRfb24gKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBpcm9ubGFrZV9lZHBfYmFja2xpZ2h0X29uIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHBwOwogCi0JRFJNX0RFQlVHKCJcbiIpOworCURSTV9ERUJVR19LTVMoIlxuIik7CiAJcHAgPSBJOTE1X1JFQUQoUENIX1BQX0NPTlRST0wpOwogCXBwIHw9IEVEUF9CTENfRU5BQkxFOwogCUk5MTVfV1JJVEUoUENIX1BQX0NPTlRST0wsIHBwKTsKIH0KIAotc3RhdGljIHZvaWQgaWdkbmdfZWRwX2JhY2tsaWdodF9vZmYgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBpcm9ubGFrZV9lZHBfYmFja2xpZ2h0X29mZiAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBwcDsKIAotCURSTV9ERUJVRygiXG4iKTsKKwlEUk1fREVCVUdfS01TKCJcbiIpOwogCXBwID0gSTkxNV9SRUFEKFBDSF9QUF9DT05UUk9MKTsKIAlwcCAmPSB+RURQX0JMQ19FTkFCTEU7CiAJSTkxNV9XUklURShQQ0hfUFBfQ09OVFJPTCwgcHApOwpAQCAtNjQxLDEzICs3MDMsMTMgQEAKIAkJaWYgKGRwX3JlZyAmIERQX1BPUlRfRU4pIHsKIAkJCWludGVsX2RwX2xpbmtfZG93bihpbnRlbF9vdXRwdXQsIGRwX3ByaXYtPkRQKTsKIAkJCWlmIChJU19lRFAoaW50ZWxfb3V0cHV0KSkKLQkJCQlpZ2RuZ19lZHBfYmFja2xpZ2h0X29mZihkZXYpOworCQkJCWlyb25sYWtlX2VkcF9iYWNrbGlnaHRfb2ZmKGRldik7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoIShkcF9yZWcgJiBEUF9QT1JUX0VOKSkgewogCQkJaW50ZWxfZHBfbGlua190cmFpbihpbnRlbF9vdXRwdXQsIGRwX3ByaXYtPkRQLCBkcF9wcml2LT5saW5rX2NvbmZpZ3VyYXRpb24pOwogCQkJaWYgKElTX2VEUChpbnRlbF9vdXRwdXQpKQotCQkJCWlnZG5nX2VkcF9iYWNrbGlnaHRfb24oZGV2KTsKKwkJCQlpcm9ubGFrZV9lZHBfYmFja2xpZ2h0X29uKGRldik7CiAJCX0KIAl9CiAJZHBfcHJpdi0+ZHBtc19tb2RlID0gbW9kZTsKQEAgLTEwMTAsNyArMTA3Miw3IEBACiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfZHBfcHJpdiAqZHBfcHJpdiA9IGludGVsX291dHB1dC0+ZGV2X3ByaXY7CiAKLQlEUk1fREVCVUcoIlxuIik7CisJRFJNX0RFQlVHX0tNUygiXG4iKTsKIAogCWlmIChJU19lRFAoaW50ZWxfb3V0cHV0KSkgewogCQlEUCAmPSB+RFBfUExMX0VOQUJMRTsKQEAgLTEwNzEsNyArMTEzMyw3IEBACiB9CiAKIHN0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzCi1pZ2RuZ19kcF9kZXRlY3Qoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK2lyb25sYWtlX2RwX2RldGVjdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewogCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IHRvX2ludGVsX291dHB1dChjb25uZWN0b3IpOwogCXN0cnVjdCBpbnRlbF9kcF9wcml2ICpkcF9wcml2ID0gaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKQEAgLTExMDYsOCArMTE2OCw4IEBACiAKIAlkcF9wcml2LT5oYXNfYXVkaW8gPSBmYWxzZTsKIAotCWlmIChJU19JR0RORyhkZXYpKQotCQlyZXR1cm4gaWdkbmdfZHBfZGV0ZWN0KGNvbm5lY3Rvcik7CisJaWYgKElTX0lST05MQUtFKGRldikpCisJCXJldHVybiBpcm9ubGFrZV9kcF9kZXRlY3QoY29ubmVjdG9yKTsKIAogCXRlbXAgPSBJOTE1X1JFQUQoUE9SVF9IT1RQTFVHX0VOKTsKIApAQCAtMTIyNyw3ICsxMjg5LDUzIEBACiAJaWYgKGRwX3ByaXYtPmRwbXNfbW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKQogCQlpbnRlbF9kcF9jaGVja19saW5rX3N0YXR1cyhpbnRlbF9vdXRwdXQpOwogfQorLyoKKyAqIEVudW1lcmF0ZSB0aGUgY2hpbGQgZGV2IGFycmF5IHBhcnNlZCBmcm9tIFZCVCB0byBjaGVjayB3aGV0aGVyCisgKiB0aGUgZ2l2ZW4gRFAgaXMgcHJlc2VudC4KKyAqIElmIGl0IGlzIHByZXNlbnQsIHJldHVybiAxLgorICogSWYgaXQgaXMgbm90IHByZXNlbnQsIHJldHVybiBmYWxzZS4KKyAqIElmIG5vIGNoaWxkIGRldiBpcyBwYXJzZWQgZnJvbSBWQlQsIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZ2l2ZW4KKyAqIERQIGlzIHByZXNlbnQuCisgKi8KK3N0YXRpYyBpbnQgZHBfaXNfcHJlc2VudF9pbl92YnQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGRwX3JlZykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBjaGlsZF9kZXZpY2VfY29uZmlnICpwX2NoaWxkOworCWludCBpLCBkcF9wb3J0LCByZXQ7CiAKKwlpZiAoIWRldl9wcml2LT5jaGlsZF9kZXZfbnVtKQorCQlyZXR1cm4gMTsKKworCWRwX3BvcnQgPSAwOworCWlmIChkcF9yZWcgPT0gRFBfQiB8fCBkcF9yZWcgPT0gUENIX0RQX0IpCisJCWRwX3BvcnQgPSBQT1JUX0lEUEI7CisJZWxzZSBpZiAoZHBfcmVnID09IERQX0MgfHwgZHBfcmVnID09IFBDSF9EUF9DKQorCQlkcF9wb3J0ID0gUE9SVF9JRFBDOworCWVsc2UgaWYgKGRwX3JlZyA9PSBEUF9EIHx8IGRwX3JlZyA9PSBQQ0hfRFBfRCkKKwkJZHBfcG9ydCA9IFBPUlRfSURQRDsKKworCXJldCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5jaGlsZF9kZXZfbnVtOyBpKyspIHsKKwkJcF9jaGlsZCA9IGRldl9wcml2LT5jaGlsZF9kZXYgKyBpOworCQkvKgorCQkgKiBJZiB0aGUgZGV2aWNlIHR5cGUgaXMgbm90IERQLCBjb250aW51ZS4KKwkJICovCisJCWlmIChwX2NoaWxkLT5kZXZpY2VfdHlwZSAhPSBERVZJQ0VfVFlQRV9EUCAmJgorCQkJcF9jaGlsZC0+ZGV2aWNlX3R5cGUgIT0gREVWSUNFX1RZUEVfZURQKQorCQkJY29udGludWU7CisJCS8qIEZpbmQgdGhlIGVEUCBwb3J0ICovCisJCWlmIChkcF9yZWcgPT0gRFBfQSAmJiBwX2NoaWxkLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfVFlQRV9lRFApIHsKKwkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJfQorCQkvKiBGaW5kIHRoZSBEUCBwb3J0ICovCisJCWlmIChwX2NoaWxkLT5kdm9fcG9ydCA9PSBkcF9wb3J0KSB7CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KIHZvaWQKIGludGVsX2RwX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG91dHB1dF9yZWcpCiB7CkBAIC0xMjM3LDYgKzEzNDUsMTAgQEAKIAlzdHJ1Y3QgaW50ZWxfZHBfcHJpdiAqZHBfcHJpdjsKIAljb25zdCBjaGFyICpuYW1lID0gTlVMTDsKIAorCWlmICghZHBfaXNfcHJlc2VudF9pbl92YnQoZGV2LCBvdXRwdXRfcmVnKSkgeworCQlEUk1fREVCVUdfS01TKCJEUCBpcyBub3QgcHJlc2VudC4gSWdub3JlIGl0XG4iKTsKKwkJcmV0dXJuOworCX0KIAlpbnRlbF9vdXRwdXQgPSBrY2FsbG9jKHNpemVvZihzdHJ1Y3QgaW50ZWxfb3V0cHV0KSArIAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaW50ZWxfZHBfcHJpdiksIDEsIEdGUF9LRVJORUwpOwogCWlmICghaW50ZWxfb3V0cHV0KQpAQCAtMTI1NCwxMSArMTM2NiwxMSBAQAogCWVsc2UKIAkJaW50ZWxfb3V0cHV0LT50eXBlID0gSU5URUxfT1VUUFVUX0RJU1BMQVlQT1JUOwogCi0JaWYgKG91dHB1dF9yZWcgPT0gRFBfQikKKwlpZiAob3V0cHV0X3JlZyA9PSBEUF9CIHx8IG91dHB1dF9yZWcgPT0gUENIX0RQX0IpCiAJCWludGVsX291dHB1dC0+Y2xvbmVfbWFzayA9ICgxIDw8IElOVEVMX0RQX0JfQ0xPTkVfQklUKTsKLQllbHNlIGlmIChvdXRwdXRfcmVnID09IERQX0MpCisJZWxzZSBpZiAob3V0cHV0X3JlZyA9PSBEUF9DIHx8IG91dHB1dF9yZWcgPT0gUENIX0RQX0MpCiAJCWludGVsX291dHB1dC0+Y2xvbmVfbWFzayA9ICgxIDw8IElOVEVMX0RQX0NfQ0xPTkVfQklUKTsKLQllbHNlIGlmIChvdXRwdXRfcmVnID09IERQX0QpCisJZWxzZSBpZiAob3V0cHV0X3JlZyA9PSBEUF9EIHx8IG91dHB1dF9yZWcgPT0gUENIX0RQX0QpCiAJCWludGVsX291dHB1dC0+Y2xvbmVfbWFzayA9ICgxIDw8IElOVEVMX0RQX0RfQ0xPTkVfQklUKTsKIAogCWlmIChJU19lRFAoaW50ZWxfb3V0cHV0KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMzgwNTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IMKpIDIwMDggS2VpdGggUGFja2FyZAotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQKLSAqIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCi0gKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCi0gKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgbWFrZSBubyByZXByZXNlbnRhdGlvbnMKLSAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcwotICogaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICoKLSAqIFRIRSBDT1BZUklHSFQgSE9MREVSUyBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotICogRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKLSAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKLSAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKLSAqIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfSU5URUxfRFBfSF8KLSNkZWZpbmUgX0lOVEVMX0RQX0hfCi0KLS8qIEZyb20gdGhlIFZFU0EgRGlzcGxheVBvcnQgc3BlYyAqLwotCi0jZGVmaW5lIEFVWF9OQVRJVkVfV1JJVEUJMHg4Ci0jZGVmaW5lIEFVWF9OQVRJVkVfUkVBRAkJMHg5Ci0jZGVmaW5lIEFVWF9JMkNfV1JJVEUJCTB4MAotI2RlZmluZSBBVVhfSTJDX1JFQUQJCTB4MQotI2RlZmluZSBBVVhfSTJDX1NUQVRVUwkJMHgyCi0jZGVmaW5lIEFVWF9JMkNfTU9UCQkweDQKLQotI2RlZmluZSBBVVhfTkFUSVZFX1JFUExZX0FDSwkoMHgwIDw8IDQpCi0jZGVmaW5lIEFVWF9OQVRJVkVfUkVQTFlfTkFDSwkoMHgxIDw8IDQpCi0jZGVmaW5lIEFVWF9OQVRJVkVfUkVQTFlfREVGRVIJKDB4MiA8PCA0KQotI2RlZmluZSBBVVhfTkFUSVZFX1JFUExZX01BU0sJKDB4MyA8PCA0KQotCi0jZGVmaW5lIEFVWF9JMkNfUkVQTFlfQUNLCSgweDAgPDwgNikKLSNkZWZpbmUgQVVYX0kyQ19SRVBMWV9OQUNLCSgweDEgPDwgNikKLSNkZWZpbmUgQVVYX0kyQ19SRVBMWV9ERUZFUgkoMHgyIDw8IDYpCi0jZGVmaW5lIEFVWF9JMkNfUkVQTFlfTUFTSwkoMHgzIDw8IDYpCi0KLS8qIEFVWCBDSCBhZGRyZXNzZXMgKi8KLSNkZWZpbmUJRFBfTElOS19CV19TRVQJCTB4MTAwCi0jIGRlZmluZSBEUF9MSU5LX0JXXzFfNjIJCSAgICAweDA2Ci0jIGRlZmluZSBEUF9MSU5LX0JXXzJfNwkJCSAgICAweDBhCi0KLSNkZWZpbmUgRFBfTEFORV9DT1VOVF9TRVQJMHgxMDEKLSMgZGVmaW5lIERQX0xBTkVfQ09VTlRfTUFTSwkJICAgIDB4MGYKLSMgZGVmaW5lIERQX0xBTkVfQ09VTlRfRU5IQU5DRURfRlJBTUVfRU4gICAgKDEgPDwgNykKLQotI2RlZmluZSBEUF9UUkFJTklOR19QQVRURVJOX1NFVAkweDEwMgotCi0jIGRlZmluZSBEUF9UUkFJTklOR19QQVRURVJOX0RJU0FCTEUJICAgIDAKLSMgZGVmaW5lIERQX1RSQUlOSU5HX1BBVFRFUk5fMQkJICAgIDEKLSMgZGVmaW5lIERQX1RSQUlOSU5HX1BBVFRFUk5fMgkJICAgIDIKLSMgZGVmaW5lIERQX1RSQUlOSU5HX1BBVFRFUk5fTUFTSwkgICAgMHgzCi0KLSMgZGVmaW5lIERQX0xJTktfUVVBTF9QQVRURVJOX0RJU0FCTEUJICAgICgwIDw8IDIpCi0jIGRlZmluZSBEUF9MSU5LX1FVQUxfUEFUVEVSTl9EMTBfMgkgICAgKDEgPDwgMikKLSMgZGVmaW5lIERQX0xJTktfUVVBTF9QQVRURVJOX0VSUk9SX1JBVEUgICAgKDIgPDwgMikKLSMgZGVmaW5lIERQX0xJTktfUVVBTF9QQVRURVJOX1BSQlM3CSAgICAoMyA8PCAyKQotIyBkZWZpbmUgRFBfTElOS19RVUFMX1BBVFRFUk5fTUFTSwkgICAgKDMgPDwgMikKLQotIyBkZWZpbmUgRFBfUkVDT1ZFUkVEX0NMT0NLX09VVF9FTgkgICAgKDEgPDwgNCkKLSMgZGVmaW5lIERQX0xJTktfU0NSQU1CTElOR19ESVNBQkxFCSAgICAoMSA8PCA1KQotCi0jIGRlZmluZSBEUF9TWU1CT0xfRVJST1JfQ09VTlRfQk9USAkgICAgKDAgPDwgNikKLSMgZGVmaW5lIERQX1NZTUJPTF9FUlJPUl9DT1VOVF9ESVNQQVJJVFkgICAgKDEgPDwgNikKLSMgZGVmaW5lIERQX1NZTUJPTF9FUlJPUl9DT1VOVF9TWU1CT0wJICAgICgyIDw8IDYpCi0jIGRlZmluZSBEUF9TWU1CT0xfRVJST1JfQ09VTlRfTUFTSwkgICAgKDMgPDwgNikKLQotI2RlZmluZSBEUF9UUkFJTklOR19MQU5FMF9TRVQJCSAgICAweDEwMwotI2RlZmluZSBEUF9UUkFJTklOR19MQU5FMV9TRVQJCSAgICAweDEwNAotI2RlZmluZSBEUF9UUkFJTklOR19MQU5FMl9TRVQJCSAgICAweDEwNQotI2RlZmluZSBEUF9UUkFJTklOR19MQU5FM19TRVQJCSAgICAweDEwNgotCi0jIGRlZmluZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX01BU0sJICAgIDB4MwotIyBkZWZpbmUgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR19TSElGVAkgICAgMAotIyBkZWZpbmUgRFBfVFJBSU5fTUFYX1NXSU5HX1JFQUNIRUQJICAgICgxIDw8IDIpCi0jIGRlZmluZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzQwMAkgICAgKDAgPDwgMCkKLSMgZGVmaW5lIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfNjAwCSAgICAoMSA8PCAwKQotIyBkZWZpbmUgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR184MDAJICAgICgyIDw8IDApCi0jIGRlZmluZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzEyMDAJICAgICgzIDw8IDApCi0KLSMgZGVmaW5lIERQX1RSQUlOX1BSRV9FTVBIQVNJU19NQVNLCSAgICAoMyA8PCAzKQotIyBkZWZpbmUgRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzAJICAgICgwIDw8IDMpCi0jIGRlZmluZSBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfM181CSAgICAoMSA8PCAzKQotIyBkZWZpbmUgRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzYJICAgICgyIDw8IDMpCi0jIGRlZmluZSBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfOV81CSAgICAoMyA8PCAzKQotCi0jIGRlZmluZSBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfU0hJRlQJICAgIDMKLSMgZGVmaW5lIERQX1RSQUlOX01BWF9QUkVfRU1QSEFTSVNfUkVBQ0hFRCAgKDEgPDwgNSkKLQotI2RlZmluZSBEUF9ET1dOU1BSRUFEX0NUUkwJCSAgICAweDEwNwotIyBkZWZpbmUgRFBfU1BSRUFEX0FNUF8wXzUJCSAgICAoMSA8PCA0KQotCi0jZGVmaW5lIERQX01BSU5fTElOS19DSEFOTkVMX0NPRElOR19TRVQJICAgIDB4MTA4Ci0jIGRlZmluZSBEUF9TRVRfQU5TSV84QjEwQgkJICAgICgxIDw8IDApCi0KLSNkZWZpbmUgRFBfTEFORTBfMV9TVEFUVVMJCSAgICAweDIwMgotI2RlZmluZSBEUF9MQU5FMl8zX1NUQVRVUwkJICAgIDB4MjAzCi0KLSMgZGVmaW5lIERQX0xBTkVfQ1JfRE9ORQkJICAgICgxIDw8IDApCi0jIGRlZmluZSBEUF9MQU5FX0NIQU5ORUxfRVFfRE9ORQkgICAgKDEgPDwgMSkKLSMgZGVmaW5lIERQX0xBTkVfU1lNQk9MX0xPQ0tFRAkJICAgICgxIDw8IDIpCi0KLSNkZWZpbmUgRFBfTEFORV9BTElHTl9TVEFUVVNfVVBEQVRFRAkgICAgMHgyMDQKLQotI2RlZmluZSBEUF9JTlRFUkxBTkVfQUxJR05fRE9ORQkJICAgICgxIDw8IDApCi0jZGVmaW5lIERQX0RPV05TVFJFQU1fUE9SVF9TVEFUVVNfQ0hBTkdFRCAgICgxIDw8IDYpCi0jZGVmaW5lIERQX0xJTktfU1RBVFVTX1VQREFURUQJCSAgICAoMSA8PCA3KQotCi0jZGVmaW5lIERQX1NJTktfU1RBVFVTCQkJICAgIDB4MjA1Ci0KLSNkZWZpbmUgRFBfUkVDRUlWRV9QT1JUXzBfU1RBVFVTCSAgICAoMSA8PCAwKQotI2RlZmluZSBEUF9SRUNFSVZFX1BPUlRfMV9TVEFUVVMJICAgICgxIDw8IDEpCi0KLSNkZWZpbmUgRFBfQURKVVNUX1JFUVVFU1RfTEFORTBfMQkgICAgMHgyMDYKLSNkZWZpbmUgRFBfQURKVVNUX1JFUVVFU1RfTEFORTJfMwkgICAgMHgyMDcKLQotI2RlZmluZSBEUF9BREpVU1RfVk9MVEFHRV9TV0lOR19MQU5FMF9NQVNLICAweDAzCi0jZGVmaW5lIERQX0FESlVTVF9WT0xUQUdFX1NXSU5HX0xBTkUwX1NISUZUIDAKLSNkZWZpbmUgRFBfQURKVVNUX1BSRV9FTVBIQVNJU19MQU5FMF9NQVNLICAgMHgwYwotI2RlZmluZSBEUF9BREpVU1RfUFJFX0VNUEhBU0lTX0xBTkUwX1NISUZUICAyCi0jZGVmaW5lIERQX0FESlVTVF9WT0xUQUdFX1NXSU5HX0xBTkUxX01BU0sgIDB4MzAKLSNkZWZpbmUgRFBfQURKVVNUX1ZPTFRBR0VfU1dJTkdfTEFORTFfU0hJRlQgNAotI2RlZmluZSBEUF9BREpVU1RfUFJFX0VNUEhBU0lTX0xBTkUxX01BU0sgICAweGMwCi0jZGVmaW5lIERQX0FESlVTVF9QUkVfRU1QSEFTSVNfTEFORTFfU0hJRlQgIDYKLQotc3RydWN0IGkyY19hbGdvX2RwX2F1eF9kYXRhIHsKLQlib29sIHJ1bm5pbmc7Ci0JdTE2IGFkZHJlc3M7Ci0JaW50ICgqYXV4X2NoKSAoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAotCQkgICAgICAgdWludDhfdCAqc2VuZCwgaW50IHNlbmRfYnl0ZXMsCi0JCSAgICAgICB1aW50OF90ICpyZWN2LCBpbnQgcmVjdl9ieXRlcyk7Ci19OwotCi1pbnQKLWkyY19kcF9hdXhfYWRkX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOwotCi0jZW5kaWYgLyogX0lOVEVMX0RQX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcF9pMmMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwX2kyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjNiNmY1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwX2kyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgwqkgMjAwOSBLZWl0aCBQYWNrYXJkCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAotICogbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZAotICogdGhhdCB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKLSAqIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKLSAqIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBjb3B5cmlnaHQgaG9sZGVycyBtYWtlIG5vIHJlcHJlc2VudGF0aW9ucwotICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzCi0gKiBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKgotICogVEhFIENPUFlSSUdIVCBIT0xERVJTIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0gKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0gKiBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAotICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgotICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRQotICogT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlICJpbnRlbF9kcC5oIgotI2luY2x1ZGUgImRybVAuaCIKLQotLyogUnVuIGEgc2luZ2xlIEFVWF9DSCBJMkMgdHJhbnNhY3Rpb24sIHdyaXRpbmcvcmVhZGluZyBkYXRhIGFzIG5lY2Vzc2FyeSAqLwotCi0jZGVmaW5lIE1PREVfSTJDX1NUQVJUCTEKLSNkZWZpbmUgTU9ERV9JMkNfV1JJVEUJMgotI2RlZmluZSBNT0RFX0kyQ19SRUFECTQKLSNkZWZpbmUgTU9ERV9JMkNfU1RPUAk4Ci0KLXN0YXRpYyBpbnQKLWkyY19hbGdvX2RwX2F1eF90cmFuc2FjdGlvbihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBtb2RlLAotCQkJICAgIHVpbnQ4X3Qgd3JpdGVfYnl0ZSwgdWludDhfdCAqcmVhZF9ieXRlKQotewotCXN0cnVjdCBpMmNfYWxnb19kcF9hdXhfZGF0YSAqYWxnb19kYXRhID0gYWRhcHRlci0+YWxnb19kYXRhOwotCXVpbnQxNl90IGFkZHJlc3MgPSBhbGdvX2RhdGEtPmFkZHJlc3M7Ci0JdWludDhfdCBtc2dbNV07Ci0JdWludDhfdCByZXBseVsyXTsKLQlpbnQgbXNnX2J5dGVzOwotCWludCByZXBseV9ieXRlczsKLQlpbnQgcmV0OwotCi0JLyogU2V0IHVwIHRoZSBjb21tYW5kIGJ5dGUgKi8KLQlpZiAobW9kZSAmIE1PREVfSTJDX1JFQUQpCi0JCW1zZ1swXSA9IEFVWF9JMkNfUkVBRCA8PCA0OwotCWVsc2UKLQkJbXNnWzBdID0gQVVYX0kyQ19XUklURSA8PCA0OwotCi0JaWYgKCEobW9kZSAmIE1PREVfSTJDX1NUT1ApKQotCQltc2dbMF0gfD0gQVVYX0kyQ19NT1QgPDwgNDsKLQotCW1zZ1sxXSA9IGFkZHJlc3MgPj4gODsKLQltc2dbMl0gPSBhZGRyZXNzOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBNT0RFX0kyQ19XUklURToKLQkJbXNnWzNdID0gMDsKLQkJbXNnWzRdID0gd3JpdGVfYnl0ZTsKLQkJbXNnX2J5dGVzID0gNTsKLQkJcmVwbHlfYnl0ZXMgPSAxOwotCQlicmVhazsKLQljYXNlIE1PREVfSTJDX1JFQUQ6Ci0JCW1zZ1szXSA9IDA7Ci0JCW1zZ19ieXRlcyA9IDQ7Ci0JCXJlcGx5X2J5dGVzID0gMjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJbXNnX2J5dGVzID0gMzsKLQkJcmVwbHlfYnl0ZXMgPSAxOwotCQlicmVhazsKLQl9Ci0KLQlmb3IgKDs7KSB7Ci0JCXJldCA9ICgqYWxnb19kYXRhLT5hdXhfY2gpKGFkYXB0ZXIsCi0JCQkJCSAgIG1zZywgbXNnX2J5dGVzLAotCQkJCQkgICByZXBseSwgcmVwbHlfYnl0ZXMpOwotCQlpZiAocmV0IDwgMCkgewotCQkJRFJNX0RFQlVHKCJhdXhfY2ggZmFpbGVkICVkXG4iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlzd2l0Y2ggKHJlcGx5WzBdICYgQVVYX0kyQ19SRVBMWV9NQVNLKSB7Ci0JCWNhc2UgQVVYX0kyQ19SRVBMWV9BQ0s6Ci0JCQlpZiAobW9kZSA9PSBNT0RFX0kyQ19SRUFEKSB7Ci0JCQkJKnJlYWRfYnl0ZSA9IHJlcGx5WzFdOwotCQkJfQotCQkJcmV0dXJuIHJlcGx5X2J5dGVzIC0gMTsKLQkJY2FzZSBBVVhfSTJDX1JFUExZX05BQ0s6Ci0JCQlEUk1fREVCVUcoImF1eF9jaCBuYWNrXG4iKTsKLQkJCXJldHVybiAtRVJFTU9URUlPOwotCQljYXNlIEFVWF9JMkNfUkVQTFlfREVGRVI6Ci0JCQlEUk1fREVCVUcoImF1eF9jaCBkZWZlclxuIik7Ci0JCQl1ZGVsYXkoMTAwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJRFJNX0VSUk9SKCJhdXhfY2ggaW52YWxpZCByZXBseSAweCUwMnhcbiIsIHJlcGx5WzBdKTsKLQkJCXJldHVybiAtRVJFTU9URUlPOwotCQl9Ci0JfQotfQotCi0vKgotICogSTJDIG92ZXIgQVVYIENICi0gKi8KLQotLyoKLSAqIFNlbmQgdGhlIGFkZHJlc3MuIElmIHRoZSBJMkMgbGluayBpcyBydW5uaW5nLCB0aGlzICdyZXN0YXJ0cycKLSAqIHRoZSBjb25uZWN0aW9uIHdpdGggdGhlIG5ldyBhZGRyZXNzLCB0aGlzIGlzIHVzZWQgZm9yIGRvaW5nCi0gKiBhIHdyaXRlIGZvbGxvd2VkIGJ5IGEgcmVhZCAoYXMgbmVlZGVkIGZvciBEREMpCi0gKi8KLXN0YXRpYyBpbnQKLWkyY19hbGdvX2RwX2F1eF9hZGRyZXNzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdTE2IGFkZHJlc3MsIGJvb2wgcmVhZGluZykKLXsKLQlzdHJ1Y3QgaTJjX2FsZ29fZHBfYXV4X2RhdGEgKmFsZ29fZGF0YSA9IGFkYXB0ZXItPmFsZ29fZGF0YTsKLQlpbnQgbW9kZSA9IE1PREVfSTJDX1NUQVJUOwotCWludCByZXQ7Ci0KLQlpZiAocmVhZGluZykKLQkJbW9kZSB8PSBNT0RFX0kyQ19SRUFEOwotCWVsc2UKLQkJbW9kZSB8PSBNT0RFX0kyQ19XUklURTsKLQlhbGdvX2RhdGEtPmFkZHJlc3MgPSBhZGRyZXNzOwotCWFsZ29fZGF0YS0+cnVubmluZyA9IHRydWU7Ci0JcmV0ID0gaTJjX2FsZ29fZHBfYXV4X3RyYW5zYWN0aW9uKGFkYXB0ZXIsIG1vZGUsIDAsIE5VTEwpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBTdG9wIHRoZSBJMkMgdHJhbnNhY3Rpb24uIFRoaXMgY2xvc2VzIG91dCB0aGUgbGluaywgc2VuZGluZwotICogYSBiYXJlIGFkZHJlc3MgcGFja2V0IHdpdGggdGhlIE1PVCBiaXQgdHVybmVkIG9mZgotICovCi1zdGF0aWMgdm9pZAotaTJjX2FsZ29fZHBfYXV4X3N0b3Aoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBib29sIHJlYWRpbmcpCi17Ci0Jc3RydWN0IGkyY19hbGdvX2RwX2F1eF9kYXRhICphbGdvX2RhdGEgPSBhZGFwdGVyLT5hbGdvX2RhdGE7Ci0JaW50IG1vZGUgPSBNT0RFX0kyQ19TVE9QOwotCi0JaWYgKHJlYWRpbmcpCi0JCW1vZGUgfD0gTU9ERV9JMkNfUkVBRDsKLQllbHNlCi0JCW1vZGUgfD0gTU9ERV9JMkNfV1JJVEU7Ci0JaWYgKGFsZ29fZGF0YS0+cnVubmluZykgewotCQkodm9pZCkgaTJjX2FsZ29fZHBfYXV4X3RyYW5zYWN0aW9uKGFkYXB0ZXIsIG1vZGUsIDAsIE5VTEwpOwotCQlhbGdvX2RhdGEtPnJ1bm5pbmcgPSBmYWxzZTsKLQl9Ci19Ci0KLS8qCi0gKiBXcml0ZSBhIHNpbmdsZSBieXRlIHRvIHRoZSBjdXJyZW50IEkyQyBhZGRyZXNzLCB0aGUKLSAqIHRoZSBJMkMgbGluayBtdXN0IGJlIHJ1bm5pbmcgb3IgdGhpcyByZXR1cm5zIC1FSU8KLSAqLwotc3RhdGljIGludAotaTJjX2FsZ29fZHBfYXV4X3B1dF9ieXRlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdTggYnl0ZSkKLXsKLQlzdHJ1Y3QgaTJjX2FsZ29fZHBfYXV4X2RhdGEgKmFsZ29fZGF0YSA9IGFkYXB0ZXItPmFsZ29fZGF0YTsKLQlpbnQgcmV0OwotCi0JaWYgKCFhbGdvX2RhdGEtPnJ1bm5pbmcpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0ID0gaTJjX2FsZ29fZHBfYXV4X3RyYW5zYWN0aW9uKGFkYXB0ZXIsIE1PREVfSTJDX1dSSVRFLCBieXRlLCBOVUxMKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogUmVhZCBhIHNpbmdsZSBieXRlIGZyb20gdGhlIGN1cnJlbnQgSTJDIGFkZHJlc3MsIHRoZQotICogSTJDIGxpbmsgbXVzdCBiZSBydW5uaW5nIG9yIHRoaXMgcmV0dXJucyAtRUlPCi0gKi8KLXN0YXRpYyBpbnQKLWkyY19hbGdvX2RwX2F1eF9nZXRfYnl0ZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpieXRlX3JldCkKLXsKLQlzdHJ1Y3QgaTJjX2FsZ29fZHBfYXV4X2RhdGEgKmFsZ29fZGF0YSA9IGFkYXB0ZXItPmFsZ29fZGF0YTsKLQlpbnQgcmV0OwotCi0JaWYgKCFhbGdvX2RhdGEtPnJ1bm5pbmcpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0ID0gaTJjX2FsZ29fZHBfYXV4X3RyYW5zYWN0aW9uKGFkYXB0ZXIsIE1PREVfSTJDX1JFQUQsIDAsIGJ5dGVfcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50Ci1pMmNfYWxnb19kcF9hdXhfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCSAgICAgc3RydWN0IGkyY19tc2cgKm1zZ3MsCi0JCSAgICAgaW50IG51bSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlib29sIHJlYWRpbmcgPSBmYWxzZTsKLQlpbnQgbTsKLQlpbnQgYjsKLQotCWZvciAobSA9IDA7IG0gPCBudW07IG0rKykgewotCQl1MTYgbGVuID0gbXNnc1ttXS5sZW47Ci0JCXU4ICpidWYgPSBtc2dzW21dLmJ1ZjsKLQkJcmVhZGluZyA9IChtc2dzW21dLmZsYWdzICYgSTJDX01fUkQpICE9IDA7Ci0JCXJldCA9IGkyY19hbGdvX2RwX2F1eF9hZGRyZXNzKGFkYXB0ZXIsIG1zZ3NbbV0uYWRkciwgcmVhZGluZyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJYnJlYWs7Ci0JCWlmIChyZWFkaW5nKSB7Ci0JCQlmb3IgKGIgPSAwOyBiIDwgbGVuOyBiKyspIHsKLQkJCQlyZXQgPSBpMmNfYWxnb19kcF9hdXhfZ2V0X2J5dGUoYWRhcHRlciwgJmJ1ZltiXSk7Ci0JCQkJaWYgKHJldCA8IDApCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChiID0gMDsgYiA8IGxlbjsgYisrKSB7Ci0JCQkJcmV0ID0gaTJjX2FsZ29fZHBfYXV4X3B1dF9ieXRlKGFkYXB0ZXIsIGJ1ZltiXSk7Ci0JCQkJaWYgKHJldCA8IDApCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChyZXQgPCAwKQotCQkJYnJlYWs7Ci0JfQotCWlmIChyZXQgPj0gMCkKLQkJcmV0ID0gbnVtOwotCWkyY19hbGdvX2RwX2F1eF9zdG9wKGFkYXB0ZXIsIHJlYWRpbmcpOwotCURSTV9ERUJVRygiZHBfYXV4X3hmZXIgcmV0dXJuICVkXG4iLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1MzIKLWkyY19hbGdvX2RwX2F1eF9mdW5jdGlvbmFsaXR5KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlyZXR1cm4gSTJDX0ZVTkNfSTJDIHwgSTJDX0ZVTkNfU01CVVNfRU1VTCB8Ci0JICAgICAgIEkyQ19GVU5DX1NNQlVTX1JFQURfQkxPQ0tfREFUQSB8Ci0JICAgICAgIEkyQ19GVU5DX1NNQlVTX0JMT0NLX1BST0NfQ0FMTCB8Ci0JICAgICAgIEkyQ19GVU5DXzEwQklUX0FERFI7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBpMmNfZHBfYXV4X2FsZ28gPSB7Ci0JLm1hc3Rlcl94ZmVyCT0gaTJjX2FsZ29fZHBfYXV4X3hmZXIsCi0JLmZ1bmN0aW9uYWxpdHkJPSBpMmNfYWxnb19kcF9hdXhfZnVuY3Rpb25hbGl0eSwKLX07Ci0KLXN0YXRpYyB2b2lkCi1pMmNfZHBfYXV4X3Jlc2V0X2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JKHZvaWQpIGkyY19hbGdvX2RwX2F1eF9hZGRyZXNzKGFkYXB0ZXIsIDAsIGZhbHNlKTsKLQkodm9pZCkgaTJjX2FsZ29fZHBfYXV4X3N0b3AoYWRhcHRlciwgZmFsc2UpOwotCQkJCQkgICAKLX0KLQotc3RhdGljIGludAotaTJjX2RwX2F1eF9wcmVwYXJlX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JYWRhcHRlci0+YWxnbyA9ICZpMmNfZHBfYXV4X2FsZ287Ci0JYWRhcHRlci0+cmV0cmllcyA9IDM7Ci0JaTJjX2RwX2F1eF9yZXNldF9idXMoYWRhcHRlcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludAotaTJjX2RwX2F1eF9hZGRfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpbnQgZXJyb3I7Ci0JCi0JZXJyb3IgPSBpMmNfZHBfYXV4X3ByZXBhcmVfYnVzKGFkYXB0ZXIpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCWVycm9yID0gaTJjX2FkZF9hZGFwdGVyKGFkYXB0ZXIpOwotCXJldHVybiBlcnJvcjsKLX0KLUVYUE9SVF9TWU1CT0woaTJjX2RwX2F1eF9hZGRfYnVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKaW5kZXggZWY2MWZlOS4uYTUxNTczZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKQEAgLTExMCw2ICsxMTAsMzIgQEAKIAlpbnQgY2xvbmVfbWFzazsKIH07CiAKK3N0cnVjdCBpbnRlbF9jcnRjOworc3RydWN0IGludGVsX292ZXJsYXkgeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CisJc3RydWN0IGludGVsX2NydGMgKmNydGM7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKnZpZF9ibzsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2xkX3ZpZF9ibzsKKwlpbnQgYWN0aXZlOworCWludCBwZml0X2FjdGl2ZTsKKwl1MzIgcGZpdF92c2NhbGVfcmF0aW87IC8qIHNoaWZ0ZWQtcG9pbnQgbnVtYmVyLCAoMTw8MTIpID09IDEuMCAqLworCXUzMiBjb2xvcl9rZXk7CisJdTMyIGJyaWdodG5lc3MsIGNvbnRyYXN0LCBzYXR1cmF0aW9uOworCXUzMiBvbGRfeHNjYWxlLCBvbGRfeXNjYWxlOworCS8qIHJlZ2lzdGVyIGFjY2VzcyAqLworCXUzMiBmbGlwX2FkZHI7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKnJlZ19ibzsKKwl2b2lkICp2aXJ0X2FkZHI7CisJLyogZmxpcCBoYW5kbGluZyAqLworCXVpbnQzMl90IGxhc3RfZmxpcF9yZXE7CisJaW50IGh3X3dlZGdlZDsKKyNkZWZpbmUgSFdfV0VER0VECQkxCisjZGVmaW5lIE5FRURTX1dBSVRfRk9SX0ZMSVAJMgorI2RlZmluZSBSRUxFQVNFX09MRF9WSUQJCTMKKyNkZWZpbmUgU1dJVENIX09GRl9TVEFHRV8xCTQKKyNkZWZpbmUgU1dJVENIX09GRl9TVEFHRV8yCTUKK307CisKIHN0cnVjdCBpbnRlbF9jcnRjIHsKIAlzdHJ1Y3QgZHJtX2NydGMgYmFzZTsKIAllbnVtIHBpcGUgcGlwZTsKQEAgLTEyMSw2ICsxNDcsOCBAQAogCWJvb2wgYnVzeTsgLyogaXMgc2Nhbm91dCBidWZmZXIgYmVpbmcgdXBkYXRlZCBmcmVxdWVudGx5PyAqLwogCXN0cnVjdCB0aW1lcl9saXN0IGlkbGVfdGltZXI7CiAJYm9vbCBsb3dmcmVxX2F2YWlsOworCXN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5OworCXN0cnVjdCBpbnRlbF91bnBpbl93b3JrICp1bnBpbl93b3JrOwogfTsKIAogI2RlZmluZSB0b19pbnRlbF9jcnRjKHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgaW50ZWxfY3J0YywgYmFzZSkKQEAgLTEzNCw2ICsxNjIsOCBAQAogaW50IGludGVsX2RkY19nZXRfbW9kZXMoc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0KTsKIGV4dGVybiBib29sIGludGVsX2RkY19wcm9iZShzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQpOwogdm9pZCBpbnRlbF9pMmNfcXVpcmtfc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKTsKK3ZvaWQgaW50ZWxfaTJjX3Jlc2V0X2dtYnVzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCiBleHRlcm4gdm9pZCBpbnRlbF9jcnRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGludGVsX2hkbWlfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgc2R2b3hfcmVnKTsKIGV4dGVybiBib29sIGludGVsX3Nkdm9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgb3V0cHV0X2RldmljZSk7CkBAIC0xNDgsNiArMTc4LDcgQEAKIGV4dGVybiB2b2lkIGludGVsX2VkcF9saW5rX2NvbmZpZyAoc3RydWN0IGludGVsX291dHB1dCAqLCBpbnQgKiwgaW50ICopOwogCiAKK2V4dGVybiBpbnQgaW50ZWxfcGFuZWxfZml0dGVyX3BpcGUgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgaW50ZWxfY3J0Y19sb2FkX2x1dChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOwogZXh0ZXJuIHZvaWQgaW50ZWxfZW5jb2Rlcl9wcmVwYXJlIChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwogZXh0ZXJuIHZvaWQgaW50ZWxfZW5jb2Rlcl9jb21taXQgKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CkBAIC0xNzcsMTAgKzIwOCwyMyBAQAogCQkJCSAgICB1MTYgYmx1ZSwgaW50IHJlZ25vKTsKIGV4dGVybiB2b2lkIGludGVsX2NydGNfZmJfZ2FtbWFfZ2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdTE2ICpyZWQsIHUxNiAqZ3JlZW4sCiAJCQkJICAgIHUxNiAqYmx1ZSwgaW50IHJlZ25vKTsKK2V4dGVybiB2b2lkIGludGVsX2luaXRfY2xvY2tfZ2F0aW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiBleHRlcm4gaW50IGludGVsX2ZyYW1lYnVmZmVyX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCSAgICBzdHJ1Y3QgZHJtX21vZGVfZmJfY21kICptb2RlX2NtZCwKIAkJCQkgICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqKmZiLAogCQkJCSAgICBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CiAKK2V4dGVybiB2b2lkIGludGVsX3ByZXBhcmVfcGFnZV9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwbGFuZSk7CitleHRlcm4gdm9pZCBpbnRlbF9maW5pc2hfcGFnZV9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKTsKKworZXh0ZXJuIHZvaWQgaW50ZWxfc2V0dXBfb3ZlcmxheShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGludGVsX2NsZWFudXBfb3ZlcmxheShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgaW50ZWxfb3ZlcmxheV9zd2l0Y2hfb2ZmKHN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5KTsKK2V4dGVybiBpbnQgaW50ZWxfb3ZlcmxheV9yZWNvdmVyX2Zyb21faW50ZXJydXB0KHN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5LAorCQkJCQkJaW50IGludGVycnVwdGlibGUpOworZXh0ZXJuIGludCBpbnRlbF9vdmVybGF5X3B1dF9pbWFnZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiBpbnQgaW50ZWxfb3ZlcmxheV9hdHRycyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJICAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKICNlbmRpZiAvKiBfX0lOVEVMX0RSVl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9mYi5jCmluZGV4IDQwZmNmNmYuLjM3MWQ3NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2ZiLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmIuYwpAQCAtMjMwLDggKzIzMCw5IEBACiAJcGFyLT5pbnRlbF9mYiA9IGludGVsX2ZiOwogCiAJLyogVG8gYWxsb3cgcmVzaXplaW5nIHdpdGhvdXQgc3dhcHBpbmcgYnVmZmVycyAqLwotCURSTV9ERUJVRygiYWxsb2NhdGVkICVkeCVkIGZiOiAweCUwOHgsIGJvICVwXG4iLCBpbnRlbF9mYi0+YmFzZS53aWR0aCwKLQkJICBpbnRlbF9mYi0+YmFzZS5oZWlnaHQsIG9ial9wcml2LT5ndHRfb2Zmc2V0LCBmYm8pOworCURSTV9ERUJVR19LTVMoImFsbG9jYXRlZCAlZHglZCBmYjogMHglMDh4LCBibyAlcFxuIiwKKwkJCWludGVsX2ZiLT5iYXNlLndpZHRoLCBpbnRlbF9mYi0+YmFzZS5oZWlnaHQsCisJCQlvYmpfcHJpdi0+Z3R0X29mZnNldCwgZmJvKTsKIAogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCXJldHVybiAwOwpAQCAtMjQ5LDcgKzI1MCw3IEBACiB7CiAJaW50IHJldDsKIAotCURSTV9ERUJVRygiXG4iKTsKKwlEUk1fREVCVUdfS01TKCJcbiIpOwogCXJldCA9IGRybV9mYl9oZWxwZXJfc2luZ2xlX2ZiX3Byb2JlKGRldiwgMzIsIGludGVsZmJfY3JlYXRlKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jCmluZGV4IGMzMzQ1MWEuLmYwNGRiYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hkbWkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9oZG1pLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAkvKiBIVyB3b3JrYXJvdW5kLCBuZWVkIHRvIHRvZ2dsZSBlbmFibGUgYml0IG9mZiBhbmQgb24gZm9yIDEyYnBjLCBidXQKIAkgKiB3ZSBkbyB0aGlzIGFueXdheSB3aGljaCBzaG93cyBtb3JlIHN0YWJsZSBpbiB0ZXN0aW5nLgogCSAqLwotCWlmIChJU19JR0RORyhkZXYpKSB7CisJaWYgKElTX0lST05MQUtFKGRldikpIHsKIAkJSTkxNV9XUklURShoZG1pX3ByaXYtPnNkdm94X3JlZywgdGVtcCAmIH5TRFZPX0VOQUJMRSk7CiAJCVBPU1RJTkdfUkVBRChoZG1pX3ByaXYtPnNkdm94X3JlZyk7CiAJfQpAQCAtOTksNyArOTksNyBAQAogCS8qIEhXIHdvcmthcm91bmQsIG5lZWQgdG8gd3JpdGUgdGhpcyB0d2ljZSBmb3IgaXNzdWUgdGhhdCBtYXkgcmVzdWx0CiAJICogaW4gZmlyc3Qgd3JpdGUgZ2V0dGluZyBtYXNrZWQuCiAJICovCi0JaWYgKElTX0lHRE5HKGRldikpIHsKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkgewogCQlJOTE1X1dSSVRFKGhkbWlfcHJpdi0+c2R2b3hfcmVnLCB0ZW1wKTsKIAkJUE9TVElOR19SRUFEKGhkbWlfcHJpdi0+c2R2b3hfcmVnKTsKIAl9CkBAIC0yMjUsNyArMjI1LDUyIEBACiAJLmRlc3Ryb3kgPSBpbnRlbF9oZG1pX2VuY19kZXN0cm95LAogfTsKIAorLyoKKyAqIEVudW1lcmF0ZSB0aGUgY2hpbGQgZGV2IGFycmF5IHBhcnNlZCBmcm9tIFZCVCB0byBjaGVjayB3aGV0aGVyCisgKiB0aGUgZ2l2ZW4gSERNSSBpcyBwcmVzZW50LgorICogSWYgaXQgaXMgcHJlc2VudCwgcmV0dXJuIDEuCisgKiBJZiBpdCBpcyBub3QgcHJlc2VudCwgcmV0dXJuIGZhbHNlLgorICogSWYgbm8gY2hpbGQgZGV2IGlzIHBhcnNlZCBmcm9tIFZCVCwgaXQgYXNzdW1lcyB0aGF0IHRoZSBnaXZlbgorICogSERNSSBpcyBwcmVzZW50LgorICovCitzdGF0aWMgaW50IGhkbWlfaXNfcHJlc2VudF9pbl92YnQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhkbWlfcmVnKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGNoaWxkX2RldmljZV9jb25maWcgKnBfY2hpbGQ7CisJaW50IGksIGhkbWlfcG9ydCwgcmV0OwogCisJaWYgKCFkZXZfcHJpdi0+Y2hpbGRfZGV2X251bSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoaGRtaV9yZWcgPT0gU0RWT0IpCisJCWhkbWlfcG9ydCA9IERWT19COworCWVsc2UgaWYgKGhkbWlfcmVnID09IFNEVk9DKQorCQloZG1pX3BvcnQgPSBEVk9fQzsKKwllbHNlIGlmIChoZG1pX3JlZyA9PSBIRE1JQikKKwkJaGRtaV9wb3J0ID0gRFZPX0I7CisJZWxzZSBpZiAoaGRtaV9yZWcgPT0gSERNSUMpCisJCWhkbWlfcG9ydCA9IERWT19DOworCWVsc2UgaWYgKGhkbWlfcmVnID09IEhETUlEKQorCQloZG1pX3BvcnQgPSBEVk9fRDsKKwllbHNlCisJCXJldHVybiAwOworCisJcmV0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmNoaWxkX2Rldl9udW07IGkrKykgeworCQlwX2NoaWxkID0gZGV2X3ByaXYtPmNoaWxkX2RldiArIGk7CisJCS8qCisJCSAqIElmIHRoZSBkZXZpY2UgdHlwZSBpcyBub3QgSERNSSwgY29udGludWUuCisJCSAqLworCQlpZiAocF9jaGlsZC0+ZGV2aWNlX3R5cGUgIT0gREVWSUNFX1RZUEVfSERNSSkKKwkJCWNvbnRpbnVlOworCQkvKiBGaW5kIHRoZSBIRE1JIHBvcnQgKi8KKwkJaWYgKHBfY2hpbGQtPmR2b19wb3J0ID09IGhkbWlfcG9ydCkgeworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CiB2b2lkIGludGVsX2hkbWlfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgc2R2b3hfcmVnKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0yMzMsNiArMjc4LDEwIEBACiAJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0OwogCXN0cnVjdCBpbnRlbF9oZG1pX3ByaXYgKmhkbWlfcHJpdjsKIAorCWlmICghaGRtaV9pc19wcmVzZW50X2luX3ZidChkZXYsIHNkdm94X3JlZykpIHsKKwkJRFJNX0RFQlVHX0tNUygiSERNSSBpcyBub3QgcHJlc2VudC4gSWdub3JlZCBpdCBcbiIpOworCQlyZXR1cm47CisJfQogCWludGVsX291dHB1dCA9IGtjYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbnRlbF9vdXRwdXQpICsKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IGludGVsX2hkbWlfcHJpdiksIDEsIEdGUF9LRVJORUwpOwogCWlmICghaW50ZWxfb3V0cHV0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaTJjLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9pMmMuYwppbmRleCBjN2VhYjcyLi44NjczYzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9pMmMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9pMmMuYwpAQCAtMzksNyArMzksNyBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKIAkvKiBXaGVuIHVzaW5nIGJpdCBiYXNoaW5nIGZvciBJMkMsIHRoaXMgYml0IG5lZWRzIHRvIGJlIHNldCB0byAxICovCi0JaWYgKCFJU19JR0QoZGV2KSkKKwlpZiAoIUlTX1BJTkVWSUVXKGRldikpCiAJCXJldHVybjsKIAlpZiAoZW5hYmxlKQogCQlJOTE1X1dSSVRFKERTUENMS19HQVRFX0QsCkBAIC0xMTgsNiArMTE4LDIzIEBACiAJdWRlbGF5KEkyQ19SSVNFRkFMTF9USU1FKTsgLyogd2FpdCBmb3IgdGhlIGxpbmUgdG8gY2hhbmdlIHN0YXRlICovCiB9CiAKKy8qIENsZWFycyB0aGUgR01CVVMgc2V0dXAuICBPdXIgZHJpdmVyIGRvZXNuJ3QgbWFrZSB1c2Ugb2YgdGhlIEdNQlVTIEkyQworICogZW5naW5lLCBidXQgaWYgdGhlIEJJT1MgbGVhdmVzIGl0IGVuYWJsZWQsIHRoZW4gdGhhdCBjYW4gYnJlYWsgb3VyIHVzZQorICogb2YgdGhlIGJpdC1iYW5naW5nIEkyQyBpbnRlcmZhY2VzLiAgVGhpcyBpcyBub3RhYmx5IHRoZSBjYXNlIHdpdGggdGhlCisgKiBNYWMgTWluaSBpbiBFRkkgbW9kZS4KKyAqLwordm9pZAoraW50ZWxfaTJjX3Jlc2V0X2dtYnVzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChJU19JUk9OTEFLRShkZXYpKSB7CisJCUk5MTVfV1JJVEUoUENIX0dNQlVTMCwgMCk7CisJfSBlbHNlIHsKKwkJSTkxNV9XUklURShHTUJVUzAsIDApOworCX0KK30KKwogLyoqCiAgKiBpbnRlbF9pMmNfY3JlYXRlIC0gaW5zdGFudGlhdGUgYW4gSW50ZWwgaTJjIGJ1cyB1c2luZyB0aGUgc3BlY2lmaWVkIEdQSU8gcmVnCiAgKiBAZGV2OiBEUk0gZGV2aWNlCkBAIC0xNjgsNiArMTg1LDggQEAKIAlpZihpMmNfYml0X2FkZF9idXMoJmNoYW4tPmFkYXB0ZXIpKQogCQlnb3RvIG91dF9mcmVlOwogCisJaW50ZWxfaTJjX3Jlc2V0X2dtYnVzKGRldik7CisKIAkvKiBKSko6ICByYWlzZSBTQ0wgYW5kIFNEQT8gKi8KIAlpbnRlbF9pMmNfcXVpcmtfc2V0KGRldiwgdHJ1ZSk7CiAJc2V0X2RhdGEoY2hhbiwgMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMKaW5kZXggZWIzNjUwMi4uMzExOGNlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHZkcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYwpAQCAtNTYsNyArNTYsNyBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIGJsY19wd21fY3RsLCByZWc7CiAKLQlpZiAoSVNfSUdETkcoZGV2KSkKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkKIAkJcmVnID0gQkxDX1BXTV9DUFVfQ1RMOwogCWVsc2UKIAkJcmVnID0gQkxDX1BXTV9DVEw7CkBAIC03NCw3ICs3NCw3IEBACiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgcmVnOwogCi0JaWYgKElTX0lHRE5HKGRldikpCisJaWYgKElTX0lST05MQUtFKGRldikpCiAJCXJlZyA9IEJMQ19QV01fUENIX0NUTDI7CiAJZWxzZQogCQlyZWcgPSBCTENfUFdNX0NUTDsKQEAgLTkxLDcgKzkxLDcgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBwcF9zdGF0dXMsIGN0bF9yZWcsIHN0YXR1c19yZWc7CiAKLQlpZiAoSVNfSUdETkcoZGV2KSkgeworCWlmIChJU19JUk9OTEFLRShkZXYpKSB7CiAJCWN0bF9yZWcgPSBQQ0hfUFBfQ09OVFJPTDsKIAkJc3RhdHVzX3JlZyA9IFBDSF9QUF9TVEFUVVM7CiAJfSBlbHNlIHsKQEAgLTEzNyw3ICsxMzcsNyBAQAogCXUzMiBwcF9vbl9yZWcsIHBwX29mZl9yZWcsIHBwX2N0bF9yZWcsIHBwX2Rpdl9yZWc7CiAJdTMyIHB3bV9jdGxfcmVnOwogCi0JaWYgKElTX0lHRE5HKGRldikpIHsKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkgewogCQlwcF9vbl9yZWcgPSBQQ0hfUFBfT05fREVMQVlTOwogCQlwcF9vZmZfcmVnID0gUENIX1BQX09GRl9ERUxBWVM7CiAJCXBwX2N0bF9yZWcgPSBQQ0hfUFBfQ09OVFJPTDsKQEAgLTE3NCw3ICsxNzQsNyBAQAogCXUzMiBwcF9vbl9yZWcsIHBwX29mZl9yZWcsIHBwX2N0bF9yZWcsIHBwX2Rpdl9yZWc7CiAJdTMyIHB3bV9jdGxfcmVnOwogCi0JaWYgKElTX0lHRE5HKGRldikpIHsKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkgewogCQlwcF9vbl9yZWcgPSBQQ0hfUFBfT05fREVMQVlTOwogCQlwcF9vZmZfcmVnID0gUENIX1BQX09GRl9ERUxBWVM7CiAJCXBwX2N0bF9yZWcgPSBQQ0hfUFBfQ09OVFJPTDsKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCX0KIAogCS8qIGZ1bGwgc2NyZWVuIHNjYWxlIGZvciBub3cgKi8KLQlpZiAoSVNfSUdETkcoZGV2KSkKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkKIAkJZ290byBvdXQ7CiAKIAkvKiA5NjUrIHdhbnRzIGZ1enp5IGZpdHRpbmcgKi8KQEAgLTMyNyw3ICszMjcsNyBAQAogCSAqIHRvIHJlZ2lzdGVyIGRlc2NyaXB0aW9uIGFuZCBQUk0uCiAJICogQ2hhbmdlIHRoZSB2YWx1ZSBoZXJlIHRvIHNlZSB0aGUgYm9yZGVycyBmb3IgZGVidWdnaW5nCiAJICovCi0JaWYgKCFJU19JR0RORyhkZXYpKSB7CisJaWYgKCFJU19JUk9OTEFLRShkZXYpKSB7CiAJCUk5MTVfV1JJVEUoQkNMUlBBVF9BLCAwKTsKIAkJSTkxNV9XUklURShCQ0xSUEFUX0IsIDApOwogCX0KQEAgLTU0OCw3ICs1NDgsNyBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHJlZzsKIAotCWlmIChJU19JR0RORyhkZXYpKQorCWlmIChJU19JUk9OTEFLRShkZXYpKQogCQlyZWcgPSBCTENfUFdNX0NQVV9DVEw7CiAJZWxzZQogCQlyZWcgPSBCTENfUFdNX0NUTDsKQEAgLTU4Nyw3ICs1ODcsNyBAQAogCSAqIHNldHRpbmdzLgogCSAqLwogCi0JaWYgKElTX0lHRE5HKGRldikpCisJaWYgKElTX0lST05MQUtFKGRldikpCiAJCXJldHVybjsKIAogCS8qCkBAIC05MTQsNiArOTE0LDEwMSBAQAogI2VuZGlmCiAKIC8qKgorICogaW50ZWxfZmluZF9sdmRzX2Rvd25jbG9jayAtIGZpbmQgdGhlIHJlZHVjZWQgZG93bmNsb2NrIGZvciBMVkRTIGluIEVESUQKKyAqIEBkZXY6IGRybSBkZXZpY2UKKyAqIEBjb25uZWN0b3I6IExWRFMgY29ubmVjdG9yCisgKgorICogRmluZCB0aGUgcmVkdWNlZCBkb3duY2xvY2sgZm9yIExWRFMgaW4gRURJRC4KKyAqLworc3RhdGljIHZvaWQgaW50ZWxfZmluZF9sdmRzX2Rvd25jbG9jayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqc2NhbiwgKnBhbmVsX2ZpeGVkX21vZGU7CisJaW50IHRlbXBfZG93bmNsb2NrOworCisJcGFuZWxfZml4ZWRfbW9kZSA9IGRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlOworCXRlbXBfZG93bmNsb2NrID0gcGFuZWxfZml4ZWRfbW9kZS0+Y2xvY2s7CisKKwltdXRleF9sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNjYW4sICZjb25uZWN0b3ItPnByb2JlZF9tb2RlcywgaGVhZCkgeworCQkvKgorCQkgKiBJZiBvbmUgbW9kZSBoYXMgdGhlIHNhbWUgcmVzb2x1dGlvbiB3aXRoIHRoZSBmaXhlZF9wYW5lbAorCQkgKiBtb2RlIHdoaWxlIHRoZXkgaGF2ZSB0aGUgZGlmZmVyZW50IHJlZnJlc2ggcmF0ZSwgaXQgbWVhbnMKKwkJICogdGhhdCB0aGUgcmVkdWNlZCBkb3duY2xvY2sgaXMgZm91bmQgZm9yIHRoZSBMVkRTLiBJbiBzdWNoCisJCSAqIGNhc2Ugd2UgY2FuIHNldCB0aGUgZGlmZmVyZW50IEZQeDAvMSB0byBkeW5hbWljYWxseSBzZWxlY3QKKwkJICogYmV0d2VlbiBsb3cgYW5kIGhpZ2ggZnJlcXVlbmN5LgorCQkgKi8KKwkJaWYgKHNjYW4tPmhkaXNwbGF5ID09IHBhbmVsX2ZpeGVkX21vZGUtPmhkaXNwbGF5ICYmCisJCQlzY2FuLT5oc3luY19zdGFydCA9PSBwYW5lbF9maXhlZF9tb2RlLT5oc3luY19zdGFydCAmJgorCQkJc2Nhbi0+aHN5bmNfZW5kID09IHBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX2VuZCAmJgorCQkJc2Nhbi0+aHRvdGFsID09IHBhbmVsX2ZpeGVkX21vZGUtPmh0b3RhbCAmJgorCQkJc2Nhbi0+dmRpc3BsYXkgPT0gcGFuZWxfZml4ZWRfbW9kZS0+dmRpc3BsYXkgJiYKKwkJCXNjYW4tPnZzeW5jX3N0YXJ0ID09IHBhbmVsX2ZpeGVkX21vZGUtPnZzeW5jX3N0YXJ0ICYmCisJCQlzY2FuLT52c3luY19lbmQgPT0gcGFuZWxfZml4ZWRfbW9kZS0+dnN5bmNfZW5kICYmCisJCQlzY2FuLT52dG90YWwgPT0gcGFuZWxfZml4ZWRfbW9kZS0+dnRvdGFsKSB7CisJCQlpZiAoc2Nhbi0+Y2xvY2sgPCB0ZW1wX2Rvd25jbG9jaykgeworCQkJCS8qCisJCQkJICogVGhlIGRvd25jbG9jayBpcyBhbHJlYWR5IGZvdW5kLiBCdXQgd2UKKwkJCQkgKiBleHBlY3QgdG8gZmluZCB0aGUgbG93ZXIgZG93bmNsb2NrLgorCQkJCSAqLworCQkJCXRlbXBfZG93bmNsb2NrID0gc2Nhbi0+Y2xvY2s7CisJCQl9CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlpZiAodGVtcF9kb3duY2xvY2sgPCBwYW5lbF9maXhlZF9tb2RlLT5jbG9jaykgeworCQkvKiBXZSBmb3VuZCB0aGUgZG93bmNsb2NrIGZvciBMVkRTLiAqLworCQlkZXZfcHJpdi0+bHZkc19kb3duY2xvY2tfYXZhaWwgPSAxOworCQlkZXZfcHJpdi0+bHZkc19kb3duY2xvY2sgPSB0ZW1wX2Rvd25jbG9jazsKKwkJRFJNX0RFQlVHX0tNUygiTFZEUyBkb3duY2xvY2sgaXMgZm91bmQgaW4gRURJRC4gIgorCQkJCSJOb3JtYWwgY2xvY2sgJWRLaHosIGRvd25jbG9jayAlZEtoelxuIiwKKwkJCQlwYW5lbF9maXhlZF9tb2RlLT5jbG9jaywgdGVtcF9kb3duY2xvY2spOworCX0KKwlyZXR1cm47Cit9CisKKy8qCisgKiBFbnVtZXJhdGUgdGhlIGNoaWxkIGRldiBhcnJheSBwYXJzZWQgZnJvbSBWQlQgdG8gY2hlY2sgd2hldGhlcgorICogdGhlIExWRFMgaXMgcHJlc2VudC4KKyAqIElmIGl0IGlzIHByZXNlbnQsIHJldHVybiAxLgorICogSWYgaXQgaXMgbm90IHByZXNlbnQsIHJldHVybiBmYWxzZS4KKyAqIElmIG5vIGNoaWxkIGRldiBpcyBwYXJzZWQgZnJvbSBWQlQsIGl0IGFzc3VtZXMgdGhhdCB0aGUgTFZEUyBpcyBwcmVzZW50LgorICogTm90ZTogVGhlIGFkZGluX29mZnNldCBzaG91bGQgYWxzbyBiZSBjaGVja2VkIGZvciBMVkRTIHBhbmVsLgorICogT25seSB3aGVuIGl0IGlzIG5vbi16ZXJvLCBpdCBpcyBhc3N1bWVkIHRoYXQgaXQgaXMgcHJlc2VudC4KKyAqLworc3RhdGljIGludCBsdmRzX2lzX3ByZXNlbnRfaW5fdmJ0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgY2hpbGRfZGV2aWNlX2NvbmZpZyAqcF9jaGlsZDsKKwlpbnQgaSwgcmV0OworCisJaWYgKCFkZXZfcHJpdi0+Y2hpbGRfZGV2X251bSkKKwkJcmV0dXJuIDE7CisKKwlyZXQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+Y2hpbGRfZGV2X251bTsgaSsrKSB7CisJCXBfY2hpbGQgPSBkZXZfcHJpdi0+Y2hpbGRfZGV2ICsgaTsKKwkJLyoKKwkJICogSWYgdGhlIGRldmljZSB0eXBlIGlzIG5vdCBMRlAsIGNvbnRpbnVlLgorCQkgKiBJZiB0aGUgZGV2aWNlIHR5cGUgaXMgMHgyMiwgaXQgaXMgYWxzbyByZWdhcmRlZCBhcyBMRlAuCisJCSAqLworCQlpZiAocF9jaGlsZC0+ZGV2aWNlX3R5cGUgIT0gREVWSUNFX1RZUEVfSU5UX0xGUCAmJgorCQkJcF9jaGlsZC0+ZGV2aWNlX3R5cGUgIT0gREVWSUNFX1RZUEVfTEZQKQorCQkJY29udGludWU7CisKKwkJLyogVGhlIGFkZGluX29mZnNldCBzaG91bGQgYmUgY2hlY2tlZC4gT25seSB3aGVuIGl0IGlzCisJCSAqIG5vbi16ZXJvLCBpdCBpcyByZWdhcmRlZCBhcyBwcmVzZW50LgorCQkgKi8KKwkJaWYgKHBfY2hpbGQtPmFkZGluX29mZnNldCkgeworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgogICogaW50ZWxfbHZkc19pbml0IC0gc2V0dXAgTFZEUyBjb25uZWN0b3JzIG9uIHRoaXMgZGV2aWNlCiAgKiBAZGV2OiBkcm0gZGV2aWNlCiAgKgpAQCAtOTM2LDIxICsxMDMxLDIwIEBACiAJaWYgKGRtaV9jaGVja19zeXN0ZW0oaW50ZWxfbm9fbHZkcykpCiAJCXJldHVybjsKIAotCS8qIEFzc3VtZSB0aGF0IGFueSBkZXZpY2Ugd2l0aG91dCBhbiBBQ1BJIExJRCBkZXZpY2UgYWxzbyBkb2Vzbid0Ci0JICogaGF2ZSBhbiBpbnRlZ3JhdGVkIExWRFMuICBXZSB3b3VsZCBiZSBiZXR0ZXIgb2ZmIHBhcnNpbmcgdGhlIEJJT1MKLQkgKiB0byBnZXQgYSByZWxpYWJsZSBpbmRpY2F0b3IsIGJ1dCB0aGF0IGNvZGUgaXNuJ3Qgd3JpdHRlbiB5ZXQuCi0JICoKLQkgKiBJbiB0aGUgY2FzZSBvZiBhbGwtaW4tb25lIGRlc2t0b3BzIHVzaW5nIExWRFMgdGhhdCB3ZSd2ZSBzZWVuLAotCSAqIHRoZXkncmUgdXNpbmcgU0RWTyBMVkRTLgorCS8qCisJICogQXNzdW1lIExWRFMgaXMgcHJlc2VudCBpZiB0aGVyZSdzIGFuIEFDUEkgbGlkIGRldmljZSBvciBpZiB0aGUKKwkgKiBkZXZpY2UgaXMgcHJlc2VudCBpbiB0aGUgVkJULgogCSAqLwotCWlmICghaW50ZWxfbGlkX3ByZXNlbnQoKSkKKwlpZiAoIWx2ZHNfaXNfcHJlc2VudF9pbl92YnQoZGV2KSAmJiAhaW50ZWxfbGlkX3ByZXNlbnQoKSkgeworCQlEUk1fREVCVUdfS01TKCJMVkRTIGlzIG5vdCBwcmVzZW50IGluIFZCVCBhbmQgbm8gbGlkIGRldGVjdGVkXG4iKTsKIAkJcmV0dXJuOworCX0KIAotCWlmIChJU19JR0RORyhkZXYpKSB7CisJaWYgKElTX0lST05MQUtFKGRldikpIHsKIAkJaWYgKChJOTE1X1JFQUQoUENIX0xWRFMpICYgTFZEU19ERVRFQ1RFRCkgPT0gMCkKIAkJCXJldHVybjsKIAkJaWYgKGRldl9wcml2LT5lZHBfc3VwcG9ydCkgewotCQkJRFJNX0RFQlVHKCJkaXNhYmxlIExWRFMgZm9yIGVEUCBzdXBwb3J0XG4iKTsKKwkJCURSTV9ERUJVR19LTVMoImRpc2FibGUgTFZEUyBmb3IgZURQIHN1cHBvcnRcbiIpOwogCQkJcmV0dXJuOwogCQl9CiAJCWdwaW8gPSBQQ0hfR1BJT0M7CkBAIC0xMDIzLDYgKzExMTcsNyBAQAogCQkJZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUgPQogCQkJCWRybV9tb2RlX2R1cGxpY2F0ZShkZXYsIHNjYW4pOwogCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwkJCWludGVsX2ZpbmRfbHZkc19kb3duY2xvY2soZGV2LCBjb25uZWN0b3IpOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKQEAgLTEwNDcsOCArMTE0Miw4IEBACiAJICogY29ycmVjdCBtb2RlLgogCSAqLwogCi0JLyogSUdETkc6IEZJWE1FIGlmIHN0aWxsIGZhaWwsIG5vdCB0cnkgcGlwZSBtb2RlIG5vdyAqLwotCWlmIChJU19JR0RORyhkZXYpKQorCS8qIElyb25sYWtlOiBGSVhNRSBpZiBzdGlsbCBmYWlsLCBub3QgdHJ5IHBpcGUgbW9kZSBub3cgKi8KKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkKIAkJZ290byBmYWlsZWQ7CiAKIAlsdmRzID0gSTkxNV9SRUFEKExWRFMpOwpAQCAtMTA2OSw3ICsxMTY0LDcgQEAKIAkJZ290byBmYWlsZWQ7CiAKIG91dDoKLQlpZiAoSVNfSUdETkcoZGV2KSkgeworCWlmIChJU19JUk9OTEFLRShkZXYpKSB7CiAJCXUzMiBwd207CiAJCS8qIG1ha2Ugc3VyZSBQV00gaXMgZW5hYmxlZCAqLwogCQlwd20gPSBJOTE1X1JFQUQoQkxDX1BXTV9DUFVfQ1RMMik7CkBAIC0xMDgyLDcgKzExNzcsNyBAQAogCX0KIAlkZXZfcHJpdi0+bGlkX25vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBpbnRlbF9saWRfbm90aWZ5OwogCWlmIChhY3BpX2xpZF9ub3RpZmllcl9yZWdpc3RlcigmZGV2X3ByaXYtPmxpZF9ub3RpZmllcikpIHsKLQkJRFJNX0RFQlVHKCJsaWQgbm90aWZpZXIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisJCURSTV9ERUJVR19LTVMoImxpZCBub3RpZmllciByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKIAkJZGV2X3ByaXYtPmxpZF9ub3RpZmllci5ub3RpZmllcl9jYWxsID0gTlVMTDsKIAl9CiAJZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9hZGQoY29ubmVjdG9yKTsKQEAgLTEwOTMsNSArMTE4OCw2IEBACiAJaWYgKGludGVsX291dHB1dC0+ZGRjX2J1cykKIAkJaW50ZWxfaTJjX2Rlc3Ryb3koaW50ZWxfb3V0cHV0LT5kZGNfYnVzKTsKIAlkcm1fY29ubmVjdG9yX2NsZWFudXAoY29ubmVjdG9yKTsKKwlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOwogCWtmcmVlKGludGVsX291dHB1dCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vdmVybGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vdmVybGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzOTU5MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX292ZXJsYXkuYwpAQCAtMCwwICsxLDE0MTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgRGFuaWVsIFZldHRlciA8ZGFuaWVsQGZmd2xsLmNoPgorICoKKyAqIERlcml2ZWQgZnJvbSBYb3JnIGRkeCwgeGY4Ni12aWRlby1pbnRlbCwgc3JjL2k4MzBfdmlkZW8uYworICovCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImk5MTVfZHJtLmgiCisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKyNpbmNsdWRlICJpOTE1X3JlZy5oIgorI2luY2x1ZGUgImludGVsX2Rydi5oIgorCisvKiBMaW1pdHMgZm9yIG92ZXJsYXkgc2l6ZS4gQWNjb3JkaW5nIHRvIGludGVsIGRvYywgdGhlIHJlYWwgbGltaXRzIGFyZToKKyAqIFkgd2lkdGg6IDQwOTUsIFVWIHdpZHRoIChwbGFuYXIpOiAyMDQ3LCBZIGhlaWdodDogMjA0NywKKyAqIFVWIHdpZHRoIChwbGFuYXIpOiAqIDEwMjMuIEJ1dCB0aGUgeG9yZyB0aGlua3MgMjA0OCBmb3IgaGVpZ2h0IGFuZCB3aWR0aC4gVXNlCisgKiB0aGUgbWluaW51bSBvZiBib3RoLiAgKi8KKyNkZWZpbmUgSU1BR0VfTUFYX1dJRFRICQkyMDQ4CisjZGVmaW5lIElNQUdFX01BWF9IRUlHSFQJMjA0NiAvKiAyICogMTAyMyAqLworLyogb24gODMwIGFuZCA4NDUgdGhlc2UgbGFyZ2UgbGltaXRzIHJlc3VsdCBpbiB0aGUgY2FyZCBoYW5naW5nICovCisjZGVmaW5lIElNQUdFX01BWF9XSURUSF9MRUdBQ1kJMTAyNAorI2RlZmluZSBJTUFHRV9NQVhfSEVJR0hUX0xFR0FDWQkxMDg4CisKKy8qIG92ZXJsYXkgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKy8qIE9DTUQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgT0NNRF9USUxFRF9TVVJGQUNFCSgweDE8PDE5KQorI2RlZmluZSBPQ01EX01JUlJPUl9NQVNLCSgweDM8PDE3KQorI2RlZmluZSBPQ01EX01JUlJPUl9NT0RFCSgweDM8PDE3KQorI2RlZmluZSBPQ01EX01JUlJPUl9IT1JJWk9OVEFMCSgweDE8PDE3KQorI2RlZmluZSBPQ01EX01JUlJPUl9WRVJUSUNBTAkoMHgyPDwxNykKKyNkZWZpbmUgT0NNRF9NSVJST1JfQk9USAkoMHgzPDwxNykKKyNkZWZpbmUgT0NNRF9CWVRFT1JERVJfTUFTSwkoMHgzPDwxNCkgLyogemVybyBmb3IgWVVZViBvciBGT1VSQ0MgWVVZMiAqLworI2RlZmluZSBPQ01EX1VWX1NXQVAJCSgweDE8PDE0KSAvKiBZVllVICovCisjZGVmaW5lIE9DTURfWV9TV0FQCQkoMHgyPDwxNCkgLyogVVlWWSBvciBGT1VSQ0MgVVlWWSAqLworI2RlZmluZSBPQ01EX1lfQU5EX1VWX1NXQVAJKDB4Mzw8MTQpIC8qIFZZVVkgKi8KKyNkZWZpbmUgT0NNRF9TT1VSQ0VfRk9STUFUX01BU0sgKDB4Zjw8MTApCisjZGVmaW5lIE9DTURfUkdCXzg4OAkJKDB4MTw8MTApIC8qIG5vdCBpbiBpOTY1IEludGVsIGRvY3MgKi8KKyNkZWZpbmUgT0NNRF9SR0JfNTU1CQkoMHgyPDwxMCkgLyogbm90IGluIGk5NjUgSW50ZWwgZG9jcyAqLworI2RlZmluZSBPQ01EX1JHQl81NjUJCSgweDM8PDEwKSAvKiBub3QgaW4gaTk2NSBJbnRlbCBkb2NzICovCisjZGVmaW5lIE9DTURfWVVWXzQyMl9QQUNLRUQJKDB4ODw8MTApCisjZGVmaW5lIE9DTURfWVVWXzQxMV9QQUNLRUQJKDB4OTw8MTApIC8qIG5vdCBpbiBpOTY1IEludGVsIGRvY3MgKi8KKyNkZWZpbmUgT0NNRF9ZVVZfNDIwX1BMQU5BUgkoMHhjPDwxMCkKKyNkZWZpbmUgT0NNRF9ZVVZfNDIyX1BMQU5BUgkoMHhkPDwxMCkKKyNkZWZpbmUgT0NNRF9ZVVZfNDEwX1BMQU5BUgkoMHhlPDwxMCkgLyogYWxzbyA0MTEgKi8KKyNkZWZpbmUgT0NNRF9UVlNZTkNGTElQX1BBUklUWQkoMHgxPDw5KQorI2RlZmluZSBPQ01EX1RWU1lOQ0ZMSVBfRU5BQkxFCSgweDE8PDcpCisjZGVmaW5lIE9DTURfQlVGX1RZUEVfTUFTSwkoT3gxPDw1KQorI2RlZmluZSBPQ01EX0JVRl9UWVBFX0ZSQU1FCSgweDA8PDUpCisjZGVmaW5lIE9DTURfQlVGX1RZUEVfRklFTEQJKDB4MTw8NSkKKyNkZWZpbmUgT0NNRF9URVNUX01PREUJCSgweDE8PDQpCisjZGVmaW5lIE9DTURfQlVGRkVSX1NFTEVDVAkoMHgzPDwyKQorI2RlZmluZSBPQ01EX0JVRkZFUjAJCSgweDA8PDIpCisjZGVmaW5lIE9DTURfQlVGRkVSMQkJKDB4MTw8MikKKyNkZWZpbmUgT0NNRF9GSUVMRF9TRUxFQ1QJKDB4MTw8MikKKyNkZWZpbmUgT0NNRF9GSUVMRDAJCSgweDA8PDEpCisjZGVmaW5lIE9DTURfRklFTEQxCQkoMHgxPDwxKQorI2RlZmluZSBPQ01EX0VOQUJMRQkJKDB4MTw8MCkKKworLyogT0NPTkZJRyByZWdpc3RlciAqLworI2RlZmluZSBPQ09ORl9QSVBFX01BU0sJCSgweDE8PDE4KQorI2RlZmluZSBPQ09ORl9QSVBFX0EJCSgweDA8PDE4KQorI2RlZmluZSBPQ09ORl9QSVBFX0IJCSgweDE8PDE4KQorI2RlZmluZSBPQ09ORl9HQU1NQTJfRU5BQkxFCSgweDE8PDE2KQorI2RlZmluZSBPQ09ORl9DU0NfTU9ERV9CVDYwMQkoMHgwPDw1KQorI2RlZmluZSBPQ09ORl9DU0NfTU9ERV9CVDcwOQkoMHgxPDw1KQorI2RlZmluZSBPQ09ORl9DU0NfQllQQVNTCSgweDE8PDQpCisjZGVmaW5lIE9DT05GX0NDX09VVF84QklUCSgweDE8PDMpCisjZGVmaW5lIE9DT05GX1RFU1RfTU9ERQkJKDB4MTw8MikKKyNkZWZpbmUgT0NPTkZfVEhSRUVfTElORV9CVUZGRVIJKDB4MTw8MCkKKyNkZWZpbmUgT0NPTkZfVFdPX0xJTkVfQlVGRkVSCSgweDA8PDApCisKKy8qIERDTFJLTSAoZHN0LWtleSkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRFNUX0tFWV9FTkFCTEUJCSgweDE8PDMxKQorI2RlZmluZSBDTEtfUkdCMjRfTUFTSwkJMHgwCisjZGVmaW5lIENMS19SR0IxNl9NQVNLCQkweDA3MDMwNworI2RlZmluZSBDTEtfUkdCMTVfTUFTSwkJMHgwNzA3MDcKKyNkZWZpbmUgQ0xLX1JHQjhJX01BU0sJCTB4ZmZmZmZmCisKKyNkZWZpbmUgUkdCMTZfVE9fQ09MT1JLRVkoYykgXAorCSgoKGMgJiAweEY4MDApIDw8IDgpIHwgKChjICYgMHgwN0UwKSA8PCA1KSB8ICgoYyAmIDB4MDAxRikgPDwgMykpCisjZGVmaW5lIFJHQjE1X1RPX0NPTE9SS0VZKGMpIFwKKwkoKChjICYgMHg3YzAwKSA8PCA5KSB8ICgoYyAmIDB4MDNFMCkgPDwgNikgfCAoKGMgJiAweDAwMUYpIDw8IDMpKQorCisvKiBvdmVybGF5IGZsaXAgYWRkciBmbGFnICovCisjZGVmaW5lIE9GQ19VUERBVEUJCTB4MQorCisvKiBwb2x5cGhhc2UgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworI2RlZmluZSBOX0hPUklaX1lfVEFQUyAgICAgICAgICA1CisjZGVmaW5lIE5fVkVSVF9ZX1RBUFMgICAgICAgICAgIDMKKyNkZWZpbmUgTl9IT1JJWl9VVl9UQVBTICAgICAgICAgMworI2RlZmluZSBOX1ZFUlRfVVZfVEFQUyAgICAgICAgICAzCisjZGVmaW5lIE5fUEhBU0VTICAgICAgICAgICAgICAgIDE3CisjZGVmaW5lIE1BWF9UQVBTICAgICAgICAgICAgICAgIDUKKworLyogbWVtb3J5IGJ1ZmZlcmQgb3ZlcmxheSByZWdpc3RlcnMgKi8KK3N0cnVjdCBvdmVybGF5X3JlZ2lzdGVycyB7CisgICAgdTMyIE9CVUZfMFk7CisgICAgdTMyIE9CVUZfMVk7CisgICAgdTMyIE9CVUZfMFU7CisgICAgdTMyIE9CVUZfMFY7CisgICAgdTMyIE9CVUZfMVU7CisgICAgdTMyIE9CVUZfMVY7CisgICAgdTMyIE9TVFJJREU7CisgICAgdTMyIFlSR0JfVlBIOworICAgIHUzMiBVVl9WUEg7CisgICAgdTMyIEhPUlpfUEg7CisgICAgdTMyIElOSVRfUEhTOworICAgIHUzMiBEV0lOUE9TOworICAgIHUzMiBEV0lOU1o7CisgICAgdTMyIFNXSURUSDsKKyAgICB1MzIgU1dJRFRIU1c7CisgICAgdTMyIFNIRUlHSFQ7CisgICAgdTMyIFlSR0JTQ0FMRTsKKyAgICB1MzIgVVZTQ0FMRTsKKyAgICB1MzIgT0NMUkMwOworICAgIHUzMiBPQ0xSQzE7CisgICAgdTMyIERDTFJLVjsKKyAgICB1MzIgRENMUktNOworICAgIHUzMiBTQ0xSS1ZIOworICAgIHUzMiBTQ0xSS1ZMOworICAgIHUzMiBTQ0xSS0VOOworICAgIHUzMiBPQ09ORklHOworICAgIHUzMiBPQ01EOworICAgIHUzMiBSRVNFUlZFRDE7IC8qIDB4NkMgKi8KKyAgICB1MzIgT1NUQVJUXzBZOworICAgIHUzMiBPU1RBUlRfMVk7CisgICAgdTMyIE9TVEFSVF8wVTsKKyAgICB1MzIgT1NUQVJUXzBWOworICAgIHUzMiBPU1RBUlRfMVU7CisgICAgdTMyIE9TVEFSVF8xVjsKKyAgICB1MzIgT1RJTEVPRkZfMFk7CisgICAgdTMyIE9USUxFT0ZGXzFZOworICAgIHUzMiBPVElMRU9GRl8wVTsKKyAgICB1MzIgT1RJTEVPRkZfMFY7CisgICAgdTMyIE9USUxFT0ZGXzFVOworICAgIHUzMiBPVElMRU9GRl8xVjsKKyAgICB1MzIgRkFTVEhTQ0FMRTsgLyogMHhBMCAqLworICAgIHUzMiBVVlNDQUxFVjsgLyogMHhBNCAqLworICAgIHUzMiBSRVNFUlZFRENbKDB4MjAwIC0gMHhBOCkgLyA0XTsgLyogMHhBOCAtIDB4MUZDICovCisgICAgdTE2IFlfVkNPRUZTW05fVkVSVF9ZX1RBUFMgKiBOX1BIQVNFU107IC8qIDB4MjAwICovCisgICAgdTE2IFJFU0VSVkVERFsweDEwMCAvIDIgLSBOX1ZFUlRfWV9UQVBTICogTl9QSEFTRVNdOworICAgIHUxNiBZX0hDT0VGU1tOX0hPUklaX1lfVEFQUyAqIE5fUEhBU0VTXTsgLyogMHgzMDAgKi8KKyAgICB1MTYgUkVTRVJWRURFWzB4MjAwIC8gMiAtIE5fSE9SSVpfWV9UQVBTICogTl9QSEFTRVNdOworICAgIHUxNiBVVl9WQ09FRlNbTl9WRVJUX1VWX1RBUFMgKiBOX1BIQVNFU107IC8qIDB4NTAwICovCisgICAgdTE2IFJFU0VSVkVERlsweDEwMCAvIDIgLSBOX1ZFUlRfVVZfVEFQUyAqIE5fUEhBU0VTXTsKKyAgICB1MTYgVVZfSENPRUZTW05fSE9SSVpfVVZfVEFQUyAqIE5fUEhBU0VTXTsgLyogMHg2MDAgKi8KKyAgICB1MTYgUkVTRVJWRURHWzB4MTAwIC8gMiAtIE5fSE9SSVpfVVZfVEFQUyAqIE5fUEhBU0VTXTsKK307CisKKy8qIG92ZXJsYXkgZmxpcCBhZGRyIGZsYWcgKi8KKyNkZWZpbmUgT0ZDX1VQREFURQkJMHgxCisKKyNkZWZpbmUgT1ZFUkxBWV9OT05QSFlTSUNBTChkZXYpIChJU19HMzMoZGV2KSB8fCBJU19JOTY1RyhkZXYpKQorI2RlZmluZSBPVkVSTEFZX0VYSVNUUyhkZXYpICghSVNfRzRYKGRldikgJiYgIUlTX0lST05MQUtFKGRldikpCisKKworc3RhdGljIHN0cnVjdCBvdmVybGF5X3JlZ2lzdGVycyAqaW50ZWxfb3ZlcmxheV9tYXBfcmVnc19hdG9taWMoc3RydWN0IGludGVsX292ZXJsYXkgKm92ZXJsYXkpCit7CisgICAgICAgIGRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBvdmVybGF5LT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBvdmVybGF5X3JlZ2lzdGVycyAqcmVnczsKKworCS8qIG5vIHJlY3Vyc2l2ZSBtYXBwaW5ncyAqLworCUJVR19PTihvdmVybGF5LT52aXJ0X2FkZHIpOworCisJaWYgKE9WRVJMQVlfTk9OUEhZU0lDQUwob3ZlcmxheS0+ZGV2KSkgeworCQlyZWdzID0gaW9fbWFwcGluZ19tYXBfYXRvbWljX3djKGRldl9wcml2LT5tbS5ndHRfbWFwcGluZywKKwkJCQlvdmVybGF5LT5yZWdfYm8tPmd0dF9vZmZzZXQpOworCisJCWlmICghcmVncykgeworCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gbWFwIG92ZXJsYXkgcmVncyBpbiBHVFRcbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IGVsc2UKKwkJcmVncyA9IG92ZXJsYXktPnJlZ19iby0+cGh5c19vYmotPmhhbmRsZS0+dmFkZHI7CisKKwlyZXR1cm4gb3ZlcmxheS0+dmlydF9hZGRyID0gcmVnczsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfb3ZlcmxheV91bm1hcF9yZWdzX2F0b21pYyhzdHJ1Y3QgaW50ZWxfb3ZlcmxheSAqb3ZlcmxheSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb3ZlcmxheS0+ZGV2OworICAgICAgICBkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChPVkVSTEFZX05PTlBIWVNJQ0FMKG92ZXJsYXktPmRldikpCisJCWlvX21hcHBpbmdfdW5tYXBfYXRvbWljKG92ZXJsYXktPnZpcnRfYWRkcik7CisKKwlvdmVybGF5LT52aXJ0X2FkZHIgPSBOVUxMOworCisJSTkxNV9SRUFEKE9WQUREKTsgLyogZmx1c2ggd2MgY2FzaGVzICovCisKKwlyZXR1cm47Cit9CisKKy8qIG92ZXJsYXkgbmVlZHMgdG8gYmUgZGlzYWJsZSBpbiBPQ01EIHJlZyAqLworc3RhdGljIGludCBpbnRlbF9vdmVybGF5X29uKHN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvdmVybGF5LT5kZXY7CisgICAgICAgIGRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCByZXQ7CisJUklOR19MT0NBTFM7CisKKwlCVUdfT04ob3ZlcmxheS0+YWN0aXZlKTsKKworCW92ZXJsYXktPmFjdGl2ZSA9IDE7CisJb3ZlcmxheS0+aHdfd2VkZ2VkID0gTkVFRFNfV0FJVF9GT1JfRkxJUDsKKworCUJFR0lOX0xQX1JJTkcoNik7CisJT1VUX1JJTkcoTUlfRkxVU0gpOworCU9VVF9SSU5HKE1JX05PT1ApOworCU9VVF9SSU5HKE1JX09WRVJMQVlfRkxJUCB8IE1JX09WRVJMQVlfT04pOworCU9VVF9SSU5HKG92ZXJsYXktPmZsaXBfYWRkciB8IE9GQ19VUERBVEUpOworCU9VVF9SSU5HKE1JX1dBSVRfRk9SX0VWRU5UIHwgTUlfV0FJVF9GT1JfT1ZFUkxBWV9GTElQKTsKKwlPVVRfUklORyhNSV9OT09QKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKKworCW92ZXJsYXktPmxhc3RfZmxpcF9yZXEgPSBpOTE1X2FkZF9yZXF1ZXN0KGRldiwgTlVMTCwgMCk7CisJaWYgKG92ZXJsYXktPmxhc3RfZmxpcF9yZXEgPT0gMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBpOTE1X2RvX3dhaXRfcmVxdWVzdChkZXYsIG92ZXJsYXktPmxhc3RfZmxpcF9yZXEsIDEpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCW92ZXJsYXktPmh3X3dlZGdlZCA9IDA7CisJb3ZlcmxheS0+bGFzdF9mbGlwX3JlcSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qIG92ZXJsYXkgbmVlZHMgdG8gYmUgZW5hYmxlZCBpbiBPQ01EIHJlZyAqLworc3RhdGljIHZvaWQgaW50ZWxfb3ZlcmxheV9jb250aW51ZShzdHJ1Y3QgaW50ZWxfb3ZlcmxheSAqb3ZlcmxheSwKKwkJCSAgICBib29sIGxvYWRfcG9seXBoYXNlX2ZpbHRlcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb3ZlcmxheS0+ZGV2OworICAgICAgICBkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgZmxpcF9hZGRyID0gb3ZlcmxheS0+ZmxpcF9hZGRyOworCXUzMiB0bXA7CisJUklOR19MT0NBTFM7CisKKwlCVUdfT04oIW92ZXJsYXktPmFjdGl2ZSk7CisKKwlpZiAobG9hZF9wb2x5cGhhc2VfZmlsdGVyKQorCQlmbGlwX2FkZHIgfD0gT0ZDX1VQREFURTsKKworCS8qIGNoZWNrIGZvciB1bmRlcnJ1bnMgKi8KKwl0bXAgPSBJOTE1X1JFQUQoRE9WU1RBKTsKKwlpZiAodG1wICYgKDEgPDwgMTcpKQorCQlEUk1fREVCVUcoIm92ZXJsYXkgdW5kZXJydW4sIERPVlNUQTogJXhcbiIsIHRtcCk7CisKKwlCRUdJTl9MUF9SSU5HKDQpOworCU9VVF9SSU5HKE1JX0ZMVVNIKTsKKwlPVVRfUklORyhNSV9OT09QKTsKKwlPVVRfUklORyhNSV9PVkVSTEFZX0ZMSVAgfCBNSV9PVkVSTEFZX0NPTlRJTlVFKTsKKwlPVVRfUklORyhmbGlwX2FkZHIpOworICAgICAgICBBRFZBTkNFX0xQX1JJTkcoKTsKKworCW92ZXJsYXktPmxhc3RfZmxpcF9yZXEgPSBpOTE1X2FkZF9yZXF1ZXN0KGRldiwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfb3ZlcmxheV93YWl0X2ZsaXAoc3RydWN0IGludGVsX292ZXJsYXkgKm92ZXJsYXkpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG92ZXJsYXktPmRldjsKKyAgICAgICAgZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHJldDsKKwl1MzIgdG1wOworCVJJTkdfTE9DQUxTOworCisJaWYgKG92ZXJsYXktPmxhc3RfZmxpcF9yZXEgIT0gMCkgeworCQlyZXQgPSBpOTE1X2RvX3dhaXRfcmVxdWVzdChkZXYsIG92ZXJsYXktPmxhc3RfZmxpcF9yZXEsIDEpOworCQlpZiAocmV0ID09IDApIHsKKwkJCW92ZXJsYXktPmxhc3RfZmxpcF9yZXEgPSAwOworCisJCQl0bXAgPSBJOTE1X1JFQUQoSVNSKTsKKworCQkJaWYgKCEodG1wICYgSTkxNV9PVkVSTEFZX1BMQU5FX0ZMSVBfUEVORElOR19JTlRFUlJVUFQpKQorCQkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogc3luY2hyb25vdXMgc2xvd3BhdGggKi8KKwlvdmVybGF5LT5od193ZWRnZWQgPSBSRUxFQVNFX09MRF9WSUQ7CisKKwlCRUdJTl9MUF9SSU5HKDIpOworICAgICAgICBPVVRfUklORyhNSV9XQUlUX0ZPUl9FVkVOVCB8IE1JX1dBSVRfRk9SX09WRVJMQVlfRkxJUCk7CisgICAgICAgIE9VVF9SSU5HKE1JX05PT1ApOworICAgICAgICBBRFZBTkNFX0xQX1JJTkcoKTsKKworCW92ZXJsYXktPmxhc3RfZmxpcF9yZXEgPSBpOTE1X2FkZF9yZXF1ZXN0KGRldiwgTlVMTCwgMCk7CisJaWYgKG92ZXJsYXktPmxhc3RfZmxpcF9yZXEgPT0gMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBpOTE1X2RvX3dhaXRfcmVxdWVzdChkZXYsIG92ZXJsYXktPmxhc3RfZmxpcF9yZXEsIDEpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCW92ZXJsYXktPmh3X3dlZGdlZCA9IDA7CisJb3ZlcmxheS0+bGFzdF9mbGlwX3JlcSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qIG92ZXJsYXkgbmVlZHMgdG8gYmUgZGlzYWJsZWQgaW4gT0NNRCByZWcgKi8KK3N0YXRpYyBpbnQgaW50ZWxfb3ZlcmxheV9vZmYoc3RydWN0IGludGVsX292ZXJsYXkgKm92ZXJsYXkpCit7CisJdTMyIGZsaXBfYWRkciA9IG92ZXJsYXktPmZsaXBfYWRkcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb3ZlcmxheS0+ZGV2OworICAgICAgICBkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgcmV0OworCVJJTkdfTE9DQUxTOworCisJQlVHX09OKCFvdmVybGF5LT5hY3RpdmUpOworCisJLyogQWNjb3JkaW5nIHRvIGludGVsIGRvY3MgdGhlIG92ZXJsYXkgaHcgbWF5IGhhbmcgKHdoZW4gc3dpdGNoaW5nCisJICogb2ZmKSB3aXRob3V0IGxvYWRpbmcgdGhlIGZpbHRlciBjb2VmZnMuIEl0IGlzIGhvd2V2ZXIgdW5jbGVhciB3aGV0aGVyCisJICogdGhpcyBhcHBsaWVzIHRvIHRoZSBkaXNhYmxpbmcgb2YgdGhlIG92ZXJsYXkgb3IgdG8gdGhlIHN3aXRjaGluZyBvZmYKKwkgKiBvZiB0aGUgaHcuIERvIGl0IGluIGJvdGggY2FzZXMgKi8KKwlmbGlwX2FkZHIgfD0gT0ZDX1VQREFURTsKKworCS8qIHdhaXQgZm9yIG92ZXJsYXkgdG8gZ28gaWRsZSAqLworCW92ZXJsYXktPmh3X3dlZGdlZCA9IFNXSVRDSF9PRkZfU1RBR0VfMTsKKworCUJFR0lOX0xQX1JJTkcoNik7CisJT1VUX1JJTkcoTUlfRkxVU0gpOworCU9VVF9SSU5HKE1JX05PT1ApOworCU9VVF9SSU5HKE1JX09WRVJMQVlfRkxJUCB8IE1JX09WRVJMQVlfQ09OVElOVUUpOworCU9VVF9SSU5HKGZsaXBfYWRkcik7CisgICAgICAgIE9VVF9SSU5HKE1JX1dBSVRfRk9SX0VWRU5UIHwgTUlfV0FJVF9GT1JfT1ZFUkxBWV9GTElQKTsKKyAgICAgICAgT1VUX1JJTkcoTUlfTk9PUCk7CisgICAgICAgIEFEVkFOQ0VfTFBfUklORygpOworCisJb3ZlcmxheS0+bGFzdF9mbGlwX3JlcSA9IGk5MTVfYWRkX3JlcXVlc3QoZGV2LCBOVUxMLCAwKTsKKwlpZiAob3ZlcmxheS0+bGFzdF9mbGlwX3JlcSA9PSAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGk5MTVfZG9fd2FpdF9yZXF1ZXN0KGRldiwgb3ZlcmxheS0+bGFzdF9mbGlwX3JlcSwgMSk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJLyogdHVybiBvdmVybGF5IG9mZiAqLworCW92ZXJsYXktPmh3X3dlZGdlZCA9IFNXSVRDSF9PRkZfU1RBR0VfMjsKKworCUJFR0lOX0xQX1JJTkcoNik7CisgICAgICAgIE9VVF9SSU5HKE1JX0ZMVVNIKTsKKyAgICAgICAgT1VUX1JJTkcoTUlfTk9PUCk7CisgICAgICAgIE9VVF9SSU5HKE1JX09WRVJMQVlfRkxJUCB8IE1JX09WRVJMQVlfT0ZGKTsKKwlPVVRfUklORyhmbGlwX2FkZHIpOworICAgICAgICBPVVRfUklORyhNSV9XQUlUX0ZPUl9FVkVOVCB8IE1JX1dBSVRfRk9SX09WRVJMQVlfRkxJUCk7CisgICAgICAgIE9VVF9SSU5HKE1JX05PT1ApOworCUFEVkFOQ0VfTFBfUklORygpOworCisJb3ZlcmxheS0+bGFzdF9mbGlwX3JlcSA9IGk5MTVfYWRkX3JlcXVlc3QoZGV2LCBOVUxMLCAwKTsKKwlpZiAob3ZlcmxheS0+bGFzdF9mbGlwX3JlcSA9PSAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGk5MTVfZG9fd2FpdF9yZXF1ZXN0KGRldiwgb3ZlcmxheS0+bGFzdF9mbGlwX3JlcSwgMSk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJb3ZlcmxheS0+aHdfd2VkZ2VkID0gMDsKKwlvdmVybGF5LT5sYXN0X2ZsaXBfcmVxID0gMDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9vdmVybGF5X29mZl90YWlsKHN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5KQoreworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOworCisJLyogbmV2ZXIgaGF2ZSB0aGUgb3ZlcmxheSBodyBvbiB3aXRob3V0IHNob3dpbmcgYSBmcmFtZSAqLworCUJVR19PTighb3ZlcmxheS0+dmlkX2JvKTsKKwlvYmogPSBvdmVybGF5LT52aWRfYm8tPm9iajsKKworCWk5MTVfZ2VtX29iamVjdF91bnBpbihvYmopOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG9iaik7CisJb3ZlcmxheS0+dmlkX2JvID0gTlVMTDsKKworCW92ZXJsYXktPmNydGMtPm92ZXJsYXkgPSBOVUxMOworCW92ZXJsYXktPmNydGMgPSBOVUxMOworCW92ZXJsYXktPmFjdGl2ZSA9IDA7Cit9CisKKy8qIHJlY292ZXIgZnJvbSBhbiBpbnRlcnJ1cHRpb24gZHVlIHRvIGEgc2lnbmFsCisgKiBXZSBoYXZlIHRvIGJlIGNhcmVmdWwgbm90IHRvIHJlcGVhdCB3b3JrIGZvcmV2ZXIgYW4gbWFrZSBmb3J3YXJkIHByb2dlc3MuICovCitpbnQgaW50ZWxfb3ZlcmxheV9yZWNvdmVyX2Zyb21faW50ZXJydXB0KHN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5LAorCQkJCQkgaW50IGludGVycnVwdGlibGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG92ZXJsYXktPmRldjsKKyAgICAgICAgZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CisJdTMyIGZsaXBfYWRkcjsKKwlpbnQgcmV0OworCVJJTkdfTE9DQUxTOworCisJaWYgKG92ZXJsYXktPmh3X3dlZGdlZCA9PSBIV19XRURHRUQpCisJCXJldHVybiAtRUlPOworCisJaWYgKG92ZXJsYXktPmxhc3RfZmxpcF9yZXEgPT0gMCkgeworCQlvdmVybGF5LT5sYXN0X2ZsaXBfcmVxID0gaTkxNV9hZGRfcmVxdWVzdChkZXYsIE5VTEwsIDApOworCQlpZiAob3ZlcmxheS0+bGFzdF9mbGlwX3JlcSA9PSAwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gaTkxNV9kb193YWl0X3JlcXVlc3QoZGV2LCBvdmVybGF5LT5sYXN0X2ZsaXBfcmVxLCBpbnRlcnJ1cHRpYmxlKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKG92ZXJsYXktPmh3X3dlZGdlZCkgeworCQljYXNlIFJFTEVBU0VfT0xEX1ZJRDoKKwkJCW9iaiA9IG92ZXJsYXktPm9sZF92aWRfYm8tPm9iajsKKwkJCWk5MTVfZ2VtX29iamVjdF91bnBpbihvYmopOworCQkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKKwkJCW92ZXJsYXktPm9sZF92aWRfYm8gPSBOVUxMOworCQkJYnJlYWs7CisJCWNhc2UgU1dJVENIX09GRl9TVEFHRV8xOgorCQkJZmxpcF9hZGRyID0gb3ZlcmxheS0+ZmxpcF9hZGRyOworCQkJZmxpcF9hZGRyIHw9IE9GQ19VUERBVEU7CisKKwkJCW92ZXJsYXktPmh3X3dlZGdlZCA9IFNXSVRDSF9PRkZfU1RBR0VfMjsKKworCQkJQkVHSU5fTFBfUklORyg2KTsKKwkJCU9VVF9SSU5HKE1JX0ZMVVNIKTsKKwkJCU9VVF9SSU5HKE1JX05PT1ApOworCQkJT1VUX1JJTkcoTUlfT1ZFUkxBWV9GTElQIHwgTUlfT1ZFUkxBWV9PRkYpOworCQkJT1VUX1JJTkcoZmxpcF9hZGRyKTsKKwkJCU9VVF9SSU5HKE1JX1dBSVRfRk9SX0VWRU5UIHwgTUlfV0FJVF9GT1JfT1ZFUkxBWV9GTElQKTsKKwkJCU9VVF9SSU5HKE1JX05PT1ApOworCQkJQURWQU5DRV9MUF9SSU5HKCk7CisKKwkJCW92ZXJsYXktPmxhc3RfZmxpcF9yZXEgPSBpOTE1X2FkZF9yZXF1ZXN0KGRldiwgTlVMTCwgMCk7CisJCQlpZiAob3ZlcmxheS0+bGFzdF9mbGlwX3JlcSA9PSAwKQorCQkJCXJldHVybiAtRU5PTUVNOworCisJCQlyZXQgPSBpOTE1X2RvX3dhaXRfcmVxdWVzdChkZXYsIG92ZXJsYXktPmxhc3RfZmxpcF9yZXEsCisJCQkJCWludGVycnVwdGlibGUpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCXJldHVybiByZXQ7CisKKwkJY2FzZSBTV0lUQ0hfT0ZGX1NUQUdFXzI6CisJCQlpbnRlbF9vdmVybGF5X29mZl90YWlsKG92ZXJsYXkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUdfT04ob3ZlcmxheS0+aHdfd2VkZ2VkICE9IE5FRURTX1dBSVRfRk9SX0ZMSVApOworCX0KKworCW92ZXJsYXktPmh3X3dlZGdlZCA9IDA7CisJb3ZlcmxheS0+bGFzdF9mbGlwX3JlcSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qIFdhaXQgZm9yIHBlbmRpbmcgb3ZlcmxheSBmbGlwIGFuZCByZWxlYXNlIG9sZCBmcmFtZS4KKyAqIE5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIG92ZXJsYXkgcmVnaXN0ZXIgYXJlIGNoYW5nZWQKKyAqIHZpYSBpbnRlbF9vdmVybGF5Xyh1biltYXBfcmVnc19hdG9taWMgKi8KK3N0YXRpYyBpbnQgaW50ZWxfb3ZlcmxheV9yZWxlYXNlX29sZF92aWQoc3RydWN0IGludGVsX292ZXJsYXkgKm92ZXJsYXkpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKworCS8qIG9ubHkgd2FpdCBpZiB0aGVyZSBpcyBhY3R1YWxseSBhbiBvbGQgZnJhbWUgdG8gcmVsZWFzZSB0bworCSAqIGd1YXJhbnRlZSBmb3J3YXJkIHByb2dyZXNzICovCisJaWYgKCFvdmVybGF5LT5vbGRfdmlkX2JvKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGludGVsX292ZXJsYXlfd2FpdF9mbGlwKG92ZXJsYXkpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCW9iaiA9IG92ZXJsYXktPm9sZF92aWRfYm8tPm9iajsKKwlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCW92ZXJsYXktPm9sZF92aWRfYm8gPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwdXRfaW1hZ2VfcGFyYW1zIHsKKwlpbnQgZm9ybWF0OworCXNob3J0IGRzdF94OworCXNob3J0IGRzdF95OworCXNob3J0IGRzdF93OworCXNob3J0IGRzdF9oOworCXNob3J0IHNyY193OworCXNob3J0IHNyY19zY2FuX2g7CisJc2hvcnQgc3JjX3NjYW5fdzsKKwlzaG9ydCBzcmNfaDsKKwlzaG9ydCBzdHJpZGVfWTsKKwlzaG9ydCBzdHJpZGVfVVY7CisJaW50IG9mZnNldF9ZOworCWludCBvZmZzZXRfVTsKKwlpbnQgb2Zmc2V0X1Y7Cit9OworCitzdGF0aWMgaW50IHBhY2tlZF9kZXB0aF9ieXRlcyh1MzIgZm9ybWF0KQoreworCXN3aXRjaCAoZm9ybWF0ICYgSTkxNV9PVkVSTEFZX0RFUFRIX01BU0spIHsKKwkJY2FzZSBJOTE1X09WRVJMQVlfWVVWNDIyOgorCQkJcmV0dXJuIDQ7CisJCWNhc2UgSTkxNV9PVkVSTEFZX1lVVjQxMToKKwkJCS8qIHJldHVybiA2OyBub3QgaW1wbGVtZW50ZWQgKi8KKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCBwYWNrZWRfd2lkdGhfYnl0ZXModTMyIGZvcm1hdCwgc2hvcnQgd2lkdGgpCit7CisJc3dpdGNoIChmb3JtYXQgJiBJOTE1X09WRVJMQVlfREVQVEhfTUFTSykgeworCQljYXNlIEk5MTVfT1ZFUkxBWV9ZVVY0MjI6CisJCQlyZXR1cm4gd2lkdGggPDwgMTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCB1dl9oc3Vic2FtcGxpbmcodTMyIGZvcm1hdCkKK3sKKwlzd2l0Y2ggKGZvcm1hdCAmIEk5MTVfT1ZFUkxBWV9ERVBUSF9NQVNLKSB7CisJCWNhc2UgSTkxNV9PVkVSTEFZX1lVVjQyMjoKKwkJY2FzZSBJOTE1X09WRVJMQVlfWVVWNDIwOgorCQkJcmV0dXJuIDI7CisJCWNhc2UgSTkxNV9PVkVSTEFZX1lVVjQxMToKKwkJY2FzZSBJOTE1X09WRVJMQVlfWVVWNDEwOgorCQkJcmV0dXJuIDQ7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdXZfdnN1YnNhbXBsaW5nKHUzMiBmb3JtYXQpCit7CisJc3dpdGNoIChmb3JtYXQgJiBJOTE1X09WRVJMQVlfREVQVEhfTUFTSykgeworCQljYXNlIEk5MTVfT1ZFUkxBWV9ZVVY0MjA6CisJCWNhc2UgSTkxNV9PVkVSTEFZX1lVVjQxMDoKKwkJCXJldHVybiAyOworCQljYXNlIEk5MTVfT1ZFUkxBWV9ZVVY0MjI6CisJCWNhc2UgSTkxNV9PVkVSTEFZX1lVVjQxMToKKwkJCXJldHVybiAxOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgdTMyIGNhbGNfc3dpZHRoc3coc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIG9mZnNldCwgdTMyIHdpZHRoKQoreworCXUzMiBtYXNrLCBzaGlmdCwgcmV0OworCWlmIChJU19JOVhYKGRldikpIHsKKwkJbWFzayA9IDB4M2Y7CisJCXNoaWZ0ID0gNjsKKwl9IGVsc2UgeworCQltYXNrID0gMHgxZjsKKwkJc2hpZnQgPSA1OworCX0KKwlyZXQgPSAoKG9mZnNldCArIHdpZHRoICsgbWFzaykgPj4gc2hpZnQpIC0gKG9mZnNldCA+PiBzaGlmdCk7CisJaWYgKElTX0k5WFgoZGV2KSkKKwkJcmV0IDw8PSAxOworCXJldCAtPTE7CisJcmV0dXJuIHJldCA8PCAyOworfQorCitzdGF0aWMgY29uc3QgdTE2IHlfc3RhdGljX2hjb2VmZnNbTl9IT1JJWl9ZX1RBUFMgKiBOX1BIQVNFU10gPSB7CisJMHgzMDAwLCAweGI0YTAsIDB4MTkzMCwgMHgxOTIwLCAweGI0YTAsCisJMHgzMDAwLCAweGI1MDAsIDB4MTlkMCwgMHgxODgwLCAweGI0NDAsCisJMHgzMDAwLCAweGI1NDAsIDB4MWE4OCwgMHgyZjgwLCAweGIzZTAsCisJMHgzMDAwLCAweGI1ODAsIDB4MWIzMCwgMHgyZTIwLCAweGIzODAsCisJMHgzMDAwLCAweGI1YzAsIDB4MWJkOCwgMHgyY2MwLCAweGIzMjAsCisJMHgzMDIwLCAweGI1ZTAsIDB4MWM2MCwgMHgyYjgwLCAweGIyYzAsCisJMHgzMDIwLCAweGI1ZTAsIDB4MWNmOCwgMHgyYTIwLCAweGIyNjAsCisJMHgzMDIwLCAweGI1ZTAsIDB4MWQ4MCwgMHgyOGUwLCAweGIyMDAsCisJMHgzMDIwLCAweGI1YzAsIDB4MWUwOCwgMHgzZjQwLCAweGIxYzAsCisJMHgzMDIwLCAweGI1ODAsIDB4MWU3OCwgMHgzY2UwLCAweGIxNjAsCisJMHgzMDQwLCAweGI1MjAsIDB4MWVkOCwgMHgzYWEwLCAweGIxMjAsCisJMHgzMDQwLCAweGI0YTAsIDB4MWYzMCwgMHgzODgwLCAweGIwZTAsCisJMHgzMDQwLCAweGI0MDAsIDB4MWY3OCwgMHgzNjgwLCAweGIwYTAsCisJMHgzMDIwLCAweGIzNDAsIDB4MWZiOCwgMHgzNGEwLCAweGIwNjAsCisJMHgzMDIwLCAweGIyNDAsIDB4MWZlMCwgMHgzMmUwLCAweGIwNDAsCisJMHgzMDIwLCAweGIxNDAsIDB4MWZmOCwgMHgzMTYwLCAweGIwMjAsCisJMHhiMDAwLCAweDMwMDAsIDB4MDgwMCwgMHgzMDAwLCAweGIwMDB9Oworc3RhdGljIGNvbnN0IHUxNiB1dl9zdGF0aWNfaGNvZWZmc1tOX0hPUklaX1VWX1RBUFMgKiBOX1BIQVNFU10gPSB7CisJMHgzMDAwLCAweDE4MDAsIDB4MTgwMCwgMHhiMDAwLCAweDE4ZDAsIDB4MmU2MCwKKwkweGIwMDAsIDB4MTk5MCwgMHgyY2UwLCAweGIwMjAsIDB4MWE2OCwgMHgyYjQwLAorCTB4YjA0MCwgMHgxYjIwLCAweDI5ZTAsIDB4YjA2MCwgMHgxYmQ4LCAweDI4ODAsCisJMHhiMDgwLCAweDFjODgsIDB4M2U2MCwgMHhiMGEwLCAweDFkMjgsIDB4M2MwMCwKKwkweGIwYzAsIDB4MWRiOCwgMHgzOWUwLCAweGIwZTAsIDB4MWU0MCwgMHgzN2UwLAorCTB4YjEwMCwgMHgxZWI4LCAweDM2MjAsIDB4YjEwMCwgMHgxZjE4LCAweDM0YTAsCisJMHhiMTAwLCAweDFmNjgsIDB4MzM2MCwgMHhiMGUwLCAweDFmYTgsIDB4MzI0MCwKKwkweGIwYzAsIDB4MWZlMCwgMHgzMTQwLCAweGIwNjAsIDB4MWZmMCwgMHgzMGEwLAorCTB4MzAwMCwgMHgwODAwLCAweDMwMDB9OworCitzdGF0aWMgdm9pZCB1cGRhdGVfcG9seXBoYXNlX2ZpbHRlcihzdHJ1Y3Qgb3ZlcmxheV9yZWdpc3RlcnMgKnJlZ3MpCit7CisJbWVtY3B5KHJlZ3MtPllfSENPRUZTLCB5X3N0YXRpY19oY29lZmZzLCBzaXplb2YoeV9zdGF0aWNfaGNvZWZmcykpOworCW1lbWNweShyZWdzLT5VVl9IQ09FRlMsIHV2X3N0YXRpY19oY29lZmZzLCBzaXplb2YodXZfc3RhdGljX2hjb2VmZnMpKTsKK30KKworc3RhdGljIGJvb2wgdXBkYXRlX3NjYWxpbmdfZmFjdG9ycyhzdHJ1Y3QgaW50ZWxfb3ZlcmxheSAqb3ZlcmxheSwKKwkJCQkgICBzdHJ1Y3Qgb3ZlcmxheV9yZWdpc3RlcnMgKnJlZ3MsCisJCQkJICAgc3RydWN0IHB1dF9pbWFnZV9wYXJhbXMgKnBhcmFtcykKK3sKKwkvKiBmaXhlZCBwb2ludCB3aXRoIGEgMTIgYml0IHNoaWZ0ICovCisJdTMyIHhzY2FsZSwgeXNjYWxlLCB4c2NhbGVfVVYsIHlzY2FsZV9VVjsKKyNkZWZpbmUgRlBfU0hJRlQgMTIKKyNkZWZpbmUgRlJBQ1RfTUFTSyAweGZmZgorCWJvb2wgc2NhbGVfY2hhbmdlZCA9IGZhbHNlOworCWludCB1dl9oc2NhbGUgPSB1dl9oc3Vic2FtcGxpbmcocGFyYW1zLT5mb3JtYXQpOworCWludCB1dl92c2NhbGUgPSB1dl92c3Vic2FtcGxpbmcocGFyYW1zLT5mb3JtYXQpOworCisJaWYgKHBhcmFtcy0+ZHN0X3cgPiAxKQorCQl4c2NhbGUgPSAoKHBhcmFtcy0+c3JjX3NjYW5fdyAtIDEpIDw8IEZQX1NISUZUKQorCQkJLyhwYXJhbXMtPmRzdF93KTsKKwllbHNlCisJCXhzY2FsZSA9IDEgPDwgRlBfU0hJRlQ7CisKKwlpZiAocGFyYW1zLT5kc3RfaCA+IDEpCisJCXlzY2FsZSA9ICgocGFyYW1zLT5zcmNfc2Nhbl9oIC0gMSkgPDwgRlBfU0hJRlQpCisJCQkvKHBhcmFtcy0+ZHN0X2gpOworCWVsc2UKKwkJeXNjYWxlID0gMSA8PCBGUF9TSElGVDsKKworCS8qaWYgKHBhcmFtcy0+Zm9ybWF0ICYgSTkxNV9PVkVSTEFZX1lVVl9QTEFOQVIpIHsqLworCQl4c2NhbGVfVVYgPSB4c2NhbGUvdXZfaHNjYWxlOworCQl5c2NhbGVfVVYgPSB5c2NhbGUvdXZfdnNjYWxlOworCQkvKiBtYWtlIHRoZSBZIHNjYWxlIHRvIFVWIHNjYWxlIHJhdGlvIGFuIGV4YWN0IG11bHRpcGx5ICovCisJCXhzY2FsZSA9IHhzY2FsZV9VViAqIHV2X2hzY2FsZTsKKwkJeXNjYWxlID0geXNjYWxlX1VWICogdXZfdnNjYWxlOworCS8qfSBlbHNlIHsKKwkJeHNjYWxlX1VWID0gMDsKKwkJeXNjYWxlX1VWID0gMDsKKwl9Ki8KKworCWlmICh4c2NhbGUgIT0gb3ZlcmxheS0+b2xkX3hzY2FsZSB8fCB5c2NhbGUgIT0gb3ZlcmxheS0+b2xkX3lzY2FsZSkKKwkJc2NhbGVfY2hhbmdlZCA9IHRydWU7CisJb3ZlcmxheS0+b2xkX3hzY2FsZSA9IHhzY2FsZTsKKwlvdmVybGF5LT5vbGRfeXNjYWxlID0geXNjYWxlOworCisJcmVncy0+WVJHQlNDQUxFID0gKCh5c2NhbGUgJiBGUkFDVF9NQVNLKSA8PCAyMCkKKwkJfCAoKHhzY2FsZSA+PiBGUF9TSElGVCkgPDwgMTYpCisJCXwgKCh4c2NhbGUgJiBGUkFDVF9NQVNLKSA8PCAzKTsKKwlyZWdzLT5VVlNDQUxFID0gKCh5c2NhbGVfVVYgJiBGUkFDVF9NQVNLKSA8PCAyMCkKKwkJfCAoKHhzY2FsZV9VViA+PiBGUF9TSElGVCkgPDwgMTYpCisJCXwgKCh4c2NhbGVfVVYgJiBGUkFDVF9NQVNLKSA8PCAzKTsKKwlyZWdzLT5VVlNDQUxFViA9ICgoeXNjYWxlID4+IEZQX1NISUZUKSA8PCAxNikKKwkJfCAoKHlzY2FsZV9VViA+PiBGUF9TSElGVCkgPDwgMCk7CisKKwlpZiAoc2NhbGVfY2hhbmdlZCkKKwkJdXBkYXRlX3BvbHlwaGFzZV9maWx0ZXIocmVncyk7CisKKwlyZXR1cm4gc2NhbGVfY2hhbmdlZDsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2NvbG9ya2V5KHN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5LAorCQkJICAgIHN0cnVjdCBvdmVybGF5X3JlZ2lzdGVycyAqcmVncykKK3sKKwl1MzIga2V5ID0gb3ZlcmxheS0+Y29sb3Jfa2V5OworCXN3aXRjaCAob3ZlcmxheS0+Y3J0Yy0+YmFzZS5mYi0+Yml0c19wZXJfcGl4ZWwpIHsKKwkJY2FzZSA4OgorCQkJcmVncy0+RENMUktWID0gMDsKKwkJCXJlZ3MtPkRDTFJLTSA9IENMS19SR0I4SV9NQVNLIHwgRFNUX0tFWV9FTkFCTEU7CisJCWNhc2UgMTY6CisJCQlpZiAob3ZlcmxheS0+Y3J0Yy0+YmFzZS5mYi0+ZGVwdGggPT0gMTUpIHsKKwkJCQlyZWdzLT5EQ0xSS1YgPSBSR0IxNV9UT19DT0xPUktFWShrZXkpOworCQkJCXJlZ3MtPkRDTFJLTSA9IENMS19SR0IxNV9NQVNLIHwgRFNUX0tFWV9FTkFCTEU7CisJCQl9IGVsc2UgeworCQkJCXJlZ3MtPkRDTFJLViA9IFJHQjE2X1RPX0NPTE9SS0VZKGtleSk7CisJCQkJcmVncy0+RENMUktNID0gQ0xLX1JHQjE2X01BU0sgfCBEU1RfS0VZX0VOQUJMRTsKKwkJCX0KKwkJY2FzZSAyNDoKKwkJY2FzZSAzMjoKKwkJCXJlZ3MtPkRDTFJLViA9IGtleTsKKwkJCXJlZ3MtPkRDTFJLTSA9IENMS19SR0IyNF9NQVNLIHwgRFNUX0tFWV9FTkFCTEU7CisJfQorfQorCitzdGF0aWMgdTMyIG92ZXJsYXlfY21kX3JlZyhzdHJ1Y3QgcHV0X2ltYWdlX3BhcmFtcyAqcGFyYW1zKQoreworCXUzMiBjbWQgPSBPQ01EX0VOQUJMRSB8IE9DTURfQlVGX1RZUEVfRlJBTUUgfCBPQ01EX0JVRkZFUjA7CisKKwlpZiAocGFyYW1zLT5mb3JtYXQgJiBJOTE1X09WRVJMQVlfWVVWX1BMQU5BUikgeworCQlzd2l0Y2ggKHBhcmFtcy0+Zm9ybWF0ICYgSTkxNV9PVkVSTEFZX0RFUFRIX01BU0spIHsKKwkJCWNhc2UgSTkxNV9PVkVSTEFZX1lVVjQyMjoKKwkJCQljbWQgfD0gT0NNRF9ZVVZfNDIyX1BMQU5BUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgSTkxNV9PVkVSTEFZX1lVVjQyMDoKKwkJCQljbWQgfD0gT0NNRF9ZVVZfNDIwX1BMQU5BUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgSTkxNV9PVkVSTEFZX1lVVjQxMToKKwkJCWNhc2UgSTkxNV9PVkVSTEFZX1lVVjQxMDoKKwkJCQljbWQgfD0gT0NNRF9ZVVZfNDEwX1BMQU5BUjsKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7IC8qIFlVViBwYWNrZWQgKi8KKwkJc3dpdGNoIChwYXJhbXMtPmZvcm1hdCAmIEk5MTVfT1ZFUkxBWV9ERVBUSF9NQVNLKSB7CisJCQljYXNlIEk5MTVfT1ZFUkxBWV9ZVVY0MjI6CisJCQkJY21kIHw9IE9DTURfWVVWXzQyMl9QQUNLRUQ7CisJCQkJYnJlYWs7CisJCQljYXNlIEk5MTVfT1ZFUkxBWV9ZVVY0MTE6CisJCQkJY21kIHw9IE9DTURfWVVWXzQxMV9QQUNLRUQ7CisJCQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2ggKHBhcmFtcy0+Zm9ybWF0ICYgSTkxNV9PVkVSTEFZX1NXQVBfTUFTSykgeworCQkJY2FzZSBJOTE1X09WRVJMQVlfTk9fU1dBUDoKKwkJCQlicmVhazsKKwkJCWNhc2UgSTkxNV9PVkVSTEFZX1VWX1NXQVA6CisJCQkJY21kIHw9IE9DTURfVVZfU1dBUDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSTkxNV9PVkVSTEFZX1lfU1dBUDoKKwkJCQljbWQgfD0gT0NNRF9ZX1NXQVA7CisJCQkJYnJlYWs7CisJCQljYXNlIEk5MTVfT1ZFUkxBWV9ZX0FORF9VVl9TV0FQOgorCQkJCWNtZCB8PSBPQ01EX1lfQU5EX1VWX1NXQVA7CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gY21kOworfQorCitpbnQgaW50ZWxfb3ZlcmxheV9kb19wdXRfaW1hZ2Uoc3RydWN0IGludGVsX292ZXJsYXkgKm92ZXJsYXksCisJCQkgICAgICAgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpuZXdfYm8sCisJCQkgICAgICAgc3RydWN0IHB1dF9pbWFnZV9wYXJhbXMgKnBhcmFtcykKK3sKKwlpbnQgcmV0LCB0bXBfd2lkdGg7CisJc3RydWN0IG92ZXJsYXlfcmVnaXN0ZXJzICpyZWdzOworCWJvb2wgc2NhbGVfY2hhbmdlZCA9IGZhbHNlOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpib19wcml2ID0gbmV3X2JvLT5kcml2ZXJfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb3ZlcmxheS0+ZGV2OworCisJQlVHX09OKCFtdXRleF9pc19sb2NrZWQoJmRldi0+c3RydWN0X211dGV4KSk7CisJQlVHX09OKCFtdXRleF9pc19sb2NrZWQoJmRldi0+bW9kZV9jb25maWcubXV0ZXgpKTsKKwlCVUdfT04oIW92ZXJsYXkpOworCisJcmV0ID0gaW50ZWxfb3ZlcmxheV9yZWxlYXNlX29sZF92aWQob3ZlcmxheSk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihuZXdfYm8sIFBBR0VfU0laRSk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3NldF90b19ndHRfZG9tYWluKG5ld19ibywgMCk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIG91dF91bnBpbjsKKworCWlmICghb3ZlcmxheS0+YWN0aXZlKSB7CisJCXJlZ3MgPSBpbnRlbF9vdmVybGF5X21hcF9yZWdzX2F0b21pYyhvdmVybGF5KTsKKwkJaWYgKCFyZWdzKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXRfdW5waW47CisJCX0KKwkJcmVncy0+T0NPTkZJRyA9IE9DT05GX0NDX09VVF84QklUOworCQlpZiAoSVNfSTk2NUdNKG92ZXJsYXktPmRldikpCisJCQlyZWdzLT5PQ09ORklHIHw9IE9DT05GX0NTQ19NT0RFX0JUNzA5OworCQlyZWdzLT5PQ09ORklHIHw9IG92ZXJsYXktPmNydGMtPnBpcGUgPT0gMCA/CisJCQlPQ09ORl9QSVBFX0EgOiBPQ09ORl9QSVBFX0I7CisJCWludGVsX292ZXJsYXlfdW5tYXBfcmVnc19hdG9taWMob3ZlcmxheSk7CisKKwkJcmV0ID0gaW50ZWxfb3ZlcmxheV9vbihvdmVybGF5KTsKKwkJaWYgKHJldCAhPSAwKQorCQkJZ290byBvdXRfdW5waW47CisJfQorCisJcmVncyA9IGludGVsX292ZXJsYXlfbWFwX3JlZ3NfYXRvbWljKG92ZXJsYXkpOworCWlmICghcmVncykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF91bnBpbjsKKwl9CisKKwlyZWdzLT5EV0lOUE9TID0gKHBhcmFtcy0+ZHN0X3kgPDwgMTYpIHwgcGFyYW1zLT5kc3RfeDsKKwlyZWdzLT5EV0lOU1ogPSAocGFyYW1zLT5kc3RfaCA8PCAxNikgfCBwYXJhbXMtPmRzdF93OworCisJaWYgKHBhcmFtcy0+Zm9ybWF0ICYgSTkxNV9PVkVSTEFZX1lVVl9QQUNLRUQpCisJCXRtcF93aWR0aCA9IHBhY2tlZF93aWR0aF9ieXRlcyhwYXJhbXMtPmZvcm1hdCwgcGFyYW1zLT5zcmNfdyk7CisJZWxzZQorCQl0bXBfd2lkdGggPSBwYXJhbXMtPnNyY193OworCisJcmVncy0+U1dJRFRIID0gcGFyYW1zLT5zcmNfdzsKKwlyZWdzLT5TV0lEVEhTVyA9IGNhbGNfc3dpZHRoc3cob3ZlcmxheS0+ZGV2LAorCQkJcGFyYW1zLT5vZmZzZXRfWSwgdG1wX3dpZHRoKTsKKwlyZWdzLT5TSEVJR0hUID0gcGFyYW1zLT5zcmNfaDsKKwlyZWdzLT5PQlVGXzBZID0gYm9fcHJpdi0+Z3R0X29mZnNldCArIHBhcmFtcy0+IG9mZnNldF9ZOworCXJlZ3MtPk9TVFJJREUgPSBwYXJhbXMtPnN0cmlkZV9ZOworCisJaWYgKHBhcmFtcy0+Zm9ybWF0ICYgSTkxNV9PVkVSTEFZX1lVVl9QTEFOQVIpIHsKKwkJaW50IHV2X2hzY2FsZSA9IHV2X2hzdWJzYW1wbGluZyhwYXJhbXMtPmZvcm1hdCk7CisJCWludCB1dl92c2NhbGUgPSB1dl92c3Vic2FtcGxpbmcocGFyYW1zLT5mb3JtYXQpOworCQl1MzIgdG1wX1UsIHRtcF9WOworCQlyZWdzLT5TV0lEVEggfD0gKHBhcmFtcy0+c3JjX3cvdXZfaHNjYWxlKSA8PCAxNjsKKwkJdG1wX1UgPSBjYWxjX3N3aWR0aHN3KG92ZXJsYXktPmRldiwgcGFyYW1zLT5vZmZzZXRfVSwKKwkJCQlwYXJhbXMtPnNyY193L3V2X2hzY2FsZSk7CisJCXRtcF9WID0gY2FsY19zd2lkdGhzdyhvdmVybGF5LT5kZXYsIHBhcmFtcy0+b2Zmc2V0X1YsCisJCQkJcGFyYW1zLT5zcmNfdy91dl9oc2NhbGUpOworCQlyZWdzLT5TV0lEVEhTVyB8PSBtYXhfdCh1MzIsIHRtcF9VLCB0bXBfVikgPDwgMTY7CisJCXJlZ3MtPlNIRUlHSFQgfD0gKHBhcmFtcy0+c3JjX2gvdXZfdnNjYWxlKSA8PCAxNjsKKwkJcmVncy0+T0JVRl8wVSA9IGJvX3ByaXYtPmd0dF9vZmZzZXQgKyBwYXJhbXMtPm9mZnNldF9VOworCQlyZWdzLT5PQlVGXzBWID0gYm9fcHJpdi0+Z3R0X29mZnNldCArIHBhcmFtcy0+b2Zmc2V0X1Y7CisJCXJlZ3MtPk9TVFJJREUgfD0gcGFyYW1zLT5zdHJpZGVfVVYgPDwgMTY7CisJfQorCisJc2NhbGVfY2hhbmdlZCA9IHVwZGF0ZV9zY2FsaW5nX2ZhY3RvcnMob3ZlcmxheSwgcmVncywgcGFyYW1zKTsKKworCXVwZGF0ZV9jb2xvcmtleShvdmVybGF5LCByZWdzKTsKKworCXJlZ3MtPk9DTUQgPSBvdmVybGF5X2NtZF9yZWcocGFyYW1zKTsKKworCWludGVsX292ZXJsYXlfdW5tYXBfcmVnc19hdG9taWMob3ZlcmxheSk7CisKKwlpbnRlbF9vdmVybGF5X2NvbnRpbnVlKG92ZXJsYXksIHNjYWxlX2NoYW5nZWQpOworCisJb3ZlcmxheS0+b2xkX3ZpZF9ibyA9IG92ZXJsYXktPnZpZF9ibzsKKwlvdmVybGF5LT52aWRfYm8gPSBuZXdfYm8tPmRyaXZlcl9wcml2YXRlOworCisJcmV0dXJuIDA7CisKK291dF91bnBpbjoKKwlpOTE1X2dlbV9vYmplY3RfdW5waW4obmV3X2JvKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaW50ZWxfb3ZlcmxheV9zd2l0Y2hfb2ZmKHN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5KQoreworCWludCByZXQ7CisJc3RydWN0IG92ZXJsYXlfcmVnaXN0ZXJzICpyZWdzOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvdmVybGF5LT5kZXY7CisKKwlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmZGV2LT5zdHJ1Y3RfbXV0ZXgpKTsKKwlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCkpOworCisJaWYgKG92ZXJsYXktPmh3X3dlZGdlZCkgeworCQlyZXQgPSBpbnRlbF9vdmVybGF5X3JlY292ZXJfZnJvbV9pbnRlcnJ1cHQob3ZlcmxheSwgMSk7CisJCWlmIChyZXQgIT0gMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFvdmVybGF5LT5hY3RpdmUpCisJCXJldHVybiAwOworCisJcmV0ID0gaW50ZWxfb3ZlcmxheV9yZWxlYXNlX29sZF92aWQob3ZlcmxheSk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJcmVncyA9IGludGVsX292ZXJsYXlfbWFwX3JlZ3NfYXRvbWljKG92ZXJsYXkpOworCXJlZ3MtPk9DTUQgPSAwOworCWludGVsX292ZXJsYXlfdW5tYXBfcmVnc19hdG9taWMob3ZlcmxheSk7CisKKwlyZXQgPSBpbnRlbF9vdmVybGF5X29mZihvdmVybGF5KTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlpbnRlbF9vdmVybGF5X29mZl90YWlsKG92ZXJsYXkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfb3ZlcmxheV9wb3NzaWJsZV9vbl9jcnRjKHN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5LAorCQkJCQkgIHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjKQoreworICAgICAgICBkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gb3ZlcmxheS0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgcGlwZWNvbmY7CisJaW50IHBpcGVjb25mX3JlZyA9IChjcnRjLT5waXBlID09IDApID8gUElQRUFDT05GIDogUElQRUJDT05GOworCisJaWYgKCFjcnRjLT5iYXNlLmVuYWJsZWQgfHwgY3J0Yy0+ZHBtc19tb2RlICE9IERSTV9NT0RFX0RQTVNfT04pCisJCXJldHVybiAtRUlOVkFMOworCisJcGlwZWNvbmYgPSBJOTE1X1JFQUQocGlwZWNvbmZfcmVnKTsKKworCS8qIGNhbid0IHVzZSB0aGUgb3ZlcmxheSB3aXRoIGRvdWJsZSB3aWRlIHBpcGUgKi8KKwlpZiAoIUlTX0k5NjVHKG92ZXJsYXktPmRldikgJiYgcGlwZWNvbmYgJiBQSVBFQUNPTkZfRE9VQkxFX1dJREUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9wZml0X3ZzY2FsZV9yYXRpbyhzdHJ1Y3QgaW50ZWxfb3ZlcmxheSAqb3ZlcmxheSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb3ZlcmxheS0+ZGV2OworICAgICAgICBkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgcmF0aW87CisJdTMyIHBmaXRfY29udHJvbCA9IEk5MTVfUkVBRChQRklUX0NPTlRST0wpOworCisJLyogWFhYOiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBsb2dpYyBhcyBpbiB0aGUgeG9yZyBkcml2ZXIsIGJ1dCBtb3JlIGluCisJICogbGluZSB3aXRoIHRoZSBpbnRlbCBkb2N1bWVudGF0aW9uIGZvciB0aGUgaTk2NSAqLworCWlmICghSVNfSTk2NUcoZGV2KSAmJiAocGZpdF9jb250cm9sICYgVkVSVF9BVVRPX1NDQUxFKSkgeworCQlyYXRpbyA9IEk5MTVfUkVBRChQRklUX0FVVE9fUkFUSU9TKSA+PiBQRklUX1ZFUlRfU0NBTEVfU0hJRlQ7CisJfSBlbHNlIHsgLyogb24gaTk2NSB1c2UgdGhlIFBHTSByZWcgdG8gcmVhZCBvdXQgdGhlIGF1dG9zY2FsZXIgdmFsdWVzICovCisJCXJhdGlvID0gSTkxNV9SRUFEKFBGSVRfUEdNX1JBVElPUyk7CisJCWlmIChJU19JOTY1RyhkZXYpKQorCQkJcmF0aW8gPj49IFBGSVRfVkVSVF9TQ0FMRV9TSElGVF85NjU7CisJCWVsc2UKKwkJCXJhdGlvID4+PSBQRklUX1ZFUlRfU0NBTEVfU0hJRlQ7CisJfQorCisJb3ZlcmxheS0+cGZpdF92c2NhbGVfcmF0aW8gPSByYXRpbzsKK30KKworc3RhdGljIGludCBjaGVja19vdmVybGF5X2RzdChzdHJ1Y3QgaW50ZWxfb3ZlcmxheSAqb3ZlcmxheSwKKwkJCSAgICAgc3RydWN0IGRybV9pbnRlbF9vdmVybGF5X3B1dF9pbWFnZSAqcmVjKQoreworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0gJm92ZXJsYXktPmNydGMtPmJhc2UubW9kZTsKKworCWlmICgocmVjLT5kc3RfeCA8IG1vZGUtPmNydGNfaGRpc3BsYXkpCisJICAgICYmIChyZWMtPmRzdF94ICsgcmVjLT5kc3Rfd2lkdGgKKwkJICAgIDw9IG1vZGUtPmNydGNfaGRpc3BsYXkpCisJICAgICYmIChyZWMtPmRzdF95IDwgbW9kZS0+Y3J0Y192ZGlzcGxheSkKKwkgICAgJiYgKHJlYy0+ZHN0X3kgKyByZWMtPmRzdF9oZWlnaHQKKwkJICAgIDw9IG1vZGUtPmNydGNfdmRpc3BsYXkpKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGNoZWNrX292ZXJsYXlfc2NhbGluZyhzdHJ1Y3QgcHV0X2ltYWdlX3BhcmFtcyAqcmVjKQoreworCXUzMiB0bXA7CisKKwkvKiBkb3duc2NhbGluZyBsaW1pdCBpcyA4LjAgKi8KKwl0bXAgPSAoKHJlYy0+c3JjX3NjYW5faCA8PCAxNikgLyByZWMtPmRzdF9oKSA+PiAxNjsKKwlpZiAodG1wID4gNykKKwkJcmV0dXJuIC1FSU5WQUw7CisJdG1wID0gKChyZWMtPnNyY19zY2FuX3cgPDwgMTYpIC8gcmVjLT5kc3RfdykgPj4gMTY7CisJaWYgKHRtcCA+IDcpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfb3ZlcmxheV9zcmMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGRybV9pbnRlbF9vdmVybGF5X3B1dF9pbWFnZSAqcmVjLAorCQkJICAgICBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm5ld19ibykKK3sKKwl1MzIgc3RyaWRlX21hc2s7CisJaW50IGRlcHRoOworCWludCB1dl9oc2NhbGUgPSB1dl9oc3Vic2FtcGxpbmcocmVjLT5mbGFncyk7CisJaW50IHV2X3ZzY2FsZSA9IHV2X3ZzdWJzYW1wbGluZyhyZWMtPmZsYWdzKTsKKwlzaXplX3QgdG1wOworCisJLyogY2hlY2sgc3JjIGRpbWVuc2lvbnMgKi8KKwlpZiAoSVNfODQ1RyhkZXYpIHx8IElTX0k4MzAoZGV2KSkgeworCQlpZiAocmVjLT5zcmNfaGVpZ2h0ID4gSU1BR0VfTUFYX0hFSUdIVF9MRUdBQ1kKKwkJICAgIHx8IHJlYy0+c3JjX3dpZHRoID4gSU1BR0VfTUFYX1dJRFRIX0xFR0FDWSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCWlmIChyZWMtPnNyY19oZWlnaHQgPiBJTUFHRV9NQVhfSEVJR0hUCisJCSAgICB8fCByZWMtPnNyY193aWR0aCA+IElNQUdFX01BWF9XSURUSCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5LCB1c2UgNCBhcyB0aGUgbWF4aW1hbCBzdWJzYW1wbGluZyByYXRpbyAqLworCWlmIChyZWMtPnNyY19oZWlnaHQgPCBOX1ZFUlRfWV9UQVBTKjQKKwkgICAgfHwgcmVjLT5zcmNfd2lkdGggPCBOX0hPUklaX1lfVEFQUyo0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGNoZWNrIGFsaW5nbWVudCBjb25zdHJhaW5zICovCisJc3dpdGNoIChyZWMtPmZsYWdzICYgSTkxNV9PVkVSTEFZX1RZUEVfTUFTSykgeworCQljYXNlIEk5MTVfT1ZFUkxBWV9SR0I6CisJCQkvKiBub3QgaW1wbGVtZW50ZWQgKi8KKwkJCXJldHVybiAtRUlOVkFMOworCQljYXNlIEk5MTVfT1ZFUkxBWV9ZVVZfUEFDS0VEOgorCQkJZGVwdGggPSBwYWNrZWRfZGVwdGhfYnl0ZXMocmVjLT5mbGFncyk7CisJCQlpZiAodXZfdnNjYWxlICE9IDEpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoZGVwdGggPCAwKQorCQkJCXJldHVybiBkZXB0aDsKKwkJCS8qIGlnbm9yZSBVViBwbGFuZXMgKi8KKwkJCXJlYy0+c3RyaWRlX1VWID0gMDsKKwkJCXJlYy0+b2Zmc2V0X1UgPSAwOworCQkJcmVjLT5vZmZzZXRfViA9IDA7CisJCQkvKiBjaGVjayBwaXhlbCBhbGlnbm1lbnQgKi8KKwkJCWlmIChyZWMtPm9mZnNldF9ZICUgZGVwdGgpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJY2FzZSBJOTE1X09WRVJMQVlfWVVWX1BMQU5BUjoKKwkJCWlmICh1dl92c2NhbGUgPCAwIHx8IHV2X2hzY2FsZSA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkvKiBubyBvZmZzZXQgcmVzdHJpY3Rpb25zIGZvciBwbGFuYXIgZm9ybWF0cyAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocmVjLT5zcmNfd2lkdGggJSB1dl9oc2NhbGUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogc3RyaWRlIGNoZWNraW5nICovCisJc3RyaWRlX21hc2sgPSA2MzsKKworCWlmIChyZWMtPnN0cmlkZV9ZICYgc3RyaWRlX21hc2sgfHwgcmVjLT5zdHJpZGVfVVYgJiBzdHJpZGVfbWFzaykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKElTX0k5NjVHKGRldikgJiYgcmVjLT5zdHJpZGVfWSA8IDUxMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0bXAgPSAocmVjLT5mbGFncyAmIEk5MTVfT1ZFUkxBWV9UWVBFX01BU0spID09IEk5MTVfT1ZFUkxBWV9ZVVZfUExBTkFSID8KKwkJNCA6IDg7CisJaWYgKHJlYy0+c3RyaWRlX1kgPiB0bXAqMTAyNCB8fCByZWMtPnN0cmlkZV9VViA+IDIqMTAyNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBjaGVjayBidWZmZXIgZGltZW5zaW9ucyAqLworCXN3aXRjaCAocmVjLT5mbGFncyAmIEk5MTVfT1ZFUkxBWV9UWVBFX01BU0spIHsKKwkJY2FzZSBJOTE1X09WRVJMQVlfUkdCOgorCQljYXNlIEk5MTVfT1ZFUkxBWV9ZVVZfUEFDS0VEOgorCQkJLyogYWx3YXlzIDQgWSB2YWx1ZXMgcGVyIGRlcHRoIHBpeGVscyAqLworCQkJaWYgKHBhY2tlZF93aWR0aF9ieXRlcyhyZWMtPmZsYWdzLCByZWMtPnNyY193aWR0aCkKKwkJCQkJPiByZWMtPnN0cmlkZV9ZKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQl0bXAgPSByZWMtPnN0cmlkZV9ZKnJlYy0+c3JjX2hlaWdodDsKKwkJCWlmIChyZWMtPm9mZnNldF9ZICsgdG1wID4gbmV3X2JvLT5zaXplKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgSTkxNV9PVkVSTEFZX1lVVl9QTEFOQVI6CisJCQlpZiAocmVjLT5zcmNfd2lkdGggPiByZWMtPnN0cmlkZV9ZKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKHJlYy0+c3JjX3dpZHRoL3V2X2hzY2FsZSA+IHJlYy0+c3RyaWRlX1VWKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQl0bXAgPSByZWMtPnN0cmlkZV9ZKnJlYy0+c3JjX2hlaWdodDsKKwkJCWlmIChyZWMtPm9mZnNldF9ZICsgdG1wID4gbmV3X2JvLT5zaXplKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJdG1wID0gcmVjLT5zdHJpZGVfVVYqcmVjLT5zcmNfaGVpZ2h0OworCQkJdG1wIC89IHV2X3ZzY2FsZTsKKwkJCWlmIChyZWMtPm9mZnNldF9VICsgdG1wID4gbmV3X2JvLT5zaXplCisJCQkgICAgfHwgcmVjLT5vZmZzZXRfViArIHRtcCA+IG5ld19iby0+c2l6ZSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgaW50ZWxfb3ZlcmxheV9wdXRfaW1hZ2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX2ludGVsX292ZXJsYXlfcHV0X2ltYWdlICpwdXRfaW1hZ2VfcmVjID0gZGF0YTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfb3ZlcmxheSAqb3ZlcmxheTsKKwlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpkcm1tb2RlX29iajsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YzsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm5ld19ibzsKKwlzdHJ1Y3QgcHV0X2ltYWdlX3BhcmFtcyAqcGFyYW1zOworCWludCByZXQ7CisKKwlpZiAoIWRldl9wcml2KSB7CisJCURSTV9FUlJPUigiY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlvdmVybGF5ID0gZGV2X3ByaXYtPm92ZXJsYXk7CisJaWYgKCFvdmVybGF5KSB7CisJCURSTV9ERUJVRygidXNlcnNwYWNlIGJ1Zzogbm8gb3ZlcmxheVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghKHB1dF9pbWFnZV9yZWMtPmZsYWdzICYgSTkxNV9PVkVSTEFZX0VOQUJMRSkpIHsKKwkJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCQlyZXQgPSBpbnRlbF9vdmVybGF5X3N3aXRjaF9vZmYob3ZlcmxheSk7CisKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwYXJhbXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHV0X2ltYWdlX3BhcmFtcyksIEdGUF9LRVJORUwpOworCWlmICghcGFyYW1zKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRybW1vZGVfb2JqID0gZHJtX21vZGVfb2JqZWN0X2ZpbmQoZGV2LCBwdXRfaW1hZ2VfcmVjLT5jcnRjX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgRFJNX01PREVfT0JKRUNUX0NSVEMpOworCWlmICghZHJtbW9kZV9vYmopCisJCXJldHVybiAtRU5PRU5UOworCWNydGMgPSB0b19pbnRlbF9jcnRjKG9ial90b19jcnRjKGRybW1vZGVfb2JqKSk7CisKKwluZXdfYm8gPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsCisJCQlwdXRfaW1hZ2VfcmVjLT5ib19oYW5kbGUpOworCWlmICghbmV3X2JvKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCWlmIChvdmVybGF5LT5od193ZWRnZWQpIHsKKwkJcmV0ID0gaW50ZWxfb3ZlcmxheV9yZWNvdmVyX2Zyb21faW50ZXJydXB0KG92ZXJsYXksIDEpOworCQlpZiAocmV0ICE9IDApCisJCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaWYgKG92ZXJsYXktPmNydGMgIT0gY3J0YykgeworCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9ICZjcnRjLT5iYXNlLm1vZGU7CisJCXJldCA9IGludGVsX292ZXJsYXlfc3dpdGNoX29mZihvdmVybGF5KTsKKwkJaWYgKHJldCAhPSAwKQorCQkJZ290byBvdXRfdW5sb2NrOworCisJCXJldCA9IGNoZWNrX292ZXJsYXlfcG9zc2libGVfb25fY3J0YyhvdmVybGF5LCBjcnRjKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJZ290byBvdXRfdW5sb2NrOworCisJCW92ZXJsYXktPmNydGMgPSBjcnRjOworCQljcnRjLT5vdmVybGF5ID0gb3ZlcmxheTsKKworCQlpZiAoaW50ZWxfcGFuZWxfZml0dGVyX3BpcGUoZGV2KSA9PSBjcnRjLT5waXBlCisJCSAgICAvKiBhbmQgbGluZSB0byB3aWRlLCBpLmUuIG9uZS1saW5lLW1vZGUgKi8KKwkJICAgICYmIG1vZGUtPmhkaXNwbGF5ID4gMTAyNCkgeworCQkJb3ZlcmxheS0+cGZpdF9hY3RpdmUgPSAxOworCQkJdXBkYXRlX3BmaXRfdnNjYWxlX3JhdGlvKG92ZXJsYXkpOworCQl9IGVsc2UKKwkJCW92ZXJsYXktPnBmaXRfYWN0aXZlID0gMDsKKwl9CisKKwlyZXQgPSBjaGVja19vdmVybGF5X2RzdChvdmVybGF5LCBwdXRfaW1hZ2VfcmVjKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gb3V0X3VubG9jazsKKworCWlmIChvdmVybGF5LT5wZml0X2FjdGl2ZSkgeworCQlwYXJhbXMtPmRzdF95ID0gKCgoKHUzMilwdXRfaW1hZ2VfcmVjLT5kc3RfeSkgPDwgMTIpIC8KKwkJCW92ZXJsYXktPnBmaXRfdnNjYWxlX3JhdGlvKTsKKwkJLyogc2hpZnRpbmcgcmlnaHQgcm91bmRzIGRvd253YXJkcywgc28gYWRkIDEgKi8KKwkJcGFyYW1zLT5kc3RfaCA9ICgoKCh1MzIpcHV0X2ltYWdlX3JlYy0+ZHN0X2hlaWdodCkgPDwgMTIpIC8KKwkJCW92ZXJsYXktPnBmaXRfdnNjYWxlX3JhdGlvKSArIDE7CisJfSBlbHNlIHsKKwkJcGFyYW1zLT5kc3RfeSA9IHB1dF9pbWFnZV9yZWMtPmRzdF95OworCQlwYXJhbXMtPmRzdF9oID0gcHV0X2ltYWdlX3JlYy0+ZHN0X2hlaWdodDsKKwl9CisJcGFyYW1zLT5kc3RfeCA9IHB1dF9pbWFnZV9yZWMtPmRzdF94OworCXBhcmFtcy0+ZHN0X3cgPSBwdXRfaW1hZ2VfcmVjLT5kc3Rfd2lkdGg7CisKKwlwYXJhbXMtPnNyY193ID0gcHV0X2ltYWdlX3JlYy0+c3JjX3dpZHRoOworCXBhcmFtcy0+c3JjX2ggPSBwdXRfaW1hZ2VfcmVjLT5zcmNfaGVpZ2h0OworCXBhcmFtcy0+c3JjX3NjYW5fdyA9IHB1dF9pbWFnZV9yZWMtPnNyY19zY2FuX3dpZHRoOworCXBhcmFtcy0+c3JjX3NjYW5faCA9IHB1dF9pbWFnZV9yZWMtPnNyY19zY2FuX2hlaWdodDsKKwlpZiAocGFyYW1zLT5zcmNfc2Nhbl9oID4gcGFyYW1zLT5zcmNfaAorCSAgICB8fCBwYXJhbXMtPnNyY19zY2FuX3cgPiBwYXJhbXMtPnNyY193KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlyZXQgPSBjaGVja19vdmVybGF5X3NyYyhkZXYsIHB1dF9pbWFnZV9yZWMsIG5ld19ibyk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIG91dF91bmxvY2s7CisJcGFyYW1zLT5mb3JtYXQgPSBwdXRfaW1hZ2VfcmVjLT5mbGFncyAmIH5JOTE1X09WRVJMQVlfRkxBR1NfTUFTSzsKKwlwYXJhbXMtPnN0cmlkZV9ZID0gcHV0X2ltYWdlX3JlYy0+c3RyaWRlX1k7CisJcGFyYW1zLT5zdHJpZGVfVVYgPSBwdXRfaW1hZ2VfcmVjLT5zdHJpZGVfVVY7CisJcGFyYW1zLT5vZmZzZXRfWSA9IHB1dF9pbWFnZV9yZWMtPm9mZnNldF9ZOworCXBhcmFtcy0+b2Zmc2V0X1UgPSBwdXRfaW1hZ2VfcmVjLT5vZmZzZXRfVTsKKwlwYXJhbXMtPm9mZnNldF9WID0gcHV0X2ltYWdlX3JlYy0+b2Zmc2V0X1Y7CisKKwkvKiBDaGVjayBzY2FsaW5nIGFmdGVyIHNyYyBzaXplIHRvIHByZXZlbnQgYSBkaXZpZGUtYnktemVyby4gKi8KKwlyZXQgPSBjaGVja19vdmVybGF5X3NjYWxpbmcocGFyYW1zKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gb3V0X3VubG9jazsKKworCXJldCA9IGludGVsX292ZXJsYXlfZG9fcHV0X2ltYWdlKG92ZXJsYXksIG5ld19ibywgcGFyYW1zKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gb3V0X3VubG9jazsKKworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisKKwlrZnJlZShwYXJhbXMpOworCisJcmV0dXJuIDA7CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShuZXdfYm8pOworCWtmcmVlKHBhcmFtcyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfcmVnX2F0dHJzKHN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5LAorCQkJICAgICBzdHJ1Y3Qgb3ZlcmxheV9yZWdpc3RlcnMgKnJlZ3MpCit7CisJcmVncy0+T0NMUkMwID0gKG92ZXJsYXktPmNvbnRyYXN0IDw8IDE4KSB8IChvdmVybGF5LT5icmlnaHRuZXNzICYgMHhmZik7CisJcmVncy0+T0NMUkMxID0gb3ZlcmxheS0+c2F0dXJhdGlvbjsKK30KKworc3RhdGljIGJvb2wgY2hlY2tfZ2FtbWFfYm91bmRzKHUzMiBnYW1tYTEsIHUzMiBnYW1tYTIpCit7CisJaW50IGk7CisKKwlpZiAoZ2FtbWExICYgMHhmZjAwMDAwMCB8fCBnYW1tYTIgJiAweGZmMDAwMDAwKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWlmICgoKGdhbW1hMSA+PiBpICogOCkgJiAweGZmKSA+PSAoKGdhbW1hMiA+PiBpKjgpICYgMHhmZikpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrX2dhbW1hNV9lcnJhdGEodTMyIGdhbW1hNSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJaWYgKCgoZ2FtbWE1ID4+IGkqOCkgJiAweGZmKSA9PSAweDgwKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IGNoZWNrX2dhbW1hKHN0cnVjdCBkcm1faW50ZWxfb3ZlcmxheV9hdHRycyAqYXR0cnMpCit7CisJaWYgKCFjaGVja19nYW1tYV9ib3VuZHMoMCwgYXR0cnMtPmdhbW1hMCkKKwkgICAgfHwgIWNoZWNrX2dhbW1hX2JvdW5kcyhhdHRycy0+Z2FtbWEwLCBhdHRycy0+Z2FtbWExKQorCSAgICB8fCAhY2hlY2tfZ2FtbWFfYm91bmRzKGF0dHJzLT5nYW1tYTEsIGF0dHJzLT5nYW1tYTIpCisJICAgIHx8ICFjaGVja19nYW1tYV9ib3VuZHMoYXR0cnMtPmdhbW1hMiwgYXR0cnMtPmdhbW1hMykKKwkgICAgfHwgIWNoZWNrX2dhbW1hX2JvdW5kcyhhdHRycy0+Z2FtbWEzLCBhdHRycy0+Z2FtbWE0KQorCSAgICB8fCAhY2hlY2tfZ2FtbWFfYm91bmRzKGF0dHJzLT5nYW1tYTQsIGF0dHJzLT5nYW1tYTUpCisJICAgIHx8ICFjaGVja19nYW1tYV9ib3VuZHMoYXR0cnMtPmdhbW1hNSwgMHgwMGZmZmZmZikpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghY2hlY2tfZ2FtbWE1X2VycmF0YShhdHRycy0+Z2FtbWE1KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK2ludCBpbnRlbF9vdmVybGF5X2F0dHJzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX2ludGVsX292ZXJsYXlfYXR0cnMgKmF0dHJzID0gZGF0YTsKKyAgICAgICAgZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX292ZXJsYXkgKm92ZXJsYXk7CisJc3RydWN0IG92ZXJsYXlfcmVnaXN0ZXJzICpyZWdzOworCWludCByZXQ7CisKKwlpZiAoIWRldl9wcml2KSB7CisJCURSTV9FUlJPUigiY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlvdmVybGF5ID0gZGV2X3ByaXYtPm92ZXJsYXk7CisJaWYgKCFvdmVybGF5KSB7CisJCURSTV9ERUJVRygidXNlcnNwYWNlIGJ1Zzogbm8gb3ZlcmxheVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCWlmICghKGF0dHJzLT5mbGFncyAmIEk5MTVfT1ZFUkxBWV9VUERBVEVfQVRUUlMpKSB7CisJCWF0dHJzLT5jb2xvcl9rZXkgPSBvdmVybGF5LT5jb2xvcl9rZXk7CisJCWF0dHJzLT5icmlnaHRuZXNzID0gb3ZlcmxheS0+YnJpZ2h0bmVzczsKKwkJYXR0cnMtPmNvbnRyYXN0ID0gb3ZlcmxheS0+Y29udHJhc3Q7CisJCWF0dHJzLT5zYXR1cmF0aW9uID0gb3ZlcmxheS0+c2F0dXJhdGlvbjsKKworCQlpZiAoSVNfSTlYWChkZXYpKSB7CisJCQlhdHRycy0+Z2FtbWEwID0gSTkxNV9SRUFEKE9HQU1DMCk7CisJCQlhdHRycy0+Z2FtbWExID0gSTkxNV9SRUFEKE9HQU1DMSk7CisJCQlhdHRycy0+Z2FtbWEyID0gSTkxNV9SRUFEKE9HQU1DMik7CisJCQlhdHRycy0+Z2FtbWEzID0gSTkxNV9SRUFEKE9HQU1DMyk7CisJCQlhdHRycy0+Z2FtbWE0ID0gSTkxNV9SRUFEKE9HQU1DNCk7CisJCQlhdHRycy0+Z2FtbWE1ID0gSTkxNV9SRUFEKE9HQU1DNSk7CisJCX0KKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlvdmVybGF5LT5jb2xvcl9rZXkgPSBhdHRycy0+Y29sb3Jfa2V5OworCQlpZiAoYXR0cnMtPmJyaWdodG5lc3MgPj0gLTEyOCAmJiBhdHRycy0+YnJpZ2h0bmVzcyA8PSAxMjcpIHsKKwkJCW92ZXJsYXktPmJyaWdodG5lc3MgPSBhdHRycy0+YnJpZ2h0bmVzczsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwkJaWYgKGF0dHJzLT5jb250cmFzdCA8PSAyNTUpIHsKKwkJCW92ZXJsYXktPmNvbnRyYXN0ID0gYXR0cnMtPmNvbnRyYXN0OworCQl9IGVsc2UgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCQlpZiAoYXR0cnMtPnNhdHVyYXRpb24gPD0gMTAyMykgeworCQkJb3ZlcmxheS0+c2F0dXJhdGlvbiA9IGF0dHJzLT5zYXR1cmF0aW9uOworCQl9IGVsc2UgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCXJlZ3MgPSBpbnRlbF9vdmVybGF5X21hcF9yZWdzX2F0b21pYyhvdmVybGF5KTsKKwkJaWYgKCFyZWdzKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisKKwkJdXBkYXRlX3JlZ19hdHRycyhvdmVybGF5LCByZWdzKTsKKworCQlpbnRlbF9vdmVybGF5X3VubWFwX3JlZ3NfYXRvbWljKG92ZXJsYXkpOworCisJCWlmIChhdHRycy0+ZmxhZ3MgJiBJOTE1X09WRVJMQVlfVVBEQVRFX0dBTU1BKSB7CisJCQlpZiAoIUlTX0k5WFgoZGV2KSkgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJZ290byBvdXRfdW5sb2NrOworCQkJfQorCisJCQlpZiAob3ZlcmxheS0+YWN0aXZlKSB7CisJCQkJcmV0ID0gLUVCVVNZOworCQkJCWdvdG8gb3V0X3VubG9jazsKKwkJCX0KKworCQkJcmV0ID0gY2hlY2tfZ2FtbWEoYXR0cnMpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCWdvdG8gb3V0X3VubG9jazsKKworCQkJSTkxNV9XUklURShPR0FNQzAsIGF0dHJzLT5nYW1tYTApOworCQkJSTkxNV9XUklURShPR0FNQzEsIGF0dHJzLT5nYW1tYTEpOworCQkJSTkxNV9XUklURShPR0FNQzIsIGF0dHJzLT5nYW1tYTIpOworCQkJSTkxNV9XUklURShPR0FNQzMsIGF0dHJzLT5nYW1tYTMpOworCQkJSTkxNV9XUklURShPR0FNQzQsIGF0dHJzLT5nYW1tYTQpOworCQkJSTkxNV9XUklURShPR0FNQzUsIGF0dHJzLT5nYW1tYTUpOworCQl9CisJCXJldCA9IDA7CisJfQorCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGludGVsX3NldHVwX292ZXJsYXkoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX292ZXJsYXkgKm92ZXJsYXk7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpyZWdfYm87CisJc3RydWN0IG92ZXJsYXlfcmVnaXN0ZXJzICpyZWdzOworCWludCByZXQ7CisKKwlpZiAoIU9WRVJMQVlfRVhJU1RTKGRldikpCisJCXJldHVybjsKKworCW92ZXJsYXkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW50ZWxfb3ZlcmxheSksIEdGUF9LRVJORUwpOworCWlmICghb3ZlcmxheSkKKwkJcmV0dXJuOworCW92ZXJsYXktPmRldiA9IGRldjsKKworCXJlZ19ibyA9IGRybV9nZW1fb2JqZWN0X2FsbG9jKGRldiwgUEFHRV9TSVpFKTsKKwlpZiAoIXJlZ19ibykKKwkJZ290byBvdXRfZnJlZTsKKwlvdmVybGF5LT5yZWdfYm8gPSByZWdfYm8tPmRyaXZlcl9wcml2YXRlOworCisJaWYgKE9WRVJMQVlfTk9OUEhZU0lDQUwoZGV2KSkgeworCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKHJlZ19ibywgUEFHRV9TSVpFKTsKKwkJaWYgKHJldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgRFJNX0VSUk9SKCJmYWlsZWQgdG8gcGluIG92ZXJsYXkgcmVnaXN0ZXIgYm9cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXRfZnJlZV9ibzsKKyAgICAgICAgICAgICAgICB9CisJCW92ZXJsYXktPmZsaXBfYWRkciA9IG92ZXJsYXktPnJlZ19iby0+Z3R0X29mZnNldDsKKwl9IGVsc2UgeworCQlyZXQgPSBpOTE1X2dlbV9hdHRhY2hfcGh5c19vYmplY3QoZGV2LCByZWdfYm8sCisJCQkJSTkxNV9HRU1fUEhZU19PVkVSTEFZX1JFR1MpOworICAgICAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERSTV9FUlJPUigiZmFpbGVkIHRvIGF0dGFjaCBwaHlzIG92ZXJsYXkgcmVnc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dF9mcmVlX2JvOworICAgICAgICAgICAgICAgIH0KKwkJb3ZlcmxheS0+ZmxpcF9hZGRyID0gb3ZlcmxheS0+cmVnX2JvLT5waHlzX29iai0+aGFuZGxlLT5idXNhZGRyOworCX0KKworCS8qIGluaXQgYWxsIHZhbHVlcyAqLworCW92ZXJsYXktPmNvbG9yX2tleSA9IDB4MDEwMWZlOworCW92ZXJsYXktPmJyaWdodG5lc3MgPSAtMTk7CisJb3ZlcmxheS0+Y29udHJhc3QgPSA3NTsKKwlvdmVybGF5LT5zYXR1cmF0aW9uID0gMTQ2OworCisJcmVncyA9IGludGVsX292ZXJsYXlfbWFwX3JlZ3NfYXRvbWljKG92ZXJsYXkpOworCWlmICghcmVncykKKwkJZ290byBvdXRfZnJlZV9ibzsKKworCW1lbXNldChyZWdzLCAwLCBzaXplb2Yoc3RydWN0IG92ZXJsYXlfcmVnaXN0ZXJzKSk7CisJdXBkYXRlX3BvbHlwaGFzZV9maWx0ZXIocmVncyk7CisKKwl1cGRhdGVfcmVnX2F0dHJzKG92ZXJsYXksIHJlZ3MpOworCisJaW50ZWxfb3ZlcmxheV91bm1hcF9yZWdzX2F0b21pYyhvdmVybGF5KTsKKworCWRldl9wcml2LT5vdmVybGF5ID0gb3ZlcmxheTsKKwlEUk1fSU5GTygiaW5pdGlhbGl6ZWQgb3ZlcmxheSBzdXBwb3J0XG4iKTsKKwlyZXR1cm47CisKK291dF9mcmVlX2JvOgorCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKHJlZ19ibyk7CitvdXRfZnJlZToKKwlrZnJlZShvdmVybGF5KTsKKwlyZXR1cm47Cit9CisKK3ZvaWQgaW50ZWxfY2xlYW51cF9vdmVybGF5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisgICAgICAgIGRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5vdmVybGF5KSB7CisJCS8qIFRoZSBibydzIHNob3VsZCBiZSBmcmVlJ2QgYnkgdGhlIGdlbmVyaWMgY29kZSBhbHJlYWR5LgorCQkgKiBGdXJ0aGVybW9yZSBtb2Rlc2V0dGluZyB0ZWFyZG93biBoYXBwZW5zIGJlZm9yZWhhbmQgc28gdGhlCisJCSAqIGhhcmR3YXJlIHNob3VsZCBiZSBvZmYgYWxyZWFkeSAqLworCQlCVUdfT04oZGV2X3ByaXYtPm92ZXJsYXktPmFjdGl2ZSk7CisKKwkJa2ZyZWUoZGV2X3ByaXYtPm92ZXJsYXkpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYwppbmRleCBlN2ZhMzI3Li4yNGEzZGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jCkBAIC0zNiw4ICszNiw2IEBACiAjaW5jbHVkZSAiaTkxNV9kcnYuaCIKICNpbmNsdWRlICJpbnRlbF9zZHZvX3JlZ3MuaCIKIAotI3VuZGVmIFNEVk9fREVCVUcKLQogc3RhdGljIGNoYXIgKnR2X2Zvcm1hdF9uYW1lc1tdID0gewogCSJOVFNDX00iICAgLCAiTlRTQ19KIiAgLCAiTlRTQ180NDMiLAogCSJQQUxfQiIgICAgLCAiUEFMX0QiICAgLCAiUEFMX0ciICAgLApAQCAtMzU2LDcgKzM1NCw2IEBACiAjZGVmaW5lIFNEVk9fTkFNRShkZXZfcHJpdikgKChkZXZfcHJpdiktPm91dHB1dF9kZXZpY2UgPT0gU0RWT0IgPyAiU0RWT0IiIDogIlNEVk9DIikKICNkZWZpbmUgU0RWT19QUklWKG91dHB1dCkgICAoKHN0cnVjdCBpbnRlbF9zZHZvX3ByaXYgKikgKG91dHB1dCktPmRldl9wcml2KQogCi0jaWZkZWYgU0RWT19ERUJVRwogc3RhdGljIHZvaWQgaW50ZWxfc2R2b19kZWJ1Z193cml0ZShzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQsIHU4IGNtZCwKIAkJCQkgICB2b2lkICphcmdzLCBpbnQgYXJnc19sZW4pCiB7CkBAIC0zNzksOSArMzc2LDYgQEAKIAkJRFJNX0xPR19LTVMoIiglMDJYKSIsIGNtZCk7CiAJRFJNX0xPR19LTVMoIlxuIik7CiB9Ci0jZWxzZQotI2RlZmluZSBpbnRlbF9zZHZvX2RlYnVnX3dyaXRlKG8sIGMsIGEsIGwpCi0jZW5kaWYKIAogc3RhdGljIHZvaWQgaW50ZWxfc2R2b193cml0ZV9jbWQoc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0LCB1OCBjbWQsCiAJCQkJIHZvaWQgKmFyZ3MsIGludCBhcmdzX2xlbikKQEAgLTM5OCw3ICszOTIsNiBAQAogCWludGVsX3Nkdm9fd3JpdGVfYnl0ZShpbnRlbF9vdXRwdXQsIFNEVk9fSTJDX09QQ09ERSwgY21kKTsKIH0KIAotI2lmZGVmIFNEVk9fREVCVUcKIHN0YXRpYyBjb25zdCBjaGFyICpjbWRfc3RhdHVzX25hbWVzW10gPSB7CiAJIlBvd2VyIG9uIiwKIAkiU3VjY2VzcyIsCkBAIC00MjcsOSArNDIwLDYgQEAKIAkJRFJNX0xPR19LTVMoIig/Pz8gJWQpIiwgc3RhdHVzKTsKIAlEUk1fTE9HX0tNUygiXG4iKTsKIH0KLSNlbHNlCi0jZGVmaW5lIGludGVsX3Nkdm9fZGVidWdfcmVzcG9uc2UobywgciwgbCwgcykKLSNlbmRpZgogCiBzdGF0aWMgdTggaW50ZWxfc2R2b19yZWFkX3Jlc3BvbnNlKHN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCwKIAkJCQkgICB2b2lkICpyZXNwb25zZSwgaW50IHJlc3BvbnNlX2xlbikKQEAgLTE2MjcsNiArMTYxNywxMCBAQAogCiAJaW50ZWxfc2R2b193cml0ZV9jbWQoaW50ZWxfb3V0cHV0LAogCQkJICAgICBTRFZPX0NNRF9HRVRfQVRUQUNIRURfRElTUExBWVMsIE5VTEwsIDApOworCWlmIChzZHZvX3ByaXYtPmlzX3R2KSB7CisJCS8qIGFkZCAzMG1zIGRlbGF5IHdoZW4gdGhlIG91dHB1dCB0eXBlIGlzIFNEVk8tVFYgKi8KKwkJbWRlbGF5KDMwKTsKKwl9CiAJc3RhdHVzID0gaW50ZWxfc2R2b19yZWFkX3Jlc3BvbnNlKGludGVsX291dHB1dCwgJnJlc3BvbnNlLCAyKTsKIAogCURSTV9ERUJVR19LTVMoIlNEVk8gcmVzcG9uc2UgJWQgJWRcbiIsIHJlc3BvbnNlICYgMHhmZiwgcmVzcG9uc2UgPj4gOCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF90di5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfdHYuYwppbmRleCA5Y2E5MTc5Li41NTJlYzExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF90di5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3R2LmMKQEAgLTEyMTMsMjAgKzEyMTMsMTcgQEAKIAkJdHZfY3RsIHw9IFRWX1RSSUxFVkVMX1NZTkM7CiAJaWYgKHR2X21vZGUtPnBhbF9idXJzdCkKIAkJdHZfY3RsIHw9IFRWX1BBTF9CVVJTVDsKLQlzY2N0bDEgPSAwOwotCS8qIGRkYTEgaW1wbGllcyB2YWxpZCB2aWRlbyBsZXZlbHMgKi8KLQlpZiAodHZfbW9kZS0+ZGRhMV9pbmMpIHsKLQkJc2NjdGwxIHw9IFRWX1NDX0REQTFfRU47Ci0JfQogCisJc2NjdGwxID0gMDsKKwlpZiAodHZfbW9kZS0+ZGRhMV9pbmMpCisJCXNjY3RsMSB8PSBUVl9TQ19EREExX0VOOwogCWlmICh0dl9tb2RlLT5kZGEyX2luYykKIAkJc2NjdGwxIHw9IFRWX1NDX0REQTJfRU47Ci0KIAlpZiAodHZfbW9kZS0+ZGRhM19pbmMpCiAJCXNjY3RsMSB8PSBUVl9TQ19EREEzX0VOOwotCiAJc2NjdGwxIHw9IHR2X21vZGUtPnNjX3Jlc2V0OwotCXNjY3RsMSB8PSB2aWRlb19sZXZlbHMtPmJ1cnN0IDw8IFRWX0JVUlNUX0xFVkVMX1NISUZUOworCWlmICh2aWRlb19sZXZlbHMpCisJCXNjY3RsMSB8PSB2aWRlb19sZXZlbHMtPmJ1cnN0IDw8IFRWX0JVUlNUX0xFVkVMX1NISUZUOwogCXNjY3RsMSB8PSB0dl9tb2RlLT5kZGExX2luYyA8PCBUVl9TQ0REQTFfSU5DX1NISUZUOwogCiAJc2NjdGwyID0gdHZfbW9kZS0+ZGRhMl9zaXplIDw8IFRWX1NDRERBMl9TSVpFX1NISUZUIHwKQEAgLTE0MTYsMTYgKzE0MTMsMTYgQEAKIAkgKiAgMCAwIDAgQ29tcG9uZW50CiAJICovCiAJaWYgKCh0dl9kYWMgJiBUVkRBQ19TRU5TRV9NQVNLKSA9PSAoVFZEQUNfQl9TRU5TRSB8IFRWREFDX0NfU0VOU0UpKSB7Ci0JCURSTV9ERUJVRygiRGV0ZWN0ZWQgQ29tcG9zaXRlIFRWIGNvbm5lY3Rpb25cbiIpOworCQlEUk1fREVCVUdfS01TKCJEZXRlY3RlZCBDb21wb3NpdGUgVFYgY29ubmVjdGlvblxuIik7CiAJCXR5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfQ29tcG9zaXRlOwogCX0gZWxzZSBpZiAoKHR2X2RhYyAmIChUVkRBQ19BX1NFTlNFfFRWREFDX0JfU0VOU0UpKSA9PSBUVkRBQ19BX1NFTlNFKSB7Ci0JCURSTV9ERUJVRygiRGV0ZWN0ZWQgUy1WaWRlbyBUViBjb25uZWN0aW9uXG4iKTsKKwkJRFJNX0RFQlVHX0tNUygiRGV0ZWN0ZWQgUy1WaWRlbyBUViBjb25uZWN0aW9uXG4iKTsKIAkJdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9TVklERU87CiAJfSBlbHNlIGlmICgodHZfZGFjICYgVFZEQUNfU0VOU0VfTUFTSykgPT0gMCkgewotCQlEUk1fREVCVUcoIkRldGVjdGVkIENvbXBvbmVudCBUViBjb25uZWN0aW9uXG4iKTsKKwkJRFJNX0RFQlVHX0tNUygiRGV0ZWN0ZWQgQ29tcG9uZW50IFRWIGNvbm5lY3Rpb25cbiIpOwogCQl0eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX0NvbXBvbmVudDsKIAl9IGVsc2UgewotCQlEUk1fREVCVUcoIk5vIFRWIGNvbm5lY3Rpb24gZGV0ZWN0ZWRcbiIpOworCQlEUk1fREVCVUdfS01TKCJObyBUViBjb25uZWN0aW9uIGRldGVjdGVkXG4iKTsKIAkJdHlwZSA9IC0xOwogCX0KIApAQCAtMTcwMiw2ICsxNjk5LDQxIEBACiAJLmRlc3Ryb3kgPSBpbnRlbF90dl9lbmNfZGVzdHJveSwKIH07CiAKKy8qCisgKiBFbnVtZXJhdGUgdGhlIGNoaWxkIGRldiBhcnJheSBwYXJzZWQgZnJvbSBWQlQgdG8gY2hlY2sgd2hldGhlcgorICogdGhlIGludGVncmF0ZWQgVFYgaXMgcHJlc2VudC4KKyAqIElmIGl0IGlzIHByZXNlbnQsIHJldHVybiAxLgorICogSWYgaXQgaXMgbm90IHByZXNlbnQsIHJldHVybiBmYWxzZS4KKyAqIElmIG5vIGNoaWxkIGRldiBpcyBwYXJzZWQgZnJvbSBWQlQsIGl0IGFzc3VtZXMgdGhhdCB0aGUgVFYgaXMgcHJlc2VudC4KKyAqLworc3RhdGljIGludCB0dl9pc19wcmVzZW50X2luX3ZidChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGNoaWxkX2RldmljZV9jb25maWcgKnBfY2hpbGQ7CisJaW50IGksIHJldDsKKworCWlmICghZGV2X3ByaXYtPmNoaWxkX2Rldl9udW0pCisJCXJldHVybiAxOworCisJcmV0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmNoaWxkX2Rldl9udW07IGkrKykgeworCQlwX2NoaWxkID0gZGV2X3ByaXYtPmNoaWxkX2RldiArIGk7CisJCS8qCisJCSAqIElmIHRoZSBkZXZpY2UgdHlwZSBpcyBub3QgVFYsIGNvbnRpbnVlLgorCQkgKi8KKwkJaWYgKHBfY2hpbGQtPmRldmljZV90eXBlICE9IERFVklDRV9UWVBFX0lOVF9UViAmJgorCQkJcF9jaGlsZC0+ZGV2aWNlX3R5cGUgIT0gREVWSUNFX1RZUEVfVFYpCisJCQljb250aW51ZTsKKwkJLyogT25seSB3aGVuIHRoZSBhZGRpbl9vZmZzZXQgaXMgbm9uLXplcm8sIGl0IGlzIHJlZ2FyZGVkCisJCSAqIGFzIHByZXNlbnQuCisJCSAqLworCQlpZiAocF9jaGlsZC0+YWRkaW5fb2Zmc2V0KSB7CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KIAogdm9pZAogaW50ZWxfdHZfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtMTcxNyw2ICsxNzQ5LDEwIEBACiAJaWYgKChJOTE1X1JFQUQoVFZfQ1RMKSAmIFRWX0ZVU0VfU1RBVEVfTUFTSykgPT0gVFZfRlVTRV9TVEFURV9ESVNBQkxFRCkKIAkJcmV0dXJuOwogCisJaWYgKCF0dl9pc19wcmVzZW50X2luX3ZidChkZXYpKSB7CisJCURSTV9ERUJVR19LTVMoIkludGVncmF0ZWQgVFYgaXMgbm90IHByZXNlbnQuXG4iKTsKKwkJcmV0dXJuOworCX0KIAkvKiBFdmVuIGlmIHdlIGhhdmUgYW4gZW5jb2RlciB3ZSBtYXkgbm90IGhhdmUgYSBjb25uZWN0b3IgKi8KIAlpZiAoIWRldl9wcml2LT5pbnRfdHZfc3VwcG9ydCkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgyM2U2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L0tjb25maWcKQEAgLTAsMCArMSw0NCBAQAorY29uZmlnIERSTV9OT1VWRUFVCisJdHJpc3RhdGUgIk5vdXZlYXUgKG5WaWRpYSkgY2FyZHMiCisJZGVwZW5kcyBvbiBEUk0KKyAgICAgICAgc2VsZWN0IEZXX0xPQURFUgorCXNlbGVjdCBEUk1fS01TX0hFTFBFUgorCXNlbGVjdCBEUk1fVFRNCisJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAorCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKKwlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAorCXNlbGVjdCBGQgorCXNlbGVjdCBGUkFNRUJVRkZFUl9DT05TT0xFIGlmICFFTUJFRERFRAorCXNlbGVjdCBGQl9CQUNLTElHSFQgaWYgRFJNX05PVVZFQVVfQkFDS0xJR0hUCisJaGVscAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGZvciBvcGVuLXNvdXJjZSBuVmlkaWEgc3VwcG9ydC4KKworY29uZmlnIERSTV9OT1VWRUFVX0JBQ0tMSUdIVAorCWJvb2wgIlN1cHBvcnQgZm9yIGJhY2tsaWdodCBjb250cm9sIgorCWRlcGVuZHMgb24gRFJNX05PVVZFQVUKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbnRyb2wgdGhlIGJhY2tsaWdodCBvZiB5b3VyIGRpc3BsYXkKKwkgIChlLmcuIGEgbGFwdG9wIHBhbmVsKS4KKworY29uZmlnIERSTV9OT1VWRUFVX0RFQlVHCisJYm9vbCAiQnVpbGQgaW4gTm91dmVhdSdzIGRlYnVnZnMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIERSTV9OT1VWRUFVICYmIERFQlVHX0ZTCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBOb3V2ZWF1IHRvIG91dHB1dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKwkgIHZpYSBkZWJ1Z2ZzLgorCittZW51ICJJMkMgZW5jb2RlciBvciBoZWxwZXIgY2hpcHMiCisgICAgIGRlcGVuZHMgb24gRFJNCisKK2NvbmZpZyBEUk1fSTJDX0NINzAwNgorCXRyaXN0YXRlICJDaHJvbnRlbCBjaDcwMDYgVFYgZW5jb2RlciIKKwlkZWZhdWx0IG0gaWYgRFJNX05PVVZFQVUKKwloZWxwCisJICBTdXBwb3J0IGZvciBDaHJvbnRlbCBjaDcwMDYgYW5kIHNpbWlsYXIgVFYgZW5jb2RlcnMsIGZvdW5kCisJICBvbiBzb21lIG5WaWRpYSB2aWRlbyBjYXJkcy4KKworCSAgVGhpcyBkcml2ZXIgaXMgY3VycmVudGx5IG9ubHkgdXNlZnVsIGlmIHlvdSdyZSBhbHNvIHVzaW5nCisJICB0aGUgbm91dmVhdSBkcml2ZXIuCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOTBkNGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9NYWtlZmlsZQpAQCAtMCwwICsxLDMxIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgZHJtIGRldmljZSBkcml2ZXIuICBUaGlzIGRyaXZlciBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUKKyMgRGlyZWN0IFJlbmRlcmluZyBJbmZyYXN0cnVjdHVyZSAoRFJJKSBpbiBYRnJlZTg2IDQuMS4wIGFuZCBoaWdoZXIuCisKK2NjZmxhZ3MteSA6PSAtSWluY2x1ZGUvZHJtCitub3V2ZWF1LXkgOj0gbm91dmVhdV9kcnYubyBub3V2ZWF1X3N0YXRlLm8gbm91dmVhdV9jaGFubmVsLm8gbm91dmVhdV9tZW0ubyBcCisgICAgICAgICAgICAgbm91dmVhdV9vYmplY3QubyBub3V2ZWF1X2lycS5vIG5vdXZlYXVfbm90aWZpZXIubyBcCisgICAgICAgICAgICAgbm91dmVhdV9zZ2RtYS5vIG5vdXZlYXVfZG1hLm8gXAorICAgICAgICAgICAgIG5vdXZlYXVfYm8ubyBub3V2ZWF1X2ZlbmNlLm8gbm91dmVhdV9nZW0ubyBub3V2ZWF1X3R0bS5vIFwKKyAgICAgICAgICAgICBub3V2ZWF1X2h3Lm8gbm91dmVhdV9jYWxjLm8gbm91dmVhdV9iaW9zLm8gbm91dmVhdV9pMmMubyBcCisJICAgICBub3V2ZWF1X2Rpc3BsYXkubyBub3V2ZWF1X2Nvbm5lY3Rvci5vIG5vdXZlYXVfZmJjb24ubyBcCisJICAgICBub3V2ZWF1X2RwLm8gXAorICAgICAgICAgICAgIG52MDRfdGltZXIubyBcCisgICAgICAgICAgICAgbnYwNF9tYy5vIG52NDBfbWMubyBudjUwX21jLm8gXAorICAgICAgICAgICAgIG52MDRfZmIubyBudjEwX2ZiLm8gbnY0MF9mYi5vIFwKKyAgICAgICAgICAgICBudjA0X2ZpZm8ubyBudjEwX2ZpZm8ubyBudjQwX2ZpZm8ubyBudjUwX2ZpZm8ubyBcCisgICAgICAgICAgICAgbnYwNF9ncmFwaC5vIG52MTBfZ3JhcGgubyBudjIwX2dyYXBoLm8gXAorICAgICAgICAgICAgIG52NDBfZ3JhcGgubyBudjUwX2dyYXBoLm8gXAorICAgICAgICAgICAgIG52MDRfaW5zdG1lbS5vIG52NTBfaW5zdG1lbS5vIFwKKyAgICAgICAgICAgICBudjUwX2NydGMubyBudjUwX2RhYy5vIG52NTBfc29yLm8gXAorICAgICAgICAgICAgIG52NTBfY3Vyc29yLm8gbnY1MF9kaXNwbGF5Lm8gbnY1MF9mYmNvbi5vIFwKKyAgICAgICAgICAgICBudjA0X2RhYy5vIG52MDRfZGZwLm8gbnYwNF90di5vIG52MTdfdHYubyBudjE3X3R2X21vZGVzLm8gXAorICAgICAgICAgICAgIG52MDRfY3J0Yy5vIG52MDRfZGlzcGxheS5vIG52MDRfY3Vyc29yLm8gbnYwNF9mYmNvbi5vIFwKKyAgICAgICAgICAgICBudjE3X2dwaW8ubworCitub3V2ZWF1LSQoQ09ORklHX0RSTV9OT1VWRUFVX0RFQlVHKSArPSBub3V2ZWF1X2RlYnVnZnMubworbm91dmVhdS0kKENPTkZJR19DT01QQVQpICs9IG5vdXZlYXVfaW9jMzIubworbm91dmVhdS0kKENPTkZJR19EUk1fTk9VVkVBVV9CQUNLTElHSFQpICs9IG5vdXZlYXVfYmFja2xpZ2h0Lm8KK25vdXZlYXUtJChDT05GSUdfQUNQSSkgKz0gbm91dmVhdV9hY3BpLm8KKworb2JqLSQoQ09ORklHX0RSTV9OT1VWRUFVKSs9IG5vdXZlYXUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9hY3BpLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2FjcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2Y0ODgyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9hY3BpLmMKQEAgLTAsMCArMSwxMjUgQEAKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiZHJtX3NhcmVhLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgorI2luY2x1ZGUgIm52NTBfZGlzcGxheS5oIgorCisjZGVmaW5lIE5PVVZFQVVfRFNNX1NVUFBPUlRFRCAweDAwCisjZGVmaW5lIE5PVVZFQVVfRFNNX1NVUFBPUlRFRF9GVU5DVElPTlMgMHgwMAorCisjZGVmaW5lIE5PVVZFQVVfRFNNX0FDVElWRSAweDAxCisjZGVmaW5lIE5PVVZFQVVfRFNNX0FDVElWRV9RVUVSWSAweDAwCisKKyNkZWZpbmUgTk9VVkVBVV9EU01fTEVEIDB4MDIKKyNkZWZpbmUgTk9VVkVBVV9EU01fTEVEX1NUQVRFIDB4MDAKKyNkZWZpbmUgTk9VVkVBVV9EU01fTEVEX09GRiAweDEwCisjZGVmaW5lIE5PVVZFQVVfRFNNX0xFRF9TVEFNSU5BIDB4MTEKKyNkZWZpbmUgTk9VVkVBVV9EU01fTEVEX1NQRUVEIDB4MTIKKworI2RlZmluZSBOT1VWRUFVX0RTTV9QT1dFUiAweDAzCisjZGVmaW5lIE5PVVZFQVVfRFNNX1BPV0VSX1NUQVRFIDB4MDAKKyNkZWZpbmUgTk9VVkVBVV9EU01fUE9XRVJfU1BFRUQgMHgwMQorI2RlZmluZSBOT1VWRUFVX0RTTV9QT1dFUl9TVEFNSU5BIDB4MDIKKworc3RhdGljIGludCBub3V2ZWF1X2RzbShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZnVuYywgaW50IGFyZywgaW50ICpyZXN1bHQpCit7CisJc3RhdGljIGNoYXIgbXVpZFtdID0geworCQkweEEwLCAweEEwLCAweDk1LCAweDlELCAweDYwLCAweDAwLCAweDQ4LCAweDRELAorCQkweEIzLCAweDRELCAweDdFLCAweDVGLCAweEVBLCAweDEyLCAweDlGLCAweEQ0LAorCX07CisKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cGRldjsKKwlzdHJ1Y3QgYWNwaV9oYW5kbGUgKmhhbmRsZTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0ID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGlucHV0OworCXVuaW9uIGFjcGlfb2JqZWN0IHBhcmFtc1s0XTsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCWludCBlcnI7CisKKwloYW5kbGUgPSBERVZJQ0VfQUNQSV9IQU5ETEUoJnBkZXYtPmRldik7CisKKwlpZiAoIWhhbmRsZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpbnB1dC5jb3VudCA9IDQ7CisJaW5wdXQucG9pbnRlciA9IHBhcmFtczsKKwlwYXJhbXNbMF0udHlwZSA9IEFDUElfVFlQRV9CVUZGRVI7CisJcGFyYW1zWzBdLmJ1ZmZlci5sZW5ndGggPSBzaXplb2YobXVpZCk7CisJcGFyYW1zWzBdLmJ1ZmZlci5wb2ludGVyID0gKGNoYXIgKiltdWlkOworCXBhcmFtc1sxXS50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7CisJcGFyYW1zWzFdLmludGVnZXIudmFsdWUgPSAweDAwMDAwMTAyOworCXBhcmFtc1syXS50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7CisJcGFyYW1zWzJdLmludGVnZXIudmFsdWUgPSBmdW5jOworCXBhcmFtc1szXS50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7CisJcGFyYW1zWzNdLmludGVnZXIudmFsdWUgPSBhcmc7CisKKwllcnIgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsICJfRFNNIiwgJmlucHV0LCAmb3V0cHV0KTsKKwlpZiAoZXJyKSB7CisJCU5WX0lORk8oZGV2LCAiZmFpbGVkIHRvIGV2YWx1YXRlIF9EU006ICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKW91dHB1dC5wb2ludGVyOworCisJaWYgKG9iai0+dHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUikKKwkJaWYgKG9iai0+aW50ZWdlci52YWx1ZSA9PSAweDgwMDAwMDAyKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAob2JqLT50eXBlID09IEFDUElfVFlQRV9CVUZGRVIpIHsKKwkJaWYgKG9iai0+YnVmZmVyLmxlbmd0aCA9PSA0ICYmIHJlc3VsdCkgeworCQkJKnJlc3VsdCA9IDA7CisJCQkqcmVzdWx0IHw9IG9iai0+YnVmZmVyLnBvaW50ZXJbMF07CisJCQkqcmVzdWx0IHw9IChvYmotPmJ1ZmZlci5wb2ludGVyWzFdIDw8IDgpOworCQkJKnJlc3VsdCB8PSAob2JqLT5idWZmZXIucG9pbnRlclsyXSA8PCAxNik7CisJCQkqcmVzdWx0IHw9IChvYmotPmJ1ZmZlci5wb2ludGVyWzNdIDw8IDI0KTsKKwkJfQorCX0KKworCWtmcmVlKG91dHB1dC5wb2ludGVyKTsKKwlyZXR1cm4gMDsKK30KKworaW50IG5vdXZlYXVfaHlicmlkX3NldHVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdDsKKworCWlmIChub3V2ZWF1X2RzbShkZXYsIE5PVVZFQVVfRFNNX0FDVElWRSwgTk9VVkVBVV9EU01fQUNUSVZFX1FVRVJZLAorCQkJCQkJCQkmcmVzdWx0KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlOVl9JTkZPKGRldiwgIl9EU00gaGFyZHdhcmUgc3RhdHVzIGdhdmUgMHgleFxuIiwgcmVzdWx0KTsKKworCWlmIChyZXN1bHQgJiAweDEpIHsJLyogU3RhbWluYSBtb2RlIC0gZGlzYWJsZSB0aGUgZXh0ZXJuYWwgR1BVICovCisJCW5vdXZlYXVfZHNtKGRldiwgTk9VVkVBVV9EU01fTEVELCBOT1VWRUFVX0RTTV9MRURfU1RBTUlOQSwKKwkJCQkJCQkJCU5VTEwpOworCQlub3V2ZWF1X2RzbShkZXYsIE5PVVZFQVVfRFNNX1BPV0VSLCBOT1VWRUFVX0RTTV9QT1dFUl9TVEFNSU5BLAorCQkJCQkJCQkJTlVMTCk7CisJfSBlbHNlIHsJCS8qIEVuc3VyZSB0aGF0IHRoZSBleHRlcm5hbCBHUFUgaXMgZW5hYmxlZCAqLworCQlub3V2ZWF1X2RzbShkZXYsIE5PVVZFQVVfRFNNX0xFRCwgTk9VVkVBVV9EU01fTEVEX1NQRUVELCBOVUxMKTsKKwkJbm91dmVhdV9kc20oZGV2LCBOT1VWRUFVX0RTTV9QT1dFUiwgTk9VVkVBVV9EU01fUE9XRVJfU1BFRUQsCisJCQkJCQkJCQlOVUxMKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworYm9vbCBub3V2ZWF1X2RzbV9wcm9iZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWludCBzdXBwb3J0ID0gMDsKKworCWlmIChub3V2ZWF1X2RzbShkZXYsIE5PVVZFQVVfRFNNX1NVUFBPUlRFRCwKKwkJCQlOT1VWRUFVX0RTTV9TVVBQT1JURURfRlVOQ1RJT05TLCAmc3VwcG9ydCkpCisJCXJldHVybiBmYWxzZTsKKworCWlmICghc3VwcG9ydCkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JhY2tsaWdodC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iYWNrbGlnaHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDU2NGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iYWNrbGlnaHQuYwpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBSZWQgSGF0IDxtamdAcmVkaGF0LmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworLyoKKyAqIEF1dGhvcnM6CisgKiAgTWF0dGhldyBHYXJyZXR0IDxtamdAcmVkaGF0LmNvbT4KKyAqCisgKiBSZWdpc3RlciBsb2NhdGlvbnMgZGVyaXZlZCBmcm9tIE5WQ2xvY2sgYnkgUm9kZXJpY2sgQ29sZW5icmFuZGVyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X3JlZy5oIgorCitzdGF0aWMgaW50IG52NDBfZ2V0X2ludGVuc2l0eShzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGJsX2dldF9kYXRhKGJkKTsKKwlpbnQgdmFsID0gKG52X3JkMzIoZGV2LCBOVjQwX1BNQ19CQUNLTElHSFQpICYgTlY0MF9QTUNfQkFDS0xJR0hUX01BU0spCisJCQkJCQkJCQk+PiAxNjsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgbnY0MF9zZXRfaW50ZW5zaXR5KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmxfZ2V0X2RhdGEoYmQpOworCWludCB2YWwgPSBiZC0+cHJvcHMuYnJpZ2h0bmVzczsKKwlpbnQgcmVnID0gbnZfcmQzMihkZXYsIE5WNDBfUE1DX0JBQ0tMSUdIVCk7CisKKwludl93cjMyKGRldiwgTlY0MF9QTUNfQkFDS0xJR0hULAorCQkgKHZhbCA8PCAxNikgfCAocmVnICYgfk5WNDBfUE1DX0JBQ0tMSUdIVF9NQVNLKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIG52NDBfYmxfb3BzID0geworCS5vcHRpb25zID0gQkxfQ09SRV9TVVNQRU5EUkVTVU1FLAorCS5nZXRfYnJpZ2h0bmVzcyA9IG52NDBfZ2V0X2ludGVuc2l0eSwKKwkudXBkYXRlX3N0YXR1cyA9IG52NDBfc2V0X2ludGVuc2l0eSwKK307CisKK3N0YXRpYyBpbnQgbnY1MF9nZXRfaW50ZW5zaXR5KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmxfZ2V0X2RhdGEoYmQpOworCisJcmV0dXJuIG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX1NPUl9CQUNLTElHSFQpOworfQorCitzdGF0aWMgaW50IG52NTBfc2V0X2ludGVuc2l0eShzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGJsX2dldF9kYXRhKGJkKTsKKwlpbnQgdmFsID0gYmQtPnByb3BzLmJyaWdodG5lc3M7CisKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9TT1JfQkFDS0xJR0hULAorCQl2YWwgfCBOVjUwX1BESVNQTEFZX1NPUl9CQUNLTElHSFRfRU5BQkxFKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIG52NTBfYmxfb3BzID0geworCS5vcHRpb25zID0gQkxfQ09SRV9TVVNQRU5EUkVTVU1FLAorCS5nZXRfYnJpZ2h0bmVzcyA9IG52NTBfZ2V0X2ludGVuc2l0eSwKKwkudXBkYXRlX3N0YXR1cyA9IG52NTBfc2V0X2ludGVuc2l0eSwKK307CisKK3N0YXRpYyBpbnQgbm91dmVhdV9udjQwX2JhY2tsaWdodF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQ7CisKKwlpZiAoIShudl9yZDMyKGRldiwgTlY0MF9QTUNfQkFDS0xJR0hUKSAmIE5WNDBfUE1DX0JBQ0tMSUdIVF9NQVNLKSkKKwkJcmV0dXJuIDA7CisKKwliZCA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoIm52X2JhY2tsaWdodCIsICZkZXYtPnBkZXYtPmRldiwgZGV2LAorCQkJCSAgICAgICAmbnY0MF9ibF9vcHMpOworCWlmIChJU19FUlIoYmQpKQorCQlyZXR1cm4gUFRSX0VSUihiZCk7CisKKwlkZXZfcHJpdi0+YmFja2xpZ2h0ID0gYmQ7CisJYmQtPnByb3BzLm1heF9icmlnaHRuZXNzID0gMzE7CisJYmQtPnByb3BzLmJyaWdodG5lc3MgPSBudjQwX2dldF9pbnRlbnNpdHkoYmQpOworCWJhY2tsaWdodF91cGRhdGVfc3RhdHVzKGJkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5vdXZlYXVfbnY1MF9iYWNrbGlnaHRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkOworCisJaWYgKCFudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9TT1JfQkFDS0xJR0hUKSkKKwkJcmV0dXJuIDA7CisKKwliZCA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoIm52X2JhY2tsaWdodCIsICZkZXYtPnBkZXYtPmRldiwgZGV2LAorCQkJCSAgICAgICAmbnY1MF9ibF9vcHMpOworCWlmIChJU19FUlIoYmQpKQorCQlyZXR1cm4gUFRSX0VSUihiZCk7CisKKwlkZXZfcHJpdi0+YmFja2xpZ2h0ID0gYmQ7CisJYmQtPnByb3BzLm1heF9icmlnaHRuZXNzID0gMTAyNTsKKwliZC0+cHJvcHMuYnJpZ2h0bmVzcyA9IG52NTBfZ2V0X2ludGVuc2l0eShiZCk7CisJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoYmQpOworCXJldHVybiAwOworfQorCitpbnQgbm91dmVhdV9iYWNrbGlnaHRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlzd2l0Y2ggKGRldl9wcml2LT5jYXJkX3R5cGUpIHsKKwljYXNlIE5WXzQwOgorCQlyZXR1cm4gbm91dmVhdV9udjQwX2JhY2tsaWdodF9pbml0KGRldik7CisJY2FzZSBOVl81MDoKKwkJcmV0dXJuIG5vdXZlYXVfbnY1MF9iYWNrbGlnaHRfaW5pdChkZXYpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIG5vdXZlYXVfYmFja2xpZ2h0X2V4aXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5iYWNrbGlnaHQpIHsKKwkJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGRldl9wcml2LT5iYWNrbGlnaHQpOworCQlkZXZfcHJpdi0+YmFja2xpZ2h0ID0gTlVMTDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Jpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmlvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZWM1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Jpb3MuYwpAQCAtMCwwICsxLDYwOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IEVyaWsgV2FsaW5nCisgKiBDb3B5cmlnaHQgMjAwNiBTdGVwaGFuZSBNYXJjaGVzaW4KKyAqIENvcHlyaWdodCAyMDA3LTIwMDkgU3R1YXJ0IEJlbm5ldHQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjZGVmaW5lIE5WX0RFQlVHX05PVFJBQ0UKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfaHcuaCIKKworLyogdGhlc2UgZGVmaW5lcyBhcmUgbWFkZSB1cCAqLworI2RlZmluZSBOVl9DSU9fQ1JFXzQ0X0hFQURBIDB4MAorI2RlZmluZSBOVl9DSU9fQ1JFXzQ0X0hFQURCIDB4MworI2RlZmluZSBGRUFUVVJFX01PQklMRSAweDEwCS8qIGFsc28gRkVBVFVSRV9RVUFEUk8gZm9yIEJNUCAqLworI2RlZmluZSBMRUdBQ1lfSTJDX0NSVCAweDgwCisjZGVmaW5lIExFR0FDWV9JMkNfUEFORUwgMHg4MQorI2RlZmluZSBMRUdBQ1lfSTJDX1RWIDB4ODIKKworI2RlZmluZSBFRElEMV9MRU4gMTI4CisKKyNkZWZpbmUgQklPU0xPRyhzaXAsIGZtdCwgYXJnLi4uKSBOVl9ERUJVRyhzaXAtPmRldiwgZm10LCAjI2FyZykKKyNkZWZpbmUgTE9HX09MRF9WQUxVRSh4KQorCisjZGVmaW5lIFJPTTE2KHgpIGxlMTZfdG9fY3B1KCoodWludDE2X3QgKikmKHgpKQorI2RlZmluZSBST00zMih4KSBsZTMyX3RvX2NwdSgqKHVpbnQzMl90ICopJih4KSkKKworc3RydWN0IGluaXRfZXhlYyB7CisJYm9vbCBleGVjdXRlOworCWJvb2wgcmVwZWF0OworfTsKKworc3RhdGljIGJvb2wgbnZfY2tzdW0oY29uc3QgdWludDhfdCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwkvKgorCSAqIFRoZXJlJ3MgYSBmZXcgY2hlY2tzdW1zIGluIHRoZSBCSU9TLCBzbyBoZXJlJ3MgYSBnZW5lcmljIGNoZWNraW5nCisJICogZnVuY3Rpb24uCisJICovCisJaW50IGk7CisJdWludDhfdCBzdW0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQlzdW0gKz0gZGF0YVtpXTsKKworCWlmIChzdW0pCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitzY29yZV92YmlvcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBjb25zdCB1aW50OF90ICpkYXRhLCBjb25zdCBib29sIHdyaXRlYWJsZSkKK3sKKwlpZiAoIShkYXRhWzBdID09IDB4NTUgJiYgZGF0YVsxXSA9PSAweEFBKSkgeworCQlOVl9UUkFDRVdBUk4oZGV2LCAiLi4uIEJJT1Mgc2lnbmF0dXJlIG5vdCBmb3VuZFxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChudl9ja3N1bShkYXRhLCBkYXRhWzJdICogNTEyKSkgeworCQlOVl9UUkFDRVdBUk4oZGV2LCAiLi4uIEJJT1MgY2hlY2tzdW0gaW52YWxpZFxuIik7CisJCS8qIGlmIGEgcm8gaW1hZ2UgaXMgc29tZXdoYXQgYmFkLCBpdCdzIHByb2JhYmx5IGFsbCBydWJiaXNoICovCisJCXJldHVybiB3cml0ZWFibGUgPyAyIDogMTsKKwl9IGVsc2UKKwkJTlZfVFJBQ0UoZGV2LCAiLi4uIGFwcGVhcnMgdG8gYmUgdmFsaWRcbiIpOworCisJcmV0dXJuIDM7Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfdmJpb3NfcHJvbShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50OF90ICpkYXRhKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgcGNpX252XzIwLCBzYXZlX3BjaV9udl8yMDsKKwlpbnQgcGNpcl9wdHI7CisJaW50IGk7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkKKwkJcGNpX252XzIwID0gMHg4ODA1MDsKKwllbHNlCisJCXBjaV9udl8yMCA9IE5WX1BCVVNfUENJX05WXzIwOworCisJLyogZW5hYmxlIFJPTSBhY2Nlc3MgKi8KKwlzYXZlX3BjaV9udl8yMCA9IG52UmVhZE1DKGRldiwgcGNpX252XzIwKTsKKwludldyaXRlTUMoZGV2LCBwY2lfbnZfMjAsCisJCSAgc2F2ZV9wY2lfbnZfMjAgJiB+TlZfUEJVU19QQ0lfTlZfMjBfUk9NX1NIQURPV19FTkFCTEVEKTsKKworCS8qIGJhaWwgaWYgbm8gcm9tIHNpZ25hdHVyZSAqLworCWlmIChudl9yZDA4KGRldiwgTlZfUFJPTV9PRkZTRVQpICE9IDB4NTUgfHwKKwkgICAgbnZfcmQwOChkZXYsIE5WX1BST01fT0ZGU0VUICsgMSkgIT0gMHhhYSkKKwkJZ290byBvdXQ7CisKKwkvKiBhZGRpdGlvbmFsIGNoZWNrIChzZWUgbm90ZSBiZWxvdykgLSByZWFkIFBDSSByZWNvcmQgaGVhZGVyICovCisJcGNpcl9wdHIgPSBudl9yZDA4KGRldiwgTlZfUFJPTV9PRkZTRVQgKyAweDE4KSB8CisJCSAgIG52X3JkMDgoZGV2LCBOVl9QUk9NX09GRlNFVCArIDB4MTkpIDw8IDg7CisJaWYgKG52X3JkMDgoZGV2LCBOVl9QUk9NX09GRlNFVCArIHBjaXJfcHRyKSAhPSAnUCcgfHwKKwkgICAgbnZfcmQwOChkZXYsIE5WX1BST01fT0ZGU0VUICsgcGNpcl9wdHIgKyAxKSAhPSAnQycgfHwKKwkgICAgbnZfcmQwOChkZXYsIE5WX1BST01fT0ZGU0VUICsgcGNpcl9wdHIgKyAyKSAhPSAnSScgfHwKKwkgICAgbnZfcmQwOChkZXYsIE5WX1BST01fT0ZGU0VUICsgcGNpcl9wdHIgKyAzKSAhPSAnUicpCisJCWdvdG8gb3V0OworCisJLyogb24gc29tZSA2NjAwR1QvNjgwMExFIHByb20gcmVhZHMgYXJlIG1lc3NlZCB1cC4gIG52Y2xvY2sgYWxsZWdlcyBhCisJICogYSBnb29kIHJlYWQgbWF5IGJlIG9idGFpbmVkIGJ5IHdhaXRpbmcgb3IgcmUtcmVhZGluZyAoY2FyZ29jdWx0OiA1eCkKKwkgKiBlYWNoIGJ5dGUuICB3ZSdsbCBob3BlIHByYW1pbiBoYXMgc29tZXRoaW5nIHVzYWJsZSBpbnN0ZWFkCisJICovCisJZm9yIChpID0gMDsgaSA8IE5WX1BST01fU0laRTsgaSsrKQorCQlkYXRhW2ldID0gbnZfcmQwOChkZXYsIE5WX1BST01fT0ZGU0VUICsgaSk7CisKK291dDoKKwkvKiBkaXNhYmxlIFJPTSBhY2Nlc3MgKi8KKwludldyaXRlTUMoZGV2LCBwY2lfbnZfMjAsCisJCSAgc2F2ZV9wY2lfbnZfMjAgfCBOVl9QQlVTX1BDSV9OVl8yMF9ST01fU0hBRE9XX0VOQUJMRUQpOworfQorCitzdGF0aWMgdm9pZCBsb2FkX3ZiaW9zX3ByYW1pbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50OF90ICpkYXRhKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3Qgb2xkX2JhcjBfcHJhbWluID0gMDsKKwlpbnQgaTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKSB7CisJCXVpbnQzMl90IHZiaW9zX3ZyYW0gPSAobnZfcmQzMihkZXYsIDB4NjE5ZjA0KSAmIH4weGZmKSA8PCA4OworCisJCWlmICghdmJpb3NfdnJhbSkKKwkJCXZiaW9zX3ZyYW0gPSAobnZfcmQzMihkZXYsIDB4MTcwMCkgPDwgMTYpICsgMHhmMDAwMDsKKworCQlvbGRfYmFyMF9wcmFtaW4gPSBudl9yZDMyKGRldiwgMHgxNzAwKTsKKwkJbnZfd3IzMihkZXYsIDB4MTcwMCwgdmJpb3NfdnJhbSA+PiAxNik7CisJfQorCisJLyogYmFpbCBpZiBubyByb20gc2lnbmF0dXJlICovCisJaWYgKG52X3JkMDgoZGV2LCBOVl9QUkFNSU5fT0ZGU0VUKSAhPSAweDU1IHx8CisJICAgIG52X3JkMDgoZGV2LCBOVl9QUkFNSU5fT0ZGU0VUICsgMSkgIT0gMHhhYSkKKwkJZ290byBvdXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlZfUFJPTV9TSVpFOyBpKyspCisJCWRhdGFbaV0gPSBudl9yZDA4KGRldiwgTlZfUFJBTUlOX09GRlNFVCArIGkpOworCitvdXQ6CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApCisJCW52X3dyMzIoZGV2LCAweDE3MDAsIG9sZF9iYXIwX3ByYW1pbik7Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfdmJpb3NfcGNpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQ4X3QgKmRhdGEpCit7CisJdm9pZCBfX2lvbWVtICpyb20gPSBOVUxMOworCXNpemVfdCByb21fbGVuOworCWludCByZXQ7CisKKwlyZXQgPSBwY2lfZW5hYmxlX3JvbShkZXYtPnBkZXYpOworCWlmIChyZXQpCisJCXJldHVybjsKKworCXJvbSA9IHBjaV9tYXBfcm9tKGRldi0+cGRldiwgJnJvbV9sZW4pOworCWlmICghcm9tKQorCQlnb3RvIG91dDsKKwltZW1jcHlfZnJvbWlvKGRhdGEsIHJvbSwgcm9tX2xlbik7CisJcGNpX3VubWFwX3JvbShkZXYtPnBkZXYsIHJvbSk7CisKK291dDoKKwlwY2lfZGlzYWJsZV9yb20oZGV2LT5wZGV2KTsKK30KKworc3RydWN0IG1ldGhvZHMgeworCWNvbnN0IGNoYXIgZGVzY1s4XTsKKwl2b2lkICgqbG9hZGJpb3MpKHN0cnVjdCBkcm1fZGV2aWNlICosIHVpbnQ4X3QgKik7CisJY29uc3QgYm9vbCBydzsKKwlpbnQgc2NvcmU7Cit9OworCitzdGF0aWMgc3RydWN0IG1ldGhvZHMgbnYwNF9tZXRob2RzW10gPSB7CisJeyAiUFJPTSIsIGxvYWRfdmJpb3NfcHJvbSwgZmFsc2UgfSwKKwl7ICJQUkFNSU4iLCBsb2FkX3ZiaW9zX3ByYW1pbiwgdHJ1ZSB9LAorCXsgIlBDSVJPTSIsIGxvYWRfdmJpb3NfcGNpLCB0cnVlIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IG1ldGhvZHMgbnY1MF9tZXRob2RzW10gPSB7CisJeyAiUFJBTUlOIiwgbG9hZF92Ymlvc19wcmFtaW4sIHRydWUgfSwKKwl7ICJQUk9NIiwgbG9hZF92Ymlvc19wcm9tLCBmYWxzZSB9LAorCXsgIlBDSVJPTSIsIGxvYWRfdmJpb3NfcGNpLCB0cnVlIH0sCisJeyB9Cit9OworCitzdGF0aWMgYm9vbCBOVlNoYWRvd1ZCSU9TKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQ4X3QgKmRhdGEpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbWV0aG9kcyAqbWV0aG9kcywgKm1ldGhvZDsKKwlpbnQgdGVzdHNjb3JlID0gMzsKKworCWlmIChub3V2ZWF1X3ZiaW9zKSB7CisJCW1ldGhvZCA9IG52MDRfbWV0aG9kczsKKwkJd2hpbGUgKG1ldGhvZC0+bG9hZGJpb3MpIHsKKwkJCWlmICghc3RyY2FzZWNtcChub3V2ZWF1X3ZiaW9zLCBtZXRob2QtPmRlc2MpKQorCQkJCWJyZWFrOworCQkJbWV0aG9kKys7CisJCX0KKworCQlpZiAobWV0aG9kLT5sb2FkYmlvcykgeworCQkJTlZfSU5GTyhkZXYsICJBdHRlbXB0aW5nIHRvIHVzZSBCSU9TIGltYWdlIGZyb20gJXNcbiIsCisJCQkJbWV0aG9kLT5kZXNjKTsKKworCQkJbWV0aG9kLT5sb2FkYmlvcyhkZXYsIGRhdGEpOworCQkJaWYgKHNjb3JlX3ZiaW9zKGRldiwgZGF0YSwgbWV0aG9kLT5ydykpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlOVl9FUlJPUihkZXYsICJWQklPUyBzb3VyY2UgXCclc1wnIGludmFsaWRcbiIsIG5vdXZlYXVfdmJpb3MpOworCX0KKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApCisJCW1ldGhvZHMgPSBudjA0X21ldGhvZHM7CisJZWxzZQorCQltZXRob2RzID0gbnY1MF9tZXRob2RzOworCisJbWV0aG9kID0gbWV0aG9kczsKKwl3aGlsZSAobWV0aG9kLT5sb2FkYmlvcykgeworCQlOVl9UUkFDRShkZXYsICJBdHRlbXB0aW5nIHRvIGxvYWQgQklPUyBpbWFnZSBmcm9tICVzXG4iLAorCQkJIG1ldGhvZC0+ZGVzYyk7CisJCWRhdGFbMF0gPSBkYXRhWzFdID0gMDsJLyogYXZvaWQgcmV1c2Ugb2YgcHJldmlvdXMgaW1hZ2UgKi8KKwkJbWV0aG9kLT5sb2FkYmlvcyhkZXYsIGRhdGEpOworCQltZXRob2QtPnNjb3JlID0gc2NvcmVfdmJpb3MoZGV2LCBkYXRhLCBtZXRob2QtPnJ3KTsKKwkJaWYgKG1ldGhvZC0+c2NvcmUgPT0gdGVzdHNjb3JlKQorCQkJcmV0dXJuIHRydWU7CisJCW1ldGhvZCsrOworCX0KKworCXdoaWxlICgtLXRlc3RzY29yZSA+IDApIHsKKwkJbWV0aG9kID0gbWV0aG9kczsKKwkJd2hpbGUgKG1ldGhvZC0+bG9hZGJpb3MpIHsKKwkJCWlmIChtZXRob2QtPnNjb3JlID09IHRlc3RzY29yZSkgeworCQkJCU5WX1RSQUNFKGRldiwgIlVzaW5nIEJJT1MgaW1hZ2UgZnJvbSAlc1xuIiwKKwkJCQkJIG1ldGhvZC0+ZGVzYyk7CisJCQkJbWV0aG9kLT5sb2FkYmlvcyhkZXYsIGRhdGEpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJbWV0aG9kKys7CisJCX0KKwl9CisKKwlOVl9FUlJPUihkZXYsICJObyB2YWxpZCBCSU9TIGltYWdlIGZvdW5kXG4iKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0cnVjdCBpbml0X3RibF9lbnRyeSB7CisJY2hhciAqbmFtZTsKKwl1aW50OF90IGlkOworCWludCBsZW5ndGg7CisJaW50IGxlbmd0aF9vZmZzZXQ7CisJaW50IGxlbmd0aF9tdWx0aXBsaWVyOworCWJvb2wgKCpoYW5kbGVyKShzdHJ1Y3QgbnZiaW9zICosIHVpbnQxNl90LCBzdHJ1Y3QgaW5pdF9leGVjICopOworfTsKKworc3RydWN0IGJpdF9lbnRyeSB7CisJdWludDhfdCBpZFsyXTsKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDE2X3Qgb2Zmc2V0OworfTsKKworc3RhdGljIGludCBwYXJzZV9pbml0X3RhYmxlKHN0cnVjdCBudmJpb3MgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3QgaW5pdF9leGVjICopOworCisjZGVmaW5lIE1BQ1JPX0lOREVYX1NJWkUJMgorI2RlZmluZSBNQUNST19TSVpFCQk4CisjZGVmaW5lIENPTkRJVElPTl9TSVpFCQkxMgorI2RlZmluZSBJT19GTEFHX0NPTkRJVElPTl9TSVpFCTkKKyNkZWZpbmUgSU9fQ09ORElUSU9OX1NJWkUJNQorI2RlZmluZSBNRU1fSU5JVF9TSVpFCQk2NgorCitzdGF0aWMgdm9pZCBzdGlsbF9hbGl2ZSh2b2lkKQoreworI2lmIDAKKwlzeW5jKCk7CisJbXNsZWVwKDIpOworI2VuZGlmCit9CisKK3N0YXRpYyB1aW50MzJfdAorbXVuZ2VfcmVnKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQzMl90IHJlZykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBiaW9zLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkY2JfZW50cnkgKmRjYmVudCA9IGJpb3MtPmRpc3BsYXkub3V0cHV0OworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkKKwkJcmV0dXJuIHJlZzsKKworCWlmIChyZWcgJiAweDQwMDAwMDAwKSB7CisJCUJVR19PTighZGNiZW50KTsKKworCQlyZWcgKz0gKGZmcyhkY2JlbnQtPm9yKSAtIDEpICogMHg4MDA7CisJCWlmICgocmVnICYgMHgyMDAwMDAwMCkgJiYgIShkY2JlbnQtPnNvcmNvbmYubGluayAmIDEpKQorCQkJcmVnICs9IDB4MDAwMDAwODA7CisJfQorCisJcmVnICY9IH4weDYwMDAwMDAwOworCXJldHVybiByZWc7Cit9CisKK3N0YXRpYyBpbnQKK3ZhbGlkX3JlZyhzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MzJfdCByZWcpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gYmlvcy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmlvcy0+ZGV2OworCisJLyogQzUxIGhhcyBtaXNhbGlnbmVkIHJlZ3Mgb24gcHVycG9zZS4gTWFydmVsbG91cyAqLworCWlmIChyZWcgJiAweDIgfHwgKHJlZyAmIDB4MSAmJiBkZXZfcHJpdi0+VkJJT1MucHViLmNoaXBfdmVyc2lvbiAhPSAweDUxKSkgeworCQlOVl9FUlJPUihkZXYsICI9PT09PT09PT09IG1pc2FsaWduZWQgcmVnIDB4JTA4WCA9PT09PT09PT09XG4iLAorCQkJIHJlZyk7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIFdhcm4gb24gQzUxIHJlZ3MgdGhhdCBoYXZlIG5vdCBiZWVuIHZlcmlmaWVkIGFjY2Vzc2libGUgaW4KKwkgKiBtbWlvdHJhY2luZworCSAqLworCWlmIChyZWcgJiAweDEgJiYgZGV2X3ByaXYtPlZCSU9TLnB1Yi5jaGlwX3ZlcnNpb24gPT0gMHg1MSAmJgorCSAgICByZWcgIT0gMHgxMzBkICYmIHJlZyAhPSAweDEzMTEgJiYgcmVnICE9IDB4NjAwODFkKQorCQlOVl9XQVJOKGRldiwgIj09PSBDNTEgbWlzYWxpZ25lZCByZWcgMHglMDhYIG5vdCB2ZXJpZmllZCA9PT1cbiIsCisJCQlyZWcpOworCisJLyogVHJ1c3QgdGhlIGluaXQgc2NyaXB0cyBvbiBHODAgKi8KKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkKKwkJcmV0dXJuIDE7CisKKwkjZGVmaW5lIFdJVEhJTih4LCB5LCB6KSAoKHggPj0geSkgJiYgKHggPCB5ICsgeikpCisJaWYgKFdJVEhJTihyZWcsIE5WX1BNQ19PRkZTRVQsIE5WX1BNQ19TSVpFKSkKKwkJcmV0dXJuIDE7CisJaWYgKFdJVEhJTihyZWcsIE5WX1BCVVNfT0ZGU0VULCBOVl9QQlVTX1NJWkUpKQorCQlyZXR1cm4gMTsKKwlpZiAoV0lUSElOKHJlZywgTlZfUEZJRk9fT0ZGU0VULCBOVl9QRklGT19TSVpFKSkKKwkJcmV0dXJuIDE7CisJaWYgKGRldl9wcml2LT5WQklPUy5wdWIuY2hpcF92ZXJzaW9uID49IDB4MzAgJiYKKwkgICAgKFdJVEhJTihyZWcsIDB4NDAwMCwgMHg2MDApIHx8IHJlZyA9PSAweDAwMDA0NjAwKSkKKwkJcmV0dXJuIDE7CisJaWYgKGRldl9wcml2LT5WQklPUy5wdWIuY2hpcF92ZXJzaW9uID49IDB4NDAgJiYKKwkJCQkJCVdJVEhJTihyZWcsIDB4YzAwMCwgMHg0OCkpCisJCXJldHVybiAxOworCWlmIChkZXZfcHJpdi0+VkJJT1MucHViLmNoaXBfdmVyc2lvbiA+PSAweDE3ICYmIHJlZyA9PSAweDAwMDBkMjA0KQorCQlyZXR1cm4gMTsKKwlpZiAoZGV2X3ByaXYtPlZCSU9TLnB1Yi5jaGlwX3ZlcnNpb24gPj0gMHg0MCkgeworCQlpZiAocmVnID09IDB4MDAwMTEwMTQgfHwgcmVnID09IDB4MDAwMjAzMjgpCisJCQlyZXR1cm4gMTsKKwkJaWYgKFdJVEhJTihyZWcsIDB4ODgwMDAsIE5WX1BCVVNfU0laRSkpIC8qIG5ldyBQQlVTICovCisJCQlyZXR1cm4gMTsKKwl9CisJaWYgKFdJVEhJTihyZWcsIE5WX1BGQl9PRkZTRVQsIE5WX1BGQl9TSVpFKSkKKwkJcmV0dXJuIDE7CisJaWYgKFdJVEhJTihyZWcsIE5WX1BFWFRERVZfT0ZGU0VULCBOVl9QRVhUREVWX1NJWkUpKQorCQlyZXR1cm4gMTsKKwlpZiAoV0lUSElOKHJlZywgTlZfUENSVEMwX09GRlNFVCwgTlZfUENSVEMwX1NJWkUgKiAyKSkKKwkJcmV0dXJuIDE7CisJaWYgKFdJVEhJTihyZWcsIE5WX1BSQU1EQUMwX09GRlNFVCwgTlZfUFJBTURBQzBfU0laRSAqIDIpKQorCQlyZXR1cm4gMTsKKwlpZiAoZGV2X3ByaXYtPlZCSU9TLnB1Yi5jaGlwX3ZlcnNpb24gPj0gMHgxNyAmJiByZWcgPT0gMHgwMDcwZmZmMCkKKwkJcmV0dXJuIDE7CisJaWYgKGRldl9wcml2LT5WQklPUy5wdWIuY2hpcF92ZXJzaW9uID09IDB4NTEgJiYKKwkJCQlXSVRISU4ocmVnLCBOVl9QUkFNSU5fT0ZGU0VULCBOVl9QUkFNSU5fU0laRSkpCisJCXJldHVybiAxOworCSN1bmRlZiBXSVRISU4KKworCU5WX0VSUk9SKGRldiwgIj09PT09PT09PT0gdW5rbm93biByZWcgMHglMDhYID09PT09PT09PT1cbiIsIHJlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wKK3ZhbGlkX2lkeF9wb3J0KHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IHBvcnQpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gYmlvcy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmlvcy0+ZGV2OworCisJLyoKKwkgKiBJZiBhZGRpbmcgbW9yZSBwb3J0cyBoZXJlLCB0aGUgcmVhZC93cml0ZSBmdW5jdGlvbnMgYmVsb3cgd2lsbCBuZWVkCisJICogdXBkYXRpbmcgc28gdGhhdCB0aGUgY29ycmVjdCBtbWlvIHJhbmdlIChQUk1DSU8sIFBSTURJTywgUFJNVklPKSBpcworCSAqIHVzZWQgZm9yIHRoZSBwb3J0IGluIHF1ZXN0aW9uCisJICovCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgeworCQlpZiAocG9ydCA9PSBOVl9DSU9fQ1JYX19DT0xPUikKKwkJCXJldHVybiB0cnVlOworCQlpZiAocG9ydCA9PSBOVl9WSU9fU1JYKQorCQkJcmV0dXJuIHRydWU7CisJfSBlbHNlIHsKKwkJaWYgKHBvcnQgPT0gTlZfQ0lPX0NSWF9fQ09MT1IpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlOVl9FUlJPUihkZXYsICI9PT09PT09PT09IHVua25vd24gaW5kZXhlZCBpbyBwb3J0IDB4JTA0WCA9PT09PT09PT09XG4iLAorCQkgcG9ydCk7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sCit2YWxpZF9wb3J0KHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IHBvcnQpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGJpb3MtPmRldjsKKworCS8qCisJICogSWYgYWRkaW5nIG1vcmUgcG9ydHMgaGVyZSwgdGhlIHJlYWQvd3JpdGUgZnVuY3Rpb25zIGJlbG93IHdpbGwgbmVlZAorCSAqIHVwZGF0aW5nIHNvIHRoYXQgdGhlIGNvcnJlY3QgbW1pbyByYW5nZSAoUFJNQ0lPLCBQUk1ESU8sIFBSTVZJTykgaXMKKwkgKiB1c2VkIGZvciB0aGUgcG9ydCBpbiBxdWVzdGlvbgorCSAqLworCWlmIChwb3J0ID09IE5WX1ZJT19WU0UyKQorCQlyZXR1cm4gdHJ1ZTsKKworCU5WX0VSUk9SKGRldiwgIj09PT09PT09PT0gdW5rbm93biBpbyBwb3J0IDB4JTA0WCA9PT09PT09PT09XG4iLCBwb3J0KTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHVpbnQzMl90CitiaW9zX3JkMzIoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDMyX3QgcmVnKQoreworCXVpbnQzMl90IGRhdGE7CisKKwlyZWcgPSBtdW5nZV9yZWcoYmlvcywgcmVnKTsKKwlpZiAoIXZhbGlkX3JlZyhiaW9zLCByZWcpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogQzUxIHNvbWV0aW1lcyB1c2VzIHJlZ3Mgd2l0aCBiaXQwIHNldCBpbiB0aGUgYWRkcmVzcy4gRm9yIHRoZXNlCisJICogY2FzZXMgdGhlcmUgc2hvdWxkIGV4aXN0IGEgdHJhbnNsYXRpb24gaW4gYSBCSU9TIHRhYmxlIHRvIGFuIElPCisJICogcG9ydCBhZGRyZXNzIHdoaWNoIHRoZSBCSU9TIHVzZXMgZm9yIGFjY2Vzc2luZyB0aGUgcmVnCisJICoKKwkgKiBUaGVzZSBvbmx5IHNlZW0gdG8gYXBwZWFyIGZvciB0aGUgcG93ZXIgY29udHJvbCByZWdzIHRvIGEgZmxhdCBwYW5lbCwKKwkgKiBhbmQgdGhlIEdQSU8gcmVncyBhdCAweDYwMDgxKi4gIEluIEM1MSBtbWlvIHRyYWNlcyB0aGUgbm9ybWFsIHJlZ3MKKwkgKiBmb3IgMHgxMzA4IGFuZCAweDEzMTAgYXJlIHVzZWQgLSBoZW5jZSB0aGUgbWFzayBiZWxvdy4gIEFuIFMzCisJICogc3VzcGVuZC1yZXN1bWUgbW1pbyB0cmFjZSBmcm9tIGEgQzUxIHdpbGwgYmUgcmVxdWlyZWQgdG8gc2VlIGlmIHRoaXMKKwkgKiBpcyB0cnVlIGZvciB0aGUgcG93ZXIgbWljcm9jb2RlIGluIDB4MTQuLiwgb3Igd2hldGhlciB0aGUgZGlyZWN0IElPCisJICogcG9ydCBhY2Nlc3MgbWV0aG9kIGlzIG5lZWRlZAorCSAqLworCWlmIChyZWcgJiAweDEpCisJCXJlZyAmPSB+MHgxOworCisJZGF0YSA9IG52X3JkMzIoYmlvcy0+ZGV2LCByZWcpOworCisJQklPU0xPRyhiaW9zLCAiCVJlYWQ6ICBSZWc6IDB4JTA4WCwgRGF0YTogMHglMDhYXG4iLCByZWcsIGRhdGEpOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkCitiaW9zX3dyMzIoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDMyX3QgcmVnLCB1aW50MzJfdCBkYXRhKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGJpb3MtPmRldi0+ZGV2X3ByaXZhdGU7CisKKwlyZWcgPSBtdW5nZV9yZWcoYmlvcywgcmVnKTsKKwlpZiAoIXZhbGlkX3JlZyhiaW9zLCByZWcpKQorCQlyZXR1cm47CisKKwkvKiBzZWUgbm90ZSBpbiBiaW9zX3JkMzIgKi8KKwlpZiAocmVnICYgMHgxKQorCQlyZWcgJj0gMHhmZmZmZmZmZTsKKworCUxPR19PTERfVkFMVUUoYmlvc19yZDMyKGJpb3MsIHJlZykpOworCUJJT1NMT0coYmlvcywgIglXcml0ZTogUmVnOiAweCUwOFgsIERhdGE6IDB4JTA4WFxuIiwgcmVnLCBkYXRhKTsKKworCWlmIChkZXZfcHJpdi0+VkJJT1MuZXhlY3V0ZSkgeworCQlzdGlsbF9hbGl2ZSgpOworCQludl93cjMyKGJpb3MtPmRldiwgcmVnLCBkYXRhKTsKKwl9Cit9CisKK3N0YXRpYyB1aW50OF90CitiaW9zX2lkeHBydF9yZChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBwb3J0LCB1aW50OF90IGluZGV4KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGJpb3MtPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGJpb3MtPmRldjsKKwl1aW50OF90IGRhdGE7CisKKwlpZiAoIXZhbGlkX2lkeF9wb3J0KGJpb3MsIHBvcnQpKQorCQlyZXR1cm4gMDsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKKwkJaWYgKHBvcnQgPT0gTlZfVklPX1NSWCkKKwkJCWRhdGEgPSBOVlJlYWRWZ2FTZXEoZGV2LCBiaW9zLT5zdGF0ZS5jcnRjaGVhZCwgaW5kZXgpOworCQllbHNlCS8qIGFzc3VtZSBOVl9DSU9fQ1JYX19DT0xPUiAqLworCQkJZGF0YSA9IE5WUmVhZFZnYUNydGMoZGV2LCBiaW9zLT5zdGF0ZS5jcnRjaGVhZCwgaW5kZXgpOworCX0gZWxzZSB7CisJCXVpbnQzMl90IGRhdGEzMjsKKworCQlkYXRhMzIgPSBiaW9zX3JkMzIoYmlvcywgTlY1MF9QRElTUExBWV9WR0FDUlRDKGluZGV4ICYgfjMpKTsKKwkJZGF0YSA9IChkYXRhMzIgPj4gKChpbmRleCAmIDMpIDw8IDMpKSAmIDB4ZmY7CisJfQorCisJQklPU0xPRyhiaW9zLCAiCUluZGV4ZWQgSU8gcmVhZDogIFBvcnQ6IDB4JTA0WCwgSW5kZXg6IDB4JTAyWCwgIgorCQkgICAgICAiSGVhZDogMHglMDJYLCBEYXRhOiAweCUwMlhcbiIsCisJCXBvcnQsIGluZGV4LCBiaW9zLT5zdGF0ZS5jcnRjaGVhZCwgZGF0YSk7CisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkCitiaW9zX2lkeHBydF93cihzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBwb3J0LCB1aW50OF90IGluZGV4LCB1aW50OF90IGRhdGEpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gYmlvcy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmlvcy0+ZGV2OworCisJaWYgKCF2YWxpZF9pZHhfcG9ydChiaW9zLCBwb3J0KSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBUaGUgY3VycmVudCBoZWFkIGlzIG1haW50YWluZWQgaW4gdGhlIG52YmlvcyBtZW1iZXIgIHN0YXRlLmNydGNoZWFkLgorCSAqIFdlIHRyYXAgY2hhbmdlcyB0byBDUjQ0IGFuZCB1cGRhdGUgdGhlIGhlYWQgdmFyaWFibGUgYW5kIGhlbmNlIHRoZQorCSAqIHJlZ2lzdGVyIHNldCB3cml0dGVuLgorCSAqIEFzIENSNDQgb25seSBleGlzdHMgb24gQ1JUQzAsIHdlIHVwZGF0ZSBjcnRjaGVhZCB0byBoZWFkMCBpbiBhZHZhbmNlCisJICogb2YgdGhlIHdyaXRlLCBhbmQgdG8gaGVhZDEgYWZ0ZXIgdGhlIHdyaXRlCisJICovCisJaWYgKHBvcnQgPT0gTlZfQ0lPX0NSWF9fQ09MT1IgJiYgaW5kZXggPT0gTlZfQ0lPX0NSRV80NCAmJgorCSAgICBkYXRhICE9IE5WX0NJT19DUkVfNDRfSEVBREIpCisJCWJpb3MtPnN0YXRlLmNydGNoZWFkID0gMDsKKworCUxPR19PTERfVkFMVUUoYmlvc19pZHhwcnRfcmQoYmlvcywgcG9ydCwgaW5kZXgpKTsKKwlCSU9TTE9HKGJpb3MsICIJSW5kZXhlZCBJTyB3cml0ZTogUG9ydDogMHglMDRYLCBJbmRleDogMHglMDJYLCAiCisJCSAgICAgICJIZWFkOiAweCUwMlgsIERhdGE6IDB4JTAyWFxuIiwKKwkJcG9ydCwgaW5kZXgsIGJpb3MtPnN0YXRlLmNydGNoZWFkLCBkYXRhKTsKKworCWlmIChiaW9zLT5leGVjdXRlICYmIGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgeworCQlzdGlsbF9hbGl2ZSgpOworCQlpZiAocG9ydCA9PSBOVl9WSU9fU1JYKQorCQkJTlZXcml0ZVZnYVNlcShkZXYsIGJpb3MtPnN0YXRlLmNydGNoZWFkLCBpbmRleCwgZGF0YSk7CisJCWVsc2UJLyogYXNzdW1lIE5WX0NJT19DUlhfX0NPTE9SICovCisJCQlOVldyaXRlVmdhQ3J0YyhkZXYsIGJpb3MtPnN0YXRlLmNydGNoZWFkLCBpbmRleCwgZGF0YSk7CisJfSBlbHNlCisJaWYgKGJpb3MtPmV4ZWN1dGUpIHsKKwkJdWludDMyX3QgZGF0YTMyLCBzaGlmdCA9IChpbmRleCAmIDMpIDw8IDM7CisKKwkJc3RpbGxfYWxpdmUoKTsKKworCQlkYXRhMzIgID0gYmlvc19yZDMyKGJpb3MsIE5WNTBfUERJU1BMQVlfVkdBQ1JUQyhpbmRleCAmIH4zKSk7CisJCWRhdGEzMiAmPSB+KDB4ZmYgPDwgc2hpZnQpOworCQlkYXRhMzIgfD0gKGRhdGEgPDwgc2hpZnQpOworCQliaW9zX3dyMzIoYmlvcywgTlY1MF9QRElTUExBWV9WR0FDUlRDKGluZGV4ICYgfjMpLCBkYXRhMzIpOworCX0KKworCWlmIChwb3J0ID09IE5WX0NJT19DUlhfX0NPTE9SICYmCisJICAgIGluZGV4ID09IE5WX0NJT19DUkVfNDQgJiYgZGF0YSA9PSBOVl9DSU9fQ1JFXzQ0X0hFQURCKQorCQliaW9zLT5zdGF0ZS5jcnRjaGVhZCA9IDE7Cit9CisKK3N0YXRpYyB1aW50OF90CitiaW9zX3BvcnRfcmQoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3QgcG9ydCkKK3sKKwl1aW50OF90IGRhdGEsIGhlYWQgPSBiaW9zLT5zdGF0ZS5jcnRjaGVhZDsKKworCWlmICghdmFsaWRfcG9ydChiaW9zLCBwb3J0KSkKKwkJcmV0dXJuIDA7CisKKwlkYXRhID0gTlZSZWFkUFJNVklPKGJpb3MtPmRldiwgaGVhZCwgTlZfUFJNVklPMF9PRkZTRVQgKyBwb3J0KTsKKworCUJJT1NMT0coYmlvcywgIglJTyByZWFkOiAgUG9ydDogMHglMDRYLCBIZWFkOiAweCUwMlgsIERhdGE6IDB4JTAyWFxuIiwKKwkJcG9ydCwgaGVhZCwgZGF0YSk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQKK2Jpb3NfcG9ydF93cihzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBwb3J0LCB1aW50OF90IGRhdGEpCit7CisJaW50IGhlYWQgPSBiaW9zLT5zdGF0ZS5jcnRjaGVhZDsKKworCWlmICghdmFsaWRfcG9ydChiaW9zLCBwb3J0KSkKKwkJcmV0dXJuOworCisJTE9HX09MRF9WQUxVRShiaW9zX3BvcnRfcmQoYmlvcywgcG9ydCkpOworCUJJT1NMT0coYmlvcywgIglJTyB3cml0ZTogUG9ydDogMHglMDRYLCBIZWFkOiAweCUwMlgsIERhdGE6IDB4JTAyWFxuIiwKKwkJcG9ydCwgaGVhZCwgZGF0YSk7CisKKwlpZiAoIWJpb3MtPmV4ZWN1dGUpCisJCXJldHVybjsKKworCXN0aWxsX2FsaXZlKCk7CisJTlZXcml0ZVBSTVZJTyhiaW9zLT5kZXYsIGhlYWQsIE5WX1BSTVZJTzBfT0ZGU0VUICsgcG9ydCwgZGF0YSk7Cit9CisKK3N0YXRpYyBib29sCitpb19mbGFnX2NvbmRpdGlvbl9tZXQoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCB1aW50OF90IGNvbmQpCit7CisJLyoKKwkgKiBUaGUgSU8gZmxhZyBjb25kaXRpb24gZW50cnkgaGFzIDIgYnl0ZXMgZm9yIHRoZSBDUlRDIHBvcnQ7IDEgYnl0ZQorCSAqIGZvciB0aGUgQ1JUQyBpbmRleDsgMSBieXRlIGZvciB0aGUgbWFzayB0byBhcHBseSB0byB0aGUgdmFsdWUKKwkgKiByZXRyaWV2ZWQgZnJvbSB0aGUgQ1JUQzsgMSBieXRlIGZvciB0aGUgc2hpZnQgcmlnaHQgdG8gYXBwbHkgdG8gdGhlCisJICogbWFza2VkIENSVEMgdmFsdWU7IDIgYnl0ZXMgZm9yIHRoZSBvZmZzZXQgdG8gdGhlIGZsYWcgYXJyYXksIHRvCisJICogd2hpY2ggdGhlIHNoaWZ0ZWQgdmFsdWUgaXMgYWRkZWQ7IDEgYnl0ZSBmb3IgdGhlIG1hc2sgYXBwbGllZCB0byB0aGUKKwkgKiB2YWx1ZSByZWFkIGZyb20gdGhlIGZsYWcgYXJyYXk7IGFuZCAxIGJ5dGUgZm9yIHRoZSB2YWx1ZSB0byBjb21wYXJlCisJICogYWdhaW5zdCB0aGUgbWFza2VkIGJ5dGUgZnJvbSB0aGUgZmxhZyB0YWJsZS4KKwkgKi8KKworCXVpbnQxNl90IGNvbmRwdHIgPSBiaW9zLT5pb19mbGFnX2NvbmRpdGlvbl90YmxfcHRyICsgY29uZCAqIElPX0ZMQUdfQ09ORElUSU9OX1NJWkU7CisJdWludDE2X3QgY3J0Y3BvcnQgPSBST00xNihiaW9zLT5kYXRhW2NvbmRwdHJdKTsKKwl1aW50OF90IGNydGNpbmRleCA9IGJpb3MtPmRhdGFbY29uZHB0ciArIDJdOworCXVpbnQ4X3QgbWFzayA9IGJpb3MtPmRhdGFbY29uZHB0ciArIDNdOworCXVpbnQ4X3Qgc2hpZnQgPSBiaW9zLT5kYXRhW2NvbmRwdHIgKyA0XTsKKwl1aW50MTZfdCBmbGFnYXJyYXkgPSBST00xNihiaW9zLT5kYXRhW2NvbmRwdHIgKyA1XSk7CisJdWludDhfdCBmbGFnYXJyYXltYXNrID0gYmlvcy0+ZGF0YVtjb25kcHRyICsgN107CisJdWludDhfdCBjbXB2YWwgPSBiaW9zLT5kYXRhW2NvbmRwdHIgKyA4XTsKKwl1aW50OF90IGRhdGE7CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IFBvcnQ6IDB4JTA0WCwgSW5kZXg6IDB4JTAyWCwgTWFzazogMHglMDJYLCAiCisJCSAgICAgICJTaGlmdDogMHglMDJYLCBGbGFnQXJyYXk6IDB4JTA0WCwgRkFNYXNrOiAweCUwMlgsICIKKwkJICAgICAgIkNtcHZhbDogMHglMDJYXG4iLAorCQlvZmZzZXQsIGNydGNwb3J0LCBjcnRjaW5kZXgsIG1hc2ssIHNoaWZ0LCBmbGFnYXJyYXksIGZsYWdhcnJheW1hc2ssIGNtcHZhbCk7CisKKwlkYXRhID0gYmlvc19pZHhwcnRfcmQoYmlvcywgY3J0Y3BvcnQsIGNydGNpbmRleCk7CisKKwlkYXRhID0gYmlvcy0+ZGF0YVtmbGFnYXJyYXkgKyAoKGRhdGEgJiBtYXNrKSA+PiBzaGlmdCldOworCWRhdGEgJj0gZmxhZ2FycmF5bWFzazsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogQ2hlY2tpbmcgaWYgMHglMDJYIGVxdWFscyAweCUwMlhcbiIsCisJCW9mZnNldCwgZGF0YSwgY21wdmFsKTsKKworCXJldHVybiAoZGF0YSA9PSBjbXB2YWwpOworfQorCitzdGF0aWMgYm9vbAorYmlvc19jb25kaXRpb25fbWV0KHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgdWludDhfdCBjb25kKQoreworCS8qCisJICogVGhlIGNvbmRpdGlvbiB0YWJsZSBlbnRyeSBoYXMgNCBieXRlcyBmb3IgdGhlIGFkZHJlc3Mgb2YgdGhlCisJICogcmVnaXN0ZXIgdG8gY2hlY2ssIDQgYnl0ZXMgZm9yIGEgbWFzayB0byBhcHBseSB0byB0aGUgcmVnaXN0ZXIgYW5kCisJICogNCBmb3IgYSB0ZXN0IGNvbXBhcmlzb24gdmFsdWUKKwkgKi8KKworCXVpbnQxNl90IGNvbmRwdHIgPSBiaW9zLT5jb25kaXRpb25fdGJsX3B0ciArIGNvbmQgKiBDT05ESVRJT05fU0laRTsKKwl1aW50MzJfdCByZWcgPSBST00zMihiaW9zLT5kYXRhW2NvbmRwdHJdKTsKKwl1aW50MzJfdCBtYXNrID0gUk9NMzIoYmlvcy0+ZGF0YVtjb25kcHRyICsgNF0pOworCXVpbnQzMl90IGNtcHZhbCA9IFJPTTMyKGJpb3MtPmRhdGFbY29uZHB0ciArIDhdKTsKKwl1aW50MzJfdCBkYXRhOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBDb25kOiAweCUwMlgsIFJlZzogMHglMDhYLCBNYXNrOiAweCUwOFhcbiIsCisJCW9mZnNldCwgY29uZCwgcmVnLCBtYXNrKTsKKworCWRhdGEgPSBiaW9zX3JkMzIoYmlvcywgcmVnKSAmIG1hc2s7CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IENoZWNraW5nIGlmIDB4JTA4WCBlcXVhbHMgMHglMDhYXG4iLAorCQlvZmZzZXQsIGRhdGEsIGNtcHZhbCk7CisKKwlyZXR1cm4gKGRhdGEgPT0gY21wdmFsKTsKK30KKworc3RhdGljIGJvb2wKK2lvX2NvbmRpdGlvbl9tZXQoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCB1aW50OF90IGNvbmQpCit7CisJLyoKKwkgKiBUaGUgSU8gY29uZGl0aW9uIGVudHJ5IGhhcyAyIGJ5dGVzIGZvciB0aGUgSU8gcG9ydCBhZGRyZXNzOyAxIGJ5dGUKKwkgKiBmb3IgdGhlIGluZGV4IHRvIHdyaXRlIHRvIGlvX3BvcnQ7IDEgYnl0ZSBmb3IgdGhlIG1hc2sgdG8gYXBwbHkgdG8KKwkgKiB0aGUgYnl0ZSByZWFkIGZyb20gaW9fcG9ydCsxOyBhbmQgMSBieXRlIGZvciB0aGUgdmFsdWUgdG8gY29tcGFyZQorCSAqIGFnYWluc3QgdGhlIG1hc2tlZCBieXRlLgorCSAqLworCisJdWludDE2X3QgY29uZHB0ciA9IGJpb3MtPmlvX2NvbmRpdGlvbl90YmxfcHRyICsgY29uZCAqIElPX0NPTkRJVElPTl9TSVpFOworCXVpbnQxNl90IGlvX3BvcnQgPSBST00xNihiaW9zLT5kYXRhW2NvbmRwdHJdKTsKKwl1aW50OF90IHBvcnRfaW5kZXggPSBiaW9zLT5kYXRhW2NvbmRwdHIgKyAyXTsKKwl1aW50OF90IG1hc2sgPSBiaW9zLT5kYXRhW2NvbmRwdHIgKyAzXTsKKwl1aW50OF90IGNtcHZhbCA9IGJpb3MtPmRhdGFbY29uZHB0ciArIDRdOworCisJdWludDhfdCBkYXRhID0gYmlvc19pZHhwcnRfcmQoYmlvcywgaW9fcG9ydCwgcG9ydF9pbmRleCkgJiBtYXNrOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBDaGVja2luZyBpZiAweCUwMlggZXF1YWxzIDB4JTAyWFxuIiwKKwkJb2Zmc2V0LCBkYXRhLCBjbXB2YWwpOworCisJcmV0dXJuIChkYXRhID09IGNtcHZhbCk7Cit9CisKK3N0YXRpYyBpbnQKK252NTBfcGxsX3NldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCByZWcsIHVpbnQzMl90IGNsaykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IHJlZzAgPSBudl9yZDMyKGRldiwgcmVnICsgMCk7CisJdWludDMyX3QgcmVnMSA9IG52X3JkMzIoZGV2LCByZWcgKyA0KTsKKwlzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyBwbGw7CisJc3RydWN0IHBsbF9saW1zIHBsbF9saW1pdHM7CisJaW50IHJldDsKKworCXJldCA9IGdldF9wbGxfbGltaXRzKGRldiwgcmVnLCAmcGxsX2xpbWl0cyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWNsayA9IG5vdXZlYXVfY2FsY19wbGxfbW5wKGRldiwgJnBsbF9saW1pdHMsIGNsaywgJnBsbCk7CisJaWYgKCFjbGspCisJCXJldHVybiAtRVJBTkdFOworCisJcmVnMCA9IChyZWcwICYgMHhmZmY4ZmZmZikgfCAocGxsLmxvZzJQIDw8IDE2KTsKKwlyZWcxID0gKHJlZzEgJiAweGZmZmYwMDAwKSB8IChwbGwuTjEgPDwgOCkgfCBwbGwuTTE7CisKKwlpZiAoZGV2X3ByaXYtPlZCSU9TLmV4ZWN1dGUpIHsKKwkJc3RpbGxfYWxpdmUoKTsKKwkJbnZfd3IzMihkZXYsIHJlZyArIDQsIHJlZzEpOworCQludl93cjMyKGRldiwgcmVnICsgMCwgcmVnMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NldFBMTChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MzJfdCByZWcsIHVpbnQzMl90IGNsaykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmlvcy0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJLyogY2xrIGluIGtIeiAqLworCXN0cnVjdCBwbGxfbGltcyBwbGxfbGltOworCXN0cnVjdCBub3V2ZWF1X3BsbF92YWxzIHBsbHZhbHM7CisJaW50IHJldDsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKQorCQlyZXR1cm4gbnY1MF9wbGxfc2V0KGRldiwgcmVnLCBjbGspOworCisJLyogaGlnaCByZWdzIChzdWNoIGFzIGluIHRoZSBtYWMgZzUgdGFibGUpIGFyZSBub3QgLT0gNCAqLworCXJldCA9IGdldF9wbGxfbGltaXRzKGRldiwgcmVnID4gMHg0MDVjID8gcmVnIDogcmVnIC0gNCwgJnBsbF9saW0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwljbGsgPSBub3V2ZWF1X2NhbGNfcGxsX21ucChkZXYsICZwbGxfbGltLCBjbGssICZwbGx2YWxzKTsKKwlpZiAoIWNsaykKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwlpZiAoYmlvcy0+ZXhlY3V0ZSkgeworCQlzdGlsbF9hbGl2ZSgpOworCQlub3V2ZWF1X2h3X3NldHBsbChkZXYsIHJlZywgJnBsbHZhbHMpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRjYl9lbnRyeV9pZHhfZnJvbV9jcnRjaGVhZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+VkJJT1M7CisKKwkvKgorCSAqIEZvciB0aGUgcmVzdWx0cyBvZiB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNvcnJlY3QsIENSNDQgbXVzdCBoYXZlIGJlZW4KKwkgKiBzZXQgKHVzaW5nIGJpb3NfaWR4cHJ0X3dyIHRvIHNldCBjcnRjaGVhZCksIENSNTggc2V0IGZvciBDUjU3ID0gMCwKKwkgKiBhbmQgdGhlIERDQiB0YWJsZSBwYXJzZWQsIGJlZm9yZSB0aGUgc2NyaXB0IGNhbGxpbmcgdGhlIGZ1bmN0aW9uIGlzCisJICogcnVuLiAgcnVuX2RpZ2l0YWxfb3Bfc2NyaXB0IGlzIGV4YW1wbGUgb2YgaG93IHRvIGRvIHN1Y2ggc2V0dXAKKwkgKi8KKworCXVpbnQ4X3QgZGNiX2VudHJ5ID0gTlZSZWFkVmdhQ3J0YzU3NTgoZGV2LCBiaW9zLT5zdGF0ZS5jcnRjaGVhZCwgMCk7CisKKwlpZiAoZGNiX2VudHJ5ID4gYmlvcy0+YmRjYi5kY2IuZW50cmllcykgeworCQlOVl9FUlJPUihkZXYsICJDUjU4IGRvZXNuJ3QgaGF2ZSBhIHZhbGlkIERDQiBlbnRyeSBjdXJyZW50bHkgIgorCQkJCSIoJTAyWClcbiIsIGRjYl9lbnRyeSk7CisJCWRjYl9lbnRyeSA9IDB4N2Y7CS8qIHVudXNlZCAvIGludmFsaWQgbWFya2VyICovCisJfQorCisJcmV0dXJuIGRjYl9lbnRyeTsKK30KKworc3RhdGljIHN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICoKK2luaXRfaTJjX2RldmljZV9maW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpMmNfaW5kZXgpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgYmlvc19wYXJzZWRfZGNiICpiZGNiID0gJmRldl9wcml2LT5WQklPUy5iZGNiOworCisJaWYgKGkyY19pbmRleCA9PSAweGZmKSB7CisJCS8qIG5vdGU6IGRjYl9lbnRyeV9pZHhfZnJvbV9jcnRjaGVhZCBuZWVkcyBwcmUtc2NyaXB0IHNldC11cCAqLworCQlpbnQgaWR4ID0gZGNiX2VudHJ5X2lkeF9mcm9tX2NydGNoZWFkKGRldiksIHNoaWZ0ID0gMDsKKwkJaW50IGRlZmF1bHRfaW5kaWNlcyA9IGJkY2ItPmkyY19kZWZhdWx0X2luZGljZXM7CisKKwkJaWYgKGlkeCAhPSAweDdmICYmIGJkY2ItPmRjYi5lbnRyeVtpZHhdLmkyY191cHBlcl9kZWZhdWx0KQorCQkJc2hpZnQgPSA0OworCisJCWkyY19pbmRleCA9IChkZWZhdWx0X2luZGljZXMgPj4gc2hpZnQpICYgMHhmOworCX0KKwlpZiAoaTJjX2luZGV4ID09IDB4ODApCS8qIGc4MCsgKi8KKwkJaTJjX2luZGV4ID0gYmRjYi0+aTJjX2RlZmF1bHRfaW5kaWNlcyAmIDB4ZjsKKworCXJldHVybiBub3V2ZWF1X2kyY19maW5kKGRldiwgaTJjX2luZGV4KTsKK30KKworc3RhdGljIHVpbnQzMl90IGdldF90bWRzX2luZGV4X3JlZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50OF90IG1sdikKK3sKKwkvKgorCSAqIEZvciBtbHYgPCAweDgwLCBpdCBpcyBhbiBpbmRleCBpbnRvIGEgdGFibGUgb2YgVE1EUyBiYXNlIGFkZHJlc3Nlcy4KKwkgKiBGb3IgbWx2ID09IDB4ODAgdXNlIHRoZSAib3IiIHZhbHVlIG9mIHRoZSBkY2JfZW50cnkgaW5kZXhlZCBieQorCSAqIENSNTggZm9yIENSNTcgPSAwIHRvIGluZGV4IGEgdGFibGUgb2Ygb2Zmc2V0cyB0byB0aGUgYmFzaWMKKwkgKiAweDY4MDhiMCBhZGRyZXNzLgorCSAqIEZvciBtbHYgPT0gMHg4MSB1c2UgdGhlICJvciIgdmFsdWUgb2YgdGhlIGRjYl9lbnRyeSBpbmRleGVkIGJ5CisJICogQ1I1OCBmb3IgQ1I1NyA9IDAgdG8gaW5kZXggYSB0YWJsZSBvZiBvZmZzZXRzIHRvIHRoZSBiYXNpYworCSAqIDB4NjgwOGIwIGFkZHJlc3MsIGFuZCB0aGVuIGZsaXAgdGhlIG9mZnNldCBieSA4LgorCSAqLworCisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwljb25zdCBpbnQgcHJhbWRhY19vZmZzZXRbMTNdID0geworCQkwLCAwLCAweDgsIDAsIDB4MjAwMCwgMCwgMCwgMCwgMHgyMDA4LCAwLCAwLCAwLCAweDIwMDAgfTsKKwljb25zdCB1aW50MzJfdCBwcmFtZGFjX3RhYmxlWzRdID0geworCQkweDY4MDhiMCwgMHg2ODA4YjgsIDB4NjgyOGIwLCAweDY4MjhiOCB9OworCisJaWYgKG1sdiA+PSAweDgwKSB7CisJCWludCBkY2JfZW50cnksIGRhY29mZnNldDsKKworCQkvKiBub3RlOiBkY2JfZW50cnlfaWR4X2Zyb21fY3J0Y2hlYWQgbmVlZHMgcHJlLXNjcmlwdCBzZXQtdXAgKi8KKwkJZGNiX2VudHJ5ID0gZGNiX2VudHJ5X2lkeF9mcm9tX2NydGNoZWFkKGRldik7CisJCWlmIChkY2JfZW50cnkgPT0gMHg3ZikKKwkJCXJldHVybiAwOworCQlkYWNvZmZzZXQgPSBwcmFtZGFjX29mZnNldFsKKwkJCQlkZXZfcHJpdi0+VkJJT1MuYmRjYi5kY2IuZW50cnlbZGNiX2VudHJ5XS5vcl07CisJCWlmIChtbHYgPT0gMHg4MSkKKwkJCWRhY29mZnNldCBePSA4OworCQlyZXR1cm4gMHg2ODA4YjAgKyBkYWNvZmZzZXQ7CisJfSBlbHNlIHsKKwkJaWYgKG1sdiA+IEFSUkFZX1NJWkUocHJhbWRhY190YWJsZSkpIHsKKwkJCU5WX0VSUk9SKGRldiwgIk1hZ2ljIExvb2t1cCBWYWx1ZSB0b28gYmlnICglMDJYKVxuIiwKKwkJCQkJCQkJCW1sdik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gcHJhbWRhY190YWJsZVttbHZdOworCX0KK30KKworc3RhdGljIGJvb2wKK2luaXRfaW9fcmVzdHJpY3RfcHJvZyhzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsCisJCSAgICAgIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9JT19SRVNUUklDVF9QUk9HICAgb3Bjb2RlOiAweDMyICgnMicpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCAgYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDE2IGJpdCk6IENSVEMgcG9ydAorCSAqIG9mZnNldCArIDMgICg4ICBiaXQpOiBDUlRDIGluZGV4CisJICogb2Zmc2V0ICsgNCAgKDggIGJpdCk6IG1hc2sKKwkgKiBvZmZzZXQgKyA1ICAoOCAgYml0KTogc2hpZnQKKwkgKiBvZmZzZXQgKyA2ICAoOCAgYml0KTogY291bnQKKwkgKiBvZmZzZXQgKyA3ICAoMzIgYml0KTogcmVnaXN0ZXIKKwkgKiBvZmZzZXQgKyAxMSAoMzIgYml0KTogY29uZmlndXJhdGlvbiAxCisJICogLi4uCisJICoKKwkgKiBTdGFydGluZyBhdCBvZmZzZXQgKyAxMSB0aGVyZSBhcmUgImNvdW50IiAzMiBiaXQgdmFsdWVzLgorCSAqIFRvIGZpbmQgb3V0IHdoaWNoIHZhbHVlIHRvIHVzZSByZWFkIGluZGV4ICJDUlRDIGluZGV4IiBvbiAiQ1JUQworCSAqIHBvcnQiLCBBTkQgdGhpcyB2YWx1ZSB3aXRoICJtYXNrIiBhbmQgdGhlbiBiaXQgc2hpZnQgcmlnaHQgInNoaWZ0IgorCSAqIGJpdHMuICBSZWFkIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSB1c2luZyB0aGlzIGluZGV4IGFuZCB3cml0ZSB0bworCSAqICJyZWdpc3RlciIKKwkgKi8KKworCXVpbnQxNl90IGNydGNwb3J0ID0gUk9NMTYoYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXSk7CisJdWludDhfdCBjcnRjaW5kZXggPSBiaW9zLT5kYXRhW29mZnNldCArIDNdOworCXVpbnQ4X3QgbWFzayA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNF07CisJdWludDhfdCBzaGlmdCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNV07CisJdWludDhfdCBjb3VudCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNl07CisJdWludDMyX3QgcmVnID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyA3XSk7CisJdWludDhfdCBjb25maWc7CisJdWludDMyX3QgY29uZmlndmFsOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IFBvcnQ6IDB4JTA0WCwgSW5kZXg6IDB4JTAyWCwgTWFzazogMHglMDJYLCAiCisJCSAgICAgICJTaGlmdDogMHglMDJYLCBDb3VudDogMHglMDJYLCBSZWc6IDB4JTA4WFxuIiwKKwkJb2Zmc2V0LCBjcnRjcG9ydCwgY3J0Y2luZGV4LCBtYXNrLCBzaGlmdCwgY291bnQsIHJlZyk7CisKKwljb25maWcgPSAoYmlvc19pZHhwcnRfcmQoYmlvcywgY3J0Y3BvcnQsIGNydGNpbmRleCkgJiBtYXNrKSA+PiBzaGlmdDsKKwlpZiAoY29uZmlnID4gY291bnQpIHsKKwkJTlZfRVJST1IoYmlvcy0+ZGV2LAorCQkJICIweCUwNFg6IENvbmZpZyAweCUwMlggZXhjZWVkcyBtYXhpbWFsIGJvdW5kIDB4JTAyWFxuIiwKKwkJCSBvZmZzZXQsIGNvbmZpZywgY291bnQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJY29uZmlndmFsID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyAxMSArIGNvbmZpZyAqIDRdKTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogV3JpdGluZyBjb25maWcgJTAyWFxuIiwgb2Zmc2V0LCBjb25maWcpOworCisJYmlvc193cjMyKGJpb3MsIHJlZywgY29uZmlndmFsKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9yZXBlYXQoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfUkVQRUFUICAgb3Bjb2RlOiAweDMzICgnMycpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoOCBiaXQpOiBjb3VudAorCSAqCisJICogRXhlY3V0ZSBzY3JpcHQgZm9sbG93aW5nIHRoaXMgb3Bjb2RlIHVwIHRvIElOSVRfUkVQRUFUX0VORAorCSAqICJjb3VudCIgdGltZXMKKwkgKi8KKworCXVpbnQ4X3QgY291bnQgPSBiaW9zLT5kYXRhW29mZnNldCArIDFdOworCXVpbnQ4X3QgaTsKKworCS8qIG5vIGlleGVjLT5leGVjdXRlIGNoZWNrIGJ5IGRlc2lnbiAqLworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBSZXBlYXRpbmcgZm9sbG93aW5nIHNlZ21lbnQgJWQgdGltZXNcbiIsCisJCW9mZnNldCwgY291bnQpOworCisJaWV4ZWMtPnJlcGVhdCA9IHRydWU7CisKKwkvKgorCSAqIGNvdW50IC0gMSwgYXMgdGhlIHNjcmlwdCBibG9jayB3aWxsIGV4ZWN1dGUgb25jZSB3aGVuIHdlIGxlYXZlIHRoaXMKKwkgKiBvcGNvZGUgLS0gdGhpcyBpcyBjb21wYXRpYmxlIHdpdGggYmlvcyBiZWhhdmlvdXIgYXM6CisJICogYSkgdGhlIGJsb2NrIGlzIGFsd2F5cyBleGVjdXRlZCBhdCBsZWFzdCBvbmNlLCBldmVuIGlmIGNvdW50ID09IDAKKwkgKiBiKSB0aGUgYmlvcyBpbnRlcnByZXRlciBza2lwcyB0byB0aGUgb3AgZm9sbG93aW5nIElOSVRfRU5EX1JFUEVBVCwKKwkgKiB3aGlsZSB3ZSBkb24ndAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBjb3VudCAtIDE7IGkrKykKKwkJcGFyc2VfaW5pdF90YWJsZShiaW9zLCBvZmZzZXQgKyAyLCBpZXhlYyk7CisKKwlpZXhlYy0+cmVwZWF0ID0gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfaW9fcmVzdHJpY3RfcGxsKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwKKwkJICAgICBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfSU9fUkVTVFJJQ1RfUExMICAgb3Bjb2RlOiAweDM0ICgnNCcpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCAgYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDE2IGJpdCk6IENSVEMgcG9ydAorCSAqIG9mZnNldCArIDMgICg4ICBiaXQpOiBDUlRDIGluZGV4CisJICogb2Zmc2V0ICsgNCAgKDggIGJpdCk6IG1hc2sKKwkgKiBvZmZzZXQgKyA1ICAoOCAgYml0KTogc2hpZnQKKwkgKiBvZmZzZXQgKyA2ICAoOCAgYml0KTogSU8gZmxhZyBjb25kaXRpb24gaW5kZXgKKwkgKiBvZmZzZXQgKyA3ICAoOCAgYml0KTogY291bnQKKwkgKiBvZmZzZXQgKyA4ICAoMzIgYml0KTogcmVnaXN0ZXIKKwkgKiBvZmZzZXQgKyAxMiAoMTYgYml0KTogZnJlcXVlbmN5IDEKKwkgKiAuLi4KKwkgKgorCSAqIFN0YXJ0aW5nIGF0IG9mZnNldCArIDEyIHRoZXJlIGFyZSAiY291bnQiIDE2IGJpdCBmcmVxdWVuY2llcyAoMTBrSHopLgorCSAqIFNldCBQTEwgcmVnaXN0ZXIgInJlZ2lzdGVyIiB0byBjb2VmZmljaWVudHMgZm9yIGZyZXF1ZW5jeSBuLAorCSAqIHNlbGVjdGVkIGJ5IHJlYWRpbmcgaW5kZXggIkNSVEMgaW5kZXgiIG9mICJDUlRDIHBvcnQiIEFORGVkIHdpdGgKKwkgKiAibWFzayIgYW5kIHNoaWZ0ZWQgcmlnaHQgYnkgInNoaWZ0Ii4KKwkgKgorCSAqIElmICJJTyBmbGFnIGNvbmRpdGlvbiBpbmRleCIgPiAwLCBhbmQgY29uZGl0aW9uIG1ldCwgZG91YmxlCisJICogZnJlcXVlbmN5IGJlZm9yZSBzZXR0aW5nIGl0LgorCSAqLworCisJdWludDE2X3QgY3J0Y3BvcnQgPSBST00xNihiaW9zLT5kYXRhW29mZnNldCArIDFdKTsKKwl1aW50OF90IGNydGNpbmRleCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgM107CisJdWludDhfdCBtYXNrID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA0XTsKKwl1aW50OF90IHNoaWZ0ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA1XTsKKwlpbnQ4X3QgaW9fZmxhZ19jb25kaXRpb25faWR4ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA2XTsKKwl1aW50OF90IGNvdW50ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA3XTsKKwl1aW50MzJfdCByZWcgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDhdKTsKKwl1aW50OF90IGNvbmZpZzsKKwl1aW50MTZfdCBmcmVxOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IFBvcnQ6IDB4JTA0WCwgSW5kZXg6IDB4JTAyWCwgTWFzazogMHglMDJYLCAiCisJCSAgICAgICJTaGlmdDogMHglMDJYLCBJTyBGbGFnIENvbmRpdGlvbjogMHglMDJYLCAiCisJCSAgICAgICJDb3VudDogMHglMDJYLCBSZWc6IDB4JTA4WFxuIiwKKwkJb2Zmc2V0LCBjcnRjcG9ydCwgY3J0Y2luZGV4LCBtYXNrLCBzaGlmdCwKKwkJaW9fZmxhZ19jb25kaXRpb25faWR4LCBjb3VudCwgcmVnKTsKKworCWNvbmZpZyA9IChiaW9zX2lkeHBydF9yZChiaW9zLCBjcnRjcG9ydCwgY3J0Y2luZGV4KSAmIG1hc2spID4+IHNoaWZ0OworCWlmIChjb25maWcgPiBjb3VudCkgeworCQlOVl9FUlJPUihiaW9zLT5kZXYsCisJCQkgIjB4JTA0WDogQ29uZmlnIDB4JTAyWCBleGNlZWRzIG1heGltYWwgYm91bmQgMHglMDJYXG4iLAorCQkJIG9mZnNldCwgY29uZmlnLCBjb3VudCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlmcmVxID0gUk9NMTYoYmlvcy0+ZGF0YVtvZmZzZXQgKyAxMiArIGNvbmZpZyAqIDJdKTsKKworCWlmIChpb19mbGFnX2NvbmRpdGlvbl9pZHggPiAwKSB7CisJCWlmIChpb19mbGFnX2NvbmRpdGlvbl9tZXQoYmlvcywgb2Zmc2V0LCBpb19mbGFnX2NvbmRpdGlvbl9pZHgpKSB7CisJCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IENvbmRpdGlvbiBmdWxmaWxsZWQgLS0gIgorCQkJCSAgICAgICJmcmVxdWVuY3kgZG91YmxlZFxuIiwgb2Zmc2V0KTsKKwkJCWZyZXEgKj0gMjsKKwkJfSBlbHNlCisJCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IENvbmRpdGlvbiBub3QgZnVsZmlsbGVkIC0tICIKKwkJCQkgICAgICAiZnJlcXVlbmN5IHVuY2hhbmdlZFxuIiwgb2Zmc2V0KTsKKwl9CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IFJlZzogMHglMDhYLCBDb25maWc6IDB4JTAyWCwgRnJlcTogJWQwa0h6XG4iLAorCQlvZmZzZXQsIHJlZywgY29uZmlnLCBmcmVxKTsKKworCXNldFBMTChiaW9zLCByZWcsIGZyZXEgKiAxMCk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfZW5kX3JlcGVhdChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9FTkRfUkVQRUFUICAgb3Bjb2RlOiAweDM2ICgnNicpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCBiaXQpOiBvcGNvZGUKKwkgKgorCSAqIE1hcmtzIHRoZSBlbmQgb2YgdGhlIGJsb2NrIGZvciBJTklUX1JFUEVBVCB0byByZXBlYXQKKwkgKi8KKworCS8qIG5vIGlleGVjLT5leGVjdXRlIGNoZWNrIGJ5IGRlc2lnbiAqLworCisJLyoKKwkgKiBpZXhlYy0+cmVwZWF0IGZsYWcgbmVjZXNzYXJ5IHRvIGdvIHBhc3QgSU5JVF9FTkRfUkVQRUFUIG9wY29kZSB3aGVuCisJICogd2UncmUgbm90IGluIHJlcGVhdCBtb2RlCisJICovCisJaWYgKGlleGVjLT5yZXBlYXQpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9jb3B5KHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX0NPUFkgICBvcGNvZGU6IDB4MzcgKCc3JykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoMzIgYml0KTogcmVnaXN0ZXIKKwkgKiBvZmZzZXQgKyA1ICAoOCAgYml0KTogc2hpZnQKKwkgKiBvZmZzZXQgKyA2ICAoOCAgYml0KTogc3JjbWFzaworCSAqIG9mZnNldCArIDcgICgxNiBiaXQpOiBDUlRDIHBvcnQKKwkgKiBvZmZzZXQgKyA5ICAoOCBiaXQpOiBDUlRDIGluZGV4CisJICogb2Zmc2V0ICsgMTAgICg4IGJpdCk6IG1hc2sKKwkgKgorCSAqIFJlYWQgaW5kZXggIkNSVEMgaW5kZXgiIG9uICJDUlRDIHBvcnQiLCBBTkQgd2l0aCAibWFzayIsIE9SIHdpdGgKKwkgKiAoUkVHVkFMKCJyZWdpc3RlciIpID4+ICJzaGlmdCIgJiAic3JjbWFzayIpIGFuZCB3cml0ZS1iYWNrIHRvIENSVEMKKwkgKiBwb3J0CisJICovCisKKwl1aW50MzJfdCByZWcgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDFdKTsKKwl1aW50OF90IHNoaWZ0ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA1XTsKKwl1aW50OF90IHNyY21hc2sgPSBiaW9zLT5kYXRhW29mZnNldCArIDZdOworCXVpbnQxNl90IGNydGNwb3J0ID0gUk9NMTYoYmlvcy0+ZGF0YVtvZmZzZXQgKyA3XSk7CisJdWludDhfdCBjcnRjaW5kZXggPSBiaW9zLT5kYXRhW29mZnNldCArIDldOworCXVpbnQ4X3QgbWFzayA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMTBdOworCXVpbnQzMl90IGRhdGE7CisJdWludDhfdCBjcnRjZGF0YTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBSZWc6IDB4JTA4WCwgU2hpZnQ6IDB4JTAyWCwgU3JjTWFzazogMHglMDJYLCAiCisJCSAgICAgICJQb3J0OiAweCUwNFgsIEluZGV4OiAweCUwMlgsIE1hc2s6IDB4JTAyWFxuIiwKKwkJb2Zmc2V0LCByZWcsIHNoaWZ0LCBzcmNtYXNrLCBjcnRjcG9ydCwgY3J0Y2luZGV4LCBtYXNrKTsKKworCWRhdGEgPSBiaW9zX3JkMzIoYmlvcywgcmVnKTsKKworCWlmIChzaGlmdCA8IDB4ODApCisJCWRhdGEgPj49IHNoaWZ0OworCWVsc2UKKwkJZGF0YSA8PD0gKDB4MTAwIC0gc2hpZnQpOworCisJZGF0YSAmPSBzcmNtYXNrOworCisJY3J0Y2RhdGEgID0gYmlvc19pZHhwcnRfcmQoYmlvcywgY3J0Y3BvcnQsIGNydGNpbmRleCkgJiBtYXNrOworCWNydGNkYXRhIHw9ICh1aW50OF90KWRhdGE7CisJYmlvc19pZHhwcnRfd3IoYmlvcywgY3J0Y3BvcnQsIGNydGNpbmRleCwgY3J0Y2RhdGEpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X25vdChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9OT1QgICBvcGNvZGU6IDB4MzggKCc4JykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKgorCSAqIEludmVydCB0aGUgY3VycmVudCBleGVjdXRlIC8gbm8tZXhlY3V0ZSBjb25kaXRpb24gKGkuZS4gImVsc2UiKQorCSAqLworCWlmIChpZXhlYy0+ZXhlY3V0ZSkKKwkJQklPU0xPRyhiaW9zLCAiMHglMDRYOiAtLS0tLS0gU2tpcHBpbmcgZm9sbG93aW5nIGNvbW1hbmRzICAtLS0tLS1cbiIsIG9mZnNldCk7CisJZWxzZQorCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IC0tLS0tLSBFeGVjdXRpbmcgZm9sbG93aW5nIGNvbW1hbmRzIC0tLS0tLVxuIiwgb2Zmc2V0KTsKKworCWlleGVjLT5leGVjdXRlID0gIWlleGVjLT5leGVjdXRlOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9pb19mbGFnX2NvbmRpdGlvbihzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsCisJCSAgICAgICBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfSU9fRkxBR19DT05ESVRJT04gICBvcGNvZGU6IDB4MzkgKCc5JykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4IGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICg4IGJpdCk6IGNvbmRpdGlvbiBudW1iZXIKKwkgKgorCSAqIENoZWNrIGNvbmRpdGlvbiAiY29uZGl0aW9uIG51bWJlciIgaW4gdGhlIElPIGZsYWcgY29uZGl0aW9uIHRhYmxlLgorCSAqIElmIGNvbmRpdGlvbiBub3QgbWV0IHNraXAgc3Vic2VxdWVudCBvcGNvZGVzIHVudGlsIGNvbmRpdGlvbiBpcworCSAqIGludmVydGVkIChJTklUX05PVCksIG9yIHdlIGhpdCBJTklUX1JFU1VNRQorCSAqLworCisJdWludDhfdCBjb25kID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJaWYgKGlvX2ZsYWdfY29uZGl0aW9uX21ldChiaW9zLCBvZmZzZXQsIGNvbmQpKQorCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IENvbmRpdGlvbiBmdWxmaWxsZWQgLS0gY29udGludWluZyB0byBleGVjdXRlXG4iLCBvZmZzZXQpOworCWVsc2UgeworCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IENvbmRpdGlvbiBub3QgZnVsZmlsbGVkIC0tIHNraXBwaW5nIGZvbGxvd2luZyBjb21tYW5kc1xuIiwgb2Zmc2V0KTsKKwkJaWV4ZWMtPmV4ZWN1dGUgPSBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfaWR4X2FkZHJfbGF0Y2hlZChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsCisJCSAgICAgIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9JTkRFWF9BRERSRVNTX0xBVENIRUQgICBvcGNvZGU6IDB4NDkgKCdJJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoMzIgYml0KTogY29udHJvbCByZWdpc3RlcgorCSAqIG9mZnNldCArIDUgICgzMiBiaXQpOiBkYXRhIHJlZ2lzdGVyCisJICogb2Zmc2V0ICsgOSAgKDMyIGJpdCk6IG1hc2sKKwkgKiBvZmZzZXQgKyAxMyAoMzIgYml0KTogZGF0YQorCSAqIG9mZnNldCArIDE3ICg4ICBiaXQpOiBjb3VudAorCSAqIG9mZnNldCArIDE4ICg4ICBiaXQpOiBhZGRyZXNzIDEKKwkgKiBvZmZzZXQgKyAxOSAoOCAgYml0KTogZGF0YSAxCisJICogLi4uCisJICoKKwkgKiBGb3IgZWFjaCBvZiAiY291bnQiIGFkZHJlc3MgYW5kIGRhdGEgcGFpcnMsIHdyaXRlICJkYXRhIG4iIHRvCisJICogImRhdGEgcmVnaXN0ZXIiLCByZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mICJjb250cm9sIHJlZ2lzdGVyIiwKKwkgKiBhbmQgd3JpdGUgaXQgYmFjayBvbmNlIEFORGVkIHdpdGggIm1hc2siLCBPUmVkIHdpdGggImRhdGEiLAorCSAqIGFuZCBPUmVkIHdpdGggImFkZHJlc3MgbiIKKwkgKi8KKworCXVpbnQzMl90IGNvbnRyb2xyZWcgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDFdKTsKKwl1aW50MzJfdCBkYXRhcmVnID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyA1XSk7CisJdWludDMyX3QgbWFzayA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgOV0pOworCXVpbnQzMl90IGRhdGEgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDEzXSk7CisJdWludDhfdCBjb3VudCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMTddOworCXVpbnQzMl90IHZhbHVlOworCWludCBpOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IENvbnRyb2xSZWc6IDB4JTA4WCwgRGF0YVJlZzogMHglMDhYLCAiCisJCSAgICAgICJNYXNrOiAweCUwOFgsIERhdGE6IDB4JTA4WCwgQ291bnQ6IDB4JTAyWFxuIiwKKwkJb2Zmc2V0LCBjb250cm9scmVnLCBkYXRhcmVnLCBtYXNrLCBkYXRhLCBjb3VudCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQl1aW50OF90IGluc3RhZGRyZXNzID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxOCArIGkgKiAyXTsKKwkJdWludDhfdCBpbnN0ZGF0YSA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMTkgKyBpICogMl07CisKKwkJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBBZGRyZXNzOiAweCUwMlgsIERhdGE6IDB4JTAyWFxuIiwKKwkJCW9mZnNldCwgaW5zdGFkZHJlc3MsIGluc3RkYXRhKTsKKworCQliaW9zX3dyMzIoYmlvcywgZGF0YXJlZywgaW5zdGRhdGEpOworCQl2YWx1ZSAgPSBiaW9zX3JkMzIoYmlvcywgY29udHJvbHJlZykgJiBtYXNrOworCQl2YWx1ZSB8PSBkYXRhOworCQl2YWx1ZSB8PSBpbnN0YWRkcmVzczsKKwkJYmlvc193cjMyKGJpb3MsIGNvbnRyb2xyZWcsIHZhbHVlKTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfaW9fcmVzdHJpY3RfcGxsMihzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsCisJCSAgICAgIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9JT19SRVNUUklDVF9QTEwyICAgb3Bjb2RlOiAweDRBICgnSicpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCAgYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDE2IGJpdCk6IENSVEMgcG9ydAorCSAqIG9mZnNldCArIDMgICg4ICBiaXQpOiBDUlRDIGluZGV4CisJICogb2Zmc2V0ICsgNCAgKDggIGJpdCk6IG1hc2sKKwkgKiBvZmZzZXQgKyA1ICAoOCAgYml0KTogc2hpZnQKKwkgKiBvZmZzZXQgKyA2ICAoOCAgYml0KTogY291bnQKKwkgKiBvZmZzZXQgKyA3ICAoMzIgYml0KTogcmVnaXN0ZXIKKwkgKiBvZmZzZXQgKyAxMSAoMzIgYml0KTogZnJlcXVlbmN5IDEKKwkgKiAuLi4KKwkgKgorCSAqIFN0YXJ0aW5nIGF0IG9mZnNldCArIDExIHRoZXJlIGFyZSAiY291bnQiIDMyIGJpdCBmcmVxdWVuY2llcyAoa0h6KS4KKwkgKiBTZXQgUExMIHJlZ2lzdGVyICJyZWdpc3RlciIgdG8gY29lZmZpY2llbnRzIGZvciBmcmVxdWVuY3kgbiwKKwkgKiBzZWxlY3RlZCBieSByZWFkaW5nIGluZGV4ICJDUlRDIGluZGV4IiBvZiAiQ1JUQyBwb3J0IiBBTkRlZCB3aXRoCisJICogIm1hc2siIGFuZCBzaGlmdGVkIHJpZ2h0IGJ5ICJzaGlmdCIuCisJICovCisKKwl1aW50MTZfdCBjcnRjcG9ydCA9IFJPTTE2KGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV0pOworCXVpbnQ4X3QgY3J0Y2luZGV4ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAzXTsKKwl1aW50OF90IG1hc2sgPSBiaW9zLT5kYXRhW29mZnNldCArIDRdOworCXVpbnQ4X3Qgc2hpZnQgPSBiaW9zLT5kYXRhW29mZnNldCArIDVdOworCXVpbnQ4X3QgY291bnQgPSBiaW9zLT5kYXRhW29mZnNldCArIDZdOworCXVpbnQzMl90IHJlZyA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgN10pOworCXVpbnQ4X3QgY29uZmlnOworCXVpbnQzMl90IGZyZXE7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogUG9ydDogMHglMDRYLCBJbmRleDogMHglMDJYLCBNYXNrOiAweCUwMlgsICIKKwkJICAgICAgIlNoaWZ0OiAweCUwMlgsIENvdW50OiAweCUwMlgsIFJlZzogMHglMDhYXG4iLAorCQlvZmZzZXQsIGNydGNwb3J0LCBjcnRjaW5kZXgsIG1hc2ssIHNoaWZ0LCBjb3VudCwgcmVnKTsKKworCWlmICghcmVnKQorCQlyZXR1cm4gdHJ1ZTsKKworCWNvbmZpZyA9IChiaW9zX2lkeHBydF9yZChiaW9zLCBjcnRjcG9ydCwgY3J0Y2luZGV4KSAmIG1hc2spID4+IHNoaWZ0OworCWlmIChjb25maWcgPiBjb3VudCkgeworCQlOVl9FUlJPUihiaW9zLT5kZXYsCisJCQkgIjB4JTA0WDogQ29uZmlnIDB4JTAyWCBleGNlZWRzIG1heGltYWwgYm91bmQgMHglMDJYXG4iLAorCQkJIG9mZnNldCwgY29uZmlnLCBjb3VudCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlmcmVxID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyAxMSArIGNvbmZpZyAqIDRdKTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogUmVnOiAweCUwOFgsIENvbmZpZzogMHglMDJYLCBGcmVxOiAlZGtIelxuIiwKKwkJb2Zmc2V0LCByZWcsIGNvbmZpZywgZnJlcSk7CisKKwlzZXRQTEwoYmlvcywgcmVnLCBmcmVxKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9wbGwyKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX1BMTDIgICBvcGNvZGU6IDB4NEIgKCdLJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoMzIgYml0KTogcmVnaXN0ZXIKKwkgKiBvZmZzZXQgKyA1ICAoMzIgYml0KTogZnJlcQorCSAqCisJICogU2V0IFBMTCByZWdpc3RlciAicmVnaXN0ZXIiIHRvIGNvZWZmaWNpZW50cyBmb3IgZnJlcXVlbmN5ICJmcmVxIgorCSAqLworCisJdWludDMyX3QgcmVnID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXSk7CisJdWludDMyX3QgZnJlcSA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgNV0pOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IFJlZzogMHglMDRYLCBGcmVxOiAlZGtIelxuIiwKKwkJb2Zmc2V0LCByZWcsIGZyZXEpOworCisJc2V0UExMKGJpb3MsIHJlZywgZnJlcSk7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X2kyY19ieXRlKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX0kyQ19CWVRFICAgb3Bjb2RlOiAweDRDICgnTCcpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoOCBiaXQpOiBEQ0IgSTJDIHRhYmxlIGVudHJ5IGluZGV4CisJICogb2Zmc2V0ICsgMiAgKDggYml0KTogSTJDIHNsYXZlIGFkZHJlc3MKKwkgKiBvZmZzZXQgKyAzICAoOCBiaXQpOiBjb3VudAorCSAqIG9mZnNldCArIDQgICg4IGJpdCk6IEkyQyByZWdpc3RlciAxCisJICogb2Zmc2V0ICsgNSAgKDggYml0KTogbWFzayAxCisJICogb2Zmc2V0ICsgNiAgKDggYml0KTogZGF0YSAxCisJICogLi4uCisJICoKKwkgKiBGb3IgZWFjaCBvZiAiY291bnQiIHJlZ2lzdGVycyBnaXZlbiBieSAiSTJDIHJlZ2lzdGVyIG4iIG9uIHRoZSBkZXZpY2UKKwkgKiBhZGRyZXNzZWQgYnkgIkkyQyBzbGF2ZSBhZGRyZXNzIiBvbiB0aGUgSTJDIGJ1cyBnaXZlbiBieQorCSAqICJEQ0IgSTJDIHRhYmxlIGVudHJ5IGluZGV4IiwgcmVhZCB0aGUgcmVnaXN0ZXIsIEFORCB0aGUgcmVzdWx0IHdpdGgKKwkgKiAibWFzayBuIiBhbmQgT1IgaXQgd2l0aCAiZGF0YSBuIiBiZWZvcmUgd3JpdGluZyBpdCBiYWNrIHRvIHRoZSBkZXZpY2UKKwkgKi8KKworCXVpbnQ4X3QgaTJjX2luZGV4ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXTsKKwl1aW50OF90IGkyY19hZGRyZXNzID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAyXTsKKwl1aW50OF90IGNvdW50ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAzXTsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqY2hhbjsKKwlzdHJ1Y3QgaTJjX21zZyBtc2c7CisJaW50IGk7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogRENCSTJDSW5kZXg6IDB4JTAyWCwgSTJDQWRkcmVzczogMHglMDJYLCAiCisJCSAgICAgICJDb3VudDogMHglMDJYXG4iLAorCQlvZmZzZXQsIGkyY19pbmRleCwgaTJjX2FkZHJlc3MsIGNvdW50KTsKKworCWNoYW4gPSBpbml0X2kyY19kZXZpY2VfZmluZChiaW9zLT5kZXYsIGkyY19pbmRleCk7CisJaWYgKCFjaGFuKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQl1aW50OF90IGkyY19yZWcgPSBiaW9zLT5kYXRhW29mZnNldCArIDQgKyBpICogM107CisJCXVpbnQ4X3QgbWFzayA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNSArIGkgKiAzXTsKKwkJdWludDhfdCBkYXRhID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA2ICsgaSAqIDNdOworCQl1aW50OF90IHZhbHVlOworCisJCW1zZy5hZGRyID0gaTJjX2FkZHJlc3M7CisJCW1zZy5mbGFncyA9IEkyQ19NX1JEOworCQltc2cubGVuID0gMTsKKwkJbXNnLmJ1ZiA9ICZ2YWx1ZTsKKwkJaWYgKGkyY190cmFuc2ZlcigmY2hhbi0+YWRhcHRlciwgJm1zZywgMSkgIT0gMSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IEkyQ1JlZzogMHglMDJYLCBWYWx1ZTogMHglMDJYLCAiCisJCQkgICAgICAiTWFzazogMHglMDJYLCBEYXRhOiAweCUwMlhcbiIsCisJCQlvZmZzZXQsIGkyY19yZWcsIHZhbHVlLCBtYXNrLCBkYXRhKTsKKworCQl2YWx1ZSA9ICh2YWx1ZSAmIG1hc2spIHwgZGF0YTsKKworCQlpZiAoYmlvcy0+ZXhlY3V0ZSkgeworCQkJbXNnLmFkZHIgPSBpMmNfYWRkcmVzczsKKwkJCW1zZy5mbGFncyA9IDA7CisJCQltc2cubGVuID0gMTsKKwkJCW1zZy5idWYgPSAmdmFsdWU7CisJCQlpZiAoaTJjX3RyYW5zZmVyKCZjaGFuLT5hZGFwdGVyLCAmbXNnLCAxKSAhPSAxKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF96bV9pMmNfYnl0ZShzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9aTV9JMkNfQllURSAgIG9wY29kZTogMHg0RCAoJ00nKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDggYml0KTogRENCIEkyQyB0YWJsZSBlbnRyeSBpbmRleAorCSAqIG9mZnNldCArIDIgICg4IGJpdCk6IEkyQyBzbGF2ZSBhZGRyZXNzCisJICogb2Zmc2V0ICsgMyAgKDggYml0KTogY291bnQKKwkgKiBvZmZzZXQgKyA0ICAoOCBiaXQpOiBJMkMgcmVnaXN0ZXIgMQorCSAqIG9mZnNldCArIDUgICg4IGJpdCk6IGRhdGEgMQorCSAqIC4uLgorCSAqCisJICogRm9yIGVhY2ggb2YgImNvdW50IiByZWdpc3RlcnMgZ2l2ZW4gYnkgIkkyQyByZWdpc3RlciBuIiBvbiB0aGUgZGV2aWNlCisJICogYWRkcmVzc2VkIGJ5ICJJMkMgc2xhdmUgYWRkcmVzcyIgb24gdGhlIEkyQyBidXMgZ2l2ZW4gYnkKKwkgKiAiRENCIEkyQyB0YWJsZSBlbnRyeSBpbmRleCIsIHNldCB0aGUgcmVnaXN0ZXIgdG8gImRhdGEgbiIKKwkgKi8KKworCXVpbnQ4X3QgaTJjX2luZGV4ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXTsKKwl1aW50OF90IGkyY19hZGRyZXNzID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAyXTsKKwl1aW50OF90IGNvdW50ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAzXTsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqY2hhbjsKKwlzdHJ1Y3QgaTJjX21zZyBtc2c7CisJaW50IGk7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogRENCSTJDSW5kZXg6IDB4JTAyWCwgSTJDQWRkcmVzczogMHglMDJYLCAiCisJCSAgICAgICJDb3VudDogMHglMDJYXG4iLAorCQlvZmZzZXQsIGkyY19pbmRleCwgaTJjX2FkZHJlc3MsIGNvdW50KTsKKworCWNoYW4gPSBpbml0X2kyY19kZXZpY2VfZmluZChiaW9zLT5kZXYsIGkyY19pbmRleCk7CisJaWYgKCFjaGFuKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQl1aW50OF90IGkyY19yZWcgPSBiaW9zLT5kYXRhW29mZnNldCArIDQgKyBpICogMl07CisJCXVpbnQ4X3QgZGF0YSA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNSArIGkgKiAyXTsKKworCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IEkyQ1JlZzogMHglMDJYLCBEYXRhOiAweCUwMlhcbiIsCisJCQlvZmZzZXQsIGkyY19yZWcsIGRhdGEpOworCisJCWlmIChiaW9zLT5leGVjdXRlKSB7CisJCQltc2cuYWRkciA9IGkyY19hZGRyZXNzOworCQkJbXNnLmZsYWdzID0gMDsKKwkJCW1zZy5sZW4gPSAxOworCQkJbXNnLmJ1ZiA9ICZkYXRhOworCQkJaWYgKGkyY190cmFuc2ZlcigmY2hhbi0+YWRhcHRlciwgJm1zZywgMSkgIT0gMSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfem1faTJjKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX1pNX0kyQyAgIG9wY29kZTogMHg0RSAoJ04nKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDggYml0KTogRENCIEkyQyB0YWJsZSBlbnRyeSBpbmRleAorCSAqIG9mZnNldCArIDIgICg4IGJpdCk6IEkyQyBzbGF2ZSBhZGRyZXNzCisJICogb2Zmc2V0ICsgMyAgKDggYml0KTogY291bnQKKwkgKiBvZmZzZXQgKyA0ICAoOCBiaXQpOiBkYXRhIDEKKwkgKiAuLi4KKwkgKgorCSAqIFNlbmQgImNvdW50IiBieXRlcyAoImRhdGEgbiIpIHRvIHRoZSBkZXZpY2UgYWRkcmVzc2VkIGJ5ICJJMkMgc2xhdmUKKwkgKiBhZGRyZXNzIiBvbiB0aGUgSTJDIGJ1cyBnaXZlbiBieSAiRENCIEkyQyB0YWJsZSBlbnRyeSBpbmRleCIKKwkgKi8KKworCXVpbnQ4X3QgaTJjX2luZGV4ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXTsKKwl1aW50OF90IGkyY19hZGRyZXNzID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAyXTsKKwl1aW50OF90IGNvdW50ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAzXTsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqY2hhbjsKKwlzdHJ1Y3QgaTJjX21zZyBtc2c7CisJdWludDhfdCBkYXRhWzI1Nl07CisJaW50IGk7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogRENCSTJDSW5kZXg6IDB4JTAyWCwgSTJDQWRkcmVzczogMHglMDJYLCAiCisJCSAgICAgICJDb3VudDogMHglMDJYXG4iLAorCQlvZmZzZXQsIGkyY19pbmRleCwgaTJjX2FkZHJlc3MsIGNvdW50KTsKKworCWNoYW4gPSBpbml0X2kyY19kZXZpY2VfZmluZChiaW9zLT5kZXYsIGkyY19pbmRleCk7CisJaWYgKCFjaGFuKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlkYXRhW2ldID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA0ICsgaV07CisKKwkJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBEYXRhOiAweCUwMlhcbiIsIG9mZnNldCwgZGF0YVtpXSk7CisJfQorCisJaWYgKGJpb3MtPmV4ZWN1dGUpIHsKKwkJbXNnLmFkZHIgPSBpMmNfYWRkcmVzczsKKwkJbXNnLmZsYWdzID0gMDsKKwkJbXNnLmxlbiA9IGNvdW50OworCQltc2cuYnVmID0gZGF0YTsKKwkJaWYgKGkyY190cmFuc2ZlcigmY2hhbi0+YWRhcHRlciwgJm1zZywgMSkgIT0gMSkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfdG1kcyhzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9UTURTICAgb3Bjb2RlOiAweDRGICgnTycpCShub24tY2Fub24gbmFtZSkKKwkgKgorCSAqIG9mZnNldCAgICAgICg4IGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICg4IGJpdCk6IG1hZ2ljIGxvb2t1cCB2YWx1ZQorCSAqIG9mZnNldCArIDIgICg4IGJpdCk6IFRNRFMgYWRkcmVzcworCSAqIG9mZnNldCArIDMgICg4IGJpdCk6IG1hc2sKKwkgKiBvZmZzZXQgKyA0ICAoOCBiaXQpOiBkYXRhCisJICoKKwkgKiBSZWFkIHRoZSBkYXRhIHJlZyBmb3IgVE1EUyBhZGRyZXNzICJUTURTIGFkZHJlc3MiLCBBTkQgaXQgd2l0aCBtYXNrCisJICogYW5kIE9SIGl0IHdpdGggZGF0YSwgdGhlbiB3cml0ZSBpdCBiYWNrCisJICogIm1hZ2ljIGxvb2t1cCB2YWx1ZSIgZGV0ZXJtaW5lcyB3aGljaCBUTURTIGJhc2UgYWRkcmVzcyByZWdpc3RlciBpcworCSAqIHVzZWQgLS0gc2VlIGdldF90bWRzX2luZGV4X3JlZygpCisJICovCisKKwl1aW50OF90IG1sdiA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV07CisJdWludDMyX3QgdG1kc2FkZHIgPSBiaW9zLT5kYXRhW29mZnNldCArIDJdOworCXVpbnQ4X3QgbWFzayA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgM107CisJdWludDhfdCBkYXRhID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA0XTsKKwl1aW50MzJfdCByZWcsIHZhbHVlOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IE1hZ2ljTG9va3VwVmFsdWU6IDB4JTAyWCwgVE1EU0FkZHI6IDB4JTAyWCwgIgorCQkgICAgICAiTWFzazogMHglMDJYLCBEYXRhOiAweCUwMlhcbiIsCisJCW9mZnNldCwgbWx2LCB0bWRzYWRkciwgbWFzaywgZGF0YSk7CisKKwlyZWcgPSBnZXRfdG1kc19pbmRleF9yZWcoYmlvcy0+ZGV2LCBtbHYpOworCWlmICghcmVnKQorCQlyZXR1cm4gZmFsc2U7CisKKwliaW9zX3dyMzIoYmlvcywgcmVnLAorCQkgIHRtZHNhZGRyIHwgTlZfUFJBTURBQ19GUF9UTURTX0NPTlRST0xfV1JJVEVfRElTQUJMRSk7CisJdmFsdWUgPSAoYmlvc19yZDMyKGJpb3MsIHJlZyArIDQpICYgbWFzaykgfCBkYXRhOworCWJpb3Nfd3IzMihiaW9zLCByZWcgKyA0LCB2YWx1ZSk7CisJYmlvc193cjMyKGJpb3MsIHJlZywgdG1kc2FkZHIpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X3ptX3RtZHNfZ3JvdXAoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LAorCQkgICBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfWk1fVE1EU19HUk9VUCAgIG9wY29kZTogMHg1MCAoJ1AnKQkobm9uLWNhbm9uIG5hbWUpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoOCBiaXQpOiBtYWdpYyBsb29rdXAgdmFsdWUKKwkgKiBvZmZzZXQgKyAyICAoOCBiaXQpOiBjb3VudAorCSAqIG9mZnNldCArIDMgICg4IGJpdCk6IGFkZHIgMQorCSAqIG9mZnNldCArIDQgICg4IGJpdCk6IGRhdGEgMQorCSAqIC4uLgorCSAqCisJICogRm9yIGVhY2ggb2YgImNvdW50IiBUTURTIGFkZHJlc3MgYW5kIGRhdGEgcGFpcnMgd3JpdGUgImRhdGEgbiIgdG8KKwkgKiAiYWRkciBuIi4gICJtYWdpYyBsb29rdXAgdmFsdWUiIGRldGVybWluZXMgd2hpY2ggVE1EUyBiYXNlIGFkZHJlc3MKKwkgKiByZWdpc3RlciBpcyB1c2VkIC0tIHNlZSBnZXRfdG1kc19pbmRleF9yZWcoKQorCSAqLworCisJdWludDhfdCBtbHYgPSBiaW9zLT5kYXRhW29mZnNldCArIDFdOworCXVpbnQ4X3QgY291bnQgPSBiaW9zLT5kYXRhW29mZnNldCArIDJdOworCXVpbnQzMl90IHJlZzsKKwlpbnQgaTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBNYWdpY0xvb2t1cFZhbHVlOiAweCUwMlgsIENvdW50OiAweCUwMlhcbiIsCisJCW9mZnNldCwgbWx2LCBjb3VudCk7CisKKwlyZWcgPSBnZXRfdG1kc19pbmRleF9yZWcoYmlvcy0+ZGV2LCBtbHYpOworCWlmICghcmVnKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQl1aW50OF90IHRtZHNhZGRyID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAzICsgaSAqIDJdOworCQl1aW50OF90IHRtZHNkYXRhID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA0ICsgaSAqIDJdOworCisJCWJpb3Nfd3IzMihiaW9zLCByZWcgKyA0LCB0bWRzZGF0YSk7CisJCWJpb3Nfd3IzMihiaW9zLCByZWcsIHRtZHNhZGRyKTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfY3JfaWR4X2Fkcl9sYXRjaChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsCisJCSAgICAgIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9DUl9JTkRFWF9BRERSRVNTX0xBVENIRUQgICBvcGNvZGU6IDB4NTEgKCdRJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4IGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICg4IGJpdCk6IENSVEMgaW5kZXgxCisJICogb2Zmc2V0ICsgMiAgKDggYml0KTogQ1JUQyBpbmRleDIKKwkgKiBvZmZzZXQgKyAzICAoOCBiaXQpOiBiYXNlYWRkcgorCSAqIG9mZnNldCArIDQgICg4IGJpdCk6IGNvdW50CisJICogb2Zmc2V0ICsgNSAgKDggYml0KTogZGF0YSAxCisJICogLi4uCisJICoKKwkgKiBGb3IgZWFjaCBvZiAiY291bnQiIGFkZHJlc3MgYW5kIGRhdGEgcGFpcnMsIHdyaXRlICJiYXNlYWRkciArIG4iIHRvCisJICogIkNSVEMgaW5kZXgxIiBhbmQgImRhdGEgbiIgdG8gIkNSVEMgaW5kZXgyIgorCSAqIE9uY2UgY29tcGxldGUsIHJlc3RvcmUgaW5pdGlhbCB2YWx1ZSByZWFkIGZyb20gIkNSVEMgaW5kZXgxIgorCSAqLworCXVpbnQ4X3QgY3J0Y2luZGV4MSA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV07CisJdWludDhfdCBjcnRjaW5kZXgyID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAyXTsKKwl1aW50OF90IGJhc2VhZGRyID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAzXTsKKwl1aW50OF90IGNvdW50ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA0XTsKKwl1aW50OF90IG9sZGFkZHIsIGRhdGE7CisJaW50IGk7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogSW5kZXgxOiAweCUwMlgsIEluZGV4MjogMHglMDJYLCAiCisJCSAgICAgICJCYXNlQWRkcjogMHglMDJYLCBDb3VudDogMHglMDJYXG4iLAorCQlvZmZzZXQsIGNydGNpbmRleDEsIGNydGNpbmRleDIsIGJhc2VhZGRyLCBjb3VudCk7CisKKwlvbGRhZGRyID0gYmlvc19pZHhwcnRfcmQoYmlvcywgTlZfQ0lPX0NSWF9fQ09MT1IsIGNydGNpbmRleDEpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJYmlvc19pZHhwcnRfd3IoYmlvcywgTlZfQ0lPX0NSWF9fQ09MT1IsIGNydGNpbmRleDEsCisJCQkJICAgICBiYXNlYWRkciArIGkpOworCQlkYXRhID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA1ICsgaV07CisJCWJpb3NfaWR4cHJ0X3dyKGJpb3MsIE5WX0NJT19DUlhfX0NPTE9SLCBjcnRjaW5kZXgyLCBkYXRhKTsKKwl9CisKKwliaW9zX2lkeHBydF93cihiaW9zLCBOVl9DSU9fQ1JYX19DT0xPUiwgY3J0Y2luZGV4MSwgb2xkYWRkcik7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfY3Ioc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfQ1IgICBvcGNvZGU6IDB4NTIgKCdSJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoOCAgYml0KTogQ1JUQyBpbmRleAorCSAqIG9mZnNldCArIDIgICg4ICBiaXQpOiBtYXNrCisJICogb2Zmc2V0ICsgMyAgKDggIGJpdCk6IGRhdGEKKwkgKgorCSAqIEFzc2lnbiB0aGUgdmFsdWUgb2YgYXQgIkNSVEMgaW5kZXgiIEFORGVkIHdpdGggbWFzayBhbmQgT1JlZCB3aXRoCisJICogZGF0YSBiYWNrIHRvICJDUlRDIGluZGV4IgorCSAqLworCisJdWludDhfdCBjcnRjaW5kZXggPSBiaW9zLT5kYXRhW29mZnNldCArIDFdOworCXVpbnQ4X3QgbWFzayA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMl07CisJdWludDhfdCBkYXRhID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAzXTsKKwl1aW50OF90IHZhbHVlOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IEluZGV4OiAweCUwMlgsIE1hc2s6IDB4JTAyWCwgRGF0YTogMHglMDJYXG4iLAorCQlvZmZzZXQsIGNydGNpbmRleCwgbWFzaywgZGF0YSk7CisKKwl2YWx1ZSAgPSBiaW9zX2lkeHBydF9yZChiaW9zLCBOVl9DSU9fQ1JYX19DT0xPUiwgY3J0Y2luZGV4KSAmIG1hc2s7CisJdmFsdWUgfD0gZGF0YTsKKwliaW9zX2lkeHBydF93cihiaW9zLCBOVl9DSU9fQ1JYX19DT0xPUiwgY3J0Y2luZGV4LCB2YWx1ZSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfem1fY3Ioc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfWk1fQ1IgICBvcGNvZGU6IDB4NTMgKCdTJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4IGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICg4IGJpdCk6IENSVEMgaW5kZXgKKwkgKiBvZmZzZXQgKyAyICAoOCBiaXQpOiB2YWx1ZQorCSAqCisJICogQXNzaWduICJ2YWx1ZSIgdG8gQ1JUQyByZWdpc3RlciB3aXRoIGluZGV4ICJDUlRDIGluZGV4Ii4KKwkgKi8KKworCXVpbnQ4X3QgY3J0Y2luZGV4ID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXSk7CisJdWludDhfdCBkYXRhID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAyXTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJYmlvc19pZHhwcnRfd3IoYmlvcywgTlZfQ0lPX0NSWF9fQ09MT1IsIGNydGNpbmRleCwgZGF0YSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfem1fY3JfZ3JvdXAoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfWk1fQ1JfR1JPVVAgICBvcGNvZGU6IDB4NTQgKCdUJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4IGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICg4IGJpdCk6IGNvdW50CisJICogb2Zmc2V0ICsgMiAgKDggYml0KTogQ1JUQyBpbmRleCAxCisJICogb2Zmc2V0ICsgMyAgKDggYml0KTogdmFsdWUgMQorCSAqIC4uLgorCSAqCisJICogRm9yICJjb3VudCIsIGFzc2lnbiAidmFsdWUgbiIgdG8gQ1JUQyByZWdpc3RlciB3aXRoIGluZGV4CisJICogIkNSVEMgaW5kZXggbiIuCisJICovCisKKwl1aW50OF90IGNvdW50ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXTsKKwlpbnQgaTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCWluaXRfem1fY3IoYmlvcywgb2Zmc2V0ICsgMiArIDIgKiBpIC0gMSwgaWV4ZWMpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X2NvbmRpdGlvbl90aW1lKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwKKwkJICAgIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9DT05ESVRJT05fVElNRSAgIG9wY29kZTogMHg1NiAoJ1YnKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDggYml0KTogY29uZGl0aW9uIG51bWJlcgorCSAqIG9mZnNldCArIDIgICg4IGJpdCk6IHJldHJpZXMgLyA1MAorCSAqCisJICogQ2hlY2sgY29uZGl0aW9uICJjb25kaXRpb24gbnVtYmVyIiBpbiB0aGUgY29uZGl0aW9uIHRhYmxlLgorCSAqIEJpb3MgY29kZSB0aGVuIHNsZWVwcyBmb3IgMm1zIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldCwgYW5kCisJICogcmVwZWF0cyB1cCB0byAicmV0cmllcyIgdGltZXMsIGJ1dCBvbiBvbmUgQzUxIHRoaXMgaGFzIHByb3ZlZAorCSAqIGluc3VmZmljaWVudC4gIEluIG1taW90cmFjZXMgdGhlIGRyaXZlciBzbGVlcHMgZm9yIDIwbXMsIHNvIHdlIGRvCisJICogdGhpcywgYW5kIGJhaWwgYWZ0ZXIgInJldHJpZXMiIHRpbWVzLCBvciAycywgd2hpY2hldmVyIGlzIGxlc3MuCisJICogSWYgc3RpbGwgbm90IG1ldCBhZnRlciByZXRyaWVzLCBjbGVhciBleGVjdXRpb24gZmxhZyBmb3IgdGhpcyB0YWJsZS4KKwkgKi8KKworCXVpbnQ4X3QgY29uZCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV07CisJdWludDE2X3QgcmV0cmllcyA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMl0gKiA1MDsKKwl1bnNpZ25lZCBjbnQ7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmIChyZXRyaWVzID4gMTAwKQorCQlyZXRyaWVzID0gMTAwOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBDb25kaXRpb246IDB4JTAyWCwgUmV0cmllczogMHglMDJYXG4iLAorCQlvZmZzZXQsIGNvbmQsIHJldHJpZXMpOworCisJaWYgKCFiaW9zLT5leGVjdXRlKSAvKiBhdm9pZCAycyBkZWxheXMgd2hlbiAiZmFraW5nIiBleGVjdXRpb24gKi8KKwkJcmV0cmllcyA9IDE7CisKKwlmb3IgKGNudCA9IDA7IGNudCA8IHJldHJpZXM7IGNudCsrKSB7CisJCWlmIChiaW9zX2NvbmRpdGlvbl9tZXQoYmlvcywgb2Zmc2V0LCBjb25kKSkgeworCQkJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBDb25kaXRpb24gbWV0LCBjb250aW51aW5nXG4iLAorCQkJCQkJCQlvZmZzZXQpOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6ICIKKwkJCQkiQ29uZGl0aW9uIG5vdCBtZXQsIHNsZWVwaW5nIGZvciAyMG1zXG4iLAorCQkJCQkJCQlvZmZzZXQpOworCQkJbXNsZWVwKDIwKTsKKwkJfQorCX0KKworCWlmICghYmlvc19jb25kaXRpb25fbWV0KGJpb3MsIG9mZnNldCwgY29uZCkpIHsKKwkJTlZfV0FSTihiaW9zLT5kZXYsCisJCQkiMHglMDRYOiBDb25kaXRpb24gc3RpbGwgbm90IG1ldCBhZnRlciAlZG1zLCAiCisJCQkic2tpcHBpbmcgZm9sbG93aW5nIG9wY29kZXNcbiIsIG9mZnNldCwgMjAgKiByZXRyaWVzKTsKKwkJaWV4ZWMtPmV4ZWN1dGUgPSBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfem1fcmVnX3NlcXVlbmNlKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwKKwkJICAgICBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfWk1fUkVHX1NFUVVFTkNFICAgb3Bjb2RlOiAweDU4ICgnWCcpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCAgYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDMyIGJpdCk6IGJhc2UgcmVnaXN0ZXIKKwkgKiBvZmZzZXQgKyA1ICAoOCAgYml0KTogY291bnQKKwkgKiBvZmZzZXQgKyA2ICAoMzIgYml0KTogdmFsdWUgMQorCSAqIC4uLgorCSAqCisJICogU3RhcnRpbmcgYXQgb2Zmc2V0ICsgNiB0aGVyZSBhcmUgImNvdW50IiAzMiBiaXQgdmFsdWVzLgorCSAqIEZvciAiY291bnQiIGl0ZXJhdGlvbnMgc2V0ICJiYXNlIHJlZ2lzdGVyIiArIDQgKiBjdXJyZW50X2l0ZXJhdGlvbgorCSAqIHRvICJ2YWx1ZSBjdXJyZW50X2l0ZXJhdGlvbiIKKwkgKi8KKworCXVpbnQzMl90IGJhc2VyZWcgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDFdKTsKKwl1aW50MzJfdCBjb3VudCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNV07CisJaW50IGk7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogQmFzZVJlZzogMHglMDhYLCBDb3VudDogMHglMDJYXG4iLAorCQlvZmZzZXQsIGJhc2VyZWcsIGNvdW50KTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXVpbnQzMl90IHJlZyA9IGJhc2VyZWcgKyBpICogNDsKKwkJdWludDMyX3QgZGF0YSA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgNiArIGkgKiA0XSk7CisKKwkJYmlvc193cjMyKGJpb3MsIHJlZywgZGF0YSk7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X3N1Yl9kaXJlY3Qoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfU1VCX0RJUkVDVCAgIG9wY29kZTogMHg1QiAoJ1snKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggIGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICgxNiBiaXQpOiBzdWJyb3V0aW5lIG9mZnNldCAoaW4gYmlvcykKKwkgKgorCSAqIENhbGxzIGEgc3Vicm91dGluZSB0aGF0IHdpbGwgZXhlY3V0ZSBjb21tYW5kcyB1bnRpbCBJTklUX0RPTkUKKwkgKiBpcyBmb3VuZC4KKwkgKi8KKworCXVpbnQxNl90IHN1Yl9vZmZzZXQgPSBST00xNihiaW9zLT5kYXRhW29mZnNldCArIDFdKTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBFeGVjdXRpbmcgc3Vicm91dGluZSBhdCAweCUwNFhcbiIsCisJCW9mZnNldCwgc3ViX29mZnNldCk7CisKKwlwYXJzZV9pbml0X3RhYmxlKGJpb3MsIHN1Yl9vZmZzZXQsIGlleGVjKTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogRW5kIG9mIDB4JTA0WCBzdWJyb3V0aW5lXG4iLCBvZmZzZXQsIHN1Yl9vZmZzZXQpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X2NvcHlfbnZfcmVnKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX0NPUFlfTlZfUkVHICAgb3Bjb2RlOiAweDVGICgnXycpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCAgYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDMyIGJpdCk6IHNyYyByZWcKKwkgKiBvZmZzZXQgKyA1ICAoOCAgYml0KTogc2hpZnQKKwkgKiBvZmZzZXQgKyA2ICAoMzIgYml0KTogc3JjIG1hc2sKKwkgKiBvZmZzZXQgKyAxMCAoMzIgYml0KTogeG9yCisJICogb2Zmc2V0ICsgMTQgKDMyIGJpdCk6IGRzdCByZWcKKwkgKiBvZmZzZXQgKyAxOCAoMzIgYml0KTogZHN0IG1hc2sKKwkgKgorCSAqIFNoaWZ0IFJFR1ZBTCgic3JjIHJlZyIpIHJpZ2h0IGJ5IChzaWduZWQpICJzaGlmdCIsIEFORCByZXN1bHQgd2l0aAorCSAqICJzcmMgbWFzayIsIHRoZW4gWE9SIHdpdGggInhvciIuIFdyaXRlIHRoaXMgT1InZCB3aXRoCisJICogKFJFR1ZBTCgiZHN0IHJlZyIpIEFORCdkIHdpdGggImRzdCBtYXNrIikgdG8gImRzdCByZWciCisJICovCisKKwl1aW50MzJfdCBzcmNyZWcgPSAqKCh1aW50MzJfdCAqKSgmYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXSkpOworCXVpbnQ4X3Qgc2hpZnQgPSBiaW9zLT5kYXRhW29mZnNldCArIDVdOworCXVpbnQzMl90IHNyY21hc2sgPSAqKCh1aW50MzJfdCAqKSgmYmlvcy0+ZGF0YVtvZmZzZXQgKyA2XSkpOworCXVpbnQzMl90IHhvciA9ICooKHVpbnQzMl90ICopKCZiaW9zLT5kYXRhW29mZnNldCArIDEwXSkpOworCXVpbnQzMl90IGRzdHJlZyA9ICooKHVpbnQzMl90ICopKCZiaW9zLT5kYXRhW29mZnNldCArIDE0XSkpOworCXVpbnQzMl90IGRzdG1hc2sgPSAqKCh1aW50MzJfdCAqKSgmYmlvcy0+ZGF0YVtvZmZzZXQgKyAxOF0pKTsKKwl1aW50MzJfdCBzcmN2YWx1ZSwgZHN0dmFsdWU7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogU3JjUmVnOiAweCUwOFgsIFNoaWZ0OiAweCUwMlgsIFNyY01hc2s6IDB4JTA4WCwgIgorCQkgICAgICAiWG9yOiAweCUwOFgsIERzdFJlZzogMHglMDhYLCBEc3RNYXNrOiAweCUwOFhcbiIsCisJCW9mZnNldCwgc3JjcmVnLCBzaGlmdCwgc3JjbWFzaywgeG9yLCBkc3RyZWcsIGRzdG1hc2spOworCisJc3JjdmFsdWUgPSBiaW9zX3JkMzIoYmlvcywgc3JjcmVnKTsKKworCWlmIChzaGlmdCA8IDB4ODApCisJCXNyY3ZhbHVlID4+PSBzaGlmdDsKKwllbHNlCisJCXNyY3ZhbHVlIDw8PSAoMHgxMDAgLSBzaGlmdCk7CisKKwlzcmN2YWx1ZSA9IChzcmN2YWx1ZSAmIHNyY21hc2spIF4geG9yOworCisJZHN0dmFsdWUgPSBiaW9zX3JkMzIoYmlvcywgZHN0cmVnKSAmIGRzdG1hc2s7CisKKwliaW9zX3dyMzIoYmlvcywgZHN0cmVnLCBkc3R2YWx1ZSB8IHNyY3ZhbHVlKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF96bV9pbmRleF9pbyhzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9aTV9JTkRFWF9JTyAgIG9wY29kZTogMHg2MiAoJ2InKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggIGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICgxNiBiaXQpOiBDUlRDIHBvcnQKKwkgKiBvZmZzZXQgKyAzICAoOCAgYml0KTogQ1JUQyBpbmRleAorCSAqIG9mZnNldCArIDQgICg4ICBiaXQpOiBkYXRhCisJICoKKwkgKiBXcml0ZSAiZGF0YSIgdG8gaW5kZXggIkNSVEMgaW5kZXgiIG9mICJDUlRDIHBvcnQiCisJICovCisJdWludDE2X3QgY3J0Y3BvcnQgPSBST00xNihiaW9zLT5kYXRhW29mZnNldCArIDFdKTsKKwl1aW50OF90IGNydGNpbmRleCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgM107CisJdWludDhfdCBkYXRhID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA0XTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJYmlvc19pZHhwcnRfd3IoYmlvcywgY3J0Y3BvcnQsIGNydGNpbmRleCwgZGF0YSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfY29tcHV0ZV9tZW0oc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfQ09NUFVURV9NRU0gICBvcGNvZGU6IDB4NjMgKCdjJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4IGJpdCk6IG9wY29kZQorCSAqCisJICogVGhpcyBvcGNvZGUgaXMgbWVhbnQgdG8gc2V0IE5WX1BGQl9DRkcwICgweDEwMDIwMCkgYXBwcm9wcmlhdGVseSBzbworCSAqIHRoYXQgdGhlIGhhcmR3YXJlIGNhbiBjb3JyZWN0bHkgY2FsY3VsYXRlIGhvdyBtdWNoIFZSQU0gaXQgaGFzCisJICogKGFuZCBzdWJzZXF1ZW50bHkgcmVwb3J0IHRoYXQgdmFsdWUgaW4gTlZfUEZCX0NTVEFUVVMgKDB4MTAwMjBDKSkKKwkgKgorCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG9wY29kZSBpbiBnZW5lcmFsIGNvbnNpc3RzIG9mIHR3byBwYXJ0czoKKwkgKiAxKSBkZXRlcm1pbmF0aW9uIG9mIHRoZSBtZW1vcnkgYnVzIHdpZHRoCisJICogMikgZGV0ZXJtaW5hdGlvbiBvZiBob3cgbWFueSBvZiB0aGUgY2FyZCdzIFJBTSBwYWRzIGhhdmUgSUNzIGF0dGFjaGVkCisJICoKKwkgKiAxKSBpcyBkb25lIGJ5IGEgY3VubmluZyBjb21iaW5hdGlvbiBvZiB3cml0ZXMgdG8gb2Zmc2V0cyAweDFjIGFuZAorCSAqIDB4M2MgaW4gdGhlIGZyYW1lYnVmZmVyLCBhbmQgc2VlaW5nIHdoZXRoZXIgdGhlIHdyaXR0ZW4gdmFsdWVzIGFyZQorCSAqIHJlYWQgYmFjayBjb3JyZWN0bHkuIFRoaXMgdGhlbiBhZmZlY3RzIGJpdHMgNC03IG9mIE5WX1BGQl9DRkcwCisJICoKKwkgKiAyKSBpcyBkb25lIGJ5IGEgY3VubmluZyBjb21iaW5hdGlvbiBvZiB3cml0ZXMgdG8gYW4gb2Zmc2V0IHNsaWdodGx5CisJICogbGVzcyB0aGFuIHRoZSBtYXhpbXVtIG1lbW9yeSByZXBvcnRlZCBieSBOVl9QRkJfQ1NUQVRVUywgdGhlbiBzZWVpbmcKKwkgKiBpZiB0aGUgdGVzdCBwYXR0ZXJuIGNhbiBiZSByZWFkIGJhY2suIFRoaXMgdGhlbiBhZmZlY3RzIGJpdHMgMTItMTUgb2YKKwkgKiBOVl9QRkJfQ0ZHMAorCSAqCisJICogSW4gdGhpcyBjb250ZXh0IGEgImN1bm5pbmcgY29tYmluYXRpb24iIG1heSBpbmNsdWRlIG11bHRpcGxlIHJlYWRzCisJICogYW5kIHdyaXRlcyB0byB2YXJ5aW5nIGxvY2F0aW9ucywgb2Z0ZW4gYWx0ZXJuYXRpbmcgdGhlIHRlc3QgcGF0dGVybgorCSAqIGFuZCAwLCBkb3VidGxlc3MgdG8gbWFrZSBzdXJlIGJ1ZmZlcnMgYXJlIGZpbGxlZCwgcmVzaWR1YWwgY2hhcmdlcworCSAqIG9uIHRyYWNrcyBhcmUgcmVtb3ZlZCBldGMuCisJICoKKwkgKiBVbmZvcnR1bmF0ZWx5LCB0aGUgImN1bm5pbmcgY29tYmluYXRpb24icyBtZW50aW9uZWQgYWJvdmUsIGFuZCB0aGUKKwkgKiBjaGFuZ2VzIHRvIHRoZSBiaXRzIGluIE5WX1BGQl9DRkcwIGRpZmZlciB3aXRoIG5lYXJseSBldmVyeSBiaW9zCisJICogdHJhY2UgSSBoYXZlLgorCSAqCisJICogVGhlcmVmb3JlLCB3ZSBjaGVhdCBhbmQgYXNzdW1lIHRoZSB2YWx1ZSBvZiBOVl9QRkJfQ0ZHMCB3aXRoIHdoaWNoCisJICogd2Ugc3RhcnRlZCB3YXMgY29ycmVjdCwgYW5kIHVzZSB0aGF0IGluc3RlYWQKKwkgKi8KKworCS8qIG5vIGlleGVjLT5leGVjdXRlIGNoZWNrIGJ5IGRlc2lnbiAqLworCisJLyoKKwkgKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSBOT1Agb24gRzh4IGNoaXBzZXRzLCBib3RoIGlvIGxvZ3Mgb2YgdGhlIFZCSU9TCisJICogYW5kIGttbWlvIHRyYWNlcyBvZiB0aGUgYmluYXJ5IGRyaXZlciBQT1NUaW5nIHRoZSBjYXJkIHNob3cgbm90aGluZworCSAqIGJlaW5nIGRvbmUgZm9yIHRoaXMgb3Bjb2RlLiAgd2h5IGlzIGl0IHN0aWxsIGxpc3RlZCBpbiB0aGUgdGFibGU/IQorCSAqLworCisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gYmlvcy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qCisJICogT24gZXZlcnkgY2FyZCBJJ3ZlIHNlZW4sIHRoaXMgc3RlcCBnZXRzIGRvbmUgZm9yIHVzIGVhcmxpZXIgaW4KKwkgKiB0aGUgaW5pdCBzY3JpcHRzCisJdWludDhfdCBjcmRhdGEgPSBiaW9zX2lkeHBydF9yZChkZXYsIE5WX1ZJT19TUlgsIDB4MDEpOworCWJpb3NfaWR4cHJ0X3dyKGRldiwgTlZfVklPX1NSWCwgMHgwMSwgY3JkYXRhIHwgMHgyMCk7CisJICovCisKKwkvKgorCSAqIFRoaXMgYWxzbyBoYXMgcHJvYmFibHkgYmVlbiBkb25lIGluIHRoZSBzY3JpcHRzLCBidXQgYW4gbW1pbyB0cmFjZSBvZgorCSAqIHMzIHJlc3VtZSBzaG93cyBudmlkaWEgZG9pbmcgaXQgYW55d2F5ICh1bmxpa2UgdGhlIE5WX1ZJT19TUlggd3JpdGUpCisJICovCisJYmlvc193cjMyKGJpb3MsIE5WX1BGQl9SRUZDVFJMLCBOVl9QRkJfUkVGQ1RSTF9WQUxJRF8xKTsKKworCS8qIHdyaXRlIGJhY2sgdGhlIHNhdmVkIGNvbmZpZ3VyYXRpb24gdmFsdWUgKi8KKwliaW9zX3dyMzIoYmlvcywgTlZfUEZCX0NGRzAsIGJpb3MtPnN0YXRlLnNhdmVkX252X3BmYl9jZmcwKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9yZXNldChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9SRVNFVCAgIG9wY29kZTogMHg2NSAoJ2UnKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggIGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICgzMiBiaXQpOiByZWdpc3RlcgorCSAqIG9mZnNldCArIDUgICgzMiBiaXQpOiB2YWx1ZTEKKwkgKiBvZmZzZXQgKyA5ICAoMzIgYml0KTogdmFsdWUyCisJICoKKwkgKiBBc3NpZ24gInZhbHVlMSIgdG8gInJlZ2lzdGVyIiwgdGhlbiBhc3NpZ24gInZhbHVlMiIgdG8gInJlZ2lzdGVyIgorCSAqLworCisJdWludDMyX3QgcmVnID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXSk7CisJdWludDMyX3QgdmFsdWUxID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyA1XSk7CisJdWludDMyX3QgdmFsdWUyID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyA5XSk7CisJdWludDMyX3QgcGNpX252XzE5LCBwY2lfbnZfMjA7CisKKwkvKiBubyBpZXhlYy0+ZXhlY3V0ZSBjaGVjayBieSBkZXNpZ24gKi8KKworCXBjaV9udl8xOSA9IGJpb3NfcmQzMihiaW9zLCBOVl9QQlVTX1BDSV9OVl8xOSk7CisJYmlvc193cjMyKGJpb3MsIE5WX1BCVVNfUENJX05WXzE5LCAwKTsKKwliaW9zX3dyMzIoYmlvcywgcmVnLCB2YWx1ZTEpOworCisJdWRlbGF5KDEwKTsKKworCWJpb3Nfd3IzMihiaW9zLCByZWcsIHZhbHVlMik7CisJYmlvc193cjMyKGJpb3MsIE5WX1BCVVNfUENJX05WXzE5LCBwY2lfbnZfMTkpOworCisJcGNpX252XzIwID0gYmlvc19yZDMyKGJpb3MsIE5WX1BCVVNfUENJX05WXzIwKTsKKwlwY2lfbnZfMjAgJj0gfk5WX1BCVVNfUENJX05WXzIwX1JPTV9TSEFET1dfRU5BQkxFRDsJLyogMHhmZmZmZmZmZSAqLworCWJpb3Nfd3IzMihiaW9zLCBOVl9QQlVTX1BDSV9OVl8yMCwgcGNpX252XzIwKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9jb25maWd1cmVfbWVtKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwKKwkJICAgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX0NPTkZJR1VSRV9NRU0gICBvcGNvZGU6IDB4NjYgKCdmJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4IGJpdCk6IG9wY29kZQorCSAqCisJICogRXF1aXZhbGVudCB0byBJTklUX0RPTkUgb24gYmlvcyB2ZXJzaW9uIDMgb3IgZ3JlYXRlci4KKwkgKiBGb3IgZWFybHkgYmlvcyB2ZXJzaW9ucywgc2V0cyB1cCB0aGUgbWVtb3J5IHJlZ2lzdGVycywgdXNpbmcgdmFsdWVzCisJICogdGFrZW4gZnJvbSB0aGUgbWVtb3J5IGluaXQgdGFibGUKKwkgKi8KKworCS8qIG5vIGlleGVjLT5leGVjdXRlIGNoZWNrIGJ5IGRlc2lnbiAqLworCisJdWludDE2X3QgbWVtaW5pdG9mZnMgPSBiaW9zLT5sZWdhY3kubWVtX2luaXRfdGJsX3B0ciArIE1FTV9JTklUX1NJWkUgKiAoYmlvc19pZHhwcnRfcmQoYmlvcywgTlZfQ0lPX0NSWF9fQ09MT1IsIE5WX0NJT19DUkVfU0NSQVRDSDRfX0lOREVYKSA+PiA0KTsKKwl1aW50MTZfdCBzZXF0YmxvZmZzID0gYmlvcy0+bGVnYWN5LnNkcl9zZXFfdGJsX3B0ciwgbWVtaW5pdGRhdGEgPSBtZW1pbml0b2ZmcyArIDY7CisJdWludDMyX3QgcmVnLCBkYXRhOworCisJaWYgKGJpb3MtPm1ham9yX3ZlcnNpb24gPiAyKQorCQlyZXR1cm4gZmFsc2U7CisKKwliaW9zX2lkeHBydF93cihiaW9zLCBOVl9WSU9fU1JYLCBOVl9WSU9fU1JfQ0xPQ0tfSU5ERVgsIGJpb3NfaWR4cHJ0X3JkKAorCQkgICAgICAgYmlvcywgTlZfVklPX1NSWCwgTlZfVklPX1NSX0NMT0NLX0lOREVYKSB8IDB4MjApOworCisJaWYgKGJpb3MtPmRhdGFbbWVtaW5pdG9mZnNdICYgMSkKKwkJc2VxdGJsb2ZmcyA9IGJpb3MtPmxlZ2FjeS5kZHJfc2VxX3RibF9wdHI7CisKKwlmb3IgKHJlZyA9IFJPTTMyKGJpb3MtPmRhdGFbc2VxdGJsb2Zmc10pOworCSAgICAgcmVnICE9IDB4ZmZmZmZmZmY7CisJICAgICByZWcgPSBST00zMihiaW9zLT5kYXRhW3NlcXRibG9mZnMgKz0gNF0pKSB7CisKKwkJc3dpdGNoIChyZWcpIHsKKwkJY2FzZSBOVl9QRkJfUFJFOgorCQkJZGF0YSA9IE5WX1BGQl9QUkVfQ01EX1BSRUNIQVJHRTsKKwkJCWJyZWFrOworCQljYXNlIE5WX1BGQl9QQUQ6CisJCQlkYXRhID0gTlZfUEZCX1BBRF9DS0VfTk9STUFMOworCQkJYnJlYWs7CisJCWNhc2UgTlZfUEZCX1JFRjoKKwkJCWRhdGEgPSBOVl9QRkJfUkVGX0NNRF9SRUZSRVNIOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkYXRhID0gUk9NMzIoYmlvcy0+ZGF0YVttZW1pbml0ZGF0YV0pOworCQkJbWVtaW5pdGRhdGEgKz0gNDsKKwkJCWlmIChkYXRhID09IDB4ZmZmZmZmZmYpCisJCQkJY29udGludWU7CisJCX0KKworCQliaW9zX3dyMzIoYmlvcywgcmVnLCBkYXRhKTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfY29uZmlndXJlX2NsayhzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsCisJCSAgIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9DT05GSUdVUkVfQ0xLICAgb3Bjb2RlOiAweDY3ICgnZycpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCBiaXQpOiBvcGNvZGUKKwkgKgorCSAqIEVxdWl2YWxlbnQgdG8gSU5JVF9ET05FIG9uIGJpb3MgdmVyc2lvbiAzIG9yIGdyZWF0ZXIuCisJICogRm9yIGVhcmx5IGJpb3MgdmVyc2lvbnMsIHNldHMgdXAgdGhlIE5WQ2xrIGFuZCBNQ2xrIFBMTHMsIHVzaW5nCisJICogdmFsdWVzIHRha2VuIGZyb20gdGhlIG1lbW9yeSBpbml0IHRhYmxlCisJICovCisKKwkvKiBubyBpZXhlYy0+ZXhlY3V0ZSBjaGVjayBieSBkZXNpZ24gKi8KKworCXVpbnQxNl90IG1lbWluaXRvZmZzID0gYmlvcy0+bGVnYWN5Lm1lbV9pbml0X3RibF9wdHIgKyBNRU1fSU5JVF9TSVpFICogKGJpb3NfaWR4cHJ0X3JkKGJpb3MsIE5WX0NJT19DUlhfX0NPTE9SLCBOVl9DSU9fQ1JFX1NDUkFUQ0g0X19JTkRFWCkgPj4gNCk7CisJaW50IGNsb2NrOworCisJaWYgKGJpb3MtPm1ham9yX3ZlcnNpb24gPiAyKQorCQlyZXR1cm4gZmFsc2U7CisKKwljbG9jayA9IFJPTTE2KGJpb3MtPmRhdGFbbWVtaW5pdG9mZnMgKyA0XSkgKiAxMDsKKwlzZXRQTEwoYmlvcywgTlZfUFJBTURBQ19OVlBMTF9DT0VGRiwgY2xvY2spOworCisJY2xvY2sgPSBST00xNihiaW9zLT5kYXRhW21lbWluaXRvZmZzICsgMl0pICogMTA7CisJaWYgKGJpb3MtPmRhdGFbbWVtaW5pdG9mZnNdICYgMSkgLyogRERSICovCisJCWNsb2NrICo9IDI7CisJc2V0UExMKGJpb3MsIE5WX1BSQU1EQUNfTVBMTF9DT0VGRiwgY2xvY2spOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X2NvbmZpZ3VyZV9wcmVpbml0KHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwKKwkJICAgICAgIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9DT05GSUdVUkVfUFJFSU5JVCAgIG9wY29kZTogMHg2OCAoJ2gnKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggYml0KTogb3Bjb2RlCisJICoKKwkgKiBFcXVpdmFsZW50IHRvIElOSVRfRE9ORSBvbiBiaW9zIHZlcnNpb24gMyBvciBncmVhdGVyLgorCSAqIEZvciBlYXJseSBiaW9zIHZlcnNpb25zLCBkb2VzIGVhcmx5IGluaXQsIGxvYWRpbmcgcmFtIGFuZCBjcnlzdGFsCisJICogY29uZmlndXJhdGlvbiBmcm9tIHN0cmFwcyBpbnRvIENSM0MKKwkgKi8KKworCS8qIG5vIGlleGVjLT5leGVjdXRlIGNoZWNrIGJ5IGRlc2lnbiAqLworCisJdWludDMyX3Qgc3RyYXBzID0gYmlvc19yZDMyKGJpb3MsIE5WX1BFWFRERVZfQk9PVF8wKTsKKwl1aW50OF90IGNyM2MgPSAoKHN0cmFwcyA8PCAyKSAmIDB4ZjApIHwgKHN0cmFwcyAmICgxIDw8IDYpKTsKKworCWlmIChiaW9zLT5tYWpvcl92ZXJzaW9uID4gMikKKwkJcmV0dXJuIGZhbHNlOworCisJYmlvc19pZHhwcnRfd3IoYmlvcywgTlZfQ0lPX0NSWF9fQ09MT1IsCisJCQkgICAgIE5WX0NJT19DUkVfU0NSQVRDSDRfX0lOREVYLCBjcjNjKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9pbyhzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9JTyAgIG9wY29kZTogMHg2OSAoJ2knKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggIGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICgxNiBiaXQpOiBDUlRDIHBvcnQKKwkgKiBvZmZzZXQgKyAzICAoOCAgYml0KTogbWFzaworCSAqIG9mZnNldCArIDQgICg4ICBiaXQpOiBkYXRhCisJICoKKwkgKiBBc3NpZ24gKChJT1ZBTCgiY3J0YyBwb3J0IikgJiAibWFzayIpIHwgImRhdGEiKSB0byAiY3J0YyBwb3J0IgorCSAqLworCisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gYmlvcy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MTZfdCBjcnRjcG9ydCA9IFJPTTE2KGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV0pOworCXVpbnQ4X3QgbWFzayA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgM107CisJdWludDhfdCBkYXRhID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA0XTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBQb3J0OiAweCUwNFgsIE1hc2s6IDB4JTAyWCwgRGF0YTogMHglMDJYXG4iLAorCQlvZmZzZXQsIGNydGNwb3J0LCBtYXNrLCBkYXRhKTsKKworCS8qCisJICogSSBoYXZlIG5vIGlkZWEgd2hhdCB0aGlzIGRvZXMsIGJ1dCBOVklESUEgZG8gdGhpcyBtYWdpYyBzZXF1ZW5jZQorCSAqIGluIHRoZSBwbGFjZXMgd2hlcmUgdGhpcyBJTklUX0lPIGhhcHBlbnMuLgorCSAqLworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwICYmIGNydGNwb3J0ID09IDB4M2MzICYmIGRhdGEgPT0gMSkgeworCQlpbnQgaTsKKworCQliaW9zX3dyMzIoYmlvcywgMHg2MTQxMDAsIChiaW9zX3JkMzIoCisJCQkgIGJpb3MsIDB4NjE0MTAwKSAmIDB4MGZmZmZmZmYpIHwgMHgwMDgwMDAwMCk7CisKKwkJYmlvc193cjMyKGJpb3MsIDB4MDBlMThjLCBiaW9zX3JkMzIoCisJCQkgIGJpb3MsIDB4MDBlMThjKSB8IDB4MDAwMjAwMDApOworCisJCWJpb3Nfd3IzMihiaW9zLCAweDYxNDkwMCwgKGJpb3NfcmQzMigKKwkJCSAgYmlvcywgMHg2MTQ5MDApICYgMHgwZmZmZmZmZikgfCAweDAwODAwMDAwKTsKKworCQliaW9zX3dyMzIoYmlvcywgMHgwMDAyMDAsIGJpb3NfcmQzMigKKwkJCSAgYmlvcywgMHgwMDAyMDApICYgfjB4NDAwMDAwMDApOworCisJCW1kZWxheSgxMCk7CisKKwkJYmlvc193cjMyKGJpb3MsIDB4MDBlMThjLCBiaW9zX3JkMzIoCisJCQkgIGJpb3MsIDB4MDBlMThjKSAmIH4weDAwMDIwMDAwKTsKKworCQliaW9zX3dyMzIoYmlvcywgMHgwMDAyMDAsIGJpb3NfcmQzMigKKwkJCSAgYmlvcywgMHgwMDAyMDApIHwgMHg0MDAwMDAwMCk7CisKKwkJYmlvc193cjMyKGJpb3MsIDB4NjE0MTAwLCAweDAwODAwMDE4KTsKKwkJYmlvc193cjMyKGJpb3MsIDB4NjE0OTAwLCAweDAwODAwMDE4KTsKKworCQltZGVsYXkoMTApOworCisJCWJpb3Nfd3IzMihiaW9zLCAweDYxNDEwMCwgMHgxMDAwMDAxOCk7CisJCWJpb3Nfd3IzMihiaW9zLCAweDYxNDkwMCwgMHgxMDAwMDAxOCk7CisKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCWJpb3Nfd3IzMihiaW9zLCAweDYxNDI4MCArIChpKjB4ODAwKSwgYmlvc19yZDMyKAorCQkJCSAgYmlvcywgMHg2MTQyODAgKyAoaSoweDgwMCkpICYgMHhmMGYwZjBmMCk7CisKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJCWJpb3Nfd3IzMihiaW9zLCAweDYxNDMwMCArIChpKjB4ODAwKSwgYmlvc19yZDMyKAorCQkJCSAgYmlvcywgMHg2MTQzMDAgKyAoaSoweDgwMCkpICYgMHhmZmZmZjBmMCk7CisKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCWJpb3Nfd3IzMihiaW9zLCAweDYxNDM4MCArIChpKjB4ODAwKSwgYmlvc19yZDMyKAorCQkJCSAgYmlvcywgMHg2MTQzODAgKyAoaSoweDgwMCkpICYgMHhmZmZmZjBmMCk7CisKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJCWJpb3Nfd3IzMihiaW9zLCAweDYxNDIwMCArIChpKjB4ODAwKSwgYmlvc19yZDMyKAorCQkJCSAgYmlvcywgMHg2MTQyMDAgKyAoaSoweDgwMCkpICYgMHhmZmZmZmZmMCk7CisKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJCWJpb3Nfd3IzMihiaW9zLCAweDYxNDEwOCArIChpKjB4ODAwKSwgYmlvc19yZDMyKAorCQkJCSAgYmlvcywgMHg2MTQxMDggKyAoaSoweDgwMCkpICYgMHgwZmZmZmZmZik7CisJCXJldHVybiB0cnVlOworCX0KKworCWJpb3NfcG9ydF93cihiaW9zLCBjcnRjcG9ydCwgKGJpb3NfcG9ydF9yZChiaW9zLCBjcnRjcG9ydCkgJiBtYXNrKSB8CisJCQkJCQkJCQlkYXRhKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfc3ViKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX1NVQiAgIG9wY29kZTogMHg2QiAoJ2snKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDggYml0KTogc2NyaXB0IG51bWJlcgorCSAqCisJICogRXhlY3V0ZSBzY3JpcHQgbnVtYmVyICJzY3JpcHQgbnVtYmVyIiwgYXMgYSBzdWJyb3V0aW5lCisJICovCisKKwl1aW50OF90IHN1YiA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV07CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogQ2FsbGluZyBzY3JpcHQgJWRcbiIsIG9mZnNldCwgc3ViKTsKKworCXBhcnNlX2luaXRfdGFibGUoYmlvcywKKwkJCSBST00xNihiaW9zLT5kYXRhW2Jpb3MtPmluaXRfc2NyaXB0X3RibHNfcHRyICsgc3ViICogMl0pLAorCQkJIGlleGVjKTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogRW5kIG9mIHNjcmlwdCAlZFxuIiwgb2Zmc2V0LCBzdWIpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X3JhbV9jb25kaXRpb24oc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LAorCQkgICBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfUkFNX0NPTkRJVElPTiAgIG9wY29kZTogMHg2RCAoJ20nKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDggYml0KTogbWFzaworCSAqIG9mZnNldCArIDIgICg4IGJpdCk6IGNtcHZhbAorCSAqCisJICogVGVzdCBpZiAoTlZfUEZCX0JPT1RfMCAmICJtYXNrIikgZXF1YWxzICJjbXB2YWwiLgorCSAqIElmIGNvbmRpdGlvbiBub3QgbWV0IHNraXAgc3Vic2VxdWVudCBvcGNvZGVzIHVudGlsIGNvbmRpdGlvbiBpcworCSAqIGludmVydGVkIChJTklUX05PVCksIG9yIHdlIGhpdCBJTklUX1JFU1VNRQorCSAqLworCisJdWludDhfdCBtYXNrID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXTsKKwl1aW50OF90IGNtcHZhbCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMl07CisJdWludDhfdCBkYXRhOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlkYXRhID0gYmlvc19yZDMyKGJpb3MsIE5WX1BGQl9CT09UXzApICYgbWFzazsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogQ2hlY2tpbmcgaWYgMHglMDhYIGVxdWFscyAweCUwOFhcbiIsCisJCW9mZnNldCwgZGF0YSwgY21wdmFsKTsKKworCWlmIChkYXRhID09IGNtcHZhbCkKKwkJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBDb25kaXRpb24gZnVsZmlsbGVkIC0tIGNvbnRpbnVpbmcgdG8gZXhlY3V0ZVxuIiwgb2Zmc2V0KTsKKwllbHNlIHsKKwkJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBDb25kaXRpb24gbm90IGZ1bGZpbGxlZCAtLSBza2lwcGluZyBmb2xsb3dpbmcgY29tbWFuZHNcbiIsIG9mZnNldCk7CisJCWlleGVjLT5leGVjdXRlID0gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X252X3JlZyhzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9OVl9SRUcgICBvcGNvZGU6IDB4NkUgKCduJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoMzIgYml0KTogcmVnaXN0ZXIKKwkgKiBvZmZzZXQgKyA1ICAoMzIgYml0KTogbWFzaworCSAqIG9mZnNldCArIDkgICgzMiBiaXQpOiBkYXRhCisJICoKKwkgKiBBc3NpZ24gKChSRUdWQUwoInJlZ2lzdGVyIikgJiAibWFzayIpIHwgImRhdGEiKSB0byAicmVnaXN0ZXIiCisJICovCisKKwl1aW50MzJfdCByZWcgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDFdKTsKKwl1aW50MzJfdCBtYXNrID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyA1XSk7CisJdWludDMyX3QgZGF0YSA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgOV0pOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IFJlZzogMHglMDhYLCBNYXNrOiAweCUwOFgsIERhdGE6IDB4JTA4WFxuIiwKKwkJb2Zmc2V0LCByZWcsIG1hc2ssIGRhdGEpOworCisJYmlvc193cjMyKGJpb3MsIHJlZywgKGJpb3NfcmQzMihiaW9zLCByZWcpICYgbWFzaykgfCBkYXRhKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9tYWNybyhzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9NQUNSTyAgIG9wY29kZTogMHg2RiAoJ28nKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDggYml0KTogbWFjcm8gbnVtYmVyCisJICoKKwkgKiBMb29rIHVwIG1hY3JvIGluZGV4ICJtYWNybyBudW1iZXIiIGluIHRoZSBtYWNybyBpbmRleCB0YWJsZS4KKwkgKiBUaGUgbWFjcm8gaW5kZXggdGFibGUgZW50cnkgaGFzIDEgYnl0ZSBmb3IgdGhlIGluZGV4IGluIHRoZSBtYWNybworCSAqIHRhYmxlLCBhbmQgMSBieXRlIGZvciB0aGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgbWFjcm8uCisJICogVGhlIG1hY3JvIHRhYmxlIGVudHJ5IGhhcyA0IGJ5dGVzIGZvciB0aGUgcmVnaXN0ZXIgYWRkcmVzcyBhbmQKKwkgKiA0IGJ5dGVzIGZvciB0aGUgdmFsdWUgdG8gd3JpdGUgdG8gdGhhdCByZWdpc3RlcgorCSAqLworCisJdWludDhfdCBtYWNyb19pbmRleF90YmxfaWR4ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXTsKKwl1aW50MTZfdCB0bXAgPSBiaW9zLT5tYWNyb19pbmRleF90YmxfcHRyICsgKG1hY3JvX2luZGV4X3RibF9pZHggKiBNQUNST19JTkRFWF9TSVpFKTsKKwl1aW50OF90IG1hY3JvX3RibF9pZHggPSBiaW9zLT5kYXRhW3RtcF07CisJdWludDhfdCBjb3VudCA9IGJpb3MtPmRhdGFbdG1wICsgMV07CisJdWludDMyX3QgcmVnLCBkYXRhOworCWludCBpOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IE1hY3JvOiAweCUwMlgsIE1hY3JvVGFibGVJbmRleDogMHglMDJYLCAiCisJCSAgICAgICJDb3VudDogMHglMDJYXG4iLAorCQlvZmZzZXQsIG1hY3JvX2luZGV4X3RibF9pZHgsIG1hY3JvX3RibF9pZHgsIGNvdW50KTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXVpbnQxNl90IG1hY3JvZW50cnlwdHIgPSBiaW9zLT5tYWNyb190YmxfcHRyICsgKG1hY3JvX3RibF9pZHggKyBpKSAqIE1BQ1JPX1NJWkU7CisKKwkJcmVnID0gUk9NMzIoYmlvcy0+ZGF0YVttYWNyb2VudHJ5cHRyXSk7CisJCWRhdGEgPSBST00zMihiaW9zLT5kYXRhW21hY3JvZW50cnlwdHIgKyA0XSk7CisKKwkJYmlvc193cjMyKGJpb3MsIHJlZywgZGF0YSk7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X2RvbmUoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfRE9ORSAgIG9wY29kZTogMHg3MSAoJ3EnKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggIGJpdCk6IG9wY29kZQorCSAqCisJICogRW5kIHRoZSBjdXJyZW50IHNjcmlwdAorCSAqLworCisJLyogbWlsZCByZXR2YWwgYWJ1c2UgdG8gc3RvcCBwYXJzaW5nIHRoaXMgdGFibGUgKi8KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sCitpbml0X3Jlc3VtZShzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9SRVNVTUUgICBvcGNvZGU6IDB4NzIgKCdyJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKgorCSAqIEVuZCB0aGUgY3VycmVudCBleGVjdXRlIC8gbm8tZXhlY3V0ZSBjb25kaXRpb24KKwkgKi8KKworCWlmIChpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZXhlYy0+ZXhlY3V0ZSA9IHRydWU7CisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiAtLS0tIEV4ZWN1dGluZyBmb2xsb3dpbmcgY29tbWFuZHMgLS0tLVxuIiwgb2Zmc2V0KTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF90aW1lKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX1RJTUUgICBvcGNvZGU6IDB4NzQgKCd0JykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoMTYgYml0KTogdGltZQorCSAqCisJICogU2xlZXAgZm9yICJ0aW1lIiBtaWNyb3NlY29uZHMuCisJICovCisKKwl1bnNpZ25lZCB0aW1lID0gUk9NMTYoYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXSk7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogU2xlZXBpbmcgZm9yIDB4JTA0WCBtaWNyb3NlY29uZHNcbiIsCisJCW9mZnNldCwgdGltZSk7CisKKwlpZiAodGltZSA8IDEwMDApCisJCXVkZWxheSh0aW1lKTsKKwllbHNlCisJCW1zbGVlcCgodGltZSArIDkwMCkgLyAxMDAwKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9jb25kaXRpb24oc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfQ09ORElUSU9OICAgb3Bjb2RlOiAweDc1ICgndScpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoOCBiaXQpOiBjb25kaXRpb24gbnVtYmVyCisJICoKKwkgKiBDaGVjayBjb25kaXRpb24gImNvbmRpdGlvbiBudW1iZXIiIGluIHRoZSBjb25kaXRpb24gdGFibGUuCisJICogSWYgY29uZGl0aW9uIG5vdCBtZXQgc2tpcCBzdWJzZXF1ZW50IG9wY29kZXMgdW50aWwgY29uZGl0aW9uIGlzCisJICogaW52ZXJ0ZWQgKElOSVRfTk9UKSwgb3Igd2UgaGl0IElOSVRfUkVTVU1FCisJICovCisKKwl1aW50OF90IGNvbmQgPSBiaW9zLT5kYXRhW29mZnNldCArIDFdOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IENvbmRpdGlvbjogMHglMDJYXG4iLCBvZmZzZXQsIGNvbmQpOworCisJaWYgKGJpb3NfY29uZGl0aW9uX21ldChiaW9zLCBvZmZzZXQsIGNvbmQpKQorCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IENvbmRpdGlvbiBmdWxmaWxsZWQgLS0gY29udGludWluZyB0byBleGVjdXRlXG4iLCBvZmZzZXQpOworCWVsc2UgeworCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IENvbmRpdGlvbiBub3QgZnVsZmlsbGVkIC0tIHNraXBwaW5nIGZvbGxvd2luZyBjb21tYW5kc1xuIiwgb2Zmc2V0KTsKKwkJaWV4ZWMtPmV4ZWN1dGUgPSBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfaW9fY29uZGl0aW9uKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX0lPX0NPTkRJVElPTiAgb3Bjb2RlOiAweDc2CisJICoKKwkgKiBvZmZzZXQgICAgICAoOCBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoOCBiaXQpOiBjb25kaXRpb24gbnVtYmVyCisJICoKKwkgKiBDaGVjayBjb25kaXRpb24gImNvbmRpdGlvbiBudW1iZXIiIGluIHRoZSBpbyBjb25kaXRpb24gdGFibGUuCisJICogSWYgY29uZGl0aW9uIG5vdCBtZXQgc2tpcCBzdWJzZXF1ZW50IG9wY29kZXMgdW50aWwgY29uZGl0aW9uIGlzCisJICogaW52ZXJ0ZWQgKElOSVRfTk9UKSwgb3Igd2UgaGl0IElOSVRfUkVTVU1FCisJICovCisKKwl1aW50OF90IGNvbmQgPSBiaW9zLT5kYXRhW29mZnNldCArIDFdOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IElPIGNvbmRpdGlvbjogMHglMDJYXG4iLCBvZmZzZXQsIGNvbmQpOworCisJaWYgKGlvX2NvbmRpdGlvbl9tZXQoYmlvcywgb2Zmc2V0LCBjb25kKSkKKwkJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBDb25kaXRpb24gZnVsZmlsbGVkIC0tIGNvbnRpbnVpbmcgdG8gZXhlY3V0ZVxuIiwgb2Zmc2V0KTsKKwllbHNlIHsKKwkJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBDb25kaXRpb24gbm90IGZ1bGZpbGxlZCAtLSBza2lwcGluZyBmb2xsb3dpbmcgY29tbWFuZHNcbiIsIG9mZnNldCk7CisJCWlleGVjLT5leGVjdXRlID0gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X2luZGV4X2lvKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX0lOREVYX0lPICAgb3Bjb2RlOiAweDc4ICgneCcpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCAgYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDE2IGJpdCk6IENSVEMgcG9ydAorCSAqIG9mZnNldCArIDMgICg4ICBiaXQpOiBDUlRDIGluZGV4CisJICogb2Zmc2V0ICsgNCAgKDggIGJpdCk6IG1hc2sKKwkgKiBvZmZzZXQgKyA1ICAoOCAgYml0KTogZGF0YQorCSAqCisJICogUmVhZCB2YWx1ZSBhdCBpbmRleCAiQ1JUQyBpbmRleCIgb24gIkNSVEMgcG9ydCIsIEFORCB3aXRoICJtYXNrIiwKKwkgKiBPUiB3aXRoICJkYXRhIiwgd3JpdGUtYmFjaworCSAqLworCisJdWludDE2X3QgY3J0Y3BvcnQgPSBST00xNihiaW9zLT5kYXRhW29mZnNldCArIDFdKTsKKwl1aW50OF90IGNydGNpbmRleCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgM107CisJdWludDhfdCBtYXNrID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA0XTsKKwl1aW50OF90IGRhdGEgPSBiaW9zLT5kYXRhW29mZnNldCArIDVdOworCXVpbnQ4X3QgdmFsdWU7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogUG9ydDogMHglMDRYLCBJbmRleDogMHglMDJYLCBNYXNrOiAweCUwMlgsICIKKwkJICAgICAgIkRhdGE6IDB4JTAyWFxuIiwKKwkJb2Zmc2V0LCBjcnRjcG9ydCwgY3J0Y2luZGV4LCBtYXNrLCBkYXRhKTsKKworCXZhbHVlID0gKGJpb3NfaWR4cHJ0X3JkKGJpb3MsIGNydGNwb3J0LCBjcnRjaW5kZXgpICYgbWFzaykgfCBkYXRhOworCWJpb3NfaWR4cHJ0X3dyKGJpb3MsIGNydGNwb3J0LCBjcnRjaW5kZXgsIHZhbHVlKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9wbGwoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfUExMICAgb3Bjb2RlOiAweDc5ICgneScpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCAgYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDMyIGJpdCk6IHJlZ2lzdGVyCisJICogb2Zmc2V0ICsgNSAgKDE2IGJpdCk6IGZyZXEKKwkgKgorCSAqIFNldCBQTEwgcmVnaXN0ZXIgInJlZ2lzdGVyIiB0byBjb2VmZmljaWVudHMgZm9yIGZyZXF1ZW5jeSAoMTBrSHopCisJICogImZyZXEiCisJICovCisKKwl1aW50MzJfdCByZWcgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDFdKTsKKwl1aW50MTZfdCBmcmVxID0gUk9NMTYoYmlvcy0+ZGF0YVtvZmZzZXQgKyA1XSk7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogUmVnOiAweCUwOFgsIEZyZXE6ICVkMGtIelxuIiwgb2Zmc2V0LCByZWcsIGZyZXEpOworCisJc2V0UExMKGJpb3MsIHJlZywgZnJlcSAqIDEwKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF96bV9yZWcoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfWk1fUkVHICAgb3Bjb2RlOiAweDdBICgneicpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCAgYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDMyIGJpdCk6IHJlZ2lzdGVyCisJICogb2Zmc2V0ICsgNSAgKDMyIGJpdCk6IHZhbHVlCisJICoKKwkgKiBBc3NpZ24gInZhbHVlIiB0byAicmVnaXN0ZXIiCisJICovCisKKwl1aW50MzJfdCByZWcgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDFdKTsKKwl1aW50MzJfdCB2YWx1ZSA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgNV0pOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAocmVnID09IDB4MDAwMjAwKQorCQl2YWx1ZSB8PSAxOworCisJYmlvc193cjMyKGJpb3MsIHJlZywgdmFsdWUpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X3JhbV9yZXN0cmljdF9wbGwoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LAorCQkgICAgICBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfUkFNX1JFU1RSSUNUX1BMTCAgIG9wY29kZTogMHg4NyAoJycpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoOCBiaXQpOiBQTEwgdHlwZQorCSAqIG9mZnNldCArIDIgKDMyIGJpdCk6IGZyZXF1ZW5jeSAwCisJICoKKwkgKiBVc2VzIHRoZSBSQU1DRkcgc3RyYXAgb2YgUEVYVERFVl9CT09UIGFzIGFuIGluZGV4IGludG8gdGhlIHRhYmxlIGF0CisJICogcmFtX3Jlc3RyaWN0X3RhYmxlX3B0ci4gIFRoZSB2YWx1ZSByZWFkIGZyb20gdGhlcmUgaXMgdXNlZCB0byBzZWxlY3QKKwkgKiBhIGZyZXF1ZW5jeSBmcm9tIHRoZSB0YWJsZSBzdGFydGluZyBhdCAnZnJlcXVlbmN5IDAnIHRvIGJlCisJICogcHJvZ3JhbW1lZCBpbnRvIHRoZSBQTEwgY29ycmVzcG9uZGluZyB0byAndHlwZScuCisJICoKKwkgKiBUaGUgUExMIGxpbWl0cyB0YWJsZSBvbiBjYXJkcyB1c2luZyB0aGlzIG9wY29kZSBoYXMgYSBtYXBwaW5nIG9mCisJICogJ3R5cGUnIHRvIHRoZSByZWxldmFudCByZWdpc3RlcnMuCisJICovCisKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmlvcy0+ZGV2OworCXVpbnQzMl90IHN0cmFwID0gKGJpb3NfcmQzMihiaW9zLCBOVl9QRVhUREVWX0JPT1RfMCkgJiAweDAwMDAwMDNjKSA+PiAyOworCXVpbnQ4X3QgaW5kZXggPSBiaW9zLT5kYXRhW2Jpb3MtPnJhbV9yZXN0cmljdF90YmxfcHRyICsgc3RyYXBdOworCXVpbnQ4X3QgdHlwZSA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV07CisJdWludDMyX3QgZnJlcSA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgMiArIChpbmRleCAqIDQpXSk7CisJdWludDhfdCAqcGxsX2xpbWl0cyA9ICZiaW9zLT5kYXRhW2Jpb3MtPnBsbF9saW1pdF90YmxfcHRyXSwgKmVudHJ5OworCWludCBpOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoIWJpb3MtPnBsbF9saW1pdF90YmxfcHRyIHx8IChwbGxfbGltaXRzWzBdICYgMHhmMCkgIT0gMHgzMCkgeworCQlOVl9FUlJPUihkZXYsICJQTEwgbGltaXRzIHRhYmxlIG5vdCB2ZXJzaW9uIDMueFxuIik7CisJCXJldHVybiB0cnVlOyAvKiBkZWxpYmVyYXRlLCBhbGxvdyBkZWZhdWx0IGNsb2NrcyB0byByZW1haW4gKi8KKwl9CisKKwllbnRyeSA9IHBsbF9saW1pdHMgKyBwbGxfbGltaXRzWzFdOworCWZvciAoaSA9IDA7IGkgPCBwbGxfbGltaXRzWzNdOyBpKyssIGVudHJ5ICs9IHBsbF9saW1pdHNbMl0pIHsKKwkJaWYgKGVudHJ5WzBdID09IHR5cGUpIHsKKwkJCXVpbnQzMl90IHJlZyA9IFJPTTMyKGVudHJ5WzNdKTsKKworCQkJQklPU0xPRyhiaW9zLCAiMHglMDRYOiAiCisJCQkJICAgICAgIlR5cGUgJTAyeCBSZWcgMHglMDh4IEZyZXEgJWRLSHpcbiIsCisJCQkJb2Zmc2V0LCB0eXBlLCByZWcsIGZyZXEpOworCisJCQlzZXRQTEwoYmlvcywgcmVnLCBmcmVxKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCisJTlZfRVJST1IoZGV2LCAiUExMIHR5cGUgMHglMDJ4IG5vdCBmb3VuZCBpbiBQTEwgbGltaXRzIHRhYmxlIiwgdHlwZSk7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0XzhjKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUXzhDICAgb3Bjb2RlOiAweDhDICgnJykKKwkgKgorCSAqIE5PUCBzbyBmYXIuLi4uCisJICoKKwkgKi8KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF84ZChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF84RCAgIG9wY29kZTogMHg4RCAoJycpCisJICoKKwkgKiBOT1Agc28gZmFyLi4uLgorCSAqCisJICovCisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfZ3BpbyhzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9HUElPICAgb3Bjb2RlOiAweDhFICgnJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4IGJpdCk6IG9wY29kZQorCSAqCisJICogTG9vcCBvdmVyIGFsbCBlbnRyaWVzIGluIHRoZSBEQ0IgR1BJTyB0YWJsZSwgYW5kIGluaXRpYWxpc2UKKwkgKiBlYWNoIEdQSU8gYWNjb3JkaW5nIHRvIHZhcmlvdXMgdmFsdWVzIGxpc3RlZCBpbiBlYWNoIGVudHJ5CisJICovCisKKwljb25zdCB1aW50MzJfdCBudjUwX2dwaW9fcmVnWzRdID0geyAweGUxMDQsIDB4ZTEwOCwgMHhlMjgwLCAweGUyODQgfTsKKwljb25zdCB1aW50MzJfdCBudjUwX2dwaW9fY3RsWzJdID0geyAweGUxMDAsIDB4ZTI4YyB9OworCWNvbnN0IHVpbnQ4X3QgKmdwaW9fdGFibGUgPSAmYmlvcy0+ZGF0YVtiaW9zLT5iZGNiLmdwaW9fdGFibGVfcHRyXTsKKwljb25zdCB1aW50OF90ICpncGlvX2VudHJ5OworCWludCBpOworCisJaWYgKGJpb3MtPmJkY2IudmVyc2lvbiAhPSAweDQwKSB7CisJCU5WX0VSUk9SKGJpb3MtPmRldiwgIkRDQiB0YWJsZSBub3QgdmVyc2lvbiA0LjBcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKCFiaW9zLT5iZGNiLmdwaW9fdGFibGVfcHRyKSB7CisJCU5WX1dBUk4oYmlvcy0+ZGV2LCAiSW52YWxpZCBwb2ludGVyIHRvIElOSVRfOEUgdGFibGVcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJZ3Bpb19lbnRyeSA9IGdwaW9fdGFibGUgKyBncGlvX3RhYmxlWzFdOworCWZvciAoaSA9IDA7IGkgPCBncGlvX3RhYmxlWzJdOyBpKyssIGdwaW9fZW50cnkgKz0gZ3Bpb190YWJsZVszXSkgeworCQl1aW50MzJfdCBlbnRyeSA9IFJPTTMyKGdwaW9fZW50cnlbMF0pLCByLCBzLCB2OworCQlpbnQgbGluZSA9IChlbnRyeSAmIDB4MDAwMDAwMWYpOworCisJCUJJT1NMT0coYmlvcywgIjB4JTA0WDogRW50cnk6IDB4JTA4WFxuIiwgb2Zmc2V0LCBlbnRyeSk7CisKKwkJaWYgKChlbnRyeSAmIDB4MDAwMGZmMDApID09IDB4MDAwMGZmMDApCisJCQljb250aW51ZTsKKworCQlyID0gbnY1MF9ncGlvX3JlZ1tsaW5lID4+IDNdOworCQlzID0gKGxpbmUgJiAweDA3KSA8PCAyOworCQl2ID0gYmlvc19yZDMyKGJpb3MsIHIpICYgfigweDAwMDAwMDAzIDw8IHMpOworCQlpZiAoZW50cnkgJiAweDAxMDAwMDAwKQorCQkJdiB8PSAoKChlbnRyeSAmIDB4NjAwMDAwMDApID4+IDI5KSBeIDIpIDw8IHM7CisJCWVsc2UKKwkJCXYgfD0gKCgoZW50cnkgJiAweDE4MDAwMDAwKSA+PiAyNykgXiAyKSA8PCBzOworCQliaW9zX3dyMzIoYmlvcywgciwgdik7CisKKwkJciA9IG52NTBfZ3Bpb19jdGxbbGluZSA+PiA0XTsKKwkJcyA9IChsaW5lICYgMHgwZik7CisJCXYgPSBiaW9zX3JkMzIoYmlvcywgcikgJiB+KDB4MDAwMTAwMDEgPDwgcyk7CisJCXN3aXRjaCAoKGVudHJ5ICYgMHgwNjAwMDAwMCkgPj4gMjUpIHsKKwkJY2FzZSAxOgorCQkJdiB8PSAoMHgwMDAwMDAwMSA8PCBzKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQl2IHw9ICgweDAwMDEwMDAwIDw8IHMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQliaW9zX3dyMzIoYmlvcywgciwgdik7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qIGhhY2sgdG8gYXZvaWQgbW92aW5nIHRoZSBpdGJsX2VudHJ5IGFycmF5IGJlZm9yZSB0aGlzIGZ1bmN0aW9uICovCitpbnQgaW5pdF9yYW1fcmVzdHJpY3Rfem1fcmVnX2dyb3VwX2Jsb2NrbGVuOworCitzdGF0aWMgYm9vbAoraW5pdF9yYW1fcmVzdHJpY3Rfem1fcmVnX2dyb3VwKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwKKwkJCSAgICAgICBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfUkFNX1JFU1RSSUNUX1pNX1JFR19HUk9VUCAgIG9wY29kZTogMHg4RiAoJycpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCAgYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDMyIGJpdCk6IHJlZworCSAqIG9mZnNldCArIDUgICg4ICBiaXQpOiByZWdpbmNyZW1lbnQKKwkgKiBvZmZzZXQgKyA2ICAoOCAgYml0KTogY291bnQKKwkgKiBvZmZzZXQgKyA3ICAoMzIgYml0KTogdmFsdWUgMSwxCisJICogLi4uCisJICoKKwkgKiBVc2UgdGhlIFJBTUNGRyBzdHJhcCBvZiBQRVhUREVWX0JPT1QgYXMgYW4gaW5kZXggaW50byB0aGUgdGFibGUgYXQKKwkgKiByYW1fcmVzdHJpY3RfdGFibGVfcHRyLiBUaGUgdmFsdWUgcmVhZCBmcm9tIGhlcmUgaXMgJ24nLCBhbmQKKwkgKiAidmFsdWUgMSxuIiBnZXRzIHdyaXR0ZW4gdG8gInJlZyIuIFRoaXMgcmVwZWF0cyAiY291bnQiIHRpbWVzIGFuZCBvbgorCSAqIGVhY2ggaXRlcmF0aW9uICdtJywgInJlZyIgaW5jcmVhc2VzIGJ5ICJyZWdpbmNyZW1lbnQiIGFuZAorCSAqICJ2YWx1ZSBtLG4iIGlzIHVzZWQuIFRoZSBleHRlbnQgb2YgbiBpcyBsaW1pdGVkIGJ5IGEgbnVtYmVyIHJlYWQKKwkgKiBmcm9tIHRoZSAnTScgQklUIHRhYmxlLCBoZXJlaW4gY2FsbGVkICJibG9ja2xlbiIKKwkgKi8KKworCXVpbnQzMl90IHJlZyA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV0pOworCXVpbnQ4X3QgcmVnaW5jcmVtZW50ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA1XTsKKwl1aW50OF90IGNvdW50ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA2XTsKKwl1aW50MzJfdCBzdHJhcF9yYW1jZmcsIGRhdGE7CisJdWludDE2X3QgYmxvY2tsZW47CisJdWludDhfdCBpbmRleDsKKwlpbnQgaTsKKworCS8qIHByZXZpb3VzbHkgc2V0IGJ5ICdNJyBCSVQgdGFibGUgKi8KKwlibG9ja2xlbiA9IGluaXRfcmFtX3Jlc3RyaWN0X3ptX3JlZ19ncm91cF9ibG9ja2xlbjsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJaWYgKCFibG9ja2xlbikgeworCQlOVl9FUlJPUihiaW9zLT5kZXYsCisJCQkgIjB4JTA0WDogWmVybyBibG9jayBsZW5ndGggLSBoYXMgdGhlIE0gdGFibGUgIgorCQkJICJiZWVuIHBhcnNlZD9cbiIsIG9mZnNldCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlzdHJhcF9yYW1jZmcgPSAoYmlvc19yZDMyKGJpb3MsIE5WX1BFWFRERVZfQk9PVF8wKSA+PiAyKSAmIDB4ZjsKKwlpbmRleCA9IGJpb3MtPmRhdGFbYmlvcy0+cmFtX3Jlc3RyaWN0X3RibF9wdHIgKyBzdHJhcF9yYW1jZmddOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBSZWc6IDB4JTA4WCwgUmVnSW5jcmVtZW50OiAweCUwMlgsICIKKwkJICAgICAgIkNvdW50OiAweCUwMlgsIFN0cmFwUmFtQ2ZnOiAweCUwMlgsIEluZGV4OiAweCUwMlhcbiIsCisJCW9mZnNldCwgcmVnLCByZWdpbmNyZW1lbnQsIGNvdW50LCBzdHJhcF9yYW1jZmcsIGluZGV4KTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWRhdGEgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDcgKyBpbmRleCAqIDQgKyBibG9ja2xlbiAqIGldKTsKKworCQliaW9zX3dyMzIoYmlvcywgcmVnLCBkYXRhKTsKKworCQlyZWcgKz0gcmVnaW5jcmVtZW50OworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9jb3B5X3ptX3JlZyhzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9DT1BZX1pNX1JFRyAgIG9wY29kZTogMHg5MCAoJycpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCAgYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDMyIGJpdCk6IHNyYyByZWcKKwkgKiBvZmZzZXQgKyA1ICAoMzIgYml0KTogZHN0IHJlZworCSAqCisJICogUHV0IGNvbnRlbnRzIG9mICJzcmMgcmVnIiBpbnRvICJkc3QgcmVnIgorCSAqLworCisJdWludDMyX3Qgc3JjcmVnID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXSk7CisJdWludDMyX3QgZHN0cmVnID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyA1XSk7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCWJpb3Nfd3IzMihiaW9zLCBkc3RyZWcsIGJpb3NfcmQzMihiaW9zLCBzcmNyZWcpKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF96bV9yZWdfZ3JvdXBfYWRkcl9sYXRjaGVkKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwKKwkJCSAgICAgICBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfWk1fUkVHX0dST1VQX0FERFJFU1NfTEFUQ0hFRCAgIG9wY29kZTogMHg5MSAoJycpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCAgYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDMyIGJpdCk6IGRzdCByZWcKKwkgKiBvZmZzZXQgKyA1ICAoOCAgYml0KTogY291bnQKKwkgKiBvZmZzZXQgKyA2ICAoMzIgYml0KTogZGF0YSAxCisJICogLi4uCisJICoKKwkgKiBGb3IgZWFjaCBvZiAiY291bnQiIHZhbHVlcyB3cml0ZSAiZGF0YSBuIiB0byAiZHN0IHJlZyIKKwkgKi8KKworCXVpbnQzMl90IHJlZyA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV0pOworCXVpbnQ4X3QgY291bnQgPSBiaW9zLT5kYXRhW29mZnNldCArIDVdOworCWludCBpOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQl1aW50MzJfdCBkYXRhID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyA2ICsgNCAqIGldKTsKKwkJYmlvc193cjMyKGJpb3MsIHJlZywgZGF0YSk7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X3Jlc2VydmVkKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX1JFU0VSVkVEICAgb3Bjb2RlOiAweDkyICgnJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4IGJpdCk6IG9wY29kZQorCSAqCisJICogU2VlbWluZ2x5IGRvZXMgbm90aGluZworCSAqLworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0Xzk2KHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUXzk2ICAgb3Bjb2RlOiAweDk2ICgnJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoMzIgYml0KTogc3JlZworCSAqIG9mZnNldCArIDUgICg4ICBiaXQpOiBzc2hpZnQKKwkgKiBvZmZzZXQgKyA2ICAoOCAgYml0KTogc21hc2sKKwkgKiBvZmZzZXQgKyA3ICAoOCAgYml0KTogaW5kZXgKKwkgKiBvZmZzZXQgKyA4ICAoMzIgYml0KTogcmVnCisJICogb2Zmc2V0ICsgMTIgKDMyIGJpdCk6IG1hc2sKKwkgKiBvZmZzZXQgKyAxNiAoOCAgYml0KTogc2hpZnQKKwkgKgorCSAqLworCisJdWludDE2X3QgeGxhdHB0ciA9IGJpb3MtPmluaXQ5Nl90YmxfcHRyICsgKGJpb3MtPmRhdGFbb2Zmc2V0ICsgN10gKiAyKTsKKwl1aW50MzJfdCByZWcgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDhdKTsKKwl1aW50MzJfdCBtYXNrID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyAxMl0pOworCXVpbnQzMl90IHZhbDsKKworCXZhbCA9IGJpb3NfcmQzMihiaW9zLCBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDFdKSk7CisJaWYgKGJpb3MtPmRhdGFbb2Zmc2V0ICsgNV0gPCAweDgwKQorCQl2YWwgPj49IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNV07CisJZWxzZQorCQl2YWwgPDw9ICgweDEwMCAtIGJpb3MtPmRhdGFbb2Zmc2V0ICsgNV0pOworCXZhbCAmPSBiaW9zLT5kYXRhW29mZnNldCArIDZdOworCisJdmFsICAgPSBiaW9zLT5kYXRhW1JPTTE2KGJpb3MtPmRhdGFbeGxhdHB0cl0pICsgdmFsXTsKKwl2YWwgPDw9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMTZdOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwliaW9zX3dyMzIoYmlvcywgcmVnLCAoYmlvc19yZDMyKGJpb3MsIHJlZykgJiBtYXNrKSB8IHZhbCk7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0Xzk3KHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUXzk3ICAgb3Bjb2RlOiAweDk3ICgnJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoMzIgYml0KTogcmVnaXN0ZXIKKwkgKiBvZmZzZXQgKyA1ICAoMzIgYml0KTogbWFzaworCSAqIG9mZnNldCArIDkgICgzMiBiaXQpOiB2YWx1ZQorCSAqCisJICogQWRkcyAidmFsdWUiIHRvICJyZWdpc3RlciIgcHJlc2VydmluZyB0aGUgZmllbGRzIHNwZWNpZmllZAorCSAqIGJ5ICJtYXNrIgorCSAqLworCisJdWludDMyX3QgcmVnID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXSk7CisJdWludDMyX3QgbWFzayA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgNV0pOworCXVpbnQzMl90IGFkZCA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgOV0pOworCXVpbnQzMl90IHZhbDsKKworCXZhbCA9IGJpb3NfcmQzMihiaW9zLCByZWcpOworCXZhbCA9ICh2YWwgJiBtYXNrKSB8ICgodmFsICsgYWRkKSAmIH5tYXNrKTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJYmlvc193cjMyKGJpb3MsIHJlZywgdmFsKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfYXV4Y2goc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfQVVYQ0ggICBvcGNvZGU6IDB4OTggKCcnKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggIGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICgzMiBiaXQpOiBhZGRyZXNzCisJICogb2Zmc2V0ICsgNSAgKDggIGJpdCk6IGNvdW50CisJICogb2Zmc2V0ICsgNiAgKDggIGJpdCk6IG1hc2sgMAorCSAqIG9mZnNldCArIDcgICg4ICBiaXQpOiBkYXRhIDAKKwkgKiAgLi4uCisJICoKKwkgKi8KKworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBiaW9zLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmF1eGNoOworCXVpbnQzMl90IGFkZHIgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDFdKTsKKwl1aW50OF90IGxlbiA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNV07CisJaW50IHJldCwgaTsKKworCWlmICghYmlvcy0+ZGlzcGxheS5vdXRwdXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiSU5JVF9BVVhDSDogbm8gYWN0aXZlIG91dHB1dFxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlhdXhjaCA9IGluaXRfaTJjX2RldmljZV9maW5kKGRldiwgYmlvcy0+ZGlzcGxheS5vdXRwdXQtPmkyY19pbmRleCk7CisJaWYgKCFhdXhjaCkgeworCQlOVl9FUlJPUihkZXYsICJJTklUX0FVWENIOiBjb3VsZG4ndCBnZXQgYXV4Y2ggJWRcbiIsCisJCQkgYmlvcy0+ZGlzcGxheS5vdXRwdXQtPmkyY19pbmRleCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCW9mZnNldCArPSA2OworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKywgb2Zmc2V0ICs9IDIpIHsKKwkJdWludDhfdCBkYXRhOworCisJCXJldCA9IG5vdXZlYXVfZHBfYXV4Y2goYXV4Y2gsIDksIGFkZHIsICZkYXRhLCAxKTsKKwkJaWYgKHJldCkgeworCQkJTlZfRVJST1IoZGV2LCAiSU5JVF9BVVhDSDogcmQgYXV4Y2ggZmFpbCAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWRhdGEgJj0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAwXTsKKwkJZGF0YSB8PSBiaW9zLT5kYXRhW29mZnNldCArIDFdOworCisJCXJldCA9IG5vdXZlYXVfZHBfYXV4Y2goYXV4Y2gsIDgsIGFkZHIsICZkYXRhLCAxKTsKKwkJaWYgKHJldCkgeworCQkJTlZfRVJST1IoZGV2LCAiSU5JVF9BVVhDSDogd3IgYXV4Y2ggZmFpbCAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF96bV9hdXhjaChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9aTV9BVVhDSCAgIG9wY29kZTogMHg5OSAoJycpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCAgYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDMyIGJpdCk6IGFkZHJlc3MKKwkgKiBvZmZzZXQgKyA1ICAoOCAgYml0KTogY291bnQKKwkgKiBvZmZzZXQgKyA2ICAoOCAgYml0KTogZGF0YSAwCisJICogIC4uLgorCSAqCisJICovCisKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmlvcy0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICphdXhjaDsKKwl1aW50MzJfdCBhZGRyID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXSk7CisJdWludDhfdCBsZW4gPSBiaW9zLT5kYXRhW29mZnNldCArIDVdOworCWludCByZXQsIGk7CisKKwlpZiAoIWJpb3MtPmRpc3BsYXkub3V0cHV0KSB7CisJCU5WX0VSUk9SKGRldiwgIklOSVRfWk1fQVVYQ0g6IG5vIGFjdGl2ZSBvdXRwdXRcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJYXV4Y2ggPSBpbml0X2kyY19kZXZpY2VfZmluZChkZXYsIGJpb3MtPmRpc3BsYXkub3V0cHV0LT5pMmNfaW5kZXgpOworCWlmICghYXV4Y2gpIHsKKwkJTlZfRVJST1IoZGV2LCAiSU5JVF9aTV9BVVhDSDogY291bGRuJ3QgZ2V0IGF1eGNoICVkXG4iLAorCQkJIGJpb3MtPmRpc3BsYXkub3V0cHV0LT5pMmNfaW5kZXgpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlvZmZzZXQgKz0gNjsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyssIG9mZnNldCsrKSB7CisJCXJldCA9IG5vdXZlYXVfZHBfYXV4Y2goYXV4Y2gsIDgsIGFkZHIsICZiaW9zLT5kYXRhW29mZnNldF0sIDEpOworCQlpZiAocmV0KSB7CisJCQlOVl9FUlJPUihkZXYsICJJTklUX1pNX0FVWENIOiB3ciBhdXhjaCBmYWlsICVkXG4iLCByZXQpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5pdF90YmxfZW50cnkgaXRibF9lbnRyeVtdID0geworCS8qIGNvbW1hbmQgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgLCBpZCAgLCBsZW5ndGggICwgb2Zmc2V0ICAsIG11bHQgICAgLCBjb21tYW5kIGhhbmRsZXIgICAgICAgICAgICAgICAgICovCisJLyogSU5JVF9QUk9HICgweDMxLCAxNSwgMTAsIDQpIHJlbW92ZWQgZHVlIHRvIG5vIGV4YW1wbGUgb2YgdXNlICovCisJeyAiSU5JVF9JT19SRVNUUklDVF9QUk9HIiAgICAgICAgICAgICAsIDB4MzIsIDExICAgICAgLCA2ICAgICAgICwgNCAgICAgICAsIGluaXRfaW9fcmVzdHJpY3RfcHJvZyAgICAgICAgICAgfSwKKwl7ICJJTklUX1JFUEVBVCIgICAgICAgICAgICAgICAgICAgICAgICwgMHgzMywgMiAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9yZXBlYXQgICAgICAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfSU9fUkVTVFJJQ1RfUExMIiAgICAgICAgICAgICAgLCAweDM0LCAxMiAgICAgICwgNyAgICAgICAsIDIgICAgICAgLCBpbml0X2lvX3Jlc3RyaWN0X3BsbCAgICAgICAgICAgIH0sCisJeyAiSU5JVF9FTkRfUkVQRUFUIiAgICAgICAgICAgICAgICAgICAsIDB4MzYsIDEgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfZW5kX3JlcGVhdCAgICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX0NPUFkiICAgICAgICAgICAgICAgICAgICAgICAgICwgMHgzNywgMTEgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9jb3B5ICAgICAgICAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfTk9UIiAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDM4LCAxICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X25vdCAgICAgICAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9JT19GTEFHX0NPTkRJVElPTiIgICAgICAgICAgICAsIDB4MzksIDIgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfaW9fZmxhZ19jb25kaXRpb24gICAgICAgICAgfSwKKwl7ICJJTklUX0lOREVYX0FERFJFU1NfTEFUQ0hFRCIgICAgICAgICwgMHg0OSwgMTggICAgICAsIDE3ICAgICAgLCAyICAgICAgICwgaW5pdF9pZHhfYWRkcl9sYXRjaGVkICAgICAgICAgICB9LAorCXsgIklOSVRfSU9fUkVTVFJJQ1RfUExMMiIgICAgICAgICAgICAgLCAweDRBLCAxMSAgICAgICwgNiAgICAgICAsIDQgICAgICAgLCBpbml0X2lvX3Jlc3RyaWN0X3BsbDIgICAgICAgICAgIH0sCisJeyAiSU5JVF9QTEwyIiAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4NEIsIDkgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfcGxsMiAgICAgICAgICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX0kyQ19CWVRFIiAgICAgICAgICAgICAgICAgICAgICwgMHg0QywgNCAgICAgICAsIDMgICAgICAgLCAzICAgICAgICwgaW5pdF9pMmNfYnl0ZSAgICAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfWk1fSTJDX0JZVEUiICAgICAgICAgICAgICAgICAgLCAweDRELCA0ICAgICAgICwgMyAgICAgICAsIDIgICAgICAgLCBpbml0X3ptX2kyY19ieXRlICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9aTV9JMkMiICAgICAgICAgICAgICAgICAgICAgICAsIDB4NEUsIDQgICAgICAgLCAzICAgICAgICwgMSAgICAgICAsIGluaXRfem1faTJjICAgICAgICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX1RNRFMiICAgICAgICAgICAgICAgICAgICAgICAgICwgMHg0RiwgNSAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF90bWRzICAgICAgICAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfWk1fVE1EU19HUk9VUCIgICAgICAgICAgICAgICAgLCAweDUwLCAzICAgICAgICwgMiAgICAgICAsIDIgICAgICAgLCBpbml0X3ptX3RtZHNfZ3JvdXAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9DUl9JTkRFWF9BRERSRVNTX0xBVENIRUQiICAgICAsIDB4NTEsIDUgICAgICAgLCA0ICAgICAgICwgMSAgICAgICAsIGluaXRfY3JfaWR4X2Fkcl9sYXRjaCAgICAgICAgICAgfSwKKwl7ICJJTklUX0NSIiAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHg1MiwgNCAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9jciAgICAgICAgICAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfWk1fQ1IiICAgICAgICAgICAgICAgICAgICAgICAgLCAweDUzLCAzICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X3ptX2NyICAgICAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9aTV9DUl9HUk9VUCIgICAgICAgICAgICAgICAgICAsIDB4NTQsIDIgICAgICAgLCAxICAgICAgICwgMiAgICAgICAsIGluaXRfem1fY3JfZ3JvdXAgICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX0NPTkRJVElPTl9USU1FIiAgICAgICAgICAgICAgICwgMHg1NiwgMyAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9jb25kaXRpb25fdGltZSAgICAgICAgICAgICB9LAorCXsgIklOSVRfWk1fUkVHX1NFUVVFTkNFIiAgICAgICAgICAgICAgLCAweDU4LCA2ICAgICAgICwgNSAgICAgICAsIDQgICAgICAgLCBpbml0X3ptX3JlZ19zZXF1ZW5jZSAgICAgICAgICAgIH0sCisJLyogSU5JVF9JTkRJUkVDVF9SRUcgKDB4NUEsIDcsIDAsIDApIHJlbW92ZWQgZHVlIHRvIG5vIGV4YW1wbGUgb2YgdXNlICovCisJeyAiSU5JVF9TVUJfRElSRUNUIiAgICAgICAgICAgICAgICAgICAsIDB4NUIsIDMgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfc3ViX2RpcmVjdCAgICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX0NPUFlfTlZfUkVHIiAgICAgICAgICAgICAgICAgICwgMHg1RiwgMjIgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9jb3B5X252X3JlZyAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfWk1fSU5ERVhfSU8iICAgICAgICAgICAgICAgICAgLCAweDYyLCA1ICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X3ptX2luZGV4X2lvICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9DT01QVVRFX01FTSIgICAgICAgICAgICAgICAgICAsIDB4NjMsIDEgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfY29tcHV0ZV9tZW0gICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX1JFU0VUIiAgICAgICAgICAgICAgICAgICAgICAgICwgMHg2NSwgMTMgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9yZXNldCAgICAgICAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfQ09ORklHVVJFX01FTSIgICAgICAgICAgICAgICAgLCAweDY2LCAxICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X2NvbmZpZ3VyZV9tZW0gICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9DT05GSUdVUkVfQ0xLIiAgICAgICAgICAgICAgICAsIDB4NjcsIDEgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfY29uZmlndXJlX2NsayAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX0NPTkZJR1VSRV9QUkVJTklUIiAgICAgICAgICAgICwgMHg2OCwgMSAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9jb25maWd1cmVfcHJlaW5pdCAgICAgICAgICB9LAorCXsgIklOSVRfSU8iICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDY5LCA1ICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X2lvICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9TVUIiICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4NkIsIDIgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfc3ViICAgICAgICAgICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX1JBTV9DT05ESVRJT04iICAgICAgICAgICAgICAgICwgMHg2RCwgMyAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9yYW1fY29uZGl0aW9uICAgICAgICAgICAgICB9LAorCXsgIklOSVRfTlZfUkVHIiAgICAgICAgICAgICAgICAgICAgICAgLCAweDZFLCAxMyAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X252X3JlZyAgICAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9NQUNSTyIgICAgICAgICAgICAgICAgICAgICAgICAsIDB4NkYsIDIgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfbWFjcm8gICAgICAgICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX0RPTkUiICAgICAgICAgICAgICAgICAgICAgICAgICwgMHg3MSwgMSAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9kb25lICAgICAgICAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfUkVTVU1FIiAgICAgICAgICAgICAgICAgICAgICAgLCAweDcyLCAxICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X3Jlc3VtZSAgICAgICAgICAgICAgICAgICAgIH0sCisJLyogSU5JVF9SQU1fQ09ORElUSU9OMiAoMHg3MywgOSwgMCwgMCkgcmVtb3ZlZCBkdWUgdG8gbm8gZXhhbXBsZSBvZiB1c2UgKi8KKwl7ICJJTklUX1RJTUUiICAgICAgICAgICAgICAgICAgICAgICAgICwgMHg3NCwgMyAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF90aW1lICAgICAgICAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfQ09ORElUSU9OIiAgICAgICAgICAgICAgICAgICAgLCAweDc1LCAyICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X2NvbmRpdGlvbiAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9JT19DT05ESVRJT04iICAgICAgICAgICAgICAgICAsIDB4NzYsIDIgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfaW9fY29uZGl0aW9uICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX0lOREVYX0lPIiAgICAgICAgICAgICAgICAgICAgICwgMHg3OCwgNiAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9pbmRleF9pbyAgICAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfUExMIiAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDc5LCA3ICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X3BsbCAgICAgICAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9aTV9SRUciICAgICAgICAgICAgICAgICAgICAgICAsIDB4N0EsIDkgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfem1fcmVnICAgICAgICAgICAgICAgICAgICAgfSwKKwkvKiBJTklUX1JBTV9SRVNUUklDVF9QTEwncyBsZW5ndGggaXMgYWRqdXN0ZWQgYnkgdGhlIEJJVCBNIHRhYmxlICovCisJeyAiSU5JVF9SQU1fUkVTVFJJQ1RfUExMIiAgICAgICAgICAgICAsIDB4ODcsIDIgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfcmFtX3Jlc3RyaWN0X3BsbCAgICAgICAgICAgfSwKKwl7ICJJTklUXzhDIiAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHg4QywgMSAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF84YyAgICAgICAgICAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfOEQiICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDhELCAxICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0XzhkICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9HUElPIiAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4OEUsIDEgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfZ3BpbyAgICAgICAgICAgICAgICAgICAgICAgfSwKKwkvKiBJTklUX1JBTV9SRVNUUklDVF9aTV9SRUdfR1JPVVAncyBtdWx0IGlzIGxvYWRlZCBieSBNIHRhYmxlIGluIEJJVCAqLworCXsgIklOSVRfUkFNX1JFU1RSSUNUX1pNX1JFR19HUk9VUCIgICAgLCAweDhGLCA3ICAgICAgICwgNiAgICAgICAsIDAgICAgICAgLCBpbml0X3JhbV9yZXN0cmljdF96bV9yZWdfZ3JvdXAgIH0sCisJeyAiSU5JVF9DT1BZX1pNX1JFRyIgICAgICAgICAgICAgICAgICAsIDB4OTAsIDkgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfY29weV96bV9yZWcgICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX1pNX1JFR19HUk9VUF9BRERSRVNTX0xBVENIRUQiICwgMHg5MSwgNiAgICAgICAsIDUgICAgICAgLCA0ICAgICAgICwgaW5pdF96bV9yZWdfZ3JvdXBfYWRkcl9sYXRjaGVkICB9LAorCXsgIklOSVRfUkVTRVJWRUQiICAgICAgICAgICAgICAgICAgICAgLCAweDkyLCAxICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X3Jlc2VydmVkICAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF85NiIgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4OTYsIDE3ICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfOTYgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUXzk3IiAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHg5NywgMTMgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF85NyAgICAgICAgICAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfQVVYQ0giICAgICAgICAgICAgICAgICAgICAgICAgLCAweDk4LCA2ICAgICAgICwgNSAgICAgICAsIDIgICAgICAgLCBpbml0X2F1eGNoICAgICAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9aTV9BVVhDSCIgICAgICAgICAgICAgICAgICAgICAsIDB4OTksIDYgICAgICAgLCA1ICAgICAgICwgMSAgICAgICAsIGluaXRfem1fYXV4Y2ggICAgICAgICAgICAgICAgICAgfSwKKwl7IE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMCAgICwgMCAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Cit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9pbml0X3RhYmxlX2VudHJ5X2xlbmd0aChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgaSkKK3sKKwkvKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSBnaXZlbiBpbml0IHRhYmxlIGVudHJ5LiAqLworCXJldHVybiBpdGJsX2VudHJ5W2ldLmxlbmd0aCArIGJpb3MtPmRhdGFbb2Zmc2V0ICsgaXRibF9lbnRyeVtpXS5sZW5ndGhfb2Zmc2V0XSppdGJsX2VudHJ5W2ldLmxlbmd0aF9tdWx0aXBsaWVyOworfQorCisjZGVmaW5lIE1BWF9UQUJMRV9PUFMgMTAwMAorCitzdGF0aWMgaW50CitwYXJzZV9pbml0X3RhYmxlKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCSBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIFBhcnNlcyBhbGwgY29tbWFuZHMgaW4gYW4gaW5pdCB0YWJsZS4KKwkgKgorCSAqIFdlIHN0YXJ0IG91dCBleGVjdXRpbmcgYWxsIGNvbW1hbmRzIGZvdW5kIGluIHRoZSBpbml0IHRhYmxlLiBTb21lCisJICogb3Bjb2RlcyBtYXkgY2hhbmdlIHRoZSBzdGF0dXMgb2YgaWV4ZWMtPmV4ZWN1dGUgdG8gU0tJUCwgd2hpY2ggd2lsbAorCSAqIGNhdXNlIHRoZSBmb2xsb3dpbmcgb3Bjb2RlcyB0byBwZXJmb3JtIG5vIG9wZXJhdGlvbiB1bnRpbCB0aGUgdmFsdWUKKwkgKiBpcyBjaGFuZ2VkIGJhY2sgdG8gRVhFQ1VURS4KKwkgKi8KKworCWludCBjb3VudCA9IDAsIGk7CisJdWludDhfdCBpZDsKKworCS8qCisJICogTG9vcCB1bnRpbCBJTklUX0RPTkUgY2F1c2VzIHVzIHRvIGJyZWFrIG91dCBvZiB0aGUgbG9vcAorCSAqIChvciB1bnRpbCBvZmZzZXQgPiBiaW9zIGxlbmd0aCBqdXN0IGluIGNhc2UuLi4gKQorCSAqIChhbmQgbm8gbW9yZSB0aGFuIE1BWF9UQUJMRV9PUFMgaXRlcmF0aW9ucywganVzdCBpbiBjYXNlLi4uICkKKwkgKi8KKwl3aGlsZSAoKG9mZnNldCA8IGJpb3MtPmxlbmd0aCkgJiYgKGNvdW50KysgPCBNQVhfVEFCTEVfT1BTKSkgeworCQlpZCA9IGJpb3MtPmRhdGFbb2Zmc2V0XTsKKworCQkvKiBGaW5kIG1hdGNoaW5nIGlkIGluIGl0YmxfZW50cnkgKi8KKwkJZm9yIChpID0gMDsgaXRibF9lbnRyeVtpXS5uYW1lICYmIChpdGJsX2VudHJ5W2ldLmlkICE9IGlkKTsgaSsrKQorCQkJOworCisJCWlmIChpdGJsX2VudHJ5W2ldLm5hbWUpIHsKKwkJCUJJT1NMT0coYmlvcywgIjB4JTA0WDogWyAoMHglMDJYKSAtICVzIF1cbiIsCisJCQkJb2Zmc2V0LCBpdGJsX2VudHJ5W2ldLmlkLCBpdGJsX2VudHJ5W2ldLm5hbWUpOworCisJCQkvKiBleGVjdXRlIGV2ZW50dWFsIGNvbW1hbmQgaGFuZGxlciAqLworCQkJaWYgKGl0YmxfZW50cnlbaV0uaGFuZGxlcikKKwkJCQlpZiAoISgqaXRibF9lbnRyeVtpXS5oYW5kbGVyKShiaW9zLCBvZmZzZXQsIGlleGVjKSkKKwkJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlOVl9FUlJPUihiaW9zLT5kZXYsCisJCQkJICIweCUwNFg6IEluaXQgdGFibGUgY29tbWFuZCBub3QgZm91bmQ6ICIKKwkJCQkgIjB4JTAyWFxuIiwgb2Zmc2V0LCBpZCk7CisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJfQorCisJCS8qCisJCSAqIEFkZCB0aGUgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IGNvbW1hbmQgaW5jbHVkaW5nIGFsbCBkYXRhCisJCSAqIG9mIHRoYXQgY29tbWFuZC4gVGhlIG9mZnNldCB3aWxsIHRoZW4gYmUgcG9pbnRpbmcgb24gdGhlCisJCSAqIG5leHQgb3AgY29kZS4KKwkJICovCisJCW9mZnNldCArPSBnZXRfaW5pdF90YWJsZV9lbnRyeV9sZW5ndGgoYmlvcywgb2Zmc2V0LCBpKTsKKwl9CisKKwlpZiAob2Zmc2V0ID49IGJpb3MtPmxlbmd0aCkKKwkJTlZfV0FSTihiaW9zLT5kZXYsCisJCQkiT2Zmc2V0IDB4JTA0WCBncmVhdGVyIHRoYW4ga25vd24gYmlvcyBpbWFnZSBsZW5ndGguICAiCisJCQkiQ29ycnVwdCBpbWFnZT9cbiIsIG9mZnNldCk7CisJaWYgKGNvdW50ID49IE1BWF9UQUJMRV9PUFMpCisJCU5WX1dBUk4oYmlvcy0+ZGV2LAorCQkJIk1vcmUgdGhhbiAlZCBvcGNvZGVzIHRvIGEgdGFibGUgaXMgdW5saWtlbHksICIKKwkJCSJpcyB0aGUgYmlvcyBpbWFnZSBjb3JydXB0P1xuIiwgTUFYX1RBQkxFX09QUyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3BhcnNlX2luaXRfdGFibGVzKHN0cnVjdCBudmJpb3MgKmJpb3MpCit7CisJLyogTG9vcHMgYW5kIGNhbGxzIHBhcnNlX2luaXRfdGFibGUoKSBmb3IgZWFjaCBwcmVzZW50IHRhYmxlLiAqLworCisJaW50IGkgPSAwOworCXVpbnQxNl90IHRhYmxlOworCXN0cnVjdCBpbml0X2V4ZWMgaWV4ZWMgPSB7dHJ1ZSwgZmFsc2V9OworCisJaWYgKGJpb3MtPm9sZF9zdHlsZV9pbml0KSB7CisJCWlmIChiaW9zLT5pbml0X3NjcmlwdF90YmxzX3B0cikKKwkJCXBhcnNlX2luaXRfdGFibGUoYmlvcywgYmlvcy0+aW5pdF9zY3JpcHRfdGJsc19wdHIsICZpZXhlYyk7CisJCWlmIChiaW9zLT5leHRyYV9pbml0X3NjcmlwdF90YmxfcHRyKQorCQkJcGFyc2VfaW5pdF90YWJsZShiaW9zLCBiaW9zLT5leHRyYV9pbml0X3NjcmlwdF90YmxfcHRyLCAmaWV4ZWMpOworCisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoKHRhYmxlID0gUk9NMTYoYmlvcy0+ZGF0YVtiaW9zLT5pbml0X3NjcmlwdF90YmxzX3B0ciArIGldKSkpIHsKKwkJTlZfSU5GTyhiaW9zLT5kZXYsCisJCQkiUGFyc2luZyBWQklPUyBpbml0IHRhYmxlICVkIGF0IG9mZnNldCAweCUwNFhcbiIsCisJCQlpIC8gMiwgdGFibGUpOworCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IC0tLS0tLSBFeGVjdXRpbmcgZm9sbG93aW5nIGNvbW1hbmRzIC0tLS0tLVxuIiwgdGFibGUpOworCisJCXBhcnNlX2luaXRfdGFibGUoYmlvcywgdGFibGUsICZpZXhlYyk7CisJCWkgKz0gMjsKKwl9Cit9CisKK3N0YXRpYyB1aW50MTZfdCBjbGtjbXB0YWJsZShzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBjbGt0YWJsZSwgaW50IHB4Y2xrKQoreworCWludCBjb21wYXJlX3JlY29yZF9sZW4sIGkgPSAwOworCXVpbnQxNl90IGNvbXBhcmVjbGssIHNjcmlwdHB0ciA9IDA7CisKKwlpZiAoYmlvcy0+bWFqb3JfdmVyc2lvbiA8IDUpIC8qIHByZSBCSVQgKi8KKwkJY29tcGFyZV9yZWNvcmRfbGVuID0gMzsKKwllbHNlCisJCWNvbXBhcmVfcmVjb3JkX2xlbiA9IDQ7CisKKwlkbyB7CisJCWNvbXBhcmVjbGsgPSBST00xNihiaW9zLT5kYXRhW2Nsa3RhYmxlICsgY29tcGFyZV9yZWNvcmRfbGVuICogaV0pOworCQlpZiAocHhjbGsgPj0gY29tcGFyZWNsayAqIDEwKSB7CisJCQlpZiAoYmlvcy0+bWFqb3JfdmVyc2lvbiA8IDUpIHsKKwkJCQl1aW50OF90IHRtZHNzdWIgPSBiaW9zLT5kYXRhW2Nsa3RhYmxlICsgMiArIGNvbXBhcmVfcmVjb3JkX2xlbiAqIGldOworCQkJCXNjcmlwdHB0ciA9IFJPTTE2KGJpb3MtPmRhdGFbYmlvcy0+aW5pdF9zY3JpcHRfdGJsc19wdHIgKyB0bWRzc3ViICogMl0pOworCQkJfSBlbHNlCisJCQkJc2NyaXB0cHRyID0gUk9NMTYoYmlvcy0+ZGF0YVtjbGt0YWJsZSArIDIgKyBjb21wYXJlX3JlY29yZF9sZW4gKiBpXSk7CisJCQlicmVhazsKKwkJfQorCQlpKys7CisJfSB3aGlsZSAoY29tcGFyZWNsayk7CisKKwlyZXR1cm4gc2NyaXB0cHRyOworfQorCitzdGF0aWMgdm9pZAorcnVuX2RpZ2l0YWxfb3Bfc2NyaXB0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQxNl90IHNjcmlwdHB0ciwKKwkJICAgICAgc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50LCBpbnQgaGVhZCwgYm9vbCBkbCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPlZCSU9TOworCXN0cnVjdCBpbml0X2V4ZWMgaWV4ZWMgPSB7dHJ1ZSwgZmFsc2V9OworCisJTlZfVFJBQ0UoZGV2LCAiMHglMDRYOiBQYXJzaW5nIGRpZ2l0YWwgb3V0cHV0IHNjcmlwdCB0YWJsZVxuIiwKKwkJIHNjcmlwdHB0cik7CisJYmlvc19pZHhwcnRfd3IoYmlvcywgTlZfQ0lPX0NSWF9fQ09MT1IsIE5WX0NJT19DUkVfNDQsCisJCSAgICAgICBoZWFkID8gTlZfQ0lPX0NSRV80NF9IRUFEQiA6IE5WX0NJT19DUkVfNDRfSEVBREEpOworCS8qIG5vdGU6IGlmIGRjYiBlbnRyaWVzIGhhdmUgYmVlbiBtZXJnZWQsIGluZGV4IG1heSBiZSBtaXNsZWFkaW5nICovCisJTlZXcml0ZVZnYUNydGM1NzU4KGRldiwgaGVhZCwgMCwgZGNiZW50LT5pbmRleCk7CisJcGFyc2VfaW5pdF90YWJsZShiaW9zLCBzY3JpcHRwdHIsICZpZXhlYyk7CisKKwludjA0X2RmcF9iaW5kX2hlYWQoZGV2LCBkY2JlbnQsIGhlYWQsIGRsKTsKK30KKworc3RhdGljIGludCBjYWxsX2x2ZHNfbWFudWZhY3R1cmVyX3NjcmlwdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQsIGludCBoZWFkLCBlbnVtIExWRFNfc2NyaXB0IHNjcmlwdCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPlZCSU9TOworCXVpbnQ4X3Qgc3ViID0gYmlvcy0+ZGF0YVtiaW9zLT5mcC54bGF0ZWRfZW50cnkgKyBzY3JpcHRdICsgKGJpb3MtPmZwLmxpbmtfY19pbmNyZW1lbnQgJiYgZGNiZW50LT5vciAmIE9VVFBVVF9DID8gMSA6IDApOworCXVpbnQxNl90IHNjcmlwdG9mcyA9IFJPTTE2KGJpb3MtPmRhdGFbYmlvcy0+aW5pdF9zY3JpcHRfdGJsc19wdHIgKyBzdWIgKiAyXSk7CisKKwlpZiAoIWJpb3MtPmZwLnhsYXRlZF9lbnRyeSB8fCAhc3ViIHx8ICFzY3JpcHRvZnMpCisJCXJldHVybiAtRUlOVkFMOworCisJcnVuX2RpZ2l0YWxfb3Bfc2NyaXB0KGRldiwgc2NyaXB0b2ZzLCBkY2JlbnQsIGhlYWQsIGJpb3MtPmZwLmR1YWxfbGluayk7CisKKwlpZiAoc2NyaXB0ID09IExWRFNfUEFORUxfT0ZGKSB7CisJCS8qIG9mZi1vbiBkZWxheSBpbiBtcyAqLworCQltc2xlZXAoUk9NMTYoYmlvcy0+ZGF0YVtiaW9zLT5mcC54bGF0ZWRfZW50cnkgKyA3XSkpOworCX0KKyNpZmRlZiBfX3Bvd2VycGNfXworCS8qIFBvd2VyYm9vayBzcGVjaWZpYyBxdWlya3MgKi8KKwlpZiAoc2NyaXB0ID09IExWRFNfUkVTRVQgJiYgKChkZXYtPnBjaV9kZXZpY2UgJiAweGZmZmYpID09IDB4MDE3OSB8fCAoZGV2LT5wY2lfZGV2aWNlICYgMHhmZmZmKSA9PSAweDAzMjkpKQorCQludl93cml0ZV90bWRzKGRldiwgZGNiZW50LT5vciwgMCwgMHgwMiwgMHg3Mik7CisJaWYgKChkZXYtPnBjaV9kZXZpY2UgJiAweGZmZmYpID09IDB4MDE3OSB8fCAoZGV2LT5wY2lfZGV2aWNlICYgMHhmZmZmKSA9PSAweDAxODkgfHwgKGRldi0+cGNpX2RldmljZSAmIDB4ZmZmZikgPT0gMHgwMzI5KSB7CisJCWlmIChzY3JpcHQgPT0gTFZEU19QQU5FTF9PTikgeworCQkJYmlvc193cjMyKGJpb3MsIE5WX1BCVVNfREVCVUdfRFVBTEhFQURfQ1RMLCBiaW9zX3JkMzIoYmlvcywgTlZfUEJVU19ERUJVR19EVUFMSEVBRF9DVEwpIHwgKDEgPDwgMzEpKTsKKwkJCWJpb3Nfd3IzMihiaW9zLCBOVl9QQ1JUQ19HUElPX0VYVCwgYmlvc19yZDMyKGJpb3MsIE5WX1BDUlRDX0dQSU9fRVhUKSB8IDEpOworCQl9CisJCWlmIChzY3JpcHQgPT0gTFZEU19QQU5FTF9PRkYpIHsKKwkJCWJpb3Nfd3IzMihiaW9zLCBOVl9QQlVTX0RFQlVHX0RVQUxIRUFEX0NUTCwgYmlvc19yZDMyKGJpb3MsIE5WX1BCVVNfREVCVUdfRFVBTEhFQURfQ1RMKSAmIH4oMSA8PCAzMSkpOworCQkJYmlvc193cjMyKGJpb3MsIE5WX1BDUlRDX0dQSU9fRVhULCBiaW9zX3JkMzIoYmlvcywgTlZfUENSVENfR1BJT19FWFQpICYgfjMpOworCQl9CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydW5fbHZkc190YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQsIGludCBoZWFkLCBlbnVtIExWRFNfc2NyaXB0IHNjcmlwdCwgaW50IHB4Y2xrKQoreworCS8qCisJICogVGhlIEJJVCBMVkRTIHRhYmxlJ3MgaGVhZGVyIGhhcyB0aGUgaW5mb3JtYXRpb24gdG8gc2V0dXAgdGhlCisJICogbmVjZXNzYXJ5IHJlZ2lzdGVycy4gRm9sbG93aW5nIHRoZSBzdGFuZGFyZCA0IGJ5dGUgaGVhZGVyIGFyZToKKwkgKiBBIGJpdG1hc2sgYnl0ZSBhbmQgYSBkdWFsLWxpbmsgdHJhbnNpdGlvbiBweGNsayB2YWx1ZSBmb3IgdXNlIGluCisJICogc2VsZWN0aW5nIHRoZSBpbml0IHNjcmlwdCB3aGVuIG5vdCB1c2luZyBzdHJhcHM7IDQgc2NyaXB0IHBvaW50ZXJzCisJICogZm9yIHBhbmVsIHBvd2VyLCBzZWxlY3RlZCBieSBvdXRwdXQgYW5kIG9uL29mZjsgYW5kIDggdGFibGUgcG9pbnRlcnMKKwkgKiBmb3IgcGFuZWwgaW5pdCwgdGhlIG5lZWRlZCBvbmUgZGV0ZXJtaW5lZCBieSBvdXRwdXQsIGFuZCBiaXRzIGluIHRoZQorCSAqIGNvbmYgYnl0ZS4gVGhlc2UgdGFibGVzIGFyZSBzaW1pbGFyIHRvIHRoZSBUTURTIHRhYmxlcywgY29uc2lzdGluZworCSAqIG9mIGEgbGlzdCBvZiBweGNsa3MgYW5kIHNjcmlwdCBwb2ludGVycy4KKwkgKi8KKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPlZCSU9TOworCXVuc2lnbmVkIGludCBvdXRwdXRzZXQgPSAoZGNiZW50LT5vciA9PSA0KSA/IDEgOiAwOworCXVpbnQxNl90IHNjcmlwdHB0ciA9IDAsIGNsa3RhYmxlOworCXVpbnQ4X3QgY2xrdGFibGVwdHIgPSAwOworCisJLyoKKwkgKiBGb3Igbm93IHdlIGFzc3VtZSB2ZXJzaW9uIDMuMCB0YWJsZSAtIGc4MCBzdXBwb3J0IHdpbGwgbmVlZCBzb21lCisJICogY2hhbmdlcworCSAqLworCisJc3dpdGNoIChzY3JpcHQpIHsKKwljYXNlIExWRFNfSU5JVDoKKwkJcmV0dXJuIC1FTk9TWVM7CisJY2FzZSBMVkRTX0JBQ0tMSUdIVF9PTjoKKwljYXNlIExWRFNfUEFORUxfT046CisJCXNjcmlwdHB0ciA9IFJPTTE2KGJpb3MtPmRhdGFbYmlvcy0+ZnAubHZkc21hbnVmYWN0dXJlcnBvaW50ZXIgKyA3ICsgb3V0cHV0c2V0ICogMl0pOworCQlicmVhazsKKwljYXNlIExWRFNfQkFDS0xJR0hUX09GRjoKKwljYXNlIExWRFNfUEFORUxfT0ZGOgorCQlzY3JpcHRwdHIgPSBST00xNihiaW9zLT5kYXRhW2Jpb3MtPmZwLmx2ZHNtYW51ZmFjdHVyZXJwb2ludGVyICsgMTEgKyBvdXRwdXRzZXQgKiAyXSk7CisJCWJyZWFrOworCWNhc2UgTFZEU19SRVNFVDoKKwkJaWYgKGRjYmVudC0+bHZkc2NvbmYudXNlX3N0cmFwc19mb3JfbW9kZSkgeworCQkJaWYgKGJpb3MtPmZwLmR1YWxfbGluaykKKwkJCQljbGt0YWJsZXB0ciArPSAyOworCQkJaWYgKGJpb3MtPmZwLkJJVGJpdDEpCisJCQkJY2xrdGFibGVwdHIrKzsKKwkJfSBlbHNlIHsKKwkJCS8qIHVzaW5nIEVESUQgKi8KKwkJCXVpbnQ4X3QgZmFsbGJhY2sgPSBiaW9zLT5kYXRhW2Jpb3MtPmZwLmx2ZHNtYW51ZmFjdHVyZXJwb2ludGVyICsgNF07CisJCQlpbnQgZmFsbGJhY2tjbXB2YWwgPSAoZGNiZW50LT5vciA9PSA0KSA/IDQgOiAxOworCisJCQlpZiAoYmlvcy0+ZnAuZHVhbF9saW5rKSB7CisJCQkJY2xrdGFibGVwdHIgKz0gMjsKKwkJCQlmYWxsYmFja2NtcHZhbCAqPSAyOworCQkJfQorCQkJaWYgKGZhbGxiYWNrY21wdmFsICYgZmFsbGJhY2spCisJCQkJY2xrdGFibGVwdHIrKzsKKwkJfQorCisJCS8qIGFkZGluZyBvdXRwdXRzZXQgKiA4IG1heSBub3QgYmUgY29ycmVjdCAqLworCQljbGt0YWJsZSA9IFJPTTE2KGJpb3MtPmRhdGFbYmlvcy0+ZnAubHZkc21hbnVmYWN0dXJlcnBvaW50ZXIgKyAxNSArIGNsa3RhYmxlcHRyICogMiArIG91dHB1dHNldCAqIDhdKTsKKwkJaWYgKCFjbGt0YWJsZSkgeworCQkJTlZfRVJST1IoZGV2LCAiUGl4ZWwgY2xvY2sgY29tcGFyaXNvbiB0YWJsZSBub3QgZm91bmRcbiIpOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKwkJc2NyaXB0cHRyID0gY2xrY21wdGFibGUoYmlvcywgY2xrdGFibGUsIHB4Y2xrKTsKKwl9CisKKwlpZiAoIXNjcmlwdHB0cikgeworCQlOVl9FUlJPUihkZXYsICJMVkRTIG91dHB1dCBpbml0IHNjcmlwdCBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJcnVuX2RpZ2l0YWxfb3Bfc2NyaXB0KGRldiwgc2NyaXB0cHRyLCBkY2JlbnQsIGhlYWQsIGJpb3MtPmZwLmR1YWxfbGluayk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNhbGxfbHZkc19zY3JpcHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50LCBpbnQgaGVhZCwgZW51bSBMVkRTX3NjcmlwdCBzY3JpcHQsIGludCBweGNsaykKK3sKKwkvKgorCSAqIExWRFMgb3BlcmF0aW9ucyBhcmUgbXVsdGlwbGV4ZWQgaW4gYW4gZWZmb3J0IHRvIHByZXNlbnQgYSBzaW5nbGUgQVBJCisJICogd2hpY2ggd29ya3Mgd2l0aCB0d28gdmFzdGx5IGRpZmZlcmluZyB1bmRlcmx5aW5nIHN0cnVjdHVyZXMuCisJICogVGhpcyBhY3RzIGFzIHRoZSBkZW11eAorCSAqLworCisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZiaW9zICpiaW9zID0gJmRldl9wcml2LT5WQklPUzsKKwl1aW50OF90IGx2ZHNfdmVyID0gYmlvcy0+ZGF0YVtiaW9zLT5mcC5sdmRzbWFudWZhY3R1cmVycG9pbnRlcl07CisJdWludDMyX3Qgc2VsX2Nsa19iaW5kaW5nLCBzZWxfY2xrOworCWludCByZXQ7CisKKwlpZiAoYmlvcy0+ZnAubGFzdF9zY3JpcHRfaW52b2MgPT0gKHNjcmlwdCA8PCAxIHwgaGVhZCkgfHwgIWx2ZHNfdmVyIHx8CisJICAgIChsdmRzX3ZlciA+PSAweDMwICYmIHNjcmlwdCA9PSBMVkRTX0lOSVQpKQorCQlyZXR1cm4gMDsKKworCWlmICghYmlvcy0+ZnAubHZkc19pbml0X3J1bikgeworCQliaW9zLT5mcC5sdmRzX2luaXRfcnVuID0gdHJ1ZTsKKwkJY2FsbF9sdmRzX3NjcmlwdChkZXYsIGRjYmVudCwgaGVhZCwgTFZEU19JTklULCBweGNsayk7CisJfQorCisJaWYgKHNjcmlwdCA9PSBMVkRTX1BBTkVMX09OICYmIGJpb3MtPmZwLnJlc2V0X2FmdGVyX3BjbGtfY2hhbmdlKQorCQljYWxsX2x2ZHNfc2NyaXB0KGRldiwgZGNiZW50LCBoZWFkLCBMVkRTX1JFU0VULCBweGNsayk7CisJaWYgKHNjcmlwdCA9PSBMVkRTX1JFU0VUICYmIGJpb3MtPmZwLnBvd2VyX29mZl9mb3JfcmVzZXQpCisJCWNhbGxfbHZkc19zY3JpcHQoZGV2LCBkY2JlbnQsIGhlYWQsIExWRFNfUEFORUxfT0ZGLCBweGNsayk7CisKKwlOVl9UUkFDRShkZXYsICJDYWxsaW5nIExWRFMgc2NyaXB0ICVkOlxuIiwgc2NyaXB0KTsKKworCS8qIGRvbid0IGxldCBzY3JpcHQgY2hhbmdlIHBsbC0+aGVhZCBiaW5kaW5nICovCisJc2VsX2Nsa19iaW5kaW5nID0gYmlvc19yZDMyKGJpb3MsIE5WX1BSQU1EQUNfU0VMX0NMSykgJiAweDUwMDAwOworCisJaWYgKGx2ZHNfdmVyIDwgMHgzMCkKKwkJcmV0ID0gY2FsbF9sdmRzX21hbnVmYWN0dXJlcl9zY3JpcHQoZGV2LCBkY2JlbnQsIGhlYWQsIHNjcmlwdCk7CisJZWxzZQorCQlyZXQgPSBydW5fbHZkc190YWJsZShkZXYsIGRjYmVudCwgaGVhZCwgc2NyaXB0LCBweGNsayk7CisKKwliaW9zLT5mcC5sYXN0X3NjcmlwdF9pbnZvYyA9IChzY3JpcHQgPDwgMSB8IGhlYWQpOworCisJc2VsX2NsayA9IE5WUmVhZFJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfU0VMX0NMSykgJiB+MHg1MDAwMDsKKwlOVldyaXRlUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19TRUxfQ0xLLCBzZWxfY2xrIHwgc2VsX2Nsa19iaW5kaW5nKTsKKwkvKiBzb21lIHNjcmlwdHMgc2V0IGEgdmFsdWUgaW4gTlZfUEJVU19QT1dFUkNUUkxfMiBhbmQgYnJlYWsgdmlkZW8gb3ZlcmxheSAqLworCW52V3JpdGVNQyhkZXYsIE5WX1BCVVNfUE9XRVJDVFJMXzIsIDApOworCisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IGx2ZHN0YWJsZWhlYWRlciB7CisJdWludDhfdCBsdmRzX3ZlciwgaGVhZGVybGVuLCByZWNvcmRsZW47Cit9OworCitzdGF0aWMgaW50IHBhcnNlX2x2ZHNfbWFudWZhY3R1cmVyX3RhYmxlX2hlYWRlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgbnZiaW9zICpiaW9zLCBzdHJ1Y3QgbHZkc3RhYmxlaGVhZGVyICpsdGgpCit7CisJLyoKKwkgKiBCTVAgdmVyc2lvbiAoMHhhKSBMVkRTIHRhYmxlIGhhcyBhIHNpbXBsZSBoZWFkZXIgb2YgdmVyc2lvbiBhbmQKKwkgKiByZWNvcmQgbGVuZ3RoLiBUaGUgQklUIExWRFMgdGFibGUgaGFzIHRoZSB0eXBpY2FsIEJJVCB0YWJsZSBoZWFkZXI6CisJICogdmVyc2lvbiBieXRlLCBoZWFkZXIgbGVuZ3RoIGJ5dGUsIHJlY29yZCBsZW5ndGggYnl0ZSwgYW5kIGEgYnl0ZSBmb3IKKwkgKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVjb3JkcyB0aGF0IGNhbiBiZSBoZWxkIGluIHRoZSB0YWJsZS4KKwkgKi8KKworCXVpbnQ4X3QgbHZkc192ZXIsIGhlYWRlcmxlbiwgcmVjb3JkbGVuOworCisJbWVtc2V0KGx0aCwgMCwgc2l6ZW9mKHN0cnVjdCBsdmRzdGFibGVoZWFkZXIpKTsKKworCWlmIChiaW9zLT5mcC5sdmRzbWFudWZhY3R1cmVycG9pbnRlciA9PSAweDApIHsKKwkJTlZfRVJST1IoZGV2LCAiUG9pbnRlciB0byBMVkRTIG1hbnVmYWN0dXJlciB0YWJsZSBpbnZhbGlkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbHZkc192ZXIgPSBiaW9zLT5kYXRhW2Jpb3MtPmZwLmx2ZHNtYW51ZmFjdHVyZXJwb2ludGVyXTsKKworCXN3aXRjaCAobHZkc192ZXIpIHsKKwljYXNlIDB4MGE6CS8qIHByZSBOVjQwICovCisJCWhlYWRlcmxlbiA9IDI7CisJCXJlY29yZGxlbiA9IGJpb3MtPmRhdGFbYmlvcy0+ZnAubHZkc21hbnVmYWN0dXJlcnBvaW50ZXIgKyAxXTsKKwkJYnJlYWs7CisJY2FzZSAweDMwOgkvKiBOVjR4ICovCisJCWhlYWRlcmxlbiA9IGJpb3MtPmRhdGFbYmlvcy0+ZnAubHZkc21hbnVmYWN0dXJlcnBvaW50ZXIgKyAxXTsKKwkJaWYgKGhlYWRlcmxlbiA8IDB4MWYpIHsKKwkJCU5WX0VSUk9SKGRldiwgIkxWRFMgdGFibGUgaGVhZGVyIG5vdCB1bmRlcnN0b29kXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJlY29yZGxlbiA9IGJpb3MtPmRhdGFbYmlvcy0+ZnAubHZkc21hbnVmYWN0dXJlcnBvaW50ZXIgKyAyXTsKKwkJYnJlYWs7CisJY2FzZSAweDQwOgkvKiBHODAvRzkwICovCisJCWhlYWRlcmxlbiA9IGJpb3MtPmRhdGFbYmlvcy0+ZnAubHZkc21hbnVmYWN0dXJlcnBvaW50ZXIgKyAxXTsKKwkJaWYgKGhlYWRlcmxlbiA8IDB4NykgeworCQkJTlZfRVJST1IoZGV2LCAiTFZEUyB0YWJsZSBoZWFkZXIgbm90IHVuZGVyc3Rvb2RcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmVjb3JkbGVuID0gYmlvcy0+ZGF0YVtiaW9zLT5mcC5sdmRzbWFudWZhY3R1cmVycG9pbnRlciArIDJdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlOVl9FUlJPUihkZXYsCisJCQkgIkxWRFMgdGFibGUgcmV2aXNpb24gJWQuJWQgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWRcbiIsCisJCQkgbHZkc192ZXIgPj4gNCwgbHZkc192ZXIgJiAweGYpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKKwlsdGgtPmx2ZHNfdmVyID0gbHZkc192ZXI7CisJbHRoLT5oZWFkZXJsZW4gPSBoZWFkZXJsZW47CisJbHRoLT5yZWNvcmRsZW4gPSByZWNvcmRsZW47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZ2V0X2ZwX3N0cmFwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBudmJpb3MgKmJpb3MpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCS8qCisJICogVGhlIGZwIHN0cmFwIGlzIG5vcm1hbGx5IGRpY3RhdGVkIGJ5IHRoZSAiVXNlciBTdHJhcCIgaW4KKwkgKiBQRVhUREVWX0JPT1RfMFsyMDoxNl0sIGJ1dCBvbiBCTVAgY2FyZHMgd2hlbiBiaXQgMiBvZiB0aGUKKwkgKiBJbnRlcm5hbF9GbGFncyBzdHJ1Y3QgYXQgMHg0OCBpcyBzZXQsIHRoZSB1c2VyIHN0cmFwIGdldHMgb3ZlcnJpZGVuCisJICogYnkgdGhlIFBDSSBzdWJzeXN0ZW0gSUQgZHVyaW5nIFBPU1QsIGJ1dCBub3QgYmVmb3JlIHRoZSBwcmV2aW91cyB1c2VyCisJICogc3RyYXAgaGFzIGJlZW4gY29tbWl0dGVkIHRvIENSNTggZm9yIENSNTc9MHhmIG9uIGhlYWQgQSwgd2hpY2ggbWF5IGJlCisJICogcmVhZCBhbmQgdXNlZCBpbnN0ZWFkCisJICovCisKKwlpZiAoYmlvcy0+bWFqb3JfdmVyc2lvbiA8IDUgJiYgYmlvcy0+ZGF0YVsweDQ4XSAmIDB4NCkKKwkJcmV0dXJuIE5WUmVhZFZnYUNydGM1NzU4KGRldiwgMCwgMHhmKSAmIDB4ZjsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKQorCQlyZXR1cm4gKGJpb3NfcmQzMihiaW9zLCBOVl9QRVhUREVWX0JPT1RfMCkgPj4gMjQpICYgMHhmOworCWVsc2UKKwkJcmV0dXJuIChiaW9zX3JkMzIoYmlvcywgTlZfUEVYVERFVl9CT09UXzApID4+IDE2KSAmIDB4ZjsKK30KKworc3RhdGljIGludCBwYXJzZV9mcF9tb2RlX3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBudmJpb3MgKmJpb3MpCit7CisJdWludDhfdCAqZnB0YWJsZTsKKwl1aW50OF90IGZwdGFibGVfdmVyLCBoZWFkZXJsZW4gPSAwLCByZWNvcmRsZW4sIGZwZW50cmllcyA9IDB4ZiwgZnBpbmRleDsKKwlpbnQgcmV0LCBvZnMsIGZwc3RyYXBwaW5nOworCXN0cnVjdCBsdmRzdGFibGVoZWFkZXIgbHRoOworCisJaWYgKGJpb3MtPmZwLmZwdGFibGVwb2ludGVyID09IDB4MCkgeworCQkvKiBBcHBsZSBjYXJkcyBkb24ndCBoYXZlIHRoZSBmcCB0YWJsZTsgdGhlIGxhcHRvcHMgdXNlIEREQyAqLworCQkvKiBUaGUgdGFibGUgaXMgYWxzbyBtaXNzaW5nIG9uIHNvbWUgeDg2IElHUHMgKi8KKyNpZm5kZWYgX19wb3dlcnBjX18KKwkJTlZfRVJST1IoZGV2LCAiUG9pbnRlciB0byBmbGF0IHBhbmVsIHRhYmxlIGludmFsaWRcbiIpOworI2VuZGlmCisJCWJpb3MtPnB1Yi5kaWdpdGFsX21pbl9mcm9udF9wb3JjaCA9IDB4NGI7CisJCXJldHVybiAwOworCX0KKworCWZwdGFibGUgPSAmYmlvcy0+ZGF0YVtiaW9zLT5mcC5mcHRhYmxlcG9pbnRlcl07CisJZnB0YWJsZV92ZXIgPSBmcHRhYmxlWzBdOworCisJc3dpdGNoIChmcHRhYmxlX3ZlcikgeworCS8qCisJICogQk1QIHZlcnNpb24gMHg1LjB4MTEgQklPU2VuIGhhdmUgdmVyc2lvbiAxIGxpa2UgdGFibGVzLCBidXQgbm8KKwkgKiB2ZXJzaW9uIGZpZWxkLCBhbmQgbWlzcyBvbmUgb2YgdGhlIHNwcmVhZCBzcGVjdHJ1bS9QV00gYnl0ZXMuCisJICogVGhpcyBjb3VsZCBhZmZlY3QgZWFybHkgR0YyR28gcGFydHMgKG5vdCBzZWVuIGFueSBhcHByb3ByaWF0ZSBST01zCisJICogdGhvdWdoKS4gSGVyZSB3ZSBhc3N1bWUgdGhhdCBhIHZlcnNpb24gb2YgMHgwNSBtYXRjaGVzIHRoaXMgY2FzZQorCSAqIChjb21iaW5pbmcgd2l0aCBhIEJNUCB2ZXJzaW9uIGNoZWNrIHdvdWxkIGJlIGJldHRlciksIGFzIHRoZQorCSAqIGNvbW1vbiBjYXNlIGZvciB0aGUgcGFuZWwgdHlwZSBmaWVsZCBpcyAweDAwMDUsIGFuZCB0aGF0IGlzIGluCisJICogZmFjdCB3aGF0IHdlIGFyZSByZWFkaW5nIHRoZSBmaXJzdCBieXRlIG9mLgorCSAqLworCWNhc2UgMHgwNToJLyogc29tZSBOVjEwLCAxMSwgMTUsIDE2ICovCisJCXJlY29yZGxlbiA9IDQyOworCQlvZnMgPSAtMTsKKwkJYnJlYWs7CisJY2FzZSAweDEwOgkvKiBzb21lIE5WMTUvMTYsIGFuZCBOVjExKyAqLworCQlyZWNvcmRsZW4gPSA0NDsKKwkJb2ZzID0gMDsKKwkJYnJlYWs7CisJY2FzZSAweDIwOgkvKiBOVjQwKyAqLworCQloZWFkZXJsZW4gPSBmcHRhYmxlWzFdOworCQlyZWNvcmRsZW4gPSBmcHRhYmxlWzJdOworCQlmcGVudHJpZXMgPSBmcHRhYmxlWzNdOworCQkvKgorCQkgKiBmcHRhYmxlWzRdIGlzIHRoZSBtaW5pbXVtCisJCSAqIFJBTURBQ19GUF9IQ1JUQyAtPiBSQU1EQUNfRlBfSFNZTkNfU1RBUlQgZ2FwCisJCSAqLworCQliaW9zLT5wdWIuZGlnaXRhbF9taW5fZnJvbnRfcG9yY2ggPSBmcHRhYmxlWzRdOworCQlvZnMgPSAtNzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTlZfRVJST1IoZGV2LAorCQkJICJGUCB0YWJsZSByZXZpc2lvbiAlZC4lZCBub3QgY3VycmVudGx5IHN1cHBvcnRlZFxuIiwKKwkJCSBmcHRhYmxlX3ZlciA+PiA0LCBmcHRhYmxlX3ZlciAmIDB4Zik7CisJCXJldHVybiAtRU5PU1lTOworCX0KKworCWlmICghYmlvcy0+aXNfbW9iaWxlKSAvKiAhbW9iaWxlIG9ubHkgbmVlZHMgZGlnaXRhbF9taW5fZnJvbnRfcG9yY2ggKi8KKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBwYXJzZV9sdmRzX21hbnVmYWN0dXJlcl90YWJsZV9oZWFkZXIoZGV2LCBiaW9zLCAmbHRoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGx0aC5sdmRzX3ZlciA9PSAweDMwIHx8IGx0aC5sdmRzX3ZlciA9PSAweDQwKSB7CisJCWJpb3MtPmZwLmZweGxhdGV0YWJsZXB0ciA9IGJpb3MtPmZwLmx2ZHNtYW51ZmFjdHVyZXJwb2ludGVyICsKKwkJCQkJCQlsdGguaGVhZGVybGVuICsgMTsKKwkJYmlvcy0+ZnAueGxhdHdpZHRoID0gbHRoLnJlY29yZGxlbjsKKwl9CisJaWYgKGJpb3MtPmZwLmZweGxhdGV0YWJsZXB0ciA9PSAweDApIHsKKwkJTlZfRVJST1IoZGV2LCAiUG9pbnRlciB0byBmbGF0IHBhbmVsIHhsYXQgdGFibGUgaW52YWxpZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZwc3RyYXBwaW5nID0gZ2V0X2ZwX3N0cmFwKGRldiwgYmlvcyk7CisKKwlmcGluZGV4ID0gYmlvcy0+ZGF0YVtiaW9zLT5mcC5mcHhsYXRldGFibGVwdHIgKworCQkJCQlmcHN0cmFwcGluZyAqIGJpb3MtPmZwLnhsYXR3aWR0aF07CisKKwlpZiAoZnBpbmRleCA+IGZwZW50cmllcykgeworCQlOVl9FUlJPUihkZXYsICJCYWQgZmxhdCBwYW5lbCB0YWJsZSBpbmRleFxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCS8qIG52NHggY2FyZHMgbmVlZCBib3RoIGEgc3RyYXAgdmFsdWUgYW5kIGZwaW5kZXggb2YgMHhmIHRvIHVzZSBEREMgKi8KKwlpZiAobHRoLmx2ZHNfdmVyID4gMHgxMCkKKwkJYmlvcy0+cHViLmZwX25vX2RkYyA9IGZwc3RyYXBwaW5nICE9IDB4ZiB8fCBmcGluZGV4ICE9IDB4ZjsKKworCS8qCisJICogSWYgZWl0aGVyIHRoZSBzdHJhcCBvciB4bGF0ZWQgZnBpbmRleCB2YWx1ZSBhcmUgMHhmIHRoZXJlIGlzIG5vCisJICogcGFuZWwgdXNpbmcgYSBzdHJhcC1kZXJpdmVkIGJpb3MgbW9kZSBwcmVzZW50LiAgdGhpcyBjb25kaXRpb24KKwkgKiBpbmNsdWRlcywgYnV0IGlzIGRpZmZlcmVudCBmcm9tLCB0aGUgRERDIHBhbmVsIGluZGljYXRvciBhYm92ZQorCSAqLworCWlmIChmcHN0cmFwcGluZyA9PSAweGYgfHwgZnBpbmRleCA9PSAweGYpCisJCXJldHVybiAwOworCisJYmlvcy0+ZnAubW9kZV9wdHIgPSBiaW9zLT5mcC5mcHRhYmxlcG9pbnRlciArIGhlYWRlcmxlbiArCisJCQkgICAgcmVjb3JkbGVuICogZnBpbmRleCArIG9mczsKKworCU5WX1RSQUNFKGRldiwgIkJJT1MgRlAgbW9kZTogJWR4JWQgKCVka0h6IHBpeGVsIGNsb2NrKVxuIiwKKwkJIFJPTTE2KGJpb3MtPmRhdGFbYmlvcy0+ZnAubW9kZV9wdHIgKyAxMV0pICsgMSwKKwkJIFJPTTE2KGJpb3MtPmRhdGFbYmlvcy0+ZnAubW9kZV9wdHIgKyAyNV0pICsgMSwKKwkJIFJPTTE2KGJpb3MtPmRhdGFbYmlvcy0+ZnAubW9kZV9wdHIgKyA3XSkgKiAxMCk7CisKKwlyZXR1cm4gMDsKK30KKworYm9vbCBub3V2ZWF1X2Jpb3NfZnBfbW9kZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPlZCSU9TOworCXVpbnQ4X3QgKm1vZGVfZW50cnkgPSAmYmlvcy0+ZGF0YVtiaW9zLT5mcC5tb2RlX3B0cl07CisKKwlpZiAoIW1vZGUpCS8qIGp1c3QgY2hlY2tpbmcgd2hldGhlciB3ZSBjYW4gcHJvZHVjZSBhIG1vZGUgKi8KKwkJcmV0dXJuIGJpb3MtPmZwLm1vZGVfcHRyOworCisJbWVtc2V0KG1vZGUsIDAsIHNpemVvZihzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSkpOworCS8qCisJICogRm9yIHZlcnNpb24gMS4wICh2ZXJzaW9uIGluIGJ5dGUgMCk6CisJICogYnl0ZXMgMS0yIGFyZSAicGFuZWwgdHlwZSIsIGluY2x1ZGluZyBiaXRzIG9uIHdoZXRoZXIgQ29sb3VyL21vbm8sCisJICogc2luZ2xlL2R1YWwgbGluaywgYW5kIHR5cGUgKFRGVCBldGMuKQorCSAqIGJ5dGVzIDMtNiBhcmUgYml0cyBwZXIgY29sb3VyIGluIFJHQlgKKwkgKi8KKwltb2RlLT5jbG9jayA9IFJPTTE2KG1vZGVfZW50cnlbN10pICogMTA7CisJLyogYnl0ZXMgOS0xMCBpcyBIQWN0aXZlICovCisJbW9kZS0+aGRpc3BsYXkgPSBST00xNihtb2RlX2VudHJ5WzExXSkgKyAxOworCS8qCisJICogYnl0ZXMgMTMtMTQgaXMgSFZhbGlkIFN0YXJ0CisJICogYnl0ZXMgMTUtMTYgaXMgSFZhbGlkIEVuZAorCSAqLworCW1vZGUtPmhzeW5jX3N0YXJ0ID0gUk9NMTYobW9kZV9lbnRyeVsxN10pICsgMTsKKwltb2RlLT5oc3luY19lbmQgPSBST00xNihtb2RlX2VudHJ5WzE5XSkgKyAxOworCW1vZGUtPmh0b3RhbCA9IFJPTTE2KG1vZGVfZW50cnlbMjFdKSArIDE7CisJLyogYnl0ZXMgMjMtMjQsIDI3LTMwIHNpbWlsYXJseSwgYnV0IHZlcnRpY2FsICovCisJbW9kZS0+dmRpc3BsYXkgPSBST00xNihtb2RlX2VudHJ5WzI1XSkgKyAxOworCW1vZGUtPnZzeW5jX3N0YXJ0ID0gUk9NMTYobW9kZV9lbnRyeVszMV0pICsgMTsKKwltb2RlLT52c3luY19lbmQgPSBST00xNihtb2RlX2VudHJ5WzMzXSkgKyAxOworCW1vZGUtPnZ0b3RhbCA9IFJPTTE2KG1vZGVfZW50cnlbMzVdKSArIDE7CisJbW9kZS0+ZmxhZ3MgfD0gKG1vZGVfZW50cnlbMzddICYgMHgxMCkgPworCQkJRFJNX01PREVfRkxBR19QSFNZTkMgOiBEUk1fTU9ERV9GTEFHX05IU1lOQzsKKwltb2RlLT5mbGFncyB8PSAobW9kZV9lbnRyeVszN10gJiAweDEpID8KKwkJCURSTV9NT0RFX0ZMQUdfUFZTWU5DIDogRFJNX01PREVfRkxBR19OVlNZTkM7CisJLyoKKwkgKiBieXRlcyAzOC0zOSByZWxhdGUgdG8gc3ByZWFkIHNwZWN0cnVtIHNldHRpbmdzCisJICogYnl0ZXMgNDAtNDMgYXJlIHNvbWV0aGluZyB0byBkbyB3aXRoIFBXTQorCSAqLworCisJbW9kZS0+c3RhdHVzID0gTU9ERV9PSzsKKwltb2RlLT50eXBlID0gRFJNX01PREVfVFlQRV9EUklWRVIgfCBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRDsKKwlkcm1fbW9kZV9zZXRfbmFtZShtb2RlKTsKKwlyZXR1cm4gYmlvcy0+ZnAubW9kZV9wdHI7Cit9CisKK2ludCBub3V2ZWF1X2Jpb3NfcGFyc2VfbHZkc190YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcHhjbGssIGJvb2wgKmRsLCBib29sICppZl9pc18yNGJpdCkKK3sKKwkvKgorCSAqIFRoZSBMVkRTIHRhYmxlIGhlYWRlciBpcyAobW9zdGx5KSBkZXNjcmliZWQgaW4KKwkgKiBwYXJzZV9sdmRzX21hbnVmYWN0dXJlcl90YWJsZV9oZWFkZXIoKTogdGhlIEJJVCBoZWFkZXIgYWRkaXRpb25hbGx5CisJICogY29udGFpbnMgdGhlIGR1YWwtbGluayB0cmFuc2l0aW9uIHB4Y2xrIChpbiAxMHMga0h6KSwgYXQgYnl0ZSA1IC0gaWYKKwkgKiBzdHJhcHMgYXJlIG5vdCBiZWluZyB1c2VkIGZvciB0aGUgcGFuZWwsIHRoaXMgc3BlY2lmaWVzIHRoZSBmcmVxdWVuY3kKKwkgKiBhdCB3aGljaCBtb2RlcyBzaG91bGQgYmUgc2V0IHVwIGluIHRoZSBkdWFsIGxpbmsgc3R5bGUuCisJICoKKwkgKiBGb2xsb3dpbmcgdGhlIGhlYWRlciwgdGhlIEJNUCAodmVyIDB4YSkgdGFibGUgaGFzIHNldmVyYWwgcmVjb3JkcywKKwkgKiBpbmRleGVkIGJ5IGEgc2VwZXJhdGUgeGxhdCB0YWJsZSwgaW5kZXhlZCBpbiB0dXJuIGJ5IHRoZSBmcCBzdHJhcCBpbgorCSAqIEVYVERFVl9CT09ULiBFYWNoIHJlY29yZCBoYWQgYSBjb25maWcgYnl0ZSwgZm9sbG93ZWQgYnkgNiBzY3JpcHQKKwkgKiBudW1iZXJzIGZvciB1c2UgYnkgSU5JVF9TVUIgd2hpY2ggY29udHJvbGxlZCBwYW5lbCBpbml0IGFuZCBwb3dlciwKKwkgKiBhbmQgZmluYWxseSBhIGR3b3JkIG9mIG1zIHRvIHNsZWVwIGJldHdlZW4gcG93ZXIgb2ZmIGFuZCBvbgorCSAqIG9wZXJhdGlvbnMuCisJICoKKwkgKiBJbiB0aGUgQklUIHZlcnNpb25zLCB0aGUgdGFibGUgZm9sbG93aW5nIHRoZSBoZWFkZXIgc2VydmVzIGFzIGFuCisJICogaW50ZWdyYXRlZCBjb25maWcgYW5kIHhsYXQgdGFibGU6IHRoZSByZWNvcmRzIGluIHRoZSB0YWJsZSBhcmUKKwkgKiBpbmRleGVkIGJ5IHRoZSBGUCBzdHJhcCBuaWJibGUgaW4gRVhUREVWX0JPT1QsIGFuZCBlYWNoIHJlY29yZCBoYXMKKwkgKiB0d28gYnl0ZXMgLSB0aGUgZmlyc3QgYXMgYSBjb25maWcgYnl0ZSwgdGhlIHNlY29uZCBmb3IgaW5kZXhpbmcgdGhlCisJICogZnAgbW9kZSB0YWJsZSBwb2ludGVkIHRvIGJ5IHRoZSBCSVQgJ0QnIHRhYmxlCisJICoKKwkgKiBEREMgaXMgbm90IHVzZWQgdW50aWwgYWZ0ZXIgY2FyZCBpbml0LCBzbyBzZWxlY3RpbmcgdGhlIGNvcnJlY3QgdGFibGUKKwkgKiBlbnRyeSBhbmQgc2V0dGluZyB0aGUgZHVhbCBsaW5rIGZsYWcgZm9yIEVESUQgZXF1aXBwZWQgcGFuZWxzLAorCSAqIHJlcXVpcmluZyB0ZXN0cyBhZ2FpbnN0IHRoZSBuYXRpdmUtbW9kZSBwaXhlbCBjbG9jaywgY2Fubm90IGJlIGRvbmUKKwkgKiB1bnRpbCBsYXRlciwgd2hlbiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBub24temVybyBweGNsaworCSAqLworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+VkJJT1M7CisJaW50IGZwc3RyYXBwaW5nID0gZ2V0X2ZwX3N0cmFwKGRldiwgYmlvcyksIGx2ZHNtYW51ZmFjdHVyZXJpbmRleCA9IDA7CisJc3RydWN0IGx2ZHN0YWJsZWhlYWRlciBsdGg7CisJdWludDE2X3QgbHZkc29mczsKKwlpbnQgcmV0LCBjaGlwX3ZlcnNpb24gPSBiaW9zLT5wdWIuY2hpcF92ZXJzaW9uOworCisJcmV0ID0gcGFyc2VfbHZkc19tYW51ZmFjdHVyZXJfdGFibGVfaGVhZGVyKGRldiwgYmlvcywgJmx0aCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXN3aXRjaCAobHRoLmx2ZHNfdmVyKSB7CisJY2FzZSAweDBhOgkvKiBwcmUgTlY0MCAqLworCQlsdmRzbWFudWZhY3R1cmVyaW5kZXggPSBiaW9zLT5kYXRhWworCQkJCQliaW9zLT5mcC5mcHhsYXRlbWFudWZhY3R1cmVydGFibGVwdHIgKworCQkJCQlmcHN0cmFwcGluZ107CisKKwkJLyogd2UncmUgZG9uZSBpZiB0aGlzIGlzbid0IHRoZSBFRElEIHBhbmVsIGNhc2UgKi8KKwkJaWYgKCFweGNsaykKKwkJCWJyZWFrOworCisJCWlmIChjaGlwX3ZlcnNpb24gPCAweDI1KSB7CisJCQkvKiBudjE3IGJlaGF2aW91cgorCQkJICoKKwkJCSAqIEl0IHNlZW1zIHRoZSBvbGQgc3R5bGUgbHZkcyBzY3JpcHQgcG9pbnRlciBpcyByZXVzZWQKKwkJCSAqIHRvIHNlbGVjdCAxOC8yNCBiaXQgY29sb3VyIGRlcHRoIGZvciBFRElEIHBhbmVscy4KKwkJCSAqLworCQkJbHZkc21hbnVmYWN0dXJlcmluZGV4ID0KKwkJCQkoYmlvcy0+bGVnYWN5Lmx2ZHNfc2luZ2xlX2Ffc2NyaXB0X3B0ciAmIDEpID8KKwkJCQkJCQkJCTIgOiAwOworCQkJaWYgKHB4Y2xrID49IGJpb3MtPmZwLmR1YWxsaW5rX3RyYW5zaXRpb25fY2xrKQorCQkJCWx2ZHNtYW51ZmFjdHVyZXJpbmRleCsrOworCQl9IGVsc2UgaWYgKGNoaXBfdmVyc2lvbiA8IDB4MzApIHsKKwkJCS8qIG52MjggYmVoYXZpb3VyIChvZmYtY2hpcCBlbmNvZGVyKQorCQkJICoKKwkJCSAqIG52MjggZG9lcyBhIGNvbXBsZXggZGFuY2Ugb2YgZmlyc3QgdXNpbmcgYnl0ZSAxMjEgb2YKKwkJCSAqIHRoZSBFRElEIHRvIGNob29zZSB0aGUgbHZkc21hbnVmYWN0dXJlcmluZGV4LCB0aGVuCisJCQkgKiBsYXRlciBhdHRlbXB0aW5nIHRvIG1hdGNoIHRoZSBFRElEIG1hbnVmYWN0dXJlciBhbmQKKwkJCSAqIHByb2R1Y3QgSURzIGluIGEgdGFibGUgKHNpZ25hdHVyZSAncGlkdCcgKHBhbmVsIGlkCisJCQkgKiB0YWJsZT8pKSwgc2V0dGluZyBhbiBsdmRzbWFudWZhY3R1cmVyaW5kZXggb2YgMCBhbmQKKwkJCSAqIGFuIGZwIHN0cmFwIG9mIHRoZSBtYXRjaCBpbmRleCAob3IgMHhmIGlmIG5vbmUpCisJCQkgKi8KKwkJCWx2ZHNtYW51ZmFjdHVyZXJpbmRleCA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiBudjMxLCBudjM0IGJlaGF2aW91ciAqLworCQkJbHZkc21hbnVmYWN0dXJlcmluZGV4ID0gMDsKKwkJCWlmIChweGNsayA+PSBiaW9zLT5mcC5kdWFsbGlua190cmFuc2l0aW9uX2NsaykKKwkJCQlsdmRzbWFudWZhY3R1cmVyaW5kZXggPSAyOworCQkJaWYgKHB4Y2xrID49IDE0MDAwMCkKKwkJCQlsdmRzbWFudWZhY3R1cmVyaW5kZXggPSAzOworCQl9CisKKwkJLyoKKwkJICogbnZpZGlhIHNldCB0aGUgaGlnaCBuaWJibGUgb2YgKGNyNTc9ZiwgY3I1OCkgdG8KKwkJICogbHZkc21hbnVmYWN0dXJlcmluZGV4IGluIHRoaXMgY2FzZTsgd2UgZG9uJ3QKKwkJICovCisJCWJyZWFrOworCWNhc2UgMHgzMDoJLyogTlY0eCAqLworCWNhc2UgMHg0MDoJLyogRzgwL0c5MCAqLworCQlsdmRzbWFudWZhY3R1cmVyaW5kZXggPSBmcHN0cmFwcGluZzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTlZfRVJST1IoZGV2LCAiTFZEUyB0YWJsZSByZXZpc2lvbiBub3QgY3VycmVudGx5IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRU5PU1lTOworCX0KKworCWx2ZHNvZnMgPSBiaW9zLT5mcC54bGF0ZWRfZW50cnkgPSBiaW9zLT5mcC5sdmRzbWFudWZhY3R1cmVycG9pbnRlciArIGx0aC5oZWFkZXJsZW4gKyBsdGgucmVjb3JkbGVuICogbHZkc21hbnVmYWN0dXJlcmluZGV4OworCXN3aXRjaCAobHRoLmx2ZHNfdmVyKSB7CisJY2FzZSAweDBhOgorCQliaW9zLT5mcC5wb3dlcl9vZmZfZm9yX3Jlc2V0ID0gYmlvcy0+ZGF0YVtsdmRzb2ZzXSAmIDE7CisJCWJpb3MtPmZwLnJlc2V0X2FmdGVyX3BjbGtfY2hhbmdlID0gYmlvcy0+ZGF0YVtsdmRzb2ZzXSAmIDI7CisJCWJpb3MtPmZwLmR1YWxfbGluayA9IGJpb3MtPmRhdGFbbHZkc29mc10gJiA0OworCQliaW9zLT5mcC5saW5rX2NfaW5jcmVtZW50ID0gYmlvcy0+ZGF0YVtsdmRzb2ZzXSAmIDg7CisJCSppZl9pc18yNGJpdCA9IGJpb3MtPmRhdGFbbHZkc29mc10gJiAxNjsKKwkJYnJlYWs7CisJY2FzZSAweDMwOgorCQkvKgorCQkgKiBNeSBtb25leSB3b3VsZCBiZSBvbiB0aGVyZSBiZWluZyBhIDI0IGJpdCBpbnRlcmZhY2UgYml0IGluCisJCSAqIHRoaXMgdGFibGUsIGJ1dCBJIGhhdmUgbm8gZXhhbXBsZSBvZiBhIGxhcHRvcCBiaW9zIHdpdGggYQorCQkgKiAyNCBiaXQgcGFuZWwgdG8gY29uZmlybSB0aGF0LiBIZW5jZSB3ZSBzaG91dCBsb3VkbHkgaWYgYW55CisJCSAqIGJpdCBvdGhlciB0aGFuIGJpdCAwIGlzIHNldCAoSSd2ZSBub3QgZXZlbiBzZWVuIGJpdCAxKQorCQkgKi8KKwkJaWYgKGJpb3MtPmRhdGFbbHZkc29mc10gPiAxKQorCQkJTlZfRVJST1IoZGV2LAorCQkJCSAiWW91IGhhdmUgYSB2ZXJ5IHVudXN1YWwgbGFwdG9wIGRpc3BsYXk7IHBsZWFzZSByZXBvcnQgaXRcbiIpOworCQkvKgorCQkgKiBObyBzaWduIG9mIHRoZSAicG93ZXIgb2ZmIGZvciByZXNldCIgb3IgInJlc2V0IGZvciBwYW5lbAorCQkgKiBvbiIgYml0cywgYnV0IGl0J3Mgc2FmZXIgdG8gYXNzdW1lIHdlIHNob3VsZAorCQkgKi8KKwkJYmlvcy0+ZnAucG93ZXJfb2ZmX2Zvcl9yZXNldCA9IHRydWU7CisJCWJpb3MtPmZwLnJlc2V0X2FmdGVyX3BjbGtfY2hhbmdlID0gdHJ1ZTsKKwkJLyoKKwkJICogSXQncyBvayBsdmRzb2ZzIGlzIHdyb25nIGZvciBudjR4IGVkaWQgY2FzZTsgZHVhbF9saW5rIGlzCisJCSAqIG92ZXItd3JpdHRlbiwgYW5kIEJJVGJpdDEgaXNuJ3QgdXNlZAorCQkgKi8KKwkJYmlvcy0+ZnAuZHVhbF9saW5rID0gYmlvcy0+ZGF0YVtsdmRzb2ZzXSAmIDE7CisJCWJpb3MtPmZwLkJJVGJpdDEgPSBiaW9zLT5kYXRhW2x2ZHNvZnNdICYgMjsKKwkJYmlvcy0+ZnAuZHVhbGxpbmtfdHJhbnNpdGlvbl9jbGsgPSBST00xNihiaW9zLT5kYXRhW2Jpb3MtPmZwLmx2ZHNtYW51ZmFjdHVyZXJwb2ludGVyICsgNV0pICogMTA7CisJCWJyZWFrOworCWNhc2UgMHg0MDoKKwkJYmlvcy0+ZnAuZHVhbF9saW5rID0gYmlvcy0+ZGF0YVtsdmRzb2ZzXSAmIDE7CisJCWJpb3MtPmZwLmlmX2lzXzI0Yml0ID0gYmlvcy0+ZGF0YVtsdmRzb2ZzXSAmIDI7CisJCWJpb3MtPmZwLnN0cmFwbGVzc19pc18yNGJpdCA9IGJpb3MtPmRhdGFbYmlvcy0+ZnAubHZkc21hbnVmYWN0dXJlcnBvaW50ZXIgKyA0XTsKKwkJYmlvcy0+ZnAuZHVhbGxpbmtfdHJhbnNpdGlvbl9jbGsgPSBST00xNihiaW9zLT5kYXRhW2Jpb3MtPmZwLmx2ZHNtYW51ZmFjdHVyZXJwb2ludGVyICsgNV0pICogMTA7CisJCWJyZWFrOworCX0KKworCS8qIHNldCBkdWFsX2xpbmsgZmxhZyBmb3IgRURJRCBjYXNlICovCisJaWYgKHB4Y2xrICYmIChjaGlwX3ZlcnNpb24gPCAweDI1IHx8IGNoaXBfdmVyc2lvbiA+IDB4MjgpKQorCQliaW9zLT5mcC5kdWFsX2xpbmsgPSAocHhjbGsgPj0gYmlvcy0+ZnAuZHVhbGxpbmtfdHJhbnNpdGlvbl9jbGspOworCisJKmRsID0gYmlvcy0+ZnAuZHVhbF9saW5rOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50OF90ICoKK2Jpb3Nfb3V0cHV0X2NvbmZpZ19tYXRjaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQsCisJCQkgdWludDE2X3QgcmVjb3JkLCBpbnQgcmVjb3JkX2xlbiwgaW50IHJlY29yZF9ucikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPlZCSU9TOworCXVpbnQzMl90IGVudHJ5OworCXVpbnQxNl90IHRhYmxlOworCWludCBpLCB2OworCisJZm9yIChpID0gMDsgaSA8IHJlY29yZF9ucjsgaSsrLCByZWNvcmQgKz0gcmVjb3JkX2xlbikgeworCQl0YWJsZSA9IFJPTTE2KGJpb3MtPmRhdGFbcmVjb3JkXSk7CisJCWlmICghdGFibGUpCisJCQljb250aW51ZTsKKwkJZW50cnkgPSBST00zMihiaW9zLT5kYXRhW3RhYmxlXSk7CisKKwkJdiA9IChlbnRyeSAmIDB4MDAwZjAwMDApID4+IDE2OworCQlpZiAoISh2ICYgZGNiZW50LT5vcikpCisJCQljb250aW51ZTsKKworCQl2ID0gKGVudHJ5ICYgMHgwMDAwMDBmMCkgPj4gNDsKKwkJaWYgKHYgIT0gZGNiZW50LT5sb2NhdGlvbikKKwkJCWNvbnRpbnVlOworCisJCXYgPSAoZW50cnkgJiAweDAwMDAwMDBmKTsKKwkJaWYgKHYgIT0gZGNiZW50LT50eXBlKQorCQkJY29udGludWU7CisKKwkJcmV0dXJuICZiaW9zLT5kYXRhW3RhYmxlXTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCAqCitub3V2ZWF1X2Jpb3NfZHBfdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50LAorCQkgICAgICBpbnQgKmxlbmd0aCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPlZCSU9TOworCXVpbnQ4X3QgKnRhYmxlOworCisJaWYgKCFiaW9zLT5kaXNwbGF5LmRwX3RhYmxlX3B0cikgeworCQlOVl9FUlJPUihkZXYsICJObyBwb2ludGVyIHRvIERpc3BsYXlQb3J0IHRhYmxlXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXRhYmxlID0gJmJpb3MtPmRhdGFbYmlvcy0+ZGlzcGxheS5kcF90YWJsZV9wdHJdOworCisJaWYgKHRhYmxlWzBdICE9IDB4MjEpIHsKKwkJTlZfRVJST1IoZGV2LCAiRGlzcGxheVBvcnQgdGFibGUgdmVyc2lvbiAweCUwMnggdW5rbm93blxuIiwKKwkJCSB0YWJsZVswXSk7CisJCXJldHVybiBOVUxMOworCX0KKworCSpsZW5ndGggPSB0YWJsZVs0XTsKKwlyZXR1cm4gYmlvc19vdXRwdXRfY29uZmlnX21hdGNoKGRldiwgZGNiZW50LAorCQkJCQliaW9zLT5kaXNwbGF5LmRwX3RhYmxlX3B0ciArIHRhYmxlWzFdLAorCQkJCQl0YWJsZVsyXSwgdGFibGVbM10pOworfQorCitpbnQKK25vdXZlYXVfYmlvc19ydW5fZGlzcGxheV90YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQsCisJCQkgICAgICAgdWludDMyX3Qgc3ViLCBpbnQgcHhjbGspCit7CisJLyoKKwkgKiBUaGUgZGlzcGxheSBzY3JpcHQgdGFibGUgaXMgbG9jYXRlZCBieSB0aGUgQklUICdVJyB0YWJsZS4KKwkgKgorCSAqIEl0IGNvbnRhaW5zIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHZhcmlvdXMgdGFibGVzIGRlc2NyaWJpbmcKKwkgKiBhIHBhcnRpY3VsYXIgb3V0cHV0IHR5cGUuICBUaGUgZmlyc3QgMzItYml0cyBvZiB0aGUgb3V0cHV0CisJICogdGFibGVzIGNvbnRhaW5zIHNpbWlsYXIgaW5mb3JtYXRpb24gdG8gYSBEQ0IgZW50cnksIGFuZCBpcworCSAqIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhhdCBwYXJ0aWN1bGFyIHRhYmxlIGlzIHN1aXRhYmxlIGZvcgorCSAqIHRoZSBvdXRwdXQgeW91IHdhbnQgdG8gYWNjZXNzLgorCSAqCisJICogVGhlICJyZWNvcmQgaGVhZGVyIGxlbmd0aCIgZmllbGQgaGVyZSBzZWVtcyB0byBpbmRpY2F0ZSB0aGUKKwkgKiBvZmZzZXQgb2YgdGhlIGZpcnN0IGNvbmZpZ3VyYXRpb24gZW50cnkgaW4gdGhlIG91dHB1dCB0YWJsZXMuCisJICogVGhpcyBpcyAxMCBvbiBtb3N0IGNhcmRzIEkndmUgc2VlbiwgYnV0IDEyIGhhcyBiZWVuIHdpdG5lc3NlZAorCSAqIG9uIERQIGNhcmRzLCBhbmQgdGhlcmUncyBhbm90aGVyIHNjcmlwdCBwb2ludGVyIHdpdGhpbiB0aGUKKwkgKiBoZWFkZXIuCisJICoKKwkgKiBvZmZzZXQgKyAwICAgKCA4IGJpdHMpOiB2ZXJzaW9uCisJICogb2Zmc2V0ICsgMSAgICggOCBiaXRzKTogaGVhZGVyIGxlbmd0aAorCSAqIG9mZnNldCArIDIgICAoIDggYml0cyk6IHJlY29yZCBsZW5ndGgKKwkgKiBvZmZzZXQgKyAzICAgKCA4IGJpdHMpOiBudW1iZXIgb2YgcmVjb3JkcworCSAqIG9mZnNldCArIDQgICAoIDggYml0cyk6IHJlY29yZCBoZWFkZXIgbGVuZ3RoCisJICogb2Zmc2V0ICsgNSAgICgxNiBiaXRzKTogcG9pbnRlciB0byBmaXJzdCBvdXRwdXQgc2NyaXB0IHRhYmxlCisJICovCisKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbml0X2V4ZWMgaWV4ZWMgPSB7dHJ1ZSwgZmFsc2V9OworCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPlZCSU9TOworCXVpbnQ4X3QgKnRhYmxlID0gJmJpb3MtPmRhdGFbYmlvcy0+ZGlzcGxheS5zY3JpcHRfdGFibGVfcHRyXTsKKwl1aW50OF90ICpvdGFibGUgPSBOVUxMOworCXVpbnQxNl90IHNjcmlwdDsKKwlpbnQgaSA9IDA7CisKKwlpZiAoIWJpb3MtPmRpc3BsYXkuc2NyaXB0X3RhYmxlX3B0cikgeworCQlOVl9FUlJPUihkZXYsICJObyBwb2ludGVyIHRvIG91dHB1dCBzY3JpcHQgdGFibGVcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIE5vdGhpbmcgdXNlZnVsIGhhcyBiZWVuIGluIGFueSBvZiB0aGUgcHJlLTIuMCB0YWJsZXMgSSd2ZSBzZWVuLAorCSAqIHNvIHVudGlsIHRoZXkgYXJlLCB3ZSByZWFsbHkgZG9uJ3QgbmVlZCB0byBjYXJlLgorCSAqLworCWlmICh0YWJsZVswXSA8IDB4MjApCisJCXJldHVybiAxOworCisJaWYgKHRhYmxlWzBdICE9IDB4MjAgJiYgdGFibGVbMF0gIT0gMHgyMSkgeworCQlOVl9FUlJPUihkZXYsICJPdXRwdXQgc2NyaXB0IHRhYmxlIHZlcnNpb24gMHglMDJ4IHVua25vd25cbiIsCisJCQkgdGFibGVbMF0pOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIFRoZSBvdXRwdXQgc2NyaXB0IHRhYmxlcyBkZXNjcmliaW5nIGEgcGFydGljdWxhciBvdXRwdXQgdHlwZQorCSAqIGxvb2sgYXMgZm9sbG93czoKKwkgKgorCSAqIG9mZnNldCArIDAgICAoMzIgYml0cyk6IG91dHB1dCB0aGlzIHRhYmxlIG1hdGNoZXMgKGhhc2ggb2YgRENCKQorCSAqIG9mZnNldCArIDQgICAoIDggYml0cyk6IHVua25vd24KKwkgKiBvZmZzZXQgKyA1ICAgKCA4IGJpdHMpOiBudW1iZXIgb2YgY29uZmlndXJhdGlvbnMKKwkgKiBvZmZzZXQgKyA2ICAgKDE2IGJpdHMpOiBwb2ludGVyIHRvIHNvbWUgc2NyaXB0CisJICogb2Zmc2V0ICsgOCAgICgxNiBiaXRzKTogcG9pbnRlciB0byBzb21lIHNjcmlwdAorCSAqCisJICogaGVhZGVybGVuID09IDEwCisJICogb2Zmc2V0ICsgMTAgICAgICAgICAgIDogY29uZmlndXJhdGlvbiAwCisJICoKKwkgKiBoZWFkZXJsZW4gPT0gMTIKKwkgKiBvZmZzZXQgKyAxMCAgICAgICAgICAgOiBwb2ludGVyIHRvIHNvbWUgc2NyaXB0CisJICogb2Zmc2V0ICsgMTIgICAgICAgICAgIDogY29uZmlndXJhdGlvbiAwCisJICoKKwkgKiBFYWNoIGNvbmZpZyBlbnRyeSBpcyBhcyBmb2xsb3dzOgorCSAqCisJICogb2Zmc2V0ICsgMCAgICgxNiBiaXRzKTogdW5rbm93biwgYXNzdW1lZCB0byBiZSBhIG1hdGNoIHZhbHVlCisJICogb2Zmc2V0ICsgMiAgICgxNiBiaXRzKTogcG9pbnRlciB0byBzY3JpcHQgdGFibGUgKGNsb2NrIHNldD8pCisJICogb2Zmc2V0ICsgNCAgICgxNiBiaXRzKTogcG9pbnRlciB0byBzY3JpcHQgdGFibGUgKHJlc2V0PykKKwkgKgorCSAqIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgY291bnQgdmFsdWUgdG8gc2F5IGhvdyBtYW55CisJICogZW50cmllcyBleGlzdCBpbiBlYWNoIHNjcmlwdCB0YWJsZSwgaW5zdGVhZCwgYSAwIHZhbHVlIGluCisJICogdGhlIGZpcnN0IDE2LWJpdCB3b3JkIHNlZW1zIHRvIGluZGljYXRlIGJvdGggdGhlIGVuZCBvZiB0aGUKKwkgKiBsaXN0IGFuZCB0aGUgZGVmYXVsdCBlbnRyeS4gIFRoZSBzZWNvbmQgMTYtYml0IHdvcmQgaW4gdGhlCisJICogc2NyaXB0IHRhYmxlcyBpcyBhIHBvaW50ZXIgdG8gdGhlIHNjcmlwdCB0byBleGVjdXRlLgorCSAqLworCisJTlZfREVCVUcoZGV2LCAiU2VhcmNoaW5nIGZvciBvdXRwdXQgZW50cnkgZm9yICVkICVkICVkXG4iLAorCQkJZGNiZW50LT50eXBlLCBkY2JlbnQtPmxvY2F0aW9uLCBkY2JlbnQtPm9yKTsKKwlvdGFibGUgPSBiaW9zX291dHB1dF9jb25maWdfbWF0Y2goZGV2LCBkY2JlbnQsIHRhYmxlWzFdICsKKwkJCQkJICBiaW9zLT5kaXNwbGF5LnNjcmlwdF90YWJsZV9wdHIsCisJCQkJCSAgdGFibGVbMl0sIHRhYmxlWzNdKTsKKwlpZiAoIW90YWJsZSkgeworCQlOVl9FUlJPUihkZXYsICJDb3VsZG4ndCBmaW5kIG1hdGNoaW5nIG91dHB1dCBzY3JpcHQgdGFibGVcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAocHhjbGsgPCAtMiB8fCBweGNsayA+IDApIHsKKwkJLyogVHJ5IHRvIGZpbmQgbWF0Y2hpbmcgc2NyaXB0IHRhYmxlIGVudHJ5ICovCisJCWZvciAoaSA9IDA7IGkgPCBvdGFibGVbNV07IGkrKykgeworCQkJaWYgKFJPTTE2KG90YWJsZVt0YWJsZVs0XSArIGkqNl0pID09IHN1YikKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpID09IG90YWJsZVs1XSkgeworCQkJTlZfRVJST1IoZGV2LCAiVGFibGUgMHglMDR4IG5vdCBmb3VuZCBmb3IgJWQvJWQsICIKKwkJCQkgICAgICAidXNpbmcgZmlyc3RcbiIsCisJCQkJIHN1YiwgZGNiZW50LT50eXBlLCBkY2JlbnQtPm9yKTsKKwkJCWkgPSAwOworCQl9CisJfQorCisJYmlvcy0+ZGlzcGxheS5vdXRwdXQgPSBkY2JlbnQ7CisKKwlpZiAocHhjbGsgPT0gMCkgeworCQlzY3JpcHQgPSBST00xNihvdGFibGVbNl0pOworCQlpZiAoIXNjcmlwdCkgeworCQkJTlZfREVCVUcoZGV2LCAib3V0cHV0IHNjcmlwdCAwIG5vdCBmb3VuZFxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCU5WX1RSQUNFKGRldiwgIjB4JTA0WDogcGFyc2luZyBvdXRwdXQgc2NyaXB0IDBcbiIsIHNjcmlwdCk7CisJCXBhcnNlX2luaXRfdGFibGUoYmlvcywgc2NyaXB0LCAmaWV4ZWMpOworCX0gZWxzZQorCWlmIChweGNsayA9PSAtMSkgeworCQlzY3JpcHQgPSBST00xNihvdGFibGVbOF0pOworCQlpZiAoIXNjcmlwdCkgeworCQkJTlZfREVCVUcoZGV2LCAib3V0cHV0IHNjcmlwdCAxIG5vdCBmb3VuZFxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCU5WX1RSQUNFKGRldiwgIjB4JTA0WDogcGFyc2luZyBvdXRwdXQgc2NyaXB0IDFcbiIsIHNjcmlwdCk7CisJCXBhcnNlX2luaXRfdGFibGUoYmlvcywgc2NyaXB0LCAmaWV4ZWMpOworCX0gZWxzZQorCWlmIChweGNsayA9PSAtMikgeworCQlpZiAodGFibGVbNF0gPj0gMTIpCisJCQlzY3JpcHQgPSBST00xNihvdGFibGVbMTBdKTsKKwkJZWxzZQorCQkJc2NyaXB0ID0gMDsKKwkJaWYgKCFzY3JpcHQpIHsKKwkJCU5WX0RFQlVHKGRldiwgIm91dHB1dCBzY3JpcHQgMiBub3QgZm91bmRcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlOVl9UUkFDRShkZXYsICIweCUwNFg6IHBhcnNpbmcgb3V0cHV0IHNjcmlwdCAyXG4iLCBzY3JpcHQpOworCQlwYXJzZV9pbml0X3RhYmxlKGJpb3MsIHNjcmlwdCwgJmlleGVjKTsKKwl9IGVsc2UKKwlpZiAocHhjbGsgPiAwKSB7CisJCXNjcmlwdCA9IFJPTTE2KG90YWJsZVt0YWJsZVs0XSArIGkqNiArIDJdKTsKKwkJaWYgKHNjcmlwdCkKKwkJCXNjcmlwdCA9IGNsa2NtcHRhYmxlKGJpb3MsIHNjcmlwdCwgcHhjbGspOworCQlpZiAoIXNjcmlwdCkgeworCQkJTlZfRVJST1IoZGV2LCAiY2xvY2sgc2NyaXB0IDAgbm90IGZvdW5kXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJTlZfVFJBQ0UoZGV2LCAiMHglMDRYOiBwYXJzaW5nIGNsb2NrIHNjcmlwdCAwXG4iLCBzY3JpcHQpOworCQlwYXJzZV9pbml0X3RhYmxlKGJpb3MsIHNjcmlwdCwgJmlleGVjKTsKKwl9IGVsc2UKKwlpZiAocHhjbGsgPCAwKSB7CisJCXNjcmlwdCA9IFJPTTE2KG90YWJsZVt0YWJsZVs0XSArIGkqNiArIDRdKTsKKwkJaWYgKHNjcmlwdCkKKwkJCXNjcmlwdCA9IGNsa2NtcHRhYmxlKGJpb3MsIHNjcmlwdCwgLXB4Y2xrKTsKKwkJaWYgKCFzY3JpcHQpIHsKKwkJCU5WX0RFQlVHKGRldiwgImNsb2NrIHNjcmlwdCAxIG5vdCBmb3VuZFxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCU5WX1RSQUNFKGRldiwgIjB4JTA0WDogcGFyc2luZyBjbG9jayBzY3JpcHQgMVxuIiwgc2NyaXB0KTsKKwkJcGFyc2VfaW5pdF90YWJsZShiaW9zLCBzY3JpcHQsICZpZXhlYyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworaW50IHJ1bl90bWRzX3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmRjYmVudCwgaW50IGhlYWQsIGludCBweGNsaykKK3sKKwkvKgorCSAqIHRoZSBweGNsayBwYXJhbWV0ZXIgaXMgaW4ga0h6CisJICoKKwkgKiBUaGlzIHJ1bnMgdGhlIFRNRFMgcmVncyBzZXR0aW5nIGNvZGUgZm91bmQgb24gQklUIGJpb3MgY2FyZHMKKwkgKgorCSAqIEZvciBmZnMob3IpID09IDEgdXNlIHRoZSBmaXJzdCB0YWJsZSwgZm9yIGZmcyhvcikgPT0gMiBhbmQKKwkgKiBmZnMob3IpID09IDMsIHVzZSB0aGUgc2Vjb25kLgorCSAqLworCisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZiaW9zICpiaW9zID0gJmRldl9wcml2LT5WQklPUzsKKwlpbnQgY3YgPSBiaW9zLT5wdWIuY2hpcF92ZXJzaW9uOworCXVpbnQxNl90IGNsa3RhYmxlID0gMCwgc2NyaXB0cHRyOworCXVpbnQzMl90IHNlbF9jbGtfYmluZGluZywgc2VsX2NsazsKKworCS8qIHByZS1udjE3IG9mZi1jaGlwIHRtZHMgdXNlcyBzY3JpcHRzLCBwb3N0IG52MTcgZG9lc24ndCAqLworCWlmIChjdiA+PSAweDE3ICYmIGN2ICE9IDB4MWEgJiYgY3YgIT0gMHgyMCAmJgorCSAgICBkY2JlbnQtPmxvY2F0aW9uICE9IERDQl9MT0NfT05fQ0hJUCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGZmcyhkY2JlbnQtPm9yKSkgeworCWNhc2UgMToKKwkJY2xrdGFibGUgPSBiaW9zLT50bWRzLm91dHB1dDBfc2NyaXB0X3B0cjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCWNhc2UgMzoKKwkJY2xrdGFibGUgPSBiaW9zLT50bWRzLm91dHB1dDFfc2NyaXB0X3B0cjsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFjbGt0YWJsZSkgeworCQlOVl9FUlJPUihkZXYsICJQaXhlbCBjbG9jayBjb21wYXJpc29uIHRhYmxlIG5vdCBmb3VuZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNjcmlwdHB0ciA9IGNsa2NtcHRhYmxlKGJpb3MsIGNsa3RhYmxlLCBweGNsayk7CisKKwlpZiAoIXNjcmlwdHB0cikgeworCQlOVl9FUlJPUihkZXYsICJUTURTIG91dHB1dCBpbml0IHNjcmlwdCBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwkvKiBkb24ndCBsZXQgc2NyaXB0IGNoYW5nZSBwbGwtPmhlYWQgYmluZGluZyAqLworCXNlbF9jbGtfYmluZGluZyA9IGJpb3NfcmQzMihiaW9zLCBOVl9QUkFNREFDX1NFTF9DTEspICYgMHg1MDAwMDsKKwlydW5fZGlnaXRhbF9vcF9zY3JpcHQoZGV2LCBzY3JpcHRwdHIsIGRjYmVudCwgaGVhZCwgcHhjbGsgPj0gMTY1MDAwKTsKKwlzZWxfY2xrID0gTlZSZWFkUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19TRUxfQ0xLKSAmIH4weDUwMDAwOworCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX1NFTF9DTEssIHNlbF9jbGsgfCBzZWxfY2xrX2JpbmRpbmcpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBnZXRfcGxsX2xpbWl0cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBsaW1pdF9tYXRjaCwgc3RydWN0IHBsbF9saW1zICpwbGxfbGltKQoreworCS8qCisJICogUExMIGxpbWl0cyB0YWJsZQorCSAqCisJICogVmVyc2lvbiAweDEwOiBOVjMwLCBOVjMxCisJICogT25lIGJ5dGUgaGVhZGVyICh2ZXJzaW9uKSwgb25lIHJlY29yZCBvZiAyNCBieXRlcworCSAqIFZlcnNpb24gMHgxMTogTlYzNiAtIE5vdCBpbXBsZW1lbnRlZAorCSAqIFNlZW1zIHRvIGhhdmUgc2FtZSByZWNvcmQgc3R5bGUgYXMgMHgxMCwgYnV0IDMgcmVjb3JkcyByYXRoZXIgdGhhbiAxCisJICogVmVyc2lvbiAweDIwOiBGb3VuZCBvbiBHZWZvcmNlIDYgY2FyZHMKKwkgKiBUcml2aWFsIDQgYnl0ZSBCSVQgaGVhZGVyLiAzMSAoMHgxZikgYnl0ZSByZWNvcmQgbGVuZ3RoCisJICogVmVyc2lvbiAweDIxOiBGb3VuZCBvbiBHZWZvcmNlIDcsIDggYW5kIHNvbWUgR2Vmb3JjZSA2IGNhcmRzCisJICogNSBieXRlIGhlYWRlciwgZmlmdGggYnl0ZSBvZiB1bmtub3duIHB1cnBvc2UuIDM1ICgweDIzKSBieXRlIHJlY29yZAorCSAqIGxlbmd0aCBpbiBnZW5lcmFsLCBzb21lIChpbnRlZ3JhdGVkKSBoYXZlIGFuIGV4dHJhIGNvbmZpZ3VyYXRpb24gYnl0ZQorCSAqIFZlcnNpb24gMHgzMDogRm91bmQgb24gR2Vmb3JjZSA4LCBzZXBhcmF0ZXMgdGhlIHJlZ2lzdGVyIG1hcHBpbmcKKwkgKiBmcm9tIHRoZSBsaW1pdHMgdGFibGVzLgorCSAqLworCisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZiaW9zICpiaW9zID0gJmRldl9wcml2LT5WQklPUzsKKwlpbnQgY3YgPSBiaW9zLT5wdWIuY2hpcF92ZXJzaW9uLCBwbGxpbmRleCA9IDA7CisJdWludDhfdCBwbGxfbGltX3ZlciA9IDAsIGhlYWRlcmxlbiA9IDAsIHJlY29yZGxlbiA9IDAsIGVudHJpZXMgPSAwOworCXVpbnQzMl90IGNyeXN0YWxfc3RyYXBfbWFzaywgY3J5c3RhbF9zdHJhcHM7CisKKwlpZiAoIWJpb3MtPnBsbF9saW1pdF90YmxfcHRyKSB7CisJCWlmIChjdiA9PSAweDMwIHx8IGN2ID09IDB4MzEgfHwgY3YgPT0gMHgzNSB8fCBjdiA9PSAweDM2IHx8CisJCSAgICBjdiA+PSAweDQwKSB7CisJCQlOVl9FUlJPUihkZXYsICJQb2ludGVyIHRvIFBMTCBsaW1pdHMgdGFibGUgaW52YWxpZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZQorCQlwbGxfbGltX3ZlciA9IGJpb3MtPmRhdGFbYmlvcy0+cGxsX2xpbWl0X3RibF9wdHJdOworCisJY3J5c3RhbF9zdHJhcF9tYXNrID0gMSA8PCA2OworCS8qIG9wZW4gY29kZWQgZGV2LT50d29IZWFkcyB0ZXN0ICovCisJaWYgKGN2ID4gMHgxMCAmJiBjdiAhPSAweDE1ICYmIGN2ICE9IDB4MWEgJiYgY3YgIT0gMHgyMCkKKwkJY3J5c3RhbF9zdHJhcF9tYXNrIHw9IDEgPDwgMjI7CisJY3J5c3RhbF9zdHJhcHMgPSBudlJlYWRFWFRERVYoZGV2LCBOVl9QRVhUREVWX0JPT1RfMCkgJgorCQkJCQkJCWNyeXN0YWxfc3RyYXBfbWFzazsKKworCXN3aXRjaCAocGxsX2xpbV92ZXIpIHsKKwkvKgorCSAqIFdlIHVzZSB2ZXJzaW9uIDAgdG8gaW5kaWNhdGUgYSBwcmUgbGltaXQgdGFibGUgYmlvcyAoc2luZ2xlIHN0YWdlCisJICogcGxsKSBhbmQgbG9hZCB0aGUgaGFyZCBjb2RlZCBsaW1pdHMgaW5zdGVhZC4KKwkgKi8KKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgMHgxMDoKKwljYXNlIDB4MTE6CisJCS8qCisJCSAqIFN0cmljdGx5IHYweDExIGhhcyAzIGVudHJpZXMsIGJ1dCB0aGUgbGFzdCB0d28gZG9uJ3Qgc2VlbQorCQkgKiB0byBnZXQgdXNlZC4KKwkJICovCisJCWhlYWRlcmxlbiA9IDE7CisJCXJlY29yZGxlbiA9IDB4MTg7CisJCWVudHJpZXMgPSAxOworCQlwbGxpbmRleCA9IDA7CisJCWJyZWFrOworCWNhc2UgMHgyMDoKKwljYXNlIDB4MjE6CisJY2FzZSAweDMwOgorCWNhc2UgMHg0MDoKKwkJaGVhZGVybGVuID0gYmlvcy0+ZGF0YVtiaW9zLT5wbGxfbGltaXRfdGJsX3B0ciArIDFdOworCQlyZWNvcmRsZW4gPSBiaW9zLT5kYXRhW2Jpb3MtPnBsbF9saW1pdF90YmxfcHRyICsgMl07CisJCWVudHJpZXMgPSBiaW9zLT5kYXRhW2Jpb3MtPnBsbF9saW1pdF90YmxfcHRyICsgM107CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCU5WX0VSUk9SKGRldiwgIlBMTCBsaW1pdHMgdGFibGUgcmV2aXNpb24gMHglWCBub3QgY3VycmVudGx5ICIKKwkJCQkic3VwcG9ydGVkXG4iLCBwbGxfbGltX3Zlcik7CisJCXJldHVybiAtRU5PU1lTOworCX0KKworCS8qIGluaXRpYWxpemUgYWxsIG1lbWJlcnMgdG8gemVybyAqLworCW1lbXNldChwbGxfbGltLCAwLCBzaXplb2Yoc3RydWN0IHBsbF9saW1zKSk7CisKKwlpZiAocGxsX2xpbV92ZXIgPT0gMHgxMCB8fCBwbGxfbGltX3ZlciA9PSAweDExKSB7CisJCXVpbnQ4X3QgKnBsbF9yZWMgPSAmYmlvcy0+ZGF0YVtiaW9zLT5wbGxfbGltaXRfdGJsX3B0ciArIGhlYWRlcmxlbiArIHJlY29yZGxlbiAqIHBsbGluZGV4XTsKKworCQlwbGxfbGltLT52Y28xLm1pbmZyZXEgPSBST00zMihwbGxfcmVjWzBdKTsKKwkJcGxsX2xpbS0+dmNvMS5tYXhmcmVxID0gUk9NMzIocGxsX3JlY1s0XSk7CisJCXBsbF9saW0tPnZjbzIubWluZnJlcSA9IFJPTTMyKHBsbF9yZWNbOF0pOworCQlwbGxfbGltLT52Y28yLm1heGZyZXEgPSBST00zMihwbGxfcmVjWzEyXSk7CisJCXBsbF9saW0tPnZjbzEubWluX2lucHV0ZnJlcSA9IFJPTTMyKHBsbF9yZWNbMTZdKTsKKwkJcGxsX2xpbS0+dmNvMi5taW5faW5wdXRmcmVxID0gUk9NMzIocGxsX3JlY1syMF0pOworCQlwbGxfbGltLT52Y28xLm1heF9pbnB1dGZyZXEgPSBwbGxfbGltLT52Y28yLm1heF9pbnB1dGZyZXEgPSBJTlRfTUFYOworCisJCS8qIHRoZXNlIHZhbHVlcyB0YWtlbiBmcm9tIG52MzAvMzEvMzYgKi8KKwkJcGxsX2xpbS0+dmNvMS5taW5fbiA9IDB4MTsKKwkJaWYgKGN2ID09IDB4MzYpCisJCQlwbGxfbGltLT52Y28xLm1pbl9uID0gMHg1OworCQlwbGxfbGltLT52Y28xLm1heF9uID0gMHhmZjsKKwkJcGxsX2xpbS0+dmNvMS5taW5fbSA9IDB4MTsKKwkJcGxsX2xpbS0+dmNvMS5tYXhfbSA9IDB4ZDsKKwkJcGxsX2xpbS0+dmNvMi5taW5fbiA9IDB4NDsKKwkJLyoKKwkJICogT24gbnYzMCwgMzEsIDM2IChpLmUuIGFsbCBjYXJkcyB3aXRoIHR3byBzdGFnZSBQTExzIHdpdGggdGhpcworCQkgKiB0YWJsZSB2ZXJzaW9uIChhcGFydCBmcm9tIG52MzUpKSwgTjIgaXMgY29tcGFyZWQgdG8KKwkJICogbWF4TjIgKDB4NDYpIGFuZCAxMCAqIG1heE0yICgweDQpLCBzbyBzZXQgbWF4TjIgdG8gMHgyOCBhbmQKKwkJICogc2F2ZSBhIGNvbXBhcmlzb24KKwkJICovCisJCXBsbF9saW0tPnZjbzIubWF4X24gPSAweDI4OworCQlpZiAoY3YgPT0gMHgzMCB8fCBjdiA9PSAweDM1KQorCQkJLyogb25seSA1IGJpdHMgYXZhaWxhYmxlIGZvciBOMiBvbiBudjMwLzM1ICovCisJCQlwbGxfbGltLT52Y28yLm1heF9uID0gMHgxZjsKKwkJcGxsX2xpbS0+dmNvMi5taW5fbSA9IDB4MTsKKwkJcGxsX2xpbS0+dmNvMi5tYXhfbSA9IDB4NDsKKwkJcGxsX2xpbS0+bWF4X2xvZzJwID0gMHg3OworCQlwbGxfbGltLT5tYXhfdXNhYmxlX2xvZzJwID0gMHg2OworCX0gZWxzZSBpZiAocGxsX2xpbV92ZXIgPT0gMHgyMCB8fCBwbGxfbGltX3ZlciA9PSAweDIxKSB7CisJCXVpbnQxNl90IHBsbG9mZnMgPSBiaW9zLT5wbGxfbGltaXRfdGJsX3B0ciArIGhlYWRlcmxlbjsKKwkJdWludDMyX3QgcmVnID0gMDsgLyogZGVmYXVsdCBtYXRjaCAqLworCQl1aW50OF90ICpwbGxfcmVjOworCQlpbnQgaTsKKworCQkvKgorCQkgKiBGaXJzdCBlbnRyeSBpcyBkZWZhdWx0IG1hdGNoLCBpZiBub3RoaW5nIGJldHRlci4gd2FybiBpZgorCQkgKiByZWcgZmllbGQgbm9uemVybworCQkgKi8KKwkJaWYgKFJPTTMyKGJpb3MtPmRhdGFbcGxsb2Zmc10pKQorCQkJTlZfV0FSTihkZXYsICJEZWZhdWx0IFBMTCBsaW1pdCBlbnRyeSBoYXMgbm9uLXplcm8gIgorCQkJCSAgICAgICAicmVnaXN0ZXIgZmllbGRcbiIpOworCisJCWlmIChsaW1pdF9tYXRjaCA+IE1BWF9QTExfVFlQRVMpCisJCQkvKiB3ZSd2ZSBiZWVuIHBhc3NlZCBhIHJlZyBhcyB0aGUgbWF0Y2ggKi8KKwkJCXJlZyA9IGxpbWl0X21hdGNoOworCQllbHNlIC8qIGxpbWl0IG1hdGNoIGlzIGEgcGxsIHR5cGUgKi8KKwkJCWZvciAoaSA9IDE7IGkgPCBlbnRyaWVzICYmICFyZWc7IGkrKykgeworCQkJCXVpbnQzMl90IGNtcHJlZyA9IFJPTTMyKGJpb3MtPmRhdGFbcGxsb2ZmcyArIHJlY29yZGxlbiAqIGldKTsKKworCQkJCWlmIChsaW1pdF9tYXRjaCA9PSBOVlBMTCAmJgorCQkJCSAgICAoY21wcmVnID09IE5WX1BSQU1EQUNfTlZQTExfQ09FRkYgfHwgY21wcmVnID09IDB4NDAwMCkpCisJCQkJCXJlZyA9IGNtcHJlZzsKKwkJCQlpZiAobGltaXRfbWF0Y2ggPT0gTVBMTCAmJgorCQkJCSAgICAoY21wcmVnID09IE5WX1BSQU1EQUNfTVBMTF9DT0VGRiB8fCBjbXByZWcgPT0gMHg0MDIwKSkKKwkJCQkJcmVnID0gY21wcmVnOworCQkJCWlmIChsaW1pdF9tYXRjaCA9PSBWUExMMSAmJgorCQkJCSAgICAoY21wcmVnID09IE5WX1BSQU1EQUNfVlBMTF9DT0VGRiB8fCBjbXByZWcgPT0gMHg0MDEwKSkKKwkJCQkJcmVnID0gY21wcmVnOworCQkJCWlmIChsaW1pdF9tYXRjaCA9PSBWUExMMiAmJgorCQkJCSAgICAoY21wcmVnID09IE5WX1JBTURBQ19WUExMMiB8fCBjbXByZWcgPT0gMHg0MDE4KSkKKwkJCQkJcmVnID0gY21wcmVnOworCQkJfQorCisJCWZvciAoaSA9IDE7IGkgPCBlbnRyaWVzOyBpKyspCisJCQlpZiAoUk9NMzIoYmlvcy0+ZGF0YVtwbGxvZmZzICsgcmVjb3JkbGVuICogaV0pID09IHJlZykgeworCQkJCXBsbGluZGV4ID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKworCQlwbGxfcmVjID0gJmJpb3MtPmRhdGFbcGxsb2ZmcyArIHJlY29yZGxlbiAqIHBsbGluZGV4XTsKKworCQlCSU9TTE9HKGJpb3MsICJMb2FkaW5nIFBMTCBsaW1pdHMgZm9yIHJlZyAweCUwOHhcbiIsCisJCQlwbGxpbmRleCA/IHJlZyA6IDApOworCisJCS8qCisJCSAqIEZyZXF1ZW5jaWVzIGFyZSBzdG9yZWQgaW4gdGFibGVzIGluIE1Ieiwga0h6IGFyZSBtb3JlCisJCSAqIHVzZWZ1bCwgc28gd2UgY29udmVydC4KKwkJICovCisKKwkJLyogV2hhdCBvdXRwdXQgZnJlcXVlbmNpZXMgY2FuIGVhY2ggVkNPIGdlbmVyYXRlPyAqLworCQlwbGxfbGltLT52Y28xLm1pbmZyZXEgPSBST00xNihwbGxfcmVjWzRdKSAqIDEwMDA7CisJCXBsbF9saW0tPnZjbzEubWF4ZnJlcSA9IFJPTTE2KHBsbF9yZWNbNl0pICogMTAwMDsKKwkJcGxsX2xpbS0+dmNvMi5taW5mcmVxID0gUk9NMTYocGxsX3JlY1s4XSkgKiAxMDAwOworCQlwbGxfbGltLT52Y28yLm1heGZyZXEgPSBST00xNihwbGxfcmVjWzEwXSkgKiAxMDAwOworCisJCS8qIFdoYXQgaW5wdXQgZnJlcXVlbmNpZXMgdGhleSBhY2NlcHQgKHBhc3QgdGhlIG0tZGl2aWRlcik/ICovCisJCXBsbF9saW0tPnZjbzEubWluX2lucHV0ZnJlcSA9IFJPTTE2KHBsbF9yZWNbMTJdKSAqIDEwMDA7CisJCXBsbF9saW0tPnZjbzIubWluX2lucHV0ZnJlcSA9IFJPTTE2KHBsbF9yZWNbMTRdKSAqIDEwMDA7CisJCXBsbF9saW0tPnZjbzEubWF4X2lucHV0ZnJlcSA9IFJPTTE2KHBsbF9yZWNbMTZdKSAqIDEwMDA7CisJCXBsbF9saW0tPnZjbzIubWF4X2lucHV0ZnJlcSA9IFJPTTE2KHBsbF9yZWNbMThdKSAqIDEwMDA7CisKKwkJLyogV2hhdCB2YWx1ZXMgYXJlIGFjY2VwdGVkIGFzIG11bHRpcGxpZXIgYW5kIGRpdmlkZXI/ICovCisJCXBsbF9saW0tPnZjbzEubWluX24gPSBwbGxfcmVjWzIwXTsKKwkJcGxsX2xpbS0+dmNvMS5tYXhfbiA9IHBsbF9yZWNbMjFdOworCQlwbGxfbGltLT52Y28xLm1pbl9tID0gcGxsX3JlY1syMl07CisJCXBsbF9saW0tPnZjbzEubWF4X20gPSBwbGxfcmVjWzIzXTsKKwkJcGxsX2xpbS0+dmNvMi5taW5fbiA9IHBsbF9yZWNbMjRdOworCQlwbGxfbGltLT52Y28yLm1heF9uID0gcGxsX3JlY1syNV07CisJCXBsbF9saW0tPnZjbzIubWluX20gPSBwbGxfcmVjWzI2XTsKKwkJcGxsX2xpbS0+dmNvMi5tYXhfbSA9IHBsbF9yZWNbMjddOworCisJCXBsbF9saW0tPm1heF91c2FibGVfbG9nMnAgPSBwbGxfbGltLT5tYXhfbG9nMnAgPSBwbGxfcmVjWzI5XTsKKwkJaWYgKHBsbF9saW0tPm1heF9sb2cycCA+IDB4NykKKwkJCS8qIHBsbCBkZWNvZGluZyBpbiBudl9ody5jIGFzc3VtZXMgbmV2ZXIgPiA3ICovCisJCQlOVl9XQVJOKGRldiwgIk1heCBsb2cyIFAgdmFsdWUgZ3JlYXRlciB0aGFuIDcgKCVkKVxuIiwKKwkJCQlwbGxfbGltLT5tYXhfbG9nMnApOworCQlpZiAoY3YgPCAweDYwKQorCQkJcGxsX2xpbS0+bWF4X3VzYWJsZV9sb2cycCA9IDB4NjsKKwkJcGxsX2xpbS0+bG9nMnBfYmlhcyA9IHBsbF9yZWNbMzBdOworCisJCWlmIChyZWNvcmRsZW4gPiAweDIyKQorCQkJcGxsX2xpbS0+cmVmY2xrID0gUk9NMzIocGxsX3JlY1szMV0pOworCisJCWlmIChyZWNvcmRsZW4gPiAweDIzICYmIHBsbF9yZWNbMzVdKQorCQkJTlZfV0FSTihkZXYsCisJCQkJIkJpdHMgc2V0IGluIFBMTCBjb25maWd1cmF0aW9uIGJ5dGUgKCV4KVxuIiwKKwkJCQlwbGxfcmVjWzM1XSk7CisKKwkJLyogQzUxIHNwZWNpYWwgbm90IHNlZW4gZWxzZXdoZXJlICovCisJCWlmIChjdiA9PSAweDUxICYmICFwbGxfbGltLT5yZWZjbGspIHsKKwkJCXVpbnQzMl90IHNlbF9jbGsgPSBiaW9zX3JkMzIoYmlvcywgTlZfUFJBTURBQ19TRUxfQ0xLKTsKKworCQkJaWYgKCgobGltaXRfbWF0Y2ggPT0gTlZfUFJBTURBQ19WUExMX0NPRUZGIHx8IGxpbWl0X21hdGNoID09IFZQTEwxKSAmJiBzZWxfY2xrICYgMHgyMCkgfHwKKwkJCSAgICAoKGxpbWl0X21hdGNoID09IE5WX1JBTURBQ19WUExMMiB8fCBsaW1pdF9tYXRjaCA9PSBWUExMMikgJiYgc2VsX2NsayAmIDB4ODApKSB7CisJCQkJaWYgKGJpb3NfaWR4cHJ0X3JkKGJpb3MsIE5WX0NJT19DUlhfX0NPTE9SLCBOVl9DSU9fQ1JFX0NISVBfSURfSU5ERVgpIDwgMHhhMykKKwkJCQkJcGxsX2xpbS0+cmVmY2xrID0gMjAwMDAwOworCQkJCWVsc2UKKwkJCQkJcGxsX2xpbS0+cmVmY2xrID0gMjUwMDA7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKHBsbF9saW1fdmVyID09IDB4MzApIHsgLyogdmVyIDB4MzAgKi8KKwkJdWludDhfdCAqZW50cnkgPSAmYmlvcy0+ZGF0YVtiaW9zLT5wbGxfbGltaXRfdGJsX3B0ciArIGhlYWRlcmxlbl07CisJCXVpbnQ4X3QgKnJlY29yZCA9IE5VTEw7CisJCWludCBpOworCisJCUJJT1NMT0coYmlvcywgIkxvYWRpbmcgUExMIGxpbWl0cyBmb3IgcmVnaXN0ZXIgMHglMDh4XG4iLAorCQkJbGltaXRfbWF0Y2gpOworCisJCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyssIGVudHJ5ICs9IHJlY29yZGxlbikgeworCQkJaWYgKFJPTTMyKGVudHJ5WzNdKSA9PSBsaW1pdF9tYXRjaCkgeworCQkJCXJlY29yZCA9ICZiaW9zLT5kYXRhW1JPTTE2KGVudHJ5WzFdKV07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIXJlY29yZCkgeworCQkJTlZfRVJST1IoZGV2LCAiUmVnaXN0ZXIgMHglMDh4IG5vdCBmb3VuZCBpbiBQTEwgIgorCQkJCSAibGltaXRzIHRhYmxlIiwgbGltaXRfbWF0Y2gpOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKworCQlwbGxfbGltLT52Y28xLm1pbmZyZXEgPSBST00xNihyZWNvcmRbMF0pICogMTAwMDsKKwkJcGxsX2xpbS0+dmNvMS5tYXhmcmVxID0gUk9NMTYocmVjb3JkWzJdKSAqIDEwMDA7CisJCXBsbF9saW0tPnZjbzIubWluZnJlcSA9IFJPTTE2KHJlY29yZFs0XSkgKiAxMDAwOworCQlwbGxfbGltLT52Y28yLm1heGZyZXEgPSBST00xNihyZWNvcmRbNl0pICogMTAwMDsKKwkJcGxsX2xpbS0+dmNvMS5taW5faW5wdXRmcmVxID0gUk9NMTYocmVjb3JkWzhdKSAqIDEwMDA7CisJCXBsbF9saW0tPnZjbzIubWluX2lucHV0ZnJlcSA9IFJPTTE2KHJlY29yZFsxMF0pICogMTAwMDsKKwkJcGxsX2xpbS0+dmNvMS5tYXhfaW5wdXRmcmVxID0gUk9NMTYocmVjb3JkWzEyXSkgKiAxMDAwOworCQlwbGxfbGltLT52Y28yLm1heF9pbnB1dGZyZXEgPSBST00xNihyZWNvcmRbMTRdKSAqIDEwMDA7CisJCXBsbF9saW0tPnZjbzEubWluX24gPSByZWNvcmRbMTZdOworCQlwbGxfbGltLT52Y28xLm1heF9uID0gcmVjb3JkWzE3XTsKKwkJcGxsX2xpbS0+dmNvMS5taW5fbSA9IHJlY29yZFsxOF07CisJCXBsbF9saW0tPnZjbzEubWF4X20gPSByZWNvcmRbMTldOworCQlwbGxfbGltLT52Y28yLm1pbl9uID0gcmVjb3JkWzIwXTsKKwkJcGxsX2xpbS0+dmNvMi5tYXhfbiA9IHJlY29yZFsyMV07CisJCXBsbF9saW0tPnZjbzIubWluX20gPSByZWNvcmRbMjJdOworCQlwbGxfbGltLT52Y28yLm1heF9tID0gcmVjb3JkWzIzXTsKKwkJcGxsX2xpbS0+bWF4X3VzYWJsZV9sb2cycCA9IHBsbF9saW0tPm1heF9sb2cycCA9IHJlY29yZFsyNV07CisJCXBsbF9saW0tPmxvZzJwX2JpYXMgPSByZWNvcmRbMjddOworCQlwbGxfbGltLT5yZWZjbGsgPSBST00zMihyZWNvcmRbMjhdKTsKKwl9IGVsc2UgaWYgKHBsbF9saW1fdmVyKSB7IC8qIHZlciAweDQwICovCisJCXVpbnQ4X3QgKmVudHJ5ID0gJmJpb3MtPmRhdGFbYmlvcy0+cGxsX2xpbWl0X3RibF9wdHIgKyBoZWFkZXJsZW5dOworCQl1aW50OF90ICpyZWNvcmQgPSBOVUxMOworCQlpbnQgaTsKKworCQlCSU9TTE9HKGJpb3MsICJMb2FkaW5nIFBMTCBsaW1pdHMgZm9yIHJlZ2lzdGVyIDB4JTA4eFxuIiwKKwkJCWxpbWl0X21hdGNoKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrLCBlbnRyeSArPSByZWNvcmRsZW4pIHsKKwkJCWlmIChST00zMihlbnRyeVszXSkgPT0gbGltaXRfbWF0Y2gpIHsKKwkJCQlyZWNvcmQgPSAmYmlvcy0+ZGF0YVtST00xNihlbnRyeVsxXSldOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKCFyZWNvcmQpIHsKKwkJCU5WX0VSUk9SKGRldiwgIlJlZ2lzdGVyIDB4JTA4eCBub3QgZm91bmQgaW4gUExMICIKKwkJCQkgImxpbWl0cyB0YWJsZSIsIGxpbWl0X21hdGNoKTsKKwkJCXJldHVybiAtRU5PRU5UOworCQl9CisKKwkJcGxsX2xpbS0+dmNvMS5taW5mcmVxID0gUk9NMTYocmVjb3JkWzBdKSAqIDEwMDA7CisJCXBsbF9saW0tPnZjbzEubWF4ZnJlcSA9IFJPTTE2KHJlY29yZFsyXSkgKiAxMDAwOworCQlwbGxfbGltLT52Y28xLm1pbl9pbnB1dGZyZXEgPSBST00xNihyZWNvcmRbNF0pICogMTAwMDsKKwkJcGxsX2xpbS0+dmNvMS5tYXhfaW5wdXRmcmVxID0gUk9NMTYocmVjb3JkWzZdKSAqIDEwMDA7CisJCXBsbF9saW0tPnZjbzEubWluX20gPSByZWNvcmRbOF07CisJCXBsbF9saW0tPnZjbzEubWF4X20gPSByZWNvcmRbOV07CisJCXBsbF9saW0tPnZjbzEubWluX24gPSByZWNvcmRbMTBdOworCQlwbGxfbGltLT52Y28xLm1heF9uID0gcmVjb3JkWzExXTsKKwkJcGxsX2xpbS0+bWluX3AgPSByZWNvcmRbMTJdOworCQlwbGxfbGltLT5tYXhfcCA9IHJlY29yZFsxM107CisJCS8qIHdoZXJlIGRpZCB0aGlzIGdvIHRvPz8gKi8KKwkJaWYgKGxpbWl0X21hdGNoID09IDB4MDA2MTQxMDAgfHwgbGltaXRfbWF0Y2ggPT0gMHgwMDYxNDkwMCkKKwkJCXBsbF9saW0tPnJlZmNsayA9IDI3MDAwOworCQllbHNlCisJCQlwbGxfbGltLT5yZWZjbGsgPSAxMDAwMDA7CisJfQorCisJLyoKKwkgKiBCeSBub3cgYW55IHZhbGlkIGxpbWl0IHRhYmxlIG91Z2h0IHRvIGhhdmUgc2V0IGEgbWF4IGZyZXF1ZW5jeSBmb3IKKwkgKiB2Y28xLCBzbyBpZiBpdCdzIHplcm8gaXQncyBlaXRoZXIgYSBwcmUgbGltaXQgdGFibGUgYmlvcywgb3Igb25lCisJICogd2l0aCBhbiBlbXB0eSBsaW1pdCB0YWJsZSAoc2VlbiBvbiBudjE4KQorCSAqLworCWlmICghcGxsX2xpbS0+dmNvMS5tYXhmcmVxKSB7CisJCXBsbF9saW0tPnZjbzEubWluZnJlcSA9IGJpb3MtPmZtaW52Y287CisJCXBsbF9saW0tPnZjbzEubWF4ZnJlcSA9IGJpb3MtPmZtYXh2Y287CisJCXBsbF9saW0tPnZjbzEubWluX2lucHV0ZnJlcSA9IDA7CisJCXBsbF9saW0tPnZjbzEubWF4X2lucHV0ZnJlcSA9IElOVF9NQVg7CisJCXBsbF9saW0tPnZjbzEubWluX24gPSAweDE7CisJCXBsbF9saW0tPnZjbzEubWF4X24gPSAweGZmOworCQlwbGxfbGltLT52Y28xLm1pbl9tID0gMHgxOworCQlpZiAoY3J5c3RhbF9zdHJhcHMgPT0gMCkgeworCQkJLyogbnYwNSBkb2VzIHRoaXMsIG52MTEgZG9lc24ndCwgbnYxMCB1bmtub3duICovCisJCQlpZiAoY3YgPCAweDExKQorCQkJCXBsbF9saW0tPnZjbzEubWluX20gPSAweDc7CisJCQlwbGxfbGltLT52Y28xLm1heF9tID0gMHhkOworCQl9IGVsc2UgeworCQkJaWYgKGN2IDwgMHgxMSkKKwkJCQlwbGxfbGltLT52Y28xLm1pbl9tID0gMHg4OworCQkJcGxsX2xpbS0+dmNvMS5tYXhfbSA9IDB4ZTsKKwkJfQorCQlpZiAoY3YgPCAweDE3IHx8IGN2ID09IDB4MWEgfHwgY3YgPT0gMHgyMCkKKwkJCXBsbF9saW0tPm1heF9sb2cycCA9IDQ7CisJCWVsc2UKKwkJCXBsbF9saW0tPm1heF9sb2cycCA9IDU7CisJCXBsbF9saW0tPm1heF91c2FibGVfbG9nMnAgPSBwbGxfbGltLT5tYXhfbG9nMnA7CisJfQorCisJaWYgKCFwbGxfbGltLT5yZWZjbGspCisJCXN3aXRjaCAoY3J5c3RhbF9zdHJhcHMpIHsKKwkJY2FzZSAwOgorCQkJcGxsX2xpbS0+cmVmY2xrID0gMTM1MDA7CisJCQlicmVhazsKKwkJY2FzZSAoMSA8PCA2KToKKwkJCXBsbF9saW0tPnJlZmNsayA9IDE0MzE4OworCQkJYnJlYWs7CisJCWNhc2UgKDEgPDwgMjIpOgorCQkJcGxsX2xpbS0+cmVmY2xrID0gMjcwMDA7CisJCQlicmVhazsKKwkJY2FzZSAoMSA8PCAyMiB8IDEgPDwgNik6CisJCQlwbGxfbGltLT5yZWZjbGsgPSAyNTAwMDsKKwkJCWJyZWFrOworCQl9CisKKyNpZiAwIC8qIGZvciBlYXN5IGRlYnVnZ2luZyAqLworCUVycm9yRigicGxsLnZjbzEubWluZnJlcTogJWRcbiIsIHBsbF9saW0tPnZjbzEubWluZnJlcSk7CisJRXJyb3JGKCJwbGwudmNvMS5tYXhmcmVxOiAlZFxuIiwgcGxsX2xpbS0+dmNvMS5tYXhmcmVxKTsKKwlFcnJvckYoInBsbC52Y28yLm1pbmZyZXE6ICVkXG4iLCBwbGxfbGltLT52Y28yLm1pbmZyZXEpOworCUVycm9yRigicGxsLnZjbzIubWF4ZnJlcTogJWRcbiIsIHBsbF9saW0tPnZjbzIubWF4ZnJlcSk7CisKKwlFcnJvckYoInBsbC52Y28xLm1pbl9pbnB1dGZyZXE6ICVkXG4iLCBwbGxfbGltLT52Y28xLm1pbl9pbnB1dGZyZXEpOworCUVycm9yRigicGxsLnZjbzEubWF4X2lucHV0ZnJlcTogJWRcbiIsIHBsbF9saW0tPnZjbzEubWF4X2lucHV0ZnJlcSk7CisJRXJyb3JGKCJwbGwudmNvMi5taW5faW5wdXRmcmVxOiAlZFxuIiwgcGxsX2xpbS0+dmNvMi5taW5faW5wdXRmcmVxKTsKKwlFcnJvckYoInBsbC52Y28yLm1heF9pbnB1dGZyZXE6ICVkXG4iLCBwbGxfbGltLT52Y28yLm1heF9pbnB1dGZyZXEpOworCisJRXJyb3JGKCJwbGwudmNvMS5taW5fbjogJWRcbiIsIHBsbF9saW0tPnZjbzEubWluX24pOworCUVycm9yRigicGxsLnZjbzEubWF4X246ICVkXG4iLCBwbGxfbGltLT52Y28xLm1heF9uKTsKKwlFcnJvckYoInBsbC52Y28xLm1pbl9tOiAlZFxuIiwgcGxsX2xpbS0+dmNvMS5taW5fbSk7CisJRXJyb3JGKCJwbGwudmNvMS5tYXhfbTogJWRcbiIsIHBsbF9saW0tPnZjbzEubWF4X20pOworCUVycm9yRigicGxsLnZjbzIubWluX246ICVkXG4iLCBwbGxfbGltLT52Y28yLm1pbl9uKTsKKwlFcnJvckYoInBsbC52Y28yLm1heF9uOiAlZFxuIiwgcGxsX2xpbS0+dmNvMi5tYXhfbik7CisJRXJyb3JGKCJwbGwudmNvMi5taW5fbTogJWRcbiIsIHBsbF9saW0tPnZjbzIubWluX20pOworCUVycm9yRigicGxsLnZjbzIubWF4X206ICVkXG4iLCBwbGxfbGltLT52Y28yLm1heF9tKTsKKworCUVycm9yRigicGxsLm1heF9sb2cycDogJWRcbiIsIHBsbF9saW0tPm1heF9sb2cycCk7CisJRXJyb3JGKCJwbGwubG9nMnBfYmlhczogJWRcbiIsIHBsbF9saW0tPmxvZzJwX2JpYXMpOworCisJRXJyb3JGKCJwbGwucmVmY2xrOiAlZFxuIiwgcGxsX2xpbS0+cmVmY2xrKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX2Jpb3NfdmVyc2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQpCit7CisJLyoKKwkgKiBvZmZzZXQgKyAwICAoOCBiaXRzKTogTWljcm8gdmVyc2lvbgorCSAqIG9mZnNldCArIDEgICg4IGJpdHMpOiBNaW5vciB2ZXJzaW9uCisJICogb2Zmc2V0ICsgMiAgKDggYml0cyk6IENoaXAgdmVyc2lvbgorCSAqIG9mZnNldCArIDMgICg4IGJpdHMpOiBNYWpvciB2ZXJzaW9uCisJICovCisKKwliaW9zLT5tYWpvcl92ZXJzaW9uID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAzXTsKKwliaW9zLT5wdWIuY2hpcF92ZXJzaW9uID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAyXTsKKwlOVl9UUkFDRShkZXYsICJCaW9zIHZlcnNpb24gJTAyeC4lMDJ4LiUwMnguJTAyeFxuIiwKKwkJIGJpb3MtPmRhdGFbb2Zmc2V0ICsgM10sIGJpb3MtPmRhdGFbb2Zmc2V0ICsgMl0sCisJCSBiaW9zLT5kYXRhW29mZnNldCArIDFdLCBiaW9zLT5kYXRhW29mZnNldF0pOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9zY3JpcHRfdGFibGVfcG9pbnRlcnMoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0KQoreworCS8qCisJICogUGFyc2VzIHRoZSBpbml0IHRhYmxlIHNlZ21lbnQgZm9yIHBvaW50ZXJzIHVzZWQgaW4gc2NyaXB0IGV4ZWN1dGlvbi4KKwkgKgorCSAqIG9mZnNldCArIDAgICgxNiBiaXRzKTogaW5pdCBzY3JpcHQgdGFibGVzIHBvaW50ZXIKKwkgKiBvZmZzZXQgKyAyICAoMTYgYml0cyk6IG1hY3JvIGluZGV4IHRhYmxlIHBvaW50ZXIKKwkgKiBvZmZzZXQgKyA0ICAoMTYgYml0cyk6IG1hY3JvIHRhYmxlIHBvaW50ZXIKKwkgKiBvZmZzZXQgKyA2ICAoMTYgYml0cyk6IGNvbmRpdGlvbiB0YWJsZSBwb2ludGVyCisJICogb2Zmc2V0ICsgOCAgKDE2IGJpdHMpOiBpbyBjb25kaXRpb24gdGFibGUgcG9pbnRlcgorCSAqIG9mZnNldCArIDEwICgxNiBiaXRzKTogaW8gZmxhZyBjb25kaXRpb24gdGFibGUgcG9pbnRlcgorCSAqIG9mZnNldCArIDEyICgxNiBiaXRzKTogaW5pdCBmdW5jdGlvbiB0YWJsZSBwb2ludGVyCisJICovCisKKwliaW9zLT5pbml0X3NjcmlwdF90YmxzX3B0ciA9IFJPTTE2KGJpb3MtPmRhdGFbb2Zmc2V0XSk7CisJYmlvcy0+bWFjcm9faW5kZXhfdGJsX3B0ciA9IFJPTTE2KGJpb3MtPmRhdGFbb2Zmc2V0ICsgMl0pOworCWJpb3MtPm1hY3JvX3RibF9wdHIgPSBST00xNihiaW9zLT5kYXRhW29mZnNldCArIDRdKTsKKwliaW9zLT5jb25kaXRpb25fdGJsX3B0ciA9IFJPTTE2KGJpb3MtPmRhdGFbb2Zmc2V0ICsgNl0pOworCWJpb3MtPmlvX2NvbmRpdGlvbl90YmxfcHRyID0gUk9NMTYoYmlvcy0+ZGF0YVtvZmZzZXQgKyA4XSk7CisJYmlvcy0+aW9fZmxhZ19jb25kaXRpb25fdGJsX3B0ciA9IFJPTTE2KGJpb3MtPmRhdGFbb2Zmc2V0ICsgMTBdKTsKKwliaW9zLT5pbml0X2Z1bmN0aW9uX3RibF9wdHIgPSBST00xNihiaW9zLT5kYXRhW29mZnNldCArIDEyXSk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYml0X0FfdGJsX2VudHJ5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBudmJpb3MgKmJpb3MsIHN0cnVjdCBiaXRfZW50cnkgKmJpdGVudHJ5KQoreworCS8qCisJICogUGFyc2VzIHRoZSBsb2FkIGRldGVjdCB2YWx1ZXMgZm9yIGc4MCBjYXJkcy4KKwkgKgorCSAqIG9mZnNldCArIDAgKDE2IGJpdHMpOiBsb2FkdmFsIHRhYmxlIHBvaW50ZXIKKwkgKi8KKworCXVpbnQxNl90IGxvYWRfdGFibGVfcHRyOworCXVpbnQ4X3QgdmVyc2lvbiwgaGVhZGVybGVuLCBlbnRyeWxlbiwgbnVtX2VudHJpZXM7CisKKwlpZiAoYml0ZW50cnktPmxlbmd0aCAhPSAzKSB7CisJCU5WX0VSUk9SKGRldiwgIkRvIG5vdCB1bmRlcnN0YW5kIEJJVCBBIHRhYmxlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbG9hZF90YWJsZV9wdHIgPSBST00xNihiaW9zLT5kYXRhW2JpdGVudHJ5LT5vZmZzZXRdKTsKKworCWlmIChsb2FkX3RhYmxlX3B0ciA9PSAweDApIHsKKwkJTlZfRVJST1IoZGV2LCAiUG9pbnRlciB0byBCSVQgbG9hZHZhbCB0YWJsZSBpbnZhbGlkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdmVyc2lvbiA9IGJpb3MtPmRhdGFbbG9hZF90YWJsZV9wdHJdOworCisJaWYgKHZlcnNpb24gIT0gMHgxMCkgeworCQlOVl9FUlJPUihkZXYsICJCSVQgbG9hZHZhbCB0YWJsZSB2ZXJzaW9uICVkLiVkIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkgdmVyc2lvbiA+PiA0LCB2ZXJzaW9uICYgMHhGKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJaGVhZGVybGVuID0gYmlvcy0+ZGF0YVtsb2FkX3RhYmxlX3B0ciArIDFdOworCWVudHJ5bGVuID0gYmlvcy0+ZGF0YVtsb2FkX3RhYmxlX3B0ciArIDJdOworCW51bV9lbnRyaWVzID0gYmlvcy0+ZGF0YVtsb2FkX3RhYmxlX3B0ciArIDNdOworCisJaWYgKGhlYWRlcmxlbiAhPSA0IHx8IGVudHJ5bGVuICE9IDQgfHwgbnVtX2VudHJpZXMgIT0gMikgeworCQlOVl9FUlJPUihkZXYsICJEbyBub3QgdW5kZXJzdGFuZCBCSVQgbG9hZHZhbCB0YWJsZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEZpcnN0IGVudHJ5IGlzIG5vcm1hbCBkYWMsIDJuZCB0di1vdXQgcGVyaGFwcz8gKi8KKwliaW9zLT5wdWIuZGFjdGVzdHZhbCA9IFJPTTMyKGJpb3MtPmRhdGFbbG9hZF90YWJsZV9wdHIgKyBoZWFkZXJsZW5dKSAmIDB4M2ZmOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYml0X0NfdGJsX2VudHJ5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBudmJpb3MgKmJpb3MsIHN0cnVjdCBiaXRfZW50cnkgKmJpdGVudHJ5KQoreworCS8qCisJICogb2Zmc2V0ICsgOCAgKDE2IGJpdHMpOiBQTEwgbGltaXRzIHRhYmxlIHBvaW50ZXIKKwkgKgorCSAqIFRoZXJlJ3MgbW9yZSBpbiBoZXJlLCBidXQgdGhhdCdzIHVua25vd24uCisJICovCisKKwlpZiAoYml0ZW50cnktPmxlbmd0aCA8IDEwKSB7CisJCU5WX0VSUk9SKGRldiwgIkRvIG5vdCB1bmRlcnN0YW5kIEJJVCBDIHRhYmxlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYmlvcy0+cGxsX2xpbWl0X3RibF9wdHIgPSBST00xNihiaW9zLT5kYXRhW2JpdGVudHJ5LT5vZmZzZXQgKyA4XSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9iaXRfZGlzcGxheV90YmxfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG52YmlvcyAqYmlvcywgc3RydWN0IGJpdF9lbnRyeSAqYml0ZW50cnkpCit7CisJLyoKKwkgKiBQYXJzZXMgdGhlIGZsYXQgcGFuZWwgdGFibGUgc2VnbWVudCB0aGF0IHRoZSBiaXQgZW50cnkgcG9pbnRzIHRvLgorCSAqIFN0YXJ0aW5nIGF0IGJpdGVudHJ5LT5vZmZzZXQ6CisJICoKKwkgKiBvZmZzZXQgKyAwICAoMTYgYml0cyk6ID8/PyB0YWJsZSBwb2ludGVyIC0gc2VlbXMgdG8gaGF2ZSAxOCBieXRlCisJICogcmVjb3JkcyBiZWdpbm5pbmcgd2l0aCBhIGZyZXEuCisJICogb2Zmc2V0ICsgMiAgKDE2IGJpdHMpOiBtb2RlIHRhYmxlIHBvaW50ZXIKKwkgKi8KKworCWlmIChiaXRlbnRyeS0+bGVuZ3RoICE9IDQpIHsKKwkJTlZfRVJST1IoZGV2LCAiRG8gbm90IHVuZGVyc3RhbmQgQklUIGRpc3BsYXkgdGFibGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwliaW9zLT5mcC5mcHRhYmxlcG9pbnRlciA9IFJPTTE2KGJpb3MtPmRhdGFbYml0ZW50cnktPm9mZnNldCArIDJdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2JpdF9pbml0X3RibF9lbnRyeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgbnZiaW9zICpiaW9zLCBzdHJ1Y3QgYml0X2VudHJ5ICpiaXRlbnRyeSkKK3sKKwkvKgorCSAqIFBhcnNlcyB0aGUgaW5pdCB0YWJsZSBzZWdtZW50IHRoYXQgdGhlIGJpdCBlbnRyeSBwb2ludHMgdG8uCisJICoKKwkgKiBTZWUgcGFyc2Vfc2NyaXB0X3RhYmxlX3BvaW50ZXJzIGZvciBsYXlvdXQKKwkgKi8KKworCWlmIChiaXRlbnRyeS0+bGVuZ3RoIDwgMTQpIHsKKwkJTlZfRVJST1IoZGV2LCAiRG8gbm90IHVuZGVyc3RhbmQgaW5pdCB0YWJsZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBhcnNlX3NjcmlwdF90YWJsZV9wb2ludGVycyhiaW9zLCBiaXRlbnRyeS0+b2Zmc2V0KTsKKworCWlmIChiaXRlbnRyeS0+bGVuZ3RoID49IDE2KQorCQliaW9zLT5zb21lX3NjcmlwdF9wdHIgPSBST00xNihiaW9zLT5kYXRhW2JpdGVudHJ5LT5vZmZzZXQgKyAxNF0pOworCWlmIChiaXRlbnRyeS0+bGVuZ3RoID49IDE4KQorCQliaW9zLT5pbml0OTZfdGJsX3B0ciA9IFJPTTE2KGJpb3MtPmRhdGFbYml0ZW50cnktPm9mZnNldCArIDE2XSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9iaXRfaV90YmxfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG52YmlvcyAqYmlvcywgc3RydWN0IGJpdF9lbnRyeSAqYml0ZW50cnkpCit7CisJLyoKKwkgKiBCSVQgJ2knIChpbmZvPykgdGFibGUKKwkgKgorCSAqIG9mZnNldCArIDAgICgzMiBiaXRzKTogQklPUyB2ZXJzaW9uIGR3b3JkIChhcyBpbiBCIHRhYmxlKQorCSAqIG9mZnNldCArIDUgICg4ICBiaXRzKTogQklPUyBmZWF0dXJlIGJ5dGUgKHNhbWUgYXMgZm9yIEJNUD8pCisJICogb2Zmc2V0ICsgMTMgKDE2IGJpdHMpOiBwb2ludGVyIHRvIHRhYmxlIGNvbnRhaW5pbmcgREFDIGxvYWQKKwkgKiBkZXRlY3Rpb24gY29tcGFyaXNvbiB2YWx1ZXMKKwkgKgorCSAqIFRoZXJlJ3Mgb3RoZXIgdGhpbmdzIGluIHRoZSB0YWJsZSwgcHVycG9zZSB1bmtub3duCisJICovCisKKwl1aW50MTZfdCBkYWNjbXBvZmZzZXQ7CisJdWludDhfdCBkYWN2ZXIsIGRhY2hlYWRlcmxlbjsKKworCWlmIChiaXRlbnRyeS0+bGVuZ3RoIDwgNikgeworCQlOVl9FUlJPUihkZXYsICJCSVQgaSB0YWJsZSB0b28gc2hvcnQgZm9yIG5lZWRlZCBpbmZvcm1hdGlvblxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBhcnNlX2Jpb3NfdmVyc2lvbihkZXYsIGJpb3MsIGJpdGVudHJ5LT5vZmZzZXQpOworCisJLyoKKwkgKiBiaXQgNCBzZWVtcyB0byBpbmRpY2F0ZSBhIG1vYmlsZSBiaW9zIChkb2Vzbid0IHN1ZmZlciBmcm9tIEJNUCdzCisJICogUXVhZHJvIGlkZW50aXR5IGNyaXNpcyksIG90aGVyIGJpdHMgcG9zc2libHkgYXMgZm9yIEJNUCBmZWF0dXJlIGJ5dGUKKwkgKi8KKwliaW9zLT5mZWF0dXJlX2J5dGUgPSBiaW9zLT5kYXRhW2JpdGVudHJ5LT5vZmZzZXQgKyA1XTsKKwliaW9zLT5pc19tb2JpbGUgPSBiaW9zLT5mZWF0dXJlX2J5dGUgJiBGRUFUVVJFX01PQklMRTsKKworCWlmIChiaXRlbnRyeS0+bGVuZ3RoIDwgMTUpIHsKKwkJTlZfV0FSTihkZXYsICJCSVQgaSB0YWJsZSBub3QgbG9uZyBlbm91Z2ggZm9yIERBQyBsb2FkICIKKwkJCSAgICAgICAiZGV0ZWN0aW9uIGNvbXBhcmlzb24gdGFibGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYWNjbXBvZmZzZXQgPSBST00xNihiaW9zLT5kYXRhW2JpdGVudHJ5LT5vZmZzZXQgKyAxM10pOworCisJLyogZG9lc24ndCBleGlzdCBvbiBnODAgKi8KKwlpZiAoIWRhY2NtcG9mZnNldCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgdGFibGUsIGZvbGxvd2luZyB0aGUgaGVhZGVyLCBpcyB0aGUKKwkgKiBjb21wYXJpc29uIHZhbHVlLCB0aGUgc2Vjb25kIGVudHJ5IGlzIGEgY29tcGFyaXNvbiB2YWx1ZSBmb3IKKwkgKiBUViBsb2FkIGRldGVjdGlvbi4KKwkgKi8KKworCWRhY3ZlciA9IGJpb3MtPmRhdGFbZGFjY21wb2Zmc2V0XTsKKwlkYWNoZWFkZXJsZW4gPSBiaW9zLT5kYXRhW2RhY2NtcG9mZnNldCArIDFdOworCisJaWYgKGRhY3ZlciAhPSAweDAwICYmIGRhY3ZlciAhPSAweDEwKSB7CisJCU5WX1dBUk4oZGV2LCAiREFDIGxvYWQgZGV0ZWN0aW9uIGNvbXBhcmlzb24gdGFibGUgdmVyc2lvbiAiCisJCQkgICAgICAgIiVkLiVkIG5vdCBrbm93blxuIiwgZGFjdmVyID4+IDQsIGRhY3ZlciAmIDB4Zik7CisJCXJldHVybiAtRU5PU1lTOworCX0KKworCWJpb3MtPnB1Yi5kYWN0ZXN0dmFsID0gUk9NMzIoYmlvcy0+ZGF0YVtkYWNjbXBvZmZzZXQgKyBkYWNoZWFkZXJsZW5dKTsKKwliaW9zLT5wdWIudHZkYWN0ZXN0dmFsID0gUk9NMzIoYmlvcy0+ZGF0YVtkYWNjbXBvZmZzZXQgKyBkYWNoZWFkZXJsZW4gKyA0XSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9iaXRfbHZkc190YmxfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG52YmlvcyAqYmlvcywgc3RydWN0IGJpdF9lbnRyeSAqYml0ZW50cnkpCit7CisJLyoKKwkgKiBQYXJzZXMgdGhlIExWRFMgdGFibGUgc2VnbWVudCB0aGF0IHRoZSBiaXQgZW50cnkgcG9pbnRzIHRvLgorCSAqIFN0YXJ0aW5nIGF0IGJpdGVudHJ5LT5vZmZzZXQ6CisJICoKKwkgKiBvZmZzZXQgKyAwICAoMTYgYml0cyk6IExWRFMgc3RyYXAgeGxhdGUgdGFibGUgcG9pbnRlcgorCSAqLworCisJaWYgKGJpdGVudHJ5LT5sZW5ndGggIT0gMikgeworCQlOVl9FUlJPUihkZXYsICJEbyBub3QgdW5kZXJzdGFuZCBCSVQgTFZEUyB0YWJsZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogTm8gaWRlYSBpZiBpdCdzIHN0aWxsIGNhbGxlZCB0aGUgTFZEUyBtYW51ZmFjdHVyZXIgdGFibGUsIGJ1dAorCSAqIHRoZSBjb25jZXB0J3MgY2xvc2UgZW5vdWdoLgorCSAqLworCWJpb3MtPmZwLmx2ZHNtYW51ZmFjdHVyZXJwb2ludGVyID0gUk9NMTYoYmlvcy0+ZGF0YVtiaXRlbnRyeS0+b2Zmc2V0XSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcGFyc2VfYml0X01fdGJsX2VudHJ5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBudmJpb3MgKmJpb3MsCisJCSAgICAgIHN0cnVjdCBiaXRfZW50cnkgKmJpdGVudHJ5KQoreworCS8qCisJICogb2Zmc2V0ICsgMiAgKDggIGJpdHMpOiBudW1iZXIgb2Ygb3B0aW9ucyBpbiBhbgorCSAqIAlJTklUX1JBTV9SRVNUUklDVF9aTV9SRUdfR1JPVVAgb3Bjb2RlIG9wdGlvbiBzZXQKKwkgKiBvZmZzZXQgKyAzICAoMTYgYml0cyk6IHBvaW50ZXIgdG8gc3RyYXAgeGxhdGUgdGFibGUgZm9yIFJBTQorCSAqIAlyZXN0cmljdCBvcHRpb24gc2VsZWN0aW9uCisJICoKKwkgKiBUaGVyZSdzIGEgYnVuY2ggb2YgYml0cyBpbiB0aGlzIHRhYmxlIG90aGVyIHRoYW4gdGhlIFJBTSByZXN0cmljdAorCSAqIHN0dWZmIHRoYXQgd2UgZG9uJ3QgdXNlIC0gdGhlaXIgdXNlIGN1cnJlbnRseSB1bmtub3duCisJICovCisKKwl1aW50MTZfdCBycl9zdHJhcF94bGF0OworCXVpbnQ4X3QgcnJfZ3JvdXBfY291bnQ7CisJaW50IGk7CisKKwkvKgorCSAqIE9sZGVyIGJpb3MgdmVyc2lvbnMgZG9uJ3QgaGF2ZSBhIHN1ZmZpY2llbnRseSBsb25nIHRhYmxlIGZvcgorCSAqIHdoYXQgd2Ugd2FudAorCSAqLworCWlmIChiaXRlbnRyeS0+bGVuZ3RoIDwgMHg1KQorCQlyZXR1cm4gMDsKKworCWlmIChiaXRlbnRyeS0+aWRbMV0gPCAyKSB7CisJCXJyX2dyb3VwX2NvdW50ID0gYmlvcy0+ZGF0YVtiaXRlbnRyeS0+b2Zmc2V0ICsgMl07CisJCXJyX3N0cmFwX3hsYXQgPSBST00xNihiaW9zLT5kYXRhW2JpdGVudHJ5LT5vZmZzZXQgKyAzXSk7CisJfSBlbHNlIHsKKwkJcnJfZ3JvdXBfY291bnQgPSBiaW9zLT5kYXRhW2JpdGVudHJ5LT5vZmZzZXQgKyAwXTsKKwkJcnJfc3RyYXBfeGxhdCA9IFJPTTE2KGJpb3MtPmRhdGFbYml0ZW50cnktPm9mZnNldCArIDFdKTsKKwl9CisKKwkvKiBhZGp1c3QgbGVuZ3RoIG9mIElOSVRfODcgKi8KKwlmb3IgKGkgPSAwOyBpdGJsX2VudHJ5W2ldLm5hbWUgJiYgKGl0YmxfZW50cnlbaV0uaWQgIT0gMHg4Nyk7IGkrKyk7CisJaXRibF9lbnRyeVtpXS5sZW5ndGggKz0gcnJfZ3JvdXBfY291bnQgKiA0OworCisJLyogc2V0IHVwIG11bHRpcGxpZXIgZm9yIElOSVRfUkFNX1JFU1RSSUNUX1pNX1JFR19HUk9VUCAqLworCWZvciAoOyBpdGJsX2VudHJ5W2ldLm5hbWUgJiYgKGl0YmxfZW50cnlbaV0uaWQgIT0gMHg4Zik7IGkrKyk7CisJaXRibF9lbnRyeVtpXS5sZW5ndGhfbXVsdGlwbGllciA9IHJyX2dyb3VwX2NvdW50ICogNDsKKworCWluaXRfcmFtX3Jlc3RyaWN0X3ptX3JlZ19ncm91cF9ibG9ja2xlbiA9IGl0YmxfZW50cnlbaV0ubGVuZ3RoX211bHRpcGxpZXI7CisJYmlvcy0+cmFtX3Jlc3RyaWN0X3RibF9wdHIgPSBycl9zdHJhcF94bGF0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYml0X3RtZHNfdGJsX2VudHJ5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBudmJpb3MgKmJpb3MsIHN0cnVjdCBiaXRfZW50cnkgKmJpdGVudHJ5KQoreworCS8qCisJICogUGFyc2VzIHRoZSBwb2ludGVyIHRvIHRoZSBUTURTIHRhYmxlCisJICoKKwkgKiBTdGFydGluZyBhdCBiaXRlbnRyeS0+b2Zmc2V0OgorCSAqCisJICogb2Zmc2V0ICsgMCAgKDE2IGJpdHMpOiBUTURTIHRhYmxlIHBvaW50ZXIKKwkgKgorCSAqIFRoZSBUTURTIHRhYmxlIGlzIHR5cGljYWxseSBmb3VuZCBqdXN0IGJlZm9yZSB0aGUgRENCIHRhYmxlLCB3aXRoIGEKKwkgKiBjaGFyYWN0ZXJpc3RpYyBzaWduYXR1cmUgb2YgMHgxMSwweDEzICgxLjEgYmVpbmcgdmVyc2lvbiwgMHgxMyBiZWluZworCSAqIGxlbmd0aD8pCisJICoKKwkgKiBBdCBvZmZzZXQgKzcgaXMgYSBwb2ludGVyIHRvIGEgc2NyaXB0LCB3aGljaCBJIGRvbid0IGtub3cgaG93IHRvCisJICogcnVuIHlldC4KKwkgKiBBdCBvZmZzZXQgKzkgaXMgYSBwb2ludGVyIHRvIGFub3RoZXIgc2NyaXB0LCBsaWtld2lzZQorCSAqIE9mZnNldCArMTEgaGFzIGEgcG9pbnRlciB0byBhIHRhYmxlIHdoZXJlIHRoZSBmaXJzdCB3b3JkIGlzIGEgcHhjbGsKKwkgKiBmcmVxdWVuY3kgYW5kIHRoZSBzZWNvbmQgd29yZCBhIHBvaW50ZXIgdG8gYSBzY3JpcHQsIHdoaWNoIHNob3VsZCBiZQorCSAqIHJ1biBpZiB0aGUgY29tcGFyaXNvbiBweGNsayBmcmVxdWVuY3kgaXMgbGVzcyB0aGFuIHRoZSBweGNsayBkZXNpcmVkLgorCSAqIFRoaXMgcmVwZWF0cyBmb3IgZGVjcmVhc2luZyBjb21wYXJpc29uIGZyZXF1ZW5jaWVzCisJICogT2Zmc2V0ICsxMyBoYXMgYSBwb2ludGVyIHRvIGEgc2ltaWxhciB0YWJsZQorCSAqIFRoZSBzZWxlY3Rpb24gb2YgdGFibGUgKGFuZCBwb3NzaWJseSArNy8rOSBzY3JpcHQpIGlzIGRpY3RhdGVkIGJ5CisJICogIm9yIiBmcm9tIHRoZSBEQ0IuCisJICovCisKKwl1aW50MTZfdCB0bWRzdGFibGVwdHIsIHNjcmlwdDEsIHNjcmlwdDI7CisKKwlpZiAoYml0ZW50cnktPmxlbmd0aCAhPSAyKSB7CisJCU5WX0VSUk9SKGRldiwgIkRvIG5vdCB1bmRlcnN0YW5kIEJJVCBUTURTIHRhYmxlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdG1kc3RhYmxlcHRyID0gUk9NMTYoYmlvcy0+ZGF0YVtiaXRlbnRyeS0+b2Zmc2V0XSk7CisKKwlpZiAodG1kc3RhYmxlcHRyID09IDB4MCkgeworCQlOVl9FUlJPUihkZXYsICJQb2ludGVyIHRvIFRNRFMgdGFibGUgaW52YWxpZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIG52NTArIGhhcyB2Mi4wLCBidXQgd2UgZG9uJ3QgcGFyc2UgaXQgYXRtICovCisJaWYgKGJpb3MtPmRhdGFbdG1kc3RhYmxlcHRyXSAhPSAweDExKSB7CisJCU5WX1dBUk4oZGV2LAorCQkJIlRNRFMgdGFibGUgcmV2aXNpb24gJWQuJWQgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWRcbiIsCisJCQliaW9zLT5kYXRhW3RtZHN0YWJsZXB0cl0gPj4gNCwgYmlvcy0+ZGF0YVt0bWRzdGFibGVwdHJdICYgMHhmKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJLyoKKwkgKiBUaGVzZSB0d28gc2NyaXB0cyBhcmUgb2RkOiB0aGV5IGRvbid0IHNlZW0gdG8gZ2V0IHJ1biBldmVuIHdoZW4KKwkgKiB0aGV5IGFyZSBub3Qgc3R1YmJlZC4KKwkgKi8KKwlzY3JpcHQxID0gUk9NMTYoYmlvcy0+ZGF0YVt0bWRzdGFibGVwdHIgKyA3XSk7CisJc2NyaXB0MiA9IFJPTTE2KGJpb3MtPmRhdGFbdG1kc3RhYmxlcHRyICsgOV0pOworCWlmIChiaW9zLT5kYXRhW3NjcmlwdDFdICE9ICdxJyB8fCBiaW9zLT5kYXRhW3NjcmlwdDJdICE9ICdxJykKKwkJTlZfV0FSTihkZXYsICJUTURTIHRhYmxlIHNjcmlwdCBwb2ludGVycyBub3Qgc3R1YmJlZFxuIik7CisKKwliaW9zLT50bWRzLm91dHB1dDBfc2NyaXB0X3B0ciA9IFJPTTE2KGJpb3MtPmRhdGFbdG1kc3RhYmxlcHRyICsgMTFdKTsKKwliaW9zLT50bWRzLm91dHB1dDFfc2NyaXB0X3B0ciA9IFJPTTE2KGJpb3MtPmRhdGFbdG1kc3RhYmxlcHRyICsgMTNdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwYXJzZV9iaXRfVV90YmxfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG52YmlvcyAqYmlvcywKKwkJICAgICAgc3RydWN0IGJpdF9lbnRyeSAqYml0ZW50cnkpCit7CisJLyoKKwkgKiBQYXJzZXMgdGhlIHBvaW50ZXIgdG8gdGhlIEc4MCBvdXRwdXQgc2NyaXB0IHRhYmxlcworCSAqCisJICogU3RhcnRpbmcgYXQgYml0ZW50cnktPm9mZnNldDoKKwkgKgorCSAqIG9mZnNldCArIDAgICgxNiBiaXRzKTogb3V0cHV0IHNjcmlwdCB0YWJsZSBwb2ludGVyCisJICovCisKKwl1aW50MTZfdCBvdXRwdXRzY3JpcHR0YWJsZXB0cjsKKworCWlmIChiaXRlbnRyeS0+bGVuZ3RoICE9IDMpIHsKKwkJTlZfRVJST1IoZGV2LCAiRG8gbm90IHVuZGVyc3RhbmQgQklUIFUgdGFibGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlvdXRwdXRzY3JpcHR0YWJsZXB0ciA9IFJPTTE2KGJpb3MtPmRhdGFbYml0ZW50cnktPm9mZnNldF0pOworCWJpb3MtPmRpc3BsYXkuc2NyaXB0X3RhYmxlX3B0ciA9IG91dHB1dHNjcmlwdHRhYmxlcHRyOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwYXJzZV9iaXRfZGlzcGxheXBvcnRfdGJsX2VudHJ5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBudmJpb3MgKmJpb3MsCisJCQkJc3RydWN0IGJpdF9lbnRyeSAqYml0ZW50cnkpCit7CisJYmlvcy0+ZGlzcGxheS5kcF90YWJsZV9wdHIgPSBST00xNihiaW9zLT5kYXRhW2JpdGVudHJ5LT5vZmZzZXRdKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGJpdF90YWJsZSB7CisJY29uc3QgY2hhciBpZDsKKwlpbnQgKCogY29uc3QgcGFyc2VfZm4pKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBudmJpb3MgKiwgc3RydWN0IGJpdF9lbnRyeSAqKTsKK307CisKKyNkZWZpbmUgQklUX1RBQkxFKGlkLCBmdW5jaWQpICgoc3RydWN0IGJpdF90YWJsZSl7IGlkLCBwYXJzZV9iaXRfIyNmdW5jaWQjI190YmxfZW50cnkgfSkKKworc3RhdGljIGludAorcGFyc2VfYml0X3RhYmxlKHN0cnVjdCBudmJpb3MgKmJpb3MsIGNvbnN0IHVpbnQxNl90IGJpdG9mZnNldCwKKwkJc3RydWN0IGJpdF90YWJsZSAqdGFibGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGJpb3MtPmRldjsKKwl1aW50OF90IG1heGVudHJpZXMgPSBiaW9zLT5kYXRhW2JpdG9mZnNldCArIDRdOworCWludCBpLCBvZmZzZXQ7CisJc3RydWN0IGJpdF9lbnRyeSBiaXRlbnRyeTsKKworCWZvciAoaSA9IDAsIG9mZnNldCA9IGJpdG9mZnNldCArIDY7IGkgPCBtYXhlbnRyaWVzOyBpKyssIG9mZnNldCArPSA2KSB7CisJCWJpdGVudHJ5LmlkWzBdID0gYmlvcy0+ZGF0YVtvZmZzZXRdOworCisJCWlmIChiaXRlbnRyeS5pZFswXSAhPSB0YWJsZS0+aWQpCisJCQljb250aW51ZTsKKworCQliaXRlbnRyeS5pZFsxXSA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV07CisJCWJpdGVudHJ5Lmxlbmd0aCA9IFJPTTE2KGJpb3MtPmRhdGFbb2Zmc2V0ICsgMl0pOworCQliaXRlbnRyeS5vZmZzZXQgPSBST00xNihiaW9zLT5kYXRhW29mZnNldCArIDRdKTsKKworCQlyZXR1cm4gdGFibGUtPnBhcnNlX2ZuKGRldiwgYmlvcywgJmJpdGVudHJ5KTsKKwl9CisKKwlOVl9JTkZPKGRldiwgIkJJVCB0YWJsZSAnJWMnIG5vdCBmb3VuZFxuIiwgdGFibGUtPmlkKTsKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworc3RhdGljIGludAorcGFyc2VfYml0X3N0cnVjdHVyZShzdHJ1Y3QgbnZiaW9zICpiaW9zLCBjb25zdCB1aW50MTZfdCBiaXRvZmZzZXQpCit7CisJaW50IHJldDsKKworCS8qCisJICogVGhlIG9ubHkgcmVzdHJpY3Rpb24gb24gcGFyc2luZyBvcmRlciBjdXJyZW50bHkgaXMgaGF2aW5nICdpJyBmaXJzdAorCSAqIGZvciB1c2Ugb2YgYmlvcy0+Kl92ZXJzaW9uIG9yIGJpb3MtPmZlYXR1cmVfYnl0ZSB3aGlsZSBwYXJzaW5nOworCSAqIGZ1bmN0aW9ucyBzaG91bGRuJ3QgYmUgYWN0dWFsbHkgKmRvaW5nKiBhbnl0aGluZyBhcGFydCBmcm9tIHB1bGxpbmcKKwkgKiBkYXRhIGZyb20gdGhlIGltYWdlIGludG8gdGhlIGJpb3Mgc3RydWN0LCB0aHVzIG5vIGludGVyZGVwZW5kZW5jaWVzCisJICovCisJcmV0ID0gcGFyc2VfYml0X3RhYmxlKGJpb3MsIGJpdG9mZnNldCwgJkJJVF9UQUJMRSgnaScsIGkpKTsKKwlpZiAocmV0KSAvKiBpbmZvPyAqLworCQlyZXR1cm4gcmV0OworCWlmIChiaW9zLT5tYWpvcl92ZXJzaW9uID49IDB4NjApIC8qIGc4MCsgKi8KKwkJcGFyc2VfYml0X3RhYmxlKGJpb3MsIGJpdG9mZnNldCwgJkJJVF9UQUJMRSgnQScsIEEpKTsKKwlyZXQgPSBwYXJzZV9iaXRfdGFibGUoYmlvcywgYml0b2Zmc2V0LCAmQklUX1RBQkxFKCdDJywgQykpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcGFyc2VfYml0X3RhYmxlKGJpb3MsIGJpdG9mZnNldCwgJkJJVF9UQUJMRSgnRCcsIGRpc3BsYXkpKTsKKwlyZXQgPSBwYXJzZV9iaXRfdGFibGUoYmlvcywgYml0b2Zmc2V0LCAmQklUX1RBQkxFKCdJJywgaW5pdCkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcGFyc2VfYml0X3RhYmxlKGJpb3MsIGJpdG9mZnNldCwgJkJJVF9UQUJMRSgnTScsIE0pKTsgLyogbWVtb3J5PyAqLworCXBhcnNlX2JpdF90YWJsZShiaW9zLCBiaXRvZmZzZXQsICZCSVRfVEFCTEUoJ0wnLCBsdmRzKSk7CisJcGFyc2VfYml0X3RhYmxlKGJpb3MsIGJpdG9mZnNldCwgJkJJVF9UQUJMRSgnVCcsIHRtZHMpKTsKKwlwYXJzZV9iaXRfdGFibGUoYmlvcywgYml0b2Zmc2V0LCAmQklUX1RBQkxFKCdVJywgVSkpOworCXBhcnNlX2JpdF90YWJsZShiaW9zLCBiaXRvZmZzZXQsICZCSVRfVEFCTEUoJ2QnLCBkaXNwbGF5cG9ydCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYm1wX3N0cnVjdHVyZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCS8qCisJICogUGFyc2VzIHRoZSBCTVAgc3RydWN0dXJlIGZvciB1c2VmdWwgdGhpbmdzLCBidXQgZG9lcyBub3QgYWN0IG9uIHRoZW0KKwkgKgorCSAqIG9mZnNldCArICAgNTogQk1QIG1ham9yIHZlcnNpb24KKwkgKiBvZmZzZXQgKyAgIDY6IEJNUCBtaW5vciB2ZXJzaW9uCisJICogb2Zmc2V0ICsgICA5OiBCTVAgZmVhdHVyZSBieXRlCisJICogb2Zmc2V0ICsgIDEwOiBCQ0QgZW5jb2RlZCBCSU9TIHZlcnNpb24KKwkgKgorCSAqIG9mZnNldCArICAxODogaW5pdCBzY3JpcHQgdGFibGUgcG9pbnRlciAoZm9yIGJpb3MgdmVyc2lvbnMgPCA1LjEwaCkKKwkgKiBvZmZzZXQgKyAgMjA6IGV4dHJhIGluaXQgc2NyaXB0IHRhYmxlIHBvaW50ZXIgKGZvciBiaW9zCisJICogdmVyc2lvbnMgPCA1LjEwaCkKKwkgKgorCSAqIG9mZnNldCArICAyNDogbWVtb3J5IGluaXQgdGFibGUgcG9pbnRlciAodXNlZCBvbiBlYXJseSBiaW9zIHZlcnNpb25zKQorCSAqIG9mZnNldCArICAyNjogU0RSIG1lbW9yeSBzZXF1ZW5jaW5nIHNldHVwIGRhdGEgdGFibGUKKwkgKiBvZmZzZXQgKyAgMjg6IEREUiBtZW1vcnkgc2VxdWVuY2luZyBzZXR1cCBkYXRhIHRhYmxlCisJICoKKwkgKiBvZmZzZXQgKyAgNTQ6IGluZGV4IG9mIEkyQyBDUlRDIHBhaXIgdG8gdXNlIGZvciBDUlQgb3V0cHV0CisJICogb2Zmc2V0ICsgIDU1OiBpbmRleCBvZiBJMkMgQ1JUQyBwYWlyIHRvIHVzZSBmb3IgVFYgb3V0cHV0CisJICogb2Zmc2V0ICsgIDU2OiBpbmRleCBvZiBJMkMgQ1JUQyBwYWlyIHRvIHVzZSBmb3IgZmxhdCBwYW5lbCBvdXRwdXQKKwkgKiBvZmZzZXQgKyAgNTg6IHdyaXRlIENSVEMgaW5kZXggZm9yIEkyQyBwYWlyIDAKKwkgKiBvZmZzZXQgKyAgNTk6IHJlYWQgQ1JUQyBpbmRleCBmb3IgSTJDIHBhaXIgMAorCSAqIG9mZnNldCArICA2MDogd3JpdGUgQ1JUQyBpbmRleCBmb3IgSTJDIHBhaXIgMQorCSAqIG9mZnNldCArICA2MTogcmVhZCBDUlRDIGluZGV4IGZvciBJMkMgcGFpciAxCisJICoKKwkgKiBvZmZzZXQgKyAgNjc6IG1heGltdW0gaW50ZXJuYWwgUExMIGZyZXF1ZW5jeSAoc2luZ2xlIHN0YWdlIFBMTCkKKwkgKiBvZmZzZXQgKyAgNzE6IG1pbmltdW0gaW50ZXJuYWwgUExMIGZyZXF1ZW5jeSAoc2luZ2xlIHN0YWdlIFBMTCkKKwkgKgorCSAqIG9mZnNldCArICA3NTogc2NyaXB0IHRhYmxlIHBvaW50ZXJzLCBhcyBkZXNjcmliZWQgaW4KKwkgKiBwYXJzZV9zY3JpcHRfdGFibGVfcG9pbnRlcnMKKwkgKgorCSAqIG9mZnNldCArICA4OTogVE1EUyBzaW5nbGUgbGluayBvdXRwdXQgQSB0YWJsZSBwb2ludGVyCisJICogb2Zmc2V0ICsgIDkxOiBUTURTIHNpbmdsZSBsaW5rIG91dHB1dCBCIHRhYmxlIHBvaW50ZXIKKwkgKiBvZmZzZXQgKyAgOTU6IExWRFMgc2luZ2xlIGxpbmsgb3V0cHV0IEEgdGFibGUgcG9pbnRlcgorCSAqIG9mZnNldCArIDEwNTogZmxhdCBwYW5lbCB0aW1pbmdzIHRhYmxlIHBvaW50ZXIKKwkgKiBvZmZzZXQgKyAxMDc6IGZsYXQgcGFuZWwgc3RyYXBwaW5nIHRyYW5zbGF0aW9uIHRhYmxlIHBvaW50ZXIKKwkgKiBvZmZzZXQgKyAxMTc6IExWRFMgbWFudWZhY3R1cmVyIHBhbmVsIGNvbmZpZyB0YWJsZSBwb2ludGVyCisJICogb2Zmc2V0ICsgMTE5OiBMVkRTIG1hbnVmYWN0dXJlciBzdHJhcHBpbmcgdHJhbnNsYXRpb24gdGFibGUgcG9pbnRlcgorCSAqCisJICogb2Zmc2V0ICsgMTQyOiBQTEwgbGltaXRzIHRhYmxlIHBvaW50ZXIKKwkgKgorCSAqIG9mZnNldCArIDE1NjogbWluaW11bSBwaXhlbCBjbG9jayBmb3IgTFZEUyBkdWFsIGxpbmsKKwkgKi8KKworCXVpbnQ4X3QgKmJtcCA9ICZiaW9zLT5kYXRhW29mZnNldF0sIGJtcF92ZXJzaW9uX21ham9yLCBibXBfdmVyc2lvbl9taW5vcjsKKwl1aW50MTZfdCBibXBsZW5ndGg7CisJdWludDE2X3QgbGVnYWN5X3NjcmlwdHNfb2Zmc2V0LCBsZWdhY3lfaTJjX29mZnNldDsKKworCS8qIGxvYWQgbmVlZGVkIGRlZmF1bHRzIGluIGNhc2Ugd2UgY2FuJ3QgcGFyc2UgdGhpcyBpbmZvICovCisJYmlvcy0+YmRjYi5kY2IuaTJjWzBdLndyaXRlID0gTlZfQ0lPX0NSRV9ERENfV1JfX0lOREVYOworCWJpb3MtPmJkY2IuZGNiLmkyY1swXS5yZWFkID0gTlZfQ0lPX0NSRV9ERENfU1RBVFVTX19JTkRFWDsKKwliaW9zLT5iZGNiLmRjYi5pMmNbMV0ud3JpdGUgPSBOVl9DSU9fQ1JFX0REQzBfV1JfX0lOREVYOworCWJpb3MtPmJkY2IuZGNiLmkyY1sxXS5yZWFkID0gTlZfQ0lPX0NSRV9EREMwX1NUQVRVU19fSU5ERVg7CisJYmlvcy0+cHViLmRpZ2l0YWxfbWluX2Zyb250X3BvcmNoID0gMHg0YjsKKwliaW9zLT5mbWF4dmNvID0gMjU2MDAwOworCWJpb3MtPmZtaW52Y28gPSAxMjgwMDA7CisJYmlvcy0+ZnAuZHVhbGxpbmtfdHJhbnNpdGlvbl9jbGsgPSA5MDAwMDsKKworCWJtcF92ZXJzaW9uX21ham9yID0gYm1wWzVdOworCWJtcF92ZXJzaW9uX21pbm9yID0gYm1wWzZdOworCisJTlZfVFJBQ0UoZGV2LCAiQk1QIHZlcnNpb24gJWQuJWRcbiIsCisJCSBibXBfdmVyc2lvbl9tYWpvciwgYm1wX3ZlcnNpb25fbWlub3IpOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCAweDM2IGlzIGJsYW5rIGFuZCBjYW4ndCBiZSBtaXN0YWtlbiBmb3IgYSBEQ0IKKwkgKiBwb2ludGVyIG9uIGVhcmx5IHZlcnNpb25zCisJICovCisJaWYgKGJtcF92ZXJzaW9uX21ham9yIDwgNSkKKwkJKih1aW50MTZfdCAqKSZiaW9zLT5kYXRhWzB4MzZdID0gMDsKKworCS8qCisJICogU2VlbXMgdGhhdCB0aGUgbWlub3IgdmVyc2lvbiB3YXMgMSBmb3IgYWxsIG1ham9yIHZlcnNpb25zIHByaW9yCisJICogdG8gNS4gVmVyc2lvbiA2IGNvdWxkIHRoZW9yZXRpY2FsbHkgZXhpc3QsIGJ1dCBJIHN1c3BlY3QgQklUCisJICogaGFwcGVuZWQgaW5zdGVhZC4KKwkgKi8KKwlpZiAoKGJtcF92ZXJzaW9uX21ham9yIDwgNSAmJiBibXBfdmVyc2lvbl9taW5vciAhPSAxKSB8fCBibXBfdmVyc2lvbl9tYWpvciA+IDUpIHsKKwkJTlZfRVJST1IoZGV2LCAiWW91IGhhdmUgYW4gdW5zdXBwb3J0ZWQgQk1QIHZlcnNpb24uICIKKwkJCQkiUGxlYXNlIHNlbmQgaW4geW91ciBiaW9zXG4iKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJaWYgKGJtcF92ZXJzaW9uX21ham9yID09IDApCisJCS8qIG5vdGhpbmcgdGhhdCdzIGN1cnJlbnRseSB1c2VmdWwgaW4gdGhpcyB2ZXJzaW9uICovCisJCXJldHVybiAwOworCWVsc2UgaWYgKGJtcF92ZXJzaW9uX21ham9yID09IDEpCisJCWJtcGxlbmd0aCA9IDQ0OyAvKiBleGFjdCBmb3IgMS4wMSAqLworCWVsc2UgaWYgKGJtcF92ZXJzaW9uX21ham9yID09IDIpCisJCWJtcGxlbmd0aCA9IDQ4OyAvKiBleGFjdCBmb3IgMi4wMSAqLworCWVsc2UgaWYgKGJtcF92ZXJzaW9uX21ham9yID09IDMpCisJCWJtcGxlbmd0aCA9IDU0OworCQkvKiBndWVzc2VkIC0gbWVtIGluaXQgdGFibGVzIGFkZGVkIGluIHRoaXMgdmVyc2lvbiAqLworCWVsc2UgaWYgKGJtcF92ZXJzaW9uX21ham9yID09IDQgfHwgYm1wX3ZlcnNpb25fbWlub3IgPCAweDEpCisJCS8qIGRvbid0IGtub3cgaWYgNS4wIGV4aXN0cy4uLiAqLworCQlibXBsZW5ndGggPSA2MjsKKwkJLyogZ3Vlc3NlZCAtIEJNUCBJMkMgaW5kaWNlcyBhZGRlZCBpbiB2ZXJzaW9uIDQqLworCWVsc2UgaWYgKGJtcF92ZXJzaW9uX21pbm9yIDwgMHg2KQorCQlibXBsZW5ndGggPSA2NzsgLyogZXhhY3QgZm9yIDUuMDEgKi8KKwllbHNlIGlmIChibXBfdmVyc2lvbl9taW5vciA8IDB4MTApCisJCWJtcGxlbmd0aCA9IDc1OyAvKiBleGFjdCBmb3IgNS4wNiAqLworCWVsc2UgaWYgKGJtcF92ZXJzaW9uX21pbm9yID09IDB4MTApCisJCWJtcGxlbmd0aCA9IDg5OyAvKiBleGFjdCBmb3IgNS4xMGggKi8KKwllbHNlIGlmIChibXBfdmVyc2lvbl9taW5vciA8IDB4MTQpCisJCWJtcGxlbmd0aCA9IDExODsgLyogZXhhY3QgZm9yIDUuMTFoICovCisJZWxzZSBpZiAoYm1wX3ZlcnNpb25fbWlub3IgPCAweDI0KQorCQkvKgorCQkgKiBOb3Qgc3VyZSBvZiB2ZXJzaW9uIHdoZXJlIHBsbCBsaW1pdHMgY2FtZSBpbjsKKwkJICogY2VydGFpbmx5IGV4aXN0IGJ5IDB4MjQgdGhvdWdoLgorCQkgKi8KKwkJLyogbGVuZ3RoIG5vdCBleGFjdDogdGhpcyBpcyBsb25nIGVub3VnaCB0byBnZXQgbHZkcyBtZW1iZXJzICovCisJCWJtcGxlbmd0aCA9IDEyMzsKKwllbHNlIGlmIChibXBfdmVyc2lvbl9taW5vciA8IDB4MjcpCisJCS8qCisJCSAqIExlbmd0aCBub3QgZXhhY3Q6IHRoaXMgaXMgbG9uZyBlbm91Z2ggdG8gZ2V0IHBsbCBsaW1pdAorCQkgKiBtZW1iZXIKKwkJICovCisJCWJtcGxlbmd0aCA9IDE0NDsKKwllbHNlCisJCS8qCisJCSAqIExlbmd0aCBub3QgZXhhY3Q6IHRoaXMgaXMgbG9uZyBlbm91Z2ggdG8gZ2V0IGR1YWwgbGluaworCQkgKiB0cmFuc2l0aW9uIGNsb2NrLgorCQkgKi8KKwkJYm1wbGVuZ3RoID0gMTU4OworCisJLyogY2hlY2tzdW0gKi8KKwlpZiAobnZfY2tzdW0oYm1wLCA4KSkgeworCQlOVl9FUlJPUihkZXYsICJCYWQgQk1QIGNoZWNrc3VtXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBCaXQgNCBzZWVtcyB0byBpbmRpY2F0ZSBlaXRoZXIgYSBtb2JpbGUgYmlvcyBvciBhIHF1YWRybyBjYXJkIC0tCisJICogbW9iaWxlIGJlaGF2aW91ciBjb25zaXN0ZW50IChudjExKyksIHF1YWRybyBvbmx5IHNlZW4gbnYxOGdsLW52MzZnbAorCSAqIChub3QgbnYxMGdsKSwgYml0IDUgdGhhdCB0aGUgZmxhdCBwYW5lbCB0YWJsZXMgYXJlIHByZXNlbnQsIGFuZAorCSAqIGJpdCA2IGEgdHYgYmlvcy4KKwkgKi8KKwliaW9zLT5mZWF0dXJlX2J5dGUgPSBibXBbOV07CisKKwlwYXJzZV9iaW9zX3ZlcnNpb24oZGV2LCBiaW9zLCBvZmZzZXQgKyAxMCk7CisKKwlpZiAoYm1wX3ZlcnNpb25fbWFqb3IgPCA1IHx8IGJtcF92ZXJzaW9uX21pbm9yIDwgMHgxMCkKKwkJYmlvcy0+b2xkX3N0eWxlX2luaXQgPSB0cnVlOworCWxlZ2FjeV9zY3JpcHRzX29mZnNldCA9IDE4OworCWlmIChibXBfdmVyc2lvbl9tYWpvciA8IDIpCisJCWxlZ2FjeV9zY3JpcHRzX29mZnNldCAtPSA0OworCWJpb3MtPmluaXRfc2NyaXB0X3RibHNfcHRyID0gUk9NMTYoYm1wW2xlZ2FjeV9zY3JpcHRzX29mZnNldF0pOworCWJpb3MtPmV4dHJhX2luaXRfc2NyaXB0X3RibF9wdHIgPSBST00xNihibXBbbGVnYWN5X3NjcmlwdHNfb2Zmc2V0ICsgMl0pOworCisJaWYgKGJtcF92ZXJzaW9uX21ham9yID4gMikgewkvKiBhcHBlYXJzIGluIEJNUCAzICovCisJCWJpb3MtPmxlZ2FjeS5tZW1faW5pdF90YmxfcHRyID0gUk9NMTYoYm1wWzI0XSk7CisJCWJpb3MtPmxlZ2FjeS5zZHJfc2VxX3RibF9wdHIgPSBST00xNihibXBbMjZdKTsKKwkJYmlvcy0+bGVnYWN5LmRkcl9zZXFfdGJsX3B0ciA9IFJPTTE2KGJtcFsyOF0pOworCX0KKworCWxlZ2FjeV9pMmNfb2Zmc2V0ID0gMHg0ODsJLyogQk1QIHZlcnNpb24gMiAmIDMgKi8KKwlpZiAoYm1wbGVuZ3RoID4gNjEpCisJCWxlZ2FjeV9pMmNfb2Zmc2V0ID0gb2Zmc2V0ICsgNTQ7CisJYmlvcy0+bGVnYWN5LmkyY19pbmRpY2VzLmNydCA9IGJpb3MtPmRhdGFbbGVnYWN5X2kyY19vZmZzZXRdOworCWJpb3MtPmxlZ2FjeS5pMmNfaW5kaWNlcy50diA9IGJpb3MtPmRhdGFbbGVnYWN5X2kyY19vZmZzZXQgKyAxXTsKKwliaW9zLT5sZWdhY3kuaTJjX2luZGljZXMucGFuZWwgPSBiaW9zLT5kYXRhW2xlZ2FjeV9pMmNfb2Zmc2V0ICsgMl07CisJYmlvcy0+YmRjYi5kY2IuaTJjWzBdLndyaXRlID0gYmlvcy0+ZGF0YVtsZWdhY3lfaTJjX29mZnNldCArIDRdOworCWJpb3MtPmJkY2IuZGNiLmkyY1swXS5yZWFkID0gYmlvcy0+ZGF0YVtsZWdhY3lfaTJjX29mZnNldCArIDVdOworCWJpb3MtPmJkY2IuZGNiLmkyY1sxXS53cml0ZSA9IGJpb3MtPmRhdGFbbGVnYWN5X2kyY19vZmZzZXQgKyA2XTsKKwliaW9zLT5iZGNiLmRjYi5pMmNbMV0ucmVhZCA9IGJpb3MtPmRhdGFbbGVnYWN5X2kyY19vZmZzZXQgKyA3XTsKKworCWlmIChibXBsZW5ndGggPiA3NCkgeworCQliaW9zLT5mbWF4dmNvID0gUk9NMzIoYm1wWzY3XSk7CisJCWJpb3MtPmZtaW52Y28gPSBST00zMihibXBbNzFdKTsKKwl9CisJaWYgKGJtcGxlbmd0aCA+IDg4KQorCQlwYXJzZV9zY3JpcHRfdGFibGVfcG9pbnRlcnMoYmlvcywgb2Zmc2V0ICsgNzUpOworCWlmIChibXBsZW5ndGggPiA5NCkgeworCQliaW9zLT50bWRzLm91dHB1dDBfc2NyaXB0X3B0ciA9IFJPTTE2KGJtcFs4OV0pOworCQliaW9zLT50bWRzLm91dHB1dDFfc2NyaXB0X3B0ciA9IFJPTTE2KGJtcFs5MV0pOworCQkvKgorCQkgKiBOZXZlciBvYnNlcnZlZCBpbiB1c2Ugd2l0aCBsdmRzIHNjcmlwdHMsIGJ1dCBpcyByZXVzZWQgZm9yCisJCSAqIDE4LzI0IGJpdCBwYW5lbCBpbnRlcmZhY2UgZGVmYXVsdCBmb3IgRURJRCBlcXVpcHBlZCBwYW5lbHMKKwkJICogKGlmX2lzXzI0Yml0IG5vdCBzZXQgZGlyZWN0bHkgdG8gYXZvaWQgYW55IG9zY2lsbGF0aW9uKS4KKwkJICovCisJCWJpb3MtPmxlZ2FjeS5sdmRzX3NpbmdsZV9hX3NjcmlwdF9wdHIgPSBST00xNihibXBbOTVdKTsKKwl9CisJaWYgKGJtcGxlbmd0aCA+IDEwOCkgeworCQliaW9zLT5mcC5mcHRhYmxlcG9pbnRlciA9IFJPTTE2KGJtcFsxMDVdKTsKKwkJYmlvcy0+ZnAuZnB4bGF0ZXRhYmxlcHRyID0gUk9NMTYoYm1wWzEwN10pOworCQliaW9zLT5mcC54bGF0d2lkdGggPSAxOworCX0KKwlpZiAoYm1wbGVuZ3RoID4gMTIwKSB7CisJCWJpb3MtPmZwLmx2ZHNtYW51ZmFjdHVyZXJwb2ludGVyID0gUk9NMTYoYm1wWzExN10pOworCQliaW9zLT5mcC5mcHhsYXRlbWFudWZhY3R1cmVydGFibGVwdHIgPSBST00xNihibXBbMTE5XSk7CisJfQorCWlmIChibXBsZW5ndGggPiAxNDMpCisJCWJpb3MtPnBsbF9saW1pdF90YmxfcHRyID0gUk9NMTYoYm1wWzE0Ml0pOworCisJaWYgKGJtcGxlbmd0aCA+IDE1NykKKwkJYmlvcy0+ZnAuZHVhbGxpbmtfdHJhbnNpdGlvbl9jbGsgPSBST00xNihibXBbMTU2XSkgKiAxMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdWludDE2X3QgZmluZHN0cih1aW50OF90ICpkYXRhLCBpbnQgbiwgY29uc3QgdWludDhfdCAqc3RyLCBpbnQgbGVuKQoreworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8PSAobiAtIGxlbik7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspCisJCQlpZiAoZGF0YVtpICsgal0gIT0gc3RyW2pdKQorCQkJCWJyZWFrOworCQlpZiAoaiA9PSBsZW4pCisJCQlyZXR1cm4gaTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcmVhZF9kY2JfaTJjX2VudHJ5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBkY2JfdmVyc2lvbiwgdWludDhfdCAqaTJjdGFibGUsIGludCBpbmRleCwgc3RydWN0IGRjYl9pMmNfZW50cnkgKmkyYykKK3sKKwl1aW50OF90IGRjYl9pMmNfdmVyID0gZGNiX3ZlcnNpb24sIGhlYWRlcmxlbiA9IDAsIGVudHJ5X2xlbiA9IDQ7CisJaW50IGkyY19lbnRyaWVzID0gRENCX01BWF9OVU1fSTJDX0VOVFJJRVM7CisJaW50IHJlY29yZG9mZnNldCA9IDAsIHJkb2ZzID0gMSwgd3JvZnMgPSAwOworCXVpbnQ4X3QgcG9ydF90eXBlID0gMDsKKworCWlmICghaTJjdGFibGUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRjYl92ZXJzaW9uID49IDB4MzApIHsKKwkJaWYgKGkyY3RhYmxlWzBdICE9IGRjYl92ZXJzaW9uKSAvKiBuZWNlc3Nhcnk/ICovCisJCQlOVl9XQVJOKGRldiwKKwkJCQkiRENCIEkyQyB0YWJsZSB2ZXJzaW9uIG1pc21hdGNoICglMDJYIHZzICUwMlgpXG4iLAorCQkJCWkyY3RhYmxlWzBdLCBkY2JfdmVyc2lvbik7CisJCWRjYl9pMmNfdmVyID0gaTJjdGFibGVbMF07CisJCWhlYWRlcmxlbiA9IGkyY3RhYmxlWzFdOworCQlpZiAoaTJjdGFibGVbMl0gPD0gRENCX01BWF9OVU1fSTJDX0VOVFJJRVMpCisJCQlpMmNfZW50cmllcyA9IGkyY3RhYmxlWzJdOworCQllbHNlCisJCQlOVl9XQVJOKGRldiwKKwkJCQkiRENCIEkyQyB0YWJsZSBoYXMgbW9yZSBlbnRyaWVzIHRoYW4gaW5kZXhhYmxlICIKKwkJCQkiKCVkIGVudHJpZXMsIG1heCBpbmRleCAxNSlcbiIsIGkyY3RhYmxlWzJdKTsKKwkJZW50cnlfbGVuID0gaTJjdGFibGVbM107CisJCS8qIFs0XSBpcyBpMmNfZGVmYXVsdF9pbmRpY2VzLCByZWFkIGluIHBhcnNlX2RjYl90YWJsZSgpICovCisJfQorCS8qCisJICogSXQncyB5b3VyIG93biBmYXVsdCBpZiB5b3UgY2FsbCB0aGlzIGZ1bmN0aW9uIG9uIGEgRENCIDEuMSBCSU9TIC0tCisJICogdGhlIHRlc3QgYmVsb3cgaXMgZm9yIERDQiAxLjIKKwkgKi8KKwlpZiAoZGNiX3ZlcnNpb24gPCAweDE0KSB7CisJCXJlY29yZG9mZnNldCA9IDI7CisJCXJkb2ZzID0gMDsKKwkJd3JvZnMgPSAxOworCX0KKworCWlmIChpbmRleCA9PSAweGYpCisJCXJldHVybiAwOworCWlmIChpbmRleCA+IGkyY19lbnRyaWVzKSB7CisJCU5WX0VSUk9SKGRldiwgIkRDQiBJMkMgaW5kZXggdG9vIGJpZyAoJWQgPiAlZClcbiIsCisJCQkgaW5kZXgsIGkyY3RhYmxlWzJdKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCWlmIChpMmN0YWJsZVtoZWFkZXJsZW4gKyBlbnRyeV9sZW4gKiBpbmRleCArIDNdID09IDB4ZmYpIHsKKwkJTlZfRVJST1IoZGV2LCAiRENCIEkyQyBlbnRyeSBpbnZhbGlkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGRjYl9pMmNfdmVyID49IDB4MzApIHsKKwkJcG9ydF90eXBlID0gaTJjdGFibGVbaGVhZGVybGVuICsgcmVjb3Jkb2Zmc2V0ICsgMyArIGVudHJ5X2xlbiAqIGluZGV4XTsKKworCQkvKgorCQkgKiBGaXh1cCBmb3IgY2hpcHMgdXNpbmcgc2FtZSBhZGRyZXNzIG9mZnNldCBmb3IgcmVhZCBhbmQKKwkJICogd3JpdGUuCisJCSAqLworCQlpZiAocG9ydF90eXBlID09IDQpCS8qIHNlZW4gb24gQzUxICovCisJCQlyZG9mcyA9IHdyb2ZzID0gMTsKKwkJaWYgKHBvcnRfdHlwZSA+PSA1KQkvKiBHODArICovCisJCQlyZG9mcyA9IHdyb2ZzID0gMDsKKwl9CisKKwlpZiAoZGNiX2kyY192ZXIgPj0gMHg0MCAmJiBwb3J0X3R5cGUgIT0gNSAmJiBwb3J0X3R5cGUgIT0gNikKKwkJTlZfV0FSTihkZXYsICJEQ0IgSTJDIHRhYmxlIGhhcyBwb3J0IHR5cGUgJWRcbiIsIHBvcnRfdHlwZSk7CisKKwlpMmMtPnBvcnRfdHlwZSA9IHBvcnRfdHlwZTsKKwlpMmMtPnJlYWQgPSBpMmN0YWJsZVtoZWFkZXJsZW4gKyByZWNvcmRvZmZzZXQgKyByZG9mcyArIGVudHJ5X2xlbiAqIGluZGV4XTsKKwlpMmMtPndyaXRlID0gaTJjdGFibGVbaGVhZGVybGVuICsgcmVjb3Jkb2Zmc2V0ICsgd3JvZnMgKyBlbnRyeV9sZW4gKiBpbmRleF07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqCituZXdfZ3Bpb19lbnRyeShzdHJ1Y3QgbnZiaW9zICpiaW9zKQoreworCXN0cnVjdCBwYXJzZWRfZGNiX2dwaW8gKmdwaW8gPSAmYmlvcy0+YmRjYi5ncGlvOworCisJcmV0dXJuICZncGlvLT5lbnRyeVtncGlvLT5lbnRyaWVzKytdOworfQorCitzdHJ1Y3QgZGNiX2dwaW9fZW50cnkgKgorbm91dmVhdV9iaW9zX2dwaW9fZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBkY2JfZ3Bpb190YWcgdGFnKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+VkJJT1M7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmlvcy0+YmRjYi5ncGlvLmVudHJpZXM7IGkrKykgeworCQlpZiAoYmlvcy0+YmRjYi5ncGlvLmVudHJ5W2ldLnRhZyAhPSB0YWcpCisJCQljb250aW51ZTsKKworCQlyZXR1cm4gJmJpb3MtPmJkY2IuZ3Bpby5lbnRyeVtpXTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3BhcnNlX2RjYjMwX2dwaW9fZW50cnkoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0KQoreworCXN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqZ3BpbzsKKwl1aW50MTZfdCBlbnQgPSBST00xNihiaW9zLT5kYXRhW29mZnNldF0pOworCXVpbnQ4X3QgbGluZSA9IGVudCAmIDB4MWYsCisJCXRhZyA9IGVudCA+PiA1ICYgMHgzZiwKKwkJZmxhZ3MgPSBlbnQgPj4gMTEgJiAweDFmOworCisJaWYgKHRhZyA9PSAweDNmKQorCQlyZXR1cm47CisKKwlncGlvID0gbmV3X2dwaW9fZW50cnkoYmlvcyk7CisKKwlncGlvLT50YWcgPSB0YWc7CisJZ3Bpby0+bGluZSA9IGxpbmU7CisJZ3Bpby0+aW52ZXJ0ID0gZmxhZ3MgIT0gNDsKK30KKworc3RhdGljIHZvaWQKK3BhcnNlX2RjYjQwX2dwaW9fZW50cnkoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0KQoreworCXN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqZ3BpbzsKKwl1aW50MzJfdCBlbnQgPSBST00zMihiaW9zLT5kYXRhW29mZnNldF0pOworCXVpbnQ4X3QgbGluZSA9IGVudCAmIDB4MWYsCisJCXRhZyA9IGVudCA+PiA4ICYgMHhmZjsKKworCWlmICh0YWcgPT0gMHhmZikKKwkJcmV0dXJuOworCisJZ3BpbyA9IG5ld19ncGlvX2VudHJ5KGJpb3MpOworCisJLyogQ3VycmVudGx5IHVudXNlZCwgd2UgbWF5IG5lZWQgbW9yZSBmaWVsZHMgcGFyc2VkIGF0IHNvbWUKKwkgKiBwb2ludC4gKi8KKwlncGlvLT50YWcgPSB0YWc7CisJZ3Bpby0+bGluZSA9IGxpbmU7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV9kY2JfZ3Bpb190YWJsZShzdHJ1Y3QgbnZiaW9zICpiaW9zKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBiaW9zLT5kZXY7CisJdWludDE2X3QgZ3Bpb190YWJsZV9wdHIgPSBiaW9zLT5iZGNiLmdwaW9fdGFibGVfcHRyOworCXVpbnQ4X3QgKmdwaW9fdGFibGUgPSAmYmlvcy0+ZGF0YVtncGlvX3RhYmxlX3B0cl07CisJaW50IGhlYWRlcl9sZW4gPSBncGlvX3RhYmxlWzFdLAorCSAgICBlbnRyaWVzID0gZ3Bpb190YWJsZVsyXSwKKwkgICAgZW50cnlfbGVuID0gZ3Bpb190YWJsZVszXTsKKwl2b2lkICgqcGFyc2VfZW50cnkpKHN0cnVjdCBudmJpb3MgKiwgdWludDE2X3QpID0gTlVMTDsKKwlpbnQgaTsKKworCWlmIChiaW9zLT5iZGNiLnZlcnNpb24gPj0gMHg0MCkgeworCQlpZiAoZ3Bpb190YWJsZV9wdHIgJiYgZW50cnlfbGVuICE9IDQpIHsKKwkJCU5WX1dBUk4oZGV2LCAiSW52YWxpZCBEQ0IgR1BJTyB0YWJsZSBlbnRyeSBsZW5ndGguXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXBhcnNlX2VudHJ5ID0gcGFyc2VfZGNiNDBfZ3Bpb19lbnRyeTsKKworCX0gZWxzZSBpZiAoYmlvcy0+YmRjYi52ZXJzaW9uID49IDB4MzApIHsKKwkJaWYgKGdwaW9fdGFibGVfcHRyICYmIGVudHJ5X2xlbiAhPSAyKSB7CisJCQlOVl9XQVJOKGRldiwgIkludmFsaWQgRENCIEdQSU8gdGFibGUgZW50cnkgbGVuZ3RoLlxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQlwYXJzZV9lbnRyeSA9IHBhcnNlX2RjYjMwX2dwaW9fZW50cnk7CisKKwl9IGVsc2UgaWYgKGJpb3MtPmJkY2IudmVyc2lvbiA+PSAweDIyKSB7CisJCS8qCisJCSAqIERDQnMgb2xkZXIgdGhhbiB2My4wIGRvbid0IHJlYWxseSBoYXZlIGEgR1BJTworCQkgKiB0YWJsZSwgaW5zdGVhZCB0aGV5IGtlZXAgc29tZSBHUElPIGluZm8gYXQgZml4ZWQKKwkJICogbG9jYXRpb25zLgorCQkgKi8KKwkJdWludDE2X3QgZGNicHRyID0gUk9NMTYoYmlvcy0+ZGF0YVsweDM2XSk7CisJCXVpbnQ4X3QgKnR2ZGFjX2dwaW8gPSAmYmlvcy0+ZGF0YVtkY2JwdHIgLSA1XTsKKworCQlpZiAodHZkYWNfZ3Bpb1swXSAmIDEpIHsKKwkJCXN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqZ3BpbyA9IG5ld19ncGlvX2VudHJ5KGJpb3MpOworCisJCQlncGlvLT50YWcgPSBEQ0JfR1BJT19UVkRBQzA7CisJCQlncGlvLT5saW5lID0gdHZkYWNfZ3Bpb1sxXSA+PiA0OworCQkJZ3Bpby0+aW52ZXJ0ID0gdHZkYWNfZ3Bpb1swXSAmIDI7CisJCX0KKwl9CisKKwlpZiAoIWdwaW9fdGFibGVfcHRyKQorCQlyZXR1cm47CisKKwlpZiAoZW50cmllcyA+IERDQl9NQVhfTlVNX0dQSU9fRU5UUklFUykgeworCQlOVl9XQVJOKGRldiwgIlRvbyBtYW55IGVudHJpZXMgaW4gdGhlIERDQiBHUElPIHRhYmxlLlxuIik7CisJCWVudHJpZXMgPSBEQ0JfTUFYX05VTV9HUElPX0VOVFJJRVM7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykKKwkJcGFyc2VfZW50cnkoYmlvcywgZ3Bpb190YWJsZV9wdHIgKyBoZWFkZXJfbGVuICsgZW50cnlfbGVuICogaSk7Cit9CisKK3N0cnVjdCBkY2JfY29ubmVjdG9yX3RhYmxlX2VudHJ5ICoKK25vdXZlYXVfYmlvc19jb25uZWN0b3JfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGluZGV4KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+VkJJT1M7CisJc3RydWN0IGRjYl9jb25uZWN0b3JfdGFibGVfZW50cnkgKmN0ZTsKKworCWlmIChpbmRleCA+PSBiaW9zLT5iZGNiLmNvbm5lY3Rvci5lbnRyaWVzKQorCQlyZXR1cm4gTlVMTDsKKworCWN0ZSA9ICZiaW9zLT5iZGNiLmNvbm5lY3Rvci5lbnRyeVtpbmRleF07CisJaWYgKGN0ZS0+dHlwZSA9PSAweGZmKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBjdGU7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV9kY2JfY29ubmVjdG9yX3RhYmxlKHN0cnVjdCBudmJpb3MgKmJpb3MpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGJpb3MtPmRldjsKKwlzdHJ1Y3QgZGNiX2Nvbm5lY3Rvcl90YWJsZSAqY3QgPSAmYmlvcy0+YmRjYi5jb25uZWN0b3I7CisJc3RydWN0IGRjYl9jb25uZWN0b3JfdGFibGVfZW50cnkgKmN0ZTsKKwl1aW50OF90ICpjb25udGFiID0gJmJpb3MtPmRhdGFbYmlvcy0+YmRjYi5jb25uZWN0b3JfdGFibGVfcHRyXTsKKwl1aW50OF90ICplbnRyeTsKKwlpbnQgaTsKKworCWlmICghYmlvcy0+YmRjYi5jb25uZWN0b3JfdGFibGVfcHRyKSB7CisJCU5WX0RFQlVHKGRldiwgIk5vIERDQiBjb25uZWN0b3IgdGFibGUgcHJlc2VudFxuIik7CisJCXJldHVybjsKKwl9CisKKwlOVl9JTkZPKGRldiwgIkRDQiBjb25uZWN0b3IgdGFibGU6IFZIRVIgMHglMDJ4ICVkICVkICVkXG4iLAorCQljb25udGFiWzBdLCBjb25udGFiWzFdLCBjb25udGFiWzJdLCBjb25udGFiWzNdKTsKKwlpZiAoKGNvbm50YWJbMF0gIT0gMHgzMCAmJiBjb25udGFiWzBdICE9IDB4NDApIHx8CisJICAgIChjb25udGFiWzNdICE9IDIgJiYgY29ubnRhYlszXSAhPSA0KSkgeworCQlOVl9FUlJPUihkZXYsICIgIFVua25vd24hICBQbGVhc2UgcmVwb3J0LlxuIik7CisJCXJldHVybjsKKwl9CisKKwljdC0+ZW50cmllcyA9IGNvbm50YWJbMl07CisKKwllbnRyeSA9IGNvbm50YWIgKyBjb25udGFiWzFdOworCWN0ZSA9ICZjdC0+ZW50cnlbMF07CisJZm9yIChpID0gMDsgaSA8IGNvbm50YWJbMl07IGkrKywgZW50cnkgKz0gY29ubnRhYlszXSwgY3RlKyspIHsKKwkJaWYgKGNvbm50YWJbM10gPT0gMikKKwkJCWN0ZS0+ZW50cnkgPSBST00xNihlbnRyeVswXSk7CisJCWVsc2UKKwkJCWN0ZS0+ZW50cnkgPSBST00zMihlbnRyeVswXSk7CisJCWN0ZS0+dHlwZSAgPSAoY3RlLT5lbnRyeSAmIDB4MDAwMDAwZmYpID4+IDA7CisJCWN0ZS0+aW5kZXggPSAoY3RlLT5lbnRyeSAmIDB4MDAwMDBmMDApID4+IDg7CisJCXN3aXRjaCAoY3RlLT5lbnRyeSAmIDB4MDAwMzMwMDApIHsKKwkJY2FzZSAweDAwMDAxMDAwOgorCQkJY3RlLT5ncGlvX3RhZyA9IDB4MDc7CisJCQlicmVhazsKKwkJY2FzZSAweDAwMDAyMDAwOgorCQkJY3RlLT5ncGlvX3RhZyA9IDB4MDg7CisJCQlicmVhazsKKwkJY2FzZSAweDAwMDEwMDAwOgorCQkJY3RlLT5ncGlvX3RhZyA9IDB4NTE7CisJCQlicmVhazsKKwkJY2FzZSAweDAwMDIwMDAwOgorCQkJY3RlLT5ncGlvX3RhZyA9IDB4NTI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWN0ZS0+Z3Bpb190YWcgPSAweGZmOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY3RlLT50eXBlID09IDB4ZmYpCisJCQljb250aW51ZTsKKworCQlOVl9JTkZPKGRldiwgIiAgJWQ6IDB4JTA4eDogdHlwZSAweCUwMnggaWR4ICVkIHRhZyAweCUwMnhcbiIsCisJCQlpLCBjdGUtPmVudHJ5LCBjdGUtPnR5cGUsIGN0ZS0+aW5kZXgsIGN0ZS0+Z3Bpb190YWcpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBkY2JfZW50cnkgKm5ld19kY2JfZW50cnkoc3RydWN0IHBhcnNlZF9kY2IgKmRjYikKK3sKKwlzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSA9ICZkY2ItPmVudHJ5W2RjYi0+ZW50cmllc107CisKKwltZW1zZXQoZW50cnksIDAsIHNpemVvZihzdHJ1Y3QgZGNiX2VudHJ5KSk7CisJZW50cnktPmluZGV4ID0gZGNiLT5lbnRyaWVzKys7CisKKwlyZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyB2b2lkIGZhYnJpY2F0ZV92Z2Ffb3V0cHV0KHN0cnVjdCBwYXJzZWRfZGNiICpkY2IsIGludCBpMmMsIGludCBoZWFkcykKK3sKKwlzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSA9IG5ld19kY2JfZW50cnkoZGNiKTsKKworCWVudHJ5LT50eXBlID0gMDsKKwllbnRyeS0+aTJjX2luZGV4ID0gaTJjOworCWVudHJ5LT5oZWFkcyA9IGhlYWRzOworCWVudHJ5LT5sb2NhdGlvbiA9IERDQl9MT0NfT05fQ0hJUDsKKwkvKiAib3IiIG1vc3RseSB1bnVzZWQgaW4gZWFybHkgZ2VuIGNydCBtb2Rlc2V0dGluZywgMCBpcyBmaW5lICovCit9CisKK3N0YXRpYyB2b2lkIGZhYnJpY2F0ZV9kdmlfaV9vdXRwdXQoc3RydWN0IHBhcnNlZF9kY2IgKmRjYiwgYm9vbCB0d29IZWFkcykKK3sKKwlzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSA9IG5ld19kY2JfZW50cnkoZGNiKTsKKworCWVudHJ5LT50eXBlID0gMjsKKwllbnRyeS0+aTJjX2luZGV4ID0gTEVHQUNZX0kyQ19QQU5FTDsKKwllbnRyeS0+aGVhZHMgPSB0d29IZWFkcyA/IDMgOiAxOworCWVudHJ5LT5sb2NhdGlvbiA9ICFEQ0JfTE9DX09OX0NISVA7CS8qIGllIE9GRiBDSElQICovCisJZW50cnktPm9yID0gMTsJLyogbWVhbnMgfDB4MTAgZ2V0cyBzZXQgb24gQ1JFX0xDRF9fSU5ERVggKi8KKwllbnRyeS0+ZHVhbGxpbmtfcG9zc2libGUgPSBmYWxzZTsgLyogU2lJMTY0IGFuZCBjby4gYXJlIHNpbmdsZSBsaW5rICovCisKKyNpZiAwCisJLyoKKwkgKiBGb3IgZHZpLWEgZWl0aGVyIGNydGMgcHJvYmFibHkgd29ya3MsIGJ1dCBteSBjYXJkIGFwcGVhcnMgdG8gb25seQorCSAqIHN1cHBvcnQgZHZpLWQuICAibnZpZGlhIiBzdGlsbCBhdHRlbXB0cyB0byBwcm9ncmFtIGl0IGZvciBkdmktYSwKKwkgKiBkb2luZyB0aGUgZnVsbCBmcCBvdXRwdXQgc2V0dXAgKHByb2dyYW0gMHg2ODA4Li4gZnAgZGltZW5zaW9uIHJlZ3MsCisJICogc2V0dGluZyAweDY4MDg0OCB0byAweDEwMDAwMTExIHRvIGVuYWJsZSwgbWF5YmUgc2V0dGluZyAweDY4MDg4MCk7CisJICogdGhlIG1vbml0b3IgcGlja3MgdXAgdGhlIG1vZGUgcmVzIG9rIGFuZCBsaWdodHMgdXAsIGJ1dCBubyBwaXhlbAorCSAqIGRhdGEgYXBwZWFycywgc28gdGhlIGJvYXJkIG1hbnVmYWN0dXJlciBwcm9iYWJseSBjb25uZWN0ZWQgdXAgdGhlCisJICogc3luYyBsaW5lcywgYnV0IG1pc3NlZCB0aGUgdmlkZW8gdHJhY2VzIC8gY29tcG9uZW50cworCSAqCisJICogd2l0aCB0aGlzIGludHJvZHVjdGlvbiwgZHZpLWEgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlci4KKwkgKi8KKwlmYWJyaWNhdGVfdmdhX291dHB1dChkY2IsIExFR0FDWV9JMkNfUEFORUwsIGVudHJ5LT5oZWFkcyk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgZmFicmljYXRlX3R2X291dHB1dChzdHJ1Y3QgcGFyc2VkX2RjYiAqZGNiLCBib29sIHR3b0hlYWRzKQoreworCXN0cnVjdCBkY2JfZW50cnkgKmVudHJ5ID0gbmV3X2RjYl9lbnRyeShkY2IpOworCisJZW50cnktPnR5cGUgPSAxOworCWVudHJ5LT5pMmNfaW5kZXggPSBMRUdBQ1lfSTJDX1RWOworCWVudHJ5LT5oZWFkcyA9IHR3b0hlYWRzID8gMyA6IDE7CisJZW50cnktPmxvY2F0aW9uID0gIURDQl9MT0NfT05fQ0hJUDsJLyogaWUgT0ZGIENISVAgKi8KK30KKworc3RhdGljIGJvb2wKK3BhcnNlX2RjYjIwX2VudHJ5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBiaW9zX3BhcnNlZF9kY2IgKmJkY2IsCisJCSAgdWludDMyX3QgY29ubiwgdWludDMyX3QgY29uZiwgc3RydWN0IGRjYl9lbnRyeSAqZW50cnkpCit7CisJZW50cnktPnR5cGUgPSBjb25uICYgMHhmOworCWVudHJ5LT5pMmNfaW5kZXggPSAoY29ubiA+PiA0KSAmIDB4ZjsKKwllbnRyeS0+aGVhZHMgPSAoY29ubiA+PiA4KSAmIDB4ZjsKKwlpZiAoYmRjYi0+dmVyc2lvbiA+PSAweDQwKQorCQllbnRyeS0+Y29ubmVjdG9yID0gKGNvbm4gPj4gMTIpICYgMHhmOworCWVudHJ5LT5idXMgPSAoY29ubiA+PiAxNikgJiAweGY7CisJZW50cnktPmxvY2F0aW9uID0gKGNvbm4gPj4gMjApICYgMHgzOworCWVudHJ5LT5vciA9IChjb25uID4+IDI0KSAmIDB4ZjsKKwkvKgorCSAqIE5vcm1hbCBlbnRyaWVzIGNvbnNpc3Qgb2YgYSBzaW5nbGUgYml0LCBidXQgZHVhbCBsaW5rIGhhcyB0aGUKKwkgKiBuZXh0IG1vc3Qgc2lnbmlmaWNhbnQgYml0IHNldCB0b28KKwkgKi8KKwllbnRyeS0+ZHVhbGxpbmtfcG9zc2libGUgPQorCQkJKCgxIDw8IChmZnMoZW50cnktPm9yKSAtIDEpKSAqIDMgPT0gZW50cnktPm9yKTsKKworCXN3aXRjaCAoZW50cnktPnR5cGUpIHsKKwljYXNlIE9VVFBVVF9BTkFMT0c6CisJCS8qCisJCSAqIEFsdGhvdWdoIHRoZSByZXN0IG9mIGEgQ1JUIGNvbmYgZHdvcmQgaXMgdXN1YWxseQorCQkgKiB6ZXJvcywgbWFjIGJpb3NlbiBoYXZlIHN0dWZmIHRoZXJlIHNvIHdlIG11c3QgbWFzaworCQkgKi8KKwkJZW50cnktPmNydGNvbmYubWF4ZnJlcSA9IChiZGNiLT52ZXJzaW9uIDwgMHgzMCkgPworCQkJCQkgKGNvbmYgJiAweGZmZmYpICogMTAgOgorCQkJCQkgKGNvbmYgJiAweGZmKSAqIDEwMDAwOworCQlicmVhazsKKwljYXNlIE9VVFBVVF9MVkRTOgorCQl7CisJCXVpbnQzMl90IG1hc2s7CisJCWlmIChjb25mICYgMHgxKQorCQkJZW50cnktPmx2ZHNjb25mLnVzZV9zdHJhcHNfZm9yX21vZGUgPSB0cnVlOworCQlpZiAoYmRjYi0+dmVyc2lvbiA8IDB4MjIpIHsKKwkJCW1hc2sgPSB+MHhkOworCQkJLyoKKwkJCSAqIFRoZSBsYXB0b3AgaW4gYnVnIDE0NTY3IGxpZXMgYW5kIGNsYWltcyB0byBub3QgdXNlCisJCQkgKiBzdHJhcHMgd2hlbiBpdCBkb2VzLCBzbyBhc3N1bWUgYWxsIERDQiAyLjAgbGFwdG9wcworCQkJICogdXNlIHN0cmFwcywgdW50aWwgYSBicm9rZW4gRURJRCB1c2luZyBvbmUgaXMgcHJvZHVjZWQKKwkJCSAqLworCQkJZW50cnktPmx2ZHNjb25mLnVzZV9zdHJhcHNfZm9yX21vZGUgPSB0cnVlOworCQkJLyoKKwkJCSAqIEJvdGggMHg0IGFuZCAweDggc2hvdyB1cCBpbiB2Mi4wIHRhYmxlczsgYXNzdW1lIHRoZXkKKwkJCSAqIG1lYW4gdGhlIHNhbWUgdGhpbmcgKHByb2JhYmx5IHdyb25nLCBidXQgbWlnaHQgd29yaykKKwkJCSAqLworCQkJaWYgKGNvbmYgJiAweDQgfHwgY29uZiAmIDB4OCkKKwkJCQllbnRyeS0+bHZkc2NvbmYudXNlX3Bvd2VyX3NjcmlwdHMgPSB0cnVlOworCQl9IGVsc2UgeworCQkJbWFzayA9IH4weDU7CisJCQlpZiAoY29uZiAmIDB4NCkKKwkJCQllbnRyeS0+bHZkc2NvbmYudXNlX3Bvd2VyX3NjcmlwdHMgPSB0cnVlOworCQl9CisJCWlmIChjb25mICYgbWFzaykgeworCQkJLyoKKwkJCSAqIFVudGlsIHdlIGV2ZW4gdHJ5IHRvIHVzZSB0aGVzZSBvbiBHOHgsIGl0J3MKKwkJCSAqIHVzZWxlc3MgcmVwb3J0aW5nIHVua25vd24gYml0cy4gIFRoZXkgYWxsIGFyZS4KKwkJCSAqLworCQkJaWYgKGJkY2ItPnZlcnNpb24gPj0gMHg0MCkKKwkJCQlicmVhazsKKworCQkJTlZfRVJST1IoZGV2LCAiVW5rbm93biBMVkRTIGNvbmZpZ3VyYXRpb24gYml0cywgIgorCQkJCSAgICAgICJwbGVhc2UgcmVwb3J0XG4iKTsKKwkJfQorCQlicmVhazsKKwkJfQorCWNhc2UgT1VUUFVUX1RWOgorCXsKKwkJaWYgKGJkY2ItPnZlcnNpb24gPj0gMHgzMCkKKwkJCWVudHJ5LT50dmNvbmYuaGFzX2NvbXBvbmVudF9vdXRwdXQgPSBjb25mICYgKDB4OCA8PCA0KTsKKwkJZWxzZQorCQkJZW50cnktPnR2Y29uZi5oYXNfY29tcG9uZW50X291dHB1dCA9IGZhbHNlOworCisJCWJyZWFrOworCX0KKwljYXNlIE9VVFBVVF9EUDoKKwkJZW50cnktPmRwY29uZi5zb3IubGluayA9IChjb25mICYgMHgwMDAwMDAzMCkgPj4gNDsKKwkJZW50cnktPmRwY29uZi5saW5rX2J3ID0gKGNvbmYgJiAweDAwZTAwMDAwKSA+PiAyMTsKKwkJc3dpdGNoICgoY29uZiAmIDB4MGYwMDAwMDApID4+IDI0KSB7CisJCWNhc2UgMHhmOgorCQkJZW50cnktPmRwY29uZi5saW5rX25yID0gNDsKKwkJCWJyZWFrOworCQljYXNlIDB4MzoKKwkJCWVudHJ5LT5kcGNvbmYubGlua19uciA9IDI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVudHJ5LT5kcGNvbmYubGlua19uciA9IDE7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIE9VVFBVVF9UTURTOgorCQllbnRyeS0+dG1kc2NvbmYuc29yLmxpbmsgPSAoY29uZiAmIDB4MDAwMDAwMzApID4+IDQ7CisJCWJyZWFrOworCWNhc2UgMHhlOgorCQkvKiB3ZWlyZCBnODAgbW9iaWxlIHR5cGUgdGhhdCAibnYiIHRyZWF0cyBhcyBhIHRlcm1pbmF0b3IgKi8KKwkJYmRjYi0+ZGNiLmVudHJpZXMtLTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIHVuc3VyZSB3aGF0IERDQiB2ZXJzaW9uIGludHJvZHVjZXMgdGhpcywgMy4wPyAqLworCWlmIChjb25mICYgMHgxMDAwMDApCisJCWVudHJ5LT5pMmNfdXBwZXJfZGVmYXVsdCA9IHRydWU7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK3BhcnNlX2RjYjE1X2VudHJ5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBwYXJzZWRfZGNiICpkY2IsCisJCSAgdWludDMyX3QgY29ubiwgdWludDMyX3QgY29uZiwgc3RydWN0IGRjYl9lbnRyeSAqZW50cnkpCit7CisJaWYgKGNvbm4gIT0gMHhmMDAwM2YwMCAmJiBjb25uICE9IDB4ZjIyNDdmMTAgJiYgY29ubiAhPSAweGYyMjA0MDAxICYmCisJICAgIGNvbm4gIT0gMHhmMjIwNDMwMSAmJiBjb25uICE9IDB4ZjIyMDQzMTEgJiYgY29ubiAhPSAweGYyMjA4MDAxICYmCisJICAgIGNvbm4gIT0gMHhmMjI0NDAwMSAmJiBjb25uICE9IDB4ZjIyNDQzMDEgJiYgY29ubiAhPSAweGYyMjQ0MzExICYmCisJICAgIGNvbm4gIT0gMHhmNDIwNDAxMSAmJiBjb25uICE9IDB4ZjQyMDgwMTEgJiYgY29ubiAhPSAweGY0MjQ4MDExICYmCisJICAgIGNvbm4gIT0gMHhmMjA0NWZmMiAmJiBjb25uICE9IDB4ZjIwNDVmMTQgJiYgY29ubiAhPSAweGYyMDdkZjE0ICYmCisJICAgIGNvbm4gIT0gMHhmMjIwNTAwNCAmJiBjb25uICE9IDB4ZjIyMDkwMDQpIHsKKwkJTlZfRVJST1IoZGV2LCAiVW5rbm93biBEQ0IgMS41IGVudHJ5LCBwbGVhc2UgcmVwb3J0XG4iKTsKKworCQkvKiBjYXVzZSBvdXRwdXQgc2V0dGluZyB0byBmYWlsIGZvciAhVFYsIHNvIG1lc3NhZ2UgaXMgc2VlbiAqLworCQlpZiAoKGNvbm4gJiAweGYpICE9IDB4MSkKKwkJCWRjYi0+ZW50cmllcyA9IDA7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkvKiBtb3N0IG9mIHRoZSBiZWxvdyBpcyBhICJiZXN0IGd1ZXNzIiBhdG0gKi8KKwllbnRyeS0+dHlwZSA9IGNvbm4gJiAweGY7CisJaWYgKGVudHJ5LT50eXBlID09IDIpCisJCS8qIGFub3RoZXIgd2F5IG9mIHNwZWNpZnlpbmcgc3RyYXBzIGJhc2VkIGx2ZHMuLi4gKi8KKwkJZW50cnktPnR5cGUgPSBPVVRQVVRfTFZEUzsKKwlpZiAoZW50cnktPnR5cGUgPT0gNCkgeyAvKiBkaWdpdGFsICovCisJCWlmIChjb25uICYgMHgxMCkKKwkJCWVudHJ5LT50eXBlID0gT1VUUFVUX0xWRFM7CisJCWVsc2UKKwkJCWVudHJ5LT50eXBlID0gT1VUUFVUX1RNRFM7CisJfQorCS8qIHdoYXQncyBpbiBiaXRzIDUtMTM/IGNvdWxkIGJlIHNvbWUgZW5jb2RlciBtYWtlciB0aGluZywgaW4gdHYgY2FzZSAqLworCWVudHJ5LT5pMmNfaW5kZXggPSAoY29ubiA+PiAxNCkgJiAweGY7CisJLyogcmF3IGhlYWRzIGZpZWxkIGlzIGluIHJhbmdlIDAtMSwgc28gbW92ZSB0byAxLTIgKi8KKwllbnRyeS0+aGVhZHMgPSAoKGNvbm4gPj4gMTgpICYgMHg3KSArIDE7CisJZW50cnktPmxvY2F0aW9uID0gKGNvbm4gPj4gMjEpICYgMHhmOworCS8qIHVudXNlZDogZW50cnktPmJ1cyA9IChjb25uID4+IDI1KSAmIDB4NzsgKi8KKwkvKiBzZXQgb3IgdG8gYmUgc2FtZSBhcyBoZWFkcyAtLSBob3BlZnVsbHkgc2FmZSBlbm91Z2ggKi8KKwllbnRyeS0+b3IgPSBlbnRyeS0+aGVhZHM7CisJZW50cnktPmR1YWxsaW5rX3Bvc3NpYmxlID0gZmFsc2U7CisKKwlzd2l0Y2ggKGVudHJ5LT50eXBlKSB7CisJY2FzZSBPVVRQVVRfQU5BTE9HOgorCQllbnRyeS0+Y3J0Y29uZi5tYXhmcmVxID0gKGNvbmYgJiAweGZmZmYpICogMTA7CisJCWJyZWFrOworCWNhc2UgT1VUUFVUX0xWRFM6CisJCS8qCisJCSAqIFRoaXMgaXMgcHJvYmFibHkgYnVyaWVkIGluIGNvbm4ncyB1bmtub3duIGJpdHMuCisJCSAqIFRoaXMgd2lsbCB1cHNldCBFRElELWZ1bCBtb2RlbHMsIGlmIHRoZXkgZXhpc3QKKwkJICovCisJCWVudHJ5LT5sdmRzY29uZi51c2Vfc3RyYXBzX2Zvcl9tb2RlID0gdHJ1ZTsKKwkJZW50cnktPmx2ZHNjb25mLnVzZV9wb3dlcl9zY3JpcHRzID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBPVVRQVVRfVE1EUzoKKwkJLyoKKwkJICogSW52ZW50IGEgRFZJLUEgb3V0cHV0LCBieSBjb3B5aW5nIHRoZSBmaWVsZHMgb2YgdGhlIERWSS1ECisJCSAqIG91dHB1dDsgcmVwb3J0ZWQgdG8gd29yayBieSBtYXRoX2Igb24gYW4gTlYyMCghKS4KKwkJICovCisJCWZhYnJpY2F0ZV92Z2Ffb3V0cHV0KGRjYiwgZW50cnktPmkyY19pbmRleCwgZW50cnktPmhlYWRzKTsKKwkJYnJlYWs7CisJY2FzZSBPVVRQVVRfVFY6CisJCWVudHJ5LT50dmNvbmYuaGFzX2NvbXBvbmVudF9vdXRwdXQgPSBmYWxzZTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIHBhcnNlX2RjYl9lbnRyeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgYmlvc19wYXJzZWRfZGNiICpiZGNiLAorCQkJICAgIHVpbnQzMl90IGNvbm4sIHVpbnQzMl90IGNvbmYpCit7CisJc3RydWN0IGRjYl9lbnRyeSAqZW50cnkgPSBuZXdfZGNiX2VudHJ5KCZiZGNiLT5kY2IpOworCWJvb2wgcmV0OworCisJaWYgKGJkY2ItPnZlcnNpb24gPj0gMHgyMCkKKwkJcmV0ID0gcGFyc2VfZGNiMjBfZW50cnkoZGV2LCBiZGNiLCBjb25uLCBjb25mLCBlbnRyeSk7CisJZWxzZQorCQlyZXQgPSBwYXJzZV9kY2IxNV9lbnRyeShkZXYsICZiZGNiLT5kY2IsIGNvbm4sIGNvbmYsIGVudHJ5KTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIHJldDsKKworCXJlYWRfZGNiX2kyY19lbnRyeShkZXYsIGJkY2ItPnZlcnNpb24sIGJkY2ItPmkyY190YWJsZSwKKwkJCSAgIGVudHJ5LT5pMmNfaW5kZXgsICZiZGNiLT5kY2IuaTJjW2VudHJ5LT5pMmNfaW5kZXhdKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMKK3ZvaWQgbWVyZ2VfbGlrZV9kY2JfZW50cmllcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgcGFyc2VkX2RjYiAqZGNiKQoreworCS8qCisJICogRENCIHYyLjAgbGlzdHMgZWFjaCBvdXRwdXQgY29tYmluYXRpb24gc2VwYXJhdGVseS4KKwkgKiBIZXJlIHdlIG1lcmdlIGNvbXBhdGlibGUgZW50cmllcyB0byBoYXZlIGZld2VyIG91dHB1dHMsIHdpdGgKKwkgKiBtb3JlIG9wdGlvbnMKKwkgKi8KKworCWludCBpLCBuZXdlbnRyaWVzID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBkY2ItPmVudHJpZXM7IGkrKykgeworCQlzdHJ1Y3QgZGNiX2VudHJ5ICppZW50ID0gJmRjYi0+ZW50cnlbaV07CisJCWludCBqOworCisJCWZvciAoaiA9IGkgKyAxOyBqIDwgZGNiLT5lbnRyaWVzOyBqKyspIHsKKwkJCXN0cnVjdCBkY2JfZW50cnkgKmplbnQgPSAmZGNiLT5lbnRyeVtqXTsKKworCQkJaWYgKGplbnQtPnR5cGUgPT0gMTAwKSAvKiBhbHJlYWR5IG1lcmdlZCBlbnRyeSAqLworCQkJCWNvbnRpbnVlOworCisJCQkvKiBtZXJnZSBoZWFkcyBmaWVsZCB3aGVuIGFsbCBvdGhlciBmaWVsZHMgdGhlIHNhbWUgKi8KKwkJCWlmIChqZW50LT5pMmNfaW5kZXggPT0gaWVudC0+aTJjX2luZGV4ICYmCisJCQkgICAgamVudC0+dHlwZSA9PSBpZW50LT50eXBlICYmCisJCQkgICAgamVudC0+bG9jYXRpb24gPT0gaWVudC0+bG9jYXRpb24gJiYKKwkJCSAgICBqZW50LT5vciA9PSBpZW50LT5vcikgeworCQkJCU5WX1RSQUNFKGRldiwgIk1lcmdpbmcgRENCIGVudHJpZXMgJWQgYW5kICVkXG4iLAorCQkJCQkgaSwgaik7CisJCQkJaWVudC0+aGVhZHMgfD0gamVudC0+aGVhZHM7CisJCQkJamVudC0+dHlwZSA9IDEwMDsgLyogZHVtbXkgdmFsdWUgKi8KKwkJCX0KKwkJfQorCX0KKworCS8qIENvbXBhY3QgZW50cmllcyBtZXJnZWQgaW50byBvdGhlcnMgb3V0IG9mIGRjYiAqLworCWZvciAoaSA9IDA7IGkgPCBkY2ItPmVudHJpZXM7IGkrKykgeworCQlpZiAoZGNiLT5lbnRyeVtpXS50eXBlID09IDEwMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChuZXdlbnRyaWVzICE9IGkpIHsKKwkJCWRjYi0+ZW50cnlbbmV3ZW50cmllc10gPSBkY2ItPmVudHJ5W2ldOworCQkJZGNiLT5lbnRyeVtuZXdlbnRyaWVzXS5pbmRleCA9IG5ld2VudHJpZXM7CisJCX0KKwkJbmV3ZW50cmllcysrOworCX0KKworCWRjYi0+ZW50cmllcyA9IG5ld2VudHJpZXM7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZGNiX3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBudmJpb3MgKmJpb3MsIGJvb2wgdHdvSGVhZHMpCit7CisJc3RydWN0IGJpb3NfcGFyc2VkX2RjYiAqYmRjYiA9ICZiaW9zLT5iZGNiOworCXN0cnVjdCBwYXJzZWRfZGNiICpkY2I7CisJdWludDE2X3QgZGNicHRyLCBpMmN0YWJwdHIgPSAwOworCXVpbnQ4X3QgKmRjYnRhYmxlOworCXVpbnQ4X3QgaGVhZGVybGVuID0gMHg0LCBlbnRyaWVzID0gRENCX01BWF9OVU1fRU5UUklFUzsKKwlib29sIGNvbmZpZ2Jsb2NrID0gdHJ1ZTsKKwlpbnQgcmVjb3JkbGVuZ3RoID0gOCwgY29uZm9mcyA9IDQ7CisJaW50IGk7CisKKwlkY2IgPSBiaW9zLT5wdWIuZGNiID0gJmJkY2ItPmRjYjsKKwlkY2ItPmVudHJpZXMgPSAwOworCisJLyogZ2V0IHRoZSBvZmZzZXQgZnJvbSAweDM2ICovCisJZGNicHRyID0gUk9NMTYoYmlvcy0+ZGF0YVsweDM2XSk7CisKKwlpZiAoZGNicHRyID09IDB4MCkgeworCQlOVl9XQVJOKGRldiwgIk5vIG91dHB1dCBkYXRhIChEQ0IpIGZvdW5kIGluIEJJT1MsICIKKwkJCSAgICAgICAiYXNzdW1pbmcgYSBDUlQgb3V0cHV0IGV4aXN0c1xuIik7CisJCS8qIHRoaXMgc2l0dWF0aW9uIGxpa2VseSBtZWFucyBhIHJlYWxseSBvbGQgY2FyZCwgcHJlIERDQiAqLworCQlmYWJyaWNhdGVfdmdhX291dHB1dChkY2IsIExFR0FDWV9JMkNfQ1JULCAxKTsKKworCQlpZiAobnYwNF90dl9pZGVudGlmeShkZXYsCisJCQkJICAgICBiaW9zLT5sZWdhY3kuaTJjX2luZGljZXMudHYpID49IDApCisJCQlmYWJyaWNhdGVfdHZfb3V0cHV0KGRjYiwgdHdvSGVhZHMpOworCisJCXJldHVybiAwOworCX0KKworCWRjYnRhYmxlID0gJmJpb3MtPmRhdGFbZGNicHRyXTsKKworCS8qIGdldCBEQ0IgdmVyc2lvbiAqLworCWJkY2ItPnZlcnNpb24gPSBkY2J0YWJsZVswXTsKKwlOVl9UUkFDRShkZXYsICJGb3VuZCBEaXNwbGF5IENvbmZpZ3VyYXRpb24gQmxvY2sgdmVyc2lvbiAlZC4lZFxuIiwKKwkJIGJkY2ItPnZlcnNpb24gPj4gNCwgYmRjYi0+dmVyc2lvbiAmIDB4Zik7CisKKwlpZiAoYmRjYi0+dmVyc2lvbiA+PSAweDIwKSB7IC8qIE5WMTcrICovCisJCXVpbnQzMl90IHNpZzsKKworCQlpZiAoYmRjYi0+dmVyc2lvbiA+PSAweDMwKSB7IC8qIE5WNDArICovCisJCQloZWFkZXJsZW4gPSBkY2J0YWJsZVsxXTsKKwkJCWVudHJpZXMgPSBkY2J0YWJsZVsyXTsKKwkJCXJlY29yZGxlbmd0aCA9IGRjYnRhYmxlWzNdOworCQkJaTJjdGFicHRyID0gUk9NMTYoZGNidGFibGVbNF0pOworCQkJc2lnID0gUk9NMzIoZGNidGFibGVbNl0pOworCQkJYmRjYi0+Z3Bpb190YWJsZV9wdHIgPSBST00xNihkY2J0YWJsZVsxMF0pOworCQkJYmRjYi0+Y29ubmVjdG9yX3RhYmxlX3B0ciA9IFJPTTE2KGRjYnRhYmxlWzIwXSk7CisJCX0gZWxzZSB7CisJCQlpMmN0YWJwdHIgPSBST00xNihkY2J0YWJsZVsyXSk7CisJCQlzaWcgPSBST00zMihkY2J0YWJsZVs0XSk7CisJCQloZWFkZXJsZW4gPSA4OworCQl9CisKKwkJaWYgKHNpZyAhPSAweDRlZGNiZGNiKSB7CisJCQlOVl9FUlJPUihkZXYsICJCYWQgRGlzcGxheSBDb25maWd1cmF0aW9uIEJsb2NrICIKKwkJCQkJInNpZ25hdHVyZSAoJTA4WClcbiIsIHNpZyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAoYmRjYi0+dmVyc2lvbiA+PSAweDE1KSB7IC8qIHNvbWUgTlYxMSBhbmQgTlYyMCAqLworCQljaGFyIHNpZ1s4XSA9IHsgMCB9OworCisJCXN0cm5jcHkoc2lnLCAoY2hhciAqKSZkY2J0YWJsZVstN10sIDcpOworCQlpMmN0YWJwdHIgPSBST00xNihkY2J0YWJsZVsyXSk7CisJCXJlY29yZGxlbmd0aCA9IDEwOworCQljb25mb2ZzID0gNjsKKworCQlpZiAoc3RyY21wKHNpZywgIkRFVl9SRUMiKSkgeworCQkJTlZfRVJST1IoZGV2LCAiQmFkIERpc3BsYXkgQ29uZmlndXJhdGlvbiBCbG9jayAiCisJCQkJCSJzaWduYXR1cmUgKCVzKVxuIiwgc2lnKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogdjEuNCAoc29tZSBOVjE1LzE2LCBOVjExKykgc2VlbXMgdGhlIHNhbWUgYXMgdjEuNSwgYnV0IGFsd2F5cworCQkgKiBoYXMgdGhlIHNhbWUgc2luZ2xlIChjcnQpIGVudHJ5LCBldmVuIHdoZW4gdHYtb3V0IHByZXNlbnQsIHNvCisJCSAqIHRoZSBjb25jbHVzaW9uIGlzIHRoaXMgdmVyc2lvbiBjYW5ub3QgcmVhbGx5IGJlIHVzZWQuCisJCSAqIHYxLjIgdGFibGVzIChzb21lIE5WNi8xMCwgYW5kIE5WMTUrKSBub3JtYWxseSBoYXZlIHRoZSBzYW1lCisJCSAqIDUgZW50cmllcywgd2hpY2ggYXJlIG5vdCBzcGVjaWZpYyB0byB0aGUgY2FyZCBhbmQgc28gbm8gdXNlLgorCQkgKiB2MS4yIGRvZXMgaGF2ZSBhbiBJMkMgdGFibGUgdGhhdCByZWFkX2RjYl9pMmNfdGFibGUgY2FuCisJCSAqIGhhbmRsZSwgYnV0IGNhcmRzIGV4aXN0IChudjExIGluICMxNDgyMSkgd2l0aCBhIGJhZCBpMmMgdGFibGUKKwkJICogcG9pbnRlciwgc28gdXNlIHRoZSBpbmRpY2VzIHBhcnNlZCBpbiBwYXJzZV9ibXBfc3RydWN0dXJlLgorCQkgKiB2MS4xIChOVjUrLCBtYXliZSBzb21lIE5WNCkgaXMgZW50aXJlbHkgdW5oZWxwZnVsCisJCSAqLworCQlOVl9UUkFDRVdBUk4oZGV2LCAiTm8gdXNlZnVsIGluZm9ybWF0aW9uIGluIEJJT1Mgb3V0cHV0IHRhYmxlOyAiCisJCQkJICAiYWRkaW5nIGFsbCBwb3NzaWJsZSBvdXRwdXRzXG4iKTsKKwkJZmFicmljYXRlX3ZnYV9vdXRwdXQoZGNiLCBMRUdBQ1lfSTJDX0NSVCwgMSk7CisKKwkJLyoKKwkJICogQXR0ZW1wdCB0byBkZXRlY3QgVFYgYmVmb3JlIERWSSBiZWNhdXNlIHRoZSB0ZXN0CisJCSAqIGZvciB0aGUgZm9ybWVyIGlzIG1vcmUgYWNjdXJhdGUgYW5kIGl0IHJ1bGVzIHRoZQorCQkgKiBsYXR0ZXIgb3V0LgorCQkgKi8KKwkJaWYgKG52MDRfdHZfaWRlbnRpZnkoZGV2LAorCQkJCSAgICAgYmlvcy0+bGVnYWN5LmkyY19pbmRpY2VzLnR2KSA+PSAwKQorCQkJZmFicmljYXRlX3R2X291dHB1dChkY2IsIHR3b0hlYWRzKTsKKworCQllbHNlIGlmIChiaW9zLT50bWRzLm91dHB1dDBfc2NyaXB0X3B0ciB8fAorCQkJIGJpb3MtPnRtZHMub3V0cHV0MV9zY3JpcHRfcHRyKQorCQkJZmFicmljYXRlX2R2aV9pX291dHB1dChkY2IsIHR3b0hlYWRzKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWkyY3RhYnB0cikKKwkJTlZfV0FSTihkZXYsICJObyBwb2ludGVyIHRvIERDQiBJMkMgcG9ydCB0YWJsZVxuIik7CisJZWxzZSB7CisJCWJkY2ItPmkyY190YWJsZSA9ICZiaW9zLT5kYXRhW2kyY3RhYnB0cl07CisJCWlmIChiZGNiLT52ZXJzaW9uID49IDB4MzApCisJCQliZGNiLT5pMmNfZGVmYXVsdF9pbmRpY2VzID0gYmRjYi0+aTJjX3RhYmxlWzRdOworCX0KKworCXBhcnNlX2RjYl9ncGlvX3RhYmxlKGJpb3MpOworCXBhcnNlX2RjYl9jb25uZWN0b3JfdGFibGUoYmlvcyk7CisKKwlpZiAoZW50cmllcyA+IERDQl9NQVhfTlVNX0VOVFJJRVMpCisJCWVudHJpZXMgPSBEQ0JfTUFYX05VTV9FTlRSSUVTOworCisJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykgeworCQl1aW50MzJfdCBjb25uZWN0aW9uLCBjb25maWcgPSAwOworCisJCWNvbm5lY3Rpb24gPSBST00zMihkY2J0YWJsZVtoZWFkZXJsZW4gKyByZWNvcmRsZW5ndGggKiBpXSk7CisJCWlmIChjb25maWdibG9jaykKKwkJCWNvbmZpZyA9IFJPTTMyKGRjYnRhYmxlW2hlYWRlcmxlbiArIGNvbmZvZnMgKyByZWNvcmRsZW5ndGggKiBpXSk7CisKKwkJLyogc2VlbiBvbiBhbiBOVjExIHdpdGggRENCIHYxLjUgKi8KKwkJaWYgKGNvbm5lY3Rpb24gPT0gMHgwMDAwMDAwMCkKKwkJCWJyZWFrOworCisJCS8qIHNlZW4gb24gYW4gTlYxNyB3aXRoIERDQiB2Mi4wICovCisJCWlmIChjb25uZWN0aW9uID09IDB4ZmZmZmZmZmYpCisJCQlicmVhazsKKworCQlpZiAoKGNvbm5lY3Rpb24gJiAweDAwMDAwMDBmKSA9PSAweDAwMDAwMDBmKQorCQkJY29udGludWU7CisKKwkJTlZfVFJBQ0VXQVJOKGRldiwgIlJhdyBEQ0IgZW50cnkgJWQ6ICUwOHggJTA4eFxuIiwKKwkJCSAgICAgZGNiLT5lbnRyaWVzLCBjb25uZWN0aW9uLCBjb25maWcpOworCisJCWlmICghcGFyc2VfZGNiX2VudHJ5KGRldiwgYmRjYiwgY29ubmVjdGlvbiwgY29uZmlnKSkKKwkJCWJyZWFrOworCX0KKworCS8qCisJICogYXBhcnQgZm9yIHYyLjErIG5vdCBiZWluZyBrbm93biBmb3IgcmVxdWlyaW5nIG1lcmdpbmcsIHRoaXMKKwkgKiBndWFyYW50ZWVzIGRjYmVudC0+aW5kZXggaXMgdGhlIGluZGV4IG9mIHRoZSBlbnRyeSBpbiB0aGUgcm9tIGltYWdlCisJICovCisJaWYgKGJkY2ItPnZlcnNpb24gPCAweDIxKQorCQltZXJnZV9saWtlX2RjYl9lbnRyaWVzKGRldiwgZGNiKTsKKworCXJldHVybiBkY2ItPmVudHJpZXMgPyAwIDogLUVOWElPOworfQorCitzdGF0aWMgdm9pZAorZml4dXBfbGVnYWN5X2Nvbm5lY3RvcihzdHJ1Y3QgbnZiaW9zICpiaW9zKQoreworCXN0cnVjdCBiaW9zX3BhcnNlZF9kY2IgKmJkY2IgPSAmYmlvcy0+YmRjYjsKKwlzdHJ1Y3QgcGFyc2VkX2RjYiAqZGNiID0gJmJkY2ItPmRjYjsKKwlpbnQgaGlnaCA9IDAsIGk7CisKKwkvKgorCSAqIERDQiAzLjAgYWxzbyBoYXMgdGhlIHRhYmxlIGluIG1vc3QgY2FzZXMsIGJ1dCB0aGVyZSBhcmUgc29tZSBjYXJkcworCSAqIHdoZXJlIHRoZSB0YWJsZSBpcyBmaWxsZWQgd2l0aCBzdHViIGVudHJpZXMsIGFuZCB0aGUgRENCIGVudHJpeQorCSAqIGluZGljZXMgYXJlIGFsbCAwLiAgV2UgZG9uJ3QgbmVlZCB0aGUgY29ubmVjdG9yIGluZGljZXMgb24gcHJlLUc4MAorCSAqIGNoaXBzICh5ZXQ/KSBzbyBsaW1pdCB0aGUgdXNlIHRvIERDQiA0LjAgYW5kIGFib3ZlLgorCSAqLworCWlmIChiZGNiLT52ZXJzaW9uID49IDB4NDApCisJCXJldHVybjsKKworCS8qCisJICogTm8ga25vd24gY29ubmVjdG9yIGluZm8gYmVmb3JlIHYzLjAsIHNvIG1ha2UgaXQgdXAuICB0aGUgcnVsZSBoZXJlCisJICogaXM6IGFueXRoaW5nIG9uIHRoZSBzYW1lIGkyYyBidXMgaXMgY29uc2lkZXJlZCB0byBiZSBvbiB0aGUgc2FtZQorCSAqIGNvbm5lY3Rvci4gIGFueSBvdXRwdXQgd2l0aG91dCBhbiBhc3NvY2lhdGVkIGkyYyBidXMgaXMgYXNzaWduZWQKKwkgKiBpdHMgb3duIHVuaXF1ZSBjb25uZWN0b3IgaW5kZXguCisJICovCisJZm9yIChpID0gMDsgaSA8IGRjYi0+ZW50cmllczsgaSsrKSB7CisJCWlmIChkY2ItPmVudHJ5W2ldLmkyY19pbmRleCA9PSAweGYpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBJZ25vcmUgdGhlIEkyQyBpbmRleCBmb3Igb24tY2hpcCBUVi1vdXQsIGFzIHRoZXJlCisJCSAqIGFyZSBjYXJkcyB3aXRoIGJvZ3VzIHZhbHVlcyAobnYzMW0gaW4gYnVnIDIzMjEyKSwKKwkJICogYW5kIGl0J3Mgb3RoZXJ3aXNlIHVzZWxlc3MuCisJCSAqLworCQlpZiAoZGNiLT5lbnRyeVtpXS50eXBlID09IE9VVFBVVF9UViAmJgorCQkgICAgZGNiLT5lbnRyeVtpXS5sb2NhdGlvbiA9PSBEQ0JfTE9DX09OX0NISVApIHsKKwkJCWRjYi0+ZW50cnlbaV0uaTJjX2luZGV4ID0gMHhmOworCQkJY29udGludWU7CisJCX0KKworCQlkY2ItPmVudHJ5W2ldLmNvbm5lY3RvciA9IGRjYi0+ZW50cnlbaV0uaTJjX2luZGV4OworCQlpZiAoZGNiLT5lbnRyeVtpXS5jb25uZWN0b3IgPiBoaWdoKQorCQkJaGlnaCA9IGRjYi0+ZW50cnlbaV0uY29ubmVjdG9yOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBkY2ItPmVudHJpZXM7IGkrKykgeworCQlpZiAoZGNiLT5lbnRyeVtpXS5pMmNfaW5kZXggIT0gMHhmKQorCQkJY29udGludWU7CisKKwkJZGNiLT5lbnRyeVtpXS5jb25uZWN0b3IgPSArK2hpZ2g7CisJfQorfQorCitzdGF0aWMgdm9pZAorZml4dXBfbGVnYWN5X2kyYyhzdHJ1Y3QgbnZiaW9zICpiaW9zKQoreworCXN0cnVjdCBwYXJzZWRfZGNiICpkY2IgPSAmYmlvcy0+YmRjYi5kY2I7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGNiLT5lbnRyaWVzOyBpKyspIHsKKwkJaWYgKGRjYi0+ZW50cnlbaV0uaTJjX2luZGV4ID09IExFR0FDWV9JMkNfQ1JUKQorCQkJZGNiLT5lbnRyeVtpXS5pMmNfaW5kZXggPSBiaW9zLT5sZWdhY3kuaTJjX2luZGljZXMuY3J0OworCQlpZiAoZGNiLT5lbnRyeVtpXS5pMmNfaW5kZXggPT0gTEVHQUNZX0kyQ19QQU5FTCkKKwkJCWRjYi0+ZW50cnlbaV0uaTJjX2luZGV4ID0gYmlvcy0+bGVnYWN5LmkyY19pbmRpY2VzLnBhbmVsOworCQlpZiAoZGNiLT5lbnRyeVtpXS5pMmNfaW5kZXggPT0gTEVHQUNZX0kyQ19UVikKKwkJCWRjYi0+ZW50cnlbaV0uaTJjX2luZGV4ID0gYmlvcy0+bGVnYWN5LmkyY19pbmRpY2VzLnR2OworCX0KK30KKworc3RhdGljIGludCBsb2FkX252MTdfaHdzcV91Y29kZV9lbnRyeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBod3NxX29mZnNldCwgaW50IGVudHJ5KQoreworCS8qCisJICogVGhlIGhlYWRlciBmb2xsb3dpbmcgdGhlICJIV1NRIiBzaWduYXR1cmUgaGFzIHRoZSBudW1iZXIgb2YgZW50cmllcywKKwkgKiBhbmQgdGhlIGVudHJ5IHNpemUKKwkgKgorCSAqIEFuIGVudHJ5IGNvbnNpc3RzIG9mIGEgZHdvcmQgdG8gd3JpdGUgdG8gdGhlIHNlcXVlbmNlciBjb250cm9sIHJlZworCSAqICgweDAwMDAxMzA0KSwgZm9sbG93ZWQgYnkgdGhlIHVjb2RlIGJ5dGVzLCB3cml0dGVuIHNlcXVlbnRpYWxseSwKKwkgKiBzdGFydGluZyBhdCByZWcgMHgwMDAwMTQwMAorCSAqLworCisJdWludDhfdCBieXRlc190b193cml0ZTsKKwl1aW50MTZfdCBod3NxX2VudHJ5X29mZnNldDsKKwlpbnQgaTsKKworCWlmIChiaW9zLT5kYXRhW2h3c3Ffb2Zmc2V0XSA8PSBlbnRyeSkgeworCQlOVl9FUlJPUihkZXYsICJUb28gZmV3IGVudHJpZXMgaW4gSFcgc2VxdWVuY2VyIHRhYmxlIGZvciAiCisJCQkJInJlcXVlc3RlZCBlbnRyeVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWJ5dGVzX3RvX3dyaXRlID0gYmlvcy0+ZGF0YVtod3NxX29mZnNldCArIDFdOworCisJaWYgKGJ5dGVzX3RvX3dyaXRlICE9IDM2KSB7CisJCU5WX0VSUk9SKGRldiwgIlVua25vd24gSFcgc2VxdWVuY2VyIGVudHJ5IHNpemVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlOVl9UUkFDRShkZXYsICJMb2FkaW5nIE5WMTcgcG93ZXIgc2VxdWVuY2luZyBtaWNyb2NvZGVcbiIpOworCisJaHdzcV9lbnRyeV9vZmZzZXQgPSBod3NxX29mZnNldCArIDIgKyBlbnRyeSAqIGJ5dGVzX3RvX3dyaXRlOworCisJLyogc2V0IHNlcXVlbmNlciBjb250cm9sICovCisJYmlvc193cjMyKGJpb3MsIDB4MDAwMDEzMDQsIFJPTTMyKGJpb3MtPmRhdGFbaHdzcV9lbnRyeV9vZmZzZXRdKSk7CisJYnl0ZXNfdG9fd3JpdGUgLT0gNDsKKworCS8qIHdyaXRlIHVjb2RlICovCisJZm9yIChpID0gMDsgaSA8IGJ5dGVzX3RvX3dyaXRlOyBpICs9IDQpCisJCWJpb3Nfd3IzMihiaW9zLCAweDAwMDAxNDAwICsgaSwgUk9NMzIoYmlvcy0+ZGF0YVtod3NxX2VudHJ5X29mZnNldCArIGkgKyA0XSkpOworCisJLyogdHdpZGRsZSBOVl9QQlVTX0RFQlVHXzQgKi8KKwliaW9zX3dyMzIoYmlvcywgTlZfUEJVU19ERUJVR180LCBiaW9zX3JkMzIoYmlvcywgTlZfUEJVU19ERUJVR180KSB8IDB4MTgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbG9hZF9udjE3X2h3X3NlcXVlbmNlcl91Y29kZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgbnZiaW9zICpiaW9zKQoreworCS8qCisJICogQk1QIGJhc2VkIGNhcmRzLCBmcm9tIE5WMTcsIG5lZWQgYSBtaWNyb2NvZGUgbG9hZGluZyB0byBjb3JyZWN0bHkKKwkgKiBjb250cm9sIHRoZSBHUElPIGV0YyBmb3IgTFZEUyBwYW5lbHMKKwkgKgorCSAqIEJJVCBiYXNlZCBjYXJkcyBzZWVtIHRvIGRvIHRoaXMgZGlyZWN0bHkgaW4gdGhlIGluaXQgc2NyaXB0cworCSAqCisJICogVGhlIG1pY3JvY29kZSBlbnRyaWVzIGFyZSBmb3VuZCBieSB0aGUgIkhXU1EiIHNpZ25hdHVyZS4KKwkgKi8KKworCWNvbnN0IHVpbnQ4X3QgaHdzcV9zaWduYXR1cmVbXSA9IHsgJ0gnLCAnVycsICdTJywgJ1EnIH07CisJY29uc3QgaW50IHN6ID0gc2l6ZW9mKGh3c3Ffc2lnbmF0dXJlKTsKKwlpbnQgaHdzcV9vZmZzZXQ7CisKKwlod3NxX29mZnNldCA9IGZpbmRzdHIoYmlvcy0+ZGF0YSwgYmlvcy0+bGVuZ3RoLCBod3NxX3NpZ25hdHVyZSwgc3opOworCWlmICghaHdzcV9vZmZzZXQpCisJCXJldHVybiAwOworCisJLyogYWx3YXlzIHVzZSBlbnRyeSAwPyAqLworCXJldHVybiBsb2FkX252MTdfaHdzcV91Y29kZV9lbnRyeShkZXYsIGJpb3MsIGh3c3Ffb2Zmc2V0ICsgc3osIDApOworfQorCit1aW50OF90ICpub3V2ZWF1X2Jpb3NfZW1iZWRkZWRfZWRpZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+VkJJT1M7CisJY29uc3QgdWludDhfdCBlZGlkX3NpZ1tdID0geworCQkJMHgwMCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMCB9OworCXVpbnQxNl90IG9mZnNldCA9IDA7CisJdWludDE2X3QgbmV3b2Zmc2V0OworCWludCBzZWFyY2hsZW4gPSBOVl9QUk9NX1NJWkU7CisKKwlpZiAoYmlvcy0+ZnAuZWRpZCkKKwkJcmV0dXJuIGJpb3MtPmZwLmVkaWQ7CisKKwl3aGlsZSAoc2VhcmNobGVuKSB7CisJCW5ld29mZnNldCA9IGZpbmRzdHIoJmJpb3MtPmRhdGFbb2Zmc2V0XSwgc2VhcmNobGVuLAorCQkJCQkJCQllZGlkX3NpZywgOCk7CisJCWlmICghbmV3b2Zmc2V0KQorCQkJcmV0dXJuIE5VTEw7CisJCW9mZnNldCArPSBuZXdvZmZzZXQ7CisJCWlmICghbnZfY2tzdW0oJmJpb3MtPmRhdGFbb2Zmc2V0XSwgRURJRDFfTEVOKSkKKwkJCWJyZWFrOworCisJCXNlYXJjaGxlbiAtPSBvZmZzZXQ7CisJCW9mZnNldCsrOworCX0KKworCU5WX1RSQUNFKGRldiwgIkZvdW5kIEVESUQgaW4gQklPU1xuIik7CisKKwlyZXR1cm4gYmlvcy0+ZnAuZWRpZCA9ICZiaW9zLT5kYXRhW29mZnNldF07Cit9CisKK3ZvaWQKK25vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MTZfdCB0YWJsZSwKKwkJCSAgICBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZiaW9zICpiaW9zID0gJmRldl9wcml2LT5WQklPUzsKKwlzdHJ1Y3QgaW5pdF9leGVjIGlleGVjID0geyB0cnVlLCBmYWxzZSB9OworCisJYmlvcy0+ZGlzcGxheS5vdXRwdXQgPSBkY2JlbnQ7CisJcGFyc2VfaW5pdF90YWJsZShiaW9zLCB0YWJsZSwgJmlleGVjKTsKKwliaW9zLT5kaXNwbGF5Lm91dHB1dCA9IE5VTEw7Cit9CisKK3N0YXRpYyBib29sIE5WSW5pdFZCSU9TKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZiaW9zICpiaW9zID0gJmRldl9wcml2LT5WQklPUzsKKworCW1lbXNldChiaW9zLCAwLCBzaXplb2Yoc3RydWN0IG52YmlvcykpOworCWJpb3MtPmRldiA9IGRldjsKKworCWlmICghTlZTaGFkb3dWQklPUyhkZXYsIGJpb3MtPmRhdGEpKQorCQlyZXR1cm4gZmFsc2U7CisKKwliaW9zLT5sZW5ndGggPSBOVl9QUk9NX1NJWkU7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgbm91dmVhdV9wYXJzZV92Ymlvc19zdHJ1Y3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPlZCSU9TOworCWNvbnN0IHVpbnQ4X3QgYml0X3NpZ25hdHVyZVtdID0geyAweGZmLCAweGI4LCAnQicsICdJJywgJ1QnIH07CisJY29uc3QgdWludDhfdCBibXBfc2lnbmF0dXJlW10gPSB7IDB4ZmYsIDB4N2YsICdOJywgJ1YnLCAweDAgfTsKKwlpbnQgb2Zmc2V0OworCisJb2Zmc2V0ID0gZmluZHN0cihiaW9zLT5kYXRhLCBiaW9zLT5sZW5ndGgsCisJCQkJCWJpdF9zaWduYXR1cmUsIHNpemVvZihiaXRfc2lnbmF0dXJlKSk7CisJaWYgKG9mZnNldCkgeworCQlOVl9UUkFDRShkZXYsICJCSVQgQklPUyBmb3VuZFxuIik7CisJCXJldHVybiBwYXJzZV9iaXRfc3RydWN0dXJlKGJpb3MsIG9mZnNldCArIDYpOworCX0KKworCW9mZnNldCA9IGZpbmRzdHIoYmlvcy0+ZGF0YSwgYmlvcy0+bGVuZ3RoLAorCQkJCQlibXBfc2lnbmF0dXJlLCBzaXplb2YoYm1wX3NpZ25hdHVyZSkpOworCWlmIChvZmZzZXQpIHsKKwkJTlZfVFJBQ0UoZGV2LCAiQk1QIEJJT1MgZm91bmRcbiIpOworCQlyZXR1cm4gcGFyc2VfYm1wX3N0cnVjdHVyZShkZXYsIGJpb3MsIG9mZnNldCk7CisJfQorCisJTlZfRVJST1IoZGV2LCAiTm8ga25vd24gQklPUyBzaWduYXR1cmUgZm91bmRcbiIpOworCXJldHVybiAtRU5PREVWOworfQorCitpbnQKK25vdXZlYXVfcnVuX3ZiaW9zX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPlZCSU9TOworCWludCBpLCByZXQgPSAwOworCisJTlZMb2NrVmdhQ3J0Y3MoZGV2LCBmYWxzZSk7CisJaWYgKG52X3R3b19oZWFkcyhkZXYpKQorCQlOVlNldE93bmVyKGRldiwgYmlvcy0+c3RhdGUuY3J0Y2hlYWQpOworCisJaWYgKGJpb3MtPm1ham9yX3ZlcnNpb24gPCA1KQkvKiBCTVAgb25seSAqLworCQlsb2FkX252MTdfaHdfc2VxdWVuY2VyX3Vjb2RlKGRldiwgYmlvcyk7CisKKwlpZiAoYmlvcy0+ZXhlY3V0ZSkgeworCQliaW9zLT5mcC5sYXN0X3NjcmlwdF9pbnZvYyA9IDA7CisJCWJpb3MtPmZwLmx2ZHNfaW5pdF9ydW4gPSBmYWxzZTsKKwl9CisKKwlwYXJzZV9pbml0X3RhYmxlcyhiaW9zKTsKKworCS8qCisJICogUnVucyBzb21lIGFkZGl0aW9uYWwgc2NyaXB0IHNlZW4gb24gRzh4IFZCSU9TZW4uICBUaGUgVkJJT1MnCisJICogcGFyc2VyIHdpbGwgcnVuIHRoaXMgcmlnaHQgYWZ0ZXIgdGhlIGluaXQgdGFibGVzLCB0aGUgYmluYXJ5CisJICogZHJpdmVyIGFwcGVhcnMgdG8gcnVuIGl0IGF0IHNvbWUgcG9pbnQgbGF0ZXIuCisJICovCisJaWYgKGJpb3MtPnNvbWVfc2NyaXB0X3B0cikgeworCQlzdHJ1Y3QgaW5pdF9leGVjIGlleGVjID0ge3RydWUsIGZhbHNlfTsKKworCQlOVl9JTkZPKGRldiwgIlBhcnNpbmcgVkJJT1MgaW5pdCB0YWJsZSBhdCBvZmZzZXQgMHglMDRYXG4iLAorCQkJYmlvcy0+c29tZV9zY3JpcHRfcHRyKTsKKwkJcGFyc2VfaW5pdF90YWJsZShiaW9zLCBiaW9zLT5zb21lX3NjcmlwdF9wdHIsICZpZXhlYyk7CisJfQorCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKKwkJZm9yIChpID0gMDsgaSA8IGJpb3MtPmJkY2IuZGNiLmVudHJpZXM7IGkrKykgeworCQkJbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKGRldiwKKwkJCQkJCSAgICAgICAmYmlvcy0+YmRjYi5kY2IuZW50cnlbaV0sCisJCQkJCQkgICAgICAgMCwgMCk7CisJCX0KKwl9CisKKwlOVkxvY2tWZ2FDcnRjcyhkZXYsIHRydWUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfYmlvc19pMmNfZGV2aWNlc190YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+VkJJT1M7CisJc3RydWN0IGRjYl9pMmNfZW50cnkgKmVudHJ5OworCWludCBpOworCisJZW50cnkgPSAmYmlvcy0+YmRjYi5kY2IuaTJjWzBdOworCWZvciAoaSA9IDA7IGkgPCBEQ0JfTUFYX05VTV9JMkNfRU5UUklFUzsgaSsrLCBlbnRyeSsrKQorCQlub3V2ZWF1X2kyY19maW5pKGRldiwgZW50cnkpOworfQorCitpbnQKK25vdXZlYXVfYmlvc19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZiaW9zICpiaW9zID0gJmRldl9wcml2LT5WQklPUzsKKwl1aW50MzJfdCBzYXZlZF9udl9wZXh0ZGV2X2Jvb3RfMDsKKwlib29sIHdhc19sb2NrZWQ7CisJaW50IHJldDsKKworCWRldl9wcml2LT52YmlvcyA9ICZiaW9zLT5wdWI7CisKKwlpZiAoIU5WSW5pdFZCSU9TKGRldikpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gbm91dmVhdV9wYXJzZV92Ymlvc19zdHJ1Y3QoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcGFyc2VfZGNiX3RhYmxlKGRldiwgYmlvcywgbnZfdHdvX2hlYWRzKGRldikpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmaXh1cF9sZWdhY3lfaTJjKGJpb3MpOworCWZpeHVwX2xlZ2FjeV9jb25uZWN0b3IoYmlvcyk7CisKKwlpZiAoIWJpb3MtPm1ham9yX3ZlcnNpb24pCS8qIHdlIGRvbid0IHJ1biB2ZXJzaW9uIDAgYmlvcyAqLworCQlyZXR1cm4gMDsKKworCS8qIHRoZXNlIHdpbGwgbmVlZCByZW1lbWJlcmluZyBhY3Jvc3MgYSBzdXNwZW5kICovCisJc2F2ZWRfbnZfcGV4dGRldl9ib290XzAgPSBiaW9zX3JkMzIoYmlvcywgTlZfUEVYVERFVl9CT09UXzApOworCWJpb3MtPnN0YXRlLnNhdmVkX252X3BmYl9jZmcwID0gYmlvc19yZDMyKGJpb3MsIE5WX1BGQl9DRkcwKTsKKworCS8qIGluaXQgc2NyaXB0IGV4ZWN1dGlvbiBkaXNhYmxlZCAqLworCWJpb3MtPmV4ZWN1dGUgPSBmYWxzZTsKKworCS8qIC4uLiB1bmxlc3MgY2FyZCBpc24ndCBQT1NUZWQgYWxyZWFkeSAqLworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzEwICYmCisJICAgIE5WUmVhZFZnYUNydGMoZGV2LCAwLCAweDAwKSA9PSAwICYmCisJICAgIE5WUmVhZFZnYUNydGMoZGV2LCAwLCAweDFhKSA9PSAwKSB7CisJCU5WX0lORk8oZGV2LCAiQWRhcHRvciBub3QgaW5pdGlhbGlzZWRcbiIpOworCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7CisJCQlOVl9FUlJPUihkZXYsICJVbmFibGUgdG8gUE9TVCB0aGlzIGNoaXBzZXRcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlOVl9JTkZPKGRldiwgIlJ1bm5pbmcgVkJJT1MgaW5pdCB0YWJsZXNcbiIpOworCQliaW9zLT5leGVjdXRlID0gdHJ1ZTsKKwl9CisKKwliaW9zX3dyMzIoYmlvcywgTlZfUEVYVERFVl9CT09UXzAsIHNhdmVkX252X3BleHRkZXZfYm9vdF8wKTsKKworCXJldCA9IG5vdXZlYXVfcnVuX3ZiaW9zX2luaXQoZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9wcml2LT52YmlvcyA9IE5VTEw7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogZmVhdHVyZV9ieXRlIG9uIEJNUCBpcyBwb29yLCBidXQgaW5pdCBhbHdheXMgc2V0cyBDUjRCICovCisJd2FzX2xvY2tlZCA9IE5WTG9ja1ZnYUNydGNzKGRldiwgZmFsc2UpOworCWlmIChiaW9zLT5tYWpvcl92ZXJzaW9uIDwgNSkKKwkJYmlvcy0+aXNfbW9iaWxlID0gTlZSZWFkVmdhQ3J0YyhkZXYsIDAsIE5WX0NJT19DUkVfNEIpICYgMHg0MDsKKworCS8qIGFsbCBCSVQgc3lzdGVtcyBuZWVkIHBfZl9tX3QgZm9yIGRpZ2l0YWxfbWluX2Zyb250X3BvcmNoICovCisJaWYgKGJpb3MtPmlzX21vYmlsZSB8fCBiaW9zLT5tYWpvcl92ZXJzaW9uID49IDUpCisJCXJldCA9IHBhcnNlX2ZwX21vZGVfdGFibGUoZGV2LCBiaW9zKTsKKwlOVkxvY2tWZ2FDcnRjcyhkZXYsIHdhc19sb2NrZWQpOworCisJLyogYWxsb3cgc3Vic2VxdWVudCBzY3JpcHRzIHRvIGV4ZWN1dGUgKi8KKwliaW9zLT5leGVjdXRlID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCit2b2lkCitub3V2ZWF1X2Jpb3NfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlub3V2ZWF1X2Jpb3NfaTJjX2RldmljZXNfdGFrZWRvd24oZGV2KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmlvcy5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ1ZjEwYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmlvcy5oCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBOb3V2ZWF1IFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX05PVVZFQVVfQklPU19IX18KKyNkZWZpbmUgX19OT1VWRUFVX0JJT1NfSF9fCisKKyNpbmNsdWRlICJudnJlZy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfaTJjLmgiCisKKyNkZWZpbmUgRENCX01BWF9OVU1fRU5UUklFUyAxNgorI2RlZmluZSBEQ0JfTUFYX05VTV9JMkNfRU5UUklFUyAxNgorI2RlZmluZSBEQ0JfTUFYX05VTV9HUElPX0VOVFJJRVMgMzIKKyNkZWZpbmUgRENCX01BWF9OVU1fQ09OTkVDVE9SX0VOVFJJRVMgMTYKKworI2RlZmluZSBEQ0JfTE9DX09OX0NISVAgMAorCitzdHJ1Y3QgZGNiX2VudHJ5IHsKKwlpbnQgaW5kZXg7CS8qIG1heSBub3QgYmUgcmF3IGRjYiBpbmRleCBpZiBtZXJnaW5nIGhhcyBoYXBwZW5lZCAqLworCXVpbnQ4X3QgdHlwZTsKKwl1aW50OF90IGkyY19pbmRleDsKKwl1aW50OF90IGhlYWRzOworCXVpbnQ4X3QgY29ubmVjdG9yOworCXVpbnQ4X3QgYnVzOworCXVpbnQ4X3QgbG9jYXRpb247CisJdWludDhfdCBvcjsKKwlib29sIGR1YWxsaW5rX3Bvc3NpYmxlOworCXVuaW9uIHsKKwkJc3RydWN0IHNvcl9jb25mIHsKKwkJCWludCBsaW5rOworCQl9IHNvcmNvbmY7CisJCXN0cnVjdCB7CisJCQlpbnQgbWF4ZnJlcTsKKwkJfSBjcnRjb25mOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHNvcl9jb25mIHNvcjsKKwkJCWJvb2wgdXNlX3N0cmFwc19mb3JfbW9kZTsKKwkJCWJvb2wgdXNlX3Bvd2VyX3NjcmlwdHM7CisJCX0gbHZkc2NvbmY7CisJCXN0cnVjdCB7CisJCQlib29sIGhhc19jb21wb25lbnRfb3V0cHV0OworCQl9IHR2Y29uZjsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBzb3JfY29uZiBzb3I7CisJCQlpbnQgbGlua19ucjsKKwkJCWludCBsaW5rX2J3OworCQl9IGRwY29uZjsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBzb3JfY29uZiBzb3I7CisJCX0gdG1kc2NvbmY7CisJfTsKKwlib29sIGkyY191cHBlcl9kZWZhdWx0OworfTsKKworc3RydWN0IGRjYl9pMmNfZW50cnkgeworCXVpbnQ4X3QgcG9ydF90eXBlOworCXVpbnQ4X3QgcmVhZCwgd3JpdGU7CisJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmNoYW47Cit9OworCitzdHJ1Y3QgcGFyc2VkX2RjYiB7CisJaW50IGVudHJpZXM7CisJc3RydWN0IGRjYl9lbnRyeSBlbnRyeVtEQ0JfTUFYX05VTV9FTlRSSUVTXTsKKwlzdHJ1Y3QgZGNiX2kyY19lbnRyeSBpMmNbRENCX01BWF9OVU1fSTJDX0VOVFJJRVNdOworfTsKKworZW51bSBkY2JfZ3Bpb190YWcgeworCURDQl9HUElPX1RWREFDMCA9IDB4YywKKwlEQ0JfR1BJT19UVkRBQzEgPSAweDJkLAorfTsKKworc3RydWN0IGRjYl9ncGlvX2VudHJ5IHsKKwllbnVtIGRjYl9ncGlvX3RhZyB0YWc7CisJaW50IGxpbmU7CisJYm9vbCBpbnZlcnQ7Cit9OworCitzdHJ1Y3QgcGFyc2VkX2RjYl9ncGlvIHsKKwlpbnQgZW50cmllczsKKwlzdHJ1Y3QgZGNiX2dwaW9fZW50cnkgZW50cnlbRENCX01BWF9OVU1fR1BJT19FTlRSSUVTXTsKK307CisKK3N0cnVjdCBkY2JfY29ubmVjdG9yX3RhYmxlX2VudHJ5IHsKKwl1aW50MzJfdCBlbnRyeTsKKwl1aW50OF90IHR5cGU7CisJdWludDhfdCBpbmRleDsKKwl1aW50OF90IGdwaW9fdGFnOworfTsKKworc3RydWN0IGRjYl9jb25uZWN0b3JfdGFibGUgeworCWludCBlbnRyaWVzOworCXN0cnVjdCBkY2JfY29ubmVjdG9yX3RhYmxlX2VudHJ5IGVudHJ5W0RDQl9NQVhfTlVNX0NPTk5FQ1RPUl9FTlRSSUVTXTsKK307CisKK3N0cnVjdCBiaW9zX3BhcnNlZF9kY2IgeworCXVpbnQ4X3QgdmVyc2lvbjsKKworCXN0cnVjdCBwYXJzZWRfZGNiIGRjYjsKKworCXVpbnQ4X3QgKmkyY190YWJsZTsKKwl1aW50OF90IGkyY19kZWZhdWx0X2luZGljZXM7CisKKwl1aW50MTZfdCBncGlvX3RhYmxlX3B0cjsKKwlzdHJ1Y3QgcGFyc2VkX2RjYl9ncGlvIGdwaW87CisJdWludDE2X3QgY29ubmVjdG9yX3RhYmxlX3B0cjsKKwlzdHJ1Y3QgZGNiX2Nvbm5lY3Rvcl90YWJsZSBjb25uZWN0b3I7Cit9OworCitlbnVtIG5vdXZlYXVfZW5jb2Rlcl90eXBlIHsKKwlPVVRQVVRfQU5BTE9HID0gMCwKKwlPVVRQVVRfVFYgPSAxLAorCU9VVFBVVF9UTURTID0gMiwKKwlPVVRQVVRfTFZEUyA9IDMsCisJT1VUUFVUX0RQID0gNiwKKwlPVVRQVVRfQU5ZID0gLTEKK307CisKK2VudW0gbm91dmVhdV9vciB7CisJT1VUUFVUX0EgPSAoMSA8PCAwKSwKKwlPVVRQVVRfQiA9ICgxIDw8IDEpLAorCU9VVFBVVF9DID0gKDEgPDwgMikKK307CisKK2VudW0gTFZEU19zY3JpcHQgeworCS8qIE9yZGVyICpkb2VzKiBtYXR0ZXIgaGVyZSAqLworCUxWRFNfSU5JVCA9IDEsCisJTFZEU19SRVNFVCwKKwlMVkRTX0JBQ0tMSUdIVF9PTiwKKwlMVkRTX0JBQ0tMSUdIVF9PRkYsCisJTFZEU19QQU5FTF9PTiwKKwlMVkRTX1BBTkVMX09GRgorfTsKKworLyogY2hhbmdpbmcgdGhlc2UgcmVxdWlyZXMgbWF0Y2hpbmcgY2hhbmdlcyB0byByZWcgdGFibGVzIGluIG52X2dldF9jbG9jayAqLworI2RlZmluZSBNQVhfUExMX1RZUEVTCTQKK2VudW0gcGxsX3R5cGVzIHsKKwlOVlBMTCwKKwlNUExMLAorCVZQTEwxLAorCVZQTEwyCit9OworCitzdHJ1Y3QgcGxsX2xpbXMgeworCXN0cnVjdCB7CisJCWludCBtaW5mcmVxOworCQlpbnQgbWF4ZnJlcTsKKwkJaW50IG1pbl9pbnB1dGZyZXE7CisJCWludCBtYXhfaW5wdXRmcmVxOworCisJCXVpbnQ4X3QgbWluX207CisJCXVpbnQ4X3QgbWF4X207CisJCXVpbnQ4X3QgbWluX247CisJCXVpbnQ4X3QgbWF4X247CisJfSB2Y28xLCB2Y28yOworCisJdWludDhfdCBtYXhfbG9nMnA7CisJLyoKKwkgKiBmb3IgbW9zdCBwcmUgbnY1MCBjYXJkcyBzZXR0aW5nIGEgbG9nMlAgb2YgNyAodGhlIGNvbW1vbiBtYXhfbG9nMnAKKwkgKiB2YWx1ZSkgaXMgbm8gZGlmZmVyZW50IHRvIDYgKGF0IGxlYXN0IGZvciB2cGxscykgc28gYWxsb3dpbmcgdGhlIE1OUAorCSAqIGNhbGMgdG8gdXNlIDcgY2F1c2VzIHRoZSBnZW5lcmF0ZWQgY2xvY2sgdG8gYmUgb3V0IGJ5IGEgZmFjdG9yIG9mIDIuCisJICogaG93ZXZlciwgbWF4X2xvZzJwIGNhbm5vdCBiZSBmaXhlZC11cCBkdXJpbmcgcGFyc2luZyBhcyB0aGUKKwkgKiB1bm1vZGlmaWVkIG1heF9sb2cycCB2YWx1ZSBpcyBzdGlsbCBuZWVkZWQgZm9yIHNldHRpbmcgbXBsbHMsIGhlbmNlCisJICogYW4gYWRkaXRpb25hbCBtYXhfdXNhYmxlX2xvZzJwIG1lbWJlcgorCSAqLworCXVpbnQ4X3QgbWF4X3VzYWJsZV9sb2cycDsKKwl1aW50OF90IGxvZzJwX2JpYXM7CisKKwl1aW50OF90IG1pbl9wOworCXVpbnQ4X3QgbWF4X3A7CisKKwlpbnQgcmVmY2xrOworfTsKKworc3RydWN0IG5vdXZlYXVfYmlvc19pbmZvIHsKKwlzdHJ1Y3QgcGFyc2VkX2RjYiAqZGNiOworCisJdWludDhfdCBjaGlwX3ZlcnNpb247CisKKwl1aW50MzJfdCBkYWN0ZXN0dmFsOworCXVpbnQzMl90IHR2ZGFjdGVzdHZhbDsKKwl1aW50OF90IGRpZ2l0YWxfbWluX2Zyb250X3BvcmNoOworCWJvb2wgZnBfbm9fZGRjOworfTsKKworc3RydWN0IG52YmlvcyB7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9iaW9zX2luZm8gcHViOworCisJdWludDhfdCBkYXRhW05WX1BST01fU0laRV07CisJdW5zaWduZWQgaW50IGxlbmd0aDsKKwlib29sIGV4ZWN1dGU7CisKKwl1aW50OF90IG1ham9yX3ZlcnNpb247CisJdWludDhfdCBmZWF0dXJlX2J5dGU7CisJYm9vbCBpc19tb2JpbGU7CisKKwl1aW50MzJfdCBmbWF4dmNvLCBmbWludmNvOworCisJYm9vbCBvbGRfc3R5bGVfaW5pdDsKKwl1aW50MTZfdCBpbml0X3NjcmlwdF90YmxzX3B0cjsKKwl1aW50MTZfdCBleHRyYV9pbml0X3NjcmlwdF90YmxfcHRyOworCXVpbnQxNl90IG1hY3JvX2luZGV4X3RibF9wdHI7CisJdWludDE2X3QgbWFjcm9fdGJsX3B0cjsKKwl1aW50MTZfdCBjb25kaXRpb25fdGJsX3B0cjsKKwl1aW50MTZfdCBpb19jb25kaXRpb25fdGJsX3B0cjsKKwl1aW50MTZfdCBpb19mbGFnX2NvbmRpdGlvbl90YmxfcHRyOworCXVpbnQxNl90IGluaXRfZnVuY3Rpb25fdGJsX3B0cjsKKworCXVpbnQxNl90IHBsbF9saW1pdF90YmxfcHRyOworCXVpbnQxNl90IHJhbV9yZXN0cmljdF90YmxfcHRyOworCisJdWludDE2X3Qgc29tZV9zY3JpcHRfcHRyOyAvKiBCSVQgSSArIDE0ICovCisJdWludDE2X3QgaW5pdDk2X3RibF9wdHI7IC8qIEJJVCBJICsgMTYgKi8KKworCXN0cnVjdCBiaW9zX3BhcnNlZF9kY2IgYmRjYjsKKworCXN0cnVjdCB7CisJCWludCBjcnRjaGVhZDsKKwkJLyogdGhlc2UgbmVlZCByZW1lbWJlcmluZyBhY3Jvc3Mgc3VzcGVuZCAqLworCQl1aW50MzJfdCBzYXZlZF9udl9wZmJfY2ZnMDsKKwl9IHN0YXRlOworCisJc3RydWN0IHsKKwkJc3RydWN0IGRjYl9lbnRyeSAqb3V0cHV0OworCQl1aW50MTZfdCBzY3JpcHRfdGFibGVfcHRyOworCQl1aW50MTZfdCBkcF90YWJsZV9wdHI7CisJfSBkaXNwbGF5OworCisJc3RydWN0IHsKKwkJdWludDE2X3QgZnB0YWJsZXBvaW50ZXI7CS8qIGFsc28gdXNlZCBieSB0bWRzICovCisJCXVpbnQxNl90IGZweGxhdGV0YWJsZXB0cjsKKwkJaW50IHhsYXR3aWR0aDsKKwkJdWludDE2X3QgbHZkc21hbnVmYWN0dXJlcnBvaW50ZXI7CisJCXVpbnQxNl90IGZweGxhdGVtYW51ZmFjdHVyZXJ0YWJsZXB0cjsKKwkJdWludDE2X3QgbW9kZV9wdHI7CisJCXVpbnQxNl90IHhsYXRlZF9lbnRyeTsKKwkJYm9vbCBwb3dlcl9vZmZfZm9yX3Jlc2V0OworCQlib29sIHJlc2V0X2FmdGVyX3BjbGtfY2hhbmdlOworCQlib29sIGR1YWxfbGluazsKKwkJYm9vbCBsaW5rX2NfaW5jcmVtZW50OworCQlib29sIEJJVGJpdDE7CisJCWJvb2wgaWZfaXNfMjRiaXQ7CisJCWludCBkdWFsbGlua190cmFuc2l0aW9uX2NsazsKKwkJdWludDhfdCBzdHJhcGxlc3NfaXNfMjRiaXQ7CisJCXVpbnQ4X3QgKmVkaWQ7CisKKwkJLyogd2lsbCBuZWVkIHJlc2V0dGluZyBhZnRlciBzdXNwZW5kICovCisJCWludCBsYXN0X3NjcmlwdF9pbnZvYzsKKwkJYm9vbCBsdmRzX2luaXRfcnVuOworCX0gZnA7CisKKwlzdHJ1Y3QgeworCQl1aW50MTZfdCBvdXRwdXQwX3NjcmlwdF9wdHI7CisJCXVpbnQxNl90IG91dHB1dDFfc2NyaXB0X3B0cjsKKwl9IHRtZHM7CisKKwlzdHJ1Y3QgeworCQl1aW50MTZfdCBtZW1faW5pdF90YmxfcHRyOworCQl1aW50MTZfdCBzZHJfc2VxX3RibF9wdHI7CisJCXVpbnQxNl90IGRkcl9zZXFfdGJsX3B0cjsKKworCQlzdHJ1Y3QgeworCQkJdWludDhfdCBjcnQsIHR2LCBwYW5lbDsKKwkJfSBpMmNfaW5kaWNlczsKKworCQl1aW50MTZfdCBsdmRzX3NpbmdsZV9hX3NjcmlwdF9wdHI7CisJfSBsZWdhY3k7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYm8uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjBhMTRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iby5jCkBAIC0wLDAgKzEsNjcxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDcgRGF2ZSBBaXJsaWVkCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisvKgorICogQXV0aG9yczogRGF2ZSBBaXJsaWVkIDxhaXJsaWVkQGxpbnV4LmllPgorICoJICAgIEJlbiBTa2VnZ3MgICA8ZGFya3RhbWFAaWluZXQubmV0LmF1PgorICoJICAgIEplcmVteSBLb2xiICA8amtvbGJAYnJhbmRlaXMuZWR1PgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisKKyNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kbWEuaCIKKworc3RhdGljIHZvaWQKK25vdXZlYXVfYm9fZGVsX3R0bShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IG5vdXZlYXVfYmRldihiby0+YmRldik7CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8gPSBub3V2ZWF1X2JvKGJvKTsKKworCXR0bV9ib19rdW5tYXAoJm52Ym8tPmttYXApOworCisJaWYgKHVubGlrZWx5KG52Ym8tPmdlbSkpCisJCURSTV9FUlJPUigiYm8gJXAgc3RpbGwgYXR0YWNoZWQgdG8gR0VNIG9iamVjdFxuIiwgYm8pOworCisJc3Bpbl9sb2NrKCZkZXZfcHJpdi0+dHRtLmJvX2xpc3RfbG9jayk7CisJbGlzdF9kZWwoJm52Ym8tPmhlYWQpOworCXNwaW5fdW5sb2NrKCZkZXZfcHJpdi0+dHRtLmJvX2xpc3RfbG9jayk7CisJa2ZyZWUobnZibyk7Cit9CisKK2ludAorbm91dmVhdV9ib19uZXcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkgICAgICAgaW50IHNpemUsIGludCBhbGlnbiwgdWludDMyX3QgZmxhZ3MsIHVpbnQzMl90IHRpbGVfbW9kZSwKKwkgICAgICAgdWludDMyX3QgdGlsZV9mbGFncywgYm9vbCBub192bSwgYm9vbCBtYXBwYWJsZSwKKwkgICAgICAgc3RydWN0IG5vdXZlYXVfYm8gKipwbnZibykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2JvICpudmJvOworCWludCByZXQsIG4gPSAwOworCisJbnZibyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBub3V2ZWF1X2JvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFudmJvKQorCQlyZXR1cm4gLUVOT01FTTsKKwlJTklUX0xJU1RfSEVBRCgmbnZiby0+aGVhZCk7CisJSU5JVF9MSVNUX0hFQUQoJm52Ym8tPmVudHJ5KTsKKwludmJvLT5tYXBwYWJsZSA9IG1hcHBhYmxlOworCW52Ym8tPm5vX3ZtID0gbm9fdm07CisJbnZiby0+dGlsZV9tb2RlID0gdGlsZV9tb2RlOworCW52Ym8tPnRpbGVfZmxhZ3MgPSB0aWxlX2ZsYWdzOworCisJLyoKKwkgKiBTb21lIG9mIHRoZSB0aWxlX2ZsYWdzIGhhdmUgYSBwZXJpb2RpYyBzdHJ1Y3R1cmUgb2YgTio0MDk2IGJ5dGVzLAorCSAqIGFsaWduIHRvIHRvIHRoYXQgYXMgd2VsbCBhcyB0aGUgcGFnZSBzaXplLiBPdmVyYWxsb2NhdGUgbWVtb3J5IHRvCisJICogYXZvaWQgY29ycnVwdGlvbiBvZiBvdGhlciBidWZmZXIgb2JqZWN0cy4KKwkgKi8KKwlzd2l0Y2ggKHRpbGVfZmxhZ3MpIHsKKwljYXNlIDB4MTgwMDoKKwljYXNlIDB4MjgwMDoKKwljYXNlIDB4NDgwMDoKKwljYXNlIDB4N2EwMDoKKwkJaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4QTApIHsKKwkJCS8qIFRoaXMgaXMgYmFzZWQgb24gaGlnaCBlbmQgY2FyZHMgd2l0aCA0NDggYml0cworCQkJICogbWVtb3J5IGJ1cywgY291bGQgYmUgZGlmZmVyZW50IGVsc2V3aGVyZS4qLworCQkJc2l6ZSArPSA2ICogMjg2NzI7CisJCQkvKiA4ICogMjg2NzIgaXMgdGhlIGFjdHVhbCBhbGlnbm1lbnQgcmVxdWlyZW1lbnQsCisJCQkgKiBidXQgd2UgbXVzdCBhbHNvIGFsaWduIHRvIHBhZ2Ugc2l6ZS4gKi8KKwkJCWFsaWduID0gMiAqIDggKiAyODY3MjsKKwkJfSBlbHNlIGlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDkwKSB7CisJCQlzaXplICs9IDMgKiAxNjM4NDsKKwkJCWFsaWduID0gMTIgKiAxNjgzNDsKKwkJfSBlbHNlIHsKKwkJCXNpemUgKz0gMyAqIDgxOTI7CisJCQkvKiAxMiAqIDgxOTIgaXMgdGhlIGFjdHVhbCBhbGlnbm1lbnQgcmVxdWlyZW1lbnQsCisJCQkgKiBidXQgd2UgbXVzdCBhbHNvIGFsaWduIHRvIHBhZ2Ugc2l6ZS4gKi8KKwkJCWFsaWduID0gMiAqIDEyICogODE5MjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlhbGlnbiA+Pj0gUEFHRV9TSElGVDsKKworCXNpemUgPSAoc2l6ZSArIChQQUdFX1NJWkUgLSAxKSkgJiB+KFBBR0VfU0laRSAtIDEpOworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzUwKSB7CisJCXNpemUgPSAoc2l6ZSArIDY1NTM1KSAmIH42NTUzNTsKKwkJaWYgKGFsaWduIDwgKDY1NTM2IC8gUEFHRV9TSVpFKSkKKwkJCWFsaWduID0gKDY1NTM2IC8gUEFHRV9TSVpFKTsKKwl9CisKKwlpZiAoZmxhZ3MgJiBUVE1fUExfRkxBR19WUkFNKQorCQludmJvLT5wbGFjZW1lbnRzW24rK10gPSBUVE1fUExfRkxBR19WUkFNIHwgVFRNX1BMX01BU0tfQ0FDSElORzsKKwlpZiAoZmxhZ3MgJiBUVE1fUExfRkxBR19UVCkKKwkJbnZiby0+cGxhY2VtZW50c1tuKytdID0gVFRNX1BMX0ZMQUdfVFQgfCBUVE1fUExfTUFTS19DQUNISU5HOworCW52Ym8tPnBsYWNlbWVudC5mcGZuID0gMDsKKwludmJvLT5wbGFjZW1lbnQubHBmbiA9IG1hcHBhYmxlID8gZGV2X3ByaXYtPmZiX21hcHBhYmxlX3BhZ2VzIDogMDsKKwludmJvLT5wbGFjZW1lbnQucGxhY2VtZW50ID0gbnZiby0+cGxhY2VtZW50czsKKwludmJvLT5wbGFjZW1lbnQuYnVzeV9wbGFjZW1lbnQgPSBudmJvLT5wbGFjZW1lbnRzOworCW52Ym8tPnBsYWNlbWVudC5udW1fcGxhY2VtZW50ID0gbjsKKwludmJvLT5wbGFjZW1lbnQubnVtX2J1c3lfcGxhY2VtZW50ID0gbjsKKworCW52Ym8tPmNoYW5uZWwgPSBjaGFuOworCW5vdXZlYXVfYm9fcGxhY2VtZW50X3NldChudmJvLCBmbGFncyk7CisJcmV0ID0gdHRtX2JvX2luaXQoJmRldl9wcml2LT50dG0uYmRldiwgJm52Ym8tPmJvLCBzaXplLAorCQkJICB0dG1fYm9fdHlwZV9kZXZpY2UsICZudmJvLT5wbGFjZW1lbnQsIGFsaWduLCAwLAorCQkJICBmYWxzZSwgTlVMTCwgc2l6ZSwgbm91dmVhdV9ib19kZWxfdHRtKTsKKwludmJvLT5jaGFubmVsID0gTlVMTDsKKwlpZiAocmV0KSB7CisJCS8qIHR0bSB3aWxsIGNhbGwgbm91dmVhdV9ib19kZWxfdHRtIGlmIGl0IGZhaWxzLi4gKi8KKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzcGluX2xvY2soJmRldl9wcml2LT50dG0uYm9fbGlzdF9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZudmJvLT5oZWFkLCAmZGV2X3ByaXYtPnR0bS5ib19saXN0KTsKKwlzcGluX3VubG9jaygmZGV2X3ByaXYtPnR0bS5ib19saXN0X2xvY2spOworCSpwbnZibyA9IG52Ym87CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK25vdXZlYXVfYm9fcGxhY2VtZW50X3NldChzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibywgdWludDMyX3QgbWVtdHlwZSkKK3sKKwlpbnQgbiA9IDA7CisKKwlpZiAobWVtdHlwZSAmIFRUTV9QTF9GTEFHX1ZSQU0pCisJCW52Ym8tPnBsYWNlbWVudHNbbisrXSA9IFRUTV9QTF9GTEFHX1ZSQU0gfCBUVE1fUExfTUFTS19DQUNISU5HOworCWlmIChtZW10eXBlICYgVFRNX1BMX0ZMQUdfVFQpCisJCW52Ym8tPnBsYWNlbWVudHNbbisrXSA9IFRUTV9QTF9GTEFHX1RUIHwgVFRNX1BMX01BU0tfQ0FDSElORzsKKwlpZiAobWVtdHlwZSAmIFRUTV9QTF9GTEFHX1NZU1RFTSkKKwkJbnZiby0+cGxhY2VtZW50c1tuKytdID0gVFRNX1BMX0ZMQUdfU1lTVEVNIHwgVFRNX1BMX01BU0tfQ0FDSElORzsKKwludmJvLT5wbGFjZW1lbnQucGxhY2VtZW50ID0gbnZiby0+cGxhY2VtZW50czsKKwludmJvLT5wbGFjZW1lbnQuYnVzeV9wbGFjZW1lbnQgPSBudmJvLT5wbGFjZW1lbnRzOworCW52Ym8tPnBsYWNlbWVudC5udW1fcGxhY2VtZW50ID0gbjsKKwludmJvLT5wbGFjZW1lbnQubnVtX2J1c3lfcGxhY2VtZW50ID0gbjsKK30KKworaW50Citub3V2ZWF1X2JvX3BpbihzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibywgdWludDMyX3QgbWVtdHlwZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBub3V2ZWF1X2JkZXYobnZiby0+Ym8uYmRldik7CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9ICZudmJvLT5ibzsKKwlpbnQgcmV0LCBpOworCisJaWYgKG52Ym8tPnBpbl9yZWZjbnQgJiYgIShtZW10eXBlICYgKDEgPDwgYm8tPm1lbS5tZW1fdHlwZSkpKSB7CisJCU5WX0VSUk9SKG5vdXZlYXVfYmRldihiby0+YmRldiktPmRldiwKKwkJCSAiYm8gJXAgcGlubmVkIGVsc2V3aGVyZTogMHglMDh4IHZzIDB4JTA4eFxuIiwgYm8sCisJCQkgMSA8PCBiby0+bWVtLm1lbV90eXBlLCBtZW10eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG52Ym8tPnBpbl9yZWZjbnQrKykKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSB0dG1fYm9fcmVzZXJ2ZShibywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlub3V2ZWF1X2JvX3BsYWNlbWVudF9zZXQobnZibywgbWVtdHlwZSk7CisJZm9yIChpID0gMDsgaSA8IG52Ym8tPnBsYWNlbWVudC5udW1fcGxhY2VtZW50OyBpKyspCisJCW52Ym8tPnBsYWNlbWVudHNbaV0gfD0gVFRNX1BMX0ZMQUdfTk9fRVZJQ1Q7CisKKwlyZXQgPSB0dG1fYm9fdmFsaWRhdGUoYm8sICZudmJvLT5wbGFjZW1lbnQsIGZhbHNlLCBmYWxzZSk7CisJaWYgKHJldCA9PSAwKSB7CisJCXN3aXRjaCAoYm8tPm1lbS5tZW1fdHlwZSkgeworCQljYXNlIFRUTV9QTF9WUkFNOgorCQkJZGV2X3ByaXYtPmZiX2FwZXJfZnJlZSAtPSBiby0+bWVtLnNpemU7CisJCQlicmVhazsKKwkJY2FzZSBUVE1fUExfVFQ6CisJCQlkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfZnJlZSAtPSBiby0+bWVtLnNpemU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCXR0bV9ib191bnJlc2VydmUoYm8pOworb3V0OgorCWlmICh1bmxpa2VseShyZXQpKQorCQludmJvLT5waW5fcmVmY250LS07CisJcmV0dXJuIHJldDsKK30KKworaW50Citub3V2ZWF1X2JvX3VucGluKHN0cnVjdCBub3V2ZWF1X2JvICpudmJvKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IG5vdXZlYXVfYmRldihudmJvLT5iby5iZGV2KTsKKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0gJm52Ym8tPmJvOworCWludCByZXQsIGk7CisKKwlpZiAoLS1udmJvLT5waW5fcmVmY250KQorCQlyZXR1cm4gMDsKKworCXJldCA9IHR0bV9ib19yZXNlcnZlKGJvLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IG52Ym8tPnBsYWNlbWVudC5udW1fcGxhY2VtZW50OyBpKyspCisJCW52Ym8tPnBsYWNlbWVudHNbaV0gJj0gflRUTV9QTF9GTEFHX05PX0VWSUNUOworCisJcmV0ID0gdHRtX2JvX3ZhbGlkYXRlKGJvLCAmbnZiby0+cGxhY2VtZW50LCBmYWxzZSwgZmFsc2UpOworCWlmIChyZXQgPT0gMCkgeworCQlzd2l0Y2ggKGJvLT5tZW0ubWVtX3R5cGUpIHsKKwkJY2FzZSBUVE1fUExfVlJBTToKKwkJCWRldl9wcml2LT5mYl9hcGVyX2ZyZWUgKz0gYm8tPm1lbS5zaXplOworCQkJYnJlYWs7CisJCWNhc2UgVFRNX1BMX1RUOgorCQkJZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX2ZyZWUgKz0gYm8tPm1lbS5zaXplOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCXR0bV9ib191bnJlc2VydmUoYm8pOworCXJldHVybiByZXQ7Cit9CisKK2ludAorbm91dmVhdV9ib19tYXAoc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8pCit7CisJaW50IHJldDsKKworCXJldCA9IHR0bV9ib19yZXNlcnZlKCZudmJvLT5ibywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHR0bV9ib19rbWFwKCZudmJvLT5ibywgMCwgbnZiby0+Ym8ubWVtLm51bV9wYWdlcywgJm52Ym8tPmttYXApOworCXR0bV9ib191bnJlc2VydmUoJm52Ym8tPmJvKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkCitub3V2ZWF1X2JvX3VubWFwKHN0cnVjdCBub3V2ZWF1X2JvICpudmJvKQoreworCXR0bV9ib19rdW5tYXAoJm52Ym8tPmttYXApOworfQorCit1MTYKK25vdXZlYXVfYm9fcmQxNihzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibywgdW5zaWduZWQgaW5kZXgpCit7CisJYm9vbCBpc19pb21lbTsKKwl1MTYgKm1lbSA9IHR0bV9rbWFwX29ial92aXJ0dWFsKCZudmJvLT5rbWFwLCAmaXNfaW9tZW0pOworCW1lbSA9ICZtZW1baW5kZXhdOworCWlmIChpc19pb21lbSkKKwkJcmV0dXJuIGlvcmVhZDE2X25hdGl2ZSgodm9pZCBfX2ZvcmNlIF9faW9tZW0gKiltZW0pOworCWVsc2UKKwkJcmV0dXJuICptZW07Cit9CisKK3ZvaWQKK25vdXZlYXVfYm9fd3IxNihzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibywgdW5zaWduZWQgaW5kZXgsIHUxNiB2YWwpCit7CisJYm9vbCBpc19pb21lbTsKKwl1MTYgKm1lbSA9IHR0bV9rbWFwX29ial92aXJ0dWFsKCZudmJvLT5rbWFwLCAmaXNfaW9tZW0pOworCW1lbSA9ICZtZW1baW5kZXhdOworCWlmIChpc19pb21lbSkKKwkJaW93cml0ZTE2X25hdGl2ZSh2YWwsICh2b2lkIF9fZm9yY2UgX19pb21lbSAqKW1lbSk7CisJZWxzZQorCQkqbWVtID0gdmFsOworfQorCit1MzIKK25vdXZlYXVfYm9fcmQzMihzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibywgdW5zaWduZWQgaW5kZXgpCit7CisJYm9vbCBpc19pb21lbTsKKwl1MzIgKm1lbSA9IHR0bV9rbWFwX29ial92aXJ0dWFsKCZudmJvLT5rbWFwLCAmaXNfaW9tZW0pOworCW1lbSA9ICZtZW1baW5kZXhdOworCWlmIChpc19pb21lbSkKKwkJcmV0dXJuIGlvcmVhZDMyX25hdGl2ZSgodm9pZCBfX2ZvcmNlIF9faW9tZW0gKiltZW0pOworCWVsc2UKKwkJcmV0dXJuICptZW07Cit9CisKK3ZvaWQKK25vdXZlYXVfYm9fd3IzMihzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibywgdW5zaWduZWQgaW5kZXgsIHUzMiB2YWwpCit7CisJYm9vbCBpc19pb21lbTsKKwl1MzIgKm1lbSA9IHR0bV9rbWFwX29ial92aXJ0dWFsKCZudmJvLT5rbWFwLCAmaXNfaW9tZW0pOworCW1lbSA9ICZtZW1baW5kZXhdOworCWlmIChpc19pb21lbSkKKwkJaW93cml0ZTMyX25hdGl2ZSh2YWwsICh2b2lkIF9fZm9yY2UgX19pb21lbSAqKW1lbSk7CisJZWxzZQorCQkqbWVtID0gdmFsOworfQorCitzdGF0aWMgc3RydWN0IHR0bV9iYWNrZW5kICoKK25vdXZlYXVfYm9fY3JlYXRlX3R0bV9iYWNrZW5kX2VudHJ5KHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IG5vdXZlYXVfYmRldihiZGV2KTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKKworCXN3aXRjaCAoZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlKSB7CisJY2FzZSBOT1VWRUFVX0dBUlRfQUdQOgorCQlyZXR1cm4gdHRtX2FncF9iYWNrZW5kX2luaXQoYmRldiwgZGV2LT5hZ3AtPmJyaWRnZSk7CisJY2FzZSBOT1VWRUFVX0dBUlRfU0dETUE6CisJCXJldHVybiBub3V2ZWF1X3NnZG1hX2luaXRfdHRtKGRldik7CisJZGVmYXVsdDoKKwkJTlZfRVJST1IoZGV2LCAiVW5rbm93biBHQVJUIHR5cGUgJWRcbiIsCisJCQkgZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfYm9faW52YWxpZGF0ZV9jYWNoZXMoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsIHVpbnQzMl90IGZsYWdzKQoreworCS8qIFdlJ2xsIGRvIHRoaXMgZnJvbSB1c2VyIHNwYWNlLiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2JvX2luaXRfbWVtX3R5cGUoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsIHVpbnQzMl90IHR5cGUsCisJCQkgc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gbm91dmVhdV9iZGV2KGJkZXYpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBUVE1fUExfU1lTVEVNOgorCQltYW4tPmZsYWdzID0gVFRNX01FTVRZUEVfRkxBR19NQVBQQUJMRTsKKwkJbWFuLT5hdmFpbGFibGVfY2FjaGluZyA9IFRUTV9QTF9NQVNLX0NBQ0hJTkc7CisJCW1hbi0+ZGVmYXVsdF9jYWNoaW5nID0gVFRNX1BMX0ZMQUdfQ0FDSEVEOworCQlicmVhazsKKwljYXNlIFRUTV9QTF9WUkFNOgorCQltYW4tPmZsYWdzID0gVFRNX01FTVRZUEVfRkxBR19GSVhFRCB8CisJCQkgICAgIFRUTV9NRU1UWVBFX0ZMQUdfTUFQUEFCTEUgfAorCQkJICAgICBUVE1fTUVNVFlQRV9GTEFHX05FRURTX0lPUkVNQVA7CisJCW1hbi0+YXZhaWxhYmxlX2NhY2hpbmcgPSBUVE1fUExfRkxBR19VTkNBQ0hFRCB8CisJCQkJCSBUVE1fUExfRkxBR19XQzsKKwkJbWFuLT5kZWZhdWx0X2NhY2hpbmcgPSBUVE1fUExfRkxBR19XQzsKKworCQltYW4tPmlvX2FkZHIgPSBOVUxMOworCQltYW4tPmlvX29mZnNldCA9IGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZGV2LCAxKTsKKwkJbWFuLT5pb19zaXplID0gZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCAxKTsKKwkJaWYgKG1hbi0+aW9fc2l6ZSA+IG5vdXZlYXVfbWVtX2ZiX2Ftb3VudChkZXYpKQorCQkJbWFuLT5pb19zaXplID0gbm91dmVhdV9tZW1fZmJfYW1vdW50KGRldik7CisKKwkJbWFuLT5ncHVfb2Zmc2V0ID0gZGV2X3ByaXYtPnZtX3ZyYW1fYmFzZTsKKwkJYnJlYWs7CisJY2FzZSBUVE1fUExfVFQ6CisJCXN3aXRjaCAoZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlKSB7CisJCWNhc2UgTk9VVkVBVV9HQVJUX0FHUDoKKwkJCW1hbi0+ZmxhZ3MgPSBUVE1fTUVNVFlQRV9GTEFHX01BUFBBQkxFIHwKKwkJCQkgICAgIFRUTV9NRU1UWVBFX0ZMQUdfTkVFRFNfSU9SRU1BUDsKKwkJCW1hbi0+YXZhaWxhYmxlX2NhY2hpbmcgPSBUVE1fUExfRkxBR19VTkNBQ0hFRDsKKwkJCW1hbi0+ZGVmYXVsdF9jYWNoaW5nID0gVFRNX1BMX0ZMQUdfVU5DQUNIRUQ7CisJCQlicmVhazsKKwkJY2FzZSBOT1VWRUFVX0dBUlRfU0dETUE6CisJCQltYW4tPmZsYWdzID0gVFRNX01FTVRZUEVfRkxBR19NQVBQQUJMRSB8CisJCQkJICAgICBUVE1fTUVNVFlQRV9GTEFHX0NNQTsKKwkJCW1hbi0+YXZhaWxhYmxlX2NhY2hpbmcgPSBUVE1fUExfTUFTS19DQUNISU5HOworCQkJbWFuLT5kZWZhdWx0X2NhY2hpbmcgPSBUVE1fUExfRkxBR19DQUNIRUQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCU5WX0VSUk9SKGRldiwgIlVua25vd24gR0FSVCB0eXBlOiAlZFxuIiwKKwkJCQkgZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJbWFuLT5pb19vZmZzZXQgID0gZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX2Jhc2U7CisJCW1hbi0+aW9fc2l6ZSAgICA9IGRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9zaXplOworCQltYW4tPmlvX2FkZHIgICA9IE5VTEw7CisJCW1hbi0+Z3B1X29mZnNldCA9IGRldl9wcml2LT52bV9nYXJ0X2Jhc2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCU5WX0VSUk9SKGRldiwgIlVuc3VwcG9ydGVkIG1lbW9yeSB0eXBlICV1XG4iLCAodW5zaWduZWQpdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfYm9fZXZpY3RfZmxhZ3Moc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywgc3RydWN0IHR0bV9wbGFjZW1lbnQgKnBsKQoreworCXN0cnVjdCBub3V2ZWF1X2JvICpudmJvID0gbm91dmVhdV9ibyhibyk7CisKKwlzd2l0Y2ggKGJvLT5tZW0ubWVtX3R5cGUpIHsKKwlkZWZhdWx0OgorCQlub3V2ZWF1X2JvX3BsYWNlbWVudF9zZXQobnZibywgVFRNX1BMX0ZMQUdfU1lTVEVNKTsKKwkJYnJlYWs7CisJfQorfQorCisKKy8qIEdQVS1hc3Npc3RlZCBjb3B5IHVzaW5nIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFULCBjYW4gYWNjZXNzCisgKiBUVE1fUExfe1ZSQU0sVFR9IGRpcmVjdGx5LgorICovCitzdGF0aWMgaW50Citub3V2ZWF1X2JvX21vdmVfYWNjZWxfY2xlYW51cChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJICAgICAgc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8sIGJvb2wgZXZpY3QsIGJvb2wgbm9fd2FpdCwKKwkJCSAgICAgIHN0cnVjdCB0dG1fbWVtX3JlZyAqbmV3X21lbSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqZmVuY2UgPSBOVUxMOworCWludCByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2ZlbmNlX25ldyhjaGFuLCAmZmVuY2UsIHRydWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB0dG1fYm9fbW92ZV9hY2NlbF9jbGVhbnVwKCZudmJvLT5ibywgZmVuY2UsIE5VTEwsCisJCQkJCWV2aWN0LCBub193YWl0LCBuZXdfbWVtKTsKKwlub3V2ZWF1X2ZlbmNlX3VucmVmKCh2b2lkICopJmZlbmNlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90Citub3V2ZWF1X2JvX21lbV9jdHhkbWEoc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8sIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCSAgICAgIHN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtKQoreworCWlmIChjaGFuID09IG5vdXZlYXVfYmRldihudmJvLT5iby5iZGV2KS0+Y2hhbm5lbCkgeworCQlpZiAobWVtLT5tZW1fdHlwZSA9PSBUVE1fUExfVFQpCisJCQlyZXR1cm4gTnZEbWFHQVJUOworCQlyZXR1cm4gTnZEbWFWUkFNOworCX0KKworCWlmIChtZW0tPm1lbV90eXBlID09IFRUTV9QTF9UVCkKKwkJcmV0dXJuIGNoYW4tPmdhcnRfaGFuZGxlOworCXJldHVybiBjaGFuLT52cmFtX2hhbmRsZTsKK30KKworc3RhdGljIGludAorbm91dmVhdV9ib19tb3ZlX20ybWYoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywgaW50IGV2aWN0LCBpbnQgbm9fd2FpdCwKKwkJICAgICBzdHJ1Y3QgdHRtX21lbV9yZWcgKm9sZF9tZW0sIHN0cnVjdCB0dG1fbWVtX3JlZyAqbmV3X21lbSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibyA9IG5vdXZlYXVfYm8oYm8pOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IG5vdXZlYXVfYmRldihiby0+YmRldik7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbjsKKwl1aW50NjRfdCBzcmNfb2Zmc2V0LCBkc3Rfb2Zmc2V0OworCXVpbnQzMl90IHBhZ2VfY291bnQ7CisJaW50IHJldDsKKworCWNoYW4gPSBudmJvLT5jaGFubmVsOworCWlmICghY2hhbiB8fCBudmJvLT50aWxlX2ZsYWdzIHx8IG52Ym8tPm5vX3ZtKSB7CisJCWNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbDsKKwkJaWYgKCFjaGFuKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3JjX29mZnNldCA9IG9sZF9tZW0tPm1tX25vZGUtPnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CisJZHN0X29mZnNldCA9IG5ld19tZW0tPm1tX25vZGUtPnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CisJaWYgKGNoYW4gIT0gZGV2X3ByaXYtPmNoYW5uZWwpIHsKKwkJaWYgKG9sZF9tZW0tPm1lbV90eXBlID09IFRUTV9QTF9UVCkKKwkJCXNyY19vZmZzZXQgKz0gZGV2X3ByaXYtPnZtX2dhcnRfYmFzZTsKKwkJZWxzZQorCQkJc3JjX29mZnNldCArPSBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlOworCisJCWlmIChuZXdfbWVtLT5tZW1fdHlwZSA9PSBUVE1fUExfVFQpCisJCQlkc3Rfb2Zmc2V0ICs9IGRldl9wcml2LT52bV9nYXJ0X2Jhc2U7CisJCWVsc2UKKwkJCWRzdF9vZmZzZXQgKz0gZGV2X3ByaXYtPnZtX3ZyYW1fYmFzZTsKKwl9CisKKwlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1Yk0yTUYsIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX0RNQV9TT1VSQ0UsIDIpOworCU9VVF9SSU5HKGNoYW4sIG5vdXZlYXVfYm9fbWVtX2N0eGRtYShudmJvLCBjaGFuLCBvbGRfbWVtKSk7CisJT1VUX1JJTkcoY2hhbiwgbm91dmVhdV9ib19tZW1fY3R4ZG1hKG52Ym8sIGNoYW4sIG5ld19tZW0pKTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKSB7CisJCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgNCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlCRUdJTl9SSU5HKGNoYW4sIE52U3ViTTJNRiwgMHgwMjAwLCAxKTsKKwkJT1VUX1JJTkcoY2hhbiwgMSk7CisJCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJNMk1GLCAweDAyMWMsIDEpOworCQlPVVRfUklORyhjaGFuLCAxKTsKKwl9CisKKwlwYWdlX2NvdW50ID0gbmV3X21lbS0+bnVtX3BhZ2VzOworCXdoaWxlIChwYWdlX2NvdW50KSB7CisJCWludCBsaW5lX2NvdW50ID0gKHBhZ2VfY291bnQgPiAyMDQ3KSA/IDIwNDcgOiBwYWdlX2NvdW50OworCisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKSB7CisJCQlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDMpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJQkVHSU5fUklORyhjaGFuLCBOdlN1Yk0yTUYsIDB4MDIzOCwgMik7CisJCQlPVVRfUklORyhjaGFuLCB1cHBlcl8zMl9iaXRzKHNyY19vZmZzZXQpKTsKKwkJCU9VVF9SSU5HKGNoYW4sIHVwcGVyXzMyX2JpdHMoZHN0X29mZnNldCkpOworCQl9CisJCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgMTEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJQkVHSU5fUklORyhjaGFuLCBOdlN1Yk0yTUYsCisJCQkJIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX09GRlNFVF9JTiwgOCk7CisJCU9VVF9SSU5HKGNoYW4sIGxvd2VyXzMyX2JpdHMoc3JjX29mZnNldCkpOworCQlPVVRfUklORyhjaGFuLCBsb3dlcl8zMl9iaXRzKGRzdF9vZmZzZXQpKTsKKwkJT1VUX1JJTkcoY2hhbiwgUEFHRV9TSVpFKTsgLyogc3JjX3BpdGNoICovCisJCU9VVF9SSU5HKGNoYW4sIFBBR0VfU0laRSk7IC8qIGRzdF9waXRjaCAqLworCQlPVVRfUklORyhjaGFuLCBQQUdFX1NJWkUpOyAvKiBsaW5lX2xlbmd0aCAqLworCQlPVVRfUklORyhjaGFuLCBsaW5lX2NvdW50KTsKKwkJT1VUX1JJTkcoY2hhbiwgKDE8PDgpfCgxPDwwKSk7CisJCU9VVF9SSU5HKGNoYW4sIDApOworCQlCRUdJTl9SSU5HKGNoYW4sIE52U3ViTTJNRiwgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfTk9QLCAxKTsKKwkJT1VUX1JJTkcoY2hhbiwgMCk7CisKKwkJcGFnZV9jb3VudCAtPSBsaW5lX2NvdW50OworCQlzcmNfb2Zmc2V0ICs9IChQQUdFX1NJWkUgKiBsaW5lX2NvdW50KTsKKwkJZHN0X29mZnNldCArPSAoUEFHRV9TSVpFICogbGluZV9jb3VudCk7CisJfQorCisJcmV0dXJuIG5vdXZlYXVfYm9fbW92ZV9hY2NlbF9jbGVhbnVwKGNoYW4sIG52Ym8sIGV2aWN0LCBub193YWl0LCBuZXdfbWVtKTsKK30KKworc3RhdGljIGludAorbm91dmVhdV9ib19tb3ZlX2ZsaXBkKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sIGJvb2wgZXZpY3QsIGJvb2wgaW50ciwKKwkJICAgICAgYm9vbCBub193YWl0LCBzdHJ1Y3QgdHRtX21lbV9yZWcgKm5ld19tZW0pCit7CisJdTMyIHBsYWNlbWVudF9tZW10eXBlID0gVFRNX1BMX0ZMQUdfVFQgfCBUVE1fUExfTUFTS19DQUNISU5HOworCXN0cnVjdCB0dG1fcGxhY2VtZW50IHBsYWNlbWVudDsKKwlzdHJ1Y3QgdHRtX21lbV9yZWcgdG1wX21lbTsKKwlpbnQgcmV0OworCisJcGxhY2VtZW50LmZwZm4gPSBwbGFjZW1lbnQubHBmbiA9IDA7CisJcGxhY2VtZW50Lm51bV9wbGFjZW1lbnQgPSBwbGFjZW1lbnQubnVtX2J1c3lfcGxhY2VtZW50ID0gMTsKKwlwbGFjZW1lbnQucGxhY2VtZW50ID0gJnBsYWNlbWVudF9tZW10eXBlOworCisJdG1wX21lbSA9ICpuZXdfbWVtOworCXRtcF9tZW0ubW1fbm9kZSA9IE5VTEw7CisJcmV0ID0gdHRtX2JvX21lbV9zcGFjZShibywgJnBsYWNlbWVudCwgJnRtcF9tZW0sIGludHIsIG5vX3dhaXQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB0dG1fdHRfYmluZChiby0+dHRtLCAmdG1wX21lbSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBub3V2ZWF1X2JvX21vdmVfbTJtZihibywgdHJ1ZSwgbm9fd2FpdCwgJmJvLT5tZW0sICZ0bXBfbWVtKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IHR0bV9ib19tb3ZlX3R0bShibywgZXZpY3QsIG5vX3dhaXQsIG5ld19tZW0pOworb3V0OgorCWlmICh0bXBfbWVtLm1tX25vZGUpIHsKKwkJc3Bpbl9sb2NrKCZiby0+YmRldi0+Z2xvYi0+bHJ1X2xvY2spOworCQlkcm1fbW1fcHV0X2Jsb2NrKHRtcF9tZW0ubW1fbm9kZSk7CisJCXNwaW5fdW5sb2NrKCZiby0+YmRldi0+Z2xvYi0+bHJ1X2xvY2spOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfYm9fbW92ZV9mbGlwcyhzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLCBib29sIGV2aWN0LCBib29sIGludHIsCisJCSAgICAgIGJvb2wgbm9fd2FpdCwgc3RydWN0IHR0bV9tZW1fcmVnICpuZXdfbWVtKQoreworCXUzMiBwbGFjZW1lbnRfbWVtdHlwZSA9IFRUTV9QTF9GTEFHX1RUIHwgVFRNX1BMX01BU0tfQ0FDSElORzsKKwlzdHJ1Y3QgdHRtX3BsYWNlbWVudCBwbGFjZW1lbnQ7CisJc3RydWN0IHR0bV9tZW1fcmVnIHRtcF9tZW07CisJaW50IHJldDsKKworCXBsYWNlbWVudC5mcGZuID0gcGxhY2VtZW50LmxwZm4gPSAwOworCXBsYWNlbWVudC5udW1fcGxhY2VtZW50ID0gcGxhY2VtZW50Lm51bV9idXN5X3BsYWNlbWVudCA9IDE7CisJcGxhY2VtZW50LnBsYWNlbWVudCA9ICZwbGFjZW1lbnRfbWVtdHlwZTsKKworCXRtcF9tZW0gPSAqbmV3X21lbTsKKwl0bXBfbWVtLm1tX25vZGUgPSBOVUxMOworCXJldCA9IHR0bV9ib19tZW1fc3BhY2UoYm8sICZwbGFjZW1lbnQsICZ0bXBfbWVtLCBpbnRyLCBub193YWl0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdHRtX2JvX21vdmVfdHRtKGJvLCBldmljdCwgbm9fd2FpdCwgJnRtcF9tZW0pOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gbm91dmVhdV9ib19tb3ZlX20ybWYoYm8sIHRydWUsIG5vX3dhaXQsICZiby0+bWVtLCBuZXdfbWVtKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworb3V0OgorCWlmICh0bXBfbWVtLm1tX25vZGUpIHsKKwkJc3Bpbl9sb2NrKCZiby0+YmRldi0+Z2xvYi0+bHJ1X2xvY2spOworCQlkcm1fbW1fcHV0X2Jsb2NrKHRtcF9tZW0ubW1fbm9kZSk7CisJCXNwaW5fdW5sb2NrKCZiby0+YmRldi0+Z2xvYi0+bHJ1X2xvY2spOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfYm9fbW92ZShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLCBib29sIGV2aWN0LCBib29sIGludHIsCisJCWJvb2wgbm9fd2FpdCwgc3RydWN0IHR0bV9tZW1fcmVnICpuZXdfbWVtKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IG5vdXZlYXVfYmRldihiby0+YmRldik7CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8gPSBub3V2ZWF1X2JvKGJvKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKKwlzdHJ1Y3QgdHRtX21lbV9yZWcgKm9sZF9tZW0gPSAmYm8tPm1lbTsKKwlpbnQgcmV0OworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTAgJiYgbmV3X21lbS0+bWVtX3R5cGUgPT0gVFRNX1BMX1ZSQU0gJiYKKwkgICAgIW52Ym8tPm5vX3ZtKSB7CisJCXVpbnQ2NF90IG9mZnNldCA9IG5ld19tZW0tPm1tX25vZGUtPnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CisKKwkJcmV0ID0gbnY1MF9tZW1fdm1fYmluZF9saW5lYXIoZGV2LAorCQkJCQkgICAgICBvZmZzZXQgKyBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlLAorCQkJCQkgICAgICBuZXdfbWVtLT5zaXplLCBudmJvLT50aWxlX2ZsYWdzLAorCQkJCQkgICAgICBvZmZzZXQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPmluaXRfc3RhdGUgIT0gTk9VVkVBVV9DQVJEX0lOSVRfRE9ORSkKKwkJcmV0dXJuIHR0bV9ib19tb3ZlX21lbWNweShibywgZXZpY3QsIG5vX3dhaXQsIG5ld19tZW0pOworCisJaWYgKG9sZF9tZW0tPm1lbV90eXBlID09IFRUTV9QTF9TWVNURU0gJiYgIWJvLT50dG0pIHsKKwkJQlVHX09OKGJvLT5tZW0ubW1fbm9kZSAhPSBOVUxMKTsKKwkJYm8tPm1lbSA9ICpuZXdfbWVtOworCQluZXdfbWVtLT5tbV9ub2RlID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG5ld19tZW0tPm1lbV90eXBlID09IFRUTV9QTF9TWVNURU0pIHsKKwkJaWYgKG9sZF9tZW0tPm1lbV90eXBlID09IFRUTV9QTF9TWVNURU0pCisJCQlyZXR1cm4gdHRtX2JvX21vdmVfbWVtY3B5KGJvLCBldmljdCwgbm9fd2FpdCwgbmV3X21lbSk7CisJCWlmIChub3V2ZWF1X2JvX21vdmVfZmxpcGQoYm8sIGV2aWN0LCBpbnRyLCBub193YWl0LCBuZXdfbWVtKSkKKwkJCXJldHVybiB0dG1fYm9fbW92ZV9tZW1jcHkoYm8sIGV2aWN0LCBub193YWl0LCBuZXdfbWVtKTsKKwl9IGVsc2UgaWYgKG9sZF9tZW0tPm1lbV90eXBlID09IFRUTV9QTF9TWVNURU0pIHsKKwkJaWYgKG5vdXZlYXVfYm9fbW92ZV9mbGlwcyhibywgZXZpY3QsIGludHIsIG5vX3dhaXQsIG5ld19tZW0pKQorCQkJcmV0dXJuIHR0bV9ib19tb3ZlX21lbWNweShibywgZXZpY3QsIG5vX3dhaXQsIG5ld19tZW0pOworCX0gZWxzZSB7CisJCWlmIChub3V2ZWF1X2JvX21vdmVfbTJtZihibywgZXZpY3QsIG5vX3dhaXQsIG9sZF9tZW0sIG5ld19tZW0pKQorCQkJcmV0dXJuIHR0bV9ib19tb3ZlX21lbWNweShibywgZXZpY3QsIG5vX3dhaXQsIG5ld19tZW0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2JvX3ZlcmlmeV9hY2Nlc3Moc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywgc3RydWN0IGZpbGUgKmZpbHApCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB0dG1fYm9fZHJpdmVyIG5vdXZlYXVfYm9fZHJpdmVyID0geworCS5jcmVhdGVfdHRtX2JhY2tlbmRfZW50cnkgPSBub3V2ZWF1X2JvX2NyZWF0ZV90dG1fYmFja2VuZF9lbnRyeSwKKwkuaW52YWxpZGF0ZV9jYWNoZXMgPSBub3V2ZWF1X2JvX2ludmFsaWRhdGVfY2FjaGVzLAorCS5pbml0X21lbV90eXBlID0gbm91dmVhdV9ib19pbml0X21lbV90eXBlLAorCS5ldmljdF9mbGFncyA9IG5vdXZlYXVfYm9fZXZpY3RfZmxhZ3MsCisJLm1vdmUgPSBub3V2ZWF1X2JvX21vdmUsCisJLnZlcmlmeV9hY2Nlc3MgPSBub3V2ZWF1X2JvX3ZlcmlmeV9hY2Nlc3MsCisJLnN5bmNfb2JqX3NpZ25hbGVkID0gbm91dmVhdV9mZW5jZV9zaWduYWxsZWQsCisJLnN5bmNfb2JqX3dhaXQgPSBub3V2ZWF1X2ZlbmNlX3dhaXQsCisJLnN5bmNfb2JqX2ZsdXNoID0gbm91dmVhdV9mZW5jZV9mbHVzaCwKKwkuc3luY19vYmpfdW5yZWYgPSBub3V2ZWF1X2ZlbmNlX3VucmVmLAorCS5zeW5jX29ial9yZWYgPSBub3V2ZWF1X2ZlbmNlX3JlZiwKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY2FsYy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jYWxjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyYjg0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY2FsYy5jCkBAIC0wLDAgKzEsNDc4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTMtMjAwMyBOVklESUEsIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA5IFN0dWFydCBCZW5uZXR0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9ody5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBUaGUgdmlkZW8gYXJiaXRyYXRpb24gcm91dGluZXMgY2FsY3VsYXRlIHNvbWUgIm1hZ2ljIiBudW1iZXJzLiAgRml4ZXMgICAgICAqCisqIHRoZSBzbm93IHNlZW4gd2hlbiBhY2Nlc3NpbmcgdGhlIGZyYW1lYnVmZmVyIHdpdGhvdXQgaXQuICAgICAgICAgICAgICAgICAgICoKKyogSXQganVzdCB3b3JrcyAoSSBob3BlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IG52X2ZpZm9faW5mbyB7CisJaW50IGx3bTsKKwlpbnQgYnVyc3Q7Cit9OworCitzdHJ1Y3QgbnZfc2ltX3N0YXRlIHsKKwlpbnQgcGNsa19raHo7CisJaW50IG1jbGtfa2h6OworCWludCBudmNsa19raHo7CisJaW50IGJwcDsKKwlpbnQgbWVtX3BhZ2VfbWlzczsKKwlpbnQgbWVtX2xhdGVuY3k7CisJaW50IG1lbW9yeV90eXBlOworCWludCBtZW1vcnlfd2lkdGg7CisJaW50IHR3b19oZWFkczsKK307CisKK3N0YXRpYyB2b2lkCitudjA0X2NhbGNfYXJiKHN0cnVjdCBudl9maWZvX2luZm8gKmZpZm8sIHN0cnVjdCBudl9zaW1fc3RhdGUgKmFyYikKK3sKKwlpbnQgcGFnZW1pc3MsIGNhcywgd2lkdGgsIGJwcDsKKwlpbnQgbnZjbGtzLCBtY2xrcywgcGNsa3MsIGNydHBhZ2VtaXNzOworCWludCBmb3VuZCwgbWNsa19leHRyYSwgbWNsa19sb29wLCBjYnMsIG0xLCBwMTsKKwlpbnQgbWNsa19mcmVxLCBwY2xrX2ZyZXEsIG52Y2xrX2ZyZXE7CisJaW50IHVzX20sIHVzX24sIHVzX3AsIGNydGNfZHJhaW5fcmF0ZTsKKwlpbnQgY3BtX3VzLCB1c19jcnQsIGNsd207CisKKwlwY2xrX2ZyZXEgPSBhcmItPnBjbGtfa2h6OworCW1jbGtfZnJlcSA9IGFyYi0+bWNsa19raHo7CisJbnZjbGtfZnJlcSA9IGFyYi0+bnZjbGtfa2h6OworCXBhZ2VtaXNzID0gYXJiLT5tZW1fcGFnZV9taXNzOworCWNhcyA9IGFyYi0+bWVtX2xhdGVuY3k7CisJd2lkdGggPSBhcmItPm1lbW9yeV93aWR0aCA+PiA2OworCWJwcCA9IGFyYi0+YnBwOworCWNicyA9IDEyODsKKworCXBjbGtzID0gMjsKKwludmNsa3MgPSAxMDsKKwltY2xrcyA9IDEzICsgY2FzOworCW1jbGtfZXh0cmEgPSAzOworCWZvdW5kID0gMDsKKworCXdoaWxlICghZm91bmQpIHsKKwkJZm91bmQgPSAxOworCisJCW1jbGtfbG9vcCA9IG1jbGtzICsgbWNsa19leHRyYTsKKwkJdXNfbSA9IG1jbGtfbG9vcCAqIDEwMDAgKiAxMDAwIC8gbWNsa19mcmVxOworCQl1c19uID0gbnZjbGtzICogMTAwMCAqIDEwMDAgLyBudmNsa19mcmVxOworCQl1c19wID0gbnZjbGtzICogMTAwMCAqIDEwMDAgLyBwY2xrX2ZyZXE7CisKKwkJY3J0Y19kcmFpbl9yYXRlID0gcGNsa19mcmVxICogYnBwIC8gODsKKwkJY3J0cGFnZW1pc3MgPSAyOworCQljcnRwYWdlbWlzcyArPSAxOworCQljcG1fdXMgPSBjcnRwYWdlbWlzcyAqIHBhZ2VtaXNzICogMTAwMCAqIDEwMDAgLyBtY2xrX2ZyZXE7CisJCXVzX2NydCA9IGNwbV91cyArIHVzX20gKyB1c19uICsgdXNfcDsKKwkJY2x3bSA9IHVzX2NydCAqIGNydGNfZHJhaW5fcmF0ZSAvICgxMDAwICogMTAwMCk7CisJCWNsd20rKzsKKworCQltMSA9IGNsd20gKyBjYnMgLSA1MTI7CisJCXAxID0gbTEgKiBwY2xrX2ZyZXEgLyBtY2xrX2ZyZXE7CisJCXAxID0gcDEgKiBicHAgLyA4OworCQlpZiAoKHAxIDwgbTEgJiYgbTEgPiAwKSB8fCBjbHdtID4gNTE5KSB7CisJCQlmb3VuZCA9ICFtY2xrX2V4dHJhOworCQkJbWNsa19leHRyYS0tOworCQl9CisJCWlmIChjbHdtIDwgMzg0KQorCQkJY2x3bSA9IDM4NDsKKworCQlmaWZvLT5sd20gPSBjbHdtOworCQlmaWZvLT5idXJzdCA9IGNiczsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitudjEwX2NhbGNfYXJiKHN0cnVjdCBudl9maWZvX2luZm8gKmZpZm8sIHN0cnVjdCBudl9zaW1fc3RhdGUgKmFyYikKK3sKKwlpbnQgZmlsbF9yYXRlLCBkcmFpbl9yYXRlOworCWludCBwY2xrcywgbnZjbGtzLCBtY2xrcywgeGNsa3M7CisJaW50IHBjbGtfZnJlcSwgbnZjbGtfZnJlcSwgbWNsa19mcmVxOworCWludCBmaWxsX2xhdCwgZXh0cmFfbGF0OworCWludCBtYXhfYnVyc3RfbywgbWF4X2J1cnN0X2w7CisJaW50IGZpZm9fbGVuLCBtaW5fbHdtLCBtYXhfbHdtOworCWNvbnN0IGludCBidXJzdF9sYXQgPSA4MDsgLyogTWF4aW11bSBhbGxvd2FibGUgbGF0ZW5jeSBkdWUKKwkJCQkgICAqIHRvIHRoZSBDUlRDIEZJRk8gYnVyc3QuIChucykgKi8KKworCXBjbGtfZnJlcSA9IGFyYi0+cGNsa19raHo7CisJbnZjbGtfZnJlcSA9IGFyYi0+bnZjbGtfa2h6OworCW1jbGtfZnJlcSA9IGFyYi0+bWNsa19raHo7CisKKwlmaWxsX3JhdGUgPSBtY2xrX2ZyZXEgKiBhcmItPm1lbW9yeV93aWR0aCAvIDg7IC8qIGtCL3MgKi8KKwlkcmFpbl9yYXRlID0gcGNsa19mcmVxICogYXJiLT5icHAgLyA4OyAvKiBrQi9zICovCisKKwlmaWZvX2xlbiA9IGFyYi0+dHdvX2hlYWRzID8gMTUzNiA6IDEwMjQ7IC8qIEIgKi8KKworCS8qIEZpeGVkIEZJRk8gcmVmaWxsIGxhdGVuY3kuICovCisKKwlwY2xrcyA9IDQ7CS8qIGx3bSBkZXRlY3QuICovCisKKwludmNsa3MgPSAzCS8qIGx3bSAtPiBzeW5jLiAqLworCQkrIDIJLyogZmJpIGJ1cyBjeWNsZXMgKDEgcmVxICsgMSBidXN5KSAqLworCQkrIDEJLyogMiBlZGdlIHN5bmMuICBtYXkgYmUgdmVyeSBjbG9zZSB0byBlZGdlIHNvCisJCQkgKiBqdXN0IHB1dCBvbmUuICovCisJCSsgMQkvKiBmYmlfZF9yZHZfbiAqLworCQkrIDEJLyogRmJpX2RfcmRhdGEgKi8KKwkJKyAxOwkvKiBjcnRmaWZvIGxvYWQgKi8KKworCW1jbGtzID0gMQkvKiAyIGVkZ2Ugc3luYy4gIG1heSBiZSB2ZXJ5IGNsb3NlIHRvIGVkZ2Ugc28KKwkJCSAqIGp1c3QgcHV0IG9uZS4gKi8KKwkJKyAxCS8qIGFyYl9ocF9yZXEgKi8KKwkJKyA1CS8qIHRpbGluZyBwaXBlbGluZSAqLworCQkrIDIJLyogbGF0ZW5jeSBmaWZvICovCisJCSsgMgkvKiBtZW1vcnkgcmVxdWVzdCB0byBmYmlvIGJsb2NrICovCisJCSsgNzsJLyogZGF0YSByZXR1cm5lZCBmcm9tIGZiaW8gYmxvY2sgKi8KKworCS8qIE5lZWQgdG8gYWNjdW11bGF0ZSAyNTYgYml0cyBmb3IgcmVhZCAqLworCW1jbGtzICs9IChhcmItPm1lbW9yeV90eXBlID09IDAgPyAyIDogMSkKKwkJKiBhcmItPm1lbW9yeV93aWR0aCAvIDMyOworCisJZmlsbF9sYXQgPSBtY2xrcyAqIDEwMDAgKiAxMDAwIC8gbWNsa19mcmVxICAgLyogbWluaW11bSBtY2xrIGxhdGVuY3kgKi8KKwkJKyBudmNsa3MgKiAxMDAwICogMTAwMCAvIG52Y2xrX2ZyZXEgIC8qIG52Y2xrIGxhdGVuY3kgKi8KKwkJKyBwY2xrcyAqIDEwMDAgKiAxMDAwIC8gcGNsa19mcmVxOyAgIC8qIHBjbGsgbGF0ZW5jeSAqLworCisJLyogQ29uZGl0aW9uYWwgRklGTyByZWZpbGwgbGF0ZW5jeS4gKi8KKworCXhjbGtzID0gMiAqIGFyYi0+bWVtX3BhZ2VfbWlzcyArIG1jbGtzIC8qIEV4dHJhIGxhdGVuY3kgZHVlIHRvCisJCQkJCQkqIHRoZSBvdmVybGF5LiAqLworCQkrIDIgKiBhcmItPm1lbV9wYWdlX21pc3MgICAgICAgLyogRXh0cmEgcGFnZW1pc3MgbGF0ZW5jeS4gKi8KKwkJKyAoYXJiLT5icHAgPT0gMzIgPyA4IDogNCk7ICAgIC8qIE1hcmdpbiBvZiBlcnJvci4gKi8KKworCWV4dHJhX2xhdCA9IHhjbGtzICogMTAwMCAqIDEwMDAgLyBtY2xrX2ZyZXE7CisKKwlpZiAoYXJiLT50d29faGVhZHMpCisJCS8qIEFjY291bnQgZm9yIGFub3RoZXIgQ1JUQy4gKi8KKwkJZXh0cmFfbGF0ICs9IGZpbGxfbGF0ICsgZXh0cmFfbGF0ICsgYnVyc3RfbGF0OworCisJLyogRklGTyBidXJzdCAqLworCisJLyogTWF4IGJ1cnN0IG5vdCBsZWFkaW5nIHRvIG92ZXJmbG93cy4gKi8KKwltYXhfYnVyc3RfbyA9ICgxICsgZmlmb19sZW4gLSBleHRyYV9sYXQgKiBkcmFpbl9yYXRlIC8gKDEwMDAgKiAxMDAwKSkKKwkJKiAoZmlsbF9yYXRlIC8gMTAwMCkgLyAoKGZpbGxfcmF0ZSAtIGRyYWluX3JhdGUpIC8gMTAwMCk7CisJZmlmby0+YnVyc3QgPSBtaW4obWF4X2J1cnN0X28sIDEwMjQpOworCisJLyogTWF4IGJ1cnN0IHZhbHVlIHdpdGggYW4gYWNjZXB0YWJsZSBsYXRlbmN5LiAqLworCW1heF9idXJzdF9sID0gYnVyc3RfbGF0ICogZmlsbF9yYXRlIC8gKDEwMDAgKiAxMDAwKTsKKwlmaWZvLT5idXJzdCA9IG1pbihtYXhfYnVyc3RfbCwgZmlmby0+YnVyc3QpOworCisJZmlmby0+YnVyc3QgPSByb3VuZGRvd25fcG93X29mX3R3byhmaWZvLT5idXJzdCk7CisKKwkvKiBGSUZPIGxvdyB3YXRlcm1hcmsgKi8KKworCW1pbl9sd20gPSAoZmlsbF9sYXQgKyBleHRyYV9sYXQpICogZHJhaW5fcmF0ZSAvICgxMDAwICogMTAwMCkgKyAxOworCW1heF9sd20gPSBmaWZvX2xlbiAtIGZpZm8tPmJ1cnN0CisJCSsgZmlsbF9sYXQgKiBkcmFpbl9yYXRlIC8gKDEwMDAgKiAxMDAwKQorCQkrIGZpZm8tPmJ1cnN0ICogZHJhaW5fcmF0ZSAvIGZpbGxfcmF0ZTsKKworCWZpZm8tPmx3bSA9IG1pbl9sd20gKyAxMCAqIChtYXhfbHdtIC0gbWluX2x3bSkgLyAxMDA7IC8qIEVtcGlyaWNhbC4gKi8KK30KKworc3RhdGljIHZvaWQKK252MDRfdXBkYXRlX2FyYihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgVkNsaywgaW50IGJwcCwKKwkJaW50ICpidXJzdCwgaW50ICpsd20pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZfZmlmb19pbmZvIGZpZm9fZGF0YTsKKwlzdHJ1Y3QgbnZfc2ltX3N0YXRlIHNpbV9kYXRhOworCWludCBNQ2xrID0gbm91dmVhdV9od19nZXRfY2xvY2soZGV2LCBNUExMKTsKKwlpbnQgTlZDbGsgPSBub3V2ZWF1X2h3X2dldF9jbG9jayhkZXYsIE5WUExMKTsKKwl1aW50MzJfdCBjZmcxID0gbnZSZWFkRkIoZGV2LCBOVl9QRkJfQ0ZHMSk7CisKKwlzaW1fZGF0YS5wY2xrX2toeiA9IFZDbGs7CisJc2ltX2RhdGEubWNsa19raHogPSBNQ2xrOworCXNpbV9kYXRhLm52Y2xrX2toeiA9IE5WQ2xrOworCXNpbV9kYXRhLmJwcCA9IGJwcDsKKwlzaW1fZGF0YS50d29faGVhZHMgPSBudl90d29faGVhZHMoZGV2KTsKKwlpZiAoKGRldi0+cGNpX2RldmljZSAmIDB4ZmZmZikgPT0gMHgwMWEwIC8qQ0hJUFNFVF9ORk9SQ0UqLyB8fAorCSAgICAoZGV2LT5wY2lfZGV2aWNlICYgMHhmZmZmKSA9PSAweDAxZjAgLypDSElQU0VUX05GT1JDRTIqLykgeworCQl1aW50MzJfdCB0eXBlOworCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZ2V0X2J1c19hbmRfc2xvdCgwLCAxKSwgMHg3YywgJnR5cGUpOworCisJCXNpbV9kYXRhLm1lbW9yeV90eXBlID0gKHR5cGUgPj4gMTIpICYgMTsKKwkJc2ltX2RhdGEubWVtb3J5X3dpZHRoID0gNjQ7CisJCXNpbV9kYXRhLm1lbV9sYXRlbmN5ID0gMzsKKwkJc2ltX2RhdGEubWVtX3BhZ2VfbWlzcyA9IDEwOworCX0gZWxzZSB7CisJCXNpbV9kYXRhLm1lbW9yeV90eXBlID0gbnZSZWFkRkIoZGV2LCBOVl9QRkJfQ0ZHMCkgJiAweDE7CisJCXNpbV9kYXRhLm1lbW9yeV93aWR0aCA9IChudlJlYWRFWFRERVYoZGV2LCBOVl9QRVhUREVWX0JPT1RfMCkgJiAweDEwKSA/IDEyOCA6IDY0OworCQlzaW1fZGF0YS5tZW1fbGF0ZW5jeSA9IGNmZzEgJiAweGY7CisJCXNpbV9kYXRhLm1lbV9wYWdlX21pc3MgPSAoKGNmZzEgPj4gNCkgJiAweGYpICsgKChjZmcxID4+IDMxKSAmIDB4MSk7CisJfQorCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfMDQpCisJCW52MDRfY2FsY19hcmIoJmZpZm9fZGF0YSwgJnNpbV9kYXRhKTsKKwllbHNlCisJCW52MTBfY2FsY19hcmIoJmZpZm9fZGF0YSwgJnNpbV9kYXRhKTsKKworCSpidXJzdCA9IGlsb2cyKGZpZm9fZGF0YS5idXJzdCA+PiA0KTsKKwkqbHdtID0gZmlmb19kYXRhLmx3bSA+PiAzOworfQorCitzdGF0aWMgdm9pZAorbnYzMF91cGRhdGVfYXJiKGludCAqYnVyc3QsIGludCAqbHdtKQoreworCXVuc2lnbmVkIGludCBmaWZvX3NpemUsIGJ1cnN0X3NpemUsIGdyYXBoaWNzX2x3bTsKKworCWZpZm9fc2l6ZSA9IDIwNDg7CisJYnVyc3Rfc2l6ZSA9IDUxMjsKKwlncmFwaGljc19sd20gPSBmaWZvX3NpemUgLSBidXJzdF9zaXplOworCisJKmJ1cnN0ID0gaWxvZzIoYnVyc3Rfc2l6ZSA+PiA1KTsKKwkqbHdtID0gZ3JhcGhpY3NfbHdtID4+IDM7Cit9CisKK3ZvaWQKK25vdXZlYXVfY2FsY19hcmIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHZjbGssIGludCBicHAsIGludCAqYnVyc3QsIGludCAqbHdtKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzMwKQorCQludjA0X3VwZGF0ZV9hcmIoZGV2LCB2Y2xrLCBicHAsIGJ1cnN0LCBsd20pOworCWVsc2UgaWYgKChkZXYtPnBjaV9kZXZpY2UgJiAweGZmZjApID09IDB4MDI0MCAvKkNISVBTRVRfQzUxKi8gfHwKKwkJIChkZXYtPnBjaV9kZXZpY2UgJiAweGZmZjApID09IDB4MDNkMCAvKkNISVBTRVRfQzUxMiovKSB7CisJCSpidXJzdCA9IDEyODsKKwkJKmx3bSA9IDB4MDQ4MDsKKwl9IGVsc2UKKwkJbnYzMF91cGRhdGVfYXJiKGJ1cnN0LCBsd20pOworfQorCitzdGF0aWMgaW50CitnZXRNTlBfc2luZ2xlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBwbGxfbGltcyAqcGxsX2xpbSwgaW50IGNsaywKKwkgICAgICBzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyAqYmVzdHB2KQoreworCS8qIEZpbmQgTSwgTiBhbmQgUCBmb3IgYSBzaW5nbGUgc3RhZ2UgUExMCisJICoKKwkgKiBOb3RlIHRoYXQgc29tZSBiaW9zZXMgKE5WM3gpIGhhdmUgbG9va3VwIHRhYmxlcyBvZiBwcmVjb21wdXRlZCBNTlAKKwkgKiB2YWx1ZXMsIGJ1dCB3ZSdyZSB0b28gbGF6eSB0byB1c2UgdGhvc2UgYXRtCisJICoKKwkgKiAiY2xrIiBwYXJhbWV0ZXIgaW4ga0h6CisJICogcmV0dXJucyBjYWxjdWxhdGVkIGNsb2NrCisJICovCisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgY3YgPSBkZXZfcHJpdi0+dmJpb3MtPmNoaXBfdmVyc2lvbjsKKwlpbnQgbWludmNvID0gcGxsX2xpbS0+dmNvMS5taW5mcmVxLCBtYXh2Y28gPSBwbGxfbGltLT52Y28xLm1heGZyZXE7CisJaW50IG1pbk0gPSBwbGxfbGltLT52Y28xLm1pbl9tLCBtYXhNID0gcGxsX2xpbS0+dmNvMS5tYXhfbTsKKwlpbnQgbWluTiA9IHBsbF9saW0tPnZjbzEubWluX24sIG1heE4gPSBwbGxfbGltLT52Y28xLm1heF9uOworCWludCBtaW5VID0gcGxsX2xpbS0+dmNvMS5taW5faW5wdXRmcmVxOworCWludCBtYXhVID0gcGxsX2xpbS0+dmNvMS5tYXhfaW5wdXRmcmVxOworCWludCBtaW5QID0gcGxsX2xpbS0+bWF4X3AgPyBwbGxfbGltLT5taW5fcCA6IDA7CisJaW50IG1heFAgPSBwbGxfbGltLT5tYXhfcCA/IHBsbF9saW0tPm1heF9wIDogcGxsX2xpbS0+bWF4X3VzYWJsZV9sb2cycDsKKwlpbnQgY3J5c3RhbCA9IHBsbF9saW0tPnJlZmNsazsKKwlpbnQgTSwgTiwgdGhpc1AsIFA7CisJaW50IGNsa1AsIGNhbGNjbGs7CisJaW50IGRlbHRhLCBiZXN0ZGVsdGEgPSBJTlRfTUFYOworCWludCBiZXN0Y2xrID0gMDsKKworCS8qIHRoaXMgZGl2aXNpb24gdmVyaWZpZWQgZm9yIG52MjAsIG52MTgsIG52MjggKEhhaWt1KSwgYW5kIG52MzQgKi8KKwkvKiBwb3NzaWJseSBjb3JyZWxhdGVkIHdpdGggaW50cm9kdWN0aW9uIG9mIDI3TUh6IGNyeXN0YWwgKi8KKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7CisJCWlmIChjdiA8IDB4MTcgfHwgY3YgPT0gMHgxYSB8fCBjdiA9PSAweDIwKSB7CisJCQlpZiAoY2xrID4gMjUwMDAwKQorCQkJCW1heE0gPSA2OworCQkJaWYgKGNsayA+IDM0MDAwMCkKKwkJCQltYXhNID0gMjsKKwkJfSBlbHNlIGlmIChjdiA8IDB4NDApIHsKKwkJCWlmIChjbGsgPiAxNTAwMDApCisJCQkJbWF4TSA9IDY7CisJCQlpZiAoY2xrID4gMjAwMDAwKQorCQkJCW1heE0gPSA0OworCQkJaWYgKGNsayA+IDM0MDAwMCkKKwkJCQltYXhNID0gMjsKKwkJfQorCX0KKworCVAgPSBwbGxfbGltLT5tYXhfcCA/IG1heFAgOiAoMSA8PCBtYXhQKTsKKwlpZiAoKGNsayAqIFApIDwgbWludmNvKSB7CisJCW1pbnZjbyA9IGNsayAqIG1heFA7CisJCW1heHZjbyA9IG1pbnZjbyAqIDI7CisJfQorCisJaWYgKGNsayArIGNsay8yMDAgPiBtYXh2Y28pCS8qICswLjUlICovCisJCW1heHZjbyA9IGNsayArIGNsay8yMDA7CisKKwkvKiBOVjM0IGdvZXMgbWF4bG9nMlAtPjAsIE5WMjAgZ29lcyAwLT5tYXhsb2cyUCAqLworCWZvciAodGhpc1AgPSBtaW5QOyB0aGlzUCA8PSBtYXhQOyB0aGlzUCsrKSB7CisJCVAgPSBwbGxfbGltLT5tYXhfcCA/IHRoaXNQIDogKDEgPDwgdGhpc1ApOworCQljbGtQID0gY2xrICogUDsKKworCQlpZiAoY2xrUCA8IG1pbnZjbykKKwkJCWNvbnRpbnVlOworCQlpZiAoY2xrUCA+IG1heHZjbykKKwkJCXJldHVybiBiZXN0Y2xrOworCisJCWZvciAoTSA9IG1pbk07IE0gPD0gbWF4TTsgTSsrKSB7CisJCQlpZiAoY3J5c3RhbC9NIDwgbWluVSkKKwkJCQlyZXR1cm4gYmVzdGNsazsKKwkJCWlmIChjcnlzdGFsL00gPiBtYXhVKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBhZGQgY3J5c3RhbC8yIHRvIHJvdW5kIGJldHRlciAqLworCQkJTiA9IChjbGtQICogTSArIGNyeXN0YWwvMikgLyBjcnlzdGFsOworCisJCQlpZiAoTiA8IG1pbk4pCisJCQkJY29udGludWU7CisJCQlpZiAoTiA+IG1heE4pCisJCQkJYnJlYWs7CisKKwkJCS8qIG1vcmUgcm91bmRpbmcgYWRkaXRpb25zICovCisJCQljYWxjY2xrID0gKChOICogY3J5c3RhbCArIFAvMikgLyBQICsgTS8yKSAvIE07CisJCQlkZWx0YSA9IGFicyhjYWxjY2xrIC0gY2xrKTsKKwkJCS8qIHdlIGRvIGFuIGV4aGF1c3RpdmUgc2VhcmNoIHJhdGhlciB0aGFuIHRlcm1pbmF0aW5nCisJCQkgKiBvbiBhbiBvcHRpbWFsaXR5IGNvbmRpdGlvbi4uLgorCQkJICovCisJCQlpZiAoZGVsdGEgPCBiZXN0ZGVsdGEpIHsKKwkJCQliZXN0ZGVsdGEgPSBkZWx0YTsKKwkJCQliZXN0Y2xrID0gY2FsY2NsazsKKwkJCQliZXN0cHYtPk4xID0gTjsKKwkJCQliZXN0cHYtPk0xID0gTTsKKwkJCQliZXN0cHYtPmxvZzJQID0gdGhpc1A7CisJCQkJaWYgKGRlbHRhID09IDApCS8qIGV4Y2VwdCB0aGlzIG9uZSAqLworCQkJCQlyZXR1cm4gYmVzdGNsazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBiZXN0Y2xrOworfQorCitzdGF0aWMgaW50CitnZXRNTlBfZG91YmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBwbGxfbGltcyAqcGxsX2xpbSwgaW50IGNsaywKKwkgICAgICBzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyAqYmVzdHB2KQoreworCS8qIEZpbmQgTSwgTiBhbmQgUCBmb3IgYSB0d28gc3RhZ2UgUExMCisJICoKKwkgKiBOb3RlIHRoYXQgc29tZSBiaW9zZXMgKE5WMzArKSBoYXZlIGxvb2t1cCB0YWJsZXMgb2YgcHJlY29tcHV0ZWQgTU5QCisJICogdmFsdWVzLCBidXQgd2UncmUgdG9vIGxhenkgdG8gdXNlIHRob3NlIGF0bQorCSAqCisJICogImNsayIgcGFyYW1ldGVyIGluIGtIegorCSAqIHJldHVybnMgY2FsY3VsYXRlZCBjbG9jaworCSAqLworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGNoaXBfdmVyc2lvbiA9IGRldl9wcml2LT52Ymlvcy0+Y2hpcF92ZXJzaW9uOworCWludCBtaW52Y28xID0gcGxsX2xpbS0+dmNvMS5taW5mcmVxLCBtYXh2Y28xID0gcGxsX2xpbS0+dmNvMS5tYXhmcmVxOworCWludCBtaW52Y28yID0gcGxsX2xpbS0+dmNvMi5taW5mcmVxLCBtYXh2Y28yID0gcGxsX2xpbS0+dmNvMi5tYXhmcmVxOworCWludCBtaW5VMSA9IHBsbF9saW0tPnZjbzEubWluX2lucHV0ZnJlcSwgbWluVTIgPSBwbGxfbGltLT52Y28yLm1pbl9pbnB1dGZyZXE7CisJaW50IG1heFUxID0gcGxsX2xpbS0+dmNvMS5tYXhfaW5wdXRmcmVxLCBtYXhVMiA9IHBsbF9saW0tPnZjbzIubWF4X2lucHV0ZnJlcTsKKwlpbnQgbWluTTEgPSBwbGxfbGltLT52Y28xLm1pbl9tLCBtYXhNMSA9IHBsbF9saW0tPnZjbzEubWF4X207CisJaW50IG1pbk4xID0gcGxsX2xpbS0+dmNvMS5taW5fbiwgbWF4TjEgPSBwbGxfbGltLT52Y28xLm1heF9uOworCWludCBtaW5NMiA9IHBsbF9saW0tPnZjbzIubWluX20sIG1heE0yID0gcGxsX2xpbS0+dmNvMi5tYXhfbTsKKwlpbnQgbWluTjIgPSBwbGxfbGltLT52Y28yLm1pbl9uLCBtYXhOMiA9IHBsbF9saW0tPnZjbzIubWF4X247CisJaW50IG1heGxvZzJQID0gcGxsX2xpbS0+bWF4X3VzYWJsZV9sb2cycDsKKwlpbnQgY3J5c3RhbCA9IHBsbF9saW0tPnJlZmNsazsKKwlib29sIGZpeGVkZ2FpbjIgPSAobWluTTIgPT0gbWF4TTIgJiYgbWluTjIgPT0gbWF4TjIpOworCWludCBNMSwgTjEsIE0yLCBOMiwgbG9nMlA7CisJaW50IGNsa1AsIGNhbGNjbGsxLCBjYWxjY2xrMiwgY2FsY2Nsa291dDsKKwlpbnQgZGVsdGEsIGJlc3RkZWx0YSA9IElOVF9NQVg7CisJaW50IGJlc3RjbGsgPSAwOworCisJaW50IHZjbzIgPSAobWF4dmNvMiAtIG1heHZjbzIvMjAwKSAvIDI7CisJZm9yIChsb2cyUCA9IDA7IGNsayAmJiBsb2cyUCA8IG1heGxvZzJQICYmIGNsayA8PSAodmNvMiA+PiBsb2cyUCk7IGxvZzJQKyspCisJCTsKKwljbGtQID0gY2xrIDw8IGxvZzJQOworCisJaWYgKG1heHZjbzIgPCBjbGsgKyBjbGsvMjAwKQkvKiArMC41JSAqLworCQltYXh2Y28yID0gY2xrICsgY2xrLzIwMDsKKworCWZvciAoTTEgPSBtaW5NMTsgTTEgPD0gbWF4TTE7IE0xKyspIHsKKwkJaWYgKGNyeXN0YWwvTTEgPCBtaW5VMSkKKwkJCXJldHVybiBiZXN0Y2xrOworCQlpZiAoY3J5c3RhbC9NMSA+IG1heFUxKQorCQkJY29udGludWU7CisKKwkJZm9yIChOMSA9IG1pbk4xOyBOMSA8PSBtYXhOMTsgTjErKykgeworCQkJY2FsY2NsazEgPSBjcnlzdGFsICogTjEgLyBNMTsKKwkJCWlmIChjYWxjY2xrMSA8IG1pbnZjbzEpCisJCQkJY29udGludWU7CisJCQlpZiAoY2FsY2NsazEgPiBtYXh2Y28xKQorCQkJCWJyZWFrOworCisJCQlmb3IgKE0yID0gbWluTTI7IE0yIDw9IG1heE0yOyBNMisrKSB7CisJCQkJaWYgKGNhbGNjbGsxL00yIDwgbWluVTIpCisJCQkJCWJyZWFrOworCQkJCWlmIChjYWxjY2xrMS9NMiA+IG1heFUyKQorCQkJCQljb250aW51ZTsKKworCQkJCS8qIGFkZCBjYWxjY2xrMS8yIHRvIHJvdW5kIGJldHRlciAqLworCQkJCU4yID0gKGNsa1AgKiBNMiArIGNhbGNjbGsxLzIpIC8gY2FsY2NsazE7CisJCQkJaWYgKE4yIDwgbWluTjIpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChOMiA+IG1heE4yKQorCQkJCQlicmVhazsKKworCQkJCWlmICghZml4ZWRnYWluMikgeworCQkJCQlpZiAoY2hpcF92ZXJzaW9uIDwgMHg2MCkKKwkJCQkJCWlmIChOMi9NMiA8IDQgfHwgTjIvTTIgPiAxMCkKKwkJCQkJCQljb250aW51ZTsKKworCQkJCQljYWxjY2xrMiA9IGNhbGNjbGsxICogTjIgLyBNMjsKKwkJCQkJaWYgKGNhbGNjbGsyIDwgbWludmNvMikKKwkJCQkJCWJyZWFrOworCQkJCQlpZiAoY2FsY2NsazIgPiBtYXh2Y28yKQorCQkJCQkJY29udGludWU7CisJCQkJfSBlbHNlCisJCQkJCWNhbGNjbGsyID0gY2FsY2NsazE7CisKKwkJCQljYWxjY2xrb3V0ID0gY2FsY2NsazIgPj4gbG9nMlA7CisJCQkJZGVsdGEgPSBhYnMoY2FsY2Nsa291dCAtIGNsayk7CisJCQkJLyogd2UgZG8gYW4gZXhoYXVzdGl2ZSBzZWFyY2ggcmF0aGVyIHRoYW4gdGVybWluYXRpbmcKKwkJCQkgKiBvbiBhbiBvcHRpbWFsaXR5IGNvbmRpdGlvbi4uLgorCQkJCSAqLworCQkJCWlmIChkZWx0YSA8IGJlc3RkZWx0YSkgeworCQkJCQliZXN0ZGVsdGEgPSBkZWx0YTsKKwkJCQkJYmVzdGNsayA9IGNhbGNjbGtvdXQ7CisJCQkJCWJlc3Rwdi0+TjEgPSBOMTsKKwkJCQkJYmVzdHB2LT5NMSA9IE0xOworCQkJCQliZXN0cHYtPk4yID0gTjI7CisJCQkJCWJlc3Rwdi0+TTIgPSBNMjsKKwkJCQkJYmVzdHB2LT5sb2cyUCA9IGxvZzJQOworCQkJCQlpZiAoZGVsdGEgPT0gMCkJLyogZXhjZXB0IHRoaXMgb25lICovCisJCQkJCQlyZXR1cm4gYmVzdGNsazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gYmVzdGNsazsKK30KKworaW50Citub3V2ZWF1X2NhbGNfcGxsX21ucChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgcGxsX2xpbXMgKnBsbF9saW0sIGludCBjbGssCisJCSAgICAgc3RydWN0IG5vdXZlYXVfcGxsX3ZhbHMgKnB2KQoreworCWludCBvdXRjbGs7CisKKwlpZiAoIXBsbF9saW0tPnZjbzIubWF4ZnJlcSkKKwkJb3V0Y2xrID0gZ2V0TU5QX3NpbmdsZShkZXYsIHBsbF9saW0sIGNsaywgcHYpOworCWVsc2UKKwkJb3V0Y2xrID0gZ2V0TU5QX2RvdWJsZShkZXYsIHBsbF9saW0sIGNsaywgcHYpOworCisJaWYgKCFvdXRjbGspCisJCU5WX0VSUk9SKGRldiwgIkNvdWxkIG5vdCBmaW5kIGEgY29tcGF0aWJsZSBzZXQgb2YgUExMIHZhbHVlc1xuIik7CisKKwlyZXR1cm4gb3V0Y2xrOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jaGFubmVsLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NoYW5uZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWFhOTcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jaGFubmVsLmMKQEAgLTAsMCArMSw0NjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFN0ZXBoYW5lIE1hcmNoZXNpbgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kbWEuaCIKKworc3RhdGljIGludAorbm91dmVhdV9jaGFubmVsX3B1c2hidWZfY3R4ZG1hX2luaXQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfYm8gKnBiID0gY2hhbi0+cHVzaGJ1Zl9ibzsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnB1c2hidWYgPSBOVUxMOworCXVpbnQzMl90IHN0YXJ0ID0gcGItPmJvLm1lbS5tbV9ub2RlLT5zdGFydCA8PCBQQUdFX1NISUZUOworCWludCByZXQ7CisKKwlpZiAocGItPmJvLm1lbS5tZW1fdHlwZSA9PSBUVE1fUExfVFQpIHsKKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfZ2FydF9kbWFfbmV3KGNoYW4sIDAsCisJCQkJCQkgIGRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9zaXplLAorCQkJCQkJICBOVl9ETUFfQUNDRVNTX1JPLCAmcHVzaGJ1ZiwKKwkJCQkJCSAgTlVMTCk7CisJCWNoYW4tPnB1c2hidWZfYmFzZSA9IHN0YXJ0OworCX0gZWxzZQorCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlICE9IE5WXzA0KSB7CisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoY2hhbiwgTlZfQ0xBU1NfRE1BX0lOX01FTU9SWSwgMCwKKwkJCQkJICAgICBkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemUsCisJCQkJCSAgICAgTlZfRE1BX0FDQ0VTU19STywKKwkJCQkJICAgICBOVl9ETUFfVEFSR0VUX1ZJRE1FTSwgJnB1c2hidWYpOworCQljaGFuLT5wdXNoYnVmX2Jhc2UgPSBzdGFydDsKKwl9IGVsc2UgeworCQkvKiBOVjA0IGNtZGJ1ZiBoYWNrLCBmcm9tIG9yaWdpbmFsIGRkeC4uIG5vdCBzdXJlIG9mIGl0J3MKKwkJICogZXhhY3QgcmVhc29uIGZvciBleGlzdGluZyA6KSAgUENJIGFjY2VzcyB0byBjbWRidWYgaW4KKwkJICogVlJBTS4KKwkJICovCisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoY2hhbiwgTlZfQ0xBU1NfRE1BX0lOX01FTU9SWSwKKwkJCQkJICAgICBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KGRldiwgMSksCisJCQkJCSAgICAgZGV2X3ByaXYtPmZiX2F2YWlsYWJsZV9zaXplLAorCQkJCQkgICAgIE5WX0RNQV9BQ0NFU1NfUk8sCisJCQkJCSAgICAgTlZfRE1BX1RBUkdFVF9QQ0ksICZwdXNoYnVmKTsKKwkJY2hhbi0+cHVzaGJ1Zl9iYXNlID0gc3RhcnQ7CisJfQorCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfcmVmX2FkZChkZXYsIGNoYW4sIDAsIHB1c2hidWYsICZjaGFuLT5wdXNoYnVmKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIHJlZmVyZW5jaW5nIHB1c2hidWYgY3R4ZG1hOiAlZFxuIiwgcmV0KTsKKwkJaWYgKHB1c2hidWYgIT0gZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19jdHhkbWEpCisJCQlub3V2ZWF1X2dwdW9ial9kZWwoZGV2LCAmcHVzaGJ1Zik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9ibyAqCitub3V2ZWF1X2NoYW5uZWxfdXNlcl9wdXNoYnVmX2FsbG9jKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5vdXZlYXVfYm8gKnB1c2hidWYgPSBOVUxMOworCWludCBsb2NhdGlvbiwgcmV0OworCisJaWYgKG5vdXZlYXVfdnJhbV9wdXNoYnVmKQorCQlsb2NhdGlvbiA9IFRUTV9QTF9GTEFHX1ZSQU07CisJZWxzZQorCQlsb2NhdGlvbiA9IFRUTV9QTF9GTEFHX1RUOworCisJcmV0ID0gbm91dmVhdV9ib19uZXcoZGV2LCBOVUxMLCA2NTUzNiwgMCwgbG9jYXRpb24sIDAsIDB4MDAwMCwgZmFsc2UsCisJCQkgICAgIHRydWUsICZwdXNoYnVmKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgImVycm9yIGFsbG9jYXRpbmcgRE1BIHB1c2ggYnVmZmVyOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0ID0gbm91dmVhdV9ib19waW4ocHVzaGJ1ZiwgbG9jYXRpb24pOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiZXJyb3IgcGlubmluZyBETUEgcHVzaCBidWZmZXI6ICVkXG4iLCByZXQpOworCQlub3V2ZWF1X2JvX3JlZihOVUxMLCAmcHVzaGJ1Zik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBwdXNoYnVmOworfQorCisvKiBhbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIGEgZmlmbyBmb3IgdXNlciBzcGFjZSBjb25zdW1wdGlvbiAqLworaW50Citub3V2ZWF1X2NoYW5uZWxfYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKmNoYW5fcmV0LAorCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJICAgICAgdWludDMyX3QgdnJhbV9oYW5kbGUsIHVpbnQzMl90IHR0X2hhbmRsZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOworCXN0cnVjdCBub3V2ZWF1X2ZpZm9fZW5naW5lICpwZmlmbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmZpZm87CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbjsKKwlpbnQgY2hhbm5lbCwgdXNlcjsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBBbHJpZ2h0LCBoZXJlIGlzIHRoZSBmdWxsIHN0b3J5CisJICogTnZpZGlhIGNhcmRzIGhhdmUgbXVsdGlwbGUgaHcgZmlmbyBjb250ZXh0cyAocHJhaXNlIHRoZW0gZm9yIHRoYXQsCisJICogbm8gY29tcGxpY2F0ZWQgY3Jhc2gtcHJvbmUgY29udGV4dCBzd2l0Y2hlcykKKwkgKiBXZSBhbGxvY2F0ZSBhIG5ldyBjb250ZXh0IGZvciBlYWNoIGFwcCBhbmQgbGV0IGl0IHdyaXRlIHRvIGl0CisJICogZGlyZWN0bHkgKHdvbywgZnVsbCB1c2Vyc3BhY2UgY29tbWFuZCBzdWJtaXNzaW9uICEpCisJICogV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBjb250ZXh0cywgeW91IGxvc3QKKwkgKi8KKwlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgcGZpZm8tPmNoYW5uZWxzOyBjaGFubmVsKyspIHsKKwkJaWYgKGRldl9wcml2LT5maWZvc1tjaGFubmVsXSA9PSBOVUxMKQorCQkJYnJlYWs7CisJfQorCisJLyogbm8gbW9yZSBmaWZvcy4geW91IGxvc3QuICovCisJaWYgKGNoYW5uZWwgPT0gcGZpZm8tPmNoYW5uZWxzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldl9wcml2LT5maWZvc1tjaGFubmVsXSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwpLAorCQkJCQkgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldl9wcml2LT5maWZvc1tjaGFubmVsXSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZGV2X3ByaXYtPmZpZm9fYWxsb2NfY291bnQrKzsKKwljaGFuID0gZGV2X3ByaXYtPmZpZm9zW2NoYW5uZWxdOworCUlOSVRfTElTVF9IRUFEKCZjaGFuLT5udnN3LnZibF93YWl0KTsKKwlJTklUX0xJU1RfSEVBRCgmY2hhbi0+ZmVuY2UucGVuZGluZyk7CisJY2hhbi0+ZGV2ID0gZGV2OworCWNoYW4tPmlkID0gY2hhbm5lbDsKKwljaGFuLT5maWxlX3ByaXYgPSBmaWxlX3ByaXY7CisJY2hhbi0+dnJhbV9oYW5kbGUgPSB2cmFtX2hhbmRsZTsKKwljaGFuLT5nYXJ0X2hhbmRsZSA9IHR0X2hhbmRsZTsKKworCU5WX0lORk8oZGV2LCAiQWxsb2NhdGluZyBGSUZPIG51bWJlciAlZFxuIiwgY2hhbm5lbCk7CisKKwkvKiBBbGxvY2F0ZSBETUEgcHVzaCBidWZmZXIgKi8KKwljaGFuLT5wdXNoYnVmX2JvID0gbm91dmVhdV9jaGFubmVsX3VzZXJfcHVzaGJ1Zl9hbGxvYyhkZXYpOworCWlmICghY2hhbi0+cHVzaGJ1Zl9ibykgeworCQlyZXQgPSAtRU5PTUVNOworCQlOVl9FUlJPUihkZXYsICJwdXNoYnVmICVkXG4iLCByZXQpOworCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShjaGFuKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBMb2NhdGUgY2hhbm5lbCdzIHVzZXIgY29udHJvbCByZWdzICovCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl80MCkKKwkJdXNlciA9IE5WMDNfVVNFUihjaGFubmVsKTsKKwllbHNlCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkKKwkJdXNlciA9IE5WNDBfVVNFUihjaGFubmVsKTsKKwllbHNlCisJCXVzZXIgPSBOVjUwX1VTRVIoY2hhbm5lbCk7CisKKwljaGFuLT51c2VyID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAwKSArIHVzZXIsCisJCQkJCQkJCVBBR0VfU0laRSk7CisJaWYgKCFjaGFuLT51c2VyKSB7CisJCU5WX0VSUk9SKGRldiwgImlvcmVtYXAgb2YgcmVncyBmYWlsZWQuXG4iKTsKKwkJbm91dmVhdV9jaGFubmVsX2ZyZWUoY2hhbik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljaGFuLT51c2VyX3B1dCA9IDB4NDA7CisJY2hhbi0+dXNlcl9nZXQgPSAweDQ0OworCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHBlci1jaGFubmVsIGZpeGVkIG5vdGlmaWVyIG1lbW9yeSAqLworCXJldCA9IG5vdXZlYXVfbm90aWZpZXJfaW5pdF9jaGFubmVsKGNoYW4pOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAibnRmeSAlZFxuIiwgcmV0KTsKKwkJbm91dmVhdV9jaGFubmVsX2ZyZWUoY2hhbik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogU2V0dXAgY2hhbm5lbCdzIGRlZmF1bHQgb2JqZWN0cyAqLworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2NoYW5uZWxfaW5pdChjaGFuLCB2cmFtX2hhbmRsZSwgdHRfaGFuZGxlKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgImdwdW9iaiAlZFxuIiwgcmV0KTsKKwkJbm91dmVhdV9jaGFubmVsX2ZyZWUoY2hhbik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogQ3JlYXRlIGEgZG1hIG9iamVjdCBmb3IgdGhlIHB1c2ggYnVmZmVyICovCisJcmV0ID0gbm91dmVhdV9jaGFubmVsX3B1c2hidWZfY3R4ZG1hX2luaXQoY2hhbik7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJwYmN0eGRtYSAlZFxuIiwgcmV0KTsKKwkJbm91dmVhdV9jaGFubmVsX2ZyZWUoY2hhbik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogZGlzYWJsZSB0aGUgZmlmbyBjYWNoZXMgKi8KKwlwZmlmby0+cmVhc3NpZ24oZGV2LCBmYWxzZSk7CisKKwkvKiBDcmVhdGUgYSBncmFwaGljcyBjb250ZXh0IGZvciBuZXcgY2hhbm5lbCAqLworCXJldCA9IHBncmFwaC0+Y3JlYXRlX2NvbnRleHQoY2hhbik7CisJaWYgKHJldCkgeworCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShjaGFuKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBDb25zdHJ1Y3QgaW5pdGFsIFJBTUZDIGZvciBuZXcgY2hhbm5lbCAqLworCXJldCA9IHBmaWZvLT5jcmVhdGVfY29udGV4dChjaGFuKTsKKwlpZiAocmV0KSB7CisJCW5vdXZlYXVfY2hhbm5lbF9mcmVlKGNoYW4pOworCQlyZXR1cm4gcmV0OworCX0KKworCXBmaWZvLT5yZWFzc2lnbihkZXYsIHRydWUpOworCisJcmV0ID0gbm91dmVhdV9kbWFfaW5pdChjaGFuKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gbm91dmVhdV9mZW5jZV9pbml0KGNoYW4pOworCWlmIChyZXQpIHsKKwkJbm91dmVhdV9jaGFubmVsX2ZyZWUoY2hhbik7CisJCXJldHVybiByZXQ7CisJfQorCisJbm91dmVhdV9kZWJ1Z2ZzX2NoYW5uZWxfaW5pdChjaGFuKTsKKworCU5WX0lORk8oZGV2LCAiJXM6IGluaXRpYWxpc2VkIEZJRk8gJWRcbiIsIF9fZnVuY19fLCBjaGFubmVsKTsKKwkqY2hhbl9yZXQgPSBjaGFuOworCXJldHVybiAwOworfQorCitpbnQKK25vdXZlYXVfY2hhbm5lbF9pZGxlKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2VuZ2luZSAqZW5naW5lID0gJmRldl9wcml2LT5lbmdpbmU7CisJdWludDMyX3QgY2FjaGVzOworCWludCBpZGxlOworCisJaWYgKCFjaGFuKSB7CisJCU5WX0VSUk9SKGRldiwgIm5vIGNoYW5uZWwuLi5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwljYWNoZXMgPSBudl9yZDMyKGRldiwgTlYwM19QRklGT19DQUNIRVMpOworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFUywgY2FjaGVzICYgfjEpOworCisJaWYgKGVuZ2luZS0+Zmlmby5jaGFubmVsX2lkKGRldikgIT0gY2hhbi0+aWQpIHsKKwkJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpyYW1mYyA9CisJCQljaGFuLT5yYW1mYyA/IGNoYW4tPnJhbWZjLT5ncHVvYmogOiBOVUxMOworCisJCWlmICghcmFtZmMpIHsKKwkJCU5WX0VSUk9SKGRldiwgIk5vIFJBTUZDIGZvciBjaGFubmVsICVkXG4iLCBjaGFuLT5pZCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWVuZ2luZS0+aW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIGZhbHNlKTsKKwkJaWYgKG52X3JvMzIoZGV2LCByYW1mYywgMCkgIT0gbnZfcm8zMihkZXYsIHJhbWZjLCAxKSkKKwkJCWlkbGUgPSAwOworCQllbHNlCisJCQlpZGxlID0gMTsKKwkJZW5naW5lLT5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKwl9IGVsc2UgeworCQlpZGxlID0gKG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfR0VUKSA9PQorCQkJbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVQpKTsKKwl9CisKKwludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRVMsIGNhY2hlcyk7CisJcmV0dXJuIGlkbGU7Cit9CisKKy8qIHN0b3BzIGEgZmlmbyAqLwordm9pZAorbm91dmVhdV9jaGFubmVsX2ZyZWUoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisJc3RydWN0IG5vdXZlYXVfZmlmb19lbmdpbmUgKnBmaWZvID0gJmRldl9wcml2LT5lbmdpbmUuZmlmbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlOVl9JTkZPKGRldiwgIiVzOiBmcmVlaW5nIGZpZm8gJWRcbiIsIF9fZnVuY19fLCBjaGFuLT5pZCk7CisKKwlub3V2ZWF1X2RlYnVnZnNfY2hhbm5lbF9maW5pKGNoYW4pOworCisJLyogR2l2ZSBvdXRzdGFuZGluZyBwdXNoIGJ1ZmZlcnMgYSBjaGFuY2UgdG8gY29tcGxldGUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+ZmVuY2UubG9jaywgZmxhZ3MpOworCW5vdXZlYXVfZmVuY2VfdXBkYXRlKGNoYW4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmZlbmNlLmxvY2ssIGZsYWdzKTsKKwlpZiAoY2hhbi0+ZmVuY2Uuc2VxdWVuY2UgIT0gY2hhbi0+ZmVuY2Uuc2VxdWVuY2VfYWNrKSB7CisJCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZSA9IE5VTEw7CisKKwkJcmV0ID0gbm91dmVhdV9mZW5jZV9uZXcoY2hhbiwgJmZlbmNlLCB0cnVlKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlyZXQgPSBub3V2ZWF1X2ZlbmNlX3dhaXQoZmVuY2UsIE5VTEwsIGZhbHNlLCBmYWxzZSk7CisJCQlub3V2ZWF1X2ZlbmNlX3VucmVmKCh2b2lkICopJmZlbmNlKTsKKwkJfQorCisJCWlmIChyZXQpCisJCQlOVl9FUlJPUihkZXYsICJGYWlsZWQgdG8gaWRsZSBjaGFubmVsICVkLlxuIiwgY2hhbi0+aWQpOworCX0KKworCS8qIEVuc3VyZSBhbGwgb3V0c3RhbmRpbmcgZmVuY2VzIGFyZSBzaWduYWxlZC4gIFRoZXkgc2hvdWxkIGJlIGlmIHRoZQorCSAqIGFib3ZlIGF0dGVtcHRzIGF0IGlkbGluZyB3ZXJlIE9LLCBidXQgaWYgd2UgZmFpbGVkIHRoaXMnbGwgdGVsbCBUVE0KKwkgKiB3ZSdyZSBkb25lIHdpdGggdGhlIGJ1ZmZlcnMuCisJICovCisJbm91dmVhdV9mZW5jZV9maW5pKGNoYW4pOworCisJLyogRW5zdXJlIHRoZSBjaGFubmVsIGlzIG5vIGxvbmdlciBhY3RpdmUgb24gdGhlIEdQVSAqLworCXBmaWZvLT5yZWFzc2lnbihkZXYsIGZhbHNlKTsKKworCWlmIChwZ3JhcGgtPmNoYW5uZWwoZGV2KSA9PSBjaGFuKSB7CisJCXBncmFwaC0+Zmlmb19hY2Nlc3MoZGV2LCBmYWxzZSk7CisJCXBncmFwaC0+dW5sb2FkX2NvbnRleHQoZGV2KTsKKwkJcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIHRydWUpOworCX0KKwlwZ3JhcGgtPmRlc3Ryb3lfY29udGV4dChjaGFuKTsKKworCWlmIChwZmlmby0+Y2hhbm5lbF9pZChkZXYpID09IGNoYW4tPmlkKSB7CisJCXBmaWZvLT5kaXNhYmxlKGRldik7CisJCXBmaWZvLT51bmxvYWRfY29udGV4dChkZXYpOworCQlwZmlmby0+ZW5hYmxlKGRldik7CisJfQorCXBmaWZvLT5kZXN0cm95X2NvbnRleHQoY2hhbik7CisKKwlwZmlmby0+cmVhc3NpZ24oZGV2LCB0cnVlKTsKKworCS8qIFJlbGVhc2UgdGhlIGNoYW5uZWwncyByZXNvdXJjZXMgKi8KKwlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJmNoYW4tPnB1c2hidWYpOworCWlmIChjaGFuLT5wdXNoYnVmX2JvKSB7CisJCW5vdXZlYXVfYm9fdW5waW4oY2hhbi0+cHVzaGJ1Zl9ibyk7CisJCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZjaGFuLT5wdXNoYnVmX2JvKTsKKwl9CisJbm91dmVhdV9ncHVvYmpfY2hhbm5lbF90YWtlZG93bihjaGFuKTsKKwlub3V2ZWF1X25vdGlmaWVyX3Rha2Vkb3duX2NoYW5uZWwoY2hhbik7CisJaWYgKGNoYW4tPnVzZXIpCisJCWlvdW5tYXAoY2hhbi0+dXNlcik7CisKKwlkZXZfcHJpdi0+Zmlmb3NbY2hhbi0+aWRdID0gTlVMTDsKKwlkZXZfcHJpdi0+Zmlmb19hbGxvY19jb3VudC0tOworCWtmcmVlKGNoYW4pOworfQorCisvKiBjbGVhbnMgdXAgYWxsIHRoZSBmaWZvcyBmcm9tIGZpbGVfcHJpdiAqLwordm9pZAorbm91dmVhdV9jaGFubmVsX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmdpbmUgKmVuZ2luZSA9ICZkZXZfcHJpdi0+ZW5naW5lOworCWludCBpOworCisJTlZfREVCVUcoZGV2LCAiY2xlYXJpbmcgRklGTyBlbmFibGVzIGZyb20gZmlsZV9wcml2XG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgZW5naW5lLT5maWZvLmNoYW5uZWxzOyBpKyspIHsKKwkJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5maWZvc1tpXTsKKworCQlpZiAoY2hhbiAmJiBjaGFuLT5maWxlX3ByaXYgPT0gZmlsZV9wcml2KQorCQkJbm91dmVhdV9jaGFubmVsX2ZyZWUoY2hhbik7CisJfQorfQorCitpbnQKK25vdXZlYXVfY2hhbm5lbF9vd25lcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJICAgICAgaW50IGNoYW5uZWwpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmdpbmUgKmVuZ2luZSA9ICZkZXZfcHJpdi0+ZW5naW5lOworCisJaWYgKGNoYW5uZWwgPj0gZW5naW5lLT5maWZvLmNoYW5uZWxzKQorCQlyZXR1cm4gMDsKKwlpZiAoZGV2X3ByaXYtPmZpZm9zW2NoYW5uZWxdID09IE5VTEwpCisJCXJldHVybiAwOworCisJcmV0dXJuIChkZXZfcHJpdi0+Zmlmb3NbY2hhbm5lbF0tPmZpbGVfcHJpdiA9PSBmaWxlX3ByaXYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGlvY3RscyB3cmFwcGluZyB0aGUgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK25vdXZlYXVfaW9jdGxfZmlmb19hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9ub3V2ZWF1X2NoYW5uZWxfYWxsb2MgKmluaXQgPSBkYXRhOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CisJaW50IHJldDsKKworCU5PVVZFQVVfQ0hFQ0tfSU5JVElBTElTRURfV0lUSF9SRVRVUk47CisKKwlpZiAoZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC5hY2NlbF9ibG9ja2VkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChpbml0LT5mYl9jdHhkbWFfaGFuZGxlID09IH4wIHx8IGluaXQtPnR0X2N0eGRtYV9oYW5kbGUgPT0gfjApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gbm91dmVhdV9jaGFubmVsX2FsbG9jKGRldiwgJmNoYW4sIGZpbGVfcHJpdiwKKwkJCQkgICAgaW5pdC0+ZmJfY3R4ZG1hX2hhbmRsZSwKKwkJCQkgICAgaW5pdC0+dHRfY3R4ZG1hX2hhbmRsZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlpbml0LT5jaGFubmVsICA9IGNoYW4tPmlkOworCisJaW5pdC0+c3ViY2hhblswXS5oYW5kbGUgPSBOdk0yTUY7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkKKwkJaW5pdC0+c3ViY2hhblswXS5ncmNsYXNzID0gMHgwMDM5OworCWVsc2UKKwkJaW5pdC0+c3ViY2hhblswXS5ncmNsYXNzID0gMHg1MDM5OworCWluaXQtPm5yX3N1YmNoYW4gPSAxOworCisJLyogTmFtZWQgbWVtb3J5IG9iamVjdCBhcmVhICovCisJcmV0ID0gZHJtX2dlbV9oYW5kbGVfY3JlYXRlKGZpbGVfcHJpdiwgY2hhbi0+bm90aWZpZXJfYm8tPmdlbSwKKwkJCQkgICAgJmluaXQtPm5vdGlmaWVyX2hhbmRsZSk7CisJaWYgKHJldCkgeworCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShjaGFuKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbm91dmVhdV9pb2N0bF9maWZvX2ZyZWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9jaGFubmVsX2ZyZWUgKmNmcmVlID0gZGF0YTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOworCisJTk9VVkVBVV9DSEVDS19JTklUSUFMSVNFRF9XSVRIX1JFVFVSTjsKKwlOT1VWRUFVX0dFVF9VU0VSX0NIQU5ORUxfV0lUSF9SRVRVUk4oY2ZyZWUtPmNoYW5uZWwsIGZpbGVfcHJpdiwgY2hhbik7CisKKwlub3V2ZWF1X2NoYW5uZWxfZnJlZShjaGFuKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmaW5hbGx5LCB0aGUgaW9jdGwgdGFibGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGRybV9pb2N0bF9kZXNjIG5vdXZlYXVfaW9jdGxzW10gPSB7CisJRFJNX0lPQ1RMX0RFRihEUk1fTk9VVkVBVV9DQVJEX0lOSVQsIG5vdXZlYXVfaW9jdGxfY2FyZF9pbml0LCBEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRihEUk1fTk9VVkVBVV9HRVRQQVJBTSwgbm91dmVhdV9pb2N0bF9nZXRwYXJhbSwgRFJNX0FVVEgpLAorCURSTV9JT0NUTF9ERUYoRFJNX05PVVZFQVVfU0VUUEFSQU0sIG5vdXZlYXVfaW9jdGxfc2V0cGFyYW0sIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWSksCisJRFJNX0lPQ1RMX0RFRihEUk1fTk9VVkVBVV9DSEFOTkVMX0FMTE9DLCBub3V2ZWF1X2lvY3RsX2ZpZm9fYWxsb2MsIERSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGKERSTV9OT1VWRUFVX0NIQU5ORUxfRlJFRSwgbm91dmVhdV9pb2N0bF9maWZvX2ZyZWUsIERSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGKERSTV9OT1VWRUFVX0dST0JKX0FMTE9DLCBub3V2ZWF1X2lvY3RsX2dyb2JqX2FsbG9jLCBEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRihEUk1fTk9VVkVBVV9OT1RJRklFUk9CSl9BTExPQywgbm91dmVhdV9pb2N0bF9ub3RpZmllcl9hbGxvYywgRFJNX0FVVEgpLAorCURSTV9JT0NUTF9ERUYoRFJNX05PVVZFQVVfR1BVT0JKX0ZSRUUsIG5vdXZlYXVfaW9jdGxfZ3B1b2JqX2ZyZWUsIERSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGKERSTV9OT1VWRUFVX0dFTV9ORVcsIG5vdXZlYXVfZ2VtX2lvY3RsX25ldywgRFJNX0FVVEgpLAorCURSTV9JT0NUTF9ERUYoRFJNX05PVVZFQVVfR0VNX1BVU0hCVUYsIG5vdXZlYXVfZ2VtX2lvY3RsX3B1c2hidWYsIERSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGKERSTV9OT1VWRUFVX0dFTV9QVVNIQlVGX0NBTEwsIG5vdXZlYXVfZ2VtX2lvY3RsX3B1c2hidWZfY2FsbCwgRFJNX0FVVEgpLAorCURSTV9JT0NUTF9ERUYoRFJNX05PVVZFQVVfR0VNX1BJTiwgbm91dmVhdV9nZW1faW9jdGxfcGluLCBEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRihEUk1fTk9VVkVBVV9HRU1fVU5QSU4sIG5vdXZlYXVfZ2VtX2lvY3RsX3VucGluLCBEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRihEUk1fTk9VVkVBVV9HRU1fQ1BVX1BSRVAsIG5vdXZlYXVfZ2VtX2lvY3RsX2NwdV9wcmVwLCBEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRihEUk1fTk9VVkVBVV9HRU1fQ1BVX0ZJTkksIG5vdXZlYXVfZ2VtX2lvY3RsX2NwdV9maW5pLCBEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRihEUk1fTk9VVkVBVV9HRU1fSU5GTywgbm91dmVhdV9nZW1faW9jdGxfaW5mbywgRFJNX0FVVEgpLAorCURSTV9JT0NUTF9ERUYoRFJNX05PVVZFQVVfR0VNX1BVU0hCVUZfQ0FMTDIsIG5vdXZlYXVfZ2VtX2lvY3RsX3B1c2hidWZfY2FsbDIsIERSTV9BVVRIKSwKK307CisKK2ludCBub3V2ZWF1X21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKG5vdXZlYXVfaW9jdGxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY29ubmVjdG9yLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Nvbm5lY3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMmNmMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Nvbm5lY3Rvci5jCkBAIC0wLDAgKzEsODI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1hYXJ0ZW4gTWFhdGh1aXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9lZGlkLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisjaW5jbHVkZSAibm91dmVhdV9yZWcuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZW5jb2Rlci5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY3J0Yy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY29ubmVjdG9yLmgiCisjaW5jbHVkZSAibm91dmVhdV9ody5oIgorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkcm1fZW5jb2Rlcl9zbGF2ZV9mdW5jcyAqCitnZXRfc2xhdmVfZnVuY3Moc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqZW5jKQoreworCXJldHVybiB0b19lbmNvZGVyX3NsYXZlKHRvX2RybV9lbmNvZGVyKGVuYykpLT5zbGF2ZV9mdW5jczsKK30KKworc3RhdGljIHN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKgorZmluZF9lbmNvZGVyX2J5X3R5cGUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgaW50IHR5cGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXI7CisJc3RydWN0IGRybV9tb2RlX29iamVjdCAqb2JqOworCWludCBpLCBpZDsKKworCWZvciAoaSA9IDA7IGkgPCBEUk1fQ09OTkVDVE9SX01BWF9FTkNPREVSOyBpKyspIHsKKwkJaWQgPSBjb25uZWN0b3ItPmVuY29kZXJfaWRzW2ldOworCQlpZiAoIWlkKQorCQkJYnJlYWs7CisKKwkJb2JqID0gZHJtX21vZGVfb2JqZWN0X2ZpbmQoZGV2LCBpZCwgRFJNX01PREVfT0JKRUNUX0VOQ09ERVIpOworCQlpZiAoIW9iaikKKwkJCWNvbnRpbnVlOworCQludl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKG9ial90b19lbmNvZGVyKG9iaikpOworCisJCWlmICh0eXBlID09IE9VVFBVVF9BTlkgfHwgbnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IHR5cGUpCisJCQlyZXR1cm4gbnZfZW5jb2RlcjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICoKK25vdXZlYXVfZW5jb2Rlcl9jb25uZWN0b3JfZ2V0KHN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHRvX2RybV9lbmNvZGVyKGVuY29kZXIpLT5kZXY7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmRybV9jb25uZWN0b3I7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRybV9jb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCWlmIChkcm1fY29ubmVjdG9yLT5lbmNvZGVyID09IHRvX2RybV9lbmNvZGVyKGVuY29kZXIpKQorCQkJcmV0dXJuIG5vdXZlYXVfY29ubmVjdG9yKGRybV9jb25uZWN0b3IpOworCX0KKworCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkCitub3V2ZWF1X2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpkcm1fY29ubmVjdG9yKQoreworCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqY29ubmVjdG9yID0gbm91dmVhdV9jb25uZWN0b3IoZHJtX2Nvbm5lY3Rvcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+YmFzZS5kZXY7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJaWYgKCFjb25uZWN0b3IpCisJCXJldHVybjsKKworCWRybV9zeXNmc19jb25uZWN0b3JfcmVtb3ZlKGRybV9jb25uZWN0b3IpOworCWRybV9jb25uZWN0b3JfY2xlYW51cChkcm1fY29ubmVjdG9yKTsKKwlrZnJlZShkcm1fY29ubmVjdG9yKTsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfY29ubmVjdG9yX2RkY19wcmVwYXJlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGludCAqZmxhZ3MpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY29ubmVjdG9yLT5kZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApCisJCXJldHVybjsKKworCSpmbGFncyA9IDA7CisJaWYgKE5WTG9ja1ZnYUNydGNzKGRldl9wcml2LT5kZXYsIGZhbHNlKSkKKwkJKmZsYWdzIHw9IDE7CisJaWYgKG52X2hlYWRzX3RpZWQoZGV2X3ByaXYtPmRldikpCisJCSpmbGFncyB8PSAyOworCisJaWYgKCpmbGFncyAmIDIpCisJCU5WU2V0T3duZXIoZGV2X3ByaXYtPmRldiwgMCk7IC8qIG5lY2Vzc2FyeT8gKi8KK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfY29ubmVjdG9yX2RkY19maW5pc2goc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgaW50IGZsYWdzKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNvbm5lY3Rvci0+ZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKQorCQlyZXR1cm47CisKKwlpZiAoZmxhZ3MgJiAyKQorCQlOVlNldE93bmVyKGRldl9wcml2LT5kZXYsIDQpOworCWlmIChmbGFncyAmIDEpCisJCU5WTG9ja1ZnYUNydGNzKGRldl9wcml2LT5kZXYsIHRydWUpOworfQorCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKgorbm91dmVhdV9jb25uZWN0b3JfZGRjX2RldGVjdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJICAgICBzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICoqcG52X2VuY29kZXIpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXVpbnQ4X3Qgb3V0X2J1ZltdID0geyAweDAsIDB4MH0sIGJ1ZlsyXTsKKwlpbnQgcmV0LCBmbGFncywgaTsKKworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKKwkJeworCQkJLmFkZHIgPSAweDUwLAorCQkJLmZsYWdzID0gMCwKKwkJCS5sZW4gPSAxLAorCQkJLmJ1ZiA9IG91dF9idWYsCisJCX0sCisJCXsKKwkJCS5hZGRyID0gMHg1MCwKKwkJCS5mbGFncyA9IEkyQ19NX1JELAorCQkJLmxlbiA9IDEsCisJCQkuYnVmID0gYnVmLAorCQl9CisJfTsKKworCWZvciAoaSA9IDA7IGkgPCBEUk1fQ09OTkVDVE9SX01BWF9FTkNPREVSOyBpKyspIHsKKwkJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmkyYyA9IE5VTEw7CisJCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXI7CisJCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm9iajsKKwkJaW50IGlkOworCisJCWlkID0gY29ubmVjdG9yLT5lbmNvZGVyX2lkc1tpXTsKKwkJaWYgKCFpZCkKKwkJCWJyZWFrOworCisJCW9iaiA9IGRybV9tb2RlX29iamVjdF9maW5kKGRldiwgaWQsIERSTV9NT0RFX09CSkVDVF9FTkNPREVSKTsKKwkJaWYgKCFvYmopCisJCQljb250aW51ZTsKKwkJbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihvYmpfdG9fZW5jb2RlcihvYmopKTsKKworCQlpZiAobnZfZW5jb2Rlci0+ZGNiLT5pMmNfaW5kZXggPCAweGYpCisJCQlpMmMgPSBub3V2ZWF1X2kyY19maW5kKGRldiwgbnZfZW5jb2Rlci0+ZGNiLT5pMmNfaW5kZXgpOworCQlpZiAoIWkyYykKKwkJCWNvbnRpbnVlOworCisJCW5vdXZlYXVfY29ubmVjdG9yX2RkY19wcmVwYXJlKGNvbm5lY3RvciwgJmZsYWdzKTsKKwkJcmV0ID0gaTJjX3RyYW5zZmVyKCZpMmMtPmFkYXB0ZXIsIG1zZ3MsIDIpOworCQlub3V2ZWF1X2Nvbm5lY3Rvcl9kZGNfZmluaXNoKGNvbm5lY3RvciwgZmxhZ3MpOworCisJCWlmIChyZXQgPT0gMikgeworCQkJKnBudl9lbmNvZGVyID0gbnZfZW5jb2RlcjsKKwkJCXJldHVybiBpMmM7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfY29ubmVjdG9yX3NldF9lbmNvZGVyKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkgICAgICBzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyKQoreworCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0gbm91dmVhdV9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjb25uZWN0b3ItPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCisJaWYgKG52X2Nvbm5lY3Rvci0+ZGV0ZWN0ZWRfZW5jb2RlciA9PSBudl9lbmNvZGVyKQorCQlyZXR1cm47CisJbnZfY29ubmVjdG9yLT5kZXRlY3RlZF9lbmNvZGVyID0gbnZfZW5jb2RlcjsKKworCWlmIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX0xWRFMgfHwKKwkgICAgbnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IE9VVFBVVF9UTURTKSB7CisJCWNvbm5lY3Rvci0+ZG91Ymxlc2Nhbl9hbGxvd2VkID0gZmFsc2U7CisJCWNvbm5lY3Rvci0+aW50ZXJsYWNlX2FsbG93ZWQgPSBmYWxzZTsKKwl9IGVsc2UgeworCQljb25uZWN0b3ItPmRvdWJsZXNjYW5fYWxsb3dlZCA9IHRydWU7CisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzIwIHx8CisJCSAgIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzEwICYmCisJCSAgICAoZGV2LT5wY2lfZGV2aWNlICYgMHgwZmYwKSAhPSAweDAxMDAgJiYKKwkJICAgIChkZXYtPnBjaV9kZXZpY2UgJiAweDBmZjApICE9IDB4MDE1MCkpCisJCQkvKiBIVyBpcyBicm9rZW4gKi8KKwkJCWNvbm5lY3Rvci0+aW50ZXJsYWNlX2FsbG93ZWQgPSBmYWxzZTsKKwkJZWxzZQorCQkJY29ubmVjdG9yLT5pbnRlcmxhY2VfYWxsb3dlZCA9IHRydWU7CisJfQorCisJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUkpIHsKKwkJZHJtX2Nvbm5lY3Rvcl9wcm9wZXJ0eV9zZXRfdmFsdWUoY29ubmVjdG9yLAorCQkJZGV2LT5tb2RlX2NvbmZpZy5kdmlfaV9zdWJjb25uZWN0b3JfcHJvcGVydHksCisJCQludl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX1RNRFMgPworCQkJRFJNX01PREVfU1VCQ09OTkVDVE9SX0RWSUQgOgorCQkJRFJNX01PREVfU1VCQ09OTkVDVE9SX0RWSUEpOworCX0KK30KKworc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMKK25vdXZlYXVfY29ubmVjdG9yX2RldGVjdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvciA9IG5vdXZlYXVfY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IE5VTEw7CisJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmkyYzsKKwlpbnQgdHlwZSwgZmxhZ3M7CisKKwlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUykKKwkJbnZfZW5jb2RlciA9IGZpbmRfZW5jb2Rlcl9ieV90eXBlKGNvbm5lY3RvciwgT1VUUFVUX0xWRFMpOworCWlmIChudl9lbmNvZGVyICYmIG52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGUpIHsKKwkJbm91dmVhdV9jb25uZWN0b3Jfc2V0X2VuY29kZXIoY29ubmVjdG9yLCBudl9lbmNvZGVyKTsKKwkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCX0KKworCWkyYyA9IG5vdXZlYXVfY29ubmVjdG9yX2RkY19kZXRlY3QoY29ubmVjdG9yLCAmbnZfZW5jb2Rlcik7CisJaWYgKGkyYykgeworCQlub3V2ZWF1X2Nvbm5lY3Rvcl9kZGNfcHJlcGFyZShjb25uZWN0b3IsICZmbGFncyk7CisJCW52X2Nvbm5lY3Rvci0+ZWRpZCA9IGRybV9nZXRfZWRpZChjb25uZWN0b3IsICZpMmMtPmFkYXB0ZXIpOworCQlub3V2ZWF1X2Nvbm5lY3Rvcl9kZGNfZmluaXNoKGNvbm5lY3RvciwgZmxhZ3MpOworCQlkcm1fbW9kZV9jb25uZWN0b3JfdXBkYXRlX2VkaWRfcHJvcGVydHkoY29ubmVjdG9yLAorCQkJCQkJCW52X2Nvbm5lY3Rvci0+ZWRpZCk7CisJCWlmICghbnZfY29ubmVjdG9yLT5lZGlkKSB7CisJCQlOVl9FUlJPUihkZXYsICJEREMgcmVzcG9uZGVkLCBidXQgbm8gRURJRCBmb3IgJXNcbiIsCisJCQkJIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CisJCX0KKworCQlpZiAobnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IE9VVFBVVF9EUCAmJgorCQkgICAgIW5vdXZlYXVfZHBfZGV0ZWN0KHRvX2RybV9lbmNvZGVyKG52X2VuY29kZXIpKSkgeworCQkJTlZfRVJST1IoZGV2LCAiRGV0ZWN0ZWQgJXMsIGJ1dCBmYWlsZWQgaW5pdFxuIiwKKwkJCQkgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKwkJfQorCisJCS8qIE92ZXJyaWRlIGVuY29kZXIgdHlwZSBmb3IgRFZJLUkgYmFzZWQgb24gd2hldGhlciBFRElECisJCSAqIHNheXMgdGhlIGRpc3BsYXkgaXMgZGlnaXRhbCBvciBhbmFsb2csIGJvdGggdXNlIHRoZQorCQkgKiBzYW1lIGkyYyBjaGFubmVsIHNvIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGRkY19kZXRlY3QKKwkJICogaXNuJ3QgbmVjZXNzYXJpbHkgY29ycmVjdC4KKwkJICovCisJCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9EVklJKSB7CisJCQlpZiAobnZfY29ubmVjdG9yLT5lZGlkLT5pbnB1dCAmIERSTV9FRElEX0lOUFVUX0RJR0lUQUwpCisJCQkJdHlwZSA9IE9VVFBVVF9UTURTOworCQkJZWxzZQorCQkJCXR5cGUgPSBPVVRQVVRfQU5BTE9HOworCisJCQludl9lbmNvZGVyID0gZmluZF9lbmNvZGVyX2J5X3R5cGUoY29ubmVjdG9yLCB0eXBlKTsKKwkJCWlmICghbnZfZW5jb2RlcikgeworCQkJCU5WX0VSUk9SKGRldiwgIkRldGVjdGVkICVkIGVuY29kZXIgb24gJXMsICIKKwkJCQkJICAgICAgImJ1dCBubyBvYmplY3QhXG4iLCB0eXBlLAorCQkJCQkgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CisJCQl9CisJCX0KKworCQlub3V2ZWF1X2Nvbm5lY3Rvcl9zZXRfZW5jb2Rlcihjb25uZWN0b3IsIG52X2VuY29kZXIpOworCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJfQorCisJbnZfZW5jb2RlciA9IGZpbmRfZW5jb2Rlcl9ieV90eXBlKGNvbm5lY3RvciwgT1VUUFVUX0FOQUxPRyk7CisJaWYgKCFudl9lbmNvZGVyKQorCQludl9lbmNvZGVyID0gZmluZF9lbmNvZGVyX2J5X3R5cGUoY29ubmVjdG9yLCBPVVRQVVRfVFYpOworCWlmIChudl9lbmNvZGVyKSB7CisJCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9IHRvX2RybV9lbmNvZGVyKG52X2VuY29kZXIpOworCQlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICpoZWxwZXIgPQorCQkJCQkJZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7CisKKwkJaWYgKGhlbHBlci0+ZGV0ZWN0KGVuY29kZXIsIGNvbm5lY3RvcikgPT0KKwkJCQkJCWNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkKSB7CisJCQlub3V2ZWF1X2Nvbm5lY3Rvcl9zZXRfZW5jb2Rlcihjb25uZWN0b3IsIG52X2VuY29kZXIpOworCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCQl9CisKKwl9CisKKwlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Cit9CisKK3N0YXRpYyB2b2lkCitub3V2ZWF1X2Nvbm5lY3Rvcl9mb3JjZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyOworCWludCB0eXBlOworCisJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUkpIHsKKwkJaWYgKGNvbm5lY3Rvci0+Zm9yY2UgPT0gRFJNX0ZPUkNFX09OX0RJR0lUQUwpCisJCQl0eXBlID0gT1VUUFVUX1RNRFM7CisJCWVsc2UKKwkJCXR5cGUgPSBPVVRQVVRfQU5BTE9HOworCX0gZWxzZQorCQl0eXBlID0gT1VUUFVUX0FOWTsKKworCW52X2VuY29kZXIgPSBmaW5kX2VuY29kZXJfYnlfdHlwZShjb25uZWN0b3IsIHR5cGUpOworCWlmICghbnZfZW5jb2RlcikgeworCQlOVl9FUlJPUihkZXYsICJjYW4ndCBmaW5kIGVuY29kZXIgdG8gZm9yY2UgJXMgb24hXG4iLAorCQkJIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJCWNvbm5lY3Rvci0+c3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CisJCXJldHVybjsKKwl9CisKKwlub3V2ZWF1X2Nvbm5lY3Rvcl9zZXRfZW5jb2Rlcihjb25uZWN0b3IsIG52X2VuY29kZXIpOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2Nvbm5lY3Rvcl9zZXRfcHJvcGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpwcm9wZXJ0eSwgdWludDY0X3QgdmFsdWUpCit7CisJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3IgPSBub3V2ZWF1X2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBudl9jb25uZWN0b3ItPmRldGVjdGVkX2VuY29kZXI7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCWludCByZXQ7CisKKwkvKiBTY2FsaW5nIG1vZGUgKi8KKwlpZiAocHJvcGVydHkgPT0gZGV2LT5tb2RlX2NvbmZpZy5zY2FsaW5nX21vZGVfcHJvcGVydHkpIHsKKwkJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IE5VTEw7CisJCWJvb2wgbW9kZXNldCA9IGZhbHNlOworCisJCXN3aXRjaCAodmFsdWUpIHsKKwkJY2FzZSBEUk1fTU9ERV9TQ0FMRV9OT05FOgorCQljYXNlIERSTV9NT0RFX1NDQUxFX0ZVTExTQ1JFRU46CisJCWNhc2UgRFJNX01PREVfU0NBTEVfQ0VOVEVSOgorCQljYXNlIERSTV9NT0RFX1NDQUxFX0FTUEVDVDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBMVkRTIGFsd2F5cyBuZWVkcyBncHUgc2NhbGluZyAqLworCQlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUyAmJgorCQkgICAgdmFsdWUgPT0gRFJNX01PREVfU0NBTEVfTk9ORSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIENoYW5naW5nIGJldHdlZW4gR1BVIGFuZCBwYW5lbCBzY2FsaW5nIHJlcXVpcmVzIGEgZnVsbAorCQkgKiBtb2Rlc2V0CisJCSAqLworCQlpZiAoKG52X2Nvbm5lY3Rvci0+c2NhbGluZ19tb2RlID09IERSTV9NT0RFX1NDQUxFX05PTkUpIHx8CisJCSAgICAodmFsdWUgPT0gRFJNX01PREVfU0NBTEVfTk9ORSkpCisJCQltb2Rlc2V0ID0gdHJ1ZTsKKwkJbnZfY29ubmVjdG9yLT5zY2FsaW5nX21vZGUgPSB2YWx1ZTsKKworCQlpZiAoY29ubmVjdG9yLT5lbmNvZGVyICYmIGNvbm5lY3Rvci0+ZW5jb2Rlci0+Y3J0YykKKwkJCW52X2NydGMgPSBub3V2ZWF1X2NydGMoY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjKTsKKwkJaWYgKCFudl9jcnRjKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKG1vZGVzZXQgfHwgIW52X2NydGMtPnNldF9zY2FsZSkgeworCQkJcmV0ID0gZHJtX2NydGNfaGVscGVyX3NldF9tb2RlKCZudl9jcnRjLT5iYXNlLAorCQkJCQkJCSZudl9jcnRjLT5iYXNlLm1vZGUsCisJCQkJCQkJbnZfY3J0Yy0+YmFzZS54LAorCQkJCQkJCW52X2NydGMtPmJhc2UueSwgTlVMTCk7CisJCQlpZiAoIXJldCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IG52X2NydGMtPnNldF9zY2FsZShudl9jcnRjLCB2YWx1ZSwgdHJ1ZSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBEaXRoZXJpbmcgKi8KKwlpZiAocHJvcGVydHkgPT0gZGV2LT5tb2RlX2NvbmZpZy5kaXRoZXJpbmdfbW9kZV9wcm9wZXJ0eSkgeworCQlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gTlVMTDsKKworCQlpZiAodmFsdWUgPT0gRFJNX01PREVfRElUSEVSSU5HX09OKQorCQkJbnZfY29ubmVjdG9yLT51c2VfZGl0aGVyaW5nID0gdHJ1ZTsKKwkJZWxzZQorCQkJbnZfY29ubmVjdG9yLT51c2VfZGl0aGVyaW5nID0gZmFsc2U7CisKKwkJaWYgKGNvbm5lY3Rvci0+ZW5jb2RlciAmJiBjb25uZWN0b3ItPmVuY29kZXItPmNydGMpCisJCQludl9jcnRjID0gbm91dmVhdV9jcnRjKGNvbm5lY3Rvci0+ZW5jb2Rlci0+Y3J0Yyk7CisKKwkJaWYgKCFudl9jcnRjIHx8ICFudl9jcnRjLT5zZXRfZGl0aGVyKQorCQkJcmV0dXJuIDA7CisKKwkJcmV0dXJuIG52X2NydGMtPnNldF9kaXRoZXIobnZfY3J0YywgbnZfY29ubmVjdG9yLT51c2VfZGl0aGVyaW5nLAorCQkJCQkgICB0cnVlKTsKKwl9CisKKwlpZiAobnZfZW5jb2RlciAmJiBudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX1RWKQorCQlyZXR1cm4gZ2V0X3NsYXZlX2Z1bmNzKG52X2VuY29kZXIpLT4KKwkJCXNldF9wcm9wZXJ0eSh0b19kcm1fZW5jb2Rlcihudl9lbmNvZGVyKSwgY29ubmVjdG9yLCBwcm9wZXJ0eSwgdmFsdWUpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqCitub3V2ZWF1X2Nvbm5lY3Rvcl9uYXRpdmVfbW9kZShzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwgKmxhcmdlc3QgPSBOVUxMOworCWludCBoaWdoX3cgPSAwLCBoaWdoX2ggPSAwLCBoaWdoX3YgPSAwOworCisJLyogVXNlIHByZWZlcnJlZCBtb2RlIGlmIHRoZXJlIGlzIG9uZS4uICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2RlLCAmY29ubmVjdG9yLT5iYXNlLnByb2JlZF9tb2RlcywgaGVhZCkgeworCQlpZiAobW9kZS0+dHlwZSAmIERSTV9NT0RFX1RZUEVfUFJFRkVSUkVEKSB7CisJCQlOVl9ERUJVRyhkZXYsICJuYXRpdmUgbW9kZSBmcm9tIHByZWZlcnJlZFxuIik7CisJCQlyZXR1cm4gZHJtX21vZGVfZHVwbGljYXRlKGRldiwgbW9kZSk7CisJCX0KKwl9CisKKwkvKiBPdGhlcndpc2UsIHRha2UgdGhlIHJlc29sdXRpb24gd2l0aCB0aGUgbGFyZ2VzdCB3aWR0aCwgdGhlbiBoZWlnaHQsCisJICogdGhlbiB2ZXJ0aWNhbCByZWZyZXNoCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2RlLCAmY29ubmVjdG9yLT5iYXNlLnByb2JlZF9tb2RlcywgaGVhZCkgeworCQlpZiAobW9kZS0+aGRpc3BsYXkgPCBoaWdoX3cpCisJCQljb250aW51ZTsKKworCQlpZiAobW9kZS0+aGRpc3BsYXkgPT0gaGlnaF93ICYmIG1vZGUtPnZkaXNwbGF5IDwgaGlnaF9oKQorCQkJY29udGludWU7CisKKwkJaWYgKG1vZGUtPmhkaXNwbGF5ID09IGhpZ2hfdyAmJiBtb2RlLT52ZGlzcGxheSA9PSBoaWdoX2ggJiYKKwkJICAgIG1vZGUtPnZyZWZyZXNoIDwgaGlnaF92KQorCQkJY29udGludWU7CisKKwkJaGlnaF93ID0gbW9kZS0+aGRpc3BsYXk7CisJCWhpZ2hfaCA9IG1vZGUtPnZkaXNwbGF5OworCQloaWdoX3YgPSBtb2RlLT52cmVmcmVzaDsKKwkJbGFyZ2VzdCA9IG1vZGU7CisJfQorCisJTlZfREVCVUcoZGV2LCAibmF0aXZlIG1vZGUgZnJvbSBsYXJnZXN0OiAlZHglZEAlZFxuIiwKKwkJICAgICAgaGlnaF93LCBoaWdoX2gsIGhpZ2hfdik7CisJcmV0dXJuIGxhcmdlc3QgPyBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCBsYXJnZXN0KSA6IE5VTEw7Cit9CisKK3N0cnVjdCBtb2RlcmVjIHsKKwlpbnQgaGRpc3BsYXk7CisJaW50IHZkaXNwbGF5OworfTsKKworc3RhdGljIHN0cnVjdCBtb2RlcmVjIHNjYWxlcl9tb2Rlc1tdID0geworCXsgMTkyMCwgMTIwMCB9LAorCXsgMTkyMCwgMTA4MCB9LAorCXsgMTY4MCwgMTA1MCB9LAorCXsgMTYwMCwgMTIwMCB9LAorCXsgMTQwMCwgMTA1MCB9LAorCXsgMTI4MCwgMTAyNCB9LAorCXsgMTI4MCwgOTYwIH0sCisJeyAxMTUyLCA4NjQgfSwKKwl7IDEwMjQsIDc2OCB9LAorCXsgODAwLCA2MDAgfSwKKwl7IDcyMCwgNDAwIH0sCisJeyA2NDAsIDQ4MCB9LAorCXsgNjQwLCA0MDAgfSwKKwl7IDY0MCwgMzUwIH0sCisJe30KK307CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfY29ubmVjdG9yX3NjYWxlcl9tb2Rlc19hZGQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvciA9IG5vdXZlYXVfY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm5hdGl2ZSA9IG52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGUsICptOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKKwlzdHJ1Y3QgbW9kZXJlYyAqbW9kZSA9ICZzY2FsZXJfbW9kZXNbMF07CisJaW50IG1vZGVzID0gMDsKKworCWlmICghbmF0aXZlKQorCQlyZXR1cm4gMDsKKworCXdoaWxlIChtb2RlLT5oZGlzcGxheSkgeworCQlpZiAobW9kZS0+aGRpc3BsYXkgPD0gbmF0aXZlLT5oZGlzcGxheSAmJgorCQkgICAgbW9kZS0+dmRpc3BsYXkgPD0gbmF0aXZlLT52ZGlzcGxheSkgeworCQkJbSA9IGRybV9jdnRfbW9kZShkZXYsIG1vZGUtPmhkaXNwbGF5LCBtb2RlLT52ZGlzcGxheSwKKwkJCQkJIGRybV9tb2RlX3ZyZWZyZXNoKG5hdGl2ZSksIGZhbHNlLAorCQkJCQkgZmFsc2UsIGZhbHNlKTsKKwkJCWlmICghbSkKKwkJCQljb250aW51ZTsKKworCQkJbS0+dHlwZSB8PSBEUk1fTU9ERV9UWVBFX0RSSVZFUjsKKworCQkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG0pOworCQkJbW9kZXMrKzsKKwkJfQorCisJCW1vZGUrKzsKKwl9CisKKwlyZXR1cm4gbW9kZXM7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfY29ubmVjdG9yX2dldF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvciA9IG5vdXZlYXVfY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG52X2Nvbm5lY3Rvci0+ZGV0ZWN0ZWRfZW5jb2RlcjsKKwlpbnQgcmV0ID0gMDsKKworCS8qIElmIHdlJ3JlIG5vdCBMVkRTLCBkZXN0cm95IHRoZSBwcmV2aW91cyBuYXRpdmUgbW9kZSwgdGhlIGF0dGFjaGVkCisJICogbW9uaXRvciBjb3VsZCBoYXZlIGNoYW5nZWQuCisJICovCisJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgIT0gRFJNX01PREVfQ09OTkVDVE9SX0xWRFMgJiYKKwkgICAgbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZSkgeworCQlkcm1fbW9kZV9kZXN0cm95KGRldiwgbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZSk7CisJCW52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGUgPSBOVUxMOworCX0KKworCWlmIChudl9jb25uZWN0b3ItPmVkaWQpCisJCXJldCA9IGRybV9hZGRfZWRpZF9tb2Rlcyhjb25uZWN0b3IsIG52X2Nvbm5lY3Rvci0+ZWRpZCk7CisKKwkvKiBGaW5kIHRoZSBuYXRpdmUgbW9kZSBpZiB0aGlzIGlzIGEgZGlnaXRhbCBwYW5lbCwgaWYgd2UgZGlkbid0CisJICogZmluZCBhbnkgbW9kZXMgdGhyb3VnaCBEREMgcHJldmlvdXNseSBhZGQgdGhlIG5hdGl2ZSBtb2RlIHRvCisJICogdGhlIGxpc3Qgb2YgbW9kZXMuCisJICovCisJaWYgKCFudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlKQorCQludl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlID0KKwkJCW5vdXZlYXVfY29ubmVjdG9yX25hdGl2ZV9tb2RlKG52X2Nvbm5lY3Rvcik7CisJaWYgKHJldCA9PSAwICYmIG52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGUpIHsKKwkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7CisKKwkJbW9kZSA9IGRybV9tb2RlX2R1cGxpY2F0ZShkZXYsIG52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGUpOworCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbW9kZSk7CisJCXJldCA9IDE7CisJfQorCisJaWYgKG52X2VuY29kZXItPmRjYi0+dHlwZSA9PSBPVVRQVVRfVFYpCisJCXJldCA9IGdldF9zbGF2ZV9mdW5jcyhudl9lbmNvZGVyKS0+CisJCQlnZXRfbW9kZXModG9fZHJtX2VuY29kZXIobnZfZW5jb2RlciksIGNvbm5lY3Rvcik7CisKKwlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUykKKwkJcmV0ICs9IG5vdXZlYXVfY29ubmVjdG9yX3NjYWxlcl9tb2Rlc19hZGQoY29ubmVjdG9yKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfY29ubmVjdG9yX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY29ubmVjdG9yLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0gbm91dmVhdV9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbnZfY29ubmVjdG9yLT5kZXRlY3RlZF9lbmNvZGVyOworCXVuc2lnbmVkIG1pbl9jbG9jayA9IDI1MDAwLCBtYXhfY2xvY2sgPSBtaW5fY2xvY2s7CisJdW5zaWduZWQgY2xvY2sgPSBtb2RlLT5jbG9jazsKKworCXN3aXRjaCAobnZfZW5jb2Rlci0+ZGNiLT50eXBlKSB7CisJY2FzZSBPVVRQVVRfTFZEUzoKKwkJQlVHX09OKCFudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlKTsKKwkJaWYgKG1vZGUtPmhkaXNwbGF5ID4gbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZS0+aGRpc3BsYXkgfHwKKwkJICAgIG1vZGUtPnZkaXNwbGF5ID4gbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZS0+dmRpc3BsYXkpCisJCQlyZXR1cm4gTU9ERV9QQU5FTDsKKworCQltaW5fY2xvY2sgPSAwOworCQltYXhfY2xvY2sgPSA0MDAwMDA7CisJCWJyZWFrOworCWNhc2UgT1VUUFVUX1RNRFM6CisJCWlmICgoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCAmJiAhbm91dmVhdV9kdWFsbGluaykgfHwKKwkJICAgIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTAgJiYKKwkJICAgICAhbnZfZW5jb2Rlci0+ZGNiLT5kdWFsbGlua19wb3NzaWJsZSkpCisJCQltYXhfY2xvY2sgPSAxNjUwMDA7CisJCWVsc2UKKwkJCW1heF9jbG9jayA9IDMzMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBPVVRQVVRfQU5BTE9HOgorCQltYXhfY2xvY2sgPSBudl9lbmNvZGVyLT5kY2ItPmNydGNvbmYubWF4ZnJlcTsKKwkJaWYgKCFtYXhfY2xvY2spCisJCQltYXhfY2xvY2sgPSAzNTAwMDA7CisJCWJyZWFrOworCWNhc2UgT1VUUFVUX1RWOgorCQlyZXR1cm4gZ2V0X3NsYXZlX2Z1bmNzKG52X2VuY29kZXIpLT4KKwkJCW1vZGVfdmFsaWQodG9fZHJtX2VuY29kZXIobnZfZW5jb2RlciksIG1vZGUpOworCWNhc2UgT1VUUFVUX0RQOgorCQlpZiAobnZfZW5jb2Rlci0+ZHAubGlua19idyA9PSBEUF9MSU5LX0JXXzJfNykKKwkJCW1heF9jbG9jayA9IG52X2VuY29kZXItPmRwLmxpbmtfbnIgKiAyNzAwMDA7CisJCWVsc2UKKwkJCW1heF9jbG9jayA9IG52X2VuY29kZXItPmRwLmxpbmtfbnIgKiAxNjIwMDA7CisKKwkJY2xvY2sgKj0gMzsKKwkJYnJlYWs7CisJfQorCisJaWYgKGNsb2NrIDwgbWluX2Nsb2NrKQorCQlyZXR1cm4gTU9ERV9DTE9DS19MT1c7CisKKwlpZiAoY2xvY2sgPiBtYXhfY2xvY2spCisJCXJldHVybiBNT0RFX0NMT0NLX0hJR0g7CisKKwlyZXR1cm4gTU9ERV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBkcm1fZW5jb2RlciAqCitub3V2ZWF1X2Nvbm5lY3Rvcl9iZXN0X2VuY29kZXIoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvciA9IG5vdXZlYXVfY29ubmVjdG9yKGNvbm5lY3Rvcik7CisKKwlpZiAobnZfY29ubmVjdG9yLT5kZXRlY3RlZF9lbmNvZGVyKQorCQlyZXR1cm4gdG9fZHJtX2VuY29kZXIobnZfY29ubmVjdG9yLT5kZXRlY3RlZF9lbmNvZGVyKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzCitub3V2ZWF1X2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7CisJLmdldF9tb2RlcyA9IG5vdXZlYXVfY29ubmVjdG9yX2dldF9tb2RlcywKKwkubW9kZV92YWxpZCA9IG5vdXZlYXVfY29ubmVjdG9yX21vZGVfdmFsaWQsCisJLmJlc3RfZW5jb2RlciA9IG5vdXZlYXVfY29ubmVjdG9yX2Jlc3RfZW5jb2RlciwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcworbm91dmVhdV9jb25uZWN0b3JfZnVuY3MgPSB7CisJLmRwbXMgPSBkcm1faGVscGVyX2Nvbm5lY3Rvcl9kcG1zLAorCS5zYXZlID0gTlVMTCwKKwkucmVzdG9yZSA9IE5VTEwsCisJLmRldGVjdCA9IG5vdXZlYXVfY29ubmVjdG9yX2RldGVjdCwKKwkuZGVzdHJveSA9IG5vdXZlYXVfY29ubmVjdG9yX2Rlc3Ryb3ksCisJLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMsCisJLnNldF9wcm9wZXJ0eSA9IG5vdXZlYXVfY29ubmVjdG9yX3NldF9wcm9wZXJ0eSwKKwkuZm9yY2UgPSBub3V2ZWF1X2Nvbm5lY3Rvcl9mb3JjZQorfTsKKworc3RhdGljIGludAorbm91dmVhdV9jb25uZWN0b3JfY3JlYXRlX2x2ZHMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3IgPSBub3V2ZWF1X2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmkyYyA9IE5VTEw7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBuYXRpdmUsICptb2RlLCAqdGVtcDsKKwlib29sIGR1bW15LCBpZl9pc18yNGJpdCA9IGZhbHNlOworCWludCByZXQsIGZsYWdzOworCisJbnZfZW5jb2RlciA9IGZpbmRfZW5jb2Rlcl9ieV90eXBlKGNvbm5lY3RvciwgT1VUUFVUX0xWRFMpOworCWlmICghbnZfZW5jb2RlcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBub3V2ZWF1X2Jpb3NfcGFyc2VfbHZkc190YWJsZShkZXYsIDAsICZkdW1teSwgJmlmX2lzXzI0Yml0KTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIHBhcnNpbmcgTFZEUyB0YWJsZSwgZGlzYWJsaW5nIExWRFNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwludl9jb25uZWN0b3ItPnVzZV9kaXRoZXJpbmcgPSAhaWZfaXNfMjRiaXQ7CisKKwkvKiBGaXJzdGx5IHRyeSBnZXR0aW5nIEVESUQgb3ZlciBEREMsIGlmIGFsbG93ZWQgYW5kIEkyQyBjaGFubmVsCisJICogaXMgYXZhaWxhYmxlLgorCSAqLworCWlmICghZGV2X3ByaXYtPlZCSU9TLnB1Yi5mcF9ub19kZGMgJiYgbnZfZW5jb2Rlci0+ZGNiLT5pMmNfaW5kZXggPCAweGYpCisJCWkyYyA9IG5vdXZlYXVfaTJjX2ZpbmQoZGV2LCBudl9lbmNvZGVyLT5kY2ItPmkyY19pbmRleCk7CisKKwlpZiAoaTJjKSB7CisJCW5vdXZlYXVfY29ubmVjdG9yX2RkY19wcmVwYXJlKGNvbm5lY3RvciwgJmZsYWdzKTsKKwkJbnZfY29ubmVjdG9yLT5lZGlkID0gZHJtX2dldF9lZGlkKGNvbm5lY3RvciwgJmkyYy0+YWRhcHRlcik7CisJCW5vdXZlYXVfY29ubmVjdG9yX2RkY19maW5pc2goY29ubmVjdG9yLCBmbGFncyk7CisJfQorCisJLyogSWYgbm8gRURJRCBmb3VuZCBhYm92ZSwgYW5kIHRoZSBWQklPUyBpbmRpY2F0ZXMgYSBoYXJkY29kZWQKKwkgKiBtb2RlbGluZSBpcyBhdmFsaWxhYmxlIGZvciB0aGUgcGFuZWwsIHNldCBpdCBhcyB0aGUgcGFuZWwncworCSAqIG5hdGl2ZSBtb2RlIGFuZCBleGl0LgorCSAqLworCWlmICghbnZfY29ubmVjdG9yLT5lZGlkICYmIG5vdXZlYXVfYmlvc19mcF9tb2RlKGRldiwgJm5hdGl2ZSkgJiYKKwkgICAgIChudl9lbmNvZGVyLT5kY2ItPmx2ZHNjb25mLnVzZV9zdHJhcHNfZm9yX21vZGUgfHwKKwkgICAgICBkZXZfcHJpdi0+VkJJT1MucHViLmZwX25vX2RkYykpIHsKKwkJbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZSA9IGRybV9tb2RlX2R1cGxpY2F0ZShkZXYsICZuYXRpdmUpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTdGlsbCBub3RoaW5nLCBzb21lIFZCSU9TIGltYWdlcyBoYXZlIGEgaGFyZGNvZGVkIEVESUQgYmxvY2sKKwkgKiBzdG9yZWQgZm9yIHRoZSBwYW5lbCBzdG9yZWQgaW4gdGhlbS4KKwkgKi8KKwlpZiAoIW52X2Nvbm5lY3Rvci0+ZWRpZCAmJiAhbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZSAmJgorCSAgICAhZGV2X3ByaXYtPlZCSU9TLnB1Yi5mcF9ub19kZGMpIHsKKwkJbnZfY29ubmVjdG9yLT5lZGlkID0KKwkJCShzdHJ1Y3QgZWRpZCAqKW5vdXZlYXVfYmlvc19lbWJlZGRlZF9lZGlkKGRldik7CisJfQorCisJaWYgKCFudl9jb25uZWN0b3ItPmVkaWQpCisJCWdvdG8gb3V0OworCisJLyogV2UgZGlkbid0IGZpbmQvdXNlIGEgcGFuZWwgbW9kZSBmcm9tIHRoZSBWQklPUywgc28gcGFyc2UgdGhlIEVESUQKKwkgKiBibG9jayBhbmQgbG9vayBmb3IgdGhlIHByZWZlcnJlZCBtb2RlIHRoZXJlLgorCSAqLworCXJldCA9IGRybV9hZGRfZWRpZF9tb2Rlcyhjb25uZWN0b3IsIG52X2Nvbm5lY3Rvci0+ZWRpZCk7CisJaWYgKHJldCA9PSAwKQorCQlnb3RvIG91dDsKKwludl9jb25uZWN0b3ItPmRldGVjdGVkX2VuY29kZXIgPSBudl9lbmNvZGVyOworCW52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGUgPSBub3V2ZWF1X2Nvbm5lY3Rvcl9uYXRpdmVfbW9kZShudl9jb25uZWN0b3IpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtb2RlLCB0ZW1wLCAmY29ubmVjdG9yLT5wcm9iZWRfbW9kZXMsIGhlYWQpCisJCWRybV9tb2RlX3JlbW92ZShjb25uZWN0b3IsIG1vZGUpOworCitvdXQ6CisJaWYgKCFudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlKSB7CisJCU5WX0VSUk9SKGRldiwgIkxWRFMgcHJlc2VudCBpbiBEQ0IgdGFibGUsIGJ1dCBjb3VsZG4ndCAiCisJCQkgICAgICAiZGV0ZXJtaW5lIGl0cyBuYXRpdmUgbW9kZS4gIERpc2FibGluZy5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkcm1fbW9kZV9jb25uZWN0b3JfdXBkYXRlX2VkaWRfcHJvcGVydHkoY29ubmVjdG9yLCBudl9jb25uZWN0b3ItPmVkaWQpOworCXJldHVybiAwOworfQorCitpbnQKK25vdXZlYXVfY29ubmVjdG9yX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaW5kZXgsIGludCB0eXBlKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3IgPSBOVUxMOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCWludCByZXQ7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJbnZfY29ubmVjdG9yID0ga3phbGxvYyhzaXplb2YoKm52X2Nvbm5lY3RvciksIEdGUF9LRVJORUwpOworCWlmICghbnZfY29ubmVjdG9yKQorCQlyZXR1cm4gLUVOT01FTTsKKwludl9jb25uZWN0b3ItPmRjYiA9IG5vdXZlYXVfYmlvc19jb25uZWN0b3JfZW50cnkoZGV2LCBpbmRleCk7CisJY29ubmVjdG9yID0gJm52X2Nvbm5lY3Rvci0+YmFzZTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX1ZHQToKKwkJTlZfSU5GTyhkZXYsICJEZXRlY3RlZCBhIFZHQSBjb25uZWN0b3JcbiIpOworCQlicmVhazsKKwljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklEOgorCQlOVl9JTkZPKGRldiwgIkRldGVjdGVkIGEgRFZJLUQgY29ubmVjdG9yXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSToKKwkJTlZfSU5GTyhkZXYsICJEZXRlY3RlZCBhIERWSS1JIGNvbm5lY3RvclxuIik7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0xWRFM6CisJCU5WX0lORk8oZGV2LCAiRGV0ZWN0ZWQgYSBMVkRTIGNvbm5lY3RvclxuIik7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX1RWOgorCQlOVl9JTkZPKGRldiwgIkRldGVjdGVkIGEgVFYgY29ubmVjdG9yXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRGlzcGxheVBvcnQ6CisJCU5WX0lORk8oZGV2LCAiRGV0ZWN0ZWQgYSBEaXNwbGF5UG9ydCBjb25uZWN0b3JcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlOVl9FUlJPUihkZXYsICJVbmtub3duIGNvbm5lY3RvciwgdGhpcyBpcyBub3QgZ29vZC5cbiIpOworCQlicmVhazsKKwl9CisKKwkvKiBkZWZhdWx0cywgd2lsbCBnZXQgb3ZlcnJpZGRlbiBpbiBkZXRlY3QoKSAqLworCWNvbm5lY3Rvci0+aW50ZXJsYWNlX2FsbG93ZWQgPSBmYWxzZTsKKwljb25uZWN0b3ItPmRvdWJsZXNjYW5fYWxsb3dlZCA9IGZhbHNlOworCisJZHJtX2Nvbm5lY3Rvcl9pbml0KGRldiwgY29ubmVjdG9yLCAmbm91dmVhdV9jb25uZWN0b3JfZnVuY3MsIHR5cGUpOworCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZChjb25uZWN0b3IsICZub3V2ZWF1X2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOworCisJLyogSW5pdCBEVkktSSBzcGVjaWZpYyBwcm9wZXJ0aWVzICovCisJaWYgKHR5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUkpIHsKKwkJZHJtX21vZGVfY3JlYXRlX2R2aV9pX3Byb3BlcnRpZXMoZGV2KTsKKwkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLCBkZXYtPm1vZGVfY29uZmlnLmR2aV9pX3N1YmNvbm5lY3Rvcl9wcm9wZXJ0eSwgMCk7CisJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwgZGV2LT5tb2RlX2NvbmZpZy5kdmlfaV9zZWxlY3Rfc3ViY29ubmVjdG9yX3Byb3BlcnR5LCAwKTsKKwl9CisKKwlpZiAodHlwZSAhPSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUykKKwkJbnZfY29ubmVjdG9yLT51c2VfZGl0aGVyaW5nID0gZmFsc2U7CisKKwlpZiAodHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJRCB8fAorCSAgICB0eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9EVklJIHx8CisJICAgIHR5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0xWRFMgfHwKKwkgICAgdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfRGlzcGxheVBvcnQpIHsKKwkJbnZfY29ubmVjdG9yLT5zY2FsaW5nX21vZGUgPSBEUk1fTU9ERV9TQ0FMRV9GVUxMU0NSRUVOOworCisJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwgZGV2LT5tb2RlX2NvbmZpZy5zY2FsaW5nX21vZGVfcHJvcGVydHksCisJCQkJCSAgICAgIG52X2Nvbm5lY3Rvci0+c2NhbGluZ19tb2RlKTsKKwkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLCBkZXYtPm1vZGVfY29uZmlnLmRpdGhlcmluZ19tb2RlX3Byb3BlcnR5LAorCQkJCQkgICAgICBudl9jb25uZWN0b3ItPnVzZV9kaXRoZXJpbmcgPyBEUk1fTU9ERV9ESVRIRVJJTkdfT04KKwkJCQkJICAgICAgOiBEUk1fTU9ERV9ESVRIRVJJTkdfT0ZGKTsKKworCX0gZWxzZSB7CisJCW52X2Nvbm5lY3Rvci0+c2NhbGluZ19tb2RlID0gRFJNX01PREVfU0NBTEVfTk9ORTsKKworCQlpZiAodHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfVkdBICAmJgorCQkJCWRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKKwkJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwKKwkJCQkJZGV2LT5tb2RlX2NvbmZpZy5zY2FsaW5nX21vZGVfcHJvcGVydHksCisJCQkJCW52X2Nvbm5lY3Rvci0+c2NhbGluZ19tb2RlKTsKKwkJfQorCX0KKworCS8qIGF0dGFjaCBlbmNvZGVycyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisKKwkJaWYgKG52X2VuY29kZXItPmRjYi0+Y29ubmVjdG9yICE9IGluZGV4KQorCQkJY29udGludWU7CisKKwkJaWYgKGdldF9zbGF2ZV9mdW5jcyhudl9lbmNvZGVyKSkKKwkJCWdldF9zbGF2ZV9mdW5jcyhudl9lbmNvZGVyKS0+Y3JlYXRlX3Jlc291cmNlcyhlbmNvZGVyLCBjb25uZWN0b3IpOworCisJCWRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2Rlcihjb25uZWN0b3IsIGVuY29kZXIpOworCX0KKworCWRybV9zeXNmc19jb25uZWN0b3JfYWRkKGNvbm5lY3Rvcik7CisKKwlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUykgeworCQlyZXQgPSBub3V2ZWF1X2Nvbm5lY3Rvcl9jcmVhdGVfbHZkcyhkZXYsIGNvbm5lY3Rvcik7CisJCWlmIChyZXQpIHsKKwkJCWNvbm5lY3Rvci0+ZnVuY3MtPmRlc3Ryb3koY29ubmVjdG9yKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY29ubmVjdG9yLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Nvbm5lY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOGI4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Nvbm5lY3Rvci5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFhcnRlbiBNYWF0aHVpcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX19OT1VWRUFVX0NPTk5FQ1RPUl9IX18KKyNkZWZpbmUgX19OT1VWRUFVX0NPTk5FQ1RPUl9IX18KKworI2luY2x1ZGUgImRybV9lZGlkLmgiCisjaW5jbHVkZSAibm91dmVhdV9pMmMuaCIKKworc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yIHsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBiYXNlOworCisJc3RydWN0IGRjYl9jb25uZWN0b3JfdGFibGVfZW50cnkgKmRjYjsKKworCWludCBzY2FsaW5nX21vZGU7CisJYm9vbCB1c2VfZGl0aGVyaW5nOworCisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqZGV0ZWN0ZWRfZW5jb2RlcjsKKwlzdHJ1Y3QgZWRpZCAqZWRpZDsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbmF0aXZlX21vZGU7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbm91dmVhdV9jb25uZWN0b3IoCisJCQkJCQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29uKQoreworCXJldHVybiBjb250YWluZXJfb2YoY29uLCBzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IsIGJhc2UpOworfQorCitpbnQgbm91dmVhdV9jb25uZWN0b3JfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpMmNfaW5kZXgsIGludCB0eXBlKTsKKworI2VuZGlmIC8qIF9fTk9VVkVBVV9DT05ORUNUT1JfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NydGMuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY3J0Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZmE3YjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NydGMuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1hYXJ0ZW4gTWFhdGh1aXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9fTk9VVkVBVV9DUlRDX0hfXworI2RlZmluZSBfX05PVVZFQVVfQ1JUQ19IX18KKworc3RydWN0IG5vdXZlYXVfY3J0YyB7CisJc3RydWN0IGRybV9jcnRjIGJhc2U7CisKKwlpbnQgaW5kZXg7CisKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKKworCXVpbnQzMl90IGRwbXNfc2F2ZWRfZnBfY29udHJvbDsKKwl1aW50MzJfdCBmcF91c2VyczsKKwlpbnQgc2F0dXJhdGlvbjsKKwlpbnQgc2hhcnBuZXNzOworCWludCBsYXN0X2RwbXM7CisKKwlzdHJ1Y3QgeworCQlpbnQgY3BwOworCQlib29sIGJsYW5rZWQ7CisJCXVpbnQzMl90IG9mZnNldDsKKwkJdWludDMyX3QgdGlsZV9mbGFnczsKKwl9IGZiOworCisJc3RydWN0IHsKKwkJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym87CisJCWJvb2wgdmlzaWJsZTsKKwkJdWludDMyX3Qgb2Zmc2V0OworCQl2b2lkICgqc2V0X29mZnNldCkoc3RydWN0IG5vdXZlYXVfY3J0YyAqLCB1aW50MzJfdCBvZmZzZXQpOworCQl2b2lkICgqc2V0X3Bvcykoc3RydWN0IG5vdXZlYXVfY3J0YyAqLCBpbnQgeCwgaW50IHkpOworCQl2b2lkICgqaGlkZSkoc3RydWN0IG5vdXZlYXVfY3J0YyAqLCBib29sIHVwZGF0ZSk7CisJCXZvaWQgKCpzaG93KShzdHJ1Y3Qgbm91dmVhdV9jcnRjICosIGJvb2wgdXBkYXRlKTsKKwl9IGN1cnNvcjsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBub3V2ZWF1X2JvICpudmJvOworCQl1aW50MTZfdCByWzI1Nl07CisJCXVpbnQxNl90IGdbMjU2XTsKKwkJdWludDE2X3QgYlsyNTZdOworCQlpbnQgZGVwdGg7CisJfSBsdXQ7CisKKwlpbnQgKCpzZXRfZGl0aGVyKShzdHJ1Y3Qgbm91dmVhdV9jcnRjICpjcnRjLCBib29sIG9uLCBib29sIHVwZGF0ZSk7CisJaW50ICgqc2V0X3NjYWxlKShzdHJ1Y3Qgbm91dmVhdV9jcnRjICpjcnRjLCBpbnQgbW9kZSwgYm9vbCB1cGRhdGUpOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgbm91dmVhdV9jcnRjICpub3V2ZWF1X2NydGMoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXJldHVybiBjb250YWluZXJfb2YoY3J0Yywgc3RydWN0IG5vdXZlYXVfY3J0YywgYmFzZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRybV9jcnRjICp0b19kcm1fY3J0YyhzdHJ1Y3Qgbm91dmVhdV9jcnRjICpjcnRjKQoreworCXJldHVybiAmY3J0Yy0+YmFzZTsKK30KKworaW50IG52NTBfY3J0Y19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGluZGV4KTsKK2ludCBudjUwX2N1cnNvcl9pbml0KHN0cnVjdCBub3V2ZWF1X2NydGMgKik7Cit2b2lkIG52NTBfY3Vyc29yX2Zpbmkoc3RydWN0IG5vdXZlYXVfY3J0YyAqKTsKK2ludCBudjUwX2NydGNfY3Vyc29yX3NldChzdHJ1Y3QgZHJtX2NydGMgKmRybV9jcnRjLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJCSB1aW50MzJfdCBidWZmZXJfaGFuZGxlLCB1aW50MzJfdCB3aWR0aCwKKwkJCSB1aW50MzJfdCBoZWlnaHQpOworaW50IG52NTBfY3J0Y19jdXJzb3JfbW92ZShzdHJ1Y3QgZHJtX2NydGMgKmRybV9jcnRjLCBpbnQgeCwgaW50IHkpOworCitpbnQgbnYwNF9jdXJzb3JfaW5pdChzdHJ1Y3Qgbm91dmVhdV9jcnRjICopOworCitzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKgorbm91dmVhdV9jcnRjX2Nvbm5lY3Rvcl9nZXQoc3RydWN0IG5vdXZlYXVfY3J0YyAqY3J0Yyk7CisKKyNlbmRpZiAvKiBfX05PVVZFQVVfQ1JUQ19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZGVidWdmcy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kZWJ1Z2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5ZGIzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZGVidWdmcy5jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFJlZCBIYXQgPGJza2VnZ3NAcmVkaGF0LmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworLyoKKyAqIEF1dGhvcnM6CisgKiAgQmVuIFNrZWdncyA8YnNrZWdnc0ByZWRoYXQuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKworc3RhdGljIGludAorbm91dmVhdV9kZWJ1Z2ZzX2NoYW5uZWxfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gbm9kZS0+aW5mb19lbnQtPmRhdGE7CisKKwlzZXFfcHJpbnRmKG0sICJjaGFubmVsIGlkICAgIDogJWRcbiIsIGNoYW4tPmlkKTsKKworCXNlcV9wcmludGYobSwgImNwdSBmaWZvIHN0YXRlOlxuIik7CisJc2VxX3ByaW50ZihtLCAiICAgICAgICAgIGJhc2U6IDB4JTA4eFxuIiwgY2hhbi0+cHVzaGJ1Zl9iYXNlKTsKKwlzZXFfcHJpbnRmKG0sICIgICAgICAgICAgIG1heDogMHglMDh4XG4iLCBjaGFuLT5kbWEubWF4IDw8IDIpOworCXNlcV9wcmludGYobSwgIiAgICAgICAgICAgY3VyOiAweCUwOHhcbiIsIGNoYW4tPmRtYS5jdXIgPDwgMik7CisJc2VxX3ByaW50ZihtLCAiICAgICAgICAgICBwdXQ6IDB4JTA4eFxuIiwgY2hhbi0+ZG1hLnB1dCA8PCAyKTsKKwlzZXFfcHJpbnRmKG0sICIgICAgICAgICAgZnJlZTogMHglMDh4XG4iLCBjaGFuLT5kbWEuZnJlZSA8PCAyKTsKKworCXNlcV9wcmludGYobSwgImdwdSBmaWZvIHN0YXRlOlxuIik7CisJc2VxX3ByaW50ZihtLCAiICAgICAgICAgICBnZXQ6IDB4JTA4eFxuIiwKKwkJCQkJbnZjaGFuX3JkMzIoY2hhbiwgY2hhbi0+dXNlcl9nZXQpKTsKKwlzZXFfcHJpbnRmKG0sICIgICAgICAgICAgIHB1dDogMHglMDh4XG4iLAorCQkJCQludmNoYW5fcmQzMihjaGFuLCBjaGFuLT51c2VyX3B1dCkpOworCisJc2VxX3ByaW50ZihtLCAibGFzdCBmZW5jZSAgICA6ICVkXG4iLCBjaGFuLT5mZW5jZS5zZXF1ZW5jZSk7CisJc2VxX3ByaW50ZihtLCAibGFzdCBzaWduYWxsZWQ6ICVkXG4iLCBjaGFuLT5mZW5jZS5zZXF1ZW5jZV9hY2spOworCXJldHVybiAwOworfQorCitpbnQKK25vdXZlYXVfZGVidWdmc19jaGFubmVsX2luaXQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjaGFuLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fbWlub3IgKm1pbm9yID0gY2hhbi0+ZGV2LT5wcmltYXJ5OworCWludCByZXQ7CisKKwlpZiAoIWRldl9wcml2LT5kZWJ1Z2ZzLmNoYW5uZWxfcm9vdCkgeworCQlkZXZfcHJpdi0+ZGVidWdmcy5jaGFubmVsX3Jvb3QgPQorCQkJZGVidWdmc19jcmVhdGVfZGlyKCJjaGFubmVsIiwgbWlub3ItPmRlYnVnZnNfcm9vdCk7CisJCWlmICghZGV2X3ByaXYtPmRlYnVnZnMuY2hhbm5lbF9yb290KQorCQkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJc25wcmludGYoY2hhbi0+ZGVidWdmcy5uYW1lLCAzMiwgIiVkIiwgY2hhbi0+aWQpOworCWNoYW4tPmRlYnVnZnMuaW5mby5uYW1lID0gY2hhbi0+ZGVidWdmcy5uYW1lOworCWNoYW4tPmRlYnVnZnMuaW5mby5zaG93ID0gbm91dmVhdV9kZWJ1Z2ZzX2NoYW5uZWxfaW5mbzsKKwljaGFuLT5kZWJ1Z2ZzLmluZm8uZHJpdmVyX2ZlYXR1cmVzID0gMDsKKwljaGFuLT5kZWJ1Z2ZzLmluZm8uZGF0YSA9IGNoYW47CisKKwlyZXQgPSBkcm1fZGVidWdmc19jcmVhdGVfZmlsZXMoJmNoYW4tPmRlYnVnZnMuaW5mbywgMSwKKwkJCQkgICAgICAgZGV2X3ByaXYtPmRlYnVnZnMuY2hhbm5lbF9yb290LAorCQkJCSAgICAgICBjaGFuLT5kZXYtPnByaW1hcnkpOworCWlmIChyZXQgPT0gMCkKKwkJY2hhbi0+ZGVidWdmcy5hY3RpdmUgPSB0cnVlOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK25vdXZlYXVfZGVidWdmc19jaGFubmVsX2Zpbmkoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjaGFuLT5kZXYtPmRldl9wcml2YXRlOworCisJaWYgKCFjaGFuLT5kZWJ1Z2ZzLmFjdGl2ZSkKKwkJcmV0dXJuOworCisJZHJtX2RlYnVnZnNfcmVtb3ZlX2ZpbGVzKCZjaGFuLT5kZWJ1Z2ZzLmluZm8sIDEsIGNoYW4tPmRldi0+cHJpbWFyeSk7CisJY2hhbi0+ZGVidWdmcy5hY3RpdmUgPSBmYWxzZTsKKworCWlmIChjaGFuID09IGRldl9wcml2LT5jaGFubmVsKSB7CisJCWRlYnVnZnNfcmVtb3ZlKGRldl9wcml2LT5kZWJ1Z2ZzLmNoYW5uZWxfcm9vdCk7CisJCWRldl9wcml2LT5kZWJ1Z2ZzLmNoYW5uZWxfcm9vdCA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2RlYnVnZnNfY2hpcHNldF9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOworCXN0cnVjdCBkcm1fbWlub3IgKm1pbm9yID0gbm9kZS0+bWlub3I7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG1pbm9yLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBwcGNpXzA7CisKKwlwcGNpXzAgPSBudl9yZDMyKGRldiwgZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHg0MCA/IDB4ODgwMDAgOiAweDE4MDApOworCisJc2VxX3ByaW50ZihtLCAiUE1DX0JPT1RfMDogMHglMDh4XG4iLCBudl9yZDMyKGRldiwgTlYwM19QTUNfQk9PVF8wKSk7CisJc2VxX3ByaW50ZihtLCAiUENJIElEICAgIDogMHglMDR4OjB4JTA0eFxuIiwKKwkJICAgcHBjaV8wICYgMHhmZmZmLCBwcGNpXzAgPj4gMTYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2RlYnVnZnNfbWVtb3J5X2luZm8oc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gKHN0cnVjdCBkcm1faW5mb19ub2RlICopIG0tPnByaXZhdGU7CisJc3RydWN0IGRybV9taW5vciAqbWlub3IgPSBub2RlLT5taW5vcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbWlub3ItPmRldjsKKworCXNlcV9wcmludGYobSwgIlZSQU0gdG90YWw6ICVkS2lCXG4iLAorCQkgICAoaW50KShub3V2ZWF1X21lbV9mYl9hbW91bnQoZGV2KSA+PiAxMCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRybV9pbmZvX2xpc3Qgbm91dmVhdV9kZWJ1Z2ZzX2xpc3RbXSA9IHsKKwl7ICJjaGlwc2V0Iiwgbm91dmVhdV9kZWJ1Z2ZzX2NoaXBzZXRfaW5mbywgMCwgTlVMTCB9LAorCXsgIm1lbW9yeSIsIG5vdXZlYXVfZGVidWdmc19tZW1vcnlfaW5mbywgMCwgTlVMTCB9LAorfTsKKyNkZWZpbmUgTk9VVkVBVV9ERUJVR0ZTX0VOVFJJRVMgQVJSQVlfU0laRShub3V2ZWF1X2RlYnVnZnNfbGlzdCkKKworaW50Citub3V2ZWF1X2RlYnVnZnNfaW5pdChzdHJ1Y3QgZHJtX21pbm9yICptaW5vcikKK3sKKwlkcm1fZGVidWdmc19jcmVhdGVfZmlsZXMobm91dmVhdV9kZWJ1Z2ZzX2xpc3QsIE5PVVZFQVVfREVCVUdGU19FTlRSSUVTLAorCQkJCSBtaW5vci0+ZGVidWdmc19yb290LCBtaW5vcik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK25vdXZlYXVfZGVidWdmc190YWtlZG93bihzdHJ1Y3QgZHJtX21pbm9yICptaW5vcikKK3sKKwlkcm1fZGVidWdmc19yZW1vdmVfZmlsZXMobm91dmVhdV9kZWJ1Z2ZzX2xpc3QsIE5PVVZFQVVfREVCVUdGU19FTlRSSUVTLAorCQkJCSBtaW5vcik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZGlzcGxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYzk0MzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rpc3BsYXkuYwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYWFydGVuIE1hYXRodWlzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZmIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2ZiY29uLmgiCisKK3N0YXRpYyB2b2lkCitub3V2ZWF1X3VzZXJfZnJhbWVidWZmZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpkcm1fZmIpCit7CisJc3RydWN0IG5vdXZlYXVfZnJhbWVidWZmZXIgKmZiID0gbm91dmVhdV9mcmFtZWJ1ZmZlcihkcm1fZmIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkcm1fZmItPmRldjsKKworCWlmIChkcm1fZmItPmZiZGV2KQorCQlub3V2ZWF1X2ZiY29uX3JlbW92ZShkZXYsIGRybV9mYik7CisKKwlpZiAoZmItPm52Ym8pIHsKKwkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShmYi0+bnZiby0+Z2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJfQorCisJZHJtX2ZyYW1lYnVmZmVyX2NsZWFudXAoZHJtX2ZiKTsKKwlrZnJlZShmYik7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfdXNlcl9mcmFtZWJ1ZmZlcl9jcmVhdGVfaGFuZGxlKHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmRybV9mYiwKKwkJCQkgICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCAqaGFuZGxlKQoreworCXN0cnVjdCBub3V2ZWF1X2ZyYW1lYnVmZmVyICpmYiA9IG5vdXZlYXVfZnJhbWVidWZmZXIoZHJtX2ZiKTsKKworCXJldHVybiBkcm1fZ2VtX2hhbmRsZV9jcmVhdGUoZmlsZV9wcml2LCBmYi0+bnZiby0+Z2VtLCBoYW5kbGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9mcmFtZWJ1ZmZlcl9mdW5jcyBub3V2ZWF1X2ZyYW1lYnVmZmVyX2Z1bmNzID0geworCS5kZXN0cm95ID0gbm91dmVhdV91c2VyX2ZyYW1lYnVmZmVyX2Rlc3Ryb3ksCisJLmNyZWF0ZV9oYW5kbGUgPSBub3V2ZWF1X3VzZXJfZnJhbWVidWZmZXJfY3JlYXRlX2hhbmRsZSwKK307CisKK3N0cnVjdCBkcm1fZnJhbWVidWZmZXIgKgorbm91dmVhdV9mcmFtZWJ1ZmZlcl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8sCisJCQkgICBzdHJ1Y3QgZHJtX21vZGVfZmJfY21kICptb2RlX2NtZCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9mcmFtZWJ1ZmZlciAqZmI7CisJaW50IHJldDsKKworCWZiID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5vdXZlYXVfZnJhbWVidWZmZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZiKQorCQlyZXR1cm4gTlVMTDsKKworCXJldCA9IGRybV9mcmFtZWJ1ZmZlcl9pbml0KGRldiwgJmZiLT5iYXNlLCAmbm91dmVhdV9mcmFtZWJ1ZmZlcl9mdW5jcyk7CisJaWYgKHJldCkgeworCQlrZnJlZShmYik7CisJCXJldHVybiBOVUxMOworCX0KKworCWRybV9oZWxwZXJfbW9kZV9maWxsX2ZiX3N0cnVjdCgmZmItPmJhc2UsIG1vZGVfY21kKTsKKworCWZiLT5udmJvID0gbnZibzsKKwlyZXR1cm4gJmZiLT5iYXNlOworfQorCitzdGF0aWMgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqCitub3V2ZWF1X3VzZXJfZnJhbWVidWZmZXJfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQkJc3RydWN0IGRybV9tb2RlX2ZiX2NtZCAqbW9kZV9jbWQpCit7CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmI7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW07CisKKwlnZW0gPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsIG1vZGVfY21kLT5oYW5kbGUpOworCWlmICghZ2VtKQorCQlyZXR1cm4gTlVMTDsKKworCWZiID0gbm91dmVhdV9mcmFtZWJ1ZmZlcl9jcmVhdGUoZGV2LCBub3V2ZWF1X2dlbV9vYmplY3QoZ2VtKSwgbW9kZV9jbWQpOworCWlmICghZmIpIHsKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoZ2VtKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGZiOworfQorCitjb25zdCBzdHJ1Y3QgZHJtX21vZGVfY29uZmlnX2Z1bmNzIG5vdXZlYXVfbW9kZV9jb25maWdfZnVuY3MgPSB7CisJLmZiX2NyZWF0ZSA9IG5vdXZlYXVfdXNlcl9mcmFtZWJ1ZmZlcl9jcmVhdGUsCisJLmZiX2NoYW5nZWQgPSBub3V2ZWF1X2ZiY29uX3Byb2JlLAorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kbWEuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAzNTUzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1hLmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQmVuIFNrZWdncy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2RtYS5oIgorCitpbnQKK25vdXZlYXVfZG1hX2luaXQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICptMm1mID0gTlVMTDsKKwlpbnQgcmV0LCBpOworCisJLyogQ3JlYXRlIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUIGZvciBidWZmZXIgbW92ZXMgKi8KKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9ncl9uZXcoY2hhbiwgZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwID8KKwkJCQkgICAgMHgwMDM5IDogMHg1MDM5LCAmbTJtZik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX3JlZl9hZGQoZGV2LCBjaGFuLCBOdk0yTUYsIG0ybWYsIE5VTEwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVCByZXF1aXJlcyBhIG5vdGlmaWVyIG9iamVjdCAqLworCXJldCA9IG5vdXZlYXVfbm90aWZpZXJfYWxsb2MoY2hhbiwgTnZOb3RpZnkwLCAzMiwgJmNoYW4tPm0ybWZfbnRmeSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIE1hcCBwdXNoIGJ1ZmZlciAqLworCXJldCA9IG5vdXZlYXVfYm9fbWFwKGNoYW4tPnB1c2hidWZfYm8pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBNYXAgTTJNRiBub3RpZmllciBvYmplY3QgLSBmYmNvbi4gKi8KKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkgeworCQlyZXQgPSBub3V2ZWF1X2JvX21hcChjaGFuLT5ub3RpZmllcl9ibyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEluaXRpYWxpc2UgRE1BIHZhcnMgKi8KKwljaGFuLT5kbWEubWF4ICA9IChjaGFuLT5wdXNoYnVmX2JvLT5iby5tZW0uc2l6ZSA+PiAyKSAtIDI7CisJY2hhbi0+ZG1hLnB1dCAgPSAwOworCWNoYW4tPmRtYS5jdXIgID0gY2hhbi0+ZG1hLnB1dDsKKwljaGFuLT5kbWEuZnJlZSA9IGNoYW4tPmRtYS5tYXggLSBjaGFuLT5kbWEuY3VyOworCisJLyogSW5zZXJ0IE5PUFMgZm9yIE5PVVZFQVVfRE1BX1NLSVBTICovCisJcmV0ID0gUklOR19TUEFDRShjaGFuLCBOT1VWRUFVX0RNQV9TS0lQUyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBOT1VWRUFVX0RNQV9TS0lQUzsgaSsrKQorCQlPVVRfUklORyhjaGFuLCAwKTsKKworCS8qIEluaXRpYWxpc2UgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVQgKi8KKwlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1Yk0yTUYsIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX05BTUUsIDEpOworCU9VVF9SSU5HKGNoYW4sIE52TTJNRik7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1Yk0yTUYsIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX0RNQV9OT1RJRlksIDEpOworCU9VVF9SSU5HKGNoYW4sIE52Tm90aWZ5MCk7CisKKwkvKiBTaXQgYmFjayBhbmQgcHJheSB0aGUgY2hhbm5lbCB3b3Jrcy4uICovCisJRklSRV9SSU5HKGNoYW4pOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK09VVF9SSU5HcChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBucl9kd29yZHMpCit7CisJYm9vbCBpc19pb21lbTsKKwl1MzIgKm1lbSA9IHR0bV9rbWFwX29ial92aXJ0dWFsKCZjaGFuLT5wdXNoYnVmX2JvLT5rbWFwLCAmaXNfaW9tZW0pOworCW1lbSA9ICZtZW1bY2hhbi0+ZG1hLmN1cl07CisJaWYgKGlzX2lvbWVtKQorCQltZW1jcHlfdG9pbygodm9pZCBfX2ZvcmNlIF9faW9tZW0gKiltZW0sIGRhdGEsIG5yX2R3b3JkcyAqIDQpOworCWVsc2UKKwkJbWVtY3B5KG1lbSwgZGF0YSwgbnJfZHdvcmRzICogNCk7CisJY2hhbi0+ZG1hLmN1ciArPSBucl9kd29yZHM7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorUkVBRF9HRVQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgdWludDMyX3QgKmdldCkKK3sKKwl1aW50MzJfdCB2YWw7CisKKwl2YWwgPSBudmNoYW5fcmQzMihjaGFuLCBjaGFuLT51c2VyX2dldCk7CisJaWYgKHZhbCA8IGNoYW4tPnB1c2hidWZfYmFzZSB8fAorCSAgICB2YWwgPj0gY2hhbi0+cHVzaGJ1Zl9iYXNlICsgY2hhbi0+cHVzaGJ1Zl9iby0+Ym8ubWVtLnNpemUpIHsKKwkJLyogbWVhbmluZ2xlc3MgdG8gZG1hX3dhaXQoKSBleGNlcHQgdG8ga25vdyB3aGV0aGVyIHRoZQorCQkgKiBHUFUgaGFzIHN0YWxsZWQgb3Igbm90CisJCSAqLworCQkqZ2V0ID0gdmFsOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJKmdldCA9ICh2YWwgLSBjaGFuLT5wdXNoYnVmX2Jhc2UpID4+IDI7CisJcmV0dXJuIHRydWU7Cit9CisKK2ludAorbm91dmVhdV9kbWFfd2FpdChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgc2l6ZSkKK3sKKwl1aW50MzJfdCBnZXQsIHByZXZfZ2V0ID0gMCwgY250ID0gMDsKKwlib29sIGdldF92YWxpZDsKKworCXdoaWxlIChjaGFuLT5kbWEuZnJlZSA8IHNpemUpIHsKKwkJLyogcmVzZXQgY291bnRlciBhcyBsb25nIGFzIEdFVCBpcyBzdGlsbCBhZHZhbmNpbmcsIHRoaXMgaXMKKwkJICogdG8gYXZvaWQgbWlzZGV0ZWN0aW5nIGEgR1BVIGxvY2t1cCBpZiB0aGUgR1BVIGhhcHBlbnMgdG8KKwkJICoganVzdCBiZSBwcm9jZXNzaW5nIGFuIG9wZXJhdGlvbiB0aGF0IHRha2VzIGEgbG9uZyB0aW1lCisJCSAqLworCQlnZXRfdmFsaWQgPSBSRUFEX0dFVChjaGFuLCAmZ2V0KTsKKwkJaWYgKGdldCAhPSBwcmV2X2dldCkgeworCQkJcHJldl9nZXQgPSBnZXQ7CisJCQljbnQgPSAwOworCQl9CisKKwkJaWYgKCgrK2NudCAmIDB4ZmYpID09IDApIHsKKwkJCURSTV9VREVMQVkoMSk7CisJCQlpZiAoY250ID4gMTAwMDAwKQorCQkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQkvKiBsb29wIHVudGlsIHdlIGhhdmUgYSB1c2FibGUgR0VUIHBvaW50ZXIuICB0aGUgdmFsdWUKKwkJICogd2UgcmVhZCBmcm9tIHRoZSBHUFUgbWF5IGJlIG91dHNpZGUgdGhlIG1haW4gcmluZyBpZgorCQkgKiBQRklGTyBpcyBwcm9jZXNzaW5nIGEgYnVmZmVyIGNhbGxlZCBmcm9tIHRoZSBtYWluIHJpbmcsCisJCSAqIGRpc2NhcmQgdGhlc2UgdmFsdWVzIHVudGlsIHNvbWV0aGluZyBzZW5zaWJsZSBpcyBzZWVuLgorCQkgKgorCQkgKiB0aGUgb3RoZXIgY2FzZSB3ZSBkaXNjYXJkIEdFVCBpcyB3aGlsZSB0aGUgR1BVIGlzIGZldGNoaW5nCisJCSAqIGZyb20gdGhlIFNLSVBTIGFyZWEsIHNvIHRoZSBjb2RlIGJlbG93IGRvZXNuJ3QgaGF2ZSB0byBkZWFsCisJCSAqIHdpdGggc29tZSBmdW4gY29ybmVyIGNhc2VzLgorCQkgKi8KKwkJaWYgKCFnZXRfdmFsaWQgfHwgZ2V0IDwgTk9VVkVBVV9ETUFfU0tJUFMpCisJCQljb250aW51ZTsKKworCQlpZiAoZ2V0IDw9IGNoYW4tPmRtYS5jdXIpIHsKKwkJCS8qIGVuZ2luZSBpcyBmZXRjaGluZyBiZWhpbmQgdXMsIG9yIGlzIGNvbXBsZXRlbHkKKwkJCSAqIGlkbGUgKEdFVCA9PSBQVVQpIHNvIHdlIGhhdmUgZnJlZSBzcGFjZSB1cCB1bnRpbAorCQkJICogdGhlIGVuZCBvZiB0aGUgcHVzaCBidWZmZXIKKwkJCSAqCisJCQkgKiB3ZSBjYW4gb25seSBoaXQgdGhhdCBwYXRoIG9uY2UgcGVyIGNhbGwgZHVlIHRvCisJCQkgKiBsb29waW5nIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcHVzaCBidWZmZXIsCisJCQkgKiB3ZSdsbCBoaXQgdGhlIGZldGNoaW5nLWFoZWFkLW9mLXVzIHBhdGggZnJvbSB0aGF0CisJCQkgKiBwb2ludCBvbi4KKwkJCSAqCisJCQkgKiB0aGUgKm9uZSogZXhjZXB0aW9uIHRvIHRoYXQgcnVsZSBpcyBpZiB3ZSByZWFkCisJCQkgKiBHRVQ9PVBVVCwgaW4gd2hpY2ggY2FzZSB0aGUgYmVsb3cgY29uZGl0aW9uYWwgd2lsbAorCQkJICogYWx3YXlzIHN1Y2NlZWQgYW5kIGJyZWFrIHVzIG91dCBvZiB0aGUgd2FpdCBsb29wLgorCQkJICovCisJCQljaGFuLT5kbWEuZnJlZSA9IGNoYW4tPmRtYS5tYXggLSBjaGFuLT5kbWEuY3VyOworCQkJaWYgKGNoYW4tPmRtYS5mcmVlID49IHNpemUpCisJCQkJYnJlYWs7CisKKwkJCS8qIG5vdCBlbm91Z2ggc3BhY2UgbGVmdCBhdCB0aGUgZW5kIG9mIHRoZSBwdXNoIGJ1ZmZlciwKKwkJCSAqIGluc3RydWN0IHRoZSBHUFUgdG8ganVtcCBiYWNrIHRvIHRoZSBzdGFydCByaWdodAorCQkJICogYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgY3VycmVudGx5IHBlbmRpbmcgY29tbWFuZHMuCisJCQkgKi8KKwkJCU9VVF9SSU5HKGNoYW4sIGNoYW4tPnB1c2hidWZfYmFzZSB8IDB4MjAwMDAwMDApOworCQkJV1JJVEVfUFVUKE5PVVZFQVVfRE1BX1NLSVBTKTsKKworCQkJLyogd2UncmUgbm93IHN1Ym1pdHRpbmcgY29tbWFuZHMgYXQgdGhlIHN0YXJ0IG9mCisJCQkgKiB0aGUgcHVzaCBidWZmZXIuCisJCQkgKi8KKwkJCWNoYW4tPmRtYS5jdXIgID0KKwkJCWNoYW4tPmRtYS5wdXQgID0gTk9VVkVBVV9ETUFfU0tJUFM7CisJCX0KKworCQkvKiBlbmdpbmUgZmV0Y2hpbmcgYWhlYWQgb2YgdXMsIHdlIGhhdmUgc3BhY2UgdXAgdW50aWwgdGhlCisJCSAqIGN1cnJlbnQgR0VUIHBvaW50ZXIuICB0aGUgIi0gMSIgaXMgdG8gZW5zdXJlIHRoZXJlJ3MKKwkJICogc3BhY2UgbGVmdCB0byBlbWl0IGEganVtcCBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisJCSAqIHB1c2ggYnVmZmVyIGlmIHdlIHJlcXVpcmUgaXQuICB3ZSBjYW4gbmV2ZXIgZ2V0IEdFVCA9PSBQVVQKKwkJICogaGVyZSwgc28gdGhpcyBpcyBzYWZlLgorCQkgKi8KKwkJY2hhbi0+ZG1hLmZyZWUgPSBnZXQgLSBjaGFuLT5kbWEuY3VyIC0gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kbWEuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRlODVkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1hLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQmVuIFNrZWdncy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX19OT1VWRUFVX0RNQV9IX18KKyNkZWZpbmUgX19OT1VWRUFVX0RNQV9IX18KKworI2lmbmRlZiBOT1VWRUFVX0RNQV9ERUJVRworI2RlZmluZSBOT1VWRUFVX0RNQV9ERUJVRyAwCisjZW5kaWYKKworLyoKKyAqIFRoZXJlJ3MgYSBodyByYWNlIGNvbmRpdGlvbiB3aGVyZSB5b3UgY2FuJ3QganVtcCB0byB5b3VyIFBVVCBvZmZzZXQsCisgKiB0byBhdm9pZCB0aGlzIHdlIGp1bXAgdG8gb2Zmc2V0ICsgU0tJUFMgYW5kIGZpbGwgdGhlIGRpZmZlcmVuY2Ugd2l0aAorICogTk9Qcy4KKyAqCisgKiB4Zjg2LXZpZGVvLW52IGNvbmZpZ3VyZXMgdGhlIERNQSBmZXRjaCBzaXplIHRvIDMyIGJ5dGVzLCBhbmQgdXNlcworICogYSBTS0lQUyB2YWx1ZSBvZiA4LiAgTGV0cyBhc3N1bWUgdGhhdCB0aGUgcmFjZSBjb25kaXRpb24gaXMgdG8gZG8KKyAqIHdpdGggd3JpdGluZyBpbnRvIHRoZSBmZXRjaCBhcmVhLCB3ZSBjb25maWd1cmUgYSBmZXRjaCBzaXplIG9mIDEyOAorICogYnl0ZXMgc28gd2UgbmVlZCBhIGxhcmdlciBTS0lQUyB2YWx1ZS4KKyAqLworI2RlZmluZSBOT1VWRUFVX0RNQV9TS0lQUyAoMTI4IC8gNCkKKworLyogSGFyZGNvZGVkIG9iamVjdCBhc3NpZ25tZW50cyB0byBzdWJjaGFubmVscyAoc3ViY2hhbm5lbCBpZCkuICovCitlbnVtIHsKKwlOdlN1Yk0yTUYJPSAwLAorCU52U3ViMkQJCT0gMSwKKwlOdlN1YkN0eFN1cmYyRCAgPSAxLAorCU52U3ViR2RpUmVjdCAgICA9IDIsCisJTnZTdWJJbWFnZUJsaXQgID0gMworfTsKKworLyogT2JqZWN0IGhhbmRsZXMuICovCitlbnVtIHsKKwlOdk0yTUYJCT0gMHg4MDAwMDAwMSwKKwlOdkRtYUZCCQk9IDB4ODAwMDAwMDIsCisJTnZEbWFUVAkJPSAweDgwMDAwMDAzLAorCU52RG1hVlJBTQk9IDB4ODAwMDAwMDQsCisJTnZEbWFHQVJUCT0gMHg4MDAwMDAwNSwKKwlOdk5vdGlmeTAgICAgICAgPSAweDgwMDAwMDA2LAorCU52MkQJCT0gMHg4MDAwMDAwNywKKwlOdkN0eFN1cmYyRAk9IDB4ODAwMDAwMDgsCisJTnZSb3AJCT0gMHg4MDAwMDAwOSwKKwlOdkltYWdlUGF0dAk9IDB4ODAwMDAwMGEsCisJTnZDbGlwUmVjdAk9IDB4ODAwMDAwMGIsCisJTnZHZGlSZWN0CT0gMHg4MDAwMDAwYywKKwlOdkltYWdlQmxpdAk9IDB4ODAwMDAwMGQsCisKKwkvKiBHODArIGRpc3BsYXkgb2JqZWN0cyAqLworCU52RXZvVlJBTQk9IDB4MDEwMDAwMDAsCisJTnZFdm9GQjE2CT0gMHgwMTAwMDAwMSwKKwlOdkV2b0ZCMzIJPSAweDAxMDAwMDAyCit9OworCisjZGVmaW5lIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAzOQorI2RlZmluZSBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfU0VUX1JFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDUwCisjZGVmaW5lIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX05PUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9OT1RJRlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDQKKyNkZWZpbmUgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfTk9USUZZX1NUWUxFX1dSSVRFICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX05PVElGWV9TVFlMRV9XUklURV9MRV9BV0FLRU4gICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9ETUFfTk9USUZZICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxODAKKyNkZWZpbmUgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfRE1BX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTg0CisjZGVmaW5lIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX09GRlNFVF9JTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwYworCisjZGVmaW5lIE5WNTBfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNTAzOQorI2RlZmluZSBOVjUwX01FTU9SWV9UT19NRU1PUllfRk9STUFUX1VOSzIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgTlY1MF9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9VTksyMUMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjFjCisjZGVmaW5lIE5WNTBfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfT0ZGU0VUX0lOX0hJR0ggICAgICAgICAgICAgICAgICAgMHgwMDAwMDIzOAorI2RlZmluZSBOVjUwX01FTU9SWV9UT19NRU1PUllfRk9STUFUX09GRlNFVF9PVVRfSElHSCAgICAgICAgICAgICAgICAgIDB4MDAwMDAyM2MKKworc3RhdGljIF9fbXVzdF9jaGVjayBpbmxpbmUgaW50CitSSU5HX1NQQUNFKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBzaXplKQoreworCWlmIChjaGFuLT5kbWEuZnJlZSA8IHNpemUpIHsKKwkJaW50IHJldDsKKworCQlyZXQgPSBub3V2ZWF1X2RtYV93YWl0KGNoYW4sIHNpemUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwljaGFuLT5kbWEuZnJlZSAtPSBzaXplOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK09VVF9SSU5HKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBkYXRhKQoreworCWlmIChOT1VWRUFVX0RNQV9ERUJVRykgeworCQlOVl9JTkZPKGNoYW4tPmRldiwgIkNoJWQvMHglMDh4OiAweCUwOHhcbiIsCisJCQljaGFuLT5pZCwgY2hhbi0+ZG1hLmN1ciA8PCAyLCBkYXRhKTsKKwl9CisKKwlub3V2ZWF1X2JvX3dyMzIoY2hhbi0+cHVzaGJ1Zl9ibywgY2hhbi0+ZG1hLmN1cisrLCBkYXRhKTsKK30KKworZXh0ZXJuIHZvaWQKK09VVF9SSU5HcChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBucl9kd29yZHMpOworCitzdGF0aWMgaW5saW5lIHZvaWQKK0JFR0lOX1JJTkcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IHN1YmMsIGludCBtdGhkLCBpbnQgc2l6ZSkKK3sKKwlPVVRfUklORyhjaGFuLCAoc3ViYyA8PCAxMykgfCAoc2l6ZSA8PCAxOCkgfCBtdGhkKTsKK30KKworI2RlZmluZSBXUklURV9QVVQodmFsKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlEUk1fTUVNT1JZQkFSUklFUigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlub3V2ZWF1X2JvX3JkMzIoY2hhbi0+cHVzaGJ1Zl9ibywgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwludmNoYW5fd3IzMihjaGFuLCBjaGFuLT51c2VyX3B1dCwgKCh2YWwpIDw8IDIpICsgY2hhbi0+cHVzaGJ1Zl9iYXNlKTsgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorRklSRV9SSU5HKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJaWYgKE5PVVZFQVVfRE1BX0RFQlVHKSB7CisJCU5WX0lORk8oY2hhbi0+ZGV2LCAiQ2glZC8weCUwOHg6IFBVU0ghXG4iLAorCQkJY2hhbi0+aWQsIGNoYW4tPmRtYS5jdXIgPDwgMik7CisJfQorCisJaWYgKGNoYW4tPmRtYS5jdXIgPT0gY2hhbi0+ZG1hLnB1dCkKKwkJcmV0dXJuOworCWNoYW4tPmFjY2VsX2RvbmUgPSB0cnVlOworCisJV1JJVEVfUFVUKGNoYW4tPmRtYS5jdXIpOworCWNoYW4tPmRtYS5wdXQgPSBjaGFuLT5kbWEuY3VyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK1dJTkRfUklORyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCWNoYW4tPmRtYS5jdXIgPSBjaGFuLT5kbWEucHV0OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTYxZjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcC5jCkBAIC0wLDAgKzEsNTY5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDkgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogQmVuIFNrZWdncworICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2kyYy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZW5jb2Rlci5oIgorCitzdGF0aWMgaW50CithdXhjaF9yZChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBhZGRyZXNzLCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqYXV4Y2g7CisJaW50IHJldDsKKworCWF1eGNoID0gbm91dmVhdV9pMmNfZmluZChkZXYsIG52X2VuY29kZXItPmRjYi0+aTJjX2luZGV4KTsKKwlpZiAoIWF1eGNoKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IG5vdXZlYXVfZHBfYXV4Y2goYXV4Y2gsIDksIGFkZHJlc3MsIGJ1Ziwgc2l6ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CithdXhjaF93cihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBhZGRyZXNzLCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqYXV4Y2g7CisJaW50IHJldDsKKworCWF1eGNoID0gbm91dmVhdV9pMmNfZmluZChkZXYsIG52X2VuY29kZXItPmRjYi0+aTJjX2luZGV4KTsKKwlpZiAoIWF1eGNoKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IG5vdXZlYXVfZHBfYXV4Y2goYXV4Y2gsIDgsIGFkZHJlc3MsIGJ1Ziwgc2l6ZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorbm91dmVhdV9kcF9sYW5lX2NvdW50X3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHVpbnQ4X3QgY21kKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwl1aW50MzJfdCB0bXA7CisJaW50IG9yID0gbnZfZW5jb2Rlci0+b3IsIGxpbmsgPSAhKG52X2VuY29kZXItPmRjYi0+c29yY29uZi5saW5rICYgMSk7CisKKwl0bXAgID0gbnZfcmQzMihkZXYsIE5WNTBfU09SX0RQX0NUUkwob3IsIGxpbmspKTsKKwl0bXAgJj0gfihOVjUwX1NPUl9EUF9DVFJMX0VOSEFOQ0VEX0ZSQU1FX0VOQUJMRUQgfAorCQkgTlY1MF9TT1JfRFBfQ1RSTF9MQU5FX01BU0spOworCXRtcCB8PSAoKDEgPDwgKGNtZCAmIERQX0xBTkVfQ09VTlRfTUFTSykpIC0gMSkgPDwgMTY7CisJaWYgKGNtZCAmIERQX0xBTkVfQ09VTlRfRU5IQU5DRURfRlJBTUVfRU4pCisJCXRtcCB8PSBOVjUwX1NPUl9EUF9DVFJMX0VOSEFOQ0VEX0ZSQU1FX0VOQUJMRUQ7CisJbnZfd3IzMihkZXYsIE5WNTBfU09SX0RQX0NUUkwob3IsIGxpbmspLCB0bXApOworCisJcmV0dXJuIGF1eGNoX3dyKGVuY29kZXIsIERQX0xBTkVfQ09VTlRfU0VULCAmY21kLCAxKTsKK30KKworc3RhdGljIGludAorbm91dmVhdV9kcF9saW5rX2J3X3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHVpbnQ4X3QgY21kKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwl1aW50MzJfdCB0bXA7CisJaW50IHJlZyA9IDB4NjE0MzAwICsgKG52X2VuY29kZXItPm9yICogMHg4MDApOworCisJdG1wICA9IG52X3JkMzIoZGV2LCByZWcpOworCXRtcCAmPSAweGZmZjNmZmZmOworCWlmIChjbWQgPT0gRFBfTElOS19CV18yXzcpCisJCXRtcCB8PSAweDAwMDQwMDAwOworCW52X3dyMzIoZGV2LCByZWcsIHRtcCk7CisKKwlyZXR1cm4gYXV4Y2hfd3IoZW5jb2RlciwgRFBfTElOS19CV19TRVQsICZjbWQsIDEpOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2RwX2xpbmtfdHJhaW5fc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IHBhdHRlcm4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXVpbnQzMl90IHRtcDsKKwl1aW50OF90IGNtZDsKKwlpbnQgb3IgPSBudl9lbmNvZGVyLT5vciwgbGluayA9ICEobnZfZW5jb2Rlci0+ZGNiLT5zb3Jjb25mLmxpbmsgJiAxKTsKKwlpbnQgcmV0OworCisJdG1wICA9IG52X3JkMzIoZGV2LCBOVjUwX1NPUl9EUF9DVFJMKG9yLCBsaW5rKSk7CisJdG1wICY9IH5OVjUwX1NPUl9EUF9DVFJMX1RSQUlOSU5HX1BBVFRFUk47CisJdG1wIHw9IChwYXR0ZXJuIDw8IDI0KTsKKwludl93cjMyKGRldiwgTlY1MF9TT1JfRFBfQ1RSTChvciwgbGluayksIHRtcCk7CisKKwlyZXQgPSBhdXhjaF9yZChlbmNvZGVyLCBEUF9UUkFJTklOR19QQVRURVJOX1NFVCwgJmNtZCwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwljbWQgJj0gfkRQX1RSQUlOSU5HX1BBVFRFUk5fTUFTSzsKKwljbWQgfD0gKHBhdHRlcm4gJiBEUF9UUkFJTklOR19QQVRURVJOX01BU0spOworCXJldHVybiBhdXhjaF93cihlbmNvZGVyLCBEUF9UUkFJTklOR19QQVRURVJOX1NFVCwgJmNtZCwgMSk7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfZHBfbWF4X3ZvbHRhZ2Vfc3dpbmcoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgYml0X2Rpc3BsYXlwb3J0X2VuY29kZXJfdGFibGVfZW50cnkgKmRwc2U7CisJc3RydWN0IGJpdF9kaXNwbGF5cG9ydF9lbmNvZGVyX3RhYmxlICpkcGU7CisJaW50IGksIGRwZV9oZWFkZXJsZW4sIG1heF92cyA9IDA7CisKKwlkcGUgPSBub3V2ZWF1X2Jpb3NfZHBfdGFibGUoZGV2LCBudl9lbmNvZGVyLT5kY2IsICZkcGVfaGVhZGVybGVuKTsKKwlpZiAoIWRwZSkKKwkJcmV0dXJuIGZhbHNlOworCWRwc2UgPSAodm9pZCAqKSgoY2hhciAqKWRwZSArIGRwZV9oZWFkZXJsZW4pOworCisJZm9yIChpID0gMDsgaSA8IGRwZV9oZWFkZXJsZW47IGkrKywgZHBzZSsrKSB7CisJCWlmIChkcHNlLT52c19sZXZlbCA+IG1heF92cykKKwkJCW1heF92cyA9IGRwc2UtPnZzX2xldmVsOworCX0KKworCXJldHVybiBtYXhfdnM7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfZHBfbWF4X3ByZV9lbXBoYXNpcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCB2cykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGJpdF9kaXNwbGF5cG9ydF9lbmNvZGVyX3RhYmxlX2VudHJ5ICpkcHNlOworCXN0cnVjdCBiaXRfZGlzcGxheXBvcnRfZW5jb2Rlcl90YWJsZSAqZHBlOworCWludCBpLCBkcGVfaGVhZGVybGVuLCBtYXhfcHJlID0gMDsKKworCWRwZSA9IG5vdXZlYXVfYmlvc19kcF90YWJsZShkZXYsIG52X2VuY29kZXItPmRjYiwgJmRwZV9oZWFkZXJsZW4pOworCWlmICghZHBlKQorCQlyZXR1cm4gZmFsc2U7CisJZHBzZSA9ICh2b2lkICopKChjaGFyICopZHBlICsgZHBlX2hlYWRlcmxlbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHBlX2hlYWRlcmxlbjsgaSsrLCBkcHNlKyspIHsKKwkJaWYgKGRwc2UtPnZzX2xldmVsICE9IHZzKQorCQkJY29udGludWU7CisKKwkJaWYgKGRwc2UtPnByZV9sZXZlbCA+IG1heF9wcmUpCisJCQltYXhfcHJlID0gZHBzZS0+cHJlX2xldmVsOworCX0KKworCXJldHVybiBtYXhfcHJlOworfQorCitzdGF0aWMgYm9vbAorbm91dmVhdV9kcF9saW5rX3RyYWluX2FkanVzdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHVpbnQ4X3QgKmNvbmZpZykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGJpdF9kaXNwbGF5cG9ydF9lbmNvZGVyX3RhYmxlX2VudHJ5ICpkcHNlOworCXN0cnVjdCBiaXRfZGlzcGxheXBvcnRfZW5jb2Rlcl90YWJsZSAqZHBlOworCWludCByZXQsIGksIGRwZV9oZWFkZXJsZW4sIHZzID0gMCwgcHJlID0gMDsKKwl1aW50OF90IHJlcXVlc3RbMl07CisKKwlkcGUgPSBub3V2ZWF1X2Jpb3NfZHBfdGFibGUoZGV2LCBudl9lbmNvZGVyLT5kY2IsICZkcGVfaGVhZGVybGVuKTsKKwlpZiAoIWRwZSkKKwkJcmV0dXJuIGZhbHNlOworCWRwc2UgPSAodm9pZCAqKSgoY2hhciAqKWRwZSArIGRwZV9oZWFkZXJsZW4pOworCisJcmV0ID0gYXV4Y2hfcmQoZW5jb2RlciwgRFBfQURKVVNUX1JFUVVFU1RfTEFORTBfMSwgcmVxdWVzdCwgMik7CisJaWYgKHJldCkKKwkJcmV0dXJuIGZhbHNlOworCisJTlZfREVCVUcoZGV2LCAiXHRcdGFkanVzdCAweCUwMnggMHglMDJ4XG4iLCByZXF1ZXN0WzBdLCByZXF1ZXN0WzFdKTsKKworCS8qIEtlZXAgYWxsIGxhbmVzIGF0IHRoZSBzYW1lIGxldmVsLi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnZfZW5jb2Rlci0+ZHAubGlua19ucjsgaSsrKSB7CisJCWludCBsYW5lX3JlcSA9IChyZXF1ZXN0W2kgPj4gMV0gPj4gKChpICYgMSkgPDwgMikpICYgMHhmOworCQlpbnQgbGFuZV92cyA9IGxhbmVfcmVxICYgMzsKKwkJaW50IGxhbmVfcHJlID0gKGxhbmVfcmVxID4+IDIpICYgMzsKKworCQlpZiAobGFuZV92cyA+IHZzKQorCQkJdnMgPSBsYW5lX3ZzOworCQlpZiAobGFuZV9wcmUgPiBwcmUpCisJCQlwcmUgPSBsYW5lX3ByZTsKKwl9CisKKwlpZiAodnMgPj0gbm91dmVhdV9kcF9tYXhfdm9sdGFnZV9zd2luZyhlbmNvZGVyKSkgeworCQl2cyAgPSBub3V2ZWF1X2RwX21heF92b2x0YWdlX3N3aW5nKGVuY29kZXIpOworCQl2cyB8PSA0OworCX0KKworCWlmIChwcmUgPj0gbm91dmVhdV9kcF9tYXhfcHJlX2VtcGhhc2lzKGVuY29kZXIsIHZzICYgMykpIHsKKwkJcHJlICA9IG5vdXZlYXVfZHBfbWF4X3ByZV9lbXBoYXNpcyhlbmNvZGVyLCB2cyAmIDMpOworCQlwcmUgfD0gNDsKKwl9CisKKwkvKiBVcGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGFsbCBsYW5lcy4uICovCisJZm9yIChpID0gMDsgaSA8IG52X2VuY29kZXItPmRwLmxpbmtfbnI7IGkrKykKKwkJY29uZmlnW2ldID0gKHByZSA8PCAzKSB8IHZzOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitub3V2ZWF1X2RwX2xpbmtfdHJhaW5fY29tbWl0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgdWludDhfdCAqY29uZmlnKQoreworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgYml0X2Rpc3BsYXlwb3J0X2VuY29kZXJfdGFibGVfZW50cnkgKmRwc2U7CisJc3RydWN0IGJpdF9kaXNwbGF5cG9ydF9lbmNvZGVyX3RhYmxlICpkcGU7CisJaW50IG9yID0gbnZfZW5jb2Rlci0+b3IsIGxpbmsgPSAhKG52X2VuY29kZXItPmRjYi0+c29yY29uZi5saW5rICYgMSk7CisJaW50IGRwZV9oZWFkZXJsZW4sIHJldCwgaTsKKworCU5WX0RFQlVHKGRldiwgIlx0XHRjb25maWcgMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4XG4iLAorCQkgY29uZmlnWzBdLCBjb25maWdbMV0sIGNvbmZpZ1syXSwgY29uZmlnWzNdKTsKKworCWRwZSA9IG5vdXZlYXVfYmlvc19kcF90YWJsZShkZXYsIG52X2VuY29kZXItPmRjYiwgJmRwZV9oZWFkZXJsZW4pOworCWlmICghZHBlKQorCQlyZXR1cm4gZmFsc2U7CisJZHBzZSA9ICh2b2lkICopKChjaGFyICopZHBlICsgZHBlX2hlYWRlcmxlbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHBlLT5yZWNvcmRfbnI7IGkrKywgZHBzZSsrKSB7CisJCWlmIChkcHNlLT52c19sZXZlbCA9PSAoY29uZmlnWzBdICYgMykgJiYKKwkJICAgIGRwc2UtPnByZV9sZXZlbCA9PSAoKGNvbmZpZ1swXSA+PiAzKSAmIDMpKQorCQkJYnJlYWs7CisJfQorCUJVR19PTihpID09IGRwZS0+cmVjb3JkX25yKTsKKworCWZvciAoaSA9IDA7IGkgPCBudl9lbmNvZGVyLT5kcC5saW5rX25yOyBpKyspIHsKKwkJY29uc3QgaW50IHNoaWZ0WzRdID0geyAxNiwgOCwgMCwgMjQgfTsKKwkJdWludDMyX3QgbWFzayA9IDB4ZmYgPDwgc2hpZnRbaV07CisJCXVpbnQzMl90IHJlZzAsIHJlZzEsIHJlZzI7CisKKwkJcmVnMCAgPSBudl9yZDMyKGRldiwgTlY1MF9TT1JfRFBfVU5LMTE4KG9yLCBsaW5rKSkgJiB+bWFzazsKKwkJcmVnMCB8PSAoZHBzZS0+cmVnMCA8PCBzaGlmdFtpXSk7CisJCXJlZzEgID0gbnZfcmQzMihkZXYsIE5WNTBfU09SX0RQX1VOSzEyMChvciwgbGluaykpICYgfm1hc2s7CisJCXJlZzEgfD0gKGRwc2UtPnJlZzEgPDwgc2hpZnRbaV0pOworCQlyZWcyICA9IG52X3JkMzIoZGV2LCBOVjUwX1NPUl9EUF9VTksxMzAob3IsIGxpbmspKSAmIDB4ZmZmZjAwZmY7CisJCXJlZzIgfD0gKGRwc2UtPnJlZzIgPDwgOCk7CisJCW52X3dyMzIoZGV2LCBOVjUwX1NPUl9EUF9VTksxMTgob3IsIGxpbmspLCByZWcwKTsKKwkJbnZfd3IzMihkZXYsIE5WNTBfU09SX0RQX1VOSzEyMChvciwgbGluayksIHJlZzEpOworCQludl93cjMyKGRldiwgTlY1MF9TT1JfRFBfVU5LMTMwKG9yLCBsaW5rKSwgcmVnMik7CisJfQorCisJcmV0ID0gYXV4Y2hfd3IoZW5jb2RlciwgRFBfVFJBSU5JTkdfTEFORTBfU0VULCBjb25maWcsIDQpOworCWlmIChyZXQpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitib29sCitub3V2ZWF1X2RwX2xpbmtfdHJhaW4oc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwl1aW50OF90IGNvbmZpZ1s0XTsKKwl1aW50OF90IHN0YXR1c1szXTsKKwlib29sIGNyX2RvbmUsIGNyX21heF92cywgZXFfZG9uZTsKKwlpbnQgcmV0ID0gMCwgaSwgdHJpZXMsIHZvbHRhZ2U7CisKKwlOVl9ERUJVRyhkZXYsICJsaW5rIHRyYWluaW5nISFcbiIpOwordHJhaW46CisJY3JfZG9uZSA9IGVxX2RvbmUgPSBmYWxzZTsKKworCS8qIHNldCBsaW5rIGNvbmZpZ3VyYXRpb24gKi8KKwlOVl9ERUJVRyhkZXYsICJcdGJlZ2luIHRyYWluOiBidyAlZCwgbGFuZXMgJWRcbiIsCisJCSBudl9lbmNvZGVyLT5kcC5saW5rX2J3LCBudl9lbmNvZGVyLT5kcC5saW5rX25yKTsKKworCXJldCA9IG5vdXZlYXVfZHBfbGlua19id19zZXQoZW5jb2RlciwgbnZfZW5jb2Rlci0+ZHAubGlua19idyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIGZhbHNlOworCisJY29uZmlnWzBdID0gbnZfZW5jb2Rlci0+ZHAubGlua19ucjsKKwlpZiAobnZfZW5jb2Rlci0+ZHAuZHBjZF92ZXJzaW9uID49IDB4MTEpCisJCWNvbmZpZ1swXSB8PSBEUF9MQU5FX0NPVU5UX0VOSEFOQ0VEX0ZSQU1FX0VOOworCisJcmV0ID0gbm91dmVhdV9kcF9sYW5lX2NvdW50X3NldChlbmNvZGVyLCBjb25maWdbMF0pOworCWlmIChyZXQpCisJCXJldHVybiBmYWxzZTsKKworCS8qIGNsb2NrIHJlY292ZXJ5ICovCisJTlZfREVCVUcoZGV2LCAiXHRiZWdpbiBjclxuIik7CisJcmV0ID0gbm91dmVhdV9kcF9saW5rX3RyYWluX3NldChlbmNvZGVyLCBEUF9UUkFJTklOR19QQVRURVJOXzEpOworCWlmIChyZXQpCisJCWdvdG8gc3RvcDsKKworCXRyaWVzID0gMDsKKwl2b2x0YWdlID0gLTE7CisJbWVtc2V0KGNvbmZpZywgMHgwMCwgc2l6ZW9mKGNvbmZpZykpOworCWZvciAoOzspIHsKKwkJaWYgKCFub3V2ZWF1X2RwX2xpbmtfdHJhaW5fY29tbWl0KGVuY29kZXIsIGNvbmZpZykpCisJCQlicmVhazsKKworCQl1ZGVsYXkoMTAwKTsKKworCQlyZXQgPSBhdXhjaF9yZChlbmNvZGVyLCBEUF9MQU5FMF8xX1NUQVRVUywgc3RhdHVzLCAyKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQlOVl9ERUJVRyhkZXYsICJcdFx0c3RhdHVzOiAweCUwMnggMHglMDJ4XG4iLAorCQkJIHN0YXR1c1swXSwgc3RhdHVzWzFdKTsKKworCQljcl9kb25lID0gdHJ1ZTsKKwkJY3JfbWF4X3ZzID0gZmFsc2U7CisJCWZvciAoaSA9IDA7IGkgPCBudl9lbmNvZGVyLT5kcC5saW5rX25yOyBpKyspIHsKKwkJCWludCBsYW5lID0gKHN0YXR1c1tpID4+IDFdID4+ICgoaSAmIDEpICogNCkpICYgMHhmOworCisJCQlpZiAoIShsYW5lICYgRFBfTEFORV9DUl9ET05FKSkgeworCQkJCWNyX2RvbmUgPSBmYWxzZTsKKwkJCQlpZiAoY29uZmlnW2ldICYgRFBfVFJBSU5fTUFYX1BSRV9FTVBIQVNJU19SRUFDSEVEKQorCQkJCQljcl9tYXhfdnMgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKChjb25maWdbMF0gJiBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX01BU0spICE9IHZvbHRhZ2UpIHsKKwkJCXZvbHRhZ2UgPSBjb25maWdbMF0gJiBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX01BU0s7CisJCQl0cmllcyA9IDA7CisJCX0KKworCQlpZiAoY3JfZG9uZSB8fCBjcl9tYXhfdnMgfHwgKCsrdHJpZXMgPT0gNSkpCisJCQlicmVhazsKKworCQlpZiAoIW5vdXZlYXVfZHBfbGlua190cmFpbl9hZGp1c3QoZW5jb2RlciwgY29uZmlnKSkKKwkJCWJyZWFrOworCX0KKworCWlmICghY3JfZG9uZSkKKwkJZ290byBzdG9wOworCisJLyogY2hhbm5lbCBlcXVhbGlzYXRpb24gKi8KKwlOVl9ERUJVRyhkZXYsICJcdGJlZ2luIGVxXG4iKTsKKwlyZXQgPSBub3V2ZWF1X2RwX2xpbmtfdHJhaW5fc2V0KGVuY29kZXIsIERQX1RSQUlOSU5HX1BBVFRFUk5fMik7CisJaWYgKHJldCkKKwkJZ290byBzdG9wOworCisJZm9yICh0cmllcyA9IDA7IHRyaWVzIDw9IDU7IHRyaWVzKyspIHsKKwkJdWRlbGF5KDQwMCk7CisKKwkJcmV0ID0gYXV4Y2hfcmQoZW5jb2RlciwgRFBfTEFORTBfMV9TVEFUVVMsIHN0YXR1cywgMyk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJTlZfREVCVUcoZGV2LCAiXHRcdHN0YXR1czogMHglMDJ4IDB4JTAyeFxuIiwKKwkJCSBzdGF0dXNbMF0sIHN0YXR1c1sxXSk7CisKKwkJZXFfZG9uZSA9IHRydWU7CisJCWlmICghKHN0YXR1c1syXSAmIERQX0lOVEVSTEFORV9BTElHTl9ET05FKSkKKwkJCWVxX2RvbmUgPSBmYWxzZTsKKworCQlmb3IgKGkgPSAwOyBlcV9kb25lICYmIGkgPCBudl9lbmNvZGVyLT5kcC5saW5rX25yOyBpKyspIHsKKwkJCWludCBsYW5lID0gKHN0YXR1c1tpID4+IDFdID4+ICgoaSAmIDEpICogNCkpICYgMHhmOworCisJCQlpZiAoIShsYW5lICYgRFBfTEFORV9DUl9ET05FKSkgeworCQkJCWNyX2RvbmUgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCEobGFuZSAmIERQX0xBTkVfQ0hBTk5FTF9FUV9ET05FKSB8fAorCQkJICAgICEobGFuZSAmIERQX0xBTkVfU1lNQk9MX0xPQ0tFRCkpIHsKKwkJCQllcV9kb25lID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoZXFfZG9uZSB8fCAhY3JfZG9uZSkKKwkJCWJyZWFrOworCisJCWlmICghbm91dmVhdV9kcF9saW5rX3RyYWluX2FkanVzdChlbmNvZGVyLCBjb25maWcpIHx8CisJCSAgICAhbm91dmVhdV9kcF9saW5rX3RyYWluX2NvbW1pdChlbmNvZGVyLCBjb25maWcpKQorCQkJYnJlYWs7CisJfQorCitzdG9wOgorCS8qIGVuZCBsaW5rIHRyYWluaW5nICovCisJcmV0ID0gbm91dmVhdV9kcF9saW5rX3RyYWluX3NldChlbmNvZGVyLCBEUF9UUkFJTklOR19QQVRURVJOX0RJU0FCTEUpOworCWlmIChyZXQpCisJCXJldHVybiBmYWxzZTsKKworCS8qIHJldHJ5IGF0IGEgbG93ZXIgc2V0dGluZywgaWYgcG9zc2libGUgKi8KKwlpZiAoIXJldCAmJiAhKGVxX2RvbmUgJiYgY3JfZG9uZSkpIHsKKwkJTlZfREVCVUcoZGV2LCAiXHR3ZSBmYWlsZWRcbiIpOworCQlpZiAobnZfZW5jb2Rlci0+ZHAubGlua19idyAhPSBEUF9MSU5LX0JXXzFfNjIpIHsKKwkJCU5WX0RFQlVHKGRldiwgInJldHJ5IGxpbmsgdHJhaW5pbmcgYXQgbG93IHJhdGVcbiIpOworCQkJbnZfZW5jb2Rlci0+ZHAubGlua19idyA9IERQX0xJTktfQldfMV82MjsKKwkJCWdvdG8gdHJhaW47CisJCX0KKwl9CisKKwlyZXR1cm4gZXFfZG9uZTsKK30KKworYm9vbAorbm91dmVhdV9kcF9kZXRlY3Qoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwl1aW50OF90IGRwY2RbNF07CisJaW50IHJldDsKKworCXJldCA9IGF1eGNoX3JkKGVuY29kZXIsIDB4MDAwMCwgZHBjZCwgNCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIGZhbHNlOworCisJTlZfREVCVUcoZGV2LCAiZW5jb2RlcjogbGlua19idyAlZCwgbGlua19uciAlZFxuIgorCQkgICAgICAiZGlzcGxheTogbGlua19idyAlZCwgbGlua19uciAlZCB2ZXJzaW9uIDB4JTAyeFxuIiwKKwkJIG52X2VuY29kZXItPmRjYi0+ZHBjb25mLmxpbmtfYncsCisJCSBudl9lbmNvZGVyLT5kY2ItPmRwY29uZi5saW5rX25yLAorCQkgZHBjZFsxXSwgZHBjZFsyXSAmIDB4MGYsIGRwY2RbMF0pOworCisJbnZfZW5jb2Rlci0+ZHAuZHBjZF92ZXJzaW9uID0gZHBjZFswXTsKKworCW52X2VuY29kZXItPmRwLmxpbmtfYncgPSBkcGNkWzFdOworCWlmIChudl9lbmNvZGVyLT5kcC5saW5rX2J3ICE9IERQX0xJTktfQldfMV82MiAmJgorCSAgICAhbnZfZW5jb2Rlci0+ZGNiLT5kcGNvbmYubGlua19idykKKwkJbnZfZW5jb2Rlci0+ZHAubGlua19idyA9IERQX0xJTktfQldfMV82MjsKKworCW52X2VuY29kZXItPmRwLmxpbmtfbnIgPSBkcGNkWzJdICYgMHhmOworCWlmIChudl9lbmNvZGVyLT5kcC5saW5rX25yID4gbnZfZW5jb2Rlci0+ZGNiLT5kcGNvbmYubGlua19ucikKKwkJbnZfZW5jb2Rlci0+ZHAubGlua19uciA9IG52X2VuY29kZXItPmRjYi0+ZHBjb25mLmxpbmtfbnI7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworaW50Citub3V2ZWF1X2RwX2F1eGNoKHN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICphdXhjaCwgaW50IGNtZCwgaW50IGFkZHIsCisJCSB1aW50OF90ICpkYXRhLCBpbnQgZGF0YV9ucikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYXV4Y2gtPmRldjsKKwl1aW50MzJfdCB0bXAsIGN0cmwsIHN0YXQgPSAwLCBkYXRhMzJbNF0gPSB7fTsKKwlpbnQgcmV0ID0gMCwgaSwgaW5kZXggPSBhdXhjaC0+cmQ7CisKKwlOVl9ERUJVRyhkZXYsICJjaCAlZCBjbWQgJWQgYWRkciAweCV4IGxlbiAlZFxuIiwgaW5kZXgsIGNtZCwgYWRkciwgZGF0YV9ucik7CisKKwl0bXAgPSBudl9yZDMyKGRldiwgTlY1MF9BVVhDSF9DVFJMKGF1eGNoLT5yZCkpOworCW52X3dyMzIoZGV2LCBOVjUwX0FVWENIX0NUUkwoYXV4Y2gtPnJkKSwgdG1wIHwgMHgwMDEwMDAwMCk7CisJdG1wID0gbnZfcmQzMihkZXYsIE5WNTBfQVVYQ0hfQ1RSTChhdXhjaC0+cmQpKTsKKwlpZiAoISh0bXAgJiAweDAxMDAwMDAwKSkgeworCQlOVl9FUlJPUihkZXYsICJleHBlY3RlZCBiaXQgMjQgPT0gMSwgZ290IDB4JTA4eFxuIiwgdG1wKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQl0bXAgPSBudl9yZDMyKGRldiwgTlY1MF9BVVhDSF9TVEFUKGF1eGNoLT5yZCkpOworCQlpZiAodG1wICYgTlY1MF9BVVhDSF9TVEFUX1NUQVRFX1JFQURZKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMDApOworCX0KKworCWlmIChpID09IDMpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIShjbWQgJiAxKSkgeworCQltZW1jcHkoZGF0YTMyLCBkYXRhLCBkYXRhX25yKTsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJTlZfREVCVUcoZGV2LCAid3IgJWQ6IDB4JTA4eFxuIiwgaSwgZGF0YTMyW2ldKTsKKwkJCW52X3dyMzIoZGV2LCBOVjUwX0FVWENIX0RBVEFfT1VUKGluZGV4LCBpKSwgZGF0YTMyW2ldKTsKKwkJfQorCX0KKworCW52X3dyMzIoZGV2LCBOVjUwX0FVWENIX0FERFIoaW5kZXgpLCBhZGRyKTsKKwljdHJsICA9IG52X3JkMzIoZGV2LCBOVjUwX0FVWENIX0NUUkwoaW5kZXgpKTsKKwljdHJsICY9IH4oTlY1MF9BVVhDSF9DVFJMX0NNRCB8IE5WNTBfQVVYQ0hfQ1RSTF9MRU4pOworCWN0cmwgfD0gKGNtZCA8PCBOVjUwX0FVWENIX0NUUkxfQ01EX1NISUZUKTsKKwljdHJsIHw9ICgoZGF0YV9uciAtIDEpIDw8IE5WNTBfQVVYQ0hfQ1RSTF9MRU5fU0hJRlQpOworCisJZm9yICg7OykgeworCQludl93cjMyKGRldiwgTlY1MF9BVVhDSF9DVFJMKGluZGV4KSwgY3RybCB8IDB4ODAwMDAwMDApOworCQludl93cjMyKGRldiwgTlY1MF9BVVhDSF9DVFJMKGluZGV4KSwgY3RybCk7CisJCW52X3dyMzIoZGV2LCBOVjUwX0FVWENIX0NUUkwoaW5kZXgpLCBjdHJsIHwgMHgwMDAxMDAwMCk7CisJCWlmICghbnZfd2FpdChOVjUwX0FVWENIX0NUUkwoaW5kZXgpLCAweDAwMDEwMDAwLCAweDAwMDAwMDAwKSkgeworCQkJTlZfRVJST1IoZGV2LCAiZXhwZWN0ZWQgYml0IDE2ID09IDAsIGdvdCAweCUwOHhcbiIsCisJCQkJIG52X3JkMzIoZGV2LCBOVjUwX0FVWENIX0NUUkwoaW5kZXgpKSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJdWRlbGF5KDQwMCk7CisKKwkJc3RhdCA9IG52X3JkMzIoZGV2LCBOVjUwX0FVWENIX1NUQVQoaW5kZXgpKTsKKwkJaWYgKChzdGF0ICYgTlY1MF9BVVhDSF9TVEFUX1JFUExZX0FVWCkgIT0KKwkJCSAgICBOVjUwX0FVWENIX1NUQVRfUkVQTFlfQVVYX0RFRkVSKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGNtZCAmIDEpIHsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJZGF0YTMyW2ldID0gbnZfcmQzMihkZXYsIE5WNTBfQVVYQ0hfREFUQV9JTihpbmRleCwgaSkpOworCQkJTlZfREVCVUcoZGV2LCAicmQgJWQ6IDB4JTA4eFxuIiwgaSwgZGF0YTMyW2ldKTsKKwkJfQorCQltZW1jcHkoZGF0YSwgZGF0YTMyLCBkYXRhX25yKTsKKwl9CisKK291dDoKKwl0bXAgPSBudl9yZDMyKGRldiwgTlY1MF9BVVhDSF9DVFJMKGF1eGNoLT5yZCkpOworCW52X3dyMzIoZGV2LCBOVjUwX0FVWENIX0NUUkwoYXV4Y2gtPnJkKSwgdG1wICYgfjB4MDAxMDAwMDApOworCXRtcCA9IG52X3JkMzIoZGV2LCBOVjUwX0FVWENIX0NUUkwoYXV4Y2gtPnJkKSk7CisJaWYgKHRtcCAmIDB4MDEwMDAwMDApIHsKKwkJTlZfRVJST1IoZGV2LCAiZXhwZWN0ZWQgYml0IDI0ID09IDAsIGdvdCAweCUwOHhcbiIsIHRtcCk7CisJCXJldCA9IC1FSU87CisJfQorCisJdWRlbGF5KDQwMCk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogKHN0YXQgJiBOVjUwX0FVWENIX1NUQVRfUkVQTFkpOworfQorCitpbnQKK25vdXZlYXVfZHBfaTJjX2F1eF9jaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBtb2RlLAorCQkgICAgICB1aW50OF90IHdyaXRlX2J5dGUsIHVpbnQ4X3QgKnJlYWRfYnl0ZSkKK3sKKwlzdHJ1Y3QgaTJjX2FsZ29fZHBfYXV4X2RhdGEgKmFsZ29fZGF0YSA9IGFkYXB0ZXItPmFsZ29fZGF0YTsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqYXV4Y2ggPSAoc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKilhZGFwdGVyOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBhdXhjaC0+ZGV2OworCWludCByZXQgPSAwLCBjbWQsIGFkZHIgPSBhbGdvX2RhdGEtPmFkZHJlc3M7CisJdWludDhfdCAqYnVmOworCisJaWYgKG1vZGUgPT0gTU9ERV9JMkNfUkVBRCkgeworCQljbWQgPSBBVVhfSTJDX1JFQUQ7CisJCWJ1ZiA9IHJlYWRfYnl0ZTsKKwl9IGVsc2UgeworCQljbWQgPSAobW9kZSAmIE1PREVfSTJDX1JFQUQpID8gQVVYX0kyQ19SRUFEIDogQVVYX0kyQ19XUklURTsKKwkJYnVmID0gJndyaXRlX2J5dGU7CisJfQorCisJaWYgKCEobW9kZSAmIE1PREVfSTJDX1NUT1ApKQorCQljbWQgfD0gQVVYX0kyQ19NT1Q7CisKKwlpZiAobW9kZSAmIE1PREVfSTJDX1NUQVJUKQorCQlyZXR1cm4gMTsKKworCWZvciAoOzspIHsKKwkJcmV0ID0gbm91dmVhdV9kcF9hdXhjaChhdXhjaCwgY21kLCBhZGRyLCBidWYsIDEpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJc3dpdGNoIChyZXQgJiBOVjUwX0FVWENIX1NUQVRfUkVQTFlfSTJDKSB7CisJCWNhc2UgTlY1MF9BVVhDSF9TVEFUX1JFUExZX0kyQ19BQ0s6CisJCQlyZXR1cm4gMTsKKwkJY2FzZSBOVjUwX0FVWENIX1NUQVRfUkVQTFlfSTJDX05BQ0s6CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJY2FzZSBOVjUwX0FVWENIX1NUQVRfUkVQTFlfSTJDX0RFRkVSOgorCQkJdWRlbGF5KDEwMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCU5WX0VSUk9SKGRldiwgImludmFsaWQgYXV4Y2ggc3RhdHVzOiAweCUwOHhcbiIsIHJldCk7CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyNDljMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJ2LmMKQEAgLTAsMCArMSw0MDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNSBTdGVwaGFuZSBNYXJjaGVzaW4uCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2h3LmgiCisjaW5jbHVkZSAibm91dmVhdV9mYi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZmJjb24uaCIKKyNpbmNsdWRlICJudjUwX2Rpc3BsYXkuaCIKKworI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKKworTU9EVUxFX1BBUk1fREVTQyhub2FncCwgIkRpc2FibGUgQUdQIik7CitpbnQgbm91dmVhdV9ub2FncDsKK21vZHVsZV9wYXJhbV9uYW1lZChub2FncCwgbm91dmVhdV9ub2FncCwgaW50LCAwNDAwKTsKKworTU9EVUxFX1BBUk1fREVTQyhtb2Rlc2V0LCAiRW5hYmxlIGtlcm5lbCBtb2Rlc2V0dGluZyIpOworc3RhdGljIGludCBub3V2ZWF1X21vZGVzZXQgPSAtMTsgLyoga21zICovCittb2R1bGVfcGFyYW1fbmFtZWQobW9kZXNldCwgbm91dmVhdV9tb2Rlc2V0LCBpbnQsIDA0MDApOworCitNT0RVTEVfUEFSTV9ERVNDKHZiaW9zLCAiT3ZlcnJpZGUgZGVmYXVsdCBWQklPUyBsb2NhdGlvbiIpOworY2hhciAqbm91dmVhdV92YmlvczsKK21vZHVsZV9wYXJhbV9uYW1lZCh2Ymlvcywgbm91dmVhdV92YmlvcywgY2hhcnAsIDA0MDApOworCitNT0RVTEVfUEFSTV9ERVNDKHZyYW1fcHVzaGJ1ZiwgIkZvcmNlIERNQSBwdXNoIGJ1ZmZlcnMgdG8gYmUgaW4gVlJBTSIpOworaW50IG5vdXZlYXVfdnJhbV9wdXNoYnVmOworbW9kdWxlX3BhcmFtX25hbWVkKHZyYW1fcHVzaGJ1Ziwgbm91dmVhdV92cmFtX3B1c2hidWYsIGludCwgMDQwMCk7CisKK01PRFVMRV9QQVJNX0RFU0ModnJhbV9ub3RpZnksICJGb3JjZSBETUEgbm90aWZpZXJzIHRvIGJlIGluIFZSQU0iKTsKK2ludCBub3V2ZWF1X3ZyYW1fbm90aWZ5OworbW9kdWxlX3BhcmFtX25hbWVkKHZyYW1fbm90aWZ5LCBub3V2ZWF1X3ZyYW1fbm90aWZ5LCBpbnQsIDA0MDApOworCitNT0RVTEVfUEFSTV9ERVNDKGR1YWxsaW5rLCAiQWxsb3cgZHVhbC1saW5rIFRNRFMgKD49R2VGb3JjZSA4KSIpOworaW50IG5vdXZlYXVfZHVhbGxpbmsgPSAxOworbW9kdWxlX3BhcmFtX25hbWVkKGR1YWxsaW5rLCBub3V2ZWF1X2R1YWxsaW5rLCBpbnQsIDA0MDApOworCitNT0RVTEVfUEFSTV9ERVNDKHVzY3JpcHRfbHZkcywgIkxWRFMgb3V0cHV0IHNjcmlwdCB0YWJsZSBJRCAoPj1HZUZvcmNlIDgpIik7CitpbnQgbm91dmVhdV91c2NyaXB0X2x2ZHMgPSAtMTsKK21vZHVsZV9wYXJhbV9uYW1lZCh1c2NyaXB0X2x2ZHMsIG5vdXZlYXVfdXNjcmlwdF9sdmRzLCBpbnQsIDA0MDApOworCitNT0RVTEVfUEFSTV9ERVNDKHVzY3JpcHRfdG1kcywgIlRNRFMgb3V0cHV0IHNjcmlwdCB0YWJsZSBJRCAoPj1HZUZvcmNlIDgpIik7CitpbnQgbm91dmVhdV91c2NyaXB0X3RtZHMgPSAtMTsKK21vZHVsZV9wYXJhbV9uYW1lZCh1c2NyaXB0X3RtZHMsIG5vdXZlYXVfdXNjcmlwdF90bWRzLCBpbnQsIDA0MDApOworCitNT0RVTEVfUEFSTV9ERVNDKHR2X25vcm0sICJEZWZhdWx0IFRWIG5vcm0uXG4iCisJCSAiXHRcdFN1cHBvcnRlZDogUEFMLCBQQUwtTSwgUEFMLU4sIFBBTC1OYywgTlRTQy1NLCBOVFNDLUosXG4iCisJCSAiXHRcdFx0aGQ0ODBpLCBoZDQ4MHAsIGhkNTc2aSwgaGQ1NzZwLCBoZDcyMHAsIGhkMTA4MGkuXG4iCisJCSAiXHRcdERlZmF1bHQ6IFBBTFxuIgorCQkgIlx0XHQqTk9URSogSWdub3JlZCBmb3IgY2FyZHMgd2l0aCBleHRlcm5hbCBUViBlbmNvZGVycy4iKTsKK2NoYXIgKm5vdXZlYXVfdHZfbm9ybTsKK21vZHVsZV9wYXJhbV9uYW1lZCh0dl9ub3JtLCBub3V2ZWF1X3R2X25vcm0sIGNoYXJwLCAwNDAwKTsKKworTU9EVUxFX1BBUk1fREVTQyhyZWdfZGVidWcsICJSZWdpc3RlciBhY2Nlc3MgZGVidWcgYml0bWFzazpcbiIKKwkJIlx0XHQweDEgbWMsIDB4MiB2aWRlbywgMHg0IGZiLCAweDggZXh0ZGV2LFxuIgorCQkiXHRcdDB4MTAgY3J0YywgMHgyMCByYW1kYWMsIDB4NDAgdmdhY3J0YywgMHg4MCBybXZpbyxcbiIKKwkJIlx0XHQweDEwMCB2Z2FhdHRyLCAweDIwMCBFVk8gKEc4MCspLiAiKTsKK2ludCBub3V2ZWF1X3JlZ19kZWJ1ZzsKK21vZHVsZV9wYXJhbV9uYW1lZChyZWdfZGVidWcsIG5vdXZlYXVfcmVnX2RlYnVnLCBpbnQsIDA2MDApOworCitpbnQgbm91dmVhdV9mYnBlcmNydGM7CisjaWYgMAorbW9kdWxlX3BhcmFtX25hbWVkKGZicGVyY3J0Yywgbm91dmVhdV9mYnBlcmNydGMsIGludCwgMDQwMCk7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0geworCXsKKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0FOWV9JRCksCisJCS5jbGFzcyA9IFBDSV9CQVNFX0NMQVNTX0RJU1BMQVkgPDwgMTYsCisJCS5jbGFzc19tYXNrICA9IDB4ZmYgPDwgMTYsCisJfSwKKwl7CisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUFfU0dTLCBQQ0lfQU5ZX0lEKSwKKwkJLmNsYXNzID0gUENJX0JBU0VfQ0xBU1NfRElTUExBWSA8PCAxNiwKKwkJLmNsYXNzX21hc2sgID0gMHhmZiA8PCAxNiwKKwl9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGNpaWRsaXN0KTsKKworc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIGRyaXZlcjsKKworc3RhdGljIGludCBfX2RldmluaXQKK25vdXZlYXVfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXJldHVybiBkcm1fZ2V0X2RldihwZGV2LCBlbnQsICZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlkcm1fcHV0X2RldihkZXYpOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3QgcG1fc3RhdGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2luc3RtZW1fZW5naW5lICpwaW5zdG1lbSA9ICZkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW07CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisJc3RydWN0IG5vdXZlYXVfZmlmb19lbmdpbmUgKnBmaWZvID0gJmRldl9wcml2LT5lbmdpbmUuZmlmbzsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwl1aW50MzJfdCBmYmRldl9mbGFnczsKKwlpbnQgcmV0LCBpOworCisJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChwbV9zdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9QUkVUSEFXKQorCQlyZXR1cm4gMDsKKworCWZiZGV2X2ZsYWdzID0gZGV2X3ByaXYtPmZiZGV2X2luZm8tPmZsYWdzOworCWRldl9wcml2LT5mYmRldl9pbmZvLT5mbGFncyB8PSBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBub3V2ZWF1X2ZyYW1lYnVmZmVyICpub3V2ZWF1X2ZiOworCisJCW5vdXZlYXVfZmIgPSBub3V2ZWF1X2ZyYW1lYnVmZmVyKGNydGMtPmZiKTsKKwkJaWYgKCFub3V2ZWF1X2ZiIHx8ICFub3V2ZWF1X2ZiLT5udmJvKQorCQkJY29udGludWU7CisKKwkJbm91dmVhdV9ib191bnBpbihub3V2ZWF1X2ZiLT5udmJvKTsKKwl9CisKKwlOVl9JTkZPKGRldiwgIkV2aWN0aW5nIGJ1ZmZlcnMuLi5cbiIpOworCXR0bV9ib19ldmljdF9tbSgmZGV2X3ByaXYtPnR0bS5iZGV2LCBUVE1fUExfVlJBTSk7CisKKwlOVl9JTkZPKGRldiwgIklkbGluZyBjaGFubmVscy4uLlxuIik7CisJZm9yIChpID0gMDsgaSA8IHBmaWZvLT5jaGFubmVsczsgaSsrKSB7CisJCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZSA9IE5VTEw7CisKKwkJY2hhbiA9IGRldl9wcml2LT5maWZvc1tpXTsKKwkJaWYgKCFjaGFuIHx8IChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwICYmCisJCQkgICAgICBjaGFuID09IGRldl9wcml2LT5maWZvc1swXSkpCisJCQljb250aW51ZTsKKworCQlyZXQgPSBub3V2ZWF1X2ZlbmNlX25ldyhjaGFuLCAmZmVuY2UsIHRydWUpOworCQlpZiAocmV0ID09IDApIHsKKwkJCXJldCA9IG5vdXZlYXVfZmVuY2Vfd2FpdChmZW5jZSwgTlVMTCwgZmFsc2UsIGZhbHNlKTsKKwkJCW5vdXZlYXVfZmVuY2VfdW5yZWYoKHZvaWQgKikmZmVuY2UpOworCQl9CisKKwkJaWYgKHJldCkgeworCQkJTlZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIGlkbGUgY2hhbm5lbCAlZCBmb3Igc3VzcGVuZFxuIiwKKwkJCQkgY2hhbi0+aWQpOworCQl9CisJfQorCisJcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIGZhbHNlKTsKKwlub3V2ZWF1X3dhaXRfZm9yX2lkbGUoZGV2KTsKKwlwZmlmby0+cmVhc3NpZ24oZGV2LCBmYWxzZSk7CisJcGZpZm8tPmRpc2FibGUoZGV2KTsKKwlwZmlmby0+dW5sb2FkX2NvbnRleHQoZGV2KTsKKwlwZ3JhcGgtPnVubG9hZF9jb250ZXh0KGRldik7CisKKwlOVl9JTkZPKGRldiwgIlN1c3BlbmRpbmcgR1BVIG9iamVjdHMuLi5cbiIpOworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX3N1c3BlbmQoZGV2KTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIi4uLiBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIG91dF9hYm9ydDsKKwl9CisKKwlyZXQgPSBwaW5zdG1lbS0+c3VzcGVuZChkZXYpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiLi4uIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCW5vdXZlYXVfZ3B1b2JqX3N1c3BlbmRfY2xlYW51cChkZXYpOworCQlnb3RvIG91dF9hYm9ydDsKKwl9CisKKwlOVl9JTkZPKGRldiwgIkFuZCB3ZSdyZSBnb25lIVxuIik7CisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJaWYgKHBtX3N0YXRlLmV2ZW50ID09IFBNX0VWRU5UX1NVU1BFTkQpIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7CisJfQorCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCWZiX3NldF9zdXNwZW5kKGRldl9wcml2LT5mYmRldl9pbmZvLCAxKTsKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJZGV2X3ByaXYtPmZiZGV2X2luZm8tPmZsYWdzID0gZmJkZXZfZmxhZ3M7CisJcmV0dXJuIDA7CisKK291dF9hYm9ydDoKKwlOVl9JTkZPKGRldiwgIlJlLWVuYWJsaW5nIGFjY2VsZXJhdGlvbi4uXG4iKTsKKwlwZmlmby0+ZW5hYmxlKGRldik7CisJcGZpZm8tPnJlYXNzaWduKGRldiwgdHJ1ZSk7CisJcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIHRydWUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZW5naW5lICplbmdpbmUgPSAmZGV2X3ByaXYtPmVuZ2luZTsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisJdWludDMyX3QgZmJkZXZfZmxhZ3M7CisJaW50IHJldCwgaTsKKworCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlmYmRldl9mbGFncyA9IGRldl9wcml2LT5mYmRldl9pbmZvLT5mbGFnczsKKwlkZXZfcHJpdi0+ZmJkZXZfaW5mby0+ZmxhZ3MgfD0gRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQ7CisKKwlOVl9JTkZPKGRldiwgIldlJ3JlIGJhY2ssIGVuYWJsaW5nIGRldmljZS4uLlxuIik7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJcmV0dXJuIC0xOworCXBjaV9zZXRfbWFzdGVyKGRldi0+cGRldik7CisKKwlOVl9JTkZPKGRldiwgIlBPU1RpbmcgZGV2aWNlLi4uXG4iKTsKKwlyZXQgPSBub3V2ZWF1X3J1bl92Ymlvc19pbml0KGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChkZXZfcHJpdi0+Z2FydF9pbmZvLnR5cGUgPT0gTk9VVkVBVV9HQVJUX0FHUCkgeworCQlyZXQgPSBub3V2ZWF1X21lbV9pbml0X2FncChkZXYpOworCQlpZiAocmV0KSB7CisJCQlOVl9FUlJPUihkZXYsICJlcnJvciByZWluaXRpYWxpc2luZyBBR1A6ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCU5WX0lORk8oZGV2LCAiUmVpbml0aWFsaXNpbmcgZW5naW5lcy4uLlxuIik7CisJZW5naW5lLT5pbnN0bWVtLnJlc3VtZShkZXYpOworCWVuZ2luZS0+bWMuaW5pdChkZXYpOworCWVuZ2luZS0+dGltZXIuaW5pdChkZXYpOworCWVuZ2luZS0+ZmIuaW5pdChkZXYpOworCWVuZ2luZS0+Z3JhcGguaW5pdChkZXYpOworCWVuZ2luZS0+Zmlmby5pbml0KGRldik7CisKKwlOVl9JTkZPKGRldiwgIlJlc3RvcmluZyBHUFUgb2JqZWN0cy4uLlxuIik7CisJbm91dmVhdV9ncHVvYmpfcmVzdW1lKGRldik7CisKKwlub3V2ZWF1X2lycV9wb3N0aW5zdGFsbChkZXYpOworCisJLyogUmUtd3JpdGUgU0tJUFMsIHRoZXknbGwgaGF2ZSBiZWVuIGxvc3Qgb3ZlciB0aGUgc3VzcGVuZCAqLworCWlmIChub3V2ZWF1X3ZyYW1fcHVzaGJ1ZikgeworCQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOworCQlpbnQgajsKKworCQlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOyBpKyspIHsKKwkJCWNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbaV07CisJCQlpZiAoIWNoYW4pCisJCQkJY29udGludWU7CisKKwkJCWZvciAoaiA9IDA7IGogPCBOT1VWRUFVX0RNQV9TS0lQUzsgaisrKQorCQkJCW5vdXZlYXVfYm9fd3IzMihjaGFuLT5wdXNoYnVmX2JvLCBpLCAwKTsKKwkJfQorCX0KKworCU5WX0lORk8oZGV2LCAiUmVzdG9yaW5nIG1vZGUuLi5cbiIpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBub3V2ZWF1X2ZyYW1lYnVmZmVyICpub3V2ZWF1X2ZiOworCisJCW5vdXZlYXVfZmIgPSBub3V2ZWF1X2ZyYW1lYnVmZmVyKGNydGMtPmZiKTsKKwkJaWYgKCFub3V2ZWF1X2ZiIHx8ICFub3V2ZWF1X2ZiLT5udmJvKQorCQkJY29udGludWU7CisKKwkJbm91dmVhdV9ib19waW4obm91dmVhdV9mYi0+bnZibywgVFRNX1BMX0ZMQUdfVlJBTSk7CisJfQorCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgeworCQludjA0X2Rpc3BsYXlfcmVzdG9yZShkZXYpOworCQlOVkxvY2tWZ2FDcnRjcyhkZXYsIGZhbHNlKTsKKwl9IGVsc2UKKwkJbnY1MF9kaXNwbGF5X2luaXQoZGV2KTsKKworCS8qIEZvcmNlIENMVVQgdG8gZ2V0IHJlLWxvYWRlZCBkdXJpbmcgbW9kZXNldCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisKKwkJbnZfY3J0Yy0+bHV0LmRlcHRoID0gMDsKKwl9CisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJZmJfc2V0X3N1c3BlbmQoZGV2X3ByaXYtPmZiZGV2X2luZm8sIDApOworCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKworCW5vdXZlYXVfZmJjb25femZpbGwoZGV2KTsKKworCWRybV9oZWxwZXJfcmVzdW1lX2ZvcmNlX21vZGUoZGV2KTsKKwlkZXZfcHJpdi0+ZmJkZXZfaW5mby0+ZmxhZ3MgPSBmYmRldl9mbGFnczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIGRyaXZlciA9IHsKKwkuZHJpdmVyX2ZlYXR1cmVzID0KKwkJRFJJVkVSX1VTRV9BR1AgfCBEUklWRVJfUENJX0RNQSB8IERSSVZFUl9TRyB8CisJCURSSVZFUl9IQVZFX0lSUSB8IERSSVZFUl9JUlFfU0hBUkVEIHwgRFJJVkVSX0dFTSwKKwkubG9hZCA9IG5vdXZlYXVfbG9hZCwKKwkuZmlyc3RvcGVuID0gbm91dmVhdV9maXJzdG9wZW4sCisJLmxhc3RjbG9zZSA9IG5vdXZlYXVfbGFzdGNsb3NlLAorCS51bmxvYWQgPSBub3V2ZWF1X3VubG9hZCwKKwkucHJlY2xvc2UgPSBub3V2ZWF1X3ByZWNsb3NlLAorI2lmIGRlZmluZWQoQ09ORklHX0RSTV9OT1VWRUFVX0RFQlVHKQorCS5kZWJ1Z2ZzX2luaXQgPSBub3V2ZWF1X2RlYnVnZnNfaW5pdCwKKwkuZGVidWdmc19jbGVhbnVwID0gbm91dmVhdV9kZWJ1Z2ZzX3Rha2Vkb3duLAorI2VuZGlmCisJLmlycV9wcmVpbnN0YWxsID0gbm91dmVhdV9pcnFfcHJlaW5zdGFsbCwKKwkuaXJxX3Bvc3RpbnN0YWxsID0gbm91dmVhdV9pcnFfcG9zdGluc3RhbGwsCisJLmlycV91bmluc3RhbGwgPSBub3V2ZWF1X2lycV91bmluc3RhbGwsCisJLmlycV9oYW5kbGVyID0gbm91dmVhdV9pcnFfaGFuZGxlciwKKwkucmVjbGFpbV9idWZmZXJzID0gZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzLAorCS5nZXRfbWFwX29mcyA9IGRybV9jb3JlX2dldF9tYXBfb2ZzLAorCS5nZXRfcmVnX29mcyA9IGRybV9jb3JlX2dldF9yZWdfb2ZzLAorCS5pb2N0bHMgPSBub3V2ZWF1X2lvY3RscywKKwkuZm9wcyA9IHsKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vcGVuID0gZHJtX29wZW4sCisJCS5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCisJCS5pb2N0bCA9IGRybV9pb2N0bCwKKwkJLm1tYXAgPSBub3V2ZWF1X3R0bV9tbWFwLAorCQkucG9sbCA9IGRybV9wb2xsLAorCQkuZmFzeW5jID0gZHJtX2Zhc3luYywKKyNpZiBkZWZpbmVkKENPTkZJR19DT01QQVQpCisJCS5jb21wYXRfaW9jdGwgPSBub3V2ZWF1X2NvbXBhdF9pb2N0bCwKKyNlbmRpZgorCX0sCisJLnBjaV9kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJJVkVSX05BTUUsCisJCS5pZF90YWJsZSA9IHBjaWlkbGlzdCwKKwkJLnByb2JlID0gbm91dmVhdV9wY2lfcHJvYmUsCisJCS5yZW1vdmUgPSBub3V2ZWF1X3BjaV9yZW1vdmUsCisJCS5zdXNwZW5kID0gbm91dmVhdV9wY2lfc3VzcGVuZCwKKwkJLnJlc3VtZSA9IG5vdXZlYXVfcGNpX3Jlc3VtZQorCX0sCisKKwkuZ2VtX2luaXRfb2JqZWN0ID0gbm91dmVhdV9nZW1fb2JqZWN0X25ldywKKwkuZ2VtX2ZyZWVfb2JqZWN0ID0gbm91dmVhdV9nZW1fb2JqZWN0X2RlbCwKKworCS5uYW1lID0gRFJJVkVSX05BTUUsCisJLmRlc2MgPSBEUklWRVJfREVTQywKKyNpZmRlZiBHSVRfUkVWSVNJT04KKwkuZGF0ZSA9IEdJVF9SRVZJU0lPTiwKKyNlbHNlCisJLmRhdGUgPSBEUklWRVJfREFURSwKKyNlbmRpZgorCS5tYWpvciA9IERSSVZFUl9NQUpPUiwKKwkubWlub3IgPSBEUklWRVJfTUlOT1IsCisJLnBhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG5vdXZlYXVfaW5pdCh2b2lkKQoreworCWRyaXZlci5udW1faW9jdGxzID0gbm91dmVhdV9tYXhfaW9jdGw7CisKKwlpZiAobm91dmVhdV9tb2Rlc2V0ID09IC0xKSB7CisjaWZkZWYgQ09ORklHX1ZHQV9DT05TT0xFCisJCWlmICh2Z2Fjb25fdGV4dF9mb3JjZSgpKQorCQkJbm91dmVhdV9tb2Rlc2V0ID0gMDsKKwkJZWxzZQorI2VuZGlmCisJCQlub3V2ZWF1X21vZGVzZXQgPSAxOworCX0KKworCWlmIChub3V2ZWF1X21vZGVzZXQgPT0gMSkKKwkJZHJpdmVyLmRyaXZlcl9mZWF0dXJlcyB8PSBEUklWRVJfTU9ERVNFVDsKKworCXJldHVybiBkcm1faW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG5vdXZlYXVfZXhpdCh2b2lkKQoreworCWRybV9leGl0KCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChub3V2ZWF1X2luaXQpOworbW9kdWxlX2V4aXQobm91dmVhdV9leGl0KTsKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiNGM3YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJ2LmgKQEAgLTAsMCArMSwxMjg2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUgU3RlcGhhbmUgTWFyY2hlc2luLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fTk9VVkVBVV9EUlZfSF9fCisjZGVmaW5lIF9fTk9VVkVBVV9EUlZfSF9fCisKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUgkJIlN0ZXBoYW5lIE1hcmNoZXNpbiIKKyNkZWZpbmUgRFJJVkVSX0VNQUlMCQkiZHJpLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCIKKworI2RlZmluZSBEUklWRVJfTkFNRQkJIm5vdXZlYXUiCisjZGVmaW5lIERSSVZFUl9ERVNDCQkiblZpZGlhIFJpdmEvVE5UL0dlRm9yY2UiCisjZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwOTA0MjAiCisKKyNkZWZpbmUgRFJJVkVSX01BSk9SCQkwCisjZGVmaW5lIERSSVZFUl9NSU5PUgkJMAorI2RlZmluZSBEUklWRVJfUEFUQ0hMRVZFTAkxNQorCisjZGVmaW5lIE5PVVZFQVVfRkFNSUxZICAgMHgwMDAwRkZGRgorI2RlZmluZSBOT1VWRUFVX0ZMQUdTICAgIDB4RkZGRjAwMDAKKworI2luY2x1ZGUgInR0bS90dG1fYm9fYXBpLmgiCisjaW5jbHVkZSAidHRtL3R0bV9ib19kcml2ZXIuaCIKKyNpbmNsdWRlICJ0dG0vdHRtX3BsYWNlbWVudC5oIgorI2luY2x1ZGUgInR0bS90dG1fbWVtb3J5LmgiCisjaW5jbHVkZSAidHRtL3R0bV9tb2R1bGUuaCIKKworc3RydWN0IG5vdXZlYXVfZnByaXYgeworCXN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlOworfTsKKworI2RlZmluZSBEUk1fRklMRV9QQUdFX09GRlNFVCAoMHgxMDAwMDAwMDBVTEwgPj4gUEFHRV9TSElGVCkKKworI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9yZWcuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Jpb3MuaCIKKworI2RlZmluZSBNQVhfTlVNX0RDQl9FTlRSSUVTIDE2CisKKyNkZWZpbmUgTk9VVkVBVV9NQVhfQ0hBTk5FTF9OUiAxMjgKKworI2RlZmluZSBOVjUwX1ZNX01BWF9WUkFNICgyKjEwMjQqMTAyNCoxMDI0VUxMKQorI2RlZmluZSBOVjUwX1ZNX0JMT0NLICAgICg1MTIqMTAyNCoxMDI0VUxMKQorI2RlZmluZSBOVjUwX1ZNX1ZSQU1fTlIgIChOVjUwX1ZNX01BWF9WUkFNIC8gTlY1MF9WTV9CTE9DSykKKworc3RydWN0IG5vdXZlYXVfYm8geworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCBibzsKKwlzdHJ1Y3QgdHRtX3BsYWNlbWVudCBwbGFjZW1lbnQ7CisJdTMyIHBsYWNlbWVudHNbM107CisJc3RydWN0IHR0bV9ib19rbWFwX29iaiBrbWFwOworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKworCS8qIHByb3RlY3RlZCBieSB0dG1fYm9fcmVzZXJ2ZSgpICovCisJc3RydWN0IGRybV9maWxlICpyZXNlcnZlZF9ieTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OworCWludCBwYmJvX2luZGV4OworCisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbm5lbDsKKworCWJvb2wgbWFwcGFibGU7CisJYm9vbCBub192bTsKKworCXVpbnQzMl90IHRpbGVfbW9kZTsKKwl1aW50MzJfdCB0aWxlX2ZsYWdzOworCisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW07CisJc3RydWN0IGRybV9maWxlICpjcHVfZmlscDsKKwlpbnQgcGluX3JlZmNudDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5vdXZlYXVfYm8gKgorbm91dmVhdV9ibyhzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQoreworCXJldHVybiBjb250YWluZXJfb2YoYm8sIHN0cnVjdCBub3V2ZWF1X2JvLCBibyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5vdXZlYXVfYm8gKgorbm91dmVhdV9nZW1fb2JqZWN0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtKQoreworCXJldHVybiBnZW0gPyBnZW0tPmRyaXZlcl9wcml2YXRlIDogTlVMTDsKK30KKworLyogVE9ETzogc3VibWl0IGVxdWl2YWxlbnQgdG8gVFRNIGdlbmVyaWMgQVBJIHVwc3RyZWFtPyAqLworc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKgorbnZib19rbWFwX29ial9pb3ZpcnR1YWwoc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8pCit7CisJYm9vbCBpc19pb21lbTsKKwl2b2lkIF9faW9tZW0gKmlvcHRyID0gKHZvaWQgX19mb3JjZSBfX2lvbWVtICopdHRtX2ttYXBfb2JqX3ZpcnR1YWwoCisJCQkJCQkmbnZiby0+a21hcCwgJmlzX2lvbWVtKTsKKwlXQVJOX09OX09OQ0UoaW9wdHIgJiYgIWlzX2lvbWVtKTsKKwlyZXR1cm4gaW9wdHI7Cit9CisKK3N0cnVjdCBtZW1fYmxvY2sgeworCXN0cnVjdCBtZW1fYmxvY2sgKm5leHQ7CisJc3RydWN0IG1lbV9ibG9jayAqcHJldjsKKwl1aW50NjRfdCBzdGFydDsKKwl1aW50NjRfdCBzaXplOworCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2OyAvKiBOVUxMOiBmcmVlLCAtMTogaGVhcCwgb3RoZXI6IHJlYWwgZmlsZXMgKi8KK307CisKK2VudW0gbm91dmVhdV9mbGFncyB7CisJTlZfTkZPUkNFICAgPSAweDEwMDAwMDAwLAorCU5WX05GT1JDRTIgID0gMHgyMDAwMDAwMAorfTsKKworI2RlZmluZSBOVk9CSl9FTkdJTkVfU1cJCTAKKyNkZWZpbmUgTlZPQkpfRU5HSU5FX0dSCQkxCisjZGVmaW5lIE5WT0JKX0VOR0lORV9ESVNQTEFZCTIKKyNkZWZpbmUgTlZPQkpfRU5HSU5FX0lOVAkweGRlYWRiZWVmCisKKyNkZWZpbmUgTlZPQkpfRkxBR19BTExPV19OT19SRUZTCSgxIDw8IDApCisjZGVmaW5lIE5WT0JKX0ZMQUdfWkVST19BTExPQwkJKDEgPDwgMSkKKyNkZWZpbmUgTlZPQkpfRkxBR19aRVJPX0ZSRUUJCSgxIDw8IDIpCisjZGVmaW5lIE5WT0JKX0ZMQUdfRkFLRQkJCSgxIDw8IDMpCitzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmltX2NoYW5uZWw7CisJc3RydWN0IG1lbV9ibG9jayAqaW1fcHJhbWluOworCXN0cnVjdCBub3V2ZWF1X2JvICppbV9iYWNraW5nOworCXVpbnQzMl90IGltX2JhY2tpbmdfc3RhcnQ7CisJdWludDMyX3QgKmltX2JhY2tpbmdfc3VzcGVuZDsKKwlpbnQgaW1fYm91bmQ7CisKKwl1aW50MzJfdCBmbGFnczsKKwlpbnQgcmVmY291bnQ7CisKKwl1aW50MzJfdCBlbmdpbmU7CisJdWludDMyX3QgY2xhc3M7CisKKwl2b2lkICgqZHRvcikoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOworCXZvaWQgKnByaXY7Cit9OworCitzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iajsKKwl1aW50MzJfdCBpbnN0YW5jZTsKKworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW5uZWw7CisJaW50IGhhbmRsZTsKK307CisKK3N0cnVjdCBub3V2ZWF1X2NoYW5uZWwgeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CisJaW50IGlkOworCisJLyogb3duZXIgb2YgdGhpcyBmaWZvICovCisJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXY7CisJLyogbWFwcGluZyBvZiB0aGUgZmlmbyBpdHNlbGYgKi8KKwlzdHJ1Y3QgZHJtX2xvY2FsX21hcCAqbWFwOworCisJLyogbWFwcGluZyBvZiB0aGUgcmVncyBjb250cm9saW5nIHRoZSBmaWZvICovCisJdm9pZCBfX2lvbWVtICp1c2VyOworCXVpbnQzMl90IHVzZXJfZ2V0OworCXVpbnQzMl90IHVzZXJfcHV0OworCisJLyogRmVuY2luZyAqLworCXN0cnVjdCB7CisJCS8qIGxvY2sgcHJvdGVjdHMgdGhlIHBlbmRpbmcgbGlzdCBvbmx5ICovCisJCXNwaW5sb2NrX3QgbG9jazsKKwkJc3RydWN0IGxpc3RfaGVhZCBwZW5kaW5nOworCQl1aW50MzJfdCBzZXF1ZW5jZTsKKwkJdWludDMyX3Qgc2VxdWVuY2VfYWNrOworCQl1aW50MzJfdCBsYXN0X3NlcXVlbmNlX2lycTsKKwl9IGZlbmNlOworCisJLyogRE1BIHB1c2ggYnVmZmVyICovCisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqcHVzaGJ1ZjsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAgICAgICAgICpwdXNoYnVmX2JvOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgIHB1c2hidWZfYmFzZTsKKworCS8qIE5vdGlmaWVyIG1lbW9yeSAqLworCXN0cnVjdCBub3V2ZWF1X2JvICpub3RpZmllcl9ibzsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpub3RpZmllcl9oZWFwOworCisJLyogUEZJRk8gY29udGV4dCAqLworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKnJhbWZjOworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKmNhY2hlOworCisJLyogUEdSQVBIIGNvbnRleHQgKi8KKwkvKiBYWFggbWF5IGJlIG1lcmdlIDIgcG9pbnRlcnMgYXMgcHJpdmF0ZSBkYXRhID8/PyAqLworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKnJhbWluX2dyY3R4OworCXZvaWQgKnBncmFwaF9jdHg7CisKKwkvKiBOVjUwIFZNICovCisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICAgICAqdm1fcGQ7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqdm1fZ2FydF9wdDsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICp2bV92cmFtX3B0W05WNTBfVk1fVlJBTV9OUl07CisKKwkvKiBPYmplY3RzICovCisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqcmFtaW47IC8qIFByaXZhdGUgaW5zdG1lbSAqLworCXN0cnVjdCBtZW1fYmxvY2sgICAgICAgICAgKnJhbWluX2hlYXA7IC8qIFByaXZhdGUgUFJBTUlOIGhlYXAgKi8KKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICpyYW1odDsgLyogSGFzaCB0YWJsZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgIHJhbWh0X3JlZnM7IC8qIE9iamVjdHMgcmVmZXJlbmNlZCBieSBSQU1IVCAqLworCisJLyogR1BVIG9iamVjdCBpbmZvIGZvciBzdHVmZiB1c2VkIGluLWtlcm5lbCAobW1fZW5hYmxlZCkgKi8KKwl1aW50MzJfdCBtMm1mX250Znk7CisJdWludDMyX3QgdnJhbV9oYW5kbGU7CisJdWludDMyX3QgZ2FydF9oYW5kbGU7CisJYm9vbCBhY2NlbF9kb25lOworCisJLyogUHVzaCBidWZmZXIgc3RhdGUgKG9ubHkgZm9yIGRybSdzIGNoYW5uZWwgb24gIW1tX2VuYWJsZWQpICovCisJc3RydWN0IHsKKwkJaW50IG1heDsKKwkJaW50IGZyZWU7CisJCWludCBjdXI7CisJCWludCBwdXQ7CisJCS8qIGFjY2VzcyB2aWEgcHVzaGJ1Zl9ibyAqLworCX0gZG1hOworCisJdWludDMyX3Qgc3dfc3ViY2hhbm5lbFs4XTsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqdmJsc2VtOworCQl1aW50MzJfdCB2YmxzZW1fb2Zmc2V0OworCQl1aW50MzJfdCB2YmxzZW1fcnZhbDsKKwkJc3RydWN0IGxpc3RfaGVhZCB2Ymxfd2FpdDsKKwl9IG52c3c7CisKKwlzdHJ1Y3QgeworCQlib29sIGFjdGl2ZTsKKwkJY2hhciBuYW1lWzMyXTsKKwkJc3RydWN0IGRybV9pbmZvX2xpc3QgaW5mbzsKKwl9IGRlYnVnZnM7Cit9OworCitzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtX2VuZ2luZSB7CisJdm9pZAkqcHJpdjsKKworCWludAkoKmluaXQpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCXZvaWQJKCp0YWtlZG93bikoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisJaW50CSgqc3VzcGVuZCkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisJdm9pZAkoKnJlc3VtZSkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisKKwlpbnQJKCpwb3B1bGF0ZSkoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICosCisJCQkgICAgdWludDMyX3QgKnNpemUpOworCXZvaWQJKCpjbGVhcikoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOworCWludAkoKmJpbmQpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKKwlpbnQJKCp1bmJpbmQpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKKwl2b2lkCSgqcHJlcGFyZV9hY2Nlc3MpKHN0cnVjdCBkcm1fZGV2aWNlICosIGJvb2wgd3JpdGUpOworCXZvaWQJKCpmaW5pc2hfYWNjZXNzKShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK307CisKK3N0cnVjdCBub3V2ZWF1X21jX2VuZ2luZSB7CisJaW50ICAoKmluaXQpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCXZvaWQgKCp0YWtlZG93bikoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Cit9OworCitzdHJ1Y3Qgbm91dmVhdV90aW1lcl9lbmdpbmUgeworCWludCAgICAgICgqaW5pdCkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisJdm9pZCAgICAgKCp0YWtlZG93bikoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisJdWludDY0X3QgKCpyZWFkKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK307CisKK3N0cnVjdCBub3V2ZWF1X2ZiX2VuZ2luZSB7CisJaW50ICAoKmluaXQpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCXZvaWQgKCp0YWtlZG93bikoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Cit9OworCitzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSB7CisJdm9pZCAqcHJpdjsKKworCWludCAgY2hhbm5lbHM7CisKKwlpbnQgICgqaW5pdCkoc3RydWN0IGRybV9kZXZpY2UgKik7CisJdm9pZCAoKnRha2Vkb3duKShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKworCXZvaWQgKCpkaXNhYmxlKShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwl2b2lkICgqZW5hYmxlKShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwlib29sICgqcmVhc3NpZ24pKHN0cnVjdCBkcm1fZGV2aWNlICosIGJvb2wgZW5hYmxlKTsKKworCWludCAgKCpjaGFubmVsX2lkKShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKworCWludCAgKCpjcmVhdGVfY29udGV4dCkoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKKwl2b2lkICgqZGVzdHJveV9jb250ZXh0KShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworCWludCAgKCpsb2FkX2NvbnRleHQpKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CisJaW50ICAoKnVubG9hZF9jb250ZXh0KShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK307CisKK3N0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfbWV0aG9kIHsKKwlpbnQgaWQ7CisJaW50ICgqZXhlYykoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsIGludCBtdGhkLAorCQkgICAgICB1aW50MzJfdCBkYXRhKTsKK307CisKK3N0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgeworCWludCBpZDsKKwlib29sIHNvZnR3YXJlOworCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfbWV0aG9kICptZXRob2RzOworfTsKKworc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSB7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyAqZ3JjbGFzczsKKwlib29sIGFjY2VsX2Jsb2NrZWQ7CisJdm9pZCAqY3R4cHJvZzsKKwl2b2lkICpjdHh2YWxzOworCisJaW50ICAoKmluaXQpKHN0cnVjdCBkcm1fZGV2aWNlICopOworCXZvaWQgKCp0YWtlZG93bikoc3RydWN0IGRybV9kZXZpY2UgKik7CisKKwl2b2lkICgqZmlmb19hY2Nlc3MpKHN0cnVjdCBkcm1fZGV2aWNlICosIGJvb2wpOworCisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKCpjaGFubmVsKShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwlpbnQgICgqY3JlYXRlX2NvbnRleHQpKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CisJdm9pZCAoKmRlc3Ryb3lfY29udGV4dCkoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKKwlpbnQgICgqbG9hZF9jb250ZXh0KShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworCWludCAgKCp1bmxvYWRfY29udGV4dCkoc3RydWN0IGRybV9kZXZpY2UgKik7Cit9OworCitzdHJ1Y3Qgbm91dmVhdV9lbmdpbmUgeworCXN0cnVjdCBub3V2ZWF1X2luc3RtZW1fZW5naW5lIGluc3RtZW07CisJc3RydWN0IG5vdXZlYXVfbWNfZW5naW5lICAgICAgbWM7CisJc3RydWN0IG5vdXZlYXVfdGltZXJfZW5naW5lICAgdGltZXI7CisJc3RydWN0IG5vdXZlYXVfZmJfZW5naW5lICAgICAgZmI7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAgZ3JhcGg7CisJc3RydWN0IG5vdXZlYXVfZmlmb19lbmdpbmUgICAgZmlmbzsKK307CisKK3N0cnVjdCBub3V2ZWF1X3BsbF92YWxzIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCQl1aW50OF90IE4xLCBNMSwgTjIsIE0yOworI2Vsc2UKKwkJCXVpbnQ4X3QgTTEsIE4xLCBNMiwgTjI7CisjZW5kaWYKKwkJfTsKKwkJc3RydWN0IHsKKwkJCXVpbnQxNl90IE5NMSwgTk0yOworCQl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCX07CisJaW50IGxvZzJQOworCisJaW50IHJlZmNsazsKK307CisKK2VudW0gbnYwNF9mcF9kaXNwbGF5X3JlZ3MgeworCUZQX0RJU1BMQVlfRU5ELAorCUZQX1RPVEFMLAorCUZQX0NSVEMsCisJRlBfU1lOQ19TVEFSVCwKKwlGUF9TWU5DX0VORCwKKwlGUF9WQUxJRF9TVEFSVCwKKwlGUF9WQUxJRF9FTkQKK307CisKK3N0cnVjdCBudjA0X2NydGNfcmVnIHsKKwl1bnNpZ25lZCBjaGFyIE1pc2NPdXRSZWc7ICAgICAvKiAqLworCXVpbnQ4X3QgQ1JUQ1sweDlmXTsKKwl1aW50OF90IENSNThbMHgxMF07CisJdWludDhfdCBTZXF1ZW5jZXJbNV07CisJdWludDhfdCBHcmFwaGljc1s5XTsKKwl1aW50OF90IEF0dHJpYnV0ZVsyMV07CisJdW5zaWduZWQgY2hhciBEQUNbNzY4XTsgICAgICAgLyogSW50ZXJuYWwgQ29sb3Jsb29rdXB0YWJsZSAqLworCisJLyogUENSVEMgcmVncyAqLworCXVpbnQzMl90IGZiX3N0YXJ0OworCXVpbnQzMl90IGNydGNfY2ZnOworCXVpbnQzMl90IGN1cnNvcl9jZmc7CisJdWludDMyX3QgZ3Bpb19leHQ7CisJdWludDMyX3QgY3J0Y184MzA7CisJdWludDMyX3QgY3J0Y184MzQ7CisJdWludDMyX3QgY3J0Y184NTA7CisJdWludDMyX3QgY3J0Y19lbmdfY3RybDsKKworCS8qIFBSQU1EQUMgcmVncyAqLworCXVpbnQzMl90IG52MTBfY3Vyc3luYzsKKwlzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyBwbGx2YWxzOworCXVpbnQzMl90IHJhbWRhY19nZW5fY3RybDsKKwl1aW50MzJfdCByYW1kYWNfNjMwOworCXVpbnQzMl90IHJhbWRhY182MzQ7CisJdWludDMyX3QgdHZfc2V0dXA7CisJdWludDMyX3QgdHZfdnRvdGFsOworCXVpbnQzMl90IHR2X3Zza2V3OworCXVpbnQzMl90IHR2X3ZzeW5jX2RlbGF5OworCXVpbnQzMl90IHR2X2h0b3RhbDsKKwl1aW50MzJfdCB0dl9oc2tldzsKKwl1aW50MzJfdCB0dl9oc3luY19kZWxheTsKKwl1aW50MzJfdCB0dl9oc3luY19kZWxheTI7CisJdWludDMyX3QgZnBfaG9yaXpfcmVnc1s3XTsKKwl1aW50MzJfdCBmcF92ZXJ0X3JlZ3NbN107CisJdWludDMyX3QgZGl0aGVyOworCXVpbnQzMl90IGZwX2NvbnRyb2w7CisJdWludDMyX3QgZGl0aGVyX3JlZ3NbNl07CisJdWludDMyX3QgZnBfZGVidWdfMDsKKwl1aW50MzJfdCBmcF9kZWJ1Z18xOworCXVpbnQzMl90IGZwX2RlYnVnXzI7CisJdWludDMyX3QgZnBfbWFyZ2luX2NvbG9yOworCXVpbnQzMl90IHJhbWRhY184YzA7CisJdWludDMyX3QgcmFtZGFjX2EyMDsKKwl1aW50MzJfdCByYW1kYWNfYTI0OworCXVpbnQzMl90IHJhbWRhY19hMzQ7CisJdWludDMyX3QgY3R2X3JlZ3NbMzhdOworfTsKKworc3RydWN0IG52MDRfb3V0cHV0X3JlZyB7CisJdWludDMyX3Qgb3V0cHV0OworCWludCBoZWFkOworfTsKKworc3RydWN0IG52MDRfbW9kZV9zdGF0ZSB7CisJdWludDMyX3QgYnBwOworCXVpbnQzMl90IHdpZHRoOworCXVpbnQzMl90IGhlaWdodDsKKwl1aW50MzJfdCBpbnRlcmxhY2U7CisJdWludDMyX3QgcmVwYWludDA7CisJdWludDMyX3QgcmVwYWludDE7CisJdWludDMyX3Qgc2NyZWVuOworCXVpbnQzMl90IHNjYWxlOworCXVpbnQzMl90IGRpdGhlcjsKKwl1aW50MzJfdCBleHRyYTsKKwl1aW50MzJfdCBmaWZvOworCXVpbnQzMl90IHBpeGVsOworCXVpbnQzMl90IGhvcml6OworCWludCBhcmJpdHJhdGlvbjA7CisJaW50IGFyYml0cmF0aW9uMTsKKwl1aW50MzJfdCBwbGw7CisJdWludDMyX3QgcGxsQjsKKwl1aW50MzJfdCB2cGxsOworCXVpbnQzMl90IHZwbGwyOworCXVpbnQzMl90IHZwbGxCOworCXVpbnQzMl90IHZwbGwyQjsKKwl1aW50MzJfdCBwbGxzZWw7CisJdWludDMyX3Qgc2VsX2NsazsKKwl1aW50MzJfdCBnZW5lcmFsOworCXVpbnQzMl90IGNydGNPd25lcjsKKwl1aW50MzJfdCBoZWFkOworCXVpbnQzMl90IGhlYWQyOworCXVpbnQzMl90IGN1cnNvckNvbmZpZzsKKwl1aW50MzJfdCBjdXJzb3IwOworCXVpbnQzMl90IGN1cnNvcjE7CisJdWludDMyX3QgY3Vyc29yMjsKKwl1aW50MzJfdCB0aW1pbmdIOworCXVpbnQzMl90IHRpbWluZ1Y7CisJdWludDMyX3QgZGlzcGxheVY7CisJdWludDMyX3QgY3J0Y1N5bmM7CisKKwlzdHJ1Y3QgbnYwNF9jcnRjX3JlZyBjcnRjX3JlZ1syXTsKK307CisKK2VudW0gbm91dmVhdV9jYXJkX3R5cGUgeworCU5WXzA0ICAgICAgPSAweDAwLAorCU5WXzEwICAgICAgPSAweDEwLAorCU5WXzIwICAgICAgPSAweDIwLAorCU5WXzMwICAgICAgPSAweDMwLAorCU5WXzQwICAgICAgPSAweDQwLAorCU5WXzUwICAgICAgPSAweDUwLAorfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CisJZW51bSB7CisJCU5PVVZFQVVfQ0FSRF9JTklUX0RPV04sCisJCU5PVVZFQVVfQ0FSRF9JTklUX0RPTkUsCisJCU5PVVZFQVVfQ0FSRF9JTklUX0ZBSUxFRAorCX0gaW5pdF9zdGF0ZTsKKworCS8qIHRoZSBjYXJkIHR5cGUsIHRha2VzIE5WXyogYXMgdmFsdWVzICovCisJZW51bSBub3V2ZWF1X2NhcmRfdHlwZSBjYXJkX3R5cGU7CisJLyogZXhhY3QgY2hpcHNldCwgZGVyaXZlZCBmcm9tIE5WX1BNQ19CT09UXzAgKi8KKwlpbnQgY2hpcHNldDsKKwlpbnQgZmxhZ3M7CisKKwl2b2lkIF9faW9tZW0gKm1taW87CisJdm9pZCBfX2lvbWVtICpyYW1pbjsKKwl1aW50MzJfdCByYW1pbl9zaXplOworCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBpcnFfd29yazsKKworCXN0cnVjdCBsaXN0X2hlYWQgdmJsX3dhaXRpbmc7CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgdHRtX2dsb2JhbF9yZWZlcmVuY2UgbWVtX2dsb2JhbF9yZWY7CisJCXN0cnVjdCB0dG1fYm9fZ2xvYmFsX3JlZiBib19nbG9iYWxfcmVmOworCQlzdHJ1Y3QgdHRtX2JvX2RldmljZSBiZGV2OworCQlzcGlubG9ja190IGJvX2xpc3RfbG9jazsKKwkJc3RydWN0IGxpc3RfaGVhZCBib19saXN0OworCQlhdG9taWNfdCB2YWxpZGF0ZV9zZXF1ZW5jZTsKKwl9IHR0bTsKKworCXN0cnVjdCBmYl9pbmZvICpmYmRldl9pbmZvOworCisJaW50IGZpZm9fYWxsb2NfY291bnQ7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqZmlmb3NbTk9VVkVBVV9NQVhfQ0hBTk5FTF9OUl07CisKKwlzdHJ1Y3Qgbm91dmVhdV9lbmdpbmUgZW5naW5lOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW5uZWw7CisKKwkvKiBSQU1JTiBjb25maWd1cmF0aW9uLCBSQU1GQywgUkFNSFQgYW5kIFJBTVJPIG9mZnNldHMgKi8KKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnJhbWh0OworCXVpbnQzMl90IHJhbWluX3JzdmRfdnJhbTsKKwl1aW50MzJfdCByYW1odF9vZmZzZXQ7CisJdWludDMyX3QgcmFtaHRfc2l6ZTsKKwl1aW50MzJfdCByYW1odF9iaXRzOworCXVpbnQzMl90IHJhbWZjX29mZnNldDsKKwl1aW50MzJfdCByYW1mY19zaXplOworCXVpbnQzMl90IHJhbXJvX29mZnNldDsKKwl1aW50MzJfdCByYW1yb19zaXplOworCisJLyogYmFzZSBwaHlzaWNhbCBhZHJlc3NlcyAqLworCXVpbnQ2NF90IGZiX3BoeXM7CisJdWludDY0X3QgZmJfYXZhaWxhYmxlX3NpemU7CisJdWludDY0X3QgZmJfbWFwcGFibGVfcGFnZXM7CisJdWludDY0X3QgZmJfYXBlcl9mcmVlOworCisJc3RydWN0IHsKKwkJZW51bSB7CisJCQlOT1VWRUFVX0dBUlRfTk9ORSA9IDAsCisJCQlOT1VWRUFVX0dBUlRfQUdQLAorCQkJTk9VVkVBVV9HQVJUX1NHRE1BCisJCX0gdHlwZTsKKwkJdWludDY0X3QgYXBlcl9iYXNlOworCQl1aW50NjRfdCBhcGVyX3NpemU7CisJCXVpbnQ2NF90IGFwZXJfZnJlZTsKKworCQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnNnX2N0eGRtYTsKKwkJc3RydWN0IHBhZ2UgKnNnX2R1bW15X3BhZ2U7CisJCWRtYV9hZGRyX3Qgc2dfZHVtbXlfYnVzOworCisJCS8qIG5vdHRtIGhhY2sgKi8KKwkJc3RydWN0IGRybV90dG1fYmFja2VuZCAqc2dfYmU7CisJCXVuc2lnbmVkIGxvbmcgc2dfaGFuZGxlOworCX0gZ2FydF9pbmZvOworCisJLyogRzh4L0c5eCB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi8KKwl1aW50NjRfdCB2bV9nYXJ0X2Jhc2U7CisJdWludDY0X3Qgdm1fZ2FydF9zaXplOworCXVpbnQ2NF90IHZtX3ZyYW1fYmFzZTsKKwl1aW50NjRfdCB2bV92cmFtX3NpemU7CisJdWludDY0X3Qgdm1fZW5kOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqdm1fdnJhbV9wdFtOVjUwX1ZNX1ZSQU1fTlJdOworCWludCB2bV92cmFtX3B0X25yOworCisJLyogdGhlIG10cnIgY292ZXJpbmcgdGhlIEZCICovCisJaW50IGZiX210cnI7CisKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpyYW1pbl9oZWFwOworCisJLyogY29udGV4dCB0YWJsZSBwb2ludGVkIHRvIGJlIE5WX1BHUkFQSF9DSEFOTkVMX0NUWF9UQUJMRSAoMHg0MDA3ODApICovCisJdWludDMyX3QgY3R4X3RhYmxlX3NpemU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqY3R4X3RhYmxlOworCisJc3RydWN0IGxpc3RfaGVhZCBncHVvYmpfbGlzdDsKKworCXN0cnVjdCBudmJpb3MgVkJJT1M7CisJc3RydWN0IG5vdXZlYXVfYmlvc19pbmZvICp2YmlvczsKKworCXN0cnVjdCBudjA0X21vZGVfc3RhdGUgbW9kZV9yZWc7CisJc3RydWN0IG52MDRfbW9kZV9zdGF0ZSBzYXZlZF9yZWc7CisJdWludDMyX3Qgc2F2ZWRfdmdhX2ZvbnRbNF1bMTYzODRdOworCXVpbnQzMl90IGNydGNfb3duZXI7CisJdWludDMyX3QgZGFjX3VzZXJzWzRdOworCisJc3RydWN0IG5vdXZlYXVfc3VzcGVuZF9yZXN1bWUgeworCQl1aW50MzJfdCBmaWZvX21vZGU7CisJCXVpbnQzMl90IGdyYXBoX2N0eF9jb250cm9sOworCQl1aW50MzJfdCBncmFwaF9zdGF0ZTsKKwkJdWludDMyX3QgKnJhbWluX2NvcHk7CisJCXVpbnQ2NF90IHJhbWluX3NpemU7CisJfSBzdXNyZXM7CisKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmFja2xpZ2h0OworCWJvb2wgYWNwaV9kc207CisKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm87CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgZGVudHJ5ICpjaGFubmVsX3Jvb3Q7CisJfSBkZWJ1Z2ZzOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqCitub3V2ZWF1X2JkZXYoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkKQoreworCXJldHVybiBjb250YWluZXJfb2YoYmQsIHN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlLCB0dG0uYmRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citub3V2ZWF1X2JvX3JlZihzdHJ1Y3Qgbm91dmVhdV9ibyAqcmVmLCBzdHJ1Y3Qgbm91dmVhdV9ibyAqKnBudmJvKQoreworCXN0cnVjdCBub3V2ZWF1X2JvICpwcmV2OworCisJaWYgKCFwbnZibykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHJldiA9ICpwbnZibzsKKworCSpwbnZibyA9IHJlZiA/IG5vdXZlYXVfYm8odHRtX2JvX3JlZmVyZW5jZSgmcmVmLT5ibykpIDogTlVMTDsKKwlpZiAocHJldikgeworCQlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0gJnByZXYtPmJvOworCisJCXR0bV9ib191bnJlZigmYm8pOworCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIE5PVVZFQVVfQ0hFQ0tfSU5JVElBTElTRURfV0lUSF9SRVRVUk4gZG8geyAgICAgICAgICAgIFwKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqbnYgPSBkZXYtPmRldl9wcml2YXRlOyAgICBcCisJaWYgKG52LT5pbml0X3N0YXRlICE9IE5PVVZFQVVfQ0FSRF9JTklUX0RPTkUpIHsgICAgICAgXAorCQlOVl9FUlJPUihkZXYsICJjYWxsZWQgd2l0aG91dCBpbml0XG4iKTsgICAgICAgXAorCQlyZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTk9VVkVBVV9HRVRfVVNFUl9DSEFOTkVMX1dJVEhfUkVUVVJOKGlkLCBjbCwgY2gpIGRvIHsgICAgXAorCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpudiA9IGRldi0+ZGV2X3ByaXZhdGU7ICAgICAgIFwKKwlpZiAoIW5vdXZlYXVfY2hhbm5lbF9vd25lcihkZXYsIChjbCksIChpZCkpKSB7ICAgICAgICAgICBcCisJCU5WX0VSUk9SKGRldiwgInBpZCAlZCBkb2Vzbid0IG93biBjaGFubmVsICVkXG4iLCBcCisJCQkgRFJNX0NVUlJFTlRQSUQsIChpZCkpOyAgICAgICAgICAgICAgICAgIFwKKwkJcmV0dXJuIC1FUEVSTTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKGNoKSA9IG52LT5maWZvc1soaWQpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogbm91dmVhdV9kcnYuYyAqLworZXh0ZXJuIGludCBub3V2ZWF1X25vYWdwOworZXh0ZXJuIGludCBub3V2ZWF1X2R1YWxsaW5rOworZXh0ZXJuIGludCBub3V2ZWF1X3VzY3JpcHRfbHZkczsKK2V4dGVybiBpbnQgbm91dmVhdV91c2NyaXB0X3RtZHM7CitleHRlcm4gaW50IG5vdXZlYXVfdnJhbV9wdXNoYnVmOworZXh0ZXJuIGludCBub3V2ZWF1X3ZyYW1fbm90aWZ5OworZXh0ZXJuIGludCBub3V2ZWF1X2ZicGVyY3J0YzsKK2V4dGVybiBjaGFyICpub3V2ZWF1X3R2X25vcm07CitleHRlcm4gaW50IG5vdXZlYXVfcmVnX2RlYnVnOworZXh0ZXJuIGNoYXIgKm5vdXZlYXVfdmJpb3M7CisKKy8qIG5vdXZlYXVfc3RhdGUuYyAqLworZXh0ZXJuIHZvaWQgbm91dmVhdV9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKik7CitleHRlcm4gaW50ICBub3V2ZWF1X2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CitleHRlcm4gaW50ICBub3V2ZWF1X2ZpcnN0b3BlbihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG5vdXZlYXVfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIGludCAgbm91dmVhdV91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBub3V2ZWF1X2lvY3RsX2dldHBhcmFtKHN0cnVjdCBkcm1fZGV2aWNlICosIHZvaWQgKmRhdGEsCisJCQkJICAgc3RydWN0IGRybV9maWxlICopOworZXh0ZXJuIGludCAgbm91dmVhdV9pb2N0bF9zZXRwYXJhbShzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICpkYXRhLAorCQkJCSAgIHN0cnVjdCBkcm1fZmlsZSAqKTsKK2V4dGVybiBib29sIG5vdXZlYXVfd2FpdF91bnRpbChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1aW50NjRfdCB0aW1lb3V0LAorCQkJICAgICAgIHVpbnQzMl90IHJlZywgdWludDMyX3QgbWFzaywgdWludDMyX3QgdmFsKTsKK2V4dGVybiBib29sIG5vdXZlYXVfd2FpdF9mb3JfaWRsZShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfY2FyZF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIGludCAgbm91dmVhdV9pb2N0bF9jYXJkX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqZGF0YSwKKwkJCQkgICAgc3RydWN0IGRybV9maWxlICopOworZXh0ZXJuIGludCAgbm91dmVhdV9pb2N0bF9zdXNwZW5kKHN0cnVjdCBkcm1fZGV2aWNlICosIHZvaWQgKmRhdGEsCisJCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKik7CitleHRlcm4gaW50ICBub3V2ZWF1X2lvY3RsX3Jlc3VtZShzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICpkYXRhLAorCQkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKik7CisKKy8qIG5vdXZlYXVfbWVtLmMgKi8KK2V4dGVybiBpbnQgIG5vdXZlYXVfbWVtX2luaXRfaGVhcChzdHJ1Y3QgbWVtX2Jsb2NrICoqLCB1aW50NjRfdCBzdGFydCwKKwkJCQkgdWludDY0X3Qgc2l6ZSk7CitleHRlcm4gc3RydWN0IG1lbV9ibG9jayAqbm91dmVhdV9tZW1fYWxsb2NfYmxvY2soc3RydWN0IG1lbV9ibG9jayAqLAorCQkJCQkJIHVpbnQ2NF90IHNpemUsIGludCBhbGlnbjIsCisJCQkJCQkgc3RydWN0IGRybV9maWxlICosIGludCB0YWlsKTsKK2V4dGVybiB2b2lkIG5vdXZlYXVfbWVtX3Rha2Vkb3duKHN0cnVjdCBtZW1fYmxvY2sgKipoZWFwKTsKK2V4dGVybiB2b2lkIG5vdXZlYXVfbWVtX2ZyZWVfYmxvY2soc3RydWN0IG1lbV9ibG9jayAqKTsKK2V4dGVybiB1aW50NjRfdCBub3V2ZWF1X21lbV9mYl9hbW91bnQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBub3V2ZWF1X21lbV9yZWxlYXNlKHN0cnVjdCBkcm1fZmlsZSAqLCBzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfbWVtX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBub3V2ZWF1X21lbV9pbml0X2FncChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG5vdXZlYXVfbWVtX2Nsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIGludCAgbnY1MF9tZW1fdm1fYmluZF9saW5lYXIoc3RydWN0IGRybV9kZXZpY2UgKiwgdWludDY0X3QgdmlydCwKKwkJCQkgICAgdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgZmxhZ3MsCisJCQkJICAgIHVpbnQ2NF90IHBoeXMpOworZXh0ZXJuIHZvaWQgbnY1MF9tZW1fdm1fdW5iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICosIHVpbnQ2NF90IHZpcnQsCisJCQkgICAgICAgdWludDMyX3Qgc2l6ZSk7CisKKy8qIG5vdXZlYXVfbm90aWZpZXIuYyAqLworZXh0ZXJuIGludCAgbm91dmVhdV9ub3RpZmllcl9pbml0X2NoYW5uZWwoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiB2b2lkIG5vdXZlYXVfbm90aWZpZXJfdGFrZWRvd25fY2hhbm5lbChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIGludCAgbm91dmVhdV9ub3RpZmllcl9hbGxvYyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosIHVpbnQzMl90IGhhbmRsZSwKKwkJCQkgICBpbnQgY291dCwgdWludDMyX3QgKm9mZnNldCk7CitleHRlcm4gaW50ICBub3V2ZWF1X25vdGlmaWVyX29mZnNldChzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKiwgdWludDMyX3QgKik7CitleHRlcm4gaW50ICBub3V2ZWF1X2lvY3RsX25vdGlmaWVyX2FsbG9jKHN0cnVjdCBkcm1fZGV2aWNlICosIHZvaWQgKmRhdGEsCisJCQkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKik7CitleHRlcm4gaW50ICBub3V2ZWF1X2lvY3RsX25vdGlmaWVyX2ZyZWUoc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqZGF0YSwKKwkJCQkJc3RydWN0IGRybV9maWxlICopOworCisvKiBub3V2ZWF1X2NoYW5uZWwuYyAqLworZXh0ZXJuIHN0cnVjdCBkcm1faW9jdGxfZGVzYyBub3V2ZWF1X2lvY3Rsc1tdOworZXh0ZXJuIGludCBub3V2ZWF1X21heF9pb2N0bDsKK2V4dGVybiB2b2lkIG5vdXZlYXVfY2hhbm5lbF9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBkcm1fZmlsZSAqKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfY2hhbm5lbF9vd25lcihzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZHJtX2ZpbGUgKiwKKwkJCQkgIGludCBjaGFubmVsKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfY2hhbm5lbF9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKmNoYW4sCisJCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJCQkgIHVpbnQzMl90IGZiX2N0eGRtYSwgdWludDMyX3QgdHRfY3R4ZG1hKTsKK2V4dGVybiB2b2lkIG5vdXZlYXVfY2hhbm5lbF9mcmVlKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gaW50ICBub3V2ZWF1X2NoYW5uZWxfaWRsZShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKTsKKworLyogbm91dmVhdV9vYmplY3QuYyAqLworZXh0ZXJuIGludCAgbm91dmVhdV9ncHVvYmpfZWFybHlfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfZ3B1b2JqX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBub3V2ZWF1X2dwdW9ial90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG5vdXZlYXVfZ3B1b2JqX2xhdGVfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBub3V2ZWF1X2dwdW9ial9zdXNwZW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgbm91dmVhdV9ncHVvYmpfc3VzcGVuZF9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgbm91dmVhdV9ncHVvYmpfcmVzdW1lKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBub3V2ZWF1X2dwdW9ial9jaGFubmVsX2luaXQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqLAorCQkJCSAgICAgICB1aW50MzJfdCB2cmFtX2gsIHVpbnQzMl90IHR0X2gpOworZXh0ZXJuIHZvaWQgbm91dmVhdV9ncHVvYmpfY2hhbm5lbF90YWtlZG93bihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIGludCBub3V2ZWF1X2dwdW9ial9uZXcoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqLAorCQkJICAgICAgdWludDMyX3Qgc2l6ZSwgaW50IGFsaWduLCB1aW50MzJfdCBmbGFncywKKwkJCSAgICAgIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKik7CitleHRlcm4gaW50IG5vdXZlYXVfZ3B1b2JqX2RlbChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKiopOworZXh0ZXJuIGludCBub3V2ZWF1X2dwdW9ial9yZWZfYWRkKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKiwKKwkJCQkgIHVpbnQzMl90IGhhbmRsZSwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICosCisJCQkJICBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICoqKTsKK2V4dGVybiBpbnQgbm91dmVhdV9ncHVvYmpfcmVmX2RlbChzdHJ1Y3QgZHJtX2RldmljZSAqLAorCQkJCSAgc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqKik7CitleHRlcm4gaW50IG5vdXZlYXVfZ3B1b2JqX3JlZl9maW5kKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKiwgdWludDMyX3QgaGFuZGxlLAorCQkJCSAgIHN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKipyZWZfcmV0KTsKK2V4dGVybiBpbnQgbm91dmVhdV9ncHVvYmpfbmV3X3JlZihzdHJ1Y3QgZHJtX2RldmljZSAqLAorCQkJCSAgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqYWxsb2NfY2hhbiwKKwkJCQkgIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKnJlZl9jaGFuLAorCQkJCSAgdWludDMyX3QgaGFuZGxlLCB1aW50MzJfdCBzaXplLCBpbnQgYWxpZ24sCisJCQkJICB1aW50MzJfdCBmbGFncywgc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqKik7CitleHRlcm4gaW50IG5vdXZlYXVfZ3B1b2JqX25ld19mYWtlKHN0cnVjdCBkcm1fZGV2aWNlICosCisJCQkJICAgdWludDMyX3QgcF9vZmZzZXQsIHVpbnQzMl90IGJfb2Zmc2V0LAorCQkJCSAgIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IGZsYWdzLAorCQkJCSAgIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKiwKKwkJCQkgICBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmKiopOworZXh0ZXJuIGludCBub3V2ZWF1X2dwdW9ial9kbWFfbmV3KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKiwgaW50IGNsYXNzLAorCQkJCSAgdWludDY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplLCBpbnQgYWNjZXNzLAorCQkJCSAgaW50IHRhcmdldCwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqKTsKK2V4dGVybiBpbnQgbm91dmVhdV9ncHVvYmpfZ2FydF9kbWFfbmV3KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKiwKKwkJCQkgICAgICAgdWludDY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplLAorCQkJCSAgICAgICBpbnQgYWNjZXNzLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKiosCisJCQkJICAgICAgIHVpbnQzMl90ICpvX3JldCk7CitleHRlcm4gaW50IG5vdXZlYXVfZ3B1b2JqX2dyX25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosIGludCBjbGFzcywKKwkJCQkgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqKTsKK2V4dGVybiBpbnQgbm91dmVhdV9pb2N0bF9ncm9ial9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICpkYXRhLAorCQkJCSAgICAgc3RydWN0IGRybV9maWxlICopOworZXh0ZXJuIGludCBub3V2ZWF1X2lvY3RsX2dwdW9ial9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICosIHZvaWQgKmRhdGEsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKik7CisKKy8qIG5vdXZlYXVfaXJxLmMgKi8KK2V4dGVybiBpcnFyZXR1cm5fdCBub3V2ZWF1X2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7CitleHRlcm4gdm9pZCAgICAgICAgbm91dmVhdV9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgICAgICAgICBub3V2ZWF1X2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkICAgICAgICBub3V2ZWF1X2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKik7CisKKy8qIG5vdXZlYXVfc2dkbWEuYyAqLworZXh0ZXJuIGludCBub3V2ZWF1X3NnZG1hX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBub3V2ZWF1X3NnZG1hX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIGludCBub3V2ZWF1X3NnZG1hX2dldF9wYWdlKHN0cnVjdCBkcm1fZGV2aWNlICosIHVpbnQzMl90IG9mZnNldCwKKwkJCQkgIHVpbnQzMl90ICpwYWdlKTsKK2V4dGVybiBzdHJ1Y3QgdHRtX2JhY2tlbmQgKm5vdXZlYXVfc2dkbWFfaW5pdF90dG0oc3RydWN0IGRybV9kZXZpY2UgKik7CisKKy8qIG5vdXZlYXVfZGVidWdmcy5jICovCisjaWYgZGVmaW5lZChDT05GSUdfRFJNX05PVVZFQVVfREVCVUcpCitleHRlcm4gaW50ICBub3V2ZWF1X2RlYnVnZnNfaW5pdChzdHJ1Y3QgZHJtX21pbm9yICopOworZXh0ZXJuIHZvaWQgbm91dmVhdV9kZWJ1Z2ZzX3Rha2Vkb3duKHN0cnVjdCBkcm1fbWlub3IgKik7CitleHRlcm4gaW50ICBub3V2ZWF1X2RlYnVnZnNfY2hhbm5lbF9pbml0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gdm9pZCBub3V2ZWF1X2RlYnVnZnNfY2hhbm5lbF9maW5pKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQKK25vdXZlYXVfZGVidWdmc19pbml0KHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbm91dmVhdV9kZWJ1Z2ZzX3Rha2Vkb3duKHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yKQoreworfQorCitzdGF0aWMgaW5saW5lIGludAorbm91dmVhdV9kZWJ1Z2ZzX2NoYW5uZWxfaW5pdChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK25vdXZlYXVfZGVidWdmc19jaGFubmVsX2Zpbmkoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKK30KKyNlbmRpZgorCisvKiBub3V2ZWF1X2RtYS5jICovCitleHRlcm4gaW50ICBub3V2ZWF1X2RtYV9pbml0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gaW50ICBub3V2ZWF1X2RtYV93YWl0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKiwgaW50IHNpemUpOworCisvKiBub3V2ZWF1X2FjcGkuYyAqLworI2lmZGVmIENPTkZJR19BQ1BJCitleHRlcm4gaW50IG5vdXZlYXVfaHlicmlkX3NldHVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIGJvb2wgbm91dmVhdV9kc21fcHJvYmUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgbm91dmVhdV9oeWJyaWRfc2V0dXAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgYm9vbCBub3V2ZWF1X2RzbV9wcm9iZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXJldHVybiBmYWxzZTsKK30KKyNlbmRpZgorCisvKiBub3V2ZWF1X2JhY2tsaWdodC5jICovCisjaWZkZWYgQ09ORklHX0RSTV9OT1VWRUFVX0JBQ0tMSUdIVAorZXh0ZXJuIGludCBub3V2ZWF1X2JhY2tsaWdodF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbm91dmVhdV9iYWNrbGlnaHRfZXhpdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBub3V2ZWF1X2JhY2tsaWdodF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBub3V2ZWF1X2JhY2tsaWdodF9leGl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpIHsgfQorI2VuZGlmCisKKy8qIG5vdXZlYXVfYmlvcy5jICovCitleHRlcm4gaW50IG5vdXZlYXVfYmlvc19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbm91dmVhdV9iaW9zX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBub3V2ZWF1X3J1bl92Ymlvc19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbm91dmVhdV9iaW9zX3J1bl9pbml0X3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICosIHVpbnQxNl90IHRhYmxlLAorCQkJCQlzdHJ1Y3QgZGNiX2VudHJ5ICopOworZXh0ZXJuIHN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqbm91dmVhdV9iaW9zX2dwaW9fZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKiwKKwkJCQkJCSAgICAgIGVudW0gZGNiX2dwaW9fdGFnKTsKK2V4dGVybiBzdHJ1Y3QgZGNiX2Nvbm5lY3Rvcl90YWJsZV9lbnRyeSAqCitub3V2ZWF1X2Jpb3NfY29ubmVjdG9yX2VudHJ5KHN0cnVjdCBkcm1fZGV2aWNlICosIGludCBpbmRleCk7CitleHRlcm4gaW50IGdldF9wbGxfbGltaXRzKHN0cnVjdCBkcm1fZGV2aWNlICosIHVpbnQzMl90IGxpbWl0X21hdGNoLAorCQkJICBzdHJ1Y3QgcGxsX2xpbXMgKik7CitleHRlcm4gaW50IG5vdXZlYXVfYmlvc19ydW5fZGlzcGxheV90YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqLAorCQkJCQkgIHN0cnVjdCBkY2JfZW50cnkgKiwKKwkJCQkJICB1aW50MzJfdCBzY3JpcHQsIGludCBweGNsayk7CitleHRlcm4gdm9pZCAqbm91dmVhdV9iaW9zX2RwX3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBkY2JfZW50cnkgKiwKKwkJCQkgICBpbnQgKmxlbmd0aCk7CitleHRlcm4gYm9vbCBub3V2ZWF1X2Jpb3NfZnBfbW9kZShzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqKTsKK2V4dGVybiB1aW50OF90ICpub3V2ZWF1X2Jpb3NfZW1iZWRkZWRfZWRpZChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgbm91dmVhdV9iaW9zX3BhcnNlX2x2ZHNfdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKiwgaW50IHB4Y2xrLAorCQkJCQkgYm9vbCAqZGwsIGJvb2wgKmlmX2lzXzI0Yml0KTsKK2V4dGVybiBpbnQgcnVuX3RtZHNfdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IGRjYl9lbnRyeSAqLAorCQkJICBpbnQgaGVhZCwgaW50IHB4Y2xrKTsKK2V4dGVybiBpbnQgY2FsbF9sdmRzX3NjcmlwdChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZGNiX2VudHJ5ICosIGludCBoZWFkLAorCQkJICAgIGVudW0gTFZEU19zY3JpcHQsIGludCBweGNsayk7CisKKy8qIG5vdXZlYXVfdHRtLmMgKi8KK2ludCBub3V2ZWF1X3R0bV9nbG9iYWxfaW5pdChzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqKTsKK3ZvaWQgbm91dmVhdV90dG1fZ2xvYmFsX3JlbGVhc2Uoc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKik7CitpbnQgbm91dmVhdV90dG1fbW1hcChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CisKKy8qIG5vdXZlYXVfZHAuYyAqLworaW50IG5vdXZlYXVfZHBfYXV4Y2goc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmF1eGNoLCBpbnQgY21kLCBpbnQgYWRkciwKKwkJICAgICB1aW50OF90ICpkYXRhLCBpbnQgZGF0YV9ucik7Citib29sIG5vdXZlYXVfZHBfZGV0ZWN0KHN0cnVjdCBkcm1fZW5jb2RlciAqKTsKK2Jvb2wgbm91dmVhdV9kcF9saW5rX3RyYWluKHN0cnVjdCBkcm1fZW5jb2RlciAqKTsKKworLyogbnYwNF9mYi5jICovCitleHRlcm4gaW50ICBudjA0X2ZiX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjA0X2ZiX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOworCisvKiBudjEwX2ZiLmMgKi8KK2V4dGVybiBpbnQgIG52MTBfZmJfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52MTBfZmJfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CisKKy8qIG52NDBfZmIuYyAqLworZXh0ZXJuIGludCAgbnY0MF9mYl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnY0MF9mYl90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKworLyogbnYwNF9maWZvLmMgKi8KK2V4dGVybiBpbnQgIG52MDRfZmlmb19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnYwNF9maWZvX2Rpc2FibGUoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjA0X2ZpZm9fZW5hYmxlKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIGJvb2wgbnYwNF9maWZvX3JlYXNzaWduKHN0cnVjdCBkcm1fZGV2aWNlICosIGJvb2wpOworZXh0ZXJuIGludCAgbnYwNF9maWZvX2NoYW5uZWxfaWQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBudjA0X2ZpZm9fY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiB2b2lkIG52MDRfZmlmb19kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgIG52MDRfZmlmb19sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgIG52MDRfZmlmb191bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKworLyogbnYxMF9maWZvLmMgKi8KK2V4dGVybiBpbnQgIG52MTBfZmlmb19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIGludCAgbnYxMF9maWZvX2NoYW5uZWxfaWQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBudjEwX2ZpZm9fY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiB2b2lkIG52MTBfZmlmb19kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgIG52MTBfZmlmb19sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgIG52MTBfZmlmb191bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKworLyogbnY0MF9maWZvLmMgKi8KK2V4dGVybiBpbnQgIG52NDBfZmlmb19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIGludCAgbnY0MF9maWZvX2NyZWF0ZV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gdm9pZCBudjQwX2ZpZm9fZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gaW50ICBudjQwX2ZpZm9fbG9hZF9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gaW50ICBudjQwX2ZpZm9fdW5sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKik7CisKKy8qIG52NTBfZmlmby5jICovCitleHRlcm4gaW50ICBudjUwX2ZpZm9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52NTBfZmlmb190YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIG52NTBfZmlmb19jaGFubmVsX2lkKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIGludCAgbnY1MF9maWZvX2NyZWF0ZV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gdm9pZCBudjUwX2ZpZm9fZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gaW50ICBudjUwX2ZpZm9fbG9hZF9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gaW50ICBudjUwX2ZpZm9fdW5sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKik7CisKKy8qIG52MDRfZ3JhcGguYyAqLworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgbnYwNF9ncmFwaF9ncmNsYXNzW107CitleHRlcm4gaW50ICBudjA0X2dyYXBoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjA0X2dyYXBoX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnYwNF9ncmFwaF9maWZvX2FjY2VzcyhzdHJ1Y3QgZHJtX2RldmljZSAqLCBib29sKTsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpudjA0X2dyYXBoX2NoYW5uZWwoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBudjA0X2dyYXBoX2NyZWF0ZV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gdm9pZCBudjA0X2dyYXBoX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIGludCAgbnYwNF9ncmFwaF9sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgIG52MDRfZ3JhcGhfdW5sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjA0X2dyYXBoX2NvbnRleHRfc3dpdGNoKHN0cnVjdCBkcm1fZGV2aWNlICopOworCisvKiBudjEwX2dyYXBoLmMgKi8KK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzIG52MTBfZ3JhcGhfZ3JjbGFzc1tdOworZXh0ZXJuIGludCAgbnYxMF9ncmFwaF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnYxMF9ncmFwaF90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpudjEwX2dyYXBoX2NoYW5uZWwoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBudjEwX2dyYXBoX2NyZWF0ZV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gdm9pZCBudjEwX2dyYXBoX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIGludCAgbnYxMF9ncmFwaF9sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgIG52MTBfZ3JhcGhfdW5sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjEwX2dyYXBoX2NvbnRleHRfc3dpdGNoKHN0cnVjdCBkcm1fZGV2aWNlICopOworCisvKiBudjIwX2dyYXBoLmMgKi8KK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzIG52MjBfZ3JhcGhfZ3JjbGFzc1tdOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgbnYzMF9ncmFwaF9ncmNsYXNzW107CitleHRlcm4gaW50ICBudjIwX2dyYXBoX2NyZWF0ZV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gdm9pZCBudjIwX2dyYXBoX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIGludCAgbnYyMF9ncmFwaF9sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgIG52MjBfZ3JhcGhfdW5sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBudjIwX2dyYXBoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjIwX2dyYXBoX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIGludCAgbnYzMF9ncmFwaF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworCisvKiBudjQwX2dyYXBoLmMgKi8KK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzIG52NDBfZ3JhcGhfZ3JjbGFzc1tdOworZXh0ZXJuIGludCAgbnY0MF9ncmFwaF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnY0MF9ncmFwaF90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpudjQwX2dyYXBoX2NoYW5uZWwoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBudjQwX2dyYXBoX2NyZWF0ZV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gdm9pZCBudjQwX2dyYXBoX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIGludCAgbnY0MF9ncmFwaF9sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgIG52NDBfZ3JhcGhfdW5sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBudjQwX2dyY3R4X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjQwX2dyY3R4X2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjQwX2dyY3R4X3ZhbHNfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CisKKy8qIG52NTBfZ3JhcGguYyAqLworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgbnY1MF9ncmFwaF9ncmNsYXNzW107CitleHRlcm4gaW50ICBudjUwX2dyYXBoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjUwX2dyYXBoX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnY1MF9ncmFwaF9maWZvX2FjY2VzcyhzdHJ1Y3QgZHJtX2RldmljZSAqLCBib29sKTsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpudjUwX2dyYXBoX2NoYW5uZWwoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBudjUwX2dyYXBoX2NyZWF0ZV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gdm9pZCBudjUwX2dyYXBoX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIGludCAgbnY1MF9ncmFwaF9sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgIG52NTBfZ3JhcGhfdW5sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjUwX2dyYXBoX2NvbnRleHRfc3dpdGNoKHN0cnVjdCBkcm1fZGV2aWNlICopOworCisvKiBudjA0X2luc3RtZW0uYyAqLworZXh0ZXJuIGludCAgbnYwNF9pbnN0bWVtX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjA0X2luc3RtZW1fdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBudjA0X2luc3RtZW1fc3VzcGVuZChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52MDRfaW5zdG1lbV9yZXN1bWUoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBudjA0X2luc3RtZW1fcG9wdWxhdGUoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICosCisJCQkJICB1aW50MzJfdCAqc2l6ZSk7CitleHRlcm4gdm9pZCBudjA0X2luc3RtZW1fY2xlYXIoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOworZXh0ZXJuIGludCAgbnYwNF9pbnN0bWVtX2JpbmQoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOworZXh0ZXJuIGludCAgbnYwNF9pbnN0bWVtX3VuYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CitleHRlcm4gdm9pZCBudjA0X2luc3RtZW1fcHJlcGFyZV9hY2Nlc3Moc3RydWN0IGRybV9kZXZpY2UgKiwgYm9vbCB3cml0ZSk7CitleHRlcm4gdm9pZCBudjA0X2luc3RtZW1fZmluaXNoX2FjY2VzcyhzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKworLyogbnY1MF9pbnN0bWVtLmMgKi8KK2V4dGVybiBpbnQgIG52NTBfaW5zdG1lbV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnY1MF9pbnN0bWVtX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIGludCAgbnY1MF9pbnN0bWVtX3N1c3BlbmQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjUwX2luc3RtZW1fcmVzdW1lKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIGludCAgbnY1MF9pbnN0bWVtX3BvcHVsYXRlKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqLAorCQkJCSAgdWludDMyX3QgKnNpemUpOworZXh0ZXJuIHZvaWQgbnY1MF9pbnN0bWVtX2NsZWFyKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKK2V4dGVybiBpbnQgIG52NTBfaW5zdG1lbV9iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKK2V4dGVybiBpbnQgIG52NTBfaW5zdG1lbV91bmJpbmQoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOworZXh0ZXJuIHZvaWQgbnY1MF9pbnN0bWVtX3ByZXBhcmVfYWNjZXNzKHN0cnVjdCBkcm1fZGV2aWNlICosIGJvb2wgd3JpdGUpOworZXh0ZXJuIHZvaWQgbnY1MF9pbnN0bWVtX2ZpbmlzaF9hY2Nlc3Moc3RydWN0IGRybV9kZXZpY2UgKik7CisKKy8qIG52MDRfbWMuYyAqLworZXh0ZXJuIGludCAgbnYwNF9tY19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnYwNF9tY190YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKworLyogbnY0MF9tYy5jICovCitleHRlcm4gaW50ICBudjQwX21jX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjQwX21jX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOworCisvKiBudjUwX21jLmMgKi8KK2V4dGVybiBpbnQgIG52NTBfbWNfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52NTBfbWNfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CisKKy8qIG52MDRfdGltZXIuYyAqLworZXh0ZXJuIGludCAgbnYwNF90aW1lcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHVpbnQ2NF90IG52MDRfdGltZXJfcmVhZChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52MDRfdGltZXJfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CisKK2V4dGVybiBsb25nIG5vdXZlYXVfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSB1bnNpZ25lZCBsb25nIGFyZyk7CisKKy8qIG52MDRfZGFjLmMgKi8KK2V4dGVybiBpbnQgbnYwNF9kYWNfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmVudHJ5KTsKK2V4dGVybiBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIG52MTdfZGFjX2RldGVjdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJCQkgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7CitleHRlcm4gaW50IG52MDRfZGFjX291dHB1dF9vZmZzZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKK2V4dGVybiB2b2lkIG52MDRfZGFjX3VwZGF0ZV9kYWNjbGsoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBib29sIGVuYWJsZSk7CisKKy8qIG52MDRfZGZwLmMgKi8KK2V4dGVybiBpbnQgbnYwNF9kZnBfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmVudHJ5KTsKK2V4dGVybiBpbnQgbnYwNF9kZnBfZ2V0X2JvdW5kX2hlYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50KTsKK2V4dGVybiB2b2lkIG52MDRfZGZwX2JpbmRfaGVhZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQsCisJCQkgICAgICAgaW50IGhlYWQsIGJvb2wgZGwpOworZXh0ZXJuIHZvaWQgbnYwNF9kZnBfZGlzYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCk7CitleHRlcm4gdm9pZCBudjA0X2RmcF91cGRhdGVfZnBfY29udHJvbChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKTsKKworLyogbnYwNF90di5jICovCitleHRlcm4gaW50IG52MDRfdHZfaWRlbnRpZnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGkyY19pbmRleCk7CitleHRlcm4gaW50IG52MDRfdHZfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmVudHJ5KTsKKworLyogbnYxN190di5jICovCitleHRlcm4gaW50IG52MTdfdHZfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmVudHJ5KTsKK2V4dGVybiBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIG52MTdfdHZfZGV0ZWN0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJCQl1aW50MzJfdCBwaW5fbWFzayk7CisKKy8qIG52MDRfZGlzcGxheS5jICovCitleHRlcm4gaW50IG52MDRfZGlzcGxheV9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjA0X2Rpc3BsYXlfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52MDRfZGlzcGxheV9yZXN0b3JlKHN0cnVjdCBkcm1fZGV2aWNlICopOworCisvKiBudjA0X2NydGMuYyAqLworZXh0ZXJuIGludCBudjA0X2NydGNfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCBpbmRleCk7CisKKy8qIG5vdXZlYXVfYm8uYyAqLworZXh0ZXJuIHN0cnVjdCB0dG1fYm9fZHJpdmVyIG5vdXZlYXVfYm9fZHJpdmVyOworZXh0ZXJuIGludCBub3V2ZWF1X2JvX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosCisJCQkgIGludCBzaXplLCBpbnQgYWxpZ24sIHVpbnQzMl90IGZsYWdzLAorCQkJICB1aW50MzJfdCB0aWxlX21vZGUsIHVpbnQzMl90IHRpbGVfZmxhZ3MsCisJCQkgIGJvb2wgbm9fdm0sIGJvb2wgbWFwcGFibGUsIHN0cnVjdCBub3V2ZWF1X2JvICoqKTsKK2V4dGVybiBpbnQgbm91dmVhdV9ib19waW4oc3RydWN0IG5vdXZlYXVfYm8gKiwgdWludDMyX3QgZmxhZ3MpOworZXh0ZXJuIGludCBub3V2ZWF1X2JvX3VucGluKHN0cnVjdCBub3V2ZWF1X2JvICopOworZXh0ZXJuIGludCBub3V2ZWF1X2JvX21hcChzdHJ1Y3Qgbm91dmVhdV9ibyAqKTsKK2V4dGVybiB2b2lkIG5vdXZlYXVfYm9fdW5tYXAoc3RydWN0IG5vdXZlYXVfYm8gKik7CitleHRlcm4gdm9pZCBub3V2ZWF1X2JvX3BsYWNlbWVudF9zZXQoc3RydWN0IG5vdXZlYXVfYm8gKiwgdWludDMyX3QgbWVtdHlwZSk7CitleHRlcm4gdTE2IG5vdXZlYXVfYm9fcmQxNihzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibywgdW5zaWduZWQgaW5kZXgpOworZXh0ZXJuIHZvaWQgbm91dmVhdV9ib193cjE2KHN0cnVjdCBub3V2ZWF1X2JvICpudmJvLCB1bnNpZ25lZCBpbmRleCwgdTE2IHZhbCk7CitleHRlcm4gdTMyIG5vdXZlYXVfYm9fcmQzMihzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibywgdW5zaWduZWQgaW5kZXgpOworZXh0ZXJuIHZvaWQgbm91dmVhdV9ib193cjMyKHN0cnVjdCBub3V2ZWF1X2JvICpudmJvLCB1bnNpZ25lZCBpbmRleCwgdTMyIHZhbCk7CisKKy8qIG5vdXZlYXVfZmVuY2UuYyAqLworc3RydWN0IG5vdXZlYXVfZmVuY2U7CitleHRlcm4gaW50IG5vdXZlYXVfZmVuY2VfaW5pdChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIHZvaWQgbm91dmVhdV9mZW5jZV9maW5pKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gdm9pZCBub3V2ZWF1X2ZlbmNlX3VwZGF0ZShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIGludCBub3V2ZWF1X2ZlbmNlX25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosIHN0cnVjdCBub3V2ZWF1X2ZlbmNlICoqLAorCQkJICAgICBib29sIGVtaXQpOworZXh0ZXJuIGludCBub3V2ZWF1X2ZlbmNlX2VtaXQoc3RydWN0IG5vdXZlYXVfZmVuY2UgKik7CitzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpub3V2ZWF1X2ZlbmNlX2NoYW5uZWwoc3RydWN0IG5vdXZlYXVfZmVuY2UgKik7CitleHRlcm4gYm9vbCBub3V2ZWF1X2ZlbmNlX3NpZ25hbGxlZCh2b2lkICpvYmosIHZvaWQgKmFyZyk7CitleHRlcm4gaW50IG5vdXZlYXVfZmVuY2Vfd2FpdCh2b2lkICpvYmosIHZvaWQgKmFyZywgYm9vbCBsYXp5LCBib29sIGludHIpOworZXh0ZXJuIGludCBub3V2ZWF1X2ZlbmNlX2ZsdXNoKHZvaWQgKm9iaiwgdm9pZCAqYXJnKTsKK2V4dGVybiB2b2lkIG5vdXZlYXVfZmVuY2VfdW5yZWYodm9pZCAqKm9iaik7CitleHRlcm4gdm9pZCAqbm91dmVhdV9mZW5jZV9yZWYodm9pZCAqb2JqKTsKK2V4dGVybiB2b2lkIG5vdXZlYXVfZmVuY2VfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2hhbm5lbCk7CisKKy8qIG5vdXZlYXVfZ2VtLmMgKi8KK2V4dGVybiBpbnQgbm91dmVhdV9nZW1fbmV3KHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKiwKKwkJCSAgIGludCBzaXplLCBpbnQgYWxpZ24sIHVpbnQzMl90IGZsYWdzLAorCQkJICAgdWludDMyX3QgdGlsZV9tb2RlLCB1aW50MzJfdCB0aWxlX2ZsYWdzLAorCQkJICAgYm9vbCBub192bSwgYm9vbCBtYXBwYWJsZSwgc3RydWN0IG5vdXZlYXVfYm8gKiopOworZXh0ZXJuIGludCBub3V2ZWF1X2dlbV9vYmplY3RfbmV3KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqKTsKK2V4dGVybiB2b2lkIG5vdXZlYXVfZ2VtX29iamVjdF9kZWwoc3RydWN0IGRybV9nZW1fb2JqZWN0ICopOworZXh0ZXJuIGludCBub3V2ZWF1X2dlbV9pb2N0bF9uZXcoc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqLAorCQkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKik7CitleHRlcm4gaW50IG5vdXZlYXVfZ2VtX2lvY3RsX3B1c2hidWYoc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqLAorCQkJCSAgICAgc3RydWN0IGRybV9maWxlICopOworZXh0ZXJuIGludCBub3V2ZWF1X2dlbV9pb2N0bF9wdXNoYnVmX2NhbGwoc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqLAorCQkJCQkgIHN0cnVjdCBkcm1fZmlsZSAqKTsKK2V4dGVybiBpbnQgbm91dmVhdV9nZW1faW9jdGxfcHVzaGJ1Zl9jYWxsMihzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICosCisJCQkJCSAgIHN0cnVjdCBkcm1fZmlsZSAqKTsKK2V4dGVybiBpbnQgbm91dmVhdV9nZW1faW9jdGxfcGluKHN0cnVjdCBkcm1fZGV2aWNlICosIHZvaWQgKiwKKwkJCQkgc3RydWN0IGRybV9maWxlICopOworZXh0ZXJuIGludCBub3V2ZWF1X2dlbV9pb2N0bF91bnBpbihzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICosCisJCQkJICAgc3RydWN0IGRybV9maWxlICopOworZXh0ZXJuIGludCBub3V2ZWF1X2dlbV9pb2N0bF90aWxlKHN0cnVjdCBkcm1fZGV2aWNlICosIHZvaWQgKiwKKwkJCQkgIHN0cnVjdCBkcm1fZmlsZSAqKTsKK2V4dGVybiBpbnQgbm91dmVhdV9nZW1faW9jdGxfY3B1X3ByZXAoc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqLAorCQkJCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqKTsKK2V4dGVybiBpbnQgbm91dmVhdV9nZW1faW9jdGxfY3B1X2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqLAorCQkJCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqKTsKK2V4dGVybiBpbnQgbm91dmVhdV9nZW1faW9jdGxfaW5mbyhzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICosCisJCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKik7CisKKy8qIG52MTdfZ3Bpby5jICovCitpbnQgbnYxN19ncGlvX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIGRjYl9ncGlvX3RhZyB0YWcpOworaW50IG52MTdfZ3Bpb19zZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBkY2JfZ3Bpb190YWcgdGFnLCBpbnQgc3RhdGUpOworCisjaWZuZGVmIGlvcmVhZDMyX25hdGl2ZQorI2lmZGVmIF9fQklHX0VORElBTgorI2RlZmluZSBpb3JlYWQxNl9uYXRpdmUgaW9yZWFkMTZiZQorI2RlZmluZSBpb3dyaXRlMTZfbmF0aXZlIGlvd3JpdGUxNmJlCisjZGVmaW5lIGlvcmVhZDMyX25hdGl2ZSAgaW9yZWFkMzJiZQorI2RlZmluZSBpb3dyaXRlMzJfbmF0aXZlIGlvd3JpdGUzMmJlCisjZWxzZSAvKiBkZWYgX19CSUdfRU5ESUFOICovCisjZGVmaW5lIGlvcmVhZDE2X25hdGl2ZSBpb3JlYWQxNgorI2RlZmluZSBpb3dyaXRlMTZfbmF0aXZlIGlvd3JpdGUxNgorI2RlZmluZSBpb3JlYWQzMl9uYXRpdmUgIGlvcmVhZDMyCisjZGVmaW5lIGlvd3JpdGUzMl9uYXRpdmUgaW93cml0ZTMyCisjZW5kaWYgLyogZGVmIF9fQklHX0VORElBTiBlbHNlICovCisjZW5kaWYgLyogIWlvcmVhZDMyX25hdGl2ZSAqLworCisvKiBjaGFubmVsIGNvbnRyb2wgcmVnIGFjY2VzcyAqLworc3RhdGljIGlubGluZSB1MzIgbnZjaGFuX3JkMzIoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgdW5zaWduZWQgcmVnKQoreworCXJldHVybiBpb3JlYWQzMl9uYXRpdmUoY2hhbi0+dXNlciArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBudmNoYW5fd3IzMihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJCQkJCXVuc2lnbmVkIHJlZywgdTMyIHZhbCkKK3sKKwlpb3dyaXRlMzJfbmF0aXZlKHZhbCwgY2hhbi0+dXNlciArIHJlZyk7Cit9CisKKy8qIHJlZ2lzdGVyIGFjY2VzcyAqLworc3RhdGljIGlubGluZSB1MzIgbnZfcmQzMihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCByZWcpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlyZXR1cm4gaW9yZWFkMzJfbmF0aXZlKGRldl9wcml2LT5tbWlvICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG52X3dyMzIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgcmVnLCB1MzIgdmFsKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW93cml0ZTMyX25hdGl2ZSh2YWwsIGRldl9wcml2LT5tbWlvICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB1OCBudl9yZDA4KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIHJlZykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXJldHVybiBpb3JlYWQ4KGRldl9wcml2LT5tbWlvICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG52X3dyMDgoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgcmVnLCB1OCB2YWwpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpb3dyaXRlOCh2YWwsIGRldl9wcml2LT5tbWlvICsgcmVnKTsKK30KKworI2RlZmluZSBudl93YWl0KHJlZywgbWFzaywgdmFsKSBcCisJbm91dmVhdV93YWl0X3VudGlsKGRldiwgMjAwMDAwMDAwMFVMTCwgKHJlZyksIChtYXNrKSwgKHZhbCkpCisKKy8qIFBSQU1JTiBhY2Nlc3MgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIG52X3JpMzIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJcmV0dXJuIGlvcmVhZDMyX25hdGl2ZShkZXZfcHJpdi0+cmFtaW4gKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnZfd2kzMihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBvZmZzZXQsIHUzMiB2YWwpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpb3dyaXRlMzJfbmF0aXZlKHZhbCwgZGV2X3ByaXYtPnJhbWluICsgb2Zmc2V0KTsKK30KKworLyogb2JqZWN0IGFjY2VzcyAqLworc3RhdGljIGlubGluZSB1MzIgbnZfcm8zMihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKm9iaiwKKwkJCQl1bnNpZ25lZCBpbmRleCkKK3sKKwlyZXR1cm4gbnZfcmkzMihkZXYsIG9iai0+aW1fcHJhbWluLT5zdGFydCArIGluZGV4ICogNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBudl93bzMyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqb2JqLAorCQkJCXVuc2lnbmVkIGluZGV4LCB1MzIgdmFsKQoreworCW52X3dpMzIoZGV2LCBvYmotPmltX3ByYW1pbi0+c3RhcnQgKyBpbmRleCAqIDQsIHZhbCk7Cit9CisKKy8qCisgKiBMb2dnaW5nCisgKiBBcmd1bWVudCBkIGlzIChzdHJ1Y3QgZHJtX2RldmljZSAqKS4KKyAqLworI2RlZmluZSBOVl9QUklOVEsobGV2ZWwsIGQsIGZtdCwgYXJnLi4uKSBcCisJcHJpbnRrKGxldmVsICJbIiBEUk1fTkFNRSAiXSAiIERSSVZFUl9OQU1FICIgJXM6ICIgZm10LCBcCisJCQkJCXBjaV9uYW1lKGQtPnBkZXYpLCAjI2FyZykKKyNpZm5kZWYgTlZfREVCVUdfTk9UUkFDRQorI2RlZmluZSBOVl9ERUJVRyhkLCBmbXQsIGFyZy4uLikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoZHJtX2RlYnVnKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJTlZfUFJJTlRLKEtFUk5fREVCVUcsIGQsICIlczolZCAtICIgZm10LCBfX2Z1bmNfXywgICAgICAgICAgICAgXAorCQkJICBfX0xJTkVfXywgIyNhcmcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBOVl9ERUJVRyhkLCBmbXQsIGFyZy4uLikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoZHJtX2RlYnVnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJTlZfUFJJTlRLKEtFUk5fREVCVUcsIGQsIGZtdCwgIyNhcmcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorI2RlZmluZSBOVl9FUlJPUihkLCBmbXQsIGFyZy4uLikgTlZfUFJJTlRLKEtFUk5fRVJSLCBkLCBmbXQsICMjYXJnKQorI2RlZmluZSBOVl9JTkZPKGQsIGZtdCwgYXJnLi4uKSBOVl9QUklOVEsoS0VSTl9JTkZPLCBkLCBmbXQsICMjYXJnKQorI2RlZmluZSBOVl9UUkFDRVdBUk4oZCwgZm10LCBhcmcuLi4pIE5WX1BSSU5USyhLRVJOX05PVElDRSwgZCwgZm10LCAjI2FyZykKKyNkZWZpbmUgTlZfVFJBQ0UoZCwgZm10LCBhcmcuLi4pIE5WX1BSSU5USyhLRVJOX0lORk8sIGQsIGZtdCwgIyNhcmcpCisjZGVmaW5lIE5WX1dBUk4oZCwgZm10LCBhcmcuLi4pIE5WX1BSSU5USyhLRVJOX1dBUk5JTkcsIGQsIGZtdCwgIyNhcmcpCisKKy8qIG5vdXZlYXVfcmVnX2RlYnVnIGJpdG1hc2sgKi8KK2VudW0geworCU5PVVZFQVVfUkVHX0RFQlVHX01DICAgICAgICAgICAgID0gMHgxLAorCU5PVVZFQVVfUkVHX0RFQlVHX1ZJREVPICAgICAgICAgID0gMHgyLAorCU5PVVZFQVVfUkVHX0RFQlVHX0ZCICAgICAgICAgICAgID0gMHg0LAorCU5PVVZFQVVfUkVHX0RFQlVHX0VYVERFViAgICAgICAgID0gMHg4LAorCU5PVVZFQVVfUkVHX0RFQlVHX0NSVEMgICAgICAgICAgID0gMHgxMCwKKwlOT1VWRUFVX1JFR19ERUJVR19SQU1EQUMgICAgICAgICA9IDB4MjAsCisJTk9VVkVBVV9SRUdfREVCVUdfVkdBQ1JUQyAgICAgICAgPSAweDQwLAorCU5PVVZFQVVfUkVHX0RFQlVHX1JNVklPICAgICAgICAgID0gMHg4MCwKKwlOT1VWRUFVX1JFR19ERUJVR19WR0FBVFRSICAgICAgICA9IDB4MTAwLAorCU5PVVZFQVVfUkVHX0RFQlVHX0VWTyAgICAgICAgICAgID0gMHgyMDAsCit9OworCisjZGVmaW5lIE5WX1JFR19ERUJVRyh0eXBlLCBkZXYsIGZtdCwgYXJnLi4uKSBkbyB7IFwKKwlpZiAobm91dmVhdV9yZWdfZGVidWcgJiBOT1VWRUFVX1JFR19ERUJVR18jI3R5cGUpIFwKKwkJTlZfUFJJTlRLKEtFUk5fREVCVUcsIGRldiwgIiVzOiAiIGZtdCwgX19mdW5jX18sICMjYXJnKTsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBib29sCitudl90d29faGVhZHMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWNvbnN0IGludCBpbXBsID0gZGV2LT5wY2lfZGV2aWNlICYgMHgwZmYwOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfMTAgJiYgaW1wbCAhPSAweDAxMDAgJiYKKwkgICAgaW1wbCAhPSAweDAxNTAgJiYgaW1wbCAhPSAweDAxYTAgJiYgaW1wbCAhPSAweDAyMDApCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK252X2dmNF9kaXNwX2FyY2goc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gbnZfdHdvX2hlYWRzKGRldikgJiYgKGRldi0+cGNpX2RldmljZSAmIDB4MGZmMCkgIT0gMHgwMTEwOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK252X3R3b19yZWdfcGxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwljb25zdCBpbnQgaW1wbCA9IGRldi0+cGNpX2RldmljZSAmIDB4MGZmMDsKKworCWlmIChpbXBsID09IDB4MDMxMCB8fCBpbXBsID09IDB4MDM0MCB8fCBkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzQwKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKyNkZWZpbmUgTlY1MF9OVlNXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDUwNmUKKyNkZWZpbmUgTlY1MF9OVlNXX0RNQV9TRU1BUEhPUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNjAKKyNkZWZpbmUgTlY1MF9OVlNXX1NFTUFQSE9SRV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNjQKKyNkZWZpbmUgTlY1MF9OVlNXX1NFTUFQSE9SRV9BQ1FVSVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNjgKKyNkZWZpbmUgTlY1MF9OVlNXX1NFTUFQSE9SRV9SRUxFQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNmMKKyNkZWZpbmUgTlY1MF9OVlNXX0RNQV9WQkxTRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxOGMKKyNkZWZpbmUgTlY1MF9OVlNXX1ZCTFNFTV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgTlY1MF9OVlNXX1ZCTFNFTV9SRUxFQVNFX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDQKKyNkZWZpbmUgTlY1MF9OVlNXX1ZCTFNFTV9SRUxFQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDgKKworI2VuZGlmIC8qIF9fTk9VVkVBVV9EUlZfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2VuY29kZXIuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNGEyNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2VuY29kZXIuaApAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1hYXJ0ZW4gTWFhdGh1aXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9fTk9VVkVBVV9FTkNPREVSX0hfXworI2RlZmluZSBfX05PVVZFQVVfRU5DT0RFUl9IX18KKworI2luY2x1ZGUgImRybV9lbmNvZGVyX3NsYXZlLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKworI2RlZmluZSBOVl9EUE1TX0NMRUFSRUQgMHg4MAorCitzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyIHsKKwlzdHJ1Y3QgZHJtX2VuY29kZXJfc2xhdmUgYmFzZTsKKworCXN0cnVjdCBkY2JfZW50cnkgKmRjYjsKKwlpbnQgb3I7CisKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBtb2RlOworCWludCBsYXN0X2RwbXM7CisKKwlzdHJ1Y3QgbnYwNF9vdXRwdXRfcmVnIHJlc3RvcmU7CisKKwl2b2lkICgqZGlzY29ubmVjdCkoc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqZW5jb2Rlcik7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlpbnQgZHBjZF92ZXJzaW9uOworCQkJaW50IGxpbmtfbnI7CisJCQlpbnQgbGlua19idzsKKwkJfSBkcDsKKwl9OworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpub3V2ZWF1X2VuY29kZXIoc3RydWN0IGRybV9lbmNvZGVyICplbmMpCit7CisJc3RydWN0IGRybV9lbmNvZGVyX3NsYXZlICpzbGF2ZSA9IHRvX2VuY29kZXJfc2xhdmUoZW5jKTsKKworCXJldHVybiBjb250YWluZXJfb2Yoc2xhdmUsIHN0cnVjdCBub3V2ZWF1X2VuY29kZXIsIGJhc2UpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkcm1fZW5jb2RlciAqdG9fZHJtX2VuY29kZXIoc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqZW5jKQoreworCXJldHVybiAmZW5jLT5iYXNlLmJhc2U7Cit9CisKK3N0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqCitub3V2ZWF1X2VuY29kZXJfY29ubmVjdG9yX2dldChzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICplbmNvZGVyKTsKK2ludCBudjUwX3Nvcl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZW50cnkpOworaW50IG52NTBfZGFjX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSk7CisKK3N0cnVjdCBiaXRfZGlzcGxheXBvcnRfZW5jb2Rlcl90YWJsZSB7CisJdWludDMyX3QgbWF0Y2g7CisJdWludDhfdCAgcmVjb3JkX25yOworCXVpbnQ4X3QgIHVua25vd247CisJdWludDE2X3Qgc2NyaXB0MDsKKwl1aW50MTZfdCBzY3JpcHQxOworCXVpbnQxNl90IHVua25vd25fdGFibGU7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGJpdF9kaXNwbGF5cG9ydF9lbmNvZGVyX3RhYmxlX2VudHJ5IHsKKwl1aW50OF90IHZzX2xldmVsOworCXVpbnQ4X3QgcHJlX2xldmVsOworCXVpbnQ4X3QgcmVnMDsKKwl1aW50OF90IHJlZzE7CisJdWludDhfdCByZWcyOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNlbmRpZiAvKiBfX05PVVZFQVVfRU5DT0RFUl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmIuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTNmMzFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mYi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFhcnRlbiBNYWF0aHVpcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX19OT1VWRUFVX0ZCX0hfXworI2RlZmluZSBfX05PVVZFQVVfRkJfSF9fCisKK3N0cnVjdCBub3V2ZWF1X2ZyYW1lYnVmZmVyIHsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyIGJhc2U7CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym87Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBub3V2ZWF1X2ZyYW1lYnVmZmVyICoKK25vdXZlYXVfZnJhbWVidWZmZXIoc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihmYiwgc3RydWN0IG5vdXZlYXVfZnJhbWVidWZmZXIsIGJhc2UpOworfQorCitleHRlcm4gY29uc3Qgc3RydWN0IGRybV9tb2RlX2NvbmZpZ19mdW5jcyBub3V2ZWF1X21vZGVfY29uZmlnX2Z1bmNzOworCitzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICoKK25vdXZlYXVfZnJhbWVidWZmZXJfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2JvICosCisJCQkgICBzdHJ1Y3QgZHJtX21vZGVfZmJfY21kICopOworCisjZW5kaWYgLyogX19OT1VWRUFVX0ZCX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mYmNvbi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mYmNvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZThjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZiY29uLmMKQEAgLTAsMCArMSwzODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwNyBEYXZpZCBBaXJsaWUKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgICBEYXZpZCBBaXJsaWUKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NyZWVuX2luZm8uaD4KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJkcm1fY3J0Yy5oIgorI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgorI2luY2x1ZGUgImRybV9mYl9oZWxwZXIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9jcnRjLmgiCisjaW5jbHVkZSAibm91dmVhdV9mYi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZmJjb24uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2RtYS5oIgorCitzdGF0aWMgaW50Citub3V2ZWF1X2ZiY29uX3N5bmMoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IG5vdXZlYXVfZmJjb25fcGFyICpwYXIgPSBpbmZvLT5wYXI7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBhci0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5jaGFubmVsOworCWludCByZXQsIGk7CisKKwlpZiAoIWNoYW4tPmFjY2VsX2RvbmUgfHwKKwkgICAgaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcgfHwKKwkgICAgaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoUklOR19TUEFDRShjaGFuLCA0KSkgeworCQlOVl9FUlJPUihkZXYsICJHUFUgbG9ja3VwIC0gc3dpdGNoaW5nIHRvIHNvZnR3YXJlIGZiY29uXG4iKTsKKwkJaW5mby0+ZmxhZ3MgfD0gRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQ7CisJCXJldHVybiAwOworCX0KKworCUJFR0lOX1JJTkcoY2hhbiwgMCwgMHgwMTA0LCAxKTsKKwlPVVRfUklORyhjaGFuLCAwKTsKKwlCRUdJTl9SSU5HKGNoYW4sIDAsIDB4MDEwMCwgMSk7CisJT1VUX1JJTkcoY2hhbiwgMCk7CisJbm91dmVhdV9ib193cjMyKGNoYW4tPm5vdGlmaWVyX2JvLCBjaGFuLT5tMm1mX250ZnkgKyAzLCAweGZmZmZmZmZmKTsKKwlGSVJFX1JJTkcoY2hhbik7CisKKwlyZXQgPSAtRUJVU1k7CisJZm9yIChpID0gMDsgaSA8IDEwMDAwMDsgaSsrKSB7CisJCWlmICghbm91dmVhdV9ib19yZDMyKGNoYW4tPm5vdGlmaWVyX2JvLCBjaGFuLT5tMm1mX250ZnkgKyAzKSkgeworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJCURSTV9VREVMQVkoMSk7CisJfQorCisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJHUFUgbG9ja3VwIC0gc3dpdGNoaW5nIHRvIHNvZnR3YXJlIGZiY29uXG4iKTsKKwkJaW5mby0+ZmxhZ3MgfD0gRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQ7CisJCXJldHVybiAwOworCX0KKworCWNoYW4tPmFjY2VsX2RvbmUgPSBmYWxzZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmYl9vcHMgbm91dmVhdV9mYmNvbl9vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmZiX2NoZWNrX3ZhciA9IGRybV9mYl9oZWxwZXJfY2hlY2tfdmFyLAorCS5mYl9zZXRfcGFyID0gZHJtX2ZiX2hlbHBlcl9zZXRfcGFyLAorCS5mYl9zZXRjb2xyZWcgPSBkcm1fZmJfaGVscGVyX3NldGNvbHJlZywKKwkuZmJfZmlsbHJlY3QgPSBjZmJfZmlsbHJlY3QsCisJLmZiX2NvcHlhcmVhID0gY2ZiX2NvcHlhcmVhLAorCS5mYl9pbWFnZWJsaXQgPSBjZmJfaW1hZ2VibGl0LAorCS5mYl9zeW5jID0gbm91dmVhdV9mYmNvbl9zeW5jLAorCS5mYl9wYW5fZGlzcGxheSA9IGRybV9mYl9oZWxwZXJfcGFuX2Rpc3BsYXksCisJLmZiX2JsYW5rID0gZHJtX2ZiX2hlbHBlcl9ibGFuaywKKwkuZmJfc2V0Y21hcCA9IGRybV9mYl9oZWxwZXJfc2V0Y21hcCwKK307CisKK3N0YXRpYyB2b2lkIG5vdXZlYXVfZmJjb25fZ2FtbWFfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdTE2IHJlZCwgdTE2IGdyZWVuLAorCQkJCSAgICB1MTYgYmx1ZSwgaW50IHJlZ25vKQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisKKwludl9jcnRjLT5sdXQucltyZWdub10gPSByZWQ7CisJbnZfY3J0Yy0+bHV0LmdbcmVnbm9dID0gZ3JlZW47CisJbnZfY3J0Yy0+bHV0LmJbcmVnbm9dID0gYmx1ZTsKK30KKworc3RhdGljIHZvaWQgbm91dmVhdV9mYmNvbl9nYW1tYV9nZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MTYgKnJlZCwgdTE2ICpncmVlbiwKKwkJCQkgICAgdTE2ICpibHVlLCBpbnQgcmVnbm8pCit7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKworCSpyZWQgPSBudl9jcnRjLT5sdXQucltyZWdub107CisJKmdyZWVuID0gbnZfY3J0Yy0+bHV0LmdbcmVnbm9dOworCSpibHVlID0gbnZfY3J0Yy0+bHV0LmJbcmVnbm9dOworfQorCitzdGF0aWMgc3RydWN0IGRybV9mYl9oZWxwZXJfZnVuY3Mgbm91dmVhdV9mYmNvbl9oZWxwZXJfZnVuY3MgPSB7CisJLmdhbW1hX3NldCA9IG5vdXZlYXVfZmJjb25fZ2FtbWFfc2V0LAorCS5nYW1tYV9nZXQgPSBub3V2ZWF1X2ZiY29uX2dhbW1hX2dldAorfTsKKworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKK3N0YXRpYyBib29sCitub3V2ZWF1X2ZiY29uX2hhc192ZXNhZmJfb3JfZWZpZmIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cGRldjsKKwlpbnQgcmFtaW47CisKKwlpZiAoc2NyZWVuX2luZm8ub3JpZ192aWRlb19pc1ZHQSAhPSBWSURFT19UWVBFX1ZMRkIgJiYKKwkgICAgc2NyZWVuX2luZm8ub3JpZ192aWRlb19pc1ZHQSAhPSBWSURFT19UWVBFX0VGSSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKHNjcmVlbl9pbmZvLmxmYl9iYXNlIDwgcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpKQorCQlnb3RvIG5vdF9mYjsKKworCWlmIChzY3JlZW5faW5mby5sZmJfYmFzZSArIHNjcmVlbl9pbmZvLmxmYl9zaXplID49CisJICAgIHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKSArIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkpCisJCWdvdG8gbm90X2ZiOworCisJcmV0dXJuIHRydWU7Citub3RfZmI6CisJcmFtaW4gPSAyOworCWlmIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIHJhbWluKSA9PSAwKSB7CisJCXJhbWluID0gMzsKKwkJaWYgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgcmFtaW4pID09IDApCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKHNjcmVlbl9pbmZvLmxmYl9iYXNlIDwgcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIHJhbWluKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKHNjcmVlbl9pbmZvLmxmYl9iYXNlICsgc2NyZWVuX2luZm8ubGZiX3NpemUgPj0KKwkgICAgcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIHJhbWluKSArIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgcmFtaW4pKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCit2b2lkCitub3V2ZWF1X2ZiY29uX3pmaWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGRldl9wcml2LT5mYmRldl9pbmZvOworCXN0cnVjdCBmYl9maWxscmVjdCByZWN0OworCisJLyogQ2xlYXIgdGhlIGVudGlyZSBmYmNvbi4gIFRoZSBkcm0gd2lsbCBwcm9ncmFtIGV2ZXJ5IGNvbm5lY3RvcgorCSAqIHdpdGggaXQncyBwcmVmZXJyZWQgbW9kZS4gIElmIHRoZSBzaXplcyBkaWZmZXIsIG9uZSBkaXNwbGF5IHdpbGwKKwkgKiBxdWl0ZSBsaWtlbHkgaGF2ZSBnYXJiYWdlIGFyb3VuZCB0aGUgY29uc29sZS4KKwkgKi8KKwlyZWN0LmR4ID0gcmVjdC5keSA9IDA7CisJcmVjdC53aWR0aCA9IGluZm8tPnZhci54cmVzX3ZpcnR1YWw7CisJcmVjdC5oZWlnaHQgPSBpbmZvLT52YXIueXJlc192aXJ0dWFsOworCXJlY3QuY29sb3IgPSAwOworCXJlY3Qucm9wID0gUk9QX0NPUFk7CisJaW5mby0+ZmJvcHMtPmZiX2ZpbGxyZWN0KGluZm8sICZyZWN0KTsKK30KKworc3RhdGljIGludAorbm91dmVhdV9mYmNvbl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgZmJfd2lkdGgsCisJCSAgICAgdWludDMyX3QgZmJfaGVpZ2h0LCB1aW50MzJfdCBzdXJmYWNlX3dpZHRoLAorCQkgICAgIHVpbnQzMl90IHN1cmZhY2VfaGVpZ2h0LCB1aW50MzJfdCBzdXJmYWNlX2RlcHRoLAorCQkgICAgIHVpbnQzMl90IHN1cmZhY2VfYnBwLCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICoqcGZiKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJc3RydWN0IG5vdXZlYXVfZmJjb25fcGFyICpwYXI7CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmI7CisJc3RydWN0IG5vdXZlYXVfZnJhbWVidWZmZXIgKm5vdXZlYXVfZmI7CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym87CisJc3RydWN0IGRybV9tb2RlX2ZiX2NtZCBtb2RlX2NtZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXZpY2UgPSAmZGV2LT5wZGV2LT5kZXY7CisJaW50IHNpemUsIHJldDsKKworCW1vZGVfY21kLndpZHRoID0gc3VyZmFjZV93aWR0aDsKKwltb2RlX2NtZC5oZWlnaHQgPSBzdXJmYWNlX2hlaWdodDsKKworCW1vZGVfY21kLmJwcCA9IHN1cmZhY2VfYnBwOworCW1vZGVfY21kLnBpdGNoID0gbW9kZV9jbWQud2lkdGggKiAobW9kZV9jbWQuYnBwID4+IDMpOworCW1vZGVfY21kLnBpdGNoID0gQUxJR04obW9kZV9jbWQucGl0Y2gsIDI1Nik7CisJbW9kZV9jbWQuZGVwdGggPSBzdXJmYWNlX2RlcHRoOworCisJc2l6ZSA9IG1vZGVfY21kLnBpdGNoICogbW9kZV9jbWQuaGVpZ2h0OworCXNpemUgPSBBTElHTihzaXplLCBQQUdFX1NJWkUpOworCisJcmV0ID0gbm91dmVhdV9nZW1fbmV3KGRldiwgZGV2X3ByaXYtPmNoYW5uZWwsIHNpemUsIDAsIFRUTV9QTF9GTEFHX1ZSQU0sCisJCQkgICAgICAwLCAweDAwMDAsIGZhbHNlLCB0cnVlLCAmbnZibyk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgZnJhbWVidWZmZXJcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBub3V2ZWF1X2JvX3BpbihudmJvLCBUVE1fUExfRkxBR19WUkFNKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgImZhaWxlZCB0byBwaW4gZmI6ICVkXG4iLCByZXQpOworCQlub3V2ZWF1X2JvX3JlZihOVUxMLCAmbnZibyk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG5vdXZlYXVfYm9fbWFwKG52Ym8pOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiZmFpbGVkIHRvIG1hcCBmYjogJWRcbiIsIHJldCk7CisJCW5vdXZlYXVfYm9fdW5waW4obnZibyk7CisJCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZudmJvKTsKKwkJZ290byBvdXQ7CisJfQorCisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJZmIgPSBub3V2ZWF1X2ZyYW1lYnVmZmVyX2NyZWF0ZShkZXYsIG52Ym8sICZtb2RlX2NtZCk7CisJaWYgKCFmYikgeworCQlyZXQgPSAtRU5PTUVNOworCQlOVl9FUlJPUihkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgZmIuXG4iKTsKKwkJZ290byBvdXRfdW5yZWY7CisJfQorCisJbGlzdF9hZGQoJmZiLT5maWxwX2hlYWQsICZkZXYtPm1vZGVfY29uZmlnLmZiX2tlcm5lbF9saXN0KTsKKworCW5vdXZlYXVfZmIgPSBub3V2ZWF1X2ZyYW1lYnVmZmVyKGZiKTsKKwkqcGZiID0gZmI7CisKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBub3V2ZWF1X2ZiY29uX3BhciksIGRldmljZSk7CisJaWYgKCFpbmZvKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3VucmVmOworCX0KKworCXBhciA9IGluZm8tPnBhcjsKKwlwYXItPmhlbHBlci5mdW5jcyA9ICZub3V2ZWF1X2ZiY29uX2hlbHBlcl9mdW5jczsKKwlwYXItPmhlbHBlci5kZXYgPSBkZXY7CisJcmV0ID0gZHJtX2ZiX2hlbHBlcl9pbml0X2NydGNfY291bnQoJnBhci0+aGVscGVyLCAyLCA0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF91bnJlZjsKKwlkZXZfcHJpdi0+ZmJkZXZfaW5mbyA9IGluZm87CisKKwlzdHJjcHkoaW5mby0+Zml4LmlkLCAibm91dmVhdWZiIik7CisJaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVCB8IEZCSU5GT19IV0FDQ0VMX0NPUFlBUkVBIHwKKwkJICAgICAgRkJJTkZPX0hXQUNDRUxfRklMTFJFQ1QgfCBGQklORk9fSFdBQ0NFTF9JTUFHRUJMSVQ7CisJaW5mby0+ZmJvcHMgPSAmbm91dmVhdV9mYmNvbl9vcHM7CisJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBkZXYtPm1vZGVfY29uZmlnLmZiX2Jhc2UgKyBudmJvLT5iby5vZmZzZXQgLQorCQkJICAgICAgIGRldl9wcml2LT52bV92cmFtX2Jhc2U7CisJaW5mby0+Zml4LnNtZW1fbGVuID0gc2l6ZTsKKworCWluZm8tPnNjcmVlbl9iYXNlID0gbnZib19rbWFwX29ial9pb3ZpcnR1YWwobm91dmVhdV9mYi0+bnZibyk7CisJaW5mby0+c2NyZWVuX3NpemUgPSBzaXplOworCisJZHJtX2ZiX2hlbHBlcl9maWxsX2ZpeChpbmZvLCBmYi0+cGl0Y2gsIGZiLT5kZXB0aCk7CisJZHJtX2ZiX2hlbHBlcl9maWxsX3ZhcihpbmZvLCBmYiwgZmJfd2lkdGgsIGZiX2hlaWdodCk7CisKKwkvKiBGSVhNRTogd2UgcmVhbGx5IHNob3VsZG4ndCBleHBvc2UgbW1pbyBzcGFjZSBhdCBhbGwgKi8KKwlpbmZvLT5maXgubW1pb19zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDEpOworCWluZm8tPmZpeC5tbWlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAxKTsKKworCS8qIFNldCBhcGVydHVyZSBiYXNlL3NpemUgZm9yIHZlc2FmYiB0YWtlb3ZlciAqLworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKwlpZiAobm91dmVhdV9mYmNvbl9oYXNfdmVzYWZiX29yX2VmaWZiKGRldikpIHsKKwkJLyogU29tZSBOVklESUEgVkJJT1MnIGFyZSBzdHVwaWQgYW5kIGRlY2lkZSB0byBwdXQgdGhlCisJCSAqIGZyYW1lYnVmZmVyIGluIHRoZSBtaWRkbGUgb2YgdGhlIFBSQU1JTiBCQVIgZm9yCisJCSAqIHdoYXRldmVyIHJlYXNvbi4gIFdlIG5lZWQgdG8ga25vdyB0aGUgZXhhY3QgbGZiX2Jhc2UKKwkJICogdG8gZ2V0IHZlc2FmYiBraWNrZWQgb2ZmLCBhbmQgdGhlIG9ubHkgcmVsaWFibGUgd2F5CisJCSAqIHdlIGhhdmUgbGVmdCBpcyB0byBmaW5kIG91dCBsZmJfYmFzZSB0aGUgc2FtZSB3YXkKKwkJICogdmVzYWZiIGRpZC4KKwkJICovCisJCWluZm8tPmFwZXJ0dXJlX2Jhc2UgPSBzY3JlZW5faW5mby5sZmJfYmFzZTsKKwkJaW5mby0+YXBlcnR1cmVfc2l6ZSA9IHNjcmVlbl9pbmZvLmxmYl9zaXplOworCQlpZiAoc2NyZWVuX2luZm8ub3JpZ192aWRlb19pc1ZHQSA9PSBWSURFT19UWVBFX1ZMRkIpCisJCQlpbmZvLT5hcGVydHVyZV9zaXplICo9IDY1NTM2OworCX0gZWxzZQorI2VuZGlmCisJeworCQlpbmZvLT5hcGVydHVyZV9iYXNlID0gaW5mby0+Zml4Lm1taW9fc3RhcnQ7CisJCWluZm8tPmFwZXJ0dXJlX3NpemUgPSBpbmZvLT5maXgubW1pb19sZW47CisJfQorCisJaW5mby0+cGl4bWFwLnNpemUgPSA2NCoxMDI0OworCWluZm8tPnBpeG1hcC5idWZfYWxpZ24gPSA4OworCWluZm8tPnBpeG1hcC5hY2Nlc3NfYWxpZ24gPSAzMjsKKwlpbmZvLT5waXhtYXAuZmxhZ3MgPSBGQl9QSVhNQVBfU1lTVEVNOworCWluZm8tPnBpeG1hcC5zY2FuX2FsaWduID0gMTsKKworCWZiLT5mYmRldiA9IGluZm87CisKKwlwYXItPm5vdXZlYXVfZmIgPSBub3V2ZWF1X2ZiOworCXBhci0+ZGV2ID0gZGV2OworCisJc3dpdGNoIChkZXZfcHJpdi0+Y2FyZF90eXBlKSB7CisJY2FzZSBOVl81MDoKKwkJbnY1MF9mYmNvbl9hY2NlbF9pbml0KGluZm8pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQludjA0X2ZiY29uX2FjY2VsX2luaXQoaW5mbyk7CisJCWJyZWFrOworCX07CisKKwlub3V2ZWF1X2ZiY29uX3pmaWxsKGRldik7CisKKwkvKiBUbyBhbGxvdyByZXNpemVpbmcgd2l0aG91dCBzd2FwcGluZyBidWZmZXJzICovCisJTlZfSU5GTyhkZXYsICJhbGxvY2F0ZWQgJWR4JWQgZmI6IDB4JWx4LCBibyAlcFxuIiwKKwkJCQkJCW5vdXZlYXVfZmItPmJhc2Uud2lkdGgsCisJCQkJCQlub3V2ZWF1X2ZiLT5iYXNlLmhlaWdodCwKKwkJCQkJCW52Ym8tPmJvLm9mZnNldCwgbnZibyk7CisKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlyZXR1cm4gMDsKKworb3V0X3VucmVmOgorCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK2ludAorbm91dmVhdV9mYmNvbl9wcm9iZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwlyZXR1cm4gZHJtX2ZiX2hlbHBlcl9zaW5nbGVfZmJfcHJvYmUoZGV2LCAzMiwgbm91dmVhdV9mYmNvbl9jcmVhdGUpOworfQorCitpbnQKK25vdXZlYXVfZmJjb25fcmVtb3ZlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiKQoreworCXN0cnVjdCBub3V2ZWF1X2ZyYW1lYnVmZmVyICpub3V2ZWF1X2ZiID0gbm91dmVhdV9mcmFtZWJ1ZmZlcihmYik7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisKKwlpZiAoIWZiKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWluZm8gPSBmYi0+ZmJkZXY7CisJaWYgKGluZm8pIHsKKwkJc3RydWN0IG5vdXZlYXVfZmJjb25fcGFyICpwYXIgPSBpbmZvLT5wYXI7CisKKwkJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKKwkJbm91dmVhdV9ib191bm1hcChub3V2ZWF1X2ZiLT5udmJvKTsKKwkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShub3V2ZWF1X2ZiLT5udmJvLT5nZW0pOworCQlub3V2ZWF1X2ZiLT5udmJvID0gTlVMTDsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCWlmIChwYXIpCisJCQlkcm1fZmJfaGVscGVyX2ZyZWUoJnBhci0+aGVscGVyKTsKKwkJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmJjb24uaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmJjb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTMxMTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mYmNvbi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFhcnRlbiBNYWF0aHVpcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX19OT1VWRUFVX0ZCQ09OX0hfXworI2RlZmluZSBfX05PVVZFQVVfRkJDT05fSF9fCisKKyNpbmNsdWRlICJkcm1fZmJfaGVscGVyLmgiCisKK3N0cnVjdCBub3V2ZWF1X2ZiY29uX3BhciB7CisJc3RydWN0IGRybV9mYl9oZWxwZXIgaGVscGVyOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CisJc3RydWN0IG5vdXZlYXVfZnJhbWVidWZmZXIgKm5vdXZlYXVfZmI7Cit9OworCitpbnQgbm91dmVhdV9mYmNvbl9wcm9iZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2ludCBub3V2ZWF1X2ZiY29uX3JlbW92ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYik7Cit2b2lkIG5vdXZlYXVfZmJjb25fcmVzdG9yZSh2b2lkKTsKK3ZvaWQgbm91dmVhdV9mYmNvbl96ZmlsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKworaW50IG52MDRfZmJjb25fYWNjZWxfaW5pdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CitpbnQgbnY1MF9mYmNvbl9hY2NlbF9pbml0KHN0cnVjdCBmYl9pbmZvICppbmZvKTsKKworI2VuZGlmIC8qIF9fTlY1MF9GQkNPTl9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mZW5jZS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mZW5jZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZmY3ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZlbmNlLmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQmVuIFNrZWdncy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZG1hLmgiCisKKyNkZWZpbmUgVVNFX1JFRkNOVCAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8xMCkKKworc3RydWN0IG5vdXZlYXVfZmVuY2UgeworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW5uZWw7CisJc3RydWN0IGtyZWYgcmVmY291bnQ7CisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKKworCXVpbnQzMl90IHNlcXVlbmNlOworCWJvb2wgc2lnbmFsbGVkOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqCitub3V2ZWF1X2ZlbmNlKHZvaWQgKnN5bmNfb2JqKQoreworCXJldHVybiAoc3RydWN0IG5vdXZlYXVfZmVuY2UgKilzeW5jX29iajsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfZmVuY2VfZGVsKHN0cnVjdCBrcmVmICpyZWYpCit7CisJc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlID0KKwkJY29udGFpbmVyX29mKHJlZiwgc3RydWN0IG5vdXZlYXVfZmVuY2UsIHJlZmNvdW50KTsKKworCWtmcmVlKGZlbmNlKTsKK30KKwordm9pZAorbm91dmVhdV9mZW5jZV91cGRhdGUoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjaGFuLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqdG1wOworCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZTsKKwl1aW50MzJfdCBzZXF1ZW5jZTsKKworCWlmIChVU0VfUkVGQ05UKQorCQlzZXF1ZW5jZSA9IG52Y2hhbl9yZDMyKGNoYW4sIDB4NDgpOworCWVsc2UKKwkJc2VxdWVuY2UgPSBjaGFuLT5mZW5jZS5sYXN0X3NlcXVlbmNlX2lycTsKKworCWlmIChjaGFuLT5mZW5jZS5zZXF1ZW5jZV9hY2sgPT0gc2VxdWVuY2UpCisJCXJldHVybjsKKwljaGFuLT5mZW5jZS5zZXF1ZW5jZV9hY2sgPSBzZXF1ZW5jZTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdG1wLCAmY2hhbi0+ZmVuY2UucGVuZGluZykgeworCQlmZW5jZSA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBub3V2ZWF1X2ZlbmNlLCBlbnRyeSk7CisKKwkJc2VxdWVuY2UgPSBmZW5jZS0+c2VxdWVuY2U7CisJCWZlbmNlLT5zaWduYWxsZWQgPSB0cnVlOworCQlsaXN0X2RlbCgmZmVuY2UtPmVudHJ5KTsKKwkJa3JlZl9wdXQoJmZlbmNlLT5yZWZjb3VudCwgbm91dmVhdV9mZW5jZV9kZWwpOworCisJCWlmIChzZXF1ZW5jZSA9PSBjaGFuLT5mZW5jZS5zZXF1ZW5jZV9hY2spCisJCQlicmVhazsKKwl9Cit9CisKK2ludAorbm91dmVhdV9mZW5jZV9uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgc3RydWN0IG5vdXZlYXVfZmVuY2UgKipwZmVuY2UsCisJCSAgYm9vbCBlbWl0KQoreworCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZTsKKwlpbnQgcmV0ID0gMDsKKworCWZlbmNlID0ga3phbGxvYyhzaXplb2YoKmZlbmNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmZW5jZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJa3JlZl9pbml0KCZmZW5jZS0+cmVmY291bnQpOworCWZlbmNlLT5jaGFubmVsID0gY2hhbjsKKworCWlmIChlbWl0KQorCQlyZXQgPSBub3V2ZWF1X2ZlbmNlX2VtaXQoZmVuY2UpOworCisJaWYgKHJldCkKKwkJbm91dmVhdV9mZW5jZV91bnJlZigodm9pZCAqKSZmZW5jZSk7CisJKnBmZW5jZSA9IGZlbmNlOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKgorbm91dmVhdV9mZW5jZV9jaGFubmVsKHN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZSkKK3sKKwlyZXR1cm4gZmVuY2UgPyBmZW5jZS0+Y2hhbm5lbCA6IE5VTEw7Cit9CisKK2ludAorbm91dmVhdV9mZW5jZV9lbWl0KHN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBmZW5jZS0+Y2hhbm5lbC0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZmVuY2UtPmNoYW5uZWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJcmV0ID0gUklOR19TUEFDRShjaGFuLCAyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHVubGlrZWx5KGNoYW4tPmZlbmNlLnNlcXVlbmNlID09IGNoYW4tPmZlbmNlLnNlcXVlbmNlX2FjayAtIDEpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT5mZW5jZS5sb2NrLCBmbGFncyk7CisJCW5vdXZlYXVfZmVuY2VfdXBkYXRlKGNoYW4pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT5mZW5jZS5sb2NrLCBmbGFncyk7CisKKwkJQlVHX09OKGNoYW4tPmZlbmNlLnNlcXVlbmNlID09CisJCSAgICAgICBjaGFuLT5mZW5jZS5zZXF1ZW5jZV9hY2sgLSAxKTsKKwl9CisKKwlmZW5jZS0+c2VxdWVuY2UgPSArK2NoYW4tPmZlbmNlLnNlcXVlbmNlOworCisJa3JlZl9nZXQoJmZlbmNlLT5yZWZjb3VudCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPmZlbmNlLmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZmZW5jZS0+ZW50cnksICZjaGFuLT5mZW5jZS5wZW5kaW5nKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT5mZW5jZS5sb2NrLCBmbGFncyk7CisKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViTTJNRiwgVVNFX1JFRkNOVCA/IDB4MDA1MCA6IDB4MDE1MCwgMSk7CisJT1VUX1JJTkcoY2hhbiwgZmVuY2UtPnNlcXVlbmNlKTsKKwlGSVJFX1JJTkcoY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbm91dmVhdV9mZW5jZV91bnJlZih2b2lkICoqc3luY19vYmopCit7CisJc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlID0gbm91dmVhdV9mZW5jZSgqc3luY19vYmopOworCisJaWYgKGZlbmNlKQorCQlrcmVmX3B1dCgmZmVuY2UtPnJlZmNvdW50LCBub3V2ZWF1X2ZlbmNlX2RlbCk7CisJKnN5bmNfb2JqID0gTlVMTDsKK30KKwordm9pZCAqCitub3V2ZWF1X2ZlbmNlX3JlZih2b2lkICpzeW5jX29iaikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqZmVuY2UgPSBub3V2ZWF1X2ZlbmNlKHN5bmNfb2JqKTsKKworCWtyZWZfZ2V0KCZmZW5jZS0+cmVmY291bnQpOworCXJldHVybiBzeW5jX29iajsKK30KKworYm9vbAorbm91dmVhdV9mZW5jZV9zaWduYWxsZWQodm9pZCAqc3luY19vYmosIHZvaWQgKnN5bmNfYXJnKQoreworCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZSA9IG5vdXZlYXVfZmVuY2Uoc3luY19vYmopOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBmZW5jZS0+Y2hhbm5lbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGZlbmNlLT5zaWduYWxsZWQpCisJCXJldHVybiB0cnVlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPmZlbmNlLmxvY2ssIGZsYWdzKTsKKwlub3V2ZWF1X2ZlbmNlX3VwZGF0ZShjaGFuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT5mZW5jZS5sb2NrLCBmbGFncyk7CisJcmV0dXJuIGZlbmNlLT5zaWduYWxsZWQ7Cit9CisKK2ludAorbm91dmVhdV9mZW5jZV93YWl0KHZvaWQgKnN5bmNfb2JqLCB2b2lkICpzeW5jX2FyZywgYm9vbCBsYXp5LCBib29sIGludHIpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArICgzICogRFJNX0haKTsKKwlpbnQgcmV0ID0gMDsKKworCV9fc2V0X2N1cnJlbnRfc3RhdGUoaW50ciA/IFRBU0tfSU5URVJSVVBUSUJMRSA6IFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKworCXdoaWxlICgxKSB7CisJCWlmIChub3V2ZWF1X2ZlbmNlX3NpZ25hbGxlZChzeW5jX29iaiwgc3luY19hcmcpKQorCQkJYnJlYWs7CisKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZW91dCkpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGxhenkpCisJCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCisJCWlmIChpbnRyICYmIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXQgPSAtRVJFU1RBUlQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludAorbm91dmVhdV9mZW5jZV9mbHVzaCh2b2lkICpzeW5jX29iaiwgdm9pZCAqc3luY19hcmcpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK25vdXZlYXVfZmVuY2VfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBOVUxMOworCisJaWYgKGNoYW5uZWwgPj0gMCAmJiBjaGFubmVsIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzKQorCQljaGFuID0gZGV2X3ByaXYtPmZpZm9zW2NoYW5uZWxdOworCisJaWYgKGNoYW4pIHsKKwkJc3Bpbl9sb2NrX2lycSgmY2hhbi0+ZmVuY2UubG9jayk7CisJCW5vdXZlYXVfZmVuY2VfdXBkYXRlKGNoYW4pOworCQlzcGluX3VubG9ja19pcnEoJmNoYW4tPmZlbmNlLmxvY2spOworCX0KK30KKworaW50Citub3V2ZWF1X2ZlbmNlX2luaXQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlJTklUX0xJU1RfSEVBRCgmY2hhbi0+ZmVuY2UucGVuZGluZyk7CisJc3Bpbl9sb2NrX2luaXQoJmNoYW4tPmZlbmNlLmxvY2spOworCXJldHVybiAwOworfQorCit2b2lkCitub3V2ZWF1X2ZlbmNlX2Zpbmkoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSwgKnRtcDsKKwlzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqZmVuY2U7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJmNoYW4tPmZlbmNlLnBlbmRpbmcpIHsKKwkJZmVuY2UgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3Qgbm91dmVhdV9mZW5jZSwgZW50cnkpOworCisJCWZlbmNlLT5zaWduYWxsZWQgPSB0cnVlOworCQlsaXN0X2RlbCgmZmVuY2UtPmVudHJ5KTsKKwkJa3JlZl9wdXQoJmZlbmNlLT5yZWZjb3VudCwgbm91dmVhdV9mZW5jZV9kZWwpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZ2VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmODMxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZ2VtLmMKQEAgLTAsMCArMSw5OTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQmVuIFNrZWdncy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZG1hLmgiCisKKyNkZWZpbmUgbm91dmVhdV9nZW1fcHVzaGJ1Zl9zeW5jKGNoYW4pIDAKKworaW50Citub3V2ZWF1X2dlbV9vYmplY3RfbmV3KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtKQoreworCXJldHVybiAwOworfQorCit2b2lkCitub3V2ZWF1X2dlbV9vYmplY3RfZGVsKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtKQoreworCXN0cnVjdCBub3V2ZWF1X2JvICpudmJvID0gZ2VtLT5kcml2ZXJfcHJpdmF0ZTsKKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0gJm52Ym8tPmJvOworCisJaWYgKCFudmJvKQorCQlyZXR1cm47CisJbnZiby0+Z2VtID0gTlVMTDsKKworCWlmICh1bmxpa2VseShudmJvLT5jcHVfZmlscCkpCisJCXR0bV9ib19zeW5jY3B1X3dyaXRlX3JlbGVhc2UoYm8pOworCisJaWYgKHVubGlrZWx5KG52Ym8tPnBpbl9yZWZjbnQpKSB7CisJCW52Ym8tPnBpbl9yZWZjbnQgPSAxOworCQlub3V2ZWF1X2JvX3VucGluKG52Ym8pOworCX0KKworCXR0bV9ib191bnJlZigmYm8pOworfQorCitpbnQKK25vdXZlYXVfZ2VtX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQlpbnQgc2l6ZSwgaW50IGFsaWduLCB1aW50MzJfdCBmbGFncywgdWludDMyX3QgdGlsZV9tb2RlLAorCQl1aW50MzJfdCB0aWxlX2ZsYWdzLCBib29sIG5vX3ZtLCBib29sIG1hcHBhYmxlLAorCQlzdHJ1Y3Qgbm91dmVhdV9ibyAqKnBudmJvKQoreworCXN0cnVjdCBub3V2ZWF1X2JvICpudmJvOworCWludCByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2JvX25ldyhkZXYsIGNoYW4sIHNpemUsIGFsaWduLCBmbGFncywgdGlsZV9tb2RlLAorCQkJICAgICB0aWxlX2ZsYWdzLCBub192bSwgbWFwcGFibGUsIHBudmJvKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCW52Ym8gPSAqcG52Ym87CisKKwludmJvLT5nZW0gPSBkcm1fZ2VtX29iamVjdF9hbGxvYyhkZXYsIG52Ym8tPmJvLm1lbS5zaXplKTsKKwlpZiAoIW52Ym8tPmdlbSkgeworCQlub3V2ZWF1X2JvX3JlZihOVUxMLCBwbnZibyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW52Ym8tPmJvLnBlcnNpc3RhbnRfc3dhcF9zdG9yYWdlID0gbnZiby0+Z2VtLT5maWxwOworCW52Ym8tPmdlbS0+ZHJpdmVyX3ByaXZhdGUgPSBudmJvOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2dlbV9pbmZvKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtLCBzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX2luZm8gKnJlcCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibyA9IG5vdXZlYXVfZ2VtX29iamVjdChnZW0pOworCisJaWYgKG52Ym8tPmJvLm1lbS5tZW1fdHlwZSA9PSBUVE1fUExfVFQpCisJCXJlcC0+ZG9tYWluID0gTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQ7CisJZWxzZQorCQlyZXAtPmRvbWFpbiA9IE5PVVZFQVVfR0VNX0RPTUFJTl9WUkFNOworCisJcmVwLT5zaXplID0gbnZiby0+Ym8ubWVtLm51bV9wYWdlcyA8PCBQQUdFX1NISUZUOworCXJlcC0+b2Zmc2V0ID0gbnZiby0+Ym8ub2Zmc2V0OworCXJlcC0+bWFwX2hhbmRsZSA9IG52Ym8tPm1hcHBhYmxlID8gbnZiby0+Ym8uYWRkcl9zcGFjZV9vZmZzZXQgOiAwOworCXJlcC0+dGlsZV9tb2RlID0gbnZiby0+dGlsZV9tb2RlOworCXJlcC0+dGlsZV9mbGFncyA9IG52Ym8tPnRpbGVfZmxhZ3M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sCitub3V2ZWF1X2dlbV90aWxlX2ZsYWdzX3ZhbGlkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHRpbGVfZmxhZ3MpIHsKKwlzd2l0Y2ggKHRpbGVfZmxhZ3MpIHsKKwljYXNlIDB4MDAwMDoKKwljYXNlIDB4MTgwMDoKKwljYXNlIDB4MjgwMDoKKwljYXNlIDB4NDgwMDoKKwljYXNlIDB4NzAwMDoKKwljYXNlIDB4NzQwMDoKKwljYXNlIDB4N2EwMDoKKwljYXNlIDB4ZTAwMDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTlZfRVJST1IoZGV2LCAiYmFkIHBhZ2UgZmxhZ3M6IDB4JTA4eFxuIiwgdGlsZV9mbGFncyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworaW50Citub3V2ZWF1X2dlbV9pb2N0bF9uZXcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX25ldyAqcmVxID0gZGF0YTsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibyA9IE5VTEw7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IE5VTEw7CisJdWludDMyX3QgZmxhZ3MgPSAwOworCWludCByZXQgPSAwOworCisJTk9VVkVBVV9DSEVDS19JTklUSUFMSVNFRF9XSVRIX1JFVFVSTjsKKworCWlmICh1bmxpa2VseShkZXZfcHJpdi0+dHRtLmJkZXYuZGV2X21hcHBpbmcgPT0gTlVMTCkpCisJCWRldl9wcml2LT50dG0uYmRldi5kZXZfbWFwcGluZyA9IGRldl9wcml2LT5kZXYtPmRldl9tYXBwaW5nOworCisJaWYgKHJlcS0+Y2hhbm5lbF9oaW50KSB7CisJCU5PVVZFQVVfR0VUX1VTRVJfQ0hBTk5FTF9XSVRIX1JFVFVSTihyZXEtPmNoYW5uZWxfaGludCwKKwkJCQkJCSAgICAgZmlsZV9wcml2LCBjaGFuKTsKKwl9CisKKwlpZiAocmVxLT5pbmZvLmRvbWFpbiAmIE5PVVZFQVVfR0VNX0RPTUFJTl9WUkFNKQorCQlmbGFncyB8PSBUVE1fUExfRkxBR19WUkFNOworCWlmIChyZXEtPmluZm8uZG9tYWluICYgTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQpCisJCWZsYWdzIHw9IFRUTV9QTF9GTEFHX1RUOworCWlmICghZmxhZ3MgfHwgcmVxLT5pbmZvLmRvbWFpbiAmIE5PVVZFQVVfR0VNX0RPTUFJTl9DUFUpCisJCWZsYWdzIHw9IFRUTV9QTF9GTEFHX1NZU1RFTTsKKworCWlmICghbm91dmVhdV9nZW1fdGlsZV9mbGFnc192YWxpZChkZXYsIHJlcS0+aW5mby50aWxlX2ZsYWdzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBub3V2ZWF1X2dlbV9uZXcoZGV2LCBjaGFuLCByZXEtPmluZm8uc2l6ZSwgcmVxLT5hbGlnbiwgZmxhZ3MsCisJCQkgICAgICByZXEtPmluZm8udGlsZV9tb2RlLCByZXEtPmluZm8udGlsZV9mbGFncywgZmFsc2UsCisJCQkgICAgICAocmVxLT5pbmZvLmRvbWFpbiAmIE5PVVZFQVVfR0VNX0RPTUFJTl9NQVBQQUJMRSksCisJCQkgICAgICAmbnZibyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG5vdXZlYXVfZ2VtX2luZm8obnZiby0+Z2VtLCAmcmVxLT5pbmZvKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IGRybV9nZW1faGFuZGxlX2NyZWF0ZShmaWxlX3ByaXYsIG52Ym8tPmdlbSwgJnJlcS0+aW5mby5oYW5kbGUpOworb3V0OgorCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlkcm1fZ2VtX29iamVjdF9oYW5kbGVfdW5yZWZlcmVuY2UobnZiby0+Z2VtKTsKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCWlmIChyZXQpCisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG52Ym8tPmdlbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorbm91dmVhdV9nZW1fc2V0X2RvbWFpbihzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbSwgdWludDMyX3QgcmVhZF9kb21haW5zLAorCQkgICAgICAgdWludDMyX3Qgd3JpdGVfZG9tYWlucywgdWludDMyX3QgdmFsaWRfZG9tYWlucykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibyA9IGdlbS0+ZHJpdmVyX3ByaXZhdGU7CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9ICZudmJvLT5ibzsKKwl1aW50NjRfdCBmbGFnczsKKworCWlmICghdmFsaWRfZG9tYWlucyB8fCAoIXJlYWRfZG9tYWlucyAmJiAhd3JpdGVfZG9tYWlucykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdyaXRlX2RvbWFpbnMpIHsKKwkJaWYgKCh2YWxpZF9kb21haW5zICYgTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0pICYmCisJCSAgICAod3JpdGVfZG9tYWlucyAmIE5PVVZFQVVfR0VNX0RPTUFJTl9WUkFNKSkKKwkJCWZsYWdzID0gVFRNX1BMX0ZMQUdfVlJBTTsKKwkJZWxzZQorCQlpZiAoKHZhbGlkX2RvbWFpbnMgJiBOT1VWRUFVX0dFTV9ET01BSU5fR0FSVCkgJiYKKwkJICAgICh3cml0ZV9kb21haW5zICYgTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQpKQorCQkJZmxhZ3MgPSBUVE1fUExfRkxBR19UVDsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJaWYgKCh2YWxpZF9kb21haW5zICYgTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0pICYmCisJCSAgICAocmVhZF9kb21haW5zICYgTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0pICYmCisJCSAgICBiby0+bWVtLm1lbV90eXBlID09IFRUTV9QTF9WUkFNKQorCQkJZmxhZ3MgPSBUVE1fUExfRkxBR19WUkFNOworCQllbHNlCisJCWlmICgodmFsaWRfZG9tYWlucyAmIE5PVVZFQVVfR0VNX0RPTUFJTl9HQVJUKSAmJgorCQkgICAgKHJlYWRfZG9tYWlucyAmIE5PVVZFQVVfR0VNX0RPTUFJTl9HQVJUKSAmJgorCQkgICAgYm8tPm1lbS5tZW1fdHlwZSA9PSBUVE1fUExfVFQpCisJCQlmbGFncyA9IFRUTV9QTF9GTEFHX1RUOworCQllbHNlCisJCWlmICgodmFsaWRfZG9tYWlucyAmIE5PVVZFQVVfR0VNX0RPTUFJTl9WUkFNKSAmJgorCQkgICAgKHJlYWRfZG9tYWlucyAmIE5PVVZFQVVfR0VNX0RPTUFJTl9WUkFNKSkKKwkJCWZsYWdzID0gVFRNX1BMX0ZMQUdfVlJBTTsKKwkJZWxzZQorCQkJZmxhZ3MgPSBUVE1fUExfRkxBR19UVDsKKwl9CisKKwlub3V2ZWF1X2JvX3BsYWNlbWVudF9zZXQobnZibywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgdmFsaWRhdGVfb3AgeworCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHZyYW1fbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGdhcnRfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJvdGhfbGlzdDsKK307CisKK3N0YXRpYyB2b2lkCit2YWxpZGF0ZV9maW5pX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqdG1wOworCXN0cnVjdCBub3V2ZWF1X2JvICpudmJvOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCB0bXAsIGxpc3QpIHsKKwkJbnZibyA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBub3V2ZWF1X2JvLCBlbnRyeSk7CisJCWlmIChsaWtlbHkoZmVuY2UpKSB7CisJCQlzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqcHJldl9mZW5jZTsKKworCQkJc3Bpbl9sb2NrKCZudmJvLT5iby5sb2NrKTsKKwkJCXByZXZfZmVuY2UgPSBudmJvLT5iby5zeW5jX29iajsKKwkJCW52Ym8tPmJvLnN5bmNfb2JqID0gbm91dmVhdV9mZW5jZV9yZWYoZmVuY2UpOworCQkJc3Bpbl91bmxvY2soJm52Ym8tPmJvLmxvY2spOworCQkJbm91dmVhdV9mZW5jZV91bnJlZigodm9pZCAqKSZwcmV2X2ZlbmNlKTsKKwkJfQorCisJCWxpc3RfZGVsKCZudmJvLT5lbnRyeSk7CisJCW52Ym8tPnJlc2VydmVkX2J5ID0gTlVMTDsKKwkJdHRtX2JvX3VucmVzZXJ2ZSgmbnZiby0+Ym8pOworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShudmJvLT5nZW0pOworCX0KK30KKworc3RhdGljIHZvaWQKK3ZhbGlkYXRlX2Zpbmkoc3RydWN0IHZhbGlkYXRlX29wICpvcCwgYm9vbCBzdWNjZXNzKQoreworCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZSA9IG9wLT5mZW5jZTsKKworCWlmICh1bmxpa2VseSghc3VjY2VzcykpCisJCW9wLT5mZW5jZSA9IE5VTEw7CisKKwl2YWxpZGF0ZV9maW5pX2xpc3QoJm9wLT52cmFtX2xpc3QsIG9wLT5mZW5jZSk7CisJdmFsaWRhdGVfZmluaV9saXN0KCZvcC0+Z2FydF9saXN0LCBvcC0+ZmVuY2UpOworCXZhbGlkYXRlX2ZpbmlfbGlzdCgmb3AtPmJvdGhfbGlzdCwgb3AtPmZlbmNlKTsKKwlub3V2ZWF1X2ZlbmNlX3VucmVmKCh2b2lkICopJmZlbmNlKTsKK30KKworc3RhdGljIGludAordmFsaWRhdGVfaW5pdChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkgICAgICBzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfYm8gKnBiYm8sCisJICAgICAgaW50IG5yX2J1ZmZlcnMsIHN0cnVjdCB2YWxpZGF0ZV9vcCAqb3ApCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IHNlcXVlbmNlOworCWludCB0cnljbnQgPSAwOworCWludCByZXQsIGk7CisKKwlzZXF1ZW5jZSA9IGF0b21pY19hZGRfcmV0dXJuKDEsICZkZXZfcHJpdi0+dHRtLnZhbGlkYXRlX3NlcXVlbmNlKTsKK3JldHJ5OgorCWlmICgrK3RyeWNudCA+IDEwMDAwMCkgeworCQlOVl9FUlJPUihkZXYsICIlcyBmYWlsZWQgYW5kIGdhdmUgdXAuXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBucl9idWZmZXJzOyBpKyspIHsKKwkJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvICpiID0gJnBiYm9baV07CisJCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtOworCQlzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibzsKKworCQlnZW0gPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsIGItPmhhbmRsZSk7CisJCWlmICghZ2VtKSB7CisJCQlOVl9FUlJPUihkZXYsICJVbmtub3duIGhhbmRsZSAweCUwOHhcbiIsIGItPmhhbmRsZSk7CisJCQl2YWxpZGF0ZV9maW5pKG9wLCBOVUxMKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW52Ym8gPSBnZW0tPmRyaXZlcl9wcml2YXRlOworCisJCWlmIChudmJvLT5yZXNlcnZlZF9ieSAmJiBudmJvLT5yZXNlcnZlZF9ieSA9PSBmaWxlX3ByaXYpIHsKKwkJCU5WX0VSUk9SKGRldiwgIm11bHRpcGxlIGluc3RhbmNlcyBvZiBidWZmZXIgJWQgb24gIgorCQkJCSAgICAgICJ2YWxpZGF0aW9uIGxpc3RcbiIsIGItPmhhbmRsZSk7CisJCQl2YWxpZGF0ZV9maW5pKG9wLCBOVUxMKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcmV0ID0gdHRtX2JvX3Jlc2VydmUoJm52Ym8tPmJvLCBmYWxzZSwgZmFsc2UsIHRydWUsIHNlcXVlbmNlKTsKKwkJaWYgKHJldCkgeworCQkJdmFsaWRhdGVfZmluaShvcCwgTlVMTCk7CisJCQlpZiAocmV0ID09IC1FQUdBSU4pCisJCQkJcmV0ID0gdHRtX2JvX3dhaXRfdW5yZXNlcnZlZCgmbnZiby0+Ym8sIGZhbHNlKTsKKwkJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGdlbSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQlnb3RvIHJldHJ5OworCQl9CisKKwkJbnZiby0+cmVzZXJ2ZWRfYnkgPSBmaWxlX3ByaXY7CisJCW52Ym8tPnBiYm9faW5kZXggPSBpOworCQlpZiAoKGItPnZhbGlkX2RvbWFpbnMgJiBOT1VWRUFVX0dFTV9ET01BSU5fVlJBTSkgJiYKKwkJICAgIChiLT52YWxpZF9kb21haW5zICYgTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQpKQorCQkJbGlzdF9hZGRfdGFpbCgmbnZiby0+ZW50cnksICZvcC0+Ym90aF9saXN0KTsKKwkJZWxzZQorCQlpZiAoYi0+dmFsaWRfZG9tYWlucyAmIE5PVVZFQVVfR0VNX0RPTUFJTl9WUkFNKQorCQkJbGlzdF9hZGRfdGFpbCgmbnZiby0+ZW50cnksICZvcC0+dnJhbV9saXN0KTsKKwkJZWxzZQorCQlpZiAoYi0+dmFsaWRfZG9tYWlucyAmIE5PVVZFQVVfR0VNX0RPTUFJTl9HQVJUKQorCQkJbGlzdF9hZGRfdGFpbCgmbnZiby0+ZW50cnksICZvcC0+Z2FydF9saXN0KTsKKwkJZWxzZSB7CisJCQlOVl9FUlJPUihkZXYsICJpbnZhbGlkIHZhbGlkIGRvbWFpbnM6IDB4JTA4eFxuIiwKKwkJCQkgYi0+dmFsaWRfZG9tYWlucyk7CisJCQl2YWxpZGF0ZV9maW5pKG9wLCBOVUxMKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZudmJvLT5iby5jcHVfd3JpdGVycykgPiAwKSkgeworCQkJdmFsaWRhdGVfZmluaShvcCwgTlVMTCk7CisKKwkJCWlmIChudmJvLT5jcHVfZmlscCA9PSBmaWxlX3ByaXYpIHsKKwkJCQlOVl9FUlJPUihkZXYsICJibyAlcCBtYXBwZWQgYnkgcHJvY2VzcyB0cnlpbmcgIgorCQkJCQkgICAgICAidG8gdmFsaWRhdGUgaXQhXG4iLCBudmJvKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJcmV0ID0gdHRtX2JvX3dhaXRfY3B1KCZudmJvLT5ibywgZmFsc2UpOworCQkJaWYgKHJldCA9PSAtRVJFU1RBUlQpCisJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordmFsaWRhdGVfbGlzdChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCSAgICAgIHN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9ibyAqcGJibywgdWludDY0X3QgdXNlcl9wYmJvX3B0cikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfYm8gX191c2VyICp1cGJibyA9CisJCQkJKHZvaWQgX19mb3JjZSBfX3VzZXIgKikodWludHB0cl90KXVzZXJfcGJib19wdHI7CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym87CisJaW50IHJldCwgcmVsb2NzID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobnZibywgbGlzdCwgZW50cnkpIHsKKwkJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvICpiID0gJnBiYm9bbnZiby0+cGJib19pbmRleF07CisJCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpwcmV2X2ZlbmNlID0gbnZiby0+Ym8uc3luY19vYmo7CisKKwkJaWYgKHByZXZfZmVuY2UgJiYgbm91dmVhdV9mZW5jZV9jaGFubmVsKHByZXZfZmVuY2UpICE9IGNoYW4pIHsKKwkJCXNwaW5fbG9jaygmbnZiby0+Ym8ubG9jayk7CisJCQlyZXQgPSB0dG1fYm9fd2FpdCgmbnZiby0+Ym8sIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworCQkJc3Bpbl91bmxvY2soJm52Ym8tPmJvLmxvY2spOworCQkJaWYgKHVubGlrZWx5KHJldCkpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXJldCA9IG5vdXZlYXVfZ2VtX3NldF9kb21haW4obnZiby0+Z2VtLCBiLT5yZWFkX2RvbWFpbnMsCisJCQkJCSAgICAgYi0+d3JpdGVfZG9tYWlucywKKwkJCQkJICAgICBiLT52YWxpZF9kb21haW5zKTsKKwkJaWYgKHVubGlrZWx5KHJldCkpCisJCQlyZXR1cm4gcmV0OworCisJCW52Ym8tPmNoYW5uZWwgPSBjaGFuOworCQlyZXQgPSB0dG1fYm9fdmFsaWRhdGUoJm52Ym8tPmJvLCAmbnZiby0+cGxhY2VtZW50LAorCQkJCSAgICAgIGZhbHNlLCBmYWxzZSk7CisJCW52Ym8tPmNoYW5uZWwgPSBOVUxMOworCQlpZiAodW5saWtlbHkocmV0KSkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKG52Ym8tPmJvLm9mZnNldCA9PSBiLT5wcmVzdW1lZF9vZmZzZXQgJiYKKwkJICAgICgobnZiby0+Ym8ubWVtLm1lbV90eXBlID09IFRUTV9QTF9WUkFNICYmCisJCSAgICAgIGItPnByZXN1bWVkX2RvbWFpbiAmIE5PVVZFQVVfR0VNX0RPTUFJTl9WUkFNKSB8fAorCQkgICAgIChudmJvLT5iby5tZW0ubWVtX3R5cGUgPT0gVFRNX1BMX1RUICYmCisJCSAgICAgIGItPnByZXN1bWVkX2RvbWFpbiAmIE5PVVZFQVVfR0VNX0RPTUFJTl9HQVJUKSkpCisJCQljb250aW51ZTsKKworCQlpZiAobnZiby0+Ym8ubWVtLm1lbV90eXBlID09IFRUTV9QTF9UVCkKKwkJCWItPnByZXN1bWVkX2RvbWFpbiA9IE5PVVZFQVVfR0VNX0RPTUFJTl9HQVJUOworCQllbHNlCisJCQliLT5wcmVzdW1lZF9kb21haW4gPSBOT1VWRUFVX0dFTV9ET01BSU5fVlJBTTsKKwkJYi0+cHJlc3VtZWRfb2Zmc2V0ID0gbnZiby0+Ym8ub2Zmc2V0OworCQliLT5wcmVzdW1lZF9vayA9IDA7CisJCXJlbG9jcysrOworCisJCWlmIChEUk1fQ09QWV9UT19VU0VSKCZ1cGJib1tudmJvLT5wYmJvX2luZGV4XSwgYiwgc2l6ZW9mKCpiKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gcmVsb2NzOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2dlbV9wdXNoYnVmX3ZhbGlkYXRlKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkJICAgICBzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfYm8gKnBiYm8sCisJCQkgICAgIHVpbnQ2NF90IHVzZXJfYnVmZmVycywgaW50IG5yX2J1ZmZlcnMsCisJCQkgICAgIHN0cnVjdCB2YWxpZGF0ZV9vcCAqb3AsIGludCAqYXBwbHlfcmVsb2NzKQoreworCWludCByZXQsIHJlbG9jcyA9IDA7CisKKwlJTklUX0xJU1RfSEVBRCgmb3AtPnZyYW1fbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJm9wLT5nYXJ0X2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZvcC0+Ym90aF9saXN0KTsKKworCXJldCA9IG5vdXZlYXVfZmVuY2VfbmV3KGNoYW4sICZvcC0+ZmVuY2UsIGZhbHNlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKG5yX2J1ZmZlcnMgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSB2YWxpZGF0ZV9pbml0KGNoYW4sIGZpbGVfcHJpdiwgcGJibywgbnJfYnVmZmVycywgb3ApOworCWlmICh1bmxpa2VseShyZXQpKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdmFsaWRhdGVfbGlzdChjaGFuLCAmb3AtPnZyYW1fbGlzdCwgcGJibywgdXNlcl9idWZmZXJzKTsKKwlpZiAodW5saWtlbHkocmV0IDwgMCkpIHsKKwkJdmFsaWRhdGVfZmluaShvcCwgTlVMTCk7CisJCXJldHVybiByZXQ7CisJfQorCXJlbG9jcyArPSByZXQ7CisKKwlyZXQgPSB2YWxpZGF0ZV9saXN0KGNoYW4sICZvcC0+Z2FydF9saXN0LCBwYmJvLCB1c2VyX2J1ZmZlcnMpOworCWlmICh1bmxpa2VseShyZXQgPCAwKSkgeworCQl2YWxpZGF0ZV9maW5pKG9wLCBOVUxMKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmVsb2NzICs9IHJldDsKKworCXJldCA9IHZhbGlkYXRlX2xpc3QoY2hhbiwgJm9wLT5ib3RoX2xpc3QsIHBiYm8sIHVzZXJfYnVmZmVycyk7CisJaWYgKHVubGlrZWx5KHJldCA8IDApKSB7CisJCXZhbGlkYXRlX2Zpbmkob3AsIE5VTEwpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZWxvY3MgKz0gcmV0OworCisJKmFwcGx5X3JlbG9jcyA9IHJlbG9jczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkICoKK3VfbWVtY3B5YSh1aW50NjRfdCB1c2VyLCB1bnNpZ25lZCBubWVtYiwgdW5zaWduZWQgc2l6ZSkKK3sKKwl2b2lkICptZW07CisJdm9pZCBfX3VzZXIgKnVzZXJwdHIgPSAodm9pZCBfX2ZvcmNlIF9fdXNlciAqKSh1aW50cHRyX3QpdXNlcjsKKworCW1lbSA9IGttYWxsb2Mobm1lbWIgKiBzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKG1lbSwgdXNlcnB0ciwgbm1lbWIgKiBzaXplKSkgeworCQlrZnJlZShtZW0pOworCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKKwl9CisKKwlyZXR1cm4gbWVtOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2dlbV9wdXNoYnVmX3JlbG9jX2FwcGx5KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBucl9ibywKKwkJCQlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfYm8gKmJvLAorCQkJCWludCBucl9yZWxvY3MsIHVpbnQ2NF90IHB0cl9yZWxvY3MsCisJCQkJaW50IG5yX2R3b3JkcywgaW50IGZpcnN0X2R3b3JkLAorCQkJCXVpbnQzMl90ICpwdXNoYnVmLCBib29sIGlzX2lvbWVtKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9yZWxvYyAqcmVsb2MgPSBOVUxMOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJaW50IHJldCA9IDAsIGk7CisKKwlyZWxvYyA9IHVfbWVtY3B5YShwdHJfcmVsb2NzLCBucl9yZWxvY3MsIHNpemVvZigqcmVsb2MpKTsKKwlpZiAoSVNfRVJSKHJlbG9jKSkKKwkJcmV0dXJuIFBUUl9FUlIocmVsb2MpOworCisJZm9yIChpID0gMDsgaSA8IG5yX3JlbG9jczsgaSsrKSB7CisJCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9yZWxvYyAqciA9ICZyZWxvY1tpXTsKKwkJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvICpiOworCQl1aW50MzJfdCBkYXRhOworCisJCWlmIChyLT5ib19pbmRleCA+PSBucl9ibyB8fCByLT5yZWxvY19pbmRleCA8IGZpcnN0X2R3b3JkIHx8CisJCSAgICByLT5yZWxvY19pbmRleCA+PSBmaXJzdF9kd29yZCArIG5yX2R3b3JkcykgeworCQkJTlZfRVJST1IoZGV2LCAiQmFkIHJlbG9jYXRpb24gJWRcbiIsIGkpOworCQkJTlZfRVJST1IoZGV2LCAiICBibzogJWQgbWF4ICVkXG4iLCByLT5ib19pbmRleCwgbnJfYm8pOworCQkJTlZfRVJST1IoZGV2LCAiICBpZDogJWQgbWF4ICVkXG4iLCByLT5yZWxvY19pbmRleCwgbnJfZHdvcmRzKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWIgPSAmYm9bci0+Ym9faW5kZXhdOworCQlpZiAoYi0+cHJlc3VtZWRfb2spCisJCQljb250aW51ZTsKKworCQlpZiAoci0+ZmxhZ3MgJiBOT1VWRUFVX0dFTV9SRUxPQ19MT1cpCisJCQlkYXRhID0gYi0+cHJlc3VtZWRfb2Zmc2V0ICsgci0+ZGF0YTsKKwkJZWxzZQorCQlpZiAoci0+ZmxhZ3MgJiBOT1VWRUFVX0dFTV9SRUxPQ19ISUdIKQorCQkJZGF0YSA9IChiLT5wcmVzdW1lZF9vZmZzZXQgKyByLT5kYXRhKSA+PiAzMjsKKwkJZWxzZQorCQkJZGF0YSA9IHItPmRhdGE7CisKKwkJaWYgKHItPmZsYWdzICYgTk9VVkVBVV9HRU1fUkVMT0NfT1IpIHsKKwkJCWlmIChiLT5wcmVzdW1lZF9kb21haW4gPT0gTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQpCisJCQkJZGF0YSB8PSByLT50b3I7CisJCQllbHNlCisJCQkJZGF0YSB8PSByLT52b3I7CisJCX0KKworCQlpZiAoaXNfaW9tZW0pCisJCQlpb3dyaXRlMzJfbmF0aXZlKGRhdGEsICh2b2lkIF9fZm9yY2UgX19pb21lbSAqKQorCQkJCQkJJnB1c2hidWZbci0+cmVsb2NfaW5kZXhdKTsKKwkJZWxzZQorCQkJcHVzaGJ1ZltyLT5yZWxvY19pbmRleF0gPSBkYXRhOworCX0KKworCWtmcmVlKHJlbG9jKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK25vdXZlYXVfZ2VtX2lvY3RsX3B1c2hidWYoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCSAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmICpyZXEgPSBkYXRhOworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9ibyAqYm8gPSBOVUxMOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CisJc3RydWN0IHZhbGlkYXRlX29wIG9wOworCXVpbnQzMl90ICpwdXNoYnVmID0gTlVMTDsKKwlpbnQgcmV0ID0gMCwgZG9fcmVsb2MgPSAwLCBpOworCisJTk9VVkVBVV9DSEVDS19JTklUSUFMSVNFRF9XSVRIX1JFVFVSTjsKKwlOT1VWRUFVX0dFVF9VU0VSX0NIQU5ORUxfV0lUSF9SRVRVUk4ocmVxLT5jaGFubmVsLCBmaWxlX3ByaXYsIGNoYW4pOworCisJaWYgKHJlcS0+bnJfZHdvcmRzID49IGNoYW4tPmRtYS5tYXggfHwKKwkgICAgcmVxLT5ucl9idWZmZXJzID4gTk9VVkVBVV9HRU1fTUFYX0JVRkZFUlMgfHwKKwkgICAgcmVxLT5ucl9yZWxvY3MgPiBOT1VWRUFVX0dFTV9NQVhfUkVMT0NTKSB7CisJCU5WX0VSUk9SKGRldiwgIlB1c2hidWYgY29uZmlnIGV4Y2VlZHMgbGltaXRzOlxuIik7CisJCU5WX0VSUk9SKGRldiwgIiAgZHdvcmRzIDogJWQgbWF4ICVkXG4iLCByZXEtPm5yX2R3b3JkcywKKwkJCSBjaGFuLT5kbWEubWF4IC0gMSk7CisJCU5WX0VSUk9SKGRldiwgIiAgYnVmZmVyczogJWQgbWF4ICVkXG4iLCByZXEtPm5yX2J1ZmZlcnMsCisJCQkgTk9VVkVBVV9HRU1fTUFYX0JVRkZFUlMpOworCQlOVl9FUlJPUihkZXYsICIgIHJlbG9jcyA6ICVkIG1heCAlZFxuIiwgcmVxLT5ucl9yZWxvY3MsCisJCQkgTk9VVkVBVV9HRU1fTUFYX1JFTE9DUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXB1c2hidWYgPSB1X21lbWNweWEocmVxLT5kd29yZHMsIHJlcS0+bnJfZHdvcmRzLCBzaXplb2YodWludDMyX3QpKTsKKwlpZiAoSVNfRVJSKHB1c2hidWYpKQorCQlyZXR1cm4gUFRSX0VSUihwdXNoYnVmKTsKKworCWJvID0gdV9tZW1jcHlhKHJlcS0+YnVmZmVycywgcmVxLT5ucl9idWZmZXJzLCBzaXplb2YoKmJvKSk7CisJaWYgKElTX0VSUihibykpIHsKKwkJa2ZyZWUocHVzaGJ1Zik7CisJCXJldHVybiBQVFJfRVJSKGJvKTsKKwl9CisKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwkvKiBWYWxpZGF0ZSBidWZmZXIgbGlzdCAqLworCXJldCA9IG5vdXZlYXVfZ2VtX3B1c2hidWZfdmFsaWRhdGUoY2hhbiwgZmlsZV9wcml2LCBibywgcmVxLT5idWZmZXJzLAorCQkJCQkgICByZXEtPm5yX2J1ZmZlcnMsICZvcCwgJmRvX3JlbG9jKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIEFwcGx5IGFueSByZWxvY2F0aW9ucyB0aGF0IGFyZSByZXF1aXJlZCAqLworCWlmIChkb19yZWxvYykgeworCQlyZXQgPSBub3V2ZWF1X2dlbV9wdXNoYnVmX3JlbG9jX2FwcGx5KGNoYW4sIHJlcS0+bnJfYnVmZmVycywKKwkJCQkJCSAgICAgIGJvLCByZXEtPm5yX3JlbG9jcywKKwkJCQkJCSAgICAgIHJlcS0+cmVsb2NzLAorCQkJCQkJICAgICAgcmVxLT5ucl9kd29yZHMsIDAsCisJCQkJCQkgICAgICBwdXNoYnVmLCBmYWxzZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisKKwkvKiBFbWl0IHB1c2ggYnVmZmVyIHRvIHRoZSBodworCSAqLworCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgcmVxLT5ucl9kd29yZHMpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJT1VUX1JJTkdwKGNoYW4sIHB1c2hidWYsIHJlcS0+bnJfZHdvcmRzKTsKKworCXJldCA9IG5vdXZlYXVfZmVuY2VfZW1pdChvcC5mZW5jZSk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJlcnJvciBmZW5jaW5nIHB1c2hidWY6ICVkXG4iLCByZXQpOworCQlXSU5EX1JJTkcoY2hhbik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChub3V2ZWF1X2dlbV9wdXNoYnVmX3N5bmMoY2hhbikpIHsKKwkJcmV0ID0gbm91dmVhdV9mZW5jZV93YWl0KG9wLmZlbmNlLCBOVUxMLCBmYWxzZSwgZmFsc2UpOworCQlpZiAocmV0KSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgcmVxLT5ucl9kd29yZHM7IGkrKykKKwkJCQlOVl9FUlJPUihkZXYsICIweCUwOHhcbiIsIHB1c2hidWZbaV0pOworCQkJTlZfRVJST1IoZGV2LCAiXl4gYWJvdmUgcHVzaCBidWZmZXIgaXMgZmFpbCA6KFxuIik7CisJCX0KKwl9CisKK291dDoKKwl2YWxpZGF0ZV9maW5pKCZvcCwgcmV0ID09IDApOworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCWtmcmVlKHB1c2hidWYpOworCWtmcmVlKGJvKTsKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFBVU0hCVUZfQ0FMIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzIwKQorCitpbnQKK25vdXZlYXVfZ2VtX2lvY3RsX3B1c2hidWZfY2FsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJICAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2NhbGwgKnJlcSA9IGRhdGE7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvICpibyA9IE5VTEw7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbjsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbTsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqcGJibzsKKwlzdHJ1Y3QgdmFsaWRhdGVfb3Agb3A7CisJaW50IGksIHJldCA9IDAsIGRvX3JlbG9jID0gMDsKKworCU5PVVZFQVVfQ0hFQ0tfSU5JVElBTElTRURfV0lUSF9SRVRVUk47CisJTk9VVkVBVV9HRVRfVVNFUl9DSEFOTkVMX1dJVEhfUkVUVVJOKHJlcS0+Y2hhbm5lbCwgZmlsZV9wcml2LCBjaGFuKTsKKworCWlmICh1bmxpa2VseShyZXEtPmhhbmRsZSA9PSAwKSkKKwkJZ290byBvdXRfbmV4dDsKKworCWlmIChyZXEtPm5yX2J1ZmZlcnMgPiBOT1VWRUFVX0dFTV9NQVhfQlVGRkVSUyB8fAorCSAgICByZXEtPm5yX3JlbG9jcyA+IE5PVVZFQVVfR0VNX01BWF9SRUxPQ1MpIHsKKwkJTlZfRVJST1IoZGV2LCAiUHVzaGJ1ZiBjb25maWcgZXhjZWVkcyBsaW1pdHM6XG4iKTsKKwkJTlZfRVJST1IoZGV2LCAiICBidWZmZXJzOiAlZCBtYXggJWRcbiIsIHJlcS0+bnJfYnVmZmVycywKKwkJCSBOT1VWRUFVX0dFTV9NQVhfQlVGRkVSUyk7CisJCU5WX0VSUk9SKGRldiwgIiAgcmVsb2NzIDogJWQgbWF4ICVkXG4iLCByZXEtPm5yX3JlbG9jcywKKwkJCSBOT1VWRUFVX0dFTV9NQVhfUkVMT0NTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYm8gPSB1X21lbWNweWEocmVxLT5idWZmZXJzLCByZXEtPm5yX2J1ZmZlcnMsIHNpemVvZigqYm8pKTsKKwlpZiAoSVNfRVJSKGJvKSkKKwkJcmV0dXJuIFBUUl9FUlIoYm8pOworCisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJLyogVmFsaWRhdGUgYnVmZmVyIGxpc3QgKi8KKwlyZXQgPSBub3V2ZWF1X2dlbV9wdXNoYnVmX3ZhbGlkYXRlKGNoYW4sIGZpbGVfcHJpdiwgYm8sIHJlcS0+YnVmZmVycywKKwkJCQkJICAgcmVxLT5ucl9idWZmZXJzLCAmb3AsICZkb19yZWxvYyk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJ2YWxpZGF0ZTogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFZhbGlkYXRlIERNQSBwdXNoIGJ1ZmZlciAqLworCWdlbSA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgcmVxLT5oYW5kbGUpOworCWlmICghZ2VtKSB7CisJCU5WX0VSUk9SKGRldiwgIlVua25vd24gcGIgaGFuZGxlIDB4JTA4eFxuIiwgcmVxLT5oYW5kbGUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJcGJibyA9IG5vdXZlYXVfZ2VtX29iamVjdChnZW0pOworCisJcmV0ID0gdHRtX2JvX3Jlc2VydmUoJnBiYm8tPmJvLCBmYWxzZSwgZmFsc2UsIHRydWUsCisJCQkgICAgIGNoYW4tPmZlbmNlLnNlcXVlbmNlKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgInJlc3YgcGI6ICVkXG4iLCByZXQpOworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShnZW0pOworCQlnb3RvIG91dDsKKwl9CisKKwlub3V2ZWF1X2JvX3BsYWNlbWVudF9zZXQocGJibywgMSA8PCBjaGFuLT5wdXNoYnVmX2JvLT5iby5tZW0ubWVtX3R5cGUpOworCXJldCA9IHR0bV9ib192YWxpZGF0ZSgmcGJiby0+Ym8sICZwYmJvLT5wbGFjZW1lbnQsIGZhbHNlLCBmYWxzZSk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJ2YWxpZGF0ZSBwYjogJWRcbiIsIHJldCk7CisJCXR0bV9ib191bnJlc2VydmUoJnBiYm8tPmJvKTsKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoZ2VtKTsKKwkJZ290byBvdXQ7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmcGJiby0+ZW50cnksICZvcC5ib3RoX2xpc3QpOworCisJLyogSWYgcHJlc3VtZWQgcmV0dXJuIGFkZHJlc3MgZG9lc24ndCBtYXRjaCwgd2UgbmVlZCB0byBtYXAgdGhlCisJICogcHVzaCBidWZmZXIgYW5kIGZpeCBpdC4uCisJICovCisJaWYgKCFQVVNIQlVGX0NBTCkgeworCQl1aW50MzJfdCByZXRhZGR5OworCisJCWlmIChjaGFuLT5kbWEuZnJlZSA8IDQgKyBOT1VWRUFVX0RNQV9TS0lQUykgeworCQkJcmV0ID0gbm91dmVhdV9kbWFfd2FpdChjaGFuLCA0ICsgTk9VVkVBVV9ETUFfU0tJUFMpOworCQkJaWYgKHJldCkgeworCQkJCU5WX0VSUk9SKGRldiwgImptcF9zcGFjZTogJWRcbiIsIHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQlyZXRhZGR5ICA9IGNoYW4tPnB1c2hidWZfYmFzZSArICgoY2hhbi0+ZG1hLmN1ciArIDIpIDw8IDIpOworCQlyZXRhZGR5IHw9IDB4MjAwMDAwMDA7CisJCWlmIChyZXRhZGR5ICE9IHJlcS0+c3VmZml4MCkgeworCQkJcmVxLT5zdWZmaXgwID0gcmV0YWRkeTsKKwkJCWRvX3JlbG9jID0gMTsKKwkJfQorCX0KKworCS8qIEFwcGx5IGFueSByZWxvY2F0aW9ucyB0aGF0IGFyZSByZXF1aXJlZCAqLworCWlmIChkb19yZWxvYykgeworCQl2b2lkICpwYnZpcnQ7CisJCWJvb2wgaXNfaW9tZW07CisJCXJldCA9IHR0bV9ib19rbWFwKCZwYmJvLT5ibywgMCwgcGJiby0+Ym8ubWVtLm51bV9wYWdlcywKKwkJCQkgICZwYmJvLT5rbWFwKTsKKwkJaWYgKHJldCkgeworCQkJTlZfRVJST1IoZGV2LCAia21hcCBwYjogJWRcbiIsIHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXBidmlydCA9IHR0bV9rbWFwX29ial92aXJ0dWFsKCZwYmJvLT5rbWFwLCAmaXNfaW9tZW0pOworCQlyZXQgPSBub3V2ZWF1X2dlbV9wdXNoYnVmX3JlbG9jX2FwcGx5KGNoYW4sIHJlcS0+bnJfYnVmZmVycywgYm8sCisJCQkJCQkgICAgICByZXEtPm5yX3JlbG9jcywKKwkJCQkJCSAgICAgIHJlcS0+cmVsb2NzLAorCQkJCQkJICAgICAgcmVxLT5ucl9kd29yZHMsCisJCQkJCQkgICAgICByZXEtPm9mZnNldCAvIDQsCisJCQkJCQkgICAgICBwYnZpcnQsIGlzX2lvbWVtKTsKKworCQlpZiAoIVBVU0hCVUZfQ0FMKSB7CisJCQlub3V2ZWF1X2JvX3dyMzIocGJibywKKwkJCQkJcmVxLT5vZmZzZXQgLyA0ICsgcmVxLT5ucl9kd29yZHMgLSAyLAorCQkJCQlyZXEtPnN1ZmZpeDApOworCQl9CisKKwkJdHRtX2JvX2t1bm1hcCgmcGJiby0+a21hcCk7CisJCWlmIChyZXQpIHsKKwkJCU5WX0VSUk9SKGRldiwgInJlbG9jIGFwcGx5OiAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKFBVU0hCVUZfQ0FMKSB7CisJCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgMik7CisJCWlmIChyZXQpIHsKKwkJCU5WX0VSUk9SKGRldiwgImNhbF9zcGFjZTogJWRcbiIsIHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlPVVRfUklORyhjaGFuLCAoKHBiYm8tPmJvLm1lbS5tbV9ub2RlLT5zdGFydCA8PCBQQUdFX1NISUZUKSArCisJCQkJICByZXEtPm9mZnNldCkgfCAyKTsKKwkJT1VUX1JJTkcoY2hhbiwgMCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gUklOR19TUEFDRShjaGFuLCAyICsgTk9VVkVBVV9ETUFfU0tJUFMpOworCQlpZiAocmV0KSB7CisJCQlOVl9FUlJPUihkZXYsICJqbXBfc3BhY2U6ICVkXG4iLCByZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwkJT1VUX1JJTkcoY2hhbiwgKChwYmJvLT5iby5tZW0ubW1fbm9kZS0+c3RhcnQgPDwgUEFHRV9TSElGVCkgKworCQkJCSAgcmVxLT5vZmZzZXQpIHwgMHgyMDAwMDAwMCk7CisJCU9VVF9SSU5HKGNoYW4sIDApOworCisJCS8qIFNwYWNlIHRoZSBqdW1wcyBhcGFydCB3aXRoIE5PUHMuICovCisJCWZvciAoaSA9IDA7IGkgPCBOT1VWRUFVX0RNQV9TS0lQUzsgaSsrKQorCQkJT1VUX1JJTkcoY2hhbiwgMCk7CisJfQorCisJcmV0ID0gbm91dmVhdV9mZW5jZV9lbWl0KG9wLmZlbmNlKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgImVycm9yIGZlbmNpbmcgcHVzaGJ1ZjogJWRcbiIsIHJldCk7CisJCVdJTkRfUklORyhjaGFuKTsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJdmFsaWRhdGVfZmluaSgmb3AsIHJldCA9PSAwKTsKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlrZnJlZShibyk7CisKK291dF9uZXh0OgorCWlmIChQVVNIQlVGX0NBTCkgeworCQlyZXEtPnN1ZmZpeDAgPSAweDAwMDIwMDAwOworCQlyZXEtPnN1ZmZpeDEgPSAweDAwMDAwMDAwOworCX0gZWxzZSB7CisJCXJlcS0+c3VmZml4MCA9IDB4MjAwMDAwMDAgfAorCQkJICAgICAgKGNoYW4tPnB1c2hidWZfYmFzZSArICgoY2hhbi0+ZG1hLmN1ciArIDIpIDw8IDIpKTsKKwkJcmVxLT5zdWZmaXgxID0gMHgwMDAwMDAwMDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK25vdXZlYXVfZ2VtX2lvY3RsX3B1c2hidWZfY2FsbDIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9jYWxsICpyZXEgPSBkYXRhOworCisJcmVxLT52cmFtX2F2YWlsYWJsZSA9IGRldl9wcml2LT5mYl9hcGVyX2ZyZWU7CisJcmVxLT5nYXJ0X2F2YWlsYWJsZSA9IGRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9mcmVlOworCisJcmV0dXJuIG5vdXZlYXVfZ2VtX2lvY3RsX3B1c2hidWZfY2FsbChkZXYsIGRhdGEsIGZpbGVfcHJpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK2RvbWFpbl90b190dG0oc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8sIHVpbnQzMl90IGRvbWFpbikKK3sKKwl1aW50MzJfdCBmbGFncyA9IDA7CisKKwlpZiAoZG9tYWluICYgTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0pCisJCWZsYWdzIHw9IFRUTV9QTF9GTEFHX1ZSQU07CisJaWYgKGRvbWFpbiAmIE5PVVZFQVVfR0VNX0RPTUFJTl9HQVJUKQorCQlmbGFncyB8PSBUVE1fUExfRkxBR19UVDsKKworCXJldHVybiBmbGFnczsKK30KKworaW50Citub3V2ZWF1X2dlbV9pb2N0bF9waW4oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9waW4gKnJlcSA9IGRhdGE7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW07CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym87CisJaW50IHJldCA9IDA7CisKKwlOT1VWRUFVX0NIRUNLX0lOSVRJQUxJU0VEX1dJVEhfUkVUVVJOOworCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKKwkJTlZfRVJST1IoZGV2LCAicGluIG9ubHkgYWxsb3dlZCB3aXRob3V0IGtlcm5lbCBtb2Rlc2V0dGluZ1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghRFJNX1NVU0VSKERSTV9DVVJQUk9DKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWdlbSA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgcmVxLT5oYW5kbGUpOworCWlmICghZ2VtKQorCQlyZXR1cm4gLUVJTlZBTDsKKwludmJvID0gbm91dmVhdV9nZW1fb2JqZWN0KGdlbSk7CisKKwlyZXQgPSBub3V2ZWF1X2JvX3BpbihudmJvLCBkb21haW5fdG9fdHRtKG52Ym8sIHJlcS0+ZG9tYWluKSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXEtPm9mZnNldCA9IG52Ym8tPmJvLm9mZnNldDsKKwlpZiAobnZiby0+Ym8ubWVtLm1lbV90eXBlID09IFRUTV9QTF9UVCkKKwkJcmVxLT5kb21haW4gPSBOT1VWRUFVX0dFTV9ET01BSU5fR0FSVDsKKwllbHNlCisJCXJlcS0+ZG9tYWluID0gTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU07CisKK291dDoKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoZ2VtKTsKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludAorbm91dmVhdV9nZW1faW9jdGxfdW5waW4oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcGluICpyZXEgPSBkYXRhOworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtOworCWludCByZXQ7CisKKwlOT1VWRUFVX0NIRUNLX0lOSVRJQUxJU0VEX1dJVEhfUkVUVVJOOworCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJZ2VtID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCByZXEtPmhhbmRsZSk7CisJaWYgKCFnZW0pCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gbm91dmVhdV9ib191bnBpbihub3V2ZWF1X2dlbV9vYmplY3QoZ2VtKSk7CisKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoZ2VtKTsKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludAorbm91dmVhdV9nZW1faW9jdGxfY3B1X3ByZXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fY3B1X3ByZXAgKnJlcSA9IGRhdGE7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW07CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym87CisJYm9vbCBub193YWl0ID0gISEocmVxLT5mbGFncyAmIE5PVVZFQVVfR0VNX0NQVV9QUkVQX05PV0FJVCk7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlOT1VWRUFVX0NIRUNLX0lOSVRJQUxJU0VEX1dJVEhfUkVUVVJOOworCisJZ2VtID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCByZXEtPmhhbmRsZSk7CisJaWYgKCFnZW0pCisJCXJldHVybiByZXQ7CisJbnZibyA9IG5vdXZlYXVfZ2VtX29iamVjdChnZW0pOworCisJaWYgKG52Ym8tPmNwdV9maWxwKSB7CisJCWlmIChudmJvLT5jcHVfZmlscCA9PSBmaWxlX3ByaXYpCisJCQlnb3RvIG91dDsKKworCQlyZXQgPSB0dG1fYm9fd2FpdF9jcHUoJm52Ym8tPmJvLCBub193YWl0KTsKKwkJaWYgKHJldCA9PSAtRVJFU1RBUlQpCisJCQlyZXQgPSAtRUFHQUlOOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKHJlcS0+ZmxhZ3MgJiBOT1VWRUFVX0dFTV9DUFVfUFJFUF9OT0JMT0NLKSB7CisJCXJldCA9IHR0bV9ib193YWl0KCZudmJvLT5ibywgZmFsc2UsIGZhbHNlLCBub193YWl0KTsKKwl9IGVsc2UgeworCQlyZXQgPSB0dG1fYm9fc3luY2NwdV93cml0ZV9ncmFiKCZudmJvLT5ibywgbm9fd2FpdCk7CisJCWlmIChyZXQgPT0gLUVSRVNUQVJUKQorCQkJcmV0ID0gLUVBR0FJTjsKKwkJZWxzZQorCQlpZiAocmV0ID09IDApCisJCQludmJvLT5jcHVfZmlscCA9IGZpbGVfcHJpdjsKKwl9CisKK291dDoKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoZ2VtKTsKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK25vdXZlYXVfZ2VtX2lvY3RsX2NwdV9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX2NwdV9wcmVwICpyZXEgPSBkYXRhOworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtOworCXN0cnVjdCBub3V2ZWF1X2JvICpudmJvOworCWludCByZXQgPSAtRUlOVkFMOworCisJTk9VVkVBVV9DSEVDS19JTklUSUFMSVNFRF9XSVRIX1JFVFVSTjsKKworCWdlbSA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgcmVxLT5oYW5kbGUpOworCWlmICghZ2VtKQorCQlyZXR1cm4gcmV0OworCW52Ym8gPSBub3V2ZWF1X2dlbV9vYmplY3QoZ2VtKTsKKworCWlmIChudmJvLT5jcHVfZmlscCAhPSBmaWxlX3ByaXYpCisJCWdvdG8gb3V0OworCW52Ym8tPmNwdV9maWxwID0gTlVMTDsKKworCXR0bV9ib19zeW5jY3B1X3dyaXRlX3JlbGVhc2UoJm52Ym8tPmJvKTsKKwlyZXQgPSAwOworCitvdXQ6CisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGdlbSk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworaW50Citub3V2ZWF1X2dlbV9pb2N0bF9pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX2luZm8gKnJlcSA9IGRhdGE7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW07CisJaW50IHJldDsKKworCU5PVVZFQVVfQ0hFQ0tfSU5JVElBTElTRURfV0lUSF9SRVRVUk47CisKKwlnZW0gPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsIHJlcS0+aGFuZGxlKTsKKwlpZiAoIWdlbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBub3V2ZWF1X2dlbV9pbmZvKGdlbSwgcmVxKTsKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoZ2VtKTsKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2h3LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2h3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0Njc5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaHcuYwpAQCAtMCwwICsxLDEwODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNiBEYXZlIEFpcmxpZQorICogQ29weXJpZ2h0IDIwMDcgTWFhcnRlbiBNYWF0aHVpcworICogQ29weXJpZ2h0IDIwMDctMjAwOSBTdHVhcnQgQmVubmV0dAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfaHcuaCIKKworI2RlZmluZSBDSElQU0VUX05GT1JDRSAweDAxYTAKKyNkZWZpbmUgQ0hJUFNFVF9ORk9SQ0UyIDB4MDFmMAorCisvKgorICogbWlzYyBodyBhY2Nlc3Mgd3JhcHBlcnMvY29udHJvbCBmdW5jdGlvbnMKKyAqLworCit2b2lkCitOVldyaXRlVmdhU2VxKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkLCB1aW50OF90IGluZGV4LCB1aW50OF90IHZhbHVlKQoreworCU5WV3JpdGVQUk1WSU8oZGV2LCBoZWFkLCBOVl9QUk1WSU9fU1JYLCBpbmRleCk7CisJTlZXcml0ZVBSTVZJTyhkZXYsIGhlYWQsIE5WX1BSTVZJT19TUiwgdmFsdWUpOworfQorCit1aW50OF90CitOVlJlYWRWZ2FTZXEoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQsIHVpbnQ4X3QgaW5kZXgpCit7CisJTlZXcml0ZVBSTVZJTyhkZXYsIGhlYWQsIE5WX1BSTVZJT19TUlgsIGluZGV4KTsKKwlyZXR1cm4gTlZSZWFkUFJNVklPKGRldiwgaGVhZCwgTlZfUFJNVklPX1NSKTsKK30KKwordm9pZAorTlZXcml0ZVZnYUdyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkLCB1aW50OF90IGluZGV4LCB1aW50OF90IHZhbHVlKQoreworCU5WV3JpdGVQUk1WSU8oZGV2LCBoZWFkLCBOVl9QUk1WSU9fR1JYLCBpbmRleCk7CisJTlZXcml0ZVBSTVZJTyhkZXYsIGhlYWQsIE5WX1BSTVZJT19HWCwgdmFsdWUpOworfQorCit1aW50OF90CitOVlJlYWRWZ2FHcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCwgdWludDhfdCBpbmRleCkKK3sKKwlOVldyaXRlUFJNVklPKGRldiwgaGVhZCwgTlZfUFJNVklPX0dSWCwgaW5kZXgpOworCXJldHVybiBOVlJlYWRQUk1WSU8oZGV2LCBoZWFkLCBOVl9QUk1WSU9fR1gpOworfQorCisvKiBDUjQ0IHRha2VzIHZhbHVlcyAwIChoZWFkIEEpLCAzIChoZWFkIEIpIGFuZCA0IChoZWFkcyB0aWVkKQorICogaXQgYWZmZWN0cyBvbmx5IHRoZSA4IGJpdCB2Z2EgaW8gcmVncywgd2hpY2ggd2UgYWNjZXNzIHVzaW5nIG1taW8gYXQKKyAqIDB4Y3swLDJ9M2MqLCAweDYwezEsM30zKiwgYW5kIDB4Njh7MSwzfTNkKgorICogaW4gZ2VuZXJhbCwgdGhlIHNldCB2YWx1ZSBvZiBjcjQ0IGRvZXMgbm90IG1hdHRlcjogcmVnIGFjY2VzcyB3b3JrcyBhcworICogZXhwZWN0ZWQgYW5kIHZhbHVlcyBjYW4gYmUgc2V0IGZvciB0aGUgYXBwcm9wcmlhdGUgaGVhZCBieSB1c2luZyBhIDB4MjAwMAorICogb2Zmc2V0IGFzIHJlcXVpcmVkCisgKiBob3dldmVyOgorICogYSkgcHJlIG52NDAsIHRoZSBoZWFkIEIgcmFuZ2Ugb2YgUFJNVklPIHJlZ3MgYXQgMHhjMjNjKiB3YXMgbm90IGV4cG9zZWQgYW5kCisgKiAgICBjcjQ0IG11c3QgYmUgc2V0IHRvIDAgb3IgMyBmb3IgYWNjZXNzaW5nIHZhbHVlcyBvbiB0aGUgY29ycmVjdCBoZWFkCisgKiAgICB0aHJvdWdoIHRoZSBjb21tb24gMHhjMDNjKiBhZGRyZXNzZXMKKyAqIGIpIGluIHRpZWQgbW9kZSAoNCkgaGVhZCBCIGlzIHByb2dyYW1tZWQgdG8gdGhlIHZhbHVlcyBzZXQgb24gaGVhZCBBLCBhbmQKKyAqICAgIGFjY2VzcyB1c2luZyB0aGUgaGVhZCBCIGFkZHJlc3NlcyBjYW4gaGF2ZSBzdHJhbmdlIHJlc3VsdHMsIGVyZ28gd2UgbGVhdmUKKyAqICAgIHRpZWQgbW9kZSBpbiBpbml0IG9uY2Ugd2Uga25vdyB0byB3aGF0IGNyNDQgc2hvdWxkIGJlIHJlc3RvcmVkIG9uIGV4aXQKKyAqCisgKiB0aGUgb3duZXIgcGFyYW1ldGVyIGlzIHNsaWdodGx5IGFidXNlZDoKKyAqIDAgYW5kIDEgYXJlIHRyZWF0ZWQgYXMgaGVhZCB2YWx1ZXMgYW5kIHNvIHRoZSBzZXQgdmFsdWUgaXMgKG93bmVyICogMykKKyAqIG90aGVyIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBsaXRlcmFsIHZhbHVlcyB0byBzZXQKKyAqLwordm9pZAorTlZTZXRPd25lcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgb3duZXIpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChvd25lciA9PSAxKQorCQlvd25lciAqPSAzOworCisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4MTEpIHsKKwkJLyogVGhpcyBtaWdodCBzZWVtIHN0dXBpZCwgYnV0IHRoZSBibG9iIGRvZXMgaXQgYW5kCisJCSAqIG9taXR0aW5nIGl0IG9mdGVuIGxvY2tzIHRoZSBzeXN0ZW0gdXAuCisJCSAqLworCQlOVlJlYWRWZ2FDcnRjKGRldiwgMCwgTlZfQ0lPX1NSX0xPQ0tfSU5ERVgpOworCQlOVlJlYWRWZ2FDcnRjKGRldiwgMSwgTlZfQ0lPX1NSX0xPQ0tfSU5ERVgpOworCX0KKworCS8qIENSNDQgaXMgYWx3YXlzIGNoYW5nZWQgb24gQ1JUQzAgKi8KKwlOVldyaXRlVmdhQ3J0YyhkZXYsIDAsIE5WX0NJT19DUkVfNDQsIG93bmVyKTsKKworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDExKSB7CS8qIHNldCBtZSBoYXJkZXIgKi8KKwkJTlZXcml0ZVZnYUNydGMoZGV2LCAwLCBOVl9DSU9fQ1JFXzJFLCBvd25lcik7CisJCU5WV3JpdGVWZ2FDcnRjKGRldiwgMCwgTlZfQ0lPX0NSRV8yRSwgb3duZXIpOworCX0KK30KKwordm9pZAorTlZCbGFua1NjcmVlbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCwgYm9vbCBibGFuaykKK3sKKwl1bnNpZ25lZCBjaGFyIHNlcTE7CisKKwlpZiAobnZfdHdvX2hlYWRzKGRldikpCisJCU5WU2V0T3duZXIoZGV2LCBoZWFkKTsKKworCXNlcTEgPSBOVlJlYWRWZ2FTZXEoZGV2LCBoZWFkLCBOVl9WSU9fU1JfQ0xPQ0tfSU5ERVgpOworCisJTlZWZ2FTZXFSZXNldChkZXYsIGhlYWQsIHRydWUpOworCWlmIChibGFuaykKKwkJTlZXcml0ZVZnYVNlcShkZXYsIGhlYWQsIE5WX1ZJT19TUl9DTE9DS19JTkRFWCwgc2VxMSB8IDB4MjApOworCWVsc2UKKwkJTlZXcml0ZVZnYVNlcShkZXYsIGhlYWQsIE5WX1ZJT19TUl9DTE9DS19JTkRFWCwgc2VxMSAmIH4weDIwKTsKKwlOVlZnYVNlcVJlc2V0KGRldiwgaGVhZCwgZmFsc2UpOworfQorCisvKgorICogUExMIHNldHRpbmcKKyAqLworCitzdGF0aWMgaW50Citwb3dlcmN0cmxfMV9zaGlmdChpbnQgY2hpcF92ZXJzaW9uLCBpbnQgcmVnKQoreworCWludCBzaGlmdCA9IC00OworCisJaWYgKGNoaXBfdmVyc2lvbiA8IDB4MTcgfHwgY2hpcF92ZXJzaW9uID09IDB4MWEgfHwgY2hpcF92ZXJzaW9uID09IDB4MjApCisJCXJldHVybiBzaGlmdDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBOVl9SQU1EQUNfVlBMTDI6CisJCXNoaWZ0ICs9IDQ7CisJY2FzZSBOVl9QUkFNREFDX1ZQTExfQ09FRkY6CisJCXNoaWZ0ICs9IDQ7CisJY2FzZSBOVl9QUkFNREFDX01QTExfQ09FRkY6CisJCXNoaWZ0ICs9IDQ7CisJY2FzZSBOVl9QUkFNREFDX05WUExMX0NPRUZGOgorCQlzaGlmdCArPSA0OworCX0KKworCS8qCisJICogdGhlIHNoaWZ0IGZvciB2cGxsIHJlZ3MgaXMgb25seSB1c2VkIGZvciBudjN4IGNoaXBzIHdpdGggYSBzaW5nbGUKKwkgKiBzdGFnZSBwbGwKKwkgKi8KKwlpZiAoc2hpZnQgPiA0ICYmIChjaGlwX3ZlcnNpb24gPCAweDMyIHx8IGNoaXBfdmVyc2lvbiA9PSAweDM1IHx8CisJCQkgIGNoaXBfdmVyc2lvbiA9PSAweDM2IHx8IGNoaXBfdmVyc2lvbiA+PSAweDQwKSkKKwkJc2hpZnQgPSAtNDsKKworCXJldHVybiBzaGlmdDsKK30KKworc3RhdGljIHZvaWQKK3NldFBMTF9zaW5nbGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgcmVnLCBzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyAqcHYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgY2hpcF92ZXJzaW9uID0gZGV2X3ByaXYtPnZiaW9zLT5jaGlwX3ZlcnNpb247CisJdWludDMyX3Qgb2xkcGxsID0gTlZSZWFkUkFNREFDKGRldiwgMCwgcmVnKTsKKwlpbnQgb2xkTiA9IChvbGRwbGwgPj4gOCkgJiAweGZmLCBvbGRNID0gb2xkcGxsICYgMHhmZjsKKwl1aW50MzJfdCBwbGwgPSAob2xkcGxsICYgMHhmZmY4MDAwMCkgfCBwdi0+bG9nMlAgPDwgMTYgfCBwdi0+Tk0xOworCXVpbnQzMl90IHNhdmVkX3Bvd2VyY3RybF8xID0gMDsKKwlpbnQgc2hpZnRfcG93ZXJjdHJsXzEgPSBwb3dlcmN0cmxfMV9zaGlmdChjaGlwX3ZlcnNpb24sIHJlZyk7CisKKwlpZiAob2xkcGxsID09IHBsbCkKKwkJcmV0dXJuOwkvKiBhbHJlYWR5IHNldCAqLworCisJaWYgKHNoaWZ0X3Bvd2VyY3RybF8xID49IDApIHsKKwkJc2F2ZWRfcG93ZXJjdHJsXzEgPSBudlJlYWRNQyhkZXYsIE5WX1BCVVNfUE9XRVJDVFJMXzEpOworCQludldyaXRlTUMoZGV2LCBOVl9QQlVTX1BPV0VSQ1RSTF8xLAorCQkJKHNhdmVkX3Bvd2VyY3RybF8xICYgfigweGYgPDwgc2hpZnRfcG93ZXJjdHJsXzEpKSB8CisJCQkxIDw8IHNoaWZ0X3Bvd2VyY3RybF8xKTsKKwl9CisKKwlpZiAob2xkTSAmJiBwdi0+TTEgJiYgKG9sZE4gLyBvbGRNIDwgcHYtPk4xIC8gcHYtPk0xKSkKKwkJLyogdXBjbG9jayAtLSB3cml0ZSBuZXcgcG9zdCBkaXZpZGVyIGZpcnN0ICovCisJCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCByZWcsIHB2LT5sb2cyUCA8PCAxNiB8IChvbGRwbGwgJiAweGZmZmYpKTsKKwllbHNlCisJCS8qIGRvd25jbG9jayAtLSB3cml0ZSBuZXcgTk0gZmlyc3QgKi8KKwkJTlZXcml0ZVJBTURBQyhkZXYsIDAsIHJlZywgKG9sZHBsbCAmIDB4ZmZmZjAwMDApIHwgcHYtPk5NMSk7CisKKwlpZiAoY2hpcF92ZXJzaW9uIDwgMHgxNyAmJiBjaGlwX3ZlcnNpb24gIT0gMHgxMSkKKwkJLyogd2FpdCBhIGJpdCBvbiBvbGRlciBjaGlwcyAqLworCQltc2xlZXAoNjQpOworCU5WUmVhZFJBTURBQyhkZXYsIDAsIHJlZyk7CisKKwkvKiB0aGVuIHdyaXRlIHRoZSBvdGhlciBoYWxmIGFzIHdlbGwgKi8KKwlOVldyaXRlUkFNREFDKGRldiwgMCwgcmVnLCBwbGwpOworCisJaWYgKHNoaWZ0X3Bvd2VyY3RybF8xID49IDApCisJCW52V3JpdGVNQyhkZXYsIE5WX1BCVVNfUE9XRVJDVFJMXzEsIHNhdmVkX3Bvd2VyY3RybF8xKTsKK30KKworc3RhdGljIHVpbnQzMl90CituZXdfcmFtZGFjNTgwKHVpbnQzMl90IHJlZzEsIGJvb2wgc3MsIHVpbnQzMl90IHJhbWRhYzU4MCkKK3sKKwlib29sIGhlYWRfYSA9IChyZWcxID09IE5WX1BSQU1EQUNfVlBMTF9DT0VGRik7CisKKwlpZiAoc3MpCS8qIHNpbmdsZSBzdGFnZSBwbGwgbW9kZSAqLworCQlyYW1kYWM1ODAgfD0gaGVhZF9hID8gTlZfUkFNREFDXzU4MF9WUExMMV9BQ1RJVkUgOgorCQkJCSAgICAgIE5WX1JBTURBQ181ODBfVlBMTDJfQUNUSVZFOworCWVsc2UKKwkJcmFtZGFjNTgwICY9IGhlYWRfYSA/IH5OVl9SQU1EQUNfNTgwX1ZQTEwxX0FDVElWRSA6CisJCQkJICAgICAgfk5WX1JBTURBQ181ODBfVlBMTDJfQUNUSVZFOworCisJcmV0dXJuIHJhbWRhYzU4MDsKK30KKworc3RhdGljIHZvaWQKK3NldFBMTF9kb3VibGVfaGlnaHJlZ3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgcmVnMSwKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X3BsbF92YWxzICpwdikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBjaGlwX3ZlcnNpb24gPSBkZXZfcHJpdi0+dmJpb3MtPmNoaXBfdmVyc2lvbjsKKwlib29sIG52MzAzNSA9IGNoaXBfdmVyc2lvbiA9PSAweDMwIHx8IGNoaXBfdmVyc2lvbiA9PSAweDM1OworCXVpbnQzMl90IHJlZzIgPSByZWcxICsgKChyZWcxID09IE5WX1JBTURBQ19WUExMMikgPyAweDVjIDogMHg3MCk7CisJdWludDMyX3Qgb2xkcGxsMSA9IE5WUmVhZFJBTURBQyhkZXYsIDAsIHJlZzEpOworCXVpbnQzMl90IG9sZHBsbDIgPSAhbnYzMDM1ID8gTlZSZWFkUkFNREFDKGRldiwgMCwgcmVnMikgOiAwOworCXVpbnQzMl90IHBsbDEgPSAob2xkcGxsMSAmIDB4ZmZmODAwMDApIHwgcHYtPmxvZzJQIDw8IDE2IHwgcHYtPk5NMTsKKwl1aW50MzJfdCBwbGwyID0gKG9sZHBsbDIgJiAweDdmZmYwMDAwKSB8IDEgPDwgMzEgfCBwdi0+Tk0yOworCXVpbnQzMl90IG9sZHJhbWRhYzU4MCA9IDAsIHJhbWRhYzU4MCA9IDA7CisJYm9vbCBzaW5nbGVfc3RhZ2UgPSAhcHYtPk5NMiB8fCBwdi0+TjIgPT0gcHYtPk0yOwkvKiBudjQxKyBvbmx5ICovCisJdWludDMyX3Qgc2F2ZWRfcG93ZXJjdHJsXzEgPSAwLCBzYXZlZGMwNDAgPSAwOworCWludCBzaGlmdF9wb3dlcmN0cmxfMSA9IHBvd2VyY3RybF8xX3NoaWZ0KGNoaXBfdmVyc2lvbiwgcmVnMSk7CisKKwkvKiBtb2RlbCBzcGVjaWZpYyBhZGRpdGlvbnMgdG8gZ2VuZXJpYyBwbGwxIGFuZCBwbGwyIHNldCB1cCBhYm92ZSAqLworCWlmIChudjMwMzUpIHsKKwkJcGxsMSA9IChwbGwxICYgMHhmY2M3ZmZmZikgfCAocHYtPk4yICYgMHgxOCkgPDwgMjEgfAorCQkgICAgICAgKHB2LT5OMiAmIDB4NykgPDwgMTkgfCA4IDw8IDQgfCAocHYtPk0yICYgNykgPDwgNDsKKwkJcGxsMiA9IDA7CisJfQorCWlmIChjaGlwX3ZlcnNpb24gPiAweDQwICYmIHJlZzEgPj0gTlZfUFJBTURBQ19WUExMX0NPRUZGKSB7IC8qICFudjQwICovCisJCW9sZHJhbWRhYzU4MCA9IE5WUmVhZFJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfNTgwKTsKKwkJcmFtZGFjNTgwID0gbmV3X3JhbWRhYzU4MChyZWcxLCBzaW5nbGVfc3RhZ2UsIG9sZHJhbWRhYzU4MCk7CisJCWlmIChvbGRyYW1kYWM1ODAgIT0gcmFtZGFjNTgwKQorCQkJb2xkcGxsMSA9IH4wOwkvKiBmb3JjZSBtaXNtYXRjaCAqLworCQlpZiAoc2luZ2xlX3N0YWdlKQorCQkJLyogbWFnaWMgdmFsdWUgdXNlZCBieSBudmlkaWEgaW4gc2luZ2xlIHN0YWdlIG1vZGUgKi8KKwkJCXBsbDIgfD0gMHgwMTFmOworCX0KKwlpZiAoY2hpcF92ZXJzaW9uID4gMHg3MCkKKwkJLyogbWFnaWMgYml0cyBzZXQgYnkgdGhlIGJsb2IgKGJ1dCBub3QgdGhlIGJpb3MpIG9uIGc3MS03MyAqLworCQlwbGwxID0gKHBsbDEgJiAweDdmZmZmZmZmKSB8IChzaW5nbGVfc3RhZ2UgPyAweDQgOiAweGMpIDw8IDI4OworCisJaWYgKG9sZHBsbDEgPT0gcGxsMSAmJiBvbGRwbGwyID09IHBsbDIpCisJCXJldHVybjsJLyogYWxyZWFkeSBzZXQgKi8KKworCWlmIChzaGlmdF9wb3dlcmN0cmxfMSA+PSAwKSB7CisJCXNhdmVkX3Bvd2VyY3RybF8xID0gbnZSZWFkTUMoZGV2LCBOVl9QQlVTX1BPV0VSQ1RSTF8xKTsKKwkJbnZXcml0ZU1DKGRldiwgTlZfUEJVU19QT1dFUkNUUkxfMSwKKwkJCShzYXZlZF9wb3dlcmN0cmxfMSAmIH4oMHhmIDw8IHNoaWZ0X3Bvd2VyY3RybF8xKSkgfAorCQkJMSA8PCBzaGlmdF9wb3dlcmN0cmxfMSk7CisJfQorCisJaWYgKGNoaXBfdmVyc2lvbiA+PSAweDQwKSB7CisJCWludCBzaGlmdF9jMDQwID0gMTQ7CisKKwkJc3dpdGNoIChyZWcxKSB7CisJCWNhc2UgTlZfUFJBTURBQ19NUExMX0NPRUZGOgorCQkJc2hpZnRfYzA0MCArPSAyOworCQljYXNlIE5WX1BSQU1EQUNfTlZQTExfQ09FRkY6CisJCQlzaGlmdF9jMDQwICs9IDI7CisJCWNhc2UgTlZfUkFNREFDX1ZQTEwyOgorCQkJc2hpZnRfYzA0MCArPSAyOworCQljYXNlIE5WX1BSQU1EQUNfVlBMTF9DT0VGRjoKKwkJCXNoaWZ0X2MwNDAgKz0gMjsKKwkJfQorCisJCXNhdmVkYzA0MCA9IG52UmVhZE1DKGRldiwgMHhjMDQwKTsKKwkJaWYgKHNoaWZ0X2MwNDAgIT0gMTQpCisJCQludldyaXRlTUMoZGV2LCAweGMwNDAsIHNhdmVkYzA0MCAmIH4oMyA8PCBzaGlmdF9jMDQwKSk7CisJfQorCisJaWYgKG9sZHJhbWRhYzU4MCAhPSByYW1kYWM1ODApCisJCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDXzU4MCwgcmFtZGFjNTgwKTsKKworCWlmICghbnYzMDM1KQorCQlOVldyaXRlUkFNREFDKGRldiwgMCwgcmVnMiwgcGxsMik7CisJTlZXcml0ZVJBTURBQyhkZXYsIDAsIHJlZzEsIHBsbDEpOworCisJaWYgKHNoaWZ0X3Bvd2VyY3RybF8xID49IDApCisJCW52V3JpdGVNQyhkZXYsIE5WX1BCVVNfUE9XRVJDVFJMXzEsIHNhdmVkX3Bvd2VyY3RybF8xKTsKKwlpZiAoY2hpcF92ZXJzaW9uID49IDB4NDApCisJCW52V3JpdGVNQyhkZXYsIDB4YzA0MCwgc2F2ZWRjMDQwKTsKK30KKworc3RhdGljIHZvaWQKK3NldFBMTF9kb3VibGVfbG93cmVncyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBOTU5NcmVnLAorCQkgICAgICBzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyAqcHYpCit7CisJLyogV2hlbiBzZXR0aW5nIFBMTHMsIHRoZXJlIGlzIGEgbWVycnkgZ2FtZSBvZiBkaXNhYmxpbmcgYW5kIGVuYWJsaW5nCisJICogdmFyaW91cyBiaXRzIG9mIGhhcmR3YXJlIGR1cmluZyB0aGUgcHJvY2Vzcy4gVGhpcyBmdW5jdGlvbiBpcyBhCisJICogc3ludGhlc2lzIG9mIHNpeCBudjR4IHRyYWNlcywgbmVhcmx5IGVhY2ggY2FyZCBkb2luZyBhIHN1YnRseQorCSAqIGRpZmZlcmVudCB0aGluZy4gV2l0aCBsdWNrIGFsbCB0aGUgbmVjZXNzYXJ5IGJpdHMgZm9yIGVhY2ggY2FyZCBhcmUKKwkgKiBjb21iaW5lZCBoZXJlaW4uIFdpdGhvdXQgbHVjayBpdCBkZXZpYXRlcyBmcm9tIGVhY2ggY2FyZCdzIGZvcm11bGEKKwkgKiBzbyBhcyB0byBub3Qgd29yayBvbiBhbnkgOikKKwkgKi8KKworCXVpbnQzMl90IFByZWcgPSBOTU5NcmVnIC0gNDsKKwlib29sIG1wbGwgPSBQcmVnID09IDB4NDAyMDsKKwl1aW50MzJfdCBvbGRQdmFsID0gbnZSZWFkTUMoZGV2LCBQcmVnKTsKKwl1aW50MzJfdCBOTU5NID0gcHYtPk5NMiA8PCAxNiB8IHB2LT5OTTE7CisJdWludDMyX3QgUHZhbCA9IChvbGRQdmFsICYgKG1wbGwgPyB+KDB4MTEgPDwgMTYpIDogfigxIDw8IDE2KSkpIHwKKwkJCTB4YyA8PCAyOCB8IHB2LT5sb2cyUCA8PCAxNjsKKwl1aW50MzJfdCBzYXZlZDQ2MDAgPSAwOworCS8qIHNvbWUgY2FyZHMgaGF2ZSBkaWZmZXJlbnQgbWFza2MwNDBzICovCisJdWludDMyX3QgbWFza2MwNDAgPSB+KDMgPDwgMTQpLCBzYXZlZGMwNDA7CisJYm9vbCBzaW5nbGVfc3RhZ2UgPSAhcHYtPk5NMiB8fCBwdi0+TjIgPT0gcHYtPk0yOworCisJaWYgKG52UmVhZE1DKGRldiwgTk1OTXJlZykgPT0gTk1OTSAmJiAob2xkUHZhbCAmIDB4YzAwNzAwMDApID09IFB2YWwpCisJCXJldHVybjsKKworCWlmIChQcmVnID09IDB4NDAwMCkKKwkJbWFza2MwNDAgPSB+MHgzMzM7CisJaWYgKFByZWcgPT0gMHg0MDU4KQorCQltYXNrYzA0MCA9IH4oMHhjIDw8IDI0KTsKKworCWlmIChtcGxsKSB7CisJCXN0cnVjdCBwbGxfbGltcyBwbGxfbGltOworCQl1aW50OF90IFB2YWwyOworCisJCWlmIChnZXRfcGxsX2xpbWl0cyhkZXYsIFByZWcsICZwbGxfbGltKSkKKwkJCXJldHVybjsKKworCQlQdmFsMiA9IHB2LT5sb2cyUCArIHBsbF9saW0ubG9nMnBfYmlhczsKKwkJaWYgKFB2YWwyID4gcGxsX2xpbS5tYXhfbG9nMnApCisJCQlQdmFsMiA9IHBsbF9saW0ubWF4X2xvZzJwOworCQlQdmFsIHw9IDEgPDwgMjggfCBQdmFsMiA8PCAyMDsKKworCQlzYXZlZDQ2MDAgPSBudlJlYWRNQyhkZXYsIDB4NDYwMCk7CisJCW52V3JpdGVNQyhkZXYsIDB4NDYwMCwgc2F2ZWQ0NjAwIHwgOCA8PCAyOCk7CisJfQorCWlmIChzaW5nbGVfc3RhZ2UpCisJCVB2YWwgfD0gbXBsbCA/IDEgPDwgMTIgOiAxIDw8IDg7CisKKwludldyaXRlTUMoZGV2LCBQcmVnLCBvbGRQdmFsIHwgMSA8PCAyOCk7CisJbnZXcml0ZU1DKGRldiwgUHJlZywgUHZhbCAmIH4oNCA8PCAyOCkpOworCWlmIChtcGxsKSB7CisJCVB2YWwgfD0gOCA8PCAyMDsKKwkJbnZXcml0ZU1DKGRldiwgMHg0MDIwLCBQdmFsICYgfigweGMgPDwgMjgpKTsKKwkJbnZXcml0ZU1DKGRldiwgMHg0MDM4LCBQdmFsICYgfigweGMgPDwgMjgpKTsKKwl9CisKKwlzYXZlZGMwNDAgPSBudlJlYWRNQyhkZXYsIDB4YzA0MCk7CisJbnZXcml0ZU1DKGRldiwgMHhjMDQwLCBzYXZlZGMwNDAgJiBtYXNrYzA0MCk7CisKKwludldyaXRlTUMoZGV2LCBOTU5NcmVnLCBOTU5NKTsKKwlpZiAoTk1OTXJlZyA9PSAweDQwMjQpCisJCW52V3JpdGVNQyhkZXYsIDB4NDAzYywgTk1OTSk7CisKKwludldyaXRlTUMoZGV2LCBQcmVnLCBQdmFsKTsKKwlpZiAobXBsbCkgeworCQlQdmFsICY9IH4oOCA8PCAyMCk7CisJCW52V3JpdGVNQyhkZXYsIDB4NDAyMCwgUHZhbCk7CisJCW52V3JpdGVNQyhkZXYsIDB4NDAzOCwgUHZhbCk7CisJCW52V3JpdGVNQyhkZXYsIDB4NDYwMCwgc2F2ZWQ0NjAwKTsKKwl9CisKKwludldyaXRlTUMoZGV2LCAweGMwNDAsIHNhdmVkYzA0MCk7CisKKwlpZiAobXBsbCkgeworCQludldyaXRlTUMoZGV2LCAweDQwMjAsIFB2YWwgJiB+KDEgPDwgMjgpKTsKKwkJbnZXcml0ZU1DKGRldiwgMHg0MDM4LCBQdmFsICYgfigxIDw8IDI4KSk7CisJfQorfQorCit2b2lkCitub3V2ZWF1X2h3X3NldHBsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCByZWcxLAorCQkgIHN0cnVjdCBub3V2ZWF1X3BsbF92YWxzICpwdikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBjdiA9IGRldl9wcml2LT52Ymlvcy0+Y2hpcF92ZXJzaW9uOworCisJaWYgKGN2ID09IDB4MzAgfHwgY3YgPT0gMHgzMSB8fCBjdiA9PSAweDM1IHx8IGN2ID09IDB4MzYgfHwKKwkgICAgY3YgPj0gMHg0MCkgeworCQlpZiAocmVnMSA+IDB4NDA1YykKKwkJCXNldFBMTF9kb3VibGVfaGlnaHJlZ3MoZGV2LCByZWcxLCBwdik7CisJCWVsc2UKKwkJCXNldFBMTF9kb3VibGVfbG93cmVncyhkZXYsIHJlZzEsIHB2KTsKKwl9IGVsc2UKKwkJc2V0UExMX3NpbmdsZShkZXYsIHJlZzEsIHB2KTsKK30KKworLyoKKyAqIFBMTCBnZXR0aW5nCisgKi8KKworc3RhdGljIHZvaWQKK25vdXZlYXVfaHdfZGVjb2RlX3BsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCByZWcxLCB1aW50MzJfdCBwbGwxLAorCQkgICAgICB1aW50MzJfdCBwbGwyLCBzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyAqcGxsdmFscykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJLyogdG8gZm9yY2UgcGFyc2luZyBhcyBzaW5nbGUgc3RhZ2UgKGkuZS4gbnY0MCB2cGxscykgcGFzcyBwbGwyIGFzIDAgKi8KKworCS8qIGxvZzJQIGlzICYgMHg3IGFzIG5ldmVyIG1vcmUgdGhhbiA3LCBhbmQgbnYzMC8zNSBvbmx5IHVzZXMgMyBiaXRzICovCisJcGxsdmFscy0+bG9nMlAgPSAocGxsMSA+PiAxNikgJiAweDc7CisJcGxsdmFscy0+TjIgPSBwbGx2YWxzLT5NMiA9IDE7CisKKwlpZiAocmVnMSA8PSAweDQwNWMpIHsKKwkJcGxsdmFscy0+Tk0xID0gcGxsMiAmIDB4ZmZmZjsKKwkJLyogc2luZ2xlIHN0YWdlIE5WUExMIGFuZCBWUExMcyB1c2UgMSA8PCA4LCBNUExMIHVzZXMgMSA8PCAxMiAqLworCQlpZiAoIShwbGwxICYgMHgxMTAwKSkKKwkJCXBsbHZhbHMtPk5NMiA9IHBsbDIgPj4gMTY7CisJfSBlbHNlIHsKKwkJcGxsdmFscy0+Tk0xID0gcGxsMSAmIDB4ZmZmZjsKKwkJaWYgKG52X3R3b19yZWdfcGxsKGRldikgJiYgcGxsMiAmIE5WMzFfUkFNREFDX0VOQUJMRV9WQ08yKQorCQkJcGxsdmFscy0+Tk0yID0gcGxsMiAmIDB4ZmZmZjsKKwkJZWxzZSBpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHgzMCB8fCBkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDM1KSB7CisJCQlwbGx2YWxzLT5NMSAmPSAweGY7IC8qIG9ubHkgNCBiaXRzICovCisJCQlpZiAocGxsMSAmIE5WMzBfUkFNREFDX0VOQUJMRV9WQ08yKSB7CisJCQkJcGxsdmFscy0+TTIgPSAocGxsMSA+PiA0KSAmIDB4NzsKKwkJCQlwbGx2YWxzLT5OMiA9ICgocGxsMSA+PiAyMSkgJiAweDE4KSB8CisJCQkJCSAgICAgICgocGxsMSA+PiAxOSkgJiAweDcpOworCQkJfQorCQl9CisJfQorfQorCitpbnQKK25vdXZlYXVfaHdfZ2V0X3BsbHZhbHMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBwbGxfdHlwZXMgcGxsdHlwZSwKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X3BsbF92YWxzICpwbGx2YWxzKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJY29uc3QgdWludDMyX3QgbnYwNF9yZWdzW01BWF9QTExfVFlQRVNdID0geyBOVl9QUkFNREFDX05WUExMX0NPRUZGLAorCQkJCQkJICAgIE5WX1BSQU1EQUNfTVBMTF9DT0VGRiwKKwkJCQkJCSAgICBOVl9QUkFNREFDX1ZQTExfQ09FRkYsCisJCQkJCQkgICAgTlZfUkFNREFDX1ZQTEwyIH07CisJY29uc3QgdWludDMyX3QgbnY0MF9yZWdzW01BWF9QTExfVFlQRVNdID0geyAweDQwMDAsCisJCQkJCQkgICAgMHg0MDIwLAorCQkJCQkJICAgIE5WX1BSQU1EQUNfVlBMTF9DT0VGRiwKKwkJCQkJCSAgICBOVl9SQU1EQUNfVlBMTDIgfTsKKwl1aW50MzJfdCByZWcxLCBwbGwxLCBwbGwyID0gMDsKKwlzdHJ1Y3QgcGxsX2xpbXMgcGxsX2xpbTsKKwlpbnQgcmV0OworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl80MCkKKwkJcmVnMSA9IG52MDRfcmVnc1twbGx0eXBlXTsKKwllbHNlCisJCXJlZzEgPSBudjQwX3JlZ3NbcGxsdHlwZV07CisKKwlwbGwxID0gbnZSZWFkTUMoZGV2LCByZWcxKTsKKworCWlmIChyZWcxIDw9IDB4NDA1YykKKwkJcGxsMiA9IG52UmVhZE1DKGRldiwgcmVnMSArIDQpOworCWVsc2UgaWYgKG52X3R3b19yZWdfcGxsKGRldikpIHsKKwkJdWludDMyX3QgcmVnMiA9IHJlZzEgKyAocmVnMSA9PSBOVl9SQU1EQUNfVlBMTDIgPyAweDVjIDogMHg3MCk7CisKKwkJcGxsMiA9IG52UmVhZE1DKGRldiwgcmVnMik7CisJfQorCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gMHg0MCAmJiByZWcxID49IE5WX1BSQU1EQUNfVlBMTF9DT0VGRikgeworCQl1aW50MzJfdCByYW1kYWM1ODAgPSBOVlJlYWRSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDXzU4MCk7CisKKwkJLyogY2hlY2sgd2hldGhlciB2cGxsIGhhcyBiZWVuIGZvcmNlZCBpbnRvIHNpbmdsZSBzdGFnZSBtb2RlICovCisJCWlmIChyZWcxID09IE5WX1BSQU1EQUNfVlBMTF9DT0VGRikgeworCQkJaWYgKHJhbWRhYzU4MCAmIE5WX1JBTURBQ181ODBfVlBMTDFfQUNUSVZFKQorCQkJCXBsbDIgPSAwOworCQl9IGVsc2UKKwkJCWlmIChyYW1kYWM1ODAgJiBOVl9SQU1EQUNfNTgwX1ZQTEwyX0FDVElWRSkKKwkJCQlwbGwyID0gMDsKKwl9CisKKwlub3V2ZWF1X2h3X2RlY29kZV9wbGwoZGV2LCByZWcxLCBwbGwxLCBwbGwyLCBwbGx2YWxzKTsKKworCXJldCA9IGdldF9wbGxfbGltaXRzKGRldiwgcGxsdHlwZSwgJnBsbF9saW0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlwbGx2YWxzLT5yZWZjbGsgPSBwbGxfbGltLnJlZmNsazsKKworCXJldHVybiAwOworfQorCitpbnQKK25vdXZlYXVfaHdfcGxsdmFsc190b19jbGsoc3RydWN0IG5vdXZlYXVfcGxsX3ZhbHMgKnB2KQoreworCS8qIEF2b2lkIGRpdmlkZSBieSB6ZXJvIGlmIGNhbGxlZCBhdCBhbiBpbmFwcHJvcHJpYXRlIHRpbWUgKi8KKwlpZiAoIXB2LT5NMSB8fCAhcHYtPk0yKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBwdi0+TjEgKiBwdi0+TjIgKiBwdi0+cmVmY2xrIC8gKHB2LT5NMSAqIHB2LT5NMikgPj4gcHYtPmxvZzJQOworfQorCitpbnQKK25vdXZlYXVfaHdfZ2V0X2Nsb2NrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gcGxsX3R5cGVzIHBsbHR5cGUpCit7CisJc3RydWN0IG5vdXZlYXVfcGxsX3ZhbHMgcGxsdmFsczsKKworCWlmIChwbGx0eXBlID09IE1QTEwgJiYgKGRldi0+cGNpX2RldmljZSAmIDB4MGZmMCkgPT0gQ0hJUFNFVF9ORk9SQ0UpIHsKKwkJdWludDMyX3QgbXBsbFA7CisKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9nZXRfYnVzX2FuZF9zbG90KDAsIDMpLCAweDZjLCAmbXBsbFApOworCQlpZiAoIW1wbGxQKQorCQkJbXBsbFAgPSA0OworCisJCXJldHVybiA0MDAwMDAgLyBtcGxsUDsKKwl9IGVsc2UKKwlpZiAocGxsdHlwZSA9PSBNUExMICYmIChkZXYtPnBjaV9kZXZpY2UgJiAweGZmMCkgPT0gQ0hJUFNFVF9ORk9SQ0UyKSB7CisJCXVpbnQzMl90IGNsb2NrOworCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZ2V0X2J1c19hbmRfc2xvdCgwLCA1KSwgMHg0YywgJmNsb2NrKTsKKwkJcmV0dXJuIGNsb2NrOworCX0KKworCW5vdXZlYXVfaHdfZ2V0X3BsbHZhbHMoZGV2LCBwbGx0eXBlLCAmcGxsdmFscyk7CisKKwlyZXR1cm4gbm91dmVhdV9od19wbGx2YWxzX3RvX2NsaygmcGxsdmFscyk7Cit9CisKK3N0YXRpYyB2b2lkCitub3V2ZWF1X2h3X2ZpeF9iYWRfdnBsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCkKK3sKKwkvKiB0aGUgdnBsbCBvbiBhbiB1bnVzZWQgaGVhZCBjYW4gY29tZSB1cCB3aXRoIGEgcmFuZG9tIHZhbHVlLCB3YXkKKwkgKiBiZXlvbmQgdGhlIHBsbCBsaW1pdHMuICBmb3Igc29tZSByZWFzb24gdGhpcyBjYXVzZXMgdGhlIGNoaXAgdG8KKwkgKiBsb2NrIHVwIHdoZW4gcmVhZGluZyB0aGUgZGFjIHBhbGV0dGUgcmVncywgc28gc2V0IGEgdmFsaWQgcGxsIGhlcmUKKwkgKiB3aGVuIHN1Y2ggYSBjb25kaXRpb24gZGV0ZWN0ZWQuICBvbmx5IHNlZW4gb24gbnYxMSB0byBkYXRlCisJICovCisKKwlzdHJ1Y3QgcGxsX2xpbXMgcGxsX2xpbTsKKwlzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyBwdjsKKwl1aW50MzJfdCBwbGxyZWcgPSBoZWFkID8gTlZfUkFNREFDX1ZQTEwyIDogTlZfUFJBTURBQ19WUExMX0NPRUZGOworCisJaWYgKGdldF9wbGxfbGltaXRzKGRldiwgaGVhZCA/IFZQTEwyIDogVlBMTDEsICZwbGxfbGltKSkKKwkJcmV0dXJuOworCW5vdXZlYXVfaHdfZ2V0X3BsbHZhbHMoZGV2LCBoZWFkID8gVlBMTDIgOiBWUExMMSwgJnB2KTsKKworCWlmIChwdi5NMSA+PSBwbGxfbGltLnZjbzEubWluX20gJiYgcHYuTTEgPD0gcGxsX2xpbS52Y28xLm1heF9tICYmCisJICAgIHB2Lk4xID49IHBsbF9saW0udmNvMS5taW5fbiAmJiBwdi5OMSA8PSBwbGxfbGltLnZjbzEubWF4X24gJiYKKwkgICAgcHYubG9nMlAgPD0gcGxsX2xpbS5tYXhfbG9nMnApCisJCXJldHVybjsKKworCU5WX1dBUk4oZGV2LCAiVlBMTCAlZCBvdXR3aXRoIGxpbWl0cywgYXR0ZW1wdGluZyB0byBmaXhcbiIsIGhlYWQgKyAxKTsKKworCS8qIHNldCBsb3dlc3QgY2xvY2sgd2l0aGluIHN0YXRpYyBsaW1pdHMgKi8KKwlwdi5NMSA9IHBsbF9saW0udmNvMS5tYXhfbTsKKwlwdi5OMSA9IHBsbF9saW0udmNvMS5taW5fbjsKKwlwdi5sb2cyUCA9IHBsbF9saW0ubWF4X3VzYWJsZV9sb2cycDsKKwlub3V2ZWF1X2h3X3NldHBsbChkZXYsIHBsbHJlZywgJnB2KTsKK30KKworLyoKKyAqIHZnYSBmb250IHNhdmUvcmVzdG9yZQorICovCisKK3N0YXRpYyB2b2lkIG5vdXZlYXVfdmdhX2ZvbnRfaW8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQl2b2lkIF9faW9tZW0gKmlvdnJhbSwKKwkJCQlib29sIHNhdmUsIHVuc2lnbmVkIHBsYW5lKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgaTsKKworCU5WV3JpdGVWZ2FTZXEoZGV2LCAwLCBOVl9WSU9fU1JfUExBTkVfTUFTS19JTkRFWCwgMSA8PCBwbGFuZSk7CisJTlZXcml0ZVZnYUdyKGRldiwgMCwgTlZfVklPX0dYX1JFQURfTUFQX0lOREVYLCBwbGFuZSk7CisJZm9yIChpID0gMDsgaSA8IDE2Mzg0OyBpKyspIHsKKwkJaWYgKHNhdmUpIHsKKwkJCWRldl9wcml2LT5zYXZlZF92Z2FfZm9udFtwbGFuZV1baV0gPQorCQkJCQlpb3JlYWQzMl9uYXRpdmUoaW92cmFtICsgaSAqIDQpOworCQl9IGVsc2UgeworCQkJaW93cml0ZTMyX25hdGl2ZShkZXZfcHJpdi0+c2F2ZWRfdmdhX2ZvbnRbcGxhbmVdW2ldLAorCQkJCQkJCWlvdnJhbSArIGkgKiA0KTsKKwkJfQorCX0KK30KKwordm9pZAorbm91dmVhdV9od19zYXZlX3ZnYV9mb250cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBib29sIHNhdmUpCit7CisJdWludDhfdCBtaXNjLCBncjQsIGdyNSwgZ3I2LCBzZXEyLCBzZXE0OworCWJvb2wgZ3JhcGhpY3Ntb2RlOworCXVuc2lnbmVkIHBsYW5lOworCXZvaWQgX19pb21lbSAqaW92cmFtOworCisJaWYgKG52X3R3b19oZWFkcyhkZXYpKQorCQlOVlNldE93bmVyKGRldiwgMCk7CisKKwlOVlNldEVuYWJsZVBhbGV0dGUoZGV2LCAwLCB0cnVlKTsKKwlncmFwaGljc21vZGUgPSBOVlJlYWRWZ2FBdHRyKGRldiwgMCwgTlZfQ0lPX0FSX01PREVfSU5ERVgpICYgMTsKKwlOVlNldEVuYWJsZVBhbGV0dGUoZGV2LCAwLCBmYWxzZSk7CisKKwlpZiAoZ3JhcGhpY3Ntb2RlKSAvKiBncmFwaGljcyBtb2RlID0+IGZyYW1lYnVmZmVyID0+IG5vIG5lZWQgdG8gc2F2ZSAqLworCQlyZXR1cm47CisKKwlOVl9JTkZPKGRldiwgIiVzaW5nIFZHQSBmb250c1xuIiwgc2F2ZSA/ICJTYXYiIDogIlJlc3RvciIpOworCisJLyogbWFwIGZpcnN0IDY0S2lCIG9mIFZSQU0sIGhvbGRzIFZHQSBmb250cyBldGMgKi8KKwlpb3ZyYW0gPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDEpLCA2NTUzNik7CisJaWYgKCFpb3ZyYW0pIHsKKwkJTlZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIG1hcCBWUkFNLCAiCisJCQkJCSJjYW5ub3Qgc2F2ZS9yZXN0b3JlIFZHQSBmb250cy5cbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKG52X3R3b19oZWFkcyhkZXYpKQorCQlOVkJsYW5rU2NyZWVuKGRldiwgMSwgdHJ1ZSk7CisJTlZCbGFua1NjcmVlbihkZXYsIDAsIHRydWUpOworCisJLyogc2F2ZSBjb250cm9sIHJlZ3MgKi8KKwltaXNjID0gTlZSZWFkUFJNVklPKGRldiwgMCwgTlZfUFJNVklPX01JU0NfX1JFQUQpOworCXNlcTIgPSBOVlJlYWRWZ2FTZXEoZGV2LCAwLCBOVl9WSU9fU1JfUExBTkVfTUFTS19JTkRFWCk7CisJc2VxNCA9IE5WUmVhZFZnYVNlcShkZXYsIDAsIE5WX1ZJT19TUl9NRU1fTU9ERV9JTkRFWCk7CisJZ3I0ID0gTlZSZWFkVmdhR3IoZGV2LCAwLCBOVl9WSU9fR1hfUkVBRF9NQVBfSU5ERVgpOworCWdyNSA9IE5WUmVhZFZnYUdyKGRldiwgMCwgTlZfVklPX0dYX01PREVfSU5ERVgpOworCWdyNiA9IE5WUmVhZFZnYUdyKGRldiwgMCwgTlZfVklPX0dYX01JU0NfSU5ERVgpOworCisJTlZXcml0ZVBSTVZJTyhkZXYsIDAsIE5WX1BSTVZJT19NSVNDX19XUklURSwgMHg2Nyk7CisJTlZXcml0ZVZnYVNlcShkZXYsIDAsIE5WX1ZJT19TUl9NRU1fTU9ERV9JTkRFWCwgMHg2KTsKKwlOVldyaXRlVmdhR3IoZGV2LCAwLCBOVl9WSU9fR1hfTU9ERV9JTkRFWCwgMHgwKTsKKwlOVldyaXRlVmdhR3IoZGV2LCAwLCBOVl9WSU9fR1hfTUlTQ19JTkRFWCwgMHg1KTsKKworCS8qIHN0b3JlIGZvbnQgaW4gcGxhbmVzIDAuLjMgKi8KKwlmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCA0OyBwbGFuZSsrKQorCQlub3V2ZWF1X3ZnYV9mb250X2lvKGRldiwgaW92cmFtLCBzYXZlLCBwbGFuZSk7CisKKwkvKiByZXN0b3JlIGNvbnRyb2wgcmVncyAqLworCU5WV3JpdGVQUk1WSU8oZGV2LCAwLCBOVl9QUk1WSU9fTUlTQ19fV1JJVEUsIG1pc2MpOworCU5WV3JpdGVWZ2FHcihkZXYsIDAsIE5WX1ZJT19HWF9SRUFEX01BUF9JTkRFWCwgZ3I0KTsKKwlOVldyaXRlVmdhR3IoZGV2LCAwLCBOVl9WSU9fR1hfTU9ERV9JTkRFWCwgZ3I1KTsKKwlOVldyaXRlVmdhR3IoZGV2LCAwLCBOVl9WSU9fR1hfTUlTQ19JTkRFWCwgZ3I2KTsKKwlOVldyaXRlVmdhU2VxKGRldiwgMCwgTlZfVklPX1NSX1BMQU5FX01BU0tfSU5ERVgsIHNlcTIpOworCU5WV3JpdGVWZ2FTZXEoZGV2LCAwLCBOVl9WSU9fU1JfTUVNX01PREVfSU5ERVgsIHNlcTQpOworCisJaWYgKG52X3R3b19oZWFkcyhkZXYpKQorCQlOVkJsYW5rU2NyZWVuKGRldiwgMSwgZmFsc2UpOworCU5WQmxhbmtTY3JlZW4oZGV2LCAwLCBmYWxzZSk7CisKKwlpb3VubWFwKGlvdnJhbSk7Cit9CisKKy8qCisgKiBtb2RlIHN0YXRlIHNhdmUvbG9hZAorICovCisKK3N0YXRpYyB2b2lkCityZF9jaW9fc3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQsCisJICAgICBzdHJ1Y3QgbnYwNF9jcnRjX3JlZyAqY3J0Y3N0YXRlLCBpbnQgaW5kZXgpCit7CisJY3J0Y3N0YXRlLT5DUlRDW2luZGV4XSA9IE5WUmVhZFZnYUNydGMoZGV2LCBoZWFkLCBpbmRleCk7Cit9CisKK3N0YXRpYyB2b2lkCit3cl9jaW9fc3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQsCisJICAgICBzdHJ1Y3QgbnYwNF9jcnRjX3JlZyAqY3J0Y3N0YXRlLCBpbnQgaW5kZXgpCit7CisJTlZXcml0ZVZnYUNydGMoZGV2LCBoZWFkLCBpbmRleCwgY3J0Y3N0YXRlLT5DUlRDW2luZGV4XSk7Cit9CisKK3N0YXRpYyB2b2lkCitudl9zYXZlX3N0YXRlX3JhbWRhYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCwKKwkJICAgICBzdHJ1Y3QgbnYwNF9tb2RlX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudjA0X2NydGNfcmVnICpyZWdwID0gJnN0YXRlLT5jcnRjX3JlZ1toZWFkXTsKKwlpbnQgaTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzEwKQorCQlyZWdwLT5udjEwX2N1cnN5bmMgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9SQU1EQUNfTlYxMF9DVVJTWU5DKTsKKworCW5vdXZlYXVfaHdfZ2V0X3BsbHZhbHMoZGV2LCBoZWFkID8gVlBMTDIgOiBWUExMMSwgJnJlZ3AtPnBsbHZhbHMpOworCXN0YXRlLT5wbGxzZWwgPSBOVlJlYWRSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1QpOworCWlmIChudl90d29faGVhZHMoZGV2KSkKKwkJc3RhdGUtPnNlbF9jbGsgPSBOVlJlYWRSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX1NFTF9DTEspOworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDExKQorCQlyZWdwLT5kaXRoZXIgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9SQU1EQUNfRElUSEVSX05WMTEpOworCisJcmVncC0+cmFtZGFjX2dlbl9jdHJsID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19HRU5FUkFMX0NPTlRST0wpOworCisJaWYgKG52X2dmNF9kaXNwX2FyY2goZGV2KSkKKwkJcmVncC0+cmFtZGFjXzYzMCA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfNjMwKTsKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHgzMCkKKwkJcmVncC0+cmFtZGFjXzYzNCA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfNjM0KTsKKworCXJlZ3AtPnR2X3NldHVwID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19UVl9TRVRVUCk7CisJcmVncC0+dHZfdnRvdGFsID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19UVl9WVE9UQUwpOworCXJlZ3AtPnR2X3Zza2V3ID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19UVl9WU0tFVyk7CisJcmVncC0+dHZfdnN5bmNfZGVsYXkgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX1RWX1ZTWU5DX0RFTEFZKTsKKwlyZWdwLT50dl9odG90YWwgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX1RWX0hUT1RBTCk7CisJcmVncC0+dHZfaHNrZXcgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX1RWX0hTS0VXKTsKKwlyZWdwLT50dl9oc3luY19kZWxheSA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfVFZfSFNZTkNfREVMQVkpOworCXJlZ3AtPnR2X2hzeW5jX2RlbGF5MiA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfVFZfSFNZTkNfREVMQVkyKTsKKworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJdWludDMyX3QgcmFtZGFjX3JlZyA9IE5WX1BSQU1EQUNfRlBfVkRJU1BMQVlfRU5EICsgKGkgKiA0KTsKKwkJcmVncC0+ZnBfdmVydF9yZWdzW2ldID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgcmFtZGFjX3JlZyk7CisJCXJlZ3AtPmZwX2hvcml6X3JlZ3NbaV0gPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCByYW1kYWNfcmVnICsgMHgyMCk7CisJfQorCisJaWYgKG52X2dmNF9kaXNwX2FyY2goZGV2KSkgeworCQlyZWdwLT5kaXRoZXIgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9SQU1EQUNfRlBfRElUSEVSKTsKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJcmVncC0+ZGl0aGVyX3JlZ3NbaV0gPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDXzg1MCArIGkgKiA0KTsKKwkJCXJlZ3AtPmRpdGhlcl9yZWdzW2kgKyAzXSA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfODVDICsgaSAqIDQpOworCQl9CisJfQorCisJcmVncC0+ZnBfY29udHJvbCA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTCk7CisJcmVncC0+ZnBfZGVidWdfMCA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfRlBfREVCVUdfMCk7CisJaWYgKCFudl9nZjRfZGlzcF9hcmNoKGRldikgJiYgaGVhZCA9PSAwKSB7CisJCS8qIGVhcmx5IGNoaXBzIGRvbid0IGFsbG93IGFjY2VzcyB0byBQUkFNREFDX1RNRFNfKiB3aXRob3V0CisJCSAqIHRoZSBoZWFkIEEgRlBDTEsgb24gKG52MTEgZXZlbiBsb2NrcyB1cCkgKi8KKwkJTlZXcml0ZVJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfRlBfREVCVUdfMCwgcmVncC0+ZnBfZGVidWdfMCAmCisJCQkgICAgICB+TlZfUFJBTURBQ19GUF9ERUJVR18wX1BXUkRPV05fRlBDTEspOworCX0KKwlyZWdwLT5mcF9kZWJ1Z18xID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19GUF9ERUJVR18xKTsKKwlyZWdwLT5mcF9kZWJ1Z18yID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19GUF9ERUJVR18yKTsKKworCXJlZ3AtPmZwX21hcmdpbl9jb2xvciA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfRlBfTUFSR0lOX0NPTE9SKTsKKworCWlmIChudl9nZjRfZGlzcF9hcmNoKGRldikpCisJCXJlZ3AtPnJhbWRhY184YzAgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDXzhDMCk7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl80MCkgeworCQlyZWdwLT5yYW1kYWNfYTIwID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19BMjApOworCQlyZWdwLT5yYW1kYWNfYTI0ID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19BMjQpOworCQlyZWdwLT5yYW1kYWNfYTM0ID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19BMzQpOworCisJCWZvciAoaSA9IDA7IGkgPCAzODsgaSsrKQorCQkJcmVncC0+Y3R2X3JlZ3NbaV0gPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLAorCQkJCQkJCSBOVl9QUkFNREFDX0NUViArIDQqaSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorbnZfbG9hZF9zdGF0ZV9yYW1kYWMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQsCisJCSAgICAgc3RydWN0IG52MDRfbW9kZV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnYwNF9jcnRjX3JlZyAqcmVncCA9ICZzdGF0ZS0+Y3J0Y19yZWdbaGVhZF07CisJdWludDMyX3QgcGxscmVnID0gaGVhZCA/IE5WX1JBTURBQ19WUExMMiA6IE5WX1BSQU1EQUNfVlBMTF9DT0VGRjsKKwlpbnQgaTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzEwKQorCQlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUkFNREFDX05WMTBfQ1VSU1lOQywgcmVncC0+bnYxMF9jdXJzeW5jKTsKKworCW5vdXZlYXVfaHdfc2V0cGxsKGRldiwgcGxscmVnLCAmcmVncC0+cGxsdmFscyk7CisJTlZXcml0ZVJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVCwgc3RhdGUtPnBsbHNlbCk7CisJaWYgKG52X3R3b19oZWFkcyhkZXYpKQorCQlOVldyaXRlUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19TRUxfQ0xLLCBzdGF0ZS0+c2VsX2Nsayk7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4MTEpCisJCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9SQU1EQUNfRElUSEVSX05WMTEsIHJlZ3AtPmRpdGhlcik7CisKKwlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19HRU5FUkFMX0NPTlRST0wsIHJlZ3AtPnJhbWRhY19nZW5fY3RybCk7CisKKwlpZiAobnZfZ2Y0X2Rpc3BfYXJjaChkZXYpKQorCQlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ182MzAsIHJlZ3AtPnJhbWRhY182MzApOworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDMwKQorCQlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ182MzQsIHJlZ3AtPnJhbWRhY182MzQpOworCisJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfVFZfU0VUVVAsIHJlZ3AtPnR2X3NldHVwKTsKKwlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19UVl9WVE9UQUwsIHJlZ3AtPnR2X3Z0b3RhbCk7CisJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfVFZfVlNLRVcsIHJlZ3AtPnR2X3Zza2V3KTsKKwlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19UVl9WU1lOQ19ERUxBWSwgcmVncC0+dHZfdnN5bmNfZGVsYXkpOworCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX1RWX0hUT1RBTCwgcmVncC0+dHZfaHRvdGFsKTsKKwlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19UVl9IU0tFVywgcmVncC0+dHZfaHNrZXcpOworCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX1RWX0hTWU5DX0RFTEFZLCByZWdwLT50dl9oc3luY19kZWxheSk7CisJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfVFZfSFNZTkNfREVMQVkyLCByZWdwLT50dl9oc3luY19kZWxheTIpOworCisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQl1aW50MzJfdCByYW1kYWNfcmVnID0gTlZfUFJBTURBQ19GUF9WRElTUExBWV9FTkQgKyAoaSAqIDQpOworCisJCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCByYW1kYWNfcmVnLCByZWdwLT5mcF92ZXJ0X3JlZ3NbaV0pOworCQlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgcmFtZGFjX3JlZyArIDB4MjAsIHJlZ3AtPmZwX2hvcml6X3JlZ3NbaV0pOworCX0KKworCWlmIChudl9nZjRfZGlzcF9hcmNoKGRldikpIHsKKwkJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1JBTURBQ19GUF9ESVRIRVIsIHJlZ3AtPmRpdGhlcik7CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDXzg1MCArIGkgKiA0LCByZWdwLT5kaXRoZXJfcmVnc1tpXSk7CisJCQlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ184NUMgKyBpICogNCwgcmVncC0+ZGl0aGVyX3JlZ3NbaSArIDNdKTsKKwkJfQorCX0KKworCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0wsIHJlZ3AtPmZwX2NvbnRyb2wpOworCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0ZQX0RFQlVHXzAsIHJlZ3AtPmZwX2RlYnVnXzApOworCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0ZQX0RFQlVHXzEsIHJlZ3AtPmZwX2RlYnVnXzEpOworCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0ZQX0RFQlVHXzIsIHJlZ3AtPmZwX2RlYnVnXzIpOworCisJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfRlBfTUFSR0lOX0NPTE9SLCByZWdwLT5mcF9tYXJnaW5fY29sb3IpOworCisJaWYgKG52X2dmNF9kaXNwX2FyY2goZGV2KSkKKwkJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfOEMwLCByZWdwLT5yYW1kYWNfOGMwKTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzQwKSB7CisJCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0EyMCwgcmVncC0+cmFtZGFjX2EyMCk7CisJCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0EyNCwgcmVncC0+cmFtZGFjX2EyNCk7CisJCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0EzNCwgcmVncC0+cmFtZGFjX2EzNCk7CisKKwkJZm9yIChpID0gMDsgaSA8IDM4OyBpKyspCisJCQlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwKKwkJCQkgICAgICBOVl9QUkFNREFDX0NUViArIDQqaSwgcmVncC0+Y3R2X3JlZ3NbaV0pOworCX0KK30KKworc3RhdGljIHZvaWQKK252X3NhdmVfc3RhdGVfdmdhKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkLAorCQkgIHN0cnVjdCBudjA0X21vZGVfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBudjA0X2NydGNfcmVnICpyZWdwID0gJnN0YXRlLT5jcnRjX3JlZ1toZWFkXTsKKwlpbnQgaTsKKworCXJlZ3AtPk1pc2NPdXRSZWcgPSBOVlJlYWRQUk1WSU8oZGV2LCBoZWFkLCBOVl9QUk1WSU9fTUlTQ19fUkVBRCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU7IGkrKykKKwkJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgaSk7CisKKwlOVlNldEVuYWJsZVBhbGV0dGUoZGV2LCBoZWFkLCB0cnVlKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjE7IGkrKykKKwkJcmVncC0+QXR0cmlidXRlW2ldID0gTlZSZWFkVmdhQXR0cihkZXYsIGhlYWQsIGkpOworCU5WU2V0RW5hYmxlUGFsZXR0ZShkZXYsIGhlYWQsIGZhbHNlKTsKKworCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspCisJCXJlZ3AtPkdyYXBoaWNzW2ldID0gTlZSZWFkVmdhR3IoZGV2LCBoZWFkLCBpKTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCXJlZ3AtPlNlcXVlbmNlcltpXSA9IE5WUmVhZFZnYVNlcShkZXYsIGhlYWQsIGkpOworfQorCitzdGF0aWMgdm9pZAorbnZfbG9hZF9zdGF0ZV92Z2Eoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQsCisJCSAgc3RydWN0IG52MDRfbW9kZV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IG52MDRfY3J0Y19yZWcgKnJlZ3AgPSAmc3RhdGUtPmNydGNfcmVnW2hlYWRdOworCWludCBpOworCisJTlZXcml0ZVBSTVZJTyhkZXYsIGhlYWQsIE5WX1BSTVZJT19NSVNDX19XUklURSwgcmVncC0+TWlzY091dFJlZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlOVldyaXRlVmdhU2VxKGRldiwgaGVhZCwgaSwgcmVncC0+U2VxdWVuY2VyW2ldKTsKKworCW52X2xvY2tfdmdhX2NydGNfYmFzZShkZXYsIGhlYWQsIGZhbHNlKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU7IGkrKykKKwkJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgaSk7CisJbnZfbG9ja192Z2FfY3J0Y19iYXNlKGRldiwgaGVhZCwgdHJ1ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorCQlOVldyaXRlVmdhR3IoZGV2LCBoZWFkLCBpLCByZWdwLT5HcmFwaGljc1tpXSk7CisKKwlOVlNldEVuYWJsZVBhbGV0dGUoZGV2LCBoZWFkLCB0cnVlKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjE7IGkrKykKKwkJTlZXcml0ZVZnYUF0dHIoZGV2LCBoZWFkLCBpLCByZWdwLT5BdHRyaWJ1dGVbaV0pOworCU5WU2V0RW5hYmxlUGFsZXR0ZShkZXYsIGhlYWQsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQKK252X3NhdmVfc3RhdGVfZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkLAorCQkgIHN0cnVjdCBudjA0X21vZGVfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52MDRfY3J0Y19yZWcgKnJlZ3AgPSAmc3RhdGUtPmNydGNfcmVnW2hlYWRdOworCWludCBpOworCisJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9MQ0RfX0lOREVYKTsKKwlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX1JQQzBfSU5ERVgpOworCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfUlBDMV9JTkRFWCk7CisJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9MU1JfSU5ERVgpOworCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfUElYRUxfSU5ERVgpOworCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfSEVCX19JTkRFWCk7CisJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9FTkhfSU5ERVgpOworCisJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9GRl9JTkRFWCk7CisJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9GRkxXTV9fSU5ERVgpOworCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfMjEpOworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzMwKQorCQlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFXzQ3KTsKKwlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFXzQ5KTsKKwlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX0hDVVJfQUREUjBfSU5ERVgpOworCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfSENVUl9BRERSMV9JTkRFWCk7CisJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9IQ1VSX0FERFIyX0lOREVYKTsKKwlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX0lMQUNFX19JTkRFWCk7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8xMCkgeworCQlyZWdwLT5jcnRjXzgzMCA9IE5WUmVhZENSVEMoZGV2LCBoZWFkLCBOVl9QQ1JUQ184MzApOworCQlyZWdwLT5jcnRjXzgzNCA9IE5WUmVhZENSVEMoZGV2LCBoZWFkLCBOVl9QQ1JUQ184MzQpOworCisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzMwKQorCQkJcmVncC0+Z3Bpb19leHQgPSBOVlJlYWRDUlRDKGRldiwgaGVhZCwgTlZfUENSVENfR1BJT19FWFQpOworCisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzQwKQorCQkJcmVncC0+Y3J0Y184NTAgPSBOVlJlYWRDUlRDKGRldiwgaGVhZCwgTlZfUENSVENfODUwKTsKKworCQlpZiAobnZfdHdvX2hlYWRzKGRldikpCisJCQlyZWdwLT5jcnRjX2VuZ19jdHJsID0gTlZSZWFkQ1JUQyhkZXYsIGhlYWQsIE5WX1BDUlRDX0VOR0lORV9DVFJMKTsKKwkJcmVncC0+Y3Vyc29yX2NmZyA9IE5WUmVhZENSVEMoZGV2LCBoZWFkLCBOVl9QQ1JUQ19DVVJTT1JfQ09ORklHKTsKKwl9CisKKwlyZWdwLT5jcnRjX2NmZyA9IE5WUmVhZENSVEMoZGV2LCBoZWFkLCBOVl9QQ1JUQ19DT05GSUcpOworCisJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9TQ1JBVENIM19fSU5ERVgpOworCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfU0NSQVRDSDRfX0lOREVYKTsKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8xMCkgeworCQlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX0VCUl9JTkRFWCk7CisJCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfQ1NCKTsKKwkJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV80Qik7CisJCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfVFZPVVRfTEFURU5DWSk7CisJfQorCS8qIE5WMTEgYW5kIE5WMjAgZG9uJ3QgaGF2ZSB0aGlzLCB0aGV5IHN0b3AgYXQgMHg1Mi4gKi8KKwlpZiAobnZfZ2Y0X2Rpc3BfYXJjaChkZXYpKSB7CisJCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfNTMpOworCQlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFXzU0KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMHgxMDsgaSsrKQorCQkJcmVncC0+Q1I1OFtpXSA9IE5WUmVhZFZnYUNydGM1NzU4KGRldiwgaGVhZCwgaSk7CisJCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfNTkpOworCQlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFXzVCKTsKKworCQlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFXzg1KTsKKwkJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV84Nik7CisJfQorCisJcmVncC0+ZmJfc3RhcnQgPSBOVlJlYWRDUlRDKGRldiwgaGVhZCwgTlZfUENSVENfU1RBUlQpOworfQorCitzdGF0aWMgdm9pZAorbnZfbG9hZF9zdGF0ZV9leHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQsCisJCSAgc3RydWN0IG52MDRfbW9kZV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnYwNF9jcnRjX3JlZyAqcmVncCA9ICZzdGF0ZS0+Y3J0Y19yZWdbaGVhZF07CisJdWludDMyX3QgcmVnOTAwOworCWludCBpOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfMTApIHsKKwkJaWYgKG52X3R3b19oZWFkcyhkZXYpKQorCQkJLyogc2V0dGluZyBFTkdJTkVfQ1RSTCAoRUMpICptdXN0KiBjb21lIGJlZm9yZQorCQkJICogQ0lPX0NSRV9MQ0QsIGFzIHdyaXRpbmcgQ1JFX0xDRCBzZXRzIGJpdHMgMTYgJiAxNyBpbgorCQkJICogRUMgdGhhdCBzaG91bGQgbm90IGJlIG92ZXJ3cml0dGVuIGJ5IHdyaXRpbmcgc3RhbGUgRUMKKwkJCSAqLworCQkJTlZXcml0ZUNSVEMoZGV2LCBoZWFkLCBOVl9QQ1JUQ19FTkdJTkVfQ1RSTCwgcmVncC0+Y3J0Y19lbmdfY3RybCk7CisKKwkJbnZXcml0ZVZJREVPKGRldiwgTlZfUFZJREVPX1NUT1AsIDEpOworCQludldyaXRlVklERU8oZGV2LCBOVl9QVklERU9fSU5UUl9FTiwgMCk7CisJCW52V3JpdGVWSURFTyhkZXYsIE5WX1BWSURFT19PRkZTRVRfQlVGRigwKSwgMCk7CisJCW52V3JpdGVWSURFTyhkZXYsIE5WX1BWSURFT19PRkZTRVRfQlVGRigxKSwgMCk7CisJCW52V3JpdGVWSURFTyhkZXYsIE5WX1BWSURFT19MSU1JVCgwKSwgZGV2X3ByaXYtPmZiX2F2YWlsYWJsZV9zaXplIC0gMSk7CisJCW52V3JpdGVWSURFTyhkZXYsIE5WX1BWSURFT19MSU1JVCgxKSwgZGV2X3ByaXYtPmZiX2F2YWlsYWJsZV9zaXplIC0gMSk7CisJCW52V3JpdGVWSURFTyhkZXYsIE5WX1BWSURFT19VVlBMQU5FX0xJTUlUKDApLCBkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemUgLSAxKTsKKwkJbnZXcml0ZVZJREVPKGRldiwgTlZfUFZJREVPX1VWUExBTkVfTElNSVQoMSksIGRldl9wcml2LT5mYl9hdmFpbGFibGVfc2l6ZSAtIDEpOworCQludldyaXRlTUMoZGV2LCBOVl9QQlVTX1BPV0VSQ1RSTF8yLCAwKTsKKworCQlOVldyaXRlQ1JUQyhkZXYsIGhlYWQsIE5WX1BDUlRDX0NVUlNPUl9DT05GSUcsIHJlZ3AtPmN1cnNvcl9jZmcpOworCQlOVldyaXRlQ1JUQyhkZXYsIGhlYWQsIE5WX1BDUlRDXzgzMCwgcmVncC0+Y3J0Y184MzApOworCQlOVldyaXRlQ1JUQyhkZXYsIGhlYWQsIE5WX1BDUlRDXzgzNCwgcmVncC0+Y3J0Y184MzQpOworCisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzMwKQorCQkJTlZXcml0ZUNSVEMoZGV2LCBoZWFkLCBOVl9QQ1JUQ19HUElPX0VYVCwgcmVncC0+Z3Bpb19leHQpOworCisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzQwKSB7CisJCQlOVldyaXRlQ1JUQyhkZXYsIGhlYWQsIE5WX1BDUlRDXzg1MCwgcmVncC0+Y3J0Y184NTApOworCisJCQlyZWc5MDAgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDXzkwMCk7CisJCQlpZiAocmVncC0+Y3J0Y19jZmcgPT0gTlZfUENSVENfQ09ORklHX1NUQVJUX0FERFJFU1NfSFNZTkMpCisJCQkJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfOTAwLCByZWc5MDAgfCAweDEwMDAwKTsKKwkJCWVsc2UKKwkJCQlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ185MDAsIHJlZzkwMCAmIH4weDEwMDAwKTsKKwkJfQorCX0KKworCU5WV3JpdGVDUlRDKGRldiwgaGVhZCwgTlZfUENSVENfQ09ORklHLCByZWdwLT5jcnRjX2NmZyk7CisKKwl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX1JQQzBfSU5ERVgpOworCXdyX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfUlBDMV9JTkRFWCk7CisJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9MU1JfSU5ERVgpOworCXdyX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfUElYRUxfSU5ERVgpOworCXdyX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfTENEX19JTkRFWCk7CisJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9IRUJfX0lOREVYKTsKKwl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX0VOSF9JTkRFWCk7CisJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9GRl9JTkRFWCk7CisJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9GRkxXTV9fSU5ERVgpOworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzMwKQorCQl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFXzQ3KTsKKworCXdyX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfNDkpOworCXdyX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfSENVUl9BRERSMF9JTkRFWCk7CisJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9IQ1VSX0FERFIxX0lOREVYKTsKKwl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX0hDVVJfQUREUjJfSU5ERVgpOworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzQwKQorCQludl9maXhfbnY0MF9od19jdXJzb3IoZGV2LCBoZWFkKTsKKwl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX0lMQUNFX19JTkRFWCk7CisKKwl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX1NDUkFUQ0gzX19JTkRFWCk7CisJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9TQ1JBVENINF9fSU5ERVgpOworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzEwKSB7CisJCXdyX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfRUJSX0lOREVYKTsKKwkJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9DU0IpOworCQl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFXzRCKTsKKwkJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9UVk9VVF9MQVRFTkNZKTsKKwl9CisJLyogTlYxMSBhbmQgTlYyMCBzdG9wIGF0IDB4NTIuICovCisJaWYgKG52X2dmNF9kaXNwX2FyY2goZGV2KSkgeworCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl8xMCkgeworCQkJLyogTm90IHdhaXRpbmcgZm9yIHZlcnRpY2FsIHJldHJhY2UgYmVmb3JlIG1vZGlmeWluZworCQkJICAgQ1JFXzUzL0NSRV81NCBjYXVzZXMgbG9ja3Vwcy4gKi8KKwkJCW5vdXZlYXVfd2FpdF91bnRpbChkZXYsIDY1MDAwMDAwMCwgTlZfUFJNQ0lPX0lOUDBfX0NPTE9SLCAweDgsIDB4OCk7CisJCQlub3V2ZWF1X3dhaXRfdW50aWwoZGV2LCA2NTAwMDAwMDAsIE5WX1BSTUNJT19JTlAwX19DT0xPUiwgMHg4LCAweDApOworCQl9CisKKwkJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV81Myk7CisJCXdyX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfNTQpOworCisJCWZvciAoaSA9IDA7IGkgPCAweDEwOyBpKyspCisJCQlOVldyaXRlVmdhQ3J0YzU3NTgoZGV2LCBoZWFkLCBpLCByZWdwLT5DUjU4W2ldKTsKKwkJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV81OSk7CisJCXdyX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfNUIpOworCisJCXdyX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfODUpOworCQl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFXzg2KTsKKwl9CisKKwlOVldyaXRlQ1JUQyhkZXYsIGhlYWQsIE5WX1BDUlRDX1NUQVJULCByZWdwLT5mYl9zdGFydCk7CisKKwkvKiBTZXR0aW5nIDEgb24gdGhpcyB2YWx1ZSBnaXZlcyB5b3UgaW50ZXJydXB0cyBmb3IgZXZlcnkgdmJsYW5rIHBlcmlvZC4gKi8KKwlOVldyaXRlQ1JUQyhkZXYsIGhlYWQsIE5WX1BDUlRDX0lOVFJfRU5fMCwgMCk7CisJTlZXcml0ZUNSVEMoZGV2LCBoZWFkLCBOVl9QQ1JUQ19JTlRSXzAsIE5WX1BDUlRDX0lOVFJfMF9WQkxBTkspOworfQorCitzdGF0aWMgdm9pZAorbnZfc2F2ZV9zdGF0ZV9wYWxldHRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkLAorCQkgICAgICBzdHJ1Y3QgbnYwNF9tb2RlX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgaGVhZF9vZmZzZXQgPSBoZWFkICogTlZfUFJNRElPX1NJWkUsIGk7CisKKwludl93cjA4KGRldiwgTlZfUFJNRElPX1BJWEVMX01BU0sgKyBoZWFkX29mZnNldCwKKwkJCQlOVl9QUk1ESU9fUElYRUxfTUFTS19NQVNLKTsKKwludl93cjA4KGRldiwgTlZfUFJNRElPX1JFQURfTU9ERV9BRERSRVNTICsgaGVhZF9vZmZzZXQsIDB4MCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNzY4OyBpKyspIHsKKwkJc3RhdGUtPmNydGNfcmVnW2hlYWRdLkRBQ1tpXSA9IG52X3JkMDgoZGV2LAorCQkJCU5WX1BSTURJT19QQUxFVFRFX0RBVEEgKyBoZWFkX29mZnNldCk7CisJfQorCisJTlZTZXRFbmFibGVQYWxldHRlKGRldiwgaGVhZCwgZmFsc2UpOworfQorCit2b2lkCitub3V2ZWF1X2h3X2xvYWRfc3RhdGVfcGFsZXR0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCwKKwkJCSAgICAgIHN0cnVjdCBudjA0X21vZGVfc3RhdGUgKnN0YXRlKQoreworCWludCBoZWFkX29mZnNldCA9IGhlYWQgKiBOVl9QUk1ESU9fU0laRSwgaTsKKworCW52X3dyMDgoZGV2LCBOVl9QUk1ESU9fUElYRUxfTUFTSyArIGhlYWRfb2Zmc2V0LAorCQkJCU5WX1BSTURJT19QSVhFTF9NQVNLX01BU0spOworCW52X3dyMDgoZGV2LCBOVl9QUk1ESU9fV1JJVEVfTU9ERV9BRERSRVNTICsgaGVhZF9vZmZzZXQsIDB4MCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNzY4OyBpKyspIHsKKwkJbnZfd3IwOChkZXYsIE5WX1BSTURJT19QQUxFVFRFX0RBVEEgKyBoZWFkX29mZnNldCwKKwkJCQlzdGF0ZS0+Y3J0Y19yZWdbaGVhZF0uREFDW2ldKTsKKwl9CisKKwlOVlNldEVuYWJsZVBhbGV0dGUoZGV2LCBoZWFkLCBmYWxzZSk7Cit9CisKK3ZvaWQgbm91dmVhdV9od19zYXZlX3N0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkLAorCQkJICAgc3RydWN0IG52MDRfbW9kZV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDExKQorCQkvKiBOQjogbm8gYXR0ZW1wdCBpcyBtYWRlIHRvIHJlc3RvcmUgdGhlIGJhZCBwbGwgbGF0ZXIgb24gKi8KKwkJbm91dmVhdV9od19maXhfYmFkX3ZwbGwoZGV2LCBoZWFkKTsKKwludl9zYXZlX3N0YXRlX3JhbWRhYyhkZXYsIGhlYWQsIHN0YXRlKTsKKwludl9zYXZlX3N0YXRlX3ZnYShkZXYsIGhlYWQsIHN0YXRlKTsKKwludl9zYXZlX3N0YXRlX3BhbGV0dGUoZGV2LCBoZWFkLCBzdGF0ZSk7CisJbnZfc2F2ZV9zdGF0ZV9leHQoZGV2LCBoZWFkLCBzdGF0ZSk7Cit9CisKK3ZvaWQgbm91dmVhdV9od19sb2FkX3N0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkLAorCQkJICAgc3RydWN0IG52MDRfbW9kZV9zdGF0ZSAqc3RhdGUpCit7CisJTlZWZ2FQcm90ZWN0KGRldiwgaGVhZCwgdHJ1ZSk7CisJbnZfbG9hZF9zdGF0ZV9yYW1kYWMoZGV2LCBoZWFkLCBzdGF0ZSk7CisJbnZfbG9hZF9zdGF0ZV9leHQoZGV2LCBoZWFkLCBzdGF0ZSk7CisJbm91dmVhdV9od19sb2FkX3N0YXRlX3BhbGV0dGUoZGV2LCBoZWFkLCBzdGF0ZSk7CisJbnZfbG9hZF9zdGF0ZV92Z2EoZGV2LCBoZWFkLCBzdGF0ZSk7CisJTlZWZ2FQcm90ZWN0KGRldiwgaGVhZCwgZmFsc2UpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9ody5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9ody5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OTEzMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2h3LmgKQEAgLTAsMCArMSw0NTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBTdHVhcnQgQmVubmV0dAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX05PVVZFQVVfSFdfSF9fCisjZGVmaW5lIF9fTk9VVkVBVV9IV19IX18KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorCisjZGVmaW5lIE1BU0soZmllbGQpICggXAorCSgweGZmZmZmZmZmID4+ICgzMSAtICgoMSA/IGZpZWxkKSAtICgwID8gZmllbGQpKSkpIDw8ICgwID8gZmllbGQpKQorCisjZGVmaW5lIFhMQVRFKHNyYywgc3JjbG93Yml0LCBvdXRmaWVsZCkgKCBcCisJKCgoc3JjKSA+PiAoc3JjbG93Yml0KSkgPDwgKDAgPyBvdXRmaWVsZCkpICYgTUFTSyhvdXRmaWVsZCkpCisKK3ZvaWQgTlZXcml0ZVZnYVNlcShzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQgaGVhZCwgdWludDhfdCBpbmRleCwgdWludDhfdCB2YWx1ZSk7Cit1aW50OF90IE5WUmVhZFZnYVNlcShzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQgaGVhZCwgdWludDhfdCBpbmRleCk7Cit2b2lkIE5WV3JpdGVWZ2FHcihzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQgaGVhZCwgdWludDhfdCBpbmRleCwgdWludDhfdCB2YWx1ZSk7Cit1aW50OF90IE5WUmVhZFZnYUdyKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCBoZWFkLCB1aW50OF90IGluZGV4KTsKK3ZvaWQgTlZTZXRPd25lcihzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQgb3duZXIpOwordm9pZCBOVkJsYW5rU2NyZWVuKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCBoZWFkLCBib29sIGJsYW5rKTsKK3ZvaWQgbm91dmVhdV9od19zZXRwbGwoc3RydWN0IGRybV9kZXZpY2UgKiwgdWludDMyX3QgcmVnMSwKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X3BsbF92YWxzICpwdik7CitpbnQgbm91dmVhdV9od19nZXRfcGxsdmFscyhzdHJ1Y3QgZHJtX2RldmljZSAqLCBlbnVtIHBsbF90eXBlcyBwbGx0eXBlLAorCQkJICAgc3RydWN0IG5vdXZlYXVfcGxsX3ZhbHMgKnBsbHZhbHMpOworaW50IG5vdXZlYXVfaHdfcGxsdmFsc190b19jbGsoc3RydWN0IG5vdXZlYXVfcGxsX3ZhbHMgKnBsbHZhbHMpOworaW50IG5vdXZlYXVfaHdfZ2V0X2Nsb2NrKHN0cnVjdCBkcm1fZGV2aWNlICosIGVudW0gcGxsX3R5cGVzIHBsbHR5cGUpOwordm9pZCBub3V2ZWF1X2h3X3NhdmVfdmdhX2ZvbnRzKHN0cnVjdCBkcm1fZGV2aWNlICosIGJvb2wgc2F2ZSk7Cit2b2lkIG5vdXZlYXVfaHdfc2F2ZV9zdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQgaGVhZCwKKwkJCSAgIHN0cnVjdCBudjA0X21vZGVfc3RhdGUgKnN0YXRlKTsKK3ZvaWQgbm91dmVhdV9od19sb2FkX3N0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCBoZWFkLAorCQkJICAgc3RydWN0IG52MDRfbW9kZV9zdGF0ZSAqc3RhdGUpOwordm9pZCBub3V2ZWF1X2h3X2xvYWRfc3RhdGVfcGFsZXR0ZShzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQgaGVhZCwKKwkJCQkgICBzdHJ1Y3QgbnYwNF9tb2RlX3N0YXRlICpzdGF0ZSk7CisKKy8qIG5vdXZlYXVfY2FsYy5jICovCitleHRlcm4gdm9pZCBub3V2ZWF1X2NhbGNfYXJiKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCB2Y2xrLCBpbnQgYnBwLAorCQkJICAgICBpbnQgKmJ1cnN0LCBpbnQgKmx3bSk7CitleHRlcm4gaW50IG5vdXZlYXVfY2FsY19wbGxfbW5wKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBwbGxfbGltcyAqcGxsX2xpbSwKKwkJCQlpbnQgY2xrLCBzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyAqcHYpOworCitzdGF0aWMgaW5saW5lIHVpbnQzMl90CitudlJlYWRNQyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCByZWcpCit7CisJdWludDMyX3QgdmFsID0gbnZfcmQzMihkZXYsIHJlZyk7CisJTlZfUkVHX0RFQlVHKE1DLCBkZXYsICJyZWcgJTA4eCB2YWwgJTA4eFxuIiwgcmVnLCB2YWwpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbnZXcml0ZU1DKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3QgdmFsKQoreworCU5WX1JFR19ERUJVRyhNQywgZGV2LCAicmVnICUwOHggdmFsICUwOHhcbiIsIHJlZywgdmFsKTsKKwludl93cjMyKGRldiwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90CitudlJlYWRWSURFTyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCByZWcpCit7CisJdWludDMyX3QgdmFsID0gbnZfcmQzMihkZXYsIHJlZyk7CisJTlZfUkVHX0RFQlVHKFZJREVPLCBkZXYsICJyZWcgJTA4eCB2YWwgJTA4eFxuIiwgcmVnLCB2YWwpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbnZXcml0ZVZJREVPKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3QgdmFsKQoreworCU5WX1JFR19ERUJVRyhWSURFTywgZGV2LCAicmVnICUwOHggdmFsICUwOHhcbiIsIHJlZywgdmFsKTsKKwludl93cjMyKGRldiwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90CitudlJlYWRGQihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCByZWcpCit7CisJdWludDMyX3QgdmFsID0gbnZfcmQzMihkZXYsIHJlZyk7CisJTlZfUkVHX0RFQlVHKEZCLCBkZXYsICJyZWcgJTA4eCB2YWwgJTA4eFxuIiwgcmVnLCB2YWwpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbnZXcml0ZUZCKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3QgdmFsKQoreworCU5WX1JFR19ERUJVRyhGQiwgZGV2LCAicmVnICUwOHggdmFsICUwOHhcbiIsIHJlZywgdmFsKTsKKwludl93cjMyKGRldiwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90CitudlJlYWRFWFRERVYoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgcmVnKQoreworCXVpbnQzMl90IHZhbCA9IG52X3JkMzIoZGV2LCByZWcpOworCU5WX1JFR19ERUJVRyhFWFRERVYsIGRldiwgInJlZyAlMDh4IHZhbCAlMDh4XG4iLCByZWcsIHZhbCk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitudldyaXRlRVhUREVWKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3QgdmFsKQoreworCU5WX1JFR19ERUJVRyhFWFRERVYsIGRldiwgInJlZyAlMDh4IHZhbCAlMDh4XG4iLCByZWcsIHZhbCk7CisJbnZfd3IzMihkZXYsIHJlZywgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBOVlJlYWRDUlRDKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCWludCBoZWFkLCB1aW50MzJfdCByZWcpCit7CisJdWludDMyX3QgdmFsOworCWlmIChoZWFkKQorCQlyZWcgKz0gTlZfUENSVEMwX1NJWkU7CisJdmFsID0gbnZfcmQzMihkZXYsIHJlZyk7CisJTlZfUkVHX0RFQlVHKENSVEMsIGRldiwgImhlYWQgJWQgcmVnICUwOHggdmFsICUwOHhcbiIsIGhlYWQsIHJlZywgdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgTlZXcml0ZUNSVEMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJaW50IGhlYWQsIHVpbnQzMl90IHJlZywgdWludDMyX3QgdmFsKQoreworCWlmIChoZWFkKQorCQlyZWcgKz0gTlZfUENSVEMwX1NJWkU7CisJTlZfUkVHX0RFQlVHKENSVEMsIGRldiwgImhlYWQgJWQgcmVnICUwOHggdmFsICUwOHhcbiIsIGhlYWQsIHJlZywgdmFsKTsKKwludl93cjMyKGRldiwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE5WUmVhZFJBTURBQyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQlpbnQgaGVhZCwgdWludDMyX3QgcmVnKQoreworCXVpbnQzMl90IHZhbDsKKwlpZiAoaGVhZCkKKwkJcmVnICs9IE5WX1BSQU1EQUMwX1NJWkU7CisJdmFsID0gbnZfcmQzMihkZXYsIHJlZyk7CisJTlZfUkVHX0RFQlVHKFJBTURBQywgZGV2LCAiaGVhZCAlZCByZWcgJTA4eCB2YWwgJTA4eFxuIiwKKwkJCQkJCQloZWFkLCByZWcsIHZhbCk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIE5WV3JpdGVSQU1EQUMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJaW50IGhlYWQsIHVpbnQzMl90IHJlZywgdWludDMyX3QgdmFsKQoreworCWlmIChoZWFkKQorCQlyZWcgKz0gTlZfUFJBTURBQzBfU0laRTsKKwlOVl9SRUdfREVCVUcoUkFNREFDLCBkZXYsICJoZWFkICVkIHJlZyAlMDh4IHZhbCAlMDh4XG4iLAorCQkJCQkJCWhlYWQsIHJlZywgdmFsKTsKKwludl93cjMyKGRldiwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgbnZfcmVhZF90bWRzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCWludCBvciwgaW50IGRsLCB1aW50OF90IGFkZHJlc3MpCit7CisJaW50IHJhbWRhYyA9IChvciAmIE9VVFBVVF9DKSA+PiAyOworCisJTlZXcml0ZVJBTURBQyhkZXYsIHJhbWRhYywgTlZfUFJBTURBQ19GUF9UTURTX0NPTlRST0wgKyBkbCAqIDgsCisJTlZfUFJBTURBQ19GUF9UTURTX0NPTlRST0xfV1JJVEVfRElTQUJMRSB8IGFkZHJlc3MpOworCXJldHVybiBOVlJlYWRSQU1EQUMoZGV2LCByYW1kYWMsIE5WX1BSQU1EQUNfRlBfVE1EU19EQVRBICsgZGwgKiA4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG52X3dyaXRlX3RtZHMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJaW50IG9yLCBpbnQgZGwsIHVpbnQ4X3QgYWRkcmVzcywKKwkJCQkJdWludDhfdCBkYXRhKQoreworCWludCByYW1kYWMgPSAob3IgJiBPVVRQVVRfQykgPj4gMjsKKworCU5WV3JpdGVSQU1EQUMoZGV2LCByYW1kYWMsIE5WX1BSQU1EQUNfRlBfVE1EU19EQVRBICsgZGwgKiA4LCBkYXRhKTsKKwlOVldyaXRlUkFNREFDKGRldiwgcmFtZGFjLCBOVl9QUkFNREFDX0ZQX1RNRFNfQ09OVFJPTCArIGRsICogOCwgYWRkcmVzcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBOVldyaXRlVmdhQ3J0YyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQlpbnQgaGVhZCwgdWludDhfdCBpbmRleCwgdWludDhfdCB2YWx1ZSkKK3sKKwlOVl9SRUdfREVCVUcoVkdBQ1JUQywgZGV2LCAiaGVhZCAlZCBpbmRleCAweCUwMnggZGF0YSAweCUwMnhcbiIsCisJCQkJCQkJaGVhZCwgaW5kZXgsIHZhbHVlKTsKKwludl93cjA4KGRldiwgTlZfUFJNQ0lPX0NSWF9fQ09MT1IgKyBoZWFkICogTlZfUFJNQ0lPX1NJWkUsIGluZGV4KTsKKwludl93cjA4KGRldiwgTlZfUFJNQ0lPX0NSX19DT0xPUiArIGhlYWQgKiBOVl9QUk1DSU9fU0laRSwgdmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgTlZSZWFkVmdhQ3J0YyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQlpbnQgaGVhZCwgdWludDhfdCBpbmRleCkKK3sKKwl1aW50OF90IHZhbDsKKwludl93cjA4KGRldiwgTlZfUFJNQ0lPX0NSWF9fQ09MT1IgKyBoZWFkICogTlZfUFJNQ0lPX1NJWkUsIGluZGV4KTsKKwl2YWwgPSBudl9yZDA4KGRldiwgTlZfUFJNQ0lPX0NSX19DT0xPUiArIGhlYWQgKiBOVl9QUk1DSU9fU0laRSk7CisJTlZfUkVHX0RFQlVHKFZHQUNSVEMsIGRldiwgImhlYWQgJWQgaW5kZXggMHglMDJ4IGRhdGEgMHglMDJ4XG4iLAorCQkJCQkJCWhlYWQsIGluZGV4LCB2YWwpOworCXJldHVybiB2YWw7Cit9CisKKy8qIENSNTcgYW5kIENSNTggYXJlIGEgZnVuIHBhaXIgb2YgcmVncy4gQ1I1NyBwcm92aWRlcyBhbiBpbmRleCAoMC0weGYpIGZvciBDUjU4CisgKiBJIHN1c3BlY3QgdGhleSBpbiBmYWN0IGRvIG5vdGhpbmcsIGJ1dCBhcmUgbWVyZWx5IGEgd2F5IHRvIGNhcnJ5IHVzZWZ1bAorICogcGVyLWhlYWQgdmFyaWFibGVzIGFyb3VuZAorICoKKyAqIEtub3duIHVzZXM6CisgKiBDUjU3CQlDUjU4CisgKiAweDAwCQlpbmRleCB0byB0aGUgYXBwcm9wcmlhdGUgZGNiIGVudHJ5IChvciA3ZiBmb3IgaW5hY3RpdmUpCisgKiAweDAyCQlkY2IgZW50cnkncyAib3IiIHZhbHVlIChvciAwMCBmb3IgaW5hY3RpdmUpCisgKiAweDAzCQliaXQwIHNldCBmb3IgZHVhbCBsaW5rIChMVkRTLCBwb3NzaWJseSBlbHNld2hlcmUgdG9vKQorICogMHgwOCBvciAweDA5CXB4Y2xrIGluIE1IegorICogMHgwZgkJbGFwdG9wIHBhbmVsIGluZm8gLQlsb3cgbmliYmxlIGZvciBQRVhUREVWX0JPT1RfMCBzdHJhcAorICogCQkJCQloaWdoIG5pYmJsZSBmb3IgeGxhdCBzdHJhcCB2YWx1ZQorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorTlZXcml0ZVZnYUNydGM1NzU4KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkLCB1aW50OF90IGluZGV4LCB1aW50OF90IHZhbHVlKQoreworCU5WV3JpdGVWZ2FDcnRjKGRldiwgaGVhZCwgTlZfQ0lPX0NSRV81NywgaW5kZXgpOworCU5WV3JpdGVWZ2FDcnRjKGRldiwgaGVhZCwgTlZfQ0lPX0NSRV81OCwgdmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgTlZSZWFkVmdhQ3J0YzU3NTgoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQsIHVpbnQ4X3QgaW5kZXgpCit7CisJTlZXcml0ZVZnYUNydGMoZGV2LCBoZWFkLCBOVl9DSU9fQ1JFXzU3LCBpbmRleCk7CisJcmV0dXJuIE5WUmVhZFZnYUNydGMoZGV2LCBoZWFkLCBOVl9DSU9fQ1JFXzU4KTsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90IE5WUmVhZFBSTVZJTyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQlpbnQgaGVhZCwgdWludDMyX3QgcmVnKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDhfdCB2YWw7CisKKwkvKiBPbmx5IE5WNHggaGF2ZSB0d28gcHZpbyByYW5nZXM7IG90aGVyIHR3b0hlYWRzIGNhcmRzIE1VU1QgY2FsbAorCSAqIE5WU2V0T3duZXIgZm9yIHRoZSByZWxldmFudCBoZWFkIHRvIGJlIHByb2dyYW1tZWQgKi8KKwlpZiAoaGVhZCAmJiBkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzQwKQorCQlyZWcgKz0gTlZfUFJNVklPX1NJWkU7CisKKwl2YWwgPSBudl9yZDA4KGRldiwgcmVnKTsKKwlOVl9SRUdfREVCVUcoUk1WSU8sIGRldiwgImhlYWQgJWQgcmVnICUwOHggdmFsICUwMnhcbiIsIGhlYWQsIHJlZywgdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgTlZXcml0ZVBSTVZJTyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQlpbnQgaGVhZCwgdWludDMyX3QgcmVnLCB1aW50OF90IHZhbHVlKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwkvKiBPbmx5IE5WNHggaGF2ZSB0d28gcHZpbyByYW5nZXM7IG90aGVyIHR3b0hlYWRzIGNhcmRzIE1VU1QgY2FsbAorCSAqIE5WU2V0T3duZXIgZm9yIHRoZSByZWxldmFudCBoZWFkIHRvIGJlIHByb2dyYW1tZWQgKi8KKwlpZiAoaGVhZCAmJiBkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzQwKQorCQlyZWcgKz0gTlZfUFJNVklPX1NJWkU7CisKKwlOVl9SRUdfREVCVUcoUk1WSU8sIGRldiwgImhlYWQgJWQgcmVnICUwOHggdmFsICUwMnhcbiIsCisJCQkJCQloZWFkLCByZWcsIHZhbHVlKTsKKwludl93cjA4KGRldiwgcmVnLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBOVlNldEVuYWJsZVBhbGV0dGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQsIGJvb2wgZW5hYmxlKQoreworCW52X3JkMDgoZGV2LCBOVl9QUk1DSU9fSU5QMF9fQ09MT1IgKyBoZWFkICogTlZfUFJNQ0lPX1NJWkUpOworCW52X3dyMDgoZGV2LCBOVl9QUk1DSU9fQVJYICsgaGVhZCAqIE5WX1BSTUNJT19TSVpFLCBlbmFibGUgPyAwIDogMHgyMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBOVkdldEVuYWJsZVBhbGV0dGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQpCit7CisJbnZfcmQwOChkZXYsIE5WX1BSTUNJT19JTlAwX19DT0xPUiArIGhlYWQgKiBOVl9QUk1DSU9fU0laRSk7CisJcmV0dXJuICEobnZfcmQwOChkZXYsIE5WX1BSTUNJT19BUlggKyBoZWFkICogTlZfUFJNQ0lPX1NJWkUpICYgMHgyMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBOVldyaXRlVmdhQXR0cihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQlpbnQgaGVhZCwgdWludDhfdCBpbmRleCwgdWludDhfdCB2YWx1ZSkKK3sKKwlpZiAoTlZHZXRFbmFibGVQYWxldHRlKGRldiwgaGVhZCkpCisJCWluZGV4ICY9IH4weDIwOworCWVsc2UKKwkJaW5kZXggfD0gMHgyMDsKKworCW52X3JkMDgoZGV2LCBOVl9QUk1DSU9fSU5QMF9fQ09MT1IgKyBoZWFkICogTlZfUFJNQ0lPX1NJWkUpOworCU5WX1JFR19ERUJVRyhWR0FBVFRSLCBkZXYsICJoZWFkICVkIGluZGV4IDB4JTAyeCBkYXRhIDB4JTAyeFxuIiwKKwkJCQkJCQloZWFkLCBpbmRleCwgdmFsdWUpOworCW52X3dyMDgoZGV2LCBOVl9QUk1DSU9fQVJYICsgaGVhZCAqIE5WX1BSTUNJT19TSVpFLCBpbmRleCk7CisJbnZfd3IwOChkZXYsIE5WX1BSTUNJT19BUl9fV1JJVEUgKyBoZWFkICogTlZfUFJNQ0lPX1NJWkUsIHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90IE5WUmVhZFZnYUF0dHIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJaW50IGhlYWQsIHVpbnQ4X3QgaW5kZXgpCit7CisJdWludDhfdCB2YWw7CisJaWYgKE5WR2V0RW5hYmxlUGFsZXR0ZShkZXYsIGhlYWQpKQorCQlpbmRleCAmPSB+MHgyMDsKKwllbHNlCisJCWluZGV4IHw9IDB4MjA7CisKKwludl9yZDA4KGRldiwgTlZfUFJNQ0lPX0lOUDBfX0NPTE9SICsgaGVhZCAqIE5WX1BSTUNJT19TSVpFKTsKKwludl93cjA4KGRldiwgTlZfUFJNQ0lPX0FSWCArIGhlYWQgKiBOVl9QUk1DSU9fU0laRSwgaW5kZXgpOworCXZhbCA9IG52X3JkMDgoZGV2LCBOVl9QUk1DSU9fQVJfX1JFQUQgKyBoZWFkICogTlZfUFJNQ0lPX1NJWkUpOworCU5WX1JFR19ERUJVRyhWR0FBVFRSLCBkZXYsICJoZWFkICVkIGluZGV4IDB4JTAyeCBkYXRhIDB4JTAyeFxuIiwKKwkJCQkJCQloZWFkLCBpbmRleCwgdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgTlZWZ2FTZXFSZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCwgYm9vbCBzdGFydCkKK3sKKwlOVldyaXRlVmdhU2VxKGRldiwgaGVhZCwgTlZfVklPX1NSX1JFU0VUX0lOREVYLCBzdGFydCA/IDB4MSA6IDB4Myk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBOVlZnYVByb3RlY3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQsIGJvb2wgcHJvdGVjdCkKK3sKKwl1aW50OF90IHNlcTEgPSBOVlJlYWRWZ2FTZXEoZGV2LCBoZWFkLCBOVl9WSU9fU1JfQ0xPQ0tfSU5ERVgpOworCisJaWYgKHByb3RlY3QpIHsKKwkJTlZWZ2FTZXFSZXNldChkZXYsIGhlYWQsIHRydWUpOworCQlOVldyaXRlVmdhU2VxKGRldiwgaGVhZCwgTlZfVklPX1NSX0NMT0NLX0lOREVYLCBzZXExIHwgMHgyMCk7CisJfSBlbHNlIHsKKwkJLyogUmVlbmFibGUgc2VxdWVuY2VyLCB0aGVuIHR1cm4gb24gc2NyZWVuICovCisJCU5WV3JpdGVWZ2FTZXEoZGV2LCBoZWFkLCBOVl9WSU9fU1JfQ0xPQ0tfSU5ERVgsIHNlcTEgJiB+MHgyMCk7ICAgLyogcmVlbmFibGUgZGlzcGxheSAqLworCQlOVlZnYVNlcVJlc2V0KGRldiwgaGVhZCwgZmFsc2UpOworCX0KKwlOVlNldEVuYWJsZVBhbGV0dGUoZGV2LCBoZWFkLCBwcm90ZWN0KTsKK30KKworc3RhdGljIGlubGluZSBib29sCitudl9oZWFkc190aWVkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDExKQorCQlyZXR1cm4gISEobnZSZWFkTUMoZGV2LCBOVl9QQlVTX0RFQlVHXzEpICYgKDEgPDwgMjgpKTsKKworCXJldHVybiBOVlJlYWRWZ2FDcnRjKGRldiwgMCwgTlZfQ0lPX0NSRV80NCkgJiAweDQ7Cit9CisKKy8qIG1ha2VzIGNyMC03IG9uIHRoZSBzcGVjaWZpZWQgaGVhZCByZWFkLW9ubHkgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbAorbnZfbG9ja192Z2FfY3J0Y19iYXNlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkLCBib29sIGxvY2spCit7CisJdWludDhfdCBjcjExID0gTlZSZWFkVmdhQ3J0YyhkZXYsIGhlYWQsIE5WX0NJT19DUl9WUkVfSU5ERVgpOworCWJvb2wgd2FzbG9ja2VkID0gY3IxMSAmIDB4ODA7CisKKwlpZiAobG9jaykKKwkJY3IxMSB8PSAweDgwOworCWVsc2UKKwkJY3IxMSAmPSB+MHg4MDsKKwlOVldyaXRlVmdhQ3J0YyhkZXYsIGhlYWQsIE5WX0NJT19DUl9WUkVfSU5ERVgsIGNyMTEpOworCisJcmV0dXJuIHdhc2xvY2tlZDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitudl9sb2NrX3ZnYV9jcnRjX3NoYWRvdyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCwgaW50IGxvY2spCit7CisJLyogc2hhZG93IGxvY2s6IGNvbm5lY3RzIDB4NjA/M2Q/IHJlZ3MgdG8gInJlYWwiIDB4M2Q/IHJlZ3MKKwkgKiBiaXQ3OiB1bmxvY2tzIEhEVCwgSEJTLCBIQkUsIEhSUywgSFJFLCBIRUIKKwkgKiBiaXQ2OiBzZWVtcyB0byBoYXZlIHNvbWUgZWZmZWN0IG9uIENSMDkgKGRvdWJsZSBzY2FuLCBWQlNfOSkKKwkgKiBiaXQ1OiB1bmxvY2tzIEhERQorCSAqIGJpdDQ6IHVubG9ja3MgVkRFCisJICogYml0MzogdW5sb2NrcyBWRFQsIE9WTCwgVlJTLCA/VlJFPywgVkJTLCBWQkUsIExTUiwgRUJSCisJICogYml0Mjogc2FtZSBhcyBiaXQgMSBvZiAweDYwPzgwNAorCSAqIGJpdDA6IHNhbWUgYXMgYml0IDAgb2YgMHg2MD84MDQKKwkgKi8KKworCXVpbnQ4X3QgY3IyMSA9IGxvY2s7CisKKwlpZiAobG9jayA8IDApCisJCS8qIDB4ZmEgaXMgZ2VuZXJpYyAidW5sb2NrIGFsbCIgbWFzayAqLworCQljcjIxID0gTlZSZWFkVmdhQ3J0YyhkZXYsIGhlYWQsIE5WX0NJT19DUkVfMjEpIHwgMHhmYTsKKworCU5WV3JpdGVWZ2FDcnRjKGRldiwgaGVhZCwgTlZfQ0lPX0NSRV8yMSwgY3IyMSk7Cit9CisKKy8qIHJlbmRlcnMgdGhlIGV4dGVuZGVkIGNydGMgcmVncyAoY3IxOSspIG9uIGFsbCBjcnRjcyBpbXBlcnZpb3VzOgorICogaW1tdXRhYmxlIGFuZCB1bnJlYWRhYmxlCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbAorTlZMb2NrVmdhQ3J0Y3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgYm9vbCBsb2NrKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJYm9vbCB3YXNsb2NrZWQgPSAhTlZSZWFkVmdhQ3J0YyhkZXYsIDAsIE5WX0NJT19TUl9MT0NLX0lOREVYKTsKKworCU5WV3JpdGVWZ2FDcnRjKGRldiwgMCwgTlZfQ0lPX1NSX0xPQ0tfSU5ERVgsCisJCSAgICAgICBsb2NrID8gTlZfQ0lPX1NSX0xPQ0tfVkFMVUUgOiBOVl9DSU9fU1JfVU5MT0NLX1JXX1ZBTFVFKTsKKwkvKiBOVjExIGhhcyBpbmRlcGVuZGVudGx5IGxvY2thYmxlIGV4dGVuZGVkIGNydGNzLCBleGNlcHQgd2hlbiB0aWVkICovCisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4MTEgJiYgIW52X2hlYWRzX3RpZWQoZGV2KSkKKwkJTlZXcml0ZVZnYUNydGMoZGV2LCAxLCBOVl9DSU9fU1JfTE9DS19JTkRFWCwKKwkJCSAgICAgICBsb2NrID8gTlZfQ0lPX1NSX0xPQ0tfVkFMVUUgOgorCQkJCSAgICAgIE5WX0NJT19TUl9VTkxPQ0tfUldfVkFMVUUpOworCisJcmV0dXJuIHdhc2xvY2tlZDsKK30KKworLyogbnYwNCBjdXJzb3IgbWF4IGRpbWVuc2lvbnMgb2YgMzJ4MzIgKEExUjVHNUI1KSAqLworI2RlZmluZSBOVjA0X0NVUlNPUl9TSVpFIDMyCisvKiBsaW1pdCBudjEwIGN1cnNvcnMgdG8gNjR4NjQgKEFSR0I4KSAod2UgY291bGQgZ28gdG8gNjR4MjU1KSAqLworI2RlZmluZSBOVjEwX0NVUlNPUl9TSVpFIDY0CisKK3N0YXRpYyBpbmxpbmUgaW50IG52X2N1cnNvcl93aWR0aChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlyZXR1cm4gZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8xMCA/IE5WMTBfQ1VSU09SX1NJWkUgOiBOVjA0X0NVUlNPUl9TSVpFOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK252X2ZpeF9udjQwX2h3X2N1cnNvcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCkKK3sKKwkvKiBvbiBzb21lIG52NDAgKHN1Y2ggYXMgdGhlICJ0cnVlIiAoaW4gdGhlIE5WX1BGQl9CT09UXzAgc2Vuc2UpIG52NDAsCisJICogdGhlIGdmNjgwMGd0KSBhIGhhcmR3YXJlIGJ1ZyByZXF1aXJlcyBhIHdyaXRlIHRvIFBSQU1EQUNfQ1VSU09SX1BPUworCSAqIGZvciBjaGFuZ2VzIHRvIHRoZSBDUlRDIENVUkNUTCByZWdzIHRvIHRha2UgZWZmZWN0LCB3aGV0aGVyIGNoYW5naW5nCisJICogdGhlIHBpeG1hcCBsb2NhdGlvbiwgb3IganVzdCBzaG93aW5nL2hpZGluZyB0aGUgY3Vyc29yCisJICovCisJdWludDMyX3QgY3VycG9zID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19DVV9TVEFSVF9QT1MpOworCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0NVX1NUQVJUX1BPUywgY3VycG9zKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitudl9zaG93X2N1cnNvcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCwgYm9vbCBzaG93KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDhfdCAqY3VyY3RsMSA9CisJCSZkZXZfcHJpdi0+bW9kZV9yZWcuY3J0Y19yZWdbaGVhZF0uQ1JUQ1tOVl9DSU9fQ1JFX0hDVVJfQUREUjFfSU5ERVhdOworCisJaWYgKHNob3cpCisJCSpjdXJjdGwxIHw9IE1BU0soTlZfQ0lPX0NSRV9IQ1VSX0FERFIxX0VOQUJMRSk7CisJZWxzZQorCQkqY3VyY3RsMSAmPSB+TUFTSyhOVl9DSU9fQ1JFX0hDVVJfQUREUjFfRU5BQkxFKTsKKwlOVldyaXRlVmdhQ3J0YyhkZXYsIGhlYWQsIE5WX0NJT19DUkVfSENVUl9BRERSMV9JTkRFWCwgKmN1cmN0bDEpOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNDApCisJCW52X2ZpeF9udjQwX2h3X2N1cnNvcihkZXYsIGhlYWQpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90Citudl9waXRjaF9hbGlnbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCB3aWR0aCwgaW50IGJwcCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBtYXNrOworCisJaWYgKGJwcCA9PSAxNSkKKwkJYnBwID0gMTY7CisJaWYgKGJwcCA9PSAyNCkKKwkJYnBwID0gODsKKworCS8qIEFsaWdubWVudCByZXF1aXJlbWVudHMgdGFrZW4gZnJvbSB0aGUgSGFpa3UgZHJpdmVyICovCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfMDQpCisJCW1hc2sgPSAxMjggLyBicHAgLSAxOworCWVsc2UKKwkJbWFzayA9IDUxMiAvIGJwcCAtIDE7CisKKwlyZXR1cm4gKHdpZHRoICsgbWFzaykgJiB+bWFzazsKK30KKworI2VuZGlmCS8qIF9fTk9VVkVBVV9IV19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaTJjLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2kyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZTk5NGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2kyYy5jCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDkgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogQmVuIFNrZWdncworICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2kyYy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfaHcuaCIKKworc3RhdGljIHZvaWQKK252MDRfaTJjX3NldHNjbCh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmkyYyA9IGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGkyYy0+ZGV2OworCXVpbnQ4X3QgdmFsOworCisJdmFsID0gKE5WUmVhZFZnYUNydGMoZGV2LCAwLCBpMmMtPndyKSAmIDB4ZDApIHwgKHN0YXRlID8gMHgyMCA6IDApOworCU5WV3JpdGVWZ2FDcnRjKGRldiwgMCwgaTJjLT53ciwgdmFsIHwgMHgwMSk7Cit9CisKK3N0YXRpYyB2b2lkCitudjA0X2kyY19zZXRzZGEodm9pZCAqZGF0YSwgaW50IHN0YXRlKQoreworCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICppMmMgPSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpMmMtPmRldjsKKwl1aW50OF90IHZhbDsKKworCXZhbCA9IChOVlJlYWRWZ2FDcnRjKGRldiwgMCwgaTJjLT53cikgJiAweGUwKSB8IChzdGF0ZSA/IDB4MTAgOiAwKTsKKwlOVldyaXRlVmdhQ3J0YyhkZXYsIDAsIGkyYy0+d3IsIHZhbCB8IDB4MDEpOworfQorCitzdGF0aWMgaW50CitudjA0X2kyY19nZXRzY2wodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaTJjLT5kZXY7CisKKwlyZXR1cm4gISEoTlZSZWFkVmdhQ3J0YyhkZXYsIDAsIGkyYy0+cmQpICYgNCk7Cit9CisKK3N0YXRpYyBpbnQKK252MDRfaTJjX2dldHNkYSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICppMmMgPSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpMmMtPmRldjsKKworCXJldHVybiAhIShOVlJlYWRWZ2FDcnRjKGRldiwgMCwgaTJjLT5yZCkgJiA4KTsKK30KKworc3RhdGljIHZvaWQKK252NGVfaTJjX3NldHNjbCh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmkyYyA9IGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGkyYy0+ZGV2OworCXVpbnQ4X3QgdmFsOworCisJdmFsID0gKG52X3JkMzIoZGV2LCBpMmMtPndyKSAmIDB4ZDApIHwgKHN0YXRlID8gMHgyMCA6IDApOworCW52X3dyMzIoZGV2LCBpMmMtPndyLCB2YWwgfCAweDAxKTsKK30KKworc3RhdGljIHZvaWQKK252NGVfaTJjX3NldHNkYSh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmkyYyA9IGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGkyYy0+ZGV2OworCXVpbnQ4X3QgdmFsOworCisJdmFsID0gKG52X3JkMzIoZGV2LCBpMmMtPndyKSAmIDB4ZTApIHwgKHN0YXRlID8gMHgxMCA6IDApOworCW52X3dyMzIoZGV2LCBpMmMtPndyLCB2YWwgfCAweDAxKTsKK30KKworc3RhdGljIGludAorbnY0ZV9pMmNfZ2V0c2NsKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmkyYyA9IGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGkyYy0+ZGV2OworCisJcmV0dXJuICEhKChudl9yZDMyKGRldiwgaTJjLT5yZCkgPj4gMTYpICYgNCk7Cit9CisKK3N0YXRpYyBpbnQKK252NGVfaTJjX2dldHNkYSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICppMmMgPSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpMmMtPmRldjsKKworCXJldHVybiAhISgobnZfcmQzMihkZXYsIGkyYy0+cmQpID4+IDE2KSAmIDgpOworfQorCitzdGF0aWMgaW50CitudjUwX2kyY19nZXRzY2wodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaTJjLT5kZXY7CisKKwlyZXR1cm4gISEobnZfcmQzMihkZXYsIGkyYy0+cmQpICYgMSk7Cit9CisKKworc3RhdGljIGludAorbnY1MF9pMmNfZ2V0c2RhKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmkyYyA9IGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGkyYy0+ZGV2OworCisJcmV0dXJuICEhKG52X3JkMzIoZGV2LCBpMmMtPnJkKSAmIDIpOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9pMmNfc2V0c2NsKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaTJjLT5kZXY7CisKKwludl93cjMyKGRldiwgaTJjLT53ciwgNCB8IChpMmMtPmRhdGEgPyAyIDogMCkgfCAoc3RhdGUgPyAxIDogMCkpOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9pMmNfc2V0c2RhKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaTJjLT5kZXY7CisKKwludl93cjMyKGRldiwgaTJjLT53ciwKKwkJCShudl9yZDMyKGRldiwgaTJjLT5yZCkgJiAxKSB8IDQgfCAoc3RhdGUgPyAyIDogMCkpOworCWkyYy0+ZGF0YSA9IHN0YXRlOworfQorCitzdGF0aWMgY29uc3QgdWludDMyX3QgbnY1MF9pMmNfcG9ydFtdID0geworCTB4MDBlMTM4LCAweDAwZTE1MCwgMHgwMGUxNjgsIDB4MDBlMTgwLAorCTB4MDBlMjU0LCAweDAwZTI3NCwgMHgwMGU3NjQsIDB4MDBlNzgwLAorCTB4MDBlNzljLCAweDAwZTdiOAorfTsKKyNkZWZpbmUgTlY1MF9JMkNfUE9SVFMgQVJSQVlfU0laRShudjUwX2kyY19wb3J0KQorCitpbnQKK25vdXZlYXVfaTJjX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9pMmNfZW50cnkgKmVudHJ5LCBpbnQgaW5kZXgpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjOworCWludCByZXQ7CisKKwlpZiAoZW50cnktPmNoYW4pCisJCXJldHVybiAtRUVYSVNUOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTAgJiYgZW50cnktPnJlYWQgPj0gTlY1MF9JMkNfUE9SVFMpIHsKKwkJTlZfRVJST1IoZGV2LCAidW5rbm93biBpMmMgcG9ydCAlZFxuIiwgZW50cnktPnJlYWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpMmMgPSBremFsbG9jKHNpemVvZigqaTJjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGkyYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN3aXRjaCAoZW50cnktPnBvcnRfdHlwZSkgeworCWNhc2UgMDoKKwkJaTJjLT5hbGdvLmJpdC5zZXRzZGEgPSBudjA0X2kyY19zZXRzZGE7CisJCWkyYy0+YWxnby5iaXQuc2V0c2NsID0gbnYwNF9pMmNfc2V0c2NsOworCQlpMmMtPmFsZ28uYml0LmdldHNkYSA9IG52MDRfaTJjX2dldHNkYTsKKwkJaTJjLT5hbGdvLmJpdC5nZXRzY2wgPSBudjA0X2kyY19nZXRzY2w7CisJCWkyYy0+cmQgPSBlbnRyeS0+cmVhZDsKKwkJaTJjLT53ciA9IGVudHJ5LT53cml0ZTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlpMmMtPmFsZ28uYml0LnNldHNkYSA9IG52NGVfaTJjX3NldHNkYTsKKwkJaTJjLT5hbGdvLmJpdC5zZXRzY2wgPSBudjRlX2kyY19zZXRzY2w7CisJCWkyYy0+YWxnby5iaXQuZ2V0c2RhID0gbnY0ZV9pMmNfZ2V0c2RhOworCQlpMmMtPmFsZ28uYml0LmdldHNjbCA9IG52NGVfaTJjX2dldHNjbDsKKwkJaTJjLT5yZCA9IDB4NjAwODAwICsgZW50cnktPnJlYWQ7CisJCWkyYy0+d3IgPSAweDYwMDgwMCArIGVudHJ5LT53cml0ZTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlpMmMtPmFsZ28uYml0LnNldHNkYSA9IG52NTBfaTJjX3NldHNkYTsKKwkJaTJjLT5hbGdvLmJpdC5zZXRzY2wgPSBudjUwX2kyY19zZXRzY2w7CisJCWkyYy0+YWxnby5iaXQuZ2V0c2RhID0gbnY1MF9pMmNfZ2V0c2RhOworCQlpMmMtPmFsZ28uYml0LmdldHNjbCA9IG52NTBfaTJjX2dldHNjbDsKKwkJaTJjLT5yZCA9IG52NTBfaTJjX3BvcnRbZW50cnktPnJlYWRdOworCQlpMmMtPndyID0gaTJjLT5yZDsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlpMmMtPnJkID0gZW50cnktPnJlYWQ7CisJCWkyYy0+d3IgPSBlbnRyeS0+d3JpdGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCU5WX0VSUk9SKGRldiwgIkRDQiBJMkMgcG9ydCB0eXBlICVkIHVua25vd25cbiIsCisJCQkgZW50cnktPnBvcnRfdHlwZSk7CisJCWtmcmVlKGkyYyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNucHJpbnRmKGkyYy0+YWRhcHRlci5uYW1lLCBzaXplb2YoaTJjLT5hZGFwdGVyLm5hbWUpLAorCQkgIm5vdXZlYXUtJXMtJWQiLCBwY2lfbmFtZShkZXYtPnBkZXYpLCBpbmRleCk7CisJaTJjLT5hZGFwdGVyLm93bmVyID0gVEhJU19NT0RVTEU7CisJaTJjLT5hZGFwdGVyLmRldi5wYXJlbnQgPSAmZGV2LT5wZGV2LT5kZXY7CisJaTJjLT5kZXYgPSBkZXY7CisJaTJjX3NldF9hZGFwZGF0YSgmaTJjLT5hZGFwdGVyLCBpMmMpOworCisJaWYgKGVudHJ5LT5wb3J0X3R5cGUgPCA2KSB7CisJCWkyYy0+YWRhcHRlci5hbGdvX2RhdGEgPSAmaTJjLT5hbGdvLmJpdDsKKwkJaTJjLT5hbGdvLmJpdC51ZGVsYXkgPSA0MDsKKwkJaTJjLT5hbGdvLmJpdC50aW1lb3V0ID0gdXNlY3NfdG9famlmZmllcyg1MDAwKTsKKwkJaTJjLT5hbGdvLmJpdC5kYXRhID0gaTJjOworCQlyZXQgPSBpMmNfYml0X2FkZF9idXMoJmkyYy0+YWRhcHRlcik7CisJfSBlbHNlIHsKKwkJaTJjLT5hZGFwdGVyLmFsZ29fZGF0YSA9ICZpMmMtPmFsZ28uZHA7CisJCWkyYy0+YWxnby5kcC5ydW5uaW5nID0gZmFsc2U7CisJCWkyYy0+YWxnby5kcC5hZGRyZXNzID0gMDsKKwkJaTJjLT5hbGdvLmRwLmF1eF9jaCA9IG5vdXZlYXVfZHBfaTJjX2F1eF9jaDsKKwkJcmV0ID0gaTJjX2RwX2F1eF9hZGRfYnVzKCZpMmMtPmFkYXB0ZXIpOworCX0KKworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGkyYyAlZFxuIiwgaW5kZXgpOworCQlrZnJlZShpMmMpOworCQlyZXR1cm4gcmV0OworCX0KKworCWVudHJ5LT5jaGFuID0gaTJjOworCXJldHVybiAwOworfQorCit2b2lkCitub3V2ZWF1X2kyY19maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfaTJjX2VudHJ5ICplbnRyeSkKK3sKKwlpZiAoIWVudHJ5LT5jaGFuKQorCQlyZXR1cm47CisKKwlpMmNfZGVsX2FkYXB0ZXIoJmVudHJ5LT5jaGFuLT5hZGFwdGVyKTsKKwlrZnJlZShlbnRyeS0+Y2hhbik7CisJZW50cnktPmNoYW4gPSBOVUxMOworfQorCitzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqCitub3V2ZWF1X2kyY19maW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPlZCSU9TOworCisJaWYgKGluZGV4ID4gRENCX01BWF9OVU1fSTJDX0VOVFJJRVMpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFiaW9zLT5iZGNiLmRjYi5pMmNbaW5kZXhdLmNoYW4pIHsKKwkJaWYgKG5vdXZlYXVfaTJjX2luaXQoZGV2LCAmYmlvcy0+YmRjYi5kY2IuaTJjW2luZGV4XSwgaW5kZXgpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGJpb3MtPmJkY2IuZGNiLmkyY1tpbmRleF0uY2hhbjsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9pMmMuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaTJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlYWY3YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaTJjLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA5IFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19OT1VWRUFVX0kyQ19IX18KKyNkZWZpbmUgX19OT1VWRUFVX0kyQ19IX18KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1pZC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgorI2luY2x1ZGUgImRybV9kcF9oZWxwZXIuaCIKKworc3RydWN0IGRjYl9pMmNfZW50cnk7CisKK3N0cnVjdCBub3V2ZWF1X2kyY19jaGFuIHsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgYWRhcHRlcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OworCXVuaW9uIHsKKwkJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGJpdDsKKwkJc3RydWN0IGkyY19hbGdvX2RwX2F1eF9kYXRhIGRwOworCX0gYWxnbzsKKwl1bnNpZ25lZCByZDsKKwl1bnNpZ25lZCB3cjsKKwl1bnNpZ25lZCBkYXRhOworfTsKKworaW50IG5vdXZlYXVfaTJjX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IGRjYl9pMmNfZW50cnkgKiwgaW50IGluZGV4KTsKK3ZvaWQgbm91dmVhdV9pMmNfZmluaShzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZGNiX2kyY19lbnRyeSAqKTsKK3N0cnVjdCBub3V2ZWF1X2kyY19jaGFuICpub3V2ZWF1X2kyY19maW5kKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCBpbmRleCk7CisKK2ludCBub3V2ZWF1X2RwX2kyY19hdXhfY2goc3RydWN0IGkyY19hZGFwdGVyICosIGludCBtb2RlLCB1aW50OF90IHdyaXRlX2J5dGUsCisJCQkgIHVpbnQ4X3QgKnJlYWRfYnl0ZSk7CisKKyNlbmRpZiAvKiBfX05PVVZFQVVfSTJDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9pb2MzMi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9pb2MzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYzMwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2lvYzMyLmMKQEAgLTAsMCArMSw3MiBAQAorLyoqCisgKiBcZmlsZSBtZ2FfaW9jMzIuYworICoKKyAqIDMyLWJpdCBpb2N0bCBjb21wYXRpYmlsaXR5IHJvdXRpbmVzIGZvciB0aGUgTUdBIERSTS4KKyAqCisgKiBcYXV0aG9yIERhdmUgQWlybGllIDxhaXJsaWVkQGxpbnV4LmllPiB3aXRoIGNvZGUgZnJvbSBwYXRjaGVzIGJ5IEVnYmVydCBFaWNoCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgUGF1bCBNYWNrZXJyYXMgMjAwNQorICogQ29weXJpZ2h0IChDKSBFZ2JlcnQgRWljaCAyMDAzLDIwMDQKKyAqIENvcHlyaWdodCAoQykgRGF2ZSBBaXJsaWUgMjAwNQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorCisvKioKKyAqIENhbGxlZCB3aGVuZXZlciBhIDMyLWJpdCBwcm9jZXNzIHJ1bm5pbmcgdW5kZXIgYSA2NC1iaXQga2VybmVsCisgKiBwZXJmb3JtcyBhbiBpb2N0bCBvbiAvZGV2L2RyaS9jYXJkPG4+LgorICoKKyAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KKyAqIFxwYXJhbSBjbWQgY29tbWFuZC4KKyAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudC4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICovCitsb25nIG5vdXZlYXVfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGludCBuciA9IERSTV9JT0NUTF9OUihjbWQpOworCWRybV9pb2N0bF9jb21wYXRfdCAqZm4gPSBOVUxMOworCWludCByZXQ7CisKKwlpZiAobnIgPCBEUk1fQ09NTUFORF9CQVNFKQorCQlyZXR1cm4gZHJtX2NvbXBhdF9pb2N0bChmaWxwLCBjbWQsIGFyZyk7CisKKyNpZiAwCisJaWYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9BUlJBWV9TSVpFKG1nYV9jb21wYXRfaW9jdGxzKSkKKwkJZm4gPSBub3V2ZWF1X2NvbXBhdF9pb2N0bHNbbnIgLSBEUk1fQ09NTUFORF9CQVNFXTsKKyNlbmRpZgorCWxvY2tfa2VybmVsKCk7CSAgLyogWFhYIGZvciBub3cgKi8KKwlpZiAoZm4gIT0gTlVMTCkKKwkJcmV0ID0gKCpmbikoZmlscCwgY21kLCBhcmcpOworCWVsc2UKKwkJcmV0ID0gZHJtX2lvY3RsKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxwLCBjbWQsIGFyZyk7CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MGM3MmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2lycS5jCkBAIC0wLDAgKzEsNzAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEJlbiBTa2VnZ3MuCisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworLyoKKyAqIEF1dGhvcnM6CisgKiAgIEJlbiBTa2VnZ3MgPGRhcmt0YW1hQGlpbmV0Lm5ldC5hdT4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X3JlZy5oIgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgorCisvKiBuZWVkZWQgZm9yIGhvdHBsdWcgaXJxICovCisjaW5jbHVkZSAibm91dmVhdV9jb25uZWN0b3IuaCIKKyNpbmNsdWRlICJudjUwX2Rpc3BsYXkuaCIKKwordm9pZAorbm91dmVhdV9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwkvKiBNYXN0ZXIgZGlzYWJsZSAqLworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19JTlRSX0VOXzAsIDApOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTApIHsKKwkJSU5JVF9XT1JLKCZkZXZfcHJpdi0+aXJxX3dvcmssIG52NTBfZGlzcGxheV9pcnFfaGFuZGxlcl9iaCk7CisJCUlOSVRfTElTVF9IRUFEKCZkZXZfcHJpdi0+dmJsX3dhaXRpbmcpOworCX0KK30KKworaW50Citub3V2ZWF1X2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCS8qIE1hc3RlciBlbmFibGUgKi8KKwludl93cjMyKGRldiwgTlYwM19QTUNfSU5UUl9FTl8wLCBOVl9QTUNfSU5UUl9FTl8wX01BU1RFUl9FTkFCTEUpOworCXJldHVybiAwOworfQorCit2b2lkCitub3V2ZWF1X2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwkvKiBNYXN0ZXIgZGlzYWJsZSAqLworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19JTlRSX0VOXzAsIDApOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2NhbGxfbWV0aG9kKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBjbGFzcywgaW50IG10aGQsIGludCBkYXRhKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNoYW4tPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9tZXRob2QgKmdybTsKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzICpncmM7CisKKwlncmMgPSBkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLmdyY2xhc3M7CisJd2hpbGUgKGdyYy0+aWQpIHsKKwkJaWYgKGdyYy0+aWQgPT0gY2xhc3MpCisJCQlicmVhazsKKwkJZ3JjKys7CisJfQorCisJaWYgKGdyYy0+aWQgIT0gY2xhc3MgfHwgIWdyYy0+bWV0aG9kcykKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlncm0gPSBncmMtPm1ldGhvZHM7CisJd2hpbGUgKGdybS0+aWQpIHsKKwkJaWYgKGdybS0+aWQgPT0gbXRoZCkKKwkJCXJldHVybiBncm0tPmV4ZWMoY2hhbiwgY2xhc3MsIG10aGQsIGRhdGEpOworCQlncm0rKzsKKwl9CisKKwlyZXR1cm4gLUVOT0VOVDsKK30KKworc3RhdGljIGJvb2wKK25vdXZlYXVfZmlmb19zd210aGQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgdWludDMyX3QgYWRkciwgdWludDMyX3QgZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCWNvbnN0IGludCBzdWJjID0gKGFkZHIgPj4gMTMpICYgMHg3OworCWNvbnN0IGludCBtdGhkID0gYWRkciAmIDB4MWZmYzsKKworCWlmIChtdGhkID09IDB4MDAwMCkgeworCQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICpyZWYgPSBOVUxMOworCisJCWlmIChub3V2ZWF1X2dwdW9ial9yZWZfZmluZChjaGFuLCBkYXRhLCAmcmVmKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpZiAocmVmLT5ncHVvYmotPmVuZ2luZSAhPSBOVk9CSl9FTkdJTkVfU1cpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJY2hhbi0+c3dfc3ViY2hhbm5lbFtzdWJjXSA9IHJlZi0+Z3B1b2JqLT5jbGFzczsKKwkJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0VOR0lORSwgbnZfcmQzMihkZXYsCisJCQlOVjA0X1BGSUZPX0NBQ0hFMV9FTkdJTkUpICYgfigweGYgPDwgc3ViYyAqIDQpKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyogaHcgb2JqZWN0ICovCisJaWYgKG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9FTkdJTkUpICYgKDEgPDwgKHN1YmMqNCkpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAobm91dmVhdV9jYWxsX21ldGhvZChjaGFuLCBjaGFuLT5zd19zdWJjaGFubmVsW3N1YmNdLCBtdGhkLCBkYXRhKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkCitub3V2ZWF1X2ZpZm9faXJxX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2VuZ2luZSAqZW5naW5lID0gJmRldl9wcml2LT5lbmdpbmU7CisJdWludDMyX3Qgc3RhdHVzLCByZWFzc2lnbjsKKwlpbnQgY250ID0gMDsKKworCXJlYXNzaWduID0gbnZfcmQzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEVTKSAmIDE7CisJd2hpbGUgKChzdGF0dXMgPSBudl9yZDMyKGRldiwgTlYwM19QRklGT19JTlRSXzApKSAmJiAoY250KysgPCAxMDApKSB7CisJCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBOVUxMOworCQl1aW50MzJfdCBjaGlkLCBnZXQ7CisKKwkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEVTLCAwKTsKKworCQljaGlkID0gZW5naW5lLT5maWZvLmNoYW5uZWxfaWQoZGV2KTsKKwkJaWYgKGNoaWQgPj0gMCAmJiBjaGlkIDwgZW5naW5lLT5maWZvLmNoYW5uZWxzKQorCQkJY2hhbiA9IGRldl9wcml2LT5maWZvc1tjaGlkXTsKKwkJZ2V0ICA9IG52X3JkMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9HRVQpOworCisJCWlmIChzdGF0dXMgJiBOVl9QRklGT19JTlRSX0NBQ0hFX0VSUk9SKSB7CisJCQl1aW50MzJfdCBtdGhkLCBkYXRhOworCQkJaW50IHB0cjsKKworCQkJLyogTlZfUEZJRk9fQ0FDSEUxX0dFVCBhY3R1YWxseSBnb2VzIHRvIDB4ZmZjIGJlZm9yZQorCQkJICogd3JhcHBpbmcgb24gbXkgRzgwIGNoaXBzLCBidXQgQ0FDSEUxIGlzbid0IGJpZworCQkJICogZW5vdWdoIGZvciB0aGlzIG11Y2ggZGF0YS4uIFRlc3RzIHNob3cgdGhhdCBpdAorCQkJICogd3JhcHMgYXJvdW5kIHRvIHRoZSBzdGFydCBhdCBHRVQ9MHg4MDAuLiBObyBjbHVlCisJCQkgKiBhcyB0byB3aHkuLgorCQkJICovCisJCQlwdHIgPSAoZ2V0ICYgMHg3ZmYpID4+IDI7CisKKwkJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNDApIHsKKwkJCQltdGhkID0gbnZfcmQzMihkZXYsCisJCQkJCU5WMDRfUEZJRk9fQ0FDSEUxX01FVEhPRChwdHIpKTsKKwkJCQlkYXRhID0gbnZfcmQzMihkZXYsCisJCQkJCU5WMDRfUEZJRk9fQ0FDSEUxX0RBVEEocHRyKSk7CisJCQl9IGVsc2UgeworCQkJCW10aGQgPSBudl9yZDMyKGRldiwKKwkJCQkJTlY0MF9QRklGT19DQUNIRTFfTUVUSE9EKHB0cikpOworCQkJCWRhdGEgPSBudl9yZDMyKGRldiwKKwkJCQkJTlY0MF9QRklGT19DQUNIRTFfREFUQShwdHIpKTsKKwkJCX0KKworCQkJaWYgKCFjaGFuIHx8ICFub3V2ZWF1X2ZpZm9fc3dtdGhkKGNoYW4sIG10aGQsIGRhdGEpKSB7CisJCQkJTlZfSU5GTyhkZXYsICJQRklGT19DQUNIRV9FUlJPUiAtIENoICVkLyVkICIKKwkJCQkJICAgICAiTXRoZCAweCUwNHggRGF0YSAweCUwOHhcbiIsCisJCQkJCWNoaWQsIChtdGhkID4+IDEzKSAmIDcsIG10aGQgJiAweDFmZmMsCisJCQkJCWRhdGEpOworCQkJfQorCisJCQludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVU0gsIDApOworCQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fSU5UUl8wLAorCQkJCQkJTlZfUEZJRk9fSU5UUl9DQUNIRV9FUlJPUik7CisKKwkJCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMCwKKwkJCQludl9yZDMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDApICYgfjEpOworCQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX0dFVCwgZ2V0ICsgNCk7CisJCQludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDAsCisJCQkJbnZfcmQzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gwKSB8IDEpOworCQkJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0hBU0gsIDApOworCisJCQludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVU0gsCisJCQkJbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVNIKSB8IDEpOworCQkJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX1BVTEwwLCAxKTsKKworCQkJc3RhdHVzICY9IH5OVl9QRklGT19JTlRSX0NBQ0hFX0VSUk9SOworCQl9CisKKwkJaWYgKHN0YXR1cyAmIE5WX1BGSUZPX0lOVFJfRE1BX1BVU0hFUikgeworCQkJTlZfSU5GTyhkZXYsICJQRklGT19ETUFfUFVTSEVSIC0gQ2ggJWRcbiIsIGNoaWQpOworCisJCQlzdGF0dXMgJj0gfk5WX1BGSUZPX0lOVFJfRE1BX1BVU0hFUjsKKwkJCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0lOVFJfMCwKKwkJCQkJCU5WX1BGSUZPX0lOVFJfRE1BX1BVU0hFUik7CisKKwkJCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfU1RBVEUsIDB4MDAwMDAwMDApOworCQkJaWYgKG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfUFVUKSAhPSBnZXQpCisJCQkJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9HRVQsCisJCQkJCQkJCWdldCArIDQpOworCQl9CisKKwkJaWYgKHN0YXR1cykgeworCQkJTlZfSU5GTyhkZXYsICJQRklGT19JTlRSIDB4JTA4eCAtIENoICVkXG4iLAorCQkJCXN0YXR1cywgY2hpZCk7CisJCQludl93cjMyKGRldiwgTlYwM19QRklGT19JTlRSXzAsIHN0YXR1cyk7CisJCQlzdGF0dXMgPSAwOworCQl9CisKKwkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEVTLCByZWFzc2lnbik7CisJfQorCisJaWYgKHN0YXR1cykgeworCQlOVl9JTkZPKGRldiwgIlBGSUZPIHN0aWxsIGFuZ3J5IGFmdGVyICVkIHNwaW5zLCBoYWx0XG4iLCBjbnQpOworCQludl93cjMyKGRldiwgMHgyMTQwLCAwKTsKKwkJbnZfd3IzMihkZXYsIDB4MTQwLCAwKTsKKwl9CisKKwludl93cjMyKGRldiwgTlYwM19QTUNfSU5UUl8wLCBOVl9QTUNfSU5UUl8wX1BGSUZPX1BFTkRJTkcpOworfQorCitzdHJ1Y3Qgbm91dmVhdV9iaXRmaWVsZF9uYW1lcyB7CisJdWludDMyX3QgbWFzazsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworc3RhdGljIHN0cnVjdCBub3V2ZWF1X2JpdGZpZWxkX25hbWVzIG5zdGF0dXNfbmFtZXNbXSA9Cit7CisJeyBOVjA0X1BHUkFQSF9OU1RBVFVTX1NUQVRFX0lOX1VTRSwgICAgICAgIlNUQVRFX0lOX1VTRSIgfSwKKwl7IE5WMDRfUEdSQVBIX05TVEFUVVNfSU5WQUxJRF9TVEFURSwgICAgICAiSU5WQUxJRF9TVEFURSIgfSwKKwl7IE5WMDRfUEdSQVBIX05TVEFUVVNfQkFEX0FSR1VNRU5ULCAgICAgICAiQkFEX0FSR1VNRU5UIiB9LAorCXsgTlYwNF9QR1JBUEhfTlNUQVRVU19QUk9URUNUSU9OX0ZBVUxULCAgICJQUk9URUNUSU9OX0ZBVUxUIiB9Cit9OworCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfYml0ZmllbGRfbmFtZXMgbnN0YXR1c19uYW1lc19udjEwW10gPQoreworCXsgTlYxMF9QR1JBUEhfTlNUQVRVU19TVEFURV9JTl9VU0UsICAgICAgICJTVEFURV9JTl9VU0UiIH0sCisJeyBOVjEwX1BHUkFQSF9OU1RBVFVTX0lOVkFMSURfU1RBVEUsICAgICAgIklOVkFMSURfU1RBVEUiIH0sCisJeyBOVjEwX1BHUkFQSF9OU1RBVFVTX0JBRF9BUkdVTUVOVCwgICAgICAgIkJBRF9BUkdVTUVOVCIgfSwKKwl7IE5WMTBfUEdSQVBIX05TVEFUVVNfUFJPVEVDVElPTl9GQVVMVCwgICAiUFJPVEVDVElPTl9GQVVMVCIgfQorfTsKKworc3RhdGljIHN0cnVjdCBub3V2ZWF1X2JpdGZpZWxkX25hbWVzIG5zb3VyY2VfbmFtZXNbXSA9Cit7CisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX05PVElGSUNBVElPTiwgICAgICAgIk5PVElGSUNBVElPTiIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfREFUQV9FUlJPUiwgICAgICAgICAiREFUQV9FUlJPUiIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfUFJPVEVDVElPTl9FUlJPUiwgICAiUFJPVEVDVElPTl9FUlJPUiIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfUkFOR0VfRVhDRVBUSU9OLCAgICAiUkFOR0VfRVhDRVBUSU9OIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9MSU1JVF9DT0xPUiwgICAgICAgICJMSU1JVF9DT0xPUiIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfTElNSVRfWkVUQSwgICAgICAgICAiTElNSVRfWkVUQSIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfSUxMRUdBTF9NVEhELCAgICAgICAiSUxMRUdBTF9NVEhEIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9ETUFfUl9QUk9URUNUSU9OLCAgICJETUFfUl9QUk9URUNUSU9OIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9ETUFfV19QUk9URUNUSU9OLCAgICJETUFfV19QUk9URUNUSU9OIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9GT1JNQVRfRVhDRVBUSU9OLCAgICJGT1JNQVRfRVhDRVBUSU9OIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9QQVRDSF9FWENFUFRJT04sICAgICJQQVRDSF9FWENFUFRJT04iIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX1NUQVRFX0lOVkFMSUQsICAgICAgIlNUQVRFX0lOVkFMSUQiIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX0RPVUJMRV9OT1RJRlksICAgICAgIkRPVUJMRV9OT1RJRlkiIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX05PVElGWV9JTl9VU0UsICAgICAgIk5PVElGWV9JTl9VU0UiIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX01FVEhPRF9DTlQsICAgICAgICAgIk1FVEhPRF9DTlQiIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX0JGUl9OT1RJRklDQVRJT04sICAgIkJGUl9OT1RJRklDQVRJT04iIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX0RNQV9WVFhfUFJPVEVDVElPTiwgIkRNQV9WVFhfUFJPVEVDVElPTiIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfRE1BX1dJRFRIX0EsICAgICAgICAiRE1BX1dJRFRIX0EiIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX0RNQV9XSURUSF9CLCAgICAgICAgIkRNQV9XSURUSF9CIiB9LAorfTsKKworc3RhdGljIHZvaWQKK25vdXZlYXVfcHJpbnRfYml0ZmllbGRfbmFtZXNfKHVpbnQzMl90IHZhbHVlLAorCQkJCWNvbnN0IHN0cnVjdCBub3V2ZWF1X2JpdGZpZWxkX25hbWVzICpuYW1lbGlzdCwKKwkJCQljb25zdCBpbnQgbmFtZWxpc3RfbGVuKQoreworCS8qCisJICogQ2FsbGVyIG11c3QgaGF2ZSBhbHJlYWR5IHByaW50ZWQgdGhlIEtFUk5fKiBsb2cgbGV2ZWwgZm9yIHVzLgorCSAqIEFsc28gdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWRkaW5nIHRoZSBuZXdsaW5lLgorCSAqLworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBuYW1lbGlzdF9sZW47ICsraSkgeworCQl1aW50MzJfdCBtYXNrID0gbmFtZWxpc3RbaV0ubWFzazsKKwkJaWYgKHZhbHVlICYgbWFzaykgeworCQkJcHJpbnRrKCIgJXMiLCBuYW1lbGlzdFtpXS5uYW1lKTsKKwkJCXZhbHVlICY9IH5tYXNrOworCQl9CisJfQorCWlmICh2YWx1ZSkKKwkJcHJpbnRrKCIgKHVua25vd24gYml0cyAweCUwOHgpIiwgdmFsdWUpOworfQorI2RlZmluZSBub3V2ZWF1X3ByaW50X2JpdGZpZWxkX25hbWVzKHZhbCwgbmFtZWxpc3QpIFwKKwlub3V2ZWF1X3ByaW50X2JpdGZpZWxkX25hbWVzXygodmFsKSwgKG5hbWVsaXN0KSwgQVJSQVlfU0laRShuYW1lbGlzdCkpCisKKworc3RhdGljIGludAorbm91dmVhdV9ncmFwaF9jaGlkX2Zyb21fZ3JjdHgoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IGluc3Q7CisJaW50IGk7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzQwKQorCQlyZXR1cm4gZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOworCWVsc2UKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7CisJCWluc3QgPSAobnZfcmQzMihkZXYsIDB4NDAwMzJjKSAmIDB4ZmZmZmYpIDw8IDQ7CisKKwkJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVsczsgaSsrKSB7CisJCQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmZpZm9zW2ldOworCisJCQlpZiAoIWNoYW4gfHwgIWNoYW4tPnJhbWluX2dyY3R4KQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoaW5zdCA9PSBjaGFuLT5yYW1pbl9ncmN0eC0+aW5zdGFuY2UpCisJCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlpbnN0ID0gKG52X3JkMzIoZGV2LCAweDQwMDMyYykgJiAweGZmZmZmKSA8PCAxMjsKKworCQlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOyBpKyspIHsKKwkJCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbaV07CisKKwkJCWlmICghY2hhbiB8fCAhY2hhbi0+cmFtaW4pCisJCQkJY29udGludWU7CisKKwkJCWlmIChpbnN0ID09IGNoYW4tPnJhbWluLT5pbnN0YW5jZSkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfZ3JhcGhfdHJhcHBlZF9jaGFubmVsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCAqY2hhbm5lbF9yZXQpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmdpbmUgKmVuZ2luZSA9ICZkZXZfcHJpdi0+ZW5naW5lOworCWludCBjaGFubmVsOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl8xMCkKKwkJY2hhbm5lbCA9IChudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9BRERSKSA+PiAyNCkgJiAweGY7CisJZWxzZQorCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNDApCisJCWNoYW5uZWwgPSAobnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX1RSQVBQRURfQUREUikgPj4gMjApICYgMHgxZjsKKwllbHNlCisJCWNoYW5uZWwgPSBub3V2ZWF1X2dyYXBoX2NoaWRfZnJvbV9ncmN0eChkZXYpOworCisJaWYgKGNoYW5uZWwgPj0gZW5naW5lLT5maWZvLmNoYW5uZWxzIHx8ICFkZXZfcHJpdi0+Zmlmb3NbY2hhbm5lbF0pIHsKKwkJTlZfRVJST1IoZGV2LCAiQUlJSSwgaW52YWxpZC9pbmFjdGl2ZSBjaGFubmVsIGlkICVkXG4iLCBjaGFubmVsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJKmNoYW5uZWxfcmV0ID0gY2hhbm5lbDsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IG5vdXZlYXVfcGdyYXBoX3RyYXAgeworCWludCBjaGFubmVsOworCWludCBjbGFzczsKKwlpbnQgc3ViYywgbXRoZCwgc2l6ZTsKKwl1aW50MzJfdCBkYXRhLCBkYXRhMjsKKwl1aW50MzJfdCBuc291cmNlLCBuc3RhdHVzOworfTsKKworc3RhdGljIHZvaWQKK25vdXZlYXVfZ3JhcGhfdHJhcF9pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfdHJhcCAqdHJhcCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IGFkZHJlc3M7CisKKwl0cmFwLT5uc291cmNlID0gdHJhcC0+bnN0YXR1cyA9IDA7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgeworCQl0cmFwLT5uc291cmNlID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX05TT1VSQ0UpOworCQl0cmFwLT5uc3RhdHVzID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX05TVEFUVVMpOworCX0KKworCWlmIChub3V2ZWF1X2dyYXBoX3RyYXBwZWRfY2hhbm5lbChkZXYsICZ0cmFwLT5jaGFubmVsKSkKKwkJdHJhcC0+Y2hhbm5lbCA9IC0xOworCWFkZHJlc3MgPSBudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9BRERSKTsKKworCXRyYXAtPm10aGQgPSBhZGRyZXNzICYgMHgxRkZDOworCXRyYXAtPmRhdGEgPSBudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9EQVRBKTsKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzEwKSB7CisJCXRyYXAtPnN1YmMgID0gKGFkZHJlc3MgPj4gMTMpICYgMHg3OworCX0gZWxzZSB7CisJCXRyYXAtPnN1YmMgID0gKGFkZHJlc3MgPj4gMTYpICYgMHg3OworCQl0cmFwLT5kYXRhMiA9IG52X3JkMzIoZGV2LCBOVjEwX1BHUkFQSF9UUkFQUEVEX0RBVEFfSElHSCk7CisJfQorCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl8xMCkKKwkJdHJhcC0+Y2xhc3MgPSBudl9yZDMyKGRldiwgMHg0MDAxODAgKyB0cmFwLT5zdWJjKjQpICYgMHhGRjsKKwllbHNlIGlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNDApCisJCXRyYXAtPmNsYXNzID0gbnZfcmQzMihkZXYsIDB4NDAwMTYwICsgdHJhcC0+c3ViYyo0KSAmIDB4RkZGOworCWVsc2UgaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkKKwkJdHJhcC0+Y2xhc3MgPSBudl9yZDMyKGRldiwgMHg0MDAxNjAgKyB0cmFwLT5zdWJjKjQpICYgMHhGRkZGOworCWVsc2UKKwkJdHJhcC0+Y2xhc3MgPSBudl9yZDMyKGRldiwgMHg0MDA4MTQpOworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9ncmFwaF9kdW1wX3RyYXBfaW5mbyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCwKKwkJCSAgICAgc3RydWN0IG5vdXZlYXVfcGdyYXBoX3RyYXAgKnRyYXApCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBuc291cmNlID0gdHJhcC0+bnNvdXJjZSwgbnN0YXR1cyA9IHRyYXAtPm5zdGF0dXM7CisKKwlOVl9JTkZPKGRldiwgIiVzIC0gblNvdXJjZToiLCBpZCk7CisJbm91dmVhdV9wcmludF9iaXRmaWVsZF9uYW1lcyhuc291cmNlLCBuc291cmNlX25hbWVzKTsKKwlwcmludGsoIiwgblN0YXR1czoiKTsKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzEwKQorCQlub3V2ZWF1X3ByaW50X2JpdGZpZWxkX25hbWVzKG5zdGF0dXMsIG5zdGF0dXNfbmFtZXMpOworCWVsc2UKKwkJbm91dmVhdV9wcmludF9iaXRmaWVsZF9uYW1lcyhuc3RhdHVzLCBuc3RhdHVzX25hbWVzX252MTApOworCXByaW50aygiXG4iKTsKKworCU5WX0lORk8oZGV2LCAiJXMgLSBDaCAlZC8lZCBDbGFzcyAweCUwNHggTXRoZCAweCUwNHggIgorCQkJCQkiRGF0YSAweCUwOHg6MHglMDh4XG4iLAorCQkJCQlpZCwgdHJhcC0+Y2hhbm5lbCwgdHJhcC0+c3ViYywKKwkJCQkJdHJhcC0+Y2xhc3MsIHRyYXAtPm10aGQsCisJCQkJCXRyYXAtPmRhdGEyLCB0cmFwLT5kYXRhKTsKK30KKworc3RhdGljIGludAorbm91dmVhdV9wZ3JhcGhfaW50cl9zd210aGQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBub3V2ZWF1X3BncmFwaF90cmFwICp0cmFwKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAodHJhcC0+Y2hhbm5lbCA8IDAgfHwKKwkgICAgdHJhcC0+Y2hhbm5lbCA+PSBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHMgfHwKKwkgICAgIWRldl9wcml2LT5maWZvc1t0cmFwLT5jaGFubmVsXSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gbm91dmVhdV9jYWxsX21ldGhvZChkZXZfcHJpdi0+Zmlmb3NbdHJhcC0+Y2hhbm5lbF0sCisJCQkJICAgdHJhcC0+Y2xhc3MsIHRyYXAtPm10aGQsIHRyYXAtPmRhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK25vdXZlYXVfcGdyYXBoX2ludHJfbm90aWZ5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IG5zb3VyY2UpCit7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX3RyYXAgdHJhcDsKKwlpbnQgdW5oYW5kbGVkID0gMDsKKworCW5vdXZlYXVfZ3JhcGhfdHJhcF9pbmZvKGRldiwgJnRyYXApOworCisJaWYgKG5zb3VyY2UgJiBOVjAzX1BHUkFQSF9OU09VUkNFX0lMTEVHQUxfTVRIRCkgeworCQlpZiAobm91dmVhdV9wZ3JhcGhfaW50cl9zd210aGQoZGV2LCAmdHJhcCkpCisJCQl1bmhhbmRsZWQgPSAxOworCX0gZWxzZSB7CisJCXVuaGFuZGxlZCA9IDE7CisJfQorCisJaWYgKHVuaGFuZGxlZCkKKwkJbm91dmVhdV9ncmFwaF9kdW1wX3RyYXBfaW5mbyhkZXYsICJQR1JBUEhfTk9USUZZIiwgJnRyYXApOworfQorCitzdGF0aWMgREVGSU5FX1JBVEVMSU1JVF9TVEFURShub3V2ZWF1X3JhdGVsaW1pdF9zdGF0ZSwgMyAqIEhaLCAyMCk7CisKK3N0YXRpYyBpbnQgbm91dmVhdV9yYXRlbGltaXQodm9pZCkKK3sKKwlyZXR1cm4gX19yYXRlbGltaXQoJm5vdXZlYXVfcmF0ZWxpbWl0X3N0YXRlKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQKK25vdXZlYXVfcGdyYXBoX2ludHJfZXJyb3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgbnNvdXJjZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfdHJhcCB0cmFwOworCWludCB1bmhhbmRsZWQgPSAwOworCisJbm91dmVhdV9ncmFwaF90cmFwX2luZm8oZGV2LCAmdHJhcCk7CisJdHJhcC5uc291cmNlID0gbnNvdXJjZTsKKworCWlmIChuc291cmNlICYgTlYwM19QR1JBUEhfTlNPVVJDRV9JTExFR0FMX01USEQpIHsKKwkJaWYgKG5vdXZlYXVfcGdyYXBoX2ludHJfc3dtdGhkKGRldiwgJnRyYXApKQorCQkJdW5oYW5kbGVkID0gMTsKKwl9IGVsc2UgeworCQl1bmhhbmRsZWQgPSAxOworCX0KKworCWlmICh1bmhhbmRsZWQgJiYgbm91dmVhdV9yYXRlbGltaXQoKSkKKwkJbm91dmVhdV9ncmFwaF9kdW1wX3RyYXBfaW5mbyhkZXYsICJQR1JBUEhfRVJST1IiLCAmdHJhcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbm91dmVhdV9wZ3JhcGhfaW50cl9jb250ZXh0X3N3aXRjaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZW5naW5lICplbmdpbmUgPSAmZGV2X3ByaXYtPmVuZ2luZTsKKwl1aW50MzJfdCBjaGlkOworCisJY2hpZCA9IGVuZ2luZS0+Zmlmby5jaGFubmVsX2lkKGRldik7CisJTlZfREVCVUcoZGV2LCAiUEdSQVBIIGNvbnRleHQgc3dpdGNoIGludGVycnVwdCBjaGFubmVsICV4XG4iLCBjaGlkKTsKKworCXN3aXRjaCAoZGV2X3ByaXYtPmNhcmRfdHlwZSkgeworCWNhc2UgTlZfMDQ6CisJCW52MDRfZ3JhcGhfY29udGV4dF9zd2l0Y2goZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBOVl8xMDoKKwkJbnYxMF9ncmFwaF9jb250ZXh0X3N3aXRjaChkZXYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlOVl9FUlJPUihkZXYsICJDb250ZXh0IHN3aXRjaCBub3QgaW1wbGVtZW50ZWRcbiIpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitub3V2ZWF1X3BncmFwaF9pcnFfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXVpbnQzMl90IHN0YXR1czsKKworCXdoaWxlICgoc3RhdHVzID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIpKSkgeworCQl1aW50MzJfdCBuc291cmNlID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX05TT1VSQ0UpOworCisJCWlmIChzdGF0dXMgJiBOVl9QR1JBUEhfSU5UUl9OT1RJRlkpIHsKKwkJCW5vdXZlYXVfcGdyYXBoX2ludHJfbm90aWZ5KGRldiwgbnNvdXJjZSk7CisKKwkJCXN0YXR1cyAmPSB+TlZfUEdSQVBIX0lOVFJfTk9USUZZOworCQkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIE5WX1BHUkFQSF9JTlRSX05PVElGWSk7CisJCX0KKworCQlpZiAoc3RhdHVzICYgTlZfUEdSQVBIX0lOVFJfRVJST1IpIHsKKwkJCW5vdXZlYXVfcGdyYXBoX2ludHJfZXJyb3IoZGV2LCBuc291cmNlKTsKKworCQkJc3RhdHVzICY9IH5OVl9QR1JBUEhfSU5UUl9FUlJPUjsKKwkJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCBOVl9QR1JBUEhfSU5UUl9FUlJPUik7CisJCX0KKworCQlpZiAoc3RhdHVzICYgTlZfUEdSQVBIX0lOVFJfQ09OVEVYVF9TV0lUQ0gpIHsKKwkJCW5vdXZlYXVfcGdyYXBoX2ludHJfY29udGV4dF9zd2l0Y2goZGV2KTsKKworCQkJc3RhdHVzICY9IH5OVl9QR1JBUEhfSU5UUl9DT05URVhUX1NXSVRDSDsKKwkJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLAorCQkJCSBOVl9QR1JBUEhfSU5UUl9DT05URVhUX1NXSVRDSCk7CisJCX0KKworCQlpZiAoc3RhdHVzKSB7CisJCQlOVl9JTkZPKGRldiwgIlVuaGFuZGxlZCBQR1JBUEhfSU5UUiAtIDB4JTA4eFxuIiwgc3RhdHVzKTsKKwkJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCBzdGF0dXMpOworCQl9CisKKwkJaWYgKChudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfRklGTykgJiAoMSA8PCAwKSkgPT0gMCkKKwkJCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9GSUZPLCAxKTsKKwl9CisKKwludl93cjMyKGRldiwgTlYwM19QTUNfSU5UUl8wLCBOVl9QTUNfSU5UUl8wX1BHUkFQSF9QRU5ESU5HKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfcGdyYXBoX2lycV9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdWludDMyX3Qgc3RhdHVzLCBuc291cmNlOworCisJc3RhdHVzID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIpOworCW5zb3VyY2UgPSBudl9yZDMyKGRldiwgTlYwM19QR1JBUEhfTlNPVVJDRSk7CisKKwlpZiAoc3RhdHVzICYgMHgwMDAwMDAwMSkgeworCQlub3V2ZWF1X3BncmFwaF9pbnRyX25vdGlmeShkZXYsIG5zb3VyY2UpOworCQlzdGF0dXMgJj0gfjB4MDAwMDAwMDE7CisJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCAweDAwMDAwMDAxKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgMHgwMDAwMDAxMCkgeworCQlub3V2ZWF1X3BncmFwaF9pbnRyX2Vycm9yKGRldiwgbnNvdXJjZSB8CisJCQkJCSAgTlYwM19QR1JBUEhfTlNPVVJDRV9JTExFR0FMX01USEQpOworCisJCXN0YXR1cyAmPSB+MHgwMDAwMDAxMDsKKwkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIDB4MDAwMDAwMTApOworCX0KKworCWlmIChzdGF0dXMgJiAweDAwMDAxMDAwKSB7CisJCW52X3dyMzIoZGV2LCAweDQwMDUwMCwgMHgwMDAwMDAwMCk7CisJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCBOVl9QR1JBUEhfSU5UUl9DT05URVhUX1NXSVRDSCk7CisJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9JTlRSX0VOLCBudl9yZDMyKGRldiwKKwkJCU5WNDBfUEdSQVBIX0lOVFJfRU4pICYgfk5WX1BHUkFQSF9JTlRSX0NPTlRFWFRfU1dJVENIKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwNTAwLCAweDAwMDEwMDAxKTsKKworCQludjUwX2dyYXBoX2NvbnRleHRfc3dpdGNoKGRldik7CisKKwkJc3RhdHVzICY9IH5OVl9QR1JBUEhfSU5UUl9DT05URVhUX1NXSVRDSDsKKwl9CisKKwlpZiAoc3RhdHVzICYgMHgwMDEwMDAwMCkgeworCQlub3V2ZWF1X3BncmFwaF9pbnRyX2Vycm9yKGRldiwgbnNvdXJjZSB8CisJCQkJCSAgTlYwM19QR1JBUEhfTlNPVVJDRV9EQVRBX0VSUk9SKTsKKworCQlzdGF0dXMgJj0gfjB4MDAxMDAwMDA7CisJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCAweDAwMTAwMDAwKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgMHgwMDIwMDAwMCkgeworCQlpbnQgcjsKKworCQlub3V2ZWF1X3BncmFwaF9pbnRyX2Vycm9yKGRldiwgbnNvdXJjZSB8CisJCQkJCSAgTlYwM19QR1JBUEhfTlNPVVJDRV9QUk9URUNUSU9OX0VSUk9SKTsKKworCQlOVl9FUlJPUihkZXYsICJtYWdpYyBzZXQgMTpcbiIpOworCQlmb3IgKHIgPSAweDQwODkwMDsgciA8PSAweDQwODkxMDsgciArPSA0KQorCQkJTlZfRVJST1IoZGV2LCAiXHQweCUwOHg6IDB4JTA4eFxuIiwgciwgbnZfcmQzMihkZXYsIHIpKTsKKwkJbnZfd3IzMihkZXYsIDB4NDA4OTAwLCBudl9yZDMyKGRldiwgMHg0MDg5MDQpIHwgMHhjMDAwMDAwMCk7CisJCWZvciAociA9IDB4NDA4ZTA4OyByIDw9IDB4NDA4ZTI0OyByICs9IDQpCisJCQlOVl9FUlJPUihkZXYsICJcdDB4JTA4eDogMHglMDh4XG4iLCByLCBudl9yZDMyKGRldiwgcikpOworCQludl93cjMyKGRldiwgMHg0MDhlMDgsIG52X3JkMzIoZGV2LCAweDQwOGUwOCkgfCAweGMwMDAwMDAwKTsKKworCQlOVl9FUlJPUihkZXYsICJtYWdpYyBzZXQgMjpcbiIpOworCQlmb3IgKHIgPSAweDQwOTkwMDsgciA8PSAweDQwOTkxMDsgciArPSA0KQorCQkJTlZfRVJST1IoZGV2LCAiXHQweCUwOHg6IDB4JTA4eFxuIiwgciwgbnZfcmQzMihkZXYsIHIpKTsKKwkJbnZfd3IzMihkZXYsIDB4NDA5OTAwLCBudl9yZDMyKGRldiwgMHg0MDk5MDQpIHwgMHhjMDAwMDAwMCk7CisJCWZvciAociA9IDB4NDA5ZTA4OyByIDw9IDB4NDA5ZTI0OyByICs9IDQpCisJCQlOVl9FUlJPUihkZXYsICJcdDB4JTA4eDogMHglMDh4XG4iLCByLCBudl9yZDMyKGRldiwgcikpOworCQludl93cjMyKGRldiwgMHg0MDllMDgsIG52X3JkMzIoZGV2LCAweDQwOWUwOCkgfCAweGMwMDAwMDAwKTsKKworCQlzdGF0dXMgJj0gfjB4MDAyMDAwMDA7CisJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9OU09VUkNFLCBuc291cmNlKTsKKwkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIDB4MDAyMDAwMDApOworCX0KKworCWlmIChzdGF0dXMpIHsKKwkJTlZfSU5GTyhkZXYsICJVbmhhbmRsZWQgUEdSQVBIX0lOVFIgLSAweCUwOHhcbiIsIHN0YXR1cyk7CisJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCBzdGF0dXMpOworCX0KKworCXsKKwkJY29uc3QgaW50IGlzYiA9ICgxIDw8IDE2KSB8ICgxIDw8IDApOworCisJCWlmICgobnZfcmQzMihkZXYsIDB4NDAwNTAwKSAmIGlzYikgIT0gaXNiKQorCQkJbnZfd3IzMihkZXYsIDB4NDAwNTAwLCBudl9yZDMyKGRldiwgMHg0MDA1MDApIHwgaXNiKTsKKwl9CisKKwludl93cjMyKGRldiwgTlYwM19QTUNfSU5UUl8wLCBOVl9QTUNfSU5UUl8wX1BHUkFQSF9QRU5ESU5HKTsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfY3J0Y19pcnFfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YykKK3sKKwlpZiAoY3J0YyAmIDEpCisJCW52X3dyMzIoZGV2LCBOVl9DUlRDMF9JTlRTVEFULCBOVl9DUlRDX0lOVFJfVkJMQU5LKTsKKworCWlmIChjcnRjICYgMikKKwkJbnZfd3IzMihkZXYsIE5WX0NSVEMxX0lOVFNUQVQsIE5WX0NSVENfSU5UUl9WQkxBTkspOworfQorCitpcnFyZXR1cm5fdAorbm91dmVhdV9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKWFyZzsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IHN0YXR1cywgZmJkZXZfZmxhZ3MgPSAwOworCisJc3RhdHVzID0gbnZfcmQzMihkZXYsIE5WMDNfUE1DX0lOVFJfMCk7CisJaWYgKCFzdGF0dXMpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWlmIChkZXZfcHJpdi0+ZmJkZXZfaW5mbykgeworCQlmYmRldl9mbGFncyA9IGRldl9wcml2LT5mYmRldl9pbmZvLT5mbGFnczsKKwkJZGV2X3ByaXYtPmZiZGV2X2luZm8tPmZsYWdzIHw9IEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEOworCX0KKworCWlmIChzdGF0dXMgJiBOVl9QTUNfSU5UUl8wX1BGSUZPX1BFTkRJTkcpIHsKKwkJbm91dmVhdV9maWZvX2lycV9oYW5kbGVyKGRldik7CisJCXN0YXR1cyAmPSB+TlZfUE1DX0lOVFJfMF9QRklGT19QRU5ESU5HOworCX0KKworCWlmIChzdGF0dXMgJiBOVl9QTUNfSU5UUl8wX1BHUkFQSF9QRU5ESU5HKSB7CisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKQorCQkJbnY1MF9wZ3JhcGhfaXJxX2hhbmRsZXIoZGV2KTsKKwkJZWxzZQorCQkJbm91dmVhdV9wZ3JhcGhfaXJxX2hhbmRsZXIoZGV2KTsKKworCQlzdGF0dXMgJj0gfk5WX1BNQ19JTlRSXzBfUEdSQVBIX1BFTkRJTkc7CisJfQorCisJaWYgKHN0YXR1cyAmIE5WX1BNQ19JTlRSXzBfQ1JUQ25fUEVORElORykgeworCQlub3V2ZWF1X2NydGNfaXJxX2hhbmRsZXIoZGV2LCAoc3RhdHVzPj4yNCkmMyk7CisJCXN0YXR1cyAmPSB+TlZfUE1DX0lOVFJfMF9DUlRDbl9QRU5ESU5HOworCX0KKworCWlmIChzdGF0dXMgJiAoTlZfUE1DX0lOVFJfMF9OVjUwX0RJU1BMQVlfUEVORElORyB8CisJCSAgICAgIE5WX1BNQ19JTlRSXzBfTlY1MF9JMkNfUEVORElORykpIHsKKwkJbnY1MF9kaXNwbGF5X2lycV9oYW5kbGVyKGRldik7CisJCXN0YXR1cyAmPSB+KE5WX1BNQ19JTlRSXzBfTlY1MF9ESVNQTEFZX1BFTkRJTkcgfAorCQkJICAgIE5WX1BNQ19JTlRSXzBfTlY1MF9JMkNfUEVORElORyk7CisJfQorCisJaWYgKHN0YXR1cykKKwkJTlZfRVJST1IoZGV2LCAiVW5oYW5kbGVkIFBNQyBJTlRSIHN0YXR1cyBiaXRzIDB4JTA4eFxuIiwgc3RhdHVzKTsKKworCWlmIChkZXZfcHJpdi0+ZmJkZXZfaW5mbykKKwkJZGV2X3ByaXYtPmZiZGV2X2luZm8tPmZsYWdzID0gZmJkZXZfZmxhZ3M7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21lbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjc1NTcxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tZW0uYwpAQCAtMCwwICsxLDU2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgVGhlIFdlYXRoZXIgQ2hhbm5lbCwgSW5jLiAgMjAwMi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNSBTdGVwaGFuZSBNYXJjaGVzaW4KKyAqCisgKiBUaGUgV2VhdGhlciBDaGFubmVsIChUTSkgZnVuZGVkIFR1bmdzdGVuIEdyYXBoaWNzIHRvIGRldmVsb3AgdGhlCisgKiBpbml0aWFsIHJlbGVhc2Ugb2YgdGhlIFJhZGVvbiA4NTAwIGRyaXZlciB1bmRlciB0aGUgWEZyZWU4NiBsaWNlbnNlLgorICogVGhpcyBub3RpY2UgbXVzdCBiZSBwcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIEFORC9PUiBUSEVJUiBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aEB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KKyAqLworCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiZHJtX3NhcmVhLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKworc3RhdGljIHN0cnVjdCBtZW1fYmxvY2sgKgorc3BsaXRfYmxvY2soc3RydWN0IG1lbV9ibG9jayAqcCwgdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IHNpemUsCisJICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCS8qIE1heWJlIGN1dCBvZmYgdGhlIHN0YXJ0IG9mIGFuIGV4aXN0aW5nIGJsb2NrICovCisJaWYgKHN0YXJ0ID4gcC0+c3RhcnQpIHsKKwkJc3RydWN0IG1lbV9ibG9jayAqbmV3YmxvY2sgPQorCQkJa21hbGxvYyhzaXplb2YoKm5ld2Jsb2NrKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghbmV3YmxvY2spCisJCQlnb3RvIG91dDsKKwkJbmV3YmxvY2stPnN0YXJ0ID0gc3RhcnQ7CisJCW5ld2Jsb2NrLT5zaXplID0gcC0+c2l6ZSAtIChzdGFydCAtIHAtPnN0YXJ0KTsKKwkJbmV3YmxvY2stPmZpbGVfcHJpdiA9IE5VTEw7CisJCW5ld2Jsb2NrLT5uZXh0ID0gcC0+bmV4dDsKKwkJbmV3YmxvY2stPnByZXYgPSBwOworCQlwLT5uZXh0LT5wcmV2ID0gbmV3YmxvY2s7CisJCXAtPm5leHQgPSBuZXdibG9jazsKKwkJcC0+c2l6ZSAtPSBuZXdibG9jay0+c2l6ZTsKKwkJcCA9IG5ld2Jsb2NrOworCX0KKworCS8qIE1heWJlIGN1dCBvZmYgdGhlIGVuZCBvZiBhbiBleGlzdGluZyBibG9jayAqLworCWlmIChzaXplIDwgcC0+c2l6ZSkgeworCQlzdHJ1Y3QgbWVtX2Jsb2NrICpuZXdibG9jayA9CisJCQlrbWFsbG9jKHNpemVvZigqbmV3YmxvY2spLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFuZXdibG9jaykKKwkJCWdvdG8gb3V0OworCQluZXdibG9jay0+c3RhcnQgPSBzdGFydCArIHNpemU7CisJCW5ld2Jsb2NrLT5zaXplID0gcC0+c2l6ZSAtIHNpemU7CisJCW5ld2Jsb2NrLT5maWxlX3ByaXYgPSBOVUxMOworCQluZXdibG9jay0+bmV4dCA9IHAtPm5leHQ7CisJCW5ld2Jsb2NrLT5wcmV2ID0gcDsKKwkJcC0+bmV4dC0+cHJldiA9IG5ld2Jsb2NrOworCQlwLT5uZXh0ID0gbmV3YmxvY2s7CisJCXAtPnNpemUgPSBzaXplOworCX0KKworb3V0OgorCS8qIE91ciBibG9jayBpcyBpbiB0aGUgbWlkZGxlICovCisJcC0+ZmlsZV9wcml2ID0gZmlsZV9wcml2OworCXJldHVybiBwOworfQorCitzdHJ1Y3QgbWVtX2Jsb2NrICoKK25vdXZlYXVfbWVtX2FsbG9jX2Jsb2NrKHN0cnVjdCBtZW1fYmxvY2sgKmhlYXAsIHVpbnQ2NF90IHNpemUsCisJCQlpbnQgYWxpZ24yLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwgaW50IHRhaWwpCit7CisJc3RydWN0IG1lbV9ibG9jayAqcDsKKwl1aW50NjRfdCBtYXNrID0gKDEgPDwgYWxpZ24yKSAtIDE7CisKKwlpZiAoIWhlYXApCisJCXJldHVybiBOVUxMOworCisJaWYgKHRhaWwpIHsKKwkJbGlzdF9mb3JfZWFjaF9wcmV2KHAsIGhlYXApIHsKKwkJCXVpbnQ2NF90IHN0YXJ0ID0gKChwLT5zdGFydCArIHAtPnNpemUpIC0gc2l6ZSkgJiB+bWFzazsKKworCQkJaWYgKHAtPmZpbGVfcHJpdiA9PSBOVUxMICYmIHN0YXJ0ID49IHAtPnN0YXJ0ICYmCisJCQkgICAgc3RhcnQgKyBzaXplIDw9IHAtPnN0YXJ0ICsgcC0+c2l6ZSkKKwkJCQlyZXR1cm4gc3BsaXRfYmxvY2socCwgc3RhcnQsIHNpemUsIGZpbGVfcHJpdik7CisJCX0KKwl9IGVsc2UgeworCQlsaXN0X2Zvcl9lYWNoKHAsIGhlYXApIHsKKwkJCXVpbnQ2NF90IHN0YXJ0ID0gKHAtPnN0YXJ0ICsgbWFzaykgJiB+bWFzazsKKworCQkJaWYgKHAtPmZpbGVfcHJpdiA9PSBOVUxMICYmCisJCQkgICAgc3RhcnQgKyBzaXplIDw9IHAtPnN0YXJ0ICsgcC0+c2l6ZSkKKwkJCQlyZXR1cm4gc3BsaXRfYmxvY2socCwgc3RhcnQsIHNpemUsIGZpbGVfcHJpdik7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBub3V2ZWF1X21lbV9mcmVlX2Jsb2NrKHN0cnVjdCBtZW1fYmxvY2sgKnApCit7CisJcC0+ZmlsZV9wcml2ID0gTlVMTDsKKworCS8qIEFzc3VtZXMgYSBzaW5nbGUgY29udGlndW91cyByYW5nZS4gIE5lZWRzIGEgc3BlY2lhbCBmaWxlX3ByaXYgaW4KKwkgKiAnaGVhcCcgdG8gc3RvcCBpdCBiZWluZyBzdWJzdW1lZC4KKwkgKi8KKwlpZiAocC0+bmV4dC0+ZmlsZV9wcml2ID09IE5VTEwpIHsKKwkJc3RydWN0IG1lbV9ibG9jayAqcSA9IHAtPm5leHQ7CisJCXAtPnNpemUgKz0gcS0+c2l6ZTsKKwkJcC0+bmV4dCA9IHEtPm5leHQ7CisJCXAtPm5leHQtPnByZXYgPSBwOworCQlrZnJlZShxKTsKKwl9CisKKwlpZiAocC0+cHJldi0+ZmlsZV9wcml2ID09IE5VTEwpIHsKKwkJc3RydWN0IG1lbV9ibG9jayAqcSA9IHAtPnByZXY7CisJCXEtPnNpemUgKz0gcC0+c2l6ZTsKKwkJcS0+bmV4dCA9IHAtPm5leHQ7CisJCXEtPm5leHQtPnByZXYgPSBxOworCQlrZnJlZShwKTsKKwl9Cit9CisKKy8qIEluaXRpYWxpemUuICBIb3cgdG8gY2hlY2sgZm9yIGFuIHVuaW5pdGlhbGl6ZWQgaGVhcD8KKyAqLworaW50IG5vdXZlYXVfbWVtX2luaXRfaGVhcChzdHJ1Y3QgbWVtX2Jsb2NrICoqaGVhcCwgdWludDY0X3Qgc3RhcnQsCisJCQkgIHVpbnQ2NF90IHNpemUpCit7CisJc3RydWN0IG1lbV9ibG9jayAqYmxvY2tzID0ga21hbGxvYyhzaXplb2YoKmJsb2NrcyksIEdGUF9LRVJORUwpOworCisJaWYgKCFibG9ja3MpCisJCXJldHVybiAtRU5PTUVNOworCisJKmhlYXAgPSBrbWFsbG9jKHNpemVvZigqKmhlYXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoISpoZWFwKSB7CisJCWtmcmVlKGJsb2Nrcyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWJsb2Nrcy0+c3RhcnQgPSBzdGFydDsKKwlibG9ja3MtPnNpemUgPSBzaXplOworCWJsb2Nrcy0+ZmlsZV9wcml2ID0gTlVMTDsKKwlibG9ja3MtPm5leHQgPSBibG9ja3MtPnByZXYgPSAqaGVhcDsKKworCW1lbXNldCgqaGVhcCwgMCwgc2l6ZW9mKCoqaGVhcCkpOworCSgqaGVhcCktPmZpbGVfcHJpdiA9IChzdHJ1Y3QgZHJtX2ZpbGUgKikgLTE7CisJKCpoZWFwKS0+bmV4dCA9ICgqaGVhcCktPnByZXYgPSBibG9ja3M7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGcmVlIGFsbCBibG9ja3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWxlYXNpbmcgZmlsZV9wcml2CisgKi8KK3ZvaWQgbm91dmVhdV9tZW1fcmVsZWFzZShzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwgc3RydWN0IG1lbV9ibG9jayAqaGVhcCkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwOworCisJaWYgKCFoZWFwIHx8ICFoZWFwLT5uZXh0KQorCQlyZXR1cm47CisKKwlsaXN0X2Zvcl9lYWNoKHAsIGhlYXApIHsKKwkJaWYgKHAtPmZpbGVfcHJpdiA9PSBmaWxlX3ByaXYpCisJCQlwLT5maWxlX3ByaXYgPSBOVUxMOworCX0KKworCS8qIEFzc3VtZXMgYSBzaW5nbGUgY29udGlndW91cyByYW5nZS4gIE5lZWRzIGEgc3BlY2lhbCBmaWxlX3ByaXYgaW4KKwkgKiAnaGVhcCcgdG8gc3RvcCBpdCBiZWluZyBzdWJzdW1lZC4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoKHAsIGhlYXApIHsKKwkJd2hpbGUgKChwLT5maWxlX3ByaXYgPT0gTlVMTCkgJiYKKwkJCQkJKHAtPm5leHQtPmZpbGVfcHJpdiA9PSBOVUxMKSAmJgorCQkJCQkocC0+bmV4dCAhPSBoZWFwKSkgeworCQkJc3RydWN0IG1lbV9ibG9jayAqcSA9IHAtPm5leHQ7CisJCQlwLT5zaXplICs9IHEtPnNpemU7CisJCQlwLT5uZXh0ID0gcS0+bmV4dDsKKwkJCXAtPm5leHQtPnByZXYgPSBwOworCQkJa2ZyZWUocSk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBOVjUwIFZNIGhlbHBlcnMKKyAqLworaW50CitudjUwX21lbV92bV9iaW5kX2xpbmVhcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50NjRfdCB2aXJ0LCB1aW50MzJfdCBzaXplLAorCQkJdWludDMyX3QgZmxhZ3MsIHVpbnQ2NF90IHBoeXMpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKipwZ3Q7CisJdW5zaWduZWQgcHN6LCBwZmwsIHBhZ2VzOworCisJaWYgKHZpcnQgPj0gZGV2X3ByaXYtPnZtX2dhcnRfYmFzZSAmJgorCSAgICAodmlydCArIHNpemUpIDwgKGRldl9wcml2LT52bV9nYXJ0X2Jhc2UgKyBkZXZfcHJpdi0+dm1fZ2FydF9zaXplKSkgeworCQlwc3ogPSAxMjsKKwkJcGd0ID0gJmRldl9wcml2LT5nYXJ0X2luZm8uc2dfY3R4ZG1hOworCQlwZmwgPSAweDIxOworCQl2aXJ0IC09IGRldl9wcml2LT52bV9nYXJ0X2Jhc2U7CisJfSBlbHNlCisJaWYgKHZpcnQgPj0gZGV2X3ByaXYtPnZtX3ZyYW1fYmFzZSAmJgorCSAgICAodmlydCArIHNpemUpIDwgKGRldl9wcml2LT52bV92cmFtX2Jhc2UgKyBkZXZfcHJpdi0+dm1fdnJhbV9zaXplKSkgeworCQlwc3ogPSAxNjsKKwkJcGd0ID0gZGV2X3ByaXYtPnZtX3ZyYW1fcHQ7CisJCXBmbCA9IDB4MDE7CisJCXZpcnQgLT0gZGV2X3ByaXYtPnZtX3ZyYW1fYmFzZTsKKwl9IGVsc2UgeworCQlOVl9FUlJPUihkZXYsICJJbnZhbGlkIGFkZHJlc3M6IDB4JTE2bGx4LTB4JTE2bGx4XG4iLAorCQkJIHZpcnQsIHZpcnQgKyBzaXplIC0gMSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBhZ2VzID0gc2l6ZSA+PiBwc3o7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKwlpZiAoZmxhZ3MgJiAweDgwMDAwMDAwKSB7CisJCXdoaWxlIChwYWdlcy0tKSB7CisJCQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnB0ID0gcGd0W3ZpcnQgPj4gMjldOworCQkJdW5zaWduZWQgcHRlID0gKCh2aXJ0ICYgMHgxZmZmZmZmZlVMTCkgPj4gcHN6KSA8PCAxOworCisJCQludl93bzMyKGRldiwgcHQsIHB0ZSsrLCAweDAwMDAwMDAwKTsKKwkJCW52X3dvMzIoZGV2LCBwdCwgcHRlKyssIDB4MDAwMDAwMDApOworCisJCQl2aXJ0ICs9ICgxIDw8IHBzeik7CisJCX0KKwl9IGVsc2UgeworCQl3aGlsZSAocGFnZXMtLSkgeworCQkJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwdCA9IHBndFt2aXJ0ID4+IDI5XTsKKwkJCXVuc2lnbmVkIHB0ZSA9ICgodmlydCAmIDB4MWZmZmZmZmZVTEwpID4+IHBzeikgPDwgMTsKKwkJCXVuc2lnbmVkIG9mZnNldF9oID0gdXBwZXJfMzJfYml0cyhwaHlzKSAmIDB4ZmY7CisJCQl1bnNpZ25lZCBvZmZzZXRfbCA9IGxvd2VyXzMyX2JpdHMocGh5cyk7CisKKwkJCW52X3dvMzIoZGV2LCBwdCwgcHRlKyssIG9mZnNldF9sIHwgcGZsKTsKKwkJCW52X3dvMzIoZGV2LCBwdCwgcHRlKyssIG9mZnNldF9oIHwgZmxhZ3MpOworCisJCQlwaHlzICs9ICgxIDw8IHBzeik7CisJCQl2aXJ0ICs9ICgxIDw8IHBzeik7CisJCX0KKwl9CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKworCW52X3dyMzIoZGV2LCAweDEwMGM4MCwgMHgwMDA1MDAwMSk7CisJaWYgKCFudl93YWl0KDB4MTAwYzgwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKSkgeworCQlOVl9FUlJPUihkZXYsICJ0aW1lb3V0OiAoMHgxMDBjODAgJiAxKSA9PSAwICgyKVxuIik7CisJCU5WX0VSUk9SKGRldiwgIjB4MTAwYzgwID0gMHglMDh4XG4iLCBudl9yZDMyKGRldiwgMHgxMDBjODApKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwludl93cjMyKGRldiwgMHgxMDBjODAsIDB4MDAwMDAwMDEpOworCWlmICghbnZfd2FpdCgweDEwMGM4MCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCkpIHsKKwkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4MTAwYzgwICYgMSkgPT0gMCAoMilcbiIpOworCQlOVl9FUlJPUihkZXYsICIweDEwMGM4MCA9IDB4JTA4eFxuIiwgbnZfcmQzMihkZXYsIDB4MTAwYzgwKSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252NTBfbWVtX3ZtX3VuYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50NjRfdCB2aXJ0LCB1aW50MzJfdCBzaXplKQoreworCW52NTBfbWVtX3ZtX2JpbmRfbGluZWFyKGRldiwgdmlydCwgc2l6ZSwgMHg4MDAwMDAwMCwgMCk7Cit9CisKKy8qCisgKiBDbGVhbnVwIGV2ZXJ5dGhpbmcKKyAqLwordm9pZCBub3V2ZWF1X21lbV90YWtlZG93bihzdHJ1Y3QgbWVtX2Jsb2NrICoqaGVhcCkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwOworCisJaWYgKCEqaGVhcCkKKwkJcmV0dXJuOworCisJZm9yIChwID0gKCpoZWFwKS0+bmV4dDsgcCAhPSAqaGVhcDspIHsKKwkJc3RydWN0IG1lbV9ibG9jayAqcSA9IHA7CisJCXAgPSBwLT5uZXh0OworCQlrZnJlZShxKTsKKwl9CisKKwlrZnJlZSgqaGVhcCk7CisJKmhlYXAgPSBOVUxMOworfQorCit2b2lkIG5vdXZlYXVfbWVtX2Nsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+dHRtLmJkZXYubWFuW1RUTV9QTF9QUklWMF0uaGFzX3R5cGUpCisJCXR0bV9ib19jbGVhbl9tbSgmZGV2X3ByaXYtPnR0bS5iZGV2LCBUVE1fUExfUFJJVjApOworCXR0bV9ib19jbGVhbl9tbSgmZGV2X3ByaXYtPnR0bS5iZGV2LCBUVE1fUExfVlJBTSk7CisKKwl0dG1fYm9fZGV2aWNlX3JlbGVhc2UoJmRldl9wcml2LT50dG0uYmRldik7CisKKwlub3V2ZWF1X3R0bV9nbG9iYWxfcmVsZWFzZShkZXZfcHJpdik7CisKKwlpZiAoZHJtX2NvcmVfaGFzX0FHUChkZXYpICYmIGRldi0+YWdwICYmCisJICAgIGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKKwkJc3RydWN0IGRybV9hZ3BfbWVtICplbnRyeSwgKnRlbXBlOworCisJCS8qIFJlbW92ZSBBR1AgcmVzb3VyY2VzLCBidXQgbGVhdmUgZGV2LT5hZ3AKKwkJICAgaW50YWN0IHVudGlsIGRydl9jbGVhbnVwIGlzIGNhbGxlZC4gKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCB0ZW1wZSwgJmRldi0+YWdwLT5tZW1vcnksIGhlYWQpIHsKKwkJCWlmIChlbnRyeS0+Ym91bmQpCisJCQkJZHJtX3VuYmluZF9hZ3AoZW50cnktPm1lbW9yeSk7CisJCQlkcm1fZnJlZV9hZ3AoZW50cnktPm1lbW9yeSwgZW50cnktPnBhZ2VzKTsKKwkJCWtmcmVlKGVudHJ5KTsKKwkJfQorCQlJTklUX0xJU1RfSEVBRCgmZGV2LT5hZ3AtPm1lbW9yeSk7CisKKwkJaWYgKGRldi0+YWdwLT5hY3F1aXJlZCkKKwkJCWRybV9hZ3BfcmVsZWFzZShkZXYpOworCisJCWRldi0+YWdwLT5hY3F1aXJlZCA9IDA7CisJCWRldi0+YWdwLT5lbmFibGVkID0gMDsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPmZiX210cnIpIHsKKwkJZHJtX210cnJfZGVsKGRldl9wcml2LT5mYl9tdHJyLCBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KGRldiwgMSksCisJCQkgICAgIGRybV9nZXRfcmVzb3VyY2VfbGVuKGRldiwgMSksIERSTV9NVFJSX1dDKTsKKwkJZGV2X3ByaXYtPmZiX210cnIgPSAwOworCX0KK30KKworLypYWFggd29uJ3Qgd29yayBvbiBCU0QgYmVjYXVzZSBvZiBwY2lfcmVhZF9jb25maWdfZHdvcmQgKi8KK3N0YXRpYyB1aW50MzJfdAorbm91dmVhdV9tZW1fZmJfYW1vdW50X2lncChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHBjaV9kZXYgKmJyaWRnZTsKKwl1aW50MzJfdCBtZW07CisKKwlicmlkZ2UgPSBwY2lfZ2V0X2J1c19hbmRfc2xvdCgwLCBQQ0lfREVWRk4oMCwgMSkpOworCWlmICghYnJpZGdlKSB7CisJCU5WX0VSUk9SKGRldiwgIm5vIGJyaWRnZSBkZXZpY2VcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPmZsYWdzJk5WX05GT1JDRSkgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYnJpZGdlLCAweDdDLCAmbWVtKTsKKwkJcmV0dXJuICh1aW50NjRfdCkoKChtZW0gPj4gNikgJiAzMSkgKyAxKSoxMDI0KjEwMjQ7CisJfSBlbHNlCisJaWYgKGRldl9wcml2LT5mbGFncyZOVl9ORk9SQ0UyKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChicmlkZ2UsIDB4ODQsICZtZW0pOworCQlyZXR1cm4gKHVpbnQ2NF90KSgoKG1lbSA+PiA0KSAmIDEyNykgKyAxKSoxMDI0KjEwMjQ7CisJfQorCisJTlZfRVJST1IoZGV2LCAiaW1wb3NzaWJsZSFcbiIpOworCXJldHVybiAwOworfQorCisvKiByZXR1cm5zIHRoZSBhbW91bnQgb2YgRkIgcmFtIGluIGJ5dGVzICovCit1aW50NjRfdCBub3V2ZWF1X21lbV9mYl9hbW91bnQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IGJvb3QwOworCisJc3dpdGNoIChkZXZfcHJpdi0+Y2FyZF90eXBlKSB7CisJY2FzZSBOVl8wNDoKKwkJYm9vdDAgPSBudl9yZDMyKGRldiwgTlYwM19CT09UXzApOworCQlpZiAoYm9vdDAgJiAweDAwMDAwMTAwKQorCQkJcmV0dXJuICgoKGJvb3QwID4+IDEyKSAmIDB4ZikgKiAyICsgMikgKiAxMDI0ICogMTAyNDsKKworCQlzd2l0Y2ggKGJvb3QwICYgTlYwM19CT09UXzBfUkFNX0FNT1VOVCkgeworCQljYXNlIE5WMDRfQk9PVF8wX1JBTV9BTU9VTlRfMzJNQjoKKwkJCXJldHVybiAzMiAqIDEwMjQgKiAxMDI0OworCQljYXNlIE5WMDRfQk9PVF8wX1JBTV9BTU9VTlRfMTZNQjoKKwkJCXJldHVybiAxNiAqIDEwMjQgKiAxMDI0OworCQljYXNlIE5WMDRfQk9PVF8wX1JBTV9BTU9VTlRfOE1COgorCQkJcmV0dXJuIDggKiAxMDI0ICogMTAyNDsKKwkJY2FzZSBOVjA0X0JPT1RfMF9SQU1fQU1PVU5UXzRNQjoKKwkJCXJldHVybiA0ICogMTAyNCAqIDEwMjQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOVl8xMDoKKwljYXNlIE5WXzIwOgorCWNhc2UgTlZfMzA6CisJY2FzZSBOVl80MDoKKwljYXNlIE5WXzUwOgorCWRlZmF1bHQ6CisJCWlmIChkZXZfcHJpdi0+ZmxhZ3MgJiAoTlZfTkZPUkNFIHwgTlZfTkZPUkNFMikpIHsKKwkJCXJldHVybiBub3V2ZWF1X21lbV9mYl9hbW91bnRfaWdwKGRldik7CisJCX0gZWxzZSB7CisJCQl1aW50NjRfdCBtZW07CisJCQltZW0gPSAobnZfcmQzMihkZXYsIE5WMDRfRklGT19EQVRBKSAmCisJCQkJCU5WMTBfRklGT19EQVRBX1JBTV9BTU9VTlRfTUJfTUFTSykgPj4KKwkJCQkJTlYxMF9GSUZPX0RBVEFfUkFNX0FNT1VOVF9NQl9TSElGVDsKKwkJCXJldHVybiBtZW0gKiAxMDI0ICogMTAyNDsKKwkJfQorCQlicmVhazsKKwl9CisKKwlOVl9FUlJPUihkZXYsCisJCSJVbmFibGUgdG8gZGV0ZWN0IHZpZGVvIHJhbSBzaXplLiBQbGVhc2UgcmVwb3J0IHlvdXIgc2V0dXAgdG8gIgorCQkJCQkJCURSSVZFUl9FTUFJTCAiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbm91dmVhdV9tZW1fcmVzZXRfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdWludDMyX3Qgc2F2ZWRfcGNpX252XzEsIHNhdmVkX3BjaV9udl8xOSwgcG1jX2VuYWJsZTsKKworCXNhdmVkX3BjaV9udl8xID0gbnZfcmQzMihkZXYsIE5WMDRfUEJVU19QQ0lfTlZfMSk7CisJc2F2ZWRfcGNpX252XzE5ID0gbnZfcmQzMihkZXYsIE5WMDRfUEJVU19QQ0lfTlZfMTkpOworCisJLyogY2xlYXIgYnVzbWFzdGVyIGJpdCAqLworCW52X3dyMzIoZGV2LCBOVjA0X1BCVVNfUENJX05WXzEsIHNhdmVkX3BjaV9udl8xICYgfjB4NCk7CisJLyogY2xlYXIgU0JBIGFuZCBBR1AgYml0cyAqLworCW52X3dyMzIoZGV2LCBOVjA0X1BCVVNfUENJX05WXzE5LCBzYXZlZF9wY2lfbnZfMTkgJiAweGZmZmZmMGZmKTsKKworCS8qIHBvd2VyIGN5Y2xlIHBncmFwaCwgaWYgZW5hYmxlZCAqLworCXBtY19lbmFibGUgPSBudl9yZDMyKGRldiwgTlYwM19QTUNfRU5BQkxFKTsKKwlpZiAocG1jX2VuYWJsZSAmIE5WX1BNQ19FTkFCTEVfUEdSQVBIKSB7CisJCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsCisJCQkJcG1jX2VuYWJsZSAmIH5OVl9QTUNfRU5BQkxFX1BHUkFQSCk7CisJCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsIG52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpIHwKKwkJCQlOVl9QTUNfRU5BQkxFX1BHUkFQSCk7CisJfQorCisJLyogYW5kIHJlc3RvcmUgKGdpdmVzIGVmZmVjdCBvZiByZXNldHRpbmcgQUdQKSAqLworCW52X3dyMzIoZGV2LCBOVjA0X1BCVVNfUENJX05WXzE5LCBzYXZlZF9wY2lfbnZfMTkpOworCW52X3dyMzIoZGV2LCBOVjA0X1BCVVNfUENJX05WXzEsIHNhdmVkX3BjaV9udl8xKTsKK30KKworaW50Citub3V2ZWF1X21lbV9pbml0X2FncChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9hZ3BfaW5mbyBpbmZvOworCXN0cnVjdCBkcm1fYWdwX21vZGUgbW9kZTsKKwlpbnQgcmV0OworCisJaWYgKG5vdXZlYXVfbm9hZ3ApCisJCXJldHVybiAwOworCisJbm91dmVhdV9tZW1fcmVzZXRfYWdwKGRldik7CisKKwlpZiAoIWRldi0+YWdwLT5hY3F1aXJlZCkgeworCQlyZXQgPSBkcm1fYWdwX2FjcXVpcmUoZGV2KTsKKwkJaWYgKHJldCkgeworCQkJTlZfRVJST1IoZGV2LCAiVW5hYmxlIHRvIGFjcXVpcmUgQUdQOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXQgPSBkcm1fYWdwX2luZm8oZGV2LCAmaW5mbyk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJVbmFibGUgdG8gZ2V0IEFHUCBpbmZvOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBzZWUgYWdwLmggZm9yIHRoZSBBR1BTVEFUXyogbW9kZXMgYXZhaWxhYmxlICovCisJbW9kZS5tb2RlID0gaW5mby5tb2RlOworCXJldCA9IGRybV9hZ3BfZW5hYmxlKGRldiwgbW9kZSk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJVbmFibGUgdG8gZW5hYmxlIEFHUDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlCT0gTk9VVkVBVV9HQVJUX0FHUDsKKwlkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfYmFzZQk9IGluZm8uYXBlcnR1cmVfYmFzZTsKKwlkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfc2l6ZQk9IGluZm8uYXBlcnR1cmVfc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworaW50Citub3V2ZWF1X21lbV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiA9ICZkZXZfcHJpdi0+dHRtLmJkZXY7CisJaW50IHJldCwgZG1hX2JpdHMgPSAzMjsKKworCWRldl9wcml2LT5mYl9waHlzID0gZHJtX2dldF9yZXNvdXJjZV9zdGFydChkZXYsIDEpOworCWRldl9wcml2LT5nYXJ0X2luZm8udHlwZSA9IE5PVVZFQVVfR0FSVF9OT05FOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTAgJiYKKwkgICAgcGNpX2RtYV9zdXBwb3J0ZWQoZGV2LT5wZGV2LCBETUFfQklUX01BU0soNDApKSkKKwkJZG1hX2JpdHMgPSA0MDsKKworCXJldCA9IHBjaV9zZXRfZG1hX21hc2soZGV2LT5wZGV2LCBETUFfQklUX01BU0soZG1hX2JpdHMpKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIHNldHRpbmcgRE1BIG1hc2s6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IG5vdXZlYXVfdHRtX2dsb2JhbF9pbml0KGRldl9wcml2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdHRtX2JvX2RldmljZV9pbml0KCZkZXZfcHJpdi0+dHRtLmJkZXYsCisJCQkJIGRldl9wcml2LT50dG0uYm9fZ2xvYmFsX3JlZi5yZWYub2JqZWN0LAorCQkJCSAmbm91dmVhdV9ib19kcml2ZXIsIERSTV9GSUxFX1BBR0VfT0ZGU0VULAorCQkJCSBkbWFfYml0cyA8PSAzMiA/IHRydWUgOiBmYWxzZSk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJFcnJvciBpbml0aWFsaXNpbmcgYm8gZHJpdmVyOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmZGV2X3ByaXYtPnR0bS5ib19saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2X3ByaXYtPnR0bS5ib19saXN0X2xvY2spOworCisJZGV2X3ByaXYtPmZiX2F2YWlsYWJsZV9zaXplID0gbm91dmVhdV9tZW1fZmJfYW1vdW50KGRldik7CisKKwlkZXZfcHJpdi0+ZmJfbWFwcGFibGVfcGFnZXMgPSBkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemU7CisJaWYgKGRldl9wcml2LT5mYl9tYXBwYWJsZV9wYWdlcyA+IGRybV9nZXRfcmVzb3VyY2VfbGVuKGRldiwgMSkpCisJCWRldl9wcml2LT5mYl9tYXBwYWJsZV9wYWdlcyA9IGRybV9nZXRfcmVzb3VyY2VfbGVuKGRldiwgMSk7CisJZGV2X3ByaXYtPmZiX21hcHBhYmxlX3BhZ2VzID4+PSBQQUdFX1NISUZUOworCisJTlZfSU5GTyhkZXYsICIlZCBNaUIgVlJBTVxuIiwgKGludCkoZGV2X3ByaXYtPmZiX2F2YWlsYWJsZV9zaXplID4+IDIwKSk7CisKKwkvKiByZW1vdmUgcmVzZXJ2ZWQgc3BhY2UgYXQgZW5kIG9mIHZyYW0gZnJvbSBhdmFpbGFibGUgYW1vdW50ICovCisJZGV2X3ByaXYtPmZiX2F2YWlsYWJsZV9zaXplIC09IGRldl9wcml2LT5yYW1pbl9yc3ZkX3ZyYW07CisJZGV2X3ByaXYtPmZiX2FwZXJfZnJlZSA9IGRldl9wcml2LT5mYl9hdmFpbGFibGVfc2l6ZTsKKworCS8qIG1hcHBhYmxlIHZyYW0gKi8KKwlyZXQgPSB0dG1fYm9faW5pdF9tbShiZGV2LCBUVE1fUExfVlJBTSwKKwkJCSAgICAgZGV2X3ByaXYtPmZiX2F2YWlsYWJsZV9zaXplID4+IFBBR0VfU0hJRlQpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiRmFpbGVkIFZSQU0gbW0gaW5pdDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogR0FSVCAqLworI2lmICFkZWZpbmVkKF9fcG93ZXJwY19fKSAmJiAhZGVmaW5lZChfX2lhNjRfXykKKwlpZiAoZHJtX2RldmljZV9pc19hZ3AoZGV2KSAmJiBkZXYtPmFncCkgeworCQlyZXQgPSBub3V2ZWF1X21lbV9pbml0X2FncChkZXYpOworCQlpZiAocmV0KQorCQkJTlZfRVJST1IoZGV2LCAiRXJyb3IgaW5pdGlhbGlzaW5nIEFHUDogJWRcbiIsIHJldCk7CisJfQorI2VuZGlmCisKKwlpZiAoZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlID09IE5PVVZFQVVfR0FSVF9OT05FKSB7CisJCXJldCA9IG5vdXZlYXVfc2dkbWFfaW5pdChkZXYpOworCQlpZiAocmV0KSB7CisJCQlOVl9FUlJPUihkZXYsICJFcnJvciBpbml0aWFsaXNpbmcgUENJKEUpOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlOVl9JTkZPKGRldiwgIiVkIE1pQiBHQVJUIChhcGVydHVyZSlcbiIsCisJCShpbnQpKGRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9zaXplID4+IDIwKSk7CisJZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX2ZyZWUgPSBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfc2l6ZTsKKworCXJldCA9IHR0bV9ib19pbml0X21tKGJkZXYsIFRUTV9QTF9UVCwKKwkJCSAgICAgZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX3NpemUgPj4gUEFHRV9TSElGVCk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJGYWlsZWQgVFQgbW0gaW5pdDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZGV2X3ByaXYtPmZiX210cnIgPSBkcm1fbXRycl9hZGQoZHJtX2dldF9yZXNvdXJjZV9zdGFydChkZXYsIDEpLAorCQkJCQkgZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCAxKSwKKwkJCQkJIERSTV9NVFJSX1dDKTsKKwlyZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X25vdGlmaWVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X25vdGlmaWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2NmEzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbm90aWZpZXIuYwpAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBCZW4gU2tlZ2dzLgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKworaW50Citub3V2ZWF1X25vdGlmaWVyX2luaXRfY2hhbm5lbChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfYm8gKm50ZnkgPSBOVUxMOworCWludCByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2dlbV9uZXcoZGV2LCBOVUxMLCBQQUdFX1NJWkUsIDAsIG5vdXZlYXVfdnJhbV9ub3RpZnkgPworCQkJICAgICAgVFRNX1BMX0ZMQUdfVlJBTSA6IFRUTV9QTF9GTEFHX1RULAorCQkJICAgICAgMCwgMHgwMDAwLCBmYWxzZSwgdHJ1ZSwgJm50ZnkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2JvX3BpbihudGZ5LCBUVE1fUExfRkxBR19WUkFNKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9lcnI7CisKKwlyZXQgPSBub3V2ZWF1X2JvX21hcChudGZ5KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9lcnI7CisKKwlyZXQgPSBub3V2ZWF1X21lbV9pbml0X2hlYXAoJmNoYW4tPm5vdGlmaWVyX2hlYXAsIDAsIG50ZnktPmJvLm1lbS5zaXplKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9lcnI7CisKKwljaGFuLT5ub3RpZmllcl9ibyA9IG50Znk7CitvdXRfZXJyOgorCWlmIChyZXQpIHsKKwkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShudGZ5LT5nZW0pOworCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkCitub3V2ZWF1X25vdGlmaWVyX3Rha2Vkb3duX2NoYW5uZWwoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCisJaWYgKCFjaGFuLT5ub3RpZmllcl9ibykKKwkJcmV0dXJuOworCisJbm91dmVhdV9ib191bm1hcChjaGFuLT5ub3RpZmllcl9ibyk7CisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCW5vdXZlYXVfYm9fdW5waW4oY2hhbi0+bm90aWZpZXJfYm8pOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGNoYW4tPm5vdGlmaWVyX2JvLT5nZW0pOworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCW5vdXZlYXVfbWVtX3Rha2Vkb3duKCZjaGFuLT5ub3RpZmllcl9oZWFwKTsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfbm90aWZpZXJfZ3B1b2JqX2R0b3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmopCit7CisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCWlmIChncHVvYmotPnByaXYpCisJCW5vdXZlYXVfbWVtX2ZyZWVfYmxvY2soZ3B1b2JqLT5wcml2KTsKK30KKworaW50Citub3V2ZWF1X25vdGlmaWVyX2FsbG9jKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIHVpbnQzMl90IGhhbmRsZSwKKwkJICAgICAgIGludCBzaXplLCB1aW50MzJfdCAqYl9vZmZzZXQpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqbm9iaiA9IE5VTEw7CisJc3RydWN0IG1lbV9ibG9jayAqbWVtOworCXVpbnQzMl90IG9mZnNldDsKKwlpbnQgdGFyZ2V0LCByZXQ7CisKKwlpZiAoIWNoYW4tPm5vdGlmaWVyX2hlYXApIHsKKwkJTlZfRVJST1IoZGV2LCAiQ2hhbm5lbCAlZCBkb2Vzbid0IGhhdmUgYSBub3RpZmllciBoZWFwIVxuIiwKKwkJCSBjaGFuLT5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1lbSA9IG5vdXZlYXVfbWVtX2FsbG9jX2Jsb2NrKGNoYW4tPm5vdGlmaWVyX2hlYXAsIHNpemUsIDAsCisJCQkJICAgICAgKHN0cnVjdCBkcm1fZmlsZSAqKS0yLCAwKTsKKwlpZiAoIW1lbSkgeworCQlOVl9FUlJPUihkZXYsICJDaGFubmVsICVkIG5vdGlmaWVyIGJsb2NrIGZ1bGxcbiIsIGNoYW4tPmlkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJb2Zmc2V0ID0gY2hhbi0+bm90aWZpZXJfYm8tPmJvLm1lbS5tbV9ub2RlLT5zdGFydCA8PCBQQUdFX1NISUZUOworCWlmIChjaGFuLT5ub3RpZmllcl9iby0+Ym8ubWVtLm1lbV90eXBlID09IFRUTV9QTF9WUkFNKSB7CisJCXRhcmdldCA9IE5WX0RNQV9UQVJHRVRfVklETUVNOworCX0gZWxzZQorCWlmIChjaGFuLT5ub3RpZmllcl9iby0+Ym8ubWVtLm1lbV90eXBlID09IFRUTV9QTF9UVCkgeworCQlpZiAoZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlID09IE5PVVZFQVVfR0FSVF9TR0RNQSAmJgorCQkgICAgZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7CisJCQlyZXQgPSBub3V2ZWF1X3NnZG1hX2dldF9wYWdlKGRldiwgb2Zmc2V0LCAmb2Zmc2V0KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJCXRhcmdldCA9IE5WX0RNQV9UQVJHRVRfUENJOworCQl9IGVsc2UgeworCQkJdGFyZ2V0ID0gTlZfRE1BX1RBUkdFVF9BR1A7CisJCX0KKwl9IGVsc2UgeworCQlOVl9FUlJPUihkZXYsICJCYWQgRE1BIHRhcmdldCwgbWVtX3R5cGUgJWQhXG4iLAorCQkJIGNoYW4tPm5vdGlmaWVyX2JvLT5iby5tZW0ubWVtX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJb2Zmc2V0ICs9IG1lbS0+c3RhcnQ7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9kbWFfbmV3KGNoYW4sIE5WX0NMQVNTX0RNQV9JTl9NRU1PUlksIG9mZnNldCwKKwkJCQkgICAgIG1lbS0+c2l6ZSwgTlZfRE1BX0FDQ0VTU19SVywgdGFyZ2V0LAorCQkJCSAgICAgJm5vYmopOworCWlmIChyZXQpIHsKKwkJbm91dmVhdV9tZW1fZnJlZV9ibG9jayhtZW0pOworCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBub3RpZmllciBjdHhkbWE6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlub2JqLT5kdG9yICAgPSBub3V2ZWF1X25vdGlmaWVyX2dwdW9ial9kdG9yOworCW5vYmotPnByaXYgICA9IG1lbTsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX3JlZl9hZGQoZGV2LCBjaGFuLCBoYW5kbGUsIG5vYmosIE5VTEwpOworCWlmIChyZXQpIHsKKwkJbm91dmVhdV9ncHVvYmpfZGVsKGRldiwgJm5vYmopOworCQlub3V2ZWF1X21lbV9mcmVlX2Jsb2NrKG1lbSk7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIHJlZmVyZW5jaW5nIG5vdGlmaWVyIGN0eGRtYTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJKmJfb2Zmc2V0ID0gbWVtLT5zdGFydDsKKwlyZXR1cm4gMDsKK30KKworaW50Citub3V2ZWF1X25vdGlmaWVyX29mZnNldChzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKm5vYmosIHVpbnQzMl90ICpwb2Zmc2V0KQoreworCWlmICghbm9iaiB8fCBub2JqLT5kdG9yICE9IG5vdXZlYXVfbm90aWZpZXJfZ3B1b2JqX2R0b3IpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBvZmZzZXQpIHsKKwkJc3RydWN0IG1lbV9ibG9jayAqbWVtID0gbm9iai0+cHJpdjsKKworCQlpZiAoKnBvZmZzZXQgPj0gbWVtLT5zaXplKQorCQkJcmV0dXJuIGZhbHNlOworCisJCSpwb2Zmc2V0ICs9IG1lbS0+c3RhcnQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludAorbm91dmVhdV9pb2N0bF9ub3RpZmllcl9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfbm90aWZpZXJvYmpfYWxsb2MgKm5hID0gZGF0YTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOworCWludCByZXQ7CisKKwlOT1VWRUFVX0NIRUNLX0lOSVRJQUxJU0VEX1dJVEhfUkVUVVJOOworCU5PVVZFQVVfR0VUX1VTRVJfQ0hBTk5FTF9XSVRIX1JFVFVSTihuYS0+Y2hhbm5lbCwgZmlsZV9wcml2LCBjaGFuKTsKKworCXJldCA9IG5vdXZlYXVfbm90aWZpZXJfYWxsb2MoY2hhbiwgbmEtPmhhbmRsZSwgbmEtPnNpemUsICZuYS0+b2Zmc2V0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X29iamVjdC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9vYmplY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzM3OWJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9vYmplY3QuYwpAQCAtMCwwICsxLDEyOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQmVuIFNrZWdncy4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisvKgorICogQXV0aG9yczoKKyAqICAgQmVuIFNrZWdncyA8ZGFya3RhbWFAaWluZXQubmV0LmF1PgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgorCisvKiBOVmlkaWEgdXNlcyBjb250ZXh0IG9iamVjdHMgdG8gZHJpdmUgZHJhd2luZyBvcGVyYXRpb25zLgorCisgICBDb250ZXh0IG9iamVjdHMgY2FuIGJlIHNlbGVjdGVkIGludG8gOCBzdWJjaGFubmVscyBpbiB0aGUgRklGTywKKyAgIGFuZCB0aGVuIHVzZWQgdmlhIERNQSBjb21tYW5kIGJ1ZmZlcnMuCisKKyAgIEEgY29udGV4dCBvYmplY3QgaXMgcmVmZXJlbmNlZCBieSBhIHVzZXIgZGVmaW5lZCBoYW5kbGUgKENBUkQzMikuIFRoZSBIVworICAgbG9va3MgdXAgZ3JhcGhpY3Mgb2JqZWN0cyBpbiBhIGhhc2ggdGFibGUgaW4gdGhlIGluc3RhbmNlIFJBTS4KKworICAgQW4gZW50cnkgaW4gdGhlIGhhc2ggdGFibGUgY29uc2lzdHMgb2YgMiBDQVJEMzIuIFRoZSBmaXJzdCBDQVJEMzIgY29udGFpbnMKKyAgIHRoZSBoYW5kbGUsIHRoZSBzZWNvbmQgb25lIGEgYml0ZmllbGQsIHRoYXQgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhlCisgICBvYmplY3QgaW4gaW5zdGFuY2UgUkFNLgorCisgICBUaGUgZm9ybWF0IG9mIHRoZSBzZWNvbmQgQ0FSRDMyIHNlZW1zIHRvIGJlOgorCisgICBOVjQgdG8gTlYzMDoKKworICAgMTU6IDAgIGluc3RhbmNlX2FkZHIgPj4gNAorICAgMTc6MTYgIGVuZ2luZSAoaGVyZSB1c2VzIDEgPSBncmFwaGljcykKKyAgIDI4OjI0ICBjaGFubmVsIGlkIChoZXJlIHVzZXMgMCkKKyAgIDMxCSAgdmFsaWQgKHVzZSAxKQorCisgICBOVjQwOgorCisgICAxNTogMCAgaW5zdGFuY2VfYWRkciA+PiA0ICAgKG1heWJlIDE5LTApCisgICAyMToyMCAgZW5naW5lIChoZXJlIHVzZXMgMSA9IGdyYXBoaWNzKQorICAgSSdtIHVuc3VyZSBhYm91dCB0aGUgb3RoZXIgYml0cywgYnV0IHVzaW5nIDAgc2VlbXMgdG8gd29yay4KKworICAgVGhlIGtleSBpbnRvIHRoZSBoYXNoIHRhYmxlIGRlcGVuZHMgb24gdGhlIG9iamVjdCBoYW5kbGUgYW5kIGNoYW5uZWwgaWQgYW5kCisgICBpcyBnaXZlbiBhczoKKyovCitzdGF0aWMgdWludDMyX3QKK25vdXZlYXVfcmFtaHRfaGFzaF9oYW5kbGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNoYW5uZWwsIHVpbnQzMl90IGhhbmRsZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IGhhc2ggPSAwOworCWludCBpOworCisJTlZfREVCVUcoZGV2LCAiY2glZCBoYW5kbGU9MHglMDh4XG4iLCBjaGFubmVsLCBoYW5kbGUpOworCisJZm9yIChpID0gMzI7IGkgPiAwOyBpIC09IGRldl9wcml2LT5yYW1odF9iaXRzKSB7CisJCWhhc2ggXj0gKGhhbmRsZSAmICgoMSA8PCBkZXZfcHJpdi0+cmFtaHRfYml0cykgLSAxKSk7CisJCWhhbmRsZSA+Pj0gZGV2X3ByaXYtPnJhbWh0X2JpdHM7CisJfQorCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkKKwkJaGFzaCBePSBjaGFubmVsIDw8IChkZXZfcHJpdi0+cmFtaHRfYml0cyAtIDQpOworCWhhc2ggPDw9IDM7CisKKwlOVl9ERUJVRyhkZXYsICJoYXNoPTB4JTA4eFxuIiwgaGFzaCk7CisJcmV0dXJuIGhhc2g7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfcmFtaHRfZW50cnlfdmFsaWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpyYW1odCwKKwkJCSAgdWludDMyX3Qgb2Zmc2V0KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgY3R4ID0gbnZfcm8zMihkZXYsIHJhbWh0LCAob2Zmc2V0ICsgNCkvNCk7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzQwKQorCQlyZXR1cm4gKChjdHggJiBOVl9SQU1IVF9DT05URVhUX1ZBTElEKSAhPSAwKTsKKwlyZXR1cm4gKGN0eCAhPSAwKTsKK30KKworc3RhdGljIGludAorbm91dmVhdV9yYW1odF9pbnNlcnQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqcmVmKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9lbmdpbmUgKmluc3RtZW0gPSAmZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSByZWYtPmNoYW5uZWw7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpyYW1odCA9IGNoYW4tPnJhbWh0ID8gY2hhbi0+cmFtaHQtPmdwdW9iaiA6IE5VTEw7CisJdWludDMyX3QgY3R4LCBjbywgaG87CisKKwlpZiAoIXJhbWh0KSB7CisJCU5WX0VSUk9SKGRldiwgIk5vIGhhc2ggdGFibGUhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl80MCkgeworCQljdHggPSBOVl9SQU1IVF9DT05URVhUX1ZBTElEIHwgKHJlZi0+aW5zdGFuY2UgPj4gNCkgfAorCQkgICAgICAoY2hhbi0+aWQgPDwgTlZfUkFNSFRfQ09OVEVYVF9DSEFOTkVMX1NISUZUKSB8CisJCSAgICAgIChyZWYtPmdwdW9iai0+ZW5naW5lIDw8IE5WX1JBTUhUX0NPTlRFWFRfRU5HSU5FX1NISUZUKTsKKwl9IGVsc2UKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7CisJCWN0eCA9IChyZWYtPmluc3RhbmNlID4+IDQpIHwKKwkJICAgICAgKGNoYW4tPmlkIDw8IE5WNDBfUkFNSFRfQ09OVEVYVF9DSEFOTkVMX1NISUZUKSB8CisJCSAgICAgIChyZWYtPmdwdW9iai0+ZW5naW5lIDw8IE5WNDBfUkFNSFRfQ09OVEVYVF9FTkdJTkVfU0hJRlQpOworCX0gZWxzZSB7CisJCWlmIChyZWYtPmdwdW9iai0+ZW5naW5lID09IE5WT0JKX0VOR0lORV9ESVNQTEFZKSB7CisJCQljdHggPSAocmVmLT5pbnN0YW5jZSA8PCAxMCkgfCAyOworCQl9IGVsc2UgeworCQkJY3R4ID0gKHJlZi0+aW5zdGFuY2UgPj4gNCkgfAorCQkJICAgICAgKChyZWYtPmdwdW9iai0+ZW5naW5lIDw8CisJCQkJTlY0MF9SQU1IVF9DT05URVhUX0VOR0lORV9TSElGVCkpOworCQl9CisJfQorCisJaW5zdG1lbS0+cHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKwljbyA9IGhvID0gbm91dmVhdV9yYW1odF9oYXNoX2hhbmRsZShkZXYsIGNoYW4tPmlkLCByZWYtPmhhbmRsZSk7CisJZG8geworCQlpZiAoIW5vdXZlYXVfcmFtaHRfZW50cnlfdmFsaWQoZGV2LCByYW1odCwgY28pKSB7CisJCQlOVl9ERUJVRyhkZXYsCisJCQkJICJpbnNlcnQgY2glZCAweCUwOHg6IGg9MHglMDh4LCBjPTB4JTA4eFxuIiwKKwkJCQkgY2hhbi0+aWQsIGNvLCByZWYtPmhhbmRsZSwgY3R4KTsKKwkJCW52X3dvMzIoZGV2LCByYW1odCwgKGNvICsgMCkvNCwgcmVmLT5oYW5kbGUpOworCQkJbnZfd28zMihkZXYsIHJhbWh0LCAoY28gKyA0KS80LCBjdHgpOworCisJCQlsaXN0X2FkZF90YWlsKCZyZWYtPmxpc3QsICZjaGFuLT5yYW1odF9yZWZzKTsKKwkJCWluc3RtZW0tPmZpbmlzaF9hY2Nlc3MoZGV2KTsKKwkJCXJldHVybiAwOworCQl9CisJCU5WX0RFQlVHKGRldiwgImNvbGxpc2lvbiBjaCVkIDB4JTA4eDogaD0weCUwOHhcbiIsCisJCQkgY2hhbi0+aWQsIGNvLCBudl9ybzMyKGRldiwgcmFtaHQsIGNvLzQpKTsKKworCQljbyArPSA4OworCQlpZiAoY28gPj0gZGV2X3ByaXYtPnJhbWh0X3NpemUpCisJCQljbyA9IDA7CisJfSB3aGlsZSAoY28gIT0gaG8pOworCWluc3RtZW0tPmZpbmlzaF9hY2Nlc3MoZGV2KTsKKworCU5WX0VSUk9SKGRldiwgIlJBTUhUIHNwYWNlIGV4aGF1c3RlZC4gY2g9JWRcbiIsIGNoYW4tPmlkKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfcmFtaHRfcmVtb3ZlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKnJlZikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2luc3RtZW1fZW5naW5lICppbnN0bWVtID0gJmRldl9wcml2LT5lbmdpbmUuaW5zdG1lbTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gcmVmLT5jaGFubmVsOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcmFtaHQgPSBjaGFuLT5yYW1odCA/IGNoYW4tPnJhbWh0LT5ncHVvYmogOiBOVUxMOworCXVpbnQzMl90IGNvLCBobzsKKworCWlmICghcmFtaHQpIHsKKwkJTlZfRVJST1IoZGV2LCAiTm8gaGFzaCB0YWJsZSFcbiIpOworCQlyZXR1cm47CisJfQorCisJaW5zdG1lbS0+cHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKwljbyA9IGhvID0gbm91dmVhdV9yYW1odF9oYXNoX2hhbmRsZShkZXYsIGNoYW4tPmlkLCByZWYtPmhhbmRsZSk7CisJZG8geworCQlpZiAobm91dmVhdV9yYW1odF9lbnRyeV92YWxpZChkZXYsIHJhbWh0LCBjbykgJiYKKwkJICAgIChyZWYtPmhhbmRsZSA9PSBudl9ybzMyKGRldiwgcmFtaHQsIChjby80KSkpKSB7CisJCQlOVl9ERUJVRyhkZXYsCisJCQkJICJyZW1vdmUgY2glZCAweCUwOHg6IGg9MHglMDh4LCBjPTB4JTA4eFxuIiwKKwkJCQkgY2hhbi0+aWQsIGNvLCByZWYtPmhhbmRsZSwKKwkJCQkgbnZfcm8zMihkZXYsIHJhbWh0LCAoY28gKyA0KSkpOworCQkJbnZfd28zMihkZXYsIHJhbWh0LCAoY28gKyAwKS80LCAweDAwMDAwMDAwKTsKKwkJCW52X3dvMzIoZGV2LCByYW1odCwgKGNvICsgNCkvNCwgMHgwMDAwMDAwMCk7CisKKwkJCWxpc3RfZGVsKCZyZWYtPmxpc3QpOworCQkJaW5zdG1lbS0+ZmluaXNoX2FjY2VzcyhkZXYpOworCQkJcmV0dXJuOworCQl9CisKKwkJY28gKz0gODsKKwkJaWYgKGNvID49IGRldl9wcml2LT5yYW1odF9zaXplKQorCQkJY28gPSAwOworCX0gd2hpbGUgKGNvICE9IGhvKTsKKwlsaXN0X2RlbCgmcmVmLT5saXN0KTsKKwlpbnN0bWVtLT5maW5pc2hfYWNjZXNzKGRldik7CisKKwlOVl9FUlJPUihkZXYsICJSQU1IVCBlbnRyeSBub3QgZm91bmQuIGNoPSVkLCBoYW5kbGU9MHglMDh4XG4iLAorCQkgY2hhbi0+aWQsIHJlZi0+aGFuZGxlKTsKK30KKworaW50Citub3V2ZWF1X2dwdW9ial9uZXcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJICAgdWludDMyX3Qgc2l6ZSwgaW50IGFsaWduLCB1aW50MzJfdCBmbGFncywKKwkJICAgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqZ3B1b2JqX3JldCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2VuZ2luZSAqZW5naW5lID0gJmRldl9wcml2LT5lbmdpbmU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmo7CisJc3RydWN0IG1lbV9ibG9jayAqcHJhbWluID0gTlVMTDsKKwlpbnQgcmV0OworCisJTlZfREVCVUcoZGV2LCAiY2glZCBzaXplPSV1IGFsaWduPSVkIGZsYWdzPTB4JTA4eFxuIiwKKwkJIGNoYW4gPyBjaGFuLT5pZCA6IC0xLCBzaXplLCBhbGlnbiwgZmxhZ3MpOworCisJaWYgKCFkZXZfcHJpdiB8fCAhZ3B1b2JqX3JldCB8fCAqZ3B1b2JqX3JldCAhPSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdwdW9iaiA9IGt6YWxsb2Moc2l6ZW9mKCpncHVvYmopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdwdW9iaikKKwkJcmV0dXJuIC1FTk9NRU07CisJTlZfREVCVUcoZGV2LCAiZ3B1b2JqICVwXG4iLCBncHVvYmopOworCWdwdW9iai0+ZmxhZ3MgPSBmbGFnczsKKwlncHVvYmotPmltX2NoYW5uZWwgPSBjaGFuOworCisJbGlzdF9hZGRfdGFpbCgmZ3B1b2JqLT5saXN0LCAmZGV2X3ByaXYtPmdwdW9ial9saXN0KTsKKworCS8qIENob29zZSBiZXR3ZWVuIGdsb2JhbCBpbnN0bWVtIGhlYXAsIGFuZCBwZXItY2hhbm5lbCBwcml2YXRlCisJICogaW5zdG1lbSBoZWFwLiAgT24gPE5WNTAgYWxsb3cgcmVxdWVzdHMgZm9yIHByaXZhdGUgaW5zdG1lbQorCSAqIHRvIGJlIHNhdGlzZmllZCBmcm9tIGdsb2JhbCBoZWFwIGlmIG5vIHBlci1jaGFubmVsIGFyZWEKKwkgKiBhdmFpbGFibGUuCisJICovCisJaWYgKGNoYW4pIHsKKwkJaWYgKGNoYW4tPnJhbWluX2hlYXApIHsKKwkJCU5WX0RFQlVHKGRldiwgInByaXZhdGUgaGVhcFxuIik7CisJCQlwcmFtaW4gPSBjaGFuLT5yYW1pbl9oZWFwOworCQl9IGVsc2UKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgeworCQkJTlZfREVCVUcoZGV2LCAiZ2xvYmFsIGhlYXAgZmFsbGJhY2tcbiIpOworCQkJcHJhbWluID0gZGV2X3ByaXYtPnJhbWluX2hlYXA7CisJCX0KKwl9IGVsc2UgeworCQlOVl9ERUJVRyhkZXYsICJnbG9iYWwgaGVhcFxuIik7CisJCXByYW1pbiA9IGRldl9wcml2LT5yYW1pbl9oZWFwOworCX0KKworCWlmICghcHJhbWluKSB7CisJCU5WX0VSUk9SKGRldiwgIk5vIFBSQU1JTiBoZWFwIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghY2hhbikgeworCQlyZXQgPSBlbmdpbmUtPmluc3RtZW0ucG9wdWxhdGUoZGV2LCBncHVvYmosICZzaXplKTsKKwkJaWYgKHJldCkgeworCQkJbm91dmVhdV9ncHVvYmpfZGVsKGRldiwgJmdwdW9iaik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJLyogQWxsb2NhdGUgYSBjaHVuayBvZiB0aGUgUFJBTUlOIGFwZXJ0dXJlICovCisJZ3B1b2JqLT5pbV9wcmFtaW4gPSBub3V2ZWF1X21lbV9hbGxvY19ibG9jayhwcmFtaW4sIHNpemUsCisJCQkJCQkgICAgZHJtX29yZGVyKGFsaWduKSwKKwkJCQkJCSAgICAoc3RydWN0IGRybV9maWxlICopLTIsIDApOworCWlmICghZ3B1b2JqLT5pbV9wcmFtaW4pIHsKKwkJbm91dmVhdV9ncHVvYmpfZGVsKGRldiwgJmdwdW9iaik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmICghY2hhbikgeworCQlyZXQgPSBlbmdpbmUtPmluc3RtZW0uYmluZChkZXYsIGdwdW9iaik7CisJCWlmIChyZXQpIHsKKwkJCW5vdXZlYXVfZ3B1b2JqX2RlbChkZXYsICZncHVvYmopOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWlmIChncHVvYmotPmZsYWdzICYgTlZPQkpfRkxBR19aRVJPX0FMTE9DKSB7CisJCWludCBpOworCisJCWVuZ2luZS0+aW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCQlmb3IgKGkgPSAwOyBpIDwgZ3B1b2JqLT5pbV9wcmFtaW4tPnNpemU7IGkgKz0gNCkKKwkJCW52X3dvMzIoZGV2LCBncHVvYmosIGkvNCwgMCk7CisJCWVuZ2luZS0+aW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisJfQorCisJKmdwdW9ial9yZXQgPSBncHVvYmo7CisJcmV0dXJuIDA7Cit9CisKK2ludAorbm91dmVhdV9ncHVvYmpfZWFybHlfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJSU5JVF9MSVNUX0hFQUQoJmRldl9wcml2LT5ncHVvYmpfbGlzdCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50Citub3V2ZWF1X2dwdW9ial9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgcmV0OworCisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X2Zha2UoZGV2LAorCQkJZGV2X3ByaXYtPnJhbWh0X29mZnNldCwgfjAsIGRldl9wcml2LT5yYW1odF9zaXplLAorCQkJTlZPQkpfRkxBR19aRVJPX0FMTE9DIHwgTlZPQkpfRkxBR19BTExPV19OT19SRUZTLAorCQkJCQkJJmRldl9wcml2LT5yYW1odCwgTlVMTCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCit2b2lkCitub3V2ZWF1X2dwdW9ial90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJbm91dmVhdV9ncHVvYmpfZGVsKGRldiwgJmRldl9wcml2LT5yYW1odCk7Cit9CisKK3ZvaWQKK25vdXZlYXVfZ3B1b2JqX2xhdGVfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSwgKnRtcDsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJmRldl9wcml2LT5ncHVvYmpfbGlzdCkgeworCQlncHVvYmogPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmosIGxpc3QpOworCisJCU5WX0VSUk9SKGRldiwgImdwdW9iaiAlcCBzdGlsbCBleGlzdHMgYXQgdGFrZWRvd24sIHJlZnM9JWRcbiIsCisJCQkgZ3B1b2JqLCBncHVvYmotPnJlZmNvdW50KTsKKwkJZ3B1b2JqLT5yZWZjb3VudCA9IDA7CisJCW5vdXZlYXVfZ3B1b2JqX2RlbChkZXYsICZncHVvYmopOworCX0KK30KKworaW50Citub3V2ZWF1X2dwdW9ial9kZWwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqcGdwdW9iaikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2VuZ2luZSAqZW5naW5lID0gJmRldl9wcml2LT5lbmdpbmU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmo7CisJaW50IGk7CisKKwlOVl9ERUJVRyhkZXYsICJncHVvYmogJXBcbiIsIHBncHVvYmogPyAqcGdwdW9iaiA6IE5VTEwpOworCisJaWYgKCFkZXZfcHJpdiB8fCAhcGdwdW9iaiB8fCAhKCpwZ3B1b2JqKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZ3B1b2JqID0gKnBncHVvYmo7CisKKwlpZiAoZ3B1b2JqLT5yZWZjb3VudCAhPSAwKSB7CisJCU5WX0VSUk9SKGRldiwgImdwdW9iaiByZWZjb3VudCBpcyAlZFxuIiwgZ3B1b2JqLT5yZWZjb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChncHVvYmotPmltX3ByYW1pbiAmJiAoZ3B1b2JqLT5mbGFncyAmIE5WT0JKX0ZMQUdfWkVST19GUkVFKSkgeworCQllbmdpbmUtPmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKwkJZm9yIChpID0gMDsgaSA8IGdwdW9iai0+aW1fcHJhbWluLT5zaXplOyBpICs9IDQpCisJCQludl93bzMyKGRldiwgZ3B1b2JqLCBpLzQsIDApOworCQllbmdpbmUtPmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCX0KKworCWlmIChncHVvYmotPmR0b3IpCisJCWdwdW9iai0+ZHRvcihkZXYsIGdwdW9iaik7CisKKwlpZiAoZ3B1b2JqLT5pbV9iYWNraW5nICYmICEoZ3B1b2JqLT5mbGFncyAmIE5WT0JKX0ZMQUdfRkFLRSkpCisJCWVuZ2luZS0+aW5zdG1lbS5jbGVhcihkZXYsIGdwdW9iaik7CisKKwlpZiAoZ3B1b2JqLT5pbV9wcmFtaW4pIHsKKwkJaWYgKGdwdW9iai0+ZmxhZ3MgJiBOVk9CSl9GTEFHX0ZBS0UpCisJCQlrZnJlZShncHVvYmotPmltX3ByYW1pbik7CisJCWVsc2UKKwkJCW5vdXZlYXVfbWVtX2ZyZWVfYmxvY2soZ3B1b2JqLT5pbV9wcmFtaW4pOworCX0KKworCWxpc3RfZGVsKCZncHVvYmotPmxpc3QpOworCisJKnBncHVvYmogPSBOVUxMOworCWtmcmVlKGdwdW9iaik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfZ3B1b2JqX2luc3RhbmNlX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkgICAgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmosIHVpbnQzMl90ICppbnN0KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpjcHJhbWluOworCisJLyogPE5WNTAgdXNlIFBSQU1JTiBhZGRyZXNzIGV2ZXJ5d2hlcmUgKi8KKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7CisJCSppbnN0ID0gZ3B1b2JqLT5pbV9wcmFtaW4tPnN0YXJ0OworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY2hhbiAmJiBncHVvYmotPmltX2NoYW5uZWwgIT0gY2hhbikgeworCQlOVl9FUlJPUihkZXYsICJDaGFubmVsIG1pc21hdGNoOiBvYmogJWQsIHJlZiAlZFxuIiwKKwkJCSBncHVvYmotPmltX2NoYW5uZWwtPmlkLCBjaGFuLT5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIE5WNTAgY2hhbm5lbC1sb2NhbCBpbnN0YW5jZSAqLworCWlmIChjaGFuKSB7CisJCWNwcmFtaW4gPSBjaGFuLT5yYW1pbi0+Z3B1b2JqOworCQkqaW5zdCA9IGdwdW9iai0+aW1fcHJhbWluLT5zdGFydCAtIGNwcmFtaW4tPmltX3ByYW1pbi0+c3RhcnQ7CisJCXJldHVybiAwOworCX0KKworCS8qIE5WNTAgZ2xvYmFsIChWUkFNKSBpbnN0YW5jZSAqLworCWlmICghZ3B1b2JqLT5pbV9jaGFubmVsKSB7CisJCS8qIC4uLmZyb20gZ2xvYmFsIGhlYXAgKi8KKwkJaWYgKCFncHVvYmotPmltX2JhY2tpbmcpIHsKKwkJCU5WX0VSUk9SKGRldiwgIkFJSSwgbm8gVlJBTSBiYWNraW5nIGdwdW9ialxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkqaW5zdCA9IGdwdW9iai0+aW1fYmFja2luZ19zdGFydDsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogLi4uZnJvbSBsb2NhbCBoZWFwICovCisJCWNwcmFtaW4gPSBncHVvYmotPmltX2NoYW5uZWwtPnJhbWluLT5ncHVvYmo7CisJCSppbnN0ID0gY3ByYW1pbi0+aW1fYmFja2luZ19zdGFydCArCisJCQkoZ3B1b2JqLT5pbV9wcmFtaW4tPnN0YXJ0IC0gY3ByYW1pbi0+aW1fcHJhbWluLT5zdGFydCk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitpbnQKK25vdXZlYXVfZ3B1b2JqX3JlZl9hZGQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJICAgICAgIHVpbnQzMl90IGhhbmRsZSwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmosCisJCSAgICAgICBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICoqcmVmX3JldCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKnJlZjsKKwl1aW50MzJfdCBpbnN0YW5jZTsKKwlpbnQgcmV0OworCisJTlZfREVCVUcoZGV2LCAiY2glZCBoPTB4JTA4eCBncHVvYmo9JXBcbiIsCisJCSBjaGFuID8gY2hhbi0+aWQgOiAtMSwgaGFuZGxlLCBncHVvYmopOworCisJaWYgKCFkZXZfcHJpdiB8fCAhZ3B1b2JqIHx8IChyZWZfcmV0ICYmICpyZWZfcmV0ICE9IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghY2hhbiAmJiAhcmVmX3JldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZ3B1b2JqLT5lbmdpbmUgPT0gTlZPQkpfRU5HSU5FX1NXICYmICFncHVvYmotPmltX3ByYW1pbikgeworCQkvKiBzdyBvYmplY3QgKi8KKwkJaW5zdGFuY2UgPSAweDQwOworCX0gZWxzZSB7CisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2luc3RhbmNlX2dldChkZXYsIGNoYW4sIGdwdW9iaiwgJmluc3RhbmNlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmVmID0ga3phbGxvYyhzaXplb2YoKnJlZiksIEdGUF9LRVJORUwpOworCWlmICghcmVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlJTklUX0xJU1RfSEVBRCgmcmVmLT5saXN0KTsKKwlyZWYtPmdwdW9iaiAgID0gZ3B1b2JqOworCXJlZi0+Y2hhbm5lbCAgPSBjaGFuOworCXJlZi0+aW5zdGFuY2UgPSBpbnN0YW5jZTsKKworCWlmICghcmVmX3JldCkgeworCQlyZWYtPmhhbmRsZSA9IGhhbmRsZTsKKworCQlyZXQgPSBub3V2ZWF1X3JhbWh0X2luc2VydChkZXYsIHJlZik7CisJCWlmIChyZXQpIHsKKwkJCWtmcmVlKHJlZik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfSBlbHNlIHsKKwkJcmVmLT5oYW5kbGUgPSB+MDsKKwkJKnJlZl9yZXQgPSByZWY7CisJfQorCisJcmVmLT5ncHVvYmotPnJlZmNvdW50Kys7CisJcmV0dXJuIDA7Cit9CisKK2ludCBub3V2ZWF1X2dwdW9ial9yZWZfZGVsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKipwcmVmKQoreworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKnJlZjsKKworCU5WX0RFQlVHKGRldiwgInJlZiAlcFxuIiwgcHJlZiA/ICpwcmVmIDogTlVMTCk7CisKKwlpZiAoIWRldiB8fCAhcHJlZiB8fCAqcHJlZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZWYgPSAqcHJlZjsKKworCWlmIChyZWYtPmhhbmRsZSAhPSB+MCkKKwkJbm91dmVhdV9yYW1odF9yZW1vdmUoZGV2LCByZWYpOworCisJaWYgKHJlZi0+Z3B1b2JqKSB7CisJCXJlZi0+Z3B1b2JqLT5yZWZjb3VudC0tOworCisJCWlmIChyZWYtPmdwdW9iai0+cmVmY291bnQgPT0gMCkgeworCQkJaWYgKCEocmVmLT5ncHVvYmotPmZsYWdzICYgTlZPQkpfRkxBR19BTExPV19OT19SRUZTKSkKKwkJCQlub3V2ZWF1X2dwdW9ial9kZWwoZGV2LCAmcmVmLT5ncHVvYmopOworCQl9CisJfQorCisJKnByZWYgPSBOVUxMOworCWtmcmVlKHJlZik7CisJcmV0dXJuIDA7Cit9CisKK2ludAorbm91dmVhdV9ncHVvYmpfbmV3X3JlZihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqb2MsIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKnJjLAorCQkgICAgICAgdWludDMyX3QgaGFuZGxlLCB1aW50MzJfdCBzaXplLCBpbnQgYWxpZ24sCisJCSAgICAgICB1aW50MzJfdCBmbGFncywgc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqKnJlZikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaiA9IE5VTEw7CisJaW50IHJldDsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIG9jLCBzaXplLCBhbGlnbiwgZmxhZ3MsICZncHVvYmopOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9yZWZfYWRkKGRldiwgcmMsIGhhbmRsZSwgZ3B1b2JqLCByZWYpOworCWlmIChyZXQpIHsKKwkJbm91dmVhdV9ncHVvYmpfZGVsKGRldiwgJmdwdW9iaik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludAorbm91dmVhdV9ncHVvYmpfcmVmX2ZpbmQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgdWludDMyX3QgaGFuZGxlLAorCQkJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqKnJlZl9yZXQpCit7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqcmVmOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCB0bXAsICZjaGFuLT5yYW1odF9yZWZzKSB7CisJCXJlZiA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYsIGxpc3QpOworCisJCWlmIChyZWYtPmhhbmRsZSA9PSBoYW5kbGUpIHsKKwkJCWlmIChyZWZfcmV0KQorCQkJCSpyZWZfcmV0ID0gcmVmOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50Citub3V2ZWF1X2dwdW9ial9uZXdfZmFrZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBwX29mZnNldCwKKwkJCXVpbnQzMl90IGJfb2Zmc2V0LCB1aW50MzJfdCBzaXplLAorCQkJdWludDMyX3QgZmxhZ3MsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKnBncHVvYmosCisJCQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICoqcHJlZikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqID0gTlVMTDsKKwlpbnQgaTsKKworCU5WX0RFQlVHKGRldiwKKwkJICJwX29mZnNldD0weCUwOHggYl9vZmZzZXQ9MHglMDh4IHNpemU9MHglMDh4IGZsYWdzPTB4JTA4eFxuIiwKKwkJIHBfb2Zmc2V0LCBiX29mZnNldCwgc2l6ZSwgZmxhZ3MpOworCisJZ3B1b2JqID0ga3phbGxvYyhzaXplb2YoKmdwdW9iaiksIEdGUF9LRVJORUwpOworCWlmICghZ3B1b2JqKQorCQlyZXR1cm4gLUVOT01FTTsKKwlOVl9ERUJVRyhkZXYsICJncHVvYmogJXBcbiIsIGdwdW9iaik7CisJZ3B1b2JqLT5pbV9jaGFubmVsID0gTlVMTDsKKwlncHVvYmotPmZsYWdzICAgICAgPSBmbGFncyB8IE5WT0JKX0ZMQUdfRkFLRTsKKworCWxpc3RfYWRkX3RhaWwoJmdwdW9iai0+bGlzdCwgJmRldl9wcml2LT5ncHVvYmpfbGlzdCk7CisKKwlpZiAocF9vZmZzZXQgIT0gfjApIHsKKwkJZ3B1b2JqLT5pbV9wcmFtaW4gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWVtX2Jsb2NrKSwKKwkJCQkJICAgIEdGUF9LRVJORUwpOworCQlpZiAoIWdwdW9iai0+aW1fcHJhbWluKSB7CisJCQlub3V2ZWF1X2dwdW9ial9kZWwoZGV2LCAmZ3B1b2JqKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWdwdW9iai0+aW1fcHJhbWluLT5zdGFydCA9IHBfb2Zmc2V0OworCQlncHVvYmotPmltX3ByYW1pbi0+c2l6ZSAgPSBzaXplOworCX0KKworCWlmIChiX29mZnNldCAhPSB+MCkgeworCQlncHVvYmotPmltX2JhY2tpbmcgPSAoc3RydWN0IG5vdXZlYXVfYm8gKiktMTsKKwkJZ3B1b2JqLT5pbV9iYWNraW5nX3N0YXJ0ID0gYl9vZmZzZXQ7CisJfQorCisJaWYgKGdwdW9iai0+ZmxhZ3MgJiBOVk9CSl9GTEFHX1pFUk9fQUxMT0MpIHsKKwkJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CisJCWZvciAoaSA9IDA7IGkgPCBncHVvYmotPmltX3ByYW1pbi0+c2l6ZTsgaSArPSA0KQorCQkJbnZfd28zMihkZXYsIGdwdW9iaiwgaS80LCAwKTsKKwkJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKwl9CisKKwlpZiAocHJlZikgeworCQlpID0gbm91dmVhdV9ncHVvYmpfcmVmX2FkZChkZXYsIE5VTEwsIDAsIGdwdW9iaiwgcHJlZik7CisJCWlmIChpKSB7CisJCQlub3V2ZWF1X2dwdW9ial9kZWwoZGV2LCAmZ3B1b2JqKTsKKwkJCXJldHVybiBpOworCQl9CisJfQorCisJaWYgKHBncHVvYmopCisJCSpwZ3B1b2JqID0gZ3B1b2JqOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB1aW50MzJfdAorbm91dmVhdV9ncHVvYmpfY2xhc3NfaW5zdG1lbV9zaXplKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjbGFzcykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJLypYWFg6IGRvZGd5IGhhY2sgZm9yIG5vdyAqLworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKQorCQlyZXR1cm4gMjQ7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNDApCisJCXJldHVybiAzMjsKKwlyZXR1cm4gMTY7Cit9CisKKy8qCisgICBETUEgb2JqZWN0cyBhcmUgdXNlZCB0byByZWZlcmVuY2UgYSBwaWVjZSBvZiBtZW1vcnkgaW4gdGhlCisgICBmcmFtZWJ1ZmZlciwgUENJIG9yIEFHUCBhZGRyZXNzIHNwYWNlLiBFYWNoIG9iamVjdCBpcyAxNiBieXRlcyBiaWcKKyAgIGFuZCBsb29rcyBhcyBmb2xsb3dzOgorCisgICBlbnRyeVswXQorICAgMTE6MCAgY2xhc3MgKHNlZW1zIGxpa2UgSSBjYW4gYWx3YXlzIHVzZSAwIGhlcmUpCisgICAxMiAgICBwYWdlIHRhYmxlIHByZXNlbnQ/CisgICAxMyAgICBwYWdlIGVudHJ5IGxpbmVhcj8KKyAgIDE1OjE0IGFjY2VzczogMCBydywgMSBybywgMiB3bworICAgMTc6MTYgdGFyZ2V0OiAwIE5WIG1lbW9yeSwgMSBOViBtZW1vcnkgdGlsZWQsIDIgUENJLCAzIEFHUAorICAgMzE6MjAgZG1hIGFkanVzdCAoYml0cyAwLTExIG9mIHRoZSBhZGRyZXNzKQorICAgZW50cnlbMV0KKyAgIGRtYSBsaW1pdCAoc2l6ZSBvZiB0cmFuc2ZlcikKKyAgIGVudHJ5W1hdCisgICAxICAgICAwIHJlYWRvbmx5LCAxIHJlYWR3cml0ZQorICAgMzE6MTIgZG1hIGZyYW1lIGFkZHJlc3Mgb2YgdGhlIHBhZ2UgKGJpdHMgMTItMzEgb2YgdGhlIGFkZHJlc3MpCisgICBlbnRyeVtOXQorICAgcGFnZSB0YWJsZSB0ZXJtaW5hdG9yLCBzYW1lIHZhbHVlIGFzIHRoZSBmaXJzdCBwdGUsIGFzIGRvZXMgbnZpZGlhCisgICByaXZhdHYgdXNlcyAweGZmZmZmZmZmCisKKyAgIE5vbiBsaW5lYXIgcGFnZSB0YWJsZXMgbmVlZCBhIGxpc3Qgb2YgZnJhbWUgYWRkcmVzc2VzIGFmdGVyd2FyZHMsCisgICB0aGUgcml2YXR2IHByb2plY3QgaGFzIHNvbWUgaW5mbyBvbiB0aGlzLgorCisgICBUaGUgbWV0aG9kIGJlbG93IGNyZWF0ZXMgYSBETUEgb2JqZWN0IGluIGluc3RhbmNlIFJBTSBhbmQgcmV0dXJucyBhIGhhbmRsZQorICAgdG8gaXQgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQgdXAgY29udGV4dCBvYmplY3RzLgorKi8KK2ludAorbm91dmVhdV9ncHVvYmpfZG1hX25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgY2xhc3MsCisJCSAgICAgICB1aW50NjRfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUsIGludCBhY2Nlc3MsCisJCSAgICAgICBpbnQgdGFyZ2V0LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKipncHVvYmopCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2luc3RtZW1fZW5naW5lICppbnN0bWVtID0gJmRldl9wcml2LT5lbmdpbmUuaW5zdG1lbTsKKwlpbnQgcmV0OworCisJTlZfREVCVUcoZGV2LCAiY2glZCBjbGFzcz0weCUwNHggb2Zmc2V0PTB4JWxseCBzaXplPTB4JWxseFxuIiwKKwkJIGNoYW4tPmlkLCBjbGFzcywgb2Zmc2V0LCBzaXplKTsKKwlOVl9ERUJVRyhkZXYsICJhY2Nlc3M9JWQgdGFyZ2V0PSVkXG4iLCBhY2Nlc3MsIHRhcmdldCk7CisKKwlzd2l0Y2ggKHRhcmdldCkgeworCWNhc2UgTlZfRE1BX1RBUkdFVF9BR1A6CisJCW9mZnNldCArPSBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfYmFzZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgY2hhbiwKKwkJCQkgbm91dmVhdV9ncHVvYmpfY2xhc3NfaW5zdG1lbV9zaXplKGRldiwgY2xhc3MpLAorCQkJCSAxNiwgTlZPQkpfRkxBR19aRVJPX0FMTE9DIHwKKwkJCQkgTlZPQkpfRkxBR19aRVJPX0ZSRUUsIGdwdW9iaik7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBncHVvYmo6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWluc3RtZW0tPnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7CisJCXVpbnQzMl90IGZyYW1lLCBhZGp1c3QsIHB0ZV9mbGFncyA9IDA7CisKKwkJaWYgKGFjY2VzcyAhPSBOVl9ETUFfQUNDRVNTX1JPKQorCQkJcHRlX2ZsYWdzIHw9ICgxPDwxKTsKKwkJYWRqdXN0ID0gb2Zmc2V0ICYgIDB4MDAwMDBmZmY7CisJCWZyYW1lICA9IG9mZnNldCAmIH4weDAwMDAwZmZmOworCisJCW52X3dvMzIoZGV2LCAqZ3B1b2JqLCAwLCAoKDE8PDEyKSB8ICgxPDwxMykgfAorCQkJCShhZGp1c3QgPDwgMjApIHwKKwkJCQkgKGFjY2VzcyA8PCAxNCkgfAorCQkJCSAodGFyZ2V0IDw8IDE2KSB8CisJCQkJICBjbGFzcykpOworCQludl93bzMyKGRldiwgKmdwdW9iaiwgMSwgc2l6ZSAtIDEpOworCQludl93bzMyKGRldiwgKmdwdW9iaiwgMiwgZnJhbWUgfCBwdGVfZmxhZ3MpOworCQludl93bzMyKGRldiwgKmdwdW9iaiwgMywgZnJhbWUgfCBwdGVfZmxhZ3MpOworCX0gZWxzZSB7CisJCXVpbnQ2NF90IGxpbWl0ID0gb2Zmc2V0ICsgc2l6ZSAtIDE7CisJCXVpbnQzMl90IGZsYWdzMCwgZmxhZ3M1OworCisJCWlmICh0YXJnZXQgPT0gTlZfRE1BX1RBUkdFVF9WSURNRU0pIHsKKwkJCWZsYWdzMCA9IDB4MDAxOTAwMDA7CisJCQlmbGFnczUgPSAweDAwMDEwMDAwOworCQl9IGVsc2UgeworCQkJZmxhZ3MwID0gMHg3ZmMwMDAwMDsKKwkJCWZsYWdzNSA9IDB4MDAwODAwMDA7CisJCX0KKworCQludl93bzMyKGRldiwgKmdwdW9iaiwgMCwgZmxhZ3MwIHwgY2xhc3MpOworCQludl93bzMyKGRldiwgKmdwdW9iaiwgMSwgbG93ZXJfMzJfYml0cyhsaW1pdCkpOworCQludl93bzMyKGRldiwgKmdwdW9iaiwgMiwgbG93ZXJfMzJfYml0cyhvZmZzZXQpKTsKKwkJbnZfd28zMihkZXYsICpncHVvYmosIDMsICgodXBwZXJfMzJfYml0cyhsaW1pdCkgJiAweGZmKSA8PCAyNCkgfAorCQkJCQkodXBwZXJfMzJfYml0cyhvZmZzZXQpICYgMHhmZikpOworCQludl93bzMyKGRldiwgKmdwdW9iaiwgNSwgZmxhZ3M1KTsKKwl9CisKKwlpbnN0bWVtLT5maW5pc2hfYWNjZXNzKGRldik7CisKKwkoKmdwdW9iaiktPmVuZ2luZSA9IE5WT0JKX0VOR0lORV9TVzsKKwkoKmdwdW9iaiktPmNsYXNzICA9IGNsYXNzOworCXJldHVybiAwOworfQorCitpbnQKK25vdXZlYXVfZ3B1b2JqX2dhcnRfZG1hX25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJICAgIHVpbnQ2NF90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSwgaW50IGFjY2VzcywKKwkJCSAgICBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKipncHVvYmosCisJCQkgICAgdWludDMyX3QgKm9fcmV0KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgcmV0OworCisJaWYgKGRldl9wcml2LT5nYXJ0X2luZm8udHlwZSA9PSBOT1VWRUFVX0dBUlRfQUdQIHx8CisJICAgIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwICYmCisJICAgICBkZXZfcHJpdi0+Z2FydF9pbmZvLnR5cGUgPT0gTk9VVkVBVV9HQVJUX1NHRE1BKSkgeworCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9kbWFfbmV3KGNoYW4sIE5WX0NMQVNTX0RNQV9JTl9NRU1PUlksCisJCQkJCSAgICAgb2Zmc2V0ICsgZGV2X3ByaXYtPnZtX2dhcnRfYmFzZSwKKwkJCQkJICAgICBzaXplLCBhY2Nlc3MsIE5WX0RNQV9UQVJHRVRfQUdQLAorCQkJCQkgICAgIGdwdW9iaik7CisJCWlmIChvX3JldCkKKwkJCSpvX3JldCA9IDA7CisJfSBlbHNlCisJaWYgKGRldl9wcml2LT5nYXJ0X2luZm8udHlwZSA9PSBOT1VWRUFVX0dBUlRfU0dETUEpIHsKKwkJKmdwdW9iaiA9IGRldl9wcml2LT5nYXJ0X2luZm8uc2dfY3R4ZG1hOworCQlpZiAob2Zmc2V0ICYgfjB4ZmZmZmZmZmZVTEwpIHsKKwkJCU5WX0VSUk9SKGRldiwgIm9iaiBvZmZzZXQgZXhjZWVkcyAzMi1iaXRzXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChvX3JldCkKKwkJCSpvX3JldCA9ICh1aW50MzJfdClvZmZzZXQ7CisJCXJldCA9ICgqZ3B1b2JqICE9IE5VTEwpID8gMCA6IC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJTlZfRVJST1IoZGV2LCAiSW52YWxpZCBHQVJUIHR5cGUgJWRcbiIsIGRldl9wcml2LT5nYXJ0X2luZm8udHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIENvbnRleHQgb2JqZWN0cyBpbiB0aGUgaW5zdGFuY2UgUkFNIGhhdmUgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUuCisgKiBPbiBOVjQwIHRoZXkgYXJlIDMyIGJ5dGUgbG9uZywgb24gTlYzMCBhbmQgc21hbGxlciAxNiBieXRlcy4KKworICAgTlY0IC0gTlYzMDoKKworICAgZW50cnlbMF0KKyAgIDExOjAgY2xhc3MKKyAgIDEyICAgY2hyb21hIGtleSBlbmFibGUKKyAgIDEzICAgdXNlciBjbGlwIGVuYWJsZQorICAgMTQgICBzd2l6emxlIGVuYWJsZQorICAgMTc6MTUgcGF0Y2ggY29uZmlnOgorICAgICAgIHNjcmNvcHlfYW5kLCByb3BfYW5kLCBibGVuZF9hbmQsIHNjcmNvcHksIHNyY2NvcHlfcHJlLCBibGVuZF9wcmUKKyAgIDE4ICAgc3luY2hyb25pemUgZW5hYmxlCisgICAxOSAgIGVuZGlhbjogMSBiaWcsIDAgbGl0dGxlCisgICAyMToyMCBkaXRoZXIgbW9kZQorICAgMjMgICAgc2luZ2xlIHN0ZXAgZW5hYmxlCisgICAyNCAgICBwYXRjaCBzdGF0dXM6IDAgaW52YWxpZCwgMSB2YWxpZAorICAgMjUgICAgY29udGV4dF9zdXJmYWNlIDA6IDEgdmFsaWQKKyAgIDI2ICAgIGNvbnRleHQgc3VyZmFjZSAxOiAxIHZhbGlkCisgICAyNyAgICBjb250ZXh0IHBhdHRlcm46IDEgdmFsaWQKKyAgIDI4ICAgIGNvbnRleHQgcm9wOiAxIHZhbGlkCisgICAyOSwzMCBjb250ZXh0IGJldGEsIGJldGE0CisgICBlbnRyeVsxXQorICAgNzowICAgbW9ubyBmb3JtYXQKKyAgIDE1OjggIGNvbG9yIGZvcm1hdAorICAgMzE6MTYgbm90aWZ5IGluc3RhbmNlIGFkZHJlc3MKKyAgIGVudHJ5WzJdCisgICAxNTowICBkbWEgMCBpbnN0YW5jZSBhZGRyZXNzCisgICAzMToxNiBkbWEgMSBpbnN0YW5jZSBhZGRyZXNzCisgICBlbnRyeVszXQorICAgZG1hIG1ldGhvZCB0cmFwcworCisgICBOVjQwOgorICAgTm8gaWRlYSB3aGF0IHRoZSBleGFjdCBmb3JtYXQgaXMuIEhlcmUncyB3aGF0IGNhbiBiZSBkZWR1Y3RlZDoKKworICAgZW50cnlbMF06CisgICAxMTowICBjbGFzcyAgKG1heWJlIHVzZXMgbW9yZSBiaXRzIGhlcmU/KQorICAgMTcgICAgdXNlciBjbGlwIGVuYWJsZQorICAgMjE6MTkgcGF0Y2ggY29uZmlnCisgICAyNSAgICBwYXRjaCBzdGF0dXMgdmFsaWQgPworICAgZW50cnlbMV06CisgICAxNTowICBETUEgbm90aWZpZXIgIChtYXliZSAyMDowKQorICAgZW50cnlbMl06CisgICAxNTowICBETUEgMCBpbnN0YW5jZSAobWF5YmUgMjA6MCkKKyAgIDI0ICAgIGJpZyBlbmRpYW4KKyAgIGVudHJ5WzNdOgorICAgMTU6MCAgRE1BIDEgaW5zdGFuY2UgKG1heWJlIDIwOjApCisgICBlbnRyeVs0XToKKyAgIGVudHJ5WzVdOgorICAgc2V0IHRvIDA/CisqLworaW50Citub3V2ZWF1X2dwdW9ial9ncl9uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGNsYXNzLAorCQkgICAgICBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKipncHVvYmopCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCByZXQ7CisKKwlOVl9ERUJVRyhkZXYsICJjaCVkIGNsYXNzPTB4JTA0eFxuIiwgY2hhbi0+aWQsIGNsYXNzKTsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIGNoYW4sCisJCQkJIG5vdXZlYXVfZ3B1b2JqX2NsYXNzX2luc3RtZW1fc2l6ZShkZXYsIGNsYXNzKSwKKwkJCQkgMTYsCisJCQkJIE5WT0JKX0ZMQUdfWkVST19BTExPQyB8IE5WT0JKX0ZMQUdfWkVST19GUkVFLAorCQkJCSBncHVvYmopOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiRXJyb3IgY3JlYXRpbmcgZ3B1b2JqOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgeworCQludl93bzMyKGRldiwgKmdwdW9iaiwgMCwgY2xhc3MpOworCQludl93bzMyKGRldiwgKmdwdW9iaiwgNSwgMHgwMDAxMDAwMCk7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChjbGFzcykgeworCQljYXNlIE5WX0NMQVNTX05VTEw6CisJCQludl93bzMyKGRldiwgKmdwdW9iaiwgMCwgMHgwMDAwMTAzMCk7CisJCQludl93bzMyKGRldiwgKmdwdW9iaiwgMSwgMHhGRkZGRkZGRik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzQwKSB7CisJCQkJbnZfd28zMihkZXYsICpncHVvYmosIDAsIGNsYXNzKTsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJCQludl93bzMyKGRldiwgKmdwdW9iaiwgMiwgMHgwMTAwMDAwMCk7CisjZW5kaWYKKwkJCX0gZWxzZSB7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCQkJbnZfd28zMihkZXYsICpncHVvYmosIDAsIGNsYXNzIHwgMHgwMDA4MDAwMCk7CisjZWxzZQorCQkJCW52X3dvMzIoZGV2LCAqZ3B1b2JqLCAwLCBjbGFzcyk7CisjZW5kaWYKKwkJCX0KKwkJfQorCX0KKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCisJKCpncHVvYmopLT5lbmdpbmUgPSBOVk9CSl9FTkdJTkVfR1I7CisJKCpncHVvYmopLT5jbGFzcyAgPSBjbGFzczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbm91dmVhdV9ncHVvYmpfc3dfbmV3KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBjbGFzcywKKwkJICAgICAgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqZ3B1b2JqX3JldCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjaGFuLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqOworCisJaWYgKCFjaGFuIHx8ICFncHVvYmpfcmV0IHx8ICpncHVvYmpfcmV0ICE9IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJZ3B1b2JqID0ga3phbGxvYyhzaXplb2YoKmdwdW9iaiksIEdGUF9LRVJORUwpOworCWlmICghZ3B1b2JqKQorCQlyZXR1cm4gLUVOT01FTTsKKwlncHVvYmotPmVuZ2luZSA9IE5WT0JKX0VOR0lORV9TVzsKKwlncHVvYmotPmNsYXNzID0gY2xhc3M7CisKKwlsaXN0X2FkZF90YWlsKCZncHVvYmotPmxpc3QsICZkZXZfcHJpdi0+Z3B1b2JqX2xpc3QpOworCSpncHVvYmpfcmV0ID0gZ3B1b2JqOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2dwdW9ial9jaGFubmVsX2luaXRfcHJhbWluKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcHJhbWluID0gTlVMTDsKKwl1aW50MzJfdCBzaXplOworCXVpbnQzMl90IGJhc2U7CisJaW50IHJldDsKKworCU5WX0RFQlVHKGRldiwgImNoJWRcbiIsIGNoYW4tPmlkKTsKKworCS8qIEJhc2UgYW1vdW50IGZvciBvYmplY3Qgc3RvcmFnZSAoNEtpQiBlbm91Z2g/KSAqLworCXNpemUgPSAweDEwMDA7CisJYmFzZSA9IDA7CisKKwkvKiBQR1JBUEggY29udGV4dCAqLworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTApIHsKKwkJLyogVmFyaW91cyBmaXhlZCB0YWJsZSB0aGluZ29zICovCisJCXNpemUgKz0gMHgxNDAwOyAvKiBtb3N0bHkgdW5rbm93biBzdHVmZiAqLworCQlzaXplICs9IDB4NDAwMDsgLyogdm0gcGQgKi8KKwkJYmFzZSAgPSAweDYwMDA7CisJCS8qIFJBTUhULCBub3Qgc3VyZSBhYm91dCBzZXR0aW5nIHNpemUgeWV0LCAzMktpQiB0byBiZSBzYWZlICovCisJCXNpemUgKz0gMHg4MDAwOworCQkvKiBSQU1GQyAqLworCQlzaXplICs9IDB4MTAwMDsKKwkJLyogUEdSQVBIIGNvbnRleHQgKi8KKwkJc2l6ZSArPSAweDcwMDAwOworCX0KKworCU5WX0RFQlVHKGRldiwgImNoJWQgUFJBTUlOIHNpemU6IDB4JTA4eCBieXRlcywgYmFzZSBhbGxvYz0weCUwOHhcbiIsCisJCSBjaGFuLT5pZCwgc2l6ZSwgYmFzZSk7CisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X3JlZihkZXYsIE5VTEwsIE5VTEwsIDAsIHNpemUsIDB4MTAwMCwgMCwKKwkJCQkgICAgICZjaGFuLT5yYW1pbik7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJFcnJvciBhbGxvY2F0aW5nIGNoYW5uZWwgUFJBTUlOOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcHJhbWluID0gY2hhbi0+cmFtaW4tPmdwdW9iajsKKworCXJldCA9IG5vdXZlYXVfbWVtX2luaXRfaGVhcCgmY2hhbi0+cmFtaW5faGVhcCwKKwkJCQkgICAgcHJhbWluLT5pbV9wcmFtaW4tPnN0YXJ0ICsgYmFzZSwgc2l6ZSk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBQUkFNSU4gaGVhcDogJWRcbiIsIHJldCk7CisJCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoZGV2LCAmY2hhbi0+cmFtaW4pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitpbnQKK25vdXZlYXVfZ3B1b2JqX2NoYW5uZWxfaW5pdChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJICAgIHVpbnQzMl90IHZyYW1faCwgdWludDMyX3QgdHRfaCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9lbmdpbmUgKmluc3RtZW0gPSAmZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqdnJhbSA9IE5VTEwsICp0dCA9IE5VTEw7CisJaW50IHJldCwgaTsKKworCUlOSVRfTElTVF9IRUFEKCZjaGFuLT5yYW1odF9yZWZzKTsKKworCU5WX0RFQlVHKGRldiwgImNoJWQgdnJhbT0weCUwOHggdHQ9MHglMDh4XG4iLCBjaGFuLT5pZCwgdnJhbV9oLCB0dF9oKTsKKworCS8qIFJlc2VydmUgYSBibG9jayBvZiBQUkFNSU4gZm9yIHRoZSBjaGFubmVsCisJICpYWFg6IG1heWJlIG9uIDxOVjUwIHRvbyBhdCBzb21lIHBvaW50CisJICovCisJaWYgKDAgfHwgZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl81MCkgeworCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9jaGFubmVsX2luaXRfcHJhbWluKGNoYW4pOworCQlpZiAocmV0KSB7CisJCQlOVl9FUlJPUihkZXYsICJpbml0IHByYW1pblxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJLyogTlY1MCBWTQorCSAqICAtIEFsbG9jYXRlIHBlci1jaGFubmVsIHBhZ2UtZGlyZWN0b3J5CisJICogIC0gTWFwIEdBUlQgYW5kIFZSQU0gaW50byB0aGUgY2hhbm5lbCdzIGFkZHJlc3Mgc3BhY2UgYXQgdGhlCisJICogICAgbG9jYXRpb25zIGRldGVybWluZWQgZHVyaW5nIGluaXQuCisJICovCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKKwkJdWludDMyX3Qgdm1fb2Zmc2V0LCBwZGU7CisKKwkJaW5zdG1lbS0+cHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKworCQl2bV9vZmZzZXQgPSAoZGV2X3ByaXYtPmNoaXBzZXQgJiAweGYwKSA9PSAweDUwID8gMHgxNDAwIDogMHgyMDA7CisJCXZtX29mZnNldCArPSBjaGFuLT5yYW1pbi0+Z3B1b2JqLT5pbV9wcmFtaW4tPnN0YXJ0OworCisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19mYWtlKGRldiwgdm1fb2Zmc2V0LCB+MCwgMHg0MDAwLAorCQkJCQkJCTAsICZjaGFuLT52bV9wZCwgTlVMTCk7CisJCWlmIChyZXQpIHsKKwkJCWluc3RtZW0tPmZpbmlzaF9hY2Nlc3MoZGV2KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IDB4NDAwMDsgaSArPSA4KSB7CisJCQludl93bzMyKGRldiwgY2hhbi0+dm1fcGQsIChpKzApLzQsIDB4MDAwMDAwMDApOworCQkJbnZfd28zMihkZXYsIGNoYW4tPnZtX3BkLCAoaSs0KS80LCAweGRlYWRjYWZlKTsKKwkJfQorCisJCXBkZSA9IChkZXZfcHJpdi0+dm1fZ2FydF9iYXNlIC8gKDUxMioxMDI0KjEwMjQpKSAqIDI7CisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX3JlZl9hZGQoZGV2LCBOVUxMLCAwLAorCQkJCQkgICAgIGRldl9wcml2LT5nYXJ0X2luZm8uc2dfY3R4ZG1hLAorCQkJCQkgICAgICZjaGFuLT52bV9nYXJ0X3B0KTsKKwkJaWYgKHJldCkgeworCQkJaW5zdG1lbS0+ZmluaXNoX2FjY2VzcyhkZXYpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQludl93bzMyKGRldiwgY2hhbi0+dm1fcGQsIHBkZSsrLAorCQkJICAgIGNoYW4tPnZtX2dhcnRfcHQtPmluc3RhbmNlIHwgMHgwMyk7CisJCW52X3dvMzIoZGV2LCBjaGFuLT52bV9wZCwgcGRlKyssIDB4MDAwMDAwMDApOworCisJCXBkZSA9IChkZXZfcHJpdi0+dm1fdnJhbV9iYXNlIC8gKDUxMioxMDI0KjEwMjQpKSAqIDI7CisJCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+dm1fdnJhbV9wdF9ucjsgaSsrKSB7CisJCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9yZWZfYWRkKGRldiwgTlVMTCwgMCwKKwkJCQkJCSAgICAgZGV2X3ByaXYtPnZtX3ZyYW1fcHRbaV0sCisJCQkJCQkgICAgICZjaGFuLT52bV92cmFtX3B0W2ldKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlpbnN0bWVtLT5maW5pc2hfYWNjZXNzKGRldik7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKworCQkJbnZfd28zMihkZXYsIGNoYW4tPnZtX3BkLCBwZGUrKywKKwkJCQkgICAgY2hhbi0+dm1fdnJhbV9wdFtpXS0+aW5zdGFuY2UgfCAweDYxKTsKKwkJCW52X3dvMzIoZGV2LCBjaGFuLT52bV9wZCwgcGRlKyssIDB4MDAwMDAwMDApOworCQl9CisKKwkJaW5zdG1lbS0+ZmluaXNoX2FjY2VzcyhkZXYpOworCX0KKworCS8qIFJBTUhUICovCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgeworCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9yZWZfYWRkKGRldiwgTlVMTCwgMCwgZGV2X3ByaXYtPnJhbWh0LAorCQkJCQkgICAgICZjaGFuLT5yYW1odCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19yZWYoZGV2LCBjaGFuLCBjaGFuLCAwLAorCQkJCQkgICAgIDB4ODAwMCwgMTYsCisJCQkJCSAgICAgTlZPQkpfRkxBR19aRVJPX0FMTE9DLAorCQkJCQkgICAgICZjaGFuLT5yYW1odCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFZSQU0gY3R4ZG1hICovCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfZG1hX25ldyhjaGFuLCBOVl9DTEFTU19ETUFfSU5fTUVNT1JZLAorCQkJCQkgICAgIDAsIGRldl9wcml2LT52bV9lbmQsCisJCQkJCSAgICAgTlZfRE1BX0FDQ0VTU19SVywKKwkJCQkJICAgICBOVl9ETUFfVEFSR0VUX0FHUCwgJnZyYW0pOworCQlpZiAocmV0KSB7CisJCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBWUkFNIGN0eGRtYTogJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfZG1hX25ldyhjaGFuLCBOVl9DTEFTU19ETUFfSU5fTUVNT1JZLAorCQkJCQkJMCwgZGV2X3ByaXYtPmZiX2F2YWlsYWJsZV9zaXplLAorCQkJCQkJTlZfRE1BX0FDQ0VTU19SVywKKwkJCQkJCU5WX0RNQV9UQVJHRVRfVklETUVNLCAmdnJhbSk7CisJCWlmIChyZXQpIHsKKwkJCU5WX0VSUk9SKGRldiwgIkVycm9yIGNyZWF0aW5nIFZSQU0gY3R4ZG1hOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9yZWZfYWRkKGRldiwgY2hhbiwgdnJhbV9oLCB2cmFtLCBOVUxMKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIHJlZmVyZW5jaW5nIFZSQU0gY3R4ZG1hOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBUVCBtZW1vcnkgY3R4ZG1hICovCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKKwkJdHQgPSB2cmFtOworCX0gZWxzZQorCWlmIChkZXZfcHJpdi0+Z2FydF9pbmZvLnR5cGUgIT0gTk9VVkVBVV9HQVJUX05PTkUpIHsKKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfZ2FydF9kbWFfbmV3KGNoYW4sIDAsCisJCQkJCQkgIGRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9zaXplLAorCQkJCQkJICBOVl9ETUFfQUNDRVNTX1JXLCAmdHQsIE5VTEwpOworCX0gZWxzZSB7CisJCU5WX0VSUk9SKGRldiwgIkludmFsaWQgR0FSVCB0eXBlICVkXG4iLCBkZXZfcHJpdi0+Z2FydF9pbmZvLnR5cGUpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiRXJyb3IgY3JlYXRpbmcgVFQgY3R4ZG1hOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9yZWZfYWRkKGRldiwgY2hhbiwgdHRfaCwgdHQsIE5VTEwpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiRXJyb3IgcmVmZXJlbmNpbmcgVFQgY3R4ZG1hOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbm91dmVhdV9ncHVvYmpfY2hhbm5lbF90YWtlZG93bihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNoYW4tPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSwgKnRtcDsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICpyZWY7CisJaW50IGk7CisKKwlOVl9ERUJVRyhkZXYsICJjaCVkXG4iLCBjaGFuLT5pZCk7CisKKwlpZiAoIWNoYW4tPnJhbWh0X3JlZnMubmV4dCkKKwkJcmV0dXJuOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCB0bXAsICZjaGFuLT5yYW1odF9yZWZzKSB7CisJCXJlZiA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYsIGxpc3QpOworCisJCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoZGV2LCAmcmVmKTsKKwl9CisKKwlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJmNoYW4tPnJhbWh0KTsKKworCW5vdXZlYXVfZ3B1b2JqX2RlbChkZXYsICZjaGFuLT52bV9wZCk7CisJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZjaGFuLT52bV9nYXJ0X3B0KTsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPnZtX3ZyYW1fcHRfbnI7IGkrKykKKwkJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZjaGFuLT52bV92cmFtX3B0W2ldKTsKKworCWlmIChjaGFuLT5yYW1pbl9oZWFwKQorCQlub3V2ZWF1X21lbV90YWtlZG93bigmY2hhbi0+cmFtaW5faGVhcCk7CisJaWYgKGNoYW4tPnJhbWluKQorCQlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJmNoYW4tPnJhbWluKTsKKworfQorCitpbnQKK25vdXZlYXVfZ3B1b2JqX3N1c3BlbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqOworCWludCBpOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgeworCQlkZXZfcHJpdi0+c3VzcmVzLnJhbWluX2NvcHkgPSB2bWFsbG9jKGRldl9wcml2LT5yYW1pbl9yc3ZkX3ZyYW0pOworCQlpZiAoIWRldl9wcml2LT5zdXNyZXMucmFtaW5fY29weSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+cmFtaW5fcnN2ZF92cmFtOyBpICs9IDQpCisJCQlkZXZfcHJpdi0+c3VzcmVzLnJhbWluX2NvcHlbaS80XSA9IG52X3JpMzIoZGV2LCBpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShncHVvYmosICZkZXZfcHJpdi0+Z3B1b2JqX2xpc3QsIGxpc3QpIHsKKwkJaWYgKCFncHVvYmotPmltX2JhY2tpbmcgfHwgKGdwdW9iai0+ZmxhZ3MgJiBOVk9CSl9GTEFHX0ZBS0UpKQorCQkJY29udGludWU7CisKKwkJZ3B1b2JqLT5pbV9iYWNraW5nX3N1c3BlbmQgPSB2bWFsbG9jKGdwdW9iai0+aW1fcHJhbWluLT5zaXplKTsKKwkJaWYgKCFncHVvYmotPmltX2JhY2tpbmdfc3VzcGVuZCkgeworCQkJbm91dmVhdV9ncHVvYmpfcmVzdW1lKGRldik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIGZhbHNlKTsKKwkJZm9yIChpID0gMDsgaSA8IGdwdW9iai0+aW1fcHJhbWluLT5zaXplIC8gNDsgaSsrKQorCQkJZ3B1b2JqLT5pbV9iYWNraW5nX3N1c3BlbmRbaV0gPSBudl9ybzMyKGRldiwgZ3B1b2JqLCBpKTsKKwkJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbm91dmVhdV9ncHVvYmpfc3VzcGVuZF9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iajsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKKwkJdmZyZWUoZGV2X3ByaXYtPnN1c3Jlcy5yYW1pbl9jb3B5KTsKKwkJZGV2X3ByaXYtPnN1c3Jlcy5yYW1pbl9jb3B5ID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZ3B1b2JqLCAmZGV2X3ByaXYtPmdwdW9ial9saXN0LCBsaXN0KSB7CisJCWlmICghZ3B1b2JqLT5pbV9iYWNraW5nX3N1c3BlbmQpCisJCQljb250aW51ZTsKKworCQl2ZnJlZShncHVvYmotPmltX2JhY2tpbmdfc3VzcGVuZCk7CisJCWdwdW9iai0+aW1fYmFja2luZ19zdXNwZW5kID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQKK25vdXZlYXVfZ3B1b2JqX3Jlc3VtZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmo7CisJaW50IGk7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+cmFtaW5fcnN2ZF92cmFtOyBpICs9IDQpCisJCQludl93aTMyKGRldiwgaSwgZGV2X3ByaXYtPnN1c3Jlcy5yYW1pbl9jb3B5W2kvNF0pOworCQlub3V2ZWF1X2dwdW9ial9zdXNwZW5kX2NsZWFudXAoZGV2KTsKKwkJcmV0dXJuOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZ3B1b2JqLCAmZGV2X3ByaXYtPmdwdW9ial9saXN0LCBsaXN0KSB7CisJCWlmICghZ3B1b2JqLT5pbV9iYWNraW5nX3N1c3BlbmQpCisJCQljb250aW51ZTsKKworCQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKwkJZm9yIChpID0gMDsgaSA8IGdwdW9iai0+aW1fcHJhbWluLT5zaXplIC8gNDsgaSsrKQorCQkJbnZfd28zMihkZXYsIGdwdW9iaiwgaSwgZ3B1b2JqLT5pbV9iYWNraW5nX3N1c3BlbmRbaV0pOworCQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCX0KKworCW5vdXZlYXVfZ3B1b2JqX3N1c3BlbmRfY2xlYW51cChkZXYpOworfQorCitpbnQgbm91dmVhdV9pb2N0bF9ncm9ial9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ3JvYmpfYWxsb2MgKmluaXQgPSBkYXRhOworCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOworCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgKmdyYzsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdyID0gTlVMTDsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOworCWludCByZXQ7CisKKwlOT1VWRUFVX0NIRUNLX0lOSVRJQUxJU0VEX1dJVEhfUkVUVVJOOworCU5PVVZFQVVfR0VUX1VTRVJfQ0hBTk5FTF9XSVRIX1JFVFVSTihpbml0LT5jaGFubmVsLCBmaWxlX3ByaXYsIGNoYW4pOworCisJaWYgKGluaXQtPmhhbmRsZSA9PSB+MCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlncmMgPSBwZ3JhcGgtPmdyY2xhc3M7CisJd2hpbGUgKGdyYy0+aWQpIHsKKwkJaWYgKGdyYy0+aWQgPT0gaW5pdC0+Y2xhc3MpCisJCQlicmVhazsKKwkJZ3JjKys7CisJfQorCisJaWYgKCFncmMtPmlkKSB7CisJCU5WX0VSUk9SKGRldiwgIklsbGVnYWwgb2JqZWN0IGNsYXNzOiAweCV4XG4iLCBpbml0LT5jbGFzcyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaWYgKG5vdXZlYXVfZ3B1b2JqX3JlZl9maW5kKGNoYW4sIGluaXQtPmhhbmRsZSwgTlVMTCkgPT0gMCkKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwlpZiAoIWdyYy0+c29mdHdhcmUpCisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2dyX25ldyhjaGFuLCBncmMtPmlkLCAmZ3IpOworCWVsc2UKKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfc3dfbmV3KGNoYW4sIGdyYy0+aWQsICZncik7CisKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIGNyZWF0aW5nIG9iamVjdDogJWQgKCVkLzB4JTA4eClcbiIsCisJCQkgcmV0LCBpbml0LT5jaGFubmVsLCBpbml0LT5oYW5kbGUpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX3JlZl9hZGQoZGV2LCBjaGFuLCBpbml0LT5oYW5kbGUsIGdyLCBOVUxMKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIHJlZmVyZW5jaW5nIG9iamVjdDogJWQgKCVkLzB4JTA4eClcbiIsCisJCQkgcmV0LCBpbml0LT5jaGFubmVsLCBpbml0LT5oYW5kbGUpOworCQlub3V2ZWF1X2dwdW9ial9kZWwoZGV2LCAmZ3IpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbm91dmVhdV9pb2N0bF9ncHVvYmpfZnJlZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dwdW9ial9mcmVlICpvYmpmcmVlID0gZGF0YTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICpyZWY7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbjsKKwlpbnQgcmV0OworCisJTk9VVkVBVV9DSEVDS19JTklUSUFMSVNFRF9XSVRIX1JFVFVSTjsKKwlOT1VWRUFVX0dFVF9VU0VSX0NIQU5ORUxfV0lUSF9SRVRVUk4ob2JqZnJlZS0+Y2hhbm5lbCwgZmlsZV9wcml2LCBjaGFuKTsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX3JlZl9maW5kKGNoYW4sIG9iamZyZWUtPmhhbmRsZSwgJnJlZik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJnJlZik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMWIwZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3JlZy5oCkBAIC0wLDAgKzEsODM2IEBACisKKworI2RlZmluZSBOVjAzX0JPT1RfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjICAgIGRlZmluZSBOVjAzX0JPT1RfMF9SQU1fQU1PVU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyMgICAgZGVmaW5lIE5WMDNfQk9PVF8wX1JBTV9BTU9VTlRfOE1CICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorIyAgICBkZWZpbmUgTlYwM19CT09UXzBfUkFNX0FNT1VOVF8yTUIgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjICAgIGRlZmluZSBOVjAzX0JPT1RfMF9SQU1fQU1PVU5UXzRNQiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyMgICAgZGVmaW5lIE5WMDNfQk9PVF8wX1JBTV9BTU9VTlRfOE1CX1NEUkFNICAgICAgICAgICAgICAgMHgwMDAwMDAwMworIyAgICBkZWZpbmUgTlYwNF9CT09UXzBfUkFNX0FNT1VOVF8zMk1CICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjICAgIGRlZmluZSBOVjA0X0JPT1RfMF9SQU1fQU1PVU5UXzRNQiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyMgICAgZGVmaW5lIE5WMDRfQk9PVF8wX1JBTV9BTU9VTlRfOE1CICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorIyAgICBkZWZpbmUgTlYwNF9CT09UXzBfUkFNX0FNT1VOVF8xNk1CICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisKKyNkZWZpbmUgTlYwNF9GSUZPX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDIwYworIyAgICBkZWZpbmUgTlYxMF9GSUZPX0RBVEFfUkFNX0FNT1VOVF9NQl9NQVNLICAgICAgICAgICAgICAweGZmZjAwMDAwCisjICAgIGRlZmluZSBOVjEwX0ZJRk9fREFUQV9SQU1fQU1PVU5UX01CX1NISUZUICAgICAgICAgICAgIDIwCisKKyNkZWZpbmUgTlZfUkFNSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDcwMDAwMAorCisjZGVmaW5lIE5WX1JBTUhUX0hBTkRMRV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTlZfUkFNSFRfQ09OVEVYVF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorIyAgICBkZWZpbmUgTlZfUkFNSFRfQ09OVEVYVF9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MzEpCisjICAgIGRlZmluZSBOVl9SQU1IVF9DT05URVhUX0NIQU5ORUxfU0hJRlQgICAgICAgICAgICAgICAgIDI0CisjICAgIGRlZmluZSBOVl9SQU1IVF9DT05URVhUX0VOR0lORV9TSElGVCAgICAgICAgICAgICAgICAgIDE2CisjICAgICAgICBkZWZpbmUgTlZfUkFNSFRfQ09OVEVYVF9FTkdJTkVfU09GVFdBUkUgICAgICAgICAgIDAKKyMgICAgICAgIGRlZmluZSBOVl9SQU1IVF9DT05URVhUX0VOR0lORV9HUkFQSElDUyAgICAgICAgICAgMQorIyAgICBkZWZpbmUgTlZfUkFNSFRfQ09OVEVYVF9JTlNUQU5DRV9TSElGVCAgICAgICAgICAgICAgICAwCisjICAgIGRlZmluZSBOVjQwX1JBTUhUX0NPTlRFWFRfQ0hBTk5FTF9TSElGVCAgICAgICAgICAgICAgIDIzCisjICAgIGRlZmluZSBOVjQwX1JBTUhUX0NPTlRFWFRfRU5HSU5FX1NISUZUICAgICAgICAgICAgICAgIDIwCisjICAgIGRlZmluZSBOVjQwX1JBTUhUX0NPTlRFWFRfSU5TVEFOQ0VfU0hJRlQgICAgICAgICAgICAgIDAKKworLyogRE1BIG9iamVjdCBkZWZpbmVzICovCisjZGVmaW5lIE5WX0RNQV9BQ0NFU1NfUlcgMAorI2RlZmluZSBOVl9ETUFfQUNDRVNTX1JPIDEKKyNkZWZpbmUgTlZfRE1BX0FDQ0VTU19XTyAyCisjZGVmaW5lIE5WX0RNQV9UQVJHRVRfVklETUVNIDAKKyNkZWZpbmUgTlZfRE1BX1RBUkdFVF9QQ0kgICAgMgorI2RlZmluZSBOVl9ETUFfVEFSR0VUX0FHUCAgICAzCisvKiBUaGUgZm9sbG93aW5nIGlzIG5vdCBhIHJlYWwgdmFsdWUgdXNlZCBieSB0aGUgY2FyZCwgaXQncyBjaGFuZ2VkIGJ5CisgKiBub3V2ZWF1X29iamVjdF9kbWFfY3JlYXRlICovCisjZGVmaW5lIE5WX0RNQV9UQVJHRVRfUENJX05PTkxJTkVBUiA4CisKKy8qIFNvbWUgb2JqZWN0IGNsYXNzZXMgd2UgY2FyZSBhYm91dCBpbiB0aGUgZHJtICovCisjZGVmaW5lIE5WX0NMQVNTX0RNQV9GUk9NX01FTU9SWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgTlZfQ0xBU1NfRE1BX1RPX01FTU9SWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBOVl9DTEFTU19OVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDMwCisjZGVmaW5lIE5WX0NMQVNTX0RNQV9JTl9NRU1PUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwM0QKKworI2RlZmluZSBOVjAzX1VTRVIoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwODAwMDAwKyhpKk5WMDNfVVNFUl9TSVpFKSkKKyNkZWZpbmUgTlYwM19VU0VSX19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIE5WMTBfVVNFUl9fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBOVjAzX1VTRVJfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgTlYwM19VU0VSX0RNQV9QVVQoaSkgICAgICAgICAgICAgICAgICAgICAoMHgwMDgwMDA0MCsoaSpOVjAzX1VTRVJfU0laRSkpCisjZGVmaW5lIE5WMDNfVVNFUl9ETUFfUFVUX19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBOVjEwX1VTRVJfRE1BX1BVVF9fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgTlYwM19VU0VSX0RNQV9HRVQoaSkgICAgICAgICAgICAgICAgICAgICAoMHgwMDgwMDA0NCsoaSpOVjAzX1VTRVJfU0laRSkpCisjZGVmaW5lIE5WMDNfVVNFUl9ETUFfR0VUX19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBOVjEwX1VTRVJfRE1BX0dFVF9fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgTlYwM19VU0VSX1JFRl9DTlQoaSkgICAgICAgICAgICAgICAgICAgICAoMHgwMDgwMDA0OCsoaSpOVjAzX1VTRVJfU0laRSkpCisjZGVmaW5lIE5WMDNfVVNFUl9SRUZfQ05UX19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBOVjEwX1VTRVJfUkVGX0NOVF9fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIKKworI2RlZmluZSBOVjQwX1VTRVIoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwYzAwMDAwKyhpKk5WNDBfVVNFUl9TSVpFKSkKKyNkZWZpbmUgTlY0MF9VU0VSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIE5WNDBfVVNFUl9ETUFfUFVUKGkpICAgICAgICAgICAgICAgICAgICAgKDB4MDBjMDAwNDArKGkqTlY0MF9VU0VSX1NJWkUpKQorI2RlZmluZSBOVjQwX1VTRVJfRE1BX1BVVF9fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgTlY0MF9VU0VSX0RNQV9HRVQoaSkgICAgICAgICAgICAgICAgICAgICAoMHgwMGMwMDA0NCsoaSpOVjQwX1VTRVJfU0laRSkpCisjZGVmaW5lIE5WNDBfVVNFUl9ETUFfR0VUX19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBOVjQwX1VTRVJfUkVGX0NOVChpKSAgICAgICAgICAgICAgICAgICAgICgweDAwYzAwMDQ4KyhpKk5WNDBfVVNFUl9TSVpFKSkKKyNkZWZpbmUgTlY0MF9VU0VSX1JFRl9DTlRfX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyCisKKyNkZWZpbmUgTlY1MF9VU0VSKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMGMwMDAwMCsoaSpOVjUwX1VTRVJfU0laRSkpCisjZGVmaW5lIE5WNTBfVVNFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBOVjUwX1VTRVJfRE1BX1BVVChpKSAgICAgICAgICAgICAgICAgICAgICgweDAwYzAwMDQwKyhpKk5WNTBfVVNFUl9TSVpFKSkKKyNkZWZpbmUgTlY1MF9VU0VSX0RNQV9QVVRfX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4CisjZGVmaW5lIE5WNTBfVVNFUl9ETUFfR0VUKGkpICAgICAgICAgICAgICAgICAgICAgKDB4MDBjMDAwNDQrKGkqTlY1MF9VU0VSX1NJWkUpKQorI2RlZmluZSBOVjUwX1VTRVJfRE1BX0dFVF9fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgKKyNkZWZpbmUgTlY1MF9VU0VSX1JFRl9DTlQoaSkgICAgICAgICAgICAgICAgICAgICAoMHgwMGMwMDA0OCsoaSpOVjUwX1VTRVJfU0laRSkpCisjZGVmaW5lIE5WNTBfVVNFUl9SRUZfQ05UX19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOAorCisjZGVmaW5lIE5WMDNfRklGT19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMFVMCisKKyNkZWZpbmUgTlYwM19QTUNfQk9PVF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjAzX1BNQ19CT09UXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIE5WMDNfUE1DX0lOVFJfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyMgICAgZGVmaW5lIE5WX1BNQ19JTlRSXzBfUEZJRk9fUEVORElORyAgICAgICAgICAgICAgICAgICAgICAgICgxPDw4KQorIyAgICBkZWZpbmUgTlZfUE1DX0lOVFJfMF9QR1JBUEhfUEVORElORyAgICAgICAgICAgICAgICAgICAgICAoMTw8MTIpCisjICAgIGRlZmluZSBOVl9QTUNfSU5UUl8wX05WNTBfSTJDX1BFTkRJTkcgICAgICAgICAgICAgICAgICAgICgxPDwyMSkKKyMgICAgZGVmaW5lIE5WX1BNQ19JTlRSXzBfQ1JUQzBfUEVORElORyAgICAgICAgICAgICAgICAgICAgICAgKDE8PDI0KQorIyAgICBkZWZpbmUgTlZfUE1DX0lOVFJfMF9DUlRDMV9QRU5ESU5HICAgICAgICAgICAgICAgICAgICAgICAoMTw8MjUpCisjICAgIGRlZmluZSBOVl9QTUNfSU5UUl8wX05WNTBfRElTUExBWV9QRU5ESU5HICAgICAgICAgICAgICAgICgxPDwyNikKKyMgICAgZGVmaW5lIE5WX1BNQ19JTlRSXzBfQ1JUQ25fUEVORElORyAgICAgICAgICAgICAgICAgICAgICAgKDM8PDI0KQorI2RlZmluZSBOVjAzX1BNQ19JTlRSX0VOXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTQwCisjICAgIGRlZmluZSBOVl9QTUNfSU5UUl9FTl8wX01BU1RFUl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgTlYwM19QTUNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorIyAgICBkZWZpbmUgTlZfUE1DX0VOQUJMRV9QRklGTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDgpCisjICAgIGRlZmluZSBOVl9QTUNfRU5BQkxFX1BHUkFQSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwxMikKKy8qIERpc2FibGluZyB0aGUgYmVsb3cgYml0IGJyZWFrcyBuZXdlciAoRzdYIG9ubHk/KSBtb2JpbGUgY2hpcHNldHMsCisgKiB0aGUgY2FyZCB3aWxsIGhhbmcgZWFybHkgb24gaW4gdGhlIFggaW5pdCBwcm9jZXNzLgorICovCisjICAgIGRlZmluZSBOVl9QTUNfRU5BQkxFX1VOSzEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwxMykKKyNkZWZpbmUgTlY0MF9QTUNfQkFDS0xJR0hUCQkJCSAgIDB4MDAwMDE1ZjAKKyMJZGVmaW5lIE5WNDBfUE1DX0JBQ0tMSUdIVF9NQVNLCQkJICAgMHgwMDFmMDAwMAorI2RlZmluZSBOVjQwX1BNQ18xNzAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxNzAwCisjZGVmaW5lIE5WNDBfUE1DXzE3MDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDE3MDQKKyNkZWZpbmUgTlY0MF9QTUNfMTcwOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTcwOAorI2RlZmluZSBOVjQwX1BNQ18xNzBDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxNzBDCisKKy8qIHByb2JhYmx5IFBNQyA/ICovCisjZGVmaW5lIE5WNTBfUFVOS19CQVIwX1BSQU1JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDE3MDAKKyNkZWZpbmUgTlY1MF9QVU5LX0JBUl9DRkdfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTcwNAorI2RlZmluZSBOVjUwX1BVTktfQkFSX0NGR19CQVNFX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MzApCisjZGVmaW5lIE5WNTBfUFVOS19CQVIxX0NUWERNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDE3MDgKKyNkZWZpbmUgTlY1MF9QVU5LX0JBUjFfQ1RYRE1BX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDMxKQorI2RlZmluZSBOVjUwX1BVTktfQkFSM19DVFhETUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxNzBDCisjZGVmaW5lIE5WNTBfUFVOS19CQVIzX0NUWERNQV9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwzMSkKKyNkZWZpbmUgTlY1MF9QVU5LX1VOSzE3MTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTcxMAorCisjZGVmaW5lIE5WMDRfUEJVU19QQ0lfTlZfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDE4MDQKKyNkZWZpbmUgTlYwNF9QQlVTX1BDSV9OVl8xOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTg0QworI2RlZmluZSBOVjA0X1BCVVNfUENJX05WXzIwCQkJCTB4MDAwMDE4NTAKKyMJZGVmaW5lIE5WMDRfUEJVU19QQ0lfTlZfMjBfUk9NX1NIQURPV19ESVNBQkxFRAkJKDAgPDwgMCkKKyMJZGVmaW5lIE5WMDRfUEJVU19QQ0lfTlZfMjBfUk9NX1NIQURPV19FTkFCTEVECQkoMSA8PCAwKQorCisjZGVmaW5lIE5WMDRfUFRJTUVSX0lOVFJfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDkxMDAKKyNkZWZpbmUgTlYwNF9QVElNRVJfSU5UUl9FTl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwOTE0MAorI2RlZmluZSBOVjA0X1BUSU1FUl9OVU1FUkFUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA5MjAwCisjZGVmaW5lIE5WMDRfUFRJTUVSX0RFTk9NSU5BVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDkyMTAKKyNkZWZpbmUgTlYwNF9QVElNRVJfVElNRV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwOTQwMAorI2RlZmluZSBOVjA0X1BUSU1FUl9USU1FXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA5NDEwCisjZGVmaW5lIE5WMDRfUFRJTUVSX0FMQVJNXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDk0MjAKKworI2RlZmluZSBOVjA0X1BGQl9DRkcwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMjAwCisjZGVmaW5lIE5WMDRfUEZCX0NGRzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAyMDQKKyNkZWZpbmUgTlY0MF9QRkJfMDIwQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDIwQworI2RlZmluZSBOVjEwX1BGQl9USUxFKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDEwMDI0MCArIChpKjE2KSkKKyNkZWZpbmUgTlYxMF9QRkJfVElMRV9fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBOVjEwX1BGQl9UTElNSVQoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDEwMDI0NCArIChpKjE2KSkKKyNkZWZpbmUgTlYxMF9QRkJfVFNJWkUoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAxMDAyNDggKyAoaSoxNikpCisjZGVmaW5lIE5WMTBfUEZCX1RTVEFUVVMoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMTAwMjRDICsgKGkqMTYpKQorI2RlZmluZSBOVjEwX1BGQl9DTE9TRV9QQUdFMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMzNDCisjZGVmaW5lIE5WNDBfUEZCX1RJTEUoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMTAwNjAwICsgKGkqMTYpKQorI2RlZmluZSBOVjQwX1BGQl9USUxFX19TSVpFXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBOVjQwX1BGQl9USUxFX19TSVpFXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBOVjQwX1BGQl9UTElNSVQoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDEwMDYwNCArIChpKjE2KSkKKyNkZWZpbmUgTlY0MF9QRkJfVFNJWkUoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAxMDA2MDggKyAoaSoxNikpCisjZGVmaW5lIE5WNDBfUEZCX1RTVEFUVVMoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMTAwNjBDICsgKGkqMTYpKQorI2RlZmluZSBOVjQwX1BGQl9VTktfODAwCQkJCQkweDAwMTAwODAwCisKKyNkZWZpbmUgTlYwNF9QR1JBUEhfREVCVUdfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDA4MAorI2RlZmluZSBOVjA0X1BHUkFQSF9ERUJVR18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDg0CisjZGVmaW5lIE5WMDRfUEdSQVBIX0RFQlVHXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwODgKKyNkZWZpbmUgTlYwNF9QR1JBUEhfREVCVUdfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDA4YworI2RlZmluZSBOVjEwX1BHUkFQSF9ERUJVR180ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDkwCisjZGVmaW5lIE5WMDNfUEdSQVBIX0lOVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAxMDAKKyNkZWZpbmUgTlYwM19QR1JBUEhfTlNUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDEwNAorIyAgICBkZWZpbmUgTlYwNF9QR1JBUEhfTlNUQVRVU19TVEFURV9JTl9VU0UgICAgICAgICAgICAgICAgICAoMTw8MTEpCisjICAgIGRlZmluZSBOVjA0X1BHUkFQSF9OU1RBVFVTX0lOVkFMSURfU1RBVEUgICAgICAgICAgICAgICAgICgxPDwxMikKKyMgICAgZGVmaW5lIE5WMDRfUEdSQVBIX05TVEFUVVNfQkFEX0FSR1VNRU5UICAgICAgICAgICAgICAgICAgKDE8PDEzKQorIyAgICBkZWZpbmUgTlYwNF9QR1JBUEhfTlNUQVRVU19QUk9URUNUSU9OX0ZBVUxUICAgICAgICAgICAgICAoMTw8MTQpCisjICAgIGRlZmluZSBOVjEwX1BHUkFQSF9OU1RBVFVTX1NUQVRFX0lOX1VTRSAgICAgICAgICAgICAgICAgICgxPDwyMykKKyMgICAgZGVmaW5lIE5WMTBfUEdSQVBIX05TVEFUVVNfSU5WQUxJRF9TVEFURSAgICAgICAgICAgICAgICAgKDE8PDI0KQorIyAgICBkZWZpbmUgTlYxMF9QR1JBUEhfTlNUQVRVU19CQURfQVJHVU1FTlQgICAgICAgICAgICAgICAgICAoMTw8MjUpCisjICAgIGRlZmluZSBOVjEwX1BHUkFQSF9OU1RBVFVTX1BST1RFQ1RJT05fRkFVTFQgICAgICAgICAgICAgICgxPDwyNikKKyNkZWZpbmUgTlYwM19QR1JBUEhfTlNPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDEwOAorIyAgICBkZWZpbmUgTlYwM19QR1JBUEhfTlNPVVJDRV9OT1RJRklDQVRJT04gICAgICAgICAgICAgICAgICAgKDE8PDApCisjICAgIGRlZmluZSBOVjAzX1BHUkFQSF9OU09VUkNFX0RBVEFfRVJST1IgICAgICAgICAgICAgICAgICAgICAoMTw8MSkKKyMgICAgZGVmaW5lIE5WMDNfUEdSQVBIX05TT1VSQ0VfUFJPVEVDVElPTl9FUlJPUiAgICAgICAgICAgICAgICgxPDwyKQorIyAgICBkZWZpbmUgTlYwM19QR1JBUEhfTlNPVVJDRV9SQU5HRV9FWENFUFRJT04gICAgICAgICAgICAgICAgKDE8PDMpCisjICAgIGRlZmluZSBOVjAzX1BHUkFQSF9OU09VUkNFX0xJTUlUX0NPTE9SICAgICAgICAgICAgICAgICAgICAoMTw8NCkKKyMgICAgZGVmaW5lIE5WMDNfUEdSQVBIX05TT1VSQ0VfTElNSVRfWkVUQSAgICAgICAgICAgICAgICAgICAgICgxPDw1KQorIyAgICBkZWZpbmUgTlYwM19QR1JBUEhfTlNPVVJDRV9JTExFR0FMX01USEQgICAgICAgICAgICAgICAgICAgKDE8PDYpCisjICAgIGRlZmluZSBOVjAzX1BHUkFQSF9OU09VUkNFX0RNQV9SX1BST1RFQ1RJT04gICAgICAgICAgICAgICAoMTw8NykKKyMgICAgZGVmaW5lIE5WMDNfUEdSQVBIX05TT1VSQ0VfRE1BX1dfUFJPVEVDVElPTiAgICAgICAgICAgICAgICgxPDw4KQorIyAgICBkZWZpbmUgTlYwM19QR1JBUEhfTlNPVVJDRV9GT1JNQVRfRVhDRVBUSU9OICAgICAgICAgICAgICAgKDE8PDkpCisjICAgIGRlZmluZSBOVjAzX1BHUkFQSF9OU09VUkNFX1BBVENIX0VYQ0VQVElPTiAgICAgICAgICAgICAgICgxPDwxMCkKKyMgICAgZGVmaW5lIE5WMDNfUEdSQVBIX05TT1VSQ0VfU1RBVEVfSU5WQUxJRCAgICAgICAgICAgICAgICAgKDE8PDExKQorIyAgICBkZWZpbmUgTlYwM19QR1JBUEhfTlNPVVJDRV9ET1VCTEVfTk9USUZZICAgICAgICAgICAgICAgICAoMTw8MTIpCisjICAgIGRlZmluZSBOVjAzX1BHUkFQSF9OU09VUkNFX05PVElGWV9JTl9VU0UgICAgICAgICAgICAgICAgICgxPDwxMykKKyMgICAgZGVmaW5lIE5WMDNfUEdSQVBIX05TT1VSQ0VfTUVUSE9EX0NOVCAgICAgICAgICAgICAgICAgICAgKDE8PDE0KQorIyAgICBkZWZpbmUgTlYwM19QR1JBUEhfTlNPVVJDRV9CRlJfTk9USUZJQ0FUSU9OICAgICAgICAgICAgICAoMTw8MTUpCisjICAgIGRlZmluZSBOVjAzX1BHUkFQSF9OU09VUkNFX0RNQV9WVFhfUFJPVEVDVElPTiAgICAgICAgICAgICgxPDwxNikKKyMgICAgZGVmaW5lIE5WMDNfUEdSQVBIX05TT1VSQ0VfRE1BX1dJRFRIX0EgICAgICAgICAgICAgICAgICAgKDE8PDE3KQorIyAgICBkZWZpbmUgTlYwM19QR1JBUEhfTlNPVVJDRV9ETUFfV0lEVEhfQiAgICAgICAgICAgICAgICAgICAoMTw8MTgpCisjZGVmaW5lIE5WMDNfUEdSQVBIX0lOVFJfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAxNDAKKyNkZWZpbmUgTlY0MF9QR1JBUEhfSU5UUl9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDEzQworIyAgICBkZWZpbmUgTlZfUEdSQVBIX0lOVFJfTk9USUZZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDApCisjICAgIGRlZmluZSBOVl9QR1JBUEhfSU5UUl9NSVNTSU5HX0hXICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8NCkKKyMgICAgZGVmaW5lIE5WX1BHUkFQSF9JTlRSX0NPTlRFWFRfU1dJVENIICAgICAgICAgICAgICAgICAgICAgKDE8PDEyKQorIyAgICBkZWZpbmUgTlZfUEdSQVBIX0lOVFJfQlVGRkVSX05PVElGWSAgICAgICAgICAgICAgICAgICAgICAoMTw8MTYpCisjICAgIGRlZmluZSBOVl9QR1JBUEhfSU5UUl9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwyMCkKKyNkZWZpbmUgTlYxMF9QR1JBUEhfQ1RYX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDE0NAorI2RlZmluZSBOVjEwX1BHUkFQSF9DVFhfVVNFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMTQ4CisjZGVmaW5lIE5WMTBfUEdSQVBIX0NUWF9TV0lUQ0gxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAxNEMKKyNkZWZpbmUgTlYxMF9QR1JBUEhfQ1RYX1NXSVRDSDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDE1MAorI2RlZmluZSBOVjEwX1BHUkFQSF9DVFhfU1dJVENIMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMTU0CisjZGVmaW5lIE5WMTBfUEdSQVBIX0NUWF9TV0lUQ0g0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAxNTgKKyNkZWZpbmUgTlYxMF9QR1JBUEhfQ1RYX1NXSVRDSDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDE1QworI2RlZmluZSBOVjA0X1BHUkFQSF9DVFhfU1dJVENIMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMTYwCisjZGVmaW5lIE5WMTBfUEdSQVBIX0NUWF9DQUNIRTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAxNjAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQ1RYX1NXSVRDSDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDE2NAorI2RlZmluZSBOVjA0X1BHUkFQSF9DVFhfU1dJVENIMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMTY4CisjZGVmaW5lIE5WMDRfUEdSQVBIX0NUWF9TV0lUQ0g0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAxNkMKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQ1RYX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDE3MAorI2RlZmluZSBOVjA0X1BHUkFQSF9DVFhfVVNFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMTc0CisjZGVmaW5lIE5WMDRfUEdSQVBIX0NUWF9DQUNIRTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAxODAKKyNkZWZpbmUgTlYxMF9QR1JBUEhfQ1RYX0NBQ0hFMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDE4MAorI2RlZmluZSBOVjAzX1BHUkFQSF9DVFhfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMTkwCisjZGVmaW5lIE5WMDNfUEdSQVBIX0NUWF9VU0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAxOTQKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQ1RYX0NBQ0hFMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDFBMAorI2RlZmluZSBOVjEwX1BHUkFQSF9DVFhfQ0FDSEUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMUEwCisjZGVmaW5lIE5WMDRfUEdSQVBIX0NUWF9DQUNIRTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAxQzAKKyNkZWZpbmUgTlYxMF9QR1JBUEhfQ1RYX0NBQ0hFNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDFDMAorI2RlZmluZSBOVjA0X1BHUkFQSF9DVFhfQ0FDSEU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMUUwCisjZGVmaW5lIE5WMTBfUEdSQVBIX0NUWF9DQUNIRTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAxRTAKKyNkZWZpbmUgTlY0MF9QR1JBUEhfQ1RYQ1RMXzAzMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDMwNAorI2RlZmluZSBOVjQwX1BHUkFQSF9DVFhDVExfMDMwNF9YRkVSX0NUWCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE5WNDBfUEdSQVBIX0NUWENUTF9VQ09ERV9TVEFUICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAzMDgKKyNkZWZpbmUgTlY0MF9QR1JBUEhfQ1RYQ1RMX1VDT0RFX1NUQVRfSVBfTUFTSyAgICAgICAgICAgICAgMHhmZjAwMDAwMAorI2RlZmluZSBOVjQwX1BHUkFQSF9DVFhDVExfVUNPREVfU1RBVF9JUF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIE5WNDBfUEdSQVBIX0NUWENUTF9VQ09ERV9TVEFUX09QX01BU0sgICAgICAgICAgICAgIDB4MDBmZmZmZmYKKyNkZWZpbmUgTlY0MF9QR1JBUEhfQ1RYQ1RMXzAzMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDMxMAorI2RlZmluZSBOVjQwX1BHUkFQSF9DVFhDVExfMDMxMF9YRkVSX1NBVkUgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIE5WNDBfUEdSQVBIX0NUWENUTF8wMzEwX1hGRVJfTE9BRCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgTlY0MF9QR1JBUEhfQ1RYQ1RMXzAzMEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDMwYworI2RlZmluZSBOVjQwX1BHUkFQSF9DVFhDVExfVUNPREVfSU5ERVggICAgICAgICAgICAgICAgICAgICAweDAwNDAwMzI0CisjZGVmaW5lIE5WNDBfUEdSQVBIX0NUWENUTF9VQ09ERV9EQVRBICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAzMjgKKyNkZWZpbmUgTlY0MF9QR1JBUEhfQ1RYQ1RMX0NVUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDMyYworI2RlZmluZSBOVjQwX1BHUkFQSF9DVFhDVExfQ1VSX0xPQURFRCAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIE5WNDBfUEdSQVBIX0NUWENUTF9DVVJfSU5TVEFOQ0UgICAgICAgICAgICAgICAgICAgIDB4MDAwRkZGRkYKKyNkZWZpbmUgTlY0MF9QR1JBUEhfQ1RYQ1RMX05FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDMzMAorI2RlZmluZSBOVjQwX1BHUkFQSF9DVFhDVExfTkVYVF9JTlNUQU5DRSAgICAgICAgICAgICAgICAgICAweDAwMGZmZmZmCisjZGVmaW5lIE5WNTBfUEdSQVBIX0NUWENUTF9DVVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAzMmMKKyNkZWZpbmUgTlY1MF9QR1JBUEhfQ1RYQ1RMX0NVUl9MT0FERUQgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBOVjUwX1BHUkFQSF9DVFhDVExfQ1VSX0lOU1RBTkNFICAgICAgICAgICAgICAgICAgICAweDAwZmZmZmZmCisjZGVmaW5lIE5WNTBfUEdSQVBIX0NUWENUTF9ORVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAzMzAKKyNkZWZpbmUgTlY1MF9QR1JBUEhfQ1RYQ1RMX05FWFRfSU5TVEFOQ0UgICAgICAgICAgICAgICAgICAgMHgwMGZmZmZmZgorI2RlZmluZSBOVjAzX1BHUkFQSF9BQlNfWF9SQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNDAwCisjZGVmaW5lIE5WMDNfUEdSQVBIX0FCU19ZX1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA0ODAKKyNkZWZpbmUgTlYwM19QR1JBUEhfWF9NSVNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDUwMAorI2RlZmluZSBOVjAzX1BHUkFQSF9ZX01JU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTA0CisjZGVmaW5lIE5WMDRfUEdSQVBIX1ZBTElEMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1MDgKKyNkZWZpbmUgTlYwNF9QR1JBUEhfU09VUkNFX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDUwQworI2RlZmluZSBOVjA0X1BHUkFQSF9NSVNDMjRfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTEwCisjZGVmaW5lIE5WMDNfUEdSQVBIX1hZX0xPR0lDX01JU0MwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1MTQKKyNkZWZpbmUgTlYwM19QR1JBUEhfWFlfTE9HSUNfTUlTQzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDUxOAorI2RlZmluZSBOVjAzX1BHUkFQSF9YWV9MT0dJQ19NSVNDMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTFDCisjZGVmaW5lIE5WMDNfUEdSQVBIX1hZX0xPR0lDX01JU0MzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1MjAKKyNkZWZpbmUgTlYwM19QR1JBUEhfQ0xJUFhfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDUyNAorI2RlZmluZSBOVjAzX1BHUkFQSF9DTElQWF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTI4CisjZGVmaW5lIE5WMDNfUEdSQVBIX0NMSVBZXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1MkMKKyNkZWZpbmUgTlYwM19QR1JBUEhfQ0xJUFlfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDUzMAorI2RlZmluZSBOVjAzX1BHUkFQSF9BQlNfSUNMSVBfWE1BWCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTM0CisjZGVmaW5lIE5WMDNfUEdSQVBIX0FCU19JQ0xJUF9ZTUFYICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1MzgKKyNkZWZpbmUgTlYwM19QR1JBUEhfQUJTX1VDTElQX1hNSU4gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDUzQworI2RlZmluZSBOVjAzX1BHUkFQSF9BQlNfVUNMSVBfWU1JTiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTQwCisjZGVmaW5lIE5WMDNfUEdSQVBIX0FCU19VQ0xJUF9YTUFYICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1NDQKKyNkZWZpbmUgTlYwM19QR1JBUEhfQUJTX1VDTElQX1lNQVggICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDU0OAorI2RlZmluZSBOVjAzX1BHUkFQSF9BQlNfVUNMSVBBX1hNSU4gICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTYwCisjZGVmaW5lIE5WMDNfUEdSQVBIX0FCU19VQ0xJUEFfWU1JTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1NjQKKyNkZWZpbmUgTlYwM19QR1JBUEhfQUJTX1VDTElQQV9YTUFYICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDU2OAorI2RlZmluZSBOVjAzX1BHUkFQSF9BQlNfVUNMSVBBX1lNQVggICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTZDCisjZGVmaW5lIE5WMDRfUEdSQVBIX01JU0MyNF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1NzAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfTUlTQzI0XzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDU3NAorI2RlZmluZSBOVjA0X1BHUkFQSF9WQUxJRDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTc4CisjZGVmaW5lIE5WMDRfUEdSQVBIX1BBU1NUSFJVXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1N0MKKyNkZWZpbmUgTlYwNF9QR1JBUEhfUEFTU1RIUlVfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDU4MAorI2RlZmluZSBOVjA0X1BHUkFQSF9QQVNTVEhSVV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTg0CisjZGVmaW5lIE5WMTBfUEdSQVBIX0RJTVhfVEVYVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1ODgKKyNkZWZpbmUgTlYxMF9QR1JBUEhfV0RJTVhfVEVYVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDU4QworI2RlZmluZSBOVjA0X1BHUkFQSF9DT01CSU5FXzBfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTkwCisjZGVmaW5lIE5WMDRfUEdSQVBIX0NPTUJJTkVfMF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1OTQKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQ09NQklORV8xX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDU5OAorI2RlZmluZSBOVjA0X1BHUkFQSF9DT01CSU5FXzFfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTlDCisjZGVmaW5lIE5WMDRfUEdSQVBIX0ZPUk1BVF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1QTgKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRk9STUFUXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDVBQworI2RlZmluZSBOVjA0X1BHUkFQSF9GSUxURVJfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNUIwCisjZGVmaW5lIE5WMDRfUEdSQVBIX0ZJTFRFUl8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1QjQKKyNkZWZpbmUgTlYwM19QR1JBUEhfTU9OT19DT0xPUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDYwMAorI2RlZmluZSBOVjA0X1BHUkFQSF9ST1AzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjA0CisjZGVmaW5lIE5WMDRfUEdSQVBIX0JFVEFfQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2MDgKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQkVUQV9QUkVNVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDYwQworI2RlZmluZSBOVjA0X1BHUkFQSF9MSU1JVF9WSU9MX1BJWCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjEwCisjZGVmaW5lIE5WMDRfUEdSQVBIX0ZPUk1BVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2MTgKKyNkZWZpbmUgTlYxMF9QR1JBUEhfREVCVUdfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDYyMAorI2RlZmluZSBOVjA0X1BHUkFQSF9CT0ZGU0VUMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjQwCisjZGVmaW5lIE5WMDRfUEdSQVBIX0JPRkZTRVQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2NDQKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQk9GRlNFVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDY0OAorI2RlZmluZSBOVjA0X1BHUkFQSF9CT0ZGU0VUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjRDCisjZGVmaW5lIE5WMDRfUEdSQVBIX0JPRkZTRVQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2NTAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQk9GRlNFVDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDY1NAorI2RlZmluZSBOVjA0X1BHUkFQSF9CQkFTRTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjU4CisjZGVmaW5lIE5WMDRfUEdSQVBIX0JCQVNFMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2NUMKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQkJBU0UyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDY2MAorI2RlZmluZSBOVjA0X1BHUkFQSF9CQkFTRTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjY0CisjZGVmaW5lIE5WMDRfUEdSQVBIX0JCQVNFNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2NjgKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQkJBU0U1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDY2QworI2RlZmluZSBOVjA0X1BHUkFQSF9CUElUQ0gwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjcwCisjZGVmaW5lIE5WMDRfUEdSQVBIX0JQSVRDSDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2NzQKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQlBJVENIMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDY3OAorI2RlZmluZSBOVjA0X1BHUkFQSF9CUElUQ0gzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjdDCisjZGVmaW5lIE5WMDRfUEdSQVBIX0JQSVRDSDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2ODAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQkxJTUlUMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDY4NAorI2RlZmluZSBOVjA0X1BHUkFQSF9CTElNSVQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjg4CisjZGVmaW5lIE5WMDRfUEdSQVBIX0JMSU1JVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2OEMKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQkxJTUlUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDY5MAorI2RlZmluZSBOVjA0X1BHUkFQSF9CTElNSVQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjk0CisjZGVmaW5lIE5WMDRfUEdSQVBIX0JMSU1JVDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2OTgKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQlNXSVpaTEUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDY5QworI2RlZmluZSBOVjA0X1BHUkFQSF9CU1dJWlpMRTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNkEwCisjZGVmaW5lIE5WMDNfUEdSQVBIX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2QjAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDcwMAorI2RlZmluZSBOVjA0X1BHUkFQSF9UUkFQUEVEX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzA0CisjZGVmaW5lIE5WMDRfUEdSQVBIX1RSQVBQRURfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3MDgKKyNkZWZpbmUgTlYwNF9QR1JBUEhfU1VSRkFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDcwQworI2RlZmluZSBOVjEwX1BHUkFQSF9UUkFQUEVEX0RBVEFfSElHSCAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzBDCisjZGVmaW5lIE5WMDRfUEdSQVBIX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3MTAKKyNkZWZpbmUgTlYxMF9QR1JBUEhfU1VSRkFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDcxMAorI2RlZmluZSBOVjA0X1BHUkFQSF9OT1RJRlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzE0CisjZGVmaW5lIE5WMTBfUEdSQVBIX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3MTQKKyNkZWZpbmUgTlYxMF9QR1JBUEhfTk9USUZZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDcxOAorCisjZGVmaW5lIE5WMDRfUEdSQVBIX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3MjAKKworI2RlZmluZSBOVjA0X1BHUkFQSF9CUElYRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzI0CisjZGVmaW5lIE5WMTBfUEdSQVBIX1JESV9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3NTAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRkZJTlRGQ19TVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDc1NAorI2RlZmluZSBOVjEwX1BHUkFQSF9SRElfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzU0CisjZGVmaW5lIE5WMDRfUEdSQVBIX0RNQV9QSVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3NjAKKyNkZWZpbmUgTlYxMF9QR1JBUEhfRkZJTlRGQ19TVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDc2NAorI2RlZmluZSBOVjA0X1BHUkFQSF9EVkRfQ09MT1JGTVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzY0CisjZGVmaW5lIE5WMDRfUEdSQVBIX1NDQUxFRF9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3NjgKKyNkZWZpbmUgTlYxMF9QR1JBUEhfRE1BX1BJVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDc3MAorI2RlZmluZSBOVjEwX1BHUkFQSF9EVkRfQ09MT1JGTVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzc0CisjZGVmaW5lIE5WMTBfUEdSQVBIX1NDQUxFRF9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3NzgKKyNkZWZpbmUgTlYyMF9QR1JBUEhfQ0hBTk5FTF9DVFhfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDc4MAorI2RlZmluZSBOVjIwX1BHUkFQSF9DSEFOTkVMX0NUWF9QT0lOVEVSICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzg0CisjZGVmaW5lIE5WMjBfUEdSQVBIX0NIQU5ORUxfQ1RYX1hGRVIgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3ODgKKyNkZWZpbmUgTlYyMF9QR1JBUEhfQ0hBTk5FTF9DVFhfWEZFUl9MT0FEICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBOVjIwX1BHUkFQSF9DSEFOTkVMX0NUWF9YRkVSX1NBVkUgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE5WMDRfUEdSQVBIX1BBVFRfQ09MT1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA4MDAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfUEFUVF9DT0xPUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDgwNAorI2RlZmluZSBOVjA0X1BHUkFQSF9QQVRURVJOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwODA4CisjZGVmaW5lIE5WMDRfUEdSQVBIX1BBVFRFUk5fU0hBUEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA4MTAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQ0hST01BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDgxNAorI2RlZmluZSBOVjA0X1BHUkFQSF9DT05UUk9MMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwODE4CisjZGVmaW5lIE5WMDRfUEdSQVBIX0NPTlRST0wxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA4MUMKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQ09OVFJPTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDgyMAorI2RlZmluZSBOVjA0X1BHUkFQSF9CTEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwODI0CisjZGVmaW5lIE5WMDRfUEdSQVBIX1NUT1JFRF9GTVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA4MzAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDkwMAorI2RlZmluZSBOVjQwX1BHUkFQSF9USUxFMChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwMDkwMCArIChpKjE2KSkKKyNkZWZpbmUgTlY0MF9QR1JBUEhfVExJTUlUMChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA0MDA5MDQgKyAoaSoxNikpCisjZGVmaW5lIE5WNDBfUEdSQVBIX1RTSVpFMChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwNDAwOTA4ICsgKGkqMTYpKQorI2RlZmluZSBOVjQwX1BHUkFQSF9UU1RBVFVTMChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwMDkwQyArIChpKjE2KSkKKyNkZWZpbmUgTlYxMF9QR1JBUEhfVElMRShpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA0MDBCMDAgKyAoaSoxNikpCisjZGVmaW5lIE5WMTBfUEdSQVBIX1RMSU1JVChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwNDAwQjA0ICsgKGkqMTYpKQorI2RlZmluZSBOVjEwX1BHUkFQSF9UU0laRShpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwMEIwOCArIChpKjE2KSkKKyNkZWZpbmUgTlYxMF9QR1JBUEhfVFNUQVRVUyhpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA0MDBCMEMgKyAoaSoxNikpCisjZGVmaW5lIE5WMDRfUEdSQVBIX1VfUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDBEMDAKKyNkZWZpbmUgTlY0N19QR1JBUEhfVElMRTAoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA0MDBEMDAgKyAoaSoxNikpCisjZGVmaW5lIE5WNDdfUEdSQVBIX1RMSU1JVDAoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwNDAwRDA0ICsgKGkqMTYpKQorI2RlZmluZSBOVjQ3X1BHUkFQSF9UU0laRTAoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwMEQwOCArIChpKjE2KSkKKyNkZWZpbmUgTlY0N19QR1JBUEhfVFNUQVRVUzAoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA0MDBEMEMgKyAoaSoxNikpCisjZGVmaW5lIE5WMDRfUEdSQVBIX1ZfUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDBENDAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfV19SQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMEQ4MAorI2RlZmluZSBOVjEwX1BHUkFQSF9DT01CSU5FUjBfSU5fQUxQSEEgICAgICAgICAgICAgICAgICAgICAweDAwNDAwRTQwCisjZGVmaW5lIE5WMTBfUEdSQVBIX0NPTUJJTkVSMV9JTl9BTFBIQSAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDBFNDQKKyNkZWZpbmUgTlYxMF9QR1JBUEhfQ09NQklORVIwX0lOX1JHQiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMEU0OAorI2RlZmluZSBOVjEwX1BHUkFQSF9DT01CSU5FUjFfSU5fUkdCICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwRTRDCisjZGVmaW5lIE5WMTBfUEdSQVBIX0NPTUJJTkVSX0NPTE9SMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDBFNTAKKyNkZWZpbmUgTlYxMF9QR1JBUEhfQ09NQklORVJfQ09MT1IxICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMEU1NAorI2RlZmluZSBOVjEwX1BHUkFQSF9DT01CSU5FUjBfT1VUX0FMUEhBICAgICAgICAgICAgICAgICAgICAweDAwNDAwRTU4CisjZGVmaW5lIE5WMTBfUEdSQVBIX0NPTUJJTkVSMV9PVVRfQUxQSEEgICAgICAgICAgICAgICAgICAgIDB4MDA0MDBFNUMKKyNkZWZpbmUgTlYxMF9QR1JBUEhfQ09NQklORVIwX09VVF9SR0IgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMEU2MAorI2RlZmluZSBOVjEwX1BHUkFQSF9DT01CSU5FUjFfT1VUX1JHQiAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwRTY0CisjZGVmaW5lIE5WMTBfUEdSQVBIX0NPTUJJTkVSX0ZJTkFMMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDBFNjgKKyNkZWZpbmUgTlYxMF9QR1JBUEhfQ09NQklORVJfRklOQUwxICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMEU2QworI2RlZmluZSBOVjEwX1BHUkFQSF9XSU5ET1dDTElQX0hPUklaT05UQUwgICAgICAgICAgICAgICAgICAweDAwNDAwRjAwCisjZGVmaW5lIE5WMTBfUEdSQVBIX1dJTkRPV0NMSVBfVkVSVElDQUwgICAgICAgICAgICAgICAgICAgIDB4MDA0MDBGMjAKKyNkZWZpbmUgTlYxMF9QR1JBUEhfWEZNT0RFMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMEY0MAorI2RlZmluZSBOVjEwX1BHUkFQSF9YRk1PREUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwRjQ0CisjZGVmaW5lIE5WMTBfUEdSQVBIX0dMT0JBTFNUQVRFMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDBGNDgKKyNkZWZpbmUgTlYxMF9QR1JBUEhfR0xPQkFMU1RBVEUxICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMEY0QworI2RlZmluZSBOVjEwX1BHUkFQSF9QSVBFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwRjUwCisjZGVmaW5lIE5WMTBfUEdSQVBIX1BJUEVfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDBGNTQKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRE1BX1NUQVJUXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMTAwMAorI2RlZmluZSBOVjA0X1BHUkFQSF9ETUFfU1RBUlRfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAxMDA0CisjZGVmaW5lIE5WMDRfUEdSQVBIX0RNQV9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDEwMDgKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRE1BX01JU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMTAwQworI2RlZmluZSBOVjA0X1BHUkFQSF9ETUFfREFUQV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAxMDIwCisjZGVmaW5lIE5WMDRfUEdSQVBIX0RNQV9EQVRBXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDEwMjQKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRE1BX1JNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMTAzMAorI2RlZmluZSBOVjA0X1BHUkFQSF9ETUFfQV9YTEFURV9JTlNUICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAxMDQwCisjZGVmaW5lIE5WMDRfUEdSQVBIX0RNQV9BX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDEwNDQKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRE1BX0FfTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMTA0OAorI2RlZmluZSBOVjA0X1BHUkFQSF9ETUFfQV9UTEJfUFRFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAxMDRDCisjZGVmaW5lIE5WMDRfUEdSQVBIX0RNQV9BX1RMQl9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDEwNTAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRE1BX0FfQURKX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMTA1NAorI2RlZmluZSBOVjA0X1BHUkFQSF9ETUFfQV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAxMDU4CisjZGVmaW5lIE5WMDRfUEdSQVBIX0RNQV9BX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDEwNUMKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRE1BX0FfWV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMTA2MAorI2RlZmluZSBOVjA0X1BHUkFQSF9ETUFfQl9YTEFURV9JTlNUICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAxMDgwCisjZGVmaW5lIE5WMDRfUEdSQVBIX0RNQV9CX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDEwODQKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRE1BX0JfTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMTA4OAorI2RlZmluZSBOVjA0X1BHUkFQSF9ETUFfQl9UTEJfUFRFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAxMDhDCisjZGVmaW5lIE5WMDRfUEdSQVBIX0RNQV9CX1RMQl9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDEwOTAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRE1BX0JfQURKX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMTA5NAorI2RlZmluZSBOVjA0X1BHUkFQSF9ETUFfQl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAxMDk4CisjZGVmaW5lIE5WMDRfUEdSQVBIX0RNQV9CX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDEwOUMKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRE1BX0JfWV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMTBBMAorI2RlZmluZSBOVjQwX1BHUkFQSF9USUxFMShpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwNjkwMCArIChpKjE2KSkKKyNkZWZpbmUgTlY0MF9QR1JBUEhfVExJTUlUMShpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA0MDY5MDQgKyAoaSoxNikpCisjZGVmaW5lIE5WNDBfUEdSQVBIX1RTSVpFMShpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwNDA2OTA4ICsgKGkqMTYpKQorI2RlZmluZSBOVjQwX1BHUkFQSF9UU1RBVFVTMShpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwNjkwQyArIChpKjE2KSkKKworCisvKiBJdCdzIGEgZ3Vlc3MgdGhhdCB0aGlzIHdvcmtzIG9uIE5WMDMuIENvbmZpcm1lZCBvbiBOVjA0LCB0aG91Z2ggKi8KKyNkZWZpbmUgTlYwNF9QRklGT19ERUxBWV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjA0MAorI2RlZmluZSBOVjA0X1BGSUZPX0RNQV9USU1FU0xJQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDQ0CisjZGVmaW5lIE5WMDRfUEZJRk9fTkVYVF9DSEFOTkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwNTAKKyNkZWZpbmUgTlYwM19QRklGT19JTlRSXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjEwMAorI2RlZmluZSBOVjAzX1BGSUZPX0lOVFJfRU5fMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMTQwCisjICAgIGRlZmluZSBOVl9QRklGT19JTlRSX0NBQ0hFX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MCkKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0lOVFJfUlVOT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDw0KQorIyAgICBkZWZpbmUgTlZfUEZJRk9fSU5UUl9SVU5PVVRfT1ZFUkZMT1cgICAgICAgICAgICAgICAgICAgICAgKDE8PDgpCisjICAgIGRlZmluZSBOVl9QRklGT19JTlRSX0RNQV9QVVNIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwxMikKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0lOVFJfRE1BX1BUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDE2KQorIyAgICBkZWZpbmUgTlZfUEZJRk9fSU5UUl9TRU1BUEhPUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MjApCisjICAgIGRlZmluZSBOVl9QRklGT19JTlRSX0FDUVVJUkVfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICgxPDwyNCkKKyNkZWZpbmUgTlYwM19QRklGT19SQU1IVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjIxMAorI2RlZmluZSBOVjAzX1BGSUZPX1JBTUZDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMjE0CisjZGVmaW5lIE5WMDNfUEZJRk9fUkFNUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIyMTgKKyNkZWZpbmUgTlY0MF9QRklGT19SQU1GQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjIyMAorI2RlZmluZSBOVjAzX1BGSUZPX0NBQ0hFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyNTAwCisjZGVmaW5lIE5WMDRfUEZJRk9fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDI1MDQKKyNkZWZpbmUgTlYwNF9QRklGT19ETUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjUwOAorI2RlZmluZSBOVjA0X1BGSUZPX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyNTBjCisjZGVmaW5lIE5WNTBfUEZJRk9fQ1RYX1RBQkxFKGMpICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjYwMCsoYykqNCkKKyNkZWZpbmUgTlY1MF9QRklGT19DVFhfVEFCTEVfX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOAorI2RlZmluZSBOVjUwX1BGSUZPX0NUWF9UQUJMRV9DSEFOTkVMX0VOQUJMRUQgICAgICAgICAgICAgICAgICAoMTw8MzEpCisjZGVmaW5lIE5WNTBfUEZJRk9fQ1RYX1RBQkxFX1VOSzMwX0JBRCAgICAgICAgICAgICAgICAgICAgICAgICgxPDwzMCkKKyNkZWZpbmUgTlY1MF9QRklGT19DVFhfVEFCTEVfSU5TVEFOQ0VfTUFTS19HODAgICAgICAgICAgICAgMHgwRkZGRkZGRgorI2RlZmluZSBOVjUwX1BGSUZPX0NUWF9UQUJMRV9JTlNUQU5DRV9NQVNLX0c4NCAgICAgICAgICAgICAweDAwRkZGRkZGCisjZGVmaW5lIE5WMDNfUEZJRk9fQ0FDSEUwX1BVU0gwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMwMDAKKyNkZWZpbmUgTlYwM19QRklGT19DQUNIRTBfUFVMTDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzA0MAorI2RlZmluZSBOVjA0X1BGSUZPX0NBQ0hFMF9QVUxMMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMDUwCisjZGVmaW5lIE5WMDRfUEZJRk9fQ0FDSEUwX1BVTEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMwNTQKKyNkZWZpbmUgTlYwM19QRklGT19DQUNIRTFfUFVTSDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzIwMAorI2RlZmluZSBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMjA0CisjZGVmaW5lIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gxX0RNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8OCkKKyNkZWZpbmUgTlY0MF9QRklGT19DQUNIRTFfUFVTSDFfRE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDE2KQorI2RlZmluZSBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMV9DSElEX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIE5WMTBfUEZJRk9fQ0FDSEUxX1BVU0gxX0NISURfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMWYKKyNkZWZpbmUgTlY1MF9QRklGT19DQUNIRTFfUFVTSDFfQ0hJRF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDA3ZgorI2RlZmluZSBOVjAzX1BGSUZPX0NBQ0hFMV9QVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMjEwCisjZGVmaW5lIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVNIICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMyMjAKKyNkZWZpbmUgTlYwNF9QRklGT19DQUNIRTFfRE1BX0ZFVENIICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzIyNAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzhfQllURVMgICAgICAgICAweDAwMDAwMDAwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfMTZfQllURVMgICAgICAgIDB4MDAwMDAwMDgKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR18yNF9CWVRFUyAgICAgICAgMHgwMDAwMDAxMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzMyX0JZVEVTICAgICAgICAweDAwMDAwMDE4CisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfNDBfQllURVMgICAgICAgIDB4MDAwMDAwMjAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR180OF9CWVRFUyAgICAgICAgMHgwMDAwMDAyOAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzU2X0JZVEVTICAgICAgICAweDAwMDAwMDMwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfNjRfQllURVMgICAgICAgIDB4MDAwMDAwMzgKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR183Ml9CWVRFUyAgICAgICAgMHgwMDAwMDA0MAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzgwX0JZVEVTICAgICAgICAweDAwMDAwMDQ4CisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfODhfQllURVMgICAgICAgIDB4MDAwMDAwNTAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR185Nl9CWVRFUyAgICAgICAgMHgwMDAwMDA1OAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzEwNF9CWVRFUyAgICAgICAweDAwMDAwMDYwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfMTEyX0JZVEVTICAgICAgIDB4MDAwMDAwNjgKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR18xMjBfQllURVMgICAgICAgMHgwMDAwMDA3MAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzEyOF9CWVRFUyAgICAgICAweDAwMDAwMDc4CisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfMTM2X0JZVEVTICAgICAgIDB4MDAwMDAwODAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR18xNDRfQllURVMgICAgICAgMHgwMDAwMDA4OAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzE1Ml9CWVRFUyAgICAgICAweDAwMDAwMDkwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfMTYwX0JZVEVTICAgICAgIDB4MDAwMDAwOTgKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR18xNjhfQllURVMgICAgICAgMHgwMDAwMDBBMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzE3Nl9CWVRFUyAgICAgICAweDAwMDAwMEE4CisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfMTg0X0JZVEVTICAgICAgIDB4MDAwMDAwQjAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR18xOTJfQllURVMgICAgICAgMHgwMDAwMDBCOAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzIwMF9CWVRFUyAgICAgICAweDAwMDAwMEMwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfMjA4X0JZVEVTICAgICAgIDB4MDAwMDAwQzgKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR18yMTZfQllURVMgICAgICAgMHgwMDAwMDBEMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzIyNF9CWVRFUyAgICAgICAweDAwMDAwMEQ4CisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfMjMyX0JZVEVTICAgICAgIDB4MDAwMDAwRTAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR18yNDBfQllURVMgICAgICAgMHgwMDAwMDBFOAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzI0OF9CWVRFUyAgICAgICAweDAwMDAwMEYwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfMjU2X0JZVEVTICAgICAgIDB4MDAwMDAwRjgKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfU0laRSAgICAgICAgICAgICAgICAgMHgwMDAwRTAwMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9TSVpFXzMyX0JZVEVTICAgICAgICAweDAwMDAwMDAwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1NJWkVfNjRfQllURVMgICAgICAgIDB4MDAwMDIwMDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfU0laRV85Nl9CWVRFUyAgICAgICAgMHgwMDAwNDAwMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9TSVpFXzEyOF9CWVRFUyAgICAgICAweDAwMDA2MDAwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1NJWkVfMTYwX0JZVEVTICAgICAgIDB4MDAwMDgwMDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfU0laRV8xOTJfQllURVMgICAgICAgMHgwMDAwQTAwMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9TSVpFXzIyNF9CWVRFUyAgICAgICAweDAwMDBDMDAwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1NJWkVfMjU2X0JZVEVTICAgICAgIDB4MDAwMEUwMDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfTUFYX1JFUVMgICAgICAgICAgICAgMHgwMDFGMDAwMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9NQVhfUkVRU18wICAgICAgICAgICAweDAwMDAwMDAwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX01BWF9SRVFTXzEgICAgICAgICAgIDB4MDAwMTAwMDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfTUFYX1JFUVNfMiAgICAgICAgICAgMHgwMDAyMDAwMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9NQVhfUkVRU18zICAgICAgICAgICAweDAwMDMwMDAwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX01BWF9SRVFTXzQgICAgICAgICAgIDB4MDAwNDAwMDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfTUFYX1JFUVNfNSAgICAgICAgICAgMHgwMDA1MDAwMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9NQVhfUkVRU182ICAgICAgICAgICAweDAwMDYwMDAwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX01BWF9SRVFTXzcgICAgICAgICAgIDB4MDAwNzAwMDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfTUFYX1JFUVNfOCAgICAgICAgICAgMHgwMDA4MDAwMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9NQVhfUkVRU185ICAgICAgICAgICAweDAwMDkwMDAwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX01BWF9SRVFTXzEwICAgICAgICAgIDB4MDAwQTAwMDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfTUFYX1JFUVNfMTEgICAgICAgICAgMHgwMDBCMDAwMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9NQVhfUkVRU18xMiAgICAgICAgICAweDAwMEMwMDAwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX01BWF9SRVFTXzEzICAgICAgICAgIDB4MDAwRDAwMDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfTUFYX1JFUVNfMTQgICAgICAgICAgMHgwMDBFMDAwMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9NQVhfUkVRU18xNSAgICAgICAgICAweDAwMEYwMDAwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRU5ESUFOICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9MSVRUTEVfRU5ESUFOICAgICAgICAgICAgICAgICAgMHg3RkZGRkZGRgorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0JJR19FTkRJQU4gICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMyMjgKKyNkZWZpbmUgTlYwNF9QRklGT19DQUNIRTFfRE1BX0lOU1RBTkNFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzIyYworI2RlZmluZSBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMjMwCisjZGVmaW5lIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMyNDAKKyNkZWZpbmUgTlYwNF9QRklGT19DQUNIRTFfRE1BX0dFVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzI0NAorI2RlZmluZSBOVjEwX1BGSUZPX0NBQ0hFMV9SRUZfQ05UICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMjQ4CisjZGVmaW5lIE5WMTBfUEZJRk9fQ0FDSEUxX0RNQV9TVUJST1VUSU5FICAgICAgICAgICAgICAgICAgIDB4MDAwMDMyNEMKKyNkZWZpbmUgTlYwM19QRklGT19DQUNIRTFfUFVMTDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzI0MAorI2RlZmluZSBOVjA0X1BGSUZPX0NBQ0hFMV9QVUxMMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMjUwCisjZGVmaW5lIE5WMDNfUEZJRk9fQ0FDSEUxX1BVTEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMyNTAKKyNkZWZpbmUgTlYwNF9QRklGT19DQUNIRTFfUFVMTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzI1NAorI2RlZmluZSBOVjA0X1BGSUZPX0NBQ0hFMV9IQVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMjU4CisjZGVmaW5lIE5WMTBfUEZJRk9fQ0FDSEUxX0FDUVVJUkVfVElNRU9VVCAgICAgICAgICAgICAgICAgIDB4MDAwMDMyNjAKKyNkZWZpbmUgTlYxMF9QRklGT19DQUNIRTFfQUNRVUlSRV9USU1FU1RBTVAgICAgICAgICAgICAgICAgMHgwMDAwMzI2NAorI2RlZmluZSBOVjEwX1BGSUZPX0NBQ0hFMV9BQ1FVSVJFX1ZBTFVFICAgICAgICAgICAgICAgICAgICAweDAwMDAzMjY4CisjZGVmaW5lIE5WMTBfUEZJRk9fQ0FDSEUxX1NFTUFQSE9SRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMyNkMKKyNkZWZpbmUgTlYwM19QRklGT19DQUNIRTFfR0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzI3MAorI2RlZmluZSBOVjA0X1BGSUZPX0NBQ0hFMV9FTkdJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMjgwCisjZGVmaW5lIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9EQ09VTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMyQTAKKyNkZWZpbmUgTlY0MF9QRklGT19HUkNUWF9JTlNUQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzJFMAorI2RlZmluZSBOVjQwX1BGSUZPX1VOSzMyRTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMkU0CisjZGVmaW5lIE5WMDRfUEZJRk9fQ0FDSEUxX01FVEhPRChpKSAgICAgICAgICAgICAgICAoMHgwMDAwMzgwMCsoaSo4KSkKKyNkZWZpbmUgTlYwNF9QRklGT19DQUNIRTFfREFUQShpKSAgICAgICAgICAgICAgICAgICgweDAwMDAzODA0KyhpKjgpKQorI2RlZmluZSBOVjQwX1BGSUZPX0NBQ0hFMV9NRVRIT0QoaSkgICAgICAgICAgICAgICAgKDB4MDAwOTAwMDArKGkqOCkpCisjZGVmaW5lIE5WNDBfUEZJRk9fQ0FDSEUxX0RBVEEoaSkgICAgICAgICAgICAgICAgICAoMHgwMDA5MDAwNCsoaSo4KSkKKworI2RlZmluZSBOVl9DUlRDMF9JTlRTVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjAwMTAwCisjZGVmaW5lIE5WX0NSVEMwX0lOVEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MDAxNDAKKyNkZWZpbmUgTlZfQ1JUQzFfSU5UU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYwMjEwMAorI2RlZmluZSBOVl9DUlRDMV9JTlRFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjAyMTQwCisjICAgIGRlZmluZSBOVl9DUlRDX0lOVFJfVkJMQU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MCkKKworI2RlZmluZSBOVjA0X1BSQU1JTgkJCQkJCTB4MDA3MDAwMDAKKworLyogRmlmbyBjb21tYW5kcy4gVGhlc2UgYXJlIG5vdCByZWdzLCBuZWl0aGVyIG1hc2tzICovCisjZGVmaW5lIE5WMDNfRklGT19DTURfSlVNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgTlYwM19GSUZPX0NNRF9KVU1QX09GRlNFVF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgxZmZmZmZmYworI2RlZmluZSBOVjAzX0ZJRk9fQ01EX1JFV0lORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTlYwM19GSUZPX0NNRF9KVU1QIHwgKDAgJiBOVjAzX0ZJRk9fQ01EX0pVTVBfT0ZGU0VUX01BU0spKQorCisvKiBUaGlzIGlzIGEgcGFydGlhbCBpbXBvcnQgZnJvbSBydWxlcy1uZywgYSBmZXcgdGhpbmdzIG1heSBiZSBkdXBsaWNhdGVkLgorICogRXZlbnR1YWxseSB3ZSBzaG91bGQgY29tcGxldGVseSBpbXBvcnQgZXZlcnl0aGluZyBmcm9tIHJ1bGVzLW5nLgorICogRm9yIHRoZSBtb21lbnQgY2hlY2sgcnVsZXMtbmcgZm9yIGRvY3MuCisgICovCisKKyNkZWZpbmUgTlY1MF9QTUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlY1MF9QTUNfX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgTlY1MF9QTUNfX0VTSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyMgICAgZGVmaW5lIE5WNTBfUE1DX0JPT1RfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyMgICAgICAgIGRlZmluZSBOVjUwX1BNQ19CT09UXzBfUkVWSVNJT04gICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwZmYKKyMgICAgICAgIGRlZmluZSBOVjUwX1BNQ19CT09UXzBfUkVWSVNJT05fX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAKKyMgICAgICAgIGRlZmluZSBOVjUwX1BNQ19CT09UXzBfQVJDSCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGZmMDAwMDAKKyMgICAgICAgIGRlZmluZSBOVjUwX1BNQ19CT09UXzBfQVJDSF9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMjAKKyMgICAgZGVmaW5lIE5WNTBfUE1DX0lOVFJfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyMgICAgICAgIGRlZmluZSBOVjUwX1BNQ19JTlRSXzBfUEZJRk8gICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8OCkKKyMgICAgICAgIGRlZmluZSBOVjUwX1BNQ19JTlRSXzBfUEdSQVBIICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwxMikKKyMgICAgICAgIGRlZmluZSBOVjUwX1BNQ19JTlRSXzBfUFRJTUVSICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwyMCkKKyMgICAgICAgIGRlZmluZSBOVjUwX1BNQ19JTlRSXzBfSE9UUExVRyAgICAgICAgICAgICAgICAgICAgICAgICgxPDwyMSkKKyMgICAgICAgIGRlZmluZSBOVjUwX1BNQ19JTlRSXzBfRElTUExBWSAgICAgICAgICAgICAgICAgICAgICAgICgxPDwyNikKKyMgICAgZGVmaW5lIE5WNTBfUE1DX0lOVFJfRU5fMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxNDAKKyMgICAgICAgIGRlZmluZSBOVjUwX1BNQ19JTlRSX0VOXzBfTUFTVEVSICAgICAgICAgICAgICAgICAgICAgICAoMTw8MCkKKyMgICAgICAgICAgICBkZWZpbmUgTlY1MF9QTUNfSU5UUl9FTl8wX01BU1RFUl9ESVNBQkxFRCAgICAgICAgICAoMDw8MCkKKyMgICAgICAgICAgICBkZWZpbmUgTlY1MF9QTUNfSU5UUl9FTl8wX01BU1RFUl9FTkFCTEVEICAgICAgICAgICAoMTw8MCkKKyMgICAgZGVmaW5lIE5WNTBfUE1DX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyMgICAgICAgIGRlZmluZSBOVjUwX1BNQ19FTkFCTEVfUEZJRk8gICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8OCkKKyMgICAgICAgIGRlZmluZSBOVjUwX1BNQ19FTkFCTEVfUEdSQVBIICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwxMikKKworI2RlZmluZSBOVjUwX1BDT05ORUNUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwZTAwMAorI2RlZmluZSBOVjUwX1BDT05ORUNUT1JfX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBOVjUwX1BDT05ORUNUT1JfX0VTSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorIyAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfSU5UUiAgICAgICAgICAgICAgICAgICAgMHgwMDAwZTA1MAorIyAgICAgICAgZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9IT1RQTFVHX0lOVFJfUExVR19JMkMwICAgICAgICAgICgxPDwwKQorIyAgICAgICAgZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9IT1RQTFVHX0lOVFJfUExVR19JMkMxICAgICAgICAgICgxPDwxKQorIyAgICAgICAgZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9IT1RQTFVHX0lOVFJfUExVR19JMkMyICAgICAgICAgICgxPDwyKQorIyAgICAgICAgZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9IT1RQTFVHX0lOVFJfUExVR19JMkMzICAgICAgICAgICgxPDwzKQorIyAgICAgICAgZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9IT1RQTFVHX0lOVFJfVU5QTFVHX0kyQzAgICAgICAgKDE8PDE2KQorIyAgICAgICAgZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9IT1RQTFVHX0lOVFJfVU5QTFVHX0kyQzEgICAgICAgKDE8PDE3KQorIyAgICAgICAgZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9IT1RQTFVHX0lOVFJfVU5QTFVHX0kyQzIgICAgICAgKDE8PDE4KQorIyAgICAgICAgZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9IT1RQTFVHX0lOVFJfVU5QTFVHX0kyQzMgICAgICAgKDE8PDE5KQorIyAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfQ1RSTCAgICAgICAgICAgICAgICAgICAgMHgwMDAwZTA1NAorIyAgICAgICAgZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9IT1RQTFVHX0NUUkxfUExVR19JMkMwICAgICAgICAgICgxPDwwKQorIyAgICAgICAgZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9IT1RQTFVHX0NUUkxfUExVR19JMkMxICAgICAgICAgICgxPDwxKQorIyAgICAgICAgZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9IT1RQTFVHX0NUUkxfUExVR19JMkMyICAgICAgICAgICgxPDwyKQorIyAgICAgICAgZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9IT1RQTFVHX0NUUkxfUExVR19JMkMzICAgICAgICAgICgxPDwzKQorIyAgICAgICAgZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9IT1RQTFVHX0NUUkxfVU5QTFVHX0kyQzAgICAgICAgKDE8PDE2KQorIyAgICAgICAgZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9IT1RQTFVHX0NUUkxfVU5QTFVHX0kyQzEgICAgICAgKDE8PDE3KQorIyAgICAgICAgZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9IT1RQTFVHX0NUUkxfVU5QTFVHX0kyQzIgICAgICAgKDE8PDE4KQorIyAgICAgICAgZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9IT1RQTFVHX0NUUkxfVU5QTFVHX0kyQzMgICAgICAgKDE8PDE5KQorIyAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfU1RBVEUgICAgICAgICAgICAgICAgICAgMHgwMDAwZTEwNAorIyAgICAgICAgZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9IT1RQTFVHX1NUQVRFX1BJTl9DT05ORUNURURfSTJDMCAoMTw8MikKKyMgICAgICAgIGRlZmluZSBOVjUwX1BDT05ORUNUT1JfSE9UUExVR19TVEFURV9QSU5fQ09OTkVDVEVEX0kyQzEgKDE8PDYpCisjICAgICAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfU1RBVEVfUElOX0NPTk5FQ1RFRF9JMkMyICgxPDwxMCkKKyMgICAgICAgIGRlZmluZSBOVjUwX1BDT05ORUNUT1JfSE9UUExVR19TVEFURV9QSU5fQ09OTkVDVEVEX0kyQzMgKDE8PDE0KQorIyAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0kyQ19QT1JUXzAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwZTEzOAorIyAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0kyQ19QT1JUXzEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwZTE1MAorIyAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0kyQ19QT1JUXzIgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwZTE2OAorIyAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0kyQ19QT1JUXzMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwZTE4MAorIyAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0kyQ19QT1JUXzQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwZTI0MAorIyAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0kyQ19QT1JUXzUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwZTI1OAorCisjZGVmaW5lIE5WNTBfQVVYQ0hfREFUQV9PVVQoaSxuKSAgICAgICAgICAgICAoKG4pICogNCArIChpKSAqIDB4NTAgKyAweDAwMDBlNGMwKQorI2RlZmluZSBOVjUwX0FVWENIX0RBVEFfT1VUX19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBOVjUwX0FVWENIX0RBVEFfSU4oaSxuKSAgICAgICAgICAgICAgKChuKSAqIDQgKyAoaSkgKiAweDUwICsgMHgwMDAwZTRkMCkKKyNkZWZpbmUgTlY1MF9BVVhDSF9EQVRBX0lOX19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTlY1MF9BVVhDSF9BRERSKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGkpICogMHg1MCArIDB4MDAwMGU0ZTApCisjZGVmaW5lIE5WNTBfQVVYQ0hfQ1RSTChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpKSAqIDB4NTAgKyAweDAwMDBlNGU0KQorI2RlZmluZSBOVjUwX0FVWENIX0NUUkxfTElOS1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBOVjUwX0FVWENIX0NUUkxfTElOS1NUQVRfTk9UX1JFQURZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX0FVWENIX0NUUkxfTElOS1NUQVRfUkVBRFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBOVjUwX0FVWENIX0NUUkxfTElOS0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBOVjUwX0FVWENIX0NUUkxfTElOS0VOX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX0FVWENIX0NUUkxfTElOS0VOX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBOVjUwX0FVWENIX0NUUkxfRVhFQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBOVjUwX0FVWENIX0NUUkxfRVhFQ19DT01QTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX0FVWENIX0NUUkxfRVhFQ19JTl9QUk9DRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBOVjUwX0FVWENIX0NUUkxfQ01EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwZjAwMAorI2RlZmluZSBOVjUwX0FVWENIX0NUUkxfQ01EX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBOVjUwX0FVWENIX0NUUkxfTEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSBOVjUwX0FVWENIX0NUUkxfTEVOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBOVjUwX0FVWENIX1NUQVQoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaSkgKiAweDUwICsgMHgwMDAwZTRlOCkKKyNkZWZpbmUgTlY1MF9BVVhDSF9TVEFUX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgTlY1MF9BVVhDSF9TVEFUX1NUQVRFX05PVF9SRUFEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlY1MF9BVVhDSF9TVEFUX1NUQVRFX1JFQURZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgTlY1MF9BVVhDSF9TVEFUX1JFUExZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwZjAwMDAKKyNkZWZpbmUgTlY1MF9BVVhDSF9TVEFUX1JFUExZX0FVWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgTlY1MF9BVVhDSF9TVEFUX1JFUExZX0FVWF9BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlY1MF9BVVhDSF9TVEFUX1JFUExZX0FVWF9OQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgTlY1MF9BVVhDSF9TVEFUX1JFUExZX0FVWF9ERUZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgTlY1MF9BVVhDSF9TVEFUX1JFUExZX0kyQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwYzAwMDAKKyNkZWZpbmUgTlY1MF9BVVhDSF9TVEFUX1JFUExZX0kyQ19BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlY1MF9BVVhDSF9TVEFUX1JFUExZX0kyQ19OQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgTlY1MF9BVVhDSF9TVEFUX1JFUExZX0kyQ19ERUZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgTlY1MF9BVVhDSF9TVEFUX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMWYKKworI2RlZmluZSBOVjUwX1BCVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ODAwMAorI2RlZmluZSBOVjUwX1BCVVNfX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBOVjUwX1BCVVNfX0VTSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorIyAgICBkZWZpbmUgTlY1MF9QQlVTX1BDSV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ODAwMAorIyAgICAgICAgZGVmaW5lIE5WNTBfUEJVU19QQ0lfSURfVkVORE9SX0lEICAgICAgICAgICAgICAgICAgMHgwMDAwZmZmZgorIyAgICAgICAgZGVmaW5lIE5WNTBfUEJVU19QQ0lfSURfVkVORE9SX0lEX19TSElGVCAgICAgICAgICAgICAgICAgICAgMAorIyAgICAgICAgZGVmaW5lIE5WNTBfUEJVU19QQ0lfSURfREVWSUNFX0lEICAgICAgICAgICAgICAgICAgMHhmZmZmMDAwMAorIyAgICAgICAgZGVmaW5lIE5WNTBfUEJVU19QQ0lfSURfREVWSUNFX0lEX19TSElGVCAgICAgICAgICAgICAgICAgICAxNgorCisjZGVmaW5lIE5WNTBfUEZCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIE5WNTBfUEZCX19MRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIE5WNTBfUEZCX19FU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisKKyNkZWZpbmUgTlY1MF9QRVhUREVWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDEwMDAKKyNkZWZpbmUgTlY1MF9QRVhUREVWX19MRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgTlY1MF9QRVhUREVWX19FU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKworI2RlZmluZSBOVjUwX1BST00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDMwMDAwMAorI2RlZmluZSBOVjUwX1BST01fX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBOVjUwX1BST01fX0VTSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMAorCisjZGVmaW5lIE5WNTBfUEdSQVBIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIE5WNTBfUEdSQVBIX19MRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIE5WNTBfUEdSQVBIX19FU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwCisKKyNkZWZpbmUgTlY1MF9QRElTUExBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAwMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9PQkpFQ1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAwMTAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAwMjAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAwMjQKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSXzFfVkJMQU5LX0NSVEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGMKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSXzFfVkJMQU5LX0NSVENfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSXzFfVkJMQU5LX0NSVENfKG4pICAgICAgICAgICAgICAgICAgICgxIDw8ICgobikgKyAyKSkKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSXzFfVkJMQU5LX0NSVENfMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSXzFfVkJMQU5LX0NSVENfMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSXzFfQ0xLX1VOSzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSXzFfQ0xLX1VOSzIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSXzFfQ0xLX1VOSzQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAwMmMKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSX0VOX1ZCTEFOS19DUlRDICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGMKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSX0VOX1ZCTEFOS19DUlRDXyhuKSAgICAgICAgICAgICAgICAgICAoMSA8PCAoKG4pICsgMikpCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9WQkxBTktfQ1JUQ18wICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9WQkxBTktfQ1JUQ18xICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9DTEtfVU5LMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9DTEtfVU5LMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9DTEtfVU5LNDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfVU5LMzBfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwMDMwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfVU5LMzBfQ1RSTF9VUERBVEVfVkNMSzAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfVU5LMzBfQ1RSTF9VUERBVEVfVkNMSzEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfVU5LMzBfQ1RSTF9QRU5ESU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfVFJBUFBFRF9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwMDgwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfVFJBUFBFRF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwMDg0CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKGkpICAgICAgICAgICAgICAgICAgKChpKSAqIDB4MTAgKyAweDAwNjEwMjAwKQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVF9ETUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVF9ETUFfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVF9ETUFfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NIQU5ORUxfRE1BX0NCKGkpICAgICAgICAgICAgICAgICgoaSkgKiAweDEwICsgMHgwMDYxMDIwNCkKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DSEFOTkVMX0RNQV9DQl9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DSEFOTkVMX0RNQV9DQl9MT0NBVElPTl9WUkFNICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DSEFOTkVMX0RNQV9DQl9MT0NBVElPTl9TWVNURU0gICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DSEFOTkVMX0RNQV9DQl9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DSEFOTkVMX1VOSzIoaSkgICAgICAgICAgICAgICAgICAoKGkpICogMHgxMCArIDB4MDA2MTAyMDgpCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9VTkszKGkpICAgICAgICAgICAgICAgICAgKChpKSAqIDB4MTAgKyAweDAwNjEwMjBjKQorCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1VSU09SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwMjcwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMihpKSAgICAgICAgICAgKChpKSAqIDB4MTAgKyAweDAwNjEwMjcwKQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDJfT04gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDJfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDJfU1RBVFVTX0FDVElWRSAgICAgICAgICAgICAgMHgwMDAxMDAwMAorCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1RSTF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwMzAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1RSTF9TVEFURV9QRU5ESU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1RSTF9TVEFURV9NRVRIT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxZmZjCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1RSTF9TVEFURV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1RSTF9WQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwMzA0CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfVU5LXzM4MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwMzgwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfUkFNX0FNT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwMzg0CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfVU5LXzM4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwMzg4CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfVU5LXzM4QyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwMzhjCisKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DUlRDX1AoaSwgcikgICAgICAgICgoaSkgKiAweDU0MCArIE5WNTBfUERJU1BMQVlfQ1JUQ18jI3IpCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19DKGksIHIpICAgICg0ICsgKGkpICogMHg1NDAgKyBOVjUwX1BESVNQTEFZX0NSVENfIyNyKQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfVU5LXzBBMTggLyogbXRoZCAweDA5MDAgKi8gICAgICAgICAgICAgICAgMHgwMDYxMGExOAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfQ0xVVF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMGEyNAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfSU5URVJMQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMGE0OAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfU0NBTEVfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMGE1MAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfQ1VSU09SX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMGE1OAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfVU5LMEE3OCAvKiBtdGhkIDB4MDkwNCAqLyAgICAgICAgICAgICAgICAgMHgwMDYxMGE3OAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfVU5LMEFCOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMGFiOAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfREVQVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMGFjOAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfQ0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMGFkMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfQ09MT1JfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMGFlMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfU1lOQ19TVEFSVF9UT19CTEFOS19FTkQgICAgICAgICAgICAgICAgICAgMHgwMDYxMGFlOAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfTU9ERV9VTksxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMGFmMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfRElTUExBWV9UT1RBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMGFmOAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfU1lOQ19EVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMGIwMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfTU9ERV9VTksyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMGIwOAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfVU5LXzBCMTAgLyogbXRoZCAweDA4MjggKi8gICAgICAgICAgICAgICAgMHgwMDYxMGIxMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfRkJfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMGIxOAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfRkJfUElUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMGIyMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfRkJfUElUQ0hfTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfRkJfUE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMGIyOAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfU0NBTEVfQ0VOVEVSX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMGIzOAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfUkVBTF9SRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMGI0MAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfU0NBTEVfUkVTMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMGI0OAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfU0NBTEVfUkVTMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMGI1MAorCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfREFDX01PREVfQ1RSTF9QKGkpICAgICAgICAgICAgICAgICgweDAwNjEwYjU4ICsgKGkpICogMHg4KQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0RBQ19NT0RFX0NUUkxfQyhpKSAgICAgICAgICAgICAgICAoMHgwMDYxMGI1YyArIChpKSAqIDB4OCkKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1JfTU9ERV9DVFJMX1AoaSkgICAgICAgICAgICAgICAgKDB4MDA2MTBiNzAgKyAoaSkgKiAweDgpCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfU09SX01PREVfQ1RSTF9DKGkpICAgICAgICAgICAgICAgICgweDAwNjEwYjc0ICsgKGkpICogMHg4KQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0RBQ19NT0RFX0NUUkwyX1AoaSkgICAgICAgICAgICAgICAoMHgwMDYxMGJkYyArIChpKSAqIDB4OCkKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9EQUNfTU9ERV9DVFJMMl9DKGkpICAgICAgICAgICAgICAgKDB4MDA2MTBiZTAgKyAoaSkgKiAweDgpCisKKyNkZWZpbmUgTlY5MF9QRElTUExBWV9TT1JfTU9ERV9DVFJMX1AoaSkgICAgICAgICAgICAgICAgKDB4MDA2MTA3OTQgKyAoaSkgKiAweDgpCisjZGVmaW5lIE5WOTBfUERJU1BMQVlfU09SX01PREVfQ1RSTF9DKGkpICAgICAgICAgICAgICAgICgweDAwNjEwNzk4ICsgKGkpICogMHg4KQorI2RlZmluZSBOVjkwX1BESVNQTEFZX0RBQ19NT0RFX0NUUkxfUChpKSAgICAgICAgICAgICAgICAoMHgwMDYxMGI1OCArIChpKSAqIDB4OCkKKyNkZWZpbmUgTlY5MF9QRElTUExBWV9EQUNfTU9ERV9DVFJMX0MoaSkgICAgICAgICAgICAgICAgKDB4MDA2MTBiNWMgKyAoaSkgKiAweDgpCisjZGVmaW5lIE5WOTBfUERJU1BMQVlfREFDX01PREVfQ1RSTDJfUChpKSAgICAgICAgICAgICAgICgweDAwNjEwYjgwICsgKGkpICogMHg4KQorI2RlZmluZSBOVjkwX1BESVNQTEFZX0RBQ19NT0RFX0NUUkwyX0MoaSkgICAgICAgICAgICAgICAoMHgwMDYxMGI4NCArIChpKSAqIDB4OCkKKworI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfQ0xLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxNDAwMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfQ0xLX0NUUkwxKGkpICAgICAgICAgICAgICAgICAoKGkpICogMHg4MDAgKyAweDYxNDEwMCkKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DUlRDX0NMS19DVFJMMV9DT05ORUNURUQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DUlRDX0NMS19WUExMX0EoaSkgICAgICAgICAgICAgICAgKChpKSAqIDB4ODAwICsgMHg2MTQxMDQpCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19DTEtfVlBMTF9CKGkpICAgICAgICAgICAgICAgICgoaSkgKiAweDgwMCArIDB4NjE0MTA4KQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfQ0xLX0NUUkwyKGkpICAgICAgICAgICAgICAgICAoKGkpICogMHg4MDAgKyAweDYxNDIwMCkKKworI2RlZmluZSBOVjUwX1BESVNQTEFZX0RBQ19DTEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxNDAwMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0RBQ19DTEtfQ1RSTDIoaSkgICAgICAgICAgICAgICAgICAoKGkpICogMHg4MDAgKyAweDYxNDI4MCkKKworI2RlZmluZSBOVjUwX1BESVNQTEFZX1NPUl9DTEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxNDAwMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX1NPUl9DTEtfQ1RSTDIoaSkgICAgICAgICAgICAgICAgICAoKGkpICogMHg4MDAgKyAweDYxNDMwMCkKKworI2RlZmluZSBOVjUwX1BESVNQTEFZX1ZHQUNSVEMocikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocikgKyAweDYxOTQwMCkKKworI2RlZmluZSBOVjUwX1BESVNQTEFZX0RBQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxYTAwMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkwoaSkgICAgICAgICAgICAgICAgKDB4MDA2MWEwMDQgKyAoaSkgKiAweDgwMCkKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMX0hTWU5DX09GRiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMX1ZTWU5DX09GRiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMX0JMQU5LRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMX1BFTkRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9EQUNfTE9BRF9DVFJMKGkpICAgICAgICAgICAgICAgICgweDAwNjFhMDBjICsgKGkpICogMHg4MDApCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfREFDX0xPQURfQ1RSTF9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfREFDX0xPQURfQ1RSTF9QUkVTRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDAwMDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfREFDX0xPQURfQ1RSTF9ET05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfREFDX0NMS19DVFJMMShpKSAgICAgICAgICAgICAgICAoMHgwMDYxYTAxMCArIChpKSAqIDB4ODAwKQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0RBQ19DTEtfQ1RSTDFfQ09OTkVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYwMAorCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfU09SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjFjMDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfU09SX0RQTVNfQ1RSTChpKSAgICAgICAgICAgICAgICAoMHgwMDYxYzAwNCArIChpKSAqIDB4ODAwKQorI2RlZmluZSBOVjUwX1BESVNQTEFZX1NPUl9EUE1TX0NUUkxfUEVORElORyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX1NPUl9EUE1TX0NUUkxfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBOVjUwX1BESVNQTEFZX1NPUl9DTEtfQ1RSTDEoaSkgICAgICAgICAgICAgICAgKDB4MDA2MWMwMDggKyAoaSkgKiAweDgwMCkKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1JfQ0xLX0NUUkwxX0NPTk5FQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1JfRFBNU19TVEFURShpKSAgICAgICAgICAgICAgICgweDAwNjFjMDMwICsgKGkpICogMHg4MDApCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfU09SX0RQTVNfU1RBVEVfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMwMDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfU09SX0RQTVNfU1RBVEVfQkxBTktFRCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfU09SX0RQTVNfU1RBVEVfV0FJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfU09SX0JBQ0tMSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjFjMDg0CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfU09SX0JBQ0tMSUdIVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfU09SX0JBQ0tMSUdIVF9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwZmZmCisjZGVmaW5lIE5WNTBfU09SX0RQX0NUUkwoaSxsKSAgICAgICAgICAgICgweDAwNjFjMTBjICsgKGkpICogMHg4MDAgKyAobCkgKiAweDgwKQorI2RlZmluZSBOVjUwX1NPUl9EUF9DVFJMX0VOSEFOQ0VEX0ZSQU1FX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBOVjUwX1NPUl9EUF9DVFJMX0xBTkVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFmMDAwMAorI2RlZmluZSBOVjUwX1NPUl9EUF9DVFJMX0xBTkVfMF9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBOVjUwX1NPUl9EUF9DVFJMX0xBTkVfMV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBOVjUwX1NPUl9EUF9DVFJMX0xBTkVfMl9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBOVjUwX1NPUl9EUF9DVFJMX0xBTkVfM19FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBOVjUwX1NPUl9EUF9DVFJMX1RSQUlOSU5HX1BBVFRFUk4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZjAwMDAwMAorI2RlZmluZSBOVjUwX1NPUl9EUF9DVFJMX1RSQUlOSU5HX1BBVFRFUk5fRElTQUJMRUQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX1NPUl9EUF9DVFJMX1RSQUlOSU5HX1BBVFRFUk5fMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBOVjUwX1NPUl9EUF9DVFJMX1RSQUlOSU5HX1BBVFRFUk5fMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBOVjUwX1NPUl9EUF9VTksxMTgoaSxsKSAgICAgICAgICAoMHgwMDYxYzExOCArIChpKSAqIDB4ODAwICsgKGwpICogMHg4MCkKKyNkZWZpbmUgTlY1MF9TT1JfRFBfVU5LMTIwKGksbCkgICAgICAgICAgKDB4MDA2MWMxMjAgKyAoaSkgKiAweDgwMCArIChsKSAqIDB4ODApCisjZGVmaW5lIE5WNTBfU09SX0RQX1VOSzEzMChpLGwpICAgICAgICAgICgweDAwNjFjMTMwICsgKGkpICogMHg4MDAgKyAobCkgKiAweDgwKQorCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfVVNFUihpKSAgICAgICAgICAgICAgICAgICAgICAgICgoaSkgKiAweDEwMDAgKyAweDAwNjQwMDAwKQorI2RlZmluZSBOVjUwX1BESVNQTEFZX1VTRVJfUFVUKGkpICAgICAgICAgICAgICAgICAgICAoKGkpICogMHgxMDAwICsgMHgwMDY0MDAwMCkKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9VU0VSX0dFVChpKSAgICAgICAgICAgICAgICAgICAgKChpKSAqIDB4MTAwMCArIDB4MDA2NDAwMDQpCisKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DVVJTT1JfVVNFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2NDcwMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DVVJTT1JfVVNFUl9QT1NfQ1RSTChpKSAgICAgICAgKChpKSAqIDB4MTAwMCArIDB4MDA2NDcwODApCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1VSU09SX1VTRVJfUE9TKGkpICAgICAgICAgICAgICgoaSkgKiAweDEwMDAgKyAweDAwNjQ3MDg0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zZ2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zZ2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjN2YxZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3NnZG1hLmMKQEAgLTAsMCArMSwzMjEgQEAKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisKKyNkZWZpbmUgTlZfQ1RYRE1BX1BBR0VfU0hJRlQgMTIKKyNkZWZpbmUgTlZfQ1RYRE1BX1BBR0VfU0laRSAgKDEgPDwgTlZfQ1RYRE1BX1BBR0VfU0hJRlQpCisjZGVmaW5lIE5WX0NUWERNQV9QQUdFX01BU0sgIChOVl9DVFhETUFfUEFHRV9TSVpFIC0gMSkKKworc3RydWN0IG5vdXZlYXVfc2dkbWFfYmUgeworCXN0cnVjdCB0dG1fYmFja2VuZCBiYWNrZW5kOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CisKKwlkbWFfYWRkcl90ICpwYWdlczsKKwl1bnNpZ25lZCBucl9wYWdlczsKKworCXVuc2lnbmVkIHB0ZV9zdGFydDsKKwlib29sIGJvdW5kOworfTsKKworc3RhdGljIGludAorbm91dmVhdV9zZ2RtYV9wb3B1bGF0ZShzdHJ1Y3QgdHRtX2JhY2tlbmQgKmJlLCB1bnNpZ25lZCBsb25nIG51bV9wYWdlcywKKwkJICAgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHN0cnVjdCBwYWdlICpkdW1teV9yZWFkX3BhZ2UpCit7CisJc3RydWN0IG5vdXZlYXVfc2dkbWFfYmUgKm52YmUgPSAoc3RydWN0IG5vdXZlYXVfc2dkbWFfYmUgKiliZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbnZiZS0+ZGV2OworCisJTlZfREVCVUcobnZiZS0+ZGV2LCAibnVtX3BhZ2VzID0gJWxkXG4iLCBudW1fcGFnZXMpOworCisJaWYgKG52YmUtPnBhZ2VzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW52YmUtPnBhZ2VzID0ga21hbGxvYyhzaXplb2YoZG1hX2FkZHJfdCkgKiBudW1fcGFnZXMsIEdGUF9LRVJORUwpOworCWlmICghbnZiZS0+cGFnZXMpCisJCXJldHVybiAtRU5PTUVNOworCisJbnZiZS0+bnJfcGFnZXMgPSAwOworCXdoaWxlIChudW1fcGFnZXMtLSkgeworCQludmJlLT5wYWdlc1tudmJlLT5ucl9wYWdlc10gPQorCQkJcGNpX21hcF9wYWdlKGRldi0+cGRldiwgcGFnZXNbbnZiZS0+bnJfcGFnZXNdLCAwLAorCQkJCSAgICAgUEFHRV9TSVpFLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKGRldi0+cGRldiwKKwkJCQkJICBudmJlLT5wYWdlc1tudmJlLT5ucl9wYWdlc10pKSB7CisJCQliZS0+ZnVuYy0+Y2xlYXIoYmUpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQludmJlLT5ucl9wYWdlcysrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9zZ2RtYV9jbGVhcihzdHJ1Y3QgdHRtX2JhY2tlbmQgKmJlKQoreworCXN0cnVjdCBub3V2ZWF1X3NnZG1hX2JlICpudmJlID0gKHN0cnVjdCBub3V2ZWF1X3NnZG1hX2JlICopYmU7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG52YmUtPmRldjsKKworCU5WX0RFQlVHKG52YmUtPmRldiwgIlxuIik7CisKKwlpZiAobnZiZSAmJiBudmJlLT5wYWdlcykgeworCQlpZiAobnZiZS0+Ym91bmQpCisJCQliZS0+ZnVuYy0+dW5iaW5kKGJlKTsKKworCQl3aGlsZSAobnZiZS0+bnJfcGFnZXMtLSkgeworCQkJcGNpX3VubWFwX3BhZ2UoZGV2LT5wZGV2LCBudmJlLT5wYWdlc1tudmJlLT5ucl9wYWdlc10sCisJCQkJICAgICAgIFBBR0VfU0laRSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwkJfQorCQlrZnJlZShudmJlLT5wYWdlcyk7CisJCW52YmUtPnBhZ2VzID0gTlVMTDsKKwkJbnZiZS0+bnJfcGFnZXMgPSAwOworCX0KK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZAorbm91dmVhdV9zZ2RtYV9wdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDY0X3Qgb2Zmc2V0KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgcHRlID0gKG9mZnNldCA+PiBOVl9DVFhETUFfUEFHRV9TSElGVCk7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKQorCQlyZXR1cm4gcHRlICsgMjsKKworCXJldHVybiBwdGUgPDwgMTsKK30KKworc3RhdGljIGludAorbm91dmVhdV9zZ2RtYV9iaW5kKHN0cnVjdCB0dG1fYmFja2VuZCAqYmUsIHN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtKQoreworCXN0cnVjdCBub3V2ZWF1X3NnZG1hX2JlICpudmJlID0gKHN0cnVjdCBub3V2ZWF1X3NnZG1hX2JlICopYmU7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG52YmUtPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqID0gZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19jdHhkbWE7CisJdW5zaWduZWQgaSwgaiwgcHRlOworCisJTlZfREVCVUcoZGV2LCAicGc9MHglbHhcbiIsIG1lbS0+bW1fbm9kZS0+c3RhcnQpOworCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKG52YmUtPmRldiwgdHJ1ZSk7CisJcHRlID0gbm91dmVhdV9zZ2RtYV9wdGUobnZiZS0+ZGV2LCBtZW0tPm1tX25vZGUtPnN0YXJ0IDw8IFBBR0VfU0hJRlQpOworCW52YmUtPnB0ZV9zdGFydCA9IHB0ZTsKKwlmb3IgKGkgPSAwOyBpIDwgbnZiZS0+bnJfcGFnZXM7IGkrKykgeworCQlkbWFfYWRkcl90IGRtYV9vZmZzZXQgPSBudmJlLT5wYWdlc1tpXTsKKwkJdWludDMyX3Qgb2Zmc2V0X2wgPSBsb3dlcl8zMl9iaXRzKGRtYV9vZmZzZXQpOworCQl1aW50MzJfdCBvZmZzZXRfaCA9IHVwcGVyXzMyX2JpdHMoZG1hX29mZnNldCk7CisKKwkJZm9yIChqID0gMDsgaiA8IFBBR0VfU0laRSAvIE5WX0NUWERNQV9QQUdFX1NJWkU7IGorKykgeworCQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkKKwkJCQludl93bzMyKGRldiwgZ3B1b2JqLCBwdGUrKywgb2Zmc2V0X2wgfCAzKTsKKwkJCWVsc2UgeworCQkJCW52X3dvMzIoZGV2LCBncHVvYmosIHB0ZSsrLCBvZmZzZXRfbCB8IDB4MjEpOworCQkJCW52X3dvMzIoZGV2LCBncHVvYmosIHB0ZSsrLCBvZmZzZXRfaCAmIDB4ZmYpOworCQkJfQorCisJCQlkbWFfb2Zmc2V0ICs9IE5WX0NUWERNQV9QQUdFX1NJWkU7CisJCX0KKwl9CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MobnZiZS0+ZGV2KTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzUwKSB7CisJCW52X3dyMzIoZGV2LCAweDEwMGM4MCwgMHgwMDA1MDAwMSk7CisJCWlmICghbnZfd2FpdCgweDEwMGM4MCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCkpIHsKKwkJCU5WX0VSUk9SKGRldiwgInRpbWVvdXQ6ICgweDEwMGM4MCAmIDEpID09IDAgKDIpXG4iKTsKKwkJCU5WX0VSUk9SKGRldiwgIjB4MTAwYzgwID0gMHglMDh4XG4iLAorCQkJCQkJbnZfcmQzMihkZXYsIDB4MTAwYzgwKSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJbnZfd3IzMihkZXYsIDB4MTAwYzgwLCAweDAwMDAwMDAxKTsKKwkJaWYgKCFudl93YWl0KDB4MTAwYzgwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKSkgeworCQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4MTAwYzgwICYgMSkgPT0gMCAoMilcbiIpOworCQkJTlZfRVJST1IoZGV2LCAiMHgxMDBjODAgPSAweCUwOHhcbiIsCisJCQkJCQludl9yZDMyKGRldiwgMHgxMDBjODApKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwludmJlLT5ib3VuZCA9IHRydWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfc2dkbWFfdW5iaW5kKHN0cnVjdCB0dG1fYmFja2VuZCAqYmUpCit7CisJc3RydWN0IG5vdXZlYXVfc2dkbWFfYmUgKm52YmUgPSAoc3RydWN0IG5vdXZlYXVfc2dkbWFfYmUgKiliZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbnZiZS0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmogPSBkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2N0eGRtYTsKKwl1bnNpZ25lZCBpLCBqLCBwdGU7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJaWYgKCFudmJlLT5ib3VuZCkKKwkJcmV0dXJuIDA7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MobnZiZS0+ZGV2LCB0cnVlKTsKKwlwdGUgPSBudmJlLT5wdGVfc3RhcnQ7CisJZm9yIChpID0gMDsgaSA8IG52YmUtPm5yX3BhZ2VzOyBpKyspIHsKKwkJZG1hX2FkZHJfdCBkbWFfb2Zmc2V0ID0gZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19kdW1teV9idXM7CisKKwkJZm9yIChqID0gMDsgaiA8IFBBR0VfU0laRSAvIE5WX0NUWERNQV9QQUdFX1NJWkU7IGorKykgeworCQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkKKwkJCQludl93bzMyKGRldiwgZ3B1b2JqLCBwdGUrKywgZG1hX29mZnNldCB8IDMpOworCQkJZWxzZSB7CisJCQkJbnZfd28zMihkZXYsIGdwdW9iaiwgcHRlKyssIGRtYV9vZmZzZXQgfCAweDIxKTsKKwkJCQludl93bzMyKGRldiwgZ3B1b2JqLCBwdGUrKywgMHgwMDAwMDAwMCk7CisJCQl9CisKKwkJCWRtYV9vZmZzZXQgKz0gTlZfQ1RYRE1BX1BBR0VfU0laRTsKKwkJfQorCX0KKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhudmJlLT5kZXYpOworCisJbnZiZS0+Ym91bmQgPSBmYWxzZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfc2dkbWFfZGVzdHJveShzdHJ1Y3QgdHRtX2JhY2tlbmQgKmJlKQoreworCXN0cnVjdCBub3V2ZWF1X3NnZG1hX2JlICpudmJlID0gKHN0cnVjdCBub3V2ZWF1X3NnZG1hX2JlICopYmU7CisKKwlpZiAoYmUpIHsKKwkJTlZfREVCVUcobnZiZS0+ZGV2LCAiXG4iKTsKKworCQlpZiAobnZiZSkgeworCQkJaWYgKG52YmUtPnBhZ2VzKQorCQkJCWJlLT5mdW5jLT5jbGVhcihiZSk7CisJCQlrZnJlZShudmJlKTsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCB0dG1fYmFja2VuZF9mdW5jIG5vdXZlYXVfc2dkbWFfYmFja2VuZCA9IHsKKwkucG9wdWxhdGUJCT0gbm91dmVhdV9zZ2RtYV9wb3B1bGF0ZSwKKwkuY2xlYXIJCQk9IG5vdXZlYXVfc2dkbWFfY2xlYXIsCisJLmJpbmQJCQk9IG5vdXZlYXVfc2dkbWFfYmluZCwKKwkudW5iaW5kCQkJPSBub3V2ZWF1X3NnZG1hX3VuYmluZCwKKwkuZGVzdHJveQkJPSBub3V2ZWF1X3NnZG1hX2Rlc3Ryb3kKK307CisKK3N0cnVjdCB0dG1fYmFja2VuZCAqCitub3V2ZWF1X3NnZG1hX2luaXRfdHRtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSAqbnZiZTsKKworCWlmICghZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19jdHhkbWEpCisJCXJldHVybiBOVUxMOworCisJbnZiZSA9IGt6YWxsb2Moc2l6ZW9mKCpudmJlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFudmJlKQorCQlyZXR1cm4gTlVMTDsKKworCW52YmUtPmRldiA9IGRldjsKKworCW52YmUtPmJhY2tlbmQuZnVuYwk9ICZub3V2ZWF1X3NnZG1hX2JhY2tlbmQ7CisKKwlyZXR1cm4gJm52YmUtPmJhY2tlbmQ7Cit9CisKK2ludAorbm91dmVhdV9zZ2RtYV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaiA9IE5VTEw7CisJdWludDMyX3QgYXBlcl9zaXplLCBvYmpfc2l6ZTsKKwlpbnQgaSwgcmV0OworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgeworCQlhcGVyX3NpemUgPSAoNjQgKiAxMDI0ICogMTAyNCk7CisJCW9ial9zaXplICA9IChhcGVyX3NpemUgPj4gTlZfQ1RYRE1BX1BBR0VfU0hJRlQpICogNDsKKwkJb2JqX3NpemUgKz0gODsgLyogY3R4ZG1hIGhlYWRlciAqLworCX0gZWxzZSB7CisJCS8qIDEgZW50aXJlIFZNIHBhZ2UgdGFibGUgKi8KKwkJYXBlcl9zaXplID0gKDUxMiAqIDEwMjQgKiAxMDI0KTsKKwkJb2JqX3NpemUgID0gKGFwZXJfc2l6ZSA+PiBOVl9DVFhETUFfUEFHRV9TSElGVCkgKiA4OworCX0KKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIE5VTEwsIG9ial9zaXplLCAxNiwKKwkJCQkgICAgICBOVk9CSl9GTEFHX0FMTE9XX05PX1JFRlMgfAorCQkJCSAgICAgIE5WT0JKX0ZMQUdfWkVST19BTExPQyB8CisJCQkJICAgICAgTlZPQkpfRkxBR19aRVJPX0ZSRUUsICZncHVvYmopOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiRXJyb3IgY3JlYXRpbmcgc2dkbWEgb2JqZWN0OiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2R1bW15X3BhZ2UgPQorCQlhbGxvY19wYWdlKEdGUF9LRVJORUx8X19HRlBfRE1BMzIpOworCXNldF9iaXQoUEdfbG9ja2VkLCAmZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19kdW1teV9wYWdlLT5mbGFncyk7CisJZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19kdW1teV9idXMgPQorCQlwY2lfbWFwX3BhZ2UoZGV2LT5wZGV2LCBkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2R1bW15X3BhZ2UsIDAsCisJCQkgICAgIFBBR0VfU0laRSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKKwkJLyogTWF5YmUgdXNlIE5WX0RNQV9UQVJHRVRfQUdQIGZvciBQQ0lFPyBOVklESUEgZG8gdGhpcywgYW5kCisJCSAqIGNvbmZpcm1lZCB0byB3b3JrIG9uIGM1MS4gIFBlcmhhcHMgbWVhbnMgTlZfRE1BX1RBUkdFVF9QQ0lFCisJCSAqIG9uIHRob3NlIGNhcmRzPyAqLworCQludl93bzMyKGRldiwgZ3B1b2JqLCAwLCBOVl9DTEFTU19ETUFfSU5fTUVNT1JZIHwKKwkJCQkgICAgICAgKDEgPDwgMTIpIC8qIFBUIHByZXNlbnQgKi8gfAorCQkJCSAgICAgICAoMCA8PCAxMykgLyogUFQgKm5vdCogbGluZWFyICovIHwKKwkJCQkgICAgICAgKE5WX0RNQV9BQ0NFU1NfUlcgIDw8IDE0KSB8CisJCQkJICAgICAgIChOVl9ETUFfVEFSR0VUX1BDSSA8PCAxNikpOworCQludl93bzMyKGRldiwgZ3B1b2JqLCAxLCBhcGVyX3NpemUgLSAxKTsKKwkJZm9yIChpID0gMjsgaSA8IDIgKyAoYXBlcl9zaXplID4+IDEyKTsgaSsrKSB7CisJCQludl93bzMyKGRldiwgZ3B1b2JqLCBpLAorCQkJCSAgICBkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2R1bW15X2J1cyB8IDMpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IG9ial9zaXplOyBpICs9IDgpIHsKKwkJCW52X3dvMzIoZGV2LCBncHVvYmosIChpKzApLzQsCisJCQkJICAgIGRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfYnVzIHwgMHgyMSk7CisJCQludl93bzMyKGRldiwgZ3B1b2JqLCAoaSs0KS80LCAwKTsKKwkJfQorCX0KKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCisJZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlICAgICAgPSBOT1VWRUFVX0dBUlRfU0dETUE7CisJZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX2Jhc2UgPSAwOworCWRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9zaXplID0gYXBlcl9zaXplOworCWRldl9wcml2LT5nYXJ0X2luZm8uc2dfY3R4ZG1hID0gZ3B1b2JqOworCXJldHVybiAwOworfQorCit2b2lkCitub3V2ZWF1X3NnZG1hX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2R1bW15X3BhZ2UpIHsKKwkJcGNpX3VubWFwX3BhZ2UoZGV2LT5wZGV2LCBkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2R1bW15X2J1cywKKwkJCSAgICAgICBOVl9DVFhETUFfUEFHRV9TSVpFLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQl1bmxvY2tfcGFnZShkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2R1bW15X3BhZ2UpOworCQlfX2ZyZWVfcGFnZShkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2R1bW15X3BhZ2UpOworCQlkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2R1bW15X3BhZ2UgPSBOVUxMOworCQlkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2R1bW15X2J1cyA9IDA7CisJfQorCisJbm91dmVhdV9ncHVvYmpfZGVsKGRldiwgJmRldl9wcml2LT5nYXJ0X2luZm8uc2dfY3R4ZG1hKTsKK30KKworaW50Citub3V2ZWF1X3NnZG1hX2dldF9wYWdlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgKnBhZ2UpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaiA9IGRldl9wcml2LT5nYXJ0X2luZm8uc2dfY3R4ZG1hOworCXN0cnVjdCBub3V2ZWF1X2luc3RtZW1fZW5naW5lICppbnN0bWVtID0gJmRldl9wcml2LT5lbmdpbmUuaW5zdG1lbTsKKwlpbnQgcHRlOworCisJcHRlID0gKG9mZnNldCA+PiBOVl9DVFhETUFfUEFHRV9TSElGVCk7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgeworCQlpbnN0bWVtLT5wcmVwYXJlX2FjY2VzcyhkZXYsIGZhbHNlKTsKKwkJKnBhZ2UgPSBudl9ybzMyKGRldiwgZ3B1b2JqLCAocHRlICsgMikpICYgfk5WX0NUWERNQV9QQUdFX01BU0s7CisJCWluc3RtZW0tPmZpbmlzaF9hY2Nlc3MoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJTlZfRVJST1IoZGV2LCAiVW5pbXBsZW1lbnRlZCBvbiBOVjUwXG4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc3RhdGUuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWQ0MWQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zdGF0ZS5jCkBAIC0wLDAgKzEsODExIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUgU3RlcGhhbmUgTWFyY2hlc2luCisgKiBDb3B5cmlnaHQgMjAwOCBTdHVhcnQgQmVubmV0dAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N3YWIuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiZHJtX3NhcmVhLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisjaW5jbHVkZSA8bGludXgvdmdhYXJiLmg+CisKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCisjaW5jbHVkZSAibnY1MF9kaXNwbGF5LmgiCisKK3N0YXRpYyBpbnQgbm91dmVhdV9zdHViX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikgeyByZXR1cm4gMDsgfQorc3RhdGljIHZvaWQgbm91dmVhdV9zdHViX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpIHt9CisKK3N0YXRpYyBpbnQgbm91dmVhdV9pbml0X2VuZ2luZV9wdHJzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmdpbmUgKmVuZ2luZSA9ICZkZXZfcHJpdi0+ZW5naW5lOworCisJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCAmIDB4ZjApIHsKKwljYXNlIDB4MDA6CisJCWVuZ2luZS0+aW5zdG1lbS5pbml0CQk9IG52MDRfaW5zdG1lbV9pbml0OworCQllbmdpbmUtPmluc3RtZW0udGFrZWRvd24JPSBudjA0X2luc3RtZW1fdGFrZWRvd247CisJCWVuZ2luZS0+aW5zdG1lbS5zdXNwZW5kCQk9IG52MDRfaW5zdG1lbV9zdXNwZW5kOworCQllbmdpbmUtPmluc3RtZW0ucmVzdW1lCQk9IG52MDRfaW5zdG1lbV9yZXN1bWU7CisJCWVuZ2luZS0+aW5zdG1lbS5wb3B1bGF0ZQk9IG52MDRfaW5zdG1lbV9wb3B1bGF0ZTsKKwkJZW5naW5lLT5pbnN0bWVtLmNsZWFyCQk9IG52MDRfaW5zdG1lbV9jbGVhcjsKKwkJZW5naW5lLT5pbnN0bWVtLmJpbmQJCT0gbnYwNF9pbnN0bWVtX2JpbmQ7CisJCWVuZ2luZS0+aW5zdG1lbS51bmJpbmQJCT0gbnYwNF9pbnN0bWVtX3VuYmluZDsKKwkJZW5naW5lLT5pbnN0bWVtLnByZXBhcmVfYWNjZXNzCT0gbnYwNF9pbnN0bWVtX3ByZXBhcmVfYWNjZXNzOworCQllbmdpbmUtPmluc3RtZW0uZmluaXNoX2FjY2Vzcwk9IG52MDRfaW5zdG1lbV9maW5pc2hfYWNjZXNzOworCQllbmdpbmUtPm1jLmluaXQJCQk9IG52MDRfbWNfaW5pdDsKKwkJZW5naW5lLT5tYy50YWtlZG93bgkJPSBudjA0X21jX3Rha2Vkb3duOworCQllbmdpbmUtPnRpbWVyLmluaXQJCT0gbnYwNF90aW1lcl9pbml0OworCQllbmdpbmUtPnRpbWVyLnJlYWQJCT0gbnYwNF90aW1lcl9yZWFkOworCQllbmdpbmUtPnRpbWVyLnRha2Vkb3duCQk9IG52MDRfdGltZXJfdGFrZWRvd247CisJCWVuZ2luZS0+ZmIuaW5pdAkJCT0gbnYwNF9mYl9pbml0OworCQllbmdpbmUtPmZiLnRha2Vkb3duCQk9IG52MDRfZmJfdGFrZWRvd247CisJCWVuZ2luZS0+Z3JhcGguZ3JjbGFzcwkJPSBudjA0X2dyYXBoX2dyY2xhc3M7CisJCWVuZ2luZS0+Z3JhcGguaW5pdAkJPSBudjA0X2dyYXBoX2luaXQ7CisJCWVuZ2luZS0+Z3JhcGgudGFrZWRvd24JCT0gbnYwNF9ncmFwaF90YWtlZG93bjsKKwkJZW5naW5lLT5ncmFwaC5maWZvX2FjY2Vzcwk9IG52MDRfZ3JhcGhfZmlmb19hY2Nlc3M7CisJCWVuZ2luZS0+Z3JhcGguY2hhbm5lbAkJPSBudjA0X2dyYXBoX2NoYW5uZWw7CisJCWVuZ2luZS0+Z3JhcGguY3JlYXRlX2NvbnRleHQJPSBudjA0X2dyYXBoX2NyZWF0ZV9jb250ZXh0OworCQllbmdpbmUtPmdyYXBoLmRlc3Ryb3lfY29udGV4dAk9IG52MDRfZ3JhcGhfZGVzdHJveV9jb250ZXh0OworCQllbmdpbmUtPmdyYXBoLmxvYWRfY29udGV4dAk9IG52MDRfZ3JhcGhfbG9hZF9jb250ZXh0OworCQllbmdpbmUtPmdyYXBoLnVubG9hZF9jb250ZXh0CT0gbnYwNF9ncmFwaF91bmxvYWRfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLmNoYW5uZWxzCQk9IDE2OworCQllbmdpbmUtPmZpZm8uaW5pdAkJPSBudjA0X2ZpZm9faW5pdDsKKwkJZW5naW5lLT5maWZvLnRha2Vkb3duCQk9IG5vdXZlYXVfc3R1Yl90YWtlZG93bjsKKwkJZW5naW5lLT5maWZvLmRpc2FibGUJCT0gbnYwNF9maWZvX2Rpc2FibGU7CisJCWVuZ2luZS0+Zmlmby5lbmFibGUJCT0gbnYwNF9maWZvX2VuYWJsZTsKKwkJZW5naW5lLT5maWZvLnJlYXNzaWduCQk9IG52MDRfZmlmb19yZWFzc2lnbjsKKwkJZW5naW5lLT5maWZvLmNoYW5uZWxfaWQJCT0gbnYwNF9maWZvX2NoYW5uZWxfaWQ7CisJCWVuZ2luZS0+Zmlmby5jcmVhdGVfY29udGV4dAk9IG52MDRfZmlmb19jcmVhdGVfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLmRlc3Ryb3lfY29udGV4dAk9IG52MDRfZmlmb19kZXN0cm95X2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby5sb2FkX2NvbnRleHQJPSBudjA0X2ZpZm9fbG9hZF9jb250ZXh0OworCQllbmdpbmUtPmZpZm8udW5sb2FkX2NvbnRleHQJPSBudjA0X2ZpZm9fdW5sb2FkX2NvbnRleHQ7CisJCWJyZWFrOworCWNhc2UgMHgxMDoKKwkJZW5naW5lLT5pbnN0bWVtLmluaXQJCT0gbnYwNF9pbnN0bWVtX2luaXQ7CisJCWVuZ2luZS0+aW5zdG1lbS50YWtlZG93bgk9IG52MDRfaW5zdG1lbV90YWtlZG93bjsKKwkJZW5naW5lLT5pbnN0bWVtLnN1c3BlbmQJCT0gbnYwNF9pbnN0bWVtX3N1c3BlbmQ7CisJCWVuZ2luZS0+aW5zdG1lbS5yZXN1bWUJCT0gbnYwNF9pbnN0bWVtX3Jlc3VtZTsKKwkJZW5naW5lLT5pbnN0bWVtLnBvcHVsYXRlCT0gbnYwNF9pbnN0bWVtX3BvcHVsYXRlOworCQllbmdpbmUtPmluc3RtZW0uY2xlYXIJCT0gbnYwNF9pbnN0bWVtX2NsZWFyOworCQllbmdpbmUtPmluc3RtZW0uYmluZAkJPSBudjA0X2luc3RtZW1fYmluZDsKKwkJZW5naW5lLT5pbnN0bWVtLnVuYmluZAkJPSBudjA0X2luc3RtZW1fdW5iaW5kOworCQllbmdpbmUtPmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MJPSBudjA0X2luc3RtZW1fcHJlcGFyZV9hY2Nlc3M7CisJCWVuZ2luZS0+aW5zdG1lbS5maW5pc2hfYWNjZXNzCT0gbnYwNF9pbnN0bWVtX2ZpbmlzaF9hY2Nlc3M7CisJCWVuZ2luZS0+bWMuaW5pdAkJCT0gbnYwNF9tY19pbml0OworCQllbmdpbmUtPm1jLnRha2Vkb3duCQk9IG52MDRfbWNfdGFrZWRvd247CisJCWVuZ2luZS0+dGltZXIuaW5pdAkJPSBudjA0X3RpbWVyX2luaXQ7CisJCWVuZ2luZS0+dGltZXIucmVhZAkJPSBudjA0X3RpbWVyX3JlYWQ7CisJCWVuZ2luZS0+dGltZXIudGFrZWRvd24JCT0gbnYwNF90aW1lcl90YWtlZG93bjsKKwkJZW5naW5lLT5mYi5pbml0CQkJPSBudjEwX2ZiX2luaXQ7CisJCWVuZ2luZS0+ZmIudGFrZWRvd24JCT0gbnYxMF9mYl90YWtlZG93bjsKKwkJZW5naW5lLT5ncmFwaC5ncmNsYXNzCQk9IG52MTBfZ3JhcGhfZ3JjbGFzczsKKwkJZW5naW5lLT5ncmFwaC5pbml0CQk9IG52MTBfZ3JhcGhfaW5pdDsKKwkJZW5naW5lLT5ncmFwaC50YWtlZG93bgkJPSBudjEwX2dyYXBoX3Rha2Vkb3duOworCQllbmdpbmUtPmdyYXBoLmNoYW5uZWwJCT0gbnYxMF9ncmFwaF9jaGFubmVsOworCQllbmdpbmUtPmdyYXBoLmNyZWF0ZV9jb250ZXh0CT0gbnYxMF9ncmFwaF9jcmVhdGVfY29udGV4dDsKKwkJZW5naW5lLT5ncmFwaC5kZXN0cm95X2NvbnRleHQJPSBudjEwX2dyYXBoX2Rlc3Ryb3lfY29udGV4dDsKKwkJZW5naW5lLT5ncmFwaC5maWZvX2FjY2Vzcwk9IG52MDRfZ3JhcGhfZmlmb19hY2Nlc3M7CisJCWVuZ2luZS0+Z3JhcGgubG9hZF9jb250ZXh0CT0gbnYxMF9ncmFwaF9sb2FkX2NvbnRleHQ7CisJCWVuZ2luZS0+Z3JhcGgudW5sb2FkX2NvbnRleHQJPSBudjEwX2dyYXBoX3VubG9hZF9jb250ZXh0OworCQllbmdpbmUtPmZpZm8uY2hhbm5lbHMJCT0gMzI7CisJCWVuZ2luZS0+Zmlmby5pbml0CQk9IG52MTBfZmlmb19pbml0OworCQllbmdpbmUtPmZpZm8udGFrZWRvd24JCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOworCQllbmdpbmUtPmZpZm8uZGlzYWJsZQkJPSBudjA0X2ZpZm9fZGlzYWJsZTsKKwkJZW5naW5lLT5maWZvLmVuYWJsZQkJPSBudjA0X2ZpZm9fZW5hYmxlOworCQllbmdpbmUtPmZpZm8ucmVhc3NpZ24JCT0gbnYwNF9maWZvX3JlYXNzaWduOworCQllbmdpbmUtPmZpZm8uY2hhbm5lbF9pZAkJPSBudjEwX2ZpZm9fY2hhbm5lbF9pZDsKKwkJZW5naW5lLT5maWZvLmNyZWF0ZV9jb250ZXh0CT0gbnYxMF9maWZvX2NyZWF0ZV9jb250ZXh0OworCQllbmdpbmUtPmZpZm8uZGVzdHJveV9jb250ZXh0CT0gbnYxMF9maWZvX2Rlc3Ryb3lfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLmxvYWRfY29udGV4dAk9IG52MTBfZmlmb19sb2FkX2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby51bmxvYWRfY29udGV4dAk9IG52MTBfZmlmb191bmxvYWRfY29udGV4dDsKKwkJYnJlYWs7CisJY2FzZSAweDIwOgorCQllbmdpbmUtPmluc3RtZW0uaW5pdAkJPSBudjA0X2luc3RtZW1faW5pdDsKKwkJZW5naW5lLT5pbnN0bWVtLnRha2Vkb3duCT0gbnYwNF9pbnN0bWVtX3Rha2Vkb3duOworCQllbmdpbmUtPmluc3RtZW0uc3VzcGVuZAkJPSBudjA0X2luc3RtZW1fc3VzcGVuZDsKKwkJZW5naW5lLT5pbnN0bWVtLnJlc3VtZQkJPSBudjA0X2luc3RtZW1fcmVzdW1lOworCQllbmdpbmUtPmluc3RtZW0ucG9wdWxhdGUJPSBudjA0X2luc3RtZW1fcG9wdWxhdGU7CisJCWVuZ2luZS0+aW5zdG1lbS5jbGVhcgkJPSBudjA0X2luc3RtZW1fY2xlYXI7CisJCWVuZ2luZS0+aW5zdG1lbS5iaW5kCQk9IG52MDRfaW5zdG1lbV9iaW5kOworCQllbmdpbmUtPmluc3RtZW0udW5iaW5kCQk9IG52MDRfaW5zdG1lbV91bmJpbmQ7CisJCWVuZ2luZS0+aW5zdG1lbS5wcmVwYXJlX2FjY2Vzcwk9IG52MDRfaW5zdG1lbV9wcmVwYXJlX2FjY2VzczsKKwkJZW5naW5lLT5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MJPSBudjA0X2luc3RtZW1fZmluaXNoX2FjY2VzczsKKwkJZW5naW5lLT5tYy5pbml0CQkJPSBudjA0X21jX2luaXQ7CisJCWVuZ2luZS0+bWMudGFrZWRvd24JCT0gbnYwNF9tY190YWtlZG93bjsKKwkJZW5naW5lLT50aW1lci5pbml0CQk9IG52MDRfdGltZXJfaW5pdDsKKwkJZW5naW5lLT50aW1lci5yZWFkCQk9IG52MDRfdGltZXJfcmVhZDsKKwkJZW5naW5lLT50aW1lci50YWtlZG93bgkJPSBudjA0X3RpbWVyX3Rha2Vkb3duOworCQllbmdpbmUtPmZiLmluaXQJCQk9IG52MTBfZmJfaW5pdDsKKwkJZW5naW5lLT5mYi50YWtlZG93bgkJPSBudjEwX2ZiX3Rha2Vkb3duOworCQllbmdpbmUtPmdyYXBoLmdyY2xhc3MJCT0gbnYyMF9ncmFwaF9ncmNsYXNzOworCQllbmdpbmUtPmdyYXBoLmluaXQJCT0gbnYyMF9ncmFwaF9pbml0OworCQllbmdpbmUtPmdyYXBoLnRha2Vkb3duCQk9IG52MjBfZ3JhcGhfdGFrZWRvd247CisJCWVuZ2luZS0+Z3JhcGguY2hhbm5lbAkJPSBudjEwX2dyYXBoX2NoYW5uZWw7CisJCWVuZ2luZS0+Z3JhcGguY3JlYXRlX2NvbnRleHQJPSBudjIwX2dyYXBoX2NyZWF0ZV9jb250ZXh0OworCQllbmdpbmUtPmdyYXBoLmRlc3Ryb3lfY29udGV4dAk9IG52MjBfZ3JhcGhfZGVzdHJveV9jb250ZXh0OworCQllbmdpbmUtPmdyYXBoLmZpZm9fYWNjZXNzCT0gbnYwNF9ncmFwaF9maWZvX2FjY2VzczsKKwkJZW5naW5lLT5ncmFwaC5sb2FkX2NvbnRleHQJPSBudjIwX2dyYXBoX2xvYWRfY29udGV4dDsKKwkJZW5naW5lLT5ncmFwaC51bmxvYWRfY29udGV4dAk9IG52MjBfZ3JhcGhfdW5sb2FkX2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby5jaGFubmVscwkJPSAzMjsKKwkJZW5naW5lLT5maWZvLmluaXQJCT0gbnYxMF9maWZvX2luaXQ7CisJCWVuZ2luZS0+Zmlmby50YWtlZG93bgkJPSBub3V2ZWF1X3N0dWJfdGFrZWRvd247CisJCWVuZ2luZS0+Zmlmby5kaXNhYmxlCQk9IG52MDRfZmlmb19kaXNhYmxlOworCQllbmdpbmUtPmZpZm8uZW5hYmxlCQk9IG52MDRfZmlmb19lbmFibGU7CisJCWVuZ2luZS0+Zmlmby5yZWFzc2lnbgkJPSBudjA0X2ZpZm9fcmVhc3NpZ247CisJCWVuZ2luZS0+Zmlmby5jaGFubmVsX2lkCQk9IG52MTBfZmlmb19jaGFubmVsX2lkOworCQllbmdpbmUtPmZpZm8uY3JlYXRlX2NvbnRleHQJPSBudjEwX2ZpZm9fY3JlYXRlX2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby5kZXN0cm95X2NvbnRleHQJPSBudjEwX2ZpZm9fZGVzdHJveV9jb250ZXh0OworCQllbmdpbmUtPmZpZm8ubG9hZF9jb250ZXh0CT0gbnYxMF9maWZvX2xvYWRfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLnVubG9hZF9jb250ZXh0CT0gbnYxMF9maWZvX3VubG9hZF9jb250ZXh0OworCQlicmVhazsKKwljYXNlIDB4MzA6CisJCWVuZ2luZS0+aW5zdG1lbS5pbml0CQk9IG52MDRfaW5zdG1lbV9pbml0OworCQllbmdpbmUtPmluc3RtZW0udGFrZWRvd24JPSBudjA0X2luc3RtZW1fdGFrZWRvd247CisJCWVuZ2luZS0+aW5zdG1lbS5zdXNwZW5kCQk9IG52MDRfaW5zdG1lbV9zdXNwZW5kOworCQllbmdpbmUtPmluc3RtZW0ucmVzdW1lCQk9IG52MDRfaW5zdG1lbV9yZXN1bWU7CisJCWVuZ2luZS0+aW5zdG1lbS5wb3B1bGF0ZQk9IG52MDRfaW5zdG1lbV9wb3B1bGF0ZTsKKwkJZW5naW5lLT5pbnN0bWVtLmNsZWFyCQk9IG52MDRfaW5zdG1lbV9jbGVhcjsKKwkJZW5naW5lLT5pbnN0bWVtLmJpbmQJCT0gbnYwNF9pbnN0bWVtX2JpbmQ7CisJCWVuZ2luZS0+aW5zdG1lbS51bmJpbmQJCT0gbnYwNF9pbnN0bWVtX3VuYmluZDsKKwkJZW5naW5lLT5pbnN0bWVtLnByZXBhcmVfYWNjZXNzCT0gbnYwNF9pbnN0bWVtX3ByZXBhcmVfYWNjZXNzOworCQllbmdpbmUtPmluc3RtZW0uZmluaXNoX2FjY2Vzcwk9IG52MDRfaW5zdG1lbV9maW5pc2hfYWNjZXNzOworCQllbmdpbmUtPm1jLmluaXQJCQk9IG52MDRfbWNfaW5pdDsKKwkJZW5naW5lLT5tYy50YWtlZG93bgkJPSBudjA0X21jX3Rha2Vkb3duOworCQllbmdpbmUtPnRpbWVyLmluaXQJCT0gbnYwNF90aW1lcl9pbml0OworCQllbmdpbmUtPnRpbWVyLnJlYWQJCT0gbnYwNF90aW1lcl9yZWFkOworCQllbmdpbmUtPnRpbWVyLnRha2Vkb3duCQk9IG52MDRfdGltZXJfdGFrZWRvd247CisJCWVuZ2luZS0+ZmIuaW5pdAkJCT0gbnYxMF9mYl9pbml0OworCQllbmdpbmUtPmZiLnRha2Vkb3duCQk9IG52MTBfZmJfdGFrZWRvd247CisJCWVuZ2luZS0+Z3JhcGguZ3JjbGFzcwkJPSBudjMwX2dyYXBoX2dyY2xhc3M7CisJCWVuZ2luZS0+Z3JhcGguaW5pdAkJPSBudjMwX2dyYXBoX2luaXQ7CisJCWVuZ2luZS0+Z3JhcGgudGFrZWRvd24JCT0gbnYyMF9ncmFwaF90YWtlZG93bjsKKwkJZW5naW5lLT5ncmFwaC5maWZvX2FjY2Vzcwk9IG52MDRfZ3JhcGhfZmlmb19hY2Nlc3M7CisJCWVuZ2luZS0+Z3JhcGguY2hhbm5lbAkJPSBudjEwX2dyYXBoX2NoYW5uZWw7CisJCWVuZ2luZS0+Z3JhcGguY3JlYXRlX2NvbnRleHQJPSBudjIwX2dyYXBoX2NyZWF0ZV9jb250ZXh0OworCQllbmdpbmUtPmdyYXBoLmRlc3Ryb3lfY29udGV4dAk9IG52MjBfZ3JhcGhfZGVzdHJveV9jb250ZXh0OworCQllbmdpbmUtPmdyYXBoLmxvYWRfY29udGV4dAk9IG52MjBfZ3JhcGhfbG9hZF9jb250ZXh0OworCQllbmdpbmUtPmdyYXBoLnVubG9hZF9jb250ZXh0CT0gbnYyMF9ncmFwaF91bmxvYWRfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLmNoYW5uZWxzCQk9IDMyOworCQllbmdpbmUtPmZpZm8uaW5pdAkJPSBudjEwX2ZpZm9faW5pdDsKKwkJZW5naW5lLT5maWZvLnRha2Vkb3duCQk9IG5vdXZlYXVfc3R1Yl90YWtlZG93bjsKKwkJZW5naW5lLT5maWZvLmRpc2FibGUJCT0gbnYwNF9maWZvX2Rpc2FibGU7CisJCWVuZ2luZS0+Zmlmby5lbmFibGUJCT0gbnYwNF9maWZvX2VuYWJsZTsKKwkJZW5naW5lLT5maWZvLnJlYXNzaWduCQk9IG52MDRfZmlmb19yZWFzc2lnbjsKKwkJZW5naW5lLT5maWZvLmNoYW5uZWxfaWQJCT0gbnYxMF9maWZvX2NoYW5uZWxfaWQ7CisJCWVuZ2luZS0+Zmlmby5jcmVhdGVfY29udGV4dAk9IG52MTBfZmlmb19jcmVhdGVfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLmRlc3Ryb3lfY29udGV4dAk9IG52MTBfZmlmb19kZXN0cm95X2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby5sb2FkX2NvbnRleHQJPSBudjEwX2ZpZm9fbG9hZF9jb250ZXh0OworCQllbmdpbmUtPmZpZm8udW5sb2FkX2NvbnRleHQJPSBudjEwX2ZpZm9fdW5sb2FkX2NvbnRleHQ7CisJCWJyZWFrOworCWNhc2UgMHg0MDoKKwljYXNlIDB4NjA6CisJCWVuZ2luZS0+aW5zdG1lbS5pbml0CQk9IG52MDRfaW5zdG1lbV9pbml0OworCQllbmdpbmUtPmluc3RtZW0udGFrZWRvd24JPSBudjA0X2luc3RtZW1fdGFrZWRvd247CisJCWVuZ2luZS0+aW5zdG1lbS5zdXNwZW5kCQk9IG52MDRfaW5zdG1lbV9zdXNwZW5kOworCQllbmdpbmUtPmluc3RtZW0ucmVzdW1lCQk9IG52MDRfaW5zdG1lbV9yZXN1bWU7CisJCWVuZ2luZS0+aW5zdG1lbS5wb3B1bGF0ZQk9IG52MDRfaW5zdG1lbV9wb3B1bGF0ZTsKKwkJZW5naW5lLT5pbnN0bWVtLmNsZWFyCQk9IG52MDRfaW5zdG1lbV9jbGVhcjsKKwkJZW5naW5lLT5pbnN0bWVtLmJpbmQJCT0gbnYwNF9pbnN0bWVtX2JpbmQ7CisJCWVuZ2luZS0+aW5zdG1lbS51bmJpbmQJCT0gbnYwNF9pbnN0bWVtX3VuYmluZDsKKwkJZW5naW5lLT5pbnN0bWVtLnByZXBhcmVfYWNjZXNzCT0gbnYwNF9pbnN0bWVtX3ByZXBhcmVfYWNjZXNzOworCQllbmdpbmUtPmluc3RtZW0uZmluaXNoX2FjY2Vzcwk9IG52MDRfaW5zdG1lbV9maW5pc2hfYWNjZXNzOworCQllbmdpbmUtPm1jLmluaXQJCQk9IG52NDBfbWNfaW5pdDsKKwkJZW5naW5lLT5tYy50YWtlZG93bgkJPSBudjQwX21jX3Rha2Vkb3duOworCQllbmdpbmUtPnRpbWVyLmluaXQJCT0gbnYwNF90aW1lcl9pbml0OworCQllbmdpbmUtPnRpbWVyLnJlYWQJCT0gbnYwNF90aW1lcl9yZWFkOworCQllbmdpbmUtPnRpbWVyLnRha2Vkb3duCQk9IG52MDRfdGltZXJfdGFrZWRvd247CisJCWVuZ2luZS0+ZmIuaW5pdAkJCT0gbnY0MF9mYl9pbml0OworCQllbmdpbmUtPmZiLnRha2Vkb3duCQk9IG52NDBfZmJfdGFrZWRvd247CisJCWVuZ2luZS0+Z3JhcGguZ3JjbGFzcwkJPSBudjQwX2dyYXBoX2dyY2xhc3M7CisJCWVuZ2luZS0+Z3JhcGguaW5pdAkJPSBudjQwX2dyYXBoX2luaXQ7CisJCWVuZ2luZS0+Z3JhcGgudGFrZWRvd24JCT0gbnY0MF9ncmFwaF90YWtlZG93bjsKKwkJZW5naW5lLT5ncmFwaC5maWZvX2FjY2Vzcwk9IG52MDRfZ3JhcGhfZmlmb19hY2Nlc3M7CisJCWVuZ2luZS0+Z3JhcGguY2hhbm5lbAkJPSBudjQwX2dyYXBoX2NoYW5uZWw7CisJCWVuZ2luZS0+Z3JhcGguY3JlYXRlX2NvbnRleHQJPSBudjQwX2dyYXBoX2NyZWF0ZV9jb250ZXh0OworCQllbmdpbmUtPmdyYXBoLmRlc3Ryb3lfY29udGV4dAk9IG52NDBfZ3JhcGhfZGVzdHJveV9jb250ZXh0OworCQllbmdpbmUtPmdyYXBoLmxvYWRfY29udGV4dAk9IG52NDBfZ3JhcGhfbG9hZF9jb250ZXh0OworCQllbmdpbmUtPmdyYXBoLnVubG9hZF9jb250ZXh0CT0gbnY0MF9ncmFwaF91bmxvYWRfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLmNoYW5uZWxzCQk9IDMyOworCQllbmdpbmUtPmZpZm8uaW5pdAkJPSBudjQwX2ZpZm9faW5pdDsKKwkJZW5naW5lLT5maWZvLnRha2Vkb3duCQk9IG5vdXZlYXVfc3R1Yl90YWtlZG93bjsKKwkJZW5naW5lLT5maWZvLmRpc2FibGUJCT0gbnYwNF9maWZvX2Rpc2FibGU7CisJCWVuZ2luZS0+Zmlmby5lbmFibGUJCT0gbnYwNF9maWZvX2VuYWJsZTsKKwkJZW5naW5lLT5maWZvLnJlYXNzaWduCQk9IG52MDRfZmlmb19yZWFzc2lnbjsKKwkJZW5naW5lLT5maWZvLmNoYW5uZWxfaWQJCT0gbnYxMF9maWZvX2NoYW5uZWxfaWQ7CisJCWVuZ2luZS0+Zmlmby5jcmVhdGVfY29udGV4dAk9IG52NDBfZmlmb19jcmVhdGVfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLmRlc3Ryb3lfY29udGV4dAk9IG52NDBfZmlmb19kZXN0cm95X2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby5sb2FkX2NvbnRleHQJPSBudjQwX2ZpZm9fbG9hZF9jb250ZXh0OworCQllbmdpbmUtPmZpZm8udW5sb2FkX2NvbnRleHQJPSBudjQwX2ZpZm9fdW5sb2FkX2NvbnRleHQ7CisJCWJyZWFrOworCWNhc2UgMHg1MDoKKwljYXNlIDB4ODA6IC8qIGdvdHRhIGxvdmUgTlZJRElBJ3MgY29uc2lzdGVuY3kuLiAqLworCWNhc2UgMHg5MDoKKwljYXNlIDB4QTA6CisJCWVuZ2luZS0+aW5zdG1lbS5pbml0CQk9IG52NTBfaW5zdG1lbV9pbml0OworCQllbmdpbmUtPmluc3RtZW0udGFrZWRvd24JPSBudjUwX2luc3RtZW1fdGFrZWRvd247CisJCWVuZ2luZS0+aW5zdG1lbS5zdXNwZW5kCQk9IG52NTBfaW5zdG1lbV9zdXNwZW5kOworCQllbmdpbmUtPmluc3RtZW0ucmVzdW1lCQk9IG52NTBfaW5zdG1lbV9yZXN1bWU7CisJCWVuZ2luZS0+aW5zdG1lbS5wb3B1bGF0ZQk9IG52NTBfaW5zdG1lbV9wb3B1bGF0ZTsKKwkJZW5naW5lLT5pbnN0bWVtLmNsZWFyCQk9IG52NTBfaW5zdG1lbV9jbGVhcjsKKwkJZW5naW5lLT5pbnN0bWVtLmJpbmQJCT0gbnY1MF9pbnN0bWVtX2JpbmQ7CisJCWVuZ2luZS0+aW5zdG1lbS51bmJpbmQJCT0gbnY1MF9pbnN0bWVtX3VuYmluZDsKKwkJZW5naW5lLT5pbnN0bWVtLnByZXBhcmVfYWNjZXNzCT0gbnY1MF9pbnN0bWVtX3ByZXBhcmVfYWNjZXNzOworCQllbmdpbmUtPmluc3RtZW0uZmluaXNoX2FjY2Vzcwk9IG52NTBfaW5zdG1lbV9maW5pc2hfYWNjZXNzOworCQllbmdpbmUtPm1jLmluaXQJCQk9IG52NTBfbWNfaW5pdDsKKwkJZW5naW5lLT5tYy50YWtlZG93bgkJPSBudjUwX21jX3Rha2Vkb3duOworCQllbmdpbmUtPnRpbWVyLmluaXQJCT0gbnYwNF90aW1lcl9pbml0OworCQllbmdpbmUtPnRpbWVyLnJlYWQJCT0gbnYwNF90aW1lcl9yZWFkOworCQllbmdpbmUtPnRpbWVyLnRha2Vkb3duCQk9IG52MDRfdGltZXJfdGFrZWRvd247CisJCWVuZ2luZS0+ZmIuaW5pdAkJCT0gbm91dmVhdV9zdHViX2luaXQ7CisJCWVuZ2luZS0+ZmIudGFrZWRvd24JCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOworCQllbmdpbmUtPmdyYXBoLmdyY2xhc3MJCT0gbnY1MF9ncmFwaF9ncmNsYXNzOworCQllbmdpbmUtPmdyYXBoLmluaXQJCT0gbnY1MF9ncmFwaF9pbml0OworCQllbmdpbmUtPmdyYXBoLnRha2Vkb3duCQk9IG52NTBfZ3JhcGhfdGFrZWRvd247CisJCWVuZ2luZS0+Z3JhcGguZmlmb19hY2Nlc3MJPSBudjUwX2dyYXBoX2ZpZm9fYWNjZXNzOworCQllbmdpbmUtPmdyYXBoLmNoYW5uZWwJCT0gbnY1MF9ncmFwaF9jaGFubmVsOworCQllbmdpbmUtPmdyYXBoLmNyZWF0ZV9jb250ZXh0CT0gbnY1MF9ncmFwaF9jcmVhdGVfY29udGV4dDsKKwkJZW5naW5lLT5ncmFwaC5kZXN0cm95X2NvbnRleHQJPSBudjUwX2dyYXBoX2Rlc3Ryb3lfY29udGV4dDsKKwkJZW5naW5lLT5ncmFwaC5sb2FkX2NvbnRleHQJPSBudjUwX2dyYXBoX2xvYWRfY29udGV4dDsKKwkJZW5naW5lLT5ncmFwaC51bmxvYWRfY29udGV4dAk9IG52NTBfZ3JhcGhfdW5sb2FkX2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby5jaGFubmVscwkJPSAxMjg7CisJCWVuZ2luZS0+Zmlmby5pbml0CQk9IG52NTBfZmlmb19pbml0OworCQllbmdpbmUtPmZpZm8udGFrZWRvd24JCT0gbnY1MF9maWZvX3Rha2Vkb3duOworCQllbmdpbmUtPmZpZm8uZGlzYWJsZQkJPSBudjA0X2ZpZm9fZGlzYWJsZTsKKwkJZW5naW5lLT5maWZvLmVuYWJsZQkJPSBudjA0X2ZpZm9fZW5hYmxlOworCQllbmdpbmUtPmZpZm8ucmVhc3NpZ24JCT0gbnYwNF9maWZvX3JlYXNzaWduOworCQllbmdpbmUtPmZpZm8uY2hhbm5lbF9pZAkJPSBudjUwX2ZpZm9fY2hhbm5lbF9pZDsKKwkJZW5naW5lLT5maWZvLmNyZWF0ZV9jb250ZXh0CT0gbnY1MF9maWZvX2NyZWF0ZV9jb250ZXh0OworCQllbmdpbmUtPmZpZm8uZGVzdHJveV9jb250ZXh0CT0gbnY1MF9maWZvX2Rlc3Ryb3lfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLmxvYWRfY29udGV4dAk9IG52NTBfZmlmb19sb2FkX2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby51bmxvYWRfY29udGV4dAk9IG52NTBfZmlmb191bmxvYWRfY29udGV4dDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTlZfRVJST1IoZGV2LCAiTlYlMDJ4IHVuc3VwcG9ydGVkXG4iLCBkZXZfcHJpdi0+Y2hpcHNldCk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Citub3V2ZWF1X3ZnYV9zZXRfZGVjb2RlKHZvaWQgKnByaXYsIGJvb2wgc3RhdGUpCit7CisJaWYgKHN0YXRlKQorCQlyZXR1cm4gVkdBX1JTUkNfTEVHQUNZX0lPIHwgVkdBX1JTUkNfTEVHQUNZX01FTSB8CisJCSAgICAgICBWR0FfUlNSQ19OT1JNQUxfSU8gfCBWR0FfUlNSQ19OT1JNQUxfTUVNOworCWVsc2UKKwkJcmV0dXJuIFZHQV9SU1JDX05PUk1BTF9JTyB8IFZHQV9SU1JDX05PUk1BTF9NRU07Cit9CisKK2ludAorbm91dmVhdV9jYXJkX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2VuZ2luZSAqZW5naW5lOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqOworCWludCByZXQ7CisKKwlOVl9ERUJVRyhkZXYsICJwcmV2IHN0YXRlID0gJWRcbiIsIGRldl9wcml2LT5pbml0X3N0YXRlKTsKKworCWlmIChkZXZfcHJpdi0+aW5pdF9zdGF0ZSA9PSBOT1VWRUFVX0NBUkRfSU5JVF9ET05FKQorCQlyZXR1cm4gMDsKKworCXZnYV9jbGllbnRfcmVnaXN0ZXIoZGV2LT5wZGV2LCBkZXYsIE5VTEwsIG5vdXZlYXVfdmdhX3NldF9kZWNvZGUpOworCisJLyogSW5pdGlhbGlzZSBpbnRlcm5hbCBkcml2ZXIgQVBJIGhvb2tzICovCisJcmV0ID0gbm91dmVhdV9pbml0X2VuZ2luZV9wdHJzKGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwllbmdpbmUgPSAmZGV2X3ByaXYtPmVuZ2luZTsKKwlkZXZfcHJpdi0+aW5pdF9zdGF0ZSA9IE5PVVZFQVVfQ0FSRF9JTklUX0ZBSUxFRDsKKworCS8qIFBhcnNlIEJJT1MgdGFibGVzIC8gUnVuIGluaXQgdGFibGVzIGlmIGNhcmQgbm90IFBPU1RlZCAqLworCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKSB7CisJCXJldCA9IG5vdXZlYXVfYmlvc19pbml0KGRldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2Vhcmx5X2luaXQoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogSW5pdGlhbGlzZSBpbnN0YW5jZSBtZW1vcnksIG11c3QgaGFwcGVuIGJlZm9yZSBtZW1faW5pdCBzbyB3ZQorCSAqIGtub3cgZXhhY3RseSBob3cgbXVjaCBWUkFNIHdlJ3JlIGFibGUgdG8gdXNlIGZvciAibm9ybWFsIgorCSAqIHB1cnBvc2VzLgorCSAqLworCXJldCA9IGVuZ2luZS0+aW5zdG1lbS5pbml0KGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFNldHVwIHRoZSBtZW1vcnkgbWFuYWdlciAqLworCXJldCA9IG5vdXZlYXVfbWVtX2luaXQoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfaW5pdChkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBQTUMgKi8KKwlyZXQgPSBlbmdpbmUtPm1jLmluaXQoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogUFRJTUVSICovCisJcmV0ID0gZW5naW5lLT50aW1lci5pbml0KGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFBGQiAqLworCXJldCA9IGVuZ2luZS0+ZmIuaW5pdChkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBQR1JBUEggKi8KKwlyZXQgPSBlbmdpbmUtPmdyYXBoLmluaXQoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogUEZJRk8gKi8KKwlyZXQgPSBlbmdpbmUtPmZpZm8uaW5pdChkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiB0aGlzIGNhbGwgaXJxX3ByZWluc3RhbGwsIHJlZ2lzdGVyIGlycSBoYW5kbGVyIGFuZAorCSAqIGNhbGwgaXJxX3Bvc3RpbnN0YWxsCisJICovCisJcmV0ID0gZHJtX2lycV9pbnN0YWxsKGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGRybV92YmxhbmtfaW5pdChkZXYsIDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiB3aGF0IGFib3V0IFBWSURFTy9QQ1JUQy9QUkFNREFDIGV0Yz8gKi8KKworCXJldCA9IG5vdXZlYXVfY2hhbm5lbF9hbGxvYyhkZXYsICZkZXZfcHJpdi0+Y2hhbm5lbCwKKwkJCQkgICAgKHN0cnVjdCBkcm1fZmlsZSAqKS0yLAorCQkJCSAgICBOdkRtYUZCLCBOdkRtYVRUKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZ3B1b2JqID0gTlVMTDsKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9kbWFfbmV3KGRldl9wcml2LT5jaGFubmVsLCBOVl9DTEFTU19ETUFfSU5fTUVNT1JZLAorCQkJCSAgICAgMCwgbm91dmVhdV9tZW1fZmJfYW1vdW50KGRldiksCisJCQkJICAgICBOVl9ETUFfQUNDRVNTX1JXLCBOVl9ETUFfVEFSR0VUX1ZJRE1FTSwKKwkJCQkgICAgICZncHVvYmopOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9yZWZfYWRkKGRldiwgZGV2X3ByaXYtPmNoYW5uZWwsIE52RG1hVlJBTSwKKwkJCQkgICAgIGdwdW9iaiwgTlVMTCk7CisJaWYgKHJldCkgeworCQlub3V2ZWF1X2dwdW9ial9kZWwoZGV2LCAmZ3B1b2JqKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlncHVvYmogPSBOVUxMOworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2dhcnRfZG1hX25ldyhkZXZfcHJpdi0+Y2hhbm5lbCwgMCwKKwkJCQkJICBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfc2l6ZSwKKwkJCQkJICBOVl9ETUFfQUNDRVNTX1JXLCAmZ3B1b2JqLCBOVUxMKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfcmVmX2FkZChkZXYsIGRldl9wcml2LT5jaGFubmVsLCBOdkRtYUdBUlQsCisJCQkJICAgICBncHVvYmosIE5VTEwpOworCWlmIChyZXQpIHsKKwkJbm91dmVhdV9ncHVvYmpfZGVsKGRldiwgJmdwdW9iaik7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKKwkJCXJldCA9IG52NTBfZGlzcGxheV9jcmVhdGUoZGV2KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IG52MDRfZGlzcGxheV9jcmVhdGUoZGV2KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldCA9IG5vdXZlYXVfYmFja2xpZ2h0X2luaXQoZGV2KTsKKwlpZiAocmV0KQorCQlOVl9FUlJPUihkZXYsICJFcnJvciAlZCByZWdpc3RlcmluZyBiYWNrbGlnaHRcbiIsIHJldCk7CisKKwlkZXZfcHJpdi0+aW5pdF9zdGF0ZSA9IE5PVVZFQVVfQ0FSRF9JTklUX0RPTkU7CisKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKKwkJZHJtX2hlbHBlcl9pbml0aWFsX2NvbmZpZyhkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5vdXZlYXVfY2FyZF90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZW5naW5lICplbmdpbmUgPSAmZGV2X3ByaXYtPmVuZ2luZTsKKworCU5WX0RFQlVHKGRldiwgInByZXYgc3RhdGUgPSAlZFxuIiwgZGV2X3ByaXYtPmluaXRfc3RhdGUpOworCisJaWYgKGRldl9wcml2LT5pbml0X3N0YXRlICE9IE5PVVZFQVVfQ0FSRF9JTklUX0RPV04pIHsKKwkJbm91dmVhdV9iYWNrbGlnaHRfZXhpdChkZXYpOworCisJCWlmIChkZXZfcHJpdi0+Y2hhbm5lbCkgeworCQkJbm91dmVhdV9jaGFubmVsX2ZyZWUoZGV2X3ByaXYtPmNoYW5uZWwpOworCQkJZGV2X3ByaXYtPmNoYW5uZWwgPSBOVUxMOworCQl9CisKKwkJZW5naW5lLT5maWZvLnRha2Vkb3duKGRldik7CisJCWVuZ2luZS0+Z3JhcGgudGFrZWRvd24oZGV2KTsKKwkJZW5naW5lLT5mYi50YWtlZG93bihkZXYpOworCQllbmdpbmUtPnRpbWVyLnRha2Vkb3duKGRldik7CisJCWVuZ2luZS0+bWMudGFrZWRvd24oZGV2KTsKKworCQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCXR0bV9ib19jbGVhbl9tbSgmZGV2X3ByaXYtPnR0bS5iZGV2LCBUVE1fUExfVFQpOworCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJbm91dmVhdV9zZ2RtYV90YWtlZG93bihkZXYpOworCisJCW5vdXZlYXVfZ3B1b2JqX3Rha2Vkb3duKGRldik7CisJCW5vdXZlYXVfbWVtX2Nsb3NlKGRldik7CisJCWVuZ2luZS0+aW5zdG1lbS50YWtlZG93bihkZXYpOworCisJCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQorCQkJZHJtX2lycV91bmluc3RhbGwoZGV2KTsKKworCQlub3V2ZWF1X2dwdW9ial9sYXRlX3Rha2Vkb3duKGRldik7CisJCW5vdXZlYXVfYmlvc190YWtlZG93bihkZXYpOworCisJCXZnYV9jbGllbnRfcmVnaXN0ZXIoZGV2LT5wZGV2LCBOVUxMLCBOVUxMLCBOVUxMKTsKKworCQlkZXZfcHJpdi0+aW5pdF9zdGF0ZSA9IE5PVVZFQVVfQ0FSRF9JTklUX0RPV047CisJfQorfQorCisvKiBoZXJlIGEgY2xpZW50IGRpZXMsIHJlbGVhc2UgdGhlIHN0dWZmIHRoYXQgd2FzIGFsbG9jYXRlZCBmb3IgaXRzCisgKiBmaWxlX3ByaXYgKi8KK3ZvaWQgbm91dmVhdV9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlub3V2ZWF1X2NoYW5uZWxfY2xlYW51cChkZXYsIGZpbGVfcHJpdik7Cit9CisKKy8qIGZpcnN0IG1vZHVsZSBsb2FkLCBzZXR1cCB0aGUgbW1pby9mYiBtYXBwaW5nICovCisvKiBLTVM6IHdlIG5lZWQgbW1pbyBhdCBsb2FkIHRpbWUsIG5vdCB3aGVuIHRoZSBmaXJzdCBkcm0gY2xpZW50IG9wZW5zLiAqLworaW50IG5vdXZlYXVfZmlyc3RvcGVuKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qIGlmIHdlIGhhdmUgYW4gT0YgY2FyZCwgY29weSB2YmlvcyB0byBSQU1JTiAqLworc3RhdGljIHZvaWQgbm91dmVhdV9PRl9jb3B5X3ZiaW9zX3RvX3JhbWluKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisjaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKKwlpbnQgc2l6ZSwgaTsKKwljb25zdCB1aW50MzJfdCAqYmlvczsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKGRldi0+cGRldik7CisJaWYgKCFkbikgeworCQlOVl9JTkZPKGRldiwgIlVuYWJsZSB0byBnZXQgdGhlIE9GIG5vZGVcbiIpOworCQlyZXR1cm47CisJfQorCisJYmlvcyA9IG9mX2dldF9wcm9wZXJ0eShkbiwgIk5WREEsQk1QIiwgJnNpemUpOworCWlmIChiaW9zKSB7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IDQpCisJCQludl93aTMyKGRldiwgaSwgYmlvc1tpLzRdKTsKKwkJTlZfSU5GTyhkZXYsICJPRiBiaW9zIHN1Y2Nlc3NmdWxseSBjb3BpZWQgKCVkIGJ5dGVzKVxuIiwgc2l6ZSk7CisJfSBlbHNlIHsKKwkJTlZfSU5GTyhkZXYsICJVbmFibGUgdG8gZ2V0IHRoZSBPRiBiaW9zXG4iKTsKKwl9CisjZW5kaWYKK30KKworaW50IG5vdXZlYXVfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdjsKKwl1aW50MzJfdCByZWcwOworCXJlc291cmNlX3NpemVfdCBtbWlvX3N0YXJ0X29mZnM7CisKKwlkZXZfcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXZfcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghZGV2X3ByaXYpCisJCXJldHVybiAtRU5PTUVNOworCWRldi0+ZGV2X3ByaXZhdGUgPSBkZXZfcHJpdjsKKwlkZXZfcHJpdi0+ZGV2ID0gZGV2OworCisJZGV2X3ByaXYtPmZsYWdzID0gZmxhZ3MgJiBOT1VWRUFVX0ZMQUdTOworCWRldl9wcml2LT5pbml0X3N0YXRlID0gTk9VVkVBVV9DQVJEX0lOSVRfRE9XTjsKKworCU5WX0RFQlVHKGRldiwgInZlbmRvcjogMHglWCBkZXZpY2U6IDB4JVggY2xhc3M6IDB4JVhcbiIsCisJCSBkZXYtPnBjaV92ZW5kb3IsIGRldi0+cGNpX2RldmljZSwgZGV2LT5wZGV2LT5jbGFzcyk7CisKKwlkZXZfcHJpdi0+YWNwaV9kc20gPSBub3V2ZWF1X2RzbV9wcm9iZShkZXYpOworCisJaWYgKGRldl9wcml2LT5hY3BpX2RzbSkKKwkJbm91dmVhdV9oeWJyaWRfc2V0dXAoZGV2KTsKKworCWRldl9wcml2LT53cSA9IGNyZWF0ZV93b3JrcXVldWUoIm5vdXZlYXUiKTsKKwlpZiAoIWRldl9wcml2LT53cSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiByZXNvdXJjZSAwIGlzIG1taW8gcmVncyAqLworCS8qIHJlc291cmNlIDEgaXMgbGluZWFyIEZCICovCisJLyogcmVzb3VyY2UgMiBpcyBSQU1JTiAobW1pbyByZWdzICsgMHgxMDAwMDAwKSAqLworCS8qIHJlc291cmNlIDYgaXMgYmlvcyAqLworCisJLyogbWFwIHRoZSBtbWlvIHJlZ3MgKi8KKwltbWlvX3N0YXJ0X29mZnMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAwKTsKKwlkZXZfcHJpdi0+bW1pbyA9IGlvcmVtYXAobW1pb19zdGFydF9vZmZzLCAweDAwODAwMDAwKTsKKwlpZiAoIWRldl9wcml2LT5tbWlvKSB7CisJCU5WX0VSUk9SKGRldiwgIlVuYWJsZSB0byBpbml0aWFsaXplIHRoZSBtbWlvIG1hcHBpbmcuICIKKwkJCSAiUGxlYXNlIHJlcG9ydCB5b3VyIHNldHVwIHRvICIgRFJJVkVSX0VNQUlMICJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJTlZfREVCVUcoZGV2LCAicmVncyBtYXBwZWQgb2sgYXQgMHglbGx4XG4iLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKW1taW9fc3RhcnRfb2Zmcyk7CisKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkvKiBQdXQgdGhlIGNhcmQgaW4gQkUgbW9kZSBpZiBpdCdzIG5vdCAqLworCWlmIChudl9yZDMyKGRldiwgTlYwM19QTUNfQk9PVF8xKSkKKwkJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0JPT1RfMSwgMHgwMDAwMDAwMSk7CisKKwlEUk1fTUVNT1JZQkFSUklFUigpOworI2VuZGlmCisKKwkvKiBUaW1lIHRvIGRldGVybWluZSB0aGUgY2FyZCBhcmNoaXRlY3R1cmUgKi8KKwlyZWcwID0gbnZfcmQzMihkZXYsIE5WMDNfUE1DX0JPT1RfMCk7CisKKwkvKiBXZSdyZSBkZWFsaW5nIHdpdGggPj1OVjEwICovCisJaWYgKChyZWcwICYgMHgwZjAwMDAwMCkgPiAwKSB7CisJCS8qIEJpdCAyNy0yMCBjb250YWluIHRoZSBhcmNoaXRlY3R1cmUgaW4gaGV4ICovCisJCWRldl9wcml2LT5jaGlwc2V0ID0gKHJlZzAgJiAweGZmMDAwMDApID4+IDIwOworCS8qIE5WMDQgb3IgTlYwNSAqLworCX0gZWxzZSBpZiAoKHJlZzAgJiAweGZmMDBmZmYwKSA9PSAweDIwMDA0MDAwKSB7CisJCWRldl9wcml2LT5jaGlwc2V0ID0gMHgwNDsKKwl9IGVsc2UKKwkJZGV2X3ByaXYtPmNoaXBzZXQgPSAweGZmOworCisJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCAmIDB4ZjApIHsKKwljYXNlIDB4MDA6CisJY2FzZSAweDEwOgorCWNhc2UgMHgyMDoKKwljYXNlIDB4MzA6CisJCWRldl9wcml2LT5jYXJkX3R5cGUgPSBkZXZfcHJpdi0+Y2hpcHNldCAmIDB4ZjA7CisJCWJyZWFrOworCWNhc2UgMHg0MDoKKwljYXNlIDB4NjA6CisJCWRldl9wcml2LT5jYXJkX3R5cGUgPSBOVl80MDsKKwkJYnJlYWs7CisJY2FzZSAweDUwOgorCWNhc2UgMHg4MDoKKwljYXNlIDB4OTA6CisJY2FzZSAweGEwOgorCQlkZXZfcHJpdi0+Y2FyZF90eXBlID0gTlZfNTA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCU5WX0lORk8oZGV2LCAiVW5zdXBwb3J0ZWQgY2hpcHNldCAweCUwOHhcbiIsIHJlZzApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlOVl9JTkZPKGRldiwgIkRldGVjdGVkIGFuIE5WJTJ4IGdlbmVyYXRpb24gY2FyZCAoMHglMDh4KVxuIiwKKwkJZGV2X3ByaXYtPmNhcmRfdHlwZSwgcmVnMCk7CisKKwkvKiBtYXAgbGFyZ2VyIFJBTUlOIGFwZXJ0dXJlIG9uIE5WNDAgY2FyZHMgKi8KKwlkZXZfcHJpdi0+cmFtaW4gID0gTlVMTDsKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl80MCkgeworCQlpbnQgcmFtaW5fYmFyID0gMjsKKwkJaWYgKHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCByYW1pbl9iYXIpID09IDApCisJCQlyYW1pbl9iYXIgPSAzOworCisJCWRldl9wcml2LT5yYW1pbl9zaXplID0gcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIHJhbWluX2Jhcik7CisJCWRldl9wcml2LT5yYW1pbiA9IGlvcmVtYXAoCisJCQkJcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgcmFtaW5fYmFyKSwKKwkJCQlkZXZfcHJpdi0+cmFtaW5fc2l6ZSk7CisJCWlmICghZGV2X3ByaXYtPnJhbWluKSB7CisJCQlOVl9FUlJPUihkZXYsICJGYWlsZWQgdG8gaW5pdCBSQU1JTiBtYXBwaW5nLCAiCisJCQkJICAgICAgImxpbWl0ZWQgaW5zdGFuY2UgbWVtb3J5IGF2YWlsYWJsZVxuIik7CisJCX0KKwl9CisKKwkvKiBPbiBvbGRlciBjYXJkcyAob3IgaWYgdGhlIGFib3ZlIGZhaWxlZCksIGNyZWF0ZSBhIG1hcCBjb3ZlcmluZworCSAqIHRoZSBCQVIwIFBSQU1JTiBhcGVydHVyZSAqLworCWlmICghZGV2X3ByaXYtPnJhbWluKSB7CisJCWRldl9wcml2LT5yYW1pbl9zaXplID0gMSAqIDEwMjQgKiAxMDI0OworCQlkZXZfcHJpdi0+cmFtaW4gPSBpb3JlbWFwKG1taW9fc3RhcnRfb2ZmcyArIE5WX1JBTUlOLAorCQkJCQkJCWRldl9wcml2LT5yYW1pbl9zaXplKTsKKwkJaWYgKCFkZXZfcHJpdi0+cmFtaW4pIHsKKwkJCU5WX0VSUk9SKGRldiwgIkZhaWxlZCB0byBtYXAgQkFSMCBQUkFNSU4uXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJbm91dmVhdV9PRl9jb3B5X3ZiaW9zX3RvX3JhbWluKGRldik7CisKKwkvKiBTcGVjaWFsIGZsYWdzICovCisJaWYgKGRldi0+cGNpX2RldmljZSA9PSAweDAxYTApCisJCWRldl9wcml2LT5mbGFncyB8PSBOVl9ORk9SQ0U7CisJZWxzZSBpZiAoZGV2LT5wY2lfZGV2aWNlID09IDB4MDFmMCkKKwkJZGV2X3ByaXYtPmZsYWdzIHw9IE5WX05GT1JDRTI7CisKKwkvKiBGb3Iga2VybmVsIG1vZGVzZXR0aW5nLCBpbml0IGNhcmQgbm93IGFuZCBicmluZyB1cCBmYmNvbiAqLworCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKSB7CisJCWludCByZXQgPSBub3V2ZWF1X2NhcmRfaW5pdChkZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbm91dmVhdV9jbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwkvKiBJbiB0aGUgY2FzZSBvZiBhbiBlcnJvciBkZXZfcHJpdiBtYXkgbm90IGJlIGJlIGFsbG9jYXRlZCB5ZXQgKi8KKwlpZiAoZGV2X3ByaXYgJiYgZGV2X3ByaXYtPmNhcmRfdHlwZSkKKwkJbm91dmVhdV9jYXJkX3Rha2Vkb3duKGRldik7Cit9CisKKy8qIEtNUzogd2UgbmVlZCBtbWlvIGF0IGxvYWQgdGltZSwgbm90IHdoZW4gdGhlIGZpcnN0IGRybSBjbGllbnQgb3BlbnMuICovCit2b2lkIG5vdXZlYXVfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCisJCXJldHVybjsKKworCW5vdXZlYXVfY2xvc2UoZGV2KTsKK30KKworaW50IG5vdXZlYXVfdW5sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKSB7CisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKQorCQkJbnY1MF9kaXNwbGF5X2Rlc3Ryb3koZGV2KTsKKwkJZWxzZQorCQkJbnYwNF9kaXNwbGF5X2Rlc3Ryb3koZGV2KTsKKwkJbm91dmVhdV9jbG9zZShkZXYpOworCX0KKworCWlvdW5tYXAoZGV2X3ByaXYtPm1taW8pOworCWlvdW5tYXAoZGV2X3ByaXYtPnJhbWluKTsKKworCWtmcmVlKGRldl9wcml2KTsKKwlkZXYtPmRldl9wcml2YXRlID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworaW50Citub3V2ZWF1X2lvY3RsX2NhcmRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJcmV0dXJuIG5vdXZlYXVfY2FyZF9pbml0KGRldik7Cit9CisKK2ludCBub3V2ZWF1X2lvY3RsX2dldHBhcmFtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fbm91dmVhdV9nZXRwYXJhbSAqZ2V0cGFyYW0gPSBkYXRhOworCisJTk9VVkVBVV9DSEVDS19JTklUSUFMSVNFRF9XSVRIX1JFVFVSTjsKKworCXN3aXRjaCAoZ2V0cGFyYW0tPnBhcmFtKSB7CisJY2FzZSBOT1VWRUFVX0dFVFBBUkFNX0NISVBTRVRfSUQ6CisJCWdldHBhcmFtLT52YWx1ZSA9IGRldl9wcml2LT5jaGlwc2V0OworCQlicmVhazsKKwljYXNlIE5PVVZFQVVfR0VUUEFSQU1fUENJX1ZFTkRPUjoKKwkJZ2V0cGFyYW0tPnZhbHVlID0gZGV2LT5wY2lfdmVuZG9yOworCQlicmVhazsKKwljYXNlIE5PVVZFQVVfR0VUUEFSQU1fUENJX0RFVklDRToKKwkJZ2V0cGFyYW0tPnZhbHVlID0gZGV2LT5wY2lfZGV2aWNlOworCQlicmVhazsKKwljYXNlIE5PVVZFQVVfR0VUUEFSQU1fQlVTX1RZUEU6CisJCWlmIChkcm1fZGV2aWNlX2lzX2FncChkZXYpKQorCQkJZ2V0cGFyYW0tPnZhbHVlID0gTlZfQUdQOworCQllbHNlIGlmIChkcm1fZGV2aWNlX2lzX3BjaWUoZGV2KSkKKwkJCWdldHBhcmFtLT52YWx1ZSA9IE5WX1BDSUU7CisJCWVsc2UKKwkJCWdldHBhcmFtLT52YWx1ZSA9IE5WX1BDSTsKKwkJYnJlYWs7CisJY2FzZSBOT1VWRUFVX0dFVFBBUkFNX0ZCX1BIWVNJQ0FMOgorCQlnZXRwYXJhbS0+dmFsdWUgPSBkZXZfcHJpdi0+ZmJfcGh5czsKKwkJYnJlYWs7CisJY2FzZSBOT1VWRUFVX0dFVFBBUkFNX0FHUF9QSFlTSUNBTDoKKwkJZ2V0cGFyYW0tPnZhbHVlID0gZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX2Jhc2U7CisJCWJyZWFrOworCWNhc2UgTk9VVkVBVV9HRVRQQVJBTV9QQ0lfUEhZU0lDQUw6CisJCWlmIChkZXYtPnNnKSB7CisJCQlnZXRwYXJhbS0+dmFsdWUgPSAodW5zaWduZWQgbG9uZylkZXYtPnNnLT52aXJ0dWFsOworCQl9IGVsc2UgeworCQkJTlZfRVJST1IoZGV2LCAiUmVxdWVzdGVkIFBDSUdBUlQgYWRkcmVzcywgIgorCQkJCQkid2hpbGUgbm8gUENJR0FSVCB3YXMgY3JlYXRlZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIE5PVVZFQVVfR0VUUEFSQU1fRkJfU0laRToKKwkJZ2V0cGFyYW0tPnZhbHVlID0gZGV2X3ByaXYtPmZiX2F2YWlsYWJsZV9zaXplOworCQlicmVhazsKKwljYXNlIE5PVVZFQVVfR0VUUEFSQU1fQUdQX1NJWkU6CisJCWdldHBhcmFtLT52YWx1ZSA9IGRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9zaXplOworCQlicmVhazsKKwljYXNlIE5PVVZFQVVfR0VUUEFSQU1fVk1fVlJBTV9CQVNFOgorCQlnZXRwYXJhbS0+dmFsdWUgPSBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlOVl9FUlJPUihkZXYsICJ1bmtub3duIHBhcmFtZXRlciAlbGxkXG4iLCBnZXRwYXJhbS0+cGFyYW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50Citub3V2ZWF1X2lvY3RsX3NldHBhcmFtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfc2V0cGFyYW0gKnNldHBhcmFtID0gZGF0YTsKKworCU5PVVZFQVVfQ0hFQ0tfSU5JVElBTElTRURfV0lUSF9SRVRVUk47CisKKwlzd2l0Y2ggKHNldHBhcmFtLT5wYXJhbSkgeworCWRlZmF1bHQ6CisJCU5WX0VSUk9SKGRldiwgInVua25vd24gcGFyYW1ldGVyICVsbGRcbiIsIHNldHBhcmFtLT5wYXJhbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKiBXYWl0IHVudGlsICh2YWx1ZShyZWcpICYgbWFzaykgPT0gdmFsLCB1cCB1bnRpbCB0aW1lb3V0IGhhcyBoaXQgKi8KK2Jvb2wgbm91dmVhdV93YWl0X3VudGlsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQ2NF90IHRpbWVvdXQsCisJCQl1aW50MzJfdCByZWcsIHVpbnQzMl90IG1hc2ssIHVpbnQzMl90IHZhbCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3RpbWVyX2VuZ2luZSAqcHRpbWVyID0gJmRldl9wcml2LT5lbmdpbmUudGltZXI7CisJdWludDY0X3Qgc3RhcnQgPSBwdGltZXItPnJlYWQoZGV2KTsKKworCWRvIHsKKwkJaWYgKChudl9yZDMyKGRldiwgcmVnKSAmIG1hc2spID09IHZhbCkKKwkJCXJldHVybiB0cnVlOworCX0gd2hpbGUgKHB0aW1lci0+cmVhZChkZXYpIC0gc3RhcnQgPCB0aW1lb3V0KTsKKworCXJldHVybiBmYWxzZTsKK30KKworLyogV2FpdHMgZm9yIFBHUkFQSCB0byBnbyBjb21wbGV0ZWx5IGlkbGUgKi8KK2Jvb2wgbm91dmVhdV93YWl0X2Zvcl9pZGxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJaWYgKCFudl93YWl0KE5WMDRfUEdSQVBIX1NUQVRVUywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCkpIHsKKwkJTlZfRVJST1IoZGV2LCAiUEdSQVBIIGlkbGUgdGltZWQgb3V0IHdpdGggc3RhdHVzIDB4JTA4eFxuIiwKKwkJCSBudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfU1RBVFVTKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV90dG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdHRtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3ZWI4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdHRtLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVFguLCBVU0EsCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA5IFZNd2FyZSwgSW5jLiwgUGFsbyBBbHRvLCBDQS4sIFVTQSwKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKworI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgbm91dmVhdV90dG1fdm1fb3BzOworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCAqdHRtX3ZtX29wczsKKworc3RhdGljIGludAorbm91dmVhdV90dG1fZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9mYXVsdCAqdm1mKQoreworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8gPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKHVubGlrZWx5KGJvID09IE5VTEwpKQorCQlyZXR1cm4gVk1fRkFVTFRfTk9QQUdFOworCisJcmV0ID0gdHRtX3ZtX29wcy0+ZmF1bHQodm1hLCB2bWYpOworCXJldHVybiByZXQ7Cit9CisKK2ludAorbm91dmVhdV90dG1fbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0KKwkJZmlsZV9wcml2LT5taW5vci0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgcmV0OworCisJaWYgKHVubGlrZWx5KHZtYS0+dm1fcGdvZmYgPCBEUk1fRklMRV9QQUdFX09GRlNFVCkpCisJCXJldHVybiBkcm1fbW1hcChmaWxwLCB2bWEpOworCisJcmV0ID0gdHRtX2JvX21tYXAoZmlscCwgdm1hLCAmZGV2X3ByaXYtPnR0bS5iZGV2KTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHVubGlrZWx5KHR0bV92bV9vcHMgPT0gTlVMTCkpIHsKKwkJdHRtX3ZtX29wcyA9IHZtYS0+dm1fb3BzOworCQlub3V2ZWF1X3R0bV92bV9vcHMgPSAqdHRtX3ZtX29wczsKKwkJbm91dmVhdV90dG1fdm1fb3BzLmZhdWx0ID0gJm5vdXZlYXVfdHRtX2ZhdWx0OworCX0KKworCXZtYS0+dm1fb3BzID0gJm5vdXZlYXVfdHRtX3ZtX29wczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbm91dmVhdV90dG1fbWVtX2dsb2JhbF9pbml0KHN0cnVjdCB0dG1fZ2xvYmFsX3JlZmVyZW5jZSAqcmVmKQoreworCXJldHVybiB0dG1fbWVtX2dsb2JhbF9pbml0KHJlZi0+b2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfdHRtX21lbV9nbG9iYWxfcmVsZWFzZShzdHJ1Y3QgdHRtX2dsb2JhbF9yZWZlcmVuY2UgKnJlZikKK3sKKwl0dG1fbWVtX2dsb2JhbF9yZWxlYXNlKHJlZi0+b2JqZWN0KTsKK30KKworaW50Citub3V2ZWF1X3R0bV9nbG9iYWxfaW5pdChzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJc3RydWN0IHR0bV9nbG9iYWxfcmVmZXJlbmNlICpnbG9iYWxfcmVmOworCWludCByZXQ7CisKKwlnbG9iYWxfcmVmID0gJmRldl9wcml2LT50dG0ubWVtX2dsb2JhbF9yZWY7CisJZ2xvYmFsX3JlZi0+Z2xvYmFsX3R5cGUgPSBUVE1fR0xPQkFMX1RUTV9NRU07CisJZ2xvYmFsX3JlZi0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgdHRtX21lbV9nbG9iYWwpOworCWdsb2JhbF9yZWYtPmluaXQgPSAmbm91dmVhdV90dG1fbWVtX2dsb2JhbF9pbml0OworCWdsb2JhbF9yZWYtPnJlbGVhc2UgPSAmbm91dmVhdV90dG1fbWVtX2dsb2JhbF9yZWxlYXNlOworCisJcmV0ID0gdHRtX2dsb2JhbF9pdGVtX3JlZihnbG9iYWxfcmVmKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHNldHRpbmcgdXAgVFRNIG1lbW9yeSBhY2NvdW50aW5nXG4iKTsKKwkJZGV2X3ByaXYtPnR0bS5tZW1fZ2xvYmFsX3JlZi5yZWxlYXNlID0gTlVMTDsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkZXZfcHJpdi0+dHRtLmJvX2dsb2JhbF9yZWYubWVtX2dsb2IgPSBnbG9iYWxfcmVmLT5vYmplY3Q7CisJZ2xvYmFsX3JlZiA9ICZkZXZfcHJpdi0+dHRtLmJvX2dsb2JhbF9yZWYucmVmOworCWdsb2JhbF9yZWYtPmdsb2JhbF90eXBlID0gVFRNX0dMT0JBTF9UVE1fQk87CisJZ2xvYmFsX3JlZi0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgdHRtX2JvX2dsb2JhbCk7CisJZ2xvYmFsX3JlZi0+aW5pdCA9ICZ0dG1fYm9fZ2xvYmFsX2luaXQ7CisJZ2xvYmFsX3JlZi0+cmVsZWFzZSA9ICZ0dG1fYm9fZ2xvYmFsX3JlbGVhc2U7CisKKwlyZXQgPSB0dG1fZ2xvYmFsX2l0ZW1fcmVmKGdsb2JhbF9yZWYpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgc2V0dGluZyB1cCBUVE0gQk8gc3Vic3lzdGVtXG4iKTsKKwkJdHRtX2dsb2JhbF9pdGVtX3VucmVmKCZkZXZfcHJpdi0+dHRtLm1lbV9nbG9iYWxfcmVmKTsKKwkJZGV2X3ByaXYtPnR0bS5tZW1fZ2xvYmFsX3JlZi5yZWxlYXNlID0gTlVMTDsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbm91dmVhdV90dG1fZ2xvYmFsX3JlbGVhc2Uoc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2KQoreworCWlmIChkZXZfcHJpdi0+dHRtLm1lbV9nbG9iYWxfcmVmLnJlbGVhc2UgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJdHRtX2dsb2JhbF9pdGVtX3VucmVmKCZkZXZfcHJpdi0+dHRtLmJvX2dsb2JhbF9yZWYucmVmKTsKKwl0dG1fZ2xvYmFsX2l0ZW1fdW5yZWYoJmRldl9wcml2LT50dG0ubWVtX2dsb2JhbF9yZWYpOworCWRldl9wcml2LT50dG0ubWVtX2dsb2JhbF9yZWYucmVsZWFzZSA9IE5VTEw7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9jcnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxMzYzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfY3J0Yy5jCkBAIC0wLDAgKzEsMTAwMiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkzLTIwMDMgTlZJRElBLCBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IDIwMDYgRGF2ZSBBaXJsaWUKKyAqIENvcHlyaWdodCAyMDA3IE1hYXJ0ZW4gTWFhdGh1aXMKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKworI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9lbmNvZGVyLmgiCisjaW5jbHVkZSAibm91dmVhdV9jb25uZWN0b3IuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2NydGMuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2ZiLmgiCisjaW5jbHVkZSAibm91dmVhdV9ody5oIgorI2luY2x1ZGUgIm52cmVnLmgiCisKK3N0YXRpYyBpbnQKK252MDRfY3J0Y19tb2RlX3NldF9iYXNlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHgsIGludCB5LAorCQkJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiKTsKKworc3RhdGljIHZvaWQKK2NydGNfd3JfY2lvX3N0YXRlKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IG52MDRfY3J0Y19yZWcgKmNydGNzdGF0ZSwgaW50IGluZGV4KQoreworCU5WV3JpdGVWZ2FDcnRjKGNydGMtPmRldiwgbm91dmVhdV9jcnRjKGNydGMpLT5pbmRleCwgaW5kZXgsCisJCSAgICAgICBjcnRjc3RhdGUtPkNSVENbaW5kZXhdKTsKK30KKworc3RhdGljIHZvaWQgbnZfY3J0Y19zZXRfZGlnaXRhbF92aWJyYW5jZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCBsZXZlbCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNydGMtPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52MDRfY3J0Y19yZWcgKnJlZ3AgPSAmZGV2X3ByaXYtPm1vZGVfcmVnLmNydGNfcmVnW252X2NydGMtPmluZGV4XTsKKworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9DU0JdID0gbnZfY3J0Yy0+c2F0dXJhdGlvbiA9IGxldmVsOworCWlmIChudl9jcnRjLT5zYXR1cmF0aW9uICYmIG52X2dmNF9kaXNwX2FyY2goY3J0Yy0+ZGV2KSkgeworCQlyZWdwLT5DUlRDW05WX0NJT19DUkVfQ1NCXSA9IDB4ODA7CisJCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV81Ql0gPSBudl9jcnRjLT5zYXR1cmF0aW9uIDw8IDI7CisJCWNydGNfd3JfY2lvX3N0YXRlKGNydGMsIHJlZ3AsIE5WX0NJT19DUkVfNUIpOworCX0KKwljcnRjX3dyX2Npb19zdGF0ZShjcnRjLCByZWdwLCBOVl9DSU9fQ1JFX0NTQik7Cit9CisKK3N0YXRpYyB2b2lkIG52X2NydGNfc2V0X2ltYWdlX3NoYXJwZW5pbmcoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgbGV2ZWwpCit7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjcnRjLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudjA0X2NydGNfcmVnICpyZWdwID0gJmRldl9wcml2LT5tb2RlX3JlZy5jcnRjX3JlZ1tudl9jcnRjLT5pbmRleF07CisKKwludl9jcnRjLT5zaGFycG5lc3MgPSBsZXZlbDsKKwlpZiAobGV2ZWwgPCAwKQkvKiBibHVyIGlzIGluIGh3IHJhbmdlIDB4M2YgLT4gMHgyMCAqLworCQlsZXZlbCArPSAweDQwOworCXJlZ3AtPnJhbWRhY182MzQgPSBsZXZlbDsKKwlOVldyaXRlUkFNREFDKGNydGMtPmRldiwgbnZfY3J0Yy0+aW5kZXgsIE5WX1BSQU1EQUNfNjM0LCByZWdwLT5yYW1kYWNfNjM0KTsKK30KKworI2RlZmluZSBQTExTRUxfVlBMTDFfTUFTSwkJCQlcCisJKE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVF9TT1VSQ0VfUFJPR19WUExMCVwKKwkgfCBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfVkNMS19SQVRJT19EQjIpCisjZGVmaW5lIFBMTFNFTF9WUExMMl9NQVNLCQkJCVwKKwkoTlZfUFJBTURBQ19QTExfQ09FRkZfU0VMRUNUX1BMTF9TT1VSQ0VfVlBMTDIJCVwKKwkgfCBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfVkNMSzJfUkFUSU9fREIyKQorI2RlZmluZSBQTExTRUxfVFZfTUFTSwkJCQkJXAorCShOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfVFZfVlNDTEsxCQlcCisJIHwgTlZfUFJBTURBQ19QTExfQ09FRkZfU0VMRUNUX1RWX1BDTEsxCQlcCisJIHwgTlZfUFJBTURBQ19QTExfQ09FRkZfU0VMRUNUX1RWX1ZTQ0xLMglcCisJIHwgTlZfUFJBTURBQ19QTExfQ09FRkZfU0VMRUNUX1RWX1BDTEsyKQorCisvKiBOVjR4IDB4NDAuLiBwbGwgbm90ZXM6CisgKiBncHUgcGxsOiAweDQwMDAgKyAweDQwMDQKKyAqID9ncHU/IHBsbDogMHg0MDA4ICsgMHg0MDBjCisgKiB2cGxsMTogMHg0MDEwICsgMHg0MDE0CisgKiB2cGxsMjogMHg0MDE4ICsgMHg0MDFjCisgKiBtcGxsOiAweDQwMjAgKyAweDQwMjQKKyAqIG1wbGw6IDB4NDAzOCArIDB4NDAzYworICoKKyAqIHRoZSBmaXJzdCByZWdpc3RlciBvZiBlYWNoIHBhaXIgaGFzIHNvbWUgdW5rbm93biBkZXRhaWxzOgorICogYml0cyAwLTc6IHJlZGlyZWN0ZWQgdmFsdWVzIGZyb20gZWxzZXdoZXJlPyAoc2ltaWxhciB0byBQTExfU0VUVVBfQ09OVFJPTD8pCisgKiBiaXRzIDIwLTIzOiAobXBsbCkgc29tZXRoaW5nIHRvIGRvIHdpdGggcG9zdCBkaXZpZGVyPworICogYml0cyAyOC0zMTogcmVsYXRlZCB0byBzaW5nbGUgc3RhZ2UgbW9kZT8gKGJpdCA4LzEyKQorICovCisKK3N0YXRpYyB2b2lkIG52X2NydGNfY2FsY19zdGF0ZV9leHQoc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqIG1vZGUsIGludCBkb3RfY2xvY2spCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJc3RydWN0IG52MDRfbW9kZV9zdGF0ZSAqc3RhdGUgPSAmZGV2X3ByaXYtPm1vZGVfcmVnOworCXN0cnVjdCBudjA0X2NydGNfcmVnICpyZWdwID0gJnN0YXRlLT5jcnRjX3JlZ1tudl9jcnRjLT5pbmRleF07CisJc3RydWN0IG5vdXZlYXVfcGxsX3ZhbHMgKnB2ID0gJnJlZ3AtPnBsbHZhbHM7CisJc3RydWN0IHBsbF9saW1zIHBsbF9saW07CisKKwlpZiAoZ2V0X3BsbF9saW1pdHMoZGV2LCBudl9jcnRjLT5pbmRleCA/IFZQTEwyIDogVlBMTDEsICZwbGxfbGltKSkKKwkJcmV0dXJuOworCisJLyogTk0yID09IDAgaXMgdXNlZCB0byBkZXRlcm1pbmUgc2luZ2xlIHN0YWdlIG1vZGUgb24gdHdvIHN0YWdlIHBsbHMgKi8KKwlwdi0+Tk0yID0gMDsKKworCS8qIGZvciBuZXdlciBudjR4IHRoZSBibG9iIHVzZXMgb25seSB0aGUgZmlyc3Qgc3RhZ2Ugb2YgdGhlIHZwbGwgYmVsb3cgYQorCSAqIGNlcnRhaW4gY2xvY2suICBmb3IgYSBjZXJ0YWluIG52NGIgdGhpcyBpcyAxNTBNSHouICBzaW5jZSB0aGUgbWF4CisJICogb3V0cHV0IGZyZXF1ZW5jeSBvZiB0aGUgZmlyc3Qgc3RhZ2UgZm9yIHRoaXMgY2FyZCBpcyAzMDBNSHosIGl0IGlzCisJICogYXNzdW1lZCB0aGUgdGhyZXNob2xkIGlzIGdpdmVuIGJ5IHZjbzEgbWF4ZnJlcS8yCisJICovCisJLyogZm9yIGVhcmx5IG52NHgsIHNwZWNpZmljYWxseSBudjQwIGFuZCAqc29tZSogbnY0MyAoZGV2aWRzIDAgYW5kIDYsCisJICogbm90IDgsIG90aGVycyB1bmtub3duKSwgdGhlIGJsb2IgYWx3YXlzIHVzZXMgYm90aCBwbGxzLiAgbm8gcHJvYmxlbQorCSAqIGhhcyB5ZXQgYmVlbiBvYnNlcnZlZCBpbiBhbGxvd2luZyB0aGUgdXNlIGEgc2luZ2xlIHN0YWdlIHBsbCBvbiBhbGwKKwkgKiBudjQzIGhvd2V2ZXIuICB0aGUgYmVoYXZpb3VyIG9mIHNpbmdsZSBzdGFnZSB1c2UgaXMgdW50ZXN0ZWQgb24gbnY0MAorCSAqLworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA+IDB4NDAgJiYgZG90X2Nsb2NrIDw9IChwbGxfbGltLnZjbzEubWF4ZnJlcSAvIDIpKQorCQltZW1zZXQoJnBsbF9saW0udmNvMiwgMCwgc2l6ZW9mKHBsbF9saW0udmNvMikpOworCisJaWYgKCFub3V2ZWF1X2NhbGNfcGxsX21ucChkZXYsICZwbGxfbGltLCBkb3RfY2xvY2ssIHB2KSkKKwkJcmV0dXJuOworCisJc3RhdGUtPnBsbHNlbCAmPSBQTExTRUxfVlBMTDFfTUFTSyB8IFBMTFNFTF9WUExMMl9NQVNLIHwgUExMU0VMX1RWX01BU0s7CisKKwkvKiBUaGUgYmxvYiB1c2VzIHRoaXMgYWx3YXlzLCBzbyBsZXQncyBkbyB0aGUgc2FtZSAqLworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzQwKQorCQlzdGF0ZS0+cGxsc2VsIHw9IE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVF9VU0VfVlBMTDJfVFJVRTsKKwkvKiBhZ2FpbiBudjQwIGFuZCBzb21lIG52NDMgYWN0IG1vcmUgbGlrZSBudjN4IGFzIGRlc2NyaWJlZCBhYm92ZSAqLworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4NDEpCisJCXN0YXRlLT5wbGxzZWwgfD0gTlZfUFJBTURBQ19QTExfQ09FRkZfU0VMRUNUX1NPVVJDRV9QUk9HX01QTEwgfAorCQkJCSBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfU09VUkNFX1BST0dfTlZQTEw7CisJc3RhdGUtPnBsbHNlbCB8PSBudl9jcnRjLT5pbmRleCA/IFBMTFNFTF9WUExMMl9NQVNLIDogUExMU0VMX1ZQTEwxX01BU0s7CisKKwlpZiAocHYtPk5NMikKKwkJTlZfVFJBQ0UoZGV2LCAidnBsbDogbjEgJWQgbjIgJWQgbTEgJWQgbTIgJWQgbG9nMnAgJWRcbiIsCisJCQkgcHYtPk4xLCBwdi0+TjIsIHB2LT5NMSwgcHYtPk0yLCBwdi0+bG9nMlApOworCWVsc2UKKwkJTlZfVFJBQ0UoZGV2LCAidnBsbDogbiAlZCBtICVkIGxvZzJwICVkXG4iLAorCQkJIHB2LT5OMSwgcHYtPk0xLCBwdi0+bG9nMlApOworCisJbnZfY3J0Yy0+Y3Vyc29yLnNldF9vZmZzZXQobnZfY3J0YywgbnZfY3J0Yy0+Y3Vyc29yLm9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkCitudl9jcnRjX2RwbXMoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJdW5zaWduZWQgY2hhciBzZXExID0gMCwgY3J0YzE3ID0gMDsKKwl1bnNpZ25lZCBjaGFyIGNydGMxQTsKKworCU5WX1RSQUNFKGRldiwgIlNldHRpbmcgZHBtcyBtb2RlICVkIG9uIENSVEMgJWRcbiIsIG1vZGUsCisJCQkJCQkJbnZfY3J0Yy0+aW5kZXgpOworCisJaWYgKG52X2NydGMtPmxhc3RfZHBtcyA9PSBtb2RlKSAvKiBEb24ndCBkbyB1bm5lY2VzYXJ5IG1vZGUgY2hhbmdlcy4gKi8KKwkJcmV0dXJuOworCisJbnZfY3J0Yy0+bGFzdF9kcG1zID0gbW9kZTsKKworCWlmIChudl90d29faGVhZHMoZGV2KSkKKwkJTlZTZXRPd25lcihkZXYsIG52X2NydGMtPmluZGV4KTsKKworCS8qIG52NHJlZiBpbmRpY2F0ZXMgdGhlc2UgdHdvIFJQQzEgYml0cyBpbmhpYml0IGgvdiBzeW5jICovCisJY3J0YzFBID0gTlZSZWFkVmdhQ3J0YyhkZXYsIG52X2NydGMtPmluZGV4LAorCQkJCQlOVl9DSU9fQ1JFX1JQQzFfSU5ERVgpICYgfjB4QzA7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlk6CisJCS8qIFNjcmVlbjogT2ZmOyBIU3luYzogT2ZmLCBWU3luYzogT24gLS0gTm90IFN1cHBvcnRlZCAqLworCQlzZXExID0gMHgyMDsKKwkJY3J0YzE3ID0gMHg4MDsKKwkJY3J0YzFBIHw9IDB4ODA7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfRFBNU19TVVNQRU5EOgorCQkvKiBTY3JlZW46IE9mZjsgSFN5bmM6IE9uLCBWU3luYzogT2ZmIC0tIE5vdCBTdXBwb3J0ZWQgKi8KKwkJc2VxMSA9IDB4MjA7CisJCWNydGMxNyA9IDB4ODA7CisJCWNydGMxQSB8PSAweDQwOworCQlicmVhazsKKwljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgorCQkvKiBTY3JlZW46IE9mZjsgSFN5bmM6IE9mZiwgVlN5bmM6IE9mZiAqLworCQlzZXExID0gMHgyMDsKKwkJY3J0YzE3ID0gMHgwMDsKKwkJY3J0YzFBIHw9IDB4QzA7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfRFBNU19PTjoKKwlkZWZhdWx0OgorCQkvKiBTY3JlZW46IE9uOyBIU3luYzogT24sIFZTeW5jOiBPbiAqLworCQlzZXExID0gMHgwMDsKKwkJY3J0YzE3ID0gMHg4MDsKKwkJYnJlYWs7CisJfQorCisJTlZWZ2FTZXFSZXNldChkZXYsIG52X2NydGMtPmluZGV4LCB0cnVlKTsKKwkvKiBFYWNoIGhlYWQgaGFzIGl0J3Mgb3duIHNlcXVlbmNlciwgc28gd2UgY2FuIHR1cm4gaXQgb2ZmIHdoZW4gd2Ugd2FudCAqLworCXNlcTEgfD0gKE5WUmVhZFZnYVNlcShkZXYsIG52X2NydGMtPmluZGV4LCBOVl9WSU9fU1JfQ0xPQ0tfSU5ERVgpICYgfjB4MjApOworCU5WV3JpdGVWZ2FTZXEoZGV2LCBudl9jcnRjLT5pbmRleCwgTlZfVklPX1NSX0NMT0NLX0lOREVYLCBzZXExKTsKKwljcnRjMTcgfD0gKE5WUmVhZFZnYUNydGMoZGV2LCBudl9jcnRjLT5pbmRleCwgTlZfQ0lPX0NSX01PREVfSU5ERVgpICYgfjB4ODApOworCW1kZWxheSgxMCk7CisJTlZXcml0ZVZnYUNydGMoZGV2LCBudl9jcnRjLT5pbmRleCwgTlZfQ0lPX0NSX01PREVfSU5ERVgsIGNydGMxNyk7CisJTlZWZ2FTZXFSZXNldChkZXYsIG52X2NydGMtPmluZGV4LCBmYWxzZSk7CisKKwlOVldyaXRlVmdhQ3J0YyhkZXYsIG52X2NydGMtPmluZGV4LCBOVl9DSU9fQ1JFX1JQQzFfSU5ERVgsIGNydGMxQSk7Cit9CisKK3N0YXRpYyBib29sCitudl9jcnRjX21vZGVfZml4dXAoc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkCitudl9jcnRjX21vZGVfc2V0X3ZnYShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCXN0cnVjdCBudjA0X2NydGNfcmVnICpyZWdwID0gJmRldl9wcml2LT5tb2RlX3JlZy5jcnRjX3JlZ1tudl9jcnRjLT5pbmRleF07CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIgPSBjcnRjLT5mYjsKKworCS8qIENhbGN1bGF0ZSBvdXIgdGltaW5ncyAqLworCWludCBob3JpekRpc3BsYXkJPSAobW9kZS0+Y3J0Y19oZGlzcGxheSA+PiAzKSAJLSAxOworCWludCBob3JpelN0YXJ0CQk9IChtb2RlLT5jcnRjX2hzeW5jX3N0YXJ0ID4+IDMpIAktIDE7CisJaW50IGhvcml6RW5kCQk9IChtb2RlLT5jcnRjX2hzeW5jX2VuZCA+PiAzKSAJLSAxOworCWludCBob3JpelRvdGFsCQk9IChtb2RlLT5jcnRjX2h0b3RhbCA+PiAzKQkJLSA1OworCWludCBob3JpekJsYW5rU3RhcnQJPSAobW9kZS0+Y3J0Y19oZGlzcGxheSA+PiAzKQkJLSAxOworCWludCBob3JpekJsYW5rRW5kCT0gKG1vZGUtPmNydGNfaHRvdGFsID4+IDMpCQktIDE7CisJaW50IHZlcnREaXNwbGF5CQk9IG1vZGUtPmNydGNfdmRpc3BsYXkJCQktIDE7CisJaW50IHZlcnRTdGFydAkJPSBtb2RlLT5jcnRjX3ZzeW5jX3N0YXJ0IAkJLSAxOworCWludCB2ZXJ0RW5kCQk9IG1vZGUtPmNydGNfdnN5bmNfZW5kCQkJLSAxOworCWludCB2ZXJ0VG90YWwJCT0gbW9kZS0+Y3J0Y192dG90YWwgCQkJLSAyOworCWludCB2ZXJ0QmxhbmtTdGFydAk9IG1vZGUtPmNydGNfdmRpc3BsYXkgCQkJLSAxOworCWludCB2ZXJ0QmxhbmtFbmQJPSBtb2RlLT5jcnRjX3Z0b3RhbAkJCS0gMTsKKworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwlib29sIGZwX291dHB1dCA9IGZhbHNlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKworCQlpZiAoZW5jb2Rlci0+Y3J0YyA9PSBjcnRjICYmCisJCSAgICAobnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IE9VVFBVVF9MVkRTIHx8CisJCSAgICAgbnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IE9VVFBVVF9UTURTKSkKKwkJCWZwX291dHB1dCA9IHRydWU7CisJfQorCisJaWYgKGZwX291dHB1dCkgeworCQl2ZXJ0U3RhcnQgPSB2ZXJ0VG90YWwgLSAzOworCQl2ZXJ0RW5kID0gdmVydFRvdGFsIC0gMjsKKwkJdmVydEJsYW5rU3RhcnQgPSB2ZXJ0U3RhcnQ7CisJCWhvcml6U3RhcnQgPSBob3JpelRvdGFsIC0gNTsKKwkJaG9yaXpFbmQgPSBob3JpelRvdGFsIC0gMjsKKwkJaG9yaXpCbGFua0VuZCA9IGhvcml6VG90YWwgKyA0OworI2lmIDAKKwkJaWYgKGRldi0+b3ZlcmxheUFkYXB0b3IgJiYgZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8xMCkKKwkJCS8qIFRoaXMgcmVwb3J0ZWRseSB3b3JrcyBhcm91bmQgc29tZSB2aWRlbyBvdmVybGF5IGJhbmR3aWR0aCBwcm9ibGVtcyAqLworCQkJaG9yaXpUb3RhbCArPSAyOworI2VuZGlmCisJfQorCisJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpCisJCXZlcnRUb3RhbCB8PSAxOworCisjaWYgMAorCUVycm9yRigiaG9yaXpEaXNwbGF5OiAweCVYIFxuIiwgaG9yaXpEaXNwbGF5KTsKKwlFcnJvckYoImhvcml6U3RhcnQ6IDB4JVggXG4iLCBob3JpelN0YXJ0KTsKKwlFcnJvckYoImhvcml6RW5kOiAweCVYIFxuIiwgaG9yaXpFbmQpOworCUVycm9yRigiaG9yaXpUb3RhbDogMHglWCBcbiIsIGhvcml6VG90YWwpOworCUVycm9yRigiaG9yaXpCbGFua1N0YXJ0OiAweCVYIFxuIiwgaG9yaXpCbGFua1N0YXJ0KTsKKwlFcnJvckYoImhvcml6QmxhbmtFbmQ6IDB4JVggXG4iLCBob3JpekJsYW5rRW5kKTsKKwlFcnJvckYoInZlcnREaXNwbGF5OiAweCVYIFxuIiwgdmVydERpc3BsYXkpOworCUVycm9yRigidmVydFN0YXJ0OiAweCVYIFxuIiwgdmVydFN0YXJ0KTsKKwlFcnJvckYoInZlcnRFbmQ6IDB4JVggXG4iLCB2ZXJ0RW5kKTsKKwlFcnJvckYoInZlcnRUb3RhbDogMHglWCBcbiIsIHZlcnRUb3RhbCk7CisJRXJyb3JGKCJ2ZXJ0QmxhbmtTdGFydDogMHglWCBcbiIsIHZlcnRCbGFua1N0YXJ0KTsKKwlFcnJvckYoInZlcnRCbGFua0VuZDogMHglWCBcbiIsIHZlcnRCbGFua0VuZCk7CisjZW5kaWYKKworCS8qCisJKiBjb21wdXRlIGNvcnJlY3QgSHN5bmMgJiBWc3luYyBwb2xhcml0eQorCSovCisJaWYgKChtb2RlLT5mbGFncyAmIChEUk1fTU9ERV9GTEFHX1BIU1lOQyB8IERSTV9NT0RFX0ZMQUdfTkhTWU5DKSkKKwkJJiYgKG1vZGUtPmZsYWdzICYgKERSTV9NT0RFX0ZMQUdfUFZTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMpKSkgeworCisJCXJlZ3AtPk1pc2NPdXRSZWcgPSAweDIzOworCQlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX05IU1lOQykKKwkJCXJlZ3AtPk1pc2NPdXRSZWcgfD0gMHg0MDsKKwkJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19OVlNZTkMpCisJCQlyZWdwLT5NaXNjT3V0UmVnIHw9IDB4ODA7CisJfSBlbHNlIHsKKwkJaW50IHZkaXNwbGF5ID0gbW9kZS0+dmRpc3BsYXk7CisJCWlmIChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfREJMU0NBTikKKwkJCXZkaXNwbGF5ICo9IDI7CisJCWlmIChtb2RlLT52c2NhbiA+IDEpCisJCQl2ZGlzcGxheSAqPSBtb2RlLT52c2NhbjsKKwkJaWYgKHZkaXNwbGF5IDwgNDAwKQorCQkJcmVncC0+TWlzY091dFJlZyA9IDB4QTM7CS8qICtoc3luYyAtdnN5bmMgKi8KKwkJZWxzZSBpZiAodmRpc3BsYXkgPCA0ODApCisJCQlyZWdwLT5NaXNjT3V0UmVnID0gMHg2MzsJLyogLWhzeW5jICt2c3luYyAqLworCQllbHNlIGlmICh2ZGlzcGxheSA8IDc2OCkKKwkJCXJlZ3AtPk1pc2NPdXRSZWcgPSAweEUzOwkvKiAtaHN5bmMgLXZzeW5jICovCisJCWVsc2UKKwkJCXJlZ3AtPk1pc2NPdXRSZWcgPSAweDIzOwkvKiAraHN5bmMgK3ZzeW5jICovCisJfQorCisJcmVncC0+TWlzY091dFJlZyB8PSAobW9kZS0+Y2xvY2tfaW5kZXggJiAweDAzKSA8PCAyOworCisJLyoKKwkgKiBUaW1lIFNlcXVlbmNlcgorCSAqLworCXJlZ3AtPlNlcXVlbmNlcltOVl9WSU9fU1JfUkVTRVRfSU5ERVhdID0gMHgwMDsKKwkvKiAweDIwIGRpc2FibGVzIHRoZSBzZXF1ZW5jZXIgKi8KKwlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0NMS0RJVjIpCisJCXJlZ3AtPlNlcXVlbmNlcltOVl9WSU9fU1JfQ0xPQ0tfSU5ERVhdID0gMHgyOTsKKwllbHNlCisJCXJlZ3AtPlNlcXVlbmNlcltOVl9WSU9fU1JfQ0xPQ0tfSU5ERVhdID0gMHgyMTsKKwlyZWdwLT5TZXF1ZW5jZXJbTlZfVklPX1NSX1BMQU5FX01BU0tfSU5ERVhdID0gMHgwRjsKKwlyZWdwLT5TZXF1ZW5jZXJbTlZfVklPX1NSX0NIQVJfTUFQX0lOREVYXSA9IDB4MDA7CisJcmVncC0+U2VxdWVuY2VyW05WX1ZJT19TUl9NRU1fTU9ERV9JTkRFWF0gPSAweDBFOworCisJLyoKKwkgKiBDUlRDCisJICovCisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JfSERUX0lOREVYXSA9IGhvcml6VG90YWw7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JfSERFX0lOREVYXSA9IGhvcml6RGlzcGxheTsKKwlyZWdwLT5DUlRDW05WX0NJT19DUl9IQlNfSU5ERVhdID0gaG9yaXpCbGFua1N0YXJ0OworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSX0hCRV9JTkRFWF0gPSAoMSA8PCA3KSB8CisJCQkJCSAgWExBVEUoaG9yaXpCbGFua0VuZCwgMCwgTlZfQ0lPX0NSX0hCRV80XzApOworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSX0hSU19JTkRFWF0gPSBob3JpelN0YXJ0OworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSX0hSRV9JTkRFWF0gPSBYTEFURShob3JpekJsYW5rRW5kLCA1LCBOVl9DSU9fQ1JfSFJFX0hCRV81KSB8CisJCQkJCSAgWExBVEUoaG9yaXpFbmQsIDAsIE5WX0NJT19DUl9IUkVfNF8wKTsKKwlyZWdwLT5DUlRDW05WX0NJT19DUl9WRFRfSU5ERVhdID0gdmVydFRvdGFsOworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSX09WTF9JTkRFWF0gPSBYTEFURSh2ZXJ0U3RhcnQsIDksIE5WX0NJT19DUl9PVkxfVlJTXzkpIHwKKwkJCQkJICBYTEFURSh2ZXJ0RGlzcGxheSwgOSwgTlZfQ0lPX0NSX09WTF9WREVfOSkgfAorCQkJCQkgIFhMQVRFKHZlcnRUb3RhbCwgOSwgTlZfQ0lPX0NSX09WTF9WRFRfOSkgfAorCQkJCQkgICgxIDw8IDQpIHwKKwkJCQkJICBYTEFURSh2ZXJ0QmxhbmtTdGFydCwgOCwgTlZfQ0lPX0NSX09WTF9WQlNfOCkgfAorCQkJCQkgIFhMQVRFKHZlcnRTdGFydCwgOCwgTlZfQ0lPX0NSX09WTF9WUlNfOCkgfAorCQkJCQkgIFhMQVRFKHZlcnREaXNwbGF5LCA4LCBOVl9DSU9fQ1JfT1ZMX1ZERV84KSB8CisJCQkJCSAgWExBVEUodmVydFRvdGFsLCA4LCBOVl9DSU9fQ1JfT1ZMX1ZEVF84KTsKKwlyZWdwLT5DUlRDW05WX0NJT19DUl9SU0FMX0lOREVYXSA9IDB4MDA7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JfQ0VMTF9IVF9JTkRFWF0gPSAoKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19EQkxTQ0FOKSA/IE1BU0soTlZfQ0lPX0NSX0NFTExfSFRfU0NBTkRCTCkgOiAwKSB8CisJCQkJCSAgICAgIDEgPDwgNiB8CisJCQkJCSAgICAgIFhMQVRFKHZlcnRCbGFua1N0YXJ0LCA5LCBOVl9DSU9fQ1JfQ0VMTF9IVF9WQlNfOSk7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JfQ1VSU19TVF9JTkRFWF0gPSAweDAwOworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSX0NVUlNfRU5EX0lOREVYXSA9IDB4MDA7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JfU0FfSElfSU5ERVhdID0gMHgwMDsKKwlyZWdwLT5DUlRDW05WX0NJT19DUl9TQV9MT19JTkRFWF0gPSAweDAwOworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSX1RDT0ZGX0hJX0lOREVYXSA9IDB4MDA7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JfVENPRkZfTE9fSU5ERVhdID0gMHgwMDsKKwlyZWdwLT5DUlRDW05WX0NJT19DUl9WUlNfSU5ERVhdID0gdmVydFN0YXJ0OworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSX1ZSRV9JTkRFWF0gPSAxIDw8IDUgfCBYTEFURSh2ZXJ0RW5kLCAwLCBOVl9DSU9fQ1JfVlJFXzNfMCk7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JfVkRFX0lOREVYXSA9IHZlcnREaXNwbGF5OworCS8qIGZyYW1lYnVmZmVyIGNhbiBiZSBsYXJnZXIgdGhhbiBjcnRjIHNjYW5vdXQgYXJlYS4gKi8KKwlyZWdwLT5DUlRDW05WX0NJT19DUl9PRkZTRVRfSU5ERVhdID0gZmItPnBpdGNoIC8gODsKKwlyZWdwLT5DUlRDW05WX0NJT19DUl9VTElORV9JTkRFWF0gPSAweDAwOworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSX1ZCU19JTkRFWF0gPSB2ZXJ0QmxhbmtTdGFydDsKKwlyZWdwLT5DUlRDW05WX0NJT19DUl9WQkVfSU5ERVhdID0gdmVydEJsYW5rRW5kOworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSX01PREVfSU5ERVhdID0gMHg0MzsKKwlyZWdwLT5DUlRDW05WX0NJT19DUl9MQ09NUF9JTkRFWF0gPSAweGZmOworCisJLyoKKwkgKiBTb21lIGV4dGVuZGVkIENSVEMgcmVnaXN0ZXJzICh0aGV5IGFyZSBub3Qgc2F2ZWQgd2l0aCB0aGUgcmVzdCBvZiB0aGUgdmdhIHJlZ3MpLgorCSAqLworCisJLyogZnJhbWVidWZmZXIgY2FuIGJlIGxhcmdlciB0aGFuIGNydGMgc2Nhbm91dCBhcmVhLiAqLworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9SUEMwX0lOREVYXSA9IFhMQVRFKGZiLT5waXRjaCAvIDgsIDgsIE5WX0NJT19DUkVfUlBDMF9PRkZTRVRfMTBfOCk7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX1JQQzFfSU5ERVhdID0gbW9kZS0+Y3J0Y19oZGlzcGxheSA8IDEyODAgPworCQkJCQkgICAgTUFTSyhOVl9DSU9fQ1JFX1JQQzFfTEFSR0UpIDogMHgwMDsKKwlyZWdwLT5DUlRDW05WX0NJT19DUkVfTFNSX0lOREVYXSA9IFhMQVRFKGhvcml6QmxhbmtFbmQsIDYsIE5WX0NJT19DUkVfTFNSX0hCRV82KSB8CisJCQkJCSAgIFhMQVRFKHZlcnRCbGFua1N0YXJ0LCAxMCwgTlZfQ0lPX0NSRV9MU1JfVkJTXzEwKSB8CisJCQkJCSAgIFhMQVRFKHZlcnRTdGFydCwgMTAsIE5WX0NJT19DUkVfTFNSX1ZSU18xMCkgfAorCQkJCQkgICBYTEFURSh2ZXJ0RGlzcGxheSwgMTAsIE5WX0NJT19DUkVfTFNSX1ZERV8xMCkgfAorCQkJCQkgICBYTEFURSh2ZXJ0VG90YWwsIDEwLCBOVl9DSU9fQ1JFX0xTUl9WRFRfMTApOworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9IRUJfX0lOREVYXSA9IFhMQVRFKGhvcml6U3RhcnQsIDgsIE5WX0NJT19DUkVfSEVCX0hSU184KSB8CisJCQkJCSAgICBYTEFURShob3JpekJsYW5rU3RhcnQsIDgsIE5WX0NJT19DUkVfSEVCX0hCU184KSB8CisJCQkJCSAgICBYTEFURShob3JpekRpc3BsYXksIDgsIE5WX0NJT19DUkVfSEVCX0hERV84KSB8CisJCQkJCSAgICBYTEFURShob3JpelRvdGFsLCA4LCBOVl9DSU9fQ1JFX0hFQl9IRFRfOCk7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX0VCUl9JTkRFWF0gPSBYTEFURSh2ZXJ0QmxhbmtTdGFydCwgMTEsIE5WX0NJT19DUkVfRUJSX1ZCU18xMSkgfAorCQkJCQkgICBYTEFURSh2ZXJ0U3RhcnQsIDExLCBOVl9DSU9fQ1JFX0VCUl9WUlNfMTEpIHwKKwkJCQkJICAgWExBVEUodmVydERpc3BsYXksIDExLCBOVl9DSU9fQ1JFX0VCUl9WREVfMTEpIHwKKwkJCQkJICAgWExBVEUodmVydFRvdGFsLCAxMSwgTlZfQ0lPX0NSRV9FQlJfVkRUXzExKTsKKworCWlmIChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKSB7CisJCWhvcml6VG90YWwgPSAoaG9yaXpUb3RhbCA+PiAxKSAmIH4xOworCQlyZWdwLT5DUlRDW05WX0NJT19DUkVfSUxBQ0VfX0lOREVYXSA9IGhvcml6VG90YWw7CisJCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9IRUJfX0lOREVYXSB8PSBYTEFURShob3JpelRvdGFsLCA4LCBOVl9DSU9fQ1JFX0hFQl9JTENfOCk7CisJfSBlbHNlCisJCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9JTEFDRV9fSU5ERVhdID0gMHhmZjsgIC8qIGludGVybGFjZSBvZmYgKi8KKworCS8qCisJKiBHcmFwaGljcyBEaXNwbGF5IENvbnRyb2xsZXIKKwkqLworCXJlZ3AtPkdyYXBoaWNzW05WX1ZJT19HWF9TUl9JTkRFWF0gPSAweDAwOworCXJlZ3AtPkdyYXBoaWNzW05WX1ZJT19HWF9TUkVOX0lOREVYXSA9IDB4MDA7CisJcmVncC0+R3JhcGhpY3NbTlZfVklPX0dYX0NDT01QX0lOREVYXSA9IDB4MDA7CisJcmVncC0+R3JhcGhpY3NbTlZfVklPX0dYX1JPUF9JTkRFWF0gPSAweDAwOworCXJlZ3AtPkdyYXBoaWNzW05WX1ZJT19HWF9SRUFEX01BUF9JTkRFWF0gPSAweDAwOworCXJlZ3AtPkdyYXBoaWNzW05WX1ZJT19HWF9NT0RFX0lOREVYXSA9IDB4NDA7IC8qIDI1NiBjb2xvciBtb2RlICovCisJcmVncC0+R3JhcGhpY3NbTlZfVklPX0dYX01JU0NfSU5ERVhdID0gMHgwNTsgLyogbWFwIDY0ayBtZW0gKyBncmFwaGljIG1vZGUgKi8KKwlyZWdwLT5HcmFwaGljc1tOVl9WSU9fR1hfRE9OVF9DQVJFX0lOREVYXSA9IDB4MEY7CisJcmVncC0+R3JhcGhpY3NbTlZfVklPX0dYX0JJVF9NQVNLX0lOREVYXSA9IDB4RkY7CisKKwlyZWdwLT5BdHRyaWJ1dGVbMF0gID0gMHgwMDsgLyogc3RhbmRhcmQgY29sb3JtYXAgdHJhbnNsYXRpb24gKi8KKwlyZWdwLT5BdHRyaWJ1dGVbMV0gID0gMHgwMTsKKwlyZWdwLT5BdHRyaWJ1dGVbMl0gID0gMHgwMjsKKwlyZWdwLT5BdHRyaWJ1dGVbM10gID0gMHgwMzsKKwlyZWdwLT5BdHRyaWJ1dGVbNF0gID0gMHgwNDsKKwlyZWdwLT5BdHRyaWJ1dGVbNV0gID0gMHgwNTsKKwlyZWdwLT5BdHRyaWJ1dGVbNl0gID0gMHgwNjsKKwlyZWdwLT5BdHRyaWJ1dGVbN10gID0gMHgwNzsKKwlyZWdwLT5BdHRyaWJ1dGVbOF0gID0gMHgwODsKKwlyZWdwLT5BdHRyaWJ1dGVbOV0gID0gMHgwOTsKKwlyZWdwLT5BdHRyaWJ1dGVbMTBdID0gMHgwQTsKKwlyZWdwLT5BdHRyaWJ1dGVbMTFdID0gMHgwQjsKKwlyZWdwLT5BdHRyaWJ1dGVbMTJdID0gMHgwQzsKKwlyZWdwLT5BdHRyaWJ1dGVbMTNdID0gMHgwRDsKKwlyZWdwLT5BdHRyaWJ1dGVbMTRdID0gMHgwRTsKKwlyZWdwLT5BdHRyaWJ1dGVbMTVdID0gMHgwRjsKKwlyZWdwLT5BdHRyaWJ1dGVbTlZfQ0lPX0FSX01PREVfSU5ERVhdID0gMHgwMTsgLyogRW5hYmxlIGdyYXBoaWMgbW9kZSAqLworCS8qIE5vbi12Z2EgKi8KKwlyZWdwLT5BdHRyaWJ1dGVbTlZfQ0lPX0FSX09TQ0FOX0lOREVYXSA9IDB4MDA7CisJcmVncC0+QXR0cmlidXRlW05WX0NJT19BUl9QTEFORV9JTkRFWF0gPSAweDBGOyAvKiBlbmFibGUgYWxsIGNvbG9yIHBsYW5lcyAqLworCXJlZ3AtPkF0dHJpYnV0ZVtOVl9DSU9fQVJfSFBQX0lOREVYXSA9IDB4MDA7CisJcmVncC0+QXR0cmlidXRlW05WX0NJT19BUl9DU0VMX0lOREVYXSA9IDB4MDA7Cit9CisKKy8qKgorICogU2V0cyB1cCByZWdpc3RlcnMgZm9yIHRoZSBnaXZlbiBtb2RlL2FkanVzdGVkX21vZGUgcGFpci4KKyAqCisgKiBUaGUgY2xvY2tzLCBDUlRDcyBhbmQgb3V0cHV0cyBhdHRhY2hlZCB0byB0aGlzIENSVEMgbXVzdCBiZSBvZmYuCisgKgorICogVGhpcyBzaG91bGRuJ3QgZW5hYmxlIGFueSBjbG9ja3MsIENSVENzLCBvciBvdXRwdXRzLCBidXQgdGhleSBzaG91bGQKKyAqIGJlIGVhc2lseSB0dXJuZWQgb24vb2ZmIGFmdGVyIHRoaXMuCisgKi8KK3N0YXRpYyB2b2lkCitudl9jcnRjX21vZGVfc2V0X3JlZ3Moc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqIG1vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJc3RydWN0IG52MDRfY3J0Y19yZWcgKnJlZ3AgPSAmZGV2X3ByaXYtPm1vZGVfcmVnLmNydGNfcmVnW252X2NydGMtPmluZGV4XTsKKwlzdHJ1Y3QgbnYwNF9jcnRjX3JlZyAqc2F2ZXAgPSAmZGV2X3ByaXYtPnNhdmVkX3JlZy5jcnRjX3JlZ1tudl9jcnRjLT5pbmRleF07CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCWJvb2wgbHZkc19vdXRwdXQgPSBmYWxzZSwgdG1kc19vdXRwdXQgPSBmYWxzZSwgdHZfb3V0cHV0ID0gZmFsc2UsCisJCW9mZl9jaGlwX2RpZ2l0YWwgPSBmYWxzZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJCWJvb2wgZGlnaXRhbCA9IGZhbHNlOworCisJCWlmIChlbmNvZGVyLT5jcnRjICE9IGNydGMpCisJCQljb250aW51ZTsKKworCQlpZiAobnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IE9VVFBVVF9MVkRTKQorCQkJZGlnaXRhbCA9IGx2ZHNfb3V0cHV0ID0gdHJ1ZTsKKwkJaWYgKG52X2VuY29kZXItPmRjYi0+dHlwZSA9PSBPVVRQVVRfVFYpCisJCQl0dl9vdXRwdXQgPSB0cnVlOworCQlpZiAobnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IE9VVFBVVF9UTURTKQorCQkJZGlnaXRhbCA9IHRtZHNfb3V0cHV0ID0gdHJ1ZTsKKwkJaWYgKG52X2VuY29kZXItPmRjYi0+bG9jYXRpb24gIT0gRENCX0xPQ19PTl9DSElQICYmIGRpZ2l0YWwpCisJCQlvZmZfY2hpcF9kaWdpdGFsID0gdHJ1ZTsKKwl9CisKKwkvKiBSZWdpc3RlcnMgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIChzKXZnYSBtb2RlICovCisKKwkvKiBXaGF0IGlzIHRoZSBtZWFuaW5nIG9mIHRoaXMgcmVnaXN0ZXI/ICovCisJLyogQSBmZXcgcG9wdWxhciB2YWx1ZXMgYXJlIDB4MTgsIDB4MWMsIDB4MzgsIDB4M2MgKi8KKwlyZWdwLT5DUlRDW05WX0NJT19DUkVfRU5IX0lOREVYXSA9IHNhdmVwLT5DUlRDW05WX0NJT19DUkVfRU5IX0lOREVYXSAmIH4oMTw8NSk7CisKKwlyZWdwLT5jcnRjX2VuZ19jdHJsID0gMDsKKwkvKiBFeGNlcHQgZm9yIHJhcmUgY29uZGl0aW9ucyBJMkMgaXMgZW5hYmxlZCBvbiB0aGUgcHJpbWFyeSBjcnRjICovCisJaWYgKG52X2NydGMtPmluZGV4ID09IDApCisJCXJlZ3AtPmNydGNfZW5nX2N0cmwgfD0gTlZfQ1JUQ19GU0VMX0kyQzsKKyNpZiAwCisJLyogU2V0IG92ZXJsYXkgdG8gZGVzaXJlZCBjcnRjLiAqLworCWlmIChkZXYtPm92ZXJsYXlBZGFwdG9yKSB7CisJCU5WUG9ydFByaXZQdHIgcFByaXYgPSBHRVRfT1ZFUkxBWV9QUklWQVRFKGRldik7CisJCWlmIChwUHJpdi0+b3ZlcmxheUNSVEMgPT0gbnZfY3J0Yy0+aW5kZXgpCisJCQlyZWdwLT5jcnRjX2VuZ19jdHJsIHw9IE5WX0NSVENfRlNFTF9PVkVSTEFZOworCX0KKyNlbmRpZgorCisJLyogQUREUkVTU19TUEFDRV9QTlZNIGlzIHRoZSBzYW1lIGFzIHNldHRpbmcgSENVUl9BU0kgKi8KKwlyZWdwLT5jdXJzb3JfY2ZnID0gTlZfUENSVENfQ1VSU09SX0NPTkZJR19DVVJfTElORVNfNjQgfAorCQkJICAgICBOVl9QQ1JUQ19DVVJTT1JfQ09ORklHX0NVUl9QSVhFTFNfNjQgfAorCQkJICAgICBOVl9QQ1JUQ19DVVJTT1JfQ09ORklHX0FERFJFU1NfU1BBQ0VfUE5WTTsKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHgxMSkKKwkJcmVncC0+Y3Vyc29yX2NmZyB8PSBOVl9QQ1JUQ19DVVJTT1JfQ09ORklHX0NVUl9CUFBfMzI7CisJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19EQkxTQ0FOKQorCQlyZWdwLT5jdXJzb3JfY2ZnIHw9IE5WX1BDUlRDX0NVUlNPUl9DT05GSUdfRE9VQkxFX1NDQU5fRU5BQkxFOworCisJLyogVW5ibG9jayBzb21lIHRpbWluZ3MgKi8KKwlyZWdwLT5DUlRDW05WX0NJT19DUkVfNTNdID0gMDsKKwlyZWdwLT5DUlRDW05WX0NJT19DUkVfNTRdID0gMDsKKworCS8qIDB4MDAgaXMgZGlzYWJsZWQsIDB4MTEgaXMgbHZkcywgMHgyMiBjcnQgYW5kIDB4ODggdG1kcyAqLworCWlmIChsdmRzX291dHB1dCkKKwkJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX1NDUkFUQ0gzX19JTkRFWF0gPSAweDExOworCWVsc2UgaWYgKHRtZHNfb3V0cHV0KQorCQlyZWdwLT5DUlRDW05WX0NJT19DUkVfU0NSQVRDSDNfX0lOREVYXSA9IDB4ODg7CisJZWxzZQorCQlyZWdwLT5DUlRDW05WX0NJT19DUkVfU0NSQVRDSDNfX0lOREVYXSA9IDB4MjI7CisKKwkvKiBUaGVzZSB2YWx1ZXMgc2VlbSB0byB2YXJ5ICovCisJLyogVGhpcyByZWdpc3RlciBzZWVtcyB0byBiZSB1c2VkIGJ5IHRoZSBiaW9zIHRvIG1ha2UgY2VydGFpbiBkZWNpc2lvbnMgb24gc29tZSBHNzAgY2FyZHM/ICovCisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX1NDUkFUQ0g0X19JTkRFWF0gPSBzYXZlcC0+Q1JUQ1tOVl9DSU9fQ1JFX1NDUkFUQ0g0X19JTkRFWF07CisKKwludl9jcnRjX3NldF9kaWdpdGFsX3ZpYnJhbmNlKGNydGMsIG52X2NydGMtPnNhdHVyYXRpb24pOworCisJLyogcHJvYmFibHkgYSBzY3JhdGNoIHJlZywgYnV0IGtlcHQgZm9yIGNhcmdvLWN1bHQgcHVycG9zZXM6CisJICogYml0MDogY3J0YzA/LCBoZWFkIEEKKwkgKiBiaXQ2OiBsdmRzLCBoZWFkIEEKKwkgKiBiaXQ3OiAob25seSBpbiBYKSwgaGVhZCBBCisJICovCisJaWYgKG52X2NydGMtPmluZGV4ID09IDApCisJCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV80Ql0gPSBzYXZlcC0+Q1JUQ1tOVl9DSU9fQ1JFXzRCXSB8IDB4ODA7CisKKwkvKiBUaGUgYmxvYiBzZWVtcyB0byB0YWtlIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gY3J0YyAwLCBhZGQgNCB0byB0aGF0CisJICogYW5kIHJldXNlIHRoZSBvbGQgdmFsdWUgZm9yIGNydGMgMSAqLworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9UVk9VVF9MQVRFTkNZXSA9IGRldl9wcml2LT5zYXZlZF9yZWcuY3J0Y19yZWdbMF0uQ1JUQ1tOVl9DSU9fQ1JFX1RWT1VUX0xBVEVOQ1ldOworCWlmICghbnZfY3J0Yy0+aW5kZXgpCisJCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9UVk9VVF9MQVRFTkNZXSArPSA0OworCisJLyogdGhlIGJsb2Igc29tZXRpbWVzIHNldHMgfD0gMHgxMCAod2hpY2ggaXMgdGhlIHNhbWUgYXMgc2V0dGluZyB8PQorCSAqIDEgPDwgMzAgb24gMHg2MC44MzApLCBmb3Igbm8gYXBwYXJlbnQgcmVhc29uICovCisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFXzU5XSA9IG9mZl9jaGlwX2RpZ2l0YWw7CisKKwlyZWdwLT5jcnRjXzgzMCA9IG1vZGUtPmNydGNfdmRpc3BsYXkgLSAzOworCXJlZ3AtPmNydGNfODM0ID0gbW9kZS0+Y3J0Y192ZGlzcGxheSAtIDE7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl80MCkKKwkJLyogVGhpcyBpcyB3aGF0IHRoZSBibG9iIGRvZXMgKi8KKwkJcmVncC0+Y3J0Y184NTAgPSBOVlJlYWRDUlRDKGRldiwgMCwgTlZfUENSVENfODUwKTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzMwKQorCQlyZWdwLT5ncGlvX2V4dCA9IE5WUmVhZENSVEMoZGV2LCAwLCBOVl9QQ1JUQ19HUElPX0VYVCk7CisKKwlyZWdwLT5jcnRjX2NmZyA9IE5WX1BDUlRDX0NPTkZJR19TVEFSVF9BRERSRVNTX0hTWU5DOworCisJLyogU29tZSBtaXNjIHJlZ3MgKi8KKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl80MCkgeworCQlyZWdwLT5DUlRDW05WX0NJT19DUkVfODVdID0gMHhGRjsKKwkJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFXzg2XSA9IDB4MTsKKwl9CisKKwlyZWdwLT5DUlRDW05WX0NJT19DUkVfUElYRUxfSU5ERVhdID0gKGNydGMtPmZiLT5kZXB0aCArIDEpIC8gODsKKwkvKiBFbmFibGUgc2xhdmVkIG1vZGUgKGNhbGxlZCBNT0RFX1RWIGluIG52NHJlZi5oKSAqLworCWlmIChsdmRzX291dHB1dCB8fCB0bWRzX291dHB1dCB8fCB0dl9vdXRwdXQpCisJCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9QSVhFTF9JTkRFWF0gfD0gKDEgPDwgNyk7CisKKwkvKiBHZW5lcmljIFBSQU1EQUMgcmVncyAqLworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfMTApCisJCS8qIE9ubHkgYml0IHRoYXQgYmlvcyBhbmQgYmxvYiBzZXQuICovCisJCXJlZ3AtPm52MTBfY3Vyc3luYyA9ICgxIDw8IDI1KTsKKworCXJlZ3AtPnJhbWRhY19nZW5fY3RybCA9IE5WX1BSQU1EQUNfR0VORVJBTF9DT05UUk9MX0JQQ184QklUUyB8CisJCQkJTlZfUFJBTURBQ19HRU5FUkFMX0NPTlRST0xfVkdBX1NUQVRFX1NFTCB8CisJCQkJTlZfUFJBTURBQ19HRU5FUkFMX0NPTlRST0xfUElYTUlYX09OOworCWlmIChjcnRjLT5mYi0+ZGVwdGggPT0gMTYpCisJCXJlZ3AtPnJhbWRhY19nZW5fY3RybCB8PSBOVl9QUkFNREFDX0dFTkVSQUxfQ09OVFJPTF9BTFRfTU9ERV9TRUw7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4MTEpCisJCXJlZ3AtPnJhbWRhY19nZW5fY3RybCB8PSBOVl9QUkFNREFDX0dFTkVSQUxfQ09OVFJPTF9QSVBFX0xPTkc7CisKKwlyZWdwLT5yYW1kYWNfNjMwID0gMDsgLyogdHVybiBvZmYgZ3JlZW4gbW9kZSAodHYgdGVzdCBwYXR0ZXJuPykgKi8KKwlyZWdwLT50dl9zZXR1cCA9IDA7CisKKwludl9jcnRjX3NldF9pbWFnZV9zaGFycGVuaW5nKGNydGMsIG52X2NydGMtPnNoYXJwbmVzcyk7CisKKwkvKiBTb21lIHZhbHVlcyB0aGUgYmxvYiBzZXRzICovCisJcmVncC0+cmFtZGFjXzhjMCA9IDB4MTAwOworCXJlZ3AtPnJhbWRhY19hMjAgPSAweDA7CisJcmVncC0+cmFtZGFjX2EyNCA9IDB4ZmZmZmY7CisJcmVncC0+cmFtZGFjX2EzNCA9IDB4MTsKK30KKworLyoqCisgKiBTZXRzIHVwIHJlZ2lzdGVycyBmb3IgdGhlIGdpdmVuIG1vZGUvYWRqdXN0ZWRfbW9kZSBwYWlyLgorICoKKyAqIFRoZSBjbG9ja3MsIENSVENzIGFuZCBvdXRwdXRzIGF0dGFjaGVkIHRvIHRoaXMgQ1JUQyBtdXN0IGJlIG9mZi4KKyAqCisgKiBUaGlzIHNob3VsZG4ndCBlbmFibGUgYW55IGNsb2NrcywgQ1JUQ3MsIG9yIG91dHB1dHMsIGJ1dCB0aGV5IHNob3VsZAorICogYmUgZWFzaWx5IHR1cm5lZCBvbi9vZmYgYWZ0ZXIgdGhpcy4KKyAqLworc3RhdGljIGludAorbnZfY3J0Y19tb2RlX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUsCisJCSBpbnQgeCwgaW50IHksIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm9sZF9mYikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCU5WX0RFQlVHKGRldiwgIkNUUkMgbW9kZSBvbiBDUlRDICVkOlxuIiwgbnZfY3J0Yy0+aW5kZXgpOworCWRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUoYWRqdXN0ZWRfbW9kZSk7CisKKwkvKiB1bmxvY2sgbXVzdCBjb21lIGFmdGVyIHR1cm5pbmcgb2ZmIEZQX1RHX0NPTlRST0wgaW4gb3V0cHV0X3ByZXBhcmUgKi8KKwludl9sb2NrX3ZnYV9jcnRjX3NoYWRvdyhkZXYsIG52X2NydGMtPmluZGV4LCAtMSk7CisKKwludl9jcnRjX21vZGVfc2V0X3ZnYShjcnRjLCBhZGp1c3RlZF9tb2RlKTsKKwkvKiBjYWxjdWxhdGVkIGluIG52MDRfZGZwX3ByZXBhcmUsIG52NDAgbmVlZHMgaXQgd3JpdHRlbiBiZWZvcmUgY2FsY3VsYXRpbmcgUExMcyAqLworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzQwKQorCQlOVldyaXRlUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19TRUxfQ0xLLCBkZXZfcHJpdi0+bW9kZV9yZWcuc2VsX2Nsayk7CisJbnZfY3J0Y19tb2RlX3NldF9yZWdzKGNydGMsIGFkanVzdGVkX21vZGUpOworCW52X2NydGNfY2FsY19zdGF0ZV9leHQoY3J0YywgbW9kZSwgYWRqdXN0ZWRfbW9kZS0+Y2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBudl9jcnRjX3NhdmUoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY3J0Yy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnYwNF9tb2RlX3N0YXRlICpzdGF0ZSA9ICZkZXZfcHJpdi0+bW9kZV9yZWc7CisJc3RydWN0IG52MDRfY3J0Y19yZWcgKmNydGNfc3RhdGUgPSAmc3RhdGUtPmNydGNfcmVnW252X2NydGMtPmluZGV4XTsKKwlzdHJ1Y3QgbnYwNF9tb2RlX3N0YXRlICpzYXZlZCA9ICZkZXZfcHJpdi0+c2F2ZWRfcmVnOworCXN0cnVjdCBudjA0X2NydGNfcmVnICpjcnRjX3NhdmVkID0gJnNhdmVkLT5jcnRjX3JlZ1tudl9jcnRjLT5pbmRleF07CisKKwlpZiAobnZfdHdvX2hlYWRzKGNydGMtPmRldikpCisJCU5WU2V0T3duZXIoY3J0Yy0+ZGV2LCBudl9jcnRjLT5pbmRleCk7CisKKwlub3V2ZWF1X2h3X3NhdmVfc3RhdGUoY3J0Yy0+ZGV2LCBudl9jcnRjLT5pbmRleCwgc2F2ZWQpOworCisJLyogaW5pdCBzb21lIHN0YXRlIHRvIHNhdmVkIHZhbHVlICovCisJc3RhdGUtPnNlbF9jbGsgPSBzYXZlZC0+c2VsX2NsayAmIH4oMHg1IDw8IDE2KTsKKwljcnRjX3N0YXRlLT5DUlRDW05WX0NJT19DUkVfTENEX19JTkRFWF0gPSBjcnRjX3NhdmVkLT5DUlRDW05WX0NJT19DUkVfTENEX19JTkRFWF07CisJc3RhdGUtPnBsbHNlbCA9IHNhdmVkLT5wbGxzZWwgJiB+KFBMTFNFTF9WUExMMV9NQVNLIHwgUExMU0VMX1ZQTEwyX01BU0sgfCBQTExTRUxfVFZfTUFTSyk7CisJY3J0Y19zdGF0ZS0+Z3Bpb19leHQgPSBjcnRjX3NhdmVkLT5ncGlvX2V4dDsKK30KKworc3RhdGljIHZvaWQgbnZfY3J0Y19yZXN0b3JlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNydGMtPmRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGhlYWQgPSBudl9jcnRjLT5pbmRleDsKKwl1aW50OF90IHNhdmVkX2NyMjEgPSBkZXZfcHJpdi0+c2F2ZWRfcmVnLmNydGNfcmVnW2hlYWRdLkNSVENbTlZfQ0lPX0NSRV8yMV07CisKKwlpZiAobnZfdHdvX2hlYWRzKGNydGMtPmRldikpCisJCU5WU2V0T3duZXIoY3J0Yy0+ZGV2LCBoZWFkKTsKKworCW5vdXZlYXVfaHdfbG9hZF9zdGF0ZShjcnRjLT5kZXYsIGhlYWQsICZkZXZfcHJpdi0+c2F2ZWRfcmVnKTsKKwludl9sb2NrX3ZnYV9jcnRjX3NoYWRvdyhjcnRjLT5kZXYsIGhlYWQsIHNhdmVkX2NyMjEpOworCisJbnZfY3J0Yy0+bGFzdF9kcG1zID0gTlZfRFBNU19DTEVBUkVEOworfQorCitzdGF0aWMgdm9pZCBudl9jcnRjX3ByZXBhcmUoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCXN0cnVjdCBkcm1fY3J0Y19oZWxwZXJfZnVuY3MgKmZ1bmNzID0gY3J0Yy0+aGVscGVyX3ByaXZhdGU7CisKKwlpZiAobnZfdHdvX2hlYWRzKGRldikpCisJCU5WU2V0T3duZXIoZGV2LCBudl9jcnRjLT5pbmRleCk7CisKKwlmdW5jcy0+ZHBtcyhjcnRjLCBEUk1fTU9ERV9EUE1TX09GRik7CisKKwlOVkJsYW5rU2NyZWVuKGRldiwgbnZfY3J0Yy0+aW5kZXgsIHRydWUpOworCisJLyogU29tZSBtb3JlIHByZXBlcmF0aW9uLiAqLworCU5WV3JpdGVDUlRDKGRldiwgbnZfY3J0Yy0+aW5kZXgsIE5WX1BDUlRDX0NPTkZJRywgTlZfUENSVENfQ09ORklHX1NUQVJUX0FERFJFU1NfTk9OX1ZHQSk7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNDApIHsKKwkJdWludDMyX3QgcmVnOTAwID0gTlZSZWFkUkFNREFDKGRldiwgbnZfY3J0Yy0+aW5kZXgsIE5WX1BSQU1EQUNfOTAwKTsKKwkJTlZXcml0ZVJBTURBQyhkZXYsIG52X2NydGMtPmluZGV4LCBOVl9QUkFNREFDXzkwMCwgcmVnOTAwICYgfjB4MTAwMDApOworCX0KK30KKworc3RhdGljIHZvaWQgbnZfY3J0Y19jb21taXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyAqZnVuY3MgPSBjcnRjLT5oZWxwZXJfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjcnRjLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisKKwlub3V2ZWF1X2h3X2xvYWRfc3RhdGUoZGV2LCBudl9jcnRjLT5pbmRleCwgJmRldl9wcml2LT5tb2RlX3JlZyk7CisJbnYwNF9jcnRjX21vZGVfc2V0X2Jhc2UoY3J0YywgY3J0Yy0+eCwgY3J0Yy0+eSwgTlVMTCk7CisKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkvKiB0dXJuIG9uIExGQiBzd2FwcGluZyAqLworCXsKKwkJdWludDhfdCB0bXAgPSBOVlJlYWRWZ2FDcnRjKGRldiwgbnZfY3J0Yy0+aW5kZXgsIE5WX0NJT19DUkVfUkNSKTsKKwkJdG1wIHw9IE1BU0soTlZfQ0lPX0NSRV9SQ1JfRU5ESUFOX0JJRyk7CisJCU5WV3JpdGVWZ2FDcnRjKGRldiwgbnZfY3J0Yy0+aW5kZXgsIE5WX0NJT19DUkVfUkNSLCB0bXApOworCX0KKyNlbmRpZgorCisJZnVuY3MtPmRwbXMoY3J0YywgRFJNX01PREVfRFBNU19PTik7Cit9CisKK3N0YXRpYyB2b2lkIG52X2NydGNfZGVzdHJveShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKworCU5WX0RFQlVHKGNydGMtPmRldiwgIlxuIik7CisKKwlpZiAoIW52X2NydGMpCisJCXJldHVybjsKKworCWRybV9jcnRjX2NsZWFudXAoY3J0Yyk7CisKKwlub3V2ZWF1X2JvX3JlZihOVUxMLCAmbnZfY3J0Yy0+Y3Vyc29yLm52Ym8pOworCWtmcmVlKG52X2NydGMpOworfQorCitzdGF0aWMgdm9pZAorbnZfY3J0Y19nYW1tYV9sb2FkKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBudl9jcnRjLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByZ2IgeyB1aW50OF90IHIsIGcsIGI7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgKnJnYnM7CisJaW50IGk7CisKKwlyZ2JzID0gKHN0cnVjdCByZ2IgKilkZXZfcHJpdi0+bW9kZV9yZWcuY3J0Y19yZWdbbnZfY3J0Yy0+aW5kZXhdLkRBQzsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJcmdic1tpXS5yID0gbnZfY3J0Yy0+bHV0LnJbaV0gPj4gODsKKwkJcmdic1tpXS5nID0gbnZfY3J0Yy0+bHV0LmdbaV0gPj4gODsKKwkJcmdic1tpXS5iID0gbnZfY3J0Yy0+bHV0LmJbaV0gPj4gODsKKwl9CisKKwlub3V2ZWF1X2h3X2xvYWRfc3RhdGVfcGFsZXR0ZShkZXYsIG52X2NydGMtPmluZGV4LCAmZGV2X3ByaXYtPm1vZGVfcmVnKTsKK30KKworc3RhdGljIHZvaWQKK252X2NydGNfZ2FtbWFfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdTE2ICpyLCB1MTYgKmcsIHUxNiAqYiwgdWludDMyX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCWludCBpOworCisJaWYgKHNpemUgIT0gMjU2KQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJbnZfY3J0Yy0+bHV0LnJbaV0gPSByW2ldOworCQludl9jcnRjLT5sdXQuZ1tpXSA9IGdbaV07CisJCW52X2NydGMtPmx1dC5iW2ldID0gYltpXTsKKwl9CisKKwkvKiBXZSBuZWVkIHRvIGtub3cgdGhlIGRlcHRoIGJlZm9yZSB3ZSB1cGxvYWQsIGJ1dCBpdCdzIHBvc3NpYmxlIHRvCisJICogZ2V0IGNhbGxlZCBiZWZvcmUgYSBmcmFtZWJ1ZmZlciBpcyBib3VuZC4gIElmIHRoaXMgaXMgdGhlIGNhc2UsCisJICogbWFyayB0aGUgbHV0IHZhbHVlcyBhcyBkaXJ0eSBieSBzZXR0aW5nIGRlcHRoPT0wLCBhbmQgaXQnbGwgYmUKKwkgKiB1cGxvYWRlZCBvbiB0aGUgZmlyc3QgbW9kZV9zZXRfYmFzZSgpCisJICovCisJaWYgKCFudl9jcnRjLT5iYXNlLmZiKSB7CisJCW52X2NydGMtPmx1dC5kZXB0aCA9IDA7CisJCXJldHVybjsKKwl9CisKKwludl9jcnRjX2dhbW1hX2xvYWQoY3J0Yyk7Cit9CisKK3N0YXRpYyBpbnQKK252MDRfY3J0Y19tb2RlX3NldF9iYXNlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHgsIGludCB5LAorCQkJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiKQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudjA0X2NydGNfcmVnICpyZWdwID0gJmRldl9wcml2LT5tb2RlX3JlZy5jcnRjX3JlZ1tudl9jcnRjLT5pbmRleF07CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZHJtX2ZiID0gbnZfY3J0Yy0+YmFzZS5mYjsKKwlzdHJ1Y3Qgbm91dmVhdV9mcmFtZWJ1ZmZlciAqZmIgPSBub3V2ZWF1X2ZyYW1lYnVmZmVyKGRybV9mYik7CisJaW50IGFyYl9idXJzdCwgYXJiX2x3bTsKKwlpbnQgcmV0OworCisJcmV0ID0gbm91dmVhdV9ib19waW4oZmItPm52Ym8sIFRUTV9QTF9GTEFHX1ZSQU0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAob2xkX2ZiKSB7CisJCXN0cnVjdCBub3V2ZWF1X2ZyYW1lYnVmZmVyICpvZmIgPSBub3V2ZWF1X2ZyYW1lYnVmZmVyKG9sZF9mYik7CisJCW5vdXZlYXVfYm9fdW5waW4ob2ZiLT5udmJvKTsKKwl9CisKKwludl9jcnRjLT5mYi5vZmZzZXQgPSBmYi0+bnZiby0+Ym8ub2Zmc2V0OworCisJaWYgKG52X2NydGMtPmx1dC5kZXB0aCAhPSBkcm1fZmItPmRlcHRoKSB7CisJCW52X2NydGMtPmx1dC5kZXB0aCA9IGRybV9mYi0+ZGVwdGg7CisJCW52X2NydGNfZ2FtbWFfbG9hZChjcnRjKTsKKwl9CisKKwkvKiBVcGRhdGUgdGhlIGZyYW1lYnVmZmVyIGZvcm1hdC4gKi8KKwlyZWdwLT5DUlRDW05WX0NJT19DUkVfUElYRUxfSU5ERVhdICY9IH4zOworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9QSVhFTF9JTkRFWF0gfD0gKGNydGMtPmZiLT5kZXB0aCArIDEpIC8gODsKKwlyZWdwLT5yYW1kYWNfZ2VuX2N0cmwgJj0gfk5WX1BSQU1EQUNfR0VORVJBTF9DT05UUk9MX0FMVF9NT0RFX1NFTDsKKwlpZiAoY3J0Yy0+ZmItPmRlcHRoID09IDE2KQorCQlyZWdwLT5yYW1kYWNfZ2VuX2N0cmwgfD0gTlZfUFJBTURBQ19HRU5FUkFMX0NPTlRST0xfQUxUX01PREVfU0VMOworCWNydGNfd3JfY2lvX3N0YXRlKGNydGMsIHJlZ3AsIE5WX0NJT19DUkVfUElYRUxfSU5ERVgpOworCU5WV3JpdGVSQU1EQUMoZGV2LCBudl9jcnRjLT5pbmRleCwgTlZfUFJBTURBQ19HRU5FUkFMX0NPTlRST0wsCisJCSAgICAgIHJlZ3AtPnJhbWRhY19nZW5fY3RybCk7CisKKwlyZWdwLT5DUlRDW05WX0NJT19DUl9PRkZTRVRfSU5ERVhdID0gZHJtX2ZiLT5waXRjaCA+PiAzOworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9SUEMwX0lOREVYXSA9CisJCVhMQVRFKGRybV9mYi0+cGl0Y2ggPj4gMywgOCwgTlZfQ0lPX0NSRV9SUEMwX09GRlNFVF8xMF84KTsKKwljcnRjX3dyX2Npb19zdGF0ZShjcnRjLCByZWdwLCBOVl9DSU9fQ1JFX1JQQzBfSU5ERVgpOworCWNydGNfd3JfY2lvX3N0YXRlKGNydGMsIHJlZ3AsIE5WX0NJT19DUl9PRkZTRVRfSU5ERVgpOworCisJLyogVXBkYXRlIHRoZSBmcmFtZWJ1ZmZlciBsb2NhdGlvbi4gKi8KKwlyZWdwLT5mYl9zdGFydCA9IG52X2NydGMtPmZiLm9mZnNldCAmIH4zOworCXJlZ3AtPmZiX3N0YXJ0ICs9ICh5ICogZHJtX2ZiLT5waXRjaCkgKyAoeCAqIGRybV9mYi0+Yml0c19wZXJfcGl4ZWwgLyA4KTsKKwlOVldyaXRlQ1JUQyhkZXYsIG52X2NydGMtPmluZGV4LCBOVl9QQ1JUQ19TVEFSVCwgcmVncC0+ZmJfc3RhcnQpOworCisJLyogVXBkYXRlIHRoZSBhcmJpdHJhdGlvbiBwYXJhbWV0ZXJzLiAqLworCW5vdXZlYXVfY2FsY19hcmIoZGV2LCBjcnRjLT5tb2RlLmNsb2NrLCBkcm1fZmItPmJpdHNfcGVyX3BpeGVsLAorCQkJICZhcmJfYnVyc3QsICZhcmJfbHdtKTsKKworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9GRl9JTkRFWF0gPSBhcmJfYnVyc3Q7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX0ZGTFdNX19JTkRFWF0gPSBhcmJfbHdtICYgMHhmZjsKKwljcnRjX3dyX2Npb19zdGF0ZShjcnRjLCByZWdwLCBOVl9DSU9fQ1JFX0ZGX0lOREVYKTsKKwljcnRjX3dyX2Npb19zdGF0ZShjcnRjLCByZWdwLCBOVl9DSU9fQ1JFX0ZGTFdNX19JTkRFWCk7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8zMCkgeworCQlyZWdwLT5DUlRDW05WX0NJT19DUkVfNDddID0gYXJiX2x3bSA+PiA4OworCQljcnRjX3dyX2Npb19zdGF0ZShjcnRjLCByZWdwLCBOVl9DSU9fQ1JFXzQ3KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbnYwNF9jdXJzb3JfdXBsb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2JvICpzcmMsCisJCQkgICAgICAgc3RydWN0IG5vdXZlYXVfYm8gKmRzdCkKK3sKKwlpbnQgd2lkdGggPSBudl9jdXJzb3Jfd2lkdGgoZGV2KTsKKwl1aW50MzJfdCBwaXhlbDsKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisJCQlwaXhlbCA9IG5vdXZlYXVfYm9fcmQzMihzcmMsIGkqNjQgKyBqKTsKKworCQkJbm91dmVhdV9ib193cjE2KGRzdCwgaSp3aWR0aCArIGosIChwaXhlbCAmIDB4ODAwMDAwMDApID4+IDE2CisJCQkJICAgICB8IChwaXhlbCAmIDB4ZjgwMDAwKSA+PiA5CisJCQkJICAgICB8IChwaXhlbCAmIDB4ZjgwMCkgPj4gNgorCQkJCSAgICAgfCAocGl4ZWwgJiAweGY4KSA+PiAzKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgbnYxMV9jdXJzb3JfdXBsb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2JvICpzcmMsCisJCQkgICAgICAgc3RydWN0IG5vdXZlYXVfYm8gKmRzdCkKK3sKKwl1aW50MzJfdCBwaXhlbDsKKwlpbnQgYWxwaGEsIGk7CisKKwkvKiBudjExKyBzdXBwb3J0cyBwcmVtdWx0aXBsaWVkIChQTSksIG9yIG5vbi1wcmVtdWx0aXBsaWVkIChOUE0pIGFscGhhCisJICogY3Vyc29ycyAodGhvdWdoIE5QTSBpbiBjb21iaW5hdGlvbiB3aXRoIGZwIGRpdGhlcmluZyBtYXkgbm90IHdvcmsgb24KKwkgKiBudjExLCBmcm9tICJudiIgZHJpdmVyIGhpc3RvcnkpCisJICogTlBNIG1vZGUgbmVlZHMgTlZfUENSVENfQ1VSU09SX0NPTkZJR19BTFBIQV9CTEVORCBzZXQgYW5kIGlzIHdoYXQgdGhlCisJICogYmxvYiB1c2VzLCBob3dldmVyIHdlIGdldCBnaXZlbiBQTSBjdXJzb3JzIHNvIHdlIHVzZSBQTSBtb2RlCisJICovCisJZm9yIChpID0gMDsgaSA8IDY0ICogNjQ7IGkrKykgeworCQlwaXhlbCA9IG5vdXZlYXVfYm9fcmQzMihzcmMsIGkpOworCisJCS8qIGh3IGdldHMgdW5oYXBweSBpZiBhbHBoYSA8PSByZ2IgdmFsdWVzLiAgZm9yIGEgUE0gaW1hZ2UgImxlc3MKKwkJICogdGhhbiIgc2hvdWxkbid0IGhhcHBlbjsgZml4ICJlcXVhbCB0byIgY2FzZSBieSBhZGRpbmcgb25lIHRvCisJCSAqIGFscGhhIGNoYW5uZWwgKHNsaWdodGx5IGluYWNjdXJhdGUsIGJ1dCBzbyBpcyBhdHRlbXB0aW5nIHRvCisJCSAqIGdldCBiYWNrIHRvIE5QTSBpbWFnZXMsIGR1ZSB0byBsaW1pdHMgb2YgaW50ZWdlciBwcmVjaXNpb24pCisJCSAqLworCQlhbHBoYSA9IHBpeGVsID4+IDI0OworCQlpZiAoYWxwaGEgPiAwICYmIGFscGhhIDwgMjU1KQorCQkJcGl4ZWwgPSAocGl4ZWwgJiAweDAwZmZmZmZmKSB8ICgoYWxwaGEgKyAxKSA8PCAyNCk7CisKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJeworCQkJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCQkJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4MTEpIHsKKwkJCQlwaXhlbCA9ICgocGl4ZWwgJiAweDAwMDAwMGZmKSA8PCAyNCkgfAorCQkJCQkoKHBpeGVsICYgMHgwMDAwZmYwMCkgPDwgOCkgfAorCQkJCQkoKHBpeGVsICYgMHgwMGZmMDAwMCkgPj4gOCkgfAorCQkJCQkoKHBpeGVsICYgMHhmZjAwMDAwMCkgPj4gMjQpOworCQkJfQorCQl9CisjZW5kaWYKKworCQlub3V2ZWF1X2JvX3dyMzIoZHN0LCBpLCBwaXhlbCk7CisJfQorfQorCitzdGF0aWMgaW50CitudjA0X2NydGNfY3Vyc29yX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkgICAgIHVpbnQzMl90IGJ1ZmZlcl9oYW5kbGUsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY3J0Yy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCXN0cnVjdCBub3V2ZWF1X2JvICpjdXJzb3IgPSBOVUxMOworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtOworCWludCByZXQgPSAwOworCisJaWYgKHdpZHRoICE9IDY0IHx8IGhlaWdodCAhPSA2NCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWJ1ZmZlcl9oYW5kbGUpIHsKKwkJbnZfY3J0Yy0+Y3Vyc29yLmhpZGUobnZfY3J0YywgdHJ1ZSk7CisJCXJldHVybiAwOworCX0KKworCWdlbSA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgYnVmZmVyX2hhbmRsZSk7CisJaWYgKCFnZW0pCisJCXJldHVybiAtRUlOVkFMOworCWN1cnNvciA9IG5vdXZlYXVfZ2VtX29iamVjdChnZW0pOworCisJcmV0ID0gbm91dmVhdV9ib19tYXAoY3Vyc29yKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDExKQorCQludjExX2N1cnNvcl91cGxvYWQoZGV2LCBjdXJzb3IsIG52X2NydGMtPmN1cnNvci5udmJvKTsKKwllbHNlCisJCW52MDRfY3Vyc29yX3VwbG9hZChkZXYsIGN1cnNvciwgbnZfY3J0Yy0+Y3Vyc29yLm52Ym8pOworCisJbm91dmVhdV9ib191bm1hcChjdXJzb3IpOworCW52X2NydGMtPmN1cnNvci5vZmZzZXQgPSBudl9jcnRjLT5jdXJzb3IubnZiby0+Ym8ub2Zmc2V0OworCW52X2NydGMtPmN1cnNvci5zZXRfb2Zmc2V0KG52X2NydGMsIG52X2NydGMtPmN1cnNvci5vZmZzZXQpOworCW52X2NydGMtPmN1cnNvci5zaG93KG52X2NydGMsIHRydWUpOworb3V0OgorCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShnZW0pOworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK252MDRfY3J0Y19jdXJzb3JfbW92ZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCB4LCBpbnQgeSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCisJbnZfY3J0Yy0+Y3Vyc29yLnNldF9wb3MobnZfY3J0YywgeCwgeSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2NydGNfZnVuY3MgbnYwNF9jcnRjX2Z1bmNzID0geworCS5zYXZlID0gbnZfY3J0Y19zYXZlLAorCS5yZXN0b3JlID0gbnZfY3J0Y19yZXN0b3JlLAorCS5jdXJzb3Jfc2V0ID0gbnYwNF9jcnRjX2N1cnNvcl9zZXQsCisJLmN1cnNvcl9tb3ZlID0gbnYwNF9jcnRjX2N1cnNvcl9tb3ZlLAorCS5nYW1tYV9zZXQgPSBudl9jcnRjX2dhbW1hX3NldCwKKwkuc2V0X2NvbmZpZyA9IGRybV9jcnRjX2hlbHBlcl9zZXRfY29uZmlnLAorCS5kZXN0cm95ID0gbnZfY3J0Y19kZXN0cm95LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY3J0Y19oZWxwZXJfZnVuY3MgbnYwNF9jcnRjX2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcyA9IG52X2NydGNfZHBtcywKKwkucHJlcGFyZSA9IG52X2NydGNfcHJlcGFyZSwKKwkuY29tbWl0ID0gbnZfY3J0Y19jb21taXQsCisJLm1vZGVfZml4dXAgPSBudl9jcnRjX21vZGVfZml4dXAsCisJLm1vZGVfc2V0ID0gbnZfY3J0Y19tb2RlX3NldCwKKwkubW9kZV9zZXRfYmFzZSA9IG52MDRfY3J0Y19tb2RlX3NldF9iYXNlLAorCS5sb2FkX2x1dCA9IG52X2NydGNfZ2FtbWFfbG9hZCwKK307CisKK2ludAorbnYwNF9jcnRjX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Y19udW0pCit7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YzsKKwlpbnQgcmV0LCBpOworCisJbnZfY3J0YyA9IGt6YWxsb2Moc2l6ZW9mKCpudl9jcnRjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFudl9jcnRjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQludl9jcnRjLT5sdXQucltpXSA9IGkgPDwgODsKKwkJbnZfY3J0Yy0+bHV0LmdbaV0gPSBpIDw8IDg7CisJCW52X2NydGMtPmx1dC5iW2ldID0gaSA8PCA4OworCX0KKwludl9jcnRjLT5sdXQuZGVwdGggPSAwOworCisJbnZfY3J0Yy0+aW5kZXggPSBjcnRjX251bTsKKwludl9jcnRjLT5sYXN0X2RwbXMgPSBOVl9EUE1TX0NMRUFSRUQ7CisKKwlkcm1fY3J0Y19pbml0KGRldiwgJm52X2NydGMtPmJhc2UsICZudjA0X2NydGNfZnVuY3MpOworCWRybV9jcnRjX2hlbHBlcl9hZGQoJm52X2NydGMtPmJhc2UsICZudjA0X2NydGNfaGVscGVyX2Z1bmNzKTsKKwlkcm1fbW9kZV9jcnRjX3NldF9nYW1tYV9zaXplKCZudl9jcnRjLT5iYXNlLCAyNTYpOworCisJcmV0ID0gbm91dmVhdV9ib19uZXcoZGV2LCBOVUxMLCA2NCo2NCo0LCAweDEwMCwgVFRNX1BMX0ZMQUdfVlJBTSwKKwkJCSAgICAgMCwgMHgwMDAwLCBmYWxzZSwgdHJ1ZSwgJm52X2NydGMtPmN1cnNvci5udmJvKTsKKwlpZiAoIXJldCkgeworCQlyZXQgPSBub3V2ZWF1X2JvX3Bpbihudl9jcnRjLT5jdXJzb3IubnZibywgVFRNX1BMX0ZMQUdfVlJBTSk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gbm91dmVhdV9ib19tYXAobnZfY3J0Yy0+Y3Vyc29yLm52Ym8pOworCQlpZiAocmV0KQorCQkJbm91dmVhdV9ib19yZWYoTlVMTCwgJm52X2NydGMtPmN1cnNvci5udmJvKTsKKwl9CisKKwludjA0X2N1cnNvcl9pbml0KG52X2NydGMpOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfY3Vyc29yLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2N1cnNvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YTkxYjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2N1cnNvci5jCkBAIC0wLDAgKzEsNzAgQEAKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtX21vZGUuaCIKKyNpbmNsdWRlICJub3V2ZWF1X3JlZy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9jcnRjLmgiCisjaW5jbHVkZSAibm91dmVhdV9ody5oIgorCitzdGF0aWMgdm9pZAorbnYwNF9jdXJzb3Jfc2hvdyhzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjLCBib29sIHVwZGF0ZSkKK3sKKwludl9zaG93X2N1cnNvcihudl9jcnRjLT5iYXNlLmRldiwgbnZfY3J0Yy0+aW5kZXgsIHRydWUpOworfQorCitzdGF0aWMgdm9pZAorbnYwNF9jdXJzb3JfaGlkZShzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjLCBib29sIHVwZGF0ZSkKK3sKKwludl9zaG93X2N1cnNvcihudl9jcnRjLT5iYXNlLmRldiwgbnZfY3J0Yy0+aW5kZXgsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQKK252MDRfY3Vyc29yX3NldF9wb3Moc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YywgaW50IHgsIGludCB5KQoreworCU5WV3JpdGVSQU1EQUMobnZfY3J0Yy0+YmFzZS5kZXYsIG52X2NydGMtPmluZGV4LAorCQkgICAgICBOVl9QUkFNREFDX0NVX1NUQVJUX1BPUywKKwkJICAgICAgWExBVEUoeSwgMCwgTlZfUFJBTURBQ19DVV9TVEFSVF9QT1NfWSkgfAorCQkgICAgICBYTEFURSh4LCAwLCBOVl9QUkFNREFDX0NVX1NUQVJUX1BPU19YKSk7Cit9CisKK3N0YXRpYyB2b2lkCitjcnRjX3dyX2Npb19zdGF0ZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBudjA0X2NydGNfcmVnICpjcnRjc3RhdGUsIGludCBpbmRleCkKK3sKKwlOVldyaXRlVmdhQ3J0YyhjcnRjLT5kZXYsIG5vdXZlYXVfY3J0YyhjcnRjKS0+aW5kZXgsIGluZGV4LAorCQkgICAgICAgY3J0Y3N0YXRlLT5DUlRDW2luZGV4XSk7Cit9CisKK3N0YXRpYyB2b2lkCitudjA0X2N1cnNvcl9zZXRfb2Zmc2V0KHN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMsIHVpbnQzMl90IG9mZnNldCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbnZfY3J0Yy0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnYwNF9jcnRjX3JlZyAqcmVncCA9ICZkZXZfcHJpdi0+bW9kZV9yZWcuY3J0Y19yZWdbbnZfY3J0Yy0+aW5kZXhdOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9ICZudl9jcnRjLT5iYXNlOworCisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX0hDVVJfQUREUjBfSU5ERVhdID0KKwkJTUFTSyhOVl9DSU9fQ1JFX0hDVVJfQVNJKSB8CisJCVhMQVRFKG9mZnNldCwgMTcsIE5WX0NJT19DUkVfSENVUl9BRERSMF9BRFIpOworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9IQ1VSX0FERFIxX0lOREVYXSA9CisJCVhMQVRFKG9mZnNldCwgMTEsIE5WX0NJT19DUkVfSENVUl9BRERSMV9BRFIpOworCWlmIChjcnRjLT5tb2RlLmZsYWdzICYgRFJNX01PREVfRkxBR19EQkxTQ0FOKQorCQlyZWdwLT5DUlRDW05WX0NJT19DUkVfSENVUl9BRERSMV9JTkRFWF0gfD0KKwkJCU1BU0soTlZfQ0lPX0NSRV9IQ1VSX0FERFIxX0NVUl9EQkwpOworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9IQ1VSX0FERFIyX0lOREVYXSA9IG9mZnNldCA+PiAyNDsKKworCWNydGNfd3JfY2lvX3N0YXRlKGNydGMsIHJlZ3AsIE5WX0NJT19DUkVfSENVUl9BRERSMF9JTkRFWCk7CisJY3J0Y193cl9jaW9fc3RhdGUoY3J0YywgcmVncCwgTlZfQ0lPX0NSRV9IQ1VSX0FERFIxX0lOREVYKTsKKwljcnRjX3dyX2Npb19zdGF0ZShjcnRjLCByZWdwLCBOVl9DSU9fQ1JFX0hDVVJfQUREUjJfSU5ERVgpOworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzQwKQorCQludl9maXhfbnY0MF9od19jdXJzb3IoZGV2LCBudl9jcnRjLT5pbmRleCk7Cit9CisKK2ludAorbnYwNF9jdXJzb3JfaW5pdChzdHJ1Y3Qgbm91dmVhdV9jcnRjICpjcnRjKQoreworCWNydGMtPmN1cnNvci5zZXRfb2Zmc2V0ID0gbnYwNF9jdXJzb3Jfc2V0X29mZnNldDsKKwljcnRjLT5jdXJzb3Iuc2V0X3BvcyA9IG52MDRfY3Vyc29yX3NldF9wb3M7CisJY3J0Yy0+Y3Vyc29yLmhpZGUgPSBudjA0X2N1cnNvcl9oaWRlOworCWNydGMtPmN1cnNvci5zaG93ID0gbnYwNF9jdXJzb3Jfc2hvdzsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9kYWMuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZGFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmYTUxNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZGFjLmMKQEAgLTAsMCArMSw1MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMyBOVklESUEsIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgMjAwNiBEYXZlIEFpcmxpZQorICogQ29weXJpZ2h0IDIwMDcgTWFhcnRlbiBNYWF0aHVpcworICogQ29weXJpZ2h0IDIwMDctMjAwOSBTdHVhcnQgQmVubmV0dAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgorCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2VuY29kZXIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Nvbm5lY3Rvci5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY3J0Yy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfaHcuaCIKKyNpbmNsdWRlICJudnJlZy5oIgorCitpbnQgbnYwNF9kYWNfb3V0cHV0X29mZnNldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGRjYl9lbnRyeSAqZGNiID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpLT5kY2I7CisJaW50IG9mZnNldCA9IDA7CisKKwlpZiAoZGNiLT5vciAmICg4IHwgT1VUUFVUX0MpKQorCQlvZmZzZXQgKz0gMHg2ODsKKwlpZiAoZGNiLT5vciAmICg4IHwgT1VUUFVUX0IpKQorCQlvZmZzZXQgKz0gMHgyMDAwOworCisJcmV0dXJuIG9mZnNldDsKK30KKworLyoKKyAqIGFyYml0cmFyeSBsaW1pdCB0byBudW1iZXIgb2Ygc2Vuc2Ugb3NjaWxsYXRpb25zIHRvbGVyYXRlZCBpbiBvbmUgc2FtcGxlCisgKiBwZXJpb2QgKG9ic2VydmVkIHRvIGJlIGF0IGxlYXN0IDEzIGluICJudmlkaWEiKQorICovCisjZGVmaW5lIE1BWF9IQkxBTktfT1NDIDIwCisKKy8qCisgKiBhcmJpdHJhcnkgbGltaXQgdG8gbnVtYmVyIG9mIGNvbmZsaWN0aW5nIHNhbXBsZSBwYWlycyB0byB0b2xlcmF0ZSBhdCBhCisgKiB2b2x0YWdlIHN0ZXAgKG9ic2VydmVkIHRvIGJlIGF0IGxlYXN0IDUgaW4gIm52aWRpYSIpCisgKi8KKyNkZWZpbmUgTUFYX1NBTVBMRV9QQUlSUyAxMAorCitzdGF0aWMgaW50IHNhbXBsZV9sb2FkX3R3aWNlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGJvb2wgc2Vuc2VbMl0pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWJvb2wgc2Vuc2VfYSwgc2Vuc2VfYiwgc2Vuc2VfYl9wcmltZTsKKwkJaW50IGogPSAwOworCisJCS8qCisJCSAqIHdhaXQgZm9yIGJpdCAwIGNsZWFyIC0tIG91dCBvZiBoYmxhbmsgLS0gKHNheSByZWcgdmFsdWUgMHg0KSwKKwkJICogdGhlbiB3YWl0IGZvciB0cmFuc2l0aW9uIDB4NC0+MHg1LT4weDQ6IGVudGVyIGhibGFuaywgbGVhdmUKKwkJICogaGJsYW5rIGFnYWluCisJCSAqIHVzZSBhIDEwbXMgdGltZW91dCAoZ3VhcmRzIGFnYWluc3QgY3J0YyBiZWluZyBpbmFjdGl2ZSwgaW4KKwkJICogd2hpY2ggY2FzZSBibGFuayBzdGF0ZSB3b3VsZCBuZXZlciBjaGFuZ2UpCisJCSAqLworCQlpZiAoIW5vdXZlYXVfd2FpdF91bnRpbChkZXYsIDEwMDAwMDAwLCBOVl9QUk1DSU9fSU5QMF9fQ09MT1IsCisJCQkJCTB4MDAwMDAwMDEsIDB4MDAwMDAwMDApKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJaWYgKCFub3V2ZWF1X3dhaXRfdW50aWwoZGV2LCAxMDAwMDAwMCwgTlZfUFJNQ0lPX0lOUDBfX0NPTE9SLAorCQkJCQkweDAwMDAwMDAxLCAweDAwMDAwMDAxKSkKKwkJCXJldHVybiAtRUJVU1k7CisJCWlmICghbm91dmVhdV93YWl0X3VudGlsKGRldiwgMTAwMDAwMDAsIE5WX1BSTUNJT19JTlAwX19DT0xPUiwKKwkJCQkJMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCkpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCXVkZWxheSgxMDApOworCQkvKiB3aGVuIGxldmVsIHRyaWdnZXJzLCBzZW5zZSBpcyBfTE9fICovCisJCXNlbnNlX2EgPSBudl9yZDA4KGRldiwgTlZfUFJNQ0lPX0lOUDApICYgMHgxMDsKKworCQkvKiB0YWtlIGFub3RoZXIgcmVhZGluZyB1bnRpbCBpdCBhZ3JlZXMgd2l0aCBzZW5zZV9hLi4uICovCisJCWRvIHsKKwkJCXVkZWxheSgxMDApOworCQkJc2Vuc2VfYiA9IG52X3JkMDgoZGV2LCBOVl9QUk1DSU9fSU5QMCkgJiAweDEwOworCQkJaWYgKHNlbnNlX2EgIT0gc2Vuc2VfYikgeworCQkJCXNlbnNlX2JfcHJpbWUgPQorCQkJCQludl9yZDA4KGRldiwgTlZfUFJNQ0lPX0lOUDApICYgMHgxMDsKKwkJCQlpZiAoc2Vuc2VfYiA9PSBzZW5zZV9iX3ByaW1lKSB7CisJCQkJCS8qIC4uLiB1bmxlc3MgdHdvIGNvbnNlY3V0aXZlIHN1YnNlcXVlbnQKKwkJCQkJICogc2FtcGxlcyBhZ3JlZTsgc2Vuc2VfYSBpcyByZXBsYWNlZCAqLworCQkJCQlzZW5zZV9hID0gc2Vuc2VfYjsKKwkJCQkJLyogZm9yY2UgbWlzLW1hdGNoIHNvIHdlIGxvb3AgKi8KKwkJCQkJc2Vuc2VfYiA9ICFzZW5zZV9hOworCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAoKHNlbnNlX2EgIT0gc2Vuc2VfYikgJiYgKytqIDwgTUFYX0hCTEFOS19PU0MpOworCisJCWlmIChqID09IE1BWF9IQkxBTktfT1NDKQorCQkJLyogd2l0aCBzbyBtdWNoIG9zY2lsbGF0aW9uLCBkZWZhdWx0IHRvIHNlbnNlOkxPICovCisJCQlzZW5zZVtpXSA9IGZhbHNlOworCQllbHNlCisJCQlzZW5zZVtpXSA9IHNlbnNlX2E7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIG52MDRfZGFjX2RldGVjdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJCQkgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXVpbnQ4X3Qgc2F2ZWRfc2VxMSwgc2F2ZWRfcGksIHNhdmVkX3JwYzE7CisJdWludDhfdCBzYXZlZF9wYWxldHRlMFszXSwgc2F2ZWRfcGFsZXR0ZV9tYXNrOworCXVpbnQzMl90IHNhdmVkX3J0ZXN0X2N0cmwsIHNhdmVkX3JnZW5fY3RybDsKKwlpbnQgaTsKKwl1aW50OF90IGJsdWU7CisJYm9vbCBzZW5zZSA9IHRydWU7CisKKwkvKgorCSAqIGZvciB0aGlzIGRldGVjdGlvbiB0byB3b3JrLCB0aGVyZSBuZWVkcyB0byBiZSBhIG1vZGUgc2V0IHVwIG9uIHRoZQorCSAqIENSVEMuICB0aGlzIGlzIHByZXN1bWVkIHRvIGJlIHRoZSBjYXNlCisJICovCisKKwlpZiAobnZfdHdvX2hlYWRzKGRldikpCisJCS8qIG9ubHkgaW1wbGVtZW50ZWQgZm9yIGhlYWQgQSBmb3Igbm93ICovCisJCU5WU2V0T3duZXIoZGV2LCAwKTsKKworCXNhdmVkX3NlcTEgPSBOVlJlYWRWZ2FTZXEoZGV2LCAwLCBOVl9WSU9fU1JfQ0xPQ0tfSU5ERVgpOworCU5WV3JpdGVWZ2FTZXEoZGV2LCAwLCBOVl9WSU9fU1JfQ0xPQ0tfSU5ERVgsIHNhdmVkX3NlcTEgJiB+MHgyMCk7CisKKwlzYXZlZF9ydGVzdF9jdHJsID0gTlZSZWFkUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19URVNUX0NPTlRST0wpOworCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX1RFU1RfQ09OVFJPTCwKKwkJICAgICAgc2F2ZWRfcnRlc3RfY3RybCAmIH5OVl9QUkFNREFDX1RFU1RfQ09OVFJPTF9QV1JEV05fREFDX09GRik7CisKKwltc2xlZXAoMTApOworCisJc2F2ZWRfcGkgPSBOVlJlYWRWZ2FDcnRjKGRldiwgMCwgTlZfQ0lPX0NSRV9QSVhFTF9JTkRFWCk7CisJTlZXcml0ZVZnYUNydGMoZGV2LCAwLCBOVl9DSU9fQ1JFX1BJWEVMX0lOREVYLAorCQkgICAgICAgc2F2ZWRfcGkgJiB+KDB4ODAgfCBNQVNLKE5WX0NJT19DUkVfUElYRUxfRk9STUFUKSkpOworCXNhdmVkX3JwYzEgPSBOVlJlYWRWZ2FDcnRjKGRldiwgMCwgTlZfQ0lPX0NSRV9SUEMxX0lOREVYKTsKKwlOVldyaXRlVmdhQ3J0YyhkZXYsIDAsIE5WX0NJT19DUkVfUlBDMV9JTkRFWCwgc2F2ZWRfcnBjMSAmIH4weGMwKTsKKworCW52X3dyMDgoZGV2LCBOVl9QUk1ESU9fUkVBRF9NT0RFX0FERFJFU1MsIDB4MCk7CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJc2F2ZWRfcGFsZXR0ZTBbaV0gPSBudl9yZDA4KGRldiwgTlZfUFJNRElPX1BBTEVUVEVfREFUQSk7CisJc2F2ZWRfcGFsZXR0ZV9tYXNrID0gbnZfcmQwOChkZXYsIE5WX1BSTURJT19QSVhFTF9NQVNLKTsKKwludl93cjA4KGRldiwgTlZfUFJNRElPX1BJWEVMX01BU0ssIDApOworCisJc2F2ZWRfcmdlbl9jdHJsID0gTlZSZWFkUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19HRU5FUkFMX0NPTlRST0wpOworCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX0dFTkVSQUxfQ09OVFJPTCwKKwkJICAgICAgKHNhdmVkX3JnZW5fY3RybCAmIH4oTlZfUFJBTURBQ19HRU5FUkFMX0NPTlRST0xfQlBDXzhCSVRTIHwKKwkJCQkJICAgTlZfUFJBTURBQ19HRU5FUkFMX0NPTlRST0xfVEVSTUlOQVRJT05fNzVPSE0pKSB8CisJCSAgICAgIE5WX1BSQU1EQUNfR0VORVJBTF9DT05UUk9MX1BJWE1JWF9PTik7CisKKwlibHVlID0gODsJLyogc3RhcnQgb2YgdGVzdCByYW5nZSAqLworCisJZG8geworCQlib29sIHNlbnNlX3BhaXJbMl07CisKKwkJbnZfd3IwOChkZXYsIE5WX1BSTURJT19XUklURV9NT0RFX0FERFJFU1MsIDApOworCQludl93cjA4KGRldiwgTlZfUFJNRElPX1BBTEVUVEVfREFUQSwgMCk7CisJCW52X3dyMDgoZGV2LCBOVl9QUk1ESU9fUEFMRVRURV9EQVRBLCAwKTsKKwkJLyogdGVzdGluZyBibHVlIHdvbid0IGZpbmQgbW9ub2Nocm9tZSBtb25pdG9ycy4gIEkgZG9uJ3QgY2FyZSAqLworCQludl93cjA4KGRldiwgTlZfUFJNRElPX1BBTEVUVEVfREFUQSwgYmx1ZSk7CisKKwkJaSA9IDA7CisJCS8qIHRha2Ugc2FtcGxlIHBhaXJzIHVudGlsIGJvdGggc2FtcGxlcyBpbiB0aGUgcGFpciBhZ3JlZSAqLworCQlkbyB7CisJCQlpZiAoc2FtcGxlX2xvYWRfdHdpY2UoZGV2LCBzZW5zZV9wYWlyKSkKKwkJCQlnb3RvIG91dDsKKwkJfSB3aGlsZSAoKHNlbnNlX3BhaXJbMF0gIT0gc2Vuc2VfcGFpclsxXSkgJiYKKwkJCQkJCQkrK2kgPCBNQVhfU0FNUExFX1BBSVJTKTsKKworCQlpZiAoaSA9PSBNQVhfU0FNUExFX1BBSVJTKQorCQkJLyogdG9vIG11Y2ggb3NjaWxsYXRpb24gZGVmYXVsdHMgdG8gTE8gKi8KKwkJCXNlbnNlID0gZmFsc2U7CisJCWVsc2UKKwkJCXNlbnNlID0gc2Vuc2VfcGFpclswXTsKKworCS8qCisJICogaWYgc2Vuc2UgZ29lcyBMTyBiZWZvcmUgYmx1ZSByYW1wcyB0byAweDE4LCBtb25pdG9yIGlzIG5vdCBjb25uZWN0ZWQuCisJICogZXJnbywgaWYgYmx1ZSBnZXRzIHRvIDB4MTgsIG1vbml0b3IgbXVzdCBiZSBjb25uZWN0ZWQKKwkgKi8KKwl9IHdoaWxlICgrK2JsdWUgPCAweDE4ICYmIHNlbnNlKTsKKworb3V0OgorCW52X3dyMDgoZGV2LCBOVl9QUk1ESU9fUElYRUxfTUFTSywgc2F2ZWRfcGFsZXR0ZV9tYXNrKTsKKwlOVldyaXRlUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19HRU5FUkFMX0NPTlRST0wsIHNhdmVkX3JnZW5fY3RybCk7CisJbnZfd3IwOChkZXYsIE5WX1BSTURJT19XUklURV9NT0RFX0FERFJFU1MsIDApOworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCW52X3dyMDgoZGV2LCBOVl9QUk1ESU9fUEFMRVRURV9EQVRBLCBzYXZlZF9wYWxldHRlMFtpXSk7CisJTlZXcml0ZVJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfVEVTVF9DT05UUk9MLCBzYXZlZF9ydGVzdF9jdHJsKTsKKwlOVldyaXRlVmdhQ3J0YyhkZXYsIDAsIE5WX0NJT19DUkVfUElYRUxfSU5ERVgsIHNhdmVkX3BpKTsKKwlOVldyaXRlVmdhQ3J0YyhkZXYsIDAsIE5WX0NJT19DUkVfUlBDMV9JTkRFWCwgc2F2ZWRfcnBjMSk7CisJTlZXcml0ZVZnYVNlcShkZXYsIDAsIE5WX1ZJT19TUl9DTE9DS19JTkRFWCwgc2F2ZWRfc2VxMSk7CisKKwlpZiAoYmx1ZSA9PSAweDE4KSB7CisJCU5WX1RSQUNFKGRldiwgIkxvYWQgZGV0ZWN0ZWQgb24gaGVhZCBBXG4iKTsKKwkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCX0KKworCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKK30KKworZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBudjE3X2RhY19kZXRlY3Qoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCQkgIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkY2JfZW50cnkgKmRjYiA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKS0+ZGNiOworCXVpbnQzMl90IHRlc3R2YWwsIHJlZ29mZnNldCA9IG52MDRfZGFjX291dHB1dF9vZmZzZXQoZW5jb2Rlcik7CisJdWludDMyX3Qgc2F2ZWRfcG93ZXJjdHJsXzIgPSAwLCBzYXZlZF9wb3dlcmN0cmxfNCA9IDAsIHNhdmVkX3JvdXRwdXQsCisJCXNhdmVkX3J0ZXN0X2N0cmwsIHNhdmVkX2dwaW8wLCBzYXZlZF9ncGlvMSwgdGVtcCwgcm91dHB1dDsKKwlpbnQgaGVhZCwgcHJlc2VudCA9IDA7CisKKyNkZWZpbmUgUkdCX1RFU1RfREFUQShyLCBnLCBiKSAociA8PCAwIHwgZyA8PCAxMCB8IGIgPDwgMjApCisJaWYgKGRjYi0+dHlwZSA9PSBPVVRQVVRfVFYpIHsKKwkJdGVzdHZhbCA9IFJHQl9URVNUX0RBVEEoMHhhMCwgMHhhMCwgMHhhMCk7CisKKwkJaWYgKGRldl9wcml2LT52Ymlvcy0+dHZkYWN0ZXN0dmFsKQorCQkJdGVzdHZhbCA9IGRldl9wcml2LT52Ymlvcy0+dHZkYWN0ZXN0dmFsOworCX0gZWxzZSB7CisJCXRlc3R2YWwgPSBSR0JfVEVTVF9EQVRBKDB4MTQwLCAweDE0MCwgMHgxNDApOyAvKiAweDk0MDUwMTQwICovCisKKwkJaWYgKGRldl9wcml2LT52Ymlvcy0+ZGFjdGVzdHZhbCkKKwkJCXRlc3R2YWwgPSBkZXZfcHJpdi0+dmJpb3MtPmRhY3Rlc3R2YWw7CisJfQorCisJc2F2ZWRfcnRlc3RfY3RybCA9IE5WUmVhZFJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfVEVTVF9DT05UUk9MICsgcmVnb2Zmc2V0KTsKKwlOVldyaXRlUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19URVNUX0NPTlRST0wgKyByZWdvZmZzZXQsCisJCSAgICAgIHNhdmVkX3J0ZXN0X2N0cmwgJiB+TlZfUFJBTURBQ19URVNUX0NPTlRST0xfUFdSRFdOX0RBQ19PRkYpOworCisJc2F2ZWRfcG93ZXJjdHJsXzIgPSBudlJlYWRNQyhkZXYsIE5WX1BCVVNfUE9XRVJDVFJMXzIpOworCisJbnZXcml0ZU1DKGRldiwgTlZfUEJVU19QT1dFUkNUUkxfMiwgc2F2ZWRfcG93ZXJjdHJsXzIgJiAweGQ3ZmZmZmZmKTsKKwlpZiAocmVnb2Zmc2V0ID09IDB4NjgpIHsKKwkJc2F2ZWRfcG93ZXJjdHJsXzQgPSBudlJlYWRNQyhkZXYsIE5WX1BCVVNfUE9XRVJDVFJMXzQpOworCQludldyaXRlTUMoZGV2LCBOVl9QQlVTX1BPV0VSQ1RSTF80LCBzYXZlZF9wb3dlcmN0cmxfNCAmIDB4ZmZmZmZmY2YpOworCX0KKworCXNhdmVkX2dwaW8xID0gbnYxN19ncGlvX2dldChkZXYsIERDQl9HUElPX1RWREFDMSk7CisJc2F2ZWRfZ3BpbzAgPSBudjE3X2dwaW9fZ2V0KGRldiwgRENCX0dQSU9fVFZEQUMwKTsKKworCW52MTdfZ3Bpb19zZXQoZGV2LCBEQ0JfR1BJT19UVkRBQzEsIGRjYi0+dHlwZSA9PSBPVVRQVVRfVFYpOworCW52MTdfZ3Bpb19zZXQoZGV2LCBEQ0JfR1BJT19UVkRBQzAsIGRjYi0+dHlwZSA9PSBPVVRQVVRfVFYpOworCisJbXNsZWVwKDQpOworCisJc2F2ZWRfcm91dHB1dCA9IE5WUmVhZFJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfREFDQ0xLICsgcmVnb2Zmc2V0KTsKKwloZWFkID0gKHNhdmVkX3JvdXRwdXQgJiAweDEwMCkgPj4gODsKKyNpZiAwCisJLyogaWYgdGhlcmUncyBhIHNwYXJlIGNydGMsIHVzaW5nIGl0IHdpbGwgbWluaW1pc2UgZmxpY2tlciBmb3IgdGhlIGNhc2UKKwkgKiB3aGVyZSB0aGUgaW4tdXNlIGNydGMgaXMgaW4gdXNlIGJ5IGFuIG9mZi1jaGlwIHRtZHMgZW5jb2RlciAqLworCWlmICh4Zjg2X2NvbmZpZy0+Y3J0Y1toZWFkXS0+ZW5hYmxlZCAmJiAheGY4Nl9jb25maWctPmNydGNbaGVhZCBeIDFdLT5lbmFibGVkKQorCQloZWFkIF49IDE7CisjZW5kaWYKKwkvKiBudiBkcml2ZXIgYW5kIG52MzEgdXNlIDB4ZmZmZmZlZWUsIG52MzQgYW5kIDY2MDAgdXNlIDB4ZmZmZmZlY2UgKi8KKwlyb3V0cHV0ID0gKHNhdmVkX3JvdXRwdXQgJiAweGZmZmZmZWNlKSB8IGhlYWQgPDwgODsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzQwKSB7CisJCWlmIChkY2ItPnR5cGUgPT0gT1VUUFVUX1RWKQorCQkJcm91dHB1dCB8PSAweDFhIDw8IDE2OworCQllbHNlCisJCQlyb3V0cHV0ICY9IH4oMHgxYSA8PCAxNik7CisJfQorCisJTlZXcml0ZVJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfREFDQ0xLICsgcmVnb2Zmc2V0LCByb3V0cHV0KTsKKwltc2xlZXAoMSk7CisKKwl0ZW1wID0gTlZSZWFkUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19EQUNDTEsgKyByZWdvZmZzZXQpOworCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX0RBQ0NMSyArIHJlZ29mZnNldCwgdGVtcCB8IDEpOworCisJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfVEVTVFBPSU5UX0RBVEEsCisJCSAgICAgIE5WX1BSQU1EQUNfVEVTVFBPSU5UX0RBVEFfTk9UQkxBTksgfCB0ZXN0dmFsKTsKKwl0ZW1wID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19URVNUX0NPTlRST0wpOworCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX1RFU1RfQ09OVFJPTCwKKwkJICAgICAgdGVtcCB8IE5WX1BSQU1EQUNfVEVTVF9DT05UUk9MX1RQX0lOU19FTl9BU1NFUlRFRCk7CisJbXNsZWVwKDUpOworCisJdGVtcCA9IE5WUmVhZFJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfVEVTVF9DT05UUk9MICsgcmVnb2Zmc2V0KTsKKworCWlmIChkY2ItPnR5cGUgPT0gT1VUUFVUX1RWKQorCQlwcmVzZW50ID0gKG52MTdfdHZfZGV0ZWN0KGVuY29kZXIsIGNvbm5lY3RvciwgdGVtcCkKKwkJCSAgID09IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkKTsKKwllbHNlCisJCXByZXNlbnQgPSB0ZW1wICYgTlZfUFJBTURBQ19URVNUX0NPTlRST0xfU0VOU0VCX0FMTEhJOworCisJdGVtcCA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfVEVTVF9DT05UUk9MKTsKKwlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19URVNUX0NPTlRST0wsCisJCSAgICAgIHRlbXAgJiB+TlZfUFJBTURBQ19URVNUX0NPTlRST0xfVFBfSU5TX0VOX0FTU0VSVEVEKTsKKwlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19URVNUUE9JTlRfREFUQSwgMCk7CisKKwkvKiBiaW9zIGRvZXMgc29tZXRoaW5nIG1vcmUgY29tcGxleCBmb3IgcmVzdG9yaW5nLCBidXQgSSB0aGluayB0aGlzIGlzIGdvb2QgZW5vdWdoICovCisJTlZXcml0ZVJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfREFDQ0xLICsgcmVnb2Zmc2V0LCBzYXZlZF9yb3V0cHV0KTsKKwlOVldyaXRlUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19URVNUX0NPTlRST0wgKyByZWdvZmZzZXQsIHNhdmVkX3J0ZXN0X2N0cmwpOworCWlmIChyZWdvZmZzZXQgPT0gMHg2OCkKKwkJbnZXcml0ZU1DKGRldiwgTlZfUEJVU19QT1dFUkNUUkxfNCwgc2F2ZWRfcG93ZXJjdHJsXzQpOworCW52V3JpdGVNQyhkZXYsIE5WX1BCVVNfUE9XRVJDVFJMXzIsIHNhdmVkX3Bvd2VyY3RybF8yKTsKKworCW52MTdfZ3Bpb19zZXQoZGV2LCBEQ0JfR1BJT19UVkRBQzEsIHNhdmVkX2dwaW8xKTsKKwludjE3X2dwaW9fc2V0KGRldiwgRENCX0dQSU9fVFZEQUMwLCBzYXZlZF9ncGlvMCk7CisKKwlpZiAocHJlc2VudCkgeworCQlOVl9JTkZPKGRldiwgIkxvYWQgZGV0ZWN0ZWQgb24gb3V0cHV0ICVjXG4iLCAnQCcgKyBmZnMoZGNiLT5vcikpOworCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJfQorCisJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworfQorCisKK3N0YXRpYyBib29sIG52MDRfZGFjX21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBudjA0X2RhY19wcmVwYXJlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICpoZWxwZXIgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGhlYWQgPSBub3V2ZWF1X2NydGMoZW5jb2Rlci0+Y3J0YyktPmluZGV4OworCXN0cnVjdCBudjA0X2NydGNfcmVnICpjcnRjc3RhdGUgPSBkZXZfcHJpdi0+bW9kZV9yZWcuY3J0Y19yZWc7CisKKwloZWxwZXItPmRwbXMoZW5jb2RlciwgRFJNX01PREVfRFBNU19PRkYpOworCisJbnYwNF9kZnBfZGlzYWJsZShkZXYsIGhlYWQpOworCisJLyogU29tZSBOVjR4IGhhdmUgdW5rbm93biB2YWx1ZXMgKDB4M2YsIDB4NTAsIDB4NTQsIDB4NmIsIDB4NzksIDB4N2YpCisJICogYXQgTENEX19JTkRFWCB3aGljaCB3ZSBkb24ndCBhbHRlcgorCSAqLworCWlmICghKGNydGNzdGF0ZVtoZWFkXS5DUlRDW05WX0NJT19DUkVfTENEX19JTkRFWF0gJiAweDQ0KSkKKwkJY3J0Y3N0YXRlW2hlYWRdLkNSVENbTlZfQ0lPX0NSRV9MQ0RfX0lOREVYXSA9IDA7Cit9CisKKworc3RhdGljIHZvaWQgbnYwNF9kYWNfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaGVhZCA9IG5vdXZlYXVfY3J0YyhlbmNvZGVyLT5jcnRjKS0+aW5kZXg7CisKKwlOVl9UUkFDRShkZXYsICIlcyBjYWxsZWQgZm9yIGVuY29kZXIgJWRcbiIsIF9fZnVuY19fLAorCQkgICAgICBudl9lbmNvZGVyLT5kY2ItPmluZGV4KTsKKworCWlmIChudl9nZjRfZGlzcF9hcmNoKGRldikpIHsKKwkJc3RydWN0IGRybV9lbmNvZGVyICpyZWJpbmQ7CisJCXVpbnQzMl90IGRhY19vZmZzZXQgPSBudjA0X2RhY19vdXRwdXRfb2Zmc2V0KGVuY29kZXIpOworCQl1aW50MzJfdCBvdGhlcmRhYzsKKworCQkvKiBiaXQgMTYtMTkgYXJlIGJpdHMgdGhhdCBhcmUgc2V0IG9uIHNvbWUgRzcwIGNhcmRzLAorCQkgKiBidXQgZG9uJ3Qgc2VlbSB0byBoYXZlIG11Y2ggZWZmZWN0ICovCisJCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX0RBQ0NMSyArIGRhY19vZmZzZXQsCisJCQkgICAgICBoZWFkIDw8IDggfCBOVl9QUkFNREFDX0RBQ0NMS19TRUxfREFDQ0xLKTsKKwkJLyogZm9yY2UgYW55IG90aGVyIHZnYSBlbmNvZGVycyB0byBiaW5kIHRvIHRoZSBvdGhlciBjcnRjICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmViaW5kLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKKwkJCWlmIChyZWJpbmQgPT0gZW5jb2RlcgorCQkJICAgIHx8IG5vdXZlYXVfZW5jb2RlcihyZWJpbmQpLT5kY2ItPnR5cGUgIT0gT1VUUFVUX0FOQUxPRykKKwkJCQljb250aW51ZTsKKworCQkJZGFjX29mZnNldCA9IG52MDRfZGFjX291dHB1dF9vZmZzZXQocmViaW5kKTsKKwkJCW90aGVyZGFjID0gTlZSZWFkUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19EQUNDTEsgKyBkYWNfb2Zmc2V0KTsKKwkJCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX0RBQ0NMSyArIGRhY19vZmZzZXQsCisJCQkJICAgICAgKG90aGVyZGFjICYgfjB4MDEwMCkgfCAoaGVhZCBeIDEpIDw8IDgpOworCQl9CisJfQorCisJLyogVGhpcyBjb3VsZCB1c2UgcmVmaW5lbWVudCBmb3IgZmxhdHBhbmVscywgYnV0IGl0IHNob3VsZCB3b3JrIHRoaXMgd2F5ICovCisJaWYgKGRldl9wcml2LT5jaGlwc2V0IDwgMHg0NCkKKwkJTlZXcml0ZVJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfVEVTVF9DT05UUk9MICsgbnYwNF9kYWNfb3V0cHV0X29mZnNldChlbmNvZGVyKSwgMHhmMDAwMDAwMCk7CisJZWxzZQorCQlOVldyaXRlUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19URVNUX0NPTlRST0wgKyBudjA0X2RhY19vdXRwdXRfb2Zmc2V0KGVuY29kZXIpLCAweDAwMTAwMDAwKTsKK30KKworc3RhdGljIHZvaWQgbnYwNF9kYWNfY29tbWl0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhlbmNvZGVyLT5jcnRjKTsKKwlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICpoZWxwZXIgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKworCWhlbHBlci0+ZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKKworCU5WX0lORk8oZGV2LCAiT3V0cHV0ICVzIGlzIHJ1bm5pbmcgb24gQ1JUQyAlZCB1c2luZyBvdXRwdXQgJWNcbiIsCisJCWRybV9nZXRfY29ubmVjdG9yX25hbWUoJm5vdXZlYXVfZW5jb2Rlcl9jb25uZWN0b3JfZ2V0KG52X2VuY29kZXIpLT5iYXNlKSwKKwkJbnZfY3J0Yy0+aW5kZXgsICdAJyArIGZmcyhudl9lbmNvZGVyLT5kY2ItPm9yKSk7Cit9CisKK3ZvaWQgbnYwNF9kYWNfdXBkYXRlX2RhY2NsayhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2IgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2RlciktPmRjYjsKKworCWlmIChudl9nZjRfZGlzcF9hcmNoKGRldikpIHsKKwkJdWludDMyX3QgKmRhY191c2VycyA9ICZkZXZfcHJpdi0+ZGFjX3VzZXJzW2ZmcyhkY2ItPm9yKSAtIDFdOworCQlpbnQgZGFjY2xrX29mZiA9IE5WX1BSQU1EQUNfREFDQ0xLICsgbnYwNF9kYWNfb3V0cHV0X29mZnNldChlbmNvZGVyKTsKKwkJdWludDMyX3QgZGFjY2xrID0gTlZSZWFkUkFNREFDKGRldiwgMCwgZGFjY2xrX29mZik7CisKKwkJaWYgKGVuYWJsZSkgeworCQkJKmRhY191c2VycyB8PSAxIDw8IGRjYi0+aW5kZXg7CisJCQlOVldyaXRlUkFNREFDKGRldiwgMCwgZGFjY2xrX29mZiwgZGFjY2xrIHwgTlZfUFJBTURBQ19EQUNDTEtfU0VMX0RBQ0NMSyk7CisKKwkJfSBlbHNlIHsKKwkJCSpkYWNfdXNlcnMgJj0gfigxIDw8IGRjYi0+aW5kZXgpOworCQkJaWYgKCEqZGFjX3VzZXJzKQorCQkJCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBkYWNjbGtfb2ZmLAorCQkJCQlkYWNjbGsgJiB+TlZfUFJBTURBQ19EQUNDTEtfU0VMX0RBQ0NMSyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIG52MDRfZGFjX2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisKKwlpZiAobnZfZW5jb2Rlci0+bGFzdF9kcG1zID09IG1vZGUpCisJCXJldHVybjsKKwludl9lbmNvZGVyLT5sYXN0X2RwbXMgPSBtb2RlOworCisJTlZfSU5GTyhkZXYsICJTZXR0aW5nIGRwbXMgbW9kZSAlZCBvbiB2Z2EgZW5jb2RlciAob3V0cHV0ICVkKVxuIiwKKwkJICAgICBtb2RlLCBudl9lbmNvZGVyLT5kY2ItPmluZGV4KTsKKworCW52MDRfZGFjX3VwZGF0ZV9kYWNjbGsoZW5jb2RlciwgbW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKTsKK30KKworc3RhdGljIHZvaWQgbnYwNF9kYWNfc2F2ZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCisJaWYgKG52X2dmNF9kaXNwX2FyY2goZGV2KSkKKwkJbnZfZW5jb2Rlci0+cmVzdG9yZS5vdXRwdXQgPSBOVlJlYWRSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX0RBQ0NMSyArCisJCQkJCQkJICBudjA0X2RhY19vdXRwdXRfb2Zmc2V0KGVuY29kZXIpKTsKK30KKworc3RhdGljIHZvaWQgbnYwNF9kYWNfcmVzdG9yZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCisJaWYgKG52X2dmNF9kaXNwX2FyY2goZGV2KSkKKwkJTlZXcml0ZVJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfREFDQ0xLICsgbnYwNF9kYWNfb3V0cHV0X29mZnNldChlbmNvZGVyKSwKKwkJCSAgICAgIG52X2VuY29kZXItPnJlc3RvcmUub3V0cHV0KTsKKworCW52X2VuY29kZXItPmxhc3RfZHBtcyA9IE5WX0RQTVNfQ0xFQVJFRDsKK30KKworc3RhdGljIHZvaWQgbnYwNF9kYWNfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKworCU5WX0RFQlVHKGVuY29kZXItPmRldiwgIlxuIik7CisKKwlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOworCWtmcmVlKG52X2VuY29kZXIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyBudjA0X2RhY19oZWxwZXJfZnVuY3MgPSB7CisJLmRwbXMgPSBudjA0X2RhY19kcG1zLAorCS5zYXZlID0gbnYwNF9kYWNfc2F2ZSwKKwkucmVzdG9yZSA9IG52MDRfZGFjX3Jlc3RvcmUsCisJLm1vZGVfZml4dXAgPSBudjA0X2RhY19tb2RlX2ZpeHVwLAorCS5wcmVwYXJlID0gbnYwNF9kYWNfcHJlcGFyZSwKKwkuY29tbWl0ID0gbnYwNF9kYWNfY29tbWl0LAorCS5tb2RlX3NldCA9IG52MDRfZGFjX21vZGVfc2V0LAorCS5kZXRlY3QgPSBudjA0X2RhY19kZXRlY3QKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIG52MTdfZGFjX2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcyA9IG52MDRfZGFjX2RwbXMsCisJLnNhdmUgPSBudjA0X2RhY19zYXZlLAorCS5yZXN0b3JlID0gbnYwNF9kYWNfcmVzdG9yZSwKKwkubW9kZV9maXh1cCA9IG52MDRfZGFjX21vZGVfZml4dXAsCisJLnByZXBhcmUgPSBudjA0X2RhY19wcmVwYXJlLAorCS5jb21taXQgPSBudjA0X2RhY19jb21taXQsCisJLm1vZGVfc2V0ID0gbnYwNF9kYWNfbW9kZV9zZXQsCisJLmRldGVjdCA9IG52MTdfZGFjX2RldGVjdAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9mdW5jcyBudjA0X2RhY19mdW5jcyA9IHsKKwkuZGVzdHJveSA9IG52MDRfZGFjX2Rlc3Ryb3ksCit9OworCitpbnQgbnYwNF9kYWNfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmVudHJ5KQoreworCWNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmhlbHBlcjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IE5VTEw7CisKKwludl9lbmNvZGVyID0ga3phbGxvYyhzaXplb2YoKm52X2VuY29kZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW52X2VuY29kZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJZW5jb2RlciA9IHRvX2RybV9lbmNvZGVyKG52X2VuY29kZXIpOworCisJbnZfZW5jb2Rlci0+ZGNiID0gZW50cnk7CisJbnZfZW5jb2Rlci0+b3IgPSBmZnMoZW50cnktPm9yKSAtIDE7CisKKwlpZiAobnZfZ2Y0X2Rpc3BfYXJjaChkZXYpKQorCQloZWxwZXIgPSAmbnYxN19kYWNfaGVscGVyX2Z1bmNzOworCWVsc2UKKwkJaGVscGVyID0gJm52MDRfZGFjX2hlbHBlcl9mdW5jczsKKworCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmbnYwNF9kYWNfZnVuY3MsIERSTV9NT0RFX0VOQ09ERVJfREFDKTsKKwlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKGVuY29kZXIsIGhlbHBlcik7CisKKwllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IGVudHJ5LT5oZWFkczsKKwllbmNvZGVyLT5wb3NzaWJsZV9jbG9uZXMgPSAwOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2RmcC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9kZnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWIzMzMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9kZnAuYwpAQCAtMCwwICsxLDYyMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzIE5WSURJQSwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAyMDA2IERhdmUgQWlybGllCisgKiBDb3B5cmlnaHQgMjAwNyBNYWFydGVuIE1hYXRodWlzCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA5IFN0dWFydCBCZW5uZXR0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZW5jb2Rlci5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY29ubmVjdG9yLmgiCisjaW5jbHVkZSAibm91dmVhdV9jcnRjLmgiCisjaW5jbHVkZSAibm91dmVhdV9ody5oIgorI2luY2x1ZGUgIm52cmVnLmgiCisKKyNkZWZpbmUgRlBfVEdfQ09OVFJPTF9PTiAgKE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9ESVNQRU5fUE9TIHwJXAorCQkJICAgTlZfUFJBTURBQ19GUF9UR19DT05UUk9MX0hTWU5DX1BPUyB8CQlcCisJCQkgICBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfVlNZTkNfUE9TKQorI2RlZmluZSBGUF9UR19DT05UUk9MX09GRiAoTlZfUFJBTURBQ19GUF9UR19DT05UUk9MX0RJU1BFTl9ESVNBQkxFIHwJXAorCQkJICAgTlZfUFJBTURBQ19GUF9UR19DT05UUk9MX0hTWU5DX0RJU0FCTEUgfAlcCisJCQkgICBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfVlNZTkNfRElTQUJMRSkKKworc3RhdGljIGlubGluZSBib29sIGlzX2ZwY19vZmYodWludDMyX3QgZnBjKQoreworCXJldHVybiAoKGZwYyAmIChGUF9UR19DT05UUk9MX09OIHwgRlBfVEdfQ09OVFJPTF9PRkYpKSA9PQorCQkJRlBfVEdfQ09OVFJPTF9PRkYpOworfQorCitpbnQgbnYwNF9kZnBfZ2V0X2JvdW5kX2hlYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50KQoreworCS8qIHNwZWNpYWwgY2FzZSBvZiBudl9yZWFkX3RtZHMgdG8gZmluZCBjcnRjIGFzc29jaWF0ZWQgd2l0aCBhbiBvdXRwdXQuCisJICogdGhpcyBkb2VzIG5vdCBnaXZlIGEgY29ycmVjdCBhbnN3ZXIgZm9yIG9mZi1jaGlwIGR2aSwgYnV0IHRoZXJlJ3Mgbm8KKwkgKiB1c2UgZm9yIHN1Y2ggYW4gYW5zd2VyIGFueXdheQorCSAqLworCWludCByYW1kYWMgPSAoZGNiZW50LT5vciAmIE9VVFBVVF9DKSA+PiAyOworCisJTlZXcml0ZVJBTURBQyhkZXYsIHJhbWRhYywgTlZfUFJBTURBQ19GUF9UTURTX0NPTlRST0wsCisJTlZfUFJBTURBQ19GUF9UTURTX0NPTlRST0xfV1JJVEVfRElTQUJMRSB8IDB4NCk7CisJcmV0dXJuICgoTlZSZWFkUkFNREFDKGRldiwgcmFtZGFjLCBOVl9QUkFNREFDX0ZQX1RNRFNfREFUQSkgJiAweDgpID4+IDMpIF4gcmFtZGFjOworfQorCit2b2lkIG52MDRfZGZwX2JpbmRfaGVhZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQsCisJCQlpbnQgaGVhZCwgYm9vbCBkbCkKK3sKKwkvKiBUaGUgQklPUyBzY3JpcHRzIGRvbid0IGRvIHRoaXMgZm9yIHVzLCBzYWRseQorCSAqIEx1Y2tpbHkgd2UgZG8ga25vdyB0aGUgdmFsdWVzIDstKQorCSAqCisJICogaGVhZCA8IDAgaW5kaWNhdGVzIHdlIHdpc2ggdG8gZm9yY2UgYSBzZXR0aW5nIHdpdGggdGhlIG92ZXJyaWRldmFsCisJICogKGZvciBWVCByZXN0b3JlIGV0Yy4pCisJICovCisKKwlpbnQgcmFtZGFjID0gKGRjYmVudC0+b3IgJiBPVVRQVVRfQykgPj4gMjsKKwl1aW50OF90IHRtZHMwNCA9IDB4ODA7CisKKwlpZiAoaGVhZCAhPSByYW1kYWMpCisJCXRtZHMwNCA9IDB4ODg7CisKKwlpZiAoZGNiZW50LT50eXBlID09IE9VVFBVVF9MVkRTKQorCQl0bWRzMDQgfD0gMHgwMTsKKworCW52X3dyaXRlX3RtZHMoZGV2LCBkY2JlbnQtPm9yLCAwLCAweDA0LCB0bWRzMDQpOworCisJaWYgKGRsKQkvKiBkdWFsIGxpbmsgKi8KKwkJbnZfd3JpdGVfdG1kcyhkZXYsIGRjYmVudC0+b3IsIDEsIDB4MDQsIHRtZHMwNCBeIDB4MDgpOworfQorCit2b2lkIG52MDRfZGZwX2Rpc2FibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnYwNF9jcnRjX3JlZyAqY3J0Y3N0YXRlID0gZGV2X3ByaXYtPm1vZGVfcmVnLmNydGNfcmVnOworCisJaWYgKE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTCkgJgorCSAgICBGUF9UR19DT05UUk9MX09OKSB7CisJCS8qIGRpZ2l0YWwgcmVtbmFudHMgbXVzdCBiZSBjbGVhbmVkIGJlZm9yZSBuZXcgY3J0YworCQkgKiB2YWx1ZXMgcHJvZ3JhbW1lZC4gIGRlbGF5IGlzIHRpbWUgZm9yIHRoZSB2Z2Egc3R1ZmYKKwkJICogdG8gcmVhbGlzZSBpdCdzIGluIGNvbnRyb2wgYWdhaW4KKwkJICovCisJCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0wsCisJCQkgICAgICBGUF9UR19DT05UUk9MX09GRik7CisJCW1zbGVlcCg1MCk7CisJfQorCS8qIGRvbid0IGluYWR2ZXJ0ZW50bHkgdHVybiBpdCBvbiB3aGVuIHN0YXRlIHdyaXR0ZW4gbGF0ZXIgKi8KKwljcnRjc3RhdGVbaGVhZF0uZnBfY29udHJvbCA9IEZQX1RHX0NPTlRST0xfT0ZGOworfQorCit2b2lkIG52MDRfZGZwX3VwZGF0ZV9mcF9jb250cm9sKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjOworCXVpbnQzMl90ICpmcGM7CisKKwlpZiAobW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKSB7CisJCW52X2NydGMgPSBub3V2ZWF1X2NydGMoZW5jb2Rlci0+Y3J0Yyk7CisJCWZwYyA9ICZkZXZfcHJpdi0+bW9kZV9yZWcuY3J0Y19yZWdbbnZfY3J0Yy0+aW5kZXhdLmZwX2NvbnRyb2w7CisKKwkJaWYgKGlzX2ZwY19vZmYoKmZwYykpIHsKKwkJCS8qIHVzaW5nIHNhdmVkIHZhbHVlIGlzIG9rLCBhcyAoaXNfZGlnaXRhbCAmJiBkcG1zX29uICYmCisJCQkgKiBmcF9jb250cm9sPT1PRkYpIGlzIChhdCBwcmVzZW50KSAqb25seSogdHJ1ZSB3aGVuCisJCQkgKiBmcGMncyBtb3N0IHJlY2VudCBjaGFuZ2Ugd2FzIGJ5IGJlbG93ICJvZmYiIGNvZGUKKwkJCSAqLworCQkJKmZwYyA9IG52X2NydGMtPmRwbXNfc2F2ZWRfZnBfY29udHJvbDsKKwkJfQorCisJCW52X2NydGMtPmZwX3VzZXJzIHw9IDEgPDwgbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpLT5kY2ItPmluZGV4OworCQlOVldyaXRlUkFNREFDKGRldiwgbnZfY3J0Yy0+aW5kZXgsIE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTCwgKmZwYyk7CisJfSBlbHNlIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJCW52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJCQlmcGMgPSAmZGV2X3ByaXYtPm1vZGVfcmVnLmNydGNfcmVnW252X2NydGMtPmluZGV4XS5mcF9jb250cm9sOworCisJCQludl9jcnRjLT5mcF91c2VycyAmPSB+KDEgPDwgbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpLT5kY2ItPmluZGV4KTsKKwkJCWlmICghaXNfZnBjX29mZigqZnBjKSAmJiAhbnZfY3J0Yy0+ZnBfdXNlcnMpIHsKKwkJCQludl9jcnRjLT5kcG1zX3NhdmVkX2ZwX2NvbnRyb2wgPSAqZnBjOworCQkJCS8qIGN1dCB0aGUgRlAgb3V0cHV0ICovCisJCQkJKmZwYyAmPSB+RlBfVEdfQ09OVFJPTF9PTjsKKwkJCQkqZnBjIHw9IEZQX1RHX0NPTlRST0xfT0ZGOworCQkJCU5WV3JpdGVSQU1EQUMoZGV2LCBudl9jcnRjLT5pbmRleCwKKwkJCQkJICAgICAgTlZfUFJBTURBQ19GUF9UR19DT05UUk9MLCAqZnBjKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGJvb2wgbnYwNF9kZnBfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvciA9IG5vdXZlYXVfZW5jb2Rlcl9jb25uZWN0b3JfZ2V0KG52X2VuY29kZXIpOworCisJLyogRm9yIGludGVybmFsIHBhbmVscyBhbmQgZ3B1IHNjYWxpbmcgb24gRFZJIHdlIG5lZWQgdGhlIG5hdGl2ZSBtb2RlICovCisJaWYgKG52X2Nvbm5lY3Rvci0+c2NhbGluZ19tb2RlICE9IERSTV9NT0RFX1NDQUxFX05PTkUpIHsKKwkJaWYgKCFudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlKQorCQkJcmV0dXJuIGZhbHNlOworCQludl9lbmNvZGVyLT5tb2RlID0gKm52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGU7CisJCWFkanVzdGVkX21vZGUtPmNsb2NrID0gbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZS0+Y2xvY2s7CisJfSBlbHNlIHsKKwkJbnZfZW5jb2Rlci0+bW9kZSA9ICphZGp1c3RlZF9tb2RlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBudjA0X2RmcF9wcmVwYXJlX3NlbF9jbGsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIsIGludCBoZWFkKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52MDRfbW9kZV9zdGF0ZSAqc3RhdGUgPSAmZGV2X3ByaXYtPm1vZGVfcmVnOworCXVpbnQzMl90IGJpdHMxNjE4ID0gbnZfZW5jb2Rlci0+ZGNiLT5vciAmIE9VVFBVVF9BID8gMHgxMDAwMCA6IDB4NDAwMDA7CisKKwlpZiAobnZfZW5jb2Rlci0+ZGNiLT5sb2NhdGlvbiAhPSBEQ0JfTE9DX09OX0NISVApCisJCXJldHVybjsKKworCS8qIFNFTF9DTEsgaXMgb25seSB1c2VkIG9uIHRoZSBwcmltYXJ5IHJhbWRhYworCSAqIEl0IHRvZ2dsZXMgc3ByZWFkIHNwZWN0cnVtIFBMTCBvdXRwdXQgYW5kIHNldHMgdGhlIGJpbmRpbmdzIG9mIFBMTHMKKwkgKiB0byBoZWFkcyBvbiBkaWdpdGFsIG91dHB1dHMKKwkgKi8KKwlpZiAoaGVhZCkKKwkJc3RhdGUtPnNlbF9jbGsgfD0gYml0czE2MTg7CisJZWxzZQorCQlzdGF0ZS0+c2VsX2NsayAmPSB+Yml0czE2MTg7CisKKwkvKiBudjMwOgorCSAqCWJpdCAwCQlOVkNsayBzcHJlYWQgc3BlY3RydW0gb24vb2ZmCisJICoJYml0IDIJCU1lbUNsayBzcHJlYWQgc3BlY3RydW0gb24vb2ZmCisJICogCWJpdCA0CQlQaXhDbGsxIHNwcmVhZCBzcGVjdHJ1bSBvbi9vZmYgdG9nZ2xlCisJICogCWJpdCA2CQlQaXhDbGsyIHNwcmVhZCBzcGVjdHJ1bSBvbi9vZmYgdG9nZ2xlCisJICoKKwkgKiBudjQwIChvYnNlcnZhdGlvbnMgZnJvbSBiaW9zIGJlaGF2aW91ciBhbmQgbW1pbyB0cmFjZXMpOgorCSAqIAliaXRzIDQmNglhcyBmb3IgbnYzMAorCSAqIAliaXRzIDUmNwloZWFkIGRlcGVuZGVudCBhcyBmb3IgYml0cyA0JjYsIGJ1dCBkbyBub3QgYXBwZWFyIHdpdGggNCY2OworCSAqIAkJCW1heWJlIGEgZGlmZmVyZW50IHNwcmVhZCBtb2RlCisJICogCWJpdHMgOCYxMAlzZWVuIG9uIGR1YWwtbGluayBkdmkgb3V0cHV0cywgcHVycG9zZSB1bmtub3duIChzZXQgYnkgUE9TVCBzY3JpcHRzKQorCSAqIAlUaGUgbG9naWMgYmVoaW5kIHR1cm5pbmcgc3ByZWFkIHNwZWN0cnVtIG9uL29mZiBpbiB0aGUgZmlyc3QgcGxhY2UsCisJICogCWFuZCB3aGljaCBiaXQtcGFpciB0byB1c2UsIGlzIHVuY2xlYXIgb24gbnY0MCAoZm9yIGVhcmxpZXIgY2FyZHMsIHRoZSBmcCB0YWJsZQorCSAqIAllbnRyeSBoYXMgdGhlIG5lY2Vzc2FyeSBpbmZvKQorCSAqLworCWlmIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX0xWRFMgJiYgZGV2X3ByaXYtPnNhdmVkX3JlZy5zZWxfY2xrICYgMHhmMCkgeworCQlpbnQgc2hpZnQgPSAoZGV2X3ByaXYtPnNhdmVkX3JlZy5zZWxfY2xrICYgMHg1MCkgPyAwIDogMTsKKworCQlzdGF0ZS0+c2VsX2NsayAmPSB+MHhmMDsKKwkJc3RhdGUtPnNlbF9jbGsgfD0gKGhlYWQgPyAweDQwIDogMHgxMCkgPDwgc2hpZnQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBudjA0X2RmcF9wcmVwYXJlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmhlbHBlciA9IGVuY29kZXItPmhlbHBlcl9wcml2YXRlOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaGVhZCA9IG5vdXZlYXVfY3J0YyhlbmNvZGVyLT5jcnRjKS0+aW5kZXg7CisJc3RydWN0IG52MDRfY3J0Y19yZWcgKmNydGNzdGF0ZSA9IGRldl9wcml2LT5tb2RlX3JlZy5jcnRjX3JlZzsKKwl1aW50OF90ICpjcl9sY2QgPSAmY3J0Y3N0YXRlW2hlYWRdLkNSVENbTlZfQ0lPX0NSRV9MQ0RfX0lOREVYXTsKKwl1aW50OF90ICpjcl9sY2Rfb3RoID0gJmNydGNzdGF0ZVtoZWFkIF4gMV0uQ1JUQ1tOVl9DSU9fQ1JFX0xDRF9fSU5ERVhdOworCisJaGVscGVyLT5kcG1zKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT0ZGKTsKKworCW52MDRfZGZwX3ByZXBhcmVfc2VsX2NsayhkZXYsIG52X2VuY29kZXIsIGhlYWQpOworCisJLyogU29tZSBOVjR4IGhhdmUgdW5rbm93biB2YWx1ZXMgKDB4M2YsIDB4NTAsIDB4NTQsIDB4NmIsIDB4NzksIDB4N2YpCisJICogYXQgTENEX19JTkRFWCB3aGljaCB3ZSBkb24ndCBhbHRlcgorCSAqLworCWlmICghKCpjcl9sY2QgJiAweDQ0KSkgeworCQkqY3JfbGNkID0gMHgzOworCisJCWlmIChudl90d29faGVhZHMoZGV2KSkgeworCQkJaWYgKG52X2VuY29kZXItPmRjYi0+bG9jYXRpb24gPT0gRENCX0xPQ19PTl9DSElQKQorCQkJCSpjcl9sY2QgfD0gaGVhZCA/IDB4MCA6IDB4ODsKKwkJCWVsc2UgeworCQkJCSpjcl9sY2QgfD0gKG52X2VuY29kZXItPmRjYi0+b3IgPDwgNCkgJiAweDMwOworCQkJCWlmIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX0xWRFMpCisJCQkJCSpjcl9sY2QgfD0gMHgzMDsKKwkJCQlpZiAoKCpjcl9sY2QgJiAweDMwKSA9PSAoKmNyX2xjZF9vdGggJiAweDMwKSkgeworCQkJCQkvKiBhdm9pZCBiZWluZyBjb25uZWN0ZWQgdG8gYm90aCBjcnRjcyAqLworCQkJCQkqY3JfbGNkX290aCAmPSB+MHgzMDsKKwkJCQkJTlZXcml0ZVZnYUNydGMoZGV2LCBoZWFkIF4gMSwKKwkJCQkJCSAgICAgICBOVl9DSU9fQ1JFX0xDRF9fSU5ERVgsCisJCQkJCQkgICAgICAgKmNyX2xjZF9vdGgpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZCBudjA0X2RmcF9tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCSAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGVuY29kZXItPmNydGMpOworCXN0cnVjdCBudjA0X2NydGNfcmVnICpyZWdwID0gJmRldl9wcml2LT5tb2RlX3JlZy5jcnRjX3JlZ1tudl9jcnRjLT5pbmRleF07CisJc3RydWN0IG52MDRfY3J0Y19yZWcgKnNhdmVwID0gJmRldl9wcml2LT5zYXZlZF9yZWcuY3J0Y19yZWdbbnZfY3J0Yy0+aW5kZXhdOworCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0gbm91dmVhdV9jcnRjX2Nvbm5lY3Rvcl9nZXQobnZfY3J0Yyk7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqb3V0cHV0X21vZGUgPSAmbnZfZW5jb2Rlci0+bW9kZTsKKwl1aW50MzJfdCBtb2RlX3JhdGlvLCBwYW5lbF9yYXRpbzsKKworCU5WX0RFQlVHKGRldiwgIk91dHB1dCBtb2RlIG9uIENSVEMgJWQ6XG4iLCBudl9jcnRjLT5pbmRleCk7CisJZHJtX21vZGVfZGVidWdfcHJpbnRtb2RlbGluZShvdXRwdXRfbW9kZSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBGUCByZWdpc3RlcnMgaW4gdGhpcyBDUlRDLiAqLworCXJlZ3AtPmZwX2hvcml6X3JlZ3NbRlBfRElTUExBWV9FTkRdID0gb3V0cHV0X21vZGUtPmhkaXNwbGF5IC0gMTsKKwlyZWdwLT5mcF9ob3Jpel9yZWdzW0ZQX1RPVEFMXSA9IG91dHB1dF9tb2RlLT5odG90YWwgLSAxOworCWlmICghbnZfZ2Y0X2Rpc3BfYXJjaChkZXYpIHx8CisJICAgIChvdXRwdXRfbW9kZS0+aHN5bmNfc3RhcnQgLSBvdXRwdXRfbW9kZS0+aGRpc3BsYXkpID49CisJCQkJCWRldl9wcml2LT52Ymlvcy0+ZGlnaXRhbF9taW5fZnJvbnRfcG9yY2gpCisJCXJlZ3AtPmZwX2hvcml6X3JlZ3NbRlBfQ1JUQ10gPSBvdXRwdXRfbW9kZS0+aGRpc3BsYXk7CisJZWxzZQorCQlyZWdwLT5mcF9ob3Jpel9yZWdzW0ZQX0NSVENdID0gb3V0cHV0X21vZGUtPmhzeW5jX3N0YXJ0IC0gZGV2X3ByaXYtPnZiaW9zLT5kaWdpdGFsX21pbl9mcm9udF9wb3JjaCAtIDE7CisJcmVncC0+ZnBfaG9yaXpfcmVnc1tGUF9TWU5DX1NUQVJUXSA9IG91dHB1dF9tb2RlLT5oc3luY19zdGFydCAtIDE7CisJcmVncC0+ZnBfaG9yaXpfcmVnc1tGUF9TWU5DX0VORF0gPSBvdXRwdXRfbW9kZS0+aHN5bmNfZW5kIC0gMTsKKwlyZWdwLT5mcF9ob3Jpel9yZWdzW0ZQX1ZBTElEX1NUQVJUXSA9IG91dHB1dF9tb2RlLT5oc2tldzsKKwlyZWdwLT5mcF9ob3Jpel9yZWdzW0ZQX1ZBTElEX0VORF0gPSBvdXRwdXRfbW9kZS0+aGRpc3BsYXkgLSAxOworCisJcmVncC0+ZnBfdmVydF9yZWdzW0ZQX0RJU1BMQVlfRU5EXSA9IG91dHB1dF9tb2RlLT52ZGlzcGxheSAtIDE7CisJcmVncC0+ZnBfdmVydF9yZWdzW0ZQX1RPVEFMXSA9IG91dHB1dF9tb2RlLT52dG90YWwgLSAxOworCXJlZ3AtPmZwX3ZlcnRfcmVnc1tGUF9DUlRDXSA9IG91dHB1dF9tb2RlLT52dG90YWwgLSA1IC0gMTsKKwlyZWdwLT5mcF92ZXJ0X3JlZ3NbRlBfU1lOQ19TVEFSVF0gPSBvdXRwdXRfbW9kZS0+dnN5bmNfc3RhcnQgLSAxOworCXJlZ3AtPmZwX3ZlcnRfcmVnc1tGUF9TWU5DX0VORF0gPSBvdXRwdXRfbW9kZS0+dnN5bmNfZW5kIC0gMTsKKwlyZWdwLT5mcF92ZXJ0X3JlZ3NbRlBfVkFMSURfU1RBUlRdID0gMDsKKwlyZWdwLT5mcF92ZXJ0X3JlZ3NbRlBfVkFMSURfRU5EXSA9IG91dHB1dF9tb2RlLT52ZGlzcGxheSAtIDE7CisKKwkvKiBiaXQyNjogYSBiaXQgc2VlbiBvbiBzb21lIGc3eCwgbm8gYXMgeWV0IGRpc2Nlcm5hYmxlIHB1cnBvc2UgKi8KKwlyZWdwLT5mcF9jb250cm9sID0gTlZfUFJBTURBQ19GUF9UR19DT05UUk9MX0RJU1BFTl9QT1MgfAorCQkJICAgKHNhdmVwLT5mcF9jb250cm9sICYgKDEgPDwgMjYgfCBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfUkVBRF9QUk9HKSk7CisJLyogRGVhbCB3aXRoIHZzeW5jL2hzeW5jIHBvbGFyaXR5ICovCisJLyogTFZEUyBzY3JlZW5zIGRvIHNldCB0aGlzLCBidXQgbW9kZXMgd2l0aCArdmUgc3luY3MgYXJlIHZlcnkgcmFyZSAqLworCWlmIChvdXRwdXRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX1BWU1lOQykKKwkJcmVncC0+ZnBfY29udHJvbCB8PSBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfVlNZTkNfUE9TOworCWlmIChvdXRwdXRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX1BIU1lOQykKKwkJcmVncC0+ZnBfY29udHJvbCB8PSBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfSFNZTkNfUE9TOworCS8qIHBhbmVsIHNjYWxpbmcgZmlyc3QsIGFzIG5hdGl2ZSB3b3VsZCBnZXQgc2V0IG90aGVyd2lzZSAqLworCWlmIChudl9jb25uZWN0b3ItPnNjYWxpbmdfbW9kZSA9PSBEUk1fTU9ERV9TQ0FMRV9OT05FIHx8CisJICAgIG52X2Nvbm5lY3Rvci0+c2NhbGluZ19tb2RlID09IERSTV9NT0RFX1NDQUxFX0NFTlRFUikJLyogcGFuZWwgaGFuZGxlcyBpdCAqLworCQlyZWdwLT5mcF9jb250cm9sIHw9IE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9NT0RFX0NFTlRFUjsKKwllbHNlIGlmIChhZGp1c3RlZF9tb2RlLT5oZGlzcGxheSA9PSBvdXRwdXRfbW9kZS0+aGRpc3BsYXkgJiYKKwkJIGFkanVzdGVkX21vZGUtPnZkaXNwbGF5ID09IG91dHB1dF9tb2RlLT52ZGlzcGxheSkgLyogbmF0aXZlIG1vZGUgKi8KKwkJcmVncC0+ZnBfY29udHJvbCB8PSBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfTU9ERV9OQVRJVkU7CisJZWxzZSAvKiBncHUgbmVlZHMgdG8gc2NhbGUgKi8KKwkJcmVncC0+ZnBfY29udHJvbCB8PSBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfTU9ERV9TQ0FMRTsKKwlpZiAobnZSZWFkRVhUREVWKGRldiwgTlZfUEVYVERFVl9CT09UXzApICYgTlZfUEVYVERFVl9CT09UXzBfU1RSQVBfRlBfSUZBQ0VfMTJCSVQpCisJCXJlZ3AtPmZwX2NvbnRyb2wgfD0gTlZfUFJBTURBQ19GUF9UR19DT05UUk9MX1dJRFRIXzEyOworCWlmIChudl9lbmNvZGVyLT5kY2ItPmxvY2F0aW9uICE9IERDQl9MT0NfT05fQ0hJUCAmJgorCSAgICBvdXRwdXRfbW9kZS0+Y2xvY2sgPiAxNjUwMDApCisJCXJlZ3AtPmZwX2NvbnRyb2wgfD0gKDIgPDwgMjQpOworCWlmIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX0xWRFMpIHsKKwkJYm9vbCBkdWFsbGluaywgZHVtbXk7CisKKwkJbm91dmVhdV9iaW9zX3BhcnNlX2x2ZHNfdGFibGUoZGV2LCBudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlLT4KKwkJCQkJICAgICAgY2xvY2ssICZkdWFsbGluaywgJmR1bW15KTsKKwkJaWYgKGR1YWxsaW5rKQorCQkJcmVncC0+ZnBfY29udHJvbCB8PSAoOCA8PCAyOCk7CisJfSBlbHNlCisJaWYgKG91dHB1dF9tb2RlLT5jbG9jayA+IDE2NTAwMCkKKwkJcmVncC0+ZnBfY29udHJvbCB8PSAoOCA8PCAyOCk7CisKKwlyZWdwLT5mcF9kZWJ1Z18wID0gTlZfUFJBTURBQ19GUF9ERUJVR18wX1lXRUlHSFRfUk9VTkQgfAorCQkJICAgTlZfUFJBTURBQ19GUF9ERUJVR18wX1hXRUlHSFRfUk9VTkQgfAorCQkJICAgTlZfUFJBTURBQ19GUF9ERUJVR18wX1lJTlRFUlBfQklMSU5FQVIgfAorCQkJICAgTlZfUFJBTURBQ19GUF9ERUJVR18wX1hJTlRFUlBfQklMSU5FQVIgfAorCQkJICAgTlZfUkFNREFDX0ZQX0RFQlVHXzBfVE1EU19FTkFCTEVEIHwKKwkJCSAgIE5WX1BSQU1EQUNfRlBfREVCVUdfMF9ZU0NBTEVfRU5BQkxFIHwKKwkJCSAgIE5WX1BSQU1EQUNfRlBfREVCVUdfMF9YU0NBTEVfRU5BQkxFOworCisJLyogV2Ugd2FudCBhdXRvbWF0aWMgc2NhbGluZyAqLworCXJlZ3AtPmZwX2RlYnVnXzEgPSAwOworCS8qIFRoaXMgY2FuIG92ZXJyaWRlIEhUT1RBTCBhbmQgVlRPVEFMICovCisJcmVncC0+ZnBfZGVidWdfMiA9IDA7CisKKwkvKiBVc2UgMjAuMTIgZml4ZWQgcG9pbnQgZm9ybWF0IHRvIGF2b2lkIGZsb2F0cyAqLworCW1vZGVfcmF0aW8gPSAoMSA8PCAxMikgKiBhZGp1c3RlZF9tb2RlLT5oZGlzcGxheSAvIGFkanVzdGVkX21vZGUtPnZkaXNwbGF5OworCXBhbmVsX3JhdGlvID0gKDEgPDwgMTIpICogb3V0cHV0X21vZGUtPmhkaXNwbGF5IC8gb3V0cHV0X21vZGUtPnZkaXNwbGF5OworCS8qIGlmIHJhdGlvcyBhcmUgZXF1YWwsIFNDQUxFX0FTUEVDVCB3aWxsIGF1dG9tYXRpY2FsbHkgKGFuZCBjb3JyZWN0bHkpCisJICogZ2V0IHRyZWF0ZWQgdGhlIHNhbWUgYXMgU0NBTEVfRlVMTFNDUkVFTiAqLworCWlmIChudl9jb25uZWN0b3ItPnNjYWxpbmdfbW9kZSA9PSBEUk1fTU9ERV9TQ0FMRV9BU1BFQ1QgJiYKKwkgICAgbW9kZV9yYXRpbyAhPSBwYW5lbF9yYXRpbykgeworCQl1aW50MzJfdCBkaWZmLCBzY2FsZTsKKwkJYm9vbCBkaXZpZGVfYnlfMiA9IG52X2dmNF9kaXNwX2FyY2goZGV2KTsKKworCQlpZiAobW9kZV9yYXRpbyA8IHBhbmVsX3JhdGlvKSB7CisJCQkvKiB2ZXJ0aWNhbCBuZWVkcyB0byBleHBhbmQgdG8gZ2xhc3Mgc2l6ZSAoYXV0b21hdGljKQorCQkJICogaG9yaXpvbnRhbCBuZWVkcyB0byBiZSBzY2FsZWQgYXQgdmVydGljYWwgc2NhbGUgZmFjdG9yCisJCQkgKiB0byBtYWludGFpbiBhc3BlY3QgKi8KKworCQkJc2NhbGUgPSAoMSA8PCAxMikgKiBhZGp1c3RlZF9tb2RlLT52ZGlzcGxheSAvIG91dHB1dF9tb2RlLT52ZGlzcGxheTsKKwkJCXJlZ3AtPmZwX2RlYnVnXzEgPSBOVl9QUkFNREFDX0ZQX0RFQlVHXzFfWFNDQUxFX1RFU1RNT0RFX0VOQUJMRSB8CisJCQkJCSAgIFhMQVRFKHNjYWxlLCBkaXZpZGVfYnlfMiwgTlZfUFJBTURBQ19GUF9ERUJVR18xX1hTQ0FMRV9WQUxVRSk7CisKKwkJCS8qIHJlc3RyaWN0IGFyZWEgb2Ygc2NyZWVuIHVzZWQsIGhvcml6b250YWxseSAqLworCQkJZGlmZiA9IG91dHB1dF9tb2RlLT5oZGlzcGxheSAtCisJCQkgICAgICAgb3V0cHV0X21vZGUtPnZkaXNwbGF5ICogbW9kZV9yYXRpbyAvICgxIDw8IDEyKTsKKwkJCXJlZ3AtPmZwX2hvcml6X3JlZ3NbRlBfVkFMSURfU1RBUlRdICs9IGRpZmYgLyAyOworCQkJcmVncC0+ZnBfaG9yaXpfcmVnc1tGUF9WQUxJRF9FTkRdIC09IGRpZmYgLyAyOworCQl9CisKKwkJaWYgKG1vZGVfcmF0aW8gPiBwYW5lbF9yYXRpbykgeworCQkJLyogaG9yaXpvbnRhbCBuZWVkcyB0byBleHBhbmQgdG8gZ2xhc3Mgc2l6ZSAoYXV0b21hdGljKQorCQkJICogdmVydGljYWwgbmVlZHMgdG8gYmUgc2NhbGVkIGF0IGhvcml6b250YWwgc2NhbGUgZmFjdG9yCisJCQkgKiB0byBtYWludGFpbiBhc3BlY3QgKi8KKworCQkJc2NhbGUgPSAoMSA8PCAxMikgKiBhZGp1c3RlZF9tb2RlLT5oZGlzcGxheSAvIG91dHB1dF9tb2RlLT5oZGlzcGxheTsKKwkJCXJlZ3AtPmZwX2RlYnVnXzEgPSBOVl9QUkFNREFDX0ZQX0RFQlVHXzFfWVNDQUxFX1RFU1RNT0RFX0VOQUJMRSB8CisJCQkJCSAgIFhMQVRFKHNjYWxlLCBkaXZpZGVfYnlfMiwgTlZfUFJBTURBQ19GUF9ERUJVR18xX1lTQ0FMRV9WQUxVRSk7CisKKwkJCS8qIHJlc3RyaWN0IGFyZWEgb2Ygc2NyZWVuIHVzZWQsIHZlcnRpY2FsbHkgKi8KKwkJCWRpZmYgPSBvdXRwdXRfbW9kZS0+dmRpc3BsYXkgLQorCQkJICAgICAgICgxIDw8IDEyKSAqIG91dHB1dF9tb2RlLT5oZGlzcGxheSAvIG1vZGVfcmF0aW87CisJCQlyZWdwLT5mcF92ZXJ0X3JlZ3NbRlBfVkFMSURfU1RBUlRdICs9IGRpZmYgLyAyOworCQkJcmVncC0+ZnBfdmVydF9yZWdzW0ZQX1ZBTElEX0VORF0gLT0gZGlmZiAvIDI7CisJCX0KKwl9CisKKwkvKiBPdXRwdXQgcHJvcGVydHkuICovCisJaWYgKG52X2Nvbm5lY3Rvci0+dXNlX2RpdGhlcmluZykgeworCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHgxMSkKKwkJCXJlZ3AtPmRpdGhlciA9IHNhdmVwLT5kaXRoZXIgfCAweDAwMDEwMDAwOworCQllbHNlIHsKKwkJCWludCBpOworCQkJcmVncC0+ZGl0aGVyID0gc2F2ZXAtPmRpdGhlciB8IDB4MDAwMDAwMDE7CisJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQkJcmVncC0+ZGl0aGVyX3JlZ3NbaV0gPSAweGU0ZTRlNGU0OworCQkJCXJlZ3AtPmRpdGhlcl9yZWdzW2kgKyAzXSA9IDB4NDQ0NDQ0NDQ7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHgxMSkgeworCQkJLyogcmVzZXQgdGhlbSAqLworCQkJaW50IGk7CisJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQkJcmVncC0+ZGl0aGVyX3JlZ3NbaV0gPSBzYXZlcC0+ZGl0aGVyX3JlZ3NbaV07CisJCQkJcmVncC0+ZGl0aGVyX3JlZ3NbaSArIDNdID0gc2F2ZXAtPmRpdGhlcl9yZWdzW2kgKyAzXTsKKwkJCX0KKwkJfQorCQlyZWdwLT5kaXRoZXIgPSBzYXZlcC0+ZGl0aGVyOworCX0KKworCXJlZ3AtPmZwX21hcmdpbl9jb2xvciA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIG52MDRfZGZwX2NvbW1pdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmhlbHBlciA9IGVuY29kZXItPmhlbHBlcl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoZW5jb2Rlci0+Y3J0Yyk7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlID0gbnZfZW5jb2Rlci0+ZGNiOworCWludCBoZWFkID0gbm91dmVhdV9jcnRjKGVuY29kZXItPmNydGMpLT5pbmRleDsKKworCU5WX1RSQUNFKGRldiwgIiVzIGNhbGxlZCBmb3IgZW5jb2RlciAlZFxuIiwgX19mdW5jX18sIG52X2VuY29kZXItPmRjYi0+aW5kZXgpOworCisJaWYgKGRjYmUtPnR5cGUgPT0gT1VUUFVUX1RNRFMpCisJCXJ1bl90bWRzX3RhYmxlKGRldiwgZGNiZSwgaGVhZCwgbnZfZW5jb2Rlci0+bW9kZS5jbG9jayk7CisJZWxzZSBpZiAoZGNiZS0+dHlwZSA9PSBPVVRQVVRfTFZEUykKKwkJY2FsbF9sdmRzX3NjcmlwdChkZXYsIGRjYmUsIGhlYWQsIExWRFNfUkVTRVQsIG52X2VuY29kZXItPm1vZGUuY2xvY2spOworCisJLyogdXBkYXRlIGZwX2NvbnRyb2wgc3RhdGUgZm9yIGFueSBjaGFuZ2VzIG1hZGUgYnkgc2NyaXB0cywKKwkgKiBzbyBjb3JyZWN0IHZhbHVlIGlzIHdyaXR0ZW4gYXQgRFBNUyBvbiAqLworCWRldl9wcml2LT5tb2RlX3JlZy5jcnRjX3JlZ1toZWFkXS5mcF9jb250cm9sID0KKwkJTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19GUF9UR19DT05UUk9MKTsKKworCS8qIFRoaXMgY291bGQgdXNlIHJlZmluZW1lbnQgZm9yIGZsYXRwYW5lbHMsIGJ1dCBpdCBzaG91bGQgd29yayB0aGlzIHdheSAqLworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4NDQpCisJCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX1RFU1RfQ09OVFJPTCArIG52MDRfZGFjX291dHB1dF9vZmZzZXQoZW5jb2RlciksIDB4ZjAwMDAwMDApOworCWVsc2UKKwkJTlZXcml0ZVJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfVEVTVF9DT05UUk9MICsgbnYwNF9kYWNfb3V0cHV0X29mZnNldChlbmNvZGVyKSwgMHgwMDEwMDAwMCk7CisKKwloZWxwZXItPmRwbXMoZW5jb2RlciwgRFJNX01PREVfRFBNU19PTik7CisKKwlOVl9JTkZPKGRldiwgIk91dHB1dCAlcyBpcyBydW5uaW5nIG9uIENSVEMgJWQgdXNpbmcgb3V0cHV0ICVjXG4iLAorCQlkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKCZub3V2ZWF1X2VuY29kZXJfY29ubmVjdG9yX2dldChudl9lbmNvZGVyKS0+YmFzZSksCisJCW52X2NydGMtPmluZGV4LCAnQCcgKyBmZnMobnZfZW5jb2Rlci0+ZGNiLT5vcikpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfcG93ZXJzYXZpbmdfZHBtcyhpbnQgbW9kZSkKK3sKKwlyZXR1cm4gKG1vZGUgIT0gRFJNX01PREVfRFBNU19PTik7Cit9CisKK3N0YXRpYyB2b2lkIG52MDRfbHZkc19kcG1zKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBlbmNvZGVyLT5jcnRjOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlib29sIHdhc19wb3dlcnNhdmluZyA9IGlzX3Bvd2Vyc2F2aW5nX2RwbXMobnZfZW5jb2Rlci0+bGFzdF9kcG1zKTsKKworCWlmIChudl9lbmNvZGVyLT5sYXN0X2RwbXMgPT0gbW9kZSkKKwkJcmV0dXJuOworCW52X2VuY29kZXItPmxhc3RfZHBtcyA9IG1vZGU7CisKKwlOVl9JTkZPKGRldiwgIlNldHRpbmcgZHBtcyBtb2RlICVkIG9uIGx2ZHMgZW5jb2RlciAob3V0cHV0ICVkKVxuIiwKKwkJICAgICBtb2RlLCBudl9lbmNvZGVyLT5kY2ItPmluZGV4KTsKKworCWlmICh3YXNfcG93ZXJzYXZpbmcgJiYgaXNfcG93ZXJzYXZpbmdfZHBtcyhtb2RlKSkKKwkJcmV0dXJuOworCisJaWYgKG52X2VuY29kZXItPmRjYi0+bHZkc2NvbmYudXNlX3Bvd2VyX3NjcmlwdHMpIHsKKwkJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3IgPSBub3V2ZWF1X2VuY29kZXJfY29ubmVjdG9yX2dldChudl9lbmNvZGVyKTsKKworCQkvKiB3aGVuIHJlbW92aW5nIGFuIG91dHB1dCwgY3J0YyBtYXkgbm90IGJlIHNldCwgYnV0IFBBTkVMX09GRgorCQkgKiBtdXN0IHN0aWxsIGJlIHJ1bgorCQkgKi8KKwkJaW50IGhlYWQgPSBjcnRjID8gbm91dmVhdV9jcnRjKGNydGMpLT5pbmRleCA6CisJCQkgICBudjA0X2RmcF9nZXRfYm91bmRfaGVhZChkZXYsIG52X2VuY29kZXItPmRjYik7CisKKwkJaWYgKG1vZGUgPT0gRFJNX01PREVfRFBNU19PTikgeworCQkJaWYgKCFudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlKSB7CisJCQkJTlZfRVJST1IoZGV2LCAiTm90IHR1cm5pbmcgb24gTFZEUyB3aXRob3V0IG5hdGl2ZSBtb2RlXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQljYWxsX2x2ZHNfc2NyaXB0KGRldiwgbnZfZW5jb2Rlci0+ZGNiLCBoZWFkLAorCQkJCQkgTFZEU19QQU5FTF9PTiwgbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZS0+Y2xvY2spOworCQl9IGVsc2UKKwkJCS8qIHB4Y2xrIG9mIDAgaXMgZmluZSBmb3IgUEFORUxfT0ZGLCBhbmQgZm9yIGEKKwkJCSAqIGRpc2Nvbm5lY3RlZCBMVkRTIGVuY29kZXIgdGhlcmUgaXMgbm8gbmF0aXZlX21vZGUKKwkJCSAqLworCQkJY2FsbF9sdmRzX3NjcmlwdChkZXYsIG52X2VuY29kZXItPmRjYiwgaGVhZCwKKwkJCQkJIExWRFNfUEFORUxfT0ZGLCAwKTsKKwl9CisKKwludjA0X2RmcF91cGRhdGVfZnBfY29udHJvbChlbmNvZGVyLCBtb2RlKTsKKworCWlmIChtb2RlID09IERSTV9NT0RFX0RQTVNfT04pCisJCW52MDRfZGZwX3ByZXBhcmVfc2VsX2NsayhkZXYsIG52X2VuY29kZXIsIG5vdXZlYXVfY3J0YyhjcnRjKS0+aW5kZXgpOworCWVsc2UgeworCQlkZXZfcHJpdi0+bW9kZV9yZWcuc2VsX2NsayA9IE5WUmVhZFJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfU0VMX0NMSyk7CisJCWRldl9wcml2LT5tb2RlX3JlZy5zZWxfY2xrICY9IH4weGYwOworCX0KKwlOVldyaXRlUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19TRUxfQ0xLLCBkZXZfcHJpdi0+bW9kZV9yZWcuc2VsX2Nsayk7Cit9CisKK3N0YXRpYyB2b2lkIG52MDRfdG1kc19kcG1zKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCisJaWYgKG52X2VuY29kZXItPmxhc3RfZHBtcyA9PSBtb2RlKQorCQlyZXR1cm47CisJbnZfZW5jb2Rlci0+bGFzdF9kcG1zID0gbW9kZTsKKworCU5WX0lORk8oZGV2LCAiU2V0dGluZyBkcG1zIG1vZGUgJWQgb24gdG1kcyBlbmNvZGVyIChvdXRwdXQgJWQpXG4iLAorCQkgICAgIG1vZGUsIG52X2VuY29kZXItPmRjYi0+aW5kZXgpOworCisJbnYwNF9kZnBfdXBkYXRlX2ZwX2NvbnRyb2woZW5jb2RlciwgbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIG52MDRfZGZwX3NhdmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKworCWlmIChudl90d29faGVhZHMoZGV2KSkKKwkJbnZfZW5jb2Rlci0+cmVzdG9yZS5oZWFkID0KKwkJCW52MDRfZGZwX2dldF9ib3VuZF9oZWFkKGRldiwgbnZfZW5jb2Rlci0+ZGNiKTsKK30KKworc3RhdGljIHZvaWQgbnYwNF9kZnBfcmVzdG9yZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGhlYWQgPSBudl9lbmNvZGVyLT5yZXN0b3JlLmhlYWQ7CisKKwlpZiAobnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IE9VVFBVVF9MVkRTKSB7CisJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpuYXRpdmVfbW9kZSA9IG5vdXZlYXVfZW5jb2Rlcl9jb25uZWN0b3JfZ2V0KG52X2VuY29kZXIpLT5uYXRpdmVfbW9kZTsKKwkJaWYgKG5hdGl2ZV9tb2RlKQorCQkJY2FsbF9sdmRzX3NjcmlwdChkZXYsIG52X2VuY29kZXItPmRjYiwgaGVhZCwgTFZEU19QQU5FTF9PTiwKKwkJCQkJIG5hdGl2ZV9tb2RlLT5jbG9jayk7CisJCWVsc2UKKwkJCU5WX0VSUk9SKGRldiwgIk5vdCByZXN0b3JpbmcgTFZEUyB3aXRob3V0IG5hdGl2ZSBtb2RlXG4iKTsKKworCX0gZWxzZSBpZiAobnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IE9VVFBVVF9UTURTKSB7CisJCWludCBjbG9jayA9IG5vdXZlYXVfaHdfcGxsdmFsc190b19jbGsKKwkJCQkJKCZkZXZfcHJpdi0+c2F2ZWRfcmVnLmNydGNfcmVnW2hlYWRdLnBsbHZhbHMpOworCisJCXJ1bl90bWRzX3RhYmxlKGRldiwgbnZfZW5jb2Rlci0+ZGNiLCBoZWFkLCBjbG9jayk7CisJfQorCisJbnZfZW5jb2Rlci0+bGFzdF9kcG1zID0gTlZfRFBNU19DTEVBUkVEOworfQorCitzdGF0aWMgdm9pZCBudjA0X2RmcF9kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCisJTlZfREVCVUcoZW5jb2Rlci0+ZGV2LCAiXG4iKTsKKworCWRybV9lbmNvZGVyX2NsZWFudXAoZW5jb2Rlcik7CisJa2ZyZWUobnZfZW5jb2Rlcik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIG52MDRfbHZkc19oZWxwZXJfZnVuY3MgPSB7CisJLmRwbXMgPSBudjA0X2x2ZHNfZHBtcywKKwkuc2F2ZSA9IG52MDRfZGZwX3NhdmUsCisJLnJlc3RvcmUgPSBudjA0X2RmcF9yZXN0b3JlLAorCS5tb2RlX2ZpeHVwID0gbnYwNF9kZnBfbW9kZV9maXh1cCwKKwkucHJlcGFyZSA9IG52MDRfZGZwX3ByZXBhcmUsCisJLmNvbW1pdCA9IG52MDRfZGZwX2NvbW1pdCwKKwkubW9kZV9zZXQgPSBudjA0X2RmcF9tb2RlX3NldCwKKwkuZGV0ZWN0ID0gTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIG52MDRfdG1kc19oZWxwZXJfZnVuY3MgPSB7CisJLmRwbXMgPSBudjA0X3RtZHNfZHBtcywKKwkuc2F2ZSA9IG52MDRfZGZwX3NhdmUsCisJLnJlc3RvcmUgPSBudjA0X2RmcF9yZXN0b3JlLAorCS5tb2RlX2ZpeHVwID0gbnYwNF9kZnBfbW9kZV9maXh1cCwKKwkucHJlcGFyZSA9IG52MDRfZGZwX3ByZXBhcmUsCisJLmNvbW1pdCA9IG52MDRfZGZwX2NvbW1pdCwKKwkubW9kZV9zZXQgPSBudjA0X2RmcF9tb2RlX3NldCwKKwkuZGV0ZWN0ID0gTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgbnYwNF9kZnBfZnVuY3MgPSB7CisJLmRlc3Ryb3kgPSBudjA0X2RmcF9kZXN0cm95LAorfTsKKworaW50IG52MDRfZGZwX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSkKK3sKKwljb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICpoZWxwZXI7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBOVUxMOworCWludCB0eXBlOworCisJc3dpdGNoIChlbnRyeS0+dHlwZSkgeworCWNhc2UgT1VUUFVUX1RNRFM6CisJCXR5cGUgPSBEUk1fTU9ERV9FTkNPREVSX1RNRFM7CisJCWhlbHBlciA9ICZudjA0X3RtZHNfaGVscGVyX2Z1bmNzOworCQlicmVhazsKKwljYXNlIE9VVFBVVF9MVkRTOgorCQl0eXBlID0gRFJNX01PREVfRU5DT0RFUl9MVkRTOworCQloZWxwZXIgPSAmbnYwNF9sdmRzX2hlbHBlcl9mdW5jczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbnZfZW5jb2RlciA9IGt6YWxsb2Moc2l6ZW9mKCpudl9lbmNvZGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFudl9lbmNvZGVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVuY29kZXIgPSB0b19kcm1fZW5jb2Rlcihudl9lbmNvZGVyKTsKKworCW52X2VuY29kZXItPmRjYiA9IGVudHJ5OworCW52X2VuY29kZXItPm9yID0gZmZzKGVudHJ5LT5vcikgLSAxOworCisJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZudjA0X2RmcF9mdW5jcywgdHlwZSk7CisJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVyLCBoZWxwZXIpOworCisJZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgPSBlbnRyeS0+aGVhZHM7CisJZW5jb2Rlci0+cG9zc2libGVfY2xvbmVzID0gMDsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2Rpc3BsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDdjNzU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9kaXNwbGF5LmMKQEAgLTAsMCArMSwyODggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3I6IEJlbiBTa2VnZ3MKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgorCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2ZiLmgiCisjaW5jbHVkZSAibm91dmVhdV9ody5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZW5jb2Rlci5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY29ubmVjdG9yLmgiCisKKyNkZWZpbmUgTVVMVElQTEVfRU5DT0RFUlMoZSkgKGUgJiAoZSAtIDEpKQorCitzdGF0aWMgdm9pZAorbnYwNF9kaXNwbGF5X3N0b3JlX2luaXRpYWxfaGVhZF9vd25lcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHgxMSkgeworCQlkZXZfcHJpdi0+Y3J0Y19vd25lciA9IE5WUmVhZFZnYUNydGMoZGV2LCAwLCBOVl9DSU9fQ1JFXzQ0KTsKKwkJZ290byBvd25lcmtub3duOworCX0KKworCS8qIHJlYWRpbmcgQ1I0NCBpcyBicm9rZW4gb24gbnYxMSwgc28gd2UgYXR0ZW1wdCB0byBpbmZlciBpdCAqLworCWlmIChudlJlYWRNQyhkZXYsIE5WX1BCVVNfREVCVUdfMSkgJiAoMSA8PCAyOCkpCS8qIGhlYWRzIHRpZWQsIHJlc3RvcmUgYm90aCAqLworCQlkZXZfcHJpdi0+Y3J0Y19vd25lciA9IDB4NDsKKwllbHNlIHsKKwkJdWludDhfdCBzbGF2ZWRfb25fQSwgc2xhdmVkX29uX0I7CisJCWJvb2wgdHZBID0gZmFsc2U7CisJCWJvb2wgdHZCID0gZmFsc2U7CisKKwkJTlZMb2NrVmdhQ3J0Y3MoZGV2LCBmYWxzZSk7CisKKwkJc2xhdmVkX29uX0IgPSBOVlJlYWRWZ2FDcnRjKGRldiwgMSwgTlZfQ0lPX0NSRV9QSVhFTF9JTkRFWCkgJgorCQkJCQkJCQkJMHg4MDsKKwkJaWYgKHNsYXZlZF9vbl9CKQorCQkJdHZCID0gIShOVlJlYWRWZ2FDcnRjKGRldiwgMSwgTlZfQ0lPX0NSRV9MQ0RfX0lOREVYKSAmCisJCQkJCU1BU0soTlZfQ0lPX0NSRV9MQ0RfTENEX1NFTEVDVCkpOworCisJCXNsYXZlZF9vbl9BID0gTlZSZWFkVmdhQ3J0YyhkZXYsIDAsIE5WX0NJT19DUkVfUElYRUxfSU5ERVgpICYKKwkJCQkJCQkJCTB4ODA7CisJCWlmIChzbGF2ZWRfb25fQSkKKwkJCXR2QSA9ICEoTlZSZWFkVmdhQ3J0YyhkZXYsIDAsIE5WX0NJT19DUkVfTENEX19JTkRFWCkgJgorCQkJCQlNQVNLKE5WX0NJT19DUkVfTENEX0xDRF9TRUxFQ1QpKTsKKworCQlOVkxvY2tWZ2FDcnRjcyhkZXYsIHRydWUpOworCisJCWlmIChzbGF2ZWRfb25fQSAmJiAhdHZBKQorCQkJZGV2X3ByaXYtPmNydGNfb3duZXIgPSAweDA7CisJCWVsc2UgaWYgKHNsYXZlZF9vbl9CICYmICF0dkIpCisJCQlkZXZfcHJpdi0+Y3J0Y19vd25lciA9IDB4MzsKKwkJZWxzZSBpZiAoc2xhdmVkX29uX0EpCisJCQlkZXZfcHJpdi0+Y3J0Y19vd25lciA9IDB4MDsKKwkJZWxzZSBpZiAoc2xhdmVkX29uX0IpCisJCQlkZXZfcHJpdi0+Y3J0Y19vd25lciA9IDB4MzsKKwkJZWxzZQorCQkJZGV2X3ByaXYtPmNydGNfb3duZXIgPSAweDA7CisJfQorCitvd25lcmtub3duOgorCU5WX0lORk8oZGV2LCAiSW5pdGlhbCBDUlRDX09XTkVSIGlzICVkXG4iLCBkZXZfcHJpdi0+Y3J0Y19vd25lcik7CisKKwkvKiB3ZSBuZWVkIHRvIGVuc3VyZSB0aGUgaGVhZHMgYXJlIG5vdCB0aWVkIGhlbmNlZm9ydGgsIG9yIHJlYWRpbmcgYW55CisJICogOCBiaXQgcmVnIG9uIGhlYWQgQiB3aWxsIGZhaWwKKwkgKiBzZXR0aW5nIGEgc2luZ2xlIGFyYml0cmFyeSBoZWFkIHNvbHZlcyB0aGF0ICovCisJTlZTZXRPd25lcihkZXYsIDApOworfQorCitpbnQKK252MDRfZGlzcGxheV9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBwYXJzZWRfZGNiICpkY2IgPSBkZXZfcHJpdi0+dmJpb3MtPmRjYjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCXVpbnQxNl90IGNvbm5lY3RvclsxNl0gPSB7IDAgfTsKKwlpbnQgaSwgcmV0OworCisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCWlmIChudl90d29faGVhZHMoZGV2KSkKKwkJbnYwNF9kaXNwbGF5X3N0b3JlX2luaXRpYWxfaGVhZF9vd25lcihkZXYpOworCisJZHJtX21vZGVfY29uZmlnX2luaXQoZGV2KTsKKwlkcm1fbW9kZV9jcmVhdGVfc2NhbGluZ19tb2RlX3Byb3BlcnR5KGRldik7CisJZHJtX21vZGVfY3JlYXRlX2RpdGhlcmluZ19wcm9wZXJ0eShkZXYpOworCisJZGV2LT5tb2RlX2NvbmZpZy5mdW5jcyA9ICh2b2lkICopJm5vdXZlYXVfbW9kZV9jb25maWdfZnVuY3M7CisKKwlkZXYtPm1vZGVfY29uZmlnLm1pbl93aWR0aCA9IDA7CisJZGV2LT5tb2RlX2NvbmZpZy5taW5faGVpZ2h0ID0gMDsKKwlzd2l0Y2ggKGRldl9wcml2LT5jYXJkX3R5cGUpIHsKKwljYXNlIE5WXzA0OgorCQlkZXYtPm1vZGVfY29uZmlnLm1heF93aWR0aCA9IDIwNDg7CisJCWRldi0+bW9kZV9jb25maWcubWF4X2hlaWdodCA9IDIwNDg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldi0+bW9kZV9jb25maWcubWF4X3dpZHRoID0gNDA5NjsKKwkJZGV2LT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0ID0gNDA5NjsKKwkJYnJlYWs7CisJfQorCisJZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlID0gZGV2X3ByaXYtPmZiX3BoeXM7CisKKwludjA0X2NydGNfY3JlYXRlKGRldiwgMCk7CisJaWYgKG52X3R3b19oZWFkcyhkZXYpKQorCQludjA0X2NydGNfY3JlYXRlKGRldiwgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGNiLT5lbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50ID0gJmRjYi0+ZW50cnlbaV07CisKKwkJc3dpdGNoIChkY2JlbnQtPnR5cGUpIHsKKwkJY2FzZSBPVVRQVVRfQU5BTE9HOgorCQkJcmV0ID0gbnYwNF9kYWNfY3JlYXRlKGRldiwgZGNiZW50KTsKKwkJCWJyZWFrOworCQljYXNlIE9VVFBVVF9MVkRTOgorCQljYXNlIE9VVFBVVF9UTURTOgorCQkJcmV0ID0gbnYwNF9kZnBfY3JlYXRlKGRldiwgZGNiZW50KTsKKwkJCWJyZWFrOworCQljYXNlIE9VVFBVVF9UVjoKKwkJCWlmIChkY2JlbnQtPmxvY2F0aW9uID09IERDQl9MT0NfT05fQ0hJUCkKKwkJCQlyZXQgPSBudjE3X3R2X2NyZWF0ZShkZXYsIGRjYmVudCk7CisJCQllbHNlCisJCQkJcmV0ID0gbnYwNF90dl9jcmVhdGUoZGV2LCBkY2JlbnQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlOVl9XQVJOKGRldiwgIkRDQiB0eXBlICVkIG5vdCBrbm93blxuIiwgZGNiZW50LT50eXBlKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHJldCkKKwkJCWNvbnRpbnVlOworCisJCWNvbm5lY3RvcltkY2JlbnQtPmNvbm5lY3Rvcl0gfD0gKDEgPDwgZGNiZW50LT50eXBlKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZGNiLT5lbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50ID0gJmRjYi0+ZW50cnlbaV07CisJCXVpbnQxNl90IGVuY29kZXJzOworCQlpbnQgdHlwZTsKKworCQllbmNvZGVycyA9IGNvbm5lY3RvcltkY2JlbnQtPmNvbm5lY3Rvcl07CisJCWlmICghKGVuY29kZXJzICYgKDEgPDwgZGNiZW50LT50eXBlKSkpCisJCQljb250aW51ZTsKKwkJY29ubmVjdG9yW2RjYmVudC0+Y29ubmVjdG9yXSA9IDA7CisKKwkJc3dpdGNoIChkY2JlbnQtPnR5cGUpIHsKKwkJY2FzZSBPVVRQVVRfQU5BTE9HOgorCQkJaWYgKCFNVUxUSVBMRV9FTkNPREVSUyhlbmNvZGVycykpCisJCQkJdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9WR0E7CisJCQllbHNlCisJCQkJdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9EVklJOworCQkJYnJlYWs7CisJCWNhc2UgT1VUUFVUX1RNRFM6CisJCQlpZiAoIU1VTFRJUExFX0VOQ09ERVJTKGVuY29kZXJzKSkKKwkJCQl0eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUQ7CisJCQllbHNlCisJCQkJdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9EVklJOworCQkJYnJlYWs7CisJCWNhc2UgT1VUUFVUX0xWRFM6CisJCQl0eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX0xWRFM7CisjaWYgMAorCQkJLyogZG9uJ3QgY3JlYXRlIGkyYyBhZGFwdGVyIHdoZW4gbHZkcyBkZGMgbm90IGFsbG93ZWQgKi8KKwkJCWlmIChkY2JlbnQtPmx2ZHNjb25mLnVzZV9zdHJhcHNfZm9yX21vZGUgfHwKKwkJCSAgICBkZXZfcHJpdi0+dmJpb3MtPmZwX25vX2RkYykKKwkJCQlpMmNfaW5kZXggPSAweGY7CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlIE9VVFBVVF9UVjoKKwkJCXR5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfVFY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXR5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfVW5rbm93bjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbm91dmVhdV9jb25uZWN0b3JfY3JlYXRlKGRldiwgZGNiZW50LT5jb25uZWN0b3IsIHR5cGUpOworCX0KKworCS8qIFNhdmUgcHJldmlvdXMgc3RhdGUgKi8KKwlOVkxvY2tWZ2FDcnRjcyhkZXYsIGZhbHNlKTsKKworCW5vdXZlYXVfaHdfc2F2ZV92Z2FfZm9udHMoZGV2LCAxKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKQorCQljcnRjLT5mdW5jcy0+c2F2ZShjcnRjKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmZ1bmMgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKworCQlmdW5jLT5zYXZlKGVuY29kZXIpOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkCitudjA0X2Rpc3BsYXlfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJLyogVHVybiBldmVyeSBDUlRDIG9mZi4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3QgZHJtX21vZGVfc2V0IG1vZGVzZXQgPSB7CisJCQkuY3J0YyA9IGNydGMsCisJCX07CisKKwkJY3J0Yy0+ZnVuY3MtPnNldF9jb25maWcoJm1vZGVzZXQpOworCX0KKworCS8qIFJlc3RvcmUgc3RhdGUgKi8KKwlOVkxvY2tWZ2FDcnRjcyhkZXYsIGZhbHNlKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmZ1bmMgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKworCQlmdW5jLT5yZXN0b3JlKGVuY29kZXIpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKQorCQljcnRjLT5mdW5jcy0+cmVzdG9yZShjcnRjKTsKKworCW5vdXZlYXVfaHdfc2F2ZV92Z2FfZm9udHMoZGV2LCAwKTsKKworCWRybV9tb2RlX2NvbmZpZ19jbGVhbnVwKGRldik7Cit9CisKK3ZvaWQKK252MDRfZGlzcGxheV9yZXN0b3JlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCisJTlZMb2NrVmdhQ3J0Y3MoZGV2LCBmYWxzZSk7CisKKwkvKiBtZWguLiBtb2Rlc2V0IGFwcGFyZW50bHkgZG9lc24ndCBzZXR1cCBhbGwgdGhlIHJlZ3MgYW5kIGRlcGVuZHMKKwkgKiBvbiBwcmUtZXhpc3Rpbmcgc3RhdGUsIGZvciBub3cgbG9hZCB0aGUgc3RhdGUgb2YgdGhlIGNhcmQgKmJlZm9yZSoKKwkgKiBub3V2ZWF1IHdhcyBsb2FkZWQsIGFuZCB0aGVuIGRvIGEgbW9kZXNldC4KKwkgKgorCSAqIGJlc3QgdGhpbmcgdG8gZG8gcHJvYmFibHkgaXMgdG8gbWFrZSBzYXZlL3Jlc3RvcmUgcm91dGluZXMgbm90CisJICogc2F2ZS9yZXN0b3JlICJwcmUtbG9hZCIgc3RhdGUsIGJ1dCBtb3JlIGdlbmVyYWwgc28gd2UgY2FuIHNhdmUKKwkgKiBvbiBzdXNwZW5kIHRvby4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICpmdW5jID0gZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7CisKKwkJZnVuYy0+cmVzdG9yZShlbmNvZGVyKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkKKwkJY3J0Yy0+ZnVuY3MtPnJlc3RvcmUoY3J0Yyk7CisKKwlpZiAobnZfdHdvX2hlYWRzKGRldikpIHsKKwkJTlZfSU5GTyhkZXYsICJSZXN0b3JpbmcgQ1JUQ19PV05FUiB0byAlZC5cbiIsCisJCQlkZXZfcHJpdi0+Y3J0Y19vd25lcik7CisJCU5WU2V0T3duZXIoZGV2LCBkZXZfcHJpdi0+Y3J0Y19vd25lcik7CisJfQorCisJTlZMb2NrVmdhQ3J0Y3MoZGV2LCB0cnVlKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9mYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOGNmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2ZiLmMKQEAgLTAsMCArMSwyMSBAQAorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCisKK2ludAorbnYwNF9mYl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJLyogVGhpcyBpcyB3aGF0IHRoZSBERFggZGlkIGZvciBOVl9BUkNIXzA0LCBidXQgYSBtbWlvLXRyYWNlIHNob3dzCisJICogbnZpZGlhIHJlYWRpbmcgUEZCX0NGR18wLCB0aGVuIHdyaXRpbmcgYmFjayBpdHMgb3JpZ2luYWwgdmFsdWUuCisJICogKHdoaWNoIHdhcyAweDcwMTExNCBpbiB0aGlzIGNhc2UpCisJICovCisKKwludl93cjMyKGRldiwgTlYwNF9QRkJfQ0ZHMCwgMHgxMTE0KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnYwNF9mYl90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9mYmNvbi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9mYmNvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YTMxMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2ZiY29uLmMKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBCZW4gU2tlZ2dzCisgKiBDb3B5cmlnaHQgMjAwOCBTdHVhcnQgQmVubmV0dAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kbWEuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2ZiY29uLmgiCisKK3N0YXRpYyB2b2lkCitudjA0X2ZiY29uX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKnJlZ2lvbikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9mYmNvbl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGFyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWw7CisKKwlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCisJCXJldHVybjsKKworCWlmICghKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpICYmIFJJTkdfU1BBQ0UoY2hhbiwgNCkpIHsKKwkJTlZfRVJST1IoZGV2LCAiR1BVIGxvY2t1cCAtIHN3aXRjaGluZyB0byBzb2Z0d2FyZSBmYmNvblxuIik7CisJCWluZm8tPmZsYWdzIHw9IEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEOworCX0KKworCWlmIChpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSB7CisJCWNmYl9jb3B5YXJlYShpbmZvLCByZWdpb24pOworCQlyZXR1cm47CisJfQorCisJQkVHSU5fUklORyhjaGFuLCBOdlN1YkltYWdlQmxpdCwgMHgwMzAwLCAzKTsKKwlPVVRfUklORyhjaGFuLCAocmVnaW9uLT5zeSA8PCAxNikgfCByZWdpb24tPnN4KTsKKwlPVVRfUklORyhjaGFuLCAocmVnaW9uLT5keSA8PCAxNikgfCByZWdpb24tPmR4KTsKKwlPVVRfUklORyhjaGFuLCAocmVnaW9uLT5oZWlnaHQgPDwgMTYpIHwgcmVnaW9uLT53aWR0aCk7CisJRklSRV9SSU5HKGNoYW4pOworfQorCitzdGF0aWMgdm9pZAorbnYwNF9mYmNvbl9maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KQoreworCXN0cnVjdCBub3V2ZWF1X2ZiY29uX3BhciAqcGFyID0gaW5mby0+cGFyOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwYXItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbDsKKwl1aW50MzJfdCBjb2xvciA9ICgodWludDMyX3QgKikgaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlY3QtPmNvbG9yXTsKKworCWlmIChpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykKKwkJcmV0dXJuOworCisJaWYgKCEoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgJiYgUklOR19TUEFDRShjaGFuLCA3KSkgeworCQlOVl9FUlJPUihkZXYsICJHUFUgbG9ja3VwIC0gc3dpdGNoaW5nIHRvIHNvZnR3YXJlIGZiY29uXG4iKTsKKwkJaW5mby0+ZmxhZ3MgfD0gRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQ7CisJfQorCisJaWYgKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpIHsKKwkJY2ZiX2ZpbGxyZWN0KGluZm8sIHJlY3QpOworCQlyZXR1cm47CisJfQorCisJQkVHSU5fUklORyhjaGFuLCBOdlN1YkdkaVJlY3QsIDB4MDJmYywgMSk7CisJT1VUX1JJTkcoY2hhbiwgKHJlY3QtPnJvcCAhPSBST1BfQ09QWSkgPyAxIDogMyk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YkdkaVJlY3QsIDB4MDNmYywgMSk7CisJT1VUX1JJTkcoY2hhbiwgY29sb3IpOworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJHZGlSZWN0LCAweDA0MDAsIDIpOworCU9VVF9SSU5HKGNoYW4sIChyZWN0LT5keCA8PCAxNikgfCByZWN0LT5keSk7CisJT1VUX1JJTkcoY2hhbiwgKHJlY3QtPndpZHRoIDw8IDE2KSB8IHJlY3QtPmhlaWdodCk7CisJRklSRV9SSU5HKGNoYW4pOworfQorCitzdGF0aWMgdm9pZAorbnYwNF9mYmNvbl9pbWFnZWJsaXQoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9pbWFnZSAqaW1hZ2UpCit7CisJc3RydWN0IG5vdXZlYXVfZmJjb25fcGFyICpwYXIgPSBpbmZvLT5wYXI7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBhci0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5jaGFubmVsOworCXVpbnQzMl90IGZnOworCXVpbnQzMl90IGJnOworCXVpbnQzMl90IGRzaXplOworCXVpbnQzMl90IHdpZHRoOworCXVpbnQzMl90ICpkYXRhID0gKHVpbnQzMl90ICopaW1hZ2UtPmRhdGE7CisKKwlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCisJCXJldHVybjsKKworCWlmIChpbWFnZS0+ZGVwdGggIT0gMSkgeworCQljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpICYmIFJJTkdfU1BBQ0UoY2hhbiwgOCkpIHsKKwkJTlZfRVJST1IoZGV2LCAiR1BVIGxvY2t1cCAtIHN3aXRjaGluZyB0byBzb2Z0d2FyZSBmYmNvblxuIik7CisJCWluZm8tPmZsYWdzIHw9IEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEOworCX0KKworCWlmIChpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSB7CisJCWNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCQlyZXR1cm47CisJfQorCisJd2lkdGggPSAoaW1hZ2UtPndpZHRoICsgMzEpICYgfjMxOworCWRzaXplID0gKHdpZHRoICogaW1hZ2UtPmhlaWdodCkgPj4gNTsKKworCWlmIChpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9UUlVFQ09MT1IgfHwKKwkgICAgaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfRElSRUNUQ09MT1IpIHsKKwkJZmcgPSAoKHVpbnQzMl90ICopIGluZm8tPnBzZXVkb19wYWxldHRlKVtpbWFnZS0+ZmdfY29sb3JdOworCQliZyA9ICgodWludDMyX3QgKikgaW5mby0+cHNldWRvX3BhbGV0dGUpW2ltYWdlLT5iZ19jb2xvcl07CisJfSBlbHNlIHsKKwkJZmcgPSBpbWFnZS0+ZmdfY29sb3I7CisJCWJnID0gaW1hZ2UtPmJnX2NvbG9yOworCX0KKworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJHZGlSZWN0LCAweDBiZTQsIDcpOworCU9VVF9SSU5HKGNoYW4sIChpbWFnZS0+ZHkgPDwgMTYpIHwgKGltYWdlLT5keCAmIDB4ZmZmZikpOworCU9VVF9SSU5HKGNoYW4sICgoaW1hZ2UtPmR5ICsgaW1hZ2UtPmhlaWdodCkgPDwgMTYpIHwKKwkJCSAoKGltYWdlLT5keCArIGltYWdlLT53aWR0aCkgJiAweGZmZmYpKTsKKwlPVVRfUklORyhjaGFuLCBiZyk7CisJT1VUX1JJTkcoY2hhbiwgZmcpOworCU9VVF9SSU5HKGNoYW4sIChpbWFnZS0+aGVpZ2h0IDw8IDE2KSB8IGltYWdlLT53aWR0aCk7CisJT1VUX1JJTkcoY2hhbiwgKGltYWdlLT5oZWlnaHQgPDwgMTYpIHwgd2lkdGgpOworCU9VVF9SSU5HKGNoYW4sIChpbWFnZS0+ZHkgPDwgMTYpIHwgKGltYWdlLT5keCAmIDB4ZmZmZikpOworCisJd2hpbGUgKGRzaXplKSB7CisJCWludCBpdGVyX2xlbiA9IGRzaXplID4gMTI4ID8gMTI4IDogZHNpemU7CisKKwkJaWYgKFJJTkdfU1BBQ0UoY2hhbiwgaXRlcl9sZW4gKyAxKSkgeworCQkJTlZfRVJST1IoZGV2LCAiR1BVIGxvY2t1cCAtIHN3aXRjaGluZyB0byBzb2Z0d2FyZSBmYmNvblxuIik7CisJCQlpbmZvLT5mbGFncyB8PSBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRDsKKwkJCWNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCQkJcmV0dXJuOworCQl9CisKKwkJQkVHSU5fUklORyhjaGFuLCBOdlN1YkdkaVJlY3QsIDB4MGMwMCwgaXRlcl9sZW4pOworCQlPVVRfUklOR3AoY2hhbiwgZGF0YSwgaXRlcl9sZW4pOworCQlkYXRhICs9IGl0ZXJfbGVuOworCQlkc2l6ZSAtPSBpdGVyX2xlbjsKKwl9CisKKwlGSVJFX1JJTkcoY2hhbik7Cit9CisKK3N0YXRpYyBpbnQKK252MDRfZmJjb25fZ3JvYmpfbmV3KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjbGFzcywgdWludDMyX3QgaGFuZGxlKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpvYmogPSBOVUxMOworCWludCByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9ncl9uZXcoZGV2X3ByaXYtPmNoYW5uZWwsIGNsYXNzLCAmb2JqKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfcmVmX2FkZChkZXYsIGRldl9wcml2LT5jaGFubmVsLCBoYW5kbGUsIG9iaiwgTlVMTCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitpbnQKK252MDRfZmJjb25fYWNjZWxfaW5pdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9mYmNvbl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGFyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWw7CisJaW50IHN1cmZhY2VfZm10LCBwYXR0ZXJuX2ZtdCwgcmVjdF9mbXQ7CisJaW50IHJldDsKKworCXN3aXRjaCAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSA4OgorCQlzdXJmYWNlX2ZtdCA9IDE7CisJCXBhdHRlcm5fZm10ID0gMzsKKwkJcmVjdF9mbXQgPSAzOworCQlicmVhazsKKwljYXNlIDE2OgorCQlzdXJmYWNlX2ZtdCA9IDQ7CisJCXBhdHRlcm5fZm10ID0gMTsKKwkJcmVjdF9mbXQgPSAxOworCQlicmVhazsKKwljYXNlIDMyOgorCQlzd2l0Y2ggKGluZm8tPnZhci50cmFuc3AubGVuZ3RoKSB7CisJCWNhc2UgMDogLyogZGVwdGggMjQgKi8KKwkJY2FzZSA4OiAvKiBkZXB0aCAzMiAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXN1cmZhY2VfZm10ID0gNjsKKwkJcGF0dGVybl9mbXQgPSAzOworCQlyZWN0X2ZtdCA9IDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IG52MDRfZmJjb25fZ3JvYmpfbmV3KGRldiwgZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8xMCA/CisJCQkJICAgMHgwMDYyIDogMHgwMDQyLCBOdkN0eFN1cmYyRCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG52MDRfZmJjb25fZ3JvYmpfbmV3KGRldiwgMHgwMDE5LCBOdkNsaXBSZWN0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbnYwNF9mYmNvbl9ncm9ial9uZXcoZGV2LCAweDAwNDMsIE52Um9wKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbnYwNF9mYmNvbl9ncm9ial9uZXcoZGV2LCAweDAwNDQsIE52SW1hZ2VQYXR0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbnYwNF9mYmNvbl9ncm9ial9uZXcoZGV2LCAweDAwNGEsIE52R2RpUmVjdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG52MDRfZmJjb25fZ3JvYmpfbmV3KGRldiwgZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8xMCA/CisJCQkJICAgMHgwMDlmIDogMHgwMDVmLCBOdkltYWdlQmxpdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChSSU5HX1NQQUNFKGNoYW4sIDQ5KSkgeworCQlOVl9FUlJPUihkZXYsICJHUFUgbG9ja3VwIC0gc3dpdGNoaW5nIHRvIHNvZnR3YXJlIGZiY29uXG4iKTsKKwkJaW5mby0+ZmxhZ3MgfD0gRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQ7CisJCXJldHVybiAwOworCX0KKworCUJFR0lOX1JJTkcoY2hhbiwgMSwgMHgwMDAwLCAxKTsKKwlPVVRfUklORyhjaGFuLCBOdkN0eFN1cmYyRCk7CisJQkVHSU5fUklORyhjaGFuLCAxLCAweDAxODQsIDIpOworCU9VVF9SSU5HKGNoYW4sIE52RG1hRkIpOworCU9VVF9SSU5HKGNoYW4sIE52RG1hRkIpOworCUJFR0lOX1JJTkcoY2hhbiwgMSwgMHgwMzAwLCA0KTsKKwlPVVRfUklORyhjaGFuLCBzdXJmYWNlX2ZtdCk7CisJT1VUX1JJTkcoY2hhbiwgaW5mby0+Zml4LmxpbmVfbGVuZ3RoIHwgKGluZm8tPmZpeC5saW5lX2xlbmd0aCA8PCAxNikpOworCU9VVF9SSU5HKGNoYW4sIGluZm8tPmZpeC5zbWVtX3N0YXJ0IC0gZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlKTsKKwlPVVRfUklORyhjaGFuLCBpbmZvLT5maXguc21lbV9zdGFydCAtIGRldi0+bW9kZV9jb25maWcuZmJfYmFzZSk7CisKKwlCRUdJTl9SSU5HKGNoYW4sIDEsIDB4MDAwMCwgMSk7CisJT1VUX1JJTkcoY2hhbiwgTnZSb3ApOworCUJFR0lOX1JJTkcoY2hhbiwgMSwgMHgwMzAwLCAxKTsKKwlPVVRfUklORyhjaGFuLCAweDU1KTsKKworCUJFR0lOX1JJTkcoY2hhbiwgMSwgMHgwMDAwLCAxKTsKKwlPVVRfUklORyhjaGFuLCBOdkltYWdlUGF0dCk7CisJQkVHSU5fUklORyhjaGFuLCAxLCAweDAzMDAsIDgpOworCU9VVF9SSU5HKGNoYW4sIHBhdHRlcm5fZm10KTsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwlPVVRfUklORyhjaGFuLCAyKTsKKyNlbHNlCisJT1VUX1JJTkcoY2hhbiwgMSk7CisjZW5kaWYKKwlPVVRfUklORyhjaGFuLCAwKTsKKwlPVVRfUklORyhjaGFuLCAxKTsKKwlPVVRfUklORyhjaGFuLCB+MCk7CisJT1VUX1JJTkcoY2hhbiwgfjApOworCU9VVF9SSU5HKGNoYW4sIH4wKTsKKwlPVVRfUklORyhjaGFuLCB+MCk7CisKKwlCRUdJTl9SSU5HKGNoYW4sIDEsIDB4MDAwMCwgMSk7CisJT1VUX1JJTkcoY2hhbiwgTnZDbGlwUmVjdCk7CisJQkVHSU5fUklORyhjaGFuLCAxLCAweDAzMDAsIDIpOworCU9VVF9SSU5HKGNoYW4sIDApOworCU9VVF9SSU5HKGNoYW4sIChpbmZvLT52YXIueXJlc192aXJ0dWFsIDw8IDE2KSB8IGluZm8tPnZhci54cmVzX3ZpcnR1YWwpOworCisJQkVHSU5fUklORyhjaGFuLCBOdlN1YkltYWdlQmxpdCwgMHgwMDAwLCAxKTsKKwlPVVRfUklORyhjaGFuLCBOdkltYWdlQmxpdCk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YkltYWdlQmxpdCwgMHgwMTljLCAxKTsKKwlPVVRfUklORyhjaGFuLCBOdkN0eFN1cmYyRCk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YkltYWdlQmxpdCwgMHgwMmZjLCAxKTsKKwlPVVRfUklORyhjaGFuLCAzKTsKKworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJHZGlSZWN0LCAweDAwMDAsIDEpOworCU9VVF9SSU5HKGNoYW4sIE52R2RpUmVjdCk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YkdkaVJlY3QsIDB4MDE5OCwgMSk7CisJT1VUX1JJTkcoY2hhbiwgTnZDdHhTdXJmMkQpOworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJHZGlSZWN0LCAweDAxODgsIDIpOworCU9VVF9SSU5HKGNoYW4sIE52SW1hZ2VQYXR0KTsKKwlPVVRfUklORyhjaGFuLCBOdlJvcCk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YkdkaVJlY3QsIDB4MDMwNCwgMSk7CisJT1VUX1JJTkcoY2hhbiwgMSk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YkdkaVJlY3QsIDB4MDMwMCwgMSk7CisJT1VUX1JJTkcoY2hhbiwgcmVjdF9mbXQpOworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJHZGlSZWN0LCAweDAyZmMsIDEpOworCU9VVF9SSU5HKGNoYW4sIDMpOworCisJRklSRV9SSU5HKGNoYW4pOworCisJaW5mby0+ZmJvcHMtPmZiX2ZpbGxyZWN0ID0gbnYwNF9mYmNvbl9maWxscmVjdDsKKwlpbmZvLT5mYm9wcy0+ZmJfY29weWFyZWEgPSBudjA0X2ZiY29uX2NvcHlhcmVhOworCWluZm8tPmZib3BzLT5mYl9pbWFnZWJsaXQgPSBudjA0X2ZiY29uX2ltYWdlYmxpdDsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9maWZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2ZpZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzNjZDUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9maWZvLmMKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQmVuIFNrZWdncy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKworI2RlZmluZSBOVjA0X1JBTUZDKGMpIChkZXZfcHJpdi0+cmFtZmNfb2Zmc2V0ICsgKChjKSAqIE5WMDRfUkFNRkNfX1NJWkUpKQorI2RlZmluZSBOVjA0X1JBTUZDX19TSVpFIDMyCisjZGVmaW5lIE5WMDRfUkFNRkNfRE1BX1BVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTlYwNF9SQU1GQ19ETUFfR0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBOVjA0X1JBTUZDX0RNQV9JTlNUQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIE5WMDRfUkFNRkNfRE1BX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEMKKyNkZWZpbmUgTlYwNF9SQU1GQ19ETUFfRkVUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBOVjA0X1JBTUZDX0VOR0lORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0CisjZGVmaW5lIE5WMDRfUkFNRkNfUFVMTDFfRU5HSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgKKworI2RlZmluZSBSQU1GQ19XUihvZmZzZXQsIHZhbCkgbnZfd28zMihkZXYsIGNoYW4tPnJhbWZjLT5ncHVvYmosIFwKKwkJCQkJIE5WMDRfUkFNRkNfIyNvZmZzZXQvNCwgKHZhbCkpCisjZGVmaW5lIFJBTUZDX1JEKG9mZnNldCkgICAgICBudl9ybzMyKGRldiwgY2hhbi0+cmFtZmMtPmdwdW9iaiwgXAorCQkJCQkgTlYwNF9SQU1GQ18jI29mZnNldC80KQorCit2b2lkCitudjA0X2ZpZm9fZGlzYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXVpbnQzMl90IHRtcDsKKworCXRtcCA9IG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfUFVTSCk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVNILCB0bXAgJiB+MSk7CisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gwLCAwKTsKKwl0bXAgPSBudl9yZDMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVMTDEpOworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9QVUxMMCwgdG1wICYgfjEpOworfQorCit2b2lkCitudjA0X2ZpZm9fZW5hYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gwLCAxKTsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfUFVMTDAsIDEpOworfQorCitib29sCitudjA0X2ZpZm9fcmVhc3NpZ24oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpCit7CisJdWludDMyX3QgcmVhc3NpZ24gPSBudl9yZDMyKGRldiwgTlYwM19QRklGT19DQUNIRVMpOworCisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEVTLCBlbmFibGUgPyAxIDogMCk7CisJcmV0dXJuIChyZWFzc2lnbiA9PSAxKTsKK30KKworaW50CitudjA0X2ZpZm9fY2hhbm5lbF9pZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXJldHVybiBudl9yZDMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDEpICYKKwkJCU5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gxX0NISURfTUFTSzsKK30KKworaW50CitudjA0X2ZpZm9fY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHJldDsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19mYWtlKGRldiwgTlYwNF9SQU1GQyhjaGFuLT5pZCksIH4wLAorCQkJCQkJTlYwNF9SQU1GQ19fU0laRSwKKwkJCQkJCU5WT0JKX0ZMQUdfWkVST19BTExPQyB8CisJCQkJCQlOVk9CSl9GTEFHX1pFUk9fRlJFRSwKKwkJCQkJCU5VTEwsICZjaGFuLT5yYW1mYyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFNldHVwIGluaXRpYWwgc3RhdGUgKi8KKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKwlSQU1GQ19XUihETUFfUFVULCBjaGFuLT5wdXNoYnVmX2Jhc2UpOworCVJBTUZDX1dSKERNQV9HRVQsIGNoYW4tPnB1c2hidWZfYmFzZSk7CisJUkFNRkNfV1IoRE1BX0lOU1RBTkNFLCBjaGFuLT5wdXNoYnVmLT5pbnN0YW5jZSA+PiA0KTsKKwlSQU1GQ19XUihETUFfRkVUQ0gsIChOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfMTI4X0JZVEVTIHwKKwkJCSAgICAgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9TSVpFXzEyOF9CWVRFUyB8CisJCQkgICAgIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfTUFYX1JFUVNfOCB8CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCQkgICAgIE5WX1BGSUZPX0NBQ0hFMV9CSUdfRU5ESUFOIHwKKyNlbmRpZgorCQkJICAgICAwKSk7CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKworCS8qIGVuYWJsZSB0aGUgZmlmbyBkbWEgb3BlcmF0aW9uICovCisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSwKKwkJbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSkgfCAoMSA8PCBjaGFuLT5pZCkpOworCXJldHVybiAwOworfQorCit2b2lkCitudjA0X2ZpZm9fZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX01PREUsCisJCW52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX01PREUpICYgfigxIDw8IGNoYW4tPmlkKSk7CisKKwlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJmNoYW4tPnJhbWZjKTsKK30KKworc3RhdGljIHZvaWQKK252MDRfZmlmb19kb19sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNoaWQpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBmYyA9IE5WMDRfUkFNRkMoY2hpZCksIHRtcDsKKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIGZhbHNlKTsKKworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfUFVULCBudl9yaTMyKGRldiwgZmMgKyAwKSk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9HRVQsIG52X3JpMzIoZGV2LCBmYyArIDQpKTsKKwl0bXAgPSBudl9yaTMyKGRldiwgZmMgKyA4KTsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0lOU1RBTkNFLCB0bXAgJiAweEZGRkYpOworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfRENPVU5ULCB0bXAgPj4gMTYpOworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfU1RBVEUsIG52X3JpMzIoZGV2LCBmYyArIDEyKSk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSCwgbnZfcmkzMihkZXYsIGZjICsgMTYpKTsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRU5HSU5FLCBudl9yaTMyKGRldiwgZmMgKyAyMCkpOworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9QVUxMMSwgbnZfcmkzMihkZXYsIGZjICsgMjQpKTsKKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisKKwludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfR0VULCAwKTsKKwludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVULCAwKTsKK30KKworaW50CitudjA0X2ZpZm9fbG9hZF9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJdWludDMyX3QgdG1wOworCisJbnZfd3IzMihjaGFuLT5kZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gxLAorCQkJICAgTlYwM19QRklGT19DQUNIRTFfUFVTSDFfRE1BIHwgY2hhbi0+aWQpOworCW52MDRfZmlmb19kb19sb2FkX2NvbnRleHQoY2hhbi0+ZGV2LCBjaGFuLT5pZCk7CisJbnZfd3IzMihjaGFuLT5kZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVNILCAxKTsKKworCS8qIFJlc2V0IE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9DVExfQVRfSU5GTyB0byBJTlZBTElEICovCisJdG1wID0gbnZfcmQzMihjaGFuLT5kZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9DVEwpICYgfigxIDw8IDMxKTsKKwludl93cjMyKGNoYW4tPmRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0NUTCwgdG1wKTsKKworCXJldHVybiAwOworfQorCitpbnQKK252MDRfZmlmb191bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZmlmb19lbmdpbmUgKnBmaWZvID0gJmRldl9wcml2LT5lbmdpbmUuZmlmbzsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gTlVMTDsKKwl1aW50MzJfdCB0bXA7CisJaW50IGNoaWQ7CisKKwljaGlkID0gcGZpZm8tPmNoYW5uZWxfaWQoZGV2KTsKKwlpZiAoY2hpZCA8IDAgfHwgY2hpZCA+PSBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHMpCisJCXJldHVybiAwOworCisJY2hhbiA9IGRldl9wcml2LT5maWZvc1tjaGlkXTsKKwlpZiAoIWNoYW4pIHsKKwkJTlZfRVJST1IoZGV2LCAiSW5hY3RpdmUgY2hhbm5lbCBvbiBQRklGTzogJWRcbiIsIGNoaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKwlSQU1GQ19XUihETUFfUFVULCBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVVCkpOworCVJBTUZDX1dSKERNQV9HRVQsIG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfR0VUKSk7CisJdG1wICA9IG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfRENPVU5UKSA8PCAxNjsKKwl0bXAgfD0gbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9JTlNUQU5DRSk7CisJUkFNRkNfV1IoRE1BX0lOU1RBTkNFLCB0bXApOworCVJBTUZDX1dSKERNQV9TVEFURSwgbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9TVEFURSkpOworCVJBTUZDX1dSKERNQV9GRVRDSCwgbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSCkpOworCVJBTUZDX1dSKEVOR0lORSwgbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0VOR0lORSkpOworCVJBTUZDX1dSKFBVTEwxX0VOR0lORSwgbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX1BVTEwxKSk7CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKworCW52MDRfZmlmb19kb19sb2FkX2NvbnRleHQoZGV2LCBwZmlmby0+Y2hhbm5lbHMgLSAxKTsKKwludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDEsIHBmaWZvLT5jaGFubmVscyAtIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbnYwNF9maWZvX2luaXRfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLAorCQludl9yZDMyKGRldiwgTlYwM19QTUNfRU5BQkxFKSAmIH5OVl9QTUNfRU5BQkxFX1BGSUZPKTsKKwludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLAorCQludl9yZDMyKGRldiwgTlYwM19QTUNfRU5BQkxFKSB8ICBOVl9QTUNfRU5BQkxFX1BGSUZPKTsKKworCW52X3dyMzIoZGV2LCAweDAwMzIyNCwgMHgwMDBmMDA3OCk7CisJbnZfd3IzMihkZXYsIDB4MDAyMDQ0LCAweDAxMDFmZmZmKTsKKwludl93cjMyKGRldiwgMHgwMDIwNDAsIDB4MDAwMDAwZmYpOworCW52X3dyMzIoZGV2LCAweDAwMjUwMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MDAzMDAwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMDMwNTAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwMzIwMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MDAzMjUwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMDMyMjAsIDB4MDAwMDAwMDApOworCisJbnZfd3IzMihkZXYsIDB4MDAzMjUwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMDMyNzAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwMzIxMCwgMHgwMDAwMDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkCitudjA0X2ZpZm9faW5pdF9yYW14eChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwludl93cjMyKGRldiwgTlYwM19QRklGT19SQU1IVCwgKDB4MDMgPDwgMjQpIC8qIHNlYXJjaCAxMjggKi8gfAorCQkJCSAgICAgICAoKGRldl9wcml2LT5yYW1odF9iaXRzIC0gOSkgPDwgMTYpIHwKKwkJCQkgICAgICAgKGRldl9wcml2LT5yYW1odF9vZmZzZXQgPj4gOCkpOworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX1JBTVJPLCBkZXZfcHJpdi0+cmFtcm9fb2Zmc2V0Pj44KTsKKwludl93cjMyKGRldiwgTlYwM19QRklGT19SQU1GQywgZGV2X3ByaXYtPnJhbWZjX29mZnNldCA+PiA4KTsKK30KKworc3RhdGljIHZvaWQKK252MDRfZmlmb19pbml0X2ludHIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwludl93cjMyKGRldiwgMHgwMDIxMDAsIDB4ZmZmZmZmZmYpOworCW52X3dyMzIoZGV2LCAweDAwMjE0MCwgMHhmZmZmZmZmZik7Cit9CisKK2ludAorbnYwNF9maWZvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2ZpZm9fZW5naW5lICpwZmlmbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmZpZm87CisJaW50IGk7CisKKwludjA0X2ZpZm9faW5pdF9yZXNldChkZXYpOworCW52MDRfZmlmb19pbml0X3JhbXh4KGRldik7CisKKwludjA0X2ZpZm9fZG9fbG9hZF9jb250ZXh0KGRldiwgcGZpZm8tPmNoYW5uZWxzIC0gMSk7CisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gxLCBwZmlmby0+Y2hhbm5lbHMgLSAxKTsKKworCW52MDRfZmlmb19pbml0X2ludHIoZGV2KTsKKwlwZmlmby0+ZW5hYmxlKGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOyBpKyspIHsKKwkJaWYgKGRldl9wcml2LT5maWZvc1tpXSkgeworCQkJdWludDMyX3QgbW9kZSA9IG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX01PREUpOworCQkJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSwgbW9kZSB8ICgxIDw8IGkpKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2dyYXBoLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2dyYXBoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk2ZWU5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZ3JhcGguYwpAQCAtMCwwICsxLDU3OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA3IFN0ZXBoYW5lIE1hcmNoZXNpbgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisKK3N0YXRpYyB1aW50MzJfdCBudjA0X2dyYXBoX2N0eF9yZWdzW10gPSB7CisJTlYwNF9QR1JBUEhfQ1RYX1NXSVRDSDEsCisJTlYwNF9QR1JBUEhfQ1RYX1NXSVRDSDIsCisJTlYwNF9QR1JBUEhfQ1RYX1NXSVRDSDMsCisJTlYwNF9QR1JBUEhfQ1RYX1NXSVRDSDQsCisJTlYwNF9QR1JBUEhfQ1RYX0NBQ0hFMSwKKwlOVjA0X1BHUkFQSF9DVFhfQ0FDSEUyLAorCU5WMDRfUEdSQVBIX0NUWF9DQUNIRTMsCisJTlYwNF9QR1JBUEhfQ1RYX0NBQ0hFNCwKKwkweDAwNDAwMTg0LAorCTB4MDA0MDAxYTQsCisJMHgwMDQwMDFjNCwKKwkweDAwNDAwMWU0LAorCTB4MDA0MDAxODgsCisJMHgwMDQwMDFhOCwKKwkweDAwNDAwMWM4LAorCTB4MDA0MDAxZTgsCisJMHgwMDQwMDE4YywKKwkweDAwNDAwMWFjLAorCTB4MDA0MDAxY2MsCisJMHgwMDQwMDFlYywKKwkweDAwNDAwMTkwLAorCTB4MDA0MDAxYjAsCisJMHgwMDQwMDFkMCwKKwkweDAwNDAwMWYwLAorCTB4MDA0MDAxOTQsCisJMHgwMDQwMDFiNCwKKwkweDAwNDAwMWQ0LAorCTB4MDA0MDAxZjQsCisJMHgwMDQwMDE5OCwKKwkweDAwNDAwMWI4LAorCTB4MDA0MDAxZDgsCisJMHgwMDQwMDFmOCwKKwkweDAwNDAwMTljLAorCTB4MDA0MDAxYmMsCisJMHgwMDQwMDFkYywKKwkweDAwNDAwMWZjLAorCTB4MDA0MDAxNzQsCisJTlYwNF9QR1JBUEhfRE1BX1NUQVJUXzAsCisJTlYwNF9QR1JBUEhfRE1BX1NUQVJUXzEsCisJTlYwNF9QR1JBUEhfRE1BX0xFTkdUSCwKKwlOVjA0X1BHUkFQSF9ETUFfTUlTQywKKwlOVjA0X1BHUkFQSF9ETUFfUElUQ0gsCisJTlYwNF9QR1JBUEhfQk9GRlNFVDAsCisJTlYwNF9QR1JBUEhfQkJBU0UwLAorCU5WMDRfUEdSQVBIX0JMSU1JVDAsCisJTlYwNF9QR1JBUEhfQk9GRlNFVDEsCisJTlYwNF9QR1JBUEhfQkJBU0UxLAorCU5WMDRfUEdSQVBIX0JMSU1JVDEsCisJTlYwNF9QR1JBUEhfQk9GRlNFVDIsCisJTlYwNF9QR1JBUEhfQkJBU0UyLAorCU5WMDRfUEdSQVBIX0JMSU1JVDIsCisJTlYwNF9QR1JBUEhfQk9GRlNFVDMsCisJTlYwNF9QR1JBUEhfQkJBU0UzLAorCU5WMDRfUEdSQVBIX0JMSU1JVDMsCisJTlYwNF9QR1JBUEhfQk9GRlNFVDQsCisJTlYwNF9QR1JBUEhfQkJBU0U0LAorCU5WMDRfUEdSQVBIX0JMSU1JVDQsCisJTlYwNF9QR1JBUEhfQk9GRlNFVDUsCisJTlYwNF9QR1JBUEhfQkJBU0U1LAorCU5WMDRfUEdSQVBIX0JMSU1JVDUsCisJTlYwNF9QR1JBUEhfQlBJVENIMCwKKwlOVjA0X1BHUkFQSF9CUElUQ0gxLAorCU5WMDRfUEdSQVBIX0JQSVRDSDIsCisJTlYwNF9QR1JBUEhfQlBJVENIMywKKwlOVjA0X1BHUkFQSF9CUElUQ0g0LAorCU5WMDRfUEdSQVBIX1NVUkZBQ0UsCisJTlYwNF9QR1JBUEhfU1RBVEUsCisJTlYwNF9QR1JBUEhfQlNXSVpaTEUyLAorCU5WMDRfUEdSQVBIX0JTV0laWkxFNSwKKwlOVjA0X1BHUkFQSF9CUElYRUwsCisJTlYwNF9QR1JBUEhfTk9USUZZLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1IwLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1IxLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgwMCwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MDEsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDAyLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgwMywKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MDQsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDA1LAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgwNiwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MDcsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDA4LAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgwOSwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MEEsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDBCLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgwQywKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MEQsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDBFLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgwRiwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MTAsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDExLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgxMiwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MTMsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDE0LAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgxNSwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MTYsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDE3LAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgxOCwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MTksCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDFBLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgxQiwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MUMsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDFELAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgxRSwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MUYsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDIwLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgyMSwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MjIsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDIzLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgyNCwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MjUsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDI2LAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgyNywKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MjgsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDI5LAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgyQSwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MkIsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDJDLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgyRCwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MkUsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDJGLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgzMCwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MzEsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDMyLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgzMywKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MzQsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDM1LAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgzNiwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MzcsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDM4LAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgzOSwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4M0EsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDNCLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgzQywKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4M0QsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDNFLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgzRiwKKwlOVjA0X1BHUkFQSF9QQVRURVJOLAorCTB4MDA0MDA4MGMsCisJTlYwNF9QR1JBUEhfUEFUVEVSTl9TSEFQRSwKKwkweDAwNDAwNjAwLAorCU5WMDRfUEdSQVBIX1JPUDMsCisJTlYwNF9QR1JBUEhfQ0hST01BLAorCU5WMDRfUEdSQVBIX0JFVEFfQU5ELAorCU5WMDRfUEdSQVBIX0JFVEFfUFJFTVVMVCwKKwlOVjA0X1BHUkFQSF9DT05UUk9MMCwKKwlOVjA0X1BHUkFQSF9DT05UUk9MMSwKKwlOVjA0X1BHUkFQSF9DT05UUk9MMiwKKwlOVjA0X1BHUkFQSF9CTEVORCwKKwlOVjA0X1BHUkFQSF9TVE9SRURfRk1ULAorCU5WMDRfUEdSQVBIX1NPVVJDRV9DT0xPUiwKKwkweDAwNDAwNTYwLAorCTB4MDA0MDA1NjgsCisJMHgwMDQwMDU2NCwKKwkweDAwNDAwNTZjLAorCTB4MDA0MDA0MDAsCisJMHgwMDQwMDQ4MCwKKwkweDAwNDAwNDA0LAorCTB4MDA0MDA0ODQsCisJMHgwMDQwMDQwOCwKKwkweDAwNDAwNDg4LAorCTB4MDA0MDA0MGMsCisJMHgwMDQwMDQ4YywKKwkweDAwNDAwNDEwLAorCTB4MDA0MDA0OTAsCisJMHgwMDQwMDQxNCwKKwkweDAwNDAwNDk0LAorCTB4MDA0MDA0MTgsCisJMHgwMDQwMDQ5OCwKKwkweDAwNDAwNDFjLAorCTB4MDA0MDA0OWMsCisJMHgwMDQwMDQyMCwKKwkweDAwNDAwNGEwLAorCTB4MDA0MDA0MjQsCisJMHgwMDQwMDRhNCwKKwkweDAwNDAwNDI4LAorCTB4MDA0MDA0YTgsCisJMHgwMDQwMDQyYywKKwkweDAwNDAwNGFjLAorCTB4MDA0MDA0MzAsCisJMHgwMDQwMDRiMCwKKwkweDAwNDAwNDM0LAorCTB4MDA0MDA0YjQsCisJMHgwMDQwMDQzOCwKKwkweDAwNDAwNGI4LAorCTB4MDA0MDA0M2MsCisJMHgwMDQwMDRiYywKKwkweDAwNDAwNDQwLAorCTB4MDA0MDA0YzAsCisJMHgwMDQwMDQ0NCwKKwkweDAwNDAwNGM0LAorCTB4MDA0MDA0NDgsCisJMHgwMDQwMDRjOCwKKwkweDAwNDAwNDRjLAorCTB4MDA0MDA0Y2MsCisJMHgwMDQwMDQ1MCwKKwkweDAwNDAwNGQwLAorCTB4MDA0MDA0NTQsCisJMHgwMDQwMDRkNCwKKwkweDAwNDAwNDU4LAorCTB4MDA0MDA0ZDgsCisJMHgwMDQwMDQ1YywKKwkweDAwNDAwNGRjLAorCTB4MDA0MDA0NjAsCisJMHgwMDQwMDRlMCwKKwkweDAwNDAwNDY0LAorCTB4MDA0MDA0ZTQsCisJMHgwMDQwMDQ2OCwKKwkweDAwNDAwNGU4LAorCTB4MDA0MDA0NmMsCisJMHgwMDQwMDRlYywKKwkweDAwNDAwNDcwLAorCTB4MDA0MDA0ZjAsCisJMHgwMDQwMDQ3NCwKKwkweDAwNDAwNGY0LAorCTB4MDA0MDA0NzgsCisJMHgwMDQwMDRmOCwKKwkweDAwNDAwNDdjLAorCTB4MDA0MDA0ZmMsCisJMHgwMDQwMDUzYywKKwkweDAwNDAwNTQ0LAorCTB4MDA0MDA1NDAsCisJMHgwMDQwMDU0OCwKKwkweDAwNDAwNTYwLAorCTB4MDA0MDA1NjgsCisJMHgwMDQwMDU2NCwKKwkweDAwNDAwNTZjLAorCTB4MDA0MDA1MzQsCisJMHgwMDQwMDUzOCwKKwkweDAwNDAwNTE0LAorCTB4MDA0MDA1MTgsCisJMHgwMDQwMDUxYywKKwkweDAwNDAwNTIwLAorCTB4MDA0MDA1MjQsCisJMHgwMDQwMDUyOCwKKwkweDAwNDAwNTJjLAorCTB4MDA0MDA1MzAsCisJMHgwMDQwMGQwMCwKKwkweDAwNDAwZDQwLAorCTB4MDA0MDBkODAsCisJMHgwMDQwMGQwNCwKKwkweDAwNDAwZDQ0LAorCTB4MDA0MDBkODQsCisJMHgwMDQwMGQwOCwKKwkweDAwNDAwZDQ4LAorCTB4MDA0MDBkODgsCisJMHgwMDQwMGQwYywKKwkweDAwNDAwZDRjLAorCTB4MDA0MDBkOGMsCisJMHgwMDQwMGQxMCwKKwkweDAwNDAwZDUwLAorCTB4MDA0MDBkOTAsCisJMHgwMDQwMGQxNCwKKwkweDAwNDAwZDU0LAorCTB4MDA0MDBkOTQsCisJMHgwMDQwMGQxOCwKKwkweDAwNDAwZDU4LAorCTB4MDA0MDBkOTgsCisJMHgwMDQwMGQxYywKKwkweDAwNDAwZDVjLAorCTB4MDA0MDBkOWMsCisJMHgwMDQwMGQyMCwKKwkweDAwNDAwZDYwLAorCTB4MDA0MDBkYTAsCisJMHgwMDQwMGQyNCwKKwkweDAwNDAwZDY0LAorCTB4MDA0MDBkYTQsCisJMHgwMDQwMGQyOCwKKwkweDAwNDAwZDY4LAorCTB4MDA0MDBkYTgsCisJMHgwMDQwMGQyYywKKwkweDAwNDAwZDZjLAorCTB4MDA0MDBkYWMsCisJMHgwMDQwMGQzMCwKKwkweDAwNDAwZDcwLAorCTB4MDA0MDBkYjAsCisJMHgwMDQwMGQzNCwKKwkweDAwNDAwZDc0LAorCTB4MDA0MDBkYjQsCisJMHgwMDQwMGQzOCwKKwkweDAwNDAwZDc4LAorCTB4MDA0MDBkYjgsCisJMHgwMDQwMGQzYywKKwkweDAwNDAwZDdjLAorCTB4MDA0MDBkYmMsCisJMHgwMDQwMDU5MCwKKwkweDAwNDAwNTk0LAorCTB4MDA0MDA1OTgsCisJMHgwMDQwMDU5YywKKwkweDAwNDAwNWE4LAorCTB4MDA0MDA1YWMsCisJMHgwMDQwMDViMCwKKwkweDAwNDAwNWI0LAorCTB4MDA0MDA1YzAsCisJMHgwMDQwMDVjNCwKKwkweDAwNDAwNWM4LAorCTB4MDA0MDA1Y2MsCisJMHgwMDQwMDVkMCwKKwkweDAwNDAwNWQ0LAorCTB4MDA0MDA1ZDgsCisJMHgwMDQwMDVkYywKKwkweDAwNDAwNWUwLAorCU5WMDRfUEdSQVBIX1BBU1NUSFJVXzAsCisJTlYwNF9QR1JBUEhfUEFTU1RIUlVfMSwKKwlOVjA0X1BHUkFQSF9QQVNTVEhSVV8yLAorCU5WMDRfUEdSQVBIX0RWRF9DT0xPUkZNVCwKKwlOVjA0X1BHUkFQSF9TQ0FMRURfRk9STUFULAorCU5WMDRfUEdSQVBIX01JU0MyNF8wLAorCU5WMDRfUEdSQVBIX01JU0MyNF8xLAorCU5WMDRfUEdSQVBIX01JU0MyNF8yLAorCTB4MDA0MDA1MDAsCisJMHgwMDQwMDUwNCwKKwlOVjA0X1BHUkFQSF9WQUxJRDEsCisJTlYwNF9QR1JBUEhfVkFMSUQyCisKKworfTsKKworc3RydWN0IGdyYXBoX3N0YXRlIHsKKwlpbnQgbnYwNFtBUlJBWV9TSVpFKG52MDRfZ3JhcGhfY3R4X3JlZ3MpXTsKK307CisKK3N0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKgorbnYwNF9ncmFwaF9jaGFubmVsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgY2hpZCA9IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVsczsKKworCWlmIChudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfQ1RYX0NPTlRST0wpICYgMHgwMDAxMDAwMCkKKwkJY2hpZCA9IG52X3JkMzIoZGV2LCBOVjA0X1BHUkFQSF9DVFhfVVNFUikgPj4gMjQ7CisKKwlpZiAoY2hpZCA+PSBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHMpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGRldl9wcml2LT5maWZvc1tjaGlkXTsKK30KKwordm9pZAorbnYwNF9ncmFwaF9jb250ZXh0X3N3aXRjaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IE5VTEw7CisJaW50IGNoaWQ7CisKKwlwZ3JhcGgtPmZpZm9fYWNjZXNzKGRldiwgZmFsc2UpOworCW5vdXZlYXVfd2FpdF9mb3JfaWRsZShkZXYpOworCisJLyogSWYgcHJldmlvdXMgY29udGV4dCBpcyB2YWxpZCwgd2UgbmVlZCB0byBzYXZlIGl0ICovCisJcGdyYXBoLT51bmxvYWRfY29udGV4dChkZXYpOworCisJLyogTG9hZCBjb250ZXh0IGZvciBuZXh0IGNoYW5uZWwgKi8KKwljaGlkID0gZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxfaWQoZGV2KTsKKwljaGFuID0gZGV2X3ByaXYtPmZpZm9zW2NoaWRdOworCWlmIChjaGFuKQorCQludjA0X2dyYXBoX2xvYWRfY29udGV4dChjaGFuKTsKKworCXBncmFwaC0+Zmlmb19hY2Nlc3MoZGV2LCB0cnVlKTsKK30KKworaW50IG52MDRfZ3JhcGhfY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZ3JhcGhfc3RhdGUgKnBncmFwaF9jdHg7CisJTlZfREVCVUcoY2hhbi0+ZGV2LCAibnYwNF9ncmFwaF9jb250ZXh0X2NyZWF0ZSAlZFxuIiwgY2hhbi0+aWQpOworCisJY2hhbi0+cGdyYXBoX2N0eCA9IHBncmFwaF9jdHggPSBremFsbG9jKHNpemVvZigqcGdyYXBoX2N0eCksCisJCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAocGdyYXBoX2N0eCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGRldl9wcml2LT5maWZvc1tjaGFubmVsXS5wZ3JhcGhfY3R4X3VzZXIgPSBjaGFubmVsIDw8IDI0OyAqLworCXBncmFwaF9jdHgtPm52MDRbMF0gPSAweDAwMDFmZmZmOworCS8qIGlzIGl0IHJlYWxseSBuZWVkZWQgPz8/ICovCisjaWYgMAorCWRldl9wcml2LT5maWZvc1tjaGFubmVsXS5wZ3JhcGhfY3R4WzFdID0KKwkJCQkJbnZfcmQzMihkZXYsIE5WX1BHUkFQSF9ERUJVR180KTsKKwlkZXZfcHJpdi0+Zmlmb3NbY2hhbm5lbF0ucGdyYXBoX2N0eFsyXSA9CisJCQkJCW52X3JkMzIoZGV2LCAweDAwNDAwNmIwKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCit2b2lkIG52MDRfZ3JhcGhfZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGdyYXBoX3N0YXRlICpwZ3JhcGhfY3R4ID0gY2hhbi0+cGdyYXBoX2N0eDsKKworCWtmcmVlKHBncmFwaF9jdHgpOworCWNoYW4tPnBncmFwaF9jdHggPSBOVUxMOworfQorCitpbnQgbnYwNF9ncmFwaF9sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBncmFwaF9zdGF0ZSAqcGdyYXBoX2N0eCA9IGNoYW4tPnBncmFwaF9jdHg7CisJdWludDMyX3QgdG1wOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobnYwNF9ncmFwaF9jdHhfcmVncyk7IGkrKykKKwkJbnZfd3IzMihkZXYsIG52MDRfZ3JhcGhfY3R4X3JlZ3NbaV0sIHBncmFwaF9jdHgtPm52MDRbaV0pOworCisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0NUWF9DT05UUk9MLCAweDEwMDEwMTAwKTsKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfQ1RYX1VTRVIsIGNoYW4tPmlkIDw8IDI0KTsKKwl0bXAgPSBudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfRkZJTlRGQ19TVDIpOworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9GRklOVEZDX1NUMiwgdG1wICYgMHgwMDBmZmZmZik7CisJcmV0dXJuIDA7Cit9CisKK2ludAorbnYwNF9ncmFwaF91bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IE5VTEw7CisJc3RydWN0IGdyYXBoX3N0YXRlICpjdHg7CisJdWludDMyX3QgdG1wOworCWludCBpOworCisJY2hhbiA9IHBncmFwaC0+Y2hhbm5lbChkZXYpOworCWlmICghY2hhbikKKwkJcmV0dXJuIDA7CisJY3R4ID0gY2hhbi0+cGdyYXBoX2N0eDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG52MDRfZ3JhcGhfY3R4X3JlZ3MpOyBpKyspCisJCWN0eC0+bnYwNFtpXSA9IG52X3JkMzIoZGV2LCBudjA0X2dyYXBoX2N0eF9yZWdzW2ldKTsKKworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9DVFhfQ09OVFJPTCwgMHgxMDAwMDAwMCk7CisJdG1wICA9IG52X3JkMzIoZGV2LCBOVjA0X1BHUkFQSF9DVFhfVVNFUikgJiAweDAwZmZmZmZmOworCXRtcCB8PSAoZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzIC0gMSkgPDwgMjQ7CisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0NUWF9VU0VSLCB0bXApOworCXJldHVybiAwOworfQorCitpbnQgbnYwNF9ncmFwaF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCB0bXA7CisKKwludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLCBudl9yZDMyKGRldiwgTlYwM19QTUNfRU5BQkxFKSAmCisJCQl+TlZfUE1DX0VOQUJMRV9QR1JBUEgpOworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsIG52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpIHwKKwkJCSBOVl9QTUNfRU5BQkxFX1BHUkFQSCk7CisKKwkvKiBFbmFibGUgUEdSQVBIIGludGVycnVwdHMgKi8KKwludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwgMHhGRkZGRkZGRik7CisJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFJfRU4sIDB4RkZGRkZGRkYpOworCisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX1ZBTElEMSwgMCk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX1ZBTElEMiwgMCk7CisJLypudl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMCwgMHgwMDAwMDFGRik7CisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0RFQlVHXzAsIDB4MDAxRkZGRkYpOyovCisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0RFQlVHXzAsIDB4MTIzMWMwMDApOworCS8qMTIzMUMwMDAgYmxvYiwgMDAxIGhhaWt1Ki8KKwkvLypWX1dSSVRFKE5WMDRfUEdSQVBIX0RFQlVHXzEsIDB4ZjJkOTExMDApOyovCisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0RFQlVHXzEsIDB4NzIxMTExMDApOworCS8qMHg3MjExMTEwMCBibG9iICwgMDEgaGFpa3UqLworCS8qbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0RFQlVHXzIsIDB4MTFkNWY4NzApOyovCisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0RFQlVHXzIsIDB4MTFkNWYwNzEpOworCS8qaGFpa3Ugc2FtZSovCisKKwkvKm52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9ERUJVR18zLCAweGZhZDRmZjMxKTsqLworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9ERUJVR18zLCAweGYwZDRmZjMxKTsKKwkvKmhhaWt1IGFuZCBibG9iIDEwZDQqLworCisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX1NUQVRFICAgICAgICAsIDB4RkZGRkZGRkYpOworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9DVFhfQ09OVFJPTCAgLCAweDEwMDAwMTAwKTsKKwl0bXAgID0gbnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX0NUWF9VU0VSKSAmIDB4MDBmZmZmZmY7CisJdG1wIHw9IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVscyA8PCAyNDsKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfQ1RYX1VTRVIsIHRtcCk7CisKKwkvKiBUaGVzZSBkb24ndCBiZWxvbmcgaGVyZSwgdGhleSdyZSBwYXJ0IG9mIGEgcGVyLWNoYW5uZWwgY29udGV4dCAqLworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9QQVRURVJOX1NIQVBFLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfQkVUQV9BTkQgICAgICwgMHhGRkZGRkZGRik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBudjA0X2dyYXBoX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7Cit9CisKK3ZvaWQKK252MDRfZ3JhcGhfZmlmb19hY2Nlc3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgYm9vbCBlbmFibGVkKQoreworCWlmIChlbmFibGVkKQorCQludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfRklGTywKKwkJCQkJbnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX0ZJRk8pIHwgMSk7CisJZWxzZQorCQludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfRklGTywKKwkJCQkJbnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX0ZJRk8pICYgfjEpOworfQorCitzdGF0aWMgaW50CitudjA0X2dyYXBoX210aGRfc2V0X3JlZihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKKwkJCWludCBtdGhkLCB1aW50MzJfdCBkYXRhKQoreworCWNoYW4tPmZlbmNlLmxhc3Rfc2VxdWVuY2VfaXJxID0gZGF0YTsKKwlub3V2ZWF1X2ZlbmNlX2hhbmRsZXIoY2hhbi0+ZGV2LCBjaGFuLT5pZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAorCQkJICAgICAgaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwl1aW50MzJfdCBpbnN0YW5jZSA9IG52X3JkMzIoZGV2LCBOVjA0X1BHUkFQSF9DVFhfU1dJVENINCkgJiAweGZmZmY7CisJaW50IHN1YmMgPSAobnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX1RSQVBQRURfQUREUikgPj4gMTMpICYgMHg3OworCXVpbnQzMl90IHRtcDsKKworCXRtcCAgPSBudl9yaTMyKGRldiwgaW5zdGFuY2UpOworCXRtcCAmPSB+MHgwMDAzODAwMDsKKwl0bXAgfD0gKChkYXRhICYgNykgPDwgMTUpOworCisJbnZfd2kzMihkZXYsIGluc3RhbmNlLCB0bXApOworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9DVFhfU1dJVENIMSwgdG1wKTsKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfQ1RYX0NBQ0hFMSArIHN1YmMsIHRtcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X21ldGhvZCBudjA0X2dyYXBoX210aGRzX20ybWZbXSA9IHsKKwl7IDB4MDE1MCwgbnYwNF9ncmFwaF9tdGhkX3NldF9yZWYgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfbWV0aG9kIG52MDRfZ3JhcGhfbXRoZHNfc2V0X29wZXJhdGlvbltdID0geworCXsgMHgwMmZjLCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbiB9LAorCXt9LAorfTsKKworc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyBudjA0X2dyYXBoX2dyY2xhc3NbXSA9IHsKKwl7IDB4MDAzOSwgZmFsc2UsIG52MDRfZ3JhcGhfbXRoZHNfbTJtZiB9LAorCXsgMHgwMDRhLCBmYWxzZSwgbnYwNF9ncmFwaF9tdGhkc19zZXRfb3BlcmF0aW9uIH0sIC8qIGdkaXJlY3QgKi8KKwl7IDB4MDA1ZiwgZmFsc2UsIG52MDRfZ3JhcGhfbXRoZHNfc2V0X29wZXJhdGlvbiB9LCAvKiBpbWFnZWJsaXQgKi8KKwl7IDB4MDA2MSwgZmFsc2UsIG52MDRfZ3JhcGhfbXRoZHNfc2V0X29wZXJhdGlvbiB9LCAvKiBpZmMgKi8KKwl7IDB4MDA3NywgZmFsc2UsIG52MDRfZ3JhcGhfbXRoZHNfc2V0X29wZXJhdGlvbiB9LCAvKiBzaWZtICovCisJeyAweDAwMzAsIGZhbHNlLCBOVUxMIH0sIC8qIG51bGwgKi8KKwl7IDB4MDA0MiwgZmFsc2UsIE5VTEwgfSwgLyogc3VyZjJkICovCisJeyAweDAwNDMsIGZhbHNlLCBOVUxMIH0sIC8qIHJvcCAqLworCXsgMHgwMDEyLCBmYWxzZSwgTlVMTCB9LCAvKiBiZXRhMSAqLworCXsgMHgwMDcyLCBmYWxzZSwgTlVMTCB9LCAvKiBiZXRhNCAqLworCXsgMHgwMDE5LCBmYWxzZSwgTlVMTCB9LCAvKiBjbGlwcmVjdCAqLworCXsgMHgwMDQ0LCBmYWxzZSwgTlVMTCB9LCAvKiBwYXR0ZXJuICovCisJeyAweDAwNTIsIGZhbHNlLCBOVUxMIH0sIC8qIHN3enN1cmYgKi8KKwl7IDB4MDA1MywgZmFsc2UsIE5VTEwgfSwgLyogc3VyZjNkICovCisJeyAweDAwNTQsIGZhbHNlLCBOVUxMIH0sIC8qIHRleF90cmkgKi8KKwl7IDB4MDA1NSwgZmFsc2UsIE5VTEwgfSwgLyogbXVsdGl0ZXhfdHJpICovCisJe30KK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfaW5zdG1lbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9pbnN0bWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIwYzIwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfaW5zdG1lbS5jCkBAIC0wLDAgKzEsMjA4IEBACisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisKKy8qIHJldHVybnMgdGhlIHNpemUgb2YgZmlmbyBjb250ZXh0ICovCitzdGF0aWMgaW50Citub3V2ZWF1X2ZpZm9fY3R4X3NpemUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4NDApCisJCXJldHVybiAxMjg7CisJZWxzZQorCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDE3KQorCQlyZXR1cm4gNjQ7CisKKwlyZXR1cm4gMzI7Cit9CisKK3N0YXRpYyB2b2lkCitudjA0X2luc3RtZW1fZGV0ZXJtaW5lX2Ftb3VudChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGk7CisKKwkvKiBGaWd1cmUgb3V0IGhvdyBtdWNoIGluc3RhbmNlIG1lbW9yeSB3ZSBuZWVkICovCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNDApIHsKKwkJLyogV2UnbGwgd2FudCBtb3JlIGluc3RhbmNlIG1lbW9yeSB0aGFuIHRoaXMgb24gc29tZSBOVjR4IGNhcmRzLgorCQkgKiBUaGVyZSdzIGEgMTZNQiBhcGVydHVyZSB0byBwbGF5IHdpdGggdGhhdCBtYXBzIG9udG8gdGhlIGVuZAorCQkgKiBvZiB2cmFtLiAgRm9yIG5vdywgb25seSByZXNlcnZlIGEgc21hbGwgcGllY2UgdW50aWwgd2Uga25vdworCQkgKiBtb3JlIGFib3V0IHdoYXQgZWFjaCBjaGlwc2V0IHJlcXVpcmVzLgorCQkgKi8KKwkJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCAmIDB4ZjApIHsKKwkJY2FzZSAweDQwOgorCQljYXNlIDB4NDc6CisJCWNhc2UgMHg0OToKKwkJY2FzZSAweDRiOgorCQkJZGV2X3ByaXYtPnJhbWluX3JzdmRfdnJhbSA9ICgyICogMTAyNCAqIDEwMjQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfcHJpdi0+cmFtaW5fcnN2ZF92cmFtID0gKDEgKiAxMDI0ICogMTAyNCk7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCS8qWFhYOiB3aGF0ICphcmUqIHRoZSBsaW1pdHMgb24gPE5WNDAgY2FyZHM/CisJCSAqLworCQlkZXZfcHJpdi0+cmFtaW5fcnN2ZF92cmFtID0gKDUxMiAqIDEwMjQpOworCX0KKwlOVl9ERUJVRyhkZXYsICJSQU1JTiBzaXplOiAlZEtpQlxuIiwgZGV2X3ByaXYtPnJhbWluX3JzdmRfdnJhbSA+PiAxMCk7CisKKwkvKiBDbGVhciBhbGwgb2YgaXQsIGV4Y2VwdCB0aGUgQklPUyBpbWFnZSB0aGF0J3MgaW4gdGhlIGZpcnN0IDY0S2lCICovCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CisJZm9yIChpID0gNjQgKiAxMDI0OyBpIDwgZGV2X3ByaXYtPnJhbWluX3JzdmRfdnJhbTsgaSArPSA0KQorCQludl93aTMyKGRldiwgaSwgMHgwMDAwMDAwMCk7CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKK30KKworc3RhdGljIHZvaWQKK252MDRfaW5zdG1lbV9jb25maWd1cmVfZml4ZWRfdGFibGVzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmdpbmUgKmVuZ2luZSA9ICZkZXZfcHJpdi0+ZW5naW5lOworCisJLyogRklGTyBoYXNoIHRhYmxlIChSQU1IVCkKKwkgKiAgIHVzZSA0ayBoYXNoIHRhYmxlIGF0IFJBTUlOKzB4MTAwMDAKKwkgKiAgIFRPRE86IGV4dGVuZCB0aGUgaGFzaCB0YWJsZQorCSAqLworCWRldl9wcml2LT5yYW1odF9vZmZzZXQgPSAweDEwMDAwOworCWRldl9wcml2LT5yYW1odF9iaXRzICAgPSA5OworCWRldl9wcml2LT5yYW1odF9zaXplICAgPSAoMSA8PCBkZXZfcHJpdi0+cmFtaHRfYml0cyk7IC8qIG5yIGVudHJpZXMgKi8KKwlkZXZfcHJpdi0+cmFtaHRfc2l6ZSAgKj0gODsgLyogMiAzMi1iaXQgdmFsdWVzIHBlciBlbnRyeSBpbiBSQU1IVCAqLworCU5WX0RFQlVHKGRldiwgIlJBTUhUIG9mZnNldD0weCV4LCBzaXplPSVkXG4iLCBkZXZfcHJpdi0+cmFtaHRfb2Zmc2V0LAorCQkJCQkJICAgICAgZGV2X3ByaXYtPnJhbWh0X3NpemUpOworCisJLyogRklGTyBydW5vdXQgdGFibGUgKFJBTVJPKSAtIDUxMmsgYXQgMHgxMTIwMCAqLworCWRldl9wcml2LT5yYW1yb19vZmZzZXQgPSAweDExMjAwOworCWRldl9wcml2LT5yYW1yb19zaXplICAgPSA1MTI7CisJTlZfREVCVUcoZGV2LCAiUkFNUk8gb2Zmc2V0PTB4JXgsIHNpemU9JWRcbiIsIGRldl9wcml2LT5yYW1yb19vZmZzZXQsCisJCQkJCQkgICAgICBkZXZfcHJpdi0+cmFtcm9fc2l6ZSk7CisKKwkvKiBGSUZPIGNvbnRleHQgdGFibGUgKFJBTUZDKQorCSAqICAgTlY0MCAgOiBOb3Qgc3VyZSBleGFjdGx5IGhvdyB0byBwb3NpdGlvbiBSQU1GQyBvbiBzb21lIGNhcmRzLAorCSAqICAgICAgICAgICAweDMwMDAyIHNlZW1zIHRvIHBvc2l0aW9uIGl0IGF0IFJBTUlOKzB4MjAwMDAgb24gdGhlc2UKKwkgKiAgICAgICAgICAgY2FyZHMuICBSQU1GQyBpcyA0a2IgKDMyIGZpZm9zLCAxMjhieXRlIGVudHJpZXMpLgorCSAqICAgT3RoZXJzOiBQb3NpdGlvbiBSQU1GQyBhdCBSQU1JTisweDExNDAwCisJICovCisJZGV2X3ByaXYtPnJhbWZjX3NpemUgPSBlbmdpbmUtPmZpZm8uY2hhbm5lbHMgKgorCQkJCQkJbm91dmVhdV9maWZvX2N0eF9zaXplKGRldik7CisJc3dpdGNoIChkZXZfcHJpdi0+Y2FyZF90eXBlKSB7CisJY2FzZSBOVl80MDoKKwkJZGV2X3ByaXYtPnJhbWZjX29mZnNldCA9IDB4MjAwMDA7CisJCWJyZWFrOworCWNhc2UgTlZfMzA6CisJY2FzZSBOVl8yMDoKKwljYXNlIE5WXzEwOgorCWNhc2UgTlZfMDQ6CisJZGVmYXVsdDoKKwkJZGV2X3ByaXYtPnJhbWZjX29mZnNldCA9IDB4MTE0MDA7CisJCWJyZWFrOworCX0KKwlOVl9ERUJVRyhkZXYsICJSQU1GQyBvZmZzZXQ9MHgleCwgc2l6ZT0lZFxuIiwgZGV2X3ByaXYtPnJhbWZjX29mZnNldCwKKwkJCQkJCSAgICAgIGRldl9wcml2LT5yYW1mY19zaXplKTsKK30KKworaW50IG52MDRfaW5zdG1lbV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBvZmZzZXQ7CisJaW50IHJldCA9IDA7CisKKwludjA0X2luc3RtZW1fZGV0ZXJtaW5lX2Ftb3VudChkZXYpOworCW52MDRfaW5zdG1lbV9jb25maWd1cmVfZml4ZWRfdGFibGVzKGRldik7CisKKwkvKiBDcmVhdGUgYSBoZWFwIHRvIG1hbmFnZSBSQU1JTiBhbGxvY2F0aW9ucywgd2UgZG9uJ3QgYWxsb2NhdGUKKwkgKiB0aGUgc3BhY2UgdGhhdCB3YXMgcmVzZXJ2ZWQgZm9yIFJBTUhUL0ZDL1JPLgorCSAqLworCW9mZnNldCA9IGRldl9wcml2LT5yYW1mY19vZmZzZXQgKyBkZXZfcHJpdi0+cmFtZmNfc2l6ZTsKKworCS8qIEl0IGFwcGVhcnMgUkFNUk8gKG9yIHNvbWV0aGluZz8pIGlzIGNvbnRyb2xsZWQgYnkgMHgyMjIwLzB4MjIzMAorCSAqIG9uIGNlcnRhaW4gTlY0eCBjaGlwc2V0cyBhcyB3ZWxsIGFzIFJBTUZDLiAgV2hlbiAweDIyMzAgPT0gMAorCSAqICgibmV3IHN0eWxlIiBjb250cm9sKSB0aGUgdXBwZXIgMTYtYml0cyBvZiAweDIyMjAgcG9pbnRzIGF0IHRoaXMKKwkgKiBvdGhlciBteXN0ZXJpb3VzIHRhYmxlIHRoYXQncyBjbG9iYmVyaW5nIGltcG9ydGFudCB0aGluZ3MuCisJICoKKwkgKiBXZSdyZSBub3cgcG9pbnRpbmcgdGhpcyBhdCBSQU1JTisweDMwMDAwIHRvIGF2b2lkIFJBTUZDIGdldHRpbmcKKwkgKiBzbWFzaGVkIHRvIHBpZWNlcyBvbiB1cywgc28gcmVzZXJ2ZSAweDMwMDAwLTB4NDAwMDAgdG9vLi4KKwkgKi8KKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl80MCkgeworCQlpZiAob2Zmc2V0IDwgMHg0MDAwMCkKKwkJCW9mZnNldCA9IDB4NDAwMDA7CisJfQorCisJcmV0ID0gbm91dmVhdV9tZW1faW5pdF9oZWFwKCZkZXZfcHJpdi0+cmFtaW5faGVhcCwKKwkJCQkgICAgb2Zmc2V0LCBkZXZfcHJpdi0+cmFtaW5fcnN2ZF92cmFtIC0gb2Zmc2V0KTsKKwlpZiAocmV0KSB7CisJCWRldl9wcml2LT5yYW1pbl9oZWFwID0gTlVMTDsKKwkJTlZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIGluaXQgUkFNSU4gaGVhcFxuIik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwordm9pZAorbnYwNF9pbnN0bWVtX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7Cit9CisKK2ludAorbnYwNF9pbnN0bWVtX3BvcHVsYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqLCB1aW50MzJfdCAqc3opCit7CisJaWYgKGdwdW9iai0+aW1fYmFja2luZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnYwNF9pbnN0bWVtX2NsZWFyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoZ3B1b2JqICYmIGdwdW9iai0+aW1fYmFja2luZykgeworCQlpZiAoZ3B1b2JqLT5pbV9ib3VuZCkKKwkJCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS51bmJpbmQoZGV2LCBncHVvYmopOworCQlncHVvYmotPmltX2JhY2tpbmcgPSBOVUxMOworCX0KK30KKworaW50CitudjA0X2luc3RtZW1fYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaikKK3sKKwlpZiAoIWdwdW9iai0+aW1fcHJhbWluIHx8IGdwdW9iai0+aW1fYm91bmQpCisJCXJldHVybiAtRUlOVkFMOworCisJZ3B1b2JqLT5pbV9ib3VuZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK2ludAorbnYwNF9pbnN0bWVtX3VuYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaikKK3sKKwlpZiAoZ3B1b2JqLT5pbV9ib3VuZCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdwdW9iai0+aW1fYm91bmQgPSAwOworCXJldHVybiAwOworfQorCit2b2lkCitudjA0X2luc3RtZW1fcHJlcGFyZV9hY2Nlc3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgYm9vbCB3cml0ZSkKK3sKK30KKwordm9pZAorbnYwNF9pbnN0bWVtX2ZpbmlzaF9hY2Nlc3Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKK30KKworaW50CitudjA0X2luc3RtZW1fc3VzcGVuZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorCit2b2lkCitudjA0X2luc3RtZW1fcmVzdW1lKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfbWMuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfbWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTdlZDFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9tYy5jCkBAIC0wLDAgKzEsMjAgQEAKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgorCitpbnQKK252MDRfbWNfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCS8qIFBvd2VyIHVwIGV2ZXJ5dGhpbmcsIHJlc2V0dGluZyBlYWNoIGluZGl2aWR1YWwgdW5pdCB3aWxsCisJICogYmUgZG9uZSBsYXRlciBpZiBuZWVkZWQuCisJICovCisKKwludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLCAweEZGRkZGRkZGKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnYwNF9tY190YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF90aW1lci5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF90aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMDlkZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X3RpbWVyLmMKQEAgLTAsMCArMSw1MSBAQAorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCisKK2ludAorbnYwNF90aW1lcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfd3IzMihkZXYsIE5WMDRfUFRJTUVSX0lOVFJfRU5fMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIE5WMDRfUFRJTUVSX0lOVFJfMCwgMHhGRkZGRkZGRik7CisKKwkvKiBKdXN0IHVzZSB0aGUgcHJlLWV4aXN0aW5nIHZhbHVlcyB3aGVuIHBvc3NpYmxlIGZvciBub3c7IHRoZXNlIHJlZ3MKKwkgKiBhcmUgbm90IHdyaXR0ZW4gaW4gbnYgKGRyaXZlciB3cml0ZXIgbWlzc2VkIGEgLzQgb24gdGhlIGFkZHJlc3MpLCBhbmQKKwkgKiB3cml0aW5nIDggYW5kIDMgdG8gdGhlIGNvcnJlY3QgcmVncyBicmVha3MgdGhlIHRpbWluZ3Mgb24gdGhlIExWRFMKKwkgKiBoYXJkd2FyZSBzZXF1ZW5jaW5nIG1pY3JvY29kZS4KKwkgKiBBIGNvcnJlY3Qgc29sdXRpb24gKGludm9sdmluZyBjYWxjdWxhdGlvbnMgd2l0aCB0aGUgR1BVIFBMTCkgY2FuCisJICogYmUgZG9uZSB3aGVuIGtlcm5lbCBtb2Rlc2V0dGluZyBsYW5kcworCSAqLworCWlmICghbnZfcmQzMihkZXYsIE5WMDRfUFRJTUVSX05VTUVSQVRPUikgfHwKKwkJCQkhbnZfcmQzMihkZXYsIE5WMDRfUFRJTUVSX0RFTk9NSU5BVE9SKSkgeworCQludl93cjMyKGRldiwgTlYwNF9QVElNRVJfTlVNRVJBVE9SLCAweDAwMDAwMDA4KTsKKwkJbnZfd3IzMihkZXYsIE5WMDRfUFRJTUVSX0RFTk9NSU5BVE9SLCAweDAwMDAwMDAzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordWludDY0X3QKK252MDRfdGltZXJfcmVhZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXVpbnQzMl90IGxvdzsKKwkvKiBGcm9tIGttbWlvIGR1bXBzIG9uIG52MjggdGhpcyBsb29rcyBsaWtlIGhvdyB0aGUgYmxvYiBkb2VzIHRoaXMuCisJICogSXQgcmVhZHMgdGhlIGhpZ2ggZHdvcmQgdHdpY2UsIGJlZm9yZSBhbmQgYWZ0ZXIuCisJICogVGhlIG9ubHkgZXhwbGFuYXRpb24gc2VlbXMgdG8gYmUgdGhhdCB0aGUgNjQtYml0IHRpbWVyIGNvdW50ZXIKKwkgKiBhZHZhbmNlcyBiZXR3ZWVuIGhpZ2ggYW5kIGxvdyBkd29yZCByZWFkcyBhbmQgbWF5IGNvcnJ1cHQgdGhlCisJICogcmVzdWx0LiBOb3QgY29uZmlybWVkLgorCSAqLworCXVpbnQzMl90IGhpZ2gyID0gbnZfcmQzMihkZXYsIE5WMDRfUFRJTUVSX1RJTUVfMSk7CisJdWludDMyX3QgaGlnaDE7CisJZG8geworCQloaWdoMSA9IGhpZ2gyOworCQlsb3cgPSBudl9yZDMyKGRldiwgTlYwNF9QVElNRVJfVElNRV8wKTsKKwkJaGlnaDIgPSBudl9yZDMyKGRldiwgTlYwNF9QVElNRVJfVElNRV8xKTsKKwl9IHdoaWxlIChoaWdoMSAhPSBoaWdoMik7CisJcmV0dXJuICgoKHVpbnQ2NF90KWhpZ2gyKSA8PCAzMikgfCAodWludDY0X3QpbG93OworfQorCit2b2lkCitudjA0X3RpbWVyX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X3R2LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X3R2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2MzA5OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfdHYuYwpAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBGcmFuY2lzY28gSmVyZXouCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9lbmNvZGVyLmgiCisjaW5jbHVkZSAibm91dmVhdV9jb25uZWN0b3IuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2NydGMuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2h3LmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisKKyNpbmNsdWRlICJpMmMvY2g3MDA2LmgiCisKK3N0YXRpYyBzdHJ1Y3QgeworCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBib2FyZF9pbmZvOworCXN0cnVjdCBkcm1fZW5jb2Rlcl9mdW5jcyBmdW5jczsKKwlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIGhmdW5jczsKKwl2b2lkICpwYXJhbXM7CisKK30gbnYwNF90dl9lbmNvZGVyX2luZm9bXSA9IHsKKwl7CisJCS5ib2FyZF9pbmZvID0geyBJMkNfQk9BUkRfSU5GTygiY2g3MDA2IiwgMHg3NSkgfSwKKwkJLnBhcmFtcyA9ICYoc3RydWN0IGNoNzAwNl9lbmNvZGVyX3BhcmFtcykgeworCQkJQ0g3MDA2X0ZPUk1BVF9SR0IyNG0xMkksIENINzAwNl9DTE9DS19NQVNURVIsCisJCQkwLCAwLCAwLAorCQkJQ0g3MDA2X1NZTkNfU0xBVkUsIENINzAwNl9TWU5DX1NFUEFSQVRFRCwKKwkJCUNINzAwNl9QT1VUXzNfM1YsIENINzAwNl9BQ1RJVkVfSFNZTkMKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIGJvb2wgcHJvYmVfaTJjX2FkZHIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcikKK3sKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CisJCS5hZGRyID0gYWRkciwKKwkJLmxlbiA9IDAsCisJfTsKKworCXJldHVybiBpMmNfdHJhbnNmZXIoYWRhcHRlciwgJm1zZywgMSkgPT0gMTsKK30KKworaW50IG52MDRfdHZfaWRlbnRpZnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGkyY19pbmRleCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjOworCWJvb2wgd2FzX2xvY2tlZDsKKwlpbnQgaSwgcmV0OworCisJTlZfVFJBQ0UoZGV2LCAiUHJvYmluZyBUViBlbmNvZGVycyBvbiBJMkMgYnVzOiAlZFxuIiwgaTJjX2luZGV4KTsKKworCWkyYyA9IG5vdXZlYXVfaTJjX2ZpbmQoZGV2LCBpMmNfaW5kZXgpOworCWlmICghaTJjKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXdhc19sb2NrZWQgPSBOVkxvY2tWZ2FDcnRjcyhkZXYsIGZhbHNlKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG52MDRfdHZfZW5jb2Rlcl9pbmZvKTsgaSsrKSB7CisJCWlmIChwcm9iZV9pMmNfYWRkcigmaTJjLT5hZGFwdGVyLAorCQkJCSAgIG52MDRfdHZfZW5jb2Rlcl9pbmZvW2ldLmJvYXJkX2luZm8uYWRkcikpIHsKKwkJCXJldCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpIDwgQVJSQVlfU0laRShudjA0X3R2X2VuY29kZXJfaW5mbykpIHsKKwkJTlZfVFJBQ0UoZGV2LCAiRGV0ZWN0ZWQgVFYgZW5jb2RlcjogJXNcbiIsCisJCQkgbnYwNF90dl9lbmNvZGVyX2luZm9baV0uYm9hcmRfaW5mby50eXBlKTsKKworCX0gZWxzZSB7CisJCU5WX1RSQUNFKGRldiwgIk5vIFRWIGVuY29kZXJzIGZvdW5kLlxuIik7CisJCWkgPSAtRU5PREVWOworCX0KKworCU5WTG9ja1ZnYUNydGNzKGRldiwgd2FzX2xvY2tlZCk7CisJcmV0dXJuIGk7Cit9CisKKyNkZWZpbmUgUExMU0VMX1RWX0NSVEMxX01BU0sJCQkJXAorCShOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfVFZfVlNDTEsxCQlcCisJIHwgTlZfUFJBTURBQ19QTExfQ09FRkZfU0VMRUNUX1RWX1BDTEsxKQorI2RlZmluZSBQTExTRUxfVFZfQ1JUQzJfTUFTSwkJCQlcCisJKE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVF9UVl9WU0NMSzIJCVwKKwkgfCBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfVFZfUENMSzIpCisKK3N0YXRpYyB2b2lkIG52MDRfdHZfZHBtcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudjA0X21vZGVfc3RhdGUgKnN0YXRlID0gJmRldl9wcml2LT5tb2RlX3JlZzsKKwl1aW50OF90IGNydGMxQTsKKworCU5WX0lORk8oZGV2LCAiU2V0dGluZyBkcG1zIG1vZGUgJWQgb24gVFYgZW5jb2RlciAob3V0cHV0ICVkKVxuIiwKKwkJbW9kZSwgbnZfZW5jb2Rlci0+ZGNiLT5pbmRleCk7CisKKwlzdGF0ZS0+cGxsc2VsICY9IH4oUExMU0VMX1RWX0NSVEMxX01BU0sgfCBQTExTRUxfVFZfQ1JUQzJfTUFTSyk7CisKKwlpZiAobW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKSB7CisJCWludCBoZWFkID0gbm91dmVhdV9jcnRjKGVuY29kZXItPmNydGMpLT5pbmRleDsKKwkJY3J0YzFBID0gTlZSZWFkVmdhQ3J0YyhkZXYsIGhlYWQsIE5WX0NJT19DUkVfUlBDMV9JTkRFWCk7CisKKwkJc3RhdGUtPnBsbHNlbCB8PSBoZWFkID8gUExMU0VMX1RWX0NSVEMyX01BU0sgOgorCQkJCQlQTExTRUxfVFZfQ1JUQzFfTUFTSzsKKworCQkvKiBJbmhpYml0IGhzeW5jICovCisJCWNydGMxQSB8PSAweDgwOworCisJCU5WV3JpdGVWZ2FDcnRjKGRldiwgaGVhZCwgTlZfQ0lPX0NSRV9SUEMxX0lOREVYLCBjcnRjMUEpOworCX0KKworCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1QsIHN0YXRlLT5wbGxzZWwpOworCisJdG9fZW5jb2Rlcl9zbGF2ZShlbmNvZGVyKS0+c2xhdmVfZnVuY3MtPmRwbXMoZW5jb2RlciwgbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIG52MDRfdHZfYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCwgYm9vbCBiaW5kKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52MDRfY3J0Y19yZWcgKnN0YXRlID0gJmRldl9wcml2LT5tb2RlX3JlZy5jcnRjX3JlZ1toZWFkXTsKKworCXN0YXRlLT50dl9zZXR1cCA9IDA7CisKKwlpZiAoYmluZCkgeworCQlzdGF0ZS0+Q1JUQ1tOVl9DSU9fQ1JFX0xDRF9fSU5ERVhdID0gMDsKKwkJc3RhdGUtPkNSVENbTlZfQ0lPX0NSRV80OV0gfD0gMHgxMDsKKwl9IGVsc2UgeworCQlzdGF0ZS0+Q1JUQ1tOVl9DSU9fQ1JFXzQ5XSAmPSB+MHgxMDsKKwl9CisKKwlOVldyaXRlVmdhQ3J0YyhkZXYsIGhlYWQsIE5WX0NJT19DUkVfTENEX19JTkRFWCwKKwkJICAgICAgIHN0YXRlLT5DUlRDW05WX0NJT19DUkVfTENEX19JTkRFWF0pOworCU5WV3JpdGVWZ2FDcnRjKGRldiwgaGVhZCwgTlZfQ0lPX0NSRV80OSwKKwkJICAgICAgIHN0YXRlLT5DUlRDW05WX0NJT19DUkVfNDldKTsKKwlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19UVl9TRVRVUCwKKwkJICAgICAgc3RhdGUtPnR2X3NldHVwKTsKK30KKworc3RhdGljIHZvaWQgbnYwNF90dl9wcmVwYXJlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCWludCBoZWFkID0gbm91dmVhdV9jcnRjKGVuY29kZXItPmNydGMpLT5pbmRleDsKKwlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICpoZWxwZXIgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKworCWhlbHBlci0+ZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09GRik7CisKKwludjA0X2RmcF9kaXNhYmxlKGRldiwgaGVhZCk7CisKKwlpZiAobnZfdHdvX2hlYWRzKGRldikpCisJCW52MDRfdHZfYmluZChkZXYsIGhlYWQgXiAxLCBmYWxzZSk7CisKKwludjA0X3R2X2JpbmQoZGV2LCBoZWFkLCB0cnVlKTsKK30KKworc3RhdGljIHZvaWQgbnYwNF90dl9tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhlbmNvZGVyLT5jcnRjKTsKKwlzdHJ1Y3QgbnYwNF9jcnRjX3JlZyAqcmVncCA9ICZkZXZfcHJpdi0+bW9kZV9yZWcuY3J0Y19yZWdbbnZfY3J0Yy0+aW5kZXhdOworCisJcmVncC0+dHZfaHRvdGFsID0gYWRqdXN0ZWRfbW9kZS0+aHRvdGFsOworCXJlZ3AtPnR2X3Z0b3RhbCA9IGFkanVzdGVkX21vZGUtPnZ0b3RhbDsKKworCS8qIFRoZXNlIGRlbGF5IHRoZSBUViBzaWduYWxzIHdpdGggcmVzcGVjdCB0byB0aGUgVkdBIHBvcnQsCisJICogdGhleSBtaWdodCBiZSB1c2VmdWwgaWYgd2UgZXZlciBhbGxvdyBhIENSVEMgdG8gZHJpdmUKKwkgKiBtdWx0aXBsZSBvdXRwdXRzLgorCSAqLworCXJlZ3AtPnR2X2hza2V3ID0gMTsKKwlyZWdwLT50dl9oc3luY19kZWxheSA9IDE7CisJcmVncC0+dHZfaHN5bmNfZGVsYXkyID0gNjQ7CisJcmVncC0+dHZfdnNrZXcgPSAxOworCXJlZ3AtPnR2X3ZzeW5jX2RlbGF5ID0gMTsKKworCXRvX2VuY29kZXJfc2xhdmUoZW5jb2RlciktPnNsYXZlX2Z1bmNzLT5tb2RlX3NldChlbmNvZGVyLCBtb2RlLCBhZGp1c3RlZF9tb2RlKTsKK30KKworc3RhdGljIHZvaWQgbnYwNF90dl9jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGVuY29kZXItPmNydGMpOworCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmhlbHBlciA9IGVuY29kZXItPmhlbHBlcl9wcml2YXRlOworCisJaGVscGVyLT5kcG1zKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT04pOworCisJTlZfSU5GTyhkZXYsICJPdXRwdXQgJXMgaXMgcnVubmluZyBvbiBDUlRDICVkIHVzaW5nIG91dHB1dCAlY1xuIiwKKwkJICAgICAgZHJtX2dldF9jb25uZWN0b3JfbmFtZSgmbm91dmVhdV9lbmNvZGVyX2Nvbm5lY3Rvcl9nZXQobnZfZW5jb2RlciktPmJhc2UpLCBudl9jcnRjLT5pbmRleCwKKwkJICAgICAgJ0AnICsgZmZzKG52X2VuY29kZXItPmRjYi0+b3IpKTsKK30KKworc3RhdGljIHZvaWQgbnYwNF90dl9kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCisJdG9fZW5jb2Rlcl9zbGF2ZShlbmNvZGVyKS0+c2xhdmVfZnVuY3MtPmRlc3Ryb3koZW5jb2Rlcik7CisKKwlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOworCisJa2ZyZWUobnZfZW5jb2Rlcik7Cit9CisKK2ludCBudjA0X3R2X2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcDsKKwlzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgKmZ1bmNzID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICpoZnVuY3MgPSBOVUxMOworCXN0cnVjdCBkcm1fZW5jb2Rlcl9zbGF2ZV9mdW5jcyAqc2Z1bmNzID0gTlVMTDsKKwlpbnQgaTJjX2luZGV4ID0gZW50cnktPmkyY19pbmRleDsKKwlpbnQgdHlwZSwgcmV0OworCWJvb2wgd2FzX2xvY2tlZDsKKworCS8qIEVuc3VyZSB0aGF0IHdlIGNhbiB0YWxrIHRvIHRoaXMgZW5jb2RlciAqLworCXR5cGUgPSBudjA0X3R2X2lkZW50aWZ5KGRldiwgaTJjX2luZGV4KTsKKwlpZiAodHlwZSA8IDApCisJCXJldHVybiB0eXBlOworCisJLyogQWxsb2NhdGUgdGhlIG5lY2Vzc2FyeSBtZW1vcnkgKi8KKwludl9lbmNvZGVyID0ga3phbGxvYyhzaXplb2YoKm52X2VuY29kZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW52X2VuY29kZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY29tbW9uIG1lbWJlcnMgKi8KKwllbmNvZGVyID0gdG9fZHJtX2VuY29kZXIobnZfZW5jb2Rlcik7CisKKwlmdW5jcyA9ICZudjA0X3R2X2VuY29kZXJfaW5mb1t0eXBlXS5mdW5jczsKKwloZnVuY3MgPSAmbnYwNF90dl9lbmNvZGVyX2luZm9bdHlwZV0uaGZ1bmNzOworCisJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsIGZ1bmNzLCBEUk1fTU9ERV9FTkNPREVSX1RWREFDKTsKKwlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKGVuY29kZXIsIGhmdW5jcyk7CisKKwllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IGVudHJ5LT5oZWFkczsKKwllbmNvZGVyLT5wb3NzaWJsZV9jbG9uZXMgPSAwOworCisJbnZfZW5jb2Rlci0+ZGNiID0gZW50cnk7CisJbnZfZW5jb2Rlci0+b3IgPSBmZnMoZW50cnktPm9yKSAtIDE7CisKKwkvKiBSdW4gdGhlIHNsYXZlLXNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCisJYWRhcCA9ICZkZXZfcHJpdi0+dmJpb3MtPmRjYi0+aTJjW2kyY19pbmRleF0uY2hhbi0+YWRhcHRlcjsKKworCXdhc19sb2NrZWQgPSBOVkxvY2tWZ2FDcnRjcyhkZXYsIGZhbHNlKTsKKworCXJldCA9IGRybV9pMmNfZW5jb2Rlcl9pbml0KGVuY29kZXItPmRldiwgdG9fZW5jb2Rlcl9zbGF2ZShlbmNvZGVyKSwgYWRhcCwKKwkJCQkgICAmbnYwNF90dl9lbmNvZGVyX2luZm9bdHlwZV0uYm9hcmRfaW5mbyk7CisKKwlOVkxvY2tWZ2FDcnRjcyhkZXYsIHdhc19sb2NrZWQpOworCisJaWYgKHJldCA8IDApCisJCWdvdG8gZmFpbDsKKworCS8qIEZpbGwgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJc2Z1bmNzID0gdG9fZW5jb2Rlcl9zbGF2ZShlbmNvZGVyKS0+c2xhdmVfZnVuY3M7CisKKwkqZnVuY3MgPSAoc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzKSB7CisJCS5kZXN0cm95ID0gbnYwNF90dl9kZXN0cm95LAorCX07CisKKwkqaGZ1bmNzID0gKHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MpIHsKKwkJLmRwbXMgPSBudjA0X3R2X2RwbXMsCisJCS5zYXZlID0gc2Z1bmNzLT5zYXZlLAorCQkucmVzdG9yZSA9IHNmdW5jcy0+cmVzdG9yZSwKKwkJLm1vZGVfZml4dXAgPSBzZnVuY3MtPm1vZGVfZml4dXAsCisJCS5wcmVwYXJlID0gbnYwNF90dl9wcmVwYXJlLAorCQkuY29tbWl0ID0gbnYwNF90dl9jb21taXQsCisJCS5tb2RlX3NldCA9IG52MDRfdHZfbW9kZV9zZXQsCisJCS5kZXRlY3QgPSBzZnVuY3MtPmRldGVjdCwKKwl9OworCisJLyogU2V0IHRoZSBzbGF2ZSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gKi8KKwlzZnVuY3MtPnNldF9jb25maWcoZW5jb2RlciwgbnYwNF90dl9lbmNvZGVyX2luZm9bdHlwZV0ucGFyYW1zKTsKKworCXJldHVybiAwOworCitmYWlsOgorCWRybV9lbmNvZGVyX2NsZWFudXAoZW5jb2Rlcik7CisKKwlrZnJlZShudl9lbmNvZGVyKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxMF9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxMF9mYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZTJkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjEwX2ZiLmMKQEAgLTAsMCArMSwyNCBAQAorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCisKK2ludAorbnYxMF9mYl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdWludDMyX3QgZmJfYmFyX3NpemU7CisJaW50IGk7CisKKwlmYl9iYXJfc2l6ZSA9IGRybV9nZXRfcmVzb3VyY2VfbGVuKGRldiwgMCkgLSAxOworCWZvciAoaSA9IDA7IGkgPCBOVjEwX1BGQl9USUxFX19TSVpFOyBpKyspIHsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEZCX1RJTEUoaSksIDApOworCQludl93cjMyKGRldiwgTlYxMF9QRkJfVExJTUlUKGkpLCBmYl9iYXJfc2l6ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252MTBfZmJfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTBfZmlmby5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxMF9maWZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FlYWJmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTBfZmlmby5jCkBAIC0wLDAgKzEsMjYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEJlbiBTa2VnZ3MuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisKKyNkZWZpbmUgTlYxMF9SQU1GQyhjKSAoZGV2X3ByaXYtPnJhbWZjX29mZnNldCArICgoYykgKiBOVjEwX1JBTUZDX19TSVpFKSkKKyNkZWZpbmUgTlYxMF9SQU1GQ19fU0laRSAoKGRldl9wcml2LT5jaGlwc2V0KSA+PSAweDE3ID8gNjQgOiAzMikKKworaW50CitudjEwX2ZpZm9fY2hhbm5lbF9pZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXJldHVybiBudl9yZDMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDEpICYKKwkJCU5WMTBfUEZJRk9fQ0FDSEUxX1BVU0gxX0NISURfTUFTSzsKK30KKworaW50CitudjEwX2ZpZm9fY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjaGFuLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJdWludDMyX3QgZmMgPSBOVjEwX1JBTUZDKGNoYW4tPmlkKTsKKwlpbnQgcmV0OworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X2Zha2UoZGV2LCBOVjEwX1JBTUZDKGNoYW4tPmlkKSwgfjAsCisJCQkJICAgICAgTlYxMF9SQU1GQ19fU0laRSwgTlZPQkpfRkxBR19aRVJPX0FMTE9DIHwKKwkJCQkgICAgICBOVk9CSl9GTEFHX1pFUk9fRlJFRSwgTlVMTCwgJmNoYW4tPnJhbWZjKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogRmlsbCBlbnRyaWVzIHRoYXQgYXJlIHNlZW4gZmlsbGVkIGluIGR1bXBzIG9mIG52aWRpYSBkcml2ZXIganVzdAorCSAqIGFmdGVyIGNoYW5uZWwncyBpcyBwdXQgaW50byBETUEgbW9kZQorCSAqLworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCW52X3dpMzIoZGV2LCBmYyArICAwLCBjaGFuLT5wdXNoYnVmX2Jhc2UpOworCW52X3dpMzIoZGV2LCBmYyArICA0LCBjaGFuLT5wdXNoYnVmX2Jhc2UpOworCW52X3dpMzIoZGV2LCBmYyArIDEyLCBjaGFuLT5wdXNoYnVmLT5pbnN0YW5jZSA+PiA0KTsKKwludl93aTMyKGRldiwgZmMgKyAyMCwgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzEyOF9CWVRFUyB8CisJCQkgICAgICBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1NJWkVfMTI4X0JZVEVTIHwKKwkJCSAgICAgIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfTUFYX1JFUVNfOCB8CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCQkgICAgICBOVl9QRklGT19DQUNIRTFfQklHX0VORElBTiB8CisjZW5kaWYKKwkJCSAgICAgIDApOworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisKKwkvKiBlbmFibGUgdGhlIGZpZm8gZG1hIG9wZXJhdGlvbiAqLworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX01PREUsCisJCW52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX01PREUpIHwgKDEgPDwgY2hhbi0+aWQpKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnYxMF9maWZvX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19NT0RFLAorCQkJbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSkgJiB+KDEgPDwgY2hhbi0+aWQpKTsKKworCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoZGV2LCAmY2hhbi0+cmFtZmMpOworfQorCitzdGF0aWMgdm9pZAorbnYxMF9maWZvX2RvX2xvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2hpZCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IGZjID0gTlYxMF9SQU1GQyhjaGlkKSwgdG1wOworCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgZmFsc2UpOworCisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVQsIG52X3JpMzIoZGV2LCBmYyArIDApKTsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0dFVCwgbnZfcmkzMihkZXYsIGZjICsgNCkpOworCW52X3dyMzIoZGV2LCBOVjEwX1BGSUZPX0NBQ0hFMV9SRUZfQ05ULCBudl9yaTMyKGRldiwgZmMgKyA4KSk7CisKKwl0bXAgPSBudl9yaTMyKGRldiwgZmMgKyAxMik7CisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9JTlNUQU5DRSwgdG1wICYgMHhGRkZGKTsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0RDT1VOVCwgdG1wID4+IDE2KTsKKworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfU1RBVEUsIG52X3JpMzIoZGV2LCBmYyArIDE2KSk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSCwgbnZfcmkzMihkZXYsIGZjICsgMjApKTsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRU5HSU5FLCBudl9yaTMyKGRldiwgZmMgKyAyNCkpOworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9QVUxMMSwgbnZfcmkzMihkZXYsIGZjICsgMjgpKTsKKworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4MTcpCisJCWdvdG8gb3V0OworCisJbnZfd3IzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX0FDUVVJUkVfVkFMVUUsIG52X3JpMzIoZGV2LCBmYyArIDMyKSk7CisJdG1wID0gbnZfcmkzMihkZXYsIGZjICsgMzYpOworCW52X3dyMzIoZGV2LCBOVjEwX1BGSUZPX0NBQ0hFMV9BQ1FVSVJFX1RJTUVTVEFNUCwgdG1wKTsKKwludl93cjMyKGRldiwgTlYxMF9QRklGT19DQUNIRTFfQUNRVUlSRV9USU1FT1VULCBudl9yaTMyKGRldiwgZmMgKyA0MCkpOworCW52X3dyMzIoZGV2LCBOVjEwX1BGSUZPX0NBQ0hFMV9TRU1BUEhPUkUsIG52X3JpMzIoZGV2LCBmYyArIDQ0KSk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX0RNQV9TVUJST1VUSU5FLCBudl9yaTMyKGRldiwgZmMgKyA0OCkpOworCitvdXQ6CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9HRVQsIDApOworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVQsIDApOworfQorCitpbnQKK252MTBfZmlmb19sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXVpbnQzMl90IHRtcDsKKworCW52MTBfZmlmb19kb19sb2FkX2NvbnRleHQoZGV2LCBjaGFuLT5pZCk7CisKKwludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDEsCisJCSAgICAgTlYwM19QRklGT19DQUNIRTFfUFVTSDFfRE1BIHwgY2hhbi0+aWQpOworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfUFVTSCwgMSk7CisKKwkvKiBSZXNldCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfQ1RMX0FUX0lORk8gdG8gSU5WQUxJRCAqLworCXRtcCA9IG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfQ1RMKSAmIH4oMSA8PCAzMSk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9DVEwsIHRtcCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50CitudjEwX2ZpZm9fdW5sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2ZpZm9fZW5naW5lICpwZmlmbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmZpZm87CisJdWludDMyX3QgZmMsIHRtcDsKKwlpbnQgY2hpZDsKKworCWNoaWQgPSBwZmlmby0+Y2hhbm5lbF9pZChkZXYpOworCWlmIChjaGlkIDwgMCB8fCBjaGlkID49IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVscykKKwkJcmV0dXJuIDA7CisJZmMgPSBOVjEwX1JBTUZDKGNoaWQpOworCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CisKKwludl93aTMyKGRldiwgZmMgKyAgMCwgbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVQpKTsKKwludl93aTMyKGRldiwgZmMgKyAgNCwgbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9HRVQpKTsKKwludl93aTMyKGRldiwgZmMgKyAgOCwgbnZfcmQzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX1JFRl9DTlQpKTsKKwl0bXAgID0gbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9JTlNUQU5DRSkgJiAweEZGRkY7CisJdG1wIHw9IChudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0RDT1VOVCkgPDwgMTYpOworCW52X3dpMzIoZGV2LCBmYyArIDEyLCB0bXApOworCW52X3dpMzIoZGV2LCBmYyArIDE2LCBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1NUQVRFKSk7CisJbnZfd2kzMihkZXYsIGZjICsgMjAsIG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0gpKTsKKwludl93aTMyKGRldiwgZmMgKyAyNCwgbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0VOR0lORSkpOworCW52X3dpMzIoZGV2LCBmYyArIDI4LCBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfUFVMTDEpKTsKKworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4MTcpCisJCWdvdG8gb3V0OworCisJbnZfd2kzMihkZXYsIGZjICsgMzIsIG52X3JkMzIoZGV2LCBOVjEwX1BGSUZPX0NBQ0hFMV9BQ1FVSVJFX1ZBTFVFKSk7CisJdG1wID0gbnZfcmQzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX0FDUVVJUkVfVElNRVNUQU1QKTsKKwludl93aTMyKGRldiwgZmMgKyAzNiwgdG1wKTsKKwludl93aTMyKGRldiwgZmMgKyA0MCwgbnZfcmQzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX0FDUVVJUkVfVElNRU9VVCkpOworCW52X3dpMzIoZGV2LCBmYyArIDQ0LCBudl9yZDMyKGRldiwgTlYxMF9QRklGT19DQUNIRTFfU0VNQVBIT1JFKSk7CisJbnZfd2kzMihkZXYsIGZjICsgNDgsIG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfR0VUKSk7CisKK291dDoKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCisJbnYxMF9maWZvX2RvX2xvYWRfY29udGV4dChkZXYsIHBmaWZvLT5jaGFubmVscyAtIDEpOworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMSwgcGZpZm8tPmNoYW5uZWxzIC0gMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitudjEwX2ZpZm9faW5pdF9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsCisJCW52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpICYgfk5WX1BNQ19FTkFCTEVfUEZJRk8pOworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsCisJCW52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpIHwgIE5WX1BNQ19FTkFCTEVfUEZJRk8pOworCisJbnZfd3IzMihkZXYsIDB4MDAzMjI0LCAweDAwMGYwMDc4KTsKKwludl93cjMyKGRldiwgMHgwMDIwNDQsIDB4MDEwMWZmZmYpOworCW52X3dyMzIoZGV2LCAweDAwMjA0MCwgMHgwMDAwMDBmZik7CisJbnZfd3IzMihkZXYsIDB4MDAyNTAwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMDMwMDAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwMzA1MCwgMHgwMDAwMDAwMCk7CisKKwludl93cjMyKGRldiwgMHgwMDMyNTgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwMzIxMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MDAzMjcwLCAweDAwMDAwMDAwKTsKK30KKworc3RhdGljIHZvaWQKK252MTBfZmlmb19pbml0X3JhbXh4KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX1JBTUhULCAoMHgwMyA8PCAyNCkgLyogc2VhcmNoIDEyOCAqLyB8CisJCQkJICAgICAgICgoZGV2X3ByaXYtPnJhbWh0X2JpdHMgLSA5KSA8PCAxNikgfAorCQkJCSAgICAgICAoZGV2X3ByaXYtPnJhbWh0X29mZnNldCA+PiA4KSk7CisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fUkFNUk8sIGRldl9wcml2LT5yYW1yb19vZmZzZXQ+PjgpOworCisJaWYgKGRldl9wcml2LT5jaGlwc2V0IDwgMHgxNykgeworCQludl93cjMyKGRldiwgTlYwM19QRklGT19SQU1GQywgZGV2X3ByaXYtPnJhbWZjX29mZnNldCA+PiA4KTsKKwl9IGVsc2UgeworCQludl93cjMyKGRldiwgTlYwM19QRklGT19SQU1GQywgKGRldl9wcml2LT5yYW1mY19vZmZzZXQgPj4gOCkgfAorCQkJCQkgICAgICAgKDEgPDwgMTYpIC8qIDY0IEJ5dGVzIGVudHJ5Ki8pOworCQkvKiBYWFggbnZpZGlhIGJsb2Igc2V0IGJpdCAxOCwgMjEsMjMgZm9yIG52MjAgJiBudjMwICovCisJfQorfQorCitzdGF0aWMgdm9pZAorbnYxMF9maWZvX2luaXRfaW50cihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCW52X3dyMzIoZGV2LCAweDAwMjEwMCwgMHhmZmZmZmZmZik7CisJbnZfd3IzMihkZXYsIDB4MDAyMTQwLCAweGZmZmZmZmZmKTsKK30KKworaW50CitudjEwX2ZpZm9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZmlmb19lbmdpbmUgKnBmaWZvID0gJmRldl9wcml2LT5lbmdpbmUuZmlmbzsKKwlpbnQgaTsKKworCW52MTBfZmlmb19pbml0X3Jlc2V0KGRldik7CisJbnYxMF9maWZvX2luaXRfcmFteHgoZGV2KTsKKworCW52MTBfZmlmb19kb19sb2FkX2NvbnRleHQoZGV2LCBwZmlmby0+Y2hhbm5lbHMgLSAxKTsKKwludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDEsIHBmaWZvLT5jaGFubmVscyAtIDEpOworCisJbnYxMF9maWZvX2luaXRfaW50cihkZXYpOworCXBmaWZvLT5lbmFibGUoZGV2KTsKKwlwZmlmby0+cmVhc3NpZ24oZGV2LCB0cnVlKTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHM7IGkrKykgeworCQlpZiAoZGV2X3ByaXYtPmZpZm9zW2ldKSB7CisJCQl1aW50MzJfdCBtb2RlID0gbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSk7CisJCQludl93cjMyKGRldiwgTlYwNF9QRklGT19NT0RFLCBtb2RlIHwgKDEgPDwgaSkpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjEwX2dyYXBoLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjEwX2dyYXBoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmNjgwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTBfZ3JhcGguYwpAQCAtMCwwICsxLDg5MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA3IE1hdHRoaWV1IENBU1RFVCA8Y2FzdGV0Lm1hdHRoaWV1QGZyZWUuZnI+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKworI2RlZmluZSBOVjEwX0ZJRk9fTlVNQkVSIDMyCisKK3N0cnVjdCBwaXBlX3N0YXRlIHsKKwl1aW50MzJfdCBwaXBlXzB4MDAwMFsweDA0MC80XTsKKwl1aW50MzJfdCBwaXBlXzB4MDA0MFsweDAxMC80XTsKKwl1aW50MzJfdCBwaXBlXzB4MDIwMFsweDBjMC80XTsKKwl1aW50MzJfdCBwaXBlXzB4NDQwMFsweDA4MC80XTsKKwl1aW50MzJfdCBwaXBlXzB4NjQwMFsweDNiMC80XTsKKwl1aW50MzJfdCBwaXBlXzB4NjgwMFsweDJmMC80XTsKKwl1aW50MzJfdCBwaXBlXzB4NmMwMFsweDAzMC80XTsKKwl1aW50MzJfdCBwaXBlXzB4NzAwMFsweDEzMC80XTsKKwl1aW50MzJfdCBwaXBlXzB4NzQwMFsweDBjMC80XTsKKwl1aW50MzJfdCBwaXBlXzB4NzgwMFsweDBjMC80XTsKK307CisKK3N0YXRpYyBpbnQgbnYxMF9ncmFwaF9jdHhfcmVnc1tdID0geworCU5WMTBfUEdSQVBIX0NUWF9TV0lUQ0gxLAorCU5WMTBfUEdSQVBIX0NUWF9TV0lUQ0gyLAorCU5WMTBfUEdSQVBIX0NUWF9TV0lUQ0gzLAorCU5WMTBfUEdSQVBIX0NUWF9TV0lUQ0g0LAorCU5WMTBfUEdSQVBIX0NUWF9TV0lUQ0g1LAorCU5WMTBfUEdSQVBIX0NUWF9DQUNIRTEsCS8qIDggdmFsdWVzIGZyb20gMHg0MDAxNjAgdG8gMHg0MDAxN2MgKi8KKwlOVjEwX1BHUkFQSF9DVFhfQ0FDSEUyLAkvKiA4IHZhbHVlcyBmcm9tIDB4NDAwMTgwIHRvIDB4NDAwMTljICovCisJTlYxMF9QR1JBUEhfQ1RYX0NBQ0hFMywJLyogOCB2YWx1ZXMgZnJvbSAweDQwMDFhMCB0byAweDQwMDFiYyAqLworCU5WMTBfUEdSQVBIX0NUWF9DQUNIRTQsCS8qIDggdmFsdWVzIGZyb20gMHg0MDAxYzAgdG8gMHg0MDAxZGMgKi8KKwlOVjEwX1BHUkFQSF9DVFhfQ0FDSEU1LAkvKiA4IHZhbHVlcyBmcm9tIDB4NDAwMWUwIHRvIDB4NDAwMWZjICovCisJMHgwMDQwMDE2NCwKKwkweDAwNDAwMTg0LAorCTB4MDA0MDAxYTQsCisJMHgwMDQwMDFjNCwKKwkweDAwNDAwMWU0LAorCTB4MDA0MDAxNjgsCisJMHgwMDQwMDE4OCwKKwkweDAwNDAwMWE4LAorCTB4MDA0MDAxYzgsCisJMHgwMDQwMDFlOCwKKwkweDAwNDAwMTZjLAorCTB4MDA0MDAxOGMsCisJMHgwMDQwMDFhYywKKwkweDAwNDAwMWNjLAorCTB4MDA0MDAxZWMsCisJMHgwMDQwMDE3MCwKKwkweDAwNDAwMTkwLAorCTB4MDA0MDAxYjAsCisJMHgwMDQwMDFkMCwKKwkweDAwNDAwMWYwLAorCTB4MDA0MDAxNzQsCisJMHgwMDQwMDE5NCwKKwkweDAwNDAwMWI0LAorCTB4MDA0MDAxZDQsCisJMHgwMDQwMDFmNCwKKwkweDAwNDAwMTc4LAorCTB4MDA0MDAxOTgsCisJMHgwMDQwMDFiOCwKKwkweDAwNDAwMWQ4LAorCTB4MDA0MDAxZjgsCisJMHgwMDQwMDE3YywKKwkweDAwNDAwMTljLAorCTB4MDA0MDAxYmMsCisJMHgwMDQwMDFkYywKKwkweDAwNDAwMWZjLAorCU5WMTBfUEdSQVBIX0NUWF9VU0VSLAorCU5WMDRfUEdSQVBIX0RNQV9TVEFSVF8wLAorCU5WMDRfUEdSQVBIX0RNQV9TVEFSVF8xLAorCU5WMDRfUEdSQVBIX0RNQV9MRU5HVEgsCisJTlYwNF9QR1JBUEhfRE1BX01JU0MsCisJTlYxMF9QR1JBUEhfRE1BX1BJVENILAorCU5WMDRfUEdSQVBIX0JPRkZTRVQwLAorCU5WMDRfUEdSQVBIX0JCQVNFMCwKKwlOVjA0X1BHUkFQSF9CTElNSVQwLAorCU5WMDRfUEdSQVBIX0JPRkZTRVQxLAorCU5WMDRfUEdSQVBIX0JCQVNFMSwKKwlOVjA0X1BHUkFQSF9CTElNSVQxLAorCU5WMDRfUEdSQVBIX0JPRkZTRVQyLAorCU5WMDRfUEdSQVBIX0JCQVNFMiwKKwlOVjA0X1BHUkFQSF9CTElNSVQyLAorCU5WMDRfUEdSQVBIX0JPRkZTRVQzLAorCU5WMDRfUEdSQVBIX0JCQVNFMywKKwlOVjA0X1BHUkFQSF9CTElNSVQzLAorCU5WMDRfUEdSQVBIX0JPRkZTRVQ0LAorCU5WMDRfUEdSQVBIX0JCQVNFNCwKKwlOVjA0X1BHUkFQSF9CTElNSVQ0LAorCU5WMDRfUEdSQVBIX0JPRkZTRVQ1LAorCU5WMDRfUEdSQVBIX0JCQVNFNSwKKwlOVjA0X1BHUkFQSF9CTElNSVQ1LAorCU5WMDRfUEdSQVBIX0JQSVRDSDAsCisJTlYwNF9QR1JBUEhfQlBJVENIMSwKKwlOVjA0X1BHUkFQSF9CUElUQ0gyLAorCU5WMDRfUEdSQVBIX0JQSVRDSDMsCisJTlYwNF9QR1JBUEhfQlBJVENINCwKKwlOVjEwX1BHUkFQSF9TVVJGQUNFLAorCU5WMTBfUEdSQVBIX1NUQVRFLAorCU5WMDRfUEdSQVBIX0JTV0laWkxFMiwKKwlOVjA0X1BHUkFQSF9CU1dJWlpMRTUsCisJTlYwNF9QR1JBUEhfQlBJWEVMLAorCU5WMTBfUEdSQVBIX05PVElGWSwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SMCwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SMSwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNLCAvKiA2NCB2YWx1ZXMgZnJvbSAweDQwMDkwMCB0byAweDQwMDlmYyAqLworCTB4MDA0MDA5MDQsCisJMHgwMDQwMDkwOCwKKwkweDAwNDAwOTBjLAorCTB4MDA0MDA5MTAsCisJMHgwMDQwMDkxNCwKKwkweDAwNDAwOTE4LAorCTB4MDA0MDA5MWMsCisJMHgwMDQwMDkyMCwKKwkweDAwNDAwOTI0LAorCTB4MDA0MDA5MjgsCisJMHgwMDQwMDkyYywKKwkweDAwNDAwOTMwLAorCTB4MDA0MDA5MzQsCisJMHgwMDQwMDkzOCwKKwkweDAwNDAwOTNjLAorCTB4MDA0MDA5NDAsCisJMHgwMDQwMDk0NCwKKwkweDAwNDAwOTQ4LAorCTB4MDA0MDA5NGMsCisJMHgwMDQwMDk1MCwKKwkweDAwNDAwOTU0LAorCTB4MDA0MDA5NTgsCisJMHgwMDQwMDk1YywKKwkweDAwNDAwOTYwLAorCTB4MDA0MDA5NjQsCisJMHgwMDQwMDk2OCwKKwkweDAwNDAwOTZjLAorCTB4MDA0MDA5NzAsCisJMHgwMDQwMDk3NCwKKwkweDAwNDAwOTc4LAorCTB4MDA0MDA5N2MsCisJMHgwMDQwMDk4MCwKKwkweDAwNDAwOTg0LAorCTB4MDA0MDA5ODgsCisJMHgwMDQwMDk4YywKKwkweDAwNDAwOTkwLAorCTB4MDA0MDA5OTQsCisJMHgwMDQwMDk5OCwKKwkweDAwNDAwOTljLAorCTB4MDA0MDA5YTAsCisJMHgwMDQwMDlhNCwKKwkweDAwNDAwOWE4LAorCTB4MDA0MDA5YWMsCisJMHgwMDQwMDliMCwKKwkweDAwNDAwOWI0LAorCTB4MDA0MDA5YjgsCisJMHgwMDQwMDliYywKKwkweDAwNDAwOWMwLAorCTB4MDA0MDA5YzQsCisJMHgwMDQwMDljOCwKKwkweDAwNDAwOWNjLAorCTB4MDA0MDA5ZDAsCisJMHgwMDQwMDlkNCwKKwkweDAwNDAwOWQ4LAorCTB4MDA0MDA5ZGMsCisJMHgwMDQwMDllMCwKKwkweDAwNDAwOWU0LAorCTB4MDA0MDA5ZTgsCisJMHgwMDQwMDllYywKKwkweDAwNDAwOWYwLAorCTB4MDA0MDA5ZjQsCisJMHgwMDQwMDlmOCwKKwkweDAwNDAwOWZjLAorCU5WMDRfUEdSQVBIX1BBVFRFUk4sCS8qIDIgdmFsdWVzIGZyb20gMHg0MDA4MDggdG8gMHg0MDA4MGMgKi8KKwkweDAwNDAwODBjLAorCU5WMDRfUEdSQVBIX1BBVFRFUk5fU0hBUEUsCisJTlYwM19QR1JBUEhfTU9OT19DT0xPUjAsCisJTlYwNF9QR1JBUEhfUk9QMywKKwlOVjA0X1BHUkFQSF9DSFJPTUEsCisJTlYwNF9QR1JBUEhfQkVUQV9BTkQsCisJTlYwNF9QR1JBUEhfQkVUQV9QUkVNVUxULAorCTB4MDA0MDBlNzAsCisJMHgwMDQwMGU3NCwKKwkweDAwNDAwZTc4LAorCTB4MDA0MDBlN2MsCisJMHgwMDQwMGU4MCwKKwkweDAwNDAwZTg0LAorCTB4MDA0MDBlODgsCisJMHgwMDQwMGU4YywKKwkweDAwNDAwZWEwLAorCTB4MDA0MDBlYTQsCisJMHgwMDQwMGVhOCwKKwkweDAwNDAwZTkwLAorCTB4MDA0MDBlOTQsCisJMHgwMDQwMGU5OCwKKwkweDAwNDAwZTljLAorCU5WMTBfUEdSQVBIX1dJTkRPV0NMSVBfSE9SSVpPTlRBTCwgLyogOCB2YWx1ZXMgZnJvbSAweDQwMGYwMC0weDQwMGYxYyAqLworCU5WMTBfUEdSQVBIX1dJTkRPV0NMSVBfVkVSVElDQUwsICAgLyogOCB2YWx1ZXMgZnJvbSAweDQwMGYyMC0weDQwMGYzYyAqLworCTB4MDA0MDBmMDQsCisJMHgwMDQwMGYyNCwKKwkweDAwNDAwZjA4LAorCTB4MDA0MDBmMjgsCisJMHgwMDQwMGYwYywKKwkweDAwNDAwZjJjLAorCTB4MDA0MDBmMTAsCisJMHgwMDQwMGYzMCwKKwkweDAwNDAwZjE0LAorCTB4MDA0MDBmMzQsCisJMHgwMDQwMGYxOCwKKwkweDAwNDAwZjM4LAorCTB4MDA0MDBmMWMsCisJMHgwMDQwMGYzYywKKwlOVjEwX1BHUkFQSF9YRk1PREUwLAorCU5WMTBfUEdSQVBIX1hGTU9ERTEsCisJTlYxMF9QR1JBUEhfR0xPQkFMU1RBVEUwLAorCU5WMTBfUEdSQVBIX0dMT0JBTFNUQVRFMSwKKwlOVjA0X1BHUkFQSF9TVE9SRURfRk1ULAorCU5WMDRfUEdSQVBIX1NPVVJDRV9DT0xPUiwKKwlOVjAzX1BHUkFQSF9BQlNfWF9SQU0sCS8qIDMyIHZhbHVlcyBmcm9tIDB4NDAwNDAwIHRvIDB4NDAwNDdjICovCisJTlYwM19QR1JBUEhfQUJTX1lfUkFNLAkvKiAzMiB2YWx1ZXMgZnJvbSAweDQwMDQ4MCB0byAweDQwMDRmYyAqLworCTB4MDA0MDA0MDQsCisJMHgwMDQwMDQ4NCwKKwkweDAwNDAwNDA4LAorCTB4MDA0MDA0ODgsCisJMHgwMDQwMDQwYywKKwkweDAwNDAwNDhjLAorCTB4MDA0MDA0MTAsCisJMHgwMDQwMDQ5MCwKKwkweDAwNDAwNDE0LAorCTB4MDA0MDA0OTQsCisJMHgwMDQwMDQxOCwKKwkweDAwNDAwNDk4LAorCTB4MDA0MDA0MWMsCisJMHgwMDQwMDQ5YywKKwkweDAwNDAwNDIwLAorCTB4MDA0MDA0YTAsCisJMHgwMDQwMDQyNCwKKwkweDAwNDAwNGE0LAorCTB4MDA0MDA0MjgsCisJMHgwMDQwMDRhOCwKKwkweDAwNDAwNDJjLAorCTB4MDA0MDA0YWMsCisJMHgwMDQwMDQzMCwKKwkweDAwNDAwNGIwLAorCTB4MDA0MDA0MzQsCisJMHgwMDQwMDRiNCwKKwkweDAwNDAwNDM4LAorCTB4MDA0MDA0YjgsCisJMHgwMDQwMDQzYywKKwkweDAwNDAwNGJjLAorCTB4MDA0MDA0NDAsCisJMHgwMDQwMDRjMCwKKwkweDAwNDAwNDQ0LAorCTB4MDA0MDA0YzQsCisJMHgwMDQwMDQ0OCwKKwkweDAwNDAwNGM4LAorCTB4MDA0MDA0NGMsCisJMHgwMDQwMDRjYywKKwkweDAwNDAwNDUwLAorCTB4MDA0MDA0ZDAsCisJMHgwMDQwMDQ1NCwKKwkweDAwNDAwNGQ0LAorCTB4MDA0MDA0NTgsCisJMHgwMDQwMDRkOCwKKwkweDAwNDAwNDVjLAorCTB4MDA0MDA0ZGMsCisJMHgwMDQwMDQ2MCwKKwkweDAwNDAwNGUwLAorCTB4MDA0MDA0NjQsCisJMHgwMDQwMDRlNCwKKwkweDAwNDAwNDY4LAorCTB4MDA0MDA0ZTgsCisJMHgwMDQwMDQ2YywKKwkweDAwNDAwNGVjLAorCTB4MDA0MDA0NzAsCisJMHgwMDQwMDRmMCwKKwkweDAwNDAwNDc0LAorCTB4MDA0MDA0ZjQsCisJMHgwMDQwMDQ3OCwKKwkweDAwNDAwNGY4LAorCTB4MDA0MDA0N2MsCisJMHgwMDQwMDRmYywKKwlOVjAzX1BHUkFQSF9BQlNfVUNMSVBfWE1JTiwKKwlOVjAzX1BHUkFQSF9BQlNfVUNMSVBfWE1BWCwKKwlOVjAzX1BHUkFQSF9BQlNfVUNMSVBfWU1JTiwKKwlOVjAzX1BHUkFQSF9BQlNfVUNMSVBfWU1BWCwKKwkweDAwNDAwNTUwLAorCTB4MDA0MDA1NTgsCisJMHgwMDQwMDU1NCwKKwkweDAwNDAwNTVjLAorCU5WMDNfUEdSQVBIX0FCU19VQ0xJUEFfWE1JTiwKKwlOVjAzX1BHUkFQSF9BQlNfVUNMSVBBX1hNQVgsCisJTlYwM19QR1JBUEhfQUJTX1VDTElQQV9ZTUlOLAorCU5WMDNfUEdSQVBIX0FCU19VQ0xJUEFfWU1BWCwKKwlOVjAzX1BHUkFQSF9BQlNfSUNMSVBfWE1BWCwKKwlOVjAzX1BHUkFQSF9BQlNfSUNMSVBfWU1BWCwKKwlOVjAzX1BHUkFQSF9YWV9MT0dJQ19NSVNDMCwKKwlOVjAzX1BHUkFQSF9YWV9MT0dJQ19NSVNDMSwKKwlOVjAzX1BHUkFQSF9YWV9MT0dJQ19NSVNDMiwKKwlOVjAzX1BHUkFQSF9YWV9MT0dJQ19NSVNDMywKKwlOVjAzX1BHUkFQSF9DTElQWF8wLAorCU5WMDNfUEdSQVBIX0NMSVBYXzEsCisJTlYwM19QR1JBUEhfQ0xJUFlfMCwKKwlOVjAzX1BHUkFQSF9DTElQWV8xLAorCU5WMTBfUEdSQVBIX0NPTUJJTkVSMF9JTl9BTFBIQSwKKwlOVjEwX1BHUkFQSF9DT01CSU5FUjFfSU5fQUxQSEEsCisJTlYxMF9QR1JBUEhfQ09NQklORVIwX0lOX1JHQiwKKwlOVjEwX1BHUkFQSF9DT01CSU5FUjFfSU5fUkdCLAorCU5WMTBfUEdSQVBIX0NPTUJJTkVSX0NPTE9SMCwKKwlOVjEwX1BHUkFQSF9DT01CSU5FUl9DT0xPUjEsCisJTlYxMF9QR1JBUEhfQ09NQklORVIwX09VVF9BTFBIQSwKKwlOVjEwX1BHUkFQSF9DT01CSU5FUjFfT1VUX0FMUEhBLAorCU5WMTBfUEdSQVBIX0NPTUJJTkVSMF9PVVRfUkdCLAorCU5WMTBfUEdSQVBIX0NPTUJJTkVSMV9PVVRfUkdCLAorCU5WMTBfUEdSQVBIX0NPTUJJTkVSX0ZJTkFMMCwKKwlOVjEwX1BHUkFQSF9DT01CSU5FUl9GSU5BTDEsCisJMHgwMDQwMGUwMCwKKwkweDAwNDAwZTA0LAorCTB4MDA0MDBlMDgsCisJMHgwMDQwMGUwYywKKwkweDAwNDAwZTEwLAorCTB4MDA0MDBlMTQsCisJMHgwMDQwMGUxOCwKKwkweDAwNDAwZTFjLAorCTB4MDA0MDBlMjAsCisJMHgwMDQwMGUyNCwKKwkweDAwNDAwZTI4LAorCTB4MDA0MDBlMmMsCisJMHgwMDQwMGUzMCwKKwkweDAwNDAwZTM0LAorCTB4MDA0MDBlMzgsCisJMHgwMDQwMGUzYywKKwlOVjA0X1BHUkFQSF9QQVNTVEhSVV8wLAorCU5WMDRfUEdSQVBIX1BBU1NUSFJVXzEsCisJTlYwNF9QR1JBUEhfUEFTU1RIUlVfMiwKKwlOVjEwX1BHUkFQSF9ESU1YX1RFWFRVUkUsCisJTlYxMF9QR1JBUEhfV0RJTVhfVEVYVFVSRSwKKwlOVjEwX1BHUkFQSF9EVkRfQ09MT1JGTVQsCisJTlYxMF9QR1JBUEhfU0NBTEVEX0ZPUk1BVCwKKwlOVjA0X1BHUkFQSF9NSVNDMjRfMCwKKwlOVjA0X1BHUkFQSF9NSVNDMjRfMSwKKwlOVjA0X1BHUkFQSF9NSVNDMjRfMiwKKwlOVjAzX1BHUkFQSF9YX01JU0MsCisJTlYwM19QR1JBUEhfWV9NSVNDLAorCU5WMDRfUEdSQVBIX1ZBTElEMSwKKwlOVjA0X1BHUkFQSF9WQUxJRDIsCit9OworCitzdGF0aWMgaW50IG52MTdfZ3JhcGhfY3R4X3JlZ3NbXSA9IHsKKwlOVjEwX1BHUkFQSF9ERUJVR180LAorCTB4MDA0MDA2YjAsCisJMHgwMDQwMGVhYywKKwkweDAwNDAwZWIwLAorCTB4MDA0MDBlYjQsCisJMHgwMDQwMGViOCwKKwkweDAwNDAwZWJjLAorCTB4MDA0MDBlYzAsCisJMHgwMDQwMGVjNCwKKwkweDAwNDAwZWM4LAorCTB4MDA0MDBlY2MsCisJMHgwMDQwMGVkMCwKKwkweDAwNDAwZWQ0LAorCTB4MDA0MDBlZDgsCisJMHgwMDQwMGVkYywKKwkweDAwNDAwZWUwLAorCTB4MDA0MDBhMDAsCisJMHgwMDQwMGEwNCwKK307CisKK3N0cnVjdCBncmFwaF9zdGF0ZSB7CisJaW50IG52MTBbQVJSQVlfU0laRShudjEwX2dyYXBoX2N0eF9yZWdzKV07CisJaW50IG52MTdbQVJSQVlfU0laRShudjE3X2dyYXBoX2N0eF9yZWdzKV07CisJc3RydWN0IHBpcGVfc3RhdGUgcGlwZV9zdGF0ZTsKK307CisKK3N0YXRpYyB2b2lkIG52MTBfZ3JhcGhfc2F2ZV9waXBlKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZ3JhcGhfc3RhdGUgKnBncmFwaF9jdHggPSBjaGFuLT5wZ3JhcGhfY3R4OworCXN0cnVjdCBwaXBlX3N0YXRlICpmaWZvX3BpcGVfc3RhdGUgPSAmcGdyYXBoX2N0eC0+cGlwZV9zdGF0ZTsKKwlpbnQgaTsKKyNkZWZpbmUgUElQRV9TQVZFKGFkZHIpIFwKKwlkbyB7IFwKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1BJUEVfQUREUkVTUywgYWRkcik7IFwKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZmlmb19waXBlX3N0YXRlLT5waXBlXyMjYWRkcik7IGkrKykgXAorCQkJZmlmb19waXBlX3N0YXRlLT5waXBlXyMjYWRkcltpXSA9IG52X3JkMzIoZGV2LCBOVjEwX1BHUkFQSF9QSVBFX0RBVEEpOyBcCisJfSB3aGlsZSAoMCkKKworCVBJUEVfU0FWRSgweDQ0MDApOworCVBJUEVfU0FWRSgweDAyMDApOworCVBJUEVfU0FWRSgweDY0MDApOworCVBJUEVfU0FWRSgweDY4MDApOworCVBJUEVfU0FWRSgweDZjMDApOworCVBJUEVfU0FWRSgweDcwMDApOworCVBJUEVfU0FWRSgweDc0MDApOworCVBJUEVfU0FWRSgweDc4MDApOworCVBJUEVfU0FWRSgweDAwNDApOworCVBJUEVfU0FWRSgweDAwMDApOworCisjdW5kZWYgUElQRV9TQVZFCit9CisKK3N0YXRpYyB2b2lkIG52MTBfZ3JhcGhfbG9hZF9waXBlKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZ3JhcGhfc3RhdGUgKnBncmFwaF9jdHggPSBjaGFuLT5wZ3JhcGhfY3R4OworCXN0cnVjdCBwaXBlX3N0YXRlICpmaWZvX3BpcGVfc3RhdGUgPSAmcGdyYXBoX2N0eC0+cGlwZV9zdGF0ZTsKKwlpbnQgaTsKKwl1aW50MzJfdCB4Zm1vZGUwLCB4Zm1vZGUxOworI2RlZmluZSBQSVBFX1JFU1RPUkUoYWRkcikgXAorCWRvIHsgXAorCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUElQRV9BRERSRVNTLCBhZGRyKTsgXAorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmaWZvX3BpcGVfc3RhdGUtPnBpcGVfIyNhZGRyKTsgaSsrKSBcCisJCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUElQRV9EQVRBLCBmaWZvX3BpcGVfc3RhdGUtPnBpcGVfIyNhZGRyW2ldKTsgXAorCX0gd2hpbGUgKDApCisKKworCW5vdXZlYXVfd2FpdF9mb3JfaWRsZShkZXYpOworCS8qIFhYWCBjaGVjayBoYWlrdSBjb21tZW50cyAqLworCXhmbW9kZTAgPSBudl9yZDMyKGRldiwgTlYxMF9QR1JBUEhfWEZNT0RFMCk7CisJeGZtb2RlMSA9IG52X3JkMzIoZGV2LCBOVjEwX1BHUkFQSF9YRk1PREUxKTsKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfWEZNT0RFMCwgMHgxMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1hGTU9ERTEsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9QSVBFX0FERFJFU1MsIDB4MDAwMDY0YzApOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9QSVBFX0RBVEEsIDB4M2Y4MDAwMDApOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9QSVBFX0RBVEEsIDB4MDAwMDAwMDApOworCisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1BJUEVfQUREUkVTUywgMHgwMDAwNmFiMCk7CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1BJUEVfREFUQSwgMHgzZjgwMDAwMCk7CisKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUElQRV9BRERSRVNTLCAweDAwMDA2YTgwKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUElQRV9EQVRBLCAweDAwMDAwMDAwKTsKKworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9QSVBFX0FERFJFU1MsIDB4MDAwMDAwNDApOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9QSVBFX0RBVEEsIDB4MDAwMDAwMDgpOworCisKKwlQSVBFX1JFU1RPUkUoMHgwMjAwKTsKKwlub3V2ZWF1X3dhaXRfZm9yX2lkbGUoZGV2KTsKKworCS8qIHJlc3RvcmUgWEZNT0RFICovCisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1hGTU9ERTAsIHhmbW9kZTApOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9YRk1PREUxLCB4Zm1vZGUxKTsKKwlQSVBFX1JFU1RPUkUoMHg2NDAwKTsKKwlQSVBFX1JFU1RPUkUoMHg2ODAwKTsKKwlQSVBFX1JFU1RPUkUoMHg2YzAwKTsKKwlQSVBFX1JFU1RPUkUoMHg3MDAwKTsKKwlQSVBFX1JFU1RPUkUoMHg3NDAwKTsKKwlQSVBFX1JFU1RPUkUoMHg3ODAwKTsKKwlQSVBFX1JFU1RPUkUoMHg0NDAwKTsKKwlQSVBFX1JFU1RPUkUoMHgwMDAwKTsKKwlQSVBFX1JFU1RPUkUoMHgwMDQwKTsKKwlub3V2ZWF1X3dhaXRfZm9yX2lkbGUoZGV2KTsKKworI3VuZGVmIFBJUEVfUkVTVE9SRQorfQorCitzdGF0aWMgdm9pZCBudjEwX2dyYXBoX2NyZWF0ZV9waXBlKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZ3JhcGhfc3RhdGUgKnBncmFwaF9jdHggPSBjaGFuLT5wZ3JhcGhfY3R4OworCXN0cnVjdCBwaXBlX3N0YXRlICpmaWZvX3BpcGVfc3RhdGUgPSAmcGdyYXBoX2N0eC0+cGlwZV9zdGF0ZTsKKwl1aW50MzJfdCAqZmlmb19waXBlX3N0YXRlX2FkZHI7CisJaW50IGk7CisjZGVmaW5lIFBJUEVfSU5JVChhZGRyKSBcCisJZG8geyBcCisJCWZpZm9fcGlwZV9zdGF0ZV9hZGRyID0gZmlmb19waXBlX3N0YXRlLT5waXBlXyMjYWRkcjsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIFBJUEVfSU5JVF9FTkQoYWRkcikgXAorCWRvIHsgXAorCQl1aW50MzJfdCAqX19lbmRfYWRkciA9IGZpZm9fcGlwZV9zdGF0ZS0+cGlwZV8jI2FkZHIgKyBcCisJCQkJQVJSQVlfU0laRShmaWZvX3BpcGVfc3RhdGUtPnBpcGVfIyNhZGRyKTsgXAorCQlpZiAoZmlmb19waXBlX3N0YXRlX2FkZHIgIT0gX19lbmRfYWRkcikgXAorCQkJTlZfRVJST1IoZGV2LCAiaW5jb21wbGV0ZSBwaXBlIGluaXQgZm9yIDB4JXggOiAgJXAvJXBcbiIsIFwKKwkJCQlhZGRyLCBmaWZvX3BpcGVfc3RhdGVfYWRkciwgX19lbmRfYWRkcik7IFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBOVl9XUklURV9QSVBFX0lOSVQodmFsdWUpICooZmlmb19waXBlX3N0YXRlX2FkZHIrKykgPSB2YWx1ZQorCisJUElQRV9JTklUKDB4MDIwMCk7CisJZm9yIChpID0gMDsgaSA8IDQ4OyBpKyspCisJCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlQSVBFX0lOSVRfRU5EKDB4MDIwMCk7CisKKwlQSVBFX0lOSVQoMHg2NDAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjExOyBpKyspCisJCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgzZjgwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4NDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDQwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHg0MDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4NDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4M2Y4MDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgzZjAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4M2YwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgzZjgwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgzZjgwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4M2Y4MDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDNmODAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgzZjgwMDAwMCk7CisJUElQRV9JTklUX0VORCgweDY0MDApOworCisJUElQRV9JTklUKDB4NjgwMCk7CisJZm9yIChpID0gMDsgaSA8IDE2MjsgaSsrKQorCQlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4M2Y4MDAwMDApOworCWZvciAoaSA9IDA7IGkgPCAyNTsgaSsrKQorCQlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJUElQRV9JTklUX0VORCgweDY4MDApOworCisJUElQRV9JTklUKDB4NmMwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweGJmODAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJUElQRV9JTklUX0VORCgweDZjMDApOworCisJUElQRV9JTklUKDB4NzAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4NzE0OWYyY2EpOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDcxNDlmMmNhKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHg3MTQ5ZjJjYSk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4NzE0OWYyY2EpOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDcxNDlmMmNhKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHg3MTQ5ZjJjYSk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4NzE0OWYyY2EpOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDcxNDlmMmNhKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzU7IGkrKykKKwkJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCVBJUEVfSU5JVF9FTkQoMHg3MDAwKTsKKworCVBJUEVfSU5JVCgweDc0MDApOworCWZvciAoaSA9IDA7IGkgPCA0ODsgaSsrKQorCQlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJUElQRV9JTklUX0VORCgweDc0MDApOworCisJUElQRV9JTklUKDB4NzgwMCk7CisJZm9yIChpID0gMDsgaSA8IDQ4OyBpKyspCisJCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlQSVBFX0lOSVRfRU5EKDB4NzgwMCk7CisKKwlQSVBFX0lOSVQoMHg0NDAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCVBJUEVfSU5JVF9FTkQoMHg0NDAwKTsKKworCVBJUEVfSU5JVCgweDAwMDApOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJUElQRV9JTklUX0VORCgweDAwMDApOworCisJUElQRV9JTklUKDB4MDA0MCk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCVBJUEVfSU5JVF9FTkQoMHgwMDQwKTsKKworI3VuZGVmIFBJUEVfSU5JVAorI3VuZGVmIFBJUEVfSU5JVF9FTkQKKyN1bmRlZiBOVl9XUklURV9QSVBFX0lOSVQKK30KKworc3RhdGljIGludCBudjEwX2dyYXBoX2N0eF9yZWdzX2ZpbmRfb2Zmc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCByZWcpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobnYxMF9ncmFwaF9jdHhfcmVncyk7IGkrKykgeworCQlpZiAobnYxMF9ncmFwaF9jdHhfcmVnc1tpXSA9PSByZWcpCisJCQlyZXR1cm4gaTsKKwl9CisJTlZfRVJST1IoZGV2LCAidW5rbm93IG9mZnNldCBudjEwX2N0eF9yZWdzICVkXG4iLCByZWcpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBudjE3X2dyYXBoX2N0eF9yZWdzX2ZpbmRfb2Zmc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCByZWcpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobnYxN19ncmFwaF9jdHhfcmVncyk7IGkrKykgeworCQlpZiAobnYxN19ncmFwaF9jdHhfcmVnc1tpXSA9PSByZWcpCisJCQlyZXR1cm4gaTsKKwl9CisJTlZfRVJST1IoZGV2LCAidW5rbm93IG9mZnNldCBudjE3X2N0eF9yZWdzICVkXG4iLCByZWcpOworCXJldHVybiAtMTsKK30KKworaW50IG52MTBfZ3JhcGhfbG9hZF9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBncmFwaF9zdGF0ZSAqcGdyYXBoX2N0eCA9IGNoYW4tPnBncmFwaF9jdHg7CisJdWludDMyX3QgdG1wOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobnYxMF9ncmFwaF9jdHhfcmVncyk7IGkrKykKKwkJbnZfd3IzMihkZXYsIG52MTBfZ3JhcGhfY3R4X3JlZ3NbaV0sIHBncmFwaF9jdHgtPm52MTBbaV0pOworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDE3KSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG52MTdfZ3JhcGhfY3R4X3JlZ3MpOyBpKyspCisJCQludl93cjMyKGRldiwgbnYxN19ncmFwaF9jdHhfcmVnc1tpXSwKKwkJCQkJCXBncmFwaF9jdHgtPm52MTdbaV0pOworCX0KKworCW52MTBfZ3JhcGhfbG9hZF9waXBlKGNoYW4pOworCisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0NUWF9DT05UUk9MLCAweDEwMDEwMTAwKTsKKwl0bXAgPSBudl9yZDMyKGRldiwgTlYxMF9QR1JBUEhfQ1RYX1VTRVIpOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9DVFhfVVNFUiwgKHRtcCAmIDB4ZmZmZmZmKSB8IGNoYW4tPmlkIDw8IDI0KTsKKwl0bXAgPSBudl9yZDMyKGRldiwgTlYxMF9QR1JBUEhfRkZJTlRGQ19TVDIpOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9GRklOVEZDX1NUMiwgdG1wICYgMHhjZmZmZmZmZik7CisJcmV0dXJuIDA7Cit9CisKK2ludAorbnYxMF9ncmFwaF91bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisJc3RydWN0IG5vdXZlYXVfZmlmb19lbmdpbmUgKnBmaWZvID0gJmRldl9wcml2LT5lbmdpbmUuZmlmbzsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOworCXN0cnVjdCBncmFwaF9zdGF0ZSAqY3R4OworCXVpbnQzMl90IHRtcDsKKwlpbnQgaTsKKworCWNoYW4gPSBwZ3JhcGgtPmNoYW5uZWwoZGV2KTsKKwlpZiAoIWNoYW4pCisJCXJldHVybiAwOworCWN0eCA9IGNoYW4tPnBncmFwaF9jdHg7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShudjEwX2dyYXBoX2N0eF9yZWdzKTsgaSsrKQorCQljdHgtPm52MTBbaV0gPSBudl9yZDMyKGRldiwgbnYxMF9ncmFwaF9jdHhfcmVnc1tpXSk7CisKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHgxNykgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShudjE3X2dyYXBoX2N0eF9yZWdzKTsgaSsrKQorCQkJY3R4LT5udjE3W2ldID0gbnZfcmQzMihkZXYsIG52MTdfZ3JhcGhfY3R4X3JlZ3NbaV0pOworCX0KKworCW52MTBfZ3JhcGhfc2F2ZV9waXBlKGNoYW4pOworCisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0NUWF9DT05UUk9MLCAweDEwMDAwMDAwKTsKKwl0bXAgID0gbnZfcmQzMihkZXYsIE5WMTBfUEdSQVBIX0NUWF9VU0VSKSAmIDB4MDBmZmZmZmY7CisJdG1wIHw9IChwZmlmby0+Y2hhbm5lbHMgLSAxKSA8PCAyNDsKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfQ1RYX1VTRVIsIHRtcCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252MTBfZ3JhcGhfY29udGV4dF9zd2l0Y2goc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBOVUxMOworCWludCBjaGlkOworCisJcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIGZhbHNlKTsKKwlub3V2ZWF1X3dhaXRfZm9yX2lkbGUoZGV2KTsKKworCS8qIElmIHByZXZpb3VzIGNvbnRleHQgaXMgdmFsaWQsIHdlIG5lZWQgdG8gc2F2ZSBpdCAqLworCW52MTBfZ3JhcGhfdW5sb2FkX2NvbnRleHQoZGV2KTsKKworCS8qIExvYWQgY29udGV4dCBmb3IgbmV4dCBjaGFubmVsICovCisJY2hpZCA9IChudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9BRERSKSA+PiAyMCkgJiAweDFmOworCWNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbY2hpZF07CisJaWYgKGNoYW4pCisJCW52MTBfZ3JhcGhfbG9hZF9jb250ZXh0KGNoYW4pOworCisJcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIHRydWUpOworfQorCisjZGVmaW5lIE5WX1dSSVRFX0NUWChyZWcsIHZhbCkgZG8geyBcCisJaW50IG9mZnNldCA9IG52MTBfZ3JhcGhfY3R4X3JlZ3NfZmluZF9vZmZzZXQoZGV2LCByZWcpOyBcCisJaWYgKG9mZnNldCA+IDApIFwKKwkJcGdyYXBoX2N0eC0+bnYxMFtvZmZzZXRdID0gdmFsOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBOVjE3X1dSSVRFX0NUWChyZWcsIHZhbCkgZG8geyBcCisJaW50IG9mZnNldCA9IG52MTdfZ3JhcGhfY3R4X3JlZ3NfZmluZF9vZmZzZXQoZGV2LCByZWcpOyBcCisJaWYgKG9mZnNldCA+IDApIFwKKwkJcGdyYXBoX2N0eC0+bnYxN1tvZmZzZXRdID0gdmFsOyBcCisJfSB3aGlsZSAoMCkKKworc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqCitudjEwX2dyYXBoX2NoYW5uZWwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBjaGlkID0gZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOworCisJaWYgKG52X3JkMzIoZGV2LCBOVjEwX1BHUkFQSF9DVFhfQ09OVFJPTCkgJiAweDAwMDEwMDAwKQorCQljaGlkID0gbnZfcmQzMihkZXYsIE5WMTBfUEdSQVBIX0NUWF9VU0VSKSA+PiAyNDsKKworCWlmIChjaGlkID49IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVscykKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gZGV2X3ByaXYtPmZpZm9zW2NoaWRdOworfQorCitpbnQgbnYxMF9ncmFwaF9jcmVhdGVfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZ3JhcGhfc3RhdGUgKnBncmFwaF9jdHg7CisKKwlOVl9ERUJVRyhkZXYsICJudjEwX2dyYXBoX2NvbnRleHRfY3JlYXRlICVkXG4iLCBjaGFuLT5pZCk7CisKKwljaGFuLT5wZ3JhcGhfY3R4ID0gcGdyYXBoX2N0eCA9IGt6YWxsb2Moc2l6ZW9mKCpwZ3JhcGhfY3R4KSwKKwkJCQkJCUdGUF9LRVJORUwpOworCWlmIChwZ3JhcGhfY3R4ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisKKwlOVl9XUklURV9DVFgoMHgwMDQwMGU4OCwgMHgwODAwMDAwMCk7CisJTlZfV1JJVEVfQ1RYKDB4MDA0MDBlOWMsIDB4NGI3ZmZmZmYpOworCU5WX1dSSVRFX0NUWChOVjAzX1BHUkFQSF9YWV9MT0dJQ19NSVNDMCwgMHgwMDAxZmZmZik7CisJTlZfV1JJVEVfQ1RYKDB4MDA0MDBlMTAsIDB4MDAwMDEwMDApOworCU5WX1dSSVRFX0NUWCgweDAwNDAwZTE0LCAweDAwMDAxMDAwKTsKKwlOVl9XUklURV9DVFgoMHgwMDQwMGUzMCwgMHgwMDA4MDAwOCk7CisJTlZfV1JJVEVfQ1RYKDB4MDA0MDBlMzQsIDB4MDAwODAwMDgpOworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDE3KSB7CisJCS8qIGlzIGl0IHJlYWxseSBuZWVkZWQgPz8/ICovCisJCU5WMTdfV1JJVEVfQ1RYKE5WMTBfUEdSQVBIX0RFQlVHXzQsCisJCQkJCW52X3JkMzIoZGV2LCBOVjEwX1BHUkFQSF9ERUJVR180KSk7CisJCU5WMTdfV1JJVEVfQ1RYKDB4MDA0MDA2YjAsIG52X3JkMzIoZGV2LCAweDAwNDAwNmIwKSk7CisJCU5WMTdfV1JJVEVfQ1RYKDB4MDA0MDBlYWMsIDB4MGZmZjAwMDApOworCQlOVjE3X1dSSVRFX0NUWCgweDAwNDAwZWIwLCAweDBmZmYwMDAwKTsKKwkJTlYxN19XUklURV9DVFgoMHgwMDQwMGVjMCwgMHgwMDAwMDA4MCk7CisJCU5WMTdfV1JJVEVfQ1RYKDB4MDA0MDBlZDAsIDB4MDAwMDAwODApOworCX0KKwlOVl9XUklURV9DVFgoTlYxMF9QR1JBUEhfQ1RYX1VTRVIsIGNoYW4tPmlkIDw8IDI0KTsKKworCW52MTBfZ3JhcGhfY3JlYXRlX3BpcGUoY2hhbik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbnYxMF9ncmFwaF9kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZ3JhcGhfc3RhdGUgKnBncmFwaF9jdHggPSBjaGFuLT5wZ3JhcGhfY3R4OworCisJa2ZyZWUocGdyYXBoX2N0eCk7CisJY2hhbi0+cGdyYXBoX2N0eCA9IE5VTEw7Cit9CisKK2ludCBudjEwX2dyYXBoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IHRtcDsKKwlpbnQgaTsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsIG52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpICYKKwkJCX5OVl9QTUNfRU5BQkxFX1BHUkFQSCk7CisJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwgbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgfAorCQkJIE5WX1BNQ19FTkFCTEVfUEdSQVBIKTsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSICAgLCAweEZGRkZGRkZGKTsKKwludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUl9FTiwgMHhGRkZGRkZGRik7CisKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMCwgMHhGRkZGRkZGRik7CisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0RFQlVHXzAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9ERUJVR18xLCAweDAwMTE4NzAwKTsKKwkvKiBudl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMiwgMHgyNEUwMDgxMCk7ICovIC8qIDB4MjVmOTJhZDkgKi8KKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMiwgMHgyNWY5MmFkOSk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0RFQlVHXzMsIDB4NTVERTA4MzAgfAorCQkJCSAgICAgICgxPDwyOSkgfAorCQkJCSAgICAgICgxPDwzMSkpOworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDE3KSB7CisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9ERUJVR180LCAweDFmMDAwMDAwKTsKKwkJbnZfd3IzMihkZXYsIDB4MDA0MDA2YjAsIDB4NDAwMDAwMjApOworCX0gZWxzZQorCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfREVCVUdfNCwgMHgwMDAwMDAwMCk7CisKKwkvKiBjb3B5IHRpbGUgaW5mbyBmcm9tIFBGQiAqLworCWZvciAoaSA9IDA7IGkgPCBOVjEwX1BGQl9USUxFX19TSVpFOyBpKyspIHsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1RJTEUoaSksCisJCQkJCW52X3JkMzIoZGV2LCBOVjEwX1BGQl9USUxFKGkpKSk7CisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9UTElNSVQoaSksCisJCQkJCW52X3JkMzIoZGV2LCBOVjEwX1BGQl9UTElNSVQoaSkpKTsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1RTSVpFKGkpLAorCQkJCQludl9yZDMyKGRldiwgTlYxMF9QRkJfVFNJWkUoaSkpKTsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1RTVEFUVVMoaSksCisJCQkJCW52X3JkMzIoZGV2LCBOVjEwX1BGQl9UU1RBVFVTKGkpKSk7CisJfQorCisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0NUWF9TV0lUQ0gxLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfQ1RYX1NXSVRDSDIsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9DVFhfU1dJVENIMywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0NUWF9TV0lUQ0g0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfU1RBVEUgICAgICAsIDB4RkZGRkZGRkYpOworCisJdG1wICA9IG52X3JkMzIoZGV2LCBOVjEwX1BHUkFQSF9DVFhfVVNFUikgJiAweDAwZmZmZmZmOworCXRtcCB8PSAoZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzIC0gMSkgPDwgMjQ7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0NUWF9VU0VSLCB0bXApOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9DVFhfQ09OVFJPTCwgMHgxMDAwMDEwMCk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0ZGSU5URkNfU1QyLCAweDA4MDAwMDAwKTsKKworCXJldHVybiAwOworfQorCit2b2lkIG52MTBfZ3JhcGhfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKK30KKworc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyBudjEwX2dyYXBoX2dyY2xhc3NbXSA9IHsKKwl7IDB4MDAzMCwgZmFsc2UsIE5VTEwgfSwgLyogbnVsbCAqLworCXsgMHgwMDM5LCBmYWxzZSwgTlVMTCB9LCAvKiBtMm1mICovCisJeyAweDAwNGEsIGZhbHNlLCBOVUxMIH0sIC8qIGdkaXJlY3QgKi8KKwl7IDB4MDA1ZiwgZmFsc2UsIE5VTEwgfSwgLyogaW1hZ2VibGl0ICovCisJeyAweDAwOWYsIGZhbHNlLCBOVUxMIH0sIC8qIGltYWdlYmxpdCAobnYxMikgKi8KKwl7IDB4MDA4YSwgZmFsc2UsIE5VTEwgfSwgLyogaWZjICovCisJeyAweDAwODksIGZhbHNlLCBOVUxMIH0sIC8qIHNpZm0gKi8KKwl7IDB4MDA2MiwgZmFsc2UsIE5VTEwgfSwgLyogc3VyZjJkICovCisJeyAweDAwNDMsIGZhbHNlLCBOVUxMIH0sIC8qIHJvcCAqLworCXsgMHgwMDEyLCBmYWxzZSwgTlVMTCB9LCAvKiBiZXRhMSAqLworCXsgMHgwMDcyLCBmYWxzZSwgTlVMTCB9LCAvKiBiZXRhNCAqLworCXsgMHgwMDE5LCBmYWxzZSwgTlVMTCB9LCAvKiBjbGlwcmVjdCAqLworCXsgMHgwMDQ0LCBmYWxzZSwgTlVMTCB9LCAvKiBwYXR0ZXJuICovCisJeyAweDAwNTIsIGZhbHNlLCBOVUxMIH0sIC8qIHN3enN1cmYgKi8KKwl7IDB4MDA5MywgZmFsc2UsIE5VTEwgfSwgLyogc3VyZjNkICovCisJeyAweDAwOTQsIGZhbHNlLCBOVUxMIH0sIC8qIHRleF90cmkgKi8KKwl7IDB4MDA5NSwgZmFsc2UsIE5VTEwgfSwgLyogbXVsdGl0ZXhfdHJpICovCisJeyAweDAwNTYsIGZhbHNlLCBOVUxMIH0sIC8qIGNlbGNpdXMgKG52MTApICovCisJeyAweDAwOTYsIGZhbHNlLCBOVUxMIH0sIC8qIGNlbGNpdXMgKG52MTEpICovCisJeyAweDAwOTksIGZhbHNlLCBOVUxMIH0sIC8qIGNlbGNpdXMgKG52MTcpICovCisJe30KK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjE3X2dwaW8uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTdfZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNThjMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjE3X2dwaW8uYwpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEZyYW5jaXNjbyBKZXJlei4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2h3LmgiCisKK3N0YXRpYyBib29sCitnZXRfZ3Bpb19sb2NhdGlvbihzdHJ1Y3QgZGNiX2dwaW9fZW50cnkgKmVudCwgdWludDMyX3QgKnJlZywgdWludDMyX3QgKnNoaWZ0LAorCQkgIHVpbnQzMl90ICptYXNrKQoreworCWlmIChlbnQtPmxpbmUgPCAyKSB7CisJCSpyZWcgPSBOVl9QQ1JUQ19HUElPOworCQkqc2hpZnQgPSBlbnQtPmxpbmUgKiAxNjsKKwkJKm1hc2sgPSAweDExOworCisJfSBlbHNlIGlmIChlbnQtPmxpbmUgPCAxMCkgeworCQkqcmVnID0gTlZfUENSVENfR1BJT19FWFQ7CisJCSpzaGlmdCA9IChlbnQtPmxpbmUgLSAyKSAqIDQ7CisJCSptYXNrID0gMHgzOworCisJfSBlbHNlIGlmIChlbnQtPmxpbmUgPCAxNCkgeworCQkqcmVnID0gTlZfUENSVENfODUwOworCQkqc2hpZnQgPSAoZW50LT5saW5lIC0gMTApICogNDsKKwkJKm1hc2sgPSAweDM7CisKKwl9IGVsc2UgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK2ludAorbnYxN19ncGlvX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIGRjYl9ncGlvX3RhZyB0YWcpCit7CisJc3RydWN0IGRjYl9ncGlvX2VudHJ5ICplbnQgPSBub3V2ZWF1X2Jpb3NfZ3Bpb19lbnRyeShkZXYsIHRhZyk7CisJdWludDMyX3QgcmVnLCBzaGlmdCwgbWFzaywgdmFsdWU7CisKKwlpZiAoIWVudCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWdldF9ncGlvX2xvY2F0aW9uKGVudCwgJnJlZywgJnNoaWZ0LCAmbWFzaykpCisJCXJldHVybiAtRU5PREVWOworCisJdmFsdWUgPSBOVlJlYWRDUlRDKGRldiwgMCwgcmVnKSA+PiBzaGlmdDsKKworCXJldHVybiAoZW50LT5pbnZlcnQgPyAxIDogMCkgXiAodmFsdWUgJiAxKTsKK30KKworaW50CitudjE3X2dwaW9fc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gZGNiX2dwaW9fdGFnIHRhZywgaW50IHN0YXRlKQoreworCXN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqZW50ID0gbm91dmVhdV9iaW9zX2dwaW9fZW50cnkoZGV2LCB0YWcpOworCXVpbnQzMl90IHJlZywgc2hpZnQsIG1hc2ssIHZhbHVlOworCisJaWYgKCFlbnQpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFnZXRfZ3Bpb19sb2NhdGlvbihlbnQsICZyZWcsICZzaGlmdCwgJm1hc2spKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXZhbHVlID0gKChlbnQtPmludmVydCA/IDEgOiAwKSBeIChzdGF0ZSA/IDEgOiAwKSkgPDwgc2hpZnQ7CisJbWFzayA9IH4obWFzayA8PCBzaGlmdCk7CisKKwlOVldyaXRlQ1JUQyhkZXYsIDAsIHJlZywgdmFsdWUgfCAoTlZSZWFkQ1JUQyhkZXYsIDAsIHJlZykgJiBtYXNrKSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTdfdHYuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTdfdHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmNmZDljCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxN190di5jCkBAIC0wLDAgKzEsNjgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEZyYW5jaXNjbyBKZXJlei4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2VuY29kZXIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Nvbm5lY3Rvci5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY3J0Yy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfaHcuaCIKKyNpbmNsdWRlICJudjE3X3R2LmgiCisKK2VudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgbnYxN190dl9kZXRlY3Qoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCQkgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkJIHVpbnQzMl90IHBpbl9tYXNrKQoreworCXN0cnVjdCBudjE3X3R2X2VuY29kZXIgKnR2X2VuYyA9IHRvX3R2X2VuYyhlbmNvZGVyKTsKKworCXR2X2VuYy0+cGluX21hc2sgPSBwaW5fbWFzayA+PiAyOCAmIDB4ZTsKKworCXN3aXRjaCAodHZfZW5jLT5waW5fbWFzaykgeworCWNhc2UgMHgyOgorCWNhc2UgMHg0OgorCQl0dl9lbmMtPnN1YmNvbm5lY3RvciA9IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9Db21wb3NpdGU7CisJCWJyZWFrOworCWNhc2UgMHhjOgorCQl0dl9lbmMtPnN1YmNvbm5lY3RvciA9IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9TVklERU87CisJCWJyZWFrOworCWNhc2UgMHhlOgorCQlpZiAobm91dmVhdV9lbmNvZGVyKGVuY29kZXIpLT5kY2ItPnR2Y29uZi5oYXNfY29tcG9uZW50X291dHB1dCkKKwkJCXR2X2VuYy0+c3ViY29ubmVjdG9yID0gRFJNX01PREVfU1VCQ09OTkVDVE9SX0NvbXBvbmVudDsKKwkJZWxzZQorCQkJdHZfZW5jLT5zdWJjb25uZWN0b3IgPSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfU0NBUlQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXR2X2VuYy0+c3ViY29ubmVjdG9yID0gRFJNX01PREVfU1VCQ09OTkVDVE9SX1Vua25vd247CisJCWJyZWFrOworCX0KKworCWRybV9jb25uZWN0b3JfcHJvcGVydHlfc2V0X3ZhbHVlKGNvbm5lY3RvciwKKwkJCWVuY29kZXItPmRldi0+bW9kZV9jb25maWcudHZfc3ViY29ubmVjdG9yX3Byb3BlcnR5LAorCQkJCQkJCXR2X2VuYy0+c3ViY29ubmVjdG9yKTsKKworCXJldHVybiB0dl9lbmMtPnN1YmNvbm5lY3RvciA/IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkIDoKKwkJCQkJY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWludCBoZGlzcGxheTsKKwlpbnQgdmRpc3BsYXk7Cit9IG1vZGVzW10gPSB7CisJeyA2NDAsIDQwMCB9LAorCXsgNjQwLCA0ODAgfSwKKwl7IDcyMCwgNDgwIH0sCisJeyA3MjAsIDU3NiB9LAorCXsgODAwLCA2MDAgfSwKKwl7IDEwMjQsIDc2OCB9LAorCXsgMTI4MCwgNzIwIH0sCisJeyAxMjgwLCAxMDI0IH0sCisJeyAxOTIwLCAxMDgwIH0KK307CisKK3N0YXRpYyBpbnQgbnYxN190dl9nZXRfbW9kZXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBudjE3X3R2X25vcm1fcGFyYW1zICp0dl9ub3JtID0gZ2V0X3R2X25vcm0oZW5jb2Rlcik7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm91dHB1dF9tb2RlOworCWludCBuID0gMDsKKwlpbnQgaTsKKworCWlmICh0dl9ub3JtLT5raW5kICE9IENUVl9FTkNfTU9ERSkgeworCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqdHZfbW9kZTsKKworCQlmb3IgKHR2X21vZGUgPSBudjE3X3R2X21vZGVzOyB0dl9tb2RlLT5oZGlzcGxheTsgdHZfbW9kZSsrKSB7CisJCQltb2RlID0gZHJtX21vZGVfZHVwbGljYXRlKGVuY29kZXItPmRldiwgdHZfbW9kZSk7CisKKwkJCW1vZGUtPmNsb2NrID0gdHZfbm9ybS0+dHZfZW5jX21vZGUudnJlZnJlc2ggKgorCQkJCQkJbW9kZS0+aHRvdGFsIC8gMTAwMCAqCisJCQkJCQltb2RlLT52dG90YWwgLyAxMDAwOworCisJCQlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0RCTFNDQU4pCisJCQkJbW9kZS0+Y2xvY2sgKj0gMjsKKworCQkJaWYgKG1vZGUtPmhkaXNwbGF5ID09IHR2X25vcm0tPnR2X2VuY19tb2RlLmhkaXNwbGF5ICYmCisJCQkgICAgbW9kZS0+dmRpc3BsYXkgPT0gdHZfbm9ybS0+dHZfZW5jX21vZGUudmRpc3BsYXkpCisJCQkJbW9kZS0+dHlwZSB8PSBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRDsKKworCQkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG1vZGUpOworCQkJbisrOworCQl9CisJCXJldHVybiBuOworCX0KKworCS8qIHR2X25vcm0tPmtpbmQgPT0gQ1RWX0VOQ19NT0RFICovCisJb3V0cHV0X21vZGUgPSAmdHZfbm9ybS0+Y3R2X2VuY19tb2RlLm1vZGU7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobW9kZXMpOyBpKyspIHsKKwkJaWYgKG1vZGVzW2ldLmhkaXNwbGF5ID4gb3V0cHV0X21vZGUtPmhkaXNwbGF5IHx8CisJCSAgICBtb2Rlc1tpXS52ZGlzcGxheSA+IG91dHB1dF9tb2RlLT52ZGlzcGxheSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChtb2Rlc1tpXS5oZGlzcGxheSA9PSBvdXRwdXRfbW9kZS0+aGRpc3BsYXkgJiYKKwkJICAgIG1vZGVzW2ldLnZkaXNwbGF5ID09IG91dHB1dF9tb2RlLT52ZGlzcGxheSkgeworCQkJbW9kZSA9IGRybV9tb2RlX2R1cGxpY2F0ZShlbmNvZGVyLT5kZXYsIG91dHB1dF9tb2RlKTsKKwkJCW1vZGUtPnR5cGUgfD0gRFJNX01PREVfVFlQRV9QUkVGRVJSRUQ7CisJCX0gZWxzZSB7CisJCQltb2RlID0gZHJtX2N2dF9tb2RlKGVuY29kZXItPmRldiwgbW9kZXNbaV0uaGRpc3BsYXksCisJCQkJbW9kZXNbaV0udmRpc3BsYXksIDYwLCBmYWxzZSwKKwkJCQlvdXRwdXRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSwKKwkJCQlmYWxzZSk7CisJCX0KKworCQkvKiBDVlQgbW9kZXMgYXJlIHNvbWV0aW1lcyB1bnN1aXRhYmxlLi4uICovCisJCWlmIChvdXRwdXRfbW9kZS0+aGRpc3BsYXkgPD0gNzIwCisJCSAgICB8fCBvdXRwdXRfbW9kZS0+aGRpc3BsYXkgPj0gMTkyMCkgeworCQkJbW9kZS0+aHRvdGFsID0gb3V0cHV0X21vZGUtPmh0b3RhbDsKKwkJCW1vZGUtPmhzeW5jX3N0YXJ0ID0gKG1vZGUtPmhkaXNwbGF5ICsgKG1vZGUtPmh0b3RhbAorCQkJCQkgICAgIC0gbW9kZS0+aGRpc3BsYXkpICogOSAvIDEwKSAmIH43OworCQkJbW9kZS0+aHN5bmNfZW5kID0gbW9kZS0+aHN5bmNfc3RhcnQgKyA4OworCQl9CisJCWlmIChvdXRwdXRfbW9kZS0+dmRpc3BsYXkgPj0gMTAyNCkgeworCQkJbW9kZS0+dnRvdGFsID0gb3V0cHV0X21vZGUtPnZ0b3RhbDsKKwkJCW1vZGUtPnZzeW5jX3N0YXJ0ID0gb3V0cHV0X21vZGUtPnZzeW5jX3N0YXJ0OworCQkJbW9kZS0+dnN5bmNfZW5kID0gb3V0cHV0X21vZGUtPnZzeW5jX2VuZDsKKwkJfQorCisJCW1vZGUtPnR5cGUgfD0gRFJNX01PREVfVFlQRV9EUklWRVI7CisJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBtb2RlKTsKKwkJbisrOworCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBudjE3X3R2X21vZGVfdmFsaWQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJc3RydWN0IG52MTdfdHZfbm9ybV9wYXJhbXMgKnR2X25vcm0gPSBnZXRfdHZfbm9ybShlbmNvZGVyKTsKKworCWlmICh0dl9ub3JtLT5raW5kID09IENUVl9FTkNfTU9ERSkgeworCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqb3V0cHV0X21vZGUgPQorCQkJCQkJJnR2X25vcm0tPmN0dl9lbmNfbW9kZS5tb2RlOworCisJCWlmIChtb2RlLT5jbG9jayA+IDQwMDAwMCkKKwkJCXJldHVybiBNT0RFX0NMT0NLX0hJR0g7CisKKwkJaWYgKG1vZGUtPmhkaXNwbGF5ID4gb3V0cHV0X21vZGUtPmhkaXNwbGF5IHx8CisJCSAgICBtb2RlLT52ZGlzcGxheSA+IG91dHB1dF9tb2RlLT52ZGlzcGxheSkKKwkJCXJldHVybiBNT0RFX0JBRDsKKworCQlpZiAoKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpICE9CisJCSAgICAob3V0cHV0X21vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpKQorCQkJcmV0dXJuIE1PREVfTk9fSU5URVJMQUNFOworCisJCWlmIChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfREJMU0NBTikKKwkJCXJldHVybiBNT0RFX05PX0RCTEVTQ0FOOworCisJfSBlbHNlIHsKKwkJY29uc3QgaW50IHZzeW5jX3RvbGVyYW5jZSA9IDYwMDsKKworCQlpZiAobW9kZS0+Y2xvY2sgPiA3MDAwMCkKKwkJCXJldHVybiBNT0RFX0NMT0NLX0hJR0g7CisKKwkJaWYgKGFicyhkcm1fbW9kZV92cmVmcmVzaChtb2RlKSAqIDEwMDAgLQorCQkJdHZfbm9ybS0+dHZfZW5jX21vZGUudnJlZnJlc2gpID4gdnN5bmNfdG9sZXJhbmNlKQorCQkJcmV0dXJuIE1PREVfVlNZTkM7CisKKwkJLyogVGhlIGVuY29kZXIgdGFrZXMgY2FyZSBvZiB0aGUgYWN0dWFsIGludGVybGFjaW5nICovCisJCWlmIChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKQorCQkJcmV0dXJuIE1PREVfTk9fSU5URVJMQUNFOworCX0KKworCXJldHVybiBNT0RFX09LOworfQorCitzdGF0aWMgYm9vbCBudjE3X3R2X21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXN0cnVjdCBudjE3X3R2X25vcm1fcGFyYW1zICp0dl9ub3JtID0gZ2V0X3R2X25vcm0oZW5jb2Rlcik7CisKKwlpZiAodHZfbm9ybS0+a2luZCA9PSBDVFZfRU5DX01PREUpCisJCWFkanVzdGVkX21vZGUtPmNsb2NrID0gdHZfbm9ybS0+Y3R2X2VuY19tb2RlLm1vZGUuY2xvY2s7CisJZWxzZQorCQlhZGp1c3RlZF9tb2RlLT5jbG9jayA9IDkwMDAwOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkICBudjE3X3R2X2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBudjE3X3R2X3N0YXRlICpyZWdzID0gJnRvX3R2X2VuYyhlbmNvZGVyKS0+c3RhdGU7CisJc3RydWN0IG52MTdfdHZfbm9ybV9wYXJhbXMgKnR2X25vcm0gPSBnZXRfdHZfbm9ybShlbmNvZGVyKTsKKworCWlmIChub3V2ZWF1X2VuY29kZXIoZW5jb2RlciktPmxhc3RfZHBtcyA9PSBtb2RlKQorCQlyZXR1cm47CisJbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpLT5sYXN0X2RwbXMgPSBtb2RlOworCisJTlZfVFJBQ0UoZGV2LCAiU2V0dGluZyBkcG1zIG1vZGUgJWQgb24gVFYgZW5jb2RlciAob3V0cHV0ICVkKVxuIiwKKwkJIG1vZGUsIG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKS0+ZGNiLT5pbmRleCk7CisKKwlyZWdzLT5wdHZfMjAwICY9IH4xOworCisJaWYgKHR2X25vcm0tPmtpbmQgPT0gQ1RWX0VOQ19NT0RFKSB7CisJCW52MDRfZGZwX3VwZGF0ZV9mcF9jb250cm9sKGVuY29kZXIsIG1vZGUpOworCisJfSBlbHNlIHsKKwkJbnYwNF9kZnBfdXBkYXRlX2ZwX2NvbnRyb2woZW5jb2RlciwgRFJNX01PREVfRFBNU19PRkYpOworCisJCWlmIChtb2RlID09IERSTV9NT0RFX0RQTVNfT04pCisJCQlyZWdzLT5wdHZfMjAwIHw9IDE7CisJfQorCisJbnZfbG9hZF9wdHYoZGV2LCByZWdzLCAyMDApOworCisJbnYxN19ncGlvX3NldChkZXYsIERDQl9HUElPX1RWREFDMSwgbW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKTsKKwludjE3X2dwaW9fc2V0KGRldiwgRENCX0dQSU9fVFZEQUMwLCBtb2RlID09IERSTV9NT0RFX0RQTVNfT04pOworCisJbnYwNF9kYWNfdXBkYXRlX2RhY2NsayhlbmNvZGVyLCBtb2RlID09IERSTV9NT0RFX0RQTVNfT04pOworfQorCitzdGF0aWMgdm9pZCBudjE3X3R2X3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICpoZWxwZXIgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnYxN190dl9ub3JtX3BhcmFtcyAqdHZfbm9ybSA9IGdldF90dl9ub3JtKGVuY29kZXIpOworCWludCBoZWFkID0gbm91dmVhdV9jcnRjKGVuY29kZXItPmNydGMpLT5pbmRleDsKKwl1aW50OF90ICpjcl9sY2QgPSAmZGV2X3ByaXYtPm1vZGVfcmVnLmNydGNfcmVnW2hlYWRdLkNSVENbCisJCQkJCQkJTlZfQ0lPX0NSRV9MQ0RfX0lOREVYXTsKKwl1aW50MzJfdCBkYWNjbGtfb2ZmID0gTlZfUFJBTURBQ19EQUNDTEsgKworCQkJCQludjA0X2RhY19vdXRwdXRfb2Zmc2V0KGVuY29kZXIpOworCXVpbnQzMl90IGRhY2NsazsKKworCWhlbHBlci0+ZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09GRik7CisKKwludjA0X2RmcF9kaXNhYmxlKGRldiwgaGVhZCk7CisKKwkvKiBVbmJpbmQgYW55IEZQIGVuY29kZXJzIGZyb20gdGhpcyBoZWFkIGlmIHdlIG5lZWQgdGhlIEZQCisJICogc3R1ZmYgZW5hYmxlZC4gKi8KKwlpZiAodHZfbm9ybS0+a2luZCA9PSBDVFZfRU5DX01PREUpIHsKKwkJc3RydWN0IGRybV9lbmNvZGVyICplbmM7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShlbmMsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgeworCQkJc3RydWN0IGRjYl9lbnRyeSAqZGNiID0gbm91dmVhdV9lbmNvZGVyKGVuYyktPmRjYjsKKworCQkJaWYgKChkY2ItPnR5cGUgPT0gT1VUUFVUX1RNRFMgfHwKKwkJCSAgICAgZGNiLT50eXBlID09IE9VVFBVVF9MVkRTKSAmJgorCQkJICAgICAhZW5jLT5jcnRjICYmCisJCQkgICAgIG52MDRfZGZwX2dldF9ib3VuZF9oZWFkKGRldiwgZGNiKSA9PSBoZWFkKSB7CisJCQkJbnYwNF9kZnBfYmluZF9oZWFkKGRldiwgZGNiLCBoZWFkIF4gMSwKKwkJCQkJCWRldl9wcml2LT5WQklPUy5mcC5kdWFsX2xpbmspOworCQkJfQorCQl9CisKKwl9CisKKwkvKiBTb21lIE5WNHggaGF2ZSB1bmtub3duIHZhbHVlcyAoMHgzZiwgMHg1MCwgMHg1NCwgMHg2YiwgMHg3OSwgMHg3ZikKKwkgKiBhdCBMQ0RfX0lOREVYIHdoaWNoIHdlIGRvbid0IGFsdGVyCisJICovCisJaWYgKCEoKmNyX2xjZCAmIDB4NDQpKSB7CisJCWlmICh0dl9ub3JtLT5raW5kID09IENUVl9FTkNfTU9ERSkKKwkJCSpjcl9sY2QgPSAweDEgfCAoaGVhZCA/IDB4MCA6IDB4OCk7CisJCWVsc2UKKwkJCSpjcl9sY2QgPSAwOworCX0KKworCS8qIFNldCB0aGUgREFDQ0xLIHJlZ2lzdGVyICovCisJZGFjY2xrID0gKE5WUmVhZFJBTURBQyhkZXYsIDAsIGRhY2Nsa19vZmYpICYgfjB4MzApIHwgMHgxOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNDApCisJCWRhY2NsayB8PSAweDFhIDw8IDE2OworCisJaWYgKHR2X25vcm0tPmtpbmQgPT0gQ1RWX0VOQ19NT0RFKSB7CisJCWRhY2NsayB8PSAgMHgyMDsKKworCQlpZiAoaGVhZCkKKwkJCWRhY2NsayB8PSAweDEwMDsKKwkJZWxzZQorCQkJZGFjY2xrICY9IH4weDEwMDsKKworCX0gZWxzZSB7CisJCWRhY2NsayB8PSAweDEwOworCisJfQorCisJTlZXcml0ZVJBTURBQyhkZXYsIDAsIGRhY2Nsa19vZmYsIGRhY2Nsayk7Cit9CisKK3N0YXRpYyB2b2lkIG52MTdfdHZfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZHJtX21vZGUsCisJCQkgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaGVhZCA9IG5vdXZlYXVfY3J0YyhlbmNvZGVyLT5jcnRjKS0+aW5kZXg7CisJc3RydWN0IG52MDRfY3J0Y19yZWcgKnJlZ3MgPSAmZGV2X3ByaXYtPm1vZGVfcmVnLmNydGNfcmVnW2hlYWRdOworCXN0cnVjdCBudjE3X3R2X3N0YXRlICp0dl9yZWdzID0gJnRvX3R2X2VuYyhlbmNvZGVyKS0+c3RhdGU7CisJc3RydWN0IG52MTdfdHZfbm9ybV9wYXJhbXMgKnR2X25vcm0gPSBnZXRfdHZfbm9ybShlbmNvZGVyKTsKKwlpbnQgaTsKKworCXJlZ3MtPkNSVENbTlZfQ0lPX0NSRV81M10gPSAweDQwOyAvKiBGUF9IVElNSU5HICovCisJcmVncy0+Q1JUQ1tOVl9DSU9fQ1JFXzU0XSA9IDA7IC8qIEZQX1ZUSU1JTkcgKi8KKwlyZWdzLT5yYW1kYWNfNjMwID0gMHgyOyAvKiB0dXJuIG9mZiBncmVlbiBtb2RlICh0diB0ZXN0IHBhdHRlcm4/KSAqLworCXJlZ3MtPnR2X3NldHVwID0gMTsKKwlyZWdzLT5yYW1kYWNfOGMwID0gMHgwOworCisJaWYgKHR2X25vcm0tPmtpbmQgPT0gVFZfRU5DX01PREUpIHsKKwkJdHZfcmVncy0+cHR2XzIwMCA9IDB4MTMxMTExMDA7CisJCWlmIChoZWFkKQorCQkJdHZfcmVncy0+cHR2XzIwMCB8PSAweDEwOworCisJCXR2X3JlZ3MtPnB0dl8yMGMgPSAweDgwODAxMDsKKwkJdHZfcmVncy0+cHR2XzMwNCA9IDB4MmQwMDAwMDsKKwkJdHZfcmVncy0+cHR2XzYwMCA9IDB4MDsKKwkJdHZfcmVncy0+cHR2XzYwYyA9IDB4MDsKKwkJdHZfcmVncy0+cHR2XzYxMCA9IDB4MWUwMDAwMDsKKworCQlpZiAodHZfbm9ybS0+dHZfZW5jX21vZGUudmRpc3BsYXkgPT0gNTc2KSB7CisJCQl0dl9yZWdzLT5wdHZfNTA4ID0gMHgxMjAwMDAwOworCQkJdHZfcmVncy0+cHR2XzYxNCA9IDB4MzM7CisKKwkJfSBlbHNlIGlmICh0dl9ub3JtLT50dl9lbmNfbW9kZS52ZGlzcGxheSA9PSA0ODApIHsKKwkJCXR2X3JlZ3MtPnB0dl81MDggPSAweGYwMDAwMDsKKwkJCXR2X3JlZ3MtPnB0dl82MTQgPSAweDEzOworCQl9CisKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfMzApIHsKKwkJCXR2X3JlZ3MtPnB0dl81MDAgPSAweGU4ZTA7CisJCQl0dl9yZWdzLT5wdHZfNTA0ID0gMHgxNzEwOworCQkJdHZfcmVncy0+cHR2XzYwNCA9IDB4MDsKKwkJCXR2X3JlZ3MtPnB0dl82MDggPSAweDA7CisJCX0gZWxzZSB7CisJCQlpZiAodHZfbm9ybS0+dHZfZW5jX21vZGUudmRpc3BsYXkgPT0gNTc2KSB7CisJCQkJdHZfcmVncy0+cHR2XzYwNCA9IDB4MjA7CisJCQkJdHZfcmVncy0+cHR2XzYwOCA9IDB4MTA7CisJCQkJdHZfcmVncy0+cHR2XzUwMCA9IDB4MTk3MTA7CisJCQkJdHZfcmVncy0+cHR2XzUwNCA9IDB4NjhmMDsKKworCQkJfSBlbHNlIGlmICh0dl9ub3JtLT50dl9lbmNfbW9kZS52ZGlzcGxheSA9PSA0ODApIHsKKwkJCQl0dl9yZWdzLT5wdHZfNjA0ID0gMHgxMDsKKwkJCQl0dl9yZWdzLT5wdHZfNjA4ID0gMHgyMDsKKwkJCQl0dl9yZWdzLT5wdHZfNTAwID0gMHg0YjkwOworCQkJCXR2X3JlZ3MtPnB0dl81MDQgPSAweDFiNDgwOworCQkJfQorCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IDB4NDA7IGkrKykKKwkJCXR2X3JlZ3MtPnR2X2VuY1tpXSA9IHR2X25vcm0tPnR2X2VuY19tb2RlLnR2X2VuY1tpXTsKKworCX0gZWxzZSB7CisJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpvdXRwdXRfbW9kZSA9CisJCQkJCQkmdHZfbm9ybS0+Y3R2X2VuY19tb2RlLm1vZGU7CisKKwkJLyogVGhlIHJlZ2lzdGVycyBpbiBQUkFNREFDKzB4YzAwIGNvbnRyb2wgc29tZSB0aW1pbmdzIGFuZCBDU0MKKwkJICogcGFyYW1ldGVycyBmb3IgdGhlIENUViBlbmNvZGVyIChJdCdzIG9ubHkgdXNlZCBmb3IgIkhEIiBUVgorCQkgKiBtb2RlcywgSSBkb24ndCB0aGluayBJIGhhdmUgZW5vdWdoIHdvcmtpbmcgdG8gZ3Vlc3Mgd2hhdAorCQkgKiB0aGV5IGV4YWN0bHkgbWVhbi4uLiksIGl0J3MgcHJvYmFibHkgY29ubmVjdGVkIGF0IHRoZQorCQkgKiBvdXRwdXQgb2YgdGhlIEZQIGVuY29kZXIsIGJ1dCBpdCBhbHNvIG5lZWRzIHRoZSBhbmFsb2cKKwkJICogZW5jb2RlciBpbiBpdHMgT1IgZW5hYmxlZCBhbmQgcm91dGVkIHRvIHRoZSBoZWFkIGl0J3MKKwkJICogdXNpbmcuIEl0J3MgZW5hYmxlZCB3aXRoIHRoZSBEQUNDTEsgcmVnaXN0ZXIsIGJpdHMgWzU6NF0uCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgMzg7IGkrKykKKwkJCXJlZ3MtPmN0dl9yZWdzW2ldID0gdHZfbm9ybS0+Y3R2X2VuY19tb2RlLmN0dl9yZWdzW2ldOworCisJCXJlZ3MtPmZwX2hvcml6X3JlZ3NbRlBfRElTUExBWV9FTkRdID0gb3V0cHV0X21vZGUtPmhkaXNwbGF5IC0gMTsKKwkJcmVncy0+ZnBfaG9yaXpfcmVnc1tGUF9UT1RBTF0gPSBvdXRwdXRfbW9kZS0+aHRvdGFsIC0gMTsKKwkJcmVncy0+ZnBfaG9yaXpfcmVnc1tGUF9TWU5DX1NUQVJUXSA9CisJCQkJCQlvdXRwdXRfbW9kZS0+aHN5bmNfc3RhcnQgLSAxOworCQlyZWdzLT5mcF9ob3Jpel9yZWdzW0ZQX1NZTkNfRU5EXSA9IG91dHB1dF9tb2RlLT5oc3luY19lbmQgLSAxOworCQlyZWdzLT5mcF9ob3Jpel9yZWdzW0ZQX0NSVENdID0gb3V0cHV0X21vZGUtPmhkaXNwbGF5ICsKKwkJCW1heCgob3V0cHV0X21vZGUtPmhkaXNwbGF5LTYwMCkvNDAgLSAxLCAxKTsKKworCQlyZWdzLT5mcF92ZXJ0X3JlZ3NbRlBfRElTUExBWV9FTkRdID0gb3V0cHV0X21vZGUtPnZkaXNwbGF5IC0gMTsKKwkJcmVncy0+ZnBfdmVydF9yZWdzW0ZQX1RPVEFMXSA9IG91dHB1dF9tb2RlLT52dG90YWwgLSAxOworCQlyZWdzLT5mcF92ZXJ0X3JlZ3NbRlBfU1lOQ19TVEFSVF0gPQorCQkJCQkJb3V0cHV0X21vZGUtPnZzeW5jX3N0YXJ0IC0gMTsKKwkJcmVncy0+ZnBfdmVydF9yZWdzW0ZQX1NZTkNfRU5EXSA9IG91dHB1dF9tb2RlLT52c3luY19lbmQgLSAxOworCQlyZWdzLT5mcF92ZXJ0X3JlZ3NbRlBfQ1JUQ10gPSBvdXRwdXRfbW9kZS0+dmRpc3BsYXkgLSAxOworCisJCXJlZ3MtPmZwX2NvbnRyb2wgPSBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfRElTUEVOX1BPUyB8CisJCQlOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfUkVBRF9QUk9HIHwKKwkJCU5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9XSURUSF8xMjsKKworCQlpZiAob3V0cHV0X21vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QVlNZTkMpCisJCQlyZWdzLT5mcF9jb250cm9sIHw9IE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9WU1lOQ19QT1M7CisJCWlmIChvdXRwdXRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX1BIU1lOQykKKwkJCXJlZ3MtPmZwX2NvbnRyb2wgfD0gTlZfUFJBTURBQ19GUF9UR19DT05UUk9MX0hTWU5DX1BPUzsKKworCQlyZWdzLT5mcF9kZWJ1Z18wID0gTlZfUFJBTURBQ19GUF9ERUJVR18wX1lXRUlHSFRfUk9VTkQgfAorCQkJTlZfUFJBTURBQ19GUF9ERUJVR18wX1hXRUlHSFRfUk9VTkQgfAorCQkJTlZfUFJBTURBQ19GUF9ERUJVR18wX1lJTlRFUlBfQklMSU5FQVIgfAorCQkJTlZfUFJBTURBQ19GUF9ERUJVR18wX1hJTlRFUlBfQklMSU5FQVIgfAorCQkJTlZfUkFNREFDX0ZQX0RFQlVHXzBfVE1EU19FTkFCTEVEIHwKKwkJCU5WX1BSQU1EQUNfRlBfREVCVUdfMF9ZU0NBTEVfRU5BQkxFIHwKKwkJCU5WX1BSQU1EQUNfRlBfREVCVUdfMF9YU0NBTEVfRU5BQkxFOworCisJCXJlZ3MtPmZwX2RlYnVnXzIgPSAwOworCisJCXJlZ3MtPmZwX21hcmdpbl9jb2xvciA9IDB4ODAxMDgwOworCisJfQorfQorCitzdGF0aWMgdm9pZCBudjE3X3R2X2NvbW1pdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoZW5jb2Rlci0+Y3J0Yyk7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICpoZWxwZXIgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKworCWlmIChnZXRfdHZfbm9ybShlbmNvZGVyKS0+a2luZCA9PSBUVl9FTkNfTU9ERSkgeworCQludjE3X3R2X3VwZGF0ZV9yZXNjYWxlcihlbmNvZGVyKTsKKwkJbnYxN190dl91cGRhdGVfcHJvcGVydGllcyhlbmNvZGVyKTsKKwl9IGVsc2UgeworCQludjE3X2N0dl91cGRhdGVfcmVzY2FsZXIoZW5jb2Rlcik7CisJfQorCisJbnYxN190dl9zdGF0ZV9sb2FkKGRldiwgJnRvX3R2X2VuYyhlbmNvZGVyKS0+c3RhdGUpOworCisJLyogVGhpcyBjb3VsZCB1c2UgcmVmaW5lbWVudCBmb3IgZmxhdHBhbmVscywgYnV0IGl0IHNob3VsZCB3b3JrICovCisJaWYgKGRldl9wcml2LT5jaGlwc2V0IDwgMHg0NCkKKwkJTlZXcml0ZVJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfVEVTVF9DT05UUk9MICsKKwkJCQkJbnYwNF9kYWNfb3V0cHV0X29mZnNldChlbmNvZGVyKSwKKwkJCQkJMHhmMDAwMDAwMCk7CisJZWxzZQorCQlOVldyaXRlUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19URVNUX0NPTlRST0wgKworCQkJCQludjA0X2RhY19vdXRwdXRfb2Zmc2V0KGVuY29kZXIpLAorCQkJCQkweDAwMTAwMDAwKTsKKworCWhlbHBlci0+ZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKKworCU5WX0lORk8oZGV2LCAiT3V0cHV0ICVzIGlzIHJ1bm5pbmcgb24gQ1JUQyAlZCB1c2luZyBvdXRwdXQgJWNcbiIsCisJCWRybV9nZXRfY29ubmVjdG9yX25hbWUoCisJCQkmbm91dmVhdV9lbmNvZGVyX2Nvbm5lY3Rvcl9nZXQobnZfZW5jb2RlciktPmJhc2UpLAorCQludl9jcnRjLT5pbmRleCwgJ0AnICsgZmZzKG52X2VuY29kZXItPmRjYi0+b3IpKTsKK30KKworc3RhdGljIHZvaWQgbnYxN190dl9zYXZlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBudjE3X3R2X2VuY29kZXIgKnR2X2VuYyA9IHRvX3R2X2VuYyhlbmNvZGVyKTsKKworCW5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKS0+cmVzdG9yZS5vdXRwdXQgPQorCQkJCQlOVlJlYWRSQU1EQUMoZGV2LCAwLAorCQkJCQlOVl9QUkFNREFDX0RBQ0NMSyArCisJCQkJCW52MDRfZGFjX291dHB1dF9vZmZzZXQoZW5jb2RlcikpOworCisJbnYxN190dl9zdGF0ZV9zYXZlKGRldiwgJnR2X2VuYy0+c2F2ZWRfc3RhdGUpOworCisJdHZfZW5jLT5zdGF0ZS5wdHZfMjAwID0gdHZfZW5jLT5zYXZlZF9zdGF0ZS5wdHZfMjAwOworfQorCitzdGF0aWMgdm9pZCBudjE3X3R2X3Jlc3RvcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisKKwlOVldyaXRlUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19EQUNDTEsgKworCQkJCW52MDRfZGFjX291dHB1dF9vZmZzZXQoZW5jb2RlciksCisJCQkJbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpLT5yZXN0b3JlLm91dHB1dCk7CisKKwludjE3X3R2X3N0YXRlX2xvYWQoZGV2LCAmdG9fdHZfZW5jKGVuY29kZXIpLT5zYXZlZF9zdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgbnYxN190dl9jcmVhdGVfcmVzb3VyY2VzKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkgICAgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1fbW9kZV9jb25maWcgKmNvbmYgPSAmZGV2LT5tb2RlX2NvbmZpZzsKKwlzdHJ1Y3QgbnYxN190dl9lbmNvZGVyICp0dl9lbmMgPSB0b190dl9lbmMoZW5jb2Rlcik7CisJc3RydWN0IGRjYl9lbnRyeSAqZGNiID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpLT5kY2I7CisJaW50IG51bV90dl9ub3JtcyA9IGRjYi0+dHZjb25mLmhhc19jb21wb25lbnRfb3V0cHV0ID8gTlVNX1RWX05PUk1TIDoKKwkJCQkJCQlOVU1fTERfVFZfTk9STVM7CisJaW50IGk7CisKKwlpZiAobm91dmVhdV90dl9ub3JtKSB7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fdHZfbm9ybXM7IGkrKykgeworCQkJaWYgKCFzdHJjbXAobnYxN190dl9ub3JtX25hbWVzW2ldLCBub3V2ZWF1X3R2X25vcm0pKSB7CisJCQkJdHZfZW5jLT50dl9ub3JtID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChpID09IG51bV90dl9ub3JtcykKKwkJCU5WX1dBUk4oZGV2LCAiSW52YWxpZCBUViBub3JtIHNldHRpbmcgXCIlc1wiXG4iLAorCQkJCW5vdXZlYXVfdHZfbm9ybSk7CisJfQorCisJZHJtX21vZGVfY3JlYXRlX3R2X3Byb3BlcnRpZXMoZGV2LCBudW1fdHZfbm9ybXMsIG52MTdfdHZfbm9ybV9uYW1lcyk7CisKKwlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsCisJCQkJCWNvbmYtPnR2X3NlbGVjdF9zdWJjb25uZWN0b3JfcHJvcGVydHksCisJCQkJCXR2X2VuYy0+c2VsZWN0X3N1YmNvbm5lY3Rvcik7CisJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLAorCQkJCQljb25mLT50dl9zdWJjb25uZWN0b3JfcHJvcGVydHksCisJCQkJCXR2X2VuYy0+c3ViY29ubmVjdG9yKTsKKwlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsCisJCQkJCWNvbmYtPnR2X21vZGVfcHJvcGVydHksCisJCQkJCXR2X2VuYy0+dHZfbm9ybSk7CisJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLAorCQkJCQljb25mLT50dl9mbGlja2VyX3JlZHVjdGlvbl9wcm9wZXJ0eSwKKwkJCQkJdHZfZW5jLT5mbGlja2VyKTsKKwlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsCisJCQkJCWNvbmYtPnR2X3NhdHVyYXRpb25fcHJvcGVydHksCisJCQkJCXR2X2VuYy0+c2F0dXJhdGlvbik7CisJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLAorCQkJCQljb25mLT50dl9odWVfcHJvcGVydHksCisJCQkJCXR2X2VuYy0+aHVlKTsKKwlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsCisJCQkJCWNvbmYtPnR2X292ZXJzY2FuX3Byb3BlcnR5LAorCQkJCQl0dl9lbmMtPm92ZXJzY2FuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG52MTdfdHZfc2V0X3Byb3BlcnR5KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJCXN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LAorCQkJCXVpbnQ2NF90IHZhbCkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfY29uZmlnICpjb25mID0gJmVuY29kZXItPmRldi0+bW9kZV9jb25maWc7CisJc3RydWN0IGRybV9jcnRjICpjcnRjID0gZW5jb2Rlci0+Y3J0YzsKKwlzdHJ1Y3QgbnYxN190dl9lbmNvZGVyICp0dl9lbmMgPSB0b190dl9lbmMoZW5jb2Rlcik7CisJc3RydWN0IG52MTdfdHZfbm9ybV9wYXJhbXMgKnR2X25vcm0gPSBnZXRfdHZfbm9ybShlbmNvZGVyKTsKKwlib29sIG1vZGVzX2NoYW5nZWQgPSBmYWxzZTsKKworCWlmIChwcm9wZXJ0eSA9PSBjb25mLT50dl9vdmVyc2Nhbl9wcm9wZXJ0eSkgeworCQl0dl9lbmMtPm92ZXJzY2FuID0gdmFsOworCQlpZiAoZW5jb2Rlci0+Y3J0YykgeworCQkJaWYgKHR2X25vcm0tPmtpbmQgPT0gQ1RWX0VOQ19NT0RFKQorCQkJCW52MTdfY3R2X3VwZGF0ZV9yZXNjYWxlcihlbmNvZGVyKTsKKwkJCWVsc2UKKwkJCQludjE3X3R2X3VwZGF0ZV9yZXNjYWxlcihlbmNvZGVyKTsKKwkJfQorCisJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBjb25mLT50dl9zYXR1cmF0aW9uX3Byb3BlcnR5KSB7CisJCWlmICh0dl9ub3JtLT5raW5kICE9IFRWX0VOQ19NT0RFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJdHZfZW5jLT5zYXR1cmF0aW9uID0gdmFsOworCQludjE3X3R2X3VwZGF0ZV9wcm9wZXJ0aWVzKGVuY29kZXIpOworCisJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBjb25mLT50dl9odWVfcHJvcGVydHkpIHsKKwkJaWYgKHR2X25vcm0tPmtpbmQgIT0gVFZfRU5DX01PREUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl0dl9lbmMtPmh1ZSA9IHZhbDsKKwkJbnYxN190dl91cGRhdGVfcHJvcGVydGllcyhlbmNvZGVyKTsKKworCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gY29uZi0+dHZfZmxpY2tlcl9yZWR1Y3Rpb25fcHJvcGVydHkpIHsKKwkJaWYgKHR2X25vcm0tPmtpbmQgIT0gVFZfRU5DX01PREUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl0dl9lbmMtPmZsaWNrZXIgPSB2YWw7CisJCWlmIChlbmNvZGVyLT5jcnRjKQorCQkJbnYxN190dl91cGRhdGVfcmVzY2FsZXIoZW5jb2Rlcik7CisKKwl9IGVsc2UgaWYgKHByb3BlcnR5ID09IGNvbmYtPnR2X21vZGVfcHJvcGVydHkpIHsKKwkJaWYgKGNvbm5lY3Rvci0+ZHBtcyAhPSBEUk1fTU9ERV9EUE1TX09GRikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXR2X2VuYy0+dHZfbm9ybSA9IHZhbDsKKworCQltb2Rlc19jaGFuZ2VkID0gdHJ1ZTsKKworCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gY29uZi0+dHZfc2VsZWN0X3N1YmNvbm5lY3Rvcl9wcm9wZXJ0eSkgeworCQlpZiAodHZfbm9ybS0+a2luZCAhPSBUVl9FTkNfTU9ERSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXR2X2VuYy0+c2VsZWN0X3N1YmNvbm5lY3RvciA9IHZhbDsKKwkJbnYxN190dl91cGRhdGVfcHJvcGVydGllcyhlbmNvZGVyKTsKKworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChtb2Rlc19jaGFuZ2VkKSB7CisJCWRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2Rlcyhjb25uZWN0b3IsIDAsIDApOworCisJCS8qIERpc2FibGUgdGhlIGNydGMgdG8gZW5zdXJlIGEgZnVsbCBtb2Rlc2V0IGlzCisJCSAqIHBlcmZvcm1lZCB3aGVuZXZlciBpdCdzIHR1cm5lZCBvbiBhZ2Fpbi4gKi8KKwkJaWYgKGNydGMpIHsKKwkJCXN0cnVjdCBkcm1fbW9kZV9zZXQgbW9kZXNldCA9IHsKKwkJCQkuY3J0YyA9IGNydGMsCisJCQl9OworCisJCQljcnRjLT5mdW5jcy0+c2V0X2NvbmZpZygmbW9kZXNldCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbnYxN190dl9kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgbnYxN190dl9lbmNvZGVyICp0dl9lbmMgPSB0b190dl9lbmMoZW5jb2Rlcik7CisKKwlOVl9ERUJVRyhlbmNvZGVyLT5kZXYsICJcbiIpOworCisJZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKKwlrZnJlZSh0dl9lbmMpOworfQorCitzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyBudjE3X3R2X2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcyA9IG52MTdfdHZfZHBtcywKKwkuc2F2ZSA9IG52MTdfdHZfc2F2ZSwKKwkucmVzdG9yZSA9IG52MTdfdHZfcmVzdG9yZSwKKwkubW9kZV9maXh1cCA9IG52MTdfdHZfbW9kZV9maXh1cCwKKwkucHJlcGFyZSA9IG52MTdfdHZfcHJlcGFyZSwKKwkuY29tbWl0ID0gbnYxN190dl9jb21taXQsCisJLm1vZGVfc2V0ID0gbnYxN190dl9tb2RlX3NldCwKKwkuZGV0ZWN0ID0gbnYxN19kYWNfZGV0ZWN0LAorfTsKKworc3RhdGljIHN0cnVjdCBkcm1fZW5jb2Rlcl9zbGF2ZV9mdW5jcyBudjE3X3R2X3NsYXZlX2Z1bmNzID0geworCS5nZXRfbW9kZXMgPSBudjE3X3R2X2dldF9tb2RlcywKKwkubW9kZV92YWxpZCA9IG52MTdfdHZfbW9kZV92YWxpZCwKKwkuY3JlYXRlX3Jlc291cmNlcyA9IG52MTdfdHZfY3JlYXRlX3Jlc291cmNlcywKKwkuc2V0X3Byb3BlcnR5ID0gbnYxN190dl9zZXRfcHJvcGVydHksCit9OworCitzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIG52MTdfdHZfZnVuY3MgPSB7CisJLmRlc3Ryb3kgPSBudjE3X3R2X2Rlc3Ryb3ksCit9OworCitpbnQgbnYxN190dl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZW50cnkpCit7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCXN0cnVjdCBudjE3X3R2X2VuY29kZXIgKnR2X2VuYyA9IE5VTEw7CisKKwl0dl9lbmMgPSBremFsbG9jKHNpemVvZigqdHZfZW5jKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0dl9lbmMpCisJCXJldHVybiAtRU5PTUVNOworCisJdHZfZW5jLT5vdmVyc2NhbiA9IDUwOworCXR2X2VuYy0+ZmxpY2tlciA9IDUwOworCXR2X2VuYy0+c2F0dXJhdGlvbiA9IDUwOworCXR2X2VuYy0+aHVlID0gMDsKKwl0dl9lbmMtPnR2X25vcm0gPSBUVl9OT1JNX1BBTDsKKwl0dl9lbmMtPnN1YmNvbm5lY3RvciA9IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9Vbmtub3duOworCXR2X2VuYy0+c2VsZWN0X3N1YmNvbm5lY3RvciA9IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9BdXRvbWF0aWM7CisJdHZfZW5jLT5waW5fbWFzayA9IDA7CisKKwllbmNvZGVyID0gdG9fZHJtX2VuY29kZXIoJnR2X2VuYy0+YmFzZSk7CisKKwl0dl9lbmMtPmJhc2UuZGNiID0gZW50cnk7CisJdHZfZW5jLT5iYXNlLm9yID0gZmZzKGVudHJ5LT5vcikgLSAxOworCisJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZudjE3X3R2X2Z1bmNzLCBEUk1fTU9ERV9FTkNPREVSX1RWREFDKTsKKwlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKGVuY29kZXIsICZudjE3X3R2X2hlbHBlcl9mdW5jcyk7CisJdG9fZW5jb2Rlcl9zbGF2ZShlbmNvZGVyKS0+c2xhdmVfZnVuY3MgPSAmbnYxN190dl9zbGF2ZV9mdW5jczsKKworCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gZW50cnktPmhlYWRzOworCWVuY29kZXItPnBvc3NpYmxlX2Nsb25lcyA9IDA7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTdfdHYuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTdfdHYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDA5NzdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxN190di5oCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEZyYW5jaXNjbyBKZXJlei4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX19OVjE3X1RWX0hfXworI2RlZmluZSBfX05WMTdfVFZfSF9fCisKK3N0cnVjdCBudjE3X3R2X3N0YXRlIHsKKwl1aW50OF90IHR2X2VuY1sweDQwXTsKKworCXVpbnQzMl90IGhmaWx0ZXJbNF1bN107CisJdWludDMyX3QgaGZpbHRlcjJbNF1bN107CisJdWludDMyX3QgdmZpbHRlcls0XVs3XTsKKworCXVpbnQzMl90IHB0dl8yMDA7CisJdWludDMyX3QgcHR2XzIwNDsKKwl1aW50MzJfdCBwdHZfMjA4OworCXVpbnQzMl90IHB0dl8yMGM7CisJdWludDMyX3QgcHR2XzMwNDsKKwl1aW50MzJfdCBwdHZfNTAwOworCXVpbnQzMl90IHB0dl81MDQ7CisJdWludDMyX3QgcHR2XzUwODsKKwl1aW50MzJfdCBwdHZfNjAwOworCXVpbnQzMl90IHB0dl82MDQ7CisJdWludDMyX3QgcHR2XzYwODsKKwl1aW50MzJfdCBwdHZfNjBjOworCXVpbnQzMl90IHB0dl82MTA7CisJdWludDMyX3QgcHR2XzYxNDsKK307CisKK2VudW0gbnYxN190dl9ub3JteworCVRWX05PUk1fUEFMLAorCVRWX05PUk1fUEFMX00sCisJVFZfTk9STV9QQUxfTiwKKwlUVl9OT1JNX1BBTF9OQywKKwlUVl9OT1JNX05UU0NfTSwKKwlUVl9OT1JNX05UU0NfSiwKKwlOVU1fTERfVFZfTk9STVMsCisJVFZfTk9STV9IRDQ4MEkgPSBOVU1fTERfVFZfTk9STVMsCisJVFZfTk9STV9IRDQ4MFAsCisJVFZfTk9STV9IRDU3NkksCisJVFZfTk9STV9IRDU3NlAsCisJVFZfTk9STV9IRDcyMFAsCisJVFZfTk9STV9IRDEwODBJLAorCU5VTV9UVl9OT1JNUworfTsKKworc3RydWN0IG52MTdfdHZfZW5jb2RlciB7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciBiYXNlOworCisJc3RydWN0IG52MTdfdHZfc3RhdGUgc3RhdGU7CisJc3RydWN0IG52MTdfdHZfc3RhdGUgc2F2ZWRfc3RhdGU7CisKKwlpbnQgb3ZlcnNjYW47CisJaW50IGZsaWNrZXI7CisJaW50IHNhdHVyYXRpb247CisJaW50IGh1ZTsKKwllbnVtIG52MTdfdHZfbm9ybSB0dl9ub3JtOworCWludCBzdWJjb25uZWN0b3I7CisJaW50IHNlbGVjdF9zdWJjb25uZWN0b3I7CisJdWludDMyX3QgcGluX21hc2s7Cit9OworI2RlZmluZSB0b190dl9lbmMoeCkgY29udGFpbmVyX29mKG5vdXZlYXVfZW5jb2Rlcih4KSwJCVwKKwkJCQkgIHN0cnVjdCBudjE3X3R2X2VuY29kZXIsIGJhc2UpCisKK2V4dGVybiBjaGFyICpudjE3X3R2X25vcm1fbmFtZXNbTlVNX1RWX05PUk1TXTsKKworZXh0ZXJuIHN0cnVjdCBudjE3X3R2X25vcm1fcGFyYW1zIHsKKwllbnVtIHsKKwkJVFZfRU5DX01PREUsCisJCUNUVl9FTkNfTU9ERSwKKwl9IGtpbmQ7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlpbnQgaGRpc3BsYXk7CisJCQlpbnQgdmRpc3BsYXk7CisJCQlpbnQgdnJlZnJlc2g7IC8qIG1IeiAqLworCisJCQl1aW50OF90IHR2X2VuY1sweDQwXTsKKwkJfSB0dl9lbmNfbW9kZTsKKworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgbW9kZTsKKworCQkJdWludDMyX3QgY3R2X3JlZ3NbMzhdOworCQl9IGN0dl9lbmNfbW9kZTsKKwl9OworCit9IG52MTdfdHZfbm9ybXNbTlVNX1RWX05PUk1TXTsKKyNkZWZpbmUgZ2V0X3R2X25vcm0oZW5jKSAoJm52MTdfdHZfbm9ybXNbdG9fdHZfZW5jKGVuYyktPnR2X25vcm1dKQorCitleHRlcm4gc3RydWN0IGRybV9kaXNwbGF5X21vZGUgbnYxN190dl9tb2Rlc1tdOworCitzdGF0aWMgaW5saW5lIGludCBpbnRlcnBvbGF0ZShpbnQgeTAsIGludCB5MSwgaW50IHkyLCBpbnQgeCkKK3sKKwlyZXR1cm4geTEgKyAoeCA8IDUwID8geTEgLSB5MCA6IHkyIC0geTEpICogKHggLSA1MCkgLyA1MDsKK30KKwordm9pZCBudjE3X3R2X3N0YXRlX3NhdmUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG52MTdfdHZfc3RhdGUgKnN0YXRlKTsKK3ZvaWQgbnYxN190dl9zdGF0ZV9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBudjE3X3R2X3N0YXRlICpzdGF0ZSk7Cit2b2lkIG52MTdfdHZfdXBkYXRlX3Byb3BlcnRpZXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKK3ZvaWQgbnYxN190dl91cGRhdGVfcmVzY2FsZXIoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKK3ZvaWQgbnYxN19jdHZfdXBkYXRlX3Jlc2NhbGVyKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CisKKy8qIFRWIGhhcmR3YXJlIGFjY2VzcyBmdW5jdGlvbnMgKi8KKworc3RhdGljIGlubGluZSB2b2lkIG52X3dyaXRlX3B0dihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCByZWcsIHVpbnQzMl90IHZhbCkKK3sKKwludl93cjMyKGRldiwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IG52X3JlYWRfcHR2KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHJlZykKK3sKKwlyZXR1cm4gbnZfcmQzMihkZXYsIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBudl93cml0ZV90dl9lbmMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDhfdCByZWcsIHVpbnQ4X3QgdmFsKQoreworCW52X3dyaXRlX3B0dihkZXYsIE5WX1BUVl9UVl9JTkRFWCwgcmVnKTsKKwludl93cml0ZV9wdHYoZGV2LCBOVl9QVFZfVFZfREFUQSwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90IG52X3JlYWRfdHZfZW5jKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQ4X3QgcmVnKQoreworCW52X3dyaXRlX3B0dihkZXYsIE5WX1BUVl9UVl9JTkRFWCwgcmVnKTsKKwlyZXR1cm4gbnZfcmVhZF9wdHYoZGV2LCBOVl9QVFZfVFZfREFUQSk7Cit9CisKKyNkZWZpbmUgbnZfbG9hZF9wdHYoZGV2LCBzdGF0ZSwgcmVnKSBudl93cml0ZV9wdHYoZGV2LCBOVl9QVFZfT0ZGU0VUICsgMHgjI3JlZywgc3RhdGUtPnB0dl8jI3JlZykKKyNkZWZpbmUgbnZfc2F2ZV9wdHYoZGV2LCBzdGF0ZSwgcmVnKSBzdGF0ZS0+cHR2XyMjcmVnID0gbnZfcmVhZF9wdHYoZGV2LCBOVl9QVFZfT0ZGU0VUICsgMHgjI3JlZykKKyNkZWZpbmUgbnZfbG9hZF90dl9lbmMoZGV2LCBzdGF0ZSwgcmVnKSBudl93cml0ZV90dl9lbmMoZGV2LCAweCMjcmVnLCBzdGF0ZS0+dHZfZW5jWzB4IyNyZWddKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTdfdHZfbW9kZXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTdfdHZfbW9kZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQ2ODNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxN190dl9tb2Rlcy5jCkBAIC0wLDAgKzEsNTgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEZyYW5jaXNjbyBKZXJlei4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2VuY29kZXIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2NydGMuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2h3LmgiCisjaW5jbHVkZSAibnYxN190di5oIgorCitjaGFyICpudjE3X3R2X25vcm1fbmFtZXNbTlVNX1RWX05PUk1TXSA9IHsKKwlbVFZfTk9STV9QQUxdID0gIlBBTCIsCisJW1RWX05PUk1fUEFMX01dID0gIlBBTC1NIiwKKwlbVFZfTk9STV9QQUxfTl0gPSAiUEFMLU4iLAorCVtUVl9OT1JNX1BBTF9OQ10gPSAiUEFMLU5jIiwKKwlbVFZfTk9STV9OVFNDX01dID0gIk5UU0MtTSIsCisJW1RWX05PUk1fTlRTQ19KXSA9ICJOVFNDLUoiLAorCVtUVl9OT1JNX0hENDgwSV0gPSAiaGQ0ODBpIiwKKwlbVFZfTk9STV9IRDQ4MFBdID0gImhkNDgwcCIsCisJW1RWX05PUk1fSEQ1NzZJXSA9ICJoZDU3NmkiLAorCVtUVl9OT1JNX0hENTc2UF0gPSAiaGQ1NzZwIiwKKwlbVFZfTk9STV9IRDcyMFBdID0gImhkNzIwcCIsCisJW1RWX05PUk1fSEQxMDgwSV0gPSAiaGQxMDgwaSIKK307CisKKy8qIFRWIHN0YW5kYXJkIHNwZWNpZmljIHBhcmFtZXRlcnMgKi8KKworc3RydWN0IG52MTdfdHZfbm9ybV9wYXJhbXMgbnYxN190dl9ub3Jtc1tOVU1fVFZfTk9STVNdID0geworCVtUVl9OT1JNX1BBTF0gPSB7IFRWX0VOQ19NT0RFLCB7CisJCQkudHZfZW5jX21vZGUgPSB7IDcyMCwgNTc2LCA1MDAwMCwgeworCQkJCQkweDJhLCAweDksIDB4OGEsIDB4Y2IsIDB4MCwgMHgwLCAweGIsIDB4MTgsCisJCQkJCTB4N2UsIDB4NDAsIDB4OGEsIDB4MzUsIDB4MjcsIDB4MCwgMHgzNCwgMHgzLAorCQkJCQkweDNlLCAweDMsIDB4MTcsIDB4MjEsIDB4MWIsIDB4MWIsIDB4MjQsIDB4OWMsCisJCQkJCTB4MSwgMHgwLCAweGYsIDB4ZiwgMHg2MCwgMHg1LCAweGQzLCAweDMsCisJCQkJCTB4ZDMsIDB4NCwgMHhkNCwgMHgxLCAweDIsIDB4MCwgMHhhLCAweDUsCisJCQkJCTB4MCwgMHgxYSwgMHhmZiwgMHgzLCAweDE4LCAweGYsIDB4NzgsIDB4MCwKKwkJCQkJMHgwLCAweGI0LCAweDAsIDB4MTUsIDB4NDksIDB4MTAsIDB4MCwgMHg5YiwKKwkJCQkJMHhiZCwgMHgxNSwgMHg1LCAweDE1LCAweDNlLCAweDMsIDB4MCwgMHgwCisJCQkJfSB9IH0gfSwKKworCVtUVl9OT1JNX1BBTF9NXSA9IHsgVFZfRU5DX01PREUsIHsKKwkJCS50dl9lbmNfbW9kZSA9IHsgNzIwLCA0ODAsIDU5OTQwLCB7CisJCQkJCTB4MjEsIDB4ZTYsIDB4ZWYsIDB4ZTMsIDB4MCwgMHgwLCAweGIsIDB4MTgsCisJCQkJCTB4N2UsIDB4NDQsIDB4NzYsIDB4MzIsIDB4MjUsIDB4MCwgMHgzYywgMHgwLAorCQkJCQkweDNjLCAweDAsIDB4MTcsIDB4MjEsIDB4MWIsIDB4MWIsIDB4MjQsIDB4ODMsCisJCQkJCTB4MSwgMHgwLCAweGYsIDB4ZiwgMHg2MCwgMHg1LCAweGQzLCAweDEsCisJCQkJCTB4YzUsIDB4NCwgMHhjNSwgMHgxLCAweDIsIDB4MCwgMHhhLCAweDUsCisJCQkJCTB4MCwgMHgxOCwgMHhmZiwgMHgzLCAweDIwLCAweGYsIDB4NzgsIDB4MCwKKwkJCQkJMHgwLCAweGI0LCAweDAsIDB4MTUsIDB4NDAsIDB4MTAsIDB4MCwgMHg5YywKKwkJCQkJMHhjOCwgMHgxNSwgMHg1LCAweDE1LCAweDNjLCAweDAsIDB4MCwgMHgwCisJCQkJfSB9IH0gfSwKKworCVtUVl9OT1JNX1BBTF9OXSA9IHsgVFZfRU5DX01PREUsIHsKKwkJCS50dl9lbmNfbW9kZSA9IHsgNzIwLCA1NzYsIDUwMDAwLCB7CisJCQkJCTB4MmEsIDB4OSwgMHg4YSwgMHhjYiwgMHgwLCAweDAsIDB4YiwgMHgxOCwKKwkJCQkJMHg3ZSwgMHg0MCwgMHg4YSwgMHgzMiwgMHgyNSwgMHgwLCAweDNjLCAweDAsCisJCQkJCTB4M2MsIDB4MCwgMHgxNywgMHgyMSwgMHgxYiwgMHgxYiwgMHgyNCwgMHg5YywKKwkJCQkJMHgxLCAweDAsIDB4ZiwgMHhmLCAweDYwLCAweDUsIDB4ZDMsIDB4MSwKKwkJCQkJMHhjNSwgMHg0LCAweGM1LCAweDEsIDB4MiwgMHgwLCAweGEsIDB4NSwKKwkJCQkJMHgwLCAweDFhLCAweGZmLCAweDMsIDB4MTgsIDB4ZiwgMHg3OCwgMHgwLAorCQkJCQkweDAsIDB4YjQsIDB4MCwgMHgxNSwgMHg0OSwgMHgxMCwgMHgwLCAweDliLAorCQkJCQkweGJkLCAweDE1LCAweDUsIDB4MTUsIDB4M2MsIDB4MCwgMHgwLCAweDAKKwkJCQl9IH0gfSB9LAorCisJW1RWX05PUk1fUEFMX05DXSA9IHsgVFZfRU5DX01PREUsIHsKKwkJCS50dl9lbmNfbW9kZSA9IHsgNzIwLCA1NzYsIDUwMDAwLCB7CisJCQkJCTB4MjEsIDB4ZjYsIDB4OTQsIDB4NDYsIDB4MCwgMHgwLCAweGIsIDB4MTgsCisJCQkJCTB4N2UsIDB4NDQsIDB4OGEsIDB4MzUsIDB4MjcsIDB4MCwgMHgzNCwgMHgzLAorCQkJCQkweDNlLCAweDMsIDB4MTcsIDB4MjEsIDB4MWIsIDB4MWIsIDB4MjQsIDB4OWMsCisJCQkJCTB4MSwgMHgwLCAweGYsIDB4ZiwgMHg2MCwgMHg1LCAweGQzLCAweDMsCisJCQkJCTB4ZDMsIDB4NCwgMHhkNCwgMHgxLCAweDIsIDB4MCwgMHhhLCAweDUsCisJCQkJCTB4MCwgMHgxYSwgMHhmZiwgMHgzLCAweDE4LCAweGYsIDB4NzgsIDB4MCwKKwkJCQkJMHgwLCAweGI0LCAweDAsIDB4MTUsIDB4NDksIDB4MTAsIDB4MCwgMHg5YiwKKwkJCQkJMHhiZCwgMHgxNSwgMHg1LCAweDE1LCAweDNlLCAweDMsIDB4MCwgMHgwCisJCQkJfSB9IH0gfSwKKworCVtUVl9OT1JNX05UU0NfTV0gPSB7IFRWX0VOQ19NT0RFLCB7CisJCQkudHZfZW5jX21vZGUgPSB7IDcyMCwgNDgwLCA1OTk0MCwgeworCQkJCQkweDIxLCAweGYwLCAweDdjLCAweDFmLCAweDAsIDB4MCwgMHhiLCAweDE4LAorCQkJCQkweDdlLCAweDQ0LCAweDc2LCAweDQ4LCAweDAsIDB4MCwgMHgzYywgMHgwLAorCQkJCQkweDNjLCAweDAsIDB4MTcsIDB4MjEsIDB4MWIsIDB4MWIsIDB4MjQsIDB4ODMsCisJCQkJCTB4MSwgMHgwLCAweGYsIDB4ZiwgMHg2MCwgMHg1LCAweGQzLCAweDEsCisJCQkJCTB4YzUsIDB4NCwgMHhjNSwgMHgxLCAweDIsIDB4MCwgMHhhLCAweDUsCisJCQkJCTB4MCwgMHgxNiwgMHhmZiwgMHgzLCAweDIwLCAweGYsIDB4NzgsIDB4MCwKKwkJCQkJMHgwLCAweGI0LCAweDAsIDB4MTUsIDB4NCwgMHgxMCwgMHgwLCAweDljLAorCQkJCQkweGM4LCAweDE1LCAweDUsIDB4MTUsIDB4M2MsIDB4MCwgMHgwLCAweDAKKwkJCQl9IH0gfSB9LAorCisJW1RWX05PUk1fTlRTQ19KXSA9IHsgVFZfRU5DX01PREUsIHsKKwkJCS50dl9lbmNfbW9kZSA9IHsgNzIwLCA0ODAsIDU5OTQwLCB7CisJCQkJCTB4MjEsIDB4ZjAsIDB4N2MsIDB4MWYsIDB4MCwgMHgwLCAweGIsIDB4MTgsCisJCQkJCTB4N2UsIDB4NDQsIDB4NzYsIDB4NDgsIDB4MCwgMHgwLCAweDMyLCAweDAsCisJCQkJCTB4M2MsIDB4MCwgMHgxNywgMHgyMSwgMHgxYiwgMHgxYiwgMHgyNCwgMHg4MywKKwkJCQkJMHgxLCAweDAsIDB4ZiwgMHhmLCAweDYwLCAweDUsIDB4ZDMsIDB4MSwKKwkJCQkJMHhjZiwgMHg0LCAweGNmLCAweDEsIDB4MiwgMHgwLCAweGEsIDB4NSwKKwkJCQkJMHgwLCAweDE2LCAweGZmLCAweDMsIDB4MjAsIDB4ZiwgMHg3OCwgMHgwLAorCQkJCQkweDAsIDB4YjQsIDB4MCwgMHgxNSwgMHg0LCAweDEwLCAweDAsIDB4YTQsCisJCQkJCTB4YzgsIDB4MTUsIDB4NSwgMHgxNSwgMHgzYywgMHgwLCAweDAsIDB4MAorCQkJCX0gfSB9IH0sCisKKwlbVFZfTk9STV9IRDQ4MEldID0geyBUVl9FTkNfTU9ERSwgeworCQkJLnR2X2VuY19tb2RlID0geyA3MjAsIDQ4MCwgNTk5NDAsIHsKKwkJCQkJMHgyMSwgMHhmMCwgMHg3YywgMHgxZiwgMHgwLCAweDAsIDB4YiwgMHgxOCwKKwkJCQkJMHg3ZSwgMHg0NCwgMHg3NiwgMHg0OCwgMHgwLCAweDAsIDB4MzIsIDB4MCwKKwkJCQkJMHgzYywgMHgwLCAweDE3LCAweDIxLCAweDFiLCAweDFiLCAweDI0LCAweDgzLAorCQkJCQkweDEsIDB4MCwgMHhmLCAweGYsIDB4NjAsIDB4NSwgMHhkMywgMHgxLAorCQkJCQkweGNmLCAweDQsIDB4Y2YsIDB4MSwgMHgyLCAweDAsIDB4YSwgMHg1LAorCQkJCQkweDAsIDB4MTYsIDB4ZmYsIDB4MywgMHgyMCwgMHhmLCAweDc4LCAweDAsCisJCQkJCTB4MCwgMHhiNCwgMHgwLCAweDE1LCAweDQsIDB4MTAsIDB4MCwgMHhhNCwKKwkJCQkJMHhjOCwgMHgxNSwgMHg1LCAweDE1LCAweDNjLCAweDAsIDB4MCwgMHgwCisJCQkJfSB9IH0gfSwKKworCVtUVl9OT1JNX0hENTc2SV0gPSB7IFRWX0VOQ19NT0RFLCB7CisJCQkudHZfZW5jX21vZGUgPSB7IDcyMCwgNTc2LCA1MDAwMCwgeworCQkJCQkweDJhLCAweDksIDB4OGEsIDB4Y2IsIDB4MCwgMHgwLCAweGIsIDB4MTgsCisJCQkJCTB4N2UsIDB4NDAsIDB4OGEsIDB4MzUsIDB4MjcsIDB4MCwgMHgzNCwgMHgzLAorCQkJCQkweDNlLCAweDMsIDB4MTcsIDB4MjEsIDB4MWIsIDB4MWIsIDB4MjQsIDB4OWMsCisJCQkJCTB4MSwgMHgwLCAweGYsIDB4ZiwgMHg2MCwgMHg1LCAweGQzLCAweDMsCisJCQkJCTB4ZDMsIDB4NCwgMHhkNCwgMHgxLCAweDIsIDB4MCwgMHhhLCAweDUsCisJCQkJCTB4MCwgMHgxYSwgMHhmZiwgMHgzLCAweDE4LCAweGYsIDB4NzgsIDB4MCwKKwkJCQkJMHgwLCAweGI0LCAweDAsIDB4MTUsIDB4NDksIDB4MTAsIDB4MCwgMHg5YiwKKwkJCQkJMHhiZCwgMHgxNSwgMHg1LCAweDE1LCAweDNlLCAweDMsIDB4MCwgMHgwCisJCQkJfSB9IH0gfSwKKworCisJW1RWX05PUk1fSEQ0ODBQXSA9IHsgQ1RWX0VOQ19NT0RFLCB7CisJCQkuY3R2X2VuY19tb2RlID0geworCQkJCS5tb2RlID0geyBEUk1fTU9ERSgiNzIweDQ4MCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAyNzAwMCwKKwkJCQkJCSAgIDcyMCwgNzM1LCA3NDMsIDg1OCwgMCwgNDgwLCA0OTAsIDQ5NCwgNTI1LCAwLAorCQkJCQkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKKwkJCQkuY3R2X3JlZ3MgPSB7IDB4MzU0MDAwMCwgMHgwLCAweDAsIDB4MzE0LAorCQkJCQkgICAgICAweDM1NDAwM2EsIDB4NDAwMDAsIDB4NmYwMzQ0LCAweDE4MTAwMDAwLAorCQkJCQkgICAgICAweDEwMTYwMDA0LCAweDEwMDYwMDA1LCAweDEwMDYwMDBjLCAweDEwMDYwMDIwLAorCQkJCQkgICAgICAweDEwMDYwMDIxLCAweDE0MGUwMDIyLCAweDEwMDYwMjAyLCAweDE4MDIwMjBhLAorCQkJCQkgICAgICAweDE4MTAwMjBiLCAweDEwMDAwZmZmLCAweDEwMDAwZmZmLCAweDEwMDAwZmZmLAorCQkJCQkgICAgICAweDEwMDAwZmZmLCAweDEwMDAwZmZmLCAweDEwMDAwZmZmLCAweDcwLAorCQkJCQkgICAgICAweDNmZjAwMDAsIDB4NTcsIDB4MmUwMDFlLCAweDI1ODAxMmMsCisJCQkJCSAgICAgIDB4YTBhYTA0ZWMsIDB4MzAsIDB4ODA5NjAwMTksIDB4MTJjMDMwMCwKKwkJCQkJICAgICAgMHgyMDE5LCAweDYwMCwgMHgzMjA2MDAxOSwgMHgwLCAweDAsIDB4NDAwCisJCQkJfSB9IH0gfSwKKworCVtUVl9OT1JNX0hENTc2UF0gPSB7IENUVl9FTkNfTU9ERSwgeworCQkJLmN0dl9lbmNfbW9kZSA9IHsKKwkJCQkubW9kZSA9IHsgRFJNX01PREUoIjcyMHg1NzYiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMjcwMDAsCisJCQkJCQkgICA3MjAsIDczMCwgNzM4LCA4NjQsIDAsIDU3NiwgNTgxLCA1ODUsIDYyNSwgMCwKKwkJCQkJCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCisJCQkJLmN0dl9yZWdzID0geyAweDM1NDAwMDAsIDB4MCwgMHgwLCAweDMxNCwKKwkJCQkJICAgICAgMHgzNTQwMDNhLCAweDQwMDAwLCAweDZmMDM0NCwgMHgxODEwMDAwMCwKKwkJCQkJICAgICAgMHgxMDA2MDAwMSwgMHgxMDA2MDAwOSwgMHgxMDA2MDAyNiwgMHgxMDA2MDAyNywKKwkJCQkJICAgICAgMHgxNDBlMDAyOCwgMHgxMDA2MDI2OCwgMHgxODEwMDI2ZCwgMHgxMDAwMGZmZiwKKwkJCQkJICAgICAgMHgxMDAwMGZmZiwgMHgxMDAwMGZmZiwgMHgxMDAwMGZmZiwgMHgxMDAwMGZmZiwKKwkJCQkJICAgICAgMHgxMDAwMGZmZiwgMHgxMDAwMGZmZiwgMHgxMDAwMGZmZiwgMHg2OSwKKwkJCQkJICAgICAgMHgzZmYwMDAwLCAweDU3LCAweDJlMDAxZSwgMHgyNTgwMTJjLAorCQkJCQkgICAgICAweGEwYWEwNGVjLCAweDMwLCAweDgwOTYwMDE5LCAweDEyYzAzMDAsCisJCQkJCSAgICAgIDB4MjAxOSwgMHg2MDAsIDB4MzIwNjAwMTksIDB4MCwgMHgwLCAweDQwMAorCQkJCX0gfSB9IH0sCisKKwlbVFZfTk9STV9IRDcyMFBdID0geyBDVFZfRU5DX01PREUsIHsKKwkJCS5jdHZfZW5jX21vZGUgPSB7CisJCQkJLm1vZGUgPSB7IERSTV9NT0RFKCIxMjgweDcyMCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCA3NDI1MCwKKwkJCQkJCSAgIDEyODAsIDEzNDksIDEzNTcsIDE2NTAsIDAsIDcyMCwgNzI1LCA3MzAsIDc1MCwgMCwKKwkJCQkJCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCisJCQkJLmN0dl9yZWdzID0geyAweDEyNjAzOTQsIDB4MCwgMHgwLCAweDYyMiwKKwkJCQkJICAgICAgMHg2NmIwMDIxLCAweDYwMDRhLCAweDEyMTA2MjYsIDB4ODE3MDAwMCwKKwkJCQkJICAgICAgMHg3MDAwNCwgMHg3MDAxNiwgMHg3MDAxNywgMHg0MGYwMDE4LAorCQkJCQkgICAgICAweDcwMmU4LCAweDgxNzAyZWQsIDB4ZmZmLCAweGZmZiwKKwkJCQkJICAgICAgMHhmZmYsIDB4ZmZmLCAweGZmZiwgMHhmZmYsCisJCQkJCSAgICAgIDB4ZmZmLCAweGZmZiwgMHhmZmYsIDB4MCwKKwkJCQkJICAgICAgMHgyZTQwMDAxLCAweDU4LCAweDJlMDAxZSwgMHgyNTgwMTJjLAorCQkJCQkgICAgICAweGEwYWEwNGVjLCAweDMwLCAweDgxMGMwMDM5LCAweDEyYzAzMDAsCisJCQkJCSAgICAgIDB4YzAwMDIwMzksIDB4NjAwLCAweDMyMDYwMDM5LCAweDAsIDB4MCwgMHgwCisJCQkJfSB9IH0gfSwKKworCVtUVl9OT1JNX0hEMTA4MEldID0geyBDVFZfRU5DX01PREUsIHsKKwkJCS5jdHZfZW5jX21vZGUgPSB7CisJCQkJLm1vZGUgPSB7IERSTV9NT0RFKCIxOTIweDEwODAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNzQyNTAsCisJCQkJCQkgICAxOTIwLCAxOTYxLCAyMDQ5LCAyMjAwLCAwLCAxMDgwLCAxMDg0LCAxMDg4LCAxMTI1LCAwLAorCQkJCQkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQworCQkJCQkJICAgfCBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkgfSwKKwkJCQkuY3R2X3JlZ3MgPSB7IDB4YWMwNDIwLCAweDQ0YzA0NzgsIDB4NGE0LCAweDRmYzA4NjgsCisJCQkJCSAgICAgIDB4ODk0MDAyOCwgMHg2MDA1NCwgMHhlODA4NzAsIDB4YmY3MDAwMCwKKwkJCQkJICAgICAgMHhiYzcwMDA0LCAweDcwMDA1LCAweDcwMDEyLCAweDcwMDEzLAorCQkJCQkgICAgICAweDQwZjAwMTQsIDB4NzAyMzAsIDB4YmY3MDIzMiwgMHhiZjcwMjMzLAorCQkJCQkgICAgICAweDFjNzAyMzcsIDB4NzAyMzgsIDB4NzAyNDQsIDB4NzAyNDUsCisJCQkJCSAgICAgIDB4NDBmMDI0NiwgMHg3MDQ2MiwgMHgxZjcwNDY0LCAweDAsCisJCQkJCSAgICAgIDB4MmU0MDAwMSwgMHg1OCwgMHgyZTAwMWUsIDB4MjU4MDEyYywKKwkJCQkJICAgICAgMHhhMGFhMDRlYywgMHgzMCwgMHg4MTVmMDA0YywgMHgxMmMwMzAwLAorCQkJCQkgICAgICAweGMwMDAyMDRjLCAweDYwMCwgMHgzMjA2MDA0YywgMHgwLCAweDAsIDB4MAorCQkJCX0gfSB9IH0KK307CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGlzIHNvbWUgZ3Vlc3N3b3JrIG9uIGhvdyB0aGUgVFYgZW5jb2RlciBmbGlja2VyCisgKiBmaWx0ZXIvcmVzY2FsZXIgd29ya3M6CisgKgorICogSXQgc2VlbXMgdG8gdXNlIHNvbWUgc29ydCBvZiByZXNhbXBsaW5nIGZpbHRlciwgaXQgaXMgY29udHJvbGxlZAorICogdGhyb3VnaCB0aGUgcmVnaXN0ZXJzIGF0IE5WX1BUVl9IRklMVEVSIGFuZCBOVl9QVFZfVkZJTFRFUiwgdGhleQorICogY29udHJvbCB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgc3RhZ2UgcmVzcGVjdGl2ZWx5LCB0aGVyZSBpcworICogYWxzbyBOVl9QVFZfSEZJTFRFUjIgdGhlIGJsb2IgZmlsbHMgaWRlbnRpY2FsbHkgdG8gTlZfUFRWX0hGSUxURVIsCisgKiBidXQgdGhleSBzZWVtIHRvIGRvIG5vdGhpbmcuIEEgcm91Z2ggZ3Vlc3MgbWlnaHQgYmUgdGhhdCB0aGV5IGNvdWxkCisgKiBiZSB1c2VkIHRvIGluZGVwZW5kZW50bHkgY29udHJvbCB0aGUgZmlsdGVyaW5nIG9mIGVhY2ggaW50ZXJsYWNlZAorICogZmllbGQsIGJ1dCBJIGRvbid0IGtub3cgaG93IHRoZXkgYXJlIGVuYWJsZWQuIFRoZSB3aG9sZSBmaWx0ZXJpbmcKKyAqIHByb2Nlc3Mgc2VlbXMgdG8gYmUgZGlzYWJsZWQgd2l0aCBiaXRzIDI2OjI3IG9mIFBUVl8yMDAsIGJ1dCB3ZQorICogYXJlbid0IGRvaW5nIHRoYXQuCisgKgorICogVGhlIGxheW91dCBvZiBib3RoIHJlZ2lzdGVyIHNldHMgaXMgdGhlIHNhbWU6CisgKgorICogQTogW0JBU0UrMHgxOF0uLi5bQkFTRSsweDBdIFtCQVNFKzB4NThdLi5bQkFTRSsweDQwXQorICogQjogW0JBU0UrMHgzNF0uLi5bQkFTRSsweDFjXSBbQkFTRSsweDc0XS4uW0JBU0UrMHg1Y10KKyAqCisgKiBFYWNoIGNvZWZmaWNpZW50IGlzIHN0b3JlZCBpbiBiaXRzIFszMV0sWzE1OjldIGluIHR3bydzIGNvbXBsZW1lbnQKKyAqIGZvcm1hdC4gVGhleSBzZWVtIHRvIGJlIHNvbWUga2luZCBvZiB3ZWlnaHRzIHVzZWQgaW4gYSBsb3ctcGFzcworICogZmlsdGVyLiBCb3RoIEEgYW5kIEIgY29lZmZpY2llbnRzIGFyZSBhcHBsaWVkIHRvIHRoZSAxNCBuZWFyZXN0CisgKiBzYW1wbGVzIG9uIGVhY2ggc2lkZSAoTGlzdGVkIGZyb20gbmVhcmVzdCB0byBmdXJ0aGVybW9zdC4gIFRoZXkKKyAqIHJvdWdobHkgY292ZXIgMiBmcmFtZWJ1ZmZlciBwaXhlbHMgb24gZWFjaCBzaWRlKS4gIFRoZXkgYXJlCisgKiBwcm9iYWJseSBtdWx0aXBsaWVkIHdpdGggc29tZSBtb3JlIGhhcmR3aXJlZCB3ZWlnaHRzIGJlZm9yZSBiZWluZworICogdXNlZDogQi1jb2VmZmljaWVudHMgYXJlIGFwcGxpZWQgdGhlIHNhbWUgb24gYm90aCBzaWRlcywKKyAqIEEtY29lZmZpY2llbnRzIGFyZSBpbnZlcnRlZCBiZWZvcmUgYmVpbmcgYXBwbGllZCB0byB0aGUgb3Bwb3NpdGUKKyAqIHNpZGUuCisgKgorICogQWZ0ZXIgYWxsIHRoZSBoYXNzbGUsIEkgZ290IHRoZSBmb2xsb3dpbmcgZm9ybXVsYSBieSBlbXBpcmljYWwKKyAqIG1lYW5zLi4uCisgKi8KKworI2RlZmluZSBjYWxjX292ZXJzY2FuKG8pIGludGVycG9sYXRlKDB4MTAwLCAweGUxLCAweGMxLCBvKQorCisjZGVmaW5lIGlkMSAoMUxMIDw8IDgpCisjZGVmaW5lIGlkMiAoMUxMIDw8IDE2KQorI2RlZmluZSBpZDMgKDFMTCA8PCAyNCkKKyNkZWZpbmUgaWQ0ICgxTEwgPDwgMzIpCisjZGVmaW5lIGlkNSAoMUxMIDw8IDQ4KQorCitzdGF0aWMgc3RydWN0IGZpbHRlcl9wYXJhbXN7CisJaW50NjRfdCBrMTsKKwlpbnQ2NF90IGtpOworCWludDY0X3Qga2kyOworCWludDY0X3Qga2kzOworCWludDY0X3Qga3I7CisJaW50NjRfdCBraXI7CisJaW50NjRfdCBraTJyOworCWludDY0X3Qga2kzcjsKKwlpbnQ2NF90IGtmOworCWludDY0X3Qga2lmOworCWludDY0X3Qga2kyZjsKKwlpbnQ2NF90IGtpM2Y7CisJaW50NjRfdCBrcmY7CisJaW50NjRfdCBraXJmOworCWludDY0X3Qga2kycmY7CisJaW50NjRfdCBraTNyZjsKK30gZnBhcmFtc1syXVs0XSA9IHsKKwkvKiBIb3Jpem9udGFsIGZpbHRlciBwYXJhbWV0ZXJzICovCisJeworCQl7NjQuMzExNjkwICogaWQ1LCAtMzkuNTE2OTI0ICogaWQ1LCA2LjU4NjE0MyAqIGlkNSwgMC4wMDAwMDIgKiBpZDUsCisJCSAwLjA1MTI4NSAqIGlkNCwgMjYuMTY4NzQ2ICogaWQ0LCAtNC4zNjE0NDkgKiBpZDQsIC0wLjAwMDAwMSAqIGlkNCwKKwkJIDkuMzA4MTY5ICogaWQzLCA3OC4xODA5NjUgKiBpZDMsIC0xMy4wMzAxNTggKiBpZDMsIC0wLjAwMDAwMSAqIGlkMywKKwkJIC04LjgwMTU0MCAqIGlkMSwgLTQ2LjU3Mjg5MCAqIGlkMSwgNy43NjIxNDUgKiBpZDEsIC0wLjAwMDAwMCAqIGlkMX0sCisJCXstNDQuNTY1NTY5ICogaWQ1LCAtNjguMDgxMjQ2ICogaWQ1LCAzOS44MTIwNzQgKiBpZDUsIC00LjAwOTMxNiAqIGlkNSwKKwkJIDI5LjgzMjIwNyAqIGlkNCwgNTAuMDQ3MzIyICogaWQ0LCAtMjUuMzgwMDE3ICogaWQ0LCAyLjU0NjQyMiAqIGlkNCwKKwkJIDEwNC42MDU2MjIgKiBpZDMsIDE0MS45MDg2NDEgKiBpZDMsIC03NC4zMjIzMTkgKiBpZDMsIDcuNDg0MzE2ICogaWQzLAorCQkgLTM3LjA4MTYyMSAqIGlkMSwgLTkwLjM5NzUxMCAqIGlkMSwgNDIuNzg0MjI5ICogaWQxLCAtNC4yODk5NTIgKiBpZDF9LAorCQl7LTU2Ljc5MzI0NCAqIGlkNSwgMzEuMTUzNTg0ICogaWQ1LCAtNS4xOTIyNDcgKiBpZDUsIC0wLjAwMDAwMyAqIGlkNSwKKwkJIDMzLjU0MTEzMSAqIGlkNCwgLTM0LjE0OTMwMiAqIGlkNCwgNS42OTE1MzcgKiBpZDQsIDAuMDAwMDAyICogaWQ0LAorCQkgODcuMTk2NjEwICogaWQzLCAtODguOTk1MTY5ICogaWQzLCAxNC44MzI0NTYgKiBpZDMsIDAuMDAwMDEyICogaWQzLAorCQkgMTcuMjg4MTM4ICogaWQxLCA3MS44NjQ3ODYgKiBpZDEsIC0xMS45Nzc0MDggKiBpZDEsIC0wLjAwMDAwOSAqIGlkMX0sCisJCXs1MS43ODc3OTYgKiBpZDUsIDIxLjIxMTc3MSAqIGlkNSwgLTE4Ljk5MzczMCAqIGlkNSwgMS44NTMzMTAgKiBpZDUsCisJCSAtNDEuNDcwNzI2ICogaWQ0LCAtMTcuNzc1ODIzICogaWQ0LCAxMy4wNTc4MjEgKiBpZDQsIC0xLjE1ODIzICogaWQ0LAorCQkgLTE1NC4yMzU2NzMgKiBpZDMsIC00NC44Nzg2NDEgKiBpZDMsIDQwLjY1NjA3NyAqIGlkMywgLTMuNjk1NTk1ICogaWQzLAorCQkgMTEyLjIwMTA2NSAqIGlkMSwgMzkuOTkyMTU1ICogaWQxLCAtMjUuMTU1NzE0ICogaWQxLCAyLjExMzk4NCAqIGlkMX0sCisJfSwKKworCS8qIFZlcnRpY2FsIGZpbHRlciBwYXJhbWV0ZXJzICovCisJeworCQl7NjcuNjAxOTc5ICogaWQ1LCAwLjQyODMxOSAqIGlkNSwgLTAuMDcxMzE4ICogaWQ1LCAtMC4wMDAwMTIgKiBpZDUsCisJCSAtMy40MDIzMzkgKiBpZDQsIDAuMDAwMjA5ICogaWQ0LCAtMC4wMDAwOTIgKiBpZDQsIDAuMDAwMDEwICogaWQ0LAorCQkgLTkuMTgwOTk2ICogaWQzLCA2LjExMTI3MCAqIGlkMywgLTEuMDI0NDU3ICogaWQzLCAwLjAwMTA0MyAqIGlkMywKKwkJIDYuMDYwMzE1ICogaWQxLCAtMC4wMTc0MjUgKiBpZDEsIDAuMDA3ODMwICogaWQxLCAtMC4wMDA4NjkgKiBpZDF9LAorCQl7Ni43NTU2NDcgKiBpZDUsIDUuODQxMzQ4ICogaWQ1LCAxLjQ2OTczNCAqIGlkNSwgLTAuMTQ5NjU2ICogaWQ1LAorCQkgOC4yOTMxMjAgKiBpZDQsIC0xLjE5Mjg4OCAqIGlkNCwgLTAuOTQ3NjUyICogaWQ0LCAwLjA5NDUwNyAqIGlkNCwKKwkJIDM3LjUyNjY1NSAqIGlkMywgMTAuMjU3ODc1ICogaWQzLCAtMTAuODIzMjc1ICogaWQzLCAxLjA4MTQ5NyAqIGlkMywKKwkJIC0yLjM2MTkyOCAqIGlkMSwgLTIuMDU5NDMyICogaWQxLCAxLjg0MDY3MSAqIGlkMSwgLTAuMTY4MTAwICogaWQxfSwKKwkJey0xNC43ODAzOTEgKiBpZDUsIC0xNi4wNDIxNDggKiBpZDUsIDIuNjczNjkyICogaWQ1LCAtMC4wMDAwMDAgKiBpZDUsCisJCSAzOS41NDE5NzggKiBpZDQsIDUuNjgwMDUzICogaWQ0LCAtMC45NDY2NzYgKiBpZDQsIDAuMDAwMDAwICogaWQ0LAorCQkgMTUyLjk5NDQ4NiAqIGlkMywgMTIuNjI1NDM5ICogaWQzLCAtMi4xMTk1NzkgKiBpZDMsIDAuMDAyNzA4ICogaWQzLAorCQkgLTM4LjEyNTA4OSAqIGlkMSwgLTAuODU1ODgwICogaWQxLCAwLjE1NTM1OSAqIGlkMSwgLTAuMDAyMjQ1ICogaWQxfSwKKwkJey0yNy40NzYxOTMgKiBpZDUsIC0xLjQ1NDk3NiAqIGlkNSwgMS4yODY1NTcgKiBpZDUsIDAuMDI1MzQ2ICogaWQ1LAorCQkgMjAuNjg3MzAwICogaWQ0LCAzLjAxNDAwMyAqIGlkNCwgLTAuNTU3Nzg2ICogaWQ0LCAtMC4wMTMxMSAqIGlkNCwKKwkJIDYwLjAwODczNyAqIGlkMywgLTAuNzM4MjczICogaWQzLCA1LjQwODIxNyAqIGlkMywgLTAuNzk2Nzk4ICogaWQzLAorCQkgLTE3LjI5NjgzNSAqIGlkMSwgNC40Mzg1NzcgKiBpZDEsIC0yLjgwOTQyMCAqIGlkMSwgMC4zODU0OTEgKiBpZDF9LAorCX0KK307CisKK3N0YXRpYyB2b2lkIHR2X3NldHVwX2ZpbHRlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IG52MTdfdHZfZW5jb2RlciAqdHZfZW5jID0gdG9fdHZfZW5jKGVuY29kZXIpOworCXN0cnVjdCBudjE3X3R2X25vcm1fcGFyYW1zICp0dl9ub3JtID0gZ2V0X3R2X25vcm0oZW5jb2Rlcik7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSAmZW5jb2Rlci0+Y3J0Yy0+bW9kZTsKKwl1aW50MzJfdCAoKmZpbHRlcnNbXSlbNF1bN10gPSB7JnR2X2VuYy0+c3RhdGUuaGZpbHRlciwKKwkJCQkgICAgICAgJnR2X2VuYy0+c3RhdGUudmZpbHRlcn07CisJaW50IGksIGosIGs7CisJaW50MzJfdCBvdmVyc2NhbiA9IGNhbGNfb3ZlcnNjYW4odHZfZW5jLT5vdmVyc2Nhbik7CisJaW50NjRfdCBmbGlja2VyID0gKHR2X2VuYy0+ZmxpY2tlciAtIDUwKSAqIChpZDMgLyAxMDApOworCXVpbnQ2NF90IHJzW10gPSB7bW9kZS0+aGRpc3BsYXkgKiBpZDMsCisJCQkgbW9kZS0+dmRpc3BsYXkgKiBpZDN9OworCisJZG9fZGl2KHJzWzBdLCBvdmVyc2NhbiAqIHR2X25vcm0tPnR2X2VuY19tb2RlLmhkaXNwbGF5KTsKKwlkb19kaXYocnNbMV0sIG92ZXJzY2FuICogdHZfbm9ybS0+dHZfZW5jX21vZGUudmRpc3BsYXkpOworCisJZm9yIChrID0gMDsgayA8IDI7IGsrKykgeworCQlyc1trXSA9IG1heCgoaW50NjRfdClyc1trXSwgaWQyKTsKKworCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisJCQlzdHJ1Y3QgZmlsdGVyX3BhcmFtcyAqcCA9ICZmcGFyYW1zW2tdW2pdOworCisJCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCQkJaW50NjRfdCBjID0gKHAtPmsxICsgcC0+a2kqaSArIHAtPmtpMippKmkgKyBwLT5raTMqaSppKmkpCisJCQkJCSsgKHAtPmtyICsgcC0+a2lyKmkgKyBwLT5raTJyKmkqaSArIHAtPmtpM3IqaSppKmkpKnJzW2tdCisJCQkJCSsgKHAtPmtmICsgcC0+a2lmKmkgKyBwLT5raTJmKmkqaSArIHAtPmtpM2YqaSppKmkpKmZsaWNrZXIKKwkJCQkJKyAocC0+a3JmICsgcC0+a2lyZippICsgcC0+a2kycmYqaSppICsgcC0+a2kzcmYqaSppKmkpKmZsaWNrZXIqcnNba107CisKKwkJCQkoKmZpbHRlcnNba10pW2pdW2ldID0gKGMgKyBpZDUvMikgPj4gMzkgJiAoMHgxIDw8IDMxIHwgMHg3ZiA8PCA5KTsKKwkJCX0KKwkJfQorCX0KK30KKworLyogSGFyZHdhcmUgc3RhdGUgc2F2aW5nL3Jlc3RvcmluZyAqLworCitzdGF0aWMgdm9pZCB0dl9zYXZlX2ZpbHRlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBiYXNlLCB1aW50MzJfdCByZWdzWzRdWzddKQoreworCWludCBpLCBqOworCXVpbnQzMl90IG9mZnNldHNbXSA9IHsgYmFzZSwgYmFzZSArIDB4MWMsIGJhc2UgKyAweDQwLCBiYXNlICsgMHg1YyB9OworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgNzsgaisrKQorCQkJcmVnc1tpXVtqXSA9IG52X3JlYWRfcHR2KGRldiwgb2Zmc2V0c1tpXSs0KmopOworCX0KK30KKworc3RhdGljIHZvaWQgdHZfbG9hZF9maWx0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgYmFzZSwgdWludDMyX3QgcmVnc1s0XVs3XSkKK3sKKwlpbnQgaSwgajsKKwl1aW50MzJfdCBvZmZzZXRzW10gPSB7IGJhc2UsIGJhc2UgKyAweDFjLCBiYXNlICsgMHg0MCwgYmFzZSArIDB4NWMgfTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IDc7IGorKykKKwkJCW52X3dyaXRlX3B0dihkZXYsIG9mZnNldHNbaV0rNCpqLCByZWdzW2ldW2pdKTsKKwl9Cit9CisKK3ZvaWQgbnYxN190dl9zdGF0ZV9zYXZlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBudjE3X3R2X3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAweDQwOyBpKyspCisJCXN0YXRlLT50dl9lbmNbaV0gPSBudl9yZWFkX3R2X2VuYyhkZXYsIGkpOworCisJdHZfc2F2ZV9maWx0ZXIoZGV2LCBOVl9QVFZfSEZJTFRFUiwgc3RhdGUtPmhmaWx0ZXIpOworCXR2X3NhdmVfZmlsdGVyKGRldiwgTlZfUFRWX0hGSUxURVIyLCBzdGF0ZS0+aGZpbHRlcjIpOworCXR2X3NhdmVfZmlsdGVyKGRldiwgTlZfUFRWX1ZGSUxURVIsIHN0YXRlLT52ZmlsdGVyKTsKKworCW52X3NhdmVfcHR2KGRldiwgc3RhdGUsIDIwMCk7CisJbnZfc2F2ZV9wdHYoZGV2LCBzdGF0ZSwgMjA0KTsKKwludl9zYXZlX3B0dihkZXYsIHN0YXRlLCAyMDgpOworCW52X3NhdmVfcHR2KGRldiwgc3RhdGUsIDIwYyk7CisJbnZfc2F2ZV9wdHYoZGV2LCBzdGF0ZSwgMzA0KTsKKwludl9zYXZlX3B0dihkZXYsIHN0YXRlLCA1MDApOworCW52X3NhdmVfcHR2KGRldiwgc3RhdGUsIDUwNCk7CisJbnZfc2F2ZV9wdHYoZGV2LCBzdGF0ZSwgNTA4KTsKKwludl9zYXZlX3B0dihkZXYsIHN0YXRlLCA2MDApOworCW52X3NhdmVfcHR2KGRldiwgc3RhdGUsIDYwNCk7CisJbnZfc2F2ZV9wdHYoZGV2LCBzdGF0ZSwgNjA4KTsKKwludl9zYXZlX3B0dihkZXYsIHN0YXRlLCA2MGMpOworCW52X3NhdmVfcHR2KGRldiwgc3RhdGUsIDYxMCk7CisJbnZfc2F2ZV9wdHYoZGV2LCBzdGF0ZSwgNjE0KTsKK30KKwordm9pZCBudjE3X3R2X3N0YXRlX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG52MTdfdHZfc3RhdGUgKnN0YXRlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDB4NDA7IGkrKykKKwkJbnZfd3JpdGVfdHZfZW5jKGRldiwgaSwgc3RhdGUtPnR2X2VuY1tpXSk7CisKKwl0dl9sb2FkX2ZpbHRlcihkZXYsIE5WX1BUVl9IRklMVEVSLCBzdGF0ZS0+aGZpbHRlcik7CisJdHZfbG9hZF9maWx0ZXIoZGV2LCBOVl9QVFZfSEZJTFRFUjIsIHN0YXRlLT5oZmlsdGVyMik7CisJdHZfbG9hZF9maWx0ZXIoZGV2LCBOVl9QVFZfVkZJTFRFUiwgc3RhdGUtPnZmaWx0ZXIpOworCisJbnZfbG9hZF9wdHYoZGV2LCBzdGF0ZSwgMjAwKTsKKwludl9sb2FkX3B0dihkZXYsIHN0YXRlLCAyMDQpOworCW52X2xvYWRfcHR2KGRldiwgc3RhdGUsIDIwOCk7CisJbnZfbG9hZF9wdHYoZGV2LCBzdGF0ZSwgMjBjKTsKKwludl9sb2FkX3B0dihkZXYsIHN0YXRlLCAzMDQpOworCW52X2xvYWRfcHR2KGRldiwgc3RhdGUsIDUwMCk7CisJbnZfbG9hZF9wdHYoZGV2LCBzdGF0ZSwgNTA0KTsKKwludl9sb2FkX3B0dihkZXYsIHN0YXRlLCA1MDgpOworCW52X2xvYWRfcHR2KGRldiwgc3RhdGUsIDYwMCk7CisJbnZfbG9hZF9wdHYoZGV2LCBzdGF0ZSwgNjA0KTsKKwludl9sb2FkX3B0dihkZXYsIHN0YXRlLCA2MDgpOworCW52X2xvYWRfcHR2KGRldiwgc3RhdGUsIDYwYyk7CisJbnZfbG9hZF9wdHYoZGV2LCBzdGF0ZSwgNjEwKTsKKwludl9sb2FkX3B0dihkZXYsIHN0YXRlLCA2MTQpOworCisJLyogVGhpcyBpcyByZXF1aXJlZCBmb3Igc29tZSBzZXR0aW5ncyB0byBraWNrIGluLiAqLworCW52X3dyaXRlX3R2X2VuYyhkZXYsIDB4M2UsIDEpOworCW52X3dyaXRlX3R2X2VuYyhkZXYsIDB4M2UsIDApOworfQorCisvKiBUaW1pbmdzIHNpbWlsYXIgdG8gdGhlIG9uZXMgdGhlIGJsb2Igc2V0cyAqLworCitzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBudjE3X3R2X21vZGVzW10gPSB7CisJeyBEUk1fTU9ERSgiMzIweDIwMCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAwLAorCQkgICAzMjAsIDM0NCwgMzkyLCA1NjAsIDAsIDIwMCwgMjAwLCAyMDIsIDIyMCwgMCwKKwkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQworCQkgICB8IERSTV9NT0RFX0ZMQUdfREJMU0NBTiB8IERSTV9NT0RFX0ZMQUdfQ0xLRElWMikgfSwKKwl7IERSTV9NT0RFKCIzMjB4MjQwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDAsCisJCSAgIDMyMCwgMzQ0LCAzOTIsIDU2MCwgMCwgMjQwLCAyNDAsIDI0NiwgMjYzLCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DCisJCSAgIHwgRFJNX01PREVfRkxBR19EQkxTQ0FOIHwgRFJNX01PREVfRkxBR19DTEtESVYyKSB9LAorCXsgRFJNX01PREUoIjQwMHgzMDAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMCwKKwkJICAgNDAwLCA0MzIsIDQ5NiwgNjQwLCAwLCAzMDAsIDMwMCwgMzAzLCAzMTQsIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMKKwkJICAgfCBEUk1fTU9ERV9GTEFHX0RCTFNDQU4gfCBEUk1fTU9ERV9GTEFHX0NMS0RJVjIpIH0sCisJeyBEUk1fTU9ERSgiNjQweDQ4MCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAwLAorCQkgICA2NDAsIDY3MiwgNzY4LCA4ODAsIDAsIDQ4MCwgNDgwLCA0OTIsIDUyNSwgMCwKKwkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQykgfSwKKwl7IERSTV9NT0RFKCI3MjB4NDgwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDAsCisJCSAgIDcyMCwgNzUyLCA4NzIsIDk2MCwgMCwgNDgwLCA0ODAsIDQ5MywgNTI1LCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSB9LAorCXsgRFJNX01PREUoIjcyMHg1NzYiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMCwKKwkJICAgNzIwLCA3NzYsIDg1NiwgOTYwLCAwLCA1NzYsIDU3NiwgNTg4LCA1OTcsIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMpIH0sCisJeyBEUk1fTU9ERSgiODAweDYwMCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAwLAorCQkgICA4MDAsIDg0MCwgOTIwLCAxMDQwLCAwLCA2MDAsIDYwMCwgNjA0LCA2MTgsIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCisJeyBEUk1fTU9ERSgiMTAyNHg3NjgiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMCwKKwkJICAgMTAyNCwgMTA2NCwgMTIwMCwgMTM0NCwgMCwgNzY4LCA3NjgsIDc3NywgODA2LCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSB9LAorCXt9Cit9OworCit2b2lkIG52MTdfdHZfdXBkYXRlX3Byb3BlcnRpZXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IG52MTdfdHZfZW5jb2RlciAqdHZfZW5jID0gdG9fdHZfZW5jKGVuY29kZXIpOworCXN0cnVjdCBudjE3X3R2X3N0YXRlICpyZWdzID0gJnR2X2VuYy0+c3RhdGU7CisJc3RydWN0IG52MTdfdHZfbm9ybV9wYXJhbXMgKnR2X25vcm0gPSBnZXRfdHZfbm9ybShlbmNvZGVyKTsKKwlpbnQgc3ViY29ubmVjdG9yID0gdHZfZW5jLT5zZWxlY3Rfc3ViY29ubmVjdG9yID8KKwkJCQkJCXR2X2VuYy0+c2VsZWN0X3N1YmNvbm5lY3RvciA6CisJCQkJCQl0dl9lbmMtPnN1YmNvbm5lY3RvcjsKKworCXN3aXRjaCAoc3ViY29ubmVjdG9yKSB7CisJY2FzZSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfQ29tcG9zaXRlOgorCXsKKwkJcmVncy0+cHR2XzIwNCA9IDB4MjsKKworCQkvKiBUaGUgY29tcG9zaXRlIGNvbm5lY3RvciBtYXkgYmUgZm91bmQgb24gZWl0aGVyIHBpbi4gKi8KKwkJaWYgKHR2X2VuYy0+cGluX21hc2sgJiAweDQpCisJCQlyZWdzLT5wdHZfMjA0IHw9IDB4MDEwMDAwOworCQllbHNlIGlmICh0dl9lbmMtPnBpbl9tYXNrICYgMHgyKQorCQkJcmVncy0+cHR2XzIwNCB8PSAweDEwMDAwMDsKKwkJZWxzZQorCQkJcmVncy0+cHR2XzIwNCB8PSAweDExMDAwMDsKKworCQlyZWdzLT50dl9lbmNbMHg3XSA9IDB4MTA7CisJCWJyZWFrOworCX0KKwljYXNlIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9TVklERU86CisJCXJlZ3MtPnB0dl8yMDQgPSAweDExMDEyOworCQlyZWdzLT50dl9lbmNbMHg3XSA9IDB4MTg7CisJCWJyZWFrOworCisJY2FzZSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfQ29tcG9uZW50OgorCQlyZWdzLT5wdHZfMjA0ID0gMHgxMTEzMzM7CisJCXJlZ3MtPnR2X2VuY1sweDddID0gMHgxNDsKKwkJYnJlYWs7CisKKwljYXNlIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9TQ0FSVDoKKwkJcmVncy0+cHR2XzIwNCA9IDB4MTExMDEyOworCQlyZWdzLT50dl9lbmNbMHg3XSA9IDB4MTg7CisJCWJyZWFrOworCX0KKworCXJlZ3MtPnR2X2VuY1sweDIwXSA9IGludGVycG9sYXRlKDAsIHR2X25vcm0tPnR2X2VuY19tb2RlLnR2X2VuY1sweDIwXSwgMjU1LAorCQkJCQkgdHZfZW5jLT5zYXR1cmF0aW9uKTsKKwlyZWdzLT50dl9lbmNbMHgyMl0gPSBpbnRlcnBvbGF0ZSgwLCB0dl9ub3JtLT50dl9lbmNfbW9kZS50dl9lbmNbMHgyMl0sIDI1NSwKKwkJCQkJIHR2X2VuYy0+c2F0dXJhdGlvbik7CisJcmVncy0+dHZfZW5jWzB4MjVdID0gdHZfZW5jLT5odWUgKiAyNTUgLyAxMDA7CisKKwludl9sb2FkX3B0dihkZXYsIHJlZ3MsIDIwNCk7CisJbnZfbG9hZF90dl9lbmMoZGV2LCByZWdzLCA3KTsKKwludl9sb2FkX3R2X2VuYyhkZXYsIHJlZ3MsIDIwKTsKKwludl9sb2FkX3R2X2VuYyhkZXYsIHJlZ3MsIDIyKTsKKwludl9sb2FkX3R2X2VuYyhkZXYsIHJlZ3MsIDI1KTsKK30KKwordm9pZCBudjE3X3R2X3VwZGF0ZV9yZXNjYWxlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgbnYxN190dl9lbmNvZGVyICp0dl9lbmMgPSB0b190dl9lbmMoZW5jb2Rlcik7CisJc3RydWN0IG52MTdfdHZfc3RhdGUgKnJlZ3MgPSAmdHZfZW5jLT5zdGF0ZTsKKworCXJlZ3MtPnB0dl8yMDggPSAweDQwIHwgKGNhbGNfb3ZlcnNjYW4odHZfZW5jLT5vdmVyc2NhbikgPDwgOCk7CisKKwl0dl9zZXR1cF9maWx0ZXIoZW5jb2Rlcik7CisKKwludl9sb2FkX3B0dihkZXYsIHJlZ3MsIDIwOCk7CisJdHZfbG9hZF9maWx0ZXIoZGV2LCBOVl9QVFZfSEZJTFRFUiwgcmVncy0+aGZpbHRlcik7CisJdHZfbG9hZF9maWx0ZXIoZGV2LCBOVl9QVFZfSEZJTFRFUjIsIHJlZ3MtPmhmaWx0ZXIyKTsKKwl0dl9sb2FkX2ZpbHRlcihkZXYsIE5WX1BUVl9WRklMVEVSLCByZWdzLT52ZmlsdGVyKTsKK30KKwordm9pZCBudjE3X2N0dl91cGRhdGVfcmVzY2FsZXIoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnYxN190dl9lbmNvZGVyICp0dl9lbmMgPSB0b190dl9lbmMoZW5jb2Rlcik7CisJaW50IGhlYWQgPSBub3V2ZWF1X2NydGMoZW5jb2Rlci0+Y3J0YyktPmluZGV4OworCXN0cnVjdCBudjA0X2NydGNfcmVnICpyZWdzID0gJmRldl9wcml2LT5tb2RlX3JlZy5jcnRjX3JlZ1toZWFkXTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqY3J0Y19tb2RlID0gJmVuY29kZXItPmNydGMtPm1vZGU7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm91dHB1dF9tb2RlID0gJmdldF90dl9ub3JtKGVuY29kZXIpLT5jdHZfZW5jX21vZGUubW9kZTsKKwlpbnQgb3ZlcnNjYW4sIGhtYXJnaW4sIHZtYXJnaW4sIGhyYXRpbywgdnJhdGlvOworCisJLyogVGhlIHJlc2NhbGVyIGRvZXNuJ3QgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciBpbnRlcmxhY2VkIG1vZGVzLiAqLworCWlmIChvdXRwdXRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkKKwkJb3ZlcnNjYW4gPSAxMDA7CisJZWxzZQorCQlvdmVyc2NhbiA9IHR2X2VuYy0+b3ZlcnNjYW47CisKKwlobWFyZ2luID0gKG91dHB1dF9tb2RlLT5oZGlzcGxheSAtIGNydGNfbW9kZS0+aGRpc3BsYXkpIC8gMjsKKwl2bWFyZ2luID0gKG91dHB1dF9tb2RlLT52ZGlzcGxheSAtIGNydGNfbW9kZS0+dmRpc3BsYXkpIC8gMjsKKworCWhtYXJnaW4gPSBpbnRlcnBvbGF0ZSgwLCBtaW4oaG1hcmdpbiwgb3V0cHV0X21vZGUtPmhkaXNwbGF5LzIwKSwgaG1hcmdpbiwKKwkJCSAgICAgIG92ZXJzY2FuKTsKKwl2bWFyZ2luID0gaW50ZXJwb2xhdGUoMCwgbWluKHZtYXJnaW4sIG91dHB1dF9tb2RlLT52ZGlzcGxheS8yMCksIHZtYXJnaW4sCisJCQkgICAgICBvdmVyc2Nhbik7CisKKwlocmF0aW8gPSBjcnRjX21vZGUtPmhkaXNwbGF5ICogMHg4MDAgLyAob3V0cHV0X21vZGUtPmhkaXNwbGF5IC0gMipobWFyZ2luKTsKKwl2cmF0aW8gPSBjcnRjX21vZGUtPnZkaXNwbGF5ICogMHg4MDAgLyAob3V0cHV0X21vZGUtPnZkaXNwbGF5IC0gMip2bWFyZ2luKSAmIH4zOworCisJcmVncy0+ZnBfaG9yaXpfcmVnc1tGUF9WQUxJRF9TVEFSVF0gPSBobWFyZ2luOworCXJlZ3MtPmZwX2hvcml6X3JlZ3NbRlBfVkFMSURfRU5EXSA9IG91dHB1dF9tb2RlLT5oZGlzcGxheSAtIGhtYXJnaW4gLSAxOworCXJlZ3MtPmZwX3ZlcnRfcmVnc1tGUF9WQUxJRF9TVEFSVF0gPSB2bWFyZ2luOworCXJlZ3MtPmZwX3ZlcnRfcmVnc1tGUF9WQUxJRF9FTkRdID0gb3V0cHV0X21vZGUtPnZkaXNwbGF5IC0gdm1hcmdpbiAtIDE7CisKKwlyZWdzLT5mcF9kZWJ1Z18xID0gTlZfUFJBTURBQ19GUF9ERUJVR18xX1lTQ0FMRV9URVNUTU9ERV9FTkFCTEUgfAorCQlYTEFURSh2cmF0aW8sIDAsIE5WX1BSQU1EQUNfRlBfREVCVUdfMV9ZU0NBTEVfVkFMVUUpIHwKKwkJTlZfUFJBTURBQ19GUF9ERUJVR18xX1hTQ0FMRV9URVNUTU9ERV9FTkFCTEUgfAorCQlYTEFURShocmF0aW8sIDAsIE5WX1BSQU1EQUNfRlBfREVCVUdfMV9YU0NBTEVfVkFMVUUpOworCisJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfRlBfSFZBTElEX1NUQVJULAorCQkgICAgICByZWdzLT5mcF9ob3Jpel9yZWdzW0ZQX1ZBTElEX1NUQVJUXSk7CisJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfRlBfSFZBTElEX0VORCwKKwkJICAgICAgcmVncy0+ZnBfaG9yaXpfcmVnc1tGUF9WQUxJRF9FTkRdKTsKKwlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19GUF9WVkFMSURfU1RBUlQsCisJCSAgICAgIHJlZ3MtPmZwX3ZlcnRfcmVnc1tGUF9WQUxJRF9TVEFSVF0pOworCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0ZQX1ZWQUxJRF9FTkQsCisJCSAgICAgIHJlZ3MtPmZwX3ZlcnRfcmVnc1tGUF9WQUxJRF9FTkRdKTsKKwlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19GUF9ERUJVR18xLCByZWdzLT5mcF9kZWJ1Z18xKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MjBfZ3JhcGguYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MjBfZ3JhcGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGJhNzRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYyMF9ncmFwaC5jCkBAIC0wLDAgKzEsNzgwIEBACisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKKworLyoKKyAqIE5WMjAKKyAqIC0tLS0tCisgKiBUaGVyZSBhcmUgMyBmYW1pbGllcyA6CisgKiBOVjIwIGlzIDB4MTBkZToweDAyMCoKKyAqIE5WMjUvMjggaXMgMHgxMGRlOjB4MDI1KiAvIDB4MTBkZToweDAyOCoKKyAqIE5WMkEgaXMgMHgxMGRlOjB4MDJBMAorICoKKyAqIE5WMzAKKyAqIC0tLS0tCisgKiBUaGVyZSBhcmUgMyBmYW1pbGllcyA6CisgKiBOVjMwLzMxIGlzIDB4MTBkZToweDAzMCogLyAweDEwZGU6MHgwMzEqCisgKiBOVjM0IGlzIDB4MTBkZToweDAzMioKKyAqIE5WMzUvMzYgaXMgMHgxMGRlOjB4MDMzKiAvIDB4MTBkZToweDAzNCoKKyAqCisgKiBOb3Qgc2VlbiBpbiB0aGUgd2lsZCwgbm8gZHVtcHMgKHByb2JhYmx5IE5WMzUpIDoKKyAqIE5WMzcgaXMgMHgxMGRlOjB4MDBmYywgMHgxMGRlOjB4MDBmZAorICogTlYzOCBpcyAweDEwZGU6MHgwMzMzLCAweDEwZGU6MHgwMGZlCisgKgorICovCisKKyNkZWZpbmUgTlYyMF9HUkNUWF9TSVpFICgzNTgwKjQpCisjZGVmaW5lIE5WMjVfR1JDVFhfU0laRSAoMzUyOSo0KQorI2RlZmluZSBOVjJBX0dSQ1RYX1NJWkUgKDM1MDAqNCkKKworI2RlZmluZSBOVjMwXzMxX0dSQ1RYX1NJWkUgKDI0MzkyKQorI2RlZmluZSBOVjM0X0dSQ1RYX1NJWkUgICAgKDE4MTQwKQorI2RlZmluZSBOVjM1XzM2X0dSQ1RYX1NJWkUgKDIyMzk2KQorCitzdGF0aWMgdm9pZAorbnYyMF9ncmFwaF9jb250ZXh0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpjdHgpCit7CisJaW50IGk7CisKKwludl93bzMyKGRldiwgY3R4LCAweDAzM2MvNCwgMHhmZmZmMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwM2EwLzQsIDB4MGZmZjAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDNhNC80LCAweDBmZmYwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0N2MvNCwgMHgwMDAwMDEwMSk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNDkwLzQsIDB4MDAwMDAxMTEpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDRhOC80LCAweDQ0NDAwMDAwKTsKKwlmb3IgKGkgPSAweDA0ZDQ7IGkgPD0gMHgwNGUwOyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDAzMDMwMyk7CisJZm9yIChpID0gMHgwNGY0OyBpIDw9IDB4MDUwMDsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAwODAwMDApOworCWZvciAoaSA9IDB4MDUwYzsgaSA8PSAweDA1MTg7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAxMDEyMDAwKTsKKwlmb3IgKGkgPSAweDA1MWM7IGkgPD0gMHgwNTI4OyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDAxMDViOCk7CisJZm9yIChpID0gMHgwNTJjOyBpIDw9IDB4MDUzODsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAwODAwMDgpOworCWZvciAoaSA9IDB4MDU1YzsgaSA8PSAweDA1OTg7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDA3ZmYwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA1YTQvNCwgMHg0YjdmZmZmZik7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNWZjLzQsIDB4MDAwMDAwMDEpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDYwNC80LCAweDAwMDA0MDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA2MTAvNCwgMHgwMDAwMDAwMSk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNjE4LzQsIDB4MDAwNDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDYxYy80LCAweDAwMDEwMDAwKTsKKwlmb3IgKGkgPSAweDFjMWM7IGkgPD0gMHgyNDhjOyBpICs9IDE2KSB7CisJCW52X3dvMzIoZGV2LCBjdHgsIChpICsgMCkvNCwgMHgxMDcwMGZmOSk7CisJCW52X3dvMzIoZGV2LCBjdHgsIChpICsgNCkvNCwgMHgwNDM2MDg2Yyk7CisJCW52X3dvMzIoZGV2LCBjdHgsIChpICsgOCkvNCwgMHgwMDBjMDAxYik7CisJfQorCW52X3dvMzIoZGV2LCBjdHgsIDB4MjgxYy80LCAweDNmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDI4MzAvNCwgMHgzZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyODVjLzQsIDB4NDAwMDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4Mjg2MC80LCAweDNmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDI4NjQvNCwgMHgzZjAwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyODZjLzQsIDB4NDAwMDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4Mjg3MC80LCAweDNmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDI4NzgvNCwgMHhiZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyODgwLzQsIDB4YmY4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MzRhNC80LCAweDAwMGZlMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDM1MzAvNCwgMHgwMDAwMDNmOCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgzNTQwLzQsIDB4MDAyZmUwMDApOworCWZvciAoaSA9IDB4MzU1YzsgaSA8PSAweDM1Nzg7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMWM1MjdjKTsKK30KKworc3RhdGljIHZvaWQKK252MjVfZ3JhcGhfY29udGV4dF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqY3R4KQoreworCWludCBpOworCisJbnZfd28zMihkZXYsIGN0eCwgMHgwMzVjLzQsIDB4ZmZmZjAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDNjMC80LCAweDBmZmYwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDAzYzQvNCwgMHgwZmZmMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNDljLzQsIDB4MDAwMDAxMDEpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDRiMC80LCAweDAwMDAwMTExKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0YzgvNCwgMHgwMDAwMDA4MCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNGNjLzQsIDB4ZmZmZjAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDRkMC80LCAweDAwMDAwMDAxKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0ZTQvNCwgMHg0NDQwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNGZjLzQsIDB4NGI4MDAwMDApOworCWZvciAoaSA9IDB4MDUxMDsgaSA8PSAweDA1MWM7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDMwMzAzKTsKKwlmb3IgKGkgPSAweDA1MzA7IGkgPD0gMHgwNTNjOyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDA4MDAwMCk7CisJZm9yIChpID0gMHgwNTQ4OyBpIDw9IDB4MDU1NDsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDEwMTIwMDApOworCWZvciAoaSA9IDB4MDU1ODsgaSA8PSAweDA1NjQ7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDEwNWI4KTsKKwlmb3IgKGkgPSAweDA1Njg7IGkgPD0gMHgwNTc0OyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDA4MDAwOCk7CisJZm9yIChpID0gMHgwNTk4OyBpIDw9IDB4MDVkNDsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDdmZjAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDVlMC80LCAweDRiN2ZmZmZmKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA2MjAvNCwgMHgwMDAwMDA4MCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNjI0LzQsIDB4MzAyMDEwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDYyOC80LCAweDcwNjA1MDQwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA2MmMvNCwgMHhiMGEwOTA4MCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNjMwLzQsIDB4ZjBlMGQwYzApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDY2NC80LCAweDAwMDAwMDAxKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA2NmMvNCwgMHgwMDAwNDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNjc4LzQsIDB4MDAwMDAwMDEpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDY4MC80LCAweDAwMDQwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA2ODQvNCwgMHgwMDAxMDAwMCk7CisJZm9yIChpID0gMHgxYjA0OyBpIDw9IDB4MjM3NDsgaSArPSAxNikgeworCQludl93bzMyKGRldiwgY3R4LCAoaSArIDApLzQsIDB4MTA3MDBmZjkpOworCQludl93bzMyKGRldiwgY3R4LCAoaSArIDQpLzQsIDB4MDQzNjA4NmMpOworCQludl93bzMyKGRldiwgY3R4LCAoaSArIDgpLzQsIDB4MDAwYzAwMWIpOworCX0KKwludl93bzMyKGRldiwgY3R4LCAweDI3MDQvNCwgMHgzZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyNzE4LzQsIDB4M2Y4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4Mjc0NC80LCAweDQwMDAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDI3NDgvNCwgMHgzZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyNzRjLzQsIDB4M2YwMDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4Mjc1NC80LCAweDQwMDAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDI3NTgvNCwgMHgzZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyNzYwLzQsIDB4YmY4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4Mjc2OC80LCAweGJmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDMwOGMvNCwgMHgwMDBmZTAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgzMTA4LzQsIDB4MDAwMDAzZjgpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MzQ2OC80LCAweDAwMmZlMDAwKTsKKwlmb3IgKGkgPSAweDM0ODQ7IGkgPD0gMHgzNGEwOyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDFjNTI3Yyk7Cit9CisKK3N0YXRpYyB2b2lkCitudjJhX2dyYXBoX2NvbnRleHRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmN0eCkKK3sKKwlpbnQgaTsKKworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDMzYy80LCAweGZmZmYwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDAzYTAvNCwgMHgwZmZmMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwM2E0LzQsIDB4MGZmZjAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDQ3Yy80LCAweDAwMDAwMTAxKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0OTAvNCwgMHgwMDAwMDExMSk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNGE4LzQsIDB4NDQ0MDAwMDApOworCWZvciAoaSA9IDB4MDRkNDsgaSA8PSAweDA0ZTA7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDMwMzAzKTsKKwlmb3IgKGkgPSAweDA0ZjQ7IGkgPD0gMHgwNTAwOyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDA4MDAwMCk7CisJZm9yIChpID0gMHgwNTBjOyBpIDw9IDB4MDUxODsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDEwMTIwMDApOworCWZvciAoaSA9IDB4MDUxYzsgaSA8PSAweDA1Mjg7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDEwNWI4KTsKKwlmb3IgKGkgPSAweDA1MmM7IGkgPD0gMHgwNTM4OyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDA4MDAwOCk7CisJZm9yIChpID0gMHgwNTVjOyBpIDw9IDB4MDU5ODsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDdmZjAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDVhNC80LCAweDRiN2ZmZmZmKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA1ZmMvNCwgMHgwMDAwMDAwMSk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNjA0LzQsIDB4MDAwMDQwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDYxMC80LCAweDAwMDAwMDAxKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA2MTgvNCwgMHgwMDA0MDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNjFjLzQsIDB4MDAwMTAwMDApOworCWZvciAoaSA9IDB4MWE5YzsgaSA8PSAweDIyZmM7IGkgKz0gMTYpIHsgLypYWFg6IGNoZWNrISEgKi8KKwkJbnZfd28zMihkZXYsIGN0eCwgKGkgKyAwKS80LCAweDEwNzAwZmY5KTsKKwkJbnZfd28zMihkZXYsIGN0eCwgKGkgKyA0KS80LCAweDA0MzYwODZjKTsKKwkJbnZfd28zMihkZXYsIGN0eCwgKGkgKyA4KS80LCAweDAwMGMwMDFiKTsKKwl9CisJbnZfd28zMihkZXYsIGN0eCwgMHgyNjljLzQsIDB4M2Y4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MjZiMC80LCAweDNmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDI2ZGMvNCwgMHg0MDAwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyNmUwLzQsIDB4M2Y4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MjZlNC80LCAweDNmMDAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDI2ZWMvNCwgMHg0MDAwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyNmYwLzQsIDB4M2Y4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MjZmOC80LCAweGJmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDI3MDAvNCwgMHhiZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgzMDI0LzQsIDB4MDAwZmUwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MzBhMC80LCAweDAwMDAwM2Y4KTsKKwludl93bzMyKGRldiwgY3R4LCAweDMzZmMvNCwgMHgwMDJmZTAwMCk7CisJZm9yIChpID0gMHgzNDFjOyBpIDw9IDB4MzQzODsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAxYzUyN2MpOworfQorCitzdGF0aWMgdm9pZAorbnYzMF8zMV9ncmFwaF9jb250ZXh0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpjdHgpCit7CisJaW50IGk7CisKKwludl93bzMyKGRldiwgY3R4LCAweDA0MTAvNCwgMHgwMDAwMDEwMSk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNDI0LzQsIDB4MDAwMDAxMTEpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDQyOC80LCAweDAwMDAwMDYwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0NDQvNCwgMHgwMDAwMDA4MCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNDQ4LzQsIDB4ZmZmZjAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDQ0Yy80LCAweDAwMDAwMDAxKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0NjAvNCwgMHg0NDQwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNDhjLzQsIDB4ZmZmZjAwMDApOworCWZvciAoaSA9IDB4MDRlMDsgaSA8IDB4MDRlODsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MGZmZjAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDRlYy80LCAweDAwMDExMTAwKTsKKwlmb3IgKGkgPSAweDA1MDg7IGkgPCAweDA1NDg7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDA3ZmYwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA1NTAvNCwgMHg0YjdmZmZmZik7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNThjLzQsIDB4MDAwMDAwODApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDU5MC80LCAweDMwMjAxMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA1OTQvNCwgMHg3MDYwNTA0MCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNTk4LzQsIDB4YjhhODk4ODgpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDU5Yy80LCAweGY4ZThkOGM4KTsKKwludl93bzMyKGRldiwgY3R4LCAweDA1YjAvNCwgMHhiMDAwMDAwMCk7CisJZm9yIChpID0gMHgwNjAwOyBpIDwgMHgwNjQwOyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDAxMDU4OCk7CisJZm9yIChpID0gMHgwNjQwOyBpIDwgMHgwNjgwOyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDAzMDMwMyk7CisJZm9yIChpID0gMHgwNmMwOyBpIDwgMHgwNzAwOyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDA4YWFlNCk7CisJZm9yIChpID0gMHgwNzAwOyBpIDwgMHgwNzQwOyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMTAxMjAwMCk7CisJZm9yIChpID0gMHgwNzQwOyBpIDwgMHgwNzgwOyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDA4MDAwOCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwODVjLzQsIDB4MDAwNDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDg2MC80LCAweDAwMDEwMDAwKTsKKwlmb3IgKGkgPSAweDA4NjQ7IGkgPCAweDA4NzQ7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDQwMDA0KTsKKwlmb3IgKGkgPSAweDFmMTg7IGkgPD0gMHgzMDg4IDsgaSArPSAxNikgeworCQludl93bzMyKGRldiwgY3R4LCBpLzQgKyAwLCAweDEwNzAwZmY5KTsKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80ICsgMSwgMHgwNDM2MDg2Yyk7CisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCArIDIsIDB4MDAwYzAwMWIpOworCX0KKwlmb3IgKGkgPSAweDMwYjg7IGkgPCAweDMwYzg7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDBmZmZmKTsKKwludl93bzMyKGRldiwgY3R4LCAweDM0NGMvNCwgMHgzZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgzODA4LzQsIDB4M2Y4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MzgxYy80LCAweDNmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDM4NDgvNCwgMHg0MDAwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgzODRjLzQsIDB4M2Y4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4Mzg1MC80LCAweDNmMDAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDM4NTgvNCwgMHg0MDAwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgzODVjLzQsIDB4M2Y4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4Mzg2NC80LCAweGJmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDM4NmMvNCwgMHhiZjgwMDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkCitudjM0X2dyYXBoX2NvbnRleHRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmN0eCkKK3sKKwlpbnQgaTsKKworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDQwYy80LCAweDAxMDAwMTAxKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0MjAvNCwgMHgwMDAwMDExMSk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNDI0LzQsIDB4MDAwMDAwNjApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDQ0MC80LCAweDAwMDAwMDgwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0NDQvNCwgMHhmZmZmMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNDQ4LzQsIDB4MDAwMDAwMDEpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDQ1Yy80LCAweDQ0NDAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0ODAvNCwgMHhmZmZmMDAwMCk7CisJZm9yIChpID0gMHgwNGQ0OyBpIDwgMHgwNGRjOyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwZmZmMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNGUwLzQsIDB4MDAwMTExMDApOworCWZvciAoaSA9IDB4MDRmYzsgaSA8IDB4MDUzYzsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDdmZjAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDU0NC80LCAweDRiN2ZmZmZmKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA1N2MvNCwgMHgwMDAwMDA4MCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNTgwLzQsIDB4MzAyMDEwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDU4NC80LCAweDcwNjA1MDQwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA1ODgvNCwgMHhiOGE4OTg4OCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNThjLzQsIDB4ZjhlOGQ4YzgpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDVhMC80LCAweGIwMDAwMDAwKTsKKwlmb3IgKGkgPSAweDA1ZjA7IGkgPCAweDA2MzA7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDEwNTg4KTsKKwlmb3IgKGkgPSAweDA2MzA7IGkgPCAweDA2NzA7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDMwMzAzKTsKKwlmb3IgKGkgPSAweDA2YjA7IGkgPCAweDA2ZjA7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDhhYWU0KTsKKwlmb3IgKGkgPSAweDA2ZjA7IGkgPCAweDA3MzA7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAxMDEyMDAwKTsKKwlmb3IgKGkgPSAweDA3MzA7IGkgPCAweDA3NzA7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDgwMDA4KTsKKwludl93bzMyKGRldiwgY3R4LCAweDA4NTAvNCwgMHgwMDA0MDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwODU0LzQsIDB4MDAwMTAwMDApOworCWZvciAoaSA9IDB4MDg1ODsgaSA8IDB4MDg2ODsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAwNDAwMDQpOworCWZvciAoaSA9IDB4MTVhYzsgaSA8PSAweDI3MWMgOyBpICs9IDE2KSB7CisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCArIDAsIDB4MTA3MDBmZjkpOworCQludl93bzMyKGRldiwgY3R4LCBpLzQgKyAxLCAweDA0MzYwODZjKTsKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80ICsgMiwgMHgwMDBjMDAxYik7CisJfQorCWZvciAoaSA9IDB4Mjc0YzsgaSA8IDB4Mjc1YzsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAwMGZmZmYpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MmFlMC80LCAweDNmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDJlOWMvNCwgMHgzZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyZWIwLzQsIDB4M2Y4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MmVkYy80LCAweDQwMDAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDJlZTAvNCwgMHgzZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyZWU0LzQsIDB4M2YwMDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MmVlYy80LCAweDQwMDAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDJlZjAvNCwgMHgzZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyZWY4LzQsIDB4YmY4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MmYwMC80LCAweGJmODAwMDAwKTsKK30KKworc3RhdGljIHZvaWQKK252MzVfMzZfZ3JhcGhfY29udGV4dF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqY3R4KQoreworCWludCBpOworCisJbnZfd28zMihkZXYsIGN0eCwgMHgwNDBjLzQsIDB4MDAwMDAxMDEpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDQyMC80LCAweDAwMDAwMTExKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0MjQvNCwgMHgwMDAwMDA2MCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNDQwLzQsIDB4MDAwMDAwODApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDQ0NC80LCAweGZmZmYwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0NDgvNCwgMHgwMDAwMDAwMSk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNDVjLzQsIDB4NDQ0MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDQ4OC80LCAweGZmZmYwMDAwKTsKKwlmb3IgKGkgPSAweDA0ZGM7IGkgPCAweDA0ZTQ7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDBmZmYwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0ZTgvNCwgMHgwMDAxMTEwMCk7CisJZm9yIChpID0gMHgwNTA0OyBpIDwgMHgwNTQ0OyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwN2ZmMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNTRjLzQsIDB4NGI3ZmZmZmYpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDU4OC80LCAweDAwMDAwMDgwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA1OGMvNCwgMHgzMDIwMTAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNTkwLzQsIDB4NzA2MDUwNDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDU5NC80LCAweGI4YTg5ODg4KTsKKwludl93bzMyKGRldiwgY3R4LCAweDA1OTgvNCwgMHhmOGU4ZDhjOCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNWFjLzQsIDB4YjAwMDAwMDApOworCWZvciAoaSA9IDB4MDYwNDsgaSA8IDB4MDY0NDsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAwMTA1ODgpOworCWZvciAoaSA9IDB4MDY0NDsgaSA8IDB4MDY4NDsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAwMzAzMDMpOworCWZvciAoaSA9IDB4MDZjNDsgaSA8IDB4MDcwNDsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAwOGFhZTQpOworCWZvciAoaSA9IDB4MDcwNDsgaSA8IDB4MDc0NDsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDEwMTIwMDApOworCWZvciAoaSA9IDB4MDc0NDsgaSA8IDB4MDc4NDsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAwODAwMDgpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDg2MC80LCAweDAwMDQwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA4NjQvNCwgMHgwMDAxMDAwMCk7CisJZm9yIChpID0gMHgwODY4OyBpIDwgMHgwODc4OyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDA0MDAwNCk7CisJZm9yIChpID0gMHgxZjFjOyBpIDw9IDB4MzA4YyA7IGkgKz0gMTYpIHsKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80ICsgMCwgMHgxMDcwMGZmOSk7CisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCArIDEsIDB4MDQzNjA4NmMpOworCQludl93bzMyKGRldiwgY3R4LCBpLzQgKyAyLCAweDAwMGMwMDFiKTsKKwl9CisJZm9yIChpID0gMHgzMGJjOyBpIDwgMHgzMGNjOyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDAwZmZmZik7CisJbnZfd28zMihkZXYsIGN0eCwgMHgzNDUwLzQsIDB4M2Y4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MzgwYy80LCAweDNmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDM4MjAvNCwgMHgzZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgzODRjLzQsIDB4NDAwMDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4Mzg1MC80LCAweDNmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDM4NTQvNCwgMHgzZjAwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgzODVjLzQsIDB4NDAwMDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4Mzg2MC80LCAweDNmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDM4NjgvNCwgMHhiZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgzODcwLzQsIDB4YmY4MDAwMDApOworfQorCitpbnQKK252MjBfZ3JhcGhfY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdm9pZCAoKmN0eF9pbml0KShzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CisJdW5zaWduZWQgaW50IGN0eF9zaXplOworCXVuc2lnbmVkIGludCBpZG9mZnMgPSAweDI4LzQ7CisJaW50IHJldDsKKworCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQpIHsKKwljYXNlIDB4MjA6CisJCWN0eF9zaXplID0gTlYyMF9HUkNUWF9TSVpFOworCQljdHhfaW5pdCA9IG52MjBfZ3JhcGhfY29udGV4dF9pbml0OworCQlpZG9mZnMgPSAwOworCQlicmVhazsKKwljYXNlIDB4MjU6CisJY2FzZSAweDI4OgorCQljdHhfc2l6ZSA9IE5WMjVfR1JDVFhfU0laRTsKKwkJY3R4X2luaXQgPSBudjI1X2dyYXBoX2NvbnRleHRfaW5pdDsKKwkJYnJlYWs7CisJY2FzZSAweDJhOgorCQljdHhfc2l6ZSA9IE5WMkFfR1JDVFhfU0laRTsKKwkJY3R4X2luaXQgPSBudjJhX2dyYXBoX2NvbnRleHRfaW5pdDsKKwkJaWRvZmZzID0gMDsKKwkJYnJlYWs7CisJY2FzZSAweDMwOgorCWNhc2UgMHgzMToKKwkJY3R4X3NpemUgPSBOVjMwXzMxX0dSQ1RYX1NJWkU7CisJCWN0eF9pbml0ID0gbnYzMF8zMV9ncmFwaF9jb250ZXh0X2luaXQ7CisJCWJyZWFrOworCWNhc2UgMHgzNDoKKwkJY3R4X3NpemUgPSBOVjM0X0dSQ1RYX1NJWkU7CisJCWN0eF9pbml0ID0gbnYzNF9ncmFwaF9jb250ZXh0X2luaXQ7CisJCWJyZWFrOworCWNhc2UgMHgzNToKKwljYXNlIDB4MzY6CisJCWN0eF9zaXplID0gTlYzNV8zNl9HUkNUWF9TSVpFOworCQljdHhfaW5pdCA9IG52MzVfMzZfZ3JhcGhfY29udGV4dF9pbml0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQljdHhfc2l6ZSA9IDA7CisJCWN0eF9pbml0ID0gbnYzNV8zNl9ncmFwaF9jb250ZXh0X2luaXQ7CisJCU5WX0VSUk9SKGRldiwgIlBsZWFzZSBjb250YWN0IHRoZSBkZXZzIGlmIHlvdSB3YW50IHlvdXIgTlYleCIKKwkJCSAgICAgICIgY2FyZCB0byB3b3JrXG4iLCBkZXZfcHJpdi0+Y2hpcHNldCk7CisJCXJldHVybiAtRU5PU1lTOworCQlicmVhazsKKwl9CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfcmVmKGRldiwgY2hhbiwgTlVMTCwgMCwgY3R4X3NpemUsIDE2LAorCQkJCQkgIE5WT0JKX0ZMQUdfWkVST19BTExPQywKKwkJCQkJICAmY2hhbi0+cmFtaW5fZ3JjdHgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBJbml0aWFsaXNlIGRlZmF1bHQgY29udGV4dCB2YWx1ZXMgKi8KKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKwljdHhfaW5pdChkZXYsIGNoYW4tPnJhbWluX2dyY3R4LT5ncHVvYmopOworCisJLyogbnYyMDogbnZfd28zMihkZXYsIGNoYW4tPnJhbWluX2dyY3R4LT5ncHVvYmosIDEwLCBjaGFuLT5pZDw8MjQpOyAqLworCW52X3dvMzIoZGV2LCBjaGFuLT5yYW1pbl9ncmN0eC0+Z3B1b2JqLCBpZG9mZnMsCisJCQkJCShjaGFuLT5pZCA8PCAyNCkgfCAweDEpOyAvKiBDVFhfVVNFUiAqLworCisJbnZfd28zMihkZXYsIGRldl9wcml2LT5jdHhfdGFibGUtPmdwdW9iaiwgY2hhbi0+aWQsCisJCQljaGFuLT5yYW1pbl9ncmN0eC0+aW5zdGFuY2UgPj4gNCk7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCXJldHVybiAwOworfQorCit2b2lkCitudjIwX2dyYXBoX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChjaGFuLT5yYW1pbl9ncmN0eCkKKwkJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZjaGFuLT5yYW1pbl9ncmN0eCk7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKwludl93bzMyKGRldiwgZGV2X3ByaXYtPmN0eF90YWJsZS0+Z3B1b2JqLCBjaGFuLT5pZCwgMCk7CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKK30KKworaW50CitudjIwX2dyYXBoX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJdWludDMyX3QgaW5zdDsKKworCWlmICghY2hhbi0+cmFtaW5fZ3JjdHgpCisJCXJldHVybiAtRUlOVkFMOworCWluc3QgPSBjaGFuLT5yYW1pbl9ncmN0eC0+aW5zdGFuY2UgPj4gNDsKKworCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9DSEFOTkVMX0NUWF9QT0lOVEVSLCBpbnN0KTsKKwludl93cjMyKGRldiwgTlYyMF9QR1JBUEhfQ0hBTk5FTF9DVFhfWEZFUiwKKwkJICAgICBOVjIwX1BHUkFQSF9DSEFOTkVMX0NUWF9YRkVSX0xPQUQpOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9DVFhfQ09OVFJPTCwgMHgxMDAxMDEwMCk7CisKKwlub3V2ZWF1X3dhaXRfZm9yX2lkbGUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworaW50CitudjIwX2dyYXBoX3VubG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKKwlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CisJdWludDMyX3QgaW5zdCwgdG1wOworCisJY2hhbiA9IHBncmFwaC0+Y2hhbm5lbChkZXYpOworCWlmICghY2hhbikKKwkJcmV0dXJuIDA7CisJaW5zdCA9IGNoYW4tPnJhbWluX2dyY3R4LT5pbnN0YW5jZSA+PiA0OworCisJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX0NIQU5ORUxfQ1RYX1BPSU5URVIsIGluc3QpOworCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9DSEFOTkVMX0NUWF9YRkVSLAorCQkgICAgIE5WMjBfUEdSQVBIX0NIQU5ORUxfQ1RYX1hGRVJfU0FWRSk7CisKKwlub3V2ZWF1X3dhaXRfZm9yX2lkbGUoZGV2KTsKKworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9DVFhfQ09OVFJPTCwgMHgxMDAwMDAwMCk7CisJdG1wICA9IG52X3JkMzIoZGV2LCBOVjEwX1BHUkFQSF9DVFhfVVNFUikgJiAweDAwZmZmZmZmOworCXRtcCB8PSAocGZpZm8tPmNoYW5uZWxzIC0gMSkgPDwgMjQ7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0NUWF9VU0VSLCB0bXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbnYyMF9ncmFwaF9yZGkoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpLCB3cml0ZWNvdW50ID0gMzI7CisJdWludDMyX3QgcmRpX2luZGV4ID0gMHgyYzgwMDAwOworCisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4MjApIHsKKwkJcmRpX2luZGV4ID0gMHgzZDAwMDA7CisJCXdyaXRlY291bnQgPSAxNTsKKwl9CisKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0lOREVYLCByZGlfaW5kZXgpOworCWZvciAoaSA9IDA7IGkgPCB3cml0ZWNvdW50OyBpKyspCisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfREFUQSwgMCk7CisKKwlub3V2ZWF1X3dhaXRfZm9yX2lkbGUoZGV2KTsKK30KKworaW50CitudjIwX2dyYXBoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPQorCQkoc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKilkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IHRtcCwgdnJhbXN6OworCWludCByZXQsIGk7CisKKwludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLAorCQludl9yZDMyKGRldiwgTlYwM19QTUNfRU5BQkxFKSAmIH5OVl9QTUNfRU5BQkxFX1BHUkFQSCk7CisJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwKKwkJbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgfCAgTlZfUE1DX0VOQUJMRV9QR1JBUEgpOworCisJaWYgKCFkZXZfcHJpdi0+Y3R4X3RhYmxlKSB7CisJCS8qIENyZWF0ZSBDb250ZXh0IFBvaW50ZXIgVGFibGUgKi8KKwkJZGV2X3ByaXYtPmN0eF90YWJsZV9zaXplID0gMzIgKiA0OworCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfcmVmKGRldiwgTlVMTCwgTlVMTCwgMCwKKwkJCQkJCSAgZGV2X3ByaXYtPmN0eF90YWJsZV9zaXplLCAxNiwKKwkJCQkJCSAgTlZPQkpfRkxBR19aRVJPX0FMTE9DLAorCQkJCQkJICAmZGV2X3ByaXYtPmN0eF90YWJsZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9DSEFOTkVMX0NUWF9UQUJMRSwKKwkJIGRldl9wcml2LT5jdHhfdGFibGUtPmluc3RhbmNlID4+IDQpOworCisJbnYyMF9ncmFwaF9yZGkoZGV2KTsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSICAgLCAweEZGRkZGRkZGKTsKKwludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUl9FTiwgMHhGRkZGRkZGRik7CisKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMCwgMHhGRkZGRkZGRik7CisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0RFQlVHXzAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9ERUJVR18xLCAweDAwMTE4NzAwKTsKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMywgMHhGM0NFMDQ3NSk7IC8qIDB4NCA9IGF1dG8gY3R4IHN3aXRjaCAqLworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9ERUJVR180LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDAwOUMgICAgICAgICAgICwgMHgwMDAwMDA0MCk7CisKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHgyNSkgeworCQludl93cjMyKGRldiwgMHg0MDA4OTAsIDB4MDAwODAwMDApOworCQludl93cjMyKGRldiwgMHg0MDA2MTAsIDB4MzA0QjFGQjYpOworCQludl93cjMyKGRldiwgMHg0MDBCODAsIDB4MThCODI4ODApOworCQludl93cjMyKGRldiwgMHg0MDBCODQsIDB4NDQwMDAwMDApOworCQludl93cjMyKGRldiwgMHg0MDAwOTgsIDB4NDAwMDAwODApOworCQludl93cjMyKGRldiwgMHg0MDBCODgsIDB4MDAwMDAwZmYpOworCX0gZWxzZSB7CisJCW52X3dyMzIoZGV2LCAweDQwMDg4MCwgMHgwMDA4MDAwMCk7IC8qIDB4MDAwOGM3ZGYgKi8KKwkJbnZfd3IzMihkZXYsIDB4NDAwMDk0LCAweDAwMDAwMDA1KTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwQjgwLCAweDQ1Q0FBMjA4KTsgLyogMHg0NWVhZTIwZSAqLworCQludl93cjMyKGRldiwgMHg0MDBCODQsIDB4MjQwMDAwMDApOworCQludl93cjMyKGRldiwgMHg0MDAwOTgsIDB4MDAwMDAwNDApOworCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0lOREVYLCAweDAwRTAwMDM4KTsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9EQVRBICwgMHgwMDAwMDAzMCk7CisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfSU5ERVgsIDB4MDBFMTAwMzgpOworCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0RBVEEgLCAweDAwMDAwMDMwKTsKKwl9CisKKwkvKiBjb3B5IHRpbGUgaW5mbyBmcm9tIFBGQiAqLworCWZvciAoaSA9IDA7IGkgPCBOVjEwX1BGQl9USUxFX19TSVpFOyBpKyspIHsKKwkJbnZfd3IzMihkZXYsIDB4MDA0MDA5MDQgKyBpICogMHgxMCwKKwkJCQkJbnZfcmQzMihkZXYsIE5WMTBfUEZCX1RMSU1JVChpKSkpOworCQkJLyogd2hpY2ggaXMgTlY0MF9QR1JBUEhfVExJTUlUMChpKSA/PyAqLworCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0lOREVYLCAweDAwRUEwMDMwICsgaSAqIDQpOworCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0RBVEEsCisJCQkJCW52X3JkMzIoZGV2LCBOVjEwX1BGQl9UTElNSVQoaSkpKTsKKwkJbnZfd3IzMihkZXYsIDB4MDA0MDA5MDggKyBpICogMHgxMCwKKwkJCQkJbnZfcmQzMihkZXYsIE5WMTBfUEZCX1RTSVpFKGkpKSk7CisJCQkvKiB3aGljaCBpcyBOVjQwX1BHUkFQSF9UU0laRTAoaSkgPz8gKi8KKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9JTkRFWCwgMHgwMEVBMDA1MCArIGkgKiA0KTsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9EQVRBLAorCQkJCQludl9yZDMyKGRldiwgTlYxMF9QRkJfVFNJWkUoaSkpKTsKKwkJbnZfd3IzMihkZXYsIDB4MDA0MDA5MDAgKyBpICogMHgxMCwKKwkJCQkJbnZfcmQzMihkZXYsIE5WMTBfUEZCX1RJTEUoaSkpKTsKKwkJCS8qIHdoaWNoIGlzIE5WNDBfUEdSQVBIX1RJTEUwKGkpID8/ICovCisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfSU5ERVgsIDB4MDBFQTAwMTAgKyBpICogNCk7CisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfREFUQSwKKwkJCQkJbnZfcmQzMihkZXYsIE5WMTBfUEZCX1RJTEUoaSkpKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQludl93cjMyKGRldiwgMHg0MDA5ODAgKyBpICogNCwgbnZfcmQzMihkZXYsIDB4MTAwMzAwICsgaSAqIDQpKTsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9JTkRFWCwgMHgwMEVBMDA5MCArIGkgKiA0KTsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9EQVRBLAorCQkJCQludl9yZDMyKGRldiwgMHgxMDAzMDAgKyBpICogNCkpOworCX0KKwludl93cjMyKGRldiwgMHg0MDA5YTAsIG52X3JkMzIoZGV2LCAweDEwMDMyNCkpOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfSU5ERVgsIDB4MDBFQTAwMEMpOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfREFUQSwgbnZfcmQzMihkZXYsIDB4MTAwMzI0KSk7CisKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfQ1RYX0NPTlRST0wsIDB4MTAwMDAxMDApOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9TVEFURSAgICAgICwgMHhGRkZGRkZGRik7CisKKwl0bXAgPSBudl9yZDMyKGRldiwgTlYxMF9QR1JBUEhfU1VSRkFDRSkgJiAweDAwMDdmZjAwOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9TVVJGQUNFLCB0bXApOworCXRtcCA9IG52X3JkMzIoZGV2LCBOVjEwX1BHUkFQSF9TVVJGQUNFKSB8IDB4MDAwMjAxMDA7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1NVUkZBQ0UsIHRtcCk7CisKKwkvKiBiZWdpbiBSQU0gY29uZmlnICovCisJdnJhbXN6ID0gZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCAwKSAtIDE7CisJbnZfd3IzMihkZXYsIDB4NDAwOUE0LCBudl9yZDMyKGRldiwgTlYwNF9QRkJfQ0ZHMCkpOworCW52X3dyMzIoZGV2LCAweDQwMDlBOCwgbnZfcmQzMihkZXYsIE5WMDRfUEZCX0NGRzEpKTsKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0lOREVYLCAweDAwRUEwMDAwKTsKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0RBVEEgLCBudl9yZDMyKGRldiwgTlYwNF9QRkJfQ0ZHMCkpOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfSU5ERVgsIDB4MDBFQTAwMDQpOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfREFUQSAsIG52X3JkMzIoZGV2LCBOVjA0X1BGQl9DRkcxKSk7CisJbnZfd3IzMihkZXYsIDB4NDAwODIwLCAwKTsKKwludl93cjMyKGRldiwgMHg0MDA4MjQsIDApOworCW52X3dyMzIoZGV2LCAweDQwMDg2NCwgdnJhbXN6IC0gMSk7CisJbnZfd3IzMihkZXYsIDB4NDAwODY4LCB2cmFtc3ogLSAxKTsKKworCS8qIGludGVyZXN0aW5nLi4gdGhlIGJlbG93IG92ZXJ3cml0ZXMgc29tZSBvZiB0aGUgdGlsZSBzZXR1cCBhYm92ZS4uICovCisJbnZfd3IzMihkZXYsIDB4NDAwQjIwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDBCMDQsIDB4RkZGRkZGRkYpOworCisJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0FCU19VQ0xJUF9YTUlOLCAwKTsKKwludl93cjMyKGRldiwgTlYwM19QR1JBUEhfQUJTX1VDTElQX1lNSU4sIDApOworCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9BQlNfVUNMSVBfWE1BWCwgMHg3ZmZmKTsKKwludl93cjMyKGRldiwgTlYwM19QR1JBUEhfQUJTX1VDTElQX1lNQVgsIDB4N2ZmZik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnYyMF9ncmFwaF90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJmRldl9wcml2LT5jdHhfdGFibGUpOworfQorCitpbnQKK252MzBfZ3JhcGhfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHJldCwgaTsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsCisJCW52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpICYgfk5WX1BNQ19FTkFCTEVfUEdSQVBIKTsKKwludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLAorCQludl9yZDMyKGRldiwgTlYwM19QTUNfRU5BQkxFKSB8ICBOVl9QTUNfRU5BQkxFX1BHUkFQSCk7CisKKwlpZiAoIWRldl9wcml2LT5jdHhfdGFibGUpIHsKKwkJLyogQ3JlYXRlIENvbnRleHQgUG9pbnRlciBUYWJsZSAqLworCQlkZXZfcHJpdi0+Y3R4X3RhYmxlX3NpemUgPSAzMiAqIDQ7CisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19yZWYoZGV2LCBOVUxMLCBOVUxMLCAwLAorCQkJCQkJICBkZXZfcHJpdi0+Y3R4X3RhYmxlX3NpemUsIDE2LAorCQkJCQkJICBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsCisJCQkJCQkgICZkZXZfcHJpdi0+Y3R4X3RhYmxlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX0NIQU5ORUxfQ1RYX1RBQkxFLAorCQkJZGV2X3ByaXYtPmN0eF90YWJsZS0+aW5zdGFuY2UgPj4gNCk7CisKKwludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiAgICwgMHhGRkZGRkZGRik7CisJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFJfRU4sIDB4RkZGRkZGRkYpOworCisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0RFQlVHXzAsIDB4RkZGRkZGRkYpOworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9ERUJVR18wLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMSwgMHg0MDEyODdjMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwODkwLCAweDAxYjQ2M2ZmKTsKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMywgMHhmMmRlMDQ3NSk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0RFQlVHXzQsIDB4MDAwMDgwMDApOworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9MSU1JVF9WSU9MX1BJWCwgMHhmMDRiZGZmNik7CisJbnZfd3IzMihkZXYsIDB4NDAwQjgwLCAweDEwMDNkODg4KTsKKwludl93cjMyKGRldiwgMHg0MDBCODQsIDB4MGMwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwMDA5OCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwMDlDLCAweDAwMDVhZDAwKTsKKwludl93cjMyKGRldiwgMHg0MDBCODgsIDB4NjJmZjAwZmYpOyAvKiBzdXNwaWNpb3VzbHkgbGlrZSBQR1JBUEhfREVCVUdfMiAqLworCW52X3dyMzIoZGV2LCAweDQwMDBhMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwMGE0LCAweDAwMDAwMDA4KTsKKwludl93cjMyKGRldiwgMHg0MDA4YTgsIDB4Yjc4NGE0MDApOworCW52X3dyMzIoZGV2LCAweDQwMGJhMCwgMHgwMDJmODY4NSk7CisJbnZfd3IzMihkZXYsIDB4NDAwYmE0LCAweDAwMjMxZjNmKTsKKwludl93cjMyKGRldiwgMHg0MDA4YTQsIDB4NDAwMDAwMjApOworCisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4MzQpIHsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9JTkRFWCwgMHgwMEVBMDAwNCk7CisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfREFUQSAsIDB4MDAyMDAyMDEpOworCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0lOREVYLCAweDAwRUEwMDA4KTsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9EQVRBICwgMHgwMDAwMDAwOCk7CisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfSU5ERVgsIDB4MDBFQTAwMDApOworCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0RBVEEgLCAweDAwMDAwMDMyKTsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9JTkRFWCwgMHgwMEUwMDAwNCk7CisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfREFUQSAsIDB4MDAwMDAwMDIpOworCX0KKworCW52X3dyMzIoZGV2LCAweDQwMDBjMCwgMHgwMDAwMDAxNik7CisKKwkvKiBjb3B5IHRpbGUgaW5mbyBmcm9tIFBGQiAqLworCWZvciAoaSA9IDA7IGkgPCBOVjEwX1BGQl9USUxFX19TSVpFOyBpKyspIHsKKwkJbnZfd3IzMihkZXYsIDB4MDA0MDA5MDQgKyBpICogMHgxMCwKKwkJCQkJbnZfcmQzMihkZXYsIE5WMTBfUEZCX1RMSU1JVChpKSkpOworCQkJLyogd2hpY2ggaXMgTlY0MF9QR1JBUEhfVExJTUlUMChpKSA/PyAqLworCQludl93cjMyKGRldiwgMHgwMDQwMDkwOCArIGkgKiAweDEwLAorCQkJCQludl9yZDMyKGRldiwgTlYxMF9QRkJfVFNJWkUoaSkpKTsKKwkJCS8qIHdoaWNoIGlzIE5WNDBfUEdSQVBIX1RTSVpFMChpKSA/PyAqLworCQludl93cjMyKGRldiwgMHgwMDQwMDkwMCArIGkgKiAweDEwLAorCQkJCQludl9yZDMyKGRldiwgTlYxMF9QRkJfVElMRShpKSkpOworCQkJLyogd2hpY2ggaXMgTlY0MF9QR1JBUEhfVElMRTAoaSkgPz8gKi8KKwl9CisKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfQ1RYX0NPTlRST0wsIDB4MTAwMDAxMDApOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9TVEFURSAgICAgICwgMHhGRkZGRkZGRik7CisJbnZfd3IzMihkZXYsIDB4MDA0MDA3NWMgICAgICAgICAgICAgLCAweDAwMDAwMDAxKTsKKworCS8qIGJlZ2luIFJBTSBjb25maWcgKi8KKwkvKiB2cmFtc3ogPSBkcm1fZ2V0X3Jlc291cmNlX2xlbihkZXYsIDApIC0gMTsgKi8KKwludl93cjMyKGRldiwgMHg0MDA5QTQsIG52X3JkMzIoZGV2LCBOVjA0X1BGQl9DRkcwKSk7CisJbnZfd3IzMihkZXYsIDB4NDAwOUE4LCBudl9yZDMyKGRldiwgTlYwNF9QRkJfQ0ZHMSkpOworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCAhPSAweDM0KSB7CisJCW52X3dyMzIoZGV2LCAweDQwMDc1MCwgMHgwMEVBMDAwMCk7CisJCW52X3dyMzIoZGV2LCAweDQwMDc1NCwgbnZfcmQzMihkZXYsIE5WMDRfUEZCX0NGRzApKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwNzUwLCAweDAwRUEwMDA0KTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwNzU0LCBudl9yZDMyKGRldiwgTlYwNF9QRkJfQ0ZHMSkpOworCX0KKworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzIG52MjBfZ3JhcGhfZ3JjbGFzc1tdID0geworCXsgMHgwMDMwLCBmYWxzZSwgTlVMTCB9LCAvKiBudWxsICovCisJeyAweDAwMzksIGZhbHNlLCBOVUxMIH0sIC8qIG0ybWYgKi8KKwl7IDB4MDA0YSwgZmFsc2UsIE5VTEwgfSwgLyogZ2RpcmVjdCAqLworCXsgMHgwMDlmLCBmYWxzZSwgTlVMTCB9LCAvKiBpbWFnZWJsaXQgKG52MTIpICovCisJeyAweDAwOGEsIGZhbHNlLCBOVUxMIH0sIC8qIGlmYyAqLworCXsgMHgwMDg5LCBmYWxzZSwgTlVMTCB9LCAvKiBzaWZtICovCisJeyAweDAwNjIsIGZhbHNlLCBOVUxMIH0sIC8qIHN1cmYyZCAqLworCXsgMHgwMDQzLCBmYWxzZSwgTlVMTCB9LCAvKiByb3AgKi8KKwl7IDB4MDAxMiwgZmFsc2UsIE5VTEwgfSwgLyogYmV0YTEgKi8KKwl7IDB4MDA3MiwgZmFsc2UsIE5VTEwgfSwgLyogYmV0YTQgKi8KKwl7IDB4MDAxOSwgZmFsc2UsIE5VTEwgfSwgLyogY2xpcHJlY3QgKi8KKwl7IDB4MDA0NCwgZmFsc2UsIE5VTEwgfSwgLyogcGF0dGVybiAqLworCXsgMHgwMDllLCBmYWxzZSwgTlVMTCB9LCAvKiBzd3pzdXJmICovCisJeyAweDAwOTYsIGZhbHNlLCBOVUxMIH0sIC8qIGNlbGNpdXMgKi8KKwl7IDB4MDA5NywgZmFsc2UsIE5VTEwgfSwgLyoga2VsdmluIChudjIwKSAqLworCXsgMHgwNTk3LCBmYWxzZSwgTlVMTCB9LCAvKiBrZWx2aW4gKG52MjUpICovCisJe30KK307CisKK3N0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgbnYzMF9ncmFwaF9ncmNsYXNzW10gPSB7CisJeyAweDAwMzAsIGZhbHNlLCBOVUxMIH0sIC8qIG51bGwgKi8KKwl7IDB4MDAzOSwgZmFsc2UsIE5VTEwgfSwgLyogbTJtZiAqLworCXsgMHgwMDRhLCBmYWxzZSwgTlVMTCB9LCAvKiBnZGlyZWN0ICovCisJeyAweDAwOWYsIGZhbHNlLCBOVUxMIH0sIC8qIGltYWdlYmxpdCAobnYxMikgKi8KKwl7IDB4MDA4YSwgZmFsc2UsIE5VTEwgfSwgLyogaWZjICovCisJeyAweDAzOGEsIGZhbHNlLCBOVUxMIH0sIC8qIGlmYyAobnYzMCkgKi8KKwl7IDB4MDA4OSwgZmFsc2UsIE5VTEwgfSwgLyogc2lmbSAqLworCXsgMHgwMzg5LCBmYWxzZSwgTlVMTCB9LCAvKiBzaWZtIChudjMwKSAqLworCXsgMHgwMDYyLCBmYWxzZSwgTlVMTCB9LCAvKiBzdXJmMmQgKi8KKwl7IDB4MDM2MiwgZmFsc2UsIE5VTEwgfSwgLyogc3VyZjJkIChudjMwKSAqLworCXsgMHgwMDQzLCBmYWxzZSwgTlVMTCB9LCAvKiByb3AgKi8KKwl7IDB4MDAxMiwgZmFsc2UsIE5VTEwgfSwgLyogYmV0YTEgKi8KKwl7IDB4MDA3MiwgZmFsc2UsIE5VTEwgfSwgLyogYmV0YTQgKi8KKwl7IDB4MDAxOSwgZmFsc2UsIE5VTEwgfSwgLyogY2xpcHJlY3QgKi8KKwl7IDB4MDA0NCwgZmFsc2UsIE5VTEwgfSwgLyogcGF0dGVybiAqLworCXsgMHgwMzllLCBmYWxzZSwgTlVMTCB9LCAvKiBzd3pzdXJmICovCisJeyAweDAzOTcsIGZhbHNlLCBOVUxMIH0sIC8qIHJhbmtpbmUgKG52MzApICovCisJeyAweDA0OTcsIGZhbHNlLCBOVUxMIH0sIC8qIHJhbmtpbmUgKG52MzUpICovCisJeyAweDA2OTcsIGZhbHNlLCBOVUxMIH0sIC8qIHJhbmtpbmUgKG52MzQpICovCisJe30KK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfZmIuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfZmIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTFkMjcxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9mYi5jCkBAIC0wLDAgKzEsNjIgQEAKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgorCitpbnQKK252NDBfZmJfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgZmJfYmFyX3NpemUsIHRtcDsKKwlpbnQgbnVtX3RpbGVzOworCWludCBpOworCisJLyogVGhpcyBpcyBzdHJpY3RseSBhIE5WNHggcmVnaXN0ZXIgKGRvbid0IGtub3cgYWJvdXQgTlY1eCkuICovCisJLyogVGhlIGJsb2Igc2V0cyB0aGVzZSB0byBhbGwga2luZHMgb2YgdmFsdWVzLCBhbmQgdGhleSBtZXNzIHVwIG91ciBzZXR1cC4gKi8KKwkvKiBJIGdvdCB2YWx1ZSAweDUyODAyIGluc3RlYWQuIEZvciBzb21lIGNhcmRzIHRoZSBibG9iIGV2ZW4gc2V0cyBpdCBiYWNrIHRvIDB4MS4gKi8KKwkvKiBOb3RlOiB0aGUgYmxvYiBkb2Vzbid0IHJlYWQgdGhpcyB2YWx1ZSwgc28gaSdtIHByZXR0eSBzdXJlIHRoaXMgaXMgc2FmZSBmb3IgYWxsIGNhcmRzLiAqLworCS8qIEFueSBpZGVhIHdoYXQgdGhpcyBpcz8gKi8KKwludl93cjMyKGRldiwgTlY0MF9QRkJfVU5LXzgwMCwgMHgxKTsKKworCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQpIHsKKwljYXNlIDB4NDA6CisJY2FzZSAweDQ1OgorCQl0bXAgPSBudl9yZDMyKGRldiwgTlYxMF9QRkJfQ0xPU0VfUEFHRTIpOworCQludl93cjMyKGRldiwgTlYxMF9QRkJfQ0xPU0VfUEFHRTIsIHRtcCAmIH4oMSA8PCAxNSkpOworCQludW1fdGlsZXMgPSBOVjEwX1BGQl9USUxFX19TSVpFOworCQlicmVhazsKKwljYXNlIDB4NDY6IC8qIEc3MiAqLworCWNhc2UgMHg0NzogLyogRzcwICovCisJY2FzZSAweDQ5OiAvKiBHNzEgKi8KKwljYXNlIDB4NGI6IC8qIEc3MyAqLworCWNhc2UgMHg0YzogLyogQzUxIChHN1ggdmVyc2lvbikgKi8KKwkJbnVtX3RpbGVzID0gTlY0MF9QRkJfVElMRV9fU0laRV8xOworCQlicmVhazsKKwlkZWZhdWx0OgorCQludW1fdGlsZXMgPSBOVjQwX1BGQl9USUxFX19TSVpFXzA7CisJCWJyZWFrOworCX0KKworCWZiX2Jhcl9zaXplID0gZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCAwKSAtIDE7CisJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgeworCWNhc2UgMHg0MDoKKwkJZm9yIChpID0gMDsgaSA8IG51bV90aWxlczsgaSsrKSB7CisJCQludl93cjMyKGRldiwgTlYxMF9QRkJfVElMRShpKSwgMCk7CisJCQludl93cjMyKGRldiwgTlYxMF9QRkJfVExJTUlUKGkpLCBmYl9iYXJfc2l6ZSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZm9yIChpID0gMDsgaSA8IG51bV90aWxlczsgaSsrKSB7CisJCQludl93cjMyKGRldiwgTlY0MF9QRkJfVElMRShpKSwgMCk7CisJCQludl93cjMyKGRldiwgTlY0MF9QRkJfVExJTUlUKGkpLCBmYl9iYXJfc2l6ZSk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252NDBfZmJfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfZmlmby5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9maWZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmMTljYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfZmlmby5jCkBAIC0wLDAgKzEsMzE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEJlbiBTa2VnZ3MuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKKworI2RlZmluZSBOVjQwX1JBTUZDKGMpIChkZXZfcHJpdi0+cmFtZmNfb2Zmc2V0ICsgKChjKSAqIE5WNDBfUkFNRkNfX1NJWkUpKQorI2RlZmluZSBOVjQwX1JBTUZDX19TSVpFIDEyOAorCitpbnQKK252NDBfZmlmb19jcmVhdGVfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBmYyA9IE5WNDBfUkFNRkMoY2hhbi0+aWQpOworCWludCByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfZmFrZShkZXYsIE5WNDBfUkFNRkMoY2hhbi0+aWQpLCB+MCwKKwkJCQkgICAgICBOVjQwX1JBTUZDX19TSVpFLCBOVk9CSl9GTEFHX1pFUk9fQUxMT0MgfAorCQkJCSAgICAgIE5WT0JKX0ZMQUdfWkVST19GUkVFLCBOVUxMLCAmY2hhbi0+cmFtZmMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKwludl93aTMyKGRldiwgZmMgKyAgMCwgY2hhbi0+cHVzaGJ1Zl9iYXNlKTsKKwludl93aTMyKGRldiwgZmMgKyAgNCwgY2hhbi0+cHVzaGJ1Zl9iYXNlKTsKKwludl93aTMyKGRldiwgZmMgKyAxMiwgY2hhbi0+cHVzaGJ1Zi0+aW5zdGFuY2UgPj4gNCk7CisJbnZfd2kzMihkZXYsIGZjICsgMjQsIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR18xMjhfQllURVMgfAorCQkJICAgICAgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9TSVpFXzEyOF9CWVRFUyB8CisJCQkgICAgICBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX01BWF9SRVFTXzggfAorI2lmZGVmIF9fQklHX0VORElBTgorCQkJICAgICAgTlZfUEZJRk9fQ0FDSEUxX0JJR19FTkRJQU4gfAorI2VuZGlmCisJCQkgICAgICAweDMwMDAwMDAwIC8qIG5vIGlkZWEuLiAqLyk7CisJbnZfd2kzMihkZXYsIGZjICsgNTYsIGNoYW4tPnJhbWluX2dyY3R4LT5pbnN0YW5jZSA+PiA0KTsKKwludl93aTMyKGRldiwgZmMgKyA2MCwgMHgwMDAxRkZGRik7CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKworCS8qIGVuYWJsZSB0aGUgZmlmbyBkbWEgb3BlcmF0aW9uICovCisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSwKKwkJbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSkgfCAoMSA8PCBjaGFuLT5pZCkpOworCXJldHVybiAwOworfQorCit2b2lkCitudjQwX2ZpZm9fZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX01PREUsCisJCW52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX01PREUpICYgfigxIDw8IGNoYW4tPmlkKSk7CisKKwlpZiAoY2hhbi0+cmFtZmMpCisJCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoZGV2LCAmY2hhbi0+cmFtZmMpOworfQorCitzdGF0aWMgdm9pZAorbnY0MF9maWZvX2RvX2xvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2hpZCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IGZjID0gTlY0MF9SQU1GQyhjaGlkKSwgdG1wLCB0bXAyOworCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgZmFsc2UpOworCisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVQsIG52X3JpMzIoZGV2LCBmYyArIDApKTsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0dFVCwgbnZfcmkzMihkZXYsIGZjICsgNCkpOworCW52X3dyMzIoZGV2LCBOVjEwX1BGSUZPX0NBQ0hFMV9SRUZfQ05ULCBudl9yaTMyKGRldiwgZmMgKyA4KSk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9JTlNUQU5DRSwgbnZfcmkzMihkZXYsIGZjICsgMTIpKTsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0RDT1VOVCwgbnZfcmkzMihkZXYsIGZjICsgMTYpKTsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1NUQVRFLCBudl9yaTMyKGRldiwgZmMgKyAyMCkpOworCisJLyogTm8gaWRlYSB3aGF0IDB4MjA1OCBpcy4uICovCisJdG1wICAgPSBudl9yaTMyKGRldiwgZmMgKyAyNCk7CisJdG1wMiAgPSBudl9yZDMyKGRldiwgMHgyMDU4KSAmIDB4RkZGOworCXRtcDIgfD0gKHRtcCAmIDB4MzAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDIwNTgsIHRtcDIpOworCXRtcCAgJj0gfjB4MzAwMDAwMDA7CisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSCwgdG1wKTsKKworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9FTkdJTkUsIG52X3JpMzIoZGV2LCBmYyArIDI4KSk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX1BVTEwxLCBudl9yaTMyKGRldiwgZmMgKyAzMikpOworCW52X3dyMzIoZGV2LCBOVjEwX1BGSUZPX0NBQ0hFMV9BQ1FVSVJFX1ZBTFVFLCBudl9yaTMyKGRldiwgZmMgKyAzNikpOworCXRtcCA9IG52X3JpMzIoZGV2LCBmYyArIDQwKTsKKwludl93cjMyKGRldiwgTlYxMF9QRklGT19DQUNIRTFfQUNRVUlSRV9USU1FU1RBTVAsIHRtcCk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX0FDUVVJUkVfVElNRU9VVCwgbnZfcmkzMihkZXYsIGZjICsgNDQpKTsKKwludl93cjMyKGRldiwgTlYxMF9QRklGT19DQUNIRTFfU0VNQVBIT1JFLCBudl9yaTMyKGRldiwgZmMgKyA0OCkpOworCW52X3dyMzIoZGV2LCBOVjEwX1BGSUZPX0NBQ0hFMV9ETUFfU1VCUk9VVElORSwgbnZfcmkzMihkZXYsIGZjICsgNTIpKTsKKwludl93cjMyKGRldiwgTlY0MF9QRklGT19HUkNUWF9JTlNUQU5DRSwgbnZfcmkzMihkZXYsIGZjICsgNTYpKTsKKworCS8qIERvbid0IGNsb2JiZXIgdGhlIFRJTUVPVVRfRU5BQkxFRCBmbGFnIHdoZW4gcmVzdG9yaW5nIGZyb20gUkFNRkMgKi8KKwl0bXAgID0gbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fRE1BX1RJTUVTTElDRSkgJiB+MHgxRkZGRjsKKwl0bXAgfD0gbnZfcmkzMihkZXYsIGZjICsgNjApICYgMHgxRkZGRjsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19ETUFfVElNRVNMSUNFLCB0bXApOworCisJbnZfd3IzMihkZXYsIDB4MzJlNCwgbnZfcmkzMihkZXYsIGZjICsgNjQpKTsKKwkvKiBOVklESUEgZG9lcyB0aGlzIG5leHQgbGluZSB0d2ljZS4uLiAqLworCW52X3dyMzIoZGV2LCAweDMyZTgsIG52X3JpMzIoZGV2LCBmYyArIDY4KSk7CisJbnZfd3IzMihkZXYsIDB4MjA4OCwgbnZfcmkzMihkZXYsIGZjICsgNzYpKTsKKwludl93cjMyKGRldiwgMHgzMzAwLCBudl9yaTMyKGRldiwgZmMgKyA4MCkpOworCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9HRVQsIDApOworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVQsIDApOworfQorCitpbnQKK252NDBfZmlmb19sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXVpbnQzMl90IHRtcDsKKworCW52NDBfZmlmb19kb19sb2FkX2NvbnRleHQoZGV2LCBjaGFuLT5pZCk7CisKKwkvKiBTZXQgY2hhbm5lbCBhY3RpdmUsIGFuZCBpbiBETUEgbW9kZSAqLworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMSwKKwkJICAgICBOVjQwX1BGSUZPX0NBQ0hFMV9QVVNIMV9ETUEgfCBjaGFuLT5pZCk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVNILCAxKTsKKworCS8qIFJlc2V0IERNQV9DVExfQVRfSU5GTyB0byBJTlZBTElEICovCisJdG1wID0gbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9DVEwpICYgfigxIDw8IDMxKTsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0NUTCwgdG1wKTsKKworCXJldHVybiAwOworfQorCitpbnQKK252NDBfZmlmb191bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZmlmb19lbmdpbmUgKnBmaWZvID0gJmRldl9wcml2LT5lbmdpbmUuZmlmbzsKKwl1aW50MzJfdCBmYywgdG1wOworCWludCBjaGlkOworCisJY2hpZCA9IHBmaWZvLT5jaGFubmVsX2lkKGRldik7CisJaWYgKGNoaWQgPCAwIHx8IGNoaWQgPj0gZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzKQorCQlyZXR1cm4gMDsKKwlmYyA9IE5WNDBfUkFNRkMoY2hpZCk7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKwludl93aTMyKGRldiwgZmMgKyAwLCBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVVCkpOworCW52X3dpMzIoZGV2LCBmYyArIDQsIG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfR0VUKSk7CisJbnZfd2kzMihkZXYsIGZjICsgOCwgbnZfcmQzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX1JFRl9DTlQpKTsKKwludl93aTMyKGRldiwgZmMgKyAxMiwgbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9JTlNUQU5DRSkpOworCW52X3dpMzIoZGV2LCBmYyArIDE2LCBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0RDT1VOVCkpOworCW52X3dpMzIoZGV2LCBmYyArIDIwLCBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1NUQVRFKSk7CisJdG1wICA9IG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0gpOworCXRtcCB8PSBudl9yZDMyKGRldiwgMHgyMDU4KSAmIDB4MzAwMDAwMDA7CisJbnZfd2kzMihkZXYsIGZjICsgMjQsIHRtcCk7CisJbnZfd2kzMihkZXYsIGZjICsgMjgsIG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9FTkdJTkUpKTsKKwludl93aTMyKGRldiwgZmMgKyAzMiwgbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX1BVTEwxKSk7CisJbnZfd2kzMihkZXYsIGZjICsgMzYsIG52X3JkMzIoZGV2LCBOVjEwX1BGSUZPX0NBQ0hFMV9BQ1FVSVJFX1ZBTFVFKSk7CisJdG1wID0gbnZfcmQzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX0FDUVVJUkVfVElNRVNUQU1QKTsKKwludl93aTMyKGRldiwgZmMgKyA0MCwgdG1wKTsKKwludl93aTMyKGRldiwgZmMgKyA0NCwgbnZfcmQzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX0FDUVVJUkVfVElNRU9VVCkpOworCW52X3dpMzIoZGV2LCBmYyArIDQ4LCBudl9yZDMyKGRldiwgTlYxMF9QRklGT19DQUNIRTFfU0VNQVBIT1JFKSk7CisJLyogTlZJRElBIHJlYWQgMHgzMjI4IGZpcnN0LCB0aGVuIHdyaXRlIERNQV9HRVQgaGVyZS4uIG1heWJlIHNvbWV0aGluZworCSAqIG1vcmUgaW52b2x2ZWQgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiAweDMyMjg/CisJICovCisJbnZfd2kzMihkZXYsIGZjICsgNTIsIG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfR0VUKSk7CisJbnZfd2kzMihkZXYsIGZjICsgNTYsIG52X3JkMzIoZGV2LCBOVjQwX1BGSUZPX0dSQ1RYX0lOU1RBTkNFKSk7CisJbnZfd2kzMihkZXYsIGZjICsgNjAsIG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0RNQV9USU1FU0xJQ0UpICYgMHgxZmZmZik7CisJLyogTm8gaWRlYSB3aGF0IHRoZSBiZWxvdyBpcyBmb3IgZXhhY3RseSwgcmlwcGVkIGZyb20gYSBtbWlvLXRyYWNlICovCisJbnZfd2kzMihkZXYsIGZjICsgNjQsIG52X3JkMzIoZGV2LCBOVjQwX1BGSUZPX1VOSzMyRTQpKTsKKwkvKiBOVklESUEgZG8gdGhpcyBuZXh0IGxpbmUgdHdpY2UuLiBidWc/ICovCisJbnZfd2kzMihkZXYsIGZjICsgNjgsIG52X3JkMzIoZGV2LCAweDMyZTgpKTsKKwludl93aTMyKGRldiwgZmMgKyA3NiwgbnZfcmQzMihkZXYsIDB4MjA4OCkpOworCW52X3dpMzIoZGV2LCBmYyArIDgwLCBudl9yZDMyKGRldiwgMHgzMzAwKSk7CisjaWYgMCAvKiBubyByZWFsIGlkZWEgd2hpY2ggaXMgUFVUL0dFVCBpbiBVTktfNDguLiAqLworCXRtcCAgPSBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfR0VUKTsKKwl0bXAgfD0gKG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9QVVQpIDw8IDE2KTsKKwludl93aTMyKGRldiwgZmMgKyA3MiwgdG1wKTsKKyNlbmRpZgorCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisKKwludjQwX2ZpZm9fZG9fbG9hZF9jb250ZXh0KGRldiwgcGZpZm8tPmNoYW5uZWxzIC0gMSk7CisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gxLAorCQkgICAgIE5WNDBfUEZJRk9fQ0FDSEUxX1BVU0gxX0RNQSB8IChwZmlmby0+Y2hhbm5lbHMgLSAxKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitudjQwX2ZpZm9faW5pdF9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWludCBpOworCisJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwKKwkJbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgJiB+TlZfUE1DX0VOQUJMRV9QRklGTyk7CisJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwKKwkJbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgfCAgTlZfUE1DX0VOQUJMRV9QRklGTyk7CisKKwludl93cjMyKGRldiwgMHgwMDMyMjQsIDB4MDAwZjAwNzgpOworCW52X3dyMzIoZGV2LCAweDAwMzIxMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MDAzMjcwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMDMyNDAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwMzI0NCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MDAzMjU4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMDI1MDQsIDB4MDAwMDAwMDApOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQludl93cjMyKGRldiwgMHgwMDI1MTAgKyAoaSAqIDQpLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMDI1MGMsIDB4MDAwMGZmZmYpOworCW52X3dyMzIoZGV2LCAweDAwMjA0OCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MDAzMjI4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMDMyZTgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwMjQxMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MDAyNDIwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMDIwNTgsIDB4MDAwMDAwMDEpOworCW52X3dyMzIoZGV2LCAweDAwMjIxYywgMHgwMDAwMDAwMCk7CisJLyogc29tZXRoaW5nIHdpdGggMHgyMDg0LCByZWFkL21vZGlmeS93cml0ZSwgbm8gY2hhbmdlICovCisJbnZfd3IzMihkZXYsIDB4MDAyMDQwLCAweDAwMDAwMGZmKTsKKwludl93cjMyKGRldiwgMHgwMDI1MDAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwMzIwMCwgMHgwMDAwMDAwMCk7CisKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19ETUFfVElNRVNMSUNFLCAweDIxMDFmZmZmKTsKK30KKworc3RhdGljIHZvaWQKK252NDBfZmlmb19pbml0X3JhbXh4KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX1JBTUhULCAoMHgwMyA8PCAyNCkgLyogc2VhcmNoIDEyOCAqLyB8CisJCQkJICAgICAgICgoZGV2X3ByaXYtPnJhbWh0X2JpdHMgLSA5KSA8PCAxNikgfAorCQkJCSAgICAgICAoZGV2X3ByaXYtPnJhbWh0X29mZnNldCA+PiA4KSk7CisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fUkFNUk8sIGRldl9wcml2LT5yYW1yb19vZmZzZXQ+PjgpOworCisJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgeworCWNhc2UgMHg0NzoKKwljYXNlIDB4NDk6CisJY2FzZSAweDRiOgorCQludl93cjMyKGRldiwgMHgyMjMwLCAxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgeworCWNhc2UgMHg0MDoKKwljYXNlIDB4NDE6CisJY2FzZSAweDQyOgorCWNhc2UgMHg0MzoKKwljYXNlIDB4NDU6CisJY2FzZSAweDQ3OgorCWNhc2UgMHg0ODoKKwljYXNlIDB4NDk6CisJY2FzZSAweDRiOgorCQludl93cjMyKGRldiwgTlY0MF9QRklGT19SQU1GQywgMHgzMDAwMik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW52X3dyMzIoZGV2LCAweDIyMzAsIDApOworCQludl93cjMyKGRldiwgTlY0MF9QRklGT19SQU1GQywKKwkJCSgobm91dmVhdV9tZW1fZmJfYW1vdW50KGRldikgLSA1MTIgKiAxMDI0ICsKKwkJCSAgZGV2X3ByaXYtPnJhbWZjX29mZnNldCkgPj4gMTYpIHwgKDMgPDwgMTYpKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAorbnY0MF9maWZvX2luaXRfaW50cihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCW52X3dyMzIoZGV2LCAweDAwMjEwMCwgMHhmZmZmZmZmZik7CisJbnZfd3IzMihkZXYsIDB4MDAyMTQwLCAweGZmZmZmZmZmKTsKK30KKworaW50CitudjQwX2ZpZm9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZmlmb19lbmdpbmUgKnBmaWZvID0gJmRldl9wcml2LT5lbmdpbmUuZmlmbzsKKwlpbnQgaTsKKworCW52NDBfZmlmb19pbml0X3Jlc2V0KGRldik7CisJbnY0MF9maWZvX2luaXRfcmFteHgoZGV2KTsKKworCW52NDBfZmlmb19kb19sb2FkX2NvbnRleHQoZGV2LCBwZmlmby0+Y2hhbm5lbHMgLSAxKTsKKwludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDEsIHBmaWZvLT5jaGFubmVscyAtIDEpOworCisJbnY0MF9maWZvX2luaXRfaW50cihkZXYpOworCXBmaWZvLT5lbmFibGUoZGV2KTsKKwlwZmlmby0+cmVhc3NpZ24oZGV2LCB0cnVlKTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHM7IGkrKykgeworCQlpZiAoZGV2X3ByaXYtPmZpZm9zW2ldKSB7CisJCQl1aW50MzJfdCBtb2RlID0gbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSk7CisJCQludl93cjMyKGRldiwgTlYwNF9QRklGT19NT0RFLCBtb2RlIHwgKDEgPDwgaSkpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX2dyYXBoLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX2dyYXBoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNlMGEyYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfZ3JhcGguYwpAQCAtMCwwICsxLDU2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBCZW4gU2tlZ2dzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NDAuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NDAuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NDEuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NDEuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NDIuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NDIuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NDMuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NDMuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NDQuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NDQuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NDYuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NDYuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NDcuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NDcuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NDkuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NDkuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NGEuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NGEuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NGIuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NGIuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NGMuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NGMuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NGUuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NGUuY3R4dmFscyIpOworCitzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoKK252NDBfZ3JhcGhfY2hhbm5lbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgaW5zdDsKKwlpbnQgaTsKKworCWluc3QgPSBudl9yZDMyKGRldiwgTlY0MF9QR1JBUEhfQ1RYQ1RMX0NVUik7CisJaWYgKCEoaW5zdCAmIE5WNDBfUEdSQVBIX0NUWENUTF9DVVJfTE9BREVEKSkKKwkJcmV0dXJuIE5VTEw7CisJaW5zdCA9IChpbnN0ICYgTlY0MF9QR1JBUEhfQ1RYQ1RMX0NVUl9JTlNUQU5DRSkgPDwgNDsKKworCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHM7IGkrKykgeworCQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmZpZm9zW2ldOworCisJCWlmIChjaGFuICYmIGNoYW4tPnJhbWluX2dyY3R4ICYmCisJCSAgICBjaGFuLT5yYW1pbl9ncmN0eC0+aW5zdGFuY2UgPT0gaW5zdCkKKwkJCXJldHVybiBjaGFuOworCX0KKworCXJldHVybiBOVUxMOworfQorCitpbnQKK252NDBfZ3JhcGhfY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpjdHg7CisJaW50IHJldDsKKworCS8qIEFsbG9jYXRlIGEgMTc1S2lCIGJsb2NrIG9mIFBSQU1JTiB0byBzdG9yZSB0aGUgY29udGV4dC4gIFRoaXMKKwkgKiBpcyBtYXNzaXZlIG92ZXJraWxsIGZvciBhIGxvdCBvZiBjaGlwc2V0cywgYnV0IGl0IHNob3VsZCBiZSBzYWZlCisJICogdW50aWwgd2UncmUgYWJsZSB0byBpbXBsZW1lbnQgdGhpcyBwcm9wZXJseSAod2lsbCBoYXBwZW4gYXQgbW9yZQorCSAqIG9yIGxlc3MgdGhlIHNhbWUgdGltZSB3ZSdyZSBhYmxlIHRvIHdyaXRlIG91ciBvd24gY29udGV4dCBwcm9ncmFtcy4KKwkgKi8KKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfcmVmKGRldiwgY2hhbiwgTlVMTCwgMCwgMTc1KjEwMjQsIDE2LAorCQkJCQkgIE5WT0JKX0ZMQUdfWkVST19BTExPQywKKwkJCQkJICAmY2hhbi0+cmFtaW5fZ3JjdHgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJY3R4ID0gY2hhbi0+cmFtaW5fZ3JjdHgtPmdwdW9iajsKKworCS8qIEluaXRpYWxpc2UgZGVmYXVsdCBjb250ZXh0IHZhbHVlcyAqLworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCW52NDBfZ3JjdHhfdmFsc19sb2FkKGRldiwgY3R4KTsKKwludl93bzMyKGRldiwgY3R4LCAwLCBjdHgtPmltX3ByYW1pbi0+c3RhcnQpOworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnY0MF9ncmFwaF9kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGNoYW4tPmRldiwgJmNoYW4tPnJhbWluX2dyY3R4KTsKK30KKworc3RhdGljIGludAorbnY0MF9ncmFwaF90cmFuc2Zlcl9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IGluc3QsIGludCBzYXZlKQoreworCXVpbnQzMl90IG9sZF9jcCwgdHYgPSAxMDAwLCB0bXA7CisJaW50IGk7CisKKwlvbGRfY3AgPSBudl9yZDMyKGRldiwgTlYyMF9QR1JBUEhfQ0hBTk5FTF9DVFhfUE9JTlRFUik7CisJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX0NIQU5ORUxfQ1RYX1BPSU5URVIsIGluc3QpOworCisJdG1wICA9IG52X3JkMzIoZGV2LCBOVjQwX1BHUkFQSF9DVFhDVExfMDMxMCk7CisJdG1wIHw9IHNhdmUgPyBOVjQwX1BHUkFQSF9DVFhDVExfMDMxMF9YRkVSX1NBVkUgOgorCQkgICAgICBOVjQwX1BHUkFQSF9DVFhDVExfMDMxMF9YRkVSX0xPQUQ7CisJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF8wMzEwLCB0bXApOworCisJdG1wICA9IG52X3JkMzIoZGV2LCBOVjQwX1BHUkFQSF9DVFhDVExfMDMwNCk7CisJdG1wIHw9IE5WNDBfUEdSQVBIX0NUWENUTF8wMzA0X1hGRVJfQ1RYOworCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9DVFhDVExfMDMwNCwgdG1wKTsKKworCW5vdXZlYXVfd2FpdF9mb3JfaWRsZShkZXYpOworCisJZm9yIChpID0gMDsgaSA8IHR2OyBpKyspIHsKKwkJaWYgKG52X3JkMzIoZGV2LCBOVjQwX1BHUkFQSF9DVFhDVExfMDMwQykgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9DSEFOTkVMX0NUWF9QT0lOVEVSLCBvbGRfY3ApOworCisJaWYgKGkgPT0gdHYpIHsKKwkJdWludDMyX3QgdWNzdGF0ID0gbnZfcmQzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF9VQ09ERV9TVEFUKTsKKwkJTlZfRVJST1IoZGV2LCAiRmFpbGVkOiBJbnN0YW5jZT0weCUwOHggU2F2ZT0lZFxuIiwgaW5zdCwgc2F2ZSk7CisJCU5WX0VSUk9SKGRldiwgIklQOiAweCUwMngsIE9wY29kZTogMHglMDh4XG4iLAorCQkJIHVjc3RhdCA+PiBOVjQwX1BHUkFQSF9DVFhDVExfVUNPREVfU1RBVF9JUF9TSElGVCwKKwkJCSB1Y3N0YXQgICYgTlY0MF9QR1JBUEhfQ1RYQ1RMX1VDT0RFX1NUQVRfT1BfTUFTSyk7CisJCU5WX0VSUk9SKGRldiwgIjB4NDAwMzBDID0gMHglMDh4XG4iLAorCQkJIG52X3JkMzIoZGV2LCBOVjQwX1BHUkFQSF9DVFhDVExfMDMwQykpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJldHVybiAwOworfQorCisvKiBSZXN0b3JlIHRoZSBjb250ZXh0IGZvciBhIHNwZWNpZmljIGNoYW5uZWwgaW50byBQR1JBUEggKi8KK2ludAorbnY0MF9ncmFwaF9sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXVpbnQzMl90IGluc3Q7CisJaW50IHJldDsKKworCWlmICghY2hhbi0+cmFtaW5fZ3JjdHgpCisJCXJldHVybiAtRUlOVkFMOworCWluc3QgPSBjaGFuLT5yYW1pbl9ncmN0eC0+aW5zdGFuY2UgPj4gNDsKKworCXJldCA9IG52NDBfZ3JhcGhfdHJhbnNmZXJfY29udGV4dChkZXYsIGluc3QsIDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiAweDQwMDMyQywgbm8gaWRlYSBvZiBpdCdzIGV4YWN0IGZ1bmN0aW9uLiAgQ291bGQgc2ltcGx5IGJlIGEKKwkgKiByZWNvcmQgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgUEdSQVBIIGNvbnRleHQuICBJdCdzIGN1cnJlbnRseQorCSAqIHVua25vd24gYXMgdG8gd2hhdCBiaXQgMjQgZG9lcy4gIFRoZSBudiBkZHggaGFzIGl0IHNldCwgc28gd2Ugd2lsbAorCSAqIHNldCBpdCBoZXJlIHRvby4KKwkgKi8KKwludl93cjMyKGRldiwgTlYyMF9QR1JBUEhfQ0hBTk5FTF9DVFhfUE9JTlRFUiwgaW5zdCk7CisJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF9DVVIsCisJCSAoaW5zdCAmIE5WNDBfUEdSQVBIX0NUWENUTF9DVVJfSU5TVEFOQ0UpIHwKKwkJICBOVjQwX1BHUkFQSF9DVFhDVExfQ1VSX0xPQURFRCk7CisJLyogMHgzMkUwIHJlY29yZHMgdGhlIGluc3RhbmNlIGFkZHJlc3Mgb2YgdGhlIGFjdGl2ZSBGSUZPJ3MgUEdSQVBICisJICogY29udGV4dC4gIElmIGF0IGFueSB0aW1lIHRoaXMgZG9lc24ndCBtYXRjaCAweDQwMDMyQywgeW91IHdpbGwKKwkgKiByZWNpZXZlIFBHUkFQSF9JTlRSX0NPTlRFWFRfU1dJVENICisJICovCisJbnZfd3IzMihkZXYsIE5WNDBfUEZJRk9fR1JDVFhfSU5TVEFOQ0UsIGluc3QpOworCXJldHVybiAwOworfQorCitpbnQKK252NDBfZ3JhcGhfdW5sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwl1aW50MzJfdCBpbnN0OworCWludCByZXQ7CisKKwlpbnN0ID0gbnZfcmQzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF9DVVIpOworCWlmICghKGluc3QgJiBOVjQwX1BHUkFQSF9DVFhDVExfQ1VSX0xPQURFRCkpCisJCXJldHVybiAwOworCWluc3QgJj0gTlY0MF9QR1JBUEhfQ1RYQ1RMX0NVUl9JTlNUQU5DRTsKKworCXJldCA9IG52NDBfZ3JhcGhfdHJhbnNmZXJfY29udGV4dChkZXYsIGluc3QsIDEpOworCisJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF9DVVIsIGluc3QpOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBub3V2ZWF1X2N0eHByb2cgeworCXVpbnQzMl90IHNpZ25hdHVyZTsKKwl1aW50OF90ICB2ZXJzaW9uOworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50MzJfdCBkYXRhW107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG5vdXZlYXVfY3R4dmFscyB7CisJdWludDMyX3Qgc2lnbmF0dXJlOworCXVpbnQ4X3QgIHZlcnNpb247CisJdWludDMyX3QgbGVuZ3RoOworCXN0cnVjdCB7CisJCXVpbnQzMl90IG9mZnNldDsKKwkJdWludDMyX3QgdmFsdWU7CisJfSBkYXRhW107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworaW50CitudjQwX2dyY3R4X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOworCWNvbnN0IGludCBjaGlwc2V0ID0gZGV2X3ByaXYtPmNoaXBzZXQ7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwljb25zdCBzdHJ1Y3Qgbm91dmVhdV9jdHhwcm9nICpjcDsKKwljb25zdCBzdHJ1Y3Qgbm91dmVhdV9jdHh2YWxzICpjdjsKKwljaGFyIG5hbWVbMzJdOworCWludCByZXQsIGk7CisKKwlwZ3JhcGgtPmFjY2VsX2Jsb2NrZWQgPSB0cnVlOworCisJaWYgKCFwZ3JhcGgtPmN0eHByb2cpIHsKKwkJc3ByaW50ZihuYW1lLCAibm91dmVhdS9udiUwMnguY3R4cHJvZyIsIGNoaXBzZXQpOworCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgbmFtZSwgJmRldi0+cGRldi0+ZGV2KTsKKwkJaWYgKHJldCkgeworCQkJTlZfRVJST1IoZGV2LCAiTm8gY3R4cHJvZyBmb3IgTlYlMDJ4XG4iLCBjaGlwc2V0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlwZ3JhcGgtPmN0eHByb2cgPSBrbWFsbG9jKGZ3LT5zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwZ3JhcGgtPmN0eHByb2cpIHsKKwkJCU5WX0VSUk9SKGRldiwgIk9PTSBjb3B5aW5nIGN0eHByb2dcbiIpOworCQkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltZW1jcHkocGdyYXBoLT5jdHhwcm9nLCBmdy0+ZGF0YSwgZnctPnNpemUpOworCisJCWNwID0gcGdyYXBoLT5jdHhwcm9nOworCQlpZiAoY3AtPnNpZ25hdHVyZSAhPSAweDUwNDM1NjRlIHx8IGNwLT52ZXJzaW9uICE9IDAgfHwKKwkJICAgIGNwLT5sZW5ndGggIT0gKChmdy0+c2l6ZSAtIDcpIC8gNCkpIHsKKwkJCU5WX0VSUk9SKGRldiwgImN0eHByb2cgaW52YWxpZFxuIik7CisJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJCW52NDBfZ3JjdHhfZmluaShkZXYpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJfQorCisJaWYgKCFwZ3JhcGgtPmN0eHZhbHMpIHsKKwkJc3ByaW50ZihuYW1lLCAibm91dmVhdS9udiUwMnguY3R4dmFscyIsIGNoaXBzZXQpOworCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgbmFtZSwgJmRldi0+cGRldi0+ZGV2KTsKKwkJaWYgKHJldCkgeworCQkJTlZfRVJST1IoZGV2LCAiTm8gY3R4dmFscyBmb3IgTlYlMDJ4XG4iLCBjaGlwc2V0KTsKKwkJCW52NDBfZ3JjdHhfZmluaShkZXYpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXBncmFwaC0+Y3R4dmFscyA9IGttYWxsb2MoZnctPnNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXBncmFwaC0+Y3R4cHJvZykgeworCQkJTlZfRVJST1IoZGV2LCAiT09NIGNvcHlpbmcgY3R4cHJvZ1xuIik7CisJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJCW52NDBfZ3JjdHhfZmluaShkZXYpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbWVtY3B5KHBncmFwaC0+Y3R4dmFscywgZnctPmRhdGEsIGZ3LT5zaXplKTsKKworCQljdiA9ICh2b2lkICopcGdyYXBoLT5jdHh2YWxzOworCQlpZiAoY3YtPnNpZ25hdHVyZSAhPSAweDU2NDM1NjRlIHx8IGN2LT52ZXJzaW9uICE9IDAgfHwKKwkJICAgIGN2LT5sZW5ndGggIT0gKChmdy0+c2l6ZSAtIDkpIC8gOCkpIHsKKwkJCU5WX0VSUk9SKGRldiwgImN0eHZhbHMgaW52YWxpZFxuIik7CisJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJCW52NDBfZ3JjdHhfZmluaShkZXYpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJfQorCisJY3AgPSBwZ3JhcGgtPmN0eHByb2c7CisKKwludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfQ1RYQ1RMX1VDT0RFX0lOREVYLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgY3AtPmxlbmd0aDsgaSsrKQorCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfQ1RYQ1RMX1VDT0RFX0RBVEEsIGNwLT5kYXRhW2ldKTsKKworCXBncmFwaC0+YWNjZWxfYmxvY2tlZCA9IGZhbHNlOworCXJldHVybiAwOworfQorCit2b2lkCitudjQwX2dyY3R4X2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOworCisJaWYgKHBncmFwaC0+Y3R4cHJvZykgeworCQlrZnJlZShwZ3JhcGgtPmN0eHByb2cpOworCQlwZ3JhcGgtPmN0eHByb2cgPSBOVUxMOworCX0KKworCWlmIChwZ3JhcGgtPmN0eHZhbHMpIHsKKwkJa2ZyZWUocGdyYXBoLT5jdHhwcm9nKTsKKwkJcGdyYXBoLT5jdHh2YWxzID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQKK252NDBfZ3JjdHhfdmFsc19sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqY3R4KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisJc3RydWN0IG5vdXZlYXVfY3R4dmFscyAqY3YgPSBwZ3JhcGgtPmN0eHZhbHM7CisJaW50IGk7CisKKwlpZiAoIWN2KQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgY3YtPmxlbmd0aDsgaSsrKQorCQludl93bzMyKGRldiwgY3R4LCBjdi0+ZGF0YVtpXS5vZmZzZXQsIGN2LT5kYXRhW2ldLnZhbHVlKTsKK30KKworLyoKKyAqIEc3MAkJMHg0NworICogRzcxCQkweDQ5CisgKiBOVjQ1CQkweDQ4CisgKiBHNzJbTV0JMHg0NgorICogRzczCQkweDRiCisgKiBDNTFfRzdYCTB4NGMKKyAqIEM1MQkJMHg0ZQorICovCitpbnQKK252NDBfZ3JhcGhfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9CisJCShzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqKWRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgdnJhbXN6LCB0bXA7CisJaW50IGksIGo7CisKKwludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLCBudl9yZDMyKGRldiwgTlYwM19QTUNfRU5BQkxFKSAmCisJCQl+TlZfUE1DX0VOQUJMRV9QR1JBUEgpOworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsIG52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpIHwKKwkJCSBOVl9QTUNfRU5BQkxFX1BHUkFQSCk7CisKKwludjQwX2dyY3R4X2luaXQoZGV2KTsKKworCS8qIE5vIGNvbnRleHQgcHJlc2VudCBjdXJyZW50bHkgKi8KKwludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfQ1RYQ1RMX0NVUiwgMHgwMDAwMDAwMCk7CisKKwludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiAgICwgMHhGRkZGRkZGRik7CisJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0lOVFJfRU4sIDB4RkZGRkZGRkYpOworCisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0RFQlVHXzAsIDB4RkZGRkZGRkYpOworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9ERUJVR18wLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMSwgMHg0MDEyODdjMCk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0RFQlVHXzMsIDB4ZTBkZTgwNTUpOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9ERUJVR180LCAweDAwMDA4MDAwKTsKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfTElNSVRfVklPTF9QSVgsIDB4MDBiZTNjNWYpOworCisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0NUWF9DT05UUk9MLCAweDEwMDEwMTAwKTsKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfU1RBVEUgICAgICAsIDB4RkZGRkZGRkYpOworCisJaiA9IG52X3JkMzIoZGV2LCAweDE1NDApICYgMHhmZjsKKwlpZiAoaikgeworCQlmb3IgKGkgPSAwOyAhKGogJiAxKTsgaiA+Pj0gMSwgaSsrKQorCQkJOworCQludl93cjMyKGRldiwgMHg0MDUwMDAsIGkpOworCX0KKworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDQwKSB7CisJCW52X3dyMzIoZGV2LCAweDQwMDliMCwgMHg4MzI4MGZmZik7CisJCW52X3dyMzIoZGV2LCAweDQwMDliNCwgMHgwMDAwMDBhMCk7CisJfSBlbHNlIHsKKwkJbnZfd3IzMihkZXYsIDB4NDAwODIwLCAweDgzMjgwZWZmKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwODI0LCAweDAwMDAwMGEwKTsKKwl9CisKKwlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7CisJY2FzZSAweDQwOgorCWNhc2UgMHg0NToKKwkJbnZfd3IzMihkZXYsIDB4NDAwOWI4LCAweDAwNzhlMzY2KTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwOWJjLCAweDAwMDAwMTRjKTsKKwkJYnJlYWs7CisJY2FzZSAweDQxOgorCWNhc2UgMHg0MjogLyogcGNpaWQgYWxzbyAweDAwQ3ggKi8KKwkvKiBjYXNlIDB4MDEyMDogWFhYIChwY2lpZCkgKi8KKwkJbnZfd3IzMihkZXYsIDB4NDAwODI4LCAweDAwNzU5NmZmKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwODJjLCAweDAwMDAwMTA4KTsKKwkJYnJlYWs7CisJY2FzZSAweDQzOgorCQludl93cjMyKGRldiwgMHg0MDA4MjgsIDB4MDA3MmNiNzcpOworCQludl93cjMyKGRldiwgMHg0MDA4MmMsIDB4MDAwMDAxMDgpOworCQlicmVhazsKKwljYXNlIDB4NDQ6CisJY2FzZSAweDQ2OiAvKiBHNzIgKi8KKwljYXNlIDB4NGE6CisJY2FzZSAweDRjOiAvKiBHN3gtYmFzZWQgQzUxICovCisJY2FzZSAweDRlOgorCQludl93cjMyKGRldiwgMHg0MDA4NjAsIDApOworCQludl93cjMyKGRldiwgMHg0MDA4NjQsIDApOworCQlicmVhazsKKwljYXNlIDB4NDc6IC8qIEc3MCAqLworCWNhc2UgMHg0OTogLyogRzcxICovCisJY2FzZSAweDRiOiAvKiBHNzMgKi8KKwkJbnZfd3IzMihkZXYsIDB4NDAwODI4LCAweDA3ODMwNjEwKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwODJjLCAweDAwMDAwMTZBKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJbnZfd3IzMihkZXYsIDB4NDAwYjM4LCAweDJmZmZmODAwKTsKKwludl93cjMyKGRldiwgMHg0MDBiM2MsIDB4MDAwMDYwMDApOworCisJLyogY29weSB0aWxlIGluZm8gZnJvbSBQRkIgKi8KKwlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7CisJY2FzZSAweDQwOiAvKiB2YW5pbGxhIE5WNDAgKi8KKwkJZm9yIChpID0gMDsgaSA8IE5WMTBfUEZCX1RJTEVfX1NJWkU7IGkrKykgeworCQkJdG1wID0gbnZfcmQzMihkZXYsIE5WMTBfUEZCX1RJTEUoaSkpOworCQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RJTEUwKGkpLCB0bXApOworCQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RJTEUxKGkpLCB0bXApOworCQkJdG1wID0gbnZfcmQzMihkZXYsIE5WMTBfUEZCX1RMSU1JVChpKSk7CisJCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVExJTUlUMChpKSwgdG1wKTsKKwkJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9UTElNSVQxKGkpLCB0bXApOworCQkJdG1wID0gbnZfcmQzMihkZXYsIE5WMTBfUEZCX1RTSVpFKGkpKTsKKwkJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9UU0laRTAoaSksIHRtcCk7CisJCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVFNJWkUxKGkpLCB0bXApOworCQkJdG1wID0gbnZfcmQzMihkZXYsIE5WMTBfUEZCX1RTVEFUVVMoaSkpOworCQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RTVEFUVVMwKGkpLCB0bXApOworCQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RTVEFUVVMxKGkpLCB0bXApOworCQl9CisJCWJyZWFrOworCWNhc2UgMHg0NDoKKwljYXNlIDB4NGE6CisJY2FzZSAweDRlOiAvKiBOVjQ0LWJhc2VkIGNvcmVzIGRvbid0IGhhdmUgMHg0MDY5MDA/ICovCisJCWZvciAoaSA9IDA7IGkgPCBOVjQwX1BGQl9USUxFX19TSVpFXzA7IGkrKykgeworCQkJdG1wID0gbnZfcmQzMihkZXYsIE5WNDBfUEZCX1RJTEUoaSkpOworCQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RJTEUwKGkpLCB0bXApOworCQkJdG1wID0gbnZfcmQzMihkZXYsIE5WNDBfUEZCX1RMSU1JVChpKSk7CisJCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVExJTUlUMChpKSwgdG1wKTsKKwkJCXRtcCA9IG52X3JkMzIoZGV2LCBOVjQwX1BGQl9UU0laRShpKSk7CisJCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVFNJWkUwKGkpLCB0bXApOworCQkJdG1wID0gbnZfcmQzMihkZXYsIE5WNDBfUEZCX1RTVEFUVVMoaSkpOworCQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RTVEFUVVMwKGkpLCB0bXApOworCQl9CisJCWJyZWFrOworCWNhc2UgMHg0NjoKKwljYXNlIDB4NDc6CisJY2FzZSAweDQ5OgorCWNhc2UgMHg0YjogLyogRzdYLWJhc2VkIGNvcmVzICovCisJCWZvciAoaSA9IDA7IGkgPCBOVjQwX1BGQl9USUxFX19TSVpFXzE7IGkrKykgeworCQkJdG1wID0gbnZfcmQzMihkZXYsIE5WNDBfUEZCX1RJTEUoaSkpOworCQkJbnZfd3IzMihkZXYsIE5WNDdfUEdSQVBIX1RJTEUwKGkpLCB0bXApOworCQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RJTEUxKGkpLCB0bXApOworCQkJdG1wID0gbnZfcmQzMihkZXYsIE5WNDBfUEZCX1RMSU1JVChpKSk7CisJCQludl93cjMyKGRldiwgTlY0N19QR1JBUEhfVExJTUlUMChpKSwgdG1wKTsKKwkJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9UTElNSVQxKGkpLCB0bXApOworCQkJdG1wID0gbnZfcmQzMihkZXYsIE5WNDBfUEZCX1RTSVpFKGkpKTsKKwkJCW52X3dyMzIoZGV2LCBOVjQ3X1BHUkFQSF9UU0laRTAoaSksIHRtcCk7CisJCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVFNJWkUxKGkpLCB0bXApOworCQkJdG1wID0gbnZfcmQzMihkZXYsIE5WNDBfUEZCX1RTVEFUVVMoaSkpOworCQkJbnZfd3IzMihkZXYsIE5WNDdfUEdSQVBIX1RTVEFUVVMwKGkpLCB0bXApOworCQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RTVEFUVVMxKGkpLCB0bXApOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIGV2ZXJ5dGhpbmcgZWxzZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgTlY0MF9QRkJfVElMRV9fU0laRV8wOyBpKyspIHsKKwkJCXRtcCA9IG52X3JkMzIoZGV2LCBOVjQwX1BGQl9USUxFKGkpKTsKKwkJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9USUxFMChpKSwgdG1wKTsKKwkJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9USUxFMShpKSwgdG1wKTsKKwkJCXRtcCA9IG52X3JkMzIoZGV2LCBOVjQwX1BGQl9UTElNSVQoaSkpOworCQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RMSU1JVDAoaSksIHRtcCk7CisJCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVExJTUlUMShpKSwgdG1wKTsKKwkJCXRtcCA9IG52X3JkMzIoZGV2LCBOVjQwX1BGQl9UU0laRShpKSk7CisJCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVFNJWkUwKGkpLCB0bXApOworCQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RTSVpFMShpKSwgdG1wKTsKKwkJCXRtcCA9IG52X3JkMzIoZGV2LCBOVjQwX1BGQl9UU1RBVFVTKGkpKTsKKwkJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9UU1RBVFVTMChpKSwgdG1wKTsKKwkJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9UU1RBVFVTMShpKSwgdG1wKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwkvKiBiZWdpbiBSQU0gY29uZmlnICovCisJdnJhbXN6ID0gZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCAwKSAtIDE7CisJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgeworCWNhc2UgMHg0MDoKKwkJbnZfd3IzMihkZXYsIDB4NDAwOUE0LCBudl9yZDMyKGRldiwgTlYwNF9QRkJfQ0ZHMCkpOworCQludl93cjMyKGRldiwgMHg0MDA5QTgsIG52X3JkMzIoZGV2LCBOVjA0X1BGQl9DRkcxKSk7CisJCW52X3dyMzIoZGV2LCAweDQwNjlBNCwgbnZfcmQzMihkZXYsIE5WMDRfUEZCX0NGRzApKTsKKwkJbnZfd3IzMihkZXYsIDB4NDA2OUE4LCBudl9yZDMyKGRldiwgTlYwNF9QRkJfQ0ZHMSkpOworCQludl93cjMyKGRldiwgMHg0MDA4MjAsIDApOworCQludl93cjMyKGRldiwgMHg0MDA4MjQsIDApOworCQludl93cjMyKGRldiwgMHg0MDA4NjQsIHZyYW1zeik7CisJCW52X3dyMzIoZGV2LCAweDQwMDg2OCwgdnJhbXN6KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgeworCQljYXNlIDB4NDY6CisJCWNhc2UgMHg0NzoKKwkJY2FzZSAweDQ5OgorCQljYXNlIDB4NGI6CisJCQludl93cjMyKGRldiwgMHg0MDBERjAsIG52X3JkMzIoZGV2LCBOVjA0X1BGQl9DRkcwKSk7CisJCQludl93cjMyKGRldiwgMHg0MDBERjQsIG52X3JkMzIoZGV2LCBOVjA0X1BGQl9DRkcxKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW52X3dyMzIoZGV2LCAweDQwMDlGMCwgbnZfcmQzMihkZXYsIE5WMDRfUEZCX0NGRzApKTsKKwkJCW52X3dyMzIoZGV2LCAweDQwMDlGNCwgbnZfcmQzMihkZXYsIE5WMDRfUEZCX0NGRzEpKTsKKwkJCWJyZWFrOworCQl9CisJCW52X3dyMzIoZGV2LCAweDQwNjlGMCwgbnZfcmQzMihkZXYsIE5WMDRfUEZCX0NGRzApKTsKKwkJbnZfd3IzMihkZXYsIDB4NDA2OUY0LCBudl9yZDMyKGRldiwgTlYwNF9QRkJfQ0ZHMSkpOworCQludl93cjMyKGRldiwgMHg0MDA4NDAsIDApOworCQludl93cjMyKGRldiwgMHg0MDA4NDQsIDApOworCQludl93cjMyKGRldiwgMHg0MDA4QTAsIHZyYW1zeik7CisJCW52X3dyMzIoZGV2LCAweDQwMDhBNCwgdnJhbXN6KTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbnY0MF9ncmFwaF90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworfQorCitzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzIG52NDBfZ3JhcGhfZ3JjbGFzc1tdID0geworCXsgMHgwMDMwLCBmYWxzZSwgTlVMTCB9LCAvKiBudWxsICovCisJeyAweDAwMzksIGZhbHNlLCBOVUxMIH0sIC8qIG0ybWYgKi8KKwl7IDB4MDA0YSwgZmFsc2UsIE5VTEwgfSwgLyogZ2RpcmVjdCAqLworCXsgMHgwMDlmLCBmYWxzZSwgTlVMTCB9LCAvKiBpbWFnZWJsaXQgKG52MTIpICovCisJeyAweDAwOGEsIGZhbHNlLCBOVUxMIH0sIC8qIGlmYyAqLworCXsgMHgwMDg5LCBmYWxzZSwgTlVMTCB9LCAvKiBzaWZtICovCisJeyAweDMwODksIGZhbHNlLCBOVUxMIH0sIC8qIHNpZm0gKG52NDApICovCisJeyAweDAwNjIsIGZhbHNlLCBOVUxMIH0sIC8qIHN1cmYyZCAqLworCXsgMHgzMDYyLCBmYWxzZSwgTlVMTCB9LCAvKiBzdXJmMmQgKG52NDApICovCisJeyAweDAwNDMsIGZhbHNlLCBOVUxMIH0sIC8qIHJvcCAqLworCXsgMHgwMDEyLCBmYWxzZSwgTlVMTCB9LCAvKiBiZXRhMSAqLworCXsgMHgwMDcyLCBmYWxzZSwgTlVMTCB9LCAvKiBiZXRhNCAqLworCXsgMHgwMDE5LCBmYWxzZSwgTlVMTCB9LCAvKiBjbGlwcmVjdCAqLworCXsgMHgwMDQ0LCBmYWxzZSwgTlVMTCB9LCAvKiBwYXR0ZXJuICovCisJeyAweDMwOWUsIGZhbHNlLCBOVUxMIH0sIC8qIHN3enN1cmYgKi8KKwl7IDB4NDA5NywgZmFsc2UsIE5VTEwgfSwgLyogY3VyaWUgKG52NDApICovCisJeyAweDQ0OTcsIGZhbHNlLCBOVUxMIH0sIC8qIGN1cmllIChudjQ0KSAqLworCXt9Cit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX21jLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX21jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEzNDk1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfbWMuYwpAQCAtMCwwICsxLDM4IEBACisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKKworaW50CitudjQwX21jX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IHRtcDsKKworCS8qIFBvd2VyIHVwIGV2ZXJ5dGhpbmcsIHJlc2V0dGluZyBlYWNoIGluZGl2aWR1YWwgdW5pdCB3aWxsCisJICogYmUgZG9uZSBsYXRlciBpZiBuZWVkZWQuCisJICovCisJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwgMHhGRkZGRkZGRik7CisKKwlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7CisJY2FzZSAweDQ0OgorCWNhc2UgMHg0NjogLyogRzcyICovCisJY2FzZSAweDRlOgorCWNhc2UgMHg0YzogLyogQzUxX0c3WCAqLworCQl0bXAgPSBudl9yZDMyKGRldiwgTlY0MF9QRkJfMDIwQyk7CisJCW52X3dyMzIoZGV2LCBOVjQwX1BNQ18xNzAwLCB0bXApOworCQludl93cjMyKGRldiwgTlY0MF9QTUNfMTcwNCwgMCk7CisJCW52X3dyMzIoZGV2LCBOVjQwX1BNQ18xNzA4LCAwKTsKKwkJbnZfd3IzMihkZXYsIE5WNDBfUE1DXzE3MEMsIHRtcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkCitudjQwX21jX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfY3J0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZTI4YTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2NydGMuYwpAQCAtMCwwICsxLDc2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYWFydGVuIE1hYXRodWlzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm1fbW9kZS5oIgorI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgorCisjZGVmaW5lIE5PVVZFQVVfRE1BX0RFQlVHIChub3V2ZWF1X3JlZ19kZWJ1ZyAmIE5PVVZFQVVfUkVHX0RFQlVHX0VWTykKKyNpbmNsdWRlICJub3V2ZWF1X3JlZy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9ody5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZW5jb2Rlci5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY3J0Yy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZmIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Nvbm5lY3Rvci5oIgorI2luY2x1ZGUgIm52NTBfZGlzcGxheS5oIgorCitzdGF0aWMgdm9pZAorbnY1MF9jcnRjX2x1dF9sb2FkKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCXZvaWQgX19pb21lbSAqbHV0ID0gbnZib19rbWFwX29ial9pb3ZpcnR1YWwobnZfY3J0Yy0+bHV0Lm52Ym8pOworCWludCBpOworCisJTlZfREVCVUcoY3J0Yy0+ZGV2LCAiXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQl3cml0ZXcobnZfY3J0Yy0+bHV0LnJbaV0gPj4gMiwgbHV0ICsgOCppICsgMCk7CisJCXdyaXRldyhudl9jcnRjLT5sdXQuZ1tpXSA+PiAyLCBsdXQgKyA4KmkgKyAyKTsKKwkJd3JpdGV3KG52X2NydGMtPmx1dC5iW2ldID4+IDIsIGx1dCArIDgqaSArIDQpOworCX0KKworCWlmIChudl9jcnRjLT5sdXQuZGVwdGggPT0gMzApIHsKKwkJd3JpdGV3KG52X2NydGMtPmx1dC5yW2kgLSAxXSA+PiAyLCBsdXQgKyA4KmkgKyAwKTsKKwkJd3JpdGV3KG52X2NydGMtPmx1dC5nW2kgLSAxXSA+PiAyLCBsdXQgKyA4KmkgKyAyKTsKKwkJd3JpdGV3KG52X2NydGMtPmx1dC5iW2kgLSAxXSA+PiAyLCBsdXQgKyA4KmkgKyA0KTsKKwl9Cit9CisKK2ludAorbnY1MF9jcnRjX2JsYW5rKHN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMsIGJvb2wgYmxhbmtlZCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbnZfY3J0Yy0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm8gPSBkZXZfcHJpdi0+ZXZvOworCWludCBpbmRleCA9IG52X2NydGMtPmluZGV4LCByZXQ7CisKKwlOVl9ERUJVRyhkZXYsICJpbmRleCAlZFxuIiwgbnZfY3J0Yy0+aW5kZXgpOworCU5WX0RFQlVHKGRldiwgIiVzXG4iLCBibGFua2VkID8gImJsYW5rZWQiIDogInVuYmxhbmtlZCIpOworCisJaWYgKGJsYW5rZWQpIHsKKwkJbnZfY3J0Yy0+Y3Vyc29yLmhpZGUobnZfY3J0YywgZmFsc2UpOworCisJCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCBkZXZfcHJpdi0+Y2hpcHNldCAhPSAweDUwID8gNyA6IDUpOworCQlpZiAocmV0KSB7CisJCQlOVl9FUlJPUihkZXYsICJubyBzcGFjZSB3aGlsZSBibGFua2luZyBjcnRjXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX0NSVEMoaW5kZXgsIENMVVRfTU9ERSksIDIpOworCQlPVVRfUklORyhldm8sIE5WNTBfRVZPX0NSVENfQ0xVVF9NT0RFX0JMQU5LKTsKKwkJT1VUX1JJTkcoZXZvLCAwKTsKKwkJaWYgKGRldl9wcml2LT5jaGlwc2V0ICE9IDB4NTApIHsKKwkJCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjg0X0VWT19DUlRDKGluZGV4LCBDTFVUX0RNQSksIDEpOworCQkJT1VUX1JJTkcoZXZvLCBOVjg0X0VWT19DUlRDX0NMVVRfRE1BX0hBTkRMRV9OT05FKTsKKwkJfQorCisJCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19DUlRDKGluZGV4LCBGQl9ETUEpLCAxKTsKKwkJT1VUX1JJTkcoZXZvLCBOVjUwX0VWT19DUlRDX0ZCX0RNQV9IQU5ETEVfTk9ORSk7CisJfSBlbHNlIHsKKwkJaWYgKG52X2NydGMtPmN1cnNvci52aXNpYmxlKQorCQkJbnZfY3J0Yy0+Y3Vyc29yLnNob3cobnZfY3J0YywgZmFsc2UpOworCQllbHNlCisJCQludl9jcnRjLT5jdXJzb3IuaGlkZShudl9jcnRjLCBmYWxzZSk7CisKKwkJcmV0ID0gUklOR19TUEFDRShldm8sIGRldl9wcml2LT5jaGlwc2V0ICE9IDB4NTAgPyAxMCA6IDgpOworCQlpZiAocmV0KSB7CisJCQlOVl9FUlJPUihkZXYsICJubyBzcGFjZSB3aGlsZSB1bmJsYW5raW5nIGNydGNcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQyhpbmRleCwgQ0xVVF9NT0RFKSwgMik7CisJCU9VVF9SSU5HKGV2bywgbnZfY3J0Yy0+bHV0LmRlcHRoID09IDggPworCQkJCU5WNTBfRVZPX0NSVENfQ0xVVF9NT0RFX09GRiA6CisJCQkJTlY1MF9FVk9fQ1JUQ19DTFVUX01PREVfT04pOworCQlPVVRfUklORyhldm8sIChudl9jcnRjLT5sdXQubnZiby0+Ym8ubWVtLm1tX25vZGUtPnN0YXJ0IDw8CisJCQkJIFBBR0VfU0hJRlQpID4+IDgpOworCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHg1MCkgeworCQkJQkVHSU5fUklORyhldm8sIDAsIE5WODRfRVZPX0NSVEMoaW5kZXgsIENMVVRfRE1BKSwgMSk7CisJCQlPVVRfUklORyhldm8sIE52RXZvVlJBTSk7CisJCX0KKworCQlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQyhpbmRleCwgRkJfT0ZGU0VUKSwgMik7CisJCU9VVF9SSU5HKGV2bywgbnZfY3J0Yy0+ZmIub2Zmc2V0ID4+IDgpOworCQlPVVRfUklORyhldm8sIDApOworCQlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQyhpbmRleCwgRkJfRE1BKSwgMSk7CisJCWlmIChkZXZfcHJpdi0+Y2hpcHNldCAhPSAweDUwKQorCQkJaWYgKG52X2NydGMtPmZiLnRpbGVfZmxhZ3MgPT0gMHg3YTAwKQorCQkJCU9VVF9SSU5HKGV2bywgTnZFdm9GQjMyKTsKKwkJCWVsc2UKKwkJCWlmIChudl9jcnRjLT5mYi50aWxlX2ZsYWdzID09IDB4NzAwMCkKKwkJCQlPVVRfUklORyhldm8sIE52RXZvRkIxNik7CisJCQllbHNlCisJCQkJT1VUX1JJTkcoZXZvLCBOdkV2b1ZSQU0pOworCQllbHNlCisJCQlPVVRfUklORyhldm8sIE52RXZvVlJBTSk7CisJfQorCisJbnZfY3J0Yy0+ZmIuYmxhbmtlZCA9IGJsYW5rZWQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252NTBfY3J0Y19zZXRfZGl0aGVyKHN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMsIGJvb2wgb24sIGJvb2wgdXBkYXRlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBudl9jcnRjLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2byA9IGRldl9wcml2LT5ldm87CisJaW50IHJldDsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwlyZXQgPSBSSU5HX1NQQUNFKGV2bywgMiArICh1cGRhdGUgPyAyIDogMCkpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAibm8gc3BhY2Ugd2hpbGUgc2V0dGluZyBkaXRoZXJcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19DUlRDKG52X2NydGMtPmluZGV4LCBESVRIRVJfQ1RSTCksIDEpOworCWlmIChvbikKKwkJT1VUX1JJTkcoZXZvLCBOVjUwX0VWT19DUlRDX0RJVEhFUl9DVFJMX09OKTsKKwllbHNlCisJCU9VVF9SSU5HKGV2bywgTlY1MF9FVk9fQ1JUQ19ESVRIRVJfQ1RSTF9PRkYpOworCisJaWYgKHVwZGF0ZSkgeworCQlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fVVBEQVRFLCAxKTsKKwkJT1VUX1JJTkcoZXZvLCAwKTsKKwkJRklSRV9SSU5HKGV2byk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqCitub3V2ZWF1X2NydGNfY29ubmVjdG9yX2dldChzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBudl9jcnRjLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IHRvX2RybV9jcnRjKG52X2NydGMpOworCisJLyogVGhlIHNhZmVzdCBhcHByb2FjaCBpcyB0byBmaW5kIGFuIGVuY29kZXIgd2l0aCB0aGUgcmlnaHQgY3J0YywgdGhhdAorCSAqIGlzIGFsc28gbGlua2VkIHRvIGEgY29ubmVjdG9yLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQlpZiAoY29ubmVjdG9yLT5lbmNvZGVyKQorCQkJaWYgKGNvbm5lY3Rvci0+ZW5jb2Rlci0+Y3J0YyA9PSBjcnRjKQorCQkJCXJldHVybiBub3V2ZWF1X2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50CitudjUwX2NydGNfc2V0X3NjYWxlKHN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMsIGludCBzY2FsaW5nX21vZGUsIGJvb2wgdXBkYXRlKQoreworCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0KKwkJbm91dmVhdV9jcnRjX2Nvbm5lY3Rvcl9nZXQobnZfY3J0Yyk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG52X2NydGMtPmJhc2UuZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqZXZvID0gZGV2X3ByaXYtPmV2bzsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbmF0aXZlX21vZGUgPSBOVUxMOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0gJm52X2NydGMtPmJhc2UubW9kZTsKKwl1aW50MzJfdCBvdXRYLCBvdXRZLCBob3JpeiwgdmVydDsKKwlpbnQgcmV0OworCisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCXN3aXRjaCAoc2NhbGluZ19tb2RlKSB7CisJY2FzZSBEUk1fTU9ERV9TQ0FMRV9OT05FOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoIW52X2Nvbm5lY3RvciB8fCAhbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZSkgeworCQkJTlZfRVJST1IoZGV2LCAiTm8gbmF0aXZlIG1vZGUsIGZvcmNpbmcgcGFuZWwgc2NhbGluZ1xuIik7CisJCQlzY2FsaW5nX21vZGUgPSBEUk1fTU9ERV9TQ0FMRV9OT05FOworCQl9IGVsc2UgeworCQkJbmF0aXZlX21vZGUgPSBudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlOworCQl9CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoc2NhbGluZ19tb2RlKSB7CisJY2FzZSBEUk1fTU9ERV9TQ0FMRV9BU1BFQ1Q6CisJCWhvcml6ID0gKG5hdGl2ZV9tb2RlLT5oZGlzcGxheSA8PCAxOSkgLyBtb2RlLT5oZGlzcGxheTsKKwkJdmVydCA9IChuYXRpdmVfbW9kZS0+dmRpc3BsYXkgPDwgMTkpIC8gbW9kZS0+dmRpc3BsYXk7CisKKwkJaWYgKHZlcnQgPiBob3JpeikgeworCQkJb3V0WCA9IChtb2RlLT5oZGlzcGxheSAqIGhvcml6KSA+PiAxOTsKKwkJCW91dFkgPSAobW9kZS0+dmRpc3BsYXkgKiBob3JpeikgPj4gMTk7CisJCX0gZWxzZSB7CisJCQlvdXRYID0gKG1vZGUtPmhkaXNwbGF5ICogdmVydCkgPj4gMTk7CisJCQlvdXRZID0gKG1vZGUtPnZkaXNwbGF5ICogdmVydCkgPj4gMTk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBEUk1fTU9ERV9TQ0FMRV9GVUxMU0NSRUVOOgorCQlvdXRYID0gbmF0aXZlX21vZGUtPmhkaXNwbGF5OworCQlvdXRZID0gbmF0aXZlX21vZGUtPnZkaXNwbGF5OworCQlicmVhazsKKwljYXNlIERSTV9NT0RFX1NDQUxFX0NFTlRFUjoKKwljYXNlIERSTV9NT0RFX1NDQUxFX05PTkU6CisJZGVmYXVsdDoKKwkJb3V0WCA9IG1vZGUtPmhkaXNwbGF5OworCQlvdXRZID0gbW9kZS0+dmRpc3BsYXk7CisJCWJyZWFrOworCX0KKworCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCB1cGRhdGUgPyA3IDogNSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEdvdCBhIGJldHRlciBuYW1lIGZvciBTQ0FMRVJfQUNUSVZFPyAqLworCS8qIE9uZSBkYXkgaSd2ZSBnb3QgdG8gcmVhbGx5IGZpZ3VyZSBvdXQgd2h5IHRoaXMgaXMgbmVlZGVkLiAqLworCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19DUlRDKG52X2NydGMtPmluZGV4LCBTQ0FMRV9DVFJMKSwgMSk7CisJaWYgKChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfREJMU0NBTikgfHwKKwkgICAgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpIHx8CisJICAgIG1vZGUtPmhkaXNwbGF5ICE9IG91dFggfHwgbW9kZS0+dmRpc3BsYXkgIT0gb3V0WSkgeworCQlPVVRfUklORyhldm8sIE5WNTBfRVZPX0NSVENfU0NBTEVfQ1RSTF9BQ1RJVkUpOworCX0gZWxzZSB7CisJCU9VVF9SSU5HKGV2bywgTlY1MF9FVk9fQ1JUQ19TQ0FMRV9DVFJMX0lOQUNUSVZFKTsKKwl9CisKKwlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQyhudl9jcnRjLT5pbmRleCwgU0NBTEVfUkVTMSksIDIpOworCU9VVF9SSU5HKGV2bywgb3V0WSA8PCAxNiB8IG91dFgpOworCU9VVF9SSU5HKGV2bywgb3V0WSA8PCAxNiB8IG91dFgpOworCisJaWYgKHVwZGF0ZSkgeworCQlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fVVBEQVRFLCAxKTsKKwkJT1VUX1JJTkcoZXZvLCAwKTsKKwkJRklSRV9SSU5HKGV2byk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludAorbnY1MF9jcnRjX3NldF9jbG9jayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCwgaW50IHBjbGspCit7CisJdWludDMyX3QgcGxsX3JlZyA9IE5WNTBfUERJU1BMQVlfQ1JUQ19DTEtfQ1RSTDEoaGVhZCk7CisJc3RydWN0IG5vdXZlYXVfcGxsX3ZhbHMgcGxsOworCXN0cnVjdCBwbGxfbGltcyBsaW1pdHM7CisJdWludDMyX3QgcmVnMSwgcmVnMjsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2V0X3BsbF9saW1pdHMoZGV2LCBwbGxfcmVnLCAmbGltaXRzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbm91dmVhdV9jYWxjX3BsbF9tbnAoZGV2LCAmbGltaXRzLCBwY2xrLCAmcGxsKTsKKwlpZiAocmV0IDw9IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAobGltaXRzLnZjbzIubWF4ZnJlcSkgeworCQlyZWcxID0gbnZfcmQzMihkZXYsIHBsbF9yZWcgKyA0KSAmIDB4ZmYwMGZmMDA7CisJCXJlZzIgPSBudl9yZDMyKGRldiwgcGxsX3JlZyArIDgpICYgMHg4MDAwZmYwMDsKKwkJbnZfd3IzMihkZXYsIHBsbF9yZWcsIDB4MTAwMDA2MTEpOworCQludl93cjMyKGRldiwgcGxsX3JlZyArIDQsIHJlZzEgfCAocGxsLk0xIDw8IDE2KSB8IHBsbC5OMSk7CisJCW52X3dyMzIoZGV2LCBwbGxfcmVnICsgOCwKKwkJCXJlZzIgfCAocGxsLmxvZzJQIDw8IDI4KSB8IChwbGwuTTIgPDwgMTYpIHwgcGxsLk4yKTsKKwl9IGVsc2UgeworCQlyZWcxID0gbnZfcmQzMihkZXYsIHBsbF9yZWcgKyA0KSAmIDB4ZmZjMDAwMDA7CisJCW52X3dyMzIoZGV2LCBwbGxfcmVnLCAweDUwMDAwNjEwKTsKKwkJbnZfd3IzMihkZXYsIHBsbF9yZWcgKyA0LCByZWcxIHwKKwkJCShwbGwubG9nMlAgPDwgMTYpIHwgKHBsbC5NMSA8PCA4KSB8IHBsbC5OMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2NydGNfZGVzdHJveShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCWlmICghY3J0YykKKwkJcmV0dXJuOworCisJZHJtX2NydGNfY2xlYW51cCgmbnZfY3J0Yy0+YmFzZSk7CisKKwludjUwX2N1cnNvcl9maW5pKG52X2NydGMpOworCisJbm91dmVhdV9ib19yZWYoTlVMTCwgJm52X2NydGMtPmx1dC5udmJvKTsKKwlub3V2ZWF1X2JvX3JlZihOVUxMLCAmbnZfY3J0Yy0+Y3Vyc29yLm52Ym8pOworCWtmcmVlKG52X2NydGMtPm1vZGUpOworCWtmcmVlKG52X2NydGMpOworfQorCitpbnQKK252NTBfY3J0Y19jdXJzb3Jfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCSAgICAgdWludDMyX3QgYnVmZmVyX2hhbmRsZSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqY3Vyc29yID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbTsKKwlpbnQgcmV0ID0gMCwgaTsKKworCWlmICh3aWR0aCAhPSA2NCB8fCBoZWlnaHQgIT0gNjQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFidWZmZXJfaGFuZGxlKSB7CisJCW52X2NydGMtPmN1cnNvci5oaWRlKG52X2NydGMsIHRydWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlnZW0gPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsIGJ1ZmZlcl9oYW5kbGUpOworCWlmICghZ2VtKQorCQlyZXR1cm4gLUVJTlZBTDsKKwljdXJzb3IgPSBub3V2ZWF1X2dlbV9vYmplY3QoZ2VtKTsKKworCXJldCA9IG5vdXZlYXVfYm9fbWFwKGN1cnNvcik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBUaGUgc2ltcGxlIHdpbGwgZG8gZm9yIG5vdy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjQgKiA2NDsgaSsrKQorCQlub3V2ZWF1X2JvX3dyMzIobnZfY3J0Yy0+Y3Vyc29yLm52Ym8sIGksIG5vdXZlYXVfYm9fcmQzMihjdXJzb3IsIGkpKTsKKworCW5vdXZlYXVfYm9fdW5tYXAoY3Vyc29yKTsKKworCW52X2NydGMtPmN1cnNvci5zZXRfb2Zmc2V0KG52X2NydGMsIG52X2NydGMtPmN1cnNvci5udmJvLT5iby5vZmZzZXQgLQorCQkJCQkgICAgZGV2X3ByaXYtPnZtX3ZyYW1fYmFzZSk7CisJbnZfY3J0Yy0+Y3Vyc29yLnNob3cobnZfY3J0YywgdHJ1ZSk7CisKK291dDoKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoZ2VtKTsKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK252NTBfY3J0Y19jdXJzb3JfbW92ZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCB4LCBpbnQgeSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCisJbnZfY3J0Yy0+Y3Vyc29yLnNldF9wb3MobnZfY3J0YywgeCwgeSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2NydGNfZ2FtbWFfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdTE2ICpyLCB1MTYgKmcsIHUxNiAqYiwKKwkJICAgIHVpbnQzMl90IHNpemUpCit7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKwlpbnQgaTsKKworCWlmIChzaXplICE9IDI1NikKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCW52X2NydGMtPmx1dC5yW2ldID0gcltpXTsKKwkJbnZfY3J0Yy0+bHV0LmdbaV0gPSBnW2ldOworCQludl9jcnRjLT5sdXQuYltpXSA9IGJbaV07CisJfQorCisJLyogV2UgbmVlZCB0byBrbm93IHRoZSBkZXB0aCBiZWZvcmUgd2UgdXBsb2FkLCBidXQgaXQncyBwb3NzaWJsZSB0bworCSAqIGdldCBjYWxsZWQgYmVmb3JlIGEgZnJhbWVidWZmZXIgaXMgYm91bmQuICBJZiB0aGlzIGlzIHRoZSBjYXNlLAorCSAqIG1hcmsgdGhlIGx1dCB2YWx1ZXMgYXMgZGlydHkgYnkgc2V0dGluZyBkZXB0aD09MCwgYW5kIGl0J2xsIGJlCisJICogdXBsb2FkZWQgb24gdGhlIGZpcnN0IG1vZGVfc2V0X2Jhc2UoKQorCSAqLworCWlmICghbnZfY3J0Yy0+YmFzZS5mYikgeworCQludl9jcnRjLT5sdXQuZGVwdGggPSAwOworCQlyZXR1cm47CisJfQorCisJbnY1MF9jcnRjX2x1dF9sb2FkKGNydGMpOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9jcnRjX3NhdmUoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCU5WX0VSUk9SKGNydGMtPmRldiwgIiEhXG4iKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfY3J0Y19yZXN0b3JlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlOVl9FUlJPUihjcnRjLT5kZXYsICIhIVxuIik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2NydGNfZnVuY3MgbnY1MF9jcnRjX2Z1bmNzID0geworCS5zYXZlID0gbnY1MF9jcnRjX3NhdmUsCisJLnJlc3RvcmUgPSBudjUwX2NydGNfcmVzdG9yZSwKKwkuY3Vyc29yX3NldCA9IG52NTBfY3J0Y19jdXJzb3Jfc2V0LAorCS5jdXJzb3JfbW92ZSA9IG52NTBfY3J0Y19jdXJzb3JfbW92ZSwKKwkuZ2FtbWFfc2V0ID0gbnY1MF9jcnRjX2dhbW1hX3NldCwKKwkuc2V0X2NvbmZpZyA9IGRybV9jcnRjX2hlbHBlcl9zZXRfY29uZmlnLAorCS5kZXN0cm95ID0gbnY1MF9jcnRjX2Rlc3Ryb3ksCit9OworCitzdGF0aWMgdm9pZAorbnY1MF9jcnRjX2RwbXMoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgbW9kZSkKK3sKK30KKworc3RhdGljIHZvaWQKK252NTBfY3J0Y19wcmVwYXJlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCisJTlZfREVCVUcoZGV2LCAiaW5kZXggJWRcbiIsIG52X2NydGMtPmluZGV4KTsKKworCS8qIERpc2Nvbm5lY3QgYWxsIHVudXNlZCBlbmNvZGVycy4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCisJCWlmIChkcm1faGVscGVyX2VuY29kZXJfaW5fdXNlKGVuY29kZXIpKQorCQkJY29udGludWU7CisKKwkJbnZfZW5jb2Rlci0+ZGlzY29ubmVjdChudl9lbmNvZGVyKTsKKwl9CisKKwludjUwX2NydGNfYmxhbmsobnZfY3J0YywgdHJ1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2NydGNfY29tbWl0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGMyOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm8gPSBkZXZfcHJpdi0+ZXZvOworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJaW50IHJldDsKKworCU5WX0RFQlVHKGRldiwgImluZGV4ICVkXG4iLCBudl9jcnRjLT5pbmRleCk7CisKKwludjUwX2NydGNfYmxhbmsobnZfY3J0YywgZmFsc2UpOworCisJLyogRXhwbGljaXRseSBibGFuayBhbGwgdW51c2VkIGNydGMncy4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMyLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJaWYgKCFkcm1faGVscGVyX2NydGNfaW5fdXNlKGNydGMyKSkKKwkJCW52NTBfY3J0Y19ibGFuayhub3V2ZWF1X2NydGMoY3J0YzIpLCB0cnVlKTsKKwl9CisKKwlyZXQgPSBSSU5HX1NQQUNFKGV2bywgMik7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJubyBzcGFjZSB3aGlsZSBjb21taXR0aW5nIGNydGNcbiIpOworCQlyZXR1cm47CisJfQorCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19VUERBVEUsIDEpOworCU9VVF9SSU5HKGV2bywgMCk7CisJRklSRV9SSU5HKGV2byk7Cit9CisKK3N0YXRpYyBib29sCitudjUwX2NydGNfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50CitudjUwX2NydGNfZG9fbW9kZV9zZXRfYmFzZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCB4LCBpbnQgeSwKKwkJCSAgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm9sZF9mYiwgYm9vbCB1cGRhdGUpCit7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbnZfY3J0Yy0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm8gPSBkZXZfcHJpdi0+ZXZvOworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmRybV9mYiA9IG52X2NydGMtPmJhc2UuZmI7CisJc3RydWN0IG5vdXZlYXVfZnJhbWVidWZmZXIgKmZiID0gbm91dmVhdV9mcmFtZWJ1ZmZlcihkcm1fZmIpOworCWludCByZXQsIGZvcm1hdDsKKworCU5WX0RFQlVHKGRldiwgImluZGV4ICVkXG4iLCBudl9jcnRjLT5pbmRleCk7CisKKwlzd2l0Y2ggKGRybV9mYi0+ZGVwdGgpIHsKKwljYXNlICA4OgorCQlmb3JtYXQgPSBOVjUwX0VWT19DUlRDX0ZCX0RFUFRIXzg7CisJCWJyZWFrOworCWNhc2UgMTU6CisJCWZvcm1hdCA9IE5WNTBfRVZPX0NSVENfRkJfREVQVEhfMTU7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWZvcm1hdCA9IE5WNTBfRVZPX0NSVENfRkJfREVQVEhfMTY7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJY2FzZSAzMjoKKwkJZm9ybWF0ID0gTlY1MF9FVk9fQ1JUQ19GQl9ERVBUSF8yNDsKKwkJYnJlYWs7CisJY2FzZSAzMDoKKwkJZm9ybWF0ID0gTlY1MF9FVk9fQ1JUQ19GQl9ERVBUSF8zMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJIE5WX0VSUk9SKGRldiwgInVua25vd24gZGVwdGggJWRcbiIsIGRybV9mYi0+ZGVwdGgpOworCQkgcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gbm91dmVhdV9ib19waW4oZmItPm52Ym8sIFRUTV9QTF9GTEFHX1ZSQU0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAob2xkX2ZiKSB7CisJCXN0cnVjdCBub3V2ZWF1X2ZyYW1lYnVmZmVyICpvZmIgPSBub3V2ZWF1X2ZyYW1lYnVmZmVyKG9sZF9mYik7CisJCW5vdXZlYXVfYm9fdW5waW4ob2ZiLT5udmJvKTsKKwl9CisKKwludl9jcnRjLT5mYi5vZmZzZXQgPSBmYi0+bnZiby0+Ym8ub2Zmc2V0IC0gZGV2X3ByaXYtPnZtX3ZyYW1fYmFzZTsKKwludl9jcnRjLT5mYi50aWxlX2ZsYWdzID0gZmItPm52Ym8tPnRpbGVfZmxhZ3M7CisJbnZfY3J0Yy0+ZmIuY3BwID0gZHJtX2ZiLT5iaXRzX3Blcl9waXhlbCAvIDg7CisJaWYgKCFudl9jcnRjLT5mYi5ibGFua2VkICYmIGRldl9wcml2LT5jaGlwc2V0ICE9IDB4NTApIHsKKwkJcmV0ID0gUklOR19TUEFDRShldm8sIDIpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQyhudl9jcnRjLT5pbmRleCwgRkJfRE1BKSwgMSk7CisJCWlmIChudl9jcnRjLT5mYi50aWxlX2ZsYWdzID09IDB4N2EwMCkKKwkJCU9VVF9SSU5HKGV2bywgTnZFdm9GQjMyKTsKKwkJZWxzZQorCQlpZiAobnZfY3J0Yy0+ZmIudGlsZV9mbGFncyA9PSAweDcwMDApCisJCQlPVVRfUklORyhldm8sIE52RXZvRkIxNik7CisJCWVsc2UKKwkJCU9VVF9SSU5HKGV2bywgTnZFdm9WUkFNKTsKKwl9CisKKwlyZXQgPSBSSU5HX1NQQUNFKGV2bywgMTIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQyhudl9jcnRjLT5pbmRleCwgRkJfT0ZGU0VUKSwgNSk7CisJT1VUX1JJTkcoZXZvLCBudl9jcnRjLT5mYi5vZmZzZXQgPj4gOCk7CisJT1VUX1JJTkcoZXZvLCAwKTsKKwlPVVRfUklORyhldm8sIChkcm1fZmItPmhlaWdodCA8PCAxNikgfCBkcm1fZmItPndpZHRoKTsKKwlpZiAoIW52X2NydGMtPmZiLnRpbGVfZmxhZ3MpIHsKKwkJT1VUX1JJTkcoZXZvLCBkcm1fZmItPnBpdGNoIHwgKDEgPDwgMjApKTsKKwl9IGVsc2UgeworCQlPVVRfUklORyhldm8sICgoZHJtX2ZiLT5waXRjaCAvIDQpIDw8IDQpIHwKKwkJCQkgIGZiLT5udmJvLT50aWxlX21vZGUpOworCX0KKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg1MCkKKwkJT1VUX1JJTkcoZXZvLCAoZmItPm52Ym8tPnRpbGVfZmxhZ3MgPDwgOCkgfCBmb3JtYXQpOworCWVsc2UKKwkJT1VUX1JJTkcoZXZvLCBmb3JtYXQpOworCisJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX0NSVEMobnZfY3J0Yy0+aW5kZXgsIENMVVRfTU9ERSksIDEpOworCU9VVF9SSU5HKGV2bywgZmItPmJhc2UuZGVwdGggPT0gOCA/CisJCSBOVjUwX0VWT19DUlRDX0NMVVRfTU9ERV9PRkYgOiBOVjUwX0VWT19DUlRDX0NMVVRfTU9ERV9PTik7CisKKwlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQyhudl9jcnRjLT5pbmRleCwgQ09MT1JfQ1RSTCksIDEpOworCU9VVF9SSU5HKGV2bywgTlY1MF9FVk9fQ1JUQ19DT0xPUl9DVFJMX0NPTE9SKTsKKwlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQyhudl9jcnRjLT5pbmRleCwgRkJfUE9TKSwgMSk7CisJT1VUX1JJTkcoZXZvLCAoeSA8PCAxNikgfCB4KTsKKworCWlmIChudl9jcnRjLT5sdXQuZGVwdGggIT0gZmItPmJhc2UuZGVwdGgpIHsKKwkJbnZfY3J0Yy0+bHV0LmRlcHRoID0gZmItPmJhc2UuZGVwdGg7CisJCW52NTBfY3J0Y19sdXRfbG9hZChjcnRjKTsKKwl9CisKKwlpZiAodXBkYXRlKSB7CisJCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCAyKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19VUERBVEUsIDEpOworCQlPVVRfUklORyhldm8sIDApOworCQlGSVJFX1JJTkcoZXZvKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnY1MF9jcnRjX21vZGVfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCSAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlLCBpbnQgeCwgaW50IHksCisJCSAgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm9sZF9mYikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqZXZvID0gZGV2X3ByaXYtPmV2bzsKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0gTlVMTDsKKwl1aW50MzJfdCBoc3luY19kdXIsICB2c3luY19kdXIsIGhzeW5jX3N0YXJ0X3RvX2VuZCwgdnN5bmNfc3RhcnRfdG9fZW5kOworCXVpbnQzMl90IGh1bmsxLCB2dW5rMSwgdnVuazJhLCB2dW5rMmI7CisJaW50IHJldDsKKworCS8qIEZpbmQgdGhlIGNvbm5lY3RvciBhdHRhY2hlZCB0byB0aGlzIENSVEMgKi8KKwludl9jb25uZWN0b3IgPSBub3V2ZWF1X2NydGNfY29ubmVjdG9yX2dldChudl9jcnRjKTsKKworCSpudl9jcnRjLT5tb2RlID0gKmFkanVzdGVkX21vZGU7CisKKwlOVl9ERUJVRyhkZXYsICJpbmRleCAlZFxuIiwgbnZfY3J0Yy0+aW5kZXgpOworCisJaHN5bmNfZHVyID0gYWRqdXN0ZWRfbW9kZS0+aHN5bmNfZW5kIC0gYWRqdXN0ZWRfbW9kZS0+aHN5bmNfc3RhcnQ7CisJdnN5bmNfZHVyID0gYWRqdXN0ZWRfbW9kZS0+dnN5bmNfZW5kIC0gYWRqdXN0ZWRfbW9kZS0+dnN5bmNfc3RhcnQ7CisJaHN5bmNfc3RhcnRfdG9fZW5kID0gYWRqdXN0ZWRfbW9kZS0+aHRvdGFsIC0gYWRqdXN0ZWRfbW9kZS0+aHN5bmNfc3RhcnQ7CisJdnN5bmNfc3RhcnRfdG9fZW5kID0gYWRqdXN0ZWRfbW9kZS0+dnRvdGFsIC0gYWRqdXN0ZWRfbW9kZS0+dnN5bmNfc3RhcnQ7CisJLyogSSBjYW4ndCBnaXZlIHRoaXMgYSBwcm9wZXIgbmFtZSwgYW55b25lIGVsc2UgY2FuPyAqLworCWh1bmsxID0gYWRqdXN0ZWRfbW9kZS0+aHRvdGFsIC0KKwkJYWRqdXN0ZWRfbW9kZS0+aHN5bmNfc3RhcnQgKyBhZGp1c3RlZF9tb2RlLT5oZGlzcGxheTsKKwl2dW5rMSA9IGFkanVzdGVkX21vZGUtPnZ0b3RhbCAtCisJCWFkanVzdGVkX21vZGUtPnZzeW5jX3N0YXJ0ICsgYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXk7CisJLyogQW5vdGhlciBzdHJhbmdlIHZhbHVlLCB0aGlzIHRpbWUgb25seSBmb3IgaW50ZXJsYWNlZCBhZGp1c3RlZF9tb2Rlcy4gKi8KKwl2dW5rMmEgPSAyICogYWRqdXN0ZWRfbW9kZS0+dnRvdGFsIC0KKwkJIGFkanVzdGVkX21vZGUtPnZzeW5jX3N0YXJ0ICsgYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXk7CisJdnVuazJiID0gYWRqdXN0ZWRfbW9kZS0+dnRvdGFsIC0KKwkJIGFkanVzdGVkX21vZGUtPnZzeW5jX3N0YXJ0ICsgYWRqdXN0ZWRfbW9kZS0+dnRvdGFsOworCisJaWYgKGFkanVzdGVkX21vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpIHsKKwkJdnN5bmNfZHVyIC89IDI7CisJCXZzeW5jX3N0YXJ0X3RvX2VuZCAgLz0gMjsKKwkJdnVuazEgLz0gMjsKKwkJdnVuazJhIC89IDI7CisJCXZ1bmsyYiAvPSAyOworCQkvKiBtYWdpYyAqLworCQlpZiAoYWRqdXN0ZWRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0RCTFNDQU4pIHsKKwkJCXZzeW5jX3N0YXJ0X3RvX2VuZCAtPSAxOworCQkJdnVuazEgLT0gMTsKKwkJCXZ1bmsyYSAtPSAxOworCQkJdnVuazJiIC09IDE7CisJCX0KKwl9CisKKwlyZXQgPSBSSU5HX1NQQUNFKGV2bywgMTcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQyhudl9jcnRjLT5pbmRleCwgQ0xPQ0spLCAyKTsKKwlPVVRfUklORyhldm8sIGFkanVzdGVkX21vZGUtPmNsb2NrIHwgMHg4MDAwMDApOworCU9VVF9SSU5HKGV2bywgKGFkanVzdGVkX21vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpID8gMiA6IDApOworCisJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX0NSVEMobnZfY3J0Yy0+aW5kZXgsIERJU1BMQVlfU1RBUlQpLCA1KTsKKwlPVVRfUklORyhldm8sIDApOworCU9VVF9SSU5HKGV2bywgKGFkanVzdGVkX21vZGUtPnZ0b3RhbCA8PCAxNikgfCBhZGp1c3RlZF9tb2RlLT5odG90YWwpOworCU9VVF9SSU5HKGV2bywgKHZzeW5jX2R1ciAtIDEpIDw8IDE2IHwgKGhzeW5jX2R1ciAtIDEpKTsKKwlPVVRfUklORyhldm8sICh2c3luY19zdGFydF90b19lbmQgLSAxKSA8PCAxNiB8CisJCQkoaHN5bmNfc3RhcnRfdG9fZW5kIC0gMSkpOworCU9VVF9SSU5HKGV2bywgKHZ1bmsxIC0gMSkgPDwgMTYgfCAoaHVuazEgLSAxKSk7CisKKwlpZiAoYWRqdXN0ZWRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkgeworCQlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQyhudl9jcnRjLT5pbmRleCwgVU5LMDgyNCksIDEpOworCQlPVVRfUklORyhldm8sICh2dW5rMmIgLSAxKSA8PCAxNiB8ICh2dW5rMmEgLSAxKSk7CisJfSBlbHNlIHsKKwkJT1VUX1JJTkcoZXZvLCAwKTsKKwkJT1VUX1JJTkcoZXZvLCAwKTsKKwl9CisKKwlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQyhudl9jcnRjLT5pbmRleCwgVU5LMDgyQyksIDEpOworCU9VVF9SSU5HKGV2bywgMCk7CisKKwkvKiBUaGlzIGlzIHRoZSBhY3R1YWwgcmVzb2x1dGlvbiBvZiB0aGUgbW9kZS4gKi8KKwlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQyhudl9jcnRjLT5pbmRleCwgUkVBTF9SRVMpLCAxKTsKKwlPVVRfUklORyhldm8sIChtb2RlLT52ZGlzcGxheSA8PCAxNikgfCBtb2RlLT5oZGlzcGxheSk7CisJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX0NSVEMobnZfY3J0Yy0+aW5kZXgsIFNDQUxFX0NFTlRFUl9PRkZTRVQpLCAxKTsKKwlPVVRfUklORyhldm8sIE5WNTBfRVZPX0NSVENfU0NBTEVfQ0VOVEVSX09GRlNFVF9WQUwoMCwgMCkpOworCisJbnZfY3J0Yy0+c2V0X2RpdGhlcihudl9jcnRjLCBudl9jb25uZWN0b3ItPnVzZV9kaXRoZXJpbmcsIGZhbHNlKTsKKwludl9jcnRjLT5zZXRfc2NhbGUobnZfY3J0YywgbnZfY29ubmVjdG9yLT5zY2FsaW5nX21vZGUsIGZhbHNlKTsKKworCXJldHVybiBudjUwX2NydGNfZG9fbW9kZV9zZXRfYmFzZShjcnRjLCB4LCB5LCBvbGRfZmIsIGZhbHNlKTsKK30KKworc3RhdGljIGludAorbnY1MF9jcnRjX21vZGVfc2V0X2Jhc2Uoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgeCwgaW50IHksCisJCQlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIpCit7CisJcmV0dXJuIG52NTBfY3J0Y19kb19tb2RlX3NldF9iYXNlKGNydGMsIHgsIHksIG9sZF9mYiwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzIG52NTBfY3J0Y19oZWxwZXJfZnVuY3MgPSB7CisJLmRwbXMgPSBudjUwX2NydGNfZHBtcywKKwkucHJlcGFyZSA9IG52NTBfY3J0Y19wcmVwYXJlLAorCS5jb21taXQgPSBudjUwX2NydGNfY29tbWl0LAorCS5tb2RlX2ZpeHVwID0gbnY1MF9jcnRjX21vZGVfZml4dXAsCisJLm1vZGVfc2V0ID0gbnY1MF9jcnRjX21vZGVfc2V0LAorCS5tb2RlX3NldF9iYXNlID0gbnY1MF9jcnRjX21vZGVfc2V0X2Jhc2UsCisJLmxvYWRfbHV0ID0gbnY1MF9jcnRjX2x1dF9sb2FkLAorfTsKKworaW50CitudjUwX2NydGNfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gTlVMTDsKKwlpbnQgcmV0LCBpOworCisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCW52X2NydGMgPSBremFsbG9jKHNpemVvZigqbnZfY3J0YyksIEdGUF9LRVJORUwpOworCWlmICghbnZfY3J0YykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwludl9jcnRjLT5tb2RlID0ga3phbGxvYyhzaXplb2YoKm52X2NydGMtPm1vZGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW52X2NydGMtPm1vZGUpIHsKKwkJa2ZyZWUobnZfY3J0Yyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIERlZmF1bHQgQ0xVVCBwYXJhbWV0ZXJzLCB3aWxsIGJlIGFjdGl2YXRlZCBvbiB0aGUgaHcgdXBvbgorCSAqIGZpcnN0IG1vZGUgc2V0LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQludl9jcnRjLT5sdXQucltpXSA9IGkgPDwgODsKKwkJbnZfY3J0Yy0+bHV0LmdbaV0gPSBpIDw8IDg7CisJCW52X2NydGMtPmx1dC5iW2ldID0gaSA8PCA4OworCX0KKwludl9jcnRjLT5sdXQuZGVwdGggPSAwOworCisJcmV0ID0gbm91dmVhdV9ib19uZXcoZGV2LCBOVUxMLCA0MDk2LCAweDEwMCwgVFRNX1BMX0ZMQUdfVlJBTSwKKwkJCSAgICAgMCwgMHgwMDAwLCBmYWxzZSwgdHJ1ZSwgJm52X2NydGMtPmx1dC5udmJvKTsKKwlpZiAoIXJldCkgeworCQlyZXQgPSBub3V2ZWF1X2JvX3Bpbihudl9jcnRjLT5sdXQubnZibywgVFRNX1BMX0ZMQUdfVlJBTSk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gbm91dmVhdV9ib19tYXAobnZfY3J0Yy0+bHV0Lm52Ym8pOworCQlpZiAocmV0KQorCQkJbm91dmVhdV9ib19yZWYoTlVMTCwgJm52X2NydGMtPmx1dC5udmJvKTsKKwl9CisKKwlpZiAocmV0KSB7CisJCWtmcmVlKG52X2NydGMtPm1vZGUpOworCQlrZnJlZShudl9jcnRjKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwludl9jcnRjLT5pbmRleCA9IGluZGV4OworCisJLyogc2V0IGZ1bmN0aW9uIHBvaW50ZXJzICovCisJbnZfY3J0Yy0+c2V0X2RpdGhlciA9IG52NTBfY3J0Y19zZXRfZGl0aGVyOworCW52X2NydGMtPnNldF9zY2FsZSA9IG52NTBfY3J0Y19zZXRfc2NhbGU7CisKKwlkcm1fY3J0Y19pbml0KGRldiwgJm52X2NydGMtPmJhc2UsICZudjUwX2NydGNfZnVuY3MpOworCWRybV9jcnRjX2hlbHBlcl9hZGQoJm52X2NydGMtPmJhc2UsICZudjUwX2NydGNfaGVscGVyX2Z1bmNzKTsKKwlkcm1fbW9kZV9jcnRjX3NldF9nYW1tYV9zaXplKCZudl9jcnRjLT5iYXNlLCAyNTYpOworCisJcmV0ID0gbm91dmVhdV9ib19uZXcoZGV2LCBOVUxMLCA2NCo2NCo0LCAweDEwMCwgVFRNX1BMX0ZMQUdfVlJBTSwKKwkJCSAgICAgMCwgMHgwMDAwLCBmYWxzZSwgdHJ1ZSwgJm52X2NydGMtPmN1cnNvci5udmJvKTsKKwlpZiAoIXJldCkgeworCQlyZXQgPSBub3V2ZWF1X2JvX3Bpbihudl9jcnRjLT5jdXJzb3IubnZibywgVFRNX1BMX0ZMQUdfVlJBTSk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gbm91dmVhdV9ib19tYXAobnZfY3J0Yy0+Y3Vyc29yLm52Ym8pOworCQlpZiAocmV0KQorCQkJbm91dmVhdV9ib19yZWYoTlVMTCwgJm52X2NydGMtPmN1cnNvci5udmJvKTsKKwl9CisKKwludjUwX2N1cnNvcl9pbml0KG52X2NydGMpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9jdXJzb3IuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfY3Vyc29yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJlNzlhOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfY3Vyc29yLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFhcnRlbiBNYWF0aHVpcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtX21vZGUuaCIKKworI2RlZmluZSBOT1VWRUFVX0RNQV9ERUJVRyAobm91dmVhdV9yZWdfZGVidWcgJiBOT1VWRUFVX1JFR19ERUJVR19FVk8pCisjaW5jbHVkZSAibm91dmVhdV9yZWcuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY3J0Yy5oIgorI2luY2x1ZGUgIm52NTBfZGlzcGxheS5oIgorCitzdGF0aWMgdm9pZAorbnY1MF9jdXJzb3Jfc2hvdyhzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjLCBib29sIHVwZGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBudl9jcnRjLT5iYXNlLmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqZXZvID0gZGV2X3ByaXYtPmV2bzsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbnZfY3J0Yy0+YmFzZS5kZXY7CisJaW50IHJldDsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwlpZiAodXBkYXRlICYmIG52X2NydGMtPmN1cnNvci52aXNpYmxlKQorCQlyZXR1cm47CisKKwlyZXQgPSBSSU5HX1NQQUNFKGV2bywgKGRldl9wcml2LT5jaGlwc2V0ICE9IDB4NTAgPyA1IDogMykgKyB1cGRhdGUgKiAyKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIm5vIHNwYWNlIHdoaWxlIHVuaGlkaW5nIGN1cnNvclxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHg1MCkgeworCQlCRUdJTl9SSU5HKGV2bywgMCwgTlY4NF9FVk9fQ1JUQyhudl9jcnRjLT5pbmRleCwgQ1VSU09SX0RNQSksIDEpOworCQlPVVRfUklORyhldm8sIE52RXZvVlJBTSk7CisJfQorCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19DUlRDKG52X2NydGMtPmluZGV4LCBDVVJTT1JfQ1RSTCksIDIpOworCU9VVF9SSU5HKGV2bywgTlY1MF9FVk9fQ1JUQ19DVVJTT1JfQ1RSTF9TSE9XKTsKKwlPVVRfUklORyhldm8sIG52X2NydGMtPmN1cnNvci5vZmZzZXQgPj4gOCk7CisKKwlpZiAodXBkYXRlKSB7CisJCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19VUERBVEUsIDEpOworCQlPVVRfUklORyhldm8sIDApOworCQlGSVJFX1JJTkcoZXZvKTsKKwkJbnZfY3J0Yy0+Y3Vyc29yLnZpc2libGUgPSB0cnVlOworCX0KK30KKworc3RhdGljIHZvaWQKK252NTBfY3Vyc29yX2hpZGUoc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YywgYm9vbCB1cGRhdGUpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gbnZfY3J0Yy0+YmFzZS5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2byA9IGRldl9wcml2LT5ldm87CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG52X2NydGMtPmJhc2UuZGV2OworCWludCByZXQ7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJaWYgKHVwZGF0ZSAmJiAhbnZfY3J0Yy0+Y3Vyc29yLnZpc2libGUpCisJCXJldHVybjsKKworCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCAoZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHg1MCA/IDUgOiAzKSArIHVwZGF0ZSAqIDIpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAibm8gc3BhY2Ugd2hpbGUgaGlkaW5nIGN1cnNvclxuIik7CisJCXJldHVybjsKKwl9CisJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX0NSVEMobnZfY3J0Yy0+aW5kZXgsIENVUlNPUl9DVFJMKSwgMik7CisJT1VUX1JJTkcoZXZvLCBOVjUwX0VWT19DUlRDX0NVUlNPUl9DVFJMX0hJREUpOworCU9VVF9SSU5HKGV2bywgMCk7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ICE9IDB4NTApIHsKKwkJQkVHSU5fUklORyhldm8sIDAsIE5WODRfRVZPX0NSVEMobnZfY3J0Yy0+aW5kZXgsIENVUlNPUl9ETUEpLCAxKTsKKwkJT1VUX1JJTkcoZXZvLCBOVjg0X0VWT19DUlRDX0NVUlNPUl9ETUFfSEFORExFX05PTkUpOworCX0KKworCWlmICh1cGRhdGUpIHsKKwkJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX1VQREFURSwgMSk7CisJCU9VVF9SSU5HKGV2bywgMCk7CisJCUZJUkVfUklORyhldm8pOworCQludl9jcnRjLT5jdXJzb3IudmlzaWJsZSA9IGZhbHNlOworCX0KK30KKworc3RhdGljIHZvaWQKK252NTBfY3Vyc29yX3NldF9wb3Moc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YywgaW50IHgsIGludCB5KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBudl9jcnRjLT5iYXNlLmRldjsKKworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NVUlNPUl9VU0VSX1BPUyhudl9jcnRjLT5pbmRleCksCisJCSgoeSAmIDB4RkZGRikgPDwgMTYpIHwgKHggJiAweEZGRkYpKTsKKwkvKiBOZWVkZWQgdG8gbWFrZSB0aGUgY3Vyc29yIG1vdmUuICovCisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ1VSU09SX1VTRVJfUE9TX0NUUkwobnZfY3J0Yy0+aW5kZXgpLCAwKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfY3Vyc29yX3NldF9vZmZzZXQoc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YywgdWludDMyX3Qgb2Zmc2V0KQoreworCU5WX0RFQlVHKG52X2NydGMtPmJhc2UuZGV2LCAiXG4iKTsKKwlpZiAob2Zmc2V0ID09IG52X2NydGMtPmN1cnNvci5vZmZzZXQpCisJCXJldHVybjsKKworCW52X2NydGMtPmN1cnNvci5vZmZzZXQgPSBvZmZzZXQ7CisJaWYgKG52X2NydGMtPmN1cnNvci52aXNpYmxlKSB7CisJCW52X2NydGMtPmN1cnNvci52aXNpYmxlID0gZmFsc2U7CisJCW52X2NydGMtPmN1cnNvci5zaG93KG52X2NydGMsIHRydWUpOworCX0KK30KKworaW50CitudjUwX2N1cnNvcl9pbml0KHN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMpCit7CisJbnZfY3J0Yy0+Y3Vyc29yLnNldF9vZmZzZXQgPSBudjUwX2N1cnNvcl9zZXRfb2Zmc2V0OworCW52X2NydGMtPmN1cnNvci5zZXRfcG9zID0gbnY1MF9jdXJzb3Jfc2V0X3BvczsKKwludl9jcnRjLT5jdXJzb3IuaGlkZSA9IG52NTBfY3Vyc29yX2hpZGU7CisJbnZfY3J0Yy0+Y3Vyc29yLnNob3cgPSBudjUwX2N1cnNvcl9zaG93OworCXJldHVybiAwOworfQorCit2b2lkCitudjUwX2N1cnNvcl9maW5pKHN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG52X2NydGMtPmJhc2UuZGV2OworCWludCBpZHggPSBudl9jcnRjLT5pbmRleDsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DVVJTT1JfQ1VSU09SX0NUUkwyKGlkeCksIDApOworCWlmICghbnZfd2FpdChOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDIoaWR4KSwKKwkJICAgICBOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDJfU1RBVFVTLCAwKSkgeworCQlOVl9FUlJPUihkZXYsICJ0aW1lb3V0OiBDVVJTT1JfQ1RSTDJfU1RBVFVTID09IDBcbiIpOworCQlOVl9FUlJPUihkZXYsICJDVVJTT1JfQ1RSTDIgPSAweCUwOHhcbiIsCisJCQkgbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMihpZHgpKSk7CisJfQorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2RhYy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjU4MzhlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kYWMuYwpAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYWFydGVuIE1hYXRodWlzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKworI2RlZmluZSBOT1VWRUFVX0RNQV9ERUJVRyAobm91dmVhdV9yZWdfZGVidWcgJiBOT1VWRUFVX1JFR19ERUJVR19FVk8pCisjaW5jbHVkZSAibm91dmVhdV9yZWcuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZG1hLmgiCisjaW5jbHVkZSAibm91dmVhdV9lbmNvZGVyLmgiCisjaW5jbHVkZSAibm91dmVhdV9jb25uZWN0b3IuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2NydGMuaCIKKyNpbmNsdWRlICJudjUwX2Rpc3BsYXkuaCIKKworc3RhdGljIHZvaWQKK252NTBfZGFjX2Rpc2Nvbm5lY3Qoc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gdG9fZHJtX2VuY29kZXIobnZfZW5jb2RlciktPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2byA9IGRldl9wcml2LT5ldm87CisJaW50IHJldDsKKworCU5WX0RFQlVHKGRldiwgIkRpc2Nvbm5lY3RpbmcgREFDICVkXG4iLCBudl9lbmNvZGVyLT5vcik7CisKKwlyZXQgPSBSSU5HX1NQQUNFKGV2bywgMik7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJubyBzcGFjZSB3aGlsZSBkaXNjb25uZWN0aW5nIERBQ1xuIik7CisJCXJldHVybjsKKwl9CisJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX0RBQyhudl9lbmNvZGVyLT5vciwgTU9ERV9DVFJMKSwgMSk7CisJT1VUX1JJTkcoZXZvLCAwKTsKK30KKworc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMKK252NTBfZGFjX2RldGVjdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKwl1aW50MzJfdCBkcG1zX3N0YXRlLCBsb2FkX3BhdHRlcm4sIGxvYWRfc3RhdGU7CisJaW50IG9yID0gbnZfZW5jb2Rlci0+b3I7CisKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9EQUNfQ0xLX0NUUkwxKG9yKSwgMHgwMDAwMDAwMSk7CisJZHBtc19zdGF0ZSA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkwob3IpKTsKKworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkwob3IpLAorCQkweDAwMTUwMDAwIHwgTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMX1BFTkRJTkcpOworCWlmICghbnZfd2FpdChOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkwob3IpLAorCQkgICAgIE5WNTBfUERJU1BMQVlfREFDX0RQTVNfQ1RSTF9QRU5ESU5HLCAwKSkgeworCQlOVl9FUlJPUihkZXYsICJ0aW1lb3V0OiBEQUNfRFBNU19DVFJMX1BFTkRJTkcoJWQpID09IDBcbiIsIG9yKTsKKwkJTlZfRVJST1IoZGV2LCAiREFDX0RQTVNfQ1RSTCglZCkgPSAweCUwOHhcbiIsIG9yLAorCQkJICBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMKG9yKSkpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIFVzZSBiaW9zIHByb3ZpZGVkIHZhbHVlIGlmIHBvc3NpYmxlLiAqLworCWlmIChkZXZfcHJpdi0+dmJpb3MtPmRhY3Rlc3R2YWwpIHsKKwkJbG9hZF9wYXR0ZXJuID0gZGV2X3ByaXYtPnZiaW9zLT5kYWN0ZXN0dmFsOworCQlOVl9ERUJVRyhkZXYsICJVc2luZyBiaW9zIHByb3ZpZGVkIGxvYWRfcGF0dGVybiBvZiAlZFxuIiwKKwkJCSAgbG9hZF9wYXR0ZXJuKTsKKwl9IGVsc2UgeworCQlsb2FkX3BhdHRlcm4gPSAzNDA7CisJCU5WX0RFQlVHKGRldiwgIlVzaW5nIGRlZmF1bHQgbG9hZF9wYXR0ZXJuIG9mICVkXG4iLAorCQkJIGxvYWRfcGF0dGVybik7CisJfQorCisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfREFDX0xPQURfQ1RSTChvciksCisJCU5WNTBfUERJU1BMQVlfREFDX0xPQURfQ1RSTF9BQ1RJVkUgfCBsb2FkX3BhdHRlcm4pOworCW1kZWxheSg0NSk7IC8qIGdpdmUgaXQgc29tZSB0aW1lIHRvIHByb2Nlc3MgKi8KKwlsb2FkX3N0YXRlID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfREFDX0xPQURfQ1RSTChvcikpOworCisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfREFDX0xPQURfQ1RSTChvciksIDApOworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkwob3IpLCBkcG1zX3N0YXRlIHwKKwkJTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMX1BFTkRJTkcpOworCisJaWYgKChsb2FkX3N0YXRlICYgTlY1MF9QRElTUExBWV9EQUNfTE9BRF9DVFJMX1BSRVNFTlQpID09CisJCQkgIE5WNTBfUERJU1BMQVlfREFDX0xPQURfQ1RSTF9QUkVTRU5UKQorCQlzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKworCWlmIChzdGF0dXMgPT0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQpCisJCU5WX0RFQlVHKGRldiwgIkxvYWQgd2FzIGRldGVjdGVkIG9uIG91dHB1dCB3aXRoIG9yICVkXG4iLCBvcik7CisJZWxzZQorCQlOVl9ERUJVRyhkZXYsICJMb2FkIHdhcyBub3QgZGV0ZWN0ZWQgb24gb3V0cHV0IHdpdGggb3IgJWRcbiIsIG9yKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2RhY19kcG1zKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXVpbnQzMl90IHZhbDsKKwlpbnQgb3IgPSBudl9lbmNvZGVyLT5vcjsKKworCU5WX0RFQlVHKGRldiwgIm9yICVkIG1vZGUgJWRcbiIsIG9yLCBtb2RlKTsKKworCS8qIHdhaXQgZm9yIGl0IHRvIGJlIGRvbmUgKi8KKwlpZiAoIW52X3dhaXQoTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMKG9yKSwKKwkJICAgICBOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkxfUEVORElORywgMCkpIHsKKwkJTlZfRVJST1IoZGV2LCAidGltZW91dDogREFDX0RQTVNfQ1RSTF9QRU5ESU5HKCVkKSA9PSAwXG4iLCBvcik7CisJCU5WX0VSUk9SKGRldiwgIkRBQ19EUE1TX0NUUkwoJWQpID0gMHglMDh4XG4iLCBvciwKKwkJCSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMKG9yKSkpOworCQlyZXR1cm47CisJfQorCisJdmFsID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfREFDX0RQTVNfQ1RSTChvcikpICYgfjB4N0Y7CisKKwlpZiAobW9kZSAhPSBEUk1fTU9ERV9EUE1TX09OKQorCQl2YWwgfD0gTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMX0JMQU5LRUQ7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIERSTV9NT0RFX0RQTVNfU1RBTkRCWToKKwkJdmFsIHw9IE5WNTBfUERJU1BMQVlfREFDX0RQTVNfQ1RSTF9IU1lOQ19PRkY7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfRFBNU19TVVNQRU5EOgorCQl2YWwgfD0gTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMX1ZTWU5DX09GRjsKKwkJYnJlYWs7CisJY2FzZSBEUk1fTU9ERV9EUE1TX09GRjoKKwkJdmFsIHw9IE5WNTBfUERJU1BMQVlfREFDX0RQTVNfQ1RSTF9PRkY7CisJCXZhbCB8PSBOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkxfSFNZTkNfT0ZGOworCQl2YWwgfD0gTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMX1ZTWU5DX09GRjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfREFDX0RQTVNfQ1RSTChvciksIHZhbCB8CisJCU5WNTBfUERJU1BMQVlfREFDX0RQTVNfQ1RSTF9QRU5ESU5HKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfZGFjX3NhdmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCU5WX0VSUk9SKGVuY29kZXItPmRldiwgIiEhXG4iKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfZGFjX3Jlc3RvcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCU5WX0VSUk9SKGVuY29kZXItPmRldiwgIiEhXG4iKTsKK30KKworc3RhdGljIGJvb2wKK252NTBfZGFjX21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpjb25uZWN0b3I7CisKKwlOVl9ERUJVRyhlbmNvZGVyLT5kZXYsICJvciAlZFxuIiwgbnZfZW5jb2Rlci0+b3IpOworCisJY29ubmVjdG9yID0gbm91dmVhdV9lbmNvZGVyX2Nvbm5lY3Rvcl9nZXQobnZfZW5jb2Rlcik7CisJaWYgKCFjb25uZWN0b3IpIHsKKwkJTlZfRVJST1IoZW5jb2Rlci0+ZGV2LCAiRW5jb2RlciBoYXMgbm8gY29ubmVjdG9yXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChjb25uZWN0b3ItPnNjYWxpbmdfbW9kZSAhPSBEUk1fTU9ERV9TQ0FMRV9OT05FICYmCisJICAgICBjb25uZWN0b3ItPm5hdGl2ZV9tb2RlKSB7CisJCWludCBpZCA9IGFkanVzdGVkX21vZGUtPmJhc2UuaWQ7CisJCSphZGp1c3RlZF9tb2RlID0gKmNvbm5lY3Rvci0+bmF0aXZlX21vZGU7CisJCWFkanVzdGVkX21vZGUtPmJhc2UuaWQgPSBpZDsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQKK252NTBfZGFjX3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworfQorCitzdGF0aWMgdm9pZAorbnY1MF9kYWNfY29tbWl0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKK30KKworc3RhdGljIHZvaWQKK252NTBfZGFjX21vZGVfc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqZXZvID0gZGV2X3ByaXYtPmV2bzsKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpjcnRjID0gbm91dmVhdV9jcnRjKGVuY29kZXItPmNydGMpOworCXVpbnQzMl90IG1vZGVfY3RsID0gMCwgbW9kZV9jdGwyID0gMDsKKwlpbnQgcmV0OworCisJTlZfREVCVUcoZGV2LCAib3IgJWRcbiIsIG52X2VuY29kZXItPm9yKTsKKworCW52NTBfZGFjX2RwbXMoZW5jb2RlciwgRFJNX01PREVfRFBNU19PTik7CisKKwlpZiAoY3J0Yy0+aW5kZXggPT0gMSkKKwkJbW9kZV9jdGwgfD0gTlY1MF9FVk9fREFDX01PREVfQ1RSTF9DUlRDMTsKKwllbHNlCisJCW1vZGVfY3RsIHw9IE5WNTBfRVZPX0RBQ19NT0RFX0NUUkxfQ1JUQzA7CisKKwkvKiBMYWNraW5nIGEgd29ya2luZyB0di1vdXQsIHRoaXMgaXMgbm90IGEgMTAwJSBzdXJlLiAqLworCWlmIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX0FOQUxPRykKKwkJbW9kZV9jdGwgfD0gMHg0MDsKKwllbHNlCisJaWYgKG52X2VuY29kZXItPmRjYi0+dHlwZSA9PSBPVVRQVVRfVFYpCisJCW1vZGVfY3RsIHw9IDB4MTAwOworCisJaWYgKGFkanVzdGVkX21vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19OSFNZTkMpCisJCW1vZGVfY3RsMiB8PSBOVjUwX0VWT19EQUNfTU9ERV9DVFJMMl9OSFNZTkM7CisKKwlpZiAoYWRqdXN0ZWRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX05WU1lOQykKKwkJbW9kZV9jdGwyIHw9IE5WNTBfRVZPX0RBQ19NT0RFX0NUUkwyX05WU1lOQzsKKworCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCAzKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIm5vIHNwYWNlIHdoaWxlIGNvbm5lY3RpbmcgREFDXG4iKTsKKwkJcmV0dXJuOworCX0KKwlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fREFDKG52X2VuY29kZXItPm9yLCBNT0RFX0NUUkwpLCAyKTsKKwlPVVRfUklORyhldm8sIG1vZGVfY3RsKTsKKwlPVVRfUklORyhldm8sIG1vZGVfY3RsMik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIG52NTBfZGFjX2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcyA9IG52NTBfZGFjX2RwbXMsCisJLnNhdmUgPSBudjUwX2RhY19zYXZlLAorCS5yZXN0b3JlID0gbnY1MF9kYWNfcmVzdG9yZSwKKwkubW9kZV9maXh1cCA9IG52NTBfZGFjX21vZGVfZml4dXAsCisJLnByZXBhcmUgPSBudjUwX2RhY19wcmVwYXJlLAorCS5jb21taXQgPSBudjUwX2RhY19jb21taXQsCisJLm1vZGVfc2V0ID0gbnY1MF9kYWNfbW9kZV9zZXQsCisJLmRldGVjdCA9IG52NTBfZGFjX2RldGVjdAorfTsKKworc3RhdGljIHZvaWQKK252NTBfZGFjX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisKKwlpZiAoIWVuY29kZXIpCisJCXJldHVybjsKKworCU5WX0RFQlVHKGVuY29kZXItPmRldiwgIlxuIik7CisKKwlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOworCWtmcmVlKG52X2VuY29kZXIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIG52NTBfZGFjX2VuY29kZXJfZnVuY3MgPSB7CisJLmRlc3Ryb3kgPSBudjUwX2RhY19kZXN0cm95LAorfTsKKworaW50CitudjUwX2RhY19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZW50cnkpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCU5WX0lORk8oZGV2LCAiRGV0ZWN0ZWQgYSBEQUMgb3V0cHV0XG4iKTsKKworCW52X2VuY29kZXIgPSBremFsbG9jKHNpemVvZigqbnZfZW5jb2RlciksIEdGUF9LRVJORUwpOworCWlmICghbnZfZW5jb2RlcikKKwkJcmV0dXJuIC1FTk9NRU07CisJZW5jb2RlciA9IHRvX2RybV9lbmNvZGVyKG52X2VuY29kZXIpOworCisJbnZfZW5jb2Rlci0+ZGNiID0gZW50cnk7CisJbnZfZW5jb2Rlci0+b3IgPSBmZnMoZW50cnktPm9yKSAtIDE7CisKKwludl9lbmNvZGVyLT5kaXNjb25uZWN0ID0gbnY1MF9kYWNfZGlzY29ubmVjdDsKKworCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmbnY1MF9kYWNfZW5jb2Rlcl9mdW5jcywKKwkJCSBEUk1fTU9ERV9FTkNPREVSX0RBQyk7CisJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVyLCAmbnY1MF9kYWNfaGVscGVyX2Z1bmNzKTsKKworCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gZW50cnktPmhlYWRzOworCWVuY29kZXItPnBvc3NpYmxlX2Nsb25lcyA9IDA7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjNWVlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5jCkBAIC0wLDAgKzEsMTAxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYWFydGVuIE1hYXRodWlzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgIm52NTBfZGlzcGxheS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY3J0Yy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZW5jb2Rlci5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY29ubmVjdG9yLmgiCisjaW5jbHVkZSAibm91dmVhdV9mYi5oIgorI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgorCitzdGF0aWMgdm9pZAorbnY1MF9ldm9fY2hhbm5lbF9kZWwoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKnBjaGFuKQoreworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSAqcGNoYW47CisKKwlpZiAoIWNoYW4pCisJCXJldHVybjsKKwkqcGNoYW4gPSBOVUxMOworCisJbm91dmVhdV9ncHVvYmpfY2hhbm5lbF90YWtlZG93bihjaGFuKTsKKwlub3V2ZWF1X2JvX3JlZihOVUxMLCAmY2hhbi0+cHVzaGJ1Zl9ibyk7CisKKwlpZiAoY2hhbi0+dXNlcikKKwkJaW91bm1hcChjaGFuLT51c2VyKTsKKworCWtmcmVlKGNoYW4pOworfQorCitzdGF0aWMgaW50CitudjUwX2V2b19kbWFvYmpfbmV3KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2bywgdWludDMyX3QgY2xhc3MsIHVpbnQzMl90IG5hbWUsCisJCSAgICB1aW50MzJfdCB0aWxlX2ZsYWdzLCB1aW50MzJfdCBtYWdpY19mbGFncywKKwkJICAgIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgbGltaXQpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZXZvLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBldm8tPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKm9iaiA9IE5VTEw7CisJaW50IHJldDsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIGV2bywgNio0LCAzMiwgMCwgJm9iaik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlvYmotPmVuZ2luZSA9IE5WT0JKX0VOR0lORV9ESVNQTEFZOworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfcmVmX2FkZChkZXYsIGV2bywgbmFtZSwgb2JqLCBOVUxMKTsKKwlpZiAocmV0KSB7CisJCW5vdXZlYXVfZ3B1b2JqX2RlbChkZXYsICZvYmopOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCW52X3dvMzIoZGV2LCBvYmosIDAsICh0aWxlX2ZsYWdzIDw8IDIyKSB8IChtYWdpY19mbGFncyA8PCAxNikgfCBjbGFzcyk7CisJbnZfd28zMihkZXYsIG9iaiwgMSwgbGltaXQpOworCW52X3dvMzIoZGV2LCBvYmosIDIsIG9mZnNldCk7CisJbnZfd28zMihkZXYsIG9iaiwgMywgMHgwMDAwMDAwMCk7CisJbnZfd28zMihkZXYsIG9iaiwgNCwgMHgwMDAwMDAwMCk7CisJbnZfd28zMihkZXYsIG9iaiwgNSwgMHgwMDAxMDAwMCk7CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitudjUwX2V2b19jaGFubmVsX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoqcGNoYW4pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOworCWludCByZXQ7CisKKwljaGFuID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCksIEdGUF9LRVJORUwpOworCWlmICghY2hhbikKKwkJcmV0dXJuIC1FTk9NRU07CisJKnBjaGFuID0gY2hhbjsKKworCWNoYW4tPmlkID0gLTE7CisJY2hhbi0+ZGV2ID0gZGV2OworCWNoYW4tPnVzZXJfZ2V0ID0gNDsKKwljaGFuLT51c2VyX3B1dCA9IDA7CisKKwlJTklUX0xJU1RfSEVBRCgmY2hhbi0+cmFtaHRfcmVmcyk7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfcmVmKGRldiwgTlVMTCwgTlVMTCwgMCwgMzI3NjgsIDB4MTAwMCwKKwkJCQkgICAgIE5WT0JKX0ZMQUdfWkVST19BTExPQywgJmNoYW4tPnJhbWluKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIGFsbG9jYXRpbmcgRVZPIGNoYW5uZWwgbWVtb3J5OiAlZFxuIiwgcmV0KTsKKwkJbnY1MF9ldm9fY2hhbm5lbF9kZWwocGNoYW4pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IG5vdXZlYXVfbWVtX2luaXRfaGVhcCgmY2hhbi0+cmFtaW5faGVhcCwgY2hhbi0+cmFtaW4tPmdwdW9iai0+CisJCQkJICAgIGltX3ByYW1pbi0+c3RhcnQsIDMyNzY4KTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIGluaXRpYWxpc2luZyBFVk8gUFJBTUlOIGhlYXA6ICVkXG4iLCByZXQpOworCQludjUwX2V2b19jaGFubmVsX2RlbChwY2hhbik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X3JlZihkZXYsIGNoYW4sIGNoYW4sIDAsIDQwOTYsIDE2LAorCQkJCSAgICAgMCwgJmNoYW4tPnJhbWh0KTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBFVk8gUkFNSFQ6ICVkXG4iLCByZXQpOworCQludjUwX2V2b19jaGFubmVsX2RlbChwY2hhbik7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGRldl9wcml2LT5jaGlwc2V0ICE9IDB4NTApIHsKKwkJcmV0ID0gbnY1MF9ldm9fZG1hb2JqX25ldyhjaGFuLCAweDNkLCBOdkV2b0ZCMTYsIDB4NzAsIDB4MTksCisJCQkJCSAgMCwgMHhmZmZmZmZmZik7CisJCWlmIChyZXQpIHsKKwkJCW52NTBfZXZvX2NoYW5uZWxfZGVsKHBjaGFuKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCisJCXJldCA9IG52NTBfZXZvX2RtYW9ial9uZXcoY2hhbiwgMHgzZCwgTnZFdm9GQjMyLCAweDdhLCAweDE5LAorCQkJCQkgIDAsIDB4ZmZmZmZmZmYpOworCQlpZiAocmV0KSB7CisJCQludjUwX2V2b19jaGFubmVsX2RlbChwY2hhbik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0ID0gbnY1MF9ldm9fZG1hb2JqX25ldyhjaGFuLCAweDNkLCBOdkV2b1ZSQU0sIDAsIDB4MTksCisJCQkJICAwLCBub3V2ZWF1X21lbV9mYl9hbW91bnQoZGV2KSk7CisJaWYgKHJldCkgeworCQludjUwX2V2b19jaGFubmVsX2RlbChwY2hhbik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbm91dmVhdV9ib19uZXcoZGV2LCBOVUxMLCA0MDk2LCAwLCBUVE1fUExfRkxBR19WUkFNLCAwLCAwLAorCQkJICAgICBmYWxzZSwgdHJ1ZSwgJmNoYW4tPnB1c2hidWZfYm8pOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gbm91dmVhdV9ib19waW4oY2hhbi0+cHVzaGJ1Zl9ibywgVFRNX1BMX0ZMQUdfVlJBTSk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBFVk8gRE1BIHB1c2ggYnVmZmVyOiAlZFxuIiwgcmV0KTsKKwkJbnY1MF9ldm9fY2hhbm5lbF9kZWwocGNoYW4pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IG5vdXZlYXVfYm9fbWFwKGNoYW4tPnB1c2hidWZfYm8pOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiRXJyb3IgbWFwcGluZyBFVk8gRE1BIHB1c2ggYnVmZmVyOiAlZFxuIiwgcmV0KTsKKwkJbnY1MF9ldm9fY2hhbm5lbF9kZWwocGNoYW4pOworCQlyZXR1cm4gcmV0OworCX0KKworCWNoYW4tPnVzZXIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDApICsKKwkJCQkJTlY1MF9QRElTUExBWV9VU0VSKDApLCBQQUdFX1NJWkUpOworCWlmICghY2hhbi0+dXNlcikgeworCQlOVl9FUlJPUihkZXYsICJFcnJvciBtYXBwaW5nIEVWTyBjb250cm9sIHJlZ3MuXG4iKTsKKwkJbnY1MF9ldm9fY2hhbm5lbF9kZWwocGNoYW4pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50CitudjUwX2Rpc3BsYXlfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfdGltZXJfZW5naW5lICpwdGltZXIgPSAmZGV2X3ByaXYtPmVuZ2luZS50aW1lcjsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm8gPSBkZXZfcHJpdi0+ZXZvOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJdWludDMyX3QgdmFsLCByYW1fYW1vdW50LCBocGRfZW5bMl07CisJdWludDY0X3Qgc3RhcnQ7CisJaW50IHJldCwgaTsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwludl93cjMyKGRldiwgMHgwMDYxMDE4NCwgbnZfcmQzMihkZXYsIDB4MDA2MTQwMDQpKTsKKwkvKgorCSAqIEkgdGhpbmsgdGhlIDB4MDA2MTAxWFggcmFuZ2UgaXMgc29tZSBraW5kIG9mIG1haW4gY29udHJvbCBhcmVhCisJICogdGhhdCBlbmFibGVzIHRoaW5ncy4KKwkgKi8KKwkvKiBDUlRDPyAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJdmFsID0gbnZfcmQzMihkZXYsIDB4MDA2MTYxMDAgKyAoaSAqIDB4ODAwKSk7CisJCW52X3dyMzIoZGV2LCAweDAwNjEwMTkwICsgKGkgKiAweDEwKSwgdmFsKTsKKwkJdmFsID0gbnZfcmQzMihkZXYsIDB4MDA2MTYxMDQgKyAoaSAqIDB4ODAwKSk7CisJCW52X3dyMzIoZGV2LCAweDAwNjEwMTk0ICsgKGkgKiAweDEwKSwgdmFsKTsKKwkJdmFsID0gbnZfcmQzMihkZXYsIDB4MDA2MTYxMDggKyAoaSAqIDB4ODAwKSk7CisJCW52X3dyMzIoZGV2LCAweDAwNjEwMTk4ICsgKGkgKiAweDEwKSwgdmFsKTsKKwkJdmFsID0gbnZfcmQzMihkZXYsIDB4MDA2MTYxMGMgKyAoaSAqIDB4ODAwKSk7CisJCW52X3dyMzIoZGV2LCAweDAwNjEwMTljICsgKGkgKiAweDEwKSwgdmFsKTsKKwl9CisJLyogREFDICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQl2YWwgPSBudl9yZDMyKGRldiwgMHgwMDYxYTAwMCArIChpICogMHg4MDApKTsKKwkJbnZfd3IzMihkZXYsIDB4MDA2MTAxZDAgKyAoaSAqIDB4MDQpLCB2YWwpOworCX0KKwkvKiBTT1IgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXZhbCA9IG52X3JkMzIoZGV2LCAweDAwNjFjMDAwICsgKGkgKiAweDgwMCkpOworCQludl93cjMyKGRldiwgMHgwMDYxMDFlMCArIChpICogMHgwNCksIHZhbCk7CisJfQorCS8qIFNvbWV0aGluZyBub3QgeWV0IGluIHVzZSwgdHYtb3V0IG1heWJlLiAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJdmFsID0gbnZfcmQzMihkZXYsIDB4MDA2MWUwMDAgKyAoaSAqIDB4ODAwKSk7CisJCW52X3dyMzIoZGV2LCAweDAwNjEwMWYwICsgKGkgKiAweDA0KSwgdmFsKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkwoaSksIDB4MDA1NTAwMDAgfAorCQkJTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMX1BFTkRJTkcpOworCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9EQUNfQ0xLX0NUUkwxKGkpLCAweDAwMDAwMDAxKTsKKwl9CisKKwkvKiBUaGlzIHVzZWQgdG8gYmUgaW4gY3J0YyB1bmJsYW5rLCBidXQgc2VlbXMgb3V0IG9mIHBsYWNlIHRoZXJlLiAqLworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX1VOS18zODAsIDApOworCS8qIFJBTSBpcyBjbGFtcGVkIHRvIDI1NiBNaUIuICovCisJcmFtX2Ftb3VudCA9IG5vdXZlYXVfbWVtX2ZiX2Ftb3VudChkZXYpOworCU5WX0RFQlVHKGRldiwgInJhbV9hbW91bnQgJWRcbiIsIHJhbV9hbW91bnQpOworCWlmIChyYW1fYW1vdW50ID4gMjU2KjEwMjQqMTAyNCkKKwkJcmFtX2Ftb3VudCA9IDI1NioxMDI0KjEwMjQ7CisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfUkFNX0FNT1VOVCwgcmFtX2Ftb3VudCAtIDEpOworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX1VOS18zODgsIDB4MTUwMDAwKTsKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9VTktfMzhDLCAwKTsKKworCS8qIFRoZSBwcmVjaXNlIHB1cnBvc2UgaXMgdW5rbm93biwgaSBzdXNwZWN0IGl0IGhhcyBzb21ldGhpbmcgdG8gZG8KKwkgKiB3aXRoIHRleHQgbW9kZS4KKwkgKi8KKwlpZiAobnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl8xKSAmIDB4MTAwKSB7CisJCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfMSwgMHgxMDApOworCQludl93cjMyKGRldiwgMHgwMDYxOTRlOCwgbnZfcmQzMihkZXYsIDB4MDA2MTk0ZTgpICYgfjEpOworCQlpZiAoIW52X3dhaXQoMHgwMDYxOTRlOCwgMiwgMCkpIHsKKwkJCU5WX0VSUk9SKGRldiwgInRpbWVvdXQ6ICgweDYxOTRlOCAmIDIpICE9IDBcbiIpOworCQkJTlZfRVJST1IoZGV2LCAiMHg2MTk0ZTggPSAweCUwOHhcbiIsCisJCQkJCQludl9yZDMyKGRldiwgMHg2MTk0ZTgpKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwkvKiB0YWtlbiBmcm9tIG52IGJ1ZyAjMTI2MzcsIGF0dGVtcHRzIHRvIHVuLXdlZGdlIHRoZSBodyBpZiBpdCdzCisJICogc3R1Y2sgaW4gc29tZSB1bnNwZWNpZmllZCBzdGF0ZQorCSAqLworCXN0YXJ0ID0gcHRpbWVyLT5yZWFkKGRldik7CisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApLCAweDJiMDApOworCXdoaWxlICgodmFsID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApKSkgJiAweDFlMDAwMCkgeworCQlpZiAoKHZhbCAmIDB4OWYwMDAwKSA9PSAweDIwMDAwKQorCQkJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApLAorCQkJCQkJCXZhbCB8IDB4ODAwMDAwKTsKKworCQlpZiAoKHZhbCAmIDB4M2YwMDAwKSA9PSAweDMwMDAwKQorCQkJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApLAorCQkJCQkJCXZhbCB8IDB4MjAwMDAwKTsKKworCQlpZiAocHRpbWVyLT5yZWFkKGRldikgLSBzdGFydCA+IDEwMDAwMDAwMDBVTEwpIHsKKwkJCU5WX0VSUk9SKGRldiwgInRpbWVvdXQ6ICgweDYxMDIwMCAmIDB4MWUwMDAwKSAhPSAwXG4iKTsKKwkJCU5WX0VSUk9SKGRldiwgIjB4NjEwMjAwID0gMHglMDh4XG4iLCB2YWwpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NUUkxfU1RBVEUsIE5WNTBfUERJU1BMQVlfQ1RSTF9TVEFURV9FTkFCTEUpOworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVCgwKSwgMHgxMDAwYjAzKTsKKwlpZiAoIW52X3dhaXQoTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVQoMCksIDB4NDAwMDAwMDAsIDB4NDAwMDAwMDApKSB7CisJCU5WX0VSUk9SKGRldiwgInRpbWVvdXQ6ICgweDYxMDIwMCAmIDB4NDAwMDAwMDApID09IDB4NDAwMDAwMDBcbiIpOworCQlOVl9FUlJPUihkZXYsICIweDYxMDIwMCA9IDB4JTA4eFxuIiwKKwkJCSAgbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApKSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DVVJTT1JfQ1VSU09SX0NUUkwyKGkpLCAweDIwMDApOworCQlpZiAoIW52X3dhaXQoTlY1MF9QRElTUExBWV9DVVJTT1JfQ1VSU09SX0NUUkwyKGkpLAorCQkJICAgICBOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDJfU1RBVFVTLCAwKSkgeworCQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogQ1VSU09SX0NUUkwyX1NUQVRVUyA9PSAwXG4iKTsKKwkJCU5WX0VSUk9SKGRldiwgIkNVUlNPUl9DVFJMMiA9IDB4JTA4eFxuIiwKKwkJCQkgbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMihpKSkpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDIoaSksCisJCQlOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDJfT04pOworCQlpZiAoIW52X3dhaXQoTlY1MF9QRElTUExBWV9DVVJTT1JfQ1VSU09SX0NUUkwyKGkpLAorCQkJICAgICBOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDJfU1RBVFVTLAorCQkJICAgICBOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDJfU1RBVFVTX0FDVElWRSkpIHsKKwkJCU5WX0VSUk9SKGRldiwgInRpbWVvdXQ6ICIKKwkJCQkgICAgICAiQ1VSU09SX0NUUkwyX1NUQVRVU19BQ1RJVkUoJWQpXG4iLCBpKTsKKwkJCU5WX0VSUk9SKGRldiwgIkNVUlNPUl9DVFJMMiglZCkgPSAweCUwOHhcbiIsIGksCisJCQkJIG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDIoaSkpKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9PQkpFQ1RTLCAoZXZvLT5yYW1pbi0+aW5zdGFuY2UgPj4gOCkgfCA5KTsKKworCS8qIGluaXRpYWxpc2UgZmlmbyAqLworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NIQU5ORUxfRE1BX0NCKDApLAorCQkoKGV2by0+cHVzaGJ1Zl9iby0+Ym8ubWVtLm1tX25vZGUtPnN0YXJ0IDw8IFBBR0VfU0hJRlQpID4+IDgpIHwKKwkJTlY1MF9QRElTUExBWV9DSEFOTkVMX0RNQV9DQl9MT0NBVElPTl9WUkFNIHwKKwkJTlY1MF9QRElTUExBWV9DSEFOTkVMX0RNQV9DQl9WQUxJRCk7CisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9VTksyKDApLCAweDAwMDEwMDAwKTsKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX1VOSzMoMCksIDB4MDAwMDAwMDIpOworCWlmICghbnZfd2FpdCgweDYxMDIwMCwgMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCkpIHsKKwkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4NjEwMjAwICYgMHg4MDAwMDAwMCkgPT0gMFxuIik7CisJCU5WX0VSUk9SKGRldiwgIjB4NjEwMjAwID0gMHglMDh4XG4iLCBudl9yZDMyKGRldiwgMHg2MTAyMDApKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApLAorCQkobnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApKSAmIH4weDAwMDAwMDAzKSB8CisJCSBOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVF9ETUFfRU5BQkxFRCk7CisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfVVNFUl9QVVQoMCksIDApOworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVCgwKSwgMHgwMTAwMDAwMyB8CisJCU5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUX0RNQV9FTkFCTEVEKTsKKwludl93cjMyKGRldiwgMHg2MTAzMDAsIG52X3JkMzIoZGV2LCAweDYxMDMwMCkgJiB+MSk7CisKKwlldm8tPmRtYS5tYXggPSAoNDA5Ni80KSAtIDI7CisJZXZvLT5kbWEucHV0ID0gMDsKKwlldm8tPmRtYS5jdXIgPSBldm8tPmRtYS5wdXQ7CisJZXZvLT5kbWEuZnJlZSA9IGV2by0+ZG1hLm1heCAtIGV2by0+ZG1hLmN1cjsKKworCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCBOT1VWRUFVX0RNQV9TS0lQUyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBOT1VWRUFVX0RNQV9TS0lQUzsgaSsrKQorCQlPVVRfUklORyhldm8sIDApOworCisJcmV0ID0gUklOR19TUEFDRShldm8sIDExKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19VTks4NCwgMik7CisJT1VUX1JJTkcoZXZvLCBOVjUwX0VWT19VTks4NF9OT1RJRllfRElTQUJMRUQpOworCU9VVF9SSU5HKGV2bywgTlY1MF9FVk9fRE1BX05PVElGWV9IQU5ETEVfTk9ORSk7CisJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX0NSVEMoMCwgRkJfRE1BKSwgMSk7CisJT1VUX1JJTkcoZXZvLCBOVjUwX0VWT19DUlRDX0ZCX0RNQV9IQU5ETEVfTk9ORSk7CisJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX0NSVEMoMCwgVU5LMDgwMCksIDEpOworCU9VVF9SSU5HKGV2bywgMCk7CisJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX0NSVEMoMCwgRElTUExBWV9TVEFSVCksIDEpOworCU9VVF9SSU5HKGV2bywgMCk7CisJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX0NSVEMoMCwgVU5LMDgyQyksIDEpOworCU9VVF9SSU5HKGV2bywgMCk7CisJRklSRV9SSU5HKGV2byk7CisJaWYgKCFudl93YWl0KDB4NjQwMDA0LCAweGZmZmZmZmZmLCBldm8tPmRtYS5wdXQgPDwgMikpCisJCU5WX0VSUk9SKGRldiwgImV2byBwdXNoYnVmIHN0YWxsZWRcbiIpOworCisJLyogZW5hYmxlIGNsb2NrIGNoYW5nZSBpbnRlcnJ1cHRzLiAqLworCW52X3dyMzIoZGV2LCAweDYxMDAyOCwgMHgwMDAxMDAwMSk7CisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl9FTiwgKE5WNTBfUERJU1BMQVlfSU5UUl9FTl9DTEtfVU5LMTAgfAorCQkJCQkgICAgIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9DTEtfVU5LMjAgfAorCQkJCQkgICAgIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9DTEtfVU5LNDApKTsKKworCS8qIGVuYWJsZSBob3RwbHVnIGludGVycnVwdHMgKi8KKwlocGRfZW5bMF0gPSBocGRfZW5bMV0gPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKmNvbm4gPSBub3V2ZWF1X2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCQlzdHJ1Y3QgZGNiX2dwaW9fZW50cnkgKmdwaW87CisKKwkJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgIT0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUkgJiYKKwkJICAgIGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgIT0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUQgJiYKKwkJICAgIGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgIT0gRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0KQorCQkJY29udGludWU7CisKKwkJZ3BpbyA9IG5vdXZlYXVfYmlvc19ncGlvX2VudHJ5KGRldiwgY29ubi0+ZGNiLT5ncGlvX3RhZyk7CisJCWlmICghZ3BpbykKKwkJCWNvbnRpbnVlOworCisJCWhwZF9lbltncGlvLT5saW5lID4+IDRdIHw9ICgweDAwMDEwMDAxIDw8IChncGlvLT5saW5lICYgMHhmKSk7CisJfQorCisJbnZfd3IzMihkZXYsIDB4ZTA1NCwgMHhmZmZmZmZmZik7CisJbnZfd3IzMihkZXYsIDB4ZTA1MCwgaHBkX2VuWzBdKTsKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHg5MCkgeworCQludl93cjMyKGRldiwgMHhlMDc0LCAweGZmZmZmZmZmKTsKKwkJbnZfd3IzMihkZXYsIDB4ZTA3MCwgaHBkX2VuWzFdKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudjUwX2Rpc3BsYXlfZGlzYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9jcnRjICpkcm1fY3J0YzsKKwlpbnQgcmV0LCBpOworCisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZHJtX2NydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpjcnRjID0gbm91dmVhdV9jcnRjKGRybV9jcnRjKTsKKworCQludjUwX2NydGNfYmxhbmsoY3J0YywgdHJ1ZSk7CisJfQorCisJcmV0ID0gUklOR19TUEFDRShkZXZfcHJpdi0+ZXZvLCAyKTsKKwlpZiAocmV0ID09IDApIHsKKwkJQkVHSU5fUklORyhkZXZfcHJpdi0+ZXZvLCAwLCBOVjUwX0VWT19VUERBVEUsIDEpOworCQlPVVRfUklORyhkZXZfcHJpdi0+ZXZvLCAwKTsKKwl9CisJRklSRV9SSU5HKGRldl9wcml2LT5ldm8pOworCisJLyogQWxtb3N0IGxpa2UgYWNrJ2luZyBhIHZibGFuayBpbnRlcnJ1cHQsIG1heWJlIGluIHRoZSBzcGlyaXQgb2YKKwkgKiBjbGVhbmluZyB1cD8KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRybV9jcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IG5vdXZlYXVfY3J0YyAqY3J0YyA9IG5vdXZlYXVfY3J0Yyhkcm1fY3J0Yyk7CisJCXVpbnQzMl90IG1hc2sgPSBOVjUwX1BESVNQTEFZX0lOVFJfMV9WQkxBTktfQ1JUQ18oY3J0Yy0+aW5kZXgpOworCisJCWlmICghY3J0Yy0+YmFzZS5lbmFibGVkKQorCQkJY29udGludWU7CisKKwkJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl8xLCBtYXNrKTsKKwkJaWYgKCFudl93YWl0KE5WNTBfUERJU1BMQVlfSU5UUl8xLCBtYXNrLCBtYXNrKSkgeworCQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4NjEwMDI0ICYgMHglMDh4KSA9PSAiCisJCQkJICAgICAgIjB4JTA4eFxuIiwgbWFzaywgbWFzayk7CisJCQlOVl9FUlJPUihkZXYsICIweDYxMDAyNCA9IDB4JTA4eFxuIiwKKwkJCQkgbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl8xKSk7CisJCX0KKwl9CisKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVQoMCksIDApOworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NUUkxfU1RBVEUsIDApOworCWlmICghbnZfd2FpdChOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVCgwKSwgMHgxZTAwMDAsIDApKSB7CisJCU5WX0VSUk9SKGRldiwgInRpbWVvdXQ6ICgweDYxMDIwMCAmIDB4MWUwMDAwKSA9PSAwXG4iKTsKKwkJTlZfRVJST1IoZGV2LCAiMHg2MTAyMDAgPSAweCUwOHhcbiIsCisJCQkgIG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVCgwKSkpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJaWYgKCFudl93YWl0KE5WNTBfUERJU1BMQVlfU09SX0RQTVNfU1RBVEUoaSksCisJCQkgICAgIE5WNTBfUERJU1BMQVlfU09SX0RQTVNfU1RBVEVfV0FJVCwgMCkpIHsKKwkJCU5WX0VSUk9SKGRldiwgInRpbWVvdXQ6IFNPUl9EUE1TX1NUQVRFX1dBSVQoJWQpID09IDBcbiIsIGkpOworCQkJTlZfRVJST1IoZGV2LCAiU09SX0RQTVNfU1RBVEUoJWQpID0gMHglMDh4XG4iLCBpLAorCQkJCSAgbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfU09SX0RQTVNfU1RBVEUoaSkpKTsKKwkJfQorCX0KKworCS8qIGRpc2FibGUgaW50ZXJydXB0cy4gKi8KKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSX0VOLCAweDAwMDAwMDAwKTsKKworCS8qIGRpc2FibGUgaG90cGx1ZyBpbnRlcnJ1cHRzICovCisJbnZfd3IzMihkZXYsIDB4ZTA1NCwgMHhmZmZmZmZmZik7CisJbnZfd3IzMihkZXYsIDB4ZTA1MCwgMHgwMDAwMDAwMCk7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4OTApIHsKKwkJbnZfd3IzMihkZXYsIDB4ZTA3NCwgMHhmZmZmZmZmZik7CisJCW52X3dyMzIoZGV2LCAweGUwNzAsIDB4MDAwMDAwMDApOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IG52NTBfZGlzcGxheV9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBwYXJzZWRfZGNiICpkY2IgPSBkZXZfcHJpdi0+dmJpb3MtPmRjYjsKKwl1aW50MzJfdCBjb25uZWN0b3JbMTZdID0ge307CisJaW50IHJldCwgaTsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwkvKiBpbml0IGJhc2ljIGtlcm5lbCBtb2Rlc2V0dGluZyAqLworCWRybV9tb2RlX2NvbmZpZ19pbml0KGRldik7CisKKwkvKiBJbml0aWFsaXNlIHNvbWUgb3B0aW9uYWwgY29ubmVjdG9yIHByb3BlcnRpZXMuICovCisJZHJtX21vZGVfY3JlYXRlX3NjYWxpbmdfbW9kZV9wcm9wZXJ0eShkZXYpOworCWRybV9tb2RlX2NyZWF0ZV9kaXRoZXJpbmdfcHJvcGVydHkoZGV2KTsKKworCWRldi0+bW9kZV9jb25maWcubWluX3dpZHRoID0gMDsKKwlkZXYtPm1vZGVfY29uZmlnLm1pbl9oZWlnaHQgPSAwOworCisJZGV2LT5tb2RlX2NvbmZpZy5mdW5jcyA9ICh2b2lkICopJm5vdXZlYXVfbW9kZV9jb25maWdfZnVuY3M7CisKKwlkZXYtPm1vZGVfY29uZmlnLm1heF93aWR0aCA9IDgxOTI7CisJZGV2LT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0ID0gODE5MjsKKworCWRldi0+bW9kZV9jb25maWcuZmJfYmFzZSA9IGRldl9wcml2LT5mYl9waHlzOworCisJLyogQ3JlYXRlIEVWTyBjaGFubmVsICovCisJcmV0ID0gbnY1MF9ldm9fY2hhbm5lbF9uZXcoZGV2LCAmZGV2X3ByaXYtPmV2byk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBFVk8gY2hhbm5lbDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogQ3JlYXRlIENSVEMgb2JqZWN0cyAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCW52NTBfY3J0Y19jcmVhdGUoZGV2LCBpKTsKKworCS8qIFdlIHNldHVwIHRoZSBlbmNvZGVycyBmcm9tIHRoZSBCSU9TIHRhYmxlICovCisJZm9yIChpID0gMCA7IGkgPCBkY2ItPmVudHJpZXM7IGkrKykgeworCQlzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSA9ICZkY2ItPmVudHJ5W2ldOworCisJCWlmIChlbnRyeS0+bG9jYXRpb24gIT0gRENCX0xPQ19PTl9DSElQKSB7CisJCQlOVl9XQVJOKGRldiwgIk9mZi1jaGlwIGVuY29kZXIgJWQvJWQgdW5zdXBwb3J0ZWRcbiIsCisJCQkJZW50cnktPnR5cGUsIGZmcyhlbnRyeS0+b3IpIC0gMSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3aXRjaCAoZW50cnktPnR5cGUpIHsKKwkJY2FzZSBPVVRQVVRfVE1EUzoKKwkJY2FzZSBPVVRQVVRfTFZEUzoKKwkJY2FzZSBPVVRQVVRfRFA6CisJCQludjUwX3Nvcl9jcmVhdGUoZGV2LCBlbnRyeSk7CisJCQlicmVhazsKKwkJY2FzZSBPVVRQVVRfQU5BTE9HOgorCQkJbnY1MF9kYWNfY3JlYXRlKGRldiwgZW50cnkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlOVl9XQVJOKGRldiwgIkRDQiBlbmNvZGVyICVkIHVua25vd25cbiIsIGVudHJ5LT50eXBlKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJY29ubmVjdG9yW2VudHJ5LT5jb25uZWN0b3JdIHw9ICgxIDw8IGVudHJ5LT50eXBlKTsKKwl9CisKKwkvKiBJdCBhcHBlYXJzIHRoYXQgRENCIDMuMCsgVkJJT1MgaGFzIGEgY29ubmVjdG9yIHRhYmxlLCBob3dldmVyLAorCSAqIEknbSBub3QgMTAwJSBjZXJ0YWluIGhvdyB0byBkZWNvZGUgaXQgY29ycmVjdGx5IHlldCBzbyBqdXN0CisJICogbG9vayBhdCB3aGF0IGVuY29kZXJzIGFyZSBwcmVzZW50IG9uIGVhY2ggY29ubmVjdG9yIGluZGV4IGFuZAorCSAqIGF0dGVtcHQgdG8gZGVyaXZlIHRoZSBjb25uZWN0b3IgdHlwZSBmcm9tIHRoYXQuCisJICovCisJZm9yIChpID0gMCA7IGkgPCBkY2ItPmVudHJpZXM7IGkrKykgeworCQlzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSA9ICZkY2ItPmVudHJ5W2ldOworCQl1aW50MTZfdCBlbmNvZGVyczsKKwkJaW50IHR5cGU7CisKKwkJZW5jb2RlcnMgPSBjb25uZWN0b3JbZW50cnktPmNvbm5lY3Rvcl07CisJCWlmICghKGVuY29kZXJzICYgKDEgPDwgZW50cnktPnR5cGUpKSkKKwkJCWNvbnRpbnVlOworCQljb25uZWN0b3JbZW50cnktPmNvbm5lY3Rvcl0gPSAwOworCisJCWlmIChlbmNvZGVycyAmICgxIDw8IE9VVFBVVF9EUCkpIHsKKwkJCXR5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfRGlzcGxheVBvcnQ7CisJCX0gZWxzZSBpZiAoZW5jb2RlcnMgJiAoMSA8PCBPVVRQVVRfVE1EUykpIHsKKwkJCWlmIChlbmNvZGVycyAmICgxIDw8IE9VVFBVVF9BTkFMT0cpKQorCQkJCXR5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSTsKKwkJCWVsc2UKKwkJCQl0eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUQ7CisJCX0gZWxzZSBpZiAoZW5jb2RlcnMgJiAoMSA8PCBPVVRQVVRfQU5BTE9HKSkgeworCQkJdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9WR0E7CisJCX0gZWxzZSBpZiAoZW5jb2RlcnMgJiAoMSA8PCBPVVRQVVRfTFZEUykpIHsKKwkJCXR5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUzsKKwkJfSBlbHNlIHsKKwkJCXR5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfVW5rbm93bjsKKwkJfQorCisJCWlmICh0eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9Vbmtub3duKQorCQkJY29udGludWU7CisKKwkJbm91dmVhdV9jb25uZWN0b3JfY3JlYXRlKGRldiwgZW50cnktPmNvbm5lY3RvciwgdHlwZSk7CisJfQorCisJcmV0ID0gbnY1MF9kaXNwbGF5X2luaXQoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK2ludCBudjUwX2Rpc3BsYXlfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJZHJtX21vZGVfY29uZmlnX2NsZWFudXAoZGV2KTsKKworCW52NTBfZGlzcGxheV9kaXNhYmxlKGRldik7CisJbnY1MF9ldm9fY2hhbm5lbF9kZWwoJmRldl9wcml2LT5ldm8pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK252NTBfZGlzcGxheV9tb2RlX2N0cmwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgYm9vbCBzb3IsIGludCBvcikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IG1jOworCisJaWYgKHNvcikgeworCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPCAweDkwIHx8CisJCSAgICBkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDkyIHx8IGRldl9wcml2LT5jaGlwc2V0ID09IDB4YTApCisJCQltYyA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX1NPUl9NT0RFX0NUUkxfUChvcikpOworCQllbHNlCisJCQltYyA9IG52X3JkMzIoZGV2LCBOVjkwX1BESVNQTEFZX1NPUl9NT0RFX0NUUkxfUChvcikpOworCX0gZWxzZSB7CisJCW1jID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfREFDX01PREVfQ1RSTF9QKG9yKSk7CisJfQorCisJcmV0dXJuIG1jOworfQorCitzdGF0aWMgaW50CitudjUwX2Rpc3BsYXlfaXJxX2hlYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50ICpwaGVhZCwKKwkJICAgICAgc3RydWN0IGRjYl9lbnRyeSAqKnBkY2JlbnQpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCB1bmszMCA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX1VOSzMwX0NUUkwpOworCXVpbnQzMl90IGRhYyA9IDAsIHNvciA9IDA7CisJaW50IGhlYWQsIGksIG9yID0gMCwgdHlwZSA9IE9VVFBVVF9BTlk7CisKKwkvKiBXZSdyZSBhc3N1bWluZyB0aGF0IGhlYWQgMCAqb3IqIGhlYWQgMSB3aWxsIGJlIGFjdGl2ZSBoZXJlLAorCSAqIGFuZCBub3QgYm90aC4gIEknbSBub3Qgc3VyZSBpZiB0aGUgaHcgd2lsbCBldmVuIHNpZ25hbCBib3RoCisJICogZXZlciwgYnV0IGl0IGRlZmluaXRlbHkgc2hvdWxkbid0IGZvciB1cyBhcyB3ZSBjb21taXQgZWFjaAorCSAqIENSVEMgc2VwYXJhdGVseSwgYW5kIHN1Ym1pc3Npb24gd2lsbCBiZSBibG9ja2VkIGJ5IHRoZSBHUFUKKwkgKiB1bnRpbCB3ZSBoYW5kbGUgZWFjaCBpbiB0dXJuLgorCSAqLworCU5WX0RFQlVHKGRldiwgIjB4NjEwMDMwOiAweCUwOHhcbiIsIHVuazMwKTsKKwloZWFkID0gZmZzKCh1bmszMCA+PiA5KSAmIDMpIC0gMTsKKwlpZiAoaGVhZCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVGhpcyBhc3N1bWVzIENSVENzIGFyZSBuZXZlciBib3VuZCB0byBtdWx0aXBsZSBlbmNvZGVycywgd2hpY2gKKwkgKiBzaG91bGQgYmUgdGhlIGNhc2UuCisJICovCisJZm9yIChpID0gMDsgaSA8IDMgJiYgdHlwZSA9PSBPVVRQVVRfQU5ZOyBpKyspIHsKKwkJdWludDMyX3QgbWMgPSBudjUwX2Rpc3BsYXlfbW9kZV9jdHJsKGRldiwgZmFsc2UsIGkpOworCQlpZiAoIShtYyAmICgxIDw8IGhlYWQpKSkKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAoKG1jID4+IDgpICYgMHhmKSB7CisJCWNhc2UgMDogdHlwZSA9IE9VVFBVVF9BTkFMT0c7IGJyZWFrOworCQljYXNlIDE6IHR5cGUgPSBPVVRQVVRfVFY7IGJyZWFrOworCQlkZWZhdWx0OgorCQkJTlZfRVJST1IoZGV2LCAidW5rbm93biBkYWMgbW9kZV9jdHJsOiAweCUwOHhcbiIsIGRhYyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlvciA9IGk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDQgJiYgdHlwZSA9PSBPVVRQVVRfQU5ZOyBpKyspIHsKKwkJdWludDMyX3QgbWMgPSBudjUwX2Rpc3BsYXlfbW9kZV9jdHJsKGRldiwgdHJ1ZSwgaSk7CisJCWlmICghKG1jICYgKDEgPDwgaGVhZCkpKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoICgobWMgPj4gOCkgJiAweGYpIHsKKwkJY2FzZSAwOiB0eXBlID0gT1VUUFVUX0xWRFM7IGJyZWFrOworCQljYXNlIDE6IHR5cGUgPSBPVVRQVVRfVE1EUzsgYnJlYWs7CisJCWNhc2UgMjogdHlwZSA9IE9VVFBVVF9UTURTOyBicmVhazsKKwkJY2FzZSA1OiB0eXBlID0gT1VUUFVUX1RNRFM7IGJyZWFrOworCQljYXNlIDg6IHR5cGUgPSBPVVRQVVRfRFA7IGJyZWFrOworCQljYXNlIDk6IHR5cGUgPSBPVVRQVVRfRFA7IGJyZWFrOworCQlkZWZhdWx0OgorCQkJTlZfRVJST1IoZGV2LCAidW5rbm93biBzb3IgbW9kZV9jdHJsOiAweCUwOHhcbiIsIHNvcik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlvciA9IGk7CisJfQorCisJTlZfREVCVUcoZGV2LCAidHlwZSAlZCwgb3IgJWRcbiIsIHR5cGUsIG9yKTsKKwlpZiAodHlwZSA9PSBPVVRQVVRfQU5ZKSB7CisJCU5WX0VSUk9SKGRldiwgInVua25vd24gZW5jb2RlciEhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+dmJpb3MtPmRjYi0+ZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBkY2JfZW50cnkgKmRjYmVudCA9ICZkZXZfcHJpdi0+dmJpb3MtPmRjYi0+ZW50cnlbaV07CisKKwkJaWYgKGRjYmVudC0+dHlwZSAhPSB0eXBlKQorCQkJY29udGludWU7CisKKwkJaWYgKCEoZGNiZW50LT5vciAmICgxIDw8IG9yKSkpCisJCQljb250aW51ZTsKKworCQkqcGhlYWQgPSBoZWFkOworCQkqcGRjYmVudCA9IGRjYmVudDsKKwkJcmV0dXJuIDA7CisJfQorCisJTlZfRVJST1IoZGV2LCAibm8gRENCIGVudHJ5IGZvciAlZCAlZFxuIiwgZGFjICE9IDAsIG9yKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90CitudjUwX2Rpc3BsYXlfc2NyaXB0X3NlbGVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQsCisJCQkgICBpbnQgcHhjbGspCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZiaW9zICpiaW9zID0gJmRldl9wcml2LT5WQklPUzsKKwl1aW50MzJfdCBtYywgc2NyaXB0ID0gMCwgb3I7CisKKwlvciA9IGZmcyhkY2JlbnQtPm9yKSAtIDE7CisJbWMgPSBudjUwX2Rpc3BsYXlfbW9kZV9jdHJsKGRldiwgZGNiZW50LT50eXBlICE9IE9VVFBVVF9BTkFMT0csIG9yKTsKKwlzd2l0Y2ggKGRjYmVudC0+dHlwZSkgeworCWNhc2UgT1VUUFVUX0xWRFM6CisJCXNjcmlwdCA9IChtYyA+PiA4KSAmIDB4ZjsKKwkJaWYgKGJpb3MtPnB1Yi5mcF9ub19kZGMpIHsKKwkJCWlmIChiaW9zLT5mcC5kdWFsX2xpbmspCisJCQkJc2NyaXB0IHw9IDB4MDEwMDsKKwkJCWlmIChiaW9zLT5mcC5pZl9pc18yNGJpdCkKKwkJCQlzY3JpcHQgfD0gMHgwMjAwOworCQl9IGVsc2UgeworCQkJaWYgKHB4Y2xrID49IGJpb3MtPmZwLmR1YWxsaW5rX3RyYW5zaXRpb25fY2xrKSB7CisJCQkJc2NyaXB0IHw9IDB4MDEwMDsKKwkJCQlpZiAoYmlvcy0+ZnAuc3RyYXBsZXNzX2lzXzI0Yml0ICYgMikKKwkJCQkJc2NyaXB0IHw9IDB4MDIwMDsKKwkJCX0gZWxzZQorCQkJaWYgKGJpb3MtPmZwLnN0cmFwbGVzc19pc18yNGJpdCAmIDEpCisJCQkJc2NyaXB0IHw9IDB4MDIwMDsKKwkJfQorCisJCWlmIChub3V2ZWF1X3VzY3JpcHRfbHZkcyA+PSAwKSB7CisJCQlOVl9JTkZPKGRldiwgIm92ZXJyaWRlIHNjcmlwdCAweCUwNHggd2l0aCAweCUwNHggIgorCQkJCSAgICAgImZvciBvdXRwdXQgTFZEUy0lZFxuIiwgc2NyaXB0LAorCQkJCSAgICAgbm91dmVhdV91c2NyaXB0X2x2ZHMsIG9yKTsKKwkJCXNjcmlwdCA9IG5vdXZlYXVfdXNjcmlwdF9sdmRzOworCQl9CisJCWJyZWFrOworCWNhc2UgT1VUUFVUX1RNRFM6CisJCXNjcmlwdCA9IChtYyA+PiA4KSAmIDB4ZjsKKwkJaWYgKHB4Y2xrID49IDE2NTAwMCkKKwkJCXNjcmlwdCB8PSAweDAxMDA7CisKKwkJaWYgKG5vdXZlYXVfdXNjcmlwdF90bWRzID49IDApIHsKKwkJCU5WX0lORk8oZGV2LCAib3ZlcnJpZGUgc2NyaXB0IDB4JTA0eCB3aXRoIDB4JTA0eCAiCisJCQkJICAgICAiZm9yIG91dHB1dCBUTURTLSVkXG4iLCBzY3JpcHQsCisJCQkJICAgICBub3V2ZWF1X3VzY3JpcHRfdG1kcywgb3IpOworCQkJc2NyaXB0ID0gbm91dmVhdV91c2NyaXB0X3RtZHM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBPVVRQVVRfRFA6CisJCXNjcmlwdCA9IChtYyA+PiA4KSAmIDB4ZjsKKwkJYnJlYWs7CisJY2FzZSBPVVRQVVRfQU5BTE9HOgorCQlzY3JpcHQgPSAweGZmOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlOVl9FUlJPUihkZXYsICJtb2Rlc2V0IG9uIHVuc3VwcG9ydGVkIG91dHB1dCB0eXBlIVxuIik7CisJCWJyZWFrOworCX0KKworCXJldHVybiBzY3JpcHQ7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2Rpc3BsYXlfdmJsYW5rX2NydGNfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJmRldl9wcml2LT52Ymxfd2FpdGluZykgeworCQljaGFuID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCwgbnZzdy52Ymxfd2FpdCk7CisKKwkJbm91dmVhdV9ib193cjMyKGNoYW4tPm5vdGlmaWVyX2JvLCBjaGFuLT5udnN3LnZibHNlbV9vZmZzZXQsCisJCQkJCQljaGFuLT5udnN3LnZibHNlbV9ydmFsKTsKKwkJbGlzdF9kZWwoJmNoYW4tPm52c3cudmJsX3dhaXQpOworCX0KK30KKworc3RhdGljIHZvaWQKK252NTBfZGlzcGxheV92YmxhbmtfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBpbnRyKQoreworCWludHIgJj0gTlY1MF9QRElTUExBWV9JTlRSXzFfVkJMQU5LX0NSVEM7CisKKwlpZiAoaW50ciAmIE5WNTBfUERJU1BMQVlfSU5UUl8xX1ZCTEFOS19DUlRDXzApCisJCW52NTBfZGlzcGxheV92YmxhbmtfY3J0Y19oYW5kbGVyKGRldiwgMCk7CisKKwlpZiAoaW50ciAmIE5WNTBfUERJU1BMQVlfSU5UUl8xX1ZCTEFOS19DUlRDXzEpCisJCW52NTBfZGlzcGxheV92YmxhbmtfY3J0Y19oYW5kbGVyKGRldiwgMSk7CisKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSX0VOLCBudl9yZDMyKGRldiwKKwkJICAgICBOVjUwX1BESVNQTEFZX0lOVFJfRU4pICYgfmludHIpOworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfMSwgaW50cik7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2Rpc3BsYXlfdW5rMTBfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkY2JfZW50cnkgKmRjYmVudDsKKwlpbnQgaGVhZCwgcmV0OworCisJcmV0ID0gbnY1MF9kaXNwbGF5X2lycV9oZWFkKGRldiwgJmhlYWQsICZkY2JlbnQpOworCWlmIChyZXQpCisJCWdvdG8gYWNrOworCisJbnZfd3IzMihkZXYsIDB4NjE5NDk0LCBudl9yZDMyKGRldiwgMHg2MTk0OTQpICYgfjgpOworCisJbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKGRldiwgZGNiZW50LCAwLCAtMSk7CisKK2FjazoKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzEsIE5WNTBfUERJU1BMQVlfSU5UUl8xX0NMS19VTksxMCk7CisJbnZfd3IzMihkZXYsIDB4NjEwMDMwLCAweDgwMDAwMDAwKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfZGlzcGxheV91bmsyMF9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50OworCXVpbnQzMl90IHRtcCwgcGNsaywgc2NyaXB0OworCWludCBoZWFkLCBvciwgcmV0OworCisJcmV0ID0gbnY1MF9kaXNwbGF5X2lycV9oZWFkKGRldiwgJmhlYWQsICZkY2JlbnQpOworCWlmIChyZXQpCisJCWdvdG8gYWNrOworCW9yID0gZmZzKGRjYmVudC0+b3IpIC0gMTsKKwlwY2xrID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfQ1JUQ19QKGhlYWQsIENMT0NLKSkgJiAweDNmZmZmZjsKKwlzY3JpcHQgPSBudjUwX2Rpc3BsYXlfc2NyaXB0X3NlbGVjdChkZXYsIGRjYmVudCwgcGNsayk7CisKKwlOVl9ERUJVRyhkZXYsICJoZWFkICVkIHB4Y2xrOiAlZEtIelxuIiwgaGVhZCwgcGNsayk7CisKKwlpZiAoZGNiZW50LT50eXBlICE9IE9VVFBVVF9EUCkKKwkJbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKGRldiwgZGNiZW50LCAwLCAtMik7CisKKwludjUwX2NydGNfc2V0X2Nsb2NrKGRldiwgaGVhZCwgcGNsayk7CisKKwlub3V2ZWF1X2Jpb3NfcnVuX2Rpc3BsYXlfdGFibGUoZGV2LCBkY2JlbnQsIHNjcmlwdCwgcGNsayk7CisKKwl0bXAgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9DUlRDX0NMS19DVFJMMihoZWFkKSk7CisJdG1wICY9IH4weDAwMDAwMGY7CisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ1JUQ19DTEtfQ1RSTDIoaGVhZCksIHRtcCk7CisKKwlpZiAoZGNiZW50LT50eXBlICE9IE9VVFBVVF9BTkFMT0cpIHsKKwkJdG1wID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfU09SX0NMS19DVFJMMihvcikpOworCQl0bXAgJj0gfjB4MDAwMDBmMGY7CisJCWlmIChzY3JpcHQgJiAweDAxMDApCisJCQl0bXAgfD0gMHgwMDAwMDEwMTsKKwkJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfU09SX0NMS19DVFJMMihvciksIHRtcCk7CisJfSBlbHNlIHsKKwkJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfREFDX0NMS19DVFJMMihvciksIDApOworCX0KKworYWNrOgorCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfMSwgTlY1MF9QRElTUExBWV9JTlRSXzFfQ0xLX1VOSzIwKTsKKwludl93cjMyKGRldiwgMHg2MTAwMzAsIDB4ODAwMDAwMDApOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9kaXNwbGF5X3VuazQwX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQ7CisJaW50IGhlYWQsIHBjbGssIHNjcmlwdCwgcmV0OworCisJcmV0ID0gbnY1MF9kaXNwbGF5X2lycV9oZWFkKGRldiwgJmhlYWQsICZkY2JlbnQpOworCWlmIChyZXQpCisJCWdvdG8gYWNrOworCXBjbGsgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9DUlRDX1AoaGVhZCwgQ0xPQ0spKSAmIDB4M2ZmZmZmOworCXNjcmlwdCA9IG52NTBfZGlzcGxheV9zY3JpcHRfc2VsZWN0KGRldiwgZGNiZW50LCBwY2xrKTsKKworCW5vdXZlYXVfYmlvc19ydW5fZGlzcGxheV90YWJsZShkZXYsIGRjYmVudCwgc2NyaXB0LCAtcGNsayk7CisKK2FjazoKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzEsIE5WNTBfUERJU1BMQVlfSU5UUl8xX0NMS19VTks0MCk7CisJbnZfd3IzMihkZXYsIDB4NjEwMDMwLCAweDgwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg2MTk0OTQsIG52X3JkMzIoZGV2LCAweDYxOTQ5NCkgfCA4KTsKK30KKwordm9pZAorbnY1MF9kaXNwbGF5X2lycV9oYW5kbGVyX2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUsIGlycV93b3JrKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKKworCWZvciAoOzspIHsKKwkJdWludDMyX3QgaW50cjAgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzApOworCQl1aW50MzJfdCBpbnRyMSA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfMSk7CisKKwkJTlZfREVCVUcoZGV2LCAiUERJU1BMQVlfSU5UUl9CSCAweCUwOHggMHglMDh4XG4iLCBpbnRyMCwgaW50cjEpOworCisJCWlmIChpbnRyMSAmIE5WNTBfUERJU1BMQVlfSU5UUl8xX0NMS19VTksxMCkKKwkJCW52NTBfZGlzcGxheV91bmsxMF9oYW5kbGVyKGRldik7CisJCWVsc2UKKwkJaWYgKGludHIxICYgTlY1MF9QRElTUExBWV9JTlRSXzFfQ0xLX1VOSzIwKQorCQkJbnY1MF9kaXNwbGF5X3VuazIwX2hhbmRsZXIoZGV2KTsKKwkJZWxzZQorCQlpZiAoaW50cjEgJiBOVjUwX1BESVNQTEFZX0lOVFJfMV9DTEtfVU5LNDApCisJCQludjUwX2Rpc3BsYXlfdW5rNDBfaGFuZGxlcihkZXYpOworCQllbHNlCisJCQlicmVhazsKKwl9CisKKwludl93cjMyKGRldiwgTlYwM19QTUNfSU5UUl9FTl8wLCAxKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfZGlzcGxheV9lcnJvcl9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdWludDMyX3QgYWRkciwgZGF0YTsKKworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfMCwgMHgwMDAxMDAwMCk7CisJYWRkciA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX1RSQVBQRURfQUREUik7CisJZGF0YSA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX1RSQVBQRURfREFUQSk7CisKKwlOVl9FUlJPUihkZXYsICJFdm9DaCAlZCBNdGhkIDB4JTA0eCBEYXRhIDB4JTA4eCAoMHglMDR4IDB4JTAyeClcbiIsCisJCSAwLCBhZGRyICYgMHhmZmMsIGRhdGEsIGFkZHIgPj4gMTYsIChhZGRyID4+IDEyKSAmIDB4Zik7CisKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9UUkFQUEVEX0FERFIsIDB4OTAwMDAwMDApOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9kaXNwbGF5X2lycV9ob3RwbHVnKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCWNvbnN0IHVpbnQzMl90IGdwaW9fcmVnWzRdID0geyAweGUxMDQsIDB4ZTEwOCwgMHhlMjgwLCAweGUyODQgfTsKKwl1aW50MzJfdCB1bnBsdWdfbWFzaywgcGx1Z19tYXNrLCBjaGFuZ2VfbWFzazsKKwl1aW50MzJfdCBocGQwLCBocGQxID0gMDsKKworCWhwZDAgPSBudl9yZDMyKGRldiwgMHhlMDU0KSAmIG52X3JkMzIoZGV2LCAweGUwNTApOworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDkwKQorCQlocGQxID0gbnZfcmQzMihkZXYsIDB4ZTA3NCkgJiBudl9yZDMyKGRldiwgMHhlMDcwKTsKKworCXBsdWdfbWFzayAgID0gKGhwZDAgJiAweDAwMDBmZmZmKSB8IChocGQxIDw8IDE2KTsKKwl1bnBsdWdfbWFzayA9IChocGQwID4+IDE2KSB8IChocGQxICYgMHhmZmZmMDAwMCk7CisJY2hhbmdlX21hc2sgPSBwbHVnX21hc2sgfCB1bnBsdWdfbWFzazsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICpoZWxwZXI7CisJCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0KKwkJCW5vdXZlYXVfY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXI7CisJCXN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqZ3BpbzsKKwkJdWludDMyX3QgcmVnOworCQlib29sIHBsdWdnZWQ7CisKKwkJaWYgKCFudl9jb25uZWN0b3ItPmRjYikKKwkJCWNvbnRpbnVlOworCisJCWdwaW8gPSBub3V2ZWF1X2Jpb3NfZ3Bpb19lbnRyeShkZXYsIG52X2Nvbm5lY3Rvci0+ZGNiLT5ncGlvX3RhZyk7CisJCWlmICghZ3BpbyB8fCAhKGNoYW5nZV9tYXNrICYgKDEgPDwgZ3Bpby0+bGluZSkpKQorCQkJY29udGludWU7CisKKwkJcmVnID0gbnZfcmQzMihkZXYsIGdwaW9fcmVnW2dwaW8tPmxpbmUgPj4gM10pOworCQlwbHVnZ2VkID0gISEocmVnICYgKDQgPDwgKChncGlvLT5saW5lICYgNykgPDwgMikpKTsKKwkJTlZfSU5GTyhkZXYsICIlc3BsdWdnZWQgJXNcbiIsIHBsdWdnZWQgPyAiIiA6ICJ1biIsCisJCQlkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpIDsKKworCQlpZiAoIWNvbm5lY3Rvci0+ZW5jb2RlciB8fCAhY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjIHx8CisJCSAgICAhY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjLT5lbmFibGVkKQorCQkJY29udGludWU7CisJCW52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoY29ubmVjdG9yLT5lbmNvZGVyKTsKKwkJaGVscGVyID0gY29ubmVjdG9yLT5lbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKworCQlpZiAobnZfZW5jb2Rlci0+ZGNiLT50eXBlICE9IE9VVFBVVF9EUCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwbHVnZ2VkKQorCQkJaGVscGVyLT5kcG1zKGNvbm5lY3Rvci0+ZW5jb2RlciwgRFJNX01PREVfRFBNU19PTik7CisJCWVsc2UKKwkJCWhlbHBlci0+ZHBtcyhjb25uZWN0b3ItPmVuY29kZXIsIERSTV9NT0RFX0RQTVNfT0ZGKTsKKwl9CisKKwludl93cjMyKGRldiwgMHhlMDU0LCBudl9yZDMyKGRldiwgMHhlMDU0KSk7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4OTApCisJCW52X3dyMzIoZGV2LCAweGUwNzQsIG52X3JkMzIoZGV2LCAweGUwNzQpKTsKK30KKwordm9pZAorbnY1MF9kaXNwbGF5X2lycV9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBkZWxheWVkID0gMDsKKworCXdoaWxlIChudl9yZDMyKGRldiwgTlY1MF9QTUNfSU5UUl8wKSAmIE5WNTBfUE1DX0lOVFJfMF9IT1RQTFVHKQorCQludjUwX2Rpc3BsYXlfaXJxX2hvdHBsdWcoZGV2KTsKKworCXdoaWxlIChudl9yZDMyKGRldiwgTlY1MF9QTUNfSU5UUl8wKSAmIE5WNTBfUE1DX0lOVFJfMF9ESVNQTEFZKSB7CisJCXVpbnQzMl90IGludHIwID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl8wKTsKKwkJdWludDMyX3QgaW50cjEgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzEpOworCQl1aW50MzJfdCBjbG9jazsKKworCQlOVl9ERUJVRyhkZXYsICJQRElTUExBWV9JTlRSIDB4JTA4eCAweCUwOHhcbiIsIGludHIwLCBpbnRyMSk7CisKKwkJaWYgKCFpbnRyMCAmJiAhKGludHIxICYgfmRlbGF5ZWQpKQorCQkJYnJlYWs7CisKKwkJaWYgKGludHIwICYgMHgwMDAxMDAwMCkgeworCQkJbnY1MF9kaXNwbGF5X2Vycm9yX2hhbmRsZXIoZGV2KTsKKwkJCWludHIwICY9IH4weDAwMDEwMDAwOworCQl9CisKKwkJaWYgKGludHIxICYgTlY1MF9QRElTUExBWV9JTlRSXzFfVkJMQU5LX0NSVEMpIHsKKwkJCW52NTBfZGlzcGxheV92YmxhbmtfaGFuZGxlcihkZXYsIGludHIxKTsKKwkJCWludHIxICY9IH5OVjUwX1BESVNQTEFZX0lOVFJfMV9WQkxBTktfQ1JUQzsKKwkJfQorCisJCWNsb2NrID0gKGludHIxICYgKE5WNTBfUERJU1BMQVlfSU5UUl8xX0NMS19VTksxMCB8CisJCQkJICBOVjUwX1BESVNQTEFZX0lOVFJfMV9DTEtfVU5LMjAgfAorCQkJCSAgTlY1MF9QRElTUExBWV9JTlRSXzFfQ0xLX1VOSzQwKSk7CisJCWlmIChjbG9jaykgeworCQkJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0lOVFJfRU5fMCwgMCk7CisJCQlpZiAoIXdvcmtfcGVuZGluZygmZGV2X3ByaXYtPmlycV93b3JrKSkKKwkJCQlxdWV1ZV93b3JrKGRldl9wcml2LT53cSwgJmRldl9wcml2LT5pcnFfd29yayk7CisJCQlkZWxheWVkIHw9IGNsb2NrOworCQkJaW50cjEgJj0gfmNsb2NrOworCQl9CisKKwkJaWYgKGludHIwKSB7CisJCQlOVl9FUlJPUihkZXYsICJ1bmtub3duIFBESVNQTEFZX0lOVFJfMDogMHglMDh4XG4iLCBpbnRyMCk7CisJCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzAsIGludHIwKTsKKwkJfQorCisJCWlmIChpbnRyMSkgeworCQkJTlZfRVJST1IoZGV2LAorCQkJCSAidW5rbm93biBQRElTUExBWV9JTlRSXzE6IDB4JTA4eFxuIiwgaW50cjEpOworCQkJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl8xLCBpbnRyMSk7CisJCX0KKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlOGQwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFhcnRlbiBNYWF0aHVpcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX19OVjUwX0RJU1BMQVlfSF9fCisjZGVmaW5lIF9fTlY1MF9ESVNQTEFZX0hfXworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kbWEuaCIKKyNpbmNsdWRlICJub3V2ZWF1X3JlZy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY3J0Yy5oIgorI2luY2x1ZGUgIm52NTBfZXZvLmgiCisKK3ZvaWQgbnY1MF9kaXNwbGF5X2lycV9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwordm9pZCBudjUwX2Rpc3BsYXlfaXJxX2hhbmRsZXJfYmgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK2ludCBudjUwX2Rpc3BsYXlfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2ludCBudjUwX2Rpc3BsYXlfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworaW50IG52NTBfZGlzcGxheV9kZXN0cm95KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworaW50IG52NTBfY3J0Y19ibGFuayhzdHJ1Y3Qgbm91dmVhdV9jcnRjICosIGJvb2wgYmxhbmspOworaW50IG52NTBfY3J0Y19zZXRfY2xvY2soc3RydWN0IGRybV9kZXZpY2UgKiwgaW50IGhlYWQsIGludCBwY2xrKTsKKworI2VuZGlmIC8qIF9fTlY1MF9ESVNQTEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ldm8uaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZXZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFlMTMzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZXZvLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFhcnRlbiBNYWF0aHVpcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNkZWZpbmUgTlY1MF9FVk9fVVBEQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgTlY1MF9FVk9fVU5LODQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODQKKyNkZWZpbmUgTlY1MF9FVk9fVU5LODRfTk9USUZZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgTlY1MF9FVk9fVU5LODRfTk9USUZZX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlY1MF9FVk9fVU5LODRfTk9USUZZX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgTlY1MF9FVk9fRE1BX05PVElGWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODgKKyNkZWZpbmUgTlY1MF9FVk9fRE1BX05PVElGWV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgTlY1MF9FVk9fRE1BX05PVElGWV9IQU5ETEVfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlY1MF9FVk9fVU5LOEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwOEMKKworI2RlZmluZSBOVjUwX0VWT19EQUMobiwgcikgICAgICAgICAgICAgICAgICAgICAgICgobikgKiAweDgwICsgTlY1MF9FVk9fREFDXyMjcikKKyNkZWZpbmUgTlY1MF9FVk9fREFDX01PREVfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgTlY1MF9FVk9fREFDX01PREVfQ1RSTF9DUlRDMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTlY1MF9FVk9fREFDX01PREVfQ1RSTF9DUlRDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgTlY1MF9FVk9fREFDX01PREVfQ1RSTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDQKKyNkZWZpbmUgTlY1MF9FVk9fREFDX01PREVfQ1RSTDJfTkhTWU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTlY1MF9FVk9fREFDX01PREVfQ1RSTDJfTlZTWU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKworI2RlZmluZSBOVjUwX0VWT19TT1IobiwgcikgICAgICAgICAgICAgICAgICAgICAgICgobikgKiAweDQwICsgTlY1MF9FVk9fU09SXyMjcikKKyNkZWZpbmUgTlY1MF9FVk9fU09SX01PREVfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MDAKKyNkZWZpbmUgTlY1MF9FVk9fU09SX01PREVfQ1RSTF9DUlRDMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTlY1MF9FVk9fU09SX01PREVfQ1RSTF9DUlRDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgTlY1MF9FVk9fU09SX01PREVfQ1RSTF9UTURTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgTlY1MF9FVk9fU09SX01PREVfQ1RSTF9UTURTX0RVQUxfTElOSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgTlY1MF9FVk9fU09SX01PREVfQ1RSTF9OSFNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgTlY1MF9FVk9fU09SX01PREVfQ1RSTF9OVlNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKworI2RlZmluZSBOVjUwX0VWT19DUlRDKG4sIHIpICAgICAgICAgICAgICAgICAgICAoKG4pICogMHg0MDAgKyBOVjUwX0VWT19DUlRDXyMjcikKKyNkZWZpbmUgTlY4NF9FVk9fQ1JUQyhuLCByKSAgICAgICAgICAgICAgICAgICAgKChuKSAqIDB4NDAwICsgTlY4NF9FVk9fQ1JUQ18jI3IpCisjZGVmaW5lIE5WNTBfRVZPX0NSVENfVU5LMDgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIE5WNTBfRVZPX0NSVENfQ0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODA0CisjZGVmaW5lIE5WNTBfRVZPX0NSVENfSU5URVJMQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODA4CisjZGVmaW5lIE5WNTBfRVZPX0NSVENfRElTUExBWV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODEwCisjZGVmaW5lIE5WNTBfRVZPX0NSVENfRElTUExBWV9UT1RBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODE0CisjZGVmaW5lIE5WNTBfRVZPX0NSVENfU1lOQ19EVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODE4CisjZGVmaW5lIE5WNTBfRVZPX0NSVENfU1lOQ19TVEFSVF9UT19CTEFOS19FTkQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODFjCisjZGVmaW5lIE5WNTBfRVZPX0NSVENfVU5LMDgyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODIwCisjZGVmaW5lIE5WNTBfRVZPX0NSVENfVU5LMDgyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODI0CisjZGVmaW5lIE5WNTBfRVZPX0NSVENfVU5LMDgyQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODJjCisjZGVmaW5lIE5WNTBfRVZPX0NSVENfQ0xVVF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODQwCisvKiBZb3UgY2FuJ3QgaGF2ZSBhIHBhbGV0dGUgaW4gOCBiaXQgbW9kZSAoPU9GRikgKi8KKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19DTFVUX01PREVfQkxBTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19DTFVUX01PREVfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19DTFVUX01PREVfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QzAwMDAwMDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19DTFVUX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4NDQKKyNkZWZpbmUgTlY4NF9FVk9fQ1JUQ19DTFVUX0RNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4NUMKKyNkZWZpbmUgTlY4NF9FVk9fQ1JUQ19DTFVUX0RNQV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgTlY4NF9FVk9fQ1JUQ19DTFVUX0RNQV9IQU5ETEVfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19GQl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4NjAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19GQl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4NjgKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19GQl9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4NmMKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19GQl9DT05GSUdfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19GQl9DT05GSUdfTU9ERV9USUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19GQl9DT05GSUdfTU9ERV9QSVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19GQl9ERVBUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4NzAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19GQl9ERVBUSF84ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDFlMDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19GQl9ERVBUSF8xNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMGU5MDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19GQl9ERVBUSF8xNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMGU4MDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19GQl9ERVBUSF8yNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMGNmMDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19GQl9ERVBUSF8zMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMGQxMDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19GQl9ETUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4NzQKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19GQl9ETUFfSEFORExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19GQl9ETUFfSEFORExFX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19DVVJTT1JfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4ODAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19DVVJTT1JfQ1RSTF9ISURFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUwMDAwMDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19DVVJTT1JfQ1RSTF9TSE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODUwMDAwMDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19DVVJTT1JfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4ODQKKyNkZWZpbmUgTlY4NF9FVk9fQ1JUQ19DVVJTT1JfRE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4OWMKKyNkZWZpbmUgTlY4NF9FVk9fQ1JUQ19DVVJTT1JfRE1BX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgTlY4NF9FVk9fQ1JUQ19DVVJTT1JfRE1BX0hBTkRMRV9OT05FICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19ESVRIRVJfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4YTAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19ESVRIRVJfQ1RSTF9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19ESVRIRVJfQ1RSTF9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTEKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19TQ0FMRV9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4YTQKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19TQ0FMRV9DVFJMX0lOQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19TQ0FMRV9DVFJMX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDkKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19DT0xPUl9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4YTgKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19DT0xPUl9DVFJMX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19GQl9QT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4YzAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19SRUFMX1JFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4YzgKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19TQ0FMRV9DRU5URVJfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4ZDQKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19TQ0FMRV9DRU5URVJfT0ZGU0VUX1ZBTCh4LCB5KSBcCisJKCgoKHVuc2lnbmVkKXkgPDwgMTYpICYgMHhGRkZGMDAwMCkgfCAoKCh1bnNpZ25lZCl4KSAmIDB4MDAwMEZGRkYpKQorLyogQm90aCBvZiB0aGVzZSBhcmUgbmVlZGVkLCBvdGhlcndpc2Ugbm90aGluZyBoYXBwZW5zLiAqLworI2RlZmluZSBOVjUwX0VWT19DUlRDX1NDQUxFX1JFUzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDhkOAorI2RlZmluZSBOVjUwX0VWT19DUlRDX1NDQUxFX1JFUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDhkYworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2ZiY29uLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2ZiY29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjYzZkMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZmJjb24uYwpAQCAtMCwwICsxLDI3MyBAQAorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZG1hLmgiCisjaW5jbHVkZSAibm91dmVhdV9mYmNvbi5oIgorCitzdGF0aWMgdm9pZAorbnY1MF9mYmNvbl9maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KQoreworCXN0cnVjdCBub3V2ZWF1X2ZiY29uX3BhciAqcGFyID0gaW5mby0+cGFyOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwYXItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbDsKKworCWlmIChpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykKKwkJcmV0dXJuOworCisJaWYgKCEoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgJiYKKwkgICAgIFJJTkdfU1BBQ0UoY2hhbiwgcmVjdC0+cm9wID09IFJPUF9DT1BZID8gNyA6IDExKSkgeworCQlOVl9FUlJPUihkZXYsICJHUFUgbG9ja3VwIC0gc3dpdGNoaW5nIHRvIHNvZnR3YXJlIGZiY29uXG4iKTsKKworCQlpbmZvLT5mbGFncyB8PSBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRDsKKwl9CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgeworCQljZmJfZmlsbHJlY3QoaW5mbywgcmVjdCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocmVjdC0+cm9wICE9IFJPUF9DT1BZKSB7CisJCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwMmFjLCAxKTsKKwkJT1VUX1JJTkcoY2hhbiwgMSk7CisJfQorCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwNTg4LCAxKTsKKwlPVVRfUklORyhjaGFuLCByZWN0LT5jb2xvcik7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDA2MDAsIDQpOworCU9VVF9SSU5HKGNoYW4sIHJlY3QtPmR4KTsKKwlPVVRfUklORyhjaGFuLCByZWN0LT5keSk7CisJT1VUX1JJTkcoY2hhbiwgcmVjdC0+ZHggKyByZWN0LT53aWR0aCk7CisJT1VUX1JJTkcoY2hhbiwgcmVjdC0+ZHkgKyByZWN0LT5oZWlnaHQpOworCWlmIChyZWN0LT5yb3AgIT0gUk9QX0NPUFkpIHsKKwkJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDAyYWMsIDEpOworCQlPVVRfUklORyhjaGFuLCAzKTsKKwl9CisJRklSRV9SSU5HKGNoYW4pOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9mYmNvbl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICpyZWdpb24pCit7CisJc3RydWN0IG5vdXZlYXVfZmJjb25fcGFyICpwYXIgPSBpbmZvLT5wYXI7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBhci0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5jaGFubmVsOworCisJaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQorCQlyZXR1cm47CisKKwlpZiAoIShpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSAmJiBSSU5HX1NQQUNFKGNoYW4sIDEyKSkgeworCQlOVl9FUlJPUihkZXYsICJHUFUgbG9ja3VwIC0gc3dpdGNoaW5nIHRvIHNvZnR3YXJlIGZiY29uXG4iKTsKKworCQlpbmZvLT5mbGFncyB8PSBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRDsKKwl9CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgeworCQljZmJfY29weWFyZWEoaW5mbywgcmVnaW9uKTsKKwkJcmV0dXJuOworCX0KKworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwMTEwLCAxKTsKKwlPVVRfUklORyhjaGFuLCAwKTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4MDhiMCwgNCk7CisJT1VUX1JJTkcoY2hhbiwgcmVnaW9uLT5keCk7CisJT1VUX1JJTkcoY2hhbiwgcmVnaW9uLT5keSk7CisJT1VUX1JJTkcoY2hhbiwgcmVnaW9uLT53aWR0aCk7CisJT1VUX1JJTkcoY2hhbiwgcmVnaW9uLT5oZWlnaHQpOworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwOGQwLCA0KTsKKwlPVVRfUklORyhjaGFuLCAwKTsKKwlPVVRfUklORyhjaGFuLCByZWdpb24tPnN4KTsKKwlPVVRfUklORyhjaGFuLCAwKTsKKwlPVVRfUklORyhjaGFuLCByZWdpb24tPnN5KTsKKwlGSVJFX1JJTkcoY2hhbik7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2ZiY29uX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9mYmNvbl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGFyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWw7CisJdWludDMyX3Qgd2lkdGgsIGR3b3JkcywgKmRhdGEgPSAodWludDMyX3QgKilpbWFnZS0+ZGF0YTsKKwl1aW50MzJfdCBtYXNrID0gfih+MCA+PiAoMzIgLSBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpKTsKKwl1aW50MzJfdCAqcGFsZXR0ZSA9IGluZm8tPnBzZXVkb19wYWxldHRlOworCisJaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQorCQlyZXR1cm47CisKKwlpZiAoaW1hZ2UtPmRlcHRoICE9IDEpIHsKKwkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIShpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSAmJiBSSU5HX1NQQUNFKGNoYW4sIDExKSkgeworCQlOVl9FUlJPUihkZXYsICJHUFUgbG9ja3VwIC0gc3dpdGNoaW5nIHRvIHNvZnR3YXJlIGZiY29uXG4iKTsKKwkJaW5mby0+ZmxhZ3MgfD0gRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQ7CisJfQorCisJaWYgKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpIHsKKwkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCXJldHVybjsKKwl9CisKKwl3aWR0aCA9IChpbWFnZS0+d2lkdGggKyAzMSkgJiB+MzE7CisJZHdvcmRzID0gKHdpZHRoICogaW1hZ2UtPmhlaWdodCkgPj4gNTsKKworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwODE0LCAyKTsKKwlpZiAoaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfVFJVRUNPTE9SIHx8CisJICAgIGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX0RJUkVDVENPTE9SKSB7CisJCU9VVF9SSU5HKGNoYW4sIHBhbGV0dGVbaW1hZ2UtPmJnX2NvbG9yXSB8IG1hc2spOworCQlPVVRfUklORyhjaGFuLCBwYWxldHRlW2ltYWdlLT5mZ19jb2xvcl0gfCBtYXNrKTsKKwl9IGVsc2UgeworCQlPVVRfUklORyhjaGFuLCBpbWFnZS0+YmdfY29sb3IpOworCQlPVVRfUklORyhjaGFuLCBpbWFnZS0+ZmdfY29sb3IpOworCX0KKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4MDgzOCwgMik7CisJT1VUX1JJTkcoY2hhbiwgaW1hZ2UtPndpZHRoKTsKKwlPVVRfUklORyhjaGFuLCBpbWFnZS0+aGVpZ2h0KTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4MDg1MCwgNCk7CisJT1VUX1JJTkcoY2hhbiwgMCk7CisJT1VUX1JJTkcoY2hhbiwgaW1hZ2UtPmR4KTsKKwlPVVRfUklORyhjaGFuLCAwKTsKKwlPVVRfUklORyhjaGFuLCBpbWFnZS0+ZHkpOworCisJd2hpbGUgKGR3b3JkcykgeworCQlpbnQgcHVzaCA9IGR3b3JkcyA+IDIwNDcgPyAyMDQ3IDogZHdvcmRzOworCisJCWlmIChSSU5HX1NQQUNFKGNoYW4sIHB1c2ggKyAxKSkgeworCQkJTlZfRVJST1IoZGV2LAorCQkJCSAiR1BVIGxvY2t1cCAtIHN3aXRjaGluZyB0byBzb2Z0d2FyZSBmYmNvblxuIik7CisJCQlpbmZvLT5mbGFncyB8PSBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRDsKKwkJCWNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCQkJcmV0dXJuOworCQl9CisKKwkJZHdvcmRzIC09IHB1c2g7CisKKwkJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDQwMDAwODYwLCBwdXNoKTsKKwkJT1VUX1JJTkdwKGNoYW4sIGRhdGEsIHB1c2gpOworCQlkYXRhICs9IHB1c2g7CisJfQorCisJRklSRV9SSU5HKGNoYW4pOworfQorCitpbnQKK252NTBfZmJjb25fYWNjZWxfaW5pdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9mYmNvbl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGFyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWw7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICplbmcyZCA9IE5VTEw7CisJaW50IHJldCwgZm9ybWF0OworCisJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKKwljYXNlIDg6CisJCWZvcm1hdCA9IDB4ZjM7CisJCWJyZWFrOworCWNhc2UgMTU6CisJCWZvcm1hdCA9IDB4Zjg7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWZvcm1hdCA9IDB4ZTg7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCXN3aXRjaCAoaW5mby0+dmFyLnRyYW5zcC5sZW5ndGgpIHsKKwkJY2FzZSAwOiAvKiBkZXB0aCAyNCAqLworCQljYXNlIDg6IC8qIGRlcHRoIDMyLCBqdXN0IHVzZSAyNC4uICovCisJCQlmb3JtYXQgPSAweGU2OworCQkJYnJlYWs7CisJCWNhc2UgMjogLyogZGVwdGggMzAgKi8KKwkJCWZvcm1hdCA9IDB4ZDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2dyX25ldyhkZXZfcHJpdi0+Y2hhbm5lbCwgMHg1MDJkLCAmZW5nMmQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9yZWZfYWRkKGRldiwgZGV2X3ByaXYtPmNoYW5uZWwsIE52MkQsIGVuZzJkLCBOVUxMKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gUklOR19TUEFDRShjaGFuLCA1OSk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJHUFUgbG9ja3VwIC0gc3dpdGNoaW5nIHRvIHNvZnR3YXJlIGZiY29uXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4MDAwMCwgMSk7CisJT1VUX1JJTkcoY2hhbiwgTnYyRCk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDAxODAsIDQpOworCU9VVF9SSU5HKGNoYW4sIE52Tm90aWZ5MCk7CisJT1VUX1JJTkcoY2hhbiwgY2hhbi0+dnJhbV9oYW5kbGUpOworCU9VVF9SSU5HKGNoYW4sIGNoYW4tPnZyYW1faGFuZGxlKTsKKwlPVVRfUklORyhjaGFuLCBjaGFuLT52cmFtX2hhbmRsZSk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDAyOTAsIDEpOworCU9VVF9SSU5HKGNoYW4sIDApOworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwODg4LCAxKTsKKwlPVVRfUklORyhjaGFuLCAxKTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4MDJhYywgMSk7CisJT1VUX1JJTkcoY2hhbiwgMyk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDAyYTAsIDEpOworCU9VVF9SSU5HKGNoYW4sIDB4NTUpOworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwOGMwLCA0KTsKKwlPVVRfUklORyhjaGFuLCAwKTsKKwlPVVRfUklORyhjaGFuLCAxKTsKKwlPVVRfUklORyhjaGFuLCAwKTsKKwlPVVRfUklORyhjaGFuLCAxKTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4MDU4MCwgMik7CisJT1VUX1JJTkcoY2hhbiwgNCk7CisJT1VUX1JJTkcoY2hhbiwgZm9ybWF0KTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4MDJlOCwgMik7CisJT1VUX1JJTkcoY2hhbiwgMik7CisJT1VUX1JJTkcoY2hhbiwgMSk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDA4MDQsIDEpOworCU9VVF9SSU5HKGNoYW4sIGZvcm1hdCk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDA4MDAsIDEpOworCU9VVF9SSU5HKGNoYW4sIDEpOworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwODA4LCAzKTsKKwlPVVRfUklORyhjaGFuLCAwKTsKKwlPVVRfUklORyhjaGFuLCAwKTsKKwlPVVRfUklORyhjaGFuLCAwKTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4MDgxYywgMSk7CisJT1VUX1JJTkcoY2hhbiwgMSk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDA4NDAsIDQpOworCU9VVF9SSU5HKGNoYW4sIDApOworCU9VVF9SSU5HKGNoYW4sIDEpOworCU9VVF9SSU5HKGNoYW4sIDApOworCU9VVF9SSU5HKGNoYW4sIDEpOworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwMjAwLCAyKTsKKwlPVVRfUklORyhjaGFuLCBmb3JtYXQpOworCU9VVF9SSU5HKGNoYW4sIDEpOworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwMjE0LCA1KTsKKwlPVVRfUklORyhjaGFuLCBpbmZvLT5maXgubGluZV9sZW5ndGgpOworCU9VVF9SSU5HKGNoYW4sIGluZm8tPnZhci54cmVzX3ZpcnR1YWwpOworCU9VVF9SSU5HKGNoYW4sIGluZm8tPnZhci55cmVzX3ZpcnR1YWwpOworCU9VVF9SSU5HKGNoYW4sIDApOworCU9VVF9SSU5HKGNoYW4sIGluZm8tPmZpeC5zbWVtX3N0YXJ0IC0gZGV2X3ByaXYtPmZiX3BoeXMgKworCQkJIGRldl9wcml2LT52bV92cmFtX2Jhc2UpOworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwMjMwLCAyKTsKKwlPVVRfUklORyhjaGFuLCBmb3JtYXQpOworCU9VVF9SSU5HKGNoYW4sIDEpOworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwMjQ0LCA1KTsKKwlPVVRfUklORyhjaGFuLCBpbmZvLT5maXgubGluZV9sZW5ndGgpOworCU9VVF9SSU5HKGNoYW4sIGluZm8tPnZhci54cmVzX3ZpcnR1YWwpOworCU9VVF9SSU5HKGNoYW4sIGluZm8tPnZhci55cmVzX3ZpcnR1YWwpOworCU9VVF9SSU5HKGNoYW4sIDApOworCU9VVF9SSU5HKGNoYW4sIGluZm8tPmZpeC5zbWVtX3N0YXJ0IC0gZGV2X3ByaXYtPmZiX3BoeXMgKworCQkJIGRldl9wcml2LT52bV92cmFtX2Jhc2UpOworCisJaW5mby0+ZmJvcHMtPmZiX2ZpbGxyZWN0ID0gbnY1MF9mYmNvbl9maWxscmVjdDsKKwlpbmZvLT5mYm9wcy0+ZmJfY29weWFyZWEgPSBudjUwX2ZiY29uX2NvcHlhcmVhOworCWluZm8tPmZib3BzLT5mYl9pbWFnZWJsaXQgPSBudjUwX2ZiY29uX2ltYWdlYmxpdDsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9maWZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2ZpZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2FlMWFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9maWZvLmMKQEAgLTAsMCArMSw0OTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQmVuIFNrZWdncy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKworc3RydWN0IG52NTBfZmlmb19wcml2IHsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICp0aGluZ29bMl07CisJaW50IGN1cl90aGluZ287Cit9OworCisjZGVmaW5lIElTX0c4MCAoKGRldl9wcml2LT5jaGlwc2V0ICYgMHhmMCkgPT0gMHg1MCkKKworc3RhdGljIHZvaWQKK252NTBfZmlmb19pbml0X3RoaW5nbyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52NTBfZmlmb19wcml2ICpwcml2ID0gZGV2X3ByaXYtPmVuZ2luZS5maWZvLnByaXY7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqY3VyOworCWludCBpLCBucjsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwljdXIgPSBwcml2LT50aGluZ29bcHJpdi0+Y3VyX3RoaW5nb107CisJcHJpdi0+Y3VyX3RoaW5nbyA9ICFwcml2LT5jdXJfdGhpbmdvOworCisJLyogV2UgbmV2ZXIgc2NoZWR1bGUgY2hhbm5lbCAwIG9yIDEyNyAqLworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCWZvciAoaSA9IDEsIG5yID0gMDsgaSA8IDEyNzsgaSsrKSB7CisJCWlmIChkZXZfcHJpdi0+Zmlmb3NbaV0gJiYgZGV2X3ByaXYtPmZpZm9zW2ldLT5yYW1mYykKKwkJCW52X3dvMzIoZGV2LCBjdXItPmdwdW9iaiwgbnIrKywgaSk7CisJfQorCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisKKwludl93cjMyKGRldiwgMHgzMmY0LCBjdXItPmluc3RhbmNlID4+IDEyKTsKKwludl93cjMyKGRldiwgMHgzMmVjLCBucik7CisJbnZfd3IzMihkZXYsIDB4MjUwMCwgMHgxMDEpOworfQorCitzdGF0aWMgaW50CitudjUwX2ZpZm9fY2hhbm5lbF9lbmFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNoYW5uZWwsIGJvb2wgbnQpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmZpZm9zW2NoYW5uZWxdOworCXVpbnQzMl90IGluc3Q7CisKKwlOVl9ERUJVRyhkZXYsICJjaCVkXG4iLCBjaGFubmVsKTsKKworCWlmICghY2hhbi0+cmFtZmMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKElTX0c4MCkKKwkJaW5zdCA9IGNoYW4tPnJhbWZjLT5pbnN0YW5jZSA+PiAxMjsKKwllbHNlCisJCWluc3QgPSBjaGFuLT5yYW1mYy0+aW5zdGFuY2UgPj4gODsKKwludl93cjMyKGRldiwgTlY1MF9QRklGT19DVFhfVEFCTEUoY2hhbm5lbCksCisJCSBpbnN0IHwgTlY1MF9QRklGT19DVFhfVEFCTEVfQ0hBTk5FTF9FTkFCTEVEKTsKKworCWlmICghbnQpCisJCW52NTBfZmlmb19pbml0X3RoaW5nbyhkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9maWZvX2NoYW5uZWxfZGlzYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2hhbm5lbCwgYm9vbCBudCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IGluc3Q7CisKKwlOVl9ERUJVRyhkZXYsICJjaCVkLCBudD0lZFxuIiwgY2hhbm5lbCwgbnQpOworCisJaWYgKElTX0c4MCkKKwkJaW5zdCA9IE5WNTBfUEZJRk9fQ1RYX1RBQkxFX0lOU1RBTkNFX01BU0tfRzgwOworCWVsc2UKKwkJaW5zdCA9IE5WNTBfUEZJRk9fQ1RYX1RBQkxFX0lOU1RBTkNFX01BU0tfRzg0OworCW52X3dyMzIoZGV2LCBOVjUwX1BGSUZPX0NUWF9UQUJMRShjaGFubmVsKSwgaW5zdCk7CisKKwlpZiAoIW50KQorCQludjUwX2ZpZm9faW5pdF90aGluZ28oZGV2KTsKK30KKworc3RhdGljIHZvaWQKK252NTBfZmlmb19pbml0X3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdWludDMyX3QgcG1jX2UgPSBOVl9QTUNfRU5BQkxFX1BGSUZPOworCisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsIG52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpICYgfnBtY19lKTsKKwludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLCBudl9yZDMyKGRldiwgTlYwM19QTUNfRU5BQkxFKSB8ICBwbWNfZSk7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2ZpZm9faW5pdF9pbnRyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0lOVFJfMCwgMHhGRkZGRkZGRik7CisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fSU5UUl9FTl8wLCAweEZGRkZGRkZGKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfZmlmb19pbml0X2NvbnRleHRfdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpOworCisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBOVjUwX1BGSUZPX0NUWF9UQUJMRV9fU0laRTsgaSsrKSB7CisJCWlmIChkZXZfcHJpdi0+Zmlmb3NbaV0pCisJCQludjUwX2ZpZm9fY2hhbm5lbF9lbmFibGUoZGV2LCBpLCB0cnVlKTsKKwkJZWxzZQorCQkJbnY1MF9maWZvX2NoYW5uZWxfZGlzYWJsZShkZXYsIGksIHRydWUpOworCX0KKworCW52NTBfZmlmb19pbml0X3RoaW5nbyhkZXYpOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9maWZvX2luaXRfcmVnc19fbnYoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJbnZfd3IzMihkZXYsIDB4MjUwYywgMHg2ZjNjZmMzNCk7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2ZpZm9faW5pdF9yZWdzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCW52X3dyMzIoZGV2LCAweDI1MDAsIDApOworCW52X3dyMzIoZGV2LCAweDMyNTAsIDApOworCW52X3dyMzIoZGV2LCAweDMyMjAsIDApOworCW52X3dyMzIoZGV2LCAweDMyMDQsIDApOworCW52X3dyMzIoZGV2LCAweDMyMTAsIDApOworCW52X3dyMzIoZGV2LCAweDMyNzAsIDApOworCisJLyogRW5hYmxlIGR1bW15IGNoYW5uZWxzIHNldHVwIGJ5IG52NTBfaW5zdG1lbS5jICovCisJbnY1MF9maWZvX2NoYW5uZWxfZW5hYmxlKGRldiwgMCwgdHJ1ZSk7CisJbnY1MF9maWZvX2NoYW5uZWxfZW5hYmxlKGRldiwgMTI3LCB0cnVlKTsKK30KKworaW50CitudjUwX2ZpZm9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52NTBfZmlmb19wcml2ICpwcml2OworCWludCByZXQ7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJcHJpdiA9IGRldl9wcml2LT5lbmdpbmUuZmlmby5wcml2OworCWlmIChwcml2KSB7CisJCXByaXYtPmN1cl90aGluZ28gPSAhcHJpdi0+Y3VyX3RoaW5nbzsKKwkJZ290byBqdXN0X3Jlc2V0OworCX0KKworCXByaXYgPSBremFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisJZGV2X3ByaXYtPmVuZ2luZS5maWZvLnByaXYgPSBwcml2OworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X3JlZihkZXYsIE5VTEwsIE5VTEwsIDAsIDEyOCo0LCAweDEwMDAsCisJCQkJICAgICBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsICZwcml2LT50aGluZ29bMF0pOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiZXJyb3IgY3JlYXRpbmcgdGhpbmdvMDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X3JlZihkZXYsIE5VTEwsIE5VTEwsIDAsIDEyOCo0LCAweDEwMDAsCisJCQkJICAgICBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsICZwcml2LT50aGluZ29bMV0pOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiZXJyb3IgY3JlYXRpbmcgdGhpbmdvMTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCitqdXN0X3Jlc2V0OgorCW52NTBfZmlmb19pbml0X3Jlc2V0KGRldik7CisJbnY1MF9maWZvX2luaXRfaW50cihkZXYpOworCW52NTBfZmlmb19pbml0X2NvbnRleHRfdGFibGUoZGV2KTsKKwludjUwX2ZpZm9faW5pdF9yZWdzX19udihkZXYpOworCW52NTBfZmlmb19pbml0X3JlZ3MoZGV2KTsKKwlkZXZfcHJpdi0+ZW5naW5lLmZpZm8uZW5hYmxlKGRldik7CisJZGV2X3ByaXYtPmVuZ2luZS5maWZvLnJlYXNzaWduKGRldiwgdHJ1ZSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnY1MF9maWZvX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnY1MF9maWZvX3ByaXYgKnByaXYgPSBkZXZfcHJpdi0+ZW5naW5lLmZpZm8ucHJpdjsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwlpZiAoIXByaXYpCisJCXJldHVybjsKKworCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoZGV2LCAmcHJpdi0+dGhpbmdvWzBdKTsKKwlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJnByaXYtPnRoaW5nb1sxXSk7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmZpZm8ucHJpdiA9IE5VTEw7CisJa2ZyZWUocHJpdik7Cit9CisKK2ludAorbnY1MF9maWZvX2NoYW5uZWxfaWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gbnZfcmQzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gxKSAmCisJCQlOVjUwX1BGSUZPX0NBQ0hFMV9QVVNIMV9DSElEX01BU0s7Cit9CisKK2ludAorbnY1MF9maWZvX2NyZWF0ZV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcmFtZmMgPSBOVUxMOworCWludCByZXQ7CisKKwlOVl9ERUJVRyhkZXYsICJjaCVkXG4iLCBjaGFuLT5pZCk7CisKKwlpZiAoSVNfRzgwKSB7CisJCXVpbnQzMl90IHJhbWluX3BvZmZzZXQgPSBjaGFuLT5yYW1pbi0+Z3B1b2JqLT5pbV9wcmFtaW4tPnN0YXJ0OworCQl1aW50MzJfdCByYW1pbl92b2Zmc2V0ID0gY2hhbi0+cmFtaW4tPmdwdW9iai0+aW1fYmFja2luZ19zdGFydDsKKworCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfZmFrZShkZXYsIHJhbWluX3BvZmZzZXQsIHJhbWluX3ZvZmZzZXQsCisJCQkJCSAgICAgIDB4MTAwLCBOVk9CSl9GTEFHX1pFUk9fQUxMT0MgfAorCQkJCQkgICAgICBOVk9CSl9GTEFHX1pFUk9fRlJFRSwgJnJhbWZjLAorCQkJCQkgICAgICAmY2hhbi0+cmFtZmMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfZmFrZShkZXYsIHJhbWluX3BvZmZzZXQgKyAweDA0MDAsCisJCQkJCSAgICAgIHJhbWluX3ZvZmZzZXQgKyAweDA0MDAsIDQwOTYsCisJCQkJCSAgICAgIDAsIE5VTEwsICZjaGFuLT5jYWNoZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19yZWYoZGV2LCBjaGFuLCBOVUxMLCAwLCAweDEwMCwgMjU2LAorCQkJCQkgICAgIE5WT0JKX0ZMQUdfWkVST19BTExPQyB8CisJCQkJCSAgICAgTlZPQkpfRkxBR19aRVJPX0ZSRUUsCisJCQkJCSAgICAgJmNoYW4tPnJhbWZjKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXJhbWZjID0gY2hhbi0+cmFtZmMtPmdwdW9iajsKKworCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfcmVmKGRldiwgY2hhbiwgTlVMTCwgMCwgNDA5NiwgMjU2LAorCQkJCQkgICAgIDAsICZjaGFuLT5jYWNoZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCisJbnZfd28zMihkZXYsIHJhbWZjLCAweDA4LzQsIGNoYW4tPnB1c2hidWZfYmFzZSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDEwLzQsIGNoYW4tPnB1c2hidWZfYmFzZSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDQ4LzQsIGNoYW4tPnB1c2hidWYtPmluc3RhbmNlID4+IDQpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHg4MC80LCAoMHhjIDw8IDI0KSB8IChjaGFuLT5yYW1odC0+aW5zdGFuY2UgPj4gNCkpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHgzYy80LCAweDAwMDg2MDc4KTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4NDQvNCwgMHgyMTAxZmZmZik7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDYwLzQsIDB4N2ZmZmZmZmYpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHg0MC80LCAweDAwMDAwMDAwKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4N2MvNCwgMHgzMDAwMDAwMSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDc4LzQsIDB4MDAwMDAwMDApOworCW52X3dvMzIoZGV2LCByYW1mYywgMHg0Yy80LCAweGZmZmZmZmZmKTsKKworCWlmICghSVNfRzgwKSB7CisJCW52X3dvMzIoZGV2LCBjaGFuLT5yYW1pbi0+Z3B1b2JqLCAwLCBjaGFuLT5pZCk7CisJCW52X3dvMzIoZGV2LCBjaGFuLT5yYW1pbi0+Z3B1b2JqLCAxLAorCQkJCQkJY2hhbi0+cmFtZmMtPmluc3RhbmNlID4+IDgpOworCisJCW52X3dvMzIoZGV2LCByYW1mYywgMHg4OC80LCBjaGFuLT5jYWNoZS0+aW5zdGFuY2UgPj4gMTApOworCQludl93bzMyKGRldiwgcmFtZmMsIDB4OTgvNCwgY2hhbi0+cmFtaW4tPmluc3RhbmNlID4+IDEyKTsKKwl9CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCisJcmV0ID0gbnY1MF9maWZvX2NoYW5uZWxfZW5hYmxlKGRldiwgY2hhbi0+aWQsIGZhbHNlKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgImVycm9yIGVuYWJsaW5nIGNoJWQ6ICVkXG4iLCBjaGFuLT5pZCwgcmV0KTsKKwkJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZjaGFuLT5yYW1mYyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252NTBfZmlmb19kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCisJTlZfREVCVUcoZGV2LCAiY2glZFxuIiwgY2hhbi0+aWQpOworCisJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZjaGFuLT5yYW1mYyk7CisJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZjaGFuLT5jYWNoZSk7CisKKwludjUwX2ZpZm9fY2hhbm5lbF9kaXNhYmxlKGRldiwgY2hhbi0+aWQsIGZhbHNlKTsKKworCS8qIER1bW15IGNoYW5uZWwsIGFsc28gdXNlZCBvbiBjaCAxMjcgKi8KKwlpZiAoY2hhbi0+aWQgPT0gMCkKKwkJbnY1MF9maWZvX2NoYW5uZWxfZGlzYWJsZShkZXYsIDEyNywgZmFsc2UpOworfQorCitpbnQKK252NTBfZmlmb19sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpyYW1mYyA9IGNoYW4tPnJhbWZjLT5ncHVvYmo7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpjYWNoZSA9IGNoYW4tPmNhY2hlLT5ncHVvYmo7CisJaW50IHB0ciwgY250OworCisJTlZfREVCVUcoZGV2LCAiY2glZFxuIiwgY2hhbi0+aWQpOworCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgZmFsc2UpOworCisJbnZfd3IzMihkZXYsIDB4MzMzMCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDAwLzQpKTsKKwludl93cjMyKGRldiwgMHgzMzM0LCBudl9ybzMyKGRldiwgcmFtZmMsIDB4MDQvNCkpOworCW52X3dyMzIoZGV2LCAweDMyNDAsIG52X3JvMzIoZGV2LCByYW1mYywgMHgwOC80KSk7CisJbnZfd3IzMihkZXYsIDB4MzMyMCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDBjLzQpKTsKKwludl93cjMyKGRldiwgMHgzMjQ0LCBudl9ybzMyKGRldiwgcmFtZmMsIDB4MTAvNCkpOworCW52X3dyMzIoZGV2LCAweDMzMjgsIG52X3JvMzIoZGV2LCByYW1mYywgMHgxNC80KSk7CisJbnZfd3IzMihkZXYsIDB4MzM2OCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDE4LzQpKTsKKwludl93cjMyKGRldiwgMHgzMzZjLCBudl9ybzMyKGRldiwgcmFtZmMsIDB4MWMvNCkpOworCW52X3dyMzIoZGV2LCAweDMzNzAsIG52X3JvMzIoZGV2LCByYW1mYywgMHgyMC80KSk7CisJbnZfd3IzMihkZXYsIDB4MzM3NCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDI0LzQpKTsKKwludl93cjMyKGRldiwgMHgzMzc4LCBudl9ybzMyKGRldiwgcmFtZmMsIDB4MjgvNCkpOworCW52X3dyMzIoZGV2LCAweDMzN2MsIG52X3JvMzIoZGV2LCByYW1mYywgMHgyYy80KSk7CisJbnZfd3IzMihkZXYsIDB4MzIyOCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDMwLzQpKTsKKwludl93cjMyKGRldiwgMHgzMzY0LCBudl9ybzMyKGRldiwgcmFtZmMsIDB4MzQvNCkpOworCW52X3dyMzIoZGV2LCAweDMyYTAsIG52X3JvMzIoZGV2LCByYW1mYywgMHgzOC80KSk7CisJbnZfd3IzMihkZXYsIDB4MzIyNCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDNjLzQpKTsKKwludl93cjMyKGRldiwgMHgzMjRjLCBudl9ybzMyKGRldiwgcmFtZmMsIDB4NDAvNCkpOworCW52X3dyMzIoZGV2LCAweDIwNDQsIG52X3JvMzIoZGV2LCByYW1mYywgMHg0NC80KSk7CisJbnZfd3IzMihkZXYsIDB4MzIyYywgbnZfcm8zMihkZXYsIHJhbWZjLCAweDQ4LzQpKTsKKwludl93cjMyKGRldiwgMHgzMjM0LCBudl9ybzMyKGRldiwgcmFtZmMsIDB4NGMvNCkpOworCW52X3dyMzIoZGV2LCAweDMzNDAsIG52X3JvMzIoZGV2LCByYW1mYywgMHg1MC80KSk7CisJbnZfd3IzMihkZXYsIDB4MzM0NCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDU0LzQpKTsKKwludl93cjMyKGRldiwgMHgzMjgwLCBudl9ybzMyKGRldiwgcmFtZmMsIDB4NTgvNCkpOworCW52X3dyMzIoZGV2LCAweDMyNTQsIG52X3JvMzIoZGV2LCByYW1mYywgMHg1Yy80KSk7CisJbnZfd3IzMihkZXYsIDB4MzI2MCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDYwLzQpKTsKKwludl93cjMyKGRldiwgMHgzMjY0LCBudl9ybzMyKGRldiwgcmFtZmMsIDB4NjQvNCkpOworCW52X3dyMzIoZGV2LCAweDMyNjgsIG52X3JvMzIoZGV2LCByYW1mYywgMHg2OC80KSk7CisJbnZfd3IzMihkZXYsIDB4MzI2YywgbnZfcm8zMihkZXYsIHJhbWZjLCAweDZjLzQpKTsKKwludl93cjMyKGRldiwgMHgzMmU0LCBudl9ybzMyKGRldiwgcmFtZmMsIDB4NzAvNCkpOworCW52X3dyMzIoZGV2LCAweDMyNDgsIG52X3JvMzIoZGV2LCByYW1mYywgMHg3NC80KSk7CisJbnZfd3IzMihkZXYsIDB4MjA4OCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDc4LzQpKTsKKwludl93cjMyKGRldiwgMHgyMDU4LCBudl9ybzMyKGRldiwgcmFtZmMsIDB4N2MvNCkpOworCW52X3dyMzIoZGV2LCAweDIyMTAsIG52X3JvMzIoZGV2LCByYW1mYywgMHg4MC80KSk7CisKKwljbnQgPSBudl9ybzMyKGRldiwgcmFtZmMsIDB4ODQvNCk7CisJZm9yIChwdHIgPSAwOyBwdHIgPCBjbnQ7IHB0cisrKSB7CisJCW52X3dyMzIoZGV2LCBOVjQwX1BGSUZPX0NBQ0hFMV9NRVRIT0QocHRyKSwKKwkJCW52X3JvMzIoZGV2LCBjYWNoZSwgKHB0ciAqIDIpICsgMCkpOworCQludl93cjMyKGRldiwgTlY0MF9QRklGT19DQUNIRTFfREFUQShwdHIpLAorCQkJbnZfcm8zMihkZXYsIGNhY2hlLCAocHRyICogMikgKyAxKSk7CisJfQorCW52X3dyMzIoZGV2LCAweDMyMTAsIGNudCA8PCAyKTsKKwludl93cjMyKGRldiwgMHgzMjcwLCAwKTsKKworCS8qIGd1ZXNzaW5nIHRoYXQgYWxsIHRoZSAweDM0eHggcmVncyBhcmVuJ3Qgb24gTlY1MCAqLworCWlmICghSVNfRzgwKSB7CisJCW52X3dyMzIoZGV2LCAweDM0MGMsIG52X3JvMzIoZGV2LCByYW1mYywgMHg4OC80KSk7CisJCW52X3dyMzIoZGV2LCAweDM0MDAsIG52X3JvMzIoZGV2LCByYW1mYywgMHg4Yy80KSk7CisJCW52X3dyMzIoZGV2LCAweDM0MDQsIG52X3JvMzIoZGV2LCByYW1mYywgMHg5MC80KSk7CisJCW52X3dyMzIoZGV2LCAweDM0MDgsIG52X3JvMzIoZGV2LCByYW1mYywgMHg5NC80KSk7CisJCW52X3dyMzIoZGV2LCAweDM0MTAsIG52X3JvMzIoZGV2LCByYW1mYywgMHg5OC80KSk7CisJfQorCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9HRVQsIDApOworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVQsIDApOworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMSwgY2hhbi0+aWQgfCAoMTw8MTYpKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitudjUwX2ZpZm9fdW5sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2ZpZm9fZW5naW5lICpwZmlmbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmZpZm87CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpyYW1mYywgKmNhY2hlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBOVUxMOworCWludCBjaGlkLCBnZXQsIHB1dCwgcHRyOworCisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCWNoaWQgPSBwZmlmby0+Y2hhbm5lbF9pZChkZXYpOworCWlmIChjaGlkIDwgMCB8fCBjaGlkID49IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVscykKKwkJcmV0dXJuIDA7CisKKwljaGFuID0gZGV2X3ByaXYtPmZpZm9zW2NoaWRdOworCWlmICghY2hhbikgeworCQlOVl9FUlJPUihkZXYsICJJbmFjdGl2ZSBjaGFubmVsIG9uIFBGSUZPOiAlZFxuIiwgY2hpZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlOVl9ERUJVRyhkZXYsICJjaCVkXG4iLCBjaGFuLT5pZCk7CisJcmFtZmMgPSBjaGFuLT5yYW1mYy0+Z3B1b2JqOworCWNhY2hlID0gY2hhbi0+Y2FjaGUtPmdwdW9iajsKKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCisJbnZfd28zMihkZXYsIHJhbWZjLCAweDAwLzQsIG52X3JkMzIoZGV2LCAweDMzMzApKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4MDQvNCwgbnZfcmQzMihkZXYsIDB4MzMzNCkpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHgwOC80LCBudl9yZDMyKGRldiwgMHgzMjQwKSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDBjLzQsIG52X3JkMzIoZGV2LCAweDMzMjApKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4MTAvNCwgbnZfcmQzMihkZXYsIDB4MzI0NCkpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHgxNC80LCBudl9yZDMyKGRldiwgMHgzMzI4KSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDE4LzQsIG52X3JkMzIoZGV2LCAweDMzNjgpKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4MWMvNCwgbnZfcmQzMihkZXYsIDB4MzM2YykpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHgyMC80LCBudl9yZDMyKGRldiwgMHgzMzcwKSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDI0LzQsIG52X3JkMzIoZGV2LCAweDMzNzQpKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4MjgvNCwgbnZfcmQzMihkZXYsIDB4MzM3OCkpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHgyYy80LCBudl9yZDMyKGRldiwgMHgzMzdjKSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDMwLzQsIG52X3JkMzIoZGV2LCAweDMyMjgpKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4MzQvNCwgbnZfcmQzMihkZXYsIDB4MzM2NCkpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHgzOC80LCBudl9yZDMyKGRldiwgMHgzMmEwKSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDNjLzQsIG52X3JkMzIoZGV2LCAweDMyMjQpKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4NDAvNCwgbnZfcmQzMihkZXYsIDB4MzI0YykpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHg0NC80LCBudl9yZDMyKGRldiwgMHgyMDQ0KSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDQ4LzQsIG52X3JkMzIoZGV2LCAweDMyMmMpKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4NGMvNCwgbnZfcmQzMihkZXYsIDB4MzIzNCkpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHg1MC80LCBudl9yZDMyKGRldiwgMHgzMzQwKSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDU0LzQsIG52X3JkMzIoZGV2LCAweDMzNDQpKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4NTgvNCwgbnZfcmQzMihkZXYsIDB4MzI4MCkpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHg1Yy80LCBudl9yZDMyKGRldiwgMHgzMjU0KSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDYwLzQsIG52X3JkMzIoZGV2LCAweDMyNjApKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4NjQvNCwgbnZfcmQzMihkZXYsIDB4MzI2NCkpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHg2OC80LCBudl9yZDMyKGRldiwgMHgzMjY4KSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDZjLzQsIG52X3JkMzIoZGV2LCAweDMyNmMpKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4NzAvNCwgbnZfcmQzMihkZXYsIDB4MzJlNCkpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHg3NC80LCBudl9yZDMyKGRldiwgMHgzMjQ4KSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDc4LzQsIG52X3JkMzIoZGV2LCAweDIwODgpKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4N2MvNCwgbnZfcmQzMihkZXYsIDB4MjA1OCkpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHg4MC80LCBudl9yZDMyKGRldiwgMHgyMjEwKSk7CisKKwlwdXQgPSAobnZfcmQzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVVCkgJiAweDdmZikgPj4gMjsKKwlnZXQgPSAobnZfcmQzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX0dFVCkgJiAweDdmZikgPj4gMjsKKwlwdHIgPSAwOworCXdoaWxlIChwdXQgIT0gZ2V0KSB7CisJCW52X3dvMzIoZGV2LCBjYWNoZSwgcHRyKyssCisJCQkgICAgbnZfcmQzMihkZXYsIE5WNDBfUEZJRk9fQ0FDSEUxX01FVEhPRChnZXQpKSk7CisJCW52X3dvMzIoZGV2LCBjYWNoZSwgcHRyKyssCisJCQkgICAgbnZfcmQzMihkZXYsIE5WNDBfUEZJRk9fQ0FDSEUxX0RBVEEoZ2V0KSkpOworCQlnZXQgPSAoZ2V0ICsgMSkgJiAweDFmZjsKKwl9CisKKwkvKiBndWVzc2luZyB0aGF0IGFsbCB0aGUgMHgzNHh4IHJlZ3MgYXJlbid0IG9uIE5WNTAgKi8KKwlpZiAoIUlTX0c4MCkgeworCQludl93bzMyKGRldiwgcmFtZmMsIDB4ODQvNCwgcHRyID4+IDEpOworCQludl93bzMyKGRldiwgcmFtZmMsIDB4ODgvNCwgbnZfcmQzMihkZXYsIDB4MzQwYykpOworCQludl93bzMyKGRldiwgcmFtZmMsIDB4OGMvNCwgbnZfcmQzMihkZXYsIDB4MzQwMCkpOworCQludl93bzMyKGRldiwgcmFtZmMsIDB4OTAvNCwgbnZfcmQzMihkZXYsIDB4MzQwNCkpOworCQludl93bzMyKGRldiwgcmFtZmMsIDB4OTQvNCwgbnZfcmQzMihkZXYsIDB4MzQwOCkpOworCQludl93bzMyKGRldiwgcmFtZmMsIDB4OTgvNCwgbnZfcmQzMihkZXYsIDB4MzQxMCkpOworCX0KKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisKKwkvKlhYWDogcHJvYmFibHkgcmVsb2FkIGNoMTI3IChOVUxMKSBzdGF0ZSBiYWNrIHRvbyAqLworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMSwgMTI3KTsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncmFwaC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncmFwaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3N2Q4MjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2dyYXBoLmMKQEAgLTAsMCArMSwzODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQmVuIFNrZWdncy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NTAuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252NTAuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252ODQuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252ODQuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252ODYuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252ODYuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252OTIuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252OTIuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252OTQuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252OTQuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252OTYuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252OTYuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252OTguY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252OTguY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YTAuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YTAuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YTUuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YTUuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YTguY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YTguY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YWEuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YWEuY3R4dmFscyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YWMuY3R4cHJvZyIpOworTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YWMuY3R4dmFscyIpOworCisjZGVmaW5lIElTX0c4MCAoKGRldl9wcml2LT5jaGlwc2V0ICYgMHhmMCkgPT0gMHg1MCkKKworc3RhdGljIHZvaWQKK252NTBfZ3JhcGhfaW5pdF9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXVpbnQzMl90IHBtY19lID0gTlZfUE1DX0VOQUJMRV9QR1JBUEggfCAoMSA8PCAyMSk7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwgbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgJiB+cG1jX2UpOworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsIG52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpIHwgIHBtY19lKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfZ3JhcGhfaW5pdF9pbnRyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCAweGZmZmZmZmZmKTsKKwludl93cjMyKGRldiwgMHg0MDAxMzgsIDB4ZmZmZmZmZmYpOworCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9JTlRSX0VOLCAweGZmZmZmZmZmKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfZ3JhcGhfaW5pdF9yZWdzX19udihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwludl93cjMyKGRldiwgMHg0MDA4MDQsIDB4YzAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNjgwMCwgMHhjMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwYzA0LCAweGMwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDE4MDQsIDB4YzAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNTAxOCwgMHhjMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDAyMDAwLCAweGMwMDAwMDAwKTsKKworCW52X3dyMzIoZGV2LCAweDQwMDEwOCwgMHhmZmZmZmZmZik7CisKKwludl93cjMyKGRldiwgMHg0MDA4MjQsIDB4MDAwMDQwMDApOworCW52X3dyMzIoZGV2LCAweDQwMDUwMCwgMHgwMDAxMDAwMSk7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2dyYXBoX2luaXRfcmVncyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMywKKwkJCQkoMSA8PCAyKSAvKiBIV19DT05URVhUX1NXSVRDSF9FTkFCTEVEICovKTsKKwludl93cjMyKGRldiwgMHg0MDJjYTgsIDB4ODAwKTsKK30KKworc3RhdGljIGludAorbnY1MF9ncmFwaF9pbml0X2N0eGN0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwludjQwX2dyY3R4X2luaXQoZGV2KTsKKworCW52X3dyMzIoZGV2LCAweDQwMDMyMCwgNCk7CisJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF9DVVIsIDApOworCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9DSEFOTkVMX0NUWF9QT0lOVEVSLCAwKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitudjUwX2dyYXBoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCW52NTBfZ3JhcGhfaW5pdF9yZXNldChkZXYpOworCW52NTBfZ3JhcGhfaW5pdF9yZWdzX19udihkZXYpOworCW52NTBfZ3JhcGhfaW5pdF9yZWdzKGRldik7CisJbnY1MF9ncmFwaF9pbml0X2ludHIoZGV2KTsKKworCXJldCA9IG52NTBfZ3JhcGhfaW5pdF9jdHhjdGwoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252NTBfZ3JhcGhfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCW52NDBfZ3JjdHhfZmluaShkZXYpOworfQorCit2b2lkCitudjUwX2dyYXBoX2ZpZm9fYWNjZXNzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlZCkKK3sKKwljb25zdCB1aW50MzJfdCBtYXNrID0gMHgwMDAxMDAwMTsKKworCWlmIChlbmFibGVkKQorCQludl93cjMyKGRldiwgMHg0MDA1MDAsIG52X3JkMzIoZGV2LCAweDQwMDUwMCkgfCBtYXNrKTsKKwllbHNlCisJCW52X3dyMzIoZGV2LCAweDQwMDUwMCwgbnZfcmQzMihkZXYsIDB4NDAwNTAwKSAmIH5tYXNrKTsKK30KKworc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqCitudjUwX2dyYXBoX2NoYW5uZWwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IGluc3Q7CisJaW50IGk7CisKKwlpbnN0ID0gbnZfcmQzMihkZXYsIE5WNTBfUEdSQVBIX0NUWENUTF9DVVIpOworCWlmICghKGluc3QgJiBOVjUwX1BHUkFQSF9DVFhDVExfQ1VSX0xPQURFRCkpCisJCXJldHVybiBOVUxMOworCWluc3QgPSAoaW5zdCAmIE5WNTBfUEdSQVBIX0NUWENUTF9DVVJfSU5TVEFOQ0UpIDw8IDEyOworCisJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVsczsgaSsrKSB7CisJCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbaV07CisKKwkJaWYgKGNoYW4gJiYgY2hhbi0+cmFtaW4gJiYgY2hhbi0+cmFtaW4tPmluc3RhbmNlID09IGluc3QpCisJCQlyZXR1cm4gY2hhbjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworaW50CitudjUwX2dyYXBoX2NyZWF0ZV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcmFtaW4gPSBjaGFuLT5yYW1pbi0+Z3B1b2JqOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqY3R4OworCXVpbnQzMl90IGdyY3R4X3NpemUgPSAweDcwMDAwOworCWludCBoZHIsIHJldDsKKworCU5WX0RFQlVHKGRldiwgImNoJWRcbiIsIGNoYW4tPmlkKTsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19yZWYoZGV2LCBjaGFuLCBOVUxMLCAwLCBncmN0eF9zaXplLCAweDEwMDAsCisJCQkJICAgICBOVk9CSl9GTEFHX1pFUk9fQUxMT0MgfAorCQkJCSAgICAgTlZPQkpfRkxBR19aRVJPX0ZSRUUsICZjaGFuLT5yYW1pbl9ncmN0eCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwljdHggPSBjaGFuLT5yYW1pbl9ncmN0eC0+Z3B1b2JqOworCisJaGRyID0gSVNfRzgwID8gMHgyMDAgOiAweDIwOworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCW52X3dvMzIoZGV2LCByYW1pbiwgKGhkciArIDB4MDApLzQsIDB4MDAxOTAwMDIpOworCW52X3dvMzIoZGV2LCByYW1pbiwgKGhkciArIDB4MDQpLzQsIGNoYW4tPnJhbWluX2dyY3R4LT5pbnN0YW5jZSArCisJCQkJCSAgIGdyY3R4X3NpemUgLSAxKTsKKwludl93bzMyKGRldiwgcmFtaW4sIChoZHIgKyAweDA4KS80LCBjaGFuLT5yYW1pbl9ncmN0eC0+aW5zdGFuY2UpOworCW52X3dvMzIoZGV2LCByYW1pbiwgKGhkciArIDB4MGMpLzQsIDApOworCW52X3dvMzIoZGV2LCByYW1pbiwgKGhkciArIDB4MTApLzQsIDApOworCW52X3dvMzIoZGV2LCByYW1pbiwgKGhkciArIDB4MTQpLzQsIDB4MDAwMTAwMDApOworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKwludjQwX2dyY3R4X3ZhbHNfbG9hZChkZXYsIGN0eCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwMDAwMC80LCBjaGFuLT5yYW1pbi0+aW5zdGFuY2UgPj4gMTIpOworCWlmICgoZGV2X3ByaXYtPmNoaXBzZXQgJiAweGYwKSA9PSAweGEwKQorCQludl93bzMyKGRldiwgY3R4LCAweDAwMDA0LzQsIDB4MDAwMDAwMDApOworCWVsc2UKKwkJbnZfd28zMihkZXYsIGN0eCwgMHgwMDExYy80LCAweDAwMDAwMDAwKTsKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252NTBfZ3JhcGhfZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpLCBoZHIgPSBJU19HODAgPyAweDIwMCA6IDB4MjA7CisKKwlOVl9ERUJVRyhkZXYsICJjaCVkXG4iLCBjaGFuLT5pZCk7CisKKwlpZiAoIWNoYW4tPnJhbWluIHx8ICFjaGFuLT5yYW1pbi0+Z3B1b2JqKQorCQlyZXR1cm47CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKwlmb3IgKGkgPSBoZHI7IGkgPCBoZHIgKyAyNDsgaSArPSA0KQorCQludl93bzMyKGRldiwgY2hhbi0+cmFtaW4tPmdwdW9iaiwgaS80LCAwKTsKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCisJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZjaGFuLT5yYW1pbl9ncmN0eCk7Cit9CisKK3N0YXRpYyBpbnQKK252NTBfZ3JhcGhfZG9fbG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IGluc3QpCit7CisJdWludDMyX3QgZmlmbyA9IG52X3JkMzIoZGV2LCAweDQwMDUwMCk7CisKKwludl93cjMyKGRldiwgMHg0MDA1MDAsIGZpZm8gJiB+MSk7CisJbnZfd3IzMihkZXYsIDB4NDAwNzg0LCBpbnN0KTsKKwludl93cjMyKGRldiwgMHg0MDA4MjQsIG52X3JkMzIoZGV2LCAweDQwMDgyNCkgfCAweDQwKTsKKwludl93cjMyKGRldiwgMHg0MDAzMjAsIG52X3JkMzIoZGV2LCAweDQwMDMyMCkgfCAweDExKTsKKwludl93cjMyKGRldiwgMHg0MDAwNDAsIDB4ZmZmZmZmZmYpOworCSh2b2lkKW52X3JkMzIoZGV2LCAweDQwMDA0MCk7CisJbnZfd3IzMihkZXYsIDB4NDAwMDQwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDAzMDQsIG52X3JkMzIoZGV2LCAweDQwMDMwNCkgfCAxKTsKKworCWlmIChub3V2ZWF1X3dhaXRfZm9yX2lkbGUoZGV2KSkKKwkJbnZfd3IzMihkZXYsIDB4NDAwMzJjLCBpbnN0IHwgKDE8PDMxKSk7CisJbnZfd3IzMihkZXYsIDB4NDAwNTAwLCBmaWZvKTsKKworCXJldHVybiAwOworfQorCitpbnQKK252NTBfZ3JhcGhfbG9hZF9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJdWludDMyX3QgaW5zdCA9IGNoYW4tPnJhbWluLT5pbnN0YW5jZSA+PiAxMjsKKworCU5WX0RFQlVHKGNoYW4tPmRldiwgImNoJWRcbiIsIGNoYW4tPmlkKTsKKwlyZXR1cm4gbnY1MF9ncmFwaF9kb19sb2FkX2NvbnRleHQoY2hhbi0+ZGV2LCBpbnN0KTsKK30KKworaW50CitudjUwX2dyYXBoX3VubG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdWludDMyX3QgaW5zdCwgZmlmbyA9IG52X3JkMzIoZGV2LCAweDQwMDUwMCk7CisKKwlpbnN0ICA9IG52X3JkMzIoZGV2LCBOVjUwX1BHUkFQSF9DVFhDVExfQ1VSKTsKKwlpZiAoIShpbnN0ICYgTlY1MF9QR1JBUEhfQ1RYQ1RMX0NVUl9MT0FERUQpKQorCQlyZXR1cm4gMDsKKwlpbnN0ICY9IE5WNTBfUEdSQVBIX0NUWENUTF9DVVJfSU5TVEFOQ0U7CisKKwludl93cjMyKGRldiwgMHg0MDA1MDAsIGZpZm8gJiB+MSk7CisJbnZfd3IzMihkZXYsIDB4NDAwNzg0LCBpbnN0KTsKKwludl93cjMyKGRldiwgMHg0MDA4MjQsIG52X3JkMzIoZGV2LCAweDQwMDgyNCkgfCAweDIwKTsKKwludl93cjMyKGRldiwgMHg0MDAzMDQsIG52X3JkMzIoZGV2LCAweDQwMDMwNCkgfCAweDAxKTsKKwlub3V2ZWF1X3dhaXRfZm9yX2lkbGUoZGV2KTsKKwludl93cjMyKGRldiwgMHg0MDA1MDAsIGZpZm8pOworCisJbnZfd3IzMihkZXYsIE5WNTBfUEdSQVBIX0NUWENUTF9DVVIsIGluc3QpOworCXJldHVybiAwOworfQorCit2b2lkCitudjUwX2dyYXBoX2NvbnRleHRfc3dpdGNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdWludDMyX3QgaW5zdDsKKworCW52NTBfZ3JhcGhfdW5sb2FkX2NvbnRleHQoZGV2KTsKKworCWluc3QgID0gbnZfcmQzMihkZXYsIE5WNTBfUEdSQVBIX0NUWENUTF9ORVhUKTsKKwlpbnN0ICY9IE5WNTBfUEdSQVBIX0NUWENUTF9ORVhUX0lOU1RBTkNFOworCW52NTBfZ3JhcGhfZG9fbG9hZF9jb250ZXh0KGRldiwgaW5zdCk7CisKKwludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfSU5UUl9FTiwgbnZfcmQzMihkZXYsCisJCU5WNDBfUEdSQVBIX0lOVFJfRU4pIHwgTlZfUEdSQVBIX0lOVFJfQ09OVEVYVF9TV0lUQ0gpOworfQorCitzdGF0aWMgaW50CitudjUwX2dyYXBoX252c3dfZG1hX3ZibHNlbShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKKwkJCSAgIGludCBtdGhkLCB1aW50MzJfdCBkYXRhKQoreworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKnJlZiA9IE5VTEw7CisKKwlpZiAobm91dmVhdV9ncHVvYmpfcmVmX2ZpbmQoY2hhbiwgZGF0YSwgJnJlZikpCisJCXJldHVybiAtRU5PRU5UOworCisJaWYgKG5vdXZlYXVfbm90aWZpZXJfb2Zmc2V0KHJlZi0+Z3B1b2JqLCBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljaGFuLT5udnN3LnZibHNlbSA9IHJlZi0+Z3B1b2JqOworCWNoYW4tPm52c3cudmJsc2VtX29mZnNldCA9IH4wOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitudjUwX2dyYXBoX252c3dfdmJsc2VtX29mZnNldChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKKwkJCSAgICAgIGludCBtdGhkLCB1aW50MzJfdCBkYXRhKQoreworCWlmIChub3V2ZWF1X25vdGlmaWVyX29mZnNldChjaGFuLT5udnN3LnZibHNlbSwgJmRhdGEpKQorCQlyZXR1cm4gLUVSQU5HRTsKKworCWNoYW4tPm52c3cudmJsc2VtX29mZnNldCA9IGRhdGEgPj4gMjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnY1MF9ncmFwaF9udnN3X3ZibHNlbV9yZWxlYXNlX3ZhbChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKKwkJCQkgICBpbnQgbXRoZCwgdWludDMyX3QgZGF0YSkKK3sKKwljaGFuLT5udnN3LnZibHNlbV9ydmFsID0gZGF0YTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnY1MF9ncmFwaF9udnN3X3ZibHNlbV9yZWxlYXNlKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAorCQkJICAgICAgIGludCBtdGhkLCB1aW50MzJfdCBkYXRhKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmICghY2hhbi0+bnZzdy52YmxzZW0gfHwgY2hhbi0+bnZzdy52YmxzZW1fb2Zmc2V0ID09IH4wIHx8IGRhdGEgPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghKG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfRU4pICYKKwkJICAgICAgTlY1MF9QRElTUExBWV9JTlRSX0VOX1ZCTEFOS19DUlRDXyhkYXRhKSkpIHsKKwkJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl8xLAorCQkJTlY1MF9QRElTUExBWV9JTlRSXzFfVkJMQU5LX0NSVENfKGRhdGEpKTsKKwkJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl9FTiwgbnZfcmQzMihkZXYsCisJCQlOVjUwX1BESVNQTEFZX0lOVFJfRU4pIHwKKwkJCU5WNTBfUERJU1BMQVlfSU5UUl9FTl9WQkxBTktfQ1JUQ18oZGF0YSkpOworCX0KKworCWxpc3RfYWRkKCZjaGFuLT5udnN3LnZibF93YWl0LCAmZGV2X3ByaXYtPnZibF93YWl0aW5nKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfbWV0aG9kIG52NTBfZ3JhcGhfbnZzd19tZXRob2RzW10gPSB7CisJeyAweDAxOGMsIG52NTBfZ3JhcGhfbnZzd19kbWFfdmJsc2VtIH0sCisJeyAweDA0MDAsIG52NTBfZ3JhcGhfbnZzd192YmxzZW1fb2Zmc2V0IH0sCisJeyAweDA0MDQsIG52NTBfZ3JhcGhfbnZzd192YmxzZW1fcmVsZWFzZV92YWwgfSwKKwl7IDB4MDQwOCwgbnY1MF9ncmFwaF9udnN3X3ZibHNlbV9yZWxlYXNlIH0sCisJe30KK307CisKK3N0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgbnY1MF9ncmFwaF9ncmNsYXNzW10gPSB7CisJeyAweDUwNmUsIHRydWUsIG52NTBfZ3JhcGhfbnZzd19tZXRob2RzIH0sIC8qIG52c3cgKi8KKwl7IDB4MDAzMCwgZmFsc2UsIE5VTEwgfSwgLyogbnVsbCAqLworCXsgMHg1MDM5LCBmYWxzZSwgTlVMTCB9LCAvKiBtMm1mICovCisJeyAweDUwMmQsIGZhbHNlLCBOVUxMIH0sIC8qIDJkICovCisJeyAweDUwYzAsIGZhbHNlLCBOVUxMIH0sIC8qIGNvbXB1dGUgKi8KKwl7IDB4NTA5NywgZmFsc2UsIE5VTEwgfSwgLyogdGVzbGEgKG52NTApICovCisJeyAweDgyOTcsIGZhbHNlLCBOVUxMIH0sIC8qIHRlc2xhIChudjgwL252OTApICovCisJeyAweDgzOTcsIGZhbHNlLCBOVUxMIH0sIC8qIHRlc2xhIChudmEwKSAqLworCXsgMHg4NTk3LCBmYWxzZSwgTlVMTCB9LCAvKiB0ZXNsYSAobnZhOCkgKi8KKwl7fQorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfaW5zdG1lbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9pbnN0bWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ0MDBmNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfaW5zdG1lbS5jCkBAIC0wLDAgKzEsNTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEJlbiBTa2VnZ3MuCisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorCitzdHJ1Y3QgbnY1MF9pbnN0bWVtX3ByaXYgeworCXVpbnQzMl90IHNhdmUxNzAwWzVdOyAvKiAweDE3MDAtPjB4MTcxMCAqLworCisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqcHJhbWluX3B0OworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKnByYW1pbl9iYXI7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqZmJfYmFyOworCisJYm9vbCBsYXN0X2FjY2Vzc193cjsKK307CisKKyNkZWZpbmUgTlY1MF9JTlNUTUVNX1BBR0VfU0hJRlQgMTIKKyNkZWZpbmUgTlY1MF9JTlNUTUVNX1BBR0VfU0laRSAgKDEgPDwgTlY1MF9JTlNUTUVNX1BBR0VfU0hJRlQpCisjZGVmaW5lIE5WNTBfSU5TVE1FTV9QVF9TSVpFKGEpCSgoKGEpID4+IDEyKSA8PCAzKQorCisvKk5PVEU6IC0gQXNzdW1lcyAweDE3MDAgYWxyZWFkeSBjb3ZlcnMgdGhlIGNvcnJlY3QgTWlCIG9mIFBSQU1JTgorICovCisjZGVmaW5lIEJBUjBfV0kzMihnLCBvLCB2KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJdWludDMyX3Qgb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoKGcpLT5pbV9iYWNraW5nKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlvZmZzZXQgPSAoZyktPmltX2JhY2tpbmdfc3RhcnQ7ICAgICAgICAgICAgICAgICAgIFwKKwl9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlvZmZzZXQgID0gY2hhbi0+cmFtaW4tPmdwdW9iai0+aW1fYmFja2luZ19zdGFydDsgIFwKKwkJb2Zmc2V0ICs9IChnKS0+aW1fcHJhbWluLT5zdGFydDsgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlvZmZzZXQgKz0gKG8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCW52X3dyMzIoZGV2LCBOVl9SQU1JTiArIChvZmZzZXQgJiAweGZmZmZmKSwgKHYpKTsgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK2ludAorbnY1MF9pbnN0bWVtX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CisJdWludDMyX3QgY19vZmZzZXQsIGNfc2l6ZSwgY19yYW1mYywgY192bXBkLCBjX2Jhc2UsIHB0X3NpemU7CisJc3RydWN0IG52NTBfaW5zdG1lbV9wcml2ICpwcml2OworCWludCByZXQsIGk7CisJdWludDMyX3Qgdiwgc2F2ZV9udjAwMTcwMDsKKworCXByaXYgPSBremFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByaXYgPSBwcml2OworCisJLyogU2F2ZSBzdGF0ZSwgd2lsbCByZXN0b3JlIGF0IHRha2Vkb3duLiAqLworCWZvciAoaSA9IDB4MTcwMDsgaSA8PSAweDE3MTA7IGkgKz0gNCkKKwkJcHJpdi0+c2F2ZTE3MDBbKGktMHgxNzAwKS80XSA9IG52X3JkMzIoZGV2LCBpKTsKKworCS8qIFJlc2VydmUgdGhlIGxhc3QgTWlCIG9mIFZSQU0sIHdlIHNob3VsZCBwcm9iYWJseSB0cnkgdG8gYXZvaWQKKwkgKiBzZXR0aW5nIHVwIHRoZSBiZWxvdyB0YWJsZXMgb3ZlciB0aGUgdG9wIG9mIHRoZSBWQklPUyBpbWFnZSBhdAorCSAqIHNvbWUgcG9pbnQuCisJICovCisJZGV2X3ByaXYtPnJhbWluX3JzdmRfdnJhbSA9IDEgPDwgMjA7CisJY19vZmZzZXQgPSBub3V2ZWF1X21lbV9mYl9hbW91bnQoZGV2KSAtIGRldl9wcml2LT5yYW1pbl9yc3ZkX3ZyYW07CisJY19zaXplICAgPSAxMjggPDwgMTA7CisJY192bXBkICAgPSAoKGRldl9wcml2LT5jaGlwc2V0ICYgMHhmMCkgPT0gMHg1MCkgPyAweDE0MDAgOiAweDIwMDsKKwljX3JhbWZjICA9ICgoZGV2X3ByaXYtPmNoaXBzZXQgJiAweGYwKSA9PSAweDUwKSA/IDB4MCA6IDB4MjA7CisJY19iYXNlICAgPSBjX3ZtcGQgKyAweDQwMDA7CisJcHRfc2l6ZSAgPSBOVjUwX0lOU1RNRU1fUFRfU0laRShkZXZfcHJpdi0+cmFtaW5fc2l6ZSk7CisKKwlOVl9ERUJVRyhkZXYsICIgUnN2ZCBWUkFNIGJhc2U6IDB4JTA4eFxuIiwgY19vZmZzZXQpOworCU5WX0RFQlVHKGRldiwgIiAgICBWQklPUyBpbWFnZTogMHglMDh4XG4iLAorCQkJCShudl9yZDMyKGRldiwgMHg2MTlmMDQpICYgfjB4ZmYpIDw8IDgpOworCU5WX0RFQlVHKGRldiwgIiAgQXBlcnR1cmUgc2l6ZTogJWQgTWlCXG4iLCBkZXZfcHJpdi0+cmFtaW5fc2l6ZSA+PiAyMCk7CisJTlZfREVCVUcoZGV2LCAiICAgICAgICBQVCBzaXplOiAlZCBLaUJcbiIsIHB0X3NpemUgPj4gMTApOworCisJLyogRGV0ZXJtaW5lIFZNIGxheW91dCwgd2UgbmVlZCB0byBkbyB0aGlzIGZpcnN0IHRvIG1ha2Ugc3VyZQorCSAqIHdlIGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgZm9yIGFsbCB0aGUgcGFnZSB0YWJsZXMuCisJICovCisJZGV2X3ByaXYtPnZtX2dhcnRfYmFzZSA9IHJvdW5kdXAoTlY1MF9WTV9CTE9DSywgTlY1MF9WTV9CTE9DSyk7CisJZGV2X3ByaXYtPnZtX2dhcnRfc2l6ZSA9IE5WNTBfVk1fQkxPQ0s7CisKKwlkZXZfcHJpdi0+dm1fdnJhbV9iYXNlID0gZGV2X3ByaXYtPnZtX2dhcnRfYmFzZSArIGRldl9wcml2LT52bV9nYXJ0X3NpemU7CisJZGV2X3ByaXYtPnZtX3ZyYW1fc2l6ZSA9IG5vdXZlYXVfbWVtX2ZiX2Ftb3VudChkZXYpOworCWlmIChkZXZfcHJpdi0+dm1fdnJhbV9zaXplID4gTlY1MF9WTV9NQVhfVlJBTSkKKwkJZGV2X3ByaXYtPnZtX3ZyYW1fc2l6ZSA9IE5WNTBfVk1fTUFYX1ZSQU07CisJZGV2X3ByaXYtPnZtX3ZyYW1fc2l6ZSA9IHJvdW5kdXAoZGV2X3ByaXYtPnZtX3ZyYW1fc2l6ZSwgTlY1MF9WTV9CTE9DSyk7CisJZGV2X3ByaXYtPnZtX3ZyYW1fcHRfbnIgPSBkZXZfcHJpdi0+dm1fdnJhbV9zaXplIC8gTlY1MF9WTV9CTE9DSzsKKworCWRldl9wcml2LT52bV9lbmQgPSBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlICsgZGV2X3ByaXYtPnZtX3ZyYW1fc2l6ZTsKKworCU5WX0RFQlVHKGRldiwgIk5WNTBWTTogR0FSVCAweCUwMTZsbHgtMHglMDE2bGx4XG4iLAorCQkgZGV2X3ByaXYtPnZtX2dhcnRfYmFzZSwKKwkJIGRldl9wcml2LT52bV9nYXJ0X2Jhc2UgKyBkZXZfcHJpdi0+dm1fZ2FydF9zaXplIC0gMSk7CisJTlZfREVCVUcoZGV2LCAiTlY1MFZNOiBWUkFNIDB4JTAxNmxseC0weCUwMTZsbHhcbiIsCisJCSBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlLAorCQkgZGV2X3ByaXYtPnZtX3ZyYW1fYmFzZSArIGRldl9wcml2LT52bV92cmFtX3NpemUgLSAxKTsKKworCWNfc2l6ZSArPSBkZXZfcHJpdi0+dm1fdnJhbV9wdF9uciAqIChOVjUwX1ZNX0JMT0NLIC8gNjU1MzYgKiA4KTsKKworCS8qIE1hcCBCQVIwIFBSQU1JTiBhcGVydHVyZSBvdmVyIHRoZSBtZW1vcnkgd2Ugd2FudCB0byB1c2UgKi8KKwlzYXZlX252MDAxNzAwID0gbnZfcmQzMihkZXYsIE5WNTBfUFVOS19CQVIwX1BSQU1JTik7CisJbnZfd3IzMihkZXYsIE5WNTBfUFVOS19CQVIwX1BSQU1JTiwgKGNfb2Zmc2V0ID4+IDE2KSk7CisKKwkvKiBDcmVhdGUgYSBmYWtlIGNoYW5uZWwsIGFuZCB1c2UgaXQgYXMgb3VyICJkdW1teSIgY2hhbm5lbHMgMC8xMjcuCisJICogVGhlIG1haW4gcmVhc29uIGZvciBjcmVhdGluZyBhIGNoYW5uZWwgaXMgc28gd2UgY2FuIHVzZSB0aGUgZ3B1b2JqCisJICogY29kZS4gIEhvd2V2ZXIsIGl0J3MgcHJvYmFibHkgd29ydGggbm90aW5nIHRoYXQgTlZJRElBIGFsc28gc2V0dXAKKwkgKiB0aGVpciBjaGFubmVscyAwLzEyNyB3aXRoIHRoZSBzYW1lIHZhbHVlcyB0aGV5IGNvbmZpZ3VyZSBoZXJlLgorCSAqIFNvLCB0aGVyZSBtYXkgYmUgc29tZSBvdGhlciByZWFzb24gZm9yIGRvaW5nIHRoaXMuCisJICoKKwkgKiBIYXZlIHRvIGNyZWF0ZSB0aGUgZW50aXJlIGNoYW5uZWwgbWFudWFsbHksIGFzIHRoZSByZWFsIGNoYW5uZWwKKwkgKiBjcmVhdGlvbiBjb2RlIGFzc3VtZXMgd2UgaGF2ZSBQUkFNSU4gYWNjZXNzLCBhbmQgd2UgZG9uJ3QgdW50aWwKKwkgKiB3ZSdyZSBkb25lIGhlcmUuCisJICovCisJY2hhbiA9IGt6YWxsb2Moc2l6ZW9mKCpjaGFuKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGFuKQorCQlyZXR1cm4gLUVOT01FTTsKKwljaGFuLT5pZCA9IDA7CisJY2hhbi0+ZGV2ID0gZGV2OworCWNoYW4tPmZpbGVfcHJpdiA9IChzdHJ1Y3QgZHJtX2ZpbGUgKiktMjsKKwlkZXZfcHJpdi0+Zmlmb3NbMF0gPSBkZXZfcHJpdi0+Zmlmb3NbMTI3XSA9IGNoYW47CisKKwkvKiBDaGFubmVsJ3MgUFJBTUlOIG9iamVjdCArIGhlYXAgKi8KKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfZmFrZShkZXYsIDAsIGNfb2Zmc2V0LCBjX3NpemUsIDAsCisJCQkJCQkJTlVMTCwgJmNoYW4tPnJhbWluKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKG5vdXZlYXVfbWVtX2luaXRfaGVhcCgmY2hhbi0+cmFtaW5faGVhcCwgY19iYXNlLCBjX3NpemUgLSBjX2Jhc2UpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFJBTUZDICsgemVybyBjaGFubmVsJ3MgUFJBTUlOIHVwIHRvIHN0YXJ0IG9mIFZNIHBhZ2VkaXIgKi8KKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfZmFrZShkZXYsIGNfcmFtZmMsIGNfb2Zmc2V0ICsgY19yYW1mYywKKwkJCQkJCTB4NDAwMCwgMCwgTlVMTCwgJmNoYW4tPnJhbWZjKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IGNfdm1wZDsgaSArPSA0KQorCQlCQVIwX1dJMzIoY2hhbi0+cmFtaW4tPmdwdW9iaiwgaSwgMCk7CisKKwkvKiBWTSBwYWdlIGRpcmVjdG9yeSAqLworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19mYWtlKGRldiwgY192bXBkLCBjX29mZnNldCArIGNfdm1wZCwKKwkJCQkJICAgMHg0MDAwLCAwLCAmY2hhbi0+dm1fcGQsIE5VTEwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJZm9yIChpID0gMDsgaSA8IDB4NDAwMDsgaSArPSA4KSB7CisJCUJBUjBfV0kzMihjaGFuLT52bV9wZCwgaSArIDB4MDAsIDB4MDAwMDAwMDApOworCQlCQVIwX1dJMzIoY2hhbi0+dm1fcGQsIGkgKyAweDA0LCAweDAwMDAwMDAwKTsKKwl9CisKKwkvKiBQUkFNSU4gcGFnZSB0YWJsZSwgY2hlYXQgYW5kIG1hcCBpbnRvIFZNIGF0IDB4MDAwMDAwMDAwMC4KKwkgKiBXZSBtYXAgdGhlIGVudGlyZSBmYWtlIGNoYW5uZWwgaW50byB0aGUgc3RhcnQgb2YgdGhlIFBSQU1JTiBCQVIKKwkgKi8KKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfcmVmKGRldiwgY2hhbiwgTlVMTCwgMCwgcHRfc2l6ZSwgMHgxMDAwLAorCQkJCQkJCTAsICZwcml2LT5wcmFtaW5fcHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwLCB2ID0gY19vZmZzZXQ7IGkgPCBwdF9zaXplOyBpICs9IDgsIHYgKz0gMHgxMDAwKSB7CisJCWlmICh2IDwgKGNfb2Zmc2V0ICsgY19zaXplKSkKKwkJCUJBUjBfV0kzMihwcml2LT5wcmFtaW5fcHQtPmdwdW9iaiwgaSArIDAsIHYgfCAxKTsKKwkJZWxzZQorCQkJQkFSMF9XSTMyKHByaXYtPnByYW1pbl9wdC0+Z3B1b2JqLCBpICsgMCwgMHgwMDAwMDAwOSk7CisJCUJBUjBfV0kzMihwcml2LT5wcmFtaW5fcHQtPmdwdW9iaiwgaSArIDQsIDB4MDAwMDAwMDApOworCX0KKworCUJBUjBfV0kzMihjaGFuLT52bV9wZCwgMHgwMCwgcHJpdi0+cHJhbWluX3B0LT5pbnN0YW5jZSB8IDB4NjMpOworCUJBUjBfV0kzMihjaGFuLT52bV9wZCwgMHgwNCwgMHgwMDAwMDAwMCk7CisKKwkvKiBWUkFNIHBhZ2UgdGFibGUocyksIG1hcHBlZCBpbnRvIFZNIGF0ICsxR2lCICAqLworCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+dm1fdnJhbV9wdF9ucjsgaSsrKSB7CisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19yZWYoZGV2LCBjaGFuLCBOVUxMLCAwLAorCQkJCQkgICAgIE5WNTBfVk1fQkxPQ0svNjU1MzYqOCwgMCwgMCwKKwkJCQkJICAgICAmY2hhbi0+dm1fdnJhbV9wdFtpXSk7CisJCWlmIChyZXQpIHsKKwkJCU5WX0VSUk9SKGRldiwgIkVycm9yIGNyZWF0aW5nIFZSQU0gcGFnZSB0YWJsZXM6ICVkXG4iLAorCQkJCQkJCQkJcmV0KTsKKwkJCWRldl9wcml2LT52bV92cmFtX3B0X25yID0gaTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZGV2X3ByaXYtPnZtX3ZyYW1fcHRbaV0gPSBjaGFuLT52bV92cmFtX3B0W2ldLT5ncHVvYmo7CisKKwkJZm9yICh2ID0gMDsgdiA8IGRldl9wcml2LT52bV92cmFtX3B0W2ldLT5pbV9wcmFtaW4tPnNpemU7CisJCQkJCQkJCXYgKz0gNCkKKwkJCUJBUjBfV0kzMihkZXZfcHJpdi0+dm1fdnJhbV9wdFtpXSwgdiwgMCk7CisKKwkJQkFSMF9XSTMyKGNoYW4tPnZtX3BkLCAweDEwICsgKGkqOCksCisJCQkgIGNoYW4tPnZtX3ZyYW1fcHRbaV0tPmluc3RhbmNlIHwgMHg2MSk7CisJCUJBUjBfV0kzMihjaGFuLT52bV9wZCwgMHgxNCArIChpKjgpLCAwKTsKKwl9CisKKwkvKiBETUEgb2JqZWN0IGZvciBQUkFNSU4gQkFSICovCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X3JlZihkZXYsIGNoYW4sIGNoYW4sIDAsIDYqNCwgMTYsIDAsCisJCQkJCQkJJnByaXYtPnByYW1pbl9iYXIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJQkFSMF9XSTMyKHByaXYtPnByYW1pbl9iYXItPmdwdW9iaiwgMHgwMCwgMHg3ZmMwMDAwMCk7CisJQkFSMF9XSTMyKHByaXYtPnByYW1pbl9iYXItPmdwdW9iaiwgMHgwNCwgZGV2X3ByaXYtPnJhbWluX3NpemUgLSAxKTsKKwlCQVIwX1dJMzIocHJpdi0+cHJhbWluX2Jhci0+Z3B1b2JqLCAweDA4LCAweDAwMDAwMDAwKTsKKwlCQVIwX1dJMzIocHJpdi0+cHJhbWluX2Jhci0+Z3B1b2JqLCAweDBjLCAweDAwMDAwMDAwKTsKKwlCQVIwX1dJMzIocHJpdi0+cHJhbWluX2Jhci0+Z3B1b2JqLCAweDEwLCAweDAwMDAwMDAwKTsKKwlCQVIwX1dJMzIocHJpdi0+cHJhbWluX2Jhci0+Z3B1b2JqLCAweDE0LCAweDAwMDAwMDAwKTsKKworCS8qIERNQSBvYmplY3QgZm9yIEZCIEJBUiAqLworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19yZWYoZGV2LCBjaGFuLCBjaGFuLCAwLCA2KjQsIDE2LCAwLAorCQkJCQkJCSZwcml2LT5mYl9iYXIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJQkFSMF9XSTMyKHByaXYtPmZiX2Jhci0+Z3B1b2JqLCAweDAwLCAweDdmYzAwMDAwKTsKKwlCQVIwX1dJMzIocHJpdi0+ZmJfYmFyLT5ncHVvYmosIDB4MDQsIDB4NDAwMDAwMDAgKworCQkJCQkgICAgICBkcm1fZ2V0X3Jlc291cmNlX2xlbihkZXYsIDEpIC0gMSk7CisJQkFSMF9XSTMyKHByaXYtPmZiX2Jhci0+Z3B1b2JqLCAweDA4LCAweDQwMDAwMDAwKTsKKwlCQVIwX1dJMzIocHJpdi0+ZmJfYmFyLT5ncHVvYmosIDB4MGMsIDB4MDAwMDAwMDApOworCUJBUjBfV0kzMihwcml2LT5mYl9iYXItPmdwdW9iaiwgMHgxMCwgMHgwMDAwMDAwMCk7CisJQkFSMF9XSTMyKHByaXYtPmZiX2Jhci0+Z3B1b2JqLCAweDE0LCAweDAwMDAwMDAwKTsKKworCS8qIFBva2UgdGhlIHJlbGV2YW50IHJlZ3MsIGFuZCBwcmF5IGl0IHdvcmtzIDopICovCisJbnZfd3IzMihkZXYsIE5WNTBfUFVOS19CQVJfQ0ZHX0JBU0UsIChjaGFuLT5yYW1pbi0+aW5zdGFuY2UgPj4gMTIpKTsKKwludl93cjMyKGRldiwgTlY1MF9QVU5LX1VOSzE3MTAsIDApOworCW52X3dyMzIoZGV2LCBOVjUwX1BVTktfQkFSX0NGR19CQVNFLCAoY2hhbi0+cmFtaW4tPmluc3RhbmNlID4+IDEyKSB8CisJCQkJCSBOVjUwX1BVTktfQkFSX0NGR19CQVNFX1ZBTElEKTsKKwludl93cjMyKGRldiwgTlY1MF9QVU5LX0JBUjFfQ1RYRE1BLCAocHJpdi0+ZmJfYmFyLT5pbnN0YW5jZSA+PiA0KSB8CisJCQkJCU5WNTBfUFVOS19CQVIxX0NUWERNQV9WQUxJRCk7CisJbnZfd3IzMihkZXYsIE5WNTBfUFVOS19CQVIzX0NUWERNQSwgKHByaXYtPnByYW1pbl9iYXItPmluc3RhbmNlID4+IDQpIHwKKwkJCQkJTlY1MF9QVU5LX0JBUjNfQ1RYRE1BX1ZBTElEKTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCW52X3dyMzIoZGV2LCAweDE5MDAgKyAoaSo0KSwgMCk7CisKKwkvKiBBc3N1bWUgdGhhdCBwcmF5aW5nIGlzbid0IGVub3VnaCwgY2hlY2sgdGhhdCB3ZSBjYW4gcmUtcmVhZCB0aGUKKwkgKiBlbnRpcmUgZmFrZSBjaGFubmVsIGJhY2sgZnJvbSB0aGUgUFJBTUlOIEJBUiAqLworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIGZhbHNlKTsKKwlmb3IgKGkgPSAwOyBpIDwgY19zaXplOyBpICs9IDQpIHsKKwkJaWYgKG52X3JkMzIoZGV2LCBOVl9SQU1JTiArIGkpICE9IG52X3JpMzIoZGV2LCBpKSkgeworCQkJTlZfRVJST1IoZGV2LCAiRXJyb3IgcmVhZGluZyBiYWNrIFBSQU1JTiBhdCAweCUwOHhcbiIsCisJCQkJCQkJCQlpKTsKKwkJCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCisJbnZfd3IzMihkZXYsIE5WNTBfUFVOS19CQVIwX1BSQU1JTiwgc2F2ZV9udjAwMTcwMCk7CisKKwkvKiBHbG9iYWwgUFJBTUlOIGhlYXAgKi8KKwlpZiAobm91dmVhdV9tZW1faW5pdF9oZWFwKCZkZXZfcHJpdi0+cmFtaW5faGVhcCwKKwkJCQkgIGNfc2l6ZSwgZGV2X3ByaXYtPnJhbWluX3NpemUgLSBjX3NpemUpKSB7CisJCWRldl9wcml2LT5yYW1pbl9oZWFwID0gTlVMTDsKKwkJTlZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIGluaXQgUkFNSU4gaGVhcFxuIik7CisJfQorCisJLypYWFg6IGluY29ycmVjdCwgYnV0IG5lZWRlZCB0byBtYWtlIGhhc2ggZnVuYyAid29yayIgKi8KKwlkZXZfcHJpdi0+cmFtaHRfb2Zmc2V0ID0gMHgxMDAwMDsKKwlkZXZfcHJpdi0+cmFtaHRfYml0cyAgID0gOTsKKwlkZXZfcHJpdi0+cmFtaHRfc2l6ZSAgID0gKDEgPDwgZGV2X3ByaXYtPnJhbWh0X2JpdHMpOworCXJldHVybiAwOworfQorCit2b2lkCitudjUwX2luc3RtZW1fdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudjUwX2luc3RtZW1fcHJpdiAqcHJpdiA9IGRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcml2OworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbMF07CisJaW50IGk7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJaWYgKCFwcml2KQorCQlyZXR1cm47CisKKwkvKiBSZXN0b3JlIHN0YXRlIGZyb20gYmVmb3JlIGluaXQgKi8KKwlmb3IgKGkgPSAweDE3MDA7IGkgPD0gMHgxNzEwOyBpICs9IDQpCisJCW52X3dyMzIoZGV2LCBpLCBwcml2LT5zYXZlMTcwMFsoaSAtIDB4MTcwMCkgLyA0XSk7CisKKwlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJnByaXYtPmZiX2Jhcik7CisJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZwcml2LT5wcmFtaW5fYmFyKTsKKwlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJnByaXYtPnByYW1pbl9wdCk7CisKKwkvKiBEZXN0cm95IGR1bW15IGNoYW5uZWwgKi8KKwlpZiAoY2hhbikgeworCQlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPnZtX3ZyYW1fcHRfbnI7IGkrKykgeworCQkJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZjaGFuLT52bV92cmFtX3B0W2ldKTsKKwkJCWRldl9wcml2LT52bV92cmFtX3B0W2ldID0gTlVMTDsKKwkJfQorCQlkZXZfcHJpdi0+dm1fdnJhbV9wdF9uciA9IDA7CisKKwkJbm91dmVhdV9ncHVvYmpfZGVsKGRldiwgJmNoYW4tPnZtX3BkKTsKKwkJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZjaGFuLT5yYW1mYyk7CisJCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoZGV2LCAmY2hhbi0+cmFtaW4pOworCQlub3V2ZWF1X21lbV90YWtlZG93bigmY2hhbi0+cmFtaW5faGVhcCk7CisKKwkJZGV2X3ByaXYtPmZpZm9zWzBdID0gZGV2X3ByaXYtPmZpZm9zWzEyN10gPSBOVUxMOworCQlrZnJlZShjaGFuKTsKKwl9CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJpdiA9IE5VTEw7CisJa2ZyZWUocHJpdik7Cit9CisKK2ludAorbnY1MF9pbnN0bWVtX3N1c3BlbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbMF07CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpyYW1pbiA9IGNoYW4tPnJhbWluLT5ncHVvYmo7CisJaW50IGk7CisKKwlyYW1pbi0+aW1fYmFja2luZ19zdXNwZW5kID0gdm1hbGxvYyhyYW1pbi0+aW1fcHJhbWluLT5zaXplKTsKKwlpZiAoIXJhbWluLT5pbV9iYWNraW5nX3N1c3BlbmQpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IHJhbWluLT5pbV9wcmFtaW4tPnNpemU7IGkgKz0gNCkKKwkJcmFtaW4tPmltX2JhY2tpbmdfc3VzcGVuZFtpLzRdID0gbnZfcmkzMihkZXYsIGkpOworCXJldHVybiAwOworfQorCit2b2lkCitudjUwX2luc3RtZW1fcmVzdW1lKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnY1MF9pbnN0bWVtX3ByaXYgKnByaXYgPSBkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJpdjsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmZpZm9zWzBdOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcmFtaW4gPSBjaGFuLT5yYW1pbi0+Z3B1b2JqOworCWludCBpOworCisJbnZfd3IzMihkZXYsIE5WNTBfUFVOS19CQVIwX1BSQU1JTiwgKHJhbWluLT5pbV9iYWNraW5nX3N0YXJ0ID4+IDE2KSk7CisJZm9yIChpID0gMDsgaSA8IHJhbWluLT5pbV9wcmFtaW4tPnNpemU7IGkgKz0gNCkKKwkJQkFSMF9XSTMyKHJhbWluLCBpLCByYW1pbi0+aW1fYmFja2luZ19zdXNwZW5kW2kvNF0pOworCXZmcmVlKHJhbWluLT5pbV9iYWNraW5nX3N1c3BlbmQpOworCXJhbWluLT5pbV9iYWNraW5nX3N1c3BlbmQgPSBOVUxMOworCisJLyogUG9rZSB0aGUgcmVsZXZhbnQgcmVncywgYW5kIHByYXkgaXQgd29ya3MgOikgKi8KKwludl93cjMyKGRldiwgTlY1MF9QVU5LX0JBUl9DRkdfQkFTRSwgKGNoYW4tPnJhbWluLT5pbnN0YW5jZSA+PiAxMikpOworCW52X3dyMzIoZGV2LCBOVjUwX1BVTktfVU5LMTcxMCwgMCk7CisJbnZfd3IzMihkZXYsIE5WNTBfUFVOS19CQVJfQ0ZHX0JBU0UsIChjaGFuLT5yYW1pbi0+aW5zdGFuY2UgPj4gMTIpIHwKKwkJCQkJIE5WNTBfUFVOS19CQVJfQ0ZHX0JBU0VfVkFMSUQpOworCW52X3dyMzIoZGV2LCBOVjUwX1BVTktfQkFSMV9DVFhETUEsIChwcml2LT5mYl9iYXItPmluc3RhbmNlID4+IDQpIHwKKwkJCQkJTlY1MF9QVU5LX0JBUjFfQ1RYRE1BX1ZBTElEKTsKKwludl93cjMyKGRldiwgTlY1MF9QVU5LX0JBUjNfQ1RYRE1BLCAocHJpdi0+cHJhbWluX2Jhci0+aW5zdGFuY2UgPj4gNCkgfAorCQkJCQlOVjUwX1BVTktfQkFSM19DVFhETUFfVkFMSUQpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJbnZfd3IzMihkZXYsIDB4MTkwMCArIChpKjQpLCAwKTsKK30KKworaW50CitudjUwX2luc3RtZW1fcG9wdWxhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmosCisJCSAgICAgIHVpbnQzMl90ICpzeikKK3sKKwlpbnQgcmV0OworCisJaWYgKGdwdW9iai0+aW1fYmFja2luZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqc3ogPSAoKnN6ICsgKE5WNTBfSU5TVE1FTV9QQUdFX1NJWkUtMSkpICYgfihOVjUwX0lOU1RNRU1fUEFHRV9TSVpFLTEpOworCWlmICgqc3ogPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBub3V2ZWF1X2JvX25ldyhkZXYsIE5VTEwsICpzeiwgMCwgVFRNX1BMX0ZMQUdfVlJBTSwgMCwgMHgwMDAwLAorCQkJICAgICB0cnVlLCBmYWxzZSwgJmdwdW9iai0+aW1fYmFja2luZyk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJlcnJvciBnZXR0aW5nIFBSQU1JTiBiYWNraW5nIHBhZ2VzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBub3V2ZWF1X2JvX3BpbihncHVvYmotPmltX2JhY2tpbmcsIFRUTV9QTF9GTEFHX1ZSQU0pOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiZXJyb3IgcGlubmluZyBQUkFNSU4gYmFja2luZyBWUkFNOiAlZFxuIiwgcmV0KTsKKwkJbm91dmVhdV9ib19yZWYoTlVMTCwgJmdwdW9iai0+aW1fYmFja2luZyk7CisJCXJldHVybiByZXQ7CisJfQorCisJZ3B1b2JqLT5pbV9iYWNraW5nX3N0YXJ0ID0gZ3B1b2JqLT5pbV9iYWNraW5nLT5iby5tZW0ubW1fbm9kZS0+c3RhcnQ7CisJZ3B1b2JqLT5pbV9iYWNraW5nX3N0YXJ0IDw8PSBQQUdFX1NISUZUOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252NTBfaW5zdG1lbV9jbGVhcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGdwdW9iaiAmJiBncHVvYmotPmltX2JhY2tpbmcpIHsKKwkJaWYgKGdwdW9iai0+aW1fYm91bmQpCisJCQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0udW5iaW5kKGRldiwgZ3B1b2JqKTsKKwkJbm91dmVhdV9ib191bnBpbihncHVvYmotPmltX2JhY2tpbmcpOworCQlub3V2ZWF1X2JvX3JlZihOVUxMLCAmZ3B1b2JqLT5pbV9iYWNraW5nKTsKKwkJZ3B1b2JqLT5pbV9iYWNraW5nID0gTlVMTDsKKwl9Cit9CisKK2ludAorbnY1MF9pbnN0bWVtX2JpbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmopCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnY1MF9pbnN0bWVtX3ByaXYgKnByaXYgPSBkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJpdjsKKwl1aW50MzJfdCBwdGUsIHB0ZV9lbmQsIHZyYW07CisKKwlpZiAoIWdwdW9iai0+aW1fYmFja2luZyB8fCAhZ3B1b2JqLT5pbV9wcmFtaW4gfHwgZ3B1b2JqLT5pbV9ib3VuZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlOVl9ERUJVRyhkZXYsICJzdD0weCUwbGx4IHN6PTB4JTBsbHhcbiIsCisJCSBncHVvYmotPmltX3ByYW1pbi0+c3RhcnQsIGdwdW9iai0+aW1fcHJhbWluLT5zaXplKTsKKworCXB0ZSAgICAgPSAoZ3B1b2JqLT5pbV9wcmFtaW4tPnN0YXJ0ID4+IDEyKSA8PCAzOworCXB0ZV9lbmQgPSAoKGdwdW9iai0+aW1fcHJhbWluLT5zaXplID4+IDEyKSA8PCAzKSArIHB0ZTsKKwl2cmFtICAgID0gZ3B1b2JqLT5pbV9iYWNraW5nX3N0YXJ0OworCisJTlZfREVCVUcoZGV2LCAicHJhbWluPTB4JWxseCwgcHRlPSVkLCBwdGVfZW5kPSVkXG4iLAorCQkgZ3B1b2JqLT5pbV9wcmFtaW4tPnN0YXJ0LCBwdGUsIHB0ZV9lbmQpOworCU5WX0RFQlVHKGRldiwgImZpcnN0IHZyYW0gcGFnZTogMHglMDh4XG4iLCBncHVvYmotPmltX2JhY2tpbmdfc3RhcnQpOworCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CisJd2hpbGUgKHB0ZSA8IHB0ZV9lbmQpIHsKKwkJbnZfd28zMihkZXYsIHByaXYtPnByYW1pbl9wdC0+Z3B1b2JqLCAocHRlICsgMCkvNCwgdnJhbSB8IDEpOworCQludl93bzMyKGRldiwgcHJpdi0+cHJhbWluX3B0LT5ncHVvYmosIChwdGUgKyA0KS80LCAweDAwMDAwMDAwKTsKKworCQlwdGUgKz0gODsKKwkJdnJhbSArPSBOVjUwX0lOU1RNRU1fUEFHRV9TSVpFOworCX0KKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCisJbnZfd3IzMihkZXYsIDB4MTAwYzgwLCAweDAwMDQwMDAxKTsKKwlpZiAoIW52X3dhaXQoMHgxMDBjODAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApKSB7CisJCU5WX0VSUk9SKGRldiwgInRpbWVvdXQ6ICgweDEwMGM4MCAmIDEpID09IDAgKDEpXG4iKTsKKwkJTlZfRVJST1IoZGV2LCAiMHgxMDBjODAgPSAweCUwOHhcbiIsIG52X3JkMzIoZGV2LCAweDEwMGM4MCkpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCW52X3dyMzIoZGV2LCAweDEwMGM4MCwgMHgwMDA2MDAwMSk7CisJaWYgKCFudl93YWl0KDB4MTAwYzgwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKSkgeworCQlOVl9FUlJPUihkZXYsICJ0aW1lb3V0OiAoMHgxMDBjODAgJiAxKSA9PSAwICgyKVxuIik7CisJCU5WX0VSUk9SKGRldiwgIjB4MTAwYzgwID0gMHglMDh4XG4iLCBudl9yZDMyKGRldiwgMHgxMDBjODApKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlncHVvYmotPmltX2JvdW5kID0gMTsKKwlyZXR1cm4gMDsKK30KKworaW50CitudjUwX2luc3RtZW1fdW5iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52NTBfaW5zdG1lbV9wcml2ICpwcml2ID0gZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByaXY7CisJdWludDMyX3QgcHRlLCBwdGVfZW5kOworCisJaWYgKGdwdW9iai0+aW1fYm91bmQgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwdGUgICAgID0gKGdwdW9iai0+aW1fcHJhbWluLT5zdGFydCA+PiAxMikgPDwgMzsKKwlwdGVfZW5kID0gKChncHVvYmotPmltX3ByYW1pbi0+c2l6ZSA+PiAxMikgPDwgMykgKyBwdGU7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKwl3aGlsZSAocHRlIDwgcHRlX2VuZCkgeworCQludl93bzMyKGRldiwgcHJpdi0+cHJhbWluX3B0LT5ncHVvYmosIChwdGUgKyAwKS80LCAweDAwMDAwMDA5KTsKKwkJbnZfd28zMihkZXYsIHByaXYtPnByYW1pbl9wdC0+Z3B1b2JqLCAocHRlICsgNCkvNCwgMHgwMDAwMDAwMCk7CisJCXB0ZSArPSA4OworCX0KKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCisJZ3B1b2JqLT5pbV9ib3VuZCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252NTBfaW5zdG1lbV9wcmVwYXJlX2FjY2VzcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBib29sIHdyaXRlKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52NTBfaW5zdG1lbV9wcml2ICpwcml2ID0gZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByaXY7CisKKwlwcml2LT5sYXN0X2FjY2Vzc193ciA9IHdyaXRlOworfQorCit2b2lkCitudjUwX2luc3RtZW1fZmluaXNoX2FjY2VzcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52NTBfaW5zdG1lbV9wcml2ICpwcml2ID0gZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByaXY7CisKKwlpZiAocHJpdi0+bGFzdF9hY2Nlc3Nfd3IpIHsKKwkJbnZfd3IzMihkZXYsIDB4MDcwMDAwLCAweDAwMDAwMDAxKTsKKwkJaWYgKCFudl93YWl0KDB4MDcwMDAwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKSkKKwkJCU5WX0VSUk9SKGRldiwgIlBSQU1JTiBmbHVzaCB0aW1lb3V0XG4iKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfbWMuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfbWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGE5YzNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9tYy5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQmVuIFNrZWdncy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKworaW50CitudjUwX21jX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLCAweEZGRkZGRkZGKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBudjUwX21jX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX3Nvci5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9zb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzI4MDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9zb3IuYwpAQCAtMCwwICsxLDMwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYWFydGVuIE1hYXRodWlzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKworI2RlZmluZSBOT1VWRUFVX0RNQV9ERUJVRyAobm91dmVhdV9yZWdfZGVidWcgJiBOT1VWRUFVX1JFR19ERUJVR19FVk8pCisjaW5jbHVkZSAibm91dmVhdV9yZWcuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZG1hLmgiCisjaW5jbHVkZSAibm91dmVhdV9lbmNvZGVyLmgiCisjaW5jbHVkZSAibm91dmVhdV9jb25uZWN0b3IuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2NydGMuaCIKKyNpbmNsdWRlICJudjUwX2Rpc3BsYXkuaCIKKworc3RhdGljIHZvaWQKK252NTBfc29yX2Rpc2Nvbm5lY3Qoc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gdG9fZHJtX2VuY29kZXIobnZfZW5jb2RlciktPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2byA9IGRldl9wcml2LT5ldm87CisJaW50IHJldDsKKworCU5WX0RFQlVHKGRldiwgIkRpc2Nvbm5lY3RpbmcgU09SICVkXG4iLCBudl9lbmNvZGVyLT5vcik7CisKKwlyZXQgPSBSSU5HX1NQQUNFKGV2bywgMik7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJubyBzcGFjZSB3aGlsZSBkaXNjb25uZWN0aW5nIFNPUlxuIik7CisJCXJldHVybjsKKwl9CisJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX1NPUihudl9lbmNvZGVyLT5vciwgTU9ERV9DVFJMKSwgMSk7CisJT1VUX1JJTkcoZXZvLCAwKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfc29yX2RwX2xpbmtfdHJhaW4oc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgYml0X2Rpc3BsYXlwb3J0X2VuY29kZXJfdGFibGUgKmRwZTsKKwlpbnQgZHBlX2hlYWRlcmxlbjsKKworCWRwZSA9IG5vdXZlYXVfYmlvc19kcF90YWJsZShkZXYsIG52X2VuY29kZXItPmRjYiwgJmRwZV9oZWFkZXJsZW4pOworCWlmICghZHBlKSB7CisJCU5WX0VSUk9SKGRldiwgIlNPUi0lZDogbm8gRFAgZW5jb2RlciB0YWJsZSFcbiIsIG52X2VuY29kZXItPm9yKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChkcGUtPnNjcmlwdDApIHsKKwkJTlZfREVCVUcoZGV2LCAiU09SLSVkOiBydW5uaW5nIERQIHNjcmlwdCAwXG4iLCBudl9lbmNvZGVyLT5vcik7CisJCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIGxlMTZfdG9fY3B1KGRwZS0+c2NyaXB0MCksCisJCQkJCSAgICBudl9lbmNvZGVyLT5kY2IpOworCX0KKworCWlmICghbm91dmVhdV9kcF9saW5rX3RyYWluKGVuY29kZXIpKQorCQlOVl9FUlJPUihkZXYsICJTT1ItJWQ6IGxpbmsgdHJhaW5pbmcgZmFpbGVkXG4iLCBudl9lbmNvZGVyLT5vcik7CisKKwlpZiAoZHBlLT5zY3JpcHQxKSB7CisJCU5WX0RFQlVHKGRldiwgIlNPUi0lZDogcnVubmluZyBEUCBzY3JpcHQgMVxuIiwgbnZfZW5jb2Rlci0+b3IpOworCQlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBsZTE2X3RvX2NwdShkcGUtPnNjcmlwdDEpLAorCQkJCQkgICAgbnZfZW5jb2Rlci0+ZGNiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX3Nvcl9kcG1zKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXVpbnQzMl90IHZhbDsKKwlpbnQgb3IgPSBudl9lbmNvZGVyLT5vcjsKKworCU5WX0RFQlVHKGRldiwgIm9yICVkIG1vZGUgJWRcbiIsIG9yLCBtb2RlKTsKKworCS8qIHdhaXQgZm9yIGl0IHRvIGJlIGRvbmUgKi8KKwlpZiAoIW52X3dhaXQoTlY1MF9QRElTUExBWV9TT1JfRFBNU19DVFJMKG9yKSwKKwkJICAgICBOVjUwX1BESVNQTEFZX1NPUl9EUE1TX0NUUkxfUEVORElORywgMCkpIHsKKwkJTlZfRVJST1IoZGV2LCAidGltZW91dDogU09SX0RQTVNfQ1RSTF9QRU5ESU5HKCVkKSA9PSAwXG4iLCBvcik7CisJCU5WX0VSUk9SKGRldiwgIlNPUl9EUE1TX0NUUkwoJWQpID0gMHglMDh4XG4iLCBvciwKKwkJCSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9TT1JfRFBNU19DVFJMKG9yKSkpOworCX0KKworCXZhbCA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX1NPUl9EUE1TX0NUUkwob3IpKTsKKworCWlmIChtb2RlID09IERSTV9NT0RFX0RQTVNfT04pCisJCXZhbCB8PSBOVjUwX1BESVNQTEFZX1NPUl9EUE1TX0NUUkxfT047CisJZWxzZQorCQl2YWwgJj0gfk5WNTBfUERJU1BMQVlfU09SX0RQTVNfQ1RSTF9PTjsKKworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX1NPUl9EUE1TX0NUUkwob3IpLCB2YWwgfAorCQlOVjUwX1BESVNQTEFZX1NPUl9EUE1TX0NUUkxfUEVORElORyk7CisJaWYgKCFudl93YWl0KE5WNTBfUERJU1BMQVlfU09SX0RQTVNfU1RBVEUob3IpLAorCQkgICAgIE5WNTBfUERJU1BMQVlfU09SX0RQTVNfU1RBVEVfV0FJVCwgMCkpIHsKKwkJTlZfRVJST1IoZGV2LCAidGltZW91dDogU09SX0RQTVNfU1RBVEVfV0FJVCglZCkgPT0gMFxuIiwgb3IpOworCQlOVl9FUlJPUihkZXYsICJTT1JfRFBNU19TVEFURSglZCkgPSAweCUwOHhcbiIsIG9yLAorCQkJIG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX1NPUl9EUE1TX1NUQVRFKG9yKSkpOworCX0KKworCWlmIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX0RQICYmIG1vZGUgPT0gRFJNX01PREVfRFBNU19PTikKKwkJbnY1MF9zb3JfZHBfbGlua190cmFpbihlbmNvZGVyKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfc29yX3NhdmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCU5WX0VSUk9SKGVuY29kZXItPmRldiwgIiEhXG4iKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfc29yX3Jlc3RvcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCU5WX0VSUk9SKGVuY29kZXItPmRldiwgIiEhXG4iKTsKK30KKworc3RhdGljIGJvb2wKK252NTBfc29yX21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpjb25uZWN0b3I7CisKKwlOVl9ERUJVRyhlbmNvZGVyLT5kZXYsICJvciAlZFxuIiwgbnZfZW5jb2Rlci0+b3IpOworCisJY29ubmVjdG9yID0gbm91dmVhdV9lbmNvZGVyX2Nvbm5lY3Rvcl9nZXQobnZfZW5jb2Rlcik7CisJaWYgKCFjb25uZWN0b3IpIHsKKwkJTlZfRVJST1IoZW5jb2Rlci0+ZGV2LCAiRW5jb2RlciBoYXMgbm8gY29ubmVjdG9yXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChjb25uZWN0b3ItPnNjYWxpbmdfbW9kZSAhPSBEUk1fTU9ERV9TQ0FMRV9OT05FICYmCisJICAgICBjb25uZWN0b3ItPm5hdGl2ZV9tb2RlKSB7CisJCWludCBpZCA9IGFkanVzdGVkX21vZGUtPmJhc2UuaWQ7CisJCSphZGp1c3RlZF9tb2RlID0gKmNvbm5lY3Rvci0+bmF0aXZlX21vZGU7CisJCWFkanVzdGVkX21vZGUtPmJhc2UuaWQgPSBpZDsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQKK252NTBfc29yX3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworfQorCitzdGF0aWMgdm9pZAorbnY1MF9zb3JfY29tbWl0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKK30KKworc3RhdGljIHZvaWQKK252NTBfc29yX21vZGVfc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5jb2Rlci0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm8gPSBkZXZfcHJpdi0+ZXZvOworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpjcnRjID0gbm91dmVhdV9jcnRjKGVuY29kZXItPmNydGMpOworCXVpbnQzMl90IG1vZGVfY3RsID0gMDsKKwlpbnQgcmV0OworCisJTlZfREVCVUcoZGV2LCAib3IgJWRcbiIsIG52X2VuY29kZXItPm9yKTsKKworCW52NTBfc29yX2RwbXMoZW5jb2RlciwgRFJNX01PREVfRFBNU19PTik7CisKKwlzd2l0Y2ggKG52X2VuY29kZXItPmRjYi0+dHlwZSkgeworCWNhc2UgT1VUUFVUX1RNRFM6CisJCWlmIChudl9lbmNvZGVyLT5kY2ItPnNvcmNvbmYubGluayAmIDEpIHsKKwkJCWlmIChhZGp1c3RlZF9tb2RlLT5jbG9jayA8IDE2NTAwMCkKKwkJCQltb2RlX2N0bCA9IDB4MDEwMDsKKwkJCWVsc2UKKwkJCQltb2RlX2N0bCA9IDB4MDUwMDsKKwkJfSBlbHNlCisJCQltb2RlX2N0bCA9IDB4MDIwMDsKKwkJYnJlYWs7CisJY2FzZSBPVVRQVVRfRFA6CisJCW1vZGVfY3RsIHw9IDB4MDAwNTAwMDA7CisJCWlmIChudl9lbmNvZGVyLT5kY2ItPnNvcmNvbmYubGluayAmIDEpCisJCQltb2RlX2N0bCB8PSAweDAwMDAwODAwOworCQllbHNlCisJCQltb2RlX2N0bCB8PSAweDAwMDAwOTAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAoY3J0Yy0+aW5kZXggPT0gMSkKKwkJbW9kZV9jdGwgfD0gTlY1MF9FVk9fU09SX01PREVfQ1RSTF9DUlRDMTsKKwllbHNlCisJCW1vZGVfY3RsIHw9IE5WNTBfRVZPX1NPUl9NT0RFX0NUUkxfQ1JUQzA7CisKKwlpZiAoYWRqdXN0ZWRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX05IU1lOQykKKwkJbW9kZV9jdGwgfD0gTlY1MF9FVk9fU09SX01PREVfQ1RSTF9OSFNZTkM7CisKKwlpZiAoYWRqdXN0ZWRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX05WU1lOQykKKwkJbW9kZV9jdGwgfD0gTlY1MF9FVk9fU09SX01PREVfQ1RSTF9OVlNZTkM7CisKKwlyZXQgPSBSSU5HX1NQQUNFKGV2bywgMik7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJubyBzcGFjZSB3aGlsZSBjb25uZWN0aW5nIFNPUlxuIik7CisJCXJldHVybjsKKwl9CisJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX1NPUihudl9lbmNvZGVyLT5vciwgTU9ERV9DVFJMKSwgMSk7CisJT1VUX1JJTkcoZXZvLCBtb2RlX2N0bCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIG52NTBfc29yX2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcyA9IG52NTBfc29yX2RwbXMsCisJLnNhdmUgPSBudjUwX3Nvcl9zYXZlLAorCS5yZXN0b3JlID0gbnY1MF9zb3JfcmVzdG9yZSwKKwkubW9kZV9maXh1cCA9IG52NTBfc29yX21vZGVfZml4dXAsCisJLnByZXBhcmUgPSBudjUwX3Nvcl9wcmVwYXJlLAorCS5jb21taXQgPSBudjUwX3Nvcl9jb21taXQsCisJLm1vZGVfc2V0ID0gbnY1MF9zb3JfbW9kZV9zZXQsCisJLmRldGVjdCA9IE5VTEwKK307CisKK3N0YXRpYyB2b2lkCitudjUwX3Nvcl9kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCisJaWYgKCFlbmNvZGVyKQorCQlyZXR1cm47CisKKwlOVl9ERUJVRyhlbmNvZGVyLT5kZXYsICJcbiIpOworCisJZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKKworCWtmcmVlKG52X2VuY29kZXIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIG52NTBfc29yX2VuY29kZXJfZnVuY3MgPSB7CisJLmRlc3Ryb3kgPSBudjUwX3Nvcl9kZXN0cm95LAorfTsKKworaW50CitudjUwX3Nvcl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZW50cnkpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IE5VTEw7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCWJvb2wgZHVtOworCWludCB0eXBlOworCisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCXN3aXRjaCAoZW50cnktPnR5cGUpIHsKKwljYXNlIE9VVFBVVF9UTURTOgorCQlOVl9JTkZPKGRldiwgIkRldGVjdGVkIGEgVE1EUyBvdXRwdXRcbiIpOworCQl0eXBlID0gRFJNX01PREVfRU5DT0RFUl9UTURTOworCQlicmVhazsKKwljYXNlIE9VVFBVVF9MVkRTOgorCQlOVl9JTkZPKGRldiwgIkRldGVjdGVkIGEgTFZEUyBvdXRwdXRcbiIpOworCQl0eXBlID0gRFJNX01PREVfRU5DT0RFUl9MVkRTOworCisJCWlmIChub3V2ZWF1X2Jpb3NfcGFyc2VfbHZkc190YWJsZShkZXYsIDAsICZkdW0sICZkdW0pKSB7CisJCQlOVl9FUlJPUihkZXYsICJGYWlsZWQgcGFyc2luZyBMVkRTIHRhYmxlXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgT1VUUFVUX0RQOgorCQlOVl9JTkZPKGRldiwgIkRldGVjdGVkIGEgRFAgb3V0cHV0XG4iKTsKKwkJdHlwZSA9IERSTV9NT0RFX0VOQ09ERVJfVE1EUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbnZfZW5jb2RlciA9IGt6YWxsb2Moc2l6ZW9mKCpudl9lbmNvZGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFudl9lbmNvZGVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwllbmNvZGVyID0gdG9fZHJtX2VuY29kZXIobnZfZW5jb2Rlcik7CisKKwludl9lbmNvZGVyLT5kY2IgPSBlbnRyeTsKKwludl9lbmNvZGVyLT5vciA9IGZmcyhlbnRyeS0+b3IpIC0gMTsKKworCW52X2VuY29kZXItPmRpc2Nvbm5lY3QgPSBudjUwX3Nvcl9kaXNjb25uZWN0OworCisJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZudjUwX3Nvcl9lbmNvZGVyX2Z1bmNzLCB0eXBlKTsKKwlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKGVuY29kZXIsICZudjUwX3Nvcl9oZWxwZXJfZnVuY3MpOworCisJZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgPSBlbnRyeS0+aGVhZHM7CisJZW5jb2Rlci0+cG9zc2libGVfY2xvbmVzID0gMDsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZyZWcuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252cmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk5OGMzNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252cmVnLmgKQEAgLTAsMCArMSw1MzUgQEAKKy8qICRYQ29uc29ydGl1bTogbnZyZWcuaCAvbWFpbi8yIDE5OTYvMTAvMjggMDU6MTM6NDEga2FsZWIgJCAqLworLyoKKyAqIENvcHlyaWdodCAxOTk2LTE5OTcgIERhdmlkIEouIE1jS2F5CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBEQVZJRCBKLiBNQ0tBWSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisvKiAkWEZyZWU4NjogeGMvcHJvZ3JhbXMvWHNlcnZlci9ody94ZnJlZTg2L2RyaXZlcnMvbnYvbnZyZWcuaCx2IDEuNiAyMDAyLzAxLzI1IDIxOjU2OjA2IHRzaSBFeHAgJCAqLworCisjaWZuZGVmIF9fTlZSRUdfSF8KKyNkZWZpbmUgX19OVlJFR19IXworCisjZGVmaW5lIE5WX1BNQ19PRkZTRVQgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIE5WX1BNQ19TSVpFICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisKKyNkZWZpbmUgTlZfUEJVU19PRkZTRVQgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgTlZfUEJVU19TSVpFICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKworI2RlZmluZSBOVl9QRklGT19PRkZTRVQgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBOVl9QRklGT19TSVpFICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorCisjZGVmaW5lIE5WX0hESUFHX09GRlNFVCAgICAgICAgICAgICAweDAwMDA1MDAwCisjZGVmaW5lIE5WX0hESUFHX1NJWkUgICAgICAgICAgICAgICAweDAwMDAxMDAwCisKKyNkZWZpbmUgTlZfUFJBTV9PRkZTRVQgICAgICAgICAgICAgIDB4MDAwMDYwMDAKKyNkZWZpbmUgTlZfUFJBTV9TSVpFICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKworI2RlZmluZSBOVl9QVklERU9fT0ZGU0VUICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBOVl9QVklERU9fU0laRSAgICAgICAgICAgICAgMHgwMDAwMTAwMAorCisjZGVmaW5lIE5WX1BUSU1FUl9PRkZTRVQgICAgICAgICAgICAweDAwMDA5MDAwCisjZGVmaW5lIE5WX1BUSU1FUl9TSVpFICAgICAgICAgICAgICAweDAwMDAxMDAwCisKKyNkZWZpbmUgTlZfUFBNX09GRlNFVCAgICAgICAgICAgICAgIDB4MDAwMEEwMDAKKyNkZWZpbmUgTlZfUFBNX1NJWkUgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKworI2RlZmluZSBOVl9QVFZfT0ZGU0VUICAgICAgICAgICAgICAgMHgwMDAwRDAwMAorI2RlZmluZSBOVl9QVFZfU0laRSAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorCisjZGVmaW5lIE5WX1BSTVZHQV9PRkZTRVQgICAgICAgICAgICAweDAwMEEwMDAwCisjZGVmaW5lIE5WX1BSTVZHQV9TSVpFICAgICAgICAgICAgICAweDAwMDIwMDAwCisKKyNkZWZpbmUgTlZfUFJNVklPMF9PRkZTRVQgICAgICAgICAgIDB4MDAwQzAwMDAKKyNkZWZpbmUgTlZfUFJNVklPX1NJWkUgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgTlZfUFJNVklPMV9PRkZTRVQgICAgICAgICAgIDB4MDAwQzIwMDAKKworI2RlZmluZSBOVl9QRkJfT0ZGU0VUICAgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBOVl9QRkJfU0laRSAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorCisjZGVmaW5lIE5WX1BFWFRERVZfT0ZGU0VUICAgICAgICAgICAweDAwMTAxMDAwCisjZGVmaW5lIE5WX1BFWFRERVZfU0laRSAgICAgICAgICAgICAweDAwMDAxMDAwCisKKyNkZWZpbmUgTlZfUE1FX09GRlNFVCAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgTlZfUE1FX1NJWkUgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKworI2RlZmluZSBOVl9QUk9NX09GRlNFVCAgICAgICAgICAgICAgMHgwMDMwMDAwMAorI2RlZmluZSBOVl9QUk9NX1NJWkUgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorCisjZGVmaW5lIE5WX1BHUkFQSF9PRkZTRVQgICAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIE5WX1BHUkFQSF9TSVpFICAgICAgICAgICAgICAweDAwMDEwMDAwCisKKyNkZWZpbmUgTlZfUENSVEMwX09GRlNFVCAgICAgICAgICAgIDB4MDA2MDAwMDAKKyNkZWZpbmUgTlZfUENSVEMwX1NJWkUgICAgICAgICAgICAgIDB4MDAwMDIwMDAgLyogZW1waXJpY2FsICovCisKKyNkZWZpbmUgTlZfUFJNQ0lPMF9PRkZTRVQgICAgICAgICAgIDB4MDA2MDEwMDAKKyNkZWZpbmUgTlZfUFJNQ0lPX1NJWkUgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgTlZfUFJNQ0lPMV9PRkZTRVQgICAgICAgICAgIDB4MDA2MDMwMDAKKworI2RlZmluZSBOVjUwX0RJU1BMQVlfT0ZGU0VUICAgICAgICAgICAweDAwNjEwMDAwCisjZGVmaW5lIE5WNTBfRElTUExBWV9TSVpFICAgICAgICAgICAgIDB4MDAwMEZGRkYKKworI2RlZmluZSBOVl9QUkFNREFDMF9PRkZTRVQgICAgICAgICAgMHgwMDY4MDAwMAorI2RlZmluZSBOVl9QUkFNREFDMF9TSVpFICAgICAgICAgICAgMHgwMDAwMjAwMAorCisjZGVmaW5lIE5WX1BSTURJTzBfT0ZGU0VUICAgICAgICAgICAweDAwNjgxMDAwCisjZGVmaW5lIE5WX1BSTURJT19TSVpFICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIE5WX1BSTURJTzFfT0ZGU0VUICAgICAgICAgICAweDAwNjgzMDAwCisKKyNkZWZpbmUgTlZfUFJBTUlOX09GRlNFVCAgICAgICAgICAgIDB4MDA3MDAwMDAKKyNkZWZpbmUgTlZfUFJBTUlOX1NJWkUgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKworI2RlZmluZSBOVl9GSUZPX09GRlNFVCAgICAgICAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBOVl9GSUZPX1NJWkUgICAgICAgICAgICAgICAgMHgwMDgwMDAwMAorCisjZGVmaW5lIE5WX1BNQ19CT09UXzAJCQkweDAwMDAwMDAwCisjZGVmaW5lIE5WX1BNQ19FTkFCTEUJCQkweDAwMDAwMjAwCisKKyNkZWZpbmUgTlZfVklPX1ZTRTIJCQkweDAwMDAwM2MzCisjZGVmaW5lIE5WX1ZJT19TUlgJCQkweDAwMDAwM2M0CisKKyNkZWZpbmUgTlZfQ0lPX0NSWF9fQ09MT1IJCTB4MDAwMDAzZDQKKyNkZWZpbmUgTlZfQ0lPX0NSX19DT0xPUgkJMHgwMDAwMDNkNQorCisjZGVmaW5lIE5WX1BCVVNfREVCVUdfMQkJCTB4MDAwMDEwODQKKyNkZWZpbmUgTlZfUEJVU19ERUJVR180CQkJMHgwMDAwMTA5OAorI2RlZmluZSBOVl9QQlVTX0RFQlVHX0RVQUxIRUFEX0NUTAkweDAwMDAxMGYwCisjZGVmaW5lIE5WX1BCVVNfUE9XRVJDVFJMXzEJCTB4MDAwMDE1ODQKKyNkZWZpbmUgTlZfUEJVU19QT1dFUkNUUkxfMgkJMHgwMDAwMTU4OAorI2RlZmluZSBOVl9QQlVTX1BPV0VSQ1RSTF80CQkweDAwMDAxNTkwCisjZGVmaW5lIE5WX1BCVVNfUENJX05WXzE5CQkweDAwMDAxODRDCisjZGVmaW5lIE5WX1BCVVNfUENJX05WXzIwCQkweDAwMDAxODUwCisjCWRlZmluZSBOVl9QQlVTX1BDSV9OVl8yMF9ST01fU0hBRE9XX0RJU0FCTEVECSgwIDw8IDApCisjCWRlZmluZSBOVl9QQlVTX1BDSV9OVl8yMF9ST01fU0hBRE9XX0VOQUJMRUQJKDEgPDwgMCkKKworI2RlZmluZSBOVl9QRklGT19SQU1IVAkJCTB4MDAwMDIyMTAKKworI2RlZmluZSBOVl9QVFZfVFZfSU5ERVgJCQkweDAwMDBkMjIwCisjZGVmaW5lIE5WX1BUVl9UVl9EQVRBCQkJMHgwMDAwZDIyNAorI2RlZmluZSBOVl9QVFZfSEZJTFRFUgkJCTB4MDAwMGQzMTAKKyNkZWZpbmUgTlZfUFRWX0hGSUxURVIyCQkJMHgwMDAwZDM5MAorI2RlZmluZSBOVl9QVFZfVkZJTFRFUgkJCTB4MDAwMGQ1MTAKKworI2RlZmluZSBOVl9QUk1WSU9fTUlTQ19fV1JJVEUJCTB4MDAwYzAzYzIKKyNkZWZpbmUgTlZfUFJNVklPX1NSWAkJCTB4MDAwYzAzYzQKKyNkZWZpbmUgTlZfUFJNVklPX1NSCQkJMHgwMDBjMDNjNQorIwlkZWZpbmUgTlZfVklPX1NSX1JFU0VUX0lOREVYCQkweDAwCisjCWRlZmluZSBOVl9WSU9fU1JfQ0xPQ0tfSU5ERVgJCTB4MDEKKyMJZGVmaW5lIE5WX1ZJT19TUl9QTEFORV9NQVNLX0lOREVYCTB4MDIKKyMJZGVmaW5lIE5WX1ZJT19TUl9DSEFSX01BUF9JTkRFWAkJMHgwMworIwlkZWZpbmUgTlZfVklPX1NSX01FTV9NT0RFX0lOREVYCQkweDA0CisjZGVmaW5lIE5WX1BSTVZJT19NSVNDX19SRUFECQkweDAwMGMwM2NjCisjZGVmaW5lIE5WX1BSTVZJT19HUlgJCQkweDAwMGMwM2NlCisjZGVmaW5lIE5WX1BSTVZJT19HWAkJCTB4MDAwYzAzY2YKKyMJZGVmaW5lIE5WX1ZJT19HWF9TUl9JTkRFWAkJMHgwMAorIwlkZWZpbmUgTlZfVklPX0dYX1NSRU5fSU5ERVgJCTB4MDEKKyMJZGVmaW5lIE5WX1ZJT19HWF9DQ09NUF9JTkRFWAkJMHgwMgorIwlkZWZpbmUgTlZfVklPX0dYX1JPUF9JTkRFWAkJMHgwMworIwlkZWZpbmUgTlZfVklPX0dYX1JFQURfTUFQX0lOREVYCQkweDA0CisjCWRlZmluZSBOVl9WSU9fR1hfTU9ERV9JTkRFWAkJMHgwNQorIwlkZWZpbmUgTlZfVklPX0dYX01JU0NfSU5ERVgJCTB4MDYKKyMJZGVmaW5lIE5WX1ZJT19HWF9ET05UX0NBUkVfSU5ERVgJMHgwNworIwlkZWZpbmUgTlZfVklPX0dYX0JJVF9NQVNLX0lOREVYCQkweDA4CisKKyNkZWZpbmUgTlZfUEZCX0JPT1RfMAkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgTlZfUEZCX0NGRzAJCQkweDAwMTAwMjAwCisjZGVmaW5lIE5WX1BGQl9DRkcxCQkJMHgwMDEwMDIwNAorI2RlZmluZSBOVl9QRkJfQ1NUQVRVUwkJCTB4MDAxMDAyMEMKKyNkZWZpbmUgTlZfUEZCX1JFRkNUUkwJCQkweDAwMTAwMjEwCisjCWRlZmluZSBOVl9QRkJfUkVGQ1RSTF9WQUxJRF8xCQkJKDEgPDwgMzEpCisjZGVmaW5lIE5WX1BGQl9QQUQJCQkweDAwMTAwMjFDCisjCWRlZmluZSBOVl9QRkJfUEFEX0NLRV9OT1JNQUwJCQkoMSA8PCAwKQorI2RlZmluZSBOVl9QRkJfVElMRV9OVjEwCQkweDAwMTAwMjQwCisjZGVmaW5lIE5WX1BGQl9USUxFX1NJWkVfTlYxMAkJMHgwMDEwMDI0NAorI2RlZmluZSBOVl9QRkJfUkVGCQkJMHgwMDEwMDJEMAorIwlkZWZpbmUgTlZfUEZCX1JFRl9DTURfUkVGUkVTSAkJCSgxIDw8IDApCisjZGVmaW5lIE5WX1BGQl9QUkUJCQkweDAwMTAwMkQ0CisjCWRlZmluZSBOVl9QRkJfUFJFX0NNRF9QUkVDSEFSR0UJCQkoMSA8PCAwKQorI2RlZmluZSBOVl9QRkJfQ0xPU0VfUEFHRTIJCTB4MDAxMDAzM0MKKyNkZWZpbmUgTlZfUEZCX1RJTEVfTlY0MAkJMHgwMDEwMDYwMAorI2RlZmluZSBOVl9QRkJfVElMRV9TSVpFX05WNDAJCTB4MDAxMDA2MDQKKworI2RlZmluZSBOVl9QRVhUREVWX0JPT1RfMAkJMHgwMDEwMTAwMAorIwlkZWZpbmUgTlZfUEVYVERFVl9CT09UXzBfU1RSQVBfRlBfSUZBQ0VfMTJCSVQJKDggPDwgMTIpCisjZGVmaW5lIE5WX1BFWFRERVZfQk9PVF8zCQkweDAwMTAxMDBjCisKKyNkZWZpbmUgTlZfUENSVENfSU5UUl8wCQkJCQkweDAwNjAwMTAwCisjCWRlZmluZSBOVl9QQ1JUQ19JTlRSXzBfVkJMQU5LCQkJCSgxIDw8IDApCisjZGVmaW5lIE5WX1BDUlRDX0lOVFJfRU5fMAkJCQkweDAwNjAwMTQwCisjZGVmaW5lIE5WX1BDUlRDX1NUQVJUCQkJCQkweDAwNjAwODAwCisjZGVmaW5lIE5WX1BDUlRDX0NPTkZJRwkJCQkJMHgwMDYwMDgwNAorIwlkZWZpbmUgTlZfUENSVENfQ09ORklHX1NUQVJUX0FERFJFU1NfTk9OX1ZHQQkJKDEgPDwgMCkKKyMJZGVmaW5lIE5WX1BDUlRDX0NPTkZJR19TVEFSVF9BRERSRVNTX0hTWU5DCQkoMiA8PCAwKQorI2RlZmluZSBOVl9QQ1JUQ19DVVJTT1JfQ09ORklHCQkJCTB4MDA2MDA4MTAKKyMJZGVmaW5lIE5WX1BDUlRDX0NVUlNPUl9DT05GSUdfRU5BQkxFX0VOQUJMRQkJKDEgPDwgMCkKKyMJZGVmaW5lIE5WX1BDUlRDX0NVUlNPUl9DT05GSUdfRE9VQkxFX1NDQU5fRU5BQkxFCSgxIDw8IDQpCisjCWRlZmluZSBOVl9QQ1JUQ19DVVJTT1JfQ09ORklHX0FERFJFU1NfU1BBQ0VfUE5WTQkoMSA8PCA4KQorIwlkZWZpbmUgTlZfUENSVENfQ1VSU09SX0NPTkZJR19DVVJfQlBQXzMyCQkoMSA8PCAxMikKKyMJZGVmaW5lIE5WX1BDUlRDX0NVUlNPUl9DT05GSUdfQ1VSX1BJWEVMU182NAkJKDEgPDwgMTYpCisjCWRlZmluZSBOVl9QQ1JUQ19DVVJTT1JfQ09ORklHX0NVUl9MSU5FU18zMgkJKDIgPDwgMjQpCisjCWRlZmluZSBOVl9QQ1JUQ19DVVJTT1JfQ09ORklHX0NVUl9MSU5FU182NAkJKDQgPDwgMjQpCisjCWRlZmluZSBOVl9QQ1JUQ19DVVJTT1JfQ09ORklHX0NVUl9CTEVORF9BTFBIQQkJKDEgPDwgMjgpCisKKy8qIG5vdGU6IFBDUlRDX0dQSU8gaXMgbm90IGF2YWlsYWJsZSBvbiBudjEwLCBhbmQgaW4gZmFjdCBhbGlhc2VzIDB4NjAwODEwICovCisjZGVmaW5lIE5WX1BDUlRDX0dQSU8JCQkJCTB4MDA2MDA4MTgKKyNkZWZpbmUgTlZfUENSVENfR1BJT19FWFQJCQkJMHgwMDYwMDgxYworI2RlZmluZSBOVl9QQ1JUQ184MzAJCQkJCTB4MDA2MDA4MzAKKyNkZWZpbmUgTlZfUENSVENfODM0CQkJCQkweDAwNjAwODM0CisjZGVmaW5lIE5WX1BDUlRDXzg1MAkJCQkJMHgwMDYwMDg1MAorI2RlZmluZSBOVl9QQ1JUQ19FTkdJTkVfQ1RSTAkJCQkweDAwNjAwODYwCisjCWRlZmluZSBOVl9DUlRDX0ZTRUxfSTJDCQkJCQkoMSA8PCA0KQorIwlkZWZpbmUgTlZfQ1JUQ19GU0VMX09WRVJMQVkJCQkJKDEgPDwgMTIpCisKKyNkZWZpbmUgTlZfUFJNQ0lPX0FSWAkJCTB4MDA2MDEzYzAKKyNkZWZpbmUgTlZfUFJNQ0lPX0FSX19XUklURQkJMHgwMDYwMTNjMAorI2RlZmluZSBOVl9QUk1DSU9fQVJfX1JFQUQJCTB4MDA2MDEzYzEKKyMJZGVmaW5lIE5WX0NJT19BUl9NT0RFX0lOREVYCQkweDEwCisjCWRlZmluZSBOVl9DSU9fQVJfT1NDQU5fSU5ERVgJCTB4MTEKKyMJZGVmaW5lIE5WX0NJT19BUl9QTEFORV9JTkRFWAkJMHgxMgorIwlkZWZpbmUgTlZfQ0lPX0FSX0hQUF9JTkRFWAkJMHgxMworIwlkZWZpbmUgTlZfQ0lPX0FSX0NTRUxfSU5ERVgJCTB4MTQKKyNkZWZpbmUgTlZfUFJNQ0lPX0lOUDAJCQkweDAwNjAxM2MyCisjZGVmaW5lIE5WX1BSTUNJT19DUlhfX0NPTE9SCQkweDAwNjAxM2Q0CisjZGVmaW5lIE5WX1BSTUNJT19DUl9fQ09MT1IJCTB4MDA2MDEzZDUKKwkvKiBTdGFuZGFyZCBWR0EgQ1JUQyByZWdpc3RlcnMgKi8KKyMJZGVmaW5lIE5WX0NJT19DUl9IRFRfSU5ERVgJCTB4MDAJLyogaG9yaXpvbnRhbCBkaXNwbGF5IHRvdGFsICovCisjCWRlZmluZSBOVl9DSU9fQ1JfSERFX0lOREVYCQkweDAxCS8qIGhvcml6b250YWwgZGlzcGxheSBlbmQgKi8KKyMJZGVmaW5lIE5WX0NJT19DUl9IQlNfSU5ERVgJCTB4MDIJLyogaG9yaXpvbnRhbCBibGFua2luZyBzdGFydCAqLworIwlkZWZpbmUgTlZfQ0lPX0NSX0hCRV9JTkRFWAkJMHgwMwkvKiBob3Jpem9udGFsIGJsYW5raW5nIGVuZCAqLworIwkJZGVmaW5lIE5WX0NJT19DUl9IQkVfNF8wCQk0OjAKKyMJZGVmaW5lIE5WX0NJT19DUl9IUlNfSU5ERVgJCTB4MDQJLyogaG9yaXpvbnRhbCByZXRyYWNlIHN0YXJ0ICovCisjCWRlZmluZSBOVl9DSU9fQ1JfSFJFX0lOREVYCQkweDA1CS8qIGhvcml6b250YWwgcmV0cmFjZSBlbmQgKi8KKyMJCWRlZmluZSBOVl9DSU9fQ1JfSFJFXzRfMAkJNDowCisjCQlkZWZpbmUgTlZfQ0lPX0NSX0hSRV9IQkVfNQkJNzo3CisjCWRlZmluZSBOVl9DSU9fQ1JfVkRUX0lOREVYCQkweDA2CS8qIHZlcnRpY2FsIGRpc3BsYXkgdG90YWwgKi8KKyMJZGVmaW5lIE5WX0NJT19DUl9PVkxfSU5ERVgJCTB4MDcJLyogb3ZlcmZsb3cgYml0cyAqLworIwkJZGVmaW5lIE5WX0NJT19DUl9PVkxfVkRUXzgJCTA6MAorIwkJZGVmaW5lIE5WX0NJT19DUl9PVkxfVkRFXzgJCTE6MQorIwkJZGVmaW5lIE5WX0NJT19DUl9PVkxfVlJTXzgJCTI6MgorIwkJZGVmaW5lIE5WX0NJT19DUl9PVkxfVkJTXzgJCTM6MworIwkJZGVmaW5lIE5WX0NJT19DUl9PVkxfVkRUXzkJCTU6NQorIwkJZGVmaW5lIE5WX0NJT19DUl9PVkxfVkRFXzkJCTY6NgorIwkJZGVmaW5lIE5WX0NJT19DUl9PVkxfVlJTXzkJCTc6NworIwlkZWZpbmUgTlZfQ0lPX0NSX1JTQUxfSU5ERVgJCTB4MDgJLyogbm9ybWFsbHkgInByZXNldCByb3cgc2NhbiIgKi8KKyMJZGVmaW5lIE5WX0NJT19DUl9DRUxMX0hUX0lOREVYCQkweDA5CS8qIGNlbGwgaGVpZ2h0PyEgbm9ybWFsbHkgIm1heCBzY2FuIGxpbmUiICovCisjCQlkZWZpbmUgTlZfQ0lPX0NSX0NFTExfSFRfVkJTXzkJCTU6NQorIwkJZGVmaW5lIE5WX0NJT19DUl9DRUxMX0hUX1NDQU5EQkwJNzo3CisjCWRlZmluZSBOVl9DSU9fQ1JfQ1VSU19TVF9JTkRFWAkJMHgwYQkvKiBjdXJzb3Igc3RhcnQgKi8KKyMJZGVmaW5lIE5WX0NJT19DUl9DVVJTX0VORF9JTkRFWAkJMHgwYgkvKiBjdXJzb3IgZW5kICovCisjCWRlZmluZSBOVl9DSU9fQ1JfU0FfSElfSU5ERVgJCTB4MGMJLyogc2NyZWVuIHN0YXJ0IGFkZHJlc3MgaGlnaCAqLworIwlkZWZpbmUgTlZfQ0lPX0NSX1NBX0xPX0lOREVYCQkweDBkCS8qIHNjcmVlbiBzdGFydCBhZGRyZXNzIGxvdyAqLworIwlkZWZpbmUgTlZfQ0lPX0NSX1RDT0ZGX0hJX0lOREVYCQkweDBlCS8qIGN1cnNvciBvZmZzZXQgaGlnaCAqLworIwlkZWZpbmUgTlZfQ0lPX0NSX1RDT0ZGX0xPX0lOREVYCQkweDBmCS8qIGN1cnNvciBvZmZzZXQgbG93ICovCisjCWRlZmluZSBOVl9DSU9fQ1JfVlJTX0lOREVYCQkweDEwCS8qIHZlcnRpY2FsIHJldHJhY2Ugc3RhcnQgKi8KKyMJZGVmaW5lIE5WX0NJT19DUl9WUkVfSU5ERVgJCTB4MTEJLyogdmVydGljYWwgcmV0cmFjZSBlbmQgKi8KKyMJCWRlZmluZSBOVl9DSU9fQ1JfVlJFXzNfMAkJMzowCisjCWRlZmluZSBOVl9DSU9fQ1JfVkRFX0lOREVYCQkweDEyCS8qIHZlcnRpY2FsIGRpc3BsYXkgZW5kICovCisjCWRlZmluZSBOVl9DSU9fQ1JfT0ZGU0VUX0lOREVYCQkweDEzCS8qIHNldHMgc2NyZWVuIHBpdGNoICovCisjCWRlZmluZSBOVl9DSU9fQ1JfVUxJTkVfSU5ERVgJCTB4MTQJLyogdW5kZXJsaW5lIGxvY2F0aW9uICovCisjCWRlZmluZSBOVl9DSU9fQ1JfVkJTX0lOREVYCQkweDE1CS8qIHZlcnRpY2FsIGJsYW5rIHN0YXJ0ICovCisjCWRlZmluZSBOVl9DSU9fQ1JfVkJFX0lOREVYCQkweDE2CS8qIHZlcnRpY2FsIGJsYW5rIGVuZCAqLworIwlkZWZpbmUgTlZfQ0lPX0NSX01PREVfSU5ERVgJCTB4MTcJLyogY3J0YyBtb2RlIGNvbnRyb2wgKi8KKyMJZGVmaW5lIE5WX0NJT19DUl9MQ09NUF9JTkRFWAkJMHgxOAkvKiBsaW5lIGNvbXBhcmUgKi8KKwkvKiBFeHRlbmRlZCBWR0EgQ1JUQyByZWdpc3RlcnMgKi8KKyMJZGVmaW5lIE5WX0NJT19DUkVfUlBDMF9JTkRFWAkJMHgxOQkvKiByZXBhaW50IGNvbnRyb2wgMCAqLworIwkJZGVmaW5lIE5WX0NJT19DUkVfUlBDMF9PRkZTRVRfMTBfOAk3OjUKKyMJZGVmaW5lIE5WX0NJT19DUkVfUlBDMV9JTkRFWAkJMHgxYQkvKiByZXBhaW50IGNvbnRyb2wgMSAqLworIwkJZGVmaW5lIE5WX0NJT19DUkVfUlBDMV9MQVJHRQkJMjoyCisjCWRlZmluZSBOVl9DSU9fQ1JFX0ZGX0lOREVYCQkweDFiCS8qIGZpZm8gY29udHJvbCAqLworIwlkZWZpbmUgTlZfQ0lPX0NSRV9FTkhfSU5ERVgJCTB4MWMJLyogZW5oYW5jZWQ/ICovCisjCWRlZmluZSBOVl9DSU9fU1JfTE9DS19JTkRFWAkJMHgxZgkvKiBjcnRjIGxvY2sgKi8KKyMJCWRlZmluZSBOVl9DSU9fU1JfVU5MT0NLX1JXX1ZBTFVFCTB4NTcKKyMJCWRlZmluZSBOVl9DSU9fU1JfTE9DS19WQUxVRQkJMHg5OQorIwlkZWZpbmUgTlZfQ0lPX0NSRV9GRkxXTV9fSU5ERVgJCTB4MjAJLyogZmlmbyBsb3cgd2F0ZXIgbWFyayAqLworIwlkZWZpbmUgTlZfQ0lPX0NSRV8yMQkJCTB4MjEJLyogdmdhIHNoYWRvdyBjcnRjIGxvY2sgKi8KKyMJZGVmaW5lIE5WX0NJT19DUkVfTFNSX0lOREVYCQkweDI1CS8qID8gKi8KKyMJCWRlZmluZSBOVl9DSU9fQ1JFX0xTUl9WRFRfMTAJCTA6MAorIwkJZGVmaW5lIE5WX0NJT19DUkVfTFNSX1ZERV8xMAkJMToxCisjCQlkZWZpbmUgTlZfQ0lPX0NSRV9MU1JfVlJTXzEwCQkyOjIKKyMJCWRlZmluZSBOVl9DSU9fQ1JFX0xTUl9WQlNfMTAJCTM6MworIwkJZGVmaW5lIE5WX0NJT19DUkVfTFNSX0hCRV82CQk0OjQKKyMJZGVmaW5lIE5WX0NJT19DUl9BUlhfSU5ERVgJCTB4MjYJLyogYXR0cmlidXRlIGluZGV4IC0tIHJvIGNvcHkgb2YgMHg2MC4zYzAgKi8KKyMJZGVmaW5lIE5WX0NJT19DUkVfQ0hJUF9JRF9JTkRFWAkJMHgyNwkvKiBjaGlwIHJldmlzaW9uICovCisjCWRlZmluZSBOVl9DSU9fQ1JFX1BJWEVMX0lOREVYCQkweDI4CisjCQlkZWZpbmUgTlZfQ0lPX0NSRV9QSVhFTF9GT1JNQVQJCTE6MAorIwlkZWZpbmUgTlZfQ0lPX0NSRV9IRUJfX0lOREVYCQkweDJkCS8qIGhvcml6b250YWwgZXh0cmEgYml0cz8gKi8KKyMJCWRlZmluZSBOVl9DSU9fQ1JFX0hFQl9IRFRfOAkJMDowCisjCQlkZWZpbmUgTlZfQ0lPX0NSRV9IRUJfSERFXzgJCTE6MQorIwkJZGVmaW5lIE5WX0NJT19DUkVfSEVCX0hCU184CQkyOjIKKyMJCWRlZmluZSBOVl9DSU9fQ1JFX0hFQl9IUlNfOAkJMzozCisjCQlkZWZpbmUgTlZfQ0lPX0NSRV9IRUJfSUxDXzgJCTQ6NAorIwlkZWZpbmUgTlZfQ0lPX0NSRV8yRQkJCTB4MmUJLyogc29tZSBzY3JhdGNoIG9yIGR1bW15IHJlZyB0byBmb3JjZSB3cml0ZXMgdG8gc2luayBpbiAqLworIwlkZWZpbmUgTlZfQ0lPX0NSRV9IQ1VSX0FERFIyX0lOREVYCTB4MmYJLyogY3Vyc29yICovCisjCWRlZmluZSBOVl9DSU9fQ1JFX0hDVVJfQUREUjBfSU5ERVgJMHgzMAkJLyogcGl4bWFwICovCisjCQlkZWZpbmUgTlZfQ0lPX0NSRV9IQ1VSX0FERFIwX0FEUgk2OjAKKyMJCWRlZmluZSBOVl9DSU9fQ1JFX0hDVVJfQVNJCQk3OjcKKyMJZGVmaW5lIE5WX0NJT19DUkVfSENVUl9BRERSMV9JTkRFWAkweDMxCQkJLyogYWRkcmVzcyAqLworIwkJZGVmaW5lIE5WX0NJT19DUkVfSENVUl9BRERSMV9FTkFCTEUJMDowCisjCQlkZWZpbmUgTlZfQ0lPX0NSRV9IQ1VSX0FERFIxX0NVUl9EQkwJMToxCisjCQlkZWZpbmUgTlZfQ0lPX0NSRV9IQ1VSX0FERFIxX0FEUgk3OjIKKyMJZGVmaW5lIE5WX0NJT19DUkVfTENEX19JTkRFWAkJMHgzMworIwkJZGVmaW5lIE5WX0NJT19DUkVfTENEX0xDRF9TRUxFQ1QJMDowCisjCWRlZmluZSBOVl9DSU9fQ1JFX0REQzBfU1RBVFVTX19JTkRFWAkweDM2CisjCWRlZmluZSBOVl9DSU9fQ1JFX0REQzBfV1JfX0lOREVYCTB4MzcKKyMJZGVmaW5lIE5WX0NJT19DUkVfSUxBQ0VfX0lOREVYCQkweDM5CS8qIGludGVybGFjZSAqLworIwlkZWZpbmUgTlZfQ0lPX0NSRV9TQ1JBVENIM19fSU5ERVgJMHgzYgorIwlkZWZpbmUgTlZfQ0lPX0NSRV9TQ1JBVENINF9fSU5ERVgJMHgzYworIwlkZWZpbmUgTlZfQ0lPX0NSRV9ERENfU1RBVFVTX19JTkRFWAkweDNlCisjCWRlZmluZSBOVl9DSU9fQ1JFX0REQ19XUl9fSU5ERVgJCTB4M2YKKyMJZGVmaW5lIE5WX0NJT19DUkVfRUJSX0lOREVYCQkweDQxCS8qIGV4dHJhIGJpdHMgPyAodmVydGljYWwpICovCisjCQlkZWZpbmUgTlZfQ0lPX0NSRV9FQlJfVkRUXzExCQkwOjAKKyMJCWRlZmluZSBOVl9DSU9fQ1JFX0VCUl9WREVfMTEJCTI6MgorIwkJZGVmaW5lIE5WX0NJT19DUkVfRUJSX1ZSU18xMQkJNDo0CisjCQlkZWZpbmUgTlZfQ0lPX0NSRV9FQlJfVkJTXzExCQk2OjYKKyMJZGVmaW5lIE5WX0NJT19DUkVfNDMJCQkweDQzCisjCWRlZmluZSBOVl9DSU9fQ1JFXzQ0CQkJMHg0NAkvKiBoZWFkIGNvbnRyb2wgKi8KKyMJZGVmaW5lIE5WX0NJT19DUkVfQ1NCCQkJMHg0NQkvKiBjb2xvdXIgc2F0dXJhdGlvbiBib29zdCAqLworIwlkZWZpbmUgTlZfQ0lPX0NSRV9SQ1IJCQkweDQ2CisjCQlkZWZpbmUgTlZfQ0lPX0NSRV9SQ1JfRU5ESUFOX0JJRwk3OjcKKyMJZGVmaW5lIE5WX0NJT19DUkVfNDcJCQkweDQ3CS8qIGV4dGVuZGVkIGZpZm8gbHdtLCB1c2VkIG9uIG52MzArICovCisjCWRlZmluZSBOVl9DSU9fQ1JFXzQ5CQkJMHg0OQorIwlkZWZpbmUgTlZfQ0lPX0NSRV80QgkJCTB4NGIJLyogZ2l2ZW4gcGF0dGVybnMgaW4gMHhbMi0zXVthLWNdIHJlZ3MsIHByb2JhYmx5IHNjcmF0Y2ggNiAqLworIwlkZWZpbmUgTlZfQ0lPX0NSRV9UVk9VVF9MQVRFTkNZCQkweDUyCisjCWRlZmluZSBOVl9DSU9fQ1JFXzUzCQkJMHg1MwkvKiBgZnBfaHRpbWluZycgYWNjb3JkaW5nIHRvIEhhaWt1ICovCisjCWRlZmluZSBOVl9DSU9fQ1JFXzU0CQkJMHg1NAkvKiBgZnBfdnRpbWluZycgYWNjb3JkaW5nIHRvIEhhaWt1ICovCisjCWRlZmluZSBOVl9DSU9fQ1JFXzU3CQkJMHg1NwkvKiBpbmRleCByZWcgZm9yIGNyNTggKi8KKyMJZGVmaW5lIE5WX0NJT19DUkVfNTgJCQkweDU4CS8qIGRhdGEgcmVnIGZvciBjcjU3ICovCisjCWRlZmluZSBOVl9DSU9fQ1JFXzU5CQkJMHg1OQkvKiByZWxhdGVkIHRvIG9uL29mZi1jaGlwLW5lc3Mgb2YgZGlnaXRhbCBvdXRwdXRzICovCisjCWRlZmluZSBOVl9DSU9fQ1JFXzVCCQkJMHg1QgkvKiBuZXdlciBjb2xvdXIgc2F0dXJhdGlvbiByZWcgKi8KKyMJZGVmaW5lIE5WX0NJT19DUkVfODUJCQkweDg1CisjCWRlZmluZSBOVl9DSU9fQ1JFXzg2CQkJMHg4NgorI2RlZmluZSBOVl9QUk1DSU9fSU5QMF9fQ09MT1IJCTB4MDA2MDEzZGEKKworI2RlZmluZSBOVl9QUkFNREFDX0NVX1NUQVJUX1BPUwkJCQkweDAwNjgwMzAwCisjCWRlZmluZSBOVl9QUkFNREFDX0NVX1NUQVJUX1BPU19YCQkJMTU6MAorIwlkZWZpbmUgTlZfUFJBTURBQ19DVV9TVEFSVF9QT1NfWQkJCTMxOjE2CisjZGVmaW5lIE5WX1JBTURBQ19OVjEwX0NVUlNZTkMJCQkJMHgwMDY4MDQwNAorCisjZGVmaW5lIE5WX1BSQU1EQUNfTlZQTExfQ09FRkYJCQkJMHgwMDY4MDUwMAorI2RlZmluZSBOVl9QUkFNREFDX01QTExfQ09FRkYJCQkJMHgwMDY4MDUwNAorI2RlZmluZSBOVl9QUkFNREFDX1ZQTExfQ09FRkYJCQkJMHgwMDY4MDUwOAorIwlkZWZpbmUgTlYzMF9SQU1EQUNfRU5BQkxFX1ZDTzIJCQkJKDggPDwgNCkKKworI2RlZmluZSBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1QJCQkweDAwNjgwNTBjCisjCWRlZmluZSBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfVVNFX1ZQTEwyX1RSVUUJKDQgPDwgMCkKKyMJZGVmaW5lIE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVF9TT1VSQ0VfUFJPR19NUExMCSgxIDw8IDgpCisjCWRlZmluZSBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfU09VUkNFX1BST0dfVlBMTAkoMiA8PCA4KQorIwlkZWZpbmUgTlZfUFJBTURBQ19QTExfQ09FRkZfU0VMRUNUX1NPVVJDRV9QUk9HX05WUExMCSg0IDw8IDgpCisjCWRlZmluZSBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfUExMX1NPVVJDRV9WUExMMgkoOCA8PCA4KQorIwlkZWZpbmUgTlZfUFJBTURBQ19QTExfQ09FRkZfU0VMRUNUX1RWX1ZTQ0xLMQkJKDEgPDwgMTYpCisjCWRlZmluZSBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfVFZfUENMSzEJCSgyIDw8IDE2KQorIwlkZWZpbmUgTlZfUFJBTURBQ19QTExfQ09FRkZfU0VMRUNUX1RWX1ZTQ0xLMgkJKDQgPDwgMTYpCisjCWRlZmluZSBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfVFZfUENMSzIJCSg4IDw8IDE2KQorIwlkZWZpbmUgTlZfUFJBTURBQ19QTExfQ09FRkZfU0VMRUNUX1RWX0NMS19TT1VSQ0VfVklQCSgxIDw8IDIwKQorIwlkZWZpbmUgTlZfUFJBTURBQ19QTExfQ09FRkZfU0VMRUNUX1ZDTEtfUkFUSU9fREIyCSgxIDw8IDI4KQorIwlkZWZpbmUgTlZfUFJBTURBQ19QTExfQ09FRkZfU0VMRUNUX1ZDTEsyX1JBVElPX0RCMgkoMiA8PCAyOCkKKworI2RlZmluZSBOVl9QUkFNREFDX1BMTF9TRVRVUF9DT05UUk9MCQkJMHgwMDY4MDUxMAorI2RlZmluZSBOVl9SQU1EQUNfVlBMTDIJCQkJCTB4MDA2ODA1MjAKKyNkZWZpbmUgTlZfUFJBTURBQ19TRUxfQ0xLCQkJCTB4MDA2ODA1MjQKKyNkZWZpbmUgTlZfUkFNREFDX0RJVEhFUl9OVjExCQkJCTB4MDA2ODA1MjgKKyNkZWZpbmUgTlZfUFJBTURBQ19EQUNDTEsJCQkJMHgwMDY4MDUyYworIwlkZWZpbmUgTlZfUFJBTURBQ19EQUNDTEtfU0VMX0RBQ0NMSwkJCSgxIDw8IDApCisKKyNkZWZpbmUgTlZfUkFNREFDX05WUExMX0IJCQkJMHgwMDY4MDU3MAorI2RlZmluZSBOVl9SQU1EQUNfTVBMTF9CCQkJCTB4MDA2ODA1NzQKKyNkZWZpbmUgTlZfUkFNREFDX1ZQTExfQgkJCQkweDAwNjgwNTc4CisjZGVmaW5lIE5WX1JBTURBQ19WUExMMl9CCQkJCTB4MDA2ODA1N2MKKyMJZGVmaW5lIE5WMzFfUkFNREFDX0VOQUJMRV9WQ08yCQkJCSg4IDw8IDI4KQorI2RlZmluZSBOVl9QUkFNREFDXzU4MAkJCQkJMHgwMDY4MDU4MAorIwlkZWZpbmUgTlZfUkFNREFDXzU4MF9WUExMMV9BQ1RJVkUJCQkoMSA8PCA4KQorIwlkZWZpbmUgTlZfUkFNREFDXzU4MF9WUExMMl9BQ1RJVkUJCQkoMSA8PCAyOCkKKworI2RlZmluZSBOVl9QUkFNREFDX0dFTkVSQUxfQ09OVFJPTAkJCTB4MDA2ODA2MDAKKyMJZGVmaW5lIE5WX1BSQU1EQUNfR0VORVJBTF9DT05UUk9MX1BJWE1JWF9PTgkJKDMgPDwgNCkKKyMJZGVmaW5lIE5WX1BSQU1EQUNfR0VORVJBTF9DT05UUk9MX1ZHQV9TVEFURV9TRUwJCSgxIDw8IDgpCisjCWRlZmluZSBOVl9QUkFNREFDX0dFTkVSQUxfQ09OVFJPTF9BTFRfTU9ERV9TRUwJCSgxIDw8IDEyKQorIwlkZWZpbmUgTlZfUFJBTURBQ19HRU5FUkFMX0NPTlRST0xfVEVSTUlOQVRJT05fNzVPSE0JKDIgPDwgMTYpCisjCWRlZmluZSBOVl9QUkFNREFDX0dFTkVSQUxfQ09OVFJPTF9CUENfOEJJVFMJCSgxIDw8IDIwKQorIwlkZWZpbmUgTlZfUFJBTURBQ19HRU5FUkFMX0NPTlRST0xfUElQRV9MT05HCQkoMiA8PCAyOCkKKyNkZWZpbmUgTlZfUFJBTURBQ19URVNUX0NPTlRST0wJCQkJMHgwMDY4MDYwOAorIwlkZWZpbmUgTlZfUFJBTURBQ19URVNUX0NPTlRST0xfVFBfSU5TX0VOX0FTU0VSVEVECSgxIDw8IDEyKQorIwlkZWZpbmUgTlZfUFJBTURBQ19URVNUX0NPTlRST0xfUFdSRFdOX0RBQ19PRkYJCSgxIDw8IDE2KQorIwlkZWZpbmUgTlZfUFJBTURBQ19URVNUX0NPTlRST0xfU0VOU0VCX0FMTEhJCQkoMSA8PCAyOCkKKyNkZWZpbmUgTlZfUFJBTURBQ19URVNUUE9JTlRfREFUQQkJCTB4MDA2ODA2MTAKKyMJZGVmaW5lIE5WX1BSQU1EQUNfVEVTVFBPSU5UX0RBVEFfTk9UQkxBTksJCSg4IDw8IDI4KQorI2RlZmluZSBOVl9QUkFNREFDXzYzMAkJCQkJMHgwMDY4MDYzMAorI2RlZmluZSBOVl9QUkFNREFDXzYzNAkJCQkJMHgwMDY4MDYzNAorCisjZGVmaW5lIE5WX1BSQU1EQUNfVFZfU0VUVVAJCQkJMHgwMDY4MDcwMAorI2RlZmluZSBOVl9QUkFNREFDX1RWX1ZUT1RBTAkJCQkweDAwNjgwNzIwCisjZGVmaW5lIE5WX1BSQU1EQUNfVFZfVlNLRVcJCQkJMHgwMDY4MDcyNAorI2RlZmluZSBOVl9QUkFNREFDX1RWX1ZTWU5DX0RFTEFZCQkJMHgwMDY4MDcyOAorI2RlZmluZSBOVl9QUkFNREFDX1RWX0hUT1RBTAkJCQkweDAwNjgwNzJjCisjZGVmaW5lIE5WX1BSQU1EQUNfVFZfSFNLRVcJCQkJMHgwMDY4MDczMAorI2RlZmluZSBOVl9QUkFNREFDX1RWX0hTWU5DX0RFTEFZCQkJMHgwMDY4MDczNAorI2RlZmluZSBOVl9QUkFNREFDX1RWX0hTWU5DX0RFTEFZMgkJCTB4MDA2ODA3MzgKKworI2RlZmluZSBOVl9QUkFNREFDX1RWX1NFVFVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjgwNzAwCisKKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9WRElTUExBWV9FTkQJCQkweDAwNjgwODAwCisjZGVmaW5lIE5WX1BSQU1EQUNfRlBfVlRPVEFMCQkJCTB4MDA2ODA4MDQKKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9WQ1JUQwkJCQkweDAwNjgwODA4CisjZGVmaW5lIE5WX1BSQU1EQUNfRlBfVlNZTkNfU1RBUlQJCQkweDAwNjgwODBjCisjZGVmaW5lIE5WX1BSQU1EQUNfRlBfVlNZTkNfRU5ECQkJCTB4MDA2ODA4MTAKKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9WVkFMSURfU1RBUlQJCQkweDAwNjgwODE0CisjZGVmaW5lIE5WX1BSQU1EQUNfRlBfVlZBTElEX0VORAkJCTB4MDA2ODA4MTgKKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9IRElTUExBWV9FTkQJCQkweDAwNjgwODIwCisjZGVmaW5lIE5WX1BSQU1EQUNfRlBfSFRPVEFMCQkJCTB4MDA2ODA4MjQKKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9IQ1JUQwkJCQkweDAwNjgwODI4CisjZGVmaW5lIE5WX1BSQU1EQUNfRlBfSFNZTkNfU1RBUlQJCQkweDAwNjgwODJjCisjZGVmaW5lIE5WX1BSQU1EQUNfRlBfSFNZTkNfRU5ECQkJCTB4MDA2ODA4MzAKKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9IVkFMSURfU1RBUlQJCQkweDAwNjgwODM0CisjZGVmaW5lIE5WX1BSQU1EQUNfRlBfSFZBTElEX0VORAkJCTB4MDA2ODA4MzgKKworI2RlZmluZSBOVl9SQU1EQUNfRlBfRElUSEVSCQkJCTB4MDA2ODA4M2MKKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9UR19DT05UUk9MCQkJMHgwMDY4MDg0OAorIwlkZWZpbmUgTlZfUFJBTURBQ19GUF9UR19DT05UUk9MX1ZTWU5DX1BPUwkJKDEgPDwgMCkKKyMJZGVmaW5lIE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9WU1lOQ19ESVNBQkxFCQkoMiA8PCAwKQorIwlkZWZpbmUgTlZfUFJBTURBQ19GUF9UR19DT05UUk9MX0hTWU5DX1BPUwkJKDEgPDwgNCkKKyMJZGVmaW5lIE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9IU1lOQ19ESVNBQkxFCQkoMiA8PCA0KQorIwlkZWZpbmUgTlZfUFJBTURBQ19GUF9UR19DT05UUk9MX01PREVfU0NBTEUJCSgwIDw8IDgpCisjCWRlZmluZSBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfTU9ERV9DRU5URVIJCSgxIDw8IDgpCisjCWRlZmluZSBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfTU9ERV9OQVRJVkUJCSgyIDw8IDgpCisjCWRlZmluZSBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfUkVBRF9QUk9HCQkoMSA8PCAyMCkKKyMJZGVmaW5lIE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9XSURUSF8xMgkJKDEgPDwgMjQpCisjCWRlZmluZSBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfRElTUEVOX1BPUwkJKDEgPDwgMjgpCisjCWRlZmluZSBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfRElTUEVOX0RJU0FCTEUJCSgyIDw8IDI4KQorI2RlZmluZSBOVl9QUkFNREFDX0ZQX01BUkdJTl9DT0xPUgkJCTB4MDA2ODA4NGMKKyNkZWZpbmUgTlZfUFJBTURBQ184NTAJCQkJCTB4MDA2ODA4NTAKKyNkZWZpbmUgTlZfUFJBTURBQ184NUMJCQkJCTB4MDA2ODA4NWMKKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9ERUJVR18wCQkJCTB4MDA2ODA4ODAKKyMJZGVmaW5lIE5WX1BSQU1EQUNfRlBfREVCVUdfMF9YU0NBTEVfRU5BQkxFCQkoMSA8PCAwKQorIwlkZWZpbmUgTlZfUFJBTURBQ19GUF9ERUJVR18wX1lTQ0FMRV9FTkFCTEUJCSgxIDw8IDQpCisvKiBUaGlzIGRvZXNuJ3Qgc2VlbSB0byBiZSBlc3NlbnRpYWwgZm9yIHRtZHMsIGJ1dCBzdGlsbCBvZnRlbiBzZXQgKi8KKyMJZGVmaW5lIE5WX1JBTURBQ19GUF9ERUJVR18wX1RNRFNfRU5BQkxFRAkJKDggPDwgNCkKKyMJZGVmaW5lIE5WX1BSQU1EQUNfRlBfREVCVUdfMF9YSU5URVJQX0JJTElORUFSCQkoMSA8PCA4KQorIwlkZWZpbmUgTlZfUFJBTURBQ19GUF9ERUJVR18wX1lJTlRFUlBfQklMSU5FQVIJCSgxIDw8IDEyKQorIwlkZWZpbmUgTlZfUFJBTURBQ19GUF9ERUJVR18wX1hXRUlHSFRfUk9VTkQJCSgxIDw8IDIwKQorIwlkZWZpbmUgTlZfUFJBTURBQ19GUF9ERUJVR18wX1lXRUlHSFRfUk9VTkQJCSgxIDw8IDI0KQorIyAgICAgICBkZWZpbmUgTlZfUFJBTURBQ19GUF9ERUJVR18wX1BXUkRPV05fRlBDTEsgICAgICAgICAgICAgICgxIDw8IDI4KQorI2RlZmluZSBOVl9QUkFNREFDX0ZQX0RFQlVHXzEJCQkJMHgwMDY4MDg4NAorIwlkZWZpbmUgTlZfUFJBTURBQ19GUF9ERUJVR18xX1hTQ0FMRV9WQUxVRQkJMTE6MAorIwlkZWZpbmUgTlZfUFJBTURBQ19GUF9ERUJVR18xX1hTQ0FMRV9URVNUTU9ERV9FTkFCTEUJKDEgPDwgMTIpCisjCWRlZmluZSBOVl9QUkFNREFDX0ZQX0RFQlVHXzFfWVNDQUxFX1ZBTFVFCQkyNzoxNgorIwlkZWZpbmUgTlZfUFJBTURBQ19GUF9ERUJVR18xX1lTQ0FMRV9URVNUTU9ERV9FTkFCTEUJKDEgPDwgMjgpCisjZGVmaW5lIE5WX1BSQU1EQUNfRlBfREVCVUdfMgkJCQkweDAwNjgwODg4CisjZGVmaW5lIE5WX1BSQU1EQUNfRlBfREVCVUdfMwkJCQkweDAwNjgwODhDCisKKy8qIHNlZSBOVl9QUkFNREFDX0lORElSX1RNRFMgaW4gcnVsZXMueG1sICovCisjZGVmaW5lIE5WX1BSQU1EQUNfRlBfVE1EU19DT05UUk9MCQkJMHgwMDY4MDhiMAorIwlkZWZpbmUgTlZfUFJBTURBQ19GUF9UTURTX0NPTlRST0xfV1JJVEVfRElTQUJMRQkJKDEgPDwgMTYpCisjZGVmaW5lIE5WX1BSQU1EQUNfRlBfVE1EU19EQVRBCQkJCTB4MDA2ODA4YjQKKworI2RlZmluZSBOVl9QUkFNREFDXzhDMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjgwOGMwCisKKy8qIFNvbWUga2luZCBvZiBzd2l0Y2ggKi8KKyNkZWZpbmUgTlZfUFJBTURBQ185MDAJCQkJCTB4MDA2ODA5MDAKKyNkZWZpbmUgTlZfUFJBTURBQ19BMjAJCQkJCTB4MDA2ODBBMjAKKyNkZWZpbmUgTlZfUFJBTURBQ19BMjQJCQkJCTB4MDA2ODBBMjQKKyNkZWZpbmUgTlZfUFJBTURBQ19BMzQJCQkJCTB4MDA2ODBBMzQKKworI2RlZmluZSBOVl9QUkFNREFDX0NUVgkJCQkJMHgwMDY4MGMwMAorCisvKiBuYW1lcyBmYWJyaWNhdGVkIGZyb20gTlZfVVNFUl9EQUMgaW5mbyAqLworI2RlZmluZSBOVl9QUk1ESU9fUElYRUxfTUFTSwkJMHgwMDY4MTNjNgorIwlkZWZpbmUgTlZfUFJNRElPX1BJWEVMX01BU0tfTUFTSwkweGZmCisjZGVmaW5lIE5WX1BSTURJT19SRUFEX01PREVfQUREUkVTUwkweDAwNjgxM2M3CisjZGVmaW5lIE5WX1BSTURJT19XUklURV9NT0RFX0FERFJFU1MJMHgwMDY4MTNjOAorI2RlZmluZSBOVl9QUk1ESU9fUEFMRVRURV9EQVRBCQkweDAwNjgxM2M5CisKKyNkZWZpbmUgTlZfUEdSQVBIX0RFQlVHXzAJCTB4MDA0MDAwODAKKyNkZWZpbmUgTlZfUEdSQVBIX0RFQlVHXzEJCTB4MDA0MDAwODQKKyNkZWZpbmUgTlZfUEdSQVBIX0RFQlVHXzJfTlYwNAkJMHgwMDQwMDA4OAorI2RlZmluZSBOVl9QR1JBUEhfREVCVUdfMgkJMHgwMDQwMDYyMAorI2RlZmluZSBOVl9QR1JBUEhfREVCVUdfMwkJMHgwMDQwMDA4YworI2RlZmluZSBOVl9QR1JBUEhfREVCVUdfNAkJMHgwMDQwMDA5MAorI2RlZmluZSBOVl9QR1JBUEhfSU5UUgkJCTB4MDA0MDAxMDAKKyNkZWZpbmUgTlZfUEdSQVBIX0lOVFJfRU4JCTB4MDA0MDAxNDAKKyNkZWZpbmUgTlZfUEdSQVBIX0NUWF9DT05UUk9MCQkweDAwNDAwMTQ0CisjZGVmaW5lIE5WX1BHUkFQSF9DVFhfQ09OVFJPTF9OVjA0CTB4MDA0MDAxNzAKKyNkZWZpbmUgTlZfUEdSQVBIX0FCU19VQ0xJUF9YTUlOCTB4MDA0MDA1M0MKKyNkZWZpbmUgTlZfUEdSQVBIX0FCU19VQ0xJUF9ZTUlOCTB4MDA0MDA1NDAKKyNkZWZpbmUgTlZfUEdSQVBIX0FCU19VQ0xJUF9YTUFYCTB4MDA0MDA1NDQKKyNkZWZpbmUgTlZfUEdSQVBIX0FCU19VQ0xJUF9ZTUFYCTB4MDA0MDA1NDgKKyNkZWZpbmUgTlZfUEdSQVBIX0JFVEFfQU5ECQkweDAwNDAwNjA4CisjZGVmaW5lIE5WX1BHUkFQSF9MSU1JVF9WSU9MX1BJWAkweDAwNDAwNjEwCisjZGVmaW5lIE5WX1BHUkFQSF9CT0ZGU0VUMAkJMHgwMDQwMDY0MAorI2RlZmluZSBOVl9QR1JBUEhfQk9GRlNFVDEJCTB4MDA0MDA2NDQKKyNkZWZpbmUgTlZfUEdSQVBIX0JPRkZTRVQyCQkweDAwNDAwNjQ4CisjZGVmaW5lIE5WX1BHUkFQSF9CTElNSVQwCQkweDAwNDAwNjg0CisjZGVmaW5lIE5WX1BHUkFQSF9CTElNSVQxCQkweDAwNDAwNjg4CisjZGVmaW5lIE5WX1BHUkFQSF9CTElNSVQyCQkweDAwNDAwNjhjCisjZGVmaW5lIE5WX1BHUkFQSF9TVEFUVVMJCTB4MDA0MDA3MDAKKyNkZWZpbmUgTlZfUEdSQVBIX1NVUkZBQ0UJCTB4MDA0MDA3MTAKKyNkZWZpbmUgTlZfUEdSQVBIX1NUQVRFCQkJMHgwMDQwMDcxNAorI2RlZmluZSBOVl9QR1JBUEhfRklGTwkJCTB4MDA0MDA3MjAKKyNkZWZpbmUgTlZfUEdSQVBIX1BBVFRFUk5fU0hBUEUJCTB4MDA0MDA4MTAKKyNkZWZpbmUgTlZfUEdSQVBIX1RJTEUJCQkweDAwNDAwYjAwCisKKyNkZWZpbmUgTlZfUFZJREVPX0lOVFJfRU4JCTB4MDAwMDgxNDAKKyNkZWZpbmUgTlZfUFZJREVPX0JVRkZFUgkJMHgwMDAwODcwMAorI2RlZmluZSBOVl9QVklERU9fU1RPUAkJCTB4MDAwMDg3MDQKKyNkZWZpbmUgTlZfUFZJREVPX1VWUExBTkVfQkFTRShidWZmKQkoMHgwMDAwODgwMCsoYnVmZikqNCkKKyNkZWZpbmUgTlZfUFZJREVPX1VWUExBTkVfTElNSVQoYnVmZikJKDB4MDAwMDg4MDgrKGJ1ZmYpKjQpCisjZGVmaW5lIE5WX1BWSURFT19VVlBMQU5FX09GRlNFVF9CVUZGKGJ1ZmYpCSgweDAwMDA4ODIwKyhidWZmKSo0KQorI2RlZmluZSBOVl9QVklERU9fQkFTRShidWZmKQkJKDB4MDAwMDg5MDArKGJ1ZmYpKjQpCisjZGVmaW5lIE5WX1BWSURFT19MSU1JVChidWZmKQkJKDB4MDAwMDg5MDgrKGJ1ZmYpKjQpCisjZGVmaW5lIE5WX1BWSURFT19MVU1JTkFOQ0UoYnVmZikJKDB4MDAwMDg5MTArKGJ1ZmYpKjQpCisjZGVmaW5lIE5WX1BWSURFT19DSFJPTUlOQU5DRShidWZmKQkoMHgwMDAwODkxOCsoYnVmZikqNCkKKyNkZWZpbmUgTlZfUFZJREVPX09GRlNFVF9CVUZGKGJ1ZmYpCSgweDAwMDA4OTIwKyhidWZmKSo0KQorI2RlZmluZSBOVl9QVklERU9fU0laRV9JTihidWZmKQkJKDB4MDAwMDg5MjgrKGJ1ZmYpKjQpCisjZGVmaW5lIE5WX1BWSURFT19QT0lOVF9JTihidWZmKQkoMHgwMDAwODkzMCsoYnVmZikqNCkKKyNkZWZpbmUgTlZfUFZJREVPX0RTX0RYKGJ1ZmYpCQkoMHgwMDAwODkzOCsoYnVmZikqNCkKKyNkZWZpbmUgTlZfUFZJREVPX0RUX0RZKGJ1ZmYpCQkoMHgwMDAwODk0MCsoYnVmZikqNCkKKyNkZWZpbmUgTlZfUFZJREVPX1BPSU5UX09VVChidWZmKQkoMHgwMDAwODk0OCsoYnVmZikqNCkKKyNkZWZpbmUgTlZfUFZJREVPX1NJWkVfT1VUKGJ1ZmYpCSgweDAwMDA4OTUwKyhidWZmKSo0KQorI2RlZmluZSBOVl9QVklERU9fRk9STUFUKGJ1ZmYpCQkoMHgwMDAwODk1OCsoYnVmZikqNCkKKyMJZGVmaW5lIE5WX1BWSURFT19GT1JNQVRfUExBTkFSCQkJKDEgPDwgMCkKKyMJZGVmaW5lIE5WX1BWSURFT19GT1JNQVRfQ09MT1JfTEVfQ1I4WUI4Q0I4WUE4CSgxIDw8IDE2KQorIwlkZWZpbmUgTlZfUFZJREVPX0ZPUk1BVF9ESVNQTEFZX0NPTE9SX0tFWQkoMSA8PCAyMCkKKyMJZGVmaW5lIE5WX1BWSURFT19GT1JNQVRfTUFUUklYX0lUVVJCVDcwOQkoMSA8PCAyNCkKKyNkZWZpbmUgTlZfUFZJREVPX0NPTE9SX0tFWQkJMHgwMDAwOEIwMAorCisvKiBOVjA0IG92ZXJsYXkgZGVmaW5lcyBmcm9tIFZJRElYICYgSGFpa3UgKi8KKyNkZWZpbmUgTlZfUFZJREVPX0lOVFJfRU5fMAkJMHgwMDY4MDE0MAorI2RlZmluZSBOVl9QVklERU9fU1RFUF9TSVpFCQkweDAwNjgwMjAwCisjZGVmaW5lIE5WX1BWSURFT19DT05UUk9MX1kJCTB4MDA2ODAyMDQKKyNkZWZpbmUgTlZfUFZJREVPX0NPTlRST0xfWAkJMHgwMDY4MDIwOAorI2RlZmluZSBOVl9QVklERU9fQlVGRjBfU1RBUlRfQUREUkVTUwkweDAwNjgwMjBjCisjZGVmaW5lIE5WX1BWSURFT19CVUZGMF9QSVRDSF9MRU5HVEgJMHgwMDY4MDIxNAorI2RlZmluZSBOVl9QVklERU9fQlVGRjBfT0ZGU0VUCQkweDAwNjgwMjFjCisjZGVmaW5lIE5WX1BWSURFT19CVUZGMV9TVEFSVF9BRERSRVNTCTB4MDA2ODAyMTAKKyNkZWZpbmUgTlZfUFZJREVPX0JVRkYxX1BJVENIX0xFTkdUSAkweDAwNjgwMjE4CisjZGVmaW5lIE5WX1BWSURFT19CVUZGMV9PRkZTRVQJCTB4MDA2ODAyMjAKKyNkZWZpbmUgTlZfUFZJREVPX09FX1NUQVRFCQkweDAwNjgwMjI0CisjZGVmaW5lIE5WX1BWSURFT19TVV9TVEFURQkJMHgwMDY4MDIyOAorI2RlZmluZSBOVl9QVklERU9fUk1fU1RBVEUJCTB4MDA2ODAyMmMKKyNkZWZpbmUgTlZfUFZJREVPX1dJTkRPV19TVEFSVAkJMHgwMDY4MDIzMAorI2RlZmluZSBOVl9QVklERU9fV0lORE9XX1NJWkUJCTB4MDA2ODAyMzQKKyNkZWZpbmUgTlZfUFZJREVPX0ZJRk9fVEhSRVNfU0laRQkweDAwNjgwMjM4CisjZGVmaW5lIE5WX1BWSURFT19GSUZPX0JVUlNUX0xFTkdUSAkweDAwNjgwMjNjCisjZGVmaW5lIE5WX1BWSURFT19LRVkJCQkweDAwNjgwMjQwCisjZGVmaW5lIE5WX1BWSURFT19PVkVSTEFZCQkweDAwNjgwMjQ0CisjZGVmaW5lIE5WX1BWSURFT19SRURfQ1NDX09GRlNFVAkweDAwNjgwMjgwCisjZGVmaW5lIE5WX1BWSURFT19HUkVFTl9DU0NfT0ZGU0VUCTB4MDA2ODAyODQKKyNkZWZpbmUgTlZfUFZJREVPX0JMVUVfQ1NDX09GRlNFVAkweDAwNjgwMjg4CisjZGVmaW5lIE5WX1BWSURFT19DU0NfQURKVVNUCQkweDAwNjgwMjhjCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vTWFrZWZpbGUKaW5kZXggYjU3MTNlZS4uZmViNTJlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL01ha2VmaWxlCkBAIC00OSw3ICs0OSw3IEBACiAJcmFkZW9uX2NzLm8gcmFkZW9uX2Jpb3MubyByYWRlb25fYmVuY2htYXJrLm8gcjEwMC5vIHIzMDAubyByNDIwLm8gXAogCXJzNDAwLm8gcnM2MDAubyByczY5MC5vIHJ2NTE1Lm8gcjUyMC5vIHI2MDAubyBydjc3MC5vIHJhZGVvbl90ZXN0Lm8gXAogCXIyMDAubyByYWRlb25fbGVnYWN5X3R2Lm8gcjYwMF9jcy5vIHI2MDBfYmxpdC5vIHI2MDBfYmxpdF9zaGFkZXJzLm8gXAotCXI2MDBfYmxpdF9rbXMubyByYWRlb25fcG0ubworCXI2MDBfYmxpdF9rbXMubyByYWRlb25fcG0ubyBhdG9tYmlvc19kcC5vCiAKIHJhZGVvbi0kKENPTkZJR19DT01QQVQpICs9IHJhZGVvbl9pb2MzMi5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tLmMKaW5kZXggZDY3YzQyNS4uNjU3OGQxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tLmMKQEAgLTI2MywxMCArMjYzLDEwIEBACiAJY2FzZSBBVE9NX0FSR19GQjoKIAkJaWR4ID0gVTgoKnB0cik7CiAJCSgqcHRyKSsrOworCQl2YWwgPSBnY3R4LT5zY3JhdGNoWygoZ2N0eC0+ZmJfYmFzZSArIGlkeCkgLyA0KV07CiAJCWlmIChwcmludCkKIAkJCURFQlVHKCJGQlsweCUwMlhdIiwgaWR4KTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRkIgYWNjZXNzIGlzIG5vdCBpbXBsZW1lbnRlZC5cbiIpOwotCQlyZXR1cm4gMDsKKwkJYnJlYWs7CiAJY2FzZSBBVE9NX0FSR19JTU06CiAJCXN3aXRjaCAoYWxpZ24pIHsKIAkJY2FzZSBBVE9NX1NSQ19EV09SRDoKQEAgLTQ4OCw5ICs0ODgsOSBAQAogCWNhc2UgQVRPTV9BUkdfRkI6CiAJCWlkeCA9IFU4KCpwdHIpOwogCQkoKnB0cikrKzsKKwkJZ2N0eC0+c2NyYXRjaFsoKGdjdHgtPmZiX2Jhc2UgKyBpZHgpIC8gNCldID0gdmFsOwogCQlERUJVRygiRkJbMHglMDJYXSIsIGlkeCk7Ci0JCXByaW50ayhLRVJOX0lORk8gIkZCIGFjY2VzcyBpcyBub3QgaW1wbGVtZW50ZWQuXG4iKTsKLQkJcmV0dXJuOworCQlicmVhazsKIAljYXNlIEFUT01fQVJHX1BMTDoKIAkJaWR4ID0gVTgoKnB0cik7CiAJCSgqcHRyKSsrOwpAQCAtMTIxNCwzICsxMjE0LDI4IEBACiAJCSpjcmV2ID0gQ1U4KGlkeCArIDMpOwogCXJldHVybjsKIH0KKworaW50IGF0b21fYWxsb2NhdGVfZmJfc2NyYXRjaChzdHJ1Y3QgYXRvbV9jb250ZXh0ICpjdHgpCit7CisJaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoREFUQSwgVlJBTV9Vc2FnZUJ5RmlybXdhcmUpOworCXVpbnQxNl90IGRhdGFfb2Zmc2V0OworCWludCB1c2FnZV9ieXRlczsKKwlzdHJ1Y3QgX0FUT01fVlJBTV9VU0FHRV9CWV9GSVJNV0FSRSAqZmlybXdhcmVfdXNhZ2U7CisKKwlhdG9tX3BhcnNlX2RhdGFfaGVhZGVyKGN0eCwgaW5kZXgsIE5VTEwsIE5VTEwsIE5VTEwsICZkYXRhX29mZnNldCk7CisKKwlmaXJtd2FyZV91c2FnZSA9IChzdHJ1Y3QgX0FUT01fVlJBTV9VU0FHRV9CWV9GSVJNV0FSRSAqKShjdHgtPmJpb3MgKyBkYXRhX29mZnNldCk7CisKKwlEUk1fREVCVUcoImF0b20gZmlybXdhcmUgcmVxdWVzdGVkICUwOHggJWRrYlxuIiwKKwkJICBmaXJtd2FyZV91c2FnZS0+YXNGaXJtd2FyZVZyYW1SZXNlcnZlSW5mb1swXS51bFN0YXJ0QWRkclVzZWRCeUZpcm13YXJlLAorCQkgIGZpcm13YXJlX3VzYWdlLT5hc0Zpcm13YXJlVnJhbVJlc2VydmVJbmZvWzBdLnVzRmlybXdhcmVVc2VJbktiKTsKKworCXVzYWdlX2J5dGVzID0gZmlybXdhcmVfdXNhZ2UtPmFzRmlybXdhcmVWcmFtUmVzZXJ2ZUluZm9bMF0udXNGaXJtd2FyZVVzZUluS2IgKiAxMDI0OworCWlmICh1c2FnZV9ieXRlcyA9PSAwKQorCQl1c2FnZV9ieXRlcyA9IDIwICogMTAyNDsKKwkvKiBhbGxvY2F0ZSBzb21lIHNjcmF0Y2ggbWVtb3J5ICovCisJY3R4LT5zY3JhdGNoID0ga3phbGxvYyh1c2FnZV9ieXRlcywgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHgtPnNjcmF0Y2gpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b20uaAppbmRleCBlNmViMzhmLi42NjcxODQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b20uaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b20uaApAQCAtMTMyLDYgKzEzMiw3IEBACiAJdWludDhfdCBzaGlmdDsKIAlpbnQgY3NfZXF1YWwsIGNzX2Fib3ZlOwogCWludCBpb19tb2RlOworCXVpbnQzMl90ICpzY3JhdGNoOwogfTsKIAogZXh0ZXJuIGludCBhdG9tX2RlYnVnOwpAQCAtMTQyLDYgKzE0Myw3IEBACiB2b2lkIGF0b21fZGVzdHJveShzdHJ1Y3QgYXRvbV9jb250ZXh0ICopOwogdm9pZCBhdG9tX3BhcnNlX2RhdGFfaGVhZGVyKHN0cnVjdCBhdG9tX2NvbnRleHQgKmN0eCwgaW50IGluZGV4LCB1aW50MTZfdCAqc2l6ZSwgdWludDhfdCAqZnJldiwgdWludDhfdCAqY3JldiwgdWludDE2X3QgKmRhdGFfc3RhcnQpOwogdm9pZCBhdG9tX3BhcnNlX2NtZF9oZWFkZXIoc3RydWN0IGF0b21fY29udGV4dCAqY3R4LCBpbnQgaW5kZXgsIHVpbnQ4X3QgKmZyZXYsIHVpbnQ4X3QgKmNyZXYpOworaW50IGF0b21fYWxsb2NhdGVfZmJfc2NyYXRjaChzdHJ1Y3QgYXRvbV9jb250ZXh0ICpjdHgpOwogI2luY2x1ZGUgImF0b20tdHlwZXMuaCIKICNpbmNsdWRlICJhdG9tYmlvcy5oIgogI2luY2x1ZGUgIk9iamVjdElELmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zLmgKaW5kZXggNjY0M2FmYy4uNWY0ODUxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvcy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3MuaApAQCAtMjY4MCw3ICsyNjgwLDcgQEAKIHR5cGVkZWYgc3RydWN0IF9BVE9NX0hQRF9JTlRfUkVDT1JEIHsKIAlBVE9NX0NPTU1PTl9SRUNPUkRfSEVBREVSIHNoZWFkZXI7CiAJVUNIQVIgdWNIUERJbnRHUElPSUQ7CS8qIENvcnJlc3BvbmRpbmcgYmxvY2sgaW4gR1BJT19QSU5fSU5GTyB0YWJsZSBnaXZlcyB0aGUgcGluIGluZm8gKi8KLQlVQ0hBUiB1Y1BsdWdnZ2VkX1BpblN0YXRlOworCVVDSEFSIHVjUGx1Z2dlZF9QaW5TdGF0ZTsKIH0gQVRPTV9IUERfSU5UX1JFQ09SRDsKIAogdHlwZWRlZiBzdHJ1Y3QgX0FUT01fT1VUUFVUX1BST1RFQ1RJT05fUkVDT1JEIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKaW5kZXggYzE1Mjg3YS4uMjYwZmNmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKQEAgLTI0MSw2ICsyNDEsNyBAQAogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CiAJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSB0b19yYWRlb25fY3J0YyhjcnRjKTsKIAogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgRFJNX01PREVfRFBNU19PTjoKQEAgLTI0OCwyMCArMjQ5LDE5IEBACiAJCWlmIChBU0lDX0lTX0RDRTMocmRldikpCiAJCQlhdG9tYmlvc19lbmFibGVfY3J0Y19tZW1yZXEoY3J0YywgMSk7CiAJCWF0b21iaW9zX2JsYW5rX2NydGMoY3J0YywgMCk7CisJCWRybV92YmxhbmtfcG9zdF9tb2Rlc2V0KGRldiwgcmFkZW9uX2NydGMtPmNydGNfaWQpOworCQlyYWRlb25fY3J0Y19sb2FkX2x1dChjcnRjKTsKIAkJYnJlYWs7CiAJY2FzZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlk6CiAJY2FzZSBEUk1fTU9ERV9EUE1TX1NVU1BFTkQ6CiAJY2FzZSBEUk1fTU9ERV9EUE1TX09GRjoKKwkJZHJtX3ZibGFua19wcmVfbW9kZXNldChkZXYsIHJhZGVvbl9jcnRjLT5jcnRjX2lkKTsKIAkJYXRvbWJpb3NfYmxhbmtfY3J0YyhjcnRjLCAxKTsKIAkJaWYgKEFTSUNfSVNfRENFMyhyZGV2KSkKIAkJCWF0b21iaW9zX2VuYWJsZV9jcnRjX21lbXJlcShjcnRjLCAwKTsKIAkJYXRvbWJpb3NfZW5hYmxlX2NydGMoY3J0YywgMCk7CiAJCWJyZWFrOwogCX0KLQotCWlmIChtb2RlICE9IERSTV9NT0RFX0RQTVNfT0ZGKSB7Ci0JCXJhZGVvbl9jcnRjX2xvYWRfbHV0KGNydGMpOwotCX0KIH0KIAogc3RhdGljIHZvaWQKQEAgLTQ1Nyw5ICs0NTcsOCBAQAogCQkJCWlmIChlbmNvZGVyLT5lbmNvZGVyX3R5cGUgIT0KIAkJCQkgICAgRFJNX01PREVfRU5DT0RFUl9EQUMpCiAJCQkJCXBsbF9mbGFncyB8PSBSQURFT05fUExMX05PX09ERF9QT1NUX0RJVjsKLQkJCQlpZiAoIUFTSUNfSVNfQVZJVk8ocmRldikKLQkJCQkgICAgJiYgKGVuY29kZXItPmVuY29kZXJfdHlwZSA9PQotCQkJCQlEUk1fTU9ERV9FTkNPREVSX0xWRFMpKQorCQkJCWlmIChlbmNvZGVyLT5lbmNvZGVyX3R5cGUgPT0KKwkJCQkJRFJNX01PREVfRU5DT0RFUl9MVkRTKQogCQkJCQlwbGxfZmxhZ3MgfD0gUkFERU9OX1BMTF9VU0VfUkVGX0RJVjsKIAkJCX0KIAkJCXJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CkBAIC01MDAsOCArNDk5LDE4IEBACiAJZWxzZQogCQlwbGwgPSAmcmRldi0+Y2xvY2sucDJwbGw7CiAKLQlyYWRlb25fY29tcHV0ZV9wbGwocGxsLCBhZGp1c3RlZF9jbG9jaywgJnBsbF9jbG9jaywgJmZiX2RpdiwgJmZyYWNfZmJfZGl2LAotCQkJICAgJnJlZl9kaXYsICZwb3N0X2RpdiwgcGxsX2ZsYWdzKTsKKwlpZiAoQVNJQ19JU19BVklWTyhyZGV2KSkgeworCQlpZiAocmFkZW9uX25ld19wbGwpCisJCQlyYWRlb25fY29tcHV0ZV9wbGxfYXZpdm8ocGxsLCBhZGp1c3RlZF9jbG9jaywgJnBsbF9jbG9jaywKKwkJCQkJCSAmZmJfZGl2LCAmZnJhY19mYl9kaXYsCisJCQkJCQkgJnJlZl9kaXYsICZwb3N0X2RpdiwgcGxsX2ZsYWdzKTsKKwkJZWxzZQorCQkJcmFkZW9uX2NvbXB1dGVfcGxsKHBsbCwgYWRqdXN0ZWRfY2xvY2ssICZwbGxfY2xvY2ssCisJCQkJCSAgICZmYl9kaXYsICZmcmFjX2ZiX2RpdiwKKwkJCQkJICAgJnJlZl9kaXYsICZwb3N0X2RpdiwgcGxsX2ZsYWdzKTsKKwl9IGVsc2UKKwkJcmFkZW9uX2NvbXB1dGVfcGxsKHBsbCwgYWRqdXN0ZWRfY2xvY2ssICZwbGxfY2xvY2ssICZmYl9kaXYsICZmcmFjX2ZiX2RpdiwKKwkJCQkgICAmcmVmX2RpdiwgJnBvc3RfZGl2LCBwbGxfZmxhZ3MpOwogCiAJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBTZXRQaXhlbENsb2NrKTsKIAlhdG9tX3BhcnNlX2NtZF9oZWFkZXIocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICZmcmV2LApAQCAtNTc0LDIxICs1ODMsMzIgQEAKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IHJhZGVvbl9mcmFtZWJ1ZmZlciAqcmFkZW9uX2ZiOwogCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwotCXN0cnVjdCBkcm1fcmFkZW9uX2dlbV9vYmplY3QgKm9ial9wcml2OworCXN0cnVjdCByYWRlb25fYm8gKnJibzsKIAl1aW50NjRfdCBmYl9sb2NhdGlvbjsKIAl1aW50MzJfdCBmYl9mb3JtYXQsIGZiX3BpdGNoX3BpeGVscywgdGlsaW5nX2ZsYWdzOworCWludCByOwogCi0JaWYgKCFjcnRjLT5mYikKLQkJcmV0dXJuIC1FSU5WQUw7CisJLyogbm8gZmIgYm91bmQgKi8KKwlpZiAoIWNydGMtPmZiKSB7CisJCURSTV9ERUJVRygiTm8gRkIgYm91bmRcbiIpOworCQlyZXR1cm4gMDsKKwl9CiAKIAlyYWRlb25fZmIgPSB0b19yYWRlb25fZnJhbWVidWZmZXIoY3J0Yy0+ZmIpOwogCisJLyogUGluIGZyYW1lYnVmZmVyICYgZ2V0IHRpbGxpbmcgaW5mb3JtYXRpb25zICovCiAJb2JqID0gcmFkZW9uX2ZiLT5vYmo7Ci0Jb2JqX3ByaXYgPSBvYmotPmRyaXZlcl9wcml2YXRlOwotCi0JaWYgKHJhZGVvbl9nZW1fb2JqZWN0X3BpbihvYmosIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sICZmYl9sb2NhdGlvbikpIHsKKwlyYm8gPSBvYmotPmRyaXZlcl9wcml2YXRlOworCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyYm8sIGZhbHNlKTsKKwlpZiAodW5saWtlbHkociAhPSAwKSkKKwkJcmV0dXJuIHI7CisJciA9IHJhZGVvbl9ib19waW4ocmJvLCBSQURFT05fR0VNX0RPTUFJTl9WUkFNLCAmZmJfbG9jYXRpb24pOworCWlmICh1bmxpa2VseShyICE9IDApKSB7CisJCXJhZGVvbl9ib191bnJlc2VydmUocmJvKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCXJhZGVvbl9ib19nZXRfdGlsaW5nX2ZsYWdzKHJibywgJnRpbGluZ19mbGFncywgTlVMTCk7CisJcmFkZW9uX2JvX3VucmVzZXJ2ZShyYm8pOwogCiAJc3dpdGNoIChjcnRjLT5mYi0+Yml0c19wZXJfcGl4ZWwpIHsKIAljYXNlIDg6CkBAIC02MTgsOCArNjM4LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmFkZW9uX29iamVjdF9nZXRfdGlsaW5nX2ZsYWdzKG9iai0+ZHJpdmVyX3ByaXZhdGUsCi0JCQkJICAgICAgICZ0aWxpbmdfZmxhZ3MsIE5VTEwpOwogCWlmICh0aWxpbmdfZmxhZ3MgJiBSQURFT05fVElMSU5HX01BQ1JPKQogCQlmYl9mb3JtYXQgfD0gQVZJVk9fRDFHUlBIX01BQ1JPX0FERFJFU1NfTU9ERTsKIApAQCAtNjc0LDcgKzY5MiwxMiBAQAogCiAJaWYgKG9sZF9mYiAmJiBvbGRfZmIgIT0gY3J0Yy0+ZmIpIHsKIAkJcmFkZW9uX2ZiID0gdG9fcmFkZW9uX2ZyYW1lYnVmZmVyKG9sZF9mYik7Ci0JCXJhZGVvbl9nZW1fb2JqZWN0X3VucGluKHJhZGVvbl9mYi0+b2JqKTsKKwkJcmJvID0gcmFkZW9uX2ZiLT5vYmotPmRyaXZlcl9wcml2YXRlOworCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmJvLCBmYWxzZSk7CisJCWlmICh1bmxpa2VseShyICE9IDApKQorCQkJcmV0dXJuIHI7CisJCXJhZGVvbl9ib191bnBpbihyYm8pOworCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJibyk7CiAJfQogCiAJLyogQnl0ZXMgcGVyIHBpeGVsIG1heSBoYXZlIGNoYW5nZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfZHAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDYzYzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19kcC5jCkBAIC0wLDAgKzEsNzkwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDctOCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBEYXZlIEFpcmxpZQorICogICAgICAgICAgQWxleCBEZXVjaGVyCisgKi8KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAicmFkZW9uX2RybS5oIgorI2luY2x1ZGUgInJhZGVvbi5oIgorCisjaW5jbHVkZSAiYXRvbS5oIgorI2luY2x1ZGUgImF0b20tYml0cy5oIgorI2luY2x1ZGUgImRybV9kcF9oZWxwZXIuaCIKKworLyogbW92ZSB0aGVzZSB0byBkcm1fZHBfaGVscGVyLmMvaCAqLworI2RlZmluZSBEUF9MSU5LX0NPTkZJR1VSQVRJT05fU0laRSA5CisjZGVmaW5lIERQX0xJTktfU1RBVFVTX1NJWkUJICAgNgorI2RlZmluZSBEUF9EUENEX1NJWkUJICAgICAgICAgICA4CisKK3N0YXRpYyBjaGFyICp2b2x0YWdlX25hbWVzW10gPSB7CisgICAgICAgICIwLjRWIiwgIjAuNlYiLCAiMC44ViIsICIxLjJWIgorfTsKK3N0YXRpYyBjaGFyICpwcmVfZW1waF9uYW1lc1tdID0geworICAgICAgICAiMGRCIiwgIjMuNWRCIiwgIjZkQiIsICI5LjVkQiIKK307CisKK3N0YXRpYyBjb25zdCBpbnQgZHBfY2xvY2tzW10gPSB7CisJNTQwMDAsICAvKiAxIGxhbmUsIDEuNjIgR2h6ICovCisJOTAwMDAsICAvKiAxIGxhbmUsIDIuNzAgR2h6ICovCisJMTA4MDAwLCAvKiAyIGxhbmUsIDEuNjIgR2h6ICovCisJMTgwMDAwLCAvKiAyIGxhbmUsIDIuNzAgR2h6ICovCisJMjE2MDAwLCAvKiA0IGxhbmUsIDEuNjIgR2h6ICovCisJMzYwMDAwLCAvKiA0IGxhbmUsIDIuNzAgR2h6ICovCit9OworCitzdGF0aWMgY29uc3QgaW50IG51bV9kcF9jbG9ja3MgPSBzaXplb2YoZHBfY2xvY2tzKSAvIHNpemVvZihpbnQpOworCisvKiBjb21tb24gaGVscGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBkcF9sYW5lc19mb3JfbW9kZV9jbG9jayh1OCBkcGNkW0RQX0RQQ0RfU0laRV0sIGludCBtb2RlX2Nsb2NrKQoreworCWludCBpOworCXU4IG1heF9saW5rX2J3OworCXU4IG1heF9sYW5lX2NvdW50OworCisJaWYgKCFkcGNkKQorCQlyZXR1cm4gMDsKKworCW1heF9saW5rX2J3ID0gZHBjZFtEUF9NQVhfTElOS19SQVRFXTsKKwltYXhfbGFuZV9jb3VudCA9IGRwY2RbRFBfTUFYX0xBTkVfQ09VTlRdICYgRFBfTUFYX0xBTkVfQ09VTlRfTUFTSzsKKworCXN3aXRjaCAobWF4X2xpbmtfYncpIHsKKwljYXNlIERQX0xJTktfQldfMV82MjoKKwlkZWZhdWx0OgorCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2RwX2Nsb2NrczsgaSsrKSB7CisJCQlpZiAoaSAlIDIpCisJCQkJY29udGludWU7CisJCQlzd2l0Y2ggKG1heF9sYW5lX2NvdW50KSB7CisJCQljYXNlIDE6CisJCQkJaWYgKGkgPiAxKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlpZiAoaSA+IDMpCisJCQkJCXJldHVybiAwOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChkcF9jbG9ja3NbaV0gPiBtb2RlX2Nsb2NrKSB7CisJCQkJaWYgKGkgPCAyKQorCQkJCQlyZXR1cm4gMTsKKwkJCQllbHNlIGlmIChpIDwgNCkKKwkJCQkJcmV0dXJuIDI7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gNDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIERQX0xJTktfQldfMl83OgorCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2RwX2Nsb2NrczsgaSsrKSB7CisJCQlzd2l0Y2ggKG1heF9sYW5lX2NvdW50KSB7CisJCQljYXNlIDE6CisJCQkJaWYgKGkgPiAxKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlpZiAoaSA+IDMpCisJCQkJCXJldHVybiAwOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChkcF9jbG9ja3NbaV0gPiBtb2RlX2Nsb2NrKSB7CisJCQkJaWYgKGkgPCAyKQorCQkJCQlyZXR1cm4gMTsKKwkJCQllbHNlIGlmIChpIDwgNCkKKwkJCQkJcmV0dXJuIDI7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gNDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcF9saW5rX2Nsb2NrX2Zvcl9tb2RlX2Nsb2NrKHU4IGRwY2RbRFBfRFBDRF9TSVpFXSwgaW50IG1vZGVfY2xvY2spCit7CisJaW50IGk7CisJdTggbWF4X2xpbmtfYnc7CisJdTggbWF4X2xhbmVfY291bnQ7CisKKwlpZiAoIWRwY2QpCisJCXJldHVybiAwOworCisJbWF4X2xpbmtfYncgPSBkcGNkW0RQX01BWF9MSU5LX1JBVEVdOworCW1heF9sYW5lX2NvdW50ID0gZHBjZFtEUF9NQVhfTEFORV9DT1VOVF0gJiBEUF9NQVhfTEFORV9DT1VOVF9NQVNLOworCisJc3dpdGNoIChtYXhfbGlua19idykgeworCWNhc2UgRFBfTElOS19CV18xXzYyOgorCWRlZmF1bHQ6CisJCWZvciAoaSA9IDA7IGkgPCBudW1fZHBfY2xvY2tzOyBpKyspIHsKKwkJCWlmIChpICUgMikKKwkJCQljb250aW51ZTsKKwkJCXN3aXRjaCAobWF4X2xhbmVfY291bnQpIHsKKwkJCWNhc2UgMToKKwkJCQlpZiAoaSA+IDEpCisJCQkJCXJldHVybiAwOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWlmIChpID4gMykKKwkJCQkJcmV0dXJuIDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGRwX2Nsb2Nrc1tpXSA+IG1vZGVfY2xvY2spCisJCQkJcmV0dXJuIDE2MjAwMDsKKwkJfQorCQlicmVhazsKKwljYXNlIERQX0xJTktfQldfMl83OgorCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2RwX2Nsb2NrczsgaSsrKSB7CisJCQlzd2l0Y2ggKG1heF9sYW5lX2NvdW50KSB7CisJCQljYXNlIDE6CisJCQkJaWYgKGkgPiAxKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlpZiAoaSA+IDMpCisJCQkJCXJldHVybiAwOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChkcF9jbG9ja3NbaV0gPiBtb2RlX2Nsb2NrKQorCQkJCXJldHVybiAoaSAlIDIpID8gMjcwMDAwIDogMTYyMDAwOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBkcF9tb2RlX3ZhbGlkKHU4IGRwY2RbRFBfRFBDRF9TSVpFXSwgaW50IG1vZGVfY2xvY2spCit7CisJaW50IGxhbmVzID0gZHBfbGFuZXNfZm9yX21vZGVfY2xvY2soZHBjZCwgbW9kZV9jbG9jayk7CisJaW50IGJ3ID0gZHBfbGFuZXNfZm9yX21vZGVfY2xvY2soZHBjZCwgbW9kZV9jbG9jayk7CisKKwlpZiAoKGxhbmVzID09IDApIHx8IChidyA9PSAwKSkKKwkJcmV0dXJuIE1PREVfQ0xPQ0tfSElHSDsKKworCXJldHVybiBNT0RFX09LOworfQorCitzdGF0aWMgdTggZHBfbGlua19zdGF0dXModTggbGlua19zdGF0dXNbRFBfTElOS19TVEFUVVNfU0laRV0sIGludCByKQoreworCXJldHVybiBsaW5rX3N0YXR1c1tyIC0gRFBfTEFORTBfMV9TVEFUVVNdOworfQorCitzdGF0aWMgdTggZHBfZ2V0X2xhbmVfc3RhdHVzKHU4IGxpbmtfc3RhdHVzW0RQX0xJTktfU1RBVFVTX1NJWkVdLAorCQkJICAgICBpbnQgbGFuZSkKK3sKKwlpbnQgaSA9IERQX0xBTkUwXzFfU1RBVFVTICsgKGxhbmUgPj4gMSk7CisJaW50IHMgPSAobGFuZSAmIDEpICogNDsKKwl1OCBsID0gZHBfbGlua19zdGF0dXMobGlua19zdGF0dXMsIGkpOworCXJldHVybiAobCA+PiBzKSAmIDB4ZjsKK30KKworc3RhdGljIGJvb2wgZHBfY2xvY2tfcmVjb3Zlcnlfb2sodTggbGlua19zdGF0dXNbRFBfTElOS19TVEFUVVNfU0laRV0sCisJCQkJIGludCBsYW5lX2NvdW50KQoreworCWludCBsYW5lOworCXU4IGxhbmVfc3RhdHVzOworCisJZm9yIChsYW5lID0gMDsgbGFuZSA8IGxhbmVfY291bnQ7IGxhbmUrKykgeworCQlsYW5lX3N0YXR1cyA9IGRwX2dldF9sYW5lX3N0YXR1cyhsaW5rX3N0YXR1cywgbGFuZSk7CisJCWlmICgobGFuZV9zdGF0dXMgJiBEUF9MQU5FX0NSX0RPTkUpID09IDApCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBkcF9jaGFubmVsX2VxX29rKHU4IGxpbmtfc3RhdHVzW0RQX0xJTktfU1RBVFVTX1NJWkVdLAorCQkJICAgICBpbnQgbGFuZV9jb3VudCkKK3sKKwl1OCBsYW5lX2FsaWduOworCXU4IGxhbmVfc3RhdHVzOworCWludCBsYW5lOworCisJbGFuZV9hbGlnbiA9IGRwX2xpbmtfc3RhdHVzKGxpbmtfc3RhdHVzLAorCQkJCSAgICBEUF9MQU5FX0FMSUdOX1NUQVRVU19VUERBVEVEKTsKKwlpZiAoKGxhbmVfYWxpZ24gJiBEUF9JTlRFUkxBTkVfQUxJR05fRE9ORSkgPT0gMCkKKwkJcmV0dXJuIGZhbHNlOworCWZvciAobGFuZSA9IDA7IGxhbmUgPCBsYW5lX2NvdW50OyBsYW5lKyspIHsKKwkJbGFuZV9zdGF0dXMgPSBkcF9nZXRfbGFuZV9zdGF0dXMobGlua19zdGF0dXMsIGxhbmUpOworCQlpZiAoKGxhbmVfc3RhdHVzICYgRFBfQ0hBTk5FTF9FUV9CSVRTKSAhPSBEUF9DSEFOTkVMX0VRX0JJVFMpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdTggZHBfZ2V0X2FkanVzdF9yZXF1ZXN0X3ZvbHRhZ2UodWludDhfdCBsaW5rX3N0YXR1c1tEUF9MSU5LX1NUQVRVU19TSVpFXSwKKwkJCQkJaW50IGxhbmUpCisKK3sKKwlpbnQgaSA9IERQX0FESlVTVF9SRVFVRVNUX0xBTkUwXzEgKyAobGFuZSA+PiAxKTsKKwlpbnQgcyA9ICgobGFuZSAmIDEpID8KKwkJIERQX0FESlVTVF9WT0xUQUdFX1NXSU5HX0xBTkUxX1NISUZUIDoKKwkJIERQX0FESlVTVF9WT0xUQUdFX1NXSU5HX0xBTkUwX1NISUZUKTsKKwl1OCBsID0gZHBfbGlua19zdGF0dXMobGlua19zdGF0dXMsIGkpOworCisJcmV0dXJuICgobCA+PiBzKSAmIDB4MykgPDwgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR19TSElGVDsKK30KKworc3RhdGljIHU4IGRwX2dldF9hZGp1c3RfcmVxdWVzdF9wcmVfZW1waGFzaXModWludDhfdCBsaW5rX3N0YXR1c1tEUF9MSU5LX1NUQVRVU19TSVpFXSwKKwkJCQkJICAgICBpbnQgbGFuZSkKK3sKKwlpbnQgaSA9IERQX0FESlVTVF9SRVFVRVNUX0xBTkUwXzEgKyAobGFuZSA+PiAxKTsKKwlpbnQgcyA9ICgobGFuZSAmIDEpID8KKwkJIERQX0FESlVTVF9QUkVfRU1QSEFTSVNfTEFORTFfU0hJRlQgOgorCQkgRFBfQURKVVNUX1BSRV9FTVBIQVNJU19MQU5FMF9TSElGVCk7CisJdTggbCA9IGRwX2xpbmtfc3RhdHVzKGxpbmtfc3RhdHVzLCBpKTsKKworCXJldHVybiAoKGwgPj4gcykgJiAweDMpIDw8IERQX1RSQUlOX1BSRV9FTVBIQVNJU19TSElGVDsKK30KKworLyogWFhYIGZpeCBtZSAtLSBjaGlwIHNwZWNpZmljICovCisjZGVmaW5lIERQX1ZPTFRBR0VfTUFYICAgICAgICAgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR18xMjAwCitzdGF0aWMgdTggZHBfcHJlX2VtcGhhc2lzX21heCh1OCB2b2x0YWdlX3N3aW5nKQoreworCXN3aXRjaCAodm9sdGFnZV9zd2luZyAmIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfTUFTSykgeworCWNhc2UgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR180MDA6CisJCXJldHVybiBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfNjsKKwljYXNlIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfNjAwOgorCQlyZXR1cm4gRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzY7CisJY2FzZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzgwMDoKKwkJcmV0dXJuIERQX1RSQUlOX1BSRV9FTVBIQVNJU18zXzU7CisJY2FzZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzEyMDA6CisJZGVmYXVsdDoKKwkJcmV0dXJuIERQX1RSQUlOX1BSRV9FTVBIQVNJU18wOworCX0KK30KKworc3RhdGljIHZvaWQgZHBfZ2V0X2FkanVzdF90cmFpbih1OCBsaW5rX3N0YXR1c1tEUF9MSU5LX1NUQVRVU19TSVpFXSwKKwkJCQlpbnQgbGFuZV9jb3VudCwKKwkJCQl1OCB0cmFpbl9zZXRbNF0pCit7CisJdTggdiA9IDA7CisJdTggcCA9IDA7CisJaW50IGxhbmU7CisKKwlmb3IgKGxhbmUgPSAwOyBsYW5lIDwgbGFuZV9jb3VudDsgbGFuZSsrKSB7CisJCXU4IHRoaXNfdiA9IGRwX2dldF9hZGp1c3RfcmVxdWVzdF92b2x0YWdlKGxpbmtfc3RhdHVzLCBsYW5lKTsKKwkJdTggdGhpc19wID0gZHBfZ2V0X2FkanVzdF9yZXF1ZXN0X3ByZV9lbXBoYXNpcyhsaW5rX3N0YXR1cywgbGFuZSk7CisKKwkJRFJNX0RFQlVHKCJyZXF1ZXN0ZWQgc2lnbmFsIHBhcmFtZXRlcnM6IGxhbmUgJWQgdm9sdGFnZSAlcyBwcmVfZW1waCAlc1xuIiwKKwkJCSAgbGFuZSwKKwkJCSAgdm9sdGFnZV9uYW1lc1t0aGlzX3YgPj4gRFBfVFJBSU5fVk9MVEFHRV9TV0lOR19TSElGVF0sCisJCQkgIHByZV9lbXBoX25hbWVzW3RoaXNfcCA+PiBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfU0hJRlRdKTsKKworCQlpZiAodGhpc192ID4gdikKKwkJCXYgPSB0aGlzX3Y7CisJCWlmICh0aGlzX3AgPiBwKQorCQkJcCA9IHRoaXNfcDsKKwl9CisKKwlpZiAodiA+PSBEUF9WT0xUQUdFX01BWCkKKwkJdiA9IERQX1ZPTFRBR0VfTUFYIHwgRFBfVFJBSU5fTUFYX1NXSU5HX1JFQUNIRUQ7CisKKwlpZiAocCA+PSBkcF9wcmVfZW1waGFzaXNfbWF4KHYpKQorCQlwID0gZHBfcHJlX2VtcGhhc2lzX21heCh2KSB8IERQX1RSQUlOX01BWF9QUkVfRU1QSEFTSVNfUkVBQ0hFRDsKKworCURSTV9ERUJVRygidXNpbmcgc2lnbmFsIHBhcmFtZXRlcnM6IHZvbHRhZ2UgJXMgcHJlX2VtcGggJXNcbiIsCisJCSAgdm9sdGFnZV9uYW1lc1sodiAmIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfTUFTSykgPj4gRFBfVFJBSU5fVk9MVEFHRV9TV0lOR19TSElGVF0sCisJCSAgcHJlX2VtcGhfbmFtZXNbKHAgJiBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfTUFTSykgPj4gRFBfVFJBSU5fUFJFX0VNUEhBU0lTX1NISUZUXSk7CisKKwlmb3IgKGxhbmUgPSAwOyBsYW5lIDwgNDsgbGFuZSsrKQorCQl0cmFpbl9zZXRbbGFuZV0gPSB2IHwgcDsKK30KKworCisvKiByYWRlb24gYXV4IGNoYW4gZnVuY3Rpb25zICovCitib29sIHJhZGVvbl9wcm9jZXNzX2F1eF9jaChzdHJ1Y3QgcmFkZW9uX2kyY19jaGFuICpjaGFuLCB1OCAqcmVxX2J5dGVzLAorCQkJICAgaW50IG51bV9ieXRlcywgdTggKnJlYWRfYnl0ZSwKKwkJCSAgIHU4IHJlYWRfYnVmX2xlbiwgdTggZGVsYXkpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJUFJPQ0VTU19BVVhfQ0hBTk5FTF9UUkFOU0FDVElPTl9QU19BTExPQ0FUSU9OIGFyZ3M7CisJaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgUHJvY2Vzc0F1eENoYW5uZWxUcmFuc2FjdGlvbik7CisJdW5zaWduZWQgY2hhciAqYmFzZTsKKworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKworCWJhc2UgPSAodW5zaWduZWQgY2hhciAqKXJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQtPnNjcmF0Y2g7CisKKwltZW1jcHkoYmFzZSwgcmVxX2J5dGVzLCBudW1fYnl0ZXMpOworCisJYXJncy5scEF1eFJlcXVlc3QgPSAwOworCWFyZ3MubHBEYXRhT3V0ID0gMTY7CisJYXJncy51Y0RhdGFPdXRMZW4gPSAwOworCWFyZ3MudWNDaGFubmVsSUQgPSBjaGFuLT5yZWMuaTJjX2lkOworCWFyZ3MudWNEZWxheSA9IGRlbGF5IC8gMTA7CisKKwlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKKworCWlmIChhcmdzLnVjUmVwbHlTdGF0dXMpIHsKKwkJRFJNX0RFQlVHKCJmYWlsZWQgdG8gZ2V0IGF1eGNoICUwMnglMDJ4ICUwMnggJTAyeCAweCUwMnggJTAyeFxuIiwKKwkJCSAgcmVxX2J5dGVzWzFdLCByZXFfYnl0ZXNbMF0sIHJlcV9ieXRlc1syXSwgcmVxX2J5dGVzWzNdLAorCQkJICBjaGFuLT5yZWMuaTJjX2lkLCBhcmdzLnVjUmVwbHlTdGF0dXMpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKGFyZ3MudWNEYXRhT3V0TGVuICYmIHJlYWRfYnl0ZSAmJiByZWFkX2J1Zl9sZW4pIHsKKwkJaWYgKHJlYWRfYnVmX2xlbiA8IGFyZ3MudWNEYXRhT3V0TGVuKSB7CisJCQlEUk1fRVJST1IoIkJ1ZmZlciB0byBzbWFsbCBmb3IgcmV0dXJuIGFuc3dlciAlZCAlZFxuIiwKKwkJCQkgIHJlYWRfYnVmX2xlbiwgYXJncy51Y0RhdGFPdXRMZW4pOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXsKKwkJCWludCBsZW4gPSBtaW4ocmVhZF9idWZfbGVuLCBhcmdzLnVjRGF0YU91dExlbik7CisJCQltZW1jcHkocmVhZF9ieXRlLCBiYXNlICsgMTYsIGxlbik7CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgcmFkZW9uX2RwX2F1eF9uYXRpdmVfd3JpdGUoc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IsIHVpbnQxNl90IGFkZHJlc3MsCisJCQkJdWludDhfdCBzZW5kX2J5dGVzLCB1aW50OF90ICpzZW5kKQoreworCXN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnICpkaWdfY29ubmVjdG9yID0gcmFkZW9uX2Nvbm5lY3Rvci0+Y29uX3ByaXY7CisJdTggbXNnWzIwXTsKKwl1OCBtc2dfbGVuLCBkcF9tc2dfbGVuOworCWJvb2wgcmV0OworCisJZHBfbXNnX2xlbiA9IDQ7CisJbXNnWzBdID0gYWRkcmVzczsKKwltc2dbMV0gPSBhZGRyZXNzID4+IDg7CisJbXNnWzJdID0gQVVYX05BVElWRV9XUklURSA8PCA0OworCWRwX21zZ19sZW4gKz0gc2VuZF9ieXRlczsKKwltc2dbM10gPSAoZHBfbXNnX2xlbiA8PCA0KSB8IChzZW5kX2J5dGVzIC0gMSk7CisKKwlpZiAoc2VuZF9ieXRlcyA+IDE2KQorCQlyZXR1cm4gZmFsc2U7CisKKwltZW1jcHkoJm1zZ1s0XSwgc2VuZCwgc2VuZF9ieXRlcyk7CisJbXNnX2xlbiA9IDQgKyBzZW5kX2J5dGVzOworCXJldCA9IHJhZGVvbl9wcm9jZXNzX2F1eF9jaChkaWdfY29ubmVjdG9yLT5kcF9pMmNfYnVzLCBtc2csIG1zZ19sZW4sIE5VTEwsIDAsIDApOworCXJldHVybiByZXQ7Cit9CisKK2Jvb2wgcmFkZW9uX2RwX2F1eF9uYXRpdmVfcmVhZChzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciwgdWludDE2X3QgYWRkcmVzcywKKwkJCSAgICAgICB1aW50OF90IGRlbGF5LCB1aW50OF90IGV4cGVjdGVkX2J5dGVzLAorCQkJICAgICAgIHVpbnQ4X3QgKnJlYWRfcCkKK3sKKwlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqZGlnX2Nvbm5lY3RvciA9IHJhZGVvbl9jb25uZWN0b3ItPmNvbl9wcml2OworCXU4IG1zZ1syMF07CisJdTggbXNnX2xlbiwgZHBfbXNnX2xlbjsKKwlib29sIHJldCA9IGZhbHNlOworCW1zZ19sZW4gPSA0OworCWRwX21zZ19sZW4gPSA0OworCW1zZ1swXSA9IGFkZHJlc3M7CisJbXNnWzFdID0gYWRkcmVzcyA+PiA4OworCW1zZ1syXSA9IEFVWF9OQVRJVkVfUkVBRCA8PCA0OworCW1zZ1szXSA9IChkcF9tc2dfbGVuKSA8PCA0OworCW1zZ1szXSB8PSBleHBlY3RlZF9ieXRlcyAtIDE7CisKKwlyZXQgPSByYWRlb25fcHJvY2Vzc19hdXhfY2goZGlnX2Nvbm5lY3Rvci0+ZHBfaTJjX2J1cywgbXNnLCBtc2dfbGVuLCByZWFkX3AsIGV4cGVjdGVkX2J5dGVzLCBkZWxheSk7CisJcmV0dXJuIHJldDsKK30KKworLyogcmFkZW9uIGRwIGZ1bmN0aW9ucyAqLworc3RhdGljIHU4IHJhZGVvbl9kcF9lbmNvZGVyX3NlcnZpY2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBhY3Rpb24sIGludCBkcF9jbG9jaywKKwkJCQkgICAgdWludDhfdCB1Y2NvbmZpZywgdWludDhfdCBsYW5lX251bSkKK3sKKwlEUF9FTkNPREVSX1NFUlZJQ0VfUEFSQU1FVEVSUyBhcmdzOworCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERQRW5jb2RlclNlcnZpY2UpOworCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCWFyZ3MudWNMaW5rQ2xvY2sgPSBkcF9jbG9jayAvIDEwOworCWFyZ3MudWNDb25maWcgPSB1Y2NvbmZpZzsKKwlhcmdzLnVjQWN0aW9uID0gYWN0aW9uOworCWFyZ3MudWNMYW5lTnVtID0gbGFuZV9udW07CisJYXJncy51Y1N0YXR1cyA9IDA7CisKKwlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKKwlyZXR1cm4gYXJncy51Y1N0YXR1czsKK30KKwordTggcmFkZW9uX2RwX2dldHNpbmt0eXBlKHN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yKQoreworCXN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnICpkaWdfY29ubmVjdG9yID0gcmFkZW9uX2Nvbm5lY3Rvci0+Y29uX3ByaXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJhZGVvbl9jb25uZWN0b3ItPmJhc2UuZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCXJldHVybiByYWRlb25fZHBfZW5jb2Rlcl9zZXJ2aWNlKHJkZXYsIEFUT01fRFBfQUNUSU9OX0dFVF9TSU5LX1RZUEUsIDAsCisJCQkJCSBkaWdfY29ubmVjdG9yLT5kcF9pMmNfYnVzLT5yZWMuaTJjX2lkLCAwKTsKK30KKworYm9vbCByYWRlb25fZHBfZ2V0ZHBjZChzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqZGlnX2Nvbm5lY3RvciA9IHJhZGVvbl9jb25uZWN0b3ItPmNvbl9wcml2OworCXU4IG1zZ1syNV07CisJaW50IHJldDsKKworCXJldCA9IHJhZGVvbl9kcF9hdXhfbmF0aXZlX3JlYWQocmFkZW9uX2Nvbm5lY3RvciwgRFBfRFBDRF9SRVYsIDAsIDgsIG1zZyk7CisJaWYgKHJldCkgeworCQltZW1jcHkoZGlnX2Nvbm5lY3Rvci0+ZHBjZCwgbXNnLCA4KTsKKwkJeworCQkJaW50IGk7CisJCQlEUk1fREVCVUcoIkRQQ0Q6ICIpOworCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCQlEUk1fREVCVUcoIiUwMnggIiwgbXNnW2ldKTsKKwkJCURSTV9ERUJVRygiXG4iKTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJZGlnX2Nvbm5lY3Rvci0+ZHBjZFswXSA9IDA7CisJcmV0dXJuIGZhbHNlOworfQorCit2b2lkIHJhZGVvbl9kcF9zZXRfbGlua19jb25maWcoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvcjsKKwlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqZGlnX2Nvbm5lY3RvcjsKKworCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlICE9IERSTV9NT0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9ydCkKKwkJcmV0dXJuOworCisJcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwlpZiAoIXJhZGVvbl9jb25uZWN0b3ItPmNvbl9wcml2KQorCQlyZXR1cm47CisJZGlnX2Nvbm5lY3RvciA9IHJhZGVvbl9jb25uZWN0b3ItPmNvbl9wcml2OworCisJZGlnX2Nvbm5lY3Rvci0+ZHBfY2xvY2sgPQorCQlkcF9saW5rX2Nsb2NrX2Zvcl9tb2RlX2Nsb2NrKGRpZ19jb25uZWN0b3ItPmRwY2QsIG1vZGUtPmNsb2NrKTsKKwlkaWdfY29ubmVjdG9yLT5kcF9sYW5lX2NvdW50ID0KKwkJZHBfbGFuZXNfZm9yX21vZGVfY2xvY2soZGlnX2Nvbm5lY3Rvci0+ZHBjZCwgbW9kZS0+Y2xvY2spOworfQorCitpbnQgcmFkZW9uX2RwX21vZGVfdmFsaWRfaGVscGVyKHN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yLAorCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnICpkaWdfY29ubmVjdG9yID0gcmFkZW9uX2Nvbm5lY3Rvci0+Y29uX3ByaXY7CisKKwlyZXR1cm4gZHBfbW9kZV92YWxpZChkaWdfY29ubmVjdG9yLT5kcGNkLCBtb2RlLT5jbG9jayk7Cit9CisKK3N0YXRpYyBib29sIGF0b21fZHBfZ2V0X2xpbmtfc3RhdHVzKHN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yLAorCQkJCSAgICB1OCBsaW5rX3N0YXR1c1tEUF9MSU5LX1NUQVRVU19TSVpFXSkKK3sKKwlpbnQgcmV0OworCXJldCA9IHJhZGVvbl9kcF9hdXhfbmF0aXZlX3JlYWQocmFkZW9uX2Nvbm5lY3RvciwgRFBfTEFORTBfMV9TVEFUVVMsIDEwMCwKKwkJCQkJRFBfTElOS19TVEFUVVNfU0laRSwgbGlua19zdGF0dXMpOworCWlmICghcmV0KSB7CisJCURSTV9FUlJPUigiZGlzcGxheXBvcnQgbGluayBzdGF0dXMgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCURSTV9ERUJVRygibGluayBzdGF0dXMgJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCSAgbGlua19zdGF0dXNbMF0sIGxpbmtfc3RhdHVzWzFdLCBsaW5rX3N0YXR1c1syXSwKKwkJICBsaW5rX3N0YXR1c1szXSwgbGlua19zdGF0dXNbNF0sIGxpbmtfc3RhdHVzWzVdKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCByYWRlb25fZHBfbmVlZHNfbGlua190cmFpbihzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqZGlnX2Nvbm5lY3RvciA9IHJhZGVvbl9jb25uZWN0b3ItPmNvbl9wcml2OworCXU4IGxpbmtfc3RhdHVzW0RQX0xJTktfU1RBVFVTX1NJWkVdOworCisJaWYgKCFhdG9tX2RwX2dldF9saW5rX3N0YXR1cyhyYWRlb25fY29ubmVjdG9yLCBsaW5rX3N0YXR1cykpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoZHBfY2hhbm5lbF9lcV9vayhsaW5rX3N0YXR1cywgZGlnX2Nvbm5lY3Rvci0+ZHBfbGFuZV9jb3VudCkpCisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgZHBfc2V0X3Bvd2VyKHN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yLCB1OCBwb3dlcl9zdGF0ZSkKK3sKKwlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqZGlnX2Nvbm5lY3RvciA9IHJhZGVvbl9jb25uZWN0b3ItPmNvbl9wcml2OworCisJaWYgKGRpZ19jb25uZWN0b3ItPmRwY2RbMF0gPj0gMHgxMSkgeworCQlyYWRlb25fZHBfYXV4X25hdGl2ZV93cml0ZShyYWRlb25fY29ubmVjdG9yLCBEUF9TRVRfUE9XRVIsIDEsCisJCQkJCSAgICZwb3dlcl9zdGF0ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkcF9zZXRfZG93bnNwcmVhZChzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciwgdTggZG93bnNwcmVhZCkKK3sKKwlyYWRlb25fZHBfYXV4X25hdGl2ZV93cml0ZShyYWRlb25fY29ubmVjdG9yLCBEUF9ET1dOU1BSRUFEX0NUUkwsIDEsCisJCQkJICAgJmRvd25zcHJlYWQpOworfQorCitzdGF0aWMgdm9pZCBkcF9zZXRfbGlua19id19sYW5lcyhzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciwKKwkJCQkgdTggbGlua19jb25maWd1cmF0aW9uW0RQX0xJTktfQ09ORklHVVJBVElPTl9TSVpFXSkKK3sKKwlyYWRlb25fZHBfYXV4X25hdGl2ZV93cml0ZShyYWRlb25fY29ubmVjdG9yLCBEUF9MSU5LX0JXX1NFVCwgMiwKKwkJCQkgICBsaW5rX2NvbmZpZ3VyYXRpb24pOworfQorCitzdGF0aWMgdm9pZCBkcF91cGRhdGVfZHB2c19lbXBoKHN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yLAorCQkJCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQl1OCB0cmFpbl9zZXRbNF0pCit7CisJc3RydWN0IHJhZGVvbl9jb25uZWN0b3JfYXRvbV9kaWcgKmRpZ19jb25uZWN0b3IgPSByYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBkaWdfY29ubmVjdG9yLT5kcF9sYW5lX2NvdW50OyBpKyspCisJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLAorCQkJCQkgICAgICAgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fU0VUVVBfVlNFTVBILAorCQkJCQkgICAgICAgaSwgdHJhaW5fc2V0W2ldKTsKKworCXJhZGVvbl9kcF9hdXhfbmF0aXZlX3dyaXRlKHJhZGVvbl9jb25uZWN0b3IsIERQX1RSQUlOSU5HX0xBTkUwX1NFVCwKKwkJCQkgICBkaWdfY29ubmVjdG9yLT5kcF9sYW5lX2NvdW50LCB0cmFpbl9zZXQpOworfQorCitzdGF0aWMgdm9pZCBkcF9zZXRfdHJhaW5pbmcoc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IsCisJCQkgICAgdTggdHJhaW5pbmcpCit7CisJcmFkZW9uX2RwX2F1eF9uYXRpdmVfd3JpdGUocmFkZW9uX2Nvbm5lY3RvciwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCisJCQkJICAgMSwgJnRyYWluaW5nKTsKK30KKwordm9pZCBkcF9saW5rX3RyYWluKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJICAgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICpkaWc7CisJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3I7CisJc3RydWN0IHJhZGVvbl9jb25uZWN0b3JfYXRvbV9kaWcgKmRpZ19jb25uZWN0b3I7CisJaW50IGVuY19pZCA9IDA7CisJYm9vbCBjbG9ja19yZWNvdmVyeSwgY2hhbm5lbF9lcTsKKwl1OCBsaW5rX3N0YXR1c1tEUF9MSU5LX1NUQVRVU19TSVpFXTsKKwl1OCBsaW5rX2NvbmZpZ3VyYXRpb25bRFBfTElOS19DT05GSUdVUkFUSU9OX1NJWkVdOworCXU4IHRyaWVzLCB2b2x0YWdlOworCXU4IHRyYWluX3NldFs0XTsKKwlpbnQgaTsKKworCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlICE9IERSTV9NT0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9ydCkKKwkJcmV0dXJuOworCisJaWYgKCFyYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXYpCisJCXJldHVybjsKKwlkaWcgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7CisKKwlyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCWlmICghcmFkZW9uX2Nvbm5lY3Rvci0+Y29uX3ByaXYpCisJCXJldHVybjsKKwlkaWdfY29ubmVjdG9yID0gcmFkZW9uX2Nvbm5lY3Rvci0+Y29uX3ByaXY7CisKKwlpZiAoQVNJQ19JU19EQ0UzMihyZGV2KSkgeworCQlpZiAoZGlnLT5kaWdfYmxvY2spCisJCQllbmNfaWQgfD0gQVRPTV9EUF9DT05GSUdfRElHMl9FTkNPREVSOworCQllbHNlCisJCQllbmNfaWQgfD0gQVRPTV9EUF9DT05GSUdfRElHMV9FTkNPREVSOworCQlpZiAoZGlnX2Nvbm5lY3Rvci0+bGlua2IpCisJCQllbmNfaWQgfD0gQVRPTV9EUF9DT05GSUdfTElOS19COworCQllbHNlCisJCQllbmNfaWQgfD0gQVRPTV9EUF9DT05GSUdfTElOS19BOworCX0gZWxzZSB7CisJCWlmIChkaWdfY29ubmVjdG9yLT5saW5rYikKKwkJCWVuY19pZCB8PSBBVE9NX0RQX0NPTkZJR19ESUcyX0VOQ09ERVIgfCBBVE9NX0RQX0NPTkZJR19MSU5LX0I7CisJCWVsc2UKKwkJCWVuY19pZCB8PSBBVE9NX0RQX0NPTkZJR19ESUcxX0VOQ09ERVIgfCBBVE9NX0RQX0NPTkZJR19MSU5LX0E7CisJfQorCisJbWVtc2V0KGxpbmtfY29uZmlndXJhdGlvbiwgMCwgRFBfTElOS19DT05GSUdVUkFUSU9OX1NJWkUpOworCWlmIChkaWdfY29ubmVjdG9yLT5kcF9jbG9jayA9PSAyNzAwMDApCisJCWxpbmtfY29uZmlndXJhdGlvblswXSA9IERQX0xJTktfQldfMl83OworCWVsc2UKKwkJbGlua19jb25maWd1cmF0aW9uWzBdID0gRFBfTElOS19CV18xXzYyOworCWxpbmtfY29uZmlndXJhdGlvblsxXSA9IGRpZ19jb25uZWN0b3ItPmRwX2xhbmVfY291bnQ7CisJaWYgKGRpZ19jb25uZWN0b3ItPmRwY2RbMF0gPj0gMHgxMSkKKwkJbGlua19jb25maWd1cmF0aW9uWzFdIHw9IERQX0xBTkVfQ09VTlRfRU5IQU5DRURfRlJBTUVfRU47CisKKwkvKiBwb3dlciB1cCB0aGUgc2luayAqLworCWRwX3NldF9wb3dlcihyYWRlb25fY29ubmVjdG9yLCBEUF9TRVRfUE9XRVJfRDApOworCS8qIGRpc2FibGUgdGhlIHRyYWluaW5nIHBhdHRlcm4gb24gdGhlIHNpbmsgKi8KKwlkcF9zZXRfdHJhaW5pbmcocmFkZW9uX2Nvbm5lY3RvciwgRFBfVFJBSU5JTkdfUEFUVEVSTl9ESVNBQkxFKTsKKwkvKiBzZXQgbGluayBidyBhbmQgbGFuZXMgb24gdGhlIHNpbmsgKi8KKwlkcF9zZXRfbGlua19id19sYW5lcyhyYWRlb25fY29ubmVjdG9yLCBsaW5rX2NvbmZpZ3VyYXRpb24pOworCS8qIGRpc2FibGUgZG93bnNwcmVhZCBvbiB0aGUgc2luayAqLworCWRwX3NldF9kb3duc3ByZWFkKHJhZGVvbl9jb25uZWN0b3IsIDApOworCS8qIHN0YXJ0IHRyYWluaW5nIG9uIHRoZSBzb3VyY2UgKi8KKwlyYWRlb25fZHBfZW5jb2Rlcl9zZXJ2aWNlKHJkZXYsIEFUT01fRFBfQUNUSU9OX1RSQUlOSU5HX1NUQVJULAorCQkJCSAgZGlnX2Nvbm5lY3Rvci0+ZHBfY2xvY2ssIGVuY19pZCwgMCk7CisJLyogc2V0IHRyYWluaW5nIHBhdHRlcm4gMSBvbiB0aGUgc291cmNlICovCisJcmFkZW9uX2RwX2VuY29kZXJfc2VydmljZShyZGV2LCBBVE9NX0RQX0FDVElPTl9UUkFJTklOR19QQVRURVJOX1NFTCwKKwkJCQkgIGRpZ19jb25uZWN0b3ItPmRwX2Nsb2NrLCBlbmNfaWQsIDApOworCisJLyogc2V0IGluaXRpYWwgdnMvZW1waCAqLworCW1lbXNldCh0cmFpbl9zZXQsIDAsIDQpOworCXVkZWxheSg0MDApOworCS8qIHNldCB0cmFpbmluZyBwYXR0ZXJuIDEgb24gdGhlIHNpbmsgKi8KKwlkcF9zZXRfdHJhaW5pbmcocmFkZW9uX2Nvbm5lY3RvciwgRFBfVFJBSU5JTkdfUEFUVEVSTl8xKTsKKworCWRwX3VwZGF0ZV9kcHZzX2VtcGgocmFkZW9uX2Nvbm5lY3RvciwgZW5jb2RlciwgdHJhaW5fc2V0KTsKKworCS8qIGNsb2NrIHJlY292ZXJ5IGxvb3AgKi8KKwljbG9ja19yZWNvdmVyeSA9IGZhbHNlOworCXRyaWVzID0gMDsKKwl2b2x0YWdlID0gMHhmZjsKKwlmb3IgKDs7KSB7CisJCXVkZWxheSgxMDApOworCQlpZiAoIWF0b21fZHBfZ2V0X2xpbmtfc3RhdHVzKHJhZGVvbl9jb25uZWN0b3IsIGxpbmtfc3RhdHVzKSkKKwkJCWJyZWFrOworCisJCWlmIChkcF9jbG9ja19yZWNvdmVyeV9vayhsaW5rX3N0YXR1cywgZGlnX2Nvbm5lY3Rvci0+ZHBfbGFuZV9jb3VudCkpIHsKKwkJCWNsb2NrX3JlY292ZXJ5ID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IGRpZ19jb25uZWN0b3ItPmRwX2xhbmVfY291bnQ7IGkrKykgeworCQkJaWYgKCh0cmFpbl9zZXRbaV0gJiBEUF9UUkFJTl9NQVhfU1dJTkdfUkVBQ0hFRCkgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSBkaWdfY29ubmVjdG9yLT5kcF9sYW5lX2NvdW50KSB7CisJCQlEUk1fRVJST1IoImNsb2NrIHJlY292ZXJ5IHJlYWNoZWQgbWF4IHZvbHRhZ2VcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKHRyYWluX3NldFswXSAmIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfTUFTSykgPT0gdm9sdGFnZSkgeworCQkJKyt0cmllczsKKwkJCWlmICh0cmllcyA9PSA1KSB7CisJCQkJRFJNX0VSUk9SKCJjbG9jayByZWNvdmVyeSB0cmllZCA1IHRpbWVzXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlCisJCQl0cmllcyA9IDA7CisKKwkJdm9sdGFnZSA9IHRyYWluX3NldFswXSAmIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfTUFTSzsKKworCQkvKiBDb21wdXRlIG5ldyB0cmFpbl9zZXQgYXMgcmVxdWVzdGVkIGJ5IHNpbmsgKi8KKwkJZHBfZ2V0X2FkanVzdF90cmFpbihsaW5rX3N0YXR1cywgZGlnX2Nvbm5lY3Rvci0+ZHBfbGFuZV9jb3VudCwgdHJhaW5fc2V0KTsKKwkJZHBfdXBkYXRlX2RwdnNfZW1waChyYWRlb25fY29ubmVjdG9yLCBlbmNvZGVyLCB0cmFpbl9zZXQpOworCX0KKwlpZiAoIWNsb2NrX3JlY292ZXJ5KQorCQlEUk1fRVJST1IoImNsb2NrIHJlY292ZXJ5IGZhaWxlZFxuIik7CisJZWxzZQorCQlEUk1fREVCVUcoImNsb2NrIHJlY292ZXJ5IGF0IHZvbHRhZ2UgJWQgcHJlLWVtcGhhc2lzICVkXG4iLAorCQkJICB0cmFpbl9zZXRbMF0gJiBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX01BU0ssCisJCQkgICh0cmFpbl9zZXRbMF0gJiBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfTUFTSykgPj4KKwkJCSAgRFBfVFJBSU5fUFJFX0VNUEhBU0lTX1NISUZUKTsKKworCisJLyogc2V0IHRyYWluaW5nIHBhdHRlcm4gMiBvbiB0aGUgc2luayAqLworCWRwX3NldF90cmFpbmluZyhyYWRlb25fY29ubmVjdG9yLCBEUF9UUkFJTklOR19QQVRURVJOXzIpOworCS8qIHNldCB0cmFpbmluZyBwYXR0ZXJuIDIgb24gdGhlIHNvdXJjZSAqLworCXJhZGVvbl9kcF9lbmNvZGVyX3NlcnZpY2UocmRldiwgQVRPTV9EUF9BQ1RJT05fVFJBSU5JTkdfUEFUVEVSTl9TRUwsCisJCQkJICBkaWdfY29ubmVjdG9yLT5kcF9jbG9jaywgZW5jX2lkLCAxKTsKKworCS8qIGNoYW5uZWwgZXF1YWxpemF0aW9uIGxvb3AgKi8KKwl0cmllcyA9IDA7CisJY2hhbm5lbF9lcSA9IGZhbHNlOworCWZvciAoOzspIHsKKwkJdWRlbGF5KDQwMCk7CisJCWlmICghYXRvbV9kcF9nZXRfbGlua19zdGF0dXMocmFkZW9uX2Nvbm5lY3RvciwgbGlua19zdGF0dXMpKQorCQkJYnJlYWs7CisKKwkJaWYgKGRwX2NoYW5uZWxfZXFfb2sobGlua19zdGF0dXMsIGRpZ19jb25uZWN0b3ItPmRwX2xhbmVfY291bnQpKSB7CisJCQljaGFubmVsX2VxID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogVHJ5IDUgdGltZXMgKi8KKwkJaWYgKHRyaWVzID4gNSkgeworCQkJRFJNX0VSUk9SKCJjaGFubmVsIGVxIGZhaWxlZDogNSB0cmllc1xuIik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIENvbXB1dGUgbmV3IHRyYWluX3NldCBhcyByZXF1ZXN0ZWQgYnkgc2luayAqLworCQlkcF9nZXRfYWRqdXN0X3RyYWluKGxpbmtfc3RhdHVzLCBkaWdfY29ubmVjdG9yLT5kcF9sYW5lX2NvdW50LCB0cmFpbl9zZXQpOworCQlkcF91cGRhdGVfZHB2c19lbXBoKHJhZGVvbl9jb25uZWN0b3IsIGVuY29kZXIsIHRyYWluX3NldCk7CisKKwkJdHJpZXMrKzsKKwl9CisKKwlpZiAoIWNoYW5uZWxfZXEpCisJCURSTV9FUlJPUigiY2hhbm5lbCBlcSBmYWlsZWRcbiIpOworCWVsc2UKKwkJRFJNX0RFQlVHKCJjaGFubmVsIGVxIGF0IHZvbHRhZ2UgJWQgcHJlLWVtcGhhc2lzICVkXG4iLAorCQkJICB0cmFpbl9zZXRbMF0gJiBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX01BU0ssCisJCQkgICh0cmFpbl9zZXRbMF0gJiBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfTUFTSykKKwkJCSAgPj4gRFBfVFJBSU5fUFJFX0VNUEhBU0lTX1NISUZUKTsKKworCS8qIGRpc2FibGUgdGhlIHRyYWluaW5nIHBhdHRlcm4gb24gdGhlIHNpbmsgKi8KKwlkcF9zZXRfdHJhaW5pbmcocmFkZW9uX2Nvbm5lY3RvciwgRFBfVFJBSU5JTkdfUEFUVEVSTl9ESVNBQkxFKTsKKworCXJhZGVvbl9kcF9lbmNvZGVyX3NlcnZpY2UocmRldiwgQVRPTV9EUF9BQ1RJT05fVFJBSU5JTkdfQ09NUExFVEUsCisJCQkJICBkaWdfY29ubmVjdG9yLT5kcF9jbG9jaywgZW5jX2lkLCAwKTsKK30KKworaW50IHJhZGVvbl9kcF9pMmNfYXV4X2NoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IG1vZGUsCisJCQkgdWludDhfdCB3cml0ZV9ieXRlLCB1aW50OF90ICpyZWFkX2J5dGUpCit7CisJc3RydWN0IGkyY19hbGdvX2RwX2F1eF9kYXRhICphbGdvX2RhdGEgPSBhZGFwdGVyLT5hbGdvX2RhdGE7CisJc3RydWN0IHJhZGVvbl9pMmNfY2hhbiAqYXV4Y2ggPSAoc3RydWN0IHJhZGVvbl9pMmNfY2hhbiAqKWFkYXB0ZXI7CisJaW50IHJldCA9IDA7CisJdWludDE2X3QgYWRkcmVzcyA9IGFsZ29fZGF0YS0+YWRkcmVzczsKKwl1aW50OF90IG1zZ1s1XTsKKwl1aW50OF90IHJlcGx5WzJdOworCWludCBtc2dfbGVuLCBkcF9tc2dfbGVuOworCWludCByZXBseV9ieXRlczsKKworCS8qIFNldCB1cCB0aGUgY29tbWFuZCBieXRlICovCisJaWYgKG1vZGUgJiBNT0RFX0kyQ19SRUFEKQorCQltc2dbMl0gPSBBVVhfSTJDX1JFQUQgPDwgNDsKKwllbHNlCisJCW1zZ1syXSA9IEFVWF9JMkNfV1JJVEUgPDwgNDsKKworCWlmICghKG1vZGUgJiBNT0RFX0kyQ19TVE9QKSkKKwkJbXNnWzJdIHw9IEFVWF9JMkNfTU9UIDw8IDQ7CisKKwltc2dbMF0gPSBhZGRyZXNzOworCW1zZ1sxXSA9IGFkZHJlc3MgPj4gODsKKworCXJlcGx5X2J5dGVzID0gMTsKKworCW1zZ19sZW4gPSA0OworCWRwX21zZ19sZW4gPSAzOworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgTU9ERV9JMkNfV1JJVEU6CisJCW1zZ1s0XSA9IHdyaXRlX2J5dGU7CisJCW1zZ19sZW4rKzsKKwkJZHBfbXNnX2xlbiArPSAyOworCQlicmVhazsKKwljYXNlIE1PREVfSTJDX1JFQUQ6CisJCWRwX21zZ19sZW4gKz0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJbXNnWzNdID0gKGRwX21zZ19sZW4pIDw8IDQ7CisJcmV0ID0gcmFkZW9uX3Byb2Nlc3NfYXV4X2NoKGF1eGNoLCBtc2csIG1zZ19sZW4sIHJlcGx5LCByZXBseV9ieXRlcywgMCk7CisKKwlpZiAocmV0KSB7CisJCWlmIChyZWFkX2J5dGUpCisJCQkqcmVhZF9ieXRlID0gcmVwbHlbMF07CisJCXJldHVybiByZXBseV9ieXRlczsKKwl9CisJcmV0dXJuIC1FUkVNT1RFSU87Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwLmMKaW5kZXggYzllOTNlYS4uODI0Y2M2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwLmMKQEAgLTY1LDYgKzY1LDk1IEBACiAgKiByMTAwLHJ2MTAwLHJzMTAwLHJ2MjAwLHJzMjAwLHIyMDAscnYyNTAscnMzMDAscnYyODAKICAqLwogCisvKiBocGQgZm9yIGRpZ2l0YWwgcGFuZWwgZGV0ZWN0L2Rpc2Nvbm5lY3QgKi8KK2Jvb2wgcjEwMF9ocGRfc2Vuc2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGVudW0gcmFkZW9uX2hwZF9pZCBocGQpCit7CisJYm9vbCBjb25uZWN0ZWQgPSBmYWxzZTsKKworCXN3aXRjaCAoaHBkKSB7CisJY2FzZSBSQURFT05fSFBEXzE6CisJCWlmIChSUkVHMzIoUkFERU9OX0ZQX0dFTl9DTlRMKSAmIFJBREVPTl9GUF9ERVRFQ1RfU0VOU0UpCisJCQljb25uZWN0ZWQgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFJBREVPTl9IUERfMjoKKwkJaWYgKFJSRUczMihSQURFT05fRlAyX0dFTl9DTlRMKSAmIFJBREVPTl9GUDJfREVURUNUX1NFTlNFKQorCQkJY29ubmVjdGVkID0gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBjb25uZWN0ZWQ7Cit9CisKK3ZvaWQgcjEwMF9ocGRfc2V0X3BvbGFyaXR5KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJICAgZW51bSByYWRlb25faHBkX2lkIGhwZCkKK3sKKwl1MzIgdG1wOworCWJvb2wgY29ubmVjdGVkID0gcjEwMF9ocGRfc2Vuc2UocmRldiwgaHBkKTsKKworCXN3aXRjaCAoaHBkKSB7CisJY2FzZSBSQURFT05fSFBEXzE6CisJCXRtcCA9IFJSRUczMihSQURFT05fRlBfR0VOX0NOVEwpOworCQlpZiAoY29ubmVjdGVkKQorCQkJdG1wICY9IH5SQURFT05fRlBfREVURUNUX0lOVF9QT0w7CisJCWVsc2UKKwkJCXRtcCB8PSBSQURFT05fRlBfREVURUNUX0lOVF9QT0w7CisJCVdSRUczMihSQURFT05fRlBfR0VOX0NOVEwsIHRtcCk7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX0hQRF8yOgorCQl0bXAgPSBSUkVHMzIoUkFERU9OX0ZQMl9HRU5fQ05UTCk7CisJCWlmIChjb25uZWN0ZWQpCisJCQl0bXAgJj0gflJBREVPTl9GUDJfREVURUNUX0lOVF9QT0w7CisJCWVsc2UKKwkJCXRtcCB8PSBSQURFT05fRlAyX0RFVEVDVF9JTlRfUE9MOworCQlXUkVHMzIoUkFERU9OX0ZQMl9HRU5fQ05UTCwgdG1wKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIHIxMDBfaHBkX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJkZXYtPmRkZXY7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwkJc3dpdGNoIChyYWRlb25fY29ubmVjdG9yLT5ocGQuaHBkKSB7CisJCWNhc2UgUkFERU9OX0hQRF8xOgorCQkJcmRldi0+aXJxLmhwZFswXSA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSBSQURFT05fSFBEXzI6CisJCQlyZGV2LT5pcnEuaHBkWzFdID0gdHJ1ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJcjEwMF9pcnFfc2V0KHJkZXYpOworfQorCit2b2lkIHIxMDBfaHBkX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJkZXYtPmRkZXY7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwkJc3dpdGNoIChyYWRlb25fY29ubmVjdG9yLT5ocGQuaHBkKSB7CisJCWNhc2UgUkFERU9OX0hQRF8xOgorCQkJcmRldi0+aXJxLmhwZFswXSA9IGZhbHNlOworCQkJYnJlYWs7CisJCWNhc2UgUkFERU9OX0hQRF8yOgorCQkJcmRldi0+aXJxLmhwZFsxXSA9IGZhbHNlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KK30KKwogLyoKICAqIFBDSSBHQVJUCiAgKi8KQEAgLTk0LDYgKzE4MywxNSBAQAogCXJldHVybiByYWRlb25fZ2FydF90YWJsZV9yYW1fYWxsb2MocmRldik7CiB9CiAKKy8qIHJlcXVpcmVkIG9uIHIxeHgsIHIyeHgsIHIzMDAsIHIodikzNTAsIHI0MjAvcjQ4MSwgcnM0MDAvcnM0ODAgKi8KK3ZvaWQgcjEwMF9lbmFibGVfYm0oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJdWludDMyX3QgdG1wOworCS8qIEVuYWJsZSBidXMgbWFzdGVyaW5nICovCisJdG1wID0gUlJFRzMyKFJBREVPTl9CVVNfQ05UTCkgJiB+UkFERU9OX0JVU19NQVNURVJfRElTOworCVdSRUczMihSQURFT05fQlVTX0NOVEwsIHRtcCk7Cit9CisKIGludCByMTAwX3BjaV9nYXJ0X2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1aW50MzJfdCB0bXA7CkBAIC0xMDUsOSArMjAzLDYgQEAKIAlXUkVHMzIoUkFERU9OX0FJQ19MT19BRERSLCByZGV2LT5tYy5ndHRfbG9jYXRpb24pOwogCXRtcCA9IHJkZXYtPm1jLmd0dF9sb2NhdGlvbiArIHJkZXYtPm1jLmd0dF9zaXplIC0gMTsKIAlXUkVHMzIoUkFERU9OX0FJQ19ISV9BRERSLCB0bXApOwotCS8qIEVuYWJsZSBidXMgbWFzdGVyaW5nICovCi0JdG1wID0gUlJFRzMyKFJBREVPTl9CVVNfQ05UTCkgJiB+UkFERU9OX0JVU19NQVNURVJfRElTOwotCVdSRUczMihSQURFT05fQlVTX0NOVEwsIHRtcCk7CiAJLyogc2V0IFBDSSBHQVJUIHBhZ2UtdGFibGUgYmFzZSBhZGRyZXNzICovCiAJV1JFRzMyKFJBREVPTl9BSUNfUFRfQkFTRSwgcmRldi0+Z2FydC50YWJsZV9hZGRyKTsKIAl0bXAgPSBSUkVHMzIoUkFERU9OX0FJQ19DTlRMKSB8IFJBREVPTl9QQ0lHQVJUX1RSQU5TTEFURV9FTjsKQEAgLTE1Nyw2ICsyNTIsMTIgQEAKIAlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFsxXSkgewogCQl0bXAgfD0gUkFERU9OX0NSVEMyX1ZCTEFOS19NQVNLOwogCX0KKwlpZiAocmRldi0+aXJxLmhwZFswXSkgeworCQl0bXAgfD0gUkFERU9OX0ZQX0RFVEVDVF9NQVNLOworCX0KKwlpZiAocmRldi0+aXJxLmhwZFsxXSkgeworCQl0bXAgfD0gUkFERU9OX0ZQMl9ERVRFQ1RfTUFTSzsKKwl9CiAJV1JFRzMyKFJBREVPTl9HRU5fSU5UX0NOVEwsIHRtcCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNzUsOCArMjc2LDkgQEAKIHN0YXRpYyBpbmxpbmUgdWludDMyX3QgcjEwMF9pcnFfYWNrKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXVpbnQzMl90IGlycXMgPSBSUkVHMzIoUkFERU9OX0dFTl9JTlRfU1RBVFVTKTsKLQl1aW50MzJfdCBpcnFfbWFzayA9IFJBREVPTl9TV19JTlRfVEVTVCB8IFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUIHwKLQkJUkFERU9OX0NSVEMyX1ZCTEFOS19TVEFUOworCXVpbnQzMl90IGlycV9tYXNrID0gUkFERU9OX1NXX0lOVF9URVNUIHwKKwkJUkFERU9OX0NSVENfVkJMQU5LX1NUQVQgfCBSQURFT05fQ1JUQzJfVkJMQU5LX1NUQVQgfAorCQlSQURFT05fRlBfREVURUNUX1NUQVQgfCBSQURFT05fRlAyX0RFVEVDVF9TVEFUOwogCiAJaWYgKGlycXMpIHsKIAkJV1JFRzMyKFJBREVPTl9HRU5fSU5UX1NUQVRVUywgaXJxcyk7CkBAIC0xODcsNiArMjg5LDcgQEAKIGludCByMTAwX2lycV9wcm9jZXNzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXVpbnQzMl90IHN0YXR1cywgbXNpX3JlYXJtOworCWJvb2wgcXVldWVfaG90cGx1ZyA9IGZhbHNlOwogCiAJc3RhdHVzID0gcjEwMF9pcnFfYWNrKHJkZXYpOwogCWlmICghc3RhdHVzKSB7CkBAIC0yMDcsOCArMzEwLDE4IEBACiAJCWlmIChzdGF0dXMgJiBSQURFT05fQ1JUQzJfVkJMQU5LX1NUQVQpIHsKIAkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDEpOwogCQl9CisJCWlmIChzdGF0dXMgJiBSQURFT05fRlBfREVURUNUX1NUQVQpIHsKKwkJCXF1ZXVlX2hvdHBsdWcgPSB0cnVlOworCQkJRFJNX0RFQlVHKCJIUEQxXG4iKTsKKwkJfQorCQlpZiAoc3RhdHVzICYgUkFERU9OX0ZQMl9ERVRFQ1RfU1RBVCkgeworCQkJcXVldWVfaG90cGx1ZyA9IHRydWU7CisJCQlEUk1fREVCVUcoIkhQRDJcbiIpOworCQl9CiAJCXN0YXR1cyA9IHIxMDBfaXJxX2FjayhyZGV2KTsKIAl9CisJaWYgKHF1ZXVlX2hvdHBsdWcpCisJCXF1ZXVlX3dvcmsocmRldi0+d3EsICZyZGV2LT5ob3RwbHVnX3dvcmspOwogCWlmIChyZGV2LT5tc2lfZW5hYmxlZCkgewogCQlzd2l0Y2ggKHJkZXYtPmZhbWlseSkgewogCQljYXNlIENISVBfUlM0MDA6CkBAIC0yNTUsMjQgKzM2OCwyNyBAQAogCWludCByOwogCiAJaWYgKHJkZXYtPndiLndiX29iaiA9PSBOVUxMKSB7Ci0JCXIgPSByYWRlb25fb2JqZWN0X2NyZWF0ZShyZGV2LCBOVUxMLCBSQURFT05fR1BVX1BBR0VfU0laRSwKLQkJCQkJIHRydWUsCi0JCQkJCSBSQURFT05fR0VNX0RPTUFJTl9HVFQsCi0JCQkJCSBmYWxzZSwgJnJkZXYtPndiLndiX29iaik7CisJCXIgPSByYWRlb25fYm9fY3JlYXRlKHJkZXYsIE5VTEwsIFJBREVPTl9HUFVfUEFHRV9TSVpFLCB0cnVlLAorCQkJCQlSQURFT05fR0VNX0RPTUFJTl9HVFQsCisJCQkJCSZyZGV2LT53Yi53Yl9vYmopOwogCQlpZiAocikgewotCQkJRFJNX0VSUk9SKCJyYWRlb246IGZhaWxlZCB0byBjcmVhdGUgV0IgYnVmZmVyICglZCkuXG4iLCByKTsKKwkJCWRldl9lcnIocmRldi0+ZGV2LCAiKCVkKSBjcmVhdGUgV0IgYnVmZmVyIGZhaWxlZFxuIiwgcik7CiAJCQlyZXR1cm4gcjsKIAkJfQotCQlyID0gcmFkZW9uX29iamVjdF9waW4ocmRldi0+d2Iud2Jfb2JqLAotCQkJCSAgICAgIFJBREVPTl9HRU1fRE9NQUlOX0dUVCwKLQkJCQkgICAgICAmcmRldi0+d2IuZ3B1X2FkZHIpOworCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+d2Iud2Jfb2JqLCBmYWxzZSk7CisJCWlmICh1bmxpa2VseShyICE9IDApKQorCQkJcmV0dXJuIHI7CisJCXIgPSByYWRlb25fYm9fcGluKHJkZXYtPndiLndiX29iaiwgUkFERU9OX0dFTV9ET01BSU5fR1RULAorCQkJCQkmcmRldi0+d2IuZ3B1X2FkZHIpOwogCQlpZiAocikgewotCQkJRFJNX0VSUk9SKCJyYWRlb246IGZhaWxlZCB0byBwaW4gV0IgYnVmZmVyICglZCkuXG4iLCByKTsKKwkJCWRldl9lcnIocmRldi0+ZGV2LCAiKCVkKSBwaW4gV0IgYnVmZmVyIGZhaWxlZFxuIiwgcik7CisJCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPndiLndiX29iaik7CiAJCQlyZXR1cm4gcjsKIAkJfQotCQlyID0gcmFkZW9uX29iamVjdF9rbWFwKHJkZXYtPndiLndiX29iaiwgKHZvaWQgKiopJnJkZXYtPndiLndiKTsKKwkJciA9IHJhZGVvbl9ib19rbWFwKHJkZXYtPndiLndiX29iaiwgKHZvaWQgKiopJnJkZXYtPndiLndiKTsKKwkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT53Yi53Yl9vYmopOwogCQlpZiAocikgewotCQkJRFJNX0VSUk9SKCJyYWRlb246IGZhaWxlZCB0byBtYXAgV0IgYnVmZmVyICglZCkuXG4iLCByKTsKKwkJCWRldl9lcnIocmRldi0+ZGV2LCAiKCVkKSBtYXAgV0IgYnVmZmVyIGZhaWxlZFxuIiwgcik7CiAJCQlyZXR1cm4gcjsKIAkJfQogCX0KQEAgLTI5MCwxMSArNDA2LDE5IEBACiAKIHZvaWQgcjEwMF93Yl9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworCWludCByOworCiAJcjEwMF93Yl9kaXNhYmxlKHJkZXYpOwogCWlmIChyZGV2LT53Yi53Yl9vYmopIHsKLQkJcmFkZW9uX29iamVjdF9rdW5tYXAocmRldi0+d2Iud2Jfb2JqKTsKLQkJcmFkZW9uX29iamVjdF91bnBpbihyZGV2LT53Yi53Yl9vYmopOwotCQlyYWRlb25fb2JqZWN0X3VucmVmKCZyZGV2LT53Yi53Yl9vYmopOworCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+d2Iud2Jfb2JqLCBmYWxzZSk7CisJCWlmICh1bmxpa2VseShyICE9IDApKSB7CisJCQlkZXZfZXJyKHJkZXYtPmRldiwgIiglZCkgY2FuJ3QgZmluaXNoIFdCXG4iLCByKTsKKwkJCXJldHVybjsKKwkJfQorCQlyYWRlb25fYm9fa3VubWFwKHJkZXYtPndiLndiX29iaik7CisJCXJhZGVvbl9ib191bnBpbihyZGV2LT53Yi53Yl9vYmopOworCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPndiLndiX29iaik7CisJCXJhZGVvbl9ib191bnJlZigmcmRldi0+d2Iud2Jfb2JqKTsKIAkJcmRldi0+d2Iud2IgPSBOVUxMOwogCQlyZGV2LT53Yi53Yl9vYmogPSBOVUxMOwogCX0KQEAgLTEyODgsMTcgKzE0MTIsMTcgQEAKIAogaW50IHIxMDBfY3NfdHJhY2tfY2hlY2tfcGt0M19pbmR4X2J1ZmZlcihzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwKIAkJCQkJIHN0cnVjdCByYWRlb25fY3NfcGFja2V0ICpwa3QsCi0JCQkJCSBzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iaikKKwkJCQkJIHN0cnVjdCByYWRlb25fYm8gKnJvYmopCiB7CiAJdW5zaWduZWQgaWR4OwogCXUzMiB2YWx1ZTsKIAlpZHggPSBwa3QtPmlkeCArIDE7CiAJdmFsdWUgPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCArIDIpOwotCWlmICgodmFsdWUgKyAxKSA+IHJhZGVvbl9vYmplY3Rfc2l6ZShyb2JqKSkgeworCWlmICgodmFsdWUgKyAxKSA+IHJhZGVvbl9ib19zaXplKHJvYmopKSB7CiAJCURSTV9FUlJPUigiW2RybV0gQnVmZmVyIHRvbyBzbWFsbCBmb3IgUEFDS0VUMyBJTkRYX0JVRkZFUiAiCiAJCQkgICIobmVlZCAldSBoYXZlICVsdSkgIVxuIiwKIAkJCSAgdmFsdWUgKyAxLAotCQkJICByYWRlb25fb2JqZWN0X3NpemUocm9iaikpOworCQkJICByYWRlb25fYm9fc2l6ZShyb2JqKSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKQEAgLTE1ODMsNiArMTcwNywxNCBAQAogCXIxMDBfaGRwX3Jlc2V0KHJkZXYpOwogfQogCit2b2lkIHIxMDBfaGRwX2ZsdXNoKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXUzMiB0bXA7CisJdG1wID0gUlJFRzMyKFJBREVPTl9IT1NUX1BBVEhfQ05UTCk7CisJdG1wIHw9IFJBREVPTl9IRFBfUkVBRF9CVUZGRVJfSU5WQUxJREFURTsKKwlXUkVHMzIoUkFERU9OX0hPU1RfUEFUSF9DTlRMLCB0bXApOworfQorCiB2b2lkIHIxMDBfaGRwX3Jlc2V0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXVpbnQzMl90IHRtcDsKQEAgLTE2NTAsNiArMTc4MiwxNyBAQAogCXJldHVybiAwOwogfQogCit2b2lkIHIxMDBfc2V0X2NvbW1vbl9yZWdzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCS8qIHNldCB0aGVzZSBzbyB0aGV5IGRvbid0IGludGVyZmVyZSB3aXRoIGFueXRoaW5nICovCisJV1JFRzMyKFJBREVPTl9PVjBfU0NBTEVfQ05UTCwgMCk7CisJV1JFRzMyKFJBREVPTl9TVUJQSUNfQ05UTCwgMCk7CisJV1JFRzMyKFJBREVPTl9WSVBIX0NPTlRST0wsIDApOworCVdSRUczMihSQURFT05fSTJDX0NOVExfMSwgMCk7CisJV1JFRzMyKFJBREVPTl9EVklfSTJDX0NOVExfMSwgMCk7CisJV1JFRzMyKFJBREVPTl9DQVAwX1RSSUdfQ05UTCwgMCk7CisJV1JFRzMyKFJBREVPTl9DQVAxX1RSSUdfQ05UTCwgMCk7Cit9CiAKIC8qCiAgKiBWUkFNIGluZm8KQEAgLTI1OTQsNyArMjczNyw3IEBACiAJCQkgICAgICBzdHJ1Y3QgcjEwMF9jc190cmFjayAqdHJhY2ssIHVuc2lnbmVkIGlkeCkKIHsKIAl1bnNpZ25lZCBmYWNlLCB3LCBoOwotCXN0cnVjdCByYWRlb25fb2JqZWN0ICpjdWJlX3JvYmo7CisJc3RydWN0IHJhZGVvbl9ibyAqY3ViZV9yb2JqOwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIAogCWZvciAoZmFjZSA9IDA7IGZhY2UgPCA1OyBmYWNlKyspIHsKQEAgLTI2MDcsOSArMjc1MCw5IEBACiAKIAkJc2l6ZSArPSB0cmFjay0+dGV4dHVyZXNbaWR4XS5jdWJlX2luZm9bZmFjZV0ub2Zmc2V0OwogCi0JCWlmIChzaXplID4gcmFkZW9uX29iamVjdF9zaXplKGN1YmVfcm9iaikpIHsKKwkJaWYgKHNpemUgPiByYWRlb25fYm9fc2l6ZShjdWJlX3JvYmopKSB7CiAJCQlEUk1fRVJST1IoIkN1YmUgdGV4dHVyZSBvZmZzZXQgZ3JlYXRlciB0aGFuIG9iamVjdCBzaXplICVsdSAlbHVcbiIsCi0JCQkJICBzaXplLCByYWRlb25fb2JqZWN0X3NpemUoY3ViZV9yb2JqKSk7CisJCQkJICBzaXplLCByYWRlb25fYm9fc2l6ZShjdWJlX3JvYmopKTsKIAkJCXIxMDBfY3NfdHJhY2tfdGV4dHVyZV9wcmludCgmdHJhY2stPnRleHR1cmVzW2lkeF0pOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC0yNjIwLDcgKzI3NjMsNyBAQAogc3RhdGljIGludCByMTAwX2NzX3RyYWNrX3RleHR1cmVfY2hlY2soc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCiAJCQkJICAgICAgIHN0cnVjdCByMTAwX2NzX3RyYWNrICp0cmFjaykKIHsKLQlzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iajsKKwlzdHJ1Y3QgcmFkZW9uX2JvICpyb2JqOwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIAl1bnNpZ25lZCB1LCBpLCB3LCBoOwogCWludCByZXQ7CkBAIC0yNjc2LDkgKzI4MTksOSBAQAogCQkJCSAgIiV1XG4iLCB0cmFjay0+dGV4dHVyZXNbdV0udGV4X2Nvb3JkX3R5cGUsIHUpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJaWYgKHNpemUgPiByYWRlb25fb2JqZWN0X3NpemUocm9iaikpIHsKKwkJaWYgKHNpemUgPiByYWRlb25fYm9fc2l6ZShyb2JqKSkgewogCQkJRFJNX0VSUk9SKCJUZXh0dXJlIG9mIHVuaXQgJXUgbmVlZHMgJWx1IGJ5dGVzIGJ1dCBpcyAiCi0JCQkJICAiJWx1XG4iLCB1LCBzaXplLCByYWRlb25fb2JqZWN0X3NpemUocm9iaikpOworCQkJCSAgIiVsdVxuIiwgdSwgc2l6ZSwgcmFkZW9uX2JvX3NpemUocm9iaikpOwogCQkJcjEwMF9jc190cmFja190ZXh0dXJlX3ByaW50KCZ0cmFjay0+dGV4dHVyZXNbdV0pOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTI3MDAsMTAgKzI4NDMsMTAgQEAKIAkJfQogCQlzaXplID0gdHJhY2stPmNiW2ldLnBpdGNoICogdHJhY2stPmNiW2ldLmNwcCAqIHRyYWNrLT5tYXh5OwogCQlzaXplICs9IHRyYWNrLT5jYltpXS5vZmZzZXQ7Ci0JCWlmIChzaXplID4gcmFkZW9uX29iamVjdF9zaXplKHRyYWNrLT5jYltpXS5yb2JqKSkgeworCQlpZiAoc2l6ZSA+IHJhZGVvbl9ib19zaXplKHRyYWNrLT5jYltpXS5yb2JqKSkgewogCQkJRFJNX0VSUk9SKCJbZHJtXSBCdWZmZXIgdG9vIHNtYWxsIGZvciBjb2xvciBidWZmZXIgJWQgIgogCQkJCSAgIihuZWVkICVsdSBoYXZlICVsdSkgIVxuIiwgaSwgc2l6ZSwKLQkJCQkgIHJhZGVvbl9vYmplY3Rfc2l6ZSh0cmFjay0+Y2JbaV0ucm9iaikpOworCQkJCSAgcmFkZW9uX2JvX3NpemUodHJhY2stPmNiW2ldLnJvYmopKTsKIAkJCURSTV9FUlJPUigiW2RybV0gY29sb3IgYnVmZmVyICVkICgldSAldSAldSAldSlcbiIsCiAJCQkJICBpLCB0cmFjay0+Y2JbaV0ucGl0Y2gsIHRyYWNrLT5jYltpXS5jcHAsCiAJCQkJICB0cmFjay0+Y2JbaV0ub2Zmc2V0LCB0cmFjay0+bWF4eSk7CkBAIC0yNzE3LDEwICsyODYwLDEwIEBACiAJCX0KIAkJc2l6ZSA9IHRyYWNrLT56Yi5waXRjaCAqIHRyYWNrLT56Yi5jcHAgKiB0cmFjay0+bWF4eTsKIAkJc2l6ZSArPSB0cmFjay0+emIub2Zmc2V0OwotCQlpZiAoc2l6ZSA+IHJhZGVvbl9vYmplY3Rfc2l6ZSh0cmFjay0+emIucm9iaikpIHsKKwkJaWYgKHNpemUgPiByYWRlb25fYm9fc2l6ZSh0cmFjay0+emIucm9iaikpIHsKIAkJCURSTV9FUlJPUigiW2RybV0gQnVmZmVyIHRvbyBzbWFsbCBmb3IgeiBidWZmZXIgIgogCQkJCSAgIihuZWVkICVsdSBoYXZlICVsdSkgIVxuIiwgc2l6ZSwKLQkJCQkgIHJhZGVvbl9vYmplY3Rfc2l6ZSh0cmFjay0+emIucm9iaikpOworCQkJCSAgcmFkZW9uX2JvX3NpemUodHJhY2stPnpiLnJvYmopKTsKIAkJCURSTV9FUlJPUigiW2RybV0gemJ1ZmZlciAoJXUgJXUgJXUgJXUpXG4iLAogCQkJCSAgdHJhY2stPnpiLnBpdGNoLCB0cmFjay0+emIuY3BwLAogCQkJCSAgdHJhY2stPnpiLm9mZnNldCwgdHJhY2stPm1heHkpOwpAQCAtMjczOCwxMSArMjg4MSwxMiBAQAogCQkJCQkgICJib3VuZFxuIiwgcHJpbV93YWxrLCBpKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KLQkJCWlmIChzaXplID4gcmFkZW9uX29iamVjdF9zaXplKHRyYWNrLT5hcnJheXNbaV0ucm9iaikpIHsKLQkJCQlEUk1fRVJST1IoIihQVyAldSkgVmVydGV4IGFycmF5ICV1IG5lZWQgJWx1IGR3b3JkcyAiCi0JCQkJCSAgICJoYXZlICVsdSBkd29yZHNcbiIsIHByaW1fd2FsaywgaSwKLQkJCQkJICAgc2l6ZSA+PiAyLAotCQkJCQkgICByYWRlb25fb2JqZWN0X3NpemUodHJhY2stPmFycmF5c1tpXS5yb2JqKSA+PiAyKTsKKwkJCWlmIChzaXplID4gcmFkZW9uX2JvX3NpemUodHJhY2stPmFycmF5c1tpXS5yb2JqKSkgeworCQkJCWRldl9lcnIocmRldi0+ZGV2LCAiKFBXICV1KSBWZXJ0ZXggYXJyYXkgJXUgIgorCQkJCQkibmVlZCAlbHUgZHdvcmRzIGhhdmUgJWx1IGR3b3Jkc1xuIiwKKwkJCQkJcHJpbV93YWxrLCBpLCBzaXplID4+IDIsCisJCQkJCXJhZGVvbl9ib19zaXplKHRyYWNrLT5hcnJheXNbaV0ucm9iaikKKwkJCQkJPj4gMik7CiAJCQkJRFJNX0VSUk9SKCJNYXggaW5kaWNlcyAldVxuIiwgdHJhY2stPm1heF9pbmR4KTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KQEAgLTI3NTYsMTAgKzI5MDAsMTIgQEAKIAkJCQkJICAiYm91bmRcbiIsIHByaW1fd2FsaywgaSk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9Ci0JCQlpZiAoc2l6ZSA+IHJhZGVvbl9vYmplY3Rfc2l6ZSh0cmFjay0+YXJyYXlzW2ldLnJvYmopKSB7Ci0JCQkJRFJNX0VSUk9SKCIoUFcgJXUpIFZlcnRleCBhcnJheSAldSBuZWVkICVsdSBkd29yZHMgIgotCQkJCQkgICAiaGF2ZSAlbHUgZHdvcmRzXG4iLCBwcmltX3dhbGssIGksIHNpemUgPj4gMiwKLQkJCQkJICAgcmFkZW9uX29iamVjdF9zaXplKHRyYWNrLT5hcnJheXNbaV0ucm9iaikgPj4gMik7CisJCQlpZiAoc2l6ZSA+IHJhZGVvbl9ib19zaXplKHRyYWNrLT5hcnJheXNbaV0ucm9iaikpIHsKKwkJCQlkZXZfZXJyKHJkZXYtPmRldiwgIihQVyAldSkgVmVydGV4IGFycmF5ICV1ICIKKwkJCQkJIm5lZWQgJWx1IGR3b3JkcyBoYXZlICVsdSBkd29yZHNcbiIsCisJCQkJCXByaW1fd2FsaywgaSwgc2l6ZSA+PiAyLAorCQkJCQlyYWRlb25fYm9fc2l6ZSh0cmFjay0+YXJyYXlzW2ldLnJvYmopCisJCQkJCT4+IDIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9CkBAIC0zMTAxLDYgKzMyNDcsOSBAQAogewogCWludCByOwogCisJLyogc2V0IGNvbW1vbiByZWdzICovCisJcjEwMF9zZXRfY29tbW9uX3JlZ3MocmRldik7CisJLyogcHJvZ3JhbSBtYyAqLwogCXIxMDBfbWNfcHJvZ3JhbShyZGV2KTsKIAkvKiBSZXN1bWUgY2xvY2sgKi8KIAlyMTAwX2Nsb2NrX3N0YXJ0dXAocmRldik7CkBAIC0zMTA4LDEzICszMjU3LDEzIEBACiAJcjEwMF9ncHVfaW5pdChyZGV2KTsKIAkvKiBJbml0aWFsaXplIEdBUlQgKGluaXRpYWxpemUgYWZ0ZXIgVFRNIHNvIHdlIGNhbiBhbGxvY2F0ZQogCSAqIG1lbW9yeSB0aHJvdWdoIFRUTSBidXQgZmluYWxpemUgYWZ0ZXIgVFRNKSAqLworCXIxMDBfZW5hYmxlX2JtKHJkZXYpOwogCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19QQ0kpIHsKIAkJciA9IHIxMDBfcGNpX2dhcnRfZW5hYmxlKHJkZXYpOwogCQlpZiAocikKIAkJCXJldHVybiByOwogCX0KIAkvKiBFbmFibGUgSVJRICovCi0JcmRldi0+aXJxLnN3X2ludCA9IHRydWU7CiAJcjEwMF9pcnFfc2V0KHJkZXYpOwogCS8qIDFNIHJpbmcgYnVmZmVyICovCiAJciA9IHIxMDBfY3BfaW5pdChyZGV2LCAxMDI0ICogMTAyNCk7CkBAIC0zMTUwLDYgKzMyOTksOCBAQAogCXJhZGVvbl9jb21iaW9zX2FzaWNfaW5pdChyZGV2LT5kZGV2KTsKIAkvKiBSZXN1bWUgY2xvY2sgYWZ0ZXIgcG9zdGluZyAqLwogCXIxMDBfY2xvY2tfc3RhcnR1cChyZGV2KTsKKwkvKiBJbml0aWFsaXplIHN1cmZhY2UgcmVnaXN0ZXJzICovCisJcmFkZW9uX3N1cmZhY2VfaW5pdChyZGV2KTsKIAlyZXR1cm4gcjEwMF9zdGFydHVwKHJkZXYpOwogfQogCkBAIC0zMTc0LDcgKzMzMjUsNyBAQAogCQlyMTAwX3BjaV9nYXJ0X2ZpbmkocmRldik7CiAJcmFkZW9uX2lycV9rbXNfZmluaShyZGV2KTsKIAlyYWRlb25fZmVuY2VfZHJpdmVyX2ZpbmkocmRldik7Ci0JcmFkZW9uX29iamVjdF9maW5pKHJkZXYpOworCXJhZGVvbl9ib19maW5pKHJkZXYpOwogCXJhZGVvbl9hdG9tYmlvc19maW5pKHJkZXYpOwogCWtmcmVlKHJkZXYtPmJpb3MpOwogCXJkZXYtPmJpb3MgPSBOVUxMOwpAQCAtMzI0MiwxMCArMzM5Myw4IEBACiAJCQlSUkVHMzIoUl8wMDA3QzBfQ1BfU1RBVCkpOwogCX0KIAkvKiBjaGVjayBpZiBjYXJkcyBhcmUgcG9zdGVkIG9yIG5vdCAqLwotCWlmICghcmFkZW9uX2NhcmRfcG9zdGVkKHJkZXYpICYmIHJkZXYtPmJpb3MpIHsKLQkJRFJNX0lORk8oIkdQVSBub3QgcG9zdGVkLiBwb3N0aW5nIG5vdy4uLlxuIik7Ci0JCXJhZGVvbl9jb21iaW9zX2FzaWNfaW5pdChyZGV2LT5kZGV2KTsKLQl9CisJaWYgKHJhZGVvbl9ib290X3Rlc3RfcG9zdF9jYXJkKHJkZXYpID09IGZhbHNlKQorCQlyZXR1cm4gLUVJTlZBTDsKIAkvKiBTZXQgYXNpYyBlcnJhdGEgKi8KIAlyMTAwX2VycmF0YShyZGV2KTsKIAkvKiBJbml0aWFsaXplIGNsb2NrcyAqLwpAQCAtMzI2NCw3ICszNDEzLDcgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAJLyogTWVtb3J5IG1hbmFnZXIgKi8KLQlyID0gcmFkZW9uX29iamVjdF9pbml0KHJkZXYpOworCXIgPSByYWRlb25fYm9faW5pdChyZGV2KTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX1BDSSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwX3RyYWNrLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDBfdHJhY2suaAppbmRleCAwZGFmMGQ3Li5jYTUwOTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDBfdHJhY2suaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDBfdHJhY2suaApAQCAtMTAsMjYgKzEwLDI2IEBACiAgKiBDUyBmdW5jdGlvbnMKICAqLwogc3RydWN0IHIxMDBfY3NfdHJhY2tfY2IgewotCXN0cnVjdCByYWRlb25fb2JqZWN0CSpyb2JqOworCXN0cnVjdCByYWRlb25fYm8JKnJvYmo7CiAJdW5zaWduZWQJCXBpdGNoOwogCXVuc2lnbmVkCQljcHA7CiAJdW5zaWduZWQJCW9mZnNldDsKIH07CiAKIHN0cnVjdCByMTAwX2NzX3RyYWNrX2FycmF5IHsKLQlzdHJ1Y3QgcmFkZW9uX29iamVjdAkqcm9iajsKKwlzdHJ1Y3QgcmFkZW9uX2JvCSpyb2JqOwogCXVuc2lnbmVkCQllc2l6ZTsKIH07CiAKIHN0cnVjdCByMTAwX2NzX2N1YmVfaW5mbyB7Ci0Jc3RydWN0IHJhZGVvbl9vYmplY3QJKnJvYmo7Ci0JdW5zaWduZWQgICAgICAgICAgICAgICAgb2Zmc2V0OworCXN0cnVjdCByYWRlb25fYm8JKnJvYmo7CisJdW5zaWduZWQJCW9mZnNldDsKIAl1bnNpZ25lZAkJd2lkdGg7CiAJdW5zaWduZWQJCWhlaWdodDsKIH07CiAKIHN0cnVjdCByMTAwX2NzX3RyYWNrX3RleHR1cmUgewotCXN0cnVjdCByYWRlb25fb2JqZWN0CSpyb2JqOworCXN0cnVjdCByYWRlb25fYm8JKnJvYmo7CiAJc3RydWN0IHIxMDBfY3NfY3ViZV9pbmZvIGN1YmVfaW5mb1s1XTsgLyogaW5mbyBmb3IgNSBub24tcHJpbWFyeSBmYWNlcyAqLwogCXVuc2lnbmVkCQlwaXRjaDsKIAl1bnNpZ25lZAkJd2lkdGg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMC5jCmluZGV4IDJmNDNlZTguLjgzMzc4YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMC5jCkBAIC0xMzcsMTQgKzEzNywxOSBAQAogCiB2b2lkIHJ2MzcwX3BjaWVfZ2FydF9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewotCXVpbnQzMl90IHRtcDsKKwl1MzIgdG1wOworCWludCByOwogCiAJdG1wID0gUlJFRzMyX1BDSUUoUkFERU9OX1BDSUVfVFhfR0FSVF9DTlRMKTsKIAl0bXAgfD0gUkFERU9OX1BDSUVfVFhfR0FSVF9VTk1BUFBFRF9BQ0NFU1NfRElTQ0FSRDsKIAlXUkVHMzJfUENJRShSQURFT05fUENJRV9UWF9HQVJUX0NOVEwsIHRtcCAmIH5SQURFT05fUENJRV9UWF9HQVJUX0VOKTsKIAlpZiAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopIHsKLQkJcmFkZW9uX29iamVjdF9rdW5tYXAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQlyYWRlb25fb2JqZWN0X3VucGluKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKKwkJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqLCBmYWxzZSk7CisJCWlmIChsaWtlbHkociA9PSAwKSkgeworCQkJcmFkZW9uX2JvX2t1bm1hcChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7CisJCQlyYWRlb25fYm9fdW5waW4ocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOworCQkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7CisJCX0KIAl9CiB9CiAKQEAgLTExODEsNiArMTE4Niw5IEBACiB7CiAJaW50IHI7CiAKKwkvKiBzZXQgY29tbW9uIHJlZ3MgKi8KKwlyMTAwX3NldF9jb21tb25fcmVncyhyZGV2KTsKKwkvKiBwcm9ncmFtIG1jICovCiAJcjMwMF9tY19wcm9ncmFtKHJkZXYpOwogCS8qIFJlc3VtZSBjbG9jayAqLwogCXIzMDBfY2xvY2tfc3RhcnR1cChyZGV2KTsKQEAgLTExOTMsMTMgKzEyMDEsMTggQEAKIAkJaWYgKHIpCiAJCQlyZXR1cm4gcjsKIAl9CisKKwlpZiAocmRldi0+ZmFtaWx5ID09IENISVBfUjMwMCB8fAorCSAgICByZGV2LT5mYW1pbHkgPT0gQ0hJUF9SMzUwIHx8CisJICAgIHJkZXYtPmZhbWlseSA9PSBDSElQX1JWMzUwKQorCQlyMTAwX2VuYWJsZV9ibShyZGV2KTsKKwogCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19QQ0kpIHsKIAkJciA9IHIxMDBfcGNpX2dhcnRfZW5hYmxlKHJkZXYpOwogCQlpZiAocikKIAkJCXJldHVybiByOwogCX0KIAkvKiBFbmFibGUgSVJRICovCi0JcmRldi0+aXJxLnN3X2ludCA9IHRydWU7CiAJcjEwMF9pcnFfc2V0KHJkZXYpOwogCS8qIDFNIHJpbmcgYnVmZmVyICovCiAJciA9IHIxMDBfY3BfaW5pdChyZGV2LCAxMDI0ICogMTAyNCk7CkBAIC0xMjM3LDYgKzEyNTAsOCBAQAogCXJhZGVvbl9jb21iaW9zX2FzaWNfaW5pdChyZGV2LT5kZGV2KTsKIAkvKiBSZXN1bWUgY2xvY2sgYWZ0ZXIgcG9zdGluZyAqLwogCXIzMDBfY2xvY2tfc3RhcnR1cChyZGV2KTsKKwkvKiBJbml0aWFsaXplIHN1cmZhY2UgcmVnaXN0ZXJzICovCisJcmFkZW9uX3N1cmZhY2VfaW5pdChyZGV2KTsKIAlyZXR1cm4gcjMwMF9zdGFydHVwKHJkZXYpOwogfQogCkBAIC0xMjY1LDcgKzEyODAsNyBAQAogCQlyMTAwX3BjaV9nYXJ0X2ZpbmkocmRldik7CiAJcmFkZW9uX2lycV9rbXNfZmluaShyZGV2KTsKIAlyYWRlb25fZmVuY2VfZHJpdmVyX2ZpbmkocmRldik7Ci0JcmFkZW9uX29iamVjdF9maW5pKHJkZXYpOworCXJhZGVvbl9ib19maW5pKHJkZXYpOwogCXJhZGVvbl9hdG9tYmlvc19maW5pKHJkZXYpOwogCWtmcmVlKHJkZXYtPmJpb3MpOwogCXJkZXYtPmJpb3MgPSBOVUxMOwpAQCAtMTMwMywxMCArMTMxOCw4IEBACiAJCQlSUkVHMzIoUl8wMDA3QzBfQ1BfU1RBVCkpOwogCX0KIAkvKiBjaGVjayBpZiBjYXJkcyBhcmUgcG9zdGVkIG9yIG5vdCAqLwotCWlmICghcmFkZW9uX2NhcmRfcG9zdGVkKHJkZXYpICYmIHJkZXYtPmJpb3MpIHsKLQkJRFJNX0lORk8oIkdQVSBub3QgcG9zdGVkLiBwb3N0aW5nIG5vdy4uLlxuIik7Ci0JCXJhZGVvbl9jb21iaW9zX2FzaWNfaW5pdChyZGV2LT5kZGV2KTsKLQl9CisJaWYgKHJhZGVvbl9ib290X3Rlc3RfcG9zdF9jYXJkKHJkZXYpID09IGZhbHNlKQorCQlyZXR1cm4gLUVJTlZBTDsKIAkvKiBTZXQgYXNpYyBlcnJhdGEgKi8KIAlyMzAwX2VycmF0YShyZGV2KTsKIAkvKiBJbml0aWFsaXplIGNsb2NrcyAqLwpAQCAtMTMyNSw3ICsxMzM4LDcgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAJLyogTWVtb3J5IG1hbmFnZXIgKi8KLQlyID0gcmFkZW9uX29iamVjdF9pbml0KHJkZXYpOworCXIgPSByYWRlb25fYm9faW5pdChyZGV2KTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX1BDSUUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjQyMC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNDIwLmMKaW5kZXggMWNlZmRiYy4uYzA1YTcyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNDIwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNDIwLmMKQEAgLTE2OSw2ICsxNjksOSBAQAogewogCWludCByOwogCisJLyogc2V0IGNvbW1vbiByZWdzICovCisJcjEwMF9zZXRfY29tbW9uX3JlZ3MocmRldik7CisJLyogcHJvZ3JhbSBtYyAqLwogCXIzMDBfbWNfcHJvZ3JhbShyZGV2KTsKIAkvKiBSZXN1bWUgY2xvY2sgKi8KIAlyNDIwX2Nsb2NrX3Jlc3VtZShyZGV2KTsKQEAgLTE4Niw3ICsxODksNiBAQAogCX0KIAlyNDIwX3BpcGVzX2luaXQocmRldik7CiAJLyogRW5hYmxlIElSUSAqLwotCXJkZXYtPmlycS5zd19pbnQgPSB0cnVlOwogCXIxMDBfaXJxX3NldChyZGV2KTsKIAkvKiAxTSByaW5nIGJ1ZmZlciAqLwogCXIgPSByMTAwX2NwX2luaXQocmRldiwgMTAyNCAqIDEwMjQpOwpAQCAtMjI5LDcgKzIzMSw4IEBACiAJfQogCS8qIFJlc3VtZSBjbG9jayBhZnRlciBwb3N0aW5nICovCiAJcjQyMF9jbG9ja19yZXN1bWUocmRldik7Ci0KKwkvKiBJbml0aWFsaXplIHN1cmZhY2UgcmVnaXN0ZXJzICovCisJcmFkZW9uX3N1cmZhY2VfaW5pdChyZGV2KTsKIAlyZXR1cm4gcjQyMF9zdGFydHVwKHJkZXYpOwogfQogCkBAIC0yNTgsNyArMjYxLDcgQEAKIAlyYWRlb25fYWdwX2ZpbmkocmRldik7CiAJcmFkZW9uX2lycV9rbXNfZmluaShyZGV2KTsKIAlyYWRlb25fZmVuY2VfZHJpdmVyX2ZpbmkocmRldik7Ci0JcmFkZW9uX29iamVjdF9maW5pKHJkZXYpOworCXJhZGVvbl9ib19maW5pKHJkZXYpOwogCWlmIChyZGV2LT5pc19hdG9tX2Jpb3MpIHsKIAkJcmFkZW9uX2F0b21iaW9zX2ZpbmkocmRldik7CiAJfSBlbHNlIHsKQEAgLTMwMSwxNCArMzA0LDkgQEAKIAkJCVJSRUczMihSXzAwMDdDMF9DUF9TVEFUKSk7CiAJfQogCS8qIGNoZWNrIGlmIGNhcmRzIGFyZSBwb3N0ZWQgb3Igbm90ICovCi0JaWYgKCFyYWRlb25fY2FyZF9wb3N0ZWQocmRldikgJiYgcmRldi0+YmlvcykgewotCQlEUk1fSU5GTygiR1BVIG5vdCBwb3N0ZWQuIHBvc3Rpbmcgbm93Li4uXG4iKTsKLQkJaWYgKHJkZXYtPmlzX2F0b21fYmlvcykgewotCQkJYXRvbV9hc2ljX2luaXQocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQlyYWRlb25fY29tYmlvc19hc2ljX2luaXQocmRldi0+ZGRldik7Ci0JCX0KLQl9CisJaWYgKHJhZGVvbl9ib290X3Rlc3RfcG9zdF9jYXJkKHJkZXYpID09IGZhbHNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCS8qIEluaXRpYWxpemUgY2xvY2tzICovCiAJcmFkZW9uX2dldF9jbG9ja19pbmZvKHJkZXYtPmRkZXYpOwogCS8qIEluaXRpYWxpemUgcG93ZXIgbWFuYWdlbWVudCAqLwpAQCAtMzMxLDEwICszMjksMTMgQEAKIAkJcmV0dXJuIHI7CiAJfQogCS8qIE1lbW9yeSBtYW5hZ2VyICovCi0JciA9IHJhZGVvbl9vYmplY3RfaW5pdChyZGV2KTsKKwlyID0gcmFkZW9uX2JvX2luaXQocmRldik7CiAJaWYgKHIpIHsKIAkJcmV0dXJuIHI7CiAJfQorCWlmIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SNDIwKQorCQlyMTAwX2VuYWJsZV9ibShyZGV2KTsKKwogCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19QQ0lFKSB7CiAJCXIgPSBydjM3MF9wY2llX2dhcnRfaW5pdChyZGV2KTsKIAkJaWYgKHIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I1MDBfcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I1MDBfcmVnLmgKaW5kZXggN2JhYTczOS4uNzRhZDg5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNTAwX3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjUwMF9yZWcuaApAQCAtNzE2LDYgKzcxNiw4IEBACiAKICNkZWZpbmUgQVZJVk9fRFZPQV9CSVRfREVQVEhfQ09OVFJPTAkJCTB4Nzk4OAogCisjZGVmaW5lIEFWSVZPX0RDX0dQSU9fSFBEX0EgICAgICAgICAgICAgICAgIDB4N2U5NAorCiAjZGVmaW5lIEFWSVZPX0dQSU9fMCAgICAgICAgICAgICAgICAgICAgICAgIDB4N2UzMAogI2RlZmluZSBBVklWT19HUElPXzEgICAgICAgICAgICAgICAgICAgICAgICAweDdlNDAKICNkZWZpbmUgQVZJVk9fR1BJT18yICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZTUwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I1MjAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjUyMC5jCmluZGV4IGY3NDM1MTguLjBmMzg0M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjUyMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjUyMC5jCkBAIC0xODUsNyArMTg1LDYgQEAKIAkJCXJldHVybiByOwogCX0KIAkvKiBFbmFibGUgSVJRICovCi0JcmRldi0+aXJxLnN3X2ludCA9IHRydWU7CiAJcnM2MDBfaXJxX3NldChyZGV2KTsKIAkvKiAxTSByaW5nIGJ1ZmZlciAqLwogCXIgPSByMTAwX2NwX2luaXQocmRldiwgMTAyNCAqIDEwMjQpOwpAQCAtMjIxLDYgKzIyMCw4IEBACiAJYXRvbV9hc2ljX2luaXQocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCk7CiAJLyogUmVzdW1lIGNsb2NrIGFmdGVyIHBvc3RpbmcgKi8KIAlydjUxNV9jbG9ja19zdGFydHVwKHJkZXYpOworCS8qIEluaXRpYWxpemUgc3VyZmFjZSByZWdpc3RlcnMgKi8KKwlyYWRlb25fc3VyZmFjZV9pbml0KHJkZXYpOwogCXJldHVybiByNTIwX3N0YXJ0dXAocmRldik7CiB9CiAKQEAgLTI1NCw2ICsyNTUsOSBAQAogCQkJUlJFRzMyKFJfMDAwN0MwX0NQX1NUQVQpKTsKIAl9CiAJLyogY2hlY2sgaWYgY2FyZHMgYXJlIHBvc3RlZCBvciBub3QgKi8KKwlpZiAocmFkZW9uX2Jvb3RfdGVzdF9wb3N0X2NhcmQocmRldikgPT0gZmFsc2UpCisJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKCFyYWRlb25fY2FyZF9wb3N0ZWQocmRldikgJiYgcmRldi0+YmlvcykgewogCQlEUk1fSU5GTygiR1BVIG5vdCBwb3N0ZWQuIHBvc3Rpbmcgbm93Li4uXG4iKTsKIAkJYXRvbV9hc2ljX2luaXQocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCk7CkBAIC0yNzcsNyArMjgxLDcgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAJLyogTWVtb3J5IG1hbmFnZXIgKi8KLQlyID0gcmFkZW9uX29iamVjdF9pbml0KHJkZXYpOworCXIgPSByYWRlb25fYm9faW5pdChyZGV2KTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAJciA9IHJ2MzcwX3BjaWVfZ2FydF9pbml0KHJkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDAuYwppbmRleCA2NzQwZWQyLi4zNjY1NmJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDAuYwpAQCAtMzgsOCArMzgsMTAgQEAKIAogI2RlZmluZSBQRlBfVUNPREVfU0laRSA1NzYKICNkZWZpbmUgUE00X1VDT0RFX1NJWkUgMTc5MgorI2RlZmluZSBSTENfVUNPREVfU0laRSA3NjgKICNkZWZpbmUgUjcwMF9QRlBfVUNPREVfU0laRSA4NDgKICNkZWZpbmUgUjcwMF9QTTRfVUNPREVfU0laRSAxMzYwCisjZGVmaW5lIFI3MDBfUkxDX1VDT0RFX1NJWkUgMTAyNAogCiAvKiBGaXJtd2FyZSBOYW1lcyAqLwogTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vUjYwMF9wZnAuYmluIik7CkBAIC02Miw2ICs2NCw4IEBACiBNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9SVjczMF9tZS5iaW4iKTsKIE1PRFVMRV9GSVJNV0FSRSgicmFkZW9uL1JWNzEwX3BmcC5iaW4iKTsKIE1PRFVMRV9GSVJNV0FSRSgicmFkZW9uL1JWNzEwX21lLmJpbiIpOworTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vUjYwMF9ybGMuYmluIik7CitNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9SNzAwX3JsYy5iaW4iKTsKIAogaW50IHI2MDBfZGVidWdmc19tY19pbmZvX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCkBAIC03MCw2ICs3NCwyODEgQEAKIHZvaWQgcjYwMF9ncHVfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHI2MDBfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKKy8qIGhwZCBmb3IgZGlnaXRhbCBwYW5lbCBkZXRlY3QvZGlzY29ubmVjdCAqLworYm9vbCByNjAwX2hwZF9zZW5zZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgZW51bSByYWRlb25faHBkX2lkIGhwZCkKK3sKKwlib29sIGNvbm5lY3RlZCA9IGZhbHNlOworCisJaWYgKEFTSUNfSVNfRENFMyhyZGV2KSkgeworCQlzd2l0Y2ggKGhwZCkgeworCQljYXNlIFJBREVPTl9IUERfMToKKwkJCWlmIChSUkVHMzIoRENfSFBEMV9JTlRfU1RBVFVTKSAmIERDX0hQRHhfU0VOU0UpCisJCQkJY29ubmVjdGVkID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIFJBREVPTl9IUERfMjoKKwkJCWlmIChSUkVHMzIoRENfSFBEMl9JTlRfU1RBVFVTKSAmIERDX0hQRHhfU0VOU0UpCisJCQkJY29ubmVjdGVkID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIFJBREVPTl9IUERfMzoKKwkJCWlmIChSUkVHMzIoRENfSFBEM19JTlRfU1RBVFVTKSAmIERDX0hQRHhfU0VOU0UpCisJCQkJY29ubmVjdGVkID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIFJBREVPTl9IUERfNDoKKwkJCWlmIChSUkVHMzIoRENfSFBENF9JTlRfU1RBVFVTKSAmIERDX0hQRHhfU0VOU0UpCisJCQkJY29ubmVjdGVkID0gdHJ1ZTsKKwkJCWJyZWFrOworCQkJLyogRENFIDMuMiAqLworCQljYXNlIFJBREVPTl9IUERfNToKKwkJCWlmIChSUkVHMzIoRENfSFBENV9JTlRfU1RBVFVTKSAmIERDX0hQRHhfU0VOU0UpCisJCQkJY29ubmVjdGVkID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIFJBREVPTl9IUERfNjoKKwkJCWlmIChSUkVHMzIoRENfSFBENl9JTlRfU1RBVFVTKSAmIERDX0hQRHhfU0VOU0UpCisJCQkJY29ubmVjdGVkID0gdHJ1ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKGhwZCkgeworCQljYXNlIFJBREVPTl9IUERfMToKKwkJCWlmIChSUkVHMzIoRENfSE9UX1BMVUdfREVURUNUMV9JTlRfU1RBVFVTKSAmIERDX0hPVF9QTFVHX0RFVEVDVHhfU0VOU0UpCisJCQkJY29ubmVjdGVkID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIFJBREVPTl9IUERfMjoKKwkJCWlmIChSUkVHMzIoRENfSE9UX1BMVUdfREVURUNUMl9JTlRfU1RBVFVTKSAmIERDX0hPVF9QTFVHX0RFVEVDVHhfU0VOU0UpCisJCQkJY29ubmVjdGVkID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIFJBREVPTl9IUERfMzoKKwkJCWlmIChSUkVHMzIoRENfSE9UX1BMVUdfREVURUNUM19JTlRfU1RBVFVTKSAmIERDX0hPVF9QTFVHX0RFVEVDVHhfU0VOU0UpCisJCQkJY29ubmVjdGVkID0gdHJ1ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGNvbm5lY3RlZDsKK30KKwordm9pZCByNjAwX2hwZF9zZXRfcG9sYXJpdHkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkgICBlbnVtIHJhZGVvbl9ocGRfaWQgaHBkKQoreworCXUzMiB0bXA7CisJYm9vbCBjb25uZWN0ZWQgPSByNjAwX2hwZF9zZW5zZShyZGV2LCBocGQpOworCisJaWYgKEFTSUNfSVNfRENFMyhyZGV2KSkgeworCQlzd2l0Y2ggKGhwZCkgeworCQljYXNlIFJBREVPTl9IUERfMToKKwkJCXRtcCA9IFJSRUczMihEQ19IUEQxX0lOVF9DT05UUk9MKTsKKwkJCWlmIChjb25uZWN0ZWQpCisJCQkJdG1wICY9IH5EQ19IUER4X0lOVF9QT0xBUklUWTsKKwkJCWVsc2UKKwkJCQl0bXAgfD0gRENfSFBEeF9JTlRfUE9MQVJJVFk7CisJCQlXUkVHMzIoRENfSFBEMV9JTlRfQ09OVFJPTCwgdG1wKTsKKwkJCWJyZWFrOworCQljYXNlIFJBREVPTl9IUERfMjoKKwkJCXRtcCA9IFJSRUczMihEQ19IUEQyX0lOVF9DT05UUk9MKTsKKwkJCWlmIChjb25uZWN0ZWQpCisJCQkJdG1wICY9IH5EQ19IUER4X0lOVF9QT0xBUklUWTsKKwkJCWVsc2UKKwkJCQl0bXAgfD0gRENfSFBEeF9JTlRfUE9MQVJJVFk7CisJCQlXUkVHMzIoRENfSFBEMl9JTlRfQ09OVFJPTCwgdG1wKTsKKwkJCWJyZWFrOworCQljYXNlIFJBREVPTl9IUERfMzoKKwkJCXRtcCA9IFJSRUczMihEQ19IUEQzX0lOVF9DT05UUk9MKTsKKwkJCWlmIChjb25uZWN0ZWQpCisJCQkJdG1wICY9IH5EQ19IUER4X0lOVF9QT0xBUklUWTsKKwkJCWVsc2UKKwkJCQl0bXAgfD0gRENfSFBEeF9JTlRfUE9MQVJJVFk7CisJCQlXUkVHMzIoRENfSFBEM19JTlRfQ09OVFJPTCwgdG1wKTsKKwkJCWJyZWFrOworCQljYXNlIFJBREVPTl9IUERfNDoKKwkJCXRtcCA9IFJSRUczMihEQ19IUEQ0X0lOVF9DT05UUk9MKTsKKwkJCWlmIChjb25uZWN0ZWQpCisJCQkJdG1wICY9IH5EQ19IUER4X0lOVF9QT0xBUklUWTsKKwkJCWVsc2UKKwkJCQl0bXAgfD0gRENfSFBEeF9JTlRfUE9MQVJJVFk7CisJCQlXUkVHMzIoRENfSFBENF9JTlRfQ09OVFJPTCwgdG1wKTsKKwkJCWJyZWFrOworCQljYXNlIFJBREVPTl9IUERfNToKKwkJCXRtcCA9IFJSRUczMihEQ19IUEQ1X0lOVF9DT05UUk9MKTsKKwkJCWlmIChjb25uZWN0ZWQpCisJCQkJdG1wICY9IH5EQ19IUER4X0lOVF9QT0xBUklUWTsKKwkJCWVsc2UKKwkJCQl0bXAgfD0gRENfSFBEeF9JTlRfUE9MQVJJVFk7CisJCQlXUkVHMzIoRENfSFBENV9JTlRfQ09OVFJPTCwgdG1wKTsKKwkJCWJyZWFrOworCQkJLyogRENFIDMuMiAqLworCQljYXNlIFJBREVPTl9IUERfNjoKKwkJCXRtcCA9IFJSRUczMihEQ19IUEQ2X0lOVF9DT05UUk9MKTsKKwkJCWlmIChjb25uZWN0ZWQpCisJCQkJdG1wICY9IH5EQ19IUER4X0lOVF9QT0xBUklUWTsKKwkJCWVsc2UKKwkJCQl0bXAgfD0gRENfSFBEeF9JTlRfUE9MQVJJVFk7CisJCQlXUkVHMzIoRENfSFBENl9JTlRfQ09OVFJPTCwgdG1wKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKGhwZCkgeworCQljYXNlIFJBREVPTl9IUERfMToKKwkJCXRtcCA9IFJSRUczMihEQ19IT1RfUExVR19ERVRFQ1QxX0lOVF9DT05UUk9MKTsKKwkJCWlmIChjb25uZWN0ZWQpCisJCQkJdG1wICY9IH5EQ19IT1RfUExVR19ERVRFQ1R4X0lOVF9QT0xBUklUWTsKKwkJCWVsc2UKKwkJCQl0bXAgfD0gRENfSE9UX1BMVUdfREVURUNUeF9JTlRfUE9MQVJJVFk7CisJCQlXUkVHMzIoRENfSE9UX1BMVUdfREVURUNUMV9JTlRfQ09OVFJPTCwgdG1wKTsKKwkJCWJyZWFrOworCQljYXNlIFJBREVPTl9IUERfMjoKKwkJCXRtcCA9IFJSRUczMihEQ19IT1RfUExVR19ERVRFQ1QyX0lOVF9DT05UUk9MKTsKKwkJCWlmIChjb25uZWN0ZWQpCisJCQkJdG1wICY9IH5EQ19IT1RfUExVR19ERVRFQ1R4X0lOVF9QT0xBUklUWTsKKwkJCWVsc2UKKwkJCQl0bXAgfD0gRENfSE9UX1BMVUdfREVURUNUeF9JTlRfUE9MQVJJVFk7CisJCQlXUkVHMzIoRENfSE9UX1BMVUdfREVURUNUMl9JTlRfQ09OVFJPTCwgdG1wKTsKKwkJCWJyZWFrOworCQljYXNlIFJBREVPTl9IUERfMzoKKwkJCXRtcCA9IFJSRUczMihEQ19IT1RfUExVR19ERVRFQ1QzX0lOVF9DT05UUk9MKTsKKwkJCWlmIChjb25uZWN0ZWQpCisJCQkJdG1wICY9IH5EQ19IT1RfUExVR19ERVRFQ1R4X0lOVF9QT0xBUklUWTsKKwkJCWVsc2UKKwkJCQl0bXAgfD0gRENfSE9UX1BMVUdfREVURUNUeF9JTlRfUE9MQVJJVFk7CisJCQlXUkVHMzIoRENfSE9UX1BMVUdfREVURUNUM19JTlRfQ09OVFJPTCwgdG1wKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3ZvaWQgcjYwMF9ocGRfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmRldi0+ZGRldjsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCisJaWYgKEFTSUNfSVNfRENFMyhyZGV2KSkgeworCQl1MzIgdG1wID0gRENfSFBEeF9DT05ORUNUSU9OX1RJTUVSKDB4OWM0KSB8IERDX0hQRHhfUlhfSU5UX1RJTUVSKDB4ZmEpOworCQlpZiAoQVNJQ19JU19EQ0UzMihyZGV2KSkKKwkJCXRtcCB8PSBEQ19IUER4X0VOOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJCQlzd2l0Y2ggKHJhZGVvbl9jb25uZWN0b3ItPmhwZC5ocGQpIHsKKwkJCWNhc2UgUkFERU9OX0hQRF8xOgorCQkJCVdSRUczMihEQ19IUEQxX0NPTlRST0wsIHRtcCk7CisJCQkJcmRldi0+aXJxLmhwZFswXSA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJBREVPTl9IUERfMjoKKwkJCQlXUkVHMzIoRENfSFBEMl9DT05UUk9MLCB0bXApOworCQkJCXJkZXYtPmlycS5ocGRbMV0gPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSBSQURFT05fSFBEXzM6CisJCQkJV1JFRzMyKERDX0hQRDNfQ09OVFJPTCwgdG1wKTsKKwkJCQlyZGV2LT5pcnEuaHBkWzJdID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkFERU9OX0hQRF80OgorCQkJCVdSRUczMihEQ19IUEQ0X0NPTlRST0wsIHRtcCk7CisJCQkJcmRldi0+aXJxLmhwZFszXSA9IHRydWU7CisJCQkJYnJlYWs7CisJCQkJLyogRENFIDMuMiAqLworCQkJY2FzZSBSQURFT05fSFBEXzU6CisJCQkJV1JFRzMyKERDX0hQRDVfQ09OVFJPTCwgdG1wKTsKKwkJCQlyZGV2LT5pcnEuaHBkWzRdID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkFERU9OX0hQRF82OgorCQkJCVdSRUczMihEQ19IUEQ2X0NPTlRST0wsIHRtcCk7CisJCQkJcmRldi0+aXJxLmhwZFs1XSA9IHRydWU7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwkJCXN3aXRjaCAocmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZCkgeworCQkJY2FzZSBSQURFT05fSFBEXzE6CisJCQkJV1JFRzMyKERDX0hPVF9QTFVHX0RFVEVDVDFfQ09OVFJPTCwgRENfSE9UX1BMVUdfREVURUNUeF9FTik7CisJCQkJcmRldi0+aXJxLmhwZFswXSA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJBREVPTl9IUERfMjoKKwkJCQlXUkVHMzIoRENfSE9UX1BMVUdfREVURUNUMl9DT05UUk9MLCBEQ19IT1RfUExVR19ERVRFQ1R4X0VOKTsKKwkJCQlyZGV2LT5pcnEuaHBkWzFdID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkFERU9OX0hQRF8zOgorCQkJCVdSRUczMihEQ19IT1RfUExVR19ERVRFQ1QzX0NPTlRST0wsIERDX0hPVF9QTFVHX0RFVEVDVHhfRU4pOworCQkJCXJkZXYtPmlycS5ocGRbMl0gPSB0cnVlOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyNjAwX2lycV9zZXQocmRldik7Cit9CisKK3ZvaWQgcjYwMF9ocGRfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmRldi0+ZGRldjsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCisJaWYgKEFTSUNfSVNfRENFMyhyZGV2KSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCQkJc3dpdGNoIChyYWRlb25fY29ubmVjdG9yLT5ocGQuaHBkKSB7CisJCQljYXNlIFJBREVPTl9IUERfMToKKwkJCQlXUkVHMzIoRENfSFBEMV9DT05UUk9MLCAwKTsKKwkJCQlyZGV2LT5pcnEuaHBkWzBdID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQljYXNlIFJBREVPTl9IUERfMjoKKwkJCQlXUkVHMzIoRENfSFBEMl9DT05UUk9MLCAwKTsKKwkJCQlyZGV2LT5pcnEuaHBkWzFdID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQljYXNlIFJBREVPTl9IUERfMzoKKwkJCQlXUkVHMzIoRENfSFBEM19DT05UUk9MLCAwKTsKKwkJCQlyZGV2LT5pcnEuaHBkWzJdID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQljYXNlIFJBREVPTl9IUERfNDoKKwkJCQlXUkVHMzIoRENfSFBENF9DT05UUk9MLCAwKTsKKwkJCQlyZGV2LT5pcnEuaHBkWzNdID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQkJLyogRENFIDMuMiAqLworCQkJY2FzZSBSQURFT05fSFBEXzU6CisJCQkJV1JFRzMyKERDX0hQRDVfQ09OVFJPTCwgMCk7CisJCQkJcmRldi0+aXJxLmhwZFs0XSA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJY2FzZSBSQURFT05fSFBEXzY6CisJCQkJV1JFRzMyKERDX0hQRDZfQ09OVFJPTCwgMCk7CisJCQkJcmRldi0+aXJxLmhwZFs1XSA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJCQlzd2l0Y2ggKHJhZGVvbl9jb25uZWN0b3ItPmhwZC5ocGQpIHsKKwkJCWNhc2UgUkFERU9OX0hQRF8xOgorCQkJCVdSRUczMihEQ19IT1RfUExVR19ERVRFQ1QxX0NPTlRST0wsIDApOworCQkJCXJkZXYtPmlycS5ocGRbMF0gPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkFERU9OX0hQRF8yOgorCQkJCVdSRUczMihEQ19IT1RfUExVR19ERVRFQ1QyX0NPTlRST0wsIDApOworCQkJCXJkZXYtPmlycS5ocGRbMV0gPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkFERU9OX0hQRF8zOgorCQkJCVdSRUczMihEQ19IT1RfUExVR19ERVRFQ1QzX0NPTlRST0wsIDApOworCQkJCXJkZXYtPmlycS5ocGRbMl0gPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKIC8qCiAgKiBSNjAwIFBDSUUgR0FSVAogICovCkBAIC0xODAsNyArNDU5LDcgQEAKIHZvaWQgcjYwMF9wY2llX2dhcnRfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1MzIgdG1wOwotCWludCBpOworCWludCBpLCByOwogCiAJLyogRGlzYWJsZSBhbGwgdGFibGVzICovCiAJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKQEAgLTIwOCw4ICs0ODcsMTIgQEAKIAlXUkVHMzIoTUNfVk1fTDFfVExCX01DQl9SRF9IRFBfQ05UTCwgdG1wKTsKIAlXUkVHMzIoTUNfVk1fTDFfVExCX01DQl9XUl9IRFBfQ05UTCwgdG1wKTsKIAlpZiAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopIHsKLQkJcmFkZW9uX29iamVjdF9rdW5tYXAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQlyYWRlb25fb2JqZWN0X3VucGluKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKKwkJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqLCBmYWxzZSk7CisJCWlmIChsaWtlbHkociA9PSAwKSkgeworCQkJcmFkZW9uX2JvX2t1bm1hcChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7CisJCQlyYWRlb25fYm9fdW5waW4ocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOworCQkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7CisJCX0KIAl9CiB9CiAKQEAgLTExMDEsNiArMTM4NCwxMCBAQAogCSh2b2lkKVJSRUczMihQQ0lFX1BPUlRfREFUQSk7CiB9CiAKK3ZvaWQgcjYwMF9oZHBfZmx1c2goc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJV1JFRzMyKFJfMDA1NDgwX0hEUF9NRU1fQ09IRVJFTkNZX0ZMVVNIX0NOVEwsIDB4MSk7Cit9CiAKIC8qCiAgKiBDUCAmIFJpbmcKQEAgLTExMTAsMTEgKzEzOTcsMTIgQEAKIAlXUkVHMzIoUl8wMDg2RDhfQ1BfTUVfQ05UTCwgU18wMDg2RDhfQ1BfTUVfSEFMVCgxKSk7CiB9CiAKLWludCByNjAwX2NwX2luaXRfbWljcm9jb2RlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoraW50IHI2MDBfaW5pdF9taWNyb2NvZGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAljb25zdCBjaGFyICpjaGlwX25hbWU7Ci0Jc2l6ZV90IHBmcF9yZXFfc2l6ZSwgbWVfcmVxX3NpemU7CisJY29uc3QgY2hhciAqcmxjX2NoaXBfbmFtZTsKKwlzaXplX3QgcGZwX3JlcV9zaXplLCBtZV9yZXFfc2l6ZSwgcmxjX3JlcV9zaXplOwogCWNoYXIgZndfbmFtZVszMF07CiAJaW50IGVycjsKIApAQCAtMTEyOCwzMCArMTQxNiw2MiBAQAogCX0KIAogCXN3aXRjaCAocmRldi0+ZmFtaWx5KSB7Ci0JY2FzZSBDSElQX1I2MDA6IGNoaXBfbmFtZSA9ICJSNjAwIjsgYnJlYWs7Ci0JY2FzZSBDSElQX1JWNjEwOiBjaGlwX25hbWUgPSAiUlY2MTAiOyBicmVhazsKLQljYXNlIENISVBfUlY2MzA6IGNoaXBfbmFtZSA9ICJSVjYzMCI7IGJyZWFrOwotCWNhc2UgQ0hJUF9SVjYyMDogY2hpcF9uYW1lID0gIlJWNjIwIjsgYnJlYWs7Ci0JY2FzZSBDSElQX1JWNjM1OiBjaGlwX25hbWUgPSAiUlY2MzUiOyBicmVhazsKLQljYXNlIENISVBfUlY2NzA6IGNoaXBfbmFtZSA9ICJSVjY3MCI7IGJyZWFrOworCWNhc2UgQ0hJUF9SNjAwOgorCQljaGlwX25hbWUgPSAiUjYwMCI7CisJCXJsY19jaGlwX25hbWUgPSAiUjYwMCI7CisJCWJyZWFrOworCWNhc2UgQ0hJUF9SVjYxMDoKKwkJY2hpcF9uYW1lID0gIlJWNjEwIjsKKwkJcmxjX2NoaXBfbmFtZSA9ICJSNjAwIjsKKwkJYnJlYWs7CisJY2FzZSBDSElQX1JWNjMwOgorCQljaGlwX25hbWUgPSAiUlY2MzAiOworCQlybGNfY2hpcF9uYW1lID0gIlI2MDAiOworCQlicmVhazsKKwljYXNlIENISVBfUlY2MjA6CisJCWNoaXBfbmFtZSA9ICJSVjYyMCI7CisJCXJsY19jaGlwX25hbWUgPSAiUjYwMCI7CisJCWJyZWFrOworCWNhc2UgQ0hJUF9SVjYzNToKKwkJY2hpcF9uYW1lID0gIlJWNjM1IjsKKwkJcmxjX2NoaXBfbmFtZSA9ICJSNjAwIjsKKwkJYnJlYWs7CisJY2FzZSBDSElQX1JWNjcwOgorCQljaGlwX25hbWUgPSAiUlY2NzAiOworCQlybGNfY2hpcF9uYW1lID0gIlI2MDAiOworCQlicmVhazsKIAljYXNlIENISVBfUlM3ODA6Ci0JY2FzZSBDSElQX1JTODgwOiBjaGlwX25hbWUgPSAiUlM3ODAiOyBicmVhazsKLQljYXNlIENISVBfUlY3NzA6IGNoaXBfbmFtZSA9ICJSVjc3MCI7IGJyZWFrOworCWNhc2UgQ0hJUF9SUzg4MDoKKwkJY2hpcF9uYW1lID0gIlJTNzgwIjsKKwkJcmxjX2NoaXBfbmFtZSA9ICJSNjAwIjsKKwkJYnJlYWs7CisJY2FzZSBDSElQX1JWNzcwOgorCQljaGlwX25hbWUgPSAiUlY3NzAiOworCQlybGNfY2hpcF9uYW1lID0gIlI3MDAiOworCQlicmVhazsKIAljYXNlIENISVBfUlY3MzA6Ci0JY2FzZSBDSElQX1JWNzQwOiBjaGlwX25hbWUgPSAiUlY3MzAiOyBicmVhazsKLQljYXNlIENISVBfUlY3MTA6IGNoaXBfbmFtZSA9ICJSVjcxMCI7IGJyZWFrOworCWNhc2UgQ0hJUF9SVjc0MDoKKwkJY2hpcF9uYW1lID0gIlJWNzMwIjsKKwkJcmxjX2NoaXBfbmFtZSA9ICJSNzAwIjsKKwkJYnJlYWs7CisJY2FzZSBDSElQX1JWNzEwOgorCQljaGlwX25hbWUgPSAiUlY3MTAiOworCQlybGNfY2hpcF9uYW1lID0gIlI3MDAiOworCQlicmVhazsKIAlkZWZhdWx0OiBCVUcoKTsKIAl9CiAKIAlpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUlY3NzApIHsKIAkJcGZwX3JlcV9zaXplID0gUjcwMF9QRlBfVUNPREVfU0laRSAqIDQ7CiAJCW1lX3JlcV9zaXplID0gUjcwMF9QTTRfVUNPREVfU0laRSAqIDQ7CisJCXJsY19yZXFfc2l6ZSA9IFI3MDBfUkxDX1VDT0RFX1NJWkUgKiA0OwogCX0gZWxzZSB7CiAJCXBmcF9yZXFfc2l6ZSA9IFBGUF9VQ09ERV9TSVpFICogNDsKIAkJbWVfcmVxX3NpemUgPSBQTTRfVUNPREVfU0laRSAqIDEyOworCQlybGNfcmVxX3NpemUgPSBSTENfVUNPREVfU0laRSAqIDQ7CiAJfQogCi0JRFJNX0lORk8oIkxvYWRpbmcgJXMgQ1AgTWljcm9jb2RlXG4iLCBjaGlwX25hbWUpOworCURSTV9JTkZPKCJMb2FkaW5nICVzIE1pY3JvY29kZVxuIiwgY2hpcF9uYW1lKTsKIAogCXNucHJpbnRmKGZ3X25hbWUsIHNpemVvZihmd19uYW1lKSwgInJhZGVvbi8lc19wZnAuYmluIiwgY2hpcF9uYW1lKTsKIAllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZyZGV2LT5wZnBfZncsIGZ3X25hbWUsICZwZGV2LT5kZXYpOwpAQCAtMTE3NSw2ICsxNDk1LDE4IEBACiAJCSAgICAgICByZGV2LT5tZV9mdy0+c2l6ZSwgZndfbmFtZSk7CiAJCWVyciA9IC1FSU5WQUw7CiAJfQorCisJc25wcmludGYoZndfbmFtZSwgc2l6ZW9mKGZ3X25hbWUpLCAicmFkZW9uLyVzX3JsYy5iaW4iLCBybGNfY2hpcF9uYW1lKTsKKwllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZyZGV2LT5ybGNfZncsIGZ3X25hbWUsICZwZGV2LT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWlmIChyZGV2LT5ybGNfZnctPnNpemUgIT0gcmxjX3JlcV9zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgInI2MDBfcmxjOiBCb2d1cyBsZW5ndGggJXp1IGluIGZpcm13YXJlIFwiJXNcIlxuIiwKKwkJICAgICAgIHJkZXYtPnJsY19mdy0+c2l6ZSwgZndfbmFtZSk7CisJCWVyciA9IC1FSU5WQUw7CisJfQorCiBvdXQ6CiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7CiAKQEAgLTExODcsNiArMTUxOSw4IEBACiAJCXJkZXYtPnBmcF9mdyA9IE5VTEw7CiAJCXJlbGVhc2VfZmlybXdhcmUocmRldi0+bWVfZncpOwogCQlyZGV2LT5tZV9mdyA9IE5VTEw7CisJCXJlbGVhc2VfZmlybXdhcmUocmRldi0+cmxjX2Z3KTsKKwkJcmRldi0+cmxjX2Z3ID0gTlVMTDsKIAl9CiAJcmV0dXJuIGVycjsKIH0KQEAgLTEzODEsMTAgKzE3MTUsMTYgQEAKIAogdm9pZCByNjAwX3diX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CisJaW50IHI7CisKIAlXUkVHMzIoU0NSQVRDSF9VTVNLLCAwKTsKIAlpZiAocmRldi0+d2Iud2Jfb2JqKSB7Ci0JCXJhZGVvbl9vYmplY3Rfa3VubWFwKHJkZXYtPndiLndiX29iaik7Ci0JCXJhZGVvbl9vYmplY3RfdW5waW4ocmRldi0+d2Iud2Jfb2JqKTsKKwkJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPndiLndiX29iaiwgZmFsc2UpOworCQlpZiAodW5saWtlbHkociAhPSAwKSkKKwkJCXJldHVybjsKKwkJcmFkZW9uX2JvX2t1bm1hcChyZGV2LT53Yi53Yl9vYmopOworCQlyYWRlb25fYm9fdW5waW4ocmRldi0+d2Iud2Jfb2JqKTsKKwkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT53Yi53Yl9vYmopOwogCX0KIH0KIApAQCAtMTM5Miw3ICsxNzMyLDcgQEAKIHsKIAlyNjAwX3diX2Rpc2FibGUocmRldik7CiAJaWYgKHJkZXYtPndiLndiX29iaikgewotCQlyYWRlb25fb2JqZWN0X3VucmVmKCZyZGV2LT53Yi53Yl9vYmopOworCQlyYWRlb25fYm9fdW5yZWYoJnJkZXYtPndiLndiX29iaik7CiAJCXJkZXYtPndiLndiID0gTlVMTDsKIAkJcmRldi0+d2Iud2Jfb2JqID0gTlVMTDsKIAl9CkBAIC0xNDAzLDIyICsxNzQzLDI5IEBACiAJaW50IHI7CiAKIAlpZiAocmRldi0+d2Iud2Jfb2JqID09IE5VTEwpIHsKLQkJciA9IHJhZGVvbl9vYmplY3RfY3JlYXRlKHJkZXYsIE5VTEwsIFJBREVPTl9HUFVfUEFHRV9TSVpFLCB0cnVlLAotCQkJCVJBREVPTl9HRU1fRE9NQUlOX0dUVCwgZmFsc2UsICZyZGV2LT53Yi53Yl9vYmopOworCQlyID0gcmFkZW9uX2JvX2NyZWF0ZShyZGV2LCBOVUxMLCBSQURFT05fR1BVX1BBR0VfU0laRSwgdHJ1ZSwKKwkJCQlSQURFT05fR0VNX0RPTUFJTl9HVFQsICZyZGV2LT53Yi53Yl9vYmopOwogCQlpZiAocikgewotCQkJZGV2X3dhcm4ocmRldi0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBXQiBidWZmZXIgKCVkKS5cbiIsIHIpOworCQkJZGV2X3dhcm4ocmRldi0+ZGV2LCAiKCVkKSBjcmVhdGUgV0IgYm8gZmFpbGVkXG4iLCByKTsKIAkJCXJldHVybiByOwogCQl9Ci0JCXIgPSByYWRlb25fb2JqZWN0X3BpbihyZGV2LT53Yi53Yl9vYmosIFJBREVPTl9HRU1fRE9NQUlOX0dUVCwKLQkJCQkmcmRldi0+d2IuZ3B1X2FkZHIpOwotCQlpZiAocikgewotCQkJZGV2X3dhcm4ocmRldi0+ZGV2LCAiZmFpbGVkIHRvIHBpbiBXQiBidWZmZXIgKCVkKS5cbiIsIHIpOworCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+d2Iud2Jfb2JqLCBmYWxzZSk7CisJCWlmICh1bmxpa2VseShyICE9IDApKSB7CiAJCQlyNjAwX3diX2ZpbmkocmRldik7CiAJCQlyZXR1cm4gcjsKIAkJfQotCQlyID0gcmFkZW9uX29iamVjdF9rbWFwKHJkZXYtPndiLndiX29iaiwgKHZvaWQgKiopJnJkZXYtPndiLndiKTsKKwkJciA9IHJhZGVvbl9ib19waW4ocmRldi0+d2Iud2Jfb2JqLCBSQURFT05fR0VNX0RPTUFJTl9HVFQsCisJCQkJJnJkZXYtPndiLmdwdV9hZGRyKTsKIAkJaWYgKHIpIHsKLQkJCWRldl93YXJuKHJkZXYtPmRldiwgImZhaWxlZCB0byBtYXAgV0IgYnVmZmVyICglZCkuXG4iLCByKTsKKwkJCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+d2Iud2Jfb2JqKTsKKwkJCWRldl93YXJuKHJkZXYtPmRldiwgIiglZCkgcGluIFdCIGJvIGZhaWxlZFxuIiwgcik7CisJCQlyNjAwX3diX2ZpbmkocmRldik7CisJCQlyZXR1cm4gcjsKKwkJfQorCQlyID0gcmFkZW9uX2JvX2ttYXAocmRldi0+d2Iud2Jfb2JqLCAodm9pZCAqKikmcmRldi0+d2Iud2IpOworCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPndiLndiX29iaik7CisJCWlmIChyKSB7CisJCQlkZXZfd2FybihyZGV2LT5kZXYsICIoJWQpIG1hcCBXQiBibyBmYWlsZWRcbiIsIHIpOwogCQkJcjYwMF93Yl9maW5pKHJkZXYpOwogCQkJcmV0dXJuIHI7CiAJCX0KQEAgLTE0MzMsMTAgKzE3ODAsMTQgQEAKIHZvaWQgcjYwMF9mZW5jZV9yaW5nX2VtaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCiAJCQkgIHN0cnVjdCByYWRlb25fZmVuY2UgKmZlbmNlKQogeworCS8qIEFsc28gY29uc2lkZXIgRVZFTlRfV1JJVEVfRU9QLiAgaXQgaGFuZGxlcyB0aGUgaW50ZXJydXB0cyArIHRpbWVzdGFtcHMgKyBldmVudHMgKi8KIAkvKiBFbWl0IGZlbmNlIHNlcXVlbmNlICYgZmlyZSBJUlEgKi8KIAlyYWRlb25fcmluZ193cml0ZShyZGV2LCBQQUNLRVQzKFBBQ0tFVDNfU0VUX0NPTkZJR19SRUcsIDEpKTsKIAlyYWRlb25fcmluZ193cml0ZShyZGV2LCAoKHJkZXYtPmZlbmNlX2Rydi5zY3JhdGNoX3JlZyAtIFBBQ0tFVDNfU0VUX0NPTkZJR19SRUdfT0ZGU0VUKSA+PiAyKSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgZmVuY2UtPnNlcSk7CisJLyogQ1BfSU5URVJSVVBUIHBhY2tldCAzIG5vIGxvbmdlciBleGlzdHMsIHVzZSBwYWNrZXQgMCAqLworCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIFBBQ0tFVDAoQ1BfSU5UX1NUQVRVUywgMCkpOworCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIFJCX0lOVF9TVEFUKTsKIH0KIAogaW50IHI2MDBfY29weV9kbWEoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCkBAIC0xNDU5LDE4ICsxODEwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHI2MDBfaXJxX3Byb2Nlc3Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCi17Ci0JLyogRklYTUU6IGltcGxlbWVudCAqLwotCXJldHVybiAwOwotfQotCi1pbnQgcjYwMF9pcnFfc2V0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQotewotCS8qIEZJWE1FOiBpbXBsZW1lbnQgKi8KLQlyZXR1cm4gMDsKLX0KLQogaW50IHI2MDBfc2V0X3N1cmZhY2VfcmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgcmVnLAogCQkJIHVpbnQzMl90IHRpbGluZ19mbGFncywgdWludDMyX3QgcGl0Y2gsCiAJCQkgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBvYmpfc2l6ZSkKQEAgLTE1MDYsNiArMTg0NSwxNCBAQAogewogCWludCByOwogCisJaWYgKCFyZGV2LT5tZV9mdyB8fCAhcmRldi0+cGZwX2Z3IHx8ICFyZGV2LT5ybGNfZncpIHsKKwkJciA9IHI2MDBfaW5pdF9taWNyb2NvZGUocmRldik7CisJCWlmIChyKSB7CisJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBsb2FkIGZpcm13YXJlIVxuIik7CisJCQlyZXR1cm4gcjsKKwkJfQorCX0KKwogCXI2MDBfbWNfcHJvZ3JhbShyZGV2KTsKIAlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKSB7CiAJCXI2MDBfYWdwX2VuYWJsZShyZGV2KTsKQEAgLTE1MTYsMTMgKzE4NjMsMjYgQEAKIAl9CiAJcjYwMF9ncHVfaW5pdChyZGV2KTsKIAotCXIgPSByYWRlb25fb2JqZWN0X3BpbihyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaiwgUkFERU9OX0dFTV9ET01BSU5fVlJBTSwKLQkJCSAgICAgICZyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX2dwdV9hZGRyKTsKKwlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmosIGZhbHNlKTsKKwlpZiAodW5saWtlbHkociAhPSAwKSkKKwkJcmV0dXJuIHI7CisJciA9IHJhZGVvbl9ib19waW4ocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmosIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sCisJCQkmcmRldi0+cjYwMF9ibGl0LnNoYWRlcl9ncHVfYWRkcik7CisJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaik7CiAJaWYgKHIpIHsKLQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcGluIGJsaXQgb2JqZWN0ICVkXG4iLCByKTsKKwkJZGV2X2VycihyZGV2LT5kZXYsICIoJWQpIHBpbiBibGl0IG9iamVjdCBmYWlsZWRcbiIsIHIpOwogCQlyZXR1cm4gcjsKIAl9CiAKKwkvKiBFbmFibGUgSVJRICovCisJciA9IHI2MDBfaXJxX2luaXQocmRldik7CisJaWYgKHIpIHsKKwkJRFJNX0VSUk9SKCJyYWRlb246IElIIGluaXQgZmFpbGVkICglZCkuXG4iLCByKTsKKwkJcmFkZW9uX2lycV9rbXNfZmluaShyZGV2KTsKKwkJcmV0dXJuIHI7CisJfQorCXI2MDBfaXJxX3NldChyZGV2KTsKKwogCXIgPSByYWRlb25fcmluZ19pbml0KHJkZXYsIHJkZXYtPmNwLnJpbmdfc2l6ZSk7CiAJaWYgKHIpCiAJCXJldHVybiByOwpAQCAtMTU4MywxMyArMTk0MywxOSBAQAogCiBpbnQgcjYwMF9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworCWludCByOworCiAJLyogRklYTUU6IHdlIHNob3VsZCB3YWl0IGZvciByaW5nIHRvIGJlIGVtcHR5ICovCiAJcjYwMF9jcF9zdG9wKHJkZXYpOwogCXJkZXYtPmNwLnJlYWR5ID0gZmFsc2U7CiAJcjYwMF93Yl9kaXNhYmxlKHJkZXYpOwogCXI2MDBfcGNpZV9nYXJ0X2Rpc2FibGUocmRldik7CiAJLyogdW5waW4gc2hhZGVycyBibyAqLwotCXJhZGVvbl9vYmplY3RfdW5waW4ocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopOworCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaiwgZmFsc2UpOworCWlmICh1bmxpa2VseShyICE9IDApKQorCQlyZXR1cm4gcjsKKwlyYWRlb25fYm9fdW5waW4ocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopOworCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopOwogCXJldHVybiAwOwogfQogCkBAIC0xNjI3LDcgKzE5OTMsMTEgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAJLyogUG9zdCBjYXJkIGlmIG5lY2Vzc2FyeSAqLwotCWlmICghcjYwMF9jYXJkX3Bvc3RlZChyZGV2KSAmJiByZGV2LT5iaW9zKSB7CisJaWYgKCFyNjAwX2NhcmRfcG9zdGVkKHJkZXYpKSB7CisJCWlmICghcmRldi0+YmlvcykgeworCQkJZGV2X2VycihyZGV2LT5kZXYsICJDYXJkIG5vdCBwb3N0ZWQgYW5kIG5vIEJJT1MgLSBpZ25vcmluZ1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCQlEUk1fSU5GTygiR1BVIG5vdCBwb3N0ZWQuIHBvc3Rpbmcgbm93Li4uXG4iKTsKIAkJYXRvbV9hc2ljX2luaXQocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCk7CiAJfQpAQCAtMTY1MCwzMSArMjAyMCwzMSBAQAogCWlmIChyKQogCQlyZXR1cm4gcjsKIAkvKiBNZW1vcnkgbWFuYWdlciAqLwotCXIgPSByYWRlb25fb2JqZWN0X2luaXQocmRldik7CisJciA9IHJhZGVvbl9ib19pbml0KHJkZXYpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKKworCXIgPSByYWRlb25faXJxX2ttc19pbml0KHJkZXYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwogCXJkZXYtPmNwLnJpbmdfb2JqID0gTlVMTDsKIAlyNjAwX3JpbmdfaW5pdChyZGV2LCAxMDI0ICogMTAyNCk7CiAKLQlpZiAoIXJkZXYtPm1lX2Z3IHx8ICFyZGV2LT5wZnBfZncpIHsKLQkJciA9IHI2MDBfY3BfaW5pdF9taWNyb2NvZGUocmRldik7Ci0JCWlmIChyKSB7Ci0JCQlEUk1fRVJST1IoIkZhaWxlZCB0byBsb2FkIGZpcm13YXJlIVxuIik7Ci0JCQlyZXR1cm4gcjsKLQkJfQotCX0KKwlyZGV2LT5paC5yaW5nX29iaiA9IE5VTEw7CisJcjYwMF9paF9yaW5nX2luaXQocmRldiwgNjQgKiAxMDI0KTsKIAogCXIgPSByNjAwX3BjaWVfZ2FydF9pbml0KHJkZXYpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCXJkZXYtPmFjY2VsX3dvcmtpbmcgPSB0cnVlOwogCXIgPSByNjAwX2JsaXRfaW5pdChyZGV2KTsKIAlpZiAocikgewotCQlEUk1fRVJST1IoInJhZGVvbjogZmFpbGxlZCBibGl0dGVyICglZCkuXG4iLCByKTsKKwkJRFJNX0VSUk9SKCJyYWRlb246IGZhaWxlZCBibGl0dGVyICglZCkuXG4iLCByKTsKIAkJcmV0dXJuIHI7CiAJfQogCisJcmRldi0+YWNjZWxfd29ya2luZyA9IHRydWU7CiAJciA9IHI2MDBfc3RhcnR1cChyZGV2KTsKIAlpZiAocikgewogCQlyNjAwX3N1c3BlbmQocmRldik7CkBAIC0xNjg2LDEyICsyMDU2LDEyIEBACiAJaWYgKHJkZXYtPmFjY2VsX3dvcmtpbmcpIHsKIAkJciA9IHJhZGVvbl9pYl9wb29sX2luaXQocmRldik7CiAJCWlmIChyKSB7Ci0JCQlEUk1fRVJST1IoInJhZGVvbjogZmFpbGxlZCBpbml0aWFsaXppbmcgSUIgcG9vbCAoJWQpLlxuIiwgcik7CisJCQlEUk1fRVJST1IoInJhZGVvbjogZmFpbGVkIGluaXRpYWxpemluZyBJQiBwb29sICglZCkuXG4iLCByKTsKIAkJCXJkZXYtPmFjY2VsX3dvcmtpbmcgPSBmYWxzZTsKIAkJfQogCQlyID0gcjYwMF9pYl90ZXN0KHJkZXYpOwogCQlpZiAocikgewotCQkJRFJNX0VSUk9SKCJyYWRlb246IGZhaWxsZWQgdGVzdGluZyBJQiAoJWQpLlxuIiwgcik7CisJCQlEUk1fRVJST1IoInJhZGVvbjogZmFpbGVkIHRlc3RpbmcgSUIgKCVkKS5cbiIsIHIpOwogCQkJcmRldi0+YWNjZWxfd29ya2luZyA9IGZhbHNlOwogCQl9CiAJfQpAQCAtMTcwNCw2ICsyMDc0LDggQEAKIAlyNjAwX3N1c3BlbmQocmRldik7CiAKIAlyNjAwX2JsaXRfZmluaShyZGV2KTsKKwlyNjAwX2lycV9maW5pKHJkZXYpOworCXJhZGVvbl9pcnFfa21zX2ZpbmkocmRldik7CiAJcmFkZW9uX3JpbmdfZmluaShyZGV2KTsKIAlyNjAwX3diX2ZpbmkocmRldik7CiAJcjYwMF9wY2llX2dhcnRfZmluaShyZGV2KTsKQEAgLTE3MTIsNyArMjA4NCw3IEBACiAJcmFkZW9uX2Nsb2Nrc19maW5pKHJkZXYpOwogCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19BR1ApCiAJCXJhZGVvbl9hZ3BfZmluaShyZGV2KTsKLQlyYWRlb25fb2JqZWN0X2ZpbmkocmRldik7CisJcmFkZW9uX2JvX2ZpbmkocmRldik7CiAJcmFkZW9uX2F0b21iaW9zX2ZpbmkocmRldik7CiAJa2ZyZWUocmRldi0+Ymlvcyk7CiAJcmRldi0+YmlvcyA9IE5VTEw7CkBAIC0xNzk4LDggKzIxNzAsNjU3IEBACiAJcmV0dXJuIHI7CiB9CiAKKy8qCisgKiBJbnRlcnJ1cHRzCisgKgorICogSW50ZXJydXB0cyB1c2UgYSByaW5nIGJ1ZmZlciBvbiByNnh4L3I3eHggaGFyZHdhcmUuICBJdCB3b3JrcyBwcmV0dHkKKyAqIHRoZSBzYW1lIGFzIHRoZSBDUCByaW5nIGJ1ZmZlciwgYnV0IGluIHJldmVyc2UuICBSYXRoZXIgdGhhbiB0aGUgQ1BVCisgKiB3cml0aW5nIHRvIHRoZSByaW5nIGFuZCB0aGUgR1BVIGNvbnN1bWluZywgdGhlIEdQVSB3cml0ZXMgdG8gdGhlIHJpbmcKKyAqIGFuZCBob3N0IGNvbnN1bWVzLiAgQXMgdGhlIGhvc3QgaXJxIGhhbmRsZXIgcHJvY2Vzc2VzIGludGVycnVwdHMsIGl0CisgKiBpbmNyZW1lbnRzIHRoZSBycHRyLiAgV2hlbiB0aGUgcnB0ciBjYXRjaGVzIHVwIHdpdGggdGhlIHdwdHIsIGFsbCB0aGUKKyAqIGN1cnJlbnQgaW50ZXJydXB0cyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgorICovCiAKK3ZvaWQgcjYwMF9paF9yaW5nX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVuc2lnbmVkIHJpbmdfc2l6ZSkKK3sKKwl1MzIgcmJfYnVmc3o7CiAKKwkvKiBBbGlnbiByaW5nIHNpemUgKi8KKwlyYl9idWZzeiA9IGRybV9vcmRlcihyaW5nX3NpemUgLyA0KTsKKwlyaW5nX3NpemUgPSAoMSA8PCByYl9idWZzeikgKiA0OworCXJkZXYtPmloLnJpbmdfc2l6ZSA9IHJpbmdfc2l6ZTsKKwlyZGV2LT5paC5hbGlnbl9tYXNrID0gNCAtIDE7Cit9CisKK3N0YXRpYyBpbnQgcjYwMF9paF9yaW5nX2FsbG9jKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1bnNpZ25lZCByaW5nX3NpemUpCit7CisJaW50IHI7CisKKwlyZGV2LT5paC5yaW5nX3NpemUgPSByaW5nX3NpemU7CisJLyogQWxsb2NhdGUgcmluZyBidWZmZXIgKi8KKwlpZiAocmRldi0+aWgucmluZ19vYmogPT0gTlVMTCkgeworCQlyID0gcmFkZW9uX2JvX2NyZWF0ZShyZGV2LCBOVUxMLCByZGV2LT5paC5yaW5nX3NpemUsCisJCQkJICAgICB0cnVlLAorCQkJCSAgICAgUkFERU9OX0dFTV9ET01BSU5fR1RULAorCQkJCSAgICAgJnJkZXYtPmloLnJpbmdfb2JqKTsKKwkJaWYgKHIpIHsKKwkJCURSTV9FUlJPUigicmFkZW9uOiBmYWlsZWQgdG8gY3JlYXRlIGloIHJpbmcgYnVmZmVyICglZCkuXG4iLCByKTsKKwkJCXJldHVybiByOworCQl9CisJCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyZGV2LT5paC5yaW5nX29iaiwgZmFsc2UpOworCQlpZiAodW5saWtlbHkociAhPSAwKSkKKwkJCXJldHVybiByOworCQlyID0gcmFkZW9uX2JvX3BpbihyZGV2LT5paC5yaW5nX29iaiwKKwkJCQkgIFJBREVPTl9HRU1fRE9NQUlOX0dUVCwKKwkJCQkgICZyZGV2LT5paC5ncHVfYWRkcik7CisJCWlmIChyKSB7CisJCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPmloLnJpbmdfb2JqKTsKKwkJCURSTV9FUlJPUigicmFkZW9uOiBmYWlsZWQgdG8gcGluIGloIHJpbmcgYnVmZmVyICglZCkuXG4iLCByKTsKKwkJCXJldHVybiByOworCQl9CisJCXIgPSByYWRlb25fYm9fa21hcChyZGV2LT5paC5yaW5nX29iaiwKKwkJCQkgICAodm9pZCAqKikmcmRldi0+aWgucmluZyk7CisJCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+aWgucmluZ19vYmopOworCQlpZiAocikgeworCQkJRFJNX0VSUk9SKCJyYWRlb246IGZhaWxlZCB0byBtYXAgaWggcmluZyBidWZmZXIgKCVkKS5cbiIsIHIpOworCQkJcmV0dXJuIHI7CisJCX0KKwl9CisJcmRldi0+aWgucHRyX21hc2sgPSAocmRldi0+Y3AucmluZ19zaXplIC8gNCkgLSAxOworCXJkZXYtPmloLnJwdHIgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHI2MDBfaWhfcmluZ19maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCWludCByOworCWlmIChyZGV2LT5paC5yaW5nX29iaikgeworCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+aWgucmluZ19vYmosIGZhbHNlKTsKKwkJaWYgKGxpa2VseShyID09IDApKSB7CisJCQlyYWRlb25fYm9fa3VubWFwKHJkZXYtPmloLnJpbmdfb2JqKTsKKwkJCXJhZGVvbl9ib191bnBpbihyZGV2LT5paC5yaW5nX29iaik7CisJCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPmloLnJpbmdfb2JqKTsKKwkJfQorCQlyYWRlb25fYm9fdW5yZWYoJnJkZXYtPmloLnJpbmdfb2JqKTsKKwkJcmRldi0+aWgucmluZyA9IE5VTEw7CisJCXJkZXYtPmloLnJpbmdfb2JqID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHI2MDBfcmxjX3N0b3Aoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisKKwlpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUlY3NzApIHsKKwkJLyogcjd4eCBhc2ljcyBuZWVkIHRvIHNvZnQgcmVzZXQgUkxDIGJlZm9yZSBoYWx0aW5nICovCisJCVdSRUczMihTUkJNX1NPRlRfUkVTRVQsIFNPRlRfUkVTRVRfUkxDKTsKKwkJUlJFRzMyKFNSQk1fU09GVF9SRVNFVCk7CisJCXVkZWxheSgxNTAwMCk7CisJCVdSRUczMihTUkJNX1NPRlRfUkVTRVQsIDApOworCQlSUkVHMzIoU1JCTV9TT0ZUX1JFU0VUKTsKKwl9CisKKwlXUkVHMzIoUkxDX0NOVEwsIDApOworfQorCitzdGF0aWMgdm9pZCByNjAwX3JsY19zdGFydChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlXUkVHMzIoUkxDX0NOVEwsIFJMQ19FTkFCTEUpOworfQorCitzdGF0aWMgaW50IHI2MDBfcmxjX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJdTMyIGk7CisJY29uc3QgX19iZTMyICpmd19kYXRhOworCisJaWYgKCFyZGV2LT5ybGNfZncpCisJCXJldHVybiAtRUlOVkFMOworCisJcjYwMF9ybGNfc3RvcChyZGV2KTsKKworCVdSRUczMihSTENfSEJfQkFTRSwgMCk7CisJV1JFRzMyKFJMQ19IQl9DTlRMLCAwKTsKKwlXUkVHMzIoUkxDX0hCX1JQVFIsIDApOworCVdSRUczMihSTENfSEJfV1BUUiwgMCk7CisJV1JFRzMyKFJMQ19IQl9XUFRSX0xTQl9BRERSLCAwKTsKKwlXUkVHMzIoUkxDX0hCX1dQVFJfTVNCX0FERFIsIDApOworCVdSRUczMihSTENfTUNfQ05UTCwgMCk7CisJV1JFRzMyKFJMQ19VQ09ERV9DTlRMLCAwKTsKKworCWZ3X2RhdGEgPSAoY29uc3QgX19iZTMyICopcmRldi0+cmxjX2Z3LT5kYXRhOworCWlmIChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SVjc3MCkgeworCQlmb3IgKGkgPSAwOyBpIDwgUjcwMF9STENfVUNPREVfU0laRTsgaSsrKSB7CisJCQlXUkVHMzIoUkxDX1VDT0RFX0FERFIsIGkpOworCQkJV1JFRzMyKFJMQ19VQ09ERV9EQVRBLCBiZTMyX3RvX2NwdXAoZndfZGF0YSsrKSk7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgUkxDX1VDT0RFX1NJWkU7IGkrKykgeworCQkJV1JFRzMyKFJMQ19VQ09ERV9BRERSLCBpKTsKKwkJCVdSRUczMihSTENfVUNPREVfREFUQSwgYmUzMl90b19jcHVwKGZ3X2RhdGErKykpOworCQl9CisJfQorCVdSRUczMihSTENfVUNPREVfQUREUiwgMCk7CisKKwlyNjAwX3JsY19zdGFydChyZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByNjAwX2VuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXUzMiBpaF9jbnRsID0gUlJFRzMyKElIX0NOVEwpOworCXUzMiBpaF9yYl9jbnRsID0gUlJFRzMyKElIX1JCX0NOVEwpOworCisJaWhfY250bCB8PSBFTkFCTEVfSU5UUjsKKwlpaF9yYl9jbnRsIHw9IElIX1JCX0VOQUJMRTsKKwlXUkVHMzIoSUhfQ05UTCwgaWhfY250bCk7CisJV1JFRzMyKElIX1JCX0NOVEwsIGloX3JiX2NudGwpOworCXJkZXYtPmloLmVuYWJsZWQgPSB0cnVlOworfQorCitzdGF0aWMgdm9pZCByNjAwX2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwl1MzIgaWhfcmJfY250bCA9IFJSRUczMihJSF9SQl9DTlRMKTsKKwl1MzIgaWhfY250bCA9IFJSRUczMihJSF9DTlRMKTsKKworCWloX3JiX2NudGwgJj0gfklIX1JCX0VOQUJMRTsKKwlpaF9jbnRsICY9IH5FTkFCTEVfSU5UUjsKKwlXUkVHMzIoSUhfUkJfQ05UTCwgaWhfcmJfY250bCk7CisJV1JFRzMyKElIX0NOVEwsIGloX2NudGwpOworCS8qIHNldCBycHRyLCB3cHRyIHRvIDAgKi8KKwlXUkVHMzIoSUhfUkJfUlBUUiwgMCk7CisJV1JFRzMyKElIX1JCX1dQVFIsIDApOworCXJkZXYtPmloLmVuYWJsZWQgPSBmYWxzZTsKKwlyZGV2LT5paC53cHRyID0gMDsKKwlyZGV2LT5paC5ycHRyID0gMDsKK30KKworc3RhdGljIHZvaWQgcjYwMF9kaXNhYmxlX2ludGVycnVwdF9zdGF0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwl1MzIgdG1wOworCisJV1JFRzMyKENQX0lOVF9DTlRMLCAwKTsKKwlXUkVHMzIoR1JCTV9JTlRfQ05UTCwgMCk7CisJV1JFRzMyKER4TU9ERV9JTlRfTUFTSywgMCk7CisJaWYgKEFTSUNfSVNfRENFMyhyZGV2KSkgeworCQlXUkVHMzIoRENFM19EQUNBX0FVVE9ERVRFQ1RfSU5UX0NPTlRST0wsIDApOworCQlXUkVHMzIoRENFM19EQUNCX0FVVE9ERVRFQ1RfSU5UX0NPTlRST0wsIDApOworCQl0bXAgPSBSUkVHMzIoRENfSFBEMV9JTlRfQ09OVFJPTCkgJiBEQ19IUER4X0lOVF9QT0xBUklUWTsKKwkJV1JFRzMyKERDX0hQRDFfSU5UX0NPTlRST0wsIHRtcCk7CisJCXRtcCA9IFJSRUczMihEQ19IUEQyX0lOVF9DT05UUk9MKSAmIERDX0hQRHhfSU5UX1BPTEFSSVRZOworCQlXUkVHMzIoRENfSFBEMl9JTlRfQ09OVFJPTCwgdG1wKTsKKwkJdG1wID0gUlJFRzMyKERDX0hQRDNfSU5UX0NPTlRST0wpICYgRENfSFBEeF9JTlRfUE9MQVJJVFk7CisJCVdSRUczMihEQ19IUEQzX0lOVF9DT05UUk9MLCB0bXApOworCQl0bXAgPSBSUkVHMzIoRENfSFBENF9JTlRfQ09OVFJPTCkgJiBEQ19IUER4X0lOVF9QT0xBUklUWTsKKwkJV1JFRzMyKERDX0hQRDRfSU5UX0NPTlRST0wsIHRtcCk7CisJCWlmIChBU0lDX0lTX0RDRTMyKHJkZXYpKSB7CisJCQl0bXAgPSBSUkVHMzIoRENfSFBENV9JTlRfQ09OVFJPTCkgJiBEQ19IUER4X0lOVF9QT0xBUklUWTsKKwkJCVdSRUczMihEQ19IUEQ1X0lOVF9DT05UUk9MLCAwKTsKKwkJCXRtcCA9IFJSRUczMihEQ19IUEQ2X0lOVF9DT05UUk9MKSAmIERDX0hQRHhfSU5UX1BPTEFSSVRZOworCQkJV1JFRzMyKERDX0hQRDZfSU5UX0NPTlRST0wsIDApOworCQl9CisJfSBlbHNlIHsKKwkJV1JFRzMyKERBQ0FfQVVUT0RFVEVDVF9JTlRfQ09OVFJPTCwgMCk7CisJCVdSRUczMihEQUNCX0FVVE9ERVRFQ1RfSU5UX0NPTlRST0wsIDApOworCQl0bXAgPSBSUkVHMzIoRENfSE9UX1BMVUdfREVURUNUMV9JTlRfQ09OVFJPTCkgJiBEQ19IT1RfUExVR19ERVRFQ1R4X0lOVF9QT0xBUklUWTsKKwkJV1JFRzMyKERDX0hPVF9QTFVHX0RFVEVDVDFfSU5UX0NPTlRST0wsIDApOworCQl0bXAgPSBSUkVHMzIoRENfSE9UX1BMVUdfREVURUNUMl9JTlRfQ09OVFJPTCkgJiBEQ19IT1RfUExVR19ERVRFQ1R4X0lOVF9QT0xBUklUWTsKKwkJV1JFRzMyKERDX0hPVF9QTFVHX0RFVEVDVDJfSU5UX0NPTlRST0wsIDApOworCQl0bXAgPSBSUkVHMzIoRENfSE9UX1BMVUdfREVURUNUM19JTlRfQ09OVFJPTCkgJiBEQ19IT1RfUExVR19ERVRFQ1R4X0lOVF9QT0xBUklUWTsKKwkJV1JFRzMyKERDX0hPVF9QTFVHX0RFVEVDVDNfSU5UX0NPTlRST0wsIDApOworCX0KK30KKworaW50IHI2MDBfaXJxX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJaW50IHJldCA9IDA7CisJaW50IHJiX2J1ZnN6OworCXUzMiBpbnRlcnJ1cHRfY250bCwgaWhfY250bCwgaWhfcmJfY250bDsKKworCS8qIGFsbG9jYXRlIHJpbmcgKi8KKwlyZXQgPSByNjAwX2loX3JpbmdfYWxsb2MocmRldiwgcmRldi0+aWgucmluZ19zaXplKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogZGlzYWJsZSBpcnFzICovCisJcjYwMF9kaXNhYmxlX2ludGVycnVwdHMocmRldik7CisKKwkvKiBpbml0IHJsYyAqLworCXJldCA9IHI2MDBfcmxjX2luaXQocmRldik7CisJaWYgKHJldCkgeworCQlyNjAwX2loX3JpbmdfZmluaShyZGV2KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBzZXR1cCBpbnRlcnJ1cHQgY29udHJvbCAqLworCS8qIHNldCBkdW1teSByZWFkIGFkZHJlc3MgdG8gcmluZyBhZGRyZXNzICovCisJV1JFRzMyKElOVEVSUlVQVF9DTlRMMiwgcmRldi0+aWguZ3B1X2FkZHIgPj4gOCk7CisJaW50ZXJydXB0X2NudGwgPSBSUkVHMzIoSU5URVJSVVBUX0NOVEwpOworCS8qIElIX0RVTU1ZX1JEX09WRVJSSURFPTAgLSBkdW1teSByZWFkIGRpc2FibGVkIHdpdGggbXNpLCBlbmFibGVkIHdpdGhvdXQgbXNpCisJICogSUhfRFVNTVlfUkRfT1ZFUlJJREU9MSAtIGR1bW15IHJlYWQgY29udHJvbGxlZCBieSBJSF9EVU1NWV9SRF9FTgorCSAqLworCWludGVycnVwdF9jbnRsICY9IH5JSF9EVU1NWV9SRF9PVkVSUklERTsKKwkvKiBJSF9SRVFfTk9OU05PT1BfRU49MSBpZiByaW5nIGlzIGluIG5vbi1jYWNoZWFibGUgbWVtb3J5LCBlLmcuLCB2cmFtICovCisJaW50ZXJydXB0X2NudGwgJj0gfklIX1JFUV9OT05TTk9PUF9FTjsKKwlXUkVHMzIoSU5URVJSVVBUX0NOVEwsIGludGVycnVwdF9jbnRsKTsKKworCVdSRUczMihJSF9SQl9CQVNFLCByZGV2LT5paC5ncHVfYWRkciA+PiA4KTsKKwlyYl9idWZzeiA9IGRybV9vcmRlcihyZGV2LT5paC5yaW5nX3NpemUgLyA0KTsKKworCWloX3JiX2NudGwgPSAoSUhfV1BUUl9PVkVSRkxPV19FTkFCTEUgfAorCQkgICAgICBJSF9XUFRSX09WRVJGTE9XX0NMRUFSIHwKKwkJICAgICAgKHJiX2J1ZnN6IDw8IDEpKTsKKwkvKiBXUFRSIHdyaXRlYmFjaywgbm90IHlldCAqLworCS8qaWhfcmJfY250bCB8PSBJSF9XUFRSX1dSSVRFQkFDS19FTkFCTEU7Ki8KKwlXUkVHMzIoSUhfUkJfV1BUUl9BRERSX0xPLCAwKTsKKwlXUkVHMzIoSUhfUkJfV1BUUl9BRERSX0hJLCAwKTsKKworCVdSRUczMihJSF9SQl9DTlRMLCBpaF9yYl9jbnRsKTsKKworCS8qIHNldCBycHRyLCB3cHRyIHRvIDAgKi8KKwlXUkVHMzIoSUhfUkJfUlBUUiwgMCk7CisJV1JFRzMyKElIX1JCX1dQVFIsIDApOworCisJLyogRGVmYXVsdCBzZXR0aW5ncyBmb3IgSUhfQ05UTCAoZGlzYWJsZWQgYXQgZmlyc3QpICovCisJaWhfY250bCA9IE1DX1dSUkVRX0NSRURJVCgweDEwKSB8IE1DX1dSX0NMRUFOX0NOVCgweDEwKTsKKwkvKiBSUFRSX1JFQVJNIG9ubHkgd29ya3MgaWYgbXNpJ3MgYXJlIGVuYWJsZWQgKi8KKwlpZiAocmRldi0+bXNpX2VuYWJsZWQpCisJCWloX2NudGwgfD0gUlBUUl9SRUFSTTsKKworI2lmZGVmIF9fQklHX0VORElBTgorCWloX2NudGwgfD0gSUhfTUNfU1dBUChJSF9NQ19TV0FQXzMyQklUKTsKKyNlbmRpZgorCVdSRUczMihJSF9DTlRMLCBpaF9jbnRsKTsKKworCS8qIGZvcmNlIHRoZSBhY3RpdmUgaW50ZXJydXB0IHN0YXRlIHRvIGFsbCBkaXNhYmxlZCAqLworCXI2MDBfZGlzYWJsZV9pbnRlcnJ1cHRfc3RhdGUocmRldik7CisKKwkvKiBlbmFibGUgaXJxcyAqLworCXI2MDBfZW5hYmxlX2ludGVycnVwdHMocmRldik7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHI2MDBfaXJxX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJcjYwMF9kaXNhYmxlX2ludGVycnVwdHMocmRldik7CisJcjYwMF9ybGNfc3RvcChyZGV2KTsKKwlyNjAwX2loX3JpbmdfZmluaShyZGV2KTsKK30KKworaW50IHI2MDBfaXJxX3NldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwl1MzIgY3BfaW50X2NudGwgPSBDTlRYX0JVU1lfSU5UX0VOQUJMRSB8IENOVFhfRU1QVFlfSU5UX0VOQUJMRTsKKwl1MzIgbW9kZV9pbnQgPSAwOworCXUzMiBocGQxLCBocGQyLCBocGQzLCBocGQ0ID0gMCwgaHBkNSA9IDAsIGhwZDYgPSAwOworCisJLyogZG9uJ3QgZW5hYmxlIGFueXRoaW5nIGlmIHRoZSBpaCBpcyBkaXNhYmxlZCAqLworCWlmICghcmRldi0+aWguZW5hYmxlZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoQVNJQ19JU19EQ0UzKHJkZXYpKSB7CisJCWhwZDEgPSBSUkVHMzIoRENfSFBEMV9JTlRfQ09OVFJPTCkgJiB+RENfSFBEeF9JTlRfRU47CisJCWhwZDIgPSBSUkVHMzIoRENfSFBEMl9JTlRfQ09OVFJPTCkgJiB+RENfSFBEeF9JTlRfRU47CisJCWhwZDMgPSBSUkVHMzIoRENfSFBEM19JTlRfQ09OVFJPTCkgJiB+RENfSFBEeF9JTlRfRU47CisJCWhwZDQgPSBSUkVHMzIoRENfSFBENF9JTlRfQ09OVFJPTCkgJiB+RENfSFBEeF9JTlRfRU47CisJCWlmIChBU0lDX0lTX0RDRTMyKHJkZXYpKSB7CisJCQlocGQ1ID0gUlJFRzMyKERDX0hQRDVfSU5UX0NPTlRST0wpICYgfkRDX0hQRHhfSU5UX0VOOworCQkJaHBkNiA9IFJSRUczMihEQ19IUEQ2X0lOVF9DT05UUk9MKSAmIH5EQ19IUER4X0lOVF9FTjsKKwkJfQorCX0gZWxzZSB7CisJCWhwZDEgPSBSUkVHMzIoRENfSE9UX1BMVUdfREVURUNUMV9JTlRfQ09OVFJPTCkgJiB+RENfSFBEeF9JTlRfRU47CisJCWhwZDIgPSBSUkVHMzIoRENfSE9UX1BMVUdfREVURUNUMl9JTlRfQ09OVFJPTCkgJiB+RENfSFBEeF9JTlRfRU47CisJCWhwZDMgPSBSUkVHMzIoRENfSE9UX1BMVUdfREVURUNUM19JTlRfQ09OVFJPTCkgJiB+RENfSFBEeF9JTlRfRU47CisJfQorCisJaWYgKHJkZXYtPmlycS5zd19pbnQpIHsKKwkJRFJNX0RFQlVHKCJyNjAwX2lycV9zZXQ6IHN3IGludFxuIik7CisJCWNwX2ludF9jbnRsIHw9IFJCX0lOVF9FTkFCTEU7CisJfQorCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzBdKSB7CisJCURSTV9ERUJVRygicjYwMF9pcnFfc2V0OiB2YmxhbmsgMFxuIik7CisJCW1vZGVfaW50IHw9IEQxTU9ERV9WQkxBTktfSU5UX01BU0s7CisJfQorCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzFdKSB7CisJCURSTV9ERUJVRygicjYwMF9pcnFfc2V0OiB2YmxhbmsgMVxuIik7CisJCW1vZGVfaW50IHw9IEQyTU9ERV9WQkxBTktfSU5UX01BU0s7CisJfQorCWlmIChyZGV2LT5pcnEuaHBkWzBdKSB7CisJCURSTV9ERUJVRygicjYwMF9pcnFfc2V0OiBocGQgMVxuIik7CisJCWhwZDEgfD0gRENfSFBEeF9JTlRfRU47CisJfQorCWlmIChyZGV2LT5pcnEuaHBkWzFdKSB7CisJCURSTV9ERUJVRygicjYwMF9pcnFfc2V0OiBocGQgMlxuIik7CisJCWhwZDIgfD0gRENfSFBEeF9JTlRfRU47CisJfQorCWlmIChyZGV2LT5pcnEuaHBkWzJdKSB7CisJCURSTV9ERUJVRygicjYwMF9pcnFfc2V0OiBocGQgM1xuIik7CisJCWhwZDMgfD0gRENfSFBEeF9JTlRfRU47CisJfQorCWlmIChyZGV2LT5pcnEuaHBkWzNdKSB7CisJCURSTV9ERUJVRygicjYwMF9pcnFfc2V0OiBocGQgNFxuIik7CisJCWhwZDQgfD0gRENfSFBEeF9JTlRfRU47CisJfQorCWlmIChyZGV2LT5pcnEuaHBkWzRdKSB7CisJCURSTV9ERUJVRygicjYwMF9pcnFfc2V0OiBocGQgNVxuIik7CisJCWhwZDUgfD0gRENfSFBEeF9JTlRfRU47CisJfQorCWlmIChyZGV2LT5pcnEuaHBkWzVdKSB7CisJCURSTV9ERUJVRygicjYwMF9pcnFfc2V0OiBocGQgNlxuIik7CisJCWhwZDYgfD0gRENfSFBEeF9JTlRfRU47CisJfQorCisJV1JFRzMyKENQX0lOVF9DTlRMLCBjcF9pbnRfY250bCk7CisJV1JFRzMyKER4TU9ERV9JTlRfTUFTSywgbW9kZV9pbnQpOworCWlmIChBU0lDX0lTX0RDRTMocmRldikpIHsKKwkJV1JFRzMyKERDX0hQRDFfSU5UX0NPTlRST0wsIGhwZDEpOworCQlXUkVHMzIoRENfSFBEMl9JTlRfQ09OVFJPTCwgaHBkMik7CisJCVdSRUczMihEQ19IUEQzX0lOVF9DT05UUk9MLCBocGQzKTsKKwkJV1JFRzMyKERDX0hQRDRfSU5UX0NPTlRST0wsIGhwZDQpOworCQlpZiAoQVNJQ19JU19EQ0UzMihyZGV2KSkgeworCQkJV1JFRzMyKERDX0hQRDVfSU5UX0NPTlRST0wsIGhwZDUpOworCQkJV1JFRzMyKERDX0hQRDZfSU5UX0NPTlRST0wsIGhwZDYpOworCQl9CisJfSBlbHNlIHsKKwkJV1JFRzMyKERDX0hPVF9QTFVHX0RFVEVDVDFfSU5UX0NPTlRST0wsIGhwZDEpOworCQlXUkVHMzIoRENfSE9UX1BMVUdfREVURUNUMl9JTlRfQ09OVFJPTCwgaHBkMik7CisJCVdSRUczMihEQ19IT1RfUExVR19ERVRFQ1QzX0lOVF9DT05UUk9MLCBocGQzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHI2MDBfaXJxX2FjayhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCQl1MzIgKmRpc3BfaW50LAorCQkJCXUzMiAqZGlzcF9pbnRfY29udCwKKwkJCQl1MzIgKmRpc3BfaW50X2NvbnQyKQoreworCXUzMiB0bXA7CisKKwlpZiAoQVNJQ19JU19EQ0UzKHJkZXYpKSB7CisJCSpkaXNwX2ludCA9IFJSRUczMihEQ0UzX0RJU1BfSU5URVJSVVBUX1NUQVRVUyk7CisJCSpkaXNwX2ludF9jb250ID0gUlJFRzMyKERDRTNfRElTUF9JTlRFUlJVUFRfU1RBVFVTX0NPTlRJTlVFKTsKKwkJKmRpc3BfaW50X2NvbnQyID0gUlJFRzMyKERDRTNfRElTUF9JTlRFUlJVUFRfU1RBVFVTX0NPTlRJTlVFMik7CisJfSBlbHNlIHsKKwkJKmRpc3BfaW50ID0gUlJFRzMyKERJU1BfSU5URVJSVVBUX1NUQVRVUyk7CisJCSpkaXNwX2ludF9jb250ID0gUlJFRzMyKERJU1BfSU5URVJSVVBUX1NUQVRVU19DT05USU5VRSk7CisJCSpkaXNwX2ludF9jb250MiA9IDA7CisJfQorCisJaWYgKCpkaXNwX2ludCAmIExCX0QxX1ZCTEFOS19JTlRFUlJVUFQpCisJCVdSRUczMihEMU1PREVfVkJMQU5LX1NUQVRVUywgRHhNT0RFX1ZCTEFOS19BQ0spOworCWlmICgqZGlzcF9pbnQgJiBMQl9EMV9WTElORV9JTlRFUlJVUFQpCisJCVdSRUczMihEMU1PREVfVkxJTkVfU1RBVFVTLCBEeE1PREVfVkxJTkVfQUNLKTsKKwlpZiAoKmRpc3BfaW50ICYgTEJfRDJfVkJMQU5LX0lOVEVSUlVQVCkKKwkJV1JFRzMyKEQyTU9ERV9WQkxBTktfU1RBVFVTLCBEeE1PREVfVkJMQU5LX0FDSyk7CisJaWYgKCpkaXNwX2ludCAmIExCX0QyX1ZMSU5FX0lOVEVSUlVQVCkKKwkJV1JFRzMyKEQyTU9ERV9WTElORV9TVEFUVVMsIER4TU9ERV9WTElORV9BQ0spOworCWlmICgqZGlzcF9pbnQgJiBEQ19IUEQxX0lOVEVSUlVQVCkgeworCQlpZiAoQVNJQ19JU19EQ0UzKHJkZXYpKSB7CisJCQl0bXAgPSBSUkVHMzIoRENfSFBEMV9JTlRfQ09OVFJPTCk7CisJCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOworCQkJV1JFRzMyKERDX0hQRDFfSU5UX0NPTlRST0wsIHRtcCk7CisJCX0gZWxzZSB7CisJCQl0bXAgPSBSUkVHMzIoRENfSE9UX1BMVUdfREVURUNUMV9JTlRfQ09OVFJPTCk7CisJCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOworCQkJV1JFRzMyKERDX0hPVF9QTFVHX0RFVEVDVDFfSU5UX0NPTlRST0wsIHRtcCk7CisJCX0KKwl9CisJaWYgKCpkaXNwX2ludCAmIERDX0hQRDJfSU5URVJSVVBUKSB7CisJCWlmIChBU0lDX0lTX0RDRTMocmRldikpIHsKKwkJCXRtcCA9IFJSRUczMihEQ19IUEQyX0lOVF9DT05UUk9MKTsKKwkJCXRtcCB8PSBEQ19IUER4X0lOVF9BQ0s7CisJCQlXUkVHMzIoRENfSFBEMl9JTlRfQ09OVFJPTCwgdG1wKTsKKwkJfSBlbHNlIHsKKwkJCXRtcCA9IFJSRUczMihEQ19IT1RfUExVR19ERVRFQ1QyX0lOVF9DT05UUk9MKTsKKwkJCXRtcCB8PSBEQ19IUER4X0lOVF9BQ0s7CisJCQlXUkVHMzIoRENfSE9UX1BMVUdfREVURUNUMl9JTlRfQ09OVFJPTCwgdG1wKTsKKwkJfQorCX0KKwlpZiAoKmRpc3BfaW50X2NvbnQgJiBEQ19IUEQzX0lOVEVSUlVQVCkgeworCQlpZiAoQVNJQ19JU19EQ0UzKHJkZXYpKSB7CisJCQl0bXAgPSBSUkVHMzIoRENfSFBEM19JTlRfQ09OVFJPTCk7CisJCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOworCQkJV1JFRzMyKERDX0hQRDNfSU5UX0NPTlRST0wsIHRtcCk7CisJCX0gZWxzZSB7CisJCQl0bXAgPSBSUkVHMzIoRENfSE9UX1BMVUdfREVURUNUM19JTlRfQ09OVFJPTCk7CisJCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOworCQkJV1JFRzMyKERDX0hPVF9QTFVHX0RFVEVDVDNfSU5UX0NPTlRST0wsIHRtcCk7CisJCX0KKwl9CisJaWYgKCpkaXNwX2ludF9jb250ICYgRENfSFBENF9JTlRFUlJVUFQpIHsKKwkJdG1wID0gUlJFRzMyKERDX0hQRDRfSU5UX0NPTlRST0wpOworCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOworCQlXUkVHMzIoRENfSFBENF9JTlRfQ09OVFJPTCwgdG1wKTsKKwl9CisJaWYgKEFTSUNfSVNfRENFMzIocmRldikpIHsKKwkJaWYgKCpkaXNwX2ludF9jb250MiAmIERDX0hQRDVfSU5URVJSVVBUKSB7CisJCQl0bXAgPSBSUkVHMzIoRENfSFBENV9JTlRfQ09OVFJPTCk7CisJCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOworCQkJV1JFRzMyKERDX0hQRDVfSU5UX0NPTlRST0wsIHRtcCk7CisJCX0KKwkJaWYgKCpkaXNwX2ludF9jb250MiAmIERDX0hQRDZfSU5URVJSVVBUKSB7CisJCQl0bXAgPSBSUkVHMzIoRENfSFBENV9JTlRfQ09OVFJPTCk7CisJCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOworCQkJV1JFRzMyKERDX0hQRDZfSU5UX0NPTlRST0wsIHRtcCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgcjYwMF9pcnFfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwl1MzIgZGlzcF9pbnQsIGRpc3BfaW50X2NvbnQsIGRpc3BfaW50X2NvbnQyOworCisJcjYwMF9kaXNhYmxlX2ludGVycnVwdHMocmRldik7CisJLyogV2FpdCBhbmQgYWNrbm93bGVkZ2UgaXJxICovCisJbWRlbGF5KDEpOworCXI2MDBfaXJxX2FjayhyZGV2LCAmZGlzcF9pbnQsICZkaXNwX2ludF9jb250LCAmZGlzcF9pbnRfY29udDIpOworCXI2MDBfZGlzYWJsZV9pbnRlcnJ1cHRfc3RhdGUocmRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHI2MDBfZ2V0X2loX3dwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJdTMyIHdwdHIsIHRtcDsKKworCS8qIFhYWCB1c2Ugd3JpdGViYWNrICovCisJd3B0ciA9IFJSRUczMihJSF9SQl9XUFRSKTsKKworCWlmICh3cHRyICYgUkJfT1ZFUkZMT1cpIHsKKwkJV0FSTl9PTigxKTsKKwkJLyogWFhYIGRlYWwgd2l0aCBvdmVyZmxvdyAqLworCQlEUk1fRVJST1IoIklIIFJCIG92ZXJmbG93XG4iKTsKKwkJdG1wID0gUlJFRzMyKElIX1JCX0NOVEwpOworCQl0bXAgfD0gSUhfV1BUUl9PVkVSRkxPV19DTEVBUjsKKwkJV1JFRzMyKElIX1JCX0NOVEwsIHRtcCk7CisJfQorCXdwdHIgPSB3cHRyICYgV1BUUl9PRkZTRVRfTUFTSzsKKworCXJldHVybiB3cHRyOworfQorCisvKiAgICAgICAgcjYwMCBJViBSaW5nCisgKiBFYWNoIElWIHJpbmcgZW50cnkgaXMgMTI4IGJpdHM6CisgKiBbNzowXSAgICAtIGludGVycnVwdCBzb3VyY2UgaWQKKyAqIFszMTo4XSAgIC0gcmVzZXJ2ZWQKKyAqIFs1OTozMl0gIC0gaW50ZXJydXB0IHNvdXJjZSBkYXRhCisgKiBbMTI3OjYwXSAgLSByZXNlcnZlZAorICoKKyAqIFRoZSBiYXNpYyBpbnRlcnJ1cHQgdmVjdG9yIGVudHJpZXMKKyAqIGFyZSBkZWNvZGVkIGFzIGZvbGxvd3M6CisgKiBzcmNfaWQgIHNyY19kYXRhICBkZXNjcmlwdGlvbgorICogICAgICAxICAgICAgICAgMCAgRDEgVmJsYW5rCisgKiAgICAgIDEgICAgICAgICAxICBEMSBWbGluZQorICogICAgICA1ICAgICAgICAgMCAgRDIgVmJsYW5rCisgKiAgICAgIDUgICAgICAgICAxICBEMiBWbGluZQorICogICAgIDE5ICAgICAgICAgMCAgRlAgSG90IHBsdWcgZGV0ZWN0aW9uIEEKKyAqICAgICAxOSAgICAgICAgIDEgIEZQIEhvdCBwbHVnIGRldGVjdGlvbiBCCisgKiAgICAgMTkgICAgICAgICAyICBEQUMgQSBhdXRvLWRldGVjdGlvbgorICogICAgIDE5ICAgICAgICAgMyAgREFDIEIgYXV0by1kZXRlY3Rpb24KKyAqICAgIDE3NiAgICAgICAgIC0gIENQX0lOVCBSQgorICogICAgMTc3ICAgICAgICAgLSAgQ1BfSU5UIElCMQorICogICAgMTc4ICAgICAgICAgLSAgQ1BfSU5UIElCMgorICogICAgMTgxICAgICAgICAgLSAgRU9QIEludGVycnVwdAorICogICAgMjMzICAgICAgICAgLSAgR1VJIElkbGUKKyAqCisgKiBOb3RlLCB0aGVzZSBhcmUgYmFzZWQgb24gcjYwMCBhbmQgbWF5IG5lZWQgdG8gYmUKKyAqIGFkanVzdGVkIG9yIGFkZGVkIHRvIG9uIG5ld2VyIGFzaWNzCisgKi8KKworaW50IHI2MDBfaXJxX3Byb2Nlc3Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJdTMyIHdwdHIgPSByNjAwX2dldF9paF93cHRyKHJkZXYpOworCXUzMiBycHRyID0gcmRldi0+aWgucnB0cjsKKwl1MzIgc3JjX2lkLCBzcmNfZGF0YTsKKwl1MzIgbGFzdF9lbnRyeSA9IHJkZXYtPmloLnJpbmdfc2l6ZSAtIDE2OworCXUzMiByaW5nX2luZGV4LCBkaXNwX2ludCwgZGlzcF9pbnRfY29udCwgZGlzcF9pbnRfY29udDI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIHF1ZXVlX2hvdHBsdWcgPSBmYWxzZTsKKworCURSTV9ERUJVRygicjYwMF9pcnFfcHJvY2VzcyBzdGFydDogcnB0ciAlZCwgd3B0ciAlZFxuIiwgcnB0ciwgd3B0cik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmRldi0+aWgubG9jaywgZmxhZ3MpOworCisJaWYgKHJwdHIgPT0gd3B0cikgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZGV2LT5paC5sb2NrLCBmbGFncyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJaWYgKHJkZXYtPnNodXRkb3duKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJkZXYtPmloLmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworcmVzdGFydF9paDoKKwkvKiBkaXNwbGF5IGludGVycnVwdHMgKi8KKwlyNjAwX2lycV9hY2socmRldiwgJmRpc3BfaW50LCAmZGlzcF9pbnRfY29udCwgJmRpc3BfaW50X2NvbnQyKTsKKworCXJkZXYtPmloLndwdHIgPSB3cHRyOworCXdoaWxlIChycHRyICE9IHdwdHIpIHsKKwkJLyogd3B0ci9ycHRyIGFyZSBpbiBieXRlcyEgKi8KKwkJcmluZ19pbmRleCA9IHJwdHIgLyA0OworCQlzcmNfaWQgPSAgcmRldi0+aWgucmluZ1tyaW5nX2luZGV4XSAmIDB4ZmY7CisJCXNyY19kYXRhID0gcmRldi0+aWgucmluZ1tyaW5nX2luZGV4ICsgMV0gJiAweGZmZmZmZmY7CisKKwkJc3dpdGNoIChzcmNfaWQpIHsKKwkJY2FzZSAxOiAvKiBEMSB2YmxhbmsvdmxpbmUgKi8KKwkJCXN3aXRjaCAoc3JjX2RhdGEpIHsKKwkJCWNhc2UgMDogLyogRDEgdmJsYW5rICovCisJCQkJaWYgKGRpc3BfaW50ICYgTEJfRDFfVkJMQU5LX0lOVEVSUlVQVCkgeworCQkJCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCAwKTsKKwkJCQkJZGlzcF9pbnQgJj0gfkxCX0QxX1ZCTEFOS19JTlRFUlJVUFQ7CisJCQkJCURSTV9ERUJVRygiSUg6IEQxIHZibGFua1xuIik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAxOiAvKiBEMSB2bGluZSAqLworCQkJCWlmIChkaXNwX2ludCAmIExCX0QxX1ZMSU5FX0lOVEVSUlVQVCkgeworCQkJCQlkaXNwX2ludCAmPSB+TEJfRDFfVkxJTkVfSU5URVJSVVBUOworCQkJCQlEUk1fREVCVUcoIklIOiBEMSB2bGluZVxuIik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlEUk1fRVJST1IoIlVuaGFuZGxlZCBpbnRlcnJ1cHQ6ICVkICVkXG4iLCBzcmNfaWQsIHNyY19kYXRhKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDU6IC8qIEQyIHZibGFuay92bGluZSAqLworCQkJc3dpdGNoIChzcmNfZGF0YSkgeworCQkJY2FzZSAwOiAvKiBEMiB2YmxhbmsgKi8KKwkJCQlpZiAoZGlzcF9pbnQgJiBMQl9EMl9WQkxBTktfSU5URVJSVVBUKSB7CisJCQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDEpOworCQkJCQlkaXNwX2ludCAmPSB+TEJfRDJfVkJMQU5LX0lOVEVSUlVQVDsKKwkJCQkJRFJNX0RFQlVHKCJJSDogRDIgdmJsYW5rXG4iKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDE6IC8qIEQxIHZsaW5lICovCisJCQkJaWYgKGRpc3BfaW50ICYgTEJfRDJfVkxJTkVfSU5URVJSVVBUKSB7CisJCQkJCWRpc3BfaW50ICY9IH5MQl9EMl9WTElORV9JTlRFUlJVUFQ7CisJCQkJCURSTV9ERUJVRygiSUg6IEQyIHZsaW5lXG4iKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCURSTV9FUlJPUigiVW5oYW5kbGVkIGludGVycnVwdDogJWQgJWRcbiIsIHNyY19pZCwgc3JjX2RhdGEpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMTk6IC8qIEhQRC9EQUMgaG90cGx1ZyAqLworCQkJc3dpdGNoIChzcmNfZGF0YSkgeworCQkJY2FzZSAwOgorCQkJCWlmIChkaXNwX2ludCAmIERDX0hQRDFfSU5URVJSVVBUKSB7CisJCQkJCWRpc3BfaW50ICY9IH5EQ19IUEQxX0lOVEVSUlVQVDsKKwkJCQkJcXVldWVfaG90cGx1ZyA9IHRydWU7CisJCQkJCURSTV9ERUJVRygiSUg6IEhQRDFcbiIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlpZiAoZGlzcF9pbnQgJiBEQ19IUEQyX0lOVEVSUlVQVCkgeworCQkJCQlkaXNwX2ludCAmPSB+RENfSFBEMl9JTlRFUlJVUFQ7CisJCQkJCXF1ZXVlX2hvdHBsdWcgPSB0cnVlOworCQkJCQlEUk1fREVCVUcoIklIOiBIUEQyXG4iKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJaWYgKGRpc3BfaW50X2NvbnQgJiBEQ19IUEQzX0lOVEVSUlVQVCkgeworCQkJCQlkaXNwX2ludF9jb250ICY9IH5EQ19IUEQzX0lOVEVSUlVQVDsKKwkJCQkJcXVldWVfaG90cGx1ZyA9IHRydWU7CisJCQkJCURSTV9ERUJVRygiSUg6IEhQRDNcbiIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQlpZiAoZGlzcF9pbnRfY29udCAmIERDX0hQRDRfSU5URVJSVVBUKSB7CisJCQkJCWRpc3BfaW50X2NvbnQgJj0gfkRDX0hQRDRfSU5URVJSVVBUOworCQkJCQlxdWV1ZV9ob3RwbHVnID0gdHJ1ZTsKKwkJCQkJRFJNX0RFQlVHKCJJSDogSFBENFxuIik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAxMDoKKwkJCQlpZiAoZGlzcF9pbnRfY29udDIgJiBEQ19IUEQ1X0lOVEVSUlVQVCkgeworCQkJCQlkaXNwX2ludF9jb250ICY9IH5EQ19IUEQ1X0lOVEVSUlVQVDsKKwkJCQkJcXVldWVfaG90cGx1ZyA9IHRydWU7CisJCQkJCURSTV9ERUJVRygiSUg6IEhQRDVcbiIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgMTI6CisJCQkJaWYgKGRpc3BfaW50X2NvbnQyICYgRENfSFBENl9JTlRFUlJVUFQpIHsKKwkJCQkJZGlzcF9pbnRfY29udCAmPSB+RENfSFBENl9JTlRFUlJVUFQ7CisJCQkJCXF1ZXVlX2hvdHBsdWcgPSB0cnVlOworCQkJCQlEUk1fREVCVUcoIklIOiBIUEQ2XG4iKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCURSTV9FUlJPUigiVW5oYW5kbGVkIGludGVycnVwdDogJWQgJWRcbiIsIHNyY19pZCwgc3JjX2RhdGEpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMTc2OiAvKiBDUF9JTlQgaW4gcmluZyBidWZmZXIgKi8KKwkJY2FzZSAxNzc6IC8qIENQX0lOVCBpbiBJQjEgKi8KKwkJY2FzZSAxNzg6IC8qIENQX0lOVCBpbiBJQjIgKi8KKwkJCURSTV9ERUJVRygiSUg6IENQIGludDogMHglMDh4XG4iLCBzcmNfZGF0YSk7CisJCQlyYWRlb25fZmVuY2VfcHJvY2VzcyhyZGV2KTsKKwkJCWJyZWFrOworCQljYXNlIDE4MTogLyogQ1AgRU9QIGV2ZW50ICovCisJCQlEUk1fREVCVUcoIklIOiBDUCBFT1BcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEUk1fRVJST1IoIlVuaGFuZGxlZCBpbnRlcnJ1cHQ6ICVkICVkXG4iLCBzcmNfaWQsIHNyY19kYXRhKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogd3B0ci9ycHRyIGFyZSBpbiBieXRlcyEgKi8KKwkJaWYgKHJwdHIgPT0gbGFzdF9lbnRyeSkKKwkJCXJwdHIgPSAwOworCQllbHNlCisJCQlycHRyICs9IDE2OworCX0KKwkvKiBtYWtlIHN1cmUgd3B0ciBoYXNuJ3QgY2hhbmdlZCB3aGlsZSBwcm9jZXNzaW5nICovCisJd3B0ciA9IHI2MDBfZ2V0X2loX3dwdHIocmRldik7CisJaWYgKHdwdHIgIT0gcmRldi0+aWgud3B0cikKKwkJZ290byByZXN0YXJ0X2loOworCWlmIChxdWV1ZV9ob3RwbHVnKQorCQlxdWV1ZV93b3JrKHJkZXYtPndxLCAmcmRldi0+aG90cGx1Z193b3JrKTsKKwlyZGV2LT5paC5ycHRyID0gcnB0cjsKKwlXUkVHMzIoSUhfUkJfUlBUUiwgcmRldi0+aWgucnB0cik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmRldi0+aWgubG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KIAogLyoKICAqIERlYnVnZnMgaW5mbwpAQCAtMTgxMSwyMSArMjgzMiwyMSBAQAogCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gKHN0cnVjdCBkcm1faW5mb19ub2RlICopIG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXVpbnQzMl90IHJkcCwgd2RwOwogCXVuc2lnbmVkIGNvdW50LCBpLCBqOwogCiAJcmFkZW9uX3JpbmdfZnJlZV9zaXplKHJkZXYpOwotCXJkcCA9IFJSRUczMihDUF9SQl9SUFRSKTsKLQl3ZHAgPSBSUkVHMzIoQ1BfUkJfV1BUUik7Ci0JY291bnQgPSAocmRwICsgcmRldi0+Y3AucmluZ19zaXplIC0gd2RwKSAmIHJkZXYtPmNwLnB0cl9tYXNrOworCWNvdW50ID0gKHJkZXYtPmNwLnJpbmdfc2l6ZSAvIDQpIC0gcmRldi0+Y3AucmluZ19mcmVlX2R3OwogCXNlcV9wcmludGYobSwgIkNQX1NUQVQgMHglMDh4XG4iLCBSUkVHMzIoQ1BfU1RBVCkpOwotCXNlcV9wcmludGYobSwgIkNQX1JCX1dQVFIgMHglMDh4XG4iLCB3ZHApOwotCXNlcV9wcmludGYobSwgIkNQX1JCX1JQVFIgMHglMDh4XG4iLCByZHApOworCXNlcV9wcmludGYobSwgIkNQX1JCX1dQVFIgMHglMDh4XG4iLCBSUkVHMzIoQ1BfUkJfV1BUUikpOworCXNlcV9wcmludGYobSwgIkNQX1JCX1JQVFIgMHglMDh4XG4iLCBSUkVHMzIoQ1BfUkJfUlBUUikpOworCXNlcV9wcmludGYobSwgImRyaXZlcidzIGNvcHkgb2YgdGhlIENQX1JCX1dQVFIgMHglMDh4XG4iLCByZGV2LT5jcC53cHRyKTsKKwlzZXFfcHJpbnRmKG0sICJkcml2ZXIncyBjb3B5IG9mIHRoZSBDUF9SQl9SUFRSIDB4JTA4eFxuIiwgcmRldi0+Y3AucnB0cik7CiAJc2VxX3ByaW50ZihtLCAiJXUgZnJlZSBkd29yZHMgaW4gcmluZ1xuIiwgcmRldi0+Y3AucmluZ19mcmVlX2R3KTsKIAlzZXFfcHJpbnRmKG0sICIldSBkd29yZHMgaW4gcmluZ1xuIiwgY291bnQpOworCWkgPSByZGV2LT5jcC5ycHRyOwogCWZvciAoaiA9IDA7IGogPD0gY291bnQ7IGorKykgewotCQlpID0gKHJkcCArIGopICYgcmRldi0+Y3AucHRyX21hc2s7CiAJCXNlcV9wcmludGYobSwgInJbJTA0ZF09MHglMDh4XG4iLCBpLCByZGV2LT5jcC5yaW5nW2ldKTsKKwkJaSA9IChpICsgMSkgJiByZGV2LT5jcC5wdHJfbWFzazsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfYmxpdF9rbXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9ibGl0X2ttcy5jCmluZGV4IGRiZjcxNmUuLjlhZWNhZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9ibGl0X2ttcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9ibGl0X2ttcy5jCkBAIC00NzMsOSArNDczLDggQEAKIAlvYmpfc2l6ZSArPSByNnh4X3BzX3NpemUgKiA0OwogCW9ial9zaXplID0gQUxJR04ob2JqX3NpemUsIDI1Nik7CiAKLQlyID0gcmFkZW9uX29iamVjdF9jcmVhdGUocmRldiwgTlVMTCwgb2JqX3NpemUsCi0JCQkJIHRydWUsIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sCi0JCQkJIGZhbHNlLCAmcmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopOworCXIgPSByYWRlb25fYm9fY3JlYXRlKHJkZXYsIE5VTEwsIG9ial9zaXplLCB0cnVlLCBSQURFT05fR0VNX0RPTUFJTl9WUkFNLAorCQkJCSZyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaik7CiAJaWYgKHIpIHsKIAkJRFJNX0VSUk9SKCJyNjAwIGZhaWxlZCB0byBhbGxvY2F0ZSBzaGFkZXJcbiIpOwogCQlyZXR1cm4gcjsKQEAgLTQ4NSwxMiArNDg0LDE0IEBACiAJCSAgb2JqX3NpemUsCiAJCSAgcmRldi0+cjYwMF9ibGl0LnZzX29mZnNldCwgcmRldi0+cjYwMF9ibGl0LnBzX29mZnNldCk7CiAKLQlyID0gcmFkZW9uX29iamVjdF9rbWFwKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqLCAmcHRyKTsKKwlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmosIGZhbHNlKTsKKwlpZiAodW5saWtlbHkociAhPSAwKSkKKwkJcmV0dXJuIHI7CisJciA9IHJhZGVvbl9ib19rbWFwKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqLCAmcHRyKTsKIAlpZiAocikgewogCQlEUk1fRVJST1IoImZhaWxlZCB0byBtYXAgYmxpdCBvYmplY3QgJWRcbiIsIHIpOwogCQlyZXR1cm4gcjsKIAl9Ci0KIAlpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUlY3NzApCiAJCW1lbWNweV90b2lvKHB0ciArIHJkZXYtPnI2MDBfYmxpdC5zdGF0ZV9vZmZzZXQsCiAJCQkgICAgcjd4eF9kZWZhdWx0X3N0YXRlLCByZGV2LT5yNjAwX2JsaXQuc3RhdGVfbGVuICogNCk7CkBAIC01MDAsMTkgKzUwMSwyNiBAQAogCWlmIChudW1fcGFja2V0MnMpCiAJCW1lbWNweV90b2lvKHB0ciArIHJkZXYtPnI2MDBfYmxpdC5zdGF0ZV9vZmZzZXQgKyAocmRldi0+cjYwMF9ibGl0LnN0YXRlX2xlbiAqIDQpLAogCQkJICAgIHBhY2tldDJzLCBudW1fcGFja2V0MnMgKiA0KTsKLQotCiAJbWVtY3B5KHB0ciArIHJkZXYtPnI2MDBfYmxpdC52c19vZmZzZXQsIHI2eHhfdnMsIHI2eHhfdnNfc2l6ZSAqIDQpOwogCW1lbWNweShwdHIgKyByZGV2LT5yNjAwX2JsaXQucHNfb2Zmc2V0LCByNnh4X3BzLCByNnh4X3BzX3NpemUgKiA0KTsKLQotCXJhZGVvbl9vYmplY3Rfa3VubWFwKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKKwlyYWRlb25fYm9fa3VubWFwKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKKwlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKIAlyZXR1cm4gMDsKIH0KIAogdm9pZCByNjAwX2JsaXRfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQlyYWRlb25fb2JqZWN0X3VucGluKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKLQlyYWRlb25fb2JqZWN0X3VucmVmKCZyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaik7CisJaW50IHI7CisKKwlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmosIGZhbHNlKTsKKwlpZiAodW5saWtlbHkociAhPSAwKSkgeworCQlkZXZfZXJyKHJkZXYtPmRldiwgIiglZCkgY2FuJ3QgZmluaXNoIHI2MDAgYmxpdFxuIiwgcik7CisJCWdvdG8gb3V0X3VucmVmOworCX0KKwlyYWRlb25fYm9fdW5waW4ocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopOworCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopOworb3V0X3VucmVmOgorCXJhZGVvbl9ib191bnJlZigmcmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopOwogfQogCiBpbnQgcjYwMF92Yl9pYl9nZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCkBAIC01NjksOSArNTc3LDkgQEAKIAlyaW5nX3NpemUgPSBudW1fbG9vcHMgKiBkd29yZHNfcGVyX2xvb3A7CiAJLyogc2V0IGRlZmF1bHQgICsgc2hhZGVycyAqLwogCXJpbmdfc2l6ZSArPSA0MDsgLyogc2hhZGVycyArIGRlZiBzdGF0ZSAqLwotCXJpbmdfc2l6ZSArPSAzOyAvKiBmZW5jZSBlbWl0IGZvciBWQiBJQiAqLworCXJpbmdfc2l6ZSArPSA1OyAvKiBmZW5jZSBlbWl0IGZvciBWQiBJQiAqLwogCXJpbmdfc2l6ZSArPSA1OyAvKiBkb25lIGNvcHkgKi8KLQlyaW5nX3NpemUgKz0gMzsgLyogZmVuY2UgZW1pdCBmb3IgZG9uZSBjb3B5ICovCisJcmluZ19zaXplICs9IDU7IC8qIGZlbmNlIGVtaXQgZm9yIGRvbmUgY29weSAqLwogCXIgPSByYWRlb25fcmluZ19sb2NrKHJkZXYsIHJpbmdfc2l6ZSk7CiAJV0FSTl9PTihyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwZC5oCmluZGV4IDI3YWI0MjguLjA1ODk0ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMGQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBkLmgKQEAgLTQ1Niw3ICs0NTYsMjE1IEBACiAjZGVmaW5lICAgICAgICAgV0FJVF8yRF9JRExFQ0xFQU5fYml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTYpCiAjZGVmaW5lICAgICAgICAgV0FJVF8zRF9JRExFQ0xFQU5fYml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTcpCiAKKyNkZWZpbmUgSUhfUkJfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNlMDAKKyMgICAgICAgZGVmaW5lIElIX1JCX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorIyAgICAgICBkZWZpbmUgSUhfSUJfU0laRSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeCkgPDwgMSkgLyogbG9nMiAqLworIyAgICAgICBkZWZpbmUgSUhfUkJfRlVMTF9EUkFJTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICgxIDw8IDYpCisjICAgICAgIGRlZmluZSBJSF9XUFRSX1dSSVRFQkFDS19FTkFCTEUgICAgICAgICAgICAgICAgICAgKDEgPDwgOCkKKyMgICAgICAgZGVmaW5lIElIX1dQVFJfV1JJVEVCQUNLX1RJTUVSKHgpICAgICAgICAgICAgICAgICAoKHgpIDw8IDkpIC8qIGxvZzIgKi8KKyMgICAgICAgZGVmaW5lIElIX1dQVFJfT1ZFUkZMT1dfRU5BQkxFICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNikKKyMgICAgICAgZGVmaW5lIElIX1dQVFJfT1ZFUkZMT1dfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAoMSA8PCAzMSkKKyNkZWZpbmUgSUhfUkJfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNlMDQKKyNkZWZpbmUgSUhfUkJfUlBUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNlMDgKKyNkZWZpbmUgSUhfUkJfV1BUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNlMGMKKyMgICAgICAgZGVmaW5lIFJCX09WRVJGTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorIyAgICAgICBkZWZpbmUgV1BUUl9PRkZTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2ZmZmMKKyNkZWZpbmUgSUhfUkJfV1BUUl9BRERSX0hJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNlMTAKKyNkZWZpbmUgSUhfUkJfV1BUUl9BRERSX0xPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNlMTQKKyNkZWZpbmUgSUhfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNlMTgKKyMgICAgICAgZGVmaW5lIEVOQUJMRV9JTlRSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorIyAgICAgICBkZWZpbmUgSUhfTUNfU1dBUCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeCkgPDwgMikKKyMgICAgICAgZGVmaW5lIElIX01DX1NXQVBfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBJSF9NQ19TV0FQXzE2QklUICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorIyAgICAgICBkZWZpbmUgSUhfTUNfU1dBUF8zMkJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyMgICAgICAgZGVmaW5lIElIX01DX1NXQVBfNjRCSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAzCisjICAgICAgIGRlZmluZSBSUFRSX1JFQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNCkKKyMgICAgICAgZGVmaW5lIE1DX1dSUkVRX0NSRURJVCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKHgpIDw8IDE1KQorIyAgICAgICBkZWZpbmUgTUNfV1JfQ0xFQU5fQ05UKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoeCkgPDwgMjApCiAKKyNkZWZpbmUgUkxDX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNmMDAKKyMgICAgICAgZGVmaW5lIFJMQ19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBSTENfSEJfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2YxMAorI2RlZmluZSBSTENfSEJfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2YwYworI2RlZmluZSBSTENfSEJfUlBUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2YyMAorI2RlZmluZSBSTENfSEJfV1BUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2YxYworI2RlZmluZSBSTENfSEJfV1BUUl9MU0JfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2YxNAorI2RlZmluZSBSTENfSEJfV1BUUl9NU0JfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2YxOAorI2RlZmluZSBSTENfTUNfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2Y0NAorI2RlZmluZSBSTENfVUNPREVfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2Y0OAorI2RlZmluZSBSTENfVUNPREVfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2YyYworI2RlZmluZSBSTENfVUNPREVfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2YzMAorCisjZGVmaW5lIFNSQk1fU09GVF9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhlNjAKKyMgICAgICAgZGVmaW5lIFNPRlRfUkVTRVRfUkxDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMykKKworI2RlZmluZSBDUF9JTlRfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YzEyNAorIyAgICAgICBkZWZpbmUgQ05UWF9CVVNZX0lOVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE5KQorIyAgICAgICBkZWZpbmUgQ05UWF9FTVBUWV9JTlRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDIwKQorIyAgICAgICBkZWZpbmUgU0NSQVRDSF9JTlRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI1KQorIyAgICAgICBkZWZpbmUgVElNRV9TVEFNUF9JTlRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI2KQorIyAgICAgICBkZWZpbmUgSUIyX0lOVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI5KQorIyAgICAgICBkZWZpbmUgSUIxX0lOVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDMwKQorIyAgICAgICBkZWZpbmUgUkJfSU5UX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDMxKQorI2RlZmluZSBDUF9JTlRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YzEyOAorIyAgICAgICBkZWZpbmUgU0NSQVRDSF9JTlRfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI1KQorIyAgICAgICBkZWZpbmUgVElNRV9TVEFNUF9JTlRfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI2KQorIyAgICAgICBkZWZpbmUgSUIyX0lOVF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI5KQorIyAgICAgICBkZWZpbmUgSUIxX0lOVF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDMwKQorIyAgICAgICBkZWZpbmUgUkJfSU5UX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDMxKQorCisjZGVmaW5lIEdSQk1fSU5UX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDYwCisjICAgICAgIGRlZmluZSBSREVSUl9JTlRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKyMgICAgICAgZGVmaW5lIFdBSVRfQ09VTlRfVElNRU9VVF9JTlRfRU5BQkxFICAgICAgICAgICAgICAoMSA8PCAxKQorIyAgICAgICBkZWZpbmUgR1VJX0lETEVfSU5UX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE5KQorCisjZGVmaW5lIElOVEVSUlVQVF9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1NDY4CisjICAgICAgIGRlZmluZSBJSF9EVU1NWV9SRF9PVkVSUklERSAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKyMgICAgICAgZGVmaW5lIElIX0RVTU1ZX1JEX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxKQorIyAgICAgICBkZWZpbmUgSUhfUkVRX05PTlNOT09QX0VOICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDMpCisjICAgICAgIGRlZmluZSBHRU5fSUhfSU5UX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgOCkKKyNkZWZpbmUgSU5URVJSVVBUX0NOVEwyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU0NmMKKworI2RlZmluZSBEMU1PREVfVkJMQU5LX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjUzNAorI2RlZmluZSBEMk1PREVfVkJMQU5LX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmQzNAorIyAgICAgICBkZWZpbmUgRHhNT0RFX1ZCTEFOS19PQ0NVUlJFRCAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCisjICAgICAgIGRlZmluZSBEeE1PREVfVkJMQU5LX0FDSyAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNCkKKyMgICAgICAgZGVmaW5lIER4TU9ERV9WQkxBTktfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMikKKyMgICAgICAgZGVmaW5lIER4TU9ERV9WQkxBTktfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNikKKyMgICAgICAgZGVmaW5lIER4TU9ERV9WQkxBTktfSU5URVJSVVBUX1RZUEUgICAgICAgICAgICAgICAoMSA8PCAxNykKKyNkZWZpbmUgRDFNT0RFX1ZMSU5FX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY1M2MKKyNkZWZpbmUgRDJNT0RFX1ZMSU5FX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZkM2MKKyMgICAgICAgZGVmaW5lIER4TU9ERV9WTElORV9PQ0NVUlJFRCAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorIyAgICAgICBkZWZpbmUgRHhNT0RFX1ZMSU5FX0FDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDQpCisjICAgICAgIGRlZmluZSBEeE1PREVfVkxJTkVfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTIpCisjICAgICAgIGRlZmluZSBEeE1PREVfVkxJTkVfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTYpCisjICAgICAgIGRlZmluZSBEeE1PREVfVkxJTkVfSU5URVJSVVBUX1RZUEUgICAgICAgICAgICAgICAgKDEgPDwgMTcpCisjZGVmaW5lIER4TU9ERV9JTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NTQwCisjICAgICAgIGRlZmluZSBEMU1PREVfVkJMQU5LX0lOVF9NQVNLICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKyMgICAgICAgZGVmaW5lIEQxTU9ERV9WTElORV9JTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA0KQorIyAgICAgICBkZWZpbmUgRDJNT0RFX1ZCTEFOS19JTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgICgxIDw8IDgpCisjICAgICAgIGRlZmluZSBEMk1PREVfVkxJTkVfSU5UX01BU0sgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTIpCisjZGVmaW5lIERDRTNfRElTUF9JTlRFUlJVUFRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZGRjCisjICAgICAgIGRlZmluZSBEQ19IUEQxX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTgpCisjICAgICAgIGRlZmluZSBEQ19IUEQyX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTkpCisjZGVmaW5lIERJU1BfSU5URVJSVVBUX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZWRjCisjICAgICAgIGRlZmluZSBMQl9EMV9WTElORV9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMikKKyMgICAgICAgZGVmaW5lIExCX0QyX1ZMSU5FX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAzKQorIyAgICAgICBkZWZpbmUgTEJfRDFfVkJMQU5LX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICgxIDw8IDQpCisjICAgICAgIGRlZmluZSBMQl9EMl9WQkxBTktfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNSkKKyMgICAgICAgZGVmaW5lIERBQ0FfQVVUT0RFVEVDVF9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAoMSA8PCAxNikKKyMgICAgICAgZGVmaW5lIERBQ0JfQVVUT0RFVEVDVF9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAoMSA8PCAxNykKKyMgICAgICAgZGVmaW5lIERDX0hPVF9QTFVHX0RFVEVDVDFfSU5URVJSVVBUICAgICAgICAgICAgICAoMSA8PCAxOCkKKyMgICAgICAgZGVmaW5lIERDX0hPVF9QTFVHX0RFVEVDVDJfSU5URVJSVVBUICAgICAgICAgICAgICAoMSA8PCAxOSkKKyMgICAgICAgZGVmaW5lIERDX0kyQ19TV19ET05FX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAoMSA8PCAyMCkKKyMgICAgICAgZGVmaW5lIERDX0kyQ19IV19ET05FX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAoMSA8PCAyMSkKKyNkZWZpbmUgRElTUF9JTlRFUlJVUFRfU1RBVFVTX0NPTlRJTlVFICAgICAgICAgICAgICAgICAgICAweDdlZTgKKyNkZWZpbmUgRENFM19ESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUUgICAgICAgICAgICAgICAweDdkZTgKKyMgICAgICAgZGVmaW5lIERDX0hQRDRfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNCkKKyMgICAgICAgZGVmaW5lIERDX0hQRDRfUlhfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNSkKKyMgICAgICAgZGVmaW5lIERDX0hQRDNfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyOCkKKyMgICAgICAgZGVmaW5lIERDX0hQRDFfUlhfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyOSkKKyMgICAgICAgZGVmaW5lIERDX0hQRDJfUlhfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAzMCkKKyNkZWZpbmUgRENFM19ESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUUyICAgICAgICAgICAgICAweDdkZWMKKyMgICAgICAgZGVmaW5lIERDX0hQRDNfUlhfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorIyAgICAgICBkZWZpbmUgRElHQV9EUF9WSURfU1RSRUFNX0RJU0FCTEVfSU5URVJSVVBUICAgICAgICgxIDw8IDEpCisjICAgICAgIGRlZmluZSBESUdBX0RQX1NURUVSX0ZJRk9fT1ZFUkZMT1dfSU5URVJSVVBUICAgICAgKDEgPDwgMikKKyMgICAgICAgZGVmaW5lIERJR0JfRFBfVklEX1NUUkVBTV9ESVNBQkxFX0lOVEVSUlVQVCAgICAgICAoMSA8PCAzKQorIyAgICAgICBkZWZpbmUgRElHQl9EUF9TVEVFUl9GSUZPX09WRVJGTE9XX0lOVEVSUlVQVCAgICAgICgxIDw8IDQpCisjICAgICAgIGRlZmluZSBBVVgxX1NXX0RPTkVfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNSkKKyMgICAgICAgZGVmaW5lIEFVWDFfTFNfRE9ORV9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAoMSA8PCA2KQorIyAgICAgICBkZWZpbmUgQVVYMl9TV19ET05FX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICgxIDw8IDcpCisjICAgICAgIGRlZmluZSBBVVgyX0xTX0RPTkVfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgKDEgPDwgOCkKKyMgICAgICAgZGVmaW5lIEFVWDNfU1dfRE9ORV9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAoMSA8PCA5KQorIyAgICAgICBkZWZpbmUgQVVYM19MU19ET05FX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEwKQorIyAgICAgICBkZWZpbmUgQVVYNF9TV19ET05FX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICgxIDw8IDExKQorIyAgICAgICBkZWZpbmUgQVVYNF9MU19ET05FX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEyKQorIyAgICAgICBkZWZpbmUgRElHQV9EUF9GQVNUX1RSQUlOSU5HX0NPTVBMRVRFX0lOVEVSUlVQVCAgICgxIDw8IDEzKQorIyAgICAgICBkZWZpbmUgRElHQl9EUF9GQVNUX1RSQUlOSU5HX0NPTVBMRVRFX0lOVEVSUlVQVCAgICgxIDw8IDE0KQorLyogRENFIDMuMiAqLworIyAgICAgICBkZWZpbmUgQVVYNV9TV19ET05FX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE1KQorIyAgICAgICBkZWZpbmUgQVVYNV9MU19ET05FX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE2KQorIyAgICAgICBkZWZpbmUgQVVYNl9TV19ET05FX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE3KQorIyAgICAgICBkZWZpbmUgQVVYNl9MU19ET05FX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE4KQorIyAgICAgICBkZWZpbmUgRENfSFBENV9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE5KQorIyAgICAgICBkZWZpbmUgRENfSFBENV9SWF9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDIwKQorIyAgICAgICBkZWZpbmUgRENfSFBENl9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDIxKQorIyAgICAgICBkZWZpbmUgRENfSFBENl9SWF9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDIyKQorCisjZGVmaW5lIERBQ0FfQVVUT19ERVRFQ1RfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ODI4CisjZGVmaW5lIERBQ0JfQVVUT19ERVRFQ1RfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3YTI4CisjZGVmaW5lIERDRTNfREFDQV9BVVRPX0RFVEVDVF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHg3MDI4CisjZGVmaW5lIERDRTNfREFDQl9BVVRPX0RFVEVDVF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHg3MTI4CisjICAgICAgIGRlZmluZSBEQUN4X0FVVE9ERVRFQ1RfTU9ERSh4KSAgICAgICAgICAgICAgICAgICAgKCh4KSA8PCAwKQorIyAgICAgICBkZWZpbmUgREFDeF9BVVRPREVURUNUX01PREVfTk9ORSAgICAgICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIERBQ3hfQVVUT0RFVEVDVF9NT0RFX0NPTk5FQ1QgICAgICAgICAgICAgICAxCisjICAgICAgIGRlZmluZSBEQUN4X0FVVE9ERVRFQ1RfTU9ERV9ESVNDT05ORUNUICAgICAgICAgICAgMgorIyAgICAgICBkZWZpbmUgREFDeF9BVVRPREVURUNUX0ZSQU1FX1RJTUVfQ09VTlRFUih4KSAgICAgICgoeCkgPDwgOCkKKy8qIGJpdCAxOCA9IFIvQywgMTcgPSBHL1ksIDE2ID0gQi9Db21wICovCisjICAgICAgIGRlZmluZSBEQUN4X0FVVE9ERVRFQ1RfQ0hFQ0tfTUFTSyh4KSAgICAgICAgICAgICAgKCh4KSA8PCAxNikKKworI2RlZmluZSBEQ0UzX0RBQ0FfQVVUT0RFVEVDVF9JTlRfQ09OVFJPTCAgICAgICAgICAgICAgICAgIDB4NzAzOAorI2RlZmluZSBEQ0UzX0RBQ0JfQVVUT0RFVEVDVF9JTlRfQ09OVFJPTCAgICAgICAgICAgICAgICAgIDB4NzEzOAorI2RlZmluZSBEQUNBX0FVVE9ERVRFQ1RfSU5UX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgIDB4NzgzOAorI2RlZmluZSBEQUNCX0FVVE9ERVRFQ1RfSU5UX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgIDB4N2EzOAorIyAgICAgICBkZWZpbmUgREFDeF9BVVRPREVURUNUX0FDSyAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCisjICAgICAgIGRlZmluZSBEQUN4X0FVVE9ERVRFQ1RfSU5UX0VOQUJMRSAgICAgICAgICAgICAgICAgKDEgPDwgMTYpCisKKyNkZWZpbmUgRENfSE9UX1BMVUdfREVURUNUMV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAweDdkMDAKKyNkZWZpbmUgRENfSE9UX1BMVUdfREVURUNUMl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAweDdkMTAKKyNkZWZpbmUgRENfSE9UX1BMVUdfREVURUNUM19DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAweDdkMjQKKyMgICAgICAgZGVmaW5lIERDX0hPVF9QTFVHX0RFVEVDVHhfRU4gICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorCisjZGVmaW5lIERDX0hPVF9QTFVHX0RFVEVDVDFfSU5UX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgMHg3ZDA0CisjZGVmaW5lIERDX0hPVF9QTFVHX0RFVEVDVDJfSU5UX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgMHg3ZDE0CisjZGVmaW5lIERDX0hPVF9QTFVHX0RFVEVDVDNfSU5UX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgMHg3ZDI4CisjICAgICAgIGRlZmluZSBEQ19IT1RfUExVR19ERVRFQ1R4X0lOVF9TVEFUVVMgICAgICAgICAgICAgKDEgPDwgMCkKKyMgICAgICAgZGVmaW5lIERDX0hPVF9QTFVHX0RFVEVDVHhfU0VOU0UgICAgICAgICAgICAgICAgICAoMSA8PCAxKQorCisvKiBEQ0UgMy4wICovCisjZGVmaW5lIERDX0hQRDFfSU5UX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZDAwCisjZGVmaW5lIERDX0hQRDJfSU5UX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZDBjCisjZGVmaW5lIERDX0hQRDNfSU5UX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZDE4CisjZGVmaW5lIERDX0hQRDRfSU5UX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZDI0CisvKiBEQ0UgMy4yICovCisjZGVmaW5lIERDX0hQRDVfSU5UX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZGMwCisjZGVmaW5lIERDX0hQRDZfSU5UX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZGY0CisjICAgICAgIGRlZmluZSBEQ19IUER4X0lOVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKyMgICAgICAgZGVmaW5lIERDX0hQRHhfU0VOU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxKQorIyAgICAgICBkZWZpbmUgRENfSFBEeF9SWF9JTlRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDgpCisKKyNkZWZpbmUgRENfSE9UX1BMVUdfREVURUNUMV9JTlRfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAweDdkMDgKKyNkZWZpbmUgRENfSE9UX1BMVUdfREVURUNUMl9JTlRfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAweDdkMTgKKyNkZWZpbmUgRENfSE9UX1BMVUdfREVURUNUM19JTlRfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAweDdkMmMKKyMgICAgICAgZGVmaW5lIERDX0hPVF9QTFVHX0RFVEVDVHhfSU5UX0FDSyAgICAgICAgICAgICAgICAoMSA8PCAwKQorIyAgICAgICBkZWZpbmUgRENfSE9UX1BMVUdfREVURUNUeF9JTlRfUE9MQVJJVFkgICAgICAgICAgICgxIDw8IDgpCisjICAgICAgIGRlZmluZSBEQ19IT1RfUExVR19ERVRFQ1R4X0lOVF9FTiAgICAgICAgICAgICAgICAgKDEgPDwgMTYpCisvKiBEQ0UgMy4wICovCisjZGVmaW5lIERDX0hQRDFfSU5UX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZDA0CisjZGVmaW5lIERDX0hQRDJfSU5UX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZDEwCisjZGVmaW5lIERDX0hQRDNfSU5UX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZDFjCisjZGVmaW5lIERDX0hQRDRfSU5UX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZDI4CisvKiBEQ0UgMy4yICovCisjZGVmaW5lIERDX0hQRDVfSU5UX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZGM0CisjZGVmaW5lIERDX0hQRDZfSU5UX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZGY4CisjICAgICAgIGRlZmluZSBEQ19IUER4X0lOVF9BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKyMgICAgICAgZGVmaW5lIERDX0hQRHhfSU5UX1BPTEFSSVRZICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA4KQorIyAgICAgICBkZWZpbmUgRENfSFBEeF9JTlRfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE2KQorIyAgICAgICBkZWZpbmUgRENfSFBEeF9SWF9JTlRfQUNLICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDIwKQorIyAgICAgICBkZWZpbmUgRENfSFBEeF9SWF9JTlRfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI0KQorCisvKiBEQ0UgMy4wICovCisjZGVmaW5lIERDX0hQRDFfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZDA4CisjZGVmaW5lIERDX0hQRDJfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZDE0CisjZGVmaW5lIERDX0hQRDNfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZDIwCisjZGVmaW5lIERDX0hQRDRfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZDJjCisvKiBEQ0UgMy4yICovCisjZGVmaW5lIERDX0hQRDVfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZGM4CisjZGVmaW5lIERDX0hQRDZfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZGZjCisjICAgICAgIGRlZmluZSBEQ19IUER4X0NPTk5FQ1RJT05fVElNRVIoeCkgICAgICAgICAgICAgICAgKCh4KSA8PCAwKQorIyAgICAgICBkZWZpbmUgRENfSFBEeF9SWF9JTlRfVElNRVIoeCkgICAgICAgICAgICAgICAgICAgICgoeCkgPDwgMTYpCisvKiBEQ0UgMy4yICovCisjICAgICAgIGRlZmluZSBEQ19IUER4X0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjgpCiAKIC8qCiAgKiBQTTQKQEAgLTUwMCw3ICs3MDgsNiBAQAogI2RlZmluZQlQQUNLRVQzX1dBSVRfUkVHX01FTQkJCQkweDNDCiAjZGVmaW5lCVBBQ0tFVDNfTUVNX1dSSVRFCQkJCTB4M0QKICNkZWZpbmUJUEFDS0VUM19JTkRJUkVDVF9CVUZGRVIJCQkJMHgzMgotI2RlZmluZQlQQUNLRVQzX0NQX0lOVEVSUlVQVAkJCQkweDQwCiAjZGVmaW5lCVBBQ0tFVDNfU1VSRkFDRV9TWU5DCQkJCTB4NDMKICMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX0NCMF9ERVNUX0JBU0VfRU5BICAgICgxIDw8IDYpCiAjICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19UQ19BQ1RJT05fRU5BICAgICAgICAoMSA8PCAyMykKQEAgLTY3NCw0ICs4ODEsNSBAQAogI2RlZmluZQkJU18wMDBFNjBfU09GVF9SRVNFVF9UU0MoeCkJCSgoKHgpICYgMSkgPDwgMTYpCiAjZGVmaW5lCQlTXzAwMEU2MF9TT0ZUX1JFU0VUX1ZNQyh4KQkJKCgoeCkgJiAxKSA8PCAxNykKIAorI2RlZmluZSBSXzAwNTQ4MF9IRFBfTUVNX0NPSEVSRU5DWV9GTFVTSF9DTlRMCQkweDU0ODAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb24uaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uLmgKaW5kZXggMjI0NTA2YS4uYzkzOGJiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb24uaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oCkBAIC0yOCw4ICsyOCw2IEBACiAjaWZuZGVmIF9fUkFERU9OX0hfXwogI2RlZmluZSBfX1JBREVPTl9IX18KIAotI2luY2x1ZGUgInJhZGVvbl9vYmplY3QuaCIKLQogLyogVE9ETzogSGVyZSBhcmUgdGhpbmdzIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSA6CiAgKgktIHN1cmZhY2UgYWxsb2NhdG9yICYgaW5pdGlhbGl6ZXIgOiAoYml0IGxpa2Ugc2NyYXRjaCByZWcpIHNob3VsZAogICoJICBpbml0aWFsaXplIEhEUF8gc3R1ZmYgb24gUlM2MDAsIFI2MDAsIFI3MDAgaHcsIHdlbGwgYW55dGhpbmdzCkBAIC02Nyw2ICs2NSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAKKyNpbmNsdWRlIDx0dG0vdHRtX2JvX2FwaS5oPgorI2luY2x1ZGUgPHR0bS90dG1fYm9fZHJpdmVyLmg+CisjaW5jbHVkZSA8dHRtL3R0bV9wbGFjZW1lbnQuaD4KKyNpbmNsdWRlIDx0dG0vdHRtX21vZHVsZS5oPgorCiAjaW5jbHVkZSAicmFkZW9uX2ZhbWlseS5oIgogI2luY2x1ZGUgInJhZGVvbl9tb2RlLmgiCiAjaW5jbHVkZSAicmFkZW9uX3JlZy5oIgpAQCAtODUsNiArODgsNyBAQAogZXh0ZXJuIGludCByYWRlb25fdGVzdGluZzsKIGV4dGVybiBpbnQgcmFkZW9uX2Nvbm5lY3Rvcl90YWJsZTsKIGV4dGVybiBpbnQgcmFkZW9uX3R2OworZXh0ZXJuIGludCByYWRlb25fbmV3X3BsbDsKIAogLyoKICAqIENvcHkgZnJvbSByYWRlb25fZHJ2Lmggc28gd2UgZG9uJ3QgaGF2ZSB0byBpbmNsdWRlIGJvdGggYW5kIGhhdmUgY29uZmxpY3RpbmcKQEAgLTE4Niw3NiArMTkwLDYyIEBACiAgKiBUaWxpbmcgcmVnaXN0ZXJzCiAgKi8KIHN0cnVjdCByYWRlb25fc3VyZmFjZV9yZWcgewotCXN0cnVjdCByYWRlb25fb2JqZWN0ICpyb2JqOworCXN0cnVjdCByYWRlb25fYm8gKmJvOwogfTsKIAogI2RlZmluZSBSQURFT05fR0VNX01BWF9TVVJGQUNFUyA4CiAKIC8qCi0gKiBSYWRlb24gYnVmZmVyLgorICogVFRNLgogICovCi1zdHJ1Y3QgcmFkZW9uX29iamVjdDsKK3N0cnVjdCByYWRlb25fbW1hbiB7CisJc3RydWN0IHR0bV9ib19nbG9iYWxfcmVmICAgICAgICBib19nbG9iYWxfcmVmOworCXN0cnVjdCB0dG1fZ2xvYmFsX3JlZmVyZW5jZQltZW1fZ2xvYmFsX3JlZjsKKwlib29sCQkJCW1lbV9nbG9iYWxfcmVmZXJlbmNlZDsKKwlzdHJ1Y3QgdHRtX2JvX2RldmljZQkJYmRldjsKK307CiAKLXN0cnVjdCByYWRlb25fb2JqZWN0X2xpc3Qgeworc3RydWN0IHJhZGVvbl9ibyB7CisJLyogUHJvdGVjdGVkIGJ5IGdlbS5tdXRleCAqLworCXN0cnVjdCBsaXN0X2hlYWQJCWxpc3Q7CisJLyogUHJvdGVjdGVkIGJ5IHRiby5yZXNlcnZlZCAqLworCXUzMgkJCQlwbGFjZW1lbnRzWzNdOworCXN0cnVjdCB0dG1fcGxhY2VtZW50CQlwbGFjZW1lbnQ7CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0CXRibzsKKwlzdHJ1Y3QgdHRtX2JvX2ttYXBfb2JqCQlrbWFwOworCXVuc2lnbmVkCQkJcGluX2NvdW50OworCXZvaWQJCQkJKmtwdHI7CisJdTMyCQkJCXRpbGluZ19mbGFnczsKKwl1MzIJCQkJcGl0Y2g7CisJaW50CQkJCXN1cmZhY2VfcmVnOworCS8qIENvbnN0YW50IGFmdGVyIGluaXRpYWxpemF0aW9uICovCisJc3RydWN0IHJhZGVvbl9kZXZpY2UJCSpyZGV2OworCXN0cnVjdCBkcm1fZ2VtX29iamVjdAkJKmdvYmo7Cit9OworCitzdHJ1Y3QgcmFkZW9uX2JvX2xpc3QgewogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKLQlzdHJ1Y3QgcmFkZW9uX29iamVjdAkqcm9iajsKKwlzdHJ1Y3QgcmFkZW9uX2JvCSpibzsKIAl1aW50NjRfdAkJZ3B1X29mZnNldDsKIAl1bnNpZ25lZAkJcmRvbWFpbjsKIAl1bnNpZ25lZAkJd2RvbWFpbjsKLQl1aW50MzJfdCAgICAgICAgICAgICAgICB0aWxpbmdfZmxhZ3M7CisJdTMyCQkJdGlsaW5nX2ZsYWdzOwogfTsKIAotaW50IHJhZGVvbl9vYmplY3RfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci12b2lkIHJhZGVvbl9vYmplY3RfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1pbnQgcmFkZW9uX29iamVjdF9jcmVhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCi0JCQkgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnb2JqLAotCQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCSBib29sIGtlcm5lbCwKLQkJCSB1aW50MzJfdCBkb21haW4sCi0JCQkgYm9vbCBpbnRlcnJ1cHRpYmxlLAotCQkJIHN0cnVjdCByYWRlb25fb2JqZWN0ICoqcm9ial9wdHIpOwotaW50IHJhZGVvbl9vYmplY3Rfa21hcChzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iaiwgdm9pZCAqKnB0cik7Ci12b2lkIHJhZGVvbl9vYmplY3Rfa3VubWFwKHN0cnVjdCByYWRlb25fb2JqZWN0ICpyb2JqKTsKLXZvaWQgcmFkZW9uX29iamVjdF91bnJlZihzdHJ1Y3QgcmFkZW9uX29iamVjdCAqKnJvYmopOwotaW50IHJhZGVvbl9vYmplY3RfcGluKHN0cnVjdCByYWRlb25fb2JqZWN0ICpyb2JqLCB1aW50MzJfdCBkb21haW4sCi0JCSAgICAgIHVpbnQ2NF90ICpncHVfYWRkcik7Ci12b2lkIHJhZGVvbl9vYmplY3RfdW5waW4oc3RydWN0IHJhZGVvbl9vYmplY3QgKnJvYmopOwotaW50IHJhZGVvbl9vYmplY3Rfd2FpdChzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iaik7Ci1pbnQgcmFkZW9uX29iamVjdF9idXN5X2RvbWFpbihzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iaiwgdWludDMyX3QgKmN1cl9wbGFjZW1lbnQpOwotaW50IHJhZGVvbl9vYmplY3RfZXZpY3RfdnJhbShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1pbnQgcmFkZW9uX29iamVjdF9tbWFwKHN0cnVjdCByYWRlb25fb2JqZWN0ICpyb2JqLCB1aW50NjRfdCAqb2Zmc2V0KTsKLXZvaWQgcmFkZW9uX29iamVjdF9mb3JjZV9kZWxldGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByYWRlb25fb2JqZWN0X2xpc3RfYWRkX29iamVjdChzdHJ1Y3QgcmFkZW9uX29iamVjdF9saXN0ICpsb2JqLAotCQkJCSAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwotaW50IHJhZGVvbl9vYmplY3RfbGlzdF92YWxpZGF0ZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCB2b2lkICpmZW5jZSk7Ci12b2lkIHJhZGVvbl9vYmplY3RfbGlzdF91bnZhbGlkYXRlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwotdm9pZCByYWRlb25fb2JqZWN0X2xpc3RfY2xlYW4oc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7Ci1pbnQgcmFkZW9uX29iamVjdF9mYmRldl9tbWFwKHN0cnVjdCByYWRlb25fb2JqZWN0ICpyb2JqLAotCQkJICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7Ci11bnNpZ25lZCBsb25nIHJhZGVvbl9vYmplY3Rfc2l6ZShzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iaik7Ci12b2lkIHJhZGVvbl9vYmplY3RfY2xlYXJfc3VyZmFjZV9yZWcoc3RydWN0IHJhZGVvbl9vYmplY3QgKnJvYmopOwotaW50IHJhZGVvbl9vYmplY3RfY2hlY2tfdGlsaW5nKHN0cnVjdCByYWRlb25fb2JqZWN0ICpyb2JqLCBib29sIGhhc19tb3ZlZCwKLQkJCSAgICAgICBib29sIGZvcmNlX2Ryb3ApOwotdm9pZCByYWRlb25fb2JqZWN0X3NldF90aWxpbmdfZmxhZ3Moc3RydWN0IHJhZGVvbl9vYmplY3QgKnJvYmosCi0JCQkJICAgIHVpbnQzMl90IHRpbGluZ19mbGFncywgdWludDMyX3QgcGl0Y2gpOwotdm9pZCByYWRlb25fb2JqZWN0X2dldF90aWxpbmdfZmxhZ3Moc3RydWN0IHJhZGVvbl9vYmplY3QgKnJvYmosIHVpbnQzMl90ICp0aWxpbmdfZmxhZ3MsIHVpbnQzMl90ICpwaXRjaCk7Ci12b2lkIHJhZGVvbl9ib19tb3ZlX25vdGlmeShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAotCQkJICAgc3RydWN0IHR0bV9tZW1fcmVnICptZW0pOwotdm9pZCByYWRlb25fYm9fZmF1bHRfcmVzZXJ2ZV9ub3RpZnkoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyk7CiAvKgogICogR0VNIG9iamVjdHMuCiAgKi8KIHN0cnVjdCByYWRlb25fZ2VtIHsKKwlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwogCXN0cnVjdCBsaXN0X2hlYWQJb2JqZWN0czsKIH07CiAKIGludCByYWRlb25fZ2VtX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCByYWRlb25fZ2VtX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHJhZGVvbl9nZW1fb2JqZWN0X2NyZWF0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IHNpemUsCi0JCQkgICAgIGludCBhbGlnbm1lbnQsIGludCBpbml0aWFsX2RvbWFpbiwKLQkJCSAgICAgYm9vbCBkaXNjYXJkYWJsZSwgYm9vbCBrZXJuZWwsCi0JCQkgICAgIGJvb2wgaW50ZXJydXB0aWJsZSwKLQkJCSAgICAgc3RydWN0IGRybV9nZW1fb2JqZWN0ICoqb2JqKTsKKwkJCQlpbnQgYWxpZ25tZW50LCBpbnQgaW5pdGlhbF9kb21haW4sCisJCQkJYm9vbCBkaXNjYXJkYWJsZSwgYm9vbCBrZXJuZWwsCisJCQkJc3RydWN0IGRybV9nZW1fb2JqZWN0ICoqb2JqKTsKIGludCByYWRlb25fZ2VtX29iamVjdF9waW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIHVpbnQzMl90IHBpbl9kb21haW4sCiAJCQkgIHVpbnQ2NF90ICpncHVfYWRkcik7CiB2b2lkIHJhZGVvbl9nZW1fb2JqZWN0X3VucGluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKQEAgLTI3MSw3ICsyNjEsNyBAQAogfTsKIAogc3RydWN0IHJhZGVvbl9nYXJ0X3RhYmxlX3ZyYW0gewotCXN0cnVjdCByYWRlb25fb2JqZWN0CQkqcm9iajsKKwlzdHJ1Y3QgcmFkZW9uX2JvCQkqcm9iajsKIAl2b2xhdGlsZSB1aW50MzJfdAkJKnB0cjsKIH07CiAKQEAgLTM1MiwxMSArMzQyLDE2IEBACiAJYm9vbAkJc3dfaW50OwogCS8qIEZJWE1FOiB1c2UgYSBkZWZpbmUgbWF4IGNydGMgcmF0aGVyIHRoYW4gaGFyZGNvZGUgaXQgKi8KIAlib29sCQljcnRjX3ZibGFua19pbnRbMl07CisJLyogRklYTUU6IHVzZSBkZWZpbmVzIGZvciBtYXggaHBkL2RhY3MgKi8KKwlib29sICAgICAgICAgICAgaHBkWzZdOworCXNwaW5sb2NrX3Qgc3dfbG9jazsKKwlpbnQgc3dfcmVmY291bnQ7CiB9OwogCiBpbnQgcmFkZW9uX2lycV9rbXNfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHJhZGVvbl9pcnFfa21zX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotCit2b2lkIHJhZGVvbl9pcnFfa21zX3N3X2lycV9nZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwordm9pZCByYWRlb25faXJxX2ttc19zd19pcnFfcHV0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIAogLyoKICAqIENQICYgcmluZy4KQEAgLTM3Niw3ICszNzEsNyBAQAogICovCiBzdHJ1Y3QgcmFkZW9uX2liX3Bvb2wgewogCXN0cnVjdCBtdXRleAkJbXV0ZXg7Ci0Jc3RydWN0IHJhZGVvbl9vYmplY3QJKnJvYmo7CisJc3RydWN0IHJhZGVvbl9ibwkqcm9iajsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXNjaGVkdWxlZF9pYnM7CiAJc3RydWN0IHJhZGVvbl9pYglpYnNbUkFERU9OX0lCX1BPT0xfU0laRV07CiAJYm9vbAkJCXJlYWR5OwpAQCAtMzg0LDcgKzM3OSw3IEBACiB9OwogCiBzdHJ1Y3QgcmFkZW9uX2NwIHsKLQlzdHJ1Y3QgcmFkZW9uX29iamVjdAkqcmluZ19vYmo7CisJc3RydWN0IHJhZGVvbl9ibwkqcmluZ19vYmo7CiAJdm9sYXRpbGUgdWludDMyX3QJKnJpbmc7CiAJdW5zaWduZWQJCXJwdHI7CiAJdW5zaWduZWQJCXdwdHI7CkBAIC0zOTksOCArMzk0LDI1IEBACiAJYm9vbAkJCXJlYWR5OwogfTsKIAorLyoKKyAqIFI2eHgrIElIIHJpbmcKKyAqLworc3RydWN0IHI2MDBfaWggeworCXN0cnVjdCByYWRlb25fYm8JKnJpbmdfb2JqOworCXZvbGF0aWxlIHVpbnQzMl90CSpyaW5nOworCXVuc2lnbmVkCQlycHRyOworCXVuc2lnbmVkCQl3cHRyOworCXVuc2lnbmVkCQl3cHRyX29sZDsKKwl1bnNpZ25lZAkJcmluZ19zaXplOworCXVpbnQ2NF90CQlncHVfYWRkcjsKKwl1aW50MzJfdAkJYWxpZ25fbWFzazsKKwl1aW50MzJfdAkJcHRyX21hc2s7CisJc3BpbmxvY2tfdCAgICAgICAgICAgICAgbG9jazsKKwlib29sICAgICAgICAgICAgICAgICAgICBlbmFibGVkOworfTsKKwogc3RydWN0IHI2MDBfYmxpdCB7Ci0Jc3RydWN0IHJhZGVvbl9vYmplY3QJKnNoYWRlcl9vYmo7CisJc3RydWN0IHJhZGVvbl9ibwkqc2hhZGVyX29iajsKIAl1NjQgc2hhZGVyX2dwdV9hZGRyOwogCXUzMiB2c19vZmZzZXQsIHBzX29mZnNldDsKIAl1MzIgc3RhdGVfb2Zmc2V0OwpAQCAtNDMwLDggKzQ0Miw4IEBACiAgKi8KIHN0cnVjdCByYWRlb25fY3NfcmVsb2MgewogCXN0cnVjdCBkcm1fZ2VtX29iamVjdAkJKmdvYmo7Ci0Jc3RydWN0IHJhZGVvbl9vYmplY3QJCSpyb2JqOwotCXN0cnVjdCByYWRlb25fb2JqZWN0X2xpc3QJbG9iajsKKwlzdHJ1Y3QgcmFkZW9uX2JvCQkqcm9iajsKKwlzdHJ1Y3QgcmFkZW9uX2JvX2xpc3QJCWxvYmo7CiAJdWludDMyX3QJCQloYW5kbGU7CiAJdWludDMyX3QJCQlmbGFnczsKIH07CkBAIC01MjcsNyArNTM5LDcgQEAKICAqIFdyaXRlYmFjawogICovCiBzdHJ1Y3QgcmFkZW9uX3diIHsKLQlzdHJ1Y3QgcmFkZW9uX29iamVjdAkqd2Jfb2JqOworCXN0cnVjdCByYWRlb25fYm8JKndiX29iajsKIAl2b2xhdGlsZSB1aW50MzJfdAkqd2I7CiAJdWludDY0X3QJCWdwdV9hZGRyOwogfTsKQEAgLTYzOSw2ICs2NTEsMTEgQEAKIAkJCSAgICAgICB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IG9ial9zaXplKTsKIAlpbnQgKCpjbGVhcl9zdXJmYWNlX3JlZykoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCByZWcpOwogCXZvaWQgKCpiYW5kd2lkdGhfdXBkYXRlKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CisJdm9pZCAoKmhkcF9mbHVzaCkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworCXZvaWQgKCpocGRfaW5pdCkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworCXZvaWQgKCpocGRfZmluaSkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworCWJvb2wgKCpocGRfc2Vuc2UpKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBlbnVtIHJhZGVvbl9ocGRfaWQgaHBkKTsKKwl2b2lkICgqaHBkX3NldF9wb2xhcml0eSkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGVudW0gcmFkZW9uX2hwZF9pZCBocGQpOwogfTsKIAogLyoKQEAgLTc1MSw5ICs3NjgsOSBAQAogCXVpbnQ4X3QJCQkJKmJpb3M7CiAJYm9vbAkJCQlpc19hdG9tX2Jpb3M7CiAJdWludDE2X3QJCQliaW9zX2hlYWRlcl9zdGFydDsKLQlzdHJ1Y3QgcmFkZW9uX29iamVjdAkJKnN0b2xsZW5fdmdhX21lbW9yeTsKKwlzdHJ1Y3QgcmFkZW9uX2JvCQkqc3RvbGxlbl92Z2FfbWVtb3J5OwogCXN0cnVjdCBmYl9pbmZvCQkJKmZiZGV2X2luZm87Ci0Jc3RydWN0IHJhZGVvbl9vYmplY3QJCSpmYmRldl9yb2JqOworCXN0cnVjdCByYWRlb25fYm8JCSpmYmRldl9yYm87CiAJc3RydWN0IHJhZGVvbl9mcmFtZWJ1ZmZlcgkqZmJkZXZfcmZiOwogCS8qIFJlZ2lzdGVyIG1taW8gKi8KIAlyZXNvdXJjZV9zaXplX3QJCQlybW1pb19iYXNlOwpAQCAtNzkxLDggKzgwOCwxMiBAQAogCXN0cnVjdCByYWRlb25fc3VyZmFjZV9yZWcgc3VyZmFjZV9yZWdzW1JBREVPTl9HRU1fTUFYX1NVUkZBQ0VTXTsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKm1lX2Z3OwkvKiBhbGwgZmFtaWx5IE1FIGZpcm13YXJlICovCiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpwZnBfZnc7CS8qIHI2LzcwMCBQRlAgZmlybXdhcmUgKi8KKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnJsY19mdzsJLyogcjYvNzAwIFJMQyBmaXJtd2FyZSAqLwogCXN0cnVjdCByNjAwX2JsaXQgcjYwMF9ibGl0OwogCWludCBtc2lfZW5hYmxlZDsgLyogbXNpIGVuYWJsZWQgKi8KKwlzdHJ1Y3QgcjYwMF9paCBpaDsgLyogcjYvNzAwIGludGVycnVwdCByaW5nICovCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBob3RwbHVnX3dvcms7CiB9OwogCiBpbnQgcmFkZW9uX2RldmljZV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LApAQCAtODI5LDYgKzg1MCwxMCBAQAogCX0KIH0KIAorLyoKKyAqIENhc3QgaGVscGVyCisgKi8KKyNkZWZpbmUgdG9fcmFkZW9uX2ZlbmNlKHApICgoc3RydWN0IHJhZGVvbl9mZW5jZSAqKShwKSkKIAogLyoKICAqIFJlZ2lzdGVycyByZWFkICYgd3JpdGUgZnVuY3Rpb25zLgpAQCAtOTY1LDE4ICs5OTAsMjQgQEAKICNkZWZpbmUgcmFkZW9uX2dldF9lbmdpbmVfY2xvY2socmRldikgKHJkZXYpLT5hc2ljLT5nZXRfZW5naW5lX2Nsb2NrKChyZGV2KSkKICNkZWZpbmUgcmFkZW9uX3NldF9lbmdpbmVfY2xvY2socmRldiwgZSkgKHJkZXYpLT5hc2ljLT5zZXRfZW5naW5lX2Nsb2NrKChyZGV2KSwgKGUpKQogI2RlZmluZSByYWRlb25fZ2V0X21lbW9yeV9jbG9jayhyZGV2KSAocmRldiktPmFzaWMtPmdldF9tZW1vcnlfY2xvY2soKHJkZXYpKQotI2RlZmluZSByYWRlb25fc2V0X21lbW9yeV9jbG9jayhyZGV2LCBlKSAocmRldiktPmFzaWMtPnNldF9lbmdpbmVfY2xvY2soKHJkZXYpLCAoZSkpCisjZGVmaW5lIHJhZGVvbl9zZXRfbWVtb3J5X2Nsb2NrKHJkZXYsIGUpIChyZGV2KS0+YXNpYy0+c2V0X21lbW9yeV9jbG9jaygocmRldiksIChlKSkKICNkZWZpbmUgcmFkZW9uX3NldF9wY2llX2xhbmVzKHJkZXYsIGwpIChyZGV2KS0+YXNpYy0+c2V0X3BjaWVfbGFuZXMoKHJkZXYpLCAobCkpCiAjZGVmaW5lIHJhZGVvbl9zZXRfY2xvY2tfZ2F0aW5nKHJkZXYsIGUpIChyZGV2KS0+YXNpYy0+c2V0X2Nsb2NrX2dhdGluZygocmRldiksIChlKSkKICNkZWZpbmUgcmFkZW9uX3NldF9zdXJmYWNlX3JlZyhyZGV2LCByLCBmLCBwLCBvLCBzKSAoKHJkZXYpLT5hc2ljLT5zZXRfc3VyZmFjZV9yZWcoKHJkZXYpLCAociksIChmKSwgKHApLCAobyksIChzKSkpCiAjZGVmaW5lIHJhZGVvbl9jbGVhcl9zdXJmYWNlX3JlZyhyZGV2LCByKSAoKHJkZXYpLT5hc2ljLT5jbGVhcl9zdXJmYWNlX3JlZygocmRldiksIChyKSkpCiAjZGVmaW5lIHJhZGVvbl9iYW5kd2lkdGhfdXBkYXRlKHJkZXYpIChyZGV2KS0+YXNpYy0+YmFuZHdpZHRoX3VwZGF0ZSgocmRldikpCisjZGVmaW5lIHJhZGVvbl9oZHBfZmx1c2gocmRldikgKHJkZXYpLT5hc2ljLT5oZHBfZmx1c2goKHJkZXYpKQorI2RlZmluZSByYWRlb25faHBkX2luaXQocmRldikgKHJkZXYpLT5hc2ljLT5ocGRfaW5pdCgocmRldikpCisjZGVmaW5lIHJhZGVvbl9ocGRfZmluaShyZGV2KSAocmRldiktPmFzaWMtPmhwZF9maW5pKChyZGV2KSkKKyNkZWZpbmUgcmFkZW9uX2hwZF9zZW5zZShyZGV2LCBocGQpIChyZGV2KS0+YXNpYy0+aHBkX3NlbnNlKChyZGV2KSwgKGhwZCkpCisjZGVmaW5lIHJhZGVvbl9ocGRfc2V0X3BvbGFyaXR5KHJkZXYsIGhwZCkgKHJkZXYpLT5hc2ljLT5ocGRfc2V0X3BvbGFyaXR5KChyZGV2KSwgKGhwZCkpCiAKIC8qIENvbW1vbiBmdW5jdGlvbnMgKi8KIGV4dGVybiBpbnQgcmFkZW9uX2dhcnRfdGFibGVfdnJhbV9waW4oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIGludCByYWRlb25fbW9kZXNldF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHJhZGVvbl9tb2Rlc2V0X2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIGJvb2wgcmFkZW9uX2NhcmRfcG9zdGVkKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiBib29sIHJhZGVvbl9ib290X3Rlc3RfcG9zdF9jYXJkKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiBpbnQgcmFkZW9uX2Nsb2Nrc19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHJhZGVvbl9jbG9ja3NfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCByYWRlb25fc2NyYXRjaF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKQEAgLTk4NCw2ICsxMDE1LDcgQEAKIGV4dGVybiBpbnQgcmFkZW9uX2NzX3BhcnNlcl9pbml0KHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLCB2b2lkICpkYXRhKTsKIGV4dGVybiB2b2lkIHJhZGVvbl9sZWdhY3lfc2V0X2Nsb2NrX2dhdGluZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGVuYWJsZSk7CiBleHRlcm4gdm9pZCByYWRlb25fYXRvbV9zZXRfY2xvY2tfZ2F0aW5nKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgZW5hYmxlKTsKK2V4dGVybiB2b2lkIHJhZGVvbl90dG1fcGxhY2VtZW50X2Zyb21fZG9tYWluKHN0cnVjdCByYWRlb25fYm8gKnJibywgdTMyIGRvbWFpbik7CiAKIC8qIHIxMDAscnYxMDAscnMxMDAscnYyMDAscnMyMDAscjIwMCxydjI1MCxyczMwMCxydjI4MCAqLwogc3RydWN0IHIxMDBfbWNfc2F2ZSB7CkBAIC0xMDIxLDcgKzEwNTMsNyBAQAogZXh0ZXJuIHZvaWQgcjEwMF92Z2FfcmVuZGVyX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIGludCByMTAwX2NzX3RyYWNrX2NoZWNrX3BrdDNfaW5keF9idWZmZXIoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsCiAJCQkJCQlzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCAqcGt0LAotCQkJCQkJc3RydWN0IHJhZGVvbl9vYmplY3QgKnJvYmopOworCQkJCQkJc3RydWN0IHJhZGVvbl9ibyAqcm9iaik7CiBleHRlcm4gaW50IHIxMDBfY3NfcGFyc2VfcGFja2V0MChzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwKIAkJCQlzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCAqcGt0LAogCQkJCWNvbnN0IHVuc2lnbmVkICphdXRoLCB1bnNpZ25lZCBuLApAQCAtMTAyOSw2ICsxMDYxLDggQEAKIGV4dGVybiBpbnQgcjEwMF9jc19wYWNrZXRfcGFyc2Uoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsCiAJCQkJc3RydWN0IHJhZGVvbl9jc19wYWNrZXQgKnBrdCwKIAkJCQl1bnNpZ25lZCBpZHgpOworZXh0ZXJuIHZvaWQgcjEwMF9lbmFibGVfYm0oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgcjEwMF9zZXRfY29tbW9uX3JlZ3Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCiAvKiBydjIwMCxydjI1MCxydjI4MCAqLwogZXh0ZXJuIHZvaWQgcjIwMF9zZXRfc2FmZV9yZWdpc3RlcnMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwpAQCAtMTEwNCw3ICsxMTM4LDE0IEBACiBleHRlcm4gdm9pZCByNjAwX3NjcmF0Y2hfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gaW50IHI2MDBfYmxpdF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHI2MDBfYmxpdF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWV4dGVybiBpbnQgcjYwMF9jcF9pbml0X21pY3JvY29kZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gaW50IHI2MDBfaW5pdF9taWNyb2NvZGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIGludCByNjAwX2dwdV9yZXNldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CisvKiByNjAwIGlycSAqLworZXh0ZXJuIGludCByNjAwX2lycV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiB2b2lkIHI2MDBfaXJxX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgcjYwMF9paF9yaW5nX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVuc2lnbmVkIHJpbmdfc2l6ZSk7CitleHRlcm4gaW50IHI2MDBfaXJxX3NldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CisKKyNpbmNsdWRlICJyYWRlb25fb2JqZWN0LmgiCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5oCmluZGV4IGMxOGZiZWUuLjYzNjExNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmgKQEAgLTc2LDYgKzc2LDEyIEBACiB2b2lkIHIxMDBfYmFuZHdpZHRoX3VwZGF0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHIxMDBfcmluZ19pYl9leGVjdXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcmFkZW9uX2liICppYik7CiBpbnQgcjEwMF9yaW5nX3Rlc3Qoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwordm9pZCByMTAwX2hkcF9mbHVzaChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Cit2b2lkIHIxMDBfaHBkX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwordm9pZCByMTAwX2hwZF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2Jvb2wgcjEwMF9ocGRfc2Vuc2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGVudW0gcmFkZW9uX2hwZF9pZCBocGQpOwordm9pZCByMTAwX2hwZF9zZXRfcG9sYXJpdHkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkgICBlbnVtIHJhZGVvbl9ocGRfaWQgaHBkKTsKIAogc3RhdGljIHN0cnVjdCByYWRlb25fYXNpYyByMTAwX2FzaWMgPSB7CiAJLmluaXQgPSAmcjEwMF9pbml0LApAQCAtMTA3LDYgKzExMywxMSBAQAogCS5zZXRfc3VyZmFjZV9yZWcgPSByMTAwX3NldF9zdXJmYWNlX3JlZywKIAkuY2xlYXJfc3VyZmFjZV9yZWcgPSByMTAwX2NsZWFyX3N1cmZhY2VfcmVnLAogCS5iYW5kd2lkdGhfdXBkYXRlID0gJnIxMDBfYmFuZHdpZHRoX3VwZGF0ZSwKKwkuaGRwX2ZsdXNoID0gJnIxMDBfaGRwX2ZsdXNoLAorCS5ocGRfaW5pdCA9ICZyMTAwX2hwZF9pbml0LAorCS5ocGRfZmluaSA9ICZyMTAwX2hwZF9maW5pLAorCS5ocGRfc2Vuc2UgPSAmcjEwMF9ocGRfc2Vuc2UsCisJLmhwZF9zZXRfcG9sYXJpdHkgPSAmcjEwMF9ocGRfc2V0X3BvbGFyaXR5LAogfTsKIAogCkBAIC0xNjIsNiArMTczLDExIEBACiAJLnNldF9zdXJmYWNlX3JlZyA9IHIxMDBfc2V0X3N1cmZhY2VfcmVnLAogCS5jbGVhcl9zdXJmYWNlX3JlZyA9IHIxMDBfY2xlYXJfc3VyZmFjZV9yZWcsCiAJLmJhbmR3aWR0aF91cGRhdGUgPSAmcjEwMF9iYW5kd2lkdGhfdXBkYXRlLAorCS5oZHBfZmx1c2ggPSAmcjEwMF9oZHBfZmx1c2gsCisJLmhwZF9pbml0ID0gJnIxMDBfaHBkX2luaXQsCisJLmhwZF9maW5pID0gJnIxMDBfaHBkX2ZpbmksCisJLmhwZF9zZW5zZSA9ICZyMTAwX2hwZF9zZW5zZSwKKwkuaHBkX3NldF9wb2xhcml0eSA9ICZyMTAwX2hwZF9zZXRfcG9sYXJpdHksCiB9OwogCiAvKgpAQCAtMjAxLDYgKzIxNywxMSBAQAogCS5zZXRfc3VyZmFjZV9yZWcgPSByMTAwX3NldF9zdXJmYWNlX3JlZywKIAkuY2xlYXJfc3VyZmFjZV9yZWcgPSByMTAwX2NsZWFyX3N1cmZhY2VfcmVnLAogCS5iYW5kd2lkdGhfdXBkYXRlID0gJnIxMDBfYmFuZHdpZHRoX3VwZGF0ZSwKKwkuaGRwX2ZsdXNoID0gJnIxMDBfaGRwX2ZsdXNoLAorCS5ocGRfaW5pdCA9ICZyMTAwX2hwZF9pbml0LAorCS5ocGRfZmluaSA9ICZyMTAwX2hwZF9maW5pLAorCS5ocGRfc2Vuc2UgPSAmcjEwMF9ocGRfc2Vuc2UsCisJLmhwZF9zZXRfcG9sYXJpdHkgPSAmcjEwMF9ocGRfc2V0X3BvbGFyaXR5LAogfTsKIAogCkBAIC0yNDUsNiArMjY2LDExIEBACiAJLnNldF9zdXJmYWNlX3JlZyA9IHIxMDBfc2V0X3N1cmZhY2VfcmVnLAogCS5jbGVhcl9zdXJmYWNlX3JlZyA9IHIxMDBfY2xlYXJfc3VyZmFjZV9yZWcsCiAJLmJhbmR3aWR0aF91cGRhdGUgPSAmcjEwMF9iYW5kd2lkdGhfdXBkYXRlLAorCS5oZHBfZmx1c2ggPSAmcjEwMF9oZHBfZmx1c2gsCisJLmhwZF9pbml0ID0gJnIxMDBfaHBkX2luaXQsCisJLmhwZF9maW5pID0gJnIxMDBfaHBkX2ZpbmksCisJLmhwZF9zZW5zZSA9ICZyMTAwX2hwZF9zZW5zZSwKKwkuaHBkX3NldF9wb2xhcml0eSA9ICZyMTAwX2hwZF9zZXRfcG9sYXJpdHksCiB9OwogCiAKQEAgLTI2Myw2ICsyODksMTIgQEAKIHVpbnQzMl90IHJzNjAwX21jX3JyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZyk7CiB2b2lkIHJzNjAwX21jX3dyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3Qgdik7CiB2b2lkIHJzNjAwX2JhbmR3aWR0aF91cGRhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwordm9pZCByczYwMF9ocGRfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Cit2b2lkIHJzNjAwX2hwZF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2Jvb2wgcnM2MDBfaHBkX3NlbnNlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBlbnVtIHJhZGVvbl9ocGRfaWQgaHBkKTsKK3ZvaWQgcnM2MDBfaHBkX3NldF9wb2xhcml0eShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCSAgICBlbnVtIHJhZGVvbl9ocGRfaWQgaHBkKTsKKwogc3RhdGljIHN0cnVjdCByYWRlb25fYXNpYyByczYwMF9hc2ljID0gewogCS5pbml0ID0gJnJzNjAwX2luaXQsCiAJLmZpbmkgPSAmcnM2MDBfZmluaSwKQEAgLTI5MSw2ICszMjMsMTEgQEAKIAkuc2V0X3BjaWVfbGFuZXMgPSBOVUxMLAogCS5zZXRfY2xvY2tfZ2F0aW5nID0gJnJhZGVvbl9hdG9tX3NldF9jbG9ja19nYXRpbmcsCiAJLmJhbmR3aWR0aF91cGRhdGUgPSAmcnM2MDBfYmFuZHdpZHRoX3VwZGF0ZSwKKwkuaGRwX2ZsdXNoID0gJnIxMDBfaGRwX2ZsdXNoLAorCS5ocGRfaW5pdCA9ICZyczYwMF9ocGRfaW5pdCwKKwkuaHBkX2ZpbmkgPSAmcnM2MDBfaHBkX2ZpbmksCisJLmhwZF9zZW5zZSA9ICZyczYwMF9ocGRfc2Vuc2UsCisJLmhwZF9zZXRfcG9sYXJpdHkgPSAmcnM2MDBfaHBkX3NldF9wb2xhcml0eSwKIH07CiAKIApAQCAtMzM0LDYgKzM3MSwxMSBAQAogCS5zZXRfc3VyZmFjZV9yZWcgPSByMTAwX3NldF9zdXJmYWNlX3JlZywKIAkuY2xlYXJfc3VyZmFjZV9yZWcgPSByMTAwX2NsZWFyX3N1cmZhY2VfcmVnLAogCS5iYW5kd2lkdGhfdXBkYXRlID0gJnJzNjkwX2JhbmR3aWR0aF91cGRhdGUsCisJLmhkcF9mbHVzaCA9ICZyMTAwX2hkcF9mbHVzaCwKKwkuaHBkX2luaXQgPSAmcnM2MDBfaHBkX2luaXQsCisJLmhwZF9maW5pID0gJnJzNjAwX2hwZF9maW5pLAorCS5ocGRfc2Vuc2UgPSAmcnM2MDBfaHBkX3NlbnNlLAorCS5ocGRfc2V0X3BvbGFyaXR5ID0gJnJzNjAwX2hwZF9zZXRfcG9sYXJpdHksCiB9OwogCiAKQEAgLTM4MSw2ICs0MjMsMTEgQEAKIAkuc2V0X3N1cmZhY2VfcmVnID0gcjEwMF9zZXRfc3VyZmFjZV9yZWcsCiAJLmNsZWFyX3N1cmZhY2VfcmVnID0gcjEwMF9jbGVhcl9zdXJmYWNlX3JlZywKIAkuYmFuZHdpZHRoX3VwZGF0ZSA9ICZydjUxNV9iYW5kd2lkdGhfdXBkYXRlLAorCS5oZHBfZmx1c2ggPSAmcjEwMF9oZHBfZmx1c2gsCisJLmhwZF9pbml0ID0gJnJzNjAwX2hwZF9pbml0LAorCS5ocGRfZmluaSA9ICZyczYwMF9ocGRfZmluaSwKKwkuaHBkX3NlbnNlID0gJnJzNjAwX2hwZF9zZW5zZSwKKwkuaHBkX3NldF9wb2xhcml0eSA9ICZyczYwMF9ocGRfc2V0X3BvbGFyaXR5LAogfTsKIAogCkBAIC00MTksNiArNDY2LDExIEBACiAJLnNldF9zdXJmYWNlX3JlZyA9IHIxMDBfc2V0X3N1cmZhY2VfcmVnLAogCS5jbGVhcl9zdXJmYWNlX3JlZyA9IHIxMDBfY2xlYXJfc3VyZmFjZV9yZWcsCiAJLmJhbmR3aWR0aF91cGRhdGUgPSAmcnY1MTVfYmFuZHdpZHRoX3VwZGF0ZSwKKwkuaGRwX2ZsdXNoID0gJnIxMDBfaGRwX2ZsdXNoLAorCS5ocGRfaW5pdCA9ICZyczYwMF9ocGRfaW5pdCwKKwkuaHBkX2ZpbmkgPSAmcnM2MDBfaHBkX2ZpbmksCisJLmhwZF9zZW5zZSA9ICZyczYwMF9ocGRfc2Vuc2UsCisJLmhwZF9zZXRfcG9sYXJpdHkgPSAmcnM2MDBfaHBkX3NldF9wb2xhcml0eSwKIH07CiAKIC8qCkBAIC00NTUsNiArNTA3LDEyIEBACiBpbnQgcjYwMF9jb3B5X2JsaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCiAJCSAgIHVpbnQ2NF90IHNyY19vZmZzZXQsIHVpbnQ2NF90IGRzdF9vZmZzZXQsCiAJCSAgIHVuc2lnbmVkIG51bV9wYWdlcywgc3RydWN0IHJhZGVvbl9mZW5jZSAqZmVuY2UpOwordm9pZCByNjAwX2hkcF9mbHVzaChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Cit2b2lkIHI2MDBfaHBkX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwordm9pZCByNjAwX2hwZF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2Jvb2wgcjYwMF9ocGRfc2Vuc2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGVudW0gcmFkZW9uX2hwZF9pZCBocGQpOwordm9pZCByNjAwX2hwZF9zZXRfcG9sYXJpdHkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkgICBlbnVtIHJhZGVvbl9ocGRfaWQgaHBkKTsKIAogc3RhdGljIHN0cnVjdCByYWRlb25fYXNpYyByNjAwX2FzaWMgPSB7CiAJLmluaXQgPSAmcjYwMF9pbml0LApAQCAtNDcwLDYgKzUyOCw3IEBACiAJLnJpbmdfaWJfZXhlY3V0ZSA9ICZyNjAwX3JpbmdfaWJfZXhlY3V0ZSwKIAkuaXJxX3NldCA9ICZyNjAwX2lycV9zZXQsCiAJLmlycV9wcm9jZXNzID0gJnI2MDBfaXJxX3Byb2Nlc3MsCisJLmdldF92YmxhbmtfY291bnRlciA9ICZyczYwMF9nZXRfdmJsYW5rX2NvdW50ZXIsCiAJLmZlbmNlX3JpbmdfZW1pdCA9ICZyNjAwX2ZlbmNlX3JpbmdfZW1pdCwKIAkuY3NfcGFyc2UgPSAmcjYwMF9jc19wYXJzZSwKIAkuY29weV9ibGl0ID0gJnI2MDBfY29weV9ibGl0LApAQCAtNDg0LDYgKzU0MywxMSBAQAogCS5zZXRfc3VyZmFjZV9yZWcgPSByNjAwX3NldF9zdXJmYWNlX3JlZywKIAkuY2xlYXJfc3VyZmFjZV9yZWcgPSByNjAwX2NsZWFyX3N1cmZhY2VfcmVnLAogCS5iYW5kd2lkdGhfdXBkYXRlID0gJnJ2NTE1X2JhbmR3aWR0aF91cGRhdGUsCisJLmhkcF9mbHVzaCA9ICZyNjAwX2hkcF9mbHVzaCwKKwkuaHBkX2luaXQgPSAmcjYwMF9ocGRfaW5pdCwKKwkuaHBkX2ZpbmkgPSAmcjYwMF9ocGRfZmluaSwKKwkuaHBkX3NlbnNlID0gJnI2MDBfaHBkX3NlbnNlLAorCS5ocGRfc2V0X3BvbGFyaXR5ID0gJnI2MDBfaHBkX3NldF9wb2xhcml0eSwKIH07CiAKIC8qCkBAIC01MDksNiArNTczLDcgQEAKIAkucmluZ19pYl9leGVjdXRlID0gJnI2MDBfcmluZ19pYl9leGVjdXRlLAogCS5pcnFfc2V0ID0gJnI2MDBfaXJxX3NldCwKIAkuaXJxX3Byb2Nlc3MgPSAmcjYwMF9pcnFfcHJvY2VzcywKKwkuZ2V0X3ZibGFua19jb3VudGVyID0gJnJzNjAwX2dldF92YmxhbmtfY291bnRlciwKIAkuZmVuY2VfcmluZ19lbWl0ID0gJnI2MDBfZmVuY2VfcmluZ19lbWl0LAogCS5jc19wYXJzZSA9ICZyNjAwX2NzX3BhcnNlLAogCS5jb3B5X2JsaXQgPSAmcjYwMF9jb3B5X2JsaXQsCkBAIC01MjMsNiArNTg4LDExIEBACiAJLnNldF9zdXJmYWNlX3JlZyA9IHI2MDBfc2V0X3N1cmZhY2VfcmVnLAogCS5jbGVhcl9zdXJmYWNlX3JlZyA9IHI2MDBfY2xlYXJfc3VyZmFjZV9yZWcsCiAJLmJhbmR3aWR0aF91cGRhdGUgPSAmcnY1MTVfYmFuZHdpZHRoX3VwZGF0ZSwKKwkuaGRwX2ZsdXNoID0gJnI2MDBfaGRwX2ZsdXNoLAorCS5ocGRfaW5pdCA9ICZyNjAwX2hwZF9pbml0LAorCS5ocGRfZmluaSA9ICZyNjAwX2hwZF9maW5pLAorCS5ocGRfc2Vuc2UgPSAmcjYwMF9ocGRfc2Vuc2UsCisJLmhwZF9zZXRfcG9sYXJpdHkgPSAmcjYwMF9ocGRfc2V0X3BvbGFyaXR5LAogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hdG9tYmlvcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRvbWJpb3MuYwppbmRleCAyZWQ4OGE4Li4xMmEwYzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hdG9tYmlvcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0b21iaW9zLmMKQEAgLTQ3LDcgKzQ3LDggQEAKIAkJCSAgaW50IGNvbm5lY3Rvcl90eXBlLAogCQkJICBzdHJ1Y3QgcmFkZW9uX2kyY19idXNfcmVjICppMmNfYnVzLAogCQkJICBib29sIGxpbmtiLCB1aW50MzJfdCBpZ3BfbGFuZV9pbmZvLAotCQkJICB1aW50MTZfdCBjb25uZWN0b3Jfb2JqZWN0X2lkKTsKKwkJCSAgdWludDE2X3QgY29ubmVjdG9yX29iamVjdF9pZCwKKwkJCSAgc3RydWN0IHJhZGVvbl9ocGQgKmhwZCk7CiAKIC8qIGZyb20gcmFkZW9uX2xlZ2FjeV9lbmNvZGVyLmMgKi8KIGV4dGVybiB2b2lkCkBAIC02MCwxNiArNjEsMTYgQEAKIAlzdHJ1Y3QgX0FUT01fU1VQUE9SVEVEX0RFVklDRVNfSU5GT18yZDEgaW5mb18yZDE7CiB9OwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCByYWRlb25faTJjX2J1c19yZWMgcmFkZW9uX2xvb2t1cF9ncGlvKHN0cnVjdCBkcm1fZGV2aWNlCi0JCQkJCQkJICAgKmRldiwgdWludDhfdCBpZCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyByYWRlb25fbG9va3VwX2kyY19ncGlvKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJCQkJCSAgICAgICB1aW50OF90IGlkKQogewotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgYXRvbV9jb250ZXh0ICpjdHggPSByZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0OwotCUFUT01fR1BJT19JMkNfQVNTSUdNRU5UIGdwaW87CisJQVRPTV9HUElPX0kyQ19BU1NJR01FTlQgKmdwaW87CiAJc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyBpMmM7CiAJaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoREFUQSwgR1BJT19JMkNfSW5mbyk7CiAJc3RydWN0IF9BVE9NX0dQSU9fSTJDX0lORk8gKmkyY19pbmZvOwogCXVpbnQxNl90IGRhdGFfb2Zmc2V0OworCWludCBpOwogCiAJbWVtc2V0KCZpMmMsIDAsIHNpemVvZihzdHJ1Y3QgcmFkZW9uX2kyY19idXNfcmVjKSk7CiAJaTJjLnZhbGlkID0gZmFsc2U7CkBAIC03OCwzNCArNzksMTIxIEBACiAKIAlpMmNfaW5mbyA9IChzdHJ1Y3QgX0FUT01fR1BJT19JMkNfSU5GTyAqKShjdHgtPmJpb3MgKyBkYXRhX29mZnNldCk7CiAKLQlncGlvID0gaTJjX2luZm8tPmFzR1BJT19JbmZvW2lkXTsKIAotCWkyYy5tYXNrX2Nsa19yZWcgPSBsZTE2X3RvX2NwdShncGlvLnVzQ2xrTWFza1JlZ2lzdGVySW5kZXgpICogNDsKLQlpMmMubWFza19kYXRhX3JlZyA9IGxlMTZfdG9fY3B1KGdwaW8udXNEYXRhTWFza1JlZ2lzdGVySW5kZXgpICogNDsKLQlpMmMucHV0X2Nsa19yZWcgPSBsZTE2X3RvX2NwdShncGlvLnVzQ2xrRW5SZWdpc3RlckluZGV4KSAqIDQ7Ci0JaTJjLnB1dF9kYXRhX3JlZyA9IGxlMTZfdG9fY3B1KGdwaW8udXNEYXRhRW5SZWdpc3RlckluZGV4KSAqIDQ7Ci0JaTJjLmdldF9jbGtfcmVnID0gbGUxNl90b19jcHUoZ3Bpby51c0Nsa1lfUmVnaXN0ZXJJbmRleCkgKiA0OwotCWkyYy5nZXRfZGF0YV9yZWcgPSBsZTE2X3RvX2NwdShncGlvLnVzRGF0YVlfUmVnaXN0ZXJJbmRleCkgKiA0OwotCWkyYy5hX2Nsa19yZWcgPSBsZTE2X3RvX2NwdShncGlvLnVzQ2xrQV9SZWdpc3RlckluZGV4KSAqIDQ7Ci0JaTJjLmFfZGF0YV9yZWcgPSBsZTE2X3RvX2NwdShncGlvLnVzRGF0YUFfUmVnaXN0ZXJJbmRleCkgKiA0OwotCWkyYy5tYXNrX2Nsa19tYXNrID0gKDEgPDwgZ3Bpby51Y0Nsa01hc2tTaGlmdCk7Ci0JaTJjLm1hc2tfZGF0YV9tYXNrID0gKDEgPDwgZ3Bpby51Y0RhdGFNYXNrU2hpZnQpOwotCWkyYy5wdXRfY2xrX21hc2sgPSAoMSA8PCBncGlvLnVjQ2xrRW5TaGlmdCk7Ci0JaTJjLnB1dF9kYXRhX21hc2sgPSAoMSA8PCBncGlvLnVjRGF0YUVuU2hpZnQpOwotCWkyYy5nZXRfY2xrX21hc2sgPSAoMSA8PCBncGlvLnVjQ2xrWV9TaGlmdCk7Ci0JaTJjLmdldF9kYXRhX21hc2sgPSAoMSA8PCBncGlvLnVjRGF0YVlfU2hpZnQpOwotCWkyYy5hX2Nsa19tYXNrID0gKDEgPDwgZ3Bpby51Y0Nsa0FfU2hpZnQpOwotCWkyYy5hX2RhdGFfbWFzayA9ICgxIDw8IGdwaW8udWNEYXRhQV9TaGlmdCk7Ci0JaTJjLnZhbGlkID0gdHJ1ZTsKKwlmb3IgKGkgPSAwOyBpIDwgQVRPTV9NQVhfU1VQUE9SVEVEX0RFVklDRTsgaSsrKSB7CisJCWdwaW8gPSAmaTJjX2luZm8tPmFzR1BJT19JbmZvW2ldOworCisJCWlmIChncGlvLT5zdWNJMmNJZC51Y0FjY2VzcyA9PSBpZCkgeworCQkJaTJjLm1hc2tfY2xrX3JlZyA9IGxlMTZfdG9fY3B1KGdwaW8tPnVzQ2xrTWFza1JlZ2lzdGVySW5kZXgpICogNDsKKwkJCWkyYy5tYXNrX2RhdGFfcmVnID0gbGUxNl90b19jcHUoZ3Bpby0+dXNEYXRhTWFza1JlZ2lzdGVySW5kZXgpICogNDsKKwkJCWkyYy5lbl9jbGtfcmVnID0gbGUxNl90b19jcHUoZ3Bpby0+dXNDbGtFblJlZ2lzdGVySW5kZXgpICogNDsKKwkJCWkyYy5lbl9kYXRhX3JlZyA9IGxlMTZfdG9fY3B1KGdwaW8tPnVzRGF0YUVuUmVnaXN0ZXJJbmRleCkgKiA0OworCQkJaTJjLnlfY2xrX3JlZyA9IGxlMTZfdG9fY3B1KGdwaW8tPnVzQ2xrWV9SZWdpc3RlckluZGV4KSAqIDQ7CisJCQlpMmMueV9kYXRhX3JlZyA9IGxlMTZfdG9fY3B1KGdwaW8tPnVzRGF0YVlfUmVnaXN0ZXJJbmRleCkgKiA0OworCQkJaTJjLmFfY2xrX3JlZyA9IGxlMTZfdG9fY3B1KGdwaW8tPnVzQ2xrQV9SZWdpc3RlckluZGV4KSAqIDQ7CisJCQlpMmMuYV9kYXRhX3JlZyA9IGxlMTZfdG9fY3B1KGdwaW8tPnVzRGF0YUFfUmVnaXN0ZXJJbmRleCkgKiA0OworCQkJaTJjLm1hc2tfY2xrX21hc2sgPSAoMSA8PCBncGlvLT51Y0Nsa01hc2tTaGlmdCk7CisJCQlpMmMubWFza19kYXRhX21hc2sgPSAoMSA8PCBncGlvLT51Y0RhdGFNYXNrU2hpZnQpOworCQkJaTJjLmVuX2Nsa19tYXNrID0gKDEgPDwgZ3Bpby0+dWNDbGtFblNoaWZ0KTsKKwkJCWkyYy5lbl9kYXRhX21hc2sgPSAoMSA8PCBncGlvLT51Y0RhdGFFblNoaWZ0KTsKKwkJCWkyYy55X2Nsa19tYXNrID0gKDEgPDwgZ3Bpby0+dWNDbGtZX1NoaWZ0KTsKKwkJCWkyYy55X2RhdGFfbWFzayA9ICgxIDw8IGdwaW8tPnVjRGF0YVlfU2hpZnQpOworCQkJaTJjLmFfY2xrX21hc2sgPSAoMSA8PCBncGlvLT51Y0Nsa0FfU2hpZnQpOworCQkJaTJjLmFfZGF0YV9tYXNrID0gKDEgPDwgZ3Bpby0+dWNEYXRhQV9TaGlmdCk7CisKKwkJCWlmIChncGlvLT5zdWNJMmNJZC5zYmZBY2Nlc3MuYmZIV19DYXBhYmxlKQorCQkJCWkyYy5od19jYXBhYmxlID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCQlpMmMuaHdfY2FwYWJsZSA9IGZhbHNlOworCisJCQlpZiAoZ3Bpby0+c3VjSTJjSWQudWNBY2Nlc3MgPT0gMHhhMCkKKwkJCQlpMmMubW1faTJjID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCQlpMmMubW1faTJjID0gZmFsc2U7CisKKwkJCWkyYy5pMmNfaWQgPSBncGlvLT5zdWNJMmNJZC51Y0FjY2VzczsKKworCQkJaTJjLnZhbGlkID0gdHJ1ZTsKKwkJfQorCX0KIAogCXJldHVybiBpMmM7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJhZGVvbl9ncGlvX3JlYyByYWRlb25fbG9va3VwX2dwaW8oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkJCQkJdTggaWQpCit7CisJc3RydWN0IGF0b21fY29udGV4dCAqY3R4ID0gcmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dDsKKwlzdHJ1Y3QgcmFkZW9uX2dwaW9fcmVjIGdwaW87CisJaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoREFUQSwgR1BJT19QaW5fTFVUKTsKKwlzdHJ1Y3QgX0FUT01fR1BJT19QSU5fTFVUICpncGlvX2luZm87CisJQVRPTV9HUElPX1BJTl9BU1NJR05NRU5UICpwaW47CisJdTE2IGRhdGFfb2Zmc2V0LCBzaXplOworCWludCBpLCBudW1faW5kaWNlczsKKworCW1lbXNldCgmZ3BpbywgMCwgc2l6ZW9mKHN0cnVjdCByYWRlb25fZ3Bpb19yZWMpKTsKKwlncGlvLnZhbGlkID0gZmFsc2U7CisKKwlhdG9tX3BhcnNlX2RhdGFfaGVhZGVyKGN0eCwgaW5kZXgsICZzaXplLCBOVUxMLCBOVUxMLCAmZGF0YV9vZmZzZXQpOworCisJZ3Bpb19pbmZvID0gKHN0cnVjdCBfQVRPTV9HUElPX1BJTl9MVVQgKikoY3R4LT5iaW9zICsgZGF0YV9vZmZzZXQpOworCisJbnVtX2luZGljZXMgPSAoc2l6ZSAtIHNpemVvZihBVE9NX0NPTU1PTl9UQUJMRV9IRUFERVIpKSAvIHNpemVvZihBVE9NX0dQSU9fUElOX0FTU0lHTk1FTlQpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9pbmRpY2VzOyBpKyspIHsKKwkJcGluID0gJmdwaW9faW5mby0+YXNHUElPX1BpbltpXTsKKwkJaWYgKGlkID09IHBpbi0+dWNHUElPX0lEKSB7CisJCQlncGlvLmlkID0gcGluLT51Y0dQSU9fSUQ7CisJCQlncGlvLnJlZyA9IHBpbi0+dXNHcGlvUGluX0FJbmRleCAqIDQ7CisJCQlncGlvLm1hc2sgPSAoMSA8PCBwaW4tPnVjR3Bpb1BpbkJpdFNoaWZ0KTsKKwkJCWdwaW8udmFsaWQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gZ3BpbzsKK30KKworc3RhdGljIHN0cnVjdCByYWRlb25faHBkIHJhZGVvbl9hdG9tX2dldF9ocGRfaW5mb19mcm9tX2dwaW8oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkJCQkJICAgIHN0cnVjdCByYWRlb25fZ3Bpb19yZWMgKmdwaW8pCit7CisJc3RydWN0IHJhZGVvbl9ocGQgaHBkOworCWhwZC5ncGlvID0gKmdwaW87CisJaWYgKGdwaW8tPnJlZyA9PSBBVklWT19EQ19HUElPX0hQRF9BKSB7CisJCXN3aXRjaChncGlvLT5tYXNrKSB7CisJCWNhc2UgKDEgPDwgMCk6CisJCQlocGQuaHBkID0gUkFERU9OX0hQRF8xOworCQkJYnJlYWs7CisJCWNhc2UgKDEgPDwgOCk6CisJCQlocGQuaHBkID0gUkFERU9OX0hQRF8yOworCQkJYnJlYWs7CisJCWNhc2UgKDEgPDwgMTYpOgorCQkJaHBkLmhwZCA9IFJBREVPTl9IUERfMzsKKwkJCWJyZWFrOworCQljYXNlICgxIDw8IDI0KToKKwkJCWhwZC5ocGQgPSBSQURFT05fSFBEXzQ7CisJCQlicmVhazsKKwkJY2FzZSAoMSA8PCAyNik6CisJCQlocGQuaHBkID0gUkFERU9OX0hQRF81OworCQkJYnJlYWs7CisJCWNhc2UgKDEgPDwgMjgpOgorCQkJaHBkLmhwZCA9IFJBREVPTl9IUERfNjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaHBkLmhwZCA9IFJBREVPTl9IUERfTk9ORTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlCisJCWhwZC5ocGQgPSBSQURFT05fSFBEX05PTkU7CisJcmV0dXJuIGhwZDsKK30KKwogc3RhdGljIGJvb2wgcmFkZW9uX2F0b21fYXBwbHlfcXVpcmtzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJICAgICB1aW50MzJfdCBzdXBwb3J0ZWRfZGV2aWNlLAogCQkJCSAgICAgaW50ICpjb25uZWN0b3JfdHlwZSwKIAkJCQkgICAgIHN0cnVjdCByYWRlb25faTJjX2J1c19yZWMgKmkyY19idXMsCi0JCQkJICAgICB1aW50MTZfdCAqbGluZV9tdXgpCisJCQkJICAgICB1aW50MTZfdCAqbGluZV9tdXgsCisJCQkJICAgICBzdHJ1Y3QgcmFkZW9uX2hwZCAqaHBkKQogewogCiAJLyogQXN1cyBNMkEtVk0gSERNSSBib2FyZCBsaXN0cyB0aGUgRFZJIHBvcnQgYXMgSERNSSAqLwpAQCAtMTM1LDYgKzIyMywyMyBAQAogCQl9CiAJfQogCisJLyogSElTIFgxMzAwIGlzIERWSStWR0EsIG5vdCBEVkkrRFZJICovCisJaWYgKChkZXYtPnBkZXYtPmRldmljZSA9PSAweDcxNDYpICYmCisJICAgIChkZXYtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxN2FmKSAmJgorCSAgICAoZGV2LT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MjA1OCkpIHsKKwkJaWYgKHN1cHBvcnRlZF9kZXZpY2UgPT0gQVRPTV9ERVZJQ0VfREZQMV9TVVBQT1JUKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIEdpZ2FieXRlIFgxMzAwIGlzIERWSStWR0EsIG5vdCBEVkkrRFZJICovCisJaWYgKChkZXYtPnBkZXYtPmRldmljZSA9PSAweDcxNDIpICYmCisJICAgIChkZXYtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxNDU4KSAmJgorCSAgICAoZGV2LT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MjEzNCkpIHsKKwkJaWYgKHN1cHBvcnRlZF9kZXZpY2UgPT0gQVRPTV9ERVZJQ0VfREZQMV9TVVBQT1JUKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCiAJLyogRnVua3kgbWFjYm9va3MgKi8KIAlpZiAoKGRldi0+cGRldi0+ZGV2aWNlID09IDB4NzFDNSkgJiYKIAkgICAgKGRldi0+cGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDEwNmIpICYmCkBAIC0xNzIsNiArMjc3LDE1IEBACiAJCX0KIAl9CiAKKwkvKiBBY2VyIGxhcHRvcCByZXBvcnRzIERWSS1EIGFzIERWSS1JICovCisJaWYgKChkZXYtPnBkZXYtPmRldmljZSA9PSAweDk1YzQpICYmCisJICAgIChkZXYtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxMDI1KSAmJgorCSAgICAoZGV2LT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MDEzYykpIHsKKwkJaWYgKCgqY29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUkpICYmCisJCSAgICAoc3VwcG9ydGVkX2RldmljZSA9PSBBVE9NX0RFVklDRV9ERlAxX1NVUFBPUlQpKQorCQkJKmNvbm5lY3Rvcl90eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUQ7CisJfQorCiAJcmV0dXJuIHRydWU7CiB9CiAKQEAgLTI0MCwxNiArMzU0LDE4IEBACiAJc3RydWN0IHJhZGVvbl9tb2RlX2luZm8gKm1vZGVfaW5mbyA9ICZyZGV2LT5tb2RlX2luZm87CiAJc3RydWN0IGF0b21fY29udGV4dCAqY3R4ID0gbW9kZV9pbmZvLT5hdG9tX2NvbnRleHQ7CiAJaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoREFUQSwgT2JqZWN0X0hlYWRlcik7Ci0JdWludDE2X3Qgc2l6ZSwgZGF0YV9vZmZzZXQ7Ci0JdWludDhfdCBmcmV2LCBjcmV2LCBsaW5lX211eCA9IDA7CisJdTE2IHNpemUsIGRhdGFfb2Zmc2V0OworCXU4IGZyZXYsIGNyZXY7CiAJQVRPTV9DT05ORUNUT1JfT0JKRUNUX1RBQkxFICpjb25fb2JqOwogCUFUT01fRElTUExBWV9PQkpFQ1RfUEFUSF9UQUJMRSAqcGF0aF9vYmo7CiAJQVRPTV9PQkpFQ1RfSEVBREVSICpvYmpfaGVhZGVyOwogCWludCBpLCBqLCBwYXRoX3NpemUsIGRldmljZV9zdXBwb3J0OwogCWludCBjb25uZWN0b3JfdHlwZTsKLQl1aW50MTZfdCBpZ3BfbGFuZV9pbmZvLCBjb25uX2lkLCBjb25uZWN0b3Jfb2JqZWN0X2lkOworCXUxNiBpZ3BfbGFuZV9pbmZvLCBjb25uX2lkLCBjb25uZWN0b3Jfb2JqZWN0X2lkOwogCWJvb2wgbGlua2I7CiAJc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyBkZGNfYnVzOworCXN0cnVjdCByYWRlb25fZ3Bpb19yZWMgZ3BpbzsKKwlzdHJ1Y3QgcmFkZW9uX2hwZCBocGQ7CiAKIAlhdG9tX3BhcnNlX2RhdGFfaGVhZGVyKGN0eCwgaW5kZXgsICZzaXplLCAmZnJldiwgJmNyZXYsICZkYXRhX29mZnNldCk7CiAKQEAgLTI3Niw3ICszOTIsNiBAQAogCQlwYXRoID0gKEFUT01fRElTUExBWV9PQkpFQ1RfUEFUSCAqKSBhZGRyOwogCQlwYXRoX3NpemUgKz0gbGUxNl90b19jcHUocGF0aC0+dXNTaXplKTsKIAkJbGlua2IgPSBmYWxzZTsKLQogCQlpZiAoZGV2aWNlX3N1cHBvcnQgJiBsZTE2X3RvX2NwdShwYXRoLT51c0RldmljZVRhZykpIHsKIAkJCXVpbnQ4X3QgY29uX29ial9pZCwgY29uX29ial9udW0sIGNvbl9vYmpfdHlwZTsKIApAQCAtMzc3LDEwICs0OTIsOSBAQAogCQkJCX0KIAkJCX0KIAotCQkJLyogbG9vayB1cCBncGlvIGZvciBkZGMgKi8KKwkJCS8qIGxvb2sgdXAgZ3BpbyBmb3IgZGRjLCBocGQgKi8KIAkJCWlmICgobGUxNl90b19jcHUocGF0aC0+dXNEZXZpY2VUYWcpICYKLQkJCSAgICAgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQgfCBBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSkKLQkJCSAgICA9PSAwKSB7CisJCQkgICAgIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUIHwgQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpID09IDApIHsKIAkJCQlmb3IgKGogPSAwOyBqIDwgY29uX29iai0+dWNOdW1iZXJPZk9iamVjdHM7IGorKykgewogCQkJCQlpZiAobGUxNl90b19jcHUocGF0aC0+dXNDb25uT2JqZWN0SWQpID09CiAJCQkJCSAgICBsZTE2X3RvX2NwdShjb25fb2JqLT5hc09iamVjdHNbal0uCkBAIC0zOTQsMjEgKzUwOCwzNCBAQAogCQkJCQkJCQkgYXNPYmplY3RzW2pdLgogCQkJCQkJCQkgdXNSZWNvcmRPZmZzZXQpKTsKIAkJCQkJCUFUT01fSTJDX1JFQ09SRCAqaTJjX3JlY29yZDsKKwkJCQkJCUFUT01fSFBEX0lOVF9SRUNPUkQgKmhwZF9yZWNvcmQ7CisJCQkJCQlBVE9NX0kyQ19JRF9DT05GSUdfQUNDRVNTICppMmNfY29uZmlnOworCQkJCQkJaHBkLmhwZCA9IFJBREVPTl9IUERfTk9ORTsKIAogCQkJCQkJd2hpbGUgKHJlY29yZC0+dWNSZWNvcmRUeXBlID4gMAogCQkJCQkJICAgICAgICYmIHJlY29yZC0+CiAJCQkJCQkgICAgICAgdWNSZWNvcmRUeXBlIDw9CiAJCQkJCQkgICAgICAgQVRPTV9NQVhfT0JKRUNUX1JFQ09SRF9OVU1CRVIpIHsKLQkJCQkJCQlzd2l0Y2ggKHJlY29yZC0+Ci0JCQkJCQkJCXVjUmVjb3JkVHlwZSkgeworCQkJCQkJCXN3aXRjaCAocmVjb3JkLT51Y1JlY29yZFR5cGUpIHsKIAkJCQkJCQljYXNlIEFUT01fSTJDX1JFQ09SRF9UWVBFOgogCQkJCQkJCQlpMmNfcmVjb3JkID0KLQkJCQkJCQkJICAgIChBVE9NX0kyQ19SRUNPUkQKLQkJCQkJCQkJICAgICAqKSByZWNvcmQ7Ci0JCQkJCQkJCWxpbmVfbXV4ID0KLQkJCQkJCQkJICAgIGkyY19yZWNvcmQtPgotCQkJCQkJCQkgICAgc3VjSTJjSWQuCi0JCQkJCQkJCSAgICBiZkkyQ19MaW5lTXV4OworCQkJCQkJCQkgICAgKEFUT01fSTJDX1JFQ09SRCAqKQorCQkJCQkJCQkJcmVjb3JkOworCQkJCQkJCQlpMmNfY29uZmlnID0KKwkJCQkJCQkJCShBVE9NX0kyQ19JRF9DT05GSUdfQUNDRVNTICopCisJCQkJCQkJCQkmaTJjX3JlY29yZC0+c3VjSTJjSWQ7CisJCQkJCQkJCWRkY19idXMgPSByYWRlb25fbG9va3VwX2kyY19ncGlvKHJkZXYsCisJCQkJCQkJCQkJCQkgaTJjX2NvbmZpZy0+CisJCQkJCQkJCQkJCQkgdWNBY2Nlc3MpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIEFUT01fSFBEX0lOVF9SRUNPUkRfVFlQRToKKwkJCQkJCQkJaHBkX3JlY29yZCA9CisJCQkJCQkJCQkoQVRPTV9IUERfSU5UX1JFQ09SRCAqKQorCQkJCQkJCQkJcmVjb3JkOworCQkJCQkJCQlncGlvID0gcmFkZW9uX2xvb2t1cF9ncGlvKHJkZXYsCisJCQkJCQkJCQkJCSAgaHBkX3JlY29yZC0+dWNIUERJbnRHUElPSUQpOworCQkJCQkJCQlocGQgPSByYWRlb25fYXRvbV9nZXRfaHBkX2luZm9fZnJvbV9ncGlvKHJkZXYsICZncGlvKTsKKwkJCQkJCQkJaHBkLnBsdWdnZWRfc3RhdGUgPSBocGRfcmVjb3JkLT51Y1BsdWdnZWRfUGluU3RhdGU7CiAJCQkJCQkJCWJyZWFrOwogCQkJCQkJCX0KIAkJCQkJCQlyZWNvcmQgPQpAQCAtNDIxLDI0ICs1NDgsMTYgQEAKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJfQotCQkJfSBlbHNlCi0JCQkJbGluZV9tdXggPSAwOwotCi0JCQlpZiAoKGxlMTZfdG9fY3B1KHBhdGgtPnVzRGV2aWNlVGFnKSA9PQotCQkJICAgICBBVE9NX0RFVklDRV9UVjFfU1VQUE9SVCkKLQkJCSAgICB8fCAobGUxNl90b19jcHUocGF0aC0+dXNEZXZpY2VUYWcpID09Ci0JCQkJQVRPTV9ERVZJQ0VfVFYyX1NVUFBPUlQpCi0JCQkgICAgfHwgKGxlMTZfdG9fY3B1KHBhdGgtPnVzRGV2aWNlVGFnKSA9PQotCQkJCUFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQorCQkJfSBlbHNlIHsKKwkJCQlocGQuaHBkID0gUkFERU9OX0hQRF9OT05FOwogCQkJCWRkY19idXMudmFsaWQgPSBmYWxzZTsKLQkJCWVsc2UKLQkJCQlkZGNfYnVzID0gcmFkZW9uX2xvb2t1cF9ncGlvKGRldiwgbGluZV9tdXgpOworCQkJfQogCiAJCQljb25uX2lkID0gbGUxNl90b19jcHUocGF0aC0+dXNDb25uT2JqZWN0SWQpOwogCiAJCQlpZiAoIXJhZGVvbl9hdG9tX2FwcGx5X3F1aXJrcwogCQkJICAgIChkZXYsIGxlMTZfdG9fY3B1KHBhdGgtPnVzRGV2aWNlVGFnKSwgJmNvbm5lY3Rvcl90eXBlLAotCQkJICAgICAmZGRjX2J1cywgJmNvbm5faWQpKQorCQkJICAgICAmZGRjX2J1cywgJmNvbm5faWQsICZocGQpKQogCQkJCWNvbnRpbnVlOwogCiAJCQlyYWRlb25fYWRkX2F0b21fY29ubmVjdG9yKGRldiwKQEAgLTQ0Nyw3ICs1NjYsOCBAQAogCQkJCQkJCSAgICAgIHVzRGV2aWNlVGFnKSwKIAkJCQkJCSAgY29ubmVjdG9yX3R5cGUsICZkZGNfYnVzLAogCQkJCQkJICBsaW5rYiwgaWdwX2xhbmVfaW5mbywKLQkJCQkJCSAgY29ubmVjdG9yX29iamVjdF9pZCk7CisJCQkJCQkgIGNvbm5lY3Rvcl9vYmplY3RfaWQsCisJCQkJCQkgICZocGQpOwogCiAJCX0KIAl9CkBAIC01MDIsNiArNjIyLDcgQEAKIAl1aW50MTZfdCBkZXZpY2VzOwogCWludCBjb25uZWN0b3JfdHlwZTsKIAlzdHJ1Y3QgcmFkZW9uX2kyY19idXNfcmVjIGRkY19idXM7CisJc3RydWN0IHJhZGVvbl9ocGQgaHBkOwogfTsKIAogYm9vbCByYWRlb25fZ2V0X2F0b21fY29ubmVjdG9yX2luZm9fZnJvbV9zdXBwb3J0ZWRfZGV2aWNlc190YWJsZShzdHJ1Y3QKQEAgLTUxNyw3ICs2MzgsNyBAQAogCXVpbnQxNl90IGRldmljZV9zdXBwb3J0OwogCXVpbnQ4X3QgZGFjOwogCXVuaW9uIGF0b21fc3VwcG9ydGVkX2RldmljZXMgKnN1cHBvcnRlZF9kZXZpY2VzOwotCWludCBpLCBqOworCWludCBpLCBqLCBtYXhfZGV2aWNlOwogCXN0cnVjdCBiaW9zX2Nvbm5lY3RvciBiaW9zX2Nvbm5lY3RvcnNbQVRPTV9NQVhfU1VQUE9SVEVEX0RFVklDRV07CiAKIAlhdG9tX3BhcnNlX2RhdGFfaGVhZGVyKGN0eCwgaW5kZXgsICZzaXplLCAmZnJldiwgJmNyZXYsICZkYXRhX29mZnNldCk7CkBAIC01MjcsNyArNjQ4LDEyIEBACiAKIAlkZXZpY2Vfc3VwcG9ydCA9IGxlMTZfdG9fY3B1KHN1cHBvcnRlZF9kZXZpY2VzLT5pbmZvLnVzRGV2aWNlU3VwcG9ydCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVRPTV9NQVhfU1VQUE9SVEVEX0RFVklDRTsgaSsrKSB7CisJaWYgKGZyZXYgPiAxKQorCQltYXhfZGV2aWNlID0gQVRPTV9NQVhfU1VQUE9SVEVEX0RFVklDRTsKKwllbHNlCisJCW1heF9kZXZpY2UgPSBBVE9NX01BWF9TVVBQT1JURURfREVWSUNFX0lORk87CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X2RldmljZTsgaSsrKSB7CiAJCUFUT01fQ09OTkVDVE9SX0lORk9fSTJDIGNpID0KIAkJICAgIHN1cHBvcnRlZF9kZXZpY2VzLT5pbmZvLmFzQ29ubkluZm9baV07CiAKQEAgLTU1MywyMiArNjc5LDggQEAKIAogCQlkYWMgPSBjaS5zdWNDb25uZWN0b3JJbmZvLnNiZkFjY2Vzcy5iZkFzc29jaWF0ZWREQUM7CiAKLQkJaWYgKChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SUzY5MCkgfHwKLQkJICAgIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SUzc0MCkpIHsKLQkJCWlmICgoaSA9PSBBVE9NX0RFVklDRV9ERlAyX0lOREVYKQotCQkJICAgICYmIChjaS5zdWNJMmNJZC5zYmZBY2Nlc3MuYmZJMkNfTGluZU11eCA9PSAyKSkKLQkJCQliaW9zX2Nvbm5lY3RvcnNbaV0ubGluZV9tdXggPQotCQkJCSAgICBjaS5zdWNJMmNJZC5zYmZBY2Nlc3MuYmZJMkNfTGluZU11eCArIDE7Ci0JCQllbHNlIGlmICgoaSA9PSBBVE9NX0RFVklDRV9ERlAzX0lOREVYKQotCQkJCSAmJiAoY2kuc3VjSTJjSWQuc2JmQWNjZXNzLmJmSTJDX0xpbmVNdXggPT0gMSkpCi0JCQkJYmlvc19jb25uZWN0b3JzW2ldLmxpbmVfbXV4ID0KLQkJCQkgICAgY2kuc3VjSTJjSWQuc2JmQWNjZXNzLmJmSTJDX0xpbmVNdXggKyAxOwotCQkJZWxzZQotCQkJCWJpb3NfY29ubmVjdG9yc1tpXS5saW5lX211eCA9Ci0JCQkJICAgIGNpLnN1Y0kyY0lkLnNiZkFjY2Vzcy5iZkkyQ19MaW5lTXV4OwotCQl9IGVsc2UKLQkJCWJpb3NfY29ubmVjdG9yc1tpXS5saW5lX211eCA9Ci0JCQkgICAgY2kuc3VjSTJjSWQuc2JmQWNjZXNzLmJmSTJDX0xpbmVNdXg7CisJCWJpb3NfY29ubmVjdG9yc1tpXS5saW5lX211eCA9CisJCQljaS5zdWNJMmNJZC51Y0FjY2VzczsKIAogCQkvKiBnaXZlIHR2IHVuaXF1ZSBjb25uZWN0b3IgaWRzICovCiAJCWlmIChpID09IEFUT01fREVWSUNFX1RWMV9JTkRFWCkgewpAQCAtNTgyLDggKzY5NCwzMCBAQAogCQkJYmlvc19jb25uZWN0b3JzW2ldLmxpbmVfbXV4ID0gNTI7CiAJCX0gZWxzZQogCQkJYmlvc19jb25uZWN0b3JzW2ldLmRkY19idXMgPQotCQkJICAgIHJhZGVvbl9sb29rdXBfZ3BpbyhkZXYsCi0JCQkJCSAgICAgICBiaW9zX2Nvbm5lY3RvcnNbaV0ubGluZV9tdXgpOworCQkJICAgIHJhZGVvbl9sb29rdXBfaTJjX2dwaW8ocmRldiwKKwkJCQkJCSAgIGJpb3NfY29ubmVjdG9yc1tpXS5saW5lX211eCk7CisKKwkJaWYgKChjcmV2ID4gMSkgJiYgKGZyZXYgPiAxKSkgeworCQkJdTggaXNiID0gc3VwcG9ydGVkX2RldmljZXMtPmluZm9fMmQxLmFzSW50U3JjSW5mb1tpXS51Y0ludFNyY0JpdG1hcDsKKwkJCXN3aXRjaCAoaXNiKSB7CisJCQljYXNlIDB4NDoKKwkJCQliaW9zX2Nvbm5lY3RvcnNbaV0uaHBkLmhwZCA9IFJBREVPTl9IUERfMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHhhOgorCQkJCWJpb3NfY29ubmVjdG9yc1tpXS5ocGQuaHBkID0gUkFERU9OX0hQRF8yOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQliaW9zX2Nvbm5lY3RvcnNbaV0uaHBkLmhwZCA9IFJBREVPTl9IUERfTk9ORTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChpID09IEFUT01fREVWSUNFX0RGUDFfSU5ERVgpCisJCQkJYmlvc19jb25uZWN0b3JzW2ldLmhwZC5ocGQgPSBSQURFT05fSFBEXzE7CisJCQllbHNlIGlmIChpID09IEFUT01fREVWSUNFX0RGUDJfSU5ERVgpCisJCQkJYmlvc19jb25uZWN0b3JzW2ldLmhwZC5ocGQgPSBSQURFT05fSFBEXzI7CisJCQllbHNlCisJCQkJYmlvc19jb25uZWN0b3JzW2ldLmhwZC5ocGQgPSBSQURFT05fSFBEX05PTkU7CisJCX0KIAogCQkvKiBBbHdheXMgc2V0IHRoZSBjb25uZWN0b3IgdHlwZSB0byBWR0EgZm9yIENSVDEvQ1JUMi4gaWYgdGhleSBhcmUKIAkJICogc2hhcmVkIHdpdGggYSBEVkkgcG9ydCwgd2UnbGwgcGljayB1cCB0aGUgRFZJIGNvbm5lY3RvciB3aGVuIHdlCkBAIC01OTUsNyArNzI5LDggQEAKIAogCQlpZiAoIXJhZGVvbl9hdG9tX2FwcGx5X3F1aXJrcwogCQkgICAgKGRldiwgKDEgPDwgaSksICZiaW9zX2Nvbm5lY3RvcnNbaV0uY29ubmVjdG9yX3R5cGUsCi0JCSAgICAgJmJpb3NfY29ubmVjdG9yc1tpXS5kZGNfYnVzLCAmYmlvc19jb25uZWN0b3JzW2ldLmxpbmVfbXV4KSkKKwkJICAgICAmYmlvc19jb25uZWN0b3JzW2ldLmRkY19idXMsICZiaW9zX2Nvbm5lY3RvcnNbaV0ubGluZV9tdXgsCisJCSAgICAgJmJpb3NfY29ubmVjdG9yc1tpXS5ocGQpKQogCQkJY29udGludWU7CiAKIAkJYmlvc19jb25uZWN0b3JzW2ldLnZhbGlkID0gdHJ1ZTsKQEAgLTYxNyw5ICs3NTIsOSBAQAogCX0KIAogCS8qIGNvbWJpbmUgc2hhcmVkIGNvbm5lY3RvcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVRPTV9NQVhfU1VQUE9SVEVEX0RFVklDRTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IG1heF9kZXZpY2U7IGkrKykgewogCQlpZiAoYmlvc19jb25uZWN0b3JzW2ldLnZhbGlkKSB7Ci0JCQlmb3IgKGogPSAwOyBqIDwgQVRPTV9NQVhfU1VQUE9SVEVEX0RFVklDRTsgaisrKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgbWF4X2RldmljZTsgaisrKSB7CiAJCQkJaWYgKGJpb3NfY29ubmVjdG9yc1tqXS52YWxpZCAmJiAoaSAhPSBqKSkgewogCQkJCQlpZiAoYmlvc19jb25uZWN0b3JzW2ldLmxpbmVfbXV4ID09CiAJCQkJCSAgICBiaW9zX2Nvbm5lY3RvcnNbal0ubGluZV9tdXgpIHsKQEAgLTY0Myw2ICs3NzgsMTAgQEAKIAkJCQkJCQliaW9zX2Nvbm5lY3RvcnNbaV0uCiAJCQkJCQkJICAgIGNvbm5lY3Rvcl90eXBlID0KIAkJCQkJCQkgICAgRFJNX01PREVfQ09OTkVDVE9SX0RWSUk7CisJCQkJCQkJaWYgKGJpb3NfY29ubmVjdG9yc1tqXS5kZXZpY2VzICYKKwkJCQkJCQkgICAgKEFUT01fREVWSUNFX0RGUF9TVVBQT1JUKSkKKwkJCQkJCQkJYmlvc19jb25uZWN0b3JzW2ldLmhwZCA9CisJCQkJCQkJCQliaW9zX2Nvbm5lY3RvcnNbal0uaHBkOwogCQkJCQkJCWJpb3NfY29ubmVjdG9yc1tqXS4KIAkJCQkJCQkgICAgdmFsaWQgPSBmYWxzZTsKIAkJCQkJCX0KQEAgLTY1Myw3ICs3OTIsNyBAQAogCX0KIAogCS8qIGFkZCB0aGUgY29ubmVjdG9ycyAqLwotCWZvciAoaSA9IDA7IGkgPCBBVE9NX01BWF9TVVBQT1JURURfREVWSUNFOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X2RldmljZTsgaSsrKSB7CiAJCWlmIChiaW9zX2Nvbm5lY3RvcnNbaV0udmFsaWQpIHsKIAkJCXVpbnQxNl90IGNvbm5lY3Rvcl9vYmplY3RfaWQgPQogCQkJCWF0b21iaW9zX2dldF9jb25uZWN0b3Jfb2JqZWN0X2lkKGRldiwKQEAgLTY2Niw3ICs4MDUsOCBAQAogCQkJCQkJICBjb25uZWN0b3JfdHlwZSwKIAkJCQkJCSAgJmJpb3NfY29ubmVjdG9yc1tpXS5kZGNfYnVzLAogCQkJCQkJICBmYWxzZSwgMCwKLQkJCQkJCSAgY29ubmVjdG9yX29iamVjdF9pZCk7CisJCQkJCQkgIGNvbm5lY3Rvcl9vYmplY3RfaWQsCisJCQkJCQkgICZiaW9zX2Nvbm5lY3RvcnNbaV0uaHBkKTsKIAkJfQogCX0KIApAQCAtNzMxLDcgKzg3MSw4IEBACiAJCQkgKiBwcmUtRENFIDMuMCByNnh4IGhhcmR3YXJlLiAgVGhpcyBtaWdodCBuZWVkIHRvIGJlIGFkanVzdGVkIHBlcgogCQkJICogZmFtaWx5LgogCQkJICovCi0JCQlwMXBsbC0+cGxsX291dF9taW4gPSA2NDgwMDsKKwkJCWlmICghcmFkZW9uX25ld19wbGwpCisJCQkJcDFwbGwtPnBsbF9vdXRfbWluID0gNjQ4MDA7CiAJCX0KIAogCQlwMXBsbC0+cGxsX2luX21pbiA9CkBAIC04NjEsNiArMTAwMiw3IEBACiAJc3RydWN0IF9BVE9NX1NQUkVBRF9TUEVDVFJVTV9JTkZPICpzc19pbmZvOwogCXVpbnQ4X3QgZnJldiwgY3JldjsKIAlzdHJ1Y3QgcmFkZW9uX2F0b21fc3MgKnNzID0gTlVMTDsKKwlpbnQgaTsKIAogCWlmIChpZCA+IEFUT01fTUFYX1NTX0VOVFJZKQogCQlyZXR1cm4gTlVMTDsKQEAgLTg3OCwxMiArMTAyMCwxNyBAQAogCQlpZiAoIXNzKQogCQkJcmV0dXJuIE5VTEw7CiAKLQkJc3MtPnBlcmNlbnRhZ2UgPSBsZTE2X3RvX2NwdShzc19pbmZvLT5hc1NTX0luZm9baWRdLnVzU3ByZWFkU3BlY3RydW1QZXJjZW50YWdlKTsKLQkJc3MtPnR5cGUgPSBzc19pbmZvLT5hc1NTX0luZm9baWRdLnVjU3ByZWFkU3BlY3RydW1UeXBlOwotCQlzcy0+c3RlcCA9IHNzX2luZm8tPmFzU1NfSW5mb1tpZF0udWNTU19TdGVwOwotCQlzcy0+ZGVsYXkgPSBzc19pbmZvLT5hc1NTX0luZm9baWRdLnVjU1NfRGVsYXk7Ci0JCXNzLT5yYW5nZSA9IHNzX2luZm8tPmFzU1NfSW5mb1tpZF0udWNTU19SYW5nZTsKLQkJc3MtPnJlZmRpdiA9IHNzX2luZm8tPmFzU1NfSW5mb1tpZF0udWNSZWNvbW1lbmRlZFJlZl9EaXY7CisJCWZvciAoaSA9IDA7IGkgPCBBVE9NX01BWF9TU19FTlRSWTsgaSsrKSB7CisJCQlpZiAoc3NfaW5mby0+YXNTU19JbmZvW2ldLnVjU1NfSWQgPT0gaWQpIHsKKwkJCQlzcy0+cGVyY2VudGFnZSA9CisJCQkJCWxlMTZfdG9fY3B1KHNzX2luZm8tPmFzU1NfSW5mb1tpXS51c1NwcmVhZFNwZWN0cnVtUGVyY2VudGFnZSk7CisJCQkJc3MtPnR5cGUgPSBzc19pbmZvLT5hc1NTX0luZm9baV0udWNTcHJlYWRTcGVjdHJ1bVR5cGU7CisJCQkJc3MtPnN0ZXAgPSBzc19pbmZvLT5hc1NTX0luZm9baV0udWNTU19TdGVwOworCQkJCXNzLT5kZWxheSA9IHNzX2luZm8tPmFzU1NfSW5mb1tpXS51Y1NTX0RlbGF5OworCQkJCXNzLT5yYW5nZSA9IHNzX2luZm8tPmFzU1NfSW5mb1tpXS51Y1NTX1JhbmdlOworCQkJCXNzLT5yZWZkaXYgPSBzc19pbmZvLT5hc1NTX0luZm9baV0udWNSZWNvbW1lbmRlZFJlZl9EaXY7CisJCQl9CisJCX0KIAl9CiAJcmV0dXJuIHNzOwogfQpAQCAtOTAxLDcgKzEwNDgsNyBAQAogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgcmFkZW9uX21vZGVfaW5mbyAqbW9kZV9pbmZvID0gJnJkZXYtPm1vZGVfaW5mbzsKIAlpbnQgaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShEQVRBLCBMVkRTX0luZm8pOwotCXVpbnQxNl90IGRhdGFfb2Zmc2V0OworCXVpbnQxNl90IGRhdGFfb2Zmc2V0LCBtaXNjOwogCXVuaW9uIGx2ZHNfaW5mbyAqbHZkc19pbmZvOwogCXVpbnQ4X3QgZnJldiwgY3JldjsKIAlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kaWcgKmx2ZHMgPSBOVUxMOwpAQCAtOTQwLDYgKzEwODcsMTkgQEAKIAkJbHZkcy0+cGFuZWxfcHdyX2RlbGF5ID0KIAkJICAgIGxlMTZfdG9fY3B1KGx2ZHNfaW5mby0+aW5mby51c09mZkRlbGF5SW5Ncyk7CiAJCWx2ZHMtPmx2ZHNfbWlzYyA9IGx2ZHNfaW5mby0+aW5mby51Y0xWRFNfTWlzYzsKKworCQltaXNjID0gbGUxNl90b19jcHUobHZkc19pbmZvLT5pbmZvLnNMQ0RUaW1pbmcuc3VzTW9kZU1pc2NJbmZvLnVzQWNjZXNzKTsKKwkJaWYgKG1pc2MgJiBBVE9NX1ZTWU5DX1BPTEFSSVRZKQorCQkJbHZkcy0+bmF0aXZlX21vZGUuZmxhZ3MgfD0gRFJNX01PREVfRkxBR19OVlNZTkM7CisJCWlmIChtaXNjICYgQVRPTV9IU1lOQ19QT0xBUklUWSkKKwkJCWx2ZHMtPm5hdGl2ZV9tb2RlLmZsYWdzIHw9IERSTV9NT0RFX0ZMQUdfTkhTWU5DOworCQlpZiAobWlzYyAmIEFUT01fQ09NUE9TSVRFU1lOQykKKwkJCWx2ZHMtPm5hdGl2ZV9tb2RlLmZsYWdzIHw9IERSTV9NT0RFX0ZMQUdfQ1NZTkM7CisJCWlmIChtaXNjICYgQVRPTV9JTlRFUkxBQ0UpCisJCQlsdmRzLT5uYXRpdmVfbW9kZS5mbGFncyB8PSBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRTsKKwkJaWYgKG1pc2MgJiBBVE9NX0RPVUJMRV9DTE9DS19NT0RFKQorCQkJbHZkcy0+bmF0aXZlX21vZGUuZmxhZ3MgfD0gRFJNX01PREVfRkxBR19EQkxTQ0FOOworCiAJCS8qIHNldCBjcnRjIHZhbHVlcyAqLwogCQlkcm1fbW9kZV9zZXRfY3J0Y2luZm8oJmx2ZHMtPm5hdGl2ZV9tb2RlLCBDUlRDX0lOVEVSTEFDRV9IQUxWRV9WKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYmVuY2htYXJrLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9iZW5jaG1hcmsuYwppbmRleCAxMGJkNTBhLi40ZGRmZDRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9iZW5jaG1hcmsuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9iZW5jaG1hcmsuYwpAQCAtMjksOCArMjksOCBAQAogdm9pZCByYWRlb25fYmVuY2htYXJrX21vdmUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVuc2lnbmVkIGJzaXplLAogCQkJICAgdW5zaWduZWQgc2RvbWFpbiwgdW5zaWduZWQgZGRvbWFpbikKIHsKLQlzdHJ1Y3QgcmFkZW9uX29iamVjdCAqZG9iaiA9IE5VTEw7Ci0Jc3RydWN0IHJhZGVvbl9vYmplY3QgKnNvYmogPSBOVUxMOworCXN0cnVjdCByYWRlb25fYm8gKmRvYmogPSBOVUxMOworCXN0cnVjdCByYWRlb25fYm8gKnNvYmogPSBOVUxMOwogCXN0cnVjdCByYWRlb25fZmVuY2UgKmZlbmNlID0gTlVMTDsKIAl1aW50NjRfdCBzYWRkciwgZGFkZHI7CiAJdW5zaWduZWQgbG9uZyBzdGFydF9qaWZmaWVzOwpAQCAtNDEsMTkgKzQxLDI3IEBACiAKIAlzaXplID0gYnNpemU7CiAJbiA9IDEwMjQ7Ci0JciA9IHJhZGVvbl9vYmplY3RfY3JlYXRlKHJkZXYsIE5VTEwsIHNpemUsIHRydWUsIHNkb21haW4sIGZhbHNlLCAmc29iaik7CisJciA9IHJhZGVvbl9ib19jcmVhdGUocmRldiwgTlVMTCwgc2l6ZSwgdHJ1ZSwgc2RvbWFpbiwgJnNvYmopOwogCWlmIChyKSB7CiAJCWdvdG8gb3V0X2NsZWFudXA7CiAJfQotCXIgPSByYWRlb25fb2JqZWN0X3Bpbihzb2JqLCBzZG9tYWluLCAmc2FkZHIpOworCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShzb2JqLCBmYWxzZSk7CisJaWYgKHVubGlrZWx5KHIgIT0gMCkpCisJCWdvdG8gb3V0X2NsZWFudXA7CisJciA9IHJhZGVvbl9ib19waW4oc29iaiwgc2RvbWFpbiwgJnNhZGRyKTsKKwlyYWRlb25fYm9fdW5yZXNlcnZlKHNvYmopOwogCWlmIChyKSB7CiAJCWdvdG8gb3V0X2NsZWFudXA7CiAJfQotCXIgPSByYWRlb25fb2JqZWN0X2NyZWF0ZShyZGV2LCBOVUxMLCBzaXplLCB0cnVlLCBkZG9tYWluLCBmYWxzZSwgJmRvYmopOworCXIgPSByYWRlb25fYm9fY3JlYXRlKHJkZXYsIE5VTEwsIHNpemUsIHRydWUsIGRkb21haW4sICZkb2JqKTsKIAlpZiAocikgewogCQlnb3RvIG91dF9jbGVhbnVwOwogCX0KLQlyID0gcmFkZW9uX29iamVjdF9waW4oZG9iaiwgZGRvbWFpbiwgJmRhZGRyKTsKKwlyID0gcmFkZW9uX2JvX3Jlc2VydmUoZG9iaiwgZmFsc2UpOworCWlmICh1bmxpa2VseShyICE9IDApKQorCQlnb3RvIG91dF9jbGVhbnVwOworCXIgPSByYWRlb25fYm9fcGluKGRvYmosIGRkb21haW4sICZkYWRkcik7CisJcmFkZW9uX2JvX3VucmVzZXJ2ZShkb2JqKTsKIAlpZiAocikgewogCQlnb3RvIG91dF9jbGVhbnVwOwogCX0KQEAgLTEwOSwxMiArMTE3LDIwIEBACiAJfQogb3V0X2NsZWFudXA6CiAJaWYgKHNvYmopIHsKLQkJcmFkZW9uX29iamVjdF91bnBpbihzb2JqKTsKLQkJcmFkZW9uX29iamVjdF91bnJlZigmc29iaik7CisJCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShzb2JqLCBmYWxzZSk7CisJCWlmIChsaWtlbHkociA9PSAwKSkgeworCQkJcmFkZW9uX2JvX3VucGluKHNvYmopOworCQkJcmFkZW9uX2JvX3VucmVzZXJ2ZShzb2JqKTsKKwkJfQorCQlyYWRlb25fYm9fdW5yZWYoJnNvYmopOwogCX0KIAlpZiAoZG9iaikgewotCQlyYWRlb25fb2JqZWN0X3VucGluKGRvYmopOwotCQlyYWRlb25fb2JqZWN0X3VucmVmKCZkb2JqKTsKKwkJciA9IHJhZGVvbl9ib19yZXNlcnZlKGRvYmosIGZhbHNlKTsKKwkJaWYgKGxpa2VseShyID09IDApKSB7CisJCQlyYWRlb25fYm9fdW5waW4oZG9iaik7CisJCQlyYWRlb25fYm9fdW5yZXNlcnZlKGRvYmopOworCQl9CisJCXJhZGVvbl9ib191bnJlZigmZG9iaik7CiAJfQogCWlmIChmZW5jZSkgewogCQlyYWRlb25fZmVuY2VfdW5yZWYoJmZlbmNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nsb2Nrcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY2xvY2tzLmMKaW5kZXggYTgxMzU0MS4uYjA2MjEwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY2xvY2tzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY2xvY2tzLmMKQEAgLTQ0LDYgKzQ0LDEwIEBACiAKIAlyZWZfZGl2ID0KIAkgICAgUlJFRzMyX1BMTChSQURFT05fTV9TUExMX1JFRl9GQl9ESVYpICYgUkFERU9OX01fU1BMTF9SRUZfRElWX01BU0s7CisKKwlpZiAocmVmX2RpdiA9PSAwKQorCQlyZXR1cm4gMDsKKwogCXNjbGsgPSBmYl9kaXYgLyByZWZfZGl2OwogCiAJcG9zdF9kaXYgPSBSUkVHMzJfUExMKFJBREVPTl9TQ0xLX0NOVEwpICYgUkFERU9OX1NDTEtfU1JDX1NFTF9NQVNLOwpAQCAtNzAsNiArNzQsMTAgQEAKIAogCXJlZl9kaXYgPQogCSAgICBSUkVHMzJfUExMKFJBREVPTl9NX1NQTExfUkVGX0ZCX0RJVikgJiBSQURFT05fTV9TUExMX1JFRl9ESVZfTUFTSzsKKworCWlmIChyZWZfZGl2ID09IDApCisJCXJldHVybiAwOworCiAJbWNsayA9IGZiX2RpdiAvIHJlZl9kaXY7CiAKIAlwb3N0X2RpdiA9IFJSRUczMl9QTEwoUkFERU9OX01DTEtfQ05UTCkgJiAweDc7CkBAIC05OCw4ICsxMDYsMTkgQEAKIAkJcmV0ID0gcmFkZW9uX2NvbWJpb3NfZ2V0X2Nsb2NrX2luZm8oZGV2KTsKIAogCWlmIChyZXQpIHsKLQkJaWYgKHAxcGxsLT5yZWZlcmVuY2VfZGl2IDwgMikKLQkJCXAxcGxsLT5yZWZlcmVuY2VfZGl2ID0gMTI7CisJCWlmIChwMXBsbC0+cmVmZXJlbmNlX2RpdiA8IDIpIHsKKwkJCWlmICghQVNJQ19JU19BVklWTyhyZGV2KSkgeworCQkJCXUzMiB0bXAgPSBSUkVHMzJfUExMKFJBREVPTl9QUExMX1JFRl9ESVYpOworCQkJCWlmIChBU0lDX0lTX1IzMDAocmRldikpCisJCQkJCXAxcGxsLT5yZWZlcmVuY2VfZGl2ID0KKwkJCQkJCSh0bXAgJiBSMzAwX1BQTExfUkVGX0RJVl9BQ0NfTUFTSykgPj4gUjMwMF9QUExMX1JFRl9ESVZfQUNDX1NISUZUOworCQkJCWVsc2UKKwkJCQkJcDFwbGwtPnJlZmVyZW5jZV9kaXYgPSB0bXAgJiBSQURFT05fUFBMTF9SRUZfRElWX01BU0s7CisJCQkJaWYgKHAxcGxsLT5yZWZlcmVuY2VfZGl2IDwgMikKKwkJCQkJcDFwbGwtPnJlZmVyZW5jZV9kaXYgPSAxMjsKKwkJCX0gZWxzZQorCQkJCXAxcGxsLT5yZWZlcmVuY2VfZGl2ID0gMTI7CisJCX0KIAkJaWYgKHAycGxsLT5yZWZlcmVuY2VfZGl2IDwgMikKIAkJCXAycGxsLT5yZWZlcmVuY2VfZGl2ID0gMTI7CiAJCWlmIChyZGV2LT5mYW1pbHkgPCBDSElQX1JTNjAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb21iaW9zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb21iaW9zLmMKaW5kZXggNTI1M2NiZi4uYzUwMjFhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29tYmlvcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NvbWJpb3MuYwpAQCAtNTAsNyArNTAsOCBAQAogCQkJICAgIHVpbnQzMl90IHN1cHBvcnRlZF9kZXZpY2UsCiAJCQkgICAgaW50IGNvbm5lY3Rvcl90eXBlLAogCQkJICAgIHN0cnVjdCByYWRlb25faTJjX2J1c19yZWMgKmkyY19idXMsCi0JCQkgICAgdWludDE2X3QgY29ubmVjdG9yX29iamVjdF9pZCk7CisJCQkgICAgdWludDE2X3QgY29ubmVjdG9yX29iamVjdF9pZCwKKwkJCSAgICBzdHJ1Y3QgcmFkZW9uX2hwZCAqaHBkKTsKIAogLyogZnJvbSByYWRlb25fbGVnYWN5X2VuY29kZXIuYyAqLwogZXh0ZXJuIHZvaWQKQEAgLTQ0MiwzOSArNDQzLDcxIEBACiAKIH0KIAotc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyBjb21iaW9zX3NldHVwX2kyY19idXMoaW50IGRkY19saW5lKQorc3RhdGljIHN0cnVjdCByYWRlb25faTJjX2J1c19yZWMgY29tYmlvc19zZXR1cF9pMmNfYnVzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJCQkJICAgICAgIGludCBkZGNfbGluZSkKIHsKIAlzdHJ1Y3QgcmFkZW9uX2kyY19idXNfcmVjIGkyYzsKIAotCWkyYy5tYXNrX2Nsa19tYXNrID0gUkFERU9OX0dQSU9fRU5fMTsKLQlpMmMubWFza19kYXRhX21hc2sgPSBSQURFT05fR1BJT19FTl8wOwotCWkyYy5hX2Nsa19tYXNrID0gUkFERU9OX0dQSU9fQV8xOwotCWkyYy5hX2RhdGFfbWFzayA9IFJBREVPTl9HUElPX0FfMDsKLQlpMmMucHV0X2Nsa19tYXNrID0gUkFERU9OX0dQSU9fRU5fMTsKLQlpMmMucHV0X2RhdGFfbWFzayA9IFJBREVPTl9HUElPX0VOXzA7Ci0JaTJjLmdldF9jbGtfbWFzayA9IFJBREVPTl9HUElPX1lfMTsKLQlpMmMuZ2V0X2RhdGFfbWFzayA9IFJBREVPTl9HUElPX1lfMDsKLQlpZiAoKGRkY19saW5lID09IFJBREVPTl9MQ0RfR1BJT19NQVNLKSB8fAotCSAgICAoZGRjX2xpbmUgPT0gUkFERU9OX01ER1BJT19FTl9SRUcpKSB7Ci0JCWkyYy5tYXNrX2Nsa19yZWcgPSBkZGNfbGluZTsKLQkJaTJjLm1hc2tfZGF0YV9yZWcgPSBkZGNfbGluZTsKLQkJaTJjLmFfY2xrX3JlZyA9IGRkY19saW5lOwotCQlpMmMuYV9kYXRhX3JlZyA9IGRkY19saW5lOwotCQlpMmMucHV0X2Nsa19yZWcgPSBkZGNfbGluZTsKLQkJaTJjLnB1dF9kYXRhX3JlZyA9IGRkY19saW5lOwotCQlpMmMuZ2V0X2Nsa19yZWcgPSBkZGNfbGluZSArIDQ7Ci0JCWkyYy5nZXRfZGF0YV9yZWcgPSBkZGNfbGluZSArIDQ7CisJaWYgKGRkY19saW5lID09IFJBREVPTl9HUElPUEFEX01BU0spIHsKKwkJaTJjLm1hc2tfY2xrX3JlZyA9IFJBREVPTl9HUElPUEFEX01BU0s7CisJCWkyYy5tYXNrX2RhdGFfcmVnID0gUkFERU9OX0dQSU9QQURfTUFTSzsKKwkJaTJjLmFfY2xrX3JlZyA9IFJBREVPTl9HUElPUEFEX0E7CisJCWkyYy5hX2RhdGFfcmVnID0gUkFERU9OX0dQSU9QQURfQTsKKwkJaTJjLmVuX2Nsa19yZWcgPSBSQURFT05fR1BJT1BBRF9FTjsKKwkJaTJjLmVuX2RhdGFfcmVnID0gUkFERU9OX0dQSU9QQURfRU47CisJCWkyYy55X2Nsa19yZWcgPSBSQURFT05fR1BJT1BBRF9ZOworCQlpMmMueV9kYXRhX3JlZyA9IFJBREVPTl9HUElPUEFEX1k7CisJfSBlbHNlIGlmIChkZGNfbGluZSA9PSBSQURFT05fTURHUElPX01BU0spIHsKKwkJaTJjLm1hc2tfY2xrX3JlZyA9IFJBREVPTl9NREdQSU9fTUFTSzsKKwkJaTJjLm1hc2tfZGF0YV9yZWcgPSBSQURFT05fTURHUElPX01BU0s7CisJCWkyYy5hX2Nsa19yZWcgPSBSQURFT05fTURHUElPX0E7CisJCWkyYy5hX2RhdGFfcmVnID0gUkFERU9OX01ER1BJT19BOworCQlpMmMuZW5fY2xrX3JlZyA9IFJBREVPTl9NREdQSU9fRU47CisJCWkyYy5lbl9kYXRhX3JlZyA9IFJBREVPTl9NREdQSU9fRU47CisJCWkyYy55X2Nsa19yZWcgPSBSQURFT05fTURHUElPX1k7CisJCWkyYy55X2RhdGFfcmVnID0gUkFERU9OX01ER1BJT19ZOwogCX0gZWxzZSB7CisJCWkyYy5tYXNrX2Nsa19tYXNrID0gUkFERU9OX0dQSU9fRU5fMTsKKwkJaTJjLm1hc2tfZGF0YV9tYXNrID0gUkFERU9OX0dQSU9fRU5fMDsKKwkJaTJjLmFfY2xrX21hc2sgPSBSQURFT05fR1BJT19BXzE7CisJCWkyYy5hX2RhdGFfbWFzayA9IFJBREVPTl9HUElPX0FfMDsKKwkJaTJjLmVuX2Nsa19tYXNrID0gUkFERU9OX0dQSU9fRU5fMTsKKwkJaTJjLmVuX2RhdGFfbWFzayA9IFJBREVPTl9HUElPX0VOXzA7CisJCWkyYy55X2Nsa19tYXNrID0gUkFERU9OX0dQSU9fWV8xOworCQlpMmMueV9kYXRhX21hc2sgPSBSQURFT05fR1BJT19ZXzA7CisKIAkJaTJjLm1hc2tfY2xrX3JlZyA9IGRkY19saW5lOwogCQlpMmMubWFza19kYXRhX3JlZyA9IGRkY19saW5lOwogCQlpMmMuYV9jbGtfcmVnID0gZGRjX2xpbmU7CiAJCWkyYy5hX2RhdGFfcmVnID0gZGRjX2xpbmU7Ci0JCWkyYy5wdXRfY2xrX3JlZyA9IGRkY19saW5lOwotCQlpMmMucHV0X2RhdGFfcmVnID0gZGRjX2xpbmU7Ci0JCWkyYy5nZXRfY2xrX3JlZyA9IGRkY19saW5lOwotCQlpMmMuZ2V0X2RhdGFfcmVnID0gZGRjX2xpbmU7CisJCWkyYy5lbl9jbGtfcmVnID0gZGRjX2xpbmU7CisJCWkyYy5lbl9kYXRhX3JlZyA9IGRkY19saW5lOworCQlpMmMueV9jbGtfcmVnID0gZGRjX2xpbmU7CisJCWkyYy55X2RhdGFfcmVnID0gZGRjX2xpbmU7CiAJfQogCisJaWYgKHJkZXYtPmZhbWlseSA8IENISVBfUjIwMCkKKwkJaTJjLmh3X2NhcGFibGUgPSBmYWxzZTsKKwllbHNlIHsKKwkJc3dpdGNoIChkZGNfbGluZSkgeworCQljYXNlIFJBREVPTl9HUElPX1ZHQV9EREM6CisJCWNhc2UgUkFERU9OX0dQSU9fRFZJX0REQzoKKwkJCWkyYy5od19jYXBhYmxlID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIFJBREVPTl9HUElPX01PTklEOgorCQkJLyogaHcgaTJjIG9uIFJBREVPTl9HUElPX01PTklEIGRvZXNuJ3Qgc2VlbSB0byB3b3JrCisJCQkgKiByZWxpYWJseSBvbiBzb21lIHByZS1yNHh4IGhhcmR3YXJlOyBub3Qgc3VyZSB3aHkuCisJCQkgKi8KKwkJCWkyYy5od19jYXBhYmxlID0gZmFsc2U7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWkyYy5od19jYXBhYmxlID0gZmFsc2U7CisJCQlicmVhazsKKwkJfQorCX0KKwlpMmMubW1faTJjID0gZmFsc2U7CisJaTJjLmkyY19pZCA9IDA7CisKIAlpZiAoZGRjX2xpbmUpCiAJCWkyYy52YWxpZCA9IHRydWU7CiAJZWxzZQpAQCAtNDk1LDcgKzUyOCw3IEBACiAJdWludDE2X3Qgc2NsaywgbWNsazsKIAogCWlmIChyZGV2LT5iaW9zID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gZmFsc2U7CiAKIAlwbGxfaW5mbyA9IGNvbWJpb3NfZ2V0X3RhYmxlX29mZnNldChkZXYsIENPTUJJT1NfUExMX0lORk9fVEFCTEUpOwogCWlmIChwbGxfaW5mbykgewpAQCAtOTkzLDggKzEwMjYsOCBAQAogCXt7MHhmZmZmZmZmZiwgMHhiMDFjYn0sIHswLCAwfSwgezAsIDB9LCB7MCwgMH19LAkvKiBDSElQX1I0MjAgICovCiAJe3sweGZmZmZmZmZmLCAweGIwMWNifSwgezAsIDB9LCB7MCwgMH0sIHswLCAwfX0sCS8qIENISVBfUjQyMyAgKi8KIAl7ezB4ZmZmZmZmZmYsIDB4YjAxY2J9LCB7MCwgMH0sIHswLCAwfSwgezAsIDB9fSwJLyogQ0hJUF9SVjQxMCAqLwotCXt7MTUwMDAsIDB4YjAxNTV9LCB7MHhmZmZmZmZmZiwgMHhiMDFjYn0sIHswLCAwfSwgezAsIDB9fSwJLyogQ0hJUF9SUzQwMCAqLwotCXt7MTUwMDAsIDB4YjAxNTV9LCB7MHhmZmZmZmZmZiwgMHhiMDFjYn0sIHswLCAwfSwgezAsIDB9fSwJLyogQ0hJUF9SUzQ4MCAqLworCXsgezAsIDB9LCB7MCwgMH0sIHswLCAwfSwgezAsIDB9IH0sCS8qIENISVBfUlM0MDAgKi8KKwl7IHswLCAwfSwgezAsIDB9LCB7MCwgMH0sIHswLCAwfSB9LAkvKiBDSElQX1JTNDgwICovCiB9OwogCiBib29sIHJhZGVvbl9sZWdhY3lfZ2V0X3RtZHNfaW5mb19mcm9tX3RhYmxlKHN0cnVjdCByYWRlb25fZW5jb2RlciAqZW5jb2RlciwKQEAgLTEwMjgsNyArMTA2MSw2IEBACiAJdG1kc19pbmZvID0gY29tYmlvc19nZXRfdGFibGVfb2Zmc2V0KGRldiwgQ09NQklPU19ERlBfSU5GT19UQUJMRSk7CiAKIAlpZiAodG1kc19pbmZvKSB7Ci0KIAkJdmVyID0gUkJJT1M4KHRtZHNfaW5mbyk7CiAJCURSTV9JTkZPKCJERlAgdGFibGUgcmV2aXNpb246ICVkXG4iLCB2ZXIpOwogCQlpZiAodmVyID09IDMpIHsKQEAgLTEwNjMsNTEgKzEwOTUsMTM5IEBACiAJCQkJCSAgdG1kcy0+dG1kc19wbGxbaV0udmFsdWUpOwogCQkJfQogCQl9Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJRFJNX0lORk8oIk5vIFRNRFMgaW5mbyBmb3VuZCBpbiBCSU9TXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RydWN0IHJhZGVvbl9lbmNvZGVyX2ludF90bWRzICpyYWRlb25fY29tYmlvc19nZXRfdG1kc19pbmZvKHN0cnVjdCByYWRlb25fZW5jb2RlciAqZW5jb2RlcikKLXsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfaW50X3RtZHMgKnRtZHMgPSBOVUxMOwotCWJvb2wgcmV0OwotCi0JdG1kcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByYWRlb25fZW5jb2Rlcl9pbnRfdG1kcyksIEdGUF9LRVJORUwpOwotCi0JaWYgKCF0bWRzKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldCA9IHJhZGVvbl9sZWdhY3lfZ2V0X3RtZHNfaW5mb19mcm9tX2NvbWJpb3MoZW5jb2RlciwgdG1kcyk7Ci0JaWYgKHJldCA9PSBmYWxzZSkKLQkJcmFkZW9uX2xlZ2FjeV9nZXRfdG1kc19pbmZvX2Zyb21fdGFibGUoZW5jb2RlciwgdG1kcyk7Ci0KLQlyZXR1cm4gdG1kczsKLX0KLQotdm9pZCByYWRlb25fY29tYmlvc19nZXRfZXh0X3RtZHNfaW5mbyhzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKmVuY29kZXIpCitib29sIHJhZGVvbl9sZWdhY3lfZ2V0X2V4dF90bWRzX2luZm9fZnJvbV90YWJsZShzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKmVuY29kZXIsCisJCQkJCQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfZXh0X3RtZHMgKnRtZHMpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmJhc2UuZGV2OwogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1aW50MTZfdCBleHRfdG1kc19pbmZvOwotCXVpbnQ4X3QgdmVyOworCXN0cnVjdCByYWRlb25faTJjX2J1c19yZWMgaTJjX2J1czsKKworCS8qIGRlZmF1bHQgZm9yIG1hY3MgKi8KKwlpMmNfYnVzID0gY29tYmlvc19zZXR1cF9pMmNfYnVzKHJkZXYsIFJBREVPTl9HUElPX01PTklEKTsKKwl0bWRzLT5pMmNfYnVzID0gcmFkZW9uX2kyY19jcmVhdGUoZGV2LCAmaTJjX2J1cywgIkRWTyIpOworCisJLyogWFhYIHNvbWUgbWFjcyBoYXZlIGR1YWxsaW5rIGNoaXBzICovCisJc3dpdGNoIChyZGV2LT5tb2RlX2luZm8uY29ubmVjdG9yX3RhYmxlKSB7CisJY2FzZSBDVF9QT1dFUkJPT0tfRVhURVJOQUw6CisJY2FzZSBDVF9NSU5JX0VYVEVSTkFMOgorCWRlZmF1bHQ6CisJCXRtZHMtPmR2b19jaGlwID0gRFZPX1NJTDE2NDsKKwkJdG1kcy0+c2xhdmVfYWRkciA9IDB4NzAgPj4gMTsgLyogNyBiaXQgYWRkcmVzc2luZyAqLworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCByYWRlb25fbGVnYWN5X2dldF9leHRfdG1kc19pbmZvX2Zyb21fY29tYmlvcyhzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKmVuY29kZXIsCisJCQkJCQkgIHN0cnVjdCByYWRlb25fZW5jb2Rlcl9leHRfdG1kcyAqdG1kcykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+YmFzZS5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQxNl90IG9mZnNldDsKKwl1aW50OF90IHZlciwgaWQsIGJsb2NrcywgY2xrLCBkYXRhOworCWludCBpOworCWVudW0gcmFkZW9uX2NvbWJpb3NfZGRjIGdwaW87CisJc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyBpMmNfYnVzOwogCiAJaWYgKHJkZXYtPmJpb3MgPT0gTlVMTCkKLQkJcmV0dXJuOworCQlyZXR1cm4gZmFsc2U7CiAKLQlleHRfdG1kc19pbmZvID0KLQkgICAgY29tYmlvc19nZXRfdGFibGVfb2Zmc2V0KGRldiwgQ09NQklPU19FWFRfVE1EU19JTkZPX1RBQkxFKTsKLQlpZiAoZXh0X3RtZHNfaW5mbykgewotCQl2ZXIgPSBSQklPUzgoZXh0X3RtZHNfaW5mbyk7Ci0JCURSTV9JTkZPKCJFeHRlcm5hbCBUTURTIFRhYmxlIHJldmlzaW9uOiAlZFxuIiwgdmVyKTsKLQkJLy8gVE9ETworCXRtZHMtPmkyY19idXMgPSBOVUxMOworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApIHsKKwkJb2Zmc2V0ID0gY29tYmlvc19nZXRfdGFibGVfb2Zmc2V0KGRldiwgQ09NQklPU19JMkNfSU5GT19UQUJMRSk7CisJCWlmIChvZmZzZXQpIHsKKwkJCXZlciA9IFJCSU9TOChvZmZzZXQpOworCQkJRFJNX0lORk8oIkdQSU8gVGFibGUgcmV2aXNpb246ICVkXG4iLCB2ZXIpOworCQkJYmxvY2tzID0gUkJJT1M4KG9mZnNldCArIDIpOworCQkJZm9yIChpID0gMDsgaSA8IGJsb2NrczsgaSsrKSB7CisJCQkJaWQgPSBSQklPUzgob2Zmc2V0ICsgMyArIChpICogNSkgKyAwKTsKKwkJCQlpZiAoaWQgPT0gMTM2KSB7CisJCQkJCWNsayA9IFJCSU9TOChvZmZzZXQgKyAzICsgKGkgKiA1KSArIDMpOworCQkJCQlkYXRhID0gUkJJT1M4KG9mZnNldCArIDMgKyAoaSAqIDUpICsgNCk7CisJCQkJCWkyY19idXMudmFsaWQgPSB0cnVlOworCQkJCQlpMmNfYnVzLm1hc2tfY2xrX21hc2sgPSAoMSA8PCBjbGspOworCQkJCQlpMmNfYnVzLm1hc2tfZGF0YV9tYXNrID0gKDEgPDwgZGF0YSk7CisJCQkJCWkyY19idXMuYV9jbGtfbWFzayA9ICgxIDw8IGNsayk7CisJCQkJCWkyY19idXMuYV9kYXRhX21hc2sgPSAoMSA8PCBkYXRhKTsKKwkJCQkJaTJjX2J1cy5lbl9jbGtfbWFzayA9ICgxIDw8IGNsayk7CisJCQkJCWkyY19idXMuZW5fZGF0YV9tYXNrID0gKDEgPDwgZGF0YSk7CisJCQkJCWkyY19idXMueV9jbGtfbWFzayA9ICgxIDw8IGNsayk7CisJCQkJCWkyY19idXMueV9kYXRhX21hc2sgPSAoMSA8PCBkYXRhKTsKKwkJCQkJaTJjX2J1cy5tYXNrX2Nsa19yZWcgPSBSQURFT05fR1BJT1BBRF9NQVNLOworCQkJCQlpMmNfYnVzLm1hc2tfZGF0YV9yZWcgPSBSQURFT05fR1BJT1BBRF9NQVNLOworCQkJCQlpMmNfYnVzLmFfY2xrX3JlZyA9IFJBREVPTl9HUElPUEFEX0E7CisJCQkJCWkyY19idXMuYV9kYXRhX3JlZyA9IFJBREVPTl9HUElPUEFEX0E7CisJCQkJCWkyY19idXMuZW5fY2xrX3JlZyA9IFJBREVPTl9HUElPUEFEX0VOOworCQkJCQlpMmNfYnVzLmVuX2RhdGFfcmVnID0gUkFERU9OX0dQSU9QQURfRU47CisJCQkJCWkyY19idXMueV9jbGtfcmVnID0gUkFERU9OX0dQSU9QQURfWTsKKwkJCQkJaTJjX2J1cy55X2RhdGFfcmVnID0gUkFERU9OX0dQSU9QQURfWTsKKwkJCQkJdG1kcy0+aTJjX2J1cyA9IHJhZGVvbl9pMmNfY3JlYXRlKGRldiwgJmkyY19idXMsICJEVk8iKTsKKwkJCQkJdG1kcy0+ZHZvX2NoaXAgPSBEVk9fU0lMMTY0OworCQkJCQl0bWRzLT5zbGF2ZV9hZGRyID0gMHg3MCA+PiAxOyAvKiA3IGJpdCBhZGRyZXNzaW5nICovCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCW9mZnNldCA9IGNvbWJpb3NfZ2V0X3RhYmxlX29mZnNldChkZXYsIENPTUJJT1NfRVhUX1RNRFNfSU5GT19UQUJMRSk7CisJCWlmIChvZmZzZXQpIHsKKwkJCXZlciA9IFJCSU9TOChvZmZzZXQpOworCQkJRFJNX0lORk8oIkV4dGVybmFsIFRNRFMgVGFibGUgcmV2aXNpb246ICVkXG4iLCB2ZXIpOworCQkJdG1kcy0+c2xhdmVfYWRkciA9IFJCSU9TOChvZmZzZXQgKyA0ICsgMik7CisJCQl0bWRzLT5zbGF2ZV9hZGRyID4+PSAxOyAvKiA3IGJpdCBhZGRyZXNzaW5nICovCisJCQlncGlvID0gUkJJT1M4KG9mZnNldCArIDQgKyAzKTsKKwkJCXN3aXRjaCAoZ3BpbykgeworCQkJY2FzZSBERENfTU9OSUQ6CisJCQkJaTJjX2J1cyA9IGNvbWJpb3Nfc2V0dXBfaTJjX2J1cyhyZGV2LCBSQURFT05fR1BJT19NT05JRCk7CisJCQkJdG1kcy0+aTJjX2J1cyA9IHJhZGVvbl9pMmNfY3JlYXRlKGRldiwgJmkyY19idXMsICJEVk8iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRERDX0RWSToKKwkJCQlpMmNfYnVzID0gY29tYmlvc19zZXR1cF9pMmNfYnVzKHJkZXYsIFJBREVPTl9HUElPX0RWSV9EREMpOworCQkJCXRtZHMtPmkyY19idXMgPSByYWRlb25faTJjX2NyZWF0ZShkZXYsICZpMmNfYnVzLCAiRFZPIik7CisJCQkJYnJlYWs7CisJCQljYXNlIEREQ19WR0E6CisJCQkJaTJjX2J1cyA9IGNvbWJpb3Nfc2V0dXBfaTJjX2J1cyhyZGV2LCBSQURFT05fR1BJT19WR0FfRERDKTsKKwkJCQl0bWRzLT5pMmNfYnVzID0gcmFkZW9uX2kyY19jcmVhdGUoZGV2LCAmaTJjX2J1cywgIkRWTyIpOworCQkJCWJyZWFrOworCQkJY2FzZSBERENfQ1JUMjoKKwkJCQkvKiBSM3h4KyBjaGlwcyBkb24ndCBoYXZlIEdQSU9fQ1JUMl9EREMgZ3BpbyBwYWQgKi8KKwkJCQlpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUjMwMCkKKwkJCQkJaTJjX2J1cyA9IGNvbWJpb3Nfc2V0dXBfaTJjX2J1cyhyZGV2LCBSQURFT05fR1BJT19NT05JRCk7CisJCQkJZWxzZQorCQkJCQlpMmNfYnVzID0gY29tYmlvc19zZXR1cF9pMmNfYnVzKHJkZXYsIFJBREVPTl9HUElPX0NSVDJfRERDKTsKKwkJCQl0bWRzLT5pMmNfYnVzID0gcmFkZW9uX2kyY19jcmVhdGUoZGV2LCAmaTJjX2J1cywgIkRWTyIpOworCQkJCWJyZWFrOworCQkJY2FzZSBERENfTENEOiAvKiBNTSBpMmMgKi8KKwkJCQlEUk1fRVJST1IoIk1NIGkyYyByZXF1aXJlcyBodyBpMmMgZW5naW5lXG4iKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJRFJNX0VSUk9SKCJVbnN1cHBvcnRlZCBncGlvICVkXG4iLCBncGlvKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQogCX0KKworCWlmICghdG1kcy0+aTJjX2J1cykgeworCQlEUk1fSU5GTygiTm8gdmFsaWQgRXh0IFRNRFMgaW5mbyBmb3VuZCBpbiBCSU9TXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOwogfQogCiBib29sIHJhZGVvbl9nZXRfbGVnYWN5X2Nvbm5lY3Rvcl9pbmZvX2Zyb21fdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyBkZGNfaTJjOworCXN0cnVjdCByYWRlb25faHBkIGhwZDsKIAogCXJkZXYtPm1vZGVfaW5mby5jb25uZWN0b3JfdGFibGUgPSByYWRlb25fY29ubmVjdG9yX3RhYmxlOwogCWlmIChyZGV2LT5tb2RlX2luZm8uY29ubmVjdG9yX3RhYmxlID09IENUX05PTkUpIHsKQEAgLTExNjgsNyArMTI4OCw4IEBACiAJCS8qIHRoZXNlIGFyZSB0aGUgbW9zdCBjb21tb24gc2V0dGluZ3MgKi8KIAkJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX1NJTkdMRV9DUlRDKSB7CiAJCQkvKiBWR0EgLSBwcmltYXJ5IGRhYyAqLwotCQkJZGRjX2kyYyA9IGNvbWJpb3Nfc2V0dXBfaTJjX2J1cyhSQURFT05fR1BJT19WR0FfRERDKTsKKwkJCWRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMocmRldiwgUkFERU9OX0dQSU9fVkdBX0REQyk7CisJCQlocGQuaHBkID0gUkFERU9OX0hQRF9OT05FOwogCQkJcmFkZW9uX2FkZF9sZWdhY3lfZW5jb2RlcihkZXYsCiAJCQkJCQkgIHJhZGVvbl9nZXRfZW5jb2Rlcl9pZChkZXYsCiAJCQkJCQkJCQlBVE9NX0RFVklDRV9DUlQxX1NVUFBPUlQsCkBAIC0xMTc4LDEwICsxMjk5LDEyIEBACiAJCQkJCQkgICAgQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JULAogCQkJCQkJICAgIERSTV9NT0RFX0NPTk5FQ1RPUl9WR0EsCiAJCQkJCQkgICAgJmRkY19pMmMsCi0JCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9WR0EpOworCQkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfVkdBLAorCQkJCQkJICAgICZocGQpOwogCQl9IGVsc2UgaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX01PQklMSVRZKSB7CiAJCQkvKiBMVkRTICovCi0JCQlkZGNfaTJjID0gY29tYmlvc19zZXR1cF9pMmNfYnVzKFJBREVPTl9MQ0RfR1BJT19NQVNLKTsKKwkJCWRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMocmRldiwgMCk7CisJCQlocGQuaHBkID0gUkFERU9OX0hQRF9OT05FOwogCQkJcmFkZW9uX2FkZF9sZWdhY3lfZW5jb2RlcihkZXYsCiAJCQkJCQkgIHJhZGVvbl9nZXRfZW5jb2Rlcl9pZChkZXYsCiAJCQkJCQkJCQlBVE9NX0RFVklDRV9MQ0QxX1NVUFBPUlQsCkBAIC0xMTkxLDEwICsxMzE0LDEyIEBACiAJCQkJCQkgICAgQVRPTV9ERVZJQ0VfTENEMV9TVVBQT1JULAogCQkJCQkJICAgIERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTLAogCQkJCQkJICAgICZkZGNfaTJjLAotCQkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfTFZEUyk7CisJCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9MVkRTLAorCQkJCQkJICAgICZocGQpOwogCiAJCQkvKiBWR0EgLSBwcmltYXJ5IGRhYyAqLwotCQkJZGRjX2kyYyA9IGNvbWJpb3Nfc2V0dXBfaTJjX2J1cyhSQURFT05fR1BJT19WR0FfRERDKTsKKwkJCWRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMocmRldiwgUkFERU9OX0dQSU9fVkdBX0REQyk7CisJCQlocGQuaHBkID0gUkFERU9OX0hQRF9OT05FOwogCQkJcmFkZW9uX2FkZF9sZWdhY3lfZW5jb2RlcihkZXYsCiAJCQkJCQkgIHJhZGVvbl9nZXRfZW5jb2Rlcl9pZChkZXYsCiAJCQkJCQkJCQlBVE9NX0RFVklDRV9DUlQxX1NVUFBPUlQsCkBAIC0xMjA0LDEwICsxMzI5LDEyIEBACiAJCQkJCQkgICAgQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JULAogCQkJCQkJICAgIERSTV9NT0RFX0NPTk5FQ1RPUl9WR0EsCiAJCQkJCQkgICAgJmRkY19pMmMsCi0JCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9WR0EpOworCQkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfVkdBLAorCQkJCQkJICAgICZocGQpOwogCQl9IGVsc2UgewogCQkJLyogRFZJLUkgLSB0diBkYWMsIGludCB0bWRzICovCi0JCQlkZGNfaTJjID0gY29tYmlvc19zZXR1cF9pMmNfYnVzKFJBREVPTl9HUElPX0RWSV9EREMpOworCQkJZGRjX2kyYyA9IGNvbWJpb3Nfc2V0dXBfaTJjX2J1cyhyZGV2LCBSQURFT05fR1BJT19EVklfRERDKTsKKwkJCWhwZC5ocGQgPSBSQURFT05fSFBEXzE7CiAJCQlyYWRlb25fYWRkX2xlZ2FjeV9lbmNvZGVyKGRldiwKIAkJCQkJCSAgcmFkZW9uX2dldF9lbmNvZGVyX2lkKGRldiwKIAkJCQkJCQkJCUFUT01fREVWSUNFX0RGUDFfU1VQUE9SVCwKQEAgLTEyMjMsMTAgKzEzNTAsMTIgQEAKIAkJCQkJCSAgICBBVE9NX0RFVklDRV9DUlQyX1NVUFBPUlQsCiAJCQkJCQkgICAgRFJNX01PREVfQ09OTkVDVE9SX0RWSUksCiAJCQkJCQkgICAgJmRkY19pMmMsCi0JCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9TSU5HTEVfTElOS19EVklfSSk7CisJCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9TSU5HTEVfTElOS19EVklfSSwKKwkJCQkJCSAgICAmaHBkKTsKIAogCQkJLyogVkdBIC0gcHJpbWFyeSBkYWMgKi8KLQkJCWRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMoUkFERU9OX0dQSU9fVkdBX0REQyk7CisJCQlkZGNfaTJjID0gY29tYmlvc19zZXR1cF9pMmNfYnVzKHJkZXYsIFJBREVPTl9HUElPX1ZHQV9EREMpOworCQkJaHBkLmhwZCA9IFJBREVPTl9IUERfTk9ORTsKIAkJCXJhZGVvbl9hZGRfbGVnYWN5X2VuY29kZXIoZGV2LAogCQkJCQkJICByYWRlb25fZ2V0X2VuY29kZXJfaWQoZGV2LAogCQkJCQkJCQkJQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JULApAQCAtMTIzNiwxMSArMTM2NSwxNCBAQAogCQkJCQkJICAgIEFUT01fREVWSUNFX0NSVDFfU1VQUE9SVCwKIAkJCQkJCSAgICBEUk1fTU9ERV9DT05ORUNUT1JfVkdBLAogCQkJCQkJICAgICZkZGNfaTJjLAotCQkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfVkdBKTsKKwkJCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1ZHQSwKKwkJCQkJCSAgICAmaHBkKTsKIAkJfQogCiAJCWlmIChyZGV2LT5mYW1pbHkgIT0gQ0hJUF9SMTAwICYmIHJkZXYtPmZhbWlseSAhPSBDSElQX1IyMDApIHsKIAkJCS8qIFRWIC0gdHYgZGFjICovCisJCQlkZGNfaTJjLnZhbGlkID0gZmFsc2U7CisJCQlocGQuaHBkID0gUkFERU9OX0hQRF9OT05FOwogCQkJcmFkZW9uX2FkZF9sZWdhY3lfZW5jb2RlcihkZXYsCiAJCQkJCQkgIHJhZGVvbl9nZXRfZW5jb2Rlcl9pZChkZXYsCiAJCQkJCQkJCQlBVE9NX0RFVklDRV9UVjFfU1VQUE9SVCwKQEAgLTEyNTAsMTQgKzEzODIsMTYgQEAKIAkJCQkJCSAgICBBVE9NX0RFVklDRV9UVjFfU1VQUE9SVCwKIAkJCQkJCSAgICBEUk1fTU9ERV9DT05ORUNUT1JfU1ZJREVPLAogCQkJCQkJICAgICZkZGNfaTJjLAotCQkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfU1ZJREVPKTsKKwkJCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1NWSURFTywKKwkJCQkJCSAgICAmaHBkKTsKIAkJfQogCQlicmVhazsKIAljYXNlIENUX0lCT09LOgogCQlEUk1fSU5GTygiQ29ubmVjdG9yIFRhYmxlOiAlZCAoaWJvb2spXG4iLAogCQkJIHJkZXYtPm1vZGVfaW5mby5jb25uZWN0b3JfdGFibGUpOwogCQkvKiBMVkRTICovCi0JCWRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMoUkFERU9OX0dQSU9fRFZJX0REQyk7CisJCWRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMocmRldiwgUkFERU9OX0dQSU9fRFZJX0REQyk7CisJCWhwZC5ocGQgPSBSQURFT05fSFBEX05PTkU7CiAJCXJhZGVvbl9hZGRfbGVnYWN5X2VuY29kZXIoZGV2LAogCQkJCQkgIHJhZGVvbl9nZXRfZW5jb2Rlcl9pZChkZXYsCiAJCQkJCQkJCUFUT01fREVWSUNFX0xDRDFfU1VQUE9SVCwKQEAgLTEyNjUsOSArMTM5OSwxMSBAQAogCQkJCQkgIEFUT01fREVWSUNFX0xDRDFfU1VQUE9SVCk7CiAJCXJhZGVvbl9hZGRfbGVnYWN5X2Nvbm5lY3RvcihkZXYsIDAsIEFUT01fREVWSUNFX0xDRDFfU1VQUE9SVCwKIAkJCQkJICAgIERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTLCAmZGRjX2kyYywKLQkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfTFZEUyk7CisJCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX0xWRFMsCisJCQkJCSAgICAmaHBkKTsKIAkJLyogVkdBIC0gVFYgREFDICovCi0JCWRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMoUkFERU9OX0dQSU9fVkdBX0REQyk7CisJCWRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMocmRldiwgUkFERU9OX0dQSU9fVkdBX0REQyk7CisJCWhwZC5ocGQgPSBSQURFT05fSFBEX05PTkU7CiAJCXJhZGVvbl9hZGRfbGVnYWN5X2VuY29kZXIoZGV2LAogCQkJCQkgIHJhZGVvbl9nZXRfZW5jb2Rlcl9pZChkZXYsCiAJCQkJCQkJCUFUT01fREVWSUNFX0NSVDJfU1VQUE9SVCwKQEAgLTEyNzUsOCArMTQxMSwxMSBAQAogCQkJCQkgIEFUT01fREVWSUNFX0NSVDJfU1VQUE9SVCk7CiAJCXJhZGVvbl9hZGRfbGVnYWN5X2Nvbm5lY3RvcihkZXYsIDEsIEFUT01fREVWSUNFX0NSVDJfU1VQUE9SVCwKIAkJCQkJICAgIERSTV9NT0RFX0NPTk5FQ1RPUl9WR0EsICZkZGNfaTJjLAotCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9WR0EpOworCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9WR0EsCisJCQkJCSAgICAmaHBkKTsKIAkJLyogVFYgLSBUViBEQUMgKi8KKwkJZGRjX2kyYy52YWxpZCA9IGZhbHNlOworCQlocGQuaHBkID0gUkFERU9OX0hQRF9OT05FOwogCQlyYWRlb25fYWRkX2xlZ2FjeV9lbmNvZGVyKGRldiwKIAkJCQkJICByYWRlb25fZ2V0X2VuY29kZXJfaWQoZGV2LAogCQkJCQkJCQlBVE9NX0RFVklDRV9UVjFfU1VQUE9SVCwKQEAgLTEyODUsMTMgKzE0MjQsMTUgQEAKIAkJcmFkZW9uX2FkZF9sZWdhY3lfY29ubmVjdG9yKGRldiwgMiwgQVRPTV9ERVZJQ0VfVFYxX1NVUFBPUlQsCiAJCQkJCSAgICBEUk1fTU9ERV9DT05ORUNUT1JfU1ZJREVPLAogCQkJCQkgICAgJmRkY19pMmMsCi0JCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1NWSURFTyk7CisJCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1NWSURFTywKKwkJCQkJICAgICZocGQpOwogCQlicmVhazsKIAljYXNlIENUX1BPV0VSQk9PS19FWFRFUk5BTDoKIAkJRFJNX0lORk8oIkNvbm5lY3RvciBUYWJsZTogJWQgKHBvd2VyYm9vayBleHRlcm5hbCB0bWRzKVxuIiwKIAkJCSByZGV2LT5tb2RlX2luZm8uY29ubmVjdG9yX3RhYmxlKTsKIAkJLyogTFZEUyAqLwotCQlkZGNfaTJjID0gY29tYmlvc19zZXR1cF9pMmNfYnVzKFJBREVPTl9HUElPX0RWSV9EREMpOworCQlkZGNfaTJjID0gY29tYmlvc19zZXR1cF9pMmNfYnVzKHJkZXYsIFJBREVPTl9HUElPX0RWSV9EREMpOworCQlocGQuaHBkID0gUkFERU9OX0hQRF9OT05FOwogCQlyYWRlb25fYWRkX2xlZ2FjeV9lbmNvZGVyKGRldiwKIAkJCQkJICByYWRlb25fZ2V0X2VuY29kZXJfaWQoZGV2LAogCQkJCQkJCQlBVE9NX0RFVklDRV9MQ0QxX1NVUFBPUlQsCkBAIC0xMjk5LDkgKzE0NDAsMTEgQEAKIAkJCQkJICBBVE9NX0RFVklDRV9MQ0QxX1NVUFBPUlQpOwogCQlyYWRlb25fYWRkX2xlZ2FjeV9jb25uZWN0b3IoZGV2LCAwLCBBVE9NX0RFVklDRV9MQ0QxX1NVUFBPUlQsCiAJCQkJCSAgICBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUywgJmRkY19pMmMsCi0JCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX0xWRFMpOworCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9MVkRTLAorCQkJCQkgICAgJmhwZCk7CiAJCS8qIERWSS1JIC0gcHJpbWFyeSBkYWMsIGV4dCB0bWRzICovCi0JCWRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMoUkFERU9OX0dQSU9fVkdBX0REQyk7CisJCWRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMocmRldiwgUkFERU9OX0dQSU9fVkdBX0REQyk7CisJCWhwZC5ocGQgPSBSQURFT05fSFBEXzI7IC8qID8/PyAqLwogCQlyYWRlb25fYWRkX2xlZ2FjeV9lbmNvZGVyKGRldiwKIAkJCQkJICByYWRlb25fZ2V0X2VuY29kZXJfaWQoZGV2LAogCQkJCQkJCQlBVE9NX0RFVklDRV9ERlAyX1NVUFBPUlQsCkBAIC0xMzE3LDggKzE0NjAsMTEgQEAKIAkJCQkJICAgIEFUT01fREVWSUNFX0RGUDJfU1VQUE9SVCB8CiAJCQkJCSAgICBBVE9NX0RFVklDRV9DUlQxX1NVUFBPUlQsCiAJCQkJCSAgICBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSSwgJmRkY19pMmMsCi0JCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX0RVQUxfTElOS19EVklfSSk7CisJCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX0RVQUxfTElOS19EVklfSSwKKwkJCQkJICAgICZocGQpOwogCQkvKiBUViAtIFRWIERBQyAqLworCQlkZGNfaTJjLnZhbGlkID0gZmFsc2U7CisJCWhwZC5ocGQgPSBSQURFT05fSFBEX05PTkU7CiAJCXJhZGVvbl9hZGRfbGVnYWN5X2VuY29kZXIoZGV2LAogCQkJCQkgIHJhZGVvbl9nZXRfZW5jb2Rlcl9pZChkZXYsCiAJCQkJCQkJCUFUT01fREVWSUNFX1RWMV9TVVBQT1JULApAQCAtMTMyNywxMyArMTQ3MywxNSBAQAogCQlyYWRlb25fYWRkX2xlZ2FjeV9jb25uZWN0b3IoZGV2LCAyLCBBVE9NX0RFVklDRV9UVjFfU1VQUE9SVCwKIAkJCQkJICAgIERSTV9NT0RFX0NPTk5FQ1RPUl9TVklERU8sCiAJCQkJCSAgICAmZGRjX2kyYywKLQkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfU1ZJREVPKTsKKwkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfU1ZJREVPLAorCQkJCQkgICAgJmhwZCk7CiAJCWJyZWFrOwogCWNhc2UgQ1RfUE9XRVJCT09LX0lOVEVSTkFMOgogCQlEUk1fSU5GTygiQ29ubmVjdG9yIFRhYmxlOiAlZCAocG93ZXJib29rIGludGVybmFsIHRtZHMpXG4iLAogCQkJIHJkZXYtPm1vZGVfaW5mby5jb25uZWN0b3JfdGFibGUpOwogCQkvKiBMVkRTICovCi0JCWRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMoUkFERU9OX0dQSU9fRFZJX0REQyk7CisJCWRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMocmRldiwgUkFERU9OX0dQSU9fRFZJX0REQyk7CisJCWhwZC5ocGQgPSBSQURFT05fSFBEX05PTkU7CiAJCXJhZGVvbl9hZGRfbGVnYWN5X2VuY29kZXIoZGV2LAogCQkJCQkgIHJhZGVvbl9nZXRfZW5jb2Rlcl9pZChkZXYsCiAJCQkJCQkJCUFUT01fREVWSUNFX0xDRDFfU1VQUE9SVCwKQEAgLTEzNDEsOSArMTQ4OSwxMSBAQAogCQkJCQkgIEFUT01fREVWSUNFX0xDRDFfU1VQUE9SVCk7CiAJCXJhZGVvbl9hZGRfbGVnYWN5X2Nvbm5lY3RvcihkZXYsIDAsIEFUT01fREVWSUNFX0xDRDFfU1VQUE9SVCwKIAkJCQkJICAgIERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTLCAmZGRjX2kyYywKLQkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfTFZEUyk7CisJCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX0xWRFMsCisJCQkJCSAgICAmaHBkKTsKIAkJLyogRFZJLUkgLSBwcmltYXJ5IGRhYywgaW50IHRtZHMgKi8KLQkJZGRjX2kyYyA9IGNvbWJpb3Nfc2V0dXBfaTJjX2J1cyhSQURFT05fR1BJT19WR0FfRERDKTsKKwkJZGRjX2kyYyA9IGNvbWJpb3Nfc2V0dXBfaTJjX2J1cyhyZGV2LCBSQURFT05fR1BJT19WR0FfRERDKTsKKwkJaHBkLmhwZCA9IFJBREVPTl9IUERfMTsgLyogPz8/ICovCiAJCXJhZGVvbl9hZGRfbGVnYWN5X2VuY29kZXIoZGV2LAogCQkJCQkgIHJhZGVvbl9nZXRfZW5jb2Rlcl9pZChkZXYsCiAJCQkJCQkJCUFUT01fREVWSUNFX0RGUDFfU1VQUE9SVCwKQEAgLTEzNTgsOCArMTUwOCwxMSBAQAogCQkJCQkgICAgQVRPTV9ERVZJQ0VfREZQMV9TVVBQT1JUIHwKIAkJCQkJICAgIEFUT01fREVWSUNFX0NSVDFfU1VQUE9SVCwKIAkJCQkJICAgIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklJLCAmZGRjX2kyYywKLQkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfU0lOR0xFX0xJTktfRFZJX0kpOworCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9TSU5HTEVfTElOS19EVklfSSwKKwkJCQkJICAgICZocGQpOwogCQkvKiBUViAtIFRWIERBQyAqLworCQlkZGNfaTJjLnZhbGlkID0gZmFsc2U7CisJCWhwZC5ocGQgPSBSQURFT05fSFBEX05PTkU7CiAJCXJhZGVvbl9hZGRfbGVnYWN5X2VuY29kZXIoZGV2LAogCQkJCQkgIHJhZGVvbl9nZXRfZW5jb2Rlcl9pZChkZXYsCiAJCQkJCQkJCUFUT01fREVWSUNFX1RWMV9TVVBQT1JULApAQCAtMTM2OCwxMyArMTUyMSwxNSBAQAogCQlyYWRlb25fYWRkX2xlZ2FjeV9jb25uZWN0b3IoZGV2LCAyLCBBVE9NX0RFVklDRV9UVjFfU1VQUE9SVCwKIAkJCQkJICAgIERSTV9NT0RFX0NPTk5FQ1RPUl9TVklERU8sCiAJCQkJCSAgICAmZGRjX2kyYywKLQkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfU1ZJREVPKTsKKwkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfU1ZJREVPLAorCQkJCQkgICAgJmhwZCk7CiAJCWJyZWFrOwogCWNhc2UgQ1RfUE9XRVJCT09LX1ZHQToKIAkJRFJNX0lORk8oIkNvbm5lY3RvciBUYWJsZTogJWQgKHBvd2VyYm9vayB2Z2EpXG4iLAogCQkJIHJkZXYtPm1vZGVfaW5mby5jb25uZWN0b3JfdGFibGUpOwogCQkvKiBMVkRTICovCi0JCWRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMoUkFERU9OX0dQSU9fRFZJX0REQyk7CisJCWRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMocmRldiwgUkFERU9OX0dQSU9fRFZJX0REQyk7CisJCWhwZC5ocGQgPSBSQURFT05fSFBEX05PTkU7CiAJCXJhZGVvbl9hZGRfbGVnYWN5X2VuY29kZXIoZGV2LAogCQkJCQkgIHJhZGVvbl9nZXRfZW5jb2Rlcl9pZChkZXYsCiAJCQkJCQkJCUFUT01fREVWSUNFX0xDRDFfU1VQUE9SVCwKQEAgLTEzODIsOSArMTUzNywxMSBAQAogCQkJCQkgIEFUT01fREVWSUNFX0xDRDFfU1VQUE9SVCk7CiAJCXJhZGVvbl9hZGRfbGVnYWN5X2Nvbm5lY3RvcihkZXYsIDAsIEFUT01fREVWSUNFX0xDRDFfU1VQUE9SVCwKIAkJCQkJICAgIERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTLCAmZGRjX2kyYywKLQkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfTFZEUyk7CisJCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX0xWRFMsCisJCQkJCSAgICAmaHBkKTsKIAkJLyogVkdBIC0gcHJpbWFyeSBkYWMgKi8KLQkJZGRjX2kyYyA9IGNvbWJpb3Nfc2V0dXBfaTJjX2J1cyhSQURFT05fR1BJT19WR0FfRERDKTsKKwkJZGRjX2kyYyA9IGNvbWJpb3Nfc2V0dXBfaTJjX2J1cyhyZGV2LCBSQURFT05fR1BJT19WR0FfRERDKTsKKwkJaHBkLmhwZCA9IFJBREVPTl9IUERfTk9ORTsKIAkJcmFkZW9uX2FkZF9sZWdhY3lfZW5jb2RlcihkZXYsCiAJCQkJCSAgcmFkZW9uX2dldF9lbmNvZGVyX2lkKGRldiwKIAkJCQkJCQkJQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JULApAQCAtMTM5Miw4ICsxNTQ5LDExIEBACiAJCQkJCSAgQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JUKTsKIAkJcmFkZW9uX2FkZF9sZWdhY3lfY29ubmVjdG9yKGRldiwgMSwgQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JULAogCQkJCQkgICAgRFJNX01PREVfQ09OTkVDVE9SX1ZHQSwgJmRkY19pMmMsCi0JCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1ZHQSk7CisJCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1ZHQSwKKwkJCQkJICAgICZocGQpOwogCQkvKiBUViAtIFRWIERBQyAqLworCQlkZGNfaTJjLnZhbGlkID0gZmFsc2U7CisJCWhwZC5ocGQgPSBSQURFT05fSFBEX05PTkU7CiAJCXJhZGVvbl9hZGRfbGVnYWN5X2VuY29kZXIoZGV2LAogCQkJCQkgIHJhZGVvbl9nZXRfZW5jb2Rlcl9pZChkZXYsCiAJCQkJCQkJCUFUT01fREVWSUNFX1RWMV9TVVBQT1JULApAQCAtMTQwMiwxMyArMTU2MiwxNSBAQAogCQlyYWRlb25fYWRkX2xlZ2FjeV9jb25uZWN0b3IoZGV2LCAyLCBBVE9NX0RFVklDRV9UVjFfU1VQUE9SVCwKIAkJCQkJICAgIERSTV9NT0RFX0NPTk5FQ1RPUl9TVklERU8sCiAJCQkJCSAgICAmZGRjX2kyYywKLQkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfU1ZJREVPKTsKKwkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfU1ZJREVPLAorCQkJCQkgICAgJmhwZCk7CiAJCWJyZWFrOwogCWNhc2UgQ1RfTUlOSV9FWFRFUk5BTDoKIAkJRFJNX0lORk8oIkNvbm5lY3RvciBUYWJsZTogJWQgKG1pbmkgZXh0ZXJuYWwgdG1kcylcbiIsCiAJCQkgcmRldi0+bW9kZV9pbmZvLmNvbm5lY3Rvcl90YWJsZSk7CiAJCS8qIERWSS1JIC0gdHYgZGFjLCBleHQgdG1kcyAqLwotCQlkZGNfaTJjID0gY29tYmlvc19zZXR1cF9pMmNfYnVzKFJBREVPTl9HUElPX0NSVDJfRERDKTsKKwkJZGRjX2kyYyA9IGNvbWJpb3Nfc2V0dXBfaTJjX2J1cyhyZGV2LCBSQURFT05fR1BJT19DUlQyX0REQyk7CisJCWhwZC5ocGQgPSBSQURFT05fSFBEXzI7IC8qID8/PyAqLwogCQlyYWRlb25fYWRkX2xlZ2FjeV9lbmNvZGVyKGRldiwKIAkJCQkJICByYWRlb25fZ2V0X2VuY29kZXJfaWQoZGV2LAogCQkJCQkJCQlBVE9NX0RFVklDRV9ERlAyX1NVUFBPUlQsCkBAIC0xNDI0LDggKzE1ODYsMTEgQEAKIAkJCQkJICAgIEFUT01fREVWSUNFX0RGUDJfU1VQUE9SVCB8CiAJCQkJCSAgICBBVE9NX0RFVklDRV9DUlQyX1NVUFBPUlQsCiAJCQkJCSAgICBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSSwgJmRkY19pMmMsCi0JCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1NJTkdMRV9MSU5LX0RWSV9JKTsKKwkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfU0lOR0xFX0xJTktfRFZJX0ksCisJCQkJCSAgICAmaHBkKTsKIAkJLyogVFYgLSBUViBEQUMgKi8KKwkJZGRjX2kyYy52YWxpZCA9IGZhbHNlOworCQlocGQuaHBkID0gUkFERU9OX0hQRF9OT05FOwogCQlyYWRlb25fYWRkX2xlZ2FjeV9lbmNvZGVyKGRldiwKIAkJCQkJICByYWRlb25fZ2V0X2VuY29kZXJfaWQoZGV2LAogCQkJCQkJCQlBVE9NX0RFVklDRV9UVjFfU1VQUE9SVCwKQEAgLTE0MzQsMTMgKzE1OTksMTUgQEAKIAkJcmFkZW9uX2FkZF9sZWdhY3lfY29ubmVjdG9yKGRldiwgMSwgQVRPTV9ERVZJQ0VfVFYxX1NVUFBPUlQsCiAJCQkJCSAgICBEUk1fTU9ERV9DT05ORUNUT1JfU1ZJREVPLAogCQkJCQkgICAgJmRkY19pMmMsCi0JCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1NWSURFTyk7CisJCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1NWSURFTywKKwkJCQkJICAgICZocGQpOwogCQlicmVhazsKIAljYXNlIENUX01JTklfSU5URVJOQUw6CiAJCURSTV9JTkZPKCJDb25uZWN0b3IgVGFibGU6ICVkIChtaW5pIGludGVybmFsIHRtZHMpXG4iLAogCQkJIHJkZXYtPm1vZGVfaW5mby5jb25uZWN0b3JfdGFibGUpOwogCQkvKiBEVkktSSAtIHR2IGRhYywgaW50IHRtZHMgKi8KLQkJZGRjX2kyYyA9IGNvbWJpb3Nfc2V0dXBfaTJjX2J1cyhSQURFT05fR1BJT19DUlQyX0REQyk7CisJCWRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMocmRldiwgUkFERU9OX0dQSU9fQ1JUMl9EREMpOworCQlocGQuaHBkID0gUkFERU9OX0hQRF8xOyAvKiA/Pz8gKi8KIAkJcmFkZW9uX2FkZF9sZWdhY3lfZW5jb2RlcihkZXYsCiAJCQkJCSAgcmFkZW9uX2dldF9lbmNvZGVyX2lkKGRldiwKIAkJCQkJCQkJQVRPTV9ERVZJQ0VfREZQMV9TVVBQT1JULApAQCAtMTQ1NSw4ICsxNjIyLDExIEBACiAJCQkJCSAgICBBVE9NX0RFVklDRV9ERlAxX1NVUFBPUlQgfAogCQkJCQkgICAgQVRPTV9ERVZJQ0VfQ1JUMl9TVVBQT1JULAogCQkJCQkgICAgRFJNX01PREVfQ09OTkVDVE9SX0RWSUksICZkZGNfaTJjLAotCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9TSU5HTEVfTElOS19EVklfSSk7CisJCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1NJTkdMRV9MSU5LX0RWSV9JLAorCQkJCQkgICAgJmhwZCk7CiAJCS8qIFRWIC0gVFYgREFDICovCisJCWRkY19pMmMudmFsaWQgPSBmYWxzZTsKKwkJaHBkLmhwZCA9IFJBREVPTl9IUERfTk9ORTsKIAkJcmFkZW9uX2FkZF9sZWdhY3lfZW5jb2RlcihkZXYsCiAJCQkJCSAgcmFkZW9uX2dldF9lbmNvZGVyX2lkKGRldiwKIAkJCQkJCQkJQVRPTV9ERVZJQ0VfVFYxX1NVUFBPUlQsCkBAIC0xNDY1LDEzICsxNjM1LDE1IEBACiAJCXJhZGVvbl9hZGRfbGVnYWN5X2Nvbm5lY3RvcihkZXYsIDEsIEFUT01fREVWSUNFX1RWMV9TVVBQT1JULAogCQkJCQkgICAgRFJNX01PREVfQ09OTkVDVE9SX1NWSURFTywKIAkJCQkJICAgICZkZGNfaTJjLAotCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9TVklERU8pOworCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9TVklERU8sCisJCQkJCSAgICAmaHBkKTsKIAkJYnJlYWs7CiAJY2FzZSBDVF9JTUFDX0c1X0lTSUdIVDoKIAkJRFJNX0lORk8oIkNvbm5lY3RvciBUYWJsZTogJWQgKGltYWMgZzUgaXNpZ2h0KVxuIiwKIAkJCSByZGV2LT5tb2RlX2luZm8uY29ubmVjdG9yX3RhYmxlKTsKIAkJLyogRFZJLUQgLSBpbnQgdG1kcyAqLwotCQlkZGNfaTJjID0gY29tYmlvc19zZXR1cF9pMmNfYnVzKFJBREVPTl9HUElPX01PTklEKTsKKwkJZGRjX2kyYyA9IGNvbWJpb3Nfc2V0dXBfaTJjX2J1cyhyZGV2LCBSQURFT05fR1BJT19NT05JRCk7CisJCWhwZC5ocGQgPSBSQURFT05fSFBEXzE7IC8qID8/PyAqLwogCQlyYWRlb25fYWRkX2xlZ2FjeV9lbmNvZGVyKGRldiwKIAkJCQkJICByYWRlb25fZ2V0X2VuY29kZXJfaWQoZGV2LAogCQkJCQkJCQlBVE9NX0RFVklDRV9ERlAxX1NVUFBPUlQsCkBAIC0xNDc5LDkgKzE2NTEsMTEgQEAKIAkJCQkJICBBVE9NX0RFVklDRV9ERlAxX1NVUFBPUlQpOwogCQlyYWRlb25fYWRkX2xlZ2FjeV9jb25uZWN0b3IoZGV2LCAwLCBBVE9NX0RFVklDRV9ERlAxX1NVUFBPUlQsCiAJCQkJCSAgICBEUk1fTU9ERV9DT05ORUNUT1JfRFZJRCwgJmRkY19pMmMsCi0JCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1NJTkdMRV9MSU5LX0RWSV9EKTsKKwkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfU0lOR0xFX0xJTktfRFZJX0QsCisJCQkJCSAgICAmaHBkKTsKIAkJLyogVkdBIC0gdHYgZGFjICovCi0JCWRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMoUkFERU9OX0dQSU9fRFZJX0REQyk7CisJCWRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMocmRldiwgUkFERU9OX0dQSU9fRFZJX0REQyk7CisJCWhwZC5ocGQgPSBSQURFT05fSFBEX05PTkU7CiAJCXJhZGVvbl9hZGRfbGVnYWN5X2VuY29kZXIoZGV2LAogCQkJCQkgIHJhZGVvbl9nZXRfZW5jb2Rlcl9pZChkZXYsCiAJCQkJCQkJCUFUT01fREVWSUNFX0NSVDJfU1VQUE9SVCwKQEAgLTE0ODksOCArMTY2MywxMSBAQAogCQkJCQkgIEFUT01fREVWSUNFX0NSVDJfU1VQUE9SVCk7CiAJCXJhZGVvbl9hZGRfbGVnYWN5X2Nvbm5lY3RvcihkZXYsIDEsIEFUT01fREVWSUNFX0NSVDJfU1VQUE9SVCwKIAkJCQkJICAgIERSTV9NT0RFX0NPTk5FQ1RPUl9WR0EsICZkZGNfaTJjLAotCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9WR0EpOworCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9WR0EsCisJCQkJCSAgICAmaHBkKTsKIAkJLyogVFYgLSBUViBEQUMgKi8KKwkJZGRjX2kyYy52YWxpZCA9IGZhbHNlOworCQlocGQuaHBkID0gUkFERU9OX0hQRF9OT05FOwogCQlyYWRlb25fYWRkX2xlZ2FjeV9lbmNvZGVyKGRldiwKIAkJCQkJICByYWRlb25fZ2V0X2VuY29kZXJfaWQoZGV2LAogCQkJCQkJCQlBVE9NX0RFVklDRV9UVjFfU1VQUE9SVCwKQEAgLTE0OTksMTMgKzE2NzYsMTUgQEAKIAkJcmFkZW9uX2FkZF9sZWdhY3lfY29ubmVjdG9yKGRldiwgMiwgQVRPTV9ERVZJQ0VfVFYxX1NVUFBPUlQsCiAJCQkJCSAgICBEUk1fTU9ERV9DT05ORUNUT1JfU1ZJREVPLAogCQkJCQkgICAgJmRkY19pMmMsCi0JCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1NWSURFTyk7CisJCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1NWSURFTywKKwkJCQkJICAgICZocGQpOwogCQlicmVhazsKIAljYXNlIENUX0VNQUM6CiAJCURSTV9JTkZPKCJDb25uZWN0b3IgVGFibGU6ICVkIChlbWFjKVxuIiwKIAkJCSByZGV2LT5tb2RlX2luZm8uY29ubmVjdG9yX3RhYmxlKTsKIAkJLyogVkdBIC0gcHJpbWFyeSBkYWMgKi8KLQkJZGRjX2kyYyA9IGNvbWJpb3Nfc2V0dXBfaTJjX2J1cyhSQURFT05fR1BJT19WR0FfRERDKTsKKwkJZGRjX2kyYyA9IGNvbWJpb3Nfc2V0dXBfaTJjX2J1cyhyZGV2LCBSQURFT05fR1BJT19WR0FfRERDKTsKKwkJaHBkLmhwZCA9IFJBREVPTl9IUERfTk9ORTsKIAkJcmFkZW9uX2FkZF9sZWdhY3lfZW5jb2RlcihkZXYsCiAJCQkJCSAgcmFkZW9uX2dldF9lbmNvZGVyX2lkKGRldiwKIAkJCQkJCQkJQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JULApAQCAtMTUxMyw5ICsxNjkyLDExIEBACiAJCQkJCSAgQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JUKTsKIAkJcmFkZW9uX2FkZF9sZWdhY3lfY29ubmVjdG9yKGRldiwgMCwgQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JULAogCQkJCQkgICAgRFJNX01PREVfQ09OTkVDVE9SX1ZHQSwgJmRkY19pMmMsCi0JCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1ZHQSk7CisJCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1ZHQSwKKwkJCQkJICAgICZocGQpOwogCQkvKiBWR0EgLSB0diBkYWMgKi8KLQkJZGRjX2kyYyA9IGNvbWJpb3Nfc2V0dXBfaTJjX2J1cyhSQURFT05fR1BJT19DUlQyX0REQyk7CisJCWRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMocmRldiwgUkFERU9OX0dQSU9fQ1JUMl9EREMpOworCQlocGQuaHBkID0gUkFERU9OX0hQRF9OT05FOwogCQlyYWRlb25fYWRkX2xlZ2FjeV9lbmNvZGVyKGRldiwKIAkJCQkJICByYWRlb25fZ2V0X2VuY29kZXJfaWQoZGV2LAogCQkJCQkJCQlBVE9NX0RFVklDRV9DUlQyX1NVUFBPUlQsCkBAIC0xNTIzLDggKzE3MDQsMTEgQEAKIAkJCQkJICBBVE9NX0RFVklDRV9DUlQyX1NVUFBPUlQpOwogCQlyYWRlb25fYWRkX2xlZ2FjeV9jb25uZWN0b3IoZGV2LCAxLCBBVE9NX0RFVklDRV9DUlQyX1NVUFBPUlQsCiAJCQkJCSAgICBEUk1fTU9ERV9DT05ORUNUT1JfVkdBLCAmZGRjX2kyYywKLQkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfVkdBKTsKKwkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfVkdBLAorCQkJCQkgICAgJmhwZCk7CiAJCS8qIFRWIC0gVFYgREFDICovCisJCWRkY19pMmMudmFsaWQgPSBmYWxzZTsKKwkJaHBkLmhwZCA9IFJBREVPTl9IUERfTk9ORTsKIAkJcmFkZW9uX2FkZF9sZWdhY3lfZW5jb2RlcihkZXYsCiAJCQkJCSAgcmFkZW9uX2dldF9lbmNvZGVyX2lkKGRldiwKIAkJCQkJCQkJQVRPTV9ERVZJQ0VfVFYxX1NVUFBPUlQsCkBAIC0xNTMzLDcgKzE3MTcsOCBAQAogCQlyYWRlb25fYWRkX2xlZ2FjeV9jb25uZWN0b3IoZGV2LCAyLCBBVE9NX0RFVklDRV9UVjFfU1VQUE9SVCwKIAkJCQkJICAgIERSTV9NT0RFX0NPTk5FQ1RPUl9TVklERU8sCiAJCQkJCSAgICAmZGRjX2kyYywKLQkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfU1ZJREVPKTsKKwkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfU1ZJREVPLAorCQkJCQkgICAgJmhwZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCURSTV9JTkZPKCJDb25uZWN0b3IgdGFibGU6ICVkIChpbnZhbGlkKVxuIiwKQEAgLTE1NTAsNyArMTczNSw4IEBACiAJCQkJICAgICAgIGludCBiaW9zX2luZGV4LAogCQkJCSAgICAgICBlbnVtIHJhZGVvbl9jb21iaW9zX2Nvbm5lY3RvcgogCQkJCSAgICAgICAqbGVnYWN5X2Nvbm5lY3RvciwKLQkJCQkgICAgICAgc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyAqZGRjX2kyYykKKwkJCQkgICAgICAgc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyAqZGRjX2kyYywKKwkJCQkgICAgICAgc3RydWN0IHJhZGVvbl9ocGQgKmhwZCkKIHsKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTE1NTgsMjkgKzE3NDQsMjYgQEAKIAlpZiAoKHJkZXYtPmZhbWlseSA9PSBDSElQX1JTNDAwIHx8CiAJICAgICByZGV2LT5mYW1pbHkgPT0gQ0hJUF9SUzQ4MCkgJiYKIAkgICAgZGRjX2kyYy0+bWFza19jbGtfcmVnID09IFJBREVPTl9HUElPX0NSVDJfRERDKQotCQkqZGRjX2kyYyA9IGNvbWJpb3Nfc2V0dXBfaTJjX2J1cyhSQURFT05fR1BJT19NT05JRCk7CisJCSpkZGNfaTJjID0gY29tYmlvc19zZXR1cF9pMmNfYnVzKHJkZXYsIFJBREVPTl9HUElPX01PTklEKTsKIAllbHNlIGlmICgocmRldi0+ZmFtaWx5ID09IENISVBfUlM0MDAgfHwKIAkJICByZGV2LT5mYW1pbHkgPT0gQ0hJUF9SUzQ4MCkgJiYKIAkJIGRkY19pMmMtPm1hc2tfY2xrX3JlZyA9PSBSQURFT05fR1BJT19NT05JRCkgewotCQlkZGNfaTJjLT52YWxpZCA9IHRydWU7CisJCSpkZGNfaTJjID0gY29tYmlvc19zZXR1cF9pMmNfYnVzKHJkZXYsIFJBREVPTl9HUElPUEFEX01BU0spOwogCQlkZGNfaTJjLT5tYXNrX2Nsa19tYXNrID0gKDB4MjAgPDwgOCk7CiAJCWRkY19pMmMtPm1hc2tfZGF0YV9tYXNrID0gMHg4MDsKIAkJZGRjX2kyYy0+YV9jbGtfbWFzayA9ICgweDIwIDw8IDgpOwogCQlkZGNfaTJjLT5hX2RhdGFfbWFzayA9IDB4ODA7Ci0JCWRkY19pMmMtPnB1dF9jbGtfbWFzayA9ICgweDIwIDw8IDgpOwotCQlkZGNfaTJjLT5wdXRfZGF0YV9tYXNrID0gMHg4MDsKLQkJZGRjX2kyYy0+Z2V0X2Nsa19tYXNrID0gKDB4MjAgPDwgOCk7Ci0JCWRkY19pMmMtPmdldF9kYXRhX21hc2sgPSAweDgwOwotCQlkZGNfaTJjLT5tYXNrX2Nsa19yZWcgPSBSQURFT05fR1BJT1BBRF9NQVNLOwotCQlkZGNfaTJjLT5tYXNrX2RhdGFfcmVnID0gUkFERU9OX0dQSU9QQURfTUFTSzsKLQkJZGRjX2kyYy0+YV9jbGtfcmVnID0gUkFERU9OX0dQSU9QQURfQTsKLQkJZGRjX2kyYy0+YV9kYXRhX3JlZyA9IFJBREVPTl9HUElPUEFEX0E7Ci0JCWRkY19pMmMtPnB1dF9jbGtfcmVnID0gUkFERU9OX0dQSU9QQURfRU47Ci0JCWRkY19pMmMtPnB1dF9kYXRhX3JlZyA9IFJBREVPTl9HUElPUEFEX0VOOwotCQlkZGNfaTJjLT5nZXRfY2xrX3JlZyA9IFJBREVPTl9MQ0RfR1BJT19ZX1JFRzsKLQkJZGRjX2kyYy0+Z2V0X2RhdGFfcmVnID0gUkFERU9OX0xDRF9HUElPX1lfUkVHOworCQlkZGNfaTJjLT5lbl9jbGtfbWFzayA9ICgweDIwIDw8IDgpOworCQlkZGNfaTJjLT5lbl9kYXRhX21hc2sgPSAweDgwOworCQlkZGNfaTJjLT55X2Nsa19tYXNrID0gKDB4MjAgPDwgOCk7CisJCWRkY19pMmMtPnlfZGF0YV9tYXNrID0gMHg4MDsKIAl9CiAKKwkvKiBSM3h4KyBjaGlwcyBkb24ndCBoYXZlIEdQSU9fQ1JUMl9EREMgZ3BpbyBwYWQgKi8KKwlpZiAoKHJkZXYtPmZhbWlseSA+PSBDSElQX1IzMDApICYmCisJICAgIGRkY19pMmMtPm1hc2tfY2xrX3JlZyA9PSBSQURFT05fR1BJT19DUlQyX0REQykKKwkJKmRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMocmRldiwgUkFERU9OX0dQSU9fRFZJX0REQyk7CisKIAkvKiBDZXJ0YWluIElCTSBjaGlwc2V0IFJONTBzIGhhdmUgYSBCSU9TIHJlcG9ydGluZyB0d28gVkdBcywKIAkgICBvbmUgd2l0aCBWR0EgRERDIGFuZCBvbmUgd2l0aCBDUlQyIEREQy4gLSBraWxsIHRoZSBDUlQyIEREQyBvbmUgKi8KIAlpZiAoZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg1MTVlICYmCkBAIC0xNjI0LDYgKzE4MDcsMTIgQEAKIAkgICAgZGV2LT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MjgwYSkKIAkJcmV0dXJuIGZhbHNlOwogCisJLyogTVNJIFMyNzAgaGFzIG5vbi1leGlzdGVudCBUViBwb3J0ICovCisJaWYgKGRldi0+cGRldi0+ZGV2aWNlID09IDB4NTk1NSAmJgorCSAgICBkZXYtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxNDYyICYmCisJICAgIGRldi0+cGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweDAxMzEpCisJCXJldHVybiBmYWxzZTsKKwogCXJldHVybiB0cnVlOwogfQogCkBAIC0xNjcxLDYgKzE4NjAsNyBAQAogCWVudW0gcmFkZW9uX2NvbWJpb3NfY29ubmVjdG9yIGNvbm5lY3RvcjsKIAlpbnQgaSA9IDA7CiAJc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyBkZGNfaTJjOworCXN0cnVjdCByYWRlb25faHBkIGhwZDsKIAogCWlmIChyZGV2LT5iaW9zID09IE5VTEwpCiAJCXJldHVybiBmYWxzZTsKQEAgLTE2OTEsMjYgKzE4ODEsNDAgQEAKIAkJCXN3aXRjaCAoZGRjX3R5cGUpIHsKIAkJCWNhc2UgRERDX01PTklEOgogCQkJCWRkY19pMmMgPQotCQkJCSAgICBjb21iaW9zX3NldHVwX2kyY19idXMoUkFERU9OX0dQSU9fTU9OSUQpOworCQkJCQljb21iaW9zX3NldHVwX2kyY19idXMocmRldiwgUkFERU9OX0dQSU9fTU9OSUQpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBERENfRFZJOgogCQkJCWRkY19pMmMgPQotCQkJCSAgICBjb21iaW9zX3NldHVwX2kyY19idXMoUkFERU9OX0dQSU9fRFZJX0REQyk7CisJCQkJCWNvbWJpb3Nfc2V0dXBfaTJjX2J1cyhyZGV2LCBSQURFT05fR1BJT19EVklfRERDKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgRERDX1ZHQToKIAkJCQlkZGNfaTJjID0KLQkJCQkgICAgY29tYmlvc19zZXR1cF9pMmNfYnVzKFJBREVPTl9HUElPX1ZHQV9EREMpOworCQkJCQljb21iaW9zX3NldHVwX2kyY19idXMocmRldiwgUkFERU9OX0dQSU9fVkdBX0REQyk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIEREQ19DUlQyOgogCQkJCWRkY19pMmMgPQotCQkJCSAgICBjb21iaW9zX3NldHVwX2kyY19idXMoUkFERU9OX0dQSU9fQ1JUMl9EREMpOworCQkJCQljb21iaW9zX3NldHVwX2kyY19idXMocmRldiwgUkFERU9OX0dQSU9fQ1JUMl9EREMpOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlicmVhazsKIAkJCX0KIAorCQkJc3dpdGNoIChjb25uZWN0b3IpIHsKKwkJCWNhc2UgQ09OTkVDVE9SX1BST1BSSUVUQVJZX0xFR0FDWToKKwkJCWNhc2UgQ09OTkVDVE9SX0RWSV9JX0xFR0FDWToKKwkJCWNhc2UgQ09OTkVDVE9SX0RWSV9EX0xFR0FDWToKKwkJCQlpZiAoKHRtcCA+PiA0KSAmIDB4MSkKKwkJCQkJaHBkLmhwZCA9IFJBREVPTl9IUERfMjsKKwkJCQllbHNlCisJCQkJCWhwZC5ocGQgPSBSQURFT05fSFBEXzE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWhwZC5ocGQgPSBSQURFT05fSFBEX05PTkU7CisJCQkJYnJlYWs7CisJCQl9CisKIAkJCWlmICghcmFkZW9uX2FwcGx5X2xlZ2FjeV9xdWlya3MoZGV2LCBpLCAmY29ubmVjdG9yLAotCQkJCQkJICAgICAgICZkZGNfaTJjKSkKKwkJCQkJCQkmZGRjX2kyYywgJmhwZCkpCiAJCQkJY29udGludWU7CiAKIAkJCXN3aXRjaCAoY29ubmVjdG9yKSB7CkBAIC0xNzI3LDcgKzE5MzEsOCBAQAogCQkJCQkJCSAgICBsZWdhY3lfY29ubmVjdG9yX2NvbnZlcnQKIAkJCQkJCQkgICAgW2Nvbm5lY3Rvcl0sCiAJCQkJCQkJICAgICZkZGNfaTJjLAotCQkJCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1NJTkdMRV9MSU5LX0RWSV9EKTsKKwkJCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9TSU5HTEVfTElOS19EVklfRCwKKwkJCQkJCQkgICAgJmhwZCk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIENPTk5FQ1RPUl9DUlRfTEVHQUNZOgogCQkJCWlmICh0bXAgJiAweDEpIHsKQEAgLTE3NTMsNyArMTk1OCw4IEBACiAJCQkJCQkJICAgIGxlZ2FjeV9jb25uZWN0b3JfY29udmVydAogCQkJCQkJCSAgICBbY29ubmVjdG9yXSwKIAkJCQkJCQkgICAgJmRkY19pMmMsCi0JCQkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfVkdBKTsKKwkJCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9WR0EsCisJCQkJCQkJICAgICZocGQpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBDT05ORUNUT1JfRFZJX0lfTEVHQUNZOgogCQkJCWRldmljZXMgPSAwOwpAQCAtMTc5OSw3ICsyMDA1LDggQEAKIAkJCQkJCQkgICAgbGVnYWN5X2Nvbm5lY3Rvcl9jb252ZXJ0CiAJCQkJCQkJICAgIFtjb25uZWN0b3JdLAogCQkJCQkJCSAgICAmZGRjX2kyYywKLQkJCQkJCQkgICAgY29ubmVjdG9yX29iamVjdF9pZCk7CisJCQkJCQkJICAgIGNvbm5lY3Rvcl9vYmplY3RfaWQsCisJCQkJCQkJICAgICZocGQpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBDT05ORUNUT1JfRFZJX0RfTEVHQUNZOgogCQkJCWlmICgodG1wID4+IDQpICYgMHgxKSB7CkBAIC0xODE3LDcgKzIwMjQsOCBAQAogCQkJCQkJCSAgICBsZWdhY3lfY29ubmVjdG9yX2NvbnZlcnQKIAkJCQkJCQkgICAgW2Nvbm5lY3Rvcl0sCiAJCQkJCQkJICAgICZkZGNfaTJjLAotCQkJCQkJCSAgICBjb25uZWN0b3Jfb2JqZWN0X2lkKTsKKwkJCQkJCQkgICAgY29ubmVjdG9yX29iamVjdF9pZCwKKwkJCQkJCQkgICAgJmhwZCk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIENPTk5FQ1RPUl9DVFZfTEVHQUNZOgogCQkJY2FzZSBDT05ORUNUT1JfU1RWX0xFR0FDWToKQEAgLTE4MzIsNyArMjA0MCw4IEBACiAJCQkJCQkJICAgIGxlZ2FjeV9jb25uZWN0b3JfY29udmVydAogCQkJCQkJCSAgICBbY29ubmVjdG9yXSwKIAkJCQkJCQkgICAgJmRkY19pMmMsCi0JCQkJCQkJICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfU1ZJREVPKTsKKwkJCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9TVklERU8sCisJCQkJCQkJICAgICZocGQpOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlEUk1fRVJST1IoIlVua25vd24gY29ubmVjdG9yIHR5cGU6ICVkXG4iLApAQCAtMTg1OCwxNCArMjA2NywxNiBAQAogCQkJCQkJCQkJMCksCiAJCQkJCQkgIEFUT01fREVWSUNFX0RGUDFfU1VQUE9SVCk7CiAKLQkJCWRkY19pMmMgPSBjb21iaW9zX3NldHVwX2kyY19idXMoUkFERU9OX0dQSU9fRFZJX0REQyk7CisJCQlkZGNfaTJjID0gY29tYmlvc19zZXR1cF9pMmNfYnVzKHJkZXYsIFJBREVPTl9HUElPX0RWSV9EREMpOworCQkJaHBkLmhwZCA9IFJBREVPTl9IUERfTk9ORTsKIAkJCXJhZGVvbl9hZGRfbGVnYWN5X2Nvbm5lY3RvcihkZXYsCiAJCQkJCQkgICAgMCwKIAkJCQkJCSAgICBBVE9NX0RFVklDRV9DUlQxX1NVUFBPUlQgfAogCQkJCQkJICAgIEFUT01fREVWSUNFX0RGUDFfU1VQUE9SVCwKIAkJCQkJCSAgICBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSSwKIAkJCQkJCSAgICAmZGRjX2kyYywKLQkJCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1NJTkdMRV9MSU5LX0RWSV9JKTsKKwkJCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1NJTkdMRV9MSU5LX0RWSV9JLAorCQkJCQkJICAgICZocGQpOwogCQl9IGVsc2UgewogCQkJdWludDE2X3QgY3J0X2luZm8gPQogCQkJCWNvbWJpb3NfZ2V0X3RhYmxlX29mZnNldChkZXYsIENPTUJJT1NfQ1JUX0lORk9fVEFCTEUpOwpAQCAtMTg3NiwxMyArMjA4NywxNSBAQAogCQkJCQkJCQkJCUFUT01fREVWSUNFX0NSVDFfU1VQUE9SVCwKIAkJCQkJCQkJCQkxKSwKIAkJCQkJCQkgIEFUT01fREVWSUNFX0NSVDFfU1VQUE9SVCk7Ci0JCQkJZGRjX2kyYyA9IGNvbWJpb3Nfc2V0dXBfaTJjX2J1cyhSQURFT05fR1BJT19WR0FfRERDKTsKKwkJCQlkZGNfaTJjID0gY29tYmlvc19zZXR1cF9pMmNfYnVzKHJkZXYsIFJBREVPTl9HUElPX1ZHQV9EREMpOworCQkJCWhwZC5ocGQgPSBSQURFT05fSFBEX05PTkU7CiAJCQkJcmFkZW9uX2FkZF9sZWdhY3lfY29ubmVjdG9yKGRldiwKIAkJCQkJCQkgICAgMCwKIAkJCQkJCQkgICAgQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JULAogCQkJCQkJCSAgICBEUk1fTU9ERV9DT05ORUNUT1JfVkdBLAogCQkJCQkJCSAgICAmZGRjX2kyYywKLQkJCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9WR0EpOworCQkJCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1ZHQSwKKwkJCQkJCQkgICAgJmhwZCk7CiAJCQl9IGVsc2UgewogCQkJCURSTV9ERUJVRygiTm8gY29ubmVjdG9yIGluZm8gZm91bmRcbiIpOwogCQkJCXJldHVybiBmYWxzZTsKQEAgLTE5MTAsMjcgKzIxMjMsMjcgQEAKIAkJCQljYXNlIEREQ19NT05JRDoKIAkJCQkJZGRjX2kyYyA9CiAJCQkJCSAgICBjb21iaW9zX3NldHVwX2kyY19idXMKLQkJCQkJICAgIChSQURFT05fR1BJT19NT05JRCk7CisJCQkJCQkocmRldiwgUkFERU9OX0dQSU9fTU9OSUQpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIEREQ19EVkk6CiAJCQkJCWRkY19pMmMgPQogCQkJCQkgICAgY29tYmlvc19zZXR1cF9pMmNfYnVzCi0JCQkJCSAgICAoUkFERU9OX0dQSU9fRFZJX0REQyk7CisJCQkJCQkocmRldiwgUkFERU9OX0dQSU9fRFZJX0REQyk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgRERDX1ZHQToKIAkJCQkJZGRjX2kyYyA9CiAJCQkJCSAgICBjb21iaW9zX3NldHVwX2kyY19idXMKLQkJCQkJICAgIChSQURFT05fR1BJT19WR0FfRERDKTsKKwkJCQkJCShyZGV2LCBSQURFT05fR1BJT19WR0FfRERDKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBERENfQ1JUMjoKIAkJCQkJZGRjX2kyYyA9CiAJCQkJCSAgICBjb21iaW9zX3NldHVwX2kyY19idXMKLQkJCQkJICAgIChSQURFT05fR1BJT19DUlQyX0REQyk7CisJCQkJCQkocmRldiwgUkFERU9OX0dQSU9fQ1JUMl9EREMpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIEREQ19MQ0Q6CiAJCQkJCWRkY19pMmMgPQogCQkJCQkgICAgY29tYmlvc19zZXR1cF9pMmNfYnVzCi0JCQkJCSAgICAoUkFERU9OX0xDRF9HUElPX01BU0spOworCQkJCQkJKHJkZXYsIFJBREVPTl9HUElPUEFEX01BU0spOwogCQkJCQlkZGNfaTJjLm1hc2tfY2xrX21hc2sgPQogCQkJCQkgICAgUkJJT1MzMihsY2RfZGRjX2luZm8gKyAzKTsKIAkJCQkJZGRjX2kyYy5tYXNrX2RhdGFfbWFzayA9CkBAIC0xOTM5LDE5ICsyMTUyLDE5IEBACiAJCQkJCSAgICBSQklPUzMyKGxjZF9kZGNfaW5mbyArIDMpOwogCQkJCQlkZGNfaTJjLmFfZGF0YV9tYXNrID0KIAkJCQkJICAgIFJCSU9TMzIobGNkX2RkY19pbmZvICsgNyk7Ci0JCQkJCWRkY19pMmMucHV0X2Nsa19tYXNrID0KKwkJCQkJZGRjX2kyYy5lbl9jbGtfbWFzayA9CiAJCQkJCSAgICBSQklPUzMyKGxjZF9kZGNfaW5mbyArIDMpOwotCQkJCQlkZGNfaTJjLnB1dF9kYXRhX21hc2sgPQorCQkJCQlkZGNfaTJjLmVuX2RhdGFfbWFzayA9CiAJCQkJCSAgICBSQklPUzMyKGxjZF9kZGNfaW5mbyArIDcpOwotCQkJCQlkZGNfaTJjLmdldF9jbGtfbWFzayA9CisJCQkJCWRkY19pMmMueV9jbGtfbWFzayA9CiAJCQkJCSAgICBSQklPUzMyKGxjZF9kZGNfaW5mbyArIDMpOwotCQkJCQlkZGNfaTJjLmdldF9kYXRhX21hc2sgPQorCQkJCQlkZGNfaTJjLnlfZGF0YV9tYXNrID0KIAkJCQkJICAgIFJCSU9TMzIobGNkX2RkY19pbmZvICsgNyk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgRERDX0dQSU86CiAJCQkJCWRkY19pMmMgPQogCQkJCQkgICAgY29tYmlvc19zZXR1cF9pMmNfYnVzCi0JCQkJCSAgICAoUkFERU9OX01ER1BJT19FTl9SRUcpOworCQkJCQkJKHJkZXYsIFJBREVPTl9NREdQSU9fTUFTSyk7CiAJCQkJCWRkY19pMmMubWFza19jbGtfbWFzayA9CiAJCQkJCSAgICBSQklPUzMyKGxjZF9kZGNfaW5mbyArIDMpOwogCQkJCQlkZGNfaTJjLm1hc2tfZGF0YV9tYXNrID0KQEAgLTE5NjAsMTMgKzIxNzMsMTMgQEAKIAkJCQkJICAgIFJCSU9TMzIobGNkX2RkY19pbmZvICsgMyk7CiAJCQkJCWRkY19pMmMuYV9kYXRhX21hc2sgPQogCQkJCQkgICAgUkJJT1MzMihsY2RfZGRjX2luZm8gKyA3KTsKLQkJCQkJZGRjX2kyYy5wdXRfY2xrX21hc2sgPQorCQkJCQlkZGNfaTJjLmVuX2Nsa19tYXNrID0KIAkJCQkJICAgIFJCSU9TMzIobGNkX2RkY19pbmZvICsgMyk7Ci0JCQkJCWRkY19pMmMucHV0X2RhdGFfbWFzayA9CisJCQkJCWRkY19pMmMuZW5fZGF0YV9tYXNrID0KIAkJCQkJICAgIFJCSU9TMzIobGNkX2RkY19pbmZvICsgNyk7Ci0JCQkJCWRkY19pMmMuZ2V0X2Nsa19tYXNrID0KKwkJCQkJZGRjX2kyYy55X2Nsa19tYXNrID0KIAkJCQkJICAgIFJCSU9TMzIobGNkX2RkY19pbmZvICsgMyk7Ci0JCQkJCWRkY19pMmMuZ2V0X2RhdGFfbWFzayA9CisJCQkJCWRkY19pMmMueV9kYXRhX21hc2sgPQogCQkJCQkgICAgUkJJT1MzMihsY2RfZGRjX2luZm8gKyA3KTsKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdDoKQEAgLTE5NzcsMTIgKzIxOTAsMTQgQEAKIAkJCX0gZWxzZQogCQkJCWRkY19pMmMudmFsaWQgPSBmYWxzZTsKIAorCQkJaHBkLmhwZCA9IFJBREVPTl9IUERfTk9ORTsKIAkJCXJhZGVvbl9hZGRfbGVnYWN5X2Nvbm5lY3RvcihkZXYsCiAJCQkJCQkgICAgNSwKIAkJCQkJCSAgICBBVE9NX0RFVklDRV9MQ0QxX1NVUFBPUlQsCiAJCQkJCQkgICAgRFJNX01PREVfQ09OTkVDVE9SX0xWRFMsCiAJCQkJCQkgICAgJmRkY19pMmMsCi0JCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9MVkRTKTsKKwkJCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX0xWRFMsCisJCQkJCQkgICAgJmhwZCk7CiAJCX0KIAl9CiAKQEAgLTE5OTMsNiArMjIwOCw3IEBACiAJCWlmICh0dl9pbmZvKSB7CiAJCQlpZiAoUkJJT1M4KHR2X2luZm8gKyA2KSA9PSAnVCcpIHsKIAkJCQlpZiAocmFkZW9uX2FwcGx5X2xlZ2FjeV90dl9xdWlya3MoZGV2KSkgeworCQkJCQlocGQuaHBkID0gUkFERU9OX0hQRF9OT05FOwogCQkJCQlyYWRlb25fYWRkX2xlZ2FjeV9lbmNvZGVyKGRldiwKIAkJCQkJCQkJICByYWRlb25fZ2V0X2VuY29kZXJfaWQKIAkJCQkJCQkJICAoZGV2LApAQCAtMjAwMyw3ICsyMjE5LDggQEAKIAkJCQkJCQkJICAgIEFUT01fREVWSUNFX1RWMV9TVVBQT1JULAogCQkJCQkJCQkgICAgRFJNX01PREVfQ09OTkVDVE9SX1NWSURFTywKIAkJCQkJCQkJICAgICZkZGNfaTJjLAotCQkJCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9TVklERU8pOworCQkJCQkJCQkgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9TVklERU8sCisJCQkJCQkJCSAgICAmaHBkKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTIwMTQsNiArMjIzMSwxOTMgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAordm9pZCByYWRlb25fZXh0ZXJuYWxfdG1kc19zZXR1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9leHRfdG1kcyAqdG1kcyA9IHJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdjsKKworCWlmICghdG1kcykKKwkJcmV0dXJuOworCisJc3dpdGNoICh0bWRzLT5kdm9fY2hpcCkgeworCWNhc2UgRFZPX1NJTDE2NDoKKwkJLyogc2lsIDE2NCAqLworCQlyYWRlb25faTJjX2RvX2xvY2sodG1kcy0+aTJjX2J1cywgMSk7CisJCXJhZGVvbl9pMmNfc3dfcHV0X2J5dGUodG1kcy0+aTJjX2J1cywKKwkJCQkgICAgICAgdG1kcy0+c2xhdmVfYWRkciwKKwkJCQkgICAgICAgMHgwOCwgMHgzMCk7CisJCXJhZGVvbl9pMmNfc3dfcHV0X2J5dGUodG1kcy0+aTJjX2J1cywKKwkJCQkgICAgICAgdG1kcy0+c2xhdmVfYWRkciwKKwkJCQkgICAgICAgMHgwOSwgMHgwMCk7CisJCXJhZGVvbl9pMmNfc3dfcHV0X2J5dGUodG1kcy0+aTJjX2J1cywKKwkJCQkgICAgICAgdG1kcy0+c2xhdmVfYWRkciwKKwkJCQkgICAgICAgMHgwYSwgMHg5MCk7CisJCXJhZGVvbl9pMmNfc3dfcHV0X2J5dGUodG1kcy0+aTJjX2J1cywKKwkJCQkgICAgICAgdG1kcy0+c2xhdmVfYWRkciwKKwkJCQkgICAgICAgMHgwYywgMHg4OSk7CisJCXJhZGVvbl9pMmNfc3dfcHV0X2J5dGUodG1kcy0+aTJjX2J1cywKKwkJCQkgICAgICAgdG1kcy0+c2xhdmVfYWRkciwKKwkJCQkgICAgICAgMHgwOCwgMHgzYik7CisJCXJhZGVvbl9pMmNfZG9fbG9jayh0bWRzLT5pMmNfYnVzLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBEVk9fU0lMMTE3ODoKKwkJLyogc2lsIDExNzggLSB1bnRlc3RlZCAqLworCQkvKgorCQkgKiAweDBmLCAweDQ0CisJCSAqIDB4MGYsIDB4NGMKKwkJICogMHgwZSwgMHgwMQorCQkgKiAweDBhLCAweDgwCisJCSAqIDB4MDksIDB4MzAKKwkJICogMHgwYywgMHhjOQorCQkgKiAweDBkLCAweDcwCisJCSAqIDB4MDgsIDB4MzIKKwkJICogMHgwOCwgMHgzMworCQkgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCit9CisKK2Jvb2wgcmFkZW9uX2NvbWJpb3NfZXh0ZXJuYWxfdG1kc19zZXR1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOworCXVpbnQxNl90IG9mZnNldDsKKwl1aW50OF90IGJsb2Nrcywgc2xhdmVfYWRkciwgcmV2OworCXVpbnQzMl90IGluZGV4LCBpZDsKKwl1aW50MzJfdCByZWcsIHZhbCwgYW5kX21hc2ssIG9yX21hc2s7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyX2V4dF90bWRzICp0bWRzID0gcmFkZW9uX2VuY29kZXItPmVuY19wcml2OworCisJaWYgKHJkZXYtPmJpb3MgPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKCF0bWRzKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSB7CisJCW9mZnNldCA9IGNvbWJpb3NfZ2V0X3RhYmxlX29mZnNldChkZXYsIENPTUJJT1NfVE1EU19QT1dFUl9PTl9UQUJMRSk7CisJCXJldiA9IFJCSU9TOChvZmZzZXQpOworCQlpZiAob2Zmc2V0KSB7CisJCQlyZXYgPSBSQklPUzgob2Zmc2V0KTsKKwkJCWlmIChyZXYgPiAxKSB7CisJCQkJYmxvY2tzID0gUkJJT1M4KG9mZnNldCArIDMpOworCQkJCWluZGV4ID0gb2Zmc2V0ICsgNDsKKwkJCQl3aGlsZSAoYmxvY2tzID4gMCkgeworCQkJCQlpZCA9IFJCSU9TMTYoaW5kZXgpOworCQkJCQlpbmRleCArPSAyOworCQkJCQlzd2l0Y2ggKGlkID4+IDEzKSB7CisJCQkJCWNhc2UgMDoKKwkJCQkJCXJlZyA9IChpZCAmIDB4MWZmZikgKiA0OworCQkJCQkJdmFsID0gUkJJT1MzMihpbmRleCk7CisJCQkJCQlpbmRleCArPSA0OworCQkJCQkJV1JFRzMyKHJlZywgdmFsKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDI6CisJCQkJCQlyZWcgPSAoaWQgJiAweDFmZmYpICogNDsKKwkJCQkJCWFuZF9tYXNrID0gUkJJT1MzMihpbmRleCk7CisJCQkJCQlpbmRleCArPSA0OworCQkJCQkJb3JfbWFzayA9IFJCSU9TMzIoaW5kZXgpOworCQkJCQkJaW5kZXggKz0gNDsKKwkJCQkJCXZhbCA9IFJSRUczMihyZWcpOworCQkJCQkJdmFsID0gKHZhbCAmIGFuZF9tYXNrKSB8IG9yX21hc2s7CisJCQkJCQlXUkVHMzIocmVnLCB2YWwpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMzoKKwkJCQkJCXZhbCA9IFJCSU9TMTYoaW5kZXgpOworCQkJCQkJaW5kZXggKz0gMjsKKwkJCQkJCXVkZWxheSh2YWwpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNDoKKwkJCQkJCXZhbCA9IFJCSU9TMTYoaW5kZXgpOworCQkJCQkJaW5kZXggKz0gMjsKKwkJCQkJCXVkZWxheSh2YWwgKiAxMDAwKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDY6CisJCQkJCQlzbGF2ZV9hZGRyID0gaWQgJiAweGZmOworCQkJCQkJc2xhdmVfYWRkciA+Pj0gMTsgLyogNyBiaXQgYWRkcmVzc2luZyAqLworCQkJCQkJaW5kZXgrKzsKKwkJCQkJCXJlZyA9IFJCSU9TOChpbmRleCk7CisJCQkJCQlpbmRleCsrOworCQkJCQkJdmFsID0gUkJJT1M4KGluZGV4KTsKKwkJCQkJCWluZGV4Kys7CisJCQkJCQlyYWRlb25faTJjX2RvX2xvY2sodG1kcy0+aTJjX2J1cywgMSk7CisJCQkJCQlyYWRlb25faTJjX3N3X3B1dF9ieXRlKHRtZHMtPmkyY19idXMsCisJCQkJCQkJCSAgICAgICBzbGF2ZV9hZGRyLAorCQkJCQkJCQkgICAgICAgcmVnLCB2YWwpOworCQkJCQkJcmFkZW9uX2kyY19kb19sb2NrKHRtZHMtPmkyY19idXMsIDApOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlEUk1fRVJST1IoIlVua25vd24gaWQgJWRcbiIsIGlkID4+IDEzKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWJsb2Nrcy0tOworCQkJCX0KKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCW9mZnNldCA9IGNvbWJpb3NfZ2V0X3RhYmxlX29mZnNldChkZXYsIENPTUJJT1NfRVhUX1RNRFNfSU5GT19UQUJMRSk7CisJCWlmIChvZmZzZXQpIHsKKwkJCWluZGV4ID0gb2Zmc2V0ICsgMTA7CisJCQlpZCA9IFJCSU9TMTYoaW5kZXgpOworCQkJd2hpbGUgKGlkICE9IDB4ZmZmZikgeworCQkJCWluZGV4ICs9IDI7CisJCQkJc3dpdGNoIChpZCA+PiAxMykgeworCQkJCWNhc2UgMDoKKwkJCQkJcmVnID0gKGlkICYgMHgxZmZmKSAqIDQ7CisJCQkJCXZhbCA9IFJCSU9TMzIoaW5kZXgpOworCQkJCQlXUkVHMzIocmVnLCB2YWwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI6CisJCQkJCXJlZyA9IChpZCAmIDB4MWZmZikgKiA0OworCQkJCQlhbmRfbWFzayA9IFJCSU9TMzIoaW5kZXgpOworCQkJCQlpbmRleCArPSA0OworCQkJCQlvcl9tYXNrID0gUkJJT1MzMihpbmRleCk7CisJCQkJCWluZGV4ICs9IDQ7CisJCQkJCXZhbCA9IFJSRUczMihyZWcpOworCQkJCQl2YWwgPSAodmFsICYgYW5kX21hc2spIHwgb3JfbWFzazsKKwkJCQkJV1JFRzMyKHJlZywgdmFsKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA0OgorCQkJCQl2YWwgPSBSQklPUzE2KGluZGV4KTsKKwkJCQkJaW5kZXggKz0gMjsKKwkJCQkJdWRlbGF5KHZhbCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNToKKwkJCQkJcmVnID0gaWQgJiAweDFmZmY7CisJCQkJCWFuZF9tYXNrID0gUkJJT1MzMihpbmRleCk7CisJCQkJCWluZGV4ICs9IDQ7CisJCQkJCW9yX21hc2sgPSBSQklPUzMyKGluZGV4KTsKKwkJCQkJaW5kZXggKz0gNDsKKwkJCQkJdmFsID0gUlJFRzMyX1BMTChyZWcpOworCQkJCQl2YWwgPSAodmFsICYgYW5kX21hc2spIHwgb3JfbWFzazsKKwkJCQkJV1JFRzMyX1BMTChyZWcsIHZhbCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNjoKKwkJCQkJcmVnID0gaWQgJiAweDFmZmY7CisJCQkJCXZhbCA9IFJCSU9TOChpbmRleCk7CisJCQkJCWluZGV4ICs9IDE7CisJCQkJCXJhZGVvbl9pMmNfZG9fbG9jayh0bWRzLT5pMmNfYnVzLCAxKTsKKwkJCQkJcmFkZW9uX2kyY19zd19wdXRfYnl0ZSh0bWRzLT5pMmNfYnVzLAorCQkJCQkJCSAgICAgICB0bWRzLT5zbGF2ZV9hZGRyLAorCQkJCQkJCSAgICAgICByZWcsIHZhbCk7CisJCQkJCXJhZGVvbl9pMmNfZG9fbG9jayh0bWRzLT5pMmNfYnVzLCAwKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJRFJNX0VSUk9SKCJVbmtub3duIGlkICVkXG4iLCBpZCA+PiAxMyk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZCA9IFJCSU9TMTYoaW5kZXgpOworCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorCiBzdGF0aWMgdm9pZCBjb21iaW9zX3BhcnNlX21taW9fdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDE2X3Qgb2Zmc2V0KQogewogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYwppbmRleCAyOTc2M2NlLi41ZWVjZTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb25uZWN0b3JzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29ubmVjdG9ycy5jCkBAIC00MCw2ICs0MCwyNiBAQAogCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCiAJCQkJICAgICAgIGJvb2wgY29ubmVjdGVkKTsKIAordm9pZCByYWRlb25fY29ubmVjdG9yX2hvdHBsdWcoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCisJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmhwZC5ocGQgIT0gUkFERU9OX0hQRF9OT05FKQorCQlyYWRlb25faHBkX3NldF9wb2xhcml0eShyZGV2LCByYWRlb25fY29ubmVjdG9yLT5ocGQuaHBkKTsKKworCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9ydCkgeworCQlpZiAocmFkZW9uX2RwX2dldHNpbmt0eXBlKHJhZGVvbl9jb25uZWN0b3IpID09IENPTk5FQ1RPUl9PQkpFQ1RfSURfRElTUExBWVBPUlQpIHsKKwkJCWlmIChyYWRlb25fZHBfbmVlZHNfbGlua190cmFpbihyYWRlb25fY29ubmVjdG9yKSkgeworCQkJCWlmIChjb25uZWN0b3ItPmVuY29kZXIpCisJCQkJCWRwX2xpbmtfdHJhaW4oY29ubmVjdG9yLT5lbmNvZGVyLCBjb25uZWN0b3IpOworCQkJfQorCQl9CisJfQorCit9CisKIHN0YXRpYyB2b2lkIHJhZGVvbl9wcm9wZXJ0eV9jaGFuZ2VfbW9kZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7CiAJc3RydWN0IGRybV9jcnRjICpjcnRjID0gZW5jb2Rlci0+Y3J0YzsKQEAgLTQ0NSwxMCArNDY1LDEwIEBACiAJCXJldCA9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwogCWVsc2UgewogCQlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cykgewotCQkJcmFkZW9uX2kyY19kb19sb2NrKHJhZGVvbl9jb25uZWN0b3IsIDEpOworCQkJcmFkZW9uX2kyY19kb19sb2NrKHJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMsIDEpOwogCQkJcmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCA9IGRybV9nZXRfZWRpZCgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwKIAkJCQkJCQkgICAgICAmcmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cy0+YWRhcHRlcik7Ci0JCQlyYWRlb25faTJjX2RvX2xvY2socmFkZW9uX2Nvbm5lY3RvciwgMCk7CisJCQlyYWRlb25faTJjX2RvX2xvY2socmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cywgMCk7CiAJCQlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkKIAkJCQlyZXQgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKIAkJfQpAQCAtNTUzLDE3ICs1NzMsMTcgQEAKIAlpZiAoIWVuY29kZXIpCiAJCXJldCA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOwogCi0JcmFkZW9uX2kyY19kb19sb2NrKHJhZGVvbl9jb25uZWN0b3IsIDEpOworCXJhZGVvbl9pMmNfZG9fbG9jayhyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzLCAxKTsKIAlkcmV0ID0gcmFkZW9uX2RkY19wcm9iZShyYWRlb25fY29ubmVjdG9yKTsKLQlyYWRlb25faTJjX2RvX2xvY2socmFkZW9uX2Nvbm5lY3RvciwgMCk7CisJcmFkZW9uX2kyY19kb19sb2NrKHJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMsIDApOwogCWlmIChkcmV0KSB7CiAJCWlmIChyYWRlb25fY29ubmVjdG9yLT5lZGlkKSB7CiAJCQlrZnJlZShyYWRlb25fY29ubmVjdG9yLT5lZGlkKTsKIAkJCXJhZGVvbl9jb25uZWN0b3ItPmVkaWQgPSBOVUxMOwogCQl9Ci0JCXJhZGVvbl9pMmNfZG9fbG9jayhyYWRlb25fY29ubmVjdG9yLCAxKTsKKwkJcmFkZW9uX2kyY19kb19sb2NrKHJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMsIDEpOwogCQlyYWRlb25fY29ubmVjdG9yLT5lZGlkID0gZHJtX2dldF9lZGlkKCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLCAmcmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cy0+YWRhcHRlcik7Ci0JCXJhZGVvbl9pMmNfZG9fbG9jayhyYWRlb25fY29ubmVjdG9yLCAwKTsKKwkJcmFkZW9uX2kyY19kb19sb2NrKHJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMsIDApOwogCiAJCWlmICghcmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkgewogCQkJRFJNX0VSUk9SKCIlczogcHJvYmVkIGEgbW9uaXRvciBidXQgbm98aW52YWxpZCBFRElEXG4iLApAQCAtNzA4LDE3ICs3MjgsMTcgQEAKIAllbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIHJldCA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOwogCWJvb2wgZHJldDsKIAotCXJhZGVvbl9pMmNfZG9fbG9jayhyYWRlb25fY29ubmVjdG9yLCAxKTsKKwlyYWRlb25faTJjX2RvX2xvY2socmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cywgMSk7CiAJZHJldCA9IHJhZGVvbl9kZGNfcHJvYmUocmFkZW9uX2Nvbm5lY3Rvcik7Ci0JcmFkZW9uX2kyY19kb19sb2NrKHJhZGVvbl9jb25uZWN0b3IsIDApOworCXJhZGVvbl9pMmNfZG9fbG9jayhyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzLCAwKTsKIAlpZiAoZHJldCkgewogCQlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkgewogCQkJa2ZyZWUocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCk7CiAJCQlyYWRlb25fY29ubmVjdG9yLT5lZGlkID0gTlVMTDsKIAkJfQotCQlyYWRlb25faTJjX2RvX2xvY2socmFkZW9uX2Nvbm5lY3RvciwgMSk7CisJCXJhZGVvbl9pMmNfZG9fbG9jayhyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzLCAxKTsKIAkJcmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCA9IGRybV9nZXRfZWRpZCgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgJnJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMtPmFkYXB0ZXIpOwotCQlyYWRlb25faTJjX2RvX2xvY2socmFkZW9uX2Nvbm5lY3RvciwgMCk7CisJCXJhZGVvbl9pMmNfZG9fbG9jayhyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzLCAwKTsKIAogCQlpZiAoIXJhZGVvbl9jb25uZWN0b3ItPmVkaWQpIHsKIAkJCURSTV9FUlJPUigiJXM6IHByb2JlZCBhIG1vbml0b3IgYnV0IG5vfGludmFsaWQgRURJRFxuIiwKQEAgLTczNSw2ICs3NTUsMzkgQEAKIAkJCQlyZXQgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKIAkJCX0gZWxzZQogCQkJCXJldCA9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCisJCQkvKiBtdWx0aXBsZSBjb25uZWN0b3JzIG9uIHRoZSBzYW1lIGVuY29kZXIgd2l0aCB0aGUgc2FtZSBkZGMgbGluZQorCQkJICogVGhpcyB0ZW5kcyB0byBiZSBIRE1JIGFuZCBEVkkgb24gdGhlIHNhbWUgZW5jb2RlciB3aXRoIHRoZQorCQkJICogc2FtZSBkZGMgbGluZS4gIElmIHRoZSBlZGlkIHNheXMgSERNSSwgY29uc2lkZXIgdGhlIEhETUkgcG9ydAorCQkJICogY29ubmVjdGVkIGFuZCB0aGUgRFZJIHBvcnQgZGlzY29ubmVjdGVkLiAgSWYgdGhlIGVkaWQgZG9lc24ndAorCQkJICogc2F5IEhETUksIHZpY2UgdmVyc2EuCisJCQkgKi8KKwkJCWlmIChyYWRlb25fY29ubmVjdG9yLT5zaGFyZWRfZGRjICYmIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkKSB7CisJCQkJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCQkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpsaXN0X2Nvbm5lY3RvcjsKKwkJCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqbGlzdF9yYWRlb25fY29ubmVjdG9yOworCQkJCWxpc3RfZm9yX2VhY2hfZW50cnkobGlzdF9jb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCQkJCWlmIChjb25uZWN0b3IgPT0gbGlzdF9jb25uZWN0b3IpCisJCQkJCQljb250aW51ZTsKKwkJCQkJbGlzdF9yYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3RvcihsaXN0X2Nvbm5lY3Rvcik7CisJCQkJCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzID09IGxpc3RfcmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcykgeworCQkJCQkJaWYgKGRybV9kZXRlY3RfaGRtaV9tb25pdG9yKHJhZGVvbl9jb25uZWN0b3ItPmVkaWQpKSB7CisJCQkJCQkJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUQpIHsKKwkJCQkJCQkJa2ZyZWUocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCk7CisJCQkJCQkJCXJhZGVvbl9jb25uZWN0b3ItPmVkaWQgPSBOVUxMOworCQkJCQkJCQlyZXQgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmICgoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUEpIHx8CisJCQkJCQkJICAgIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQikpIHsKKwkJCQkJCQkJa2ZyZWUocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCk7CisJCQkJCQkJCXJhZGVvbl9jb25uZWN0b3ItPmVkaWQgPSBOVUxMOworCQkJCQkJCQlyZXQgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CiAJCX0KIAl9CiAKQEAgLTg2Myw2ICs5MTYsOTEgQEAKIAkuZm9yY2UgPSByYWRlb25fZHZpX2ZvcmNlLAogfTsKIAorc3RhdGljIHZvaWQgcmFkZW9uX2RwX2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJc3RydWN0IHJhZGVvbl9jb25uZWN0b3JfYXRvbV9kaWcgKnJhZGVvbl9kaWdfY29ubmVjdG9yID0gcmFkZW9uX2Nvbm5lY3Rvci0+Y29uX3ByaXY7CisKKwlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cykKKwkJcmFkZW9uX2kyY19kZXN0cm95KHJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMpOworCWlmIChyYWRlb25fY29ubmVjdG9yLT5lZGlkKQorCQlrZnJlZShyYWRlb25fY29ubmVjdG9yLT5lZGlkKTsKKwlpZiAocmFkZW9uX2RpZ19jb25uZWN0b3ItPmRwX2kyY19idXMpCisJCXJhZGVvbl9pMmNfZGVzdHJveShyYWRlb25fZGlnX2Nvbm5lY3Rvci0+ZHBfaTJjX2J1cyk7CisJa2ZyZWUocmFkZW9uX2Nvbm5lY3Rvci0+Y29uX3ByaXYpOworCWRybV9zeXNmc19jb25uZWN0b3JfcmVtb3ZlKGNvbm5lY3Rvcik7CisJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGNvbm5lY3Rvcik7CisJa2ZyZWUoY29ubmVjdG9yKTsKK30KKworc3RhdGljIGludCByYWRlb25fZHBfZ2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJaW50IHJldDsKKworCXJldCA9IHJhZGVvbl9kZGNfZ2V0X21vZGVzKHJhZGVvbl9jb25uZWN0b3IpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIHJhZGVvbl9kcF9kZXRlY3Qoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwllbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIHJldCA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworCXN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnICpyYWRlb25fZGlnX2Nvbm5lY3RvciA9IHJhZGVvbl9jb25uZWN0b3ItPmNvbl9wcml2OworCXU4IHNpbmtfdHlwZTsKKworCWlmIChyYWRlb25fY29ubmVjdG9yLT5lZGlkKSB7CisJCWtmcmVlKHJhZGVvbl9jb25uZWN0b3ItPmVkaWQpOworCQlyYWRlb25fY29ubmVjdG9yLT5lZGlkID0gTlVMTDsKKwl9CisKKwlzaW5rX3R5cGUgPSByYWRlb25fZHBfZ2V0c2lua3R5cGUocmFkZW9uX2Nvbm5lY3Rvcik7CisJaWYgKHNpbmtfdHlwZSA9PSBDT05ORUNUT1JfT0JKRUNUX0lEX0RJU1BMQVlQT1JUKSB7CisJCWlmIChyYWRlb25fZHBfZ2V0ZHBjZChyYWRlb25fY29ubmVjdG9yKSkgeworCQkJcmFkZW9uX2RpZ19jb25uZWN0b3ItPmRwX3NpbmtfdHlwZSA9IHNpbmtfdHlwZTsKKwkJCXJldCA9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCQl9CisJfSBlbHNlIHsKKwkJcmFkZW9uX2kyY19kb19sb2NrKHJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMsIDEpOworCQlpZiAocmFkZW9uX2RkY19wcm9iZShyYWRlb25fY29ubmVjdG9yKSkgeworCQkJcmFkZW9uX2RpZ19jb25uZWN0b3ItPmRwX3NpbmtfdHlwZSA9IHNpbmtfdHlwZTsKKwkJCXJldCA9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCQl9CisJCXJhZGVvbl9pMmNfZG9fbG9jayhyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzLCAwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJhZGVvbl9kcF9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqcmFkZW9uX2RpZ19jb25uZWN0b3IgPSByYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdjsKKworCS8qIFhYWCBjaGVjayBtb2RlIGJhbmR3aWR0aCAqLworCisJaWYgKHJhZGVvbl9kaWdfY29ubmVjdG9yLT5kcF9zaW5rX3R5cGUgPT0gQ09OTkVDVE9SX09CSkVDVF9JRF9ESVNQTEFZUE9SVCkKKwkJcmV0dXJuIHJhZGVvbl9kcF9tb2RlX3ZhbGlkX2hlbHBlcihyYWRlb25fY29ubmVjdG9yLCBtb2RlKTsKKwllbHNlCisJCXJldHVybiBNT0RFX09LOworfQorCitzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgcmFkZW9uX2RwX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7CisJLmdldF9tb2RlcyA9IHJhZGVvbl9kcF9nZXRfbW9kZXMsCisJLm1vZGVfdmFsaWQgPSByYWRlb25fZHBfbW9kZV92YWxpZCwKKwkuYmVzdF9lbmNvZGVyID0gcmFkZW9uX2R2aV9lbmNvZGVyLAorfTsKKworc3RydWN0IGRybV9jb25uZWN0b3JfZnVuY3MgcmFkZW9uX2RwX2Nvbm5lY3Rvcl9mdW5jcyA9IHsKKwkuZHBtcyA9IGRybV9oZWxwZXJfY29ubmVjdG9yX2RwbXMsCisJLmRldGVjdCA9IHJhZGVvbl9kcF9kZXRlY3QsCisJLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMsCisJLnNldF9wcm9wZXJ0eSA9IHJhZGVvbl9jb25uZWN0b3Jfc2V0X3Byb3BlcnR5LAorCS5kZXN0cm95ID0gcmFkZW9uX2RwX2Nvbm5lY3Rvcl9kZXN0cm95LAorCS5mb3JjZSA9IHJhZGVvbl9kdmlfZm9yY2UsCit9OworCiB2b2lkCiByYWRlb25fYWRkX2F0b21fY29ubmVjdG9yKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkgIHVpbnQzMl90IGNvbm5lY3Rvcl9pZCwKQEAgLTg3MSw3ICsxMDA5LDggQEAKIAkJCSAgc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyAqaTJjX2J1cywKIAkJCSAgYm9vbCBsaW5rYiwKIAkJCSAgdWludDMyX3QgaWdwX2xhbmVfaW5mbywKLQkJCSAgdWludDE2X3QgY29ubmVjdG9yX29iamVjdF9pZCkKKwkJCSAgdWludDE2X3QgY29ubmVjdG9yX29iamVjdF9pZCwKKwkJCSAgc3RydWN0IHJhZGVvbl9ocGQgKmhwZCkKIHsKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKQEAgLTkxMSw2ICsxMDUwLDcgQEAKIAlyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzID0gc3VwcG9ydGVkX2RldmljZTsKIAlyYWRlb25fY29ubmVjdG9yLT5zaGFyZWRfZGRjID0gc2hhcmVkX2RkYzsKIAlyYWRlb25fY29ubmVjdG9yLT5jb25uZWN0b3Jfb2JqZWN0X2lkID0gY29ubmVjdG9yX29iamVjdF9pZDsKKwlyYWRlb25fY29ubmVjdG9yLT5ocGQgPSAqaHBkOwogCXN3aXRjaCAoY29ubmVjdG9yX3R5cGUpIHsKIAljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9WR0E6CiAJCWRybV9jb25uZWN0b3JfaW5pdChkZXYsICZyYWRlb25fY29ubmVjdG9yLT5iYXNlLCAmcmFkZW9uX3ZnYV9jb25uZWN0b3JfZnVuY3MsIGNvbm5lY3Rvcl90eXBlKTsKQEAgLTk2MywxMCArMTEwMywxMiBAQAogCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwKIAkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLmNvaGVyZW50X21vZGVfcHJvcGVydHksCiAJCQkJCSAgICAgIDEpOwotCQlyYWRlb25fY29ubmVjdG9yLT5kYWNfbG9hZF9kZXRlY3QgPSB0cnVlOwotCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwKLQkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLmxvYWRfZGV0ZWN0X3Byb3BlcnR5LAotCQkJCQkgICAgICAxKTsKKwkJaWYgKGNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9EVklJKSB7CisJCQlyYWRlb25fY29ubmVjdG9yLT5kYWNfbG9hZF9kZXRlY3QgPSB0cnVlOworCQkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsCisJCQkJCQkgICAgICByZGV2LT5tb2RlX2luZm8ubG9hZF9kZXRlY3RfcHJvcGVydHksCisJCQkJCQkgICAgICAxKTsKKwkJfQogCQlicmVhazsKIAljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQToKIAljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQjoKQEAgLTk5NywxNiArMTEzOSwyMyBAQAogCQlyYWRlb25fZGlnX2Nvbm5lY3Rvci0+bGlua2IgPSBsaW5rYjsKIAkJcmFkZW9uX2RpZ19jb25uZWN0b3ItPmlncF9sYW5lX2luZm8gPSBpZ3BfbGFuZV9pbmZvOwogCQlyYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdiA9IHJhZGVvbl9kaWdfY29ubmVjdG9yOwotCQlkcm1fY29ubmVjdG9yX2luaXQoZGV2LCAmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgJnJhZGVvbl9kdmlfY29ubmVjdG9yX2Z1bmNzLCBjb25uZWN0b3JfdHlwZSk7Ci0JCXJldCA9IGRybV9jb25uZWN0b3JfaGVscGVyX2FkZCgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgJnJhZGVvbl9kdmlfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7CisJCWRybV9jb25uZWN0b3JfaW5pdChkZXYsICZyYWRlb25fY29ubmVjdG9yLT5iYXNlLCAmcmFkZW9uX2RwX2Nvbm5lY3Rvcl9mdW5jcywgY29ubmVjdG9yX3R5cGUpOworCQlyZXQgPSBkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsICZyYWRlb25fZHBfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGZhaWxlZDsKIAkJaWYgKGkyY19idXMtPnZhbGlkKSB7CisJCQkvKiBhZGQgRFAgaTJjIGJ1cyAqLworCQkJcmFkZW9uX2RpZ19jb25uZWN0b3ItPmRwX2kyY19idXMgPSByYWRlb25faTJjX2NyZWF0ZV9kcChkZXYsIGkyY19idXMsICJEUC1hdXhjaCIpOworCQkJaWYgKCFyYWRlb25fZGlnX2Nvbm5lY3Rvci0+ZHBfaTJjX2J1cykKKwkJCQlnb3RvIGZhaWxlZDsKIAkJCXJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMgPSByYWRlb25faTJjX2NyZWF0ZShkZXYsIGkyY19idXMsICJEUCIpOwogCQkJaWYgKCFyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzKQogCQkJCWdvdG8gZmFpbGVkOwogCQl9CiAJCXN1YnBpeGVsX29yZGVyID0gU3ViUGl4ZWxIb3Jpem9udGFsUkdCOworCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwKKwkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLmNvaGVyZW50X21vZGVfcHJvcGVydHksCisJCQkJCSAgICAgIDEpOwogCQlicmVhazsKIAljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9TVklERU86CiAJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfQ29tcG9zaXRlOgpAQCAtMTAyMCw2ICsxMTY5LDkgQEAKIAkJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAogCQkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLmxvYWRfZGV0ZWN0X3Byb3BlcnR5LAogCQkJCQkJICAgICAgMSk7CisJCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwKKwkJCQkJCSAgICAgIHJkZXYtPm1vZGVfaW5mby50dl9zdGRfcHJvcGVydHksCisJCQkJCQkgICAgICAxKTsKIAkJfQogCQlicmVhazsKIAljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTOgpAQCAtMTAzOCw3ICsxMTkwLDYgQEAKIAkJCWlmICghcmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cykKIAkJCQlnb3RvIGZhaWxlZDsKIAkJfQotCQlkcm1fbW9kZV9jcmVhdGVfc2NhbGluZ19tb2RlX3Byb3BlcnR5KGRldik7CiAJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAogCQkJCQkgICAgICBkZXYtPm1vZGVfY29uZmlnLnNjYWxpbmdfbW9kZV9wcm9wZXJ0eSwKIAkJCQkJICAgICAgRFJNX01PREVfU0NBTEVfRlVMTFNDUkVFTik7CkBAIC0xMDYzLDcgKzEyMTQsOCBAQAogCQkJICAgIHVpbnQzMl90IHN1cHBvcnRlZF9kZXZpY2UsCiAJCQkgICAgaW50IGNvbm5lY3Rvcl90eXBlLAogCQkJICAgIHN0cnVjdCByYWRlb25faTJjX2J1c19yZWMgKmkyY19idXMsCi0JCQkgICAgdWludDE2X3QgY29ubmVjdG9yX29iamVjdF9pZCkKKwkJCSAgICB1aW50MTZfdCBjb25uZWN0b3Jfb2JqZWN0X2lkLAorCQkJICAgIHN0cnVjdCByYWRlb25faHBkICpocGQpCiB7CiAJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CkBAIC0xMDkzLDYgKzEyNDUsNyBAQAogCXJhZGVvbl9jb25uZWN0b3ItPmNvbm5lY3Rvcl9pZCA9IGNvbm5lY3Rvcl9pZDsKIAlyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzID0gc3VwcG9ydGVkX2RldmljZTsKIAlyYWRlb25fY29ubmVjdG9yLT5jb25uZWN0b3Jfb2JqZWN0X2lkID0gY29ubmVjdG9yX29iamVjdF9pZDsKKwlyYWRlb25fY29ubmVjdG9yLT5ocGQgPSAqaHBkOwogCXN3aXRjaCAoY29ubmVjdG9yX3R5cGUpIHsKIAljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9WR0E6CiAJCWRybV9jb25uZWN0b3JfaW5pdChkZXYsICZyYWRlb25fY29ubmVjdG9yLT5iYXNlLCAmcmFkZW9uX3ZnYV9jb25uZWN0b3JfZnVuY3MsIGNvbm5lY3Rvcl90eXBlKTsKQEAgLTExNjAsNiArMTMxMyw5IEBACiAJCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwKIAkJCQkJCSAgICAgIHJkZXYtPm1vZGVfaW5mby5sb2FkX2RldGVjdF9wcm9wZXJ0eSwKIAkJCQkJCSAgICAgIDEpOworCQkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsCisJCQkJCQkgICAgICByZGV2LT5tb2RlX2luZm8udHZfc3RkX3Byb3BlcnR5LAorCQkJCQkJICAgICAgMSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUzoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcC5jCmluZGV4IDRmN2FmYzcuLjBiMmY5YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3AuYwpAQCAtMTk0MSw4ICsxOTQxLDggQEAKIAlmb3IgKHQgPSAwOyB0IDwgZGV2X3ByaXYtPnVzZWNfdGltZW91dDsgdCsrKSB7CiAJCXUzMiBkb25lX2FnZSA9IEdFVF9TQ1JBVENIKGRldl9wcml2LCAxKTsKIAkJRFJNX0RFQlVHKCJkb25lX2FnZSA9ICVkXG4iLCBkb25lX2FnZSk7Ci0JCWZvciAoaSA9IHN0YXJ0OyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQkJYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgeworCQkJYnVmID0gZG1hLT5idWZsaXN0W3N0YXJ0XTsKIAkJCWJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAkJCWlmIChidWYtPmZpbGVfcHJpdiA9PSBOVUxMIHx8IChidWYtPnBlbmRpbmcgJiYKIAkJCQkJCSAgICAgICBidWZfcHJpdi0+YWdlIDw9CkBAIC0xOTUxLDcgKzE5NTEsOCBAQAogCQkJCWJ1Zi0+cGVuZGluZyA9IDA7CiAJCQkJcmV0dXJuIGJ1ZjsKIAkJCX0KLQkJCXN0YXJ0ID0gMDsKKwkJCWlmICgrK3N0YXJ0ID49IGRtYS0+YnVmX2NvdW50KQorCQkJCXN0YXJ0ID0gMDsKIAkJfQogCiAJCWlmICh0KSB7CkBAIC0xOTYwLDQ3ICsxOTYxLDkgQEAKIAkJfQogCX0KIAotCURSTV9ERUJVRygicmV0dXJuaW5nIE5VTEwhXG4iKTsKIAlyZXR1cm4gTlVMTDsKIH0KIAotI2lmIDAKLXN0cnVjdCBkcm1fYnVmICpyYWRlb25fZnJlZWxpc3RfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQotewotCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fcmFkZW9uX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwotCXN0cnVjdCBkcm1fYnVmICpidWY7Ci0JaW50IGksIHQ7Ci0JaW50IHN0YXJ0OwotCXUzMiBkb25lX2FnZTsKLQotCWRvbmVfYWdlID0gcmFkZW9uX3JlYWRfcmluZ19ycHRyKGRldl9wcml2LCBSQURFT05fU0NSQVRDSE9GRigxKSk7Ci0JaWYgKCsrZGV2X3ByaXYtPmxhc3RfYnVmID49IGRtYS0+YnVmX2NvdW50KQotCQlkZXZfcHJpdi0+bGFzdF9idWYgPSAwOwotCi0Jc3RhcnQgPSBkZXZfcHJpdi0+bGFzdF9idWY7Ci0JZGV2X3ByaXYtPnN0YXRzLmZyZWVsaXN0X2xvb3BzKys7Ci0KLQlmb3IgKHQgPSAwOyB0IDwgMjsgdCsrKSB7Ci0JCWZvciAoaSA9IHN0YXJ0OyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQkJYnVmID0gZG1hLT5idWZsaXN0W2ldOwotCQkJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwotCQkJaWYgKGJ1Zi0+ZmlsZV9wcml2ID09IDAgfHwgKGJ1Zi0+cGVuZGluZyAmJgotCQkJCQkJICAgIGJ1Zl9wcml2LT5hZ2UgPD0KLQkJCQkJCSAgICBkb25lX2FnZSkpIHsKLQkJCQlkZXZfcHJpdi0+c3RhdHMucmVxdWVzdGVkX2J1ZnMrKzsKLQkJCQlidWYtPnBlbmRpbmcgPSAwOwotCQkJCXJldHVybiBidWY7Ci0JCQl9Ci0JCX0KLQkJc3RhcnQgPSAwOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotI2VuZGlmCi0KIHZvaWQgcmFkZW9uX2ZyZWVsaXN0X3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3MuYwppbmRleCA1YWIyY2Y5Li42NTU5MGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NzLmMKQEAgLTc2LDE3ICs3NiwxNyBAQAogCQkJfQogCQkJcC0+cmVsb2NzX3B0cltpXSA9ICZwLT5yZWxvY3NbaV07CiAJCQlwLT5yZWxvY3NbaV0ucm9iaiA9IHAtPnJlbG9jc1tpXS5nb2JqLT5kcml2ZXJfcHJpdmF0ZTsKLQkJCXAtPnJlbG9jc1tpXS5sb2JqLnJvYmogPSBwLT5yZWxvY3NbaV0ucm9iajsKKwkJCXAtPnJlbG9jc1tpXS5sb2JqLmJvID0gcC0+cmVsb2NzW2ldLnJvYmo7CiAJCQlwLT5yZWxvY3NbaV0ubG9iai5yZG9tYWluID0gci0+cmVhZF9kb21haW5zOwogCQkJcC0+cmVsb2NzW2ldLmxvYmoud2RvbWFpbiA9IHItPndyaXRlX2RvbWFpbjsKIAkJCXAtPnJlbG9jc1tpXS5oYW5kbGUgPSByLT5oYW5kbGU7CiAJCQlwLT5yZWxvY3NbaV0uZmxhZ3MgPSByLT5mbGFnczsKIAkJCUlOSVRfTElTVF9IRUFEKCZwLT5yZWxvY3NbaV0ubG9iai5saXN0KTsKLQkJCXJhZGVvbl9vYmplY3RfbGlzdF9hZGRfb2JqZWN0KCZwLT5yZWxvY3NbaV0ubG9iaiwKLQkJCQkJCSAgICAgICZwLT52YWxpZGF0ZWQpOworCQkJcmFkZW9uX2JvX2xpc3RfYWRkX29iamVjdCgmcC0+cmVsb2NzW2ldLmxvYmosCisJCQkJCQkmcC0+dmFsaWRhdGVkKTsKIAkJfQogCX0KLQlyZXR1cm4gcmFkZW9uX29iamVjdF9saXN0X3ZhbGlkYXRlKCZwLT52YWxpZGF0ZWQsIHAtPmliLT5mZW5jZSk7CisJcmV0dXJuIHJhZGVvbl9ib19saXN0X3ZhbGlkYXRlKCZwLT52YWxpZGF0ZWQsIHAtPmliLT5mZW5jZSk7CiB9CiAKIGludCByYWRlb25fY3NfcGFyc2VyX2luaXQoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsIHZvaWQgKmRhdGEpCkBAIC0xOTAsOSArMTkwLDEwIEBACiAJdW5zaWduZWQgaTsKIAogCWlmIChlcnJvcikgewotCQlyYWRlb25fb2JqZWN0X2xpc3RfdW52YWxpZGF0ZSgmcGFyc2VyLT52YWxpZGF0ZWQpOworCQlyYWRlb25fYm9fbGlzdF91bnZhbGlkYXRlKCZwYXJzZXItPnZhbGlkYXRlZCwKKwkJCQkJCXBhcnNlci0+aWItPmZlbmNlKTsKIAl9IGVsc2UgewotCQlyYWRlb25fb2JqZWN0X2xpc3RfY2xlYW4oJnBhcnNlci0+dmFsaWRhdGVkKTsKKwkJcmFkZW9uX2JvX2xpc3RfdW5yZXNlcnZlKCZwYXJzZXItPnZhbGlkYXRlZCk7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBwYXJzZXItPm5yZWxvY3M7IGkrKykgewogCQlpZiAocGFyc2VyLT5yZWxvY3NbaV0uZ29iaikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGV2aWNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kZXZpY2UuYwppbmRleCA0MWJiNzZmLi4wMmJjZGIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kZXZpY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kZXZpY2UuYwpAQCAtNDQsMTAgKzQ0LDExIEBACiAJaWYgKHJkZXYtPmZhbWlseSA8IENISVBfUjYwMCkgewogCQlpbnQgaTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlXUkVHMzIoUkFERU9OX1NVUkZBQ0UwX0lORk8gKwotCQkJICAgICAgIGkgKiAoUkFERU9OX1NVUkZBQ0UxX0lORk8gLSBSQURFT05fU1VSRkFDRTBfSU5GTyksCi0JCQkgICAgICAgMCk7CisJCWZvciAoaSA9IDA7IGkgPCBSQURFT05fR0VNX01BWF9TVVJGQUNFUzsgaSsrKSB7CisJCQlpZiAocmRldi0+c3VyZmFjZV9yZWdzW2ldLmJvKQorCQkJCXJhZGVvbl9ib19nZXRfc3VyZmFjZV9yZWcocmRldi0+c3VyZmFjZV9yZWdzW2ldLmJvKTsKKwkJCWVsc2UKKwkJCQlyYWRlb25fY2xlYXJfc3VyZmFjZV9yZWcocmRldiwgaSk7CiAJCX0KIAkJLyogZW5hYmxlIHN1cmZhY2VzICovCiAJCVdSRUczMihSQURFT05fU1VSRkFDRV9DTlRMLCAwKTsKQEAgLTIwOCw2ICsyMDksMjQgQEAKIAogfQogCitib29sIHJhZGVvbl9ib290X3Rlc3RfcG9zdF9jYXJkKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCWlmIChyYWRlb25fY2FyZF9wb3N0ZWQocmRldikpCisJCXJldHVybiB0cnVlOworCisJaWYgKHJkZXYtPmJpb3MpIHsKKwkJRFJNX0lORk8oIkdQVSBub3QgcG9zdGVkLiBwb3N0aW5nIG5vdy4uLlxuIik7CisJCWlmIChyZGV2LT5pc19hdG9tX2Jpb3MpCisJCQlhdG9tX2FzaWNfaW5pdChyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0KTsKKwkJZWxzZQorCQkJcmFkZW9uX2NvbWJpb3NfYXNpY19pbml0KHJkZXYtPmRkZXYpOworCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKHJkZXYtPmRldiwgIkNhcmQgbm90IHBvc3RlZCBhbmQgbm8gQklPUyAtIGlnbm9yaW5nXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKwogaW50IHJhZGVvbl9kdW1teV9wYWdlX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJcmRldi0+ZHVtbXlfcGFnZS5wYWdlID0gYWxsb2NfcGFnZShHRlBfRE1BMzIgfCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CkBAIC00NjMsMTIgKzQ4MiwxNiBAQAogCiAJcmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCA9IGF0b21fcGFyc2UoYXRvbV9jYXJkX2luZm8sIHJkZXYtPmJpb3MpOwogCXJhZGVvbl9hdG9tX2luaXRpYWxpemVfYmlvc19zY3JhdGNoX3JlZ3MocmRldi0+ZGRldik7CisJYXRvbV9hbGxvY2F0ZV9mYl9zY3JhdGNoKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQpOwogCXJldHVybiAwOwogfQogCiB2b2lkIHJhZGVvbl9hdG9tYmlvc19maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewotCWtmcmVlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQpOworCWlmIChyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0KSB7CisJCWtmcmVlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQtPnNjcmF0Y2gpOworCQlrZnJlZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0KTsKKwl9CiAJa2ZyZWUocmRldi0+bW9kZV9pbmZvLmF0b21fY2FyZF9pbmZvKTsKIH0KIApAQCAtNTQ0LDE2ICs1NjcsMjQgQEAKIAltdXRleF9pbml0KCZyZGV2LT5jc19tdXRleCk7CiAJbXV0ZXhfaW5pdCgmcmRldi0+aWJfcG9vbC5tdXRleCk7CiAJbXV0ZXhfaW5pdCgmcmRldi0+Y3AubXV0ZXgpOworCWlmIChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SNjAwKQorCQlzcGluX2xvY2tfaW5pdCgmcmRldi0+aWgubG9jayk7CisJbXV0ZXhfaW5pdCgmcmRldi0+Z2VtLm11dGV4KTsKIAlyd2xvY2tfaW5pdCgmcmRldi0+ZmVuY2VfZHJ2LmxvY2spOwogCUlOSVRfTElTVF9IRUFEKCZyZGV2LT5nZW0ub2JqZWN0cyk7CiAKKwkvKiBzZXR1cCB3b3JrcXVldWUgKi8KKwlyZGV2LT53cSA9IGNyZWF0ZV93b3JrcXVldWUoInJhZGVvbiIpOworCWlmIChyZGV2LT53cSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCS8qIFNldCBhc2ljIGZ1bmN0aW9ucyAqLwogCXIgPSByYWRlb25fYXNpY19pbml0KHJkZXYpOwogCWlmIChyKSB7CiAJCXJldHVybiByOwogCX0KIAotCWlmIChyYWRlb25fYWdwbW9kZSA9PSAtMSkgeworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19BR1AgJiYgcmFkZW9uX2FncG1vZGUgPT0gLTEpIHsKIAkJcmFkZW9uX2FncF9kaXNhYmxlKHJkZXYpOwogCX0KIApAQCAtNjIwLDYgKzY1MSw3IEBACiAJRFJNX0lORk8oInJhZGVvbjogZmluaXNoaW5nIGRldmljZS5cbiIpOwogCXJkZXYtPnNodXRkb3duID0gdHJ1ZTsKIAlyYWRlb25fZmluaShyZGV2KTsKKwlkZXN0cm95X3dvcmtxdWV1ZShyZGV2LT53cSk7CiAJdmdhX2NsaWVudF9yZWdpc3RlcihyZGV2LT5wZGV2LCBOVUxMLCBOVUxMLCBOVUxMKTsKIAlpb3VubWFwKHJkZXYtPnJtbWlvKTsKIAlyZGV2LT5ybW1pbyA9IE5VTEw7CkBAIC02MzMsNiArNjY1LDcgQEAKIHsKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9jcnRjICpjcnRjOworCWludCByOwogCiAJaWYgKGRldiA9PSBOVUxMIHx8IHJkZXYgPT0gTlVMTCkgewogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTY0MywyNiArNjc2LDMxIEBACiAJLyogdW5waW4gdGhlIGZyb250IGJ1ZmZlcnMgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgewogCQlzdHJ1Y3QgcmFkZW9uX2ZyYW1lYnVmZmVyICpyZmIgPSB0b19yYWRlb25fZnJhbWVidWZmZXIoY3J0Yy0+ZmIpOwotCQlzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iajsKKwkJc3RydWN0IHJhZGVvbl9ibyAqcm9iajsKIAogCQlpZiAocmZiID09IE5VTEwgfHwgcmZiLT5vYmogPT0gTlVMTCkgewogCQkJY29udGludWU7CiAJCX0KIAkJcm9iaiA9IHJmYi0+b2JqLT5kcml2ZXJfcHJpdmF0ZTsKLQkJaWYgKHJvYmogIT0gcmRldi0+ZmJkZXZfcm9iaikgewotCQkJcmFkZW9uX29iamVjdF91bnBpbihyb2JqKTsKKwkJaWYgKHJvYmogIT0gcmRldi0+ZmJkZXZfcmJvKSB7CisJCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocm9iaiwgZmFsc2UpOworCQkJaWYgKHVubGlrZWx5KHIgPT0gMCkpIHsKKwkJCQlyYWRlb25fYm9fdW5waW4ocm9iaik7CisJCQkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyb2JqKTsKKwkJCX0KIAkJfQogCX0KIAkvKiBldmljdCB2cmFtIG1lbW9yeSAqLwotCXJhZGVvbl9vYmplY3RfZXZpY3RfdnJhbShyZGV2KTsKKwlyYWRlb25fYm9fZXZpY3RfdnJhbShyZGV2KTsKIAkvKiB3YWl0IGZvciBncHUgdG8gZmluaXNoIHByb2Nlc3NpbmcgY3VycmVudCBiYXRjaCAqLwogCXJhZGVvbl9mZW5jZV93YWl0X2xhc3QocmRldik7CiAKIAlyYWRlb25fc2F2ZV9iaW9zX3NjcmF0Y2hfcmVncyhyZGV2KTsKIAogCXJhZGVvbl9zdXNwZW5kKHJkZXYpOworCXJhZGVvbl9ocGRfZmluaShyZGV2KTsKIAkvKiBldmljdCByZW1haW5pbmcgdnJhbSBtZW1vcnkgKi8KLQlyYWRlb25fb2JqZWN0X2V2aWN0X3ZyYW0ocmRldik7CisJcmFkZW9uX2JvX2V2aWN0X3ZyYW0ocmRldik7CiAKIAlwY2lfc2F2ZV9zdGF0ZShkZXYtPnBkZXYpOwogCWlmIChzdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9TVVNQRU5EKSB7CkBAIC02OTUsNiArNzMzLDggQEAKIAlmYl9zZXRfc3VzcGVuZChyZGV2LT5mYmRldl9pbmZvLCAwKTsKIAlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CiAKKwkvKiByZXNldCBocGQgc3RhdGUgKi8KKwlyYWRlb25faHBkX2luaXQocmRldik7CiAJLyogYmxhdCB0aGUgbW9kZSBiYWNrIGluICovCiAJZHJtX2hlbHBlcl9yZXN1bWVfZm9yY2VfbW9kZShkZXYpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGlzcGxheS5jCmluZGV4IGM4NWRmNGEuLmExMzNiODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMKQEAgLTI1MCw2ICsyNTAsMTYgQEAKIAkiSERNSS1CIiwKIH07CiAKK3N0YXRpYyBjb25zdCBjaGFyICpocGRfbmFtZXNbN10gPSB7CisJIk5PTkUiLAorCSJIUEQxIiwKKwkiSFBEMiIsCisJIkhQRDMiLAorCSJIUEQ0IiwKKwkiSFBENSIsCisJIkhQRDYiLAorfTsKKwogc3RhdGljIHZvaWQgcmFkZW9uX3ByaW50X2Rpc3BsYXlfc2V0dXAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwpAQCAtMjY0LDE2ICsyNzQsMTggQEAKIAkJcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKIAkJRFJNX0lORk8oIkNvbm5lY3RvciAlZDpcbiIsIGkpOwogCQlEUk1fSU5GTygiICAlc1xuIiwgY29ubmVjdG9yX25hbWVzW2Nvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGVdKTsKKwkJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmhwZC5ocGQgIT0gUkFERU9OX0hQRF9OT05FKQorCQkJRFJNX0lORk8oIiAgJXNcbiIsIGhwZF9uYW1lc1tyYWRlb25fY29ubmVjdG9yLT5ocGQuaHBkXSk7CiAJCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzKQogCQkJRFJNX0lORk8oIiAgRERDOiAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXhcbiIsCiAJCQkJIHJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMtPnJlYy5tYXNrX2Nsa19yZWcsCiAJCQkJIHJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMtPnJlYy5tYXNrX2RhdGFfcmVnLAogCQkJCSByYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzLT5yZWMuYV9jbGtfcmVnLAogCQkJCSByYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzLT5yZWMuYV9kYXRhX3JlZywKLQkJCQkgcmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cy0+cmVjLnB1dF9jbGtfcmVnLAotCQkJCSByYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzLT5yZWMucHV0X2RhdGFfcmVnLAotCQkJCSByYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzLT5yZWMuZ2V0X2Nsa19yZWcsCi0JCQkJIHJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMtPnJlYy5nZXRfZGF0YV9yZWcpOworCQkJCSByYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzLT5yZWMuZW5fY2xrX3JlZywKKwkJCQkgcmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cy0+cmVjLmVuX2RhdGFfcmVnLAorCQkJCSByYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzLT5yZWMueV9jbGtfcmVnLAorCQkJCSByYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzLT5yZWMueV9kYXRhX3JlZyk7CiAJCURSTV9JTkZPKCIgIEVuY29kZXJzOlxuIik7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CiAJCQlyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwpAQCAtMzI0LDYgKzMzNiw3IEBACiAJCQlyZXQgPSByYWRlb25fZ2V0X2xlZ2FjeV9jb25uZWN0b3JfaW5mb19mcm9tX3RhYmxlKGRldik7CiAJfQogCWlmIChyZXQpIHsKKwkJcmFkZW9uX3NldHVwX2VuY29kZXJfY2xvbmVzKGRldik7CiAJCXJhZGVvbl9wcmludF9kaXNwbGF5X3NldHVwKGRldik7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoZHJtX2Nvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpCiAJCQlyYWRlb25fZGRjX2R1bXAoZHJtX2Nvbm5lY3Rvcik7CkBAIC0zMzYsMTIgKzM0OSwxNyBAQAogewogCWludCByZXQgPSAwOwogCisJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmJhc2UuY29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0KSB7CisJCXN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnICpkaWcgPSByYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdjsKKwkJaWYgKGRpZy0+ZHBfaTJjX2J1cykKKwkJCXJhZGVvbl9jb25uZWN0b3ItPmVkaWQgPSBkcm1fZ2V0X2VkaWQoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsICZkaWctPmRwX2kyY19idXMtPmFkYXB0ZXIpOworCX0KIAlpZiAoIXJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMpCiAJCXJldHVybiAtMTsKIAlpZiAoIXJhZGVvbl9jb25uZWN0b3ItPmVkaWQpIHsKLQkJcmFkZW9uX2kyY19kb19sb2NrKHJhZGVvbl9jb25uZWN0b3IsIDEpOworCQlyYWRlb25faTJjX2RvX2xvY2socmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cywgMSk7CiAJCXJhZGVvbl9jb25uZWN0b3ItPmVkaWQgPSBkcm1fZ2V0X2VkaWQoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsICZyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzLT5hZGFwdGVyKTsKLQkJcmFkZW9uX2kyY19kb19sb2NrKHJhZGVvbl9jb25uZWN0b3IsIDApOworCQlyYWRlb25faTJjX2RvX2xvY2socmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cywgMCk7CiAJfQogCiAJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmVkaWQpIHsKQEAgLTM2MSw5ICszNzksOSBAQAogCiAJaWYgKCFyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzKQogCQlyZXR1cm4gLTE7Ci0JcmFkZW9uX2kyY19kb19sb2NrKHJhZGVvbl9jb25uZWN0b3IsIDEpOworCXJhZGVvbl9pMmNfZG9fbG9jayhyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzLCAxKTsKIAllZGlkID0gZHJtX2dldF9lZGlkKGNvbm5lY3RvciwgJnJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMtPmFkYXB0ZXIpOwotCXJhZGVvbl9pMmNfZG9fbG9jayhyYWRlb25fY29ubmVjdG9yLCAwKTsKKwlyYWRlb25faTJjX2RvX2xvY2socmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cywgMCk7CiAJaWYgKGVkaWQpIHsKIAkJa2ZyZWUoZWRpZCk7CiAJfQpAQCAtNTQyLDYgKzU2MCw5OCBAQAogCSpwb3N0X2Rpdl9wID0gYmVzdF9wb3N0X2RpdjsKIH0KIAordm9pZCByYWRlb25fY29tcHV0ZV9wbGxfYXZpdm8oc3RydWN0IHJhZGVvbl9wbGwgKnBsbCwKKwkJCSAgICAgIHVpbnQ2NF90IGZyZXEsCisJCQkgICAgICB1aW50MzJfdCAqZG90X2Nsb2NrX3AsCisJCQkgICAgICB1aW50MzJfdCAqZmJfZGl2X3AsCisJCQkgICAgICB1aW50MzJfdCAqZnJhY19mYl9kaXZfcCwKKwkJCSAgICAgIHVpbnQzMl90ICpyZWZfZGl2X3AsCisJCQkgICAgICB1aW50MzJfdCAqcG9zdF9kaXZfcCwKKwkJCSAgICAgIGludCBmbGFncykKK3sKKwlmaXhlZDIwXzEyIG0sIG4sIGZyYWNfbiwgcCwgZl92Y28sIGZfcGNsaywgYmVzdF9mcmVxOworCWZpeGVkMjBfMTIgcGxsX291dF9tYXgsIHBsbF9vdXRfbWluOworCWZpeGVkMjBfMTIgcGxsX2luX21heCwgcGxsX2luX21pbjsKKwlmaXhlZDIwXzEyIHJlZmVyZW5jZV9mcmVxOworCWZpeGVkMjBfMTIgZXJyb3IsIGZmcmVxLCBhLCBiOworCisJcGxsX291dF9tYXguZnVsbCA9IHJmaXhlZF9jb25zdChwbGwtPnBsbF9vdXRfbWF4KTsKKwlwbGxfb3V0X21pbi5mdWxsID0gcmZpeGVkX2NvbnN0KHBsbC0+cGxsX291dF9taW4pOworCXBsbF9pbl9tYXguZnVsbCA9IHJmaXhlZF9jb25zdChwbGwtPnBsbF9pbl9tYXgpOworCXBsbF9pbl9taW4uZnVsbCA9IHJmaXhlZF9jb25zdChwbGwtPnBsbF9pbl9taW4pOworCXJlZmVyZW5jZV9mcmVxLmZ1bGwgPSByZml4ZWRfY29uc3QocGxsLT5yZWZlcmVuY2VfZnJlcSk7CisJZG9fZGl2KGZyZXEsIDEwKTsKKwlmZnJlcS5mdWxsID0gcmZpeGVkX2NvbnN0KGZyZXEpOworCWVycm9yLmZ1bGwgPSByZml4ZWRfY29uc3QoMTAwICogMTAwKTsKKworCS8qIG1heCBwICovCisJcC5mdWxsID0gcmZpeGVkX2RpdihwbGxfb3V0X21heCwgZmZyZXEpOworCXAuZnVsbCA9IHJmaXhlZF9mbG9vcihwKTsKKworCS8qIG1pbiBtICovCisJbS5mdWxsID0gcmZpeGVkX2RpdihyZWZlcmVuY2VfZnJlcSwgcGxsX2luX21heCk7CisJbS5mdWxsID0gcmZpeGVkX2NlaWwobSk7CisKKwl3aGlsZSAoMSkgeworCQluLmZ1bGwgPSByZml4ZWRfZGl2KGZmcmVxLCByZWZlcmVuY2VfZnJlcSk7CisJCW4uZnVsbCA9IHJmaXhlZF9tdWwobiwgbSk7CisJCW4uZnVsbCA9IHJmaXhlZF9tdWwobiwgcCk7CisKKwkJZl92Y28uZnVsbCA9IHJmaXhlZF9kaXYobiwgbSk7CisJCWZfdmNvLmZ1bGwgPSByZml4ZWRfbXVsKGZfdmNvLCByZWZlcmVuY2VfZnJlcSk7CisKKwkJZl9wY2xrLmZ1bGwgPSByZml4ZWRfZGl2KGZfdmNvLCBwKTsKKworCQlpZiAoZl9wY2xrLmZ1bGwgPiBmZnJlcS5mdWxsKQorCQkJZXJyb3IuZnVsbCA9IGZfcGNsay5mdWxsIC0gZmZyZXEuZnVsbDsKKwkJZWxzZQorCQkJZXJyb3IuZnVsbCA9IGZmcmVxLmZ1bGwgLSBmX3BjbGsuZnVsbDsKKwkJZXJyb3IuZnVsbCA9IHJmaXhlZF9kaXYoZXJyb3IsIGZfcGNsayk7CisJCWEuZnVsbCA9IHJmaXhlZF9jb25zdCgxMDAgKiAxMDApOworCQllcnJvci5mdWxsID0gcmZpeGVkX211bChlcnJvciwgYSk7CisKKwkJYS5mdWxsID0gcmZpeGVkX211bChtLCBwKTsKKwkJYS5mdWxsID0gcmZpeGVkX2RpdihuLCBhKTsKKwkJYmVzdF9mcmVxLmZ1bGwgPSByZml4ZWRfbXVsKHJlZmVyZW5jZV9mcmVxLCBhKTsKKworCQlpZiAocmZpeGVkX3RydW5jKGVycm9yKSA8IDI1KQorCQkJYnJlYWs7CisKKwkJYS5mdWxsID0gcmZpeGVkX2NvbnN0KDEpOworCQltLmZ1bGwgPSBtLmZ1bGwgKyBhLmZ1bGw7CisJCWEuZnVsbCA9IHJmaXhlZF9kaXYocmVmZXJlbmNlX2ZyZXEsIG0pOworCQlpZiAoYS5mdWxsID49IHBsbF9pbl9taW4uZnVsbCkKKwkJCWNvbnRpbnVlOworCisJCW0uZnVsbCA9IHJmaXhlZF9kaXYocmVmZXJlbmNlX2ZyZXEsIHBsbF9pbl9tYXgpOworCQltLmZ1bGwgPSByZml4ZWRfY2VpbChtKTsKKwkJYS5mdWxsPSByZml4ZWRfY29uc3QoMSk7CisJCXAuZnVsbCA9IHAuZnVsbCAtIGEuZnVsbDsKKwkJYS5mdWxsID0gcmZpeGVkX211bChwLCBmZnJlcSk7CisJCWlmIChhLmZ1bGwgPj0gcGxsX291dF9taW4uZnVsbCkKKwkJCWNvbnRpbnVlOworCQllbHNlIHsKKwkJCURSTV9FUlJPUigiVW5hYmxlIHRvIGZpbmQgcGxsIGRpdmlkZXJzXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJYS5mdWxsID0gcmZpeGVkX2NvbnN0KDEwKTsKKwliLmZ1bGwgPSByZml4ZWRfbXVsKG4sIGEpOworCisJZnJhY19uLmZ1bGwgPSByZml4ZWRfZmxvb3Iobik7CisJZnJhY19uLmZ1bGwgPSByZml4ZWRfbXVsKGZyYWNfbiwgYSk7CisJZnJhY19uLmZ1bGwgPSBiLmZ1bGwgLSBmcmFjX24uZnVsbDsKKworCSpkb3RfY2xvY2tfcCA9IHJmaXhlZF90cnVuYyhiZXN0X2ZyZXEpOworCSpmYl9kaXZfcCA9IHJmaXhlZF90cnVuYyhuKTsKKwkqZnJhY19mYl9kaXZfcCA9IHJmaXhlZF90cnVuYyhmcmFjX24pOworCSpyZWZfZGl2X3AgPSByZml4ZWRfdHJ1bmMobSk7CisJKnBvc3RfZGl2X3AgPSByZml4ZWRfdHJ1bmMocCk7CisKKwlEUk1fREVCVUcoIiV1ICVkLiVkLCAlZCwgJWRcbiIsICpkb3RfY2xvY2tfcCAqIDEwLCAqZmJfZGl2X3AsICpmcmFjX2ZiX2Rpdl9wLCAqcmVmX2Rpdl9wLCAqcG9zdF9kaXZfcCk7Cit9CisKIHN0YXRpYyB2b2lkIHJhZGVvbl91c2VyX2ZyYW1lYnVmZmVyX2Rlc3Ryb3koc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpCiB7CiAJc3RydWN0IHJhZGVvbl9mcmFtZWJ1ZmZlciAqcmFkZW9uX2ZiID0gdG9fcmFkZW9uX2ZyYW1lYnVmZmVyKGZiKTsKQEAgLTY0Miw3ICs3NTIsNyBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJcmRldi0+bW9kZV9pbmZvLmNvaGVyZW50X21vZGVfcHJvcGVydHktPnZhbHVlc1swXSA9IDA7Ci0JCXJkZXYtPm1vZGVfaW5mby5jb2hlcmVudF9tb2RlX3Byb3BlcnR5LT52YWx1ZXNbMF0gPSAxOworCQlyZGV2LT5tb2RlX2luZm8uY29oZXJlbnRfbW9kZV9wcm9wZXJ0eS0+dmFsdWVzWzFdID0gMTsKIAl9CiAKIAlpZiAoIUFTSUNfSVNfQVZJVk8ocmRldikpIHsKQEAgLTY2Niw3ICs3NzYsNyBAQAogCWlmICghcmRldi0+bW9kZV9pbmZvLmxvYWRfZGV0ZWN0X3Byb3BlcnR5KQogCQlyZXR1cm4gLUVOT01FTTsKIAlyZGV2LT5tb2RlX2luZm8ubG9hZF9kZXRlY3RfcHJvcGVydHktPnZhbHVlc1swXSA9IDA7Ci0JcmRldi0+bW9kZV9pbmZvLmxvYWRfZGV0ZWN0X3Byb3BlcnR5LT52YWx1ZXNbMF0gPSAxOworCXJkZXYtPm1vZGVfaW5mby5sb2FkX2RldGVjdF9wcm9wZXJ0eS0+dmFsdWVzWzFdID0gMTsKIAogCWRybV9tb2RlX2NyZWF0ZV9zY2FsaW5nX21vZGVfcHJvcGVydHkocmRldi0+ZGRldik7CiAKQEAgLTcyMyw2ICs4MzMsOCBAQAogCWlmICghcmV0KSB7CiAJCXJldHVybiByZXQ7CiAJfQorCS8qIGluaXRpYWxpemUgaHBkICovCisJcmFkZW9uX2hwZF9pbml0KHJkZXYpOwogCWRybV9oZWxwZXJfaW5pdGlhbF9jb25maWcocmRldi0+ZGRldik7CiAJcmV0dXJuIDA7CiB9CkBAIC03MzAsNiArODQyLDcgQEAKIHZvaWQgcmFkZW9uX21vZGVzZXRfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlpZiAocmRldi0+bW9kZV9pbmZvLm1vZGVfY29uZmlnX2luaXRpYWxpemVkKSB7CisJCXJhZGVvbl9ocGRfZmluaShyZGV2KTsKIAkJZHJtX21vZGVfY29uZmlnX2NsZWFudXAocmRldi0+ZGRldik7CiAJCXJkZXYtPm1vZGVfaW5mby5tb2RlX2NvbmZpZ19pbml0aWFsaXplZCA9IGZhbHNlOwogCX0KQEAgLTc1MCw5ICs4NjMsMTcgQEAKIAkJaWYgKGVuY29kZXItPmNydGMgIT0gY3J0YykKIAkJCWNvbnRpbnVlOwogCQlpZiAoZmlyc3QpIHsKLQkJCXJhZGVvbl9jcnRjLT5ybXhfdHlwZSA9IHJhZGVvbl9lbmNvZGVyLT5ybXhfdHlwZTsKKwkJCS8qIHNldCBzY2FsaW5nICovCisJCQlpZiAocmFkZW9uX2VuY29kZXItPnJteF90eXBlID09IFJNWF9PRkYpCisJCQkJcmFkZW9uX2NydGMtPnJteF90eXBlID0gUk1YX09GRjsKKwkJCWVsc2UgaWYgKG1vZGUtPmhkaXNwbGF5IDwgcmFkZW9uX2VuY29kZXItPm5hdGl2ZV9tb2RlLmhkaXNwbGF5IHx8CisJCQkJIG1vZGUtPnZkaXNwbGF5IDwgcmFkZW9uX2VuY29kZXItPm5hdGl2ZV9tb2RlLnZkaXNwbGF5KQorCQkJCXJhZGVvbl9jcnRjLT5ybXhfdHlwZSA9IHJhZGVvbl9lbmNvZGVyLT5ybXhfdHlwZTsKKwkJCWVsc2UKKwkJCQlyYWRlb25fY3J0Yy0+cm14X3R5cGUgPSBSTVhfT0ZGOworCQkJLyogY29weSBuYXRpdmUgbW9kZSAqLwogCQkJbWVtY3B5KCZyYWRlb25fY3J0Yy0+bmF0aXZlX21vZGUsCi0JCQkJJnJhZGVvbl9lbmNvZGVyLT5uYXRpdmVfbW9kZSwKKwkJCSAgICAgICAmcmFkZW9uX2VuY29kZXItPm5hdGl2ZV9tb2RlLAogCQkJCXNpemVvZihzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSkpOwogCQkJZmlyc3QgPSBmYWxzZTsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKaW5kZXggN2Y1MGZiOC4uYzVjNDVlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKQEAgLTg2LDYgKzg2LDcgQEAKIGludCByYWRlb25fdGVzdGluZyA9IDA7CiBpbnQgcmFkZW9uX2Nvbm5lY3Rvcl90YWJsZSA9IDA7CiBpbnQgcmFkZW9uX3R2ID0gMTsKK2ludCByYWRlb25fbmV3X3BsbCA9IDE7CiAKIE1PRFVMRV9QQVJNX0RFU0Mobm9fd2IsICJEaXNhYmxlIEFHUCB3cml0ZWJhY2sgZm9yIHNjcmF0Y2ggcmVnaXN0ZXJzIik7CiBtb2R1bGVfcGFyYW1fbmFtZWQobm9fd2IsIHJhZGVvbl9ub193YiwgaW50LCAwNDQ0KTsKQEAgLTEyMCw2ICsxMjEsOSBAQAogTU9EVUxFX1BBUk1fREVTQyh0diwgIlRWIGVuYWJsZSAoMCA9IGRpc2FibGUpIik7CiBtb2R1bGVfcGFyYW1fbmFtZWQodHYsIHJhZGVvbl90diwgaW50LCAwNDQ0KTsKIAorTU9EVUxFX1BBUk1fREVTQyhuZXdfcGxsLCAiU2VsZWN0IG5ldyBQTEwgY29kZSBmb3IgQVZJVk8gY2hpcHMiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChuZXdfcGxsLCByYWRlb25fbmV3X3BsbCwgaW50LCAwNDQ0KTsKKwogc3RhdGljIGludCByYWRlb25fc3VzcGVuZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmgKaW5kZXggMzUwOTYyZS4uZTEzNzg1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmgKQEAgLTExMDQsNyArMTEwNCw2IEBACiAjICAgICAgIGRlZmluZSBSNjAwX0lUX1dBSVRfUkVHX01FTSAgICAgICAgICAgICAweDAwMDAzQzAwCiAjICAgICAgIGRlZmluZSBSNjAwX0lUX01FTV9XUklURSAgICAgICAgICAgICAgICAweDAwMDAzRDAwCiAjICAgICAgIGRlZmluZSBSNjAwX0lUX0lORElSRUNUX0JVRkZFUiAgICAgICAgICAweDAwMDAzMjAwCi0jICAgICAgIGRlZmluZSBSNjAwX0lUX0NQX0lOVEVSUlVQVCAgICAgICAgICAgICAweDAwMDA0MDAwCiAjICAgICAgIGRlZmluZSBSNjAwX0lUX1NVUkZBQ0VfU1lOQyAgICAgICAgICAgICAweDAwMDA0MzAwCiAjICAgICAgICAgICAgICBkZWZpbmUgUjYwMF9DQjBfREVTVF9CQVNFX0VOQSAgICAoMSA8PCA2KQogIyAgICAgICAgICAgICAgZGVmaW5lIFI2MDBfVENfQUNUSU9OX0VOQSAgICAgICAgKDEgPDwgMjMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9lbmNvZGVycy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZW5jb2RlcnMuYwppbmRleCBkNDJiYzUxLi5iNGYyM2VjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9lbmNvZGVycy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2VuY29kZXJzLmMKQEAgLTM1LDYgKzM1LDUxIEBACiBib29sIHJhZGVvbl9hdG9tX2dldF90dl90aW1pbmdzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgaW5kZXgsCiAJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOwogCitzdGF0aWMgdWludDMyX3QgcmFkZW9uX2VuY29kZXJfY2xvbmVzKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9lbmNvZGVyICpjbG9uZV9lbmNvZGVyOworCXVpbnQzMl90IGluZGV4X21hc2sgPSAwOworCWludCBjb3VudDsKKworCS8qIERJRyByb3V0aW5nIGdldHMgcHJvYmxlbWF0aWMgKi8KKwlpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUjYwMCkKKwkJcmV0dXJuIGluZGV4X21hc2s7CisJLyogTFZEUy9UViBhcmUgdG9vIHdhY2t5ICovCisJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpCisJCXJldHVybiBpbmRleF9tYXNrOworCS8qIERWTyByZXF1aXJlcyAyeCBwcGxsIGNsb2NrcyBkZXBlbmRpbmcgb24gdG1kcyBjaGlwICovCisJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfREZQMl9TVVBQT1JUKQorCQlyZXR1cm4gaW5kZXhfbWFzazsKKwkKKwljb3VudCA9IC0xOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xvbmVfZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CisJCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2Nsb25lID0gdG9fcmFkZW9uX2VuY29kZXIoY2xvbmVfZW5jb2Rlcik7CisJCWNvdW50Kys7CisKKwkJaWYgKGNsb25lX2VuY29kZXIgPT0gZW5jb2RlcikKKwkJCWNvbnRpbnVlOworCQlpZiAocmFkZW9uX2Nsb25lLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkKKwkJCWNvbnRpbnVlOworCQlpZiAocmFkZW9uX2Nsb25lLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfREZQMl9TVVBQT1JUKQorCQkJY29udGludWU7CisJCWVsc2UKKwkJCWluZGV4X21hc2sgfD0gKDEgPDwgY291bnQpOworCX0KKwlyZXR1cm4gaW5kZXhfbWFzazsKK30KKwordm9pZCByYWRlb25fc2V0dXBfZW5jb2Rlcl9jbG9uZXMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgeworCQllbmNvZGVyLT5wb3NzaWJsZV9jbG9uZXMgPSByYWRlb25fZW5jb2Rlcl9jbG9uZXMoZW5jb2Rlcik7CisJfQorfQorCiB1aW50MzJfdAogcmFkZW9uX2dldF9lbmNvZGVyX2lkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHN1cHBvcnRlZF9kZXZpY2UsIHVpbnQ4X3QgZGFjKQogewpAQCAtMTYzLDI5ICsyMDgsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi0vKiB1c2VkIGZvciBib3RoIGF0b20gYW5kIGxlZ2FjeSAqLwotdm9pZCByYWRlb25fcm14X21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAotCQkJICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCi0JCQkgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKLXsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm5hdGl2ZV9tb2RlID0gJnJhZGVvbl9lbmNvZGVyLT5uYXRpdmVfbW9kZTsKLQotCWlmIChtb2RlLT5oZGlzcGxheSA8IG5hdGl2ZV9tb2RlLT5oZGlzcGxheSB8fAotCSAgICBtb2RlLT52ZGlzcGxheSA8IG5hdGl2ZV9tb2RlLT52ZGlzcGxheSkgewotCQlpbnQgbW9kZV9pZCA9IGFkanVzdGVkX21vZGUtPmJhc2UuaWQ7Ci0JCSphZGp1c3RlZF9tb2RlID0gKm5hdGl2ZV9tb2RlOwotCQlpZiAoIUFTSUNfSVNfQVZJVk8ocmRldikpIHsKLQkJCWFkanVzdGVkX21vZGUtPmhkaXNwbGF5ID0gbW9kZS0+aGRpc3BsYXk7Ci0JCQlhZGp1c3RlZF9tb2RlLT52ZGlzcGxheSA9IG1vZGUtPnZkaXNwbGF5OwotCQl9Ci0JCWFkanVzdGVkX21vZGUtPmJhc2UuaWQgPSBtb2RlX2lkOwotCX0KLX0KLQotCiBzdGF0aWMgYm9vbCByYWRlb25fYXRvbV9tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKIAkJCQkgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKIAkJCQkgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKQEAgLTE5OCwxNCArMjIwLDI0IEBACiAJcmFkZW9uX2VuY29kZXJfc2V0X2FjdGl2ZV9kZXZpY2UoZW5jb2Rlcik7CiAJZHJtX21vZGVfc2V0X2NydGNpbmZvKGFkanVzdGVkX21vZGUsIDApOwogCi0JaWYgKHJhZGVvbl9lbmNvZGVyLT5ybXhfdHlwZSAhPSBSTVhfT0ZGKQotCQlyYWRlb25fcm14X21vZGVfZml4dXAoZW5jb2RlciwgbW9kZSwgYWRqdXN0ZWRfbW9kZSk7Ci0KIAkvKiBodyBidWcgKi8KIAlpZiAoKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpCiAJICAgICYmIChtb2RlLT5jcnRjX3ZzeW5jX3N0YXJ0IDwgKG1vZGUtPmNydGNfdmRpc3BsYXkgKyAyKSkpCiAJCWFkanVzdGVkX21vZGUtPmNydGNfdnN5bmNfc3RhcnQgPSBhZGp1c3RlZF9tb2RlLT5jcnRjX3ZkaXNwbGF5ICsgMjsKIAorCS8qIGdldCB0aGUgbmF0aXZlIG1vZGUgZm9yIExWRFMgKi8KKwlpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKSB7CisJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpuYXRpdmVfbW9kZSA9ICZyYWRlb25fZW5jb2Rlci0+bmF0aXZlX21vZGU7CisJCWludCBtb2RlX2lkID0gYWRqdXN0ZWRfbW9kZS0+YmFzZS5pZDsKKwkJKmFkanVzdGVkX21vZGUgPSAqbmF0aXZlX21vZGU7CisJCWlmICghQVNJQ19JU19BVklWTyhyZGV2KSkgeworCQkJYWRqdXN0ZWRfbW9kZS0+aGRpc3BsYXkgPSBtb2RlLT5oZGlzcGxheTsKKwkJCWFkanVzdGVkX21vZGUtPnZkaXNwbGF5ID0gbW9kZS0+dmRpc3BsYXk7CisJCX0KKwkJYWRqdXN0ZWRfbW9kZS0+YmFzZS5pZCA9IG1vZGVfaWQ7CisJfQorCisJLyogZ2V0IHRoZSBuYXRpdmUgbW9kZSBmb3IgVFYgKi8KIAlpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCkpIHsKIAkJc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGFjICp0dl9kYWMgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7CiAJCWlmICh0dl9kYWMpIHsKQEAgLTIxOCw2ICsyNTAsMTIgQEAKIAkJfQogCX0KIAorCWlmIChBU0lDX0lTX0RDRTMocmRldikgJiYKKwkgICAgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0RGUF9TVVBQT1JUKSkpIHsKKwkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOworCQlyYWRlb25fZHBfc2V0X2xpbmtfY29uZmlnKGNvbm5lY3RvciwgbW9kZSk7CisJfQorCiAJcmV0dXJuIHRydWU7CiB9CiAKQEAgLTM5Miw3ICs0MzAsNyBAQAogCUxWRFNfRU5DT0RFUl9DT05UUk9MX1BTX0FMTE9DQVRJT05fVjIgdjI7CiB9OwogCi1zdGF0aWMgdm9pZAordm9pZAogYXRvbWJpb3NfZGlnaXRhbF9zZXR1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBhY3Rpb24pCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKQEAgLTUyMiw2ICs1NjAsNyBAQAogewogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CiAJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3I7CisJc3RydWN0IHJhZGVvbl9jb25uZWN0b3JfYXRvbV9kaWcgKnJhZGVvbl9kaWdfY29ubmVjdG9yOwogCiAJY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoZW5jb2Rlcik7CiAJaWYgKCFjb25uZWN0b3IpCkBAIC01NTEsMTAgKzU5MCwxMCBAQAogCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfTFZEUzsKIAkJYnJlYWs7CiAJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRGlzcGxheVBvcnQ6Ci0JCS8qaWYgKHJhZGVvbl9vdXRwdXQtPk1vblR5cGUgPT0gTVRfRFApCi0JCSAgcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0RQOwotCQkgIGVsc2UqLwotCQlpZiAoZHJtX2RldGVjdF9oZG1pX21vbml0b3IocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkpCisJCXJhZGVvbl9kaWdfY29ubmVjdG9yID0gcmFkZW9uX2Nvbm5lY3Rvci0+Y29uX3ByaXY7CisJCWlmIChyYWRlb25fZGlnX2Nvbm5lY3Rvci0+ZHBfc2lua190eXBlID09IENPTk5FQ1RPUl9PQkpFQ1RfSURfRElTUExBWVBPUlQpCisJCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFA7CisJCWVsc2UgaWYgKGRybV9kZXRlY3RfaGRtaV9tb25pdG9yKHJhZGVvbl9jb25uZWN0b3ItPmVkaWQpKQogCQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0hETUk7CiAJCWVsc2UKIAkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EVkk7CkBAIC01NzMsNiArNjEyLDMwIEBACiAJfQogfQogCisvKgorICogRElHIEVuY29kZXIvVHJhbnNtaXR0ZXIgU2V0dXAKKyAqCisgKiBEQ0UgMy4wLzMuMQorICogLSAyIERJRyB0cmFuc21pdHRlciBibG9ja3MuIFVOSVBIWSAobGlua3MgQSBhbmQgQikgYW5kIExWVE1BLgorICogU3VwcG9ydHMgdXAgdG8gMyBkaWdpdGFsIG91dHB1dHMKKyAqIC0gMiBESUcgZW5jb2RlciBibG9ja3MuCisgKiBESUcxIGNhbiBkcml2ZSBVTklQSFkgbGluayBBIG9yIGxpbmsgQgorICogRElHMiBjYW4gZHJpdmUgVU5JUEhZIGxpbmsgQiBvciBMVlRNQQorICoKKyAqIERDRSAzLjIKKyAqIC0gMyBESUcgdHJhbnNtaXR0ZXIgYmxvY2tzLiBVTklQSFkwLzEvMiAobGlua3MgQSBhbmQgQikuCisgKiBTdXBwb3J0cyB1cCB0byA1IGRpZ2l0YWwgb3V0cHV0cworICogLSAyIERJRyBlbmNvZGVyIGJsb2Nrcy4KKyAqIERJRzEvMiBjYW4gZHJpdmUgVU5JUEhZMC8xLzIgbGluayBBIG9yIGxpbmsgQgorICoKKyAqIFJvdXRpbmcKKyAqIGNydGMgLT4gZGlnIGVuY29kZXIgLT4gVU5JUEhZL0xWVE1BICgxIG9yIDIgbGlua3MpCisgKiBFeGFtcGxlczoKKyAqIGNydGMwIC0+IGRpZzIgLT4gTFZUTUEgICBsaW5rcyBBK0IgLT4gVE1EUy9IRE1JCisgKiBjcnRjMSAtPiBkaWcxIC0+IFVOSVBIWTAgbGluayAgQiAgIC0+IERQCisgKiBjcnRjMCAtPiBkaWcxIC0+IFVOSVBIWTIgbGluayAgQSAgIC0+IExWRFMKKyAqIGNydGMxIC0+IGRpZzIgLT4gVU5JUEhZMSBsaW5rICBCK0EgLT4gVE1EUy9IRE1JCisgKi8KIHN0YXRpYyB2b2lkCiBhdG9tYmlvc19kaWdfZW5jb2Rlcl9zZXR1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBhY3Rpb24pCiB7CkBAIC02MTQsMTAgKzY3NywxNyBAQAogCX0gZWxzZSB7CiAJCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKIAkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6Ci0JCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERJRzFFbmNvZGVyQ29udHJvbCk7CisJCQkvKiBYWFggZG9lc24ndCByZWFsbHkgbWF0dGVyIHdoaWNoIGRpZyBlbmNvZGVyIHdlIHBpY2sgYXMgbG9uZyBhcyBpdCdzCisJCQkgKiBub3QgYWxyZWFkeSBpbiB1c2UKKwkJCSAqLworCQkJaWYgKGRpZ19jb25uZWN0b3ItPmxpbmtiKQorCQkJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgRElHMkVuY29kZXJDb250cm9sKTsKKwkJCWVsc2UKKwkJCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERJRzFFbmNvZGVyQ29udHJvbCk7CiAJCQludW0gPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0xWVE1BOgorCQkJLyogT25seSBkaWcyIGVuY29kZXIgY2FuIGRyaXZlIExWVE1BICovCiAJCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERJRzJFbmNvZGVyQ29udHJvbCk7CiAJCQludW0gPSAyOwogCQkJYnJlYWs7CkBAIC02NTIsMTkgKzcyMiwyMiBAQAogCQl9CiAJfQogCi0JaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkgewotCQlhcmdzLnVjQ29uZmlnIHw9IEFUT01fRU5DT0RFUl9DT05GSUdfTElOS0FfQjsKLQkJYXJncy51Y0xhbmVOdW0gPSA4OwotCX0gZWxzZSB7Ci0JCWlmIChkaWdfY29ubmVjdG9yLT5saW5rYikKLQkJCWFyZ3MudWNDb25maWcgfD0gQVRPTV9FTkNPREVSX0NPTkZJR19MSU5LQjsKLQkJZWxzZQotCQkJYXJncy51Y0NvbmZpZyB8PSBBVE9NX0VOQ09ERVJfQ09ORklHX0xJTktBOwotCQlhcmdzLnVjTGFuZU51bSA9IDQ7Ci0JfQotCiAJYXJncy51Y0VuY29kZXJNb2RlID0gYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKTsKIAorCWlmIChhcmdzLnVjRW5jb2Rlck1vZGUgPT0gQVRPTV9FTkNPREVSX01PREVfRFApIHsKKwkJaWYgKGRpZ19jb25uZWN0b3ItPmRwX2Nsb2NrID09IDI3MDAwMCkKKwkJCWFyZ3MudWNDb25maWcgfD0gQVRPTV9FTkNPREVSX0NPTkZJR19EUExJTktSQVRFXzJfNzBHSFo7CisJCWFyZ3MudWNMYW5lTnVtID0gZGlnX2Nvbm5lY3Rvci0+ZHBfbGFuZV9jb3VudDsKKwl9IGVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKKwkJYXJncy51Y0xhbmVOdW0gPSA4OworCWVsc2UKKwkJYXJncy51Y0xhbmVOdW0gPSA0OworCisJaWYgKGRpZ19jb25uZWN0b3ItPmxpbmtiKQorCQlhcmdzLnVjQ29uZmlnIHw9IEFUT01fRU5DT0RFUl9DT05GSUdfTElOS0I7CisJZWxzZQorCQlhcmdzLnVjQ29uZmlnIHw9IEFUT01fRU5DT0RFUl9DT05GSUdfTElOS0E7CisKIAlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKIAogfQpAQCAtNjc0LDggKzc0Nyw4IEBACiAJRElHX1RSQU5TTUlUVEVSX0NPTlRST0xfUEFSQU1FVEVSU19WMiB2MjsKIH07CiAKLXN0YXRpYyB2b2lkCi1hdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgYWN0aW9uKQordm9pZAorYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IGFjdGlvbiwgdWludDhfdCBsYW5lX251bSwgdWludDhfdCBsYW5lX3NldCkKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTY4Nyw2ICs3NjAsNyBAQAogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CiAJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3I7CiAJc3RydWN0IHJhZGVvbl9jb25uZWN0b3JfYXRvbV9kaWcgKmRpZ19jb25uZWN0b3I7CisJYm9vbCBpc19kcCA9IGZhbHNlOwogCiAJY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoZW5jb2Rlcik7CiAJaWYgKCFjb25uZWN0b3IpCkBAIC03MDQsNiArNzc4LDkgQEAKIAogCWRpZ19jb25uZWN0b3IgPSByYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdjsKIAorCWlmIChhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpID09IEFUT01fRU5DT0RFUl9NT0RFX0RQKQorCQlpc19kcCA9IHRydWU7CisKIAltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CiAKIAlpZiAoQVNJQ19JU19EQ0UzMihyZGV2KSkKQEAgLTcyNCwxNyArODAxLDIzIEBACiAJYXJncy52MS51Y0FjdGlvbiA9IGFjdGlvbjsKIAlpZiAoYWN0aW9uID09IEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0lOSVQpIHsKIAkJYXJncy52MS51c0luaXRJbmZvID0gcmFkZW9uX2Nvbm5lY3Rvci0+Y29ubmVjdG9yX29iamVjdF9pZDsKKwl9IGVsc2UgaWYgKGFjdGlvbiA9PSBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9TRVRVUF9WU0VNUEgpIHsKKwkJYXJncy52MS5hc01vZGUudWNMYW5lU2VsID0gbGFuZV9udW07CisJCWFyZ3MudjEuYXNNb2RlLnVjTGFuZVNldCA9IGxhbmVfc2V0OwogCX0gZWxzZSB7Ci0JCWlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJCWlmIChpc19kcCkKKwkJCWFyZ3MudjEudXNQaXhlbENsb2NrID0KKwkJCQljcHVfdG9fbGUxNihkaWdfY29ubmVjdG9yLT5kcF9jbG9jayAvIDEwKTsKKwkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQogCQkJYXJncy52MS51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNigocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMikgLyAxMCk7CiAJCWVsc2UKIAkJCWFyZ3MudjEudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOwogCX0KIAlpZiAoQVNJQ19JU19EQ0UzMihyZGV2KSkgewotCQlpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQotCQkJYXJncy52Mi51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNigocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMikgLyAxMCk7CiAJCWlmIChkaWctPmRpZ19ibG9jaykKIAkJCWFyZ3MudjIuYWNDb25maWcudWNFbmNvZGVyU2VsID0gMTsKKwkJaWYgKGRpZ19jb25uZWN0b3ItPmxpbmtiKQorCQkJYXJncy52Mi5hY0NvbmZpZy51Y0xpbmtTZWwgPSAxOwogCiAJCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKIAkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6CkBAIC03NTEsNyArODM0LDkgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0RGUF9TVVBQT1JUKSkgeworCQlpZiAoaXNfZHApCisJCQlhcmdzLnYyLmFjQ29uZmlnLmZDb2hlcmVudE1vZGUgPSAxOworCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCkpIHsKIAkJCWlmIChkaWctPmNvaGVyZW50X21vZGUpCiAJCQkJYXJncy52Mi5hY0NvbmZpZy5mQ29oZXJlbnRNb2RlID0gMTsKIAkJfQpAQCAtNzYwLDE3ICs4NDUsMjAgQEAKIAogCQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7CiAJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgotCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19ESUcxX0VOQ09ERVI7CisJCQkvKiBYWFggZG9lc24ndCByZWFsbHkgbWF0dGVyIHdoaWNoIGRpZyBlbmNvZGVyIHdlIHBpY2sgYXMgbG9uZyBhcyBpdCdzCisJCQkgKiBub3QgYWxyZWFkeSBpbiB1c2UKKwkJCSAqLworCQkJaWYgKGRpZ19jb25uZWN0b3ItPmxpbmtiKQorCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfRElHMl9FTkNPREVSOworCQkJZWxzZQorCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfRElHMV9FTkNPREVSOwogCQkJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkgewogCQkJCWlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApIHsKLQkJCQkJYXJncy52MS51Y0NvbmZpZyB8PSAoQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfOExBTkVfTElOSyB8Ci0JCQkJCQkJICAgICBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MSU5LQV9CKTsKIAkJCQkJaWYgKGRpZ19jb25uZWN0b3ItPmlncF9sYW5lX2luZm8gJiAweDMpCiAJCQkJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0xBTkVfMF83OwogCQkJCQllbHNlIGlmIChkaWdfY29ubmVjdG9yLT5pZ3BfbGFuZV9pbmZvICYgMHhjKQogCQkJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MQU5FXzhfMTU7CiAJCQkJfSBlbHNlIHsKLQkJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MSU5LQTsKIAkJCQkJaWYgKGRpZ19jb25uZWN0b3ItPmlncF9sYW5lX2luZm8gJiAweDEpCiAJCQkJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0xBTkVfMF8zOwogCQkJCQllbHNlIGlmIChkaWdfY29ubmVjdG9yLT5pZ3BfbGFuZV9pbmZvICYgMHgyKQpAQCAtNzgwLDM1ICs4NjgsMjUgQEAKIAkJCQkJZWxzZSBpZiAoZGlnX2Nvbm5lY3Rvci0+aWdwX2xhbmVfaW5mbyAmIDB4OCkKIAkJCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfTEFORV8xMl8xNTsKIAkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCi0JCQkJCWFyZ3MudjEudWNDb25maWcgfD0gKEFUT01fVFJBTlNNSVRURVJfQ09ORklHXzhMQU5FX0xJTksgfAotCQkJCQkJCSAgICAgQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfTElOS0FfQiB8Ci0JCQkJCQkJICAgICBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MQU5FXzBfNyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChkaWdfY29ubmVjdG9yLT5saW5rYikKLQkJCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfTElOS0IgfCBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MQU5FXzBfMzsKLQkJCQkJZWxzZQotCQkJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MSU5LQSB8IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0xBTkVfMF8zOwotCQkJCX0KIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9MVlRNQToKKwkJCS8qIE9ubHkgZGlnMiBlbmNvZGVyIGNhbiBkcml2ZSBMVlRNQSAqLwogCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19ESUcyX0VOQ09ERVI7Ci0JCQlpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQotCQkJCWFyZ3MudjEudWNDb25maWcgfD0gKEFUT01fVFJBTlNNSVRURVJfQ09ORklHXzhMQU5FX0xJTksgfAotCQkJCQkJICAgICBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MSU5LQV9CIHwKLQkJCQkJCSAgICAgQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfTEFORV8wXzcpOwotCQkJZWxzZSB7Ci0JCQkJaWYgKGRpZ19jb25uZWN0b3ItPmxpbmtiKQotCQkJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0xJTktCIHwgQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfTEFORV8wXzM7Ci0JCQkJZWxzZQotCQkJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0xJTktBIHwgQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfTEFORV8wXzM7Ci0JCQl9CiAJCQlicmVhazsKIAkJfQogCi0JCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCkpIHsKKwkJaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKKwkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfOExBTkVfTElOSzsKKworCQlpZiAoZGlnX2Nvbm5lY3Rvci0+bGlua2IpCisJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0xJTktCOworCQllbHNlCisJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0xJTktBOworCisJCWlmIChpc19kcCkKKwkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfQ09IRVJFTlQ7CisJCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0RGUF9TVVBQT1JUKSkgewogCQkJaWYgKGRpZy0+Y29oZXJlbnRfbW9kZSkKIAkJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0NPSEVSRU5UOwogCQl9CkBAIC05MTgsMTIgKzk5NiwxNiBAQAogCWlmIChpc19kaWcpIHsKIAkJc3dpdGNoIChtb2RlKSB7CiAJCWNhc2UgRFJNX01PREVfRFBNU19PTjoKLQkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9FTkFCTEUpOworCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0VOQUJMRV9PVVRQVVQsIDAsIDApOworCQkJeworCQkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihlbmNvZGVyKTsKKwkJCQlkcF9saW5rX3RyYWluKGVuY29kZXIsIGNvbm5lY3Rvcik7CisJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlk6CiAJCWNhc2UgRFJNX01PREVfRFBNU19TVVNQRU5EOgogCQljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgotCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0RJU0FCTEUpOworCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0RJU0FCTEVfT1VUUFVULCAwLCAwKTsKIAkJCWJyZWFrOwogCQl9CiAJfSBlbHNlIHsKQEAgLTEwMjUsMTMgKzExMDcsMzMgQEAKIAkJCQkJCWFyZ3MudjIudWNFbmNvZGVySUQgPSBBU0lDX0lOVF9ESUcyX0VOQ09ERVJfSUQ7CiAJCQkJCWVsc2UKIAkJCQkJCWFyZ3MudjIudWNFbmNvZGVySUQgPSBBU0lDX0lOVF9ESUcxX0VOQ09ERVJfSUQ7Ci0JCQkJfSBlbHNlCi0JCQkJCWFyZ3MudjIudWNFbmNvZGVySUQgPSBBU0lDX0lOVF9ESUcxX0VOQ09ERVJfSUQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwkJCQkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3I7CisJCQkJCXN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnICpkaWdfY29ubmVjdG9yOworCisJCQkJCWNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOworCQkJCQlpZiAoIWNvbm5lY3RvcikKKwkJCQkJCXJldHVybjsKKwkJCQkJcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwkJCQkJaWYgKCFyYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdikKKwkJCQkJCXJldHVybjsKKwkJCQkJZGlnX2Nvbm5lY3RvciA9IHJhZGVvbl9jb25uZWN0b3ItPmNvbl9wcml2OworCisJCQkJCS8qIFhYWCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgd2hpY2ggZGlnIGVuY29kZXIgd2UgcGljayBhcyBsb25nIGFzIGl0J3MKKwkJCQkJICogbm90IGFscmVhZHkgaW4gdXNlCisJCQkJCSAqLworCQkJCQlpZiAoZGlnX2Nvbm5lY3Rvci0+bGlua2IpCisJCQkJCQlhcmdzLnYyLnVjRW5jb2RlcklEID0gQVNJQ19JTlRfRElHMl9FTkNPREVSX0lEOworCQkJCQllbHNlCisJCQkJCQlhcmdzLnYyLnVjRW5jb2RlcklEID0gQVNJQ19JTlRfRElHMV9FTkNPREVSX0lEOworCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RWTzE6CiAJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX0RWT19FTkNPREVSX0lEOwogCQkJCWJyZWFrOwogCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfTFZUTUE6CisJCQkJLyogT25seSBkaWcyIGVuY29kZXIgY2FuIGRyaXZlIExWVE1BICovCiAJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX0RJRzJfRU5DT0RFUl9JRDsKIAkJCQlicmVhazsKIAkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzE6CkBAIC0xMTA0LDExICsxMjA2LDE0IEBACiAJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwogCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSB0b19yYWRlb25fY3J0YyhlbmNvZGVyLT5jcnRjKTsKIAotCWlmIChyYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXYpIHsKLQkJc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICpkaWc7CisJaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYKKwkgICAgKEFUT01fREVWSUNFX0RGUF9TVVBQT1JUIHwgQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKSB7CisJCWlmIChyYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXYpIHsKKwkJCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RpZyAqZGlnOwogCi0JCWRpZyA9IHJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdjsKLQkJZGlnLT5kaWdfYmxvY2sgPSByYWRlb25fY3J0Yy0+Y3J0Y19pZDsKKwkJCWRpZyA9IHJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdjsKKwkJCWRpZy0+ZGlnX2Jsb2NrID0gcmFkZW9uX2NydGMtPmNydGNfaWQ7CisJCX0KIAl9CiAJcmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID0gYWRqdXN0ZWRfbW9kZS0+Y2xvY2s7CiAKQEAgLTExMzQsMTQgKzEyMzksMTQgQEAKIAljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6CiAJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfTFZUTUE6CiAJCS8qIGRpc2FibGUgdGhlIGVuY29kZXIgYW5kIHRyYW5zbWl0dGVyICovCi0JCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9ESVNBQkxFKTsKKwkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0RJU0FCTEUsIDAsIDApOwogCQlhdG9tYmlvc19kaWdfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBBVE9NX0RJU0FCTEUpOwogCiAJCS8qIHNldHVwIGFuZCBlbmFibGUgdGhlIGVuY29kZXIgYW5kIHRyYW5zbWl0dGVyICovCiAJCWF0b21iaW9zX2RpZ19lbmNvZGVyX3NldHVwKGVuY29kZXIsIEFUT01fRU5BQkxFKTsKLQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0lOSVQpOwotCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fU0VUVVApOwotCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fRU5BQkxFKTsKKwkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0lOSVQsIDAsIDApOworCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fU0VUVVAsIDAsIDApOworCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fRU5BQkxFLCAwLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EREk6CiAJCWF0b21iaW9zX2RkaWFfc2V0dXAoZW5jb2RlciwgQVRPTV9FTkFCTEUpOwpAQCAtMTM1NCw3ICsxNDU5LDYgQEAKIAkJZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgPSAweDE7CiAJZWxzZQogCQllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IDB4MzsKLQllbmNvZGVyLT5wb3NzaWJsZV9jbG9uZXMgPSAwOwogCiAJcmFkZW9uX2VuY29kZXItPmVuY19wcml2ID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmIuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZiLmMKaW5kZXggZDEwZWI0My4uM2JhMjEzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mYi5jCkBAIC0xNDAsNyArMTQwLDcgQEAKIAlzdHJ1Y3QgcmFkZW9uX2ZyYW1lYnVmZmVyICpyZmI7CiAJc3RydWN0IGRybV9tb2RlX2ZiX2NtZCBtb2RlX2NtZDsKIAlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdvYmogPSBOVUxMOwotCXN0cnVjdCByYWRlb25fb2JqZWN0ICpyb2JqID0gTlVMTDsKKwlzdHJ1Y3QgcmFkZW9uX2JvICpyYm8gPSBOVUxMOwogCXN0cnVjdCBkZXZpY2UgKmRldmljZSA9ICZyZGV2LT5wZGV2LT5kZXY7CiAJaW50IHNpemUsIGFsaWduZWRfc2l6ZSwgcmV0OwogCXU2NCBmYl9ncHVhZGRyOwpAQCAtMTY4LDE0ICsxNjgsMTQgQEAKIAlyZXQgPSByYWRlb25fZ2VtX29iamVjdF9jcmVhdGUocmRldiwgYWxpZ25lZF9zaXplLCAwLAogCQkJUkFERU9OX0dFTV9ET01BSU5fVlJBTSwKIAkJCWZhbHNlLCB0dG1fYm9fdHlwZV9rZXJuZWwsCi0JCQlmYWxzZSwgJmdvYmopOworCQkJJmdvYmopOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gYWxsb2NhdGUgZnJhbWVidWZmZXIgKCVkICVkKVxuIiwKIAkJICAgICAgIHN1cmZhY2Vfd2lkdGgsIHN1cmZhY2VfaGVpZ2h0KTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQotCXJvYmogPSBnb2JqLT5kcml2ZXJfcHJpdmF0ZTsKKwlyYm8gPSBnb2JqLT5kcml2ZXJfcHJpdmF0ZTsKIAogCWlmIChmYl90aWxlZCkKIAkJdGlsaW5nX2ZsYWdzID0gUkFERU9OX1RJTElOR19NQUNSTzsKQEAgLTE5Miw4ICsxOTIsMTMgQEAKIAl9CiAjZW5kaWYKIAotCWlmICh0aWxpbmdfZmxhZ3MpCi0JCXJhZGVvbl9vYmplY3Rfc2V0X3RpbGluZ19mbGFncyhyb2JqLCB0aWxpbmdfZmxhZ3MgfCBSQURFT05fVElMSU5HX1NVUkZBQ0UsIG1vZGVfY21kLnBpdGNoKTsKKwlpZiAodGlsaW5nX2ZsYWdzKSB7CisJCXJldCA9IHJhZGVvbl9ib19zZXRfdGlsaW5nX2ZsYWdzKHJibywKKwkJCQkJdGlsaW5nX2ZsYWdzIHwgUkFERU9OX1RJTElOR19TVVJGQUNFLAorCQkJCQltb2RlX2NtZC5waXRjaCk7CisJCWlmIChyZXQpCisJCQlkZXZfZXJyKHJkZXYtPmRldiwgIkZCIGZhaWxlZCB0byBzZXQgdGlsaW5nIGZsYWdzXG4iKTsKKwl9CiAJbXV0ZXhfbG9jaygmcmRldi0+ZGRldi0+c3RydWN0X211dGV4KTsKIAlmYiA9IHJhZGVvbl9mcmFtZWJ1ZmZlcl9jcmVhdGUocmRldi0+ZGRldiwgJm1vZGVfY21kLCBnb2JqKTsKIAlpZiAoZmIgPT0gTlVMTCkgewpAQCAtMjAxLDEwICsyMDYsMTkgQEAKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXRfdW5yZWY7CiAJfQotCXJldCA9IHJhZGVvbl9vYmplY3RfcGluKHJvYmosIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sICZmYl9ncHVhZGRyKTsKKwlyZXQgPSByYWRlb25fYm9fcmVzZXJ2ZShyYm8sIGZhbHNlKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlnb3RvIG91dF91bnJlZjsKKwlyZXQgPSByYWRlb25fYm9fcGluKHJibywgUkFERU9OX0dFTV9ET01BSU5fVlJBTSwgJmZiX2dwdWFkZHIpOwogCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gcGluIGZyYW1lYnVmZmVyXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKKwkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyYm8pOworCQlnb3RvIG91dF91bnJlZjsKKwl9CisJaWYgKGZiX3RpbGVkKQorCQlyYWRlb25fYm9fY2hlY2tfdGlsaW5nKHJibywgMCwgMCk7CisJcmV0ID0gcmFkZW9uX2JvX2ttYXAocmJvLCAmZmJwdHIpOworCXJhZGVvbl9ib191bnJlc2VydmUocmJvKTsKKwlpZiAocmV0KSB7CiAJCWdvdG8gb3V0X3VucmVmOwogCX0KIApAQCAtMjEzLDcgKzIyNyw3IEBACiAJKmZiX3AgPSBmYjsKIAlyZmIgPSB0b19yYWRlb25fZnJhbWVidWZmZXIoZmIpOwogCXJkZXYtPmZiZGV2X3JmYiA9IHJmYjsKLQlyZGV2LT5mYmRldl9yb2JqID0gcm9iajsKKwlyZGV2LT5mYmRldl9yYm8gPSByYm87CiAKIAlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCByYWRlb25fZmJfZGV2aWNlKSwgZGV2aWNlKTsKIAlpZiAoaW5mbyA9PSBOVUxMKSB7CkBAIC0yMzQsMTUgKzI0OCw3IEBACiAJaWYgKHJldCkKIAkJZ290byBvdXRfdW5yZWY7CiAKLQlpZiAoZmJfdGlsZWQpCi0JCXJhZGVvbl9vYmplY3RfY2hlY2tfdGlsaW5nKHJvYmosIDAsIDApOwotCi0JcmV0ID0gcmFkZW9uX29iamVjdF9rbWFwKHJvYmosICZmYnB0cik7Ci0JaWYgKHJldCkgewotCQlnb3RvIG91dF91bnJlZjsKLQl9Ci0KLQltZW1zZXRfaW8oZmJwdHIsIDAsIGFsaWduZWRfc2l6ZSk7CisJbWVtc2V0X2lvKGZicHRyLCAweGZmLCBhbGlnbmVkX3NpemUpOwogCiAJc3RyY3B5KGluZm8tPmZpeC5pZCwgInJhZGVvbmRybWZiIik7CiAKQEAgLTI4OCw4ICsyOTQsMTIgQEAKIAlyZXR1cm4gMDsKIAogb3V0X3VucmVmOgotCWlmIChyb2JqKSB7Ci0JCXJhZGVvbl9vYmplY3Rfa3VubWFwKHJvYmopOworCWlmIChyYm8pIHsKKwkJcmV0ID0gcmFkZW9uX2JvX3Jlc2VydmUocmJvLCBmYWxzZSk7CisJCWlmIChsaWtlbHkocmV0ID09IDApKSB7CisJCQlyYWRlb25fYm9fa3VubWFwKHJibyk7CisJCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJibyk7CisJCX0KIAl9CiAJaWYgKGZiICYmIHJldCkgewogCQlsaXN0X2RlbCgmZmItPmZpbHBfaGVhZCk7CkBAIC0zMjEsMTQgKzMzMSwyMiBAQAogCiBpbnQgcmFkZW9uZmJfcHJvYmUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gZHJtX2ZiX2hlbHBlcl9zaW5nbGVfZmJfcHJvYmUoZGV2LCAzMiwgJnJhZGVvbmZiX2NyZWF0ZSk7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBicHBfc2VsID0gMzI7CisKKwkvKiBzZWxlY3QgOCBicHAgY29uc29sZSBvbiBSTjUwIG9yIDE2TUIgY2FyZHMgKi8KKwlpZiAoQVNJQ19JU19STjUwKHJkZXYpIHx8IHJkZXYtPm1jLnJlYWxfdnJhbV9zaXplIDw9ICgzMioxMDI0KjEwMjQpKQorCQlicHBfc2VsID0gODsKKworCXJldHVybiBkcm1fZmJfaGVscGVyX3NpbmdsZV9mYl9wcm9iZShkZXYsIGJwcF9zZWwsICZyYWRlb25mYl9jcmVhdGUpOwogfQogCiBpbnQgcmFkZW9uZmJfcmVtb3ZlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiKQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvOwogCXN0cnVjdCByYWRlb25fZnJhbWVidWZmZXIgKnJmYiA9IHRvX3JhZGVvbl9mcmFtZWJ1ZmZlcihmYik7Ci0Jc3RydWN0IHJhZGVvbl9vYmplY3QgKnJvYmo7CisJc3RydWN0IHJhZGVvbl9ibyAqcmJvOworCWludCByOwogCiAJaWYgKCFmYikgewogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMzNiwxMCArMzU0LDE0IEBACiAJaW5mbyA9IGZiLT5mYmRldjsKIAlpZiAoaW5mbykgewogCQlzdHJ1Y3QgcmFkZW9uX2ZiX2RldmljZSAqcmZiZGV2ID0gaW5mby0+cGFyOwotCQlyb2JqID0gcmZiLT5vYmotPmRyaXZlcl9wcml2YXRlOworCQlyYm8gPSByZmItPm9iai0+ZHJpdmVyX3ByaXZhdGU7CiAJCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7Ci0JCXJhZGVvbl9vYmplY3Rfa3VubWFwKHJvYmopOwotCQlyYWRlb25fb2JqZWN0X3VucGluKHJvYmopOworCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmJvLCBmYWxzZSk7CisJCWlmIChsaWtlbHkociA9PSAwKSkgeworCQkJcmFkZW9uX2JvX2t1bm1hcChyYm8pOworCQkJcmFkZW9uX2JvX3VucGluKHJibyk7CisJCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJibyk7CisJCX0KIAkJZHJtX2ZiX2hlbHBlcl9mcmVlKCZyZmJkZXYtPmhlbHBlcik7CiAJCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmVuY2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZlbmNlLmMKaW5kZXggM2JlYjI2ZC4uY2I0Y2Q5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmVuY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mZW5jZS5jCkBAIC0xNjgsMzcgKzE2OCw2IEBACiAJcmV0dXJuIHNpZ25hbGVkOwogfQogCi1pbnQgcjYwMF9mZW5jZV93YWl0KHN0cnVjdCByYWRlb25fZmVuY2UgKmZlbmNlLCAgYm9vbCBpbnRyLCBib29sIGxhenkpCi17Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXY7Ci0JaW50IHJldCA9IDA7Ci0KLQlyZGV2ID0gZmVuY2UtPnJkZXY7Ci0KLQlfX3NldF9jdXJyZW50X3N0YXRlKGludHIgPyBUQVNLX0lOVEVSUlVQVElCTEUgOiBUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0KLQl3aGlsZSAoMSkgewotCQlpZiAocmFkZW9uX2ZlbmNlX3NpZ25hbGVkKGZlbmNlKSkKLQkJCWJyZWFrOwotCi0JCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGZlbmNlLT50aW1lb3V0KSkgewotCQkJcmV0ID0gLUVCVVNZOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAobGF6eSkKLQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0KLQkJaWYgKGludHIgJiYgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlyZXR1cm4gcmV0OwotfQotCi0KIGludCByYWRlb25fZmVuY2Vfd2FpdChzdHJ1Y3QgcmFkZW9uX2ZlbmNlICpmZW5jZSwgYm9vbCBpbnRyKQogewogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2OwpAQCAtMjE2LDEzICsxODUsNiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUjYwMCkgewotCQlyID0gcjYwMF9mZW5jZV93YWl0KGZlbmNlLCBpbnRyLCAwKTsKLQkJaWYgKHIgPT0gLUVSRVNUQVJUU1lTKQotCQkJcmV0dXJuIC1FQlVTWTsKLQkJcmV0dXJuIHI7Ci0JfQotCiByZXRyeToKIAljdXJfamlmZmllcyA9IGppZmZpZXM7CiAJdGltZW91dCA9IEhaIC8gMTAwOwpAQCAtMjMxLDE0ICsxOTMsMTcgQEAKIAl9CiAKIAlpZiAoaW50cikgeworCQlyYWRlb25faXJxX2ttc19zd19pcnFfZ2V0KHJkZXYpOwogCQlyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocmRldi0+ZmVuY2VfZHJ2LnF1ZXVlLAogCQkJCXJhZGVvbl9mZW5jZV9zaWduYWxlZChmZW5jZSksIHRpbWVvdXQpOwotCQlpZiAodW5saWtlbHkociA9PSAtRVJFU1RBUlRTWVMpKSB7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9CisJCXJhZGVvbl9pcnFfa21zX3N3X2lycV9wdXQocmRldik7CisJCWlmICh1bmxpa2VseShyIDwgMCkpCisJCQlyZXR1cm4gcjsKIAl9IGVsc2UgeworCQlyYWRlb25faXJxX2ttc19zd19pcnFfZ2V0KHJkZXYpOwogCQlyID0gd2FpdF9ldmVudF90aW1lb3V0KHJkZXYtPmZlbmNlX2Rydi5xdWV1ZSwKIAkJCSByYWRlb25fZmVuY2Vfc2lnbmFsZWQoZmVuY2UpLCB0aW1lb3V0KTsKKwkJcmFkZW9uX2lycV9rbXNfc3dfaXJxX3B1dChyZGV2KTsKIAl9CiAJaWYgKHVubGlrZWx5KCFyYWRlb25fZmVuY2Vfc2lnbmFsZWQoZmVuY2UpKSkgewogCQlpZiAodW5saWtlbHkociA9PSAwKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZml4ZWQuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZpeGVkLmgKaW5kZXggOTAxODdkMS4uM2Q0ZDg0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZml4ZWQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9maXhlZC5oCkBAIC0zOCw2ICszOCwyMyBAQAogI2RlZmluZSBmaXhlZF9pbml0X2hhbGYoQSkgeyAuZnVsbCA9IHJmaXhlZF9jb25zdF9oYWxmKChBKSkgfQogI2RlZmluZSByZml4ZWRfdHJ1bmMoQSkgKChBKS5mdWxsID4+IDEyKQogCitzdGF0aWMgaW5saW5lIHUzMiByZml4ZWRfZmxvb3IoZml4ZWQyMF8xMiBBKQoreworCXUzMiBub25fZnJhYyA9IHJmaXhlZF90cnVuYyhBKTsKKworCXJldHVybiByZml4ZWRfY29uc3Qobm9uX2ZyYWMpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiByZml4ZWRfY2VpbChmaXhlZDIwXzEyIEEpCit7CisJdTMyIG5vbl9mcmFjID0gcmZpeGVkX3RydW5jKEEpOworCisJaWYgKEEuZnVsbCA+IHJmaXhlZF9jb25zdChub25fZnJhYykpCisJCXJldHVybiByZml4ZWRfY29uc3Qobm9uX2ZyYWMgKyAxKTsKKwllbHNlCisJCXJldHVybiByZml4ZWRfY29uc3Qobm9uX2ZyYWMpOworfQorCiBzdGF0aWMgaW5saW5lIHUzMiByZml4ZWRfZGl2KGZpeGVkMjBfMTIgQSwgZml4ZWQyMF8xMiBCKQogewogCXU2NCB0bXAgPSAoKHU2NClBLmZ1bGwgPDwgMTMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZ2FydC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZ2FydC5jCmluZGV4IGE2OGQ3NTYuLmU3M2Q1NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2dhcnQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9nYXJ0LmMKQEAgLTc4LDExICs3OCw5IEBACiAJaW50IHI7CiAKIAlpZiAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmogPT0gTlVMTCkgewotCQlyID0gcmFkZW9uX29iamVjdF9jcmVhdGUocmRldiwgTlVMTCwKLQkJCQkJIHJkZXYtPmdhcnQudGFibGVfc2l6ZSwKLQkJCQkJIHRydWUsCi0JCQkJCSBSQURFT05fR0VNX0RPTUFJTl9WUkFNLAotCQkJCQkgZmFsc2UsICZyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7CisJCXIgPSByYWRlb25fYm9fY3JlYXRlKHJkZXYsIE5VTEwsIHJkZXYtPmdhcnQudGFibGVfc2l6ZSwKKwkJCQkJdHJ1ZSwgUkFERU9OX0dFTV9ET01BSU5fVlJBTSwKKwkJCQkJJnJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKIAkJaWYgKHIpIHsKIAkJCXJldHVybiByOwogCQl9CkBAIC05NSwzMiArOTMsMzggQEAKIAl1aW50NjRfdCBncHVfYWRkcjsKIAlpbnQgcjsKIAotCXIgPSByYWRlb25fb2JqZWN0X3BpbihyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaiwKLQkJCSAgICAgIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sICZncHVfYWRkcik7CisJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqLCBmYWxzZSk7CisJaWYgKHVubGlrZWx5KHIgIT0gMCkpCisJCXJldHVybiByOworCXIgPSByYWRlb25fYm9fcGluKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqLAorCQkJCVJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sICZncHVfYWRkcik7CiAJaWYgKHIpIHsKLQkJcmFkZW9uX29iamVjdF91bnJlZigmcmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOworCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKIAkJcmV0dXJuIHI7CiAJfQotCXIgPSByYWRlb25fb2JqZWN0X2ttYXAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmosCi0JCQkgICAgICAgKHZvaWQgKiopJnJkZXYtPmdhcnQudGFibGUudnJhbS5wdHIpOwotCWlmIChyKSB7Ci0JCXJhZGVvbl9vYmplY3RfdW5waW4ocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQlyYWRlb25fb2JqZWN0X3VucmVmKCZyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7Ci0JCURSTV9FUlJPUigicmFkZW9uOiBmYWlsZWQgdG8gbWFwIGdhcnQgdnJhbSB0YWJsZS5cbiIpOwotCQlyZXR1cm4gcjsKLQl9CisJciA9IHJhZGVvbl9ib19rbWFwKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqLAorCQkJCSh2b2lkICoqKSZyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucHRyKTsKKwlpZiAocikKKwkJcmFkZW9uX2JvX3VucGluKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKKwlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKIAlyZGV2LT5nYXJ0LnRhYmxlX2FkZHIgPSBncHVfYWRkcjsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcjsKIH0KIAogdm9pZCByYWRlb25fZ2FydF90YWJsZV92cmFtX2ZyZWUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CisJaW50IHI7CisKIAlpZiAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmogPT0gTlVMTCkgewogCQlyZXR1cm47CiAJfQotCXJhZGVvbl9vYmplY3Rfa3VubWFwKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKLQlyYWRlb25fb2JqZWN0X3VucGluKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKLQlyYWRlb25fb2JqZWN0X3VucmVmKCZyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7CisJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqLCBmYWxzZSk7CisJaWYgKGxpa2VseShyID09IDApKSB7CisJCXJhZGVvbl9ib19rdW5tYXAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOworCQlyYWRlb25fYm9fdW5waW4ocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOworCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKKwl9CisJcmFkZW9uX2JvX3VucmVmKCZyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9nZW0uYwppbmRleCBkODgwZWRmLi4yOTQ0NDg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9nZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9nZW0uYwpAQCAtMzgsMjIgKzM4LDIxIEBACiAKIHZvaWQgcmFkZW9uX2dlbV9vYmplY3RfZnJlZShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdvYmopCiB7Ci0Jc3RydWN0IHJhZGVvbl9vYmplY3QgKnJvYmogPSBnb2JqLT5kcml2ZXJfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2JvICpyb2JqID0gZ29iai0+ZHJpdmVyX3ByaXZhdGU7CiAKIAlnb2JqLT5kcml2ZXJfcHJpdmF0ZSA9IE5VTEw7CiAJaWYgKHJvYmopIHsKLQkJcmFkZW9uX29iamVjdF91bnJlZigmcm9iaik7CisJCXJhZGVvbl9ib191bnJlZigmcm9iaik7CiAJfQogfQogCiBpbnQgcmFkZW9uX2dlbV9vYmplY3RfY3JlYXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgc2l6ZSwKLQkJCSAgICAgaW50IGFsaWdubWVudCwgaW50IGluaXRpYWxfZG9tYWluLAotCQkJICAgICBib29sIGRpc2NhcmRhYmxlLCBib29sIGtlcm5lbCwKLQkJCSAgICAgYm9vbCBpbnRlcnJ1cHRpYmxlLAotCQkJICAgICBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKipvYmopCisJCQkJaW50IGFsaWdubWVudCwgaW50IGluaXRpYWxfZG9tYWluLAorCQkJCWJvb2wgZGlzY2FyZGFibGUsIGJvb2wga2VybmVsLAorCQkJCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqKm9iaikKIHsKIAlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdvYmo7Ci0Jc3RydWN0IHJhZGVvbl9vYmplY3QgKnJvYmo7CisJc3RydWN0IHJhZGVvbl9ibyAqcm9iajsKIAlpbnQgcjsKIAogCSpvYmogPSBOVUxMOwpAQCAtNjUsOCArNjQsNyBAQAogCWlmIChhbGlnbm1lbnQgPCBQQUdFX1NJWkUpIHsKIAkJYWxpZ25tZW50ID0gUEFHRV9TSVpFOwogCX0KLQlyID0gcmFkZW9uX29iamVjdF9jcmVhdGUocmRldiwgZ29iaiwgc2l6ZSwga2VybmVsLCBpbml0aWFsX2RvbWFpbiwKLQkJCQkgaW50ZXJydXB0aWJsZSwgJnJvYmopOworCXIgPSByYWRlb25fYm9fY3JlYXRlKHJkZXYsIGdvYmosIHNpemUsIGtlcm5lbCwgaW5pdGlhbF9kb21haW4sICZyb2JqKTsKIAlpZiAocikgewogCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBHRU0gb2JqZWN0ICglZCwgJWQsICV1KVxuIiwKIAkJCSAgc2l6ZSwgaW5pdGlhbF9kb21haW4sIGFsaWdubWVudCk7CkBAIC04MywzMyArODEsMzMgQEAKIGludCByYWRlb25fZ2VtX29iamVjdF9waW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIHVpbnQzMl90IHBpbl9kb21haW4sCiAJCQkgIHVpbnQ2NF90ICpncHVfYWRkcikKIHsKLQlzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iaiA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7Ci0JdWludDMyX3QgZmxhZ3M7CisJc3RydWN0IHJhZGVvbl9ibyAqcm9iaiA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CisJaW50IHI7CiAKLQlzd2l0Y2ggKHBpbl9kb21haW4pIHsKLQljYXNlIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU06Ci0JCWZsYWdzID0gVFRNX1BMX0ZMQUdfVlJBTTsKLQkJYnJlYWs7Ci0JY2FzZSBSQURFT05fR0VNX0RPTUFJTl9HVFQ6Ci0JCWZsYWdzID0gVFRNX1BMX0ZMQUdfVFQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWZsYWdzID0gVFRNX1BMX0ZMQUdfU1lTVEVNOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJhZGVvbl9vYmplY3RfcGluKHJvYmosIGZsYWdzLCBncHVfYWRkcik7CisJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJvYmosIGZhbHNlKTsKKwlpZiAodW5saWtlbHkociAhPSAwKSkKKwkJcmV0dXJuIHI7CisJciA9IHJhZGVvbl9ib19waW4ocm9iaiwgcGluX2RvbWFpbiwgZ3B1X2FkZHIpOworCXJhZGVvbl9ib191bnJlc2VydmUocm9iaik7CisJcmV0dXJuIHI7CiB9CiAKIHZvaWQgcmFkZW9uX2dlbV9vYmplY3RfdW5waW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCiB7Ci0Jc3RydWN0IHJhZGVvbl9vYmplY3QgKnJvYmogPSBvYmotPmRyaXZlcl9wcml2YXRlOwotCXJhZGVvbl9vYmplY3RfdW5waW4ocm9iaik7CisJc3RydWN0IHJhZGVvbl9ibyAqcm9iaiA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CisJaW50IHI7CisKKwlyID0gcmFkZW9uX2JvX3Jlc2VydmUocm9iaiwgZmFsc2UpOworCWlmIChsaWtlbHkociA9PSAwKSkgeworCQlyYWRlb25fYm9fdW5waW4ocm9iaik7CisJCXJhZGVvbl9ib191bnJlc2VydmUocm9iaik7CisJfQogfQogCiBpbnQgcmFkZW9uX2dlbV9zZXRfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ29iaiwKIAkJCSAgdWludDMyX3QgcmRvbWFpbiwgdWludDMyX3Qgd2RvbWFpbikKIHsKLQlzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iajsKKwlzdHJ1Y3QgcmFkZW9uX2JvICpyb2JqOwogCXVpbnQzMl90IGRvbWFpbjsKIAlpbnQgcjsKIApAQCAtMTI3LDExICsxMjUsMTIgQEAKIAl9CiAJaWYgKGRvbWFpbiA9PSBSQURFT05fR0VNX0RPTUFJTl9DUFUpIHsKIAkJLyogQXNraW5nIGZvciBjcHUgYWNjZXNzIHdhaXQgZm9yIG9iamVjdCBpZGxlICovCi0JCXIgPSByYWRlb25fb2JqZWN0X3dhaXQocm9iaik7CisJCXIgPSByYWRlb25fYm9fd2FpdChyb2JqLCBOVUxMLCBmYWxzZSk7CiAJCWlmIChyKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byB3YWl0IGZvciBvYmplY3QgIVxuIik7CiAJCQlyZXR1cm4gcjsKIAkJfQorCQlyYWRlb25faGRwX2ZsdXNoKHJvYmotPnJkZXYpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTE0NCw3ICsxNDMsNyBAQAogCiB2b2lkIHJhZGVvbl9nZW1fZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQlyYWRlb25fb2JqZWN0X2ZvcmNlX2RlbGV0ZShyZGV2KTsKKwlyYWRlb25fYm9fZm9yY2VfZGVsZXRlKHJkZXYpOwogfQogCiAKQEAgLTE1OCw5ICsxNTcsMTMgQEAKIAlzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1faW5mbyAqYXJncyA9IGRhdGE7CiAKIAlhcmdzLT52cmFtX3NpemUgPSByZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZTsKLQkvKiBGSVhNRTogcmVwb3J0IHNvbWV0aGluZ3MgdGhhdCBtYWtlcyBzZW5zZSAqLwotCWFyZ3MtPnZyYW1fdmlzaWJsZSA9IHJkZXYtPm1jLnJlYWxfdnJhbV9zaXplIC0gKDQgKiAxMDI0ICogMTAyNCk7Ci0JYXJncy0+Z2FydF9zaXplID0gcmRldi0+bWMuZ3R0X3NpemU7CisJYXJncy0+dnJhbV92aXNpYmxlID0gcmRldi0+bWMucmVhbF92cmFtX3NpemU7CisJaWYgKHJkZXYtPnN0b2xsZW5fdmdhX21lbW9yeSkKKwkJYXJncy0+dnJhbV92aXNpYmxlIC09IHJhZGVvbl9ib19zaXplKHJkZXYtPnN0b2xsZW5fdmdhX21lbW9yeSk7CisJaWYgKHJkZXYtPmZiZGV2X3JibykKKwkJYXJncy0+dnJhbV92aXNpYmxlIC09IHJhZGVvbl9ib19zaXplKHJkZXYtPmZiZGV2X3Jibyk7CisJYXJncy0+Z2FydF9zaXplID0gcmRldi0+bWMuZ3R0X3NpemUgLSByZGV2LT5jcC5yaW5nX3NpemUgLSA0MDk2IC0KKwkJUkFERU9OX0lCX1BPT0xfU0laRSo2NCoxMDI0OwogCXJldHVybiAwOwogfQogCkBAIC0xOTIsOCArMTk1LDggQEAKIAkvKiBjcmVhdGUgYSBnZW0gb2JqZWN0IHRvIGNvbnRhaW4gdGhpcyBvYmplY3QgaW4gKi8KIAlhcmdzLT5zaXplID0gcm91bmR1cChhcmdzLT5zaXplLCBQQUdFX1NJWkUpOwogCXIgPSByYWRlb25fZ2VtX29iamVjdF9jcmVhdGUocmRldiwgYXJncy0+c2l6ZSwgYXJncy0+YWxpZ25tZW50LAotCQkJCSAgICAgYXJncy0+aW5pdGlhbF9kb21haW4sIGZhbHNlLAotCQkJCSAgICAgZmFsc2UsIHRydWUsICZnb2JqKTsKKwkJCQkJYXJncy0+aW5pdGlhbF9kb21haW4sIGZhbHNlLAorCQkJCQlmYWxzZSwgJmdvYmopOwogCWlmIChyKSB7CiAJCXJldHVybiByOwogCX0KQEAgLTIxOCw3ICsyMjEsNyBAQAogCSAqIGp1c3QgdmFsaWRhdGUgdGhlIEJPIGludG8gYSBjZXJ0YWluIGRvbWFpbiAqLwogCXN0cnVjdCBkcm1fcmFkZW9uX2dlbV9zZXRfZG9tYWluICphcmdzID0gZGF0YTsKIAlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdvYmo7Ci0Jc3RydWN0IHJhZGVvbl9vYmplY3QgKnJvYmo7CisJc3RydWN0IHJhZGVvbl9ibyAqcm9iajsKIAlpbnQgcjsKIAogCS8qIGZvciBub3cgaWYgc29tZW9uZSByZXF1ZXN0cyBkb21haW4gQ1BVIC0KQEAgLTI0NCwxOSArMjQ3LDE4IEBACiB7CiAJc3RydWN0IGRybV9yYWRlb25fZ2VtX21tYXAgKmFyZ3MgPSBkYXRhOwogCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ29iajsKLQlzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iajsKLQlpbnQgcjsKKwlzdHJ1Y3QgcmFkZW9uX2JvICpyb2JqOwogCiAJZ29iaiA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbHAsIGFyZ3MtPmhhbmRsZSk7CiAJaWYgKGdvYmogPT0gTlVMTCkgewogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcm9iaiA9IGdvYmotPmRyaXZlcl9wcml2YXRlOwotCXIgPSByYWRlb25fb2JqZWN0X21tYXAocm9iaiwgJmFyZ3MtPmFkZHJfcHRyKTsKKwlhcmdzLT5hZGRyX3B0ciA9IHJhZGVvbl9ib19tbWFwX29mZnNldChyb2JqKTsKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoZ29iaik7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JcmV0dXJuIHI7CisJcmV0dXJuIDA7CiB9CiAKIGludCByYWRlb25fZ2VtX2J1c3lfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKQEAgLTI2NCwxNiArMjY2LDE2IEBACiB7CiAJc3RydWN0IGRybV9yYWRlb25fZ2VtX2J1c3kgKmFyZ3MgPSBkYXRhOwogCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ29iajsKLQlzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iajsKKwlzdHJ1Y3QgcmFkZW9uX2JvICpyb2JqOwogCWludCByOwotCXVpbnQzMl90IGN1cl9wbGFjZW1lbnQ7CisJdWludDMyX3QgY3VyX3BsYWNlbWVudCA9IDA7CiAKIAlnb2JqID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlscCwgYXJncy0+aGFuZGxlKTsKIAlpZiAoZ29iaiA9PSBOVUxMKSB7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyb2JqID0gZ29iai0+ZHJpdmVyX3ByaXZhdGU7Ci0JciA9IHJhZGVvbl9vYmplY3RfYnVzeV9kb21haW4ocm9iaiwgJmN1cl9wbGFjZW1lbnQpOworCXIgPSByYWRlb25fYm9fd2FpdChyb2JqLCAmY3VyX3BsYWNlbWVudCwgdHJ1ZSk7CiAJc3dpdGNoIChjdXJfcGxhY2VtZW50KSB7CiAJY2FzZSBUVE1fUExfVlJBTToKIAkJYXJncy0+ZG9tYWluID0gUkFERU9OX0dFTV9ET01BSU5fVlJBTTsKQEAgLTI5Nyw3ICsyOTksNyBAQAogewogCXN0cnVjdCBkcm1fcmFkZW9uX2dlbV93YWl0X2lkbGUgKmFyZ3MgPSBkYXRhOwogCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ29iajsKLQlzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iajsKKwlzdHJ1Y3QgcmFkZW9uX2JvICpyb2JqOwogCWludCByOwogCiAJZ29iaiA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbHAsIGFyZ3MtPmhhbmRsZSk7CkBAIC0zMDUsMTAgKzMwNywxMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcm9iaiA9IGdvYmotPmRyaXZlcl9wcml2YXRlOwotCXIgPSByYWRlb25fb2JqZWN0X3dhaXQocm9iaik7CisJciA9IHJhZGVvbl9ib193YWl0KHJvYmosIE5VTEwsIGZhbHNlKTsKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoZ29iaik7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJcmFkZW9uX2hkcF9mbHVzaChyb2JqLT5yZGV2KTsKIAlyZXR1cm4gcjsKIH0KIApAQCAtMzE3LDcgKzMyMCw3IEBACiB7CiAJc3RydWN0IGRybV9yYWRlb25fZ2VtX3NldF90aWxpbmcgKmFyZ3MgPSBkYXRhOwogCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ29iajsKLQlzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iajsKKwlzdHJ1Y3QgcmFkZW9uX2JvICpyb2JqOwogCWludCByID0gMDsKIAogCURSTV9ERUJVRygiJWQgXG4iLCBhcmdzLT5oYW5kbGUpOwpAQCAtMzI1LDcgKzMyOCw3IEBACiAJaWYgKGdvYmogPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcm9iaiA9IGdvYmotPmRyaXZlcl9wcml2YXRlOwotCXJhZGVvbl9vYmplY3Rfc2V0X3RpbGluZ19mbGFncyhyb2JqLCBhcmdzLT50aWxpbmdfZmxhZ3MsIGFyZ3MtPnBpdGNoKTsKKwlyID0gcmFkZW9uX2JvX3NldF90aWxpbmdfZmxhZ3Mocm9iaiwgYXJncy0+dGlsaW5nX2ZsYWdzLCBhcmdzLT5waXRjaCk7CiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGdvYmopOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpAQCAtMzM3LDE2ICszNDAsMTkgQEAKIHsKIAlzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fZ2V0X3RpbGluZyAqYXJncyA9IGRhdGE7CiAJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnb2JqOwotCXN0cnVjdCByYWRlb25fb2JqZWN0ICpyb2JqOworCXN0cnVjdCByYWRlb25fYm8gKnJibzsKIAlpbnQgciA9IDA7CiAKIAlEUk1fREVCVUcoIlxuIik7CiAJZ29iaiA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbHAsIGFyZ3MtPmhhbmRsZSk7CiAJaWYgKGdvYmogPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0Jcm9iaiA9IGdvYmotPmRyaXZlcl9wcml2YXRlOwotCXJhZGVvbl9vYmplY3RfZ2V0X3RpbGluZ19mbGFncyhyb2JqLCAmYXJncy0+dGlsaW5nX2ZsYWdzLAotCQkJCSAgICAgICAmYXJncy0+cGl0Y2gpOworCXJibyA9IGdvYmotPmRyaXZlcl9wcml2YXRlOworCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyYm8sIGZhbHNlKTsKKwlpZiAodW5saWtlbHkociAhPSAwKSkKKwkJcmV0dXJuIHI7CisJcmFkZW9uX2JvX2dldF90aWxpbmdfZmxhZ3MocmJvLCAmYXJncy0+dGlsaW5nX2ZsYWdzLCAmYXJncy0+cGl0Y2gpOworCXJhZGVvbl9ib191bnJlc2VydmUocmJvKTsKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoZ29iaik7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pMmMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2kyYy5jCmluZGV4IGRkNDM4ZDMuLmRhM2RhMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2kyYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2kyYy5jCkBAIC01OSwzNSArNTksNDMgQEAKIH0KIAogCi12b2lkIHJhZGVvbl9pMmNfZG9fbG9jayhzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciwgaW50IGxvY2tfc3RhdGUpCit2b2lkIHJhZGVvbl9pMmNfZG9fbG9jayhzdHJ1Y3QgcmFkZW9uX2kyY19jaGFuICppMmMsIGludCBsb2NrX3N0YXRlKQogewotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZS5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gaTJjLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25faTJjX2J1c19yZWMgKnJlYyA9ICZpMmMtPnJlYzsKIAl1aW50MzJfdCB0ZW1wOwotCXN0cnVjdCByYWRlb25faTJjX2J1c19yZWMgKnJlYyA9ICZyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzLT5yZWM7CiAKIAkvKiBSVjQxMCBhcHBlYXJzIHRvIGhhdmUgYSBidWcgd2hlcmUgdGhlIGh3IGkyYyBpbiByZXNldAogCSAqIGhvbGRzIHRoZSBpMmMgcG9ydCBpbiBhIGJhZCBzdGF0ZSAtIHN3aXRjaCBodyBpMmMgYXdheSBiZWZvcmUKIAkgKiBkb2luZyBEREMgLSBkbyB0aGlzIGZvciBhbGwgcjIwMHMvcjMwMHMvcjQwMHMgZm9yIHNhZmV0eSBzYWtlCiAJICovCi0JaWYgKChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SMjAwKSAmJiAhQVNJQ19JU19BVklWTyhyZGV2KSkgewotCQlpZiAocmVjLT5hX2Nsa19yZWcgPT0gUkFERU9OX0dQSU9fTU9OSUQpIHsKLQkJCVdSRUczMihSQURFT05fRFZJX0kyQ19DTlRMXzAsIChSQURFT05fSTJDX1NPRlRfUlNUIHwKLQkJCQkJCVIyMDBfRFZJX0kyQ19QSU5fU0VMKFIyMDBfU0VMX0REQzEpKSk7Ci0JCX0gZWxzZSB7Ci0JCQlXUkVHMzIoUkFERU9OX0RWSV9JMkNfQ05UTF8wLCAoUkFERU9OX0kyQ19TT0ZUX1JTVCB8Ci0JCQkJCQlSMjAwX0RWSV9JMkNfUElOX1NFTChSMjAwX1NFTF9EREMzKSkpOworCWlmIChyZWMtPmh3X2NhcGFibGUpIHsKKwkJaWYgKChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SMjAwKSAmJiAhQVNJQ19JU19BVklWTyhyZGV2KSkgeworCQkJaWYgKHJlYy0+YV9jbGtfcmVnID09IFJBREVPTl9HUElPX01PTklEKSB7CisJCQkJV1JFRzMyKFJBREVPTl9EVklfSTJDX0NOVExfMCwgKFJBREVPTl9JMkNfU09GVF9SU1QgfAorCQkJCQkJCSAgICAgICBSMjAwX0RWSV9JMkNfUElOX1NFTChSMjAwX1NFTF9EREMxKSkpOworCQkJfSBlbHNlIHsKKwkJCQlXUkVHMzIoUkFERU9OX0RWSV9JMkNfQ05UTF8wLCAoUkFERU9OX0kyQ19TT0ZUX1JTVCB8CisJCQkJCQkJICAgICAgIFIyMDBfRFZJX0kyQ19QSU5fU0VMKFIyMDBfU0VMX0REQzMpKSk7CisJCQl9CiAJCX0KIAl9Ci0JaWYgKGxvY2tfc3RhdGUpIHsKLQkJdGVtcCA9IFJSRUczMihyZWMtPmFfY2xrX3JlZyk7Ci0JCXRlbXAgJj0gfihyZWMtPmFfY2xrX21hc2spOwotCQlXUkVHMzIocmVjLT5hX2Nsa19yZWcsIHRlbXApOwogCi0JCXRlbXAgPSBSUkVHMzIocmVjLT5hX2RhdGFfcmVnKTsKLQkJdGVtcCAmPSB+KHJlYy0+YV9kYXRhX21hc2spOwotCQlXUkVHMzIocmVjLT5hX2RhdGFfcmVnLCB0ZW1wKTsKLQl9CisJLyogY2xlYXIgdGhlIG91dHB1dCBwaW4gdmFsdWVzICovCisJdGVtcCA9IFJSRUczMihyZWMtPmFfY2xrX3JlZykgJiB+cmVjLT5hX2Nsa19tYXNrOworCVdSRUczMihyZWMtPmFfY2xrX3JlZywgdGVtcCk7CiAKKwl0ZW1wID0gUlJFRzMyKHJlYy0+YV9kYXRhX3JlZykgJiB+cmVjLT5hX2RhdGFfbWFzazsKKwlXUkVHMzIocmVjLT5hX2RhdGFfcmVnLCB0ZW1wKTsKKworCS8qIHNldCB0aGUgcGlucyB0byBpbnB1dCAqLworCXRlbXAgPSBSUkVHMzIocmVjLT5lbl9jbGtfcmVnKSAmIH5yZWMtPmVuX2Nsa19tYXNrOworCVdSRUczMihyZWMtPmVuX2Nsa19yZWcsIHRlbXApOworCisJdGVtcCA9IFJSRUczMihyZWMtPmVuX2RhdGFfcmVnKSAmIH5yZWMtPmVuX2RhdGFfbWFzazsKKwlXUkVHMzIocmVjLT5lbl9kYXRhX3JlZywgdGVtcCk7CisKKwkvKiBtYXNrIHRoZSBncGlvIHBpbnMgZm9yIHNvZnR3YXJlIHVzZSAqLwogCXRlbXAgPSBSUkVHMzIocmVjLT5tYXNrX2Nsa19yZWcpOwogCWlmIChsb2NrX3N0YXRlKQogCQl0ZW1wIHw9IHJlYy0+bWFza19jbGtfbWFzazsKQEAgLTExMiw4ICsxMjAsOSBAQAogCXN0cnVjdCByYWRlb25faTJjX2J1c19yZWMgKnJlYyA9ICZpMmMtPnJlYzsKIAl1aW50MzJfdCB2YWw7CiAKLQl2YWwgPSBSUkVHMzIocmVjLT5nZXRfY2xrX3JlZyk7Ci0JdmFsICY9IHJlYy0+Z2V0X2Nsa19tYXNrOworCS8qIHJlYWQgdGhlIHZhbHVlIG9mZiB0aGUgcGluICovCisJdmFsID0gUlJFRzMyKHJlYy0+eV9jbGtfcmVnKTsKKwl2YWwgJj0gcmVjLT55X2Nsa19tYXNrOwogCiAJcmV0dXJuICh2YWwgIT0gMCk7CiB9CkBAIC0xMjYsOCArMTM1LDEwIEBACiAJc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyAqcmVjID0gJmkyYy0+cmVjOwogCXVpbnQzMl90IHZhbDsKIAotCXZhbCA9IFJSRUczMihyZWMtPmdldF9kYXRhX3JlZyk7Ci0JdmFsICY9IHJlYy0+Z2V0X2RhdGFfbWFzazsKKwkvKiByZWFkIHRoZSB2YWx1ZSBvZmYgdGhlIHBpbiAqLworCXZhbCA9IFJSRUczMihyZWMtPnlfZGF0YV9yZWcpOworCXZhbCAmPSByZWMtPnlfZGF0YV9tYXNrOworCiAJcmV0dXJuICh2YWwgIT0gMCk7CiB9CiAKQEAgLTEzOCw5ICsxNDksMTAgQEAKIAlzdHJ1Y3QgcmFkZW9uX2kyY19idXNfcmVjICpyZWMgPSAmaTJjLT5yZWM7CiAJdWludDMyX3QgdmFsOwogCi0JdmFsID0gUlJFRzMyKHJlYy0+cHV0X2Nsa19yZWcpICYgKHVpbnQzMl90KX4ocmVjLT5wdXRfY2xrX21hc2spOwotCXZhbCB8PSBjbG9jayA/IDAgOiByZWMtPnB1dF9jbGtfbWFzazsKLQlXUkVHMzIocmVjLT5wdXRfY2xrX3JlZywgdmFsKTsKKwkvKiBzZXQgcGluIGRpcmVjdGlvbiAqLworCXZhbCA9IFJSRUczMihyZWMtPmVuX2Nsa19yZWcpICYgfnJlYy0+ZW5fY2xrX21hc2s7CisJdmFsIHw9IGNsb2NrID8gMCA6IHJlYy0+ZW5fY2xrX21hc2s7CisJV1JFRzMyKHJlYy0+ZW5fY2xrX3JlZywgdmFsKTsKIH0KIAogc3RhdGljIHZvaWQgc2V0X2RhdGEodm9pZCAqaTJjX3ByaXYsIGludCBkYXRhKQpAQCAtMTUwLDE0ICsxNjIsMTUgQEAKIAlzdHJ1Y3QgcmFkZW9uX2kyY19idXNfcmVjICpyZWMgPSAmaTJjLT5yZWM7CiAJdWludDMyX3QgdmFsOwogCi0JdmFsID0gUlJFRzMyKHJlYy0+cHV0X2RhdGFfcmVnKSAmICh1aW50MzJfdCl+KHJlYy0+cHV0X2RhdGFfbWFzayk7Ci0JdmFsIHw9IGRhdGEgPyAwIDogcmVjLT5wdXRfZGF0YV9tYXNrOwotCVdSRUczMihyZWMtPnB1dF9kYXRhX3JlZywgdmFsKTsKKwkvKiBzZXQgcGluIGRpcmVjdGlvbiAqLworCXZhbCA9IFJSRUczMihyZWMtPmVuX2RhdGFfcmVnKSAmIH5yZWMtPmVuX2RhdGFfbWFzazsKKwl2YWwgfD0gZGF0YSA/IDAgOiByZWMtPmVuX2RhdGFfbWFzazsKKwlXUkVHMzIocmVjLT5lbl9kYXRhX3JlZywgdmFsKTsKIH0KIAogc3RydWN0IHJhZGVvbl9pMmNfY2hhbiAqcmFkZW9uX2kyY19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyAqcmVjLAotCQljb25zdCBjaGFyICpuYW1lKQorCQkJCQkgIHN0cnVjdCByYWRlb25faTJjX2J1c19yZWMgKnJlYywKKwkJCQkJICBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCByYWRlb25faTJjX2NoYW4gKmkyYzsKIAlpbnQgcmV0OwpAQCAtMTY3LDIwICsxODAsMTkgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlpMmMtPmFkYXB0ZXIub3duZXIgPSBUSElTX01PRFVMRTsKLQlpMmMtPmFkYXB0ZXIuYWxnb19kYXRhID0gJmkyYy0+YWxnbzsKIAlpMmMtPmRldiA9IGRldjsKLQlpMmMtPmFsZ28uc2V0c2RhID0gc2V0X2RhdGE7Ci0JaTJjLT5hbGdvLnNldHNjbCA9IHNldF9jbG9jazsKLQlpMmMtPmFsZ28uZ2V0c2RhID0gZ2V0X2RhdGE7Ci0JaTJjLT5hbGdvLmdldHNjbCA9IGdldF9jbG9jazsKLQlpMmMtPmFsZ28udWRlbGF5ID0gMjA7CisJaTJjX3NldF9hZGFwZGF0YSgmaTJjLT5hZGFwdGVyLCBpMmMpOworCWkyYy0+YWRhcHRlci5hbGdvX2RhdGEgPSAmaTJjLT5hbGdvLmJpdDsKKwlpMmMtPmFsZ28uYml0LnNldHNkYSA9IHNldF9kYXRhOworCWkyYy0+YWxnby5iaXQuc2V0c2NsID0gc2V0X2Nsb2NrOworCWkyYy0+YWxnby5iaXQuZ2V0c2RhID0gZ2V0X2RhdGE7CisJaTJjLT5hbGdvLmJpdC5nZXRzY2wgPSBnZXRfY2xvY2s7CisJaTJjLT5hbGdvLmJpdC51ZGVsYXkgPSAyMDsKIAkvKiB2ZXNhIHNheXMgMi4yIG1zIGlzIGVub3VnaCwgMSBqaWZmeSBkb2Vzbid0IHNlZW0gdG8gYWx3YXlzCiAJICogbWFrZSB0aGlzLCAyIGppZmZpZXMgaXMgYSBsb3QgbW9yZSByZWxpYWJsZSAqLwotCWkyYy0+YWxnby50aW1lb3V0ID0gMjsKLQlpMmMtPmFsZ28uZGF0YSA9IGkyYzsKKwlpMmMtPmFsZ28uYml0LnRpbWVvdXQgPSAyOworCWkyYy0+YWxnby5iaXQuZGF0YSA9IGkyYzsKIAlpMmMtPnJlYyA9ICpyZWM7Ci0JaTJjX3NldF9hZGFwZGF0YSgmaTJjLT5hZGFwdGVyLCBpMmMpOwotCiAJcmV0ID0gaTJjX2JpdF9hZGRfYnVzKCZpMmMtPmFkYXB0ZXIpOwogCWlmIChyZXQpIHsKIAkJRFJNX0lORk8oIkZhaWxlZCB0byByZWdpc3RlciBpMmMgJXNcbiIsIG5hbWUpOwpAQCAtMTk0LDYgKzIwNiwzOCBAQAogCiB9CiAKK3N0cnVjdCByYWRlb25faTJjX2NoYW4gKnJhZGVvbl9pMmNfY3JlYXRlX2RwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCSAgICAgc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyAqcmVjLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHJhZGVvbl9pMmNfY2hhbiAqaTJjOworCWludCByZXQ7CisKKwlpMmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmFkZW9uX2kyY19jaGFuKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGkyYyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWkyYy0+cmVjID0gKnJlYzsKKwlpMmMtPmFkYXB0ZXIub3duZXIgPSBUSElTX01PRFVMRTsKKwlpMmMtPmRldiA9IGRldjsKKwlpMmNfc2V0X2FkYXBkYXRhKCZpMmMtPmFkYXB0ZXIsIGkyYyk7CisJaTJjLT5hZGFwdGVyLmFsZ29fZGF0YSA9ICZpMmMtPmFsZ28uZHA7CisJaTJjLT5hbGdvLmRwLmF1eF9jaCA9IHJhZGVvbl9kcF9pMmNfYXV4X2NoOworCWkyYy0+YWxnby5kcC5hZGRyZXNzID0gMDsKKwlyZXQgPSBpMmNfZHBfYXV4X2FkZF9idXMoJmkyYy0+YWRhcHRlcik7CisJaWYgKHJldCkgeworCQlEUk1fSU5GTygiRmFpbGVkIHRvIHJlZ2lzdGVyIGkyYyAlc1xuIiwgbmFtZSk7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJcmV0dXJuIGkyYzsKK291dF9mcmVlOgorCWtmcmVlKGkyYyk7CisJcmV0dXJuIE5VTEw7CisKK30KKworCiB2b2lkIHJhZGVvbl9pMmNfZGVzdHJveShzdHJ1Y3QgcmFkZW9uX2kyY19jaGFuICppMmMpCiB7CiAJaWYgKCFpMmMpCkBAIC0yMDcsMyArMjUxLDU5IEBACiB7CiAJcmV0dXJuIE5VTEw7CiB9CisKK3ZvaWQgcmFkZW9uX2kyY19zd19nZXRfYnl0ZShzdHJ1Y3QgcmFkZW9uX2kyY19jaGFuICppMmNfYnVzLAorCQkJICAgIHU4IHNsYXZlX2FkZHIsCisJCQkgICAgdTggYWRkciwKKwkJCSAgICB1OCAqdmFsKQoreworCXU4IG91dF9idWZbMl07CisJdTggaW5fYnVmWzJdOworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKKwkJeworCQkJLmFkZHIgPSBzbGF2ZV9hZGRyLAorCQkJLmZsYWdzID0gMCwKKwkJCS5sZW4gPSAxLAorCQkJLmJ1ZiA9IG91dF9idWYsCisJCX0sCisJCXsKKwkJCS5hZGRyID0gc2xhdmVfYWRkciwKKwkJCS5mbGFncyA9IEkyQ19NX1JELAorCQkJLmxlbiA9IDEsCisJCQkuYnVmID0gaW5fYnVmLAorCQl9CisJfTsKKworCW91dF9idWZbMF0gPSBhZGRyOworCW91dF9idWZbMV0gPSAwOworCisJaWYgKGkyY190cmFuc2ZlcigmaTJjX2J1cy0+YWRhcHRlciwgbXNncywgMikgPT0gMikgeworCQkqdmFsID0gaW5fYnVmWzBdOworCQlEUk1fREVCVUcoInZhbCA9IDB4JTAyeFxuIiwgKnZhbCk7CisJfSBlbHNlIHsKKwkJRFJNX0VSUk9SKCJpMmMgMHglMDJ4IDB4JTAyeCByZWFkIGZhaWxlZFxuIiwKKwkJCSAgYWRkciwgKnZhbCk7CisJfQorfQorCit2b2lkIHJhZGVvbl9pMmNfc3dfcHV0X2J5dGUoc3RydWN0IHJhZGVvbl9pMmNfY2hhbiAqaTJjX2J1cywKKwkJCSAgICB1OCBzbGF2ZV9hZGRyLAorCQkJICAgIHU4IGFkZHIsCisJCQkgICAgdTggdmFsKQoreworCXVpbnQ4X3Qgb3V0X2J1ZlsyXTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CisJCS5hZGRyID0gc2xhdmVfYWRkciwKKwkJLmZsYWdzID0gMCwKKwkJLmxlbiA9IDIsCisJCS5idWYgPSBvdXRfYnVmLAorCX07CisKKwlvdXRfYnVmWzBdID0gYWRkcjsKKwlvdXRfYnVmWzFdID0gdmFsOworCisJaWYgKGkyY190cmFuc2ZlcigmaTJjX2J1cy0+YWRhcHRlciwgJm1zZywgMSkgIT0gMSkKKwkJRFJNX0VSUk9SKCJpMmMgMHglMDJ4IDB4JTAyeCB3cml0ZSBmYWlsZWRcbiIsCisJCQkgIGFkZHIsIHZhbCk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2lycV9rbXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2lycV9rbXMuYwppbmRleCBhMGZlNjIzLi45MjIzMjk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pcnFfa21zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faXJxX2ttcy5jCkBAIC0zOSwxMSArMzksMzIgQEAKIAlyZXR1cm4gcmFkZW9uX2lycV9wcm9jZXNzKHJkZXYpOwogfQogCisvKgorICogSGFuZGxlIGhvdHBsdWcgZXZlbnRzIG91dHNpZGUgdGhlIGludGVycnVwdCBoYW5kbGVyIHByb3Blci4KKyAqLworc3RhdGljIHZvaWQgcmFkZW9uX2hvdHBsdWdfd29ya19mdW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcmFkZW9uX2RldmljZSwKKwkJCQkJCSAgaG90cGx1Z193b3JrKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmRldi0+ZGRldjsKKwlzdHJ1Y3QgZHJtX21vZGVfY29uZmlnICptb2RlX2NvbmZpZyA9ICZkZXYtPm1vZGVfY29uZmlnOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisKKwlpZiAobW9kZV9jb25maWctPm51bV9jb25uZWN0b3IpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZtb2RlX2NvbmZpZy0+Y29ubmVjdG9yX2xpc3QsIGhlYWQpCisJCQlyYWRlb25fY29ubmVjdG9yX2hvdHBsdWcoY29ubmVjdG9yKTsKKwl9CisJLyogSnVzdCBmaXJlIG9mZiBhIHVldmVudCBhbmQgbGV0IHVzZXJzcGFjZSB0ZWxsIHVzIHdoYXQgdG8gZG8gKi8KKwlkcm1fc3lzZnNfaG90cGx1Z19ldmVudChkZXYpOworfQorCiB2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3ByZWluc3RhbGxfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGk7CiAKKwlJTklUX1dPUksoJnJkZXYtPmhvdHBsdWdfd29yaywgcmFkZW9uX2hvdHBsdWdfd29ya19mdW5jKTsKKwogCS8qIERpc2FibGUgKmFsbCogaW50ZXJydXB0cyAqLwogCXJkZXYtPmlycS5zd19pbnQgPSBmYWxzZTsKIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CkBAIC04NywxNyArMTA4LDI1IEBACiAKIAlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fU0lOR0xFX0NSVEMpCiAJCW51bV9jcnRjID0gMTsKLQorCXNwaW5fbG9ja19pbml0KCZyZGV2LT5pcnEuc3dfbG9jayk7CiAJciA9IGRybV92YmxhbmtfaW5pdChyZGV2LT5kZGV2LCBudW1fY3J0Yyk7CiAJaWYgKHIpIHsKIAkJcmV0dXJuIHI7CiAJfQogCS8qIGVuYWJsZSBtc2kgKi8KIAlyZGV2LT5tc2lfZW5hYmxlZCA9IDA7Ci0JaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX1JWMzgwKSB7CisJLyogTVNJcyBkb24ndCBzZWVtIHRvIHdvcmsgb24gbXkgcnM3ODA7CisJICogbm90IHN1cmUgYWJvdXQgcnM4ODAgb3Igb3RoZXIgcnM3ODBzLgorCSAqIE5lZWRzIG1vcmUgaW52ZXN0aWdhdGlvbi4KKwkgKi8KKwlpZiAoKHJkZXYtPmZhbWlseSA+PSBDSElQX1JWMzgwKSAmJgorCSAgICAocmRldi0+ZmFtaWx5ICE9IENISVBfUlM3ODApICYmCisJICAgIChyZGV2LT5mYW1pbHkgIT0gQ0hJUF9SUzg4MCkpIHsKIAkJaW50IHJldCA9IHBjaV9lbmFibGVfbXNpKHJkZXYtPnBkZXYpOwotCQlpZiAoIXJldCkKKwkJaWYgKCFyZXQpIHsKIAkJCXJkZXYtPm1zaV9lbmFibGVkID0gMTsKKwkJCURSTV9JTkZPKCJyYWRlb246IHVzaW5nIE1TSS5cbiIpOworCQl9CiAJfQogCWRybV9pcnFfaW5zdGFsbChyZGV2LT5kZGV2KTsKIAlyZGV2LT5pcnEuaW5zdGFsbGVkID0gdHJ1ZTsKQEAgLTExNCwzICsxNDMsMjkgQEAKIAkJCXBjaV9kaXNhYmxlX21zaShyZGV2LT5wZGV2KTsKIAl9CiB9CisKK3ZvaWQgcmFkZW9uX2lycV9rbXNfc3dfaXJxX2dldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJkZXYtPmlycS5zd19sb2NrLCBpcnFmbGFncyk7CisJaWYgKHJkZXYtPmRkZXYtPmlycV9lbmFibGVkICYmICgrK3JkZXYtPmlycS5zd19yZWZjb3VudCA9PSAxKSkgeworCQlyZGV2LT5pcnEuc3dfaW50ID0gdHJ1ZTsKKwkJcmFkZW9uX2lycV9zZXQocmRldik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJkZXYtPmlycS5zd19sb2NrLCBpcnFmbGFncyk7Cit9CisKK3ZvaWQgcmFkZW9uX2lycV9rbXNfc3dfaXJxX3B1dChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJkZXYtPmlycS5zd19sb2NrLCBpcnFmbGFncyk7CisJQlVHX09OKHJkZXYtPmRkZXYtPmlycV9lbmFibGVkICYmIHJkZXYtPmlycS5zd19yZWZjb3VudCA8PSAwKTsKKwlpZiAocmRldi0+ZGRldi0+aXJxX2VuYWJsZWQgJiYgKC0tcmRldi0+aXJxLnN3X3JlZmNvdW50ID09IDApKSB7CisJCXJkZXYtPmlycS5zd19pbnQgPSBmYWxzZTsKKwkJcmFkZW9uX2lycV9zZXQocmRldik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJkZXYtPmlycS5zd19sb2NrLCBpcnFmbGFncyk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ttcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fa21zLmMKaW5kZXggYmExMjg2Mi4uZjIzYjA1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fa21zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fa21zLmMKQEAgLTMwLDEwICszMCwxOSBAQAogI2luY2x1ZGUgInJhZGVvbi5oIgogI2luY2x1ZGUgInJhZGVvbl9kcm0uaCIKIAoraW50IHJhZGVvbl9kcml2ZXJfdW5sb2FkX2ttcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAotLyoKLSAqIERyaXZlciBsb2FkL3VubG9hZAotICovCisJaWYgKHJkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcmFkZW9uX21vZGVzZXRfZmluaShyZGV2KTsKKwlyYWRlb25fZGV2aWNlX2ZpbmkocmRldik7CisJa2ZyZWUocmRldik7CisJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKIGludCByYWRlb25fZHJpdmVyX2xvYWRfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXY7CkBAIC02MiwzMSArNzEsMjAgQEAKIAkgKi8KIAlyID0gcmFkZW9uX2RldmljZV9pbml0KHJkZXYsIGRldiwgZGV2LT5wZGV2LCBmbGFncyk7CiAJaWYgKHIpIHsKLQkJRFJNX0VSUk9SKCJGYXRhbCBlcnJvciB3aGlsZSB0cnlpbmcgdG8gaW5pdGlhbGl6ZSByYWRlb24uXG4iKTsKLQkJcmV0dXJuIHI7CisJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiRmF0YWwgZXJyb3IgZHVyaW5nIEdQVSBpbml0XG4iKTsKKwkJZ290byBvdXQ7CiAJfQogCS8qIEFnYWluIG1vZGVzZXRfaW5pdCBzaG91bGQgZmFpbCBvbmx5IG9uIGZhdGFsIGVycm9yCiAJICogb3RoZXJ3aXNlIGl0IHNob3VsZCBwcm92aWRlIGVub3VnaCBmdW5jdGlvbmFsaXRpZXMKIAkgKiBmb3Igc2hhZG93ZmIgdG8gcnVuCiAJICovCiAJciA9IHJhZGVvbl9tb2Rlc2V0X2luaXQocmRldik7Ci0JaWYgKHIpIHsKLQkJcmV0dXJuIHI7Ci0JfQotCXJldHVybiAwOwotfQotCi1pbnQgcmFkZW9uX2RyaXZlcl91bmxvYWRfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCi0JaWYgKHJkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JcmFkZW9uX21vZGVzZXRfZmluaShyZGV2KTsKLQlyYWRlb25fZGV2aWNlX2ZpbmkocmRldik7Ci0Ja2ZyZWUocmRldik7Ci0JZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7Ci0JcmV0dXJuIDA7CisJaWYgKHIpCisJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiRmF0YWwgZXJyb3IgZHVyaW5nIG1vZGVzZXQgaW5pdFxuIik7CitvdXQ6CisJaWYgKHIpCisJCXJhZGVvbl9kcml2ZXJfdW5sb2FkX2ttcyhkZXYpOworCXJldHVybiByOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2xlZ2FjeV9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9sZWdhY3lfY3J0Yy5jCmluZGV4IDhkMGI3YWEuLmI4MmVkZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2xlZ2FjeV9jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbGVnYWN5X2NydGMuYwpAQCAtMzAsNiArMzAsMTggQEAKICNpbmNsdWRlICJyYWRlb24uaCIKICNpbmNsdWRlICJhdG9tLmgiCiAKK3N0YXRpYyB2b2lkIHJhZGVvbl9vdmVyc2Nhbl9zZXR1cChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gdG9fcmFkZW9uX2NydGMoY3J0Yyk7CisKKwlXUkVHMzIoUkFERU9OX09WUl9DTFIgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIDApOworCVdSRUczMihSQURFT05fT1ZSX1dJRF9MRUZUX1JJR0hUICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LCAwKTsKKwlXUkVHMzIoUkFERU9OX09WUl9XSURfVE9QX0JPVFRPTSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgMCk7Cit9CisKIHN0YXRpYyB2b2lkIHJhZGVvbl9sZWdhY3lfcm14X21vZGVfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKIAkJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCiAJCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQpAQCAtMjkyLDggKzMwNCw3IEBACiAJdWludDMyX3QgbWFzazsKIAogCWlmIChyYWRlb25fY3J0Yy0+Y3J0Y19pZCkKLQkJbWFzayA9IChSQURFT05fQ1JUQzJfRU4gfAotCQkJUkFERU9OX0NSVEMyX0RJU1BfRElTIHwKKwkJbWFzayA9IChSQURFT05fQ1JUQzJfRElTUF9ESVMgfAogCQkJUkFERU9OX0NSVEMyX1ZTWU5DX0RJUyB8CiAJCQlSQURFT05fQ1JUQzJfSFNZTkNfRElTIHwKIAkJCVJBREVPTl9DUlRDMl9ESVNQX1JFUV9FTl9CKTsKQEAgLTMwNSw3ICszMTYsNyBAQAogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgRFJNX01PREVfRFBNU19PTjoKIAkJaWYgKHJhZGVvbl9jcnRjLT5jcnRjX2lkKQotCQkJV1JFRzMyX1AoUkFERU9OX0NSVEMyX0dFTl9DTlRMLCBSQURFT05fQ1JUQzJfRU4sIH5tYXNrKTsKKwkJCVdSRUczMl9QKFJBREVPTl9DUlRDMl9HRU5fQ05UTCwgUkFERU9OX0NSVEMyX0VOLCB+KFJBREVPTl9DUlRDMl9FTiB8IG1hc2spKTsKIAkJZWxzZSB7CiAJCQlXUkVHMzJfUChSQURFT05fQ1JUQ19HRU5fQ05UTCwgUkFERU9OX0NSVENfRU4sIH4oUkFERU9OX0NSVENfRU4gfAogCQkJCQkJCQkJIFJBREVPTl9DUlRDX0RJU1BfUkVRX0VOX0IpKTsKQEAgLTMxOSw3ICszMzAsNyBAQAogCWNhc2UgRFJNX01PREVfRFBNU19PRkY6CiAJCWRybV92YmxhbmtfcHJlX21vZGVzZXQoZGV2LCByYWRlb25fY3J0Yy0+Y3J0Y19pZCk7CiAJCWlmIChyYWRlb25fY3J0Yy0+Y3J0Y19pZCkKLQkJCVdSRUczMl9QKFJBREVPTl9DUlRDMl9HRU5fQ05UTCwgbWFzaywgfm1hc2spOworCQkJV1JFRzMyX1AoUkFERU9OX0NSVEMyX0dFTl9DTlRMLCBtYXNrLCB+KFJBREVPTl9DUlRDMl9FTiB8IG1hc2spKTsKIAkJZWxzZSB7CiAJCQlXUkVHMzJfUChSQURFT05fQ1JUQ19HRU5fQ05UTCwgUkFERU9OX0NSVENfRElTUF9SRVFfRU5fQiwgfihSQURFT05fQ1JUQ19FTiB8CiAJCQkJCQkJCQkJICAgIFJBREVPTl9DUlRDX0RJU1BfUkVRX0VOX0IpKTsKQEAgLTQwMCwxNCArNDExLDIxIEBACiAJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHRvX3JhZGVvbl9jcnRjKGNydGMpOwogCXN0cnVjdCByYWRlb25fZnJhbWVidWZmZXIgKnJhZGVvbl9mYjsKIAlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgcmFkZW9uX2JvICpyYm87CiAJdWludDY0X3QgYmFzZTsKIAl1aW50MzJfdCBjcnRjX29mZnNldCwgY3J0Y19vZmZzZXRfY250bCwgY3J0Y190aWxlX3gwX3kwID0gMDsKIAl1aW50MzJfdCBjcnRjX3BpdGNoLCBwaXRjaF9waXhlbHM7CiAJdWludDMyX3QgdGlsaW5nX2ZsYWdzOwogCWludCBmb3JtYXQ7CiAJdWludDMyX3QgZ2VuX2NudGxfcmVnLCBnZW5fY250bF92YWw7CisJaW50IHI7CiAKIAlEUk1fREVCVUcoIlxuIik7CisJLyogbm8gZmIgYm91bmQgKi8KKwlpZiAoIWNydGMtPmZiKSB7CisJCURSTV9ERUJVRygiTm8gRkIgYm91bmRcbiIpOworCQlyZXR1cm4gMDsKKwl9CiAKIAlyYWRlb25fZmIgPSB0b19yYWRlb25fZnJhbWVidWZmZXIoY3J0Yy0+ZmIpOwogCkBAIC00MzEsMTAgKzQ0OSwyMiBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCisJLyogUGluIGZyYW1lYnVmZmVyICYgZ2V0IHRpbGxpbmcgaW5mb3JtYXRpb25zICovCiAJb2JqID0gcmFkZW9uX2ZiLT5vYmo7Ci0JaWYgKHJhZGVvbl9nZW1fb2JqZWN0X3BpbihvYmosIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sICZiYXNlKSkgeworCXJibyA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CisJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJibywgZmFsc2UpOworCWlmICh1bmxpa2VseShyICE9IDApKQorCQlyZXR1cm4gcjsKKwlyID0gcmFkZW9uX2JvX3BpbihyYm8sIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sICZiYXNlKTsKKwlpZiAodW5saWtlbHkociAhPSAwKSkgeworCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJibyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KKwlyYWRlb25fYm9fZ2V0X3RpbGluZ19mbGFncyhyYm8sICZ0aWxpbmdfZmxhZ3MsIE5VTEwpOworCXJhZGVvbl9ib191bnJlc2VydmUocmJvKTsKKwlpZiAodGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19NSUNSTykKKwkJRFJNX0VSUk9SKCJ0cnlpbmcgdG8gc2Nhbm91dCBtaWNyb3RpbGVkIGJ1ZmZlclxuIik7CisKIAkvKiBpZiBzY2Fub3V0IHdhcyBpbiBHVFQgdGhpcyByZWFsbHkgd291bGRuJ3Qgd29yayAqLwogCS8qIGNydGMgb2Zmc2V0IGlzIGZyb20gZGlzcGxheSBiYXNlIGFkZHIgbm90IEZCIGxvY2F0aW9uICovCiAJcmFkZW9uX2NydGMtPmxlZ2FjeV9kaXNwbGF5X2Jhc2VfYWRkciA9IHJkZXYtPm1jLnZyYW1fbG9jYXRpb247CkBAIC00NDksMTAgKzQ3OSw2IEBACiAJCSAgICAgICAoY3J0Yy0+ZmItPmJpdHNfcGVyX3BpeGVsICogOCkpOwogCWNydGNfcGl0Y2ggfD0gY3J0Y19waXRjaCA8PCAxNjsKIAotCXJhZGVvbl9vYmplY3RfZ2V0X3RpbGluZ19mbGFncyhvYmotPmRyaXZlcl9wcml2YXRlLAotCQkJCSAgICAgICAmdGlsaW5nX2ZsYWdzLCBOVUxMKTsKLQlpZiAodGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19NSUNSTykKLQkJRFJNX0VSUk9SKCJ0cnlpbmcgdG8gc2Nhbm91dCBtaWNyb3RpbGVkIGJ1ZmZlclxuIik7CiAKIAlpZiAodGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19NQUNSTykgewogCQlpZiAoQVNJQ19JU19SMzAwKHJkZXYpKQpAQCAtNTMwLDcgKzU1NiwxMiBAQAogCiAJaWYgKG9sZF9mYiAmJiBvbGRfZmIgIT0gY3J0Yy0+ZmIpIHsKIAkJcmFkZW9uX2ZiID0gdG9fcmFkZW9uX2ZyYW1lYnVmZmVyKG9sZF9mYik7Ci0JCXJhZGVvbl9nZW1fb2JqZWN0X3VucGluKHJhZGVvbl9mYi0+b2JqKTsKKwkJcmJvID0gcmFkZW9uX2ZiLT5vYmotPmRyaXZlcl9wcml2YXRlOworCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmJvLCBmYWxzZSk7CisJCWlmICh1bmxpa2VseShyICE9IDApKQorCQkJcmV0dXJuIHI7CisJCXJhZGVvbl9ib191bnBpbihyYm8pOworCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJibyk7CiAJfQogCiAJLyogQnl0ZXMgcGVyIHBpeGVsIG1heSBoYXZlIGNoYW5nZWQgKi8KQEAgLTY0MiwxMiArNjczLDggQEAKIAkJdWludDMyX3QgY3J0YzJfZ2VuX2NudGw7CiAJCXVpbnQzMl90IGRpc3AyX21lcmdlX2NudGw7CiAKLQkJLyogY2hlY2sgdG8gc2VlIGlmIFRWIERBQyBpcyBlbmFibGVkIGZvciBhbm90aGVyIGNydGMgYW5kIGtlZXAgaXQgZW5hYmxlZCAqLwotCQlpZiAoUlJFRzMyKFJBREVPTl9DUlRDMl9HRU5fQ05UTCkgJiBSQURFT05fQ1JUQzJfQ1JUMl9PTikKLQkJCWNydGMyX2dlbl9jbnRsID0gUkFERU9OX0NSVEMyX0NSVDJfT047Ci0JCWVsc2UKLQkJCWNydGMyX2dlbl9jbnRsID0gMDsKLQorCQkvKiBpZiBUViBEQUMgaXMgZW5hYmxlZCBmb3IgYW5vdGhlciBjcnRjIGFuZCBrZWVwIGl0IGVuYWJsZWQgKi8KKwkJY3J0YzJfZ2VuX2NudGwgPSBSUkVHMzIoUkFERU9OX0NSVEMyX0dFTl9DTlRMKSAmIDB4MDA3MTgwODA7CiAJCWNydGMyX2dlbl9jbnRsIHw9ICgoZm9ybWF0IDw8IDgpCiAJCQkJICAgfCBSQURFT05fQ1JUQzJfVlNZTkNfRElTCiAJCQkJICAgfCBSQURFT05fQ1JUQzJfSFNZTkNfRElTCkBAIC02NzYsNyArNzAzLDggQEAKIAkJdWludDMyX3QgY3J0Y19leHRfY250bDsKIAkJdWludDMyX3QgZGlzcF9tZXJnZV9jbnRsOwogCi0JCWNydGNfZ2VuX2NudGwgPSAoUkFERU9OX0NSVENfRVhUX0RJU1BfRU4KKwkJY3J0Y19nZW5fY250bCA9IFJSRUczMihSQURFT05fQ1JUQ19HRU5fQ05UTCkgJiAweDAwNzE4MDAwOworCQljcnRjX2dlbl9jbnRsIHw9IChSQURFT05fQ1JUQ19FWFRfRElTUF9FTgogCQkJCSB8IChmb3JtYXQgPDwgOCkKIAkJCQkgfCBSQURFT05fQ1JUQ19ESVNQX1JFUV9FTl9CCiAJCQkJIHwgKChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfREJMU0NBTikKQEAgLTc3OSwxNSArODA3LDE3IEBACiAJCQlpZiAoZW5jb2Rlci0+ZW5jb2Rlcl90eXBlICE9IERSTV9NT0RFX0VOQ09ERVJfREFDKQogCQkJCXBsbF9mbGFncyB8PSBSQURFT05fUExMX05PX09ERF9QT1NUX0RJVjsKIAkJCWlmIChlbmNvZGVyLT5lbmNvZGVyX3R5cGUgPT0gRFJNX01PREVfRU5DT0RFUl9MVkRTKSB7Ci0JCQkJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCQkJCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9sdmRzICpsdmRzID0gKHN0cnVjdCByYWRlb25fZW5jb2Rlcl9sdmRzICopcmFkZW9uX2VuY29kZXItPmVuY19wcml2OwotCQkJCWlmIChsdmRzKSB7Ci0JCQkJCWlmIChsdmRzLT51c2VfYmlvc19kaXZpZGVycykgewotCQkJCQkJcGxsX3JlZl9kaXYgPSBsdmRzLT5wYW5lbF9yZWZfZGl2aWRlcjsKLQkJCQkJCXBsbF9mYl9wb3N0X2RpdiAgID0gKGx2ZHMtPnBhbmVsX2ZiX2RpdmlkZXIgfAotCQkJCQkJCQkgICAgIChsdmRzLT5wYW5lbF9wb3N0X2RpdmlkZXIgPDwgMTYpKTsKLQkJCQkJCWh0b3RhbF9jbnRsICA9IDA7Ci0JCQkJCQl1c2VfYmlvc19kaXZzID0gdHJ1ZTsKKwkJCQlpZiAoIXJkZXYtPmlzX2F0b21fYmlvcykgeworCQkJCQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJCQkJCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9sdmRzICpsdmRzID0gKHN0cnVjdCByYWRlb25fZW5jb2Rlcl9sdmRzICopcmFkZW9uX2VuY29kZXItPmVuY19wcml2OworCQkJCQlpZiAobHZkcykgeworCQkJCQkJaWYgKGx2ZHMtPnVzZV9iaW9zX2RpdmlkZXJzKSB7CisJCQkJCQkJcGxsX3JlZl9kaXYgPSBsdmRzLT5wYW5lbF9yZWZfZGl2aWRlcjsKKwkJCQkJCQlwbGxfZmJfcG9zdF9kaXYgICA9IChsdmRzLT5wYW5lbF9mYl9kaXZpZGVyIHwKKwkJCQkJCQkJCSAgICAgKGx2ZHMtPnBhbmVsX3Bvc3RfZGl2aWRlciA8PCAxNikpOworCQkJCQkJCWh0b3RhbF9jbnRsICA9IDA7CisJCQkJCQkJdXNlX2Jpb3NfZGl2cyA9IHRydWU7CisJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQkJcGxsX2ZsYWdzIHw9IFJBREVPTl9QTExfVVNFX1JFRl9ESVY7CkBAIC0xMDI3LDYgKzEwNTcsNyBAQAogCXJhZGVvbl9jcnRjX3NldF9iYXNlKGNydGMsIHgsIHksIG9sZF9mYik7CiAJcmFkZW9uX3NldF9jcnRjX3RpbWluZyhjcnRjLCBhZGp1c3RlZF9tb2RlKTsKIAlyYWRlb25fc2V0X3BsbChjcnRjLCBhZGp1c3RlZF9tb2RlKTsKKwlyYWRlb25fb3ZlcnNjYW5fc2V0dXAoY3J0YywgYWRqdXN0ZWRfbW9kZSk7CiAJaWYgKHJhZGVvbl9jcnRjLT5jcnRjX2lkID09IDApIHsKIAkJcmFkZW9uX2xlZ2FjeV9ybXhfbW9kZV9zZXQoY3J0YywgbW9kZSwgYWRqdXN0ZWRfbW9kZSk7CiAJfSBlbHNlIHsKQEAgLTEwNDIsMTIgKzEwNzMsMjkgQEAKIAogc3RhdGljIHZvaWQgcmFkZW9uX2NydGNfcHJlcGFyZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCiB7Ci0JcmFkZW9uX2NydGNfZHBtcyhjcnRjLCBEUk1fTU9ERV9EUE1TX09GRik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGNpOworCisJLyoKKwkqIFRoZSBoYXJkd2FyZSB3ZWRnZXMgc29tZXRpbWVzIGlmIHlvdSByZWNvbmZpZ3VyZSBvbmUgQ1JUQworCSogd2hpbHN0IGFub3RoZXIgaXMgcnVubmluZyAoc2VlIGZkbyBidWcgIzI0NjExKS4KKwkqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0Y2ksICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkKKwkJcmFkZW9uX2NydGNfZHBtcyhjcnRjaSwgRFJNX01PREVfRFBNU19PRkYpOwogfQogCiBzdGF0aWMgdm9pZCByYWRlb25fY3J0Y19jb21taXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQogewotCXJhZGVvbl9jcnRjX2RwbXMoY3J0YywgRFJNX01PREVfRFBNU19PTik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGNpOworCisJLyoKKwkqIFJlZW5hYmxlIHRoZSBDUlRDcyB0aGF0IHNob3VsZCBiZSBydW5uaW5nLgorCSovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjaSwgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CisJCWlmIChjcnRjaS0+ZW5hYmxlZCkKKwkJCXJhZGVvbl9jcnRjX2RwbXMoY3J0Y2ksIERSTV9NT0RFX0RQTVNfT04pOworCX0KIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY3J0Y19oZWxwZXJfZnVuY3MgbGVnYWN5X2hlbHBlcl9mdW5jcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2xlZ2FjeV9lbmNvZGVycy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbGVnYWN5X2VuY29kZXJzLmMKaW5kZXggMDAzODIxMi4uZGYwMDUxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbGVnYWN5X2VuY29kZXJzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbGVnYWN5X2VuY29kZXJzLmMKQEAgLTEzNiw3ICsxMzYsMTQgQEAKIAlsdmRzX3BsbF9jbnRsICY9IH5SQURFT05fTFZEU19QTExfRU47CiAKIAlsdmRzX3NzX2dlbl9jbnRsID0gUlJFRzMyKFJBREVPTl9MVkRTX1NTX0dFTl9DTlRMKTsKLQlpZiAoKCFyZGV2LT5pc19hdG9tX2Jpb3MpKSB7CisJaWYgKHJkZXYtPmlzX2F0b21fYmlvcykgeworCQkvKiBMVkRTX0dFTl9DTlRMIHBhcmFtZXRlcnMgYXJlIGNvbXB1dGVkIGluIExWRFNFbmNvZGVyQ29udHJvbAorCQkgKiBuZWVkIHRvIGNhbGwgdGhhdCBvbiByZXN1bWUgdG8gc2V0IHVwIHRoZSByZWcgcHJvcGVybHkuCisJCSAqLworCQlyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPSBhZGp1c3RlZF9tb2RlLT5jbG9jazsKKwkJYXRvbWJpb3NfZGlnaXRhbF9zZXR1cChlbmNvZGVyLCBQQU5FTF9FTkNPREVSX0FDVElPTl9FTkFCTEUpOworCQlsdmRzX2dlbl9jbnRsID0gUlJFRzMyKFJBREVPTl9MVkRTX0dFTl9DTlRMKTsKKwl9IGVsc2UgewogCQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfbHZkcyAqbHZkcyA9IChzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfbHZkcyAqKXJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdjsKIAkJaWYgKGx2ZHMpIHsKIAkJCURSTV9ERUJVRygiYmlvcyBMVkRTX0dFTl9DTlRMOiAweCV4XG4iLCBsdmRzLT5sdmRzX2dlbl9jbnRsKTsKQEAgLTE0Nyw4ICsxNTQsNyBAQAogCQkJCQkgICAgIChsdmRzLT5wYW5lbF9ibG9uX2RlbGF5IDw8IFJBREVPTl9MVkRTX1BXUlNFUV9ERUxBWTJfU0hJRlQpKTsKIAkJfSBlbHNlCiAJCQlsdmRzX2dlbl9jbnRsID0gUlJFRzMyKFJBREVPTl9MVkRTX0dFTl9DTlRMKTsKLQl9IGVsc2UKLQkJbHZkc19nZW5fY250bCA9IFJSRUczMihSQURFT05fTFZEU19HRU5fQ05UTCk7CisJfQogCWx2ZHNfZ2VuX2NudGwgfD0gUkFERU9OX0xWRFNfRElTUExBWV9ESVM7CiAJbHZkc19nZW5fY250bCAmPSB+KFJBREVPTl9MVkRTX09OIHwKIAkJCSAgIFJBREVPTl9MVkRTX0JMT04gfApAQCAtMTg0LDkgKzE5MCw5IEBACiAJCXJhZGVvbl9jb21iaW9zX2VuY29kZXJfY3J0Y19zY3JhdGNoX3JlZ3MoZW5jb2RlciwgcmFkZW9uX2NydGMtPmNydGNfaWQpOwogfQogCi1zdGF0aWMgYm9vbCByYWRlb25fbGVnYWN5X2x2ZHNfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCi0JCQkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCi0JCQkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCitzdGF0aWMgYm9vbCByYWRlb25fbGVnYWN5X21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKIHsKIAlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CiAKQEAgLTE5NCwxNSArMjAwLDIyIEBACiAJcmFkZW9uX2VuY29kZXJfc2V0X2FjdGl2ZV9kZXZpY2UoZW5jb2Rlcik7CiAJZHJtX21vZGVfc2V0X2NydGNpbmZvKGFkanVzdGVkX21vZGUsIDApOwogCi0JaWYgKHJhZGVvbl9lbmNvZGVyLT5ybXhfdHlwZSAhPSBSTVhfT0ZGKQotCQlyYWRlb25fcm14X21vZGVfZml4dXAoZW5jb2RlciwgbW9kZSwgYWRqdXN0ZWRfbW9kZSk7CisJLyogZ2V0IHRoZSBuYXRpdmUgbW9kZSBmb3IgTFZEUyAqLworCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpIHsKKwkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm5hdGl2ZV9tb2RlID0gJnJhZGVvbl9lbmNvZGVyLT5uYXRpdmVfbW9kZTsKKwkJaW50IG1vZGVfaWQgPSBhZGp1c3RlZF9tb2RlLT5iYXNlLmlkOworCQkqYWRqdXN0ZWRfbW9kZSA9ICpuYXRpdmVfbW9kZTsKKwkJYWRqdXN0ZWRfbW9kZS0+aGRpc3BsYXkgPSBtb2RlLT5oZGlzcGxheTsKKwkJYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXkgPSBtb2RlLT52ZGlzcGxheTsKKwkJYWRqdXN0ZWRfbW9kZS0+YmFzZS5pZCA9IG1vZGVfaWQ7CisJfQogCiAJcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIHJhZGVvbl9sZWdhY3lfbHZkc19oZWxwZXJfZnVuY3MgPSB7CiAJLmRwbXMgPSByYWRlb25fbGVnYWN5X2x2ZHNfZHBtcywKLQkubW9kZV9maXh1cCA9IHJhZGVvbl9sZWdhY3lfbHZkc19tb2RlX2ZpeHVwLAorCS5tb2RlX2ZpeHVwID0gcmFkZW9uX2xlZ2FjeV9tb2RlX2ZpeHVwLAogCS5wcmVwYXJlID0gcmFkZW9uX2xlZ2FjeV9sdmRzX3ByZXBhcmUsCiAJLm1vZGVfc2V0ID0gcmFkZW9uX2xlZ2FjeV9sdmRzX21vZGVfc2V0LAogCS5jb21taXQgPSByYWRlb25fbGVnYWN5X2x2ZHNfY29tbWl0LApAQCAtMjE0LDE3ICsyMjcsNiBAQAogCS5kZXN0cm95ID0gcmFkZW9uX2VuY19kZXN0cm95LAogfTsKIAotc3RhdGljIGJvb2wgcmFkZW9uX2xlZ2FjeV9wcmltYXJ5X2RhY19tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKLQkJCQkJCSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKLQkJCQkJCSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKLXsKLQkvKiBzZXQgdGhlIGFjdGl2ZSBlbmNvZGVyIHRvIGNvbm5lY3RvciByb3V0aW5nICovCi0JcmFkZW9uX2VuY29kZXJfc2V0X2FjdGl2ZV9kZXZpY2UoZW5jb2Rlcik7Ci0JZHJtX21vZGVfc2V0X2NydGNpbmZvKGFkanVzdGVkX21vZGUsIDApOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KIHN0YXRpYyB2b2lkIHJhZGVvbl9sZWdhY3lfcHJpbWFyeV9kYWNfZHBtcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CkBAIC00MTAsNyArNDEyLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgcmFkZW9uX2xlZ2FjeV9wcmltYXJ5X2RhY19oZWxwZXJfZnVuY3MgPSB7CiAJLmRwbXMgPSByYWRlb25fbGVnYWN5X3ByaW1hcnlfZGFjX2RwbXMsCi0JLm1vZGVfZml4dXAgPSByYWRlb25fbGVnYWN5X3ByaW1hcnlfZGFjX21vZGVfZml4dXAsCisJLm1vZGVfZml4dXAgPSByYWRlb25fbGVnYWN5X21vZGVfZml4dXAsCiAJLnByZXBhcmUgPSByYWRlb25fbGVnYWN5X3ByaW1hcnlfZGFjX3ByZXBhcmUsCiAJLm1vZGVfc2V0ID0gcmFkZW9uX2xlZ2FjeV9wcmltYXJ5X2RhY19tb2RlX3NldCwKIAkuY29tbWl0ID0gcmFkZW9uX2xlZ2FjeV9wcmltYXJ5X2RhY19jb21taXQsCkBAIC00MjMsMTYgKzQyNSw2IEBACiAJLmRlc3Ryb3kgPSByYWRlb25fZW5jX2Rlc3Ryb3ksCiB9OwogCi1zdGF0aWMgYm9vbCByYWRlb25fbGVnYWN5X3RtZHNfaW50X21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAotCQkJCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKLQkJCQkJICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCi17Ci0KLQlkcm1fbW9kZV9zZXRfY3J0Y2luZm8oYWRqdXN0ZWRfbW9kZSwgMCk7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQogc3RhdGljIHZvaWQgcmFkZW9uX2xlZ2FjeV90bWRzX2ludF9kcG1zKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1vZGUpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKQEAgLTU4NCw3ICs1NzYsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyByYWRlb25fbGVnYWN5X3RtZHNfaW50X2hlbHBlcl9mdW5jcyA9IHsKIAkuZHBtcyA9IHJhZGVvbl9sZWdhY3lfdG1kc19pbnRfZHBtcywKLQkubW9kZV9maXh1cCA9IHJhZGVvbl9sZWdhY3lfdG1kc19pbnRfbW9kZV9maXh1cCwKKwkubW9kZV9maXh1cCA9IHJhZGVvbl9sZWdhY3lfbW9kZV9maXh1cCwKIAkucHJlcGFyZSA9IHJhZGVvbl9sZWdhY3lfdG1kc19pbnRfcHJlcGFyZSwKIAkubW9kZV9zZXQgPSByYWRlb25fbGVnYWN5X3RtZHNfaW50X21vZGVfc2V0LAogCS5jb21taXQgPSByYWRlb25fbGVnYWN5X3RtZHNfaW50X2NvbW1pdCwKQEAgLTU5NiwxNyArNTg4LDYgQEAKIAkuZGVzdHJveSA9IHJhZGVvbl9lbmNfZGVzdHJveSwKIH07CiAKLXN0YXRpYyBib29sIHJhZGVvbl9sZWdhY3lfdG1kc19leHRfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCi0JCQkJCSAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAotCQkJCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKLXsKLQkvKiBzZXQgdGhlIGFjdGl2ZSBlbmNvZGVyIHRvIGNvbm5lY3RvciByb3V0aW5nICovCi0JcmFkZW9uX2VuY29kZXJfc2V0X2FjdGl2ZV9kZXZpY2UoZW5jb2Rlcik7Ci0JZHJtX21vZGVfc2V0X2NydGNpbmZvKGFkanVzdGVkX21vZGUsIDApOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KIHN0YXRpYyB2b2lkIHJhZGVvbl9sZWdhY3lfdG1kc19leHRfZHBtcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CkBAIC02OTcsNiArNjc4LDggQEAKIAkJCS8qaWYgKG1vZGUtPmNsb2NrID4gMTY1MDAwKQogCQkJICBmcDJfZ2VuX2NudGwgfD0gUjMwMF9GUDJfRFZPX0RVQUxfQ0hBTk5FTF9FTjsqLwogCQl9CisJCWlmICghcmFkZW9uX2NvbWJpb3NfZXh0ZXJuYWxfdG1kc19zZXR1cChlbmNvZGVyKSkKKwkJCXJhZGVvbl9leHRlcm5hbF90bWRzX3NldHVwKGVuY29kZXIpOwogCX0KIAogCWlmIChyYWRlb25fY3J0Yy0+Y3J0Y19pZCA9PSAwKSB7CkBAIC03MjQsOSArNzA3LDIyIEBACiAJCXJhZGVvbl9jb21iaW9zX2VuY29kZXJfY3J0Y19zY3JhdGNoX3JlZ3MoZW5jb2RlciwgcmFkZW9uX2NydGMtPmNydGNfaWQpOwogfQogCitzdGF0aWMgdm9pZCByYWRlb25fZXh0X3RtZHNfZW5jX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfZXh0X3RtZHMgKnRtZHMgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7CisJaWYgKHRtZHMpIHsKKwkJaWYgKHRtZHMtPmkyY19idXMpCisJCQlyYWRlb25faTJjX2Rlc3Ryb3kodG1kcy0+aTJjX2J1cyk7CisJfQorCWtmcmVlKHJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdik7CisJZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKKwlrZnJlZShyYWRlb25fZW5jb2Rlcik7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIHJhZGVvbl9sZWdhY3lfdG1kc19leHRfaGVscGVyX2Z1bmNzID0gewogCS5kcG1zID0gcmFkZW9uX2xlZ2FjeV90bWRzX2V4dF9kcG1zLAotCS5tb2RlX2ZpeHVwID0gcmFkZW9uX2xlZ2FjeV90bWRzX2V4dF9tb2RlX2ZpeHVwLAorCS5tb2RlX2ZpeHVwID0gcmFkZW9uX2xlZ2FjeV9tb2RlX2ZpeHVwLAogCS5wcmVwYXJlID0gcmFkZW9uX2xlZ2FjeV90bWRzX2V4dF9wcmVwYXJlLAogCS5tb2RlX3NldCA9IHJhZGVvbl9sZWdhY3lfdG1kc19leHRfbW9kZV9zZXQsCiAJLmNvbW1pdCA9IHJhZGVvbl9sZWdhY3lfdG1kc19leHRfY29tbWl0LApAQCAtNzM1LDIwICs3MzEsOSBAQAogCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgcmFkZW9uX2xlZ2FjeV90bWRzX2V4dF9lbmNfZnVuY3MgPSB7Ci0JLmRlc3Ryb3kgPSByYWRlb25fZW5jX2Rlc3Ryb3ksCisJLmRlc3Ryb3kgPSByYWRlb25fZXh0X3RtZHNfZW5jX2Rlc3Ryb3ksCiB9OwogCi1zdGF0aWMgYm9vbCByYWRlb25fbGVnYWN5X3R2X2RhY19tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKLQkJCQkJICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAotCQkJCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCi17Ci0JLyogc2V0IHRoZSBhY3RpdmUgZW5jb2RlciB0byBjb25uZWN0b3Igcm91dGluZyAqLwotCXJhZGVvbl9lbmNvZGVyX3NldF9hY3RpdmVfZGV2aWNlKGVuY29kZXIpOwotCWRybV9tb2RlX3NldF9jcnRjaW5mbyhhZGp1c3RlZF9tb2RlLCAwKTsKLQotCXJldHVybiB0cnVlOwotfQotCiBzdGF0aWMgdm9pZCByYWRlb25fbGVnYWN5X3R2X2RhY19kcG1zKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1vZGUpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKQEAgLTEyNjUsNyArMTI1MCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIHJhZGVvbl9sZWdhY3lfdHZfZGFjX2hlbHBlcl9mdW5jcyA9IHsKIAkuZHBtcyA9IHJhZGVvbl9sZWdhY3lfdHZfZGFjX2RwbXMsCi0JLm1vZGVfZml4dXAgPSByYWRlb25fbGVnYWN5X3R2X2RhY19tb2RlX2ZpeHVwLAorCS5tb2RlX2ZpeHVwID0gcmFkZW9uX2xlZ2FjeV9tb2RlX2ZpeHVwLAogCS5wcmVwYXJlID0gcmFkZW9uX2xlZ2FjeV90dl9kYWNfcHJlcGFyZSwKIAkubW9kZV9zZXQgPSByYWRlb25fbGVnYWN5X3R2X2RhY19tb2RlX3NldCwKIAkuY29tbWl0ID0gcmFkZW9uX2xlZ2FjeV90dl9kYWNfY29tbWl0LApAQCAtMTMwMiw2ICsxMjg3LDI5IEBACiAJcmV0dXJuIHRtZHM7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfZXh0X3RtZHMgKnJhZGVvbl9sZWdhY3lfZ2V0X2V4dF90bWRzX2luZm8oc3RydWN0IHJhZGVvbl9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5iYXNlLmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyX2V4dF90bWRzICp0bWRzID0gTlVMTDsKKwlib29sIHJldDsKKworCWlmIChyZGV2LT5pc19hdG9tX2Jpb3MpCisJCXJldHVybiBOVUxMOworCisJdG1kcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByYWRlb25fZW5jb2Rlcl9leHRfdG1kcyksIEdGUF9LRVJORUwpOworCisJaWYgKCF0bWRzKQorCQlyZXR1cm4gTlVMTDsKKworCXJldCA9IHJhZGVvbl9sZWdhY3lfZ2V0X2V4dF90bWRzX2luZm9fZnJvbV9jb21iaW9zKGVuY29kZXIsIHRtZHMpOworCisJaWYgKHJldCA9PSBmYWxzZSkKKwkJcmFkZW9uX2xlZ2FjeV9nZXRfZXh0X3RtZHNfaW5mb19mcm9tX3RhYmxlKGVuY29kZXIsIHRtZHMpOworCisJcmV0dXJuIHRtZHM7Cit9CisKIHZvaWQKIHJhZGVvbl9hZGRfbGVnYWN5X2VuY29kZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgZW5jb2Rlcl9pZCwgdWludDMyX3Qgc3VwcG9ydGVkX2RldmljZSkKIHsKQEAgLTEzMjksNyArMTMzNyw2IEBACiAJCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gMHgxOwogCWVsc2UKIAkJZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgPSAweDM7Ci0JZW5jb2Rlci0+cG9zc2libGVfY2xvbmVzID0gMDsKIAogCXJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdiA9IE5VTEw7CiAKQEAgLTEzNzMsNyArMTM4MCw3IEBACiAJCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmcmFkZW9uX2xlZ2FjeV90bWRzX2V4dF9lbmNfZnVuY3MsIERSTV9NT0RFX0VOQ09ERVJfVE1EUyk7CiAJCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJnJhZGVvbl9sZWdhY3lfdG1kc19leHRfaGVscGVyX2Z1bmNzKTsKIAkJaWYgKCFyZGV2LT5pc19hdG9tX2Jpb3MpCi0JCQlyYWRlb25fY29tYmlvc19nZXRfZXh0X3RtZHNfaW5mbyhyYWRlb25fZW5jb2Rlcik7CisJCQlyYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXYgPSByYWRlb25fbGVnYWN5X2dldF9leHRfdG1kc19pbmZvKHJhZGVvbl9lbmNvZGVyKTsKIAkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbW9kZS5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbW9kZS5oCmluZGV4IGFjZTcyNmEuLjQ0ZDRiNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21vZGUuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmgKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxkcm1fY3J0Yy5oPgogI2luY2x1ZGUgPGRybV9tb2RlLmg+CiAjaW5jbHVkZSA8ZHJtX2VkaWQuaD4KKyNpbmNsdWRlIDxkcm1fZHBfaGVscGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWlkLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CkBAIC04OSwyNCArOTAsNDUgQEAKIAlUVl9TVERfUEFMX0NOLAogfTsKIAorLyogcmFkZW9uIGdwaW8tYmFzZWQgaTJjCisgKiAxLiAibWFzayIgcmVnIGFuZCBiaXRzCisgKiAgICBncmFicyB0aGUgZ3BpbyBwaW5zIGZvciBzb2Z0d2FyZSB1c2UKKyAqICAgIDA9bm90IGhlbGQgIDE9aGVsZAorICogMi4gImEiIHJlZyBhbmQgYml0cworICogICAgb3V0cHV0IHBpbiB2YWx1ZQorICogICAgMD1sb3cgMT1oaWdoCisgKiAzLiAiZW4iIHJlZyBhbmQgYml0cworICogICAgc2V0cyB0aGUgcGluIGRpcmVjdGlvbgorICogICAgMD1pbnB1dCAxPW91dHB1dAorICogNC4gInkiIHJlZyBhbmQgYml0cworICogICAgaW5wdXQgcGluIHZhbHVlCisgKiAgICAwPWxvdyAxPWhpZ2gKKyAqLwogc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyB7CiAJYm9vbCB2YWxpZDsKKwkvKiBpZCB1c2VkIGJ5IGF0b20gKi8KKwl1aW50OF90IGkyY19pZDsKKwkvKiBjYW4gYmUgdXNlZCB3aXRoIGh3IGkyYyBlbmdpbmUgKi8KKwlib29sIGh3X2NhcGFibGU7CisJLyogdXNlcyBtdWx0aS1tZWRpYSBpMmMgZW5naW5lICovCisJYm9vbCBtbV9pMmM7CisJLyogcmVncyBhbmQgYml0cyAqLwogCXVpbnQzMl90IG1hc2tfY2xrX3JlZzsKIAl1aW50MzJfdCBtYXNrX2RhdGFfcmVnOwogCXVpbnQzMl90IGFfY2xrX3JlZzsKIAl1aW50MzJfdCBhX2RhdGFfcmVnOwotCXVpbnQzMl90IHB1dF9jbGtfcmVnOwotCXVpbnQzMl90IHB1dF9kYXRhX3JlZzsKLQl1aW50MzJfdCBnZXRfY2xrX3JlZzsKLQl1aW50MzJfdCBnZXRfZGF0YV9yZWc7CisJdWludDMyX3QgZW5fY2xrX3JlZzsKKwl1aW50MzJfdCBlbl9kYXRhX3JlZzsKKwl1aW50MzJfdCB5X2Nsa19yZWc7CisJdWludDMyX3QgeV9kYXRhX3JlZzsKIAl1aW50MzJfdCBtYXNrX2Nsa19tYXNrOwogCXVpbnQzMl90IG1hc2tfZGF0YV9tYXNrOwotCXVpbnQzMl90IHB1dF9jbGtfbWFzazsKLQl1aW50MzJfdCBwdXRfZGF0YV9tYXNrOwotCXVpbnQzMl90IGdldF9jbGtfbWFzazsKLQl1aW50MzJfdCBnZXRfZGF0YV9tYXNrOwogCXVpbnQzMl90IGFfY2xrX21hc2s7CiAJdWludDMyX3QgYV9kYXRhX21hc2s7CisJdWludDMyX3QgZW5fY2xrX21hc2s7CisJdWludDMyX3QgZW5fZGF0YV9tYXNrOworCXVpbnQzMl90IHlfY2xrX21hc2s7CisJdWludDMyX3QgeV9kYXRhX21hc2s7CiB9OwogCiBzdHJ1Y3QgcmFkZW9uX3RtZHNfcGxsIHsKQEAgLTE1MCw5ICsxNzIsMTIgQEAKIH07CiAKIHN0cnVjdCByYWRlb25faTJjX2NoYW4gewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CiAJc3RydWN0IGkyY19hZGFwdGVyIGFkYXB0ZXI7Ci0Jc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGFsZ287CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKKwl1bmlvbiB7CisJCXN0cnVjdCBpMmNfYWxnb19kcF9hdXhfZGF0YSBkcDsKKwkJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGJpdDsKKwl9IGFsZ287CiAJc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyByZWM7CiB9OwogCkBAIC0xNzAsNiArMTk1LDExIEBACiAJQ1RfRU1BQywKIH07CiAKK2VudW0gcmFkZW9uX2R2b19jaGlwIHsKKwlEVk9fU0lMMTY0LAorCURWT19TSUwxMTc4LAorfTsKKwogc3RydWN0IHJhZGVvbl9tb2RlX2luZm8gewogCXN0cnVjdCBhdG9tX2NvbnRleHQgKmF0b21fY29udGV4dDsKIAlzdHJ1Y3QgY2FyZF9pbmZvICphdG9tX2NhcmRfaW5mbzsKQEAgLTI2MSw2ICsyOTEsMTMgQEAKIAlzdHJ1Y3QgcmFkZW9uX3RtZHNfcGxsIHRtZHNfcGxsWzRdOwogfTsKIAorc3RydWN0IHJhZGVvbl9lbmNvZGVyX2V4dF90bWRzIHsKKwkvKiB0bWRzIG92ZXIgZHZvICovCisJc3RydWN0IHJhZGVvbl9pMmNfY2hhbiAqaTJjX2J1czsKKwl1aW50OF90IHNsYXZlX2FkZHI7CisJZW51bSByYWRlb25fZHZvX2NoaXAgZHZvX2NoaXA7Cit9OworCiAvKiBzcHJlYWQgc3BlY3RydW0gKi8KIHN0cnVjdCByYWRlb25fYXRvbV9zcyB7CiAJdWludDE2X3QgcGVyY2VudGFnZTsKQEAgLTMwMiw2ICszMzksMzUgQEAKIHN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnIHsKIAl1aW50MzJfdCBpZ3BfbGFuZV9pbmZvOwogCWJvb2wgbGlua2I7CisJLyogZGlzcGxheXBvcnQgKi8KKwlzdHJ1Y3QgcmFkZW9uX2kyY19jaGFuICpkcF9pMmNfYnVzOworCXU4IGRwY2RbOF07CisJdTggZHBfc2lua190eXBlOworCWludCBkcF9jbG9jazsKKwlpbnQgZHBfbGFuZV9jb3VudDsKK307CisKK3N0cnVjdCByYWRlb25fZ3Bpb19yZWMgeworCWJvb2wgdmFsaWQ7CisJdTggaWQ7CisJdTMyIHJlZzsKKwl1MzIgbWFzazsKK307CisKK2VudW0gcmFkZW9uX2hwZF9pZCB7CisJUkFERU9OX0hQRF9OT05FID0gMCwKKwlSQURFT05fSFBEXzEsCisJUkFERU9OX0hQRF8yLAorCVJBREVPTl9IUERfMywKKwlSQURFT05fSFBEXzQsCisJUkFERU9OX0hQRF81LAorCVJBREVPTl9IUERfNiwKK307CisKK3N0cnVjdCByYWRlb25faHBkIHsKKwllbnVtIHJhZGVvbl9ocGRfaWQgaHBkOworCXU4IHBsdWdnZWRfc3RhdGU7CisJc3RydWN0IHJhZGVvbl9ncGlvX3JlYyBncGlvOwogfTsKIAogc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgewpAQCAtMzE4LDYgKzM4NCw3IEBACiAJdm9pZCAqY29uX3ByaXY7CiAJYm9vbCBkYWNfbG9hZF9kZXRlY3Q7CiAJdWludDE2X3QgY29ubmVjdG9yX29iamVjdF9pZDsKKwlzdHJ1Y3QgcmFkZW9uX2hwZCBocGQ7CiB9OwogCiBzdHJ1Y3QgcmFkZW9uX2ZyYW1lYnVmZmVyIHsKQEAgLTMyNSwxMCArMzkyLDM3IEBACiAJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CiB9OwogCitleHRlcm4gdm9pZCByYWRlb25fY29ubmVjdG9yX2hvdHBsdWcoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7CitleHRlcm4gYm9vbCByYWRlb25fZHBfbmVlZHNfbGlua190cmFpbihzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3Rvcik7CitleHRlcm4gaW50IHJhZGVvbl9kcF9tb2RlX3ZhbGlkX2hlbHBlcihzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciwKKwkJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RwX3NldF9saW5rX2NvbmZpZyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJCSAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsKK2V4dGVybiB2b2lkIGRwX2xpbmtfdHJhaW4oc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKK2V4dGVybiB1OCByYWRlb25fZHBfZ2V0c2lua3R5cGUoc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IpOworZXh0ZXJuIGJvb2wgcmFkZW9uX2RwX2dldGRwY2Qoc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IpOworZXh0ZXJuIHZvaWQgYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkJICAgaW50IGFjdGlvbiwgdWludDhfdCBsYW5lX251bSwKKwkJCQkJICAgdWludDhfdCBsYW5lX3NldCk7CitleHRlcm4gaW50IHJhZGVvbl9kcF9pMmNfYXV4X2NoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IG1vZGUsCisJCQkJdWludDhfdCB3cml0ZV9ieXRlLCB1aW50OF90ICpyZWFkX2J5dGUpOworCitleHRlcm4gc3RydWN0IHJhZGVvbl9pMmNfY2hhbiAqcmFkZW9uX2kyY19jcmVhdGVfZHAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJCSAgICBzdHJ1Y3QgcmFkZW9uX2kyY19idXNfcmVjICpyZWMsCisJCQkJCQkgICAgY29uc3QgY2hhciAqbmFtZSk7CiBleHRlcm4gc3RydWN0IHJhZGVvbl9pMmNfY2hhbiAqcmFkZW9uX2kyY19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkJCSBzdHJ1Y3QgcmFkZW9uX2kyY19idXNfcmVjICpyZWMsCiAJCQkJCQkgY29uc3QgY2hhciAqbmFtZSk7CiBleHRlcm4gdm9pZCByYWRlb25faTJjX2Rlc3Ryb3koc3RydWN0IHJhZGVvbl9pMmNfY2hhbiAqaTJjKTsKK2V4dGVybiB2b2lkIHJhZGVvbl9pMmNfc3dfZ2V0X2J5dGUoc3RydWN0IHJhZGVvbl9pMmNfY2hhbiAqaTJjX2J1cywKKwkJCQkgICB1OCBzbGF2ZV9hZGRyLAorCQkJCSAgIHU4IGFkZHIsCisJCQkJICAgdTggKnZhbCk7CitleHRlcm4gdm9pZCByYWRlb25faTJjX3N3X3B1dF9ieXRlKHN0cnVjdCByYWRlb25faTJjX2NoYW4gKmkyYywKKwkJCQkgICB1OCBzbGF2ZV9hZGRyLAorCQkJCSAgIHU4IGFkZHIsCisJCQkJICAgdTggdmFsKTsKIGV4dGVybiBib29sIHJhZGVvbl9kZGNfcHJvYmUoc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IpOwogZXh0ZXJuIGludCByYWRlb25fZGRjX2dldF9tb2RlcyhzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3Rvcik7CiAKQEAgLTM0MywxMiArNDM3LDI0IEBACiAJCQkgICAgICAgdWludDMyX3QgKnBvc3RfZGl2X3AsCiAJCQkgICAgICAgaW50IGZsYWdzKTsKIAorZXh0ZXJuIHZvaWQgcmFkZW9uX2NvbXB1dGVfcGxsX2F2aXZvKHN0cnVjdCByYWRlb25fcGxsICpwbGwsCisJCQkJICAgICB1aW50NjRfdCBmcmVxLAorCQkJCSAgICAgdWludDMyX3QgKmRvdF9jbG9ja19wLAorCQkJCSAgICAgdWludDMyX3QgKmZiX2Rpdl9wLAorCQkJCSAgICAgdWludDMyX3QgKmZyYWNfZmJfZGl2X3AsCisJCQkJICAgICB1aW50MzJfdCAqcmVmX2Rpdl9wLAorCQkJCSAgICAgdWludDMyX3QgKnBvc3RfZGl2X3AsCisJCQkJICAgICBpbnQgZmxhZ3MpOworCitleHRlcm4gdm9pZCByYWRlb25fc2V0dXBfZW5jb2Rlcl9jbG9uZXMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisKIHN0cnVjdCBkcm1fZW5jb2RlciAqcmFkZW9uX2VuY29kZXJfbGVnYWN5X2x2ZHNfYWRkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBiaW9zX2luZGV4KTsKIHN0cnVjdCBkcm1fZW5jb2RlciAqcmFkZW9uX2VuY29kZXJfbGVnYWN5X3ByaW1hcnlfZGFjX2FkZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgYmlvc19pbmRleCwgaW50IHdpdGhfdHYpOwogc3RydWN0IGRybV9lbmNvZGVyICpyYWRlb25fZW5jb2Rlcl9sZWdhY3lfdHZfZGFjX2FkZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgYmlvc19pbmRleCwgaW50IHdpdGhfdHYpOwogc3RydWN0IGRybV9lbmNvZGVyICpyYWRlb25fZW5jb2Rlcl9sZWdhY3lfdG1kc19pbnRfYWRkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBiaW9zX2luZGV4KTsKIHN0cnVjdCBkcm1fZW5jb2RlciAqcmFkZW9uX2VuY29kZXJfbGVnYWN5X3RtZHNfZXh0X2FkZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgYmlvc19pbmRleCk7CiBleHRlcm4gdm9pZCBhdG9tYmlvc19leHRlcm5hbF90bWRzX3NldHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IGFjdGlvbik7CitleHRlcm4gdm9pZCBhdG9tYmlvc19kaWdpdGFsX3NldHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IGFjdGlvbik7CiBleHRlcm4gaW50IGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKIGV4dGVybiB2b2lkIHJhZGVvbl9lbmNvZGVyX3NldF9hY3RpdmVfZGV2aWNlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CiAKQEAgLTM3OCwxMiArNDg0LDE2IEBACiBleHRlcm4gYm9vbCByYWRlb25fY29tYmlvc19nZXRfY2xvY2tfaW5mbyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kaWcgKgogcmFkZW9uX2F0b21iaW9zX2dldF9sdmRzX2luZm8oc3RydWN0IHJhZGVvbl9lbmNvZGVyICplbmNvZGVyKTsKLWJvb2wgcmFkZW9uX2F0b21iaW9zX2dldF90bWRzX2luZm8oc3RydWN0IHJhZGVvbl9lbmNvZGVyICplbmNvZGVyLAotCQkJCSAgIHN0cnVjdCByYWRlb25fZW5jb2Rlcl9pbnRfdG1kcyAqdG1kcyk7Ci1ib29sIHJhZGVvbl9sZWdhY3lfZ2V0X3RtZHNfaW5mb19mcm9tX2NvbWJpb3Moc3RydWN0IHJhZGVvbl9lbmNvZGVyICplbmNvZGVyLAotCQkJCQkgICBzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfaW50X3RtZHMgKnRtZHMpOwotYm9vbCByYWRlb25fbGVnYWN5X2dldF90bWRzX2luZm9fZnJvbV90YWJsZShzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKmVuY29kZXIsCi0JCQkJCSAgICBzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfaW50X3RtZHMgKnRtZHMpOworZXh0ZXJuIGJvb2wgcmFkZW9uX2F0b21iaW9zX2dldF90bWRzX2luZm8oc3RydWN0IHJhZGVvbl9lbmNvZGVyICplbmNvZGVyLAorCQkJCQkgIHN0cnVjdCByYWRlb25fZW5jb2Rlcl9pbnRfdG1kcyAqdG1kcyk7CitleHRlcm4gYm9vbCByYWRlb25fbGVnYWN5X2dldF90bWRzX2luZm9fZnJvbV9jb21iaW9zKHN0cnVjdCByYWRlb25fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkJCSAgICAgc3RydWN0IHJhZGVvbl9lbmNvZGVyX2ludF90bWRzICp0bWRzKTsKK2V4dGVybiBib29sIHJhZGVvbl9sZWdhY3lfZ2V0X3RtZHNfaW5mb19mcm9tX3RhYmxlKHN0cnVjdCByYWRlb25fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkJCSAgIHN0cnVjdCByYWRlb25fZW5jb2Rlcl9pbnRfdG1kcyAqdG1kcyk7CitleHRlcm4gYm9vbCByYWRlb25fbGVnYWN5X2dldF9leHRfdG1kc19pbmZvX2Zyb21fY29tYmlvcyhzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKmVuY29kZXIsCisJCQkJCQkJIHN0cnVjdCByYWRlb25fZW5jb2Rlcl9leHRfdG1kcyAqdG1kcyk7CitleHRlcm4gYm9vbCByYWRlb25fbGVnYWN5X2dldF9leHRfdG1kc19pbmZvX2Zyb21fdGFibGUoc3RydWN0IHJhZGVvbl9lbmNvZGVyICplbmNvZGVyLAorCQkJCQkJICAgICAgIHN0cnVjdCByYWRlb25fZW5jb2Rlcl9leHRfdG1kcyAqdG1kcyk7CiBleHRlcm4gc3RydWN0IHJhZGVvbl9lbmNvZGVyX3ByaW1hcnlfZGFjICoKIHJhZGVvbl9hdG9tYmlvc19nZXRfcHJpbWFyeV9kYWNfaW5mbyhzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKmVuY29kZXIpOwogZXh0ZXJuIHN0cnVjdCByYWRlb25fZW5jb2Rlcl90dl9kYWMgKgpAQCAtMzk1LDYgKzUwNSw4IEBACiByYWRlb25fY29tYmlvc19nZXRfdHZfZGFjX2luZm8oc3RydWN0IHJhZGVvbl9lbmNvZGVyICplbmNvZGVyKTsKIGV4dGVybiBzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfcHJpbWFyeV9kYWMgKgogcmFkZW9uX2NvbWJpb3NfZ2V0X3ByaW1hcnlfZGFjX2luZm8oc3RydWN0IHJhZGVvbl9lbmNvZGVyICplbmNvZGVyKTsKK2V4dGVybiBib29sIHJhZGVvbl9jb21iaW9zX2V4dGVybmFsX3RtZHNfc2V0dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKK2V4dGVybiB2b2lkIHJhZGVvbl9leHRlcm5hbF90bWRzX3NldHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CiBleHRlcm4gdm9pZCByYWRlb25fY29tYmlvc19vdXRwdXRfbG9jayhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGJvb2wgbG9jayk7CiBleHRlcm4gdm9pZCByYWRlb25fY29tYmlvc19pbml0aWFsaXplX2Jpb3Nfc2NyYXRjaF9yZWdzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgcmFkZW9uX2F0b21fb3V0cHV0X2xvY2soc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBib29sIGxvY2spOwpAQCAtNDI2LDE2ICs1MzgsMTMgQEAKIAkJCSAgICAgICBzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjKTsKIHZvaWQgcmFkZW9uX2xlZ2FjeV9pbml0X2NydGMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCSAgICAgc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0Yyk7Ci12b2lkIHJhZGVvbl9pMmNfZG9fbG9jayhzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciwgaW50IGxvY2tfc3RhdGUpOworZXh0ZXJuIHZvaWQgcmFkZW9uX2kyY19kb19sb2NrKHN0cnVjdCByYWRlb25faTJjX2NoYW4gKmkyYywgaW50IGxvY2tfc3RhdGUpOwogCiB2b2lkIHJhZGVvbl9nZXRfY2xvY2tfaW5mbyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogZXh0ZXJuIGJvb2wgcmFkZW9uX2dldF9hdG9tX2Nvbm5lY3Rvcl9pbmZvX2Zyb21fb2JqZWN0X3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIGJvb2wgcmFkZW9uX2dldF9hdG9tX2Nvbm5lY3Rvcl9pbmZvX2Zyb21fc3VwcG9ydGVkX2RldmljZXNfdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKLXZvaWQgcmFkZW9uX3JteF9tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKLQkJCSAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAotCQkJICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpOwogdm9pZCByYWRlb25fZW5jX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKIHZvaWQgcmFkZW9uX2NvcHlfZmIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpkc3Rfb2JqKTsKIHZvaWQgcmFkZW9uX2NvbWJpb3NfYXNpY19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9vYmplY3QuYwppbmRleCAxZjA1NmRhLi41NDRlMThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9vYmplY3QuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9vYmplY3QuYwpAQCAtMzQsMTAwICszNCw1MyBAQAogI2luY2x1ZGUgInJhZGVvbl9kcm0uaCIKICNpbmNsdWRlICJyYWRlb24uaCIKIAotc3RydWN0IHJhZGVvbl9vYmplY3QgewotCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdAl0b2JqOwotCXN0cnVjdCBsaXN0X2hlYWQJCWxpc3Q7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UJCSpyZGV2OwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdAkJKmdvYmo7Ci0Jc3RydWN0IHR0bV9ib19rbWFwX29iagkJa21hcDsKLQl1bnNpZ25lZAkJCXBpbl9jb3VudDsKLQl1aW50NjRfdAkJCWdwdV9hZGRyOwotCXZvaWQJCQkJKmtwdHI7Ci0JYm9vbAkJCQlpc19pb21lbTsKLQl1aW50MzJfdAkJCXRpbGluZ19mbGFnczsKLQl1aW50MzJfdAkJCXBpdGNoOwotCWludAkJCQlzdXJmYWNlX3JlZzsKLX07CiAKIGludCByYWRlb25fdHRtX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCByYWRlb25fdHRtX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworc3RhdGljIHZvaWQgcmFkZW9uX2JvX2NsZWFyX3N1cmZhY2VfcmVnKHN0cnVjdCByYWRlb25fYm8gKmJvKTsKIAogLyoKICAqIFRvIGV4Y2x1ZGUgbXV0dWFsIEJPIGFjY2VzcyB3ZSByZWx5IG9uIGJvX3Jlc2VydmUgZXhjbHVzaW9uLCBhcyBhbGwKICAqIGZ1bmN0aW9uIGFyZSBjYWxsaW5nIGl0LgogICovCiAKLXN0YXRpYyBpbnQgcmFkZW9uX29iamVjdF9yZXNlcnZlKHN0cnVjdCByYWRlb25fb2JqZWN0ICpyb2JqLCBib29sIGludGVycnVwdGlibGUpCitzdGF0aWMgdm9pZCByYWRlb25fdHRtX2JvX2Rlc3Ryb3koc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICp0Ym8pCiB7Ci0JcmV0dXJuIHR0bV9ib19yZXNlcnZlKCZyb2JqLT50b2JqLCBpbnRlcnJ1cHRpYmxlLCBmYWxzZSwgZmFsc2UsIDApOworCXN0cnVjdCByYWRlb25fYm8gKmJvOworCisJYm8gPSBjb250YWluZXJfb2YodGJvLCBzdHJ1Y3QgcmFkZW9uX2JvLCB0Ym8pOworCW11dGV4X2xvY2soJmJvLT5yZGV2LT5nZW0ubXV0ZXgpOworCWxpc3RfZGVsX2luaXQoJmJvLT5saXN0KTsKKwltdXRleF91bmxvY2soJmJvLT5yZGV2LT5nZW0ubXV0ZXgpOworCXJhZGVvbl9ib19jbGVhcl9zdXJmYWNlX3JlZyhibyk7CisJa2ZyZWUoYm8pOwogfQogCi1zdGF0aWMgdm9pZCByYWRlb25fb2JqZWN0X3VucmVzZXJ2ZShzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iaikKK3ZvaWQgcmFkZW9uX3R0bV9wbGFjZW1lbnRfZnJvbV9kb21haW4oc3RydWN0IHJhZGVvbl9ibyAqcmJvLCB1MzIgZG9tYWluKQogewotCXR0bV9ib191bnJlc2VydmUoJnJvYmotPnRvYmopOworCXUzMiBjID0gMDsKKworCXJiby0+cGxhY2VtZW50LmZwZm4gPSAwOworCXJiby0+cGxhY2VtZW50LmxwZm4gPSAwOworCXJiby0+cGxhY2VtZW50LnBsYWNlbWVudCA9IHJiby0+cGxhY2VtZW50czsKKwlyYm8tPnBsYWNlbWVudC5idXN5X3BsYWNlbWVudCA9IHJiby0+cGxhY2VtZW50czsKKwlpZiAoZG9tYWluICYgUkFERU9OX0dFTV9ET01BSU5fVlJBTSkKKwkJcmJvLT5wbGFjZW1lbnRzW2MrK10gPSBUVE1fUExfRkxBR19XQyB8IFRUTV9QTF9GTEFHX1VOQ0FDSEVEIHwKKwkJCQkJVFRNX1BMX0ZMQUdfVlJBTTsKKwlpZiAoZG9tYWluICYgUkFERU9OX0dFTV9ET01BSU5fR1RUKQorCQlyYm8tPnBsYWNlbWVudHNbYysrXSA9IFRUTV9QTF9NQVNLX0NBQ0hJTkcgfCBUVE1fUExfRkxBR19UVDsKKwlpZiAoZG9tYWluICYgUkFERU9OX0dFTV9ET01BSU5fQ1BVKQorCQlyYm8tPnBsYWNlbWVudHNbYysrXSA9IFRUTV9QTF9NQVNLX0NBQ0hJTkcgfCBUVE1fUExfRkxBR19TWVNURU07CisJcmJvLT5wbGFjZW1lbnQubnVtX3BsYWNlbWVudCA9IGM7CisJcmJvLT5wbGFjZW1lbnQubnVtX2J1c3lfcGxhY2VtZW50ID0gYzsKIH0KIAotc3RhdGljIHZvaWQgcmFkZW9uX3R0bV9vYmplY3Rfb2JqZWN0X2Rlc3Ryb3koc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICp0b2JqKQoraW50IHJhZGVvbl9ib19jcmVhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ29iaiwKKwkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgYm9vbCBrZXJuZWwsIHUzMiBkb21haW4sCisJCQlzdHJ1Y3QgcmFkZW9uX2JvICoqYm9fcHRyKQogewotCXN0cnVjdCByYWRlb25fb2JqZWN0ICpyb2JqOwotCi0Jcm9iaiA9IGNvbnRhaW5lcl9vZih0b2JqLCBzdHJ1Y3QgcmFkZW9uX29iamVjdCwgdG9iaik7Ci0JbGlzdF9kZWxfaW5pdCgmcm9iai0+bGlzdCk7Ci0JcmFkZW9uX29iamVjdF9jbGVhcl9zdXJmYWNlX3JlZyhyb2JqKTsKLQlrZnJlZShyb2JqKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHJhZGVvbl9vYmplY3RfZ3B1X2FkZHIoc3RydWN0IHJhZGVvbl9vYmplY3QgKnJvYmopCi17Ci0JLyogRGVmYXVsdCBncHUgYWRkcmVzcyAqLwotCXJvYmotPmdwdV9hZGRyID0gMHhGRkZGRkZGRkZGRkZGRkZGVUxMOwotCWlmIChyb2JqLT50b2JqLm1lbS5tbV9ub2RlID09IE5VTEwpIHsKLQkJcmV0dXJuOwotCX0KLQlyb2JqLT5ncHVfYWRkciA9ICgodTY0KXJvYmotPnRvYmoubWVtLm1tX25vZGUtPnN0YXJ0KSA8PCBQQUdFX1NISUZUOwotCXN3aXRjaCAocm9iai0+dG9iai5tZW0ubWVtX3R5cGUpIHsKLQljYXNlIFRUTV9QTF9WUkFNOgotCQlyb2JqLT5ncHVfYWRkciArPSAodTY0KXJvYmotPnJkZXYtPm1jLnZyYW1fbG9jYXRpb247Ci0JCWJyZWFrOwotCWNhc2UgVFRNX1BMX1RUOgotCQlyb2JqLT5ncHVfYWRkciArPSAodTY0KXJvYmotPnJkZXYtPm1jLmd0dF9sb2NhdGlvbjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJRFJNX0VSUk9SKCJVbmtub3duIHBsYWNlbWVudCAlZFxuIiwgcm9iai0+dG9iai5tZW0ubWVtX3R5cGUpOwotCQlyb2JqLT5ncHVfYWRkciA9IDB4RkZGRkZGRkZGRkZGRkZGRlVMTDsKLQkJcmV0dXJuOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB1aW50MzJfdCByYWRlb25fb2JqZWN0X2ZsYWdzX2Zyb21fZG9tYWluKHVpbnQzMl90IGRvbWFpbikKLXsKLQl1aW50MzJfdCBmbGFncyA9IDA7Ci0JaWYgKGRvbWFpbiAmIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0pIHsKLQkJZmxhZ3MgfD0gVFRNX1BMX0ZMQUdfVlJBTSB8IFRUTV9QTF9GTEFHX1dDIHwgVFRNX1BMX0ZMQUdfVU5DQUNIRUQ7Ci0JfQotCWlmIChkb21haW4gJiBSQURFT05fR0VNX0RPTUFJTl9HVFQpIHsKLQkJZmxhZ3MgfD0gVFRNX1BMX0ZMQUdfVFQgfCBUVE1fUExfTUFTS19DQUNISU5HOwotCX0KLQlpZiAoZG9tYWluICYgUkFERU9OX0dFTV9ET01BSU5fQ1BVKSB7Ci0JCWZsYWdzIHw9IFRUTV9QTF9GTEFHX1NZU1RFTSB8IFRUTV9QTF9NQVNLX0NBQ0hJTkc7Ci0JfQotCWlmICghZmxhZ3MpIHsKLQkJZmxhZ3MgfD0gVFRNX1BMX0ZMQUdfU1lTVEVNIHwgVFRNX1BMX01BU0tfQ0FDSElORzsKLQl9Ci0JcmV0dXJuIGZsYWdzOwotfQotCi1pbnQgcmFkZW9uX29iamVjdF9jcmVhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCi0JCQkgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnb2JqLAotCQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCSBib29sIGtlcm5lbCwKLQkJCSB1aW50MzJfdCBkb21haW4sCi0JCQkgYm9vbCBpbnRlcnJ1cHRpYmxlLAotCQkJIHN0cnVjdCByYWRlb25fb2JqZWN0ICoqcm9ial9wdHIpCi17Ci0Jc3RydWN0IHJhZGVvbl9vYmplY3QgKnJvYmo7CisJc3RydWN0IHJhZGVvbl9ibyAqYm87CiAJZW51bSB0dG1fYm9fdHlwZSB0eXBlOwotCXVpbnQzMl90IGZsYWdzOwogCWludCByOwogCiAJaWYgKHVubGlrZWx5KHJkZXYtPm1tYW4uYmRldi5kZXZfbWFwcGluZyA9PSBOVUxMKSkgewpAQCAtMTM4LDIwNiArOTEsMTI1IEBACiAJfSBlbHNlIHsKIAkJdHlwZSA9IHR0bV9ib190eXBlX2RldmljZTsKIAl9Ci0JKnJvYmpfcHRyID0gTlVMTDsKLQlyb2JqID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJhZGVvbl9vYmplY3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAocm9iaiA9PSBOVUxMKSB7CisJKmJvX3B0ciA9IE5VTEw7CisJYm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmFkZW9uX2JvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJvID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KLQlyb2JqLT5yZGV2ID0gcmRldjsKLQlyb2JqLT5nb2JqID0gZ29iajsKLQlyb2JqLT5zdXJmYWNlX3JlZyA9IC0xOwotCUlOSVRfTElTVF9IRUFEKCZyb2JqLT5saXN0KTsKKwliby0+cmRldiA9IHJkZXY7CisJYm8tPmdvYmogPSBnb2JqOworCWJvLT5zdXJmYWNlX3JlZyA9IC0xOworCUlOSVRfTElTVF9IRUFEKCZiby0+bGlzdCk7CiAKLQlmbGFncyA9IHJhZGVvbl9vYmplY3RfZmxhZ3NfZnJvbV9kb21haW4oZG9tYWluKTsKLQlyID0gdHRtX2J1ZmZlcl9vYmplY3RfaW5pdCgmcmRldi0+bW1hbi5iZGV2LCAmcm9iai0+dG9iaiwgc2l6ZSwgdHlwZSwgZmxhZ3MsCi0JCQkJICAgMCwgMCwgZmFsc2UsIE5VTEwsIHNpemUsCi0JCQkJICAgJnJhZGVvbl90dG1fb2JqZWN0X29iamVjdF9kZXN0cm95KTsKKwlyYWRlb25fdHRtX3BsYWNlbWVudF9mcm9tX2RvbWFpbihibywgZG9tYWluKTsKKwkvKiBLZXJuZWwgYWxsb2NhdGlvbiBhcmUgdW5pbnRlcnJ1cHRpYmxlICovCisJciA9IHR0bV9ib19pbml0KCZyZGV2LT5tbWFuLmJkZXYsICZiby0+dGJvLCBzaXplLCB0eXBlLAorCQkJJmJvLT5wbGFjZW1lbnQsIDAsIDAsICFrZXJuZWwsIE5VTEwsIHNpemUsCisJCQkmcmFkZW9uX3R0bV9ib19kZXN0cm95KTsKIAlpZiAodW5saWtlbHkociAhPSAwKSkgewotCQkvKiB0dG0gY2FsbCByYWRlb25fdHRtX29iamVjdF9vYmplY3RfZGVzdHJveSBpZiBlcnJvciBoYXBwZW4gKi8KLQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgVFRNIG9iamVjdCAoJWxkLCAweCUwOFgsICV1KVxuIiwKLQkJCSAgc2l6ZSwgZmxhZ3MsIDApOworCQlpZiAociAhPSAtRVJFU1RBUlRTWVMpCisJCQlkZXZfZXJyKHJkZXYtPmRldiwKKwkJCQkib2JqZWN0X2luaXQgZmFpbGVkIGZvciAoJWx1LCAweCUwOFgpXG4iLAorCQkJCXNpemUsIGRvbWFpbik7CiAJCXJldHVybiByOwogCX0KLQkqcm9ial9wdHIgPSByb2JqOworCSpib19wdHIgPSBibzsKIAlpZiAoZ29iaikgewotCQlsaXN0X2FkZF90YWlsKCZyb2JqLT5saXN0LCAmcmRldi0+Z2VtLm9iamVjdHMpOworCQltdXRleF9sb2NrKCZiby0+cmRldi0+Z2VtLm11dGV4KTsKKwkJbGlzdF9hZGRfdGFpbCgmYm8tPmxpc3QsICZyZGV2LT5nZW0ub2JqZWN0cyk7CisJCW11dGV4X3VubG9jaygmYm8tPnJkZXYtPmdlbS5tdXRleCk7CiAJfQogCXJldHVybiAwOwogfQogCi1pbnQgcmFkZW9uX29iamVjdF9rbWFwKHN0cnVjdCByYWRlb25fb2JqZWN0ICpyb2JqLCB2b2lkICoqcHRyKQoraW50IHJhZGVvbl9ib19rbWFwKHN0cnVjdCByYWRlb25fYm8gKmJvLCB2b2lkICoqcHRyKQogeworCWJvb2wgaXNfaW9tZW07CiAJaW50IHI7CiAKLQlzcGluX2xvY2soJnJvYmotPnRvYmoubG9jayk7Ci0JaWYgKHJvYmotPmtwdHIpIHsKKwlpZiAoYm8tPmtwdHIpIHsKIAkJaWYgKHB0cikgewotCQkJKnB0ciA9IHJvYmotPmtwdHI7CisJCQkqcHRyID0gYm8tPmtwdHI7CiAJCX0KLQkJc3Bpbl91bmxvY2soJnJvYmotPnRvYmoubG9jayk7CiAJCXJldHVybiAwOwogCX0KLQlzcGluX3VubG9jaygmcm9iai0+dG9iai5sb2NrKTsKLQlyID0gdHRtX2JvX2ttYXAoJnJvYmotPnRvYmosIDAsIHJvYmotPnRvYmoubnVtX3BhZ2VzLCAmcm9iai0+a21hcCk7CisJciA9IHR0bV9ib19rbWFwKCZiby0+dGJvLCAwLCBiby0+dGJvLm51bV9wYWdlcywgJmJvLT5rbWFwKTsKIAlpZiAocikgewogCQlyZXR1cm4gcjsKIAl9Ci0Jc3Bpbl9sb2NrKCZyb2JqLT50b2JqLmxvY2spOwotCXJvYmotPmtwdHIgPSB0dG1fa21hcF9vYmpfdmlydHVhbCgmcm9iai0+a21hcCwgJnJvYmotPmlzX2lvbWVtKTsKLQlzcGluX3VubG9jaygmcm9iai0+dG9iai5sb2NrKTsKKwliby0+a3B0ciA9IHR0bV9rbWFwX29ial92aXJ0dWFsKCZiby0+a21hcCwgJmlzX2lvbWVtKTsKIAlpZiAocHRyKSB7Ci0JCSpwdHIgPSByb2JqLT5rcHRyOworCQkqcHRyID0gYm8tPmtwdHI7CiAJfQotCXJhZGVvbl9vYmplY3RfY2hlY2tfdGlsaW5nKHJvYmosIDAsIDApOworCXJhZGVvbl9ib19jaGVja190aWxpbmcoYm8sIDAsIDApOwogCXJldHVybiAwOwogfQogCi12b2lkIHJhZGVvbl9vYmplY3Rfa3VubWFwKHN0cnVjdCByYWRlb25fb2JqZWN0ICpyb2JqKQordm9pZCByYWRlb25fYm9fa3VubWFwKHN0cnVjdCByYWRlb25fYm8gKmJvKQogewotCXNwaW5fbG9jaygmcm9iai0+dG9iai5sb2NrKTsKLQlpZiAocm9iai0+a3B0ciA9PSBOVUxMKSB7Ci0JCXNwaW5fdW5sb2NrKCZyb2JqLT50b2JqLmxvY2spOworCWlmIChiby0+a3B0ciA9PSBOVUxMKQogCQlyZXR1cm47Ci0JfQotCXJvYmotPmtwdHIgPSBOVUxMOwotCXNwaW5fdW5sb2NrKCZyb2JqLT50b2JqLmxvY2spOwotCXJhZGVvbl9vYmplY3RfY2hlY2tfdGlsaW5nKHJvYmosIDAsIDApOwotCXR0bV9ib19rdW5tYXAoJnJvYmotPmttYXApOworCWJvLT5rcHRyID0gTlVMTDsKKwlyYWRlb25fYm9fY2hlY2tfdGlsaW5nKGJvLCAwLCAwKTsKKwl0dG1fYm9fa3VubWFwKCZiby0+a21hcCk7CiB9CiAKLXZvaWQgcmFkZW9uX29iamVjdF91bnJlZihzdHJ1Y3QgcmFkZW9uX29iamVjdCAqKnJvYmopCit2b2lkIHJhZGVvbl9ib191bnJlZihzdHJ1Y3QgcmFkZW9uX2JvICoqYm8pCiB7Ci0Jc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICp0b2JqOworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqdGJvOwogCi0JaWYgKCgqcm9iaikgPT0gTlVMTCkgeworCWlmICgoKmJvKSA9PSBOVUxMKQogCQlyZXR1cm47Ci0JfQotCXRvYmogPSAmKCgqcm9iaiktPnRvYmopOwotCXR0bV9ib191bnJlZigmdG9iaik7Ci0JaWYgKHRvYmogPT0gTlVMTCkgewotCQkqcm9iaiA9IE5VTEw7Ci0JfQorCXRibyA9ICYoKCpibyktPnRibyk7CisJdHRtX2JvX3VucmVmKCZ0Ym8pOworCWlmICh0Ym8gPT0gTlVMTCkKKwkJKmJvID0gTlVMTDsKIH0KIAotaW50IHJhZGVvbl9vYmplY3RfbW1hcChzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iaiwgdWludDY0X3QgKm9mZnNldCkKK2ludCByYWRlb25fYm9fcGluKHN0cnVjdCByYWRlb25fYm8gKmJvLCB1MzIgZG9tYWluLCB1NjQgKmdwdV9hZGRyKQogewotCSpvZmZzZXQgPSByb2JqLT50b2JqLmFkZHJfc3BhY2Vfb2Zmc2V0OwotCXJldHVybiAwOwotfQorCWludCByLCBpOwogCi1pbnQgcmFkZW9uX29iamVjdF9waW4oc3RydWN0IHJhZGVvbl9vYmplY3QgKnJvYmosIHVpbnQzMl90IGRvbWFpbiwKLQkJICAgICAgdWludDY0X3QgKmdwdV9hZGRyKQotewotCXVpbnQzMl90IGZsYWdzOwotCXVpbnQzMl90IHRtcDsKLQlpbnQgcjsKLQotCWZsYWdzID0gcmFkZW9uX29iamVjdF9mbGFnc19mcm9tX2RvbWFpbihkb21haW4pOwotCXNwaW5fbG9jaygmcm9iai0+dG9iai5sb2NrKTsKLQlpZiAocm9iai0+cGluX2NvdW50KSB7Ci0JCXJvYmotPnBpbl9jb3VudCsrOwotCQlpZiAoZ3B1X2FkZHIgIT0gTlVMTCkgewotCQkJKmdwdV9hZGRyID0gcm9iai0+Z3B1X2FkZHI7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJnJvYmotPnRvYmoubG9jayk7CisJcmFkZW9uX3R0bV9wbGFjZW1lbnRfZnJvbV9kb21haW4oYm8sIGRvbWFpbik7CisJaWYgKGJvLT5waW5fY291bnQpIHsKKwkJYm8tPnBpbl9jb3VudCsrOworCQlpZiAoZ3B1X2FkZHIpCisJCQkqZ3B1X2FkZHIgPSByYWRlb25fYm9fZ3B1X29mZnNldChibyk7CiAJCXJldHVybiAwOwogCX0KLQlzcGluX3VubG9jaygmcm9iai0+dG9iai5sb2NrKTsKLQlyID0gcmFkZW9uX29iamVjdF9yZXNlcnZlKHJvYmosIGZhbHNlKTsKLQlpZiAodW5saWtlbHkociAhPSAwKSkgewotCQlEUk1fRVJST1IoInJhZGVvbjogZmFpbGVkIHRvIHJlc2VydmUgb2JqZWN0IGZvciBwaW5uaW5nIGl0LlxuIik7Ci0JCXJldHVybiByOworCXJhZGVvbl90dG1fcGxhY2VtZW50X2Zyb21fZG9tYWluKGJvLCBkb21haW4pOworCWZvciAoaSA9IDA7IGkgPCBiby0+cGxhY2VtZW50Lm51bV9wbGFjZW1lbnQ7IGkrKykKKwkJYm8tPnBsYWNlbWVudHNbaV0gfD0gVFRNX1BMX0ZMQUdfTk9fRVZJQ1Q7CisJciA9IHR0bV9ib192YWxpZGF0ZSgmYm8tPnRibywgJmJvLT5wbGFjZW1lbnQsIGZhbHNlLCBmYWxzZSk7CisJaWYgKGxpa2VseShyID09IDApKSB7CisJCWJvLT5waW5fY291bnQgPSAxOworCQlpZiAoZ3B1X2FkZHIgIT0gTlVMTCkKKwkJCSpncHVfYWRkciA9IHJhZGVvbl9ib19ncHVfb2Zmc2V0KGJvKTsKIAl9Ci0JdG1wID0gcm9iai0+dG9iai5tZW0ucGxhY2VtZW50OwotCXR0bV9mbGFnX21hc2tlZCgmdG1wLCBmbGFncywgVFRNX1BMX01BU0tfTUVNKTsKLQlyb2JqLT50b2JqLnByb3Bvc2VkX3BsYWNlbWVudCA9IHRtcCB8IFRUTV9QTF9GTEFHX05PX0VWSUNUIHwgVFRNX1BMX01BU0tfQ0FDSElORzsKLQlyID0gdHRtX2J1ZmZlcl9vYmplY3RfdmFsaWRhdGUoJnJvYmotPnRvYmosCi0JCQkJICAgICAgIHJvYmotPnRvYmoucHJvcG9zZWRfcGxhY2VtZW50LAotCQkJCSAgICAgICBmYWxzZSwgZmFsc2UpOwotCXJhZGVvbl9vYmplY3RfZ3B1X2FkZHIocm9iaik7Ci0JaWYgKGdwdV9hZGRyICE9IE5VTEwpIHsKLQkJKmdwdV9hZGRyID0gcm9iai0+Z3B1X2FkZHI7Ci0JfQotCXJvYmotPnBpbl9jb3VudCA9IDE7Ci0JaWYgKHVubGlrZWx5KHIgIT0gMCkpIHsKLQkJRFJNX0VSUk9SKCJyYWRlb246IGZhaWxlZCB0byBwaW4gb2JqZWN0LlxuIik7Ci0JfQotCXJhZGVvbl9vYmplY3RfdW5yZXNlcnZlKHJvYmopOworCWlmICh1bmxpa2VseShyICE9IDApKQorCQlkZXZfZXJyKGJvLT5yZGV2LT5kZXYsICIlcCBwaW4gZmFpbGVkXG4iLCBibyk7CiAJcmV0dXJuIHI7CiB9CiAKLXZvaWQgcmFkZW9uX29iamVjdF91bnBpbihzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iaikKK2ludCByYWRlb25fYm9fdW5waW4oc3RydWN0IHJhZGVvbl9ibyAqYm8pCiB7Ci0JdWludDMyX3QgZmxhZ3M7Ci0JaW50IHI7CisJaW50IHIsIGk7CiAKLQlzcGluX2xvY2soJnJvYmotPnRvYmoubG9jayk7Ci0JaWYgKCFyb2JqLT5waW5fY291bnQpIHsKLQkJc3Bpbl91bmxvY2soJnJvYmotPnRvYmoubG9jayk7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlVucGluIG5vdCBuZWNlc3NhcnkgZm9yICVwICFcbiIsIHJvYmopOwotCQlyZXR1cm47CisJaWYgKCFiby0+cGluX2NvdW50KSB7CisJCWRldl93YXJuKGJvLT5yZGV2LT5kZXYsICIlcCB1bnBpbiBub3QgbmVjZXNzYXJ5XG4iLCBibyk7CisJCXJldHVybiAwOwogCX0KLQlyb2JqLT5waW5fY291bnQtLTsKLQlpZiAocm9iai0+cGluX2NvdW50KSB7Ci0JCXNwaW5fdW5sb2NrKCZyb2JqLT50b2JqLmxvY2spOwotCQlyZXR1cm47Ci0JfQotCXNwaW5fdW5sb2NrKCZyb2JqLT50b2JqLmxvY2spOwotCXIgPSByYWRlb25fb2JqZWN0X3Jlc2VydmUocm9iaiwgZmFsc2UpOwotCWlmICh1bmxpa2VseShyICE9IDApKSB7Ci0JCURSTV9FUlJPUigicmFkZW9uOiBmYWlsZWQgdG8gcmVzZXJ2ZSBvYmplY3QgZm9yIHVucGlubmluZyBpdC5cbiIpOwotCQlyZXR1cm47Ci0JfQotCWZsYWdzID0gcm9iai0+dG9iai5tZW0ucGxhY2VtZW50OwotCXJvYmotPnRvYmoucHJvcG9zZWRfcGxhY2VtZW50ID0gZmxhZ3MgJiB+VFRNX1BMX0ZMQUdfTk9fRVZJQ1Q7Ci0JciA9IHR0bV9idWZmZXJfb2JqZWN0X3ZhbGlkYXRlKCZyb2JqLT50b2JqLAotCQkJCSAgICAgICByb2JqLT50b2JqLnByb3Bvc2VkX3BsYWNlbWVudCwKLQkJCQkgICAgICAgZmFsc2UsIGZhbHNlKTsKLQlpZiAodW5saWtlbHkociAhPSAwKSkgewotCQlEUk1fRVJST1IoInJhZGVvbjogZmFpbGVkIHRvIHVucGluIGJ1ZmZlci5cbiIpOwotCX0KLQlyYWRlb25fb2JqZWN0X3VucmVzZXJ2ZShyb2JqKTsKLX0KLQotaW50IHJhZGVvbl9vYmplY3Rfd2FpdChzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iaikKLXsKLQlpbnQgciA9IDA7Ci0KLQkvKiBGSVhNRTogc2hvdWxkIHVzZSBibG9jayByZXNlcnZhdGlvbiBpbnN0ZWFkICovCi0JciA9IHJhZGVvbl9vYmplY3RfcmVzZXJ2ZShyb2JqLCB0cnVlKTsKLQlpZiAodW5saWtlbHkociAhPSAwKSkgewotCQlEUk1fRVJST1IoInJhZGVvbjogZmFpbGVkIHRvIHJlc2VydmUgb2JqZWN0IGZvciB3YWl0aW5nLlxuIik7Ci0JCXJldHVybiByOwotCX0KLQlzcGluX2xvY2soJnJvYmotPnRvYmoubG9jayk7Ci0JaWYgKHJvYmotPnRvYmouc3luY19vYmopIHsKLQkJciA9IHR0bV9ib193YWl0KCZyb2JqLT50b2JqLCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0JfQotCXNwaW5fdW5sb2NrKCZyb2JqLT50b2JqLmxvY2spOwotCXJhZGVvbl9vYmplY3RfdW5yZXNlcnZlKHJvYmopOworCWJvLT5waW5fY291bnQtLTsKKwlpZiAoYm8tPnBpbl9jb3VudCkKKwkJcmV0dXJuIDA7CisJZm9yIChpID0gMDsgaSA8IGJvLT5wbGFjZW1lbnQubnVtX3BsYWNlbWVudDsgaSsrKQorCQliby0+cGxhY2VtZW50c1tpXSAmPSB+VFRNX1BMX0ZMQUdfTk9fRVZJQ1Q7CisJciA9IHR0bV9ib192YWxpZGF0ZSgmYm8tPnRibywgJmJvLT5wbGFjZW1lbnQsIGZhbHNlLCBmYWxzZSk7CisJaWYgKHVubGlrZWx5KHIgIT0gMCkpCisJCWRldl9lcnIoYm8tPnJkZXYtPmRldiwgIiVwIHZhbGlkYXRlIGZhaWxlZCBmb3IgdW5waW5cbiIsIGJvKTsKIAlyZXR1cm4gcjsKIH0KIAotaW50IHJhZGVvbl9vYmplY3RfYnVzeV9kb21haW4oc3RydWN0IHJhZGVvbl9vYmplY3QgKnJvYmosIHVpbnQzMl90ICpjdXJfcGxhY2VtZW50KQotewotCWludCByID0gMDsKLQotCXIgPSByYWRlb25fb2JqZWN0X3Jlc2VydmUocm9iaiwgdHJ1ZSk7Ci0JaWYgKHVubGlrZWx5KHIgIT0gMCkpIHsKLQkJRFJNX0VSUk9SKCJyYWRlb246IGZhaWxlZCB0byByZXNlcnZlIG9iamVjdCBmb3Igd2FpdGluZy5cbiIpOwotCQlyZXR1cm4gcjsKLQl9Ci0Jc3Bpbl9sb2NrKCZyb2JqLT50b2JqLmxvY2spOwotCSpjdXJfcGxhY2VtZW50ID0gcm9iai0+dG9iai5tZW0ubWVtX3R5cGU7Ci0JaWYgKHJvYmotPnRvYmouc3luY19vYmopIHsKLQkJciA9IHR0bV9ib193YWl0KCZyb2JqLT50b2JqLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJnJvYmotPnRvYmoubG9jayk7Ci0JcmFkZW9uX29iamVjdF91bnJlc2VydmUocm9iaik7Ci0JcmV0dXJuIHI7Ci19Ci0KLWludCByYWRlb25fb2JqZWN0X2V2aWN0X3ZyYW0oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCitpbnQgcmFkZW9uX2JvX2V2aWN0X3ZyYW0oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkgewogCQkvKiBVc2VsZXNzIHRvIGV2aWN0IG9uIElHUCBjaGlwcyAqLwpAQCAtMzQ2LDMwICsyMTgsMzIgQEAKIAlyZXR1cm4gdHRtX2JvX2V2aWN0X21tKCZyZGV2LT5tbWFuLmJkZXYsIFRUTV9QTF9WUkFNKTsKIH0KIAotdm9pZCByYWRlb25fb2JqZWN0X2ZvcmNlX2RlbGV0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3ZvaWQgcmFkZW9uX2JvX2ZvcmNlX2RlbGV0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQlzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iaiwgKm47CisJc3RydWN0IHJhZGVvbl9ibyAqYm8sICpuOwogCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ29iajsKIAogCWlmIChsaXN0X2VtcHR5KCZyZGV2LT5nZW0ub2JqZWN0cykpIHsKIAkJcmV0dXJuOwogCX0KLQlEUk1fRVJST1IoIlVzZXJzcGFjZSBzdGlsbCBoYXMgYWN0aXZlIG9iamVjdHMgIVxuIik7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJvYmosIG4sICZyZGV2LT5nZW0ub2JqZWN0cywgbGlzdCkgeworCWRldl9lcnIocmRldi0+ZGV2LCAiVXNlcnNwYWNlIHN0aWxsIGhhcyBhY3RpdmUgb2JqZWN0cyAhXG4iKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYm8sIG4sICZyZGV2LT5nZW0ub2JqZWN0cywgbGlzdCkgewogCQltdXRleF9sb2NrKCZyZGV2LT5kZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQlnb2JqID0gcm9iai0+Z29iajsKLQkJRFJNX0VSUk9SKCJGb3JjZSBmcmVlIGZvciAoJXAsJXAsJWx1LCVsdSlcbiIsCi0JCQkgIGdvYmosIHJvYmosICh1bnNpZ25lZCBsb25nKWdvYmotPnNpemUsCi0JCQkgICooKHVuc2lnbmVkIGxvbmcgKikmZ29iai0+cmVmY291bnQpKTsKLQkJbGlzdF9kZWxfaW5pdCgmcm9iai0+bGlzdCk7Ci0JCXJhZGVvbl9vYmplY3RfdW5yZWYoJnJvYmopOworCQlnb2JqID0gYm8tPmdvYmo7CisJCWRldl9lcnIocmRldi0+ZGV2LCAiJXAgJXAgJWx1ICVsdSBmb3JjZSBmcmVlXG4iLAorCQkJZ29iaiwgYm8sICh1bnNpZ25lZCBsb25nKWdvYmotPnNpemUsCisJCQkqKCh1bnNpZ25lZCBsb25nICopJmdvYmotPnJlZmNvdW50KSk7CisJCW11dGV4X2xvY2soJmJvLT5yZGV2LT5nZW0ubXV0ZXgpOworCQlsaXN0X2RlbF9pbml0KCZiby0+bGlzdCk7CisJCW11dGV4X3VubG9jaygmYm8tPnJkZXYtPmdlbS5tdXRleCk7CisJCXJhZGVvbl9ib191bnJlZigmYm8pOwogCQlnb2JqLT5kcml2ZXJfcHJpdmF0ZSA9IE5VTEw7CiAJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGdvYmopOwogCQltdXRleF91bmxvY2soJnJkZXYtPmRkZXYtPnN0cnVjdF9tdXRleCk7CiAJfQogfQogCi1pbnQgcmFkZW9uX29iamVjdF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoraW50IHJhZGVvbl9ib19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCS8qIEFkZCBhbiBNVFJSIGZvciB0aGUgVlJBTSAqLwogCXJkZXYtPm1jLnZyYW1fbXRyciA9IG10cnJfYWRkKHJkZXYtPm1jLmFwZXJfYmFzZSwgcmRldi0+bWMuYXBlcl9zaXplLApAQCAtMzgyLDEzICsyNTYsMTMgQEAKIAlyZXR1cm4gcmFkZW9uX3R0bV9pbml0KHJkZXYpOwogfQogCi12b2lkIHJhZGVvbl9vYmplY3RfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3ZvaWQgcmFkZW9uX2JvX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJcmFkZW9uX3R0bV9maW5pKHJkZXYpOwogfQogCi12b2lkIHJhZGVvbl9vYmplY3RfbGlzdF9hZGRfb2JqZWN0KHN0cnVjdCByYWRlb25fb2JqZWN0X2xpc3QgKmxvYmosCi0JCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3ZvaWQgcmFkZW9uX2JvX2xpc3RfYWRkX29iamVjdChzdHJ1Y3QgcmFkZW9uX2JvX2xpc3QgKmxvYmosCisJCQkJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKIHsKIAlpZiAobG9iai0+d2RvbWFpbikgewogCQlsaXN0X2FkZCgmbG9iai0+bGlzdCwgaGVhZCk7CkBAIC0zOTcsNzIgKzI3MSw2MiBAQAogCX0KIH0KIAotaW50IHJhZGVvbl9vYmplY3RfbGlzdF9yZXNlcnZlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCitpbnQgcmFkZW9uX2JvX2xpc3RfcmVzZXJ2ZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQogewotCXN0cnVjdCByYWRlb25fb2JqZWN0X2xpc3QgKmxvYmo7CisJc3RydWN0IHJhZGVvbl9ib19saXN0ICpsb2JqOwogCWludCByOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2JqLCBoZWFkLCBsaXN0KXsKLQkJaWYgKCFsb2JqLT5yb2JqLT5waW5fY291bnQpIHsKLQkJCXIgPSByYWRlb25fb2JqZWN0X3Jlc2VydmUobG9iai0+cm9iaiwgdHJ1ZSk7Ci0JCQlpZiAodW5saWtlbHkociAhPSAwKSkgewotCQkJCURSTV9FUlJPUigicmFkZW9uOiBmYWlsZWQgdG8gcmVzZXJ2ZSBvYmplY3QuXG4iKTsKLQkJCQlyZXR1cm4gcjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJfQorCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUobG9iai0+Ym8sIGZhbHNlKTsKKwkJaWYgKHVubGlrZWx5KHIgIT0gMCkpCisJCQlyZXR1cm4gcjsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgcmFkZW9uX29iamVjdF9saXN0X3VucmVzZXJ2ZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQordm9pZCByYWRlb25fYm9fbGlzdF91bnJlc2VydmUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKIHsKLQlzdHJ1Y3QgcmFkZW9uX29iamVjdF9saXN0ICpsb2JqOworCXN0cnVjdCByYWRlb25fYm9fbGlzdCAqbG9iajsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobG9iaiwgaGVhZCwgbGlzdCkgewotCQlpZiAoIWxvYmotPnJvYmotPnBpbl9jb3VudCkgewotCQkJcmFkZW9uX29iamVjdF91bnJlc2VydmUobG9iai0+cm9iaik7Ci0JCX0KKwkJLyogb25seSB1bnJlc2VydmUgb2JqZWN0IHdlIHN1Y2Nlc3NmdWxseSByZXNlcnZlZCAqLworCQlpZiAocmFkZW9uX2JvX2lzX3Jlc2VydmVkKGxvYmotPmJvKSkKKwkJCXJhZGVvbl9ib191bnJlc2VydmUobG9iai0+Ym8pOwogCX0KIH0KIAotaW50IHJhZGVvbl9vYmplY3RfbGlzdF92YWxpZGF0ZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCB2b2lkICpmZW5jZSkKK2ludCByYWRlb25fYm9fbGlzdF92YWxpZGF0ZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCB2b2lkICpmZW5jZSkKIHsKLQlzdHJ1Y3QgcmFkZW9uX29iamVjdF9saXN0ICpsb2JqOwotCXN0cnVjdCByYWRlb25fb2JqZWN0ICpyb2JqOworCXN0cnVjdCByYWRlb25fYm9fbGlzdCAqbG9iajsKKwlzdHJ1Y3QgcmFkZW9uX2JvICpibzsKIAlzdHJ1Y3QgcmFkZW9uX2ZlbmNlICpvbGRfZmVuY2UgPSBOVUxMOwogCWludCByOwogCi0JciA9IHJhZGVvbl9vYmplY3RfbGlzdF9yZXNlcnZlKGhlYWQpOworCXIgPSByYWRlb25fYm9fbGlzdF9yZXNlcnZlKGhlYWQpOwogCWlmICh1bmxpa2VseShyICE9IDApKSB7Ci0JCXJhZGVvbl9vYmplY3RfbGlzdF91bnJlc2VydmUoaGVhZCk7CiAJCXJldHVybiByOwogCX0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvYmosIGhlYWQsIGxpc3QpIHsKLQkJcm9iaiA9IGxvYmotPnJvYmo7Ci0JCWlmICghcm9iai0+cGluX2NvdW50KSB7CisJCWJvID0gbG9iai0+Ym87CisJCWlmICghYm8tPnBpbl9jb3VudCkgewogCQkJaWYgKGxvYmotPndkb21haW4pIHsKLQkJCQlyb2JqLT50b2JqLnByb3Bvc2VkX3BsYWNlbWVudCA9Ci0JCQkJCXJhZGVvbl9vYmplY3RfZmxhZ3NfZnJvbV9kb21haW4obG9iai0+d2RvbWFpbik7CisJCQkJcmFkZW9uX3R0bV9wbGFjZW1lbnRfZnJvbV9kb21haW4oYm8sCisJCQkJCQkJCWxvYmotPndkb21haW4pOwogCQkJfSBlbHNlIHsKLQkJCQlyb2JqLT50b2JqLnByb3Bvc2VkX3BsYWNlbWVudCA9Ci0JCQkJCXJhZGVvbl9vYmplY3RfZmxhZ3NfZnJvbV9kb21haW4obG9iai0+cmRvbWFpbik7CisJCQkJcmFkZW9uX3R0bV9wbGFjZW1lbnRfZnJvbV9kb21haW4oYm8sCisJCQkJCQkJCWxvYmotPnJkb21haW4pOwogCQkJfQotCQkJciA9IHR0bV9idWZmZXJfb2JqZWN0X3ZhbGlkYXRlKCZyb2JqLT50b2JqLAotCQkJCQkJICAgICAgIHJvYmotPnRvYmoucHJvcG9zZWRfcGxhY2VtZW50LAotCQkJCQkJICAgICAgIHRydWUsIGZhbHNlKTsKLQkJCWlmICh1bmxpa2VseShyKSkgewotCQkJCURSTV9FUlJPUigicmFkZW9uOiBmYWlsZWQgdG8gdmFsaWRhdGUuXG4iKTsKKwkJCXIgPSB0dG1fYm9fdmFsaWRhdGUoJmJvLT50Ym8sICZiby0+cGxhY2VtZW50LAorCQkJCQkJdHJ1ZSwgZmFsc2UpOworCQkJaWYgKHVubGlrZWx5KHIpKQogCQkJCXJldHVybiByOwotCQkJfQotCQkJcmFkZW9uX29iamVjdF9ncHVfYWRkcihyb2JqKTsKIAkJfQotCQlsb2JqLT5ncHVfb2Zmc2V0ID0gcm9iai0+Z3B1X2FkZHI7Ci0JCWxvYmotPnRpbGluZ19mbGFncyA9IHJvYmotPnRpbGluZ19mbGFnczsKKwkJbG9iai0+Z3B1X29mZnNldCA9IHJhZGVvbl9ib19ncHVfb2Zmc2V0KGJvKTsKKwkJbG9iai0+dGlsaW5nX2ZsYWdzID0gYm8tPnRpbGluZ19mbGFnczsKIAkJaWYgKGZlbmNlKSB7Ci0JCQlvbGRfZmVuY2UgPSAoc3RydWN0IHJhZGVvbl9mZW5jZSAqKXJvYmotPnRvYmouc3luY19vYmo7Ci0JCQlyb2JqLT50b2JqLnN5bmNfb2JqID0gcmFkZW9uX2ZlbmNlX3JlZihmZW5jZSk7Ci0JCQlyb2JqLT50b2JqLnN5bmNfb2JqX2FyZyA9IE5VTEw7CisJCQlvbGRfZmVuY2UgPSAoc3RydWN0IHJhZGVvbl9mZW5jZSAqKWJvLT50Ym8uc3luY19vYmo7CisJCQliby0+dGJvLnN5bmNfb2JqID0gcmFkZW9uX2ZlbmNlX3JlZihmZW5jZSk7CisJCQliby0+dGJvLnN5bmNfb2JqX2FyZyA9IE5VTEw7CiAJCX0KIAkJaWYgKG9sZF9mZW5jZSkgewogCQkJcmFkZW9uX2ZlbmNlX3VucmVmKCZvbGRfZmVuY2UpOwpAQCAtNDcxLDUxICszMzUsNDQgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCByYWRlb25fb2JqZWN0X2xpc3RfdW52YWxpZGF0ZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQordm9pZCByYWRlb25fYm9fbGlzdF91bnZhbGlkYXRlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHZvaWQgKmZlbmNlKQogewotCXN0cnVjdCByYWRlb25fb2JqZWN0X2xpc3QgKmxvYmo7Ci0Jc3RydWN0IHJhZGVvbl9mZW5jZSAqb2xkX2ZlbmNlID0gTlVMTDsKKwlzdHJ1Y3QgcmFkZW9uX2JvX2xpc3QgKmxvYmo7CisJc3RydWN0IHJhZGVvbl9mZW5jZSAqb2xkX2ZlbmNlOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShsb2JqLCBoZWFkLCBsaXN0KSB7Ci0JCW9sZF9mZW5jZSA9IChzdHJ1Y3QgcmFkZW9uX2ZlbmNlICopbG9iai0+cm9iai0+dG9iai5zeW5jX29iajsKLQkJbG9iai0+cm9iai0+dG9iai5zeW5jX29iaiA9IE5VTEw7Ci0JCWlmIChvbGRfZmVuY2UpIHsKLQkJCXJhZGVvbl9mZW5jZV91bnJlZigmb2xkX2ZlbmNlKTsKKwlpZiAoZmVuY2UpCisJCWxpc3RfZm9yX2VhY2hfZW50cnkobG9iaiwgaGVhZCwgbGlzdCkgeworCQkJb2xkX2ZlbmNlID0gdG9fcmFkZW9uX2ZlbmNlKGxvYmotPmJvLT50Ym8uc3luY19vYmopOworCQkJaWYgKG9sZF9mZW5jZSA9PSBmZW5jZSkgeworCQkJCWxvYmotPmJvLT50Ym8uc3luY19vYmogPSBOVUxMOworCQkJCXJhZGVvbl9mZW5jZV91bnJlZigmb2xkX2ZlbmNlKTsKKwkJCX0KIAkJfQotCX0KLQlyYWRlb25fb2JqZWN0X2xpc3RfdW5yZXNlcnZlKGhlYWQpOworCXJhZGVvbl9ib19saXN0X3VucmVzZXJ2ZShoZWFkKTsKIH0KIAotdm9pZCByYWRlb25fb2JqZWN0X2xpc3RfY2xlYW4oc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKLXsKLQlyYWRlb25fb2JqZWN0X2xpc3RfdW5yZXNlcnZlKGhlYWQpOwotfQotCi1pbnQgcmFkZW9uX29iamVjdF9mYmRldl9tbWFwKHN0cnVjdCByYWRlb25fb2JqZWN0ICpyb2JqLAoraW50IHJhZGVvbl9ib19mYmRldl9tbWFwKHN0cnVjdCByYWRlb25fYm8gKmJvLAogCQkJICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlyZXR1cm4gdHRtX2ZiZGV2X21tYXAodm1hLCAmcm9iai0+dG9iaik7CisJcmV0dXJuIHR0bV9mYmRldl9tbWFwKHZtYSwgJmJvLT50Ym8pOwogfQogCi11bnNpZ25lZCBsb25nIHJhZGVvbl9vYmplY3Rfc2l6ZShzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iaikKK2ludCByYWRlb25fYm9fZ2V0X3N1cmZhY2VfcmVnKHN0cnVjdCByYWRlb25fYm8gKmJvKQogewotCXJldHVybiByb2JqLT50b2JqLm51bV9wYWdlcyA8PCBQQUdFX1NISUZUOwotfQotCi1pbnQgcmFkZW9uX29iamVjdF9nZXRfc3VyZmFjZV9yZWcoc3RydWN0IHJhZGVvbl9vYmplY3QgKnJvYmopCi17Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSByb2JqLT5yZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gYm8tPnJkZXY7CiAJc3RydWN0IHJhZGVvbl9zdXJmYWNlX3JlZyAqcmVnOwotCXN0cnVjdCByYWRlb25fb2JqZWN0ICpvbGRfb2JqZWN0OworCXN0cnVjdCByYWRlb25fYm8gKm9sZF9vYmplY3Q7CiAJaW50IHN0ZWFsOwogCWludCBpOwogCi0JaWYgKCFyb2JqLT50aWxpbmdfZmxhZ3MpCisJQlVHX09OKCFhdG9taWNfcmVhZCgmYm8tPnRiby5yZXNlcnZlZCkpOworCisJaWYgKCFiby0+dGlsaW5nX2ZsYWdzKQogCQlyZXR1cm4gMDsKIAotCWlmIChyb2JqLT5zdXJmYWNlX3JlZyA+PSAwKSB7Ci0JCXJlZyA9ICZyZGV2LT5zdXJmYWNlX3JlZ3Nbcm9iai0+c3VyZmFjZV9yZWddOwotCQlpID0gcm9iai0+c3VyZmFjZV9yZWc7CisJaWYgKGJvLT5zdXJmYWNlX3JlZyA+PSAwKSB7CisJCXJlZyA9ICZyZGV2LT5zdXJmYWNlX3JlZ3NbYm8tPnN1cmZhY2VfcmVnXTsKKwkJaSA9IGJvLT5zdXJmYWNlX3JlZzsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC01MjMsMTAgKzM4MCwxMCBAQAogCWZvciAoaSA9IDA7IGkgPCBSQURFT05fR0VNX01BWF9TVVJGQUNFUzsgaSsrKSB7CiAKIAkJcmVnID0gJnJkZXYtPnN1cmZhY2VfcmVnc1tpXTsKLQkJaWYgKCFyZWctPnJvYmopCisJCWlmICghcmVnLT5ibykKIAkJCWJyZWFrOwogCi0JCW9sZF9vYmplY3QgPSByZWctPnJvYmo7CisJCW9sZF9vYmplY3QgPSByZWctPmJvOwogCQlpZiAob2xkX29iamVjdC0+cGluX2NvdW50ID09IDApCiAJCQlzdGVhbCA9IGk7CiAJfQpAQCAtNTM3LDkxICszOTQsMTAxIEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJLyogZmluZCBzb21lb25lIHdpdGggYSBzdXJmYWNlIHJlZyBhbmQgbnVrZSB0aGVpciBCTyAqLwogCQlyZWcgPSAmcmRldi0+c3VyZmFjZV9yZWdzW3N0ZWFsXTsKLQkJb2xkX29iamVjdCA9IHJlZy0+cm9iajsKKwkJb2xkX29iamVjdCA9IHJlZy0+Ym87CiAJCS8qIGJsb3cgYXdheSB0aGUgbWFwcGluZyAqLwogCQlEUk1fREVCVUcoInN0ZWFsaW5nIHN1cmZhY2UgcmVnICVkIGZyb20gJXBcbiIsIHN0ZWFsLCBvbGRfb2JqZWN0KTsKLQkJdHRtX2JvX3VubWFwX3ZpcnR1YWwoJm9sZF9vYmplY3QtPnRvYmopOworCQl0dG1fYm9fdW5tYXBfdmlydHVhbCgmb2xkX29iamVjdC0+dGJvKTsKIAkJb2xkX29iamVjdC0+c3VyZmFjZV9yZWcgPSAtMTsKIAkJaSA9IHN0ZWFsOwogCX0KIAotCXJvYmotPnN1cmZhY2VfcmVnID0gaTsKLQlyZWctPnJvYmogPSByb2JqOworCWJvLT5zdXJmYWNlX3JlZyA9IGk7CisJcmVnLT5ibyA9IGJvOwogCiBvdXQ6Ci0JcmFkZW9uX3NldF9zdXJmYWNlX3JlZyhyZGV2LCBpLCByb2JqLT50aWxpbmdfZmxhZ3MsIHJvYmotPnBpdGNoLAotCQkJICAgICAgIHJvYmotPnRvYmoubWVtLm1tX25vZGUtPnN0YXJ0IDw8IFBBR0VfU0hJRlQsCi0JCQkgICAgICAgcm9iai0+dG9iai5udW1fcGFnZXMgPDwgUEFHRV9TSElGVCk7CisJcmFkZW9uX3NldF9zdXJmYWNlX3JlZyhyZGV2LCBpLCBiby0+dGlsaW5nX2ZsYWdzLCBiby0+cGl0Y2gsCisJCQkgICAgICAgYm8tPnRiby5tZW0ubW1fbm9kZS0+c3RhcnQgPDwgUEFHRV9TSElGVCwKKwkJCSAgICAgICBiby0+dGJvLm51bV9wYWdlcyA8PCBQQUdFX1NISUZUKTsKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCByYWRlb25fb2JqZWN0X2NsZWFyX3N1cmZhY2VfcmVnKHN0cnVjdCByYWRlb25fb2JqZWN0ICpyb2JqKQorc3RhdGljIHZvaWQgcmFkZW9uX2JvX2NsZWFyX3N1cmZhY2VfcmVnKHN0cnVjdCByYWRlb25fYm8gKmJvKQogewotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gcm9iai0+cmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGJvLT5yZGV2OwogCXN0cnVjdCByYWRlb25fc3VyZmFjZV9yZWcgKnJlZzsKIAotCWlmIChyb2JqLT5zdXJmYWNlX3JlZyA9PSAtMSkKKwlpZiAoYm8tPnN1cmZhY2VfcmVnID09IC0xKQogCQlyZXR1cm47CiAKLQlyZWcgPSAmcmRldi0+c3VyZmFjZV9yZWdzW3JvYmotPnN1cmZhY2VfcmVnXTsKLQlyYWRlb25fY2xlYXJfc3VyZmFjZV9yZWcocmRldiwgcm9iai0+c3VyZmFjZV9yZWcpOworCXJlZyA9ICZyZGV2LT5zdXJmYWNlX3JlZ3NbYm8tPnN1cmZhY2VfcmVnXTsKKwlyYWRlb25fY2xlYXJfc3VyZmFjZV9yZWcocmRldiwgYm8tPnN1cmZhY2VfcmVnKTsKIAotCXJlZy0+cm9iaiA9IE5VTEw7Ci0Jcm9iai0+c3VyZmFjZV9yZWcgPSAtMTsKKwlyZWctPmJvID0gTlVMTDsKKwliby0+c3VyZmFjZV9yZWcgPSAtMTsKIH0KIAotdm9pZCByYWRlb25fb2JqZWN0X3NldF90aWxpbmdfZmxhZ3Moc3RydWN0IHJhZGVvbl9vYmplY3QgKnJvYmosCi0JCQkJICAgIHVpbnQzMl90IHRpbGluZ19mbGFncywgdWludDMyX3QgcGl0Y2gpCitpbnQgcmFkZW9uX2JvX3NldF90aWxpbmdfZmxhZ3Moc3RydWN0IHJhZGVvbl9ibyAqYm8sCisJCQkJdWludDMyX3QgdGlsaW5nX2ZsYWdzLCB1aW50MzJfdCBwaXRjaCkKIHsKLQlyb2JqLT50aWxpbmdfZmxhZ3MgPSB0aWxpbmdfZmxhZ3M7Ci0Jcm9iai0+cGl0Y2ggPSBwaXRjaDsKKwlpbnQgcjsKKworCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShibywgZmFsc2UpOworCWlmICh1bmxpa2VseShyICE9IDApKQorCQlyZXR1cm4gcjsKKwliby0+dGlsaW5nX2ZsYWdzID0gdGlsaW5nX2ZsYWdzOworCWJvLT5waXRjaCA9IHBpdGNoOworCXJhZGVvbl9ib191bnJlc2VydmUoYm8pOworCXJldHVybiAwOwogfQogCi12b2lkIHJhZGVvbl9vYmplY3RfZ2V0X3RpbGluZ19mbGFncyhzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iaiwKLQkJCQkgICAgdWludDMyX3QgKnRpbGluZ19mbGFncywKLQkJCQkgICAgdWludDMyX3QgKnBpdGNoKQordm9pZCByYWRlb25fYm9fZ2V0X3RpbGluZ19mbGFncyhzdHJ1Y3QgcmFkZW9uX2JvICpibywKKwkJCQl1aW50MzJfdCAqdGlsaW5nX2ZsYWdzLAorCQkJCXVpbnQzMl90ICpwaXRjaCkKIHsKKwlCVUdfT04oIWF0b21pY19yZWFkKCZiby0+dGJvLnJlc2VydmVkKSk7CiAJaWYgKHRpbGluZ19mbGFncykKLQkJKnRpbGluZ19mbGFncyA9IHJvYmotPnRpbGluZ19mbGFnczsKKwkJKnRpbGluZ19mbGFncyA9IGJvLT50aWxpbmdfZmxhZ3M7CiAJaWYgKHBpdGNoKQotCQkqcGl0Y2ggPSByb2JqLT5waXRjaDsKKwkJKnBpdGNoID0gYm8tPnBpdGNoOwogfQogCi1pbnQgcmFkZW9uX29iamVjdF9jaGVja190aWxpbmcoc3RydWN0IHJhZGVvbl9vYmplY3QgKnJvYmosIGJvb2wgaGFzX21vdmVkLAotCQkJICAgICAgIGJvb2wgZm9yY2VfZHJvcCkKK2ludCByYWRlb25fYm9fY2hlY2tfdGlsaW5nKHN0cnVjdCByYWRlb25fYm8gKmJvLCBib29sIGhhc19tb3ZlZCwKKwkJCQlib29sIGZvcmNlX2Ryb3ApCiB7Ci0JaWYgKCEocm9iai0+dGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19TVVJGQUNFKSkKKwlCVUdfT04oIWF0b21pY19yZWFkKCZiby0+dGJvLnJlc2VydmVkKSk7CisKKwlpZiAoIShiby0+dGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19TVVJGQUNFKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoZm9yY2VfZHJvcCkgewotCQlyYWRlb25fb2JqZWN0X2NsZWFyX3N1cmZhY2VfcmVnKHJvYmopOworCQlyYWRlb25fYm9fY2xlYXJfc3VyZmFjZV9yZWcoYm8pOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAocm9iai0+dG9iai5tZW0ubWVtX3R5cGUgIT0gVFRNX1BMX1ZSQU0pIHsKKwlpZiAoYm8tPnRiby5tZW0ubWVtX3R5cGUgIT0gVFRNX1BMX1ZSQU0pIHsKIAkJaWYgKCFoYXNfbW92ZWQpCiAJCQlyZXR1cm4gMDsKIAotCQlpZiAocm9iai0+c3VyZmFjZV9yZWcgPj0gMCkKLQkJCXJhZGVvbl9vYmplY3RfY2xlYXJfc3VyZmFjZV9yZWcocm9iaik7CisJCWlmIChiby0+c3VyZmFjZV9yZWcgPj0gMCkKKwkJCXJhZGVvbl9ib19jbGVhcl9zdXJmYWNlX3JlZyhibyk7CiAJCXJldHVybiAwOwogCX0KIAotCWlmICgocm9iai0+c3VyZmFjZV9yZWcgPj0gMCkgJiYgIWhhc19tb3ZlZCkKKwlpZiAoKGJvLT5zdXJmYWNlX3JlZyA+PSAwKSAmJiAhaGFzX21vdmVkKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiByYWRlb25fb2JqZWN0X2dldF9zdXJmYWNlX3JlZyhyb2JqKTsKKwlyZXR1cm4gcmFkZW9uX2JvX2dldF9zdXJmYWNlX3JlZyhibyk7CiB9CiAKIHZvaWQgcmFkZW9uX2JvX21vdmVfbm90aWZ5KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sCi0JCQkgIHN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtKQorCQkJCXN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtKQogewotCXN0cnVjdCByYWRlb25fb2JqZWN0ICpyb2JqID0gY29udGFpbmVyX29mKGJvLCBzdHJ1Y3QgcmFkZW9uX29iamVjdCwgdG9iaik7Ci0JcmFkZW9uX29iamVjdF9jaGVja190aWxpbmcocm9iaiwgMCwgMSk7CisJc3RydWN0IHJhZGVvbl9ibyAqcmJvID0gY29udGFpbmVyX29mKGJvLCBzdHJ1Y3QgcmFkZW9uX2JvLCB0Ym8pOworCXJhZGVvbl9ib19jaGVja190aWxpbmcocmJvLCAwLCAxKTsKIH0KIAogdm9pZCByYWRlb25fYm9fZmF1bHRfcmVzZXJ2ZV9ub3RpZnkoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKIHsKLQlzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iaiA9IGNvbnRhaW5lcl9vZihibywgc3RydWN0IHJhZGVvbl9vYmplY3QsIHRvYmopOwotCXJhZGVvbl9vYmplY3RfY2hlY2tfdGlsaW5nKHJvYmosIDAsIDApOworCXN0cnVjdCByYWRlb25fYm8gKnJibyA9IGNvbnRhaW5lcl9vZihibywgc3RydWN0IHJhZGVvbl9ibywgdGJvKTsKKwlyYWRlb25fYm9fY2hlY2tfdGlsaW5nKHJibywgMCwgMCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9vYmplY3QuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5oCmluZGV4IDEwZThhZjYuLmY2YjY5YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5oCkBAIC0yOCwxOSArMjgsMTUyIEBACiAjaWZuZGVmIF9fUkFERU9OX09CSkVDVF9IX18KICNkZWZpbmUgX19SQURFT05fT0JKRUNUX0hfXwogCi0jaW5jbHVkZSA8dHRtL3R0bV9ib19hcGkuaD4KLSNpbmNsdWRlIDx0dG0vdHRtX2JvX2RyaXZlci5oPgotI2luY2x1ZGUgPHR0bS90dG1fcGxhY2VtZW50Lmg+Ci0jaW5jbHVkZSA8dHRtL3R0bV9tb2R1bGUuaD4KKyNpbmNsdWRlIDxkcm0vcmFkZW9uX2RybS5oPgorI2luY2x1ZGUgInJhZGVvbi5oIgogCi0vKgotICogVFRNLgorLyoqCisgKiByYWRlb25fbWVtX3R5cGVfdG9fZG9tYWluIC0gcmV0dXJuIGRvbWFpbiBjb3JyZXNwb25kaW5nIHRvIG1lbV90eXBlCisgKiBAbWVtX3R5cGU6CXR0bSBtZW1vcnkgdHlwZQorICoKKyAqIFJldHVybnMgY29ycmVzcG9uZGluZyBkb21haW4gb2YgdGhlIHR0bSBtZW1fdHlwZQogICovCi1zdHJ1Y3QgcmFkZW9uX21tYW4gewotCXN0cnVjdCB0dG1fYm9fZ2xvYmFsX3JlZiAgICAgICAgYm9fZ2xvYmFsX3JlZjsKLQlzdHJ1Y3QgdHRtX2dsb2JhbF9yZWZlcmVuY2UJbWVtX2dsb2JhbF9yZWY7Ci0JYm9vbAkJCQltZW1fZ2xvYmFsX3JlZmVyZW5jZWQ7Ci0Jc3RydWN0IHR0bV9ib19kZXZpY2UJCWJkZXY7Ci19Oworc3RhdGljIGlubGluZSB1bnNpZ25lZCByYWRlb25fbWVtX3R5cGVfdG9fZG9tYWluKHUzMiBtZW1fdHlwZSkKK3sKKwlzd2l0Y2ggKG1lbV90eXBlKSB7CisJY2FzZSBUVE1fUExfVlJBTToKKwkJcmV0dXJuIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU07CisJY2FzZSBUVE1fUExfVFQ6CisJCXJldHVybiBSQURFT05fR0VNX0RPTUFJTl9HVFQ7CisJY2FzZSBUVE1fUExfU1lTVEVNOgorCQlyZXR1cm4gUkFERU9OX0dFTV9ET01BSU5fQ1BVOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KIAorLyoqCisgKiByYWRlb25fYm9fcmVzZXJ2ZSAtIHJlc2VydmUgYm8KKyAqIEBibzoJCWJvIHN0cnVjdHVyZQorICogQG5vX3dhaXQ6CQlkb24ndCBzbGVlcCB3aGlsZSB0cnlpbmcgdG8gcmVzZXJ2ZSAocmV0dXJuIC1FQlVTWSkKKyAqCisgKiBSZXR1cm5zOgorICogLUVCVVNZOiBidWZmZXIgaXMgYnVzeSBhbmQgQG5vX3dhaXQgaXMgdHJ1ZQorICogLUVSRVNUQVJUOiBBIHdhaXQgZm9yIHRoZSBidWZmZXIgdG8gYmVjb21lIHVucmVzZXJ2ZWQgd2FzIGludGVycnVwdGVkIGJ5CisgKiBhIHNpZ25hbC4gUmVsZWFzZSBhbGwgYnVmZmVyIHJlc2VydmF0aW9ucyBhbmQgcmV0dXJuIHRvIHVzZXItc3BhY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJhZGVvbl9ib19yZXNlcnZlKHN0cnVjdCByYWRlb25fYm8gKmJvLCBib29sIG5vX3dhaXQpCit7CisJaW50IHI7CisKK3JldHJ5OgorCXIgPSB0dG1fYm9fcmVzZXJ2ZSgmYm8tPnRibywgdHJ1ZSwgbm9fd2FpdCwgZmFsc2UsIDApOworCWlmICh1bmxpa2VseShyICE9IDApKSB7CisJCWlmIChyID09IC1FUkVTVEFSVCkKKwkJCWdvdG8gcmV0cnk7CisJCWRldl9lcnIoYm8tPnJkZXYtPmRldiwgIiVwIHJlc2VydmUgZmFpbGVkXG4iLCBibyk7CisJCXJldHVybiByOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJhZGVvbl9ib191bnJlc2VydmUoc3RydWN0IHJhZGVvbl9ibyAqYm8pCit7CisJdHRtX2JvX3VucmVzZXJ2ZSgmYm8tPnRibyk7Cit9CisKKy8qKgorICogcmFkZW9uX2JvX2dwdV9vZmZzZXQgLSByZXR1cm4gR1BVIG9mZnNldCBvZiBibworICogQGJvOglyYWRlb24gb2JqZWN0IGZvciB3aGljaCB3ZSBxdWVyeSB0aGUgb2Zmc2V0CisgKgorICogUmV0dXJucyBjdXJyZW50IEdQVSBvZmZzZXQgb2YgdGhlIG9iamVjdC4KKyAqCisgKiBOb3RlOiBvYmplY3Qgc2hvdWxkIGVpdGhlciBiZSBwaW5uZWQgb3IgcmVzZXJ2ZWQgd2hlbiBjYWxsaW5nIHRoaXMKKyAqIGZ1bmN0aW9uLCBpdCBtaWdodCBiZSB1c2VmdWxsIHRvIGFkZCBjaGVjayBmb3IgdGhpcyBmb3IgZGVidWdnaW5nLgorICovCitzdGF0aWMgaW5saW5lIHU2NCByYWRlb25fYm9fZ3B1X29mZnNldChzdHJ1Y3QgcmFkZW9uX2JvICpibykKK3sKKwlyZXR1cm4gYm8tPnRiby5vZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByYWRlb25fYm9fc2l6ZShzdHJ1Y3QgcmFkZW9uX2JvICpibykKK3sKKwlyZXR1cm4gYm8tPnRiby5udW1fcGFnZXMgPDwgUEFHRV9TSElGVDsKK30KKworc3RhdGljIGlubGluZSBib29sIHJhZGVvbl9ib19pc19yZXNlcnZlZChzdHJ1Y3QgcmFkZW9uX2JvICpibykKK3sKKwlyZXR1cm4gISFhdG9taWNfcmVhZCgmYm8tPnRiby5yZXNlcnZlZCk7Cit9CisKKy8qKgorICogcmFkZW9uX2JvX21tYXBfb2Zmc2V0IC0gcmV0dXJuIG1tYXAgb2Zmc2V0IG9mIGJvCisgKiBAYm86CXJhZGVvbiBvYmplY3QgZm9yIHdoaWNoIHdlIHF1ZXJ5IHRoZSBvZmZzZXQKKyAqCisgKiBSZXR1cm5zIG1tYXAgb2Zmc2V0IG9mIHRoZSBvYmplY3QuCisgKgorICogTm90ZTogYWRkcl9zcGFjZV9vZmZzZXQgaXMgY29uc3RhbnQgYWZ0ZXIgdHRtIGJvIGluaXQgdGh1cyBpc24ndCBwcm90ZWN0ZWQKKyAqIGJ5IGFueSBsb2NrLgorICovCitzdGF0aWMgaW5saW5lIHU2NCByYWRlb25fYm9fbW1hcF9vZmZzZXQoc3RydWN0IHJhZGVvbl9ibyAqYm8pCit7CisJcmV0dXJuIGJvLT50Ym8uYWRkcl9zcGFjZV9vZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJhZGVvbl9ib193YWl0KHN0cnVjdCByYWRlb25fYm8gKmJvLCB1MzIgKm1lbV90eXBlLAorCQkJCQlib29sIG5vX3dhaXQpCit7CisJaW50IHI7CisKK3JldHJ5OgorCXIgPSB0dG1fYm9fcmVzZXJ2ZSgmYm8tPnRibywgdHJ1ZSwgbm9fd2FpdCwgZmFsc2UsIDApOworCWlmICh1bmxpa2VseShyICE9IDApKSB7CisJCWlmIChyID09IC1FUkVTVEFSVCkKKwkJCWdvdG8gcmV0cnk7CisJCWRldl9lcnIoYm8tPnJkZXYtPmRldiwgIiVwIHJlc2VydmUgZmFpbGVkIGZvciB3YWl0XG4iLCBibyk7CisJCXJldHVybiByOworCX0KKwlzcGluX2xvY2soJmJvLT50Ym8ubG9jayk7CisJaWYgKG1lbV90eXBlKQorCQkqbWVtX3R5cGUgPSBiby0+dGJvLm1lbS5tZW1fdHlwZTsKKwlpZiAoYm8tPnRiby5zeW5jX29iaikKKwkJciA9IHR0bV9ib193YWl0KCZiby0+dGJvLCB0cnVlLCB0cnVlLCBub193YWl0KTsKKwlzcGluX3VubG9jaygmYm8tPnRiby5sb2NrKTsKKwl0dG1fYm9fdW5yZXNlcnZlKCZiby0+dGJvKTsKKwlpZiAodW5saWtlbHkociA9PSAtRVJFU1RBUlQpKQorCQlnb3RvIHJldHJ5OworCXJldHVybiByOworfQorCitleHRlcm4gaW50IHJhZGVvbl9ib19jcmVhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnb2JqLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJYm9vbCBrZXJuZWwsIHUzMiBkb21haW4sCisJCQkJc3RydWN0IHJhZGVvbl9ibyAqKmJvX3B0cik7CitleHRlcm4gaW50IHJhZGVvbl9ib19rbWFwKHN0cnVjdCByYWRlb25fYm8gKmJvLCB2b2lkICoqcHRyKTsKK2V4dGVybiB2b2lkIHJhZGVvbl9ib19rdW5tYXAoc3RydWN0IHJhZGVvbl9ibyAqYm8pOworZXh0ZXJuIHZvaWQgcmFkZW9uX2JvX3VucmVmKHN0cnVjdCByYWRlb25fYm8gKipibyk7CitleHRlcm4gaW50IHJhZGVvbl9ib19waW4oc3RydWN0IHJhZGVvbl9ibyAqYm8sIHUzMiBkb21haW4sIHU2NCAqZ3B1X2FkZHIpOworZXh0ZXJuIGludCByYWRlb25fYm9fdW5waW4oc3RydWN0IHJhZGVvbl9ibyAqYm8pOworZXh0ZXJuIGludCByYWRlb25fYm9fZXZpY3RfdnJhbShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdm9pZCByYWRlb25fYm9fZm9yY2VfZGVsZXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiBpbnQgcmFkZW9uX2JvX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgcmFkZW9uX2JvX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgcmFkZW9uX2JvX2xpc3RfYWRkX29iamVjdChzdHJ1Y3QgcmFkZW9uX2JvX2xpc3QgKmxvYmosCisJCQkJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7CitleHRlcm4gaW50IHJhZGVvbl9ib19saXN0X3Jlc2VydmUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7CitleHRlcm4gdm9pZCByYWRlb25fYm9fbGlzdF91bnJlc2VydmUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7CitleHRlcm4gaW50IHJhZGVvbl9ib19saXN0X3ZhbGlkYXRlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHZvaWQgKmZlbmNlKTsKK2V4dGVybiB2b2lkIHJhZGVvbl9ib19saXN0X3VudmFsaWRhdGUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgdm9pZCAqZmVuY2UpOworZXh0ZXJuIGludCByYWRlb25fYm9fZmJkZXZfbW1hcChzdHJ1Y3QgcmFkZW9uX2JvICpibywKKwkJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CitleHRlcm4gaW50IHJhZGVvbl9ib19zZXRfdGlsaW5nX2ZsYWdzKHN0cnVjdCByYWRlb25fYm8gKmJvLAorCQkJCXUzMiB0aWxpbmdfZmxhZ3MsIHUzMiBwaXRjaCk7CitleHRlcm4gdm9pZCByYWRlb25fYm9fZ2V0X3RpbGluZ19mbGFncyhzdHJ1Y3QgcmFkZW9uX2JvICpibywKKwkJCQl1MzIgKnRpbGluZ19mbGFncywgdTMyICpwaXRjaCk7CitleHRlcm4gaW50IHJhZGVvbl9ib19jaGVja190aWxpbmcoc3RydWN0IHJhZGVvbl9ibyAqYm8sIGJvb2wgaGFzX21vdmVkLAorCQkJCWJvb2wgZm9yY2VfZHJvcCk7CitleHRlcm4gdm9pZCByYWRlb25fYm9fbW92ZV9ub3RpZnkoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKKwkJCQkJc3RydWN0IHR0bV9tZW1fcmVnICptZW0pOworZXh0ZXJuIHZvaWQgcmFkZW9uX2JvX2ZhdWx0X3Jlc2VydmVfbm90aWZ5KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pOworZXh0ZXJuIGludCByYWRlb25fYm9fZ2V0X3N1cmZhY2VfcmVnKHN0cnVjdCByYWRlb25fYm8gKmJvKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3BtLmMKaW5kZXggNDYxNDZjNi4uMzRiMDhkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcG0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9wbS5jCkBAIC0yNyw3ICsyNyw3IEBACiBpbnQgcmFkZW9uX3BtX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJaWYgKHJhZGVvbl9kZWJ1Z2ZzX3BtX2luaXQocmRldikpIHsKLQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gcmVnaXN0ZXIgZGVidWdmcyBmaWxlIGZvciBDUCAhXG4iKTsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gcmVnaXN0ZXIgZGVidWdmcyBmaWxlIGZvciBQTSFcbiIpOwogCX0KIAogCXJldHVybiAwOwpAQCAtNDQsOCArNDQsOCBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAotCXNlcV9wcmludGYobSwgImVuZ2luZSBjbG9jazogJXUwIEh6XG4iLCByYWRlb25fZ2V0X2VuZ2luZV9jbG9jayhyZGV2KSk7Ci0Jc2VxX3ByaW50ZihtLCAibWVtb3J5IGNsb2NrOiAldTAgSHpcbiIsIHJhZGVvbl9nZXRfbWVtb3J5X2Nsb2NrKHJkZXYpKTsKKwlzZXFfcHJpbnRmKG0sICJlbmdpbmUgY2xvY2s6ICV1MCBrSHpcbiIsIHJhZGVvbl9nZXRfZW5naW5lX2Nsb2NrKHJkZXYpKTsKKwlzZXFfcHJpbnRmKG0sICJtZW1vcnkgY2xvY2s6ICV1MCBrSHpcbiIsIHJhZGVvbl9nZXRfbWVtb3J5X2Nsb2NrKHJkZXYpKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9yZWcuaAppbmRleCAyOWFiNzU5Li42ZDBhMDA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9yZWcuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9yZWcuaApAQCAtODg3LDYgKzg4Nyw3IEBACiAjICAgICAgIGRlZmluZSBSQURFT05fRlBfUEFORUxfRk9STUFUICAgICAgICAgICgxIDw8ICAzKQogIyAgICAgICBkZWZpbmUgUkFERU9OX0ZQX0VOX1RNRFMgICAgICAgICAgICAgICAoMSA8PCAgNykKICMgICAgICAgZGVmaW5lIFJBREVPTl9GUF9ERVRFQ1RfU0VOU0UgICAgICAgICAgKDEgPDwgIDgpCisjICAgICAgIGRlZmluZSBSQURFT05fRlBfREVURUNUX0lOVF9QT0wgICAgICAgICgxIDw8ICA5KQogIyAgICAgICBkZWZpbmUgUjIwMF9GUF9TT1VSQ0VfU0VMX01BU0sgICAgICAgICAoMyA8PCAgMTApCiAjICAgICAgIGRlZmluZSBSMjAwX0ZQX1NPVVJDRV9TRUxfQ1JUQzEgICAgICAgICgwIDw8ICAxMCkKICMgICAgICAgZGVmaW5lIFIyMDBfRlBfU09VUkNFX1NFTF9DUlRDMiAgICAgICAgKDEgPDwgIDEwKQpAQCAtODk0LDYgKzg5NSw3IEBACiAjICAgICAgIGRlZmluZSBSMjAwX0ZQX1NPVVJDRV9TRUxfVFJBTlMgICAgICAgICgzIDw8ICAxMCkKICMgICAgICAgZGVmaW5lIFJBREVPTl9GUF9TRUxfQ1JUQzEgICAgICAgICAgICAgKDAgPDwgMTMpCiAjICAgICAgIGRlZmluZSBSQURFT05fRlBfU0VMX0NSVEMyICAgICAgICAgICAgICgxIDw8IDEzKQorIyAgICAgICBkZWZpbmUgUjMwMF9IUERfU0VMKHgpICAgICAgICAgICAgICAgICAoKHgpIDw8IDEzKQogIyAgICAgICBkZWZpbmUgUkFERU9OX0ZQX0NSVENfRE9OVF9TSEFET1dfSFBBUiAoMSA8PCAxNSkKICMgICAgICAgZGVmaW5lIFJBREVPTl9GUF9DUlRDX0RPTlRfU0hBRE9XX1ZQQVIgKDEgPDwgMTYpCiAjICAgICAgIGRlZmluZSBSQURFT05fRlBfQ1JUQ19ET05UX1NIQURPV19IRU5EICgxIDw8IDE3KQpAQCAtOTA5LDYgKzkxMSw3IEBACiAjICAgICAgIGRlZmluZSBSQURFT05fRlAyX09OICAgICAgICAgICAgICAgICAgICgxIDw8ICAyKQogIyAgICAgICBkZWZpbmUgUkFERU9OX0ZQMl9QQU5FTF9GT1JNQVQgICAgICAgICAoMSA8PCAgMykKICMgICAgICAgZGVmaW5lIFJBREVPTl9GUDJfREVURUNUX1NFTlNFICAgICAgICAgKDEgPDwgIDgpCisjICAgICAgIGRlZmluZSBSQURFT05fRlAyX0RFVEVDVF9JTlRfUE9MICAgICAgICgxIDw8ICA5KQogIyAgICAgICBkZWZpbmUgUjIwMF9GUDJfU09VUkNFX1NFTF9NQVNLICAgICAgICAoMyA8PCAxMCkKICMgICAgICAgZGVmaW5lIFIyMDBfRlAyX1NPVVJDRV9TRUxfQ1JUQzEgICAgICAgKDAgPDwgMTApCiAjICAgICAgIGRlZmluZSBSMjAwX0ZQMl9TT1VSQ0VfU0VMX0NSVEMyICAgICAgICgxIDw8IDEwKQpAQCAtOTg4LDE0ICs5OTEsMjAgQEAKIAogI2RlZmluZSBSQURFT05fR0VOX0lOVF9DTlRMICAgICAgICAgICAgICAgICAweDAwNDAKICMJZGVmaW5lIFJBREVPTl9DUlRDX1ZCTEFOS19NQVNLCQkoMSA8PCAwKQorIwlkZWZpbmUgUkFERU9OX0ZQX0RFVEVDVF9NQVNLCQkoMSA8PCA0KQogIwlkZWZpbmUgUkFERU9OX0NSVEMyX1ZCTEFOS19NQVNLCQkoMSA8PCA5KQorIwlkZWZpbmUgUkFERU9OX0ZQMl9ERVRFQ1RfTUFTSwkJKDEgPDwgMTApCiAjCWRlZmluZSBSQURFT05fU1dfSU5UX0VOQUJMRQkJKDEgPDwgMjUpCiAjZGVmaW5lIFJBREVPTl9HRU5fSU5UX1NUQVRVUyAgICAgICAgICAgICAgIDB4MDA0NAogIwlkZWZpbmUgQVZJVk9fRElTUExBWV9JTlRfU1RBVFVTCQkoMSA8PCAwKQogIwlkZWZpbmUgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQJCSgxIDw8IDApCiAjCWRlZmluZSBSQURFT05fQ1JUQ19WQkxBTktfU1RBVF9BQ0sJKDEgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9GUF9ERVRFQ1RfU1RBVAkJKDEgPDwgNCkKKyMJZGVmaW5lIFJBREVPTl9GUF9ERVRFQ1RfU1RBVF9BQ0sJKDEgPDwgNCkKICMJZGVmaW5lIFJBREVPTl9DUlRDMl9WQkxBTktfU1RBVAkJKDEgPDwgOSkKICMJZGVmaW5lIFJBREVPTl9DUlRDMl9WQkxBTktfU1RBVF9BQ0sJKDEgPDwgOSkKKyMJZGVmaW5lIFJBREVPTl9GUDJfREVURUNUX1NUQVQJCSgxIDw8IDEwKQorIwlkZWZpbmUgUkFERU9OX0ZQMl9ERVRFQ1RfU1RBVF9BQ0sJKDEgPDwgMTApCiAjCWRlZmluZSBSQURFT05fU1dfSU5UX0ZJUkUJCSgxIDw8IDI2KQogIwlkZWZpbmUgUkFERU9OX1NXX0lOVF9URVNUCQkoMSA8PCAyNSkKICMJZGVmaW5lIFJBREVPTl9TV19JTlRfVEVTVF9BQ0sJCSgxIDw8IDI1KQpAQCAtMTA1MSwyMCArMTA2MCwyNSBAQAogCiAgICAgICAgLyogTXVsdGltZWRpYSBJMkMgYnVzICovCiAjZGVmaW5lIFJBREVPTl9JMkNfQ05UTF8wCQkgICAgMHgwMDkwCi0jZGVmaW5lIFJBREVPTl9JMkNfRE9ORSAoMTw8MCkKLSNkZWZpbmUgUkFERU9OX0kyQ19OQUNLICgxPDwxKQotI2RlZmluZSBSQURFT05fSTJDX0hBTFQgKDE8PDIpCi0jZGVmaW5lIFJBREVPTl9JMkNfU09GVF9SU1QgKDE8PDUpCi0jZGVmaW5lIFJBREVPTl9JMkNfRFJJVkVfRU4gKDE8PDYpCi0jZGVmaW5lIFJBREVPTl9JMkNfRFJJVkVfU0VMICgxPDw3KQotI2RlZmluZSBSQURFT05fSTJDX1NUQVJUICgxPDw4KQotI2RlZmluZSBSQURFT05fSTJDX1NUT1AgKDE8PDkpCi0jZGVmaW5lIFJBREVPTl9JMkNfUkVDRUlWRSAoMTw8MTApCi0jZGVmaW5lIFJBREVPTl9JMkNfQUJPUlQgKDE8PDExKQotI2RlZmluZSBSQURFT05fSTJDX0dPICgxPDwxMikKKyNkZWZpbmUgUkFERU9OX0kyQ19ET05FICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgUkFERU9OX0kyQ19OQUNLICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgUkFERU9OX0kyQ19IQUxUICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgUkFERU9OX0kyQ19TT0ZUX1JTVCAgICAgICAgICAgICAgICAgKDEgPDwgNSkKKyNkZWZpbmUgUkFERU9OX0kyQ19EUklWRV9FTiAgICAgICAgICAgICAgICAgKDEgPDwgNikKKyNkZWZpbmUgUkFERU9OX0kyQ19EUklWRV9TRUwgICAgICAgICAgICAgICAgKDEgPDwgNykKKyNkZWZpbmUgUkFERU9OX0kyQ19TVEFSVCAgICAgICAgICAgICAgICAgICAgKDEgPDwgOCkKKyNkZWZpbmUgUkFERU9OX0kyQ19TVE9QICAgICAgICAgICAgICAgICAgICAgKDEgPDwgOSkKKyNkZWZpbmUgUkFERU9OX0kyQ19SRUNFSVZFICAgICAgICAgICAgICAgICAgKDEgPDwgMTApCisjZGVmaW5lIFJBREVPTl9JMkNfQUJPUlQgICAgICAgICAgICAgICAgICAgICgxIDw8IDExKQorI2RlZmluZSBSQURFT05fSTJDX0dPICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMikKKyNkZWZpbmUgUkFERU9OX0kyQ19QUkVTQ0FMRV9TSElGVCAgICAgICAgICAgMTYKICNkZWZpbmUgUkFERU9OX0kyQ19DTlRMXzEgICAgICAgICAgICAgICAgICAgMHgwMDk0Ci0jZGVmaW5lIFJBREVPTl9JMkNfU0VMICAgICAgICAgKDE8PDE2KQotI2RlZmluZSBSQURFT05fSTJDX0VOICAgICAgICAgICgxPDwxNykKKyNkZWZpbmUgUkFERU9OX0kyQ19EQVRBX0NPVU5UX1NISUZUICAgICAgICAgMAorI2RlZmluZSBSQURFT05fSTJDX0FERFJfQ09VTlRfU0hJRlQgICAgICAgICA0CisjZGVmaW5lIFJBREVPTl9JMkNfSU5UUkFfQllURV9ERUxBWV9TSElGVCAgIDgKKyNkZWZpbmUgUkFERU9OX0kyQ19TRUwgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTYpCisjZGVmaW5lIFJBREVPTl9JMkNfRU4gICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE3KQorI2RlZmluZSBSQURFT05fSTJDX1RJTUVfTElNSVRfU0hJRlQgICAgICAgICAyNAogI2RlZmluZSBSQURFT05fSTJDX0RBVEEJCQkgICAgMHgwMDk4CiAKICNkZWZpbmUgUkFERU9OX0RWSV9JMkNfQ05UTF8wCQkgICAgMHgwMmUwCkBAIC0xMDcyLDcgKzEwODYsNyBAQAogIyAgICAgICBkZWZpbmUgUjIwMF9TRUxfRERDMSAgICAgICAgICAgICAgICAwIC8qIDB4NjAgLSBWR0FfRERDICovCiAjICAgICAgIGRlZmluZSBSMjAwX1NFTF9EREMyICAgICAgICAgICAgICAgIDEgLyogMHg2NCAtIERWSV9EREMgKi8KICMgICAgICAgZGVmaW5lIFIyMDBfU0VMX0REQzMgICAgICAgICAgICAgICAgMiAvKiAweDY4IC0gTU9OSURfRERDICovCi0jZGVmaW5lIFJBREVPTl9EVklfSTJDX0NOVExfMSAgICAgICAgICAgICAgIDB4MDJlNCAvKiA/ICovCisjZGVmaW5lIFJBREVPTl9EVklfSTJDX0NOVExfMSAgICAgICAgICAgICAgIDB4MDJlNAogI2RlZmluZSBSQURFT05fRFZJX0kyQ19EQVRBCQkgICAgMHgwMmU4CiAKICNkZWZpbmUgUkFERU9OX0lOVEVSUlVQVF9MSU5FICAgICAgICAgICAgICAgMHgwZjNjIC8qIFBDSSAqLwpAQCAtMTE0MywxNSArMTE1NywxNiBAQAogIyAgICAgICBkZWZpbmUgUkFERU9OX0lPX01DTEtfTUFYX0RZTl9TVE9QX0xBVCAoMSA8PCAxMykKICMgICAgICAgZGVmaW5lIFJBREVPTl9NQ19NQ0xLX0RZTl9FTkFCTEUgICAgKDEgPDwgMTQpCiAjICAgICAgIGRlZmluZSBSQURFT05fSU9fTUNMS19EWU5fRU5BQkxFICAgICgxIDw8IDE1KQotI2RlZmluZSBSQURFT05fTENEX0dQSU9fTUFTSyAgICAgICAgICAgICAgICAweDAxYTAKLSNkZWZpbmUgUkFERU9OX0dQSU9QQURfRU4gICAgICAgICAgICAgICAgICAgMHgwMWEwCi0jZGVmaW5lIFJBREVPTl9MQ0RfR1BJT19ZX1JFRyAgICAgICAgICAgICAgIDB4MDFhNAotI2RlZmluZSBSQURFT05fTURHUElPX0FfUkVHICAgICAgICAgICAgICAgICAweDAxYWMKLSNkZWZpbmUgUkFERU9OX01ER1BJT19FTl9SRUcgICAgICAgICAgICAgICAgMHgwMWIwCi0jZGVmaW5lIFJBREVPTl9NREdQSU9fTUFTSyAgICAgICAgICAgICAgICAgIDB4MDE5OAorCiAjZGVmaW5lIFJBREVPTl9HUElPUEFEX01BU0sgICAgICAgICAgICAgICAgIDB4MDE5OAogI2RlZmluZSBSQURFT05fR1BJT1BBRF9BCQkgICAgMHgwMTljCi0jZGVmaW5lIFJBREVPTl9NREdQSU9fWV9SRUcgICAgICAgICAgICAgICAgIDB4MDFiNAorI2RlZmluZSBSQURFT05fR1BJT1BBRF9FTiAgICAgICAgICAgICAgICAgICAweDAxYTAKKyNkZWZpbmUgUkFERU9OX0dQSU9QQURfWSAgICAgICAgICAgICAgICAgICAgMHgwMWE0CisjZGVmaW5lIFJBREVPTl9NREdQSU9fTUFTSyAgICAgICAgICAgICAgICAgIDB4MDFhOAorI2RlZmluZSBSQURFT05fTURHUElPX0EgICAgICAgICAgICAgICAgICAgICAweDAxYWMKKyNkZWZpbmUgUkFERU9OX01ER1BJT19FTiAgICAgICAgICAgICAgICAgICAgMHgwMWIwCisjZGVmaW5lIFJBREVPTl9NREdQSU9fWSAgICAgICAgICAgICAgICAgICAgIDB4MDFiNAorCiAjZGVmaW5lIFJBREVPTl9NRU1fQUREUl9DT05GSUcgICAgICAgICAgICAgIDB4MDE0OAogI2RlZmluZSBSQURFT05fTUVNX0JBU0UgICAgICAgICAgICAgICAgICAgICAweDBmMTAgLyogUENJICovCiAjZGVmaW5lIFJBREVPTl9NRU1fQ05UTCAgICAgICAgICAgICAgICAgICAgIDB4MDE0MApAQCAtMTM2MCw2ICsxMzc1LDkgQEAKICNkZWZpbmUgUkFERU9OX09WUl9DTFIgICAgICAgICAgICAgICAgICAgICAgMHgwMjMwCiAjZGVmaW5lIFJBREVPTl9PVlJfV0lEX0xFRlRfUklHSFQgICAgICAgICAgIDB4MDIzNAogI2RlZmluZSBSQURFT05fT1ZSX1dJRF9UT1BfQk9UVE9NICAgICAgICAgICAweDAyMzgKKyNkZWZpbmUgUkFERU9OX09WUjJfQ0xSICAgICAgICAgICAgICAgICAgICAgMHgwMzMwCisjZGVmaW5lIFJBREVPTl9PVlIyX1dJRF9MRUZUX1JJR0hUICAgICAgICAgIDB4MDMzNAorI2RlZmluZSBSQURFT05fT1ZSMl9XSURfVE9QX0JPVFRPTSAgICAgICAgICAweDAzMzgKIAogLyogZmlyc3QgY2FwdHVyZSB1bml0ICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3JpbmcuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3JpbmcuYwppbmRleCA3NDdiNGJmLi40ZDEyYjJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9yaW5nLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmluZy5jCkBAIC0xNjUsMTkgKzE2NSwyNCBAQAogCQlyZXR1cm4gMDsKIAkvKiBBbGxvY2F0ZSAxTSBvYmplY3QgYnVmZmVyICovCiAJSU5JVF9MSVNUX0hFQUQoJnJkZXYtPmliX3Bvb2wuc2NoZWR1bGVkX2licyk7Ci0JciA9IHJhZGVvbl9vYmplY3RfY3JlYXRlKHJkZXYsIE5VTEwsICBSQURFT05fSUJfUE9PTF9TSVpFKjY0KjEwMjQsCi0JCQkJIHRydWUsIFJBREVPTl9HRU1fRE9NQUlOX0dUVCwKLQkJCQkgZmFsc2UsICZyZGV2LT5pYl9wb29sLnJvYmopOworCXIgPSByYWRlb25fYm9fY3JlYXRlKHJkZXYsIE5VTEwsICBSQURFT05fSUJfUE9PTF9TSVpFKjY0KjEwMjQsCisJCQkJdHJ1ZSwgUkFERU9OX0dFTV9ET01BSU5fR1RULAorCQkJCSZyZGV2LT5pYl9wb29sLnJvYmopOwogCWlmIChyKSB7CiAJCURSTV9FUlJPUigicmFkZW9uOiBmYWlsZWQgdG8gaWIgcG9vbCAoJWQpLlxuIiwgcik7CiAJCXJldHVybiByOwogCX0KLQlyID0gcmFkZW9uX29iamVjdF9waW4ocmRldi0+aWJfcG9vbC5yb2JqLCBSQURFT05fR0VNX0RPTUFJTl9HVFQsICZncHVfYWRkcik7CisJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPmliX3Bvb2wucm9iaiwgZmFsc2UpOworCWlmICh1bmxpa2VseShyICE9IDApKQorCQlyZXR1cm4gcjsKKwlyID0gcmFkZW9uX2JvX3BpbihyZGV2LT5pYl9wb29sLnJvYmosIFJBREVPTl9HRU1fRE9NQUlOX0dUVCwgJmdwdV9hZGRyKTsKIAlpZiAocikgeworCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPmliX3Bvb2wucm9iaik7CiAJCURSTV9FUlJPUigicmFkZW9uOiBmYWlsZWQgdG8gcGluIGliIHBvb2wgKCVkKS5cbiIsIHIpOwogCQlyZXR1cm4gcjsKIAl9Ci0JciA9IHJhZGVvbl9vYmplY3Rfa21hcChyZGV2LT5pYl9wb29sLnJvYmosICZwdHIpOworCXIgPSByYWRlb25fYm9fa21hcChyZGV2LT5pYl9wb29sLnJvYmosICZwdHIpOworCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+aWJfcG9vbC5yb2JqKTsKIAlpZiAocikgewogCQlEUk1fRVJST1IoInJhZGVvbjogZmFpbGVkIHRvIG1hcCBpYiBwb2xsICglZCkuXG4iLCByKTsKIAkJcmV0dXJuIHI7CkBAIC0yMDMsMTQgKzIwOCwyMSBAQAogCiB2b2lkIHJhZGVvbl9pYl9wb29sX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CisJaW50IHI7CisKIAlpZiAoIXJkZXYtPmliX3Bvb2wucmVhZHkpIHsKIAkJcmV0dXJuOwogCX0KIAltdXRleF9sb2NrKCZyZGV2LT5pYl9wb29sLm11dGV4KTsKIAliaXRtYXBfemVybyhyZGV2LT5pYl9wb29sLmFsbG9jX2JtLCBSQURFT05fSUJfUE9PTF9TSVpFKTsKIAlpZiAocmRldi0+aWJfcG9vbC5yb2JqKSB7Ci0JCXJhZGVvbl9vYmplY3Rfa3VubWFwKHJkZXYtPmliX3Bvb2wucm9iaik7Ci0JCXJhZGVvbl9vYmplY3RfdW5yZWYoJnJkZXYtPmliX3Bvb2wucm9iaik7CisJCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyZGV2LT5pYl9wb29sLnJvYmosIGZhbHNlKTsKKwkJaWYgKGxpa2VseShyID09IDApKSB7CisJCQlyYWRlb25fYm9fa3VubWFwKHJkZXYtPmliX3Bvb2wucm9iaik7CisJCQlyYWRlb25fYm9fdW5waW4ocmRldi0+aWJfcG9vbC5yb2JqKTsKKwkJCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+aWJfcG9vbC5yb2JqKTsKKwkJfQorCQlyYWRlb25fYm9fdW5yZWYoJnJkZXYtPmliX3Bvb2wucm9iaik7CiAJCXJkZXYtPmliX3Bvb2wucm9iaiA9IE5VTEw7CiAJfQogCW11dGV4X3VubG9jaygmcmRldi0+aWJfcG9vbC5tdXRleCk7CkBAIC0yODgsMjkgKzMwMCwyOCBAQAogCXJkZXYtPmNwLnJpbmdfc2l6ZSA9IHJpbmdfc2l6ZTsKIAkvKiBBbGxvY2F0ZSByaW5nIGJ1ZmZlciAqLwogCWlmIChyZGV2LT5jcC5yaW5nX29iaiA9PSBOVUxMKSB7Ci0JCXIgPSByYWRlb25fb2JqZWN0X2NyZWF0ZShyZGV2LCBOVUxMLCByZGV2LT5jcC5yaW5nX3NpemUsCi0JCQkJCSB0cnVlLAotCQkJCQkgUkFERU9OX0dFTV9ET01BSU5fR1RULAotCQkJCQkgZmFsc2UsCi0JCQkJCSAmcmRldi0+Y3AucmluZ19vYmopOworCQlyID0gcmFkZW9uX2JvX2NyZWF0ZShyZGV2LCBOVUxMLCByZGV2LT5jcC5yaW5nX3NpemUsIHRydWUsCisJCQkJCVJBREVPTl9HRU1fRE9NQUlOX0dUVCwKKwkJCQkJJnJkZXYtPmNwLnJpbmdfb2JqKTsKIAkJaWYgKHIpIHsKLQkJCURSTV9FUlJPUigicmFkZW9uOiBmYWlsZWQgdG8gY3JlYXRlIHJpbmcgYnVmZmVyICglZCkuXG4iLCByKTsKLQkJCW11dGV4X3VubG9jaygmcmRldi0+Y3AubXV0ZXgpOworCQkJZGV2X2VycihyZGV2LT5kZXYsICIoJWQpIHJpbmcgY3JlYXRlIGZhaWxlZFxuIiwgcik7CiAJCQlyZXR1cm4gcjsKIAkJfQotCQlyID0gcmFkZW9uX29iamVjdF9waW4ocmRldi0+Y3AucmluZ19vYmosCi0JCQkJICAgICAgUkFERU9OX0dFTV9ET01BSU5fR1RULAotCQkJCSAgICAgICZyZGV2LT5jcC5ncHVfYWRkcik7CisJCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyZGV2LT5jcC5yaW5nX29iaiwgZmFsc2UpOworCQlpZiAodW5saWtlbHkociAhPSAwKSkKKwkJCXJldHVybiByOworCQlyID0gcmFkZW9uX2JvX3BpbihyZGV2LT5jcC5yaW5nX29iaiwgUkFERU9OX0dFTV9ET01BSU5fR1RULAorCQkJCQkmcmRldi0+Y3AuZ3B1X2FkZHIpOwogCQlpZiAocikgewotCQkJRFJNX0VSUk9SKCJyYWRlb246IGZhaWxlZCB0byBwaW4gcmluZyBidWZmZXIgKCVkKS5cbiIsIHIpOwotCQkJbXV0ZXhfdW5sb2NrKCZyZGV2LT5jcC5tdXRleCk7CisJCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPmNwLnJpbmdfb2JqKTsKKwkJCWRldl9lcnIocmRldi0+ZGV2LCAiKCVkKSByaW5nIHBpbiBmYWlsZWRcbiIsIHIpOwogCQkJcmV0dXJuIHI7CiAJCX0KLQkJciA9IHJhZGVvbl9vYmplY3Rfa21hcChyZGV2LT5jcC5yaW5nX29iaiwKKwkJciA9IHJhZGVvbl9ib19rbWFwKHJkZXYtPmNwLnJpbmdfb2JqLAogCQkJCSAgICAgICAodm9pZCAqKikmcmRldi0+Y3AucmluZyk7CisJCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+Y3AucmluZ19vYmopOwogCQlpZiAocikgewotCQkJRFJNX0VSUk9SKCJyYWRlb246IGZhaWxlZCB0byBtYXAgcmluZyBidWZmZXIgKCVkKS5cbiIsIHIpOwotCQkJbXV0ZXhfdW5sb2NrKCZyZGV2LT5jcC5tdXRleCk7CisJCQlkZXZfZXJyKHJkZXYtPmRldiwgIiglZCkgcmluZyBtYXAgZmFpbGVkXG4iLCByKTsKIAkJCXJldHVybiByOwogCQl9CiAJfQpAQCAtMzIxLDExICszMzIsMTcgQEAKIAogdm9pZCByYWRlb25fcmluZ19maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworCWludCByOworCiAJbXV0ZXhfbG9jaygmcmRldi0+Y3AubXV0ZXgpOwogCWlmIChyZGV2LT5jcC5yaW5nX29iaikgewotCQlyYWRlb25fb2JqZWN0X2t1bm1hcChyZGV2LT5jcC5yaW5nX29iaik7Ci0JCXJhZGVvbl9vYmplY3RfdW5waW4ocmRldi0+Y3AucmluZ19vYmopOwotCQlyYWRlb25fb2JqZWN0X3VucmVmKCZyZGV2LT5jcC5yaW5nX29iaik7CisJCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyZGV2LT5jcC5yaW5nX29iaiwgZmFsc2UpOworCQlpZiAobGlrZWx5KHIgPT0gMCkpIHsKKwkJCXJhZGVvbl9ib19rdW5tYXAocmRldi0+Y3AucmluZ19vYmopOworCQkJcmFkZW9uX2JvX3VucGluKHJkZXYtPmNwLnJpbmdfb2JqKTsKKwkJCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+Y3AucmluZ19vYmopOworCQl9CisJCXJhZGVvbl9ib191bnJlZigmcmRldi0+Y3AucmluZ19vYmopOwogCQlyZGV2LT5jcC5yaW5nID0gTlVMTDsKIAkJcmRldi0+Y3AucmluZ19vYmogPSBOVUxMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3Rlc3QuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3Rlc3QuYwppbmRleCBmOGE0NjVkLi4zOTFjOTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl90ZXN0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdGVzdC5jCkBAIC0zMCw4ICszMCw4IEBACiAvKiBUZXN0IEJPIEdUVC0+VlJBTSBhbmQgVlJBTS0+R1RUIEdQVSBjb3BpZXMgYWNyb3NzIHRoZSB3aG9sZSBHVFQgYXBlcnR1cmUgKi8KIHZvaWQgcmFkZW9uX3Rlc3RfbW92ZXMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0Jc3RydWN0IHJhZGVvbl9vYmplY3QgKnZyYW1fb2JqID0gTlVMTDsKLQlzdHJ1Y3QgcmFkZW9uX29iamVjdCAqKmd0dF9vYmogPSBOVUxMOworCXN0cnVjdCByYWRlb25fYm8gKnZyYW1fb2JqID0gTlVMTDsKKwlzdHJ1Y3QgcmFkZW9uX2JvICoqZ3R0X29iaiA9IE5VTEw7CiAJc3RydWN0IHJhZGVvbl9mZW5jZSAqZmVuY2UgPSBOVUxMOwogCXVpbnQ2NF90IGd0dF9hZGRyLCB2cmFtX2FkZHI7CiAJdW5zaWduZWQgaSwgbiwgc2l6ZTsKQEAgLTUyLDM4ICs1Miw0MiBAQAogCQlnb3RvIG91dF9jbGVhbnVwOwogCX0KIAotCXIgPSByYWRlb25fb2JqZWN0X2NyZWF0ZShyZGV2LCBOVUxMLCBzaXplLCB0cnVlLCBSQURFT05fR0VNX0RPTUFJTl9WUkFNLAotCQkJCSBmYWxzZSwgJnZyYW1fb2JqKTsKKwlyID0gcmFkZW9uX2JvX2NyZWF0ZShyZGV2LCBOVUxMLCBzaXplLCB0cnVlLCBSQURFT05fR0VNX0RPTUFJTl9WUkFNLAorCQkJCSZ2cmFtX29iaik7CiAJaWYgKHIpIHsKIAkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIFZSQU0gb2JqZWN0XG4iKTsKIAkJZ290byBvdXRfY2xlYW51cDsKIAl9Ci0KLQlyID0gcmFkZW9uX29iamVjdF9waW4odnJhbV9vYmosIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sICZ2cmFtX2FkZHIpOworCXIgPSByYWRlb25fYm9fcmVzZXJ2ZSh2cmFtX29iaiwgZmFsc2UpOworCWlmICh1bmxpa2VseShyICE9IDApKQorCQlnb3RvIG91dF9jbGVhbnVwOworCXIgPSByYWRlb25fYm9fcGluKHZyYW1fb2JqLCBSQURFT05fR0VNX0RPTUFJTl9WUkFNLCAmdnJhbV9hZGRyKTsKIAlpZiAocikgewogCQlEUk1fRVJST1IoIkZhaWxlZCB0byBwaW4gVlJBTSBvYmplY3RcbiIpOwogCQlnb3RvIG91dF9jbGVhbnVwOwogCX0KLQogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKIAkJdm9pZCAqZ3R0X21hcCwgKnZyYW1fbWFwOwogCQl2b2lkICoqZ3R0X3N0YXJ0LCAqKmd0dF9lbmQ7CiAJCXZvaWQgKip2cmFtX3N0YXJ0LCAqKnZyYW1fZW5kOwogCi0JCXIgPSByYWRlb25fb2JqZWN0X2NyZWF0ZShyZGV2LCBOVUxMLCBzaXplLCB0cnVlLAotCQkJCQkgUkFERU9OX0dFTV9ET01BSU5fR1RULCBmYWxzZSwgZ3R0X29iaiArIGkpOworCQlyID0gcmFkZW9uX2JvX2NyZWF0ZShyZGV2LCBOVUxMLCBzaXplLCB0cnVlLAorCQkJCQkgUkFERU9OX0dFTV9ET01BSU5fR1RULCBndHRfb2JqICsgaSk7CiAJCWlmIChyKSB7CiAJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgR1RUIG9iamVjdCAlZFxuIiwgaSk7CiAJCQlnb3RvIG91dF9jbGVhbnVwOwogCQl9CiAKLQkJciA9IHJhZGVvbl9vYmplY3RfcGluKGd0dF9vYmpbaV0sIFJBREVPTl9HRU1fRE9NQUlOX0dUVCwgJmd0dF9hZGRyKTsKKwkJciA9IHJhZGVvbl9ib19yZXNlcnZlKGd0dF9vYmpbaV0sIGZhbHNlKTsKKwkJaWYgKHVubGlrZWx5KHIgIT0gMCkpCisJCQlnb3RvIG91dF9jbGVhbnVwOworCQlyID0gcmFkZW9uX2JvX3BpbihndHRfb2JqW2ldLCBSQURFT05fR0VNX0RPTUFJTl9HVFQsICZndHRfYWRkcik7CiAJCWlmIChyKSB7CiAJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBwaW4gR1RUIG9iamVjdCAlZFxuIiwgaSk7CiAJCQlnb3RvIG91dF9jbGVhbnVwOwogCQl9CiAKLQkJciA9IHJhZGVvbl9vYmplY3Rfa21hcChndHRfb2JqW2ldLCAmZ3R0X21hcCk7CisJCXIgPSByYWRlb25fYm9fa21hcChndHRfb2JqW2ldLCAmZ3R0X21hcCk7CiAJCWlmIChyKSB7CiAJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBtYXAgR1RUIG9iamVjdCAlZFxuIiwgaSk7CiAJCQlnb3RvIG91dF9jbGVhbnVwOwpAQCAtOTQsNyArOTgsNyBAQAogCQkgICAgIGd0dF9zdGFydCsrKQogCQkJKmd0dF9zdGFydCA9IGd0dF9zdGFydDsKIAotCQlyYWRlb25fb2JqZWN0X2t1bm1hcChndHRfb2JqW2ldKTsKKwkJcmFkZW9uX2JvX2t1bm1hcChndHRfb2JqW2ldKTsKIAogCQlyID0gcmFkZW9uX2ZlbmNlX2NyZWF0ZShyZGV2LCAmZmVuY2UpOwogCQlpZiAocikgewpAQCAtMTE2LDcgKzEyMCw3IEBACiAKIAkJcmFkZW9uX2ZlbmNlX3VucmVmKCZmZW5jZSk7CiAKLQkJciA9IHJhZGVvbl9vYmplY3Rfa21hcCh2cmFtX29iaiwgJnZyYW1fbWFwKTsKKwkJciA9IHJhZGVvbl9ib19rbWFwKHZyYW1fb2JqLCAmdnJhbV9tYXApOwogCQlpZiAocikgewogCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gbWFwIFZSQU0gb2JqZWN0IGFmdGVyIGNvcHkgJWRcbiIsIGkpOwogCQkJZ290byBvdXRfY2xlYW51cDsKQEAgLTEzMSwxMyArMTM1LDEzIEBACiAJCQkJCSAgImV4cGVjdGVkIDB4JXAgKEdUVCBtYXAgMHglcC0weCVwKVxuIiwKIAkJCQkJICBpLCAqdnJhbV9zdGFydCwgZ3R0X3N0YXJ0LCBndHRfbWFwLAogCQkJCQkgIGd0dF9lbmQpOwotCQkJCXJhZGVvbl9vYmplY3Rfa3VubWFwKHZyYW1fb2JqKTsKKwkJCQlyYWRlb25fYm9fa3VubWFwKHZyYW1fb2JqKTsKIAkJCQlnb3RvIG91dF9jbGVhbnVwOwogCQkJfQogCQkJKnZyYW1fc3RhcnQgPSB2cmFtX3N0YXJ0OwogCQl9CiAKLQkJcmFkZW9uX29iamVjdF9rdW5tYXAodnJhbV9vYmopOworCQlyYWRlb25fYm9fa3VubWFwKHZyYW1fb2JqKTsKIAogCQlyID0gcmFkZW9uX2ZlbmNlX2NyZWF0ZShyZGV2LCAmZmVuY2UpOwogCQlpZiAocikgewpAQCAtMTU5LDcgKzE2Myw3IEBACiAKIAkJcmFkZW9uX2ZlbmNlX3VucmVmKCZmZW5jZSk7CiAKLQkJciA9IHJhZGVvbl9vYmplY3Rfa21hcChndHRfb2JqW2ldLCAmZ3R0X21hcCk7CisJCXIgPSByYWRlb25fYm9fa21hcChndHRfb2JqW2ldLCAmZ3R0X21hcCk7CiAJCWlmIChyKSB7CiAJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBtYXAgR1RUIG9iamVjdCBhZnRlciBjb3B5ICVkXG4iLCBpKTsKIAkJCWdvdG8gb3V0X2NsZWFudXA7CkBAIC0xNzQsMTIgKzE3OCwxMiBAQAogCQkJCQkgICJleHBlY3RlZCAweCVwIChWUkFNIG1hcCAweCVwLTB4JXApXG4iLAogCQkJCQkgIGksICpndHRfc3RhcnQsIHZyYW1fc3RhcnQsIHZyYW1fbWFwLAogCQkJCQkgIHZyYW1fZW5kKTsKLQkJCQlyYWRlb25fb2JqZWN0X2t1bm1hcChndHRfb2JqW2ldKTsKKwkJCQlyYWRlb25fYm9fa3VubWFwKGd0dF9vYmpbaV0pOwogCQkJCWdvdG8gb3V0X2NsZWFudXA7CiAJCQl9CiAJCX0KIAotCQlyYWRlb25fb2JqZWN0X2t1bm1hcChndHRfb2JqW2ldKTsKKwkJcmFkZW9uX2JvX2t1bm1hcChndHRfb2JqW2ldKTsKIAogCQlEUk1fSU5GTygiVGVzdGVkIEdUVC0+VlJBTSBhbmQgVlJBTS0+R1RUIGNvcHkgZm9yIEdUVCBvZmZzZXQgMHglbGx4XG4iLAogCQkJIGd0dF9hZGRyIC0gcmRldi0+bWMuZ3R0X2xvY2F0aW9uKTsKQEAgLTE4NywxNCArMTkxLDIwIEBACiAKIG91dF9jbGVhbnVwOgogCWlmICh2cmFtX29iaikgewotCQlyYWRlb25fb2JqZWN0X3VucGluKHZyYW1fb2JqKTsKLQkJcmFkZW9uX29iamVjdF91bnJlZigmdnJhbV9vYmopOworCQlpZiAocmFkZW9uX2JvX2lzX3Jlc2VydmVkKHZyYW1fb2JqKSkgeworCQkJcmFkZW9uX2JvX3VucGluKHZyYW1fb2JqKTsKKwkJCXJhZGVvbl9ib191bnJlc2VydmUodnJhbV9vYmopOworCQl9CisJCXJhZGVvbl9ib191bnJlZigmdnJhbV9vYmopOwogCX0KIAlpZiAoZ3R0X29iaikgewogCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAJCQlpZiAoZ3R0X29ialtpXSkgewotCQkJCXJhZGVvbl9vYmplY3RfdW5waW4oZ3R0X29ialtpXSk7Ci0JCQkJcmFkZW9uX29iamVjdF91bnJlZigmZ3R0X29ialtpXSk7CisJCQkJaWYgKHJhZGVvbl9ib19pc19yZXNlcnZlZChndHRfb2JqW2ldKSkgeworCQkJCQlyYWRlb25fYm9fdW5waW4oZ3R0X29ialtpXSk7CisJCQkJCXJhZGVvbl9ib191bnJlc2VydmUoZ3R0X29ialtpXSk7CisJCQkJfQorCQkJCXJhZGVvbl9ib191bnJlZigmZ3R0X29ialtpXSk7CiAJCQl9CiAJCX0KIAkJa2ZyZWUoZ3R0X29iaik7CkBAIC0yMDYsNCArMjE2LDMgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXJyb3Igd2hpbGUgdGVzdGluZyBCTyBtb3ZlLlxuIik7CiAJfQogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl90dG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3R0bS5jCmluZGV4IGVkYTRhZGUuLjVhMTlkNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3R0bS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3R0bS5jCkBAIC0xNTAsNyArMTUwLDcgQEAKIAkJbWFuLT5kZWZhdWx0X2NhY2hpbmcgPSBUVE1fUExfRkxBR19DQUNIRUQ7CiAJCWJyZWFrOwogCWNhc2UgVFRNX1BMX1RUOgotCQltYW4tPmdwdV9vZmZzZXQgPSAwOworCQltYW4tPmdwdV9vZmZzZXQgPSByZGV2LT5tYy5ndHRfbG9jYXRpb247CiAJCW1hbi0+YXZhaWxhYmxlX2NhY2hpbmcgPSBUVE1fUExfTUFTS19DQUNISU5HOwogCQltYW4tPmRlZmF1bHRfY2FjaGluZyA9IFRUTV9QTF9GTEFHX0NBQ0hFRDsKIAkJbWFuLT5mbGFncyA9IFRUTV9NRU1UWVBFX0ZMQUdfTUFQUEFCTEUgfCBUVE1fTUVNVFlQRV9GTEFHX0NNQTsKQEAgLTE4MCw3ICsxODAsNyBAQAogCQlicmVhazsKIAljYXNlIFRUTV9QTF9WUkFNOgogCQkvKiAiT24tY2FyZCIgdmlkZW8gcmFtICovCi0JCW1hbi0+Z3B1X29mZnNldCA9IDA7CisJCW1hbi0+Z3B1X29mZnNldCA9IHJkZXYtPm1jLnZyYW1fbG9jYXRpb247CiAJCW1hbi0+ZmxhZ3MgPSBUVE1fTUVNVFlQRV9GTEFHX0ZJWEVEIHwKIAkJCSAgICAgVFRNX01FTVRZUEVfRkxBR19ORUVEU19JT1JFTUFQIHwKIAkJCSAgICAgVFRNX01FTVRZUEVfRkxBR19NQVBQQUJMRTsKQEAgLTE5NywxNiArMTk3LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1aW50MzJfdCByYWRlb25fZXZpY3RfZmxhZ3Moc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKK3N0YXRpYyB2b2lkIHJhZGVvbl9ldmljdF9mbGFncyhzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAorCQkJCXN0cnVjdCB0dG1fcGxhY2VtZW50ICpwbGFjZW1lbnQpCiB7Ci0JdWludDMyX3QgY3VyX3BsYWNlbWVudCA9IGJvLT5tZW0ucGxhY2VtZW50ICYgflRUTV9QTF9NQVNLX01FTVRZUEU7Ci0KKwlzdHJ1Y3QgcmFkZW9uX2JvICpyYm8gPSBjb250YWluZXJfb2YoYm8sIHN0cnVjdCByYWRlb25fYm8sIHRibyk7CiAJc3dpdGNoIChiby0+bWVtLm1lbV90eXBlKSB7CisJY2FzZSBUVE1fUExfVlJBTToKKwkJcmFkZW9uX3R0bV9wbGFjZW1lbnRfZnJvbV9kb21haW4ocmJvLCBSQURFT05fR0VNX0RPTUFJTl9HVFQpOworCQlicmVhazsKKwljYXNlIFRUTV9QTF9UVDoKIAlkZWZhdWx0OgotCQlyZXR1cm4gKGN1cl9wbGFjZW1lbnQgJiB+VFRNX1BMX01BU0tfQ0FDSElORykgfAotCQkJVFRNX1BMX0ZMQUdfU1lTVEVNIHwKLQkJCVRUTV9QTF9GTEFHX0NBQ0hFRDsKKwkJcmFkZW9uX3R0bV9wbGFjZW1lbnRfZnJvbV9kb21haW4ocmJvLCBSQURFT05fR0VNX0RPTUFJTl9DUFUpOwogCX0KKwkqcGxhY2VtZW50ID0gcmJvLT5wbGFjZW1lbnQ7CiB9CiAKIHN0YXRpYyBpbnQgcmFkZW9uX3ZlcmlmeV9hY2Nlc3Moc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywgc3RydWN0IGZpbGUgKmZpbHApCkBAIC0yODMsMTQgKzI4NiwyMSBAQAogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2OwogCXN0cnVjdCB0dG1fbWVtX3JlZyAqb2xkX21lbSA9ICZiby0+bWVtOwogCXN0cnVjdCB0dG1fbWVtX3JlZyB0bXBfbWVtOwotCXVpbnQzMl90IHByb3Bvc2VkX3BsYWNlbWVudDsKKwl1MzIgcGxhY2VtZW50czsKKwlzdHJ1Y3QgdHRtX3BsYWNlbWVudCBwbGFjZW1lbnQ7CiAJaW50IHI7CiAKIAlyZGV2ID0gcmFkZW9uX2dldF9yZGV2KGJvLT5iZGV2KTsKIAl0bXBfbWVtID0gKm5ld19tZW07CiAJdG1wX21lbS5tbV9ub2RlID0gTlVMTDsKLQlwcm9wb3NlZF9wbGFjZW1lbnQgPSBUVE1fUExfRkxBR19UVCB8IFRUTV9QTF9NQVNLX0NBQ0hJTkc7Ci0JciA9IHR0bV9ib19tZW1fc3BhY2UoYm8sIHByb3Bvc2VkX3BsYWNlbWVudCwgJnRtcF9tZW0sCisJcGxhY2VtZW50LmZwZm4gPSAwOworCXBsYWNlbWVudC5scGZuID0gMDsKKwlwbGFjZW1lbnQubnVtX3BsYWNlbWVudCA9IDE7CisJcGxhY2VtZW50LnBsYWNlbWVudCA9ICZwbGFjZW1lbnRzOworCXBsYWNlbWVudC5udW1fYnVzeV9wbGFjZW1lbnQgPSAxOworCXBsYWNlbWVudC5idXN5X3BsYWNlbWVudCA9ICZwbGFjZW1lbnRzOworCXBsYWNlbWVudHMgPSBUVE1fUExfTUFTS19DQUNISU5HIHwgVFRNX1BMX0ZMQUdfVFQ7CisJciA9IHR0bV9ib19tZW1fc3BhY2UoYm8sICZwbGFjZW1lbnQsICZ0bXBfbWVtLAogCQkJICAgICBpbnRlcnJ1cHRpYmxlLCBub193YWl0KTsKIAlpZiAodW5saWtlbHkocikpIHsKIAkJcmV0dXJuIHI7CkBAIC0zMjksMTUgKzMzOSwyMSBAQAogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2OwogCXN0cnVjdCB0dG1fbWVtX3JlZyAqb2xkX21lbSA9ICZiby0+bWVtOwogCXN0cnVjdCB0dG1fbWVtX3JlZyB0bXBfbWVtOwotCXVpbnQzMl90IHByb3Bvc2VkX2ZsYWdzOworCXN0cnVjdCB0dG1fcGxhY2VtZW50IHBsYWNlbWVudDsKKwl1MzIgcGxhY2VtZW50czsKIAlpbnQgcjsKIAogCXJkZXYgPSByYWRlb25fZ2V0X3JkZXYoYm8tPmJkZXYpOwogCXRtcF9tZW0gPSAqbmV3X21lbTsKIAl0bXBfbWVtLm1tX25vZGUgPSBOVUxMOwotCXByb3Bvc2VkX2ZsYWdzID0gVFRNX1BMX0ZMQUdfVFQgfCBUVE1fUExfTUFTS19DQUNISU5HOwotCXIgPSB0dG1fYm9fbWVtX3NwYWNlKGJvLCBwcm9wb3NlZF9mbGFncywgJnRtcF9tZW0sCi0JCQkgICAgIGludGVycnVwdGlibGUsIG5vX3dhaXQpOworCXBsYWNlbWVudC5mcGZuID0gMDsKKwlwbGFjZW1lbnQubHBmbiA9IDA7CisJcGxhY2VtZW50Lm51bV9wbGFjZW1lbnQgPSAxOworCXBsYWNlbWVudC5wbGFjZW1lbnQgPSAmcGxhY2VtZW50czsKKwlwbGFjZW1lbnQubnVtX2J1c3lfcGxhY2VtZW50ID0gMTsKKwlwbGFjZW1lbnQuYnVzeV9wbGFjZW1lbnQgPSAmcGxhY2VtZW50czsKKwlwbGFjZW1lbnRzID0gVFRNX1BMX01BU0tfQ0FDSElORyB8IFRUTV9QTF9GTEFHX1RUOworCXIgPSB0dG1fYm9fbWVtX3NwYWNlKGJvLCAmcGxhY2VtZW50LCAmdG1wX21lbSwgaW50ZXJydXB0aWJsZSwgbm9fd2FpdCk7CiAJaWYgKHVubGlrZWx5KHIpKSB7CiAJCXJldHVybiByOwogCX0KQEAgLTQwNywxOCArNDIzLDYgQEAKIAlyZXR1cm4gcjsKIH0KIAotY29uc3QgdWludDMyX3QgcmFkZW9uX21lbV9wcmlvc1tdID0gewotCVRUTV9QTF9WUkFNLAotCVRUTV9QTF9UVCwKLQlUVE1fUExfU1lTVEVNLAotfTsKLQotY29uc3QgdWludDMyX3QgcmFkZW9uX2J1c3lfcHJpb3NbXSA9IHsKLQlUVE1fUExfVFQsCi0JVFRNX1BMX1ZSQU0sCi0JVFRNX1BMX1NZU1RFTSwKLX07Ci0KIHN0YXRpYyBpbnQgcmFkZW9uX3N5bmNfb2JqX3dhaXQodm9pZCAqc3luY19vYmosIHZvaWQgKnN5bmNfYXJnLAogCQkJCWJvb2wgbGF6eSwgYm9vbCBpbnRlcnJ1cHRpYmxlKQogewpAQCAtNDQ2LDEwICs0NTAsNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IHR0bV9ib19kcml2ZXIgcmFkZW9uX2JvX2RyaXZlciA9IHsKLQkubWVtX3R5cGVfcHJpbyA9IHJhZGVvbl9tZW1fcHJpb3MsCi0JLm1lbV9idXN5X3ByaW8gPSByYWRlb25fYnVzeV9wcmlvcywKLQkubnVtX21lbV90eXBlX3ByaW8gPSBBUlJBWV9TSVpFKHJhZGVvbl9tZW1fcHJpb3MpLAotCS5udW1fbWVtX2J1c3lfcHJpbyA9IEFSUkFZX1NJWkUocmFkZW9uX2J1c3lfcHJpb3MpLAogCS5jcmVhdGVfdHRtX2JhY2tlbmRfZW50cnkgPSAmcmFkZW9uX2NyZWF0ZV90dG1fYmFja2VuZF9lbnRyeSwKIAkuaW52YWxpZGF0ZV9jYWNoZXMgPSAmcmFkZW9uX2ludmFsaWRhdGVfY2FjaGVzLAogCS5pbml0X21lbV90eXBlID0gJnJhZGVvbl9pbml0X21lbV90eXBlLApAQCAtNDgyLDI3ICs0ODIsMzEgQEAKIAkJRFJNX0VSUk9SKCJmYWlsZWQgaW5pdGlhbGl6aW5nIGJ1ZmZlciBvYmplY3QgZHJpdmVyKCVkKS5cbiIsIHIpOwogCQlyZXR1cm4gcjsKIAl9Ci0JciA9IHR0bV9ib19pbml0X21tKCZyZGV2LT5tbWFuLmJkZXYsIFRUTV9QTF9WUkFNLCAwLAotCQkJICAgKChyZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSkgPj4gUEFHRV9TSElGVCkpOworCXIgPSB0dG1fYm9faW5pdF9tbSgmcmRldi0+bW1hbi5iZGV2LCBUVE1fUExfVlJBTSwKKwkJCQlyZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSA+PiBQQUdFX1NISUZUKTsKIAlpZiAocikgewogCQlEUk1fRVJST1IoIkZhaWxlZCBpbml0aWFsaXppbmcgVlJBTSBoZWFwLlxuIik7CiAJCXJldHVybiByOwogCX0KLQlyID0gcmFkZW9uX29iamVjdF9jcmVhdGUocmRldiwgTlVMTCwgMjU2ICogMTAyNCwgdHJ1ZSwKLQkJCQkgUkFERU9OX0dFTV9ET01BSU5fVlJBTSwgZmFsc2UsCi0JCQkJICZyZGV2LT5zdG9sbGVuX3ZnYV9tZW1vcnkpOworCXIgPSByYWRlb25fYm9fY3JlYXRlKHJkZXYsIE5VTEwsIDI1NiAqIDEwMjQsIHRydWUsCisJCQkJUkFERU9OX0dFTV9ET01BSU5fVlJBTSwKKwkJCQkmcmRldi0+c3RvbGxlbl92Z2FfbWVtb3J5KTsKIAlpZiAocikgewogCQlyZXR1cm4gcjsKIAl9Ci0JciA9IHJhZGVvbl9vYmplY3RfcGluKHJkZXYtPnN0b2xsZW5fdmdhX21lbW9yeSwgUkFERU9OX0dFTV9ET01BSU5fVlJBTSwgTlVMTCk7CisJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPnN0b2xsZW5fdmdhX21lbW9yeSwgZmFsc2UpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwlyID0gcmFkZW9uX2JvX3BpbihyZGV2LT5zdG9sbGVuX3ZnYV9tZW1vcnksIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sIE5VTEwpOworCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+c3RvbGxlbl92Z2FfbWVtb3J5KTsKIAlpZiAocikgewotCQlyYWRlb25fb2JqZWN0X3VucmVmKCZyZGV2LT5zdG9sbGVuX3ZnYV9tZW1vcnkpOworCQlyYWRlb25fYm9fdW5yZWYoJnJkZXYtPnN0b2xsZW5fdmdhX21lbW9yeSk7CiAJCXJldHVybiByOwogCX0KIAlEUk1fSU5GTygicmFkZW9uOiAldU0gb2YgVlJBTSBtZW1vcnkgcmVhZHlcbiIsCiAJCSAodW5zaWduZWQpcmRldi0+bWMucmVhbF92cmFtX3NpemUgLyAoMTAyNCAqIDEwMjQpKTsKLQlyID0gdHRtX2JvX2luaXRfbW0oJnJkZXYtPm1tYW4uYmRldiwgVFRNX1BMX1RULCAwLAotCQkJICAgKChyZGV2LT5tYy5ndHRfc2l6ZSkgPj4gUEFHRV9TSElGVCkpOworCXIgPSB0dG1fYm9faW5pdF9tbSgmcmRldi0+bW1hbi5iZGV2LCBUVE1fUExfVFQsCisJCQkJcmRldi0+bWMuZ3R0X3NpemUgPj4gUEFHRV9TSElGVCk7CiAJaWYgKHIpIHsKIAkJRFJNX0VSUk9SKCJGYWlsZWQgaW5pdGlhbGl6aW5nIEdUVCBoZWFwLlxuIik7CiAJCXJldHVybiByOwpAQCAtNTIzLDkgKzUyNywxNSBAQAogCiB2b2lkIHJhZGVvbl90dG1fZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKKwlpbnQgcjsKKwogCWlmIChyZGV2LT5zdG9sbGVuX3ZnYV9tZW1vcnkpIHsKLQkJcmFkZW9uX29iamVjdF91bnBpbihyZGV2LT5zdG9sbGVuX3ZnYV9tZW1vcnkpOwotCQlyYWRlb25fb2JqZWN0X3VucmVmKCZyZGV2LT5zdG9sbGVuX3ZnYV9tZW1vcnkpOworCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+c3RvbGxlbl92Z2FfbWVtb3J5LCBmYWxzZSk7CisJCWlmIChyID09IDApIHsKKwkJCXJhZGVvbl9ib191bnBpbihyZGV2LT5zdG9sbGVuX3ZnYV9tZW1vcnkpOworCQkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5zdG9sbGVuX3ZnYV9tZW1vcnkpOworCQl9CisJCXJhZGVvbl9ib191bnJlZigmcmRldi0+c3RvbGxlbl92Z2FfbWVtb3J5KTsKIAl9CiAJdHRtX2JvX2NsZWFuX21tKCZyZGV2LT5tbWFuLmJkZXYsIFRUTV9QTF9WUkFNKTsKIAl0dG1fYm9fY2xlYW5fbW0oJnJkZXYtPm1tYW4uYmRldiwgVFRNX1BMX1RUKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM0MDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM0MDAuYwppbmRleCBjYTAzNzE2Li5jMWZjZGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNDAwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczQwMC5jCkBAIC0zNTIsNyArMzUyLDcgQEAKIAl1MzIgdG1wOwogCiAJLyogU2V0dXAgR1BVIG1lbW9yeSBzcGFjZSAqLwotCXRtcCA9IEdfMDAwMTVDX01DX0ZCX1NUQVJUKFJSRUczMihSXzAwMDE1Q19OQl9UT00pKTsKKwl0bXAgPSBSUkVHMzIoUl8wMDAxNUNfTkJfVE9NKTsKIAlyZGV2LT5tYy52cmFtX2xvY2F0aW9uID0gR18wMDAxNUNfTUNfRkJfU1RBUlQodG1wKSA8PCAxNjsKIAlyZGV2LT5tYy5ndHRfbG9jYXRpb24gPSAweEZGRkZGRkZGVUw7CiAJciA9IHJhZGVvbl9tY19zZXR1cChyZGV2KTsKQEAgLTM4NywxMyArMzg3LDEzIEBACiAJcjMwMF9jbG9ja19zdGFydHVwKHJkZXYpOwogCS8qIEluaXRpYWxpemUgR1BVIGNvbmZpZ3VyYXRpb24gKCMgcGlwZXMsIC4uLikgKi8KIAlyczQwMF9ncHVfaW5pdChyZGV2KTsKKwlyMTAwX2VuYWJsZV9ibShyZGV2KTsKIAkvKiBJbml0aWFsaXplIEdBUlQgKGluaXRpYWxpemUgYWZ0ZXIgVFRNIHNvIHdlIGNhbiBhbGxvY2F0ZQogCSAqIG1lbW9yeSB0aHJvdWdoIFRUTSBidXQgZmluYWxpemUgYWZ0ZXIgVFRNKSAqLwogCXIgPSByczQwMF9nYXJ0X2VuYWJsZShyZGV2KTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAJLyogRW5hYmxlIElSUSAqLwotCXJkZXYtPmlycS5zd19pbnQgPSB0cnVlOwogCXIxMDBfaXJxX3NldChyZGV2KTsKIAkvKiAxTSByaW5nIGJ1ZmZlciAqLwogCXIgPSByMTAwX2NwX2luaXQocmRldiwgMTAyNCAqIDEwMjQpOwpAQCAtNDMwLDYgKzQzMCw4IEBACiAJcmFkZW9uX2NvbWJpb3NfYXNpY19pbml0KHJkZXYtPmRkZXYpOwogCS8qIFJlc3VtZSBjbG9jayBhZnRlciBwb3N0aW5nICovCiAJcjMwMF9jbG9ja19zdGFydHVwKHJkZXYpOworCS8qIEluaXRpYWxpemUgc3VyZmFjZSByZWdpc3RlcnMgKi8KKwlyYWRlb25fc3VyZmFjZV9pbml0KHJkZXYpOwogCXJldHVybiByczQwMF9zdGFydHVwKHJkZXYpOwogfQogCkBAIC00NTIsNyArNDU0LDcgQEAKIAlyczQwMF9nYXJ0X2ZpbmkocmRldik7CiAJcmFkZW9uX2lycV9rbXNfZmluaShyZGV2KTsKIAlyYWRlb25fZmVuY2VfZHJpdmVyX2ZpbmkocmRldik7Ci0JcmFkZW9uX29iamVjdF9maW5pKHJkZXYpOworCXJhZGVvbl9ib19maW5pKHJkZXYpOwogCXJhZGVvbl9hdG9tYmlvc19maW5pKHJkZXYpOwogCWtmcmVlKHJkZXYtPmJpb3MpOwogCXJkZXYtPmJpb3MgPSBOVUxMOwpAQCAtNDkwLDEwICs0OTIsOSBAQAogCQkJUlJFRzMyKFJfMDAwN0MwX0NQX1NUQVQpKTsKIAl9CiAJLyogY2hlY2sgaWYgY2FyZHMgYXJlIHBvc3RlZCBvciBub3QgKi8KLQlpZiAoIXJhZGVvbl9jYXJkX3Bvc3RlZChyZGV2KSAmJiByZGV2LT5iaW9zKSB7Ci0JCURSTV9JTkZPKCJHUFUgbm90IHBvc3RlZC4gcG9zdGluZyBub3cuLi5cbiIpOwotCQlyYWRlb25fY29tYmlvc19hc2ljX2luaXQocmRldi0+ZGRldik7Ci0JfQorCWlmIChyYWRlb25fYm9vdF90ZXN0X3Bvc3RfY2FyZChyZGV2KSA9PSBmYWxzZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAkvKiBJbml0aWFsaXplIGNsb2NrcyAqLwogCXJhZGVvbl9nZXRfY2xvY2tfaW5mbyhyZGV2LT5kZGV2KTsKIAkvKiBHZXQgdnJhbSBpbmZvcm1hdGlvbnMgKi8KQEAgLTUxMCw3ICs1MTEsNyBAQAogCWlmIChyKQogCQlyZXR1cm4gcjsKIAkvKiBNZW1vcnkgbWFuYWdlciAqLwotCXIgPSByYWRlb25fb2JqZWN0X2luaXQocmRldik7CisJciA9IHJhZGVvbl9ib19pbml0KHJkZXYpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAlyID0gcnM0MDBfZ2FydF9pbml0KHJkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczYwMC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczYwMC5jCmluZGV4IDVmMTE3Y2QuLjRmOGVhNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2MDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMKQEAgLTQ1LDYgKzQ1LDEyMiBAQAogdm9pZCByczYwMF9ncHVfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgcnM2MDBfbWNfd2FpdF9mb3JfaWRsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKK2ludCByczYwMF9tY19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCS8qIHJlYWQgYmFjayB0aGUgTUMgdmFsdWUgZnJvbSB0aGUgaHcgKi8KKwlpbnQgcjsKKwl1MzIgdG1wOworCisJLyogU2V0dXAgR1BVIG1lbW9yeSBzcGFjZSAqLworCXRtcCA9IFJSRUczMl9NQyhSXzAwMDAwNF9NQ19GQl9MT0NBVElPTik7CisJcmRldi0+bWMudnJhbV9sb2NhdGlvbiA9IEdfMDAwMDA0X01DX0ZCX1NUQVJUKHRtcCkgPDwgMTY7CisJcmRldi0+bWMuZ3R0X2xvY2F0aW9uID0gMHhmZmZmZmZmZlVMOworCXIgPSByYWRlb25fbWNfc2V0dXAocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCXJldHVybiAwOworfQorCisvKiBocGQgZm9yIGRpZ2l0YWwgcGFuZWwgZGV0ZWN0L2Rpc2Nvbm5lY3QgKi8KK2Jvb2wgcnM2MDBfaHBkX3NlbnNlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBlbnVtIHJhZGVvbl9ocGRfaWQgaHBkKQoreworCXUzMiB0bXA7CisJYm9vbCBjb25uZWN0ZWQgPSBmYWxzZTsKKworCXN3aXRjaCAoaHBkKSB7CisJY2FzZSBSQURFT05fSFBEXzE6CisJCXRtcCA9IFJSRUczMihSXzAwN0QwNF9EQ19IT1RfUExVR19ERVRFQ1QxX0lOVF9TVEFUVVMpOworCQlpZiAoR18wMDdEMDRfRENfSE9UX1BMVUdfREVURUNUMV9TRU5TRSh0bXApKQorCQkJY29ubmVjdGVkID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBSQURFT05fSFBEXzI6CisJCXRtcCA9IFJSRUczMihSXzAwN0QxNF9EQ19IT1RfUExVR19ERVRFQ1QyX0lOVF9TVEFUVVMpOworCQlpZiAoR18wMDdEMTRfRENfSE9UX1BMVUdfREVURUNUMl9TRU5TRSh0bXApKQorCQkJY29ubmVjdGVkID0gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBjb25uZWN0ZWQ7Cit9CisKK3ZvaWQgcnM2MDBfaHBkX3NldF9wb2xhcml0eShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCSAgICBlbnVtIHJhZGVvbl9ocGRfaWQgaHBkKQoreworCXUzMiB0bXA7CisJYm9vbCBjb25uZWN0ZWQgPSByczYwMF9ocGRfc2Vuc2UocmRldiwgaHBkKTsKKworCXN3aXRjaCAoaHBkKSB7CisJY2FzZSBSQURFT05fSFBEXzE6CisJCXRtcCA9IFJSRUczMihSXzAwN0QwOF9EQ19IT1RfUExVR19ERVRFQ1QxX0lOVF9DT05UUk9MKTsKKwkJaWYgKGNvbm5lY3RlZCkKKwkJCXRtcCAmPSB+U18wMDdEMDhfRENfSE9UX1BMVUdfREVURUNUMV9JTlRfUE9MQVJJVFkoMSk7CisJCWVsc2UKKwkJCXRtcCB8PSBTXzAwN0QwOF9EQ19IT1RfUExVR19ERVRFQ1QxX0lOVF9QT0xBUklUWSgxKTsKKwkJV1JFRzMyKFJfMDA3RDA4X0RDX0hPVF9QTFVHX0RFVEVDVDFfSU5UX0NPTlRST0wsIHRtcCk7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX0hQRF8yOgorCQl0bXAgPSBSUkVHMzIoUl8wMDdEMThfRENfSE9UX1BMVUdfREVURUNUMl9JTlRfQ09OVFJPTCk7CisJCWlmIChjb25uZWN0ZWQpCisJCQl0bXAgJj0gflNfMDA3RDE4X0RDX0hPVF9QTFVHX0RFVEVDVDJfSU5UX1BPTEFSSVRZKDEpOworCQllbHNlCisJCQl0bXAgfD0gU18wMDdEMThfRENfSE9UX1BMVUdfREVURUNUMl9JTlRfUE9MQVJJVFkoMSk7CisJCVdSRUczMihSXzAwN0QxOF9EQ19IT1RfUExVR19ERVRFQ1QyX0lOVF9DT05UUk9MLCB0bXApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgcnM2MDBfaHBkX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJkZXYtPmRkZXY7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwkJc3dpdGNoIChyYWRlb25fY29ubmVjdG9yLT5ocGQuaHBkKSB7CisJCWNhc2UgUkFERU9OX0hQRF8xOgorCQkJV1JFRzMyKFJfMDA3RDAwX0RDX0hPVF9QTFVHX0RFVEVDVDFfQ09OVFJPTCwKKwkJCSAgICAgICBTXzAwN0QwMF9EQ19IT1RfUExVR19ERVRFQ1QxX0VOKDEpKTsKKwkJCXJkZXYtPmlycS5ocGRbMF0gPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgUkFERU9OX0hQRF8yOgorCQkJV1JFRzMyKFJfMDA3RDEwX0RDX0hPVF9QTFVHX0RFVEVDVDJfQ09OVFJPTCwKKwkJCSAgICAgICBTXzAwN0QxMF9EQ19IT1RfUExVR19ERVRFQ1QyX0VOKDEpKTsKKwkJCXJkZXYtPmlycS5ocGRbMV0gPSB0cnVlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlyczYwMF9pcnFfc2V0KHJkZXYpOworfQorCit2b2lkIHJzNjAwX2hwZF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByZGV2LT5kZGV2OworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJCXN3aXRjaCAocmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZCkgeworCQljYXNlIFJBREVPTl9IUERfMToKKwkJCVdSRUczMihSXzAwN0QwMF9EQ19IT1RfUExVR19ERVRFQ1QxX0NPTlRST0wsCisJCQkgICAgICAgU18wMDdEMDBfRENfSE9UX1BMVUdfREVURUNUMV9FTigwKSk7CisJCQlyZGV2LT5pcnEuaHBkWzBdID0gZmFsc2U7CisJCQlicmVhazsKKwkJY2FzZSBSQURFT05fSFBEXzI6CisJCQlXUkVHMzIoUl8wMDdEMTBfRENfSE9UX1BMVUdfREVURUNUMl9DT05UUk9MLAorCQkJICAgICAgIFNfMDA3RDEwX0RDX0hPVF9QTFVHX0RFVEVDVDJfRU4oMCkpOworCQkJcmRldi0+aXJxLmhwZFsxXSA9IGZhbHNlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KK30KKwogLyoKICAqIEdBUlQuCiAgKi8KQEAgLTEwMCw0MCArMjE2LDQwIEBACiAJV1JFRzMyKFJfMDAwMDRDX0JVU19DTlRMLCB0bXApOwogCS8qIEZJWE1FOiBzZXR1cCBkZWZhdWx0IHBhZ2UgKi8KIAlXUkVHMzJfTUMoUl8wMDAxMDBfTUNfUFQwX0NOVEwsCi0JCSAoU18wMDAxMDBfRUZGRUNUSVZFX0wyX0NBQ0hFX1NJWkUoNikgfAotCQkgIFNfMDAwMTAwX0VGRkVDVElWRV9MMl9RVUVVRV9TSVpFKDYpKSk7CisJCSAgKFNfMDAwMTAwX0VGRkVDVElWRV9MMl9DQUNIRV9TSVpFKDYpIHwKKwkJICAgU18wMDAxMDBfRUZGRUNUSVZFX0wyX1FVRVVFX1NJWkUoNikpKTsKKwogCWZvciAoaSA9IDA7IGkgPCAxOTsgaSsrKSB7CiAJCVdSRUczMl9NQyhSXzAwMDE2Q19NQ19QVDBfQ0xJRU5UMF9DTlRMICsgaSwKLQkJCVNfMDAwMTZDX0VOQUJMRV9UUkFOU0xBVElPTl9NT0RFX09WRVJSSURFKDEpIHwKLQkJCVNfMDAwMTZDX1NZU1RFTV9BQ0NFU1NfTU9ERV9NQVNLKAotCQkJCVZfMDAwMTZDX1NZU1RFTV9BQ0NFU1NfTU9ERV9JTl9TWVMpIHwKLQkJCVNfMDAwMTZDX1NZU1RFTV9BUEVSVFVSRV9VTk1BUFBFRF9BQ0NFU1MoCi0JCQkJVl8wMDAxNkNfU1lTVEVNX0FQRVJUVVJFX1VOTUFQUEVEX0RFRkFVTFRfUEFHRSkgfAotCQkJU18wMDAxNkNfRUZGRUNUSVZFX0wxX0NBQ0hFX1NJWkUoMSkgfAotCQkJU18wMDAxNkNfRU5BQkxFX0ZSQUdNRU5UX1BST0NFU1NJTkcoMSkgfAotCQkJU18wMDAxNkNfRUZGRUNUSVZFX0wxX1FVRVVFX1NJWkUoMSkpOworCQkJICBTXzAwMDE2Q19FTkFCTEVfVFJBTlNMQVRJT05fTU9ERV9PVkVSUklERSgxKSB8CisJCQkgIFNfMDAwMTZDX1NZU1RFTV9BQ0NFU1NfTU9ERV9NQVNLKAorCQkJCSAgVl8wMDAxNkNfU1lTVEVNX0FDQ0VTU19NT0RFX05PVF9JTl9TWVMpIHwKKwkJCSAgU18wMDAxNkNfU1lTVEVNX0FQRVJUVVJFX1VOTUFQUEVEX0FDQ0VTUygKKwkJCQkgIFZfMDAwMTZDX1NZU1RFTV9BUEVSVFVSRV9VTk1BUFBFRF9QQVNTVEhST1VHSCkgfAorCQkJICBTXzAwMDE2Q19FRkZFQ1RJVkVfTDFfQ0FDSEVfU0laRSgzKSB8CisJCQkgIFNfMDAwMTZDX0VOQUJMRV9GUkFHTUVOVF9QUk9DRVNTSU5HKDEpIHwKKwkJCSAgU18wMDAxNkNfRUZGRUNUSVZFX0wxX1FVRVVFX1NJWkUoMykpOwogCX0KLQotCS8qIFN5c3RlbSBjb250ZXh0IG1hcCB0byBHQVJUIHNwYWNlICovCi0JV1JFRzMyX01DKFJfMDAwMTEyX01DX1BUMF9TWVNURU1fQVBFUlRVUkVfTE9XX0FERFIsIHJkZXYtPm1jLmd0dF9zdGFydCk7Ci0JV1JFRzMyX01DKFJfMDAwMTE0X01DX1BUMF9TWVNURU1fQVBFUlRVUkVfSElHSF9BRERSLCByZGV2LT5tYy5ndHRfZW5kKTsKLQogCS8qIGVuYWJsZSBmaXJzdCBjb250ZXh0ICovCi0JV1JFRzMyX01DKFJfMDAwMTNDX01DX1BUMF9DT05URVhUMF9GTEFUX1NUQVJUX0FERFIsIHJkZXYtPm1jLmd0dF9zdGFydCk7Ci0JV1JFRzMyX01DKFJfMDAwMTRDX01DX1BUMF9DT05URVhUMF9GTEFUX0VORF9BRERSLCByZGV2LT5tYy5ndHRfZW5kKTsKIAlXUkVHMzJfTUMoUl8wMDAxMDJfTUNfUFQwX0NPTlRFWFQwX0NOVEwsCi0JCQlTXzAwMDEwMl9FTkFCTEVfUEFHRV9UQUJMRSgxKSB8Ci0JCQlTXzAwMDEwMl9QQUdFX1RBQkxFX0RFUFRIKFZfMDAwMTAyX1BBR0VfVEFCTEVfRkxBVCkpOworCQkgIFNfMDAwMTAyX0VOQUJMRV9QQUdFX1RBQkxFKDEpIHwKKwkJICBTXzAwMDEwMl9QQUdFX1RBQkxFX0RFUFRIKFZfMDAwMTAyX1BBR0VfVEFCTEVfRkxBVCkpOworCiAJLyogZGlzYWJsZSBhbGwgb3RoZXIgY29udGV4dHMgKi8KLQlmb3IgKGkgPSAxOyBpIDwgODsgaSsrKSB7CisJZm9yIChpID0gMTsgaSA8IDg7IGkrKykKIAkJV1JFRzMyX01DKFJfMDAwMTAyX01DX1BUMF9DT05URVhUMF9DTlRMICsgaSwgMCk7Ci0JfQogCiAJLyogc2V0dXAgdGhlIHBhZ2UgdGFibGUgKi8KIAlXUkVHMzJfTUMoUl8wMDAxMkNfTUNfUFQwX0NPTlRFWFQwX0ZMQVRfQkFTRV9BRERSLAotCQkJcmRldi0+Z2FydC50YWJsZV9hZGRyKTsKKwkJICByZGV2LT5nYXJ0LnRhYmxlX2FkZHIpOworCVdSRUczMl9NQyhSXzAwMDEzQ19NQ19QVDBfQ09OVEVYVDBfRkxBVF9TVEFSVF9BRERSLCByZGV2LT5tYy5ndHRfc3RhcnQpOworCVdSRUczMl9NQyhSXzAwMDE0Q19NQ19QVDBfQ09OVEVYVDBfRkxBVF9FTkRfQUREUiwgcmRldi0+bWMuZ3R0X2VuZCk7CiAJV1JFRzMyX01DKFJfMDAwMTFDX01DX1BUMF9DT05URVhUMF9ERUZBVUxUX1JFQURfQUREUiwgMCk7CiAKKwkvKiBTeXN0ZW0gY29udGV4dCBtYXBzIHRvIFZSQU0gc3BhY2UgKi8KKwlXUkVHMzJfTUMoUl8wMDAxMTJfTUNfUFQwX1NZU1RFTV9BUEVSVFVSRV9MT1dfQUREUiwgcmRldi0+bWMudnJhbV9zdGFydCk7CisJV1JFRzMyX01DKFJfMDAwMTE0X01DX1BUMF9TWVNURU1fQVBFUlRVUkVfSElHSF9BRERSLCByZGV2LT5tYy52cmFtX2VuZCk7CisKIAkvKiBlbmFibGUgcGFnZSB0YWJsZXMgKi8KIAl0bXAgPSBSUkVHMzJfTUMoUl8wMDAxMDBfTUNfUFQwX0NOVEwpOwogCVdSRUczMl9NQyhSXzAwMDEwMF9NQ19QVDBfQ05UTCwgKHRtcCB8IFNfMDAwMTAwX0VOQUJMRV9QVCgxKSkpOwpAQCAtMTQ2LDE1ICsyNjIsMjAgQEAKIAogdm9pZCByczYwMF9nYXJ0X2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JdWludDMyX3QgdG1wOworCXUzMiB0bXA7CisJaW50IHI7CiAKIAkvKiBGSVhNRTogZGlzYWJsZSBvdXQgb2YgZ2FydCBhY2Nlc3MgKi8KIAlXUkVHMzJfTUMoUl8wMDAxMDBfTUNfUFQwX0NOVEwsIDApOwogCXRtcCA9IFJSRUczMl9NQyhSXzAwMDAwOV9NQ19DTlRMMSk7CiAJV1JFRzMyX01DKFJfMDAwMDA5X01DX0NOVEwxLCB0bXAgJiBDXzAwMDAwOV9FTkFCTEVfUEFHRV9UQUJMRVMpOwogCWlmIChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaikgewotCQlyYWRlb25fb2JqZWN0X2t1bm1hcChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7Ci0JCXJhZGVvbl9vYmplY3RfdW5waW4ocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOworCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmosIGZhbHNlKTsKKwkJaWYgKHIgPT0gMCkgeworCQkJcmFkZW9uX2JvX2t1bm1hcChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7CisJCQlyYWRlb25fYm9fdW5waW4ocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOworCQkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7CisJCX0KIAl9CiB9CiAKQEAgLTE4OSw2ICszMTAsMTAgQEAKIHsKIAl1aW50MzJfdCB0bXAgPSAwOwogCXVpbnQzMl90IG1vZGVfaW50ID0gMDsKKwl1MzIgaHBkMSA9IFJSRUczMihSXzAwN0QwOF9EQ19IT1RfUExVR19ERVRFQ1QxX0lOVF9DT05UUk9MKSAmCisJCX5TXzAwN0QwOF9EQ19IT1RfUExVR19ERVRFQ1QxX0lOVF9FTigxKTsKKwl1MzIgaHBkMiA9IFJSRUczMihSXzAwN0QxOF9EQ19IT1RfUExVR19ERVRFQ1QyX0lOVF9DT05UUk9MKSAmCisJCX5TXzAwN0QxOF9EQ19IT1RfUExVR19ERVRFQ1QyX0lOVF9FTigxKTsKIAogCWlmIChyZGV2LT5pcnEuc3dfaW50KSB7CiAJCXRtcCB8PSBTXzAwMDA0MF9TV19JTlRfRU4oMSk7CkBAIC0xOTksOCArMzI0LDE2IEBACiAJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMV0pIHsKIAkJbW9kZV9pbnQgfD0gU18wMDY1NDBfRDJNT0RFX1ZCTEFOS19JTlRfTUFTSygxKTsKIAl9CisJaWYgKHJkZXYtPmlycS5ocGRbMF0pIHsKKwkJaHBkMSB8PSBTXzAwN0QwOF9EQ19IT1RfUExVR19ERVRFQ1QxX0lOVF9FTigxKTsKKwl9CisJaWYgKHJkZXYtPmlycS5ocGRbMV0pIHsKKwkJaHBkMiB8PSBTXzAwN0QxOF9EQ19IT1RfUExVR19ERVRFQ1QyX0lOVF9FTigxKTsKKwl9CiAJV1JFRzMyKFJfMDAwMDQwX0dFTl9JTlRfQ05UTCwgdG1wKTsKIAlXUkVHMzIoUl8wMDY1NDBfRHhNT0RFX0lOVF9NQVNLLCBtb2RlX2ludCk7CisJV1JFRzMyKFJfMDA3RDA4X0RDX0hPVF9QTFVHX0RFVEVDVDFfSU5UX0NPTlRST0wsIGhwZDEpOworCVdSRUczMihSXzAwN0QxOF9EQ19IT1RfUExVR19ERVRFQ1QyX0lOVF9DT05UUk9MLCBocGQyKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjA4LDYgKzM0MSw3IEBACiB7CiAJdWludDMyX3QgaXJxcyA9IFJSRUczMihSXzAwMDA0NF9HRU5fSU5UX1NUQVRVUyk7CiAJdWludDMyX3QgaXJxX21hc2sgPSB+Q18wMDAwNDRfU1dfSU5UOworCXUzMiB0bXA7CiAKIAlpZiAoR18wMDAwNDRfRElTUExBWV9JTlRfU1RBVChpcnFzKSkgewogCQkqcjUwMF9kaXNwX2ludCA9IFJSRUczMihSXzAwN0VEQ19ESVNQX0lOVEVSUlVQVF9TVEFUVVMpOwpAQCAtMjE5LDYgKzM1MywxNiBAQAogCQkJV1JFRzMyKFJfMDA2RDM0X0QyTU9ERV9WQkxBTktfU1RBVFVTLAogCQkJCVNfMDA2RDM0X0QyTU9ERV9WQkxBTktfQUNLKDEpKTsKIAkJfQorCQlpZiAoR18wMDdFRENfRENfSE9UX1BMVUdfREVURUNUMV9JTlRFUlJVUFQoKnI1MDBfZGlzcF9pbnQpKSB7CisJCQl0bXAgPSBSUkVHMzIoUl8wMDdEMDhfRENfSE9UX1BMVUdfREVURUNUMV9JTlRfQ09OVFJPTCk7CisJCQl0bXAgfD0gU18wMDdEMDhfRENfSE9UX1BMVUdfREVURUNUMV9JTlRfQUNLKDEpOworCQkJV1JFRzMyKFJfMDA3RDA4X0RDX0hPVF9QTFVHX0RFVEVDVDFfSU5UX0NPTlRST0wsIHRtcCk7CisJCX0KKwkJaWYgKEdfMDA3RURDX0RDX0hPVF9QTFVHX0RFVEVDVDJfSU5URVJSVVBUKCpyNTAwX2Rpc3BfaW50KSkgeworCQkJdG1wID0gUlJFRzMyKFJfMDA3RDE4X0RDX0hPVF9QTFVHX0RFVEVDVDJfSU5UX0NPTlRST0wpOworCQkJdG1wIHw9IFNfMDA3RDE4X0RDX0hPVF9QTFVHX0RFVEVDVDJfSU5UX0FDSygxKTsKKwkJCVdSRUczMihSXzAwN0QxOF9EQ19IT1RfUExVR19ERVRFQ1QyX0lOVF9DT05UUk9MLCB0bXApOworCQl9CiAJfSBlbHNlIHsKIAkJKnI1MDBfZGlzcF9pbnQgPSAwOwogCX0KQEAgLTI0NCw2ICszODgsNyBAQAogewogCXVpbnQzMl90IHN0YXR1cywgbXNpX3JlYXJtOwogCXVpbnQzMl90IHI1MDBfZGlzcF9pbnQ7CisJYm9vbCBxdWV1ZV9ob3RwbHVnID0gZmFsc2U7CiAKIAlzdGF0dXMgPSByczYwMF9pcnFfYWNrKHJkZXYsICZyNTAwX2Rpc3BfaW50KTsKIAlpZiAoIXN0YXR1cyAmJiAhcjUwMF9kaXNwX2ludCkgewpAQCAtMjU4LDggKzQwMywxOCBAQAogCQkJZHJtX2hhbmRsZV92YmxhbmsocmRldi0+ZGRldiwgMCk7CiAJCWlmIChHXzAwN0VEQ19MQl9EMl9WQkxBTktfSU5URVJSVVBUKHI1MDBfZGlzcF9pbnQpKQogCQkJZHJtX2hhbmRsZV92YmxhbmsocmRldi0+ZGRldiwgMSk7CisJCWlmIChHXzAwN0VEQ19EQ19IT1RfUExVR19ERVRFQ1QxX0lOVEVSUlVQVChyNTAwX2Rpc3BfaW50KSkgeworCQkJcXVldWVfaG90cGx1ZyA9IHRydWU7CisJCQlEUk1fREVCVUcoIkhQRDFcbiIpOworCQl9CisJCWlmIChHXzAwN0VEQ19EQ19IT1RfUExVR19ERVRFQ1QyX0lOVEVSUlVQVChyNTAwX2Rpc3BfaW50KSkgeworCQkJcXVldWVfaG90cGx1ZyA9IHRydWU7CisJCQlEUk1fREVCVUcoIkhQRDJcbiIpOworCQl9CiAJCXN0YXR1cyA9IHJzNjAwX2lycV9hY2socmRldiwgJnI1MDBfZGlzcF9pbnQpOwogCX0KKwlpZiAocXVldWVfaG90cGx1ZykKKwkJcXVldWVfd29yayhyZGV2LT53cSwgJnJkZXYtPmhvdHBsdWdfd29yayk7CiAJaWYgKHJkZXYtPm1zaV9lbmFibGVkKSB7CiAJCXN3aXRjaCAocmRldi0+ZmFtaWx5KSB7CiAJCWNhc2UgQ0hJUF9SUzYwMDoKQEAgLTMwMSw5ICs0NTYsNyBAQAogCiB2b2lkIHJzNjAwX2dwdV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewotCS8qIEZJWE1FOiBIRFAgc2FtZSBwbGFjZSBvbiByczYwMCA/ICovCiAJcjEwMF9oZHBfcmVzZXQocmRldik7Ci0JLyogRklYTUU6IGlzIHRoaXMgY29ycmVjdCA/ICovCiAJcjQyMF9waXBlc19pbml0KHJkZXYpOwogCS8qIFdhaXQgZm9yIG1jIGlkbGUgKi8KIAlpZiAocnM2MDBfbWNfd2FpdF9mb3JfaWRsZShyZGV2KSkKQEAgLTMxMiw5ICs0NjUsMjAgQEAKIAogdm9pZCByczYwMF92cmFtX2luZm8oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JLyogRklYTUU6IHRvIGRvIG9yIGlzIHRoZXNlIHZhbHVlcyBzYW5lID8gKi8KIAlyZGV2LT5tYy52cmFtX2lzX2RkciA9IHRydWU7CiAJcmRldi0+bWMudnJhbV93aWR0aCA9IDEyODsKKworCXJkZXYtPm1jLnJlYWxfdnJhbV9zaXplID0gUlJFRzMyKFJBREVPTl9DT05GSUdfTUVNU0laRSk7CisJcmRldi0+bWMubWNfdnJhbV9zaXplID0gcmRldi0+bWMucmVhbF92cmFtX3NpemU7CisKKwlyZGV2LT5tYy5hcGVyX2Jhc2UgPSBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KHJkZXYtPmRkZXYsIDApOworCXJkZXYtPm1jLmFwZXJfc2l6ZSA9IGRybV9nZXRfcmVzb3VyY2VfbGVuKHJkZXYtPmRkZXYsIDApOworCisJaWYgKHJkZXYtPm1jLm1jX3ZyYW1fc2l6ZSA+IHJkZXYtPm1jLmFwZXJfc2l6ZSkKKwkJcmRldi0+bWMubWNfdnJhbV9zaXplID0gcmRldi0+bWMuYXBlcl9zaXplOworCisJaWYgKHJkZXYtPm1jLnJlYWxfdnJhbV9zaXplID4gcmRldi0+bWMuYXBlcl9zaXplKQorCQlyZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSA9IHJkZXYtPm1jLmFwZXJfc2l6ZTsKIH0KIAogdm9pZCByczYwMF9iYW5kd2lkdGhfdXBkYXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQpAQCAtMzg4LDcgKzU1Miw2IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCS8qIEVuYWJsZSBJUlEgKi8KLQlyZGV2LT5pcnEuc3dfaW50ID0gdHJ1ZTsKIAlyczYwMF9pcnFfc2V0KHJkZXYpOwogCS8qIDFNIHJpbmcgYnVmZmVyICovCiAJciA9IHIxMDBfY3BfaW5pdChyZGV2LCAxMDI0ICogMTAyNCk7CkBAIC00MjMsNiArNTg2LDggQEAKIAlhdG9tX2FzaWNfaW5pdChyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0KTsKIAkvKiBSZXN1bWUgY2xvY2sgYWZ0ZXIgcG9zdGluZyAqLwogCXJ2NTE1X2Nsb2NrX3N0YXJ0dXAocmRldik7CisJLyogSW5pdGlhbGl6ZSBzdXJmYWNlIHJlZ2lzdGVycyAqLworCXJhZGVvbl9zdXJmYWNlX2luaXQocmRldik7CiAJcmV0dXJuIHJzNjAwX3N0YXJ0dXAocmRldik7CiB9CiAKQEAgLTQ0NSw3ICs2MTAsNyBAQAogCXJzNjAwX2dhcnRfZmluaShyZGV2KTsKIAlyYWRlb25faXJxX2ttc19maW5pKHJkZXYpOwogCXJhZGVvbl9mZW5jZV9kcml2ZXJfZmluaShyZGV2KTsKLQlyYWRlb25fb2JqZWN0X2ZpbmkocmRldik7CisJcmFkZW9uX2JvX2ZpbmkocmRldik7CiAJcmFkZW9uX2F0b21iaW9zX2ZpbmkocmRldik7CiAJa2ZyZWUocmRldi0+Ymlvcyk7CiAJcmRldi0+YmlvcyA9IE5VTEw7CkBAIC00ODIsMTAgKzY0Nyw5IEBACiAJCQlSUkVHMzIoUl8wMDA3QzBfQ1BfU1RBVCkpOwogCX0KIAkvKiBjaGVjayBpZiBjYXJkcyBhcmUgcG9zdGVkIG9yIG5vdCAqLwotCWlmICghcmFkZW9uX2NhcmRfcG9zdGVkKHJkZXYpICYmIHJkZXYtPmJpb3MpIHsKLQkJRFJNX0lORk8oIkdQVSBub3QgcG9zdGVkLiBwb3N0aW5nIG5vdy4uLlxuIik7Ci0JCWF0b21fYXNpY19pbml0KHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQpOwotCX0KKwlpZiAocmFkZW9uX2Jvb3RfdGVzdF9wb3N0X2NhcmQocmRldikgPT0gZmFsc2UpCisJCXJldHVybiAtRUlOVkFMOworCiAJLyogSW5pdGlhbGl6ZSBjbG9ja3MgKi8KIAlyYWRlb25fZ2V0X2Nsb2NrX2luZm8ocmRldi0+ZGRldik7CiAJLyogSW5pdGlhbGl6ZSBwb3dlciBtYW5hZ2VtZW50ICovCkBAIC00OTMsNyArNjU3LDcgQEAKIAkvKiBHZXQgdnJhbSBpbmZvcm1hdGlvbnMgKi8KIAlyczYwMF92cmFtX2luZm8ocmRldik7CiAJLyogSW5pdGlhbGl6ZSBtZW1vcnkgY29udHJvbGxlciAoYWxzbyB0ZXN0IEFHUCkgKi8KLQlyID0gcjQyMF9tY19pbml0KHJkZXYpOworCXIgPSByczYwMF9tY19pbml0KHJkZXYpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAlyczYwMF9kZWJ1Z2ZzKHJkZXYpOwpAQCAtNTA1LDcgKzY2OSw3IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCS8qIE1lbW9yeSBtYW5hZ2VyICovCi0JciA9IHJhZGVvbl9vYmplY3RfaW5pdChyZGV2KTsKKwlyID0gcmFkZW9uX2JvX2luaXQocmRldik7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCXIgPSByczYwMF9nYXJ0X2luaXQocmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczYwMGQuaAppbmRleCA4MTMwODkyLi5jMWM4ZjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2MDBkLmgKQEAgLTMwLDI3ICszMCwxMiBAQAogCiAvKiBSZWdpc3RlcnMgKi8KICNkZWZpbmUgUl8wMDAwNDBfR0VOX0lOVF9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAKLSNkZWZpbmUgICBTXzAwMDA0MF9ESVNQTEFZX0lOVF9TVEFUVVMoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMCkKLSNkZWZpbmUgICBHXzAwMDA0MF9ESVNQTEFZX0lOVF9TVEFUVVMoeCkgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4MSkKLSNkZWZpbmUgICBDXzAwMDA0MF9ESVNQTEFZX0lOVF9TVEFUVVMgICAgICAgICAgICAgICAgICAweEZGRkZGRkZFCi0jZGVmaW5lICAgU18wMDAwNDBfRE1BX1ZJUEgwX0lOVF9FTih4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEyKQotI2RlZmluZSAgIEdfMDAwMDQwX0RNQV9WSVBIMF9JTlRfRU4oeCkgICAgICAgICAgICAgICAgICgoKHgpID4+IDEyKSAmIDB4MSkKLSNkZWZpbmUgICBDXzAwMDA0MF9ETUFfVklQSDBfSU5UX0VOICAgICAgICAgICAgICAgICAgICAweEZGRkZFRkZGCi0jZGVmaW5lICAgU18wMDAwNDBfQ1JUQzJfVlNZTkMoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDYpCi0jZGVmaW5lICAgR18wMDAwNDBfQ1JUQzJfVlNZTkMoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gNikgJiAweDEpCi0jZGVmaW5lICAgQ18wMDAwNDBfQ1JUQzJfVlNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZCRgotI2RlZmluZSAgIFNfMDAwMDQwX1NOQVBTSE9UMih4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCA3KQotI2RlZmluZSAgIEdfMDAwMDQwX1NOQVBTSE9UMih4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDcpICYgMHgxKQotI2RlZmluZSAgIENfMDAwMDQwX1NOQVBTSE9UMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGN0YKLSNkZWZpbmUgICBTXzAwMDA0MF9DUlRDMl9WQkxBTksoeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgOSkKLSNkZWZpbmUgICBHXzAwMDA0MF9DUlRDMl9WQkxBTksoeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiA5KSAmIDB4MSkKLSNkZWZpbmUgICBDXzAwMDA0MF9DUlRDMl9WQkxBTksgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGREZGCi0jZGVmaW5lICAgU18wMDAwNDBfRlAyX0RFVEVDVCh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEwKQotI2RlZmluZSAgIEdfMDAwMDQwX0ZQMl9ERVRFQ1QoeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDEwKSAmIDB4MSkKLSNkZWZpbmUgICBDXzAwMDA0MF9GUDJfREVURUNUICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGQkZGCi0jZGVmaW5lICAgU18wMDAwNDBfVlNZTkNfRElGRl9PVkVSX0xJTUlUKHgpICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDExKQotI2RlZmluZSAgIEdfMDAwMDQwX1ZTWU5DX0RJRkZfT1ZFUl9MSU1JVCh4KSAgICAgICAgICAgICgoKHgpID4+IDExKSAmIDB4MSkKLSNkZWZpbmUgICBDXzAwMDA0MF9WU1lOQ19ESUZGX09WRVJfTElNSVQgICAgICAgICAgICAgICAweEZGRkZGN0ZGCisjZGVmaW5lICAgU18wMDAwNDBfU0NSQVRDSF9JTlRfTUFTSyh4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE4KQorI2RlZmluZSAgIEdfMDAwMDQwX1NDUkFUQ0hfSU5UX01BU0soeCkgICAgICAgICAgICAgICAgICgoKHgpID4+IDE4KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDA0MF9TQ1JBVENIX0lOVF9NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkJGRkZGCisjZGVmaW5lICAgU18wMDAwNDBfR1VJX0lETEVfTUFTSyh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE5KQorI2RlZmluZSAgIEdfMDAwMDQwX0dVSV9JRExFX01BU0soeCkgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDE5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDA0MF9HVUlfSURMRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweEZGRjdGRkZGCiAjZGVmaW5lICAgU18wMDAwNDBfRE1BX1ZJUEgxX0lOVF9FTih4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEzKQogI2RlZmluZSAgIEdfMDAwMDQwX0RNQV9WSVBIMV9JTlRfRU4oeCkgICAgICAgICAgICAgICAgICgoKHgpID4+IDEzKSAmIDB4MSkKICNkZWZpbmUgICBDXzAwMDA0MF9ETUFfVklQSDFfSU5UX0VOICAgICAgICAgICAgICAgICAgICAweEZGRkZERkZGCkBAIC0zNzAsNyArMzU1LDkwIEBACiAjZGVmaW5lICAgU18wMDdFRENfTEJfRDJfVkJMQU5LX0lOVEVSUlVQVCh4KSAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDUpCiAjZGVmaW5lICAgR18wMDdFRENfTEJfRDJfVkJMQU5LX0lOVEVSUlVQVCh4KSAgICAgICAgICAgKCgoeCkgPj4gNSkgJiAweDEpCiAjZGVmaW5lICAgQ18wMDdFRENfTEJfRDJfVkJMQU5LX0lOVEVSUlVQVCAgICAgICAgICAgICAgMHhGRkZGRkZERgotCisjZGVmaW5lICAgU18wMDdFRENfREFDQV9BVVRPREVURUNUX0lOVEVSUlVQVCh4KSAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE2KQorI2RlZmluZSAgIEdfMDA3RURDX0RBQ0FfQVVUT0RFVEVDVF9JTlRFUlJVUFQoeCkgICAgICAgICgoKHgpID4+IDE2KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwN0VEQ19EQUNBX0FVVE9ERVRFQ1RfSU5URVJSVVBUICAgICAgICAgICAweEZGRkVGRkZGCisjZGVmaW5lICAgU18wMDdFRENfREFDQl9BVVRPREVURUNUX0lOVEVSUlVQVCh4KSAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE3KQorI2RlZmluZSAgIEdfMDA3RURDX0RBQ0JfQVVUT0RFVEVDVF9JTlRFUlJVUFQoeCkgICAgICAgICgoKHgpID4+IDE3KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwN0VEQ19EQUNCX0FVVE9ERVRFQ1RfSU5URVJSVVBUICAgICAgICAgICAweEZGRkRGRkZGCisjZGVmaW5lICAgU18wMDdFRENfRENfSE9UX1BMVUdfREVURUNUMV9JTlRFUlJVUFQoeCkgICAgKCgoeCkgJiAweDEpIDw8IDE4KQorI2RlZmluZSAgIEdfMDA3RURDX0RDX0hPVF9QTFVHX0RFVEVDVDFfSU5URVJSVVBUKHgpICAgICgoKHgpID4+IDE4KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwN0VEQ19EQ19IT1RfUExVR19ERVRFQ1QxX0lOVEVSUlVQVCAgICAgICAweEZGRkJGRkZGCisjZGVmaW5lICAgU18wMDdFRENfRENfSE9UX1BMVUdfREVURUNUMl9JTlRFUlJVUFQoeCkgICAgKCgoeCkgJiAweDEpIDw8IDE5KQorI2RlZmluZSAgIEdfMDA3RURDX0RDX0hPVF9QTFVHX0RFVEVDVDJfSU5URVJSVVBUKHgpICAgICgoKHgpID4+IDE5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwN0VEQ19EQ19IT1RfUExVR19ERVRFQ1QyX0lOVEVSUlVQVCAgICAgICAweEZGRjdGRkZGCisjZGVmaW5lIFJfMDA3ODI4X0RBQ0FfQVVUT0RFVEVDVF9DT05UUk9MICAgICAgICAgICAgICAgMHgwMDc4MjgKKyNkZWZpbmUgICBTXzAwNzgyOF9EQUNBX0FVVE9ERVRFQ1RfTU9ERSh4KSAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgMCkKKyNkZWZpbmUgICBHXzAwNzgyOF9EQUNBX0FVVE9ERVRFQ1RfTU9ERSh4KSAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4MykKKyNkZWZpbmUgICBDXzAwNzgyOF9EQUNBX0FVVE9ERVRFQ1RfTU9ERSAgICAgICAgICAgICAgICAweEZGRkZGRkZDCisjZGVmaW5lICAgU18wMDc4MjhfREFDQV9BVVRPREVURUNUX0ZSQU1FX1RJTUVfQ09VTlRFUih4KSAoKCh4KSAmIDB4ZmYpIDw8IDgpCisjZGVmaW5lICAgR18wMDc4MjhfREFDQV9BVVRPREVURUNUX0ZSQU1FX1RJTUVfQ09VTlRFUih4KSAoKCh4KSA+PiA4KSAmIDB4ZmYpCisjZGVmaW5lICAgQ18wMDc4MjhfREFDQV9BVVRPREVURUNUX0ZSQU1FX1RJTUVfQ09VTlRFUiAgMHhGRkZGMDBGRgorI2RlZmluZSAgIFNfMDA3ODI4X0RBQ0FfQVVUT0RFVEVDVF9DSEVDS19NQVNLKHgpICAgICAgICgoKHgpICYgMHgzKSA8PCAxNikKKyNkZWZpbmUgICBHXzAwNzgyOF9EQUNBX0FVVE9ERVRFQ1RfQ0hFQ0tfTUFTSyh4KSAgICAgICAoKCh4KSA+PiAxNikgJiAweDMpCisjZGVmaW5lICAgQ18wMDc4MjhfREFDQV9BVVRPREVURUNUX0NIRUNLX01BU0sgICAgICAgICAgMHhGRkZDRkZGRgorI2RlZmluZSBSXzAwNzgzOF9EQUNBX0FVVE9ERVRFQ1RfSU5UX0NPTlRST0wgICAgICAgICAgIDB4MDA3ODM4CisjZGVmaW5lICAgU18wMDc4MzhfREFDQV9BVVRPREVURUNUX0FDSyh4KSAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDApCisjZGVmaW5lICAgQ18wMDc4MzhfREFDQV9EQUNBX0FVVE9ERVRFQ1RfQUNLICAgICAgICAgICAgMHhGRkZGRkZGRQorI2RlZmluZSAgIFNfMDA3ODM4X0RBQ0FfQVVUT0RFVEVDVF9JTlRfRU5BQkxFKHgpICAgICAgICgoKHgpICYgMHgxKSA8PCAxNikKKyNkZWZpbmUgICBHXzAwNzgzOF9EQUNBX0FVVE9ERVRFQ1RfSU5UX0VOQUJMRSh4KSAgICAgICAoKCh4KSA+PiAxNikgJiAweDEpCisjZGVmaW5lICAgQ18wMDc4MzhfREFDQV9BVVRPREVURUNUX0lOVF9FTkFCTEUgICAgICAgICAgMHhGRkZDRkZGRgorI2RlZmluZSBSXzAwN0EyOF9EQUNCX0FVVE9ERVRFQ1RfQ09OVFJPTCAgICAgICAgICAgICAgIDB4MDA3QTI4CisjZGVmaW5lICAgU18wMDdBMjhfREFDQl9BVVRPREVURUNUX01PREUoeCkgICAgICAgICAgICAgKCgoeCkgJiAweDMpIDw8IDApCisjZGVmaW5lICAgR18wMDdBMjhfREFDQl9BVVRPREVURUNUX01PREUoeCkgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDMpCisjZGVmaW5lICAgQ18wMDdBMjhfREFDQl9BVVRPREVURUNUX01PREUgICAgICAgICAgICAgICAgMHhGRkZGRkZGQworI2RlZmluZSAgIFNfMDA3QTI4X0RBQ0JfQVVUT0RFVEVDVF9GUkFNRV9USU1FX0NPVU5URVIoeCkgKCgoeCkgJiAweGZmKSA8PCA4KQorI2RlZmluZSAgIEdfMDA3QTI4X0RBQ0JfQVVUT0RFVEVDVF9GUkFNRV9USU1FX0NPVU5URVIoeCkgKCgoeCkgPj4gOCkgJiAweGZmKQorI2RlZmluZSAgIENfMDA3QTI4X0RBQ0JfQVVUT0RFVEVDVF9GUkFNRV9USU1FX0NPVU5URVIgIDB4RkZGRjAwRkYKKyNkZWZpbmUgICBTXzAwN0EyOF9EQUNCX0FVVE9ERVRFQ1RfQ0hFQ0tfTUFTSyh4KSAgICAgICAoKCh4KSAmIDB4MykgPDwgMTYpCisjZGVmaW5lICAgR18wMDdBMjhfREFDQl9BVVRPREVURUNUX0NIRUNLX01BU0soeCkgICAgICAgKCgoeCkgPj4gMTYpICYgMHgzKQorI2RlZmluZSAgIENfMDA3QTI4X0RBQ0JfQVVUT0RFVEVDVF9DSEVDS19NQVNLICAgICAgICAgIDB4RkZGQ0ZGRkYKKyNkZWZpbmUgUl8wMDdBMzhfREFDQl9BVVRPREVURUNUX0lOVF9DT05UUk9MICAgICAgICAgICAweDAwN0EzOAorI2RlZmluZSAgIFNfMDA3QTM4X0RBQ0JfQVVUT0RFVEVDVF9BQ0soeCkgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAwKQorI2RlZmluZSAgIENfMDA3QTM4X0RBQ0JfREFDQV9BVVRPREVURUNUX0FDSyAgICAgICAgICAgIDB4RkZGRkZGRkUKKyNkZWZpbmUgICBTXzAwN0EzOF9EQUNCX0FVVE9ERVRFQ1RfSU5UX0VOQUJMRSh4KSAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTYpCisjZGVmaW5lICAgR18wMDdBMzhfREFDQl9BVVRPREVURUNUX0lOVF9FTkFCTEUoeCkgICAgICAgKCgoeCkgPj4gMTYpICYgMHgxKQorI2RlZmluZSAgIENfMDA3QTM4X0RBQ0JfQVVUT0RFVEVDVF9JTlRfRU5BQkxFICAgICAgICAgIDB4RkZGQ0ZGRkYKKyNkZWZpbmUgUl8wMDdEMDBfRENfSE9UX1BMVUdfREVURUNUMV9DT05UUk9MICAgICAgICAgICAweDAwN0QwMAorI2RlZmluZSAgIFNfMDA3RDAwX0RDX0hPVF9QTFVHX0RFVEVDVDFfRU4oeCkgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAwKQorI2RlZmluZSAgIEdfMDA3RDAwX0RDX0hPVF9QTFVHX0RFVEVDVDFfRU4oeCkgICAgICAgICAgICgoKHgpID4+IDApICYgMHgxKQorI2RlZmluZSAgIENfMDA3RDAwX0RDX0hPVF9QTFVHX0RFVEVDVDFfRU4gICAgICAgICAgICAgIDB4RkZGRkZGRkUKKyNkZWZpbmUgUl8wMDdEMDRfRENfSE9UX1BMVUdfREVURUNUMV9JTlRfU1RBVFVTICAgICAgICAweDAwN0QwNAorI2RlZmluZSAgIFNfMDA3RDA0X0RDX0hPVF9QTFVHX0RFVEVDVDFfSU5UX1NUQVRVUyh4KSAgICgoKHgpICYgMHgxKSA8PCAwKQorI2RlZmluZSAgIEdfMDA3RDA0X0RDX0hPVF9QTFVHX0RFVEVDVDFfSU5UX1NUQVRVUyh4KSAgICgoKHgpID4+IDApICYgMHgxKQorI2RlZmluZSAgIENfMDA3RDA0X0RDX0hPVF9QTFVHX0RFVEVDVDFfSU5UX1NUQVRVUyAgICAgIDB4RkZGRkZGRkUKKyNkZWZpbmUgICBTXzAwN0QwNF9EQ19IT1RfUExVR19ERVRFQ1QxX1NFTlNFKHgpICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMSkKKyNkZWZpbmUgICBHXzAwN0QwNF9EQ19IT1RfUExVR19ERVRFQ1QxX1NFTlNFKHgpICAgICAgICAoKCh4KSA+PiAxKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwN0QwNF9EQ19IT1RfUExVR19ERVRFQ1QxX1NFTlNFICAgICAgICAgICAweEZGRkZGRkZECisjZGVmaW5lIFJfMDA3RDA4X0RDX0hPVF9QTFVHX0RFVEVDVDFfSU5UX0NPTlRST0wgICAgICAgMHgwMDdEMDgKKyNkZWZpbmUgICBTXzAwN0QwOF9EQ19IT1RfUExVR19ERVRFQ1QxX0lOVF9BQ0soeCkgICAgICAoKCh4KSAmIDB4MSkgPDwgMCkKKyNkZWZpbmUgICBDXzAwN0QwOF9EQ19IT1RfUExVR19ERVRFQ1QxX0lOVF9BQ0sgICAgICAgICAweEZGRkZGRkZFCisjZGVmaW5lICAgU18wMDdEMDhfRENfSE9UX1BMVUdfREVURUNUMV9JTlRfUE9MQVJJVFkoeCkgKCgoeCkgJiAweDEpIDw8IDgpCisjZGVmaW5lICAgR18wMDdEMDhfRENfSE9UX1BMVUdfREVURUNUMV9JTlRfUE9MQVJJVFkoeCkgKCgoeCkgPj4gOCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDdEMDhfRENfSE9UX1BMVUdfREVURUNUMV9JTlRfUE9MQVJJVFkgICAgMHhGRkZGRkVGRgorI2RlZmluZSAgIFNfMDA3RDA4X0RDX0hPVF9QTFVHX0RFVEVDVDFfSU5UX0VOKHgpICAgICAgICgoKHgpICYgMHgxKSA8PCAxNikKKyNkZWZpbmUgICBHXzAwN0QwOF9EQ19IT1RfUExVR19ERVRFQ1QxX0lOVF9FTih4KSAgICAgICAoKCh4KSA+PiAxNikgJiAweDEpCisjZGVmaW5lICAgQ18wMDdEMDhfRENfSE9UX1BMVUdfREVURUNUMV9JTlRfRU4gICAgICAgICAgMHhGRkZFRkZGRgorI2RlZmluZSBSXzAwN0QxMF9EQ19IT1RfUExVR19ERVRFQ1QyX0NPTlRST0wgICAgICAgICAgIDB4MDA3RDEwCisjZGVmaW5lICAgU18wMDdEMTBfRENfSE9UX1BMVUdfREVURUNUMl9FTih4KSAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDApCisjZGVmaW5lICAgR18wMDdEMTBfRENfSE9UX1BMVUdfREVURUNUMl9FTih4KSAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDdEMTBfRENfSE9UX1BMVUdfREVURUNUMl9FTiAgICAgICAgICAgICAgMHhGRkZGRkZGRQorI2RlZmluZSBSXzAwN0QxNF9EQ19IT1RfUExVR19ERVRFQ1QyX0lOVF9TVEFUVVMgICAgICAgIDB4MDA3RDE0CisjZGVmaW5lICAgU18wMDdEMTRfRENfSE9UX1BMVUdfREVURUNUMl9JTlRfU1RBVFVTKHgpICAgKCgoeCkgJiAweDEpIDw8IDApCisjZGVmaW5lICAgR18wMDdEMTRfRENfSE9UX1BMVUdfREVURUNUMl9JTlRfU1RBVFVTKHgpICAgKCgoeCkgPj4gMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDdEMTRfRENfSE9UX1BMVUdfREVURUNUMl9JTlRfU1RBVFVTICAgICAgMHhGRkZGRkZGRQorI2RlZmluZSAgIFNfMDA3RDE0X0RDX0hPVF9QTFVHX0RFVEVDVDJfU0VOU0UoeCkgICAgICAgICgoKHgpICYgMHgxKSA8PCAxKQorI2RlZmluZSAgIEdfMDA3RDE0X0RDX0hPVF9QTFVHX0RFVEVDVDJfU0VOU0UoeCkgICAgICAgICgoKHgpID4+IDEpICYgMHgxKQorI2RlZmluZSAgIENfMDA3RDE0X0RDX0hPVF9QTFVHX0RFVEVDVDJfU0VOU0UgICAgICAgICAgIDB4RkZGRkZGRkQKKyNkZWZpbmUgUl8wMDdEMThfRENfSE9UX1BMVUdfREVURUNUMl9JTlRfQ09OVFJPTCAgICAgICAweDAwN0QxOAorI2RlZmluZSAgIFNfMDA3RDE4X0RDX0hPVF9QTFVHX0RFVEVDVDJfSU5UX0FDSyh4KSAgICAgICgoKHgpICYgMHgxKSA8PCAwKQorI2RlZmluZSAgIENfMDA3RDE4X0RDX0hPVF9QTFVHX0RFVEVDVDJfSU5UX0FDSyAgICAgICAgIDB4RkZGRkZGRkUKKyNkZWZpbmUgICBTXzAwN0QxOF9EQ19IT1RfUExVR19ERVRFQ1QyX0lOVF9QT0xBUklUWSh4KSAoKCh4KSAmIDB4MSkgPDwgOCkKKyNkZWZpbmUgICBHXzAwN0QxOF9EQ19IT1RfUExVR19ERVRFQ1QyX0lOVF9QT0xBUklUWSh4KSAoKCh4KSA+PiA4KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwN0QxOF9EQ19IT1RfUExVR19ERVRFQ1QyX0lOVF9QT0xBUklUWSAgICAweEZGRkZGRUZGCisjZGVmaW5lICAgU18wMDdEMThfRENfSE9UX1BMVUdfREVURUNUMl9JTlRfRU4oeCkgICAgICAgKCgoeCkgJiAweDEpIDw8IDE2KQorI2RlZmluZSAgIEdfMDA3RDE4X0RDX0hPVF9QTFVHX0RFVEVDVDJfSU5UX0VOKHgpICAgICAgICgoKHgpID4+IDE2KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwN0QxOF9EQ19IT1RfUExVR19ERVRFQ1QyX0lOVF9FTiAgICAgICAgICAweEZGRkVGRkZGCiAKIC8qIE1DIHJlZ2lzdGVycyAqLwogI2RlZmluZSBSXzAwMDAwMF9NQ19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczY5MC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczY5MC5jCmluZGV4IDI3NTQ3MTcuLjFlMjJmNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2OTAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjkwLmMKQEAgLTEzMSwyNCArMTMxLDI1IEBACiAKIHZvaWQgcnM2OTBfdnJhbV9pbmZvKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewotCXVpbnQzMl90IHRtcDsKIAlmaXhlZDIwXzEyIGE7CiAKIAlyczQwMF9nYXJ0X2FkanVzdF9zaXplKHJkZXYpOwotCS8qIEREUiBmb3IgYWxsIGNhcmQgYWZ0ZXIgUjMwMCAmIElHUCAqLworCiAJcmRldi0+bWMudnJhbV9pc19kZHIgPSB0cnVlOwotCS8qIEZJWE1FOiBpcyB0aGlzIGNvcnJlY3QgZm9yIFJTNjkwL1JTNzQwID8gKi8KLQl0bXAgPSBSUkVHMzIoUkFERU9OX01FTV9DTlRMKTsKLQlpZiAodG1wICYgUjMwMF9NRU1fTlVNX0NIQU5ORUxTX01BU0spIHsKLQkJcmRldi0+bWMudnJhbV93aWR0aCA9IDEyODsKLQl9IGVsc2UgewotCQlyZGV2LT5tYy52cmFtX3dpZHRoID0gNjQ7Ci0JfQorCXJkZXYtPm1jLnZyYW1fd2lkdGggPSAxMjg7CisKIAlyZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSA9IFJSRUczMihSQURFT05fQ09ORklHX01FTVNJWkUpOwogCXJkZXYtPm1jLm1jX3ZyYW1fc2l6ZSA9IHJkZXYtPm1jLnJlYWxfdnJhbV9zaXplOwogCiAJcmRldi0+bWMuYXBlcl9iYXNlID0gZHJtX2dldF9yZXNvdXJjZV9zdGFydChyZGV2LT5kZGV2LCAwKTsKIAlyZGV2LT5tYy5hcGVyX3NpemUgPSBkcm1fZ2V0X3Jlc291cmNlX2xlbihyZGV2LT5kZGV2LCAwKTsKKworCWlmIChyZGV2LT5tYy5tY192cmFtX3NpemUgPiByZGV2LT5tYy5hcGVyX3NpemUpCisJCXJkZXYtPm1jLm1jX3ZyYW1fc2l6ZSA9IHJkZXYtPm1jLmFwZXJfc2l6ZTsKKworCWlmIChyZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSA+IHJkZXYtPm1jLmFwZXJfc2l6ZSkKKwkJcmRldi0+bWMucmVhbF92cmFtX3NpemUgPSByZGV2LT5tYy5hcGVyX3NpemU7CisKIAlyczY5MF9wbV9pbmZvKHJkZXYpOwogCS8qIEZJWE1FOiB3ZSBzaG91bGQgZW5mb3JjZSBkZWZhdWx0IGNsb2NrIGluIGNhc2UgR1BVIGlzIG5vdCBpbgogCSAqIGRlZmF1bHQgc2V0dXAKQEAgLTE2MSw2ICsxNjIsMjEgQEAKIAlyZGV2LT5wbS5jb3JlX2JhbmR3aWR0aC5mdWxsID0gcmZpeGVkX2RpdihyZGV2LT5wbS5zY2xrLCBhKTsKIH0KIAorc3RhdGljIGludCByczY5MF9tY19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCWludCByOworCXUzMiB0bXA7CisKKwkvKiBTZXR1cCBHUFUgbWVtb3J5IHNwYWNlICovCisJdG1wID0gUlJFRzMyX01DKFJfMDAwMTAwX01DQ0ZHX0ZCX0xPQ0FUSU9OKTsKKwlyZGV2LT5tYy52cmFtX2xvY2F0aW9uID0gR18wMDAxMDBfTUNfRkJfU1RBUlQodG1wKSA8PCAxNjsKKwlyZGV2LT5tYy5ndHRfbG9jYXRpb24gPSAweEZGRkZGRkZGVUw7CisJciA9IHJhZGVvbl9tY19zZXR1cChyZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJcmV0dXJuIDA7Cit9CisKIHZvaWQgcnM2OTBfbGluZV9idWZmZXJfYWRqdXN0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAogCQkJICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUxLAogCQkJICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUyKQpAQCAtMjQ0LDggKzI2MCw5IEBACiAKIAliLmZ1bGwgPSByZml4ZWRfY29uc3QobW9kZS0+Y3J0Y19oZGlzcGxheSk7CiAJYy5mdWxsID0gcmZpeGVkX2NvbnN0KDI1Nik7Ci0JYS5mdWxsID0gcmZpeGVkX211bCh3bS0+bnVtX2xpbmVfcGFpciwgYik7Ci0JcmVxdWVzdF9maWZvX2RlcHRoLmZ1bGwgPSByZml4ZWRfZGl2KGEsIGMpOworCWEuZnVsbCA9IHJmaXhlZF9kaXYoYiwgYyk7CisJcmVxdWVzdF9maWZvX2RlcHRoLmZ1bGwgPSByZml4ZWRfbXVsKGEsIHdtLT5udW1fbGluZV9wYWlyKTsKKwlyZXF1ZXN0X2ZpZm9fZGVwdGguZnVsbCA9IHJmaXhlZF9jZWlsKHJlcXVlc3RfZmlmb19kZXB0aCk7CiAJaWYgKGEuZnVsbCA8IHJmaXhlZF9jb25zdCg0KSkgewogCQl3bS0+bGJfcmVxdWVzdF9maWZvX2RlcHRoID0gNDsKIAl9IGVsc2UgewpAQCAtMzc0LDYgKzM5MSw3IEBACiAJYS5mdWxsID0gcmZpeGVkX2NvbnN0KDE2KTsKIAl3bS0+cHJpb3JpdHlfbWFya19tYXguZnVsbCA9IHJmaXhlZF9jb25zdChjcnRjLT5iYXNlLm1vZGUuY3J0Y19oZGlzcGxheSk7CiAJd20tPnByaW9yaXR5X21hcmtfbWF4LmZ1bGwgPSByZml4ZWRfZGl2KHdtLT5wcmlvcml0eV9tYXJrX21heCwgYSk7CisJd20tPnByaW9yaXR5X21hcmtfbWF4LmZ1bGwgPSByZml4ZWRfY2VpbCh3bS0+cHJpb3JpdHlfbWFya19tYXgpOwogCiAJLyogRGV0ZXJtaW5lIGVzdGltYXRlZCB3aWR0aCAqLwogCWVzdGltYXRlZF93aWR0aC5mdWxsID0gdG9sZXJhYmxlX2xhdGVuY3kuZnVsbCAtIHdtLT53b3JzdF9jYXNlX2xhdGVuY3kuZnVsbDsKQEAgLTM4Myw2ICs0MDEsNyBAQAogCX0gZWxzZSB7CiAJCWEuZnVsbCA9IHJmaXhlZF9jb25zdCgxNik7CiAJCXdtLT5wcmlvcml0eV9tYXJrLmZ1bGwgPSByZml4ZWRfZGl2KGVzdGltYXRlZF93aWR0aCwgYSk7CisJCXdtLT5wcmlvcml0eV9tYXJrLmZ1bGwgPSByZml4ZWRfY2VpbCh3bS0+cHJpb3JpdHlfbWFyayk7CiAJCXdtLT5wcmlvcml0eV9tYXJrLmZ1bGwgPSB3bS0+cHJpb3JpdHlfbWFya19tYXguZnVsbCAtIHdtLT5wcmlvcml0eV9tYXJrLmZ1bGw7CiAJfQogfQpAQCAtNjA1LDcgKzYyNCw2IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCS8qIEVuYWJsZSBJUlEgKi8KLQlyZGV2LT5pcnEuc3dfaW50ID0gdHJ1ZTsKIAlyczYwMF9pcnFfc2V0KHJkZXYpOwogCS8qIDFNIHJpbmcgYnVmZmVyICovCiAJciA9IHIxMDBfY3BfaW5pdChyZGV2LCAxMDI0ICogMTAyNCk7CkBAIC02NDAsNiArNjU4LDggQEAKIAlhdG9tX2FzaWNfaW5pdChyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0KTsKIAkvKiBSZXN1bWUgY2xvY2sgYWZ0ZXIgcG9zdGluZyAqLwogCXJ2NTE1X2Nsb2NrX3N0YXJ0dXAocmRldik7CisJLyogSW5pdGlhbGl6ZSBzdXJmYWNlIHJlZ2lzdGVycyAqLworCXJhZGVvbl9zdXJmYWNlX2luaXQocmRldik7CiAJcmV0dXJuIHJzNjkwX3N0YXJ0dXAocmRldik7CiB9CiAKQEAgLTY2Miw3ICs2ODIsNyBAQAogCXJzNDAwX2dhcnRfZmluaShyZGV2KTsKIAlyYWRlb25faXJxX2ttc19maW5pKHJkZXYpOwogCXJhZGVvbl9mZW5jZV9kcml2ZXJfZmluaShyZGV2KTsKLQlyYWRlb25fb2JqZWN0X2ZpbmkocmRldik7CisJcmFkZW9uX2JvX2ZpbmkocmRldik7CiAJcmFkZW9uX2F0b21iaW9zX2ZpbmkocmRldik7CiAJa2ZyZWUocmRldi0+Ymlvcyk7CiAJcmRldi0+YmlvcyA9IE5VTEw7CkBAIC03MDAsMTAgKzcyMCw5IEBACiAJCQlSUkVHMzIoUl8wMDA3QzBfQ1BfU1RBVCkpOwogCX0KIAkvKiBjaGVjayBpZiBjYXJkcyBhcmUgcG9zdGVkIG9yIG5vdCAqLwotCWlmICghcmFkZW9uX2NhcmRfcG9zdGVkKHJkZXYpICYmIHJkZXYtPmJpb3MpIHsKLQkJRFJNX0lORk8oIkdQVSBub3QgcG9zdGVkLiBwb3N0aW5nIG5vdy4uLlxuIik7Ci0JCWF0b21fYXNpY19pbml0KHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQpOwotCX0KKwlpZiAocmFkZW9uX2Jvb3RfdGVzdF9wb3N0X2NhcmQocmRldikgPT0gZmFsc2UpCisJCXJldHVybiAtRUlOVkFMOworCiAJLyogSW5pdGlhbGl6ZSBjbG9ja3MgKi8KIAlyYWRlb25fZ2V0X2Nsb2NrX2luZm8ocmRldi0+ZGRldik7CiAJLyogSW5pdGlhbGl6ZSBwb3dlciBtYW5hZ2VtZW50ICovCkBAIC03MTEsNyArNzMwLDcgQEAKIAkvKiBHZXQgdnJhbSBpbmZvcm1hdGlvbnMgKi8KIAlyczY5MF92cmFtX2luZm8ocmRldik7CiAJLyogSW5pdGlhbGl6ZSBtZW1vcnkgY29udHJvbGxlciAoYWxzbyB0ZXN0IEFHUCkgKi8KLQlyID0gcjQyMF9tY19pbml0KHJkZXYpOworCXIgPSByczY5MF9tY19pbml0KHJkZXYpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAlydjUxNV9kZWJ1Z2ZzKHJkZXYpOwpAQCAtNzIzLDcgKzc0Miw3IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCS8qIE1lbW9yeSBtYW5hZ2VyICovCi0JciA9IHJhZGVvbl9vYmplY3RfaW5pdChyZGV2KTsKKwlyID0gcmFkZW9uX2JvX2luaXQocmRldik7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCXIgPSByczQwMF9nYXJ0X2luaXQocmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NTE1LmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NTE1LmMKaW5kZXggYmE2OGM5Zi4uNTk2MzJhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjUxNS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY1MTUuYwpAQCAtNDc4LDcgKzQ3OCw2IEBACiAJCQlyZXR1cm4gcjsKIAl9CiAJLyogRW5hYmxlIElSUSAqLwotCXJkZXYtPmlycS5zd19pbnQgPSB0cnVlOwogCXJzNjAwX2lycV9zZXQocmRldik7CiAJLyogMU0gcmluZyBidWZmZXIgKi8KIAlyID0gcjEwMF9jcF9pbml0KHJkZXYsIDEwMjQgKiAxMDI0KTsKQEAgLTUxNCw2ICs1MTMsOCBAQAogCWF0b21fYXNpY19pbml0KHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQpOwogCS8qIFJlc3VtZSBjbG9jayBhZnRlciBwb3N0aW5nICovCiAJcnY1MTVfY2xvY2tfc3RhcnR1cChyZGV2KTsKKwkvKiBJbml0aWFsaXplIHN1cmZhY2UgcmVnaXN0ZXJzICovCisJcmFkZW9uX3N1cmZhY2VfaW5pdChyZGV2KTsKIAlyZXR1cm4gcnY1MTVfc3RhcnR1cChyZGV2KTsKIH0KIApAQCAtNTQwLDExICs1NDEsMTEgQEAKIAlyMTAwX3diX2ZpbmkocmRldik7CiAJcjEwMF9pYl9maW5pKHJkZXYpOwogCXJhZGVvbl9nZW1fZmluaShyZGV2KTsKLSAgICBydjM3MF9wY2llX2dhcnRfZmluaShyZGV2KTsKKwlydjM3MF9wY2llX2dhcnRfZmluaShyZGV2KTsKIAlyYWRlb25fYWdwX2ZpbmkocmRldik7CiAJcmFkZW9uX2lycV9rbXNfZmluaShyZGV2KTsKIAlyYWRlb25fZmVuY2VfZHJpdmVyX2ZpbmkocmRldik7Ci0JcmFkZW9uX29iamVjdF9maW5pKHJkZXYpOworCXJhZGVvbl9ib19maW5pKHJkZXYpOwogCXJhZGVvbl9hdG9tYmlvc19maW5pKHJkZXYpOwogCWtmcmVlKHJkZXYtPmJpb3MpOwogCXJkZXYtPmJpb3MgPSBOVUxMOwpAQCAtNTgwLDEwICs1ODEsOCBAQAogCQkJUlJFRzMyKFJfMDAwN0MwX0NQX1NUQVQpKTsKIAl9CiAJLyogY2hlY2sgaWYgY2FyZHMgYXJlIHBvc3RlZCBvciBub3QgKi8KLQlpZiAoIXJhZGVvbl9jYXJkX3Bvc3RlZChyZGV2KSAmJiByZGV2LT5iaW9zKSB7Ci0JCURSTV9JTkZPKCJHUFUgbm90IHBvc3RlZC4gcG9zdGluZyBub3cuLi5cbiIpOwotCQlhdG9tX2FzaWNfaW5pdChyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0KTsKLQl9CisJaWYgKHJhZGVvbl9ib290X3Rlc3RfcG9zdF9jYXJkKHJkZXYpID09IGZhbHNlKQorCQlyZXR1cm4gLUVJTlZBTDsKIAkvKiBJbml0aWFsaXplIGNsb2NrcyAqLwogCXJhZGVvbl9nZXRfY2xvY2tfaW5mbyhyZGV2LT5kZGV2KTsKIAkvKiBJbml0aWFsaXplIHBvd2VyIG1hbmFnZW1lbnQgKi8KQEAgLTYwMyw3ICs2MDIsNyBAQAogCWlmIChyKQogCQlyZXR1cm4gcjsKIAkvKiBNZW1vcnkgbWFuYWdlciAqLwotCXIgPSByYWRlb25fb2JqZWN0X2luaXQocmRldik7CisJciA9IHJhZGVvbl9ib19pbml0KHJkZXYpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAlyID0gcnYzNzBfcGNpZV9nYXJ0X2luaXQocmRldik7CkBAIC04OTIsOCArODkxLDkgQEAKIAogCWIuZnVsbCA9IHJmaXhlZF9jb25zdChtb2RlLT5jcnRjX2hkaXNwbGF5KTsKIAljLmZ1bGwgPSByZml4ZWRfY29uc3QoMjU2KTsKLQlhLmZ1bGwgPSByZml4ZWRfbXVsKHdtLT5udW1fbGluZV9wYWlyLCBiKTsKLQlyZXF1ZXN0X2ZpZm9fZGVwdGguZnVsbCA9IHJmaXhlZF9kaXYoYSwgYyk7CisJYS5mdWxsID0gcmZpeGVkX2RpdihiLCBjKTsKKwlyZXF1ZXN0X2ZpZm9fZGVwdGguZnVsbCA9IHJmaXhlZF9tdWwoYSwgd20tPm51bV9saW5lX3BhaXIpOworCXJlcXVlc3RfZmlmb19kZXB0aC5mdWxsID0gcmZpeGVkX2NlaWwocmVxdWVzdF9maWZvX2RlcHRoKTsKIAlpZiAoYS5mdWxsIDwgcmZpeGVkX2NvbnN0KDQpKSB7CiAJCXdtLT5sYl9yZXF1ZXN0X2ZpZm9fZGVwdGggPSA0OwogCX0gZWxzZSB7CkBAIC05OTUsMTUgKzk5NSwxNyBAQAogCWEuZnVsbCA9IHJmaXhlZF9jb25zdCgxNik7CiAJd20tPnByaW9yaXR5X21hcmtfbWF4LmZ1bGwgPSByZml4ZWRfY29uc3QoY3J0Yy0+YmFzZS5tb2RlLmNydGNfaGRpc3BsYXkpOwogCXdtLT5wcmlvcml0eV9tYXJrX21heC5mdWxsID0gcmZpeGVkX2Rpdih3bS0+cHJpb3JpdHlfbWFya19tYXgsIGEpOworCXdtLT5wcmlvcml0eV9tYXJrX21heC5mdWxsID0gcmZpeGVkX2NlaWwod20tPnByaW9yaXR5X21hcmtfbWF4KTsKIAogCS8qIERldGVybWluZSBlc3RpbWF0ZWQgd2lkdGggKi8KIAllc3RpbWF0ZWRfd2lkdGguZnVsbCA9IHRvbGVyYWJsZV9sYXRlbmN5LmZ1bGwgLSB3bS0+d29yc3RfY2FzZV9sYXRlbmN5LmZ1bGw7CiAJZXN0aW1hdGVkX3dpZHRoLmZ1bGwgPSByZml4ZWRfZGl2KGVzdGltYXRlZF93aWR0aCwgY29uc3VtcHRpb25fdGltZSk7CiAJaWYgKHJmaXhlZF90cnVuYyhlc3RpbWF0ZWRfd2lkdGgpID4gY3J0Yy0+YmFzZS5tb2RlLmNydGNfaGRpc3BsYXkpIHsKLQkJd20tPnByaW9yaXR5X21hcmsuZnVsbCA9IHJmaXhlZF9jb25zdCgxMCk7CisJCXdtLT5wcmlvcml0eV9tYXJrLmZ1bGwgPSB3bS0+cHJpb3JpdHlfbWFya19tYXguZnVsbDsKIAl9IGVsc2UgewogCQlhLmZ1bGwgPSByZml4ZWRfY29uc3QoMTYpOwogCQl3bS0+cHJpb3JpdHlfbWFyay5mdWxsID0gcmZpeGVkX2Rpdihlc3RpbWF0ZWRfd2lkdGgsIGEpOworCQl3bS0+cHJpb3JpdHlfbWFyay5mdWxsID0gcmZpeGVkX2NlaWwod20tPnByaW9yaXR5X21hcmspOwogCQl3bS0+cHJpb3JpdHlfbWFyay5mdWxsID0gd20tPnByaW9yaXR5X21hcmtfbWF4LmZ1bGwgLSB3bS0+cHJpb3JpdHlfbWFyay5mdWxsOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYwppbmRleCA1ZTA2ZWU3Li5mYmIwMzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MC5jCkBAIC05Miw3ICs5Miw3IEBACiB2b2lkIHJ2NzcwX3BjaWVfZ2FydF9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXUzMiB0bXA7Ci0JaW50IGk7CisJaW50IGksIHI7CiAKIAkvKiBEaXNhYmxlIGFsbCB0YWJsZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQpAQCAtMTEzLDggKzExMywxMiBAQAogCVdSRUczMihNQ19WTV9NQl9MMV9UTEIyX0NOVEwsIHRtcCk7CiAJV1JFRzMyKE1DX1ZNX01CX0wxX1RMQjNfQ05UTCwgdG1wKTsKIAlpZiAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopIHsKLQkJcmFkZW9uX29iamVjdF9rdW5tYXAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQlyYWRlb25fb2JqZWN0X3VucGluKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKKwkJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqLCBmYWxzZSk7CisJCWlmIChsaWtlbHkociA9PSAwKSkgeworCQkJcmFkZW9uX2JvX2t1bm1hcChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7CisJCQlyYWRlb25fYm9fdW5waW4ocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOworCQkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7CisJCX0KIAl9CiB9CiAKQEAgLTg3MCw2ICs4NzQsMTQgQEAKIHsKIAlpbnQgcjsKIAorCWlmICghcmRldi0+bWVfZncgfHwgIXJkZXYtPnBmcF9mdyB8fCAhcmRldi0+cmxjX2Z3KSB7CisJCXIgPSByNjAwX2luaXRfbWljcm9jb2RlKHJkZXYpOworCQlpZiAocikgeworCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSFcbiIpOworCQkJcmV0dXJuIHI7CisJCX0KKwl9CisKIAlydjc3MF9tY19wcm9ncmFtKHJkZXYpOwogCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19BR1ApIHsKIAkJcnY3NzBfYWdwX2VuYWJsZShyZGV2KTsKQEAgLTg4MCwxMyArODkyLDI2IEBACiAJfQogCXJ2NzcwX2dwdV9pbml0KHJkZXYpOwogCi0JciA9IHJhZGVvbl9vYmplY3RfcGluKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqLCBSQURFT05fR0VNX0RPTUFJTl9WUkFNLAotCQkJICAgICAgJnJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfZ3B1X2FkZHIpOworCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaiwgZmFsc2UpOworCWlmICh1bmxpa2VseShyICE9IDApKQorCQlyZXR1cm4gcjsKKwlyID0gcmFkZW9uX2JvX3BpbihyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaiwgUkFERU9OX0dFTV9ET01BSU5fVlJBTSwKKwkJCSZyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX2dwdV9hZGRyKTsKKwlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKIAlpZiAocikgewogCQlEUk1fRVJST1IoImZhaWxlZCB0byBwaW4gYmxpdCBvYmplY3QgJWRcbiIsIHIpOwogCQlyZXR1cm4gcjsKIAl9CiAKKwkvKiBFbmFibGUgSVJRICovCisJciA9IHI2MDBfaXJxX2luaXQocmRldik7CisJaWYgKHIpIHsKKwkJRFJNX0VSUk9SKCJyYWRlb246IElIIGluaXQgZmFpbGVkICglZCkuXG4iLCByKTsKKwkJcmFkZW9uX2lycV9rbXNfZmluaShyZGV2KTsKKwkJcmV0dXJuIHI7CisJfQorCXI2MDBfaXJxX3NldChyZGV2KTsKKwogCXIgPSByYWRlb25fcmluZ19pbml0KHJkZXYsIHJkZXYtPmNwLnJpbmdfc2l6ZSk7CiAJaWYgKHIpCiAJCXJldHVybiByOwpAQCAtOTM0LDEzICs5NTksMTkgQEAKIAogaW50IHJ2NzcwX3N1c3BlbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CisJaW50IHI7CisKIAkvKiBGSVhNRTogd2Ugc2hvdWxkIHdhaXQgZm9yIHJpbmcgdG8gYmUgZW1wdHkgKi8KIAlyNzAwX2NwX3N0b3AocmRldik7CiAJcmRldi0+Y3AucmVhZHkgPSBmYWxzZTsKIAlyNjAwX3diX2Rpc2FibGUocmRldik7CiAJcnY3NzBfcGNpZV9nYXJ0X2Rpc2FibGUocmRldik7CiAJLyogdW5waW4gc2hhZGVycyBibyAqLwotICAgICAgICByYWRlb25fb2JqZWN0X3VucGluKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKKwlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmosIGZhbHNlKTsKKwlpZiAobGlrZWx5KHIgPT0gMCkpIHsKKwkJcmFkZW9uX2JvX3VucGluKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKKwkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaik7CisJfQogCXJldHVybiAwOwogfQogCkBAIC05NzUsNyArMTAwNiwxMSBAQAogCWlmIChyKQogCQlyZXR1cm4gcjsKIAkvKiBQb3N0IGNhcmQgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKCFyNjAwX2NhcmRfcG9zdGVkKHJkZXYpICYmIHJkZXYtPmJpb3MpIHsKKwlpZiAoIXI2MDBfY2FyZF9wb3N0ZWQocmRldikpIHsKKwkJaWYgKCFyZGV2LT5iaW9zKSB7CisJCQlkZXZfZXJyKHJkZXYtPmRldiwgIkNhcmQgbm90IHBvc3RlZCBhbmQgbm8gQklPUyAtIGlnbm9yaW5nXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJCURSTV9JTkZPKCJHUFUgbm90IHBvc3RlZC4gcG9zdGluZyBub3cuLi5cbiIpOwogCQlhdG9tX2FzaWNfaW5pdChyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0KTsKIAl9CkBAIC05OTgsMzEgKzEwMzMsMzEgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAJLyogTWVtb3J5IG1hbmFnZXIgKi8KLQlyID0gcmFkZW9uX29iamVjdF9pbml0KHJkZXYpOworCXIgPSByYWRlb25fYm9faW5pdChyZGV2KTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CisKKwlyID0gcmFkZW9uX2lycV9rbXNfaW5pdChyZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKIAlyZGV2LT5jcC5yaW5nX29iaiA9IE5VTEw7CiAJcjYwMF9yaW5nX2luaXQocmRldiwgMTAyNCAqIDEwMjQpOwogCi0JaWYgKCFyZGV2LT5tZV9mdyB8fCAhcmRldi0+cGZwX2Z3KSB7Ci0JCXIgPSByNjAwX2NwX2luaXRfbWljcm9jb2RlKHJkZXYpOwotCQlpZiAocikgewotCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSFcbiIpOwotCQkJcmV0dXJuIHI7Ci0JCX0KLQl9CisJcmRldi0+aWgucmluZ19vYmogPSBOVUxMOworCXI2MDBfaWhfcmluZ19pbml0KHJkZXYsIDY0ICogMTAyNCk7CiAKIAlyID0gcjYwMF9wY2llX2dhcnRfaW5pdChyZGV2KTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQlyZGV2LT5hY2NlbF93b3JraW5nID0gdHJ1ZTsKIAlyID0gcjYwMF9ibGl0X2luaXQocmRldik7CiAJaWYgKHIpIHsKLQkJRFJNX0VSUk9SKCJyYWRlb246IGZhaWxsZWQgYmxpdHRlciAoJWQpLlxuIiwgcik7Ci0JCXJkZXYtPmFjY2VsX3dvcmtpbmcgPSBmYWxzZTsKKwkJRFJNX0VSUk9SKCJyYWRlb246IGZhaWxlZCBibGl0dGVyICglZCkuXG4iLCByKTsKKwkJcmV0dXJuIHI7CiAJfQogCisJcmRldi0+YWNjZWxfd29ya2luZyA9IHRydWU7CiAJciA9IHJ2NzcwX3N0YXJ0dXAocmRldik7CiAJaWYgKHIpIHsKIAkJcnY3NzBfc3VzcGVuZChyZGV2KTsKQEAgLTEwMzQsMTIgKzEwNjksMTIgQEAKIAlpZiAocmRldi0+YWNjZWxfd29ya2luZykgewogCQlyID0gcmFkZW9uX2liX3Bvb2xfaW5pdChyZGV2KTsKIAkJaWYgKHIpIHsKLQkJCURSTV9FUlJPUigicmFkZW9uOiBmYWlsbGVkIGluaXRpYWxpemluZyBJQiBwb29sICglZCkuXG4iLCByKTsKKwkJCURSTV9FUlJPUigicmFkZW9uOiBmYWlsZWQgaW5pdGlhbGl6aW5nIElCIHBvb2wgKCVkKS5cbiIsIHIpOwogCQkJcmRldi0+YWNjZWxfd29ya2luZyA9IGZhbHNlOwogCQl9CiAJCXIgPSByNjAwX2liX3Rlc3QocmRldik7CiAJCWlmIChyKSB7Ci0JCQlEUk1fRVJST1IoInJhZGVvbjogZmFpbGxlZCB0ZXN0aW5nIElCICglZCkuXG4iLCByKTsKKwkJCURSTV9FUlJPUigicmFkZW9uOiBmYWlsZWQgdGVzdGluZyBJQiAoJWQpLlxuIiwgcik7CiAJCQlyZGV2LT5hY2NlbF93b3JraW5nID0gZmFsc2U7CiAJCX0KIAl9CkBAIC0xMDUxLDYgKzEwODYsOCBAQAogCXJ2NzcwX3N1c3BlbmQocmRldik7CiAKIAlyNjAwX2JsaXRfZmluaShyZGV2KTsKKwlyNjAwX2lycV9maW5pKHJkZXYpOworCXJhZGVvbl9pcnFfa21zX2ZpbmkocmRldik7CiAJcmFkZW9uX3JpbmdfZmluaShyZGV2KTsKIAlyNjAwX3diX2ZpbmkocmRldik7CiAJcnY3NzBfcGNpZV9nYXJ0X2ZpbmkocmRldik7CkBAIC0xMDU5LDcgKzEwOTYsNyBAQAogCXJhZGVvbl9jbG9ja3NfZmluaShyZGV2KTsKIAlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKQogCQlyYWRlb25fYWdwX2ZpbmkocmRldik7Ci0JcmFkZW9uX29iamVjdF9maW5pKHJkZXYpOworCXJhZGVvbl9ib19maW5pKHJkZXYpOwogCXJhZGVvbl9hdG9tYmlvc19maW5pKHJkZXYpOwogCWtmcmVlKHJkZXYtPmJpb3MpOwogCXJkZXYtPmJpb3MgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3R0bS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS90dG0vTWFrZWZpbGUKaW5kZXggYjBhOWRlNy4uMWUxMzhmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3R0bS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL01ha2VmaWxlCkBAIC0zLDYgKzMsNyBAQAogCiBjY2ZsYWdzLXkgOj0gLUlpbmNsdWRlL2RybQogdHRtLXkgOj0gdHRtX2FncF9iYWNrZW5kLm8gdHRtX21lbW9yeS5vIHR0bV90dC5vIHR0bV9iby5vIFwKLQl0dG1fYm9fdXRpbC5vIHR0bV9ib192bS5vIHR0bV9tb2R1bGUubyB0dG1fZ2xvYmFsLm8KKwl0dG1fYm9fdXRpbC5vIHR0bV9ib192bS5vIHR0bV9tb2R1bGUubyB0dG1fZ2xvYmFsLm8gXAorCXR0bV9vYmplY3QubyB0dG1fbG9jay5vIHR0bV9leGVjYnVmX3V0aWwubwogCiBvYmotJChDT05GSUdfRFJNX1RUTSkgKz0gdHRtLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvLmMgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9iby5jCmluZGV4IDg3YzA2MjUuLjFmYmIyZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm8uYwpAQCAtMjcsNiArMjcsMTQgQEAKIC8qCiAgKiBBdXRob3JzOiBUaG9tYXMgSGVsbHN0cm9tIDx0aGVsbHN0cm9tLWF0LXZtd2FyZS1kb3QtY29tPgogICovCisvKiBOb3RlczoKKyAqCisgKiBXZSBzdG9yZSBibyBwb2ludGVyIGluIGRybV9tbV9ub2RlIHN0cnVjdCBzbyB3ZSBrbm93IHdoaWNoIGJvIG93biBhCisgKiBzcGVjaWZpYyBub2RlLiBUaGVyZSBpcyBubyBwcm90ZWN0aW9uIG9uIHRoZSBwb2ludGVyLCB0aHVzIHRvIG1ha2UKKyAqIHN1cmUgdGhpbmdzIGRvbid0IGdvIGJlcnNlcmsgeW91IGhhdmUgdG8gYWNjZXNzIHRoaXMgcG9pbnRlciB3aGlsZQorICogaG9sZGluZyB0aGUgZ2xvYmFsIGxydSBsb2NrIGFuZCBtYWtlIHN1cmUgYW55dGltZSB5b3UgZnJlZSBhIG5vZGUgeW91CisgKiByZXNldCB0aGUgcG9pbnRlciB0byBOVUxMLgorICovCiAKICNpbmNsdWRlICJ0dG0vdHRtX21vZHVsZS5oIgogI2luY2x1ZGUgInR0bS90dG1fYm9fZHJpdmVyLmgiCkBAIC01MSw2ICs1OSw2MCBAQAogCS5tb2RlID0gU19JUlVHTwogfTsKIAorc3RhdGljIGlubGluZSBpbnQgdHRtX21lbV90eXBlX2Zyb21fZmxhZ3ModWludDMyX3QgZmxhZ3MsIHVpbnQzMl90ICptZW1fdHlwZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPD0gVFRNX1BMX1BSSVY1OyBpKyspCisJCWlmIChmbGFncyAmICgxIDw8IGkpKSB7CisJCQkqbWVtX3R5cGUgPSBpOworCQkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgdHRtX21lbV90eXBlX21hbmFnZXJfZGVidWcoc3RydWN0IHR0bV9ib19nbG9iYWwgKmdsb2IsCisJCQkJCXN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuKQoreworCXByaW50ayhLRVJOX0VSUiBUVE1fUEZYICIgICAgaGFzX3R5cGU6ICVkXG4iLCBtYW4tPmhhc190eXBlKTsKKwlwcmludGsoS0VSTl9FUlIgVFRNX1BGWCAiICAgIHVzZV90eXBlOiAlZFxuIiwgbWFuLT51c2VfdHlwZSk7CisJcHJpbnRrKEtFUk5fRVJSIFRUTV9QRlggIiAgICBmbGFnczogMHglMDhYXG4iLCBtYW4tPmZsYWdzKTsKKwlwcmludGsoS0VSTl9FUlIgVFRNX1BGWCAiICAgIGdwdV9vZmZzZXQ6IDB4JTA4bFhcbiIsIG1hbi0+Z3B1X29mZnNldCk7CisJcHJpbnRrKEtFUk5fRVJSIFRUTV9QRlggIiAgICBpb19vZmZzZXQ6IDB4JTA4bFhcbiIsIG1hbi0+aW9fb2Zmc2V0KTsKKwlwcmludGsoS0VSTl9FUlIgVFRNX1BGWCAiICAgIGlvX3NpemU6ICVsZFxuIiwgbWFuLT5pb19zaXplKTsKKwlwcmludGsoS0VSTl9FUlIgVFRNX1BGWCAiICAgIHNpemU6ICVsZFxuIiwgKHVuc2lnbmVkIGxvbmcpbWFuLT5zaXplKTsKKwlwcmludGsoS0VSTl9FUlIgVFRNX1BGWCAiICAgIGF2YWlsYWJsZV9jYWNoaW5nOiAweCUwOFhcbiIsCisJCW1hbi0+YXZhaWxhYmxlX2NhY2hpbmcpOworCXByaW50ayhLRVJOX0VSUiBUVE1fUEZYICIgICAgZGVmYXVsdF9jYWNoaW5nOiAweCUwOFhcbiIsCisJCW1hbi0+ZGVmYXVsdF9jYWNoaW5nKTsKKwlzcGluX2xvY2soJmdsb2ItPmxydV9sb2NrKTsKKwlkcm1fbW1fZGVidWdfdGFibGUoJm1hbi0+bWFuYWdlciwgVFRNX1BGWCk7CisJc3Bpbl91bmxvY2soJmdsb2ItPmxydV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgdHRtX2JvX21lbV9zcGFjZV9kZWJ1ZyhzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAorCQkJCQlzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqcGxhY2VtZW50KQoreworCXN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2ID0gYm8tPmJkZXY7CisJc3RydWN0IHR0bV9ib19nbG9iYWwgKmdsb2IgPSBiby0+Z2xvYjsKKwlzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbjsKKwlpbnQgaSwgcmV0LCBtZW1fdHlwZTsKKworCXByaW50ayhLRVJOX0VSUiBUVE1fUEZYICJObyBzcGFjZSBmb3IgJXAgKCVsZCBwYWdlcywgJWxkSywgJWxkTSlcbiIsCisJCWJvLCBiby0+bWVtLm51bV9wYWdlcywgYm8tPm1lbS5zaXplID4+IDEwLAorCQliby0+bWVtLnNpemUgPj4gMjApOworCWZvciAoaSA9IDA7IGkgPCBwbGFjZW1lbnQtPm51bV9wbGFjZW1lbnQ7IGkrKykgeworCQlyZXQgPSB0dG1fbWVtX3R5cGVfZnJvbV9mbGFncyhwbGFjZW1lbnQtPnBsYWNlbWVudFtpXSwKKwkJCQkJCSZtZW1fdHlwZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm47CisJCW1hbiA9ICZiZGV2LT5tYW5bbWVtX3R5cGVdOworCQlwcmludGsoS0VSTl9FUlIgVFRNX1BGWCAiICBwbGFjZW1lbnRbJWRdPTB4JTA4WCAoJWQpXG4iLAorCQkJaSwgcGxhY2VtZW50LT5wbGFjZW1lbnRbaV0sIG1lbV90eXBlKTsKKwkJdHRtX21lbV90eXBlX21hbmFnZXJfZGVidWcoZ2xvYiwgbWFuKTsKKwl9Cit9CisKIHN0YXRpYyBzc2l6ZV90IHR0bV9ib19nbG9iYWxfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKIAkJCQkgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCiAJCQkJICBjaGFyICpidWZmZXIpCkBAIC0xMTcsMTIgKzE3OSwxMyBAQAogCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYm8tPmV2ZW50X3F1ZXVlLAogCQkJCQkgICAgICAgYXRvbWljX3JlYWQoJmJvLT5yZXNlcnZlZCkgPT0gMCk7CiAJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCQlyZXR1cm4gLUVSRVNUQVJUOworCQkJcmV0dXJuIHJldDsKIAl9IGVsc2UgewogCQl3YWl0X2V2ZW50KGJvLT5ldmVudF9xdWV1ZSwgYXRvbWljX3JlYWQoJmJvLT5yZXNlcnZlZCkgPT0gMCk7CiAJfQogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTCh0dG1fYm9fd2FpdF91bnJlc2VydmVkKTsKIAogc3RhdGljIHZvaWQgdHRtX2JvX2FkZF90b19scnUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKIHsKQEAgLTI0Nyw3ICszMTAsNiBAQAogLyoKICAqIENhbGwgYm8tPm11dGV4IGxvY2tlZC4KICAqLwotCiBzdGF0aWMgaW50IHR0bV9ib19hZGRfdHRtKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sIGJvb2wgemVyb19hbGxvYykKIHsKIAlzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiA9IGJvLT5iZGV2OwpAQCAtMjc1LDkgKzMzNywxMCBAQAogCQliby0+dHRtID0gdHRtX3R0X2NyZWF0ZShiZGV2LCBiby0+bnVtX3BhZ2VzIDw8IFBBR0VfU0hJRlQsCiAJCQkJCXBhZ2VfZmxhZ3MgfCBUVE1fUEFHRV9GTEFHX1VTRVIsCiAJCQkJCWdsb2ItPmR1bW15X3JlYWRfcGFnZSk7Ci0JCWlmICh1bmxpa2VseShiby0+dHRtID09IE5VTEwpKQorCQlpZiAodW5saWtlbHkoYm8tPnR0bSA9PSBOVUxMKSkgewogCQkJcmV0ID0gLUVOT01FTTsKLQkJYnJlYWs7CisJCQlicmVhazsKKwkJfQogCiAJCXJldCA9IHR0bV90dF9zZXRfdXNlcihiby0+dHRtLCBjdXJyZW50LAogCQkJCSAgICAgIGJvLT5idWZmZXJfc3RhcnQsIGJvLT5udW1fcGFnZXMpOwpAQCAtMzI4LDE0ICszOTEsOCBAQAogCQl9CiAKIAkJaWYgKGJvLT5tZW0ubWVtX3R5cGUgPT0gVFRNX1BMX1NZU1RFTSkgewotCi0JCQlzdHJ1Y3QgdHRtX21lbV9yZWcgKm9sZF9tZW0gPSAmYm8tPm1lbTsKLQkJCXVpbnQzMl90IHNhdmVfZmxhZ3MgPSBvbGRfbWVtLT5wbGFjZW1lbnQ7Ci0KLQkJCSpvbGRfbWVtID0gKm1lbTsKKwkJCWJvLT5tZW0gPSAqbWVtOwogCQkJbWVtLT5tbV9ub2RlID0gTlVMTDsKLQkJCXR0bV9mbGFnX21hc2tlZCgmc2F2ZV9mbGFncywgbWVtLT5wbGFjZW1lbnQsCi0JCQkJCVRUTV9QTF9NQVNLX01FTVRZUEUpOwogCQkJZ290byBtb3ZlZDsKIAkJfQogCkBAIC00MTgsNiArNDc1LDcgQEAKIAkJCWtyZWZfcHV0KCZiby0+bGlzdF9rcmVmLCB0dG1fYm9fcmVmX2J1Zyk7CiAJCX0KIAkJaWYgKGJvLT5tZW0ubW1fbm9kZSkgeworCQkJYm8tPm1lbS5tbV9ub2RlLT5wcml2YXRlID0gTlVMTDsKIAkJCWRybV9tbV9wdXRfYmxvY2soYm8tPm1lbS5tbV9ub2RlKTsKIAkJCWJvLT5tZW0ubW1fbm9kZSA9IE5VTEw7CiAJCX0KQEAgLTU1NCwyNCArNjEyLDIxIEBACiB9CiBFWFBPUlRfU1lNQk9MKHR0bV9ib191bnJlZik7CiAKLXN0YXRpYyBpbnQgdHRtX2JvX2V2aWN0KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sIHVuc2lnbmVkIG1lbV90eXBlLAotCQkJYm9vbCBpbnRlcnJ1cHRpYmxlLCBib29sIG5vX3dhaXQpCitzdGF0aWMgaW50IHR0bV9ib19ldmljdChzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLCBib29sIGludGVycnVwdGlibGUsCisJCQlib29sIG5vX3dhaXQpCiB7Ci0JaW50IHJldCA9IDA7CiAJc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYgPSBiby0+YmRldjsKIAlzdHJ1Y3QgdHRtX2JvX2dsb2JhbCAqZ2xvYiA9IGJvLT5nbG9iOwogCXN0cnVjdCB0dG1fbWVtX3JlZyBldmljdF9tZW07Ci0JdWludDMyX3QgcHJvcG9zZWRfcGxhY2VtZW50OwotCi0JaWYgKGJvLT5tZW0ubWVtX3R5cGUgIT0gbWVtX3R5cGUpCi0JCWdvdG8gb3V0OworCXN0cnVjdCB0dG1fcGxhY2VtZW50IHBsYWNlbWVudDsKKwlpbnQgcmV0ID0gMDsKIAogCXNwaW5fbG9jaygmYm8tPmxvY2spOwogCXJldCA9IHR0bV9ib193YWl0KGJvLCBmYWxzZSwgaW50ZXJydXB0aWJsZSwgbm9fd2FpdCk7CiAJc3Bpbl91bmxvY2soJmJvLT5sb2NrKTsKIAogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKLQkJaWYgKHJldCAhPSAtRVJFU1RBUlQpIHsKKwkJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpIHsKIAkJCXByaW50ayhLRVJOX0VSUiBUVE1fUEZYCiAJCQkgICAgICAgIkZhaWxlZCB0byBleHBpcmUgc3luYyBvYmplY3QgYmVmb3JlICIKIAkJCSAgICAgICAiYnVmZmVyIGV2aWN0aW9uLlxuIik7CkBAIC01ODQsMTE2ICs2MzksMTM5IEBACiAJZXZpY3RfbWVtID0gYm8tPm1lbTsKIAlldmljdF9tZW0ubW1fbm9kZSA9IE5VTEw7CiAKLQlwcm9wb3NlZF9wbGFjZW1lbnQgPSBiZGV2LT5kcml2ZXItPmV2aWN0X2ZsYWdzKGJvKTsKLQotCXJldCA9IHR0bV9ib19tZW1fc3BhY2UoYm8sIHByb3Bvc2VkX3BsYWNlbWVudCwKLQkJCSAgICAgICAmZXZpY3RfbWVtLCBpbnRlcnJ1cHRpYmxlLCBub193YWl0KTsKLQlpZiAodW5saWtlbHkocmV0ICE9IDAgJiYgcmV0ICE9IC1FUkVTVEFSVCkpCi0JCXJldCA9IHR0bV9ib19tZW1fc3BhY2UoYm8sIFRUTV9QTF9GTEFHX1NZU1RFTSwKLQkJCQkgICAgICAgJmV2aWN0X21lbSwgaW50ZXJydXB0aWJsZSwgbm9fd2FpdCk7Ci0KKwlwbGFjZW1lbnQuZnBmbiA9IDA7CisJcGxhY2VtZW50LmxwZm4gPSAwOworCXBsYWNlbWVudC5udW1fcGxhY2VtZW50ID0gMDsKKwlwbGFjZW1lbnQubnVtX2J1c3lfcGxhY2VtZW50ID0gMDsKKwliZGV2LT5kcml2ZXItPmV2aWN0X2ZsYWdzKGJvLCAmcGxhY2VtZW50KTsKKwlyZXQgPSB0dG1fYm9fbWVtX3NwYWNlKGJvLCAmcGxhY2VtZW50LCAmZXZpY3RfbWVtLCBpbnRlcnJ1cHRpYmxlLAorCQkJCW5vX3dhaXQpOwogCWlmIChyZXQpIHsKLQkJaWYgKHJldCAhPSAtRVJFU1RBUlQpCisJCWlmIChyZXQgIT0gLUVSRVNUQVJUU1lTKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgVFRNX1BGWAogCQkJICAgICAgICJGYWlsZWQgdG8gZmluZCBtZW1vcnkgc3BhY2UgZm9yICIKIAkJCSAgICAgICAiYnVmZmVyIDB4JXAgZXZpY3Rpb24uXG4iLCBibyk7CisJCQl0dG1fYm9fbWVtX3NwYWNlX2RlYnVnKGJvLCAmcGxhY2VtZW50KTsKKwkJfQogCQlnb3RvIG91dDsKIAl9CiAKIAlyZXQgPSB0dG1fYm9faGFuZGxlX21vdmVfbWVtKGJvLCAmZXZpY3RfbWVtLCB0cnVlLCBpbnRlcnJ1cHRpYmxlLAogCQkJCSAgICAgbm9fd2FpdCk7CiAJaWYgKHJldCkgewotCQlpZiAocmV0ICE9IC1FUkVTVEFSVCkKKwkJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpCiAJCQlwcmludGsoS0VSTl9FUlIgVFRNX1BGWCAiQnVmZmVyIGV2aWN0aW9uIGZhaWxlZFxuIik7CisJCXNwaW5fbG9jaygmZ2xvYi0+bHJ1X2xvY2spOworCQlpZiAoZXZpY3RfbWVtLm1tX25vZGUpIHsKKwkJCWV2aWN0X21lbS5tbV9ub2RlLT5wcml2YXRlID0gTlVMTDsKKwkJCWRybV9tbV9wdXRfYmxvY2soZXZpY3RfbWVtLm1tX25vZGUpOworCQkJZXZpY3RfbWVtLm1tX25vZGUgPSBOVUxMOworCQl9CisJCXNwaW5fdW5sb2NrKCZnbG9iLT5scnVfbG9jayk7CiAJCWdvdG8gb3V0OwogCX0KLQotCXNwaW5fbG9jaygmZ2xvYi0+bHJ1X2xvY2spOwotCWlmIChldmljdF9tZW0ubW1fbm9kZSkgewotCQlkcm1fbW1fcHV0X2Jsb2NrKGV2aWN0X21lbS5tbV9ub2RlKTsKLQkJZXZpY3RfbWVtLm1tX25vZGUgPSBOVUxMOwotCX0KLQlzcGluX3VubG9jaygmZ2xvYi0+bHJ1X2xvY2spOwogCWJvLT5ldmljdGVkID0gdHJ1ZTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IHR0bV9tZW1fZXZpY3RfZmlyc3Qoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsCisJCQkJdWludDMyX3QgbWVtX3R5cGUsCisJCQkJYm9vbCBpbnRlcnJ1cHRpYmxlLCBib29sIG5vX3dhaXQpCit7CisJc3RydWN0IHR0bV9ib19nbG9iYWwgKmdsb2IgPSBiZGV2LT5nbG9iOworCXN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuID0gJmJkZXYtPm1hblttZW1fdHlwZV07CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibzsKKwlpbnQgcmV0LCBwdXRfY291bnQgPSAwOworCisJc3Bpbl9sb2NrKCZnbG9iLT5scnVfbG9jayk7CisJYm8gPSBsaXN0X2ZpcnN0X2VudHJ5KCZtYW4tPmxydSwgc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0LCBscnUpOworCWtyZWZfZ2V0KCZiby0+bGlzdF9rcmVmKTsKKwlyZXQgPSB0dG1fYm9fcmVzZXJ2ZV9sb2NrZWQoYm8sIGludGVycnVwdGlibGUsIG5vX3dhaXQsIGZhbHNlLCAwKTsKKwlpZiAobGlrZWx5KHJldCA9PSAwKSkKKwkJcHV0X2NvdW50ID0gdHRtX2JvX2RlbF9mcm9tX2xydShibyk7CisJc3Bpbl91bmxvY2soJmdsb2ItPmxydV9sb2NrKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCXdoaWxlIChwdXRfY291bnQtLSkKKwkJa3JlZl9wdXQoJmJvLT5saXN0X2tyZWYsIHR0bV9ib19yZWZfYnVnKTsKKwlyZXQgPSB0dG1fYm9fZXZpY3QoYm8sIGludGVycnVwdGlibGUsIG5vX3dhaXQpOworCXR0bV9ib191bnJlc2VydmUoYm8pOworCWtyZWZfcHV0KCZiby0+bGlzdF9rcmVmLCB0dG1fYm9fcmVsZWFzZV9saXN0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHR0bV9ib19tYW5fZ2V0X25vZGUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKKwkJCQlzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbiwKKwkJCQlzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqcGxhY2VtZW50LAorCQkJCXN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtLAorCQkJCXN0cnVjdCBkcm1fbW1fbm9kZSAqKm5vZGUpCit7CisJc3RydWN0IHR0bV9ib19nbG9iYWwgKmdsb2IgPSBiby0+Z2xvYjsKKwl1bnNpZ25lZCBsb25nIGxwZm47CisJaW50IHJldDsKKworCWxwZm4gPSBwbGFjZW1lbnQtPmxwZm47CisJaWYgKCFscGZuKQorCQlscGZuID0gbWFuLT5zaXplOworCSpub2RlID0gTlVMTDsKKwlkbyB7CisJCXJldCA9IGRybV9tbV9wcmVfZ2V0KCZtYW4tPm1hbmFnZXIpOworCQlpZiAodW5saWtlbHkocmV0KSkKKwkJCXJldHVybiByZXQ7CisKKwkJc3Bpbl9sb2NrKCZnbG9iLT5scnVfbG9jayk7CisJCSpub2RlID0gZHJtX21tX3NlYXJjaF9mcmVlX2luX3JhbmdlKCZtYW4tPm1hbmFnZXIsCisJCQkJCW1lbS0+bnVtX3BhZ2VzLCBtZW0tPnBhZ2VfYWxpZ25tZW50LAorCQkJCQlwbGFjZW1lbnQtPmZwZm4sIGxwZm4sIDEpOworCQlpZiAodW5saWtlbHkoKm5vZGUgPT0gTlVMTCkpIHsKKwkJCXNwaW5fdW5sb2NrKCZnbG9iLT5scnVfbG9jayk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkqbm9kZSA9IGRybV9tbV9nZXRfYmxvY2tfYXRvbWljX3JhbmdlKCpub2RlLCBtZW0tPm51bV9wYWdlcywKKwkJCQkJCQltZW0tPnBhZ2VfYWxpZ25tZW50LAorCQkJCQkJCXBsYWNlbWVudC0+ZnBmbiwKKwkJCQkJCQlscGZuKTsKKwkJc3Bpbl91bmxvY2soJmdsb2ItPmxydV9sb2NrKTsKKwl9IHdoaWxlICgqbm9kZSA9PSBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBSZXBlYXRlZGx5IGV2aWN0IG1lbW9yeSBmcm9tIHRoZSBMUlUgZm9yIEBtZW1fdHlwZSB1bnRpbCB3ZSBjcmVhdGUgZW5vdWdoCiAgKiBzcGFjZSwgb3Igd2UndmUgZXZpY3RlZCBldmVyeXRoaW5nIGFuZCB0aGVyZSBpc24ndCBlbm91Z2ggc3BhY2UuCiAgKi8KLXN0YXRpYyBpbnQgdHRtX2JvX21lbV9mb3JjZV9zcGFjZShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwKLQkJCQkgIHN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtLAotCQkJCSAgdWludDMyX3QgbWVtX3R5cGUsCi0JCQkJICBib29sIGludGVycnVwdGlibGUsIGJvb2wgbm9fd2FpdCkKK3N0YXRpYyBpbnQgdHRtX2JvX21lbV9mb3JjZV9zcGFjZShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAorCQkJCQl1aW50MzJfdCBtZW1fdHlwZSwKKwkJCQkJc3RydWN0IHR0bV9wbGFjZW1lbnQgKnBsYWNlbWVudCwKKwkJCQkJc3RydWN0IHR0bV9tZW1fcmVnICptZW0sCisJCQkJCWJvb2wgaW50ZXJydXB0aWJsZSwgYm9vbCBub193YWl0KQogeworCXN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2ID0gYm8tPmJkZXY7CiAJc3RydWN0IHR0bV9ib19nbG9iYWwgKmdsb2IgPSBiZGV2LT5nbG9iOwotCXN0cnVjdCBkcm1fbW1fbm9kZSAqbm9kZTsKLQlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmVudHJ5OwogCXN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuID0gJmJkZXYtPm1hblttZW1fdHlwZV07Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbHJ1OwotCXVuc2lnbmVkIGxvbmcgbnVtX3BhZ2VzID0gbWVtLT5udW1fcGFnZXM7Ci0JaW50IHB1dF9jb3VudCA9IDA7CisJc3RydWN0IGRybV9tbV9ub2RlICpub2RlOwogCWludCByZXQ7CiAKLXJldHJ5X3ByZV9nZXQ6Ci0JcmV0ID0gZHJtX21tX3ByZV9nZXQoJm1hbi0+bWFuYWdlcik7Ci0JaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJcmV0dXJuIHJldDsKLQotCXNwaW5fbG9jaygmZ2xvYi0+bHJ1X2xvY2spOwogCWRvIHsKLQkJbm9kZSA9IGRybV9tbV9zZWFyY2hfZnJlZSgmbWFuLT5tYW5hZ2VyLCBudW1fcGFnZXMsCi0JCQkJCSAgbWVtLT5wYWdlX2FsaWdubWVudCwgMSk7Ci0JCWlmIChub2RlKQotCQkJYnJlYWs7Ci0KLQkJbHJ1ID0gJm1hbi0+bHJ1OwotCQlpZiAobGlzdF9lbXB0eShscnUpKQotCQkJYnJlYWs7Ci0KLQkJZW50cnkgPSBsaXN0X2ZpcnN0X2VudHJ5KGxydSwgc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0LCBscnUpOwotCQlrcmVmX2dldCgmZW50cnktPmxpc3Rfa3JlZik7Ci0KLQkJcmV0ID0KLQkJICAgIHR0bV9ib19yZXNlcnZlX2xvY2tlZChlbnRyeSwgaW50ZXJydXB0aWJsZSwgbm9fd2FpdCwKLQkJCQkJICBmYWxzZSwgMCk7Ci0KLQkJaWYgKGxpa2VseShyZXQgPT0gMCkpCi0JCQlwdXRfY291bnQgPSB0dG1fYm9fZGVsX2Zyb21fbHJ1KGVudHJ5KTsKLQotCQlzcGluX3VubG9jaygmZ2xvYi0+bHJ1X2xvY2spOwotCisJCXJldCA9IHR0bV9ib19tYW5fZ2V0X25vZGUoYm8sIG1hbiwgcGxhY2VtZW50LCBtZW0sICZub2RlKTsKIAkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJCXJldHVybiByZXQ7Ci0KLQkJd2hpbGUgKHB1dF9jb3VudC0tKQotCQkJa3JlZl9wdXQoJmVudHJ5LT5saXN0X2tyZWYsIHR0bV9ib19yZWZfYnVnKTsKLQotCQlyZXQgPSB0dG1fYm9fZXZpY3QoZW50cnksIG1lbV90eXBlLCBpbnRlcnJ1cHRpYmxlLCBub193YWl0KTsKLQotCQl0dG1fYm9fdW5yZXNlcnZlKGVudHJ5KTsKLQotCQlrcmVmX3B1dCgmZW50cnktPmxpc3Rfa3JlZiwgdHRtX2JvX3JlbGVhc2VfbGlzdCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCisJCWlmIChub2RlKQorCQkJYnJlYWs7CiAJCXNwaW5fbG9jaygmZ2xvYi0+bHJ1X2xvY2spOworCQlpZiAobGlzdF9lbXB0eSgmbWFuLT5scnUpKSB7CisJCQlzcGluX3VubG9jaygmZ2xvYi0+bHJ1X2xvY2spOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2soJmdsb2ItPmxydV9sb2NrKTsKKwkJcmV0ID0gdHRtX21lbV9ldmljdF9maXJzdChiZGV2LCBtZW1fdHlwZSwgaW50ZXJydXB0aWJsZSwKKwkJCQkJCW5vX3dhaXQpOworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQkJcmV0dXJuIHJldDsKIAl9IHdoaWxlICgxKTsKLQotCWlmICghbm9kZSkgewotCQlzcGluX3VubG9jaygmZ2xvYi0+bHJ1X2xvY2spOworCWlmIChub2RlID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW5vZGUgPSBkcm1fbW1fZ2V0X2Jsb2NrX2F0b21pYyhub2RlLCBudW1fcGFnZXMsIG1lbS0+cGFnZV9hbGlnbm1lbnQpOwotCWlmICh1bmxpa2VseSghbm9kZSkpIHsKLQkJc3Bpbl91bmxvY2soJmdsb2ItPmxydV9sb2NrKTsKLQkJZ290byByZXRyeV9wcmVfZ2V0OwotCX0KLQotCXNwaW5fdW5sb2NrKCZnbG9iLT5scnVfbG9jayk7CiAJbWVtLT5tbV9ub2RlID0gbm9kZTsKIAltZW0tPm1lbV90eXBlID0gbWVtX3R5cGU7CiAJcmV0dXJuIDA7CkBAIC03MjQsNyArODAyLDYgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0KIHN0YXRpYyBib29sIHR0bV9ib19tdF9jb21wYXRpYmxlKHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuLAogCQkJCSBib29sIGRpc2FsbG93X2ZpeGVkLAogCQkJCSB1aW50MzJfdCBtZW1fdHlwZSwKQEAgLTc1Nyw2NiArODM0LDU1IEBACiAgKiBzcGFjZS4KICAqLwogaW50IHR0bV9ib19tZW1fc3BhY2Uoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKLQkJICAgICB1aW50MzJfdCBwcm9wb3NlZF9wbGFjZW1lbnQsCi0JCSAgICAgc3RydWN0IHR0bV9tZW1fcmVnICptZW0sCi0JCSAgICAgYm9vbCBpbnRlcnJ1cHRpYmxlLCBib29sIG5vX3dhaXQpCisJCQlzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqcGxhY2VtZW50LAorCQkJc3RydWN0IHR0bV9tZW1fcmVnICptZW0sCisJCQlib29sIGludGVycnVwdGlibGUsIGJvb2wgbm9fd2FpdCkKIHsKIAlzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiA9IGJvLT5iZGV2OwotCXN0cnVjdCB0dG1fYm9fZ2xvYmFsICpnbG9iID0gYm8tPmdsb2I7CiAJc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW47Ci0KLQl1aW50MzJfdCBudW1fcHJpb3MgPSBiZGV2LT5kcml2ZXItPm51bV9tZW1fdHlwZV9wcmlvOwotCWNvbnN0IHVpbnQzMl90ICpwcmlvcyA9IGJkZXYtPmRyaXZlci0+bWVtX3R5cGVfcHJpbzsKLQl1aW50MzJfdCBpOwogCXVpbnQzMl90IG1lbV90eXBlID0gVFRNX1BMX1NZU1RFTTsKIAl1aW50MzJfdCBjdXJfZmxhZ3MgPSAwOwogCWJvb2wgdHlwZV9mb3VuZCA9IGZhbHNlOwogCWJvb2wgdHlwZV9vayA9IGZhbHNlOwotCWJvb2wgaGFzX2VhZ2FpbiA9IGZhbHNlOworCWJvb2wgaGFzX2VyZXN0YXJ0c3lzID0gZmFsc2U7CiAJc3RydWN0IGRybV9tbV9ub2RlICpub2RlID0gTlVMTDsKLQlpbnQgcmV0OworCWludCBpLCByZXQ7CiAKIAltZW0tPm1tX25vZGUgPSBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBudW1fcHJpb3M7ICsraSkgewotCQltZW1fdHlwZSA9IHByaW9zW2ldOworCWZvciAoaSA9IDA7IGkgPD0gcGxhY2VtZW50LT5udW1fcGxhY2VtZW50OyArK2kpIHsKKwkJcmV0ID0gdHRtX21lbV90eXBlX2Zyb21fZmxhZ3MocGxhY2VtZW50LT5wbGFjZW1lbnRbaV0sCisJCQkJCQkmbWVtX3R5cGUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAkJbWFuID0gJmJkZXYtPm1hblttZW1fdHlwZV07CiAKIAkJdHlwZV9vayA9IHR0bV9ib19tdF9jb21wYXRpYmxlKG1hbiwKLQkJCQkJICAgICAgIGJvLT50eXBlID09IHR0bV9ib190eXBlX3VzZXIsCi0JCQkJCSAgICAgICBtZW1fdHlwZSwgcHJvcG9zZWRfcGxhY2VtZW50LAotCQkJCQkgICAgICAgJmN1cl9mbGFncyk7CisJCQkJCQliby0+dHlwZSA9PSB0dG1fYm9fdHlwZV91c2VyLAorCQkJCQkJbWVtX3R5cGUsCisJCQkJCQlwbGFjZW1lbnQtPnBsYWNlbWVudFtpXSwKKwkJCQkJCSZjdXJfZmxhZ3MpOwogCiAJCWlmICghdHlwZV9vaykKIAkJCWNvbnRpbnVlOwogCiAJCWN1cl9mbGFncyA9IHR0bV9ib19zZWxlY3RfY2FjaGluZyhtYW4sIGJvLT5tZW0ucGxhY2VtZW50LAogCQkJCQkJICBjdXJfZmxhZ3MpOworCQkvKgorCQkgKiBVc2UgdGhlIGFjY2VzcyBhbmQgb3RoZXIgbm9uLW1hcHBpbmctcmVsYXRlZCBmbGFnIGJpdHMgZnJvbQorCQkgKiB0aGUgbWVtb3J5IHBsYWNlbWVudCBmbGFncyB0byB0aGUgY3VycmVudCBmbGFncworCQkgKi8KKwkJdHRtX2ZsYWdfbWFza2VkKCZjdXJfZmxhZ3MsIHBsYWNlbWVudC0+cGxhY2VtZW50W2ldLAorCQkJCX5UVE1fUExfTUFTS19NRU1UWVBFKTsKIAogCQlpZiAobWVtX3R5cGUgPT0gVFRNX1BMX1NZU1RFTSkKIAkJCWJyZWFrOwogCiAJCWlmIChtYW4tPmhhc190eXBlICYmIG1hbi0+dXNlX3R5cGUpIHsKIAkJCXR5cGVfZm91bmQgPSB0cnVlOwotCQkJZG8gewotCQkJCXJldCA9IGRybV9tbV9wcmVfZ2V0KCZtYW4tPm1hbmFnZXIpOwotCQkJCWlmICh1bmxpa2VseShyZXQpKQotCQkJCQlyZXR1cm4gcmV0OwotCi0JCQkJc3Bpbl9sb2NrKCZnbG9iLT5scnVfbG9jayk7Ci0JCQkJbm9kZSA9IGRybV9tbV9zZWFyY2hfZnJlZSgmbWFuLT5tYW5hZ2VyLAotCQkJCQkJCSAgbWVtLT5udW1fcGFnZXMsCi0JCQkJCQkJICBtZW0tPnBhZ2VfYWxpZ25tZW50LAotCQkJCQkJCSAgMSk7Ci0JCQkJaWYgKHVubGlrZWx5KCFub2RlKSkgewotCQkJCQlzcGluX3VubG9jaygmZ2xvYi0+bHJ1X2xvY2spOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJbm9kZSA9IGRybV9tbV9nZXRfYmxvY2tfYXRvbWljKG5vZGUsCi0JCQkJCQkJICAgICAgIG1lbS0+bnVtX3BhZ2VzLAotCQkJCQkJCSAgICAgICBtZW0tPgotCQkJCQkJCSAgICAgICBwYWdlX2FsaWdubWVudCk7Ci0JCQkJc3Bpbl91bmxvY2soJmdsb2ItPmxydV9sb2NrKTsKLQkJCX0gd2hpbGUgKCFub2RlKTsKKwkJCXJldCA9IHR0bV9ib19tYW5fZ2V0X25vZGUoYm8sIG1hbiwgcGxhY2VtZW50LCBtZW0sCisJCQkJCQkJJm5vZGUpOworCQkJaWYgKHVubGlrZWx5KHJldCkpCisJCQkJcmV0dXJuIHJldDsKIAkJfQogCQlpZiAobm9kZSkKIAkJCWJyZWFrOwpAQCAtODI2LDY3ICs4OTIsNjYgQEAKIAkJbWVtLT5tbV9ub2RlID0gbm9kZTsKIAkJbWVtLT5tZW1fdHlwZSA9IG1lbV90eXBlOwogCQltZW0tPnBsYWNlbWVudCA9IGN1cl9mbGFnczsKKwkJaWYgKG5vZGUpCisJCQlub2RlLT5wcml2YXRlID0gYm87CiAJCXJldHVybiAwOwogCX0KIAogCWlmICghdHlwZV9mb3VuZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQludW1fcHJpb3MgPSBiZGV2LT5kcml2ZXItPm51bV9tZW1fYnVzeV9wcmlvOwotCXByaW9zID0gYmRldi0+ZHJpdmVyLT5tZW1fYnVzeV9wcmlvOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9wcmlvczsgKytpKSB7Ci0JCW1lbV90eXBlID0gcHJpb3NbaV07CisJZm9yIChpID0gMDsgaSA8PSBwbGFjZW1lbnQtPm51bV9idXN5X3BsYWNlbWVudDsgKytpKSB7CisJCXJldCA9IHR0bV9tZW1fdHlwZV9mcm9tX2ZsYWdzKHBsYWNlbWVudC0+cGxhY2VtZW50W2ldLAorCQkJCQkJJm1lbV90eXBlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJCW1hbiA9ICZiZGV2LT5tYW5bbWVtX3R5cGVdOwotCiAJCWlmICghbWFuLT5oYXNfdHlwZSkKIAkJCWNvbnRpbnVlOwotCiAJCWlmICghdHRtX2JvX210X2NvbXBhdGlibGUobWFuLAotCQkJCQkgIGJvLT50eXBlID09IHR0bV9ib190eXBlX3VzZXIsCi0JCQkJCSAgbWVtX3R5cGUsCi0JCQkJCSAgcHJvcG9zZWRfcGxhY2VtZW50LCAmY3VyX2ZsYWdzKSkKKwkJCQkJCWJvLT50eXBlID09IHR0bV9ib190eXBlX3VzZXIsCisJCQkJCQltZW1fdHlwZSwKKwkJCQkJCXBsYWNlbWVudC0+cGxhY2VtZW50W2ldLAorCQkJCQkJJmN1cl9mbGFncykpCiAJCQljb250aW51ZTsKIAogCQljdXJfZmxhZ3MgPSB0dG1fYm9fc2VsZWN0X2NhY2hpbmcobWFuLCBiby0+bWVtLnBsYWNlbWVudCwKIAkJCQkJCSAgY3VyX2ZsYWdzKTsKKwkJLyoKKwkJICogVXNlIHRoZSBhY2Nlc3MgYW5kIG90aGVyIG5vbi1tYXBwaW5nLXJlbGF0ZWQgZmxhZyBiaXRzIGZyb20KKwkJICogdGhlIG1lbW9yeSBwbGFjZW1lbnQgZmxhZ3MgdG8gdGhlIGN1cnJlbnQgZmxhZ3MKKwkJICovCisJCXR0bV9mbGFnX21hc2tlZCgmY3VyX2ZsYWdzLCBwbGFjZW1lbnQtPnBsYWNlbWVudFtpXSwKKwkJCQl+VFRNX1BMX01BU0tfTUVNVFlQRSk7CiAKLQkJcmV0ID0gdHRtX2JvX21lbV9mb3JjZV9zcGFjZShiZGV2LCBtZW0sIG1lbV90eXBlLAotCQkJCQkgICAgIGludGVycnVwdGlibGUsIG5vX3dhaXQpOwotCisJCXJldCA9IHR0bV9ib19tZW1fZm9yY2Vfc3BhY2UoYm8sIG1lbV90eXBlLCBwbGFjZW1lbnQsIG1lbSwKKwkJCQkJCWludGVycnVwdGlibGUsIG5vX3dhaXQpOwogCQlpZiAocmV0ID09IDAgJiYgbWVtLT5tbV9ub2RlKSB7CiAJCQltZW0tPnBsYWNlbWVudCA9IGN1cl9mbGFnczsKKwkJCW1lbS0+bW1fbm9kZS0+cHJpdmF0ZSA9IGJvOwogCQkJcmV0dXJuIDA7CiAJCX0KLQotCQlpZiAocmV0ID09IC1FUkVTVEFSVCkKLQkJCWhhc19lYWdhaW4gPSB0cnVlOworCQlpZiAocmV0ID09IC1FUkVTVEFSVFNZUykKKwkJCWhhc19lcmVzdGFydHN5cyA9IHRydWU7CiAJfQotCi0JcmV0ID0gKGhhc19lYWdhaW4pID8gLUVSRVNUQVJUIDogLUVOT01FTTsKKwlyZXQgPSAoaGFzX2VyZXN0YXJ0c3lzKSA/IC1FUkVTVEFSVFNZUyA6IC1FTk9NRU07CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0wodHRtX2JvX21lbV9zcGFjZSk7CiAKIGludCB0dG1fYm9fd2FpdF9jcHUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywgYm9vbCBub193YWl0KQogewotCWludCByZXQgPSAwOwotCiAJaWYgKChhdG9taWNfcmVhZCgmYm8tPmNwdV93cml0ZXJzKSA+IDApICYmIG5vX3dhaXQpCiAJCXJldHVybiAtRUJVU1k7CiAKLQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYm8tPmV2ZW50X3F1ZXVlLAotCQkJCSAgICAgICBhdG9taWNfcmVhZCgmYm8tPmNwdV93cml0ZXJzKSA9PSAwKTsKLQotCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTKQotCQlyZXQgPSAtRVJFU1RBUlQ7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYm8tPmV2ZW50X3F1ZXVlLAorCQkJCQlhdG9taWNfcmVhZCgmYm8tPmNwdV93cml0ZXJzKSA9PSAwKTsKIH0KK0VYUE9SVF9TWU1CT0wodHRtX2JvX3dhaXRfY3B1KTsKIAogaW50IHR0bV9ib19tb3ZlX2J1ZmZlcihzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAotCQkgICAgICAgdWludDMyX3QgcHJvcG9zZWRfcGxhY2VtZW50LAotCQkgICAgICAgYm9vbCBpbnRlcnJ1cHRpYmxlLCBib29sIG5vX3dhaXQpCisJCQlzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqcGxhY2VtZW50LAorCQkJYm9vbCBpbnRlcnJ1cHRpYmxlLCBib29sIG5vX3dhaXQpCiB7CiAJc3RydWN0IHR0bV9ib19nbG9iYWwgKmdsb2IgPSBiby0+Z2xvYjsKIAlpbnQgcmV0ID0gMDsKQEAgLTg5OSwxNDcgKzk2NCwxMzIgQEAKIAkgKiBIYXZlIHRoZSBkcml2ZXIgbW92ZSBmdW5jdGlvbiB3YWl0IGZvciBpZGxlIHdoZW4gbmVjZXNzYXJ5LAogCSAqIGluc3RlYWQgb2YgZG9pbmcgaXQgaGVyZS4KIAkgKi8KLQogCXNwaW5fbG9jaygmYm8tPmxvY2spOwogCXJldCA9IHR0bV9ib193YWl0KGJvLCBmYWxzZSwgaW50ZXJydXB0aWJsZSwgbm9fd2FpdCk7CiAJc3Bpbl91bmxvY2soJmJvLT5sb2NrKTsKLQogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0KIAltZW0ubnVtX3BhZ2VzID0gYm8tPm51bV9wYWdlczsKIAltZW0uc2l6ZSA9IG1lbS5udW1fcGFnZXMgPDwgUEFHRV9TSElGVDsKIAltZW0ucGFnZV9hbGlnbm1lbnQgPSBiby0+bWVtLnBhZ2VfYWxpZ25tZW50OwotCiAJLyoKIAkgKiBEZXRlcm1pbmUgd2hlcmUgdG8gbW92ZSB0aGUgYnVmZmVyLgogCSAqLwotCi0JcmV0ID0gdHRtX2JvX21lbV9zcGFjZShibywgcHJvcG9zZWRfcGxhY2VtZW50LCAmbWVtLAotCQkJICAgICAgIGludGVycnVwdGlibGUsIG5vX3dhaXQpOworCXJldCA9IHR0bV9ib19tZW1fc3BhY2UoYm8sIHBsYWNlbWVudCwgJm1lbSwgaW50ZXJydXB0aWJsZSwgbm9fd2FpdCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfdW5sb2NrOwotCiAJcmV0ID0gdHRtX2JvX2hhbmRsZV9tb3ZlX21lbShibywgJm1lbSwgZmFsc2UsIGludGVycnVwdGlibGUsIG5vX3dhaXQpOwotCiBvdXRfdW5sb2NrOgogCWlmIChyZXQgJiYgbWVtLm1tX25vZGUpIHsKIAkJc3Bpbl9sb2NrKCZnbG9iLT5scnVfbG9jayk7CisJCW1lbS5tbV9ub2RlLT5wcml2YXRlID0gTlVMTDsKIAkJZHJtX21tX3B1dF9ibG9jayhtZW0ubW1fbm9kZSk7CiAJCXNwaW5fdW5sb2NrKCZnbG9iLT5scnVfbG9jayk7CiAJfQogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgdHRtX2JvX21lbV9jb21wYXQodWludDMyX3QgcHJvcG9zZWRfcGxhY2VtZW50LAorc3RhdGljIGludCB0dG1fYm9fbWVtX2NvbXBhdChzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqcGxhY2VtZW50LAogCQkJICAgICBzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSkKIHsKLQlpZiAoKHByb3Bvc2VkX3BsYWNlbWVudCAmIG1lbS0+cGxhY2VtZW50ICYgVFRNX1BMX01BU0tfTUVNKSA9PSAwKQotCQlyZXR1cm4gMDsKLQlpZiAoKHByb3Bvc2VkX3BsYWNlbWVudCAmIG1lbS0+cGxhY2VtZW50ICYgVFRNX1BMX01BU0tfQ0FDSElORykgPT0gMCkKLQkJcmV0dXJuIDA7CisJaW50IGk7CiAKLQlyZXR1cm4gMTsKKwlmb3IgKGkgPSAwOyBpIDwgcGxhY2VtZW50LT5udW1fcGxhY2VtZW50OyBpKyspIHsKKwkJaWYgKChwbGFjZW1lbnQtPnBsYWNlbWVudFtpXSAmIG1lbS0+cGxhY2VtZW50ICYKKwkJCVRUTV9QTF9NQVNLX0NBQ0hJTkcpICYmCisJCQkocGxhY2VtZW50LT5wbGFjZW1lbnRbaV0gJiBtZW0tPnBsYWNlbWVudCAmCisJCQlUVE1fUExfTUFTS19NRU0pKQorCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiAtMTsKIH0KIAotaW50IHR0bV9idWZmZXJfb2JqZWN0X3ZhbGlkYXRlKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sCi0JCQkgICAgICAgdWludDMyX3QgcHJvcG9zZWRfcGxhY2VtZW50LAotCQkJICAgICAgIGJvb2wgaW50ZXJydXB0aWJsZSwgYm9vbCBub193YWl0KQoraW50IHR0bV9ib192YWxpZGF0ZShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAorCQkJc3RydWN0IHR0bV9wbGFjZW1lbnQgKnBsYWNlbWVudCwKKwkJCWJvb2wgaW50ZXJydXB0aWJsZSwgYm9vbCBub193YWl0KQogewogCWludCByZXQ7CiAKIAlCVUdfT04oIWF0b21pY19yZWFkKCZiby0+cmVzZXJ2ZWQpKTsKLQliby0+cHJvcG9zZWRfcGxhY2VtZW50ID0gcHJvcG9zZWRfcGxhY2VtZW50OwotCi0JVFRNX0RFQlVHKCJQcm9wb3NlZCBwbGFjZW1lbnQgMHglMDhseCwgT2xkIGZsYWdzIDB4JTA4bHhcbiIsCi0JCSAgKHVuc2lnbmVkIGxvbmcpcHJvcG9zZWRfcGxhY2VtZW50LAotCQkgICh1bnNpZ25lZCBsb25nKWJvLT5tZW0ucGxhY2VtZW50KTsKLQorCS8qIENoZWNrIHRoYXQgcmFuZ2UgaXMgdmFsaWQgKi8KKwlpZiAocGxhY2VtZW50LT5scGZuIHx8IHBsYWNlbWVudC0+ZnBmbikKKwkJaWYgKHBsYWNlbWVudC0+ZnBmbiA+IHBsYWNlbWVudC0+bHBmbiB8fAorCQkJKHBsYWNlbWVudC0+bHBmbiAtIHBsYWNlbWVudC0+ZnBmbikgPCBiby0+bnVtX3BhZ2VzKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJLyoKIAkgKiBDaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gbW92ZSBidWZmZXIuCiAJICovCi0KLQlpZiAoIXR0bV9ib19tZW1fY29tcGF0KGJvLT5wcm9wb3NlZF9wbGFjZW1lbnQsICZiby0+bWVtKSkgewotCQlyZXQgPSB0dG1fYm9fbW92ZV9idWZmZXIoYm8sIGJvLT5wcm9wb3NlZF9wbGFjZW1lbnQsCi0JCQkJCSBpbnRlcnJ1cHRpYmxlLCBub193YWl0KTsKLQkJaWYgKHJldCkgewotCQkJaWYgKHJldCAhPSAtRVJFU1RBUlQpCi0JCQkJcHJpbnRrKEtFUk5fRVJSIFRUTV9QRlgKLQkJCQkgICAgICAgIkZhaWxlZCBtb3ZpbmcgYnVmZmVyLiAiCi0JCQkJICAgICAgICJQcm9wb3NlZCBwbGFjZW1lbnQgMHglMDh4XG4iLAotCQkJCSAgICAgICBiby0+cHJvcG9zZWRfcGxhY2VtZW50KTsKLQkJCWlmIChyZXQgPT0gLUVOT01FTSkKLQkJCQlwcmludGsoS0VSTl9FUlIgVFRNX1BGWAotCQkJCSAgICAgICAiT3V0IG9mIGFwZXJ0dXJlIHNwYWNlIG9yICIKLQkJCQkgICAgICAgIkRSTSBtZW1vcnkgcXVvdGEuXG4iKTsKKwlyZXQgPSB0dG1fYm9fbWVtX2NvbXBhdChwbGFjZW1lbnQsICZiby0+bWVtKTsKKwlpZiAocmV0IDwgMCkgeworCQlyZXQgPSB0dG1fYm9fbW92ZV9idWZmZXIoYm8sIHBsYWNlbWVudCwgaW50ZXJydXB0aWJsZSwgbm9fd2FpdCk7CisJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwotCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVXNlIHRoZSBhY2Nlc3MgYW5kIG90aGVyIG5vbi1tYXBwaW5nLXJlbGF0ZWQgZmxhZyBiaXRzIGZyb20KKwkJICogdGhlIGNvbXBhdGlibGUgbWVtb3J5IHBsYWNlbWVudCBmbGFncyB0byB0aGUgYWN0aXZlIGZsYWdzCisJCSAqLworCQl0dG1fZmxhZ19tYXNrZWQoJmJvLT5tZW0ucGxhY2VtZW50LCBwbGFjZW1lbnQtPnBsYWNlbWVudFtyZXRdLAorCQkJCX5UVE1fUExfTUFTS19NRU1UWVBFKTsKIAl9Ci0KIAkvKgogCSAqIFdlIG1pZ2h0IG5lZWQgdG8gYWRkIGEgVFRNLgogCSAqLwotCiAJaWYgKGJvLT5tZW0ubWVtX3R5cGUgPT0gVFRNX1BMX1NZU1RFTSAmJiBiby0+dHRtID09IE5VTEwpIHsKIAkJcmV0ID0gdHRtX2JvX2FkZF90dG0oYm8sIHRydWUpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAl9Ci0JLyoKLQkgKiBWYWxpZGF0aW9uIGhhcyBzdWNjZWVkZWQsIG1vdmUgdGhlIGFjY2VzcyBhbmQgb3RoZXIKLQkgKiBub24tbWFwcGluZy1yZWxhdGVkIGZsYWcgYml0cyBmcm9tIHRoZSBwcm9wb3NlZCBmbGFncyB0bwotCSAqIHRoZSBhY3RpdmUgZmxhZ3MKLQkgKi8KLQotCXR0bV9mbGFnX21hc2tlZCgmYm8tPm1lbS5wbGFjZW1lbnQsIGJvLT5wcm9wb3NlZF9wbGFjZW1lbnQsCi0JCQl+VFRNX1BMX01BU0tfTUVNVFlQRSk7Ci0KIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wodHRtX2J1ZmZlcl9vYmplY3RfdmFsaWRhdGUpOworRVhQT1JUX1NZTUJPTCh0dG1fYm9fdmFsaWRhdGUpOwogCi1pbnQKLXR0bV9ib19jaGVja19wbGFjZW1lbnQoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKLQkJICAgICAgIHVpbnQzMl90IHNldF9mbGFncywgdWludDMyX3QgY2xyX2ZsYWdzKQoraW50IHR0bV9ib19jaGVja19wbGFjZW1lbnQoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKKwkJCQlzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqcGxhY2VtZW50KQogewotCXVpbnQzMl90IG5ld19tYXNrID0gc2V0X2ZsYWdzIHwgY2xyX2ZsYWdzOworCWludCBpOwogCi0JaWYgKChiby0+dHlwZSA9PSB0dG1fYm9fdHlwZV91c2VyKSAmJgotCSAgICAoY2xyX2ZsYWdzICYgVFRNX1BMX0ZMQUdfQ0FDSEVEKSkgewotCQlwcmludGsoS0VSTl9FUlIgVFRNX1BGWAotCQkgICAgICAgIlVzZXIgYnVmZmVycyByZXF1aXJlIGNhY2hlLWNvaGVyZW50IG1lbW9yeS5cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKLQkJaWYgKG5ld19tYXNrICYgVFRNX1BMX0ZMQUdfTk9fRVZJQ1QpIHsKLQkJCXByaW50ayhLRVJOX0VSUiBUVE1fUEZYICJOZWVkIHRvIGJlIHJvb3QgdG8gbW9kaWZ5IgotCQkJICAgICAgICIgTk9fRVZJQ1Qgc3RhdHVzLlxuIik7CisJaWYgKHBsYWNlbWVudC0+ZnBmbiB8fCBwbGFjZW1lbnQtPmxwZm4pIHsKKwkJaWYgKGJvLT5tZW0ubnVtX3BhZ2VzID4gKHBsYWNlbWVudC0+bHBmbiAtIHBsYWNlbWVudC0+ZnBmbikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBUVE1fUEZYICJQYWdlIG51bWJlciByYW5nZSB0byBzbWFsbCAiCisJCQkJIk5lZWQgJWx1IHBhZ2VzLCByYW5nZSBpcyBbJXUsICV1XVxuIiwKKwkJCQliby0+bWVtLm51bV9wYWdlcywgcGxhY2VtZW50LT5mcGZuLAorCQkJCXBsYWNlbWVudC0+bHBmbik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCi0JCWlmICgoY2xyX2ZsYWdzICYgYm8tPm1lbS5wbGFjZW1lbnQgJiBUVE1fUExfTUFTS19NRU1UWVBFKSAmJgotCQkgICAgKGJvLT5tZW0ucGxhY2VtZW50ICYgVFRNX1BMX0ZMQUdfTk9fRVZJQ1QpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgVFRNX1BGWAotCQkJICAgICAgICJJbmNvbXBhdGlibGUgbWVtb3J5IHNwZWNpZmljYXRpb24iCi0JCQkgICAgICAgIiBmb3IgTk9fRVZJQ1QgYnVmZmVyLlxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZm9yIChpID0gMDsgaSA8IHBsYWNlbWVudC0+bnVtX3BsYWNlbWVudDsgaSsrKSB7CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQkJaWYgKHBsYWNlbWVudC0+cGxhY2VtZW50W2ldICYgVFRNX1BMX0ZMQUdfTk9fRVZJQ1QpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgVFRNX1BGWCAiTmVlZCB0byBiZSByb290IHRvICIKKwkJCQkJIm1vZGlmeSBOT19FVklDVCBzdGF0dXMuXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgcGxhY2VtZW50LT5udW1fYnVzeV9wbGFjZW1lbnQ7IGkrKykgeworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJCWlmIChwbGFjZW1lbnQtPmJ1c3lfcGxhY2VtZW50W2ldICYgVFRNX1BMX0ZMQUdfTk9fRVZJQ1QpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgVFRNX1BGWCAiTmVlZCB0byBiZSByb290IHRvICIKKwkJCQkJIm1vZGlmeSBOT19FVklDVCBzdGF0dXMuXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KIAkJfQogCX0KIAlyZXR1cm4gMDsKIH0KIAotaW50IHR0bV9idWZmZXJfb2JqZWN0X2luaXQoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsCi0JCQkgICBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAotCQkJICAgdW5zaWduZWQgbG9uZyBzaXplLAotCQkJICAgZW51bSB0dG1fYm9fdHlwZSB0eXBlLAotCQkJICAgdWludDMyX3QgZmxhZ3MsCi0JCQkgICB1aW50MzJfdCBwYWdlX2FsaWdubWVudCwKLQkJCSAgIHVuc2lnbmVkIGxvbmcgYnVmZmVyX3N0YXJ0LAotCQkJICAgYm9vbCBpbnRlcnJ1cHRpYmxlLAotCQkJICAgc3RydWN0IGZpbGUgKnBlcnNpc3RhbnRfc3dhcF9zdG9yYWdlLAotCQkJICAgc2l6ZV90IGFjY19zaXplLAotCQkJICAgdm9pZCAoKmRlc3Ryb3kpIChzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKikpCitpbnQgdHRtX2JvX2luaXQoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsCisJCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sCisJCXVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJZW51bSB0dG1fYm9fdHlwZSB0eXBlLAorCQlzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqcGxhY2VtZW50LAorCQl1aW50MzJfdCBwYWdlX2FsaWdubWVudCwKKwkJdW5zaWduZWQgbG9uZyBidWZmZXJfc3RhcnQsCisJCWJvb2wgaW50ZXJydXB0aWJsZSwKKwkJc3RydWN0IGZpbGUgKnBlcnNpc3RhbnRfc3dhcF9zdG9yYWdlLAorCQlzaXplX3QgYWNjX3NpemUsCisJCXZvaWQgKCpkZXN0cm95KSAoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICopKQogewogCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgbnVtX3BhZ2VzOwpAQCAtMTA3NywyOSArMTEyNywyMSBAQAogCWJvLT5hY2Nfc2l6ZSA9IGFjY19zaXplOwogCWF0b21pY19pbmMoJmJvLT5nbG9iLT5ib19jb3VudCk7CiAKLQlyZXQgPSB0dG1fYm9fY2hlY2tfcGxhY2VtZW50KGJvLCBmbGFncywgMFVMTCk7CisJcmV0ID0gdHRtX2JvX2NoZWNrX3BsYWNlbWVudChibywgcGxhY2VtZW50KTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlnb3RvIG91dF9lcnI7CiAKIAkvKgotCSAqIElmIG5vIGNhY2hpbmcgYXR0cmlidXRlcyBhcmUgc2V0LCBhY2NlcHQgYW55IGZvcm0gb2YgY2FjaGluZy4KLQkgKi8KLQotCWlmICgoZmxhZ3MgJiBUVE1fUExfTUFTS19DQUNISU5HKSA9PSAwKQotCQlmbGFncyB8PSBUVE1fUExfTUFTS19DQUNISU5HOwotCi0JLyoKIAkgKiBGb3IgdHRtX2JvX3R5cGVfZGV2aWNlIGJ1ZmZlcnMsIGFsbG9jYXRlCiAJICogYWRkcmVzcyBzcGFjZSBmcm9tIHRoZSBkZXZpY2UuCiAJICovCi0KIAlpZiAoYm8tPnR5cGUgPT0gdHRtX2JvX3R5cGVfZGV2aWNlKSB7CiAJCXJldCA9IHR0bV9ib19zZXR1cF92bShibyk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dF9lcnI7CiAJfQogCi0JcmV0ID0gdHRtX2J1ZmZlcl9vYmplY3RfdmFsaWRhdGUoYm8sIGZsYWdzLCBpbnRlcnJ1cHRpYmxlLCBmYWxzZSk7CisJcmV0ID0gdHRtX2JvX3ZhbGlkYXRlKGJvLCBwbGFjZW1lbnQsIGludGVycnVwdGlibGUsIGZhbHNlKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9lcnI7CiAKQEAgLTExMTIsNyArMTE1NCw3IEBACiAKIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTCh0dG1fYnVmZmVyX29iamVjdF9pbml0KTsKK0VYUE9SVF9TWU1CT0wodHRtX2JvX2luaXQpOwogCiBzdGF0aWMgaW5saW5lIHNpemVfdCB0dG1fYm9fc2l6ZShzdHJ1Y3QgdHRtX2JvX2dsb2JhbCAqZ2xvYiwKIAkJCQkgdW5zaWduZWQgbG9uZyBudW1fcGFnZXMpCkBAIC0xMTIzLDE5ICsxMTY1LDE5IEBACiAJcmV0dXJuIGdsb2ItPnR0bV9ib19zaXplICsgMiAqIHBhZ2VfYXJyYXlfc2l6ZTsKIH0KIAotaW50IHR0bV9idWZmZXJfb2JqZWN0X2NyZWF0ZShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLAotCQkJICAgICBlbnVtIHR0bV9ib190eXBlIHR5cGUsCi0JCQkgICAgIHVpbnQzMl90IGZsYWdzLAotCQkJICAgICB1aW50MzJfdCBwYWdlX2FsaWdubWVudCwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBidWZmZXJfc3RhcnQsCi0JCQkgICAgIGJvb2wgaW50ZXJydXB0aWJsZSwKLQkJCSAgICAgc3RydWN0IGZpbGUgKnBlcnNpc3RhbnRfc3dhcF9zdG9yYWdlLAotCQkJICAgICBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKipwX2JvKQoraW50IHR0bV9ib19jcmVhdGUoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsCisJCQl1bnNpZ25lZCBsb25nIHNpemUsCisJCQllbnVtIHR0bV9ib190eXBlIHR5cGUsCisJCQlzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqcGxhY2VtZW50LAorCQkJdWludDMyX3QgcGFnZV9hbGlnbm1lbnQsCisJCQl1bnNpZ25lZCBsb25nIGJ1ZmZlcl9zdGFydCwKKwkJCWJvb2wgaW50ZXJydXB0aWJsZSwKKwkJCXN0cnVjdCBmaWxlICpwZXJzaXN0YW50X3N3YXBfc3RvcmFnZSwKKwkJCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqKnBfYm8pCiB7CiAJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibzsKLQlpbnQgcmV0OwogCXN0cnVjdCB0dG1fbWVtX2dsb2JhbCAqbWVtX2dsb2IgPSBiZGV2LT5nbG9iLT5tZW1fZ2xvYjsKKwlpbnQgcmV0OwogCiAJc2l6ZV90IGFjY19zaXplID0KIAkgICAgdHRtX2JvX3NpemUoYmRldi0+Z2xvYiwgKHNpemUgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUKTsKQEAgLTExNTAsNzYgKzExOTIsNDEgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JcmV0ID0gdHRtX2J1ZmZlcl9vYmplY3RfaW5pdChiZGV2LCBibywgc2l6ZSwgdHlwZSwgZmxhZ3MsCi0JCQkJICAgICBwYWdlX2FsaWdubWVudCwgYnVmZmVyX3N0YXJ0LAotCQkJCSAgICAgaW50ZXJydXB0aWJsZSwKLQkJCQkgICAgIHBlcnNpc3RhbnRfc3dhcF9zdG9yYWdlLCBhY2Nfc2l6ZSwgTlVMTCk7CisJcmV0ID0gdHRtX2JvX2luaXQoYmRldiwgYm8sIHNpemUsIHR5cGUsIHBsYWNlbWVudCwgcGFnZV9hbGlnbm1lbnQsCisJCQkJYnVmZmVyX3N0YXJ0LCBpbnRlcnJ1cHRpYmxlLAorCQkJCXBlcnNpc3RhbnRfc3dhcF9zdG9yYWdlLCBhY2Nfc2l6ZSwgTlVMTCk7CiAJaWYgKGxpa2VseShyZXQgPT0gMCkpCiAJCSpwX2JvID0gYm87CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHR0bV9ib19sZWF2ZV9saXN0KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sCi0JCQkgICAgIHVpbnQzMl90IG1lbV90eXBlLCBib29sIGFsbG93X2Vycm9ycykKLXsKLQlpbnQgcmV0OwotCi0Jc3Bpbl9sb2NrKCZiby0+bG9jayk7Ci0JcmV0ID0gdHRtX2JvX3dhaXQoYm8sIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCXNwaW5fdW5sb2NrKCZiby0+bG9jayk7Ci0KLQlpZiAocmV0ICYmIGFsbG93X2Vycm9ycykKLQkJZ290byBvdXQ7Ci0KLQlpZiAoYm8tPm1lbS5tZW1fdHlwZSA9PSBtZW1fdHlwZSkKLQkJcmV0ID0gdHRtX2JvX2V2aWN0KGJvLCBtZW1fdHlwZSwgZmFsc2UsIGZhbHNlKTsKLQotCWlmIChyZXQpIHsKLQkJaWYgKGFsbG93X2Vycm9ycykgewotCQkJZ290byBvdXQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgPSAwOwotCQkJcHJpbnRrKEtFUk5fRVJSIFRUTV9QRlggIkNsZWFudXAgZXZpY3Rpb24gZmFpbGVkXG4iKTsKLQkJfQotCX0KLQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBpbnQgdHRtX2JvX2ZvcmNlX2xpc3RfY2xlYW4oc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsCi0JCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKLQkJCQkgICB1bnNpZ25lZCBtZW1fdHlwZSwgYm9vbCBhbGxvd19lcnJvcnMpCisJCQkJCXVuc2lnbmVkIG1lbV90eXBlLCBib29sIGFsbG93X2Vycm9ycykKIHsKKwlzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbiA9ICZiZGV2LT5tYW5bbWVtX3R5cGVdOwogCXN0cnVjdCB0dG1fYm9fZ2xvYmFsICpnbG9iID0gYmRldi0+Z2xvYjsKLQlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmVudHJ5OwogCWludCByZXQ7Ci0JaW50IHB1dF9jb3VudDsKIAogCS8qCiAJICogQ2FuJ3QgdXNlIHN0YW5kYXJkIGxpc3QgdHJhdmVyc2FsIHNpbmNlIHdlJ3JlIHVubG9ja2luZy4KIAkgKi8KIAogCXNwaW5fbG9jaygmZ2xvYi0+bHJ1X2xvY2spOwotCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KGhlYWQpKSB7Ci0JCWVudHJ5ID0gbGlzdF9maXJzdF9lbnRyeShoZWFkLCBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QsIGxydSk7Ci0JCWtyZWZfZ2V0KCZlbnRyeS0+bGlzdF9rcmVmKTsKLQkJcmV0ID0gdHRtX2JvX3Jlc2VydmVfbG9ja2VkKGVudHJ5LCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwKTsKLQkJcHV0X2NvdW50ID0gdHRtX2JvX2RlbF9mcm9tX2xydShlbnRyeSk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZtYW4tPmxydSkpIHsKIAkJc3Bpbl91bmxvY2soJmdsb2ItPmxydV9sb2NrKTsKLQkJd2hpbGUgKHB1dF9jb3VudC0tKQotCQkJa3JlZl9wdXQoJmVudHJ5LT5saXN0X2tyZWYsIHR0bV9ib19yZWZfYnVnKTsKLQkJQlVHX09OKHJldCk7Ci0JCXJldCA9IHR0bV9ib19sZWF2ZV9saXN0KGVudHJ5LCBtZW1fdHlwZSwgYWxsb3dfZXJyb3JzKTsKLQkJdHRtX2JvX3VucmVzZXJ2ZShlbnRyeSk7Ci0JCWtyZWZfcHV0KCZlbnRyeS0+bGlzdF9rcmVmLCB0dG1fYm9fcmVsZWFzZV9saXN0KTsKKwkJcmV0ID0gdHRtX21lbV9ldmljdF9maXJzdChiZGV2LCBtZW1fdHlwZSwgZmFsc2UsIGZhbHNlKTsKKwkJaWYgKHJldCkgeworCQkJaWYgKGFsbG93X2Vycm9ycykgeworCQkJCXJldHVybiByZXQ7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX0VSUiBUVE1fUEZYCisJCQkJCSJDbGVhbnVwIGV2aWN0aW9uIGZhaWxlZFxuIik7CisJCQl9CisJCX0KIAkJc3Bpbl9sb2NrKCZnbG9iLT5scnVfbG9jayk7CiAJfQotCiAJc3Bpbl91bmxvY2soJmdsb2ItPmxydV9sb2NrKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMjQ2LDcgKzEyNTMsNyBAQAogCiAJcmV0ID0gMDsKIAlpZiAobWVtX3R5cGUgPiAwKSB7Ci0JCXR0bV9ib19mb3JjZV9saXN0X2NsZWFuKGJkZXYsICZtYW4tPmxydSwgbWVtX3R5cGUsIGZhbHNlKTsKKwkJdHRtX2JvX2ZvcmNlX2xpc3RfY2xlYW4oYmRldiwgbWVtX3R5cGUsIGZhbHNlKTsKIAogCQlzcGluX2xvY2soJmdsb2ItPmxydV9sb2NrKTsKIAkJaWYgKGRybV9tbV9jbGVhbigmbWFuLT5tYW5hZ2VyKSkKQEAgLTEyNzksMTIgKzEyODYsMTIgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JcmV0dXJuIHR0bV9ib19mb3JjZV9saXN0X2NsZWFuKGJkZXYsICZtYW4tPmxydSwgbWVtX3R5cGUsIHRydWUpOworCXJldHVybiB0dG1fYm9fZm9yY2VfbGlzdF9jbGVhbihiZGV2LCBtZW1fdHlwZSwgdHJ1ZSk7CiB9CiBFWFBPUlRfU1lNQk9MKHR0bV9ib19ldmljdF9tbSk7CiAKIGludCB0dG1fYm9faW5pdF9tbShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwgdW5zaWduZWQgdHlwZSwKLQkJICAgdW5zaWduZWQgbG9uZyBwX29mZnNldCwgdW5zaWduZWQgbG9uZyBwX3NpemUpCisJCQl1bnNpZ25lZCBsb25nIHBfc2l6ZSkKIHsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAlzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbjsKQEAgLTEzMTQsNyArMTMyMSw3IEBACiAJCQkgICAgICAgdHlwZSk7CiAJCQlyZXR1cm4gcmV0OwogCQl9Ci0JCXJldCA9IGRybV9tbV9pbml0KCZtYW4tPm1hbmFnZXIsIHBfb2Zmc2V0LCBwX3NpemUpOworCQlyZXQgPSBkcm1fbW1faW5pdCgmbWFuLT5tYW5hZ2VyLCAwLCBwX3NpemUpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAl9CkBAIC0xNDYzLDcgKzE0NzAsNyBAQAogCSAqIEluaXRpYWxpemUgdGhlIHN5c3RlbSBtZW1vcnkgYnVmZmVyIHR5cGUuCiAJICogT3RoZXIgdHlwZXMgbmVlZCB0byBiZSBkcml2ZXIgLyBJT0NUTCBpbml0aWFsaXplZC4KIAkgKi8KLQlyZXQgPSB0dG1fYm9faW5pdF9tbShiZGV2LCBUVE1fUExfU1lTVEVNLCAwLCAwKTsKKwlyZXQgPSB0dG1fYm9faW5pdF9tbShiZGV2LCBUVE1fUExfU1lTVEVNLCAwKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlnb3RvIG91dF9ub19zeXM7CiAKQEAgLTE2OTMsNyArMTcwMCw3IEBACiAJCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUKIAkJCSAgICAoYm8tPmV2ZW50X3F1ZXVlLCBhdG9taWNfcmVhZCgmYm8tPnJlc2VydmVkKSA9PSAwKTsKIAkJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCQkJcmV0dXJuIC1FUkVTVEFSVDsKKwkJCQlyZXR1cm4gcmV0OwogCQl9IGVsc2UgewogCQkJd2FpdF9ldmVudChiby0+ZXZlbnRfcXVldWUsCiAJCQkJICAgYXRvbWljX3JlYWQoJmJvLT5yZXNlcnZlZCkgPT0gMCk7CkBAIC0xNzIyLDEyICsxNzI5LDE0IEBACiAJdHRtX2JvX3VucmVzZXJ2ZShibyk7CiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0wodHRtX2JvX3N5bmNjcHVfd3JpdGVfZ3JhYik7CiAKIHZvaWQgdHRtX2JvX3N5bmNjcHVfd3JpdGVfcmVsZWFzZShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQogewogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZiby0+Y3B1X3dyaXRlcnMpKQogCQl3YWtlX3VwX2FsbCgmYm8tPmV2ZW50X3F1ZXVlKTsKIH0KK0VYUE9SVF9TWU1CT0wodHRtX2JvX3N5bmNjcHVfd3JpdGVfcmVsZWFzZSk7CiAKIC8qKgogICogQSBidWZmZXIgb2JqZWN0IHNocmluayBtZXRob2QgdGhhdCB0cmllcyB0byBzd2FwIG91dCB0aGUgZmlyc3QKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvX3V0aWwuYyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvX3V0aWwuYwppbmRleCA2MWM1NTcyLi4yZWNmN2QwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib191dGlsLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdXRpbC5jCkBAIC0zNjksNiArMzY5LDcgQEAKICNlbmRpZgogCXJldHVybiB0bXA7CiB9CitFWFBPUlRfU1lNQk9MKHR0bV9pb19wcm90KTsKIAogc3RhdGljIGludCB0dG1fYm9faW9yZW1hcChzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAogCQkJICB1bnNpZ25lZCBsb25nIGJ1c19iYXNlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdm0uYyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvX3ZtLmMKaW5kZXggMWMwNDBkMC4uNjA5YTg1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdm0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib192bS5jCkBAIC0xMTQsNyArMTE0LDcgQEAKIAkJcmV0ID0gdHRtX2JvX3dhaXQoYm8sIGZhbHNlLCB0cnVlLCBmYWxzZSk7CiAJCXNwaW5fdW5sb2NrKCZiby0+bG9jayk7CiAJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKLQkJCXJldHZhbCA9IChyZXQgIT0gLUVSRVNUQVJUKSA/CisJCQlyZXR2YWwgPSAocmV0ICE9IC1FUkVTVEFSVFNZUykgPwogCQkJICAgIFZNX0ZBVUxUX1NJR0JVUyA6IFZNX0ZBVUxUX05PUEFHRTsKIAkJCWdvdG8gb3V0X3VubG9jazsKIAkJfQpAQCAtMzQ5LDkgKzM0OSw2IEBACiAJc3dpdGNoIChyZXQpIHsKIAljYXNlIDA6CiAJCWJyZWFrOwotCWNhc2UgLUVSRVNUQVJUOgotCQlyZXQgPSAtRUlOVFI7Ci0JCWdvdG8gb3V0X3VucmVmOwogCWNhc2UgLUVCVVNZOgogCQlyZXQgPSAtRUFHQUlOOwogCQlnb3RvIG91dF91bnJlZjsKQEAgLTQyMSw4ICs0MTgsNiBAQAogCXN3aXRjaCAocmV0KSB7CiAJY2FzZSAwOgogCQlicmVhazsKLQljYXNlIC1FUkVTVEFSVDoKLQkJcmV0dXJuIC1FSU5UUjsKIAljYXNlIC1FQlVTWToKIAkJcmV0dXJuIC1FQUdBSU47CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2V4ZWNidWZfdXRpbC5jIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fZXhlY2J1Zl91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4NWMyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2V4ZWNidWZfdXRpbC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInR0bS90dG1fZXhlY2J1Zl91dGlsLmgiCisjaW5jbHVkZSAidHRtL3R0bV9ib19kcml2ZXIuaCIKKyNpbmNsdWRlICJ0dG0vdHRtX3BsYWNlbWVudC5oIgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCit2b2lkIHR0bV9ldV9iYWNrb2ZmX3Jlc2VydmF0aW9uKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7CisJc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIgKmVudHJ5OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0gZW50cnktPmJvOworCQlpZiAoIWVudHJ5LT5yZXNlcnZlZCkKKwkJCWNvbnRpbnVlOworCisJCWVudHJ5LT5yZXNlcnZlZCA9IGZhbHNlOworCQl0dG1fYm9fdW5yZXNlcnZlKGJvKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHR0bV9ldV9iYWNrb2ZmX3Jlc2VydmF0aW9uKTsKKworLyoKKyAqIFJlc2VydmUgYnVmZmVycyBmb3IgdmFsaWRhdGlvbi4KKyAqCisgKiBJZiBhIGJ1ZmZlciBpbiB0aGUgbGlzdCBpcyBtYXJrZWQgZm9yIENQVSBhY2Nlc3MsIHdlIGJhY2sgb2ZmIGFuZAorICogd2FpdCBmb3IgdGhhdCBidWZmZXIgdG8gYmVjb21lIGZyZWUgZm9yIEdQVSBhY2Nlc3MuCisgKgorICogSWYgYSBidWZmZXIgaXMgcmVzZXJ2ZWQgZm9yIGFub3RoZXIgdmFsaWRhdGlvbiwgdGhlIHZhbGlkYXRvciB3aXRoCisgKiB0aGUgaGlnaGVzdCB2YWxpZGF0aW9uIHNlcXVlbmNlIGJhY2tzIG9mZiBhbmQgd2FpdHMgZm9yIHRoYXQgYnVmZmVyCisgKiB0byBiZWNvbWUgdW5yZXNlcnZlZC4gVGhpcyBwcmV2ZW50cyBkZWFkbG9ja3Mgd2hlbiB2YWxpZGF0aW5nIG11bHRpcGxlCisgKiBidWZmZXJzIGluIGRpZmZlcmVudCBvcmRlcnMuCisgKi8KKworaW50IHR0bV9ldV9yZXNlcnZlX2J1ZmZlcnMoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgdWludDMyX3QgdmFsX3NlcSkKK3sKKwlzdHJ1Y3QgdHRtX3ZhbGlkYXRlX2J1ZmZlciAqZW50cnk7CisJaW50IHJldDsKKworcmV0cnk6CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0gZW50cnktPmJvOworCisJCWVudHJ5LT5yZXNlcnZlZCA9IGZhbHNlOworCQlyZXQgPSB0dG1fYm9fcmVzZXJ2ZShibywgdHJ1ZSwgZmFsc2UsIHRydWUsIHZhbF9zZXEpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXR0bV9ldV9iYWNrb2ZmX3Jlc2VydmF0aW9uKGxpc3QpOworCQkJaWYgKHJldCA9PSAtRUFHQUlOKSB7CisJCQkJcmV0ID0gdHRtX2JvX3dhaXRfdW5yZXNlcnZlZChibywgdHJ1ZSk7CisJCQkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQlnb3RvIHJldHJ5OworCQkJfSBlbHNlCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWVudHJ5LT5yZXNlcnZlZCA9IHRydWU7CisJCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmYm8tPmNwdV93cml0ZXJzKSA+IDApKSB7CisJCQl0dG1fZXVfYmFja29mZl9yZXNlcnZhdGlvbihsaXN0KTsKKwkJCXJldCA9IHR0bV9ib193YWl0X2NwdShibywgZmFsc2UpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJZ290byByZXRyeTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodHRtX2V1X3Jlc2VydmVfYnVmZmVycyk7CisKK3ZvaWQgdHRtX2V1X2ZlbmNlX2J1ZmZlcl9vYmplY3RzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIHZvaWQgKnN5bmNfb2JqKQoreworCXN0cnVjdCB0dG1fdmFsaWRhdGVfYnVmZmVyICplbnRyeTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksIGxpc3QsIGhlYWQpIHsKKwkJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9IGVudHJ5LT5ibzsKKwkJc3RydWN0IHR0bV9ib19kcml2ZXIgKmRyaXZlciA9IGJvLT5iZGV2LT5kcml2ZXI7CisJCXZvaWQgKm9sZF9zeW5jX29iajsKKworCQlzcGluX2xvY2soJmJvLT5sb2NrKTsKKwkJb2xkX3N5bmNfb2JqID0gYm8tPnN5bmNfb2JqOworCQliby0+c3luY19vYmogPSBkcml2ZXItPnN5bmNfb2JqX3JlZihzeW5jX29iaik7CisJCWJvLT5zeW5jX29ial9hcmcgPSBlbnRyeS0+bmV3X3N5bmNfb2JqX2FyZzsKKwkJc3Bpbl91bmxvY2soJmJvLT5sb2NrKTsKKwkJdHRtX2JvX3VucmVzZXJ2ZShibyk7CisJCWVudHJ5LT5yZXNlcnZlZCA9IGZhbHNlOworCQlpZiAob2xkX3N5bmNfb2JqKQorCQkJZHJpdmVyLT5zeW5jX29ial91bnJlZigmb2xkX3N5bmNfb2JqKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHR0bV9ldV9mZW5jZV9idWZmZXJfb2JqZWN0cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9sb2NrLmMgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxOWViYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2xvY2suYwpAQCAtMCwwICsxLDMxMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDkgVk13YXJlLCBJbmMuLCBQYWxvIEFsdG8sIENBLiwgVVNBCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQXV0aG9yczogVGhvbWFzIEhlbGxzdHJvbSA8dGhlbGxzdHJvbS1hdC12bXdhcmUtZG90LWNvbT4KKyAqLworCisjaW5jbHVkZSAidHRtL3R0bV9sb2NrLmgiCisjaW5jbHVkZSAidHRtL3R0bV9tb2R1bGUuaCIKKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2RlZmluZSBUVE1fV1JJVEVfTE9DS19QRU5ESU5HICAgICgxIDw8IDApCisjZGVmaW5lIFRUTV9WVF9MT0NLX1BFTkRJTkcgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgVFRNX1NVU1BFTkRfTE9DS19QRU5ESU5HICAoMSA8PCAyKQorI2RlZmluZSBUVE1fVlRfTE9DSyAgICAgICAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIFRUTV9TVVNQRU5EX0xPQ0sgICAgICAgICAgKDEgPDwgNCkKKwordm9pZCB0dG1fbG9ja19pbml0KHN0cnVjdCB0dG1fbG9jayAqbG9jaykKK3sKKwlzcGluX2xvY2tfaW5pdCgmbG9jay0+bG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbG9jay0+cXVldWUpOworCWxvY2stPnJ3ID0gMDsKKwlsb2NrLT5mbGFncyA9IDA7CisJbG9jay0+a2lsbF90YWtlcnMgPSBmYWxzZTsKKwlsb2NrLT5zaWduYWwgPSBTSUdLSUxMOworfQorRVhQT1JUX1NZTUJPTCh0dG1fbG9ja19pbml0KTsKKwordm9pZCB0dG1fcmVhZF91bmxvY2soc3RydWN0IHR0bV9sb2NrICpsb2NrKQoreworCXNwaW5fbG9jaygmbG9jay0+bG9jayk7CisJaWYgKC0tbG9jay0+cncgPT0gMCkKKwkJd2FrZV91cF9hbGwoJmxvY2stPnF1ZXVlKTsKKwlzcGluX3VubG9jaygmbG9jay0+bG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKHR0bV9yZWFkX3VubG9jayk7CisKK3N0YXRpYyBib29sIF9fdHRtX3JlYWRfbG9jayhzdHJ1Y3QgdHRtX2xvY2sgKmxvY2spCit7CisJYm9vbCBsb2NrZWQgPSBmYWxzZTsKKworCXNwaW5fbG9jaygmbG9jay0+bG9jayk7CisJaWYgKHVubGlrZWx5KGxvY2stPmtpbGxfdGFrZXJzKSkgeworCQlzZW5kX3NpZyhsb2NrLT5zaWduYWwsIGN1cnJlbnQsIDApOworCQlzcGluX3VubG9jaygmbG9jay0+bG9jayk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGxvY2stPnJ3ID49IDAgJiYgbG9jay0+ZmxhZ3MgPT0gMCkgeworCQkrK2xvY2stPnJ3OworCQlsb2NrZWQgPSB0cnVlOworCX0KKwlzcGluX3VubG9jaygmbG9jay0+bG9jayk7CisJcmV0dXJuIGxvY2tlZDsKK30KKworaW50IHR0bV9yZWFkX2xvY2soc3RydWN0IHR0bV9sb2NrICpsb2NrLCBib29sIGludGVycnVwdGlibGUpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoaW50ZXJydXB0aWJsZSkKKwkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGxvY2stPnF1ZXVlLAorCQkJCQkgICAgICAgX190dG1fcmVhZF9sb2NrKGxvY2spKTsKKwllbHNlCisJCXdhaXRfZXZlbnQobG9jay0+cXVldWUsIF9fdHRtX3JlYWRfbG9jayhsb2NrKSk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodHRtX3JlYWRfbG9jayk7CisKK3N0YXRpYyBib29sIF9fdHRtX3JlYWRfdHJ5bG9jayhzdHJ1Y3QgdHRtX2xvY2sgKmxvY2ssIGJvb2wgKmxvY2tlZCkKK3sKKwlib29sIGJsb2NrID0gdHJ1ZTsKKworCSpsb2NrZWQgPSBmYWxzZTsKKworCXNwaW5fbG9jaygmbG9jay0+bG9jayk7CisJaWYgKHVubGlrZWx5KGxvY2stPmtpbGxfdGFrZXJzKSkgeworCQlzZW5kX3NpZyhsb2NrLT5zaWduYWwsIGN1cnJlbnQsIDApOworCQlzcGluX3VubG9jaygmbG9jay0+bG9jayk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGxvY2stPnJ3ID49IDAgJiYgbG9jay0+ZmxhZ3MgPT0gMCkgeworCQkrK2xvY2stPnJ3OworCQlibG9jayA9IGZhbHNlOworCQkqbG9ja2VkID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKGxvY2stPmZsYWdzID09IDApIHsKKwkJYmxvY2sgPSBmYWxzZTsKKwl9CisJc3Bpbl91bmxvY2soJmxvY2stPmxvY2spOworCisJcmV0dXJuICFibG9jazsKK30KKworaW50IHR0bV9yZWFkX3RyeWxvY2soc3RydWN0IHR0bV9sb2NrICpsb2NrLCBib29sIGludGVycnVwdGlibGUpCit7CisJaW50IHJldCA9IDA7CisJYm9vbCBsb2NrZWQ7CisKKwlpZiAoaW50ZXJydXB0aWJsZSkKKwkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlCisJCQkobG9jay0+cXVldWUsIF9fdHRtX3JlYWRfdHJ5bG9jayhsb2NrLCAmbG9ja2VkKSk7CisJZWxzZQorCQl3YWl0X2V2ZW50KGxvY2stPnF1ZXVlLCBfX3R0bV9yZWFkX3RyeWxvY2sobG9jaywgJmxvY2tlZCkpOworCisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQlCVUdfT04obG9ja2VkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gKGxvY2tlZCkgPyAwIDogLUVCVVNZOworfQorCit2b2lkIHR0bV93cml0ZV91bmxvY2soc3RydWN0IHR0bV9sb2NrICpsb2NrKQoreworCXNwaW5fbG9jaygmbG9jay0+bG9jayk7CisJbG9jay0+cncgPSAwOworCXdha2VfdXBfYWxsKCZsb2NrLT5xdWV1ZSk7CisJc3Bpbl91bmxvY2soJmxvY2stPmxvY2spOworfQorRVhQT1JUX1NZTUJPTCh0dG1fd3JpdGVfdW5sb2NrKTsKKworc3RhdGljIGJvb2wgX190dG1fd3JpdGVfbG9jayhzdHJ1Y3QgdHRtX2xvY2sgKmxvY2spCit7CisJYm9vbCBsb2NrZWQgPSBmYWxzZTsKKworCXNwaW5fbG9jaygmbG9jay0+bG9jayk7CisJaWYgKHVubGlrZWx5KGxvY2stPmtpbGxfdGFrZXJzKSkgeworCQlzZW5kX3NpZyhsb2NrLT5zaWduYWwsIGN1cnJlbnQsIDApOworCQlzcGluX3VubG9jaygmbG9jay0+bG9jayk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGxvY2stPnJ3ID09IDAgJiYgKChsb2NrLT5mbGFncyAmIH5UVE1fV1JJVEVfTE9DS19QRU5ESU5HKSA9PSAwKSkgeworCQlsb2NrLT5ydyA9IC0xOworCQlsb2NrLT5mbGFncyAmPSB+VFRNX1dSSVRFX0xPQ0tfUEVORElORzsKKwkJbG9ja2VkID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlsb2NrLT5mbGFncyB8PSBUVE1fV1JJVEVfTE9DS19QRU5ESU5HOworCX0KKwlzcGluX3VubG9jaygmbG9jay0+bG9jayk7CisJcmV0dXJuIGxvY2tlZDsKK30KKworaW50IHR0bV93cml0ZV9sb2NrKHN0cnVjdCB0dG1fbG9jayAqbG9jaywgYm9vbCBpbnRlcnJ1cHRpYmxlKQoreworCWludCByZXQgPSAwOworCisJaWYgKGludGVycnVwdGlibGUpIHsKKwkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGxvY2stPnF1ZXVlLAorCQkJCQkgICAgICAgX190dG1fd3JpdGVfbG9jayhsb2NrKSk7CisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJCXNwaW5fbG9jaygmbG9jay0+bG9jayk7CisJCQlsb2NrLT5mbGFncyAmPSB+VFRNX1dSSVRFX0xPQ0tfUEVORElORzsKKwkJCXdha2VfdXBfYWxsKCZsb2NrLT5xdWV1ZSk7CisJCQlzcGluX3VubG9jaygmbG9jay0+bG9jayk7CisJCX0KKwl9IGVsc2UKKwkJd2FpdF9ldmVudChsb2NrLT5xdWV1ZSwgX190dG1fcmVhZF9sb2NrKGxvY2spKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHR0bV93cml0ZV9sb2NrKTsKKwordm9pZCB0dG1fd3JpdGVfbG9ja19kb3duZ3JhZGUoc3RydWN0IHR0bV9sb2NrICpsb2NrKQoreworCXNwaW5fbG9jaygmbG9jay0+bG9jayk7CisJbG9jay0+cncgPSAxOworCXdha2VfdXBfYWxsKCZsb2NrLT5xdWV1ZSk7CisJc3Bpbl91bmxvY2soJmxvY2stPmxvY2spOworfQorCitzdGF0aWMgaW50IF9fdHRtX3Z0X3VubG9jayhzdHJ1Y3QgdHRtX2xvY2sgKmxvY2spCit7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2soJmxvY2stPmxvY2spOworCWlmICh1bmxpa2VseSghKGxvY2stPmZsYWdzICYgVFRNX1ZUX0xPQ0spKSkKKwkJcmV0ID0gLUVJTlZBTDsKKwlsb2NrLT5mbGFncyAmPSB+VFRNX1ZUX0xPQ0s7CisJd2FrZV91cF9hbGwoJmxvY2stPnF1ZXVlKTsKKwlzcGluX3VubG9jaygmbG9jay0+bG9jayk7CisJcHJpbnRrKEtFUk5fSU5GTyBUVE1fUEZYICJ2dCB1bmxvY2suXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHR0bV92dF9sb2NrX3JlbW92ZShzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0ICoqcF9iYXNlKQoreworCXN0cnVjdCB0dG1fYmFzZV9vYmplY3QgKmJhc2UgPSAqcF9iYXNlOworCXN0cnVjdCB0dG1fbG9jayAqbG9jayA9IGNvbnRhaW5lcl9vZihiYXNlLCBzdHJ1Y3QgdHRtX2xvY2ssIGJhc2UpOworCWludCByZXQ7CisKKwkqcF9iYXNlID0gTlVMTDsKKwlyZXQgPSBfX3R0bV92dF91bmxvY2sobG9jayk7CisJQlVHX09OKHJldCAhPSAwKTsKK30KKworc3RhdGljIGJvb2wgX190dG1fdnRfbG9jayhzdHJ1Y3QgdHRtX2xvY2sgKmxvY2spCit7CisJYm9vbCBsb2NrZWQgPSBmYWxzZTsKKworCXNwaW5fbG9jaygmbG9jay0+bG9jayk7CisJaWYgKGxvY2stPnJ3ID09IDApIHsKKwkJbG9jay0+ZmxhZ3MgJj0gflRUTV9WVF9MT0NLX1BFTkRJTkc7CisJCWxvY2stPmZsYWdzIHw9IFRUTV9WVF9MT0NLOworCQlsb2NrZWQgPSB0cnVlOworCX0gZWxzZSB7CisJCWxvY2stPmZsYWdzIHw9IFRUTV9WVF9MT0NLX1BFTkRJTkc7CisJfQorCXNwaW5fdW5sb2NrKCZsb2NrLT5sb2NrKTsKKwlyZXR1cm4gbG9ja2VkOworfQorCitpbnQgdHRtX3Z0X2xvY2soc3RydWN0IHR0bV9sb2NrICpsb2NrLAorCQlib29sIGludGVycnVwdGlibGUsCisJCXN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlKQoreworCWludCByZXQgPSAwOworCisJaWYgKGludGVycnVwdGlibGUpIHsKKwkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGxvY2stPnF1ZXVlLAorCQkJCQkgICAgICAgX190dG1fdnRfbG9jayhsb2NrKSk7CisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJCXNwaW5fbG9jaygmbG9jay0+bG9jayk7CisJCQlsb2NrLT5mbGFncyAmPSB+VFRNX1ZUX0xPQ0tfUEVORElORzsKKwkJCXdha2VfdXBfYWxsKCZsb2NrLT5xdWV1ZSk7CisJCQlzcGluX3VubG9jaygmbG9jay0+bG9jayk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfSBlbHNlCisJCXdhaXRfZXZlbnQobG9jay0+cXVldWUsIF9fdHRtX3Z0X2xvY2sobG9jaykpOworCisJLyoKKwkgKiBBZGQgYSBiYXNlLW9iamVjdCwgdGhlIGRlc3RydWN0b3Igb2Ygd2hpY2ggd2lsbAorCSAqIG1ha2Ugc3VyZSB0aGUgbG9jayBpcyByZWxlYXNlZCBpZiB0aGUgY2xpZW50IGRpZXMKKwkgKiB3aGlsZSBob2xkaW5nIGl0LgorCSAqLworCisJcmV0ID0gdHRtX2Jhc2Vfb2JqZWN0X2luaXQodGZpbGUsICZsb2NrLT5iYXNlLCBmYWxzZSwKKwkJCQkgICB0dG1fbG9ja190eXBlLCAmdHRtX3Z0X2xvY2tfcmVtb3ZlLCBOVUxMKTsKKwlpZiAocmV0KQorCQkodm9pZClfX3R0bV92dF91bmxvY2sobG9jayk7CisJZWxzZSB7CisJCWxvY2stPnZ0X2hvbGRlciA9IHRmaWxlOworCQlwcmludGsoS0VSTl9JTkZPIFRUTV9QRlggInZ0IGxvY2suXG4iKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh0dG1fdnRfbG9jayk7CisKK2ludCB0dG1fdnRfdW5sb2NrKHN0cnVjdCB0dG1fbG9jayAqbG9jaykKK3sKKwlyZXR1cm4gdHRtX3JlZl9vYmplY3RfYmFzZV91bnJlZihsb2NrLT52dF9ob2xkZXIsCisJCQkJCSBsb2NrLT5iYXNlLmhhc2gua2V5LCBUVE1fUkVGX1VTQUdFKTsKK30KK0VYUE9SVF9TWU1CT0wodHRtX3Z0X3VubG9jayk7CisKK3ZvaWQgdHRtX3N1c3BlbmRfdW5sb2NrKHN0cnVjdCB0dG1fbG9jayAqbG9jaykKK3sKKwlzcGluX2xvY2soJmxvY2stPmxvY2spOworCWxvY2stPmZsYWdzICY9IH5UVE1fU1VTUEVORF9MT0NLOworCXdha2VfdXBfYWxsKCZsb2NrLT5xdWV1ZSk7CisJc3Bpbl91bmxvY2soJmxvY2stPmxvY2spOworfQorCitzdGF0aWMgYm9vbCBfX3R0bV9zdXNwZW5kX2xvY2soc3RydWN0IHR0bV9sb2NrICpsb2NrKQoreworCWJvb2wgbG9ja2VkID0gZmFsc2U7CisKKwlzcGluX2xvY2soJmxvY2stPmxvY2spOworCWlmIChsb2NrLT5ydyA9PSAwKSB7CisJCWxvY2stPmZsYWdzICY9IH5UVE1fU1VTUEVORF9MT0NLX1BFTkRJTkc7CisJCWxvY2stPmZsYWdzIHw9IFRUTV9TVVNQRU5EX0xPQ0s7CisJCWxvY2tlZCA9IHRydWU7CisJfSBlbHNlIHsKKwkJbG9jay0+ZmxhZ3MgfD0gVFRNX1NVU1BFTkRfTE9DS19QRU5ESU5HOworCX0KKwlzcGluX3VubG9jaygmbG9jay0+bG9jayk7CisJcmV0dXJuIGxvY2tlZDsKK30KKwordm9pZCB0dG1fc3VzcGVuZF9sb2NrKHN0cnVjdCB0dG1fbG9jayAqbG9jaykKK3sKKwl3YWl0X2V2ZW50KGxvY2stPnF1ZXVlLCBfX3R0bV9zdXNwZW5kX2xvY2sobG9jaykpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fbWVtb3J5LmMgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9tZW1vcnkuYwppbmRleCAwNzJjMjgxYS4uZjUyNDVjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fbWVtb3J5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fbWVtb3J5LmMKQEAgLTI3NCwxNiArMjc0LDE3IEBACiBzdGF0aWMgaW50IHR0bV9tZW1faW5pdF9oaWdobWVtX3pvbmUoc3RydWN0IHR0bV9tZW1fZ2xvYmFsICpnbG9iLAogCQkJCSAgICAgY29uc3Qgc3RydWN0IHN5c2luZm8gKnNpKQogewotCXN0cnVjdCB0dG1fbWVtX3pvbmUgKnpvbmUgPSBremFsbG9jKHNpemVvZigqem9uZSksIEdGUF9LRVJORUwpOworCXN0cnVjdCB0dG1fbWVtX3pvbmUgKnpvbmU7CiAJdWludDY0X3QgbWVtOwogCWludCByZXQ7CiAKLQlpZiAodW5saWtlbHkoIXpvbmUpKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCWlmIChzaS0+dG90YWxoaWdoID09IDApCiAJCXJldHVybiAwOwogCisJem9uZSA9IGt6YWxsb2Moc2l6ZW9mKCp6b25lKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCF6b25lKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAltZW0gPSBzaS0+dG90YWxyYW07CiAJbWVtICo9IHNpLT5tZW1fdW5pdDsKIApAQCAtMzIyLDggKzMyMywxMCBAQAogCSAqIE5vIHNwZWNpYWwgZG1hMzIgem9uZSBuZWVkZWQuCiAJICovCiAKLQlpZiAobWVtIDw9ICgodWludDY0X3QpIDFVTEwgPDwgMzIpKQorCWlmIChtZW0gPD0gKCh1aW50NjRfdCkgMVVMTCA8PCAzMikpIHsKKwkJa2ZyZWUoem9uZSk7CiAJCXJldHVybiAwOworCX0KIAogCS8qCiAJICogTGltaXQgbWF4IGRtYTMyIG1lbW9yeSB0byA0R0IgZm9yIG5vdwpAQCAtNDYwLDYgKzQ2Myw3IEBACiB7CiAJcmV0dXJuIHR0bV9tZW1fZ2xvYmFsX2ZyZWVfem9uZShnbG9iLCBOVUxMLCBhbW91bnQpOwogfQorRVhQT1JUX1NZTUJPTCh0dG1fbWVtX2dsb2JhbF9mcmVlKTsKIAogc3RhdGljIGludCB0dG1fbWVtX2dsb2JhbF9yZXNlcnZlKHN0cnVjdCB0dG1fbWVtX2dsb2JhbCAqZ2xvYiwKIAkJCQkgIHN0cnVjdCB0dG1fbWVtX3pvbmUgKnNpbmdsZV96b25lLApAQCAtNTMzLDYgKzUzNyw3IEBACiAJcmV0dXJuIHR0bV9tZW1fZ2xvYmFsX2FsbG9jX3pvbmUoZ2xvYiwgTlVMTCwgbWVtb3J5LCBub193YWl0LAogCQkJCQkgaW50ZXJydXB0aWJsZSk7CiB9CitFWFBPUlRfU1lNQk9MKHR0bV9tZW1fZ2xvYmFsX2FsbG9jKTsKIAogaW50IHR0bV9tZW1fZ2xvYmFsX2FsbG9jX3BhZ2Uoc3RydWN0IHR0bV9tZW1fZ2xvYmFsICpnbG9iLAogCQkJICAgICAgc3RydWN0IHBhZ2UgKnBhZ2UsCkBAIC01ODgsMyArNTkzLDQgQEAKIAl9CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHR0bV9yb3VuZF9wb3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fb2JqZWN0LmMgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9vYmplY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDk5YWJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fb2JqZWN0LmMKQEAgLTAsMCArMSw0NTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBBdXRob3JzOiBUaG9tYXMgSGVsbHN0cm9tIDx0aGVsbHN0cm9tLWF0LXZtd2FyZS1kb3QtY29tPgorICovCisvKiogQGZpbGUgdHRtX3JlZl9vYmplY3QuYworICoKKyAqIEJhc2UtIGFuZCByZWZlcmVuY2Ugb2JqZWN0IGltcGxlbWVudGF0aW9uIGZvciB0aGUgdmFyaW91cworICogdHRtIG9iamVjdHMuIEltcGxlbWVudHMgcmVmZXJlbmNlIGNvdW50aW5nLCBtaW5pbWFsIHNlY3VyaXR5IGNoZWNrcworICogYW5kIHJlbGVhc2Ugb24gZmlsZSBjbG9zZS4KKyAqLworCisvKioKKyAqIHN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUKKyAqCisgKiBAdGRldjogUG9pbnRlciB0byB0aGUgdHRtX29iamVjdF9kZXZpY2UuCisgKgorICogQGxvY2s6IExvY2sgdGhhdCBwcm90ZWN0cyB0aGUgcmVmX2xpc3QgbGlzdCBhbmQgdGhlCisgKiByZWZfaGFzaCBoYXNoIHRhYmxlcy4KKyAqCisgKiBAcmVmX2xpc3Q6IExpc3Qgb2YgdHRtX3JlZl9vYmplY3RzIHRvIGJlIGRlc3Ryb3llZCBhdAorICogZmlsZSByZWxlYXNlLgorICoKKyAqIEByZWZfaGFzaDogSGFzaCB0YWJsZXMgb2YgcmVmIG9iamVjdHMsIG9uZSBwZXIgdHRtX3JlZl90eXBlLAorICogZm9yIGZhc3QgbG9va3VwIG9mIHJlZiBvYmplY3RzIGdpdmVuIGEgYmFzZSBvYmplY3QuCisgKi8KKworI2luY2x1ZGUgInR0bS90dG1fb2JqZWN0LmgiCisjaW5jbHVkZSAidHRtL3R0bV9tb2R1bGUuaCIKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCitzdHJ1Y3QgdHRtX29iamVjdF9maWxlIHsKKwlzdHJ1Y3QgdHRtX29iamVjdF9kZXZpY2UgKnRkZXY7CisJcndsb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlZl9saXN0OworCXN0cnVjdCBkcm1fb3Blbl9oYXNoIHJlZl9oYXNoW1RUTV9SRUZfTlVNXTsKKwlzdHJ1Y3Qga3JlZiByZWZjb3VudDsKK307CisKKy8qKgorICogc3RydWN0IHR0bV9vYmplY3RfZGV2aWNlCisgKgorICogQG9iamVjdF9sb2NrOiBsb2NrIHRoYXQgcHJvdGVjdHMgdGhlIG9iamVjdF9oYXNoIGhhc2ggdGFibGUuCisgKgorICogQG9iamVjdF9oYXNoOiBoYXNoIHRhYmxlIGZvciBmYXN0IGxvb2t1cCBvZiBvYmplY3QgZ2xvYmFsIG5hbWVzLgorICoKKyAqIEBvYmplY3RfY291bnQ6IFBlciBkZXZpY2Ugb2JqZWN0IGNvdW50LgorICoKKyAqIFRoaXMgaXMgdGhlIHBlci1kZXZpY2UgZGF0YSBzdHJ1Y3R1cmUgbmVlZGVkIGZvciB0dG0gb2JqZWN0IG1hbmFnZW1lbnQuCisgKi8KKworc3RydWN0IHR0bV9vYmplY3RfZGV2aWNlIHsKKwlyd2xvY2tfdCBvYmplY3RfbG9jazsKKwlzdHJ1Y3QgZHJtX29wZW5faGFzaCBvYmplY3RfaGFzaDsKKwlhdG9taWNfdCBvYmplY3RfY291bnQ7CisJc3RydWN0IHR0bV9tZW1fZ2xvYmFsICptZW1fZ2xvYjsKK307CisKKy8qKgorICogc3RydWN0IHR0bV9yZWZfb2JqZWN0CisgKgorICogQGhhc2g6IEhhc2ggZW50cnkgZm9yIHRoZSBwZXItZmlsZSBvYmplY3QgcmVmZXJlbmNlIGhhc2guCisgKgorICogQGhlYWQ6IExpc3QgZW50cnkgZm9yIHRoZSBwZXItZmlsZSBsaXN0IG9mIHJlZi1vYmplY3RzLgorICoKKyAqIEBrcmVmOiBSZWYgY291bnQuCisgKgorICogQG9iajogQmFzZSBvYmplY3QgdGhpcyByZWYgb2JqZWN0IGlzIHJlZmVyZW5jaW5nLgorICoKKyAqIEByZWZfdHlwZTogVHlwZSBvZiByZWYgb2JqZWN0LgorICoKKyAqIFRoaXMgaXMgc2ltaWxhciB0byBhbiBpZHIgb2JqZWN0LCBidXQgaXQgYWxzbyBoYXMgYSBoYXNoIHRhYmxlIGVudHJ5CisgKiB0aGF0IGFsbG93cyBsb29rdXAgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0IGFzIGEga2V5LiBJbgorICogdGhhdCB3YXksIG9uZSBjYW4gZWFzaWx5IGRldGVjdCB3aGV0aGVyIGEgYmFzZSBvYmplY3QgaXMgcmVmZXJlbmNlZCBieQorICogYSBwYXJ0aWN1bGFyIHR0bV9vYmplY3RfZmlsZS4gSXQgYWxzbyBjYXJyaWVzIGEgcmVmIGNvdW50IHRvIGF2b2lkIGNyZWF0aW5nCisgKiBtdWx0aXBsZSByZWYgb2JqZWN0cyBpZiBhIHR0bV9vYmplY3RfZmlsZSByZWZlcmVuY2VzIHRoZSBzYW1lIGJhc2UKKyAqIG9iamVjdCBtb3JlIHRoYW4gb25jZS4KKyAqLworCitzdHJ1Y3QgdHRtX3JlZl9vYmplY3QgeworCXN0cnVjdCBkcm1faGFzaF9pdGVtIGhhc2g7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCXN0cnVjdCBrcmVmIGtyZWY7CisJc3RydWN0IHR0bV9iYXNlX29iamVjdCAqb2JqOworCWVudW0gdHRtX3JlZl90eXBlIHJlZl90eXBlOworCXN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdHRtX29iamVjdF9maWxlICoKK3R0bV9vYmplY3RfZmlsZV9yZWYoc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUpCit7CisJa3JlZl9nZXQoJnRmaWxlLT5yZWZjb3VudCk7CisJcmV0dXJuIHRmaWxlOworfQorCitzdGF0aWMgdm9pZCB0dG1fb2JqZWN0X2ZpbGVfZGVzdHJveShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSA9CisJCWNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgdHRtX29iamVjdF9maWxlLCByZWZjb3VudCk7CisKKwlrZnJlZSh0ZmlsZSk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHR0bV9vYmplY3RfZmlsZV91bnJlZihzdHJ1Y3QgdHRtX29iamVjdF9maWxlICoqcF90ZmlsZSkKK3sKKwlzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSA9ICpwX3RmaWxlOworCisJKnBfdGZpbGUgPSBOVUxMOworCWtyZWZfcHV0KCZ0ZmlsZS0+cmVmY291bnQsIHR0bV9vYmplY3RfZmlsZV9kZXN0cm95KTsKK30KKworCitpbnQgdHRtX2Jhc2Vfb2JqZWN0X2luaXQoc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUsCisJCQkgc3RydWN0IHR0bV9iYXNlX29iamVjdCAqYmFzZSwKKwkJCSBib29sIHNoYXJlYWJsZSwKKwkJCSBlbnVtIHR0bV9vYmplY3RfdHlwZSBvYmplY3RfdHlwZSwKKwkJCSB2b2lkICgqcmVmY291bnRfcmVsZWFzZSkgKHN0cnVjdCB0dG1fYmFzZV9vYmplY3QgKiopLAorCQkJIHZvaWQgKCpyZWZfb2JqX3JlbGVhc2UpIChzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0ICosCisJCQkJCQkgIGVudW0gdHRtX3JlZl90eXBlIHJlZl90eXBlKSkKK3sKKwlzdHJ1Y3QgdHRtX29iamVjdF9kZXZpY2UgKnRkZXYgPSB0ZmlsZS0+dGRldjsKKwlpbnQgcmV0OworCisJYmFzZS0+c2hhcmVhYmxlID0gc2hhcmVhYmxlOworCWJhc2UtPnRmaWxlID0gdHRtX29iamVjdF9maWxlX3JlZih0ZmlsZSk7CisJYmFzZS0+cmVmY291bnRfcmVsZWFzZSA9IHJlZmNvdW50X3JlbGVhc2U7CisJYmFzZS0+cmVmX29ial9yZWxlYXNlID0gcmVmX29ial9yZWxlYXNlOworCWJhc2UtPm9iamVjdF90eXBlID0gb2JqZWN0X3R5cGU7CisJd3JpdGVfbG9jaygmdGRldi0+b2JqZWN0X2xvY2spOworCWtyZWZfaW5pdCgmYmFzZS0+cmVmY291bnQpOworCXJldCA9IGRybV9odF9qdXN0X2luc2VydF9wbGVhc2UoJnRkZXYtPm9iamVjdF9oYXNoLAorCQkJCQkmYmFzZS0+aGFzaCwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpYmFzZSwgMzEsIDAsIDApOworCXdyaXRlX3VubG9jaygmdGRldi0+b2JqZWN0X2xvY2spOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gb3V0X2VycjA7CisKKwlyZXQgPSB0dG1fcmVmX29iamVjdF9hZGQodGZpbGUsIGJhc2UsIFRUTV9SRUZfVVNBR0UsIE5VTEwpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gb3V0X2VycjE7CisKKwl0dG1fYmFzZV9vYmplY3RfdW5yZWYoJmJhc2UpOworCisJcmV0dXJuIDA7CitvdXRfZXJyMToKKwkodm9pZClkcm1faHRfcmVtb3ZlX2l0ZW0oJnRkZXYtPm9iamVjdF9oYXNoLCAmYmFzZS0+aGFzaCk7CitvdXRfZXJyMDoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh0dG1fYmFzZV9vYmplY3RfaW5pdCk7CisKK3N0YXRpYyB2b2lkIHR0bV9yZWxlYXNlX2Jhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHR0bV9iYXNlX29iamVjdCAqYmFzZSA9CisJICAgIGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0LCByZWZjb3VudCk7CisJc3RydWN0IHR0bV9vYmplY3RfZGV2aWNlICp0ZGV2ID0gYmFzZS0+dGZpbGUtPnRkZXY7CisKKwkodm9pZClkcm1faHRfcmVtb3ZlX2l0ZW0oJnRkZXYtPm9iamVjdF9oYXNoLCAmYmFzZS0+aGFzaCk7CisJd3JpdGVfdW5sb2NrKCZ0ZGV2LT5vYmplY3RfbG9jayk7CisJaWYgKGJhc2UtPnJlZmNvdW50X3JlbGVhc2UpIHsKKwkJdHRtX29iamVjdF9maWxlX3VucmVmKCZiYXNlLT50ZmlsZSk7CisJCWJhc2UtPnJlZmNvdW50X3JlbGVhc2UoJmJhc2UpOworCX0KKwl3cml0ZV9sb2NrKCZ0ZGV2LT5vYmplY3RfbG9jayk7Cit9CisKK3ZvaWQgdHRtX2Jhc2Vfb2JqZWN0X3VucmVmKHN0cnVjdCB0dG1fYmFzZV9vYmplY3QgKipwX2Jhc2UpCit7CisJc3RydWN0IHR0bV9iYXNlX29iamVjdCAqYmFzZSA9ICpwX2Jhc2U7CisJc3RydWN0IHR0bV9vYmplY3RfZGV2aWNlICp0ZGV2ID0gYmFzZS0+dGZpbGUtPnRkZXY7CisKKwkqcF9iYXNlID0gTlVMTDsKKworCS8qCisJICogTmVlZCB0byB0YWtlIHRoZSBsb2NrIGhlcmUgdG8gYXZvaWQgcmFjaW5nIHdpdGgKKwkgKiB1c2VycyB0cnlpbmcgdG8gbG9vayB1cCB0aGUgb2JqZWN0LgorCSAqLworCisJd3JpdGVfbG9jaygmdGRldi0+b2JqZWN0X2xvY2spOworCSh2b2lkKWtyZWZfcHV0KCZiYXNlLT5yZWZjb3VudCwgJnR0bV9yZWxlYXNlX2Jhc2UpOworCXdyaXRlX3VubG9jaygmdGRldi0+b2JqZWN0X2xvY2spOworfQorRVhQT1JUX1NZTUJPTCh0dG1fYmFzZV9vYmplY3RfdW5yZWYpOworCitzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0ICp0dG1fYmFzZV9vYmplY3RfbG9va3VwKHN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlLAorCQkJCQkgICAgICAgdWludDMyX3Qga2V5KQoreworCXN0cnVjdCB0dG1fb2JqZWN0X2RldmljZSAqdGRldiA9IHRmaWxlLT50ZGV2OworCXN0cnVjdCB0dG1fYmFzZV9vYmplY3QgKmJhc2U7CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gKmhhc2g7CisJaW50IHJldDsKKworCXJlYWRfbG9jaygmdGRldi0+b2JqZWN0X2xvY2spOworCXJldCA9IGRybV9odF9maW5kX2l0ZW0oJnRkZXYtPm9iamVjdF9oYXNoLCBrZXksICZoYXNoKTsKKworCWlmIChsaWtlbHkocmV0ID09IDApKSB7CisJCWJhc2UgPSBkcm1faGFzaF9lbnRyeShoYXNoLCBzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0LCBoYXNoKTsKKwkJa3JlZl9nZXQoJmJhc2UtPnJlZmNvdW50KTsKKwl9CisJcmVhZF91bmxvY2soJnRkZXYtPm9iamVjdF9sb2NrKTsKKworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCXJldHVybiBOVUxMOworCisJaWYgKHRmaWxlICE9IGJhc2UtPnRmaWxlICYmICFiYXNlLT5zaGFyZWFibGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFRUTV9QRlgKKwkJICAgICAgICJBdHRlbXB0ZWQgYWNjZXNzIG9mIG5vbi1zaGFyZWFibGUgb2JqZWN0LlxuIik7CisJCXR0bV9iYXNlX29iamVjdF91bnJlZigmYmFzZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBiYXNlOworfQorRVhQT1JUX1NZTUJPTCh0dG1fYmFzZV9vYmplY3RfbG9va3VwKTsKKworaW50IHR0bV9yZWZfb2JqZWN0X2FkZChzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSwKKwkJICAgICAgIHN0cnVjdCB0dG1fYmFzZV9vYmplY3QgKmJhc2UsCisJCSAgICAgICBlbnVtIHR0bV9yZWZfdHlwZSByZWZfdHlwZSwgYm9vbCAqZXhpc3RlZCkKK3sKKwlzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQgPSAmdGZpbGUtPnJlZl9oYXNoW3JlZl90eXBlXTsKKwlzdHJ1Y3QgdHRtX3JlZl9vYmplY3QgKnJlZjsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaGFzaDsKKwlzdHJ1Y3QgdHRtX21lbV9nbG9iYWwgKm1lbV9nbG9iID0gdGZpbGUtPnRkZXYtPm1lbV9nbG9iOworCWludCByZXQgPSAtRUlOVkFMOworCisJaWYgKGV4aXN0ZWQgIT0gTlVMTCkKKwkJKmV4aXN0ZWQgPSB0cnVlOworCisJd2hpbGUgKHJldCA9PSAtRUlOVkFMKSB7CisJCXJlYWRfbG9jaygmdGZpbGUtPmxvY2spOworCQlyZXQgPSBkcm1faHRfZmluZF9pdGVtKGh0LCBiYXNlLT5oYXNoLmtleSwgJmhhc2gpOworCisJCWlmIChyZXQgPT0gMCkgeworCQkJcmVmID0gZHJtX2hhc2hfZW50cnkoaGFzaCwgc3RydWN0IHR0bV9yZWZfb2JqZWN0LCBoYXNoKTsKKwkJCWtyZWZfZ2V0KCZyZWYtPmtyZWYpOworCQkJcmVhZF91bmxvY2soJnRmaWxlLT5sb2NrKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVhZF91bmxvY2soJnRmaWxlLT5sb2NrKTsKKwkJcmV0ID0gdHRtX21lbV9nbG9iYWxfYWxsb2MobWVtX2dsb2IsIHNpemVvZigqcmVmKSwKKwkJCQkJICAgZmFsc2UsIGZhbHNlKTsKKwkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJCXJldHVybiByZXQ7CisJCXJlZiA9IGttYWxsb2Moc2l6ZW9mKCpyZWYpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVubGlrZWx5KHJlZiA9PSBOVUxMKSkgeworCQkJdHRtX21lbV9nbG9iYWxfZnJlZShtZW1fZ2xvYiwgc2l6ZW9mKCpyZWYpKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJcmVmLT5oYXNoLmtleSA9IGJhc2UtPmhhc2gua2V5OworCQlyZWYtPm9iaiA9IGJhc2U7CisJCXJlZi0+dGZpbGUgPSB0ZmlsZTsKKwkJcmVmLT5yZWZfdHlwZSA9IHJlZl90eXBlOworCQlrcmVmX2luaXQoJnJlZi0+a3JlZik7CisKKwkJd3JpdGVfbG9jaygmdGZpbGUtPmxvY2spOworCQlyZXQgPSBkcm1faHRfaW5zZXJ0X2l0ZW0oaHQsICZyZWYtPmhhc2gpOworCisJCWlmIChsaWtlbHkocmV0ID09IDApKSB7CisJCQlsaXN0X2FkZF90YWlsKCZyZWYtPmhlYWQsICZ0ZmlsZS0+cmVmX2xpc3QpOworCQkJa3JlZl9nZXQoJmJhc2UtPnJlZmNvdW50KTsKKwkJCXdyaXRlX3VubG9jaygmdGZpbGUtPmxvY2spOworCQkJaWYgKGV4aXN0ZWQgIT0gTlVMTCkKKwkJCQkqZXhpc3RlZCA9IGZhbHNlOworCQkJYnJlYWs7CisJCX0KKworCQl3cml0ZV91bmxvY2soJnRmaWxlLT5sb2NrKTsKKwkJQlVHX09OKHJldCAhPSAtRUlOVkFMKTsKKworCQl0dG1fbWVtX2dsb2JhbF9mcmVlKG1lbV9nbG9iLCBzaXplb2YoKnJlZikpOworCQlrZnJlZShyZWYpOworCX0KKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHR0bV9yZWZfb2JqZWN0X2FkZCk7CisKK3N0YXRpYyB2b2lkIHR0bV9yZWZfb2JqZWN0X3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHR0bV9yZWZfb2JqZWN0ICpyZWYgPQorCSAgICBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHR0bV9yZWZfb2JqZWN0LCBrcmVmKTsKKwlzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0ICpiYXNlID0gcmVmLT5vYmo7CisJc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUgPSByZWYtPnRmaWxlOworCXN0cnVjdCBkcm1fb3Blbl9oYXNoICpodDsKKwlzdHJ1Y3QgdHRtX21lbV9nbG9iYWwgKm1lbV9nbG9iID0gdGZpbGUtPnRkZXYtPm1lbV9nbG9iOworCisJaHQgPSAmdGZpbGUtPnJlZl9oYXNoW3JlZi0+cmVmX3R5cGVdOworCSh2b2lkKWRybV9odF9yZW1vdmVfaXRlbShodCwgJnJlZi0+aGFzaCk7CisJbGlzdF9kZWwoJnJlZi0+aGVhZCk7CisJd3JpdGVfdW5sb2NrKCZ0ZmlsZS0+bG9jayk7CisKKwlpZiAocmVmLT5yZWZfdHlwZSAhPSBUVE1fUkVGX1VTQUdFICYmIGJhc2UtPnJlZl9vYmpfcmVsZWFzZSkKKwkJYmFzZS0+cmVmX29ial9yZWxlYXNlKGJhc2UsIHJlZi0+cmVmX3R5cGUpOworCisJdHRtX2Jhc2Vfb2JqZWN0X3VucmVmKCZyZWYtPm9iaik7CisJdHRtX21lbV9nbG9iYWxfZnJlZShtZW1fZ2xvYiwgc2l6ZW9mKCpyZWYpKTsKKwlrZnJlZShyZWYpOworCXdyaXRlX2xvY2soJnRmaWxlLT5sb2NrKTsKK30KKworaW50IHR0bV9yZWZfb2JqZWN0X2Jhc2VfdW5yZWYoc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGtleSwgZW51bSB0dG1fcmVmX3R5cGUgcmVmX3R5cGUpCit7CisJc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0ID0gJnRmaWxlLT5yZWZfaGFzaFtyZWZfdHlwZV07CisJc3RydWN0IHR0bV9yZWZfb2JqZWN0ICpyZWY7CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gKmhhc2g7CisJaW50IHJldDsKKworCXdyaXRlX2xvY2soJnRmaWxlLT5sb2NrKTsKKwlyZXQgPSBkcm1faHRfZmluZF9pdGVtKGh0LCBrZXksICZoYXNoKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCXdyaXRlX3VubG9jaygmdGZpbGUtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmVmID0gZHJtX2hhc2hfZW50cnkoaGFzaCwgc3RydWN0IHR0bV9yZWZfb2JqZWN0LCBoYXNoKTsKKwlrcmVmX3B1dCgmcmVmLT5rcmVmLCB0dG1fcmVmX29iamVjdF9yZWxlYXNlKTsKKwl3cml0ZV91bmxvY2soJnRmaWxlLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodHRtX3JlZl9vYmplY3RfYmFzZV91bnJlZik7CisKK3ZvaWQgdHRtX29iamVjdF9maWxlX3JlbGVhc2Uoc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqKnBfdGZpbGUpCit7CisJc3RydWN0IHR0bV9yZWZfb2JqZWN0ICpyZWY7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSA9ICpwX3RmaWxlOworCisJKnBfdGZpbGUgPSBOVUxMOworCXdyaXRlX2xvY2soJnRmaWxlLT5sb2NrKTsKKworCS8qCisJICogU2luY2Ugd2UgcmVsZWFzZSB0aGUgbG9jayB3aXRoaW4gdGhlIGxvb3AsIHdlIGhhdmUgdG8KKwkgKiByZXN0YXJ0IGl0IGZyb20gdGhlIGJlZ2lubmluZyBlYWNoIHRpbWUuCisJICovCisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnRmaWxlLT5yZWZfbGlzdCkpIHsKKwkJbGlzdCA9IHRmaWxlLT5yZWZfbGlzdC5uZXh0OworCQlyZWYgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCB0dG1fcmVmX29iamVjdCwgaGVhZCk7CisJCXR0bV9yZWZfb2JqZWN0X3JlbGVhc2UoJnJlZi0+a3JlZik7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRUTV9SRUZfTlVNOyArK2kpCisJCWRybV9odF9yZW1vdmUoJnRmaWxlLT5yZWZfaGFzaFtpXSk7CisKKwl3cml0ZV91bmxvY2soJnRmaWxlLT5sb2NrKTsKKwl0dG1fb2JqZWN0X2ZpbGVfdW5yZWYoJnRmaWxlKTsKK30KK0VYUE9SVF9TWU1CT0wodHRtX29iamVjdF9maWxlX3JlbGVhc2UpOworCitzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0dG1fb2JqZWN0X2ZpbGVfaW5pdChzdHJ1Y3QgdHRtX29iamVjdF9kZXZpY2UgKnRkZXYsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGhhc2hfb3JkZXIpCit7CisJc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUgPSBrbWFsbG9jKHNpemVvZigqdGZpbGUpLCBHRlBfS0VSTkVMKTsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaiA9IDA7CisJaW50IHJldDsKKworCWlmICh1bmxpa2VseSh0ZmlsZSA9PSBOVUxMKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyd2xvY2tfaW5pdCgmdGZpbGUtPmxvY2spOworCXRmaWxlLT50ZGV2ID0gdGRldjsKKwlrcmVmX2luaXQoJnRmaWxlLT5yZWZjb3VudCk7CisJSU5JVF9MSVNUX0hFQUQoJnRmaWxlLT5yZWZfbGlzdCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVFRNX1JFRl9OVU07ICsraSkgeworCQlyZXQgPSBkcm1faHRfY3JlYXRlKCZ0ZmlsZS0+cmVmX2hhc2hbaV0sIGhhc2hfb3JkZXIpOworCQlpZiAocmV0KSB7CisJCQlqID0gaTsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCX0KKworCXJldHVybiB0ZmlsZTsKK291dF9lcnI6CisJZm9yIChpID0gMDsgaSA8IGo7ICsraSkKKwkJZHJtX2h0X3JlbW92ZSgmdGZpbGUtPnJlZl9oYXNoW2ldKTsKKworCWtmcmVlKHRmaWxlKTsKKworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTCh0dG1fb2JqZWN0X2ZpbGVfaW5pdCk7CisKK3N0cnVjdCB0dG1fb2JqZWN0X2RldmljZSAqdHRtX29iamVjdF9kZXZpY2VfaW5pdChzdHJ1Y3QgdHRtX21lbV9nbG9iYWwKKwkJCQkJCSAqbWVtX2dsb2IsCisJCQkJCQkgdW5zaWduZWQgaW50IGhhc2hfb3JkZXIpCit7CisJc3RydWN0IHR0bV9vYmplY3RfZGV2aWNlICp0ZGV2ID0ga21hbGxvYyhzaXplb2YoKnRkZXYpLCBHRlBfS0VSTkVMKTsKKwlpbnQgcmV0OworCisJaWYgKHVubGlrZWx5KHRkZXYgPT0gTlVMTCkpCisJCXJldHVybiBOVUxMOworCisJdGRldi0+bWVtX2dsb2IgPSBtZW1fZ2xvYjsKKwlyd2xvY2tfaW5pdCgmdGRldi0+b2JqZWN0X2xvY2spOworCWF0b21pY19zZXQoJnRkZXYtPm9iamVjdF9jb3VudCwgMCk7CisJcmV0ID0gZHJtX2h0X2NyZWF0ZSgmdGRldi0+b2JqZWN0X2hhc2gsIGhhc2hfb3JkZXIpOworCisJaWYgKGxpa2VseShyZXQgPT0gMCkpCisJCXJldHVybiB0ZGV2OworCisJa2ZyZWUodGRldik7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKHR0bV9vYmplY3RfZGV2aWNlX2luaXQpOworCit2b2lkIHR0bV9vYmplY3RfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IHR0bV9vYmplY3RfZGV2aWNlICoqcF90ZGV2KQoreworCXN0cnVjdCB0dG1fb2JqZWN0X2RldmljZSAqdGRldiA9ICpwX3RkZXY7CisKKwkqcF90ZGV2ID0gTlVMTDsKKworCXdyaXRlX2xvY2soJnRkZXYtPm9iamVjdF9sb2NrKTsKKwlkcm1faHRfcmVtb3ZlKCZ0ZGV2LT5vYmplY3RfaGFzaCk7CisJd3JpdGVfdW5sb2NrKCZ0ZGV2LT5vYmplY3RfbG9jayk7CisKKwlrZnJlZSh0ZGV2KTsKK30KK0VYUE9SVF9TWU1CT0wodHRtX29iamVjdF9kZXZpY2VfcmVsZWFzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV90dC5jIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fdHQuYwppbmRleCA3YmNiODlmLi45YzJiMWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV90dC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX3R0LmMKQEAgLTE5Miw2ICsxOTIsNyBAQAogCXR0bS0+c3RhdGUgPSB0dF91bmJvdW5kOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTCh0dG1fdHRfcG9wdWxhdGUpOwogCiAjaWZkZWYgQ09ORklHX1g4Ngogc3RhdGljIGlubGluZSBpbnQgdHRtX3R0X3NldF9wYWdlX2NhY2hpbmcoc3RydWN0IHBhZ2UgKnAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWNvcmUuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtY29yZS5jCmluZGV4IDAyNTgyODkuLmUyOTk3YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtY29yZS5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtY29yZS5jCkBAIC0xMjUzLDEwICsxMjUzLDkgQEAKIHsKIAlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CiAJaW50IHN0YXR1czsKIAotCWlmICh1ZGV2LT5hdXRvX3BtKSB7CisJaWYgKG1lc3NhZ2UuZXZlbnQgJiBQTV9FVkVOVF9BVVRPKSB7CiAJCXNwaW5fbG9ja19pcnEoJnVzYmhpZC0+bG9jayk7CS8qIFN5bmMgd2l0aCBlcnJvciBoYW5kbGVyICovCiAJCWlmICghdGVzdF9iaXQoSElEX1JFU0VUX1BFTkRJTkcsICZ1c2JoaWQtPmlvZmwpCiAJCSAgICAmJiAhdGVzdF9iaXQoSElEX0NMRUFSX0hBTFQsICZ1c2JoaWQtPmlvZmwpCkBAIC0xMjgxLDcgKzEyODAsNyBAQAogCQkJcmV0dXJuIC1FSU87CiAJfQogCi0JaWYgKCFpZ25vcmVsZWQgJiYgdWRldi0+YXV0b19wbSkgeworCWlmICghaWdub3JlbGVkICYmIChtZXNzYWdlLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykpIHsKIAkJc3Bpbl9sb2NrX2lycSgmdXNiaGlkLT5sb2NrKTsKIAkJaWYgKHRlc3RfYml0KEhJRF9MRURfT04sICZ1c2JoaWQtPmlvZmwpKSB7CiAJCQlzcGluX3VubG9ja19pcnEoJnVzYmhpZC0+bG9jayk7CkBAIC0xMjk0LDcgKzEyOTMsOCBAQAogCWhpZF9jYW5jZWxfZGVsYXllZF9zdHVmZih1c2JoaWQpOwogCWhpZF9jZWFzZV9pbyh1c2JoaWQpOwogCi0JaWYgKHVkZXYtPmF1dG9fcG0gJiYgdGVzdF9iaXQoSElEX0tFWVNfUFJFU1NFRCwgJnVzYmhpZC0+aW9mbCkpIHsKKwlpZiAoKG1lc3NhZ2UuZXZlbnQgJiBQTV9FVkVOVF9BVVRPKSAmJgorCQkJdGVzdF9iaXQoSElEX0tFWVNfUFJFU1NFRCwgJnVzYmhpZC0+aW9mbCkpIHsKIAkJLyogbG9zdCByYWNlIGFnYWluc3Qga2V5cHJlc3NlcyAqLwogCQlzdGF0dXMgPSBoaWRfc3RhcnRfaW4oaGlkKTsKIAkJaWYgKHN0YXR1cyA8IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3hlbi1rYmRmcm9udC5jIGIvZHJpdmVycy9pbnB1dC94ZW4ta2JkZnJvbnQuYwppbmRleCBiMTE1NzI2Li5jNzIxYzBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3hlbi1rYmRmcm9udC5jCisrKyBiL2RyaXZlcnMvaW5wdXQveGVuLWtiZGZyb250LmMKQEAgLTIxLDcgKzIxLDEwIEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorCiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcnZpc29yLmg+CisKKyNpbmNsdWRlIDx4ZW4veGVuLmg+CiAjaW5jbHVkZSA8eGVuL2V2ZW50cy5oPgogI2luY2x1ZGUgPHhlbi9wYWdlLmg+CiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9pby9mYmlmLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaHBpbG8uaCBiL2RyaXZlcnMvbWlzYy9ocGlsby5oCmluZGV4IDM4NTc2MDUuLjI0N2ViMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9ocGlsby5oCisrKyBiL2RyaXZlcnMvbWlzYy9ocGlsby5oCkBAIC00NCw5ICs0NCwyMCBAQAogCiAJc3RydWN0IHBjaV9kZXYgKmlsb19kZXY7CiAKKwkvKgorCSAqIG9wZW5fbG9jayAgICAgIHNlcmlhbGl6ZXMgY2NiX2NudCBkdXJpbmcgb3BlbiBhbmQgY2xvc2UKKwkgKiBbIGlycSBkaXNhYmxlZCBdCisJICogLT4gYWxsb2NfbG9jayAgdXNlZCB3aGVuIGFkZGluZy9yZW1vdmluZy9zZWFyY2hpbmcgY2NiX2FsbG9jLAorCSAqICAgICAgICAgICAgICAgIHdoaWNoIHJlcHJlc2VudHMgYWxsIGNjYnMgb3BlbiBvbiB0aGUgZGV2aWNlCisJICogLS0+IGZpZm9fbG9jayAgY29udHJvbHMgYWNjZXNzIHRvIGZpZm8gcXVldWVzIHNoYXJlZCB3aXRoIGh3CisJICoKKwkgKiBMb2NrcyBtdXN0IGJlIHRha2VuIGluIHRoaXMgb3JkZXIsIGJ1dCBvcGVuX2xvY2sgYW5kIGFsbG9jX2xvY2sKKwkgKiBhcmUgb3B0aW9uYWwsIHRoZXkgZG8gbm90IG5lZWQgdG8gYmUgaGVsZCBpbiBvcmRlciB0byB0YWtlIGEKKwkgKiBsb3dlciBsZXZlbCBsb2NrLgorCSAqLworCXNwaW5sb2NrX3Qgb3Blbl9sb2NrOwogCXNwaW5sb2NrX3QgYWxsb2NfbG9jazsKIAlzcGlubG9ja190IGZpZm9fbG9jazsKLQlzcGlubG9ja190IG9wZW5fbG9jazsKIAogCXN0cnVjdCBjZGV2IGNkZXY7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2tnZGJ0cy5jIGIvZHJpdmVycy9taXNjL2tnZGJ0cy5jCmluZGV4IGU0ZmY1MGIuLmZjYjZlYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9rZ2RidHMuYworKysgYi9kcml2ZXJzL21pc2Mva2dkYnRzLmMKQEAgLTcxMiw2ICs3MTIsMTIgQEAKIAogCS8qIEVuZCBvZiBwYWNrZXQgPT0gI1hYIHNvIGxvb2sgZm9yIHRoZSAnIycgKi8KIAlpZiAocHV0X2J1Zl9jbnQgPiAzICYmIHB1dF9idWZbcHV0X2J1Zl9jbnQgLSAzXSA9PSAnIycpIHsKKwkJaWYgKHB1dF9idWZfY250ID49IEJVRk1BWCkgeworCQkJZXByaW50aygia2dkYnRzOiBFUlJPUjogcHV0IGJ1ZmZlciBvdmVyZmxvdyBvbiIKKwkJCQkiICclcycgbGluZSAlaVxuIiwgdHMubmFtZSwgdHMuaWR4KTsKKwkJCXB1dF9idWZfY250ID0gMDsKKwkJCXJldHVybiAwOworCQl9CiAJCXB1dF9idWZbcHV0X2J1Zl9jbnRdID0gJ1wwJzsKIAkJdjJwcmludGsoInB1dCVpOiAlc1xuIiwgdHMuaWR4LCBwdXRfYnVmKTsKIAkJLyogVHJpZ2dlciBjaGVjayBoZXJlICovCkBAIC04ODUsMTYgKzg5MSwxNiBAQAogCWludCBubWlfc2xlZXAgPSAwOwogCWludCBpOwogCi0JcHRyID0gc3Ryc3RyKGNvbmZpZywgIkYiKTsKKwlwdHIgPSBzdHJjaHIoY29uZmlnLCAnRicpOwogCWlmIChwdHIpCiAJCWZvcmtfdGVzdCA9IHNpbXBsZV9zdHJ0b2wocHRyICsgMSwgTlVMTCwgMTApOwotCXB0ciA9IHN0cnN0cihjb25maWcsICJTIik7CisJcHRyID0gc3RyY2hyKGNvbmZpZywgJ1MnKTsKIAlpZiAocHRyKQogCQlkb19zeXNfb3Blbl90ZXN0ID0gc2ltcGxlX3N0cnRvbChwdHIgKyAxLCBOVUxMLCAxMCk7Ci0JcHRyID0gc3Ryc3RyKGNvbmZpZywgIk4iKTsKKwlwdHIgPSBzdHJjaHIoY29uZmlnLCAnTicpOwogCWlmIChwdHIpCiAJCW5taV9zbGVlcCA9IHNpbXBsZV9zdHJ0b2wocHRyKzEsIE5VTEwsIDEwKTsKLQlwdHIgPSBzdHJzdHIoY29uZmlnLCAiSSIpOworCXB0ciA9IHN0cmNocihjb25maWcsICdJJyk7CiAJaWYgKHB0cikKIAkJc3N0ZXBfdGVzdCA9IHNpbXBsZV9zdHJ0b2wocHRyKzEsIE5VTEwsIDEwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY2FyZC9zZGlvX3VhcnQuYyBiL2RyaXZlcnMvbW1jL2NhcmQvc2Rpb191YXJ0LmMKaW5kZXggYjhlN2M1YS4uZjUzNzU1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY2FyZC9zZGlvX3VhcnQuYworKysgYi9kcml2ZXJzL21tYy9jYXJkL3NkaW9fdWFydC5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KQEAgLTczLDExICs3NCwxMCBAQAogfTsKIAogc3RydWN0IHNkaW9fdWFydF9wb3J0IHsKKwlzdHJ1Y3QgdHR5X3BvcnQJCXBvcnQ7CiAJc3RydWN0IGtyZWYJCWtyZWY7CiAJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKIAl1bnNpZ25lZCBpbnQJCWluZGV4OwotCXVuc2lnbmVkIGludAkJb3BlbmVkOwotCXN0cnVjdCBtdXRleAkJb3Blbl9sb2NrOwogCXN0cnVjdCBzZGlvX2Z1bmMJKmZ1bmM7CiAJc3RydWN0IG11dGV4CQlmdW5jX2xvY2s7CiAJc3RydWN0IHRhc2tfc3RydWN0CSppbl9zZGlvX3VhcnRfaXJxOwpAQCAtODcsNiArODcsNyBAQAogCXN0cnVjdCB1YXJ0X2ljb3VudAlpY291bnQ7CiAJdW5zaWduZWQgaW50CQl1YXJ0Y2xrOwogCXVuc2lnbmVkIGludAkJbWN0cmw7CisJdW5zaWduZWQgaW50CQlyeF9tY3RybDsKIAl1bnNpZ25lZCBpbnQJCXJlYWRfc3RhdHVzX21hc2s7CiAJdW5zaWduZWQgaW50CQlpZ25vcmVfc3RhdHVzX21hc2s7CiAJdW5zaWduZWQgY2hhcgkJeF9jaGFyOwpAQCAtMTAyLDcgKzEwMyw2IEBACiAJaW50IGluZGV4LCByZXQgPSAtRUJVU1k7CiAKIAlrcmVmX2luaXQoJnBvcnQtPmtyZWYpOwotCW11dGV4X2luaXQoJnBvcnQtPm9wZW5fbG9jayk7CiAJbXV0ZXhfaW5pdCgmcG9ydC0+ZnVuY19sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmcG9ydC0+d3JpdGVfbG9jayk7CiAKQEAgLTE1MSw2ICsxNTEsNyBAQAogc3RhdGljIHZvaWQgc2Rpb191YXJ0X3BvcnRfcmVtb3ZlKHN0cnVjdCBzZGlvX3VhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAKIAlCVUdfT04oc2Rpb191YXJ0X3RhYmxlW3BvcnQtPmluZGV4XSAhPSBwb3J0KTsKIApAQCAtMTY1LDE1ICsxNjYsMTkgQEAKIAkgKiBnaXZlIHVwIG9uIHRoYXQgcG9ydCBBU0FQLgogCSAqIEJld2FyZTogdGhlIGxvY2sgb3JkZXJpbmcgaXMgY3JpdGljYWwuCiAJICovCi0JbXV0ZXhfbG9jaygmcG9ydC0+b3Blbl9sb2NrKTsKKwltdXRleF9sb2NrKCZwb3J0LT5wb3J0Lm11dGV4KTsKIAltdXRleF9sb2NrKCZwb3J0LT5mdW5jX2xvY2spOwogCWZ1bmMgPSBwb3J0LT5mdW5jOwogCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKIAlwb3J0LT5mdW5jID0gTlVMTDsKIAltdXRleF91bmxvY2soJnBvcnQtPmZ1bmNfbG9jayk7Ci0JaWYgKHBvcnQtPm9wZW5lZCkKLQkJdHR5X2hhbmd1cChwb3J0LT50dHkpOwotCW11dGV4X3VubG9jaygmcG9ydC0+b3Blbl9sb2NrKTsKKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKKwkvKiB0dHlfaGFuZ3VwIGlzIGFzeW5jIHNvIGlzIHRoaXMgc2FmZSBhcyBpcyA/PyAqLworCWlmICh0dHkpIHsKKwkJdHR5X2hhbmd1cCh0dHkpOworCQl0dHlfa3JlZl9wdXQodHR5KTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZwb3J0LT5wb3J0Lm11dGV4KTsKIAlzZGlvX3JlbGVhc2VfaXJxKGZ1bmMpOwogCXNkaW9fZGlzYWJsZV9mdW5jKGZ1bmMpOwogCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOwpAQCAtMjE3LDYgKzIyMiw4IEBACiAJdW5zaWduZWQgY2hhciBzdGF0dXM7CiAJdW5zaWduZWQgaW50IHJldDsKIAorCS8qIEZJWE1FOiBXaGF0IHN0b3BzIHRoaXMgbG9zaW5nIHRoZSBkZWx0YSBiaXRzIGFuZCBicmVha2luZworCSAgIHNkaW9fdWFydF9jaGVja19tb2RlbV9zdGF0dXMgPyAqLwogCXN0YXR1cyA9IHNkaW9faW4ocG9ydCwgVUFSVF9NU1IpOwogCiAJcmV0ID0gMDsKQEAgLTM5MSw3ICszOTgsNyBAQAogc3RhdGljIHZvaWQgc2Rpb191YXJ0X3JlY2VpdmVfY2hhcnMoc3RydWN0IHNkaW9fdWFydF9wb3J0ICpwb3J0LAogCQkJCSAgICB1bnNpZ25lZCBpbnQgKnN0YXR1cykKIHsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+dHR5OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKIAl1bnNpZ25lZCBpbnQgY2gsIGZsYWc7CiAJaW50IG1heF9jb3VudCA9IDI1NjsKIApAQCAtNDI4LDI0ICs0MzUsMzAgQEAKIAkJfQogCiAJCWlmICgoKnN0YXR1cyAmIHBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayAmIH5VQVJUX0xTUl9PRSkgPT0gMCkKLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIGZsYWcpOworCQkJaWYgKHR0eSkKKwkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBmbGFnKTsKIAogCQkvKgogCQkgKiBPdmVycnVuIGlzIHNwZWNpYWwuICBTaW5jZSBpdCdzIHJlcG9ydGVkIGltbWVkaWF0ZWx5LAogCQkgKiBpdCBkb2Vzbid0IGFmZmVjdCB0aGUgY3VycmVudCBjaGFyYWN0ZXIuCiAJCSAqLwogCQlpZiAoKnN0YXR1cyAmIH5wb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgJiBVQVJUX0xTUl9PRSkKLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOworCQkJaWYgKHR0eSkKKwkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9PVkVSUlVOKTsKIAogCQkqc3RhdHVzID0gc2Rpb19pbihwb3J0LCBVQVJUX0xTUik7CiAJfSB3aGlsZSAoKCpzdGF0dXMgJiBVQVJUX0xTUl9EUikgJiYgKG1heF9jb3VudC0tID4gMCkpOwotCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisJaWYgKHR0eSkgeworCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCQl0dHlfa3JlZl9wdXQodHR5KTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHNkaW9fdWFydF90cmFuc21pdF9jaGFycyhzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnBvcnQtPnhtaXQ7CiAJaW50IGNvdW50OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAKIAlpZiAocG9ydC0+eF9jaGFyKSB7CiAJCXNkaW9fb3V0KHBvcnQsIFVBUlRfVFgsIHBvcnQtPnhfY2hhcik7CkBAIC00NTMsOCArNDY2LDEzIEBACiAJCXBvcnQtPnhfY2hhciA9IDA7CiAJCXJldHVybjsKIAl9Ci0JaWYgKGNpcmNfZW1wdHkoeG1pdCkgfHwgcG9ydC0+dHR5LT5zdG9wcGVkIHx8IHBvcnQtPnR0eS0+aHdfc3RvcHBlZCkgeworCisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CisKKwlpZiAodHR5ID09IE5VTEwgfHwgY2lyY19lbXB0eSh4bWl0KSB8fAorCQkJCXR0eS0+c3RvcHBlZCB8fCB0dHktPmh3X3N0b3BwZWQpIHsKIAkJc2Rpb191YXJ0X3N0b3BfdHgocG9ydCk7CisJCXR0eV9rcmVmX3B1dCh0dHkpOwogCQlyZXR1cm47CiAJfQogCkBAIC00NjgsMTUgKzQ4NiwxNyBAQAogCX0gd2hpbGUgKC0tY291bnQgPiAwKTsKIAogCWlmIChjaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCkgPCBXQUtFVVBfQ0hBUlMpCi0JCXR0eV93YWtldXAocG9ydC0+dHR5KTsKKwkJdHR5X3dha2V1cCh0dHkpOwogCiAJaWYgKGNpcmNfZW1wdHkoeG1pdCkpCiAJCXNkaW9fdWFydF9zdG9wX3R4KHBvcnQpOworCXR0eV9rcmVmX3B1dCh0dHkpOwogfQogCiBzdGF0aWMgdm9pZCBzZGlvX3VhcnRfY2hlY2tfbW9kZW1fc3RhdHVzKHN0cnVjdCBzZGlvX3VhcnRfcG9ydCAqcG9ydCkKIHsKIAlpbnQgc3RhdHVzOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAKIAlzdGF0dXMgPSBzZGlvX2luKHBvcnQsIFVBUlRfTVNSKTsKIApAQCAtNDg3LDI1ICs1MDcsMzkgQEAKIAkJcG9ydC0+aWNvdW50LnJuZysrOwogCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERFNSKQogCQlwb3J0LT5pY291bnQuZHNyKys7Ci0JaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REQ0QpCisJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REQ0QpIHsKIAkJcG9ydC0+aWNvdW50LmRjZCsrOworCQkvKiBEQ0QgcmFpc2UgLSB3YWtlIGZvciBvcGVuICovCisJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ0QpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPnBvcnQub3Blbl93YWl0KTsKKwkJZWxzZSB7CisJCQkvKiBEQ0QgZHJvcCAtIGhhbmcgdXAgaWYgdHR5IGF0dGFjaGVkICovCisJCQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKKwkJCWlmICh0dHkpIHsKKwkJCQl0dHlfaGFuZ3VwKHR0eSk7CisJCQkJdHR5X2tyZWZfcHV0KHR0eSk7CisJCQl9CisJCX0KKwl9CiAJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDVFMpIHsKIAkJcG9ydC0+aWNvdW50LmN0cysrOwotCQlpZiAocG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKKwkJaWYgKHR0eSAmJiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKIAkJCWludCBjdHMgPSAoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKTsKLQkJCWlmIChwb3J0LT50dHktPmh3X3N0b3BwZWQpIHsKKwkJCWlmICh0dHktPmh3X3N0b3BwZWQpIHsKIAkJCQlpZiAoY3RzKSB7Ci0JCQkJCXBvcnQtPnR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCQkJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CiAJCQkJCXNkaW9fdWFydF9zdGFydF90eChwb3J0KTsKLQkJCQkJdHR5X3dha2V1cChwb3J0LT50dHkpOworCQkJCQl0dHlfd2FrZXVwKHR0eSk7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlpZiAoIWN0cykgewotCQkJCQlwb3J0LT50dHktPmh3X3N0b3BwZWQgPSAxOworCQkJCQl0dHktPmh3X3N0b3BwZWQgPSAxOwogCQkJCQlzZGlvX3VhcnRfc3RvcF90eChwb3J0KTsKIAkJCQl9CiAJCQl9CiAJCX0KKwkJdHR5X2tyZWZfcHV0KHR0eSk7CiAJfQogfQogCkBAIC01NDIsOCArNTc2LDYyIEBACiAJcG9ydC0+aW5fc2Rpb191YXJ0X2lycSA9IE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgc2Rpb191YXJ0X3N0YXJ0dXAoc3RydWN0IHNkaW9fdWFydF9wb3J0ICpwb3J0KQorc3RhdGljIGludCB1YXJ0X2NhcnJpZXJfcmFpc2VkKHN0cnVjdCB0dHlfcG9ydCAqdHBvcnQpCiB7CisJc3RydWN0IHNkaW9fdWFydF9wb3J0ICpwb3J0ID0KKwkJCWNvbnRhaW5lcl9vZih0cG9ydCwgc3RydWN0IHNkaW9fdWFydF9wb3J0LCBwb3J0KTsKKwl1bnNpZ25lZCBpbnQgcmV0ID0gc2Rpb191YXJ0X2NsYWltX2Z1bmMocG9ydCk7CisJaWYgKHJldCkJLyogTWlzc2luZyBoYXJkd2FyZSBzaG91ZG4ndCBibG9jayBmb3IgY2FycmllciAqLworCQlyZXR1cm4gMTsKKwlyZXQgPSBzZGlvX3VhcnRfZ2V0X21jdHJsKHBvcnQpOworCXNkaW9fdWFydF9yZWxlYXNlX2Z1bmMocG9ydCk7CisJaWYgKHJldCAmIFRJT0NNX0NBUikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJdWFydF9kdHJfcnRzCQktCSBwb3J0IGhlbHBlciB0byBzZXQgdWFydCBzaWduYWxzCisgKglAdHBvcnQ6IHR0eSBwb3J0IHRvIGJlIHVwZGF0ZWQKKyAqCUBvbm9mZjogc2V0IHRvIHR1cm4gb24gRFRSL1JUUworICoKKyAqCUNhbGxlZCBieSB0aGUgdHR5IHBvcnQgaGVscGVycyB3aGVuIHRoZSBtb2RlbSBzaWduYWxzIG5lZWQgdG8gYmUKKyAqCWFkanVzdGVkIGR1cmluZyBhbiBvcGVuLCBjbG9zZSBhbmQgaGFuZ3VwLgorICovCisKK3N0YXRpYyB2b2lkIHVhcnRfZHRyX3J0cyhzdHJ1Y3QgdHR5X3BvcnQgKnRwb3J0LCBpbnQgb25vZmYpCit7CisJc3RydWN0IHNkaW9fdWFydF9wb3J0ICpwb3J0ID0KKwkJCWNvbnRhaW5lcl9vZih0cG9ydCwgc3RydWN0IHNkaW9fdWFydF9wb3J0LCBwb3J0KTsKKwlpbnQgcmV0ID0gc2Rpb191YXJ0X2NsYWltX2Z1bmMocG9ydCk7CisJaWYgKHJldCkKKwkJcmV0dXJuOworCWlmIChvbm9mZiA9PSAwKQorCQlzZGlvX3VhcnRfY2xlYXJfbWN0cmwocG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKKwllbHNlCisJCXNkaW9fdWFydF9zZXRfbWN0cmwocG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKKwlzZGlvX3VhcnRfcmVsZWFzZV9mdW5jKHBvcnQpOworfQorCisvKioKKyAqCXNkaW9fdWFydF9hY3RpdmF0ZQktCXN0YXJ0IHVwIGhhcmR3YXJlCisgKglAdHBvcnQ6IHR0eSBwb3J0IHRvIGFjdGl2YXRlCisgKglAdHR5OiB0dHkgYm91bmQgdG8gdGhpcyBwb3J0CisgKgorICoJQWN0aXZhdGUgYSB0dHkgcG9ydC4gVGhlIHBvcnQgbG9ja2luZyBndWFyYW50ZWVzIHVzIHRoaXMgd2lsbCBiZQorICoJcnVuIGV4YWN0bHkgb25jZSBwZXIgc2V0IG9mIG9wZW5zLCBhbmQgaWYgc3VjY2Vzc2Z1bCB3aWxsIHNlZSB0aGUKKyAqCXNodXRkb3duIG1ldGhvZCBydW4gZXhhY3RseSBvbmNlIHRvIG1hdGNoLiBTdGFydCB1cCBhbmQgc2h1dGRvd24gYXJlCisgKglwcm90ZWN0ZWQgZnJvbSBlYWNoIG90aGVyIGJ5IHRoZSBpbnRlcm5hbCBsb2NraW5nIGFuZCB3aWxsIG5vdCBydW4KKyAqCWF0IHRoZSBzYW1lIHRpbWUgZXZlbiBkdXJpbmcgYSBoYW5ndXAgZXZlbnQuCisgKgorICoJSWYgd2Ugc3VjY2Vzc2Z1bGx5IHN0YXJ0IHVwIHRoZSBwb3J0IHdlIHRha2UgYW4gZXh0cmEga3JlZiBhcyB3ZQorICoJd2lsbCBrZWVwIGl0IGFyb3VuZCB1bnRpbCBzaHV0ZG93biB3aGVuIHRoZSBrcmVmIGlzIGRyb3BwZWQuCisgKi8KKworc3RhdGljIGludCBzZGlvX3VhcnRfYWN0aXZhdGUoc3RydWN0IHR0eV9wb3J0ICp0cG9ydCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQgKnBvcnQgPQorCQkJY29udGFpbmVyX29mKHRwb3J0LCBzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQsIHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgcGFnZTsKIAlpbnQgcmV0OwogCkBAIC01NTEsNyArNjM5LDcgQEAKIAkgKiBTZXQgdGhlIFRUWSBJTyBlcnJvciBtYXJrZXIgLSB3ZSB3aWxsIG9ubHkgY2xlYXIgdGhpcwogCSAqIG9uY2Ugd2UgaGF2ZSBzdWNjZXNzZnVsbHkgb3BlbmVkIHRoZSBwb3J0LgogCSAqLwotCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmcG9ydC0+dHR5LT5mbGFncyk7CisJc2V0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKIAogCS8qIEluaXRpYWxpc2UgYW5kIGFsbG9jYXRlIHRoZSB0cmFuc21pdCBidWZmZXIuICovCiAJcGFnZSA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKQEAgLTU5MiwxOSArNjgwLDE5IEBACiAJICovCiAJc2Rpb19vdXQocG9ydCwgVUFSVF9MQ1IsIFVBUlRfTENSX1dMRU44KTsKIAotCXBvcnQtPmllciA9IFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREkgfCBVQVJUX0lFUl9SVE9JRSB8IFVBUlRfSUVSX1VVRTsKKwlwb3J0LT5pZXIgPSBVQVJUX0lFUl9STFNJfFVBUlRfSUVSX1JESXxVQVJUX0lFUl9SVE9JRXxVQVJUX0lFUl9VVUU7CiAJcG9ydC0+bWN0cmwgPSBUSU9DTV9PVVQyOwogCi0Jc2Rpb191YXJ0X2NoYW5nZV9zcGVlZChwb3J0LCBwb3J0LT50dHktPnRlcm1pb3MsIE5VTEwpOworCXNkaW9fdWFydF9jaGFuZ2Vfc3BlZWQocG9ydCwgdHR5LT50ZXJtaW9zLCBOVUxMKTsKIAotCWlmIChwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpCiAJCXNkaW9fdWFydF9zZXRfbWN0cmwocG9ydCwgVElPQ01fUlRTIHwgVElPQ01fRFRSKTsKIAotCWlmIChwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKQorCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKQogCQlpZiAoIShzZGlvX3VhcnRfZ2V0X21jdHJsKHBvcnQpICYgVElPQ01fQ1RTKSkKLQkJCXBvcnQtPnR0eS0+aHdfc3RvcHBlZCA9IDE7CisJCQl0dHktPmh3X3N0b3BwZWQgPSAxOwogCi0JY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJnBvcnQtPnR0eS0+ZmxhZ3MpOworCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKIAogCS8qIEtpY2sgdGhlIElSUSBoYW5kbGVyIG9uY2Ugd2hpbGUgd2UncmUgc3RpbGwgaG9sZGluZyB0aGUgaG9zdCBsb2NrICovCiAJc2Rpb191YXJ0X2lycShwb3J0LT5mdW5jKTsKQEAgLTYyMSw4ICs3MDksMjAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBzZGlvX3VhcnRfc2h1dGRvd24oc3RydWN0IHNkaW9fdWFydF9wb3J0ICpwb3J0KQorLyoqCisgKglzZGlvX3VhcnRfc2h1dGRvd24JLQlzdG9wIGhhcmR3YXJlCisgKglAdHBvcnQ6IHR0eSBwb3J0IHRvIHNodXQgZG93bgorICoKKyAqCURlYWN0aXZhdGUgYSB0dHkgcG9ydC4gVGhlIHBvcnQgbG9ja2luZyBndWFyYW50ZWVzIHVzIHRoaXMgd2lsbCBiZQorICoJcnVuIG9ubHkgaWYgYSBzdWNjZXNzZnVsIG1hdGNoaW5nIGFjdGl2YXRlIGFscmVhZHkgcmFuLiBUaGUgdHdvIGFyZQorICoJcHJvdGVjdGVkIGZyb20gZWFjaCBvdGhlciBieSB0aGUgaW50ZXJuYWwgbG9ja2luZyBhbmQgd2lsbCBub3QgcnVuCisgKglhdCB0aGUgc2FtZSB0aW1lIGV2ZW4gZHVyaW5nIGEgaGFuZ3VwIGV2ZW50LgorICovCisKK3N0YXRpYyB2b2lkIHNkaW9fdWFydF9zaHV0ZG93bihzdHJ1Y3QgdHR5X3BvcnQgKnRwb3J0KQogeworCXN0cnVjdCBzZGlvX3VhcnRfcG9ydCAqcG9ydCA9CisJCQljb250YWluZXJfb2YodHBvcnQsIHN0cnVjdCBzZGlvX3VhcnRfcG9ydCwgcG9ydCk7CiAJaW50IHJldDsKIAogCXJldCA9IHNkaW9fdWFydF9jbGFpbV9mdW5jKHBvcnQpOwpAQCAtNjMxLDEyICs3MzEsNiBAQAogCiAJc2Rpb191YXJ0X3N0b3BfcngocG9ydCk7CiAKLQkvKiBUT0RPOiB3YWl0IGhlcmUgZm9yIFRYIEZJRk8gdG8gZHJhaW4gKi8KLQotCS8qIFR1cm4gb2ZmIERUUiBhbmQgUlRTIGVhcmx5LiAqLwotCWlmIChwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkKLQkJc2Rpb191YXJ0X2NsZWFyX21jdHJsKHBvcnQsIFRJT0NNX0RUUiB8IFRJT0NNX1JUUyk7Ci0KIAkvKiBEaXNhYmxlIGludGVycnVwdHMgZnJvbSB0aGlzIHBvcnQgKi8KIAlzZGlvX3JlbGVhc2VfaXJxKHBvcnQtPmZ1bmMpOwogCXBvcnQtPmllciA9IDA7CkBAIC02NjEsNzcgKzc1NSw3MCBAQAogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwb3J0LT54bWl0LmJ1Zik7CiB9CiAKKy8qKgorICoJc2Rpb191YXJ0X2luc3RhbGwJLQlpbnN0YWxsIG1ldGhvZAorICoJQGRyaXZlcjogdGhlIGRyaXZlciBpbiB1c2UgKHNkaW9fdWFydCBpbiBvdXIgY2FzZSkKKyAqCUB0dHk6IHRoZSB0dHkgYmVpbmcgYm91bmQKKyAqCisgKglMb29rIHVwIGFuZCBiaW5kIHRoZSB0dHkgYW5kIHRoZSBkcml2ZXIgdG9nZXRoZXIuIEluaXRpYWxpemUKKyAqCWFueSBuZWVkZWQgcHJpdmF0ZSBkYXRhIChpbiBvdXIgY2FzZSB0aGUgdGVybWlvcykKKyAqLworCitzdGF0aWMgaW50IHNkaW9fdWFydF9pbnN0YWxsKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJaW50IGlkeCA9IHR0eS0+aW5kZXg7CisJc3RydWN0IHNkaW9fdWFydF9wb3J0ICpwb3J0ID0gc2Rpb191YXJ0X3BvcnRfZ2V0KGlkeCk7CisJaW50IHJldCA9IHR0eV9pbml0X3Rlcm1pb3ModHR5KTsKKworCWlmIChyZXQgPT0gMCkgeworCQl0dHlfZHJpdmVyX2tyZWZfZ2V0KGRyaXZlcik7CisJCXR0eS0+Y291bnQrKzsKKwkJLyogVGhpcyBpcyB0aGUgcmVmIHNkaW9fdWFydF9wb3J0IGdldCBwcm92aWRlZCAqLworCQl0dHktPmRyaXZlcl9kYXRhID0gcG9ydDsKKwkJZHJpdmVyLT50dHlzW2lkeF0gPSB0dHk7CisJfSBlbHNlCisJCXNkaW9fdWFydF9wb3J0X3B1dChwb3J0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqCXNkaW9fdWFydF9jbGVhbnVwCS0JY2FsbGVkIG9uIHRoZSBsYXN0IHR0eSBrcmVmIGRyb3AKKyAqCUB0dHk6IHRoZSB0dHkgYmVpbmcgZGVzdHJveWVkCisgKgorICoJQ2FsbGVkIGFzeW5jaHJvbm91c2x5IHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIHRvIHRoZSB0dHkgaXMgZHJvcHBlZC4KKyAqCVdlIGNhbm5vdCBkZXN0cm95IHRoZSB0dHktPmRyaXZlcl9kYXRhIHBvcnQga3JlZiB1bnRpbCB0aGlzIHBvaW50CisgKi8KKworc3RhdGljIHZvaWQgc2Rpb191YXJ0X2NsZWFudXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCXR0eS0+ZHJpdmVyX2RhdGEgPSBOVUxMOwkvKiBCdWcgdHJhcCAqLworCXNkaW9fdWFydF9wb3J0X3B1dChwb3J0KTsKK30KKworLyoKKyAqCU9wZW4vY2xvc2UvaGFuZ3VwIGlzIG5vdyBlbnRpcmVseSBib2lsZXJwbGF0ZQorICovCisKIHN0YXRpYyBpbnQgc2Rpb191YXJ0X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0Jc3RydWN0IHNkaW9fdWFydF9wb3J0ICpwb3J0OwotCWludCByZXQ7Ci0KLQlwb3J0ID0gc2Rpb191YXJ0X3BvcnRfZ2V0KHR0eS0+aW5kZXgpOwotCWlmICghcG9ydCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQltdXRleF9sb2NrKCZwb3J0LT5vcGVuX2xvY2spOwotCi0JLyoKLQkgKiBNYWtlIHN1cmUgbm90IHRvIG1lc3MgdXAgd2l0aCBhIGRlYWQgcG9ydAotCSAqIHdoaWNoIGhhcyBub3QgYmVlbiBjbG9zZWQgeWV0LgotCSAqLwotCWlmICh0dHktPmRyaXZlcl9kYXRhICYmIHR0eS0+ZHJpdmVyX2RhdGEgIT0gcG9ydCkgewotCQltdXRleF91bmxvY2soJnBvcnQtPm9wZW5fbG9jayk7Ci0JCXNkaW9fdWFydF9wb3J0X3B1dChwb3J0KTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlpZiAoIXBvcnQtPm9wZW5lZCkgewotCQl0dHktPmRyaXZlcl9kYXRhID0gcG9ydDsKLQkJcG9ydC0+dHR5ID0gdHR5OwotCQlyZXQgPSBzZGlvX3VhcnRfc3RhcnR1cChwb3J0KTsKLQkJaWYgKHJldCkgewotCQkJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0JCQlwb3J0LT50dHkgPSBOVUxMOwotCQkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5vcGVuX2xvY2spOwotCQkJc2Rpb191YXJ0X3BvcnRfcHV0KHBvcnQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQlwb3J0LT5vcGVuZWQrKzsKLQltdXRleF91bmxvY2soJnBvcnQtPm9wZW5fbG9jayk7Ci0JcmV0dXJuIDA7CisJc3RydWN0IHNkaW9fdWFydF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlyZXR1cm4gdHR5X3BvcnRfb3BlbigmcG9ydC0+cG9ydCwgdHR5LCBmaWxwKTsKIH0KIAogc3RhdGljIHZvaWQgc2Rpb191YXJ0X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKIHsKIAlzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwotCi0JaWYgKCFwb3J0KQotCQlyZXR1cm47Ci0KLQltdXRleF9sb2NrKCZwb3J0LT5vcGVuX2xvY2spOwotCUJVR19PTighcG9ydC0+b3BlbmVkKTsKLQotCS8qCi0JICogVGhpcyBpcyBtZXNzeS4gIFRoZSB0dHkgbGF5ZXIgY2FsbHMgdXMgZXZlbiB3aGVuIG9wZW4oKQotCSAqIHJldHVybmVkIGFuIGVycm9yLiAgSWdub3JlIHRoaXMgY2xvc2UgcmVxdWVzdCBpZiB0dHktPmNvdW50Ci0JICogaXMgbGFyZ2VyIHRoYW4gcG9ydC0+Y291bnQuCi0JICovCi0JaWYgKHR0eS0+Y291bnQgPiBwb3J0LT5vcGVuZWQpIHsKLQkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5vcGVuX2xvY2spOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKC0tcG9ydC0+b3BlbmVkID09IDApIHsKLQkJdHR5LT5jbG9zaW5nID0gMTsKLQkJc2Rpb191YXJ0X3NodXRkb3duKHBvcnQpOwotCQl0dHlfbGRpc2NfZmx1c2godHR5KTsKLQkJcG9ydC0+dHR5ID0gTlVMTDsKLQkJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0JCXR0eS0+Y2xvc2luZyA9IDA7Ci0JfQotCW11dGV4X3VubG9jaygmcG9ydC0+b3Blbl9sb2NrKTsKLQlzZGlvX3VhcnRfcG9ydF9wdXQocG9ydCk7CisJdHR5X3BvcnRfY2xvc2UoJnBvcnQtPnBvcnQsIHR0eSwgZmlscCk7CiB9CiAKLXN0YXRpYyBpbnQgc2Rpb191YXJ0X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCitzdGF0aWMgdm9pZCBzZGlvX3VhcnRfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHNkaW9fdWFydF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl0dHlfcG9ydF9oYW5ndXAoJnBvcnQtPnBvcnQpOworfQorCitzdGF0aWMgaW50IHNkaW9fdWFydF93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCiAJCQkgICBpbnQgY291bnQpCiB7CiAJc3RydWN0IHNkaW9fdWFydF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKQEAgLTc1Niw3ICs4NDMsNyBAQAogCX0KIAlzcGluX3VubG9jaygmcG9ydC0+d3JpdGVfbG9jayk7CiAKLQlpZiAoICEocG9ydC0+aWVyICYgVUFSVF9JRVJfVEhSSSkpIHsKKwlpZiAoIShwb3J0LT5pZXIgJiBVQVJUX0lFUl9USFJJKSkgewogCQlpbnQgZXJyID0gc2Rpb191YXJ0X2NsYWltX2Z1bmMocG9ydCk7CiAJCWlmICghZXJyKSB7CiAJCQlzZGlvX3VhcnRfc3RhcnRfdHgocG9ydCk7CkBAIC04NDMsMTcgKzkzMCwxMiBAQAogCXNkaW9fdWFydF9yZWxlYXNlX2Z1bmMocG9ydCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNkaW9fdWFydF9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQorc3RhdGljIHZvaWQgc2Rpb191YXJ0X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkJCQlzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewogCXN0cnVjdCBzZGlvX3VhcnRfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgaW50IGNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOwogCi0jZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKQkoKGlmbGFnKSAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0spKQotCi0JaWYgKChjZmxhZyBeIG9sZF90ZXJtaW9zLT5jX2NmbGFnKSA9PSAwICYmCi0JICAgIFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZyBeIG9sZF90ZXJtaW9zLT5jX2lmbGFnKSA9PSAwKQotCQlyZXR1cm47Ci0KIAlpZiAoc2Rpb191YXJ0X2NsYWltX2Z1bmMocG9ydCkgIT0gMCkKIAkJcmV0dXJuOwogCkBAIC05MjgsNyArMTAxMCw3IEBACiAJaW50IHJlc3VsdDsKIAogCXJlc3VsdCA9IHNkaW9fdWFydF9jbGFpbV9mdW5jKHBvcnQpOwotCWlmKCFyZXN1bHQpIHsKKwlpZiAoIXJlc3VsdCkgewogCQlzZGlvX3VhcnRfdXBkYXRlX21jdHJsKHBvcnQsIHNldCwgY2xlYXIpOwogCQlzZGlvX3VhcnRfcmVsZWFzZV9mdW5jKHBvcnQpOwogCX0KQEAgLTk0Niw3ICsxMDI4LDcgQEAKIAkJc3RydWN0IHNkaW9fdWFydF9wb3J0ICpwb3J0ID0gc2Rpb191YXJ0X3BvcnRfZ2V0KGkpOwogCQlpZiAocG9ydCkgewogCQkJc2VxX3ByaW50ZihtLCAiJWQ6IHVhcnQ6U0RJTyIsIGkpOwotCQkJaWYoY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQkJaWYgKGNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKIAkJCQlzZXFfcHJpbnRmKG0sICIgdHg6JWQgcng6JWQiLAogCQkJCQkgICAgICBwb3J0LT5pY291bnQudHgsIHBvcnQtPmljb3VudC5yeCk7CiAJCQkJaWYgKHBvcnQtPmljb3VudC5mcmFtZSkKQEAgLTk5NCw2ICsxMDc2LDEzIEBACiAJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X3BvcnRfb3BlcmF0aW9ucyBzZGlvX3VhcnRfcG9ydF9vcHMgPSB7CisJLmR0cl9ydHMgPSB1YXJ0X2R0cl9ydHMsCisJLmNhcnJpZXJfcmFpc2VkID0gdWFydF9jYXJyaWVyX3JhaXNlZCwKKwkuc2h1dGRvd24gPSBzZGlvX3VhcnRfc2h1dGRvd24sCisJLmFjdGl2YXRlID0gc2Rpb191YXJ0X2FjdGl2YXRlLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBzZGlvX3VhcnRfb3BzID0gewogCS5vcGVuCQkJPSBzZGlvX3VhcnRfb3BlbiwKIAkuY2xvc2UJCQk9IHNkaW9fdWFydF9jbG9zZSwKQEAgLTEwMDQsOSArMTA5MywxMiBAQAogCS50aHJvdHRsZQkJPSBzZGlvX3VhcnRfdGhyb3R0bGUsCiAJLnVudGhyb3R0bGUJCT0gc2Rpb191YXJ0X3VudGhyb3R0bGUsCiAJLnNldF90ZXJtaW9zCQk9IHNkaW9fdWFydF9zZXRfdGVybWlvcywKKwkuaGFuZ3VwCQkJPSBzZGlvX3VhcnRfaGFuZ3VwLAogCS5icmVha19jdGwJCT0gc2Rpb191YXJ0X2JyZWFrX2N0bCwKIAkudGlvY21nZXQJCT0gc2Rpb191YXJ0X3Rpb2NtZ2V0LAogCS50aW9jbXNldAkJPSBzZGlvX3VhcnRfdGlvY21zZXQsCisJLmluc3RhbGwJCT0gc2Rpb191YXJ0X2luc3RhbGwsCisJLmNsZWFudXAJCT0gc2Rpb191YXJ0X2NsZWFudXAsCiAJLnByb2NfZm9wcwkJPSAmc2Rpb191YXJ0X3Byb2NfZm9wcywKIH07CiAKQEAgLTEwNDMsNyArMTEzNSw3IEBACiAJCX0KIAkJaWYgKCF0cGwpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiJXM6IGNhbid0IGZpbmQgdHVwbGUgMHg5MSBzdWJ0dXBsZSAwIChTVUJUUExfU0lPUkVHKSBmb3IgR1BTIGNsYXNzXG4iLAorICAgICAgICIlczogY2FuJ3QgZmluZCB0dXBsZSAweDkxIHN1YnR1cGxlIDAgKFNVQlRQTF9TSU9SRUcpIGZvciBHUFMgY2xhc3NcbiIsCiAJCQkgICAgICAgc2Rpb19mdW5jX2lkKGZ1bmMpKTsKIAkJCWtmcmVlKHBvcnQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDY4LDEzICsxMTYwLDE2IEBACiAKIAlwb3J0LT5mdW5jID0gZnVuYzsKIAlzZGlvX3NldF9kcnZkYXRhKGZ1bmMsIHBvcnQpOworCXR0eV9wb3J0X2luaXQoJnBvcnQtPnBvcnQpOworCXBvcnQtPnBvcnQub3BzID0gJnNkaW9fdWFydF9wb3J0X29wczsKIAogCXJldCA9IHNkaW9fdWFydF9hZGRfcG9ydChwb3J0KTsKIAlpZiAocmV0KSB7CiAJCWtmcmVlKHBvcnQpOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBkZXZpY2UgKmRldjsKLQkJZGV2ID0gdHR5X3JlZ2lzdGVyX2RldmljZShzZGlvX3VhcnRfdHR5X2RyaXZlciwgcG9ydC0+aW5kZXgsICZmdW5jLT5kZXYpOworCQlkZXYgPSB0dHlfcmVnaXN0ZXJfZGV2aWNlKHNkaW9fdWFydF90dHlfZHJpdmVyLAorCQkJCQkJcG9ydC0+aW5kZXgsICZmdW5jLT5kZXYpOwogCQlpZiAoSVNfRVJSKGRldikpIHsKIAkJCXNkaW9fdWFydF9wb3J0X3JlbW92ZShwb3J0KTsKIAkJCXJldCA9IFBUUl9FUlIoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbXNtX3NkY2MuYyBiL2RyaXZlcnMvbW1jL2hvc3QvbXNtX3NkY2MuYwppbmRleCBkYmE0NjAwLi5iMzE5NDZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L21zbV9zZGNjLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9tc21fc2RjYy5jCkBAIC0zOCwxMCArMzgsOSBAQAogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgogCi0jaW5jbHVkZSA8YXNtL21hY2gvbW1jLmg+CisjaW5jbHVkZSA8bWFjaC9tbWMuaD4KICNpbmNsdWRlIDxtYWNoL21zbV9pb21hcC5oPgogI2luY2x1ZGUgPG1hY2gvZG1hLmg+Ci0jaW5jbHVkZSA8bWFjaC9odGNfcHdyc2luay5oPgogCiAjaW5jbHVkZSAibXNtX3NkY2MuaCIKIApAQCAtNzc1LDEzICs3NzQsMTEgQEAKIAogCXN3aXRjaCAoaW9zLT5wb3dlcl9tb2RlKSB7CiAJY2FzZSBNTUNfUE9XRVJfT0ZGOgotCQlodGNfcHdyc2lua19zZXQoUFdSU0lOS19TRENBUkQsIDApOwogCQlicmVhazsKIAljYXNlIE1NQ19QT1dFUl9VUDoKIAkJcHdyIHw9IE1DSV9QV1JfVVA7CiAJCWJyZWFrOwogCWNhc2UgTU1DX1BPV0VSX09OOgotCQlodGNfcHdyc2lua19zZXQoUFdSU0lOS19TRENBUkQsIDEwMCk7CiAJCXB3ciB8PSBNQ0lfUFdSX09OOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLmMKaW5kZXggNDdlODRlZi4uM2I0ODY4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2IuYwpAQCAtNTc5LDcgKzU3OSw3IEBACiAgKgogICogICAgQXMgd2VsbCwgdGhlIGRldmljZSBtaWdodCByZWZ1c2UgZ29pbmcgdG8gc2xlZXAgZm9yIHdoaWNoZXZlcgogICogICAgcmVhc29uLiBJbiB0aGlzIGNhc2Ugd2UganVzdCBmYWlsLiBGb3Igc3lzdGVtIHN1c3BlbmQvaGliZXJuYXRlLAotICogICAgd2UgKmNhbid0KiBmYWlsLiBXZSBsb29rIGF0IHVzYl9kZXYtPmF1dG9fcG0gdG8gc2VlIGlmIHRoZQorICogICAgd2UgKmNhbid0KiBmYWlsLiBXZSBjaGVjayBQTV9FVkVOVF9BVVRPIHRvIHNlZSBpZiB0aGUKICAqICAgIHN1c3BlbmQgY2FsbCBjb21lcyBmcm9tIHRoZSBVU0Igc3RhY2sgb3IgZnJvbSB0aGUgc3lzdGVtIGFuZCBhY3QKICAqICAgIGluIGNvbnNlcXVlbmNlLgogICoKQEAgLTU5MSwxNCArNTkxLDExIEBACiAJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmlmYWNlLT5kZXY7CiAJc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUgPSB1c2JfZ2V0X2ludGZkYXRhKGlmYWNlKTsKLSNpZmRlZiBDT05GSUdfUE0KLQlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGkyNDAwbXUtPnVzYl9kZXY7Ci0jZW5kaWYKIAl1bnNpZ25lZCBpc19hdXRvc3VzcGVuZCA9IDA7CiAJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gJmkyNDAwbXUtPmkyNDAwbTsKIAogI2lmZGVmIENPTkZJR19QTQotCWlmICh1c2JfZGV2LT5hdXRvX3BtID4gMCkKKwlpZiAocG1fbXNnLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykKIAkJaXNfYXV0b3N1c3BlbmQgPSAxOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jIGIvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMKaW5kZXggYmFhMDUxZC4uYTg2OWI0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMKKysrIGIvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgogCisjaW5jbHVkZSA8eGVuL3hlbi5oPgogI2luY2x1ZGUgPHhlbi94ZW5idXMuaD4KICNpbmNsdWRlIDx4ZW4vZXZlbnRzLmg+CiAjaW5jbHVkZSA8eGVuL3BhZ2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL0tjb25maWcgYi9kcml2ZXJzL3BjaS9LY29uZmlnCmluZGV4IGZkYzg2NGYuLmIxZWNlZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL0tjb25maWcKKysrIGIvZHJpdmVycy9wY2kvS2NvbmZpZwpAQCAtMjcsMTAgKzI3LDEwIEBACiAJZGVmYXVsdCB5CiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBkZXByZWNhdGVkCi0JICBwY2lfZmluZF9zbG90KCkgYW5kIHBjaV9maW5kX2RldmljZSgpIEFQSXMuICBNb3N0IGRyaXZlcnMgaGF2ZQotCSAgYmVlbiBjb252ZXJ0ZWQgb3ZlciB0byB1c2luZyB0aGUgcHJvcGVyIGhvdHBsdWcgQVBJcywgc28gdGhpcwotCSAgb3B0aW9uIHNlcnZlcyB0byBpbmNsdWRlL2V4Y2x1ZGUgb25seSBhIGZldyBkcml2ZXJzIHRoYXQgYXJlCi0JICBzdGlsbCB1c2luZyB0aGlzIEFQSS4KKwkgIHBjaV9maW5kX2RldmljZSgpIEFQSS4gIE1vc3QgZHJpdmVycyBoYXZlIGJlZW4gY29udmVydGVkIG92ZXIKKwkgIHRvIHVzaW5nIHRoZSBwcm9wZXIgaG90cGx1ZyBBUElzLCBzbyB0aGlzIG9wdGlvbiBzZXJ2ZXMgdG8KKwkgIGluY2x1ZGUvZXhjbHVkZSBvbmx5IGEgZmV3IGRyaXZlcnMgdGhhdCBhcmUgc3RpbGwgdXNpbmcgdGhpcworCSAgQVBJLgogCiBjb25maWcgUENJX0RFQlVHCiAJYm9vbCAiUENJIERlYnVnZ2luZyIKQEAgLTY5LDMgKzY5LDEwIEBACiAJICBwaHlzaWNhbCByZXNvdXJjZXMuCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBQQ0lfSU9BUElDCisJYm9vbAorCWRlcGVuZHMgb24gUENJCisJZGVwZW5kcyBvbiBBQ1BJCisJZGVwZW5kcyBvbiBIT1RQTFVHCisJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9NYWtlZmlsZSBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCmluZGV4IDRhN2YxMWQuLjRkZjQ4ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCkBAIC0xNCw2ICsxNCw4IEBACiAjIEJ1aWxkIFBDSSBFeHByZXNzIHN0dWZmIGlmIG5lZWRlZAogb2JqLSQoQ09ORklHX1BDSUVQT1JUQlVTKSArPSBwY2llLwogCitvYmotJChDT05GSUdfUENJX0lPQVBJQykgKz0gaW9hcGljLm8KKwogb2JqLSQoQ09ORklHX0hPVFBMVUcpICs9IGhvdHBsdWcubwogCiAjIEJ1aWxkIHRoZSBQQ0kgSG90cGx1ZyBkcml2ZXJzIGlmIHdlIHdlcmUgYXNrZWQgdG8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2RtYXIuYyBiL2RyaXZlcnMvcGNpL2RtYXIuYwppbmRleCA0MTZmNmFjLi42Y2RjOTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9kbWFyLmMKKysrIGIvZHJpdmVycy9wY2kvZG1hci5jCkBAIC0zMjAsNyArMzIwLDcgQEAKIAlmb3IgKGJ1cyA9IGRldi0+YnVzOyBidXM7IGJ1cyA9IGJ1cy0+cGFyZW50KSB7CiAJCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBidXMtPnNlbGY7CiAKLQkJaWYgKCFicmlkZ2UgfHwgIWJyaWRnZS0+aXNfcGNpZSB8fAorCQlpZiAoIWJyaWRnZSB8fCAhcGNpX2lzX3BjaWUoYnJpZGdlKSB8fAogCQkgICAgYnJpZGdlLT5wY2llX3R5cGUgPT0gUENJX0VYUF9UWVBFX1BDSV9CUklER0UpCiAJCQlyZXR1cm4gMDsKIApAQCAtNjQ1LDggKzY0NSwxMSBAQAogCQkJICAgICAgICJ4MmFwaWMgYW5kIEludHItcmVtYXBwaW5nLlxuIik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRE1BUgotCQlpZiAocmV0ICYmICFub19pb21tdSAmJiAhaW9tbXVfZGV0ZWN0ZWQgJiYgIWRtYXJfZGlzYWJsZWQpCisJCWlmIChyZXQgJiYgIW5vX2lvbW11ICYmICFpb21tdV9kZXRlY3RlZCAmJiAhZG1hcl9kaXNhYmxlZCkgewogCQkJaW9tbXVfZGV0ZWN0ZWQgPSAxOworCQkJLyogTWFrZSBzdXJlIEFDUyB3aWxsIGJlIGVuYWJsZWQgKi8KKwkJCXBjaV9yZXF1ZXN0X2FjcygpOworCQl9CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfWDg2CiAJCWlmIChyZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL01ha2VmaWxlIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9NYWtlZmlsZQppbmRleCAzNjI1YjA5Li42Y2Q5ZjNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvTWFrZWZpbGUKQEAgLTYsMTggKzYsMjIgQEAKIG9iai0kKENPTkZJR19IT1RQTFVHX1BDSV9DT01QQVEpCSs9IGNwcXBocC5vCiBvYmotJChDT05GSUdfSE9UUExVR19QQ0lfSUJNKQkJKz0gaWJtcGhwLm8KIAotIyBwY2llaHAgc2hvdWxkIGJlIGxpbmtlZCBiZWZvcmUgYWNwaXBocCBpbiBvcmRlciB0byBhbGxvdyB0aGUgbmF0aXZlIGRyaXZlcgotIyB0byBhdHRlbXB0IHRvIGJpbmQgZmlyc3QuIFdlIGNhbiB0aGVuIGZhbGwgYmFjayB0byBnZW5lcmljIHN1cHBvcnQuCisjIG5hdGl2ZSBkcml2ZXJzIHNob3VsZCBiZSBsaW5rZWQgYmVmb3JlIGFjcGlwaHAgaW4gb3JkZXIgdG8gYWxsb3cgdGhlCisjIG5hdGl2ZSBkcml2ZXIgdG8gYXR0ZW1wdCB0byBiaW5kIGZpcnN0LiBXZSBjYW4gdGhlbiBmYWxsIGJhY2sgdG8KKyMgZ2VuZXJpYyBzdXBwb3J0LgogCiBvYmotJChDT05GSUdfSE9UUExVR19QQ0lfUENJRSkJCSs9IHBjaWVocC5vCi1vYmotJChDT05GSUdfSE9UUExVR19QQ0lfQUNQSSkJCSs9IGFjcGlwaHAubwotb2JqLSQoQ09ORklHX0hPVFBMVUdfUENJX0FDUElfSUJNKQkrPSBhY3BpcGhwX2libS5vCiBvYmotJChDT05GSUdfSE9UUExVR19QQ0lfQ1BDSV9aVDU1NTApCSs9IGNwY2locF96dDU1NTAubwogb2JqLSQoQ09ORklHX0hPVFBMVUdfUENJX0NQQ0lfR0VORVJJQykJKz0gY3BjaWhwX2dlbmVyaWMubwogb2JqLSQoQ09ORklHX0hPVFBMVUdfUENJX1NIUEMpCQkrPSBzaHBjaHAubwogb2JqLSQoQ09ORklHX0hPVFBMVUdfUENJX1JQQSkJCSs9IHJwYXBocC5vCiBvYmotJChDT05GSUdfSE9UUExVR19QQ0lfUlBBX0RMUEFSKQkrPSBycGFkbHBhcl9pby5vCiBvYmotJChDT05GSUdfSE9UUExVR19QQ0lfU0dJKQkJKz0gc2dpX2hvdHBsdWcubworb2JqLSQoQ09ORklHX0hPVFBMVUdfUENJX0FDUEkpCQkrPSBhY3BpcGhwLm8KKworIyBhY3BpcGhwX2libSBleHRlbmRzIGFjcGlwaHAsIHNvIHNob3VsZCBiZSBsaW5rZWQgYWZ0ZXJ3YXJkcy4KKworb2JqLSQoQ09ORklHX0hPVFBMVUdfUENJX0FDUElfSUJNKQkrPSBhY3BpcGhwX2libS5vCiAKICMgTGluayB0aGlzIGxhc3Qgc28gaXQgZG9lc24ndCBjbGFpbSBkZXZpY2VzIHRoYXQgaGF2ZSBhIHJlYWwgaG90cGx1ZyBkcml2ZXIKIG9iai0kKENPTkZJR19IT1RQTFVHX1BDSV9GQUtFKQkJKz0gZmFrZXBocC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlfcGNpaHAuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jCmluZGV4IDBmMzI1NzEuLjNjNzZmYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jCkBAIC0zNjIsNiArMzYyLDggQEAKIAkJc3RhdHVzID0gYWNwaV9wY2lfb3NjX2NvbnRyb2xfc2V0KGhhbmRsZSwgZmxhZ3MpOwogCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCiAJCQlnb3RvIGdvdF9vbmU7CisJCWlmIChzdGF0dXMgPT0gQUVfU1VQUE9SVCkKKwkJCWdvdG8gbm9fY29udHJvbDsKIAkJa2ZyZWUoc3RyaW5nLnBvaW50ZXIpOwogCQlzdHJpbmcgPSAoc3RydWN0IGFjcGlfYnVmZmVyKXsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKIAl9CkBAIC0zOTQsMTAgKzM5Niw5IEBACiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJCWJyZWFrOwogCX0KLQorbm9fY29udHJvbDoKIAlkYmcoIkNhbm5vdCBnZXQgY29udHJvbCBvZiBob3RwbHVnIGhhcmR3YXJlIGZvciBwY2kgJXNcbiIsCiAJICAgIHBjaV9uYW1lKHBkZXYpKTsKLQogCWtmcmVlKHN0cmluZy5wb2ludGVyKTsKIAlyZXR1cm4gLUVOT0RFVjsKIGdvdF9vbmU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaCBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCmluZGV4IDdkOTM4ZGYuLmJhYjUyMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCkBAIC0xNDYsMTIgKzE0Niw2IEBACiAJc3RydWN0IG1vZHVsZSAqb3duZXI7CiB9OwogCi1zdHJ1Y3QgYWNwaXBocF9pb2FwaWMgewotCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0JdTMyIGdzaV9iYXNlOwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLX07Ci0KIC8qIFBDSSBidXMgYnJpZGdlIEhJRCAqLwogI2RlZmluZSBBQ1BJX1BDSV9IT1NUX0hJRAkJIlBOUDBBMDMiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCmluZGV4IGRmMWIwZWEuLjhlOTUyZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYwpAQCAtNTIsOCArNTIsNiBAQAogI2luY2x1ZGUgImFjcGlwaHAuaCIKIAogc3RhdGljIExJU1RfSEVBRChicmlkZ2VfbGlzdCk7Ci1zdGF0aWMgTElTVF9IRUFEKGlvYXBpY19saXN0KTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW9hcGljX2xpc3RfbG9jayk7CiAKICNkZWZpbmUgTVlfTkFNRSAiYWNwaXBocF9nbHVlIgogCkBAIC0zMTEsMTcgKzMwOSwxMyBAQAogLyogZmluZCBhY3BpcGhwX2Z1bmMgZnJvbSBhY3BpcGhwX2JyaWRnZSAqLwogc3RhdGljIHN0cnVjdCBhY3BpcGhwX2Z1bmMgKmFjcGlwaHBfYnJpZGdlX2hhbmRsZV90b19mdW5jdGlvbihhY3BpX2hhbmRsZSBoYW5kbGUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKmw7CiAJc3RydWN0IGFjcGlwaHBfYnJpZGdlICpicmlkZ2U7CiAJc3RydWN0IGFjcGlwaHBfc2xvdCAqc2xvdDsKIAlzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jOwogCi0JbGlzdF9mb3JfZWFjaChub2RlLCAmYnJpZGdlX2xpc3QpIHsKLQkJYnJpZGdlID0gbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYWNwaXBocF9icmlkZ2UsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYnJpZGdlLCAmYnJpZGdlX2xpc3QsIGxpc3QpIHsKIAkJZm9yIChzbG90ID0gYnJpZGdlLT5zbG90czsgc2xvdDsgc2xvdCA9IHNsb3QtPm5leHQpIHsKLQkJCWxpc3RfZm9yX2VhY2gobCwgJnNsb3QtPmZ1bmNzKSB7Ci0JCQkJZnVuYyA9IGxpc3RfZW50cnkobCwgc3RydWN0IGFjcGlwaHBfZnVuYywKLQkJCQkJCQlzaWJsaW5nKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZnVuYywgJnNsb3QtPmZ1bmNzLCBzaWJsaW5nKSB7CiAJCQkJaWYgKGZ1bmMtPmhhbmRsZSA9PSBoYW5kbGUpCiAJCQkJCXJldHVybiBmdW5jOwogCQkJfQpAQCAtNDk1LDIxICs0ODksMTkgQEAKIAogc3RhdGljIHN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYWNwaXBocF9oYW5kbGVfdG9fYnJpZGdlKGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOwotCWxpc3RfZm9yX2VhY2goaGVhZCwgJmJyaWRnZV9saXN0KSB7Ci0JCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlID0gbGlzdF9lbnRyeShoZWFkLAotCQkJCQkJc3RydWN0IGFjcGlwaHBfYnJpZGdlLCBsaXN0KTsKKwlzdHJ1Y3QgYWNwaXBocF9icmlkZ2UgKmJyaWRnZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYnJpZGdlLCAmYnJpZGdlX2xpc3QsIGxpc3QpCiAJCWlmIChicmlkZ2UtPmhhbmRsZSA9PSBoYW5kbGUpCiAJCQlyZXR1cm4gYnJpZGdlOwotCX0KIAogCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCBjbGVhbnVwX2JyaWRnZShzdHJ1Y3QgYWNwaXBocF9icmlkZ2UgKmJyaWRnZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCAqdG1wOwotCXN0cnVjdCBhY3BpcGhwX3Nsb3QgKnNsb3Q7CisJc3RydWN0IGFjcGlwaHBfc2xvdCAqc2xvdCwgKm5leHQ7CisJc3RydWN0IGFjcGlwaHBfZnVuYyAqZnVuYywgKnRtcDsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJYWNwaV9oYW5kbGUgaGFuZGxlID0gYnJpZGdlLT5oYW5kbGU7CiAKQEAgLTUzMCwxMCArNTIyLDggQEAKIAogCXNsb3QgPSBicmlkZ2UtPnNsb3RzOwogCXdoaWxlIChzbG90KSB7Ci0JCXN0cnVjdCBhY3BpcGhwX3Nsb3QgKm5leHQgPSBzbG90LT5uZXh0OwotCQlsaXN0X2Zvcl9lYWNoX3NhZmUgKGxpc3QsIHRtcCwgJnNsb3QtPmZ1bmNzKSB7Ci0JCQlzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jOwotCQkJZnVuYyA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGFjcGlwaHBfZnVuYywgc2libGluZyk7CisJCW5leHQgPSBzbG90LT5uZXh0OworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZnVuYywgdG1wLCAmc2xvdC0+ZnVuY3MsIHNpYmxpbmcpIHsKIAkJCWlmIChpc19kb2NrX2RldmljZShmdW5jLT5oYW5kbGUpKSB7CiAJCQkJdW5yZWdpc3Rlcl9ob3RwbHVnX2RvY2tfZGV2aWNlKGZ1bmMtPmhhbmRsZSk7CiAJCQkJdW5yZWdpc3Rlcl9kb2NrX25vdGlmaWVyKCZmdW5jLT5uYik7CkBAIC01NDUsNyArNTM1LDcgQEAKIAkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCQkJCWVycigiZmFpbGVkIHRvIHJlbW92ZSBub3RpZnkgaGFuZGxlclxuIik7CiAJCQl9Ci0JCQlsaXN0X2RlbChsaXN0KTsKKwkJCWxpc3RfZGVsKCZmdW5jLT5zaWJsaW5nKTsKIAkJCWtmcmVlKGZ1bmMpOwogCQl9CiAJCWFjcGlwaHBfdW5yZWdpc3Rlcl9ob3RwbHVnX3Nsb3Qoc2xvdCk7CkBAIC02MDYsMjA0ICs1OTYsMTcgQEAKIAkJCQkJICAgaGFuZGxlX2hvdHBsdWdfZXZlbnRfYnJpZGdlKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwY2lfZGV2ICogZ2V0X2FwaWNfcGNpX2luZm8oYWNwaV9oYW5kbGUgaGFuZGxlKQotewotCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0KLQlkZXYgPSBhY3BpX2dldF9wY2lfZGV2KGhhbmRsZSk7Ci0JaWYgKCFkZXYpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKChkZXYtPmNsYXNzICE9IFBDSV9DTEFTU19TWVNURU1fUElDX0lPQVBJQykgJiYKLQkgICAgKGRldi0+Y2xhc3MgIT0gUENJX0NMQVNTX1NZU1RFTV9QSUNfSU9YQVBJQykpCi0JewotCQlwY2lfZGV2X3B1dChkZXYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gZGV2OwotfQotCi1zdGF0aWMgaW50IGdldF9nc2lfYmFzZShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiAqZ3NpX2Jhc2UpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWludCByZXN1bHQgPSAtMTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgZ3NiOwotCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OwotCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7Ci0Jdm9pZCAqdGFibGU7Ci0KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX0dTQiIsIE5VTEwsICZnc2IpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQkqZ3NpX2Jhc2UgPSAodTMyKWdzYjsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAiX01BVCIsIE5VTEwsICZidWZmZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCAhYnVmZmVyLmxlbmd0aCB8fCAhYnVmZmVyLnBvaW50ZXIpCi0JCXJldHVybiAtMTsKLQotCW9iaiA9IGJ1ZmZlci5wb2ludGVyOwotCWlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikKLQkJZ290byBvdXQ7Ci0KLQl0YWJsZSA9IG9iai0+YnVmZmVyLnBvaW50ZXI7Ci0Jc3dpdGNoICgoKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqKXRhYmxlKS0+dHlwZSkgewotCWNhc2UgQUNQSV9NQURUX1RZUEVfSU9fU0FQSUM6Ci0JCSpnc2lfYmFzZSA9ICgoc3RydWN0IGFjcGlfbWFkdF9pb19zYXBpYyAqKXRhYmxlKS0+Z2xvYmFsX2lycV9iYXNlOwotCQlyZXN1bHQgPSAwOwotCQlicmVhazsKLQljYXNlIEFDUElfTUFEVF9UWVBFX0lPX0FQSUM6Ci0JCSpnc2lfYmFzZSA9ICgoc3RydWN0IGFjcGlfbWFkdF9pb19hcGljICopdGFibGUpLT5nbG9iYWxfaXJxX2Jhc2U7Ci0JCXJlc3VsdCA9IDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLSBvdXQ6Ci0Ja2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cwotaW9hcGljX2FkZChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsdmwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipydikKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZyBsb25nIHN0YTsKLQlhY3BpX2hhbmRsZSB0bXA7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0JdTMyIGdzaV9iYXNlOwotCXU2NCBwaHlzX2FkZHI7Ci0Jc3RydWN0IGFjcGlwaHBfaW9hcGljICppb2FwaWM7Ci0KLQkvKiBFdmFsdWF0ZSBfU1RBIGlmIHByZXNlbnQgKi8KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX1NUQSIsIE5VTEwsICZzdGEpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJiBzdGEgIT0gQUNQSV9TVEFfQUxMKQotCQlyZXR1cm4gQUVfQ1RSTF9ERVBUSDsKLQotCS8qIFNjYW4gb25seSBQQ0kgYnVzIHNjb3BlICovCi0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIl9ISUQiLCAmdG1wKTsKLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCi0JCXJldHVybiBBRV9DVFJMX0RFUFRIOwotCi0JaWYgKGdldF9nc2lfYmFzZShoYW5kbGUsICZnc2lfYmFzZSkpCi0JCXJldHVybiBBRV9PSzsKLQotCWlvYXBpYyA9IGttYWxsb2Moc2l6ZW9mKCppb2FwaWMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlvYXBpYykKLQkJcmV0dXJuIEFFX05PX01FTU9SWTsKLQotCXBkZXYgPSBnZXRfYXBpY19wY2lfaW5mbyhoYW5kbGUpOwotCWlmICghcGRldikKLQkJZ290byBleGl0X2tmcmVlOwotCi0JaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQotCQlnb3RvIGV4aXRfcGNpX2Rldl9wdXQ7Ci0KLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQotCWlmIChwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMCwgIkkvTyBBUElDKGFjcGlwaHApIikpCi0JCWdvdG8gZXhpdF9wY2lfZGlzYWJsZV9kZXZpY2U7Ci0KLQlwaHlzX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7Ci0JaWYgKGFjcGlfcmVnaXN0ZXJfaW9hcGljKGhhbmRsZSwgcGh5c19hZGRyLCBnc2lfYmFzZSkpCi0JCWdvdG8gZXhpdF9wY2lfcmVsZWFzZV9yZWdpb247Ci0KLQlpb2FwaWMtPmdzaV9iYXNlID0gZ3NpX2Jhc2U7Ci0JaW9hcGljLT5kZXYgPSBwZGV2OwotCXNwaW5fbG9jaygmaW9hcGljX2xpc3RfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmaW9hcGljLT5saXN0LCAmaW9hcGljX2xpc3QpOwotCXNwaW5fdW5sb2NrKCZpb2FwaWNfbGlzdF9sb2NrKTsKLQotCXJldHVybiBBRV9PSzsKLQotIGV4aXRfcGNpX3JlbGVhc2VfcmVnaW9uOgotCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAwKTsKLSBleGl0X3BjaV9kaXNhYmxlX2RldmljZToKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0gZXhpdF9wY2lfZGV2X3B1dDoKLQlwY2lfZGV2X3B1dChwZGV2KTsKLSBleGl0X2tmcmVlOgotCWtmcmVlKGlvYXBpYyk7Ci0KLQlyZXR1cm4gQUVfT0s7Ci19Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cwotaW9hcGljX3JlbW92ZShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsdmwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipydikKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZyBsb25nIHN0YTsKLQlhY3BpX2hhbmRsZSB0bXA7Ci0JdTMyIGdzaV9iYXNlOwotCXN0cnVjdCBhY3BpcGhwX2lvYXBpYyAqcG9zLCAqbiwgKmlvYXBpYyA9IE5VTEw7Ci0KLQkvKiBFdmFsdWF0ZSBfU1RBIGlmIHByZXNlbnQgKi8KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX1NUQSIsIE5VTEwsICZzdGEpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJiBzdGEgIT0gQUNQSV9TVEFfQUxMKQotCQlyZXR1cm4gQUVfQ1RSTF9ERVBUSDsKLQotCS8qIFNjYW4gb25seSBQQ0kgYnVzIHNjb3BlICovCi0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIl9ISUQiLCAmdG1wKTsKLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCi0JCXJldHVybiBBRV9DVFJMX0RFUFRIOwotCi0JaWYgKGdldF9nc2lfYmFzZShoYW5kbGUsICZnc2lfYmFzZSkpCi0JCXJldHVybiBBRV9PSzsKLQotCWFjcGlfdW5yZWdpc3Rlcl9pb2FwaWMoaGFuZGxlLCBnc2lfYmFzZSk7Ci0KLQlzcGluX2xvY2soJmlvYXBpY19saXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG4sICZpb2FwaWNfbGlzdCwgbGlzdCkgewotCQlpZiAocG9zLT5nc2lfYmFzZSAhPSBnc2lfYmFzZSkKLQkJCWNvbnRpbnVlOwotCQlpb2FwaWMgPSBwb3M7Ci0JCWxpc3RfZGVsKCZpb2FwaWMtPmxpc3QpOwotCQlicmVhazsKLQl9Ci0Jc3Bpbl91bmxvY2soJmlvYXBpY19saXN0X2xvY2spOwotCi0JaWYgKCFpb2FwaWMpCi0JCXJldHVybiBBRV9PSzsKLQotCXBjaV9yZWxlYXNlX3JlZ2lvbihpb2FwaWMtPmRldiwgMCk7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKGlvYXBpYy0+ZGV2KTsKLQlwY2lfZGV2X3B1dChpb2FwaWMtPmRldik7Ci0Ja2ZyZWUoaW9hcGljKTsKLQotCXJldHVybiBBRV9PSzsKLX0KLQotc3RhdGljIGludCBhY3BpcGhwX2NvbmZpZ3VyZV9pb2FwaWNzKGFjcGlfaGFuZGxlIGhhbmRsZSkKLXsKLQlpb2FwaWNfYWRkKGhhbmRsZSwgMCwgTlVMTCwgTlVMTCk7Ci0JYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBoYW5kbGUsCi0JCQkgICAgQUNQSV9VSU5UMzJfTUFYLCBpb2FwaWNfYWRkLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhY3BpcGhwX3VuY29uZmlndXJlX2lvYXBpY3MoYWNwaV9oYW5kbGUgaGFuZGxlKQotewotCWlvYXBpY19yZW1vdmUoaGFuZGxlLCAwLCBOVUxMLCBOVUxMKTsKLQlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIGhhbmRsZSwKLQkJCSAgICBBQ1BJX1VJTlQzMl9NQVgsIGlvYXBpY19yZW1vdmUsIE5VTEwsIE5VTEwsIE5VTEwpOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHBvd2VyX29uX3Nsb3Qoc3RydWN0IGFjcGlwaHBfc2xvdCAqc2xvdCkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlwaHBfZnVuYyAqZnVuYzsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsOwogCWludCByZXR2YWwgPSAwOwogCiAJLyogaWYgYWxyZWFkeSBlbmFibGVkLCBqdXN0IHNraXAgKi8KIAlpZiAoc2xvdC0+ZmxhZ3MgJiBTTE9UX1BPV0VSRURPTikKIAkJZ290byBlcnJfZXhpdDsKIAotCWxpc3RfZm9yX2VhY2ggKGwsICZzbG90LT5mdW5jcykgewotCQlmdW5jID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgYWNwaXBocF9mdW5jLCBzaWJsaW5nKTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZnVuYywgJnNsb3QtPmZ1bmNzLCBzaWJsaW5nKSB7CiAJCWlmIChmdW5jLT5mbGFncyAmIEZVTkNfSEFTX1BTMCkgewogCQkJZGJnKCIlczogZXhlY3V0aW5nIF9QUzBcbiIsIF9fZnVuY19fKTsKIAkJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGZ1bmMtPmhhbmRsZSwgIl9QUzAiLCBOVUxMLCBOVUxMKTsKQEAgLTgyOSw3ICs2MzIsNiBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jOwotCXN0cnVjdCBsaXN0X2hlYWQgKmw7CiAKIAlpbnQgcmV0dmFsID0gMDsKIApAQCAtODM3LDkgKzYzOSw3IEBACiAJaWYgKChzbG90LT5mbGFncyAmIFNMT1RfUE9XRVJFRE9OKSA9PSAwKQogCQlnb3RvIGVycl9leGl0OwogCi0JbGlzdF9mb3JfZWFjaCAobCwgJnNsb3QtPmZ1bmNzKSB7Ci0JCWZ1bmMgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBhY3BpcGhwX2Z1bmMsIHNpYmxpbmcpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmdW5jLCAmc2xvdC0+ZnVuY3MsIHNpYmxpbmcpIHsKIAkJaWYgKGZ1bmMtPmZsYWdzICYgRlVOQ19IQVNfUFMzKSB7CiAJCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChmdW5jLT5oYW5kbGUsICJfUFMzIiwgTlVMTCwgTlVMTCk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKQEAgLTk2Niw3ICs3NjYsNiBAQAogewogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAJc3RydWN0IHBjaV9idXMgKmJ1cyA9IHNsb3QtPmJyaWRnZS0+cGNpX2J1czsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsOwogCXN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmM7CiAJaW50IHJldHZhbCA9IDA7CiAJaW50IG51bSwgbWF4LCBwYXNzOwpAQCAtMTAwNiwyMSArODA1LDE2IEBACiAJCX0KIAl9CiAKLQlsaXN0X2Zvcl9lYWNoIChsLCAmc2xvdC0+ZnVuY3MpIHsKLQkJZnVuYyA9IGxpc3RfZW50cnkobCwgc3RydWN0IGFjcGlwaHBfZnVuYywgc2libGluZyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmdW5jLCAmc2xvdC0+ZnVuY3MsIHNpYmxpbmcpCiAJCWFjcGlwaHBfYnVzX2FkZChmdW5jKTsKLQl9CiAKIAlwY2lfYnVzX2Fzc2lnbl9yZXNvdXJjZXMoYnVzKTsKIAlhY3BpcGhwX3Nhbml0aXplX2J1cyhidXMpOwogCWFjcGlwaHBfc2V0X2hwcF92YWx1ZXMoYnVzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZ1bmMsICZzbG90LT5mdW5jcywgc2libGluZykKLQkJYWNwaXBocF9jb25maWd1cmVfaW9hcGljcyhmdW5jLT5oYW5kbGUpOwogCXBjaV9lbmFibGVfYnJpZGdlcyhidXMpOwogCXBjaV9idXNfYWRkX2RldmljZXMoYnVzKTsKIAotCWxpc3RfZm9yX2VhY2ggKGwsICZzbG90LT5mdW5jcykgewotCQlmdW5jID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgYWNwaXBocF9mdW5jLCBzaWJsaW5nKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZ1bmMsICZzbG90LT5mdW5jcywgc2libGluZykgewogCQlkZXYgPSBwY2lfZ2V0X3Nsb3QoYnVzLCBQQ0lfREVWRk4oc2xvdC0+ZGV2aWNlLAogCQkJCQkJICBmdW5jLT5mdW5jdGlvbikpOwogCQlpZiAoIWRldikKQEAgLTEwOTEsNyArODg1LDYgQEAKIAl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZ1bmMsICZzbG90LT5mdW5jcywgc2libGluZykgewotCQlhY3BpcGhwX3VuY29uZmlndXJlX2lvYXBpY3MoZnVuYy0+aGFuZGxlKTsKIAkJYWNwaXBocF9idXNfdHJpbShmdW5jLT5oYW5kbGUpOwogCX0KIApAQCAtMTExOSwxMiArOTEyLDkgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBsb25nIHN0YSA9IDA7CiAJdTMyIGR2aWQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbDsKIAlzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jOwogCi0JbGlzdF9mb3JfZWFjaCAobCwgJnNsb3QtPmZ1bmNzKSB7Ci0JCWZ1bmMgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBhY3BpcGhwX2Z1bmMsIHNpYmxpbmcpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmdW5jLCAmc2xvdC0+ZnVuY3MsIHNpYmxpbmcpIHsKIAkJaWYgKGZ1bmMtPmZsYWdzICYgRlVOQ19IQVNfU1RBKSB7CiAJCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZnVuYy0+aGFuZGxlLCAiX1NUQSIsIE5VTEwsICZzdGEpOwogCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpICYmIHN0YSkKQEAgLTExNTIsMTMgKzk0MiwxMCBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jOwotCXN0cnVjdCBsaXN0X2hlYWQgKmw7CiAJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJnX2xpc3Q7CiAJdW5pb24gYWNwaV9vYmplY3QgYXJnOwogCi0JbGlzdF9mb3JfZWFjaCAobCwgJnNsb3QtPmZ1bmNzKSB7Ci0JCWZ1bmMgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBhY3BpcGhwX2Z1bmMsIHNpYmxpbmcpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmdW5jLCAmc2xvdC0+ZnVuY3MsIHNpYmxpbmcpIHsKIAkJLyogV2UgZG9uJ3Qgd2FudCB0byBjYWxsIF9FSjAgb24gbm9uLWV4aXN0aW5nIGZ1bmN0aW9ucy4gKi8KIAkJaWYgKChmdW5jLT5mbGFncyAmIEZVTkNfSEFTX0VKMCkpIHsKIAkJCS8qIF9FSjAgbWV0aG9kIHRha2Ugb25lIGFyZ3VtZW50ICovCkBAIC0xMjc1LDcgKzEwNjIsNiBAQAogCWFjcGlwaHBfc2FuaXRpemVfYnVzKGJ1cyk7CiAJYWNwaXBocF9zZXRfaHBwX3ZhbHVlcyhidXMpOwogCXBjaV9lbmFibGVfYnJpZGdlcyhidXMpOwotCWFjcGlwaHBfY29uZmlndXJlX2lvYXBpY3MoaGFuZGxlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU0Miw3ICsxMzI4LDcgQEAKIAlzdHJ1Y3QgYWNwaXBocF9icmlkZ2UgKmJyaWRnZTsKIAlpbnQgbnVtX3Nsb3RzID0gMDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkgKGJyaWRnZSwgJmJyaWRnZV9saXN0LCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShicmlkZ2UsICZicmlkZ2VfbGlzdCwgbGlzdCkgewogCQlkYmcoIkJ1cyAlMDR4OiUwMnggaGFzICVkIHNsb3Qlc1xuIiwKIAkJCQlwY2lfZG9tYWluX25yKGJyaWRnZS0+cGNpX2J1cyksCiAJCQkJYnJpZGdlLT5wY2lfYnVzLT5udW1iZXIsIGJyaWRnZS0+bnJfc2xvdHMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9ocGMuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX2hwYy5jCmluZGV4IDgzZjMzN2MuLmM3MDg0ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX2hwYy5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX2hwYy5jCkBAIC04OTAsNyArODkwLDcgQEAKIAkJCW1zbGVlcChQT0xMX0lOVEVSVkFMX1NFQyAqIDEwMDApOwogCiAJCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQotCQkJCWJyZWFrOworCQkJCWdvdG8gb3V0X3NsZWVwOwogCQkJCiAJCQlkb3duICgmc2VtT3BlcmF0aW9ucyk7CiAJCQkKQEAgLTkwNCw2ICs5MDQsNyBAQAogCQkvKiBnaXZlIHVwIHRoZSBoYXJkd2FyZSBzZW1hcGhvcmUgKi8KIAkJdXAgKCZzZW1PcGVyYXRpb25zKTsKIAkJLyogc2xlZXAgZm9yIGEgc2hvcnQgdGltZSBqdXN0IGZvciBnb29kIG1lYXN1cmUgKi8KK291dF9zbGVlcDoKIAkJbXNsZWVwKDEwMCk7CiAJfQogCXVwICgmc2VtX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2lfaG90cGx1Z19jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaV9ob3RwbHVnX2NvcmUuYwppbmRleCAwMzI1ZDk4Li4zODE4M2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaV9ob3RwbHVnX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaV9ob3RwbHVnX2NvcmUuYwpAQCAtNjgsMjYgKzY4LDI2IEBACiBzdGF0aWMgY2hhciAqcGNpX2J1c19zcGVlZF9zdHJpbmdzW10gPSB7CiAJIjMzIE1IeiBQQ0kiLAkJLyogMHgwMCAqLwogCSI2NiBNSHogUENJIiwJCS8qIDB4MDEgKi8KLQkiNjYgTUh6IFBDSVgiLCAJCS8qIDB4MDIgKi8KLQkiMTAwIE1IeiBQQ0lYIiwJCS8qIDB4MDMgKi8KLQkiMTMzIE1IeiBQQ0lYIiwJCS8qIDB4MDQgKi8KKwkiNjYgTUh6IFBDSS1YIiwJCS8qIDB4MDIgKi8KKwkiMTAwIE1IeiBQQ0ktWCIsCS8qIDB4MDMgKi8KKwkiMTMzIE1IeiBQQ0ktWCIsCS8qIDB4MDQgKi8KIAlOVUxMLAkJCS8qIDB4MDUgKi8KIAlOVUxMLAkJCS8qIDB4MDYgKi8KIAlOVUxMLAkJCS8qIDB4MDcgKi8KIAlOVUxMLAkJCS8qIDB4MDggKi8KLQkiNjYgTUh6IFBDSVggMjY2IiwJLyogMHgwOSAqLwotCSIxMDAgTUh6IFBDSVggMjY2IiwJLyogMHgwYSAqLwotCSIxMzMgTUh6IFBDSVggMjY2IiwJLyogMHgwYiAqLworCSI2NiBNSHogUENJLVggMjY2IiwJLyogMHgwOSAqLworCSIxMDAgTUh6IFBDSS1YIDI2NiIsCS8qIDB4MGEgKi8KKwkiMTMzIE1IeiBQQ0ktWCAyNjYiLAkvKiAweDBiICovCiAJTlVMTCwJCQkvKiAweDBjICovCiAJTlVMTCwJCQkvKiAweDBkICovCiAJTlVMTCwJCQkvKiAweDBlICovCiAJTlVMTCwJCQkvKiAweDBmICovCiAJTlVMTCwJCQkvKiAweDEwICovCi0JIjY2IE1IeiBQQ0lYIDUzMyIsCS8qIDB4MTEgKi8KLQkiMTAwIE1IeiBQQ0lYIDUzMyIsCS8qIDB4MTIgKi8KLQkiMTMzIE1IeiBQQ0lYIDUzMyIsCS8qIDB4MTMgKi8KLQkiMi41IEdUL3MgUENJLUUiLAkvKiAweDE0ICovCi0JIjUuMCBHVC9zIFBDSS1FIiwJLyogMHgxNSAqLworCSI2NiBNSHogUENJLVggNTMzIiwJLyogMHgxMSAqLworCSIxMDAgTUh6IFBDSS1YIDUzMyIsCS8qIDB4MTIgKi8KKwkiMTMzIE1IeiBQQ0ktWCA1MzMiLAkvKiAweDEzICovCisJIjIuNSBHVC9zIFBDSWUiLAkvKiAweDE0ICovCisJIjUuMCBHVC9zIFBDSWUiLAkvKiAweDE1ICovCiB9OwogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfUENJX0NQQ0kKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oCmluZGV4IDMwNzBmNzcuLjRlZDc2YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmgKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHAuaApAQCAtOTEsNyArOTEsNiBAQAogCXN0cnVjdCBzbG90ICpzbG90OwogCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlOwkvKiBzbGVlcCAmIHdha2UgcHJvY2VzcyAqLwogCXUzMiBzbG90X2NhcDsKLQl1OCBjYXBfYmFzZTsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBwb2xsX3RpbWVyOwogCXVuc2lnbmVkIGludCBjbWRfYnVzeToxOwogCXVuc2lnbmVkIGludCBub19jbWRfY29tcGxldGU6MTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2FjcGkuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2FjcGkuYwppbmRleCAzN2M4ZDNkLi5iMDliMDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9hY3BpLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfYWNwaS5jCkBAIC04Nyw3ICs4Nyw4IEBACiAJLyogTm90ZTogcGNpZWhwX2RldGVjdF9tb2RlICE9IFBDSUVIUF9ERVRFQ1RfQUNQSSBoZXJlICovCiAJaWYgKHBjaWVocF9nZXRfaHBfaHdfY29udHJvbF9mcm9tX2Zpcm13YXJlKHBkZXYpKQogCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoIShwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfRVhQKSkpCisJcG9zID0gcGNpX3BjaWVfY2FwKHBkZXYpOworCWlmICghcG9zKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgcG9zICsgUENJX0VYUF9TTFRDQVAsICZzbG90X2NhcCk7CiAJc2xvdCA9IGt6YWxsb2Moc2l6ZW9mKCpzbG90KSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMKaW5kZXggYmMyMzQ3MS4uNTY3NGIyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYwpAQCAtNzIsMTggKzcyLDYgQEAKIHN0YXRpYyBpbnQgZ2V0X21heF9idXNfc3BlZWQJKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QsIGVudW0gcGNpX2J1c19zcGVlZCAqdmFsdWUpOwogc3RhdGljIGludCBnZXRfY3VyX2J1c19zcGVlZAkoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCwgZW51bSBwY2lfYnVzX3NwZWVkICp2YWx1ZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgaG90cGx1Z19zbG90X29wcyBwY2llaHBfaG90cGx1Z19zbG90X29wcyA9IHsKLQkuc2V0X2F0dGVudGlvbl9zdGF0dXMgPQlzZXRfYXR0ZW50aW9uX3N0YXR1cywKLQkuZW5hYmxlX3Nsb3QgPQkJZW5hYmxlX3Nsb3QsCi0JLmRpc2FibGVfc2xvdCA9CQlkaXNhYmxlX3Nsb3QsCi0JLmdldF9wb3dlcl9zdGF0dXMgPQlnZXRfcG93ZXJfc3RhdHVzLAotCS5nZXRfYXR0ZW50aW9uX3N0YXR1cyA9CWdldF9hdHRlbnRpb25fc3RhdHVzLAotCS5nZXRfbGF0Y2hfc3RhdHVzID0JZ2V0X2xhdGNoX3N0YXR1cywKLQkuZ2V0X2FkYXB0ZXJfc3RhdHVzID0JZ2V0X2FkYXB0ZXJfc3RhdHVzLAotICAJLmdldF9tYXhfYnVzX3NwZWVkID0JZ2V0X21heF9idXNfc3BlZWQsCi0gIAkuZ2V0X2N1cl9idXNfc3BlZWQgPQlnZXRfY3VyX2J1c19zcGVlZCwKLX07Ci0KIC8qKgogICogcmVsZWFzZV9zbG90IC0gZnJlZSB1cCB0aGUgbWVtb3J5IHVzZWQgYnkgYSBzbG90CiAgKiBAaG90cGx1Z19zbG90OiBzbG90IHRvIGZyZWUKQEAgLTk1LDYgKzgzLDcgQEAKIAljdHJsX2RiZyhzbG90LT5jdHJsLCAiJXM6IHBoeXNpY2FsX3Nsb3QgPSAlc1xuIiwKIAkJIF9fZnVuY19fLCBob3RwbHVnX3Nsb3RfbmFtZShob3RwbHVnX3Nsb3QpKTsKIAorCWtmcmVlKGhvdHBsdWdfc2xvdC0+b3BzKTsKIAlrZnJlZShob3RwbHVnX3Nsb3QtPmluZm8pOwogCWtmcmVlKGhvdHBsdWdfc2xvdCk7CiB9CkBAIC0xMDQsNiArOTMsNyBAQAogCXN0cnVjdCBzbG90ICpzbG90ID0gY3RybC0+c2xvdDsKIAlzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnID0gTlVMTDsKIAlzdHJ1Y3QgaG90cGx1Z19zbG90X2luZm8gKmluZm8gPSBOVUxMOworCXN0cnVjdCBob3RwbHVnX3Nsb3Rfb3BzICpvcHMgPSBOVUxMOwogCWNoYXIgbmFtZVtTTE9UX05BTUVfU0laRV07CiAJaW50IHJldHZhbCA9IC1FTk9NRU07CiAKQEAgLTExNSwxMSArMTA1LDI4IEBACiAJaWYgKCFpbmZvKQogCQlnb3RvIG91dDsKIAorCS8qIFNldHVwIGhvdHBsdWcgc2xvdCBvcHMgKi8KKwlvcHMgPSBremFsbG9jKHNpemVvZigqb3BzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvcHMpCisJCWdvdG8gb3V0OworCW9wcy0+ZW5hYmxlX3Nsb3QgPSBlbmFibGVfc2xvdDsKKwlvcHMtPmRpc2FibGVfc2xvdCA9IGRpc2FibGVfc2xvdDsKKwlvcHMtPmdldF9wb3dlcl9zdGF0dXMgPSBnZXRfcG93ZXJfc3RhdHVzOworCW9wcy0+Z2V0X2FkYXB0ZXJfc3RhdHVzID0gZ2V0X2FkYXB0ZXJfc3RhdHVzOworCW9wcy0+Z2V0X21heF9idXNfc3BlZWQgPSBnZXRfbWF4X2J1c19zcGVlZDsKKwlvcHMtPmdldF9jdXJfYnVzX3NwZWVkID0gZ2V0X2N1cl9idXNfc3BlZWQ7CisJaWYgKE1STF9TRU5TKGN0cmwpKQorCQlvcHMtPmdldF9sYXRjaF9zdGF0dXMgPSBnZXRfbGF0Y2hfc3RhdHVzOworCWlmIChBVFROX0xFRChjdHJsKSkgeworCQlvcHMtPmdldF9hdHRlbnRpb25fc3RhdHVzID0gZ2V0X2F0dGVudGlvbl9zdGF0dXM7CisJCW9wcy0+c2V0X2F0dGVudGlvbl9zdGF0dXMgPSBzZXRfYXR0ZW50aW9uX3N0YXR1czsKKwl9CisKIAkvKiByZWdpc3RlciB0aGlzIHNsb3Qgd2l0aCB0aGUgaG90cGx1ZyBwY2kgY29yZSAqLwogCWhvdHBsdWctPmluZm8gPSBpbmZvOwogCWhvdHBsdWctPnByaXZhdGUgPSBzbG90OwogCWhvdHBsdWctPnJlbGVhc2UgPSAmcmVsZWFzZV9zbG90OwotCWhvdHBsdWctPm9wcyA9ICZwY2llaHBfaG90cGx1Z19zbG90X29wczsKKwlob3RwbHVnLT5vcHMgPSBvcHM7CiAJc2xvdC0+aG90cGx1Z19zbG90ID0gaG90cGx1ZzsKIAlzbnByaW50ZihuYW1lLCBTTE9UX05BTUVfU0laRSwgIiV1IiwgUFNOKGN0cmwpKTsKIApAQCAtMTI4LDE3ICsxMzUsMTIgQEAKIAkJIGN0cmwtPnBjaWUtPnBvcnQtPnN1Ym9yZGluYXRlLT5udW1iZXIsIFBTTihjdHJsKSk7CiAJcmV0dmFsID0gcGNpX2hwX3JlZ2lzdGVyKGhvdHBsdWcsCiAJCQkJIGN0cmwtPnBjaWUtPnBvcnQtPnN1Ym9yZGluYXRlLCAwLCBuYW1lKTsKLQlpZiAocmV0dmFsKSB7CisJaWYgKHJldHZhbCkKIAkJY3RybF9lcnIoY3RybCwKIAkJCSAicGNpX2hwX3JlZ2lzdGVyIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLCByZXR2YWwpOwotCQlnb3RvIG91dDsKLQl9Ci0JZ2V0X3Bvd2VyX3N0YXR1cyhob3RwbHVnLCAmaW5mby0+cG93ZXJfc3RhdHVzKTsKLQlnZXRfYXR0ZW50aW9uX3N0YXR1cyhob3RwbHVnLCAmaW5mby0+YXR0ZW50aW9uX3N0YXR1cyk7Ci0JZ2V0X2xhdGNoX3N0YXR1cyhob3RwbHVnLCAmaW5mby0+bGF0Y2hfc3RhdHVzKTsKLQlnZXRfYWRhcHRlcl9zdGF0dXMoaG90cGx1ZywgJmluZm8tPmFkYXB0ZXJfc3RhdHVzKTsKIG91dDoKIAlpZiAocmV0dmFsKSB7CisJCWtmcmVlKG9wcyk7CiAJCWtmcmVlKGluZm8pOwogCQlrZnJlZShob3RwbHVnKTsKIAl9CkBAIC0xNjAsMTIgKzE2Miw3IEBACiAJY3RybF9kYmcoc2xvdC0+Y3RybCwgIiVzOiBwaHlzaWNhbF9zbG90ID0gJXNcbiIsCiAJCSAgX19mdW5jX18sIHNsb3RfbmFtZShzbG90KSk7CiAKLQlob3RwbHVnX3Nsb3QtPmluZm8tPmF0dGVudGlvbl9zdGF0dXMgPSBzdGF0dXM7Ci0KLQlpZiAoQVRUTl9MRUQoc2xvdC0+Y3RybCkpCi0JCXBjaWVocF9zZXRfYXR0ZW50aW9uX3N0YXR1cyhzbG90LCBzdGF0dXMpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHBjaWVocF9zZXRfYXR0ZW50aW9uX3N0YXR1cyhzbG90LCBzdGF0dXMpOwogfQogCiAKQEAgLTE5Myw5MiArMTkwLDYyIEBACiBzdGF0aWMgaW50IGdldF9wb3dlcl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqaG90cGx1Z19zbG90LCB1OCAqdmFsdWUpCiB7CiAJc3RydWN0IHNsb3QgKnNsb3QgPSBob3RwbHVnX3Nsb3QtPnByaXZhdGU7Ci0JaW50IHJldHZhbDsKIAogCWN0cmxfZGJnKHNsb3QtPmN0cmwsICIlczogcGh5c2ljYWxfc2xvdCA9ICVzXG4iLAogCQkgIF9fZnVuY19fLCBzbG90X25hbWUoc2xvdCkpOwogCi0JcmV0dmFsID0gcGNpZWhwX2dldF9wb3dlcl9zdGF0dXMoc2xvdCwgdmFsdWUpOwotCWlmIChyZXR2YWwgPCAwKQotCQkqdmFsdWUgPSBob3RwbHVnX3Nsb3QtPmluZm8tPnBvd2VyX3N0YXR1czsKLQotCXJldHVybiAwOworCXJldHVybiBwY2llaHBfZ2V0X3Bvd2VyX3N0YXR1cyhzbG90LCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyBpbnQgZ2V0X2F0dGVudGlvbl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqaG90cGx1Z19zbG90LCB1OCAqdmFsdWUpCiB7CiAJc3RydWN0IHNsb3QgKnNsb3QgPSBob3RwbHVnX3Nsb3QtPnByaXZhdGU7Ci0JaW50IHJldHZhbDsKIAogCWN0cmxfZGJnKHNsb3QtPmN0cmwsICIlczogcGh5c2ljYWxfc2xvdCA9ICVzXG4iLAogCQkgIF9fZnVuY19fLCBzbG90X25hbWUoc2xvdCkpOwogCi0JcmV0dmFsID0gcGNpZWhwX2dldF9hdHRlbnRpb25fc3RhdHVzKHNsb3QsIHZhbHVlKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJKnZhbHVlID0gaG90cGx1Z19zbG90LT5pbmZvLT5hdHRlbnRpb25fc3RhdHVzOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHBjaWVocF9nZXRfYXR0ZW50aW9uX3N0YXR1cyhzbG90LCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyBpbnQgZ2V0X2xhdGNoX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3QsIHU4ICp2YWx1ZSkKIHsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IGhvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKLQlpbnQgcmV0dmFsOwogCiAJY3RybF9kYmcoc2xvdC0+Y3RybCwgIiVzOiBwaHlzaWNhbF9zbG90ID0gJXNcbiIsCiAJCSBfX2Z1bmNfXywgc2xvdF9uYW1lKHNsb3QpKTsKIAotCXJldHZhbCA9IHBjaWVocF9nZXRfbGF0Y2hfc3RhdHVzKHNsb3QsIHZhbHVlKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJKnZhbHVlID0gaG90cGx1Z19zbG90LT5pbmZvLT5sYXRjaF9zdGF0dXM7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcGNpZWhwX2dldF9sYXRjaF9zdGF0dXMoc2xvdCwgdmFsdWUpOwogfQogCiBzdGF0aWMgaW50IGdldF9hZGFwdGVyX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3QsIHU4ICp2YWx1ZSkKIHsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IGhvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKLQlpbnQgcmV0dmFsOwogCiAJY3RybF9kYmcoc2xvdC0+Y3RybCwgIiVzOiBwaHlzaWNhbF9zbG90ID0gJXNcbiIsCiAJCSBfX2Z1bmNfXywgc2xvdF9uYW1lKHNsb3QpKTsKIAotCXJldHZhbCA9IHBjaWVocF9nZXRfYWRhcHRlcl9zdGF0dXMoc2xvdCwgdmFsdWUpOwotCWlmIChyZXR2YWwgPCAwKQotCQkqdmFsdWUgPSBob3RwbHVnX3Nsb3QtPmluZm8tPmFkYXB0ZXJfc3RhdHVzOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHBjaWVocF9nZXRfYWRhcHRlcl9zdGF0dXMoc2xvdCwgdmFsdWUpOwogfQogCiBzdGF0aWMgaW50IGdldF9tYXhfYnVzX3NwZWVkKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdCwKIAkJCQllbnVtIHBjaV9idXNfc3BlZWQgKnZhbHVlKQogewogCXN0cnVjdCBzbG90ICpzbG90ID0gaG90cGx1Z19zbG90LT5wcml2YXRlOwotCWludCByZXR2YWw7CiAKIAljdHJsX2RiZyhzbG90LT5jdHJsLCAiJXM6IHBoeXNpY2FsX3Nsb3QgPSAlc1xuIiwKIAkJIF9fZnVuY19fLCBzbG90X25hbWUoc2xvdCkpOwogCi0JcmV0dmFsID0gcGNpZWhwX2dldF9tYXhfbGlua19zcGVlZChzbG90LCB2YWx1ZSk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCSp2YWx1ZSA9IFBDSV9TUEVFRF9VTktOT1dOOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHBjaWVocF9nZXRfbWF4X2xpbmtfc3BlZWQoc2xvdCwgdmFsdWUpOwogfQogCiBzdGF0aWMgaW50IGdldF9jdXJfYnVzX3NwZWVkKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdCwgZW51bSBwY2lfYnVzX3NwZWVkICp2YWx1ZSkKIHsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IGhvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKLQlpbnQgcmV0dmFsOwogCiAJY3RybF9kYmcoc2xvdC0+Y3RybCwgIiVzOiBwaHlzaWNhbF9zbG90ID0gJXNcbiIsCiAJCSBfX2Z1bmNfXywgc2xvdF9uYW1lKHNsb3QpKTsKIAotCXJldHZhbCA9IHBjaWVocF9nZXRfY3VyX2xpbmtfc3BlZWQoc2xvdCwgdmFsdWUpOwotCWlmIChyZXR2YWwgPCAwKQotCQkqdmFsdWUgPSBQQ0lfU1BFRURfVU5LTk9XTjsKLQotCXJldHVybiAwOworCXJldHVybiBwY2llaHBfZ2V0X2N1cl9saW5rX3NwZWVkKHNsb3QsIHZhbHVlKTsKIH0KIAogc3RhdGljIGludCBwY2llaHBfcHJvYmUoc3RydWN0IHBjaWVfZGV2aWNlICpkZXYpCkBAIC0yODYsMTQgKzI1MywxMyBAQAogCWludCByYzsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybDsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdDsKLQl1OCB2YWx1ZTsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cG9ydDsKKwl1OCBvY2N1cGllZCwgcG93ZXJvbjsKIAogCWlmIChwY2llaHBfZm9yY2UpCiAJCWRldl9pbmZvKCZkZXYtPmRldmljZSwKIAkJCSAiQnlwYXNzaW5nIEJJT1MgY2hlY2sgZm9yIHBjaWVocCB1c2Ugb24gJXNcbiIsCi0JCQkgcGNpX25hbWUocGRldikpOwotCWVsc2UgaWYgKHBjaWVocF9nZXRfaHBfaHdfY29udHJvbF9mcm9tX2Zpcm13YXJlKHBkZXYpKQorCQkJIHBjaV9uYW1lKGRldi0+cG9ydCkpOworCWVsc2UgaWYgKHBjaWVocF9nZXRfaHBfaHdfY29udHJvbF9mcm9tX2Zpcm13YXJlKGRldi0+cG9ydCkpCiAJCWdvdG8gZXJyX291dF9ub25lOwogCiAJY3RybCA9IHBjaWVfaW5pdChkZXYpOwpAQCAtMzE4LDIzICsyODQsMTggQEAKIAlyYyA9IHBjaWVfaW5pdF9ub3RpZmljYXRpb24oY3RybCk7CiAJaWYgKHJjKSB7CiAJCWN0cmxfZXJyKGN0cmwsICJOb3RpZmljYXRpb24gaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKLQkJZ290byBlcnJfb3V0X3JlbGVhc2VfY3RscjsKKwkJZ290byBlcnJfb3V0X2ZyZWVfY3RybF9zbG90OwogCX0KIAogCS8qIENoZWNrIGlmIHNsb3QgaXMgb2NjdXBpZWQgKi8KIAlzbG90ID0gY3RybC0+c2xvdDsKLQlwY2llaHBfZ2V0X2FkYXB0ZXJfc3RhdHVzKHNsb3QsICZ2YWx1ZSk7Ci0JaWYgKHZhbHVlKSB7Ci0JCWlmIChwY2llaHBfZm9yY2UpCi0JCQlwY2llaHBfZW5hYmxlX3Nsb3Qoc2xvdCk7Ci0JfSBlbHNlIHsKLQkJLyogUG93ZXIgb2ZmIHNsb3QgaWYgbm90IG9jY3VwaWVkICovCi0JCWlmIChQT1dFUl9DVFJMKGN0cmwpKSB7Ci0JCQlyYyA9IHBjaWVocF9wb3dlcl9vZmZfc2xvdChzbG90KTsKLQkJCWlmIChyYykKLQkJCQlnb3RvIGVycl9vdXRfZnJlZV9jdHJsX3Nsb3Q7Ci0JCX0KLQl9CisJcGNpZWhwX2dldF9hZGFwdGVyX3N0YXR1cyhzbG90LCAmb2NjdXBpZWQpOworCXBjaWVocF9nZXRfcG93ZXJfc3RhdHVzKHNsb3QsICZwb3dlcm9uKTsKKwlpZiAob2NjdXBpZWQgJiYgcGNpZWhwX2ZvcmNlKQorCQlwY2llaHBfZW5hYmxlX3Nsb3Qoc2xvdCk7CisJLyogSWYgZW1wdHkgc2xvdCdzIHBvd2VyIHN0YXR1cyBpcyBvbiwgdHVybiBwb3dlciBvZmYgKi8KKwlpZiAoIW9jY3VwaWVkICYmIHBvd2Vyb24gJiYgUE9XRVJfQ1RSTChjdHJsKSkKKwkJcGNpZWhwX3Bvd2VyX29mZl9zbG90KHNsb3QpOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYwppbmRleCA4NDQ4N2QxLi5kNmFjMWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jCkBAIC0xNDIsMjMgKzE0Miw5IEBACiAKIAkvKiBwb3dlciBmYXVsdCAqLwogCWN0cmxfZGJnKGN0cmwsICJQb3dlciBmYXVsdCBpbnRlcnJ1cHQgcmVjZWl2ZWRcbiIpOwotCi0JaWYgKCFwY2llaHBfcXVlcnlfcG93ZXJfZmF1bHQocF9zbG90KSkgewotCQkvKgotCQkgKiBwb3dlciBmYXVsdCBDbGVhcmVkCi0JCSAqLwotCQljdHJsX2luZm8oY3RybCwgIlBvd2VyIGZhdWx0IGNsZWFyZWQgb24gU2xvdCglcylcbiIsCi0JCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKLQkJZXZlbnRfdHlwZSA9IElOVF9QT1dFUl9GQVVMVF9DTEVBUjsKLQl9IGVsc2UgewotCQkvKgotCQkgKiAgIHBvd2VyIGZhdWx0Ci0JCSAqLwotCQljdHJsX2luZm8oY3RybCwgIlBvd2VyIGZhdWx0IG9uIFNsb3QoJXMpXG4iLCBzbG90X25hbWUocF9zbG90KSk7Ci0JCWV2ZW50X3R5cGUgPSBJTlRfUE9XRVJfRkFVTFQ7Ci0JCWN0cmxfaW5mbyhjdHJsLCAiUG93ZXIgZmF1bHQgYml0ICV4IHNldFxuIiwgMCk7Ci0JfQotCisJY3RybF9lcnIoY3RybCwgIlBvd2VyIGZhdWx0IG9uIHNsb3QgJXNcbiIsIHNsb3RfbmFtZShwX3Nsb3QpKTsKKwlldmVudF90eXBlID0gSU5UX1BPV0VSX0ZBVUxUOworCWN0cmxfaW5mbyhjdHJsLCAiUG93ZXIgZmF1bHQgYml0ICV4IHNldFxuIiwgMCk7CiAJcXVldWVfaW50ZXJydXB0X2V2ZW50KHBfc2xvdCwgZXZlbnRfdHlwZSk7CiAKIAlyZXR1cm4gMTsKQEAgLTIyNCwxMyArMjEwLDEyIEBACiAJcmV0dmFsID0gcGNpZWhwX2NoZWNrX2xpbmtfc3RhdHVzKGN0cmwpOwogCWlmIChyZXR2YWwpIHsKIAkJY3RybF9lcnIoY3RybCwgIkZhaWxlZCB0byBjaGVjayBsaW5rIHN0YXR1c1xuIik7Ci0JCXNldF9zbG90X29mZihjdHJsLCBwX3Nsb3QpOwotCQlyZXR1cm4gcmV0dmFsOworCQlnb3RvIGVycl9leGl0OwogCX0KIAogCS8qIENoZWNrIGZvciBhIHBvd2VyIGZhdWx0ICovCi0JaWYgKHBjaWVocF9xdWVyeV9wb3dlcl9mYXVsdChwX3Nsb3QpKSB7Ci0JCWN0cmxfZGJnKGN0cmwsICJQb3dlciBmYXVsdCBkZXRlY3RlZFxuIik7CisJaWYgKGN0cmwtPnBvd2VyX2ZhdWx0X2RldGVjdGVkIHx8IHBjaWVocF9xdWVyeV9wb3dlcl9mYXVsdChwX3Nsb3QpKSB7CisJCWN0cmxfZXJyKGN0cmwsICJQb3dlciBmYXVsdCBvbiBzbG90ICVzXG4iLCBzbG90X25hbWUocF9zbG90KSk7CiAJCXJldHZhbCA9IC1FSU87CiAJCWdvdG8gZXJyX2V4aXQ7CiAJfQpAQCAtMzYzLDI1ICszNDgsNiBAQAogCW11dGV4X3VubG9jaygmcF9zbG90LT5sb2NrKTsKIH0KIAotc3RhdGljIGludCB1cGRhdGVfc2xvdF9pbmZvKHN0cnVjdCBzbG90ICpzbG90KQotewotCXN0cnVjdCBob3RwbHVnX3Nsb3RfaW5mbyAqaW5mbzsKLQlpbnQgcmVzdWx0OwotCi0JaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbmZvKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBjaWVocF9nZXRfcG93ZXJfc3RhdHVzKHNsb3QsICZpbmZvLT5wb3dlcl9zdGF0dXMpOwotCXBjaWVocF9nZXRfYXR0ZW50aW9uX3N0YXR1cyhzbG90LCAmaW5mby0+YXR0ZW50aW9uX3N0YXR1cyk7Ci0JcGNpZWhwX2dldF9sYXRjaF9zdGF0dXMoc2xvdCwgJmluZm8tPmxhdGNoX3N0YXR1cyk7Ci0JcGNpZWhwX2dldF9hZGFwdGVyX3N0YXR1cyhzbG90LCAmaW5mby0+YWRhcHRlcl9zdGF0dXMpOwotCi0JcmVzdWx0ID0gcGNpX2hwX2NoYW5nZV9zbG90X2luZm8oc2xvdC0+aG90cGx1Z19zbG90LCBpbmZvKTsKLQlrZnJlZSAoaW5mbyk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQogLyoKICAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBzbG90LT5sb2NrIGhlbGQKICAqLwpAQCAtNDQyLDcgKzQwOCw2IEBACiAJCSAqIHRvIGhvdC1hZGQgb3IgaG90LXJlbW92ZSBpcyB1bmRlcmdvaW5nCiAJCSAqLwogCQljdHJsX2luZm8oY3RybCwgIkJ1dHRvbiBpZ25vcmUgb24gU2xvdCglcylcbiIsIHNsb3RfbmFtZShwX3Nsb3QpKTsKLQkJdXBkYXRlX3Nsb3RfaW5mbyhwX3Nsb3QpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQljdHJsX3dhcm4oY3RybCwgIk5vdCBhIHZhbGlkIHN0YXRlXG4iKTsKQEAgLTUwMCwxMSArNDY1LDkgQEAKIAkJaWYgKCFIUF9TVVBSX1JNKGN0cmwpKQogCQkJYnJlYWs7CiAJCWN0cmxfZGJnKGN0cmwsICJTdXJwcmlzZSBSZW1vdmFsXG4iKTsKLQkJdXBkYXRlX3Nsb3RfaW5mbyhwX3Nsb3QpOwogCQloYW5kbGVfc3VycHJpc2VfZXZlbnQocF9zbG90KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJdXBkYXRlX3Nsb3RfaW5mbyhwX3Nsb3QpOwogCQlicmVhazsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmxvY2spOwpAQCAtNTQ3LDkgKzUxMCw2IEBACiAJaWYgKHJjKSB7CiAJCXBjaWVocF9nZXRfbGF0Y2hfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7CiAJfQotCi0JdXBkYXRlX3Nsb3RfaW5mbyhwX3Nsb3QpOwotCiAJcmV0dXJuIHJjOwogfQogCkBAIC01OTAsMTAgKzU1MCw3IEBACiAJCX0KIAl9CiAKLQlyZXQgPSByZW1vdmVfYm9hcmQocF9zbG90KTsKLQl1cGRhdGVfc2xvdF9pbmZvKHBfc2xvdCk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiByZW1vdmVfYm9hcmQocF9zbG90KTsKIH0KIAogaW50IHBjaWVocF9zeXNmc19lbmFibGVfc2xvdChzdHJ1Y3Qgc2xvdCAqcF9zbG90KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwppbmRleCA5ZWY0NjA1Li4xMDA0MGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwpAQCAtNDUsMjUgKzQ1LDI1IEBACiBzdGF0aWMgaW5saW5lIGludCBwY2llaHBfcmVhZHcoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwsIGludCByZWcsIHUxNiAqdmFsdWUpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IGN0cmwtPnBjaWUtPnBvcnQ7Ci0JcmV0dXJuIHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgY3RybC0+Y2FwX2Jhc2UgKyByZWcsIHZhbHVlKTsKKwlyZXR1cm4gcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwY2lfcGNpZV9jYXAoZGV2KSArIHJlZywgdmFsdWUpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBwY2llaHBfcmVhZGwoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwsIGludCByZWcsIHUzMiAqdmFsdWUpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IGN0cmwtPnBjaWUtPnBvcnQ7Ci0JcmV0dXJuIHBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGN0cmwtPmNhcF9iYXNlICsgcmVnLCB2YWx1ZSk7CisJcmV0dXJuIHBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBjaV9wY2llX2NhcChkZXYpICsgcmVnLCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHBjaWVocF93cml0ZXcoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwsIGludCByZWcsIHUxNiB2YWx1ZSkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gY3RybC0+cGNpZS0+cG9ydDsKLQlyZXR1cm4gcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgY3RybC0+Y2FwX2Jhc2UgKyByZWcsIHZhbHVlKTsKKwlyZXR1cm4gcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgcGNpX3BjaWVfY2FwKGRldikgKyByZWcsIHZhbHVlKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcGNpZWhwX3dyaXRlbChzdHJ1Y3QgY29udHJvbGxlciAqY3RybCwgaW50IHJlZywgdTMyIHZhbHVlKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBjdHJsLT5wY2llLT5wb3J0OwotCXJldHVybiBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgY3RybC0+Y2FwX2Jhc2UgKyByZWcsIHZhbHVlKTsKKwlyZXR1cm4gcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBjaV9wY2llX2NhcChkZXYpICsgcmVnLCB2YWx1ZSk7CiB9CiAKIC8qIFBvd2VyIENvbnRyb2wgQ29tbWFuZCAqLwpAQCAtMzE4LDggKzMxOCw4IEBACiAJCXJldHVybiByZXR2YWw7CiAJfQogCi0JY3RybF9kYmcoY3RybCwgIiVzOiBTTE9UQ1RSTCAleCwgdmFsdWUgcmVhZCAleFxuIiwKLQkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFBDSV9FWFBfU0xUQ1RMLCBzbG90X2N0cmwpOworCWN0cmxfZGJnKGN0cmwsICIlczogU0xPVENUUkwgJXgsIHZhbHVlIHJlYWQgJXhcbiIsIF9fZnVuY19fLAorCQkgcGNpX3BjaWVfY2FwKGN0cmwtPnBjaWUtPnBvcnQpICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY3RybCk7CiAKIAlhdHRlbl9sZWRfc3RhdGUgPSAoc2xvdF9jdHJsICYgUENJX0VYUF9TTFRDVExfQUlDKSA+PiA2OwogCkBAIC0zNTYsOCArMzU2LDggQEAKIAkJY3RybF9lcnIoY3RybCwgIiVzOiBDYW5ub3QgcmVhZCBTTE9UQ1RSTCByZWdpc3RlclxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KLQljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHZhbHVlIHJlYWQgJXhcbiIsCi0JCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jdHJsKTsKKwljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHZhbHVlIHJlYWQgJXhcbiIsIF9fZnVuY19fLAorCQkgcGNpX3BjaWVfY2FwKGN0cmwtPnBjaWUtPnBvcnQpICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY3RybCk7CiAKIAlwd3Jfc3RhdGUgPSAoc2xvdF9jdHJsICYgUENJX0VYUF9TTFRDVExfUENDKSA+PiAxMDsKIApAQCAtNDI3LDI3ICs0MjcsMjQgQEAKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IHNsb3QtPmN0cmw7CiAJdTE2IHNsb3RfY21kOwogCXUxNiBjbWRfbWFzazsKLQlpbnQgcmM7CiAKIAljbWRfbWFzayA9IFBDSV9FWFBfU0xUQ1RMX0FJQzsKIAlzd2l0Y2ggKHZhbHVlKSB7Ci0JCWNhc2UgMCA6CS8qIHR1cm4gb2ZmICovCi0JCQlzbG90X2NtZCA9IDB4MDBDMDsKLQkJCWJyZWFrOwotCQljYXNlIDE6CQkvKiB0dXJuIG9uICovCi0JCQlzbG90X2NtZCA9IDB4MDA0MDsKLQkJCWJyZWFrOwotCQljYXNlIDI6CQkvKiB0dXJuIGJsaW5rICovCi0JCQlzbG90X2NtZCA9IDB4MDA4MDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC0xOworCWNhc2UgMCA6CS8qIHR1cm4gb2ZmICovCisJCXNsb3RfY21kID0gMHgwMEMwOworCQlicmVhazsKKwljYXNlIDE6CQkvKiB0dXJuIG9uICovCisJCXNsb3RfY21kID0gMHgwMDQwOworCQlicmVhazsKKwljYXNlIDI6CQkvKiB0dXJuIGJsaW5rICovCisJCXNsb3RfY21kID0gMHgwMDgwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JcmMgPSBwY2llX3dyaXRlX2NtZChjdHJsLCBzbG90X2NtZCwgY21kX21hc2spOwotCWN0cmxfZGJnKGN0cmwsICIlczogU0xPVENUUkwgJXggd3JpdGUgY21kICV4XG4iLAotCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY21kKTsKLQotCXJldHVybiByYzsKKwljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHdyaXRlIGNtZCAleFxuIiwgX19mdW5jX18sCisJCSBwY2lfcGNpZV9jYXAoY3RybC0+cGNpZS0+cG9ydCkgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jbWQpOworCXJldHVybiBwY2llX3dyaXRlX2NtZChjdHJsLCBzbG90X2NtZCwgY21kX21hc2spOwogfQogCiB2b2lkIHBjaWVocF9ncmVlbl9sZWRfb24oc3RydWN0IHNsb3QgKnNsb3QpCkBAIC00NTksOCArNDU2LDggQEAKIAlzbG90X2NtZCA9IDB4MDEwMDsKIAljbWRfbWFzayA9IFBDSV9FWFBfU0xUQ1RMX1BJQzsKIAlwY2llX3dyaXRlX2NtZChjdHJsLCBzbG90X2NtZCwgY21kX21hc2spOwotCWN0cmxfZGJnKGN0cmwsICIlczogU0xPVENUUkwgJXggd3JpdGUgY21kICV4XG4iLAotCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY21kKTsKKwljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHdyaXRlIGNtZCAleFxuIiwgX19mdW5jX18sCisJCSBwY2lfcGNpZV9jYXAoY3RybC0+cGNpZS0+cG9ydCkgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jbWQpOwogfQogCiB2b2lkIHBjaWVocF9ncmVlbl9sZWRfb2ZmKHN0cnVjdCBzbG90ICpzbG90KQpAQCAtNDcyLDggKzQ2OSw4IEBACiAJc2xvdF9jbWQgPSAweDAzMDA7CiAJY21kX21hc2sgPSBQQ0lfRVhQX1NMVENUTF9QSUM7CiAJcGNpZV93cml0ZV9jbWQoY3RybCwgc2xvdF9jbWQsIGNtZF9tYXNrKTsKLQljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHdyaXRlIGNtZCAleFxuIiwKLQkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFBDSV9FWFBfU0xUQ1RMLCBzbG90X2NtZCk7CisJY3RybF9kYmcoY3RybCwgIiVzOiBTTE9UQ1RSTCAleCB3cml0ZSBjbWQgJXhcbiIsIF9fZnVuY19fLAorCQkgcGNpX3BjaWVfY2FwKGN0cmwtPnBjaWUtPnBvcnQpICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY21kKTsKIH0KIAogdm9pZCBwY2llaHBfZ3JlZW5fbGVkX2JsaW5rKHN0cnVjdCBzbG90ICpzbG90KQpAQCAtNDg1LDggKzQ4Miw4IEBACiAJc2xvdF9jbWQgPSAweDAyMDA7CiAJY21kX21hc2sgPSBQQ0lfRVhQX1NMVENUTF9QSUM7CiAJcGNpZV93cml0ZV9jbWQoY3RybCwgc2xvdF9jbWQsIGNtZF9tYXNrKTsKLQljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHdyaXRlIGNtZCAleFxuIiwKLQkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFBDSV9FWFBfU0xUQ1RMLCBzbG90X2NtZCk7CisJY3RybF9kYmcoY3RybCwgIiVzOiBTTE9UQ1RSTCAleCB3cml0ZSBjbWQgJXhcbiIsIF9fZnVuY19fLAorCQkgcGNpX3BjaWVfY2FwKGN0cmwtPnBjaWUtPnBvcnQpICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY21kKTsKIH0KIAogaW50IHBjaWVocF9wb3dlcl9vbl9zbG90KHN0cnVjdCBzbG90ICogc2xvdCkKQEAgLTUxNCw5NyArNTExLDM4IEBACiAJCQlyZXR1cm4gcmV0dmFsOwogCQl9CiAJfQorCWN0cmwtPnBvd2VyX2ZhdWx0X2RldGVjdGVkID0gMDsKIAogCXNsb3RfY21kID0gUE9XRVJfT047CiAJY21kX21hc2sgPSBQQ0lfRVhQX1NMVENUTF9QQ0M7Ci0JaWYgKCFwY2llaHBfcG9sbF9tb2RlKSB7Ci0JCS8qIEVuYWJsZSBwb3dlciBmYXVsdCBkZXRlY3Rpb24gdHVybmVkIG9mZiBhdCBwb3dlciBvZmYgdGltZSAqLwotCQlzbG90X2NtZCB8PSBQQ0lfRVhQX1NMVENUTF9QRkRFOwotCQljbWRfbWFzayB8PSBQQ0lfRVhQX1NMVENUTF9QRkRFOwotCX0KLQogCXJldHZhbCA9IHBjaWVfd3JpdGVfY21kKGN0cmwsIHNsb3RfY21kLCBjbWRfbWFzayk7CiAJaWYgKHJldHZhbCkgewogCQljdHJsX2VycihjdHJsLCAiV3JpdGUgJXggY29tbWFuZCBmYWlsZWQhXG4iLCBzbG90X2NtZCk7CiAJCXJldHVybiByZXR2YWw7CiAJfQotCWN0cmxfZGJnKGN0cmwsICIlczogU0xPVENUUkwgJXggd3JpdGUgY21kICV4XG4iLAotCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY21kKTsKKwljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHdyaXRlIGNtZCAleFxuIiwgX19mdW5jX18sCisJCSBwY2lfcGNpZV9jYXAoY3RybC0+cGNpZS0+cG9ydCkgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jbWQpOwogCi0JY3RybC0+cG93ZXJfZmF1bHRfZGV0ZWN0ZWQgPSAwOwogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHBjaWVfbWFza19iYWRfZGxscChzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gY3RybC0+cGNpZS0+cG9ydDsKLQlpbnQgcG9zOwotCXUzMiByZWc7Ci0KLQlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShkZXYsIFBDSV9FWFRfQ0FQX0lEX0VSUik7Ci0JaWYgKCFwb3MpCi0JCXJldHVybiAwOwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfQ09SX01BU0ssICZyZWcpOwotCWlmIChyZWcgJiBQQ0lfRVJSX0NPUl9CQURfRExMUCkKLQkJcmV0dXJuIDA7Ci0JcmVnIHw9IFBDSV9FUlJfQ09SX0JBRF9ETExQOwotCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfRVJSX0NPUl9NQVNLLCByZWcpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpZV91bm1hc2tfYmFkX2RsbHAoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IGN0cmwtPnBjaWUtPnBvcnQ7Ci0JdTMyIHJlZzsKLQlpbnQgcG9zOwotCi0JcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoZGV2LCBQQ0lfRVhUX0NBUF9JRF9FUlIpOwotCWlmICghcG9zKQotCQlyZXR1cm47Ci0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX0VSUl9DT1JfTUFTSywgJnJlZyk7Ci0JaWYgKCEocmVnICYgUENJX0VSUl9DT1JfQkFEX0RMTFApKQotCQlyZXR1cm47Ci0JcmVnICY9IH5QQ0lfRVJSX0NPUl9CQURfRExMUDsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX0VSUl9DT1JfTUFTSywgcmVnKTsKLX0KLQogaW50IHBjaWVocF9wb3dlcl9vZmZfc2xvdChzdHJ1Y3Qgc2xvdCAqIHNsb3QpCiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwogCXUxNiBzbG90X2NtZDsKIAl1MTYgY21kX21hc2s7Ci0JaW50IHJldHZhbCA9IDA7Ci0JaW50IGNoYW5nZWQ7Ci0KLQkvKgotCSAqIFNldCBCYWQgRExMUCBNYXNrIGJpdCBpbiBDb3JyZWN0YWJsZSBFcnJvciBNYXNrCi0JICogUmVnaXN0ZXIuIFRoaXMgaXMgdGhlIHdvcmthcm91bmQgYWdhaW5zdCBCYWQgRExMUCBlcnJvcgotCSAqIHRoYXQgc29tZXRpbWVzIGhhcHBlbnMgZHVyaW5nIHR1cm5pbmcgcG93ZXIgb2ZmIHRoZSBzbG90Ci0JICogd2hpY2ggY29uZm9ybXMgdG8gUENJIEV4cHJlc3MgMS4wYSBzcGVjLgotCSAqLwotCWNoYW5nZWQgPSBwY2llX21hc2tfYmFkX2RsbHAoY3RybCk7CisJaW50IHJldHZhbDsKIAogCXNsb3RfY21kID0gUE9XRVJfT0ZGOwogCWNtZF9tYXNrID0gUENJX0VYUF9TTFRDVExfUENDOwotCWlmICghcGNpZWhwX3BvbGxfbW9kZSkgewotCQkvKiBEaXNhYmxlIHBvd2VyIGZhdWx0IGRldGVjdGlvbiAqLwotCQlzbG90X2NtZCAmPSB+UENJX0VYUF9TTFRDVExfUEZERTsKLQkJY21kX21hc2sgfD0gUENJX0VYUF9TTFRDVExfUEZERTsKLQl9Ci0KIAlyZXR2YWwgPSBwY2llX3dyaXRlX2NtZChjdHJsLCBzbG90X2NtZCwgY21kX21hc2spOwogCWlmIChyZXR2YWwpIHsKIAkJY3RybF9lcnIoY3RybCwgIldyaXRlIGNvbW1hbmQgZmFpbGVkIVxuIik7Ci0JCXJldHZhbCA9IC0xOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIHJldHZhbDsKIAl9Ci0JY3RybF9kYmcoY3RybCwgIiVzOiBTTE9UQ1RSTCAleCB3cml0ZSBjbWQgJXhcbiIsCi0JCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jbWQpOwotIG91dDoKLQlpZiAoY2hhbmdlZCkKLQkJcGNpZV91bm1hc2tfYmFkX2RsbHAoY3RybCk7Ci0KLQlyZXR1cm4gcmV0dmFsOworCWN0cmxfZGJnKGN0cmwsICIlczogU0xPVENUUkwgJXggd3JpdGUgY21kICV4XG4iLCBfX2Z1bmNfXywKKwkJIHBjaV9wY2llX2NhcChjdHJsLT5wY2llLT5wb3J0KSArIFBDSV9FWFBfU0xUQ1RMLCBzbG90X2NtZCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBwY2llX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCkBAIC04NDAsMTEgKzc3OCwxOSBAQAogewogCXUxNiBjbWQsIG1hc2s7CiAKKwkvKgorCSAqIFRCRDogUG93ZXIgZmF1bHQgZGV0ZWN0ZWQgc29mdHdhcmUgbm90aWZpY2F0aW9uIHN1cHBvcnQuCisJICoKKwkgKiBQb3dlciBmYXVsdCBkZXRlY3RlZCBzb2Z0d2FyZSBub3RpZmljYXRpb24gaXMgbm90IGVuYWJsZWQKKwkgKiBub3csIGJlY2F1c2UgaXQgY2F1c2VkIHBvd2VyIGZhdWx0IGRldGVjdGVkIGludGVycnVwdCBzdG9ybQorCSAqIG9uIHNvbWUgbWFjaGluZXMuIE9uIHRob3NlIG1hY2hpbmVzLCBwb3dlciBmYXVsdCBkZXRlY3RlZAorCSAqIGJpdCBpbiB0aGUgc2xvdCBzdGF0dXMgcmVnaXN0ZXIgd2FzIHNldCBhZ2FpbiBpbW1lZGlhdGVseQorCSAqIHdoZW4gaXQgaXMgY2xlYXJlZCBpbiB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSwgYW5kCisJICogbmV4dCBwb3dlciBmYXVsdCBkZXRlY3RlZCBpbnRlcnJ1cHQgd2FzIG5vdGlmaWVkIGFnYWluLgorCSAqLwogCWNtZCA9IFBDSV9FWFBfU0xUQ1RMX1BEQ0U7CiAJaWYgKEFUVE5fQlVUVE4oY3RybCkpCiAJCWNtZCB8PSBQQ0lfRVhQX1NMVENUTF9BQlBFOwotCWlmIChQT1dFUl9DVFJMKGN0cmwpKQotCQljbWQgfD0gUENJX0VYUF9TTFRDVExfUEZERTsKIAlpZiAoTVJMX1NFTlMoY3RybCkpCiAJCWNtZCB8PSBQQ0lfRVhQX1NMVENUTF9NUkxTQ0U7CiAJaWYgKCFwY2llaHBfcG9sbF9tb2RlKQpAQCAtODY2LDcgKzgxMiw4IEBACiAJdTE2IG1hc2s7CiAJbWFzayA9IChQQ0lfRVhQX1NMVENUTF9QRENFIHwgUENJX0VYUF9TTFRDVExfQUJQRSB8CiAJCVBDSV9FWFBfU0xUQ1RMX01STFNDRSB8IFBDSV9FWFBfU0xUQ1RMX1BGREUgfAotCQlQQ0lfRVhQX1NMVENUTF9IUElFIHwgUENJX0VYUF9TTFRDVExfQ0NJRSk7CisJCVBDSV9FWFBfU0xUQ1RMX0hQSUUgfCBQQ0lfRVhQX1NMVENUTF9DQ0lFIHwKKwkJUENJX0VYUF9TTFRDVExfRExMU0NFKTsKIAlpZiAocGNpZV93cml0ZV9jbWQoY3RybCwgMCwgbWFzaykpCiAJCWN0cmxfd2FybihjdHJsLCAiQ2Fubm90IGRpc2FibGUgc29mdHdhcmUgbm90aWZpY2F0aW9uXG4iKTsKIH0KQEAgLTkzNCw3ICs4ODEsOCBAQAogCQkgIHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpOwogCWN0cmxfaW5mbyhjdHJsLCAiICBTdWJzeXN0ZW0gVmVuZG9yIElEICA6IDB4JTA0eFxuIiwKIAkJICBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yKTsKLQljdHJsX2luZm8oY3RybCwgIiAgUENJZSBDYXAgb2Zmc2V0ICAgICAgOiAweCUwMnhcbiIsIGN0cmwtPmNhcF9iYXNlKTsKKwljdHJsX2luZm8oY3RybCwgIiAgUENJZSBDYXAgb2Zmc2V0ICAgICAgOiAweCUwMnhcbiIsCisJCSAgcGNpX3BjaWVfY2FwKHBkZXYpKTsKIAlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX0NPVU5UX1JFU09VUkNFOyBpKyspIHsKIAkJaWYgKCFwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGkpKQogCQkJY29udGludWU7CkBAIC05NzgsOCArOTI2LDcgQEAKIAkJZ290byBhYm9ydDsKIAl9CiAJY3RybC0+cGNpZSA9IGRldjsKLQljdHJsLT5jYXBfYmFzZSA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9FWFApOwotCWlmICghY3RybC0+Y2FwX2Jhc2UpIHsKKwlpZiAoIXBjaV9wY2llX2NhcChwZGV2KSkgewogCQljdHJsX2VycihjdHJsLCAiQ2Fubm90IGZpbmQgUENJIEV4cHJlc3MgY2FwYWJpbGl0eVxuIik7CiAJCWdvdG8gYWJvcnRfY3RybDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWhwX3Nsb3QuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpaHBfc2xvdC5jCmluZGV4IGNjOGVjM2EuLjgwYjQ2MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpaHBfc2xvdC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpaHBfc2xvdC5jCkBAIC00Myw3ICs0Myw3IEBACiAJCSAqIFBlcmhhcHMgd2UgKnNob3VsZCogdXNlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIFBDSWUsIGJ1dAogCQkgKiBwY2llaHAgZGlkbid0LCBzbyB3ZSB3b24ndCBlaXRoZXIuCiAJCSAqLwotCQlpZiAoZGV2LT5pc19wY2llKQorCQlpZiAocGNpX2lzX3BjaWUoZGV2KSkKIAkJCXJldHVybjsKIAkJZGV2X2luZm8oJmRldi0+ZGV2LCAidXNpbmcgZGVmYXVsdCBQQ0kgc2V0dGluZ3NcbiIpOwogCQlocHAgPSAmcGNpX2RlZmF1bHRfdHlwZTA7CkBAIC0xMDIsNyArMTAyLDcgQEAKIAkJcmV0dXJuOwogCiAJLyogRmluZCBQQ0kgRXhwcmVzcyBjYXBhYmlsaXR5ICovCi0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwlwb3MgPSBwY2lfcGNpZV9jYXAoZGV2KTsKIAlpZiAoIXBvcykKIAkJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jIGIvZHJpdmVycy9wY2kvaW50ZWwtaW9tbXUuYwppbmRleCA5MjYxMzI3Li44ZDYxNTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jCisrKyBiL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmMKQEAgLTE2MTEsNyArMTYxMSw3IEBACiAJCQlyZXR1cm4gcmV0OwogCQlwYXJlbnQgPSBwYXJlbnQtPmJ1cy0+c2VsZjsKIAl9Ci0JaWYgKHRtcC0+aXNfcGNpZSkgLyogdGhpcyBpcyBhIFBDSUUtdG8tUENJIGJyaWRnZSAqLworCWlmIChwY2lfaXNfcGNpZSh0bXApKSAvKiB0aGlzIGlzIGEgUENJRS10by1QQ0kgYnJpZGdlICovCiAJCXJldHVybiBkb21haW5fY29udGV4dF9tYXBwaW5nX29uZShkb21haW4sCiAJCQkJCXBjaV9kb21haW5fbnIodG1wLT5zdWJvcmRpbmF0ZSksCiAJCQkJCXRtcC0+c3Vib3JkaW5hdGUtPm51bWJlciwgMCwKQEAgLTE2NTEsNyArMTY1MSw3IEBACiAJCQlyZXR1cm4gcmV0OwogCQlwYXJlbnQgPSBwYXJlbnQtPmJ1cy0+c2VsZjsKIAl9Ci0JaWYgKHRtcC0+aXNfcGNpZSkKKwlpZiAocGNpX2lzX3BjaWUodG1wKSkKIAkJcmV0dXJuIGRldmljZV9jb250ZXh0X21hcHBlZChpb21tdSwgdG1wLT5zdWJvcmRpbmF0ZS0+bnVtYmVyLAogCQkJCQkgICAgIDApOwogCWVsc2UKQEAgLTE4MjEsNyArMTgyMSw3IEBACiAKIAlkZXZfdG1wID0gcGNpX2ZpbmRfdXBzdHJlYW1fcGNpZV9icmlkZ2UocGRldik7CiAJaWYgKGRldl90bXApIHsKLQkJaWYgKGRldl90bXAtPmlzX3BjaWUpIHsKKwkJaWYgKHBjaV9pc19wY2llKGRldl90bXApKSB7CiAJCQlidXMgPSBkZXZfdG1wLT5zdWJvcmRpbmF0ZS0+bnVtYmVyOwogCQkJZGV2Zm4gPSAwOwogCQl9IGVsc2UgewpAQCAtMjE4Miw3ICsyMTgyLDcgQEAKIAkgKiB0aGUgMToxIGRvbWFpbiwganVzdCBpbiBfY2FzZV8gb25lIG9mIHRoZWlyIHNpYmxpbmdzIHR1cm5zIG91dAogCSAqIG5vdCB0byBiZSBhYmxlIHRvIG1hcCBhbGwgb2YgbWVtb3J5LgogCSAqLwotCWlmICghcGRldi0+aXNfcGNpZSkgeworCWlmICghcGNpX2lzX3BjaWUocGRldikpIHsKIAkJaWYgKCFwY2lfaXNfcm9vdF9idXMocGRldi0+YnVzKSkKIAkJCXJldHVybiAwOwogCQlpZiAocGRldi0+Y2xhc3MgPj4gOCA9PSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSkKQEAgLTMzMTksNyArMzMxOSw3IEBACiAJCQkJCSBwYXJlbnQtPmRldmZuKTsKIAkJCXBhcmVudCA9IHBhcmVudC0+YnVzLT5zZWxmOwogCQl9Ci0JCWlmICh0bXAtPmlzX3BjaWUpIC8qIHRoaXMgaXMgYSBQQ0lFLXRvLVBDSSBicmlkZ2UgKi8KKwkJaWYgKHBjaV9pc19wY2llKHRtcCkpIC8qIHRoaXMgaXMgYSBQQ0lFLXRvLVBDSSBicmlkZ2UgKi8KIAkJCWlvbW11X2RldGFjaF9kZXYoaW9tbXUsCiAJCQkJdG1wLT5zdWJvcmRpbmF0ZS0+bnVtYmVyLCAwKTsKIAkJZWxzZSAvKiB0aGlzIGlzIGEgbGVnYWN5IFBDSSBicmlkZ2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2ludHJfcmVtYXBwaW5nLmMgYi9kcml2ZXJzL3BjaS9pbnRyX3JlbWFwcGluZy5jCmluZGV4IDNiMzY1ODYuLjE0ODdiZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2ludHJfcmVtYXBwaW5nLmMKKysrIGIvZHJpdmVycy9wY2kvaW50cl9yZW1hcHBpbmcuYwpAQCAtNTIwLDcgKzUyMCw3IEBACiAJCXJldHVybiAtMTsKIAogCS8qIFBDSWUgZGV2aWNlIG9yIFJvb3QgQ29tcGxleCBpbnRlZ3JhdGVkIFBDSSBkZXZpY2UgKi8KLQlpZiAoZGV2LT5pc19wY2llIHx8ICFkZXYtPmJ1cy0+cGFyZW50KSB7CisJaWYgKHBjaV9pc19wY2llKGRldikgfHwgIWRldi0+YnVzLT5wYXJlbnQpIHsKIAkJc2V0X2lydGVfc2lkKGlydGUsIFNWVF9WRVJJRllfU0lEX1NRLCBTUV9BTExfMTYsCiAJCQkgICAgIChkZXYtPmJ1cy0+bnVtYmVyIDw8IDgpIHwgZGV2LT5kZXZmbik7CiAJCXJldHVybiAwOwpAQCAtNTI4LDcgKzUyOCw3IEBACiAKIAlicmlkZ2UgPSBwY2lfZmluZF91cHN0cmVhbV9wY2llX2JyaWRnZShkZXYpOwogCWlmIChicmlkZ2UpIHsKLQkJaWYgKGJyaWRnZS0+aXNfcGNpZSkgLyogdGhpcyBpcyBhIFBDSUUtdG8tUENJL1BDSVggYnJpZGdlICovCisJCWlmIChwY2lfaXNfcGNpZShicmlkZ2UpKS8qIHRoaXMgaXMgYSBQQ0lFLXRvLVBDSS9QQ0lYIGJyaWRnZSAqLwogCQkJc2V0X2lydGVfc2lkKGlydGUsIFNWVF9WRVJJRllfQlVTLCBTUV9BTExfMTYsCiAJCQkJKGJyaWRnZS0+YnVzLT5udW1iZXIgPDwgOCkgfCBkZXYtPmJ1cy0+bnVtYmVyKTsKIAkJZWxzZSAvKiB0aGlzIGlzIGEgbGVnYWN5IFBDSSBicmlkZ2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2lvYXBpYy5jIGIvZHJpdmVycy9wY2kvaW9hcGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwZDdiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNpL2lvYXBpYy5jCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogSU9BUElDL0lPeEFQSUMvSU9TQVBJQyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRnVqaXRzdSBMaW1pdGVkLgorICogKGMpIENvcHlyaWdodCAyMDA5IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisvKgorICogVGhpcyBkcml2ZXIgbWFuYWdlcyBQQ0kgSS9PIEFQSUNzIGFkZGVkIGJ5IGhvdHBsdWcgYWZ0ZXIgYm9vdC4gIFdlIHRyeSB0bworICogY2xhaW0gYWxsIEkvTyBBUElDIFBDSSBkZXZpY2VzLCBidXQgdGhvc2UgcHJlc2VudCBhdCBib290IHdlcmUgcmVnaXN0ZXJlZAorICogd2hlbiB3ZSBwYXJzZWQgdGhlIEFDUEkgTUFEVCwgc28gd2UnbGwgZmFpbCB3aGVuIHdlIHRyeSB0byByZS1yZWdpc3RlcgorICogdGhlbS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KKworc3RydWN0IGlvYXBpYyB7CisJYWNwaV9oYW5kbGUJaGFuZGxlOworCXUzMgkJZ3NpX2Jhc2U7Cit9OworCitzdGF0aWMgaW50IGlvYXBpY19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBsb25nIGdzYjsKKwlzdHJ1Y3QgaW9hcGljICppb2FwaWM7CisJdTY0IGFkZHI7CisJaW50IHJldDsKKwljaGFyICp0eXBlOworCisJaGFuZGxlID0gREVWSUNFX0FDUElfSEFORExFKCZkZXYtPmRldik7CisJaWYgKCFoYW5kbGUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9HU0IiLCBOVUxMLCAmZ3NiKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBUaGUgcHJldmlvdXMgY29kZSBpbiBhY3BpcGhwIGV2YWx1YXRlZCBfTUFUIGlmIF9HU0IgZmFpbGVkLCBidXQKKwkgKiBBQ1BJIHNwZWMgNC4wIHNlYyA2LjIuMiByZXF1aXJlcyBfR1NCIGZvciBob3QtcGx1Z2dhYmxlIEkvTyBBUElDcy4KKwkgKi8KKworCWlvYXBpYyA9IGt6YWxsb2Moc2l6ZW9mKCppb2FwaWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlvYXBpYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpb2FwaWMtPmhhbmRsZSA9IGhhbmRsZTsKKwlpb2FwaWMtPmdzaV9iYXNlID0gKHUzMikgZ3NiOworCisJaWYgKGRldi0+Y2xhc3MgPT0gUENJX0NMQVNTX1NZU1RFTV9QSUNfSU9BUElDKQorCQl0eXBlID0gIklPQVBJQyI7CisJZWxzZQorCQl0eXBlID0gIklPeEFQSUMiOworCisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBleGl0X2ZyZWU7CisKKwlwY2lfc2V0X21hc3RlcihkZXYpOworCisJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIDAsIHR5cGUpKQorCQlnb3RvIGV4aXRfZGlzYWJsZTsKKworCWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKKwlpZiAoYWNwaV9yZWdpc3Rlcl9pb2FwaWMoaW9hcGljLT5oYW5kbGUsIGFkZHIsIGlvYXBpYy0+Z3NpX2Jhc2UpKQorCQlnb3RvIGV4aXRfcmVsZWFzZTsKKworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIGlvYXBpYyk7CisJZGV2X2luZm8oJmRldi0+ZGV2LCAiJXMgYXQgJSNsbHgsIEdTSSAldVxuIiwgdHlwZSwgYWRkciwKKwkJIGlvYXBpYy0+Z3NpX2Jhc2UpOworCXJldHVybiAwOworCitleGl0X3JlbGVhc2U6CisJcGNpX3JlbGVhc2VfcmVnaW9uKGRldiwgMCk7CitleGl0X2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CitleGl0X2ZyZWU6CisJa2ZyZWUoaW9hcGljKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgaW9hcGljX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBpb2FwaWMgKmlvYXBpYyA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCisJYWNwaV91bnJlZ2lzdGVyX2lvYXBpYyhpb2FwaWMtPmhhbmRsZSwgaW9hcGljLT5nc2lfYmFzZSk7CisJcGNpX3JlbGVhc2VfcmVnaW9uKGRldiwgMCk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CisJa2ZyZWUoaW9hcGljKTsKK30KKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaW9hcGljX2RldmljZXNbXSA9IHsKKwl7IFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJICBQQ0lfQ0xBU1NfU1lTVEVNX1BJQ19JT0FQSUMgPDwgOCwgMHhmZmZmMDAsIH0sCisJeyBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAorCSAgUENJX0NMQVNTX1NZU1RFTV9QSUNfSU9YQVBJQyA8PCA4LCAweGZmZmYwMCwgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpb2FwaWNfZHJpdmVyID0geworCS5uYW1lCQk9ICJpb2FwaWMiLAorCS5pZF90YWJsZQk9IGlvYXBpY19kZXZpY2VzLAorCS5wcm9iZQkJPSBpb2FwaWNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChpb2FwaWNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlvYXBpY19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmlvYXBpY19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaW9hcGljX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmlvYXBpY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpb2FwaWNfaW5pdCk7Cittb2R1bGVfZXhpdChpb2FwaWNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pb3YuYyBiL2RyaXZlcnMvcGNpL2lvdi5jCmluZGV4IGUwM2ZlOTguLmIyYTQ0OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2lvdi5jCisrKyBiL2RyaXZlcnMvcGNpL2lvdi5jCkBAIC01NTUsNyArNTU1LDcgQEAKIHsKIAlpbnQgcG9zOwogCi0JaWYgKCFkZXYtPmlzX3BjaWUpCisJaWYgKCFwY2lfaXNfcGNpZShkZXYpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KGRldiwgUENJX0VYVF9DQVBfSURfU1JJT1YpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLWFjcGkuYyBiL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMKaW5kZXggMzMzMTdkZi4uY2M2MTdkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLWFjcGkuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIAkJaW50IHJldDsKIAogCQlyZXQgPSBhY3BpX3BtX2RldmljZV9zbGVlcF93YWtlKCZicmlkZ2UtPmRldiwgZW5hYmxlKTsKLQkJaWYgKCFyZXQgfHwgYnJpZGdlLT5pc19wY2llKQorCQlpZiAoIXJldCB8fCBwY2lfaXNfcGNpZShicmlkZ2UpKQogCQkJcmV0dXJuOwogCQlidXMgPSBidXMtPnBhcmVudDsKIAl9CkBAIC0xMzEsNyArMTMxLDcgQEAKIAlpZiAoYWNwaV9wY2lfY2FuX3dha2V1cChkZXYpKQogCQlyZXR1cm4gYWNwaV9wbV9kZXZpY2Vfc2xlZXBfd2FrZSgmZGV2LT5kZXYsIGVuYWJsZSk7CiAKLQlpZiAoIWRldi0+aXNfcGNpZSkKKwlpZiAoIXBjaV9pc19wY2llKGRldikpCiAJCWFjcGlfcGNpX3Byb3BhZ2F0ZV93YWtldXBfZW5hYmxlKGRldi0+YnVzLCBlbmFibGUpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCmluZGV4IDBmNjM4MmYuLmM1ZGY5NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCkBAIC03NCw3ICs3NCwxMSBAQAogCWNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrOwogCWludCBsZW47CiAKKyNpZmRlZiBDT05GSUdfTlVNQQorCW1hc2sgPSBjcHVtYXNrX29mX25vZGUoZGV2X3RvX25vZGUoZGV2KSk7CisjZWxzZQogCW1hc2sgPSBjcHVtYXNrX29mX3BjaWJ1cyh0b19wY2lfZGV2KGRldiktPmJ1cyk7CisjZW5kaWYKIAlsZW4gPSBjcHVtYXNrX3NjbnByaW50ZihidWYsIFBBR0VfU0laRS0yLCBtYXNrKTsKIAlidWZbbGVuKytdID0gJ1xuJzsKIAlidWZbbGVuXSA9ICdcMCc7CkBAIC04OCw3ICs5MiwxMSBAQAogCWNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrOwogCWludCBsZW47CiAKKyNpZmRlZiBDT05GSUdfTlVNQQorCW1hc2sgPSBjcHVtYXNrX29mX25vZGUoZGV2X3RvX25vZGUoZGV2KSk7CisjZWxzZQogCW1hc2sgPSBjcHVtYXNrX29mX3BjaWJ1cyh0b19wY2lfZGV2KGRldiktPmJ1cyk7CisjZW5kaWYKIAlsZW4gPSBjcHVsaXN0X3NjbnByaW50ZihidWYsIFBBR0VfU0laRS0yLCBtYXNrKTsKIAlidWZbbGVuKytdID0gJ1xuJzsKIAlidWZbbGVuXSA9ICdcMCc7CkBAIC0xNzYsNiArMTg0LDIxIEBACiAjZW5kaWYKIAogc3RhdGljIHNzaXplX3QKK2RtYV9tYXNrX2JpdHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisKKwlyZXR1cm4gc3ByaW50ZiAoYnVmLCAiJWRcbiIsIGZsczY0KHBkZXYtPmRtYV9tYXNrKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90Citjb25zaXN0ZW50X2RtYV9tYXNrX2JpdHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYgKGJ1ZiwgIiVkXG4iLCBmbHM2NChkZXYtPmNvaGVyZW50X2RtYV9tYXNrKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CiBtc2lfYnVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwpAQCAtMzA2LDYgKzMyOSw4IEBACiAjaWZkZWYgQ09ORklHX05VTUEKIAlfX0FUVFJfUk8obnVtYV9ub2RlKSwKICNlbmRpZgorCV9fQVRUUl9STyhkbWFfbWFza19iaXRzKSwKKwlfX0FUVFJfUk8oY29uc2lzdGVudF9kbWFfbWFza19iaXRzKSwKIAlfX0FUVFIoZW5hYmxlLCAwNjAwLCBpc19lbmFibGVkX3Nob3csIGlzX2VuYWJsZWRfc3RvcmUpLAogCV9fQVRUUihicm9rZW5fcGFyaXR5X3N0YXR1cywoU19JUlVHT3xTX0lXVVNSKSwKIAkJYnJva2VuX3Bhcml0eV9zdGF0dXNfc2hvdyxicm9rZW5fcGFyaXR5X3N0YXR1c19zdG9yZSksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaS5jCmluZGV4IDRlNGMyOTUuLjBiYzI3ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5jCkBAIC00Nyw2ICs0NywxNSBAQAogdW5zaWduZWQgbG9uZyBwY2lfaG90cGx1Z19pb19zaXplICA9IERFRkFVTFRfSE9UUExVR19JT19TSVpFOwogdW5zaWduZWQgbG9uZyBwY2lfaG90cGx1Z19tZW1fc2l6ZSA9IERFRkFVTFRfSE9UUExVR19NRU1fU0laRTsKIAorLyoKKyAqIFRoZSBkZWZhdWx0IENMUyBpcyB1c2VkIGlmIGFyY2ggZGlkbid0IHNldCBDTFMgZXhwbGljaXRseSBhbmQgbm90CisgKiBhbGwgcGNpIGRldmljZXMgYWdyZWUgb24gdGhlIHNhbWUgdmFsdWUuICBBcmNoIGNhbiBvdmVycmlkZSBlaXRoZXIKKyAqIHRoZSBkZmwgb3IgYWN0dWFsIHZhbHVlIGFzIGl0IHNlZXMgZml0LiAgRG9uJ3QgZm9yZ2V0IHRoaXMgaXMKKyAqIG1lYXN1cmVkIGluIDMyLWJpdCB3b3Jkcywgbm90IGJ5dGVzLgorICovCit1OCBwY2lfZGZsX2NhY2hlX2xpbmVfc2l6ZSBfX2RldmluaXRkYXRhID0gTDFfQ0FDSEVfQllURVMgPj4gMjsKK3U4IHBjaV9jYWNoZV9saW5lX3NpemU7CisKIC8qKgogICogcGNpX2J1c19tYXhfYnVzbnIgLSByZXR1cm5zIG1heGltdW0gUENJIGJ1cyBudW1iZXIgb2YgZ2l2ZW4gYnVzJyBjaGlsZHJlbgogICogQGJ1czogcG9pbnRlciB0byBQQ0kgYnVzIHN0cnVjdHVyZSB0byBzZWFyY2gKQEAgLTM3Myw4ICszODIsMTIgQEAKIAkJCWNvbnRpbnVlOwkvKiBXcm9uZyB0eXBlICovCiAJCWlmICghKChyZXMtPmZsYWdzIF4gci0+ZmxhZ3MpICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkpCiAJCQlyZXR1cm4gcjsJLyogRXhhY3QgbWF0Y2ggKi8KLQkJaWYgKChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkgJiYgIShyLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpKQotCQkJYmVzdCA9IHI7CS8qIEFwcHJveGltYXRpbmcgcHJlZmV0Y2hhYmxlIGJ5IG5vbi1wcmVmZXRjaGFibGUgKi8KKwkJLyogV2UgY2FuJ3QgaW5zZXJ0IGEgbm9uLXByZWZldGNoIHJlc291cmNlIGluc2lkZSBhIHByZWZldGNoYWJsZSBwYXJlbnQgLi4gKi8KKwkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkKKwkJCWNvbnRpbnVlOworCQkvKiAuLiBidXQgd2UgY2FuIHB1dCBhIHByZWZldGNoYWJsZSByZXNvdXJjZSBpbnNpZGUgYSBub24tcHJlZmV0Y2hhYmxlIG9uZSAqLworCQlpZiAoIWJlc3QpCisJCQliZXN0ID0gcjsKIAl9CiAJcmV0dXJuIGJlc3Q7CiB9CkBAIC03MjgsOCArNzQxLDggQEAKIAl1MTYgKmNhcDsKIAl1MTYgZmxhZ3M7CiAKLQlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9FWFApOwotCWlmIChwb3MgPD0gMCkKKwlwb3MgPSBwY2lfcGNpZV9jYXAoZGV2KTsKKwlpZiAoIXBvcykKIAkJcmV0dXJuIDA7CiAKIAlzYXZlX3N0YXRlID0gcGNpX2ZpbmRfc2F2ZWRfY2FwKGRldiwgUENJX0NBUF9JRF9FWFApOwpAQCAtODM3LDcgKzg1MCw3IEBACiAJaW50IGk7CiAJLyogWFhYOiAxMDAlIGR3b3JkIGFjY2VzcyBvayBoZXJlPyAqLwogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBpICogNCwmZGV2LT5zYXZlZF9jb25maWdfc3BhY2VbaV0pOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBpICogNCwgJmRldi0+c2F2ZWRfY29uZmlnX3NwYWNlW2ldKTsKIAlkZXYtPnN0YXRlX3NhdmVkID0gdHJ1ZTsKIAlpZiAoKGkgPSBwY2lfc2F2ZV9wY2llX3N0YXRlKGRldikpICE9IDApCiAJCXJldHVybiBpOwpAQCAtMTIwMiw3ICsxMjE1LDcgQEAKIAogCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIGRldi0+cG1fY2FwICsgUENJX1BNX0NUUkwsIHBtY3NyKTsKIAotCWRldl9wcmludGsoS0VSTl9JTkZPLCAmZGV2LT5kZXYsICJQTUUjICVzXG4iLAorCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmRldi0+ZGV2LCAiUE1FIyAlc1xuIiwKIAkJCWVuYWJsZSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwogfQogCkBAIC0xNDEzLDcgKzE0MjYsOCBAQAogCiAJcG1jICY9IFBDSV9QTV9DQVBfUE1FX01BU0s7CiAJaWYgKHBtYykgewotCQlkZXZfaW5mbygmZGV2LT5kZXYsICJQTUUjIHN1cHBvcnRlZCBmcm9tJXMlcyVzJXMlc1xuIiwKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsCisJCQkgIlBNRSMgc3VwcG9ydGVkIGZyb20lcyVzJXMlcyVzXG4iLAogCQkJIChwbWMgJiBQQ0lfUE1fQ0FQX1BNRV9EMCkgPyAiIEQwIiA6ICIiLAogCQkJIChwbWMgJiBQQ0lfUE1fQ0FQX1BNRV9EMSkgPyAiIEQxIiA6ICIiLAogCQkJIChwbWMgJiBQQ0lfUE1fQ0FQX1BNRV9EMikgPyAiIEQyIiA6ICIiLApAQCAtMTUxMCw3ICsxNTI0LDcgQEAKIAl1MTYgY3RybDsKIAlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlOwogCi0JaWYgKCFkZXYtPmlzX3BjaWUgfHwgZGV2LT5kZXZmbikKKwlpZiAoIXBjaV9pc19wY2llKGRldikgfHwgZGV2LT5kZXZmbikKIAkJcmV0dXJuOwogCiAJcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoZGV2LCBQQ0lfRVhUX0NBUF9JRF9BUkkpOwpAQCAtMTUxOCwxMCArMTUzMiwxMCBAQAogCQlyZXR1cm47CiAKIAlicmlkZ2UgPSBkZXYtPmJ1cy0+c2VsZjsKLQlpZiAoIWJyaWRnZSB8fCAhYnJpZGdlLT5pc19wY2llKQorCWlmICghYnJpZGdlIHx8ICFwY2lfaXNfcGNpZShicmlkZ2UpKQogCQlyZXR1cm47CiAKLQlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGJyaWRnZSwgUENJX0NBUF9JRF9FWFApOworCXBvcyA9IHBjaV9wY2llX2NhcChicmlkZ2UpOwogCWlmICghcG9zKQogCQlyZXR1cm47CiAKQEAgLTE1MzYsNiArMTU1MCw1NCBAQAogCWJyaWRnZS0+YXJpX2VuYWJsZWQgPSAxOwogfQogCitzdGF0aWMgaW50IHBjaV9hY3NfZW5hYmxlOworCisvKioKKyAqIHBjaV9yZXF1ZXN0X2FjcyAtIGFzayBmb3IgQUNTIHRvIGJlIGVuYWJsZWQgaWYgc3VwcG9ydGVkCisgKi8KK3ZvaWQgcGNpX3JlcXVlc3RfYWNzKHZvaWQpCit7CisJcGNpX2Fjc19lbmFibGUgPSAxOworfQorCisvKioKKyAqIHBjaV9lbmFibGVfYWNzIC0gZW5hYmxlIEFDUyBpZiBoYXJkd2FyZSBzdXBwb3J0IGl0CisgKiBAZGV2OiB0aGUgUENJIGRldmljZQorICovCit2b2lkIHBjaV9lbmFibGVfYWNzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHBvczsKKwl1MTYgY2FwOworCXUxNiBjdHJsOworCisJaWYgKCFwY2lfYWNzX2VuYWJsZSkKKwkJcmV0dXJuOworCisJaWYgKCFwY2lfaXNfcGNpZShkZXYpKQorCQlyZXR1cm47CisKKwlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShkZXYsIFBDSV9FWFRfQ0FQX0lEX0FDUyk7CisJaWYgKCFwb3MpCisJCXJldHVybjsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0FDU19DQVAsICZjYXApOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0FDU19DVFJMLCAmY3RybCk7CisKKwkvKiBTb3VyY2UgVmFsaWRhdGlvbiAqLworCWN0cmwgfD0gKGNhcCAmIFBDSV9BQ1NfU1YpOworCisJLyogUDJQIFJlcXVlc3QgUmVkaXJlY3QgKi8KKwljdHJsIHw9IChjYXAgJiBQQ0lfQUNTX1JSKTsKKworCS8qIFAyUCBDb21wbGV0aW9uIFJlZGlyZWN0ICovCisJY3RybCB8PSAoY2FwICYgUENJX0FDU19DUik7CisKKwkvKiBVcHN0cmVhbSBGb3J3YXJkaW5nICovCisJY3RybCB8PSAoY2FwICYgUENJX0FDU19VRik7CisKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfQUNTX0NUUkwsIGN0cmwpOworfQorCiAvKioKICAqIHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4gLSBzd2l6emxlIElOVHggZm9yIGRldmljZSBiZWhpbmQgYnJpZGdlCiAgKiBAZGV2OiB0aGUgUENJIGRldmljZQpAQCAtMTY2OSw5ICsxNzMxLDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyX291dDoKLQlkZXZfd2FybigmcGRldi0+ZGV2LCAiQkFSICVkOiBjYW4ndCByZXNlcnZlICVzIHJlZ2lvbiAlcFJcbiIsCi0JCSBiYXIsCi0JCSBwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgYmFyKSAmIElPUkVTT1VSQ0VfSU8gPyAiSS9PIiA6ICJtZW0iLAorCWRldl93YXJuKCZwZGV2LT5kZXYsICJCQVIgJWQ6IGNhbid0IHJlc2VydmUgJXBSXG4iLCBiYXIsCiAJCSAmcGRldi0+cmVzb3VyY2VbYmFyXSk7CiAJcmV0dXJuIC1FQlVTWTsKIH0KQEAgLTE4NjYsMzEgKzE5MjYsNiBAQAogCV9fcGNpX3NldF9tYXN0ZXIoZGV2LCBmYWxzZSk7CiB9CiAKLSNpZmRlZiBQQ0lfRElTQUJMRV9NV0kKLWludCBwY2lfc2V0X213aShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXJldHVybiAwOwotfQotCi1pbnQgcGNpX3RyeV9zZXRfbXdpKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgcGNpX2NsZWFyX213aShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotfQotCi0jZWxzZQotCi0jaWZuZGVmIFBDSV9DQUNIRV9MSU5FX0JZVEVTCi0jZGVmaW5lIFBDSV9DQUNIRV9MSU5FX0JZVEVTIEwxX0NBQ0hFX0JZVEVTCi0jZW5kaWYKLQotLyogVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhcmNoIGNvZGUuICovCi0vKiBEb24ndCBmb3JnZXQgdGhpcyBpcyBtZWFzdXJlZCBpbiAzMi1iaXQgd29yZHMsIG5vdCBieXRlcyAqLwotdTggcGNpX2NhY2hlX2xpbmVfc2l6ZSA9IFBDSV9DQUNIRV9MSU5FX0JZVEVTIC8gNDsKLQogLyoqCiAgKiBwY2lfc2V0X2NhY2hlbGluZV9zaXplIC0gZW5zdXJlIHRoZSBDQUNIRV9MSU5FX1NJWkUgcmVnaXN0ZXIgaXMgcHJvZ3JhbW1lZAogICogQGRldjogdGhlIFBDSSBkZXZpY2UgZm9yIHdoaWNoIE1XSSBpcyB0byBiZSBlbmFibGVkCkBAIC0xOTAxLDEzICsxOTM2LDEyIEBACiAgKgogICogUkVUVVJOUzogQW4gYXBwcm9wcmlhdGUgLUVSUk5PIGVycm9yIHZhbHVlIG9uIGVycm9yLCBvciB6ZXJvIGZvciBzdWNjZXNzLgogICovCi1zdGF0aWMgaW50Ci1wY2lfc2V0X2NhY2hlbGluZV9zaXplKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitpbnQgcGNpX3NldF9jYWNoZWxpbmVfc2l6ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXU4IGNhY2hlbGluZV9zaXplOwogCiAJaWYgKCFwY2lfY2FjaGVfbGluZV9zaXplKQotCQlyZXR1cm4gLUVJTlZBTDsJCS8qIFRoZSBzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IE1XSS4gKi8KKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBWYWxpZGF0ZSBjdXJyZW50IHNldHRpbmc6IHRoZSBQQ0lfQ0FDSEVfTElORV9TSVpFIG11c3QgYmUKIAkgICBlcXVhbCB0byBvciBtdWx0aXBsZSBvZiB0aGUgcmlnaHQgdmFsdWUuICovCkBAIC0xOTI4LDYgKzE5NjIsMjQgQEAKIAogCXJldHVybiAtRUlOVkFMOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX3NldF9jYWNoZWxpbmVfc2l6ZSk7CisKKyNpZmRlZiBQQ0lfRElTQUJMRV9NV0kKK2ludCBwY2lfc2V0X213aShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXJldHVybiAwOworfQorCitpbnQgcGNpX3RyeV9zZXRfbXdpKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcGNpX2NsZWFyX213aShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworfQorCisjZWxzZQogCiAvKioKICAqIHBjaV9zZXRfbXdpIC0gZW5hYmxlcyBtZW1vcnktd3JpdGUtaW52YWxpZGF0ZSBQQ0kgdHJhbnNhY3Rpb24KQEAgLTIwNjIsNiArMjExNCw3IEBACiAJCXJldHVybiAtRUlPOwogCiAJZGV2LT5kbWFfbWFzayA9IG1hc2s7CisJZGV2X2RiZygmZGV2LT5kZXYsICJ1c2luZyAlZGJpdCBETUEgbWFza1xuIiwgZmxzNjQobWFzaykpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMDczLDYgKzIxMjYsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAogCWRldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrID0gbWFzazsKKwlkZXZfZGJnKCZkZXYtPmRldiwgInVzaW5nICVkYml0IGNvbnNpc3RlbnQgRE1BIG1hc2tcbiIsIGZsczY0KG1hc2spKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjA5OSw5ICsyMTUzLDkgQEAKIAlpbnQgaTsKIAlpbnQgcG9zOwogCXUzMiBjYXA7Ci0JdTE2IHN0YXR1czsKKwl1MTYgc3RhdHVzLCBjb250cm9sOwogCi0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwlwb3MgPSBwY2lfcGNpZV9jYXAoZGV2KTsKIAlpZiAoIXBvcykKIAkJcmV0dXJuIC1FTk9UVFk7CiAKQEAgLTIxMjYsOCArMjE4MCwxMCBAQAogCQkJInByb2NlZWRpbmcgd2l0aCByZXNldCBhbnl3YXlcbiIpOwogCiBjbGVhcjoKLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfRVhQX0RFVkNUTCwKLQkJCQlQQ0lfRVhQX0RFVkNUTF9CQ1JfRkxSKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9FWFBfREVWQ1RMLCAmY29udHJvbCk7CisJY29udHJvbCB8PSBQQ0lfRVhQX0RFVkNUTF9CQ1JfRkxSOworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9FWFBfREVWQ1RMLCBjb250cm9sKTsKKwogCW1zbGVlcCgxMDApOwogCiAJcmV0dXJuIDA7CkBAIC0yNDUwLDcgKzI1MDYsNyBAQAogCWludCByZXQsIGNhcDsKIAl1MTYgY3RsOwogCi0JY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwljYXAgPSBwY2lfcGNpZV9jYXAoZGV2KTsKIAlpZiAoIWNhcCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTI0ODAsNyArMjUzNiw3IEBACiAKIAl2ID0gKGZmcyhycSkgLSA4KSA8PCAxMjsKIAotCWNhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisJY2FwID0gcGNpX3BjaWVfY2FwKGRldik7CiAJaWYgKCFjYXApCiAJCWdvdG8gb3V0OwogCkBAIC0yNTQwLDcgKzI1OTYsNyBAQAogCQkJcmV0dXJuIHJlZzsKIAl9CiAKLQlkZXZfZXJyKCZkZXYtPmRldiwgIkJBUjogaW52YWxpZCByZXNvdXJjZSAjJWRcbiIsIHJlc25vKTsKKwlkZXZfZXJyKCZkZXYtPmRldiwgIkJBUiAlZDogaW52YWxpZCByZXNvdXJjZVxuIiwgcmVzbm8pOwogCXJldHVybiAwOwogfQogCkBAIC0yNTkwLDcgKzI2NDYsNyBAQAogCiAjZGVmaW5lIFJFU09VUkNFX0FMSUdOTUVOVF9QQVJBTV9TSVpFIENPTU1BTkRfTElORV9TSVpFCiBzdGF0aWMgY2hhciByZXNvdXJjZV9hbGlnbm1lbnRfcGFyYW1bUkVTT1VSQ0VfQUxJR05NRU5UX1BBUkFNX1NJWkVdID0gezB9Owotc3BpbmxvY2tfdCByZXNvdXJjZV9hbGlnbm1lbnRfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socmVzb3VyY2VfYWxpZ25tZW50X2xvY2spOwogCiAvKioKICAqIHBjaV9zcGVjaWZpZWRfcmVzb3VyY2VfYWxpZ25tZW50IC0gZ2V0IHJlc291cmNlIGFsaWdubWVudCBzcGVjaWZpZWQgYnkgdXNlci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5oIGIvZHJpdmVycy9wY2kvcGNpLmgKaW5kZXggZDkyZDE5NS4uMzNlZDhlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmgKKysrIGIvZHJpdmVycy9wY2kvcGNpLmgKQEAgLTMxMSw0ICszMTEsNiBAQAogCXJldHVybiByZXNvdXJjZV9hbGlnbm1lbnQocmVzKTsKIH0KIAorZXh0ZXJuIHZvaWQgcGNpX2VuYWJsZV9hY3Moc3RydWN0IHBjaV9kZXYgKmRldik7CisKICNlbmRpZiAvKiBEUklWRVJTX1BDSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJfaW5qZWN0LmMgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJfaW5qZWN0LmMKaW5kZXggNjJkMTVmNi4uN2ZjZDUzMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2Flcl9pbmplY3QuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJfaW5qZWN0LmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlICJhZXJkcnYuaCIKIAogc3RydWN0IGFlcl9lcnJvcl9pbmogewpAQCAtMzUsMTAgKzM2LDEyIEBACiAJdTMyIGhlYWRlcl9sb2cxOwogCXUzMiBoZWFkZXJfbG9nMjsKIAl1MzIgaGVhZGVyX2xvZzM7CisJdTE2IGRvbWFpbjsKIH07CiAKIHN0cnVjdCBhZXJfZXJyb3IgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1MTYgZG9tYWluOwogCXVuc2lnbmVkIGludCBidXM7CiAJdW5zaWduZWQgaW50IGRldmZuOwogCWludCBwb3NfY2FwX2VycjsKQEAgLTY2LDIyICs2OSwyNyBAQAogLyogUHJvdGVjdCBlaW5qZWN0ZWQgYW5kIHBjaV9idXNfb3BzX2xpc3QgKi8KIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW5qZWN0X2xvY2spOwogCi1zdGF0aWMgdm9pZCBhZXJfZXJyb3JfaW5pdChzdHJ1Y3QgYWVyX2Vycm9yICplcnIsIHVuc2lnbmVkIGludCBidXMsCi0JCQkgICB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCBwb3NfY2FwX2VycikKK3N0YXRpYyB2b2lkIGFlcl9lcnJvcl9pbml0KHN0cnVjdCBhZXJfZXJyb3IgKmVyciwgdTE2IGRvbWFpbiwKKwkJCSAgIHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCSAgIGludCBwb3NfY2FwX2VycikKIHsKIAlJTklUX0xJU1RfSEVBRCgmZXJyLT5saXN0KTsKKwllcnItPmRvbWFpbiA9IGRvbWFpbjsKIAllcnItPmJ1cyA9IGJ1czsKIAllcnItPmRldmZuID0gZGV2Zm47CiAJZXJyLT5wb3NfY2FwX2VyciA9IHBvc19jYXBfZXJyOwogfQogCiAvKiBpbmplY3RfbG9jayBtdXN0IGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcgKi8KLXN0YXRpYyBzdHJ1Y3QgYWVyX2Vycm9yICpfX2ZpbmRfYWVyX2Vycm9yKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZmbikKK3N0YXRpYyBzdHJ1Y3QgYWVyX2Vycm9yICpfX2ZpbmRfYWVyX2Vycm9yKHUxNiBkb21haW4sIHVuc2lnbmVkIGludCBidXMsCisJCQkJCSAgdW5zaWduZWQgaW50IGRldmZuKQogewogCXN0cnVjdCBhZXJfZXJyb3IgKmVycjsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZXJyLCAmZWluamVjdGVkLCBsaXN0KSB7Ci0JCWlmIChidXMgPT0gZXJyLT5idXMgJiYgZGV2Zm4gPT0gZXJyLT5kZXZmbikKKwkJaWYgKGRvbWFpbiA9PSBlcnItPmRvbWFpbiAmJgorCQkgICAgYnVzID09IGVyci0+YnVzICYmCisJCSAgICBkZXZmbiA9PSBlcnItPmRldmZuKQogCQkJcmV0dXJuIGVycjsKIAl9CiAJcmV0dXJuIE5VTEw7CkBAIC05MCw3ICs5OCwxMCBAQAogLyogaW5qZWN0X2xvY2sgbXVzdCBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nICovCiBzdGF0aWMgc3RydWN0IGFlcl9lcnJvciAqX19maW5kX2Flcl9lcnJvcl9ieV9kZXYoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlyZXR1cm4gX19maW5kX2Flcl9lcnJvcihkZXYtPmJ1cy0+bnVtYmVyLCBkZXYtPmRldmZuKTsKKwlpbnQgZG9tYWluID0gcGNpX2RvbWFpbl9ucihkZXYtPmJ1cyk7CisJaWYgKGRvbWFpbiA8IDApCisJCXJldHVybiBOVUxMOworCXJldHVybiBfX2ZpbmRfYWVyX2Vycm9yKCh1MTYpZG9tYWluLCBkZXYtPmJ1cy0+bnVtYmVyLCBkZXYtPmRldmZuKTsKIH0KIAogLyogaW5qZWN0X2xvY2sgbXVzdCBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nICovCkBAIC0xNzIsMTEgKzE4MywxNSBAQAogCXN0cnVjdCBhZXJfZXJyb3IgKmVycjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBwY2lfb3BzICpvcHM7CisJaW50IGRvbWFpbjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpbmplY3RfbG9jaywgZmxhZ3MpOwogCWlmIChzaXplICE9IHNpemVvZih1MzIpKQogCQlnb3RvIG91dDsKLQllcnIgPSBfX2ZpbmRfYWVyX2Vycm9yKGJ1cy0+bnVtYmVyLCBkZXZmbik7CisJZG9tYWluID0gcGNpX2RvbWFpbl9ucihidXMpOworCWlmIChkb21haW4gPCAwKQorCQlnb3RvIG91dDsKKwllcnIgPSBfX2ZpbmRfYWVyX2Vycm9yKCh1MTYpZG9tYWluLCBidXMtPm51bWJlciwgZGV2Zm4pOwogCWlmICghZXJyKQogCQlnb3RvIG91dDsKIApAQCAtMjAwLDExICsyMTUsMTUgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBydzFjczsKIAlzdHJ1Y3QgcGNpX29wcyAqb3BzOworCWludCBkb21haW47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5qZWN0X2xvY2ssIGZsYWdzKTsKIAlpZiAoc2l6ZSAhPSBzaXplb2YodTMyKSkKIAkJZ290byBvdXQ7Ci0JZXJyID0gX19maW5kX2Flcl9lcnJvcihidXMtPm51bWJlciwgZGV2Zm4pOworCWRvbWFpbiA9IHBjaV9kb21haW5fbnIoYnVzKTsKKwlpZiAoZG9tYWluIDwgMCkKKwkJZ290byBvdXQ7CisJZXJyID0gX19maW5kX2Flcl9lcnJvcigodTE2KWRvbWFpbiwgYnVzLT5udW1iZXIsIGRldmZuKTsKIAlpZiAoIWVycikKIAkJZ290byBvdXQ7CiAKQEAgLTI2Miw3ICsyODEsNyBAQAogc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpwY2llX2ZpbmRfcm9vdF9wb3J0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJd2hpbGUgKDEpIHsKLQkJaWYgKCFkZXYtPmlzX3BjaWUpCisJCWlmICghcGNpX2lzX3BjaWUoZGV2KSkKIAkJCWJyZWFrOwogCQlpZiAoZGV2LT5wY2llX3R5cGUgPT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCkKIAkJCXJldHVybiBkZXY7CkBAIC0zMDUsMjUgKzMyNCwyNSBAQAogCXUzMiBzZXZlcjsKIAlpbnQgcmV0ID0gMDsKIAotCWRldiA9IHBjaV9nZXRfYnVzX2FuZF9zbG90KGVpbmotPmJ1cywgZGV2Zm4pOworCWRldiA9IHBjaV9nZXRfZG9tYWluX2J1c19hbmRfc2xvdCgoaW50KWVpbmotPmRvbWFpbiwgZWluai0+YnVzLCBkZXZmbik7CiAJaWYgKCFkZXYpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gLUVOT0RFVjsKIAlycGRldiA9IHBjaWVfZmluZF9yb290X3BvcnQoZGV2KTsKIAlpZiAoIXJwZGV2KSB7Ci0JCXJldCA9IC1FSU5WQUw7CisJCXJldCA9IC1FTk9UVFk7CiAJCWdvdG8gb3V0X3B1dDsKIAl9CiAKIAlwb3NfY2FwX2VyciA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KGRldiwgUENJX0VYVF9DQVBfSURfRVJSKTsKIAlpZiAoIXBvc19jYXBfZXJyKSB7Ci0JCXJldCA9IC1FSU87CisJCXJldCA9IC1FTk9UVFk7CiAJCWdvdG8gb3V0X3B1dDsKIAl9CiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcG9zX2NhcF9lcnIgKyBQQ0lfRVJSX1VOQ09SX1NFVkVSLCAmc2V2ZXIpOwogCiAJcnBfcG9zX2NhcF9lcnIgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShycGRldiwgUENJX0VYVF9DQVBfSURfRVJSKTsKIAlpZiAoIXJwX3Bvc19jYXBfZXJyKSB7Ci0JCXJldCA9IC1FSU87CisJCXJldCA9IC1FTk9UVFk7CiAJCWdvdG8gb3V0X3B1dDsKIAl9CiAKQEAgLTM0NCw3ICszNjMsOCBAQAogCWlmICghZXJyKSB7CiAJCWVyciA9IGVycl9hbGxvYzsKIAkJZXJyX2FsbG9jID0gTlVMTDsKLQkJYWVyX2Vycm9yX2luaXQoZXJyLCBlaW5qLT5idXMsIGRldmZuLCBwb3NfY2FwX2Vycik7CisJCWFlcl9lcnJvcl9pbml0KGVyciwgZWluai0+ZG9tYWluLCBlaW5qLT5idXMsIGRldmZuLAorCQkJICAgICAgIHBvc19jYXBfZXJyKTsKIAkJbGlzdF9hZGQoJmVyci0+bGlzdCwgJmVpbmplY3RlZCk7CiAJfQogCWVyci0+dW5jb3Jfc3RhdHVzIHw9IGVpbmotPnVuY29yX3N0YXR1czsKQEAgLTM1OCw3ICszNzgsOCBAQAogCWlmICghcnBlcnIpIHsKIAkJcnBlcnIgPSBycGVycl9hbGxvYzsKIAkJcnBlcnJfYWxsb2MgPSBOVUxMOwotCQlhZXJfZXJyb3JfaW5pdChycGVyciwgcnBkZXYtPmJ1cy0+bnVtYmVyLCBycGRldi0+ZGV2Zm4sCisJCWFlcl9lcnJvcl9pbml0KHJwZXJyLCBwY2lfZG9tYWluX25yKHJwZGV2LT5idXMpLAorCQkJICAgICAgIHJwZGV2LT5idXMtPm51bWJlciwgcnBkZXYtPmRldmZuLAogCQkJICAgICAgIHJwX3Bvc19jYXBfZXJyKTsKIAkJbGlzdF9hZGQoJnJwZXJyLT5saXN0LCAmZWluamVjdGVkKTsKIAl9CkBAIC00MTEsMTAgKzQzMiwxMSBAQAogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwotCi0JaWYgKHVzaXplICE9IHNpemVvZihzdHJ1Y3QgYWVyX2Vycm9yX2luaikpCisJaWYgKHVzaXplIDwgb2Zmc2V0b2Yoc3RydWN0IGFlcl9lcnJvcl9pbmosIGRvbWFpbikgfHwKKwkgICAgdXNpemUgPiBzaXplb2YoZWluaikpCiAJCXJldHVybiAtRUlOVkFMOwogCisJbWVtc2V0KCZlaW5qLCAwLCBzaXplb2YoZWluaikpOwogCWlmIChjb3B5X2Zyb21fdXNlcigmZWluaiwgdWJ1ZiwgdXNpemUpKQogCQlyZXR1cm4gLUVGQVVMVDsKIApAQCAtNDUyLDcgKzQ3NCw3IEBACiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluamVjdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVyciwgZXJyX25leHQsICZwY2lfYnVzX29wc19saXN0LCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVyciwgZXJyX25leHQsICZlaW5qZWN0ZWQsIGxpc3QpIHsKIAkJbGlzdF9kZWwoJmVyci0+bGlzdCk7CiAJCWtmcmVlKGVycik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2LmMgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuYwppbmRleCA0MGMzY2M1Li45N2EzNDU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuYwpAQCAtNTMsNyArNTMsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBjaWVfcG9ydF9zZXJ2aWNlX2RyaXZlciBhZXJkcml2ZXIgPSB7CiAJLm5hbWUJCT0gImFlciIsCi0JLnBvcnRfdHlwZQk9IFBDSUVfUkNfUE9SVCwKKwkucG9ydF90eXBlCT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCwKIAkuc2VydmljZQk9IFBDSUVfUE9SVF9TRVJWSUNFX0FFUiwKIAogCS5wcm9iZQkJPSBhZXJfcHJvYmUsCkBAIC0yOTUsNyArMjk1LDcgQEAKIAl1MTYgcmVnMTY7CiAKIAkvKiBDbGVhbiB1cCBSb290IGRldmljZSBzdGF0dXMgKi8KLQlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9FWFApOworCXBvcyA9IHBjaV9wY2llX2NhcChkZXYpOwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0VYUF9ERVZTVEEsICZyZWcxNik7CiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0VYUF9ERVZTVEEsIHJlZzE2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2NvcmUuYyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9jb3JlLmMKaW5kZXggOWY1Y2NiZS4uYWU2NzJjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfY29yZS5jCkBAIC0zNSwxMSArMzUsMTQgQEAKIAl1MTYgcmVnMTYgPSAwOwogCWludCBwb3M7CiAKKwlpZiAoZGV2LT5hZXJfZmlybXdhcmVfZmlyc3QpCisJCXJldHVybiAtRUlPOworCiAJcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoZGV2LCBQQ0lfRVhUX0NBUF9JRF9FUlIpOwogCWlmICghcG9zKQogCQlyZXR1cm4gLUVJTzsKIAotCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisJcG9zID0gcGNpX3BjaWVfY2FwKGRldik7CiAJaWYgKCFwb3MpCiAJCXJldHVybiAtRUlPOwogCkBAIC02MCw3ICs2MywxMCBAQAogCXUxNiByZWcxNiA9IDA7CiAJaW50IHBvczsKIAotCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisJaWYgKGRldi0+YWVyX2Zpcm13YXJlX2ZpcnN0KQorCQlyZXR1cm4gLUVJTzsKKworCXBvcyA9IHBjaV9wY2llX2NhcChkZXYpOwogCWlmICghcG9zKQogCQlyZXR1cm4gLUVJTzsKIApAQCAtNzgsNDggKzg0LDI3IEBACiBpbnQgcGNpX2NsZWFudXBfYWVyX3VuY29ycmVjdF9lcnJvcl9zdGF0dXMoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlpbnQgcG9zOwotCXUzMiBzdGF0dXMsIG1hc2s7Ci0KLQlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShkZXYsIFBDSV9FWFRfQ0FQX0lEX0VSUik7Ci0JaWYgKCFwb3MpCi0JCXJldHVybiAtRUlPOwotCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX0VSUl9VTkNPUl9TVEFUVVMsICZzdGF0dXMpOwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfVU5DT1JfU0VWRVIsICZtYXNrKTsKLQlpZiAoZGV2LT5lcnJvcl9zdGF0ZSA9PSBwY2lfY2hhbm5lbF9pb19ub3JtYWwpCi0JCXN0YXR1cyAmPSB+bWFzazsgLyogQ2xlYXIgY29ycmVzcG9uZGluZyBub25mYXRhbCBiaXRzICovCi0JZWxzZQotCQlzdGF0dXMgJj0gbWFzazsgLyogQ2xlYXIgY29ycmVzcG9uZGluZyBmYXRhbCBiaXRzICovCi0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfVU5DT1JfU1RBVFVTLCBzdGF0dXMpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChwY2lfY2xlYW51cF9hZXJfdW5jb3JyZWN0X2Vycm9yX3N0YXR1cyk7Ci0KLSNpZiAwCi1pbnQgcGNpX2NsZWFudXBfYWVyX2NvcnJlY3RfZXJyb3Jfc3RhdHVzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JaW50IHBvczsKIAl1MzIgc3RhdHVzOwogCiAJcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoZGV2LCBQQ0lfRVhUX0NBUF9JRF9FUlIpOwogCWlmICghcG9zKQogCQlyZXR1cm4gLUVJTzsKIAotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfQ09SX1NUQVRVUywgJnN0YXR1cyk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfQ09SX1NUQVRVUywgc3RhdHVzKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfRVJSX1VOQ09SX1NUQVRVUywgJnN0YXR1cyk7CisJaWYgKHN0YXR1cykKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfVU5DT1JfU1RBVFVTLCBzdGF0dXMpOwogCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgIC8qICAwICAqLworRVhQT1JUX1NZTUJPTF9HUEwocGNpX2NsZWFudXBfYWVyX3VuY29ycmVjdF9lcnJvcl9zdGF0dXMpOwogCiBzdGF0aWMgaW50IHNldF9kZXZpY2VfZXJyb3JfcmVwb3J0aW5nKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHZvaWQgKmRhdGEpCiB7CiAJYm9vbCBlbmFibGUgPSAqKChib29sICopZGF0YSk7CiAKLQlpZiAoZGV2LT5wY2llX3R5cGUgPT0gUENJRV9SQ19QT1JUIHx8Ci0JICAgIGRldi0+cGNpZV90eXBlID09IFBDSUVfU1dfVVBTVFJFQU1fUE9SVCB8fAotCSAgICBkZXYtPnBjaWVfdHlwZSA9PSBQQ0lFX1NXX0RPV05TVFJFQU1fUE9SVCkgeworCWlmICgoZGV2LT5wY2llX3R5cGUgPT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCkgfHwKKwkgICAgKGRldi0+cGNpZV90eXBlID09IFBDSV9FWFBfVFlQRV9VUFNUUkVBTSkgfHwKKwkgICAgKGRldi0+cGNpZV90eXBlID09IFBDSV9FWFBfVFlQRV9ET1dOU1RSRUFNKSkgewogCQlpZiAoZW5hYmxlKQogCQkJcGNpX2VuYWJsZV9wY2llX2Vycm9yX3JlcG9ydGluZyhkZXYpOwogCQllbHNlCkBAIC0yMTgsNyArMjAzLDcgQEAKIAkgKi8KIAlpZiAoYXRvbWljX3JlYWQoJmRldi0+ZW5hYmxlX2NudCkgPT0gMCkKIAkJcmV0dXJuIDA7Ci0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwlwb3MgPSBwY2lfcGNpZV9jYXAoZGV2KTsKIAlpZiAoIXBvcykKIAkJcmV0dXJuIDA7CiAJLyogQ2hlY2sgaWYgQUVSIGlzIGVuYWJsZWQgKi8KQEAgLTQzMSwxMCArNDE2LDkgQEAKIAlyZXN1bHQgPSAoc3RydWN0IGZpbmRfYWVyX3NlcnZpY2VfZGF0YSAqKSBkYXRhOwogCiAJaWYgKGRldmljZS0+YnVzID09ICZwY2llX3BvcnRfYnVzX3R5cGUpIHsKLQkJc3RydWN0IHBjaWVfcG9ydF9kYXRhICpwb3J0X2RhdGE7CisJCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZSA9IHRvX3BjaWVfZGV2aWNlKGRldmljZSk7CiAKLQkJcG9ydF9kYXRhID0gcGNpX2dldF9kcnZkYXRhKHRvX3BjaWVfZGV2aWNlKGRldmljZSktPnBvcnQpOwotCQlpZiAocG9ydF9kYXRhLT5wb3J0X3R5cGUgPT0gUENJRV9TV19ET1dOU1RSRUFNX1BPUlQpCisJCWlmIChwY2llLT5wb3J0LT5wY2llX3R5cGUgPT0gUENJX0VYUF9UWVBFX0RPV05TVFJFQU0pCiAJCQlyZXN1bHQtPmlzX2Rvd25zdHJlYW0gPSAxOwogCiAJCWRyaXZlciA9IGRldmljZS0+ZHJpdmVyOwpAQCAtNjEyLDcgKzU5Niw3IEBACiAJdTE2IHJlZzE2OwogCXUzMiByZWczMjsKIAotCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9FWFApOworCXBvcyA9IHBjaV9wY2llX2NhcChwZGV2KTsKIAkvKiBDbGVhciBQQ0lFIENhcGFiaWxpdHkncyBEZXZpY2UgU3RhdHVzICovCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zK1BDSV9FWFBfREVWU1RBLCAmcmVnMTYpOwogCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBwb3MrUENJX0VYUF9ERVZTVEEsIHJlZzE2KTsKQEAgLTg3NCw4ICs4NTgsMjIgQEAKICAqLwogaW50IGFlcl9pbml0KHN0cnVjdCBwY2llX2RldmljZSAqZGV2KQogewotCWlmIChhZXJfb3NjX3NldHVwKGRldikgJiYgIWZvcmNlbG9hZCkKLQkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoZGV2LT5wb3J0LT5hZXJfZmlybXdhcmVfZmlyc3QpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXZpY2UsCisJCQkgICAiUENJZSBlcnJvcnMgaGFuZGxlZCBieSBwbGF0Zm9ybSBmaXJtd2FyZS5cbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYWVyX29zY19zZXR1cChkZXYpKQorCQlnb3RvIG91dDsKIAogCXJldHVybiAwOworb3V0OgorCWlmIChmb3JjZWxvYWQpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXZpY2UsCisJCQkgICAiYWVyZHJ2IGZvcmNlbG9hZCByZXF1ZXN0ZWQuXG4iKTsKKwkJZGV2LT5wb3J0LT5hZXJfZmlybXdhcmVfZmlyc3QgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FTlhJTzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2VjcmMuYyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2VjcmMuYwppbmRleCBhOTI4ZDhhLi5hMjc0N2E2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL2Flci9lY3JjLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvZWNyYy5jCkBAIC01MSw3ICs1MSw3IEBACiAJaW50IHBvczsKIAl1MzIgcmVnMzI7CiAKLQlpZiAoIWRldi0+aXNfcGNpZSkKKwlpZiAoIXBjaV9pc19wY2llKGRldikpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoZGV2LCBQQ0lfRVhUX0NBUF9JRF9FUlIpOwpAQCAtNzksNyArNzksNyBAQAogCWludCBwb3M7CiAJdTMyIHJlZzMyOwogCi0JaWYgKCFkZXYtPmlzX3BjaWUpCisJaWYgKCFwY2lfaXNfcGNpZShkZXYpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KGRldiwgUENJX0VYVF9DQVBfSURfRVJSKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jIGIvZHJpdmVycy9wY2kvcGNpZS9hc3BtLmMKaW5kZXggNWI3MDU2Yy4uNWEwMWZjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9hc3BtLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9hc3BtLmMKQEAgLTEyMiw3ICsxMjIsNyBAQAogCXN0cnVjdCBwY2lfYnVzICpsaW5rYnVzID0gbGluay0+cGRldi0+c3Vib3JkaW5hdGU7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmbGlua2J1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKLQkJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShjaGlsZCwgUENJX0NBUF9JRF9FWFApOworCQlwb3MgPSBwY2lfcGNpZV9jYXAoY2hpbGQpOwogCQlpZiAoIXBvcykKIAkJCXJldHVybjsKIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQoY2hpbGQsIHBvcyArIFBDSV9FWFBfTE5LQ1RMLCAmcmVnMTYpOwpAQCAtMTU2LDcgKzE1Niw3IEBACiAKIAkvKiBBbGwgZnVuY3Rpb25zIHNob3VsZCBoYXZlIHRoZSBzYW1lIGNhcCBhbmQgc3RhdGUsIHRha2UgdGhlIHdvcnN0ICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZCwgJmxpbmtidXMtPmRldmljZXMsIGJ1c19saXN0KSB7Ci0JCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoY2hpbGQsIFBDSV9DQVBfSURfRVhQKTsKKwkJcG9zID0gcGNpX3BjaWVfY2FwKGNoaWxkKTsKIAkJaWYgKCFwb3MpCiAJCQlyZXR1cm47CiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChjaGlsZCwgcG9zICsgUENJX0VYUF9MTktDQVAsICZyZWczMik7CkBAIC0xOTEsMjMgKzE5MSwyMyBAQAogCSAqIENvbmZpZ3VyYXRpb24sIHNvIGp1c3QgY2hlY2sgb25lIGZ1bmN0aW9uCiAJICovCiAJY2hpbGQgPSBsaXN0X2VudHJ5KGxpbmtidXMtPmRldmljZXMubmV4dCwgc3RydWN0IHBjaV9kZXYsIGJ1c19saXN0KTsKLQlCVUdfT04oIWNoaWxkLT5pc19wY2llKTsKKwlCVUdfT04oIXBjaV9pc19wY2llKGNoaWxkKSk7CiAKIAkvKiBDaGVjayBkb3duc3RyZWFtIGNvbXBvbmVudCBpZiBiaXQgU2xvdCBDbG9jayBDb25maWd1cmF0aW9uIGlzIDEgKi8KLQljcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShjaGlsZCwgUENJX0NBUF9JRF9FWFApOworCWNwb3MgPSBwY2lfcGNpZV9jYXAoY2hpbGQpOwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGNoaWxkLCBjcG9zICsgUENJX0VYUF9MTktTVEEsICZyZWcxNik7CiAJaWYgKCEocmVnMTYgJiBQQ0lfRVhQX0xOS1NUQV9TTEMpKQogCQlzYW1lX2Nsb2NrID0gMDsKIAogCS8qIENoZWNrIHVwc3RyZWFtIGNvbXBvbmVudCBpZiBiaXQgU2xvdCBDbG9jayBDb25maWd1cmF0aW9uIGlzIDEgKi8KLQlwcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwYXJlbnQsIFBDSV9DQVBfSURfRVhQKTsKKwlwcG9zID0gcGNpX3BjaWVfY2FwKHBhcmVudCk7CiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGFyZW50LCBwcG9zICsgUENJX0VYUF9MTktTVEEsICZyZWcxNik7CiAJaWYgKCEocmVnMTYgJiBQQ0lfRVhQX0xOS1NUQV9TTEMpKQogCQlzYW1lX2Nsb2NrID0gMDsKIAogCS8qIENvbmZpZ3VyZSBkb3duc3RyZWFtIGNvbXBvbmVudCwgYWxsIGZ1bmN0aW9ucyAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZsaW5rYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgewotCQljcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShjaGlsZCwgUENJX0NBUF9JRF9FWFApOworCQljcG9zID0gcGNpX3BjaWVfY2FwKGNoaWxkKTsKIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQoY2hpbGQsIGNwb3MgKyBQQ0lfRVhQX0xOS0NUTCwgJnJlZzE2KTsKIAkJY2hpbGRfcmVnW1BDSV9GVU5DKGNoaWxkLT5kZXZmbildID0gcmVnMTY7CiAJCWlmIChzYW1lX2Nsb2NrKQpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBhcmVudC0+ZGV2LAogCQkgICAiQVNQTTogQ291bGQgbm90IGNvbmZpZ3VyZSBjb21tb24gY2xvY2tcbiIpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZsaW5rYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgewotCQljcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShjaGlsZCwgUENJX0NBUF9JRF9FWFApOworCQljcG9zID0gcGNpX3BjaWVfY2FwKGNoaWxkKTsKIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGNoaWxkLCBjcG9zICsgUENJX0VYUF9MTktDVEwsCiAJCQkJICAgICAgY2hpbGRfcmVnW1BDSV9GVU5DKGNoaWxkLT5kZXZmbildKTsKIAl9CkBAIC0zMDAsNyArMzAwLDcgQEAKIAl1MTYgcmVnMTY7CiAJdTMyIHJlZzMyOwogCi0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisJcG9zID0gcGNpX3BjaWVfY2FwKHBkZXYpOwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBwb3MgKyBQQ0lfRVhQX0xOS0NBUCwgJnJlZzMyKTsKIAlpbmZvLT5zdXBwb3J0ID0gKHJlZzMyICYgUENJX0VYUF9MTktDQVBfQVNQTVMpID4+IDEwOwogCWluZm8tPmxhdGVuY3lfZW5jb2RpbmdfbDBzID0gKHJlZzMyICYgUENJX0VYUF9MTktDQVBfTDBTRUwpID4+IDEyOwpAQCAtNDIwLDcgKzQyMCw3IEBACiAJCSAgICBjaGlsZC0+cGNpZV90eXBlICE9IFBDSV9FWFBfVFlQRV9MRUdfRU5EKQogCQkJY29udGludWU7CiAKLQkJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShjaGlsZCwgUENJX0NBUF9JRF9FWFApOworCQlwb3MgPSBwY2lfcGNpZV9jYXAoY2hpbGQpOwogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoY2hpbGQsIHBvcyArIFBDSV9FWFBfREVWQ0FQLCAmcmVnMzIpOwogCQkvKiBDYWxjdWxhdGUgZW5kcG9pbnQgTDBzIGFjY2VwdGFibGUgbGF0ZW5jeSAqLwogCQllbmNvZGluZyA9IChyZWczMiAmIFBDSV9FWFBfREVWQ0FQX0wwUykgPj4gNjsKQEAgLTQzNiw3ICs0MzYsNyBAQAogc3RhdGljIHZvaWQgcGNpZV9jb25maWdfYXNwbV9kZXYoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiB2YWwpCiB7CiAJdTE2IHJlZzE2OwotCWludCBwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwlpbnQgcG9zID0gcGNpX3BjaWVfY2FwKHBkZXYpOwogCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX0VYUF9MTktDVEwsICZyZWcxNik7CiAJcmVnMTYgJj0gfjB4MzsKQEAgLTUwMyw3ICs1MDMsNyBAQAogCSAqIHZlcnkgc3RyYW5nZS4gRGlzYWJsZSBBU1BNIGZvciB0aGUgd2hvbGUgc2xvdAogCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZwZGV2LT5zdWJvcmRpbmF0ZS0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKLQkJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShjaGlsZCwgUENJX0NBUF9JRF9FWFApOworCQlwb3MgPSBwY2lfcGNpZV9jYXAoY2hpbGQpOwogCQlpZiAoIXBvcykKIAkJCXJldHVybiAtRUlOVkFMOwogCQkvKgpAQCAtNTYzLDcgKzU2Myw3IEBACiAJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqbGluazsKIAlpbnQgYmxhY2tsaXN0ID0gISFwY2llX2FzcG1fc2FuaXR5X2NoZWNrKHBkZXYpOwogCi0JaWYgKGFzcG1fZGlzYWJsZWQgfHwgIXBkZXYtPmlzX3BjaWUgfHwgcGRldi0+bGlua19zdGF0ZSkKKwlpZiAoYXNwbV9kaXNhYmxlZCB8fCAhcGNpX2lzX3BjaWUocGRldikgfHwgcGRldi0+bGlua19zdGF0ZSkKIAkJcmV0dXJuOwogCWlmIChwZGV2LT5wY2llX3R5cGUgIT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCAmJgogCSAgICBwZGV2LT5wY2llX3R5cGUgIT0gUENJX0VYUF9UWVBFX0RPV05TVFJFQU0pCkBAIC02MjksNyArNjI5LDggQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGFyZW50ID0gcGRldi0+YnVzLT5zZWxmOwogCXN0cnVjdCBwY2llX2xpbmtfc3RhdGUgKmxpbmssICpyb290LCAqcGFyZW50X2xpbms7CiAKLQlpZiAoYXNwbV9kaXNhYmxlZCB8fCAhcGRldi0+aXNfcGNpZSB8fCAhcGFyZW50IHx8ICFwYXJlbnQtPmxpbmtfc3RhdGUpCisJaWYgKGFzcG1fZGlzYWJsZWQgfHwgIXBjaV9pc19wY2llKHBkZXYpIHx8CisJICAgICFwYXJlbnQgfHwgIXBhcmVudC0+bGlua19zdGF0ZSkKIAkJcmV0dXJuOwogCWlmICgocGFyZW50LT5wY2llX3R5cGUgIT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCkgJiYKIAkgICAgKHBhcmVudC0+cGNpZV90eXBlICE9IFBDSV9FWFBfVFlQRV9ET1dOU1RSRUFNKSkKQEAgLTY3MCw3ICs2NzEsNyBAQAogewogCXN0cnVjdCBwY2llX2xpbmtfc3RhdGUgKmxpbmsgPSBwZGV2LT5saW5rX3N0YXRlOwogCi0JaWYgKGFzcG1fZGlzYWJsZWQgfHwgIXBkZXYtPmlzX3BjaWUgfHwgIWxpbmspCisJaWYgKGFzcG1fZGlzYWJsZWQgfHwgIXBjaV9pc19wY2llKHBkZXYpIHx8ICFsaW5rKQogCQlyZXR1cm47CiAJaWYgKChwZGV2LT5wY2llX3R5cGUgIT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCkgJiYKIAkgICAgKHBkZXYtPnBjaWVfdHlwZSAhPSBQQ0lfRVhQX1RZUEVfRE9XTlNUUkVBTSkpCkBAIC02OTYsNyArNjk3LDcgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGFyZW50ID0gcGRldi0+YnVzLT5zZWxmOwogCXN0cnVjdCBwY2llX2xpbmtfc3RhdGUgKmxpbms7CiAKLQlpZiAoYXNwbV9kaXNhYmxlZCB8fCAhcGRldi0+aXNfcGNpZSkKKwlpZiAoYXNwbV9kaXNhYmxlZCB8fCAhcGNpX2lzX3BjaWUocGRldikpCiAJCXJldHVybjsKIAlpZiAocGRldi0+cGNpZV90eXBlID09IFBDSV9FWFBfVFlQRV9ST09UX1BPUlQgfHwKIAkgICAgcGRldi0+cGNpZV90eXBlID09IFBDSV9FWFBfVFlQRV9ET1dOU1RSRUFNKQpAQCAtODQxLDggKzg0Miw5IEBACiB7CiAJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqbGlua19zdGF0ZSA9IHBkZXYtPmxpbmtfc3RhdGU7CiAKLQlpZiAoIXBkZXYtPmlzX3BjaWUgfHwgKHBkZXYtPnBjaWVfdHlwZSAhPSBQQ0lfRVhQX1RZUEVfUk9PVF9QT1JUICYmCi0JCXBkZXYtPnBjaWVfdHlwZSAhPSBQQ0lfRVhQX1RZUEVfRE9XTlNUUkVBTSkgfHwgIWxpbmtfc3RhdGUpCisJaWYgKCFwY2lfaXNfcGNpZShwZGV2KSB8fAorCSAgICAocGRldi0+cGNpZV90eXBlICE9IFBDSV9FWFBfVFlQRV9ST09UX1BPUlQgJiYKKwkgICAgIHBkZXYtPnBjaWVfdHlwZSAhPSBQQ0lfRVhQX1RZUEVfRE9XTlNUUkVBTSkgfHwgIWxpbmtfc3RhdGUpCiAJCXJldHVybjsKIAogCWlmIChsaW5rX3N0YXRlLT5hc3BtX3N1cHBvcnQpCkBAIC04NTcsOCArODU5LDkgQEAKIHsKIAlzdHJ1Y3QgcGNpZV9saW5rX3N0YXRlICpsaW5rX3N0YXRlID0gcGRldi0+bGlua19zdGF0ZTsKIAotCWlmICghcGRldi0+aXNfcGNpZSB8fCAocGRldi0+cGNpZV90eXBlICE9IFBDSV9FWFBfVFlQRV9ST09UX1BPUlQgJiYKLQkJcGRldi0+cGNpZV90eXBlICE9IFBDSV9FWFBfVFlQRV9ET1dOU1RSRUFNKSB8fCAhbGlua19zdGF0ZSkKKwlpZiAoIXBjaV9pc19wY2llKHBkZXYpIHx8CisJICAgIChwZGV2LT5wY2llX3R5cGUgIT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCAmJgorCSAgICAgcGRldi0+cGNpZV90eXBlICE9IFBDSV9FWFBfVFlQRV9ET1dOU1RSRUFNKSB8fCAhbGlua19zdGF0ZSkKIAkJcmV0dXJuOwogCiAJaWYgKGxpbmtfc3RhdGUtPmFzcG1fc3VwcG9ydCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydi5oIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2LmgKaW5kZXggMTdhZDUzOC4uYWFlYjlkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2LmgKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2LmgKQEAgLTExLDMxICsxMSwxNiBAQAogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KIAotI2lmICFkZWZpbmVkKFBDSV9DQVBfSURfUE1FKQotI2RlZmluZSBQQ0lfQ0FQX0lEX1BNRQkJCTEKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoUENJX0NBUF9JRF9FWFApCi0jZGVmaW5lIFBDSV9DQVBfSURfRVhQCQkJMHgxMAotI2VuZGlmCi0KLSNkZWZpbmUgUE9SVF9UWVBFX01BU0sJCQkweGYKLSNkZWZpbmUgUE9SVF9UT19TTE9UX01BU0sJCTB4MTAwCi0jZGVmaW5lIFNMT1RfSFBfQ0FQQUJMRV9NQVNLCQkweDQwCi0jZGVmaW5lIFBDSUVfQ0FQQUJJTElUSUVTX1JFRwkJMHgyCi0jZGVmaW5lIFBDSUVfU0xPVF9DQVBBQklMSVRJRVNfUkVHCTB4MTQKLSNkZWZpbmUgUENJRV9QT1JUX0RFVklDRV9NQVhTRVJWSUNFUwk0Ci0jZGVmaW5lIFBDSUVfUE9SVF9NU0lfVkVDVE9SX01BU0sJMHgxZgorI2RlZmluZSBQQ0lFX1BPUlRfREVWSUNFX01BWFNFUlZJQ0VTICAgNAogLyoKLSAqIEFjY29yZGluZyB0byB0aGUgUENJIEV4cHJlc3MgQmFzZSBTcGVjaWZpY2F0aW9uIDIuMCwgdGhlIGluZGljZXMgb2YgdGhlIE1TSS1YCi0gKiB0YWJsZSBlbnRpcmVzIHVzZWQgYnkgcG9ydCBzZXJ2aWNlcyBtdXN0IG5vdCBleGNlZWQgMzEKKyAqIEFjY29yZGluZyB0byB0aGUgUENJIEV4cHJlc3MgQmFzZSBTcGVjaWZpY2F0aW9uIDIuMCwgdGhlIGluZGljZXMgb2YKKyAqIHRoZSBNU0ktWCB0YWJsZSBlbnRpcmVzIHVzZWQgYnkgcG9ydCBzZXJ2aWNlcyBtdXN0IG5vdCBleGNlZWQgMzEKICAqLwogI2RlZmluZSBQQ0lFX1BPUlRfTUFYX01TSVhfRU5UUklFUwkzMgogCiAjZGVmaW5lIGdldF9kZXNjcmlwdG9yX2lkKHR5cGUsIHNlcnZpY2UpICgoKHR5cGUgLSA0KSA8PCA0KSB8IHNlcnZpY2UpCiAKIGV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgcGNpZV9wb3J0X2J1c190eXBlOwotZXh0ZXJuIGludCBwY2llX3BvcnRfZGV2aWNlX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogZXh0ZXJuIGludCBwY2llX3BvcnRfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogI2lmZGVmIENPTkZJR19QTQogZXh0ZXJuIGludCBwY2llX3BvcnRfZGV2aWNlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9idXMuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9idXMuYwppbmRleCBlZjNhNGVlLi4xOGJmOTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfYnVzLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2J1cy5jCkBAIC0yNiw3ICsyNiw2IEBACiBzdGF0aWMgaW50IHBjaWVfcG9ydF9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQogewogCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZWRldjsKLQlzdHJ1Y3QgcGNpZV9wb3J0X2RhdGEgKnBvcnRfZGF0YTsKIAlzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpkcml2ZXI7CiAKIAlpZiAoZHJ2LT5idXMgIT0gJnBjaWVfcG9ydF9idXNfdHlwZSB8fCBkZXYtPmJ1cyAhPSAmcGNpZV9wb3J0X2J1c190eXBlKQpAQCAtMzgsMTAgKzM3LDggQEAKIAlpZiAoZHJpdmVyLT5zZXJ2aWNlICE9IHBjaWVkZXYtPnNlcnZpY2UpCiAJCXJldHVybiAwOwogCi0JcG9ydF9kYXRhID0gcGNpX2dldF9kcnZkYXRhKHBjaWVkZXYtPnBvcnQpOwotCi0JaWYgKGRyaXZlci0+cG9ydF90eXBlICE9IFBDSUVfQU5ZX1BPUlQKLQkgICAgICYmIGRyaXZlci0+cG9ydF90eXBlICE9IHBvcnRfZGF0YS0+cG9ydF90eXBlKQorCWlmICgoZHJpdmVyLT5wb3J0X3R5cGUgIT0gUENJRV9BTllfUE9SVCkgJiYKKwkgICAgKGRyaXZlci0+cG9ydF90eXBlICE9IHBjaWVkZXYtPnBvcnQtPnBjaWVfdHlwZSkpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfY29yZS5jIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2NvcmUuYwppbmRleCA1MmY4NGZjLi40MTMyNjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9jb3JlLmMKQEAgLTEwOCw5ICsxMDgsOSBAQAogCQkgKiB0aGUgdmFsdWUgaW4gdGhpcyBmaWVsZCBpbmRpY2F0ZXMgd2hpY2ggTVNJLVggVGFibGUgZW50cnkgaXMKIAkJICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgaW50ZXJydXB0IG1lc3NhZ2UuIgogCQkgKi8KLQkJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKTsKLQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lFX0NBUEFCSUxJVElFU19SRUcsICZyZWcxNik7Ci0JCWVudHJ5ID0gKHJlZzE2ID4+IDkpICYgUENJRV9QT1JUX01TSV9WRUNUT1JfTUFTSzsKKwkJcG9zID0gcGNpX3BjaWVfY2FwKGRldik7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0VYUF9GTEFHUywgJnJlZzE2KTsKKwkJZW50cnkgPSAocmVnMTYgJiBQQ0lfRVhQX0ZMQUdTX0lSUSkgPj4gOTsKIAkJaWYgKGVudHJ5ID49IG5yX2VudHJpZXMpCiAJCQlnb3RvIEVycm9yOwogCkBAIC0xNzcsMzcgKzE3Nyw0MCBAQAogfQogCiAvKioKLSAqIGFzc2lnbl9pbnRlcnJ1cHRfbW9kZSAtIGNob29zZSBpbnRlcnJ1cHQgbW9kZSBmb3IgUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgKElOVHgsIE1TSS1YLCBNU0kpIGFuZCBzZXQgdXAgdmVjdG9ycworICogaW5pdF9zZXJ2aWNlX2lycXMgLSBpbml0aWFsaXplIGlycXMgZm9yIFBDSSBFeHByZXNzIHBvcnQgc2VydmljZXMKICAqIEBkZXY6IFBDSSBFeHByZXNzIHBvcnQgdG8gaGFuZGxlCi0gKiBAdmVjdG9yczogQXJyYXkgb2YgaW50ZXJydXB0IHZlY3RvcnMgdG8gcG9wdWxhdGUKKyAqIEBpcnFzOiBBcnJheSBvZiBpcnFzIHRvIHBvcHVsYXRlCiAgKiBAbWFzazogQml0bWFzayBvZiBwb3J0IGNhcGFiaWxpdGllcyByZXR1cm5lZCBieSBnZXRfcG9ydF9kZXZpY2VfY2FwYWJpbGl0eSgpCiAgKgogICogUmV0dXJuIHZhbHVlOiBJbnRlcnJ1cHQgbW9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBvcnQKICAqLwotc3RhdGljIGludCBhc3NpZ25faW50ZXJydXB0X21vZGUoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50ICp2ZWN0b3JzLCBpbnQgbWFzaykKK3N0YXRpYyBpbnQgaW5pdF9zZXJ2aWNlX2lycXMoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50ICppcnFzLCBpbnQgbWFzaykKIHsKLQlpbnQgaXJxLCBpbnRlcnJ1cHRfbW9kZSA9IFBDSUVfUE9SVF9OT19JUlE7Ci0JaW50IGk7CisJaW50IGksIGlycTsKIAogCS8qIFRyeSB0byB1c2UgTVNJLVggaWYgc3VwcG9ydGVkICovCi0JaWYgKCFwY2llX3BvcnRfZW5hYmxlX21zaXgoZGV2LCB2ZWN0b3JzLCBtYXNrKSkKLQkJcmV0dXJuIFBDSUVfUE9SVF9NU0lYX01PREU7Ci0KKwlpZiAoIXBjaWVfcG9ydF9lbmFibGVfbXNpeChkZXYsIGlycXMsIG1hc2spKQorCQlyZXR1cm4gMDsKIAkvKiBXZSdyZSBub3QgZ29pbmcgdG8gdXNlIE1TSS1YLCBzbyB0cnkgTVNJIGFuZCBmYWxsIGJhY2sgdG8gSU5UeCAqLwotCWlmICghcGNpX2VuYWJsZV9tc2koZGV2KSkKLQkJaW50ZXJydXB0X21vZGUgPSBQQ0lFX1BPUlRfTVNJX01PREU7CisJaXJxID0gLTE7CisJaWYgKCFwY2lfZW5hYmxlX21zaShkZXYpIHx8IGRldi0+cGluKQorCQlpcnEgPSBkZXYtPmlycTsKIAotCWlmIChpbnRlcnJ1cHRfbW9kZSA9PSBQQ0lFX1BPUlRfTk9fSVJRICYmIGRldi0+cGluKQotCQlpbnRlcnJ1cHRfbW9kZSA9IFBDSUVfUE9SVF9JTlR4X01PREU7Ci0KLQlpcnEgPSBpbnRlcnJ1cHRfbW9kZSAhPSBQQ0lFX1BPUlRfTk9fSVJRID8gZGV2LT5pcnEgOiAtMTsKIAlmb3IgKGkgPSAwOyBpIDwgUENJRV9QT1JUX0RFVklDRV9NQVhTRVJWSUNFUzsgaSsrKQotCQl2ZWN0b3JzW2ldID0gaXJxOworCQlpcnFzW2ldID0gaXJxOworCWlycXNbUENJRV9QT1JUX1NFUlZJQ0VfVkNfU0hJRlRdID0gLTE7CiAKLQl2ZWN0b3JzW1BDSUVfUE9SVF9TRVJWSUNFX1ZDX1NISUZUXSA9IC0xOworCWlmIChpcnEgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gMDsKK30KIAotCXJldHVybiBpbnRlcnJ1cHRfbW9kZTsKK3N0YXRpYyB2b2lkIGNsZWFudXBfc2VydmljZV9pcnFzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaWYgKGRldi0+bXNpeF9lbmFibGVkKQorCQlwY2lfZGlzYWJsZV9tc2l4KGRldik7CisJZWxzZSBpZiAoZGV2LT5tc2lfZW5hYmxlZCkKKwkJcGNpX2Rpc2FibGVfbXNpKGRldik7CiB9CiAKIC8qKgpAQCAtMjI2LDEzICsyMjksMTIgQEAKIAl1MTYgcmVnMTY7CiAJdTMyIHJlZzMyOwogCi0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKTsKLQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSUVfQ0FQQUJJTElUSUVTX1JFRywgJnJlZzE2KTsKKwlwb3MgPSBwY2lfcGNpZV9jYXAoZGV2KTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9FWFBfRkxBR1MsICZyZWcxNik7CiAJLyogSG90LVBsdWcgQ2FwYWJsZSAqLwotCWlmIChyZWcxNiAmIFBPUlRfVE9fU0xPVF9NQVNLKSB7Ci0JCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIAotCQkJcG9zICsgUENJRV9TTE9UX0NBUEFCSUxJVElFU19SRUcsICZyZWczMik7Ci0JCWlmIChyZWczMiAmIFNMT1RfSFBfQ0FQQUJMRV9NQVNLKQorCWlmIChyZWcxNiAmIFBDSV9FWFBfRkxBR1NfU0xPVCkgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfRVhQX1NMVENBUCwgJnJlZzMyKTsKKwkJaWYgKHJlZzMyICYgUENJX0VYUF9TTFRDQVBfSFBDKQogCQkJc2VydmljZXMgfD0gUENJRV9QT1JUX1NFUlZJQ0VfSFA7CiAJfQogCS8qIEFFUiBjYXBhYmxlICovCkBAIC0yNDEsODAgKzI0Myw0NyBAQAogCS8qIFZDIHN1cHBvcnQgKi8KIAlpZiAocGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoZGV2LCBQQ0lfRVhUX0NBUF9JRF9WQykpCiAJCXNlcnZpY2VzIHw9IFBDSUVfUE9SVF9TRVJWSUNFX1ZDOworCS8qIFJvb3QgcG9ydHMgYXJlIGNhcGFibGUgb2YgZ2VuZXJhdGluZyBQTUUgdG9vICovCisJaWYgKGRldi0+cGNpZV90eXBlID09IFBDSV9FWFBfVFlQRV9ST09UX1BPUlQpCisJCXNlcnZpY2VzIHw9IFBDSUVfUE9SVF9TRVJWSUNFX1BNRTsKIAogCXJldHVybiBzZXJ2aWNlczsKIH0KIAogLyoqCi0gKiBwY2llX2RldmljZV9pbml0IC0gaW5pdGlhbGl6ZSBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZGV2aWNlCi0gKiBAZGV2OiBQb3J0IHNlcnZpY2UgZGV2aWNlIHRvIGluaXRpYWxpemUKLSAqIEBwYXJlbnQ6IFBDSSBFeHByZXNzIHBvcnQgdG8gYXNzb2NpYXRlIHRoZSBzZXJ2aWNlIGRldmljZSB3aXRoCi0gKiBAcG9ydF90eXBlOiBUeXBlIG9mIHRoZSBwb3J0Ci0gKiBAc2VydmljZV90eXBlOiBUeXBlIG9mIHNlcnZpY2UgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHNlcnZpY2UgZGV2aWNlCisgKiBwY2llX2RldmljZV9pbml0IC0gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlIGRldmljZQorICogQHBkZXY6IFBDSSBFeHByZXNzIHBvcnQgdG8gYXNzb2NpYXRlIHRoZSBzZXJ2aWNlIGRldmljZSB3aXRoCisgKiBAc2VydmljZTogVHlwZSBvZiBzZXJ2aWNlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBzZXJ2aWNlIGRldmljZQogICogQGlycTogSW50ZXJydXB0IHZlY3RvciB0byBhc3NvY2lhdGUgd2l0aCB0aGUgc2VydmljZSBkZXZpY2UKICAqLwotc3RhdGljIHZvaWQgcGNpZV9kZXZpY2VfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGFyZW50LCBzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldiwgCi0JaW50IHNlcnZpY2VfdHlwZSwgaW50IGlycSkKK3N0YXRpYyBpbnQgcGNpZV9kZXZpY2VfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHNlcnZpY2UsIGludCBpcnEpCiB7Ci0Jc3RydWN0IHBjaWVfcG9ydF9kYXRhICpwb3J0X2RhdGEgPSBwY2lfZ2V0X2RydmRhdGEocGFyZW50KTsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7Ci0JaW50IHBvcnRfdHlwZSA9IHBvcnRfZGF0YS0+cG9ydF90eXBlOwogCi0JZGV2LT5wb3J0ID0gcGFyZW50OwotCWRldi0+aXJxID0gaXJxOwotCWRldi0+c2VydmljZSA9IHNlcnZpY2VfdHlwZTsKKwlwY2llID0ga3phbGxvYyhzaXplb2YoKnBjaWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjaWUpCisJCXJldHVybiAtRU5PTUVNOworCXBjaWUtPnBvcnQgPSBwZGV2OworCXBjaWUtPmlycSA9IGlycTsKKwlwY2llLT5zZXJ2aWNlID0gc2VydmljZTsKIAogCS8qIEluaXRpYWxpemUgZ2VuZXJpYyBkZXZpY2UgaW50ZXJmYWNlICovCi0JZGV2aWNlID0gJmRldi0+ZGV2aWNlOwotCW1lbXNldChkZXZpY2UsIDAsIHNpemVvZihzdHJ1Y3QgZGV2aWNlKSk7CisJZGV2aWNlID0gJnBjaWUtPmRldmljZTsKIAlkZXZpY2UtPmJ1cyA9ICZwY2llX3BvcnRfYnVzX3R5cGU7Ci0JZGV2aWNlLT5kcml2ZXIgPSBOVUxMOwotCWRldl9zZXRfZHJ2ZGF0YShkZXZpY2UsIE5VTEwpOwogCWRldmljZS0+cmVsZWFzZSA9IHJlbGVhc2VfcGNpZV9kZXZpY2U7CS8qIGNhbGxiYWNrIHRvIGZyZWUgcGNpZSBkZXYgKi8KIAlkZXZfc2V0X25hbWUoZGV2aWNlLCAiJXM6cGNpZSUwMngiLAotCQkgcGNpX25hbWUocGFyZW50KSwgZ2V0X2Rlc2NyaXB0b3JfaWQocG9ydF90eXBlLCBzZXJ2aWNlX3R5cGUpKTsKLQlkZXZpY2UtPnBhcmVudCA9ICZwYXJlbnQtPmRldjsKLX0KKwkJICAgICBwY2lfbmFtZShwZGV2KSwKKwkJICAgICBnZXRfZGVzY3JpcHRvcl9pZChwZGV2LT5wY2llX3R5cGUsIHNlcnZpY2UpKTsKKwlkZXZpY2UtPnBhcmVudCA9ICZwZGV2LT5kZXY7CiAKLS8qKgotICogYWxsb2NfcGNpZV9kZXZpY2UgLSBhbGxvY2F0ZSBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZGV2aWNlIHN0cnVjdHVyZQotICogQHBhcmVudDogUENJIEV4cHJlc3MgcG9ydCB0byBhc3NvY2lhdGUgdGhlIHNlcnZpY2UgZGV2aWNlIHdpdGgKLSAqIEBwb3J0X3R5cGU6IFR5cGUgb2YgdGhlIHBvcnQKLSAqIEBzZXJ2aWNlX3R5cGU6IFR5cGUgb2Ygc2VydmljZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgc2VydmljZSBkZXZpY2UKLSAqIEBpcnE6IEludGVycnVwdCB2ZWN0b3IgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHNlcnZpY2UgZGV2aWNlCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcGNpZV9kZXZpY2UqIGFsbG9jX3BjaWVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwYXJlbnQsCi0JaW50IHNlcnZpY2VfdHlwZSwgaW50IGlycSkKLXsKLQlzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldmljZTsKLQotCWRldmljZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2llX2RldmljZSksIEdGUF9LRVJORUwpOwotCWlmICghZGV2aWNlKQotCQlyZXR1cm4gTlVMTDsKLQotCXBjaWVfZGV2aWNlX2luaXQocGFyZW50LCBkZXZpY2UsIHNlcnZpY2VfdHlwZSwgaXJxKTsKLQlyZXR1cm4gZGV2aWNlOwotfQotCi0vKioKLSAqIHBjaWVfcG9ydF9kZXZpY2VfcHJvYmUgLSBjaGVjayBpZiBkZXZpY2UgaXMgYSBQQ0kgRXhwcmVzcyBwb3J0Ci0gKiBAZGV2OiBEZXZpY2UgdG8gY2hlY2sKLSAqLwotaW50IHBjaWVfcG9ydF9kZXZpY2VfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlpbnQgcG9zLCB0eXBlOwotCXUxNiByZWc7Ci0KLQlpZiAoIShwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9FWFApKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSUVfQ0FQQUJJTElUSUVTX1JFRywgJnJlZyk7Ci0JdHlwZSA9IChyZWcgPj4gNCkgJiBQT1JUX1RZUEVfTUFTSzsKLQlpZiAoCXR5cGUgPT0gUENJRV9SQ19QT1JUIHx8IHR5cGUgPT0gUENJRV9TV19VUFNUUkVBTV9QT1JUIHx8Ci0JCXR5cGUgPT0gUENJRV9TV19ET1dOU1RSRUFNX1BPUlQgKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAtRU5PREVWOworCXJldHZhbCA9IGRldmljZV9yZWdpc3RlcihkZXZpY2UpOworCWlmIChyZXR2YWwpCisJCWtmcmVlKHBjaWUpOworCWVsc2UKKwkJZ2V0X2RldmljZShkZXZpY2UpOworCXJldHVybiByZXR2YWw7CiB9CiAKIC8qKgpAQCAtMzI2LDc3ICsyOTUsNDkgQEAKICAqLwogaW50IHBjaWVfcG9ydF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgcGNpZV9wb3J0X2RhdGEgKnBvcnRfZGF0YTsKLQlpbnQgc3RhdHVzLCBjYXBhYmlsaXRpZXMsIGlycV9tb2RlLCBpLCBucl9zZXJ2OwotCWludCB2ZWN0b3JzW1BDSUVfUE9SVF9ERVZJQ0VfTUFYU0VSVklDRVNdOwotCXUxNiByZWcxNjsKKwlpbnQgc3RhdHVzLCBjYXBhYmlsaXRpZXMsIGksIG5yX3NlcnZpY2U7CisJaW50IGlycXNbUENJRV9QT1JUX0RFVklDRV9NQVhTRVJWSUNFU107CiAKLQlwb3J0X2RhdGEgPSBremFsbG9jKHNpemVvZigqcG9ydF9kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwb3J0X2RhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIHBvcnRfZGF0YSk7Ci0KLQkvKiBHZXQgcG9ydCB0eXBlICovCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LAotCQlwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9FWFApICsKLQkJUENJRV9DQVBBQklMSVRJRVNfUkVHLCAmcmVnMTYpOwotCXBvcnRfZGF0YS0+cG9ydF90eXBlID0gKHJlZzE2ID4+IDQpICYgUE9SVF9UWVBFX01BU0s7Ci0KKwkvKiBHZXQgYW5kIGNoZWNrIFBDSSBFeHByZXNzIHBvcnQgc2VydmljZXMgKi8KIAljYXBhYmlsaXRpZXMgPSBnZXRfcG9ydF9kZXZpY2VfY2FwYWJpbGl0eShkZXYpOwotCS8qIFJvb3QgcG9ydHMgYXJlIGNhcGFibGUgb2YgZ2VuZXJhdGluZyBQTUUgdG9vICovCi0JaWYgKHBvcnRfZGF0YS0+cG9ydF90eXBlID09IFBDSUVfUkNfUE9SVCkKLQkJY2FwYWJpbGl0aWVzIHw9IFBDSUVfUE9SVF9TRVJWSUNFX1BNRTsKKwlpZiAoIWNhcGFiaWxpdGllcykKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpcnFfbW9kZSA9IGFzc2lnbl9pbnRlcnJ1cHRfbW9kZShkZXYsIHZlY3RvcnMsIGNhcGFiaWxpdGllcyk7Ci0JaWYgKGlycV9tb2RlID09IFBDSUVfUE9SVF9OT19JUlEpIHsKLQkJLyoKLQkJICogRG9uJ3QgdXNlIHNlcnZpY2UgZGV2aWNlcyB0aGF0IHJlcXVpcmUgaW50ZXJydXB0cyBpZiB0aGVyZSBpcwotCQkgKiBubyB3YXkgdG8gZ2VuZXJhdGUgdGhlbS4KLQkJICovCi0JCWlmICghKGNhcGFiaWxpdGllcyAmIFBDSUVfUE9SVF9TRVJWSUNFX1ZDKSkgewotCQkJc3RhdHVzID0gLUVOT0RFVjsKLQkJCWdvdG8gRXJyb3I7Ci0JCX0KLQkJY2FwYWJpbGl0aWVzID0gUENJRV9QT1JUX1NFUlZJQ0VfVkM7Ci0JfQotCXBvcnRfZGF0YS0+cG9ydF9pcnFfbW9kZSA9IGlycV9tb2RlOwotCisJLyogRW5hYmxlIFBDSSBFeHByZXNzIHBvcnQgZGV2aWNlICovCiAJc3RhdHVzID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKIAlpZiAoc3RhdHVzKQotCQlnb3RvIEVycm9yOworCQlyZXR1cm4gc3RhdHVzOwogCXBjaV9zZXRfbWFzdGVyKGRldik7CisJLyoKKwkgKiBJbml0aWFsaXplIHNlcnZpY2UgaXJxcy4gRG9uJ3QgdXNlIHNlcnZpY2UgZGV2aWNlcyB0aGF0CisJICogcmVxdWlyZSBpbnRlcnJ1cHRzIGlmIHRoZXJlIGlzIG5vIHdheSB0byBnZW5lcmF0ZSB0aGVtLgorCSAqLworCXN0YXR1cyA9IGluaXRfc2VydmljZV9pcnFzKGRldiwgaXJxcywgY2FwYWJpbGl0aWVzKTsKKwlpZiAoc3RhdHVzKSB7CisJCWNhcGFiaWxpdGllcyAmPSBQQ0lFX1BPUlRfU0VSVklDRV9WQzsKKwkJaWYgKCFjYXBhYmlsaXRpZXMpCisJCQlnb3RvIGVycm9yX2Rpc2FibGU7CisJfQogCiAJLyogQWxsb2NhdGUgY2hpbGQgc2VydmljZXMgaWYgYW55ICovCi0JZm9yIChpID0gMCwgbnJfc2VydiA9IDA7IGkgPCBQQ0lFX1BPUlRfREVWSUNFX01BWFNFUlZJQ0VTOyBpKyspIHsKLQkJc3RydWN0IHBjaWVfZGV2aWNlICpjaGlsZDsKKwlzdGF0dXMgPSAtRU5PREVWOworCW5yX3NlcnZpY2UgPSAwOworCWZvciAoaSA9IDA7IGkgPCBQQ0lFX1BPUlRfREVWSUNFX01BWFNFUlZJQ0VTOyBpKyspIHsKIAkJaW50IHNlcnZpY2UgPSAxIDw8IGk7Ci0KIAkJaWYgKCEoY2FwYWJpbGl0aWVzICYgc2VydmljZSkpCiAJCQljb250aW51ZTsKLQotCQljaGlsZCA9IGFsbG9jX3BjaWVfZGV2aWNlKGRldiwgc2VydmljZSwgdmVjdG9yc1tpXSk7Ci0JCWlmICghY2hpbGQpCi0JCQljb250aW51ZTsKLQotCQlzdGF0dXMgPSBkZXZpY2VfcmVnaXN0ZXIoJmNoaWxkLT5kZXZpY2UpOwotCQlpZiAoc3RhdHVzKSB7Ci0JCQlrZnJlZShjaGlsZCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWdldF9kZXZpY2UoJmNoaWxkLT5kZXZpY2UpOwotCQlucl9zZXJ2Kys7CisJCWlmICghcGNpZV9kZXZpY2VfaW5pdChkZXYsIHNlcnZpY2UsIGlycXNbaV0pKQorCQkJbnJfc2VydmljZSsrOwogCX0KLQlpZiAoIW5yX3NlcnYpIHsKLQkJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7Ci0JCXN0YXR1cyA9IC1FTk9ERVY7Ci0JCWdvdG8gRXJyb3I7Ci0JfQorCWlmICghbnJfc2VydmljZSkKKwkJZ290byBlcnJvcl9jbGVhbnVwX2lycXM7CiAKIAlyZXR1cm4gMDsKIAotIEVycm9yOgotCWtmcmVlKHBvcnRfZGF0YSk7CitlcnJvcl9jbGVhbnVwX2lycXM6CisJY2xlYW51cF9zZXJ2aWNlX2lycXMoZGV2KTsKK2Vycm9yX2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNDY0LDIxICs0MDUsOSBAQAogICovCiB2b2lkIHBjaWVfcG9ydF9kZXZpY2VfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHBjaWVfcG9ydF9kYXRhICpwb3J0X2RhdGEgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKLQogCWRldmljZV9mb3JfZWFjaF9jaGlsZCgmZGV2LT5kZXYsIE5VTEwsIHJlbW92ZV9pdGVyKTsKKwljbGVhbnVwX3NlcnZpY2VfaXJxcyhkZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwotCi0Jc3dpdGNoIChwb3J0X2RhdGEtPnBvcnRfaXJxX21vZGUpIHsKLQljYXNlIFBDSUVfUE9SVF9NU0lYX01PREU6Ci0JCXBjaV9kaXNhYmxlX21zaXgoZGV2KTsKLQkJYnJlYWs7Ci0JY2FzZSBQQ0lFX1BPUlRfTVNJX01PREU6Ci0JCXBjaV9kaXNhYmxlX21zaShkZXYpOwotCQlicmVhazsKLQl9Ci0KLQlrZnJlZShwb3J0X2RhdGEpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYwppbmRleCBmNjM1ZTQ3Li5jZTUyZWEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jCkBAIC02NywxNCArNjcsMTYgQEAKICAqIHRoaXMgcG9ydCBkZXZpY2UuCiAgKgogICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBwY2llX3BvcnRkcnZfcHJvYmUgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIAotCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCApCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwY2llX3BvcnRkcnZfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewotCWludAkJCXN0YXR1czsKKwlpbnQgc3RhdHVzOwogCi0Jc3RhdHVzID0gcGNpZV9wb3J0X2RldmljZV9wcm9iZShkZXYpOwotCWlmIChzdGF0dXMpCi0JCXJldHVybiBzdGF0dXM7CisJaWYgKCFwY2lfaXNfcGNpZShkZXYpIHx8CisJICAgICgoZGV2LT5wY2llX3R5cGUgIT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCkgJiYKKwkgICAgIChkZXYtPnBjaWVfdHlwZSAhPSBQQ0lfRVhQX1RZUEVfVVBTVFJFQU0pICYmCisJICAgICAoZGV2LT5wY2llX3R5cGUgIT0gUENJX0VYUF9UWVBFX0RPV05TVFJFQU0pKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKICAgICAgICAgaWYgKCFkZXYtPmlycSAmJiBkZXYtPnBpbikgewogCQlkZXZfd2FybigmZGV2LT5kZXYsICJkZXZpY2UgWyUwNHg6JTA0eF0gaGFzIGludmFsaWQgSVJROyAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wcm9iZS5jIGIvZHJpdmVycy9wY2kvcHJvYmUuYwppbmRleCA4MTA1ZTMyLi45OGZmYjJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wcm9iZS5jCisrKyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLWFzcG0uaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfaGVzdC5oPgogI2luY2x1ZGUgInBjaS5oIgogCiAjZGVmaW5lIENBUkRCVVNfTEFURU5DWV9USU1FUgkxNzYJLyogc2Vjb25kYXJ5IGxhdGVuY3kgdGltZXIgKi8KQEAgLTE2MywxMiArMTY0LDEyIEBACiB7CiAJdTMyIGwsIHN6LCBtYXNrOwogCi0JbWFzayA9IHR5cGUgPyB+UENJX1JPTV9BRERSRVNTX0VOQUJMRSA6IH4wOworCW1hc2sgPSB0eXBlID8gUENJX1JPTV9BRERSRVNTX01BU0sgOiB+MDsKIAogCXJlcy0+bmFtZSA9IHBjaV9uYW1lKGRldik7CiAKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwb3MsICZsKTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcG9zLCBtYXNrKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcG9zLCBsIHwgbWFzayk7CiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcG9zLCAmc3opOwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBwb3MsIGwpOwogCkBAIC0yMjMsOSArMjI0LDEzIEBACiAJCQlnb3RvIGZhaWw7CiAKIAkJaWYgKChzaXplb2YocmVzb3VyY2Vfc2l6ZV90KSA8IDgpICYmIChzejY0ID4gMHgxMDAwMDAwMDBVTEwpKSB7Ci0JCQlkZXZfZXJyKCZkZXYtPmRldiwgImNhbid0IGhhbmRsZSA2NC1iaXQgQkFSXG4iKTsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAicmVnICV4OiBjYW4ndCBoYW5kbGUgNjQtYml0IEJBUlxuIiwKKwkJCQlwb3MpOwogCQkJZ290byBmYWlsOwotCQl9IGVsc2UgaWYgKChzaXplb2YocmVzb3VyY2Vfc2l6ZV90KSA8IDgpICYmIGwpIHsKKwkJfQorCisJCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU1fNjQ7CisJCWlmICgoc2l6ZW9mKHJlc291cmNlX3NpemVfdCkgPCA4KSAmJiBsKSB7CiAJCQkvKiBBZGRyZXNzIGFib3ZlIDMyLWJpdCBib3VuZGFyeTsgZGlzYWJsZSB0aGUgQkFSICovCiAJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcG9zLCAwKTsKIAkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyA0LCAwKTsKQEAgLTIzNCwxNCArMjM5LDkgQEAKIAkJfSBlbHNlIHsKIAkJCXJlcy0+c3RhcnQgPSBsNjQ7CiAJCQlyZXMtPmVuZCA9IGw2NCArIHN6NjQ7Ci0JCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZkZXYtPmRldiwKLQkJCQkicmVnICV4ICVzOiAlcFJcbiIsIHBvcywKLQkJCQkgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX1BSRUZFVENIKSA/Ci0JCQkJCSI2NGJpdCBtbWlvIHByZWYiIDogIjY0Yml0IG1taW8iLAotCQkJCSByZXMpOworCQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsICJyZWcgJXg6ICVwUlxuIiwKKwkJCQkgICBwb3MsIHJlcyk7CiAJCX0KLQotCQlyZXMtPmZsYWdzIHw9IElPUkVTT1VSQ0VfTUVNXzY0OwogCX0gZWxzZSB7CiAJCXN6ID0gcGNpX3NpemUobCwgc3osIG1hc2spOwogCkBAIC0yNTEsMTEgKzI1MSw3IEBACiAJCXJlcy0+c3RhcnQgPSBsOwogCQlyZXMtPmVuZCA9IGwgKyBzejsKIAotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZkZXYtPmRldiwgInJlZyAleCAlczogJXBSXG4iLCBwb3MsCi0JCQkocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pID8gImlvIHBvcnQiIDoKLQkJCSAoKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX1BSRUZFVENIKSA/Ci0JCQkJICIzMmJpdCBtbWlvIHByZWYiIDogIjMyYml0IG1taW8iKSwKLQkJCXJlcyk7CisJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmRldi0+ZGV2LCAicmVnICV4OiAlcFJcbiIsIHBvcywgcmVzKTsKIAl9CiAKICBvdXQ6CkBAIC0yOTcsOCArMjkzLDExIEBACiAJaWYgKHBjaV9pc19yb290X2J1cyhjaGlsZCkpCS8qIEl0J3MgYSBob3N0IGJ1cywgbm90aGluZyB0byByZWFkICovCiAJCXJldHVybjsKIAorCWRldl9pbmZvKCZkZXYtPmRldiwgIlBDSSBicmlkZ2UgdG8gW2J1cyAlMDJ4LSUwMnhdJXNcbiIsCisJCSBjaGlsZC0+c2Vjb25kYXJ5LCBjaGlsZC0+c3Vib3JkaW5hdGUsCisJCSBkZXYtPnRyYW5zcGFyZW50ID8gIiAoc3VidHJhY3RpdmUgZGVjb2RlKSI6ICIiKTsKKwogCWlmIChkZXYtPnRyYW5zcGFyZW50KSB7Ci0JCWRldl9pbmZvKCZkZXYtPmRldiwgInRyYW5zcGFyZW50IGJyaWRnZVxuIik7CiAJCWZvcihpID0gMzsgaSA8IFBDSV9CVVNfTlVNX1JFU09VUkNFUzsgaSsrKQogCQkJY2hpbGQtPnJlc291cmNlW2ldID0gY2hpbGQtPnBhcmVudC0+cmVzb3VyY2VbaSAtIDNdOwogCX0KQEAgLTMyMyw3ICszMjIsNyBAQAogCQkJcmVzLT5zdGFydCA9IGJhc2U7CiAJCWlmICghcmVzLT5lbmQpCiAJCQlyZXMtPmVuZCA9IGxpbWl0ICsgMHhmZmY7Ci0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmRldi0+ZGV2LCAiYnJpZGdlIGlvIHBvcnQ6ICVwUlxuIiwgcmVzKTsKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsICIgIGJyaWRnZSB3aW5kb3cgJXBSXG4iLCByZXMpOwogCX0KIAogCXJlcyA9IGNoaWxkLT5yZXNvdXJjZVsxXTsKQEAgLTMzNSw4ICszMzQsNyBAQAogCQlyZXMtPmZsYWdzID0gKG1lbV9iYXNlX2xvICYgUENJX01FTU9SWV9SQU5HRV9UWVBFX01BU0spIHwgSU9SRVNPVVJDRV9NRU07CiAJCXJlcy0+c3RhcnQgPSBiYXNlOwogCQlyZXMtPmVuZCA9IGxpbWl0ICsgMHhmZmZmZjsKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsICJicmlkZ2UgMzJiaXQgbW1pbzogJXBSXG4iLAotCQkJcmVzKTsKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsICIgIGJyaWRnZSB3aW5kb3cgJXBSXG4iLCByZXMpOwogCX0KIAogCXJlcyA9IGNoaWxkLT5yZXNvdXJjZVsyXTsKQEAgLTM3NSw5ICszNzMsNyBAQAogCQkJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX01FTV82NDsKIAkJcmVzLT5zdGFydCA9IGJhc2U7CiAJCXJlcy0+ZW5kID0gbGltaXQgKyAweGZmZmZmOwotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZkZXYtPmRldiwgImJyaWRnZSAlc2JpdCBtbWlvIHByZWY6ICVwUlxuIiwKLQkJCShyZXMtPmZsYWdzICYgUENJX1BSRUZfUkFOR0VfVFlQRV82NCkgPyAiNjQiIDogIjMyIiwKLQkJCXJlcyk7CisJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmRldi0+ZGV2LCAiICBicmlkZ2Ugd2luZG93ICVwUlxuIiwgcmVzKTsKIAl9CiB9CiAKQEAgLTY1MSwxMyArNjQ3LDE0IEBACiAJCSAgICAoY2hpbGQtPm51bWJlciA+IGJ1cy0+c3Vib3JkaW5hdGUpIHx8CiAJCSAgICAoY2hpbGQtPm51bWJlciA8IGJ1cy0+bnVtYmVyKSB8fAogCQkgICAgKGNoaWxkLT5zdWJvcmRpbmF0ZSA8IGJ1cy0+bnVtYmVyKSkgewotCQkJcHJfZGVidWcoIlBDSTogQnVzICMlMDJ4ICgtIyUwMngpIGlzICVzICIKLQkJCQkiaGlkZGVuIGJlaGluZCVzIGJyaWRnZSAjJTAyeCAoLSMlMDJ4KVxuIiwKKwkJCWRldl9pbmZvKCZjaGlsZC0+ZGV2LCAiW2J1cyAlMDJ4LSUwMnhdICVzICIKKwkJCQkiaGlkZGVuIGJlaGluZCVzIGJyaWRnZSAlcyBbYnVzICUwMngtJTAyeF1cbiIsCiAJCQkJY2hpbGQtPm51bWJlciwgY2hpbGQtPnN1Ym9yZGluYXRlLAogCQkJCShidXMtPm51bWJlciA+IGNoaWxkLT5zdWJvcmRpbmF0ZSAmJgogCQkJCSBidXMtPnN1Ym9yZGluYXRlIDwgY2hpbGQtPm51bWJlcikgPwogCQkJCQkid2hvbGx5IiA6ICJwYXJ0aWFsbHkiLAogCQkJCWJ1cy0+c2VsZi0+dHJhbnNwYXJlbnQgPyAiIHRyYW5zcGFyZW50IiA6ICIiLAorCQkJCWRldl9uYW1lKCZidXMtPmRldiksCiAJCQkJYnVzLT5udW1iZXIsIGJ1cy0+c3Vib3JkaW5hdGUpOwogCQl9CiAJCWJ1cyA9IGJ1cy0+cGFyZW50OwpAQCAtNjkzLDYgKzY5MCw3IEBACiAJaWYgKCFwb3MpCiAJCXJldHVybjsKIAlwZGV2LT5pc19wY2llID0gMTsKKwlwZGV2LT5wY2llX2NhcCA9IHBvczsKIAlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfRVhQX0ZMQUdTLCAmcmVnMTYpOwogCXBkZXYtPnBjaWVfdHlwZSA9IChyZWcxNiAmIFBDSV9FWFBfRkxBR1NfVFlQRSkgPj4gNDsKIH0KQEAgLTcwMyw3ICs3MDEsNyBAQAogCXUxNiByZWcxNjsKIAl1MzIgcmVnMzI7CiAKLQlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwlwb3MgPSBwY2lfcGNpZV9jYXAocGRldik7CiAJaWYgKCFwb3MpCiAJCXJldHVybjsKIAlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfRVhQX0ZMQUdTLCAmcmVnMTYpOwpAQCAtNzE0LDYgKzcxMiwxMiBAQAogCQlwZGV2LT5pc19ob3RwbHVnX2JyaWRnZSA9IDE7CiB9CiAKK3N0YXRpYyB2b2lkIHNldF9wY2lfYWVyX2Zpcm13YXJlX2ZpcnN0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWlmIChhY3BpX2hlc3RfZmlybXdhcmVfZmlyc3RfcGNpKHBkZXYpKQorCQlwZGV2LT5hZXJfZmlybXdhcmVfZmlyc3QgPSAxOworfQorCiAjZGVmaW5lIExFR0FDWV9JT19SRVNPVVJDRQkoSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VSQ0VfUENJX0ZJWEVEKQogCiAvKioKQEAgLTczMSw2ICs3MzUsNyBAQAogCXUzMiBjbGFzczsKIAl1OCBoZHJfdHlwZTsKIAlzdHJ1Y3QgcGNpX3Nsb3QgKnNsb3Q7CisJaW50IHBvcyA9IDA7CiAKIAlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSEVBREVSX1RZUEUsICZoZHJfdHlwZSkpCiAJCXJldHVybiAtRUlPOwpAQCAtNzQyLDYgKzc0Nyw3IEBACiAJZGV2LT5tdWx0aWZ1bmN0aW9uID0gISEoaGRyX3R5cGUgJiAweDgwKTsKIAlkZXYtPmVycm9yX3N0YXRlID0gcGNpX2NoYW5uZWxfaW9fbm9ybWFsOwogCXNldF9wY2llX3BvcnRfdHlwZShkZXYpOworCXNldF9wY2lfYWVyX2Zpcm13YXJlX2ZpcnN0KGRldik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNsb3QsICZkZXYtPmJ1cy0+c2xvdHMsIGxpc3QpCiAJCWlmIChQQ0lfU0xPVChkZXYtPmRldmZuKSA9PSBzbG90LT5udW1iZXIpCkBAIC04MjIsNiArODI4LDExIEBACiAJCWRldi0+dHJhbnNwYXJlbnQgPSAoKGRldi0+Y2xhc3MgJiAweGZmKSA9PSAxKTsKIAkJcGNpX3JlYWRfYmFzZXMoZGV2LCAyLCBQQ0lfUk9NX0FERFJFU1MxKTsKIAkJc2V0X3BjaWVfaG90cGx1Z19icmlkZ2UoZGV2KTsKKwkJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfU1NWSUQpOworCQlpZiAocG9zKSB7CisJCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9TU1ZJRF9WRU5ET1JfSUQsICZkZXYtPnN1YnN5c3RlbV92ZW5kb3IpOworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfU1NWSURfREVWSUNFX0lELCAmZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgUENJX0hFQURFUl9UWVBFX0NBUkRCVVM6CQkgICAgLyogQ2FyZEJ1cyBicmlkZ2UgaGVhZGVyICovCkBAIC05MDcsNyArOTE4LDcgQEAKIAlpZiAoY2xhc3MgPT0gUENJX0NMQVNTX0JSSURHRV9IT1NUKQogCQlyZXR1cm4gcGNpX2NmZ19zcGFjZV9zaXplX2V4dChkZXYpOwogCi0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwlwb3MgPSBwY2lfcGNpZV9jYXAoZGV2KTsKIAlpZiAoIXBvcykgewogCQlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9QQ0lYKTsKIAkJaWYgKCFwb3MpCkBAIC0xMDE0LDYgKzEwMjUsOSBAQAogCiAJLyogU2luZ2xlIFJvb3QgSS9PIFZpcnR1YWxpemF0aW9uICovCiAJcGNpX2lvdl9pbml0KGRldik7CisKKwkvKiBFbmFibGUgQUNTIFAyUCB1cHN0cmVhbSBmb3J3YXJkaW5nICovCisJcGNpX2VuYWJsZV9hY3MoZGV2KTsKIH0KIAogdm9pZCBwY2lfZGV2aWNlX2FkZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2J1cyAqYnVzKQpAQCAtMTExMCw3ICsxMTI0LDcgQEAKIAl1bnNpZ25lZCBpbnQgZGV2Zm4sIHBhc3MsIG1heCA9IGJ1cy0+c2Vjb25kYXJ5OwogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAKLQlwcl9kZWJ1ZygiUENJOiBTY2FubmluZyBidXMgJTA0eDolMDJ4XG4iLCBwY2lfZG9tYWluX25yKGJ1cyksIGJ1cy0+bnVtYmVyKTsKKwlkZXZfZGJnKCZidXMtPmRldiwgInNjYW5uaW5nIGJ1c1xuIik7CiAKIAkvKiBHbyBmaW5kIHRoZW0sIFJvdmVyISAqLwogCWZvciAoZGV2Zm4gPSAwOyBkZXZmbiA8IDB4MTAwOyBkZXZmbiArPSA4KQpAQCAtMTEyNCw4ICsxMTM4LDcgQEAKIAkgKiBhbGwgUENJLXRvLVBDSSBicmlkZ2VzIG9uIHRoaXMgYnVzLgogCSAqLwogCWlmICghYnVzLT5pc19hZGRlZCkgewotCQlwcl9kZWJ1ZygiUENJOiBGaXh1cHMgZm9yIGJ1cyAlMDR4OiUwMnhcbiIsCi0JCQkgcGNpX2RvbWFpbl9ucihidXMpLCBidXMtPm51bWJlcik7CisJCWRldl9kYmcoJmJ1cy0+ZGV2LCAiZml4dXBzIGZvciBidXNcbiIpOwogCQlwY2liaW9zX2ZpeHVwX2J1cyhidXMpOwogCQlpZiAocGNpX2lzX3Jvb3RfYnVzKGJ1cykpCiAJCQlidXMtPmlzX2FkZGVkID0gMTsKQEAgLTExNDUsOCArMTE1OCw3IEBACiAJICoKIAkgKiBSZXR1cm4gaG93IGZhciB3ZSd2ZSBnb3QgZmluZGluZyBzdWItYnVzZXMuCiAJICovCi0JcHJfZGVidWcoIlBDSTogQnVzIHNjYW4gZm9yICUwNHg6JTAyeCByZXR1cm5pbmcgd2l0aCBtYXg9JTAyeFxuIiwKLQkJcGNpX2RvbWFpbl9ucihidXMpLCBidXMtPm51bWJlciwgbWF4KTsKKwlkZXZfZGJnKCZidXMtPmRldiwgImJ1cyBzY2FuIHJldHVybmluZyB3aXRoIG1heD0lMDJ4XG4iLCBtYXgpOwogCXJldHVybiBtYXg7CiB9CiAKQEAgLTExNTQsNyArMTE2Niw3IEBACiAJCWludCBidXMsIHN0cnVjdCBwY2lfb3BzICpvcHMsIHZvaWQgKnN5c2RhdGEpCiB7CiAJaW50IGVycm9yOwotCXN0cnVjdCBwY2lfYnVzICpiOworCXN0cnVjdCBwY2lfYnVzICpiLCAqYjI7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCiAJYiA9IHBjaV9hbGxvY19idXMoKTsKQEAgLTExNzAsOSArMTE4MiwxMCBAQAogCWItPnN5c2RhdGEgPSBzeXNkYXRhOwogCWItPm9wcyA9IG9wczsKIAotCWlmIChwY2lfZmluZF9idXMocGNpX2RvbWFpbl9ucihiKSwgYnVzKSkgeworCWIyID0gcGNpX2ZpbmRfYnVzKHBjaV9kb21haW5fbnIoYiksIGJ1cyk7CisJaWYgKGIyKSB7CiAJCS8qIElmIHdlIGFscmVhZHkgZ290IHRvIHRoaXMgYnVzIHRocm91Z2ggYSBkaWZmZXJlbnQgYnJpZGdlLCBpZ25vcmUgaXQgKi8KLQkJcHJfZGVidWcoIlBDSTogQnVzICUwNHg6JTAyeCBhbHJlYWR5IGtub3duXG4iLCBwY2lfZG9tYWluX25yKGIpLCBidXMpOworCQlkZXZfZGJnKCZiMi0+ZGV2LCAiYnVzIGFscmVhZHkga25vd25cbiIpOwogCQlnb3RvIGVycl9vdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9xdWlya3MuYyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCmluZGV4IDI0NWQyY2QuLjdjZmE3YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jCisrKyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCkBAIC0zNTcsNyArMzU3LDcgQEAKIAkJcGNpYmlvc19idXNfdG9fcmVzb3VyY2UoZGV2LCByZXMsICZidXNfcmVnaW9uKTsKIAogCQlwY2lfY2xhaW1fcmVzb3VyY2UoZGV2LCBucik7Ci0JCWRldl9pbmZvKCZkZXYtPmRldiwgInF1aXJrOiByZWdpb24gJTA0eC0lMDR4IGNsYWltZWQgYnkgJXNcbiIsIHJlZ2lvbiwgcmVnaW9uICsgc2l6ZSAtIDEsIG5hbWUpOworCQlkZXZfaW5mbygmZGV2LT5kZXYsICJxdWlyazogJXBSIGNsYWltZWQgYnkgJXNcbiIsIHJlcywgbmFtZSk7CiAJfQogfQkKIApAQCAtMTY4MCw2ICsxNjgwLDcgQEAKICAqLwogI2RlZmluZSBBTURfODEzWF9NSVNDCQkJMHg0MAogI2RlZmluZSBBTURfODEzWF9OT0lPQU1PREUJCSgxPDwwKQorI2RlZmluZSBBTURfODEzWF9SRVZfQjEJCQkweDEyCiAjZGVmaW5lIEFNRF84MTNYX1JFVl9CMgkJCTB4MTMKIAogc3RhdGljIHZvaWQgcXVpcmtfZGlzYWJsZV9hbWRfODEzeF9ib290X2ludGVycnVwdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQpAQCAtMTY4OCw3ICsxNjg5LDggQEAKIAogCWlmIChub2lvYXBpY3F1aXJrKQogCQlyZXR1cm47Ci0JaWYgKGRldi0+cmV2aXNpb24gPT0gQU1EXzgxM1hfUkVWX0IyKQorCWlmICgoZGV2LT5yZXZpc2lvbiA9PSBBTURfODEzWF9SRVZfQjEpIHx8CisJICAgIChkZXYtPnJldmlzaW9uID09IEFNRF84MTNYX1JFVl9CMikpCiAJCXJldHVybjsKIAogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIEFNRF84MTNYX01JU0MsICZwY2lfY29uZmlnX2R3b3JkKTsKQEAgLTE2OTgsOCArMTcwMCwxMCBAQAogCWRldl9pbmZvKCZkZXYtPmRldiwgImRpc2FibGVkIGJvb3QgaW50ZXJydXB0cyBvbiBkZXZpY2UgWyUwNHg6JTA0eF1cbiIsCiAJCSBkZXYtPnZlbmRvciwgZGV2LT5kZXZpY2UpOwogfQotREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9BTUQsICAgUENJX0RFVklDRV9JRF9BTURfODEzMV9CUklER0UsIAlxdWlya19kaXNhYmxlX2FtZF84MTN4X2Jvb3RfaW50ZXJydXB0KTsKLURFQ0xBUkVfUENJX0ZJWFVQX1JFU1VNRShQQ0lfVkVORE9SX0lEX0FNRCwgICBQQ0lfREVWSUNFX0lEX0FNRF84MTMyX0JSSURHRSwgCXF1aXJrX2Rpc2FibGVfYW1kXzgxM3hfYm9vdF9pbnRlcnJ1cHQpOworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9BTUQsCVBDSV9ERVZJQ0VfSURfQU1EXzgxMzFfQlJJREdFLAlxdWlya19kaXNhYmxlX2FtZF84MTN4X2Jvb3RfaW50ZXJydXB0KTsKK0RFQ0xBUkVfUENJX0ZJWFVQX1JFU1VNRShQQ0lfVkVORE9SX0lEX0FNRCwJUENJX0RFVklDRV9JRF9BTURfODEzMV9CUklER0UsCXF1aXJrX2Rpc2FibGVfYW1kXzgxM3hfYm9vdF9pbnRlcnJ1cHQpOworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9BTUQsCVBDSV9ERVZJQ0VfSURfQU1EXzgxMzJfQlJJREdFLAlxdWlya19kaXNhYmxlX2FtZF84MTN4X2Jvb3RfaW50ZXJydXB0KTsKK0RFQ0xBUkVfUENJX0ZJWFVQX1JFU1VNRShQQ0lfVkVORE9SX0lEX0FNRCwJUENJX0RFVklDRV9JRF9BTURfODEzMl9CUklER0UsCXF1aXJrX2Rpc2FibGVfYW1kXzgxM3hfYm9vdF9pbnRlcnJ1cHQpOwogCiAjZGVmaW5lIEFNRF84MTExX1BDSV9JUlFfUk9VVElORwkweDU2CiAKQEAgLTI1OTUsOSArMjU5OSwzNyBAQAogc3RhdGljIGludCBfX2luaXQgcGNpX2FwcGx5X2ZpbmFsX3F1aXJrcyh2b2lkKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCXU4IGNscyA9IDA7CisJdTggdG1wOworCisJaWYgKHBjaV9jYWNoZV9saW5lX3NpemUpCisJCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6IENMUyAldSBieXRlc1xuIiwKKwkJICAgICAgIHBjaV9jYWNoZV9saW5lX3NpemUgPDwgMik7CiAKIAl3aGlsZSAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldikpICE9IE5VTEwpIHsKIAkJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfZmluYWwsIGRldik7CisJCS8qCisJCSAqIElmIGFyY2ggaGFzbid0IHNldCBpdCBleHBsaWNpdGx5IHlldCwgdXNlIHRoZSBDTFMKKwkJICogdmFsdWUgc2hhcmVkIGJ5IGFsbCBQQ0kgZGV2aWNlcy4gIElmIHRoZXJlJ3MgYQorCQkgKiBtaXNtYXRjaCwgZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IHZhbHVlLgorCQkgKi8KKwkJaWYgKCFwY2lfY2FjaGVfbGluZV9zaXplKSB7CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsICZ0bXApOworCQkJaWYgKCFjbHMpCisJCQkJY2xzID0gdG1wOworCQkJaWYgKCF0bXAgfHwgY2xzID09IHRtcCkKKwkJCQljb250aW51ZTsKKworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlBDSTogQ0xTIG1pc21hdGNoICgldSAhPSAldSksICIKKwkJCSAgICAgICAidXNpbmcgJXUgYnl0ZXNcbiIsIGNscyA8PCAyLCB0bXAgPDwgMiwKKwkJCSAgICAgICBwY2lfZGZsX2NhY2hlX2xpbmVfc2l6ZSA8PCAyKTsKKwkJCXBjaV9jYWNoZV9saW5lX3NpemUgPSBwY2lfZGZsX2NhY2hlX2xpbmVfc2l6ZTsKKwkJfQorCX0KKwlpZiAoIXBjaV9jYWNoZV9saW5lX3NpemUpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlBDSTogQ0xTICV1IGJ5dGVzLCBkZWZhdWx0ICV1XG4iLAorCQkgICAgICAgY2xzIDw8IDIsIHBjaV9kZmxfY2FjaGVfbGluZV9zaXplIDw8IDIpOworCQlwY2lfY2FjaGVfbGluZV9zaXplID0gY2xzOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2VhcmNoLmMgYi9kcml2ZXJzL3BjaS9zZWFyY2guYwppbmRleCBlYzQxNTM1Li42ZGFlODcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZWFyY2guYworKysgYi9kcml2ZXJzL3BjaS9zZWFyY2guYwpAQCAtMjYsMTQgKzI2LDE0IEBACiB7CiAJc3RydWN0IHBjaV9kZXYgKnRtcCA9IE5VTEw7CiAKLQlpZiAocGRldi0+aXNfcGNpZSkKKwlpZiAocGNpX2lzX3BjaWUocGRldikpCiAJCXJldHVybiBOVUxMOwogCXdoaWxlICgxKSB7CiAJCWlmIChwY2lfaXNfcm9vdF9idXMocGRldi0+YnVzKSkKIAkJCWJyZWFrOwogCQlwZGV2ID0gcGRldi0+YnVzLT5zZWxmOwogCQkvKiBhIHAycCBicmlkZ2UgKi8KLQkJaWYgKCFwZGV2LT5pc19wY2llKSB7CisJCWlmICghcGNpX2lzX3BjaWUocGRldikpIHsKIAkJCXRtcCA9IHBkZXY7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtMTQ5LDMyICsxNDksMzMgQEAKIH0KIAogLyoqCi0gKiBwY2lfZ2V0X2J1c19hbmRfc2xvdCAtIGxvY2F0ZSBQQ0kgZGV2aWNlIGZyb20gYSBnaXZlbiBQQ0kgYnVzICYgc2xvdAotICogQGJ1czogbnVtYmVyIG9mIFBDSSBidXMgb24gd2hpY2ggZGVzaXJlZCBQQ0kgZGV2aWNlIHJlc2lkZXMKLSAqIEBkZXZmbjogZW5jb2RlcyBudW1iZXIgb2YgUENJIHNsb3QgaW4gd2hpY2ggdGhlIGRlc2lyZWQgUENJCi0gKiBkZXZpY2UgcmVzaWRlcyBhbmQgdGhlIGxvZ2ljYWwgZGV2aWNlIG51bWJlciB3aXRoaW4gdGhhdCBzbG90Ci0gKiBpbiBjYXNlIG9mIG11bHRpLWZ1bmN0aW9uIGRldmljZXMuCisgKiBwY2lfZ2V0X2RvbWFpbl9idXNfYW5kX3Nsb3QgLSBsb2NhdGUgUENJIGRldmljZSBmb3IgYSBnaXZlbiBQQ0kgZG9tYWluIChzZWdtZW50KSwgYnVzLCBhbmQgc2xvdAorICogQGRvbWFpbjogUENJIGRvbWFpbi9zZWdtZW50IG9uIHdoaWNoIHRoZSBQQ0kgZGV2aWNlIHJlc2lkZXMuCisgKiBAYnVzOiBQQ0kgYnVzIG9uIHdoaWNoIGRlc2lyZWQgUENJIGRldmljZSByZXNpZGVzCisgKiBAZGV2Zm46IGVuY29kZXMgbnVtYmVyIG9mIFBDSSBzbG90IGluIHdoaWNoIHRoZSBkZXNpcmVkIFBDSSBkZXZpY2UKKyAqIHJlc2lkZXMgYW5kIHRoZSBsb2dpY2FsIGRldmljZSBudW1iZXIgd2l0aGluIHRoYXQgc2xvdCBpbiBjYXNlIG9mCisgKiBtdWx0aS1mdW5jdGlvbiBkZXZpY2VzLgogICoKLSAqIE5vdGU6IHRoZSBidXMvc2xvdCBzZWFyY2ggaXMgbGltaXRlZCB0byBQQ0kgZG9tYWluIChzZWdtZW50KSAwLgotICoKLSAqIEdpdmVuIGEgUENJIGJ1cyBhbmQgc2xvdC9mdW5jdGlvbiBudW1iZXIsIHRoZSBkZXNpcmVkIFBDSSBkZXZpY2UKLSAqIGlzIGxvY2F0ZWQgaW4gc3lzdGVtIGdsb2JhbCBsaXN0IG9mIFBDSSBkZXZpY2VzLiAgSWYgdGhlIGRldmljZQotICogaXMgZm91bmQsIGEgcG9pbnRlciB0byBpdHMgZGF0YSBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQuICBJZiBubwotICogZGV2aWNlIGlzIGZvdW5kLCAlTlVMTCBpcyByZXR1cm5lZC4gVGhlIHJldHVybmVkIGRldmljZSBoYXMgaXRzCi0gKiByZWZlcmVuY2UgY291bnQgYnVtcGVkIGJ5IG9uZS4KKyAqIEdpdmVuIGEgUENJIGRvbWFpbiwgYnVzLCBhbmQgc2xvdC9mdW5jdGlvbiBudW1iZXIsIHRoZSBkZXNpcmVkIFBDSQorICogZGV2aWNlIGlzIGxvY2F0ZWQgaW4gdGhlIGxpc3Qgb2YgUENJIGRldmljZXMuIElmIHRoZSBkZXZpY2UgaXMKKyAqIGZvdW5kLCBpdHMgcmVmZXJlbmNlIGNvdW50IGlzIGluY3JlYXNlZCBhbmQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEKKyAqIHBvaW50ZXIgdG8gaXRzIGRhdGEgc3RydWN0dXJlLiAgVGhlIGNhbGxlciBtdXN0IGRlY3JlbWVudCB0aGUKKyAqIHJlZmVyZW5jZSBjb3VudCBieSBjYWxsaW5nIHBjaV9kZXZfcHV0KCkuICBJZiBubyBkZXZpY2UgaXMgZm91bmQsCisgKiAlTlVMTCBpcyByZXR1cm5lZC4KICAqLwotCi1zdHJ1Y3QgcGNpX2RldiAqIHBjaV9nZXRfYnVzX2FuZF9zbG90KHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZmbikKK3N0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X2RvbWFpbl9idXNfYW5kX3Nsb3QoaW50IGRvbWFpbiwgdW5zaWduZWQgaW50IGJ1cywKKwkJCQkJICAgIHVuc2lnbmVkIGludCBkZXZmbikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKIAogCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkgewotCQlpZiAocGNpX2RvbWFpbl9ucihkZXYtPmJ1cykgPT0gMCAmJgotCQkgICAoZGV2LT5idXMtPm51bWJlciA9PSBidXMgJiYgZGV2LT5kZXZmbiA9PSBkZXZmbikpCisJCWlmIChwY2lfZG9tYWluX25yKGRldi0+YnVzKSA9PSBkb21haW4gJiYKKwkJICAgIChkZXYtPmJ1cy0+bnVtYmVyID09IGJ1cyAmJiBkZXYtPmRldmZuID09IGRldmZuKSkKIAkJCXJldHVybiBkZXY7CiAJfQogCXJldHVybiBOVUxMOwogfQorRVhQT1JUX1NZTUJPTChwY2lfZ2V0X2RvbWFpbl9idXNfYW5kX3Nsb3QpOwogCiBzdGF0aWMgaW50IG1hdGNoX3BjaV9kZXZfYnlfaWQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewpAQCAtMzU0LDUgKzM1NSw0IEBACiBFWFBPUlRfU1lNQk9MKHBjaV9nZXRfZGV2aWNlKTsKIEVYUE9SVF9TWU1CT0wocGNpX2dldF9zdWJzeXMpOwogRVhQT1JUX1NZTUJPTChwY2lfZ2V0X3Nsb3QpOwotRVhQT1JUX1NZTUJPTChwY2lfZ2V0X2J1c19hbmRfc2xvdCk7CiBFWFBPUlRfU1lNQk9MKHBjaV9nZXRfY2xhc3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwppbmRleCBjYjFhMDI3Li5jNDhjZDM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwpAQCAtNzEsNTMgKzcxLDUwIEBACiB2b2lkIHBjaV9zZXR1cF9jYXJkYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmJyaWRnZSA9IGJ1cy0+c2VsZjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3QgcGNpX2J1c19yZWdpb24gcmVnaW9uOwogCi0JZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiQ2FyZEJ1cyBicmlkZ2UsIHNlY29uZGFyeSBidXMgJTA0eDolMDJ4XG4iLAotCQkgcGNpX2RvbWFpbl9ucihidXMpLCBidXMtPm51bWJlcik7CisJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiQ2FyZEJ1cyBicmlkZ2UgdG8gW2J1cyAlMDJ4LSUwMnhdXG4iLAorCQkgYnVzLT5zZWNvbmRhcnksIGJ1cy0+c3Vib3JkaW5hdGUpOwogCi0JcGNpYmlvc19yZXNvdXJjZV90b19idXMoYnJpZGdlLCAmcmVnaW9uLCBidXMtPnJlc291cmNlWzBdKTsKLQlpZiAoYnVzLT5yZXNvdXJjZVswXS0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CisJcmVzID0gYnVzLT5yZXNvdXJjZVswXTsKKwlwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhicmlkZ2UsICZyZWdpb24sIHJlcyk7CisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CiAJCS8qCiAJCSAqIFRoZSBJTyByZXNvdXJjZSBpcyBhbGxvY2F0ZWQgYSByYW5nZSB0d2ljZSBhcyBsYXJnZSBhcyBpdAogCQkgKiB3b3VsZCBub3JtYWxseSBuZWVkLiAgVGhpcyBhbGxvd3MgdXMgdG8gc2V0IGJvdGggSU8gcmVncy4KIAkJICovCi0JCWRldl9pbmZvKCZicmlkZ2UtPmRldiwgIiAgSU8gd2luZG93OiAlIzA4bHgtJSMwOGx4XG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVnaW9uLnN0YXJ0LAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVnaW9uLmVuZCk7CisJCWRldl9pbmZvKCZicmlkZ2UtPmRldiwgIiAgYnJpZGdlIHdpbmRvdyAlcFJcbiIsIHJlcyk7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfQ0JfSU9fQkFTRV8wLAogCQkJCQlyZWdpb24uc3RhcnQpOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZSwgUENJX0NCX0lPX0xJTUlUXzAsCiAJCQkJCXJlZ2lvbi5lbmQpOwogCX0KIAotCXBjaWJpb3NfcmVzb3VyY2VfdG9fYnVzKGJyaWRnZSwgJnJlZ2lvbiwgYnVzLT5yZXNvdXJjZVsxXSk7Ci0JaWYgKGJ1cy0+cmVzb3VyY2VbMV0tPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgewotCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIElPIHdpbmRvdzogJSMwOGx4LSUjMDhseFxuIiwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKXJlZ2lvbi5zdGFydCwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKXJlZ2lvbi5lbmQpOworCXJlcyA9IGJ1cy0+cmVzb3VyY2VbMV07CisJcGNpYmlvc19yZXNvdXJjZV90b19idXMoYnJpZGdlLCAmcmVnaW9uLCByZXMpOworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgeworCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIGJyaWRnZSB3aW5kb3cgJXBSXG4iLCByZXMpOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZSwgUENJX0NCX0lPX0JBU0VfMSwKIAkJCQkJcmVnaW9uLnN0YXJ0KTsKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmlkZ2UsIFBDSV9DQl9JT19MSU1JVF8xLAogCQkJCQlyZWdpb24uZW5kKTsKIAl9CiAKLQlwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhicmlkZ2UsICZyZWdpb24sIGJ1cy0+cmVzb3VyY2VbMl0pOwotCWlmIChidXMtPnJlc291cmNlWzJdLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSB7Ci0JCWRldl9pbmZvKCZicmlkZ2UtPmRldiwgIiAgUFJFRkVUQ0ggd2luZG93OiAlIzA4bHgtJSMwOGx4XG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVnaW9uLnN0YXJ0LAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVnaW9uLmVuZCk7CisJcmVzID0gYnVzLT5yZXNvdXJjZVsyXTsKKwlwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhicmlkZ2UsICZyZWdpb24sIHJlcyk7CisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgeworCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIGJyaWRnZSB3aW5kb3cgJXBSXG4iLCByZXMpOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZSwgUENJX0NCX01FTU9SWV9CQVNFXzAsCiAJCQkJCXJlZ2lvbi5zdGFydCk7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfQ0JfTUVNT1JZX0xJTUlUXzAsCiAJCQkJCXJlZ2lvbi5lbmQpOwogCX0KIAotCXBjaWJpb3NfcmVzb3VyY2VfdG9fYnVzKGJyaWRnZSwgJnJlZ2lvbiwgYnVzLT5yZXNvdXJjZVszXSk7Ci0JaWYgKGJ1cy0+cmVzb3VyY2VbM10tPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pIHsKLQkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBNRU0gd2luZG93OiAlIzA4bHgtJSMwOGx4XG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVnaW9uLnN0YXJ0LAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVnaW9uLmVuZCk7CisJcmVzID0gYnVzLT5yZXNvdXJjZVszXTsKKwlwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhicmlkZ2UsICZyZWdpb24sIHJlcyk7CisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgeworCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIGJyaWRnZSB3aW5kb3cgJXBSXG4iLCByZXMpOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZSwgUENJX0NCX01FTU9SWV9CQVNFXzEsCiAJCQkJCXJlZ2lvbi5zdGFydCk7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfQ0JfTUVNT1JZX0xJTUlUXzEsCkBAIC0xNDAsMzQgKzEzNywzMyBAQAogc3RhdGljIHZvaWQgcGNpX3NldHVwX2JyaWRnZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBidXMtPnNlbGY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CiAJc3RydWN0IHBjaV9idXNfcmVnaW9uIHJlZ2lvbjsKIAl1MzIgbCwgYnUsIGx1LCBpb191cHBlcjE2OwotCWludCBwcmVmX21lbTY0OwogCiAJaWYgKHBjaV9pc19lbmFibGVkKGJyaWRnZSkpCiAJCXJldHVybjsKIAotCWRldl9pbmZvKCZicmlkZ2UtPmRldiwgIlBDSSBicmlkZ2UsIHNlY29uZGFyeSBidXMgJTA0eDolMDJ4XG4iLAotCQkgcGNpX2RvbWFpbl9ucihidXMpLCBidXMtPm51bWJlcik7CisJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiUENJIGJyaWRnZSB0byBbYnVzICUwMngtJTAyeF1cbiIsCisJCSBidXMtPnNlY29uZGFyeSwgYnVzLT5zdWJvcmRpbmF0ZSk7CiAKIAkvKiBTZXQgdXAgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBQQ0kgSS9PIHNlZ21lbnQgZm9yIHRoaXMgYnVzLiAqLwotCXBjaWJpb3NfcmVzb3VyY2VfdG9fYnVzKGJyaWRnZSwgJnJlZ2lvbiwgYnVzLT5yZXNvdXJjZVswXSk7Ci0JaWYgKGJ1cy0+cmVzb3VyY2VbMF0tPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgeworCXJlcyA9IGJ1cy0+cmVzb3VyY2VbMF07CisJcGNpYmlvc19yZXNvdXJjZV90b19idXMoYnJpZGdlLCAmcmVnaW9uLCByZXMpOworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgewogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfSU9fQkFTRSwgJmwpOwogCQlsICY9IDB4ZmZmZjAwMDA7CiAJCWwgfD0gKHJlZ2lvbi5zdGFydCA+PiA4KSAmIDB4MDBmMDsKIAkJbCB8PSByZWdpb24uZW5kICYgMHhmMDAwOwogCQkvKiBTZXQgdXAgdXBwZXIgMTYgYml0cyBvZiBJL08gYmFzZS9saW1pdC4gKi8KIAkJaW9fdXBwZXIxNiA9IChyZWdpb24uZW5kICYgMHhmZmZmMDAwMCkgfCAocmVnaW9uLnN0YXJ0ID4+IDE2KTsKLQkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBJTyB3aW5kb3c6ICUjMDRseC0lIzA0bHhcbiIsCi0JCSAgICAodW5zaWduZWQgbG9uZylyZWdpb24uc3RhcnQsCi0JCSAgICAodW5zaWduZWQgbG9uZylyZWdpb24uZW5kKTsKKwkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBicmlkZ2Ugd2luZG93ICVwUlxuIiwgcmVzKTsKIAl9CiAJZWxzZSB7CiAJCS8qIENsZWFyIHVwcGVyIDE2IGJpdHMgb2YgSS9PIGJhc2UvbGltaXQuICovCiAJCWlvX3VwcGVyMTYgPSAwOwogCQlsID0gMHgwMGYwOwotCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIElPIHdpbmRvdzogZGlzYWJsZWRcbiIpOworCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIGJyaWRnZSB3aW5kb3cgW2lvICBkaXNhYmxlZF1cbiIpOwogCX0KIAkvKiBUZW1wb3JhcmlseSBkaXNhYmxlIHRoZSBJL08gcmFuZ2UgYmVmb3JlIHVwZGF0aW5nIFBDSV9JT19CQVNFLiAqLwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfSU9fQkFTRV9VUFBFUjE2LCAweDAwMDBmZmZmKTsKQEAgLTE3OCwxNyArMTc0LDE2IEBACiAKIAkvKiBTZXQgdXAgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBQQ0kgTWVtb3J5IHNlZ21lbnQKIAkgICBmb3IgdGhpcyBidXMuICovCi0JcGNpYmlvc19yZXNvdXJjZV90b19idXMoYnJpZGdlLCAmcmVnaW9uLCBidXMtPnJlc291cmNlWzFdKTsKLQlpZiAoYnVzLT5yZXNvdXJjZVsxXS0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgeworCXJlcyA9IGJ1cy0+cmVzb3VyY2VbMV07CisJcGNpYmlvc19yZXNvdXJjZV90b19idXMoYnJpZGdlLCAmcmVnaW9uLCByZXMpOworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pIHsKIAkJbCA9IChyZWdpb24uc3RhcnQgPj4gMTYpICYgMHhmZmYwOwogCQlsIHw9IHJlZ2lvbi5lbmQgJiAweGZmZjAwMDAwOwotCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIE1FTSB3aW5kb3c6ICUjMDhseC0lIzA4bHhcbiIsCi0JCSAgICAodW5zaWduZWQgbG9uZylyZWdpb24uc3RhcnQsCi0JCSAgICAodW5zaWduZWQgbG9uZylyZWdpb24uZW5kKTsKKwkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBicmlkZ2Ugd2luZG93ICVwUlxuIiwgcmVzKTsKIAl9CiAJZWxzZSB7CiAJCWwgPSAweDAwMDBmZmYwOwotCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIE1FTSB3aW5kb3c6IGRpc2FibGVkXG4iKTsKKwkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBicmlkZ2Ugd2luZG93IFttZW0gZGlzYWJsZWRdXG4iKTsKIAl9CiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmlkZ2UsIFBDSV9NRU1PUllfQkFTRSwgbCk7CiAKQEAgLTE5OCwzNCArMTkzLDI3IEBACiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmlkZ2UsIFBDSV9QUkVGX0xJTUlUX1VQUEVSMzIsIDApOwogCiAJLyogU2V0IHVwIFBSRUYgYmFzZS9saW1pdC4gKi8KLQlwcmVmX21lbTY0ID0gMDsKIAlidSA9IGx1ID0gMDsKLQlwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhicmlkZ2UsICZyZWdpb24sIGJ1cy0+cmVzb3VyY2VbMl0pOwotCWlmIChidXMtPnJlc291cmNlWzJdLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpIHsKLQkJaW50IHdpZHRoID0gODsKKwlyZXMgPSBidXMtPnJlc291cmNlWzJdOworCXBjaWJpb3NfcmVzb3VyY2VfdG9fYnVzKGJyaWRnZSwgJnJlZ2lvbiwgcmVzKTsKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpIHsKIAkJbCA9IChyZWdpb24uc3RhcnQgPj4gMTYpICYgMHhmZmYwOwogCQlsIHw9IHJlZ2lvbi5lbmQgJiAweGZmZjAwMDAwOwotCQlpZiAoYnVzLT5yZXNvdXJjZVsyXS0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTV82NCkgewotCQkJcHJlZl9tZW02NCA9IDE7CisJCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU1fNjQpIHsKIAkJCWJ1ID0gdXBwZXJfMzJfYml0cyhyZWdpb24uc3RhcnQpOwogCQkJbHUgPSB1cHBlcl8zMl9iaXRzKHJlZ2lvbi5lbmQpOwotCQkJd2lkdGggPSAxNjsKIAkJfQotCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIFBSRUZFVENIIHdpbmRvdzogJSMwKmxseC0lIzAqbGx4XG4iLAotCQkJCXdpZHRoLCAodW5zaWduZWQgbG9uZyBsb25nKXJlZ2lvbi5zdGFydCwKLQkJCQl3aWR0aCwgKHVuc2lnbmVkIGxvbmcgbG9uZylyZWdpb24uZW5kKTsKKwkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBicmlkZ2Ugd2luZG93ICVwUlxuIiwgcmVzKTsKIAl9CiAJZWxzZSB7CiAJCWwgPSAweDAwMDBmZmYwOwotCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIFBSRUZFVENIIHdpbmRvdzogZGlzYWJsZWRcbiIpOworCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIGJyaWRnZSB3aW5kb3cgW21lbSBwcmVmIGRpc2FibGVkXVxuIik7CiAJfQogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfUFJFRl9NRU1PUllfQkFTRSwgbCk7CiAKLQlpZiAocHJlZl9tZW02NCkgewotCQkvKiBTZXQgdGhlIHVwcGVyIDMyIGJpdHMgb2YgUFJFRiBiYXNlICYgbGltaXQuICovCi0JCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfUFJFRl9CQVNFX1VQUEVSMzIsIGJ1KTsKLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmlkZ2UsIFBDSV9QUkVGX0xJTUlUX1VQUEVSMzIsIGx1KTsKLQl9CisJLyogU2V0IHRoZSB1cHBlciAzMiBiaXRzIG9mIFBSRUYgYmFzZSAmIGxpbWl0LiAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfUFJFRl9CQVNFX1VQUEVSMzIsIGJ1KTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZSwgUENJX1BSRUZfTElNSVRfVVBQRVIzMiwgbHUpOwogCiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGJyaWRnZSwgUENJX0JSSURHRV9DT05UUk9MLCBidXMtPmJyaWRnZV9jdGwpOwogfQpAQCAtMzQ1LDYgKzMzMywxMCBAQAogI2VuZGlmCiAJc2l6ZSA9IEFMSUdOKHNpemUgKyBzaXplMSwgNDA5Nik7CiAJaWYgKCFzaXplKSB7CisJCWlmIChiX3Jlcy0+c3RhcnQgfHwgYl9yZXMtPmVuZCkKKwkJCWRldl9pbmZvKCZidXMtPnNlbGYtPmRldiwgImRpc2FibGluZyBicmlkZ2Ugd2luZG93ICIKKwkJCQkgIiVwUiB0byBbYnVzICUwMngtJTAyeF0gKHVudXNlZClcbiIsIGJfcmVzLAorCQkJCSBidXMtPnNlY29uZGFyeSwgYnVzLT5zdWJvcmRpbmF0ZSk7CiAJCWJfcmVzLT5mbGFncyA9IDA7CiAJCXJldHVybjsKIAl9CkBAIC0zOTAsOCArMzgyLDkgQEAKIAkJCWFsaWduID0gcGNpX3Jlc291cmNlX2FsaWdubWVudChkZXYsIHIpOwogCQkJb3JkZXIgPSBfX2ZmcyhhbGlnbikgLSAyMDsKIAkJCWlmIChvcmRlciA+IDExKSB7Ci0JCQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiQkFSICVkIGJhZCBhbGlnbm1lbnQgJWxseDogIgotCQkJCQkgIiVwUlxuIiwgaSwgKHVuc2lnbmVkIGxvbmcgbG9uZylhbGlnbiwgcik7CisJCQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiZGlzYWJsaW5nIEJBUiAlZDogJXBSICIKKwkJCQkJICIoYmFkIGFsaWdubWVudCAlI2xseClcbiIsIGksIHIsCisJCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBhbGlnbik7CiAJCQkJci0+ZmxhZ3MgPSAwOwogCQkJCWNvbnRpbnVlOwogCQkJfQpAQCAtNDI1LDYgKzQxOCwxMCBAQAogCX0KIAlzaXplID0gQUxJR04oc2l6ZSwgbWluX2FsaWduKTsKIAlpZiAoIXNpemUpIHsKKwkJaWYgKGJfcmVzLT5zdGFydCB8fCBiX3Jlcy0+ZW5kKQorCQkJZGV2X2luZm8oJmJ1cy0+c2VsZi0+ZGV2LCAiZGlzYWJsaW5nIGJyaWRnZSB3aW5kb3cgIgorCQkJCSAiJXBSIHRvIFtidXMgJTAyeC0lMDJ4XSAodW51c2VkKVxuIiwgYl9yZXMsCisJCQkJIGJ1cy0+c2Vjb25kYXJ5LCBidXMtPnN1Ym9yZGluYXRlKTsKIAkJYl9yZXMtPmZsYWdzID0gMDsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtNTgyLDEwICs1NzksNyBAQAogICAgICAgICAgICAgICAgIGlmICghcmVzIHx8ICFyZXMtPmVuZCkKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmJ1cy0+ZGV2LCAicmVzb3VyY2UgJWQgJXMgJXBSXG4iLCBpLAotCQkJICAgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSA/ICJpbzogIiA6Ci0JCQkgICAgKChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCk/ICJwcmVmIG1lbSI6Im1lbToiKSwKLQkJCSAgIHJlcyk7CisJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmJ1cy0+ZGV2LCAicmVzb3VyY2UgJWQgJXBSXG4iLCBpLCByZXMpOwogICAgICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKaW5kZXggYzU0NTI2Yi4uN2Q2NzhiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKQEAgLTUxLDEyICs1MSw2IEBACiAKIAlwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhkZXYsICZyZWdpb24sIHJlcyk7CiAKLQlkZXZfZGJnKCZkZXYtPmRldiwgIkJBUiAlZDogZ290IHJlcyAlcFIgYnVzIFslI2xseC0lI2xseF0gIgotCQkiZmxhZ3MgJSNseFxuIiwgcmVzbm8sIHJlcywKLQkJICh1bnNpZ25lZCBsb25nIGxvbmcpcmVnaW9uLnN0YXJ0LAotCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylyZWdpb24uZW5kLAotCQkgKHVuc2lnbmVkIGxvbmcpcmVzLT5mbGFncyk7Ci0KIAluZXcgPSByZWdpb24uc3RhcnQgfCAocmVzLT5mbGFncyAmIFBDSV9SRUdJT05fRkxBR19NQVNLKTsKIAlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCiAJCW1hc2sgPSAodTMyKVBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKQEAgLTkxLDkgKzg1LDkgQEAKIAkJfQogCX0KIAlyZXMtPmZsYWdzICY9IH5JT1JFU09VUkNFX1VOU0VUOwotCWRldl9kYmcoJmRldi0+ZGV2LCAiQkFSICVkOiBtb3ZlZCB0byBidXMgWyUjbGx4LSUjbGx4XSBmbGFncyAlI2x4XG4iLAotCQlyZXNubywgKHVuc2lnbmVkIGxvbmcgbG9uZylyZWdpb24uc3RhcnQsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpcmVnaW9uLmVuZCwgcmVzLT5mbGFncyk7CisJZGV2X2luZm8oJmRldi0+ZGV2LCAiQkFSICVkOiBzZXQgdG8gJXBSIChQQ0kgYWRkcmVzcyBbJSNsbHgtJSNsbHhdXG4iLAorCQkgcmVzbm8sIHJlcywgKHVuc2lnbmVkIGxvbmcgbG9uZylyZWdpb24uc3RhcnQsCisJCSAodW5zaWduZWQgbG9uZyBsb25nKXJlZ2lvbi5lbmQpOwogfQogCiBpbnQgcGNpX2NsYWltX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCByZXNvdXJjZSkKQEAgLTEwMywyMCArOTcsMTcgQEAKIAlpbnQgZXJyOwogCiAJcm9vdCA9IHBjaV9maW5kX3BhcmVudF9yZXNvdXJjZShkZXYsIHJlcyk7Ci0KLQllcnIgPSAtRUlOVkFMOwotCWlmIChyb290ICE9IE5VTEwpCi0JCWVyciA9IHJlcXVlc3RfcmVzb3VyY2Uocm9vdCwgcmVzKTsKLQotCWlmIChlcnIpIHsKLQkJY29uc3QgY2hhciAqZHR5cGUgPSByZXNvdXJjZSA8IFBDSV9CUklER0VfUkVTT1VSQ0VTID8gImRldmljZSIgOiAiYnJpZGdlIjsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJCQVIgJWQ6ICVzIG9mICVzICVwUlxuIiwKLQkJCXJlc291cmNlLAotCQkJcm9vdCA/ICJhZGRyZXNzIHNwYWNlIGNvbGxpc2lvbiBvbiIgOgotCQkJCSJubyBwYXJlbnQgZm91bmQgZm9yIiwKLQkJCWR0eXBlLCByZXMpOworCWlmICghcm9vdCkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgIm5vIGNvbXBhdGlibGUgYnJpZGdlIHdpbmRvdyBmb3IgJXBSXG4iLAorCQkJcmVzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJZXJyID0gcmVxdWVzdF9yZXNvdXJjZShyb290LCByZXMpOworCWlmIChlcnIpCisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJImFkZHJlc3Mgc3BhY2UgY29sbGlzaW9uOiAlcFIgYWxyZWFkeSBpbiB1c2VcbiIsIHJlcyk7CisKIAlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTChwY2lfY2xhaW1fcmVzb3VyY2UpOwpAQCAtMTI0LDcgKzExNSw3IEBACiAjaWZkZWYgQ09ORklHX1BDSV9RVUlSS1MKIHZvaWQgcGNpX2Rpc2FibGVfYnJpZGdlX3dpbmRvdyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCWRldl9kYmcoJmRldi0+ZGV2LCAiRGlzYWJsaW5nIGJyaWRnZSB3aW5kb3cuXG4iKTsKKwlkZXZfaW5mbygmZGV2LT5kZXYsICJkaXNhYmxpbmcgYnJpZGdlIG1lbSB3aW5kb3dzXG4iKTsKIAogCS8qIE1NSU8gQmFzZS9MaW1pdCAqLwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfTUVNT1JZX0JBU0UsIDB4MDAwMGZmZjApOwpAQCAtMTY1LDYgKzE1Niw3IEBACiAKIAlpZiAoIXJldCkgewogCQlyZXMtPmZsYWdzICY9IH5JT1JFU09VUkNFX1NUQVJUQUxJR047CisJCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogYXNzaWduZWQgJXBSXG4iLCByZXNubywgcmVzKTsKIAkJaWYgKHJlc25vIDwgUENJX0JSSURHRV9SRVNPVVJDRVMpCiAJCQlwY2lfdXBkYXRlX3Jlc291cmNlKGRldiwgcmVzbm8pOwogCX0KQEAgLTE3OCwxMiArMTcwLDEyIEBACiAJcmVzb3VyY2Vfc2l6ZV90IGFsaWduOwogCXN0cnVjdCBwY2lfYnVzICpidXM7CiAJaW50IHJldDsKKwljaGFyICp0eXBlOwogCiAJYWxpZ24gPSBwY2lfcmVzb3VyY2VfYWxpZ25tZW50KGRldiwgcmVzKTsKIAlpZiAoIWFsaWduKSB7Ci0JCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgYWxsb2NhdGUgcmVzb3VyY2UgKGJvZ3VzICIKLQkJCSJhbGlnbm1lbnQpICVwUiBmbGFncyAlI2x4XG4iLAotCQkJcmVzbm8sIHJlcywgcmVzLT5mbGFncyk7CisJCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgYXNzaWduICVwUiAiCisJCQkgIihib2d1cyBhbGlnbm1lbnQpXG4iLCByZXNubywgcmVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xOTgsOSArMTkwLDIwIEBACiAJCWJyZWFrOwogCX0KIAotCWlmIChyZXQpCi0JCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgYWxsb2NhdGUgJXMgcmVzb3VyY2UgJXBSXG4iLAotCQkJcmVzbm8sIHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPID8gIkkvTyIgOiAibWVtIiwgcmVzKTsKKwlpZiAocmV0KSB7CisJCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpCisJCQkJdHlwZSA9ICJtZW0gcHJlZiI7CisJCQllbHNlCisJCQkJdHlwZSA9ICJtZW0iOworCQllbHNlIGlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJCXR5cGUgPSAiaW8iOworCQllbHNlCisJCQl0eXBlID0gInVua25vd24iOworCQlkZXZfaW5mbygmZGV2LT5kZXYsCisJCQkgIkJBUiAlZDogY2FuJ3QgYXNzaWduICVzIChzaXplICUjbGx4KVxuIiwKKwkJCSByZXNubywgdHlwZSwgKHVuc2lnbmVkIGxvbmcgbG9uZykgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjI1LDkgKzIyOCw4IEBACiAKIAkJcl9hbGlnbiA9IHBjaV9yZXNvdXJjZV9hbGlnbm1lbnQoZGV2LCByKTsKIAkJaWYgKCFyX2FsaWduKSB7Ci0JCQlkZXZfd2FybigmZGV2LT5kZXYsICJCQVIgJWQ6IGJvZ3VzIGFsaWdubWVudCAiCi0JCQkJIiVwUiBmbGFncyAlI2x4XG4iLAotCQkJCWksIHIsIHItPmZsYWdzKTsKKwkJCWRldl93YXJuKCZkZXYtPmRldiwgIkJBUiAlZDogJXBSIGhhcyBib2d1cyBhbGlnbm1lbnRcbiIsCisJCQkJIGksIHIpOwogCQkJY29udGludWU7CiAJCX0KIAkJZm9yIChsaXN0ID0gaGVhZDsgOyBsaXN0ID0gbGlzdC0+bmV4dCkgewpAQCAtMjc0LDggKzI3Niw4IEBACiAJCQljb250aW51ZTsKIAogCQlpZiAoIXItPnBhcmVudCkgewotCQkJZGV2X2VycigmZGV2LT5kZXYsICJkZXZpY2Ugbm90IGF2YWlsYWJsZSBiZWNhdXNlIG9mICIKLQkJCQkiQkFSICVkICVwUiBjb2xsaXNpb25zXG4iLCBpLCByKTsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiZGV2aWNlIG5vdCBhdmFpbGFibGUgIgorCQkJCSIoY2FuJ3QgcmVzZXJ2ZSAlcFIpXG4iLCByKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2NhcmRidXMuYyBiL2RyaXZlcnMvcGNtY2lhL2NhcmRidXMuYwppbmRleCA0Y2Q3MGQwLi5hNzNiMDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9jYXJkYnVzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvY2FyZGJ1cy5jCkBAIC0xODQsMjYgKzE4NCwzMyBAQAogICAgIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotLyoKLSAqIFNpbmNlIHRoZXJlIGlzIG9ubHkgb25lIGludGVycnVwdCBhdmFpbGFibGUgdG8gQ2FyZEJ1cwotICogZGV2aWNlcywgYWxsIGRldmljZXMgZG93bnN0cmVhbSBvZiB0aGlzIGRldmljZSBtdXN0Ci0gKiBiZSB1c2luZyB0aGlzIElSUS4KLSAqLwotc3RhdGljIHZvaWQgY2FyZGJ1c19hc3NpZ25faXJxcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBpbnQgaXJxKQorc3RhdGljIHZvaWQgY2FyZGJ1c19jb25maWdfaXJxX2FuZF9jbHMoc3RydWN0IHBjaV9idXMgKmJ1cywgaW50IGlycSkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CiAJCXU4IGlycV9waW47CiAKKwkJLyoKKwkJICogU2luY2UgdGhlcmUgaXMgb25seSBvbmUgaW50ZXJydXB0IGF2YWlsYWJsZSB0bworCQkgKiBDYXJkQnVzIGRldmljZXMsIGFsbCBkZXZpY2VzIGRvd25zdHJlYW0gb2YgdGhpcworCQkgKiBkZXZpY2UgbXVzdCBiZSB1c2luZyB0aGlzIElSUS4KKwkJICovCiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9QSU4sICZpcnFfcGluKTsKIAkJaWYgKGlycV9waW4pIHsKIAkJCWRldi0+aXJxID0gaXJxOwogCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7CiAJCX0KIAorCQkvKgorCQkgKiBTb21lIGNvbnRyb2xsZXJzIHRyYW5zZmVyIHZlcnkgc2xvd2x5IHdpdGggMCBDTFMuCisJCSAqIENvbmZpZ3VyZSBpdC4gIFRoaXMgbWF5IGZhaWwgYXMgQ0xTIGNvbmZpZ3VyYXRpb24KKwkJICogaXMgbWFuZGF0b3J5IG9ubHkgZm9yIE1XSS4KKwkJICovCisJCXBjaV9zZXRfY2FjaGVsaW5lX3NpemUoZGV2KTsKKwogCQlpZiAoZGV2LT5zdWJvcmRpbmF0ZSkKLQkJCWNhcmRidXNfYXNzaWduX2lycXMoZGV2LT5zdWJvcmRpbmF0ZSwgaXJxKTsKKwkJCWNhcmRidXNfY29uZmlnX2lycV9hbmRfY2xzKGRldi0+c3Vib3JkaW5hdGUsIGlycSk7CiAJfQogfQogCkBAIC0yMjgsNyArMjM1LDcgQEAKIAkgKi8KIAlwY2lfYnVzX3NpemVfYnJpZGdlcyhidXMpOwogCXBjaV9idXNfYXNzaWduX3Jlc291cmNlcyhidXMpOwotCWNhcmRidXNfYXNzaWduX2lycXMoYnVzLCBzLT5wY2lfaXJxKTsKKwljYXJkYnVzX2NvbmZpZ19pcnFfYW5kX2NscyhidXMsIHMtPnBjaV9pcnEpOwogCiAJLyogc29ja2V0IHNwZWNpZmljIHR1bmUgZnVuY3Rpb24gKi8KIAlpZiAocy0+dHVuZV9icmlkZ2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9xdWlya3MuYyBiL2RyaXZlcnMvcG5wL3F1aXJrcy5jCmluZGV4IDg0NzNmZTUuLmRmYmQ1YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3F1aXJrcy5jCisrKyBiL2RyaXZlcnMvcG5wL3F1aXJrcy5jCkBAIC0yODUsMTUgKzI4NSwxMCBAQAogCQkJCSAqIHRoZSBQQ0kgcmVnaW9uLCBhbmQgdGhhdCBtaWdodCBwcmV2ZW50IGEgUENJCiAJCQkJICogZHJpdmVyIGZyb20gcmVxdWVzdGluZyBpdHMgcmVzb3VyY2VzLgogCQkJCSAqLwotCQkJCWRldl93YXJuKCZkZXYtPmRldiwgIiVzIHJlc291cmNlICIKLQkJCQkJIigweCVsbHgtMHglbGx4KSBvdmVybGFwcyAlcyBCQVIgJWQgIgotCQkJCQkiKDB4JWxseC0weCVsbHgpLCBkaXNhYmxpbmdcbiIsCi0JCQkJCXBucF9yZXNvdXJjZV90eXBlX25hbWUocmVzKSwKLQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcG5wX3N0YXJ0LAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBwbnBfZW5kLAotCQkJCQlwY2lfbmFtZShwZGV2KSwgaSwKLQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcGNpX3N0YXJ0LAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBwY2lfZW5kKTsKKwkJCQlkZXZfd2FybigmZGV2LT5kZXYsCisJCQkJCSAiZGlzYWJsaW5nICVwUiBiZWNhdXNlIGl0IG92ZXJsYXBzICIKKwkJCQkJICIlcyBCQVIgJWQgJXBSXG4iLCByZXMsCisJCQkJCSBwY2lfbmFtZShwZGV2KSwgaSwgJnBkZXYtPnJlc291cmNlW2ldKTsKIAkJCQlyZXMtPmZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3Jlc291cmNlLmMgYi9kcml2ZXJzL3BucC9yZXNvdXJjZS5jCmluZGV4IGJhOTc2NTQuLjY0ZDA1OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3Jlc291cmNlLmMKKysrIGIvZHJpdmVycy9wbnAvcmVzb3VyY2UuYwpAQCAtNTE3LDcgKzUxNyw3IEBACiAJcmVzLT5zdGFydCA9IGlycTsKIAlyZXMtPmVuZCA9IGlycTsKIAotCXBucF9kYmcoJmRldi0+ZGV2LCAiICBhZGQgaXJxICVkIGZsYWdzICUjeFxuIiwgaXJxLCBmbGFncyk7CisJcG5wX2RiZygmZGV2LT5kZXYsICIgIGFkZCAlcHJcbiIsIHJlcyk7CiAJcmV0dXJuIHBucF9yZXM7CiB9CiAKQEAgLTUzOCw3ICs1MzgsNyBAQAogCXJlcy0+c3RhcnQgPSBkbWE7CiAJcmVzLT5lbmQgPSBkbWE7CiAKLQlwbnBfZGJnKCZkZXYtPmRldiwgIiAgYWRkIGRtYSAlZCBmbGFncyAlI3hcbiIsIGRtYSwgZmxhZ3MpOworCXBucF9kYmcoJmRldi0+ZGV2LCAiICBhZGQgJXByXG4iLCByZXMpOwogCXJldHVybiBwbnBfcmVzOwogfQogCkBAIC01NjIsOCArNTYyLDcgQEAKIAlyZXMtPnN0YXJ0ID0gc3RhcnQ7CiAJcmVzLT5lbmQgPSBlbmQ7CiAKLQlwbnBfZGJnKCZkZXYtPmRldiwgIiAgYWRkIGlvICAlI2xseC0lI2xseCBmbGFncyAlI3hcbiIsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXJ0LCAodW5zaWduZWQgbG9uZyBsb25nKSBlbmQsIGZsYWdzKTsKKwlwbnBfZGJnKCZkZXYtPmRldiwgIiAgYWRkICVwclxuIiwgcmVzKTsKIAlyZXR1cm4gcG5wX3JlczsKIH0KIApAQCAtNTg3LDggKzU4Niw3IEBACiAJcmVzLT5zdGFydCA9IHN0YXJ0OwogCXJlcy0+ZW5kID0gZW5kOwogCi0JcG5wX2RiZygmZGV2LT5kZXYsICIgIGFkZCBtZW0gJSNsbHgtJSNsbHggZmxhZ3MgJSN4XG4iLAotCQkodW5zaWduZWQgbG9uZyBsb25nKSBzdGFydCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgZW5kLCBmbGFncyk7CisJcG5wX2RiZygmZGV2LT5kZXYsICIgIGFkZCAlcHJcbiIsIHJlcyk7CiAJcmV0dXJuIHBucF9yZXM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3N1cHBvcnQuYyBiL2RyaXZlcnMvcG5wL3N1cHBvcnQuYwppbmRleCA2MzA4N2Q1Li45NTg1YzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9zdXBwb3J0LmMKKysrIGIvZHJpdmVycy9wbnAvc3VwcG9ydC5jCkBAIC03NSw0NyArNzUsMTQgQEAKIAogdm9pZCBkYmdfcG5wX3Nob3dfcmVzb3VyY2VzKHN0cnVjdCBwbnBfZGV2ICpkZXYsIGNoYXIgKmRlc2MpCiB7Ci0JY2hhciBidWZbMTI4XTsKLQlpbnQgbGVuOwogCXN0cnVjdCBwbnBfcmVzb3VyY2UgKnBucF9yZXM7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7CiAKLQlpZiAobGlzdF9lbXB0eSgmZGV2LT5yZXNvdXJjZXMpKSB7CisJaWYgKGxpc3RfZW1wdHkoJmRldi0+cmVzb3VyY2VzKSkKIAkJcG5wX2RiZygmZGV2LT5kZXYsICIlczogbm8gY3VycmVudCByZXNvdXJjZXNcbiIsIGRlc2MpOwotCQlyZXR1cm47Ci0JfQotCi0JcG5wX2RiZygmZGV2LT5kZXYsICIlczogY3VycmVudCByZXNvdXJjZXM6XG4iLCBkZXNjKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBucF9yZXMsICZkZXYtPnJlc291cmNlcywgbGlzdCkgewotCQlyZXMgPSAmcG5wX3Jlcy0+cmVzOwotCQlsZW4gPSAwOwotCi0JCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwgIiAgJS0zcyAiLAotCQkJCSBwbnBfcmVzb3VyY2VfdHlwZV9uYW1lKHJlcykpOwotCi0JCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9ESVNBQkxFRCkgewotCQkJcG5wX2RiZygmZGV2LT5kZXYsICIlc2Rpc2FibGVkXG4iLCBidWYpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlzd2l0Y2ggKHBucF9yZXNvdXJjZV90eXBlKHJlcykpIHsKLQkJY2FzZSBJT1JFU09VUkNFX0lPOgotCQljYXNlIElPUkVTT1VSQ0VfTUVNOgotCQkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAotCQkJCQkgIiUjbGx4LSUjbGx4IGZsYWdzICUjbHgiLAotCQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgcmVzLT5zdGFydCwKLQkJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIHJlcy0+ZW5kLAotCQkJCQkgcmVzLT5mbGFncyk7Ci0JCQlicmVhazsKLQkJY2FzZSBJT1JFU09VUkNFX0lSUToKLQkJY2FzZSBJT1JFU09VUkNFX0RNQToKLQkJCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwKLQkJCQkJICIlbGxkIGZsYWdzICUjbHgiLAotCQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgcmVzLT5zdGFydCwKLQkJCQkJIHJlcy0+ZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcG5wX2RiZygmZGV2LT5kZXYsICIlc1xuIiwgYnVmKTsKKwllbHNlIHsKKwkJcG5wX2RiZygmZGV2LT5kZXYsICIlczogY3VycmVudCByZXNvdXJjZXM6XG4iLCBkZXNjKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwbnBfcmVzLCAmZGV2LT5yZXNvdXJjZXMsIGxpc3QpCisJCQlwbnBfZGJnKCZkZXYtPmRldiwgIiVwclxuIiwgJnBucF9yZXMtPnJlcyk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9zeXN0ZW0uYyBiL2RyaXZlcnMvcG5wL3N5c3RlbS5jCmluZGV4IDU5YjkwOTIuLjQ5YzE3MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3N5c3RlbS5jCisrKyBiL2RyaXZlcnMvcG5wL3N5c3RlbS5jCkBAIC0yMiwxMSArMjIsMTEgQEAKIAl7IiIsIDB9CiB9OwogCi1zdGF0aWMgdm9pZCByZXNlcnZlX3JhbmdlKHN0cnVjdCBwbnBfZGV2ICpkZXYsIHJlc291cmNlX3NpemVfdCBzdGFydCwKLQkJCSAgcmVzb3VyY2Vfc2l6ZV90IGVuZCwgaW50IHBvcnQpCitzdGF0aWMgdm9pZCByZXNlcnZlX3JhbmdlKHN0cnVjdCBwbnBfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqciwgaW50IHBvcnQpCiB7CiAJY2hhciAqcmVnaW9uaWQ7CiAJY29uc3QgY2hhciAqcG5waWQgPSBkZXZfbmFtZSgmZGV2LT5kZXYpOworCXJlc291cmNlX3NpemVfdCBzdGFydCA9IHItPnN0YXJ0LCBlbmQgPSByLT5lbmQ7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAKIAlyZWdpb25pZCA9IGttYWxsb2MoMTYsIEdGUF9LRVJORUwpOwpAQCAtNDgsMTAgKzQ4LDggQEAKIAkgKiBleGFtcGxlIGRvIHJlc2VydmUgc3R1ZmYgdGhleSBrbm93IGFib3V0IHRvbywgc28gd2UgbWF5IHdlbGwKIAkgKiBoYXZlIGRvdWJsZSByZXNlcnZhdGlvbnMuCiAJICovCi0JZGV2X2luZm8oJmRldi0+ZGV2LCAiJXMgcmFuZ2UgMHglbGx4LTB4JWxseCAlcyByZXNlcnZlZFxuIiwKLQkJcG9ydCA/ICJpb3BvcnQiIDogImlvbWVtIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhcnQsICh1bnNpZ25lZCBsb25nIGxvbmcpIGVuZCwKLQkJcmVzID8gImhhcyBiZWVuIiA6ICJjb3VsZCBub3QgYmUiKTsKKwlkZXZfaW5mbygmZGV2LT5kZXYsICIlcFIgJXMgcmVzZXJ2ZWRcbiIsIHIsCisJCSByZXMgPyAiaGFzIGJlZW4iIDogImNvdWxkIG5vdCBiZSIpOwogfQogCiBzdGF0aWMgdm9pZCByZXNlcnZlX3Jlc291cmNlc19vZl9kZXYoc3RydWN0IHBucF9kZXYgKmRldikKQEAgLTc3LDE0ICs3NSwxNCBAQAogCQlpZiAocmVzLT5lbmQgPCByZXMtPnN0YXJ0KQogCQkJY29udGludWU7CS8qIGludmFsaWQgKi8KIAotCQlyZXNlcnZlX3JhbmdlKGRldiwgcmVzLT5zdGFydCwgcmVzLT5lbmQsIDEpOworCQlyZXNlcnZlX3JhbmdlKGRldiwgcmVzLCAxKTsKIAl9CiAKIAlmb3IgKGkgPSAwOyAocmVzID0gcG5wX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfTUVNLCBpKSk7IGkrKykgewogCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfRElTQUJMRUQpCiAJCQljb250aW51ZTsKIAotCQlyZXNlcnZlX3JhbmdlKGRldiwgcmVzLT5zdGFydCwgcmVzLT5lbmQsIDApOworCQlyZXNlcnZlX3JhbmdlKGRldiwgcmVzLCAwKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzgyNTAuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTAuYwppbmRleCA3MzdiNGM5Li5jM2UzN2M4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTAuYwpAQCAtMTMzOSwxNCArMTMzOSwxMiBAQAogCQlzZXJpYWxfb3V0KHVwLCBVQVJUX0lFUiwgdXAtPmllcik7CiAKIAkJaWYgKHVwLT5idWdzICYgVUFSVF9CVUdfVFhFTikgewotCQkJdW5zaWduZWQgY2hhciBsc3IsIGlpcjsKKwkJCXVuc2lnbmVkIGNoYXIgbHNyOwogCQkJbHNyID0gc2VyaWFsX2luKHVwLCBVQVJUX0xTUik7CiAJCQl1cC0+bHNyX3NhdmVkX2ZsYWdzIHw9IGxzciAmIExTUl9TQVZFX0ZMQUdTOwotCQkJaWlyID0gc2VyaWFsX2luKHVwLCBVQVJUX0lJUikgJiAweDBmOwogCQkJaWYgKCh1cC0+cG9ydC50eXBlID09IFBPUlRfUk05MDAwKSA/Ci0JCQkJKGxzciAmIFVBUlRfTFNSX1RIUkUgJiYKLQkJCQkoaWlyID09IFVBUlRfSUlSX05PX0lOVCB8fCBpaXIgPT0gVUFSVF9JSVJfVEhSSSkpIDoKLQkJCQkobHNyICYgVUFSVF9MU1JfVEVNVCAmJiBpaXIgJiBVQVJUX0lJUl9OT19JTlQpKQorCQkJCShsc3IgJiBVQVJUX0xTUl9USFJFKSA6CisJCQkJKGxzciAmIFVBUlRfTFNSX1RFTVQpKQogCQkJCXRyYW5zbWl0X2NoYXJzKHVwKTsKIAkJfQogCX0KQEAgLTI2NDYsNyArMjY0NCw3IEBACiB7CiAJc3RydWN0IHVhcnRfODI1MF9wb3J0ICp1cDsKIAlzdGF0aWMgaW50IGZpcnN0ID0gMTsKLQlpbnQgaTsKKwlpbnQgaSwgaXJxZmxhZyA9IDA7CiAKIAlpZiAoIWZpcnN0KQogCQlyZXR1cm47CkBAIC0yNjcwLDYgKzI2NjgsOSBAQAogCQl1cC0+cG9ydC5vcHMgPSAmc2VyaWFsODI1MF9wb3BzOwogCX0KIAorCWlmIChzaGFyZV9pcnFzKQorCQlpcnFmbGFnID0gSVJRRl9TSEFSRUQ7CisKIAlmb3IgKGkgPSAwLCB1cCA9IHNlcmlhbDgyNTBfcG9ydHM7CiAJICAgICBpIDwgQVJSQVlfU0laRShvbGRfc2VyaWFsX3BvcnQpICYmIGkgPCBucl91YXJ0czsKIAkgICAgIGkrKywgdXArKykgewpAQCAtMjY4Myw4ICsyNjg0LDcgQEAKIAkJdXAtPnBvcnQuaW90eXBlICAgPSBvbGRfc2VyaWFsX3BvcnRbaV0uaW9fdHlwZTsKIAkJdXAtPnBvcnQucmVnc2hpZnQgPSBvbGRfc2VyaWFsX3BvcnRbaV0uaW9tZW1fcmVnX3NoaWZ0OwogCQlzZXRfaW9fZnJvbV91cGlvKCZ1cC0+cG9ydCk7Ci0JCWlmIChzaGFyZV9pcnFzKQotCQkJdXAtPnBvcnQuaXJxZmxhZ3MgfD0gSVJRRl9TSEFSRUQ7CisJCXVwLT5wb3J0LmlycWZsYWdzIHw9IGlycWZsYWc7CiAJfQogfQogCkBAIC0yOTQwLDEwICsyOTQwLDEzIEBACiB7CiAJc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0ICpwID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgdWFydF9wb3J0IHBvcnQ7Ci0JaW50IHJldCwgaTsKKwlpbnQgcmV0LCBpLCBpcnFmbGFnID0gMDsKIAogCW1lbXNldCgmcG9ydCwgMCwgc2l6ZW9mKHN0cnVjdCB1YXJ0X3BvcnQpKTsKIAorCWlmIChzaGFyZV9pcnFzKQorCQlpcnFmbGFnID0gSVJRRl9TSEFSRUQ7CisKIAlmb3IgKGkgPSAwOyBwICYmIHAtPmZsYWdzICE9IDA7IHArKywgaSsrKSB7CiAJCXBvcnQuaW9iYXNlCQk9IHAtPmlvYmFzZTsKIAkJcG9ydC5tZW1iYXNlCQk9IHAtPm1lbWJhc2U7CkBAIC0yOTYwLDggKzI5NjMsNyBAQAogCQlwb3J0LnNlcmlhbF9pbgkJPSBwLT5zZXJpYWxfaW47CiAJCXBvcnQuc2VyaWFsX291dAkJPSBwLT5zZXJpYWxfb3V0OwogCQlwb3J0LmRldgkJPSAmZGV2LT5kZXY7Ci0JCWlmIChzaGFyZV9pcnFzKQotCQkJcG9ydC5pcnFmbGFncyB8PSBJUlFGX1NIQVJFRDsKKwkJcG9ydC5pcnFmbGFncwkJfD0gaXJxZmxhZzsKIAkJcmV0ID0gc2VyaWFsODI1MF9yZWdpc3Rlcl9wb3J0KCZwb3J0KTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoJmRldi0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIHBvcnQgYXQgaW5kZXggJWQgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvanNtL2pzbS5oIGIvZHJpdmVycy9zZXJpYWwvanNtL2pzbS5oCmluZGV4IDRlNWYzYmQuLjM4YTUwOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2pzbS9qc20uaAorKysgYi9kcml2ZXJzL3NlcmlhbC9qc20vanNtLmgKQEAgLTEzOCw3ICsxMzgsNiBAQAogCXUzMgkJbmFzeW5jOwkJLyogTnVtYmVyIG9mIHBvcnRzIG9uIGNhcmQgKi8KIAogCXUzMgkJaXJxOwkJLyogSW50ZXJydXB0IHJlcXVlc3QgbnVtYmVyICovCi0JdTY0CQlpbnRyX2NvdW50OwkvKiBDb3VudCBvZiBpbnRlcnJ1cHRzICovCiAKIAl1NjQJCW1lbWJhc2U7CS8qIFN0YXJ0IG9mIGJhc2UgbWVtb3J5IG9mIHRoZSBjYXJkICovCiAJdTY0CQltZW1iYXNlX2VuZDsJLyogRW5kIG9mIGJhc2UgbWVtb3J5IG9mIHRoZSBjYXJkICovCkBAIC0yMDYsOCArMjA1LDYgQEAKIAogCXU2NAkJY2hfY2xvc2VfZGVsYXk7CS8qIEhvdyBsb25nIHdlIHNob3VsZCBkcm9wIFJUUy9EVFIgZm9yICovCiAKLQl1NjQJCWNoX2Nwc3RpbWU7CS8qIFRpbWUgZm9yIENQUyBjYWxjdWxhdGlvbnMJKi8KLQogCXRjZmxhZ190CWNoX2NfaWZsYWc7CS8qIGNoYW5uZWwgaWZsYWdzCQkqLwogCXRjZmxhZ190CWNoX2NfY2ZsYWc7CS8qIGNoYW5uZWwgY2ZsYWdzCQkqLwogCXRjZmxhZ190CWNoX2Nfb2ZsYWc7CS8qIGNoYW5uZWwgb2ZsYWdzCQkqLwpAQCAtMjE1LDExICsyMTIsNiBAQAogCXU4CQljaF9zdG9wYzsJLyogU3RvcCBjaGFyYWN0ZXIJCSovCiAJdTgJCWNoX3N0YXJ0YzsJLyogU3RhcnQgY2hhcmFjdGVyCQkqLwogCi0JdTMyCQljaF9vbGRfYmF1ZDsJLyogQ2FjaGUgb2YgdGhlIGN1cnJlbnQgYmF1ZCAqLwotCXUzMgkJY2hfY3VzdG9tX3NwZWVkOy8qIEN1c3RvbSBiYXVkLCBpZiBzZXQgKi8KLQotCXUzMgkJY2hfd29wZW47CS8qIFdhaXRpbmcgZm9yIG9wZW4gcHJvY2VzcyBjbnQgKi8KLQogCXU4CQljaF9tb3N0YXQ7CS8qIEZFUCBvdXRwdXQgbW9kZW0gc3RhdHVzCSovCiAJdTgJCWNoX21pc3RhdDsJLyogRkVQIGlucHV0IG1vZGVtIHN0YXR1cwkqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9qc20vanNtX2RyaXZlci5jIGIvZHJpdmVycy9zZXJpYWwvanNtL2pzbV9kcml2ZXIuYwppbmRleCBiMzYwNGFhLi4xMDhjM2UwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9qc20vanNtX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2pzbS9qc21fZHJpdmVyLmMKQEAgLTQ4LDYgKzQ4LDE3IEBACiAJLm5yCQk9IE5SX1BPUlRTLAogfTsKIAorc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QganNtX2lvX2Vycm9yX2RldGVjdGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX2NoYW5uZWxfc3RhdGVfdCBzdGF0ZSk7CitzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCBqc21faW9fc2xvdF9yZXNldChzdHJ1Y3QgcGNpX2RldiAqcGRldik7CitzdGF0aWMgdm9pZCBqc21faW9fcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKworc3RhdGljIHN0cnVjdCBwY2lfZXJyb3JfaGFuZGxlcnMganNtX2Vycl9oYW5kbGVyID0geworCS5lcnJvcl9kZXRlY3RlZCA9IGpzbV9pb19lcnJvcl9kZXRlY3RlZCwKKwkuc2xvdF9yZXNldCA9IGpzbV9pb19zbG90X3Jlc2V0LAorCS5yZXN1bWUgPSBqc21faW9fcmVzdW1lLAorfTsKKwogaW50IGpzbV9kZWJ1ZzsKIG1vZHVsZV9wYXJhbShqc21fZGVidWcsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGpzbV9kZWJ1ZywgIkRyaXZlciBkZWJ1Z2dpbmcgbGV2ZWwiKTsKQEAgLTEyMyw3ICsxMzQsNyBAQAogCX0KIAogCXJjID0gcmVxdWVzdF9pcnEoYnJkLT5pcnEsIGJyZC0+YmRfb3BzLT5pbnRyLAotCQkJSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwgIkpTTSIsIGJyZCk7CisJCQlJUlFGX1NIQVJFRCwgIkpTTSIsIGJyZCk7CiAJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhaWxlZCB0byBob29rIElSUSAlZFxuIixicmQtPmlycSk7CiAJCWdvdG8gb3V0X2lvdW5tYXA7CkBAIC0xNjQsNiArMTc1LDcgQEAKIAl9CiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgYnJkKTsKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKIAogCXJldHVybiAwOwogIG91dF9mcmVlX2lycToKQEAgLTIyMiw4ICsyMzQsNDIgQEAKIAkuaWRfdGFibGUJPSBqc21fcGNpX3RibCwKIAkucHJvYmUJCT0ganNtX3Byb2JlX29uZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGpzbV9yZW1vdmVfb25lKSwKKwkuZXJyX2hhbmRsZXIgICAgPSAmanNtX2Vycl9oYW5kbGVyLAogfTsKIAorc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QganNtX2lvX2Vycm9yX2RldGVjdGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQlwY2lfY2hhbm5lbF9zdGF0ZV90IHN0YXRlKQoreworCXN0cnVjdCBqc21fYm9hcmQgKmJyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWpzbV9yZW1vdmVfdWFydF9wb3J0KGJyZCk7CisKKwlyZXR1cm4gUENJX0VSU19SRVNVTFRfTkVFRF9SRVNFVDsKK30KKworc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QganNtX2lvX3Nsb3RfcmVzZXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IHJjOworCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKworCWlmIChyYykKKwkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9SRUNPVkVSRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGpzbV9pb19yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGpzbV9ib2FyZCAqYnJkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisKKwlqc21fdWFydF9wb3J0X2luaXQoYnJkKTsKK30KKwogc3RhdGljIGludCBfX2luaXQganNtX2luaXRfbW9kdWxlKHZvaWQpCiB7CiAJaW50IHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvanNtL2pzbV9uZW8uYyBiL2RyaXZlcnMvc2VyaWFsL2pzbS9qc21fbmVvLmMKaW5kZXggYjRiMTI0ZS4uNzk2MGQ5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvanNtL2pzbV9uZW8uYworKysgYi9kcml2ZXJzL3NlcmlhbC9qc20vanNtX25lby5jCkBAIC05NTQsMTMgKzk1NCw4IEBACiAJCWNoLT5jaF9mbGFncyB8PSAoQ0hfQkFVRDApOwogCQljaC0+Y2hfbW9zdGF0ICY9IH4oVUFSVF9NQ1JfUlRTIHwgVUFSVF9NQ1JfRFRSKTsKIAkJbmVvX2Fzc2VydF9tb2RlbV9zaWduYWxzKGNoKTsKLQkJY2gtPmNoX29sZF9iYXVkID0gMDsKIAkJcmV0dXJuOwogCi0JfSBlbHNlIGlmIChjaC0+Y2hfY3VzdG9tX3NwZWVkKSB7Ci0JCQliYXVkID0gY2gtPmNoX2N1c3RvbV9zcGVlZDsKLQkJCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9CQVVEMCkKLQkJCQljaC0+Y2hfZmxhZ3MgJj0gfihDSF9CQVVEMCk7CiAJfSBlbHNlIHsKIAkJaW50IGk7CiAJCXVuc2lnbmVkIGludCBjZmxhZzsKQEAgLTEwNDUsNyArMTA0MCw2IEBACiAJcXVvdCA9IGNoLT5jaF9iZC0+YmRfZGl2aWRlbmQgLyBiYXVkOwogCiAJaWYgKHF1b3QgIT0gMCkgewotCQljaC0+Y2hfb2xkX2JhdWQgPSBiYXVkOwogCQl3cml0ZWIoVUFSVF9MQ1JfRExBQiwgJmNoLT5jaF9uZW9fdWFydC0+bGNyKTsKIAkJd3JpdGViKChxdW90ICYgMHhmZiksICZjaC0+Y2hfbmVvX3VhcnQtPnR4cngpOwogCQl3cml0ZWIoKHF1b3QgPj4gOCksICZjaC0+Y2hfbmVvX3VhcnQtPmllcik7CkBAIC0xMTIzLDggKzExMTcsNiBAQAogCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczI7CiAJaW50IG91dG9mbG9vcF9jb3VudCA9IDA7CiAKLQlicmQtPmludHJfY291bnQrKzsKLQogCS8qIExvY2sgb3V0IHRoZSBzbG93IHBvbGxlciBmcm9tIHJ1bm5pbmcgb24gdGhpcyBib2FyZC4gKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnJkLT5iZF9pbnRyX2xvY2ssIGxvY2tfZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9qc20vanNtX3R0eS5jIGIvZHJpdmVycy9zZXJpYWwvanNtL2pzbV90dHkuYwppbmRleCA3NDM5YzAzLi5jZDk1ZTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9qc20vanNtX3R0eS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2pzbS9qc21fdHR5LmMKQEAgLTI5Niw4ICsyOTYsNiBAQAogCQliZC0+YmRfb3BzLT5hc3NlcnRfbW9kZW1fc2lnbmFscyhjaGFubmVsKTsKIAl9CiAKLQljaGFubmVsLT5jaF9vbGRfYmF1ZCA9IDA7Ci0KIAkvKiBUdXJuIG9mZiBVQVJUIGludGVycnVwdHMgZm9yIHRoaXMgcG9ydCAqLwogCWNoYW5uZWwtPmNoX2JkLT5iZF9vcHMtPnVhcnRfb2ZmKGNoYW5uZWwpOwogCkBAIC00MzIsNyArNDMwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IF9fZGV2aW5pdCBqc21fdWFydF9wb3J0X2luaXQoc3RydWN0IGpzbV9ib2FyZCAqYnJkKQoraW50IGpzbV91YXJ0X3BvcnRfaW5pdChzdHJ1Y3QganNtX2JvYXJkICpicmQpCiB7CiAJaW50IGk7CiAJdW5zaWduZWQgaW50IGxpbmU7CkBAIC00NzIsNyArNDcwLDcgQEAKIAkJaWYgKHVhcnRfYWRkX29uZV9wb3J0ICgmanNtX3VhcnRfZHJpdmVyLCAmYnJkLT5jaGFubmVsc1tpXS0+dWFydF9wb3J0KSkKIAkJCXByaW50ayhLRVJOX0lORk8gImpzbTogYWRkIGRldmljZSBmYWlsZWRcbiIpOwogCQllbHNlCi0JCQlwcmludGsoS0VSTl9JTkZPICJBZGRlZCBkZXZpY2UgXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gImpzbTogUG9ydCAlZCBhZGRlZFxuIiwgaSk7CiAJfQogCiAJanNtX3ByaW50ayhJTklULCBJTkZPLCAmYnJkLT5wY2lfZGV2LCAiZmluaXNoXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3B4YS5jIGIvZHJpdmVycy9zZXJpYWwvcHhhLmMKaW5kZXggYjg2MjlkNy4uNGE4MjEwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvcHhhLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvcHhhLmMKQEAgLTQzOCw2ICs0MzgsNyBAQAogCXVuc2lnbmVkIGNoYXIgY3ZhbCwgZmNyID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBiYXVkLCBxdW90OworCXVuc2lnbmVkIGludCBkbGw7CiAKIAlzd2l0Y2ggKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkgewogCWNhc2UgQ1M1OgpAQCAtNTM0LDEwICs1MzUsMTggQEAKIAllbHNlCiAJCXVwLT5tY3IgJj0gflVBUlRfTUNSX0FGRTsKIAotCXNlcmlhbF9vdXQodXAsIFVBUlRfTENSLCBjdmFsIHwgVUFSVF9MQ1JfRExBQik7Lyogc2V0IERMQUIgKi8KKwlzZXJpYWxfb3V0KHVwLCBVQVJUX0xDUiwgY3ZhbCB8IFVBUlRfTENSX0RMQUIpOwkvKiBzZXQgRExBQiAqLwogCXNlcmlhbF9vdXQodXAsIFVBUlRfRExMLCBxdW90ICYgMHhmZik7CQkvKiBMUyBvZiBkaXZpc29yICovCisKKwkvKgorCSAqIHdvcmsgYXJvdW5kIEVycmF0YSAjNzUgYWNjb3JkaW5nIHRvIEludGVsKFIpIFBYQTI3eCBQcm9jZXNzb3IgRmFtaWx5CisJICogU3BlY2lmaWNhdGlvbiBVcGRhdGUgKE5vdiAyMDA1KQorCSAqLworCWRsbCA9IHNlcmlhbF9pbih1cCwgVUFSVF9ETEwpOworCVdBUk5fT04oZGxsICE9IChxdW90ICYgMHhmZikpOworCiAJc2VyaWFsX291dCh1cCwgVUFSVF9ETE0sIHF1b3QgPj4gOCk7CQkvKiBNUyBvZiBkaXZpc29yICovCi0Jc2VyaWFsX291dCh1cCwgVUFSVF9MQ1IsIGN2YWwpOwkJLyogcmVzZXQgRExBQiAqLworCXNlcmlhbF9vdXQodXAsIFVBUlRfTENSLCBjdmFsKTsJCQkvKiByZXNldCBETEFCICovCiAJdXAtPmxjciA9IGN2YWw7CQkJCQkvKiBTYXZlIExDUiAqLwogCXNlcmlhbF9weGFfc2V0X21jdHJsKCZ1cC0+cG9ydCwgdXAtPnBvcnQubWN0cmwpOwogCXNlcmlhbF9vdXQodXAsIFVBUlRfRkNSLCBmY3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKaW5kZXggZGNjNzI0NC4uMDQ3NTMwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCkBAIC0zNDIsMTEgKzM0MiwxMSBAQAogCiAJaWYgKGZsYWdzID09IFVQRl9TUERfSEkpCiAJCWFsdGJhdWQgPSA1NzYwMDsKLQlpZiAoZmxhZ3MgPT0gVVBGX1NQRF9WSEkpCisJZWxzZSBpZiAoZmxhZ3MgPT0gVVBGX1NQRF9WSEkpCiAJCWFsdGJhdWQgPSAxMTUyMDA7Ci0JaWYgKGZsYWdzID09IFVQRl9TUERfU0hJKQorCWVsc2UgaWYgKGZsYWdzID09IFVQRl9TUERfU0hJKQogCQlhbHRiYXVkID0gMjMwNDAwOwotCWlmIChmbGFncyA9PSBVUEZfU1BEX1dBUlApCisJZWxzZSBpZiAoZmxhZ3MgPT0gVVBGX1NQRF9XQVJQKQogCQlhbHRiYXVkID0gNDYwODAwOwogCiAJZm9yICh0cnkgPSAwOyB0cnkgPCAyOyB0cnkrKykgewpAQCAtMTIxNyw5ICsxMjE3LDggQEAKIAkvKiBIYW5kbGUgdHJhbnNpdGlvbiB0byBCMCBzdGF0dXMgKi8KIAlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpICYmICEoY2ZsYWcgJiBDQkFVRCkpCiAJCXVhcnRfY2xlYXJfbWN0cmwoc3RhdGUtPnVhcnRfcG9ydCwgVElPQ01fUlRTIHwgVElPQ01fRFRSKTsKLQogCS8qIEhhbmRsZSB0cmFuc2l0aW9uIGF3YXkgZnJvbSBCMCBzdGF0dXMgKi8KLQlpZiAoIShvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAmJiAoY2ZsYWcgJiBDQkFVRCkpIHsKKwllbHNlIGlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpICYmIChjZmxhZyAmIENCQVVEKSkgewogCQl1bnNpZ25lZCBpbnQgbWFzayA9IFRJT0NNX0RUUjsKIAkJaWYgKCEoY2ZsYWcgJiBDUlRTQ1RTKSB8fAogCQkgICAgIXRlc3RfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKSkKQEAgLTEyMzQsOSArMTIzMyw4IEBACiAJCV9fdWFydF9zdGFydCh0dHkpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dWFydF9wb3J0LT5sb2NrLCBmbGFncyk7CiAJfQotCiAJLyogSGFuZGxlIHR1cm5pbmcgb24gQ1JUU0NUUyAqLwotCWlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYgKGNmbGFnICYgQ1JUU0NUUykpIHsKKwllbHNlIGlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYgKGNmbGFnICYgQ1JUU0NUUykpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT51YXJ0X3BvcnQtPmxvY2ssIGZsYWdzKTsKIAkJaWYgKCEoc3RhdGUtPnVhcnRfcG9ydC0+b3BzLT5nZXRfbWN0cmwoc3RhdGUtPnVhcnRfcG9ydCkgJiBUSU9DTV9DVFMpKSB7CiAJCQl0dHktPmh3X3N0b3BwZWQgPSAxOwpAQCAtMjM0NCw3ICsyMzQyLDcgQEAKICAqLwogaW50IHVhcnRfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2KQogewotCXN0cnVjdCB0dHlfZHJpdmVyICpub3JtYWwgPSBOVUxMOworCXN0cnVjdCB0dHlfZHJpdmVyICpub3JtYWw7CiAJaW50IGksIHJldHZhbDsKIAogCUJVR19PTihkcnYtPnN0YXRlKTsKQEAgLTIzNTQsMTMgKzIzNTIsMTIgQEAKIAkgKiB3ZSBoYXZlIGEgbGFyZ2UgbnVtYmVyIG9mIHBvcnRzIHRvIGhhbmRsZS4KIAkgKi8KIAlkcnYtPnN0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVhcnRfc3RhdGUpICogZHJ2LT5uciwgR0ZQX0tFUk5FTCk7Ci0JcmV0dmFsID0gLUVOT01FTTsKIAlpZiAoIWRydi0+c3RhdGUpCiAJCWdvdG8gb3V0OwogCi0Jbm9ybWFsICA9IGFsbG9jX3R0eV9kcml2ZXIoZHJ2LT5ucik7CisJbm9ybWFsID0gYWxsb2NfdHR5X2RyaXZlcihkcnYtPm5yKTsKIAlpZiAoIW5vcm1hbCkKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X2tmcmVlOwogCiAJZHJ2LT50dHlfZHJpdmVyID0gbm9ybWFsOwogCkBAIC0yMzkzLDEyICsyMzkwLDE0IEBACiAJfQogCiAJcmV0dmFsID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihub3JtYWwpOwotIG91dDoKLQlpZiAocmV0dmFsIDwgMCkgewotCQlwdXRfdHR5X2RyaXZlcihub3JtYWwpOwotCQlrZnJlZShkcnYtPnN0YXRlKTsKLQl9Ci0JcmV0dXJuIHJldHZhbDsKKwlpZiAocmV0dmFsID49IDApCisJCXJldHVybiByZXR2YWw7CisKKwlwdXRfdHR5X2RyaXZlcihub3JtYWwpOworb3V0X2tmcmVlOgorCWtmcmVlKGRydi0+c3RhdGUpOworb3V0OgorCXJldHVybiAtRU5PTUVNOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3VjY191YXJ0LmMgYi9kcml2ZXJzL3NlcmlhbC91Y2NfdWFydC5jCmluZGV4IDQ2ZGU1NjQuLjQ2NWYyZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3VjY191YXJ0LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvdWNjX3VhcnQuYwpAQCAtMTE3OSwxNiArMTE3OSwxOCBAQAogCiAJaWYgKGZpcm13YXJlLT5oZWFkZXIubGVuZ3RoICE9IGZ3LT5zaXplKSB7CiAJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBmaXJtd2FyZVxuIik7Ci0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAJfQogCiAJcmV0ID0gcWVfdXBsb2FkX2Zpcm13YXJlKGZpcm13YXJlKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZGV2LCAiY291bGQgbm90IGxvYWQgZmlybXdhcmVcbiIpOwotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCX0KIAogCWZpcm13YXJlX2xvYWRlZCA9IDE7Cisgb3V0OgorCXJlbGVhc2VfZmlybXdhcmUoZncpOwogfQogCiBzdGF0aWMgaW50IHVjY191YXJ0X3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LApAQCAtMTI0Nyw3ICsxMjQ5LDcgQEAKIAkJCSAqLwogCQkJcmV0ID0gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsCiAJCQkJRldfQUNUSU9OX0hPVFBMVUcsIGZpbGVuYW1lLCAmb2ZkZXYtPmRldiwKLQkJCQkmb2ZkZXYtPmRldiwgdWFydF9maXJtd2FyZV9jb250KTsKKwkJCQlHRlBfS0VSTkVMLCAmb2ZkZXYtPmRldiwgdWFydF9maXJtd2FyZV9jb250KTsKIAkJCWlmIChyZXQpIHsKIAkJCQlkZXZfZXJyKCZvZmRldi0+ZGV2LAogCQkJCQkiY291bGQgbm90IGxvYWQgZmlybXdhcmUgJXNcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCmluZGV4IGRmY2Q3NWMuLjU0ZTE3NGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwpAQCAtNjUsOCArNjUsNiBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9ydDI4NzAvS2NvbmZpZyIKIAotc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcnQzMDkwL0tjb25maWciCi0KIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvS2NvbmZpZyIKQEAgLTc5LDE0ICs3NywxNCBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWltaW8vS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvS2NvbmZpZyIKIAotc291cmNlICJkcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9LY29uZmlnIgotCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9kcmVhbS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9kc3QvS2NvbmZpZyIKQEAgLTEwMyw2ICsxMDEsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvZ3B1L2RybS9yYWRlb24vS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9vY3Rlb24vS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvc2VycXRfdXNiMi9LY29uZmlnIgpAQCAtMTI1LDYgKzEyNSwxNiBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3NhbXN1bmctbGFwdG9wL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3N0cmlwL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2FybGFuL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKaW5kZXggNzcxOWQwNC4uMDY5ODY0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQpAQCAtMTUsMTggKzE1LDE3IEBACiBvYmotJChDT05GSUdfT1RVUykJCSs9IG90dXMvCiBvYmotJChDT05GSUdfUlQyODYwKQkJKz0gcnQyODYwLwogb2JqLSQoQ09ORklHX1JUMjg3MCkJCSs9IHJ0Mjg3MC8KLW9iai0kKENPTkZJR19SVDMwOTApCQkrPSBydDMwOTAvCiBvYmotJChDT05GSUdfQ09NRURJKQkJKz0gY29tZWRpLwogb2JqLSQoQ09ORklHX0FTVVNfT0xFRCkJCSs9IGFzdXNfb2xlZC8KIG9iai0kKENPTkZJR19QQU5FTCkJCSs9IHBhbmVsLwogb2JqLSQoQ09ORklHX0FMVEVSQV9QQ0lFX0NIRE1BKQkrPSBhbHRwY2llY2hkbWEvCi1vYmotJChDT05GSUdfUlRMODE4N1NFKQkJKz0gcnRsODE4N3NlLworb2JqLSQoQ09ORklHX1I4MTg3U0UpCQkrPSBydGw4MTg3c2UvCiBvYmotJChDT05GSUdfUlRMODE5MlNVKQkJKz0gcnRsODE5MnN1Lworb2JqLSQoQ09ORklHX1JUTDgxOTJVKQkJKz0gcnRsODE5MnUvCiBvYmotJChDT05GSUdfUlRMODE5MkUpCQkrPSBydGw4MTkyZS8KIG9iai0kKENPTkZJR19JTlBVVF9NSU1JTykJKz0gbWltaW8vCiBvYmotJChDT05GSUdfVFJBTlpQT1JUKQkJKz0gZnJvbnRpZXIvCi1vYmotJChDT05GSUdfQU5EUk9JRCkJCSs9IGFuZHJvaWQvCi1vYmotJChDT05GSUdfQU5EUk9JRCkJCSs9IGRyZWFtLworb2JqLSQoQ09ORklHX0RSRUFNKQkJKz0gZHJlYW0vCiBvYmotJChDT05GSUdfRFNUKQkJKz0gZHN0Lwogb2JqLSQoQ09ORklHX1BPSE1FTEZTKQkJKz0gcG9obWVsZnMvCiBvYmotJChDT05GSUdfQjNERkcpCQkrPSBiM2RmZy8KQEAgLTQ0LDYgKzQzLDExIEBACiBvYmotJChDT05GSUdfUkFSX1JFR0lTVEVSKQkrPSByYXIvCiBvYmotJChDT05GSUdfRFhfU0VQKQkJKz0gc2VwLwogb2JqLSQoQ09ORklHX0lJTykJCSs9IGlpby8KK29iai0kKENPTkZJR19SQU1aU1dBUCkJCSs9IHJhbXpzd2FwLworb2JqLSQoQ09ORklHX1dMQUdTNDlfSDIpCSs9IHdsYWdzNDlfaDIvCitvYmotJChDT05GSUdfV0xBR1M0OV9IMjUpCSs9IHdsYWdzNDlfaDI1Lworb2JqLSQoQ09ORklHX0JBVE1BTl9BRFYpCSs9IGJhdG1hbi1hZHYvCitvYmotJChDT05GSUdfU0FNU1VOR19MQVBUT1ApCSs9IHNhbXN1bmctbGFwdG9wLwogb2JqLSQoQ09ORklHX1NUUklQKQkJKz0gc3RyaXAvCiBvYmotJChDT05GSUdfQVJMQU4pCQkrPSBhcmxhbi8KIG9iai0kKENPTkZJR19XQVZFTEFOKQkJKz0gd2F2ZWxhbi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvYWx0cGNpZWNoZG1hLmMgYi9kcml2ZXJzL3N0YWdpbmcvYWx0cGNpZWNoZG1hL2FsdHBjaWVjaGRtYS5jCmluZGV4IGUwYzViYTQuLjJmMDdkZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvYWx0cGNpZWNoZG1hLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9hbHRwY2llY2hkbWEuYwpAQCAtMjEyLDcgKzIxMiw3IEBACiAJaW50IG1zaV9lbmFibGVkOwogCS8qIHdoZXRoZXIgdGhpcyBkcml2ZXIgY291bGQgb2J0YWluIHRoZSByZWdpb25zICovCiAJaW50IGdvdF9yZWdpb25zOwotCS8qIGlycSBsaW5lIHN1Y2Nlc2Z1bGx5IHJlcXVlc3RlZCBieSB0aGlzIGRyaXZlciwgLTEgb3RoZXJ3aXNlICovCisJLyogaXJxIGxpbmUgc3VjY2Vzc2Z1bGx5IHJlcXVlc3RlZCBieSB0aGlzIGRyaXZlciwgLTEgb3RoZXJ3aXNlICovCiAJaW50IGlycV9saW5lOwogCS8qIGJvYXJkIHJldmlzaW9uICovCiAJdTggcmV2aXNpb247CkBAIC0zMzYsNyArMzM2LDcgQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcgIkJBUlslZF0gbWFwcGVkIGF0IDB4JXAgd2l0aCBsZW5ndGggJWx1KC8lbHUpLlxuIiwgaSwKIAkJYXBlLT5iYXJbaV0sIGJhcl9taW5fbGVuW2ldLCBiYXJfbGVuZ3RoKTsKIAl9Ci0JLyogc3VjY2VzZnVsbHkgbWFwcGVkIGFsbCByZXF1aXJlZCBCQVIgcmVnaW9ucyAqLworCS8qIHN1Y2Nlc3NmdWxseSBtYXBwZWQgYWxsIHJlcXVpcmVkIEJBUiByZWdpb25zICovCiAJcmMgPSAwOwogCWdvdG8gc3VjY2VzczsKIGZhaWw6CkBAIC05MTEsNyArOTExLDcgQEAKIAkvKiBwZXJmb3JtIERNQSBlbmdpbmVzIGxvb3AgYmFjayB0ZXN0ICovCiAJcmMgPSBkbWFfdGVzdChhcGUsIGRldik7CiAJKHZvaWQpcmM7Ci0JLyogc3VjY2VzZnVsbHkgdG9vayB0aGUgZGV2aWNlICovCisJLyogc3VjY2Vzc2Z1bGx5IHRvb2sgdGhlIGRldmljZSAqLwogCXJjID0gMDsKIAlwcmludGsoS0VSTl9ERUJVRyAicHJvYmUoKSBzdWNjZXNzZnVsLlxuIik7CiAJZ290byBlbmQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI2NzU2My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotbWVudSAiQW5kcm9pZCIKLQotY29uZmlnIEFORFJPSUQKLQlib29sICJBbmRyb2lkIERyaXZlcnMiCi0JZGVwZW5kcyBvbiBCUk9LRU4KLQlkZWZhdWx0IE4KLQktLS1oZWxwLS0tCi0JICBFbmFibGUgc3VwcG9ydCBmb3IgdmFyaW91cyBkcml2ZXJzIG5lZWRlZCBvbiB0aGUgQW5kcm9pZCBwbGF0Zm9ybQotCi1pZiBBTkRST0lECi0KLWNvbmZpZyBBTkRST0lEX0JJTkRFUl9JUEMKLQlib29sICJBbmRyb2lkIEJpbmRlciBJUEMgRHJpdmVyIgotCWRlZmF1bHQgbgotCi1jb25maWcgQU5EUk9JRF9MT0dHRVIKLQl0cmlzdGF0ZSAiQW5kcm9pZCBsb2cgZHJpdmVyIgotCWRlZmF1bHQgbgotCi1jb25maWcgQU5EUk9JRF9SQU1fQ09OU09MRQotCWJvb2wgIkFuZHJvaWQgUkFNIGJ1ZmZlciBjb25zb2xlIgotCWRlZmF1bHQgbgotCi1jb25maWcgQU5EUk9JRF9SQU1fQ09OU09MRV9FTkFCTEVfVkVSQk9TRQotCWJvb2wgIkVuYWJsZSB2ZXJib3NlIGNvbnNvbGUgbWVzc2FnZXMgb24gQW5kcm9pZCBSQU0gY29uc29sZSIKLQlkZWZhdWx0IHkKLQlkZXBlbmRzIG9uIEFORFJPSURfUkFNX0NPTlNPTEUKLQotbWVudWNvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KLQlib29sICJBbmRyb2lkIFJBTSBDb25zb2xlIEVuYWJsZSBlcnJvciBjb3JyZWN0aW9uIgotCWRlZmF1bHQgbgotCWRlcGVuZHMgb24gQU5EUk9JRF9SQU1fQ09OU09MRQotCWRlcGVuZHMgb24gIUFORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAotCXNlbGVjdCBSRUVEX1NPTE9NT04KLQlzZWxlY3QgUkVFRF9TT0xPTU9OX0VOQzgKLQlzZWxlY3QgUkVFRF9TT0xPTU9OX0RFQzgKLQotaWYgQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCi0KLWNvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fREFUQV9TSVpFCi0JaW50ICJBbmRyb2lkIFJBTSBDb25zb2xlIERhdGEgZGF0YSBzaXplIgotCWRlZmF1bHQgMTI4Ci0JaGVscAotCSAgTXVzdCBiZSBhIHBvd2VyIG9mIDIuCi0KLWNvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fRUNDX1NJWkUKLQlpbnQgIkFuZHJvaWQgUkFNIENvbnNvbGUgRUNDIHNpemUiCi0JZGVmYXVsdCAxNgotCi1jb25maWcgQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFCi0JaW50ICJBbmRyb2lkIFJBTSBDb25zb2xlIFN5bWJvbCBzaXplIgotCWRlZmF1bHQgOAotCi1jb25maWcgQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1BPTFlOT01JQUwKLQloZXggIkFuZHJvaWQgUkFNIENvbnNvbGUgUG9seW5vbWlhbCIKLQlkZWZhdWx0IDB4MTkgaWYgKEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9TWU1CT0xfU0laRSA9IDQpCi0JZGVmYXVsdCAweDI5IGlmIChBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fU1lNQk9MX1NJWkUgPSA1KQotCWRlZmF1bHQgMHg2MSBpZiAoQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFID0gNikKLQlkZWZhdWx0IDB4ODkgaWYgKEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9TWU1CT0xfU0laRSA9IDcpCi0JZGVmYXVsdCAweDExZCBpZiAoQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFID0gOCkKLQotZW5kaWYgIyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KLQotY29uZmlnIEFORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAotCWJvb2wgIlN0YXJ0IEFuZHJvaWQgUkFNIGNvbnNvbGUgZWFybHkiCi0JZGVmYXVsdCBuCi0JZGVwZW5kcyBvbiBBTkRST0lEX1JBTV9DT05TT0xFCi0KLWNvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0FERFIKLQloZXggIkFuZHJvaWQgUkFNIGNvbnNvbGUgdmlydHVhbCBhZGRyZXNzIgotCWRlZmF1bHQgMAotCWRlcGVuZHMgb24gQU5EUk9JRF9SQU1fQ09OU09MRV9FQVJMWV9JTklUCi0KLWNvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX1NJWkUKLQloZXggIkFuZHJvaWQgUkFNIGNvbnNvbGUgYnVmZmVyIHNpemUiCi0JZGVmYXVsdCAwCi0JZGVwZW5kcyBvbiBBTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0lOSVQKLQotY29uZmlnIEFORFJPSURfVElNRURfT1VUUFVUCi0JYm9vbCAiVGltZWQgb3V0cHV0IGNsYXNzIGRyaXZlciIKLQlkZWZhdWx0IHkKLQotY29uZmlnIEFORFJPSURfVElNRURfR1BJTwotCXRyaXN0YXRlICJBbmRyb2lkIHRpbWVkIGdwaW8gZHJpdmVyIgotCWRlcGVuZHMgb24gR0VORVJJQ19HUElPICYmIEFORFJPSURfVElNRURfT1VUUFVUCi0JZGVmYXVsdCBuCi0KLWNvbmZpZyBBTkRST0lEX0xPV19NRU1PUllfS0lMTEVSCi0JYm9vbCAiQW5kcm9pZCBMb3cgTWVtb3J5IEtpbGxlciIKLQlkZWZhdWx0IE4KLQktLS1oZWxwLS0tCi0JICBSZWdpc3RlciBwcm9jZXNzZXMgdG8gYmUga2lsbGVkIHdoZW4gbWVtb3J5IGlzIGxvdwotCi1lbmRpZiAjIGlmIEFORFJPSUQKLQotZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwNTdlNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotb2JqLSQoQ09ORklHX0FORFJPSURfQklOREVSX0lQQykJKz0gYmluZGVyLm8KLW9iai0kKENPTkZJR19BTkRST0lEX0xPR0dFUikJCSs9IGxvZ2dlci5vCi1vYmotJChDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRSkJKz0gcmFtX2NvbnNvbGUubwotb2JqLSQoQ09ORklHX0FORFJPSURfVElNRURfT1VUUFVUKQkrPSB0aW1lZF9vdXRwdXQubwotb2JqLSQoQ09ORklHX0FORFJPSURfVElNRURfR1BJTykJKz0gdGltZWRfZ3Bpby5vCi1vYmotJChDT05GSUdfQU5EUk9JRF9MT1dfTUVNT1JZX0tJTExFUikJKz0gbG93bWVtb3J5a2lsbGVyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTljNWJlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1UT0RPOgotCS0gY2hlY2twYXRjaC5wbCBjbGVhbnVwcwotCS0gc3BhcnNlIGZpeGVzCi0JLSByZW5hbWUgZmlsZXMgdG8gYmUgbm90IHNvICJnZW5lcmljIgotCS0gbWFrZSBzdXJlIHRoaW5ncyBidWlsZCBhcyBtb2R1bGVzIHByb3Blcmx5Ci0JLSBhZGQgcHJvcGVyIGFyY2ggZGVwZW5kYW5jaWVzIGFzIG5lZWRlZAotCS0gYXVkaXQgdXNlcnNwYWNlIGludGVyZmFjZXMgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHNhbmUKLQotUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQgQ2M6Ci1CcmlhbiBTd2V0bGFuZCA8c3dldGxhbmRAZ29vZ2xlLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYmluZGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MDEwZDQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYmluZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzY3ICswLDAgQEAKLS8qIGJpbmRlci5jCi0gKgotICogQW5kcm9pZCBJUEMgU3Vic3lzdGVtCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggR29vZ2xlLCBJbmMuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+Ci0jaW5jbHVkZSA8bGludXgvZmR0YWJsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLQotI2luY2x1ZGUgImJpbmRlci5oIgotCi1zdGF0aWMgREVGSU5FX01VVEVYKGJpbmRlcl9sb2NrKTsKLXN0YXRpYyBERUZJTkVfTVVURVgoYmluZGVyX2RlZmVycmVkX2xvY2spOwotCi1zdGF0aWMgSExJU1RfSEVBRChiaW5kZXJfcHJvY3MpOwotc3RhdGljIEhMSVNUX0hFQUQoYmluZGVyX2RlZmVycmVkX2xpc3QpOwotc3RhdGljIEhMSVNUX0hFQUQoYmluZGVyX2RlYWRfbm9kZXMpOwotCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdDsKLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9wcm9jOwotc3RhdGljIHN0cnVjdCBiaW5kZXJfbm9kZSAqYmluZGVyX2NvbnRleHRfbWdyX25vZGU7Ci1zdGF0aWMgdWlkX3QgYmluZGVyX2NvbnRleHRfbWdyX3VpZCA9IC0xOwotc3RhdGljIGludCBiaW5kZXJfbGFzdF9pZDsKLQotc3RhdGljIGludCBiaW5kZXJfcmVhZF9wcm9jX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCQkJIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi0vKiBUaGlzIGlzIG9ubHkgZGVmaW5lZCBpbiBpbmNsdWRlL2FzbS1hcm0vc2l6ZXMuaCAqLwotI2lmbmRlZiBTWl8xSwotI2RlZmluZSBTWl8xSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMAotI2VuZGlmCi0KLSNpZm5kZWYgU1pfNE0KLSNkZWZpbmUgU1pfNE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAKLSNlbmRpZgotCi0jZGVmaW5lIEZPUkJJRERFTl9NTUFQX0ZMQUdTICAgICAgICAgICAgICAgIChWTV9XUklURSkKLQotI2RlZmluZSBCSU5ERVJfU01BTExfQlVGX1NJWkUgKFBBR0VfU0laRSAqIDY0KQotCi1lbnVtIHsKLQlCSU5ERVJfREVCVUdfVVNFUl9FUlJPUiAgICAgICAgICAgICA9IDFVIDw8IDAsCi0JQklOREVSX0RFQlVHX0ZBSUxFRF9UUkFOU0FDVElPTiAgICAgPSAxVSA8PCAxLAotCUJJTkRFUl9ERUJVR19ERUFEX1RSQU5TQUNUSU9OICAgICAgID0gMVUgPDwgMiwKLQlCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSAgICAgICAgICAgICA9IDFVIDw8IDMsCi0JQklOREVSX0RFQlVHX0RFQURfQklOREVSICAgICAgICAgICAgPSAxVSA8PCA0LAotCUJJTkRFUl9ERUJVR19ERUFUSF9OT1RJRklDQVRJT04gICAgID0gMVUgPDwgNSwKLQlCSU5ERVJfREVCVUdfUkVBRF9XUklURSAgICAgICAgICAgICA9IDFVIDw8IDYsCi0JQklOREVSX0RFQlVHX1VTRVJfUkVGUyAgICAgICAgICAgICAgPSAxVSA8PCA3LAotCUJJTkRFUl9ERUJVR19USFJFQURTICAgICAgICAgICAgICAgID0gMVUgPDwgOCwKLQlCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04gICAgICAgICAgICA9IDFVIDw8IDksCi0JQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OX0NPTVBMRVRFICAgPSAxVSA8PCAxMCwKLQlCSU5ERVJfREVCVUdfRlJFRV9CVUZGRVIgICAgICAgICAgICA9IDFVIDw8IDExLAotCUJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTICAgICAgICAgID0gMVUgPDwgMTIsCi0JQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQyAgICAgICAgICAgPSAxVSA8PCAxMywKLQlCSU5ERVJfREVCVUdfUFJJT1JJVFlfQ0FQICAgICAgICAgICA9IDFVIDw8IDE0LAotCUJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0NfQVNZTkMgICAgID0gMVUgPDwgMTUsCi19Owotc3RhdGljIHVpbnQzMl90IGJpbmRlcl9kZWJ1Z19tYXNrID0gQklOREVSX0RFQlVHX1VTRVJfRVJST1IgfAotCUJJTkRFUl9ERUJVR19GQUlMRURfVFJBTlNBQ1RJT04gfCBCSU5ERVJfREVCVUdfREVBRF9UUkFOU0FDVElPTjsKLW1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Z19tYXNrLCBiaW5kZXJfZGVidWdfbWFzaywgdWludCwgU19JV1VTUiB8IFNfSVJVR08pOwotCi1zdGF0aWMgaW50IGJpbmRlcl9kZWJ1Z19ub19sb2NrOwotbW9kdWxlX3BhcmFtX25hbWVkKHByb2Nfbm9fbG9jaywgYmluZGVyX2RlYnVnX25vX2xvY2ssIGJvb2wsIFNfSVdVU1IgfCBTX0lSVUdPKTsKLQotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGJpbmRlcl91c2VyX2Vycm9yX3dhaXQpOwotc3RhdGljIGludCBiaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yOwotCi1zdGF0aWMgaW50IGJpbmRlcl9zZXRfc3RvcF9vbl91c2VyX2Vycm9yKGNvbnN0IGNoYXIgKnZhbCwKLQkJCQkJIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQotewotCWludCByZXQ7Ci0JcmV0ID0gcGFyYW1fc2V0X2ludCh2YWwsIGtwKTsKLQlpZiAoYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvciA8IDIpCi0JCXdha2VfdXAoJmJpbmRlcl91c2VyX2Vycm9yX3dhaXQpOwotCXJldHVybiByZXQ7Ci19Ci1tb2R1bGVfcGFyYW1fY2FsbChzdG9wX29uX3VzZXJfZXJyb3IsIGJpbmRlcl9zZXRfc3RvcF9vbl91c2VyX2Vycm9yLAotCXBhcmFtX2dldF9pbnQsICZiaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yLCBTX0lXVVNSIHwgU19JUlVHTyk7Ci0KLSNkZWZpbmUgYmluZGVyX2RlYnVnKG1hc2ssIHguLi4pIFwKLQlkbyB7IFwKLQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgbWFzaykgXAotCQkJcHJpbnRrKEtFUk5fSU5GTyB4KTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgYmluZGVyX3VzZXJfZXJyb3IoeC4uLikgXAotCWRvIHsgXAotCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVVNFUl9FUlJPUikgXAotCQkJcHJpbnRrKEtFUk5fSU5GTyB4KTsgXAotCQlpZiAoYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvcikgXAotCQkJYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvciA9IDI7IFwKLQl9IHdoaWxlICgwKQotCi1lbnVtIGJpbmRlcl9zdGF0X3R5cGVzIHsKLQlCSU5ERVJfU1RBVF9QUk9DLAotCUJJTkRFUl9TVEFUX1RIUkVBRCwKLQlCSU5ERVJfU1RBVF9OT0RFLAotCUJJTkRFUl9TVEFUX1JFRiwKLQlCSU5ERVJfU1RBVF9ERUFUSCwKLQlCSU5ERVJfU1RBVF9UUkFOU0FDVElPTiwKLQlCSU5ERVJfU1RBVF9UUkFOU0FDVElPTl9DT01QTEVURSwKLQlCSU5ERVJfU1RBVF9DT1VOVAotfTsKLQotc3RydWN0IGJpbmRlcl9zdGF0cyB7Ci0JaW50IGJyW19JT0NfTlIoQlJfRkFJTEVEX1JFUExZKSArIDFdOwotCWludCBiY1tfSU9DX05SKEJDX0RFQURfQklOREVSX0RPTkUpICsgMV07Ci0JaW50IG9ial9jcmVhdGVkW0JJTkRFUl9TVEFUX0NPVU5UXTsKLQlpbnQgb2JqX2RlbGV0ZWRbQklOREVSX1NUQVRfQ09VTlRdOwotfTsKLQotc3RhdGljIHN0cnVjdCBiaW5kZXJfc3RhdHMgYmluZGVyX3N0YXRzOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgYmluZGVyX3N0YXRzX2RlbGV0ZWQoZW51bSBiaW5kZXJfc3RhdF90eXBlcyB0eXBlKQotewotCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFt0eXBlXSsrOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYmluZGVyX3N0YXRzX2NyZWF0ZWQoZW51bSBiaW5kZXJfc3RhdF90eXBlcyB0eXBlKQotewotCWJpbmRlcl9zdGF0cy5vYmpfY3JlYXRlZFt0eXBlXSsrOwotfQotCi1zdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeSB7Ci0JaW50IGRlYnVnX2lkOwotCWludCBjYWxsX3R5cGU7Ci0JaW50IGZyb21fcHJvYzsKLQlpbnQgZnJvbV90aHJlYWQ7Ci0JaW50IHRhcmdldF9oYW5kbGU7Ci0JaW50IHRvX3Byb2M7Ci0JaW50IHRvX3RocmVhZDsKLQlpbnQgdG9fbm9kZTsKLQlpbnQgZGF0YV9zaXplOwotCWludCBvZmZzZXRzX3NpemU7Ci19Owotc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2cgewotCWludCBuZXh0OwotCWludCBmdWxsOwotCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5IGVudHJ5WzMyXTsKLX07Ci1zdGF0aWMgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2cgYmluZGVyX3RyYW5zYWN0aW9uX2xvZzsKLXN0YXRpYyBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZyBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2ZhaWxlZDsKLQotc3RhdGljIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5ICpiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2FkZCgKLQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZyAqbG9nKQotewotCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5ICplOwotCWUgPSAmbG9nLT5lbnRyeVtsb2ctPm5leHRdOwotCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKLQlsb2ctPm5leHQrKzsKLQlpZiAobG9nLT5uZXh0ID09IEFSUkFZX1NJWkUobG9nLT5lbnRyeSkpIHsKLQkJbG9nLT5uZXh0ID0gMDsKLQkJbG9nLT5mdWxsID0gMTsKLQl9Ci0JcmV0dXJuIGU7Ci19Ci0KLXN0cnVjdCBiaW5kZXJfd29yayB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKLQllbnVtIHsKLQkJQklOREVSX1dPUktfVFJBTlNBQ1RJT04gPSAxLAotCQlCSU5ERVJfV09SS19UUkFOU0FDVElPTl9DT01QTEVURSwKLQkJQklOREVSX1dPUktfTk9ERSwKLQkJQklOREVSX1dPUktfREVBRF9CSU5ERVIsCi0JCUJJTkRFUl9XT1JLX0RFQURfQklOREVSX0FORF9DTEVBUiwKLQkJQklOREVSX1dPUktfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OLAotCX0gdHlwZTsKLX07Ci0KLXN0cnVjdCBiaW5kZXJfbm9kZSB7Ci0JaW50IGRlYnVnX2lkOwotCXN0cnVjdCBiaW5kZXJfd29yayB3b3JrOwotCXVuaW9uIHsKLQkJc3RydWN0IHJiX25vZGUgcmJfbm9kZTsKLQkJc3RydWN0IGhsaXN0X25vZGUgZGVhZF9ub2RlOwotCX07Ci0Jc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOwotCXN0cnVjdCBobGlzdF9oZWFkIHJlZnM7Ci0JaW50IGludGVybmFsX3N0cm9uZ19yZWZzOwotCWludCBsb2NhbF93ZWFrX3JlZnM7Ci0JaW50IGxvY2FsX3N0cm9uZ19yZWZzOwotCXZvaWQgX191c2VyICpwdHI7Ci0Jdm9pZCBfX3VzZXIgKmNvb2tpZTsKLQl1bnNpZ25lZCBoYXNfc3Ryb25nX3JlZjoxOwotCXVuc2lnbmVkIHBlbmRpbmdfc3Ryb25nX3JlZjoxOwotCXVuc2lnbmVkIGhhc193ZWFrX3JlZjoxOwotCXVuc2lnbmVkIHBlbmRpbmdfd2Vha19yZWY6MTsKLQl1bnNpZ25lZCBoYXNfYXN5bmNfdHJhbnNhY3Rpb246MTsKLQl1bnNpZ25lZCBhY2NlcHRfZmRzOjE7Ci0JdW5zaWduZWQgbWluX3ByaW9yaXR5Ojg7Ci0Jc3RydWN0IGxpc3RfaGVhZCBhc3luY190b2RvOwotfTsKLQotc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggewotCXN0cnVjdCBiaW5kZXJfd29yayB3b3JrOwotCXZvaWQgX191c2VyICpjb29raWU7Ci19OwotCi1zdHJ1Y3QgYmluZGVyX3JlZiB7Ci0JLyogTG9va3VwcyBuZWVkZWQ6ICovCi0JLyogICBub2RlICsgcHJvYyA9PiByZWYgKHRyYW5zYWN0aW9uKSAqLwotCS8qICAgZGVzYyArIHByb2MgPT4gcmVmICh0cmFuc2FjdGlvbiwgaW5jL2RlYyByZWYpICovCi0JLyogICBub2RlID0+IHJlZnMgKyBwcm9jcyAocHJvYyBleGl0KSAqLwotCWludCBkZWJ1Z19pZDsKLQlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlX2Rlc2M7Ci0Jc3RydWN0IHJiX25vZGUgcmJfbm9kZV9ub2RlOwotCXN0cnVjdCBobGlzdF9ub2RlIG5vZGVfZW50cnk7Ci0Jc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOwotCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKLQl1aW50MzJfdCBkZXNjOwotCWludCBzdHJvbmc7Ci0JaW50IHdlYWs7Ci0Jc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggKmRlYXRoOwotfTsKLQotc3RydWN0IGJpbmRlcl9idWZmZXIgewotCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7IC8qIGZyZWUgYW5kIGFsbG9jYXRlZCBlbnRyaWVzIGJ5IGFkZGVzc3MgKi8KLQlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlOyAvKiBmcmVlIGVudHJ5IGJ5IHNpemUgb3IgYWxsb2NhdGVkIGVudHJ5ICovCi0JCQkJLyogYnkgYWRkcmVzcyAqLwotCXVuc2lnbmVkIGZyZWU6MTsKLQl1bnNpZ25lZCBhbGxvd191c2VyX2ZyZWU6MTsKLQl1bnNpZ25lZCBhc3luY190cmFuc2FjdGlvbjoxOwotCXVuc2lnbmVkIGRlYnVnX2lkOjI5OwotCi0Jc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdHJhbnNhY3Rpb247Ci0KLQlzdHJ1Y3QgYmluZGVyX25vZGUgKnRhcmdldF9ub2RlOwotCXNpemVfdCBkYXRhX3NpemU7Ci0Jc2l6ZV90IG9mZnNldHNfc2l6ZTsKLQl1aW50OF90IGRhdGFbMF07Ci19OwotCi1lbnVtIGJpbmRlcl9kZWZlcnJlZF9zdGF0ZSB7Ci0JQklOREVSX0RFRkVSUkVEX1BVVF9GSUxFUyAgICA9IDB4MDEsCi0JQklOREVSX0RFRkVSUkVEX0ZMVVNIICAgICAgICA9IDB4MDIsCi0JQklOREVSX0RFRkVSUkVEX1JFTEVBU0UgICAgICA9IDB4MDQsCi19OwotCi1zdHJ1Y3QgYmluZGVyX3Byb2MgewotCXN0cnVjdCBobGlzdF9ub2RlIHByb2Nfbm9kZTsKLQlzdHJ1Y3QgcmJfcm9vdCB0aHJlYWRzOwotCXN0cnVjdCByYl9yb290IG5vZGVzOwotCXN0cnVjdCByYl9yb290IHJlZnNfYnlfZGVzYzsKLQlzdHJ1Y3QgcmJfcm9vdCByZWZzX2J5X25vZGU7Ci0JaW50IHBpZDsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKLQlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSBkZWZlcnJlZF93b3JrX25vZGU7Ci0JaW50IGRlZmVycmVkX3dvcms7Ci0Jdm9pZCAqYnVmZmVyOwotCXB0cmRpZmZfdCB1c2VyX2J1ZmZlcl9vZmZzZXQ7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkIGJ1ZmZlcnM7Ci0Jc3RydWN0IHJiX3Jvb3QgZnJlZV9idWZmZXJzOwotCXN0cnVjdCByYl9yb290IGFsbG9jYXRlZF9idWZmZXJzOwotCXNpemVfdCBmcmVlX2FzeW5jX3NwYWNlOwotCi0Jc3RydWN0IHBhZ2UgKipwYWdlczsKLQlzaXplX3QgYnVmZmVyX3NpemU7Ci0JdWludDMyX3QgYnVmZmVyX2ZyZWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCB0b2RvOwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0Jc3RydWN0IGJpbmRlcl9zdGF0cyBzdGF0czsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGRlbGl2ZXJlZF9kZWF0aDsKLQlpbnQgbWF4X3RocmVhZHM7Ci0JaW50IHJlcXVlc3RlZF90aHJlYWRzOwotCWludCByZXF1ZXN0ZWRfdGhyZWFkc19zdGFydGVkOwotCWludCByZWFkeV90aHJlYWRzOwotCWxvbmcgZGVmYXVsdF9wcmlvcml0eTsKLX07Ci0KLWVudW0gewotCUJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCAgPSAweDAxLAotCUJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRCAgICAgPSAweDAyLAotCUJJTkRFUl9MT09QRVJfU1RBVEVfRVhJVEVEICAgICAgPSAweDA0LAotCUJJTkRFUl9MT09QRVJfU1RBVEVfSU5WQUxJRCAgICAgPSAweDA4LAotCUJJTkRFUl9MT09QRVJfU1RBVEVfV0FJVElORyAgICAgPSAweDEwLAotCUJJTkRFUl9MT09QRVJfU1RBVEVfTkVFRF9SRVRVUk4gPSAweDIwCi19OwotCi1zdHJ1Y3QgYmluZGVyX3RocmVhZCB7Ci0Jc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOwotCXN0cnVjdCByYl9ub2RlIHJiX25vZGU7Ci0JaW50IHBpZDsKLQlpbnQgbG9vcGVyOwotCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uX3N0YWNrOwotCXN0cnVjdCBsaXN0X2hlYWQgdG9kbzsKLQl1aW50MzJfdCByZXR1cm5fZXJyb3I7IC8qIFdyaXRlIGZhaWxlZCwgcmV0dXJuIGVycm9yIGNvZGUgaW4gcmVhZCBidWYgKi8KLQl1aW50MzJfdCByZXR1cm5fZXJyb3IyOyAvKiBXcml0ZSBmYWlsZWQsIHJldHVybiBlcnJvciBjb2RlIGluIHJlYWQgKi8KLQkJLyogYnVmZmVyLiBVc2VkIHdoZW4gc2VuZGluZyBhIHJlcGx5IHRvIGEgZGVhZCBwcm9jZXNzIHRoYXQgKi8KLQkJLyogd2UgYXJlIGFsc28gd2FpdGluZyBvbiAqLwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0Jc3RydWN0IGJpbmRlcl9zdGF0cyBzdGF0czsKLX07Ci0KLXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gewotCWludCBkZWJ1Z19pZDsKLQlzdHJ1Y3QgYmluZGVyX3dvcmsgd29yazsKLQlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqZnJvbTsKLQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICpmcm9tX3BhcmVudDsKLQlzdHJ1Y3QgYmluZGVyX3Byb2MgKnRvX3Byb2M7Ci0Jc3RydWN0IGJpbmRlcl90aHJlYWQgKnRvX3RocmVhZDsKLQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0b19wYXJlbnQ7Ci0JdW5zaWduZWQgbmVlZF9yZXBseToxOwotCS8qIHVuc2lnbmVkIGlzX2RlYWQ6MTsgKi8JLyogbm90IHVzZWQgYXQgdGhlIG1vbWVudCAqLwotCi0Jc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcjsKLQl1bnNpZ25lZCBpbnQJY29kZTsKLQl1bnNpZ25lZCBpbnQJZmxhZ3M7Ci0JbG9uZwlwcmlvcml0eTsKLQlsb25nCXNhdmVkX3ByaW9yaXR5OwotCXVpZF90CXNlbmRlcl9ldWlkOwotfTsKLQotc3RhdGljIHZvaWQKLWJpbmRlcl9kZWZlcl93b3JrKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgZW51bSBiaW5kZXJfZGVmZXJyZWRfc3RhdGUgZGVmZXIpOwotCi0vKgotICogY29waWVkIGZyb20gZ2V0X3VudXNlZF9mZF9mbGFncwotICovCi1pbnQgdGFza19nZXRfdW51c2VkX2ZkX2ZsYWdzKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgaW50IGZsYWdzKQotewotCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzID0gcHJvYy0+ZmlsZXM7Ci0JaW50IGZkLCBlcnJvcjsKLQlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwotCXVuc2lnbmVkIGxvbmcgcmxpbV9jdXI7Ci0JdW5zaWduZWQgbG9uZyBpcnFzOwotCi0JaWYgKGZpbGVzID09IE5VTEwpCi0JCXJldHVybiAtRVNSQ0g7Ci0KLQllcnJvciA9IC1FTUZJTEU7Ci0Jc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKLQotcmVwZWF0OgotCWZkdCA9IGZpbGVzX2ZkdGFibGUoZmlsZXMpOwotCWZkID0gZmluZF9uZXh0X3plcm9fYml0KGZkdC0+b3Blbl9mZHMtPmZkc19iaXRzLCBmZHQtPm1heF9mZHMsCi0JCQkJZmlsZXMtPm5leHRfZmQpOwotCi0JLyoKLQkgKiBOLkIuIEZvciBjbG9uZSB0YXNrcyBzaGFyaW5nIGEgZmlsZXMgc3RydWN0dXJlLCB0aGlzIHRlc3QKLQkgKiB3aWxsIGxpbWl0IHRoZSB0b3RhbCBudW1iZXIgb2YgZmlsZXMgdGhhdCBjYW4gYmUgb3BlbmVkLgotCSAqLwotCXJsaW1fY3VyID0gMDsKLQlpZiAobG9ja190YXNrX3NpZ2hhbmQocHJvYy0+dHNrLCAmaXJxcykpIHsKLQkJcmxpbV9jdXIgPSBwcm9jLT50c2stPnNpZ25hbC0+cmxpbVtSTElNSVRfTk9GSUxFXS5ybGltX2N1cjsKLQkJdW5sb2NrX3Rhc2tfc2lnaGFuZChwcm9jLT50c2ssICZpcnFzKTsKLQl9Ci0JaWYgKGZkID49IHJsaW1fY3VyKQotCQlnb3RvIG91dDsKLQotCS8qIERvIHdlIG5lZWQgdG8gZXhwYW5kIHRoZSBmZCBhcnJheSBvciBmZCBzZXQ/ICAqLwotCWVycm9yID0gZXhwYW5kX2ZpbGVzKGZpbGVzLCBmZCk7Ci0JaWYgKGVycm9yIDwgMCkKLQkJZ290byBvdXQ7Ci0KLQlpZiAoZXJyb3IpIHsKLQkJLyoKLQkJICogSWYgd2UgbmVlZGVkIHRvIGV4cGFuZCB0aGUgZnMgYXJyYXkgd2UKLQkJICogbWlnaHQgaGF2ZSBibG9ja2VkIC0gdHJ5IGFnYWluLgotCQkgKi8KLQkJZXJyb3IgPSAtRU1GSUxFOwotCQlnb3RvIHJlcGVhdDsKLQl9Ci0KLQlGRF9TRVQoZmQsIGZkdC0+b3Blbl9mZHMpOwotCWlmIChmbGFncyAmIE9fQ0xPRVhFQykKLQkJRkRfU0VUKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOwotCWVsc2UKLQkJRkRfQ0xSKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOwotCWZpbGVzLT5uZXh0X2ZkID0gZmQgKyAxOwotI2lmIDEKLQkvKiBTYW5pdHkgY2hlY2sgKi8KLQlpZiAoZmR0LT5mZFtmZF0gIT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJnZXRfdW51c2VkX2ZkOiBzbG90ICVkIG5vdCBOVUxMIVxuIiwgZmQpOwotCQlmZHQtPmZkW2ZkXSA9IE5VTEw7Ci0JfQotI2VuZGlmCi0JZXJyb3IgPSBmZDsKLQotb3V0OgotCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qCi0gKiBjb3BpZWQgZnJvbSBmZF9pbnN0YWxsCi0gKi8KLXN0YXRpYyB2b2lkIHRhc2tfZmRfaW5zdGFsbCgKLQlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHVuc2lnbmVkIGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBwcm9jLT5maWxlczsKLQlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwotCi0JaWYgKGZpbGVzID09IE5VTEwpCi0JCXJldHVybjsKLQotCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Ci0JZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7Ci0JQlVHX09OKGZkdC0+ZmRbZmRdICE9IE5VTEwpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihmZHQtPmZkW2ZkXSwgZmlsZSk7Ci0Jc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOwotfQotCi0vKgotICogY29waWVkIGZyb20gX19wdXRfdW51c2VkX2ZkIGluIG9wZW4uYwotICovCi1zdGF0aWMgdm9pZCBfX3B1dF91bnVzZWRfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMsIHVuc2lnbmVkIGludCBmZCkKLXsKLQlzdHJ1Y3QgZmR0YWJsZSAqZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7Ci0JX19GRF9DTFIoZmQsIGZkdC0+b3Blbl9mZHMpOwotCWlmIChmZCA8IGZpbGVzLT5uZXh0X2ZkKQotCQlmaWxlcy0+bmV4dF9mZCA9IGZkOwotfQotCi0vKgotICogY29waWVkIGZyb20gc3lzX2Nsb3NlCi0gKi8KLXN0YXRpYyBsb25nIHRhc2tfY2xvc2VfZmQoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCB1bnNpZ25lZCBpbnQgZmQpCi17Ci0Jc3RydWN0IGZpbGUgKmZpbHA7Ci0Jc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBwcm9jLT5maWxlczsKLQlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwotCWludCByZXR2YWw7Ci0KLQlpZiAoZmlsZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FU1JDSDsKLQotCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Ci0JZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7Ci0JaWYgKGZkID49IGZkdC0+bWF4X2ZkcykKLQkJZ290byBvdXRfdW5sb2NrOwotCWZpbHAgPSBmZHQtPmZkW2ZkXTsKLQlpZiAoIWZpbHApCi0JCWdvdG8gb3V0X3VubG9jazsKLQlyY3VfYXNzaWduX3BvaW50ZXIoZmR0LT5mZFtmZF0sIE5VTEwpOwotCUZEX0NMUihmZCwgZmR0LT5jbG9zZV9vbl9leGVjKTsKLQlfX3B1dF91bnVzZWRfZmQoZmlsZXMsIGZkKTsKLQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Ci0JcmV0dmFsID0gZmlscF9jbG9zZShmaWxwLCBmaWxlcyk7Ci0KLQkvKiBjYW4ndCByZXN0YXJ0IGNsb3NlIHN5c2NhbGwgYmVjYXVzZSBmaWxlIHRhYmxlIGVudHJ5IHdhcyBjbGVhcmVkICovCi0JaWYgKHVubGlrZWx5KHJldHZhbCA9PSAtRVJFU1RBUlRTWVMgfHwKLQkJICAgICByZXR2YWwgPT0gLUVSRVNUQVJUTk9JTlRSIHx8Ci0JCSAgICAgcmV0dmFsID09IC1FUkVTVEFSVE5PSEFORCB8fAotCQkgICAgIHJldHZhbCA9PSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLKSkKLQkJcmV0dmFsID0gLUVJTlRSOwotCi0JcmV0dXJuIHJldHZhbDsKLQotb3V0X3VubG9jazoKLQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Ci0JcmV0dXJuIC1FQkFERjsKLX0KLQotc3RhdGljIHZvaWQgYmluZGVyX3NldF9uaWNlKGxvbmcgbmljZSkKLXsKLQlsb25nIG1pbl9uaWNlOwotCWlmIChjYW5fbmljZShjdXJyZW50LCBuaWNlKSkgewotCQlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIG5pY2UpOwotCQlyZXR1cm47Ci0JfQotCW1pbl9uaWNlID0gMjAgLSBjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX05JQ0VdLnJsaW1fY3VyOwotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfUFJJT1JJVFlfQ0FQLAotCQkgICAgICJiaW5kZXI6ICVkOiBuaWNlIHZhbHVlICVsZCBub3QgYWxsb3dlZCB1c2UgIgotCQkgICAgICIlbGQgaW5zdGVhZFxuIiwgY3VycmVudC0+cGlkLCBuaWNlLCBtaW5fbmljZSk7Ci0Jc2V0X3VzZXJfbmljZShjdXJyZW50LCBtaW5fbmljZSk7Ci0JaWYgKG1pbl9uaWNlIDwgMjApCi0JCXJldHVybjsKLQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZCBSTElNSVRfTklDRSBub3Qgc2V0XG4iLCBjdXJyZW50LT5waWQpOwotfQotCi1zdGF0aWMgc2l6ZV90IGJpbmRlcl9idWZmZXJfc2l6ZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkJIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIpCi17Ci0JaWYgKGxpc3RfaXNfbGFzdCgmYnVmZmVyLT5lbnRyeSwgJnByb2MtPmJ1ZmZlcnMpKQotCQlyZXR1cm4gcHJvYy0+YnVmZmVyICsgcHJvYy0+YnVmZmVyX3NpemUgLSAodm9pZCAqKWJ1ZmZlci0+ZGF0YTsKLQllbHNlCi0JCXJldHVybiAoc2l6ZV90KWxpc3RfZW50cnkoYnVmZmVyLT5lbnRyeS5uZXh0LAotCQkJc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KSAtIChzaXplX3QpYnVmZmVyLT5kYXRhOwotfQotCi1zdGF0aWMgdm9pZCBiaW5kZXJfaW5zZXJ0X2ZyZWVfYnVmZmVyKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCQkgICAgICBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqbmV3X2J1ZmZlcikKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmcHJvYy0+ZnJlZV9idWZmZXJzLnJiX25vZGU7Ci0Jc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7Ci0Jc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcjsKLQlzaXplX3QgYnVmZmVyX3NpemU7Ci0Jc2l6ZV90IG5ld19idWZmZXJfc2l6ZTsKLQotCUJVR19PTighbmV3X2J1ZmZlci0+ZnJlZSk7Ci0KLQluZXdfYnVmZmVyX3NpemUgPSBiaW5kZXJfYnVmZmVyX3NpemUocHJvYywgbmV3X2J1ZmZlcik7Ci0KLQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQywKLQkJICAgICAiYmluZGVyOiAlZDogYWRkIGZyZWUgYnVmZmVyLCBzaXplICV6ZCwgIgotCQkgICAgICJhdCAlcFxuIiwgcHJvYy0+cGlkLCBuZXdfYnVmZmVyX3NpemUsIG5ld19idWZmZXIpOwotCi0Jd2hpbGUgKCpwKSB7Ci0JCXBhcmVudCA9ICpwOwotCQlidWZmZXIgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBiaW5kZXJfYnVmZmVyLCByYl9ub2RlKTsKLQkJQlVHX09OKCFidWZmZXItPmZyZWUpOwotCi0JCWJ1ZmZlcl9zaXplID0gYmluZGVyX2J1ZmZlcl9zaXplKHByb2MsIGJ1ZmZlcik7Ci0KLQkJaWYgKG5ld19idWZmZXJfc2l6ZSA8IGJ1ZmZlcl9zaXplKQotCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7Ci0JCWVsc2UKLQkJCXAgPSAmcGFyZW50LT5yYl9yaWdodDsKLQl9Ci0JcmJfbGlua19ub2RlKCZuZXdfYnVmZmVyLT5yYl9ub2RlLCBwYXJlbnQsIHApOwotCXJiX2luc2VydF9jb2xvcigmbmV3X2J1ZmZlci0+cmJfbm9kZSwgJnByb2MtPmZyZWVfYnVmZmVycyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJpbmRlcl9pbnNlcnRfYWxsb2NhdGVkX2J1ZmZlcihzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkJCSAgIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpuZXdfYnVmZmVyKQotewotCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwcm9jLT5hbGxvY2F0ZWRfYnVmZmVycy5yYl9ub2RlOwotCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOwotCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXI7Ci0KLQlCVUdfT04obmV3X2J1ZmZlci0+ZnJlZSk7Ci0KLQl3aGlsZSAoKnApIHsKLQkJcGFyZW50ID0gKnA7Ci0JCWJ1ZmZlciA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpOwotCQlCVUdfT04oYnVmZmVyLT5mcmVlKTsKLQotCQlpZiAobmV3X2J1ZmZlciA8IGJ1ZmZlcikKLQkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OwotCQllbHNlIGlmIChuZXdfYnVmZmVyID4gYnVmZmVyKQotCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OwotCQllbHNlCi0JCQlCVUcoKTsKLQl9Ci0JcmJfbGlua19ub2RlKCZuZXdfYnVmZmVyLT5yYl9ub2RlLCBwYXJlbnQsIHApOwotCXJiX2luc2VydF9jb2xvcigmbmV3X2J1ZmZlci0+cmJfbm9kZSwgJnByb2MtPmFsbG9jYXRlZF9idWZmZXJzKTsKLX0KLQotc3RhdGljIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpiaW5kZXJfYnVmZmVyX2xvb2t1cChzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkJCQkgIHZvaWQgX191c2VyICp1c2VyX3B0cikKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHByb2MtPmFsbG9jYXRlZF9idWZmZXJzLnJiX25vZGU7Ci0Jc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcjsKLQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqa2Vybl9wdHI7Ci0KLQlrZXJuX3B0ciA9IHVzZXJfcHRyIC0gcHJvYy0+dXNlcl9idWZmZXJfb2Zmc2V0Ci0JCS0gb2Zmc2V0b2Yoc3RydWN0IGJpbmRlcl9idWZmZXIsIGRhdGEpOwotCi0Jd2hpbGUgKG4pIHsKLQkJYnVmZmVyID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpOwotCQlCVUdfT04oYnVmZmVyLT5mcmVlKTsKLQotCQlpZiAoa2Vybl9wdHIgPCBidWZmZXIpCi0JCQluID0gbi0+cmJfbGVmdDsKLQkJZWxzZSBpZiAoa2Vybl9wdHIgPiBidWZmZXIpCi0JCQluID0gbi0+cmJfcmlnaHQ7Ci0JCWVsc2UKLQkJCXJldHVybiBidWZmZXI7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IGJpbmRlcl91cGRhdGVfcGFnZV9yYW5nZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIGludCBhbGxvY2F0ZSwKLQkJCQkgICAgdm9pZCAqc3RhcnQsIHZvaWQgKmVuZCwKLQkJCQkgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0Jdm9pZCAqcGFnZV9hZGRyOwotCXVuc2lnbmVkIGxvbmcgdXNlcl9wYWdlX2FkZHI7Ci0Jc3RydWN0IHZtX3N0cnVjdCB0bXBfYXJlYTsKLQlzdHJ1Y3QgcGFnZSAqKnBhZ2U7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW07Ci0KLQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQywKLQkJICAgICAiYmluZGVyOiAlZDogJXMgcGFnZXMgJXAtJXBcbiIsIHByb2MtPnBpZCwKLQkJICAgICBhbGxvY2F0ZSA/ICJhbGxvY2F0ZSIgOiAiZnJlZSIsIHN0YXJ0LCBlbmQpOwotCi0JaWYgKGVuZCA8PSBzdGFydCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAodm1hKQotCQltbSA9IE5VTEw7Ci0JZWxzZQotCQltbSA9IGdldF90YXNrX21tKHByb2MtPnRzayk7Ci0KLQlpZiAobW0pIHsKLQkJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQkJdm1hID0gcHJvYy0+dm1hOwotCX0KLQotCWlmIChhbGxvY2F0ZSA9PSAwKQotCQlnb3RvIGZyZWVfcmFuZ2U7Ci0KLQlpZiAodm1hID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmIGZhaWxlZCB0byAiCi0JCSAgICAgICAibWFwIHBhZ2VzIGluIHVzZXJzcGFjZSwgbm8gdm1hXG4iLCBwcm9jLT5waWQpOwotCQlnb3RvIGVycl9ub192bWE7Ci0JfQotCi0JZm9yIChwYWdlX2FkZHIgPSBzdGFydDsgcGFnZV9hZGRyIDwgZW5kOyBwYWdlX2FkZHIgKz0gUEFHRV9TSVpFKSB7Ci0JCWludCByZXQ7Ci0JCXN0cnVjdCBwYWdlICoqcGFnZV9hcnJheV9wdHI7Ci0JCXBhZ2UgPSAmcHJvYy0+cGFnZXNbKHBhZ2VfYWRkciAtIHByb2MtPmJ1ZmZlcikgLyBQQUdFX1NJWkVdOwotCi0JCUJVR19PTigqcGFnZSk7Ci0JCSpwYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7Ci0JCWlmICgqcGFnZSA9PSBOVUxMKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgZmFpbGVkICIKLQkJCSAgICAgICAiZm9yIHBhZ2UgYXQgJXBcbiIsIHByb2MtPnBpZCwgcGFnZV9hZGRyKTsKLQkJCWdvdG8gZXJyX2FsbG9jX3BhZ2VfZmFpbGVkOwotCQl9Ci0JCXRtcF9hcmVhLmFkZHIgPSBwYWdlX2FkZHI7Ci0JCXRtcF9hcmVhLnNpemUgPSBQQUdFX1NJWkUgKyBQQUdFX1NJWkUgLyogZ3VhcmQgcGFnZT8gKi87Ci0JCXBhZ2VfYXJyYXlfcHRyID0gcGFnZTsKLQkJcmV0ID0gbWFwX3ZtX2FyZWEoJnRtcF9hcmVhLCBQQUdFX0tFUk5FTCwgJnBhZ2VfYXJyYXlfcHRyKTsKLQkJaWYgKHJldCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmIGZhaWxlZCAiCi0JCQkgICAgICAgInRvIG1hcCBwYWdlIGF0ICVwIGluIGtlcm5lbFxuIiwKLQkJCSAgICAgICBwcm9jLT5waWQsIHBhZ2VfYWRkcik7Ci0JCQlnb3RvIGVycl9tYXBfa2VybmVsX2ZhaWxlZDsKLQkJfQotCQl1c2VyX3BhZ2VfYWRkciA9Ci0JCQkodWludHB0cl90KXBhZ2VfYWRkciArIHByb2MtPnVzZXJfYnVmZmVyX29mZnNldDsKLQkJcmV0ID0gdm1faW5zZXJ0X3BhZ2Uodm1hLCB1c2VyX3BhZ2VfYWRkciwgcGFnZVswXSk7Ci0JCWlmIChyZXQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBmYWlsZWQgIgotCQkJICAgICAgICJ0byBtYXAgcGFnZSBhdCAlbHggaW4gdXNlcnNwYWNlXG4iLAotCQkJICAgICAgIHByb2MtPnBpZCwgdXNlcl9wYWdlX2FkZHIpOwotCQkJZ290byBlcnJfdm1faW5zZXJ0X3BhZ2VfZmFpbGVkOwotCQl9Ci0JCS8qIHZtX2luc2VydF9wYWdlIGRvZXMgbm90IHNlZW0gdG8gaW5jcmVtZW50IHRoZSByZWZjb3VudCAqLwotCX0KLQlpZiAobW0pIHsKLQkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7Ci0JCW1tcHV0KG1tKTsKLQl9Ci0JcmV0dXJuIDA7Ci0KLWZyZWVfcmFuZ2U6Ci0JZm9yIChwYWdlX2FkZHIgPSBlbmQgLSBQQUdFX1NJWkU7IHBhZ2VfYWRkciA+PSBzdGFydDsKLQkgICAgIHBhZ2VfYWRkciAtPSBQQUdFX1NJWkUpIHsKLQkJcGFnZSA9ICZwcm9jLT5wYWdlc1socGFnZV9hZGRyIC0gcHJvYy0+YnVmZmVyKSAvIFBBR0VfU0laRV07Ci0JCWlmICh2bWEpCi0JCQl6YXBfcGFnZV9yYW5nZSh2bWEsICh1aW50cHRyX3QpcGFnZV9hZGRyICsKLQkJCQlwcm9jLT51c2VyX2J1ZmZlcl9vZmZzZXQsIFBBR0VfU0laRSwgTlVMTCk7Ci1lcnJfdm1faW5zZXJ0X3BhZ2VfZmFpbGVkOgotCQl1bm1hcF9rZXJuZWxfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyLCBQQUdFX1NJWkUpOwotZXJyX21hcF9rZXJuZWxfZmFpbGVkOgotCQlfX2ZyZWVfcGFnZSgqcGFnZSk7Ci0JCSpwYWdlID0gTlVMTDsKLWVycl9hbGxvY19wYWdlX2ZhaWxlZDoKLQkJOwotCX0KLWVycl9ub192bWE6Ci0JaWYgKG1tKSB7Ci0JCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwotCQltbXB1dChtbSk7Ci0JfQotCXJldHVybiAtRU5PTUVNOwotfQotCi1zdGF0aWMgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJpbmRlcl9hbGxvY19idWYoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLAotCQkJCQkgICAgICBzaXplX3QgZGF0YV9zaXplLAotCQkJCQkgICAgICBzaXplX3Qgb2Zmc2V0c19zaXplLCBpbnQgaXNfYXN5bmMpCi17Ci0Jc3RydWN0IHJiX25vZGUgKm4gPSBwcm9jLT5mcmVlX2J1ZmZlcnMucmJfbm9kZTsKLQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOwotCXNpemVfdCBidWZmZXJfc2l6ZTsKLQlzdHJ1Y3QgcmJfbm9kZSAqYmVzdF9maXQgPSBOVUxMOwotCXZvaWQgKmhhc19wYWdlX2FkZHI7Ci0Jdm9pZCAqZW5kX3BhZ2VfYWRkcjsKLQlzaXplX3Qgc2l6ZTsKLQotCWlmIChwcm9jLT52bWEgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYsIG5vIHZtYVxuIiwKLQkJICAgICAgIHByb2MtPnBpZCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXNpemUgPSBBTElHTihkYXRhX3NpemUsIHNpemVvZih2b2lkICopKSArCi0JCUFMSUdOKG9mZnNldHNfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpOwotCi0JaWYgKHNpemUgPCBkYXRhX3NpemUgfHwgc2l6ZSA8IG9mZnNldHNfc2l6ZSkgewotCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDogZ290IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCAiCi0JCQkic2l6ZSAlemQtJXpkXG4iLCBwcm9jLT5waWQsIGRhdGFfc2l6ZSwgb2Zmc2V0c19zaXplKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKGlzX2FzeW5jICYmCi0JICAgIHByb2MtPmZyZWVfYXN5bmNfc3BhY2UgPCBzaXplICsgc2l6ZW9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyKSkgewotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQywKLQkJCSAgICAgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgc2l6ZSAlemQiCi0JCQkgICAgICJmYWlsZWQsIG5vIGFzeW5jIHNwYWNlIGxlZnRcbiIsIHByb2MtPnBpZCwgc2l6ZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXdoaWxlIChuKSB7Ci0JCWJ1ZmZlciA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfYnVmZmVyLCByYl9ub2RlKTsKLQkJQlVHX09OKCFidWZmZXItPmZyZWUpOwotCQlidWZmZXJfc2l6ZSA9IGJpbmRlcl9idWZmZXJfc2l6ZShwcm9jLCBidWZmZXIpOwotCi0JCWlmIChzaXplIDwgYnVmZmVyX3NpemUpIHsKLQkJCWJlc3RfZml0ID0gbjsKLQkJCW4gPSBuLT5yYl9sZWZ0OwotCQl9IGVsc2UgaWYgKHNpemUgPiBidWZmZXJfc2l6ZSkKLQkJCW4gPSBuLT5yYl9yaWdodDsKLQkJZWxzZSB7Ci0JCQliZXN0X2ZpdCA9IG47Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoYmVzdF9maXQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgc2l6ZSAlemQgZmFpbGVkLCAiCi0JCSAgICAgICAibm8gYWRkcmVzcyBzcGFjZVxuIiwgcHJvYy0+cGlkLCBzaXplKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChuID09IE5VTEwpIHsKLQkJYnVmZmVyID0gcmJfZW50cnkoYmVzdF9maXQsIHN0cnVjdCBiaW5kZXJfYnVmZmVyLCByYl9ub2RlKTsKLQkJYnVmZmVyX3NpemUgPSBiaW5kZXJfYnVmZmVyX3NpemUocHJvYywgYnVmZmVyKTsKLQl9Ci0KLQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQywKLQkJICAgICAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBzaXplICV6ZCBnb3QgYnVmZiIKLQkJICAgICAiZXIgJXAgc2l6ZSAlemRcbiIsIHByb2MtPnBpZCwgc2l6ZSwgYnVmZmVyLCBidWZmZXJfc2l6ZSk7Ci0KLQloYXNfcGFnZV9hZGRyID0KLQkJKHZvaWQgKikoKCh1aW50cHRyX3QpYnVmZmVyLT5kYXRhICsgYnVmZmVyX3NpemUpICYgUEFHRV9NQVNLKTsKLQlpZiAobiA9PSBOVUxMKSB7Ci0JCWlmIChzaXplICsgc2l6ZW9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyKSArIDQgPj0gYnVmZmVyX3NpemUpCi0JCQlidWZmZXJfc2l6ZSA9IHNpemU7IC8qIG5vIHJvb20gZm9yIG90aGVyIGJ1ZmZlcnMgKi8KLQkJZWxzZQotCQkJYnVmZmVyX3NpemUgPSBzaXplICsgc2l6ZW9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyKTsKLQl9Ci0JZW5kX3BhZ2VfYWRkciA9Ci0JCSh2b2lkICopUEFHRV9BTElHTigodWludHB0cl90KWJ1ZmZlci0+ZGF0YSArIGJ1ZmZlcl9zaXplKTsKLQlpZiAoZW5kX3BhZ2VfYWRkciA+IGhhc19wYWdlX2FkZHIpCi0JCWVuZF9wYWdlX2FkZHIgPSBoYXNfcGFnZV9hZGRyOwotCWlmIChiaW5kZXJfdXBkYXRlX3BhZ2VfcmFuZ2UocHJvYywgMSwKLQkgICAgKHZvaWQgKilQQUdFX0FMSUdOKCh1aW50cHRyX3QpYnVmZmVyLT5kYXRhKSwgZW5kX3BhZ2VfYWRkciwgTlVMTCkpCi0JCXJldHVybiBOVUxMOwotCi0JcmJfZXJhc2UoYmVzdF9maXQsICZwcm9jLT5mcmVlX2J1ZmZlcnMpOwotCWJ1ZmZlci0+ZnJlZSA9IDA7Ci0JYmluZGVyX2luc2VydF9hbGxvY2F0ZWRfYnVmZmVyKHByb2MsIGJ1ZmZlcik7Ci0JaWYgKGJ1ZmZlcl9zaXplICE9IHNpemUpIHsKLQkJc3RydWN0IGJpbmRlcl9idWZmZXIgKm5ld19idWZmZXIgPSAodm9pZCAqKWJ1ZmZlci0+ZGF0YSArIHNpemU7Ci0JCWxpc3RfYWRkKCZuZXdfYnVmZmVyLT5lbnRyeSwgJmJ1ZmZlci0+ZW50cnkpOwotCQluZXdfYnVmZmVyLT5mcmVlID0gMTsKLQkJYmluZGVyX2luc2VydF9mcmVlX2J1ZmZlcihwcm9jLCBuZXdfYnVmZmVyKTsKLQl9Ci0JYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MsCi0JCSAgICAgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgc2l6ZSAlemQgZ290ICIKLQkJICAgICAiJXBcbiIsIHByb2MtPnBpZCwgc2l6ZSwgYnVmZmVyKTsKLQlidWZmZXItPmRhdGFfc2l6ZSA9IGRhdGFfc2l6ZTsKLQlidWZmZXItPm9mZnNldHNfc2l6ZSA9IG9mZnNldHNfc2l6ZTsKLQlidWZmZXItPmFzeW5jX3RyYW5zYWN0aW9uID0gaXNfYXN5bmM7Ci0JaWYgKGlzX2FzeW5jKSB7Ci0JCXByb2MtPmZyZWVfYXN5bmNfc3BhY2UgLT0gc2l6ZSArIHNpemVvZihzdHJ1Y3QgYmluZGVyX2J1ZmZlcik7Ci0JCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DX0FTWU5DLAotCQkJICAgICAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBzaXplICV6ZCAiCi0JCQkgICAgICJhc3luYyBmcmVlICV6ZFxuIiwgcHJvYy0+cGlkLCBzaXplLAotCQkJICAgICBwcm9jLT5mcmVlX2FzeW5jX3NwYWNlKTsKLQl9Ci0KLQlyZXR1cm4gYnVmZmVyOwotfQotCi1zdGF0aWMgdm9pZCAqYnVmZmVyX3N0YXJ0X3BhZ2Uoc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlyZXR1cm4gKHZvaWQgKikoKHVpbnRwdHJfdClidWZmZXIgJiBQQUdFX01BU0spOwotfQotCi1zdGF0aWMgdm9pZCAqYnVmZmVyX2VuZF9wYWdlKHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIpCi17Ci0JcmV0dXJuICh2b2lkICopKCgodWludHB0cl90KShidWZmZXIgKyAxKSAtIDEpICYgUEFHRV9NQVNLKTsKLX0KLQotc3RhdGljIHZvaWQgYmluZGVyX2RlbGV0ZV9mcmVlX2J1ZmZlcihzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkJICAgICAgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqcHJldiwgKm5leHQgPSBOVUxMOwotCWludCBmcmVlX3BhZ2VfZW5kID0gMTsKLQlpbnQgZnJlZV9wYWdlX3N0YXJ0ID0gMTsKLQotCUJVR19PTihwcm9jLT5idWZmZXJzLm5leHQgPT0gJmJ1ZmZlci0+ZW50cnkpOwotCXByZXYgPSBsaXN0X2VudHJ5KGJ1ZmZlci0+ZW50cnkucHJldiwgc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KTsKLQlCVUdfT04oIXByZXYtPmZyZWUpOwotCWlmIChidWZmZXJfZW5kX3BhZ2UocHJldikgPT0gYnVmZmVyX3N0YXJ0X3BhZ2UoYnVmZmVyKSkgewotCQlmcmVlX3BhZ2Vfc3RhcnQgPSAwOwotCQlpZiAoYnVmZmVyX2VuZF9wYWdlKHByZXYpID09IGJ1ZmZlcl9lbmRfcGFnZShidWZmZXIpKQotCQkJZnJlZV9wYWdlX2VuZCA9IDA7Ci0JCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DLAotCQkJICAgICAiYmluZGVyOiAlZDogbWVyZ2UgZnJlZSwgYnVmZmVyICVwICIKLQkJCSAgICAgInNoYXJlIHBhZ2Ugd2l0aCAlcFxuIiwgcHJvYy0+cGlkLCBidWZmZXIsIHByZXYpOwotCX0KLQotCWlmICghbGlzdF9pc19sYXN0KCZidWZmZXItPmVudHJ5LCAmcHJvYy0+YnVmZmVycykpIHsKLQkJbmV4dCA9IGxpc3RfZW50cnkoYnVmZmVyLT5lbnRyeS5uZXh0LAotCQkJCSAgc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KTsKLQkJaWYgKGJ1ZmZlcl9zdGFydF9wYWdlKG5leHQpID09IGJ1ZmZlcl9lbmRfcGFnZShidWZmZXIpKSB7Ci0JCQlmcmVlX3BhZ2VfZW5kID0gMDsKLQkJCWlmIChidWZmZXJfc3RhcnRfcGFnZShuZXh0KSA9PQotCQkJICAgIGJ1ZmZlcl9zdGFydF9wYWdlKGJ1ZmZlcikpCi0JCQkJZnJlZV9wYWdlX3N0YXJ0ID0gMDsKLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DLAotCQkJCSAgICAgImJpbmRlcjogJWQ6IG1lcmdlIGZyZWUsIGJ1ZmZlciIKLQkJCQkgICAgICIgJXAgc2hhcmUgcGFnZSB3aXRoICVwXG4iLCBwcm9jLT5waWQsCi0JCQkJICAgICBidWZmZXIsIHByZXYpOwotCQl9Ci0JfQotCWxpc3RfZGVsKCZidWZmZXItPmVudHJ5KTsKLQlpZiAoZnJlZV9wYWdlX3N0YXJ0IHx8IGZyZWVfcGFnZV9lbmQpIHsKLQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MsCi0JCQkgICAgICJiaW5kZXI6ICVkOiBtZXJnZSBmcmVlLCBidWZmZXIgJXAgZG8gIgotCQkJICAgICAibm90IHNoYXJlIHBhZ2UlcyVzIHdpdGggd2l0aCAlcCBvciAlcFxuIiwKLQkJCSAgICAgcHJvYy0+cGlkLCBidWZmZXIsIGZyZWVfcGFnZV9zdGFydCA/ICIiIDogIiBlbmQiLAotCQkJICAgICBmcmVlX3BhZ2VfZW5kID8gIiIgOiAiIHN0YXJ0IiwgcHJldiwgbmV4dCk7Ci0JCWJpbmRlcl91cGRhdGVfcGFnZV9yYW5nZShwcm9jLCAwLCBmcmVlX3BhZ2Vfc3RhcnQgPwotCQkJYnVmZmVyX3N0YXJ0X3BhZ2UoYnVmZmVyKSA6IGJ1ZmZlcl9lbmRfcGFnZShidWZmZXIpLAotCQkJKGZyZWVfcGFnZV9lbmQgPyBidWZmZXJfZW5kX3BhZ2UoYnVmZmVyKSA6Ci0JCQlidWZmZXJfc3RhcnRfcGFnZShidWZmZXIpKSArIFBBR0VfU0laRSwgTlVMTCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBiaW5kZXJfZnJlZV9idWYoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLAotCQkJICAgIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIpCi17Ci0Jc2l6ZV90IHNpemUsIGJ1ZmZlcl9zaXplOwotCi0JYnVmZmVyX3NpemUgPSBiaW5kZXJfYnVmZmVyX3NpemUocHJvYywgYnVmZmVyKTsKLQotCXNpemUgPSBBTElHTihidWZmZXItPmRhdGFfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpICsKLQkJQUxJR04oYnVmZmVyLT5vZmZzZXRzX3NpemUsIHNpemVvZih2b2lkICopKTsKLQotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DLAotCQkgICAgICJiaW5kZXI6ICVkOiBiaW5kZXJfZnJlZV9idWYgJXAgc2l6ZSAlemQgYnVmZmVyIgotCQkgICAgICJfc2l6ZSAlemRcbiIsIHByb2MtPnBpZCwgYnVmZmVyLCBzaXplLCBidWZmZXJfc2l6ZSk7Ci0KLQlCVUdfT04oYnVmZmVyLT5mcmVlKTsKLQlCVUdfT04oc2l6ZSA+IGJ1ZmZlcl9zaXplKTsKLQlCVUdfT04oYnVmZmVyLT50cmFuc2FjdGlvbiAhPSBOVUxMKTsKLQlCVUdfT04oKHZvaWQgKilidWZmZXIgPCBwcm9jLT5idWZmZXIpOwotCUJVR19PTigodm9pZCAqKWJ1ZmZlciA+IHByb2MtPmJ1ZmZlciArIHByb2MtPmJ1ZmZlcl9zaXplKTsKLQotCWlmIChidWZmZXItPmFzeW5jX3RyYW5zYWN0aW9uKSB7Ci0JCXByb2MtPmZyZWVfYXN5bmNfc3BhY2UgKz0gc2l6ZSArIHNpemVvZihzdHJ1Y3QgYmluZGVyX2J1ZmZlcik7Ci0KLQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0NfQVNZTkMsCi0JCQkgICAgICJiaW5kZXI6ICVkOiBiaW5kZXJfZnJlZV9idWYgc2l6ZSAlemQgIgotCQkJICAgICAiYXN5bmMgZnJlZSAlemRcbiIsIHByb2MtPnBpZCwgc2l6ZSwKLQkJCSAgICAgcHJvYy0+ZnJlZV9hc3luY19zcGFjZSk7Ci0JfQotCi0JYmluZGVyX3VwZGF0ZV9wYWdlX3JhbmdlKHByb2MsIDAsCi0JCSh2b2lkICopUEFHRV9BTElHTigodWludHB0cl90KWJ1ZmZlci0+ZGF0YSksCi0JCSh2b2lkICopKCgodWludHB0cl90KWJ1ZmZlci0+ZGF0YSArIGJ1ZmZlcl9zaXplKSAmIFBBR0VfTUFTSyksCi0JCU5VTEwpOwotCXJiX2VyYXNlKCZidWZmZXItPnJiX25vZGUsICZwcm9jLT5hbGxvY2F0ZWRfYnVmZmVycyk7Ci0JYnVmZmVyLT5mcmVlID0gMTsKLQlpZiAoIWxpc3RfaXNfbGFzdCgmYnVmZmVyLT5lbnRyeSwgJnByb2MtPmJ1ZmZlcnMpKSB7Ci0JCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpuZXh0ID0gbGlzdF9lbnRyeShidWZmZXItPmVudHJ5Lm5leHQsCi0JCQkJCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgZW50cnkpOwotCQlpZiAobmV4dC0+ZnJlZSkgewotCQkJcmJfZXJhc2UoJm5leHQtPnJiX25vZGUsICZwcm9jLT5mcmVlX2J1ZmZlcnMpOwotCQkJYmluZGVyX2RlbGV0ZV9mcmVlX2J1ZmZlcihwcm9jLCBuZXh0KTsKLQkJfQotCX0KLQlpZiAocHJvYy0+YnVmZmVycy5uZXh0ICE9ICZidWZmZXItPmVudHJ5KSB7Ci0JCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpwcmV2ID0gbGlzdF9lbnRyeShidWZmZXItPmVudHJ5LnByZXYsCi0JCQkJCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgZW50cnkpOwotCQlpZiAocHJldi0+ZnJlZSkgewotCQkJYmluZGVyX2RlbGV0ZV9mcmVlX2J1ZmZlcihwcm9jLCBidWZmZXIpOwotCQkJcmJfZXJhc2UoJnByZXYtPnJiX25vZGUsICZwcm9jLT5mcmVlX2J1ZmZlcnMpOwotCQkJYnVmZmVyID0gcHJldjsKLQkJfQotCX0KLQliaW5kZXJfaW5zZXJ0X2ZyZWVfYnVmZmVyKHByb2MsIGJ1ZmZlcik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluZGVyX25vZGUgKmJpbmRlcl9nZXRfbm9kZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkJCSAgIHZvaWQgX191c2VyICpwdHIpCi17Ci0Jc3RydWN0IHJiX25vZGUgKm4gPSBwcm9jLT5ub2Rlcy5yYl9ub2RlOwotCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKLQotCXdoaWxlIChuKSB7Ci0JCW5vZGUgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX25vZGUsIHJiX25vZGUpOwotCi0JCWlmIChwdHIgPCBub2RlLT5wdHIpCi0JCQluID0gbi0+cmJfbGVmdDsKLQkJZWxzZSBpZiAocHRyID4gbm9kZS0+cHRyKQotCQkJbiA9IG4tPnJiX3JpZ2h0OwotCQllbHNlCi0JCQlyZXR1cm4gbm9kZTsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluZGVyX25vZGUgKmJpbmRlcl9uZXdfbm9kZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkJCSAgIHZvaWQgX191c2VyICpwdHIsCi0JCQkJCSAgIHZvaWQgX191c2VyICpjb29raWUpCi17Ci0Jc3RydWN0IHJiX25vZGUgKipwID0gJnByb2MtPm5vZGVzLnJiX25vZGU7Ci0Jc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7Ci0Jc3RydWN0IGJpbmRlcl9ub2RlICpub2RlOwotCi0Jd2hpbGUgKCpwKSB7Ci0JCXBhcmVudCA9ICpwOwotCQlub2RlID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgYmluZGVyX25vZGUsIHJiX25vZGUpOwotCi0JCWlmIChwdHIgPCBub2RlLT5wdHIpCi0JCQlwID0gJigqcCktPnJiX2xlZnQ7Ci0JCWVsc2UgaWYgKHB0ciA+IG5vZGUtPnB0cikKLQkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7Ci0JCWVsc2UKLQkJCXJldHVybiBOVUxMOwotCX0KLQotCW5vZGUgPSBremFsbG9jKHNpemVvZigqbm9kZSksIEdGUF9LRVJORUwpOwotCWlmIChub2RlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWJpbmRlcl9zdGF0c19jcmVhdGVkKEJJTkRFUl9TVEFUX05PREUpOwotCXJiX2xpbmtfbm9kZSgmbm9kZS0+cmJfbm9kZSwgcGFyZW50LCBwKTsKLQlyYl9pbnNlcnRfY29sb3IoJm5vZGUtPnJiX25vZGUsICZwcm9jLT5ub2Rlcyk7Ci0Jbm9kZS0+ZGVidWdfaWQgPSArK2JpbmRlcl9sYXN0X2lkOwotCW5vZGUtPnByb2MgPSBwcm9jOwotCW5vZGUtPnB0ciA9IHB0cjsKLQlub2RlLT5jb29raWUgPSBjb29raWU7Ci0Jbm9kZS0+d29yay50eXBlID0gQklOREVSX1dPUktfTk9ERTsKLQlJTklUX0xJU1RfSEVBRCgmbm9kZS0+d29yay5lbnRyeSk7Ci0JSU5JVF9MSVNUX0hFQUQoJm5vZGUtPmFzeW5jX3RvZG8pOwotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUywKLQkJICAgICAiYmluZGVyOiAlZDolZCBub2RlICVkIHUlcCBjJXAgY3JlYXRlZFxuIiwKLQkJICAgICBwcm9jLT5waWQsIGN1cnJlbnQtPnBpZCwgbm9kZS0+ZGVidWdfaWQsCi0JCSAgICAgbm9kZS0+cHRyLCBub2RlLT5jb29raWUpOwotCXJldHVybiBub2RlOwotfQotCi1zdGF0aWMgaW50IGJpbmRlcl9pbmNfbm9kZShzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUsIGludCBzdHJvbmcsIGludCBpbnRlcm5hbCwKLQkJCSAgIHN0cnVjdCBsaXN0X2hlYWQgKnRhcmdldF9saXN0KQotewotCWlmIChzdHJvbmcpIHsKLQkJaWYgKGludGVybmFsKSB7Ci0JCQlpZiAodGFyZ2V0X2xpc3QgPT0gTlVMTCAmJgotCQkJICAgIG5vZGUtPmludGVybmFsX3N0cm9uZ19yZWZzID09IDAgJiYKLQkJCSAgICAhKG5vZGUgPT0gYmluZGVyX2NvbnRleHRfbWdyX25vZGUgJiYKLQkJCSAgICBub2RlLT5oYXNfc3Ryb25nX3JlZikpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogaW52YWxpZCBpbmMgc3Ryb25nICIKLQkJCQkJIm5vZGUgZm9yICVkXG4iLCBub2RlLT5kZWJ1Z19pZCk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlub2RlLT5pbnRlcm5hbF9zdHJvbmdfcmVmcysrOwotCQl9IGVsc2UKLQkJCW5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzKys7Ci0JCWlmICghbm9kZS0+aGFzX3N0cm9uZ19yZWYgJiYgdGFyZ2V0X2xpc3QpIHsKLQkJCWxpc3RfZGVsX2luaXQoJm5vZGUtPndvcmsuZW50cnkpOwotCQkJbGlzdF9hZGRfdGFpbCgmbm9kZS0+d29yay5lbnRyeSwgdGFyZ2V0X2xpc3QpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCFpbnRlcm5hbCkKLQkJCW5vZGUtPmxvY2FsX3dlYWtfcmVmcysrOwotCQlpZiAoIW5vZGUtPmhhc193ZWFrX3JlZiAmJiBsaXN0X2VtcHR5KCZub2RlLT53b3JrLmVudHJ5KSkgewotCQkJaWYgKHRhcmdldF9saXN0ID09IE5VTEwpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogaW52YWxpZCBpbmMgd2VhayBub2RlICIKLQkJCQkJImZvciAlZFxuIiwgbm9kZS0+ZGVidWdfaWQpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJbGlzdF9hZGRfdGFpbCgmbm9kZS0+d29yay5lbnRyeSwgdGFyZ2V0X2xpc3QpOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJpbmRlcl9kZWNfbm9kZShzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUsIGludCBzdHJvbmcsIGludCBpbnRlcm5hbCkKLXsKLQlpZiAoc3Ryb25nKSB7Ci0JCWlmIChpbnRlcm5hbCkKLQkJCW5vZGUtPmludGVybmFsX3N0cm9uZ19yZWZzLS07Ci0JCWVsc2UKLQkJCW5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzLS07Ci0JCWlmIChub2RlLT5sb2NhbF9zdHJvbmdfcmVmcyB8fCBub2RlLT5pbnRlcm5hbF9zdHJvbmdfcmVmcykKLQkJCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCWlmICghaW50ZXJuYWwpCi0JCQlub2RlLT5sb2NhbF93ZWFrX3JlZnMtLTsKLQkJaWYgKG5vZGUtPmxvY2FsX3dlYWtfcmVmcyB8fCAhaGxpc3RfZW1wdHkoJm5vZGUtPnJlZnMpKQotCQkJcmV0dXJuIDA7Ci0JfQotCWlmIChub2RlLT5wcm9jICYmIChub2RlLT5oYXNfc3Ryb25nX3JlZiB8fCBub2RlLT5oYXNfd2Vha19yZWYpKSB7Ci0JCWlmIChsaXN0X2VtcHR5KCZub2RlLT53b3JrLmVudHJ5KSkgewotCQkJbGlzdF9hZGRfdGFpbCgmbm9kZS0+d29yay5lbnRyeSwgJm5vZGUtPnByb2MtPnRvZG8pOwotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZub2RlLT5wcm9jLT53YWl0KTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChobGlzdF9lbXB0eSgmbm9kZS0+cmVmcykgJiYgIW5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzICYmCi0JCSAgICAhbm9kZS0+bG9jYWxfd2Vha19yZWZzKSB7Ci0JCQlsaXN0X2RlbF9pbml0KCZub2RlLT53b3JrLmVudHJ5KTsKLQkJCWlmIChub2RlLT5wcm9jKSB7Ci0JCQkJcmJfZXJhc2UoJm5vZGUtPnJiX25vZGUsICZub2RlLT5wcm9jLT5ub2Rlcyk7Ci0JCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTLAotCQkJCQkgICAgICJiaW5kZXI6IHJlZmxlc3Mgbm9kZSAlZCBkZWxldGVkXG4iLAotCQkJCQkgICAgIG5vZGUtPmRlYnVnX2lkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaGxpc3RfZGVsKCZub2RlLT5kZWFkX25vZGUpOwotCQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUywKLQkJCQkJICAgICAiYmluZGVyOiBkZWFkIG5vZGUgJWQgZGVsZXRlZFxuIiwKLQkJCQkJICAgICBub2RlLT5kZWJ1Z19pZCk7Ci0JCQl9Ci0JCQlrZnJlZShub2RlKTsKLQkJCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX05PREUpOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBiaW5kZXJfcmVmICpiaW5kZXJfZ2V0X3JlZihzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkJCSB1aW50MzJfdCBkZXNjKQotewotCXN0cnVjdCByYl9ub2RlICpuID0gcHJvYy0+cmVmc19ieV9kZXNjLnJiX25vZGU7Ci0Jc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKLQotCXdoaWxlIChuKSB7Ci0JCXJlZiA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfcmVmLCByYl9ub2RlX2Rlc2MpOwotCi0JCWlmIChkZXNjIDwgcmVmLT5kZXNjKQotCQkJbiA9IG4tPnJiX2xlZnQ7Ci0JCWVsc2UgaWYgKGRlc2MgPiByZWYtPmRlc2MpCi0JCQluID0gbi0+cmJfcmlnaHQ7Ci0JCWVsc2UKLQkJCXJldHVybiByZWY7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0IGJpbmRlcl9yZWYgKmJpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCQkJCSAgc3RydWN0IGJpbmRlcl9ub2RlICpub2RlKQotewotCXN0cnVjdCByYl9ub2RlICpuOwotCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwcm9jLT5yZWZzX2J5X25vZGUucmJfbm9kZTsKLQlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKLQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmLCAqbmV3X3JlZjsKLQotCXdoaWxlICgqcCkgewotCQlwYXJlbnQgPSAqcDsKLQkJcmVmID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgYmluZGVyX3JlZiwgcmJfbm9kZV9ub2RlKTsKLQotCQlpZiAobm9kZSA8IHJlZi0+bm9kZSkKLQkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKLQkJZWxzZSBpZiAobm9kZSA+IHJlZi0+bm9kZSkKLQkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7Ci0JCWVsc2UKLQkJCXJldHVybiByZWY7Ci0JfQotCW5ld19yZWYgPSBremFsbG9jKHNpemVvZigqcmVmKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG5ld19yZWYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYmluZGVyX3N0YXRzX2NyZWF0ZWQoQklOREVSX1NUQVRfUkVGKTsKLQluZXdfcmVmLT5kZWJ1Z19pZCA9ICsrYmluZGVyX2xhc3RfaWQ7Ci0JbmV3X3JlZi0+cHJvYyA9IHByb2M7Ci0JbmV3X3JlZi0+bm9kZSA9IG5vZGU7Ci0JcmJfbGlua19ub2RlKCZuZXdfcmVmLT5yYl9ub2RlX25vZGUsIHBhcmVudCwgcCk7Ci0JcmJfaW5zZXJ0X2NvbG9yKCZuZXdfcmVmLT5yYl9ub2RlX25vZGUsICZwcm9jLT5yZWZzX2J5X25vZGUpOwotCi0JbmV3X3JlZi0+ZGVzYyA9IChub2RlID09IGJpbmRlcl9jb250ZXh0X21ncl9ub2RlKSA/IDAgOiAxOwotCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT5yZWZzX2J5X2Rlc2MpOyBuICE9IE5VTEw7IG4gPSByYl9uZXh0KG4pKSB7Ci0JCXJlZiA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfcmVmLCByYl9ub2RlX2Rlc2MpOwotCQlpZiAocmVmLT5kZXNjID4gbmV3X3JlZi0+ZGVzYykKLQkJCWJyZWFrOwotCQluZXdfcmVmLT5kZXNjID0gcmVmLT5kZXNjICsgMTsKLQl9Ci0KLQlwID0gJnByb2MtPnJlZnNfYnlfZGVzYy5yYl9ub2RlOwotCXdoaWxlICgqcCkgewotCQlwYXJlbnQgPSAqcDsKLQkJcmVmID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgYmluZGVyX3JlZiwgcmJfbm9kZV9kZXNjKTsKLQotCQlpZiAobmV3X3JlZi0+ZGVzYyA8IHJlZi0+ZGVzYykKLQkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKLQkJZWxzZSBpZiAobmV3X3JlZi0+ZGVzYyA+IHJlZi0+ZGVzYykKLQkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7Ci0JCWVsc2UKLQkJCUJVRygpOwotCX0KLQlyYl9saW5rX25vZGUoJm5ld19yZWYtPnJiX25vZGVfZGVzYywgcGFyZW50LCBwKTsKLQlyYl9pbnNlcnRfY29sb3IoJm5ld19yZWYtPnJiX25vZGVfZGVzYywgJnByb2MtPnJlZnNfYnlfZGVzYyk7Ci0JaWYgKG5vZGUpIHsKLQkJaGxpc3RfYWRkX2hlYWQoJm5ld19yZWYtPm5vZGVfZW50cnksICZub2RlLT5yZWZzKTsKLQotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMsCi0JCQkgICAgICJiaW5kZXI6ICVkIG5ldyByZWYgJWQgZGVzYyAlZCBmb3IgIgotCQkJICAgICAibm9kZSAlZFxuIiwgcHJvYy0+cGlkLCBuZXdfcmVmLT5kZWJ1Z19pZCwKLQkJCSAgICAgbmV3X3JlZi0+ZGVzYywgbm9kZS0+ZGVidWdfaWQpOwotCX0gZWxzZSB7Ci0JCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUywKLQkJCSAgICAgImJpbmRlcjogJWQgbmV3IHJlZiAlZCBkZXNjICVkIGZvciAiCi0JCQkgICAgICJkZWFkIG5vZGVcbiIsIHByb2MtPnBpZCwgbmV3X3JlZi0+ZGVidWdfaWQsCi0JCQkgICAgICBuZXdfcmVmLT5kZXNjKTsKLQl9Ci0JcmV0dXJuIG5ld19yZWY7Ci19Ci0KLXN0YXRpYyB2b2lkIGJpbmRlcl9kZWxldGVfcmVmKHN0cnVjdCBiaW5kZXJfcmVmICpyZWYpCi17Ci0JYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTLAotCQkgICAgICJiaW5kZXI6ICVkIGRlbGV0ZSByZWYgJWQgZGVzYyAlZCBmb3IgIgotCQkgICAgICJub2RlICVkXG4iLCByZWYtPnByb2MtPnBpZCwgcmVmLT5kZWJ1Z19pZCwKLQkJICAgICByZWYtPmRlc2MsIHJlZi0+bm9kZS0+ZGVidWdfaWQpOwotCi0JcmJfZXJhc2UoJnJlZi0+cmJfbm9kZV9kZXNjLCAmcmVmLT5wcm9jLT5yZWZzX2J5X2Rlc2MpOwotCXJiX2VyYXNlKCZyZWYtPnJiX25vZGVfbm9kZSwgJnJlZi0+cHJvYy0+cmVmc19ieV9ub2RlKTsKLQlpZiAocmVmLT5zdHJvbmcpCi0JCWJpbmRlcl9kZWNfbm9kZShyZWYtPm5vZGUsIDEsIDEpOwotCWhsaXN0X2RlbCgmcmVmLT5ub2RlX2VudHJ5KTsKLQliaW5kZXJfZGVjX25vZGUocmVmLT5ub2RlLCAwLCAxKTsKLQlpZiAocmVmLT5kZWF0aCkgewotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0RFQURfQklOREVSLAotCQkJICAgICAiYmluZGVyOiAlZCBkZWxldGUgcmVmICVkIGRlc2MgJWQgIgotCQkJICAgICAiaGFzIGRlYXRoIG5vdGlmaWNhdGlvblxuIiwgcmVmLT5wcm9jLT5waWQsCi0JCQkgICAgIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYyk7Ci0JCWxpc3RfZGVsKCZyZWYtPmRlYXRoLT53b3JrLmVudHJ5KTsKLQkJa2ZyZWUocmVmLT5kZWF0aCk7Ci0JCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX0RFQVRIKTsKLQl9Ci0Ja2ZyZWUocmVmKTsKLQliaW5kZXJfc3RhdHNfZGVsZXRlZChCSU5ERVJfU1RBVF9SRUYpOwotfQotCi1zdGF0aWMgaW50IGJpbmRlcl9pbmNfcmVmKHN0cnVjdCBiaW5kZXJfcmVmICpyZWYsIGludCBzdHJvbmcsCi0JCQkgIHN0cnVjdCBsaXN0X2hlYWQgKnRhcmdldF9saXN0KQotewotCWludCByZXQ7Ci0JaWYgKHN0cm9uZykgewotCQlpZiAocmVmLT5zdHJvbmcgPT0gMCkgewotCQkJcmV0ID0gYmluZGVyX2luY19ub2RlKHJlZi0+bm9kZSwgMSwgMSwgdGFyZ2V0X2xpc3QpOwotCQkJaWYgKHJldCkKLQkJCQlyZXR1cm4gcmV0OwotCQl9Ci0JCXJlZi0+c3Ryb25nKys7Ci0JfSBlbHNlIHsKLQkJaWYgKHJlZi0+d2VhayA9PSAwKSB7Ci0JCQlyZXQgPSBiaW5kZXJfaW5jX25vZGUocmVmLT5ub2RlLCAwLCAxLCB0YXJnZXRfbGlzdCk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJcmVmLT53ZWFrKys7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgYmluZGVyX2RlY19yZWYoc3RydWN0IGJpbmRlcl9yZWYgKnJlZiwgaW50IHN0cm9uZykKLXsKLQlpZiAoc3Ryb25nKSB7Ci0JCWlmIChyZWYtPnN0cm9uZyA9PSAwKSB7Ci0JCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZCBpbnZhbGlkIGRlYyBzdHJvbmcsICIKLQkJCQkJICAicmVmICVkIGRlc2MgJWQgcyAlZCB3ICVkXG4iLAotCQkJCQkgIHJlZi0+cHJvYy0+cGlkLCByZWYtPmRlYnVnX2lkLAotCQkJCQkgIHJlZi0+ZGVzYywgcmVmLT5zdHJvbmcsIHJlZi0+d2Vhayk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlyZWYtPnN0cm9uZy0tOwotCQlpZiAocmVmLT5zdHJvbmcgPT0gMCkgewotCQkJaW50IHJldDsKLQkJCXJldCA9IGJpbmRlcl9kZWNfbm9kZShyZWYtPm5vZGUsIHN0cm9uZywgMSk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAocmVmLT53ZWFrID09IDApIHsKLQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkIGludmFsaWQgZGVjIHdlYWssICIKLQkJCQkJICAicmVmICVkIGRlc2MgJWQgcyAlZCB3ICVkXG4iLAotCQkJCQkgIHJlZi0+cHJvYy0+cGlkLCByZWYtPmRlYnVnX2lkLAotCQkJCQkgIHJlZi0+ZGVzYywgcmVmLT5zdHJvbmcsIHJlZi0+d2Vhayk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlyZWYtPndlYWstLTsKLQl9Ci0JaWYgKHJlZi0+c3Ryb25nID09IDAgJiYgcmVmLT53ZWFrID09IDApCi0JCWJpbmRlcl9kZWxldGVfcmVmKHJlZik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJpbmRlcl9wb3BfdHJhbnNhY3Rpb24oc3RydWN0IGJpbmRlcl90aHJlYWQgKnRhcmdldF90aHJlYWQsCi0JCQkJICAgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdCkKLXsKLQlpZiAodGFyZ2V0X3RocmVhZCkgewotCQlCVUdfT04odGFyZ2V0X3RocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgIT0gdCk7Ci0JCUJVR19PTih0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjay0+ZnJvbSAhPSB0YXJnZXRfdGhyZWFkKTsKLQkJdGFyZ2V0X3RocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgPQotCQkJdGFyZ2V0X3RocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2stPmZyb21fcGFyZW50OwotCQl0LT5mcm9tID0gTlVMTDsKLQl9Ci0JdC0+bmVlZF9yZXBseSA9IDA7Ci0JaWYgKHQtPmJ1ZmZlcikKLQkJdC0+YnVmZmVyLT50cmFuc2FjdGlvbiA9IE5VTEw7Ci0Ja2ZyZWUodCk7Ci0JYmluZGVyX3N0YXRzX2RlbGV0ZWQoQklOREVSX1NUQVRfVFJBTlNBQ1RJT04pOwotfQotCi1zdGF0aWMgdm9pZCBiaW5kZXJfc2VuZF9mYWlsZWRfcmVwbHkoc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdCwKLQkJCQkgICAgIHVpbnQzMl90IGVycm9yX2NvZGUpCi17Ci0Jc3RydWN0IGJpbmRlcl90aHJlYWQgKnRhcmdldF90aHJlYWQ7Ci0JQlVHX09OKHQtPmZsYWdzICYgVEZfT05FX1dBWSk7Ci0Jd2hpbGUgKDEpIHsKLQkJdGFyZ2V0X3RocmVhZCA9IHQtPmZyb207Ci0JCWlmICh0YXJnZXRfdGhyZWFkKSB7Ci0JCQlpZiAodGFyZ2V0X3RocmVhZC0+cmV0dXJuX2Vycm9yICE9IEJSX09LICYmCi0JCQkgICB0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IyID09IEJSX09LKSB7Ci0JCQkJdGFyZ2V0X3RocmVhZC0+cmV0dXJuX2Vycm9yMiA9Ci0JCQkJCXRhcmdldF90aHJlYWQtPnJldHVybl9lcnJvcjsKLQkJCQl0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IgPSBCUl9PSzsKLQkJCX0KLQkJCWlmICh0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IgPT0gQlJfT0spIHsKLQkJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0ZBSUxFRF9UUkFOU0FDVElPTiwKLQkJCQkJICAgICAiYmluZGVyOiBzZW5kIGZhaWxlZCByZXBseSBmb3IgIgotCQkJCQkgICAgICJ0cmFuc2FjdGlvbiAlZCB0byAlZDolZFxuIiwKLQkJCQkJICAgICAgdC0+ZGVidWdfaWQsIHRhcmdldF90aHJlYWQtPnByb2MtPnBpZCwKLQkJCQkJICAgICAgdGFyZ2V0X3RocmVhZC0+cGlkKTsKLQotCQkJCWJpbmRlcl9wb3BfdHJhbnNhY3Rpb24odGFyZ2V0X3RocmVhZCwgdCk7Ci0JCQkJdGFyZ2V0X3RocmVhZC0+cmV0dXJuX2Vycm9yID0gZXJyb3JfY29kZTsKLQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnRhcmdldF90aHJlYWQtPndhaXQpOwotCQkJfSBlbHNlIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogcmVwbHkgZmFpbGVkLCB0YXJnZXQgIgotCQkJCQkidGhyZWFkLCAlZDolZCwgaGFzIGVycm9yIGNvZGUgJWQgIgotCQkJCQkiYWxyZWFkeVxuIiwgdGFyZ2V0X3RocmVhZC0+cHJvYy0+cGlkLAotCQkJCQl0YXJnZXRfdGhyZWFkLT5waWQsCi0JCQkJCXRhcmdldF90aHJlYWQtPnJldHVybl9lcnJvcik7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSB7Ci0JCQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICpuZXh0ID0gdC0+ZnJvbV9wYXJlbnQ7Ci0KLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfRkFJTEVEX1RSQU5TQUNUSU9OLAotCQkJCSAgICAgImJpbmRlcjogc2VuZCBmYWlsZWQgcmVwbHkgIgotCQkJCSAgICAgImZvciB0cmFuc2FjdGlvbiAlZCwgdGFyZ2V0IGRlYWRcbiIsCi0JCQkJICAgICB0LT5kZWJ1Z19pZCk7Ci0KLQkJCWJpbmRlcl9wb3BfdHJhbnNhY3Rpb24odGFyZ2V0X3RocmVhZCwgdCk7Ci0JCQlpZiAobmV4dCA9PSBOVUxMKSB7Ci0JCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19ERUFEX0JJTkRFUiwKLQkJCQkJICAgICAiYmluZGVyOiByZXBseSBmYWlsZWQsIgotCQkJCQkgICAgICIgbm8gdGFyZ2V0IHRocmVhZCBhdCByb290XG4iKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0ID0gbmV4dDsKLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfREVBRF9CSU5ERVIsCi0JCQkJICAgICAiYmluZGVyOiByZXBseSBmYWlsZWQsIG5vIHRhcmdldCAiCi0JCQkJICAgICAidGhyZWFkIC0tIHJldHJ5ICVkXG4iLCB0LT5kZWJ1Z19pZCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJpbmRlcl90cmFuc2FjdGlvbl9idWZmZXJfcmVsZWFzZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkJCSAgICAgIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIsCi0JCQkJCSAgICAgIHNpemVfdCAqZmFpbGVkX2F0KQotewotCXNpemVfdCAqb2ZmcCwgKm9mZl9lbmQ7Ci0JaW50IGRlYnVnX2lkID0gYnVmZmVyLT5kZWJ1Z19pZDsKLQotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04sCi0JCSAgICAgImJpbmRlcjogJWQgYnVmZmVyIHJlbGVhc2UgJWQsIHNpemUgJXpkLSV6ZCwgZmFpbGVkIGF0ICVwXG4iLAotCQkgICAgIHByb2MtPnBpZCwgYnVmZmVyLT5kZWJ1Z19pZCwKLQkJICAgICBidWZmZXItPmRhdGFfc2l6ZSwgYnVmZmVyLT5vZmZzZXRzX3NpemUsIGZhaWxlZF9hdCk7Ci0KLQlpZiAoYnVmZmVyLT50YXJnZXRfbm9kZSkKLQkJYmluZGVyX2RlY19ub2RlKGJ1ZmZlci0+dGFyZ2V0X25vZGUsIDEsIDApOwotCi0Jb2ZmcCA9IChzaXplX3QgKikoYnVmZmVyLT5kYXRhICsgQUxJR04oYnVmZmVyLT5kYXRhX3NpemUsIHNpemVvZih2b2lkICopKSk7Ci0JaWYgKGZhaWxlZF9hdCkKLQkJb2ZmX2VuZCA9IGZhaWxlZF9hdDsKLQllbHNlCi0JCW9mZl9lbmQgPSAodm9pZCAqKW9mZnAgKyBidWZmZXItPm9mZnNldHNfc2l6ZTsKLQlmb3IgKDsgb2ZmcCA8IG9mZl9lbmQ7IG9mZnArKykgewotCQlzdHJ1Y3QgZmxhdF9iaW5kZXJfb2JqZWN0ICpmcDsKLQkJaWYgKCpvZmZwID4gYnVmZmVyLT5kYXRhX3NpemUgLSBzaXplb2YoKmZwKSB8fAotCQkgICAgYnVmZmVyLT5kYXRhX3NpemUgPCBzaXplb2YoKmZwKSB8fAotCQkgICAgIUlTX0FMSUdORUQoKm9mZnAsIHNpemVvZih2b2lkICopKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IHRyYW5zYWN0aW9uIHJlbGVhc2UgJWQgYmFkIgotCQkJCQkib2Zmc2V0ICV6ZCwgc2l6ZSAlemRcbiIsIGRlYnVnX2lkLAotCQkJCQkqb2ZmcCwgYnVmZmVyLT5kYXRhX3NpemUpOwotCQkJY29udGludWU7Ci0JCX0KLQkJZnAgPSAoc3RydWN0IGZsYXRfYmluZGVyX29iamVjdCAqKShidWZmZXItPmRhdGEgKyAqb2ZmcCk7Ci0JCXN3aXRjaCAoZnAtPnR5cGUpIHsKLQkJY2FzZSBCSU5ERVJfVFlQRV9CSU5ERVI6Ci0JCWNhc2UgQklOREVSX1RZUEVfV0VBS19CSU5ERVI6IHsKLQkJCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSA9IGJpbmRlcl9nZXRfbm9kZShwcm9jLCBmcC0+YmluZGVyKTsKLQkJCWlmIChub2RlID09IE5VTEwpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogdHJhbnNhY3Rpb24gcmVsZWFzZSAlZCIKLQkJCQkgICAgICAgIiBiYWQgbm9kZSAlcFxuIiwgZGVidWdfaWQsIGZwLT5iaW5kZXIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiwKLQkJCQkgICAgICIgICAgICAgIG5vZGUgJWQgdSVwXG4iLAotCQkJCSAgICAgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0cik7Ci0JCQliaW5kZXJfZGVjX25vZGUobm9kZSwgZnAtPnR5cGUgPT0gQklOREVSX1RZUEVfQklOREVSLCAwKTsKLQkJfSBicmVhazsKLQkJY2FzZSBCSU5ERVJfVFlQRV9IQU5ETEU6Ci0JCWNhc2UgQklOREVSX1RZUEVfV0VBS19IQU5ETEU6IHsKLQkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWYgPSBiaW5kZXJfZ2V0X3JlZihwcm9jLCBmcC0+aGFuZGxlKTsKLQkJCWlmIChyZWYgPT0gTlVMTCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiB0cmFuc2FjdGlvbiByZWxlYXNlICVkIgotCQkJCSAgICAgICAiIGJhZCBoYW5kbGUgJWxkXG4iLCBkZWJ1Z19pZCwKLQkJCQkgICAgICAgZnAtPmhhbmRsZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OLAotCQkJCSAgICAgIiAgICAgICAgcmVmICVkIGRlc2MgJWQgKG5vZGUgJWQpXG4iLAotCQkJCSAgICAgcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjLCByZWYtPm5vZGUtPmRlYnVnX2lkKTsKLQkJCWJpbmRlcl9kZWNfcmVmKHJlZiwgZnAtPnR5cGUgPT0gQklOREVSX1RZUEVfSEFORExFKTsKLQkJfSBicmVhazsKLQotCQljYXNlIEJJTkRFUl9UWVBFX0ZEOgotCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiwKLQkJCQkgICAgICIgICAgICAgIGZkICVsZFxuIiwgZnAtPmhhbmRsZSk7Ci0JCQlpZiAoZmFpbGVkX2F0KQotCQkJCXRhc2tfY2xvc2VfZmQocHJvYywgZnAtPmhhbmRsZSk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IHRyYW5zYWN0aW9uIHJlbGVhc2UgJWQgYmFkICIKLQkJCSAgICAgICAib2JqZWN0IHR5cGUgJWx4XG4iLCBkZWJ1Z19pZCwgZnAtPnR5cGUpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJpbmRlcl90cmFuc2FjdGlvbihzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkgICAgICAgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwKLQkJCSAgICAgICBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEgKnRyLCBpbnQgcmVwbHkpCi17Ci0Jc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdDsKLQlzdHJ1Y3QgYmluZGVyX3dvcmsgKnRjb21wbGV0ZTsKLQlzaXplX3QgKm9mZnAsICpvZmZfZW5kOwotCXN0cnVjdCBiaW5kZXJfcHJvYyAqdGFyZ2V0X3Byb2M7Ci0Jc3RydWN0IGJpbmRlcl90aHJlYWQgKnRhcmdldF90aHJlYWQgPSBOVUxMOwotCXN0cnVjdCBiaW5kZXJfbm9kZSAqdGFyZ2V0X25vZGUgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRhcmdldF9saXN0OwotCXdhaXRfcXVldWVfaGVhZF90ICp0YXJnZXRfd2FpdDsKLQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICppbl9yZXBseV90byA9IE5VTEw7Ci0Jc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgKmU7Ci0JdWludDMyX3QgcmV0dXJuX2Vycm9yOwotCi0JZSA9IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfYWRkKCZiaW5kZXJfdHJhbnNhY3Rpb25fbG9nKTsKLQllLT5jYWxsX3R5cGUgPSByZXBseSA/IDIgOiAhISh0ci0+ZmxhZ3MgJiBURl9PTkVfV0FZKTsKLQllLT5mcm9tX3Byb2MgPSBwcm9jLT5waWQ7Ci0JZS0+ZnJvbV90aHJlYWQgPSB0aHJlYWQtPnBpZDsKLQllLT50YXJnZXRfaGFuZGxlID0gdHItPnRhcmdldC5oYW5kbGU7Ci0JZS0+ZGF0YV9zaXplID0gdHItPmRhdGFfc2l6ZTsKLQllLT5vZmZzZXRzX3NpemUgPSB0ci0+b2Zmc2V0c19zaXplOwotCi0JaWYgKHJlcGx5KSB7Ci0JCWluX3JlcGx5X3RvID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjazsKLQkJaWYgKGluX3JlcGx5X3RvID09IE5VTEwpIHsKLQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCByZXBseSB0cmFuc2FjdGlvbiAiCi0JCQkJCSAgIndpdGggbm8gdHJhbnNhY3Rpb24gc3RhY2tcbiIsCi0JCQkJCSAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7Ci0JCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCQlnb3RvIGVycl9lbXB0eV9jYWxsX3N0YWNrOwotCQl9Ci0JCWJpbmRlcl9zZXRfbmljZShpbl9yZXBseV90by0+c2F2ZWRfcHJpb3JpdHkpOwotCQlpZiAoaW5fcmVwbHlfdG8tPnRvX3RocmVhZCAhPSB0aHJlYWQpIHsKLQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCByZXBseSB0cmFuc2FjdGlvbiAiCi0JCQkJIndpdGggYmFkIHRyYW5zYWN0aW9uIHN0YWNrLCIKLQkJCQkiIHRyYW5zYWN0aW9uICVkIGhhcyB0YXJnZXQgJWQ6JWRcbiIsCi0JCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgaW5fcmVwbHlfdG8tPmRlYnVnX2lkLAotCQkJCWluX3JlcGx5X3RvLT50b19wcm9jID8KLQkJCQlpbl9yZXBseV90by0+dG9fcHJvYy0+cGlkIDogMCwKLQkJCQlpbl9yZXBseV90by0+dG9fdGhyZWFkID8KLQkJCQlpbl9yZXBseV90by0+dG9fdGhyZWFkLT5waWQgOiAwKTsKLQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJCWluX3JlcGx5X3RvID0gTlVMTDsKLQkJCWdvdG8gZXJyX2JhZF9jYWxsX3N0YWNrOwotCQl9Ci0JCXRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgPSBpbl9yZXBseV90by0+dG9fcGFyZW50OwotCQl0YXJnZXRfdGhyZWFkID0gaW5fcmVwbHlfdG8tPmZyb207Ci0JCWlmICh0YXJnZXRfdGhyZWFkID09IE5VTEwpIHsKLQkJCXJldHVybl9lcnJvciA9IEJSX0RFQURfUkVQTFk7Ci0JCQlnb3RvIGVycl9kZWFkX2JpbmRlcjsKLQkJfQotCQlpZiAodGFyZ2V0X3RocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgIT0gaW5fcmVwbHlfdG8pIHsKLQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCByZXBseSB0cmFuc2FjdGlvbiAiCi0JCQkJIndpdGggYmFkIHRhcmdldCB0cmFuc2FjdGlvbiBzdGFjayAlZCwgIgotCQkJCSJleHBlY3RlZCAlZFxuIiwKLQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAotCQkJCXRhcmdldF90aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrID8KLQkJCQl0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjay0+ZGVidWdfaWQgOiAwLAotCQkJCWluX3JlcGx5X3RvLT5kZWJ1Z19pZCk7Ci0JCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCQlpbl9yZXBseV90byA9IE5VTEw7Ci0JCQl0YXJnZXRfdGhyZWFkID0gTlVMTDsKLQkJCWdvdG8gZXJyX2RlYWRfYmluZGVyOwotCQl9Ci0JCXRhcmdldF9wcm9jID0gdGFyZ2V0X3RocmVhZC0+cHJvYzsKLQl9IGVsc2UgewotCQlpZiAodHItPnRhcmdldC5oYW5kbGUpIHsKLQkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWY7Ci0JCQlyZWYgPSBiaW5kZXJfZ2V0X3JlZihwcm9jLCB0ci0+dGFyZ2V0LmhhbmRsZSk7Ci0JCQlpZiAocmVmID09IE5VTEwpIHsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgIgotCQkJCQkidHJhbnNhY3Rpb24gdG8gaW52YWxpZCBoYW5kbGVcbiIsCi0JCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJCQlnb3RvIGVycl9pbnZhbGlkX3RhcmdldF9oYW5kbGU7Ci0JCQl9Ci0JCQl0YXJnZXRfbm9kZSA9IHJlZi0+bm9kZTsKLQkJfSBlbHNlIHsKLQkJCXRhcmdldF9ub2RlID0gYmluZGVyX2NvbnRleHRfbWdyX25vZGU7Ci0JCQlpZiAodGFyZ2V0X25vZGUgPT0gTlVMTCkgewotCQkJCXJldHVybl9lcnJvciA9IEJSX0RFQURfUkVQTFk7Ci0JCQkJZ290byBlcnJfbm9fY29udGV4dF9tZ3Jfbm9kZTsKLQkJCX0KLQkJfQotCQllLT50b19ub2RlID0gdGFyZ2V0X25vZGUtPmRlYnVnX2lkOwotCQl0YXJnZXRfcHJvYyA9IHRhcmdldF9ub2RlLT5wcm9jOwotCQlpZiAodGFyZ2V0X3Byb2MgPT0gTlVMTCkgewotCQkJcmV0dXJuX2Vycm9yID0gQlJfREVBRF9SRVBMWTsKLQkJCWdvdG8gZXJyX2RlYWRfYmluZGVyOwotCQl9Ci0JCWlmICghKHRyLT5mbGFncyAmIFRGX09ORV9XQVkpICYmIHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2spIHsKLQkJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnRtcDsKLQkJCXRtcCA9IHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2s7Ci0JCQlpZiAodG1wLT50b190aHJlYWQgIT0gdGhyZWFkKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IG5ldyAiCi0JCQkJCSJ0cmFuc2FjdGlvbiB3aXRoIGJhZCB0cmFuc2FjdGlvbiBzdGFjayIKLQkJCQkJIiwgdHJhbnNhY3Rpb24gJWQgaGFzIHRhcmdldCAlZDolZFxuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgdG1wLT5kZWJ1Z19pZCwKLQkJCQkJdG1wLT50b19wcm9jID8gdG1wLT50b19wcm9jLT5waWQgOiAwLAotCQkJCQl0bXAtPnRvX3RocmVhZCA/Ci0JCQkJCXRtcC0+dG9fdGhyZWFkLT5waWQgOiAwKTsKLQkJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCQkJZ290byBlcnJfYmFkX2NhbGxfc3RhY2s7Ci0JCQl9Ci0JCQl3aGlsZSAodG1wKSB7Ci0JCQkJaWYgKHRtcC0+ZnJvbSAmJiB0bXAtPmZyb20tPnByb2MgPT0gdGFyZ2V0X3Byb2MpCi0JCQkJCXRhcmdldF90aHJlYWQgPSB0bXAtPmZyb207Ci0JCQkJdG1wID0gdG1wLT5mcm9tX3BhcmVudDsKLQkJCX0KLQkJfQotCX0KLQlpZiAodGFyZ2V0X3RocmVhZCkgewotCQllLT50b190aHJlYWQgPSB0YXJnZXRfdGhyZWFkLT5waWQ7Ci0JCXRhcmdldF9saXN0ID0gJnRhcmdldF90aHJlYWQtPnRvZG87Ci0JCXRhcmdldF93YWl0ID0gJnRhcmdldF90aHJlYWQtPndhaXQ7Ci0JfSBlbHNlIHsKLQkJdGFyZ2V0X2xpc3QgPSAmdGFyZ2V0X3Byb2MtPnRvZG87Ci0JCXRhcmdldF93YWl0ID0gJnRhcmdldF9wcm9jLT53YWl0OwotCX0KLQllLT50b19wcm9jID0gdGFyZ2V0X3Byb2MtPnBpZDsKLQotCS8qIFRPRE86IHJldXNlIGluY29taW5nIHRyYW5zYWN0aW9uIGZvciByZXBseSAqLwotCXQgPSBremFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpOwotCWlmICh0ID09IE5VTEwpIHsKLQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQlnb3RvIGVycl9hbGxvY190X2ZhaWxlZDsKLQl9Ci0JYmluZGVyX3N0YXRzX2NyZWF0ZWQoQklOREVSX1NUQVRfVFJBTlNBQ1RJT04pOwotCi0JdGNvbXBsZXRlID0ga3phbGxvYyhzaXplb2YoKnRjb21wbGV0ZSksIEdGUF9LRVJORUwpOwotCWlmICh0Y29tcGxldGUgPT0gTlVMTCkgewotCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCWdvdG8gZXJyX2FsbG9jX3Rjb21wbGV0ZV9mYWlsZWQ7Ci0JfQotCWJpbmRlcl9zdGF0c19jcmVhdGVkKEJJTkRFUl9TVEFUX1RSQU5TQUNUSU9OX0NPTVBMRVRFKTsKLQotCXQtPmRlYnVnX2lkID0gKytiaW5kZXJfbGFzdF9pZDsKLQllLT5kZWJ1Z19pZCA9IHQtPmRlYnVnX2lkOwotCi0JaWYgKHJlcGx5KQotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OLAotCQkJICAgICAiYmluZGVyOiAlZDolZCBCQ19SRVBMWSAlZCAtPiAlZDolZCwgIgotCQkJICAgICAiZGF0YSAlcC0lcCBzaXplICV6ZC0lemRcbiIsCi0JCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHQtPmRlYnVnX2lkLAotCQkJICAgICB0YXJnZXRfcHJvYy0+cGlkLCB0YXJnZXRfdGhyZWFkLT5waWQsCi0JCQkgICAgIHRyLT5kYXRhLnB0ci5idWZmZXIsIHRyLT5kYXRhLnB0ci5vZmZzZXRzLAotCQkJICAgICB0ci0+ZGF0YV9zaXplLCB0ci0+b2Zmc2V0c19zaXplKTsKLQllbHNlCi0JCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04sCi0JCQkgICAgICJiaW5kZXI6ICVkOiVkIEJDX1RSQU5TQUNUSU9OICVkIC0+ICIKLQkJCSAgICAgIiVkIC0gbm9kZSAlZCwgZGF0YSAlcC0lcCBzaXplICV6ZC0lemRcbiIsCi0JCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHQtPmRlYnVnX2lkLAotCQkJICAgICB0YXJnZXRfcHJvYy0+cGlkLCB0YXJnZXRfbm9kZS0+ZGVidWdfaWQsCi0JCQkgICAgIHRyLT5kYXRhLnB0ci5idWZmZXIsIHRyLT5kYXRhLnB0ci5vZmZzZXRzLAotCQkJICAgICB0ci0+ZGF0YV9zaXplLCB0ci0+b2Zmc2V0c19zaXplKTsKLQotCWlmICghcmVwbHkgJiYgISh0ci0+ZmxhZ3MgJiBURl9PTkVfV0FZKSkKLQkJdC0+ZnJvbSA9IHRocmVhZDsKLQllbHNlCi0JCXQtPmZyb20gPSBOVUxMOwotCXQtPnNlbmRlcl9ldWlkID0gcHJvYy0+dHNrLT5jcmVkLT5ldWlkOwotCXQtPnRvX3Byb2MgPSB0YXJnZXRfcHJvYzsKLQl0LT50b190aHJlYWQgPSB0YXJnZXRfdGhyZWFkOwotCXQtPmNvZGUgPSB0ci0+Y29kZTsKLQl0LT5mbGFncyA9IHRyLT5mbGFnczsKLQl0LT5wcmlvcml0eSA9IHRhc2tfbmljZShjdXJyZW50KTsKLQl0LT5idWZmZXIgPSBiaW5kZXJfYWxsb2NfYnVmKHRhcmdldF9wcm9jLCB0ci0+ZGF0YV9zaXplLAotCQl0ci0+b2Zmc2V0c19zaXplLCAhcmVwbHkgJiYgKHQtPmZsYWdzICYgVEZfT05FX1dBWSkpOwotCWlmICh0LT5idWZmZXIgPT0gTlVMTCkgewotCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCWdvdG8gZXJyX2JpbmRlcl9hbGxvY19idWZfZmFpbGVkOwotCX0KLQl0LT5idWZmZXItPmFsbG93X3VzZXJfZnJlZSA9IDA7Ci0JdC0+YnVmZmVyLT5kZWJ1Z19pZCA9IHQtPmRlYnVnX2lkOwotCXQtPmJ1ZmZlci0+dHJhbnNhY3Rpb24gPSB0OwotCXQtPmJ1ZmZlci0+dGFyZ2V0X25vZGUgPSB0YXJnZXRfbm9kZTsKLQlpZiAodGFyZ2V0X25vZGUpCi0JCWJpbmRlcl9pbmNfbm9kZSh0YXJnZXRfbm9kZSwgMSwgMCwgTlVMTCk7Ci0KLQlvZmZwID0gKHNpemVfdCAqKSh0LT5idWZmZXItPmRhdGEgKyBBTElHTih0ci0+ZGF0YV9zaXplLCBzaXplb2Yodm9pZCAqKSkpOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKHQtPmJ1ZmZlci0+ZGF0YSwgdHItPmRhdGEucHRyLmJ1ZmZlciwgdHItPmRhdGFfc2l6ZSkpIHsKLQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCAiCi0JCQkiZGF0YSBwdHJcbiIsIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCWdvdG8gZXJyX2NvcHlfZGF0YV9mYWlsZWQ7Ci0JfQotCWlmIChjb3B5X2Zyb21fdXNlcihvZmZwLCB0ci0+ZGF0YS5wdHIub2Zmc2V0cywgdHItPm9mZnNldHNfc2l6ZSkpIHsKLQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCAiCi0JCQkib2Zmc2V0cyBwdHJcbiIsIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCWdvdG8gZXJyX2NvcHlfZGF0YV9mYWlsZWQ7Ci0JfQotCWlmICghSVNfQUxJR05FRCh0ci0+b2Zmc2V0c19zaXplLCBzaXplb2Yoc2l6ZV90KSkpIHsKLQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHRyYW5zYWN0aW9uIHdpdGggIgotCQkJImludmFsaWQgb2Zmc2V0cyBzaXplLCAlemRcbiIsCi0JCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCB0ci0+b2Zmc2V0c19zaXplKTsKLQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQlnb3RvIGVycl9iYWRfb2Zmc2V0OwotCX0KLQlvZmZfZW5kID0gKHZvaWQgKilvZmZwICsgdHItPm9mZnNldHNfc2l6ZTsKLQlmb3IgKDsgb2ZmcCA8IG9mZl9lbmQ7IG9mZnArKykgewotCQlzdHJ1Y3QgZmxhdF9iaW5kZXJfb2JqZWN0ICpmcDsKLQkJaWYgKCpvZmZwID4gdC0+YnVmZmVyLT5kYXRhX3NpemUgLSBzaXplb2YoKmZwKSB8fAotCQkgICAgdC0+YnVmZmVyLT5kYXRhX3NpemUgPCBzaXplb2YoKmZwKSB8fAotCQkgICAgIUlTX0FMSUdORUQoKm9mZnAsIHNpemVvZih2b2lkICopKSkgewotCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHRyYW5zYWN0aW9uIHdpdGggIgotCQkJCSJpbnZhbGlkIG9mZnNldCwgJXpkXG4iLAotCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsICpvZmZwKTsKLQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJCWdvdG8gZXJyX2JhZF9vZmZzZXQ7Ci0JCX0KLQkJZnAgPSAoc3RydWN0IGZsYXRfYmluZGVyX29iamVjdCAqKSh0LT5idWZmZXItPmRhdGEgKyAqb2ZmcCk7Ci0JCXN3aXRjaCAoZnAtPnR5cGUpIHsKLQkJY2FzZSBCSU5ERVJfVFlQRV9CSU5ERVI6Ci0JCWNhc2UgQklOREVSX1RZUEVfV0VBS19CSU5ERVI6IHsKLQkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWY7Ci0JCQlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUgPSBiaW5kZXJfZ2V0X25vZGUocHJvYywgZnAtPmJpbmRlcik7Ci0JCQlpZiAobm9kZSA9PSBOVUxMKSB7Ci0JCQkJbm9kZSA9IGJpbmRlcl9uZXdfbm9kZShwcm9jLCBmcC0+YmluZGVyLCBmcC0+Y29va2llKTsKLQkJCQlpZiAobm9kZSA9PSBOVUxMKSB7Ci0JCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJCQkJZ290byBlcnJfYmluZGVyX25ld19ub2RlX2ZhaWxlZDsKLQkJCQl9Ci0JCQkJbm9kZS0+bWluX3ByaW9yaXR5ID0gZnAtPmZsYWdzICYgRkxBVF9CSU5ERVJfRkxBR19QUklPUklUWV9NQVNLOwotCQkJCW5vZGUtPmFjY2VwdF9mZHMgPSAhIShmcC0+ZmxhZ3MgJiBGTEFUX0JJTkRFUl9GTEFHX0FDQ0VQVFNfRkRTKTsKLQkJCX0KLQkJCWlmIChmcC0+Y29va2llICE9IG5vZGUtPmNvb2tpZSkgewotCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIHNlbmRpbmcgdSVwICIKLQkJCQkJIm5vZGUgJWQsIGNvb2tpZSBtaXNtYXRjaCAlcCAhPSAlcFxuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCQkJZnAtPmJpbmRlciwgbm9kZS0+ZGVidWdfaWQsCi0JCQkJCWZwLT5jb29raWUsIG5vZGUtPmNvb2tpZSk7Ci0JCQkJZ290byBlcnJfYmluZGVyX2dldF9yZWZfZm9yX25vZGVfZmFpbGVkOwotCQkJfQotCQkJcmVmID0gYmluZGVyX2dldF9yZWZfZm9yX25vZGUodGFyZ2V0X3Byb2MsIG5vZGUpOwotCQkJaWYgKHJlZiA9PSBOVUxMKSB7Ci0JCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQkJCWdvdG8gZXJyX2JpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlX2ZhaWxlZDsKLQkJCX0KLQkJCWlmIChmcC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9CSU5ERVIpCi0JCQkJZnAtPnR5cGUgPSBCSU5ERVJfVFlQRV9IQU5ETEU7Ci0JCQllbHNlCi0JCQkJZnAtPnR5cGUgPSBCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRTsKLQkJCWZwLT5oYW5kbGUgPSByZWYtPmRlc2M7Ci0JCQliaW5kZXJfaW5jX3JlZihyZWYsIGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0hBTkRMRSwKLQkJCQkgICAgICAgJnRocmVhZC0+dG9kbyk7Ci0KLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04sCi0JCQkJICAgICAiICAgICAgICBub2RlICVkIHUlcCAtPiByZWYgJWQgZGVzYyAlZFxuIiwKLQkJCQkgICAgIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIHJlZi0+ZGVidWdfaWQsCi0JCQkJICAgICByZWYtPmRlc2MpOwotCQl9IGJyZWFrOwotCQljYXNlIEJJTkRFUl9UWVBFX0hBTkRMRToKLQkJY2FzZSBCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRTogewotCQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZiA9IGJpbmRlcl9nZXRfcmVmKHByb2MsIGZwLT5oYW5kbGUpOwotCQkJaWYgKHJlZiA9PSBOVUxMKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290ICIKLQkJCQkJInRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCAiCi0JCQkJCSJoYW5kbGUsICVsZFxuIiwgcHJvYy0+cGlkLAotCQkJCQl0aHJlYWQtPnBpZCwgZnAtPmhhbmRsZSk7Ci0JCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQkJCWdvdG8gZXJyX2JpbmRlcl9nZXRfcmVmX2ZhaWxlZDsKLQkJCX0KLQkJCWlmIChyZWYtPm5vZGUtPnByb2MgPT0gdGFyZ2V0X3Byb2MpIHsKLQkJCQlpZiAoZnAtPnR5cGUgPT0gQklOREVSX1RZUEVfSEFORExFKQotCQkJCQlmcC0+dHlwZSA9IEJJTkRFUl9UWVBFX0JJTkRFUjsKLQkJCQllbHNlCi0JCQkJCWZwLT50eXBlID0gQklOREVSX1RZUEVfV0VBS19CSU5ERVI7Ci0JCQkJZnAtPmJpbmRlciA9IHJlZi0+bm9kZS0+cHRyOwotCQkJCWZwLT5jb29raWUgPSByZWYtPm5vZGUtPmNvb2tpZTsKLQkJCQliaW5kZXJfaW5jX25vZGUocmVmLT5ub2RlLCBmcC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9CSU5ERVIsIDAsIE5VTEwpOwotCQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04sCi0JCQkJCSAgICAgIiAgICAgICAgcmVmICVkIGRlc2MgJWQgLT4gbm9kZSAlZCB1JXBcbiIsCi0JCQkJCSAgICAgcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjLCByZWYtPm5vZGUtPmRlYnVnX2lkLAotCQkJCQkgICAgIHJlZi0+bm9kZS0+cHRyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RydWN0IGJpbmRlcl9yZWYgKm5ld19yZWY7Ci0JCQkJbmV3X3JlZiA9IGJpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlKHRhcmdldF9wcm9jLCByZWYtPm5vZGUpOwotCQkJCWlmIChuZXdfcmVmID09IE5VTEwpIHsKLQkJCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQkJCQlnb3RvIGVycl9iaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZV9mYWlsZWQ7Ci0JCQkJfQotCQkJCWZwLT5oYW5kbGUgPSBuZXdfcmVmLT5kZXNjOwotCQkJCWJpbmRlcl9pbmNfcmVmKG5ld19yZWYsIGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0hBTkRMRSwgTlVMTCk7Ci0JCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiwKLQkJCQkJICAgICAiICAgICAgICByZWYgJWQgZGVzYyAlZCAtPiByZWYgJWQgZGVzYyAlZCAobm9kZSAlZClcbiIsCi0JCQkJCSAgICAgcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjLCBuZXdfcmVmLT5kZWJ1Z19pZCwKLQkJCQkJICAgICBuZXdfcmVmLT5kZXNjLCByZWYtPm5vZGUtPmRlYnVnX2lkKTsKLQkJCX0KLQkJfSBicmVhazsKLQotCQljYXNlIEJJTkRFUl9UWVBFX0ZEOiB7Ci0JCQlpbnQgdGFyZ2V0X2ZkOwotCQkJc3RydWN0IGZpbGUgKmZpbGU7Ci0KLQkJCWlmIChyZXBseSkgewotCQkJCWlmICghKGluX3JlcGx5X3RvLT5mbGFncyAmIFRGX0FDQ0VQVF9GRFMpKSB7Ci0JCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCByZXBseSB3aXRoIGZkLCAlbGQsIGJ1dCB0YXJnZXQgZG9lcyBub3QgYWxsb3cgZmRzXG4iLAotCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZnAtPmhhbmRsZSk7Ci0JCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJCQkJZ290byBlcnJfZmRfbm90X2FsbG93ZWQ7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICghdGFyZ2V0X25vZGUtPmFjY2VwdF9mZHMpIHsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBmZCwgJWxkLCBidXQgdGFyZ2V0IGRvZXMgbm90IGFsbG93IGZkc1xuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZnAtPmhhbmRsZSk7Ci0JCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQkJCWdvdG8gZXJyX2ZkX25vdF9hbGxvd2VkOwotCQkJfQotCi0JCQlmaWxlID0gZmdldChmcC0+aGFuZGxlKTsKLQkJCWlmIChmaWxlID09IE5VTEwpIHsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIGZkLCAlbGRcbiIsCi0JCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGZwLT5oYW5kbGUpOwotCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJCQlnb3RvIGVycl9mZ2V0X2ZhaWxlZDsKLQkJCX0KLQkJCXRhcmdldF9mZCA9IHRhc2tfZ2V0X3VudXNlZF9mZF9mbGFncyh0YXJnZXRfcHJvYywgT19DTE9FWEVDKTsKLQkJCWlmICh0YXJnZXRfZmQgPCAwKSB7Ci0JCQkJZnB1dChmaWxlKTsKLQkJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCQkJZ290byBlcnJfZ2V0X3VudXNlZF9mZF9mYWlsZWQ7Ci0JCQl9Ci0JCQl0YXNrX2ZkX2luc3RhbGwodGFyZ2V0X3Byb2MsIHRhcmdldF9mZCwgZmlsZSk7Ci0JCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OLAotCQkJCSAgICAgIiAgICAgICAgZmQgJWxkIC0+ICVkXG4iLCBmcC0+aGFuZGxlLCB0YXJnZXRfZmQpOwotCQkJLyogVE9ETzogZnB1dD8gKi8KLQkJCWZwLT5oYW5kbGUgPSB0YXJnZXRfZmQ7Ci0JCX0gYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCB0cmFuc2FjdGlvIgotCQkJCSJuIHdpdGggaW52YWxpZCBvYmplY3QgdHlwZSwgJWx4XG4iLAotCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGZwLT50eXBlKTsKLQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJCWdvdG8gZXJyX2JhZF9vYmplY3RfdHlwZTsKLQkJfQotCX0KLQlpZiAocmVwbHkpIHsKLQkJQlVHX09OKHQtPmJ1ZmZlci0+YXN5bmNfdHJhbnNhY3Rpb24gIT0gMCk7Ci0JCWJpbmRlcl9wb3BfdHJhbnNhY3Rpb24odGFyZ2V0X3RocmVhZCwgaW5fcmVwbHlfdG8pOwotCX0gZWxzZSBpZiAoISh0LT5mbGFncyAmIFRGX09ORV9XQVkpKSB7Ci0JCUJVR19PTih0LT5idWZmZXItPmFzeW5jX3RyYW5zYWN0aW9uICE9IDApOwotCQl0LT5uZWVkX3JlcGx5ID0gMTsKLQkJdC0+ZnJvbV9wYXJlbnQgPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrOwotCQl0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrID0gdDsKLQl9IGVsc2UgewotCQlCVUdfT04odGFyZ2V0X25vZGUgPT0gTlVMTCk7Ci0JCUJVR19PTih0LT5idWZmZXItPmFzeW5jX3RyYW5zYWN0aW9uICE9IDEpOwotCQlpZiAodGFyZ2V0X25vZGUtPmhhc19hc3luY190cmFuc2FjdGlvbikgewotCQkJdGFyZ2V0X2xpc3QgPSAmdGFyZ2V0X25vZGUtPmFzeW5jX3RvZG87Ci0JCQl0YXJnZXRfd2FpdCA9IE5VTEw7Ci0JCX0gZWxzZQotCQkJdGFyZ2V0X25vZGUtPmhhc19hc3luY190cmFuc2FjdGlvbiA9IDE7Ci0JfQotCXQtPndvcmsudHlwZSA9IEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OOwotCWxpc3RfYWRkX3RhaWwoJnQtPndvcmsuZW50cnksIHRhcmdldF9saXN0KTsKLQl0Y29tcGxldGUtPnR5cGUgPSBCSU5ERVJfV09SS19UUkFOU0FDVElPTl9DT01QTEVURTsKLQlsaXN0X2FkZF90YWlsKCZ0Y29tcGxldGUtPmVudHJ5LCAmdGhyZWFkLT50b2RvKTsKLQlpZiAodGFyZ2V0X3dhaXQpCi0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSh0YXJnZXRfd2FpdCk7Ci0JcmV0dXJuOwotCi1lcnJfZ2V0X3VudXNlZF9mZF9mYWlsZWQ6Ci1lcnJfZmdldF9mYWlsZWQ6Ci1lcnJfZmRfbm90X2FsbG93ZWQ6Ci1lcnJfYmluZGVyX2dldF9yZWZfZm9yX25vZGVfZmFpbGVkOgotZXJyX2JpbmRlcl9nZXRfcmVmX2ZhaWxlZDoKLWVycl9iaW5kZXJfbmV3X25vZGVfZmFpbGVkOgotZXJyX2JhZF9vYmplY3RfdHlwZToKLWVycl9iYWRfb2Zmc2V0OgotZXJyX2NvcHlfZGF0YV9mYWlsZWQ6Ci0JYmluZGVyX3RyYW5zYWN0aW9uX2J1ZmZlcl9yZWxlYXNlKHRhcmdldF9wcm9jLCB0LT5idWZmZXIsIG9mZnApOwotCXQtPmJ1ZmZlci0+dHJhbnNhY3Rpb24gPSBOVUxMOwotCWJpbmRlcl9mcmVlX2J1Zih0YXJnZXRfcHJvYywgdC0+YnVmZmVyKTsKLWVycl9iaW5kZXJfYWxsb2NfYnVmX2ZhaWxlZDoKLQlrZnJlZSh0Y29tcGxldGUpOwotCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX1RSQU5TQUNUSU9OX0NPTVBMRVRFKTsKLWVycl9hbGxvY190Y29tcGxldGVfZmFpbGVkOgotCWtmcmVlKHQpOwotCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX1RSQU5TQUNUSU9OKTsKLWVycl9hbGxvY190X2ZhaWxlZDoKLWVycl9iYWRfY2FsbF9zdGFjazoKLWVycl9lbXB0eV9jYWxsX3N0YWNrOgotZXJyX2RlYWRfYmluZGVyOgotZXJyX2ludmFsaWRfdGFyZ2V0X2hhbmRsZToKLWVycl9ub19jb250ZXh0X21ncl9ub2RlOgotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfRkFJTEVEX1RSQU5TQUNUSU9OLAotCQkgICAgICJiaW5kZXI6ICVkOiVkIHRyYW5zYWN0aW9uIGZhaWxlZCAlZCwgc2l6ZSAlemQtJXpkXG4iLAotCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHJldHVybl9lcnJvciwKLQkJICAgICB0ci0+ZGF0YV9zaXplLCB0ci0+b2Zmc2V0c19zaXplKTsKLQotCXsKLQkJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgKmZlOwotCQlmZSA9IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfYWRkKCZiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2ZhaWxlZCk7Ci0JCSpmZSA9ICplOwotCX0KLQotCUJVR19PTih0aHJlYWQtPnJldHVybl9lcnJvciAhPSBCUl9PSyk7Ci0JaWYgKGluX3JlcGx5X3RvKSB7Ci0JCXRocmVhZC0+cmV0dXJuX2Vycm9yID0gQlJfVFJBTlNBQ1RJT05fQ09NUExFVEU7Ci0JCWJpbmRlcl9zZW5kX2ZhaWxlZF9yZXBseShpbl9yZXBseV90bywgcmV0dXJuX2Vycm9yKTsKLQl9IGVsc2UKLQkJdGhyZWFkLT5yZXR1cm5fZXJyb3IgPSByZXR1cm5fZXJyb3I7Ci19Ci0KLWludCBiaW5kZXJfdGhyZWFkX3dyaXRlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwKLQkJCXZvaWQgX191c2VyICpidWZmZXIsIGludCBzaXplLCBzaWduZWQgbG9uZyAqY29uc3VtZWQpCi17Ci0JdWludDMyX3QgY21kOwotCXZvaWQgX191c2VyICpwdHIgPSBidWZmZXIgKyAqY29uc3VtZWQ7Ci0Jdm9pZCBfX3VzZXIgKmVuZCA9IGJ1ZmZlciArIHNpemU7Ci0KLQl3aGlsZSAocHRyIDwgZW5kICYmIHRocmVhZC0+cmV0dXJuX2Vycm9yID09IEJSX09LKSB7Ci0JCWlmIChnZXRfdXNlcihjbWQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXB0ciArPSBzaXplb2YodWludDMyX3QpOwotCQlpZiAoX0lPQ19OUihjbWQpIDwgQVJSQVlfU0laRShiaW5kZXJfc3RhdHMuYmMpKSB7Ci0JCQliaW5kZXJfc3RhdHMuYmNbX0lPQ19OUihjbWQpXSsrOwotCQkJcHJvYy0+c3RhdHMuYmNbX0lPQ19OUihjbWQpXSsrOwotCQkJdGhyZWFkLT5zdGF0cy5iY1tfSU9DX05SKGNtZCldKys7Ci0JCX0KLQkJc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBCQ19JTkNSRUZTOgotCQljYXNlIEJDX0FDUVVJUkU6Ci0JCWNhc2UgQkNfUkVMRUFTRToKLQkJY2FzZSBCQ19ERUNSRUZTOiB7Ci0JCQl1aW50MzJfdCB0YXJnZXQ7Ci0JCQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmOwotCQkJY29uc3QgY2hhciAqZGVidWdfc3RyaW5nOwotCi0JCQlpZiAoZ2V0X3VzZXIodGFyZ2V0LCAodWludDMyX3QgX191c2VyICopcHRyKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2YodWludDMyX3QpOwotCQkJaWYgKHRhcmdldCA9PSAwICYmIGJpbmRlcl9jb250ZXh0X21ncl9ub2RlICYmCi0JCQkgICAgKGNtZCA9PSBCQ19JTkNSRUZTIHx8IGNtZCA9PSBCQ19BQ1FVSVJFKSkgewotCQkJCXJlZiA9IGJpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlKHByb2MsCi0JCQkJCSAgICAgICBiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSk7Ci0JCQkJaWYgKHJlZi0+ZGVzYyAhPSB0YXJnZXQpIHsKLQkJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6IgotCQkJCQkJIiVkIHRyaWVkIHRvIGFjcXVpcmUgIgotCQkJCQkJInJlZmVyZW5jZSB0byBkZXNjIDAsICIKLQkJCQkJCSJnb3QgJWQgaW5zdGVhZFxuIiwKLQkJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCi0JCQkJCQlyZWYtPmRlc2MpOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXJlZiA9IGJpbmRlcl9nZXRfcmVmKHByb2MsIHRhcmdldCk7Ci0JCQlpZiAocmVmID09IE5VTEwpIHsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCByZWZjb3UiCi0JCQkJCSJudCBjaGFuZ2Ugb24gaW52YWxpZCByZWYgJWRcbiIsCi0JCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHRhcmdldCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzd2l0Y2ggKGNtZCkgewotCQkJY2FzZSBCQ19JTkNSRUZTOgotCQkJCWRlYnVnX3N0cmluZyA9ICJJbmNSZWZzIjsKLQkJCQliaW5kZXJfaW5jX3JlZihyZWYsIDAsIE5VTEwpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCQ19BQ1FVSVJFOgotCQkJCWRlYnVnX3N0cmluZyA9ICJBY3F1aXJlIjsKLQkJCQliaW5kZXJfaW5jX3JlZihyZWYsIDEsIE5VTEwpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCQ19SRUxFQVNFOgotCQkJCWRlYnVnX3N0cmluZyA9ICJSZWxlYXNlIjsKLQkJCQliaW5kZXJfZGVjX3JlZihyZWYsIDEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCQ19ERUNSRUZTOgotCQkJZGVmYXVsdDoKLQkJCQlkZWJ1Z19zdHJpbmcgPSAiRGVjUmVmcyI7Ci0JCQkJYmluZGVyX2RlY19yZWYocmVmLCAwKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVVNFUl9SRUZTLAotCQkJCSAgICAgImJpbmRlcjogJWQ6JWQgJXMgcmVmICVkIGRlc2MgJWQgcyAlZCB3ICVkIGZvciBub2RlICVkXG4iLAotCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZGVidWdfc3RyaW5nLCByZWYtPmRlYnVnX2lkLAotCQkJCSAgICAgcmVmLT5kZXNjLCByZWYtPnN0cm9uZywgcmVmLT53ZWFrLCByZWYtPm5vZGUtPmRlYnVnX2lkKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgQkNfSU5DUkVGU19ET05FOgotCQljYXNlIEJDX0FDUVVJUkVfRE9ORTogewotCQkJdm9pZCBfX3VzZXIgKm5vZGVfcHRyOwotCQkJdm9pZCAqY29va2llOwotCQkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlOwotCi0JCQlpZiAoZ2V0X3VzZXIobm9kZV9wdHIsICh2b2lkICogX191c2VyICopcHRyKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKLQkJCWlmIChnZXRfdXNlcihjb29raWUsICh2b2lkICogX191c2VyICopcHRyKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKLQkJCW5vZGUgPSBiaW5kZXJfZ2V0X25vZGUocHJvYywgbm9kZV9wdHIpOwotCQkJaWYgKG5vZGUgPT0gTlVMTCkgewotCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkICIKLQkJCQkJIiVzIHUlcCBubyBtYXRjaFxuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCQkJY21kID09IEJDX0lOQ1JFRlNfRE9ORSA/Ci0JCQkJCSJCQ19JTkNSRUZTX0RPTkUiIDoKLQkJCQkJIkJDX0FDUVVJUkVfRE9ORSIsCi0JCQkJCW5vZGVfcHRyKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjb29raWUgIT0gbm9kZS0+Y29va2llKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgJXMgdSVwIG5vZGUgJWQiCi0JCQkJCSIgY29va2llIG1pc21hdGNoICVwICE9ICVwXG4iLAotCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAotCQkJCQljbWQgPT0gQkNfSU5DUkVGU19ET05FID8KLQkJCQkJIkJDX0lOQ1JFRlNfRE9ORSIgOiAiQkNfQUNRVUlSRV9ET05FIiwKLQkJCQkJbm9kZV9wdHIsIG5vZGUtPmRlYnVnX2lkLAotCQkJCQljb29raWUsIG5vZGUtPmNvb2tpZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY21kID09IEJDX0FDUVVJUkVfRE9ORSkgewotCQkJCWlmIChub2RlLT5wZW5kaW5nX3N0cm9uZ19yZWYgPT0gMCkgewotCQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCAiCi0JCQkJCQkiQkNfQUNRVUlSRV9ET05FIG5vZGUgJWQgaGFzICIKLQkJCQkJCSJubyBwZW5kaW5nIGFjcXVpcmUgcmVxdWVzdFxuIiwKLQkJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCi0JCQkJCQlub2RlLT5kZWJ1Z19pZCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlub2RlLT5wZW5kaW5nX3N0cm9uZ19yZWYgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobm9kZS0+cGVuZGluZ193ZWFrX3JlZiA9PSAwKSB7Ci0JCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkICIKLQkJCQkJCSJCQ19JTkNSRUZTX0RPTkUgbm9kZSAlZCBoYXMgIgotCQkJCQkJIm5vIHBlbmRpbmcgaW5jcmVmcyByZXF1ZXN0XG4iLAotCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCQkJCW5vZGUtPmRlYnVnX2lkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCW5vZGUtPnBlbmRpbmdfd2Vha19yZWYgPSAwOwotCQkJfQotCQkJYmluZGVyX2RlY19ub2RlKG5vZGUsIGNtZCA9PSBCQ19BQ1FVSVJFX0RPTkUsIDApOwotCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19VU0VSX1JFRlMsCi0JCQkJICAgICAiYmluZGVyOiAlZDolZCAlcyBub2RlICVkIGxzICVkIGx3ICVkXG4iLAotCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCQkgICAgIGNtZCA9PSBCQ19JTkNSRUZTX0RPTkUgPyAiQkNfSU5DUkVGU19ET05FIiA6ICJCQ19BQ1FVSVJFX0RPTkUiLAotCQkJCSAgICAgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzLCBub2RlLT5sb2NhbF93ZWFrX3JlZnMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBCQ19BVFRFTVBUX0FDUVVJUkU6Ci0JCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogQkNfQVRURU1QVF9BQ1FVSVJFIG5vdCBzdXBwb3J0ZWRcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWNhc2UgQkNfQUNRVUlSRV9SRVNVTFQ6Ci0JCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogQkNfQUNRVUlSRV9SRVNVTFQgbm90IHN1cHBvcnRlZFxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQljYXNlIEJDX0ZSRUVfQlVGRkVSOiB7Ci0JCQl2b2lkIF9fdXNlciAqZGF0YV9wdHI7Ci0JCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOwotCi0JCQlpZiAoZ2V0X3VzZXIoZGF0YV9wdHIsICh2b2lkICogX191c2VyICopcHRyKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKLQotCQkJYnVmZmVyID0gYmluZGVyX2J1ZmZlcl9sb29rdXAocHJvYywgZGF0YV9wdHIpOwotCQkJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgIgotCQkJCQkiQkNfRlJFRV9CVUZGRVIgdSVwIG5vIG1hdGNoXG4iLAotCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBkYXRhX3B0cik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoIWJ1ZmZlci0+YWxsb3dfdXNlcl9mcmVlKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgIgotCQkJCQkiQkNfRlJFRV9CVUZGRVIgdSVwIG1hdGNoZWQgIgotCQkJCQkidW5yZXR1cm5lZCBidWZmZXJcbiIsCi0JCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGRhdGFfcHRyKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfRlJFRV9CVUZGRVIsCi0JCQkJICAgICAiYmluZGVyOiAlZDolZCBCQ19GUkVFX0JVRkZFUiB1JXAgZm91bmQgYnVmZmVyICVkIGZvciAlcyB0cmFuc2FjdGlvblxuIiwKLQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGRhdGFfcHRyLCBidWZmZXItPmRlYnVnX2lkLAotCQkJCSAgICAgYnVmZmVyLT50cmFuc2FjdGlvbiA/ICJhY3RpdmUiIDogImZpbmlzaGVkIik7Ci0KLQkJCWlmIChidWZmZXItPnRyYW5zYWN0aW9uKSB7Ci0JCQkJYnVmZmVyLT50cmFuc2FjdGlvbi0+YnVmZmVyID0gTlVMTDsKLQkJCQlidWZmZXItPnRyYW5zYWN0aW9uID0gTlVMTDsKLQkJCX0KLQkJCWlmIChidWZmZXItPmFzeW5jX3RyYW5zYWN0aW9uICYmIGJ1ZmZlci0+dGFyZ2V0X25vZGUpIHsKLQkJCQlCVUdfT04oIWJ1ZmZlci0+dGFyZ2V0X25vZGUtPmhhc19hc3luY190cmFuc2FjdGlvbik7Ci0JCQkJaWYgKGxpc3RfZW1wdHkoJmJ1ZmZlci0+dGFyZ2V0X25vZGUtPmFzeW5jX3RvZG8pKQotCQkJCQlidWZmZXItPnRhcmdldF9ub2RlLT5oYXNfYXN5bmNfdHJhbnNhY3Rpb24gPSAwOwotCQkJCWVsc2UKLQkJCQkJbGlzdF9tb3ZlX3RhaWwoYnVmZmVyLT50YXJnZXRfbm9kZS0+YXN5bmNfdG9kby5uZXh0LCAmdGhyZWFkLT50b2RvKTsKLQkJCX0KLQkJCWJpbmRlcl90cmFuc2FjdGlvbl9idWZmZXJfcmVsZWFzZShwcm9jLCBidWZmZXIsIE5VTEwpOwotCQkJYmluZGVyX2ZyZWVfYnVmKHByb2MsIGJ1ZmZlcik7Ci0JCQlicmVhazsKLQkJfQotCi0JCWNhc2UgQkNfVFJBTlNBQ1RJT046Ci0JCWNhc2UgQkNfUkVQTFk6IHsKLQkJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSB0cjsKLQotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0ciwgcHRyLCBzaXplb2YodHIpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2YodHIpOwotCQkJYmluZGVyX3RyYW5zYWN0aW9uKHByb2MsIHRocmVhZCwgJnRyLCBjbWQgPT0gQkNfUkVQTFkpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQljYXNlIEJDX1JFR0lTVEVSX0xPT1BFUjoKLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVEhSRUFEUywKLQkJCQkgICAgICJiaW5kZXI6ICVkOiVkIEJDX1JFR0lTVEVSX0xPT1BFUlxuIiwKLQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQkJaWYgKHRocmVhZC0+bG9vcGVyICYgQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEKSB7Ci0JCQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9JTlZBTElEOwotCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIEVSUk9SOiIKLQkJCQkJIiBCQ19SRUdJU1RFUl9MT09QRVIgY2FsbGVkICIKLQkJCQkJImFmdGVyIEJDX0VOVEVSX0xPT1BFUlxuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7Ci0JCQl9IGVsc2UgaWYgKHByb2MtPnJlcXVlc3RlZF90aHJlYWRzID09IDApIHsKLQkJCQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX0lOVkFMSUQ7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgRVJST1I6IgotCQkJCQkiIEJDX1JFR0lTVEVSX0xPT1BFUiBjYWxsZWQgIgotCQkJCQkid2l0aG91dCByZXF1ZXN0XG4iLAotCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvYy0+cmVxdWVzdGVkX3RocmVhZHMtLTsKLQkJCQlwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkc19zdGFydGVkKys7Ci0JCQl9Ci0JCQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX1JFR0lTVEVSRUQ7Ci0JCQlicmVhazsKLQkJY2FzZSBCQ19FTlRFUl9MT09QRVI6Ci0JCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RIUkVBRFMsCi0JCQkJICAgICAiYmluZGVyOiAlZDolZCBCQ19FTlRFUl9MT09QRVJcbiIsCi0JCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKLQkJCWlmICh0aHJlYWQtPmxvb3BlciAmIEJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCkgewotCQkJCXRocmVhZC0+bG9vcGVyIHw9IEJJTkRFUl9MT09QRVJfU1RBVEVfSU5WQUxJRDsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBFUlJPUjoiCi0JCQkJCSIgQkNfRU5URVJfTE9PUEVSIGNhbGxlZCBhZnRlciAiCi0JCQkJCSJCQ19SRUdJU1RFUl9MT09QRVJcbiIsCi0JCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQkJfQotCQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEOwotCQkJYnJlYWs7Ci0JCWNhc2UgQkNfRVhJVF9MT09QRVI6Ci0JCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RIUkVBRFMsCi0JCQkJICAgICAiYmluZGVyOiAlZDolZCBCQ19FWElUX0xPT1BFUlxuIiwKLQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9FWElURUQ7Ci0JCQlicmVhazsKLQotCQljYXNlIEJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OOgotCQljYXNlIEJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjogewotCQkJdWludDMyX3QgdGFyZ2V0OwotCQkJdm9pZCBfX3VzZXIgKmNvb2tpZTsKLQkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWY7Ci0JCQlzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCAqZGVhdGg7Ci0KLQkJCWlmIChnZXRfdXNlcih0YXJnZXQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7Ci0JCQlpZiAoZ2V0X3VzZXIoY29va2llLCAodm9pZCBfX3VzZXIgKiBfX3VzZXIgKilwdHIpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih2b2lkICopOwotCQkJcmVmID0gYmluZGVyX2dldF9yZWYocHJvYywgdGFyZ2V0KTsKLQkJCWlmIChyZWYgPT0gTlVMTCkgewotCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkICVzICIKLQkJCQkJImludmFsaWQgcmVmICVkXG4iLAotCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAotCQkJCQljbWQgPT0gQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04gPwotCQkJCQkiQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04iIDoKLQkJCQkJIkJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTiIsCi0JCQkJCXRhcmdldCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfREVBVEhfTk9USUZJQ0FUSU9OLAotCQkJCSAgICAgImJpbmRlcjogJWQ6JWQgJXMgJXAgcmVmICVkIGRlc2MgJWQgcyAlZCB3ICVkIGZvciBub2RlICVkXG4iLAotCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCQkgICAgIGNtZCA9PSBCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiA/Ci0JCQkJICAgICAiQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04iIDoKLQkJCQkgICAgICJCQ19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04iLAotCQkJCSAgICAgY29va2llLCByZWYtPmRlYnVnX2lkLCByZWYtPmRlc2MsCi0JCQkJICAgICByZWYtPnN0cm9uZywgcmVmLT53ZWFrLCByZWYtPm5vZGUtPmRlYnVnX2lkKTsKLQotCQkJaWYgKGNtZCA9PSBCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTikgewotCQkJCWlmIChyZWYtPmRlYXRoKSB7Ci0JCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiUiCi0JCQkJCQkiZCBCQ19SRVFVRVNUX0RFQVRIX05PVEkiCi0JCQkJCQkiRklDQVRJT04gZGVhdGggbm90aWZpYyIKLQkJCQkJCSJhdGlvbiBhbHJlYWR5IHNldFxuIiwKLQkJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZGVhdGggPSBremFsbG9jKHNpemVvZigqZGVhdGgpLCBHRlBfS0VSTkVMKTsKLQkJCQlpZiAoZGVhdGggPT0gTlVMTCkgewotCQkJCQl0aHJlYWQtPnJldHVybl9lcnJvciA9IEJSX0VSUk9SOwotCQkJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0ZBSUxFRF9UUkFOU0FDVElPTiwKLQkJCQkJCSAgICAgImJpbmRlcjogJWQ6JWQgIgotCQkJCQkJICAgICAiQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04gZmFpbGVkXG4iLAotCQkJCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJpbmRlcl9zdGF0c19jcmVhdGVkKEJJTkRFUl9TVEFUX0RFQVRIKTsKLQkJCQlJTklUX0xJU1RfSEVBRCgmZGVhdGgtPndvcmsuZW50cnkpOwotCQkJCWRlYXRoLT5jb29raWUgPSBjb29raWU7Ci0JCQkJcmVmLT5kZWF0aCA9IGRlYXRoOwotCQkJCWlmIChyZWYtPm5vZGUtPnByb2MgPT0gTlVMTCkgewotCQkJCQlyZWYtPmRlYXRoLT53b3JrLnR5cGUgPSBCSU5ERVJfV09SS19ERUFEX0JJTkRFUjsKLQkJCQkJaWYgKHRocmVhZC0+bG9vcGVyICYgKEJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCB8IEJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRCkpIHsKLQkJCQkJCWxpc3RfYWRkX3RhaWwoJnJlZi0+ZGVhdGgtPndvcmsuZW50cnksICZ0aHJlYWQtPnRvZG8pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbGlzdF9hZGRfdGFpbCgmcmVmLT5kZWF0aC0+d29yay5lbnRyeSwgJnByb2MtPnRvZG8pOwotCQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcm9jLT53YWl0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHJlZi0+ZGVhdGggPT0gTlVMTCkgewotCQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolIgotCQkJCQkJImQgQkNfQ0xFQVJfREVBVEhfTk9USUZJIgotCQkJCQkJIkNBVElPTiBkZWF0aCBub3RpZmljYXQiCi0JCQkJCQkiaW9uIG5vdCBhY3RpdmVcbiIsCi0JCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWRlYXRoID0gcmVmLT5kZWF0aDsKLQkJCQlpZiAoZGVhdGgtPmNvb2tpZSAhPSBjb29raWUpIHsKLQkJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JSIKLQkJCQkJCSJkIEJDX0NMRUFSX0RFQVRIX05PVElGSSIKLQkJCQkJCSJDQVRJT04gZGVhdGggbm90aWZpY2F0IgotCQkJCQkJImlvbiBjb29raWUgbWlzbWF0Y2ggIgotCQkJCQkJIiVwICE9ICVwXG4iLAotCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCQkJCWRlYXRoLT5jb29raWUsIGNvb2tpZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlyZWYtPmRlYXRoID0gTlVMTDsKLQkJCQlpZiAobGlzdF9lbXB0eSgmZGVhdGgtPndvcmsuZW50cnkpKSB7Ci0JCQkJCWRlYXRoLT53b3JrLnR5cGUgPSBCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT047Ci0JCQkJCWlmICh0aHJlYWQtPmxvb3BlciAmIChCSU5ERVJfTE9PUEVSX1NUQVRFX1JFR0lTVEVSRUQgfCBCSU5ERVJfTE9PUEVSX1NUQVRFX0VOVEVSRUQpKSB7Ci0JCQkJCQlsaXN0X2FkZF90YWlsKCZkZWF0aC0+d29yay5lbnRyeSwgJnRocmVhZC0+dG9kbyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsaXN0X2FkZF90YWlsKCZkZWF0aC0+d29yay5lbnRyeSwgJnByb2MtPnRvZG8pOwotCQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcm9jLT53YWl0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUJVR19PTihkZWF0aC0+d29yay50eXBlICE9IEJJTkRFUl9XT1JLX0RFQURfQklOREVSKTsKLQkJCQkJZGVhdGgtPndvcmsudHlwZSA9IEJJTkRFUl9XT1JLX0RFQURfQklOREVSX0FORF9DTEVBUjsKLQkJCQl9Ci0JCQl9Ci0JCX0gYnJlYWs7Ci0JCWNhc2UgQkNfREVBRF9CSU5ERVJfRE9ORTogewotCQkJc3RydWN0IGJpbmRlcl93b3JrICp3OwotCQkJdm9pZCBfX3VzZXIgKmNvb2tpZTsKLQkJCXN0cnVjdCBiaW5kZXJfcmVmX2RlYXRoICpkZWF0aCA9IE5VTEw7Ci0JCQlpZiAoZ2V0X3VzZXIoY29va2llLCAodm9pZCBfX3VzZXIgKiBfX3VzZXIgKilwdHIpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQlwdHIgKz0gc2l6ZW9mKHZvaWQgKik7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZwcm9jLT5kZWxpdmVyZWRfZGVhdGgsIGVudHJ5KSB7Ci0JCQkJc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggKnRtcF9kZWF0aCA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCwgd29yayk7Ci0JCQkJaWYgKHRtcF9kZWF0aC0+Y29va2llID09IGNvb2tpZSkgewotCQkJCQlkZWF0aCA9IHRtcF9kZWF0aDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19ERUFEX0JJTkRFUiwKLQkJCQkgICAgICJiaW5kZXI6ICVkOiVkIEJDX0RFQURfQklOREVSX0RPTkUgJXAgZm91bmQgJXBcbiIsCi0JCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBjb29raWUsIGRlYXRoKTsKLQkJCWlmIChkZWF0aCA9PSBOVUxMKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgQkNfREVBRCIKLQkJCQkJIl9CSU5ERVJfRE9ORSAlcCBub3QgZm91bmRcbiIsCi0JCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGNvb2tpZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWxpc3RfZGVsX2luaXQoJmRlYXRoLT53b3JrLmVudHJ5KTsKLQkJCWlmIChkZWF0aC0+d29yay50eXBlID09IEJJTkRFUl9XT1JLX0RFQURfQklOREVSX0FORF9DTEVBUikgewotCQkJCWRlYXRoLT53b3JrLnR5cGUgPSBCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT047Ci0JCQkJaWYgKHRocmVhZC0+bG9vcGVyICYgKEJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCB8IEJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRCkpIHsKLQkJCQkJbGlzdF9hZGRfdGFpbCgmZGVhdGgtPndvcmsuZW50cnksICZ0aHJlYWQtPnRvZG8pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxpc3RfYWRkX3RhaWwoJmRlYXRoLT53b3JrLmVudHJ5LCAmcHJvYy0+dG9kbyk7Ci0JCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJvYy0+d2FpdCk7Ci0JCQkJfQotCQkJfQotCQl9IGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6JWQgdW5rbm93biBjb21tYW5kICVkXG4iLAotCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGNtZCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQkqY29uc3VtZWQgPSBwdHIgLSBidWZmZXI7Ci0JfQotCXJldHVybiAwOwotfQotCi12b2lkIGJpbmRlcl9zdGF0X2JyKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwKLQkJICAgIHVpbnQzMl90IGNtZCkKLXsKLQlpZiAoX0lPQ19OUihjbWQpIDwgQVJSQVlfU0laRShiaW5kZXJfc3RhdHMuYnIpKSB7Ci0JCWJpbmRlcl9zdGF0cy5icltfSU9DX05SKGNtZCldKys7Ci0JCXByb2MtPnN0YXRzLmJyW19JT0NfTlIoY21kKV0rKzsKLQkJdGhyZWFkLT5zdGF0cy5icltfSU9DX05SKGNtZCldKys7Ci0JfQotfQotCi1zdGF0aWMgaW50IGJpbmRlcl9oYXNfcHJvY193b3JrKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCQlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkKQotewotCXJldHVybiAhbGlzdF9lbXB0eSgmcHJvYy0+dG9kbykgfHwKLQkJKHRocmVhZC0+bG9vcGVyICYgQklOREVSX0xPT1BFUl9TVEFURV9ORUVEX1JFVFVSTik7Ci19Ci0KLXN0YXRpYyBpbnQgYmluZGVyX2hhc190aHJlYWRfd29yayhzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkKQotewotCXJldHVybiAhbGlzdF9lbXB0eSgmdGhyZWFkLT50b2RvKSB8fCB0aHJlYWQtPnJldHVybl9lcnJvciAhPSBCUl9PSyB8fAotCQkodGhyZWFkLT5sb29wZXIgJiBCSU5ERVJfTE9PUEVSX1NUQVRFX05FRURfUkVUVVJOKTsKLX0KLQotc3RhdGljIGludCBiaW5kZXJfdGhyZWFkX3JlYWQoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLAotCQkJICAgICAgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwKLQkJCSAgICAgIHZvaWQgIF9fdXNlciAqYnVmZmVyLCBpbnQgc2l6ZSwKLQkJCSAgICAgIHNpZ25lZCBsb25nICpjb25zdW1lZCwgaW50IG5vbl9ibG9jaykKLXsKLQl2b2lkIF9fdXNlciAqcHRyID0gYnVmZmVyICsgKmNvbnN1bWVkOwotCXZvaWQgX191c2VyICplbmQgPSBidWZmZXIgKyBzaXplOwotCi0JaW50IHJldCA9IDA7Ci0JaW50IHdhaXRfZm9yX3Byb2Nfd29yazsKLQotCWlmICgqY29uc3VtZWQgPT0gMCkgewotCQlpZiAocHV0X3VzZXIoQlJfTk9PUCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7Ci0JfQotCi1yZXRyeToKLQl3YWl0X2Zvcl9wcm9jX3dvcmsgPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrID09IE5VTEwgJiYKLQkJCQlsaXN0X2VtcHR5KCZ0aHJlYWQtPnRvZG8pOwotCi0JaWYgKHRocmVhZC0+cmV0dXJuX2Vycm9yICE9IEJSX09LICYmIHB0ciA8IGVuZCkgewotCQlpZiAodGhyZWFkLT5yZXR1cm5fZXJyb3IyICE9IEJSX09LKSB7Ci0JCQlpZiAocHV0X3VzZXIodGhyZWFkLT5yZXR1cm5fZXJyb3IyLCAodWludDMyX3QgX191c2VyICopcHRyKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2YodWludDMyX3QpOwotCQkJaWYgKHB0ciA9PSBlbmQpCi0JCQkJZ290byBkb25lOwotCQkJdGhyZWFkLT5yZXR1cm5fZXJyb3IyID0gQlJfT0s7Ci0JCX0KLQkJaWYgKHB1dF91c2VyKHRocmVhZC0+cmV0dXJuX2Vycm9yLCAodWludDMyX3QgX191c2VyICopcHRyKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKLQkJdGhyZWFkLT5yZXR1cm5fZXJyb3IgPSBCUl9PSzsKLQkJZ290byBkb25lOwotCX0KLQotCi0JdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9XQUlUSU5HOwotCWlmICh3YWl0X2Zvcl9wcm9jX3dvcmspCi0JCXByb2MtPnJlYWR5X3RocmVhZHMrKzsKLQltdXRleF91bmxvY2soJmJpbmRlcl9sb2NrKTsKLQlpZiAod2FpdF9mb3JfcHJvY193b3JrKSB7Ci0JCWlmICghKHRocmVhZC0+bG9vcGVyICYgKEJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCB8Ci0JCQkJCUJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRCkpKSB7Ci0JCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBFUlJPUjogVGhyZWFkIHdhaXRpbmcgIgotCQkJCSJmb3IgcHJvY2VzcyB3b3JrIGJlZm9yZSBjYWxsaW5nIEJDX1JFR0lTVEVSXyIKLQkJCQkiTE9PUEVSIG9yIEJDX0VOVEVSX0xPT1BFUiAoc3RhdGUgJXgpXG4iLAotCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHRocmVhZC0+bG9vcGVyKTsKLQkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShiaW5kZXJfdXNlcl9lcnJvcl93YWl0LAotCQkJCQkJIGJpbmRlcl9zdG9wX29uX3VzZXJfZXJyb3IgPCAyKTsKLQkJfQotCQliaW5kZXJfc2V0X25pY2UocHJvYy0+ZGVmYXVsdF9wcmlvcml0eSk7Ci0JCWlmIChub25fYmxvY2spIHsKLQkJCWlmICghYmluZGVyX2hhc19wcm9jX3dvcmsocHJvYywgdGhyZWFkKSkKLQkJCQlyZXQgPSAtRUFHQUlOOwotCQl9IGVsc2UKLQkJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV9leGNsdXNpdmUocHJvYy0+d2FpdCwgYmluZGVyX2hhc19wcm9jX3dvcmsocHJvYywgdGhyZWFkKSk7Ci0JfSBlbHNlIHsKLQkJaWYgKG5vbl9ibG9jaykgewotCQkJaWYgKCFiaW5kZXJfaGFzX3RocmVhZF93b3JrKHRocmVhZCkpCi0JCQkJcmV0ID0gLUVBR0FJTjsKLQkJfSBlbHNlCi0JCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodGhyZWFkLT53YWl0LCBiaW5kZXJfaGFzX3RocmVhZF93b3JrKHRocmVhZCkpOwotCX0KLQltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7Ci0JaWYgKHdhaXRfZm9yX3Byb2Nfd29yaykKLQkJcHJvYy0+cmVhZHlfdGhyZWFkcy0tOwotCXRocmVhZC0+bG9vcGVyICY9IH5CSU5ERVJfTE9PUEVSX1NUQVRFX1dBSVRJTkc7Ci0KLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0Jd2hpbGUgKDEpIHsKLQkJdWludDMyX3QgY21kOwotCQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEgdHI7Ci0JCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKLQkJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdCA9IE5VTEw7Ci0KLQkJaWYgKCFsaXN0X2VtcHR5KCZ0aHJlYWQtPnRvZG8pKQotCQkJdyA9IGxpc3RfZmlyc3RfZW50cnkoJnRocmVhZC0+dG9kbywgc3RydWN0IGJpbmRlcl93b3JrLCBlbnRyeSk7Ci0JCWVsc2UgaWYgKCFsaXN0X2VtcHR5KCZwcm9jLT50b2RvKSAmJiB3YWl0X2Zvcl9wcm9jX3dvcmspCi0JCQl3ID0gbGlzdF9maXJzdF9lbnRyeSgmcHJvYy0+dG9kbywgc3RydWN0IGJpbmRlcl93b3JrLCBlbnRyeSk7Ci0JCWVsc2UgewotCQkJaWYgKHB0ciAtIGJ1ZmZlciA9PSA0ICYmICEodGhyZWFkLT5sb29wZXIgJiBCSU5ERVJfTE9PUEVSX1NUQVRFX05FRURfUkVUVVJOKSkgLyogbm8gZGF0YSBhZGRlZCAqLwotCQkJCWdvdG8gcmV0cnk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChlbmQgLSBwdHIgPCBzaXplb2YodHIpICsgNCkKLQkJCWJyZWFrOwotCi0JCXN3aXRjaCAody0+dHlwZSkgewotCQljYXNlIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OOiB7Ci0JCQl0ID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24sIHdvcmspOwotCQl9IGJyZWFrOwotCQljYXNlIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OX0NPTVBMRVRFOiB7Ci0JCQljbWQgPSBCUl9UUkFOU0FDVElPTl9DT01QTEVURTsKLQkJCWlmIChwdXRfdXNlcihjbWQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7Ci0KLQkJCWJpbmRlcl9zdGF0X2JyKHByb2MsIHRocmVhZCwgY21kKTsKLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT05fQ09NUExFVEUsCi0JCQkJICAgICAiYmluZGVyOiAlZDolZCBCUl9UUkFOU0FDVElPTl9DT01QTEVURVxuIiwKLQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCi0JCQlsaXN0X2RlbCgmdy0+ZW50cnkpOwotCQkJa2ZyZWUodyk7Ci0JCQliaW5kZXJfc3RhdHNfZGVsZXRlZChCSU5ERVJfU1RBVF9UUkFOU0FDVElPTl9DT01QTEVURSk7Ci0JCX0gYnJlYWs7Ci0JCWNhc2UgQklOREVSX1dPUktfTk9ERTogewotCQkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBiaW5kZXJfbm9kZSwgd29yayk7Ci0JCQl1aW50MzJfdCBjbWQgPSBCUl9OT09QOwotCQkJY29uc3QgY2hhciAqY21kX25hbWU7Ci0JCQlpbnQgc3Ryb25nID0gbm9kZS0+aW50ZXJuYWxfc3Ryb25nX3JlZnMgfHwgbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnM7Ci0JCQlpbnQgd2VhayA9ICFobGlzdF9lbXB0eSgmbm9kZS0+cmVmcykgfHwgbm9kZS0+bG9jYWxfd2Vha19yZWZzIHx8IHN0cm9uZzsKLQkJCWlmICh3ZWFrICYmICFub2RlLT5oYXNfd2Vha19yZWYpIHsKLQkJCQljbWQgPSBCUl9JTkNSRUZTOwotCQkJCWNtZF9uYW1lID0gIkJSX0lOQ1JFRlMiOwotCQkJCW5vZGUtPmhhc193ZWFrX3JlZiA9IDE7Ci0JCQkJbm9kZS0+cGVuZGluZ193ZWFrX3JlZiA9IDE7Ci0JCQkJbm9kZS0+bG9jYWxfd2Vha19yZWZzKys7Ci0JCQl9IGVsc2UgaWYgKHN0cm9uZyAmJiAhbm9kZS0+aGFzX3N0cm9uZ19yZWYpIHsKLQkJCQljbWQgPSBCUl9BQ1FVSVJFOwotCQkJCWNtZF9uYW1lID0gIkJSX0FDUVVJUkUiOwotCQkJCW5vZGUtPmhhc19zdHJvbmdfcmVmID0gMTsKLQkJCQlub2RlLT5wZW5kaW5nX3N0cm9uZ19yZWYgPSAxOwotCQkJCW5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzKys7Ci0JCQl9IGVsc2UgaWYgKCFzdHJvbmcgJiYgbm9kZS0+aGFzX3N0cm9uZ19yZWYpIHsKLQkJCQljbWQgPSBCUl9SRUxFQVNFOwotCQkJCWNtZF9uYW1lID0gIkJSX1JFTEVBU0UiOwotCQkJCW5vZGUtPmhhc19zdHJvbmdfcmVmID0gMDsKLQkJCX0gZWxzZSBpZiAoIXdlYWsgJiYgbm9kZS0+aGFzX3dlYWtfcmVmKSB7Ci0JCQkJY21kID0gQlJfREVDUkVGUzsKLQkJCQljbWRfbmFtZSA9ICJCUl9ERUNSRUZTIjsKLQkJCQlub2RlLT5oYXNfd2Vha19yZWYgPSAwOwotCQkJfQotCQkJaWYgKGNtZCAhPSBCUl9OT09QKSB7Ci0JCQkJaWYgKHB1dF91c2VyKGNtZCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCXB0ciArPSBzaXplb2YodWludDMyX3QpOwotCQkJCWlmIChwdXRfdXNlcihub2RlLT5wdHIsICh2b2lkICogX191c2VyICopcHRyKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJcHRyICs9IHNpemVvZih2b2lkICopOwotCQkJCWlmIChwdXRfdXNlcihub2RlLT5jb29raWUsICh2b2lkICogX191c2VyICopcHRyKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJcHRyICs9IHNpemVvZih2b2lkICopOwotCi0JCQkJYmluZGVyX3N0YXRfYnIocHJvYywgdGhyZWFkLCBjbWQpOwotCQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVVNFUl9SRUZTLAotCQkJCQkgICAgICJiaW5kZXI6ICVkOiVkICVzICVkIHUlcCBjJXBcbiIsCi0JCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgY21kX25hbWUsIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIG5vZGUtPmNvb2tpZSk7Ci0JCQl9IGVsc2UgewotCQkJCWxpc3RfZGVsX2luaXQoJnctPmVudHJ5KTsKLQkJCQlpZiAoIXdlYWsgJiYgIXN0cm9uZykgewotCQkJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMsCi0JCQkJCQkgICAgICJiaW5kZXI6ICVkOiVkIG5vZGUgJWQgdSVwIGMlcCBkZWxldGVkXG4iLAotCQkJCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBub2RlLT5kZWJ1Z19pZCwKLQkJCQkJCSAgICAgbm9kZS0+cHRyLCBub2RlLT5jb29raWUpOwotCQkJCQlyYl9lcmFzZSgmbm9kZS0+cmJfbm9kZSwgJnByb2MtPm5vZGVzKTsKLQkJCQkJa2ZyZWUobm9kZSk7Ci0JCQkJCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX05PREUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUywKLQkJCQkJCSAgICAgImJpbmRlcjogJWQ6JWQgbm9kZSAlZCB1JXAgYyVwIHN0YXRlIHVuY2hhbmdlZFxuIiwKLQkJCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0ciwKLQkJCQkJCSAgICAgbm9kZS0+Y29va2llKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gYnJlYWs7Ci0JCWNhc2UgQklOREVSX1dPUktfREVBRF9CSU5ERVI6Ci0JCWNhc2UgQklOREVSX1dPUktfREVBRF9CSU5ERVJfQU5EX0NMRUFSOgotCQljYXNlIEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjogewotCQkJc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggKmRlYXRoOwotCQkJdWludDMyX3QgY21kOwotCi0JCQlkZWF0aCA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCwgd29yayk7Ci0JCQlpZiAody0+dHlwZSA9PSBCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04pCi0JCQkJY21kID0gQlJfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OX0RPTkU7Ci0JCQllbHNlCi0JCQkJY21kID0gQlJfREVBRF9CSU5ERVI7Ci0JCQlpZiAocHV0X3VzZXIoY21kLCAodWludDMyX3QgX191c2VyICopcHRyKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2YodWludDMyX3QpOwotCQkJaWYgKHB1dF91c2VyKGRlYXRoLT5jb29raWUsICh2b2lkICogX191c2VyICopcHRyKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfREVBVEhfTk9USUZJQ0FUSU9OLAotCQkJCSAgICAgImJpbmRlcjogJWQ6JWQgJXMgJXBcbiIsCi0JCQkJICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCQkgICAgICBjbWQgPT0gQlJfREVBRF9CSU5ERVIgPwotCQkJCSAgICAgICJCUl9ERUFEX0JJTkRFUiIgOgotCQkJCSAgICAgICJCUl9DTEVBUl9ERUFUSF9OT1RJRklDQVRJT05fRE9ORSIsCi0JCQkJICAgICAgZGVhdGgtPmNvb2tpZSk7Ci0KLQkJCWlmICh3LT50eXBlID09IEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTikgewotCQkJCWxpc3RfZGVsKCZ3LT5lbnRyeSk7Ci0JCQkJa2ZyZWUoZGVhdGgpOwotCQkJCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX0RFQVRIKTsKLQkJCX0gZWxzZQotCQkJCWxpc3RfbW92ZSgmdy0+ZW50cnksICZwcm9jLT5kZWxpdmVyZWRfZGVhdGgpOwotCQkJaWYgKGNtZCA9PSBCUl9ERUFEX0JJTkRFUikKLQkJCQlnb3RvIGRvbmU7IC8qIERFQURfQklOREVSIG5vdGlmaWNhdGlvbnMgY2FuIGNhdXNlIHRyYW5zYWN0aW9ucyAqLwotCQl9IGJyZWFrOwotCQl9Ci0KLQkJaWYgKCF0KQotCQkJY29udGludWU7Ci0KLQkJQlVHX09OKHQtPmJ1ZmZlciA9PSBOVUxMKTsKLQkJaWYgKHQtPmJ1ZmZlci0+dGFyZ2V0X25vZGUpIHsKLQkJCXN0cnVjdCBiaW5kZXJfbm9kZSAqdGFyZ2V0X25vZGUgPSB0LT5idWZmZXItPnRhcmdldF9ub2RlOwotCQkJdHIudGFyZ2V0LnB0ciA9IHRhcmdldF9ub2RlLT5wdHI7Ci0JCQl0ci5jb29raWUgPSAgdGFyZ2V0X25vZGUtPmNvb2tpZTsKLQkJCXQtPnNhdmVkX3ByaW9yaXR5ID0gdGFza19uaWNlKGN1cnJlbnQpOwotCQkJaWYgKHQtPnByaW9yaXR5IDwgdGFyZ2V0X25vZGUtPm1pbl9wcmlvcml0eSAmJgotCQkJICAgICEodC0+ZmxhZ3MgJiBURl9PTkVfV0FZKSkKLQkJCQliaW5kZXJfc2V0X25pY2UodC0+cHJpb3JpdHkpOwotCQkJZWxzZSBpZiAoISh0LT5mbGFncyAmIFRGX09ORV9XQVkpIHx8Ci0JCQkJIHQtPnNhdmVkX3ByaW9yaXR5ID4gdGFyZ2V0X25vZGUtPm1pbl9wcmlvcml0eSkKLQkJCQliaW5kZXJfc2V0X25pY2UodGFyZ2V0X25vZGUtPm1pbl9wcmlvcml0eSk7Ci0JCQljbWQgPSBCUl9UUkFOU0FDVElPTjsKLQkJfSBlbHNlIHsKLQkJCXRyLnRhcmdldC5wdHIgPSBOVUxMOwotCQkJdHIuY29va2llID0gTlVMTDsKLQkJCWNtZCA9IEJSX1JFUExZOwotCQl9Ci0JCXRyLmNvZGUgPSB0LT5jb2RlOwotCQl0ci5mbGFncyA9IHQtPmZsYWdzOwotCQl0ci5zZW5kZXJfZXVpZCA9IHQtPnNlbmRlcl9ldWlkOwotCi0JCWlmICh0LT5mcm9tKSB7Ci0JCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNlbmRlciA9IHQtPmZyb20tPnByb2MtPnRzazsKLQkJCXRyLnNlbmRlcl9waWQgPSB0YXNrX3RnaWRfbnJfbnMoc2VuZGVyLAotCQkJCQkJCWN1cnJlbnQtPm5zcHJveHktPnBpZF9ucyk7Ci0JCX0gZWxzZSB7Ci0JCQl0ci5zZW5kZXJfcGlkID0gMDsKLQkJfQotCi0JCXRyLmRhdGFfc2l6ZSA9IHQtPmJ1ZmZlci0+ZGF0YV9zaXplOwotCQl0ci5vZmZzZXRzX3NpemUgPSB0LT5idWZmZXItPm9mZnNldHNfc2l6ZTsKLQkJdHIuZGF0YS5wdHIuYnVmZmVyID0gKHZvaWQgKil0LT5idWZmZXItPmRhdGEgKwotCQkJCQlwcm9jLT51c2VyX2J1ZmZlcl9vZmZzZXQ7Ci0JCXRyLmRhdGEucHRyLm9mZnNldHMgPSB0ci5kYXRhLnB0ci5idWZmZXIgKwotCQkJCQlBTElHTih0LT5idWZmZXItPmRhdGFfc2l6ZSwKLQkJCQkJICAgIHNpemVvZih2b2lkICopKTsKLQotCQlpZiAocHV0X3VzZXIoY21kLCAodWludDMyX3QgX191c2VyICopcHRyKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKLQkJaWYgKGNvcHlfdG9fdXNlcihwdHIsICZ0ciwgc2l6ZW9mKHRyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcHRyICs9IHNpemVvZih0cik7Ci0KLQkJYmluZGVyX3N0YXRfYnIocHJvYywgdGhyZWFkLCBjbWQpOwotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OLAotCQkJICAgICAiYmluZGVyOiAlZDolZCAlcyAlZCAlZDolZCwgY21kICVkIgotCQkJICAgICAic2l6ZSAlemQtJXpkIHB0ciAlcC0lcFxuIiwKLQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCSAgICAgKGNtZCA9PSBCUl9UUkFOU0FDVElPTikgPyAiQlJfVFJBTlNBQ1RJT04iIDoKLQkJCSAgICAgIkJSX1JFUExZIiwKLQkJCSAgICAgdC0+ZGVidWdfaWQsIHQtPmZyb20gPyB0LT5mcm9tLT5wcm9jLT5waWQgOiAwLAotCQkJICAgICB0LT5mcm9tID8gdC0+ZnJvbS0+cGlkIDogMCwgY21kLAotCQkJICAgICB0LT5idWZmZXItPmRhdGFfc2l6ZSwgdC0+YnVmZmVyLT5vZmZzZXRzX3NpemUsCi0JCQkgICAgIHRyLmRhdGEucHRyLmJ1ZmZlciwgdHIuZGF0YS5wdHIub2Zmc2V0cyk7Ci0KLQkJbGlzdF9kZWwoJnQtPndvcmsuZW50cnkpOwotCQl0LT5idWZmZXItPmFsbG93X3VzZXJfZnJlZSA9IDE7Ci0JCWlmIChjbWQgPT0gQlJfVFJBTlNBQ1RJT04gJiYgISh0LT5mbGFncyAmIFRGX09ORV9XQVkpKSB7Ci0JCQl0LT50b19wYXJlbnQgPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrOwotCQkJdC0+dG9fdGhyZWFkID0gdGhyZWFkOwotCQkJdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayA9IHQ7Ci0JCX0gZWxzZSB7Ci0JCQl0LT5idWZmZXItPnRyYW5zYWN0aW9uID0gTlVMTDsKLQkJCWtmcmVlKHQpOwotCQkJYmluZGVyX3N0YXRzX2RlbGV0ZWQoQklOREVSX1NUQVRfVFJBTlNBQ1RJT04pOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotZG9uZToKLQotCSpjb25zdW1lZCA9IHB0ciAtIGJ1ZmZlcjsKLQlpZiAocHJvYy0+cmVxdWVzdGVkX3RocmVhZHMgKyBwcm9jLT5yZWFkeV90aHJlYWRzID09IDAgJiYKLQkgICAgcHJvYy0+cmVxdWVzdGVkX3RocmVhZHNfc3RhcnRlZCA8IHByb2MtPm1heF90aHJlYWRzICYmCi0JICAgICh0aHJlYWQtPmxvb3BlciAmIChCSU5ERVJfTE9PUEVSX1NUQVRFX1JFR0lTVEVSRUQgfAotCSAgICAgQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEKSkgLyogdGhlIHVzZXItc3BhY2UgY29kZSBmYWlscyB0byAqLwotCSAgICAgLypzcGF3biBhIG5ldyB0aHJlYWQgaWYgd2UgbGVhdmUgdGhpcyBvdXQgKi8pIHsKLQkJcHJvYy0+cmVxdWVzdGVkX3RocmVhZHMrKzsKLQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19USFJFQURTLAotCQkJICAgICAiYmluZGVyOiAlZDolZCBCUl9TUEFXTl9MT09QRVJcbiIsCi0JCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQlpZiAocHV0X3VzZXIoQlJfU1BBV05fTE9PUEVSLCAodWludDMyX3QgX191c2VyICopYnVmZmVyKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYmluZGVyX3JlbGVhc2Vfd29yayhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQotewotCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKLQl3aGlsZSAoIWxpc3RfZW1wdHkobGlzdCkpIHsKLQkJdyA9IGxpc3RfZmlyc3RfZW50cnkobGlzdCwgc3RydWN0IGJpbmRlcl93b3JrLCBlbnRyeSk7Ci0JCWxpc3RfZGVsX2luaXQoJnctPmVudHJ5KTsKLQkJc3dpdGNoICh3LT50eXBlKSB7Ci0JCWNhc2UgQklOREVSX1dPUktfVFJBTlNBQ1RJT046IHsKLQkJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnQ7Ci0KLQkJCXQgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiwgd29yayk7Ci0JCQlpZiAodC0+YnVmZmVyLT50YXJnZXRfbm9kZSAmJiAhKHQtPmZsYWdzICYgVEZfT05FX1dBWSkpCi0JCQkJYmluZGVyX3NlbmRfZmFpbGVkX3JlcGx5KHQsIEJSX0RFQURfUkVQTFkpOwotCQl9IGJyZWFrOwotCQljYXNlIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OX0NPTVBMRVRFOiB7Ci0JCQlrZnJlZSh3KTsKLQkJCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX1RSQU5TQUNUSU9OX0NPTVBMRVRFKTsKLQkJfSBicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi19Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqYmluZGVyX2dldF90aHJlYWQoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jKQotewotCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQgPSBOVUxMOwotCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOwotCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwcm9jLT50aHJlYWRzLnJiX25vZGU7Ci0KLQl3aGlsZSAoKnApIHsKLQkJcGFyZW50ID0gKnA7Ci0JCXRocmVhZCA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJpbmRlcl90aHJlYWQsIHJiX25vZGUpOwotCi0JCWlmIChjdXJyZW50LT5waWQgPCB0aHJlYWQtPnBpZCkKLQkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKLQkJZWxzZSBpZiAoY3VycmVudC0+cGlkID4gdGhyZWFkLT5waWQpCi0JCQlwID0gJigqcCktPnJiX3JpZ2h0OwotCQllbHNlCi0JCQlicmVhazsKLQl9Ci0JaWYgKCpwID09IE5VTEwpIHsKLQkJdGhyZWFkID0ga3phbGxvYyhzaXplb2YoKnRocmVhZCksIEdGUF9LRVJORUwpOwotCQlpZiAodGhyZWFkID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJYmluZGVyX3N0YXRzX2NyZWF0ZWQoQklOREVSX1NUQVRfVEhSRUFEKTsKLQkJdGhyZWFkLT5wcm9jID0gcHJvYzsKLQkJdGhyZWFkLT5waWQgPSBjdXJyZW50LT5waWQ7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRocmVhZC0+d2FpdCk7Ci0JCUlOSVRfTElTVF9IRUFEKCZ0aHJlYWQtPnRvZG8pOwotCQlyYl9saW5rX25vZGUoJnRocmVhZC0+cmJfbm9kZSwgcGFyZW50LCBwKTsKLQkJcmJfaW5zZXJ0X2NvbG9yKCZ0aHJlYWQtPnJiX25vZGUsICZwcm9jLT50aHJlYWRzKTsKLQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9ORUVEX1JFVFVSTjsKLQkJdGhyZWFkLT5yZXR1cm5fZXJyb3IgPSBCUl9PSzsKLQkJdGhyZWFkLT5yZXR1cm5fZXJyb3IyID0gQlJfT0s7Ci0JfQotCXJldHVybiB0aHJlYWQ7Ci19Ci0KLXN0YXRpYyBpbnQgYmluZGVyX2ZyZWVfdGhyZWFkKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCSAgICAgIHN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQpCi17Ci0Jc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdDsKLQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICpzZW5kX3JlcGx5ID0gTlVMTDsKLQlpbnQgYWN0aXZlX3RyYW5zYWN0aW9ucyA9IDA7Ci0KLQlyYl9lcmFzZSgmdGhyZWFkLT5yYl9ub2RlLCAmcHJvYy0+dGhyZWFkcyk7Ci0JdCA9IHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2s7Ci0JaWYgKHQgJiYgdC0+dG9fdGhyZWFkID09IHRocmVhZCkKLQkJc2VuZF9yZXBseSA9IHQ7Ci0Jd2hpbGUgKHQpIHsKLQkJYWN0aXZlX3RyYW5zYWN0aW9ucysrOwotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0RFQURfVFJBTlNBQ1RJT04sCi0JCQkgICAgICJiaW5kZXI6IHJlbGVhc2UgJWQ6JWQgdHJhbnNhY3Rpb24gJWQgIgotCQkJICAgICAiJXMsIHN0aWxsIGFjdGl2ZVxuIiwgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCSAgICAgdC0+ZGVidWdfaWQsCi0JCQkgICAgICh0LT50b190aHJlYWQgPT0gdGhyZWFkKSA/ICJpbiIgOiAib3V0Iik7Ci0KLQkJaWYgKHQtPnRvX3RocmVhZCA9PSB0aHJlYWQpIHsKLQkJCXQtPnRvX3Byb2MgPSBOVUxMOwotCQkJdC0+dG9fdGhyZWFkID0gTlVMTDsKLQkJCWlmICh0LT5idWZmZXIpIHsKLQkJCQl0LT5idWZmZXItPnRyYW5zYWN0aW9uID0gTlVMTDsKLQkJCQl0LT5idWZmZXIgPSBOVUxMOwotCQkJfQotCQkJdCA9IHQtPnRvX3BhcmVudDsKLQkJfSBlbHNlIGlmICh0LT5mcm9tID09IHRocmVhZCkgewotCQkJdC0+ZnJvbSA9IE5VTEw7Ci0JCQl0ID0gdC0+ZnJvbV9wYXJlbnQ7Ci0JCX0gZWxzZQotCQkJQlVHKCk7Ci0JfQotCWlmIChzZW5kX3JlcGx5KQotCQliaW5kZXJfc2VuZF9mYWlsZWRfcmVwbHkoc2VuZF9yZXBseSwgQlJfREVBRF9SRVBMWSk7Ci0JYmluZGVyX3JlbGVhc2Vfd29yaygmdGhyZWFkLT50b2RvKTsKLQlrZnJlZSh0aHJlYWQpOwotCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX1RIUkVBRCk7Ci0JcmV0dXJuIGFjdGl2ZV90cmFuc2FjdGlvbnM7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYmluZGVyX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkJc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQotewotCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkID0gTlVMTDsKLQlpbnQgd2FpdF9mb3JfcHJvY193b3JrOwotCi0JbXV0ZXhfbG9jaygmYmluZGVyX2xvY2spOwotCXRocmVhZCA9IGJpbmRlcl9nZXRfdGhyZWFkKHByb2MpOwotCi0Jd2FpdF9mb3JfcHJvY193b3JrID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayA9PSBOVUxMICYmCi0JCWxpc3RfZW1wdHkoJnRocmVhZC0+dG9kbykgJiYgdGhyZWFkLT5yZXR1cm5fZXJyb3IgPT0gQlJfT0s7Ci0JbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7Ci0KLQlpZiAod2FpdF9mb3JfcHJvY193b3JrKSB7Ci0JCWlmIChiaW5kZXJfaGFzX3Byb2Nfd29yayhwcm9jLCB0aHJlYWQpKQotCQkJcmV0dXJuIFBPTExJTjsKLQkJcG9sbF93YWl0KGZpbHAsICZwcm9jLT53YWl0LCB3YWl0KTsKLQkJaWYgKGJpbmRlcl9oYXNfcHJvY193b3JrKHByb2MsIHRocmVhZCkpCi0JCQlyZXR1cm4gUE9MTElOOwotCX0gZWxzZSB7Ci0JCWlmIChiaW5kZXJfaGFzX3RocmVhZF93b3JrKHRocmVhZCkpCi0JCQlyZXR1cm4gUE9MTElOOwotCQlwb2xsX3dhaXQoZmlscCwgJnRocmVhZC0+d2FpdCwgd2FpdCk7Ci0JCWlmIChiaW5kZXJfaGFzX3RocmVhZF93b3JrKHRocmVhZCkpCi0JCQlyZXR1cm4gUE9MTElOOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcgYmluZGVyX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkOwotCXVuc2lnbmVkIGludCBzaXplID0gX0lPQ19TSVpFKGNtZCk7Ci0Jdm9pZCBfX3VzZXIgKnVidWYgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0KLQkvKnByaW50ayhLRVJOX0lORk8gImJpbmRlcl9pb2N0bDogJWQ6JWQgJXggJWx4XG4iLCBwcm9jLT5waWQsIGN1cnJlbnQtPnBpZCwgY21kLCBhcmcpOyovCi0KLQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYmluZGVyX3VzZXJfZXJyb3Jfd2FpdCwgYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvciA8IDIpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7Ci0JdGhyZWFkID0gYmluZGVyX2dldF90aHJlYWQocHJvYyk7Ci0JaWYgKHRocmVhZCA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyOwotCX0KLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBCSU5ERVJfV1JJVEVfUkVBRDogewotCQlzdHJ1Y3QgYmluZGVyX3dyaXRlX3JlYWQgYndyOwotCQlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGJpbmRlcl93cml0ZV9yZWFkKSkgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmYndyLCB1YnVmLCBzaXplb2YoYndyKSkpIHsKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1JFQURfV1JJVEUsCi0JCQkgICAgICJiaW5kZXI6ICVkOiVkIHdyaXRlICVsZCBhdCAlMDhseCwgcmVhZCAlbGQgYXQgJTA4bHhcbiIsCi0JCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGJ3ci53cml0ZV9zaXplLCBid3Iud3JpdGVfYnVmZmVyLAotCQkJICAgICBid3IucmVhZF9zaXplLCBid3IucmVhZF9idWZmZXIpOwotCi0JCWlmIChid3Iud3JpdGVfc2l6ZSA+IDApIHsKLQkJCXJldCA9IGJpbmRlcl90aHJlYWRfd3JpdGUocHJvYywgdGhyZWFkLCAodm9pZCBfX3VzZXIgKilid3Iud3JpdGVfYnVmZmVyLCBid3Iud3JpdGVfc2l6ZSwgJmJ3ci53cml0ZV9jb25zdW1lZCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCWJ3ci5yZWFkX2NvbnN1bWVkID0gMDsKLQkJCQlpZiAoY29weV90b191c2VyKHVidWYsICZid3IsIHNpemVvZihid3IpKSkKLQkJCQkJcmV0ID0gLUVGQVVMVDsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJfQotCQlpZiAoYndyLnJlYWRfc2l6ZSA+IDApIHsKLQkJCXJldCA9IGJpbmRlcl90aHJlYWRfcmVhZChwcm9jLCB0aHJlYWQsICh2b2lkIF9fdXNlciAqKWJ3ci5yZWFkX2J1ZmZlciwgYndyLnJlYWRfc2l6ZSwgJmJ3ci5yZWFkX2NvbnN1bWVkLCBmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Ci0JCQlpZiAoIWxpc3RfZW1wdHkoJnByb2MtPnRvZG8pKQotCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJvYy0+d2FpdCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCWlmIChjb3B5X3RvX3VzZXIodWJ1ZiwgJmJ3ciwgc2l6ZW9mKGJ3cikpKQotCQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQl9Ci0JCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfUkVBRF9XUklURSwKLQkJCSAgICAgImJpbmRlcjogJWQ6JWQgd3JvdGUgJWxkIG9mICVsZCwgcmVhZCByZXR1cm4gJWxkIG9mICVsZFxuIiwKLQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgYndyLndyaXRlX2NvbnN1bWVkLCBid3Iud3JpdGVfc2l6ZSwKLQkJCSAgICAgYndyLnJlYWRfY29uc3VtZWQsIGJ3ci5yZWFkX3NpemUpOwotCQlpZiAoY29weV90b191c2VyKHVidWYsICZid3IsIHNpemVvZihid3IpKSkgewotCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEJJTkRFUl9TRVRfTUFYX1RIUkVBRFM6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmcHJvYy0+bWF4X3RocmVhZHMsIHVidWYsIHNpemVvZihwcm9jLT5tYXhfdGhyZWFkcykpKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBCSU5ERVJfU0VUX0NPTlRFWFRfTUdSOgotCQlpZiAoYmluZGVyX2NvbnRleHRfbWdyX25vZGUgIT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IEJJTkRFUl9TRVRfQ09OVEVYVF9NR1IgYWxyZWFkeSBzZXRcbiIpOwotCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJaWYgKGJpbmRlcl9jb250ZXh0X21ncl91aWQgIT0gLTEpIHsKLQkJCWlmIChiaW5kZXJfY29udGV4dF9tZ3JfdWlkICE9IGN1cnJlbnQtPmNyZWQtPmV1aWQpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogQklOREVSX1NFVF8iCi0JCQkJICAgICAgICJDT05URVhUX01HUiBiYWQgdWlkICVkICE9ICVkXG4iLAotCQkJCSAgICAgICBjdXJyZW50LT5jcmVkLT5ldWlkLAotCQkJCSAgICAgICBiaW5kZXJfY29udGV4dF9tZ3JfdWlkKTsKLQkJCQlyZXQgPSAtRVBFUk07Ci0JCQkJZ290byBlcnI7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJYmluZGVyX2NvbnRleHRfbWdyX3VpZCA9IGN1cnJlbnQtPmNyZWQtPmV1aWQ7Ci0JCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlID0gYmluZGVyX25ld19ub2RlKHByb2MsIE5VTEwsIE5VTEwpOwotCQlpZiAoYmluZGVyX2NvbnRleHRfbWdyX25vZGUgPT0gTlVMTCkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlLT5sb2NhbF93ZWFrX3JlZnMrKzsKLQkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUtPmxvY2FsX3N0cm9uZ19yZWZzKys7Ci0JCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlLT5oYXNfc3Ryb25nX3JlZiA9IDE7Ci0JCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlLT5oYXNfd2Vha19yZWYgPSAxOwotCQlicmVhazsKLQljYXNlIEJJTkRFUl9USFJFQURfRVhJVDoKLQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19USFJFQURTLCAiYmluZGVyOiAlZDolZCBleGl0XG4iLAotCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKLQkJYmluZGVyX2ZyZWVfdGhyZWFkKHByb2MsIHRocmVhZCk7Ci0JCXRocmVhZCA9IE5VTEw7Ci0JCWJyZWFrOwotCWNhc2UgQklOREVSX1ZFUlNJT046Ci0JCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgYmluZGVyX3ZlcnNpb24pKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJaWYgKHB1dF91c2VyKEJJTkRFUl9DVVJSRU5UX1BST1RPQ09MX1ZFUlNJT04sICYoKHN0cnVjdCBiaW5kZXJfdmVyc2lvbiAqKXVidWYpLT5wcm90b2NvbF92ZXJzaW9uKSkgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQlyZXQgPSAwOwotZXJyOgotCWlmICh0aHJlYWQpCi0JCXRocmVhZC0+bG9vcGVyICY9IH5CSU5ERVJfTE9PUEVSX1NUQVRFX05FRURfUkVUVVJOOwotCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOwotCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShiaW5kZXJfdXNlcl9lcnJvcl93YWl0LCBiaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yIDwgMik7Ci0JaWYgKHJldCAmJiByZXQgIT0gLUVSRVNUQVJUU1lTKQotCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIGlvY3RsICV4ICVseCByZXR1cm5lZCAlZFxuIiwgcHJvYy0+cGlkLCBjdXJyZW50LT5waWQsIGNtZCwgYXJnLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGJpbmRlcl92bWFfb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKLQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX09QRU5fQ0xPU0UsCi0JCSAgICAgImJpbmRlcjogJWQgb3BlbiB2bSBhcmVhICVseC0lbHggKCVsZCBLKSB2bWEgJWx4IHBhZ2VwICVseFxuIiwKLQkJICAgICBwcm9jLT5waWQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLAotCQkgICAgICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpIC8gU1pfMUssIHZtYS0+dm1fZmxhZ3MsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkpOwotCWR1bXBfc3RhY2soKTsKLX0KLQotc3RhdGljIHZvaWQgYmluZGVyX3ZtYV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKLQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX09QRU5fQ0xPU0UsCi0JCSAgICAgImJpbmRlcjogJWQgY2xvc2Ugdm0gYXJlYSAlbHgtJWx4ICglbGQgSykgdm1hICVseCBwYWdlcCAlbHhcbiIsCi0JCSAgICAgcHJvYy0+cGlkLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwKLQkJICAgICAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSAvIFNaXzFLLCB2bWEtPnZtX2ZsYWdzLAotCQkgICAgICh1bnNpZ25lZCBsb25nKXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpKTsKLQlwcm9jLT52bWEgPSBOVUxMOwotCWJpbmRlcl9kZWZlcl93b3JrKHByb2MsIEJJTkRFUl9ERUZFUlJFRF9QVVRfRklMRVMpOwotfQotCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGJpbmRlcl92bV9vcHMgPSB7Ci0JLm9wZW4gPSBiaW5kZXJfdm1hX29wZW4sCi0JLmNsb3NlID0gYmluZGVyX3ZtYV9jbG9zZSwKLX07Ci0KLXN0YXRpYyBpbnQgYmluZGVyX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCWludCByZXQ7Ci0Jc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKLQlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JY29uc3QgY2hhciAqZmFpbHVyZV9zdHJpbmc7Ci0Jc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcjsKLQotCWlmICgodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSA+IFNaXzRNKQotCQl2bWEtPnZtX2VuZCA9IHZtYS0+dm1fc3RhcnQgKyBTWl80TTsKLQotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSwKLQkJICAgICAiYmluZGVyX21tYXA6ICVkICVseC0lbHggKCVsZCBLKSB2bWEgJWx4IHBhZ2VwICVseFxuIiwKLQkJICAgICBwcm9jLT5waWQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLAotCQkgICAgICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpIC8gU1pfMUssIHZtYS0+dm1fZmxhZ3MsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkpOwotCi0JaWYgKHZtYS0+dm1fZmxhZ3MgJiBGT1JCSURERU5fTU1BUF9GTEFHUykgewotCQlyZXQgPSAtRVBFUk07Ci0JCWZhaWx1cmVfc3RyaW5nID0gImJhZCB2bV9mbGFncyI7Ci0JCWdvdG8gZXJyX2JhZF9hcmc7Ci0JfQotCXZtYS0+dm1fZmxhZ3MgPSAodm1hLT52bV9mbGFncyB8IFZNX0RPTlRDT1BZKSAmIH5WTV9NQVlXUklURTsKLQotCWlmIChwcm9jLT5idWZmZXIpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlmYWlsdXJlX3N0cmluZyA9ICJhbHJlYWR5IG1hcHBlZCI7Ci0JCWdvdG8gZXJyX2FscmVhZHlfbWFwcGVkOwotCX0KLQotCWFyZWEgPSBnZXRfdm1fYXJlYSh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIFZNX0lPUkVNQVApOwotCWlmIChhcmVhID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZmFpbHVyZV9zdHJpbmcgPSAiZ2V0X3ZtX2FyZWEiOwotCQlnb3RvIGVycl9nZXRfdm1fYXJlYV9mYWlsZWQ7Ci0JfQotCXByb2MtPmJ1ZmZlciA9IGFyZWEtPmFkZHI7Ci0JcHJvYy0+dXNlcl9idWZmZXJfb2Zmc2V0ID0gdm1hLT52bV9zdGFydCAtICh1aW50cHRyX3QpcHJvYy0+YnVmZmVyOwotCi0jaWZkZWYgQ09ORklHX0NQVV9DQUNIRV9WSVBUCi0JaWYgKGNhY2hlX2lzX3ZpcHRfYWxpYXNpbmcoKSkgewotCQl3aGlsZSAoQ0FDSEVfQ09MT1VSKCh2bWEtPnZtX3N0YXJ0IF4gKHVpbnQzMl90KXByb2MtPmJ1ZmZlcikpKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXJfbW1hcDogJWQgJWx4LSVseCBtYXBzICVwIGJhZCBhbGlnbm1lbnRcbiIsIHByb2MtPnBpZCwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsIHByb2MtPmJ1ZmZlcik7Ci0JCQl2bWEtPnZtX3N0YXJ0ICs9IFBBR0VfU0laRTsKLQkJfQotCX0KLSNlbmRpZgotCXByb2MtPnBhZ2VzID0ga3phbGxvYyhzaXplb2YocHJvYy0+cGFnZXNbMF0pICogKCh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpIC8gUEFHRV9TSVpFKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHByb2MtPnBhZ2VzID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZmFpbHVyZV9zdHJpbmcgPSAiYWxsb2MgcGFnZSBhcnJheSI7Ci0JCWdvdG8gZXJyX2FsbG9jX3BhZ2VzX2ZhaWxlZDsKLQl9Ci0JcHJvYy0+YnVmZmVyX3NpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7Ci0KLQl2bWEtPnZtX29wcyA9ICZiaW5kZXJfdm1fb3BzOwotCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gcHJvYzsKLQotCWlmIChiaW5kZXJfdXBkYXRlX3BhZ2VfcmFuZ2UocHJvYywgMSwgcHJvYy0+YnVmZmVyLCBwcm9jLT5idWZmZXIgKyBQQUdFX1NJWkUsIHZtYSkpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZmFpbHVyZV9zdHJpbmcgPSAiYWxsb2Mgc21hbGwgYnVmIjsKLQkJZ290byBlcnJfYWxsb2Nfc21hbGxfYnVmX2ZhaWxlZDsKLQl9Ci0JYnVmZmVyID0gcHJvYy0+YnVmZmVyOwotCUlOSVRfTElTVF9IRUFEKCZwcm9jLT5idWZmZXJzKTsKLQlsaXN0X2FkZCgmYnVmZmVyLT5lbnRyeSwgJnByb2MtPmJ1ZmZlcnMpOwotCWJ1ZmZlci0+ZnJlZSA9IDE7Ci0JYmluZGVyX2luc2VydF9mcmVlX2J1ZmZlcihwcm9jLCBidWZmZXIpOwotCXByb2MtPmZyZWVfYXN5bmNfc3BhY2UgPSBwcm9jLT5idWZmZXJfc2l6ZSAvIDI7Ci0JYmFycmllcigpOwotCXByb2MtPmZpbGVzID0gZ2V0X2ZpbGVzX3N0cnVjdChjdXJyZW50KTsKLQlwcm9jLT52bWEgPSB2bWE7Ci0KLQkvKnByaW50ayhLRVJOX0lORk8gImJpbmRlcl9tbWFwOiAlZCAlbHgtJWx4IG1hcHMgJXBcbiIsCi0JCSBwcm9jLT5waWQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLCBwcm9jLT5idWZmZXIpOyovCi0JcmV0dXJuIDA7Ci0KLWVycl9hbGxvY19zbWFsbF9idWZfZmFpbGVkOgotCWtmcmVlKHByb2MtPnBhZ2VzKTsKLQlwcm9jLT5wYWdlcyA9IE5VTEw7Ci1lcnJfYWxsb2NfcGFnZXNfZmFpbGVkOgotCXZmcmVlKHByb2MtPmJ1ZmZlcik7Ci0JcHJvYy0+YnVmZmVyID0gTlVMTDsKLWVycl9nZXRfdm1fYXJlYV9mYWlsZWQ6Ci1lcnJfYWxyZWFkeV9tYXBwZWQ6Ci1lcnJfYmFkX2FyZzoKLQlwcmludGsoS0VSTl9FUlIgImJpbmRlcl9tbWFwOiAlZCAlbHgtJWx4ICVzIGZhaWxlZCAlZFxuIiwKLQkgICAgICAgcHJvYy0+cGlkLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgZmFpbHVyZV9zdHJpbmcsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBiaW5kZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKm5vZHAsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYzsKLQotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSwgImJpbmRlcl9vcGVuOiAlZDolZFxuIiwKLQkJICAgICBjdXJyZW50LT5ncm91cF9sZWFkZXItPnBpZCwgY3VycmVudC0+cGlkKTsKLQotCXByb2MgPSBremFsbG9jKHNpemVvZigqcHJvYyksIEdGUF9LRVJORUwpOwotCWlmIChwcm9jID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCWdldF90YXNrX3N0cnVjdChjdXJyZW50KTsKLQlwcm9jLT50c2sgPSBjdXJyZW50OwotCUlOSVRfTElTVF9IRUFEKCZwcm9jLT50b2RvKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcm9jLT53YWl0KTsKLQlwcm9jLT5kZWZhdWx0X3ByaW9yaXR5ID0gdGFza19uaWNlKGN1cnJlbnQpOwotCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKLQliaW5kZXJfc3RhdHNfY3JlYXRlZChCSU5ERVJfU1RBVF9QUk9DKTsKLQlobGlzdF9hZGRfaGVhZCgmcHJvYy0+cHJvY19ub2RlLCAmYmluZGVyX3Byb2NzKTsKLQlwcm9jLT5waWQgPSBjdXJyZW50LT5ncm91cF9sZWFkZXItPnBpZDsKLQlJTklUX0xJU1RfSEVBRCgmcHJvYy0+ZGVsaXZlcmVkX2RlYXRoKTsKLQlmaWxwLT5wcml2YXRlX2RhdGEgPSBwcm9jOwotCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOwotCi0JaWYgKGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9wcm9jKSB7Ci0JCWNoYXIgc3RyYnVmWzExXTsKLQkJc25wcmludGYoc3RyYnVmLCBzaXplb2Yoc3RyYnVmKSwgIiV1IiwgcHJvYy0+cGlkKTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoc3RyYnVmLCBiaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYyk7Ci0JCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoc3RyYnVmLCBTX0lSVUdPLAotCQkJCSAgICAgICBiaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYywKLQkJCQkgICAgICAgYmluZGVyX3JlYWRfcHJvY19wcm9jLCBwcm9jKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBiaW5kZXJfZmx1c2goc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCi17Ci0Jc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCi0JYmluZGVyX2RlZmVyX3dvcmsocHJvYywgQklOREVSX0RFRkVSUkVEX0ZMVVNIKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBiaW5kZXJfZGVmZXJyZWRfZmx1c2goc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jKQotewotCXN0cnVjdCByYl9ub2RlICpuOwotCWludCB3YWtlX2NvdW50ID0gMDsKLQlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+dGhyZWFkcyk7IG4gIT0gTlVMTDsgbiA9IHJiX25leHQobikpIHsKLQkJc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfdGhyZWFkLCByYl9ub2RlKTsKLQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9ORUVEX1JFVFVSTjsKLQkJaWYgKHRocmVhZC0+bG9vcGVyICYgQklOREVSX0xPT1BFUl9TVEFURV9XQUlUSU5HKSB7Ci0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnRocmVhZC0+d2FpdCk7Ci0JCQl3YWtlX2NvdW50Kys7Ci0JCX0KLQl9Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmcHJvYy0+d2FpdCk7Ci0KLQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX09QRU5fQ0xPU0UsCi0JCSAgICAgImJpbmRlcl9mbHVzaDogJWQgd29rZSAlZCB0aHJlYWRzXG4iLCBwcm9jLT5waWQsCi0JCSAgICAgd2FrZV9jb3VudCk7Ci19Ci0KLXN0YXRpYyBpbnQgYmluZGVyX3JlbGVhc2Uoc3RydWN0IGlub2RlICpub2RwLCBzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JaWYgKGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9wcm9jKSB7Ci0JCWNoYXIgc3RyYnVmWzExXTsKLQkJc25wcmludGYoc3RyYnVmLCBzaXplb2Yoc3RyYnVmKSwgIiV1IiwgcHJvYy0+cGlkKTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoc3RyYnVmLCBiaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYyk7Ci0JfQotCi0JYmluZGVyX2RlZmVyX3dvcmsocHJvYywgQklOREVSX0RFRkVSUkVEX1JFTEVBU0UpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJpbmRlcl9kZWZlcnJlZF9yZWxlYXNlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYykKLXsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOwotCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnQ7Ci0Jc3RydWN0IHJiX25vZGUgKm47Ci0JaW50IHRocmVhZHMsIG5vZGVzLCBpbmNvbWluZ19yZWZzLCBvdXRnb2luZ19yZWZzLCBidWZmZXJzLCBhY3RpdmVfdHJhbnNhY3Rpb25zLCBwYWdlX2NvdW50OwotCi0JQlVHX09OKHByb2MtPnZtYSk7Ci0JQlVHX09OKHByb2MtPmZpbGVzKTsKLQotCWhsaXN0X2RlbCgmcHJvYy0+cHJvY19ub2RlKTsKLQlpZiAoYmluZGVyX2NvbnRleHRfbWdyX25vZGUgJiYgYmluZGVyX2NvbnRleHRfbWdyX25vZGUtPnByb2MgPT0gcHJvYykgewotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0RFQURfQklOREVSLAotCQkJICAgICAiYmluZGVyX3JlbGVhc2U6ICVkIGNvbnRleHRfbWdyX25vZGUgZ29uZVxuIiwKLQkJCSAgICAgcHJvYy0+cGlkKTsKLQkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUgPSBOVUxMOwotCX0KLQotCXRocmVhZHMgPSAwOwotCWFjdGl2ZV90cmFuc2FjdGlvbnMgPSAwOwotCXdoaWxlICgobiA9IHJiX2ZpcnN0KCZwcm9jLT50aHJlYWRzKSkpIHsKLQkJc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfdGhyZWFkLCByYl9ub2RlKTsKLQkJdGhyZWFkcysrOwotCQlhY3RpdmVfdHJhbnNhY3Rpb25zICs9IGJpbmRlcl9mcmVlX3RocmVhZChwcm9jLCB0aHJlYWQpOwotCX0KLQlub2RlcyA9IDA7Ci0JaW5jb21pbmdfcmVmcyA9IDA7Ci0Jd2hpbGUgKChuID0gcmJfZmlyc3QoJnByb2MtPm5vZGVzKSkpIHsKLQkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9ub2RlLCByYl9ub2RlKTsKLQotCQlub2RlcysrOwotCQlyYl9lcmFzZSgmbm9kZS0+cmJfbm9kZSwgJnByb2MtPm5vZGVzKTsKLQkJbGlzdF9kZWxfaW5pdCgmbm9kZS0+d29yay5lbnRyeSk7Ci0JCWlmIChobGlzdF9lbXB0eSgmbm9kZS0+cmVmcykpIHsKLQkJCWtmcmVlKG5vZGUpOwotCQkJYmluZGVyX3N0YXRzX2RlbGV0ZWQoQklOREVSX1NUQVRfTk9ERSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmOwotCQkJaW50IGRlYXRoID0gMDsKLQotCQkJbm9kZS0+cHJvYyA9IE5VTEw7Ci0JCQlub2RlLT5sb2NhbF9zdHJvbmdfcmVmcyA9IDA7Ci0JCQlub2RlLT5sb2NhbF93ZWFrX3JlZnMgPSAwOwotCQkJaGxpc3RfYWRkX2hlYWQoJm5vZGUtPmRlYWRfbm9kZSwgJmJpbmRlcl9kZWFkX25vZGVzKTsKLQotCQkJaGxpc3RfZm9yX2VhY2hfZW50cnkocmVmLCBwb3MsICZub2RlLT5yZWZzLCBub2RlX2VudHJ5KSB7Ci0JCQkJaW5jb21pbmdfcmVmcysrOwotCQkJCWlmIChyZWYtPmRlYXRoKSB7Ci0JCQkJCWRlYXRoKys7Ci0JCQkJCWlmIChsaXN0X2VtcHR5KCZyZWYtPmRlYXRoLT53b3JrLmVudHJ5KSkgewotCQkJCQkJcmVmLT5kZWF0aC0+d29yay50eXBlID0gQklOREVSX1dPUktfREVBRF9CSU5ERVI7Ci0JCQkJCQlsaXN0X2FkZF90YWlsKCZyZWYtPmRlYXRoLT53b3JrLmVudHJ5LCAmcmVmLT5wcm9jLT50b2RvKTsKLQkJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcmVmLT5wcm9jLT53YWl0KTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlCVUcoKTsKLQkJCQl9Ci0JCQl9Ci0JCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0RFQURfQklOREVSLAotCQkJCSAgICAgImJpbmRlcjogbm9kZSAlZCBub3cgZGVhZCwgIgotCQkJCSAgICAgInJlZnMgJWQsIGRlYXRoICVkXG4iLCBub2RlLT5kZWJ1Z19pZCwKLQkJCQkgICAgIGluY29taW5nX3JlZnMsIGRlYXRoKTsKLQkJfQotCX0KLQlvdXRnb2luZ19yZWZzID0gMDsKLQl3aGlsZSAoKG4gPSByYl9maXJzdCgmcHJvYy0+cmVmc19ieV9kZXNjKSkpIHsKLQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZiA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfcmVmLAotCQkJCQkJICByYl9ub2RlX2Rlc2MpOwotCQlvdXRnb2luZ19yZWZzKys7Ci0JCWJpbmRlcl9kZWxldGVfcmVmKHJlZik7Ci0JfQotCWJpbmRlcl9yZWxlYXNlX3dvcmsoJnByb2MtPnRvZG8pOwotCWJ1ZmZlcnMgPSAwOwotCi0Jd2hpbGUgKChuID0gcmJfZmlyc3QoJnByb2MtPmFsbG9jYXRlZF9idWZmZXJzKSkpIHsKLQkJc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlciA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfYnVmZmVyLAotCQkJCQkJCXJiX25vZGUpOwotCQl0ID0gYnVmZmVyLT50cmFuc2FjdGlvbjsKLQkJaWYgKHQpIHsKLQkJCXQtPmJ1ZmZlciA9IE5VTEw7Ci0JCQlidWZmZXItPnRyYW5zYWN0aW9uID0gTlVMTDsKLQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiByZWxlYXNlIHByb2MgJWQsICIKLQkJCSAgICAgICAidHJhbnNhY3Rpb24gJWQsIG5vdCBmcmVlZFxuIiwKLQkJCSAgICAgICBwcm9jLT5waWQsIHQtPmRlYnVnX2lkKTsKLQkJCS8qQlVHKCk7Ki8KLQkJfQotCQliaW5kZXJfZnJlZV9idWYocHJvYywgYnVmZmVyKTsKLQkJYnVmZmVycysrOwotCX0KLQotCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX1BST0MpOwotCi0JcGFnZV9jb3VudCA9IDA7Ci0JaWYgKHByb2MtPnBhZ2VzKSB7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgcHJvYy0+YnVmZmVyX3NpemUgLyBQQUdFX1NJWkU7IGkrKykgewotCQkJaWYgKHByb2MtPnBhZ2VzW2ldKSB7Ci0JCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MsCi0JCQkJCSAgICAgImJpbmRlcl9yZWxlYXNlOiAlZDogIgotCQkJCQkgICAgICJwYWdlICVkIGF0ICVwIG5vdCBmcmVlZFxuIiwKLQkJCQkJICAgICBwcm9jLT5waWQsIGksCi0JCQkJCSAgICAgcHJvYy0+YnVmZmVyICsgaSAqIFBBR0VfU0laRSk7Ci0JCQkJX19mcmVlX3BhZ2UocHJvYy0+cGFnZXNbaV0pOwotCQkJCXBhZ2VfY291bnQrKzsKLQkJCX0KLQkJfQotCQlrZnJlZShwcm9jLT5wYWdlcyk7Ci0JCXZmcmVlKHByb2MtPmJ1ZmZlcik7Ci0JfQotCi0JcHV0X3Rhc2tfc3RydWN0KHByb2MtPnRzayk7Ci0KLQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX09QRU5fQ0xPU0UsCi0JCSAgICAgImJpbmRlcl9yZWxlYXNlOiAlZCB0aHJlYWRzICVkLCBub2RlcyAlZCAocmVmICVkKSwgIgotCQkgICAgICJyZWZzICVkLCBhY3RpdmUgdHJhbnNhY3Rpb25zICVkLCBidWZmZXJzICVkLCAiCi0JCSAgICAgInBhZ2VzICVkXG4iLAotCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkcywgbm9kZXMsIGluY29taW5nX3JlZnMsIG91dGdvaW5nX3JlZnMsCi0JCSAgICAgYWN0aXZlX3RyYW5zYWN0aW9ucywgYnVmZmVycywgcGFnZV9jb3VudCk7Ci0KLQlrZnJlZShwcm9jKTsKLX0KLQotc3RhdGljIHZvaWQgYmluZGVyX2RlZmVycmVkX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYzsKLQlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKLQotCWludCBkZWZlcjsKLQlkbyB7Ci0JCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKLQkJbXV0ZXhfbG9jaygmYmluZGVyX2RlZmVycmVkX2xvY2spOwotCQlpZiAoIWhsaXN0X2VtcHR5KCZiaW5kZXJfZGVmZXJyZWRfbGlzdCkpIHsKLQkJCXByb2MgPSBobGlzdF9lbnRyeShiaW5kZXJfZGVmZXJyZWRfbGlzdC5maXJzdCwKLQkJCQkJc3RydWN0IGJpbmRlcl9wcm9jLCBkZWZlcnJlZF93b3JrX25vZGUpOwotCQkJaGxpc3RfZGVsX2luaXQoJnByb2MtPmRlZmVycmVkX3dvcmtfbm9kZSk7Ci0JCQlkZWZlciA9IHByb2MtPmRlZmVycmVkX3dvcms7Ci0JCQlwcm9jLT5kZWZlcnJlZF93b3JrID0gMDsKLQkJfSBlbHNlIHsKLQkJCXByb2MgPSBOVUxMOwotCQkJZGVmZXIgPSAwOwotCQl9Ci0JCW11dGV4X3VubG9jaygmYmluZGVyX2RlZmVycmVkX2xvY2spOwotCi0JCWZpbGVzID0gTlVMTDsKLQkJaWYgKGRlZmVyICYgQklOREVSX0RFRkVSUkVEX1BVVF9GSUxFUykgewotCQkJZmlsZXMgPSBwcm9jLT5maWxlczsKLQkJCWlmIChmaWxlcykKLQkJCQlwcm9jLT5maWxlcyA9IE5VTEw7Ci0JCX0KLQotCQlpZiAoZGVmZXIgJiBCSU5ERVJfREVGRVJSRURfRkxVU0gpCi0JCQliaW5kZXJfZGVmZXJyZWRfZmx1c2gocHJvYyk7Ci0KLQkJaWYgKGRlZmVyICYgQklOREVSX0RFRkVSUkVEX1JFTEVBU0UpCi0JCQliaW5kZXJfZGVmZXJyZWRfcmVsZWFzZShwcm9jKTsgLyogZnJlZXMgcHJvYyAqLwotCi0JCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOwotCQlpZiAoZmlsZXMpCi0JCQlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKLQl9IHdoaWxlIChwcm9jKTsKLX0KLXN0YXRpYyBERUNMQVJFX1dPUksoYmluZGVyX2RlZmVycmVkX3dvcmssIGJpbmRlcl9kZWZlcnJlZF9mdW5jKTsKLQotc3RhdGljIHZvaWQKLWJpbmRlcl9kZWZlcl93b3JrKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgZW51bSBiaW5kZXJfZGVmZXJyZWRfc3RhdGUgZGVmZXIpCi17Ci0JbXV0ZXhfbG9jaygmYmluZGVyX2RlZmVycmVkX2xvY2spOwotCXByb2MtPmRlZmVycmVkX3dvcmsgfD0gZGVmZXI7Ci0JaWYgKGhsaXN0X3VuaGFzaGVkKCZwcm9jLT5kZWZlcnJlZF93b3JrX25vZGUpKSB7Ci0JCWhsaXN0X2FkZF9oZWFkKCZwcm9jLT5kZWZlcnJlZF93b3JrX25vZGUsCi0JCQkJJmJpbmRlcl9kZWZlcnJlZF9saXN0KTsKLQkJc2NoZWR1bGVfd29yaygmYmluZGVyX2RlZmVycmVkX3dvcmspOwotCX0KLQltdXRleF91bmxvY2soJmJpbmRlcl9kZWZlcnJlZF9sb2NrKTsKLX0KLQotc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl90cmFuc2FjdGlvbihjaGFyICpidWYsIGNoYXIgKmVuZCwgY29uc3QgY2hhciAqcHJlZml4LAotCQkJCSAgICAgIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnQpCi17Ci0JYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAotCQkJIiVzICVkOiAlcCBmcm9tICVkOiVkIHRvICVkOiVkIGNvZGUgJXggIgotCQkJImZsYWdzICV4IHByaSAlbGQgciVkIiwKLQkJCXByZWZpeCwgdC0+ZGVidWdfaWQsIHQsCi0JCQl0LT5mcm9tID8gdC0+ZnJvbS0+cHJvYy0+cGlkIDogMCwKLQkJCXQtPmZyb20gPyB0LT5mcm9tLT5waWQgOiAwLAotCQkJdC0+dG9fcHJvYyA/IHQtPnRvX3Byb2MtPnBpZCA6IDAsCi0JCQl0LT50b190aHJlYWQgPyB0LT50b190aHJlYWQtPnBpZCA6IDAsCi0JCQl0LT5jb2RlLCB0LT5mbGFncywgdC0+cHJpb3JpdHksIHQtPm5lZWRfcmVwbHkpOwotCWlmIChidWYgPj0gZW5kKQotCQlyZXR1cm4gYnVmOwotCWlmICh0LT5idWZmZXIgPT0gTlVMTCkgewotCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgYnVmZmVyIGZyZWVcbiIpOwotCQlyZXR1cm4gYnVmOwotCX0KLQlpZiAodC0+YnVmZmVyLT50YXJnZXRfbm9kZSkgewotCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgbm9kZSAlZCIsCi0JCQkJdC0+YnVmZmVyLT50YXJnZXRfbm9kZS0+ZGVidWdfaWQpOwotCQlpZiAoYnVmID49IGVuZCkKLQkJCXJldHVybiBidWY7Ci0JfQotCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiBzaXplICV6ZDolemQgZGF0YSAlcFxuIiwKLQkJCXQtPmJ1ZmZlci0+ZGF0YV9zaXplLCB0LT5idWZmZXItPm9mZnNldHNfc2l6ZSwKLQkJCXQtPmJ1ZmZlci0+ZGF0YSk7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl9idWZmZXIoY2hhciAqYnVmLCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKnByZWZpeCwKLQkJCQkgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIlcyAlZDogJXAgc2l6ZSAlemQ6JXpkICVzXG4iLAotCQkJcHJlZml4LCBidWZmZXItPmRlYnVnX2lkLCBidWZmZXItPmRhdGEsCi0JCQlidWZmZXItPmRhdGFfc2l6ZSwgYnVmZmVyLT5vZmZzZXRzX3NpemUsCi0JCQlidWZmZXItPnRyYW5zYWN0aW9uID8gImFjdGl2ZSIgOiAiZGVsaXZlcmVkIik7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl93b3JrKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBjb25zdCBjaGFyICpwcmVmaXgsCi0JCQkgICAgICAgY29uc3QgY2hhciAqdHJhbnNhY3Rpb25fcHJlZml4LAotCQkJICAgICAgIHN0cnVjdCBiaW5kZXJfd29yayAqdykKLXsKLQlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGU7Ci0Jc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdDsKLQotCXN3aXRjaCAody0+dHlwZSkgewotCWNhc2UgQklOREVSX1dPUktfVFJBTlNBQ1RJT046Ci0JCXQgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiwgd29yayk7Ci0JCWJ1ZiA9IHByaW50X2JpbmRlcl90cmFuc2FjdGlvbihidWYsIGVuZCwgdHJhbnNhY3Rpb25fcHJlZml4LCB0KTsKLQkJYnJlYWs7Ci0JY2FzZSBCSU5ERVJfV09SS19UUkFOU0FDVElPTl9DT01QTEVURToKLQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAotCQkJCSIlc3RyYW5zYWN0aW9uIGNvbXBsZXRlXG4iLCBwcmVmaXgpOwotCQlicmVhazsKLQljYXNlIEJJTkRFUl9XT1JLX05PREU6Ci0JCW5vZGUgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl9ub2RlLCB3b3JrKTsKLQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiJXNub2RlIHdvcmsgJWQ6IHUlcCBjJXBcbiIsCi0JCQkJcHJlZml4LCBub2RlLT5kZWJ1Z19pZCwgbm9kZS0+cHRyLAotCQkJCW5vZGUtPmNvb2tpZSk7Ci0JCWJyZWFrOwotCWNhc2UgQklOREVSX1dPUktfREVBRF9CSU5ERVI6Ci0JCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzaGFzIGRlYWQgYmluZGVyXG4iLCBwcmVmaXgpOwotCQlicmVhazsKLQljYXNlIEJJTkRFUl9XT1JLX0RFQURfQklOREVSX0FORF9DTEVBUjoKLQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAotCQkJCSIlc2hhcyBjbGVhcmVkIGRlYWQgYmluZGVyXG4iLCBwcmVmaXgpOwotCQlicmVhazsKLQljYXNlIEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjoKLQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAotCQkJCSIlc2hhcyBjbGVhcmVkIGRlYXRoIG5vdGlmaWNhdGlvblxuIiwgcHJlZml4KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiJXN1bmtub3duIHdvcms6IHR5cGUgJWRcbiIsCi0JCQkJcHJlZml4LCB3LT50eXBlKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBidWY7Ci19Ci0KLXN0YXRpYyBjaGFyICpwcmludF9iaW5kZXJfdGhyZWFkKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLAotCQkJCSBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkLAotCQkJCSBpbnQgcHJpbnRfYWx3YXlzKQotewotCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnQ7Ci0Jc3RydWN0IGJpbmRlcl93b3JrICp3OwotCWNoYXIgKnN0YXJ0X2J1ZiA9IGJ1ZjsKLQljaGFyICpoZWFkZXJfYnVmOwotCi0JYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICB0aHJlYWQgJWQ6IGwgJTAyeFxuIiwKLQkJCXRocmVhZC0+cGlkLCB0aHJlYWQtPmxvb3Blcik7Ci0JaGVhZGVyX2J1ZiA9IGJ1ZjsKLQl0ID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjazsKLQl3aGlsZSAodCkgewotCQlpZiAoYnVmID49IGVuZCkKLQkJCWJyZWFrOwotCQlpZiAodC0+ZnJvbSA9PSB0aHJlYWQpIHsKLQkJCWJ1ZiA9IHByaW50X2JpbmRlcl90cmFuc2FjdGlvbihidWYsIGVuZCwKLQkJCQkJCSIgICAgb3V0Z29pbmcgdHJhbnNhY3Rpb24iLCB0KTsKLQkJCXQgPSB0LT5mcm9tX3BhcmVudDsKLQkJfSBlbHNlIGlmICh0LT50b190aHJlYWQgPT0gdGhyZWFkKSB7Ci0JCQlidWYgPSBwcmludF9iaW5kZXJfdHJhbnNhY3Rpb24oYnVmLCBlbmQsCi0JCQkJCQkiICAgIGluY29taW5nIHRyYW5zYWN0aW9uIiwgdCk7Ci0JCQl0ID0gdC0+dG9fcGFyZW50OwotCQl9IGVsc2UgewotCQkJYnVmID0gcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uKGJ1ZiwgZW5kLAotCQkJCQkJIiAgICBiYWQgdHJhbnNhY3Rpb24iLCB0KTsKLQkJCXQgPSBOVUxMOwotCQl9Ci0JfQotCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJnRocmVhZC0+dG9kbywgZW50cnkpIHsKLQkJaWYgKGJ1ZiA+PSBlbmQpCi0JCQlicmVhazsKLQkJYnVmID0gcHJpbnRfYmluZGVyX3dvcmsoYnVmLCBlbmQsICIgICAgIiwKLQkJCQkJIiAgICBwZW5kaW5nIHRyYW5zYWN0aW9uIiwgdyk7Ci0JfQotCWlmICghcHJpbnRfYWx3YXlzICYmIGJ1ZiA9PSBoZWFkZXJfYnVmKQotCQlidWYgPSBzdGFydF9idWY7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl9ub2RlKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUpCi17Ci0Jc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOwotCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKLQlpbnQgY291bnQ7Ci0KLQljb3VudCA9IDA7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnkocmVmLCBwb3MsICZub2RlLT5yZWZzLCBub2RlX2VudHJ5KQotCQljb3VudCsrOwotCi0JYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAotCQkJIiAgbm9kZSAlZDogdSVwIGMlcCBocyAlZCBodyAlZCBscyAlZCBsdyAlZCAiCi0JCQkiaXMgJWQgaXcgJWQiLAotCQkJbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0ciwgbm9kZS0+Y29va2llLAotCQkJbm9kZS0+aGFzX3N0cm9uZ19yZWYsIG5vZGUtPmhhc193ZWFrX3JlZiwKLQkJCW5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzLCBub2RlLT5sb2NhbF93ZWFrX3JlZnMsCi0JCQlub2RlLT5pbnRlcm5hbF9zdHJvbmdfcmVmcywgY291bnQpOwotCWlmIChidWYgPj0gZW5kKQotCQlyZXR1cm4gYnVmOwotCWlmIChjb3VudCkgewotCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgcHJvYyIpOwotCQlpZiAoYnVmID49IGVuZCkKLQkJCXJldHVybiBidWY7Ci0JCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZiwgcG9zLCAmbm9kZS0+cmVmcywgbm9kZV9lbnRyeSkgewotCQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICVkIiwgcmVmLT5wcm9jLT5waWQpOwotCQkJaWYgKGJ1ZiA+PSBlbmQpCi0JCQkJcmV0dXJuIGJ1ZjsKLQkJfQotCX0KLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICJcbiIpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJm5vZGUtPmFzeW5jX3RvZG8sIGVudHJ5KSB7Ci0JCWlmIChidWYgPj0gZW5kKQotCQkJYnJlYWs7Ci0JCWJ1ZiA9IHByaW50X2JpbmRlcl93b3JrKGJ1ZiwgZW5kLCAiICAgICIsCi0JCQkJCSIgICAgcGVuZGluZyBhc3luYyB0cmFuc2FjdGlvbiIsIHcpOwotCX0KLQlyZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX3JlZihjaGFyICpidWYsIGNoYXIgKmVuZCwgc3RydWN0IGJpbmRlcl9yZWYgKnJlZikKLXsKLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsCi0JCQkiICByZWYgJWQ6IGRlc2MgJWQgJXNub2RlICVkIHMgJWQgdyAlZCBkICVwXG4iLAotCQkJcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjLAotCQkJcmVmLT5ub2RlLT5wcm9jID8gIiIgOiAiZGVhZCAiLCByZWYtPm5vZGUtPmRlYnVnX2lkLAotCQkJcmVmLT5zdHJvbmcsIHJlZi0+d2VhaywgcmVmLT5kZWF0aCk7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl9wcm9jKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLAotCQkJICAgICAgIHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgaW50IHByaW50X2FsbCkKLXsKLQlzdHJ1Y3QgYmluZGVyX3dvcmsgKnc7Ci0Jc3RydWN0IHJiX25vZGUgKm47Ci0JY2hhciAqc3RhcnRfYnVmID0gYnVmOwotCWNoYXIgKmhlYWRlcl9idWY7Ci0KLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICJwcm9jICVkXG4iLCBwcm9jLT5waWQpOwotCWhlYWRlcl9idWYgPSBidWY7Ci0KLQlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+dGhyZWFkcyk7Ci0JICAgICBuICE9IE5VTEwgJiYgYnVmIDwgZW5kOwotCSAgICAgbiA9IHJiX25leHQobikpCi0JCWJ1ZiA9IHByaW50X2JpbmRlcl90aHJlYWQoYnVmLCBlbmQsCi0JCQkJCSAgcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl90aHJlYWQsCi0JCQkJCQkgICByYl9ub2RlKSwgcHJpbnRfYWxsKTsKLQlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+bm9kZXMpOwotCSAgICAgbiAhPSBOVUxMICYmIGJ1ZiA8IGVuZDsKLQkgICAgIG4gPSByYl9uZXh0KG4pKSB7Ci0JCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfbm9kZSwKLQkJCQkJCSAgICByYl9ub2RlKTsKLQkJaWYgKHByaW50X2FsbCB8fCBub2RlLT5oYXNfYXN5bmNfdHJhbnNhY3Rpb24pCi0JCQlidWYgPSBwcmludF9iaW5kZXJfbm9kZShidWYsIGVuZCwgbm9kZSk7Ci0JfQotCWlmIChwcmludF9hbGwpIHsKLQkJZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPnJlZnNfYnlfZGVzYyk7Ci0JCSAgICAgbiAhPSBOVUxMICYmIGJ1ZiA8IGVuZDsKLQkJICAgICBuID0gcmJfbmV4dChuKSkKLQkJCWJ1ZiA9IHByaW50X2JpbmRlcl9yZWYoYnVmLCBlbmQsCi0JCQkJCSAgICAgICByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX3JlZiwKLQkJCQkJCQlyYl9ub2RlX2Rlc2MpKTsKLQl9Ci0JZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPmFsbG9jYXRlZF9idWZmZXJzKTsKLQkgICAgIG4gIT0gTlVMTCAmJiBidWYgPCBlbmQ7Ci0JICAgICBuID0gcmJfbmV4dChuKSkKLQkJYnVmID0gcHJpbnRfYmluZGVyX2J1ZmZlcihidWYsIGVuZCwgIiAgYnVmZmVyIiwKLQkJCQkJICByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwKLQkJCQkJCSAgIHJiX25vZGUpKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZwcm9jLT50b2RvLCBlbnRyeSkgewotCQlpZiAoYnVmID49IGVuZCkKLQkJCWJyZWFrOwotCQlidWYgPSBwcmludF9iaW5kZXJfd29yayhidWYsIGVuZCwgIiAgIiwKLQkJCQkJIiAgcGVuZGluZyB0cmFuc2FjdGlvbiIsIHcpOwotCX0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZwcm9jLT5kZWxpdmVyZWRfZGVhdGgsIGVudHJ5KSB7Ci0JCWlmIChidWYgPj0gZW5kKQotCQkJYnJlYWs7Ci0JCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwKLQkJCQkiICBoYXMgZGVsaXZlcmVkIGRlYWQgYmluZGVyXG4iKTsKLQkJYnJlYWs7Ci0JfQotCWlmICghcHJpbnRfYWxsICYmIGJ1ZiA9PSBoZWFkZXJfYnVmKQotCQlidWYgPSBzdGFydF9idWY7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmJpbmRlcl9yZXR1cm5fc3RyaW5nc1tdID0gewotCSJCUl9FUlJPUiIsCi0JIkJSX09LIiwKLQkiQlJfVFJBTlNBQ1RJT04iLAotCSJCUl9SRVBMWSIsCi0JIkJSX0FDUVVJUkVfUkVTVUxUIiwKLQkiQlJfREVBRF9SRVBMWSIsCi0JIkJSX1RSQU5TQUNUSU9OX0NPTVBMRVRFIiwKLQkiQlJfSU5DUkVGUyIsCi0JIkJSX0FDUVVJUkUiLAotCSJCUl9SRUxFQVNFIiwKLQkiQlJfREVDUkVGUyIsCi0JIkJSX0FUVEVNUFRfQUNRVUlSRSIsCi0JIkJSX05PT1AiLAotCSJCUl9TUEFXTl9MT09QRVIiLAotCSJCUl9GSU5JU0hFRCIsCi0JIkJSX0RFQURfQklOREVSIiwKLQkiQlJfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OX0RPTkUiLAotCSJCUl9GQUlMRURfUkVQTFkiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqYmluZGVyX2NvbW1hbmRfc3RyaW5nc1tdID0gewotCSJCQ19UUkFOU0FDVElPTiIsCi0JIkJDX1JFUExZIiwKLQkiQkNfQUNRVUlSRV9SRVNVTFQiLAotCSJCQ19GUkVFX0JVRkZFUiIsCi0JIkJDX0lOQ1JFRlMiLAotCSJCQ19BQ1FVSVJFIiwKLQkiQkNfUkVMRUFTRSIsCi0JIkJDX0RFQ1JFRlMiLAotCSJCQ19JTkNSRUZTX0RPTkUiLAotCSJCQ19BQ1FVSVJFX0RPTkUiLAotCSJCQ19BVFRFTVBUX0FDUVVJUkUiLAotCSJCQ19SRUdJU1RFUl9MT09QRVIiLAotCSJCQ19FTlRFUl9MT09QRVIiLAotCSJCQ19FWElUX0xPT1BFUiIsCi0JIkJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OIiwKLQkiQkNfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OIiwKLQkiQkNfREVBRF9CSU5ERVJfRE9ORSIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpiaW5kZXJfb2Jqc3RhdF9zdHJpbmdzW10gPSB7Ci0JInByb2MiLAotCSJ0aHJlYWQiLAotCSJub2RlIiwKLQkicmVmIiwKLQkiZGVhdGgiLAotCSJ0cmFuc2FjdGlvbiIsCi0JInRyYW5zYWN0aW9uX2NvbXBsZXRlIgotfTsKLQotc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl9zdGF0cyhjaGFyICpidWYsIGNoYXIgKmVuZCwgY29uc3QgY2hhciAqcHJlZml4LAotCQkJCXN0cnVjdCBiaW5kZXJfc3RhdHMgKnN0YXRzKQotewotCWludCBpOwotCi0JQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoc3RhdHMtPmJjKSAhPQotCQkJQVJSQVlfU0laRShiaW5kZXJfY29tbWFuZF9zdHJpbmdzKSk7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RhdHMtPmJjKTsgaSsrKSB7Ci0JCWlmIChzdGF0cy0+YmNbaV0pCi0JCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIlcyVzOiAlZFxuIiwgcHJlZml4LAotCQkJCQliaW5kZXJfY29tbWFuZF9zdHJpbmdzW2ldLAotCQkJCQlzdGF0cy0+YmNbaV0pOwotCQlpZiAoYnVmID49IGVuZCkKLQkJCXJldHVybiBidWY7Ci0JfQotCi0JQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoc3RhdHMtPmJyKSAhPQotCQkJQVJSQVlfU0laRShiaW5kZXJfcmV0dXJuX3N0cmluZ3MpKTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGF0cy0+YnIpOyBpKyspIHsKLQkJaWYgKHN0YXRzLT5icltpXSkKLQkJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzJXM6ICVkXG4iLCBwcmVmaXgsCi0JCQkJCWJpbmRlcl9yZXR1cm5fc3RyaW5nc1tpXSwgc3RhdHMtPmJyW2ldKTsKLQkJaWYgKGJ1ZiA+PSBlbmQpCi0JCQlyZXR1cm4gYnVmOwotCX0KLQotCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKHN0YXRzLT5vYmpfY3JlYXRlZCkgIT0KLQkJCUFSUkFZX1NJWkUoYmluZGVyX29ianN0YXRfc3RyaW5ncykpOwotCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKHN0YXRzLT5vYmpfY3JlYXRlZCkgIT0KLQkJCUFSUkFZX1NJWkUoc3RhdHMtPm9ial9kZWxldGVkKSk7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RhdHMtPm9ial9jcmVhdGVkKTsgaSsrKSB7Ci0JCWlmIChzdGF0cy0+b2JqX2NyZWF0ZWRbaV0gfHwgc3RhdHMtPm9ial9kZWxldGVkW2ldKQotCQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAotCQkJCQkiJXMlczogYWN0aXZlICVkIHRvdGFsICVkXG4iLCBwcmVmaXgsCi0JCQkJCWJpbmRlcl9vYmpzdGF0X3N0cmluZ3NbaV0sCi0JCQkJCXN0YXRzLT5vYmpfY3JlYXRlZFtpXSAtCi0JCQkJCQlzdGF0cy0+b2JqX2RlbGV0ZWRbaV0sCi0JCQkJCXN0YXRzLT5vYmpfY3JlYXRlZFtpXSk7Ci0JCWlmIChidWYgPj0gZW5kKQotCQkJcmV0dXJuIGJ1ZjsKLQl9Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl9wcm9jX3N0YXRzKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLAotCQkJCSAgICAgc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jKQotewotCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKLQlzdHJ1Y3QgcmJfbm9kZSAqbjsKLQlpbnQgY291bnQsIHN0cm9uZywgd2VhazsKLQotCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgInByb2MgJWRcbiIsIHByb2MtPnBpZCk7Ci0JaWYgKGJ1ZiA+PSBlbmQpCi0JCXJldHVybiBidWY7Ci0JY291bnQgPSAwOwotCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT50aHJlYWRzKTsgbiAhPSBOVUxMOyBuID0gcmJfbmV4dChuKSkKLQkJY291bnQrKzsKLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgIHRocmVhZHM6ICVkXG4iLCBjb3VudCk7Ci0JaWYgKGJ1ZiA+PSBlbmQpCi0JCXJldHVybiBidWY7Ci0JYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICByZXF1ZXN0ZWQgdGhyZWFkczogJWQrJWQvJWRcbiIKLQkJCSIgIHJlYWR5IHRocmVhZHMgJWRcbiIKLQkJCSIgIGZyZWUgYXN5bmMgc3BhY2UgJXpkXG4iLCBwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkcywKLQkJCXByb2MtPnJlcXVlc3RlZF90aHJlYWRzX3N0YXJ0ZWQsIHByb2MtPm1heF90aHJlYWRzLAotCQkJcHJvYy0+cmVhZHlfdGhyZWFkcywgcHJvYy0+ZnJlZV9hc3luY19zcGFjZSk7Ci0JaWYgKGJ1ZiA+PSBlbmQpCi0JCXJldHVybiBidWY7Ci0JY291bnQgPSAwOwotCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT5ub2Rlcyk7IG4gIT0gTlVMTDsgbiA9IHJiX25leHQobikpCi0JCWNvdW50Kys7Ci0JYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICBub2RlczogJWRcbiIsIGNvdW50KTsKLQlpZiAoYnVmID49IGVuZCkKLQkJcmV0dXJuIGJ1ZjsKLQljb3VudCA9IDA7Ci0Jc3Ryb25nID0gMDsKLQl3ZWFrID0gMDsKLQlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+cmVmc19ieV9kZXNjKTsgbiAhPSBOVUxMOyBuID0gcmJfbmV4dChuKSkgewotCQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9yZWYsCi0JCQkJCQkgIHJiX25vZGVfZGVzYyk7Ci0JCWNvdW50Kys7Ci0JCXN0cm9uZyArPSByZWYtPnN0cm9uZzsKLQkJd2VhayArPSByZWYtPndlYWs7Ci0JfQotCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgcmVmczogJWQgcyAlZCB3ICVkXG4iLAotCQkJY291bnQsIHN0cm9uZywgd2Vhayk7Ci0JaWYgKGJ1ZiA+PSBlbmQpCi0JCXJldHVybiBidWY7Ci0KLQljb3VudCA9IDA7Ci0JZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPmFsbG9jYXRlZF9idWZmZXJzKTsgbiAhPSBOVUxMOyBuID0gcmJfbmV4dChuKSkKLQkJY291bnQrKzsKLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgIGJ1ZmZlcnM6ICVkXG4iLCBjb3VudCk7Ci0JaWYgKGJ1ZiA+PSBlbmQpCi0JCXJldHVybiBidWY7Ci0KLQljb3VudCA9IDA7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmcHJvYy0+dG9kbywgZW50cnkpIHsKLQkJc3dpdGNoICh3LT50eXBlKSB7Ci0JCWNhc2UgQklOREVSX1dPUktfVFJBTlNBQ1RJT046Ci0JCQljb3VudCsrOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgIHBlbmRpbmcgdHJhbnNhY3Rpb25zOiAlZFxuIiwgY291bnQpOwotCWlmIChidWYgPj0gZW5kKQotCQlyZXR1cm4gYnVmOwotCi0JYnVmID0gcHJpbnRfYmluZGVyX3N0YXRzKGJ1ZiwgZW5kLCAiICAiLCAmcHJvYy0+c3RhdHMpOwotCi0JcmV0dXJuIGJ1ZjsKLX0KLQotCi1zdGF0aWMgaW50IGJpbmRlcl9yZWFkX3Byb2Nfc3RhdGUoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCQkJICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYzsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOwotCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKLQlpbnQgbGVuID0gMDsKLQljaGFyICpidWYgPSBwYWdlOwotCWNoYXIgKmVuZCA9IHBhZ2UgKyBQQUdFX1NJWkU7Ci0JaW50IGRvX2xvY2sgPSAhYmluZGVyX2RlYnVnX25vX2xvY2s7Ci0KLQlpZiAob2ZmKQotCQlyZXR1cm4gMDsKLQotCWlmIChkb19sb2NrKQotCQltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7Ci0KLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICJiaW5kZXIgc3RhdGU6XG4iKTsKLQotCWlmICghaGxpc3RfZW1wdHkoJmJpbmRlcl9kZWFkX25vZGVzKSkKLQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiZGVhZCBub2RlczpcbiIpOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsIHBvcywgJmJpbmRlcl9kZWFkX25vZGVzLCBkZWFkX25vZGUpIHsKLQkJaWYgKGJ1ZiA+PSBlbmQpCi0JCQlicmVhazsKLQkJYnVmID0gcHJpbnRfYmluZGVyX25vZGUoYnVmLCBlbmQsIG5vZGUpOwotCX0KLQotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb2MsIHBvcywgJmJpbmRlcl9wcm9jcywgcHJvY19ub2RlKSB7Ci0JCWlmIChidWYgPj0gZW5kKQotCQkJYnJlYWs7Ci0JCWJ1ZiA9IHByaW50X2JpbmRlcl9wcm9jKGJ1ZiwgZW5kLCBwcm9jLCAxKTsKLQl9Ci0JaWYgKGRvX2xvY2spCi0JCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOwotCWlmIChidWYgPiBwYWdlICsgUEFHRV9TSVpFKQotCQlidWYgPSBwYWdlICsgUEFHRV9TSVpFOwotCi0JKnN0YXJ0ID0gcGFnZSArIG9mZjsKLQotCWxlbiA9IGJ1ZiAtIHBhZ2U7Ci0JaWYgKGxlbiA+IG9mZikKLQkJbGVuIC09IG9mZjsKLQllbHNlCi0JCWxlbiA9IDA7Ci0KLQlyZXR1cm4gbGVuIDwgY291bnQgPyBsZW4gIDogY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQgYmluZGVyX3JlYWRfcHJvY19zdGF0cyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKLQkJCQkgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOwotCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7Ci0JaW50IGxlbiA9IDA7Ci0JY2hhciAqcCA9IHBhZ2U7Ci0JaW50IGRvX2xvY2sgPSAhYmluZGVyX2RlYnVnX25vX2xvY2s7Ci0KLQlpZiAob2ZmKQotCQlyZXR1cm4gMDsKLQotCWlmIChkb19sb2NrKQotCQltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7Ci0KLQlwICs9IHNucHJpbnRmKHAsIFBBR0VfU0laRSwgImJpbmRlciBzdGF0czpcbiIpOwotCi0JcCA9IHByaW50X2JpbmRlcl9zdGF0cyhwLCBwYWdlICsgUEFHRV9TSVpFLCAiIiwgJmJpbmRlcl9zdGF0cyk7Ci0KLQlobGlzdF9mb3JfZWFjaF9lbnRyeShwcm9jLCBwb3MsICZiaW5kZXJfcHJvY3MsIHByb2Nfbm9kZSkgewotCQlpZiAocCA+PSBwYWdlICsgUEFHRV9TSVpFKQotCQkJYnJlYWs7Ci0JCXAgPSBwcmludF9iaW5kZXJfcHJvY19zdGF0cyhwLCBwYWdlICsgUEFHRV9TSVpFLCBwcm9jKTsKLQl9Ci0JaWYgKGRvX2xvY2spCi0JCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOwotCWlmIChwID4gcGFnZSArIFBBR0VfU0laRSkKLQkJcCA9IHBhZ2UgKyBQQUdFX1NJWkU7Ci0KLQkqc3RhcnQgPSBwYWdlICsgb2ZmOwotCi0JbGVuID0gcCAtIHBhZ2U7Ci0JaWYgKGxlbiA+IG9mZikKLQkJbGVuIC09IG9mZjsKLQllbHNlCi0JCWxlbiA9IDA7Ci0KLQlyZXR1cm4gbGVuIDwgY291bnQgPyBsZW4gIDogY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQgYmluZGVyX3JlYWRfcHJvY190cmFuc2FjdGlvbnMoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCQkJCSBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYzsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOwotCWludCBsZW4gPSAwOwotCWNoYXIgKmJ1ZiA9IHBhZ2U7Ci0JY2hhciAqZW5kID0gcGFnZSArIFBBR0VfU0laRTsKLQlpbnQgZG9fbG9jayA9ICFiaW5kZXJfZGVidWdfbm9fbG9jazsKLQotCWlmIChvZmYpCi0JCXJldHVybiAwOwotCi0JaWYgKGRvX2xvY2spCi0JCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKLQotCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgImJpbmRlciB0cmFuc2FjdGlvbnM6XG4iKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeShwcm9jLCBwb3MsICZiaW5kZXJfcHJvY3MsIHByb2Nfbm9kZSkgewotCQlpZiAoYnVmID49IGVuZCkKLQkJCWJyZWFrOwotCQlidWYgPSBwcmludF9iaW5kZXJfcHJvYyhidWYsIGVuZCwgcHJvYywgMCk7Ci0JfQotCWlmIChkb19sb2NrKQotCQltdXRleF91bmxvY2soJmJpbmRlcl9sb2NrKTsKLQlpZiAoYnVmID4gcGFnZSArIFBBR0VfU0laRSkKLQkJYnVmID0gcGFnZSArIFBBR0VfU0laRTsKLQotCSpzdGFydCA9IHBhZ2UgKyBvZmY7Ci0KLQlsZW4gPSBidWYgLSBwYWdlOwotCWlmIChsZW4gPiBvZmYpCi0JCWxlbiAtPSBvZmY7Ci0JZWxzZQotCQlsZW4gPSAwOwotCi0JcmV0dXJuIGxlbiA8IGNvdW50ID8gbGVuICA6IGNvdW50OwotfQotCi1zdGF0aWMgaW50IGJpbmRlcl9yZWFkX3Byb2NfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKLQkJCQkgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MgPSBkYXRhOwotCWludCBsZW4gPSAwOwotCWNoYXIgKnAgPSBwYWdlOwotCWludCBkb19sb2NrID0gIWJpbmRlcl9kZWJ1Z19ub19sb2NrOwotCi0JaWYgKG9mZikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZG9fbG9jaykKLQkJbXV0ZXhfbG9jaygmYmluZGVyX2xvY2spOwotCXAgKz0gc25wcmludGYocCwgUEFHRV9TSVpFLCAiYmluZGVyIHByb2Mgc3RhdGU6XG4iKTsKLQlwID0gcHJpbnRfYmluZGVyX3Byb2MocCwgcGFnZSArIFBBR0VfU0laRSwgcHJvYywgMSk7Ci0JaWYgKGRvX2xvY2spCi0JCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOwotCi0JaWYgKHAgPiBwYWdlICsgUEFHRV9TSVpFKQotCQlwID0gcGFnZSArIFBBR0VfU0laRTsKLQkqc3RhcnQgPSBwYWdlICsgb2ZmOwotCi0JbGVuID0gcCAtIHBhZ2U7Ci0JaWYgKGxlbiA+IG9mZikKLQkJbGVuIC09IG9mZjsKLQllbHNlCi0JCWxlbiA9IDA7Ci0KLQlyZXR1cm4gbGVuIDwgY291bnQgPyBsZW4gIDogY291bnQ7Ci19Ci0KLXN0YXRpYyBjaGFyICpwcmludF9iaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5KGNoYXIgKmJ1ZiwgY2hhciAqZW5kLAotCQkJCQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeSAqZSkKLXsKLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsCi0JCQkiJWQ6ICVzIGZyb20gJWQ6JWQgdG8gJWQ6JWQgbm9kZSAlZCBoYW5kbGUgJWQgIgotCQkJInNpemUgJWQ6JWRcbiIsCi0JCQllLT5kZWJ1Z19pZCwgKGUtPmNhbGxfdHlwZSA9PSAyKSA/ICJyZXBseSIgOgotCQkJKChlLT5jYWxsX3R5cGUgPT0gMSkgPyAiYXN5bmMiIDogImNhbGwgIiksIGUtPmZyb21fcHJvYywKLQkJCWUtPmZyb21fdGhyZWFkLCBlLT50b19wcm9jLCBlLT50b190aHJlYWQsIGUtPnRvX25vZGUsCi0JCQllLT50YXJnZXRfaGFuZGxlLCBlLT5kYXRhX3NpemUsIGUtPm9mZnNldHNfc2l6ZSk7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGludCBiaW5kZXJfcmVhZF9wcm9jX3RyYW5zYWN0aW9uX2xvZygKLQljaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZyAqbG9nID0gZGF0YTsKLQlpbnQgbGVuID0gMDsKLQlpbnQgaTsKLQljaGFyICpidWYgPSBwYWdlOwotCWNoYXIgKmVuZCA9IHBhZ2UgKyBQQUdFX1NJWkU7Ci0KLQlpZiAob2ZmKQotCQlyZXR1cm4gMDsKLQotCWlmIChsb2ctPmZ1bGwpIHsKLQkJZm9yIChpID0gbG9nLT5uZXh0OyBpIDwgQVJSQVlfU0laRShsb2ctPmVudHJ5KTsgaSsrKSB7Ci0JCQlpZiAoYnVmID49IGVuZCkKLQkJCQlicmVhazsKLQkJCWJ1ZiA9IHByaW50X2JpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkoYnVmLCBlbmQsCi0JCQkJCQkJCSZsb2ctPmVudHJ5W2ldKTsKLQkJfQotCX0KLQlmb3IgKGkgPSAwOyBpIDwgbG9nLT5uZXh0OyBpKyspIHsKLQkJaWYgKGJ1ZiA+PSBlbmQpCi0JCQlicmVhazsKLQkJYnVmID0gcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeShidWYsIGVuZCwKLQkJCQkJCQkgJmxvZy0+ZW50cnlbaV0pOwotCX0KLQotCSpzdGFydCA9IHBhZ2UgKyBvZmY7Ci0KLQlsZW4gPSBidWYgLSBwYWdlOwotCWlmIChsZW4gPiBvZmYpCi0JCWxlbiAtPSBvZmY7Ci0JZWxzZQotCQlsZW4gPSAwOwotCi0JcmV0dXJuIGxlbiA8IGNvdW50ID8gbGVuICA6IGNvdW50OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBiaW5kZXJfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkucG9sbCA9IGJpbmRlcl9wb2xsLAotCS51bmxvY2tlZF9pb2N0bCA9IGJpbmRlcl9pb2N0bCwKLQkubW1hcCA9IGJpbmRlcl9tbWFwLAotCS5vcGVuID0gYmluZGVyX29wZW4sCi0JLmZsdXNoID0gYmluZGVyX2ZsdXNoLAotCS5yZWxlYXNlID0gYmluZGVyX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYmluZGVyX21pc2NkZXYgPSB7Ci0JLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lID0gImJpbmRlciIsCi0JLmZvcHMgPSAmYmluZGVyX2ZvcHMKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGJpbmRlcl9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCWJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290ID0gcHJvY19ta2RpcigiYmluZGVyIiwgTlVMTCk7Ci0JaWYgKGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290KQotCQliaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYyA9IHByb2NfbWtkaXIoInByb2MiLAotCQkJCQkJYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QpOwotCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmJpbmRlcl9taXNjZGV2KTsKLQlpZiAoYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QpIHsKLQkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdGUiLAotCQkJCSAgICAgICBTX0lSVUdPLAotCQkJCSAgICAgICBiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdCwKLQkJCQkgICAgICAgYmluZGVyX3JlYWRfcHJvY19zdGF0ZSwKLQkJCQkgICAgICAgTlVMTCk7Ci0JCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInN0YXRzIiwKLQkJCQkgICAgICAgU19JUlVHTywKLQkJCQkgICAgICAgYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QsCi0JCQkJICAgICAgIGJpbmRlcl9yZWFkX3Byb2Nfc3RhdHMsCi0JCQkJICAgICAgIE5VTEwpOwotCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJ0cmFuc2FjdGlvbnMiLAotCQkJCSAgICAgICBTX0lSVUdPLAotCQkJCSAgICAgICBiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdCwKLQkJCQkgICAgICAgYmluZGVyX3JlYWRfcHJvY190cmFuc2FjdGlvbnMsCi0JCQkJICAgICAgIE5VTEwpOwotCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJ0cmFuc2FjdGlvbl9sb2ciLAotCQkJCSAgICAgICBTX0lSVUdPLAotCQkJCSAgICAgICBiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdCwKLQkJCQkgICAgICAgYmluZGVyX3JlYWRfcHJvY190cmFuc2FjdGlvbl9sb2csCi0JCQkJICAgICAgICZiaW5kZXJfdHJhbnNhY3Rpb25fbG9nKTsKLQkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZmFpbGVkX3RyYW5zYWN0aW9uX2xvZyIsCi0JCQkJICAgICAgIFNfSVJVR08sCi0JCQkJICAgICAgIGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290LAotCQkJCSAgICAgICBiaW5kZXJfcmVhZF9wcm9jX3RyYW5zYWN0aW9uX2xvZywKLQkJCQkgICAgICAgJmJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZmFpbGVkKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotZGV2aWNlX2luaXRjYWxsKGJpbmRlcl9pbml0KTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYmluZGVyLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzYWUxYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICoKLSAqIEJhc2VkIG9uLCBidXQgbm8gbG9uZ2VyIGNvbXBhdGlibGUgd2l0aCwgdGhlIG9yaWdpbmFsCi0gKiBPcGVuQmluZGVyLm9yZyBiaW5kZXIgZHJpdmVyIGludGVyZmFjZSwgd2hpY2ggaXM6Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFBhbG1zb3VyY2UsIEluYy4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9CSU5ERVJfSAotI2RlZmluZSBfTElOVVhfQklOREVSX0gKLQotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0KLSNkZWZpbmUgQl9QQUNLX0NIQVJTKGMxLCBjMiwgYzMsIGM0KSBcCi0JKCgoKGMxKTw8MjQpKSB8ICgoKGMyKTw8MTYpKSB8ICgoKGMzKTw8OCkpIHwgKGM0KSkKLSNkZWZpbmUgQl9UWVBFX0xBUkdFIDB4ODUKLQotZW51bSB7Ci0JQklOREVSX1RZUEVfQklOREVSCT0gQl9QQUNLX0NIQVJTKCdzJywgJ2InLCAnKicsIEJfVFlQRV9MQVJHRSksCi0JQklOREVSX1RZUEVfV0VBS19CSU5ERVIJPSBCX1BBQ0tfQ0hBUlMoJ3cnLCAnYicsICcqJywgQl9UWVBFX0xBUkdFKSwKLQlCSU5ERVJfVFlQRV9IQU5ETEUJPSBCX1BBQ0tfQ0hBUlMoJ3MnLCAnaCcsICcqJywgQl9UWVBFX0xBUkdFKSwKLQlCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRQk9IEJfUEFDS19DSEFSUygndycsICdoJywgJyonLCBCX1RZUEVfTEFSR0UpLAotCUJJTkRFUl9UWVBFX0ZECQk9IEJfUEFDS19DSEFSUygnZicsICdkJywgJyonLCBCX1RZUEVfTEFSR0UpLAotfTsKLQotZW51bSB7Ci0JRkxBVF9CSU5ERVJfRkxBR19QUklPUklUWV9NQVNLID0gMHhmZiwKLQlGTEFUX0JJTkRFUl9GTEFHX0FDQ0VQVFNfRkRTID0gMHgxMDAsCi19OwotCi0vKgotICogVGhpcyBpcyB0aGUgZmxhdHRlbmVkIHJlcHJlc2VudGF0aW9uIG9mIGEgQmluZGVyIG9iamVjdCBmb3IgdHJhbnNmZXIKLSAqIGJldHdlZW4gcHJvY2Vzc2VzLiAgVGhlICdvZmZzZXRzJyBzdXBwbGllZCBhcyBwYXJ0IG9mIGEgYmluZGVyIHRyYW5zYWN0aW9uCi0gKiBjb250YWlucyBvZmZzZXRzIGludG8gdGhlIGRhdGEgd2hlcmUgdGhlc2Ugc3RydWN0dXJlcyBvY2N1ci4gIFRoZSBCaW5kZXIKLSAqIGRyaXZlciB0YWtlcyBjYXJlIG9mIHJlLXdyaXRpbmcgdGhlIHN0cnVjdHVyZSB0eXBlIGFuZCBkYXRhIGFzIGl0IG1vdmVzCi0gKiBiZXR3ZWVuIHByb2Nlc3Nlcy4KLSAqLwotc3RydWN0IGZsYXRfYmluZGVyX29iamVjdCB7Ci0JLyogOCBieXRlcyBmb3IgbGFyZ2VfZmxhdF9oZWFkZXIuICovCi0JdW5zaWduZWQgbG9uZwkJdHlwZTsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQotCS8qIDggYnl0ZXMgb2YgZGF0YS4gKi8KLQl1bmlvbiB7Ci0JCXZvaWQJCSpiaW5kZXI7CS8qIGxvY2FsIG9iamVjdCAqLwotCQlzaWduZWQgbG9uZwloYW5kbGU7CQkvKiByZW1vdGUgb2JqZWN0ICovCi0JfTsKLQotCS8qIGV4dHJhIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGxvY2FsIG9iamVjdCAqLwotCXZvaWQJCQkqY29va2llOwotfTsKLQotLyoKLSAqIE9uIDY0LWJpdCBwbGF0Zm9ybXMgd2hlcmUgdXNlciBjb2RlIG1heSBydW4gaW4gMzItYml0cyB0aGUgZHJpdmVyIG11c3QKLSAqIHRyYW5zbGF0ZSB0aGUgYnVmZmVyIChhbmQgbG9jYWwgYmluZGVyKSBhZGRyZXNzZXMgYXByb3ByaWF0ZWx5LgotICovCi0KLXN0cnVjdCBiaW5kZXJfd3JpdGVfcmVhZCB7Ci0Jc2lnbmVkIGxvbmcJd3JpdGVfc2l6ZTsJLyogYnl0ZXMgdG8gd3JpdGUgKi8KLQlzaWduZWQgbG9uZwl3cml0ZV9jb25zdW1lZDsJLyogYnl0ZXMgY29uc3VtZWQgYnkgZHJpdmVyICovCi0JdW5zaWduZWQgbG9uZwl3cml0ZV9idWZmZXI7Ci0Jc2lnbmVkIGxvbmcJcmVhZF9zaXplOwkvKiBieXRlcyB0byByZWFkICovCi0Jc2lnbmVkIGxvbmcJcmVhZF9jb25zdW1lZDsJLyogYnl0ZXMgY29uc3VtZWQgYnkgZHJpdmVyICovCi0JdW5zaWduZWQgbG9uZwlyZWFkX2J1ZmZlcjsKLX07Ci0KLS8qIFVzZSB3aXRoIEJJTkRFUl9WRVJTSU9OLCBkcml2ZXIgZmlsbHMgaW4gZmllbGRzLiAqLwotc3RydWN0IGJpbmRlcl92ZXJzaW9uIHsKLQkvKiBkcml2ZXIgcHJvdG9jb2wgdmVyc2lvbiAtLSBpbmNyZW1lbnQgd2l0aCBpbmNvbXBhdGlibGUgY2hhbmdlICovCi0Jc2lnbmVkIGxvbmcJcHJvdG9jb2xfdmVyc2lvbjsKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIGN1cnJlbnQgcHJvdG9jb2wgdmVyc2lvbi4gKi8KLSNkZWZpbmUgQklOREVSX0NVUlJFTlRfUFJPVE9DT0xfVkVSU0lPTiA3Ci0KLSNkZWZpbmUgQklOREVSX1dSSVRFX1JFQUQgICAJCV9JT1dSKCdiJywgMSwgc3RydWN0IGJpbmRlcl93cml0ZV9yZWFkKQotI2RlZmluZQlCSU5ERVJfU0VUX0lETEVfVElNRU9VVAkJX0lPVygnYicsIDMsIGludDY0X3QpCi0jZGVmaW5lCUJJTkRFUl9TRVRfTUFYX1RIUkVBRFMJCV9JT1coJ2InLCA1LCBzaXplX3QpCi0jZGVmaW5lCUJJTkRFUl9TRVRfSURMRV9QUklPUklUWQlfSU9XKCdiJywgNiwgaW50KQotI2RlZmluZQlCSU5ERVJfU0VUX0NPTlRFWFRfTUdSCQlfSU9XKCdiJywgNywgaW50KQotI2RlZmluZQlCSU5ERVJfVEhSRUFEX0VYSVQJCV9JT1coJ2InLCA4LCBpbnQpCi0jZGVmaW5lIEJJTkRFUl9WRVJTSU9OCQkJX0lPV1IoJ2InLCA5LCBzdHJ1Y3QgYmluZGVyX3ZlcnNpb24pCi0KLS8qCi0gKiBOT1RFOiBUd28gc3BlY2lhbCBlcnJvciBjb2RlcyB5b3Ugc2hvdWxkIGNoZWNrIGZvciB3aGVuIGNhbGxpbmcKLSAqIGluIHRvIHRoZSBkcml2ZXIgYXJlOgotICoKLSAqIEVJTlRSIC0tIFRoZSBvcGVyYXRpb24gaGFzIGJlZW4gaW50ZXJ1cHRlZC4gIFRoaXMgc2hvdWxkIGJlCi0gKiBoYW5kbGVkIGJ5IHJldHJ5aW5nIHRoZSBpb2N0bCgpIHVudGlsIGEgZGlmZmVyZW50IGVycm9yIGNvZGUKLSAqIGlzIHJldHVybmVkLgotICoKLSAqIEVDT05OUkVGVVNFRCAtLSBUaGUgZHJpdmVyIGlzIG5vIGxvbmdlciBhY2NlcHRpbmcgb3BlcmF0aW9ucwotICogZnJvbSB5b3VyIHByb2Nlc3MuICBUaGF0IGlzLCB0aGUgcHJvY2VzcyBpcyBiZWluZyBkZXN0cm95ZWQuCi0gKiBZb3Ugc2hvdWxkIGhhbmRsZSB0aGlzIGJ5IGV4aXRpbmcgZnJvbSB5b3VyIHByb2Nlc3MuICBOb3RlCi0gKiB0aGF0IG9uY2UgdGhpcyBlcnJvciBjb2RlIGlzIHJldHVybmVkLCBhbGwgZnVydGhlciBjYWxscyB0bwotICogdGhlIGRyaXZlciBmcm9tIGFueSB0aHJlYWQgd2lsbCByZXR1cm4gdGhpcyBzYW1lIGNvZGUuCi0gKi8KLQotZW51bSB0cmFuc2FjdGlvbl9mbGFncyB7Ci0JVEZfT05FX1dBWQk9IDB4MDEsCS8qIHRoaXMgaXMgYSBvbmUtd2F5IGNhbGw6IGFzeW5jLCBubyByZXR1cm4gKi8KLQlURl9ST09UX09CSkVDVAk9IDB4MDQsCS8qIGNvbnRlbnRzIGFyZSB0aGUgY29tcG9uZW50J3Mgcm9vdCBvYmplY3QgKi8KLQlURl9TVEFUVVNfQ09ERQk9IDB4MDgsCS8qIGNvbnRlbnRzIGFyZSBhIDMyLWJpdCBzdGF0dXMgY29kZSAqLwotCVRGX0FDQ0VQVF9GRFMJPSAweDEwLAkvKiBhbGxvdyByZXBsaWVzIHdpdGggZmlsZSBkZXNjcmlwdG9ycyAqLwotfTsKLQotc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhIHsKLQkvKiBUaGUgZmlyc3QgdHdvIGFyZSBvbmx5IHVzZWQgZm9yIGJjVFJBTlNBQ1RJT04gYW5kIGJyVFJBTlNBQ1RJT04sCi0JICogaWRlbnRpZnlpbmcgdGhlIHRhcmdldCBhbmQgY29udGVudHMgb2YgdGhlIHRyYW5zYWN0aW9uLgotCSAqLwotCXVuaW9uIHsKLQkJc2l6ZV90CWhhbmRsZTsJLyogdGFyZ2V0IGRlc2NyaXB0b3Igb2YgY29tbWFuZCB0cmFuc2FjdGlvbiAqLwotCQl2b2lkCSpwdHI7CS8qIHRhcmdldCBkZXNjcmlwdG9yIG9mIHJldHVybiB0cmFuc2FjdGlvbiAqLwotCX0gdGFyZ2V0OwotCXZvaWQJCSpjb29raWU7CS8qIHRhcmdldCBvYmplY3QgY29va2llICovCi0JdW5zaWduZWQgaW50CWNvZGU7CQkvKiB0cmFuc2FjdGlvbiBjb21tYW5kICovCi0KLQkvKiBHZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2FjdGlvbi4gKi8KLQl1bnNpZ25lZCBpbnQJZmxhZ3M7Ci0JcGlkX3QJCXNlbmRlcl9waWQ7Ci0JdWlkX3QJCXNlbmRlcl9ldWlkOwotCXNpemVfdAkJZGF0YV9zaXplOwkvKiBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSAqLwotCXNpemVfdAkJb2Zmc2V0c19zaXplOwkvKiBudW1iZXIgb2YgYnl0ZXMgb2Ygb2Zmc2V0cyAqLwotCi0JLyogSWYgdGhpcyB0cmFuc2FjdGlvbiBpcyBpbmxpbmUsIHRoZSBkYXRhIGltbWVkaWF0ZWx5Ci0JICogZm9sbG93cyBoZXJlOyBvdGhlcndpc2UsIGl0IGVuZHMgd2l0aCBhIHBvaW50ZXIgdG8KLQkgKiB0aGUgZGF0YSBidWZmZXIuCi0JICovCi0JdW5pb24gewotCQlzdHJ1Y3QgewotCQkJLyogdHJhbnNhY3Rpb24gZGF0YSAqLwotCQkJY29uc3Qgdm9pZAkqYnVmZmVyOwotCQkJLyogb2Zmc2V0cyBmcm9tIGJ1ZmZlciB0byBmbGF0X2JpbmRlcl9vYmplY3Qgc3RydWN0cyAqLwotCQkJY29uc3Qgdm9pZAkqb2Zmc2V0czsKLQkJfSBwdHI7Ci0JCXVpbnQ4X3QJYnVmWzhdOwotCX0gZGF0YTsKLX07Ci0KLXN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSB7Ci0Jdm9pZCAqcHRyOwotCXZvaWQgKmNvb2tpZTsKLX07Ci0KLXN0cnVjdCBiaW5kZXJfcHJpX2Rlc2MgewotCWludCBwcmlvcml0eTsKLQlpbnQgZGVzYzsKLX07Ci0KLXN0cnVjdCBiaW5kZXJfcHJpX3B0cl9jb29raWUgewotCWludCBwcmlvcml0eTsKLQl2b2lkICpwdHI7Ci0Jdm9pZCAqY29va2llOwotfTsKLQotZW51bSBCaW5kZXJEcml2ZXJSZXR1cm5Qcm90b2NvbCB7Ci0JQlJfRVJST1IgPSBfSU9SKCdyJywgMCwgaW50KSwKLQkvKgotCSAqIGludDogZXJyb3IgY29kZQotCSAqLwotCi0JQlJfT0sgPSBfSU8oJ3InLCAxKSwKLQkvKiBObyBwYXJhbWV0ZXJzISAqLwotCi0JQlJfVFJBTlNBQ1RJT04gPSBfSU9SKCdyJywgMiwgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhKSwKLQlCUl9SRVBMWSA9IF9JT1IoJ3InLCAzLCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEpLAotCS8qCi0JICogYmluZGVyX3RyYW5zYWN0aW9uX2RhdGE6IHRoZSByZWNlaXZlZCBjb21tYW5kLgotCSAqLwotCi0JQlJfQUNRVUlSRV9SRVNVTFQgPSBfSU9SKCdyJywgNCwgaW50KSwKLQkvKgotCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCi0JICogaW50OiAwIGlmIHRoZSBsYXN0IGJjQVRURU1QVF9BQ1FVSVJFIHdhcyBub3Qgc3VjY2Vzc2Z1bC4KLQkgKiBFbHNlIHRoZSByZW1vdGUgb2JqZWN0IGhhcyBhY3F1aXJlZCBhIHByaW1hcnkgcmVmZXJlbmNlLgotCSAqLwotCi0JQlJfREVBRF9SRVBMWSA9IF9JTygncicsIDUpLAotCS8qCi0JICogVGhlIHRhcmdldCBvZiB0aGUgbGFzdCB0cmFuc2FjdGlvbiAoZWl0aGVyIGEgYmNUUkFOU0FDVElPTiBvcgotCSAqIGEgYmNBVFRFTVBUX0FDUVVJUkUpIGlzIG5vIGxvbmdlciB3aXRoIHVzLiAgTm8gcGFyYW1ldGVycy4KLQkgKi8KLQotCUJSX1RSQU5TQUNUSU9OX0NPTVBMRVRFID0gX0lPKCdyJywgNiksCi0JLyoKLQkgKiBObyBwYXJhbWV0ZXJzLi4uIGFsd2F5cyByZWZlcnMgdG8gdGhlIGxhc3QgdHJhbnNhY3Rpb24gcmVxdWVzdGVkCi0JICogKGluY2x1ZGluZyByZXBsaWVzKS4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgYmUgc2VudCBldmVuIGZvcgotCSAqIGFzeW5jaHJvbm91cyB0cmFuc2FjdGlvbnMuCi0JICovCi0KLQlCUl9JTkNSRUZTID0gX0lPUigncicsIDcsIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCi0JQlJfQUNRVUlSRSA9IF9JT1IoJ3InLCA4LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAotCUJSX1JFTEVBU0UgPSBfSU9SKCdyJywgOSwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQlCUl9ERUNSRUZTID0gX0lPUigncicsIDEwLCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAotCS8qCi0JICogdm9pZCAqOglwdHIgdG8gYmluZGVyCi0JICogdm9pZCAqOiBjb29raWUgZm9yIGJpbmRlcgotCSAqLwotCi0JQlJfQVRURU1QVF9BQ1FVSVJFID0gX0lPUigncicsIDExLCBzdHJ1Y3QgYmluZGVyX3ByaV9wdHJfY29va2llKSwKLQkvKgotCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCi0JICogaW50Oglwcmlvcml0eQotCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgotCSAqIHZvaWQgKjogY29va2llIGZvciBiaW5kZXIKLQkgKi8KLQotCUJSX05PT1AgPSBfSU8oJ3InLCAxMiksCi0JLyoKLQkgKiBObyBwYXJhbWV0ZXJzLiAgRG8gbm90aGluZyBhbmQgZXhhbWluZSB0aGUgbmV4dCBjb21tYW5kLiAgSXQgZXhpc3RzCi0JICogcHJpbWFyaWx5IHNvIHRoYXQgd2UgY2FuIHJlcGxhY2UgaXQgd2l0aCBhIEJSX1NQQVdOX0xPT1BFUiBjb21tYW5kLgotCSAqLwotCi0JQlJfU1BBV05fTE9PUEVSID0gX0lPKCdyJywgMTMpLAotCS8qCi0JICogTm8gcGFyYW1ldGVycy4gIFRoZSBkcml2ZXIgaGFzIGRldGVybWluZWQgdGhhdCBhIHByb2Nlc3MgaGFzIG5vCi0JICogdGhyZWFkcyB3YWl0aW5nIHRvIHNlcnZpY2UgaW5jb21taW5nIHRyYW5zYWN0aW9ucy4gIFdoZW4gYSBwcm9jZXNzCi0JICogcmVjZWl2ZXMgdGhpcyBjb21tYW5kLCBpdCBtdXN0IHNwYXduIGEgbmV3IHNlcnZpY2UgdGhyZWFkIGFuZAotCSAqIHJlZ2lzdGVyIGl0IHZpYSBiY0VOVEVSX0xPT1BFUi4KLQkgKi8KLQotCUJSX0ZJTklTSEVEID0gX0lPKCdyJywgMTQpLAotCS8qCi0JICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKLQkgKiBzdG9wIHRocmVhZHBvb2wgdGhyZWFkCi0JICovCi0KLQlCUl9ERUFEX0JJTkRFUiA9IF9JT1IoJ3InLCAxNSwgdm9pZCAqKSwKLQkvKgotCSAqIHZvaWQgKjogY29va2llCi0JICovCi0JQlJfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OX0RPTkUgPSBfSU9SKCdyJywgMTYsIHZvaWQgKiksCi0JLyoKLQkgKiB2b2lkICo6IGNvb2tpZQotCSAqLwotCi0JQlJfRkFJTEVEX1JFUExZID0gX0lPKCdyJywgMTcpLAotCS8qCi0JICogVGhlIHRoZSBsYXN0IHRyYW5zYWN0aW9uIChlaXRoZXIgYSBiY1RSQU5TQUNUSU9OIG9yCi0JICogYSBiY0FUVEVNUFRfQUNRVUlSRSkgZmFpbGVkIChlLmcuIG91dCBvZiBtZW1vcnkpLiAgTm8gcGFyYW1ldGVycy4KLQkgKi8KLX07Ci0KLWVudW0gQmluZGVyRHJpdmVyQ29tbWFuZFByb3RvY29sIHsKLQlCQ19UUkFOU0FDVElPTiA9IF9JT1coJ2MnLCAwLCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEpLAotCUJDX1JFUExZID0gX0lPVygnYycsIDEsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSksCi0JLyoKLQkgKiBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YTogdGhlIHNlbnQgY29tbWFuZC4KLQkgKi8KLQotCUJDX0FDUVVJUkVfUkVTVUxUID0gX0lPVygnYycsIDIsIGludCksCi0JLyoKLQkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAotCSAqIGludDogIDAgaWYgdGhlIGxhc3QgQlJfQVRURU1QVF9BQ1FVSVJFIHdhcyBub3Qgc3VjY2Vzc2Z1bC4KLQkgKiBFbHNlIHlvdSBoYXZlIGFjcXVpcmVkIGEgcHJpbWFyeSByZWZlcmVuY2Ugb24gdGhlIG9iamVjdC4KLQkgKi8KLQotCUJDX0ZSRUVfQlVGRkVSID0gX0lPVygnYycsIDMsIGludCksCi0JLyoKLQkgKiB2b2lkICo6IHB0ciB0byB0cmFuc2FjdGlvbiBkYXRhIHJlY2VpdmVkIG9uIGEgcmVhZAotCSAqLwotCi0JQkNfSU5DUkVGUyA9IF9JT1coJ2MnLCA0LCBpbnQpLAotCUJDX0FDUVVJUkUgPSBfSU9XKCdjJywgNSwgaW50KSwKLQlCQ19SRUxFQVNFID0gX0lPVygnYycsIDYsIGludCksCi0JQkNfREVDUkVGUyA9IF9JT1coJ2MnLCA3LCBpbnQpLAotCS8qCi0JICogaW50OglkZXNjcmlwdG9yCi0JICovCi0KLQlCQ19JTkNSRUZTX0RPTkUgPSBfSU9XKCdjJywgOCwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQlCQ19BQ1FVSVJFX0RPTkUgPSBfSU9XKCdjJywgOSwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQkvKgotCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgotCSAqIHZvaWQgKjogY29va2llIGZvciBiaW5kZXIKLQkgKi8KLQotCUJDX0FUVEVNUFRfQUNRVUlSRSA9IF9JT1coJ2MnLCAxMCwgc3RydWN0IGJpbmRlcl9wcmlfZGVzYyksCi0JLyoKLQkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAotCSAqIGludDogcHJpb3JpdHkKLQkgKiBpbnQ6IGRlc2NyaXB0b3IKLQkgKi8KLQotCUJDX1JFR0lTVEVSX0xPT1BFUiA9IF9JTygnYycsIDExKSwKLQkvKgotCSAqIE5vIHBhcmFtZXRlcnMuCi0JICogUmVnaXN0ZXIgYSBzcGF3bmVkIGxvb3BlciB0aHJlYWQgd2l0aCB0aGUgZGV2aWNlLgotCSAqLwotCi0JQkNfRU5URVJfTE9PUEVSID0gX0lPKCdjJywgMTIpLAotCUJDX0VYSVRfTE9PUEVSID0gX0lPKCdjJywgMTMpLAotCS8qCi0JICogTm8gcGFyYW1ldGVycy4KLQkgKiBUaGVzZSB0d28gY29tbWFuZHMgYXJlIHNlbnQgYXMgYW4gYXBwbGljYXRpb24tbGV2ZWwgdGhyZWFkCi0JICogZW50ZXJzIGFuZCBleGl0cyB0aGUgYmluZGVyIGxvb3AsIHJlc3BlY3RpdmVseS4gIFRoZXkgYXJlCi0JICogdXNlZCBzbyB0aGUgYmluZGVyIGNhbiBoYXZlIGFuIGFjY3VyYXRlIGNvdW50IG9mIHRoZSBudW1iZXIKLQkgKiBvZiBsb29waW5nIHRocmVhZHMgaXQgaGFzIGF2YWlsYWJsZS4KLQkgKi8KLQotCUJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OID0gX0lPVygnYycsIDE0LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAotCS8qCi0JICogdm9pZCAqOiBwdHIgdG8gYmluZGVyCi0JICogdm9pZCAqOiBjb29raWUKLQkgKi8KLQotCUJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTiA9IF9JT1coJ2MnLCAxNSwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQkvKgotCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgotCSAqIHZvaWQgKjogY29va2llCi0JICovCi0KLQlCQ19ERUFEX0JJTkRFUl9ET05FID0gX0lPVygnYycsIDE2LCB2b2lkICopLAotCS8qCi0JICogdm9pZCAqOiBjb29raWUKLQkgKi8KLX07Ci0KLSNlbmRpZiAvKiBfTElOVVhfQklOREVSX0ggKi8KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb2dnZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMxMGI0NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb2dnZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDYwNyArMCwwIEBACi0vKgotICogZHJpdmVycy9taXNjL2xvZ2dlci5jCi0gKgotICogQSBMb2dnaW5nIFN1YnN5c3RlbQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEdvb2dsZSwgSW5jLgotICoKLSAqIFJvYmVydCBMb3ZlIDxybG92ZUBnb29nbGUuY29tPgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgImxvZ2dlci5oIgotCi0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotCi0vKgotICogc3RydWN0IGxvZ2dlcl9sb2cgLSByZXByZXNlbnRzIGEgc3BlY2lmaWMgbG9nLCBzdWNoIGFzICdtYWluJyBvciAncmFkaW8nCi0gKgotICogVGhpcyBzdHJ1Y3R1cmUgbGl2ZXMgZnJvbSBtb2R1bGUgaW5zZXJ0aW9uIHVudGlsIG1vZHVsZSByZW1vdmFsLCBzbyBpdCBkb2VzCi0gKiBub3QgbmVlZCBhZGRpdGlvbmFsIHJlZmVyZW5jZSBjb3VudGluZy4gVGhlIHN0cnVjdHVyZSBpcyBwcm90ZWN0ZWQgYnkgdGhlCi0gKiBtdXRleCAnbXV0ZXgnLgotICovCi1zdHJ1Y3QgbG9nZ2VyX2xvZyB7Ci0JdW5zaWduZWQgY2hhciAJCSpidWZmZXI7LyogdGhlIHJpbmcgYnVmZmVyIGl0c2VsZiAqLwotCXN0cnVjdCBtaXNjZGV2aWNlCW1pc2M7CS8qIG1pc2MgZGV2aWNlIHJlcHJlc2VudGluZyB0aGUgbG9nICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QJd3E7CS8qIHdhaXQgcXVldWUgZm9yIHJlYWRlcnMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXJlYWRlcnM7IC8qIHRoaXMgbG9nJ3MgcmVhZGVycyAqLwotCXN0cnVjdCBtdXRleAkJbXV0ZXg7CS8qIG11dGV4IHByb3RlY3RpbmcgYnVmZmVyICovCi0Jc2l6ZV90CQkJd19vZmY7CS8qIGN1cnJlbnQgd3JpdGUgaGVhZCBvZmZzZXQgKi8KLQlzaXplX3QJCQloZWFkOwkvKiBuZXcgcmVhZGVycyBzdGFydCBoZXJlICovCi0Jc2l6ZV90CQkJc2l6ZTsJLyogc2l6ZSBvZiB0aGUgbG9nICovCi19OwotCi0vKgotICogc3RydWN0IGxvZ2dlcl9yZWFkZXIgLSBhIGxvZ2dpbmcgZGV2aWNlIG9wZW4gZm9yIHJlYWRpbmcKLSAqCi0gKiBUaGlzIG9iamVjdCBsaXZlcyBmcm9tIG9wZW4gdG8gcmVsZWFzZSwgc28gd2UgZG9uJ3QgbmVlZCBhZGRpdGlvbmFsCi0gKiByZWZlcmVuY2UgY291bnRpbmcuIFRoZSBzdHJ1Y3R1cmUgaXMgcHJvdGVjdGVkIGJ5IGxvZy0+bXV0ZXguCi0gKi8KLXN0cnVjdCBsb2dnZXJfcmVhZGVyIHsKLQlzdHJ1Y3QgbG9nZ2VyX2xvZwkqbG9nOwkvKiBhc3NvY2lhdGVkIGxvZyAqLwotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsJLyogZW50cnkgaW4gbG9nZ2VyX2xvZydzIGxpc3QgKi8KLQlzaXplX3QJCQlyX29mZjsJLyogY3VycmVudCByZWFkIGhlYWQgb2Zmc2V0ICovCi19OwotCi0vKiBsb2dnZXJfb2Zmc2V0IC0gcmV0dXJucyBpbmRleCAnbicgaW50byB0aGUgbG9nIHZpYSAob3B0aW1pemVkKSBtb2R1bHVzICovCi0jZGVmaW5lIGxvZ2dlcl9vZmZzZXQobikJKChuKSAmIChsb2ctPnNpemUgLSAxKSkKLQotLyoKLSAqIGZpbGVfZ2V0X2xvZyAtIEdpdmVuIGEgZmlsZSBzdHJ1Y3R1cmUsIHJldHVybiB0aGUgYXNzb2NpYXRlZCBsb2cKLSAqCi0gKiBUaGlzIGlzbid0IGFlc3RoZXRpYy4gV2UgaGF2ZSBzZXZlcmFsIGdvYWxzOgotICoKLSAqIAkxKSBOZWVkIHRvIHF1aWNrbHkgb2J0YWluIHRoZSBhc3NvY2lhdGVkIGxvZyBkdXJpbmcgYW4gSS9PIG9wZXJhdGlvbgotICogCTIpIFJlYWRlcnMgbmVlZCB0byBtYWludGFpbiBzdGF0ZSAobG9nZ2VyX3JlYWRlcikKLSAqIAkzKSBXcml0ZXJzIG5lZWQgdG8gYmUgdmVyeSBmYXN0IChvcGVuKCkgc2hvdWxkIGJlIGEgbmVhciBuby1vcCkKLSAqCi0gKiBJbiB0aGUgcmVhZGVyIGNhc2UsIHdlIGNhbiB0cml2aWFsbHkgZ28gZmlsZS0+bG9nZ2VyX3JlYWRlci0+bG9nZ2VyX2xvZy4KLSAqIEZvciBhIHdyaXRlciwgd2UgZG9uJ3Qgd2FudCB0byBtYWludGFpbiBhIGxvZ2dlcl9yZWFkZXIsIHNvIHdlIGp1c3QgZ28KLSAqIGZpbGUtPmxvZ2dlcl9sb2cuIFRodXMgd2hhdCBmaWxlLT5wcml2YXRlX2RhdGEgcG9pbnRzIGF0IGRlcGVuZHMgb24gd2hldGhlcgotICogb3Igbm90IHRoZSBmaWxlIHdhcyBvcGVuZWQgZm9yIHJlYWRpbmcuIFRoaXMgZnVuY3Rpb24gaGlkZXMgdGhhdCBkaXJ0aW5lc3MuCi0gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGxvZ2dlcl9sb2cgKmZpbGVfZ2V0X2xvZyhzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQlzdHJ1Y3QgbG9nZ2VyX3JlYWRlciAqcmVhZGVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCQlyZXR1cm4gcmVhZGVyLT5sb2c7Ci0JfSBlbHNlCi0JCXJldHVybiBmaWxlLT5wcml2YXRlX2RhdGE7Ci19Ci0KLS8qCi0gKiBnZXRfZW50cnlfbGVuIC0gR3JhYnMgdGhlIGxlbmd0aCBvZiB0aGUgcGF5bG9hZCBvZiB0aGUgbmV4dCBlbnRyeSBzdGFydGluZwotICogZnJvbSAnb2ZmJy4KLSAqCi0gKiBDYWxsZXIgbmVlZHMgdG8gaG9sZCBsb2ctPm11dGV4LgotICovCi1zdGF0aWMgX191MzIgZ2V0X2VudHJ5X2xlbihzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nLCBzaXplX3Qgb2ZmKQotewotCV9fdTE2IHZhbDsKLQotCXN3aXRjaCAobG9nLT5zaXplIC0gb2ZmKSB7Ci0JY2FzZSAxOgotCQltZW1jcHkoJnZhbCwgbG9nLT5idWZmZXIgKyBvZmYsIDEpOwotCQltZW1jcHkoKChjaGFyICopICZ2YWwpICsgMSwgbG9nLT5idWZmZXIsIDEpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQltZW1jcHkoJnZhbCwgbG9nLT5idWZmZXIgKyBvZmYsIDIpOwotCX0KLQotCXJldHVybiBzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSkgKyB2YWw7Ci19Ci0KLS8qCi0gKiBkb19yZWFkX2xvZ190b191c2VyIC0gcmVhZHMgZXhhY3RseSAnY291bnQnIGJ5dGVzIGZyb20gJ2xvZycgaW50byB0aGUKLSAqIHVzZXItc3BhY2UgYnVmZmVyICdidWYnLiBSZXR1cm5zICdjb3VudCcgb24gc3VjY2Vzcy4KLSAqCi0gKiBDYWxsZXIgbXVzdCBob2xkIGxvZy0+bXV0ZXguCi0gKi8KLXN0YXRpYyBzc2l6ZV90IGRvX3JlYWRfbG9nX3RvX3VzZXIoc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywKLQkJCQkgICBzdHJ1Y3QgbG9nZ2VyX3JlYWRlciAqcmVhZGVyLAotCQkJCSAgIGNoYXIgX191c2VyICpidWYsCi0JCQkJICAgc2l6ZV90IGNvdW50KQotewotCXNpemVfdCBsZW47Ci0KLQkvKgotCSAqIFdlIHJlYWQgZnJvbSB0aGUgbG9nIGluIHR3byBkaXNqb2ludCBvcGVyYXRpb25zLiBGaXJzdCwgd2UgcmVhZCBmcm9tCi0JICogdGhlIGN1cnJlbnQgcmVhZCBoZWFkIG9mZnNldCB1cCB0byAnY291bnQnIGJ5dGVzIG9yIHRvIHRoZSBlbmQgb2YKLQkgKiB0aGUgbG9nLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuCi0JICovCi0JbGVuID0gbWluKGNvdW50LCBsb2ctPnNpemUgLSByZWFkZXItPnJfb2ZmKTsKLQlpZiAoY29weV90b191c2VyKGJ1ZiwgbG9nLT5idWZmZXIgKyByZWFkZXItPnJfb2ZmLCBsZW4pKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCS8qCi0JICogU2Vjb25kLCB3ZSByZWFkIGFueSByZW1haW5pbmcgYnl0ZXMsIHN0YXJ0aW5nIGJhY2sgYXQgdGhlIGhlYWQgb2YKLQkgKiB0aGUgbG9nLgotCSAqLwotCWlmIChjb3VudCAhPSBsZW4pCi0JCWlmIChjb3B5X3RvX3VzZXIoYnVmICsgbGVuLCBsb2ctPmJ1ZmZlciwgY291bnQgLSBsZW4pKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZWFkZXItPnJfb2ZmID0gbG9nZ2VyX29mZnNldChyZWFkZXItPnJfb2ZmICsgY291bnQpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi0vKgotICogbG9nZ2VyX3JlYWQgLSBvdXIgbG9nJ3MgcmVhZCgpIG1ldGhvZAotICoKLSAqIEJlaGF2aW9yOgotICoKLSAqIAktIE9fTk9OQkxPQ0sgd29ya3MKLSAqIAktIElmIHRoZXJlIGFyZSBubyBsb2cgZW50cmllcyB0byByZWFkLCBibG9ja3MgdW50aWwgbG9nIGlzIHdyaXR0ZW4gdG8KLSAqIAktIEF0b21pY2FsbHkgcmVhZHMgZXhhY3RseSBvbmUgbG9nIGVudHJ5Ci0gKgotICogT3B0aW1hbCByZWFkIHNpemUgaXMgTE9HR0VSX0VOVFJZX01BWF9MRU4uIFdpbGwgc2V0IGVycm5vIHRvIEVJTlZBTCBpZiByZWFkCi0gKiBidWZmZXIgaXMgaW5zdWZmaWNpZW50IHRvIGhvbGQgbmV4dCBlbnRyeS4KLSAqLwotc3RhdGljIHNzaXplX3QgbG9nZ2VyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGxvZ2dlcl9sb2cgKmxvZyA9IHJlYWRlci0+bG9nOwotCXNzaXplX3QgcmV0OwotCURFRklORV9XQUlUKHdhaXQpOwotCi1zdGFydDoKLQl3aGlsZSAoMSkgewotCQlwcmVwYXJlX3RvX3dhaXQoJmxvZy0+d3EsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwotCi0JCW11dGV4X2xvY2soJmxvZy0+bXV0ZXgpOwotCQlyZXQgPSAobG9nLT53X29mZiA9PSByZWFkZXItPnJfb2ZmKTsKLQkJbXV0ZXhfdW5sb2NrKCZsb2ctPm11dGV4KTsKLQkJaWYgKCFyZXQpCi0JCQlicmVhazsKLQotCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJCXJldCA9IC1FQUdBSU47Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJcmV0ID0gLUVJTlRSOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzY2hlZHVsZSgpOwotCX0KLQotCWZpbmlzaF93YWl0KCZsb2ctPndxLCAmd2FpdCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCW11dGV4X2xvY2soJmxvZy0+bXV0ZXgpOwotCi0JLyogaXMgdGhlcmUgc3RpbGwgc29tZXRoaW5nIHRvIHJlYWQgb3IgZGlkIHdlIHJhY2U/ICovCi0JaWYgKHVubGlrZWx5KGxvZy0+d19vZmYgPT0gcmVhZGVyLT5yX29mZikpIHsKLQkJbXV0ZXhfdW5sb2NrKCZsb2ctPm11dGV4KTsKLQkJZ290byBzdGFydDsKLQl9Ci0KLQkvKiBnZXQgdGhlIHNpemUgb2YgdGhlIG5leHQgZW50cnkgKi8KLQlyZXQgPSBnZXRfZW50cnlfbGVuKGxvZywgcmVhZGVyLT5yX29mZik7Ci0JaWYgKGNvdW50IDwgcmV0KSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIGdldCBleGFjdGx5IG9uZSBlbnRyeSBmcm9tIHRoZSBsb2cgKi8KLQlyZXQgPSBkb19yZWFkX2xvZ190b191c2VyKGxvZywgcmVhZGVyLCBidWYsIHJldCk7Ci0KLW91dDoKLQltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIGdldF9uZXh0X2VudHJ5IC0gcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IHZhbGlkIGVudHJ5IGF0IGxlYXN0ICdsZW4nCi0gKiBieXRlcyBhZnRlciAnb2ZmJy4KLSAqCi0gKiBDYWxsZXIgbXVzdCBob2xkIGxvZy0+bXV0ZXguCi0gKi8KLXN0YXRpYyBzaXplX3QgZ2V0X25leHRfZW50cnkoc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywgc2l6ZV90IG9mZiwgc2l6ZV90IGxlbikKLXsKLQlzaXplX3QgY291bnQgPSAwOwotCi0JZG8gewotCQlzaXplX3QgbnIgPSBnZXRfZW50cnlfbGVuKGxvZywgb2ZmKTsKLQkJb2ZmID0gbG9nZ2VyX29mZnNldChvZmYgKyBucik7Ci0JCWNvdW50ICs9IG5yOwotCX0gd2hpbGUgKGNvdW50IDwgbGVuKTsKLQotCXJldHVybiBvZmY7Ci19Ci0KLS8qCi0gKiBjbG9ja19pbnRlcnZhbCAtIGlzIGEgPCBjIDwgYiBpbiBtb2Qtc3BhY2U/IFB1dCBhbm90aGVyIHdheSwgZG9lcyB0aGUgbGluZQotICogZnJvbSBhIHRvIGIgY3Jvc3MgYz8KLSAqLwotc3RhdGljIGlubGluZSBpbnQgY2xvY2tfaW50ZXJ2YWwoc2l6ZV90IGEsIHNpemVfdCBiLCBzaXplX3QgYykKLXsKLQlpZiAoYiA8IGEpIHsKLQkJaWYgKGEgPCBjIHx8IGIgPj0gYykKLQkJCXJldHVybiAxOwotCX0gZWxzZSB7Ci0JCWlmIChhIDwgYyAmJiBiID49IGMpCi0JCQlyZXR1cm4gMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGZpeF91cF9yZWFkZXJzIC0gd2FsayB0aGUgbGlzdCBvZiBhbGwgcmVhZGVycyBhbmQgImZpeCB1cCIgYW55IHdobyB3ZXJlCi0gKiBsYXBwZWQgYnkgdGhlIHdyaXRlcjsgYWxzbyBkbyB0aGUgc2FtZSBmb3IgdGhlIGRlZmF1bHQgInN0YXJ0IGhlYWQiLgotICogV2UgZG8gdGhpcyBieSAicHVsbGluZyBmb3J3YXJkIiB0aGUgcmVhZGVycyBhbmQgc3RhcnQgaGVhZCB0byB0aGUgZmlyc3QKLSAqIGVudHJ5IGFmdGVyIHRoZSBuZXcgd3JpdGUgaGVhZC4KLSAqCi0gKiBUaGUgY2FsbGVyIG5lZWRzIHRvIGhvbGQgbG9nLT5tdXRleC4KLSAqLwotc3RhdGljIHZvaWQgZml4X3VwX3JlYWRlcnMoc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywgc2l6ZV90IGxlbikKLXsKLQlzaXplX3Qgb2xkID0gbG9nLT53X29mZjsKLQlzaXplX3QgbmV3ID0gbG9nZ2VyX29mZnNldChvbGQgKyBsZW4pOwotCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXI7Ci0KLQlpZiAoY2xvY2tfaW50ZXJ2YWwob2xkLCBuZXcsIGxvZy0+aGVhZCkpCi0JCWxvZy0+aGVhZCA9IGdldF9uZXh0X2VudHJ5KGxvZywgbG9nLT5oZWFkLCBsZW4pOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShyZWFkZXIsICZsb2ctPnJlYWRlcnMsIGxpc3QpCi0JCWlmIChjbG9ja19pbnRlcnZhbChvbGQsIG5ldywgcmVhZGVyLT5yX29mZikpCi0JCQlyZWFkZXItPnJfb2ZmID0gZ2V0X25leHRfZW50cnkobG9nLCByZWFkZXItPnJfb2ZmLCBsZW4pOwotfQotCi0vKgotICogZG9fd3JpdGVfbG9nIC0gd3JpdGVzICdsZW4nIGJ5dGVzIGZyb20gJ2J1ZicgdG8gJ2xvZycKLSAqCi0gKiBUaGUgY2FsbGVyIG5lZWRzIHRvIGhvbGQgbG9nLT5tdXRleC4KLSAqLwotc3RhdGljIHZvaWQgZG9fd3JpdGVfbG9nKHN0cnVjdCBsb2dnZXJfbG9nICpsb2csIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXNpemVfdCBsZW47Ci0KLQlsZW4gPSBtaW4oY291bnQsIGxvZy0+c2l6ZSAtIGxvZy0+d19vZmYpOwotCW1lbWNweShsb2ctPmJ1ZmZlciArIGxvZy0+d19vZmYsIGJ1ZiwgbGVuKTsKLQotCWlmIChjb3VudCAhPSBsZW4pCi0JCW1lbWNweShsb2ctPmJ1ZmZlciwgYnVmICsgbGVuLCBjb3VudCAtIGxlbik7Ci0KLQlsb2ctPndfb2ZmID0gbG9nZ2VyX29mZnNldChsb2ctPndfb2ZmICsgY291bnQpOwotCi19Ci0KLS8qCi0gKiBkb193cml0ZV9sb2dfdXNlciAtIHdyaXRlcyAnbGVuJyBieXRlcyBmcm9tIHRoZSB1c2VyLXNwYWNlIGJ1ZmZlciAnYnVmJyB0bwotICogdGhlIGxvZyAnbG9nJwotICoKLSAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gaG9sZCBsb2ctPm11dGV4LgotICoKLSAqIFJldHVybnMgJ2NvdW50JyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBzc2l6ZV90IGRvX3dyaXRlX2xvZ19mcm9tX3VzZXIoc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywKLQkJCQkgICAgICBjb25zdCB2b2lkIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc2l6ZV90IGxlbjsKLQotCWxlbiA9IG1pbihjb3VudCwgbG9nLT5zaXplIC0gbG9nLT53X29mZik7Ci0JaWYgKGxlbiAmJiBjb3B5X2Zyb21fdXNlcihsb2ctPmJ1ZmZlciArIGxvZy0+d19vZmYsIGJ1ZiwgbGVuKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoY291bnQgIT0gbGVuKQotCQlpZiAoY29weV9mcm9tX3VzZXIobG9nLT5idWZmZXIsIGJ1ZiArIGxlbiwgY291bnQgLSBsZW4pKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlsb2ctPndfb2ZmID0gbG9nZ2VyX29mZnNldChsb2ctPndfb2ZmICsgY291bnQpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi0vKgotICogbG9nZ2VyX2Fpb193cml0ZSAtIG91ciB3cml0ZSBtZXRob2QsIGltcGxlbWVudGluZyBzdXBwb3J0IGZvciB3cml0ZSgpLAotICogd3JpdGV2KCksIGFuZCBhaW9fd3JpdGUoKS4gV3JpdGVzIGFyZSBvdXIgZmFzdCBwYXRoLCBhbmQgd2UgdHJ5IHRvIG9wdGltaXplCi0gKiB0aGVtIGFib3ZlIGFsbCBlbHNlLgotICovCi1zc2l6ZV90IGxvZ2dlcl9haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCSB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwcG9zKQotewotCXN0cnVjdCBsb2dnZXJfbG9nICpsb2cgPSBmaWxlX2dldF9sb2coaW9jYi0+a2lfZmlscCk7Ci0Jc2l6ZV90IG9yaWcgPSBsb2ctPndfb2ZmOwotCXN0cnVjdCBsb2dnZXJfZW50cnkgaGVhZGVyOwotCXN0cnVjdCB0aW1lc3BlYyBub3c7Ci0Jc3NpemVfdCByZXQgPSAwOwotCi0Jbm93ID0gY3VycmVudF9rZXJuZWxfdGltZSgpOwotCi0JaGVhZGVyLnBpZCA9IGN1cnJlbnQtPnRnaWQ7Ci0JaGVhZGVyLnRpZCA9IGN1cnJlbnQtPnBpZDsKLQloZWFkZXIuc2VjID0gbm93LnR2X3NlYzsKLQloZWFkZXIubnNlYyA9IG5vdy50dl9uc2VjOwotCWhlYWRlci5sZW4gPSBtaW5fdChzaXplX3QsIGlvY2ItPmtpX2xlZnQsIExPR0dFUl9FTlRSWV9NQVhfUEFZTE9BRCk7Ci0KLQkvKiBudWxsIHdyaXRlcyBzdWNjZWVkLCByZXR1cm4gemVybyAqLwotCWlmICh1bmxpa2VseSghaGVhZGVyLmxlbikpCi0JCXJldHVybiAwOwotCi0JbXV0ZXhfbG9jaygmbG9nLT5tdXRleCk7Ci0KLQkvKgotCSAqIEZpeCB1cCBhbnkgcmVhZGVycywgcHVsbGluZyB0aGVtIGZvcndhcmQgdG8gdGhlIGZpcnN0IHJlYWRhYmxlCi0JICogZW50cnkgYWZ0ZXIgKHdoYXQgd2lsbCBiZSkgdGhlIG5ldyB3cml0ZSBvZmZzZXQuIFdlIGRvIHRoaXMgbm93Ci0JICogYmVjYXVzZSBpZiB3ZSBwYXJ0aWFsbHkgZmFpbCwgd2UgY2FuIGVuZCB1cCB3aXRoIGNsb2JiZXJlZCBsb2cKLQkgKiBlbnRyaWVzIHRoYXQgZW5jcm9hY2ggb24gcmVhZGFibGUgYnVmZmVyLgotCSAqLwotCWZpeF91cF9yZWFkZXJzKGxvZywgc2l6ZW9mKHN0cnVjdCBsb2dnZXJfZW50cnkpICsgaGVhZGVyLmxlbik7Ci0KLQlkb193cml0ZV9sb2cobG9nLCAmaGVhZGVyLCBzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSkpOwotCi0Jd2hpbGUgKG5yX3NlZ3MtLSA+IDApIHsKLQkJc2l6ZV90IGxlbjsKLQkJc3NpemVfdCBucjsKLQotCQkvKiBmaWd1cmUgb3V0IGhvdyBtdWNoIG9mIHRoaXMgdmVjdG9yIHdlIGNhbiBrZWVwICovCi0JCWxlbiA9IG1pbl90KHNpemVfdCwgaW92LT5pb3ZfbGVuLCBoZWFkZXIubGVuIC0gcmV0KTsKLQotCQkvKiB3cml0ZSBvdXQgdGhpcyBzZWdtZW50J3MgcGF5bG9hZCAqLwotCQluciA9IGRvX3dyaXRlX2xvZ19mcm9tX3VzZXIobG9nLCBpb3YtPmlvdl9iYXNlLCBsZW4pOwotCQlpZiAodW5saWtlbHkobnIgPCAwKSkgewotCQkJbG9nLT53X29mZiA9IG9yaWc7Ci0JCQltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOwotCQkJcmV0dXJuIG5yOwotCQl9Ci0KLQkJaW92Kys7Ci0JCXJldCArPSBucjsKLQl9Ci0KLQltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOwotCi0JLyogd2FrZSB1cCBhbnkgYmxvY2tlZCByZWFkZXJzICovCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZsb2ctPndxKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbG9nZ2VyX2xvZyAqZ2V0X2xvZ19mcm9tX21pbm9yKGludCk7Ci0KLS8qCi0gKiBsb2dnZXJfb3BlbiAtIHRoZSBsb2cncyBvcGVuKCkgZmlsZSBvcGVyYXRpb24KLSAqCi0gKiBOb3RlIGhvdyBuZWFyIGEgbm8tb3AgdGhpcyBpcyBpbiB0aGUgd3JpdGUtb25seSBjYXNlLiBLZWVwIGl0IHRoYXQgd2F5IQotICovCi1zdGF0aWMgaW50IGxvZ2dlcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBsb2dnZXJfbG9nICpsb2c7Ci0JaW50IHJldDsKLQotCXJldCA9IG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlsb2cgPSBnZXRfbG9nX2Zyb21fbWlub3IoTUlOT1IoaW5vZGUtPmlfcmRldikpOwotCWlmICghbG9nKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXI7Ci0KLQkJcmVhZGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxvZ2dlcl9yZWFkZXIpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFyZWFkZXIpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlyZWFkZXItPmxvZyA9IGxvZzsKLQkJSU5JVF9MSVNUX0hFQUQoJnJlYWRlci0+bGlzdCk7Ci0KLQkJbXV0ZXhfbG9jaygmbG9nLT5tdXRleCk7Ci0JCXJlYWRlci0+cl9vZmYgPSBsb2ctPmhlYWQ7Ci0JCWxpc3RfYWRkX3RhaWwoJnJlYWRlci0+bGlzdCwgJmxvZy0+cmVhZGVycyk7Ci0JCW11dGV4X3VubG9jaygmbG9nLT5tdXRleCk7Ci0KLQkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcmVhZGVyOwotCX0gZWxzZQotCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBsb2c7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGxvZ2dlcl9yZWxlYXNlIC0gdGhlIGxvZydzIHJlbGVhc2UgZmlsZSBvcGVyYXRpb24KLSAqCi0gKiBOb3RlIHRoaXMgaXMgYSB0b3RhbCBuby1vcCBpbiB0aGUgd3JpdGUtb25seSBjYXNlLiBLZWVwIGl0IHRoYXQgd2F5IQotICovCi1zdGF0aWMgaW50IGxvZ2dlcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaWdub3JlZCwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQkJbGlzdF9kZWwoJnJlYWRlci0+bGlzdCk7Ci0JCWtmcmVlKHJlYWRlcik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBsb2dnZXJfcG9sbCAtIHRoZSBsb2cncyBwb2xsIGZpbGUgb3BlcmF0aW9uLCBmb3IgcG9sbC9zZWxlY3QvZXBvbGwKLSAqCi0gKiBOb3RlIHdlIGFsd2F5cyByZXR1cm4gUE9MTE9VVCwgYmVjYXVzZSB5b3UgY2FuIGFsd2F5cyB3cml0ZSgpIHRvIHRoZSBsb2cuCi0gKiBOb3RlIGFsc28gdGhhdCwgc3RyaWN0bHkgc3BlYWtpbmcsIGEgcmV0dXJuIHZhbHVlIG9mIFBPTExJTiBkb2VzIG5vdAotICogZ3VhcmFudGVlIHRoYXQgdGhlIGxvZyBpcyByZWFkYWJsZSB3aXRob3V0IGJsb2NraW5nLCBhcyB0aGVyZSBpcyBhIHNtYWxsCi0gKiBjaGFuY2UgdGhhdCB0aGUgd3JpdGVyIGNhbiBsYXAgdGhlIHJlYWRlciBpbiB0aGUgaW50ZXJpbSBiZXR3ZWVuIHBvbGwoKQotICogcmV0dXJuaW5nIGFuZCB0aGUgcmVhZCgpIHJlcXVlc3QuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbG9nZ2VyX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCi17Ci0Jc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlcjsKLQlzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nOwotCXVuc2lnbmVkIGludCByZXQgPSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKLQotCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQotCQlyZXR1cm4gcmV0OwotCi0JcmVhZGVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWxvZyA9IHJlYWRlci0+bG9nOwotCi0JcG9sbF93YWl0KGZpbGUsICZsb2ctPndxLCB3YWl0KTsKLQotCW11dGV4X2xvY2soJmxvZy0+bXV0ZXgpOwotCWlmIChsb2ctPndfb2ZmICE9IHJlYWRlci0+cl9vZmYpCi0JCXJldCB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwotCW11dGV4X3VubG9jaygmbG9nLT5tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgbG9uZyBsb2dnZXJfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBsb2dnZXJfbG9nICpsb2cgPSBmaWxlX2dldF9sb2coZmlsZSk7Ci0Jc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlcjsKLQlsb25nIHJldCA9IC1FTk9UVFk7Ci0KLQltdXRleF9sb2NrKCZsb2ctPm11dGV4KTsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBMT0dHRVJfR0VUX0xPR19CVUZfU0laRToKLQkJcmV0ID0gbG9nLT5zaXplOwotCQlicmVhazsKLQljYXNlIExPR0dFUl9HRVRfTE9HX0xFTjoKLQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJCXJldCA9IC1FQkFERjsKLQkJCWJyZWFrOwotCQl9Ci0JCXJlYWRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQkJaWYgKGxvZy0+d19vZmYgPj0gcmVhZGVyLT5yX29mZikKLQkJCXJldCA9IGxvZy0+d19vZmYgLSByZWFkZXItPnJfb2ZmOwotCQllbHNlCi0JCQlyZXQgPSAobG9nLT5zaXplIC0gcmVhZGVyLT5yX29mZikgKyBsb2ctPndfb2ZmOwotCQlicmVhazsKLQljYXNlIExPR0dFUl9HRVRfTkVYVF9FTlRSWV9MRU46Ci0JCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCQlyZXQgPSAtRUJBREY7Ci0JCQlicmVhazsKLQkJfQotCQlyZWFkZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JCWlmIChsb2ctPndfb2ZmICE9IHJlYWRlci0+cl9vZmYpCi0JCQlyZXQgPSBnZXRfZW50cnlfbGVuKGxvZywgcmVhZGVyLT5yX29mZik7Ci0JCWVsc2UKLQkJCXJldCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgTE9HR0VSX0ZMVVNIX0xPRzoKLQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKSB7Ci0JCQlyZXQgPSAtRUJBREY7Ci0JCQlicmVhazsKLQkJfQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlYWRlciwgJmxvZy0+cmVhZGVycywgbGlzdCkKLQkJCXJlYWRlci0+cl9vZmYgPSBsb2ctPndfb2ZmOwotCQlsb2ctPmhlYWQgPSBsb2ctPndfb2ZmOwotCQlyZXQgPSAwOwotCQlicmVhazsKLQl9Ci0KLQltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbG9nZ2VyX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLnJlYWQgPSBsb2dnZXJfcmVhZCwKLQkuYWlvX3dyaXRlID0gbG9nZ2VyX2Fpb193cml0ZSwKLQkucG9sbCA9IGxvZ2dlcl9wb2xsLAotCS51bmxvY2tlZF9pb2N0bCA9IGxvZ2dlcl9pb2N0bCwKLQkuY29tcGF0X2lvY3RsID0gbG9nZ2VyX2lvY3RsLAotCS5vcGVuID0gbG9nZ2VyX29wZW4sCi0JLnJlbGVhc2UgPSBsb2dnZXJfcmVsZWFzZSwKLX07Ci0KLS8qCi0gKiBEZWZpbmVzIGEgbG9nIHN0cnVjdHVyZSB3aXRoIG5hbWUgJ05BTUUnIGFuZCBhIHNpemUgb2YgJ1NJWkUnIGJ5dGVzLCB3aGljaAotICogbXVzdCBiZSBhIHBvd2VyIG9mIHR3bywgZ3JlYXRlciB0aGFuIExPR0dFUl9FTlRSWV9NQVhfTEVOLCBhbmQgbGVzcyB0aGFuCi0gKiBMT05HX01BWCBtaW51cyBMT0dHRVJfRU5UUllfTUFYX0xFTi4KLSAqLwotI2RlZmluZSBERUZJTkVfTE9HR0VSX0RFVklDRShWQVIsIE5BTUUsIFNJWkUpIFwKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIF9idWZfICMjIFZBUltTSVpFXTsgXAotc3RhdGljIHN0cnVjdCBsb2dnZXJfbG9nIFZBUiA9IHsgXAotCS5idWZmZXIgPSBfYnVmXyAjIyBWQVIsIFwKLQkubWlzYyA9IHsgXAotCQkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsIFwKLQkJLm5hbWUgPSBOQU1FLCBcCi0JCS5mb3BzID0gJmxvZ2dlcl9mb3BzLCBcCi0JCS5wYXJlbnQgPSBOVUxMLCBcCi0JfSwgXAotCS53cSA9IF9fV0FJVF9RVUVVRV9IRUFEX0lOSVRJQUxJWkVSKFZBUiAud3EpLCBcCi0JLnJlYWRlcnMgPSBMSVNUX0hFQURfSU5JVChWQVIgLnJlYWRlcnMpLCBcCi0JLm11dGV4ID0gX19NVVRFWF9JTklUSUFMSVpFUihWQVIgLm11dGV4KSwgXAotCS53X29mZiA9IDAsIFwKLQkuaGVhZCA9IDAsIFwKLQkuc2l6ZSA9IFNJWkUsIFwKLX07Ci0KLURFRklORV9MT0dHRVJfREVWSUNFKGxvZ19tYWluLCBMT0dHRVJfTE9HX01BSU4sIDY0KjEwMjQpCi1ERUZJTkVfTE9HR0VSX0RFVklDRShsb2dfZXZlbnRzLCBMT0dHRVJfTE9HX0VWRU5UUywgMjU2KjEwMjQpCi1ERUZJTkVfTE9HR0VSX0RFVklDRShsb2dfcmFkaW8sIExPR0dFUl9MT0dfUkFESU8sIDY0KjEwMjQpCi0KLXN0YXRpYyBzdHJ1Y3QgbG9nZ2VyX2xvZyAqZ2V0X2xvZ19mcm9tX21pbm9yKGludCBtaW5vcikKLXsKLQlpZiAobG9nX21haW4ubWlzYy5taW5vciA9PSBtaW5vcikKLQkJcmV0dXJuICZsb2dfbWFpbjsKLQlpZiAobG9nX2V2ZW50cy5taXNjLm1pbm9yID09IG1pbm9yKQotCQlyZXR1cm4gJmxvZ19ldmVudHM7Ci0JaWYgKGxvZ19yYWRpby5taXNjLm1pbm9yID09IG1pbm9yKQotCQlyZXR1cm4gJmxvZ19yYWRpbzsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaW5pdF9sb2coc3RydWN0IGxvZ2dlcl9sb2cgKmxvZykKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gbWlzY19yZWdpc3RlcigmbG9nLT5taXNjKTsKLQlpZiAodW5saWtlbHkocmV0KSkgewotCQlwcmludGsoS0VSTl9FUlIgImxvZ2dlcjogZmFpbGVkIHRvIHJlZ2lzdGVyIG1pc2MgIgotCQkgICAgICAgImRldmljZSBmb3IgbG9nICclcychXG4iLCBsb2ctPm1pc2MubmFtZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAibG9nZ2VyOiBjcmVhdGVkICVsdUsgbG9nICclcydcbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBsb2ctPnNpemUgPj4gMTAsIGxvZy0+bWlzYy5uYW1lKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBsb2dnZXJfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBpbml0X2xvZygmbG9nX21haW4pOwotCWlmICh1bmxpa2VseShyZXQpKQotCQlnb3RvIG91dDsKLQotCXJldCA9IGluaXRfbG9nKCZsb2dfZXZlbnRzKTsKLQlpZiAodW5saWtlbHkocmV0KSkKLQkJZ290byBvdXQ7Ci0KLQlyZXQgPSBpbml0X2xvZygmbG9nX3JhZGlvKTsKLQlpZiAodW5saWtlbHkocmV0KSkKLQkJZ290byBvdXQ7Ci0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotZGV2aWNlX2luaXRjYWxsKGxvZ2dlcl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvZ2dlci5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NjI0MzQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKiBpbmNsdWRlL2xpbnV4L2xvZ2dlci5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggR29vZ2xlLCBJbmMuCi0gKiBBdXRob3I6IFJvYmVydCBMb3ZlIDxybG92ZUBhbmRyb2lkLmNvbT4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9MT0dHRVJfSAotI2RlZmluZSBfTElOVVhfTE9HR0VSX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KLQotc3RydWN0IGxvZ2dlcl9lbnRyeSB7Ci0JX191MTYJCWxlbjsJLyogbGVuZ3RoIG9mIHRoZSBwYXlsb2FkICovCi0JX191MTYJCV9fcGFkOwkvKiBubyBtYXR0ZXIgd2hhdCwgd2UgZ2V0IDIgYnl0ZXMgb2YgcGFkZGluZyAqLwotCV9fczMyCQlwaWQ7CS8qIGdlbmVyYXRpbmcgcHJvY2VzcydzIHBpZCAqLwotCV9fczMyCQl0aWQ7CS8qIGdlbmVyYXRpbmcgcHJvY2VzcydzIHRpZCAqLwotCV9fczMyCQlzZWM7CS8qIHNlY29uZHMgc2luY2UgRXBvY2ggKi8KLQlfX3MzMgkJbnNlYzsJLyogbmFub3NlY29uZHMgKi8KLQljaGFyCQltc2dbMF07CS8qIHRoZSBlbnRyeSdzIHBheWxvYWQgKi8KLX07Ci0KLSNkZWZpbmUgTE9HR0VSX0xPR19SQURJTwkibG9nX3JhZGlvIgkvKiByYWRpby1yZWxhdGVkIG1lc3NhZ2VzICovCi0jZGVmaW5lIExPR0dFUl9MT0dfRVZFTlRTCSJsb2dfZXZlbnRzIgkvKiBzeXN0ZW0vaGFyZHdhcmUgZXZlbnRzICovCi0jZGVmaW5lIExPR0dFUl9MT0dfTUFJTgkJImxvZ19tYWluIgkvKiBldmVyeXRoaW5nIGVsc2UgKi8KLQotI2RlZmluZSBMT0dHRVJfRU5UUllfTUFYX0xFTgkJKDQqMTAyNCkKLSNkZWZpbmUgTE9HR0VSX0VOVFJZX01BWF9QQVlMT0FECVwKLQkoTE9HR0VSX0VOVFJZX01BWF9MRU4gLSBzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSkpCi0KLSNkZWZpbmUgX19MT0dHRVJJTwkweEFFCi0KLSNkZWZpbmUgTE9HR0VSX0dFVF9MT0dfQlVGX1NJWkUJCV9JTyhfX0xPR0dFUklPLCAxKSAvKiBzaXplIG9mIGxvZyAqLwotI2RlZmluZSBMT0dHRVJfR0VUX0xPR19MRU4JCV9JTyhfX0xPR0dFUklPLCAyKSAvKiB1c2VkIGxvZyBsZW4gKi8KLSNkZWZpbmUgTE9HR0VSX0dFVF9ORVhUX0VOVFJZX0xFTglfSU8oX19MT0dHRVJJTywgMykgLyogbmV4dCBlbnRyeSBsZW4gKi8KLSNkZWZpbmUgTE9HR0VSX0ZMVVNIX0xPRwkJX0lPKF9fTE9HR0VSSU8sIDQpIC8qIGZsdXNoIGxvZyAqLwotCi0jZW5kaWYgLyogX0xJTlVYX0xPR0dFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb3dtZW1vcnlraWxsZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvd21lbW9yeWtpbGxlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzVkMjgxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvd21lbW9yeWtpbGxlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qIGRyaXZlcnMvbWlzYy9sb3dtZW1vcnlraWxsZXIuYwotICoKLSAqIFRoZSBsb3dtZW1vcnlraWxsZXIgZHJpdmVyIGxldHMgdXNlci1zcGFjZSBzcGVjaWZ5IGEgc2V0IG9mIG1lbW9yeSB0aHJlc2hvbGRzCi0gKiB3aGVyZSBwcm9jZXNzZXMgd2l0aCBhIHJhbmdlIG9mIG9vbV9hZGogdmFsdWVzIHdpbGwgZ2V0IGtpbGxlZC4gU3BlY2lmeSB0aGUKLSAqIG1pbmltdW0gb29tX2FkaiB2YWx1ZXMgaW4gL3N5cy9tb2R1bGUvbG93bWVtb3J5a2lsbGVyL3BhcmFtZXRlcnMvYWRqIGFuZCB0aGUKLSAqIG51bWJlciBvZiBmcmVlIHBhZ2VzIGluIC9zeXMvbW9kdWxlL2xvd21lbW9yeWtpbGxlci9wYXJhbWV0ZXJzL21pbmZyZWUuIEJvdGgKLSAqIGZpbGVzIHRha2UgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBudW1iZXJzIGluIGFzY2VuZGluZyBvcmRlci4KLSAqCi0gKiBGb3IgZXhhbXBsZSwgd3JpdGUgIjAsOCIgdG8gL3N5cy9tb2R1bGUvbG93bWVtb3J5a2lsbGVyL3BhcmFtZXRlcnMvYWRqIGFuZAotICogIjEwMjQsNDA5NiIgdG8gL3N5cy9tb2R1bGUvbG93bWVtb3J5a2lsbGVyL3BhcmFtZXRlcnMvbWluZnJlZSB0byBraWxsIHByb2Nlc3NlcwotICogd2l0aCBhIG9vbV9hZGogdmFsdWUgb2YgOCBvciBoaWdoZXIgd2hlbiB0aGUgZnJlZSBtZW1vcnkgZHJvcHMgYmVsb3cgNDA5NiBwYWdlcwotICogYW5kIGtpbGwgcHJvY2Vzc2VzIHdpdGggYSBvb21fYWRqIHZhbHVlIG9mIDAgb3IgaGlnaGVyIHdoZW4gdGhlIGZyZWUgbWVtb3J5Ci0gKiBkcm9wcyBiZWxvdyAxMDI0IHBhZ2VzLgotICoKLSAqIFRoZSBkcml2ZXIgY29uc2lkZXJzIG1lbW9yeSB1c2VkIGZvciBjYWNoZXMgdG8gYmUgZnJlZSwgYnV0IGlmIGEgbGFyZ2UKLSAqIHBlcmNlbnRhZ2Ugb2YgdGhlIGNhY2hlZCBtZW1vcnkgaXMgbG9ja2VkIHRoaXMgY2FuIGJlIHZlcnkgaW5hY2N1cmF0ZQotICogYW5kIHByb2Nlc3NlcyBtYXkgbm90IGdldCBraWxsZWQgdW50aWwgdGhlIG5vcm1hbCBvb20ga2lsbGVyIGlzIHRyaWdnZXJlZC4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBHb29nbGUsIEluYy4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9vb20uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi1zdGF0aWMgdWludDMyX3QgbG93bWVtX2RlYnVnX2xldmVsID0gMjsKLXN0YXRpYyBpbnQgbG93bWVtX2Fkals2XSA9IHsKLQkwLAotCTEsCi0JNiwKLQkxMiwKLX07Ci1zdGF0aWMgaW50IGxvd21lbV9hZGpfc2l6ZSA9IDQ7Ci1zdGF0aWMgc2l6ZV90IGxvd21lbV9taW5mcmVlWzZdID0gewotCTMgKiA1MTIsCS8qIDZNQiAqLwotCTIgKiAxMDI0LAkvKiA4TUIgKi8KLQk0ICogMTAyNCwJLyogMTZNQiAqLwotCTE2ICogMTAyNCwJLyogNjRNQiAqLwotfTsKLXN0YXRpYyBpbnQgbG93bWVtX21pbmZyZWVfc2l6ZSA9IDQ7Ci0KLSNkZWZpbmUgbG93bWVtX3ByaW50KGxldmVsLCB4Li4uKQkJCVwKLQlkbyB7CQkJCQkJXAotCQlpZiAobG93bWVtX2RlYnVnX2xldmVsID49IChsZXZlbCkpCVwKLQkJCXByaW50ayh4KTsJCQlcCi0JfSB3aGlsZSAoMCkKLQotc3RhdGljIGludCBsb3dtZW1fc2hyaW5rKGludCBucl90b19zY2FuLCBnZnBfdCBnZnBfbWFzaykKLXsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpzZWxlY3RlZCA9IE5VTEw7Ci0JaW50IHJlbSA9IDA7Ci0JaW50IHRhc2tzaXplOwotCWludCBpOwotCWludCBtaW5fYWRqID0gT09NX0FESlVTVF9NQVggKyAxOwotCWludCBzZWxlY3RlZF90YXNrc2l6ZSA9IDA7Ci0JaW50IHNlbGVjdGVkX29vbV9hZGo7Ci0JaW50IGFycmF5X3NpemUgPSBBUlJBWV9TSVpFKGxvd21lbV9hZGopOwotCWludCBvdGhlcl9mcmVlID0gZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfRlJFRV9QQUdFUyk7Ci0JaW50IG90aGVyX2ZpbGUgPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9GSUxFX1BBR0VTKTsKLQotCWlmIChsb3dtZW1fYWRqX3NpemUgPCBhcnJheV9zaXplKQotCQlhcnJheV9zaXplID0gbG93bWVtX2Fkal9zaXplOwotCWlmIChsb3dtZW1fbWluZnJlZV9zaXplIDwgYXJyYXlfc2l6ZSkKLQkJYXJyYXlfc2l6ZSA9IGxvd21lbV9taW5mcmVlX3NpemU7Ci0JZm9yIChpID0gMDsgaSA8IGFycmF5X3NpemU7IGkrKykgewotCQlpZiAob3RoZXJfZnJlZSA8IGxvd21lbV9taW5mcmVlW2ldICYmCi0JCSAgICBvdGhlcl9maWxlIDwgbG93bWVtX21pbmZyZWVbaV0pIHsKLQkJCW1pbl9hZGogPSBsb3dtZW1fYWRqW2ldOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKG5yX3RvX3NjYW4gPiAwKQotCQlsb3dtZW1fcHJpbnQoMywgImxvd21lbV9zaHJpbmsgJWQsICV4LCBvZnJlZSAlZCAlZCwgbWEgJWRcbiIsCi0JCQkgICAgIG5yX3RvX3NjYW4sIGdmcF9tYXNrLCBvdGhlcl9mcmVlLCBvdGhlcl9maWxlLAotCQkJICAgICBtaW5fYWRqKTsKLQlyZW0gPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9BQ1RJVkVfQU5PTikgKwotCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9BQ1RJVkVfRklMRSkgKwotCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9JTkFDVElWRV9BTk9OKSArCi0JCWdsb2JhbF9wYWdlX3N0YXRlKE5SX0lOQUNUSVZFX0ZJTEUpOwotCWlmIChucl90b19zY2FuIDw9IDAgfHwgbWluX2FkaiA9PSBPT01fQURKVVNUX01BWCArIDEpIHsKLQkJbG93bWVtX3ByaW50KDUsICJsb3dtZW1fc2hyaW5rICVkLCAleCwgcmV0dXJuICVkXG4iLAotCQkJICAgICBucl90b19zY2FuLCBnZnBfbWFzaywgcmVtKTsKLQkJcmV0dXJuIHJlbTsKLQl9Ci0Jc2VsZWN0ZWRfb29tX2FkaiA9IG1pbl9hZGo7Ci0KLQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwotCWZvcl9lYWNoX3Byb2Nlc3MocCkgewotCQlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKLQkJaW50IG9vbV9hZGo7Ci0KLQkJdGFza19sb2NrKHApOwotCQltbSA9IHAtPm1tOwotCQlpZiAoIW1tKSB7Ci0JCQl0YXNrX3VubG9jayhwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCW9vbV9hZGogPSBtbS0+b29tX2FkajsKLQkJaWYgKG9vbV9hZGogPCBtaW5fYWRqKSB7Ci0JCQl0YXNrX3VubG9jayhwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXRhc2tzaXplID0gZ2V0X21tX3JzcyhtbSk7Ci0JCXRhc2tfdW5sb2NrKHApOwotCQlpZiAodGFza3NpemUgPD0gMCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCWlmIChvb21fYWRqIDwgc2VsZWN0ZWRfb29tX2FkaikKLQkJCQljb250aW51ZTsKLQkJCWlmIChvb21fYWRqID09IHNlbGVjdGVkX29vbV9hZGogJiYKLQkJCSAgICB0YXNrc2l6ZSA8PSBzZWxlY3RlZF90YXNrc2l6ZSkKLQkJCQljb250aW51ZTsKLQkJfQotCQlzZWxlY3RlZCA9IHA7Ci0JCXNlbGVjdGVkX3Rhc2tzaXplID0gdGFza3NpemU7Ci0JCXNlbGVjdGVkX29vbV9hZGogPSBvb21fYWRqOwotCQlsb3dtZW1fcHJpbnQoMiwgInNlbGVjdCAlZCAoJXMpLCBhZGogJWQsIHNpemUgJWQsIHRvIGtpbGxcbiIsCi0JCQkgICAgIHAtPnBpZCwgcC0+Y29tbSwgb29tX2FkaiwgdGFza3NpemUpOwotCX0KLQlpZiAoc2VsZWN0ZWQpIHsKLQkJbG93bWVtX3ByaW50KDEsICJzZW5kIHNpZ2tpbGwgdG8gJWQgKCVzKSwgYWRqICVkLCBzaXplICVkXG4iLAotCQkJICAgICBzZWxlY3RlZC0+cGlkLCBzZWxlY3RlZC0+Y29tbSwKLQkJCSAgICAgc2VsZWN0ZWRfb29tX2Fkaiwgc2VsZWN0ZWRfdGFza3NpemUpOwotCQlmb3JjZV9zaWcoU0lHS0lMTCwgc2VsZWN0ZWQpOwotCQlyZW0gLT0gc2VsZWN0ZWRfdGFza3NpemU7Ci0JfQotCWxvd21lbV9wcmludCg0LCAibG93bWVtX3NocmluayAlZCwgJXgsIHJldHVybiAlZFxuIiwKLQkJICAgICBucl90b19zY2FuLCBnZnBfbWFzaywgcmVtKTsKLQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Ci0JcmV0dXJuIHJlbTsKLX0KLQotc3RhdGljIHN0cnVjdCBzaHJpbmtlciBsb3dtZW1fc2hyaW5rZXIgPSB7Ci0JLnNocmluayA9IGxvd21lbV9zaHJpbmssCi0JLnNlZWtzID0gREVGQVVMVF9TRUVLUyAqIDE2Ci19OwotCi1zdGF0aWMgaW50IF9faW5pdCBsb3dtZW1faW5pdCh2b2lkKQotewotCXJlZ2lzdGVyX3Nocmlua2VyKCZsb3dtZW1fc2hyaW5rZXIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbG93bWVtX2V4aXQodm9pZCkKLXsKLQl1bnJlZ2lzdGVyX3Nocmlua2VyKCZsb3dtZW1fc2hyaW5rZXIpOwotfQotCi1tb2R1bGVfcGFyYW1fbmFtZWQoY29zdCwgbG93bWVtX3Nocmlua2VyLnNlZWtzLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKLW1vZHVsZV9wYXJhbV9hcnJheV9uYW1lZChhZGosIGxvd21lbV9hZGosIGludCwgJmxvd21lbV9hZGpfc2l6ZSwKLQkJCSBTX0lSVUdPIHwgU19JV1VTUik7Ci1tb2R1bGVfcGFyYW1fYXJyYXlfbmFtZWQobWluZnJlZSwgbG93bWVtX21pbmZyZWUsIHVpbnQsICZsb3dtZW1fbWluZnJlZV9zaXplLAotCQkJIFNfSVJVR08gfCBTX0lXVVNSKTsKLW1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Z19sZXZlbCwgbG93bWVtX2RlYnVnX2xldmVsLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7Ci0KLW1vZHVsZV9pbml0KGxvd21lbV9pbml0KTsKLW1vZHVsZV9leGl0KGxvd21lbV9leGl0KTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9yYW1fY29uc29sZS5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvcmFtX2NvbnNvbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYxOGE1OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9yYW1fY29uc29sZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLS8qIGRyaXZlcnMvYW5kcm9pZC9yYW1fY29uc29sZS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggR29vZ2xlLCBJbmMuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotI2luY2x1ZGUgPGxpbnV4L3JzbGliLmg+Ci0jZW5kaWYKLQotc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlciB7Ci0JdWludDMyX3QgICAgc2lnOwotCXVpbnQzMl90ICAgIHN0YXJ0OwotCXVpbnQzMl90ICAgIHNpemU7Ci0JdWludDhfdCAgICAgZGF0YVswXTsKLX07Ci0KLSNkZWZpbmUgUkFNX0NPTlNPTEVfU0lHICgweDQzNDc0MjQ0KSAvKiBEQkdDICovCi0KLSNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FQVJMWV9JTklUCi1zdGF0aWMgY2hhciBfX2luaXRkYXRhCi0JcmFtX2NvbnNvbGVfb2xkX2xvZ19pbml0X2J1ZmZlcltDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FQVJMWV9TSVpFXTsKLSNlbmRpZgotc3RhdGljIGNoYXIgKnJhbV9jb25zb2xlX29sZF9sb2c7Ci1zdGF0aWMgc2l6ZV90IHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZTsKLQotc3RhdGljIHN0cnVjdCByYW1fY29uc29sZV9idWZmZXIgKnJhbV9jb25zb2xlX2J1ZmZlcjsKLXN0YXRpYyBzaXplX3QgcmFtX2NvbnNvbGVfYnVmZmVyX3NpemU7Ci0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotc3RhdGljIGNoYXIgKnJhbV9jb25zb2xlX3Bhcl9idWZmZXI7Ci1zdGF0aWMgc3RydWN0IHJzX2NvbnRyb2wgKnJhbV9jb25zb2xlX3JzX2RlY29kZXI7Ci1zdGF0aWMgaW50IHJhbV9jb25zb2xlX2NvcnJlY3RlZF9ieXRlczsKLXN0YXRpYyBpbnQgcmFtX2NvbnNvbGVfYmFkX2Jsb2NrczsKLSNkZWZpbmUgRUNDX0JMT0NLX1NJWkUgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9EQVRBX1NJWkUKLSNkZWZpbmUgRUNDX1NJWkUgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9FQ0NfU0laRQotI2RlZmluZSBFQ0NfU1lNU0laRSBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFCi0jZGVmaW5lIEVDQ19QT0xZIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fUE9MWU5PTUlBTAotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCi1zdGF0aWMgdm9pZCByYW1fY29uc29sZV9lbmNvZGVfcnM4KHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW4sIHVpbnQ4X3QgKmVjYykKLXsKLQlpbnQgaTsKLQl1aW50MTZfdCBwYXJbRUNDX1NJWkVdOwotCS8qIEluaXRpYWxpemUgdGhlIHBhcml0eSBidWZmZXIgKi8KLQltZW1zZXQocGFyLCAwLCBzaXplb2YocGFyKSk7Ci0JZW5jb2RlX3JzOChyYW1fY29uc29sZV9yc19kZWNvZGVyLCBkYXRhLCBsZW4sIHBhciwgMCk7Ci0JZm9yIChpID0gMDsgaSA8IEVDQ19TSVpFOyBpKyspCi0JCWVjY1tpXSA9IHBhcltpXTsKLX0KLQotc3RhdGljIGludCByYW1fY29uc29sZV9kZWNvZGVfcnM4KHZvaWQgKmRhdGEsIHNpemVfdCBsZW4sIHVpbnQ4X3QgKmVjYykKLXsKLQlpbnQgaTsKLQl1aW50MTZfdCBwYXJbRUNDX1NJWkVdOwotCWZvciAoaSA9IDA7IGkgPCBFQ0NfU0laRTsgaSsrKQotCQlwYXJbaV0gPSBlY2NbaV07Ci0JcmV0dXJuIGRlY29kZV9yczgocmFtX2NvbnNvbGVfcnNfZGVjb2RlciwgZGF0YSwgcGFyLCBsZW4sCi0JCQkJTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgcmFtX2NvbnNvbGVfdXBkYXRlKGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQlzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyICpidWZmZXIgPSByYW1fY29uc29sZV9idWZmZXI7Ci0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotCXVpbnQ4X3QgKmJ1ZmZlcl9lbmQgPSBidWZmZXItPmRhdGEgKyByYW1fY29uc29sZV9idWZmZXJfc2l6ZTsKLQl1aW50OF90ICpibG9jazsKLQl1aW50OF90ICpwYXI7Ci0JaW50IHNpemUgPSBFQ0NfQkxPQ0tfU0laRTsKLSNlbmRpZgotCW1lbWNweShidWZmZXItPmRhdGEgKyBidWZmZXItPnN0YXJ0LCBzLCBjb3VudCk7Ci0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotCWJsb2NrID0gYnVmZmVyLT5kYXRhICsgKGJ1ZmZlci0+c3RhcnQgJiB+KEVDQ19CTE9DS19TSVpFIC0gMSkpOwotCXBhciA9IHJhbV9jb25zb2xlX3Bhcl9idWZmZXIgKwotCSAgICAgIChidWZmZXItPnN0YXJ0IC8gRUNDX0JMT0NLX1NJWkUpICogRUNDX1NJWkU7Ci0JZG8gewotCQlpZiAoYmxvY2sgKyBFQ0NfQkxPQ0tfU0laRSA+IGJ1ZmZlcl9lbmQpCi0JCQlzaXplID0gYnVmZmVyX2VuZCAtIGJsb2NrOwotCQlyYW1fY29uc29sZV9lbmNvZGVfcnM4KGJsb2NrLCBzaXplLCBwYXIpOwotCQlibG9jayArPSBFQ0NfQkxPQ0tfU0laRTsKLQkJcGFyICs9IEVDQ19TSVpFOwotCX0gd2hpbGUgKGJsb2NrIDwgYnVmZmVyLT5kYXRhICsgYnVmZmVyLT5zdGFydCArIGNvdW50KTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCByYW1fY29uc29sZV91cGRhdGVfaGVhZGVyKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotCXN0cnVjdCByYW1fY29uc29sZV9idWZmZXIgKmJ1ZmZlciA9IHJhbV9jb25zb2xlX2J1ZmZlcjsKLQl1aW50OF90ICpwYXI7Ci0JcGFyID0gcmFtX2NvbnNvbGVfcGFyX2J1ZmZlciArCi0JICAgICAgRElWX1JPVU5EX1VQKHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplLCBFQ0NfQkxPQ0tfU0laRSkgKiBFQ0NfU0laRTsKLQlyYW1fY29uc29sZV9lbmNvZGVfcnM4KCh1aW50OF90ICopYnVmZmVyLCBzaXplb2YoKmJ1ZmZlciksIHBhcik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLXJhbV9jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjb25zb2xlLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0JaW50IHJlbTsKLQlzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyICpidWZmZXIgPSByYW1fY29uc29sZV9idWZmZXI7Ci0KLQlpZiAoY291bnQgPiByYW1fY29uc29sZV9idWZmZXJfc2l6ZSkgewotCQlzICs9IGNvdW50IC0gcmFtX2NvbnNvbGVfYnVmZmVyX3NpemU7Ci0JCWNvdW50ID0gcmFtX2NvbnNvbGVfYnVmZmVyX3NpemU7Ci0JfQotCXJlbSA9IHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplIC0gYnVmZmVyLT5zdGFydDsKLQlpZiAocmVtIDwgY291bnQpIHsKLQkJcmFtX2NvbnNvbGVfdXBkYXRlKHMsIHJlbSk7Ci0JCXMgKz0gcmVtOwotCQljb3VudCAtPSByZW07Ci0JCWJ1ZmZlci0+c3RhcnQgPSAwOwotCQlidWZmZXItPnNpemUgPSByYW1fY29uc29sZV9idWZmZXJfc2l6ZTsKLQl9Ci0JcmFtX2NvbnNvbGVfdXBkYXRlKHMsIGNvdW50KTsKLQotCWJ1ZmZlci0+c3RhcnQgKz0gY291bnQ7Ci0JaWYgKGJ1ZmZlci0+c2l6ZSA8IHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplKQotCQlidWZmZXItPnNpemUgKz0gY291bnQ7Ci0JcmFtX2NvbnNvbGVfdXBkYXRlX2hlYWRlcigpOwotfQotCi1zdGF0aWMgc3RydWN0IGNvbnNvbGUgcmFtX2NvbnNvbGUgPSB7Ci0JLm5hbWUJPSAicmFtIiwKLQkud3JpdGUJPSByYW1fY29uc29sZV93cml0ZSwKLQkuZmxhZ3MJPSBDT05fUFJJTlRCVUZGRVIgfCBDT05fRU5BQkxFRCwKLQkuaW5kZXgJPSAtMSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdAotcmFtX2NvbnNvbGVfc2F2ZV9vbGQoc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlciAqYnVmZmVyLCBjaGFyICpkZXN0KQotewotCXNpemVfdCBvbGRfbG9nX3NpemUgPSBidWZmZXItPnNpemU7Ci0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotCXVpbnQ4X3QgKmJsb2NrOwotCXVpbnQ4X3QgKnBhcjsKLQljaGFyIHN0cmJ1Zls4MF07Ci0JaW50IHN0cmJ1Zl9sZW47Ci0KLQlibG9jayA9IGJ1ZmZlci0+ZGF0YTsKLQlwYXIgPSByYW1fY29uc29sZV9wYXJfYnVmZmVyOwotCXdoaWxlIChibG9jayA8IGJ1ZmZlci0+ZGF0YSArIGJ1ZmZlci0+c2l6ZSkgewotCQlpbnQgbnVtZXJyOwotCQlpbnQgc2l6ZSA9IEVDQ19CTE9DS19TSVpFOwotCQlpZiAoYmxvY2sgKyBzaXplID4gYnVmZmVyLT5kYXRhICsgcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUpCi0JCQlzaXplID0gYnVmZmVyLT5kYXRhICsgcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUgLSBibG9jazsKLQkJbnVtZXJyID0gcmFtX2NvbnNvbGVfZGVjb2RlX3JzOChibG9jaywgc2l6ZSwgcGFyKTsKLQkJaWYgKG51bWVyciA+IDApIHsKLSNpZiAwCi0JCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogZXJyb3IgaW4gYmxvY2sgJXAsICVkXG4iLAotCQkJICAgICAgIGJsb2NrLCBudW1lcnIpOwotI2VuZGlmCi0JCQlyYW1fY29uc29sZV9jb3JyZWN0ZWRfYnl0ZXMgKz0gbnVtZXJyOwotCQl9IGVsc2UgaWYgKG51bWVyciA8IDApIHsKLSNpZiAwCi0JCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogdW5jb3JyZWN0YWJsZSBlcnJvciBpbiAiCi0JCQkgICAgICAgImJsb2NrICVwXG4iLCBibG9jayk7Ci0jZW5kaWYKLQkJCXJhbV9jb25zb2xlX2JhZF9ibG9ja3MrKzsKLQkJfQotCQlibG9jayArPSBFQ0NfQkxPQ0tfU0laRTsKLQkJcGFyICs9IEVDQ19TSVpFOwotCX0KLQlpZiAocmFtX2NvbnNvbGVfY29ycmVjdGVkX2J5dGVzIHx8IHJhbV9jb25zb2xlX2JhZF9ibG9ja3MpCi0JCXN0cmJ1Zl9sZW4gPSBzbnByaW50ZihzdHJidWYsIHNpemVvZihzdHJidWYpLAotCQkJIlxuJWQgQ29ycmVjdGVkIGJ5dGVzLCAlZCB1bnJlY292ZXJhYmxlIGJsb2Nrc1xuIiwKLQkJCXJhbV9jb25zb2xlX2NvcnJlY3RlZF9ieXRlcywgcmFtX2NvbnNvbGVfYmFkX2Jsb2Nrcyk7Ci0JZWxzZQotCQlzdHJidWZfbGVuID0gc25wcmludGYoc3RyYnVmLCBzaXplb2Yoc3RyYnVmKSwKLQkJCQkgICAgICAiXG5ObyBlcnJvcnMgZGV0ZWN0ZWRcbiIpOwotCWlmIChzdHJidWZfbGVuID49IHNpemVvZihzdHJidWYpKQotCQlzdHJidWZfbGVuID0gc2l6ZW9mKHN0cmJ1ZikgLSAxOwotCW9sZF9sb2dfc2l6ZSArPSBzdHJidWZfbGVuOwotI2VuZGlmCi0KLQlpZiAoZGVzdCA9PSBOVUxMKSB7Ci0JCWRlc3QgPSBrbWFsbG9jKG9sZF9sb2dfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChkZXN0ID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJyYW1fY29uc29sZTogZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlclxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlyYW1fY29uc29sZV9vbGRfbG9nID0gZGVzdDsKLQlyYW1fY29uc29sZV9vbGRfbG9nX3NpemUgPSBvbGRfbG9nX3NpemU7Ci0JbWVtY3B5KHJhbV9jb25zb2xlX29sZF9sb2csCi0JICAgICAgICZidWZmZXItPmRhdGFbYnVmZmVyLT5zdGFydF0sIGJ1ZmZlci0+c2l6ZSAtIGJ1ZmZlci0+c3RhcnQpOwotCW1lbWNweShyYW1fY29uc29sZV9vbGRfbG9nICsgYnVmZmVyLT5zaXplIC0gYnVmZmVyLT5zdGFydCwKLQkgICAgICAgJmJ1ZmZlci0+ZGF0YVswXSwgYnVmZmVyLT5zdGFydCk7Ci0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotCW1lbWNweShyYW1fY29uc29sZV9vbGRfbG9nICsgb2xkX2xvZ19zaXplIC0gc3RyYnVmX2xlbiwKLQkgICAgICAgc3RyYnVmLCBzdHJidWZfbGVuKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW50IF9faW5pdCByYW1fY29uc29sZV9pbml0KHN0cnVjdCByYW1fY29uc29sZV9idWZmZXIgKmJ1ZmZlciwKLQkJCQkgICBzaXplX3QgYnVmZmVyX3NpemUsIGNoYXIgKm9sZF9idWYpCi17Ci0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotCWludCBudW1lcnI7Ci0JdWludDhfdCAqcGFyOwotI2VuZGlmCi0JcmFtX2NvbnNvbGVfYnVmZmVyID0gYnVmZmVyOwotCXJhbV9jb25zb2xlX2J1ZmZlcl9zaXplID0KLQkJYnVmZmVyX3NpemUgLSBzaXplb2Yoc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlcik7Ci0KLQlpZiAocmFtX2NvbnNvbGVfYnVmZmVyX3NpemUgPiBidWZmZXJfc2l6ZSkgewotCQlwcl9lcnIoInJhbV9jb25zb2xlOiBidWZmZXIgJXAsIGludmFsaWQgc2l6ZSAlenUsICIKLQkJICAgICAgICJkYXRhc2l6ZSAlenVcbiIsIGJ1ZmZlciwgYnVmZmVyX3NpemUsCi0JCSAgICAgICByYW1fY29uc29sZV9idWZmZXJfc2l6ZSk7Ci0JCXJldHVybiAwOwotCX0KLQotI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KLQlyYW1fY29uc29sZV9idWZmZXJfc2l6ZSAtPSAoRElWX1JPVU5EX1VQKHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplLAotCQkJCQkJRUNDX0JMT0NLX1NJWkUpICsgMSkgKiBFQ0NfU0laRTsKLQotCWlmIChyYW1fY29uc29sZV9idWZmZXJfc2l6ZSA+IGJ1ZmZlcl9zaXplKSB7Ci0JCXByX2VycigicmFtX2NvbnNvbGU6IGJ1ZmZlciAlcCwgaW52YWxpZCBzaXplICV6dSwgIgotCQkgICAgICAgIm5vbi1lY2MgZGF0YXNpemUgJXp1XG4iLAotCQkgICAgICAgYnVmZmVyLCBidWZmZXJfc2l6ZSwgcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyYW1fY29uc29sZV9wYXJfYnVmZmVyID0gYnVmZmVyLT5kYXRhICsgcmFtX2NvbnNvbGVfYnVmZmVyX3NpemU7Ci0KLQotCS8qIGZpcnN0IGNvbnNlY3V0aXZlIHJvb3QgaXMgMAotCSAqIHByaW1pdGl2ZSBlbGVtZW50IHRvIGdlbmVyYXRlIHJvb3RzID0gMQotCSAqLwotCXJhbV9jb25zb2xlX3JzX2RlY29kZXIgPSBpbml0X3JzKEVDQ19TWU1TSVpFLCBFQ0NfUE9MWSwgMCwgMSwgRUNDX1NJWkUpOwotCWlmIChyYW1fY29uc29sZV9yc19kZWNvZGVyID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAicmFtX2NvbnNvbGU6IGluaXRfcnMgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmFtX2NvbnNvbGVfY29ycmVjdGVkX2J5dGVzID0gMDsKLQlyYW1fY29uc29sZV9iYWRfYmxvY2tzID0gMDsKLQotCXBhciA9IHJhbV9jb25zb2xlX3Bhcl9idWZmZXIgKwotCSAgICAgIERJVl9ST1VORF9VUChyYW1fY29uc29sZV9idWZmZXJfc2l6ZSwgRUNDX0JMT0NLX1NJWkUpICogRUNDX1NJWkU7Ci0KLQludW1lcnIgPSByYW1fY29uc29sZV9kZWNvZGVfcnM4KGJ1ZmZlciwgc2l6ZW9mKCpidWZmZXIpLCBwYXIpOwotCWlmIChudW1lcnIgPiAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiBlcnJvciBpbiBoZWFkZXIsICVkXG4iLCBudW1lcnIpOwotCQlyYW1fY29uc29sZV9jb3JyZWN0ZWRfYnl0ZXMgKz0gbnVtZXJyOwotCX0gZWxzZSBpZiAobnVtZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAicmFtX2NvbnNvbGU6IHVuY29ycmVjdGFibGUgZXJyb3IgaW4gaGVhZGVyXG4iKTsKLQkJcmFtX2NvbnNvbGVfYmFkX2Jsb2NrcysrOwotCX0KLSNlbmRpZgotCi0JaWYgKGJ1ZmZlci0+c2lnID09IFJBTV9DT05TT0xFX1NJRykgewotCQlpZiAoYnVmZmVyLT5zaXplID4gcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUKLQkJICAgIHx8IGJ1ZmZlci0+c3RhcnQgPiBidWZmZXItPnNpemUpCi0JCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogZm91bmQgZXhpc3RpbmcgaW52YWxpZCAiCi0JCQkgICAgICAgImJ1ZmZlciwgc2l6ZSAlZCwgc3RhcnQgJWRcbiIsCi0JCQkgICAgICAgYnVmZmVyLT5zaXplLCBidWZmZXItPnN0YXJ0KTsKLQkJZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogZm91bmQgZXhpc3RpbmcgYnVmZmVyLCAiCi0JCQkgICAgICAgInNpemUgJWQsIHN0YXJ0ICVkXG4iLAotCQkJICAgICAgIGJ1ZmZlci0+c2l6ZSwgYnVmZmVyLT5zdGFydCk7Ci0JCQlyYW1fY29uc29sZV9zYXZlX29sZChidWZmZXIsIG9sZF9idWYpOwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAicmFtX2NvbnNvbGU6IG5vIHZhbGlkIGRhdGEgaW4gYnVmZmVyICIKLQkJICAgICAgICIoc2lnID0gMHglMDh4KVxuIiwgYnVmZmVyLT5zaWcpOwotCX0KLQotCWJ1ZmZlci0+c2lnID0gUkFNX0NPTlNPTEVfU0lHOwotCWJ1ZmZlci0+c3RhcnQgPSAwOwotCWJ1ZmZlci0+c2l6ZSA9IDA7Ci0KLQlyZWdpc3Rlcl9jb25zb2xlKCZyYW1fY29uc29sZSk7Ci0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRU5BQkxFX1ZFUkJPU0UKLQljb25zb2xlX3ZlcmJvc2UoKTsKLSNlbmRpZgotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAotc3RhdGljIGludCBfX2luaXQgcmFtX2NvbnNvbGVfZWFybHlfaW5pdCh2b2lkKQotewotCXJldHVybiByYW1fY29uc29sZV9pbml0KChzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyICopCi0JCUNPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0FERFIsCi0JCUNPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX1NJWkUsCi0JCXJhbV9jb25zb2xlX29sZF9sb2dfaW5pdF9idWZmZXIpOwotfQotI2Vsc2UKLXN0YXRpYyBpbnQgcmFtX2NvbnNvbGVfZHJpdmVyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHJlc291cmNlICpyZXMgPSBwZGV2LT5yZXNvdXJjZTsKLQlzaXplX3Qgc3RhcnQ7Ci0Jc2l6ZV90IGJ1ZmZlcl9zaXplOwotCXZvaWQgKmJ1ZmZlcjsKLQotCWlmIChyZXMgPT0gTlVMTCB8fCBwZGV2LT5udW1fcmVzb3VyY2VzICE9IDEgfHwKLQkgICAgIShyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicmFtX2NvbnNvbGU6IGludmFsaWQgcmVzb3VyY2UsICVwICVkIGZsYWdzICIKLQkJICAgICAgICIlbHhcbiIsIHJlcywgcGRldi0+bnVtX3Jlc291cmNlcywgcmVzID8gcmVzLT5mbGFncyA6IDApOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQlidWZmZXJfc2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7Ci0Jc3RhcnQgPSByZXMtPnN0YXJ0OwotCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiBnb3QgYnVmZmVyIGF0ICV6eCwgc2l6ZSAlenhcbiIsCi0JICAgICAgIHN0YXJ0LCBidWZmZXJfc2l6ZSk7Ci0JYnVmZmVyID0gaW9yZW1hcChyZXMtPnN0YXJ0LCBidWZmZXJfc2l6ZSk7Ci0JaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicmFtX2NvbnNvbGU6IGZhaWxlZCB0byBtYXAgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcmV0dXJuIHJhbV9jb25zb2xlX2luaXQoYnVmZmVyLCBidWZmZXJfc2l6ZSwgTlVMTC8qIGFsbG9jYXRlICovKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcmFtX2NvbnNvbGVfZHJpdmVyID0gewotCS5wcm9iZSA9IHJhbV9jb25zb2xlX2RyaXZlcl9wcm9iZSwKLQkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSAicmFtX2NvbnNvbGUiLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCByYW1fY29uc29sZV9tb2R1bGVfaW5pdCh2b2lkKQotewotCWludCBlcnI7Ci0JZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZyYW1fY29uc29sZV9kcml2ZXIpOwotCXJldHVybiBlcnI7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHNzaXplX3QgcmFtX2NvbnNvbGVfcmVhZF9vbGQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkJICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KQotewotCWxvZmZfdCBwb3MgPSAqb2Zmc2V0OwotCXNzaXplX3QgY291bnQ7Ci0KLQlpZiAocG9zID49IHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSkKLQkJcmV0dXJuIDA7Ci0KLQljb3VudCA9IG1pbihsZW4sIChzaXplX3QpKHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSAtIHBvcykpOwotCWlmIChjb3B5X3RvX3VzZXIoYnVmLCByYW1fY29uc29sZV9vbGRfbG9nICsgcG9zLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JKm9mZnNldCArPSBjb3VudDsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJhbV9jb25zb2xlX2ZpbGVfb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5yZWFkID0gcmFtX2NvbnNvbGVfcmVhZF9vbGQsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCByYW1fY29uc29sZV9sYXRlX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OwotCi0JaWYgKHJhbV9jb25zb2xlX29sZF9sb2cgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAotCXJhbV9jb25zb2xlX29sZF9sb2cgPSBrbWFsbG9jKHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHJhbV9jb25zb2xlX29sZF9sb2cgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJyYW1fY29uc29sZTogZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3Igb2xkIGxvZ1xuIik7Ci0JCXJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQltZW1jcHkocmFtX2NvbnNvbGVfb2xkX2xvZywKLQkgICAgICAgcmFtX2NvbnNvbGVfb2xkX2xvZ19pbml0X2J1ZmZlciwgcmFtX2NvbnNvbGVfb2xkX2xvZ19zaXplKTsKLSNlbmRpZgotCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoImxhc3Rfa21zZyIsIFNfSUZSRUcgfCBTX0lSVUdPLCBOVUxMKTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicmFtX2NvbnNvbGU6IGZhaWxlZCB0byBjcmVhdGUgcHJvYyBlbnRyeVxuIik7Ci0JCWtmcmVlKHJhbV9jb25zb2xlX29sZF9sb2cpOwotCQlyYW1fY29uc29sZV9vbGRfbG9nID0gTlVMTDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JZW50cnktPnByb2NfZm9wcyA9ICZyYW1fY29uc29sZV9maWxlX29wczsKLQllbnRyeS0+c2l6ZSA9IHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0lOSVQKLWNvbnNvbGVfaW5pdGNhbGwocmFtX2NvbnNvbGVfZWFybHlfaW5pdCk7Ci0jZWxzZQotbW9kdWxlX2luaXQocmFtX2NvbnNvbGVfbW9kdWxlX2luaXQpOwotI2VuZGlmCi1sYXRlX2luaXRjYWxsKHJhbV9jb25zb2xlX2xhdGVfaW5pdCk7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX2dwaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX2dwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU3Y2RhYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9ncGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyogZHJpdmVycy9taXNjL3RpbWVkX2dwaW8uYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIEF1dGhvcjogTWlrZSBMb2Nrd29vZCA8bG9ja3dvb2RAYW5kcm9pZC5jb20+Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0KLSNpbmNsdWRlICJ0aW1lZF9vdXRwdXQuaCIKLSNpbmNsdWRlICJ0aW1lZF9ncGlvLmgiCi0KLQotc3RydWN0IHRpbWVkX2dwaW9fZGF0YSB7Ci0Jc3RydWN0IHRpbWVkX291dHB1dF9kZXYgZGV2OwotCXN0cnVjdCBocnRpbWVyIHRpbWVyOwotCXNwaW5sb2NrX3QgbG9jazsKLQl1bnNpZ25lZCAJZ3BpbzsKLQlpbnQgCQltYXhfdGltZW91dDsKLQl1OCAJCWFjdGl2ZV9sb3c7Ci19OwotCi1zdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgZ3Bpb190aW1lcl9mdW5jKHN0cnVjdCBocnRpbWVyICp0aW1lcikKLXsKLQlzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhICpkYXRhID0KLQkJY29udGFpbmVyX29mKHRpbWVyLCBzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhLCB0aW1lcik7Ci0KLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZGF0YS0+Z3BpbywgZGF0YS0+YWN0aXZlX2xvdyA/IDEgOiAwKTsKLQlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Ci19Ci0KLXN0YXRpYyBpbnQgZ3Bpb19nZXRfdGltZShzdHJ1Y3QgdGltZWRfb3V0cHV0X2RldiAqZGV2KQotewotCXN0cnVjdCB0aW1lZF9ncGlvX2RhdGEJKmRhdGEgPQotCQljb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhLCBkZXYpOwotCi0JaWYgKGhydGltZXJfYWN0aXZlKCZkYXRhLT50aW1lcikpIHsKLQkJa3RpbWVfdCByID0gaHJ0aW1lcl9nZXRfcmVtYWluaW5nKCZkYXRhLT50aW1lcik7Ci0JCXN0cnVjdCB0aW1ldmFsIHQgPSBrdGltZV90b190aW1ldmFsKHIpOwotCQlyZXR1cm4gdC50dl9zZWMgKiAxMDAwICsgdC50dl91c2VjIC8gMTAwMDsKLQl9IGVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGdwaW9fZW5hYmxlKHN0cnVjdCB0aW1lZF9vdXRwdXRfZGV2ICpkZXYsIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhCSpkYXRhID0KLQkJY29udGFpbmVyX29mKGRldiwgc3RydWN0IHRpbWVkX2dwaW9fZGF0YSwgZGV2KTsKLQl1bnNpZ25lZCBsb25nCWZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGEtPmxvY2ssIGZsYWdzKTsKLQotCS8qIGNhbmNlbCBwcmV2aW91cyB0aW1lciBhbmQgc2V0IEdQSU8gYWNjb3JkaW5nIHRvIHZhbHVlICovCi0JaHJ0aW1lcl9jYW5jZWwoJmRhdGEtPnRpbWVyKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZGF0YS0+Z3BpbywgZGF0YS0+YWN0aXZlX2xvdyA/ICF2YWx1ZSA6ICEhdmFsdWUpOwotCi0JaWYgKHZhbHVlID4gMCkgewotCQlpZiAodmFsdWUgPiBkYXRhLT5tYXhfdGltZW91dCkKLQkJCXZhbHVlID0gZGF0YS0+bWF4X3RpbWVvdXQ7Ci0KLQkJaHJ0aW1lcl9zdGFydCgmZGF0YS0+dGltZXIsCi0JCQlrdGltZV9zZXQodmFsdWUgLyAxMDAwLCAodmFsdWUgJSAxMDAwKSAqIDEwMDAwMDApLAotCQkJSFJUSU1FUl9NT0RFX1JFTCk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YS0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IHRpbWVkX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgdGltZWRfZ3Bpb19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCB0aW1lZF9ncGlvICpjdXJfZ3BpbzsKLQlzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhICpncGlvX2RhdGEsICpncGlvX2RhdDsKLQlpbnQgaSwgaiwgcmV0ID0gMDsKLQotCWlmICghcGRhdGEpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlncGlvX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhKSAqIHBkYXRhLT5udW1fZ3Bpb3MsCi0JCQlHRlBfS0VSTkVMKTsKLQlpZiAoIWdwaW9fZGF0YSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9ncGlvczsgaSsrKSB7Ci0JCWN1cl9ncGlvID0gJnBkYXRhLT5ncGlvc1tpXTsKLQkJZ3Bpb19kYXQgPSAmZ3Bpb19kYXRhW2ldOwotCi0JCWhydGltZXJfaW5pdCgmZ3Bpb19kYXQtPnRpbWVyLCBDTE9DS19NT05PVE9OSUMsCi0JCQkJSFJUSU1FUl9NT0RFX1JFTCk7Ci0JCWdwaW9fZGF0LT50aW1lci5mdW5jdGlvbiA9IGdwaW9fdGltZXJfZnVuYzsKLQkJc3Bpbl9sb2NrX2luaXQoJmdwaW9fZGF0LT5sb2NrKTsKLQotCQlncGlvX2RhdC0+ZGV2Lm5hbWUgPSBjdXJfZ3Bpby0+bmFtZTsKLQkJZ3Bpb19kYXQtPmRldi5nZXRfdGltZSA9IGdwaW9fZ2V0X3RpbWU7Ci0JCWdwaW9fZGF0LT5kZXYuZW5hYmxlID0gZ3Bpb19lbmFibGU7Ci0JCXJldCA9IHRpbWVkX291dHB1dF9kZXZfcmVnaXN0ZXIoJmdwaW9fZGF0LT5kZXYpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKLQkJCQl0aW1lZF9vdXRwdXRfZGV2X3VucmVnaXN0ZXIoJmdwaW9fZGF0YVtpXS5kZXYpOwotCQkJa2ZyZWUoZ3Bpb19kYXRhKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQlncGlvX2RhdC0+Z3BpbyA9IGN1cl9ncGlvLT5ncGlvOwotCQlncGlvX2RhdC0+bWF4X3RpbWVvdXQgPSBjdXJfZ3Bpby0+bWF4X3RpbWVvdXQ7Ci0JCWdwaW9fZGF0LT5hY3RpdmVfbG93ID0gY3VyX2dwaW8tPmFjdGl2ZV9sb3c7Ci0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvX2RhdC0+Z3BpbywgZ3Bpb19kYXQtPmFjdGl2ZV9sb3cpOwotCX0KLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGdwaW9fZGF0YSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0aW1lZF9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCB0aW1lZF9ncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IHRpbWVkX2dwaW9fZGF0YSAqZ3Bpb19kYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9ncGlvczsgaSsrKQotCQl0aW1lZF9vdXRwdXRfZGV2X3VucmVnaXN0ZXIoJmdwaW9fZGF0YVtpXS5kZXYpOwotCi0Ja2ZyZWUoZ3Bpb19kYXRhKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0aW1lZF9ncGlvX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gdGltZWRfZ3Bpb19wcm9iZSwKLQkucmVtb3ZlCQk9IHRpbWVkX2dwaW9fcmVtb3ZlLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQkJPSBUSU1FRF9HUElPX05BTUUsCi0JCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgdGltZWRfZ3Bpb19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdGltZWRfZ3Bpb19kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdGltZWRfZ3Bpb19leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRpbWVkX2dwaW9fZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQodGltZWRfZ3Bpb19pbml0KTsKLW1vZHVsZV9leGl0KHRpbWVkX2dwaW9fZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIk1pa2UgTG9ja3dvb2QgPGxvY2t3b29kQGFuZHJvaWQuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJ0aW1lZCBncGlvIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfZ3Bpby5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfZ3Bpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGUxNWY4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX2dwaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIGluY2x1ZGUvbGludXgvdGltZWRfZ3Bpby5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotKi8KLQotI2lmbmRlZiBfTElOVVhfVElNRURfR1BJT19ICi0jZGVmaW5lIF9MSU5VWF9USU1FRF9HUElPX0gKLQotI2RlZmluZSBUSU1FRF9HUElPX05BTUUgInRpbWVkLWdwaW8iCi0KLXN0cnVjdCB0aW1lZF9ncGlvIHsKLQljb25zdCBjaGFyICpuYW1lOwotCXVuc2lnbmVkIAlncGlvOwotCWludAkJbWF4X3RpbWVvdXQ7Ci0JdTggCQlhY3RpdmVfbG93OwotfTsKLQotc3RydWN0IHRpbWVkX2dwaW9fcGxhdGZvcm1fZGF0YSB7Ci0JaW50IAkJbnVtX2dwaW9zOwotCXN0cnVjdCB0aW1lZF9ncGlvICpncGlvczsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfb3V0cHV0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9vdXRwdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlNzkxOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9vdXRwdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKiBkcml2ZXJzL21pc2MvdGltZWRfb3V0cHV0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlLCBJbmMuCi0gKiBBdXRob3I6IE1pa2UgTG9ja3dvb2QgPGxvY2t3b29kQGFuZHJvaWQuY29tPgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0KLSNpbmNsdWRlICJ0aW1lZF9vdXRwdXQuaCIKLQotc3RhdGljIHN0cnVjdCBjbGFzcyAqdGltZWRfb3V0cHV0X2NsYXNzOwotc3RhdGljIGF0b21pY190IGRldmljZV9jb3VudDsKLQotc3RhdGljIHNzaXplX3QgZW5hYmxlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCB0aW1lZF9vdXRwdXRfZGV2ICp0ZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHJlbWFpbmluZyA9IHRkZXYtPmdldF90aW1lKHRkZXYpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJlbWFpbmluZyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGVuYWJsZV9zdG9yZSgKLQkJc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKLXsKLQlzdHJ1Y3QgdGltZWRfb3V0cHV0X2RldiAqdGRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCB2YWx1ZTsKLQotCXNzY2FuZihidWYsICIlZCIsICZ2YWx1ZSk7Ci0JdGRldi0+ZW5hYmxlKHRkZXYsIHZhbHVlKTsKLQotCXJldHVybiBzaXplOwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIoZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwgZW5hYmxlX3Nob3csIGVuYWJsZV9zdG9yZSk7Ci0KLXN0YXRpYyBpbnQgY3JlYXRlX3RpbWVkX291dHB1dF9jbGFzcyh2b2lkKQotewotCWlmICghdGltZWRfb3V0cHV0X2NsYXNzKSB7Ci0JCXRpbWVkX291dHB1dF9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgInRpbWVkX291dHB1dCIpOwotCQlpZiAoSVNfRVJSKHRpbWVkX291dHB1dF9jbGFzcykpCi0JCQlyZXR1cm4gUFRSX0VSUih0aW1lZF9vdXRwdXRfY2xhc3MpOwotCQlhdG9taWNfc2V0KCZkZXZpY2VfY291bnQsIDApOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgdGltZWRfb3V0cHV0X2Rldl9yZWdpc3RlcihzdHJ1Y3QgdGltZWRfb3V0cHV0X2RldiAqdGRldikKLXsKLQlpbnQgcmV0OwotCi0JaWYgKCF0ZGV2IHx8ICF0ZGV2LT5uYW1lIHx8ICF0ZGV2LT5lbmFibGUgfHwgIXRkZXYtPmdldF90aW1lKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IGNyZWF0ZV90aW1lZF9vdXRwdXRfY2xhc3MoKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXRkZXYtPmluZGV4ID0gYXRvbWljX2luY19yZXR1cm4oJmRldmljZV9jb3VudCk7Ci0JdGRldi0+ZGV2ID0gZGV2aWNlX2NyZWF0ZSh0aW1lZF9vdXRwdXRfY2xhc3MsIE5VTEwsCi0JCU1LREVWKDAsIHRkZXYtPmluZGV4KSwgTlVMTCwgdGRldi0+bmFtZSk7Ci0JaWYgKElTX0VSUih0ZGV2LT5kZXYpKQotCQlyZXR1cm4gUFRSX0VSUih0ZGV2LT5kZXYpOwotCi0JcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKHRkZXYtPmRldiwgJmRldl9hdHRyX2VuYWJsZSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX2NyZWF0ZV9maWxlOwotCi0JZGV2X3NldF9kcnZkYXRhKHRkZXYtPmRldiwgdGRldik7Ci0JdGRldi0+c3RhdGUgPSAwOwotCXJldHVybiAwOwotCi1lcnJfY3JlYXRlX2ZpbGU6Ci0JZGV2aWNlX2Rlc3Ryb3kodGltZWRfb3V0cHV0X2NsYXNzLCBNS0RFVigwLCB0ZGV2LT5pbmRleCkpOwotCXByaW50ayhLRVJOX0VSUiAidGltZWRfb3V0cHV0OiBGYWlsZWQgdG8gcmVnaXN0ZXIgZHJpdmVyICVzXG4iLAotCQkJdGRldi0+bmFtZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwodGltZWRfb3V0cHV0X2Rldl9yZWdpc3Rlcik7Ci0KLXZvaWQgdGltZWRfb3V0cHV0X2Rldl91bnJlZ2lzdGVyKHN0cnVjdCB0aW1lZF9vdXRwdXRfZGV2ICp0ZGV2KQotewotCWRldmljZV9yZW1vdmVfZmlsZSh0ZGV2LT5kZXYsICZkZXZfYXR0cl9lbmFibGUpOwotCWRldmljZV9kZXN0cm95KHRpbWVkX291dHB1dF9jbGFzcywgTUtERVYoMCwgdGRldi0+aW5kZXgpKTsKLQlkZXZfc2V0X2RydmRhdGEodGRldi0+ZGV2LCBOVUxMKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHRpbWVkX291dHB1dF9kZXZfdW5yZWdpc3Rlcik7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHRpbWVkX291dHB1dF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGNyZWF0ZV90aW1lZF9vdXRwdXRfY2xhc3MoKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHRpbWVkX291dHB1dF9leGl0KHZvaWQpCi17Ci0JY2xhc3NfZGVzdHJveSh0aW1lZF9vdXRwdXRfY2xhc3MpOwotfQotCi1tb2R1bGVfaW5pdCh0aW1lZF9vdXRwdXRfaW5pdCk7Ci1tb2R1bGVfZXhpdCh0aW1lZF9vdXRwdXRfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIk1pa2UgTG9ja3dvb2QgPGxvY2t3b29kQGFuZHJvaWQuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJ0aW1lZCBvdXRwdXQgY2xhc3MgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9vdXRwdXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX291dHB1dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzkwN2FiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX291dHB1dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyogaW5jbHVkZS9saW51eC90aW1lZF9vdXRwdXQuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSovCi0KLSNpZm5kZWYgX0xJTlVYX1RJTUVEX09VVFBVVF9ICi0jZGVmaW5lIF9MSU5VWF9USU1FRF9PVVRQVVRfSAotCi1zdHJ1Y3QgdGltZWRfb3V0cHV0X2RldiB7Ci0JY29uc3QgY2hhcgkqbmFtZTsKLQotCS8qIGVuYWJsZSB0aGUgb3V0cHV0IGFuZCBzZXQgdGhlIHRpbWVyICovCi0Jdm9pZAkoKmVuYWJsZSkoc3RydWN0IHRpbWVkX291dHB1dF9kZXYgKnNkZXYsIGludCB0aW1lb3V0KTsKLQotCS8qIHJldHVybnMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyByZW1haW5pbmcgb24gdGhlIHRpbWVyICovCi0JaW50CQkoKmdldF90aW1lKShzdHJ1Y3QgdGltZWRfb3V0cHV0X2RldiAqc2Rldik7Ci0KLQkvKiBwcml2YXRlIGRhdGEgKi8KLQlzdHJ1Y3QgZGV2aWNlCSpkZXY7Ci0JaW50CQlpbmRleDsKLQlpbnQJCXN0YXRlOwotfTsKLQotZXh0ZXJuIGludCB0aW1lZF9vdXRwdXRfZGV2X3JlZ2lzdGVyKHN0cnVjdCB0aW1lZF9vdXRwdXRfZGV2ICpkZXYpOwotZXh0ZXJuIHZvaWQgdGltZWRfb3V0cHV0X2Rldl91bnJlZ2lzdGVyKHN0cnVjdCB0aW1lZF9vdXRwdXRfZGV2ICpkZXYpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iM2RmZy9iM2RmZy5jIGIvZHJpdmVycy9zdGFnaW5nL2IzZGZnL2IzZGZnLmMKaW5kZXggY2RhMjZiYjQuLjRhNDNjNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iM2RmZy9iM2RmZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iM2RmZy9iM2RmZy5jCkBAIC00NjgsNyArNDY4LDYgQEAKIAogc3RhdGljIGludCBlbmFibGVfdHJhbnNtaXNzaW9uKHN0cnVjdCBiM2RmZ19kZXYgKmZnZGV2KQogewotCXUxNiBjb21tYW5kOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmZnZGV2LT5wZGV2LT5kZXY7CiAKQEAgLTQ4MCwxNyArNDc5LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JLyoKLQkgKiBDaGVjayB3ZSdyZSBhIGJ1cyBtYXN0ZXIuCi0JICogVE9ETzogSSB0aGluayB3ZSBjYW4gcmVtb3ZlIHRoaXMgaGF2aW5nIGFkZGVkIHRoZSBwY2lfc2V0X21hc3RlciBjYWxsCi0JICovCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoZmdkZXYtPnBkZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCk7Ci0JaWYgKCEoY29tbWFuZCAmIFBDSV9DT01NQU5EX01BU1RFUikpIHsKLQkJZGV2X2VycihkZXYsICJub3QgYSBidXMgbWFzdGVyLCBmb3JjZS1lbmFibGluZ1xuIik7Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChmZ2Rldi0+cGRldiwgUENJX0NPTU1BTkQsCi0JCQljb21tYW5kIHwgUENJX0NPTU1BTkRfTUFTVEVSKTsKLQl9Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZmdkZXYtPmJ1ZmZlcl9sb2NrLCBmbGFncyk7CiAKIAkvKiBIYW5kbGUgcmFjaW5nIGVuYWJsZV90cmFuc21pc3Npb24gY2FsbHMuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9DSEFOR0VMT0cgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9DSEFOR0VMT0cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExODE2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L0NIQU5HRUxPRwpAQCAtMCwwICsxLDM3IEBACitiYXRtYW4tYWR2IDAuMjoKKworKiBzdXBwb3J0IGxhdGVzdCBrZXJuZWxzICgyLjYuMjAgLSAyLjYuMzEpCisqIHRlbXBvcmFyeSByb3V0aW5nIGxvb3BzIC8gVFRMIGNvZGUgYnVnIC8gZ2hvc3QgZW50cmllcyBpbiBvcmlnaW5hdG9yIHRhYmxlIGZpeGVkCisqIGludGVybmFsIHBhY2tldCBxdWV1ZSBmb3IgcGFja2V0IGFnZ3JlZ2F0aW9uICYgdHJhbnNtaXNzaW9uIHJldHJ5IChBUlEpCisgIGZvciBwYXlsb2FkIGJyb2FkY2FzdHMgYWRkZWQKKyogaW50ZXJmYWNlIGRldGVjdGlvbiBjb252ZXJ0ZWQgdG8gZXZlbnQgYmFzZWQgaGFuZGxpbmcgdG8gYXZvaWQgdGltZXJzCisqIG1ham9yIGxpbnV4IGNvZGluZyBzdHlsZSBhZGp1c3RtZW50cyBhcHBsaWVkCisqIGFsbCBrZXJuZWwgdmVyc2lvbiBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucyBoYXMgYmVlbiBtb3ZlZCB0byBjb21wYXQuaAorKiB1c2UgcmFuZG9tIGV0aGVybmV0IGFkZHJlc3MgZ2VuZXJhdG9yIGZyb20gdGhlIGtlcm5lbAorKiAvc3lzL21vZHVsZS9iYXRtYW5fYWR2L3ZlcnNpb24gdG8gZXhwb3J0IGtlcm5lbCBtb2R1bGUgdmVyc2lvbgorKiB2aXM6IHNlY29uZGFyeSBpbnRlcmZhY2UgZXhwb3J0IGZvciBkb3QgZHJhdyBmb3JtYXQgKyBKU09OIG91dHB1dCBmb3JtYXQgYWRkZWQKKyogbWFueSBidWdzIChhbGlnbm1lbnQgaXNzdWVzLCByYWNlIGNvbmRpdGlvbnMsIGRlYWRsb2NrcywgZXRjKSBzcXVhc2hlZAorCisgLS0gU2F0LCAwNyBOb3YgMjAwOSAxNTo0NDozMSArMDEwMAorCitiYXRtYW4tYWR2IDAuMToKKworKiBzdXBwb3J0IGxhdGVzdCBrZXJuZWxzICgyLjYuMjAgLSAyLjYuMjgpCisqIExPVFMgb2YgY2xlYW51cDogbG9ja2luZywgc3RhY2sgdXNhZ2UsIG1lbW9yeSBsZWFrcworKiBDaGFuZ2UgRXRoZXJ0eXBlIGZyb20gMHgwODQyIHRvIDB4NDMwNQorICB1bnJlZ2lzdGVyZWQgYXQgSUVFRSwgaWYgeW91IHdhbnQgdG8gc3BvbnNvciBhbiBvZmZpY2lhbCBFdGhlcnR5cGUgKCQyNTAwKQorICBwbGVhc2UgY29udGFjdCB1cworCisgLS0gU3VuLCAyOCBEZWMgMjAwOCAwMDo0NDozMSArMDEwMAorCitiYXRtYW4tYWR2IDAuMS1iZXRhOgorCisqIGxheWVyIDIgbWVzaGluZyBiYXNlZCBvbiBCQVRNQU4gVFEgYWxnb3JpdGhtIGluIGtlcm5lbGxhbmQKKyogb3BlcmF0ZXMgb24gYW55IGV0aGVybmV0IGxpa2UgaW50ZXJmYWNlCisqIHN1cHBvcnRzIElQdjQsIElQdjYsIERIQ1AsIGV0YworKiBpcyBjb250cm9sbGVkIHZpYSAvcHJvYy9uZXQvYmF0bWFuLWFkdi8KKyogYnJpZGdpbmcgdmlhIGJyY3RsIGlzIHN1cHBvcnRlZAorKiBpbnRlcmZhY2Ugd2F0Y2hkb2cgKGludGVyZmFjZXMgY2FuIGJlIChkZSlhY3RpdmF0ZWQgZHluYW1pY2FsbHkpCisqIG9mZmVycyBpbnRlZ3JhdGVkIHZpcyBzZXJ2ZXIgd2hpY2ggbWVzaGVzL3N5bmNzIHdpdGggb3RoZXIgdmlzIHNlcnZlcnMgaW4gcmFuZ2UKKworIC0tIE1vbiwgMDUgTWF5IDIwMDggMTQ6MTA6MDQgKzAyMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MzJmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9LY29uZmlnCkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgQi5BLlQuTS5BLk4gbWVzaGluZyBwcm90b2NvbAorIworCitjb25maWcgQkFUTUFOX0FEVgorCXRyaXN0YXRlICJCLkEuVC5NLkEuTi4gQWR2YW5jZWQgTWVzaGluZyBQcm90b2NvbCIKKyAgICAgICAgZGVmYXVsdCBuCisJLS0taGVscC0tLQorCisgICAgICAgIEIuQS5ULk0uQS5OLiAoYmV0dGVyIGFwcHJvYWNoIHRvIG1vYmlsZSBhZC1ob2MgbmV0d29ya2luZykgaXMKKyAgICAgICAgYSByb3V0aW5nIHByb3RvY29sIGZvciBtdWx0aS1ob3AgYWQtaG9jIG1lc2ggbmV0d29ya3MuIFRoZQorICAgICAgICBuZXR3b3JrcyBtYXkgYmUgd2lyZWQgb3Igd2lyZWxlc3MuIFNlZQorICAgICAgICBodHRwOi8vd3d3Lm9wZW4tbWVzaC5vcmcvIGZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCB1c2VyIHNwYWNlCisgICAgICAgIHRvb2xzLgorCitjb25maWcgQkFUTUFOX0RFQlVHCisJYm9vbCAiQi5BLlQuTS5BLk4uIGRlYnVnZ2luZyIKKwlkZXBlbmRzIG9uIEJBVE1BTl9BRFYgIT0gbgorCWhlbHAKKworCSAgVGhpcyBpcyBhbiBvcHRpb24gZm9yIHVzZSBieSBkZXZlbG9wZXJzOyBtb3N0IHBlb3BsZSBzaG91bGQKKwkgIHNheSBOIGhlcmUuIFRoaXMgZW5hYmxlcyBjb21waWxhdGlvbiBvZiBzdXBwb3J0IGZvcgorCSAgb3V0cHV0dGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gdGhlIGtlcm5lbCBsb2cuIFRoZQorCSAgb3V0cHV0IGlzIGNvbnRyb2xsZWQgdmlhIHRoZSBtb2R1bGUgcGFyYW1ldGVyIGRlYnVnLgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZGE4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9NYWtlZmlsZQpAQCAtMCwwICsxLDIyIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisjCisjIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorIyAwMjExMC0xMzAxLCBVU0EKKyMKKworb2JqLW0gKz0gYmF0bWFuLWFkdi5vCitiYXRtYW4tYWR2LW9ianMgOj0gbWFpbi5vIHByb2MubyBzZW5kLm8gcm91dGluZy5vIHNvZnQtaW50ZXJmYWNlLm8gZGV2aWNlLm8gdHJhbnNsYXRpb24tdGFibGUubyBiaXRhcnJheS5vIGhhc2gubyByaW5nX2J1ZmZlci5vIHZpcy5vIGhhcmQtaW50ZXJmYWNlLm8gYWdncmVnYXRpb24ubyBsb2cubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYWYzOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9SRUFETUUKQEAgLTAsMCArMSwxMjUgQEAKK1tzdGF0ZTogMDctMTEtMjAwOV0KKworQkFUTUFOLUFEVgorLS0tLS0tLS0tLQorCitCYXRtYW4tYWR2YW5jZWQgaXMgYSBuZXcgYXBwcm9hY2ggdG8gd2lyZWxlc3MgbmV0d29ya2luZyB3aGljaCBkb2VzIG5vIGxvbmdlcgorb3BlcmF0ZSBvbiB0aGUgSVAgYmFzaXMuIFVubGlrZSBCLkEuVC5NLkEuTiwgd2hpY2ggZXhjaGFuZ2VzIGluZm9ybWF0aW9uCit1c2luZyBVRFAgcGFja2V0cyBhbmQgc2V0cyByb3V0aW5nIHRhYmxlcywgYmF0bWFuLWFkdmFuY2VkIG9wZXJhdGVzIG9uIElTTy9PU0kKK0xheWVyIDIgb25seSBhbmQgdXNlcyBhbmQgcm91dGVzIChvciBiZXR0ZXI6IGJyaWRnZXMpIEV0aGVybmV0IEZyYW1lcy4gSXQKK2VtdWxhdGVzIGEgdmlydHVhbCBuZXR3b3JrIHN3aXRjaCBvZiBhbGwgbm9kZXMgcGFydGljaXBhdGluZy4gVGhlcmVmb3JlIGFsbAorbm9kZXMgYXBwZWFyIHRvIGJlIGxpbmsgbG9jYWwsIHRodXMgYWxsIGhpZ2hlciBvcGVyYXRpbmcgcHJvdG9jb2xzIHdvbid0IGJlCithZmZlY3RlZCBieSBhbnkgY2hhbmdlcyB3aXRoaW4gdGhlIG5ldHdvcmsuIFlvdSBjYW4gcnVuIGFsbW9zdCBhbnkgcHJvdG9jb2wKK2Fib3ZlIEIuQS5ULk0uQS5OLiBBZHZhbmNlZCwgcHJvbWluZW50IGV4YW1wbGVzIGFyZTogSVB2NCwgSVB2NiwgREhDUCwgSVBYLgorCitUaGlzIGlzIGJhdG1hbi1hZHZhbmNlZCBpbXBsZW1lbnRlZCBhcyBMaW51eCBrZXJuZWwgZHJpdmVyLiBJdCBkb2VzIG5vdCBkZXBlbmQKK29uIGFueSBuZXR3b3JrIChvdGhlcikgZHJpdmVyLCBhbmQgY2FuIGJlIHVzZWQgb24gd2lmaSBhcyB3ZWxsIGFzIGV0aGVybmV0LAordnBuLCBldGMgLi4uIChhbnl0aGluZyB3aXRoIGV0aGVybmV0LXN0eWxlIGxheWVyIDIpLgorSXQgY29tcGlsZXMgYWdhaW5zdCBhbmQgc2hvdWxkIHdvcmsgd2l0aCBMaW51eCAyLjYuMjAgLSAyLjYuMzEuIFN1cHBvcnRpbmcgb2xkZXIKK3ZlcnNpb25zIGlzIG5vdCBwbGFubmVkLCBidXQgaXQncyBwcm9iYWJseSBlYXN5IHRvIGJhY2twb3J0IGl0LiBJZiB5b3Ugd29yayBvbiBhCitiYWNrcG9ydCwgZmVlbCBmcmVlIHRvIGNvbnRhY3QgdXMuICA6LSkKKworQ09NUElMRQorLS0tLS0tLQorVG8gY29tcGlsZSBhZ2FpbnN0IHlvdXIgY3VycmVudGx5IGluc3RhbGxlZCBrZXJuZWwsIGp1c3QgdHlwZToKKworIyBtYWtlCisKK2lmIHlvdSB3YW50IHRvIGNvbXBpbGUgYWdhaW5zdCBzb21lIG90aGVyIGtlcm5lbCwgdXNlOgorCisjIG1ha2UgS0VSTkVMUEFUSD0vcGF0aC90by9rZXJuZWwKKworVVNBR0UKKy0tLS0tCisKK2luc21vZCB0aGUgYmF0bWFuLWFkdi5rbyBpbiB5b3VyIGtlcm5lbDoKKworIyBpbnNtb2QgYmF0bWFuLWFkdi5rbworCit0aGUgbW9kdWxlIGlzIG5vdyB3YWl0aW5nIGZvciBhY3RpdmF0aW9uLiBZb3UgbXVzdCBhZGQgc29tZSBpbnRlcmZhY2VzCitvbiB3aGljaCBiYXRtYW4gY2FuIG9wZXJhdGUuIEVhY2ggaW50ZXJmYWNlIG11c3QgYmUgYWRkZWQgc2VwYXJhdGVseToKKworIyBlY2hvIHdsYW4wID4gL3Byb2MvbmV0L2JhdG1hbi1hZHYvaW50ZXJmYWNlcworCisoICMgZWNobyB3bGFuMSA+IC9wcm9jL25ldC9iYXRtYW4tYWR2L2ludGVyZmFjZXMgKQorKCAjIGVjaG8gZXRoMCA+IC9wcm9jL25ldC9iYXRtYW4tYWR2L2ludGVyZmFjZXMgKQorKCAuLi4gKQorCitOb3cgYmF0bWFuIHN0YXJ0cyBicm9hZGNhc3Rpbmcgb24gdGhpcyBpbnRlcmZhY2UuCitZb3UgY2FuIG5vdyB2aWV3IHRoZSB0YWJsZSBvZiBvcmlnaW5hdG9ycyAobWVzaCBwYXJ0aWNpcGFudHMpIHdpdGg6CisKKyMgY2F0IC9wcm9jL25ldC9iYXRtYW4tYWR2L29yaWdpbmF0b3JzCisKK1RoZSBtb2R1bGUgd2lsbCBjcmVhdGUgYSBuZXcgaW50ZXJmYWNlICJiYXQwIiwgd2hpY2ggY2FuIGJlIHVzZWQgYXMgYQorcmVndWxhciBpbnRlcmZhY2U6CisKKyMgaWZjb25maWcgYmF0MCBpbmV0IDE5Mi4xNjguMC4xIHVwCisjIHBpbmcgMTkyLjE2OC4wLjIKKy4uLgorCitJZiB5b3Ugd2FudCB0b3BvbG9neSB2aXN1YWxpemF0aW9uLCB5b3VyIG1lc2hub2RlIG11c3QgYmUgY29uZmlndXJlZAorYXMgVklTLXNlcnZlcjoKKworIyBlY2hvICJzZXJ2ZXIiID4gL3Byb2MvbmV0L2JhdG1hbi1hZHYvdmlzCisKK0VhY2ggbm9kZSBpcyBlaXRoZXIgY29uZmlndXJlZCBhcyAic2VydmVyIiBvciBhcyAiY2xpZW50IiAoZGVmYXVsdDoKKyJjbGllbnQiKS4gQ2xpZW50cyBzZW5kIHRoZWlyIHRvcG9sb2d5IGRhdGEgdG8gdGhlIHNlcnZlciBuZXh0IHRvIHRoZW0sCithbmQgc2VydmVyIHN5bmNocm9uaXplIHdpdGggb3RoZXIgc2VydmVycy4gSWYgdGhlcmUgaXMgbm8gc2VydmVyCitjb25maWd1cmVkIChkZWZhdWx0KSB3aXRoaW4gdGhlIG1lc2gsIG5vIHRvcG9sb2d5IGluZm9ybWF0aW9uIHdpbGwgYmUKK3RyYW5zbWl0dGVkLiBXaXRoIHRoZXNlICJzeW5jaHJvbml6aW5nIHNlcnZlcnMiLCB0aGVyZSBjYW4gYmUgMSBvcgorbW9yZSB2aXMgc2VydmVycyBzaGFyaW5nIHRoZSBzYW1lIChvciBhdCBsZWFzdCB2ZXJ5IHNpbWlsYXIpIGRhdGEuCisKK1doZW4gY29uZmlndXJlZCBhcyBzZXJ2ZXIsIHlvdSBjYW4gZ2V0IGEgdG9wb2xvZ3kgc25hcHNob3Qgb2YgeW91ciBtZXNoOgorCisjIGNhdCAvcHJvYy9uZXQvYmF0bWFuLWFkdi92aXMKKworVGhpcyBvdXRwdXQgZm9ybWF0IGlzIGEgZ3JhcGh2aXogZm9ybWF0dGVkIHRleHQgZmlsZSB3aGljaCBjYW4gYmUKK3Byb2Nlc3NlZCB3aXRoIGdyYXBodml6LXRvb2xzIGxpa2UgZG90LgorVGhlIGxhYmVscyBhcmUgc2ltaWxhci9jb21wYXRpYmxlIHRvIHRoZSBFVFggbWV0cmljLCAxLjAgbWVhbnMgcGVyZmVjdAorY29ubmVjdGlvbiAoMTAwJSksIDIuMCBtZWFucyA1MCUsIDMuMCBtZWFucyAzMyUgYW5kIHNvIG9uLgorCitBbHRlcm5hdGl2ZWx5LCBhIEpTT04gb3V0cHV0IGZvcm1hdCBpcyBhdmFpbGFibGUuIFRoZSBmb3JtYXQgY2FuIGJlIHNldAordXNpbmcgYnkgd3JpdGluZyBlaXRoZXIgImRvdF9kcmF3IiBvciAianNvbiIgaW50byB0aGUgdmlzX2Zvcm1hdCBmaWxlLgorImRvdF9kcmF3IiBpcyBzZWxlY3RlZCBieSBkZWZhdWx0LgorCitlY2hvICJqc29uIiA+IC9wcm9jL25ldC9iYXRtYW4tYWR2L3Zpc19mb3JtYXQKKworSW4gdmVyeSBtb2JpbGUgc2NlbmFyaW9zLCB5b3UgbWlnaHQgd2FudCB0byBhZGp1c3QgdGhlIG9yaWdpbmF0b3IKK2ludGVydmFsIHRvIGEgbG93ZXIgdmFsdWUuIFRoaXMgd2lsbCBtYWtlIHRoZSBtZXNoIG1vcmUgcmVzcG9uc2l2ZSB0bwordG9wb2xvZ3kgY2hhbmdlcywgYnV0IHdpbGwgYWxzbyBpbmNyZWFzZSB0aGUgb3ZlcmhlYWQuIFBsZWFzZSBtYWtlIHN1cmUKK3RoYXQgYWxsIG5vZGVzIGluIHlvdXIgbWVzaCB1c2UgdGhlIHNhbWUgaW50ZXJ2YWwuIFRoZSBkZWZhdWx0IHZhbHVlCitpcyAxMDAwIG1zICgxIHNlY29uZCkuCisKKyMgZWNobyAxMDAwID4gL3Byb2MvbmV0L2JhdG1hbi1hZHYvb3JpZ19pbnRlcnZhbAorCitUbyBkZWFjdGl2YXRlIGJhdG1hbiwgZG86CisKKyMgZWNobyAiIiA+IC9wcm9jL25ldC9iYXRtYW4tYWR2L2ludGVyZmFjZXMKKworQkFUQ1RMCistLS0tLS0KKworQi5BLlQuTS5BLk4uICBhZHZhbmNlZCAgb3BlcmF0ZXMgb24gbGF5ZXIgMiBhbmQgdGh1cyBhbGwgaG9zdHMgcGFydGljaS0KK3BhdGluZyBpbiB0aGUgdmlydHVhbCBzd2l0Y2ggYXJlIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgZm9yIGFsbCAgcHJvdG8tCitjb2xzIGFib3ZlIGxheWVyIDIuIFRoZXJlZm9yZSB0aGUgY29tbW9uIGRpYWdub3NpcyB0b29scyBkbyBub3Qgd29yayBhcworZXhwZWN0ZWQuIFRvIG92ZXJjb21lIHRoZXNlIHByb2JsZW1zIGJhdGN0bCB3YXMgY3JlYXRlZC4gQXQgdGhlICBtb21lbnQKK3RoZSAgYmF0Y3RsIGNvbnRhaW5zIHBpbmcsIHRyYWNlcm91dGUsIHRjcGR1bXAgYW5kIGludGVyZmFjZXMgdG8gdGhlCitrZXJuZWwgbW9kdWxlIHNldHRpbmdzLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSB0aGUgbWFucGFnZSAobWFuIGJhdGN0bCkuCisKK2JhdGN0bCBpcyBhdmFpbGFibGUgb24gaHR0cDovL3d3dy5vcGVuLW1lc2gubmV0LworCitDT05UQUNUCistLS0tLS0tCisKK1BsZWFzZSBzZW5kIHVzIGNvbW1lbnRzLCBleHBlcmllbmNlcywgcXVlc3Rpb25zLCBhbnl0aGluZyA6KQorCitJUkM6ICAgICAgICAgICAgICNiYXRtYW4gb24gaXJjLmZyZWVub2RlLm9yZworTWFpbGluZy1saXN0OiAgICBiLmEudC5tLmEubkBvcGVuLW1lc2gubmV0Cisoc3Vic2NyaXB0aW9uIGF0IGh0dHBzOi8vbGlzdC5vcGVuLW1lc2gubmV0L21tL2xpc3RpbmZvL2IuYS50Lm0uYS5uICkKKworWW91IGNhbiBhbHNvIGNvbnRhY3QgdGhlIEF1dGhvcnM6CisKK01hcmVrIExpbmRuZXIgPGxpbmRuZXJfbWFyZWtAeWFob28uZGU+CitTaW1vbiBXdW5kZXJsaWNoIDxzaXd1QGhyei50dS1jaGVtbml0ei5kZT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNmRjZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9UT0RPCkBAIC0wLDAgKzEsNTEgQEAKKz0+IHByb2MgaW50ZXJmYWNlCisqIGltcGxlbWVudCBuZXcgaW50ZXJmYWNlIHRvIGFkZC9kZWxldGUgaW50ZXJmYWNlcyBhbmQgc2V0dGluZyBvcHRpb25zCisqIC9wcm9jL3N5cy9uZXQvYmF0bWFuLWFkdi8gYXMgbWFpbiBmb2xkZXIKKyogaW4gaW50ZXJmYWNlcy8gbGlzdCBldmVyeSBhdmFpbGFibGUgaW50ZXJmYWNlIG9mIHRoZSBob3N0CisqIGVhY2ggaW50ZXJmYWNlcy8kaWZhY2UvIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZmlsZXM6CistPiBlbmFibGUgKGRlZjogMCkgW2FkZC9yZW1vdmUgdGhpcyBpbnRlcmZhY2UgdG8gYmF0bWFuLWFkdl0KKy0+IG9nbV9pbnRlcnZhbCAoZGVmOiAxMDAwKSBbb2dtIGludGVydmFsIG9mIHRoYXQgaW50ZXJmYWNlXQorLT4gY29udGV4dCAoZGVmOiBiYXQwKSBbbGF0ZXIgd2Ugd2FudCB0byBzdXBwb3J0IG11bHRpcGxlIG1lc2ggaW5zdGFuY2VzIHZpYQorLT4gYmF0MC9iYXQxL2JhdDIvLi5dCistPiBzdGF0dXMgKHJlYWQtb25seSkgW291dHB1dHMgdGhlIGludGVyZmFjZSBzdGF0dXMgZnJvbSBiYXRtYW4ncworLT4gcGVyc3BlY3RpdmVdCisqIGluIG1lc2gvYmF0WC8gbGlzdCBldmVyeSBhdmFpbGFibGUgbWVzaCBzdWJuZXQKKy0+IHZpc19zZXJ2ZXIgKGRlZjogMCkgW2VuYWJsZS9kaXNhYmxlIHZpcyBzZXJ2ZXIgZm9yIHRoYXQgbWVzaF0KKy0+IHZpc19kYXRhIChyZWFkLW9ubHkpIFtvdXRwdXRzIHRoZSB2aXMgZGF0YSBpbiBhIHJhdyBmb3JtYXRdCistPiBhZ2dyZWdhdGVfb2dtIChkZWY6IDEpIFtlbmFibGUvZGlzYWJsZSBvZ20gYWdncmVnYXRpb24gZm9yIHRoYXQgbWVzaF0KKy0+IG9yaWdpbmF0b3JzIChyZWFkLW9ubHkpIFtvdXRwdXRzIHRoZSBvcmlnaW5hdG9yIHRhYmxlXQorLT4gdHJhbnN0YWJsZV9nbG9iYWwgKHJlYWQtb25seSkgW291dHB1dHMgdGhlIGdsb2JhbCB0cmFuc2xhdGlvbiB0YWJsZV0KKy0+IHRyYW5zdGFibGVfbG9jYWwgKHJlYWQtb25seSkgW291dHB1dHMgdGhlIGxvY2FsIHRyYW5zbGF0aW9uIHRhYmxlXQorCis9PiB2aXMgInJhdyIgZGF0YSBvdXRwdXQKKyogdGhlIHJhdyBmb3JtYXQgc2hhbGwgcmVwbGFjZSBkb3QgZHJhdyAvIGpzb24gdG8gb2ZmZXIgYSBuZXV0cmFsIHRoYXQgY2FuCisqIGJlIGNvbnZlcnRlZAorKiB0aGUgZm9ybWF0IChjb21tYSBzZXBlcmF0ZWQgZW50cmllcyk6CistPiAibWFjIiAtPiBtYWMgYWRkcmVzcyBvZiBhbiBvcmlnaW5hdG9yIChlYWNoIGxpbmUgYmVnaW5zIHdpdGggaXQpCistPiAiVFEgbWFjIHZhbHVlIiAtPiBzcmMgbWFjJ3MgbGluayBxdWFsaXR5IHRvd2FyZHMgbWFjIGFkZHJlc3MKKy0+ICJITkEgbWFjIiAtPiBITkEgYW5ub3VuY2VkIGJ5IHNvdXJjZSBtYWMKKy0+ICJQUklNQVJZIiAtPiB0aGlzIGlzIGEgcHJpbWFyeSBpbnRlcmZhY2UKKy0+ICJTRUMgbWFjIiAtPiBzZWNvbmRhcnkgbWFjIGFkZHJlc3Mgb2Ygc291cmNlIChyZXF1aXJlcyBwcmVjZWVkaW5nCistPiBQUklNQVJZKQorCis9PiBsb2dnaW5nCisqIHRoZSBsb2cgbGV2ZWwgTE9HX1RZUEVfQ1JJVCwgTE9HX1RZUEVfV0FSTiAmIExPR19UWVBFX05PVElDRSB3aWxsIGJlCisqIHVuaWZpZWQgdG8gdXNlIHByaW50aworKiBMT0dfVFlQRV9CQVRNQU4gJiBMT0dfVFlQRV9ST1VURVMgd2lsbCBhbHNvIHVzZSBwcmludGsgYnV0IG9ubHkgYWZ0ZXIgdGhlCisqIGludGVybmFsIGRlYnVnIGxldmVsIGhhcyBiZWVuIHJhaXNlZAorKiB0aGUgaW50ZXJuYWwgZGVidWcgbGV2ZWwgY2FuIGJlIG1vZGlmaWVkIHVzaW5nIGEgbW9kdWxlIHBhcmFtZXRlciAoZGVidWcpCisqIG9yIGF0IHJ1biB0aW1lIHZpYSAvc3lzL21vZHVsZS9iYXRtYW4tYWR2L3BhcmFtZXRlcnMvZGVidWcKKyogbWFrZSB1c2Ugb2YgcHJpbnRrICVwTSBzdXBwb3J0IGluc3RlYWQgb2YgY29udmVydGluZyBtYWMgYWRkcmVzc2VzCisqIG1hbnVhbGx5CisKKz0+IHN0cmlwIG91dCBhbGwgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBzdXBwb3J0IHRvIG9sZGVyIGtlcm5lbHMKKyAgIChvbmx5IGZvdW5kIGluIGNvbXBhdC5oKQorCis9PiBmaXggY2hlY2twYXRjaC5wbCBlcnJvcnMKKworUGxlYXNlIHNlbmQgYWxsIHBhdGNoZXMgdG86CisJTWFyZWsgTGluZG5lciA8bGluZG5lcl9tYXJla0B5YWhvby5kZT4KKwlTaW1vbiBXdW5kZXJsaWNoIDxzaXd1QGhyei50dS1jaGVtbml0ei5kZT4KKwlBbmRyZXcgTHVubiA8YW5kcmV3QGx1bm4uY2g+CisJYi5hLnQubS5hLm5AbGlzdHMub3Blbi1tZXNoLm5ldAorCUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYWdncmVnYXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzZlNjgxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYWdncmVnYXRpb24uYwpAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAiYWdncmVnYXRpb24uaCIKKyNpbmNsdWRlICJzZW5kLmgiCisjaW5jbHVkZSAicm91dGluZy5oIgorCisvKiBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGhuYSBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBwYWNrZXQgKi8KK3N0YXRpYyBpbnQgaG5hX2xlbihzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCkKK3sKKwlyZXR1cm4gYmF0bWFuX3BhY2tldC0+bnVtX2huYSAqIEVUSF9BTEVOOworfQorCisvKiByZXR1cm4gdHJ1ZSBpZiBuZXdfcGFja2V0IGNhbiBiZSBhZ2dyZWdhdGVkIHdpdGggZm9yd19wYWNrZXQgKi8KK3N0YXRpYyBib29sIGNhbl9hZ2dyZWdhdGVfd2l0aChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqbmV3X2JhdG1hbl9wYWNrZXQsCisJCQkgICAgICAgaW50IHBhY2tldF9sZW4sCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBzZW5kX3RpbWUsCisJCQkgICAgICAgYm9vbCBkaXJlY3RsaW5rLAorCQkJICAgICAgIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nLAorCQkJICAgICAgIHN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXQpCit7CisJc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQgPQorCQkoc3RydWN0IGJhdG1hbl9wYWNrZXQgKilmb3J3X3BhY2tldC0+cGFja2V0X2J1ZmY7CisJaW50IGFnZ3JlZ2F0ZWRfYnl0ZXMgPSBmb3J3X3BhY2tldC0+cGFja2V0X2xlbiArIHBhY2tldF9sZW47CisKKwkvKioKKwkgKiB3ZSBjYW4gYWdncmVnYXRlIHRoZSBjdXJyZW50IHBhY2tldCB0byB0aGlzIGFnZ3JlZ2F0ZWQgcGFja2V0CisJICogaWY6CisJICoKKwkgKiAtIHRoZSBzZW5kIHRpbWUgaXMgd2l0aGluIG91ciBNQVhfQUdHUkVHQVRJT05fTVMgdGltZQorCSAqIC0gdGhlIHJlc3VsdGluZyBwYWNrZXQgd29udCBiZSBiaWdnZXIgdGhhbgorCSAqICAgTUFYX0FHR1JFR0FUSU9OX0JZVEVTCisJICovCisKKwlpZiAodGltZV9iZWZvcmUoc2VuZF90aW1lLCBmb3J3X3BhY2tldC0+c2VuZF90aW1lKSAmJgorCSAgICAoYWdncmVnYXRlZF9ieXRlcyA8PSBNQVhfQUdHUkVHQVRJT05fQllURVMpKSB7CisKKwkJLyoqCisJCSAqIGNoZWNrIGFnZ3JlZ2F0aW9uIGNvbXBhdGliaWxpdHkKKwkJICogLT4gZGlyZWN0IGxpbmsgcGFja2V0cyBhcmUgYnJvYWRjYXN0ZWQgb24KKwkJICogICAgdGhlaXIgaW50ZXJmYWNlIG9ubHkKKwkJICogLT4gYWdncmVnYXRlIHBhY2tldCBpZiB0aGUgY3VycmVudCBwYWNrZXQgaXMKKwkJICogICAgYSAiZ2xvYmFsIiBwYWNrZXQgYXMgd2VsbCBhcyB0aGUgYmFzZQorCQkgKiAgICBwYWNrZXQKKwkJICovCisKKwkJLyogcGFja2V0cyB3aXRob3V0IGRpcmVjdCBsaW5rIGZsYWcgYW5kIGhpZ2ggVFRMCisJCSAqIGFyZSBmbG9vZGVkIHRocm91Z2ggdGhlIG5ldCAgKi8KKwkJaWYgKCghZGlyZWN0bGluaykgJiYKKwkJICAgICghKGJhdG1hbl9wYWNrZXQtPmZsYWdzICYgRElSRUNUTElOSykpICYmCisJCSAgICAoYmF0bWFuX3BhY2tldC0+dHRsICE9IDEpICYmCisKKwkJICAgIC8qIG93biBwYWNrZXRzIG9yaWdpbmF0aW5nIG5vbi1wcmltYXJ5CisJCSAgICAgKiBpbnRlcmZhY2VzIGxlYXZlIG9ubHkgdGhhdCBpbnRlcmZhY2UgKi8KKwkJICAgICgoIWZvcndfcGFja2V0LT5vd24pIHx8CisJCSAgICAgKGZvcndfcGFja2V0LT5pZl9pbmNvbWluZy0+aWZfbnVtID09IDApKSkKKwkJCXJldHVybiB0cnVlOworCisJCS8qIGlmIHRoZSBpbmNvbWluZyBwYWNrZXQgaXMgc2VudCB2aWEgdGhpcyBvbmUKKwkJICogaW50ZXJmYWNlIG9ubHkgLSB3ZSBzdGlsbCBjYW4gYWdncmVnYXRlICovCisJCWlmICgoZGlyZWN0bGluaykgJiYKKwkJICAgIChuZXdfYmF0bWFuX3BhY2tldC0+dHRsID09IDEpICYmCisJCSAgICAoZm9yd19wYWNrZXQtPmlmX2luY29taW5nID09IGlmX2luY29taW5nKSkKKwkJCXJldHVybiB0cnVlOworCisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCisvKiBjcmVhdGUgYSBuZXcgYWdncmVnYXRlZCBwYWNrZXQgYW5kIGFkZCB0aGlzIHBhY2tldCB0byBpdCAqLworc3RhdGljIHZvaWQgbmV3X2FnZ3JlZ2F0ZWRfcGFja2V0KHVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmLAorCQkJICAgaW50IHBhY2tldF9sZW4sCisJCQkgICB1bnNpZ25lZCBsb25nIHNlbmRfdGltZSwKKwkJCSAgIGJvb2wgZGlyZWN0X2xpbmssCisJCQkgICBzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZywKKwkJCSAgIGludCBvd25fcGFja2V0KQoreworCXN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXRfYWdncjsKKworCWZvcndfcGFja2V0X2FnZ3IgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZm9yd19wYWNrZXQpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWZvcndfcGFja2V0X2FnZ3IpCisJCXJldHVybjsKKworCWZvcndfcGFja2V0X2FnZ3ItPnBhY2tldF9idWZmID0ga21hbGxvYyhNQVhfQUdHUkVHQVRJT05fQllURVMsCisJCQkJCQlHRlBfQVRPTUlDKTsKKwlpZiAoIWZvcndfcGFja2V0X2FnZ3ItPnBhY2tldF9idWZmKSB7CisJCWtmcmVlKGZvcndfcGFja2V0X2FnZ3IpOworCQlyZXR1cm47CisJfQorCisJSU5JVF9ITElTVF9OT0RFKCZmb3J3X3BhY2tldF9hZ2dyLT5saXN0KTsKKworCWZvcndfcGFja2V0X2FnZ3ItPnBhY2tldF9sZW4gPSBwYWNrZXRfbGVuOworCW1lbWNweShmb3J3X3BhY2tldF9hZ2dyLT5wYWNrZXRfYnVmZiwKKwkgICAgICAgcGFja2V0X2J1ZmYsCisJICAgICAgIGZvcndfcGFja2V0X2FnZ3ItPnBhY2tldF9sZW4pOworCisJZm9yd19wYWNrZXRfYWdnci0+b3duID0gb3duX3BhY2tldDsKKwlmb3J3X3BhY2tldF9hZ2dyLT5pZl9pbmNvbWluZyA9IGlmX2luY29taW5nOworCWZvcndfcGFja2V0X2FnZ3ItPm51bV9wYWNrZXRzID0gMDsKKwlmb3J3X3BhY2tldF9hZ2dyLT5kaXJlY3RfbGlua19mbGFncyA9IDA7CisJZm9yd19wYWNrZXRfYWdnci0+c2VuZF90aW1lID0gc2VuZF90aW1lOworCisJLyogc2F2ZSBwYWNrZXQgZGlyZWN0IGxpbmsgZmxhZyBzdGF0dXMgKi8KKwlpZiAoZGlyZWN0X2xpbmspCisJCWZvcndfcGFja2V0X2FnZ3ItPmRpcmVjdF9saW5rX2ZsYWdzIHw9IDE7CisKKwkvKiBhZGQgbmV3IHBhY2tldCB0byBwYWNrZXQgbGlzdCAqLworCXNwaW5fbG9jaygmZm9yd19iYXRfbGlzdF9sb2NrKTsKKwlobGlzdF9hZGRfaGVhZCgmZm9yd19wYWNrZXRfYWdnci0+bGlzdCwgJmZvcndfYmF0X2xpc3QpOworCXNwaW5fdW5sb2NrKCZmb3J3X2JhdF9saXN0X2xvY2spOworCisJLyogc3RhcnQgdGltZXIgZm9yIHRoaXMgcGFja2V0ICovCisJSU5JVF9ERUxBWUVEX1dPUksoJmZvcndfcGFja2V0X2FnZ3ItPmRlbGF5ZWRfd29yaywKKwkJCSAgc2VuZF9vdXRzdGFuZGluZ19iYXRfcGFja2V0KTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoYmF0X2V2ZW50X3dvcmtxdWV1ZSwKKwkJCSAgICZmb3J3X3BhY2tldF9hZ2dyLT5kZWxheWVkX3dvcmssCisJCQkgICBzZW5kX3RpbWUgLSBqaWZmaWVzKTsKK30KKworLyogYWdncmVnYXRlIGEgbmV3IHBhY2tldCBpbnRvIHRoZSBleGlzdGluZyBhZ2dyZWdhdGlvbiAqLworc3RhdGljIHZvaWQgYWdncmVnYXRlKHN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXRfYWdnciwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsCisJCSAgICAgIGludCBwYWNrZXRfbGVuLAorCQkgICAgICBib29sIGRpcmVjdF9saW5rKQoreworCW1lbWNweSgoZm9yd19wYWNrZXRfYWdnci0+cGFja2V0X2J1ZmYgKyBmb3J3X3BhY2tldF9hZ2dyLT5wYWNrZXRfbGVuKSwKKwkgICAgICAgcGFja2V0X2J1ZmYsIHBhY2tldF9sZW4pOworCWZvcndfcGFja2V0X2FnZ3ItPnBhY2tldF9sZW4gKz0gcGFja2V0X2xlbjsKKwlmb3J3X3BhY2tldF9hZ2dyLT5udW1fcGFja2V0cysrOworCisJLyogc2F2ZSBwYWNrZXQgZGlyZWN0IGxpbmsgZmxhZyBzdGF0dXMgKi8KKwlpZiAoZGlyZWN0X2xpbmspCisJCWZvcndfcGFja2V0X2FnZ3ItPmRpcmVjdF9saW5rX2ZsYWdzIHw9CisJCQkoMSA8PCBmb3J3X3BhY2tldF9hZ2dyLT5udW1fcGFja2V0cyk7Cit9CisKK3ZvaWQgYWRkX2JhdF9wYWNrZXRfdG9fbGlzdCh1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZiwgaW50IHBhY2tldF9sZW4sCisJCQkgICAgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcsIGNoYXIgb3duX3BhY2tldCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIHNlbmRfdGltZSkKK3sKKwkvKioKKwkgKiBfYWdnciAtPiBwb2ludGVyIHRvIHRoZSBwYWNrZXQgd2Ugd2FudCB0byBhZ2dyZWdhdGUgd2l0aAorCSAqIF9wb3MgLT4gcG9pbnRlciB0byB0aGUgcG9zaXRpb24gaW4gdGhlIHF1ZXVlCisJICovCisJc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldF9hZ2dyID0gTlVMTCwgKmZvcndfcGFja2V0X3BvcyA9IE5VTEw7CisJc3RydWN0IGhsaXN0X25vZGUgKnRtcF9ub2RlOworCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0ID0KKwkJKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopcGFja2V0X2J1ZmY7CisJYm9vbCBkaXJlY3RfbGluayA9IGJhdG1hbl9wYWNrZXQtPmZsYWdzICYgRElSRUNUTElOSyA/IDEgOiAwOworCisJLyogZmluZCBwb3NpdGlvbiBmb3IgdGhlIHBhY2tldCBpbiB0aGUgZm9yd2FyZCBxdWV1ZSAqLworCXNwaW5fbG9jaygmZm9yd19iYXRfbGlzdF9sb2NrKTsKKwkvKiBvd24gcGFja2V0cyBhcmUgbm90IHRvIGJlIGFnZ3JlZ2F0ZWQgKi8KKwlpZiAoKGF0b21pY19yZWFkKCZhZ2dyZWdhdGlvbl9lbmFibGVkKSkgJiYgKCFvd25fcGFja2V0KSkgeworCQlobGlzdF9mb3JfZWFjaF9lbnRyeShmb3J3X3BhY2tldF9wb3MsIHRtcF9ub2RlLCAmZm9yd19iYXRfbGlzdCwKKwkJCQkgICAgIGxpc3QpIHsKKwkJCWlmIChjYW5fYWdncmVnYXRlX3dpdGgoYmF0bWFuX3BhY2tldCwKKwkJCQkJICAgICAgIHBhY2tldF9sZW4sCisJCQkJCSAgICAgICBzZW5kX3RpbWUsCisJCQkJCSAgICAgICBkaXJlY3RfbGluaywKKwkJCQkJICAgICAgIGlmX2luY29taW5nLAorCQkJCQkgICAgICAgZm9yd19wYWNrZXRfcG9zKSkgeworCQkJCWZvcndfcGFja2V0X2FnZ3IgPSBmb3J3X3BhY2tldF9wb3M7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBub3RoaW5nIHRvIGFnZ3JlZ2F0ZSB3aXRoIC0gZWl0aGVyIGFnZ3JlZ2F0aW9uIGRpc2FibGVkIG9yIG5vCisJICogc3VpdGFibGUgYWdncmVnYXRpb24gcGFja2V0IGZvdW5kICovCisJaWYgKGZvcndfcGFja2V0X2FnZ3IgPT0gTlVMTCkgeworCQkvKiB0aGUgZm9sbG93aW5nIHNlY3Rpb24gY2FuIHJ1biB3aXRob3V0IHRoZSBsb2NrICovCisJCXNwaW5fdW5sb2NrKCZmb3J3X2JhdF9saXN0X2xvY2spOworCQluZXdfYWdncmVnYXRlZF9wYWNrZXQocGFja2V0X2J1ZmYsIHBhY2tldF9sZW4sCisJCQkJICAgICAgc2VuZF90aW1lLCBkaXJlY3RfbGluaywKKwkJCQkgICAgICBpZl9pbmNvbWluZywgb3duX3BhY2tldCk7CisJfSBlbHNlIHsKKwkJYWdncmVnYXRlKGZvcndfcGFja2V0X2FnZ3IsCisJCQkgIHBhY2tldF9idWZmLCBwYWNrZXRfbGVuLAorCQkJICBkaXJlY3RfbGluayk7CisJCXNwaW5fdW5sb2NrKCZmb3J3X2JhdF9saXN0X2xvY2spOworCX0KK30KKworLyogdW5wYWNrIHRoZSBhZ2dyZWdhdGVkIHBhY2tldHMgYW5kIHByb2Nlc3MgdGhlbSBvbmUgYnkgb25lICovCit2b2lkIHJlY2VpdmVfYWdncl9iYXRfcGFja2V0KHN0cnVjdCBldGhoZHIgKmV0aGhkciwgdW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsCisJCQkgICAgIGludCBwYWNrZXRfbGVuLCBzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZykKK3sKKwlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldDsKKwlpbnQgYnVmZl9wb3MgPSAwOworCXVuc2lnbmVkIGNoYXIgKmhuYV9idWZmOworCisJYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKXBhY2tldF9idWZmOworCisJd2hpbGUgKGFnZ3JlZ2F0ZWRfcGFja2V0KGJ1ZmZfcG9zLCBwYWNrZXRfbGVuLAorCQkJCSBiYXRtYW5fcGFja2V0LT5udW1faG5hKSkgeworCisJCS8qIG5ldHdvcmsgdG8gaG9zdCBvcmRlciBmb3Igb3VyIDE2Yml0IHNlcW5vLCBhbmQgdGhlCisJCSAgIG9yaWdfaW50ZXJ2YWwuICovCisJCWJhdG1hbl9wYWNrZXQtPnNlcW5vID0gbnRvaHMoYmF0bWFuX3BhY2tldC0+c2Vxbm8pOworCisJCWhuYV9idWZmID0gcGFja2V0X2J1ZmYgKyBidWZmX3BvcyArIEJBVF9QQUNLRVRfTEVOOworCQlyZWNlaXZlX2JhdF9wYWNrZXQoZXRoaGRyLCBiYXRtYW5fcGFja2V0LAorCQkJCSAgIGhuYV9idWZmLCBobmFfbGVuKGJhdG1hbl9wYWNrZXQpLAorCQkJCSAgIGlmX2luY29taW5nKTsKKworCQlidWZmX3BvcyArPSBCQVRfUEFDS0VUX0xFTiArIGhuYV9sZW4oYmF0bWFuX3BhY2tldCk7CisJCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKikKKwkJCShwYWNrZXRfYnVmZiArIGJ1ZmZfcG9zKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYWdncmVnYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGE4ZGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYWdncmVnYXRpb24uaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgIm1haW4uaCIKKworLyogaXMgdGhlcmUgYW5vdGhlciBhZ2dyZWdhdGVkIHBhY2tldCBoZXJlPyAqLworc3RhdGljIGlubGluZSBpbnQgYWdncmVnYXRlZF9wYWNrZXQoaW50IGJ1ZmZfcG9zLCBpbnQgcGFja2V0X2xlbiwgaW50IG51bV9obmEpCit7CisJaW50IG5leHRfYnVmZl9wb3MgPSBidWZmX3BvcyArIEJBVF9QQUNLRVRfTEVOICsgKG51bV9obmEgKiBFVEhfQUxFTik7CisKKwlyZXR1cm4gKG5leHRfYnVmZl9wb3MgPD0gcGFja2V0X2xlbikgJiYKKwkJKG5leHRfYnVmZl9wb3MgPD0gTUFYX0FHR1JFR0FUSU9OX0JZVEVTKTsKK30KKwordm9pZCBhZGRfYmF0X3BhY2tldF90b19saXN0KHVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmLCBpbnQgcGFja2V0X2xlbiwKKwkJCSAgICBzdHJ1Y3QgYmF0bWFuX2lmICppZl9vdXRnb2luZywgY2hhciBvd25fcGFja2V0LAorCQkJICAgIHVuc2lnbmVkIGxvbmcgc2VuZF90aW1lKTsKK3ZvaWQgcmVjZWl2ZV9hZ2dyX2JhdF9wYWNrZXQoc3RydWN0IGV0aGhkciAqZXRoaGRyLCB1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZiwKKwkJCSAgICAgaW50IHBhY2tldF9sZW4sIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JpdGFycmF5LmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iaXRhcnJheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNjdmNWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iaXRhcnJheS5jCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBTaW1vbiBXdW5kZXJsaWNoLCBNYXJlayBMaW5kbmVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJiaXRhcnJheS5oIgorI2luY2x1ZGUgImxvZy5oIgorCisvKiByZXR1cm5zIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGluIHRoZSBnaXZlbiBzZXFfYml0cyBpbmRpY2F0ZXMgdHJ1ZQorICogYW5kIGN1cnJfc2Vxbm8gaXMgd2l0aGluIHJhbmdlIG9mIGxhc3Rfc2Vxbm8gKi8KK3VpbnQ4X3QgZ2V0X2JpdF9zdGF0dXMoVFlQRV9PRl9XT1JEICpzZXFfYml0cywgdWludDE2X3QgbGFzdF9zZXFubywKKwkJICAgICAgIHVpbnQxNl90IGN1cnJfc2Vxbm8pCit7CisJaW50MTZfdCBkaWZmLCB3b3JkX29mZnNldCwgd29yZF9udW07CisKKwlkaWZmID0gbGFzdF9zZXFubyAtIGN1cnJfc2Vxbm87CisJaWYgKGRpZmYgPCAwIHx8IGRpZmYgPj0gVFFfTE9DQUxfV0lORE9XX1NJWkUpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogd2hpY2ggd29yZCAqLworCQl3b3JkX251bSA9IChsYXN0X3NlcW5vIC0gY3Vycl9zZXFubykgLyBXT1JEX0JJVF9TSVpFOworCQkvKiB3aGljaCBwb3NpdGlvbiBpbiB0aGUgc2VsZWN0ZWQgd29yZCAqLworCQl3b3JkX29mZnNldCA9IChsYXN0X3NlcW5vIC0gY3Vycl9zZXFubykgJSBXT1JEX0JJVF9TSVpFOworCisJCWlmIChzZXFfYml0c1t3b3JkX251bV0gJiAxIDw8IHdvcmRfb2Zmc2V0KQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KK30KKworLyogdHVybiBjb3JyZXNwb25kaW5nIGJpdCBvbiwgc28gd2UgY2FuIHJlbWVtYmVyIHRoYXQgd2UgZ290IHRoZSBwYWNrZXQgKi8KK3ZvaWQgYml0X21hcmsoVFlQRV9PRl9XT1JEICpzZXFfYml0cywgaW50MzJfdCBuKQoreworCWludDMyX3Qgd29yZF9vZmZzZXQsIHdvcmRfbnVtOworCisJLyogaWYgdG9vIG9sZCwganVzdCBkcm9wIGl0ICovCisJaWYgKG4gPCAwIHx8IG4gPj0gVFFfTE9DQUxfV0lORE9XX1NJWkUpCisJCXJldHVybjsKKworCS8qIHdoaWNoIHdvcmQgKi8KKwl3b3JkX251bSA9IG4gLyBXT1JEX0JJVF9TSVpFOworCS8qIHdoaWNoIHBvc2l0aW9uIGluIHRoZSBzZWxlY3RlZCB3b3JkICovCisJd29yZF9vZmZzZXQgPSBuICUgV09SRF9CSVRfU0laRTsKKworCXNlcV9iaXRzW3dvcmRfbnVtXSB8PSAxIDw8IHdvcmRfb2Zmc2V0OwkvKiB0dXJuIHRoZSBwb3NpdGlvbiBvbiAqLworfQorCisvKiBzaGlmdCB0aGUgcGFja2V0IGFycmF5IGJ5IG4gcGxhY2VzLiAqLwordm9pZCBiaXRfc2hpZnQoVFlQRV9PRl9XT1JEICpzZXFfYml0cywgaW50MzJfdCBuKQoreworCWludDMyX3Qgd29yZF9vZmZzZXQsIHdvcmRfbnVtOworCWludDMyX3QgaTsKKworCWlmIChuIDw9IDApCisJCXJldHVybjsKKworCXdvcmRfb2Zmc2V0ID0gbiAlIFdPUkRfQklUX1NJWkU7Lyogc2hpZnQgaG93IG11Y2ggaW5zaWRlIGVhY2ggd29yZCAqLworCXdvcmRfbnVtID0gbiAvIFdPUkRfQklUX1NJWkU7CS8qIHNoaWZ0IG92ZXIgaG93IG11Y2ggKGZ1bGwpIHdvcmRzICovCisKKwlmb3IgKGkgPSBOVU1fV09SRFMgLSAxOyBpID4gd29yZF9udW07IGktLSkgeworCQkvKiBnb2luZyBmcm9tIG9sZCB0byBuZXcsIHNvIHdlIGRvbid0IG92ZXJ3cml0ZSB0aGUgZGF0YSB3ZSBjb3B5CisJCSAqIGZyb20uCisJCSAqCisJCSAqIGxlZnQgaXMgaGlnaCwgcmlnaHQgaXMgbG93OiBGRURDIEJBOTggNzY1NCAzMjEwCisJCSAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXiBeXgorCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnZ2dgorCQkgKiBeXl5eID0gZnJvbSwgdnZ2dnYgPXRvLCB3ZSdkIGhhdmUgd29yZF9udW09PTEgYW5kCisJCSAqIHdvcmRfb2Zmc2V0PT1XT1JEX0JJVF9TSVpFLzIgPz8/Pz8gaW4gdGhpcyBleGFtcGxlLgorCQkgKiAoPTI0IGJpdHMpCisJCSAqCisJCSAqIG91ciBkZXNpcmVkIG91dHB1dCB3b3VsZCBiZTogOTg3NiA1NDMyIDEwMDAgMDAwMAorCQkgKiAqLworCisJCXNlcV9iaXRzW2ldID0KKwkJCShzZXFfYml0c1tpIC0gd29yZF9udW1dIDw8IHdvcmRfb2Zmc2V0KSArCisJCQkvKiB0YWtlIHRoZSBsb3dlciBwb3J0IGZyb20gdGhlIGxlZnQgaGFsZiwgc2hpZnQgaXQgbGVmdAorCQkJICogdG8gaXRzIGZpbmFsIHBvc2l0aW9uICovCisJCQkoc2VxX2JpdHNbaSAtIHdvcmRfbnVtIC0gMV0gPj4KKwkJCSAoV09SRF9CSVRfU0laRS13b3JkX29mZnNldCkpOworCQkvKiBhbmQgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIHJpZ2h0IGhhbGYgYW5kIHNoaWZ0IGl0IGxlZnQgdG8KKwkJICogaXQncyBwb3NpdGlvbiAqLworCQkvKiBmb3Igb3VyIGV4YW1wbGUgdGhhdCB3b3VsZCBiZTogd29yZFswXSA9IDk4MDAgKyAwMDc2ID0KKwkJICogOTg3NiAqLworCX0KKwkvKiBub3cgZm9yIG91ciBsYXN0IHdvcmQsIGk9PXdvcmRfbnVtLCB3ZSBvbmx5IGhhdmUgdGhlIGl0J3MgImxlZnQiCisJICogaGFsZi4gdGhhdCdzIHRoZSAxMDAwIHdvcmQgaW4gb3VyIGV4YW1wbGUuKi8KKworCXNlcV9iaXRzW2ldID0gKHNlcV9iaXRzW2kgLSB3b3JkX251bV0gPDwgd29yZF9vZmZzZXQpOworCisJLyogcGFkIHRoZSByZXN0IHdpdGggMCwgaWYgdGhlcmUgaXMgYW55dGhpbmcgKi8KKwlpLS07CisKKwlmb3IgKDsgaSA+PSAwOyBpLS0pCisJCXNlcV9iaXRzW2ldID0gMDsKK30KKworCisvKiByZWNlaXZlIGFuZCBwcm9jZXNzIG9uZSBwYWNrZXQsIHJldHVybnMgMSBpZiByZWNlaXZlZCBzZXFfbnVtIGlzIGNvbnNpZGVyZWQKKyAqIG5ldywgMCBpZiBvbGQgICovCitjaGFyIGJpdF9nZXRfcGFja2V0KFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMsIGludDE2X3Qgc2VxX251bV9kaWZmLAorCQkgICAgaW50OF90IHNldF9tYXJrKQoreworCWludCBpOworCisJLyogd2UgYWxyZWFkeSBnb3QgYSBzZXF1ZW5jZSBudW1iZXIgaGlnaGVyIHRoYW4gdGhpcyBvbmUsIHNvIHdlIGp1c3QKKwkgKiBtYXJrIGl0LiB0aGlzIHNob3VsZCB3cmFwIGFyb3VuZCB0aGUgaW50ZWdlciBqdXN0IGZpbmUgKi8KKwlpZiAoKHNlcV9udW1fZGlmZiA8IDApICYmIChzZXFfbnVtX2RpZmYgPj0gLVRRX0xPQ0FMX1dJTkRPV19TSVpFKSkgeworCQlpZiAoc2V0X21hcmspCisJCQliaXRfbWFyayhzZXFfYml0cywgLXNlcV9udW1fZGlmZik7CisJCXJldHVybiAwOworCX0KKworCS8qIGl0IHNlZW1zIHdlIG1pc3NlZCBhIGxvdCBvZiBwYWNrZXRzIG9yIHRoZSBvdGhlciBob3N0IHJlc3RhcnRlZCAqLworCWlmICgoc2VxX251bV9kaWZmID4gVFFfTE9DQUxfV0lORE9XX1NJWkUpIHx8CisJICAgIChzZXFfbnVtX2RpZmYgPCAtVFFfTE9DQUxfV0lORE9XX1NJWkUpKSB7CisKKwkJaWYgKHNlcV9udW1fZGlmZiA+IFRRX0xPQ0FMX1dJTkRPV19TSVpFKQorCQkJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwKKwkJCQkgICJXZSBtaXNzZWQgYSBsb3Qgb2YgcGFja2V0cyAoJWkpICFcbiIsCisJCQkJICBzZXFfbnVtX2RpZmYtMSk7CisKKwkJaWYgKC1zZXFfbnVtX2RpZmYgPiBUUV9MT0NBTF9XSU5ET1dfU0laRSkKKwkJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sCisJCQkJICAiT3RoZXIgaG9zdCBwcm9iYWJseSByZXN0YXJ0ZWQgIVxuIik7CisKKwkJZm9yIChpID0gMDsgaSA8IE5VTV9XT1JEUzsgaSsrKQorCQkJc2VxX2JpdHNbaV0gPSAwOworCisJCWlmIChzZXRfbWFyaykKKwkJCXNlcV9iaXRzWzBdID0gMTsgIC8qIHdlIG9ubHkgaGF2ZSB0aGUgbGF0ZXN0IHBhY2tldCAqLworCX0gZWxzZSB7CisJCWJpdF9zaGlmdChzZXFfYml0cywgc2VxX251bV9kaWZmKTsKKworCQlpZiAoc2V0X21hcmspCisJCQliaXRfbWFyayhzZXFfYml0cywgMCk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIGNvdW50IHRoZSBoYW1taW5nIHdlaWdodCwgaG93IG1hbnkgZ29vZCBwYWNrZXRzIGRpZCB3ZSByZWNlaXZlPyBqdXN0IGNvdW50CisgKiB0aGUgMSdzLiBUaGUgaW5uZXIgbG9vcCB1c2VzIHRoZSBLZXJuaWdoYW4gYWxnb3JpdGhtLCBzZWUKKyAqIGh0dHA6Ly9ncmFwaGljcy5zdGFuZm9yZC5lZHUvfnNlYW5kZXIvYml0aGFja3MuaHRtbCNDb3VudEJpdHNTZXRLZXJuaWdoYW4KKyAqLworaW50IGJpdF9wYWNrZXRfY291bnQoVFlQRV9PRl9XT1JEICpzZXFfYml0cykKK3sKKwlpbnQgaSwgaGFtbWluZyA9IDA7CisJVFlQRV9PRl9XT1JEIHdvcmQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1dPUkRTOyBpKyspIHsKKwkJd29yZCA9IHNlcV9iaXRzW2ldOworCisJCXdoaWxlICh3b3JkKSB7CisJCQl3b3JkICY9IHdvcmQtMTsKKwkJCWhhbW1pbmcrKzsKKwkJfQorCX0KKwlyZXR1cm4gaGFtbWluZzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JpdGFycmF5LmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iaXRhcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNzJkZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iaXRhcnJheS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIFNpbW9uIFd1bmRlcmxpY2gsIE1hcmVrIExpbmRuZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisKKy8qIHlvdSBzaG91bGQgY2hvb3NlIHNvbWV0aGluZyBiaWcsIGlmIHlvdSBkb24ndCB3YW50IHRvIHdhc3RlIGNwdSAqLworI2RlZmluZSBUWVBFX09GX1dPUkQgdW5zaWduZWQgbG9uZworI2RlZmluZSBXT1JEX0JJVF9TSVpFIChzaXplb2YoVFlQRV9PRl9XT1JEKSAqIDgpCisKKy8qIHJldHVybnMgdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGdpdmVuIHNlcV9iaXRzIGluZGljYXRlcyB0cnVlCisgKiBhbmQgY3Vycl9zZXFubyBpcyB3aXRoaW4gcmFuZ2Ugb2YgbGFzdF9zZXFubyAqLwordWludDhfdCBnZXRfYml0X3N0YXR1cyhUWVBFX09GX1dPUkQgKnNlcV9iaXRzLCB1aW50MTZfdCBsYXN0X3NlcW5vLAorCQkJCQkgICB1aW50MTZfdCBjdXJyX3NlcW5vKTsKKworLyogdHVybiBjb3JyZXNwb25kaW5nIGJpdCBvbiwgc28gd2UgY2FuIHJlbWVtYmVyIHRoYXQgd2UgZ290IHRoZSBwYWNrZXQgKi8KK3ZvaWQgYml0X21hcmsoVFlQRV9PRl9XT1JEICpzZXFfYml0cywgaW50MzJfdCBuKTsKKworLyogc2hpZnQgdGhlIHBhY2tldCBhcnJheSBieSBuIHBsYWNlcy4gKi8KK3ZvaWQgYml0X3NoaWZ0KFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMsIGludDMyX3Qgbik7CisKKworLyogcmVjZWl2ZSBhbmQgcHJvY2VzcyBvbmUgcGFja2V0LCByZXR1cm5zIDEgaWYgcmVjZWl2ZWQgc2VxX251bSBpcyBjb25zaWRlcmVkCisgKiBuZXcsIDAgaWYgb2xkICAqLworY2hhciBiaXRfZ2V0X3BhY2tldChUWVBFX09GX1dPUkQgKnNlcV9iaXRzLCBpbnQxNl90IHNlcV9udW1fZGlmZiwKKwkJCQkJaW50OF90IHNldF9tYXJrKTsKKworLyogY291bnQgdGhlIGhhbW1pbmcgd2VpZ2h0LCBob3cgbWFueSBnb29kIHBhY2tldHMgZGlkIHdlIHJlY2VpdmU/ICovCitpbnQgIGJpdF9wYWNrZXRfY291bnQoVFlQRV9PRl9XT1JEICpzZXFfYml0cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9jb21wYXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2NvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZTBhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9jb21wYXQuaApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG1hY3JvcyBmb3IgbWFpbnRhaW5pbmcgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zCisgKiBvZiB0aGUgTGludXgga2VybmVsLgorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CS8qIExJTlVYX1ZFUlNJT05fQ09ERSAqLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjIpCisKKyNkZWZpbmUgc2tiX3NldF9uZXR3b3JrX2hlYWRlcihfc2tiLCBfb2Zmc2V0KSBcCisJZG8geyAoX3NrYiktPm5oLnJhdyA9IChfc2tiKS0+ZGF0YSArIChfb2Zmc2V0KTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBza2JfcmVzZXRfbWFjX2hlYWRlcihfc2tiKSBcCisJZG8geyAoX3NrYiktPm1hYy5yYXcgPSAoX3NrYiktPmRhdGE7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgbGlzdF9maXJzdF9lbnRyeShwdHIsIHR5cGUsIG1lbWJlcikgXAorCWxpc3RfZW50cnkoKHB0ciktPm5leHQsIHR5cGUsIG1lbWJlcikKKworI2VuZGlmIC8qIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDIyKSAqLworCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAyNikKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlKF9jbHMsIF9wYXJlbnQsIF9kZXZ0LCBfZGV2aWNlLCBfZm10KSBcCisJY2xhc3NfZGV2aWNlX2NyZWF0ZShfY2xzLCBfcGFyZW50LCBfZGV2dCwgX2RldmljZSwgX2ZtdCkKKworI2RlZmluZSBkZXZpY2VfZGVzdHJveShfY2xzLCBfZGV2aWNlKSBcCisJY2xhc3NfZGV2aWNlX2Rlc3Ryb3koX2NscywgX2RldmljZSkKKworI2Vsc2UKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDI3KQorCisjZGVmaW5lIGRldmljZV9jcmVhdGUoX2NscywgX3BhcmVudCwgX2RldnQsIF9kZXZpY2UsIF9mbXQpIFwKKwlkZXZpY2VfY3JlYXRlX2RydmRhdGEoX2NscywgX3BhcmVudCwgX2RldnQsIF9kZXZpY2UsIF9mbXQpCisKKyNlbmRpZiAvKiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAyNykgKi8KKworI2VuZGlmIC8qIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDI2KSAqLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjMpCisKKyNkZWZpbmUgY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKHdxKSBjYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKHdxKQorCisjZW5kaWYgLyogTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjMpICovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjUpCisjZGVmaW5lIHN0cmljdF9zdHJ0b3VsKGNwLCBiYXNlLCByZXMpIFwKKwkoeyBcCisJaW50IHJldCA9IDA7IFwKKwljaGFyICplbmRwOyBcCisJKnJlcyA9IHNpbXBsZV9zdHJ0b3VsKGNwLCAmZW5kcCwgYmFzZSk7IFwKKwlpZiAoY3AgPT0gZW5kcCkgXAorCQlyZXQgPSAtRUlOVkFMOyBcCisJcmV0OyBcCit9KQorI2VuZGlmIC8qIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDI1KSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvZGV2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTdkMWY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvZGV2aWNlLmMKQEAgLTAsMCArMSwzMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgImRldmljZS5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInNlbmQuaCIKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImhhc2guaCIKKworI2luY2x1ZGUgImNvbXBhdC5oIgorCitzdGF0aWMgc3RydWN0IGNsYXNzICpiYXRtYW5fY2xhc3M7CisKK3N0YXRpYyBpbnQgTWFqb3I7CS8qIE1ham9yIG51bWJlciBhc3NpZ25lZCB0byBvdXIgZGV2aWNlIGRyaXZlciAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzID0geworCS5vcGVuID0gYmF0X2RldmljZV9vcGVuLAorCS5yZWxlYXNlID0gYmF0X2RldmljZV9yZWxlYXNlLAorCS5yZWFkID0gYmF0X2RldmljZV9yZWFkLAorCS53cml0ZSA9IGJhdF9kZXZpY2Vfd3JpdGUsCisJLnBvbGwgPSBiYXRfZGV2aWNlX3BvbGwsCit9OworCitzdGF0aWMgc3RydWN0IGRldmljZV9jbGllbnQgKmRldmljZV9jbGllbnRfaGFzaFsyNTZdOworCit2b2lkIGJhdF9kZXZpY2VfaW5pdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlkZXZpY2VfY2xpZW50X2hhc2hbaV0gPSBOVUxMOworfQorCitpbnQgYmF0X2RldmljZV9zZXR1cCh2b2lkKQoreworCWludCB0bXBfbWFqb3I7CisKKwlpZiAoTWFqb3IpCisJCXJldHVybiAxOworCisJLyogcmVnaXN0ZXIgb3VyIGRldmljZSAtIGtlcm5lbCBhc3NpZ25zIGEgZnJlZSBtYWpvciBudW1iZXIgKi8KKwl0bXBfbWFqb3IgPSByZWdpc3Rlcl9jaHJkZXYoMCwgRFJJVkVSX0RFVklDRSwgJmZvcHMpOworCWlmICh0bXBfbWFqb3IgPCAwKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLCAiUmVnaXN0ZXJpbmcgdGhlIGNoYXJhY3RlciBkZXZpY2UgZmFpbGVkIHdpdGggJWRcbiIsCisJCQkgIHRtcF9tYWpvcik7CisJCXJldHVybiAwOworCX0KKworCWJhdG1hbl9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgImJhdG1hbi1hZHYiKTsKKworCWlmIChJU19FUlIoYmF0bWFuX2NsYXNzKSkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfV0FSTiwgIkNvdWxkIG5vdCByZWdpc3RlciBjbGFzcyAnYmF0bWFuLWFkdicgXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZGV2aWNlX2NyZWF0ZShiYXRtYW5fY2xhc3MsIE5VTEwsIE1LREVWKHRtcF9tYWpvciwgMCksIE5VTEwsCisJCSAgICAgICJiYXRtYW4tYWR2Iik7CisKKwlNYWpvciA9IHRtcF9tYWpvcjsKKwlyZXR1cm4gMTsKK30KKwordm9pZCBiYXRfZGV2aWNlX2Rlc3Ryb3kodm9pZCkKK3sKKwlpZiAoIU1ham9yKQorCQlyZXR1cm47CisKKwlkZXZpY2VfZGVzdHJveShiYXRtYW5fY2xhc3MsIE1LREVWKE1ham9yLCAwKSk7CisJY2xhc3NfZGVzdHJveShiYXRtYW5fY2xhc3MpOworCisJLyogVW5yZWdpc3RlciB0aGUgZGV2aWNlICovCisJdW5yZWdpc3Rlcl9jaHJkZXYoTWFqb3IsIERSSVZFUl9ERVZJQ0UpOworCisJTWFqb3IgPSAwOworfQorCitpbnQgYmF0X2RldmljZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBkZXZpY2VfY2xpZW50ICpkZXZpY2VfY2xpZW50OworCisJZGV2aWNlX2NsaWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZpY2VfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWRldmljZV9jbGllbnQpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWlmICghZGV2aWNlX2NsaWVudF9oYXNoW2ldKSB7CisJCQlkZXZpY2VfY2xpZW50X2hhc2hbaV0gPSBkZXZpY2VfY2xpZW50OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZGV2aWNlX2NsaWVudF9oYXNoW2ldICE9IGRldmljZV9jbGllbnQpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sICJFcnJvciAtIGNhbid0IGFkZCBhbm90aGVyIHBhY2tldCBjbGllbnQ6IG1heGltdW0gbnVtYmVyIG9mIGNsaWVudHMgcmVhY2hlZCBcbiIpOworCQlrZnJlZShkZXZpY2VfY2xpZW50KTsKKwkJcmV0dXJuIC1FWEZVTEw7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJmRldmljZV9jbGllbnQtPnF1ZXVlX2xpc3QpOworCWRldmljZV9jbGllbnQtPnF1ZXVlX2xlbiA9IDA7CisJZGV2aWNlX2NsaWVudC0+aW5kZXggPSBpOworCWRldmljZV9jbGllbnQtPmxvY2sgPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChkZXZpY2VfY2xpZW50LT5sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXZpY2VfY2xpZW50LT5xdWV1ZV93YWl0KTsKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRldmljZV9jbGllbnQ7CisKKwlpbmNfbW9kdWxlX2NvdW50KCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBiYXRfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGRldmljZV9jbGllbnQgKmRldmljZV9jbGllbnQgPQorCQkoc3RydWN0IGRldmljZV9jbGllbnQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRldmljZV9wYWNrZXQgKmRldmljZV9wYWNrZXQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdF9wb3MsICpsaXN0X3Bvc190bXA7CisKKwlzcGluX2xvY2soJmRldmljZV9jbGllbnQtPmxvY2spOworCisJLyogZm9yIGFsbCBwYWNrZXRzIGluIHRoZSBxdWV1ZSAuLi4gKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdF9wb3MsIGxpc3RfcG9zX3RtcCwgJmRldmljZV9jbGllbnQtPnF1ZXVlX2xpc3QpIHsKKwkJZGV2aWNlX3BhY2tldCA9IGxpc3RfZW50cnkobGlzdF9wb3MsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfcGFja2V0LCBsaXN0KTsKKworCQlsaXN0X2RlbChsaXN0X3Bvcyk7CisJCWtmcmVlKGRldmljZV9wYWNrZXQpOworCX0KKworCWRldmljZV9jbGllbnRfaGFzaFtkZXZpY2VfY2xpZW50LT5pbmRleF0gPSBOVUxMOworCXNwaW5fdW5sb2NrKCZkZXZpY2VfY2xpZW50LT5sb2NrKTsKKworCWtmcmVlKGRldmljZV9jbGllbnQpOworCWRlY19tb2R1bGVfY291bnQoKTsKKworCXJldHVybiAwOworfQorCitzc2l6ZV90IGJhdF9kZXZpY2VfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBkZXZpY2VfY2xpZW50ICpkZXZpY2VfY2xpZW50ID0KKwkJKHN0cnVjdCBkZXZpY2VfY2xpZW50ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZXZpY2VfcGFja2V0ICpkZXZpY2VfcGFja2V0OworCWludCBlcnJvcjsKKworCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spICYmIChkZXZpY2VfY2xpZW50LT5xdWV1ZV9sZW4gPT0gMCkpCisJCXJldHVybiAtRUFHQUlOOworCisJaWYgKCghYnVmKSB8fCAoY291bnQgPCBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0KSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWYsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnJvciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkZXZpY2VfY2xpZW50LT5xdWV1ZV93YWl0LAorCQkJCQkgZGV2aWNlX2NsaWVudC0+cXVldWVfbGVuKTsKKworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJc3Bpbl9sb2NrKCZkZXZpY2VfY2xpZW50LT5sb2NrKTsKKworCWRldmljZV9wYWNrZXQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZkZXZpY2VfY2xpZW50LT5xdWV1ZV9saXN0LAorCQkJCQkgc3RydWN0IGRldmljZV9wYWNrZXQsIGxpc3QpOworCWxpc3RfZGVsKCZkZXZpY2VfcGFja2V0LT5saXN0KTsKKwlkZXZpY2VfY2xpZW50LT5xdWV1ZV9sZW4tLTsKKworCXNwaW5fdW5sb2NrKCZkZXZpY2VfY2xpZW50LT5sb2NrKTsKKworCWVycm9yID0gX19jb3B5X3RvX3VzZXIoYnVmLCAmZGV2aWNlX3BhY2tldC0+aWNtcF9wYWNrZXQsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpY21wX3BhY2tldCkpOworCisJa2ZyZWUoZGV2aWNlX3BhY2tldCk7CisKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXJldHVybiBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0KTsKK30KKworc3NpemVfdCBiYXRfZGV2aWNlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZiwKKwkJCSBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2NsaWVudCAqZGV2aWNlX2NsaWVudCA9CisJCShzdHJ1Y3QgZGV2aWNlX2NsaWVudCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWNtcF9wYWNrZXQgaWNtcF9wYWNrZXQ7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOworCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKKworCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0KSkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfTk9USUNFLCAiRXJyb3IgLSBjYW4ndCBzZW5kIHBhY2tldCBmcm9tIGNoYXIgZGV2aWNlOiBpbnZhbGlkIHBhY2tldCBzaXplXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmYsIHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoX19jb3B5X2Zyb21fdXNlcigmaWNtcF9wYWNrZXQsIGJ1ZmYsIHNpemVvZihpY21wX3BhY2tldCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChpY21wX3BhY2tldC5wYWNrZXRfdHlwZSAhPSBCQVRfSUNNUCkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfTk9USUNFLCAiRXJyb3IgLSBjYW4ndCBzZW5kIHBhY2tldCBmcm9tIGNoYXIgZGV2aWNlOiBnb3QgYm9ndXMgcGFja2V0IHR5cGUgKGV4cGVjdGVkOiBCQVRfSUNNUClcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoaWNtcF9wYWNrZXQubXNnX3R5cGUgIT0gRUNIT19SRVFVRVNUKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9OT1RJQ0UsICJFcnJvciAtIGNhbid0IHNlbmQgcGFja2V0IGZyb20gY2hhciBkZXZpY2U6IGdvdCBib2d1cyBtZXNzYWdlIHR5cGUgKGV4cGVjdGVkOiBFQ0hPX1JFUVVFU1QpXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWNtcF9wYWNrZXQudWlkID0gZGV2aWNlX2NsaWVudC0+aW5kZXg7CisKKwlpZiAoaWNtcF9wYWNrZXQudmVyc2lvbiAhPSBDT01QQVRfVkVSU0lPTikgeworCQlpY21wX3BhY2tldC5tc2dfdHlwZSA9IFBBUkFNRVRFUl9QUk9CTEVNOworCQlpY21wX3BhY2tldC50dGwgPSBDT01QQVRfVkVSU0lPTjsKKwkJYmF0X2RldmljZV9hZGRfcGFja2V0KGRldmljZV9jbGllbnQsICZpY21wX3BhY2tldCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChhdG9taWNfcmVhZCgmbW9kdWxlX3N0YXRlKSAhPSBNT0RVTEVfQUNUSVZFKQorCQlnb3RvIGRzdF91bnJlYWNoOworCisJc3Bpbl9sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopaGFzaF9maW5kKG9yaWdfaGFzaCwgaWNtcF9wYWNrZXQuZHN0KSk7CisKKwlpZiAoIW9yaWdfbm9kZSkKKwkJZ290byB1bmxvY2s7CisKKwlpZiAoIW9yaWdfbm9kZS0+cm91dGVyKQorCQlnb3RvIHVubG9jazsKKworCWJhdG1hbl9pZiA9IG9yaWdfbm9kZS0+YmF0bWFuX2lmOworCisJaWYgKCFiYXRtYW5faWYpCisJCWdvdG8gdW5sb2NrOworCisJbWVtY3B5KGljbXBfcGFja2V0Lm9yaWcsCisJICAgICAgIGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsCisJICAgICAgIEVUSF9BTEVOKTsKKworCXNlbmRfcmF3X3BhY2tldCgodW5zaWduZWQgY2hhciAqKSZpY21wX3BhY2tldCwKKwkJCXNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpLAorCQkJYmF0bWFuX2lmLCBvcmlnX25vZGUtPnJvdXRlci0+YWRkcik7CisKKwlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCWdvdG8gb3V0OworCit1bmxvY2s6CisJc3Bpbl91bmxvY2soJm9yaWdfaGFzaF9sb2NrKTsKK2RzdF91bnJlYWNoOgorCWljbXBfcGFja2V0Lm1zZ190eXBlID0gREVTVElOQVRJT05fVU5SRUFDSEFCTEU7CisJYmF0X2RldmljZV9hZGRfcGFja2V0KGRldmljZV9jbGllbnQsICZpY21wX3BhY2tldCk7CitvdXQ6CisJcmV0dXJuIGxlbjsKK30KKwordW5zaWduZWQgaW50IGJhdF9kZXZpY2VfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2NsaWVudCAqZGV2aWNlX2NsaWVudCA9CisJCShzdHJ1Y3QgZGV2aWNlX2NsaWVudCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCXBvbGxfd2FpdChmaWxlLCAmZGV2aWNlX2NsaWVudC0+cXVldWVfd2FpdCwgd2FpdCk7CisKKwlpZiAoZGV2aWNlX2NsaWVudC0+cXVldWVfbGVuID4gMCkKKwkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBiYXRfZGV2aWNlX2FkZF9wYWNrZXQoc3RydWN0IGRldmljZV9jbGllbnQgKmRldmljZV9jbGllbnQsCisJCQkgICBzdHJ1Y3QgaWNtcF9wYWNrZXQgKmljbXBfcGFja2V0KQoreworCXN0cnVjdCBkZXZpY2VfcGFja2V0ICpkZXZpY2VfcGFja2V0OworCisJZGV2aWNlX3BhY2tldCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZpY2VfcGFja2V0KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWRldmljZV9wYWNrZXQpCisJCXJldHVybjsKKworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2VfcGFja2V0LT5saXN0KTsKKwltZW1jcHkoJmRldmljZV9wYWNrZXQtPmljbXBfcGFja2V0LCBpY21wX3BhY2tldCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBpY21wX3BhY2tldCkpOworCisJc3Bpbl9sb2NrKCZkZXZpY2VfY2xpZW50LT5sb2NrKTsKKworCS8qIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBsb2NrIHRoZSBkZXZpY2VfY2xpZW50IGNvdWxkIGhhdmUgYmVlbgorCSAqIGRlbGV0ZWQgKi8KKwlpZiAoIWRldmljZV9jbGllbnRfaGFzaFtpY21wX3BhY2tldC0+dWlkXSkgeworCQlzcGluX3VubG9jaygmZGV2aWNlX2NsaWVudC0+bG9jayk7CisJCWtmcmVlKGRldmljZV9wYWNrZXQpOworCQlyZXR1cm47CisJfQorCisJbGlzdF9hZGRfdGFpbCgmZGV2aWNlX3BhY2tldC0+bGlzdCwgJmRldmljZV9jbGllbnQtPnF1ZXVlX2xpc3QpOworCWRldmljZV9jbGllbnQtPnF1ZXVlX2xlbisrOworCisJaWYgKGRldmljZV9jbGllbnQtPnF1ZXVlX2xlbiA+IDEwMCkgeworCQlkZXZpY2VfcGFja2V0ID0gbGlzdF9maXJzdF9lbnRyeSgmZGV2aWNlX2NsaWVudC0+cXVldWVfbGlzdCwKKwkJCQkJCSBzdHJ1Y3QgZGV2aWNlX3BhY2tldCwgbGlzdCk7CisKKwkJbGlzdF9kZWwoJmRldmljZV9wYWNrZXQtPmxpc3QpOworCQlrZnJlZShkZXZpY2VfcGFja2V0KTsKKwkJZGV2aWNlX2NsaWVudC0+cXVldWVfbGVuLS07CisJfQorCisJc3Bpbl91bmxvY2soJmRldmljZV9jbGllbnQtPmxvY2spOworCisJd2FrZV91cCgmZGV2aWNlX2NsaWVudC0+cXVldWVfd2FpdCk7Cit9CisKK3ZvaWQgYmF0X2RldmljZV9yZWNlaXZlX3BhY2tldChzdHJ1Y3QgaWNtcF9wYWNrZXQgKmljbXBfcGFja2V0KQoreworCXN0cnVjdCBkZXZpY2VfY2xpZW50ICpoYXNoID0gZGV2aWNlX2NsaWVudF9oYXNoW2ljbXBfcGFja2V0LT51aWRdOworCisJaWYgKGhhc2gpCisJCWJhdF9kZXZpY2VfYWRkX3BhY2tldChoYXNoLCBpY21wX3BhY2tldCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YzBmNDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9kZXZpY2UuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgInR5cGVzLmgiCisKK3ZvaWQgYmF0X2RldmljZV9pbml0KHZvaWQpOworaW50IGJhdF9kZXZpY2Vfc2V0dXAodm9pZCk7Cit2b2lkIGJhdF9kZXZpY2VfZGVzdHJveSh2b2lkKTsKK2ludCBiYXRfZGV2aWNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworaW50IGJhdF9kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Citzc2l6ZV90IGJhdF9kZXZpY2VfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJbG9mZl90ICpwcG9zKTsKK3NzaXplX3QgYmF0X2RldmljZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmYsCisJCQkgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmYpOwordW5zaWduZWQgaW50IGJhdF9kZXZpY2VfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCk7Cit2b2lkIGJhdF9kZXZpY2VfYWRkX3BhY2tldChzdHJ1Y3QgZGV2aWNlX2NsaWVudCAqZGV2aWNlX2NsaWVudCwKKwkJCSAgIHN0cnVjdCBpY21wX3BhY2tldCAqaWNtcF9wYWNrZXQpOwordm9pZCBiYXRfZGV2aWNlX3JlY2VpdmVfcGFja2V0KHN0cnVjdCBpY21wX3BhY2tldCAqaWNtcF9wYWNrZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVhMzVkYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmMKQEAgLTAsMCArMSw0NTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJzZW5kLmgiCisjaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKKyNpbmNsdWRlICJyb3V0aW5nLmgiCisjaW5jbHVkZSAiaGFzaC5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorCisjZGVmaW5lIE1JTih4LCB5KSAoKHgpIDwgKHkpID8gKHgpIDogKHkpKQorCitzdGF0aWMgY2hhciBhdmFpbF9pZnM7CitzdGF0aWMgY2hhciBhY3RpdmVfaWZzOworCitzdGF0aWMgdm9pZCBoYXJkaWZfZnJlZV9pbnRlcmZhY2Uoc3RydWN0IHJjdV9oZWFkICpyY3UpOworCitzdGF0aWMgc3RydWN0IGJhdG1hbl9pZiAqZ2V0X2JhdG1hbl9pZl9ieV9uYW1lKGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHN0cm5jbXAoYmF0bWFuX2lmLT5kZXYsIG5hbWUsIElGTkFNU0laKSA9PSAwKQorCQkJZ290byBvdXQ7CisJfQorCisJYmF0bWFuX2lmID0gTlVMTDsKKworb3V0OgorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBiYXRtYW5faWY7Cit9CisKK2ludCBoYXJkaWZfbWluX210dSh2b2lkKQoreworCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKKwkvKiBhbGxvdyBiaWcgZnJhbWVzIGlmIGFsbCBkZXZpY2VzIGFyZSBjYXBhYmxlIHRvIGRvIHNvCisJICogKGhhdmUgTVRVID4gMTUwMCArIEJBVF9IRUFERVJfTEVOKSAqLworCWludCBtaW5fbXR1ID0gRVRIX0RBVEFfTEVOOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKKwkJaWYgKChiYXRtYW5faWYtPmlmX2FjdGl2ZSA9PSBJRl9BQ1RJVkUpIHx8CisJCSAgICAoYmF0bWFuX2lmLT5pZl9hY3RpdmUgPT0gSUZfVE9fQkVfQUNUSVZBVEVEKSkKKwkJCW1pbl9tdHUgPSBNSU4oYmF0bWFuX2lmLT5uZXRfZGV2LT5tdHUgLSBCQVRfSEVBREVSX0xFTiwKKwkJCQkgICAgICBtaW5fbXR1KTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gbWluX210dTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfa25vd25fbWFjX2FkZHIodWludDhfdCAqYWRkcikKK3sKKwlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7CisJY2hhciBtYWNfc3RyaW5nW0VUSF9TVFJfTEVOXTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7CisJCWlmICgoYmF0bWFuX2lmLT5pZl9hY3RpdmUgIT0gSUZfQUNUSVZFKSAmJgorCQkgICAgKGJhdG1hbl9pZi0+aWZfYWN0aXZlICE9IElGX1RPX0JFX0FDVElWQVRFRCkpCisJCQljb250aW51ZTsKKworCQlpZiAoIWNvbXBhcmVfb3JpZyhiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyLCBhZGRyKSkKKwkJCWNvbnRpbnVlOworCisJCWFkZHJfdG9fc3RyaW5nKG1hY19zdHJpbmcsIGFkZHIpOworCQlkZWJ1Z19sb2coTE9HX1RZUEVfV0FSTiwgIlRoZSBuZXdseSBhZGRlZCBtYWMgYWRkcmVzcyAoJXMpIGFscmVhZHkgZXhpc3RzIG9uOiAlc1xuIiwKKwkJICAgICAgICAgIG1hY19zdHJpbmcsIGJhdG1hbl9pZi0+ZGV2KTsKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sICJJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBrZWVwIG1hYyBhZGRyZXNzZXMgdW5pcXVlIHRvIGF2b2lkIHByb2JsZW1zIVxuIik7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworfQorCisvKiBhZGp1c3RzIHRoZSBNVFUgaWYgYSBuZXcgaW50ZXJmYWNlIHdpdGggYSBzbWFsbGVyIE1UVSBhcHBlYXJlZC4gKi8KK3ZvaWQgdXBkYXRlX21pbl9tdHUodm9pZCkKK3sKKwlpbnQgbWluX210dTsKKworCW1pbl9tdHUgPSBoYXJkaWZfbWluX210dSgpOworCWlmIChzb2Z0X2RldmljZS0+bXR1ICE9IG1pbl9tdHUpCisJCXNvZnRfZGV2aWNlLT5tdHUgPSBtaW5fbXR1OworfQorCisvKiBjaGVja3MgaWYgdGhlIGludGVyZmFjZSBpcyB1cC4gKHJldHVybnMgMSBpZiBpdCBpcykgKi8KK3N0YXRpYyBpbnQgaGFyZGlmX2lzX2ludGVyZmFjZV91cChjaGFyICpkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisKKwkvKioKKwkgKiBpZiB3ZSBhbHJlYWR5IGhhdmUgYW4gaW50ZXJmYWNlIGluIG91ciBpbnRlcmZhY2UgbGlzdCBhbmQKKwkgKiB0aGUgY3VycmVudCBpbnRlcmZhY2UgaXMgbm90IHRoZSBwcmltYXJ5IGludGVyZmFjZSBhbmQKKwkgKiB0aGUgcHJpbWFyeSBpbnRlcmZhY2UgaXMgbm90IHVwIGFuZAorCSAqIHRoZSBwcmltYXJ5IGludGVyZmFjZSBoYXMgbmV2ZXIgYmVlbiB1cCAtIGRvbid0IGFjdGl2YXRlIGFueQorCSAqIHNlY29uZGFyeSBpbnRlcmZhY2UgIQorCSAqLworCisJcmN1X3JlYWRfbG9jaygpOworCWlmICgoIWxpc3RfZW1wdHkoJmlmX2xpc3QpKSAmJgorCSAgICBzdHJuY21wKCgoc3RydWN0IGJhdG1hbl9pZiAqKWlmX2xpc3QubmV4dCktPmRldiwgZGV2LCBJRk5BTVNJWikgJiYKKwkgICAgISgoKHN0cnVjdCBiYXRtYW5faWYgKilpZl9saXN0Lm5leHQpLT5pZl9hY3RpdmUgPT0gSUZfQUNUSVZFKSAmJgorCSAgICAhKCgoc3RydWN0IGJhdG1hbl9pZiAqKWlmX2xpc3QubmV4dCktPmlmX2FjdGl2ZSA9PSBJRl9UT19CRV9BQ1RJVkFURUQpICYmCisJICAgICghbWFpbl9pZl93YXNfdXAoKSkpIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCWdvdG8gZW5kOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworI2lmZGVmIF9fTkVUX05FVF9OQU1FU1BBQ0VfSAorCW5ldF9kZXYgPSBkZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBkZXYpOworI2Vsc2UKKwluZXRfZGV2ID0gZGV2X2dldF9ieV9uYW1lKGRldik7CisjZW5kaWYKKwlpZiAoIW5ldF9kZXYpCisJCWdvdG8gZW5kOworCisJaWYgKCEobmV0X2Rldi0+ZmxhZ3MgJiBJRkZfVVApKQorCQlnb3RvIGZhaWx1cmU7CisKKwlkZXZfcHV0KG5ldF9kZXYpOworCXJldHVybiAxOworCitmYWlsdXJlOgorCWRldl9wdXQobmV0X2Rldik7CitlbmQ6CisJcmV0dXJuIDA7Cit9CisKKy8qIGRlYWN0aXZhdGVzIHRoZSBpbnRlcmZhY2UuICovCit2b2lkIGhhcmRpZl9kZWFjdGl2YXRlX2ludGVyZmFjZShzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCit7CisJaWYgKGJhdG1hbl9pZi0+aWZfYWN0aXZlICE9IElGX0FDVElWRSkKKwkJcmV0dXJuOworCisJaWYgKGJhdG1hbl9pZi0+cmF3X3NvY2spCisJCXNvY2tfcmVsZWFzZShiYXRtYW5faWYtPnJhd19zb2NrKTsKKworCS8qKgorCSAqIGJhdG1hbl9pZi0+bmV0X2RldiBoYXMgYmVlbiBhY3F1aXJlZCBieSBkZXZfZ2V0X2J5X25hbWUoKSBpbgorCSAqIHByb2NfaW50ZXJmYWNlc193cml0ZSgpIGFuZCBoYXMgdG8gYmUgdW5yZWZlcmVuY2VkLgorCSAqLworCisJaWYgKGJhdG1hbl9pZi0+bmV0X2RldikKKwkJZGV2X3B1dChiYXRtYW5faWYtPm5ldF9kZXYpOworCisJYmF0bWFuX2lmLT5yYXdfc29jayA9IE5VTEw7CisJYmF0bWFuX2lmLT5uZXRfZGV2ID0gTlVMTDsKKworCWJhdG1hbl9pZi0+aWZfYWN0aXZlID0gSUZfSU5BQ1RJVkU7CisJYWN0aXZlX2lmcy0tOworCisJZGVidWdfbG9nKExPR19UWVBFX05PVElDRSwgIkludGVyZmFjZSBkZWFjdGl2YXRlZDogJXNcbiIsCisJICAgICAgICAgIGJhdG1hbl9pZi0+ZGV2KTsKK30KKworLyogKHJlKWFjdGl2YXRlIGdpdmVuIGludGVyZmFjZS4gKi8KK3N0YXRpYyB2b2lkIGhhcmRpZl9hY3RpdmF0ZV9pbnRlcmZhY2Uoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQoreworCXN0cnVjdCBzb2NrYWRkcl9sbCBiaW5kX2FkZHI7CisJaW50IHJldHZhbDsKKworCWlmIChiYXRtYW5faWYtPmlmX2FjdGl2ZSAhPSBJRl9JTkFDVElWRSkKKwkJcmV0dXJuOworCisjaWZkZWYgX19ORVRfTkVUX05BTUVTUEFDRV9ICisJYmF0bWFuX2lmLT5uZXRfZGV2ID0gZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgYmF0bWFuX2lmLT5kZXYpOworI2Vsc2UKKwliYXRtYW5faWYtPm5ldF9kZXYgPSBkZXZfZ2V0X2J5X25hbWUoYmF0bWFuX2lmLT5kZXYpOworI2VuZGlmCisJaWYgKCFiYXRtYW5faWYtPm5ldF9kZXYpCisJCWdvdG8gZGV2X2VycjsKKworCXJldHZhbCA9IHNvY2tfY3JlYXRlX2tlcm4oUEZfUEFDS0VULCBTT0NLX1JBVywKKwkJCQkgIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfQkFUTUFOKSwKKwkJCQkgICZiYXRtYW5faWYtPnJhd19zb2NrKTsKKworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLCAiQ2FuJ3QgY3JlYXRlIHJhdyBzb2NrZXQ6ICVpXG4iLAorCQkJICByZXR2YWwpOworCQlnb3RvIHNvY2tfZXJyOworCX0KKworCWJpbmRfYWRkci5zbGxfZmFtaWx5ID0gQUZfUEFDS0VUOworCWJpbmRfYWRkci5zbGxfaWZpbmRleCA9IGJhdG1hbl9pZi0+bmV0X2Rldi0+aWZpbmRleDsKKwliaW5kX2FkZHIuc2xsX3Byb3RvY29sID0gMDsJLyogaXMgc2V0IGJ5IHRoZSBrZXJuZWwgKi8KKworCXJldHZhbCA9IGtlcm5lbF9iaW5kKGJhdG1hbl9pZi0+cmF3X3NvY2ssCisJCQkgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmYmluZF9hZGRyLCBzaXplb2YoYmluZF9hZGRyKSk7CisKKwlpZiAocmV0dmFsIDwgMCkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfV0FSTiwgIkNhbid0IGNyZWF0ZSBiaW5kIHJhdyBzb2NrZXQ6ICVpXG4iLAorCQkJICByZXR2YWwpOworCQlnb3RvIGJpbmRfZXJyOworCX0KKworCWNoZWNrX2tub3duX21hY19hZGRyKGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIpOworCisJYmF0bWFuX2lmLT5yYXdfc29jay0+c2stPnNrX3VzZXJfZGF0YSA9CisJCWJhdG1hbl9pZi0+cmF3X3NvY2stPnNrLT5za19kYXRhX3JlYWR5OworCWJhdG1hbl9pZi0+cmF3X3NvY2stPnNrLT5za19kYXRhX3JlYWR5ID0gYmF0bWFuX2RhdGFfcmVhZHk7CisKKwlhZGRyX3RvX3N0cmluZyhiYXRtYW5faWYtPmFkZHJfc3RyLCBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyKTsKKworCW1lbWNweSgoKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopKGJhdG1hbl9pZi0+cGFja2V0X2J1ZmYpKS0+b3JpZywKKwkgICAgICAgYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweSgoKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopKGJhdG1hbl9pZi0+cGFja2V0X2J1ZmYpKS0+cHJldl9zZW5kZXIsCisJICAgICAgIGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKworCWJhdG1hbl9pZi0+aWZfYWN0aXZlID0gSUZfVE9fQkVfQUNUSVZBVEVEOworCWFjdGl2ZV9pZnMrKzsKKworCS8qIHNhdmUgdGhlIG1hYyBhZGRyZXNzIGlmIGl0IGlzIG91ciBwcmltYXJ5IGludGVyZmFjZSAqLworCWlmIChiYXRtYW5faWYtPmlmX251bSA9PSAwKQorCQlzZXRfbWFpbl9pZl9hZGRyKGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIpOworCisJZGVidWdfbG9nKExPR19UWVBFX05PVElDRSwgIkludGVyZmFjZSBhY3RpdmF0ZWQ6ICVzXG4iLAorCSAgICAgICAgICBiYXRtYW5faWYtPmRldik7CisKKwlyZXR1cm47CisKK2JpbmRfZXJyOgorCXNvY2tfcmVsZWFzZShiYXRtYW5faWYtPnJhd19zb2NrKTsKK3NvY2tfZXJyOgorCWRldl9wdXQoYmF0bWFuX2lmLT5uZXRfZGV2KTsKK2Rldl9lcnI6CisJYmF0bWFuX2lmLT5yYXdfc29jayA9IE5VTEw7CisJYmF0bWFuX2lmLT5uZXRfZGV2ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaGFyZGlmX2ZyZWVfaW50ZXJmYWNlKHN0cnVjdCByY3VfaGVhZCAqcmN1KQoreworCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBiYXRtYW5faWYsIHJjdSk7CisKKwlrZnJlZShiYXRtYW5faWYtPnBhY2tldF9idWZmKTsKKwlrZnJlZShiYXRtYW5faWYtPmRldik7CisJa2ZyZWUoYmF0bWFuX2lmKTsKK30KKworLyoqCisgKiBjYWxsZWQgYnkKKyAqICAtIGVjaG8gJycgPiAvcHJvYy8uLi4vaW50ZXJmYWNlcworICogIC0gbW9kcHJvYmUgLXIgYmF0bWFuLWFkdi1jb3JlCisgKi8KKy8qIHJlbW92ZXMgYW5kIGZyZWVzIGFsbCBpbnRlcmZhY2VzICovCit2b2lkIGhhcmRpZl9yZW1vdmVfaW50ZXJmYWNlcyh2b2lkKQoreworCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiA9IE5VTEw7CisKKwlhdmFpbF9pZnMgPSAwOworCisJLyogbm8gbG9jayBuZWVkZWQgLSB3ZSBkb24ndCBkZWxldGUgc29tZXdoZXJlIGVsc2UgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKKworCQlsaXN0X2RlbF9yY3UoJmJhdG1hbl9pZi0+bGlzdCk7CisKKwkJLyogZmlyc3QgZGVhY3RpdmF0ZSBpbnRlcmZhY2UgKi8KKwkJaWYgKGJhdG1hbl9pZi0+aWZfYWN0aXZlICE9IElGX0lOQUNUSVZFKQorCQkJaGFyZGlmX2RlYWN0aXZhdGVfaW50ZXJmYWNlKGJhdG1hbl9pZik7CisKKwkJY2FsbF9yY3UoJmJhdG1hbl9pZi0+cmN1LCBoYXJkaWZfZnJlZV9pbnRlcmZhY2UpOworCX0KK30KKworc3RhdGljIGludCByZXNpemVfb3JpZyhzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsIGludCBpZl9udW0pCit7CisJdm9pZCAqZGF0YV9wdHI7CisKKwlkYXRhX3B0ciA9IGttYWxsb2MoKGlmX251bSArIDEpICogc2l6ZW9mKFRZUEVfT0ZfV09SRCkgKiBOVU1fV09SRFMsCisJCQkgICBHRlBfQVRPTUlDKTsKKwlpZiAoIWRhdGFfcHRyKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLCAiQ2FuJ3QgcmVzaXplIG9yaWc6IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtY3B5KGRhdGFfcHRyLCBvcmlnX25vZGUtPmJjYXN0X293biwKKwkgICAgICAgaWZfbnVtICogc2l6ZW9mKFRZUEVfT0ZfV09SRCkgKiBOVU1fV09SRFMpOworCWtmcmVlKG9yaWdfbm9kZS0+YmNhc3Rfb3duKTsKKwlvcmlnX25vZGUtPmJjYXN0X293biA9IGRhdGFfcHRyOworCisJZGF0YV9wdHIgPSBrbWFsbG9jKChpZl9udW0gKyAxKSAqIHNpemVvZih1aW50OF90KSwgR0ZQX0FUT01JQyk7CisJaWYgKCFkYXRhX3B0cikgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfV0FSTiwgIkNhbid0IHJlc2l6ZSBvcmlnOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbWNweShkYXRhX3B0ciwgb3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtLCBpZl9udW0gKiBzaXplb2YodWludDhfdCkpOworCWtmcmVlKG9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bSk7CisJb3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtID0gZGF0YV9wdHI7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBhZGRzIGFuIGludGVyZmFjZSB0aGUgaW50ZXJmYWNlIGxpc3QgYW5kIGFjdGl2YXRlIGl0LCBpZiBwb3NzaWJsZSAqLworaW50IGhhcmRpZl9hZGRfaW50ZXJmYWNlKGNoYXIgKmRldiwgaW50IGlmX251bSkKK3sKKwlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7CisJc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOworCXN0cnVjdCBoYXNoX2l0X3QgKmhhc2hpdCA9IE5VTEw7CisKKwliYXRtYW5faWYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYmF0bWFuX2lmKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWJhdG1hbl9pZikgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfV0FSTiwgIkNhbid0IGFkZCBpbnRlcmZhY2UgKCVzKTogb3V0IG9mIG1lbW9yeVxuIiwgZGV2KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWJhdG1hbl9pZi0+cmF3X3NvY2sgPSBOVUxMOworCWJhdG1hbl9pZi0+bmV0X2RldiA9IE5VTEw7CisKKwlpZiAoKGlmX251bSA9PSAwKSAmJiAobnVtX2huYSA+IDApKQorCQliYXRtYW5faWYtPnBhY2tldF9sZW4gPSBCQVRfUEFDS0VUX0xFTiArIG51bV9obmEgKiBFVEhfQUxFTjsKKwllbHNlCisJCWJhdG1hbl9pZi0+cGFja2V0X2xlbiA9IEJBVF9QQUNLRVRfTEVOOworCisJYmF0bWFuX2lmLT5wYWNrZXRfYnVmZiA9IGttYWxsb2MoYmF0bWFuX2lmLT5wYWNrZXRfbGVuLCBHRlBfS0VSTkVMKTsKKworCWlmICghYmF0bWFuX2lmLT5wYWNrZXRfYnVmZikgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfV0FSTiwgIkNhbid0IGFkZCBpbnRlcmZhY2UgcGFja2V0ICglcyk6IG91dCBvZiBtZW1vcnlcbiIsIGRldik7CisJCWdvdG8gb3V0OworCX0KKworCWJhdG1hbl9pZi0+aWZfbnVtID0gaWZfbnVtOworCWJhdG1hbl9pZi0+ZGV2ID0gZGV2OworCWJhdG1hbl9pZi0+aWZfYWN0aXZlID0gSUZfSU5BQ1RJVkU7CisJSU5JVF9SQ1VfSEVBRCgmYmF0bWFuX2lmLT5yY3UpOworCisJZGVidWdfbG9nKExPR19UWVBFX05PVElDRSwgIkFkZGluZyBpbnRlcmZhY2U6ICVzXG4iLCBkZXYpOworCWF2YWlsX2lmcysrOworCisJSU5JVF9MSVNUX0hFQUQoJmJhdG1hbl9pZi0+bGlzdCk7CisKKwliYXRtYW5fcGFja2V0ID0gKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopKGJhdG1hbl9pZi0+cGFja2V0X2J1ZmYpOworCWJhdG1hbl9wYWNrZXQtPnBhY2tldF90eXBlID0gQkFUX1BBQ0tFVDsKKwliYXRtYW5fcGFja2V0LT52ZXJzaW9uID0gQ09NUEFUX1ZFUlNJT047CisJYmF0bWFuX3BhY2tldC0+ZmxhZ3MgPSAweDAwOworCWJhdG1hbl9wYWNrZXQtPnR0bCA9IChiYXRtYW5faWYtPmlmX251bSA+IDAgPyAyIDogVFRMKTsKKwliYXRtYW5fcGFja2V0LT5mbGFncyA9IDA7CisJYmF0bWFuX3BhY2tldC0+dHEgPSBUUV9NQVhfVkFMVUU7CisJYmF0bWFuX3BhY2tldC0+bnVtX2huYSA9IDA7CisKKwlpZiAoYmF0bWFuX2lmLT5wYWNrZXRfbGVuICE9IEJBVF9QQUNLRVRfTEVOKSB7CisJCXVuc2lnbmVkIGNoYXIgKmhuYV9idWZmOworCQlpbnQgaG5hX2xlbjsKKworCQlobmFfYnVmZiA9IGJhdG1hbl9pZi0+cGFja2V0X2J1ZmYgKyBCQVRfUEFDS0VUX0xFTjsKKwkJaG5hX2xlbiA9IGJhdG1hbl9pZi0+cGFja2V0X2xlbiAtIEJBVF9QQUNLRVRfTEVOOworCQliYXRtYW5fcGFja2V0LT5udW1faG5hID0gaG5hX2xvY2FsX2ZpbGxfYnVmZmVyKGhuYV9idWZmLAorCQkJCQkJCSAgICAgICBobmFfbGVuKTsKKwl9CisKKwlhdG9taWNfc2V0KCZiYXRtYW5faWYtPnNlcW5vLCAxKTsKKworCS8qIHJlc2l6ZSBhbGwgb3JpZyBub2RlcyBiZWNhdXNlIG9yaWdfbm9kZS0+YmNhc3Rfb3duKF9zdW0pIGRlcGVuZCBvbgorCSAqIGlmX251bSAqLworCXNwaW5fbG9jaygmb3JpZ19oYXNoX2xvY2spOworCisJd2hpbGUgKE5VTEwgIT0gKGhhc2hpdCA9IGhhc2hfaXRlcmF0ZShvcmlnX2hhc2gsIGhhc2hpdCkpKSB7CisJCW9yaWdfbm9kZSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCQlpZiAocmVzaXplX29yaWcob3JpZ19ub2RlLCBpZl9udW0pID09IC0xKSB7CisJCQlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCisJaWYgKCFoYXJkaWZfaXNfaW50ZXJmYWNlX3VwKGJhdG1hbl9pZi0+ZGV2KSkKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sICJOb3QgdXNpbmcgaW50ZXJmYWNlICVzIChyZXRyeWluZyBsYXRlcik6IGludGVyZmFjZSBub3QgYWN0aXZlXG4iLCBiYXRtYW5faWYtPmRldik7CisJZWxzZQorCQloYXJkaWZfYWN0aXZhdGVfaW50ZXJmYWNlKGJhdG1hbl9pZik7CisKKwlsaXN0X2FkZF90YWlsX3JjdSgmYmF0bWFuX2lmLT5saXN0LCAmaWZfbGlzdCk7CisKKwkvKiBiZWdpbiBzZW5kaW5nIG9yaWdpbmF0b3IgbWVzc2FnZXMgb24gdGhhdCBpbnRlcmZhY2UgKi8KKwlzY2hlZHVsZV9vd25fcGFja2V0KGJhdG1hbl9pZik7CisJcmV0dXJuIDE7CisKK291dDoKKwlpZiAoYmF0bWFuX2lmLT5wYWNrZXRfYnVmZikKKwkJa2ZyZWUoYmF0bWFuX2lmLT5wYWNrZXRfYnVmZik7CisJa2ZyZWUoYmF0bWFuX2lmKTsKKwlrZnJlZShkZXYpOworCXJldHVybiAtMTsKK30KKworY2hhciBoYXJkaWZfZ2V0X2FjdGl2ZV9pZl9udW0odm9pZCkKK3sKKwlyZXR1cm4gYWN0aXZlX2lmczsKK30KKworc3RhdGljIGludCBoYXJkX2lmX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXB0cjsKKwlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYgPSBnZXRfYmF0bWFuX2lmX2J5X25hbWUoZGV2LT5uYW1lKTsKKworCWlmICghYmF0bWFuX2lmKQorCQlnb3RvIG91dDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5FVERFVl9HT0lOR19ET1dOOgorCWNhc2UgTkVUREVWX0RPV046CisJY2FzZSBORVRERVZfVU5SRUdJU1RFUjoKKwkJaGFyZGlmX2RlYWN0aXZhdGVfaW50ZXJmYWNlKGJhdG1hbl9pZik7CisJCWJyZWFrOworCWNhc2UgTkVUREVWX1VQOgorCQloYXJkaWZfYWN0aXZhdGVfaW50ZXJmYWNlKGJhdG1hbl9pZik7CisJCWlmICgoYXRvbWljX3JlYWQoJm1vZHVsZV9zdGF0ZSkgPT0gTU9EVUxFX0lOQUNUSVZFKSAmJgorCQkgICAgKGhhcmRpZl9nZXRfYWN0aXZlX2lmX251bSgpID4gMCkpIHsKKwkJCWFjdGl2YXRlX21vZHVsZSgpOworCQl9CisJCWJyZWFrOworCS8qIE5FVERFVl9DSEFOR0VBRERSIC0gbWFjIGFkZHJlc3MgY2hhbmdlIC0gd2hhdCBhcmUgd2UgZG9pbmcgaGVyZSA/ICovCisJZGVmYXVsdDoKKwkJLyogZGVidWdfbG9nKExPR19UWVBFX0NSSVQsICJoYXJkX2lmX2V2ZW50OiAlcyAlaVxuIiwgZGV2LT5uYW1lLCBldmVudCk7ICovCisJCWJyZWFrOworCX07CisKKwl1cGRhdGVfbWluX210dSgpOworCitvdXQ6CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaGFyZF9pZl9ub3RpZmllciA9IHsKKyAgICAgICAgLm5vdGlmaWVyX2NhbGwgPSBoYXJkX2lmX2V2ZW50LAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXJkLWludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MjM1OGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXJkLWludGVyZmFjZS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjZGVmaW5lIElGX0lOQUNUSVZFIDAKKyNkZWZpbmUgSUZfQUNUSVZFIDEKKy8qICNkZWZpbmUgSUZfVE9fQkVfREVBQ1RJVkFURUQgMiAtIG5vdCBuZWVkZWQgYW55bW9yZSAqLworI2RlZmluZSBJRl9UT19CRV9BQ1RJVkFURUQgMworCitleHRlcm4gc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGhhcmRfaWZfbm90aWZpZXI7CisKK3ZvaWQgaGFyZGlmX3JlbW92ZV9pbnRlcmZhY2VzKHZvaWQpOworaW50IGhhcmRpZl9hZGRfaW50ZXJmYWNlKGNoYXIgKmRldiwgaW50IGlmX251bSk7Cit2b2lkIGhhcmRpZl9kZWFjdGl2YXRlX2ludGVyZmFjZShzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpOworY2hhciBoYXJkaWZfZ2V0X2FjdGl2ZV9pZl9udW0odm9pZCk7Cit2b2lkIGhhcmRpZl9jaGVja19pbnRlcmZhY2VzX3N0YXR1cyh2b2lkKTsKK3ZvaWQgaGFyZGlmX2NoZWNrX2ludGVyZmFjZXNfc3RhdHVzX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitpbnQgaGFyZGlmX21pbl9tdHUodm9pZCk7Cit2b2lkIHVwZGF0ZV9taW5fbXR1KHZvaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFzaC5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxY2I0YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXNoLmMKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIFNpbW9uIFd1bmRlcmxpY2gsIE1hcmVrIExpbmRuZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgImhhc2guaCIKKworLyogY2xlYXJzIHRoZSBoYXNoICovCit2b2lkIGhhc2hfaW5pdChzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gpCit7CisJaW50IGk7CisKKwloYXNoLT5lbGVtZW50cyA9IDA7CisKKwlmb3IgKGkgPSAwIDsgaSA8IGhhc2gtPnNpemU7IGkrKykKKwkJaGFzaC0+dGFibGVbaV0gPSBOVUxMOworfQorCisvKiByZW1vdmUgdGhlIGhhc2ggc3RydWN0dXJlLiBpZiBoYXNoZGF0YV9mcmVlX2NiICE9IE5VTEwsIHRoaXMgZnVuY3Rpb24gd2lsbCBiZQorICogY2FsbGVkIHRvIHJlbW92ZSB0aGUgZWxlbWVudHMgaW5zaWRlIG9mIHRoZSBoYXNoLiAgaWYgeW91IGRvbid0IHJlbW92ZSB0aGUKKyAqIGVsZW1lbnRzLCBtZW1vcnkgbWlnaHQgYmUgbGVha2VkLiAqLwordm9pZCBoYXNoX2RlbGV0ZShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIGhhc2hkYXRhX2ZyZWVfY2IgZnJlZV9jYikKK3sKKwlzdHJ1Y3QgZWxlbWVudF90ICpidWNrZXQsICpsYXN0X2J1Y2tldDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBoYXNoLT5zaXplOyBpKyspIHsKKwkJYnVja2V0ID0gaGFzaC0+dGFibGVbaV07CisKKwkJd2hpbGUgKGJ1Y2tldCAhPSBOVUxMKSB7CisJCQlpZiAoZnJlZV9jYiAhPSBOVUxMKQorCQkJCWZyZWVfY2IoYnVja2V0LT5kYXRhKTsKKworCQkJbGFzdF9idWNrZXQgPSBidWNrZXQ7CisJCQlidWNrZXQgPSBidWNrZXQtPm5leHQ7CisJCQlrZnJlZShsYXN0X2J1Y2tldCk7CisJCX0KKwl9CisKKwloYXNoX2Rlc3Ryb3koaGFzaCk7Cit9CisKKy8qIGZyZWUgb25seSB0aGUgaGFzaHRhYmxlIGFuZCB0aGUgaGFzaCBpdHNlbGYuICovCit2b2lkIGhhc2hfZGVzdHJveShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gpCit7CisJa2ZyZWUoaGFzaC0+dGFibGUpOworCWtmcmVlKGhhc2gpOworfQorCisvKiBpdGVyYXRlIHRob3VnaCB0aGUgaGFzaC4gZmlyc3QgZWxlbWVudCBpcyBzZWxlY3RlZCB3aXRoIGl0ZXJfaW4gTlVMTC4gIHVzZQorICogdGhlIHJldHVybmVkIGl0ZXJhdG9yIHRvIGFjY2VzcyB0aGUgZWxlbWVudHMgdW50aWwgaGFzaF9pdF90IHJldHVybnMgTlVMTC4gKi8KK3N0cnVjdCBoYXNoX2l0X3QgKmhhc2hfaXRlcmF0ZShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsCisJCQkgICAgICAgc3RydWN0IGhhc2hfaXRfdCAqaXRlcl9pbikKK3sKKwlzdHJ1Y3QgaGFzaF9pdF90ICppdGVyOworCisJaWYgKCFoYXNoKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChpdGVyX2luID09IE5VTEwpIHsKKwkJaXRlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBoYXNoX2l0X3QpLCBHRlBfQVRPTUlDKTsKKwkJaXRlci0+aW5kZXggPSAtMTsKKwkJaXRlci0+YnVja2V0ID0gTlVMTDsKKwkJaXRlci0+cHJldl9idWNrZXQgPSBOVUxMOworCX0gZWxzZSB7CisJCWl0ZXIgPSBpdGVyX2luOworCX0KKworCS8qIHNhbml0eSBjaGVja3MgZmlyc3QgKGlmIG91ciBidWNrZXQgZ290IGRlbGV0ZWQgaW4gdGhlIGxhc3QKKwkgKiBpdGVyYXRpb24pOiAqLworCWlmIChpdGVyLT5idWNrZXQgIT0gTlVMTCkgeworCQlpZiAoaXRlci0+Zmlyc3RfYnVja2V0ICE9IE5VTEwpIHsKKwkJCS8qIHdlJ3JlIG9uIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBpdCBnb3QgcmVtb3ZlZCBhZnRlcgorCQkJICogdGhlIGxhc3QgaXRlcmF0aW9uLiAqLworCQkJaWYgKCgqaXRlci0+Zmlyc3RfYnVja2V0KSAhPSBpdGVyLT5idWNrZXQpIHsKKwkJCQkvKiB0aGVyZSBhcmUgc3RpbGwgb3RoZXIgZWxlbWVudHMgaW4gdGhlIGxpc3QgKi8KKwkJCQlpZiAoKCppdGVyLT5maXJzdF9idWNrZXQpICE9IE5VTEwpIHsKKwkJCQkJaXRlci0+cHJldl9idWNrZXQgPSBOVUxMOworCQkJCQlpdGVyLT5idWNrZXQgPSAoKml0ZXItPmZpcnN0X2J1Y2tldCk7CisJCQkJCWl0ZXItPmZpcnN0X2J1Y2tldCA9CisJCQkJCQkmaGFzaC0+dGFibGVbaXRlci0+aW5kZXhdOworCQkJCQlyZXR1cm4gaXRlcjsKKwkJCQl9IGVsc2UgeworCQkJCQlpdGVyLT5idWNrZXQgPSBOVUxMOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChpdGVyLT5wcmV2X2J1Y2tldCAhPSBOVUxMKSB7CisJCQkvKgorCQkJKiB3ZSdyZSBub3Qgb24gdGhlIGZpcnN0IGVsZW1lbnQsIGFuZCB0aGUgYnVja2V0IGdvdAorCQkJKiByZW1vdmVkIGFmdGVyIHRoZSBsYXN0IGl0ZXJhdGlvbi4gIHRoZSBsYXN0IGJ1Y2tldCdzCisJCQkqIG5leHQgcG9pbnRlciBpcyBub3QgcG9pbnRpbmcgdG8gb3VyIGFjdHVhbCBidWNrZXQKKwkJCSogYW55bW9yZS4gIHNlbGVjdCB0aGUgbmV4dC4KKwkJCSovCisJCQlpZiAoaXRlci0+cHJldl9idWNrZXQtPm5leHQgIT0gaXRlci0+YnVja2V0KQorCQkJCWl0ZXItPmJ1Y2tldCA9IGl0ZXItPnByZXZfYnVja2V0OworCQl9CisJfQorCisJLyogbm93IGFzIHdlIGFyZSBzYW5lLCBzZWxlY3QgdGhlIG5leHQgb25lIGlmIHRoZXJlIGlzIHNvbWUgKi8KKwlpZiAoaXRlci0+YnVja2V0ICE9IE5VTEwpIHsKKwkJaWYgKGl0ZXItPmJ1Y2tldC0+bmV4dCAhPSBOVUxMKSB7CisJCQlpdGVyLT5wcmV2X2J1Y2tldCA9IGl0ZXItPmJ1Y2tldDsKKwkJCWl0ZXItPmJ1Y2tldCA9IGl0ZXItPmJ1Y2tldC0+bmV4dDsKKwkJCWl0ZXItPmZpcnN0X2J1Y2tldCA9IE5VTEw7CisJCQlyZXR1cm4gaXRlcjsKKwkJfQorCX0KKworCS8qIGlmIG5vdCByZXR1cm5lZCB5ZXQsIHdlJ3ZlIHJlYWNoZWQgdGhlIGxhc3Qgb25lIG9uIHRoZSBpbmRleCBhbmQgaGF2ZQorCSAqIHRvIHNlYXJjaCBmb3J3YXJkICovCisJaXRlci0+aW5kZXgrKzsKKwkvKiBnbyB0aHJvdWdoIHRoZSBlbnRyaWVzIG9mIHRoZSBoYXNoIHRhYmxlICovCisJd2hpbGUgKGl0ZXItPmluZGV4IDwgaGFzaC0+c2l6ZSkgeworCQlpZiAoKGhhc2gtPnRhYmxlW2l0ZXItPmluZGV4XSkgIT0gTlVMTCkgeworCQkJaXRlci0+cHJldl9idWNrZXQgPSBOVUxMOworCQkJaXRlci0+YnVja2V0ID0gaGFzaC0+dGFibGVbaXRlci0+aW5kZXhdOworCQkJaXRlci0+Zmlyc3RfYnVja2V0ID0gJmhhc2gtPnRhYmxlW2l0ZXItPmluZGV4XTsKKwkJCXJldHVybiBpdGVyOworCQl9IGVsc2UgeworCQkJaXRlci0+aW5kZXgrKzsKKwkJfQorCX0KKworCS8qIG5vdGhpbmcgdG8gaXRlcmF0ZSBvdmVyIGFueW1vcmUgKi8KKwlrZnJlZShpdGVyKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogYWxsb2NhdGVzIGFuZCBjbGVhcnMgdGhlIGhhc2ggKi8KK3N0cnVjdCBoYXNodGFibGVfdCAqaGFzaF9uZXcoaW50IHNpemUsIGhhc2hkYXRhX2NvbXBhcmVfY2IgY29tcGFyZSwKKwkJCSAgICAgaGFzaGRhdGFfY2hvb3NlX2NiIGNob29zZSkKK3sKKwlzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2g7CisKKwloYXNoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhhc2h0YWJsZV90KSAsIEdGUF9BVE9NSUMpOworCisJaWYgKGhhc2ggPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwloYXNoLT5zaXplID0gc2l6ZTsKKwloYXNoLT50YWJsZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlbGVtZW50X3QgKikgKiBzaXplLCBHRlBfQVRPTUlDKTsKKworCWlmIChoYXNoLT50YWJsZSA9PSBOVUxMKSB7CisJCWtmcmVlKGhhc2gpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwloYXNoX2luaXQoaGFzaCk7CisKKwloYXNoLT5jb21wYXJlID0gY29tcGFyZTsKKwloYXNoLT5jaG9vc2UgPSBjaG9vc2U7CisKKwlyZXR1cm4gaGFzaDsKK30KKworLyogYWRkcyBkYXRhIHRvIHRoZSBoYXNodGFibGUuIHJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAqLworaW50IGhhc2hfYWRkKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgaW5kZXg7CisJc3RydWN0IGVsZW1lbnRfdCAqYnVja2V0LCAqcHJldl9idWNrZXQgPSBOVUxMOworCisJaWYgKCFoYXNoKQorCQlyZXR1cm4gLTE7CisKKwlpbmRleCA9IGhhc2gtPmNob29zZShkYXRhLCBoYXNoLT5zaXplKTsKKwlidWNrZXQgPSBoYXNoLT50YWJsZVtpbmRleF07CisKKwl3aGlsZSAoYnVja2V0ICE9IE5VTEwpIHsKKwkJaWYgKGhhc2gtPmNvbXBhcmUoYnVja2V0LT5kYXRhLCBkYXRhKSkKKwkJCXJldHVybiAtMTsKKworCQlwcmV2X2J1Y2tldCA9IGJ1Y2tldDsKKwkJYnVja2V0ID0gYnVja2V0LT5uZXh0OworCX0KKworCS8qIGZvdW5kIHRoZSB0YWlsIG9mIHRoZSBsaXN0LCBhZGQgbmV3IGVsZW1lbnQgKi8KKwlidWNrZXQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWxlbWVudF90KSwgR0ZQX0FUT01JQyk7CisKKwlpZiAoYnVja2V0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWJ1Y2tldC0+ZGF0YSA9IGRhdGE7CisJYnVja2V0LT5uZXh0ID0gTlVMTDsKKworCS8qIGFuZCBsaW5rIGl0ICovCisJaWYgKHByZXZfYnVja2V0ID09IE5VTEwpCisJCWhhc2gtPnRhYmxlW2luZGV4XSA9IGJ1Y2tldDsKKwllbHNlCisJCXByZXZfYnVja2V0LT5uZXh0ID0gYnVja2V0OworCisJaGFzaC0+ZWxlbWVudHMrKzsKKwlyZXR1cm4gMDsKK30KKworLyogZmluZHMgZGF0YSwgYmFzZWQgb24gdGhlIGtleSBpbiBrZXlkYXRhLiByZXR1cm5zIHRoZSBmb3VuZCBkYXRhIG9uIHN1Y2Nlc3MsCisgKiBvciBOVUxMIG9uIGVycm9yICovCit2b2lkICpoYXNoX2ZpbmQoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCB2b2lkICprZXlkYXRhKQoreworCWludCBpbmRleDsKKwlzdHJ1Y3QgZWxlbWVudF90ICpidWNrZXQ7CisKKwlpZiAoIWhhc2gpCisJCXJldHVybiBOVUxMOworCisJaW5kZXggPSBoYXNoLT5jaG9vc2Uoa2V5ZGF0YSAsIGhhc2gtPnNpemUpOworCWJ1Y2tldCA9IGhhc2gtPnRhYmxlW2luZGV4XTsKKworCXdoaWxlIChidWNrZXQgIT0gTlVMTCkgeworCQlpZiAoaGFzaC0+Y29tcGFyZShidWNrZXQtPmRhdGEsIGtleWRhdGEpKQorCQkJcmV0dXJuIGJ1Y2tldC0+ZGF0YTsKKworCQlidWNrZXQgPSBidWNrZXQtPm5leHQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIHJlbW92ZSBidWNrZXQgKHRoaXMgbWlnaHQgYmUgdXNlZCBpbiBoYXNoX2l0ZXJhdGUoKSBpZiB5b3UgYWxyZWFkeSBmb3VuZCB0aGUKKyAqIGJ1Y2tldCB5b3Ugd2FudCB0byBkZWxldGUgYW5kIGRvbid0IG5lZWQgdGhlIG92ZXJoZWFkIHRvIGZpbmQgaXQgYWdhaW4gd2l0aAorICogaGFzaF9yZW1vdmUoKS4gQnV0IHVzdWFsbHksIHlvdSBkb24ndCB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uLCBhcyBpdAorICogZmlkZGxlcyB3aXRoIGhhc2gtaW50ZXJuYWxzLiAqLwordm9pZCAqaGFzaF9yZW1vdmVfYnVja2V0KHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgc3RydWN0IGhhc2hfaXRfdCAqaGFzaF9pdF90KQoreworCXZvaWQgKmRhdGFfc2F2ZTsKKworCWRhdGFfc2F2ZSA9IGhhc2hfaXRfdC0+YnVja2V0LT5kYXRhOworCisJaWYgKGhhc2hfaXRfdC0+cHJldl9idWNrZXQgIT0gTlVMTCkKKwkJaGFzaF9pdF90LT5wcmV2X2J1Y2tldC0+bmV4dCA9IGhhc2hfaXRfdC0+YnVja2V0LT5uZXh0OworCWVsc2UgaWYgKGhhc2hfaXRfdC0+Zmlyc3RfYnVja2V0ICE9IE5VTEwpCisJCSgqaGFzaF9pdF90LT5maXJzdF9idWNrZXQpID0gaGFzaF9pdF90LT5idWNrZXQtPm5leHQ7CisKKwlrZnJlZShoYXNoX2l0X3QtPmJ1Y2tldCk7CisJaGFzaC0+ZWxlbWVudHMtLTsKKworCXJldHVybiBkYXRhX3NhdmU7Cit9CisKKy8qIHJlbW92ZXMgZGF0YSBmcm9tIGhhc2gsIGlmIGZvdW5kLiByZXR1cm5zIHBvaW50ZXIgZG8gZGF0YSBvbiBzdWNjZXNzLCBzbyB5b3UKKyAqIGNhbiByZW1vdmUgdGhlIHVzZWQgc3RydWN0dXJlIHlvdXJzZWxmLCBvciBOVUxMIG9uIGVycm9yIC4gIGRhdGEgY291bGQgYmUgdGhlCisgKiBzdHJ1Y3R1cmUgeW91IHVzZSB3aXRoIGp1c3QgdGhlIGtleSBmaWxsZWQsIHdlIGp1c3QgbmVlZCB0aGUga2V5IGZvcgorICogY29tcGFyaW5nLiAqLwordm9pZCAqaGFzaF9yZW1vdmUoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBoYXNoX2l0X3QgaGFzaF9pdF90OworCisJaGFzaF9pdF90LmluZGV4ID0gaGFzaC0+Y2hvb3NlKGRhdGEsIGhhc2gtPnNpemUpOworCWhhc2hfaXRfdC5idWNrZXQgPSBoYXNoLT50YWJsZVtoYXNoX2l0X3QuaW5kZXhdOworCWhhc2hfaXRfdC5wcmV2X2J1Y2tldCA9IE5VTEw7CisKKwl3aGlsZSAoaGFzaF9pdF90LmJ1Y2tldCAhPSBOVUxMKSB7CisJCWlmIChoYXNoLT5jb21wYXJlKGhhc2hfaXRfdC5idWNrZXQtPmRhdGEsIGRhdGEpKSB7CisJCQloYXNoX2l0X3QuZmlyc3RfYnVja2V0ID0KKwkJCQkoaGFzaF9pdF90LmJ1Y2tldCA9PQorCQkJCSBoYXNoLT50YWJsZVtoYXNoX2l0X3QuaW5kZXhdID8KKwkJCQkgJmhhc2gtPnRhYmxlW2hhc2hfaXRfdC5pbmRleF0gOiBOVUxMKTsKKwkJCXJldHVybiBoYXNoX3JlbW92ZV9idWNrZXQoaGFzaCwgJmhhc2hfaXRfdCk7CisJCX0KKworCQloYXNoX2l0X3QucHJldl9idWNrZXQgPSBoYXNoX2l0X3QuYnVja2V0OworCQloYXNoX2l0X3QuYnVja2V0ID0gaGFzaF9pdF90LmJ1Y2tldC0+bmV4dDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogcmVzaXplIHRoZSBoYXNoLCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBuZXcgaGFzaCBvciBOVUxMIG9uCisgKiBlcnJvci4gcmVtb3ZlcyB0aGUgb2xkIGhhc2ggb24gc3VjY2Vzcy4gKi8KK3N0cnVjdCBoYXNodGFibGVfdCAqaGFzaF9yZXNpemUoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgaGFzaHRhYmxlX3QgKm5ld19oYXNoOworCXN0cnVjdCBlbGVtZW50X3QgKmJ1Y2tldDsKKwlpbnQgaTsKKworCS8qIGluaXRpYWxpemUgYSBuZXcgaGFzaCB3aXRoIHRoZSBuZXcgc2l6ZSAqLworCW5ld19oYXNoID0gaGFzaF9uZXcoc2l6ZSwgaGFzaC0+Y29tcGFyZSwgaGFzaC0+Y2hvb3NlKTsKKworCWlmIChuZXdfaGFzaCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGNvcHkgdGhlIGVsZW1lbnRzICovCisJZm9yIChpID0gMDsgaSA8IGhhc2gtPnNpemU7IGkrKykgeworCQlidWNrZXQgPSBoYXNoLT50YWJsZVtpXTsKKworCQl3aGlsZSAoYnVja2V0ICE9IE5VTEwpIHsKKwkJCWhhc2hfYWRkKG5ld19oYXNoLCBidWNrZXQtPmRhdGEpOworCQkJYnVja2V0ID0gYnVja2V0LT5uZXh0OworCQl9CisJfQorCisJLyogcmVtb3ZlIGhhc2ggYW5kIGV2ZW50dWFsIG92ZXJmbG93IGJ1Y2tldHMgYnV0IG5vdCB0aGUgY29udGVudAorCSAqIGl0c2VsZi4gKi8KKwloYXNoX2RlbGV0ZShoYXNoLCBOVUxMKTsKKworCXJldHVybiBuZXdfaGFzaDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhc2guaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjYwZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFzaC5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIFNpbW9uIFd1bmRlcmxpY2gsIE1hcmVrIExpbmRuZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaWZuZGVmIF9CQVRNQU5fSEFTSF9ICisjZGVmaW5lIF9CQVRNQU5fSEFTSF9ICisKK3R5cGVkZWYgaW50ICgqaGFzaGRhdGFfY29tcGFyZV9jYikodm9pZCAqLCB2b2lkICopOwordHlwZWRlZiBpbnQgKCpoYXNoZGF0YV9jaG9vc2VfY2IpKHZvaWQgKiwgaW50KTsKK3R5cGVkZWYgdm9pZCAoKmhhc2hkYXRhX2ZyZWVfY2IpKHZvaWQgKik7CisKK3N0cnVjdCBlbGVtZW50X3QgeworCXZvaWQgKmRhdGE7CQkvKiBwb2ludGVyIHRvIHRoZSBkYXRhICovCisJc3RydWN0IGVsZW1lbnRfdCAqbmV4dDsJLyogb3ZlcmZsb3cgYnVja2V0IHBvaW50ZXIgKi8KK307CisKK3N0cnVjdCBoYXNoX2l0X3QgeworCWludCBpbmRleDsKKwlzdHJ1Y3QgZWxlbWVudF90ICpidWNrZXQ7CisJc3RydWN0IGVsZW1lbnRfdCAqcHJldl9idWNrZXQ7CisJc3RydWN0IGVsZW1lbnRfdCAqKmZpcnN0X2J1Y2tldDsKK307CisKK3N0cnVjdCBoYXNodGFibGVfdCB7CisJc3RydWN0IGVsZW1lbnRfdCAqKnRhYmxlOyAgIC8qIHRoZSBoYXNodGFibGUgaXRzZWxmLCB3aXRoIHRoZSBidWNrZXRzICovCisJaW50IGVsZW1lbnRzOwkJICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyByZWdpc3RlcmVkICovCisJaW50IHNpemU7CQkgICAgLyogc2l6ZSBvZiBoYXNodGFibGUgKi8KKwloYXNoZGF0YV9jb21wYXJlX2NiIGNvbXBhcmU7LyogY2FsbGJhY2sgdG8gYSBjb21wYXJlIGZ1bmN0aW9uLiAgc2hvdWxkCisJCQkJICAgICAqIGNvbXBhcmUgMiBlbGVtZW50IGRhdGFzIGZvciB0aGVpciBrZXlzLAorCQkJCSAgICAgKiByZXR1cm4gMCBpZiBzYW1lIGFuZCBub3QgMCBpZiBub3QKKwkJCQkgICAgICogc2FtZSAqLworCWhhc2hkYXRhX2Nob29zZV9jYiBjaG9vc2U7ICAvKiB0aGUgaGFzaGZ1bmN0aW9uLCBzaG91bGQgcmV0dXJuIGFuIGluZGV4CisJCQkJICAgICAqIGJhc2VkIG9uIHRoZSBrZXkgaW4gdGhlIGRhdGEgb2YgdGhlIGZpcnN0CisJCQkJICAgICAqIGFyZ3VtZW50IGFuZCB0aGUgc2l6ZSB0aGUgc2Vjb25kICovCit9OworCisvKiBjbGVhcnMgdGhlIGhhc2ggKi8KK3ZvaWQgaGFzaF9pbml0KHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCk7CisKKy8qIGFsbG9jYXRlcyBhbmQgY2xlYXJzIHRoZSBoYXNoICovCitzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2hfbmV3KGludCBzaXplLCBoYXNoZGF0YV9jb21wYXJlX2NiIGNvbXBhcmUsCisJCQkgICAgIGhhc2hkYXRhX2Nob29zZV9jYiBjaG9vc2UpOworCisvKiByZW1vdmUgYnVja2V0ICh0aGlzIG1pZ2h0IGJlIHVzZWQgaW4gaGFzaF9pdGVyYXRlKCkgaWYgeW91IGFscmVhZHkgZm91bmQgdGhlCisgKiBidWNrZXQgeW91IHdhbnQgdG8gZGVsZXRlIGFuZCBkb24ndCBuZWVkIHRoZSBvdmVyaGVhZCB0byBmaW5kIGl0IGFnYWluIHdpdGgKKyAqIGhhc2hfcmVtb3ZlKCkuICBCdXQgdXN1YWxseSwgeW91IGRvbid0IHdhbnQgdG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzIGl0CisgKiBmaWRkbGVzIHdpdGggaGFzaC1pbnRlcm5hbHMuICovCit2b2lkICpoYXNoX3JlbW92ZV9idWNrZXQoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCBzdHJ1Y3QgaGFzaF9pdF90ICpoYXNoX2l0X3QpOworCisvKiByZW1vdmUgdGhlIGhhc2ggc3RydWN0dXJlLiBpZiBoYXNoZGF0YV9mcmVlX2NiICE9IE5VTEwsIHRoaXMgZnVuY3Rpb24gd2lsbCBiZQorICogY2FsbGVkIHRvIHJlbW92ZSB0aGUgZWxlbWVudHMgaW5zaWRlIG9mIHRoZSBoYXNoLiAgaWYgeW91IGRvbid0IHJlbW92ZSB0aGUKKyAqIGVsZW1lbnRzLCBtZW1vcnkgbWlnaHQgYmUgbGVha2VkLiAqLwordm9pZCBoYXNoX2RlbGV0ZShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIGhhc2hkYXRhX2ZyZWVfY2IgZnJlZV9jYik7CisKKy8qIGZyZWUgb25seSB0aGUgaGFzaHRhYmxlIGFuZCB0aGUgaGFzaCBpdHNlbGYuICovCit2b2lkIGhhc2hfZGVzdHJveShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gpOworCisvKiBhZGRzIGRhdGEgdG8gdGhlIGhhc2h0YWJsZS4gcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICovCitpbnQgaGFzaF9hZGQoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCB2b2lkICpkYXRhKTsKKworLyogcmVtb3ZlcyBkYXRhIGZyb20gaGFzaCwgaWYgZm91bmQuIHJldHVybnMgcG9pbnRlciBkbyBkYXRhIG9uIHN1Y2Nlc3MsIHNvIHlvdQorICogY2FuIHJlbW92ZSB0aGUgdXNlZCBzdHJ1Y3R1cmUgeW91cnNlbGYsIG9yIE5VTEwgb24gZXJyb3IgLiAgZGF0YSBjb3VsZCBiZSB0aGUKKyAqIHN0cnVjdHVyZSB5b3UgdXNlIHdpdGgganVzdCB0aGUga2V5IGZpbGxlZCwgd2UganVzdCBuZWVkIHRoZSBrZXkgZm9yCisgKiBjb21wYXJpbmcuICovCit2b2lkICpoYXNoX3JlbW92ZShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIHZvaWQgKmRhdGEpOworCisvKiBmaW5kcyBkYXRhLCBiYXNlZCBvbiB0aGUga2V5IGluIGtleWRhdGEuIHJldHVybnMgdGhlIGZvdW5kIGRhdGEgb24gc3VjY2VzcywKKyAqIG9yIE5VTEwgb24gZXJyb3IgKi8KK3ZvaWQgKmhhc2hfZmluZChzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIHZvaWQgKmtleWRhdGEpOworCisvKiByZXNpemUgdGhlIGhhc2gsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIG5ldyBoYXNoIG9yIE5VTEwgb24KKyAqIGVycm9yLiByZW1vdmVzIHRoZSBvbGQgaGFzaCBvbiBzdWNjZXNzICovCitzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2hfcmVzaXplKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgaW50IHNpemUpOworCisvKiBpdGVyYXRlIHRob3VnaCB0aGUgaGFzaC4gZmlyc3QgZWxlbWVudCBpcyBzZWxlY3RlZCB3aXRoIGl0ZXJfaW4gTlVMTC4gIHVzZQorICogdGhlIHJldHVybmVkIGl0ZXJhdG9yIHRvIGFjY2VzcyB0aGUgZWxlbWVudHMgdW50aWwgaGFzaF9pdF90IHJldHVybnMgTlVMTC4gKi8KK3N0cnVjdCBoYXNoX2l0X3QgKmhhc2hfaXRlcmF0ZShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsCisJCQkgICAgICAgc3RydWN0IGhhc2hfaXRfdCAqaXRlcl9pbik7CisKKy8qIHByaW50IHRoZSBoYXNoIHRhYmxlIGZvciBkZWJ1Z2dpbmcgKi8KK3ZvaWQgaGFzaF9kZWJ1ZyhzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9sb2cuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2xvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzN2M3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9sb2cuYwpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAibG9nLmgiCisKKyNkZWZpbmUgTE9HX0JVRl9NQVNLIChsb2dfYnVmX2xlbi0xKQorI2RlZmluZSBMT0dfQlVGKGlkeCkgKGxvZ19idWZbKGlkeCkgJiBMT0dfQlVGX01BU0tdKQorCitzdGF0aWMgY2hhciBsb2dfYnVmW0xPR19CVUZfTEVOXTsKK3N0YXRpYyBpbnQgbG9nX2J1Zl9sZW4gPSBMT0dfQlVGX0xFTjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvZ19zdGFydDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvZ19lbmQ7Cit1aW50OF90IGxvZ19sZXZlbDsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhsb2didWZfbG9jayk7CisKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19sb2dfb3BlcmF0aW9ucyA9IHsKKwkub3BlbiAgICAgICAgICAgPSBsb2dfb3BlbiwKKwkucmVsZWFzZSAgICAgICAgPSBsb2dfcmVsZWFzZSwKKwkucmVhZCAgICAgICAgICAgPSBsb2dfcmVhZCwKKwkud3JpdGUgICAgICAgICAgPSBsb2dfd3JpdGUsCisJLnBvbGwgICAgICAgICAgID0gbG9nX3BvbGwsCit9OworCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobG9nX3dhaXQpOworCitzdGF0aWMgdm9pZCBlbWl0X2xvZ19jaGFyKGNoYXIgYykKK3sKKwlMT0dfQlVGKGxvZ19lbmQpID0gYzsKKwlsb2dfZW5kKys7CisKKwlpZiAobG9nX2VuZCAtIGxvZ19zdGFydCA+IGxvZ19idWZfbGVuKQorCQlsb2dfc3RhcnQgPSBsb2dfZW5kIC0gbG9nX2J1Zl9sZW47Cit9CisKK3N0YXRpYyBpbnQgZmRlYnVnX2xvZyhjaGFyICpmbXQsIC4uLikKK3sKKwlpbnQgcHJpbnRlZF9sZW47CisJY2hhciAqcDsKKwl2YV9saXN0IGFyZ3M7CisJc3RhdGljIGNoYXIgZGVidWdfbG9nX2J1ZlsyNTZdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9nYnVmX2xvY2ssIGZsYWdzKTsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXByaW50ZWRfbGVuID0gdnNjbnByaW50ZihkZWJ1Z19sb2dfYnVmLCBzaXplb2YoZGVidWdfbG9nX2J1ZiksIGZtdCwKKwkJCQkgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJZm9yIChwID0gZGVidWdfbG9nX2J1ZjsgKnAgIT0gMDsgcCsrKQorCQllbWl0X2xvZ19jaGFyKCpwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvZ2J1Zl9sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwKCZsb2dfd2FpdCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRlYnVnX2xvZyhpbnQgdHlwZSwgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCByZXR2YWwgPSAwOworCWNoYXIgdG1wX2xvZ19idWZbMjU2XTsKKworCS8qIG9ubHkgY3JpdGljYWwgaW5mb3JtYXRpb24gZ2V0IGludG8gdGhlIG9mZmljaWFsIGtlcm5lbCBsb2cgKi8KKwlpZiAodHlwZSA9PSBMT0dfVFlQRV9DUklUKSB7CisJCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJCXZzY25wcmludGYodG1wX2xvZ19idWYsIHNpemVvZih0bXBfbG9nX2J1ZiksIGZtdCwgYXJncyk7CisJCXByaW50ayhLRVJOX0VSUiAiYmF0bWFuLWFkdjogJXMiLCB0bXBfbG9nX2J1Zik7CisJCXZhX2VuZChhcmdzKTsKKwl9CisKKwlpZiAoKHR5cGUgPT0gTE9HX1RZUEVfQ1JJVCkgfHwgKGxvZ19sZXZlbCAmIHR5cGUpKSB7CisJCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJCXZzY25wcmludGYodG1wX2xvZ19idWYsIHNpemVvZih0bXBfbG9nX2J1ZiksIGZtdCwgYXJncyk7CisJCWZkZWJ1Z19sb2coIlslMTB1XSAlcyIsIChqaWZmaWVzIC8gSFopLCB0bXBfbG9nX2J1Zik7CisJCXZhX2VuZChhcmdzKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgbG9nX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW5jX21vZHVsZV9jb3VudCgpOworCXJldHVybiAwOworfQorCitpbnQgbG9nX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZGVjX21vZHVsZV9jb3VudCgpOworCXJldHVybiAwOworfQorCitzc2l6ZV90IGxvZ19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCSBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGVycm9yLCBpID0gMDsKKwljaGFyIGM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spICYmICEobG9nX2VuZCAtIGxvZ19zdGFydCkpCisJCXJldHVybiAtRUFHQUlOOworCisJaWYgKCghYnVmKSB8fCAoY291bnQgPCAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVycm9yID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGxvZ193YWl0LCAobG9nX3N0YXJ0IC0gbG9nX2VuZCkpOworCisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9nYnVmX2xvY2ssIGZsYWdzKTsKKworCXdoaWxlICgoIWVycm9yKSAmJiAobG9nX3N0YXJ0ICE9IGxvZ19lbmQpICYmIChpIDwgY291bnQpKSB7CisJCWMgPSBMT0dfQlVGKGxvZ19zdGFydCk7CisKKwkJbG9nX3N0YXJ0Kys7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9nYnVmX2xvY2ssIGZsYWdzKTsKKworCQllcnJvciA9IF9fcHV0X3VzZXIoYywgYnVmKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9nYnVmX2xvY2ssIGZsYWdzKTsKKworCQlidWYrKzsKKwkJaSsrOworCisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9nYnVmX2xvY2ssIGZsYWdzKTsKKworCWlmICghZXJyb3IpCisJCXJldHVybiBpOworCisJcmV0dXJuIGVycm9yOworfQorCitzc2l6ZV90IGxvZ193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkgIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gY291bnQ7Cit9CisKK3Vuc2lnbmVkIGludCBsb2dfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlwb2xsX3dhaXQoZmlsZSwgJmxvZ193YWl0LCB3YWl0KTsKKworCWlmIChsb2dfZW5kIC0gbG9nX3N0YXJ0KQorCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvbG9nLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODBlM2FiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvbG9nLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfbG9nX29wZXJhdGlvbnM7CitleHRlcm4gdWludDhfdCBsb2dfbGV2ZWw7CisKK2ludCBkZWJ1Z19sb2coaW50IHR5cGUsIGNoYXIgKmZtdCwgLi4uKTsKK2ludCBsb2dfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitpbnQgbG9nX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3NpemVfdCBsb2dfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkgbG9mZl90ICpwcG9zKTsKK3NzaXplX3QgbG9nX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCSAgbG9mZl90ICpwcG9zKTsKK3Vuc2lnbmVkIGludCBsb2dfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4OWJmYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L21haW4uYwpAQCAtMCwwICsxLDI4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAicHJvYy5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInJvdXRpbmcuaCIKKyNpbmNsdWRlICJzZW5kLmgiCisjaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJkZXZpY2UuaCIKKyNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgorI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJ2aXMuaCIKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisKK3N0cnVjdCBsaXN0X2hlYWQgaWZfbGlzdDsKK3N0cnVjdCBobGlzdF9oZWFkIGZvcndfYmF0X2xpc3Q7CitzdHJ1Y3QgaGxpc3RfaGVhZCBmb3J3X2JjYXN0X2xpc3Q7CitzdHJ1Y3QgaGFzaHRhYmxlX3QgKm9yaWdfaGFzaDsKKworREVGSU5FX1NQSU5MT0NLKG9yaWdfaGFzaF9sb2NrKTsKK0RFRklORV9TUElOTE9DSyhmb3J3X2JhdF9saXN0X2xvY2spOworREVGSU5FX1NQSU5MT0NLKGZvcndfYmNhc3RfbGlzdF9sb2NrKTsKKworYXRvbWljX3Qgb3JpZ2luYXRvcl9pbnRlcnZhbDsKK2F0b21pY190IHZpc19pbnRlcnZhbDsKK2F0b21pY190IGFnZ3JlZ2F0aW9uX2VuYWJsZWQ7CitpbnQxNl90IG51bV9obmE7CitpbnQxNl90IG51bV9pZnM7CisKK3N0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2RldmljZTsKKworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqa3RocmVhZF90YXNrOworCit1bnNpZ25lZCBjaGFyIGJyb2FkY2FzdEFkZHJbXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKK2F0b21pY190IG1vZHVsZV9zdGF0ZTsKKworc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJhdF9ldmVudF93b3JrcXVldWU7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlJTklUX0xJU1RfSEVBRCgmaWZfbGlzdCk7CisJSU5JVF9ITElTVF9IRUFEKCZmb3J3X2JhdF9saXN0KTsKKwlJTklUX0hMSVNUX0hFQUQoJmZvcndfYmNhc3RfbGlzdCk7CisKKwlhdG9taWNfc2V0KCZtb2R1bGVfc3RhdGUsIE1PRFVMRV9JTkFDVElWRSk7CisKKwlhdG9taWNfc2V0KCZvcmlnaW5hdG9yX2ludGVydmFsLCAxMDAwKTsKKwlhdG9taWNfc2V0KCZ2aXNfaW50ZXJ2YWwsIDEwMDApOy8qIFRPRE86IHJhaXNlIHRoaXMgbGF0ZXIsIHRoaXMgaXMgb25seQorCQkJCQkgKiBmb3IgZGVidWdnaW5nIG5vdy4gKi8KKwlhdG9taWNfc2V0KCZhZ2dyZWdhdGlvbl9lbmFibGVkLCAxKTsKKworCS8qIHRoZSBuYW1lIHNob3VsZCBub3QgYmUgbG9uZ2VyIHRoYW4gMTAgY2hhcnMgLSBzZWUKKwkgKiBodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yMzYzNC8gKi8KKwliYXRfZXZlbnRfd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImJhdF9ldmVudHMiKTsKKworCWlmICghYmF0X2V2ZW50X3dvcmtxdWV1ZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR2YWwgPSBzZXR1cF9wcm9jZnMoKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWJhdF9kZXZpY2VfaW5pdCgpOworCisJLyogaW5pdGlhbGl6ZSBsYXllciAyIGludGVyZmFjZSAqLworCXNvZnRfZGV2aWNlID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgYmF0X3ByaXYpICwgImJhdCVkIiwKKwkJCQkgICBpbnRlcmZhY2Vfc2V0dXApOworCisJaWYgKCFzb2Z0X2RldmljZSkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwgIlVuYWJsZSB0byBhbGxvY2F0ZSB0aGUgYmF0bWFuIGludGVyZmFjZVxuIik7CisJCWdvdG8gZW5kOworCX0KKworCXJldHZhbCA9IHJlZ2lzdGVyX25ldGRldihzb2Z0X2RldmljZSk7CisKKwlpZiAocmV0dmFsIDwgMCkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwgIlVuYWJsZSB0byByZWdpc3RlciB0aGUgYmF0bWFuIGludGVyZmFjZTogJWlcbiIsIHJldHZhbCk7CisJCWdvdG8gZnJlZV9zb2Z0X2RldmljZTsKKwl9CisKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmhhcmRfaWZfbm90aWZpZXIpOworCisJZGVidWdfbG9nKExPR19UWVBFX0NSSVQsICJCLkEuVC5NLkEuTi4gYWR2YW5jZWQgJXMlcyAoY29tcGF0aWJpbGl0eSB2ZXJzaW9uICVpKSBsb2FkZWQgXG4iLAorCSAgICAgICAgICBTT1VSQ0VfVkVSU0lPTiwgUkVWSVNJT05fVkVSU0lPTl9TVFIsIENPTVBBVF9WRVJTSU9OKTsKKworCXJldHVybiAwOworCitmcmVlX3NvZnRfZGV2aWNlOgorCWZyZWVfbmV0ZGV2KHNvZnRfZGV2aWNlKTsKKwlzb2Z0X2RldmljZSA9IE5VTEw7CitlbmQ6CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlzaHV0ZG93bl9tb2R1bGUoKTsKKworCWlmIChzb2Z0X2RldmljZSkgeworCQl1bnJlZ2lzdGVyX25ldGRldihzb2Z0X2RldmljZSk7CisJCXNvZnRfZGV2aWNlID0gTlVMTDsKKwl9CisKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaGFyZF9pZl9ub3RpZmllcik7CisJY2xlYW51cF9wcm9jZnMoKTsKKworCWRlc3Ryb3lfd29ya3F1ZXVlKGJhdF9ldmVudF93b3JrcXVldWUpOworCWJhdF9ldmVudF93b3JrcXVldWUgPSBOVUxMOworfQorCisvKiBhY3RpdmF0ZXMgdGhlIG1vZHVsZSwgY3JlYXRlcyBiYXQgZGV2aWNlLCBzdGFydHMgdGltZXIgLi4uICovCit2b2lkIGFjdGl2YXRlX21vZHVsZSh2b2lkKQoreworCWlmIChvcmlnaW5hdG9yX2luaXQoKSA8IDEpCisJCWdvdG8gZXJyOworCisJaWYgKGhuYV9sb2NhbF9pbml0KCkgPCAxKQorCQlnb3RvIGVycjsKKworCWlmIChobmFfZ2xvYmFsX2luaXQoKSA8IDEpCisJCWdvdG8gZXJyOworCisJaG5hX2xvY2FsX2FkZChzb2Z0X2RldmljZS0+ZGV2X2FkZHIpOworCisJaWYgKGJhdF9kZXZpY2Vfc2V0dXAoKSA8IDEpCisJCWdvdG8gZW5kOworCisJaWYgKHZpc19pbml0KCkgPCAxKQorCQlnb3RvIGVycjsKKworCS8qIChyZSlzdGFydCBrZXJuZWwgdGhyZWFkIGZvciBwYWNrZXQgcHJvY2Vzc2luZyAqLworCWlmICgha3RocmVhZF90YXNrKSB7CisJCWt0aHJlYWRfdGFzayA9IGt0aHJlYWRfcnVuKHBhY2tldF9yZWN2X3RocmVhZCwgTlVMTCwgImJhdG1hbi1hZHYiKTsKKworCQlpZiAoSVNfRVJSKGt0aHJlYWRfdGFzaykpIHsKKwkJCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULCAiVW5hYmxlIHRvIHN0YXJ0IHBhY2tldCByZWNlaXZlIHRocmVhZFxuIik7CisJCQlrdGhyZWFkX3Rhc2sgPSBOVUxMOworCQl9CisJfQorCisJdXBkYXRlX21pbl9tdHUoKTsKKwlhdG9taWNfc2V0KCZtb2R1bGVfc3RhdGUsIE1PRFVMRV9BQ1RJVkUpOworCWdvdG8gZW5kOworCitlcnI6CisJZGVidWdfbG9nKExPR19UWVBFX0NSSVQsICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBtZXNoIGluZm9ybWF0aW9uIHN0cnVjdHVyZXM6IG91dCBvZiBtZW0gP1xuIik7CisJc2h1dGRvd25fbW9kdWxlKCk7CitlbmQ6CisJcmV0dXJuOworfQorCisvKiBzaHV0cyBkb3duIHRoZSB3aG9sZSBtb2R1bGUuKi8KK3ZvaWQgc2h1dGRvd25fbW9kdWxlKHZvaWQpCit7CisJYXRvbWljX3NldCgmbW9kdWxlX3N0YXRlLCBNT0RVTEVfREVBQ1RJVkFUSU5HKTsKKworCXB1cmdlX291dHN0YW5kaW5nX3BhY2tldHMoKTsKKwlmbHVzaF93b3JrcXVldWUoYmF0X2V2ZW50X3dvcmtxdWV1ZSk7CisKKwl2aXNfcXVpdCgpOworCisJLyogZGVhY3RpdmF0ZSBrZXJuZWwgdGhyZWFkIGZvciBwYWNrZXQgcHJvY2Vzc2luZyAoaWYgcnVubmluZykgKi8KKwlpZiAoa3RocmVhZF90YXNrKSB7CisJCWF0b21pY19zZXQoJmV4aXRfY29uZCwgMSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdGhyZWFkX3dhaXQpOworCQlrdGhyZWFkX3N0b3Aoa3RocmVhZF90YXNrKTsKKworCQlrdGhyZWFkX3Rhc2sgPSBOVUxMOworCX0KKworCW9yaWdpbmF0b3JfZnJlZSgpOworCisJaG5hX2xvY2FsX2ZyZWUoKTsKKwlobmFfZ2xvYmFsX2ZyZWUoKTsKKworCXN5bmNocm9uaXplX25ldCgpOworCWJhdF9kZXZpY2VfZGVzdHJveSgpOworCisJaGFyZGlmX3JlbW92ZV9pbnRlcmZhY2VzKCk7CisJc3luY2hyb25pemVfcmN1KCk7CisJYXRvbWljX3NldCgmbW9kdWxlX3N0YXRlLCBNT0RVTEVfSU5BQ1RJVkUpOworfQorCit2b2lkIGluY19tb2R1bGVfY291bnQodm9pZCkKK3sKKwl0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSk7Cit9CisKK3ZvaWQgZGVjX21vZHVsZV9jb3VudCh2b2lkKQoreworCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworfQorCitpbnQgYWRkcl90b19zdHJpbmcoY2hhciAqYnVmZiwgdWludDhfdCAqYWRkcikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWZmLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCQkgICAgICAgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7Cit9CisKKy8qIHJldHVybnMgMSBpZiB0aGV5IGFyZSB0aGUgc2FtZSBvcmlnaW5hdG9yICovCisKK2ludCBjb21wYXJlX29yaWcodm9pZCAqZGF0YTEsIHZvaWQgKmRhdGEyKQoreworCXJldHVybiAobWVtY21wKGRhdGExLCBkYXRhMiwgRVRIX0FMRU4pID09IDAgPyAxIDogMCk7Cit9CisKKy8qIGhhc2hmdW5jdGlvbiB0byBjaG9vc2UgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlIG9mIGdpdmVuIHNpemUgKi8KKy8qIGhhc2ggYWxnb3JpdGhtIGZyb20gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IYXNoX3RhYmxlICovCitpbnQgY2hvb3NlX29yaWcodm9pZCAqZGF0YSwgaW50MzJfdCBzaXplKQoreworCXVuc2lnbmVkIGNoYXIgKmtleSA9IGRhdGE7CisJdWludDMyX3QgaGFzaCA9IDA7CisJc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWhhc2ggKz0ga2V5W2ldOworCQloYXNoICs9IChoYXNoIDw8IDEwKTsKKwkJaGFzaCBePSAoaGFzaCA+PiA2KTsKKwl9CisKKwloYXNoICs9IChoYXNoIDw8IDMpOworCWhhc2ggXj0gKGhhc2ggPj4gMTEpOworCWhhc2ggKz0gKGhhc2ggPDwgMTUpOworCisJcmV0dXJuIGhhc2ggJSBzaXplOworfQorCitpbnQgaXNfbXlfbWFjKHVpbnQ4X3QgKmFkZHIpCit7CisJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7CisJCWlmICgoYmF0bWFuX2lmLT5uZXRfZGV2KSAmJgorCQkgICAgKGNvbXBhcmVfb3JpZyhiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyLCBhZGRyKSkpIHsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIDA7CisKK30KKworaW50IGlzX2JjYXN0KHVpbnQ4X3QgKmFkZHIpCit7CisJcmV0dXJuIChhZGRyWzBdID09ICh1aW50OF90KTB4ZmYpICYmIChhZGRyWzFdID09ICh1aW50OF90KTB4ZmYpOworfQorCitpbnQgaXNfbWNhc3QodWludDhfdCAqYWRkcikKK3sKKwlyZXR1cm4gKmFkZHIgJiAweDAxOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoRFJJVkVSX0RFVklDRSk7CisjaWZkZWYgUkVWSVNJT05fVkVSU0lPTgorTU9EVUxFX1ZFUlNJT04oU09VUkNFX1ZFUlNJT04gIi0iIFJFVklTSU9OX1ZFUlNJT04pOworI2Vsc2UKK01PRFVMRV9WRVJTSU9OKFNPVVJDRV9WRVJTSU9OKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvbWFpbi5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhY2I2YjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9tYWluLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisvKiBLZXJuZWwgUHJvZ3JhbW1pbmcgKi8KKyNkZWZpbmUgTElOVVgKKworI2RlZmluZSBEUklWRVJfQVVUSE9SICJNYXJlayBMaW5kbmVyIDxsaW5kbmVyX21hcmVrQHlhaG9vLmRlPiwgU2ltb24gV3VuZGVybGljaCA8c2l3dUBocnoudHUtY2hlbW5pdHouZGU+IgorI2RlZmluZSBEUklWRVJfREVTQyAgICJCLkEuVC5NLkEuTi4gYWR2YW5jZWQiCisjZGVmaW5lIERSSVZFUl9ERVZJQ0UgImJhdG1hbi1hZHYiCisKKyNkZWZpbmUgU09VUkNFX1ZFUlNJT04gIjAuMi4xLWJldGEiCisKKworLyogQi5BLlQuTS5BLk4uIHBhcmFtZXRlcnMgKi8KKworI2RlZmluZSBUUV9NQVhfVkFMVUUgMjU1CisjZGVmaW5lIEpJVFRFUiAyMAorI2RlZmluZSBUVEwgNTAJCSAgICAgICAgICAvKiBUaW1lIFRvIExpdmUgb2YgYnJvYWRjYXN0IG1lc3NhZ2VzICovCisjZGVmaW5lIE1BWF9BRERSIDE2CSAgICAgICAgICAvKiBudW1iZXIgb2YgaW50ZXJmYWNlcyB3aGljaCBjYW4gYmUgYWRkZWQgdG8KKwkJCQkgICAqIGJhdG1hbi4gKi8KKworI2RlZmluZSBQVVJHRV9USU1FT1VUIDIwMDAwMCAgICAgIC8qIHB1cmdlIG9yaWdpbmF0b3JzIGFmdGVyIHRpbWUgaW4gbXMgaWYgbm8KKwkJCQkgICAqIHZhbGlkIHBhY2tldCBjb21lcyBpbiAtPiBUT0RPOiBjaGVjaworCQkJCSAgICogaW5mbHVlbmNlIG9uIFRRX0xPQ0FMX1dJTkRPV19TSVpFICovCisjZGVmaW5lIExPQ0FMX0hOQV9USU1FT1VUIDM2MDAwMDAKKworI2RlZmluZSBUUV9MT0NBTF9XSU5ET1dfU0laRSA2NCAgIC8qIHNsaWRpbmcgcGFja2V0IHJhbmdlIG9mIHJlY2VpdmVkIG9yaWdpbmF0b3IKKwkJCQkgICAqIG1lc3NhZ2VzIGluIHNxdWVuY2UgbnVtYmVycyAoc2hvdWxkIGJlIGEKKwkJCQkgICAqIG11bHRpcGxlIG9mIG91ciB3b3JkIHNpemUpICovCisjZGVmaW5lIFRRX0dMT0JBTF9XSU5ET1dfU0laRSA1CisjZGVmaW5lIFRRX0xPQ0FMX0JJRFJFQ1RfU0VORF9NSU5JTVVNIDEKKyNkZWZpbmUgVFFfTE9DQUxfQklEUkVDVF9SRUNWX01JTklNVU0gMQorI2RlZmluZSBUUV9UT1RBTF9CSURSRUNUX0xJTUlUIDEKKworI2RlZmluZSBUUV9IT1BfUEVOQUxUWSAxMAorCisjZGVmaW5lIE5VTV9XT1JEUyAoVFFfTE9DQUxfV0lORE9XX1NJWkUgLyBXT1JEX0JJVF9TSVpFKQorCisjZGVmaW5lIFBBQ0tCVUZGX1NJWkUgMjAwMAorI2RlZmluZSBMT0dfQlVGX0xFTiA4MTkyCSAgLyogaGFzIHRvIGJlIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBFVEhfU1RSX0xFTiAyMAorCisjZGVmaW5lIE1BWF9BR0dSRUdBVElPTl9CWVRFUyA1MTIgLyogc2hvdWxkIG5vdCBiZSBiaWdnZXIgdGhhbiA1MTIgYnl0ZXMgb3IKKwkJCQkgICAqIGNoYW5nZSB0aGUgc2l6ZSBvZgorCQkJCSAgICogZm9yd19wYWNrZXQtPmRpcmVjdF9saW5rX2ZsYWdzICovCisjZGVmaW5lIE1BWF9BR0dSRUdBVElPTl9NUyAxMDAKKworI2RlZmluZSBNT0RVTEVfSU5BQ1RJVkUgMAorI2RlZmluZSBNT0RVTEVfQUNUSVZFIDEKKyNkZWZpbmUgTU9EVUxFX0RFQUNUSVZBVElORyAyCisKKworLyoKKyAqIExvZ2dpbmcKKyAqLworCisjZGVmaW5lIExPR19UWVBFX0NSSVQgMAkJLyogaGlnaGVzdCBwcmlvcml0eSBmb3IgZmF0YWwgZXJyb3JzIHN1Y2ggYXMKKwkJCQkgKiBibG9ja2VkIHNvY2tldHMgLyBmYWlsZWQgcGFja2V0IGRlbGl2ZXJ5IC8KKwkJCQkgKiBwcm9ncmFtbWluZyBlcnJvcnMgKi8KKyNkZWZpbmUgTE9HX1RZUEVfV0FSTiAxCQkvKiB3YXJuaW5ncyBmb3Igc21hbGwgZXJyb3JzIGxpa2Ugd3JvbmcgdXNlcgorCQkJCSAqIGlucHV0IC8gZGFtYWdlZCBwYWNrZXRzIC8gZXRjICovCisjZGVmaW5lIExPR19UWVBFX05PVElDRSAyCS8qIG5vdGljZSBpbmZvcm1hdGlvbiBmb3IgbmV3IGludGVyZmFjZXMgLworCQkJCSAqIGNoYW5nZWQgc2V0dGluZ3MgLyBuZXcgb3JpZ2luYXRvcnMgLyBldGMgKi8KKyNkZWZpbmUgTE9HX1RZUEVfQkFUTUFOIDQJLyogYWxsIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gcm91dGluZyAvIGZsb29kaW5nIC8KKwkJCQkgKiBicm9hZGNhc3RpbmcgLyBldGMgKi8KKyNkZWZpbmUgTE9HX1RZUEVfUk9VVEVTIDgJLyogcm91dGUgb3IgaG5hIGFkZGVkIC8gY2hhbmdlZCAvIGRlbGV0ZWQgKi8KKyNkZWZpbmUgTE9HX1RZUEVfQ1JJVF9OQU1FCSJjcml0aWNhbCIKKyNkZWZpbmUgTE9HX1RZUEVfV0FSTl9OQU1FCSJ3YXJuaW5ncyIKKyNkZWZpbmUgTE9HX1RZUEVfTk9USUNFX05BTUUJIm5vdGljZXMiCisjZGVmaW5lIExPR19UWVBFX0JBVE1BTl9OQU1FCSJiYXRtYW4iCisjZGVmaW5lIExPR19UWVBFX1JPVVRFU19OQU1FCSJyb3V0ZXMiCisKKy8qCisgKiAgVmlzCisgKi8KKworLyogI2RlZmluZSBWSVNfU1VCQ0xVU1RFUlNfRElTQUJMRUQgKi8KKworLyoKKyAqIEtlcm5lbCBoZWFkZXJzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CS8qIG11dGV4ICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIG5lZWRlZCBieSBhbGwgbW9kdWxlcyAqLworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgkvKiBuZXRkZXZpY2UgKi8KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgkvKiBldGhlcm5ldCBoZWFkZXIgKi8KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CQkvKiBwb2xsX3RhYmxlICovCisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgkvKiBrZXJuZWwgdGhyZWFkcyAqLworI2luY2x1ZGUgPGxpbnV4L3BrdF9zY2hlZC5oPgkvKiBzY2hlZHVsZSB0eXBlcyAqLworI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgkvKiB3b3JrcXVldWUgKi8KKyNpbmNsdWRlIDxuZXQvc29jay5oPgkJLyogc3RydWN0IHNvY2sgKi8KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSAidHlwZXMuaCIKKworI2lmbmRlZiBSRVZJU0lPTl9WRVJTSU9OCisjZGVmaW5lIFJFVklTSU9OX1ZFUlNJT05fU1RSICIiCisjZWxzZQorI2RlZmluZSBSRVZJU0lPTl9WRVJTSU9OX1NUUiAiICJSRVZJU0lPTl9WRVJTSU9OCisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgaWZfbGlzdDsKK2V4dGVybiBzdHJ1Y3QgaGxpc3RfaGVhZCBmb3J3X2JhdF9saXN0OworZXh0ZXJuIHN0cnVjdCBobGlzdF9oZWFkIGZvcndfYmNhc3RfbGlzdDsKK2V4dGVybiBzdHJ1Y3QgaGFzaHRhYmxlX3QgKm9yaWdfaGFzaDsKKworZXh0ZXJuIHNwaW5sb2NrX3Qgb3JpZ19oYXNoX2xvY2s7CitleHRlcm4gc3BpbmxvY2tfdCBmb3J3X2JhdF9saXN0X2xvY2s7CitleHRlcm4gc3BpbmxvY2tfdCBmb3J3X2JjYXN0X2xpc3RfbG9jazsKKworZXh0ZXJuIGF0b21pY190IG9yaWdpbmF0b3JfaW50ZXJ2YWw7CitleHRlcm4gYXRvbWljX3QgdmlzX2ludGVydmFsOworZXh0ZXJuIGF0b21pY190IGFnZ3JlZ2F0aW9uX2VuYWJsZWQ7CitleHRlcm4gaW50MTZfdCBudW1faG5hOworZXh0ZXJuIGludDE2X3QgbnVtX2lmczsKKworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2RldmljZTsKKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgYnJvYWRjYXN0QWRkcltdOworZXh0ZXJuIGF0b21pY190IG1vZHVsZV9zdGF0ZTsKK2V4dGVybiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYmF0X2V2ZW50X3dvcmtxdWV1ZTsKKwordm9pZCBhY3RpdmF0ZV9tb2R1bGUodm9pZCk7Cit2b2lkIHNodXRkb3duX21vZHVsZSh2b2lkKTsKK3ZvaWQgaW5jX21vZHVsZV9jb3VudCh2b2lkKTsKK3ZvaWQgZGVjX21vZHVsZV9jb3VudCh2b2lkKTsKK2ludCBhZGRyX3RvX3N0cmluZyhjaGFyICpidWZmLCB1aW50OF90ICphZGRyKTsKK2ludCBjb21wYXJlX29yaWcodm9pZCAqZGF0YTEsIHZvaWQgKmRhdGEyKTsKK2ludCBjaG9vc2Vfb3JpZyh2b2lkICpkYXRhLCBpbnQzMl90IHNpemUpOworaW50IGlzX215X21hYyh1aW50OF90ICphZGRyKTsKK2ludCBpc19iY2FzdCh1aW50OF90ICphZGRyKTsKK2ludCBpc19tY2FzdCh1aW50OF90ICphZGRyKTsKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9wYWNrZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3BhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjdjYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9wYWNrZXQuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2RlZmluZSBFVEhfUF9CQVRNQU4gIDB4NDMwNQkvKiB1bm9mZmljaWFsL25vdCByZWdpc3RlcmVkIEV0aGVydHlwZSAqLworCisjZGVmaW5lIEJBVF9QQUNLRVQgICAgMHgwMQorI2RlZmluZSBCQVRfSUNNUCAgICAgIDB4MDIKKyNkZWZpbmUgQkFUX1VOSUNBU1QgICAweDAzCisjZGVmaW5lIEJBVF9CQ0FTVCAgICAgMHgwNAorI2RlZmluZSBCQVRfVklTICAgICAgIDB4MDUKKworLyogdGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5IGJhdGN0bCB3aGljaCBuZWVkcyB0aGVzZSBkZWZpbmVzICovCisjZGVmaW5lIENPTVBBVF9WRVJTSU9OIDgKKyNkZWZpbmUgRElSRUNUTElOSyAweDQwCisjZGVmaW5lIFZJU19TRVJWRVIgMHgyMAorCisvKiBJQ01QIG1lc3NhZ2UgdHlwZXMgKi8KKyNkZWZpbmUgRUNIT19SRVBMWSAwCisjZGVmaW5lIERFU1RJTkFUSU9OX1VOUkVBQ0hBQkxFIDMKKyNkZWZpbmUgRUNIT19SRVFVRVNUIDgKKyNkZWZpbmUgVFRMX0VYQ0VFREVEIDExCisjZGVmaW5lIFBBUkFNRVRFUl9QUk9CTEVNIDEyCisKKy8qIHZpcyBkZWZpbmVzICovCisjZGVmaW5lIFZJU19UWVBFX1NFUlZFUl9TWU5DCQkwCisjZGVmaW5lIFZJU19UWVBFX0NMSUVOVF9VUERBVEUJCTEKKworc3RydWN0IGJhdG1hbl9wYWNrZXQgeworCXVpbnQ4X3QgIHBhY2tldF90eXBlOworCXVpbnQ4X3QgIHZlcnNpb247ICAvKiBiYXRtYW4gdmVyc2lvbiBmaWVsZCAqLworCXVpbnQ4X3QgIGZsYWdzOyAgICAvKiAweDQwOiBESVJFQ1RMSU5LIGZsYWcsIDB4MjAgVklTX1NFUlZFUiBmbGFnLi4uICovCisJdWludDhfdCAgdHE7CisJdWludDE2X3Qgc2Vxbm87CisJdWludDhfdCAgb3JpZ1s2XTsKKwl1aW50OF90ICBwcmV2X3NlbmRlcls2XTsKKwl1aW50OF90ICB0dGw7CisJdWludDhfdCAgbnVtX2huYTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgQkFUX1BBQ0tFVF9MRU4gc2l6ZW9mKHN0cnVjdCBiYXRtYW5fcGFja2V0KQorCitzdHJ1Y3QgaWNtcF9wYWNrZXQgeworCXVpbnQ4X3QgIHBhY2tldF90eXBlOworCXVpbnQ4X3QgIHZlcnNpb247ICAvKiBiYXRtYW4gdmVyc2lvbiBmaWVsZCAqLworCXVpbnQ4X3QgIG1zZ190eXBlOyAvKiBzZWUgSUNNUCBtZXNzYWdlIHR5cGVzIGFib3ZlICovCisJdWludDhfdCAgdHRsOworCXVpbnQ4X3QgIGRzdFs2XTsKKwl1aW50OF90ICBvcmlnWzZdOworCXVpbnQxNl90IHNlcW5vOworCXVpbnQ4X3QgIHVpZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCB1bmljYXN0X3BhY2tldCB7CisJdWludDhfdCAgcGFja2V0X3R5cGU7CisJdWludDhfdCAgdmVyc2lvbjsgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCisJdWludDhfdCAgZGVzdFs2XTsKKwl1aW50OF90ICB0dGw7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgYmNhc3RfcGFja2V0IHsKKwl1aW50OF90ICBwYWNrZXRfdHlwZTsKKwl1aW50OF90ICB2ZXJzaW9uOyAgLyogYmF0bWFuIHZlcnNpb24gZmllbGQgKi8KKwl1aW50OF90ICBvcmlnWzZdOworCXVpbnQxNl90IHNlcW5vOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHZpc19wYWNrZXQgeworCXVpbnQ4X3QgIHBhY2tldF90eXBlOworCXVpbnQ4X3QgIHZlcnNpb247ICAgICAgICAvKiBiYXRtYW4gdmVyc2lvbiBmaWVsZCAqLworCXVpbnQ4X3QgIHZpc190eXBlOwkgLyogd2hpY2ggdHlwZSBvZiB2aXMtcGFydGljaXBhbnQgc2VudCB0aGlzPyAqLworCXVpbnQ4X3QgIHNlcW5vOwkJIC8qIHNlcXVlbmNlIG51bWJlciAqLworCXVpbnQ4X3QgIGVudHJpZXM7CSAvKiBudW1iZXIgb2YgZW50cmllcyBiZWhpbmQgdGhpcyBzdHJ1Y3QgKi8KKwl1aW50OF90ICB0dGw7CQkgLyogVFRMICovCisJdWludDhfdCAgdmlzX29yaWdbNl07CSAvKiBvcmlnaW5hdG9yIHRoYXQgaW5mb3JtcyBhYm91dCBpdHMKKwkJCQkgICogbmVpZ2hib3VycyAqLworCXVpbnQ4X3QgIHRhcmdldF9vcmlnWzZdOyAvKiB3aG8gc2hvdWxkIHJlY2VpdmUgdGhpcyBwYWNrZXQgKi8KKwl1aW50OF90ICBzZW5kZXJfb3JpZ1s2XTsgLyogd2hvIHNlbnQgb3IgcmVicm9hZGNhc3RlZCB0aGlzIHBhY2tldCAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Byb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWMzZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcHJvYy5jCkBAIC0wLDAgKzEsOTUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJwcm9jLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAicm91dGluZy5oIgorI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCisjaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImhhc2guaCIKKyNpbmNsdWRlICJ2aXMuaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKworc3RhdGljIHVpbnQ4X3QgdmlzX2Zvcm1hdCA9IERPVF9EUkFXOworCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2JhdG1hbl9kaXIsICpwcm9jX2ludGVyZmFjZV9maWxlOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19vcmlnX2ludGVydmFsX2ZpbGUsICpwcm9jX29yaWdpbmF0b3JzX2ZpbGU7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2xvZ19maWxlLCAqcHJvY19sb2dfbGV2ZWxfZmlsZTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfdHJhbnN0X2xvY2FsX2ZpbGU7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3RyYW5zdF9nbG9iYWxfZmlsZTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfdmlzX2ZpbGUsICpwcm9jX3Zpc19mb3JtYXRfZmlsZTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfYWdncl9maWxlOworCitzdGF0aWMgaW50IHByb2NfaW50ZXJmYWNlc19yZWFkKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKKwkJc2VxX3ByaW50ZihzZXEsICJbJThzXSAlcyAlcyBcbiIsCisJCQkgICAoYmF0bWFuX2lmLT5pZl9hY3RpdmUgPT0gSUZfQUNUSVZFID8KKwkJCSAgICAiYWN0aXZlIiA6ICJpbmFjdGl2ZSIpLAorCQkJICAgYmF0bWFuX2lmLT5kZXYsCisJCQkgICAoYmF0bWFuX2lmLT5pZl9hY3RpdmUgPT0gSUZfQUNUSVZFID8KKwkJCSAgICBiYXRtYW5faWYtPmFkZHJfc3RyIDogIiAiKSk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19pbnRlcmZhY2VzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHByb2NfaW50ZXJmYWNlc19yZWFkLCBOVUxMKTsKK30KKworc3RhdGljIHNzaXplX3QgcHJvY19pbnRlcmZhY2VzX3dyaXRlKHN0cnVjdCBmaWxlICppbnN0YW5jZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmZmVyLAorCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKmRhdGEpCit7CisJY2hhciAqaWZfc3RyaW5nLCAqY29sb25fcHRyID0gTlVMTCwgKmNyX3B0ciA9IE5VTEw7CisJaW50IG5vdF9jb3BpZWQgPSAwLCBpZl9udW0gPSAwOworCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiA9IE5VTEw7CisKKwlpZl9zdHJpbmcgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKworCWlmICghaWZfc3RyaW5nKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3VudCA+IElGTkFNU0laIC0gMSkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfV0FSTiwKKwkJCSAgIkNhbid0IGFkZCBpbnRlcmZhY2U6IGRldmljZSBuYW1lIGlzIHRvbyBsb25nXG4iKTsKKwkJZ290byBlbmQ7CisJfQorCisJbm90X2NvcGllZCA9IGNvcHlfZnJvbV91c2VyKGlmX3N0cmluZywgdXNlcmJ1ZmZlciwgY291bnQpOworCWlmX3N0cmluZ1tjb3VudCAtIG5vdF9jb3BpZWQgLSAxXSA9IDA7CisKKwljb2xvbl9wdHIgPSBzdHJjaHIoaWZfc3RyaW5nLCAnOicpOworCWlmIChjb2xvbl9wdHIpCisJCSpjb2xvbl9wdHIgPSAwOworCisJaWYgKCFjb2xvbl9wdHIpIHsKKwkJY3JfcHRyID0gc3RyY2hyKGlmX3N0cmluZywgJ1xuJyk7CisJCWlmIChjcl9wdHIpCisJCQkqY3JfcHRyID0gMDsKKwl9CisKKwlpZiAoc3RybGVuKGlmX3N0cmluZykgPT0gMCkgeworCQlzaHV0ZG93bl9tb2R1bGUoKTsKKwkJbnVtX2lmcyA9IDA7CisJCWdvdG8gZW5kOworCX0KKworCS8qIGFkZCBpbnRlcmZhY2UgKi8KKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYmF0bWFuX2lmLCAmaWZfbGlzdCwgbGlzdCkgeworCQlpZiAoc3RybmNtcChiYXRtYW5faWYtPmRldiwgaWZfc3RyaW5nLCBjb3VudCkgPT0gMCkgeworCQkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sICJHaXZlbiBpbnRlcmZhY2UgaXMgYWxyZWFkeSBhY3RpdmU6ICVzXG4iLCBpZl9zdHJpbmcpOworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQlnb3RvIGVuZDsKKworCQl9CisKKwkJaWZfbnVtKys7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJaGFyZGlmX2FkZF9pbnRlcmZhY2UoaWZfc3RyaW5nLCBpZl9udW0pOworCisJaWYgKChhdG9taWNfcmVhZCgmbW9kdWxlX3N0YXRlKSA9PSBNT0RVTEVfSU5BQ1RJVkUpICYmCisJICAgIChoYXJkaWZfZ2V0X2FjdGl2ZV9pZl9udW0oKSA+IDApKQorCQlhY3RpdmF0ZV9tb2R1bGUoKTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlpZiAobGlzdF9lbXB0eSgmaWZfbGlzdCkpIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCWdvdG8gZW5kOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCW51bV9pZnMgPSBpZl9udW0gKyAxOworCXJldHVybiBjb3VudDsKKworZW5kOgorCWtmcmVlKGlmX3N0cmluZyk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHByb2Nfb3JpZ19pbnRlcnZhbF9yZWFkKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisJc2VxX3ByaW50ZihzZXEsICIlaVxuIiwgYXRvbWljX3JlYWQoJm9yaWdpbmF0b3JfaW50ZXJ2YWwpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBwcm9jX29yaWdfaW50ZXJ2YWxfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCWNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgKmludGVydmFsX3N0cmluZzsKKwlpbnQgbm90X2NvcGllZCA9IDA7CisJdW5zaWduZWQgbG9uZyBvcmlnaW5hdG9yX2ludGVydmFsX3RtcDsKKwlpbnQgcmV0dmFsOworCisJaW50ZXJ2YWxfc3RyaW5nID0ga21hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWludGVydmFsX3N0cmluZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlub3RfY29waWVkID0gY29weV9mcm9tX3VzZXIoaW50ZXJ2YWxfc3RyaW5nLCBidWZmZXIsIGNvdW50KTsKKwlpbnRlcnZhbF9zdHJpbmdbY291bnQgLSBub3RfY29waWVkIC0gMV0gPSAwOworCisJcmV0dmFsID0gc3RyaWN0X3N0cnRvdWwoaW50ZXJ2YWxfc3RyaW5nLCAxMCwgJm9yaWdpbmF0b3JfaW50ZXJ2YWxfdG1wKTsKKwlpZiAocmV0dmFsKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLCAiTmV3IG9yaWdpbmF0b3IgaW50ZXJ2YWwgaW52YWxpZFxuIik7CisJCWdvdG8gZW5kOworCX0KKworCWlmIChvcmlnaW5hdG9yX2ludGVydmFsX3RtcCA8PSBKSVRURVIgKiAyKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLAorCQkJICAiTmV3IG9yaWdpbmF0b3IgaW50ZXJ2YWwgdG9vIHNtYWxsOiAlaSAobWluOiAlaSlcbiIsCisJCQkgIG9yaWdpbmF0b3JfaW50ZXJ2YWxfdG1wLCBKSVRURVIgKiAyKTsKKwkJZ290byBlbmQ7CisJfQorCisJZGVidWdfbG9nKExPR19UWVBFX05PVElDRSwKKwkJICAiQ2hhbmdpbmcgb3JpZ2luYXRvciBpbnRlcnZhbCBmcm9tOiAlaSB0bzogJWlcbiIsCisJCSAgYXRvbWljX3JlYWQoJm9yaWdpbmF0b3JfaW50ZXJ2YWwpLCBvcmlnaW5hdG9yX2ludGVydmFsX3RtcCk7CisKKwlhdG9taWNfc2V0KCZvcmlnaW5hdG9yX2ludGVydmFsLCBvcmlnaW5hdG9yX2ludGVydmFsX3RtcCk7CisKK2VuZDoKKwlrZnJlZShpbnRlcnZhbF9zdHJpbmcpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBwcm9jX29yaWdfaW50ZXJ2YWxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcHJvY19vcmlnX2ludGVydmFsX3JlYWQsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHByb2Nfb3JpZ2luYXRvcnNfcmVhZChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQoreworCXN0cnVjdCBoYXNoX2l0X3QgKmhhc2hpdCA9IE5VTEw7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOworCXN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlOworCWludCBiYXRtYW5fY291bnQgPSAwOworCWNoYXIgb3JpZ19zdHJbRVRIX1NUUl9MRU5dLCByb3V0ZXJfc3RyW0VUSF9TVFJfTEVOXTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlpZiAobGlzdF9lbXB0eSgmaWZfbGlzdCkpIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXNlcV9wcmludGYoc2VxLCAiQkFUTUFOIGRpc2FibGVkIC0gcGxlYXNlIHNwZWNpZnkgaW50ZXJmYWNlcyB0byBlbmFibGUgaXQgXG4iKTsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKCgoc3RydWN0IGJhdG1hbl9pZiAqKWlmX2xpc3QubmV4dCktPmlmX2FjdGl2ZSAhPSBJRl9BQ1RJVkUpIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXNlcV9wcmludGYoc2VxLCAiQkFUTUFOIGRpc2FibGVkIC0gcHJpbWFyeSBpbnRlcmZhY2Ugbm90IGFjdGl2ZSBcbiIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlzZXFfcHJpbnRmKHNlcSwKKwkJICAgIiAgJS0xNHMgKCVzLyVpKSAlMTdzIFslMTBzXTogJTIwcyAuLi4gW0IuQS5ULk0uQS5OLiBhZHYgJXMlcywgTWFpbklGL01BQzogJXMvJXNdIFxuIiwKKwkJICAgIk9yaWdpbmF0b3IiLCAiIyIsIFRRX01BWF9WQUxVRSwgIk5leHRob3AiLCAib3V0Z29pbmdJRiIsCisJCSAgICJQb3RlbnRpYWwgbmV4dGhvcHMiLCBTT1VSQ0VfVkVSU0lPTiwgUkVWSVNJT05fVkVSU0lPTl9TVFIsCisJCSAgICgoc3RydWN0IGJhdG1hbl9pZiAqKWlmX2xpc3QubmV4dCktPmRldiwKKwkJICAgKChzdHJ1Y3QgYmF0bWFuX2lmICopaWZfbGlzdC5uZXh0KS0+YWRkcl9zdHIpOworCisJcmN1X3JlYWRfdW5sb2NrKCk7CisJc3Bpbl9sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisKKwl3aGlsZSAoTlVMTCAhPSAoaGFzaGl0ID0gaGFzaF9pdGVyYXRlKG9yaWdfaGFzaCwgaGFzaGl0KSkpIHsKKworCQlvcmlnX25vZGUgPSBoYXNoaXQtPmJ1Y2tldC0+ZGF0YTsKKworCQlpZiAoIW9yaWdfbm9kZS0+cm91dGVyKQorCQkJY29udGludWU7CisKKwkJaWYgKG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmcgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWJhdG1hbl9jb3VudCsrOworCisJCWFkZHJfdG9fc3RyaW5nKG9yaWdfc3RyLCBvcmlnX25vZGUtPm9yaWcpOworCQlhZGRyX3RvX3N0cmluZyhyb3V0ZXJfc3RyLCBvcmlnX25vZGUtPnJvdXRlci0+YWRkcik7CisKKwkJc2VxX3ByaW50ZihzZXEsICIlLTE3cyAgKCUzaSkgJTE3cyBbJTEwc106IiwKKwkJCSAgIG9yaWdfc3RyLCBvcmlnX25vZGUtPnJvdXRlci0+dHFfYXZnLAorCQkJICAgcm91dGVyX3N0ciwgb3JpZ19ub2RlLT5yb3V0ZXItPmlmX2luY29taW5nLT5kZXYpOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkobmVpZ2hfbm9kZSwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCwgbGlzdCkgeworCQkJYWRkcl90b19zdHJpbmcob3JpZ19zdHIsIG5laWdoX25vZGUtPmFkZHIpOworCQkJc2VxX3ByaW50ZihzZXEsICIgJTE3cyAoJTNpKSIsCisJCQkJICAgb3JpZ19zdHIsIG5laWdoX25vZGUtPnRxX2F2Zyk7CisJCX0KKworCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CisKKwl9CisKKwlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCisJaWYgKGJhdG1hbl9jb3VudCA9PSAwKQorCQlzZXFfcHJpbnRmKHNlcSwgIk5vIGJhdG1hbiBub2RlcyBpbiByYW5nZSAuLi4gXG4iKTsKKworZW5kOgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nfb3JpZ2luYXRvcnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcHJvY19vcmlnaW5hdG9yc19yZWFkLCBOVUxMKTsKK30KKworc3RhdGljIGludCBwcm9jX2xvZ19sZXZlbF9yZWFkKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisKKwlzZXFfcHJpbnRmKHNlcSwgIlt4XSAlcyAoJWQpXG4iLCBMT0dfVFlQRV9DUklUX05BTUUsIExPR19UWVBFX0NSSVQpOworCXNlcV9wcmludGYoc2VxLCAiWyVjXSAlcyAoJWQpXG4iLAorCQkgICAoTE9HX1RZUEVfV0FSTiAmIGxvZ19sZXZlbCkgPyAneCcgOiAnICcsCisJCSAgIExPR19UWVBFX1dBUk5fTkFNRSwgTE9HX1RZUEVfV0FSTik7CisJc2VxX3ByaW50ZihzZXEsICJbJWNdICVzICglZClcbiIsCisJCSAgIChMT0dfVFlQRV9OT1RJQ0UgJiBsb2dfbGV2ZWwpID8gJ3gnIDogJyAnLAorCQkgICBMT0dfVFlQRV9OT1RJQ0VfTkFNRSwgTE9HX1RZUEVfTk9USUNFKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlslY10gJXMgKCVkKVxuIiwKKwkJICAgKExPR19UWVBFX0JBVE1BTiAmIGxvZ19sZXZlbCkgPyAneCcgOiAnICcsCisJCSAgIExPR19UWVBFX0JBVE1BTl9OQU1FLCBMT0dfVFlQRV9CQVRNQU4pOworCXNlcV9wcmludGYoc2VxLCAiWyVjXSAlcyAoJWQpXG4iLAorCQkgICAoTE9HX1RZUEVfUk9VVEVTICYgbG9nX2xldmVsKSA/ICd4JyA6ICcgJywKKwkJICAgTE9HX1RZUEVfUk9VVEVTX05BTUUsIExPR19UWVBFX1JPVVRFUyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19sb2dfbGV2ZWxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcHJvY19sb2dfbGV2ZWxfcmVhZCwgTlVMTCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHByb2NfbG9nX2xldmVsX3dyaXRlKHN0cnVjdCBmaWxlICppbnN0YW5jZSwKKwkJCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWZmZXIsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpkYXRhKQoreworCWNoYXIgKmxvZ19sZXZlbF9zdHJpbmcsICp0b2twdHIsICpjcDsKKwlpbnQgZmluaXNoZWQsIG5vdF9jb3BpZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgbG9nX2xldmVsX3RtcCA9IDA7CisKKwlsb2dfbGV2ZWxfc3RyaW5nID0ga21hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWxvZ19sZXZlbF9zdHJpbmcpCisJCXJldHVybiAtRU5PTUVNOworCisJbm90X2NvcGllZCA9IGNvcHlfZnJvbV91c2VyKGxvZ19sZXZlbF9zdHJpbmcsIHVzZXJidWZmZXIsIGNvdW50KTsKKwlsb2dfbGV2ZWxfc3RyaW5nW2NvdW50IC0gbm90X2NvcGllZCAtIDFdID0gMDsKKworCWlmIChzdHJpY3Rfc3RydG91bChsb2dfbGV2ZWxfc3RyaW5nLCAxMCwgJmxvZ19sZXZlbF90bXApIDwgMCkgeworCQkvKiB3YXMgbm90IGEgbnVtYmVyLCBkb2luZyB0ZXh0dWFsIHBhcnNpbmcgKi8KKwkJbG9nX2xldmVsX3RtcCA9IDA7CisJCXRva3B0ciA9IGxvZ19sZXZlbF9zdHJpbmc7CisKKwkJZm9yIChjcCA9IGxvZ19sZXZlbF9zdHJpbmcsIGZpbmlzaGVkID0gMDsgIWZpbmlzaGVkOyBjcCsrKSB7CisJCQlzd2l0Y2ggKCpjcCkgeworCQkJY2FzZSAwOgorCQkJCWZpbmlzaGVkID0gMTsKKwkJCWNhc2UgJyAnOgorCQkJY2FzZSAnXG4nOgorCQkJY2FzZSAnXHQnOgorCQkJCSpjcCA9IDA7CisJCQkJLyogY29tcGFyZSAqLworCQkJCWlmIChzdHJjbXAodG9rcHRyLCBMT0dfVFlQRV9XQVJOX05BTUUpID09IDApCisJCQkJCWxvZ19sZXZlbF90bXAgfD0gTE9HX1RZUEVfV0FSTjsKKwkJCQlpZiAoc3RyY21wKHRva3B0ciwgTE9HX1RZUEVfTk9USUNFX05BTUUpID09IDApCisJCQkJCWxvZ19sZXZlbF90bXAgfD0gTE9HX1RZUEVfTk9USUNFOworCQkJCWlmIChzdHJjbXAodG9rcHRyLCBMT0dfVFlQRV9CQVRNQU5fTkFNRSkgPT0gMCkKKwkJCQkJbG9nX2xldmVsX3RtcCB8PSBMT0dfVFlQRV9CQVRNQU47CisJCQkJaWYgKHN0cmNtcCh0b2twdHIsIExPR19UWVBFX1JPVVRFU19OQU1FKSA9PSAwKQorCQkJCQlsb2dfbGV2ZWxfdG1wIHw9IExPR19UWVBFX1JPVVRFUzsKKwkJCQl0b2twdHIgPSBjcCArIDE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCTsKKwkJCX0KKwkJfQorCX0KKworCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULCAiQ2hhbmdpbmcgbG9nX2xldmVsIGZyb206ICVpIHRvOiAlaVxuIiwKKwkJICBsb2dfbGV2ZWwsIGxvZ19sZXZlbF90bXApOworCWxvZ19sZXZlbCA9IGxvZ19sZXZlbF90bXA7CisKKwlrZnJlZShsb2dfbGV2ZWxfc3RyaW5nKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgcHJvY190cmFuc3RfbG9jYWxfcmVhZChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQoreworCWNoYXIgKmJ1ZjsKKworCWJ1ZiA9IGttYWxsb2MoNDA5NiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAwOworCisJcmN1X3JlYWRfbG9jaygpOworCWlmIChsaXN0X2VtcHR5KCZpZl9saXN0KSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJc2VxX3ByaW50ZihzZXEsICJCQVRNQU4gZGlzYWJsZWQgLSBwbGVhc2Ugc3BlY2lmeSBpbnRlcmZhY2VzIHRvIGVuYWJsZSBpdCBcbiIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXNlcV9wcmludGYoc2VxLCAiTG9jYWxseSByZXRyaWV2ZWQgYWRkcmVzc2VzIChmcm9tICVzKSBhbm5vdW5jZWQgdmlhIEhOQTpcbiIsIHNvZnRfZGV2aWNlLT5uYW1lKTsKKworCWhuYV9sb2NhbF9maWxsX2J1ZmZlcl90ZXh0KGJ1ZiwgNDA5Nik7CisJc2VxX3ByaW50ZihzZXEsICIlcyIsIGJ1Zik7CisKK2VuZDoKKwlrZnJlZShidWYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2NfdHJhbnN0X2xvY2FsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHByb2NfdHJhbnN0X2xvY2FsX3JlYWQsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHByb2NfdHJhbnN0X2dsb2JhbF9yZWFkKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisJY2hhciAqYnVmOworCisJYnVmID0ga21hbGxvYyg0MDk2LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKGxpc3RfZW1wdHkoJmlmX2xpc3QpKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlzZXFfcHJpbnRmKHNlcSwgIkJBVE1BTiBkaXNhYmxlZCAtIHBsZWFzZSBzcGVjaWZ5IGludGVyZmFjZXMgdG8gZW5hYmxlIGl0IFxuIik7CisJCWdvdG8gZW5kOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCisJc2VxX3ByaW50ZihzZXEsICJHbG9iYWxseSBhbm5vdW5jZWQgSE5BcyByZWNlaXZlZCB2aWEgdGhlIG1lc2ggKHRyYW5zbGF0aW9uIHRhYmxlKTpcbiIpOworCisJaG5hX2dsb2JhbF9maWxsX2J1ZmZlcl90ZXh0KGJ1ZiwgNDA5Nik7CisJc2VxX3ByaW50ZihzZXEsICIlcyIsIGJ1Zik7CisKK2VuZDoKKwlrZnJlZShidWYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2NfdHJhbnN0X2dsb2JhbF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwcm9jX3RyYW5zdF9nbG9iYWxfcmVhZCwgTlVMTCk7Cit9CisKKy8qIGluc2VydCBpbnRlcmZhY2UgdG8gdGhlIGxpc3Qgb2YgaW50ZXJmYWNlcyBvZiBvbmUgb3JpZ2luYXRvciAqLworCitzdGF0aWMgdm9pZCBwcm9jX3Zpc19pbnNlcnRfaW50ZXJmYWNlKGNvbnN0IHVpbnQ4X3QgKmludGVyZmFjZSwKKwkJCQkgICAgICBzdHJ1Y3QgdmlzX2lmX2xpc3QgKippZl9lbnRyeSwKKwkJCQkgICAgICBib29sIHByaW1hcnkpCit7CisJLyogRGlkIHdlIGdldCBhbiBlbXB0eSBsaXN0PyAodGhlbiBpbnNlcnQgaW1lZGlhdGVseSkgKi8KKwlpZigqaWZfZW50cnkgPT0gTlVMTCkgeworCQkqaWZfZW50cnkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmlzX2lmX2xpc3QpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCppZl9lbnRyeSA9PSBOVUxMKQorCQkJcmV0dXJuOworCisJCSgqaWZfZW50cnkpLT5wcmltYXJ5ID0gcHJpbWFyeTsKKwkJKCppZl9lbnRyeSktPm5leHQgPSBOVUxMOworCQltZW1jcHkoKCppZl9lbnRyeSktPmFkZHIsIGludGVyZmFjZSwgRVRIX0FMRU4pOworCX0gZWxzZSB7CisJCXN0cnVjdCB2aXNfaWZfbGlzdCAqaGVhZF9pZl9lbnRyeSA9ICppZl9lbnRyeTsKKwkJLyogRG8gd2UgYWxyZWFkeSBoYXZlIHRoaXMgaW50ZXJmYWNlIGluIG91ciBsaXN0PyAqLworCQl3aGlsZSAoIWNvbXBhcmVfb3JpZygoKmlmX2VudHJ5KS0+YWRkciwgKHZvaWQgKilpbnRlcmZhY2UpKSB7CisKKwkJCS8qIE9yIGRpZCB3ZSByZWFjaCB0aGUgZW5kICh0aGVuIGFwcGVuZCB0aGUgaW50ZXJmYWNlKSAqLworCQkJaWYgKCgqaWZfZW50cnkpLT5uZXh0ID09IE5VTEwpIHsKKwkJCQkoKmlmX2VudHJ5KS0+bmV4dCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aXNfaWZfbGlzdCksIEdGUF9LRVJORUwpOworCQkJCWlmICgoKmlmX2VudHJ5KS0+bmV4dCA9PSBOVUxMKQorCQkJCQlyZXR1cm47CisKKwkJCQltZW1jcHkoKCppZl9lbnRyeSktPm5leHQtPmFkZHIsIGludGVyZmFjZSwgRVRIX0FMRU4pOworCQkJCSgqaWZfZW50cnkpLT5uZXh0LT5wcmltYXJ5ID0gcHJpbWFyeTsKKwkJCQkoKmlmX2VudHJ5KS0+bmV4dC0+bmV4dCA9IE5VTEw7CisJCQkJYnJlYWs7CisJCQl9CisJCQkqaWZfZW50cnkgPSAoKmlmX2VudHJ5KS0+bmV4dDsKKwkJfQorCQkvKiBSZXdpbmQgdGhlIGxpc3QgdG8gaXRzIGhlYWQgKi8KKwkJKmlmX2VudHJ5ID0gaGVhZF9pZl9lbnRyeTsKKwl9Cit9CisvKiByZWFkIGFuIGVudHJ5ICAqLworCitzdGF0aWMgdm9pZCBwcm9jX3Zpc19yZWFkX2VudHJ5KHN0cnVjdCBzZXFfZmlsZSAqc2VxLAorCQkJCXN0cnVjdCB2aXNfaW5mb19lbnRyeSAqZW50cnksCisJCQkJc3RydWN0IHZpc19pZl9saXN0ICoqaWZfZW50cnksCisJCQkJdWludDhfdCAqdmlzX29yaWcsCisJCQkJdWludDhfdCBjdXJyZW50X2Zvcm1hdCwKKwkJCQl1aW50OF90IGZpcnN0X2xpbmUpCit7CisJY2hhciBmcm9tWzQwXTsKKwljaGFyIHRvWzQwXTsKKwlpbnQgaW50X3BhcnQsIGZyYWNfcGFydDsKKworCWFkZHJfdG9fc3RyaW5nKHRvLCBlbnRyeS0+ZGVzdCk7CisJaWYgKGVudHJ5LT5xdWFsaXR5ID09IDApIHsKKyNpZm5kZWYgVklTX1NVQkNMVVNURVJTX0RJU0FCTEVECisJCXByb2NfdmlzX2luc2VydF9pbnRlcmZhY2UodmlzX29yaWcsIGlmX2VudHJ5LCB0cnVlKTsKKyNlbmRpZiAvKiBWSVNfU1VCQ0xVU1RFUlNfRElTQUJMRUQgKi8KKwkJYWRkcl90b19zdHJpbmcoZnJvbSwgdmlzX29yaWcpOworCQlpZiAoY3VycmVudF9mb3JtYXQgPT0gRE9UX0RSQVcpIHsKKwkJCXNlcV9wcmludGYoc2VxLCAiXHRcIiVzXCIgLT4gXCIlc1wiIFtsYWJlbD1cIkhOQVwiXVxuIiwKKwkJCQkgICBmcm9tLCB0byk7CisJCX0gZWxzZSB7CisJCQlzZXFfcHJpbnRmKHNlcSwKKwkJCQkgICAiJXNcdHsgcm91dGVyIDogXCIlc1wiLCBnYXRld2F5ICAgOiBcIiVzXCIsIGxhYmVsIDogXCJITkFcIiB9IiwKKwkJCQkgICAoZmlyc3RfbGluZSA/ICIiIDogIixcbiIpLCBmcm9tLCB0byk7CisJCX0KKwl9IGVsc2UgeworI2lmbmRlZiBWSVNfU1VCQ0xVU1RFUlNfRElTQUJMRUQKKwkJcHJvY192aXNfaW5zZXJ0X2ludGVyZmFjZShlbnRyeS0+c3JjLCBpZl9lbnRyeSwgY29tcGFyZV9vcmlnKGVudHJ5LT5zcmMsIHZpc19vcmlnKSk7CisjZW5kaWYgLyogVklTX1NVQkNMVVNURVJTX0RJU0FCTEVEICovCisJCWFkZHJfdG9fc3RyaW5nKGZyb20sIGVudHJ5LT5zcmMpOworCisJCS8qIGtlcm5lbCBoYXMgbm8gcHJpbnRmLXN1cHBvcnQgZm9yICVmPyBpdCdkIGJlIGJldHRlciB0byByZXR1cm4KKwkJICogdGhpcyBpbiBmbG9hdC4gKi8KKworCQlpbnRfcGFydCA9IFRRX01BWF9WQUxVRSAvIGVudHJ5LT5xdWFsaXR5OworCQlmcmFjX3BhcnQgPSAxMDAwICogVFFfTUFYX1ZBTFVFIC8gZW50cnktPnF1YWxpdHkgLSBpbnRfcGFydCAqIDEwMDA7CisKKwkJaWYgKGN1cnJlbnRfZm9ybWF0ID09IERPVF9EUkFXKSB7CisJCQlzZXFfcHJpbnRmKHNlcSwKKwkJCQkgICAiXHRcIiVzXCIgLT4gXCIlc1wiIFtsYWJlbD1cIiVkLiVkXCJdXG4iLAorCQkJCSAgIGZyb20sIHRvLCBpbnRfcGFydCwgZnJhY19wYXJ0KTsKKwkJfSBlbHNlIHsKKwkJCXNlcV9wcmludGYoc2VxLAorCQkJCSAgICIlc1x0eyByb3V0ZXIgOiBcIiVzXCIsIG5laWdoYm91ciA6IFwiJXNcIiwgbGFiZWwgOiAlZC4lZCB9IiwKKwkJCQkgICAoZmlyc3RfbGluZSA/ICIiIDogIixcbiIpLCBmcm9tLCB0bywgaW50X3BhcnQsIGZyYWNfcGFydCk7CisJCX0KKwl9Cit9CisKKworc3RhdGljIGludCBwcm9jX3Zpc19yZWFkKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisJc3RydWN0IGhhc2hfaXRfdCAqaGFzaGl0ID0gTlVMTDsKKwlzdHJ1Y3QgdmlzX2luZm8gKmluZm87CisJc3RydWN0IHZpc19pbmZvX2VudHJ5ICplbnRyaWVzOworCXN0cnVjdCB2aXNfaWZfbGlzdCAqaWZfZW50cmllcyA9IE5VTEw7CisJaW50IGk7CisJdWludDhfdCBjdXJyZW50X2Zvcm1hdCwgZmlyc3RfbGluZSA9IDE7CisjaWZuZGVmIFZJU19TVUJDTFVTVEVSU19ESVNBQkxFRAorCWNoYXIgdG1wX2FkZHJfc3RyW0VUSF9TVFJfTEVOXTsKKwlzdHJ1Y3QgdmlzX2lmX2xpc3QgKnRtcF9pZl9uZXh0OworI2VuZGlmIC8qIFZJU19TVUJDTFVTVEVSU19ESVNBQkxFRCAqLworCisJY3VycmVudF9mb3JtYXQgPSB2aXNfZm9ybWF0OworCisJcmN1X3JlYWRfbG9jaygpOworCWlmIChsaXN0X2VtcHR5KCZpZl9saXN0KSB8fCAoIWlzX3Zpc19zZXJ2ZXIoKSkpIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCWlmIChjdXJyZW50X2Zvcm1hdCA9PSBET1RfRFJBVykKKwkJCXNlcV9wcmludGYoc2VxLCAiZGlncmFwaCB7XG59XG4iKTsKKwkJZ290byBlbmQ7CisJfQorCisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAoY3VycmVudF9mb3JtYXQgPT0gRE9UX0RSQVcpCisJCXNlcV9wcmludGYoc2VxLCAiZGlncmFwaCB7XG4iKTsKKworCXNwaW5fbG9jaygmdmlzX2hhc2hfbG9jayk7CisJd2hpbGUgKE5VTEwgIT0gKGhhc2hpdCA9IGhhc2hfaXRlcmF0ZSh2aXNfaGFzaCwgaGFzaGl0KSkpIHsKKwkJaW5mbyA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCQllbnRyaWVzID0gKHN0cnVjdCB2aXNfaW5mb19lbnRyeSAqKQorCQkJKChjaGFyICopaW5mbyArIHNpemVvZihzdHJ1Y3QgdmlzX2luZm8pKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+cGFja2V0LmVudHJpZXM7IGkrKykgeworCQkJcHJvY192aXNfcmVhZF9lbnRyeShzZXEsICZlbnRyaWVzW2ldLCAmaWZfZW50cmllcywKKwkJCQkJICAgIGluZm8tPnBhY2tldC52aXNfb3JpZywKKwkJCQkJICAgIGN1cnJlbnRfZm9ybWF0LCBmaXJzdF9saW5lKTsKKwkJCWlmIChmaXJzdF9saW5lKQorCQkJCWZpcnN0X2xpbmUgPSAwOworCQl9CisKKyNpZm5kZWYgVklTX1NVQkNMVVNURVJTX0RJU0FCTEVECisJCS8qIEdlbmVyYXRlIHN1YmdyYXBocyBmcm9tIHRoZSBjb2xsZWN0ZWQgaXRlbXMgKi8KKwkJaWYgKGN1cnJlbnRfZm9ybWF0ID09IERPVF9EUkFXKSB7CisKKwkJCWFkZHJfdG9fc3RyaW5nKHRtcF9hZGRyX3N0ciwgaW5mby0+cGFja2V0LnZpc19vcmlnKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiXHRzdWJncmFwaCBcImNsdXN0ZXJfJXNcIiB7XG4iLCB0bXBfYWRkcl9zdHIpOworCQkJd2hpbGUgKGlmX2VudHJpZXMgIT0gTlVMTCkgeworCisJCQkJYWRkcl90b19zdHJpbmcodG1wX2FkZHJfc3RyLCBpZl9lbnRyaWVzLT5hZGRyKTsKKwkJCQlpZiAoaWZfZW50cmllcy0+cHJpbWFyeSkKKwkJCQkJc2VxX3ByaW50ZihzZXEsICJcdFx0XCIlc1wiIFtwZXJpcGhlcmllcz0yXVxuIiwgdG1wX2FkZHJfc3RyKTsKKwkJCQllbHNlCisJCQkJCXNlcV9wcmludGYoc2VxLCAiXHRcdFwiJXNcIlxuIiwgdG1wX2FkZHJfc3RyKTsKKworCQkJCS8qIC4uLiBhbmQgZW1wdHkgdGhlIGxpc3Qgd2hpbGUgZG9pbmcgdGhpcyAqLworCQkJCXRtcF9pZl9uZXh0ID0gaWZfZW50cmllcy0+bmV4dDsKKwkJCQlrZnJlZShpZl9lbnRyaWVzKTsKKwkJCQlpZl9lbnRyaWVzID0gdG1wX2lmX25leHQ7CisJCQl9CisJCQlzZXFfcHJpbnRmKHNlcSwgIlx0fVxuIik7CisJCX0KKyNlbmRpZiAvKiBWSVNfU1VCQ0xVU1RFUlNfRElTQUJMRUQgKi8KKwl9CisJc3Bpbl91bmxvY2soJnZpc19oYXNoX2xvY2spOworCisJaWYgKGN1cnJlbnRfZm9ybWF0ID09IERPVF9EUkFXKQorCQlzZXFfcHJpbnRmKHNlcSwgIn1cbiIpOworCWVsc2UKKwkJc2VxX3ByaW50ZihzZXEsICJcbiIpOworZW5kOgorCXJldHVybiAwOworfQorCisvKiBzZXR0aW5nIHRoZSBtb2RlIG9mIHRoZSB2aXMgc2VydmVyIGJ5IHRoZSB1c2VyICovCitzdGF0aWMgc3NpemVfdCBwcm9jX3Zpc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyICp2aXNfbW9kZV9zdHJpbmc7CisJaW50IG5vdF9jb3BpZWQgPSAwOworCisJdmlzX21vZGVfc3RyaW5nID0ga21hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXZpc19tb2RlX3N0cmluZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlub3RfY29waWVkID0gY29weV9mcm9tX3VzZXIodmlzX21vZGVfc3RyaW5nLCBidWZmZXIsIGNvdW50KTsKKwl2aXNfbW9kZV9zdHJpbmdbY291bnQgLSBub3RfY29waWVkIC0gMV0gPSAwOworCisJaWYgKHN0cmNtcCh2aXNfbW9kZV9zdHJpbmcsICJjbGllbnQiKSA9PSAwKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9OT1RJQ0UsICJTZXR0aW5nIFZJUyBtb2RlIHRvIGNsaWVudFxuIik7CisJCXZpc19zZXRfbW9kZShWSVNfVFlQRV9DTElFTlRfVVBEQVRFKTsKKwl9IGVsc2UgaWYgKHN0cmNtcCh2aXNfbW9kZV9zdHJpbmcsICJzZXJ2ZXIiKSA9PSAwKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9OT1RJQ0UsICJTZXR0aW5nIFZJUyBtb2RlIHRvIHNlcnZlclxuIik7CisJCXZpc19zZXRfbW9kZShWSVNfVFlQRV9TRVJWRVJfU1lOQyk7CisJfSBlbHNlCisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLCAiVW5rbm93biBWSVMgbW9kZTogJXNcbiIsCisJCQkgIHZpc19tb2RlX3N0cmluZyk7CisKKwlrZnJlZSh2aXNfbW9kZV9zdHJpbmcpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBwcm9jX3Zpc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwcm9jX3Zpc19yZWFkLCBOVUxMKTsKK30KKworc3RhdGljIGludCBwcm9jX3Zpc19mb3JtYXRfcmVhZChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQoreworCXVpbnQ4X3QgY3VycmVudF9mb3JtYXQgPSB2aXNfZm9ybWF0OworCisJc2VxX3ByaW50ZihzZXEsICJbJWNdICVzXG4iLAorCQkgICAoY3VycmVudF9mb3JtYXQgPT0gRE9UX0RSQVcpID8gJ3gnIDogJyAnLAorCQkgICBWSVNfRk9STUFUX0REX05BTUUpOworCXNlcV9wcmludGYoc2VxLCAiWyVjXSAlc1xuIiwKKwkJICAgKGN1cnJlbnRfZm9ybWF0ID09IEpTT04pID8gJ3gnIDogJyAnLAorCQkgICBWSVNfRk9STUFUX0pTT05fTkFNRSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY192aXNfZm9ybWF0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHByb2NfdmlzX2Zvcm1hdF9yZWFkLCBOVUxMKTsKK30KKworc3RhdGljIHNzaXplX3QgcHJvY192aXNfZm9ybWF0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgKnZpc19mb3JtYXRfc3RyaW5nOworCWludCBub3RfY29waWVkID0gMDsKKworCXZpc19mb3JtYXRfc3RyaW5nID0ga21hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXZpc19mb3JtYXRfc3RyaW5nKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5vdF9jb3BpZWQgPSBjb3B5X2Zyb21fdXNlcih2aXNfZm9ybWF0X3N0cmluZywgYnVmZmVyLCBjb3VudCk7CisJdmlzX2Zvcm1hdF9zdHJpbmdbY291bnQgLSBub3RfY29waWVkIC0gMV0gPSAwOworCisJaWYgKHN0cmNtcCh2aXNfZm9ybWF0X3N0cmluZywgVklTX0ZPUk1BVF9ERF9OQU1FKSA9PSAwKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9OT1RJQ0UsICJTZXR0aW5nIFZJUyBvdXRwdXQgZm9ybWF0IHRvOiAlc1xuIiwKKwkJCSAgVklTX0ZPUk1BVF9ERF9OQU1FKTsKKwkJdmlzX2Zvcm1hdCA9IERPVF9EUkFXOworCX0gZWxzZSBpZiAoc3RyY21wKHZpc19mb3JtYXRfc3RyaW5nLCBWSVNfRk9STUFUX0pTT05fTkFNRSkgPT0gMCkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfTk9USUNFLCAiU2V0dGluZyBWSVMgb3V0cHV0IGZvcm1hdCB0bzogJXNcbiIsCisJCQkgIFZJU19GT1JNQVRfSlNPTl9OQU1FKTsKKwkJdmlzX2Zvcm1hdCA9IEpTT047CisJfSBlbHNlCisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLCAiVW5rbm93biBWSVMgb3V0cHV0IGZvcm1hdDogJXNcbiIsCisJCQkgIHZpc19mb3JtYXRfc3RyaW5nKTsKKworCWtmcmVlKHZpc19mb3JtYXRfc3RyaW5nKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19hZ2dyX3JlYWQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwlzZXFfcHJpbnRmKHNlcSwgIiVpXG4iLCBhdG9taWNfcmVhZCgmYWdncmVnYXRpb25fZW5hYmxlZCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHByb2NfYWdncl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyICphZ2dyX3N0cmluZzsKKwlpbnQgbm90X2NvcGllZCA9IDA7CisJdW5zaWduZWQgbG9uZyBhZ2dyZWdhdGlvbl9lbmFibGVkX3RtcDsKKworCWFnZ3Jfc3RyaW5nID0ga21hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWFnZ3Jfc3RyaW5nKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5vdF9jb3BpZWQgPSBjb3B5X2Zyb21fdXNlcihhZ2dyX3N0cmluZywgYnVmZmVyLCBjb3VudCk7CisJYWdncl9zdHJpbmdbY291bnQgLSBub3RfY29waWVkIC0gMV0gPSAwOworCisJc3RyaWN0X3N0cnRvdWwoYWdncl9zdHJpbmcsIDEwLCAmYWdncmVnYXRpb25fZW5hYmxlZF90bXApOworCisJaWYgKChhZ2dyZWdhdGlvbl9lbmFibGVkX3RtcCAhPSAwKSAmJiAoYWdncmVnYXRpb25fZW5hYmxlZF90bXAgIT0gMSkpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sICJBZ2dyZWdhdGlvbiBjYW4gb25seSBiZSBlbmFibGVkICgxKSBvciBkaXNhYmxlZCAoMCksIGdpdmVuIHZhbHVlOiAlbGlcbiIsIGFnZ3JlZ2F0aW9uX2VuYWJsZWRfdG1wKTsKKwkJZ290byBlbmQ7CisJfQorCisJZGVidWdfbG9nKExPR19UWVBFX05PVElDRSwgIkNoYW5naW5nIGFnZ3JlZ2F0aW9uIGZyb206ICVzICglaSkgdG86ICVzICglbGkpXG4iLAorCQkgIChhdG9taWNfcmVhZCgmYWdncmVnYXRpb25fZW5hYmxlZCkgPT0gMSA/CisJCSAgICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpLAorCQkgIGF0b21pY19yZWFkKCZhZ2dyZWdhdGlvbl9lbmFibGVkKSwKKwkJICAoYWdncmVnYXRpb25fZW5hYmxlZF90bXAgPT0gMSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpLAorCQkgIGFnZ3JlZ2F0aW9uX2VuYWJsZWRfdG1wKTsKKworCWF0b21pY19zZXQoJmFnZ3JlZ2F0aW9uX2VuYWJsZWQsICh1bnNpZ25lZClhZ2dyZWdhdGlvbl9lbmFibGVkX3RtcCk7CitlbmQ6CisJa2ZyZWUoYWdncl9zdHJpbmcpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBwcm9jX2FnZ3Jfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcHJvY19hZ2dyX3JlYWQsIE5VTEwpOworfQorCisvKiBzYXRpc2Z5aW5nIGRpZmZlcmVudCBwcm90b3R5cGVzIC4uLiAqLworc3RhdGljIHNzaXplX3QgcHJvY19kdW1teV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfYWdncl9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBwcm9jX2FnZ3Jfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkud3JpdGUJCT0gcHJvY19hZ2dyX3dyaXRlLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3Zpc19mb3JtYXRfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gcHJvY192aXNfZm9ybWF0X29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLndyaXRlCQk9IHByb2NfdmlzX2Zvcm1hdF93cml0ZSwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY192aXNfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gcHJvY192aXNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkud3JpdGUJCT0gcHJvY192aXNfd3JpdGUsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfb3JpZ2luYXRvcnNfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gcHJvY19vcmlnaW5hdG9yc19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS53cml0ZQkJPSBwcm9jX2R1bW15X3dyaXRlLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3RyYW5zdF9sb2NhbF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBwcm9jX3RyYW5zdF9sb2NhbF9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS53cml0ZQkJPSBwcm9jX2R1bW15X3dyaXRlLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3RyYW5zdF9nbG9iYWxfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gcHJvY190cmFuc3RfZ2xvYmFsX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLndyaXRlCQk9IHByb2NfZHVtbXlfd3JpdGUsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfbG9nX2xldmVsX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHByb2NfbG9nX2xldmVsX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLndyaXRlCQk9IHByb2NfbG9nX2xldmVsX3dyaXRlLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2ludGVyZmFjZXNfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gcHJvY19pbnRlcmZhY2VzX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLndyaXRlCQk9IHByb2NfaW50ZXJmYWNlc193cml0ZSwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19vcmlnX2ludGVydmFsX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHByb2Nfb3JpZ19pbnRlcnZhbF9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS53cml0ZQkJPSBwcm9jX29yaWdfaW50ZXJ2YWxfd3JpdGUsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3ZvaWQgY2xlYW51cF9wcm9jZnModm9pZCkKK3sKKwlpZiAocHJvY190cmFuc3RfZ2xvYmFsX2ZpbGUpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9UUkFOU1RfR0xPQkFMLCBwcm9jX2JhdG1hbl9kaXIpOworCisJaWYgKHByb2NfdHJhbnN0X2xvY2FsX2ZpbGUpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9UUkFOU1RfTE9DQUwsIHByb2NfYmF0bWFuX2Rpcik7CisKKwlpZiAocHJvY19sb2dfZmlsZSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19GSUxFX0xPRywgcHJvY19iYXRtYW5fZGlyKTsKKworCWlmIChwcm9jX2xvZ19sZXZlbF9maWxlKQorCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0ZJTEVfTE9HX0xFVkVMLCBwcm9jX2JhdG1hbl9kaXIpOworCisJaWYgKHByb2Nfb3JpZ2luYXRvcnNfZmlsZSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19GSUxFX09SSUdJTkFUT1JTLCBwcm9jX2JhdG1hbl9kaXIpOworCisJaWYgKHByb2Nfb3JpZ19pbnRlcnZhbF9maWxlKQorCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0ZJTEVfT1JJR19JTlRFUlZBTCwgcHJvY19iYXRtYW5fZGlyKTsKKworCWlmIChwcm9jX2ludGVyZmFjZV9maWxlKQorCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0ZJTEVfSU5URVJGQUNFUywgcHJvY19iYXRtYW5fZGlyKTsKKworCWlmIChwcm9jX3Zpc19maWxlKQorCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0ZJTEVfVklTLCBwcm9jX2JhdG1hbl9kaXIpOworCisJaWYgKHByb2NfdmlzX2Zvcm1hdF9maWxlKQorCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0ZJTEVfVklTX0ZPUk1BVCwgcHJvY19iYXRtYW5fZGlyKTsKKworCWlmIChwcm9jX2FnZ3JfZmlsZSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19GSUxFX0FHR1IsIHByb2NfYmF0bWFuX2Rpcik7CisKKwlpZiAocHJvY19iYXRtYW5fZGlyKQorI2lmZGVmIF9fTkVUX05FVF9OQU1FU1BBQ0VfSAorCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX1JPT1RfRElSLCBpbml0X25ldC5wcm9jX25ldCk7CisjZWxzZQorCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX1JPT1RfRElSLCBwcm9jX25ldCk7CisjZW5kaWYKK30KKworaW50IHNldHVwX3Byb2Nmcyh2b2lkKQoreworI2lmZGVmIF9fTkVUX05FVF9OQU1FU1BBQ0VfSAorCXByb2NfYmF0bWFuX2RpciA9IHByb2NfbWtkaXIoUFJPQ19ST09UX0RJUiwgaW5pdF9uZXQucHJvY19uZXQpOworI2Vsc2UKKwlwcm9jX2JhdG1hbl9kaXIgPSBwcm9jX21rZGlyKFBST0NfUk9PVF9ESVIsIHByb2NfbmV0KTsKKyNlbmRpZgorCisJaWYgKCFwcm9jX2JhdG1hbl9kaXIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiBSZWdpc3RlcmluZyB0aGUgJy9wcm9jL25ldC8lcycgZm9sZGVyIGZhaWxlZFxuIiwgUFJPQ19ST09UX0RJUik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXByb2NfaW50ZXJmYWNlX2ZpbGUgPSBjcmVhdGVfcHJvY19lbnRyeShQUk9DX0ZJTEVfSU5URVJGQUNFUywKKwkJCQkJCVNfSVdVU1IgfCBTX0lSVUdPLAorCQkJCQkJcHJvY19iYXRtYW5fZGlyKTsKKwlpZiAocHJvY19pbnRlcmZhY2VfZmlsZSkgeworCQlwcm9jX2ludGVyZmFjZV9maWxlLT5wcm9jX2ZvcHMgPSAmcHJvY19pbnRlcmZhY2VzX2ZvcHM7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiBSZWdpc3RlcmluZyB0aGUgJy9wcm9jL25ldC8lcy8lcycgZmlsZSBmYWlsZWRcbiIsIFBST0NfUk9PVF9ESVIsIFBST0NfRklMRV9JTlRFUkZBQ0VTKTsKKwkJY2xlYW51cF9wcm9jZnMoKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcHJvY19vcmlnX2ludGVydmFsX2ZpbGUgPSBjcmVhdGVfcHJvY19lbnRyeShQUk9DX0ZJTEVfT1JJR19JTlRFUlZBTCwKKwkJCQkJCSAgICBTX0lXVVNSIHwgU19JUlVHTywKKwkJCQkJCSAgICBwcm9jX2JhdG1hbl9kaXIpOworCWlmIChwcm9jX29yaWdfaW50ZXJ2YWxfZmlsZSkgeworCQlwcm9jX29yaWdfaW50ZXJ2YWxfZmlsZS0+cHJvY19mb3BzID0gJnByb2Nfb3JpZ19pbnRlcnZhbF9mb3BzOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiYmF0bWFuLWFkdjogUmVnaXN0ZXJpbmcgdGhlICcvcHJvYy9uZXQvJXMvJXMnIGZpbGUgZmFpbGVkXG4iLCBQUk9DX1JPT1RfRElSLCBQUk9DX0ZJTEVfT1JJR19JTlRFUlZBTCk7CisJCWNsZWFudXBfcHJvY2ZzKCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXByb2NfbG9nX2xldmVsX2ZpbGUgPSBjcmVhdGVfcHJvY19lbnRyeShQUk9DX0ZJTEVfTE9HX0xFVkVMLAorCQkJCQkJU19JV1VTUiB8IFNfSVJVR08sCisJCQkJCQlwcm9jX2JhdG1hbl9kaXIpOworCWlmIChwcm9jX2xvZ19sZXZlbF9maWxlKSB7CisJCXByb2NfbG9nX2xldmVsX2ZpbGUtPnByb2NfZm9wcyA9ICZwcm9jX2xvZ19sZXZlbF9mb3BzOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiYmF0bWFuLWFkdjogUmVnaXN0ZXJpbmcgdGhlICcvcHJvYy9uZXQvJXMvJXMnIGZpbGUgZmFpbGVkXG4iLCBQUk9DX1JPT1RfRElSLCBQUk9DX0ZJTEVfTE9HX0xFVkVMKTsKKwkJY2xlYW51cF9wcm9jZnMoKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcHJvY19vcmlnaW5hdG9yc19maWxlID0gY3JlYXRlX3Byb2NfZW50cnkoUFJPQ19GSUxFX09SSUdJTkFUT1JTLAorCQkJCQkJICBTX0lSVUdPLCBwcm9jX2JhdG1hbl9kaXIpOworCWlmIChwcm9jX29yaWdpbmF0b3JzX2ZpbGUpIHsKKwkJcHJvY19vcmlnaW5hdG9yc19maWxlLT5wcm9jX2ZvcHMgPSAmcHJvY19vcmlnaW5hdG9yc19mb3BzOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiYmF0bWFuLWFkdjogUmVnaXN0ZXJpbmcgdGhlICcvcHJvYy9uZXQvJXMvJXMnIGZpbGUgZmFpbGVkXG4iLCBQUk9DX1JPT1RfRElSLCBQUk9DX0ZJTEVfT1JJR0lOQVRPUlMpOworCQljbGVhbnVwX3Byb2NmcygpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlwcm9jX2xvZ19maWxlID0gY3JlYXRlX3Byb2NfZW50cnkoUFJPQ19GSUxFX0xPRywKKwkJCQkJICBTX0lSVUdPLCBwcm9jX2JhdG1hbl9kaXIpOworCWlmIChwcm9jX2xvZ19maWxlKSB7CisJCXByb2NfbG9nX2ZpbGUtPnByb2NfZm9wcyA9ICZwcm9jX2xvZ19vcGVyYXRpb25zOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiYmF0bWFuLWFkdjogUmVnaXN0ZXJpbmcgdGhlICcvcHJvYy9uZXQvJXMvJXMnIGZpbGUgZmFpbGVkXG4iLCBQUk9DX0ZJTEVfTE9HLCBQUk9DX0ZJTEVfR0FURVdBWVMpOworCQljbGVhbnVwX3Byb2NmcygpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlwcm9jX3RyYW5zdF9sb2NhbF9maWxlID0gY3JlYXRlX3Byb2NfZW50cnkoUFJPQ19GSUxFX1RSQU5TVF9MT0NBTCwKKwkJCQkJCSAgIFNfSVJVR08sIHByb2NfYmF0bWFuX2Rpcik7CisJaWYgKHByb2NfdHJhbnN0X2xvY2FsX2ZpbGUpIHsKKwkJcHJvY190cmFuc3RfbG9jYWxfZmlsZS0+cHJvY19mb3BzID0gJnByb2NfdHJhbnN0X2xvY2FsX2ZvcHM7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiBSZWdpc3RlcmluZyB0aGUgJy9wcm9jL25ldC8lcy8lcycgZmlsZSBmYWlsZWRcbiIsIFBST0NfUk9PVF9ESVIsIFBST0NfRklMRV9UUkFOU1RfTE9DQUwpOworCQljbGVhbnVwX3Byb2NmcygpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlwcm9jX3RyYW5zdF9nbG9iYWxfZmlsZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9UUkFOU1RfR0xPQkFMLAorCQkJCQkJICAgIFNfSVJVR08sIHByb2NfYmF0bWFuX2Rpcik7CisJaWYgKHByb2NfdHJhbnN0X2dsb2JhbF9maWxlKSB7CisJCXByb2NfdHJhbnN0X2dsb2JhbF9maWxlLT5wcm9jX2ZvcHMgPSAmcHJvY190cmFuc3RfZ2xvYmFsX2ZvcHM7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiBSZWdpc3RlcmluZyB0aGUgJy9wcm9jL25ldC8lcy8lcycgZmlsZSBmYWlsZWRcbiIsIFBST0NfUk9PVF9ESVIsIFBST0NfRklMRV9UUkFOU1RfR0xPQkFMKTsKKwkJY2xlYW51cF9wcm9jZnMoKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcHJvY192aXNfZmlsZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9WSVMsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJCQkgIHByb2NfYmF0bWFuX2Rpcik7CisJaWYgKHByb2NfdmlzX2ZpbGUpIHsKKwkJcHJvY192aXNfZmlsZS0+cHJvY19mb3BzID0gJnByb2NfdmlzX2ZvcHM7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiBSZWdpc3RlcmluZyB0aGUgJy9wcm9jL25ldC8lcy8lcycgZmlsZSBmYWlsZWRcbiIsIFBST0NfUk9PVF9ESVIsIFBST0NfRklMRV9WSVMpOworCQljbGVhbnVwX3Byb2NmcygpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlwcm9jX3Zpc19mb3JtYXRfZmlsZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9WSVNfRk9STUFULAorCQkJCQkJIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJCQkJIHByb2NfYmF0bWFuX2Rpcik7CisJaWYgKHByb2NfdmlzX2Zvcm1hdF9maWxlKSB7CisJCXByb2NfdmlzX2Zvcm1hdF9maWxlLT5wcm9jX2ZvcHMgPSAmcHJvY192aXNfZm9ybWF0X2ZvcHM7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiBSZWdpc3RlcmluZyB0aGUgJy9wcm9jL25ldC8lcy8lcycgZmlsZSBmYWlsZWRcbiIsIFBST0NfUk9PVF9ESVIsIFBST0NfRklMRV9WSVNfRk9STUFUKTsKKwkJY2xlYW51cF9wcm9jZnMoKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcHJvY19hZ2dyX2ZpbGUgPSBjcmVhdGVfcHJvY19lbnRyeShQUk9DX0ZJTEVfQUdHUiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkJCSAgIHByb2NfYmF0bWFuX2Rpcik7CisJaWYgKHByb2NfYWdncl9maWxlKSB7CisJCXByb2NfYWdncl9maWxlLT5wcm9jX2ZvcHMgPSAmcHJvY19hZ2dyX2ZvcHM7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiBSZWdpc3RlcmluZyB0aGUgJy9wcm9jL25ldC8lcy8lcycgZmlsZSBmYWlsZWRcbiIsIFBST0NfUk9PVF9ESVIsIFBST0NfRklMRV9BR0dSKTsKKwkJY2xlYW51cF9wcm9jZnMoKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcHJvYy5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcHJvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZDNlZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9wcm9jLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2RlZmluZSBQUk9DX1JPT1RfRElSICJiYXRtYW4tYWR2IgorI2RlZmluZSBQUk9DX0ZJTEVfSU5URVJGQUNFUyAiaW50ZXJmYWNlcyIKKyNkZWZpbmUgUFJPQ19GSUxFX09SSUdfSU5URVJWQUwgIm9yaWdfaW50ZXJ2YWwiCisjZGVmaW5lIFBST0NfRklMRV9PUklHSU5BVE9SUyAib3JpZ2luYXRvcnMiCisjZGVmaW5lIFBST0NfRklMRV9HQVRFV0FZUyAiZ2F0ZXdheXMiCisjZGVmaW5lIFBST0NfRklMRV9MT0cgImxvZyIKKyNkZWZpbmUgUFJPQ19GSUxFX0xPR19MRVZFTCAibG9nX2xldmVsIgorI2RlZmluZSBQUk9DX0ZJTEVfVFJBTlNUX0xPQ0FMICJ0cmFuc3RhYmxlX2xvY2FsIgorI2RlZmluZSBQUk9DX0ZJTEVfVFJBTlNUX0dMT0JBTCAidHJhbnN0YWJsZV9nbG9iYWwiCisjZGVmaW5lIFBST0NfRklMRV9WSVMgInZpcyIKKyNkZWZpbmUgUFJPQ19GSUxFX1ZJU19GT1JNQVQgInZpc19mb3JtYXQiCisjZGVmaW5lIFBST0NfRklMRV9BR0dSICJhZ2dyZWdhdGVfb2dtIgorCit2b2lkIGNsZWFudXBfcHJvY2ZzKHZvaWQpOworaW50IHNldHVwX3Byb2Nmcyh2b2lkKTsKKworLyogV2hpbGUgc2Nhbm5pbmcgZm9yIHZpcy1lbnRyaWVzIG9mIGEgcGFydGljdWxhciB2aXMtb3JpZ2luYXRvcgorICogdGhpcyBsaXN0IGNvbGxlY3RzIGl0cyBpbnRlcmZhY2VzIHRvIGNyZWF0ZSBhIHN1YmdyYXBoL2NsdXN0ZXIKKyAqIG91dCBvZiB0aGVtIGxhdGVyCisgKi8KK3N0cnVjdCB2aXNfaWZfbGlzdCB7CisJdWludDhfdCBhZGRyW0VUSF9BTEVOXTsKKwlib29sIHByaW1hcnk7CisJc3RydWN0IHZpc19pZl9saXN0ICpuZXh0OworfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JpbmdfYnVmZmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MWM4OTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgInJpbmdfYnVmZmVyLmgiCisKK3ZvaWQgcmluZ19idWZmZXJfc2V0KHVpbnQ4X3QgbHFfcmVjdltdLCB1aW50OF90ICpscV9pbmRleCwgdWludDhfdCB2YWx1ZSkKK3sKKwlscV9yZWN2WypscV9pbmRleF0gPSB2YWx1ZTsKKwkqbHFfaW5kZXggPSAoKmxxX2luZGV4ICsgMSkgJSBUUV9HTE9CQUxfV0lORE9XX1NJWkU7Cit9CisKK3VpbnQ4X3QgcmluZ19idWZmZXJfYXZnKHVpbnQ4X3QgbHFfcmVjdltdKQoreworCXVpbnQ4X3QgKnB0cjsKKwl1aW50MTZfdCBjb3VudCA9IDAsIGkgPSAwLCBzdW0gPSAwOworCisJcHRyID0gbHFfcmVjdjsKKworCXdoaWxlIChpIDwgVFFfR0xPQkFMX1dJTkRPV19TSVpFKSB7CisJCWlmICgqcHRyICE9IDApIHsKKwkJCWNvdW50Kys7CisJCQlzdW0gKz0gKnB0cjsKKwkJfQorCisJCWkrKzsKKwkJcHRyKys7CisJfQorCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCisJcmV0dXJuICh1aW50OF90KShzdW0gLyBjb3VudCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcmluZ19idWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODM5YmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcmluZ19idWZmZXIuaApAQCAtMCwwICsxLDIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKwordm9pZCByaW5nX2J1ZmZlcl9zZXQodWludDhfdCBscV9yZWN2W10sIHVpbnQ4X3QgKmxxX2luZGV4LCB1aW50OF90IHZhbHVlKTsKK3VpbnQ4X3QgcmluZ19idWZmZXJfYXZnKHVpbnQ4X3QgbHFfcmVjdltdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JvdXRpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JvdXRpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTE0YzM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcm91dGluZy5jCkBAIC0wLDAgKzEsMTAxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKworCisKKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJyb3V0aW5nLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic2VuZC5oIgorI2luY2x1ZGUgInNvZnQtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJkZXZpY2UuaCIKKyNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiaGFzaC5oIgorI2luY2x1ZGUgInJpbmdfYnVmZmVyLmgiCisjaW5jbHVkZSAidmlzLmgiCisjaW5jbHVkZSAiYWdncmVnYXRpb24uaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKworCisKK0RFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHRocmVhZF93YWl0KTsKK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhwdXJnZV9vcmlnX3dxLCBwdXJnZV9vcmlnKTsKKworc3RhdGljIGF0b21pY190IGRhdGFfcmVhZHlfY29uZDsKK2F0b21pY190IGV4aXRfY29uZDsKKworc3RhdGljIHZvaWQgc3RhcnRfcHVyZ2VfdGltZXIodm9pZCkKK3sKKwlxdWV1ZV9kZWxheWVkX3dvcmsoYmF0X2V2ZW50X3dvcmtxdWV1ZSwgJnB1cmdlX29yaWdfd3EsIDEgKiBIWik7Cit9CisKK2ludCBvcmlnaW5hdG9yX2luaXQodm9pZCkKK3sKKwlpZiAob3JpZ19oYXNoKQorCQlyZXR1cm4gMTsKKworCXNwaW5fbG9jaygmb3JpZ19oYXNoX2xvY2spOworCW9yaWdfaGFzaCA9IGhhc2hfbmV3KDEyOCwgY29tcGFyZV9vcmlnLCBjaG9vc2Vfb3JpZyk7CisKKwlpZiAoIW9yaWdfaGFzaCkKKwkJZ290byBlcnI7CisKKwlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCXN0YXJ0X3B1cmdlX3RpbWVyKCk7CisJcmV0dXJuIDE7CisKK2VycjoKKwlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCXJldHVybiAwOworfQorCit2b2lkIG9yaWdpbmF0b3JfZnJlZSh2b2lkKQoreworCWlmICghb3JpZ19oYXNoKQorCQlyZXR1cm47CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnB1cmdlX29yaWdfd3EpOworCisJc3Bpbl9sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJaGFzaF9kZWxldGUob3JpZ19oYXNoLCBmcmVlX29yaWdfbm9kZSk7CisJb3JpZ19oYXNoID0gTlVMTDsKKwlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworfQorCitzdGF0aWMgc3RydWN0IG5laWdoX25vZGUgKmNyZWF0ZV9uZWlnaGJvcihzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbmVpZ2hfbm9kZSwgdWludDhfdCAqbmVpZ2gsIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKQoreworCXN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlOworCisJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwgIkNyZWF0aW5nIG5ldyBsYXN0LWhvcCBuZWlnaGJvdXIgb2Ygb3JpZ2luYXRvclxuIik7CisKKwluZWlnaF9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5laWdoX25vZGUpLCBHRlBfQVRPTUlDKTsKKwltZW1zZXQobmVpZ2hfbm9kZSwgMCwgc2l6ZW9mKHN0cnVjdCBuZWlnaF9ub2RlKSk7CisJSU5JVF9MSVNUX0hFQUQoJm5laWdoX25vZGUtPmxpc3QpOworCisJbWVtY3B5KG5laWdoX25vZGUtPmFkZHIsIG5laWdoLCBFVEhfQUxFTik7CisJbmVpZ2hfbm9kZS0+b3JpZ19ub2RlID0gb3JpZ19uZWlnaF9ub2RlOworCW5laWdoX25vZGUtPmlmX2luY29taW5nID0gaWZfaW5jb21pbmc7CisKKwlsaXN0X2FkZF90YWlsKCZuZWlnaF9ub2RlLT5saXN0LCAmb3JpZ19ub2RlLT5uZWlnaF9saXN0KTsKKwlyZXR1cm4gbmVpZ2hfbm9kZTsKK30KKwordm9pZCBmcmVlX29yaWdfbm9kZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3RfcG9zLCAqbGlzdF9wb3NfdG1wOworCXN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlOworCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSA9IChzdHJ1Y3Qgb3JpZ19ub2RlICopZGF0YTsKKworCS8qIGZvciBhbGwgbmVpZ2hib3VycyB0b3dhcmRzIHRoaXMgb3JpZ2luYXRvciAuLi4gKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdF9wb3MsIGxpc3RfcG9zX3RtcCwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCkgeworCQluZWlnaF9ub2RlID0gbGlzdF9lbnRyeShsaXN0X3Bvcywgc3RydWN0IG5laWdoX25vZGUsIGxpc3QpOworCisJCWxpc3RfZGVsKGxpc3RfcG9zKTsKKwkJa2ZyZWUobmVpZ2hfbm9kZSk7CisJfQorCisJaG5hX2dsb2JhbF9kZWxfb3JpZyhvcmlnX25vZGUsICJvcmlnaW5hdG9yIHRpbWVkIG91dCIpOworCisJa2ZyZWUob3JpZ19ub2RlLT5iY2FzdF9vd24pOworCWtmcmVlKG9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bSk7CisJa2ZyZWUob3JpZ19ub2RlKTsKK30KKworLyogdGhpcyBmdW5jdGlvbiBmaW5kcyBvciBjcmVhdGVzIGFuIG9yaWdpbmF0b3IgZW50cnkgZm9yIHRoZSBnaXZlbiBhZGRyZXNzIGlmIGl0IGRvZXMgbm90IGV4aXRzICovCitzdGF0aWMgc3RydWN0IG9yaWdfbm9kZSAqZ2V0X29yaWdfbm9kZSh1aW50OF90ICphZGRyKQoreworCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKKwlzdHJ1Y3QgaGFzaHRhYmxlX3QgKnN3YXBoYXNoOworCWNoYXIgb3JpZ19zdHJbRVRIX1NUUl9MRU5dOworCisJb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopaGFzaF9maW5kKG9yaWdfaGFzaCwgYWRkcikpOworCisJaWYgKG9yaWdfbm9kZSAhPSBOVUxMKQorCQlyZXR1cm4gb3JpZ19ub2RlOworCisJYWRkcl90b19zdHJpbmcob3JpZ19zdHIsIGFkZHIpOworCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJDcmVhdGluZyBuZXcgb3JpZ2luYXRvcjogJXMgXG4iLCBvcmlnX3N0cik7CisKKwlvcmlnX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb3JpZ19ub2RlKSwgR0ZQX0FUT01JQyk7CisJbWVtc2V0KG9yaWdfbm9kZSwgMCwgc2l6ZW9mKHN0cnVjdCBvcmlnX25vZGUpKTsKKwlJTklUX0xJU1RfSEVBRCgmb3JpZ19ub2RlLT5uZWlnaF9saXN0KTsKKworCW1lbWNweShvcmlnX25vZGUtPm9yaWcsIGFkZHIsIEVUSF9BTEVOKTsKKwlvcmlnX25vZGUtPnJvdXRlciA9IE5VTEw7CisJb3JpZ19ub2RlLT5iYXRtYW5faWYgPSBOVUxMOworCW9yaWdfbm9kZS0+aG5hX2J1ZmYgPSBOVUxMOworCisJb3JpZ19ub2RlLT5iY2FzdF9vd24gPSBrbWFsbG9jKG51bV9pZnMgKiBzaXplb2YoVFlQRV9PRl9XT1JEKSAqIE5VTV9XT1JEUywgR0ZQX0FUT01JQyk7CisJbWVtc2V0KG9yaWdfbm9kZS0+YmNhc3Rfb3duLCAwLCBudW1faWZzICogc2l6ZW9mKFRZUEVfT0ZfV09SRCkgKiBOVU1fV09SRFMpOworCisJb3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtID0ga21hbGxvYyhudW1faWZzICogc2l6ZW9mKHVpbnQ4X3QpLCBHRlBfQVRPTUlDKTsKKwltZW1zZXQob3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtLCAwLCBudW1faWZzICogc2l6ZW9mKHVpbnQ4X3QpKTsKKworCWhhc2hfYWRkKG9yaWdfaGFzaCwgb3JpZ19ub2RlKTsKKworCWlmIChvcmlnX2hhc2gtPmVsZW1lbnRzICogNCA+IG9yaWdfaGFzaC0+c2l6ZSkgeworCQlzd2FwaGFzaCA9IGhhc2hfcmVzaXplKG9yaWdfaGFzaCwgb3JpZ19oYXNoLT5zaXplICogMik7CisKKwkJaWYgKHN3YXBoYXNoID09IE5VTEwpCisJCQlkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwgIkNvdWxkbid0IHJlc2l6ZSBvcmlnIGhhc2ggdGFibGUgXG4iKTsKKwkJZWxzZQorCQkJb3JpZ19oYXNoID0gc3dhcGhhc2g7CisJfQorCisJcmV0dXJuIG9yaWdfbm9kZTsKK30KKwordm9pZCBzbGlkZV9vd25fYmNhc3Rfd2luZG93KHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKK3sKKwlzdHJ1Y3QgaGFzaF9pdF90ICpoYXNoaXQgPSBOVUxMOworCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKKworCXNwaW5fbG9jaygmb3JpZ19oYXNoX2xvY2spOworCisJd2hpbGUgKE5VTEwgIT0gKGhhc2hpdCA9IGhhc2hfaXRlcmF0ZShvcmlnX2hhc2gsIGhhc2hpdCkpKSB7CisJCW9yaWdfbm9kZSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCisJCWJpdF9nZXRfcGFja2V0KChUWVBFX09GX1dPUkQgKikmKG9yaWdfbm9kZS0+YmNhc3Rfb3duW2JhdG1hbl9pZi0+aWZfbnVtICogTlVNX1dPUkRTXSksIDEsIDApOworCQlvcmlnX25vZGUtPmJjYXN0X293bl9zdW1bYmF0bWFuX2lmLT5pZl9udW1dID0gYml0X3BhY2tldF9jb3VudCgoVFlQRV9PRl9XT1JEICopJihvcmlnX25vZGUtPmJjYXN0X293bltiYXRtYW5faWYtPmlmX251bSAqIE5VTV9XT1JEU10pKTsKKwl9CisKKwlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfcm91dGVzKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGUsIHVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLCBpbnQgaG5hX2J1ZmZfbGVuKQoreworCWNoYXIgb3JpZ19zdHJbRVRIX1NUUl9MRU5dLCBuZWlnaF9zdHJbRVRIX1NUUl9MRU5dLCByb3V0ZXJfc3RyW0VUSF9TVFJfTEVOXTsKKworCWlmIChvcmlnX25vZGUgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKG9yaWdfbm9kZS0+cm91dGVyICE9IG5laWdoX25vZGUpIHsKKwkJYWRkcl90b19zdHJpbmcob3JpZ19zdHIsIG9yaWdfbm9kZS0+b3JpZyk7CisKKwkJLyogcm91dGUgZGVsZXRlZCAqLworCQlpZiAoKG9yaWdfbm9kZS0+cm91dGVyICE9IE5VTEwpICYmIChuZWlnaF9ub2RlID09IE5VTEwpKSB7CisKKwkJCWRlYnVnX2xvZyhMT0dfVFlQRV9ST1VURVMsICJEZWxldGluZyByb3V0ZSB0b3dhcmRzOiAlc1xuIiwgb3JpZ19zdHIpOworCQkJaG5hX2dsb2JhbF9kZWxfb3JpZyhvcmlnX25vZGUsICJvcmlnaW5hdG9yIHRpbWVkIG91dCIpOworCisJCS8qIHJvdXRlIGFkZGVkICovCisJCX0gZWxzZSBpZiAoKG9yaWdfbm9kZS0+cm91dGVyID09IE5VTEwpICYmIChuZWlnaF9ub2RlICE9IE5VTEwpKSB7CisKKwkJCWFkZHJfdG9fc3RyaW5nKG5laWdoX3N0ciwgbmVpZ2hfbm9kZS0+YWRkcik7CisJCQlkZWJ1Z19sb2coTE9HX1RZUEVfUk9VVEVTLCAiQWRkaW5nIHJvdXRlIHRvd2FyZHM6ICVzICh2aWEgJXMpXG4iLCBvcmlnX3N0ciwgbmVpZ2hfc3RyKTsKKwkJCWhuYV9nbG9iYWxfYWRkX29yaWcob3JpZ19ub2RlLCBobmFfYnVmZiwgaG5hX2J1ZmZfbGVuKTsKKworCQkvKiByb3V0ZSBjaGFuZ2VkICovCisJCX0gZWxzZSB7CisKKwkJCWFkZHJfdG9fc3RyaW5nKG5laWdoX3N0ciwgbmVpZ2hfbm9kZS0+YWRkcik7CisJCQlhZGRyX3RvX3N0cmluZyhyb3V0ZXJfc3RyLCBvcmlnX25vZGUtPnJvdXRlci0+YWRkcik7CisJCQlkZWJ1Z19sb2coTE9HX1RZUEVfUk9VVEVTLCAiQ2hhbmdpbmcgcm91dGUgdG93YXJkczogJXMgKG5vdyB2aWEgJXMgLSB3YXMgdmlhICVzKVxuIiwgb3JpZ19zdHIsIG5laWdoX3N0ciwgcm91dGVyX3N0cik7CisKKwkJfQorCisJCWlmIChuZWlnaF9ub2RlICE9IE5VTEwpCisJCQlvcmlnX25vZGUtPmJhdG1hbl9pZiA9IG5laWdoX25vZGUtPmlmX2luY29taW5nOworCQllbHNlCisJCQlvcmlnX25vZGUtPmJhdG1hbl9pZiA9IE5VTEw7CisKKwkJb3JpZ19ub2RlLT5yb3V0ZXIgPSBuZWlnaF9ub2RlOworCisJLyogbWF5IGJlIGp1c3QgSE5BIGNoYW5nZWQgKi8KKwl9IGVsc2UgeworCisJCWlmICgoaG5hX2J1ZmZfbGVuICE9IG9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuKSB8fCAoKGhuYV9idWZmX2xlbiA+IDApICYmIChvcmlnX25vZGUtPmhuYV9idWZmX2xlbiA+IDApICYmIChtZW1jbXAob3JpZ19ub2RlLT5obmFfYnVmZiwgaG5hX2J1ZmYsIGhuYV9idWZmX2xlbikgIT0gMCkpKSB7CisKKwkJCWlmIChvcmlnX25vZGUtPmhuYV9idWZmX2xlbiA+IDApCisJCQkJaG5hX2dsb2JhbF9kZWxfb3JpZyhvcmlnX25vZGUsICJvcmlnaW5hdG9yIGNoYW5nZWQgaG5hIik7CisKKwkJCWlmICgoaG5hX2J1ZmZfbGVuID4gMCkgJiYgKGhuYV9idWZmICE9IE5VTEwpKQorCQkJCWhuYV9nbG9iYWxfYWRkX29yaWcob3JpZ19ub2RlLCBobmFfYnVmZiwgaG5hX2J1ZmZfbGVuKTsKKworCQl9CisKKwl9Cit9CisKK3N0YXRpYyBpbnQgaXNCaWRpcmVjdGlvbmFsTmVpZ2goc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLCBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25laWdoX25vZGUsIHN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0LCBzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZykKK3sKKwlzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSA9IE5VTEwsICp0bXBfbmVpZ2hfbm9kZSA9IE5VTEw7CisJY2hhciBvcmlnX3N0cltFVEhfU1RSX0xFTl0sIG5laWdoX3N0cltFVEhfU1RSX0xFTl07CisJdW5zaWduZWQgY2hhciB0b3RhbF9jb3VudDsKKworCWFkZHJfdG9fc3RyaW5nKG9yaWdfc3RyLCBvcmlnX25vZGUtPm9yaWcpOworCWFkZHJfdG9fc3RyaW5nKG5laWdoX3N0ciwgb3JpZ19uZWlnaF9ub2RlLT5vcmlnKTsKKworCWlmIChvcmlnX25vZGUgPT0gb3JpZ19uZWlnaF9ub2RlKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX25laWdoX25vZGUsICZvcmlnX25vZGUtPm5laWdoX2xpc3QsIGxpc3QpIHsKKworCQkJaWYgKGNvbXBhcmVfb3JpZyh0bXBfbmVpZ2hfbm9kZS0+YWRkciwgb3JpZ19uZWlnaF9ub2RlLT5vcmlnKSAmJiAodG1wX25laWdoX25vZGUtPmlmX2luY29taW5nID09IGlmX2luY29taW5nKSkKKwkJCQluZWlnaF9ub2RlID0gdG1wX25laWdoX25vZGU7CisJCX0KKworCQlpZiAobmVpZ2hfbm9kZSA9PSBOVUxMKQorCQkJbmVpZ2hfbm9kZSA9IGNyZWF0ZV9uZWlnaGJvcihvcmlnX25vZGUsIG9yaWdfbmVpZ2hfbm9kZSwgb3JpZ19uZWlnaF9ub2RlLT5vcmlnLCBpZl9pbmNvbWluZyk7CisKKwkJbmVpZ2hfbm9kZS0+bGFzdF92YWxpZCA9IGppZmZpZXM7CisJfSBlbHNlIHsKKwkJLyogZmluZCBwYWNrZXQgY291bnQgb2YgY29ycmVzcG9uZGluZyBvbmUgaG9wIG5laWdoYm9yICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX25laWdoX25vZGUsICZvcmlnX25laWdoX25vZGUtPm5laWdoX2xpc3QsIGxpc3QpIHsKKworCQkJaWYgKGNvbXBhcmVfb3JpZyh0bXBfbmVpZ2hfbm9kZS0+YWRkciwgb3JpZ19uZWlnaF9ub2RlLT5vcmlnKSAmJiAodG1wX25laWdoX25vZGUtPmlmX2luY29taW5nID09IGlmX2luY29taW5nKSkKKwkJCQluZWlnaF9ub2RlID0gdG1wX25laWdoX25vZGU7CisJCX0KKworCQlpZiAobmVpZ2hfbm9kZSA9PSBOVUxMKQorCQkJbmVpZ2hfbm9kZSA9IGNyZWF0ZV9uZWlnaGJvcihvcmlnX25laWdoX25vZGUsIG9yaWdfbmVpZ2hfbm9kZSwgb3JpZ19uZWlnaF9ub2RlLT5vcmlnLCBpZl9pbmNvbWluZyk7CisJfQorCisJb3JpZ19ub2RlLT5sYXN0X3ZhbGlkID0gamlmZmllczsKKworCS8qIHBheSBhdHRlbnRpb24gdG8gbm90IGdldCBhIHZhbHVlIGJpZ2dlciB0aGFuIDEwMCAlICovCisJdG90YWxfY291bnQgPSAob3JpZ19uZWlnaF9ub2RlLT5iY2FzdF9vd25fc3VtW2lmX2luY29taW5nLT5pZl9udW1dID4gbmVpZ2hfbm9kZS0+cmVhbF9wYWNrZXRfY291bnQgPyBuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCA6IG9yaWdfbmVpZ2hfbm9kZS0+YmNhc3Rfb3duX3N1bVtpZl9pbmNvbWluZy0+aWZfbnVtXSk7CisKKwkvKiBpZiB3ZSBoYXZlIHRvbyBmZXcgcGFja2V0cyAodG9vIGxlc3MgZGF0YSkgd2Ugc2V0IHRxX293biB0byB6ZXJvICovCisJLyogaWYgd2UgcmVjZWl2ZSB0b28gZmV3IHBhY2tldHMgaXQgaXMgbm90IGNvbnNpZGVyZWQgYmlkaXJlY3Rpb25hbCAqLworCWlmICgodG90YWxfY291bnQgPCBUUV9MT0NBTF9CSURSRUNUX1NFTkRfTUlOSU1VTSkgfHwgKG5laWdoX25vZGUtPnJlYWxfcGFja2V0X2NvdW50IDwgVFFfTE9DQUxfQklEUkVDVF9SRUNWX01JTklNVU0pKQorCQlvcmlnX25laWdoX25vZGUtPnRxX293biA9IDA7CisJZWxzZQorCQkvKiBuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCBpcyBuZXZlciB6ZXJvIGFzIHdlIG9ubHkgcHVyZ2Ugb2xkIGluZm9ybWF0aW9uIHdoZW4gZ2V0dGluZyBuZXcgaW5mb3JtYXRpb24gKi8KKwkJb3JpZ19uZWlnaF9ub2RlLT50cV9vd24gPSAoVFFfTUFYX1ZBTFVFICogdG90YWxfY291bnQpIC8gbmVpZ2hfbm9kZS0+cmVhbF9wYWNrZXRfY291bnQ7CisKKwkvKgorCSAqIDEgLSAoKDEteCkgKiogMyksIG5vcm1hbGl6ZWQgdG8gVFFfTUFYX1ZBTFVFCisJICogdGhpcyBkb2VzIGFmZmVjdCB0aGUgbmVhcmx5LXN5bW1ldHJpYyBsaW5rcyBvbmx5IGEgbGl0dGxlLAorCSAqIGJ1dCBwdW5pc2hlcyBhc3ltbWV0cmljIGxpbmtzIG1vcmUuCisJICogdGhpcyB3aWxsIGdpdmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIFRRX01BWF9WQUxVRQorCSAqLworCW9yaWdfbmVpZ2hfbm9kZS0+dHFfYXN5bV9wZW5hbHR5ID0gVFFfTUFYX1ZBTFVFIC0gKFRRX01BWF9WQUxVRSAqCisJCQkoVFFfTE9DQUxfV0lORE9XX1NJWkUgLSBuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCkgKgorCQkJKFRRX0xPQ0FMX1dJTkRPV19TSVpFIC0gbmVpZ2hfbm9kZS0+cmVhbF9wYWNrZXRfY291bnQpICoKKwkJCShUUV9MT0NBTF9XSU5ET1dfU0laRSAtIG5laWdoX25vZGUtPnJlYWxfcGFja2V0X2NvdW50KSkgLworCQkJKFRRX0xPQ0FMX1dJTkRPV19TSVpFICogVFFfTE9DQUxfV0lORE9XX1NJWkUgKiBUUV9MT0NBTF9XSU5ET1dfU0laRSk7CisKKwliYXRtYW5fcGFja2V0LT50cSA9ICgoYmF0bWFuX3BhY2tldC0+dHEgKiBvcmlnX25laWdoX25vZGUtPnRxX293biAqIG9yaWdfbmVpZ2hfbm9kZS0+dHFfYXN5bV9wZW5hbHR5KSAvIChUUV9NQVhfVkFMVUUgKiAgVFFfTUFYX1ZBTFVFKSk7CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiYmlkaXJlY3Rpb25hbDogb3JpZyA9ICUtMTVzIG5laWdoID0gJS0xNXMgPT4gb3duX2JjYXN0ID0gJTJpLCByZWFsIHJlY3YgPSAlMmksIGxvY2FsIHRxOiAlM2ksIGFzeW1fcGVuYWx0eTogJTNpLCB0b3RhbCB0cTogJTNpIFxuIiwKKwkJICBvcmlnX3N0ciwgbmVpZ2hfc3RyLCB0b3RhbF9jb3VudCwgbmVpZ2hfbm9kZS0+cmVhbF9wYWNrZXRfY291bnQsIG9yaWdfbmVpZ2hfbm9kZS0+dHFfb3duLCBvcmlnX25laWdoX25vZGUtPnRxX2FzeW1fcGVuYWx0eSwgYmF0bWFuX3BhY2tldC0+dHEpOworCisJLyogaWYgbGluayBoYXMgdGhlIG1pbmltdW0gcmVxdWlyZWQgdHJhbnNtaXNzaW9uIHF1YWxpdHkgY29uc2lkZXIgaXQgYmlkaXJlY3Rpb25hbCAqLworCWlmIChiYXRtYW5fcGFja2V0LT50cSA+PSBUUV9UT1RBTF9CSURSRUNUX0xJTUlUKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfb3JpZyhzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsIHN0cnVjdCBldGhoZHIgKmV0aGhkciwgc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nLCB1bnNpZ25lZCBjaGFyICpobmFfYnVmZiwgaW50IGhuYV9idWZmX2xlbiwgY2hhciBpc19kdXBsaWNhdGUpCit7CisJc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGUgPSBOVUxMLCAqdG1wX25laWdoX25vZGUgPSBOVUxMOworCWludCB0bXBfaG5hX2J1ZmZfbGVuOworCisJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwgInVwZGF0ZV9vcmlnaW5hdG9yKCk6IFNlYXJjaGluZyBhbmQgdXBkYXRpbmcgb3JpZ2luYXRvciBlbnRyeSBvZiByZWNlaXZlZCBwYWNrZXQgXG4iKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX25laWdoX25vZGUsICZvcmlnX25vZGUtPm5laWdoX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGNvbXBhcmVfb3JpZyh0bXBfbmVpZ2hfbm9kZS0+YWRkciwgZXRoaGRyLT5oX3NvdXJjZSkgJiYgKHRtcF9uZWlnaF9ub2RlLT5pZl9pbmNvbWluZyA9PSBpZl9pbmNvbWluZykpIHsKKwkJCW5laWdoX25vZGUgPSB0bXBfbmVpZ2hfbm9kZTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGlzX2R1cGxpY2F0ZSkKKwkJCWNvbnRpbnVlOworCisJCXJpbmdfYnVmZmVyX3NldCh0bXBfbmVpZ2hfbm9kZS0+dHFfcmVjdiwgJnRtcF9uZWlnaF9ub2RlLT50cV9pbmRleCwgMCk7CisJCXRtcF9uZWlnaF9ub2RlLT50cV9hdmcgPSByaW5nX2J1ZmZlcl9hdmcodG1wX25laWdoX25vZGUtPnRxX3JlY3YpOworCX0KKworCWlmIChuZWlnaF9ub2RlID09IE5VTEwpCisJCW5laWdoX25vZGUgPSBjcmVhdGVfbmVpZ2hib3Iob3JpZ19ub2RlLCBnZXRfb3JpZ19ub2RlKGV0aGhkci0+aF9zb3VyY2UpLCBldGhoZHItPmhfc291cmNlLCBpZl9pbmNvbWluZyk7CisJZWxzZQorCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiVXBkYXRpbmcgZXhpc3RpbmcgbGFzdC1ob3AgbmVpZ2hib3VyIG9mIG9yaWdpbmF0b3JcbiIpOworCisJb3JpZ19ub2RlLT5mbGFncyA9IGJhdG1hbl9wYWNrZXQtPmZsYWdzOworCW5laWdoX25vZGUtPmxhc3RfdmFsaWQgPSBqaWZmaWVzOworCisJcmluZ19idWZmZXJfc2V0KG5laWdoX25vZGUtPnRxX3JlY3YsICZuZWlnaF9ub2RlLT50cV9pbmRleCwgYmF0bWFuX3BhY2tldC0+dHEpOworCW5laWdoX25vZGUtPnRxX2F2ZyA9IHJpbmdfYnVmZmVyX2F2ZyhuZWlnaF9ub2RlLT50cV9yZWN2KTsKKworCWlmICghaXNfZHVwbGljYXRlKSB7CisJCW9yaWdfbm9kZS0+bGFzdF90dGwgPSBiYXRtYW5fcGFja2V0LT50dGw7CisJCW5laWdoX25vZGUtPmxhc3RfdHRsID0gYmF0bWFuX3BhY2tldC0+dHRsOworCX0KKworCXRtcF9obmFfYnVmZl9sZW4gPSAoaG5hX2J1ZmZfbGVuID4gYmF0bWFuX3BhY2tldC0+bnVtX2huYSAqIEVUSF9BTEVOID8gYmF0bWFuX3BhY2tldC0+bnVtX2huYSAqIEVUSF9BTEVOIDogaG5hX2J1ZmZfbGVuKTsKKworCS8qIGlmIHRoaXMgbmVpZ2hib3IgYWxyZWFkeSBpcyBvdXIgbmV4dCBob3AgdGhlcmUgaXMgbm90aGluZyB0byBjaGFuZ2UgKi8KKwlpZiAob3JpZ19ub2RlLT5yb3V0ZXIgPT0gbmVpZ2hfbm9kZSkKKwkJZ290byB1cGRhdGVfaG5hOworCisJLyogaWYgdGhpcyBuZWlnaGJvciBkb2VzIG5vdCBvZmZlciBhIGJldHRlciBUUSB3ZSB3b24ndCBjb25zaWRlciBpdCAqLworCWlmICgob3JpZ19ub2RlLT5yb3V0ZXIpICYmCisJICAgIChvcmlnX25vZGUtPnJvdXRlci0+dHFfYXZnID4gbmVpZ2hfbm9kZS0+dHFfYXZnKSkKKwkJZ290byB1cGRhdGVfaG5hOworCisJLyogaWYgdGhlIFRRIGlzIHRoZSBzYW1lIGFuZCB0aGUgbGluayBub3QgbW9yZSBzeW1ldHJpYyB3ZSB3b24ndCBjb25zaWRlciBpdCBlaXRoZXIgKi8KKwlpZiAoKG9yaWdfbm9kZS0+cm91dGVyKSAmJgorCSAgICAgKChuZWlnaF9ub2RlLT50cV9hdmcgPT0gb3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZykgJiYKKwkgICAgIChvcmlnX25vZGUtPnJvdXRlci0+b3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtW2lmX2luY29taW5nLT5pZl9udW1dID49CisJICAgICAgbmVpZ2hfbm9kZS0+b3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtW2lmX2luY29taW5nLT5pZl9udW1dKSkpCisJCWdvdG8gdXBkYXRlX2huYTsKKworCXVwZGF0ZV9yb3V0ZXMob3JpZ19ub2RlLCBuZWlnaF9ub2RlLCBobmFfYnVmZiwgdG1wX2huYV9idWZmX2xlbik7CisJcmV0dXJuOworCit1cGRhdGVfaG5hOgorCXVwZGF0ZV9yb3V0ZXMob3JpZ19ub2RlLCBvcmlnX25vZGUtPnJvdXRlciwgaG5hX2J1ZmYsIHRtcF9obmFfYnVmZl9sZW4pOworCXJldHVybjsKK30KKworc3RhdGljIGNoYXIgY291bnRfcmVhbF9wYWNrZXRzKHN0cnVjdCBldGhoZHIgKmV0aGhkciwgc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKQoreworCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKKwlzdHJ1Y3QgbmVpZ2hfbm9kZSAqdG1wX25laWdoX25vZGU7CisJY2hhciBpc19kdXBsaWNhdGUgPSAwOworCisKKwlvcmlnX25vZGUgPSBnZXRfb3JpZ19ub2RlKGJhdG1hbl9wYWNrZXQtPm9yaWcpOworCWlmIChvcmlnX25vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX25laWdoX25vZGUsICZvcmlnX25vZGUtPm5laWdoX2xpc3QsIGxpc3QpIHsKKworCQlpZiAoIWlzX2R1cGxpY2F0ZSkKKwkJCWlzX2R1cGxpY2F0ZSA9IGdldF9iaXRfc3RhdHVzKHRtcF9uZWlnaF9ub2RlLT5yZWFsX2JpdHMsIG9yaWdfbm9kZS0+bGFzdF9yZWFsX3NlcW5vLCBiYXRtYW5fcGFja2V0LT5zZXFubyk7CisKKwkJaWYgKGNvbXBhcmVfb3JpZyh0bXBfbmVpZ2hfbm9kZS0+YWRkciwgZXRoaGRyLT5oX3NvdXJjZSkgJiYgKHRtcF9uZWlnaF9ub2RlLT5pZl9pbmNvbWluZyA9PSBpZl9pbmNvbWluZykpCisJCQliaXRfZ2V0X3BhY2tldCh0bXBfbmVpZ2hfbm9kZS0+cmVhbF9iaXRzLCBiYXRtYW5fcGFja2V0LT5zZXFubyAtIG9yaWdfbm9kZS0+bGFzdF9yZWFsX3NlcW5vLCAxKTsKKwkJZWxzZQorCQkJYml0X2dldF9wYWNrZXQodG1wX25laWdoX25vZGUtPnJlYWxfYml0cywgYmF0bWFuX3BhY2tldC0+c2Vxbm8gLSBvcmlnX25vZGUtPmxhc3RfcmVhbF9zZXFubywgMCk7CisKKwkJdG1wX25laWdoX25vZGUtPnJlYWxfcGFja2V0X2NvdW50ID0gYml0X3BhY2tldF9jb3VudCh0bXBfbmVpZ2hfbm9kZS0+cmVhbF9iaXRzKTsKKwl9CisKKwlpZiAoIWlzX2R1cGxpY2F0ZSkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAidXBkYXRpbmcgbGFzdF9zZXFubzogb2xkICVkLCBuZXcgJWQgXG4iLCBvcmlnX25vZGUtPmxhc3RfcmVhbF9zZXFubywgYmF0bWFuX3BhY2tldC0+c2Vxbm8pOworCQlvcmlnX25vZGUtPmxhc3RfcmVhbF9zZXFubyA9IGJhdG1hbl9wYWNrZXQtPnNlcW5vOworCX0KKworCXJldHVybiBpc19kdXBsaWNhdGU7Cit9CisKK3ZvaWQgcmVjZWl2ZV9iYXRfcGFja2V0KHN0cnVjdCBldGhoZHIgKmV0aGhkciwgc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsIHVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLCBpbnQgaG5hX2J1ZmZfbGVuLCBzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZykKK3sKKwlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19uZWlnaF9ub2RlLCAqb3JpZ19ub2RlOworCWNoYXIgb3JpZ19zdHJbRVRIX1NUUl9MRU5dLCBwcmV2X3NlbmRlcl9zdHJbRVRIX1NUUl9MRU5dLCBuZWlnaF9zdHJbRVRIX1NUUl9MRU5dOworCWNoYXIgaGFzX2RpcmVjdGxpbmtfZmxhZzsKKwljaGFyIGlzX215X2FkZHIgPSAwLCBpc19teV9vcmlnID0gMCwgaXNfbXlfb2xkb3JpZyA9IDAsIGlzX2Jyb2FkY2FzdCA9IDAsIGlzX2JpZGlyZWN0aW9uYWwsIGlzX3NpbmdsZV9ob3BfbmVpZ2gsIGlzX2R1cGxpY2F0ZTsKKwl1bnNpZ25lZCBzaG9ydCBpZl9pbmNvbWluZ19zZXFubzsKKworCS8qIFNpbGVudGx5IGRyb3Agd2hlbiB0aGUgYmF0bWFuIHBhY2tldCBpcyBhY3R1YWxseSBub3QgYSBjb3JyZWN0IHBhY2tldC4KKwkgKgorCSAqIFRoaXMgbWlnaHQgaGFwcGVuIGlmIGEgcGFja2V0IGlzIHBhZGRlZCAoZS5nLiBFdGhlcm5ldCBoYXMgYQorCSAqIG1pbmltdW0gZnJhbWUgbGVuZ3RoIG9mIDY0IGJ5dGUpIGFuZCB0aGUgYWdncmVnYXRpb24gaW50ZXJwcmV0cworCSAqIGl0IGFzIGFuIGFkZGl0aW9uYWwgbGVuZ3RoLgorCSAqCisJICogVE9ETzogQSBtb3JlIHNhbmUgc29sdXRpb24gd291bGQgYmUgdG8gaGF2ZSBhIGJpdCBpbiB0aGUgYmF0bWFuX3BhY2tldAorCSAqIHRvIGRldGVjdCB3aGV0aGVyIHRoZSBwYWNrZXQgaXMgdGhlIGxhc3QgcGFja2V0IGluIGFuIGFnZ3JlZ2F0aW9uLgorCSAqIEhlcmUgd2UgZXhwZWN0IHRoYXQgdGhlIHBhZGRpbmcgaXMgYWx3YXlzIHplcm8gKG9yIG5vdCAweDAxKQorCSAqLworCWlmIChiYXRtYW5fcGFja2V0LT5wYWNrZXRfdHlwZSAhPSBCQVRfUEFDS0VUKQorCQlyZXR1cm47CisKKwkvKiBjb3VsZCBiZSBjaGFuZ2VkIGJ5IHNjaGVkdWxlX293bl9wYWNrZXQoKSAqLworCWlmX2luY29taW5nX3NlcW5vID0gYXRvbWljX3JlYWQoJmlmX2luY29taW5nLT5zZXFubyk7CisKKwlhZGRyX3RvX3N0cmluZyhvcmlnX3N0ciwgYmF0bWFuX3BhY2tldC0+b3JpZyk7CisJYWRkcl90b19zdHJpbmcocHJldl9zZW5kZXJfc3RyLCBiYXRtYW5fcGFja2V0LT5wcmV2X3NlbmRlcik7CisJYWRkcl90b19zdHJpbmcobmVpZ2hfc3RyLCBldGhoZHItPmhfc291cmNlKTsKKworCWhhc19kaXJlY3RsaW5rX2ZsYWcgPSAoYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJiBESVJFQ1RMSU5LID8gMSA6IDApOworCisJaXNfc2luZ2xlX2hvcF9uZWlnaCA9IChjb21wYXJlX29yaWcoZXRoaGRyLT5oX3NvdXJjZSwgYmF0bWFuX3BhY2tldC0+b3JpZykgPyAxIDogMCk7CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiUmVjZWl2ZWQgQkFUTUFOIHBhY2tldCB2aWEgTkI6ICVzLCBJRjogJXMgWyVzXSAoZnJvbSBPRzogJXMsIHZpYSBwcmV2IE9HOiAlcywgc2Vxbm8gJWQsIHRxICVkLCBUVEwgJWQsIFYgJWQsIElERiAlZCkgXG4iLCBuZWlnaF9zdHIsIGlmX2luY29taW5nLT5kZXYsIGlmX2luY29taW5nLT5hZGRyX3N0ciwgb3JpZ19zdHIsIHByZXZfc2VuZGVyX3N0ciwgYmF0bWFuX3BhY2tldC0+c2Vxbm8sIGJhdG1hbl9wYWNrZXQtPnRxLCBiYXRtYW5fcGFja2V0LT50dGwsIGJhdG1hbl9wYWNrZXQtPnZlcnNpb24sIGhhc19kaXJlY3RsaW5rX2ZsYWcpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYmF0bWFuX2lmLCAmaWZfbGlzdCwgbGlzdCkgeworCQlpZiAoYmF0bWFuX2lmLT5pZl9hY3RpdmUgIT0gSUZfQUNUSVZFKQorCQkJY29udGludWU7CisKKwkJaWYgKGNvbXBhcmVfb3JpZyhldGhoZHItPmhfc291cmNlLCBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyKSkKKwkJCWlzX215X2FkZHIgPSAxOworCisJCWlmIChjb21wYXJlX29yaWcoYmF0bWFuX3BhY2tldC0+b3JpZywgYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkcikpCisJCQlpc19teV9vcmlnID0gMTsKKworCQlpZiAoY29tcGFyZV9vcmlnKGJhdG1hbl9wYWNrZXQtPnByZXZfc2VuZGVyLCBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyKSkKKwkJCWlzX215X29sZG9yaWcgPSAxOworCisJCWlmIChjb21wYXJlX29yaWcoZXRoaGRyLT5oX3NvdXJjZSwgYnJvYWRjYXN0QWRkcikpCisJCQlpc19icm9hZGNhc3QgPSAxOworCX0KKworCWlmIChiYXRtYW5fcGFja2V0LT52ZXJzaW9uICE9IENPTVBBVF9WRVJTSU9OKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJEcm9wIHBhY2tldDogaW5jb21wYXRpYmxlIGJhdG1hbiB2ZXJzaW9uICglaSkgXG4iLCBiYXRtYW5fcGFja2V0LT52ZXJzaW9uKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpc19teV9hZGRyKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJEcm9wIHBhY2tldDogcmVjZWl2ZWQgbXkgb3duIGJyb2FkY2FzdCAoc2VuZGVyOiAlcykgXG4iLCBuZWlnaF9zdHIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGlzX2Jyb2FkY2FzdCkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiRHJvcCBwYWNrZXQ6IGlnbm9yaW5nIGFsbCBwYWNrZXRzIHdpdGggYnJvYWRjYXN0IHNvdXJjZSBhZGRyIChzZW5kZXI6ICVzKSBcbiIsIG5laWdoX3N0cik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaXNfbXlfb3JpZykgeworCQlvcmlnX25laWdoX25vZGUgPSBnZXRfb3JpZ19ub2RlKGV0aGhkci0+aF9zb3VyY2UpOworCisJCS8qIG5laWdoYm91ciBoYXMgdG8gaW5kaWNhdGUgZGlyZWN0IGxpbmsgYW5kIGl0IGhhcyB0byBjb21lIHZpYSB0aGUgY29ycmVzcG9uZGluZyBpbnRlcmZhY2UgKi8KKwkJLyogaWYgcmVjZWl2ZWQgc2Vxbm8gZXF1YWxzIGxhc3Qgc2VuZCBzZXFubyBzYXZlIG5ldyBzZXFubyBmb3IgYmlkaXJlY3Rpb25hbCBjaGVjayAqLworCQlpZiAoaGFzX2RpcmVjdGxpbmtfZmxhZyAmJiBjb21wYXJlX29yaWcoaWZfaW5jb21pbmctPm5ldF9kZXYtPmRldl9hZGRyLCBiYXRtYW5fcGFja2V0LT5vcmlnKSAmJgorCQkJCSAgKGJhdG1hbl9wYWNrZXQtPnNlcW5vIC0gaWZfaW5jb21pbmdfc2Vxbm8gKyAyID09IDApKSB7CisJCQliaXRfbWFyaygoVFlQRV9PRl9XT1JEICopJihvcmlnX25laWdoX25vZGUtPmJjYXN0X293bltpZl9pbmNvbWluZy0+aWZfbnVtICogTlVNX1dPUkRTXSksIDApOworCQkJb3JpZ19uZWlnaF9ub2RlLT5iY2FzdF9vd25fc3VtW2lmX2luY29taW5nLT5pZl9udW1dID0gYml0X3BhY2tldF9jb3VudCgoVFlQRV9PRl9XT1JEICopJihvcmlnX25laWdoX25vZGUtPmJjYXN0X293bltpZl9pbmNvbWluZy0+aWZfbnVtICogTlVNX1dPUkRTXSkpOworCQl9CisKKwkJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwgIkRyb3AgcGFja2V0OiBvcmlnaW5hdG9yIHBhY2tldCBmcm9tIG15c2VsZiAodmlhIG5laWdoYm91cikgXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChiYXRtYW5fcGFja2V0LT50cSA9PSAwKSB7CisJCWNvdW50X3JlYWxfcGFja2V0cyhldGhoZHIsIGJhdG1hbl9wYWNrZXQsIGlmX2luY29taW5nKTsKKworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiRHJvcCBwYWNrZXQ6IG9yaWdpbmF0b3IgcGFja2V0IHdpdGggdHEgZXF1YWwgMCBcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGlzX215X29sZG9yaWcpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwgIkRyb3AgcGFja2V0OiBpZ25vcmluZyBhbGwgcmVicm9hZGNhc3QgZWNob3MgKHNlbmRlcjogJXMpIFxuIiwgbmVpZ2hfc3RyKTsKKwkJcmV0dXJuOworCX0KKworCWlzX2R1cGxpY2F0ZSA9IGNvdW50X3JlYWxfcGFja2V0cyhldGhoZHIsIGJhdG1hbl9wYWNrZXQsIGlmX2luY29taW5nKTsKKworCW9yaWdfbm9kZSA9IGdldF9vcmlnX25vZGUoYmF0bWFuX3BhY2tldC0+b3JpZyk7CisJaWYgKG9yaWdfbm9kZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBhdm9pZCB0ZW1wb3Jhcnkgcm91dGluZyBsb29wcyAqLworCWlmICgob3JpZ19ub2RlLT5yb3V0ZXIpICYmIChvcmlnX25vZGUtPnJvdXRlci0+b3JpZ19ub2RlLT5yb3V0ZXIpICYmCisJICAgIChjb21wYXJlX29yaWcob3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIsIGJhdG1hbl9wYWNrZXQtPnByZXZfc2VuZGVyKSkgJiYKKwkgICAgIShjb21wYXJlX29yaWcoYmF0bWFuX3BhY2tldC0+b3JpZywgYmF0bWFuX3BhY2tldC0+cHJldl9zZW5kZXIpKSAmJgorCSAgICAoY29tcGFyZV9vcmlnKG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyLCBvcmlnX25vZGUtPnJvdXRlci0+b3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIpKSkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiRHJvcCBwYWNrZXQ6IGlnbm9yaW5nIGFsbCByZWJyb2FkY2FzdCBwYWNrZXRzIHRoYXQgbWF5IG1ha2UgbWUgbG9vcCAoc2VuZGVyOiAlcykgXG4iLCBuZWlnaF9zdHIpOworCQlyZXR1cm47CisJfQorCisJLyogaWYgc2VuZGVyIGlzIGEgZGlyZWN0IG5laWdoYm9yIHRoZSBzZW5kZXIgbWFjIGVxdWFscyBvcmlnaW5hdG9yIG1hYyAqLworCW9yaWdfbmVpZ2hfbm9kZSA9IChpc19zaW5nbGVfaG9wX25laWdoID8gb3JpZ19ub2RlIDogZ2V0X29yaWdfbm9kZShldGhoZHItPmhfc291cmNlKSk7CisJaWYgKG9yaWdfbmVpZ2hfbm9kZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBkcm9wIHBhY2tldCBpZiBzZW5kZXIgaXMgbm90IGEgZGlyZWN0IG5laWdoYm9yIGFuZCBpZiB3ZSBkb24ndCByb3V0ZSB0b3dhcmRzIGl0ICovCisJaWYgKCFpc19zaW5nbGVfaG9wX25laWdoICYmIChvcmlnX25laWdoX25vZGUtPnJvdXRlciA9PSBOVUxMKSkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiRHJvcCBwYWNrZXQ6IE9HTSB2aWEgdW5rbm93biBuZWlnaGJvciEgXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlzX2JpZGlyZWN0aW9uYWwgPSBpc0JpZGlyZWN0aW9uYWxOZWlnaChvcmlnX25vZGUsIG9yaWdfbmVpZ2hfbm9kZSwgYmF0bWFuX3BhY2tldCwgaWZfaW5jb21pbmcpOworCisJLyogdXBkYXRlIHJhbmtpbmcgaWYgaXQgaXMgbm90IGEgZHVwbGljYXRlIG9yIGhhcyB0aGUgc2FtZSBzZXFubyBhbmQgc2ltaWxhciB0dGwgYXMgdGhlIG5vbi1kdXBsaWNhdGUgKi8KKwlpZiAoaXNfYmlkaXJlY3Rpb25hbCAmJiAoIWlzX2R1cGxpY2F0ZSB8fAorCQkoKG9yaWdfbm9kZS0+bGFzdF9yZWFsX3NlcW5vID09IGJhdG1hbl9wYWNrZXQtPnNlcW5vKSAmJgorCQkJKG9yaWdfbm9kZS0+bGFzdF90dGwgLSAzIDw9IGJhdG1hbl9wYWNrZXQtPnR0bCkpKSkKKwkJdXBkYXRlX29yaWcob3JpZ19ub2RlLCBldGhoZHIsIGJhdG1hbl9wYWNrZXQsIGlmX2luY29taW5nLCBobmFfYnVmZiwgaG5hX2J1ZmZfbGVuLCBpc19kdXBsaWNhdGUpOworCisJLyogaXMgc2luZ2xlIGhvcCAoZGlyZWN0KSBuZWlnaGJvdXIgKi8KKwlpZiAoaXNfc2luZ2xlX2hvcF9uZWlnaCkgeworCisJCS8qIG1hcmsgZGlyZWN0IGxpbmsgb24gaW5jb21pbmcgaW50ZXJmYWNlICovCisJCXNjaGVkdWxlX2ZvcndhcmRfcGFja2V0KG9yaWdfbm9kZSwgZXRoaGRyLCBiYXRtYW5fcGFja2V0LCAxLCBobmFfYnVmZl9sZW4sIGlmX2luY29taW5nKTsKKworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiRm9yd2FyZGluZyBwYWNrZXQ6IHJlYnJvYWRjYXN0IG5laWdoYm91ciBwYWNrZXQgd2l0aCBkaXJlY3QgbGluayBmbGFnIFxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBtdWx0aWhvcCBvcmlnaW5hdG9yICovCisJaWYgKCFpc19iaWRpcmVjdGlvbmFsKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJEcm9wIHBhY2tldDogbm90IHJlY2VpdmVkIHZpYSBiaWRpcmVjdGlvbmFsIGxpbmtcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGlzX2R1cGxpY2F0ZSkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiRHJvcCBwYWNrZXQ6IGR1cGxpY2F0ZSBwYWNrZXQgcmVjZWl2ZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwgIkZvcndhcmRpbmcgcGFja2V0OiByZWJyb2FkY2FzdCBvcmlnaW5hdG9yIHBhY2tldCBcbiIpOworCXNjaGVkdWxlX2ZvcndhcmRfcGFja2V0KG9yaWdfbm9kZSwgZXRoaGRyLCBiYXRtYW5fcGFja2V0LCAwLCBobmFfYnVmZl9sZW4sIGlmX2luY29taW5nKTsKK30KKwordm9pZCBwdXJnZV9vcmlnKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0X3BvcywgKmxpc3RfcG9zX3RtcDsKKwlzdHJ1Y3QgaGFzaF9pdF90ICpoYXNoaXQgPSBOVUxMOworCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKKwlzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSwgKmJlc3RfbmVpZ2hfbm9kZTsKKwljaGFyIG9yaWdfc3RyW0VUSF9TVFJfTEVOXSwgbmVpZ2hfc3RyW0VUSF9TVFJfTEVOXSwgbmVpZ2hfcHVyZ2VkOworCisJc3Bpbl9sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisKKwkvKiBmb3IgYWxsIG9yaWdpbnMuLi4gKi8KKwl3aGlsZSAoTlVMTCAhPSAoaGFzaGl0ID0gaGFzaF9pdGVyYXRlKG9yaWdfaGFzaCwgaGFzaGl0KSkpIHsKKworCQlvcmlnX25vZGUgPSBoYXNoaXQtPmJ1Y2tldC0+ZGF0YTsKKwkJYWRkcl90b19zdHJpbmcob3JpZ19zdHIsIG9yaWdfbm9kZS0+b3JpZyk7CisKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgb3JpZ19ub2RlLT5sYXN0X3ZhbGlkICsgKCgyICogUFVSR0VfVElNRU9VVCAqIEhaKSAvIDEwMDApKSkgeworCisJCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiT3JpZ2luYXRvciB0aW1lb3V0OiBvcmlnaW5hdG9yICVzLCBsYXN0X3ZhbGlkICV1IFxuIiwgb3JpZ19zdHIsIChvcmlnX25vZGUtPmxhc3RfdmFsaWQgLyBIWikpOworCisJCQloYXNoX3JlbW92ZV9idWNrZXQob3JpZ19oYXNoLCBoYXNoaXQpOworCQkJZnJlZV9vcmlnX25vZGUob3JpZ19ub2RlKTsKKworCQl9IGVsc2UgeworCisJCQliZXN0X25laWdoX25vZGUgPSBOVUxMOworCQkJbmVpZ2hfcHVyZ2VkID0gMDsKKworCQkJLyogZm9yIGFsbCBuZWlnaGJvdXJzIHRvd2FyZHMgdGhpcyBvcmlnaW5hdG9yIC4uLiAqLworCQkJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3RfcG9zLCBsaXN0X3Bvc190bXAsICZvcmlnX25vZGUtPm5laWdoX2xpc3QpIHsKKwkJCQluZWlnaF9ub2RlID0gbGlzdF9lbnRyeShsaXN0X3Bvcywgc3RydWN0IG5laWdoX25vZGUsIGxpc3QpOworCisJCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgbmVpZ2hfbm9kZS0+bGFzdF92YWxpZCArICgoUFVSR0VfVElNRU9VVCAqIEhaKSAvIDEwMDApKSkgeworCisJCQkJCWFkZHJfdG9fc3RyaW5nKG5laWdoX3N0ciwgbmVpZ2hfbm9kZS0+YWRkcik7CisJCQkJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJOZWlnaGJvdXIgdGltZW91dDogb3JpZ2luYXRvciAlcywgbmVpZ2hib3VyOiAlcywgbGFzdF92YWxpZCAldSBcbiIsIG9yaWdfc3RyLCBuZWlnaF9zdHIsIChuZWlnaF9ub2RlLT5sYXN0X3ZhbGlkIC8gSFopKTsKKworCQkJCQluZWlnaF9wdXJnZWQgPSAxOworCQkJCQlsaXN0X2RlbChsaXN0X3Bvcyk7CisJCQkJCWtmcmVlKG5laWdoX25vZGUpOworCisJCQkJfSBlbHNlIHsKKworCQkJCQlpZiAoKGJlc3RfbmVpZ2hfbm9kZSA9PSBOVUxMKSB8fCAobmVpZ2hfbm9kZS0+dHFfYXZnID4gYmVzdF9uZWlnaF9ub2RlLT50cV9hdmcpKQorCQkJCQkJYmVzdF9uZWlnaF9ub2RlID0gbmVpZ2hfbm9kZTsKKworCQkJCX0KKworCQkJfQorCisJCQlpZiAobmVpZ2hfcHVyZ2VkKQorCQkJCXVwZGF0ZV9yb3V0ZXMob3JpZ19ub2RlLCBiZXN0X25laWdoX25vZGUsIG9yaWdfbm9kZS0+aG5hX2J1ZmYsIG9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuKTsKKworCQl9CisKKwl9CisKKwlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCisJc3RhcnRfcHVyZ2VfdGltZXIoKTsKK30KKworc3RhdGljIGludCByZWNlaXZlX3Jhd19wYWNrZXQoc3RydWN0IHNvY2tldCAqcmF3X3NvY2ssIHVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmLCBpbnQgcGFja2V0X2J1ZmZfbGVuKQoreworCXN0cnVjdCBrdmVjIGlvdjsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKworCWlvdi5pb3ZfYmFzZSA9IHBhY2tldF9idWZmOworCWlvdi5pb3ZfbGVuID0gcGFja2V0X2J1ZmZfbGVuOworCisJbXNnLm1zZ19mbGFncyA9IE1TR19ET05UV0FJVDsJLyogbm9uLWJsb2NraW5nICovCisJbXNnLm1zZ19uYW1lID0gTlVMTDsKKwltc2cubXNnX25hbWVsZW4gPSAwOworCW1zZy5tc2dfY29udHJvbCA9IE5VTEw7CisKKwlyZXR1cm4ga2VybmVsX3JlY3Ztc2cocmF3X3NvY2ssICZtc2csICZpb3YsIDEsIHBhY2tldF9idWZmX2xlbiwgTVNHX0RPTlRXQUlUKTsKK30KKworaW50IHBhY2tldF9yZWN2X3RocmVhZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKKwlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7CisJc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7CisJc3RydWN0IHVuaWNhc3RfcGFja2V0ICp1bmljYXN0X3BhY2tldDsKKwlzdHJ1Y3QgYmNhc3RfcGFja2V0ICpiY2FzdF9wYWNrZXQ7CisJc3RydWN0IGljbXBfcGFja2V0ICppY21wX3BhY2tldDsKKwlzdHJ1Y3QgdmlzX3BhY2tldCAqdmlzX3BhY2tldDsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CisJdW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsIHNyY19zdHJbRVRIX1NUUl9MRU5dLCBkc3Rfc3RyW0VUSF9TVFJfTEVOXTsKKwlpbnQgdmlzX2luZm9fbGVuOworCWludCByZXN1bHQ7CisKKwlhdG9taWNfc2V0KCZkYXRhX3JlYWR5X2NvbmQsIDApOworCWF0b21pY19zZXQoJmV4aXRfY29uZCwgMCk7CisJcGFja2V0X2J1ZmYgPSBrbWFsbG9jKFBBQ0tCVUZGX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghcGFja2V0X2J1ZmYpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX0NSSVQsICJDb3VsZCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwYWNrZXQgYnVmZmVyLiA6KFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwl3aGlsZSAoKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpICYmICghYXRvbWljX3JlYWQoJmV4aXRfY29uZCkpKSB7CisKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHRocmVhZF93YWl0LCAoYXRvbWljX3JlYWQoJmRhdGFfcmVhZHlfY29uZCkgfHwgYXRvbWljX3JlYWQoJmV4aXRfY29uZCkpKTsKKworCQlhdG9taWNfc2V0KCZkYXRhX3JlYWR5X2NvbmQsIDApOworCisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkgfHwgYXRvbWljX3JlYWQoJmV4aXRfY29uZCkpCisJCQlicmVhazsKKworCQkvKiB3ZSBvbmx5IHdhbnQgdG8gc2FmZWx5IHRyYXZlcnNlIHRoZSBsaXN0LCBoYXJkLWludGVyZmFjZXMKKwkJICogd29uJ3QgYmUgZGVsZXRlZCBhbnl3YXkgYXMgbG9uZyBhcyB0aGlzIHRocmVhZCBydW5zLiAqLworCisJCXJjdV9yZWFkX2xvY2soKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYmF0bWFuX2lmLCAmaWZfbGlzdCwgbGlzdCkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkJCXJlc3VsdCA9IC0xOworCisJCQl3aGlsZSAoMSkgeworCQkJCWlmIChiYXRtYW5faWYtPmlmX2FjdGl2ZSAhPSBJRl9BQ1RJVkUpIHsKKwkJCQkJaWYgKGJhdG1hbl9pZi0+aWZfYWN0aXZlICE9IElGX1RPX0JFX0FDVElWQVRFRCkKKwkJCQkJCWRlYnVnX2xvZyhMT0dfVFlQRV9OT1RJQ0UsCisJCQkJCQkgICAgICAgICAgIkNvdWxkIG5vdCByZWFkIGZyb20gZGVhY3RpdmF0ZWQgaW50ZXJmYWNlICVzIVxuIiwKKwkJCQkJCSAgICAgICAgICBiYXRtYW5faWYtPmRldik7CisKKwkJCQkJaWYgKGJhdG1hbl9pZi0+cmF3X3NvY2spCisJCQkJCQlyZWNlaXZlX3Jhd19wYWNrZXQoYmF0bWFuX2lmLT5yYXdfc29jaywgcGFja2V0X2J1ZmYsIFBBQ0tCVUZGX1NJWkUpOworCQkJCQlyZXN1bHQgPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlyZXN1bHQgPSByZWNlaXZlX3Jhd19wYWNrZXQoYmF0bWFuX2lmLT5yYXdfc29jaywgcGFja2V0X2J1ZmYsIFBBQ0tCVUZGX1NJWkUpOworCQkJCWlmIChyZXN1bHQgPD0gMCkKKwkJCQkJYnJlYWs7CisKKwkJCQlpZiAocmVzdWx0IDwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsgMikKKwkJCQkJY29udGludWU7CisKKwkJCQlldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKXBhY2tldF9idWZmOworCQkJCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKikocGFja2V0X2J1ZmYgKyBzaXplb2Yoc3RydWN0IGV0aGhkcikpOworCisJCQkJaWYgKGJhdG1hbl9wYWNrZXQtPnZlcnNpb24gIT0gQ09NUEFUX1ZFUlNJT04pIHsKKwkJCQkJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwgIkRyb3AgcGFja2V0OiBpbmNvbXBhdGlibGUgYmF0bWFuIHZlcnNpb24gKCVpKSBcbiIsIGJhdG1hbl9wYWNrZXQtPnZlcnNpb24pOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlzd2l0Y2ggKGJhdG1hbl9wYWNrZXQtPnBhY2tldF90eXBlKSB7CisJCQkJLyogYmF0bWFuIG9yaWdpbmF0b3IgcGFja2V0ICovCisJCQkJY2FzZSBCQVRfUEFDS0VUOgorCQkJCQkvKiBwYWNrZXQgd2l0aCBicm9hZGNhc3QgaW5kaWNhdGlvbiBidXQgdW5pY2FzdCByZWNpcGllbnQgKi8KKwkJCQkJaWYgKCFpc19iY2FzdChldGhoZHItPmhfZGVzdCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvKiBwYWNrZXQgd2l0aCBicm9hZGNhc3Qgc2VuZGVyIGFkZHJlc3MgKi8KKwkJCQkJaWYgKGlzX2JjYXN0KGV0aGhkci0+aF9zb3VyY2UpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJLyogZHJvcCBwYWNrZXQgaWYgaXQgaGFzIG5vdCBhdCBsZWFzdCBvbmUgYmF0bWFuIHBhY2tldCBhcyBwYXlsb2FkICovCisJCQkJCWlmIChyZXN1bHQgPCBzaXplb2Yoc3RydWN0IGV0aGhkcikgKyBzaXplb2Yoc3RydWN0IGJhdG1hbl9wYWNrZXQpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJc3Bpbl9sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJCQkJCXJlY2VpdmVfYWdncl9iYXRfcGFja2V0KGV0aGhkciwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0X2J1ZmYgKyBzaXplb2Yoc3RydWN0IGV0aGhkciksCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgYmF0bWFuX2lmKTsKKwkJCQkJc3Bpbl91bmxvY2soJm9yaWdfaGFzaF9sb2NrKTsKKworCQkJCQlicmVhazsKKworCQkJCS8qIGJhdG1hbiBpY21wIHBhY2tldCAqLworCQkJCWNhc2UgQkFUX0lDTVA6CisJCQkJCS8qIHBhY2tldCB3aXRoIHVuaWNhc3QgaW5kaWNhdGlvbiBidXQgYnJvYWRjYXN0IHJlY2lwaWVudCAqLworCQkJCQlpZiAoaXNfYmNhc3QoZXRoaGRyLT5oX2Rlc3QpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJLyogcGFja2V0IHdpdGggYnJvYWRjYXN0IHNlbmRlciBhZGRyZXNzICovCisJCQkJCWlmIChpc19iY2FzdChldGhoZHItPmhfc291cmNlKSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8qIG5vdCBmb3IgbWUgKi8KKwkJCQkJaWYgKCFpc19teV9tYWMoZXRoaGRyLT5oX2Rlc3QpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJLyogZHJvcCBwYWNrZXQgaWYgaXQgaGFzIG5vdCBuZWNlc3NhcnkgbWluaW11bSBzaXplICovCisJCQkJCWlmIChyZXN1bHQgPCBzaXplb2Yoc3RydWN0IGV0aGhkcikgKyBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0KSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCWljbXBfcGFja2V0ID0gKHN0cnVjdCBpY21wX3BhY2tldCAqKShwYWNrZXRfYnVmZiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisKKwkJCQkJLyogcGFja2V0IGZvciBtZSAqLworCQkJCQlpZiAoaXNfbXlfbWFjKGljbXBfcGFja2V0LT5kc3QpKSB7CisKKwkJCQkJCS8qIGFkZCBkYXRhIHRvIGRldmljZSBxdWV1ZSAqLworCQkJCQkJaWYgKGljbXBfcGFja2V0LT5tc2dfdHlwZSAhPSBFQ0hPX1JFUVVFU1QpIHsKKwkJCQkJCQliYXRfZGV2aWNlX3JlY2VpdmVfcGFja2V0KGljbXBfcGFja2V0KTsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKworCQkJCQkJLyogYW5zd2VyIGVjaG8gcmVxdWVzdCAocGluZykgKi8KKwkJCQkJCS8qIGdldCByb3V0aW5nIGluZm9ybWF0aW9uICovCisJCQkJCQlzcGluX2xvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwkJCQkJCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKWhhc2hfZmluZChvcmlnX2hhc2gsIGljbXBfcGFja2V0LT5vcmlnKSk7CisKKwkJCQkJCWlmICgob3JpZ19ub2RlICE9IE5VTEwpICYmIChvcmlnX25vZGUtPmJhdG1hbl9pZiAhPSBOVUxMKSAmJiAob3JpZ19ub2RlLT5yb3V0ZXIgIT0gTlVMTCkpIHsKKworCQkJCQkJCW1lbWNweShpY21wX3BhY2tldC0+ZHN0LCBpY21wX3BhY2tldC0+b3JpZywgRVRIX0FMRU4pOworCQkJCQkJCW1lbWNweShpY21wX3BhY2tldC0+b3JpZywgZXRoaGRyLT5oX2Rlc3QsIEVUSF9BTEVOKTsKKwkJCQkJCQlpY21wX3BhY2tldC0+bXNnX3R5cGUgPSBFQ0hPX1JFUExZOworCQkJCQkJCWljbXBfcGFja2V0LT50dGwgPSBUVEw7CisKKwkJCQkJCQlzZW5kX3Jhd19wYWNrZXQocGFja2V0X2J1ZmYgKyBzaXplb2Yoc3RydWN0IGV0aGhkciksCisJCQkJCQkJICAgICAgICAgICAgICAgIHJlc3VsdCAtIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSwKKwkJCQkJCQkgICAgICAgICAgICAgICAgb3JpZ19ub2RlLT5iYXRtYW5faWYsCisJCQkJCQkJICAgICAgICAgICAgICAgIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyKTsKKworCQkJCQkJfQorCisJCQkJCQlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCQkJCQkJY29udGludWU7CisKKwkJCQkJfQorCisJCQkJCS8qIFRUTCBleGNlZWRlZCAqLworCQkJCQlpZiAoaWNtcF9wYWNrZXQtPnR0bCA8IDIpIHsKKworCQkJCQkJYWRkcl90b19zdHJpbmcoc3JjX3N0ciwgaWNtcF9wYWNrZXQtPm9yaWcpOworCQkJCQkJYWRkcl90b19zdHJpbmcoZHN0X3N0ciwgaWNtcF9wYWNrZXQtPmRzdCk7CisKKwkJCQkJCWRlYnVnX2xvZyhMT0dfVFlQRV9OT1RJQ0UsICJFcnJvciAtIGNhbid0IHNlbmQgcGFja2V0IGZyb20gJXMgdG8gJXM6IHR0bCBleGNlZWRlZFxuIiwgc3JjX3N0ciwgZHN0X3N0cik7CisKKwkJCQkJCS8qIHNlbmQgVFRMIGV4Y2VlZGVkIGlmIHBhY2tldCBpcyBhbiBlY2hvIHJlcXVlc3QgKHRyYWNlcm91dGUpICovCisJCQkJCQlpZiAoaWNtcF9wYWNrZXQtPm1zZ190eXBlICE9IEVDSE9fUkVRVUVTVCkKKwkJCQkJCQljb250aW51ZTsKKworCQkJCQkJLyogZ2V0IHJvdXRpbmcgaW5mb3JtYXRpb24gKi8KKwkJCQkJCXNwaW5fbG9jaygmb3JpZ19oYXNoX2xvY2spOworCQkJCQkJb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopaGFzaF9maW5kKG9yaWdfaGFzaCwgaWNtcF9wYWNrZXQtPm9yaWcpKTsKKworCQkJCQkJaWYgKChvcmlnX25vZGUgIT0gTlVMTCkgJiYgKG9yaWdfbm9kZS0+YmF0bWFuX2lmICE9IE5VTEwpICYmIChvcmlnX25vZGUtPnJvdXRlciAhPSBOVUxMKSkgeworCisJCQkJCQkJbWVtY3B5KGljbXBfcGFja2V0LT5kc3QsIGljbXBfcGFja2V0LT5vcmlnLCBFVEhfQUxFTik7CisJCQkJCQkJbWVtY3B5KGljbXBfcGFja2V0LT5vcmlnLCBldGhoZHItPmhfZGVzdCwgRVRIX0FMRU4pOworCQkJCQkJCWljbXBfcGFja2V0LT5tc2dfdHlwZSA9IFRUTF9FWENFRURFRDsKKwkJCQkJCQlpY21wX3BhY2tldC0+dHRsID0gVFRMOworCisJCQkJCQkJc2VuZF9yYXdfcGFja2V0KHBhY2tldF9idWZmICsgc2l6ZW9mKHN0cnVjdCBldGhoZHIpLAorCQkJCQkJCSAgICAgICAgICAgICAgICByZXN1bHQgLSBzaXplb2Yoc3RydWN0IGV0aGhkciksCisJCQkJCQkJICAgICAgICAgICAgICAgIG9yaWdfbm9kZS0+YmF0bWFuX2lmLAorCQkJCQkJCSAgICAgICAgICAgICAgICBvcmlnX25vZGUtPnJvdXRlci0+YWRkcik7CisKKwkJCQkJCX0KKworCQkJCQkJc3Bpbl91bmxvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCX0KKworCQkJCQkvKiBnZXQgcm91dGluZyBpbmZvcm1hdGlvbiAqLworCQkJCQlzcGluX2xvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwkJCQkJb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopaGFzaF9maW5kKG9yaWdfaGFzaCwgaWNtcF9wYWNrZXQtPmRzdCkpOworCisJCQkJCWlmICgob3JpZ19ub2RlICE9IE5VTEwpICYmIChvcmlnX25vZGUtPmJhdG1hbl9pZiAhPSBOVUxMKSAmJiAob3JpZ19ub2RlLT5yb3V0ZXIgIT0gTlVMTCkpIHsKKworCQkJCQkJLyogZGVjcmVtZW50IHR0bCAqLworCQkJCQkJaWNtcF9wYWNrZXQtPnR0bC0tOworCisJCQkJCQkvKiByb3V0ZSBpdCAqLworCQkJCQkJc2VuZF9yYXdfcGFja2V0KHBhY2tldF9idWZmICsgc2l6ZW9mKHN0cnVjdCBldGhoZHIpLAorCQkJCQkJICAgICAgICAgICAgICAgIHJlc3VsdCAtIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSwKKwkJCQkJCSAgICAgICAgICAgICAgICBvcmlnX25vZGUtPmJhdG1hbl9pZiwKKwkJCQkJCSAgICAgICAgICAgICAgICBvcmlnX25vZGUtPnJvdXRlci0+YWRkcik7CisJCQkJCX0KKworCQkJCQlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCQkJCQlicmVhazsKKworCQkJCS8qIHVuaWNhc3QgcGFja2V0ICovCisJCQkJY2FzZSBCQVRfVU5JQ0FTVDoKKwkJCQkJLyogcGFja2V0IHdpdGggdW5pY2FzdCBpbmRpY2F0aW9uIGJ1dCBicm9hZGNhc3QgcmVjaXBpZW50ICovCisJCQkJCWlmIChpc19iY2FzdChldGhoZHItPmhfZGVzdCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvKiBwYWNrZXQgd2l0aCBicm9hZGNhc3Qgc2VuZGVyIGFkZHJlc3MgKi8KKwkJCQkJaWYgKGlzX2JjYXN0KGV0aGhkci0+aF9zb3VyY2UpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJLyogbm90IGZvciBtZSAqLworCQkJCQlpZiAoIWlzX215X21hYyhldGhoZHItPmhfZGVzdCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvKiBkcm9wIHBhY2tldCBpZiBpdCBoYXMgbm90IG5lY2Vzc2FyeSBtaW5pbXVtIHNpemUgKi8KKwkJCQkJaWYgKHJlc3VsdCA8IHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArIHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJdW5pY2FzdF9wYWNrZXQgPSAoc3RydWN0IHVuaWNhc3RfcGFja2V0ICopKHBhY2tldF9idWZmICsgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKKworCQkJCQkvKiBwYWNrZXQgZm9yIG1lICovCisJCQkJCWlmIChpc19teV9tYWModW5pY2FzdF9wYWNrZXQtPmRlc3QpKSB7CisKKwkJCQkJCWludGVyZmFjZV9yeChzb2Z0X2RldmljZSwgcGFja2V0X2J1ZmYgKyBzaXplb2Yoc3RydWN0IGV0aGhkcikgKyBzaXplb2Yoc3RydWN0IHVuaWNhc3RfcGFja2V0KSwgcmVzdWx0IC0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpIC0gc2l6ZW9mKHN0cnVjdCB1bmljYXN0X3BhY2tldCkpOworCQkJCQkJY29udGludWU7CisKKwkJCQkJfQorCisJCQkJCS8qIFRUTCBleGNlZWRlZCAqLworCQkJCQlpZiAodW5pY2FzdF9wYWNrZXQtPnR0bCA8IDIpIHsKKwkJCQkJCWFkZHJfdG9fc3RyaW5nKHNyY19zdHIsICgoc3RydWN0IGV0aGhkciAqKSh1bmljYXN0X3BhY2tldCArIDEpKS0+aF9zb3VyY2UpOworCQkJCQkJYWRkcl90b19zdHJpbmcoZHN0X3N0ciwgdW5pY2FzdF9wYWNrZXQtPmRlc3QpOworCisJCQkJCQlkZWJ1Z19sb2coTE9HX1RZUEVfTk9USUNFLCAiRXJyb3IgLSBjYW4ndCBzZW5kIHBhY2tldCBmcm9tICVzIHRvICVzOiB0dGwgZXhjZWVkZWRcbiIsIHNyY19zdHIsIGRzdF9zdHIpOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKworCQkJCQkvKiBnZXQgcm91dGluZyBpbmZvcm1hdGlvbiAqLworCQkJCQlzcGluX2xvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwkJCQkJb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopaGFzaF9maW5kKG9yaWdfaGFzaCwgdW5pY2FzdF9wYWNrZXQtPmRlc3QpKTsKKworCQkJCQlpZiAoKG9yaWdfbm9kZSAhPSBOVUxMKSAmJiAob3JpZ19ub2RlLT5iYXRtYW5faWYgIT0gTlVMTCkgJiYgKG9yaWdfbm9kZS0+cm91dGVyICE9IE5VTEwpKSB7CisJCQkJCQkvKiBkZWNyZW1lbnQgdHRsICovCisJCQkJCQl1bmljYXN0X3BhY2tldC0+dHRsLS07CisKKwkJCQkJCS8qIHJvdXRlIGl0ICovCisJCQkJCQlzZW5kX3Jhd19wYWNrZXQocGFja2V0X2J1ZmYgKyBzaXplb2Yoc3RydWN0IGV0aGhkciksCisJCQkJCQkgICAgICAgICAgICAgICAgcmVzdWx0IC0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpLAorCQkJCQkJICAgICAgICAgICAgICAgIG9yaWdfbm9kZS0+YmF0bWFuX2lmLAorCQkJCQkJICAgICAgICAgICAgICAgIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyKTsKKwkJCQkJfQorCisJCQkJCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJCQkJCWJyZWFrOworCisJCQkJLyogYnJvYWRjYXN0IHBhY2tldCAqLworCQkJCWNhc2UgQkFUX0JDQVNUOgorCQkJCQkvKiBwYWNrZXQgd2l0aCBicm9hZGNhc3QgaW5kaWNhdGlvbiBidXQgdW5pY2FzdCByZWNpcGllbnQgKi8KKwkJCQkJaWYgKCFpc19iY2FzdChldGhoZHItPmhfZGVzdCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvKiBwYWNrZXQgd2l0aCBicm9hZGNhc3Qgc2VuZGVyIGFkZHJlc3MgKi8KKwkJCQkJaWYgKGlzX2JjYXN0KGV0aGhkci0+aF9zb3VyY2UpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJLyogZHJvcCBwYWNrZXQgaWYgaXQgaGFzIG5vdCBuZWNlc3NhcnkgbWluaW11bSBzaXplICovCisJCQkJCWlmIChyZXN1bHQgPCBzaXplb2Yoc3RydWN0IGV0aGhkcikgKyBzaXplb2Yoc3RydWN0IGJjYXN0X3BhY2tldCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvKiBpZ25vcmUgYnJvYWRjYXN0cyBzZW50IGJ5IG15c2VsZiAqLworCQkJCQlpZiAoaXNfbXlfbWFjKGV0aGhkci0+aF9zb3VyY2UpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJYmNhc3RfcGFja2V0ID0gKHN0cnVjdCBiY2FzdF9wYWNrZXQgKikocGFja2V0X2J1ZmYgKyBzaXplb2Yoc3RydWN0IGV0aGhkcikpOworCisJCQkJCS8qIGlnbm9yZSBicm9hZGNhc3RzIG9yaWdpbmF0ZWQgYnkgbXlzZWxmICovCisJCQkJCWlmIChpc19teV9tYWMoYmNhc3RfcGFja2V0LT5vcmlnKSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCXNwaW5fbG9jaygmb3JpZ19oYXNoX2xvY2spOworCQkJCQlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKiloYXNoX2ZpbmQob3JpZ19oYXNoLCBiY2FzdF9wYWNrZXQtPm9yaWcpKTsKKworCQkJCQlpZiAob3JpZ19ub2RlID09IE5VTEwpIHsKKwkJCQkJCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCisJCQkJCS8qIGNoZWNrIGZsb29kIGhpc3RvcnkgKi8KKwkJCQkJaWYgKGdldF9iaXRfc3RhdHVzKG9yaWdfbm9kZS0+YmNhc3RfYml0cywgb3JpZ19ub2RlLT5sYXN0X2JjYXN0X3NlcW5vLCBudG9ocyhiY2FzdF9wYWNrZXQtPnNlcW5vKSkpIHsKKwkJCQkJCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCisJCQkJCS8qIG1hcmsgYnJvYWRjYXN0IGluIGZsb29kIGhpc3RvcnkgKi8KKwkJCQkJaWYgKGJpdF9nZXRfcGFja2V0KG9yaWdfbm9kZS0+YmNhc3RfYml0cywgbnRvaHMoYmNhc3RfcGFja2V0LT5zZXFubykgLSBvcmlnX25vZGUtPmxhc3RfYmNhc3Rfc2Vxbm8sIDEpKQorCQkJCQkJb3JpZ19ub2RlLT5sYXN0X2JjYXN0X3NlcW5vID0gbnRvaHMoYmNhc3RfcGFja2V0LT5zZXFubyk7CisKKwkJCQkJc3Bpbl91bmxvY2soJm9yaWdfaGFzaF9sb2NrKTsKKworCQkJCQkvKiBicm9hZGNhc3QgZm9yIG1lICovCisJCQkJCWludGVyZmFjZV9yeChzb2Z0X2RldmljZSwgcGFja2V0X2J1ZmYgKyBzaXplb2Yoc3RydWN0IGV0aGhkcikgKyBzaXplb2Yoc3RydWN0IGJjYXN0X3BhY2tldCksIHJlc3VsdCAtIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSAtIHNpemVvZihzdHJ1Y3QgYmNhc3RfcGFja2V0KSk7CisKKwkJCQkJLyogcmVicm9hZGNhc3QgcGFja2V0ICovCisJCQkJCWFkZF9iY2FzdF9wYWNrZXRfdG9fbGlzdChwYWNrZXRfYnVmZiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSwKKwkJCQkJCQkJCXJlc3VsdCAtIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisKKwkJCQkJYnJlYWs7CisKKwkJCQkvKiB2aXMgcGFja2V0ICovCisJCQkJY2FzZSBCQVRfVklTOgorCQkJCQkvKiBkcm9wIGlmIHRvbyBzaG9ydC4gKi8KKwkJCQkJaWYgKHJlc3VsdCA8IHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArIHNpemVvZihzdHJ1Y3QgdmlzX3BhY2tldCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvKiBub3QgZm9yIG1lICovCisJCQkJCWlmICghaXNfbXlfbWFjKGV0aGhkci0+aF9kZXN0KSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCXZpc19wYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKikocGFja2V0X2J1ZmYgKyBzaXplb2Yoc3RydWN0IGV0aGhkcikpOworCQkJCQl2aXNfaW5mb19sZW4gPSByZXN1bHQgIC0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpIC0gc2l6ZW9mKHN0cnVjdCB2aXNfcGFja2V0KTsKKworCQkJCQkvKiBpZ25vcmUgb3duIHBhY2tldHMgKi8KKwkJCQkJaWYgKGlzX215X21hYyh2aXNfcGFja2V0LT52aXNfb3JpZykpCisJCQkJCQljb250aW51ZTsKKworCQkJCQlpZiAoaXNfbXlfbWFjKHZpc19wYWNrZXQtPnNlbmRlcl9vcmlnKSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCXN3aXRjaCAodmlzX3BhY2tldC0+dmlzX3R5cGUpIHsKKwkJCQkJY2FzZSBWSVNfVFlQRV9TRVJWRVJfU1lOQzoKKwkJCQkJCXJlY2VpdmVfc2VydmVyX3N5bmNfcGFja2V0KHZpc19wYWNrZXQsIHZpc19pbmZvX2xlbik7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIFZJU19UWVBFX0NMSUVOVF9VUERBVEU6CisJCQkJCQlyZWNlaXZlX2NsaWVudF91cGRhdGVfcGFja2V0KHZpc19wYWNrZXQsIHZpc19pbmZvX2xlbik7CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgkvKiBpZ25vcmUgdW5rbm93biBwYWNrZXQgKi8KKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CisKKwkJCWlmICgocmVzdWx0IDwgMCkgJiYgKHJlc3VsdCAhPSAtRUFHQUlOKSkKKwkJCQlkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwgIkNvdWxkIG5vdCByZWNlaXZlIHBhY2tldCBmcm9tIGludGVyZmFjZSAlczogJWlcbiIsIGJhdG1hbl9pZi0+ZGV2LCByZXN1bHQpOworCisJCQkvKiBsb2NrIGZvciB0aGUgbmV4dCBpdGVyYXRpb24gKi8KKwkJCXJjdV9yZWFkX2xvY2soKTsKKwkJfQorCQlyY3VfcmVhZF91bmxvY2soKTsKKworCX0KKwlrZnJlZShwYWNrZXRfYnVmZik7CisKKwkvKiBkbyBub3QgZXhpdCB1bnRpbCBrdGhyZWFkX3N0b3AoKSBpcyBhY3R1YWxseSBjYWxsZWQsIG90aGVyd2lzZSBpdCB3aWxsIHdhaXQgZm9yIHVzCisJICogZm9yZXZlci4gKi8KKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJc2NoZWR1bGUoKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGJhdG1hbl9kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaywgaW50IGxlbikKK3sKKwl2b2lkICgqZGF0YV9yZWFkeSkoc3RydWN0IHNvY2sgKiwgaW50KSA9IHNrLT5za191c2VyX2RhdGE7CisKKwlkYXRhX3JlYWR5KHNrLCBsZW4pOworCisJYXRvbWljX3NldCgmZGF0YV9yZWFkeV9jb25kLCAxKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnRocmVhZF93YWl0KTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcm91dGluZy5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcm91dGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMjNlYTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yb3V0aW5nLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJ0eXBlcy5oIgorCitleHRlcm4gd2FpdF9xdWV1ZV9oZWFkX3QgdGhyZWFkX3dhaXQ7CitleHRlcm4gYXRvbWljX3QgZXhpdF9jb25kOworCitpbnQgb3JpZ2luYXRvcl9pbml0KHZvaWQpOwordm9pZCBmcmVlX29yaWdfbm9kZSh2b2lkICpkYXRhKTsKK3ZvaWQgb3JpZ2luYXRvcl9mcmVlKHZvaWQpOwordm9pZCBzbGlkZV9vd25fYmNhc3Rfd2luZG93KHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZik7Cit2b2lkIGJhdG1hbl9kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaywgaW50IGxlbik7Cit2b2lkIHB1cmdlX29yaWcoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK2ludCBwYWNrZXRfcmVjdl90aHJlYWQodm9pZCAqZGF0YSk7Cit2b2lkIHJlY2VpdmVfYmF0X3BhY2tldChzdHJ1Y3QgZXRoaGRyICpldGhoZHIsIHN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0LCB1bnNpZ25lZCBjaGFyICpobmFfYnVmZiwgaW50IGhuYV9idWZmX2xlbiwgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc2VuZC5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc2VuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MjQ3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zZW5kLmMKQEAgLTAsMCArMSw0NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgInNlbmQuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJyb3V0aW5nLmgiCisjaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKKyNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAidmlzLmgiCisjaW5jbHVkZSAiYWdncmVnYXRpb24uaCIKKworI2luY2x1ZGUgImNvbXBhdC5oIgorCisvKiBhcHBseSBob3AgcGVuYWx0eSBmb3IgYSBub3JtYWwgbGluayAqLworc3RhdGljIHVpbnQ4X3QgaG9wX3BlbmFsdHkoY29uc3QgdWludDhfdCB0cSkKK3sKKwlyZXR1cm4gKHRxICogKFRRX01BWF9WQUxVRSAtIFRRX0hPUF9QRU5BTFRZKSkgLyAoVFFfTUFYX1ZBTFVFKTsKK30KKworLyogd2hlbiBkbyB3ZSBzY2hlZHVsZSBvdXIgb3duIHBhY2tldCB0byBiZSBzZW50ICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvd25fc2VuZF90aW1lKHZvaWQpCit7CisJcmV0dXJuIGppZmZpZXMgKworCQkoKChhdG9taWNfcmVhZCgmb3JpZ2luYXRvcl9pbnRlcnZhbCkgLSBKSVRURVIgKworCQkgICAocmFuZG9tMzIoKSAlIDIqSklUVEVSKSkgKiBIWikgLyAxMDAwKTsKK30KKworLyogd2hlbiBkbyB3ZSBzY2hlZHVsZSBhIGZvcndhcmRlZCBwYWNrZXQgdG8gYmUgc2VudCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZm9yd2FyZF9zZW5kX3RpbWUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHNlbmRfdGltZSA9IGppZmZpZXM7IC8qIFN0YXJ0aW5nIG5vdyBwbHVzLi4uICovCisKKwlpZiAoYXRvbWljX3JlYWQoJmFnZ3JlZ2F0aW9uX2VuYWJsZWQpKQorCQlzZW5kX3RpbWUgKz0gKCgoTUFYX0FHR1JFR0FUSU9OX01TIC0gKEpJVFRFUi8yKSArCisJCQkJKHJhbmRvbTMyKCkgJSBKSVRURVIpKSAqIEhaKSAvIDEwMDApOworCWVsc2UKKwkJc2VuZF90aW1lICs9ICgoKHJhbmRvbTMyKCkgJSAoSklUVEVSLzIpKSAqIEhaKSAvIDEwMDApOworCisJcmV0dXJuIHNlbmRfdGltZTsKK30KKworLyogc2VuZHMgYSByYXcgcGFja2V0LiAqLwordm9pZCBzZW5kX3Jhd19wYWNrZXQodW5zaWduZWQgY2hhciAqcGFja19idWZmLCBpbnQgcGFja19idWZmX2xlbiwKKwkJICAgICBzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYsIHVpbnQ4X3QgKmRzdF9hZGRyKQoreworCXN0cnVjdCBldGhoZHIgKmV0aGhkcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCByZXR2YWw7CisJY2hhciAqZGF0YTsKKworCWlmIChiYXRtYW5faWYtPmlmX2FjdGl2ZSAhPSBJRl9BQ1RJVkUpCisJCXJldHVybjsKKworCWlmICghKGJhdG1hbl9pZi0+bmV0X2Rldi0+ZmxhZ3MgJiBJRkZfVVApKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLAorCQkgICAgICAgICAiSW50ZXJmYWNlICVzIGlzIG5vdCB1cCAtIGNhbid0IHNlbmQgcGFja2V0IHZpYSB0aGF0IGludGVyZmFjZSAoSUZfVE9fQkVfREVBQ1RJVkFURUQgd2FzIGhlcmUpICFcbiIsCisJCSAgICAgICAgICBiYXRtYW5faWYtPmRldik7CisJCXJldHVybjsKKwl9CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHBhY2tfYnVmZl9sZW4gKyBzaXplb2Yoc3RydWN0IGV0aGhkcikpOworCWlmICghc2tiKQorCQlyZXR1cm47CisJZGF0YSA9IHNrYl9wdXQoc2tiLCBwYWNrX2J1ZmZfbGVuICsgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKKworCW1lbWNweShkYXRhICsgc2l6ZW9mKHN0cnVjdCBldGhoZHIpLCBwYWNrX2J1ZmYsIHBhY2tfYnVmZl9sZW4pOworCisJZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKikgZGF0YTsKKwltZW1jcHkoZXRoaGRyLT5oX3NvdXJjZSwgYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShldGhoZHItPmhfZGVzdCwgZHN0X2FkZHIsIEVUSF9BTEVOKTsKKwlldGhoZHItPmhfcHJvdG8gPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0JBVE1BTik7CisKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLCBFVEhfSExFTik7CisJc2tiLT5wcmlvcml0eSA9IFRDX1BSSU9fQ09OVFJPTDsKKwlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9CQVRNQU4pOworCXNrYi0+ZGV2ID0gYmF0bWFuX2lmLT5uZXRfZGV2OworCisJLyogZGV2X3F1ZXVlX3htaXQoKSByZXR1cm5zIGEgbmVnYXRpdmUgcmVzdWx0IG9uIGVycm9yLgkgSG93ZXZlciBvbgorCSAqIGNvbmdlc3Rpb24gYW5kIHRyYWZmaWMgc2hhcGluZywgaXQgZHJvcHMgYW5kIHJldHVybnMgTkVUX1hNSVRfRFJPUAorCSAqICh3aGljaCBpcyA+IDApLiBUaGlzIHdpbGwgbm90IGJlIHRyZWF0ZWQgYXMgYW4gZXJyb3IuICovCisJcmV0dmFsID0gZGV2X3F1ZXVlX3htaXQoc2tiKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZGVidWdfbG9nKExPR19UWVBFX0NSSVQsCisJCSAgICAgICAgICAiQ2FuJ3Qgd3JpdGUgdG8gcmF3IHNvY2tldCAoSUZfVE9fQkVfREVBQ1RJVkFURUQgd2FzIGhlcmUpOiAlaVxuIiwKKwkJICAgICAgICAgIHJldHZhbCk7Cit9CisKKy8qIFNlbmQgYSBwYWNrZXQgdG8gYSBnaXZlbiBpbnRlcmZhY2UgKi8KK3N0YXRpYyB2b2lkIHNlbmRfcGFja2V0X3RvX2lmKHN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXQsCisJCQkgICAgICBzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCit7CisJY2hhciAqZndkX3N0cjsKKwl1aW50OF90IHBhY2tldF9udW07CisJaW50MTZfdCBidWZmX3BvczsKKwlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldDsKKwljaGFyIG9yaWdfc3RyW0VUSF9TVFJfTEVOXTsKKworCWlmIChiYXRtYW5faWYtPmlmX2FjdGl2ZSAhPSBJRl9BQ1RJVkUpCisJCXJldHVybjsKKworCXBhY2tldF9udW0gPSBidWZmX3BvcyA9IDA7CisJYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKQorCQkoZm9yd19wYWNrZXQtPnBhY2tldF9idWZmKTsKKworCS8qIGFkanVzdCBhbGwgZmxhZ3MgYW5kIGxvZyBwYWNrZXRzICovCisJd2hpbGUgKGFnZ3JlZ2F0ZWRfcGFja2V0KGJ1ZmZfcG9zLAorCQkJCSBmb3J3X3BhY2tldC0+cGFja2V0X2xlbiwKKwkJCQkgYmF0bWFuX3BhY2tldC0+bnVtX2huYSkpIHsKKworCQkvKiB3ZSBtaWdodCBoYXZlIGFnZ3JlZ2F0ZWQgZGlyZWN0IGxpbmsgcGFja2V0cyB3aXRoIGFuCisJCSAqIG9yZGluYXJ5IGJhc2UgcGFja2V0ICovCisJCWlmICgoZm9yd19wYWNrZXQtPmRpcmVjdF9saW5rX2ZsYWdzICYgKDEgPDwgcGFja2V0X251bSkpICYmCisJCSAgICAoZm9yd19wYWNrZXQtPmlmX2luY29taW5nID09IGJhdG1hbl9pZikpCisJCQliYXRtYW5fcGFja2V0LT5mbGFncyB8PSBESVJFQ1RMSU5LOworCQllbHNlCisJCQliYXRtYW5fcGFja2V0LT5mbGFncyAmPSB+RElSRUNUTElOSzsKKworCQlhZGRyX3RvX3N0cmluZyhvcmlnX3N0ciwgYmF0bWFuX3BhY2tldC0+b3JpZyk7CisJCWZ3ZF9zdHIgPSAocGFja2V0X251bSA+IDAgPyAiRm9yd2FyZGluZyIgOiAoZm9yd19wYWNrZXQtPm93biA/CisJCQkJCQkJICAgICJTZW5kaW5nIG93biIgOgorCQkJCQkJCSAgICAiRm9yd2FyZGluZyIpKTsKKwkJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwKKwkJCSAgIiVzICVzcGFja2V0IChvcmlnaW5hdG9yICVzLCBzZXFubyAlZCwgVFEgJWQsIFRUTCAlZCwgSURGICVzKSBvbiBpbnRlcmZhY2UgJXMgWyVzXVxuIiwKKwkJCSAgZndkX3N0ciwKKwkJCSAgKHBhY2tldF9udW0gPiAwID8gImFnZ3JlZ2F0ZWQgIiA6ICIiKSwKKwkJCSAgb3JpZ19zdHIsIG50b2hzKGJhdG1hbl9wYWNrZXQtPnNlcW5vKSwKKwkJCSAgYmF0bWFuX3BhY2tldC0+dHEsIGJhdG1hbl9wYWNrZXQtPnR0bCwKKwkJCSAgKGJhdG1hbl9wYWNrZXQtPmZsYWdzICYgRElSRUNUTElOSyA/CisJCQkgICAib24iIDogIm9mZiIpLAorCQkJICBiYXRtYW5faWYtPmRldiwgYmF0bWFuX2lmLT5hZGRyX3N0cik7CisKKwkJYnVmZl9wb3MgKz0gc2l6ZW9mKHN0cnVjdCBiYXRtYW5fcGFja2V0KSArCisJCQkoYmF0bWFuX3BhY2tldC0+bnVtX2huYSAqIEVUSF9BTEVOKTsKKwkJcGFja2V0X251bSsrOworCQliYXRtYW5fcGFja2V0ID0gKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopCisJCQkoZm9yd19wYWNrZXQtPnBhY2tldF9idWZmICsgYnVmZl9wb3MpOworCX0KKworCXNlbmRfcmF3X3BhY2tldChmb3J3X3BhY2tldC0+cGFja2V0X2J1ZmYsCisJCQlmb3J3X3BhY2tldC0+cGFja2V0X2xlbiwKKwkJCWJhdG1hbl9pZiwgYnJvYWRjYXN0QWRkcik7Cit9CisKKy8qIHNlbmQgYSBiYXRtYW4gcGFja2V0ICovCitzdGF0aWMgdm9pZCBzZW5kX3BhY2tldChzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0KQoreworCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKKwlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCA9CisJCShzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKShmb3J3X3BhY2tldC0+cGFja2V0X2J1ZmYpOworCWNoYXIgb3JpZ19zdHJbRVRIX1NUUl9MRU5dOworCXVuc2lnbmVkIGNoYXIgZGlyZWN0bGluayA9IChiYXRtYW5fcGFja2V0LT5mbGFncyAmIERJUkVDVExJTksgPyAxIDogMCk7CisKKwlpZiAoIWZvcndfcGFja2V0LT5pZl9pbmNvbWluZykgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwKKwkJCSAgIkVycm9yIC0gY2FuJ3QgZm9yd2FyZCBwYWNrZXQ6IGluY29taW5nIGlmYWNlIG5vdCBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGZvcndfcGFja2V0LT5pZl9pbmNvbWluZy0+aWZfYWN0aXZlICE9IElGX0FDVElWRSkKKwkJcmV0dXJuOworCisJYWRkcl90b19zdHJpbmcob3JpZ19zdHIsIGJhdG1hbl9wYWNrZXQtPm9yaWcpOworCisJLyogbXVsdGlob21lZCBwZWVyIGFzc3VtZWQgKi8KKwkvKiBub24tcHJpbWFyeSBPR01zIGFyZSBvbmx5IGJyb2FkY2FzdGVkIG9uIHRoZWlyIGludGVyZmFjZSAqLworCWlmICgoZGlyZWN0bGluayAmJiAoYmF0bWFuX3BhY2tldC0+dHRsID09IDEpKSB8fAorCSAgICAoZm9yd19wYWNrZXQtPm93biAmJiAoZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5pZl9udW0gPiAwKSkpIHsKKworCQkvKiBGSVhNRTogd2hhdCBhYm91dCBhZ2dyZWdhdGVkIHBhY2tldHMgPyAqLworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLAorCQkJICAiJXMgcGFja2V0IChvcmlnaW5hdG9yICVzLCBzZXFubyAlZCwgVFRMICVkKSBvbiBpbnRlcmZhY2UgJXMgWyVzXVxuIiwKKwkJCSAgKGZvcndfcGFja2V0LT5vd24gPyAiU2VuZGluZyBvd24iIDogIkZvcndhcmRpbmciKSwKKwkJCSAgb3JpZ19zdHIsIG50b2hzKGJhdG1hbl9wYWNrZXQtPnNlcW5vKSwKKwkJCSAgYmF0bWFuX3BhY2tldC0+dHRsLCBmb3J3X3BhY2tldC0+aWZfaW5jb21pbmctPmRldiwKKwkJCSAgZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5hZGRyX3N0cik7CisKKwkJc2VuZF9yYXdfcGFja2V0KGZvcndfcGFja2V0LT5wYWNrZXRfYnVmZiwKKwkJCQlmb3J3X3BhY2tldC0+cGFja2V0X2xlbiwKKwkJCQlmb3J3X3BhY2tldC0+aWZfaW5jb21pbmcsCisJCQkJYnJvYWRjYXN0QWRkcik7CisJCXJldHVybjsKKwl9CisKKwkvKiBicm9hZGNhc3Qgb24gZXZlcnkgaW50ZXJmYWNlICovCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpCisJCXNlbmRfcGFja2V0X3RvX2lmKGZvcndfcGFja2V0LCBiYXRtYW5faWYpOworCXJjdV9yZWFkX3VubG9jaygpOworfQorCitzdGF0aWMgdm9pZCByZWJ1aWxkX2JhdG1hbl9wYWNrZXQoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQoreworCWludCBuZXdfbGVuOworCXVuc2lnbmVkIGNoYXIgKm5ld19idWZmOworCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0OworCisJbmV3X2xlbiA9IHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkgKyAobnVtX2huYSAqIEVUSF9BTEVOKTsKKwluZXdfYnVmZiA9IGttYWxsb2MobmV3X2xlbiwgR0ZQX0FUT01JQyk7CisKKwkvKiBrZWVwIG9sZCBidWZmZXIgaWYga21hbGxvYyBzaG91bGQgZmFpbCAqLworCWlmIChuZXdfYnVmZikgeworCQltZW1jcHkobmV3X2J1ZmYsIGJhdG1hbl9pZi0+cGFja2V0X2J1ZmYsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGJhdG1hbl9wYWNrZXQpKTsKKwkJYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKW5ld19idWZmOworCisJCWJhdG1hbl9wYWNrZXQtPm51bV9obmEgPSBobmFfbG9jYWxfZmlsbF9idWZmZXIoCisJCQluZXdfYnVmZiArIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCksCisJCQluZXdfbGVuIC0gc2l6ZW9mKHN0cnVjdCBiYXRtYW5fcGFja2V0KSk7CisKKwkJa2ZyZWUoYmF0bWFuX2lmLT5wYWNrZXRfYnVmZik7CisJCWJhdG1hbl9pZi0+cGFja2V0X2J1ZmYgPSBuZXdfYnVmZjsKKwkJYmF0bWFuX2lmLT5wYWNrZXRfbGVuID0gbmV3X2xlbjsKKwl9Cit9CisKK3ZvaWQgc2NoZWR1bGVfb3duX3BhY2tldChzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCit7CisJdW5zaWduZWQgbG9uZyBzZW5kX3RpbWU7CisJc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7CisKKwkvKioKKwkgKiB0aGUgaW50ZXJmYWNlIGdldHMgYWN0aXZhdGVkIGhlcmUgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zIGJldHdlZW4KKwkgKiB0aGUgbW9tZW50IG9mIGFjdGl2YXRpbmcgdGhlIGludGVyZmFjZSBpbgorCSAqIGhhcmRpZl9hY3RpdmF0ZV9pbnRlcmZhY2UoKSB3aGVyZSB0aGUgb3JpZ2luYXRvciBtYWMgaXMgc2V0IGFuZAorCSAqIG91dGRhdGVkIHBhY2tldHMgKGVzcGVjaWFsbHkgdW5pbml0aWFsaXplZCBtYWMgYWRkcmVzc2VzKSBpbiB0aGUKKwkgKiBwYWNrZXQgcXVldWUKKwkgKi8KKwlpZiAoYmF0bWFuX2lmLT5pZl9hY3RpdmUgPT0gSUZfVE9fQkVfQUNUSVZBVEVEKQorCQliYXRtYW5faWYtPmlmX2FjdGl2ZSA9IElGX0FDVElWRTsKKworCS8qIGlmIGxvY2FsIGhuYSBoYXMgY2hhbmdlZCBhbmQgaW50ZXJmYWNlIGlzIGEgcHJpbWFyeSBpbnRlcmZhY2UgKi8KKwlpZiAoKGF0b21pY19yZWFkKCZobmFfbG9jYWxfY2hhbmdlZCkpICYmIChiYXRtYW5faWYtPmlmX251bSA9PSAwKSkKKwkJcmVidWlsZF9iYXRtYW5fcGFja2V0KGJhdG1hbl9pZik7CisKKwkvKioKKwkgKiBOT1RFOiBwYWNrZXRfYnVmZiBtaWdodCBqdXN0IGhhdmUgYmVlbiByZS1hbGxvY2F0ZWQgaW4KKwkgKiByZWJ1aWxkX2JhdG1hbl9wYWNrZXQoKQorCSAqLworCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKiliYXRtYW5faWYtPnBhY2tldF9idWZmOworCisJLyogY2hhbmdlIHNlcXVlbmNlIG51bWJlciB0byBuZXR3b3JrIG9yZGVyICovCisJYmF0bWFuX3BhY2tldC0+c2Vxbm8gPSBodG9ucygodWludDE2X3QpYXRvbWljX3JlYWQoJmJhdG1hbl9pZi0+c2Vxbm8pKTsKKworCWlmIChpc192aXNfc2VydmVyKCkpCisJCWJhdG1hbl9wYWNrZXQtPmZsYWdzID0gVklTX1NFUlZFUjsKKwllbHNlCisJCWJhdG1hbl9wYWNrZXQtPmZsYWdzID0gMDsKKworCS8qIGNvdWxkIGJlIHJlYWQgYnkgcmVjZWl2ZV9iYXRfcGFja2V0KCkgKi8KKwlhdG9taWNfaW5jKCZiYXRtYW5faWYtPnNlcW5vKTsKKworCXNsaWRlX293bl9iY2FzdF93aW5kb3coYmF0bWFuX2lmKTsKKwlzZW5kX3RpbWUgPSBvd25fc2VuZF90aW1lKCk7CisJYWRkX2JhdF9wYWNrZXRfdG9fbGlzdChiYXRtYW5faWYtPnBhY2tldF9idWZmLAorCQkJICAgICAgIGJhdG1hbl9pZi0+cGFja2V0X2xlbiwgYmF0bWFuX2lmLCAxLCBzZW5kX3RpbWUpOworfQorCit2b2lkIHNjaGVkdWxlX2ZvcndhcmRfcGFja2V0KHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKKwkJCSAgICAgc3RydWN0IGV0aGhkciAqZXRoaGRyLAorCQkJICAgICBzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwKKwkJCSAgICAgdWludDhfdCBkaXJlY3RsaW5rLCBpbnQgaG5hX2J1ZmZfbGVuLAorCQkJICAgICBzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZykKK3sKKwl1bnNpZ25lZCBjaGFyIGluX3RxLCBpbl90dGwsIHRxX2F2ZyA9IDA7CisJdW5zaWduZWQgbG9uZyBzZW5kX3RpbWU7CisKKwlpZiAoYmF0bWFuX3BhY2tldC0+dHRsIDw9IDEpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwgInR0bCBleGNlZWRlZCBcbiIpOworCQlyZXR1cm47CisJfQorCisJaW5fdHEgPSBiYXRtYW5fcGFja2V0LT50cTsKKwlpbl90dGwgPSBiYXRtYW5fcGFja2V0LT50dGw7CisKKwliYXRtYW5fcGFja2V0LT50dGwtLTsKKwltZW1jcHkoYmF0bWFuX3BhY2tldC0+cHJldl9zZW5kZXIsIGV0aGhkci0+aF9zb3VyY2UsIEVUSF9BTEVOKTsKKworCS8qIHJlYnJvYWRjYXN0IHRxIG9mIG91ciBiZXN0IHJhbmtpbmcgbmVpZ2hib3IgdG8gZW5zdXJlIHRoZSByZWJyb2FkY2FzdAorCSAqIG9mIG91ciBiZXN0IHRxIHZhbHVlICovCisJaWYgKChvcmlnX25vZGUtPnJvdXRlcikgJiYgKG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmcgIT0gMCkpIHsKKworCQkvKiByZWJyb2FkY2FzdCBvZ20gb2YgYmVzdCByYW5raW5nIG5laWdoYm9yIGFzIGlzICovCisJCWlmICghY29tcGFyZV9vcmlnKG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyLCBldGhoZHItPmhfc291cmNlKSkgeworCQkJYmF0bWFuX3BhY2tldC0+dHEgPSBvcmlnX25vZGUtPnJvdXRlci0+dHFfYXZnOworCisJCQlpZiAob3JpZ19ub2RlLT5yb3V0ZXItPmxhc3RfdHRsKQorCQkJCWJhdG1hbl9wYWNrZXQtPnR0bCA9IG9yaWdfbm9kZS0+cm91dGVyLT5sYXN0X3R0bCAtIDE7CisJCX0KKworCQl0cV9hdmcgPSBvcmlnX25vZGUtPnJvdXRlci0+dHFfYXZnOworCX0KKworCS8qIGFwcGx5IGhvcCBwZW5hbHR5ICovCisJYmF0bWFuX3BhY2tldC0+dHEgPSBob3BfcGVuYWx0eShiYXRtYW5fcGFja2V0LT50cSk7CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiRm9yd2FyZGluZyBwYWNrZXQ6IHRxX29yaWc6ICVpLCB0cV9hdmc6ICVpLCB0cV9mb3J3OiAlaSwgdHRsX29yaWc6ICVpLCB0dGxfZm9ydzogJWkgXG4iLAorCQkgIGluX3RxLCB0cV9hdmcsIGJhdG1hbl9wYWNrZXQtPnRxLCBpbl90dGwgLSAxLAorCQkgIGJhdG1hbl9wYWNrZXQtPnR0bCk7CisKKwliYXRtYW5fcGFja2V0LT5zZXFubyA9IGh0b25zKGJhdG1hbl9wYWNrZXQtPnNlcW5vKTsKKworCWlmIChkaXJlY3RsaW5rKQorCQliYXRtYW5fcGFja2V0LT5mbGFncyB8PSBESVJFQ1RMSU5LOworCWVsc2UKKwkJYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJj0gfkRJUkVDVExJTks7CisKKwlzZW5kX3RpbWUgPSBmb3J3YXJkX3NlbmRfdGltZSgpOworCWFkZF9iYXRfcGFja2V0X3RvX2xpc3QoKHVuc2lnbmVkIGNoYXIgKiliYXRtYW5fcGFja2V0LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkgKyBobmFfYnVmZl9sZW4sCisJCQkgICAgICAgaWZfaW5jb21pbmcsIDAsIHNlbmRfdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIGZvcndfcGFja2V0X2ZyZWUoc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldCkKK3sKKwlrZnJlZShmb3J3X3BhY2tldC0+cGFja2V0X2J1ZmYpOworCWtmcmVlKGZvcndfcGFja2V0KTsKK30KKworc3RhdGljIHZvaWQgX2FkZF9iY2FzdF9wYWNrZXRfdG9fbGlzdChzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0LAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc2VuZF90aW1lKQoreworCUlOSVRfSExJU1RfTk9ERSgmZm9yd19wYWNrZXQtPmxpc3QpOworCisJLyogYWRkIG5ldyBwYWNrZXQgdG8gcGFja2V0IGxpc3QgKi8KKwlzcGluX2xvY2soJmZvcndfYmNhc3RfbGlzdF9sb2NrKTsKKwlobGlzdF9hZGRfaGVhZCgmZm9yd19wYWNrZXQtPmxpc3QsICZmb3J3X2JjYXN0X2xpc3QpOworCXNwaW5fdW5sb2NrKCZmb3J3X2JjYXN0X2xpc3RfbG9jayk7CisKKwkvKiBzdGFydCB0aW1lciBmb3IgdGhpcyBwYWNrZXQgKi8KKwlJTklUX0RFTEFZRURfV09SSygmZm9yd19wYWNrZXQtPmRlbGF5ZWRfd29yaywKKwkJCSAgc2VuZF9vdXRzdGFuZGluZ19iY2FzdF9wYWNrZXQpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhiYXRfZXZlbnRfd29ya3F1ZXVlLCAmZm9yd19wYWNrZXQtPmRlbGF5ZWRfd29yaywKKwkJCSAgIHNlbmRfdGltZSk7Cit9CisKK3ZvaWQgYWRkX2JjYXN0X3BhY2tldF90b19saXN0KHVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmLCBpbnQgcGFja2V0X2xlbikKK3sKKwlzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0OworCisJZm9yd19wYWNrZXQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZm9yd19wYWNrZXQpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWZvcndfcGFja2V0KQorCQlyZXR1cm47CisKKwlmb3J3X3BhY2tldC0+cGFja2V0X2J1ZmYgPSBrbWFsbG9jKHBhY2tldF9sZW4sIEdGUF9BVE9NSUMpOworCWlmICghZm9yd19wYWNrZXQtPnBhY2tldF9idWZmKQorCQlyZXR1cm47CisKKwlmb3J3X3BhY2tldC0+cGFja2V0X2xlbiA9IHBhY2tldF9sZW47CisJbWVtY3B5KGZvcndfcGFja2V0LT5wYWNrZXRfYnVmZiwgcGFja2V0X2J1ZmYsIGZvcndfcGFja2V0LT5wYWNrZXRfbGVuKTsKKworCS8qIGhvdyBvZnRlbiBkaWQgd2Ugc2VuZCB0aGUgYmNhc3QgcGFja2V0ID8gKi8KKwlmb3J3X3BhY2tldC0+bnVtX3BhY2tldHMgPSAwOworCisJX2FkZF9iY2FzdF9wYWNrZXRfdG9fbGlzdChmb3J3X3BhY2tldCwgMSk7Cit9CisKK3ZvaWQgc2VuZF9vdXRzdGFuZGluZ19iY2FzdF9wYWNrZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkZWxheWVkX3dvcmsgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7CisJc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldCA9CisJCWNvbnRhaW5lcl9vZihkZWxheWVkX3dvcmssIHN0cnVjdCBmb3J3X3BhY2tldCwgZGVsYXllZF93b3JrKTsKKworCXNwaW5fbG9jaygmZm9yd19iY2FzdF9saXN0X2xvY2spOworCWhsaXN0X2RlbCgmZm9yd19wYWNrZXQtPmxpc3QpOworCXNwaW5fdW5sb2NrKCZmb3J3X2JjYXN0X2xpc3RfbG9jayk7CisKKwkvKiByZWJyb2FkY2FzdCBwYWNrZXQgKi8KKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYmF0bWFuX2lmLCAmaWZfbGlzdCwgbGlzdCkgeworCQlzZW5kX3Jhd19wYWNrZXQoZm9yd19wYWNrZXQtPnBhY2tldF9idWZmLAorCQkJCWZvcndfcGFja2V0LT5wYWNrZXRfbGVuLAorCQkJCWJhdG1hbl9pZiwgYnJvYWRjYXN0QWRkcik7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJZm9yd19wYWNrZXQtPm51bV9wYWNrZXRzKys7CisKKwkvKiBpZiB3ZSBzdGlsbCBoYXZlIHNvbWUgbW9yZSBiY2FzdHMgdG8gc2VuZCBhbmQgd2UgYXJlIG5vdCBzaHV0dGluZworCSAqIGRvd24gKi8KKwlpZiAoKGZvcndfcGFja2V0LT5udW1fcGFja2V0cyA8IDMpICYmCisJICAgIChhdG9taWNfcmVhZCgmbW9kdWxlX3N0YXRlKSAhPSBNT0RVTEVfREVBQ1RJVkFUSU5HKSkKKwkJX2FkZF9iY2FzdF9wYWNrZXRfdG9fbGlzdChmb3J3X3BhY2tldCwgKCg1ICogSFopIC8gMTAwMCkpOworCWVsc2UKKwkJZm9yd19wYWNrZXRfZnJlZShmb3J3X3BhY2tldCk7Cit9CisKK3ZvaWQgc2VuZF9vdXRzdGFuZGluZ19iYXRfcGFja2V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkZWxheWVkX3dvcmsgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7CisJc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldCA9CisJCWNvbnRhaW5lcl9vZihkZWxheWVkX3dvcmssIHN0cnVjdCBmb3J3X3BhY2tldCwgZGVsYXllZF93b3JrKTsKKworCXNwaW5fbG9jaygmZm9yd19iYXRfbGlzdF9sb2NrKTsKKwlobGlzdF9kZWwoJmZvcndfcGFja2V0LT5saXN0KTsKKwlzcGluX3VubG9jaygmZm9yd19iYXRfbGlzdF9sb2NrKTsKKworCXNlbmRfcGFja2V0KGZvcndfcGFja2V0KTsKKworCS8qKgorCSAqIHdlIGhhdmUgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgcGFja2V0IGluIHRoZSBxdWV1ZQorCSAqIHRvIGRldGVybWluZSB0aGUgcXVldWVzIHdha2UgdXAgdGltZSB1bmxlc3Mgd2UgYXJlCisJICogc2h1dHRpbmcgZG93bgorCSAqLworCWlmICgoZm9yd19wYWNrZXQtPm93bikgJiYKKwkgICAgKGF0b21pY19yZWFkKCZtb2R1bGVfc3RhdGUpICE9IE1PRFVMRV9ERUFDVElWQVRJTkcpKQorCQlzY2hlZHVsZV9vd25fcGFja2V0KGZvcndfcGFja2V0LT5pZl9pbmNvbWluZyk7CisKKwlmb3J3X3BhY2tldF9mcmVlKGZvcndfcGFja2V0KTsKK30KKwordm9pZCBwdXJnZV9vdXRzdGFuZGluZ19wYWNrZXRzKHZvaWQpCit7CisJc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wX25vZGUsICpzYWZlX3RtcF9ub2RlOworCisJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwgInB1cmdlX291dHN0YW5kaW5nX3BhY2tldHMoKVxuIik7CisKKwkvKiBmcmVlIGJjYXN0IGxpc3QgKi8KKwlzcGluX2xvY2soJmZvcndfYmNhc3RfbGlzdF9sb2NrKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZvcndfcGFja2V0LCB0bXBfbm9kZSwgc2FmZV90bXBfbm9kZSwKKwkJCQkgICZmb3J3X2JjYXN0X2xpc3QsIGxpc3QpIHsKKworCQlzcGluX3VubG9jaygmZm9yd19iY2FzdF9saXN0X2xvY2spOworCisJCS8qKgorCQkgKiBzZW5kX291dHN0YW5kaW5nX2JjYXN0X3BhY2tldCgpIHdpbGwgbG9jayB0aGUgbGlzdCB0bworCQkgKiBkZWxldGUgdGhlIGl0ZW0gZnJvbSB0aGUgbGlzdAorCQkgKi8KKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZmb3J3X3BhY2tldC0+ZGVsYXllZF93b3JrKTsKKwkJc3Bpbl9sb2NrKCZmb3J3X2JjYXN0X2xpc3RfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrKCZmb3J3X2JjYXN0X2xpc3RfbG9jayk7CisKKwkvKiBmcmVlIGJhdG1hbiBwYWNrZXQgbGlzdCAqLworCXNwaW5fbG9jaygmZm9yd19iYXRfbGlzdF9sb2NrKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZvcndfcGFja2V0LCB0bXBfbm9kZSwgc2FmZV90bXBfbm9kZSwKKwkJCQkgICZmb3J3X2JhdF9saXN0LCBsaXN0KSB7CisKKwkJc3Bpbl91bmxvY2soJmZvcndfYmF0X2xpc3RfbG9jayk7CisKKwkJLyoqCisJCSAqIHNlbmRfb3V0c3RhbmRpbmdfYmF0X3BhY2tldCgpIHdpbGwgbG9jayB0aGUgbGlzdCB0bworCQkgKiBkZWxldGUgdGhlIGl0ZW0gZnJvbSB0aGUgbGlzdAorCQkgKi8KKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZmb3J3X3BhY2tldC0+ZGVsYXllZF93b3JrKTsKKwkJc3Bpbl9sb2NrKCZmb3J3X2JhdF9saXN0X2xvY2spOworCX0KKwlzcGluX3VubG9jaygmZm9yd19iYXRfbGlzdF9sb2NrKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NlbmQuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NlbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWQ1MDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc2VuZC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAidHlwZXMuaCIKKwordm9pZCBzZW5kX293bl9wYWNrZXRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwordm9pZCBzZW5kX3Jhd19wYWNrZXQodW5zaWduZWQgY2hhciAqcGFja19idWZmLCBpbnQgcGFja19idWZmX2xlbiwKKwkJICAgICBzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYsIHVpbnQ4X3QgKmRzdF9hZGRyKTsKK3ZvaWQgc2NoZWR1bGVfb3duX3BhY2tldChzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpOwordm9pZCBzY2hlZHVsZV9mb3J3YXJkX3BhY2tldChzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCisJCQkgICAgIHN0cnVjdCBldGhoZHIgKmV0aGhkciwKKwkJCSAgICAgc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsCisJCQkgICAgIHVpbnQ4X3QgZGlyZWN0bGluaywgaW50IGhuYV9idWZmX2xlbiwKKwkJCSAgICAgc3RydWN0IGJhdG1hbl9pZiAqaWZfb3V0Z29pbmcpOwordm9pZCBhZGRfYmNhc3RfcGFja2V0X3RvX2xpc3QodW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsIGludCBwYWNrZXRfbGVuKTsKK3ZvaWQgc2VuZF9vdXRzdGFuZGluZ19iY2FzdF9wYWNrZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3ZvaWQgc2VuZF9vdXRzdGFuZGluZ19iYXRfcGFja2V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Cit2b2lkIHB1cmdlX291dHN0YW5kaW5nX3BhY2tldHModm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTQzZjUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuYwpAQCAtMCwwICsxLDM0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgorI2luY2x1ZGUgInNlbmQuaCIKKyNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiaGFzaC5oIgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgImNvbXBhdC5oIgorCitzdGF0aWMgdWludDE2X3QgYmNhc3Rfc2Vxbm8gPSAxOyAvKiBnaXZlIG93biBiY2FzdCBtZXNzYWdlcyBzZXEgbnVtYmVycyB0byBhdm9pZAorCQkJCSAgKiBicm9hZGNhc3Qgc3Rvcm1zICovCitzdGF0aWMgaW50MzJfdCBza2JfcGFja2V0czsKK3N0YXRpYyBpbnQzMl90IHNrYl9iYWRfcGFja2V0czsKK3N0YXRpYyBpbnQzMl90IGxvY2tfZHJvcHBlZDsKKwordW5zaWduZWQgY2hhciBtYWluSWZBZGRyW0VUSF9BTEVOXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1haW5JZkFkZHJfZGVmYXVsdFtFVEhfQUxFTl07CitzdGF0aWMgaW50IGJhdF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpOworc3RhdGljIHZvaWQgYmF0X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbyk7CitzdGF0aWMgdTMyIGJhdF9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBiYXRfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSk7CitzdGF0aWMgdTMyIGJhdF9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB1MzIgYmF0X2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBiYXRfc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGJhdF9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzID0gYmF0X2dldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8gPSBiYXRfZ2V0X2RydmluZm8sCisJLmdldF9tc2dsZXZlbCA9IGJhdF9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbCA9IGJhdF9zZXRfbXNnbGV2ZWwsCisJLmdldF9saW5rID0gYmF0X2dldF9saW5rLAorCS5nZXRfcnhfY3N1bSA9IGJhdF9nZXRfcnhfY3N1bSwKKwkuc2V0X3J4X2NzdW0gPSBiYXRfc2V0X3J4X2NzdW0KK307CisKK3ZvaWQgc2V0X21haW5faWZfYWRkcih1aW50OF90ICphZGRyKQoreworCW1lbWNweShtYWluSWZBZGRyLCBhZGRyLCBFVEhfQUxFTik7Cit9CisKK2ludCBtYWluX2lmX3dhc191cCh2b2lkKQoreworCXJldHVybiAobWVtY21wKG1haW5JZkFkZHIsIG1haW5JZkFkZHJfZGVmYXVsdCwgRVRIX0FMRU4pICE9IDAgPyAxIDogMCk7Cit9CisKK3N0YXRpYyBpbnQgbXlfc2tiX3B1c2goc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKworCXNrYl9wYWNrZXRzKys7CisJaWYgKHNrYi0+ZGF0YSAtIGxlbiA8IHNrYi0+aGVhZCkgeworCQlza2JfYmFkX3BhY2tldHMrKzsKKwkJcmVzdWx0ID0gcHNrYl9leHBhbmRfaGVhZChza2IsIGxlbiwgMCwgR0ZQX0FUT01JQyk7CisKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXNrYl9wdXNoKHNrYiwgbGVuKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEhBVkVfTkVUX0RFVklDRV9PUFMKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgYmF0X25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuID0gaW50ZXJmYWNlX29wZW4sCisJLm5kb19zdG9wID0gaW50ZXJmYWNlX3JlbGVhc2UsCisJLm5kb19nZXRfc3RhdHMgPSBpbnRlcmZhY2Vfc3RhdHMsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgPSBpbnRlcmZhY2Vfc2V0X21hY19hZGRyLAorCS5uZG9fY2hhbmdlX210dSA9IGludGVyZmFjZV9jaGFuZ2VfbXR1LAorCS5uZG9fc3RhcnRfeG1pdCA9IGludGVyZmFjZV90eCwKKwkubmRvX3ZhbGlkYXRlX2FkZHIgPSBldGhfdmFsaWRhdGVfYWRkcgorfTsKKyNlbmRpZgorCit2b2lkIGludGVyZmFjZV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiYXRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJY2hhciBkZXZfYWRkcltFVEhfQUxFTl07CisKKwlldGhlcl9zZXR1cChkZXYpOworCisjaWZkZWYgSEFWRV9ORVRfREVWSUNFX09QUworCWRldi0+bmV0ZGV2X29wcyA9ICZiYXRfbmV0ZGV2X29wczsKKyNlbHNlCisJZGV2LT5vcGVuID0gaW50ZXJmYWNlX29wZW47CisJZGV2LT5zdG9wID0gaW50ZXJmYWNlX3JlbGVhc2U7CisJZGV2LT5nZXRfc3RhdHMgPSBpbnRlcmZhY2Vfc3RhdHM7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBpbnRlcmZhY2Vfc2V0X21hY19hZGRyOworCWRldi0+Y2hhbmdlX210dSA9IGludGVyZmFjZV9jaGFuZ2VfbXR1OworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaW50ZXJmYWNlX3R4OworI2VuZGlmCisJZGV2LT5kZXN0cnVjdG9yID0gZnJlZV9uZXRkZXY7CisKKwlkZXYtPm10dSA9IGhhcmRpZl9taW5fbXR1KCk7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBCQVRfSEVBREVSX0xFTjsgLyogcmVzZXJ2ZSBtb3JlIHNwYWNlIGluIHRoZQorCQkJCQkJKiBza2J1ZmYgZm9yIG91ciBoZWFkZXIgKi8KKworCS8qIGdlbmVyYXRlIHJhbmRvbSBhZGRyZXNzICovCisJcmFuZG9tX2V0aGVyX2FkZHIoZGV2X2FkZHIpOworCW1lbWNweShkZXYtPmRldl9hZGRyLCBkZXZfYWRkciwgc2l6ZW9mKGRldi0+ZGV2X2FkZHIpKTsKKworCVNFVF9FVEhUT09MX09QUyhkZXYsICZiYXRfZXRodG9vbF9vcHMpOworCisJbWVtc2V0KHByaXYsIDAsIHNpemVvZihzdHJ1Y3QgYmF0X3ByaXYpKTsKK30KKworaW50IGludGVyZmFjZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGludGVyZmFjZV9yZWxlYXNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaW50ZXJmYWNlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJhdF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gJnByaXYtPnN0YXRzOworfQorCitpbnQgaW50ZXJmYWNlX3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXJldHVybiAtRUJVU1k7Cit9CisKK2ludCBpbnRlcmZhY2VfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwkvKiBjaGVjayByYW5nZXMgKi8KKwlpZiAoKG5ld19tdHUgPCA2OCkgfHwgKG5ld19tdHUgPiBoYXJkaWZfbWluX210dSgpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXYtPm10dSA9IG5ld19tdHU7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGludGVyZmFjZV90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB1bmljYXN0X3BhY2tldCAqdW5pY2FzdF9wYWNrZXQ7CisJc3RydWN0IGJjYXN0X3BhY2tldCAqYmNhc3RfcGFja2V0OworCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKKwlzdHJ1Y3QgZXRoaGRyICpldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3QgYmF0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBkYXRhX2xlbiA9IHNrYi0+bGVuOworCisJaWYgKGF0b21pY19yZWFkKCZtb2R1bGVfc3RhdGUpICE9IE1PRFVMRV9BQ1RJVkUpCisJCWdvdG8gZHJvcHBlZDsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCS8qIFRPRE86IGNoZWNrIHRoaXMgZm9yIGxvY2tzICovCisJaG5hX2xvY2FsX2FkZChldGhoZHItPmhfc291cmNlKTsKKworCS8qIGV0aGVybmV0IHBhY2tldCBzaG91bGQgYmUgYnJvYWRjYXN0ZWQgKi8KKwlpZiAoaXNfYmNhc3QoZXRoaGRyLT5oX2Rlc3QpIHx8IGlzX21jYXN0KGV0aGhkci0+aF9kZXN0KSkgeworCisJCWlmIChteV9za2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgYmNhc3RfcGFja2V0KSkgPCAwKQorCQkJZ290byBkcm9wcGVkOworCisJCWJjYXN0X3BhY2tldCA9IChzdHJ1Y3QgYmNhc3RfcGFja2V0ICopc2tiLT5kYXRhOworCisJCWJjYXN0X3BhY2tldC0+dmVyc2lvbiA9IENPTVBBVF9WRVJTSU9OOworCisJCS8qIGJhdG1hbiBwYWNrZXQgdHlwZTogYnJvYWRjYXN0ICovCisJCWJjYXN0X3BhY2tldC0+cGFja2V0X3R5cGUgPSBCQVRfQkNBU1Q7CisKKwkJLyogaHcgYWRkcmVzcyBvZiBmaXJzdCBpbnRlcmZhY2UgaXMgdGhlIG9yaWcgbWFjIGJlY2F1c2Ugb25seQorCQkgKiB0aGlzIG1hYyBpcyBrbm93biB0aHJvdWdob3V0IHRoZSBtZXNoICovCisJCW1lbWNweShiY2FzdF9wYWNrZXQtPm9yaWcsIG1haW5JZkFkZHIsIEVUSF9BTEVOKTsKKwkJLyogc2V0IGJyb2FkY2FzdCBzZXF1ZW5jZSBudW1iZXIgKi8KKwkJYmNhc3RfcGFja2V0LT5zZXFubyA9IGh0b25zKGJjYXN0X3NlcW5vKTsKKworCQliY2FzdF9zZXFubysrOworCisJCS8qIGJyb2FkY2FzdCBwYWNrZXQgKi8KKwkJYWRkX2JjYXN0X3BhY2tldF90b19saXN0KHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisJLyogdW5pY2FzdCBwYWNrZXQgKi8KKwl9IGVsc2UgeworCisJCS8qIHNpbXBseSBzcGluX2xvY2soKWluZyBjYW4gZGVhZGxvY2sgd2hlbiB0aGUgbG9jayBpcyBhbHJlYWR5CisJCSAqIGhvbGQuICovCisJCS8qIFRPRE86IGRlZmVyIHRoZSB3b3JrIGluIGEgd29ya2luZyBxdWV1ZSBpbnN0ZWFkIG9mCisJCSAqIGRyb3BwaW5nICovCisJCWlmICghc3Bpbl90cnlsb2NrKCZvcmlnX2hhc2hfbG9jaykpIHsKKwkJCWxvY2tfZHJvcHBlZCsrOworCQkJZGVidWdfbG9nKExPR19UWVBFX05PVElDRSwgIiVkIHBhY2tldHMgZHJvcHBlZCBiZWNhdXNlIGxvY2sgd2FzIGhvbGRcbiIsIGxvY2tfZHJvcHBlZCk7CisJCQlnb3RvIGRyb3BwZWQ7CisJCX0KKworCQkvKiBnZXQgcm91dGluZyBpbmZvcm1hdGlvbiAqLworCQlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKiloYXNoX2ZpbmQob3JpZ19oYXNoLAorCQkJCQkJCSAgIGV0aGhkci0+aF9kZXN0KSk7CisKKwkJLyogY2hlY2sgZm9yIGhuYSBob3N0ICovCisJCWlmICghb3JpZ19ub2RlKQorCQkJb3JpZ19ub2RlID0gdHJhbnN0YWJsZV9zZWFyY2goZXRoaGRyLT5oX2Rlc3QpOworCisJCWlmICgob3JpZ19ub2RlKSAmJgorCQkgICAgKG9yaWdfbm9kZS0+YmF0bWFuX2lmKSAmJgorCQkgICAgKG9yaWdfbm9kZS0+cm91dGVyKSkgeworCQkJaWYgKG15X3NrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCB1bmljYXN0X3BhY2tldCkpIDwgMCkKKwkJCQlnb3RvIHVubG9jazsKKworCQkJdW5pY2FzdF9wYWNrZXQgPSAoc3RydWN0IHVuaWNhc3RfcGFja2V0ICopc2tiLT5kYXRhOworCisJCQl1bmljYXN0X3BhY2tldC0+dmVyc2lvbiA9IENPTVBBVF9WRVJTSU9OOworCQkJLyogYmF0bWFuIHBhY2tldCB0eXBlOiB1bmljYXN0ICovCisJCQl1bmljYXN0X3BhY2tldC0+cGFja2V0X3R5cGUgPSBCQVRfVU5JQ0FTVDsKKwkJCS8qIHNldCB1bmljYXN0IHR0bCAqLworCQkJdW5pY2FzdF9wYWNrZXQtPnR0bCA9IFRUTDsKKwkJCS8qIGNvcHkgdGhlIGRlc3RpbmF0aW9uIGZvciBmYXN0ZXIgcm91dGluZyAqLworCQkJbWVtY3B5KHVuaWNhc3RfcGFja2V0LT5kZXN0LCBvcmlnX25vZGUtPm9yaWcsIEVUSF9BTEVOKTsKKworCQkJLyogbmV0X2RldiB3b24ndCBiZSBhdmFpbGFibGUgd2hlbiBub3QgYWN0aXZlICovCisJCQlpZiAob3JpZ19ub2RlLT5iYXRtYW5faWYtPmlmX2FjdGl2ZSAhPSBJRl9BQ1RJVkUpCisJCQkJZ290byB1bmxvY2s7CisKKwkJCXNlbmRfcmF3X3BhY2tldChza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJCQlvcmlnX25vZGUtPmJhdG1hbl9pZiwKKwkJCQkJb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIpOworCQl9IGVsc2UgeworCQkJZ290byB1bmxvY2s7CisJCX0KKworCQlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCX0KKworCXByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlwcml2LT5zdGF0cy50eF9ieXRlcyArPSBkYXRhX2xlbjsKKwlnb3RvIGVuZDsKKwordW5sb2NrOgorCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7Citkcm9wcGVkOgorCXByaXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKK2VuZDoKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpbnRlcmZhY2Vfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcGFja2V0LCBpbnQgcGFja2V0X2xlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBiYXRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHBhY2tldF9sZW4pOworCisJaWYgKCFza2IpIHsKKwkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1jcHkoc2tiX3B1dChza2IsIHBhY2tldF9sZW4pLCBwYWNrZXQsIHBhY2tldF9sZW4pOworCisJLyogV3JpdGUgbWV0YWRhdGEsIGFuZCB0aGVuIHBhc3MgdG8gdGhlIHJlY2VpdmUgbGV2ZWwgKi8KKwlza2ItPmRldiA9IGRldjsKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisKKwlwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gcGFja2V0X2xlbjsKKworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisKKwluZXRpZl9yeChza2IpOworCitvdXQ6CisJcmV0dXJuOworfQorCisvKiBldGh0b29sICovCitzdGF0aWMgaW50IGJhdF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJY21kLT5zdXBwb3J0ZWQgPSAwOworCWNtZC0+YWR2ZXJ0aXNpbmcgPSAwOworCWNtZC0+c3BlZWQgPSBTUEVFRF8xMDsKKwljbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOworCWNtZC0+cG9ydCA9IFBPUlRfVFA7CisJY21kLT5waHlfYWRkcmVzcyA9IDA7CisJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisJY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCWNtZC0+bWF4dHhwa3QgPSAwOworCWNtZC0+bWF4cnhwa3QgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJhdF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgIkIuQS5ULk0uQS5OLiBhZHZhbmNlZCIpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBTT1VSQ0VfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmZ3X3ZlcnNpb24sICJOL0EiKTsKKwlzdHJjcHkoaW5mby0+YnVzX2luZm8sICJiYXRtYW4iKTsKK30KKworc3RhdGljIHUzMiBiYXRfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgdm9pZCBiYXRfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB1MzIgYmF0X2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1MzIgYmF0X2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmF0X3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNWUyNzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCit2b2lkIHNldF9tYWluX2lmX2FkZHIodWludDhfdCAqYWRkcik7CitpbnQgbWFpbl9pZl93YXNfdXAodm9pZCk7Cit2b2lkIGludGVyZmFjZV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBpbnRlcmZhY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBpbnRlcmZhY2VfcmVsZWFzZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppbnRlcmZhY2Vfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgaW50ZXJmYWNlX3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKTsKK2ludCBpbnRlcmZhY2VfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSk7CitpbnQgaW50ZXJmYWNlX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBpbnRlcmZhY2Vfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcGFja2V0LCBpbnQgcGFja2V0X2xlbik7CisKK2V4dGVybiB1bnNpZ25lZCBjaGFyIG1haW5JZkFkZHJbXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMTkwZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5jCkBAIC0wLDAgKzEsNDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInNvZnQtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisKK3N0cnVjdCBoYXNodGFibGVfdCAqaG5hX2xvY2FsX2hhc2g7CitzdGF0aWMgc3RydWN0IGhhc2h0YWJsZV90ICpobmFfZ2xvYmFsX2hhc2g7CithdG9taWNfdCBobmFfbG9jYWxfY2hhbmdlZDsKKworREVGSU5FX1NQSU5MT0NLKGhuYV9sb2NhbF9oYXNoX2xvY2spOworc3RhdGljIERFRklORV9TUElOTE9DSyhobmFfZ2xvYmFsX2hhc2hfbG9jayk7CisKK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhobmFfbG9jYWxfcHVyZ2Vfd3EsIGhuYV9sb2NhbF9wdXJnZSk7CisKK3N0YXRpYyB2b2lkIGhuYV9sb2NhbF9zdGFydF90aW1lcih2b2lkKQoreworCXF1ZXVlX2RlbGF5ZWRfd29yayhiYXRfZXZlbnRfd29ya3F1ZXVlLCAmaG5hX2xvY2FsX3B1cmdlX3dxLCAxMCAqIEhaKTsKK30KKworaW50IGhuYV9sb2NhbF9pbml0KHZvaWQpCit7CisJaWYgKGhuYV9sb2NhbF9oYXNoKQorCQlyZXR1cm4gMTsKKworCWhuYV9sb2NhbF9oYXNoID0gaGFzaF9uZXcoMTI4LCBjb21wYXJlX29yaWcsIGNob29zZV9vcmlnKTsKKworCWlmICghaG5hX2xvY2FsX2hhc2gpCisJCXJldHVybiAwOworCisJYXRvbWljX3NldCgmaG5hX2xvY2FsX2NoYW5nZWQsIDApOworCWhuYV9sb2NhbF9zdGFydF90aW1lcigpOworCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgaG5hX2xvY2FsX2FkZCh1aW50OF90ICphZGRyKQoreworCXN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeTsKKwlzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqaG5hX2dsb2JhbF9lbnRyeTsKKwlzdHJ1Y3QgaGFzaHRhYmxlX3QgKnN3YXBoYXNoOworCWNoYXIgaG5hX3N0cltFVEhfU1RSX0xFTl07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZobmFfbG9jYWxfaGFzaF9sb2NrLCBmbGFncyk7CisJaG5hX2xvY2FsX2VudHJ5ID0KKwkJKChzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICopaGFzaF9maW5kKGhuYV9sb2NhbF9oYXNoLCBhZGRyKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG5hX2xvY2FsX2hhc2hfbG9jaywgZmxhZ3MpOworCisJaWYgKGhuYV9sb2NhbF9lbnRyeSAhPSBOVUxMKSB7CisJCWhuYV9sb2NhbF9lbnRyeS0+bGFzdF9zZWVuID0gamlmZmllczsKKwkJcmV0dXJuOworCX0KKworCWFkZHJfdG9fc3RyaW5nKGhuYV9zdHIsIGFkZHIpOworCisJLyogb25seSBhbm5vdW5jZSBhcyBtYW55IGhvc3RzIGFzIHBvc3NpYmxlIGluIHRoZSBiYXRtYW4tcGFja2V0IGFuZAorCSAgIHNwYWNlIGluIGJhdG1hbl9wYWNrZXQtPm51bV9obmEgVGhhdCBhbHNvIHNob3VsZCBnaXZlIGEgbGltaXQgdG8KKwkgICBNQUMtZmxvb2RpbmcuICovCisJaWYgKChudW1faG5hICsgMSA+IChFVEhfREFUQV9MRU4gLSBCQVRfUEFDS0VUX0xFTikgLyBFVEhfQUxFTikgfHwKKwkgICAgKG51bV9obmEgKyAxID4gMjU1KSkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfUk9VVEVTLCAiQ2FuJ3QgYWRkIG5ldyBsb2NhbCBobmEgZW50cnkgKCVzKTogbnVtYmVyIG9mIGxvY2FsIGhuYSBlbnRyaWVzIGV4Y2VlZHMgcGFja2V0IHNpemUgXG4iLCBobmFfc3RyKTsKKwkJcmV0dXJuOworCX0KKworCWRlYnVnX2xvZyhMT0dfVFlQRV9ST1VURVMsICJDcmVhdGluZyBuZXcgbG9jYWwgaG5hIGVudHJ5OiAlcyBcbiIsCisJCSAgaG5hX3N0cik7CisKKwlobmFfbG9jYWxfZW50cnkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5KSwgR0ZQX0FUT01JQyk7CisJaWYgKCFobmFfbG9jYWxfZW50cnkpCisJCXJldHVybjsKKworCW1lbWNweShobmFfbG9jYWxfZW50cnktPmFkZHIsIGFkZHIsIEVUSF9BTEVOKTsKKwlobmFfbG9jYWxfZW50cnktPmxhc3Rfc2VlbiA9IGppZmZpZXM7CisKKwkvKiB0aGUgYmF0bWFuIGludGVyZmFjZSBtYWMgYWRkcmVzcyBzaG91bGQgbmV2ZXIgYmUgcHVyZ2VkICovCisJaWYgKGNvbXBhcmVfb3JpZyhhZGRyLCBzb2Z0X2RldmljZS0+ZGV2X2FkZHIpKQorCQlobmFfbG9jYWxfZW50cnktPm5ldmVyX3B1cmdlID0gMTsKKwllbHNlCisJCWhuYV9sb2NhbF9lbnRyeS0+bmV2ZXJfcHVyZ2UgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCWhhc2hfYWRkKGhuYV9sb2NhbF9oYXNoLCBobmFfbG9jYWxfZW50cnkpOworCW51bV9obmErKzsKKwlhdG9taWNfc2V0KCZobmFfbG9jYWxfY2hhbmdlZCwgMSk7CisKKwlpZiAoaG5hX2xvY2FsX2hhc2gtPmVsZW1lbnRzICogNCA+IGhuYV9sb2NhbF9oYXNoLT5zaXplKSB7CisJCXN3YXBoYXNoID0gaGFzaF9yZXNpemUoaG5hX2xvY2FsX2hhc2gsCisJCQkJICAgICAgIGhuYV9sb2NhbF9oYXNoLT5zaXplICogMik7CisKKwkJaWYgKHN3YXBoYXNoID09IE5VTEwpCisJCQlkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwgIkNvdWxkbid0IHJlc2l6ZSBsb2NhbCBobmEgaGFzaCB0YWJsZSBcbiIpOworCQllbHNlCisJCQlobmFfbG9jYWxfaGFzaCA9IHN3YXBoYXNoOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCS8qIHJlbW92ZSBhZGRyZXNzIGZyb20gZ2xvYmFsIGhhc2ggaWYgcHJlc2VudCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZobmFfZ2xvYmFsX2hhc2hfbG9jaywgZmxhZ3MpOworCisJaG5hX2dsb2JhbF9lbnRyeSA9CisJCSgoc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKiloYXNoX2ZpbmQoaG5hX2dsb2JhbF9oYXNoLCBhZGRyKSk7CisKKwlpZiAoaG5hX2dsb2JhbF9lbnRyeSAhPSBOVUxMKQorCQlfaG5hX2dsb2JhbF9kZWxfb3JpZyhobmFfZ2xvYmFsX2VudHJ5LCAibG9jYWwgaG5hIHJlY2VpdmVkIik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfZ2xvYmFsX2hhc2hfbG9jaywgZmxhZ3MpOworfQorCitpbnQgaG5hX2xvY2FsX2ZpbGxfYnVmZmVyKHVuc2lnbmVkIGNoYXIgKmJ1ZmYsIGludCBidWZmX2xlbikKK3sKKwlzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICpobmFfbG9jYWxfZW50cnk7CisJc3RydWN0IGhhc2hfaXRfdCAqaGFzaGl0ID0gTlVMTDsKKwlpbnQgaSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZobmFfbG9jYWxfaGFzaF9sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoTlVMTCAhPSAoaGFzaGl0ID0gaGFzaF9pdGVyYXRlKGhuYV9sb2NhbF9oYXNoLCBoYXNoaXQpKSkgeworCisJCWlmIChidWZmX2xlbiA8IChpICsgMSkgKiBFVEhfQUxFTikKKwkJCWJyZWFrOworCisJCWhuYV9sb2NhbF9lbnRyeSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCQltZW1jcHkoYnVmZiArIChpICogRVRIX0FMRU4pLCBobmFfbG9jYWxfZW50cnktPmFkZHIsIEVUSF9BTEVOKTsKKworCQlpKys7CisJfQorCisJLyogaWYgd2UgZGlkIG5vdCBnZXQgYWxsIG5ldyBsb2NhbCBobmFzIHNlZSB5b3UgbmV4dCB0aW1lICA7LSkgKi8KKwlpZiAoaSA9PSBudW1faG5hKQorCQlhdG9taWNfc2V0KCZobmFfbG9jYWxfY2hhbmdlZCwgMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfbG9jYWxfaGFzaF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gaTsKK30KKworaW50IGhuYV9sb2NhbF9maWxsX2J1ZmZlcl90ZXh0KHVuc2lnbmVkIGNoYXIgKmJ1ZmYsIGludCBidWZmX2xlbikKK3sKKwlzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICpobmFfbG9jYWxfZW50cnk7CisJc3RydWN0IGhhc2hfaXRfdCAqaGFzaGl0ID0gTlVMTDsKKwlpbnQgYnl0ZXNfd3JpdHRlbiA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZobmFfbG9jYWxfaGFzaF9sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoTlVMTCAhPSAoaGFzaGl0ID0gaGFzaF9pdGVyYXRlKGhuYV9sb2NhbF9oYXNoLCBoYXNoaXQpKSkgeworCisJCWlmIChidWZmX2xlbiA8IGJ5dGVzX3dyaXR0ZW4gKyBFVEhfU1RSX0xFTiArIDQpCisJCQlicmVhazsKKworCQlobmFfbG9jYWxfZW50cnkgPSBoYXNoaXQtPmJ1Y2tldC0+ZGF0YTsKKworCQlieXRlc193cml0dGVuICs9IHNucHJpbnRmKGJ1ZmYgKyBieXRlc193cml0dGVuLCBFVEhfU1RSX0xFTiArIDQsCisJCQkJCSAgIiAqICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCQkgIGhuYV9sb2NhbF9lbnRyeS0+YWRkclswXSwKKwkJCQkJICBobmFfbG9jYWxfZW50cnktPmFkZHJbMV0sCisJCQkJCSAgaG5hX2xvY2FsX2VudHJ5LT5hZGRyWzJdLAorCQkJCQkgIGhuYV9sb2NhbF9lbnRyeS0+YWRkclszXSwKKwkJCQkJICBobmFfbG9jYWxfZW50cnktPmFkZHJbNF0sCisJCQkJCSAgaG5hX2xvY2FsX2VudHJ5LT5hZGRyWzVdKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfbG9jYWxfaGFzaF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gYnl0ZXNfd3JpdHRlbjsKK30KKworc3RhdGljIHZvaWQgX2huYV9sb2NhbF9kZWwodm9pZCAqZGF0YSkKK3sKKwlrZnJlZShkYXRhKTsKKwludW1faG5hLS07CisJYXRvbWljX3NldCgmaG5hX2xvY2FsX2NoYW5nZWQsIDEpOworfQorCitzdGF0aWMgdm9pZCBobmFfbG9jYWxfZGVsKHN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeSwKKwkJCSAgY2hhciAqbWVzc2FnZSkKK3sKKwljaGFyIGhuYV9zdHJbRVRIX1NUUl9MRU5dOworCisJYWRkcl90b19zdHJpbmcoaG5hX3N0ciwgaG5hX2xvY2FsX2VudHJ5LT5hZGRyKTsKKwlkZWJ1Z19sb2coTE9HX1RZUEVfUk9VVEVTLCAiRGVsZXRpbmcgbG9jYWwgaG5hIGVudHJ5ICglcyk6ICVzIFxuIiwKKwkJICBobmFfc3RyLCBtZXNzYWdlKTsKKworCWhhc2hfcmVtb3ZlKGhuYV9sb2NhbF9oYXNoLCBobmFfbG9jYWxfZW50cnktPmFkZHIpOworCV9obmFfbG9jYWxfZGVsKGhuYV9sb2NhbF9lbnRyeSk7Cit9CisKK3ZvaWQgaG5hX2xvY2FsX3B1cmdlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICpobmFfbG9jYWxfZW50cnk7CisJc3RydWN0IGhhc2hfaXRfdCAqaGFzaGl0ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZobmFfbG9jYWxfaGFzaF9sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoTlVMTCAhPSAoaGFzaGl0ID0gaGFzaF9pdGVyYXRlKGhuYV9sb2NhbF9oYXNoLCBoYXNoaXQpKSkgeworCQlobmFfbG9jYWxfZW50cnkgPSBoYXNoaXQtPmJ1Y2tldC0+ZGF0YTsKKworCQl0aW1lb3V0ID0gaG5hX2xvY2FsX2VudHJ5LT5sYXN0X3NlZW4gKworCQkJKChMT0NBTF9ITkFfVElNRU9VVCAvIDEwMDApICogSFopOworCQlpZiAoKCFobmFfbG9jYWxfZW50cnktPm5ldmVyX3B1cmdlKSAmJgorCQkgICAgdGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCWhuYV9sb2NhbF9kZWwoaG5hX2xvY2FsX2VudHJ5LCAiYWRkcmVzcyB0aW1lZCBvdXQiKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfbG9jYWxfaGFzaF9sb2NrLCBmbGFncyk7CisJaG5hX2xvY2FsX3N0YXJ0X3RpbWVyKCk7Cit9CisKK3ZvaWQgaG5hX2xvY2FsX2ZyZWUodm9pZCkKK3sKKwlpZiAoIWhuYV9sb2NhbF9oYXNoKQorCQlyZXR1cm47CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmhuYV9sb2NhbF9wdXJnZV93cSk7CisJaGFzaF9kZWxldGUoaG5hX2xvY2FsX2hhc2gsIF9obmFfbG9jYWxfZGVsKTsKKwlobmFfbG9jYWxfaGFzaCA9IE5VTEw7Cit9CisKK2ludCBobmFfZ2xvYmFsX2luaXQodm9pZCkKK3sKKwlpZiAoaG5hX2dsb2JhbF9oYXNoKQorCQlyZXR1cm4gMTsKKworCWhuYV9nbG9iYWxfaGFzaCA9IGhhc2hfbmV3KDEyOCwgY29tcGFyZV9vcmlnLCBjaG9vc2Vfb3JpZyk7CisKKwlpZiAoIWhuYV9nbG9iYWxfaGFzaCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBobmFfZ2xvYmFsX2FkZF9vcmlnKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKKwkJCSB1bnNpZ25lZCBjaGFyICpobmFfYnVmZiwgaW50IGhuYV9idWZmX2xlbikKK3sKKwlzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqaG5hX2dsb2JhbF9lbnRyeTsKKwlzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICpobmFfbG9jYWxfZW50cnk7CisJc3RydWN0IGhhc2h0YWJsZV90ICpzd2FwaGFzaDsKKwljaGFyIGhuYV9zdHJbRVRIX1NUUl9MRU5dLCBvcmlnX3N0cltFVEhfU1RSX0xFTl07CisJaW50IGhuYV9idWZmX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgKmhuYV9wdHI7CisKKwlhZGRyX3RvX3N0cmluZyhvcmlnX3N0ciwgb3JpZ19ub2RlLT5vcmlnKTsKKworCXdoaWxlICgoaG5hX2J1ZmZfY291bnQgKyAxKSAqIEVUSF9BTEVOIDw9IGhuYV9idWZmX2xlbikgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaG5hX2dsb2JhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCQlobmFfcHRyID0gaG5hX2J1ZmYgKyAoaG5hX2J1ZmZfY291bnQgKiBFVEhfQUxFTik7CisJCWhuYV9nbG9iYWxfZW50cnkgPSAoc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKikKKwkJCWhhc2hfZmluZChobmFfZ2xvYmFsX2hhc2gsIGhuYV9wdHIpOworCisJCWlmIChobmFfZ2xvYmFsX2VudHJ5ID09IE5VTEwpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhuYV9nbG9iYWxfaGFzaF9sb2NrLCBmbGFncyk7CisKKwkJCWhuYV9nbG9iYWxfZW50cnkgPQorCQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5KSwKKwkJCQkJR0ZQX0FUT01JQyk7CisKKwkJCWlmICghaG5hX2dsb2JhbF9lbnRyeSkKKwkJCQlicmVhazsKKworCQkJbWVtY3B5KGhuYV9nbG9iYWxfZW50cnktPmFkZHIsIGhuYV9wdHIsIEVUSF9BTEVOKTsKKworCQkJYWRkcl90b19zdHJpbmcoaG5hX3N0ciwgaG5hX2dsb2JhbF9lbnRyeS0+YWRkcik7CisJCQlkZWJ1Z19sb2coTE9HX1RZUEVfUk9VVEVTLCAiQ3JlYXRpbmcgbmV3IGdsb2JhbCBobmEgZW50cnk6ICVzICh2aWEgJXMpXG4iLCBobmFfc3RyLCBvcmlnX3N0cik7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZobmFfZ2xvYmFsX2hhc2hfbG9jaywgZmxhZ3MpOworCQkJaGFzaF9hZGQoaG5hX2dsb2JhbF9oYXNoLCBobmFfZ2xvYmFsX2VudHJ5KTsKKworCQl9CisKKwkJaG5hX2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlID0gb3JpZ19ub2RlOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfZ2xvYmFsX2hhc2hfbG9jaywgZmxhZ3MpOworCisJCS8qIHJlbW92ZSBhZGRyZXNzIGZyb20gbG9jYWwgaGFzaCBpZiBwcmVzZW50ICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZobmFfbG9jYWxfaGFzaF9sb2NrLCBmbGFncyk7CisKKwkJaG5hX3B0ciA9IGhuYV9idWZmICsgKGhuYV9idWZmX2NvdW50ICogRVRIX0FMRU4pOworCQlobmFfbG9jYWxfZW50cnkgPSAoc3RydWN0IGhuYV9sb2NhbF9lbnRyeSAqKQorCQkJaGFzaF9maW5kKGhuYV9sb2NhbF9oYXNoLCBobmFfcHRyKTsKKworCQlpZiAoaG5hX2xvY2FsX2VudHJ5ICE9IE5VTEwpCisJCQlobmFfbG9jYWxfZGVsKGhuYV9sb2NhbF9lbnRyeSwgImdsb2JhbCBobmEgcmVjZWl2ZWQiKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfbG9jYWxfaGFzaF9sb2NrLCBmbGFncyk7CisKKwkJaG5hX2J1ZmZfY291bnQrKzsKKwl9CisKKwlvcmlnX25vZGUtPmhuYV9idWZmX2xlbiA9IGhuYV9idWZmX2xlbjsKKworCWlmIChvcmlnX25vZGUtPmhuYV9idWZmX2xlbiA+IDApIHsKKwkJb3JpZ19ub2RlLT5obmFfYnVmZiA9IGttYWxsb2Mob3JpZ19ub2RlLT5obmFfYnVmZl9sZW4sCisJCQkJCSAgICAgIEdGUF9BVE9NSUMpOworCQltZW1jcHkob3JpZ19ub2RlLT5obmFfYnVmZiwgaG5hX2J1ZmYsIG9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuKTsKKwl9IGVsc2UgeworCQlvcmlnX25vZGUtPmhuYV9idWZmID0gTlVMTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG5hX2dsb2JhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCWlmIChobmFfZ2xvYmFsX2hhc2gtPmVsZW1lbnRzICogNCA+IGhuYV9nbG9iYWxfaGFzaC0+c2l6ZSkgeworCQlzd2FwaGFzaCA9IGhhc2hfcmVzaXplKGhuYV9nbG9iYWxfaGFzaCwKKwkJCQkgICAgICAgaG5hX2dsb2JhbF9oYXNoLT5zaXplICogMik7CisKKwkJaWYgKHN3YXBoYXNoID09IE5VTEwpCisJCQlkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwgIkNvdWxkbid0IHJlc2l6ZSBnbG9iYWwgaG5hIGhhc2ggdGFibGUgXG4iKTsKKwkJZWxzZQorCQkJaG5hX2dsb2JhbF9oYXNoID0gc3dhcGhhc2g7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG5hX2dsb2JhbF9oYXNoX2xvY2ssIGZsYWdzKTsKK30KKworaW50IGhuYV9nbG9iYWxfZmlsbF9idWZmZXJfdGV4dCh1bnNpZ25lZCBjaGFyICpidWZmLCBpbnQgYnVmZl9sZW4pCit7CisJc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKmhuYV9nbG9iYWxfZW50cnk7CisJc3RydWN0IGhhc2hfaXRfdCAqaGFzaGl0ID0gTlVMTDsKKwlpbnQgYnl0ZXNfd3JpdHRlbiA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZobmFfZ2xvYmFsX2hhc2hfbG9jaywgZmxhZ3MpOworCisJd2hpbGUgKE5VTEwgIT0gKGhhc2hpdCA9IGhhc2hfaXRlcmF0ZShobmFfZ2xvYmFsX2hhc2gsIGhhc2hpdCkpKSB7CisJCWlmIChidWZmX2xlbiA8IGJ5dGVzX3dyaXR0ZW4gKyAoMiAqIEVUSF9TVFJfTEVOKSArIDEwKQorCQkJYnJlYWs7CisKKwkJaG5hX2dsb2JhbF9lbnRyeSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCisJCWJ5dGVzX3dyaXR0ZW4gKz0gc25wcmludGYoYnVmZiArIGJ5dGVzX3dyaXR0ZW4sCisJCQkJCSAgKDIgKiBFVEhfU1RSX0xFTikgKyAxMCwKKwkJCQkJICAiICogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggdmlhICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFxuIiwKKwkJCQkJICBobmFfZ2xvYmFsX2VudHJ5LT5hZGRyWzBdLAorCQkJCQkgIGhuYV9nbG9iYWxfZW50cnktPmFkZHJbMV0sCisJCQkJCSAgaG5hX2dsb2JhbF9lbnRyeS0+YWRkclsyXSwKKwkJCQkJICBobmFfZ2xvYmFsX2VudHJ5LT5hZGRyWzNdLAorCQkJCQkgIGhuYV9nbG9iYWxfZW50cnktPmFkZHJbNF0sCisJCQkJCSAgaG5hX2dsb2JhbF9lbnRyeS0+YWRkcls1XSwKKwkJCQkJICBobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUtPm9yaWdbMF0sCisJCQkJCSAgaG5hX2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlLT5vcmlnWzFdLAorCQkJCQkgIGhuYV9nbG9iYWxfZW50cnktPm9yaWdfbm9kZS0+b3JpZ1syXSwKKwkJCQkJICBobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUtPm9yaWdbM10sCisJCQkJCSAgaG5hX2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlLT5vcmlnWzRdLAorCQkJCQkgIGhuYV9nbG9iYWxfZW50cnktPm9yaWdfbm9kZS0+b3JpZ1s1XSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG5hX2dsb2JhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBieXRlc193cml0dGVuOworfQorCit2b2lkIF9obmFfZ2xvYmFsX2RlbF9vcmlnKHN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICpobmFfZ2xvYmFsX2VudHJ5LAorCQkJICBjaGFyICptZXNzYWdlKQoreworCWNoYXIgaG5hX3N0cltFVEhfU1RSX0xFTl0sIG9yaWdfc3RyW0VUSF9TVFJfTEVOXTsKKworCWFkZHJfdG9fc3RyaW5nKG9yaWdfc3RyLCBobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUtPm9yaWcpOworCWFkZHJfdG9fc3RyaW5nKGhuYV9zdHIsIGhuYV9nbG9iYWxfZW50cnktPmFkZHIpOworCisJZGVidWdfbG9nKExPR19UWVBFX1JPVVRFUywgIkRlbGV0aW5nIGdsb2JhbCBobmEgZW50cnkgJXMgKHZpYSAlcyk6ICVzIFxuIiwgaG5hX3N0ciwgb3JpZ19zdHIsIG1lc3NhZ2UpOworCisJaGFzaF9yZW1vdmUoaG5hX2dsb2JhbF9oYXNoLCBobmFfZ2xvYmFsX2VudHJ5LT5hZGRyKTsKKwlrZnJlZShobmFfZ2xvYmFsX2VudHJ5KTsKK30KKwordm9pZCBobmFfZ2xvYmFsX2RlbF9vcmlnKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgY2hhciAqbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqaG5hX2dsb2JhbF9lbnRyeTsKKwlpbnQgaG5hX2J1ZmZfY291bnQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciAqaG5hX3B0cjsKKworCWlmIChvcmlnX25vZGUtPmhuYV9idWZmX2xlbiA9PSAwKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG5hX2dsb2JhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCXdoaWxlICgoaG5hX2J1ZmZfY291bnQgKyAxKSAqIEVUSF9BTEVOIDw9IG9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuKSB7CisJCWhuYV9wdHIgPSBvcmlnX25vZGUtPmhuYV9idWZmICsgKGhuYV9idWZmX2NvdW50ICogRVRIX0FMRU4pOworCQlobmFfZ2xvYmFsX2VudHJ5ID0gKHN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICopCisJCQloYXNoX2ZpbmQoaG5hX2dsb2JhbF9oYXNoLCBobmFfcHRyKTsKKworCQlpZiAoKGhuYV9nbG9iYWxfZW50cnkgIT0gTlVMTCkgJiYKKwkJICAgIChobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUgPT0gb3JpZ19ub2RlKSkKKwkJCV9obmFfZ2xvYmFsX2RlbF9vcmlnKGhuYV9nbG9iYWxfZW50cnksIG1lc3NhZ2UpOworCisJCWhuYV9idWZmX2NvdW50Kys7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG5hX2dsb2JhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCW9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuID0gMDsKKwlrZnJlZShvcmlnX25vZGUtPmhuYV9idWZmKTsKKwlvcmlnX25vZGUtPmhuYV9idWZmID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaG5hX2dsb2JhbF9kZWwodm9pZCAqZGF0YSkKK3sKKwlrZnJlZShkYXRhKTsKK30KKwordm9pZCBobmFfZ2xvYmFsX2ZyZWUodm9pZCkKK3sKKwlpZiAoIWhuYV9nbG9iYWxfaGFzaCkKKwkJcmV0dXJuOworCisJaGFzaF9kZWxldGUoaG5hX2dsb2JhbF9oYXNoLCBobmFfZ2xvYmFsX2RlbCk7CisJaG5hX2dsb2JhbF9oYXNoID0gTlVMTDsKK30KKworc3RydWN0IG9yaWdfbm9kZSAqdHJhbnN0YWJsZV9zZWFyY2godWludDhfdCAqYWRkcikKK3sKKwlzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqaG5hX2dsb2JhbF9lbnRyeTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9nbG9iYWxfaGFzaF9sb2NrLCBmbGFncyk7CisJaG5hX2dsb2JhbF9lbnRyeSA9IChzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqKQorCQloYXNoX2ZpbmQoaG5hX2dsb2JhbF9oYXNoLCBhZGRyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfZ2xvYmFsX2hhc2hfbG9jaywgZmxhZ3MpOworCisJaWYgKGhuYV9nbG9iYWxfZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gaG5hX2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkYTgxMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJ0eXBlcy5oIgorCitpbnQgaG5hX2xvY2FsX2luaXQodm9pZCk7Cit2b2lkIGhuYV9sb2NhbF9hZGQodWludDhfdCAqYWRkcik7CitpbnQgaG5hX2xvY2FsX2ZpbGxfYnVmZmVyKHVuc2lnbmVkIGNoYXIgKmJ1ZmYsIGludCBidWZmX2xlbik7CitpbnQgaG5hX2xvY2FsX2ZpbGxfYnVmZmVyX3RleHQodW5zaWduZWQgY2hhciAqYnVmZiwgaW50IGJ1ZmZfbGVuKTsKK3ZvaWQgaG5hX2xvY2FsX3B1cmdlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Cit2b2lkIGhuYV9sb2NhbF9mcmVlKHZvaWQpOworaW50IGhuYV9nbG9iYWxfaW5pdCh2b2lkKTsKK3ZvaWQgaG5hX2dsb2JhbF9hZGRfb3JpZyhzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsIHVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLAorCQkJIGludCBobmFfYnVmZl9sZW4pOworaW50IGhuYV9nbG9iYWxfZmlsbF9idWZmZXJfdGV4dCh1bnNpZ25lZCBjaGFyICpidWZmLCBpbnQgYnVmZl9sZW4pOwordm9pZCBfaG5hX2dsb2JhbF9kZWxfb3JpZyhzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqaG5hX2dsb2JhbF9lbnRyeSwKKwkJCSAgY2hhciAqb3JpZ19zdHIpOwordm9pZCBobmFfZ2xvYmFsX2RlbF9vcmlnKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgY2hhciAqbWVzc2FnZSk7Cit2b2lkIGhuYV9nbG9iYWxfZnJlZSh2b2lkKTsKK3N0cnVjdCBvcmlnX25vZGUgKnRyYW5zdGFibGVfc2VhcmNoKHVpbnQ4X3QgKmFkZHIpOworCitleHRlcm4gc3BpbmxvY2tfdCBobmFfbG9jYWxfaGFzaF9sb2NrOworZXh0ZXJuIHN0cnVjdCBoYXNodGFibGVfdCAqaG5hX2xvY2FsX2hhc2g7CitleHRlcm4gYXRvbWljX3QgaG5hX2xvY2FsX2NoYW5nZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTBlZjBjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHlwZXMuaApAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKworCisKKworI2lmbmRlZiBUWVBFU19ICisjZGVmaW5lIFRZUEVTX0gKKworI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgImJpdGFycmF5LmgiCisKKyNkZWZpbmUgQkFUX0hFQURFUl9MRU4gKHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArICgoc2l6ZW9mKHN0cnVjdCB1bmljYXN0X3BhY2tldCkgPiBzaXplb2Yoc3RydWN0IGJjYXN0X3BhY2tldCkgPyBzaXplb2Yoc3RydWN0IHVuaWNhc3RfcGFja2V0KSA6IHNpemVvZihzdHJ1Y3QgYmNhc3RfcGFja2V0KSkpKQorCisKK3N0cnVjdCBiYXRtYW5faWYgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlpbnQxNl90IGlmX251bTsKKwljaGFyICpkZXY7CisJY2hhciBpZl9hY3RpdmU7CisJY2hhciBhZGRyX3N0cltFVEhfU1RSX0xFTl07CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisJc3RydWN0IHNvY2tldCAqcmF3X3NvY2s7CisJYXRvbWljX3Qgc2Vxbm87CisJdW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmY7CisJaW50IHBhY2tldF9sZW47CisJc3RydWN0IHJjdV9oZWFkIHJjdTsKKworfTsKKworc3RydWN0IG9yaWdfbm9kZSB7ICAgICAgICAgICAgICAgLyogc3RydWN0dXJlIGZvciBvcmlnX2xpc3QgbWFpbnRhaW5pbmcgbm9kZXMgb2YgbWVzaCAqLworCXVpbnQ4X3Qgb3JpZ1tFVEhfQUxFTl07CisJc3RydWN0IG5laWdoX25vZGUgKnJvdXRlcjsKKwlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7CisJVFlQRV9PRl9XT1JEICpiY2FzdF9vd247CisJdWludDhfdCAqYmNhc3Rfb3duX3N1bTsKKwl1aW50OF90IHRxX293bjsKKwlpbnQgdHFfYXN5bV9wZW5hbHR5OworCXVuc2lnbmVkIGxvbmcgbGFzdF92YWxpZDsgICAgICAgIC8qIHdoZW4gbGFzdCBwYWNrZXQgZnJvbSB0aGlzIG5vZGUgd2FzIHJlY2VpdmVkICovCisvKgl1aW50OF90ICBnd2ZsYWdzOyAgICAgICogZmxhZ3MgcmVsYXRlZCB0byBnYXRld2F5IGZ1bmN0aW9uczogZ2F0ZXdheSBjbGFzcyAqLworCXVpbnQ4X3QgIGZsYWdzOyAgICAJCS8qIGZvciBub3cgb25seSBWSVNfU0VSVkVSIGZsYWcuICovCisJdW5zaWduZWQgY2hhciAqaG5hX2J1ZmY7CisJaW50MTZfdCAgaG5hX2J1ZmZfbGVuOworCXVpbnQxNl90IGxhc3RfcmVhbF9zZXFubzsgICAvKiBsYXN0IGFuZCBiZXN0IGtub3duIHNxdWVuY2UgbnVtYmVyICovCisJdWludDhfdCBsYXN0X3R0bDsgICAgICAgICAvKiB0dGwgb2YgbGFzdCByZWNlaXZlZCBwYWNrZXQgKi8KKwlUWVBFX09GX1dPUkQgYmNhc3RfYml0c1tOVU1fV09SRFNdOworCXVpbnQxNl90IGxhc3RfYmNhc3Rfc2Vxbm87ICAvKiBsYXN0IGJyb2FkY2FzdCBzZXF1ZW5jZSBudW1iZXIgcmVjZWl2ZWQgYnkgdGhpcyBob3N0ICovCisJc3RydWN0IGxpc3RfaGVhZCBuZWlnaF9saXN0OworfTsKKworc3RydWN0IG5laWdoX25vZGUgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1aW50OF90IGFkZHJbRVRIX0FMRU5dOworCXVpbnQ4X3QgcmVhbF9wYWNrZXRfY291bnQ7CisJdWludDhfdCB0cV9yZWN2W1RRX0dMT0JBTF9XSU5ET1dfU0laRV07CisJdWludDhfdCB0cV9pbmRleDsKKwl1aW50OF90IHRxX2F2ZzsKKwl1aW50OF90IGxhc3RfdHRsOworCXVuc2lnbmVkIGxvbmcgbGFzdF92YWxpZDsgICAgICAgICAgICAvKiB3aGVuIGxhc3QgcGFja2V0IHZpYSB0aGlzIG5laWdoYm91ciB3YXMgcmVjZWl2ZWQgKi8KKwlUWVBFX09GX1dPUkQgcmVhbF9iaXRzW05VTV9XT1JEU107CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOworCXN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nOworfTsKKworc3RydWN0IGJhdF9wcml2IHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKK307CisKK3N0cnVjdCBkZXZpY2VfY2xpZW50IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlX2xpc3Q7CisJdW5zaWduZWQgaW50IHF1ZXVlX2xlbjsKKwl1bnNpZ25lZCBjaGFyIGluZGV4OworCXNwaW5sb2NrX3QgbG9jazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZV93YWl0OworfTsKKworc3RydWN0IGRldmljZV9wYWNrZXQgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgaWNtcF9wYWNrZXQgaWNtcF9wYWNrZXQ7Cit9OworCitzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5IHsKKwl1aW50OF90IGFkZHJbRVRIX0FMRU5dOworCXVuc2lnbmVkIGxvbmcgbGFzdF9zZWVuOworCWNoYXIgbmV2ZXJfcHVyZ2U7Cit9OworCitzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSB7CisJdWludDhfdCBhZGRyW0VUSF9BTEVOXTsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Cit9OworCitzdHJ1Y3QgZm9yd19wYWNrZXQgeyAgICAgICAgICAgICAgIC8qIHN0cnVjdHVyZSBmb3IgZm9yd19saXN0IG1haW50YWluaW5nIHBhY2tldHMgdG8gYmUgc2VuZC9mb3J3YXJkZWQgKi8KKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBsaXN0OworCXVuc2lnbmVkIGxvbmcgc2VuZF90aW1lOworCXVpbnQ4X3Qgb3duOworCXVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmOworCXVpbnQxNl90IHBhY2tldF9sZW47CisJdWludDMyX3QgZGlyZWN0X2xpbmtfZmxhZ3M7CisJdWludDhfdCBudW1fcGFja2V0czsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGRlbGF5ZWRfd29yazsKKwlzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdmlzLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi92aXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmM5YWNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdmlzLmMKQEAgLTAsMCArMSw1NjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIFNpbW9uIFd1bmRlcmxpY2gKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgInNlbmQuaCIKKyNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgorI2luY2x1ZGUgInZpcy5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInNvZnQtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisKK3N0cnVjdCBoYXNodGFibGVfdCAqdmlzX2hhc2g7CitERUZJTkVfU1BJTkxPQ0sodmlzX2hhc2hfbG9jayk7CitzdGF0aWMgc3RydWN0IHZpc19pbmZvICpteV92aXNfaW5mbzsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHNlbmRfbGlzdDsJLyogYWx3YXlzIGxvY2tlZCB3aXRoIHZpc19oYXNoX2xvY2sgKi8KKworc3RhdGljIHZvaWQgc3RhcnRfdmlzX3RpbWVyKHZvaWQpOworCisvKiBmcmVlIHRoZSBpbmZvICovCitzdGF0aWMgdm9pZCBmcmVlX2luZm8odm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdmlzX2luZm8gKmluZm8gPSBkYXRhOworCXN0cnVjdCByZWN2bGlzdF9ub2RlICplbnRyeSwgKnRtcDsKKworCWxpc3RfZGVsX2luaXQoJmluZm8tPnNlbmRfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCB0bXAsICZpbmZvLT5yZWN2X2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKKwkJa2ZyZWUoZW50cnkpOworCX0KKwlrZnJlZShpbmZvKTsKK30KKworLyogc2V0IHRoZSBtb2RlIG9mIHRoZSB2aXN1YWxpemF0aW9uIHRvIGNsaWVudCBvciBzZXJ2ZXIgKi8KK3ZvaWQgdmlzX3NldF9tb2RlKGludCBtb2RlKQoreworCXNwaW5fbG9jaygmdmlzX2hhc2hfbG9jayk7CisKKwlpZiAobXlfdmlzX2luZm8gIT0gTlVMTCkKKwkJbXlfdmlzX2luZm8tPnBhY2tldC52aXNfdHlwZSA9IG1vZGU7CisKKwlzcGluX3VubG9jaygmdmlzX2hhc2hfbG9jayk7Cit9CisKKy8qIGlzX3Zpc19zZXJ2ZXIoKSwgbG9ja2VkIG91dHNpZGUgKi8KK3N0YXRpYyBpbnQgaXNfdmlzX3NlcnZlcl9sb2NrZWQodm9pZCkKK3sKKwlpZiAobXlfdmlzX2luZm8gIT0gTlVMTCkKKwkJaWYgKG15X3Zpc19pbmZvLT5wYWNrZXQudmlzX3R5cGUgPT0gVklTX1RZUEVfU0VSVkVSX1NZTkMpCisJCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKiBnZXQgdGhlIGN1cnJlbnQgc2V0IG1vZGUgKi8KK2ludCBpc192aXNfc2VydmVyKHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2soJnZpc19oYXNoX2xvY2spOworCXJldCA9IGlzX3Zpc19zZXJ2ZXJfbG9ja2VkKCk7CisJc3Bpbl91bmxvY2soJnZpc19oYXNoX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyogQ29tcGFyZSB0d28gdmlzIHBhY2tldHMsIHVzZWQgYnkgdGhlIGhhc2hpbmcgYWxnb3JpdGhtICovCitzdGF0aWMgaW50IHZpc19pbmZvX2NtcCh2b2lkICpkYXRhMSwgdm9pZCAqZGF0YTIpCit7CisJc3RydWN0IHZpc19pbmZvICpkMSwgKmQyOworCWQxID0gZGF0YTE7CisJZDIgPSBkYXRhMjsKKwlyZXR1cm4gY29tcGFyZV9vcmlnKGQxLT5wYWNrZXQudmlzX29yaWcsIGQyLT5wYWNrZXQudmlzX29yaWcpOworfQorCisvKiBoYXNoIGZ1bmN0aW9uIHRvIGNob29zZSBhbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUgb2YgZ2l2ZW4gc2l6ZSAqLworLyogaGFzaCBhbGdvcml0aG0gZnJvbSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hhc2hfdGFibGUgKi8KK3N0YXRpYyBpbnQgdmlzX2luZm9fY2hvb3NlKHZvaWQgKmRhdGEsIGludCBzaXplKQoreworCXN0cnVjdCB2aXNfaW5mbyAqdmlzX2luZm8gPSBkYXRhOworCXVuc2lnbmVkIGNoYXIgKmtleTsKKwl1aW50MzJfdCBoYXNoID0gMDsKKwlzaXplX3QgaTsKKworCWtleSA9IHZpc19pbmZvLT5wYWNrZXQudmlzX29yaWc7CisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKwkJaGFzaCArPSBrZXlbaV07CisJCWhhc2ggKz0gKGhhc2ggPDwgMTApOworCQloYXNoIF49IChoYXNoID4+IDYpOworCX0KKworCWhhc2ggKz0gKGhhc2ggPDwgMyk7CisJaGFzaCBePSAoaGFzaCA+PiAxMSk7CisJaGFzaCArPSAoaGFzaCA8PCAxNSk7CisKKwlyZXR1cm4gaGFzaCAlIHNpemU7Cit9CisKKy8qIHRyaWVzIHRvIGFkZCBvbmUgZW50cnkgdG8gdGhlIHJlY2VpdmUgbGlzdC4gKi8KK3N0YXRpYyB2b2lkIHJlY3ZfbGlzdF9hZGQoc3RydWN0IGxpc3RfaGVhZCAqcmVjdl9saXN0LCBjaGFyICptYWMpCit7CisJc3RydWN0IHJlY3ZsaXN0X25vZGUgKmVudHJ5OworCWVudHJ5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJlY3ZsaXN0X25vZGUpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWVudHJ5KQorCQlyZXR1cm47CisKKwltZW1jcHkoZW50cnktPm1hYywgbWFjLCBFVEhfQUxFTik7CisJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsIHJlY3ZfbGlzdCk7Cit9CisKKy8qIHJldHVybnMgMSBpZiB0aGlzIG1hYyBpcyBpbiB0aGUgcmVjdl9saXN0ICovCitzdGF0aWMgaW50IHJlY3ZfbGlzdF9pc19pbihzdHJ1Y3QgbGlzdF9oZWFkICpyZWN2X2xpc3QsIGNoYXIgKm1hYykKK3sKKwlzdHJ1Y3QgcmVjdmxpc3Rfbm9kZSAqZW50cnk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCByZWN2X2xpc3QsIGxpc3QpIHsKKwkJaWYgKG1lbWNtcChlbnRyeS0+bWFjLCBtYWMsIEVUSF9BTEVOKSA9PSAwKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHRyeSB0byBhZGQgdGhlIHBhY2tldCB0byB0aGUgdmlzX2hhc2guIHJldHVybiBOVUxMIGlmIGludmFsaWQgKGUuZy4gdG9vIG9sZCwKKyAqIGJyb2tlbi4uICkuICB2aXMgaGFzaCBtdXN0IGJlIGxvY2tlZCBvdXRzaWRlLiAgaXNfbmV3IGlzIHNldCB3aGVuIHRoZSBwYWNrZXQKKyAqIGlzIG5ld2VyIHRoYW4gb2xkIGVudHJpZXMgaW4gdGhlIGhhc2guICovCitzdGF0aWMgc3RydWN0IHZpc19pbmZvICphZGRfcGFja2V0KHN0cnVjdCB2aXNfcGFja2V0ICp2aXNfcGFja2V0LAorCQkJCSAgIGludCB2aXNfaW5mb19sZW4sIGludCAqaXNfbmV3KQoreworCXN0cnVjdCB2aXNfaW5mbyAqaW5mbywgKm9sZF9pbmZvOworCXN0cnVjdCB2aXNfaW5mbyBzZWFyY2hfZWxlbTsKKworCSppc19uZXcgPSAwOworCS8qIHNhbml0eSBjaGVjayAqLworCWlmICh2aXNfaGFzaCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIHNlZSBpZiB0aGUgcGFja2V0IGlzIGFscmVhZHkgaW4gdmlzX2hhc2ggKi8KKwltZW1jcHkoc2VhcmNoX2VsZW0ucGFja2V0LnZpc19vcmlnLCB2aXNfcGFja2V0LT52aXNfb3JpZywgRVRIX0FMRU4pOworCW9sZF9pbmZvID0gaGFzaF9maW5kKHZpc19oYXNoLCAmc2VhcmNoX2VsZW0pOworCisJaWYgKG9sZF9pbmZvICE9IE5VTEwpIHsKKwkJaWYgKHZpc19wYWNrZXQtPnNlcW5vIC0gb2xkX2luZm8tPnBhY2tldC5zZXFubyA8PSAwKSB7CisJCQlpZiAob2xkX2luZm8tPnBhY2tldC5zZXFubyA9PSB2aXNfcGFja2V0LT5zZXFubykgeworCQkJCXJlY3ZfbGlzdF9hZGQoJm9sZF9pbmZvLT5yZWN2X2xpc3QsCisJCQkJCSAgICAgIHZpc19wYWNrZXQtPnNlbmRlcl9vcmlnKTsKKwkJCQlyZXR1cm4gb2xkX2luZm87CisJCQl9IGVsc2UgeworCQkJCS8qIG5ld2VyIHBhY2tldCBpcyBhbHJlYWR5IGluIGhhc2guICovCisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwkJLyogcmVtb3ZlIG9sZCBlbnRyeSAqLworCQloYXNoX3JlbW92ZSh2aXNfaGFzaCwgb2xkX2luZm8pOworCQlmcmVlX2luZm8ob2xkX2luZm8pOworCX0KKworCWluZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmlzX2luZm8pICsgdmlzX2luZm9fbGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCUlOSVRfTElTVF9IRUFEKCZpbmZvLT5zZW5kX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZpbmZvLT5yZWN2X2xpc3QpOworCWluZm8tPmZpcnN0X3NlZW4gPSBqaWZmaWVzOworCW1lbWNweSgmaW5mby0+cGFja2V0LCB2aXNfcGFja2V0LAorCSAgICAgICBzaXplb2Yoc3RydWN0IHZpc19wYWNrZXQpICsgdmlzX2luZm9fbGVuKTsKKworCS8qIGluaXRpYWxpemUgYW5kIGFkZCBuZXcgcGFja2V0LiAqLworCSppc19uZXcgPSAxOworCisJLyogcmVwYWlyIGlmIGVudHJpZXMgaXMgbG9uZ2VyIHRoYW4gcGFja2V0LiAqLworCWlmIChpbmZvLT5wYWNrZXQuZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgdmlzX2luZm9fZW50cnkpID4gdmlzX2luZm9fbGVuKQorCQlpbmZvLT5wYWNrZXQuZW50cmllcyA9IHZpc19pbmZvX2xlbiAvIHNpemVvZihzdHJ1Y3QgdmlzX2luZm9fZW50cnkpOworCisJcmVjdl9saXN0X2FkZCgmaW5mby0+cmVjdl9saXN0LCBpbmZvLT5wYWNrZXQuc2VuZGVyX29yaWcpOworCisJLyogdHJ5IHRvIGFkZCBpdCAqLworCWlmIChoYXNoX2FkZCh2aXNfaGFzaCwgaW5mbykgPCAwKSB7CisJCS8qIGRpZCBub3Qgd29yayAoZm9yIHNvbWUgcmVhc29uKSAqLworCQlmcmVlX2luZm8oaW5mbyk7CisJCWluZm8gPSBOVUxMOworCX0KKworCXJldHVybiBpbmZvOworfQorCisvKiBoYW5kbGUgdGhlIHNlcnZlciBzeW5jIHBhY2tldCwgZm9yd2FyZCBpZiBuZWVkZWQuICovCit2b2lkIHJlY2VpdmVfc2VydmVyX3N5bmNfcGFja2V0KHN0cnVjdCB2aXNfcGFja2V0ICp2aXNfcGFja2V0LCBpbnQgdmlzX2luZm9fbGVuKQoreworCXN0cnVjdCB2aXNfaW5mbyAqaW5mbzsKKwlpbnQgaXNfbmV3OworCisJc3Bpbl9sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKKwlpbmZvID0gYWRkX3BhY2tldCh2aXNfcGFja2V0LCB2aXNfaW5mb19sZW4sICZpc19uZXcpOworCWlmIChpbmZvID09IE5VTEwpCisJCWdvdG8gZW5kOworCisJLyogb25seSBpZiB3ZSBhcmUgc2VydmVyIG91cnNlbHZlcyBhbmQgcGFja2V0IGlzIG5ld2VyIHRoYW4gdGhlIG9uZSBpbgorCSAqIGhhc2guKi8KKwlpZiAoaXNfdmlzX3NlcnZlcl9sb2NrZWQoKSAmJiBpc19uZXcpIHsKKwkJbWVtY3B5KGluZm8tPnBhY2tldC50YXJnZXRfb3JpZywgYnJvYWRjYXN0QWRkciwgRVRIX0FMRU4pOworCQlpZiAobGlzdF9lbXB0eSgmaW5mby0+c2VuZF9saXN0KSkKKwkJCWxpc3RfYWRkX3RhaWwoJmluZm8tPnNlbmRfbGlzdCwgJnNlbmRfbGlzdCk7CisJfQorZW5kOgorCXNwaW5fdW5sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKK30KKworLyogaGFuZGxlIGFuIGluY29taW5nIGNsaWVudCB1cGRhdGUgcGFja2V0IGFuZCBzY2hlZHVsZSBmb3J3YXJkIGlmIG5lZWRlZC4gKi8KK3ZvaWQgcmVjZWl2ZV9jbGllbnRfdXBkYXRlX3BhY2tldChzdHJ1Y3QgdmlzX3BhY2tldCAqdmlzX3BhY2tldCwKKwkJCQkgIGludCB2aXNfaW5mb19sZW4pCit7CisJc3RydWN0IHZpc19pbmZvICppbmZvOworCWludCBpc19uZXc7CisKKwkvKiBjbGllbnRzIHNoYWxsIG5vdCBicm9hZGNhc3QuICovCisJaWYgKGlzX2JjYXN0KHZpc19wYWNrZXQtPnRhcmdldF9vcmlnKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKKwlpbmZvID0gYWRkX3BhY2tldCh2aXNfcGFja2V0LCB2aXNfaW5mb19sZW4sICZpc19uZXcpOworCWlmIChpbmZvID09IE5VTEwpCisJCWdvdG8gZW5kOworCS8qIG5vdGUgdGhhdCBvdXRkYXRlZCBwYWNrZXRzIHdpbGwgYmUgZHJvcHBlZCBhdCB0aGlzIHBvaW50LiAqLworCisKKwkvKiBzZW5kIG9ubHkgaWYgd2UncmUgdGhlIHRhcmdldCBzZXJ2ZXIgb3IgLi4uICovCisJaWYgKGlzX3Zpc19zZXJ2ZXJfbG9ja2VkKCkgJiYKKwkgICAgaXNfbXlfbWFjKGluZm8tPnBhY2tldC50YXJnZXRfb3JpZykgJiYKKwkgICAgaXNfbmV3KSB7CisJCWluZm8tPnBhY2tldC52aXNfdHlwZSA9IFZJU19UWVBFX1NFUlZFUl9TWU5DOwkvKiB1cGdyYWRlISAqLworCQltZW1jcHkoaW5mby0+cGFja2V0LnRhcmdldF9vcmlnLCBicm9hZGNhc3RBZGRyLCBFVEhfQUxFTik7CisJCWlmIChsaXN0X2VtcHR5KCZpbmZvLT5zZW5kX2xpc3QpKQorCQkJbGlzdF9hZGRfdGFpbCgmaW5mby0+c2VuZF9saXN0LCAmc2VuZF9saXN0KTsKKworCQkvKiAuLi4gd2UncmUgbm90IHRoZSByZWNpcGllbnQgKGFuZCB0aHVzIG5lZWQgdG8gZm9yd2FyZCkuICovCisJfSBlbHNlIGlmICghaXNfbXlfbWFjKGluZm8tPnBhY2tldC50YXJnZXRfb3JpZykpIHsKKwkJaWYgKGxpc3RfZW1wdHkoJmluZm8tPnNlbmRfbGlzdCkpCisJCQlsaXN0X2FkZF90YWlsKCZpbmZvLT5zZW5kX2xpc3QsICZzZW5kX2xpc3QpOworCX0KK2VuZDoKKwlzcGluX3VubG9jaygmdmlzX2hhc2hfbG9jayk7Cit9CisKKy8qIFdhbGsgdGhlIG9yaWdpbmF0b3JzIGFuZCBmaW5kIHRoZSBWSVMgc2VydmVyIHdpdGggdGhlIGJlc3QgdHEuIFNldCB0aGUgcGFja2V0CisgKiBhZGRyZXNzIHRvIGl0cyBhZGRyZXNzIGFuZCByZXR1cm4gdGhlIGJlc3RfdHEuCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgb3JpZ2luYXRvciBoYXNoIGxvY2tlZCAqLworc3RhdGljIGludCBmaW5kX2Jlc3RfdmlzX3NlcnZlcihzdHJ1Y3QgdmlzX2luZm8gKmluZm8pCit7CisJc3RydWN0IGhhc2hfaXRfdCAqaGFzaGl0ID0gTlVMTDsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CisJaW50IGJlc3RfdHEgPSAtMTsKKworCXdoaWxlIChOVUxMICE9IChoYXNoaXQgPSBoYXNoX2l0ZXJhdGUob3JpZ19oYXNoLCBoYXNoaXQpKSkgeworCQlvcmlnX25vZGUgPSBoYXNoaXQtPmJ1Y2tldC0+ZGF0YTsKKwkJaWYgKChvcmlnX25vZGUgIT0gTlVMTCkgJiYKKwkJICAgIChvcmlnX25vZGUtPnJvdXRlciAhPSBOVUxMKSAmJgorCQkgICAgKG9yaWdfbm9kZS0+ZmxhZ3MgJiBWSVNfU0VSVkVSKSAmJgorCQkgICAgKG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmcgPiBiZXN0X3RxKSkgeworCQkJYmVzdF90cSA9IG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmc7CisJCQltZW1jcHkoaW5mby0+cGFja2V0LnRhcmdldF9vcmlnLCBvcmlnX25vZGUtPm9yaWcsCisJCQkgICAgICAgRVRIX0FMRU4pOworCQl9CisJfQorCXJldHVybiBiZXN0X3RxOworfQorCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmlzIHBhY2tldCBpcyBmdWxsLiAqLworc3RhdGljIGJvb2wgdmlzX3BhY2tldF9mdWxsKHN0cnVjdCB2aXNfaW5mbyAqaW5mbykKK3sKKwlpZiAoaW5mby0+cGFja2V0LmVudHJpZXMgKyAxID4KKwkgICAgKDEwMDAgLSBzaXplb2Yoc3RydWN0IHZpc19pbmZvKSkgLyBzaXplb2Yoc3RydWN0IHZpc19pbmZvX2VudHJ5KSkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCisvKiBnZW5lcmF0ZXMgYSBwYWNrZXQgb2Ygb3duIHZpcyBkYXRhLAorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIGlmIG5vIHBhY2tldCBjb3VsZCBiZSBnZW5lcmF0ZWQgKi8KK3N0YXRpYyBpbnQgZ2VuZXJhdGVfdmlzX3BhY2tldCh2b2lkKQoreworCXN0cnVjdCBoYXNoX2l0X3QgKmhhc2hpdCA9IE5VTEw7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOworCXN0cnVjdCB2aXNfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgdmlzX2luZm8gKilteV92aXNfaW5mbzsKKwlzdHJ1Y3QgdmlzX2luZm9fZW50cnkgKmVudHJ5LCAqZW50cnlfYXJyYXk7CisJc3RydWN0IGhuYV9sb2NhbF9lbnRyeSAqaG5hX2xvY2FsX2VudHJ5OworCWludCBiZXN0X3RxID0gLTE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWluZm8tPmZpcnN0X3NlZW4gPSBqaWZmaWVzOworCisJc3Bpbl9sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJbWVtY3B5KGluZm8tPnBhY2tldC50YXJnZXRfb3JpZywgYnJvYWRjYXN0QWRkciwgRVRIX0FMRU4pOworCWluZm8tPnBhY2tldC50dGwgPSBUVEw7CisJaW5mby0+cGFja2V0LnNlcW5vKys7CisJaW5mby0+cGFja2V0LmVudHJpZXMgPSAwOworCisJaWYgKCFpc192aXNfc2VydmVyX2xvY2tlZCgpKSB7CisJCWJlc3RfdHEgPSBmaW5kX2Jlc3RfdmlzX3NlcnZlcihpbmZvKTsKKwkJaWYgKGJlc3RfdHEgPCAwKSB7CisJCQlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCWhhc2hpdCA9IE5VTEw7CisKKwllbnRyeV9hcnJheSA9IChzdHJ1Y3QgdmlzX2luZm9fZW50cnkgKikKKwkJKChjaGFyICopaW5mbyArIHNpemVvZihzdHJ1Y3QgdmlzX2luZm8pKTsKKworCXdoaWxlIChOVUxMICE9IChoYXNoaXQgPSBoYXNoX2l0ZXJhdGUob3JpZ19oYXNoLCBoYXNoaXQpKSkgeworCQlvcmlnX25vZGUgPSBoYXNoaXQtPmJ1Y2tldC0+ZGF0YTsKKwkJaWYgKG9yaWdfbm9kZS0+cm91dGVyICE9IE5VTEwKKwkJCSYmIGNvbXBhcmVfb3JpZyhvcmlnX25vZGUtPnJvdXRlci0+YWRkciwgb3JpZ19ub2RlLT5vcmlnKQorCQkJJiYgb3JpZ19ub2RlLT5iYXRtYW5faWYKKwkJCSYmIChvcmlnX25vZGUtPmJhdG1hbl9pZi0+aWZfYWN0aXZlID09IElGX0FDVElWRSkKKwkJICAgICYmIG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmcgPiAwKSB7CisKKwkJCS8qIGZpbGwgb25lIGVudHJ5IGludG8gYnVmZmVyLiAqLworCQkJZW50cnkgPSAmZW50cnlfYXJyYXlbaW5mby0+cGFja2V0LmVudHJpZXNdOworCQkJbWVtY3B5KGVudHJ5LT5zcmMsIG9yaWdfbm9kZS0+YmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCQkJbWVtY3B5KGVudHJ5LT5kZXN0LCBvcmlnX25vZGUtPm9yaWcsIEVUSF9BTEVOKTsKKwkJCWVudHJ5LT5xdWFsaXR5ID0gb3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZzsKKwkJCWluZm8tPnBhY2tldC5lbnRyaWVzKys7CisKKwkJCWlmICh2aXNfcGFja2V0X2Z1bGwoaW5mbykpIHsKKwkJCQlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCisJc3Bpbl91bmxvY2soJm9yaWdfaGFzaF9sb2NrKTsKKworCWhhc2hpdCA9IE5VTEw7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKwl3aGlsZSAoTlVMTCAhPSAoaGFzaGl0ID0gaGFzaF9pdGVyYXRlKGhuYV9sb2NhbF9oYXNoLCBoYXNoaXQpKSkgeworCQlobmFfbG9jYWxfZW50cnkgPSBoYXNoaXQtPmJ1Y2tldC0+ZGF0YTsKKwkJZW50cnkgPSAmZW50cnlfYXJyYXlbaW5mby0+cGFja2V0LmVudHJpZXNdOworCQltZW1zZXQoZW50cnktPnNyYywgMCwgRVRIX0FMRU4pOworCQltZW1jcHkoZW50cnktPmRlc3QsIGhuYV9sb2NhbF9lbnRyeS0+YWRkciwgRVRIX0FMRU4pOworCQllbnRyeS0+cXVhbGl0eSA9IDA7IC8qIDAgbWVhbnMgSE5BICovCisJCWluZm8tPnBhY2tldC5lbnRyaWVzKys7CisKKwkJaWYgKHZpc19wYWNrZXRfZnVsbChpbmZvKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG5hX2xvY2FsX2hhc2hfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG5hX2xvY2FsX2hhc2hfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwdXJnZV92aXNfcGFja2V0cyh2b2lkKQoreworCXN0cnVjdCBoYXNoX2l0X3QgKmhhc2hpdCA9IE5VTEw7CisJc3RydWN0IHZpc19pbmZvICppbmZvOworCisJd2hpbGUgKE5VTEwgIT0gKGhhc2hpdCA9IGhhc2hfaXRlcmF0ZSh2aXNfaGFzaCwgaGFzaGl0KSkpIHsKKwkJaW5mbyA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCQlpZiAoaW5mbyA9PSBteV92aXNfaW5mbykJLyogbmV2ZXIgcHVyZ2Ugb3duIGRhdGEuICovCisJCQljb250aW51ZTsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywKKwkJCSAgICAgICBpbmZvLT5maXJzdF9zZWVuICsgKFZJU19USU1FT1VULzEwMDApKkhaKSkgeworCQkJaGFzaF9yZW1vdmVfYnVja2V0KHZpc19oYXNoLCBoYXNoaXQpOworCQkJZnJlZV9pbmZvKGluZm8pOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBicm9hZGNhc3RfdmlzX3BhY2tldChzdHJ1Y3QgdmlzX2luZm8gKmluZm8sIGludCBwYWNrZXRfbGVuZ3RoKQoreworCXN0cnVjdCBoYXNoX2l0X3QgKmhhc2hpdCA9IE5VTEw7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOworCisJc3Bpbl9sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisKKwkvKiBzZW5kIHRvIGFsbCByb3V0ZXJzIGluIHJhbmdlLiAqLworCXdoaWxlIChOVUxMICE9IChoYXNoaXQgPSBoYXNoX2l0ZXJhdGUob3JpZ19oYXNoLCBoYXNoaXQpKSkgeworCQlvcmlnX25vZGUgPSBoYXNoaXQtPmJ1Y2tldC0+ZGF0YTsKKworCQkvKiBpZiBpdCdzIGEgdmlzIHNlcnZlciBhbmQgcmVhY2hhYmxlLCBzZW5kIGl0LiAqLworCQlpZiAob3JpZ19ub2RlICYmCisJCSAgICAob3JpZ19ub2RlLT5mbGFncyAmIFZJU19TRVJWRVIpICYmCisJCSAgICBvcmlnX25vZGUtPmJhdG1hbl9pZiAmJgorCQkgICAgb3JpZ19ub2RlLT5yb3V0ZXIpIHsKKworCQkJLyogZG9uJ3Qgc2VuZCBpdCBpZiB3ZSBhbHJlYWR5IHJlY2VpdmVkIHRoZSBwYWNrZXQgZnJvbQorCQkJICogdGhpcyBub2RlLiAqLworCQkJaWYgKHJlY3ZfbGlzdF9pc19pbigmaW5mby0+cmVjdl9saXN0LCBvcmlnX25vZGUtPm9yaWcpKQorCQkJCWNvbnRpbnVlOworCisJCQltZW1jcHkoaW5mby0+cGFja2V0LnRhcmdldF9vcmlnLAorCQkJICAgICAgIG9yaWdfbm9kZS0+b3JpZywgRVRIX0FMRU4pOworCisJCQlzZW5kX3Jhd19wYWNrZXQoKHVuc2lnbmVkIGNoYXIgKikgJmluZm8tPnBhY2tldCwKKwkJCQkJcGFja2V0X2xlbmd0aCwKKwkJCQkJb3JpZ19ub2RlLT5iYXRtYW5faWYsCisJCQkJCW9yaWdfbm9kZS0+cm91dGVyLT5hZGRyKTsKKwkJfQorCX0KKwltZW1jcHkoaW5mby0+cGFja2V0LnRhcmdldF9vcmlnLCBicm9hZGNhc3RBZGRyLCBFVEhfQUxFTik7CisJc3Bpbl91bmxvY2soJm9yaWdfaGFzaF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgdW5pY2FzdF92aXNfcGFja2V0KHN0cnVjdCB2aXNfaW5mbyAqaW5mbywgaW50IHBhY2tldF9sZW5ndGgpCit7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOworCisJc3Bpbl9sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopCisJCSAgICAgaGFzaF9maW5kKG9yaWdfaGFzaCwgaW5mby0+cGFja2V0LnRhcmdldF9vcmlnKSk7CisKKwlpZiAoKG9yaWdfbm9kZSAhPSBOVUxMKSAmJgorCSAgICAob3JpZ19ub2RlLT5iYXRtYW5faWYgIT0gTlVMTCkgJiYKKwkgICAgKG9yaWdfbm9kZS0+cm91dGVyICE9IE5VTEwpKSB7CisJCXNlbmRfcmF3X3BhY2tldCgodW5zaWduZWQgY2hhciAqKSAmaW5mby0+cGFja2V0LCBwYWNrZXRfbGVuZ3RoLAorCQkJCW9yaWdfbm9kZS0+YmF0bWFuX2lmLAorCQkJCW9yaWdfbm9kZS0+cm91dGVyLT5hZGRyKTsKKwl9CisJc3Bpbl91bmxvY2soJm9yaWdfaGFzaF9sb2NrKTsKK30KKworLyogb25seSBzZW5kIG9uZSB2aXMgcGFja2V0LiBjYWxsZWQgZnJvbSBzZW5kX3Zpc19wYWNrZXRzKCkgKi8KK3N0YXRpYyB2b2lkIHNlbmRfdmlzX3BhY2tldChzdHJ1Y3QgdmlzX2luZm8gKmluZm8pCit7CisJaW50IHBhY2tldF9sZW5ndGg7CisKKwlpZiAoaW5mby0+cGFja2V0LnR0bCA8IDIpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX05PVElDRSwKKwkJCSAgIkVycm9yIC0gY2FuJ3Qgc2VuZCB2aXMgcGFja2V0OiB0dGwgZXhjZWVkZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KGluZm8tPnBhY2tldC5zZW5kZXJfb3JpZywgbWFpbklmQWRkciwgRVRIX0FMRU4pOworCWluZm8tPnBhY2tldC50dGwtLTsKKworCXBhY2tldF9sZW5ndGggPSBzaXplb2Yoc3RydWN0IHZpc19wYWNrZXQpICsKKwkJaW5mby0+cGFja2V0LmVudHJpZXMgKiBzaXplb2Yoc3RydWN0IHZpc19pbmZvX2VudHJ5KTsKKworCWlmIChpc19iY2FzdChpbmZvLT5wYWNrZXQudGFyZ2V0X29yaWcpKQorCQlicm9hZGNhc3RfdmlzX3BhY2tldChpbmZvLCBwYWNrZXRfbGVuZ3RoKTsKKwllbHNlCisJCXVuaWNhc3RfdmlzX3BhY2tldChpbmZvLCBwYWNrZXRfbGVuZ3RoKTsKKwlpbmZvLT5wYWNrZXQudHRsKys7IC8qIHJlc3RvcmUgVFRMICovCit9CisKKy8qIGNhbGxlZCBmcm9tIHRpbWVyOyBzZW5kIChhbmQgbWF5YmUgZ2VuZXJhdGUpIHZpcyBwYWNrZXQuICovCitzdGF0aWMgdm9pZCBzZW5kX3Zpc19wYWNrZXRzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdmlzX2luZm8gKmluZm8sICp0ZW1wOworCisJc3Bpbl9sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKKwlwdXJnZV92aXNfcGFja2V0cygpOworCisJaWYgKGdlbmVyYXRlX3Zpc19wYWNrZXQoKSA9PSAwKQorCQkvKiBzY2hlZHVsZSBpZiBnZW5lcmF0aW9uIHdhcyBzdWNjZXNzZnVsICovCisJCWxpc3RfYWRkX3RhaWwoJm15X3Zpc19pbmZvLT5zZW5kX2xpc3QsICZzZW5kX2xpc3QpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGluZm8sIHRlbXAsICZzZW5kX2xpc3QsIHNlbmRfbGlzdCkgeworCQlsaXN0X2RlbF9pbml0KCZpbmZvLT5zZW5kX2xpc3QpOworCQlzZW5kX3Zpc19wYWNrZXQoaW5mbyk7CisJfQorCXNwaW5fdW5sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKKwlzdGFydF92aXNfdGltZXIoKTsKK30KK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyh2aXNfdGltZXJfd3EsIHNlbmRfdmlzX3BhY2tldHMpOworCisvKiBpbml0IHRoZSB2aXMgc2VydmVyLiB0aGlzIG1heSBvbmx5IGJlIGNhbGxlZCB3aGVuIGlmX2xpc3QgaXMgYWxyZWFkeQorICogaW5pdGlhbGl6ZWQgKGUuZy4gYmF0MCBpcyBpbml0aWFsaXplZCwgaW50ZXJmYWNlcyBoYXZlIGJlZW4gYWRkZWQpICovCitpbnQgdmlzX2luaXQodm9pZCkKK3sKKwlpZiAodmlzX2hhc2gpCisJCXJldHVybiAxOworCisJc3Bpbl9sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKKworCXZpc19oYXNoID0gaGFzaF9uZXcoMjU2LCB2aXNfaW5mb19jbXAsIHZpc19pbmZvX2Nob29zZSk7CisJaWYgKCF2aXNfaGFzaCkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwgIkNhbid0IGluaXRpYWxpemUgdmlzX2hhc2hcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlteV92aXNfaW5mbyA9IGttYWxsb2MoMTAwMCwgR0ZQX0FUT01JQyk7CisJaWYgKCFteV92aXNfaW5mbykgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwgIkNhbid0IGluaXRpYWxpemUgdmlzIHBhY2tldFxuIik7CisJCWdvdG8gZXJyOworCX0KKworCS8qIHByZWZpbGwgdGhlIHZpcyBpbmZvICovCisJbXlfdmlzX2luZm8tPmZpcnN0X3NlZW4gPSBqaWZmaWVzIC0gYXRvbWljX3JlYWQoJnZpc19pbnRlcnZhbCk7CisJSU5JVF9MSVNUX0hFQUQoJm15X3Zpc19pbmZvLT5yZWN2X2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZteV92aXNfaW5mby0+c2VuZF9saXN0KTsKKwlteV92aXNfaW5mby0+cGFja2V0LnZlcnNpb24gPSBDT01QQVRfVkVSU0lPTjsKKwlteV92aXNfaW5mby0+cGFja2V0LnBhY2tldF90eXBlID0gQkFUX1ZJUzsKKwlteV92aXNfaW5mby0+cGFja2V0LnZpc190eXBlID0gVklTX1RZUEVfQ0xJRU5UX1VQREFURTsKKwlteV92aXNfaW5mby0+cGFja2V0LnR0bCA9IFRUTDsKKwlteV92aXNfaW5mby0+cGFja2V0LnNlcW5vID0gMDsKKwlteV92aXNfaW5mby0+cGFja2V0LmVudHJpZXMgPSAwOworCisJSU5JVF9MSVNUX0hFQUQoJnNlbmRfbGlzdCk7CisKKwltZW1jcHkobXlfdmlzX2luZm8tPnBhY2tldC52aXNfb3JpZywgbWFpbklmQWRkciwgRVRIX0FMRU4pOworCW1lbWNweShteV92aXNfaW5mby0+cGFja2V0LnNlbmRlcl9vcmlnLCBtYWluSWZBZGRyLCBFVEhfQUxFTik7CisKKwlpZiAoaGFzaF9hZGQodmlzX2hhc2gsIG15X3Zpc19pbmZvKSA8IDApIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX0NSSVQsCisJCQkgICJDYW4ndCBhZGQgb3duIHZpcyBwYWNrZXQgaW50byBoYXNoXG4iKTsKKwkJZnJlZV9pbmZvKG15X3Zpc19pbmZvKTsJLyogbm90IGluIGhhc2gsIG5lZWQgdG8gcmVtb3ZlIGl0CisJCQkJCSAqIG1hbnVhbGx5LiAqLworCQlnb3RvIGVycjsKKwl9CisKKwlzcGluX3VubG9jaygmdmlzX2hhc2hfbG9jayk7CisJc3RhcnRfdmlzX3RpbWVyKCk7CisJcmV0dXJuIDE7CisKK2VycjoKKwlzcGluX3VubG9jaygmdmlzX2hhc2hfbG9jayk7CisJdmlzX3F1aXQoKTsKKwlyZXR1cm4gMDsKK30KKworLyogc2h1dGRvd24gdmlzLXNlcnZlciAqLwordm9pZCB2aXNfcXVpdCh2b2lkKQoreworCWlmICghdmlzX2hhc2gpCisJCXJldHVybjsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdmlzX3RpbWVyX3dxKTsKKworCXNwaW5fbG9jaygmdmlzX2hhc2hfbG9jayk7CisJLyogcHJvcGVybHkgcmVtb3ZlLCBraWxsIHRpbWVycyAuLi4gKi8KKwloYXNoX2RlbGV0ZSh2aXNfaGFzaCwgZnJlZV9pbmZvKTsKKwl2aXNfaGFzaCA9IE5VTEw7CisJbXlfdmlzX2luZm8gPSBOVUxMOworCXNwaW5fdW5sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKK30KKworLyogc2NoZWR1bGUgcGFja2V0cyBmb3IgKHJlKXRyYW5zbWlzc2lvbiAqLworc3RhdGljIHZvaWQgc3RhcnRfdmlzX3RpbWVyKHZvaWQpCit7CisJcXVldWVfZGVsYXllZF93b3JrKGJhdF9ldmVudF93b3JrcXVldWUsICZ2aXNfdGltZXJfd3EsCisJCQkgICAoYXRvbWljX3JlYWQoJnZpc19pbnRlcnZhbCkvMTAwMCkgKiBIWik7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Zpcy5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdmlzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc2ZmFiYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Zpcy5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIFNpbW9uIFd1bmRlcmxpY2gsIE1hcmVrIExpbmRuZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjZGVmaW5lIFZJU19USU1FT1VUCQkyMDAwMDAKKyNkZWZpbmUgVklTX0ZPUk1BVF9ERF9OQU1FCSJkb3RfZHJhdyIKKyNkZWZpbmUgVklTX0ZPUk1BVF9KU09OX05BTUUJImpzb24iCisKK3N0cnVjdCB2aXNfaW5mbyB7CisJdW5zaWduZWQgbG9uZyAgICAgICBmaXJzdF9zZWVuOworCXN0cnVjdCBsaXN0X2hlYWQgICAgcmVjdl9saXN0OworCQkJICAgIC8qIGxpc3Qgb2Ygc2VydmVyLW5laWdoYm9ycyB3ZSByZWNlaXZlZCBhIHZpcy1wYWNrZXQKKwkJCSAgICAgKiBmcm9tLiAgd2Ugc2hvdWxkIG5vdCByZXBseSB0byB0aGVtLiAqLworCXN0cnVjdCBsaXN0X2hlYWQgc2VuZF9saXN0OworCS8qIHRoaXMgcGFja2V0IG1pZ2h0IGJlIHBhcnQgb2YgdGhlIHZpcyBzZW5kIHF1ZXVlLiAqLworCXN0cnVjdCB2aXNfcGFja2V0IHBhY2tldDsKKwkvKiB2aXNfaW5mbyBtYXkgZm9sbG93IGhlcmUqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHZpc19pbmZvX2VudHJ5IHsKKwl1aW50OF90ICBzcmNbRVRIX0FMRU5dOworCXVpbnQ4X3QgIGRlc3RbRVRIX0FMRU5dOworCXVpbnQ4X3QgIHF1YWxpdHk7CS8qIHF1YWxpdHkgPSAwIG1lYW5zIEhOQSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHJlY3ZsaXN0X25vZGUgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1aW50OF90IG1hY1tFVEhfQUxFTl07Cit9OworCitlbnVtIHZpc19mb3JtYXRzIHsKKwlET1RfRFJBVywKKwlKU09OLAorfTsKKworZXh0ZXJuIHN0cnVjdCBoYXNodGFibGVfdCAqdmlzX2hhc2g7CitleHRlcm4gc3BpbmxvY2tfdCB2aXNfaGFzaF9sb2NrOworCit2b2lkIHZpc19zZXRfbW9kZShpbnQgbW9kZSk7CitpbnQgaXNfdmlzX3NlcnZlcih2b2lkKTsKK3ZvaWQgcmVjZWl2ZV9zZXJ2ZXJfc3luY19wYWNrZXQoc3RydWN0IHZpc19wYWNrZXQgKnZpc19wYWNrZXQsCisJCQkJaW50IHZpc19pbmZvX2xlbik7Cit2b2lkIHJlY2VpdmVfY2xpZW50X3VwZGF0ZV9wYWNrZXQoc3RydWN0IHZpc19wYWNrZXQgKnZpc19wYWNrZXQsCisJCQkJICBpbnQgdmlzX2luZm9fbGVuKTsKK2ludCB2aXNfaW5pdCh2b2lkKTsKK3ZvaWQgdmlzX3F1aXQodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaS5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGkuaAppbmRleCA5NTdiNjQwLi5jY2M1Y2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpLmgKQEAgLTI0LDEwICsyNCw2IEBACiAjaWZuZGVmIF9DT01FRElfSAogI2RlZmluZSBfQ09NRURJX0gKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCiAjZGVmaW5lIENPTUVESV9NQUpPUlZFUlNJT04JMAogI2RlZmluZSBDT01FRElfTUlOT1JWRVJTSU9OCTcKICNkZWZpbmUgQ09NRURJX01JQ1JPVkVSU0lPTgk3NgpAQCAtODcxLDggKzg2Nyw0IEBACiAJCUFNUExDX0RJT19HQVRfUkVTRVJWRUQ3CiAJfTsKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQogI2VuZGlmIC8qIF9DT01FRElfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfY29tcGF0MzIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2NvbXBhdDMyLmMKaW5kZXggOTgxMGUzNy4uYTlmZGNkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfY29tcGF0MzIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9jb21wYXQzMi5jCkBAIC0yNywxNiArMjcsMTIgQEAKICNkZWZpbmUgX19OT19WRVJTSU9OX18KICNpbmNsdWRlICJjb21lZGkuaCIKICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSAiY29tZWRpX2NvbXBhdDMyLmgiCiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAKLSNpZm5kZWYgSEFWRV9DT01QQVRfSU9DVEwKLSNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CS8qIGZvciAodW4pcmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uICovCi0jZW5kaWYKLQogI2RlZmluZSBDT01FREkzMl9DSEFOSU5GTyBfSU9SKENJTywgMywgc3RydWN0IGNvbWVkaTMyX2NoYW5pbmZvX3N0cnVjdCkKICNkZWZpbmUgQ09NRURJMzJfUkFOR0VJTkZPIF9JT1IoQ0lPLCA4LCBzdHJ1Y3QgY29tZWRpMzJfcmFuZ2VpbmZvX3N0cnVjdCkKIC8qIE4uQi4gQ09NRURJMzJfQ01EIGFuZCBDT01FRElfQ01EIG91Z2h0IHRvIHVzZSBfSU9XUiwgbm90IF9JT1IuCkBAIC0xMDEsMjIgKzk3LDkgQEAKIAlpZiAoIWZpbGUtPmZfb3ApCiAJCXJldHVybiAtRU5PVFRZOwogCi0jaWZkZWYgSEFWRV9VTkxPQ0tFRF9JT0NUTAotCWlmIChmaWxlLT5mX29wLT51bmxvY2tlZF9pb2N0bCkgewotCQlpbnQgcmMgPSAoaW50KSgqZmlsZS0+Zl9vcC0+dW5sb2NrZWRfaW9jdGwpIChmaWxlLCBjbWQsIGFyZyk7Ci0JCWlmIChyYyA9PSAtRU5PSU9DVExDTUQpCi0JCQlyYyA9IC1FTk9UVFk7Ci0JCXJldHVybiByYzsKLQl9Ci0jZW5kaWYKLQlpZiAoZmlsZS0+Zl9vcC0+aW9jdGwpIHsKLQkJaW50IHJjOwotCQlsb2NrX2tlcm5lbCgpOwotCQlyYyA9ICgqZmlsZS0+Zl9vcC0+aW9jdGwpIChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwKLQkJCQkJICAgZmlsZSwgY21kLCBhcmcpOwotCQl1bmxvY2tfa2VybmVsKCk7Ci0JCXJldHVybiByYzsKLQl9CisJaWYgKGZpbGUtPmZfb3AtPnVubG9ja2VkX2lvY3RsKQorCQlyZXR1cm4gZmlsZS0+Zl9vcC0+dW5sb2NrZWRfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCiAJcmV0dXJuIC1FTk9UVFk7CiB9CiAKQEAgLTE4Niw4ICsxNjksOCBAQAogfQogCiAvKiBDb3B5IDMyLWJpdCBjbWQgc3RydWN0dXJlIHRvIG5hdGl2ZSBjbWQgc3RydWN0dXJlLiAqLwotc3RhdGljIGludCBnZXRfY29tcGF0X2NtZChzdHJ1Y3QgY29tZWRpX2NtZCBfX3VzZXIgKiBjbWQsCi0JCQkgIHN0cnVjdCBjb21lZGkzMl9jbWRfc3RydWN0IF9fdXNlciAqIGNtZDMyKQorc3RhdGljIGludCBnZXRfY29tcGF0X2NtZChzdHJ1Y3QgY29tZWRpX2NtZCBfX3VzZXIgKmNtZCwKKwkJCSAgc3RydWN0IGNvbWVkaTMyX2NtZF9zdHJ1Y3QgX191c2VyICpjbWQzMikKIHsKIAlpbnQgZXJyOwogCXVuaW9uIHsKQEAgLTIzNyw4ICsyMjAsOCBAQAogfQogCiAvKiBDb3B5IG5hdGl2ZSBjbWQgc3RydWN0dXJlIHRvIDMyLWJpdCBjbWQgc3RydWN0dXJlLiAqLwotc3RhdGljIGludCBwdXRfY29tcGF0X2NtZChzdHJ1Y3QgY29tZWRpMzJfY21kX3N0cnVjdCBfX3VzZXIgKiBjbWQzMiwKLQkJCSAgc3RydWN0IGNvbWVkaV9jbWQgX191c2VyICogY21kKQorc3RhdGljIGludCBwdXRfY29tcGF0X2NtZChzdHJ1Y3QgY29tZWRpMzJfY21kX3N0cnVjdCBfX3VzZXIgKmNtZDMyLAorCQkJICBzdHJ1Y3QgY29tZWRpX2NtZCBfX3VzZXIgKmNtZCkKIHsKIAlpbnQgZXJyOwogCXVuc2lnbmVkIGludCB0ZW1wOwpAQCAtMzI4LDggKzMxMSw4IEBACiB9CiAKIC8qIENvcHkgMzItYml0IGluc24gc3RydWN0dXJlIHRvIG5hdGl2ZSBpbnNuIHN0cnVjdHVyZS4gKi8KLXN0YXRpYyBpbnQgZ2V0X2NvbXBhdF9pbnNuKHN0cnVjdCBjb21lZGlfaW5zbiBfX3VzZXIgKiBpbnNuLAotCQkJICAgc3RydWN0IGNvbWVkaTMyX2luc25fc3RydWN0IF9fdXNlciAqIGluc24zMikKK3N0YXRpYyBpbnQgZ2V0X2NvbXBhdF9pbnNuKHN0cnVjdCBjb21lZGlfaW5zbiBfX3VzZXIgKmluc24sCisJCQkgICBzdHJ1Y3QgY29tZWRpMzJfaW5zbl9zdHJ1Y3QgX191c2VyICppbnNuMzIpCiB7CiAJaW50IGVycjsKIAl1bmlvbiB7CkBAIC0zNzIsOSArMzU1LDkgQEAKIAlpbnNubGlzdDMyID0gY29tcGF0X3B0cihhcmcpOwogCiAJLyogR2V0IDMyLWJpdCBpbnNubGlzdCBzdHJ1Y3R1cmUuICAqLwotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBpbnNubGlzdDMyLCBzaXplb2YoKmluc25saXN0MzIpKSkgeworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBpbnNubGlzdDMyLCBzaXplb2YoKmluc25saXN0MzIpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQorCiAJZXJyID0gMDsKIAllcnIgfD0gX19nZXRfdXNlcihuX2luc25zLCAmaW5zbmxpc3QzMi0+bl9pbnNucyk7CiAJZXJyIHw9IF9fZ2V0X3VzZXIodXB0ciwgJmluc25saXN0MzItPmluc25zKTsKQEAgLTM4Nyw5ICszNzAsOSBAQAogCQkJCQkgICAgIGluc25bbl9pbnNuc10pKTsKIAogCS8qIFNldCBuYXRpdmUgaW5zbmxpc3Qgc3RydWN0dXJlLiAqLwotCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgJnMtPmluc25saXN0LCBzaXplb2Yocy0+aW5zbmxpc3QpKSkgeworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgJnMtPmluc25saXN0LCBzaXplb2Yocy0+aW5zbmxpc3QpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQorCiAJZXJyIHw9IF9fcHV0X3VzZXIobl9pbnNucywgJnMtPmluc25saXN0Lm5faW5zbnMpOwogCWVyciB8PSBfX3B1dF91c2VyKCZzLT5pbnNuWzBdLCAmcy0+aW5zbmxpc3QuaW5zbnMpOwogCWlmIChlcnIpCkBAIC00NzIsOCArNDU1LDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLSNpZmRlZiBIQVZFX0NPTVBBVF9JT0NUTAkvKiBkZWZpbmVkIGluIDxsaW51eC9mcy5oPiAyLjYuMTEgb253YXJkcyAqLwotCiAvKiBjb21wYXRfaW9jdGwgZmlsZSBvcGVyYXRpb24uICovCiAvKiBSZXR1cm5zIC1FTk9JT0NUTENNRCBmb3IgdW5yZWNvZ25pc2VkIGlvY3RsIGNvZGVzLiAqLwogbG9uZyBjb21lZGlfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKQEAgLTQ4MSwxMDYgKzQ2Miw0IEBACiAJcmV0dXJuIHJhd19pb2N0bChmaWxlLCBjbWQsIGFyZyk7CiB9CiAKLSNlbHNlIC8qIEhBVkVfQ09NUEFUX0lPQ1RMICovCi0KLS8qCi0gKiBCcmFpbi1kZWFkIGlvY3RsIGNvbXBhdGliaWxpdHkgZm9yIDIuNi4xMCBhbmQgZWFybGllci4KLSAqCi0gKiBJdCdzIGJyYWluLWRlYWQgYmVjYXVzZSBjbWQgbnVtYmVycyBuZWVkIHRvIGJlIHVuaXF1ZSBzeXN0ZW0td2lkZSEKLSAqIFRoZSBjb21lZGkgZHJpdmVyIGNvdWxkIGVuZCB1cCBhdHRlbXB0aW5nIHRvIGV4ZWN1dGUgaW9jdGxzIGZvciBub24tQ29tZWRpCi0gKiBkZXZpY2VzIGJlY2F1c2UgaXQgcmVnaXN0ZXJlZCB0aGUgc3lzdGVtLXdpZGUgY21kIGNvZGUgZmlyc3QuICBTaW1pbGFybHksCi0gKiBhbm90aGVyIGRyaXZlciBjb3VsZCBlbmQgdXAgYXR0ZW1wdGluZyB0byBleGVjdXRlIGlvY3RscyBmb3IgYSBDb21lZGkKLSAqIGRldmljZSBiZWNhdXNlIGl0IHJlZ2lzdGVyZWQgdGhlIGNtZCBjb2RlIGZpcnN0LiAgQ2hhb3MgZW5zdWVzLgotICovCi0KLS8qIEhhbmRsZXIgZm9yIGFsbCAzMi1iaXQgaW9jdGwgY29kZXMgcmVnaXN0ZXJlZCBieSB0aGlzIGRyaXZlci4gKi8KLXN0YXRpYyBpbnQgbWFwcGVkX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCi0JCQlzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpbnQgcmM7Ci0KLQkvKiBNYWtlIHN1cmUgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIENvbWVkaSBkZXZpY2UuICovCi0JaWYgKGltYWpvcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkgIT0gQ09NRURJX01BSk9SKQotCQlyZXR1cm4gLUVOT1RUWTsKLQotCXJjID0gcmF3X2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLQkvKiBEbyBub3QgcmV0dXJuIC1FTk9JT0NUTENNRC4gKi8KLQlpZiAocmMgPT0gLUVOT0lPQ1RMQ01EKQotCQlyYyA9IC1FTk9UVFk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0cnVjdCBpb2N0bDMyX21hcCB7Ci0JdW5zaWduZWQgaW50IGNtZDsKLQlpbnQgKCpoYW5kbGVyKSAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcsCi0JCQlzdHJ1Y3QgZmlsZSAqKTsKLQlpbnQgcmVnaXN0ZXJlZDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW9jdGwzMl9tYXAgY29tZWRpX2lvY3RsMzJfbWFwW10gPSB7Ci0Je0NPTUVESV9ERVZDT05GSUcsIG1hcHBlZF9pb2N0bCwgMH0sCi0Je0NPTUVESV9ERVZJTkZPLCBtYXBwZWRfaW9jdGwsIDB9LAotCXtDT01FRElfU1VCRElORk8sIG1hcHBlZF9pb2N0bCwgMH0sCi0Je0NPTUVESV9CVUZDT05GSUcsIG1hcHBlZF9pb2N0bCwgMH0sCi0Je0NPTUVESV9CVUZJTkZPLCBtYXBwZWRfaW9jdGwsIDB9LAotCXtDT01FRElfTE9DSywgbWFwcGVkX2lvY3RsLCAwfSwKLQl7Q09NRURJX1VOTE9DSywgbWFwcGVkX2lvY3RsLCAwfSwKLQl7Q09NRURJX0NBTkNFTCwgbWFwcGVkX2lvY3RsLCAwfSwKLQl7Q09NRURJX1BPTEwsIG1hcHBlZF9pb2N0bCwgMH0sCi0Je0NPTUVESTMyX0NIQU5JTkZPLCBtYXBwZWRfaW9jdGwsIDB9LAotCXtDT01FREkzMl9SQU5HRUlORk8sIG1hcHBlZF9pb2N0bCwgMH0sCi0Je0NPTUVESTMyX0NNRCwgbWFwcGVkX2lvY3RsLCAwfSwKLQl7Q09NRURJMzJfQ01EVEVTVCwgbWFwcGVkX2lvY3RsLCAwfSwKLQl7Q09NRURJMzJfSU5TTkxJU1QsIG1hcHBlZF9pb2N0bCwgMH0sCi0Je0NPTUVESTMyX0lOU04sIG1hcHBlZF9pb2N0bCwgMH0sCi19OwotCi0jZGVmaW5lIE5VTV9JT0NUTDMyX01BUFMgQVJSQVlfU0laRShjb21lZGlfaW9jdGwzMl9tYXApCi0KLS8qIFJlZ2lzdGVyIHN5c3RlbS13aWRlIDMyLWJpdCBpb2N0bCBoYW5kbGVycy4gKi8KLXZvaWQgY29tZWRpX3JlZ2lzdGVyX2lvY3RsMzIodm9pZCkKLXsKLQlpbnQgbiwgcmM7Ci0KLQlmb3IgKG4gPSAwOyBuIDwgTlVNX0lPQ1RMMzJfTUFQUzsgbisrKSB7Ci0JCXJjID0gcmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKGNvbWVkaV9pb2N0bDMyX21hcFtuXS5jbWQsCi0JCQkJCQkgY29tZWRpX2lvY3RsMzJfbWFwW25dLmhhbmRsZXIpOwotCQlpZiAocmMpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiY29tZWRpOiBmYWlsZWQgdG8gcmVnaXN0ZXIgMzItYml0ICIKLQkJCSAgICAgICAiY29tcGF0aWJsZSBpb2N0bCBoYW5kbGVyIGZvciAweCVYIC0gIgotCQkJICAgICAgICJleHBlY3QgYmFkIHRoaW5ncyB0byBoYXBwZW4hXG4iLAotCQkJICAgICAgIGNvbWVkaV9pb2N0bDMyX21hcFtuXS5jbWQpOwotCQl9Ci0JCWNvbWVkaV9pb2N0bDMyX21hcFtuXS5yZWdpc3RlcmVkID0gIXJjOwotCX0KLX0KLQotLyogVW5yZWdpc3RlciBzeXN0ZW0td2lkZSAzMi1iaXQgaW9jdGwgdHJhbnNsYXRpb25zLiAqLwotdm9pZCBjb21lZGlfdW5yZWdpc3Rlcl9pb2N0bDMyKHZvaWQpCi17Ci0JaW50IG4sIHJjOwotCi0JZm9yIChuID0gMDsgbiA8IE5VTV9JT0NUTDMyX01BUFM7IG4rKykgewotCQlpZiAoY29tZWRpX2lvY3RsMzJfbWFwW25dLnJlZ2lzdGVyZWQpIHsKLQkJCXJjID0gdW5yZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oY29tZWRpX2lvY3RsMzJfbWFwCi0JCQkJCQkJICAgW25dLmNtZCwKLQkJCQkJCQkgICBjb21lZGlfaW9jdGwzMl9tYXAKLQkJCQkJCQkgICBbbl0uaGFuZGxlcik7Ci0JCQlpZiAocmMpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkgICAgICAgImNvbWVkaTogZmFpbGVkIHRvIHVucmVnaXN0ZXIgMzItYml0ICIKLQkJCQkgICAgICAgImNvbXBhdGlibGUgaW9jdGwgaGFuZGxlciBmb3IgMHglWCAtICIKLQkJCQkgICAgICAgImV4cGVjdCBrZXJuZWwgT29wcyFcbiIsCi0JCQkJICAgICAgIGNvbWVkaV9pb2N0bDMyX21hcFtuXS5jbWQpOwotCQkJfSBlbHNlIHsKLQkJCQljb21lZGlfaW9jdGwzMl9tYXBbbl0ucmVnaXN0ZXJlZCA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLSNlbmRpZiAvKiBIQVZFX0NPTVBBVF9JT0NUTCAqLwotCiAjZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfY29tcGF0MzIuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2NvbXBhdDMyLmgKaW5kZXggZmQwZjhhMy4uMDM0MGE4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfY29tcGF0MzIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9jb21wYXQzMi5oCkBAIC0yOCwzMCArMjgsMTYgQEAKICNkZWZpbmUgX0NPTUVESV9DT01QQVQzMl9ICiAKICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgkJLyogRm9yIEhBVkVfQ09NUEFUX0lPQ1RMIGFuZCBIQVZFX1VOTE9DS0VEX0lPQ1RMICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KIAogI2lmZGVmIENPTkZJR19DT01QQVQKIAotI2lmZGVmIEhBVkVfQ09NUEFUX0lPQ1RMCi0KIGV4dGVybiBsb25nIGNvbWVkaV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkJdW5zaWduZWQgbG9uZyBhcmcpOwotI2RlZmluZSBjb21lZGlfcmVnaXN0ZXJfaW9jdGwzMigpIGRvIHt9IHdoaWxlICgwKQotI2RlZmluZSBjb21lZGlfdW5yZWdpc3Rlcl9pb2N0bDMyKCkgZG8ge30gd2hpbGUgKDApCi0KLSNlbHNlIC8qIEhBVkVfQ09NUEFUX0lPQ1RMICovCi0KLSNkZWZpbmUgY29tZWRpX2NvbXBhdF9pb2N0bCAwCS8qIE5VTEwgKi8KLWV4dGVybiB2b2lkIGNvbWVkaV9yZWdpc3Rlcl9pb2N0bDMyKHZvaWQpOwotZXh0ZXJuIHZvaWQgY29tZWRpX3VucmVnaXN0ZXJfaW9jdGwzMih2b2lkKTsKLQotI2VuZGlmIC8qIEhBVkVfQ09NUEFUX0lPQ1RMICovCiAKICNlbHNlIC8qIENPTkZJR19DT01QQVQgKi8KIAogI2RlZmluZSBjb21lZGlfY29tcGF0X2lvY3RsIDAJLyogTlVMTCAqLwotI2RlZmluZSBjb21lZGlfcmVnaXN0ZXJfaW9jdGwzMigpIGRvIHt9IHdoaWxlICgwKQotI2RlZmluZSBjb21lZGlfdW5yZWdpc3Rlcl9pb2N0bDMyKCkgZG8ge30gd2hpbGUgKDApCiAKICNlbmRpZiAvKiBDT05GSUdfQ09NUEFUICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYwppbmRleCBhYWFkNzZlLi44MTE3NzQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jCkBAIC0xMTAsMTMgKzExMCw4IEBACiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfbWF4X3dyaXRlX2J1ZmZlcl9rYjsKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl93cml0ZV9idWZmZXJfa2I7CiAKLSNpZmRlZiBIQVZFX1VOTE9DS0VEX0lPQ1RMCiBzdGF0aWMgbG9uZyBjb21lZGlfdW5sb2NrZWRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkJICB1bnNpZ25lZCBsb25nIGFyZykKLSNlbHNlCi1zdGF0aWMgaW50IGNvbWVkaV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotI2VuZGlmCiB7CiAJY29uc3QgdW5zaWduZWQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOwogCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbyA9CkBAIC0xODY3LDE0ICsxODYyLDggQEAKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjb21lZGlfZm9wcyA9IHsKIAkub3duZXIgPSBUSElTX01PRFVMRSwKLSNpZmRlZiBIQVZFX1VOTE9DS0VEX0lPQ1RMCiAJLnVubG9ja2VkX2lvY3RsID0gY29tZWRpX3VubG9ja2VkX2lvY3RsLAotI2Vsc2UKLQkuaW9jdGwgPSBjb21lZGlfaW9jdGwsCi0jZW5kaWYKLSNpZmRlZiBIQVZFX0NPTVBBVF9JT0NUTAogCS5jb21wYXRfaW9jdGwgPSBjb21lZGlfY29tcGF0X2lvY3RsLAotI2VuZGlmCiAJLm9wZW4gPSBjb21lZGlfb3BlbiwKIAkucmVsZWFzZSA9IGNvbWVkaV9jbG9zZSwKIAkucmVhZCA9IGNvbWVkaV9yZWFkLApAQCAtMTk1OSw4ICsxOTQ4LDYgQEAKIAkJfQogCX0KIAotCWNvbWVkaV9yZWdpc3Rlcl9pb2N0bDMyKCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTk3Nyw4ICsxOTY0LDYgQEAKIAl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoQ09NRURJX01BSk9SLCAwKSwgQ09NRURJX05VTV9NSU5PUlMpOwogCiAJY29tZWRpX3Byb2NfY2xlYW51cCgpOwotCi0JY29tZWRpX3VucmVnaXN0ZXJfaW9jdGwzMigpOwogfQogCiBtb2R1bGVfaW5pdChjb21lZGlfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaWRldi5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlkZXYuaAppbmRleCBlOGE1ZjdkLi5lYmRjY2ZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaWRldi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpZGV2LmgKQEAgLTQ5LDcgKzQ5LDggQEAKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgQ09NRURJX1ZFUlNJT04oYSwgYiwgYykgKCgoYSkgPDwgMTYpICsgKChiKSA8PCA4KSArIChjKSkKLSNkZWZpbmUgQ09NRURJX1ZFUlNJT05fQ09ERSBDT01FRElfVkVSU0lPTihDT01FRElfTUFKT1JWRVJTSU9OLCBDT01FRElfTUlOT1JWRVJTSU9OLCBDT01FRElfTUlDUk9WRVJTSU9OKQorI2RlZmluZSBDT01FRElfVkVSU0lPTl9DT0RFIENPTUVESV9WRVJTSU9OKENPTUVESV9NQUpPUlZFUlNJT04sIFwKKwlDT01FRElfTUlOT1JWRVJTSU9OLCBDT01FRElfTUlDUk9WRVJTSU9OKQogI2RlZmluZSBDT01FRElfUkVMRUFTRSBWRVJTSU9OCiAKICNkZWZpbmUgQ09NRURJX0lOSVRDTEVBTlVQX05PTU9EVUxFKHgpCQkJCQlcCkBAIC01OCwxMiArNTksMTIgQEAKIAlzdGF0aWMgdm9pZCBfX2V4aXQgeCAjIyBfY2xlYW51cF9tb2R1bGUodm9pZCkJCQlcCiAJCXtjb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJih4KSk7IH0gCQkJXAogCW1vZHVsZV9pbml0KHggIyMgX2luaXRfbW9kdWxlKTsJCQkJCVwKLQltb2R1bGVfZXhpdCh4ICMjIF9jbGVhbnVwX21vZHVsZSk7CQkJCQlcCisJbW9kdWxlX2V4aXQoeCAjIyBfY2xlYW51cF9tb2R1bGUpOwogCiAjZGVmaW5lIENPTUVESV9NT0RVTEVfTUFDUk9TCQkJCQkJXAogCU1PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsJCVwKIAlNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CQkJXAotCU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsJCQkJCQlcCisJTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiAjZGVmaW5lIENPTUVESV9JTklUQ0xFQU5VUCh4KQkJCQkJCVwKIAlDT01FRElfTU9EVUxFX01BQ1JPUwkJXApAQCAtNzUsNyArNzYsOCBAQAogCXsgXAogCQlyZXR1cm4gY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhkZXYsIGNvbWVkaV9kcml2ZXIuZHJpdmVyX25hbWUpOyBcCiAJfSBcCi0Jc3RhdGljIHZvaWQgX19kZXZleGl0IGNvbWVkaV9kcml2ZXIgIyMgX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikgXAorCXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjb21lZGlfZHJpdmVyICMjIF9wY2lfcmVtb3ZlKFwKKwkJc3RydWN0IHBjaV9kZXYgKmRldikgXAogCXsgXAogCQljb21lZGlfcGNpX2F1dG9fdW5jb25maWcoZGV2KTsgXAogCX0gXApAQCAtOTEsNyArOTMsOCBAQAogCQlyZXR2YWwgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZjb21lZGlfZHJpdmVyKTsgXAogCQlpZiAocmV0dmFsIDwgMCkgXAogCQkJcmV0dXJuIHJldHZhbDsgXAotCQljb21lZGlfZHJpdmVyICMjIF9wY2lfZHJpdmVyLm5hbWUgPSAoY2hhciAqKWNvbWVkaV9kcml2ZXIuZHJpdmVyX25hbWU7IFwKKwkJCWNvbWVkaV9kcml2ZXIgIyMgX3BjaV9kcml2ZXIubmFtZSA9IFwKKwkJCQkoY2hhciAqKWNvbWVkaV9kcml2ZXIuZHJpdmVyX25hbWU7IFwKIAkJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmNvbWVkaV9kcml2ZXIgIyMgX3BjaV9kcml2ZXIpOyBcCiAJfSBcCiAJc3RhdGljIHZvaWQgX19leGl0IGNvbWVkaV9kcml2ZXIgIyMgX2NsZWFudXBfbW9kdWxlKHZvaWQpIFwKQEAgLTE3MCwxNCArMTczLDE1IEBACiAJCQkgICBzdHJ1Y3QgY29tZWRpX2NtZCAqKTsKIAlpbnQgKCpwb2xsKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKik7CiAJaW50ICgqY2FuY2VsKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKik7Ci0JLyogaW50ICgqZG9fbG9jaykoc3RydWN0IGNvbWVkaV9kZXZpY2UgKixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqKTsgKi8KLQkvKiBpbnQgKCpkb191bmxvY2spKHN0cnVjdCBjb21lZGlfZGV2aWNlICosc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKik7ICovCisJLyogaW50ICgqZG9fbG9jaykoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKik7ICovCisJLyogaW50ICgqZG9fdW5sb2NrKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBcCisJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqKTsgKi8KIAogCS8qIGNhbGxlZCB3aGVuIHRoZSBidWZmZXIgY2hhbmdlcyAqLwotCWludCAoKmJ1Zl9jaGFuZ2UpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqIGRldiwKLQkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICogcywgdW5zaWduZWQgbG9uZyBuZXdfc2l6ZSk7CisJaW50ICgqYnVmX2NoYW5nZSkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgdW5zaWduZWQgbG9uZyBuZXdfc2l6ZSk7CiAKLQl2b2lkICgqbXVuZ2UpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqIGRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCXZvaWQgKCptdW5nZSkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkgICAgICAgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IG51bV9ieXRlcywKIAkJICAgICAgIHVuc2lnbmVkIGludCBzdGFydF9jaGFuX2luZGV4KTsKIAllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBhc3luY19kbWFfZGlyOwpAQCAtMTk4LDE2ICsyMDIsMjIgQEAKIAogCXZvaWQgKnByZWFsbG9jX2J1ZjsJLyogcHJlLWFsbG9jYXRlZCBidWZmZXIgKi8KIAl1bnNpZ25lZCBpbnQgcHJlYWxsb2NfYnVmc3o7CS8qIGJ1ZmZlciBzaXplLCBpbiBieXRlcyAqLwotCXN0cnVjdCBjb21lZGlfYnVmX3BhZ2UgKmJ1Zl9wYWdlX2xpc3Q7CS8qIHZpcnR1YWwgYW5kIGRtYSBhZGRyZXNzIG9mIGVhY2ggcGFnZSAqLworCS8qIHZpcnR1YWwgYW5kIGRtYSBhZGRyZXNzIG9mIGVhY2ggcGFnZSAqLworCXN0cnVjdCBjb21lZGlfYnVmX3BhZ2UgKmJ1Zl9wYWdlX2xpc3Q7CiAJdW5zaWduZWQgbl9idWZfcGFnZXM7CS8qIG51bSBlbGVtZW50cyBpbiBidWZfcGFnZV9saXN0ICovCiAKIAl1bnNpZ25lZCBpbnQgbWF4X2J1ZnNpemU7CS8qIG1heGltdW0gYnVmZmVyIHNpemUsIGJ5dGVzICovCi0JdW5zaWduZWQgaW50IG1tYXBfY291bnQ7CS8qIGN1cnJlbnQgbnVtYmVyIG9mIG1tYXBzIG9mIHByZWFsbG9jX2J1ZiAqLworCS8qIGN1cnJlbnQgbnVtYmVyIG9mIG1tYXBzIG9mIHByZWFsbG9jX2J1ZiAqLworCXVuc2lnbmVkIGludCBtbWFwX2NvdW50OwogCi0JdW5zaWduZWQgaW50IGJ1Zl93cml0ZV9jb3VudDsJLyogYnl0ZSBjb3VudCBmb3Igd3JpdGVyICh3cml0ZSBjb21wbGV0ZWQpICovCi0JdW5zaWduZWQgaW50IGJ1Zl93cml0ZV9hbGxvY19jb3VudDsJLyogYnl0ZSBjb3VudCBmb3Igd3JpdGVyIChhbGxvY2F0ZWQgZm9yIHdyaXRpbmcpICovCi0JdW5zaWduZWQgaW50IGJ1Zl9yZWFkX2NvdW50OwkvKiBieXRlIGNvdW50IGZvciByZWFkZXIgKHJlYWQgY29tcGxldGVkKSAqLwotCXVuc2lnbmVkIGludCBidWZfcmVhZF9hbGxvY19jb3VudDsJLyogYnl0ZSBjb3VudCBmb3IgcmVhZGVyIChhbGxvY2F0ZWQgZm9yIHJlYWRpbmcpICovCisJLyogYnl0ZSBjb3VudCBmb3Igd3JpdGVyICh3cml0ZSBjb21wbGV0ZWQpICovCisJdW5zaWduZWQgaW50IGJ1Zl93cml0ZV9jb3VudDsKKwkvKiBieXRlIGNvdW50IGZvciB3cml0ZXIgKGFsbG9jYXRlZCBmb3Igd3JpdGluZykgKi8KKwl1bnNpZ25lZCBpbnQgYnVmX3dyaXRlX2FsbG9jX2NvdW50OworCS8qIGJ5dGUgY291bnQgZm9yIHJlYWRlciAocmVhZCBjb21wbGV0ZWQpICovCisJdW5zaWduZWQgaW50IGJ1Zl9yZWFkX2NvdW50OworCS8qIGJ5dGUgY291bnQgZm9yIHJlYWRlciAoYWxsb2NhdGVkIGZvciByZWFkaW5nKSAqLworCXVuc2lnbmVkIGludCBidWZfcmVhZF9hbGxvY19jb3VudDsKIAogCXVuc2lnbmVkIGludCBidWZfd3JpdGVfcHRyOwkvKiBidWZmZXIgbWFya2VyIGZvciB3cml0ZXIgKi8KIAl1bnNpZ25lZCBpbnQgYnVmX3JlYWRfcHRyOwkvKiBidWZmZXIgbWFya2VyIGZvciByZWFkZXIgKi8KQEAgLTIzMyw3ICsyNDMsNyBAQAogCWludCAoKmNiX2Z1bmMpICh1bnNpZ25lZCBpbnQgZmxhZ3MsIHZvaWQgKik7CiAJdm9pZCAqY2JfYXJnOwogCi0JaW50ICgqaW50dHJpZykgKHN0cnVjdCBjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqIHMsCisJaW50ICgqaW50dHJpZykgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJdW5zaWduZWQgaW50IHgpOwogfTsKIApAQCAtMjgzLDggKzI5Myw4IEBACiAKIAlzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqYXN5bmNfcXVldWU7CiAKLQl2b2lkICgqb3BlbikgKHN0cnVjdCBjb21lZGlfZGV2aWNlICogZGV2KTsKLQl2b2lkICgqY2xvc2UpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqIGRldik7CisJdm9pZCAoKm9wZW4pIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KTsKKwl2b2lkICgqY2xvc2UpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KTsKIH07CiAKIHN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyB7CkBAIC0zMTgsOSArMzI4LDggQEAKIAogc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8odW5zaWduZWQgbWlub3IpOwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpjb21lZGlfZ2V0X3JlYWRfc3ViZGV2aWNlKGNvbnN0IHN0cnVjdAotCQkJCQkJCQkgY29tZWRpX2RldmljZV9maWxlX2luZm8KLQkJCQkJCQkJICppbmZvKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqY29tZWRpX2dldF9yZWFkX3N1YmRldmljZSgKKwljb25zdCBzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmluZm8pCiB7CiAJaWYgKGluZm8tPnJlYWRfc3ViZGV2aWNlKQogCQlyZXR1cm4gaW5mby0+cmVhZF9zdWJkZXZpY2U7CkBAIC0zMjksOSArMzM4LDggQEAKIAlyZXR1cm4gaW5mby0+ZGV2aWNlLT5yZWFkX3N1YmRldjsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqY29tZWRpX2dldF93cml0ZV9zdWJkZXZpY2UoY29uc3Qgc3RydWN0Ci0JCQkJCQkJCSAgY29tZWRpX2RldmljZV9maWxlX2luZm8KLQkJCQkJCQkJICAqaW5mbykKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKmNvbWVkaV9nZXRfd3JpdGVfc3ViZGV2aWNlKAorCWNvbnN0IHN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqaW5mbykKIHsKIAlpZiAoaW5mby0+d3JpdGVfc3ViZGV2aWNlKQogCQlyZXR1cm4gaW5mby0+d3JpdGVfc3ViZGV2aWNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYwppbmRleCBkYzUzYWVlLi5jMmE2MzJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYwpAQCAtMzg3LDcgKzM4Nyw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB1dmlydF90b19rdmEocGdkX3QgKiBwZ2QsIHVuc2lnbmVkIGxvbmcgYWRyKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHV2aXJ0X3RvX2t2YShwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIGFkcikKIHsKIAl1bnNpZ25lZCBsb25nIHJldCA9IDBVTDsKIAlwbWRfdCAqcG1kOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTMuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjUzLmgKaW5kZXggYzJlYTJkOS4uMGJiMzVkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvODI1My5oCkBAIC0yMDYsNyArMjA2LDggQEAKIAl9CiAKIAkqbmFub3NlYyA9IGRpdjEgKiBkaXYyICogaTgyNTNfb3NjX2Jhc2U7Ci0JKmQxID0gZGl2MSAmIDB4ZmZmZjsJLyogIG1hc2tpbmcgaXMgZG9uZSBzaW5jZSBjb3VudGVyIG1hcHMgemVybyB0byAweDEwMDAwICovCisJLyogIG1hc2tpbmcgaXMgZG9uZSBzaW5jZSBjb3VudGVyIG1hcHMgemVybyB0byAweDEwMDAwICovCisJKmQxID0gZGl2MSAmIDB4ZmZmZjsKIAkqZDIgPSBkaXYyICYgMHhmZmZmOwogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjU1LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvODI1NS5jCmluZGV4IDBhNTA4NjQuLjEwZjQ4OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjU1LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTUuYwpAQCAtMTMyLDYgKzEzMiw3IEBACiAKIAljb21lZGlfZXZlbnQoZGV2LCBzKTsKIH0KK0VYUE9SVF9TWU1CT0woc3ViZGV2XzgyNTVfaW50ZXJydXB0KTsKIAogc3RhdGljIGludCBzdWJkZXZfODI1NV9jYihpbnQgZGlyLCBpbnQgcG9ydCwgaW50IGRhdGEsIHVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtMTc5LDE1ICsxODAsMTQgQEAKIAl1bnNpZ25lZCBpbnQgYml0czsKIAogCW1hc2sgPSAxIDw8IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCWlmIChtYXNrICYgMHgwMDAwZmYpIHsKKwlpZiAobWFzayAmIDB4MDAwMGZmKQogCQliaXRzID0gMHgwMDAwZmY7Ci0JfSBlbHNlIGlmIChtYXNrICYgMHgwMGZmMDApIHsKKwllbHNlIGlmIChtYXNrICYgMHgwMGZmMDApCiAJCWJpdHMgPSAweDAwZmYwMDsKLQl9IGVsc2UgaWYgKG1hc2sgJiAweDBmMDAwMCkgeworCWVsc2UgaWYgKG1hc2sgJiAweDBmMDAwMCkKIAkJYml0cyA9IDB4MGYwMDAwOwotCX0gZWxzZSB7CisJZWxzZQogCQliaXRzID0gMHhmMDAwMDA7Ci0JfQogCiAJc3dpdGNoIChkYXRhWzBdKSB7CiAJY2FzZSBJTlNOX0NPTkZJR19ESU9fSU5QVVQ6CkBAIC0zMzMsMTEgKzMzMywxMCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCUNBTExCQUNLX0FSRyA9IGFyZzsKLQlpZiAoY2IgPT0gTlVMTCkgeworCWlmIChjYiA9PSBOVUxMKQogCQlDQUxMQkFDS19GVU5DID0gc3ViZGV2XzgyNTVfY2I7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCUNBTExCQUNLX0ZVTkMgPSBjYjsKLQl9CiAJcy0+aW5zbl9iaXRzID0gc3ViZGV2XzgyNTVfaW5zbjsKIAlzLT5pbnNuX2NvbmZpZyA9IHN1YmRldl84MjU1X2luc25fY29uZmlnOwogCkBAIC0zNDcsNiArMzQ2LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChzdWJkZXZfODI1NV9pbml0KTsKIAogaW50IHN1YmRldl84MjU1X2luaXRfaXJxKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJIGludCAoKmNiKSAoaW50LCBpbnQsIGludCwgdW5zaWduZWQgbG9uZyksCkBAIC0zNjYsNiArMzY2LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChzdWJkZXZfODI1NV9pbml0X2lycSk7CiAKIHZvaWQgc3ViZGV2XzgyNTVfY2xlYW51cChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKQEAgLTM3OCw2ICszNzksNyBAQAogCQlrZnJlZShzLT5wcml2YXRlKTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MKHN1YmRldl84MjU1X2NsZWFudXApOwogCiAvKgogCkBAIC00NDgsOCArNDUwLDMgQEAKIAogCXJldHVybiAwOwogfQotCi1FWFBPUlRfU1lNQk9MKHN1YmRldl84MjU1X2luaXQpOwotRVhQT1JUX1NZTUJPTChzdWJkZXZfODI1NV9pbml0X2lycSk7Ci1FWFBPUlRfU1lNQk9MKHN1YmRldl84MjU1X2NsZWFudXApOwotRVhQT1JUX1NZTUJPTChzdWJkZXZfODI1NV9pbnRlcnJ1cHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FjbDcyMjViLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWNsNzIyNWIuYwppbmRleCBjMzY1MmVmLi5lMjBjMzU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWNsNzIyNWIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWNsNzIyNWIuYwpAQCAtOTQsMTAgKzk0LDExIEBACiAKIAlpb2Jhc2UgPSBpdC0+b3B0aW9uc1swXTsKIAlpb3JhbmdlID0gdGhpc19ib2FyZC0+aW9fcmFuZ2U7Ci0JcHJpbnRrKCJjb21lZGklZDogYWNsNzIyNWI6IGJvYXJkPSVzIDB4JTA0eCAiLCBkZXYtPm1pbm9yLAorCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBhY2w3MjI1YjogYm9hcmQ9JXMgMHglMDR4XG4iLCBkZXYtPm1pbm9yLAogCSAgICAgICB0aGlzX2JvYXJkLT5uYW1lLCBpb2Jhc2UpOwogCWlmICghcmVxdWVzdF9yZWdpb24oaW9iYXNlLCBpb3JhbmdlLCAiYWNsNzIyNWIiKSkgewotCQlwcmludGsoIkkvTyBwb3J0IGNvbmZsaWN0XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogcmVxdWVzdF9yZWdpb24gZmFpbGVkIC0gSS9PIHBvcnQgY29uZmxpY3RcbiIsCisJCQlkZXYtPm1pbm9yKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCWRldi0+Ym9hcmRfbmFtZSA9IHRoaXNfYm9hcmQtPm5hbWU7CkBAIC0xMzcsMTQgKzEzOCwxMiBAQAogCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CiAJcy0+cHJpdmF0ZSA9ICh2b2lkICopQUNMNzIyNV9ESV9MTzsKIAotCXByaW50aygiXG4iKTsKLQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFjbDcyMjViX2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewotCXByaW50aygiY29tZWRpJWQ6IGFjbDcyMjViOiByZW1vdmVcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBhY2w3MjI1YjogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKIAogCWlmIChkZXYtPmlvYmFzZSkKIAkJcmVsZWFzZV9yZWdpb24oZGV2LT5pb2Jhc2UsIHRoaXNfYm9hcmQtPmlvX3JhbmdlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvQVBDSTE3MTBfQ2hyb25vLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL0FQQ0kxNzEwX0Nocm9uby5jCmluZGV4IGNjYjEwOWEuLjBhZjEyZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvQVBDSTE3MTBfQ2hyb25vLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9BUENJMTcxMF9DaHJvbm8uYwpAQCAtMTM4Niw4ICsxMzg2LDcgQEAKIAkJCQkvKiBUZXN0IHRoZSB0aW1vdXQgcGFyYW1ldGVyICovCiAJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQkJCQlpZiAoKHVpX1RpbWVPdXQgPj0gMCkKLQkJCQkJJiYgKHVpX1RpbWVPdXQgPD0gNjU1MzVVTCkpIHsKKwkJCQlpZiAodWlfVGltZU91dCA8PSA2NTUzNVVMKSB7CiAKIAkJCQkJZm9yICg7OykgewogCQkJICAvKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvQVBDSTE3MTBfSU5DQ1BULmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL0FQQ0kxNzEwX0lOQ0NQVC5jCmluZGV4IDZjMDkyZWYuLmExNWM5NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvQVBDSTE3MTBfSU5DQ1BULmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9BUENJMTcxMF9JTkNDUFQuYwpAQCAtMzgwNyw3ICszODA3LDcgQEAKIAkJCXNfTW9kdWxlSW5mb1tiX01vZHVsTmJyXS4KIAkJCXNfU2llbWVuc0NvdW50ZXJJbmZvLnNfSW5pdEZsYWcuYl9Db3VudGVySW5pdCA9PSAxKSB7CiAJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQkJLyogVGVzdCBpZiBmcmVxdWVuY3kgbWVzdXJlbWVudCBpbml0aWFsaXNlZCAqLworCQkJLyogVGVzdCBpZiBmcmVxdWVuY3kgbWVhc3VyZW1lbnQgaW5pdGlhbGlzZWQgKi8KIAkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCWlmIChkZXZwcml2LT4KQEAgLTM5NTMsNyArMzk1Myw3IEBACiAJCQlzX01vZHVsZUluZm9bYl9Nb2R1bE5icl0uCiAJCQlzX1NpZW1lbnNDb3VudGVySW5mby5zX0luaXRGbGFnLmJfQ291bnRlckluaXQgPT0gMSkgewogCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJCS8qIFRlc3QgaWYgZnJlcXVlbmN5IG1lc3VyZW1lbnQgaW5pdGlhbGlzZWQgKi8KKwkJCS8qIFRlc3QgaWYgZnJlcXVlbmN5IG1lYXN1cmVtZW50IGluaXRpYWxpc2VkICovCiAJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQlpZiAoZGV2cHJpdi0+CkBAIC01MTY2LDcgKzUxNjYsNyBAQAogCQkJc19Nb2R1bGVJbmZvW2JfTW9kdWxOYnJdLgogCQkJc19TaWVtZW5zQ291bnRlckluZm8uc19Jbml0RmxhZy5iX0NvdW50ZXJJbml0ID09IDEpIHsKIAkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCQkvKiBUZXN0IGlmIGZyZXF1ZW5jeSBtZXN1cmVtZW50IGluaXRpYWxpc2VkICovCisJCQkvKiBUZXN0IGlmIGZyZXF1ZW5jeSBtZWFzdXJlbWVudCBpbml0aWFsaXNlZCAqLwogCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJaWYgKGRldnByaXYtPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9BUENJMTcxMF9Ub3IuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvQVBDSTE3MTBfVG9yLmMKaW5kZXggNDMxOThhYS4uN2UxMjU0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9BUENJMTcxMF9Ub3IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL0FQQ0kxNzEwX1Rvci5jCkBAIC0xODA4LDcgKzE4MDgsNyBAQAogCQkJCQkJCQkJMikgewogCQkJCQkJCQkJaWYgKGR3X1N0YXR1cyAmIDQpIHsKIAkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqLwotCQkJCQkJCQkJCS8qIFRvciBjb3VudGVyIG93ZXJmbG93ICovCisJCQkJCQkJCQkJLyogVG9yIGNvdW50ZXIgb3ZlcmZsb3cgKi8KIAkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJCQkJCQkJKnBiX1RvckNvdW50ZXJTdGF0dXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvYWRkaV9jb21tb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvYWRkaV9jb21tb24uaAppbmRleCBlZGQ2NTdiLi4zYWIyN2NmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2FkZGlfY29tbW9uLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9hZGRpX2NvbW1vbi5oCkBAIC04Miw3ICs4Miw3IEBACiAKIAlpbnQgaV9OYnJEaUNoYW5uZWw7CS8qICBOdW1iZXIgb2YgREkgY2hhbm5lbHMgKi8KIAlpbnQgaV9OYnJEb0NoYW5uZWw7CS8qICBOdW1iZXIgb2YgRE8gY2hhbm5lbHMgKi8KLQlpbnQgaV9Eb01heGRhdGE7CS8qICBkYXRhIHRvIHNldCBhbGwgY2hhbmVscyBoaWdoICovCisJaW50IGlfRG9NYXhkYXRhOwkvKiAgZGF0YSB0byBzZXQgYWxsIGNoYW5uZWxzIGhpZ2ggKi8KIAogCWludCBpX05iclRUTENoYW5uZWw7CS8qICBOdW1iZXIgb2YgVFRMIGNoYW5uZWxzICovCiAJY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKnByX1RUTFJhbmdlbGlzdDsJLyogcmFuZ2VsaXN0IGZvciBUVEwgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTEwMzIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTEwMzIuYwppbmRleCBlOTAyMWNkLi43MjNhOTdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxMDMyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTAzMi5jCkBAIC0xNTAsNyArMTUwLDcgQEAKIAl1bnNpZ25lZCBpbnQgdWlfVG1wVmFsdWUgPSAwOwogCXVuc2lnbmVkIGludCB1aV9DaGFubmVsOwogCXVpX0NoYW5uZWwgPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQlpZiAodWlfQ2hhbm5lbCA+PSAwICYmIHVpX0NoYW5uZWwgPD0gMzEpIHsKKwlpZiAodWlfQ2hhbm5lbCA8PSAzMSkgewogCQl1aV9UbXBWYWx1ZSA9ICh1bnNpZ25lZCBpbnQpIGlubChkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTAzMl9ESUdJVEFMX0lQKTsKIC8qCiAqIHNpbmNlIG9ubHkgMSBjaGFubmVsIHJlcWQgdG8gYnJpbmcgaXQgdG8gbGFzdCBiaXQgaXQgaXMgcm90YXRlZCA4CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTAwLmMKaW5kZXggMjM2YjhhMy4uMzZiOTI5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MDAuYwpAQCAtOTY4LDcgKzk2OCw3IEBACiAKIAlzd2l0Y2ggKGRhdGFbMF0pIHsKIAljYXNlIDA6Ci0JCWlmICh1aV9DaGFubmVsID49IDAgJiYgdWlfQ2hhbm5lbCA8PSAxNSkgeworCQlpZiAodWlfQ2hhbm5lbCA8PSAxNSkgewogCQkJdWlfVG1wVmFsdWUgPQogCQkJCSh1bnNpZ25lZCBpbnQpIGludyhkZXZwcml2LT5pX0lvYmFzZUFkZG9uICsKIAkJCQlBUENJMTUwMF9ESUdJVEFMX0lQKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MTYuYwppbmRleCAzODQxNjM1Li44NjZlYjhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTE2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUxNi5jCkBAIC03OSw3ICs3OSw3IEBACiAJdW5zaWduZWQgaW50IHVpX1RtcFZhbHVlID0gMDsKIAl1bnNpZ25lZCBpbnQgdWlfQ2hhbm5lbDsKIAl1aV9DaGFubmVsID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JaWYgKHVpX0NoYW5uZWwgPj0gMCAmJiB1aV9DaGFubmVsIDw9IDcpIHsKKwlpZiAodWlfQ2hhbm5lbCA8PSA3KSB7CiAJCXVpX1RtcFZhbHVlID0gKHVuc2lnbmVkIGludCkgaW53KGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTE2X0RJR0lUQUxfSVApOwogCQkvKiAgIHNpbmNlIG9ubHkgMSBjaGFubmVsIHJlcWQgIHRvIGJyaW5nIGl0IHRvIGxhc3QgYml0IGl0IGlzIHJvdGF0ZWQgKi8KIAkJLyogICA4ICsoY2hhbiAtIDEpIHRpbWVzIHRoZW4gQU5EZWQgd2l0aCAxIGZvciBsYXN0IGJpdC4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1NjQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1NjQuYwppbmRleCAzYTQ3YzMwLi4zYWU2NjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTY0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTU2NC5jCkBAIC0xNTQsNyArMTU0LDcgQEAKIAl1bnNpZ25lZCBpbnQgdWlfQ2hhbm5lbDsKIAogCXVpX0NoYW5uZWwgPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQlpZiAodWlfQ2hhbm5lbCA+PSAwICYmIHVpX0NoYW5uZWwgPD0gMzEpIHsKKwlpZiAodWlfQ2hhbm5lbCA8PSAzMSkgewogCQl1aV9UbXBWYWx1ZSA9CiAJCQkodW5zaWduZWQgaW50KSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCk7CiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMjAxNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMjAxNi5jCmluZGV4IDQ1NzkxN2YuLmQzNDhjZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTIwMTYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kyMDE2LmMKQEAgLTExNyw3ICsxMTcsNyBAQAogCXVuc2lnbmVkIGludCB1aV9Ob09mQ2hhbm5lbDsKIAl1bnNpZ25lZCBpbnQgdWlfVGVtcCwgdWlfVGVtcDE7CiAJdWlfTm9PZkNoYW5uZWwgPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQlpZiAoKHVpX05vT2ZDaGFubmVsIDwgMCkgfHwgKHVpX05vT2ZDaGFubmVsID4gMTUpKSB7CisJaWYgKHVpX05vT2ZDaGFubmVsID4gMTUpIHsKIAkJY29tZWRpX2Vycm9yKGRldiwKIAkJCSJJbnZhbGlkIENoYW5uZWwgTnVtYmVycyAhISEsIENoYW5uZWwgTnVtYmVycyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTVcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI3Miw3ICsyNzIsNyBAQAogCXVuc2lnbmVkIGludCB1aV9UZW1wOwogCXVuc2lnbmVkIGludCB1aV9Ob09mQ2hhbm5lbDsKIAl1aV9Ob09mQ2hhbm5lbCA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCWlmICgodWlfTm9PZkNoYW5uZWwgPCAwKSB8fCAodWlfTm9PZkNoYW5uZWwgPiAxNSkpIHsKKwlpZiAodWlfTm9PZkNoYW5uZWwgPiAxNSkgewogCQljb21lZGlfZXJyb3IoZGV2LAogCQkJIkludmFsaWQgQ2hhbm5lbCBOdW1iZXJzICEhISwgQ2hhbm5lbCBOdW1iZXJzIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxNVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMjIwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMjIwMC5jCmluZGV4IGE4NTNjNjIuLmFhMTU5ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTIyMDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kyMjAwLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAl1bnNpZ25lZCBpbnQgdWlfVG1wVmFsdWUgPSAwOwogCXVuc2lnbmVkIGludCB1aV9DaGFubmVsOwogCXVpX0NoYW5uZWwgPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQlpZiAodWlfQ2hhbm5lbCA+PSAwICYmIHVpX0NoYW5uZWwgPD0gNykgeworCWlmICh1aV9DaGFubmVsIDw9IDcpIHsKIAkJdWlfVG1wVmFsdWUgPSAodW5zaWduZWQgaW50KSBpbncoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTIyMDBfRElHSVRBTF9JUCk7CiAJCSpkYXRhID0gKHVpX1RtcFZhbHVlID4+IHVpX0NoYW5uZWwpICYgMHgxOwogCX0JCQkvKiBpZih1aV9DaGFubmVsID49IDAgJiYgdWlfQ2hhbm5lbCA8PTcpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMTIwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMTIwLmMKaW5kZXggMTY5Y2VlNC4uMTcyZmJhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzEyMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTMxMjAuYwpAQCAtMTQ2OCw3ICsxNDY4LDcgQEAKIAlpbnRfYW1jYyA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBTUNDX09QX1JFR19JTlRDU1IpOwkvKiAgZ2V0IEFNQ0MgaW50IHJlZ2lzdGVyICovCiAKIAlpZiAoKCFpbnRfZGFxKSAmJiAoIShpbnRfYW1jYyAmIEFOWV9TNTkzWF9JTlQpKSkgewotCQljb21lZGlfZXJyb3IoZGV2LCAiSVJRIGZyb20gdW5rbm93IHNvdXJjZSIpOworCQljb21lZGlfZXJyb3IoZGV2LCAiSVJRIGZyb20gdW5rbm93biBzb3VyY2UiKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjM1MCw3ICsyMzUwLDcgQEAKIAl1aV9DaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CS8qICBjaGFubmVsIHNwZWNpZmllZCAqLwogCiAJLyogdGhpc19ib2FyZC0+aV9od2Rydl9JbnNuUmVhZERpZ2l0YWxJbnB1dChkZXYsdWlfQ2hhbixkYXRhKTsgKi8KLQlpZiAodWlfQ2hhbiA+PSAwICYmIHVpX0NoYW4gPD0gMykgeworCWlmICh1aV9DaGFuIDw9IDMpIHsKIAkJdWlfVG1wVmFsdWUgPSAodW5zaWduZWQgaW50KSBpbncoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTMxMjBfUkRfU1RBVFVTKTsKIAogLyoKQEAgLTI1MzksOCArMjUzOSw3IEBACiAJCQkiTm90IGEgdmFsaWQgRGF0YSAhISEgLERhdGEgc2hvdWxkIGJlIDEgb3IgMFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoKHVpX05vT2ZDaGFubmVsID4gKHRoaXNfYm9hcmQtPmlfTmJyRG9DaGFubmVsIC0gMSkpCi0JCXx8ICh1aV9Ob09mQ2hhbm5lbCA8IDApKSB7CisJaWYgKHVpX05vT2ZDaGFubmVsID4gdGhpc19ib2FyZC0+aV9OYnJEb0NoYW5uZWwgLSAxKSB7CiAJCWNvbWVkaV9lcnJvcihkZXYsCiAJCQkiVGhpcyBib2FyZCBkb2Vzbid0IGhhdmUgc3BlY2lmaWVkIGNoYW5uZWwgISEhIFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzIwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzIwMC5jCmluZGV4IDAxMDY5N2YuLjk4YzIzODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTMyMDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMjAwLmMKQEAgLTQ2MSw3ICs0NjEsNyBAQAogCWlmIChzX0JvYXJkSW5mb3NbZGV2LT5taW5vcl0uaV9Db25uZWN0aW9uVHlwZSA9PSAxKSB7CiAJCS8qIGlmIGRpZmYgKi8KIAotCQlpZiAoKHVpX0NoYW5uZWxfbnVtID49IDApICYmICh1aV9DaGFubmVsX251bSA8PSAxKSkKKwkJaWYgKHVpX0NoYW5uZWxfbnVtIDw9IDEpCiAJCQlpX0RpZmZDaGFubmVsID0gdWlfQ2hhbm5lbF9udW0sIGlfTW9kdWxlID0gMDsKIAkJZWxzZSBpZiAoKHVpX0NoYW5uZWxfbnVtID49IDIpICYmICh1aV9DaGFubmVsX251bSA8PSAzKSkKIAkJCWlfRGlmZkNoYW5uZWwgPSB1aV9DaGFubmVsX251bSAtIDIsIGlfTW9kdWxlID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTM1MDEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTM1MDEuYwppbmRleCBlZjIxZjAzLi43YjM4ZDE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzNTAxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzUwMS5jCkBAIC03MjQsNyArNzI0LDcgQEAKIAkJQVBDSTM1MDFfVENXX0lSUSkgJiAweDE7CiAKIAlpZiAoKCF1aV9UaW1lcl9BT1dhdGNoZG9nKSkgewotCQljb21lZGlfZXJyb3IoZGV2LCAiSVJRIGZyb20gdW5rbm93IHNvdXJjZSIpOworCQljb21lZGlfZXJyb3IoZGV2LCAiSVJRIGZyb20gdW5rbm93biBzb3VyY2UiKTsKIAkJcmV0dXJuOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpM3h4eC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpM3h4eC5jCmluZGV4IDMzODcyNzguLjFkMWU1ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTN4eHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzeHh4LmMKQEAgLTE0OCw3ICsxNDgsNyBAQAogCQkJLyogVGVzdCB0aGUgY29udmVydCB0aW1lIHZhbHVlICovCiAJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQkJCWlmICgoZHdfUmVsb2FkVmFsdWUgPj0gMCkgJiYgKGR3X1JlbG9hZFZhbHVlIDw9IDY1NTM1KSkgeworCQkJaWYgKGR3X1JlbG9hZFZhbHVlIDw9IDY1NTM1KSB7CiAJCQkJZHdfVGVzdFJlbG9hZFZhbHVlID0gZHdfUmVsb2FkVmFsdWU7CiAKIAkJCQlpZiAoYl9UaW1lQmFzZSA9PSAxKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTYyMDguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNjIwOC5jCmluZGV4IDhlMWJlZmMuLjY5MjVmYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNjIwOC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNjIwOC5jCkBAIC0xMzMsOSArMTMzLDExIEBACiBzdGF0aWMgaW50IHBjaTYyMDhfYW9fcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSk7Ci0vKiBzdGF0aWMgaW50IHBjaTYyMDhfZGlvX2luc25fYml0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAqLworLyogc3RhdGljIGludCBwY2k2MjA4X2Rpb19pbnNuX2JpdHMgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisgKiAJCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAqLwogLyogc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSk7ICovCi0vKiBzdGF0aWMgaW50IHBjaTYyMDhfZGlvX2luc25fY29uZmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICovCisvKiBzdGF0aWMgaW50IHBjaTYyMDhfZGlvX2luc25fY29uZmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisgKiAJCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAqLwogLyogc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSk7ICovCiAKIC8qCkBAIC0xNTEsNyArMTUzLDcgQEAKIAlpbnQgcmV0dmFsOwogCXVuc2lnbmVkIGxvbmcgaW9fYmFzZTsKIAotCXByaW50aygiY29tZWRpJWQ6IHBjaTYyMDg6ICIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBwY2k2MjA4OiAiLCBkZXYtPm1pbm9yKTsKIAogCXJldHZhbCA9IGFsbG9jX3ByaXZhdGUoZGV2LCBzaXplb2Yoc3RydWN0IHBjaTYyMDhfcHJpdmF0ZSkpOwogCWlmIChyZXR2YWwgPCAwKQpAQCAtMTk1LDcgKzE5Nyw3IEBACiAJLyogcy0+aW5zbl9iaXRzID0gcGNpNjIwOF9kaW9faW5zbl9iaXRzOyAqLwogCS8qIHMtPmluc25fY29uZmlnID0gcGNpNjIwOF9kaW9faW5zbl9jb25maWc7ICovCiAKLQlwcmludGsoImF0dGFjaGVkXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJhdHRhY2hlZFxuIik7CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTIxMCwxMiArMjEyLDExIEBACiAgKi8KIHN0YXRpYyBpbnQgcGNpNjIwOF9kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKLQlwcmludGsoImNvbWVkaSVkOiBwY2k2MjA4OiByZW1vdmVcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBwY2k2MjA4OiByZW1vdmVcbiIsIGRldi0+bWlub3IpOwogCiAJaWYgKGRldnByaXYgJiYgZGV2cHJpdi0+cGNpX2RldikgewotCQlpZiAoZGV2LT5pb2Jhc2UpIHsKKwkJaWYgKGRldi0+aW9iYXNlKQogCQkJY29tZWRpX3BjaV9kaXNhYmxlKGRldnByaXYtPnBjaV9kZXYpOwotCQl9CiAJCXBjaV9kZXZfcHV0KGRldnByaXYtPnBjaV9kZXYpOwogCX0KIApAQCAtMjY2LDcgKzI2Nyw4IEBACiAgKiB1c2VmdWwgdG8gYXBwbGljYXRpb25zIGlmIHlvdSBpbXBsZW1lbnQgdGhlIGluc25fYml0cyBpbnRlcmZhY2UuCiAgKiBUaGlzIGFsbG93cyBwYWNrZWQgcmVhZGluZy93cml0aW5nIG9mIHRoZSBESU8gY2hhbm5lbHMuICBUaGUKICAqIGNvbWVkaSBjb3JlIGNhbiBjb252ZXJ0IGJldHdlZW4gaW5zbl9iaXRzIGFuZCBpbnNuX3JlYWQvd3JpdGUgKi8KLS8qIHN0YXRpYyBpbnQgcGNpNjIwOF9kaW9faW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICovCisvKiBzdGF0aWMgaW50IHBjaTYyMDhfZGlvX2luc25fYml0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorICogCQkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgKi8KIC8qIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpICovCiAvKiB7ICovCiAvKiBpZihpbnNuLT5uIT0yKXJldHVybiAtRUlOVkFMOyAqLwpAQCAtMjkwLDcgKzI5Miw4IEBACiAvKiByZXR1cm4gMjsgKi8KIC8qIH0gKi8KIAotLyogc3RhdGljIGludCBwY2k2MjA4X2Rpb19pbnNuX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAqLworLyogc3RhdGljIGludCBwY2k2MjA4X2Rpb19pbnNuX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorICogCQkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgKi8KIC8qIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpICovCiAvKiB7ICovCiAvKiBpbnQgY2hhbj1DUl9DSEFOKGluc24tPmNoYW5zcGVjKTsgKi8KQEAgLTMyMCwxMCArMzIzLDE2IEBACiAJICAgICBwY2lfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2RldikpIHsKIAkJaWYgKHBjaV9kZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FETElOSykgewogCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGNpNjIwOF9ib2FyZHMpOyBpKyspIHsKLQkJCQlpZiAocGNpNjIwOF9ib2FyZHNbaV0uZGV2X2lkID09IHBjaV9kZXYtPmRldmljZSkgewotCQkJCQkvKiAgd2FzIGEgcGFydGljdWxhciBidXMvc2xvdCByZXF1ZXN0ZWQ/ICovCisJCQkJaWYgKHBjaTYyMDhfYm9hcmRzW2ldLmRldl9pZCA9PQorCQkJCQlwY2lfZGV2LT5kZXZpY2UpIHsKKwkJCQkJLyoKKwkJCQkJICogd2FzIGEgcGFydGljdWxhciBidXMvc2xvdCByZXF1ZXN0ZWQ/CisJCQkJCSovCiAJCQkJCWlmICgoYnVzICE9IDApIHx8IChzbG90ICE9IDApKSB7Ci0JCQkJCQkvKiAgYXJlIHdlIG9uIHRoZSB3cm9uZyBidXMvc2xvdD8gKi8KKwkJCQkJCS8qCisJCQkJCQkgKiBhcmUgd2Ugb24gdGhlCisJCQkJCQkgKiB3cm9uZyBidXMvc2xvdD8KKwkJCQkJCSovCiAJCQkJCQlpZiAocGNpX2Rldi0+YnVzLT5udW1iZXIKIAkJCQkJCSAgICAhPSBidXMgfHwKIAkJCQkJCSAgICBQQ0lfU0xPVChwY2lfZGV2LT5kZXZmbikKQEAgLTMzOCw4ICszNDcsOSBAQAogCQl9CiAJfQogCi0JcHJpbnRrKCJjb21lZGklZDogbm8gc3VwcG9ydGVkIGJvYXJkIGZvdW5kISAocmVxLiBidXMvc2xvdCA6ICVkLyVkKVxuIiwKLQkgICAgICAgZGV2LT5taW5vciwgYnVzLCBzbG90KTsKKwlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiBubyBzdXBwb3J0ZWQgYm9hcmQgZm91bmQhICIKKwkJCSIocmVxLiBidXMvc2xvdCA6ICVkLyVkKVxuIiwKKwkJCWRldi0+bWlub3IsIGJ1cywgc2xvdCk7CiAJcmV0dXJuIC1FSU87CiAKIGZvdW5kOgpAQCAtMzY4LDE3ICszNzgsMjAgQEAKIAogCS8qICBFbmFibGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCByZWdpb25zICovCiAJaWYgKGNvbWVkaV9wY2lfZW5hYmxlKHBjaV9kZXYsIFBDSTYyMDhfRFJJVkVSX05BTUUpIDwgMCkgewotCQlwcmludGsKLQkJICAgICgiY29tZWRpJWQ6IEZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCByZWdpb25zXG4iLAotCQkgICAgIGRldl9taW5vcik7CisJCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IEZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZSAiCisJCQkiYW5kIHJlcXVlc3QgcmVnaW9uc1xuIiwKKwkJCWRldl9taW5vcik7CiAJCXJldHVybiAtRUlPOwogCX0KLQkvKiAgUmVhZCBsb2NhbCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBbUENJX0JBU0VfQUREUkVTUyAjMV0uICovCisJLyogUmVhZCBsb2NhbCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisJICogYmFzZSBhZGRyZXNzIFtQQ0lfQkFTRV9BRERSRVNTICMxXS4KKwkgKi8KIAlsY3JfaW9fYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAxKTsKIAlsY3JfaW9fcmFuZ2UgPSBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDEpOwogCi0JcHJpbnRrKCJjb21lZGklZDogbG9jYWwgY29uZmlnIHJlZ2lzdGVycyBhdCBhZGRyZXNzIDB4JTRseCBbMHglNGx4XVxuIiwKLQkgICAgICAgZGV2X21pbm9yLCBsY3JfaW9fYmFzZSwgbGNyX2lvX3JhbmdlKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogbG9jYWwgY29uZmlnIHJlZ2lzdGVycyBhdCBhZGRyZXNzIgorCQkJIiAweCU0bHggWzB4JTRseF1cbiIsCisJCQlkZXZfbWlub3IsIGxjcl9pb19iYXNlLCBsY3JfaW9fcmFuZ2UpOwogCiAJLyogIFJlYWQgUENJNjIwOCByZWdpc3RlciBiYXNlIGFkZHJlc3MgW1BDSV9CQVNFX0FERFJFU1MgIzJdLiAqLwogCWlvX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTcyOTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNzI5Ni5jCmluZGV4IDRkZTZmYWQuLjg2MDI4NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNzI5Ni5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNzI5Ni5jCkBAIC04Miw4ICs4Miw3IEBACiAJaW50IGJ1cywgc2xvdDsKIAlpbnQgcmV0OwogCi0JcHJpbnRrKCJjb21lZGk6IGF0dGVtcHQgdG8gYXR0YWNoLi4uXG4iKTsKLQlwcmludGsoImNvbWVkaSVkOiBhZGxfcGNpNzQzMlxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IGF0dGFjaCBhZGxfcGNpNzQzMlxuIiwgZGV2LT5taW5vcik7CiAKIAlkZXYtPmJvYXJkX25hbWUgPSAicGNpNzQzMiI7CiAJYnVzID0gaXQtPm9wdGlvbnNbMF07CkBAIC0xMTAsMTQgKzEwOSwxNCBAQAogCQkJfQogCQkJZGV2cHJpdi0+cGNpX2RldiA9IHBjaWRldjsKIAkJCWlmIChjb21lZGlfcGNpX2VuYWJsZShwY2lkZXYsICJhZGxfcGNpNzI5NiIpIDwgMCkgewotCQkJCXByaW50awotCQkJCSAgICAoImNvbWVkaSVkOiBGYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgcmVnaW9uc1xuIiwKKwkJCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiBGYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgcmVnaW9uc1xuIiwKIAkJCQkgICAgIGRldi0+bWlub3IpOwogCQkJCXJldHVybiAtRUlPOwogCQkJfQogCiAJCQlkZXYtPmlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDIpOwotCQkJcHJpbnRrKCJjb21lZGk6IGJhc2UgYWRkciAlNGx4XG4iLCBkZXYtPmlvYmFzZSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJjb21lZGk6IGJhc2UgYWRkciAlNGx4XG4iLAorCQkJCWRldi0+aW9iYXNlKTsKIAogCQkJLyogIGZvdXIgODI1NSBkaWdpdGFsIGlvIHN1YmRldmljZXMgKi8KIAkJCXMgPSBkZXYtPnN1YmRldmljZXMgKyAwOwpAQCAtMTQ1LDI1ICsxNDQsMjUgQEAKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7CiAKLQkJCXByaW50aygiYXR0YWNoZWRcbiIpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgImNvbWVkaSVkOiBhZGxfcGNpNzQzMiBhdHRhY2hlZFxuIiwKKwkJCQlkZXYtPm1pbm9yKTsKIAogCQkJcmV0dXJuIDE7CiAJCX0KIAl9CiAKLQlwcmludGsoImNvbWVkaSVkOiBubyBzdXBwb3J0ZWQgYm9hcmQgZm91bmQhIChyZXEuIGJ1cy9zbG90IDogJWQvJWQpXG4iLAorCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IG5vIHN1cHBvcnRlZCBib2FyZCBmb3VuZCEgKHJlcS4gYnVzL3Nsb3QgOiAlZC8lZClcbiIsCiAJICAgICAgIGRldi0+bWlub3IsIGJ1cywgc2xvdCk7CiAJcmV0dXJuIC1FSU87CiB9CiAKIHN0YXRpYyBpbnQgYWRsX3BjaTcyOTZfZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7Ci0JcHJpbnRrKCJjb21lZGklZDogcGNpNzQzMjogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogcGNpNzQzMjogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKIAogCWlmIChkZXZwcml2ICYmIGRldnByaXYtPnBjaV9kZXYpIHsKLQkJaWYgKGRldi0+aW9iYXNlKSB7CisJCWlmIChkZXYtPmlvYmFzZSkKIAkJCWNvbWVkaV9wY2lfZGlzYWJsZShkZXZwcml2LT5wY2lfZGV2KTsKLQkJfQogCQlwY2lfZGV2X3B1dChkZXZwcml2LT5wY2lfZGV2KTsKIAl9CiAJLyogIGRldGFjaCBmb3VyIDgyNTUgZGlnaXRhbCBpbyBzdWJkZXZpY2VzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTc0MzIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNzQzMi5jCmluZGV4IGUwODQ0YzYuLmI1YTk0OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNzQzMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNzQzMi5jCkBAIC05MCw4ICs5MCw3IEBACiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJaW50IGJ1cywgc2xvdDsKIAotCXByaW50aygiY29tZWRpOiBhdHRlbXB0IHRvIGF0dGFjaC4uLlxuIik7Ci0JcHJpbnRrKCJjb21lZGklZDogYWRsX3BjaTc0MzJcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBhdHRhY2ggYWRsX3BjaTc0MzJcbiIsIGRldi0+bWlub3IpOwogCiAJZGV2LT5ib2FyZF9uYW1lID0gInBjaTc0MzIiOwogCWJ1cyA9IGl0LT5vcHRpb25zWzBdOwpAQCAtMTE4LDEzICsxMTcsMTMgQEAKIAkJCX0KIAkJCWRldnByaXYtPnBjaV9kZXYgPSBwY2lkZXY7CiAJCQlpZiAoY29tZWRpX3BjaV9lbmFibGUocGNpZGV2LCAiYWRsX3BjaTc0MzIiKSA8IDApIHsKLQkJCQlwcmludGsKLQkJCQkgICAgKCJjb21lZGklZDogRmFpbGVkIHRvIGVuYWJsZSBQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IHJlZ2lvbnNcbiIsCisJCQkJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogRmFpbGVkIHRvIGVuYWJsZSBQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IHJlZ2lvbnNcbiIsCiAJCQkJICAgICBkZXYtPm1pbm9yKTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KIAkJCWRldi0+aW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMik7Ci0JCQlwcmludGsoImNvbWVkaTogYmFzZSBhZGRyICU0bHhcbiIsIGRldi0+aW9iYXNlKTsKKwkJCXByaW50ayhLRVJOX0lORk8gImNvbWVkaTogYmFzZSBhZGRyICU0bHhcbiIsCisJCQkJZGV2LT5pb2Jhc2UpOwogCiAJCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgMDsKIAkJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESTsKQEAgLTE0OCwyNSArMTQ3LDI0IEBACiAJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOwogCQkJcy0+aW5zbl9iaXRzID0gYWRsX3BjaTc0MzJfZG9faW5zbl9iaXRzOwogCi0JCQlwcmludGsoImNvbWVkaTogYXR0YWNoZWRcbiIpOwotCisJCQlwcmludGsoS0VSTl9ERUJVRyAiY29tZWRpJWQ6IGFkbF9wY2k3NDMyIGF0dGFjaGVkXG4iLAorCQkJCWRldi0+bWlub3IpOwogCQkJcmV0dXJuIDE7CiAJCX0KIAl9CiAKLQlwcmludGsoImNvbWVkaSVkOiBubyBzdXBwb3J0ZWQgYm9hcmQgZm91bmQhIChyZXEuIGJ1cy9zbG90IDogJWQvJWQpXG4iLAorCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IG5vIHN1cHBvcnRlZCBib2FyZCBmb3VuZCEgKHJlcS4gYnVzL3Nsb3QgOiAlZC8lZClcbiIsCiAJICAgICAgIGRldi0+bWlub3IsIGJ1cywgc2xvdCk7CiAJcmV0dXJuIC1FSU87CiB9CiAKIHN0YXRpYyBpbnQgYWRsX3BjaTc0MzJfZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7Ci0JcHJpbnRrKCJjb21lZGklZDogcGNpNzQzMjogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogcGNpNzQzMjogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKIAogCWlmIChkZXZwcml2ICYmIGRldnByaXYtPnBjaV9kZXYpIHsKLQkJaWYgKGRldi0+aW9iYXNlKSB7CisJCWlmIChkZXYtPmlvYmFzZSkKIAkJCWNvbWVkaV9wY2lfZGlzYWJsZShkZXZwcml2LT5wY2lfZGV2KTsKLQkJfQogCQlwY2lfZGV2X3B1dChkZXZwcml2LT5wY2lfZGV2KTsKIAl9CiAKQEAgLTE3OCw4ICsxNzYsOCBAQAogCQkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCiAJCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKLQlwcmludGsoImNvbWVkaTogcGNpNzQzMl9kb19pbnNuX2JpdHMgY2FsbGVkXG4iKTsKLQlwcmludGsoImNvbWVkaTogZGF0YTA6ICU4eCBkYXRhMTogJTh4XG4iLCBkYXRhWzBdLCBkYXRhWzFdKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiY29tZWRpOiBwY2k3NDMyX2RvX2luc25fYml0cyBjYWxsZWRcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJjb21lZGk6IGRhdGEwOiAlOHggZGF0YTE6ICU4eFxuIiwgZGF0YVswXSwgZGF0YVsxXSk7CiAKIAlpZiAoaW5zbi0+biAhPSAyKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE4OCw3ICsxODYsNyBAQAogCQlzLT5zdGF0ZSAmPSB+ZGF0YVswXTsKIAkJcy0+c3RhdGUgfD0gKGRhdGFbMF0gJiBkYXRhWzFdKTsKIAotCQlwcmludGsoImNvbWVkaTogb3V0OiAlOHggb24gaW9iYXNlICU0bHhcbiIsIHMtPnN0YXRlLAorCQlwcmludGsoS0VSTl9ERUJVRyAiY29tZWRpOiBvdXQ6ICU4eCBvbiBpb2Jhc2UgJTRseFxuIiwgcy0+c3RhdGUsCiAJCSAgICAgICBkZXYtPmlvYmFzZSArIFBDSTc0MzJfRE8pOwogCQlvdXRsKHMtPnN0YXRlICYgMHhmZmZmZmZmZiwgZGV2LT5pb2Jhc2UgKyBQQ0k3NDMyX0RPKTsKIAl9CkBAIC0yMDAsMTQgKzE5OCwxNCBAQAogCQkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCiAJCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKLQlwcmludGsoImNvbWVkaTogcGNpNzQzMl9kaV9pbnNuX2JpdHMgY2FsbGVkXG4iKTsKLQlwcmludGsoImNvbWVkaTogZGF0YTA6ICU4eCBkYXRhMTogJTh4XG4iLCBkYXRhWzBdLCBkYXRhWzFdKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiY29tZWRpOiBwY2k3NDMyX2RpX2luc25fYml0cyBjYWxsZWRcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJjb21lZGk6IGRhdGEwOiAlOHggZGF0YTE6ICU4eFxuIiwgZGF0YVswXSwgZGF0YVsxXSk7CiAKIAlpZiAoaW5zbi0+biAhPSAyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWRhdGFbMV0gPSBpbmwoZGV2LT5pb2Jhc2UgKyBQQ0k3NDMyX0RJKSAmIDB4ZmZmZmZmZmY7Ci0JcHJpbnRrKCJjb21lZGk6IGRhdGExICU4eFxuIiwgZGF0YVsxXSk7CisJcHJpbnRrKEtFUk5fREVCVUcgImNvbWVkaTogZGF0YTEgJTh4XG4iLCBkYXRhWzFdKTsKIAogCXJldHVybiAyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k4MTY0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTgxNjQuYwppbmRleCA0Mzc0NWVjLi5kYTI1NmExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTgxNjQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTgxNjQuYwpAQCAtMzUsNiArMzUsNyBAQAogKi8KIAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAjaW5jbHVkZSAiY29tZWRpX3BjaS5oIgpAQCAtMTI4LDggKzEyOSw4IEBACiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJaW50IGJ1cywgc2xvdDsKIAotCXByaW50aygiY29tZWRpOiBhdHRlbXB0IHRvIGF0dGFjaC4uLlxuIik7Ci0JcHJpbnRrKCJjb21lZGklZDogYWRsX3BjaTgxNjRcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaTogYXR0ZW1wdCB0byBhdHRhY2guLi5cbiIpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBhZGxfcGNpODE2NFxuIiwgZGV2LT5taW5vcik7CiAKIAlkZXYtPmJvYXJkX25hbWUgPSAicGNpODE2NCI7CiAJYnVzID0gaXQtPm9wdGlvbnNbMF07CkBAIC0xNTAsMTkgKzE1MSwxOCBAQAogCQkJaWYgKGJ1cyB8fCBzbG90KSB7CiAJCQkJLyogcmVxdWVzdGVkIHBhcnRpY3VsYXIgYnVzL3Nsb3QgKi8KIAkJCQlpZiAocGNpZGV2LT5idXMtPm51bWJlciAhPSBidXMKLQkJCQkgICAgfHwgUENJX1NMT1QocGNpZGV2LT5kZXZmbikgIT0gc2xvdCkgeworCQkJCQl8fCBQQ0lfU0xPVChwY2lkZXYtPmRldmZuKSAhPSBzbG90KQogCQkJCQljb250aW51ZTsKLQkJCQl9CiAJCQl9CiAJCQlkZXZwcml2LT5wY2lfZGV2ID0gcGNpZGV2OwogCQkJaWYgKGNvbWVkaV9wY2lfZW5hYmxlKHBjaWRldiwgImFkbF9wY2k4MTY0IikgPCAwKSB7Ci0JCQkJcHJpbnRrCi0JCQkJICAgICgiY29tZWRpJWQ6IEZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCByZWdpb25zXG4iLAotCQkJCSAgICAgZGV2LT5taW5vcik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogRmFpbGVkIHRvIGVuYWJsZSAiCisJCQkJIlBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgcmVnaW9uc1xuIiwgZGV2LT5taW5vcik7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CiAJCQlkZXYtPmlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDIpOwotCQkJcHJpbnRrKCJjb21lZGk6IGJhc2UgYWRkciAlNGx4XG4iLCBkZXYtPmlvYmFzZSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiY29tZWRpOiBiYXNlIGFkZHIgJTRseFxuIiwKKwkJCQkgICBkZXYtPmlvYmFzZSk7CiAKIAkJCXMgPSBkZXYtPnN1YmRldmljZXMgKyAwOwogCQkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1BST0M7CkBAIC0yMDQsMjUgKzIwNCwyNCBAQAogCQkJcy0+aW5zbl9yZWFkID0gYWRsX3BjaTgxNjRfaW5zbl9yZWFkX2J1ZjE7CiAJCQlzLT5pbnNuX3dyaXRlID0gYWRsX3BjaTgxNjRfaW5zbl93cml0ZV9idWYxOwogCi0JCQlwcmludGsoImNvbWVkaTogYXR0YWNoZWRcbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpOiBhdHRhY2hlZFxuIik7CiAKIAkJCXJldHVybiAxOwogCQl9CiAJfQogCi0JcHJpbnRrKCJjb21lZGklZDogbm8gc3VwcG9ydGVkIGJvYXJkIGZvdW5kISAocmVxLiBidXMvc2xvdCA6ICVkLyVkKVxuIiwKLQkgICAgICAgZGV2LT5taW5vciwgYnVzLCBzbG90KTsKKwlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiBubyBzdXBwb3J0ZWQgYm9hcmQgZm91bmQhIgorCQkgICAiKHJlcS4gYnVzL3Nsb3QgOiAlZC8lZClcbiIsIGRldi0+bWlub3IsIGJ1cywgc2xvdCk7CiAJcmV0dXJuIC1FSU87CiB9CiAKIHN0YXRpYyBpbnQgYWRsX3BjaTgxNjRfZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7Ci0JcHJpbnRrKCJjb21lZGklZDogcGNpODE2NDogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogcGNpODE2NDogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKIAogCWlmIChkZXZwcml2ICYmIGRldnByaXYtPnBjaV9kZXYpIHsKLQkJaWYgKGRldi0+aW9iYXNlKSB7CisJCWlmIChkZXYtPmlvYmFzZSkKIAkJCWNvbWVkaV9wY2lfZGlzYWJsZShkZXZwcml2LT5wY2lfZGV2KTsKLQkJfQogCQlwY2lfZGV2X3B1dChkZXZwcml2LT5wY2lfZGV2KTsKIAl9CiAKQEAgLTI2Nyw4ICsyNjYsOSBAQAogCX0KIAogCWRhdGFbMF0gPSBpbncoZGV2LT5pb2Jhc2UgKyBheGlzX3JlZyArIG9mZnNldCk7Ci0JcHJpbnRrKCJjb21lZGk6IHBjaTgxNjQgJXMgcmVhZCAtPiAlMDRYOiUwNFggb24gYXhpcyAlc1xuIiwgYWN0aW9uLAotCSAgICAgICBkYXRhWzBdLCBkYXRhWzFdLCBheGlzbmFtZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgImNvbWVkaTogcGNpODE2NCAlcyByZWFkIC0+ICIKKwkJCQkJCSAgIiUwNFg6JTA0WCBvbiBheGlzICVzXG4iLAorCQkJCWFjdGlvbiwgZGF0YVswXSwgZGF0YVsxXSwgYXhpc25hbWUpOwogfQogCiBzdGF0aWMgaW50IGFkbF9wY2k4MTY0X2luc25fcmVhZF9tc3RzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC0zNDcsOCArMzQ3LDkgQEAKIAogCW91dHcoZGF0YVswXSwgZGV2LT5pb2Jhc2UgKyBheGlzX3JlZyArIG9mZnNldCk7CiAKLQlwcmludGsoImNvbWVkaTogcGNpODE2NCAlcyB3cml0ZSAtPiAlMDRYOiUwNFggb24gYXhpcyAlc1xuIiwgYWN0aW9uLAotCSAgICAgICBkYXRhWzBdLCBkYXRhWzFdLCBheGlzbmFtZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgImNvbWVkaTogcGNpODE2NCAlcyB3cml0ZSAtPiAiCisJCQkJCQkiJTA0WDolMDRYIG9uIGF4aXMgJXNcbiIsCisJCQkJYWN0aW9uLCBkYXRhWzBdLCBkYXRhWzFdLCBheGlzbmFtZSk7CiAKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTE4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTguYwppbmRleCAxZWU0YjZhLi43OTFlYTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTguYwpAQCAtNzgwLDcgKzc4MCw3IEBACiAJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewogCWludCBlcnIgPSAwOwotCWludCB0bXAsIGRpdmlzb3IxLCBkaXZpc29yMjsKKwlpbnQgdG1wLCBkaXZpc29yMSA9IDAsIGRpdmlzb3IyID0gMDsKIAogCS8qIHN0ZXAgMTogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpMTcxMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzEwLmMKaW5kZXggZjBhZTRjMC4uOTUxZTU3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzEwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzEwLmMKQEAgLTgzMCw3ICs4MzAsNyBAQAogc3RhdGljIGludCBwY2kxNzF4X2FpX2RvY21kX2FuZF9tb2RlKGludCBtb2RlLCBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7Ci0JdW5zaWduZWQgaW50IGRpdmlzb3IxLCBkaXZpc29yMjsKKwl1bnNpZ25lZCBpbnQgZGl2aXNvcjEgPSAwLCBkaXZpc29yMiA9IDA7CiAJdW5zaWduZWQgaW50IHNlZ2xlbjsKIAogCURQUklOVEsoImFkdl9wY2kxNzEwIEVEQkc6IEJHTjogcGNpMTcxeF9haV9kb2NtZF9hbmRfbW9kZSglZCwuLi4pXG4iLApAQCAtOTM0LDcgKzkzNCw3IEBACiAJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewogCWludCBlcnIgPSAwOwotCWludCB0bXAsIGRpdmlzb3IxLCBkaXZpc29yMjsKKwlpbnQgdG1wLCBkaXZpc29yMSA9IDAsIGRpdmlzb3IyID0gMDsKIAogCURQUklOVEsoImFkdl9wY2kxNzEwIEVEQkc6IEJHTjogcGNpMTcxeF9haV9jbWR0ZXN0KC4uLilcbiIpOwogI2lmZGVmIFBDSTE3MVhfRVhUREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wYzI2My5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjMjYzLmMKaW5kZXggYzYyYTdlMS4uMTU4MDhlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjMjYzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjMjYzLmMKQEAgLTExNyw3ICsxMTcsOCBAQAogCiAvKiB0aGlzIHN0cnVjdHVyZSBpcyBmb3IgZGF0YSB1bmlxdWUgdG8gdGhpcyBoYXJkd2FyZSBkcml2ZXIuICBJZgogICAgc2V2ZXJhbCBoYXJkd2FyZSBkcml2ZXJzIGtlZXAgc2ltaWxhciBpbmZvcm1hdGlvbiBpbiB0aGlzIHN0cnVjdHVyZSwKLSAgIGZlZWwgZnJlZSB0byBzdWdnZXN0IG1vdmluZyB0aGUgdmFyaWFibGUgdG8gdGhlIHN0cnVjdCBjb21lZGlfZGV2aWNlIHN0cnVjdC4gICovCisgICBmZWVsIGZyZWUgdG8gc3VnZ2VzdCBtb3ZpbmcgdGhlIHZhcmlhYmxlIHRvIHRoZSBzdHJ1Y3QgY29tZWRpX2RldmljZSBzdHJ1Y3QuCisqLwogI2lmZGVmIENPTkZJR19DT01FRElfUENJCiBzdHJ1Y3QgcGMyNjNfcHJpdmF0ZSB7CiAJLyogUENJIGRldmljZS4gKi8KQEAgLTI4MSw3ICsyODIsOCBAQAogCQlyZXQgPSBjb21lZGlfcGNpX2VuYWJsZShwY2lfZGV2LCBQQzI2M19EUklWRVJfTkFNRSk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiY29tZWRpJWQ6IGVycm9yISBjYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgcmVnaW9ucyFcbiIsCisJCQkgICAgICAgImNvbWVkaSVkOiBlcnJvciEgY2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlIGFuZCAiCisJCQkJInJlcXVlc3QgcmVnaW9ucyFcbiIsCiAJCQkgICAgICAgZGV2LT5taW5vcik7CiAJCQlyZXR1cm4gcmV0OwogCQl9CkBAIC0yOTAsOSArMjkyLDggQEAKICNlbmRpZgogCXsKIAkJcmV0ID0gcGMyNjNfcmVxdWVzdF9yZWdpb24oZGV2LT5taW5vciwgaW9iYXNlLCBQQzI2M19JT19TSVpFKTsKLQkJaWYgKHJldCA8IDApIHsKKwkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwotCQl9CiAJfQogCWRldi0+aW9iYXNlID0gaW9iYXNlOwogCkBAIC0zNTAsMjEgKzM1MSwxOCBAQAogCSAgICAgICBQQzI2M19EUklWRVJfTkFNRSk7CiAKICNpZmRlZiBDT05GSUdfQ09NRURJX1BDSQotCWlmIChkZXZwcml2KQorCWlmIChkZXZwcml2KSB7CiAjZW5kaWYKLQl7CiAjaWZkZWYgQ09ORklHX0NPTUVESV9QQ0kKIAkJaWYgKGRldnByaXYtPnBjaV9kZXYpIHsKLQkJCWlmIChkZXYtPmlvYmFzZSkgeworCQkJaWYgKGRldi0+aW9iYXNlKQogCQkJCWNvbWVkaV9wY2lfZGlzYWJsZShkZXZwcml2LT5wY2lfZGV2KTsKLQkJCX0KIAkJCXBjaV9kZXZfcHV0KGRldnByaXYtPnBjaV9kZXYpOwogCQl9IGVsc2UKICNlbmRpZgogCQl7Ci0JCQlpZiAoZGV2LT5pb2Jhc2UpIHsKKwkJCWlmIChkZXYtPmlvYmFzZSkKIAkJCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmlvYmFzZSwgUEMyNjNfSU9fU0laRSk7Ci0JCQl9CiAJCX0KIAl9CiAJaWYgKGRldi0+Ym9hcmRfbmFtZSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX2RhczE2X2NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfZGFzMTZfY3MuYwppbmRleCAzOTkyM2NiLi5iYzM3NWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfZGFzMTZfY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfZGFzMTZfY3MuYwpAQCAtMzcyLDcgKzM3Miw3IEBACiAKIAkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCi0JLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KKwkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX1RJTUVSICYmCiAJICAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19FWFQpCiAJCWVycisrOwpAQCAtNDUyLDcgKzQ1Miw3IEBACiAJLyogc3RlcCA0OiBmaXggdXAgYW55IGFyZ3VtZW50cyAqLwogCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewotCQl1bnNpZ25lZCBpbnQgZGl2MSwgZGl2MjsKKwkJdW5zaWduZWQgaW50IGRpdjEgPSAwLCBkaXYyID0gMDsKIAogCQl0bXAgPSBjbWQtPnNjYW5fYmVnaW5fYXJnOwogCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKDEwMCwgJmRpdjEsICZkaXYyLApAQCAtNDYyLDcgKzQ2Miw3IEBACiAJCQllcnIrKzsKIAl9CiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCQl1bnNpZ25lZCBpbnQgZGl2MSwgZGl2MjsKKwkJdW5zaWduZWQgaW50IGRpdjEgPSAwLCBkaXYyID0gMDsKIAogCQl0bXAgPSBjbWQtPmNvbnZlcnRfYXJnOwogCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKDEwMCwgJmRpdjEsICZkaXYyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRkYS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRkYS5jCmluZGV4IDdhNWQ0NmUuLjc4MjM1NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkZGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGRhLmMKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogCiAJLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIAotCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCisJLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19USU1FUgogCSAgICAmJiBjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUKQogCQllcnIrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkaW8uYwppbmRleCAwOWU2ZTNiLi43ZGFhZDBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRpby5jCkBAIC0xMDksMTIgKzEwOSwxMiBAQAogICAgc2V2ZXJhbCBoYXJkd2FyZSBkcml2ZXJzIGtlZXAgc2ltaWxhciBpbmZvcm1hdGlvbiBpbiB0aGlzIHN0cnVjdHVyZSwKICAgIGZlZWwgZnJlZSB0byBzdWdnZXN0IG1vdmluZyB0aGUgdmFyaWFibGUgdG8gdGhlIHN0cnVjdCBjb21lZGlfZGV2aWNlIHN0cnVjdC4gICovCiBzdHJ1Y3QgcGNpZGlvX3ByaXZhdGUgewotCWludCBkYXRhOwkJLyogIGN1cmVudGx5IHVudXNlZCAqLworCWludCBkYXRhOwkJLyogIGN1cnJlbnRseSB1bnVzZWQgKi8KIAogCS8qIHdvdWxkIGJlIHVzZWZ1bCBmb3IgYSBQQ0kgZGV2aWNlICovCiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CiAKLQkvKiB1c2VkIGZvciBETyByZWFkYmFjaywgY3VyZW50bHkgdW51c2VkICovCisJLyogdXNlZCBmb3IgRE8gcmVhZGJhY2ssIGN1cnJlbnRseSB1bnVzZWQgKi8KIAl1bnNpZ25lZCBpbnQgZG9fcmVhZGJhY2tbNF07CS8qIHVwIHRvIDQgdW5zaWduZWQgaW50IHN1ZmZpY2UgdG8gaG9sZCA5NiBiaXRzIGZvciBQQ0ktRElPOTYgKi8KIAogCXVuc2lnbmVkIGxvbmcgZGlvX3JlZ19iYXNlOwkvKiAgYWRkcmVzcyBvZiBwb3J0IEEgb2YgdGhlIGZpcnN0IDgyNTUgY2hpcCBvbiBib2FyZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5jCmluZGV4IGY3ODExNTQuLjYzYmU2MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAogCXJldHZhbCA9IGNvbWVkaV9idWZfd3JpdGVfYWxsb2MoYXN5bmMsIG51bV9ieXRlcyk7CiAJaWYgKHJldHZhbCAhPSBudW1fYnl0ZXMpIHsKLQkJcHJpbnRrKCJjb21lZGk6IGJ1ZmZlciBvdmVycnVuXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY29tZWRpOiBidWZmZXIgb3ZlcnJ1blxuIik7CiAJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOwogCQlyZXR1cm4gMDsKIAl9CkBAIC02NSw3ICs2NSw2IEBACiAKIAlyZXR1cm4gbnVtX2J5dGVzOwogfQotCiBFWFBPUlRfU1lNQk9MKGNmY193cml0ZV9hcnJheV90b19idWZmZXIpOwogCiB1bnNpZ25lZCBpbnQgY2ZjX3JlYWRfYXJyYXlfZnJvbV9idWZmZXIoc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnN1YmQsCkBAIC04NCw3ICs4Myw2IEBACiAKIAlyZXR1cm4gbnVtX2J5dGVzOwogfQotCiBFWFBPUlRfU1lNQk9MKGNmY19yZWFkX2FycmF5X2Zyb21fYnVmZmVyKTsKIAogdW5zaWduZWQgaW50IGNmY19oYW5kbGVfZXZlbnRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC0xMDIsNyArMTAwLDYgQEAKIAogCXJldHVybiBldmVudHM7CiB9Ci0KIEVYUE9SVF9TWU1CT0woY2ZjX2hhbmRsZV9ldmVudHMpOwogCiBNT0RVTEVfQVVUSE9SKCJGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZG1tMzJhdC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RtbTMyYXQuYwppbmRleCBhZWVjMWVlLi45ZGI5YTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZG1tMzJhdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kbW0zMmF0LmMKQEAgLTYyOSw3ICs2MjksNyBAQAogCiAJLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIAotCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCisJLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19USU1FUiAmJgogCSAgICBjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUKQogCQllcnIrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTQuYwppbmRleCAwMzY0YmJmLi5lMWI3Mzc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODE0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxNC5jCkBAIC0xNzUsNyArMTc1LDcgQEAKIAogCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKLQkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLworCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLwogCWlmIChjbWQtPnN0b3Bfc3JjICE9IFRSSUdfVElNRVIgJiYgY21kLT5zdG9wX3NyYyAhPSBUUklHX0VYVCkKIAkJZXJyKys7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MnguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MnguYwppbmRleCBhNGM5NmMwLi45OWNhMjk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODJ4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgyeC5jCkBAIC03NzcsNyArNzc3LDcgQEAKIAogCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKLQkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLworCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLwogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRk9MTE9XICYmCiAJICAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19FWFQpCiAJCWVycisrOwpAQCAtMTA1MCw3ICsxMDUwLDcgQEAKIAogCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKLQkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLworCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLwogCWlmIChjbWQtPnN0b3Bfc3JjICE9IFRSSUdfQ09VTlQgJiYgY21kLT5zdG9wX3NyYyAhPSBUUklHX05PTkUpCiAJCWVycisrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZ3NjX2hwZGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9nc2NfaHBkaS5jCmluZGV4IDBiYjMwMTYuLjUxZjEyYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9nc2NfaHBkaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9nc2NfaHBkaS5jCkBAIC01NSw3ICs1NSw3IEBACiAKIHN0YXRpYyBpbnQgaHBkaV9hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KTsKIHN0YXRpYyBpbnQgaHBkaV9kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldik7Ci12b2lkIGFib3J0X2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCk7CitzdGF0aWMgdm9pZCBhYm9ydF9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwpOwogc3RhdGljIGludCBocGRpX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyk7CiBzdGF0aWMgaW50IGhwZGlfY21kX3Rlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCk7CkBAIC0xMTAsNyArMTEwLDggQEAKIGludCBjb21tYW5kX2NoYW5uZWxfdmFsaWQodW5zaWduZWQgaW50IGNoYW5uZWwpCiB7CiAJaWYgKGNoYW5uZWwgPT0gMCB8fCBjaGFubmVsID4gNikgewotCQlwcmludGsoImdzY19ocGRpOiBidWchIGludmFsaWQgY2FibGUgY29tbWFuZCBjaGFubmVsXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgImdzY19ocGRpOiBidWchIGludmFsaWQgY2FibGUgY29tbWFuZCBjaGFubmVsXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldHVybiAxOwpAQCAtMTQyLDcgKzE0Myw4IEBACiAJUlhfRklGT19SRVNFVF9CSVQgPSAweDQsCiAJVFhfRU5BQkxFX0JJVCA9IDB4MTAsCiAJUlhfRU5BQkxFX0JJVCA9IDB4MjAsCi0JREVNQU5EX0RNQV9ESVJFQ1RJT05fVFhfQklUID0gMHg0MCwJLyogZm9yIGNoYW5uZWwgMCwgY2hhbm5lbCAxIGNhbiBvbmx5IHRyYW5zbWl0ICh3aGVuIHByZXNlbnQpICovCisJREVNQU5EX0RNQV9ESVJFQ1RJT05fVFhfQklUID0gMHg0MCwKKwkJLyogZm9yIGNoIDAsIGNoIDEgY2FuIG9ubHkgdHJhbnNtaXQgKHdoZW4gcHJlc2VudCkgKi8KIAlMSU5FX1ZBTElEX09OX1NUQVRVU19WQUxJRF9CSVQgPSAweDgwLAogCVNUQVJUX1RYX0JJVCA9IDB4MTAsCiAJQ0FCTEVfVEhST1RUTEVfRU5BQkxFX0JJVCA9IDB4MjAsCkBAIC00MjAsOSArNDIyLDExIEBACiAJYml0cyB8PSBQTFhfRE1BX0VOX1JFQURZSU5fQklUOwogCS8qICBlbmFibGUgZG1hIGNoYWluaW5nICovCiAJYml0cyB8PSBQTFhfRU5fQ0hBSU5fQklUOwotCS8qICBlbmFibGUgaW50ZXJydXB0IG9uIGRtYSBkb25lIChwcm9iYWJseSBkb24ndCBuZWVkIHRoaXMsIHNpbmNlIGNoYWluIG5ldmVyIGZpbmlzaGVzKSAqLworCS8qICBlbmFibGUgaW50ZXJydXB0IG9uIGRtYSBkb25lCisJICogIChwcm9iYWJseSBkb24ndCBuZWVkIHRoaXMsIHNpbmNlIGNoYWluIG5ldmVyIGZpbmlzaGVzKSAqLwogCWJpdHMgfD0gUExYX0VOX0RNQV9ET05FX0lOVFJfQklUOwotCS8qICBkb24ndCBpbmNyZW1lbnQgbG9jYWwgYWRkcmVzcyBkdXJpbmcgdHJhbnNmZXJzICh3ZSBhcmUgdHJhbnNmZXJyaW5nIGZyb20gYSBmaXhlZCBmaWZvIHJlZ2lzdGVyKSAqLworCS8qICBkb24ndCBpbmNyZW1lbnQgbG9jYWwgYWRkcmVzcyBkdXJpbmcgdHJhbnNmZXJzCisJICogICh3ZSBhcmUgdHJhbnNmZXJyaW5nIGZyb20gYSBmaXhlZCBmaWZvIHJlZ2lzdGVyKSAqLwogCWJpdHMgfD0gUExYX0xPQ0FMX0FERFJfQ09OU1RfQklUOwogCS8qICByb3V0ZSBkbWEgaW50ZXJydXB0IHRvIHBjaSBidXMgKi8KIAliaXRzIHw9IFBMWF9ETUFfSU5UUl9QQ0lfQklUOwpAQCAtNTYwLDcgKzU2NCw3IEBACiAJaW50IGk7CiAJaW50IHJldHZhbDsKIAotCXByaW50aygiY29tZWRpJWQ6IGdzY19ocGRpXG4iLCBkZXYtPm1pbm9yKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJjb21lZGklZDogZ3NjX2hwZGlcbiIsIGRldi0+bWlub3IpOwogCiAJaWYgKGFsbG9jX3ByaXZhdGUoZGV2LCBzaXplb2Yoc3RydWN0IGhwZGlfcHJpdmF0ZSkpIDwgMCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC01ODgsMTEgKzU5MiwxMiBAQAogCQl9IHdoaWxlIChwY2lkZXYgIT0gTlVMTCk7CiAJfQogCWlmIChkZXYtPmJvYXJkX3B0ciA9PSBOVUxMKSB7Ci0JCXByaW50aygiZ3NjX2hwZGk6IG5vIGhwZGkgY2FyZCBmb3VuZFxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImdzY19ocGRpOiBubyBocGRpIGNhcmQgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlwcmludGsoImdzY19ocGRpOiBmb3VuZCAlcyBvbiBidXMgJWksIHNsb3QgJWlcbiIsIGJvYXJkKGRldiktPm5hbWUsCisJcHJpbnRrKEtFUk5fV0FSTklORworCSAgICAgICAiZ3NjX2hwZGk6IGZvdW5kICVzIG9uIGJ1cyAlaSwgc2xvdCAlaVxuIiwgYm9hcmQoZGV2KS0+bmFtZSwKIAkgICAgICAgcGNpZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QocGNpZGV2LT5kZXZmbikpOwogCiAJaWYgKGNvbWVkaV9wY2lfZW5hYmxlKHBjaWRldiwgZHJpdmVyX2hwZGkuZHJpdmVyX25hbWUpKSB7CkBAIC02MTgsNyArNjIzLDcgQEAKIAkgICAgaW9yZW1hcChwcml2KGRldiktPmhwZGlfcGh5c19pb2Jhc2UsCiAJCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBjaWRldiwgSFBESV9CQUREUklOREVYKSk7CiAJaWYgKCFwcml2KGRldiktPnBseDkwODBfaW9iYXNlIHx8ICFwcml2KGRldiktPmhwZGlfaW9iYXNlKSB7Ci0JCXByaW50aygiIGZhaWxlZCB0byByZW1hcCBpbyBtZW1vcnlcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICIgZmFpbGVkIHRvIHJlbWFwIGlvIG1lbW9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtNjMwLDEyICs2MzUsMTMgQEAKIAkvKiAgZ2V0IGlycSAqLwogCWlmIChyZXF1ZXN0X2lycShwY2lkZXYtPmlycSwgaGFuZGxlX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlkcml2ZXJfaHBkaS5kcml2ZXJfbmFtZSwgZGV2KSkgewotCQlwcmludGsoIiB1bmFibGUgdG8gYWxsb2NhdGUgaXJxICV1XG4iLCBwY2lkZXYtPmlycSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIgdW5hYmxlIHRvIGFsbG9jYXRlIGlycSAldVxuIiwgcGNpZGV2LT5pcnEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJZGV2LT5pcnEgPSBwY2lkZXYtPmlycTsKIAotCXByaW50aygiIGlycSAldVxuIiwgZGV2LT5pcnEpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIiBpcnEgJXVcbiIsIGRldi0+aXJxKTsKIAogCS8qICBhbG9jYXRlIHBjaSBkbWEgYnVmZmVycyAqLwogCWZvciAoaSA9IDA7IGkgPCBOVU1fRE1BX0JVRkZFUlM7IGkrKykgewpAQCAtNjUzLDcgKzY1OSw4IEBACiAJCQkJCQkgICAmcHJpdihkZXYpLT4KIAkJCQkJCSAgIGRtYV9kZXNjX3BoeXNfYWRkcik7CiAJaWYgKHByaXYoZGV2KS0+ZG1hX2Rlc2NfcGh5c19hZGRyICYgMHhmKSB7Ci0JCXByaW50aygiIGRtYSBkZXNjcmlwdG9ycyBub3QgcXVhZC13b3JkIGFsaWduZWQgKGJ1ZylcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiIGRtYSBkZXNjcmlwdG9ycyBub3QgcXVhZC13b3JkIGFsaWduZWQgKGJ1ZylcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTY3Miw0MiArNjc5LDM5IEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlwcmludGsoImNvbWVkaSVkOiBnc2NfaHBkaTogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJjb21lZGklZDogZ3NjX2hwZGk6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CiAKIAlpZiAoZGV2LT5pcnEpCiAJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwotCWlmIChwcml2KGRldikpIHsKLQkJaWYgKHByaXYoZGV2KS0+aHdfZGV2KSB7Ci0JCQlpZiAocHJpdihkZXYpLT5wbHg5MDgwX2lvYmFzZSkgewotCQkJCWRpc2FibGVfcGx4X2ludGVycnVwdHMoZGV2KTsKLQkJCQlpb3VubWFwKCh2b2lkICopcHJpdihkZXYpLT5wbHg5MDgwX2lvYmFzZSk7Ci0JCQl9Ci0JCQlpZiAocHJpdihkZXYpLT5ocGRpX2lvYmFzZSkKLQkJCQlpb3VubWFwKCh2b2lkICopcHJpdihkZXYpLT5ocGRpX2lvYmFzZSk7Ci0JCQkvKiAgZnJlZSBwY2kgZG1hIGJ1ZmZlcnMgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBOVU1fRE1BX0JVRkZFUlM7IGkrKykgewotCQkJCWlmIChwcml2KGRldiktPmRpb19idWZmZXJbaV0pCi0JCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocHJpdihkZXYpLT5od19kZXYsCi0JCQkJCQkJICAgIERNQV9CVUZGRVJfU0laRSwKLQkJCQkJCQkgICAgcHJpdihkZXYpLT4KLQkJCQkJCQkgICAgZGlvX2J1ZmZlcltpXSwKLQkJCQkJCQkgICAgcHJpdgotCQkJCQkJCSAgICAoZGV2KS0+ZGlvX2J1ZmZlcl9waHlzX2FkZHIKLQkJCQkJCQkgICAgW2ldKTsKLQkJCX0KLQkJCS8qICBmcmVlIGRtYSBkZXNjcmlwdG9ycyAqLwotCQkJaWYgKHByaXYoZGV2KS0+ZG1hX2Rlc2MpCi0JCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwcml2KGRldiktPmh3X2RldiwKLQkJCQkJCSAgICBzaXplb2Yoc3RydWN0IHBseF9kbWFfZGVzYykKLQkJCQkJCSAgICAqIE5VTV9ETUFfREVTQ1JJUFRPUlMsCi0JCQkJCQkgICAgcHJpdihkZXYpLT5kbWFfZGVzYywKLQkJCQkJCSAgICBwcml2KGRldiktPgotCQkJCQkJICAgIGRtYV9kZXNjX3BoeXNfYWRkcik7Ci0JCQlpZiAocHJpdihkZXYpLT5ocGRpX3BoeXNfaW9iYXNlKSB7Ci0JCQkJY29tZWRpX3BjaV9kaXNhYmxlKHByaXYoZGV2KS0+aHdfZGV2KTsKLQkJCX0KLQkJCXBjaV9kZXZfcHV0KHByaXYoZGV2KS0+aHdfZGV2KTsKKwlpZiAoKHByaXYoZGV2KSkgJiYgKHByaXYoZGV2KS0+aHdfZGV2KSkgeworCQlpZiAocHJpdihkZXYpLT5wbHg5MDgwX2lvYmFzZSkgeworCQkJZGlzYWJsZV9wbHhfaW50ZXJydXB0cyhkZXYpOworCQkJaW91bm1hcCgodm9pZCAqKXByaXYoZGV2KS0+cGx4OTA4MF9pb2Jhc2UpOwogCQl9CisJCWlmIChwcml2KGRldiktPmhwZGlfaW9iYXNlKQorCQkJaW91bm1hcCgodm9pZCAqKXByaXYoZGV2KS0+aHBkaV9pb2Jhc2UpOworCQkvKiAgZnJlZSBwY2kgZG1hIGJ1ZmZlcnMgKi8KKwkJZm9yIChpID0gMDsgaSA8IE5VTV9ETUFfQlVGRkVSUzsgaSsrKSB7CisJCQlpZiAocHJpdihkZXYpLT5kaW9fYnVmZmVyW2ldKQorCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocHJpdihkZXYpLT5od19kZXYsCisJCQkJCQkgICAgRE1BX0JVRkZFUl9TSVpFLAorCQkJCQkJICAgIHByaXYoZGV2KS0+CisJCQkJCQkgICAgZGlvX2J1ZmZlcltpXSwKKwkJCQkJCSAgICBwcml2CisJCQkJCQkgICAgKGRldiktPmRpb19idWZmZXJfcGh5c19hZGRyCisJCQkJCQkgICAgW2ldKTsKKwkJfQorCQkvKiAgZnJlZSBkbWEgZGVzY3JpcHRvcnMgKi8KKwkJaWYgKHByaXYoZGV2KS0+ZG1hX2Rlc2MpCisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHByaXYoZGV2KS0+aHdfZGV2LAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBwbHhfZG1hX2Rlc2MpCisJCQkJCSAgICAqIE5VTV9ETUFfREVTQ1JJUFRPUlMsCisJCQkJCSAgICBwcml2KGRldiktPmRtYV9kZXNjLAorCQkJCQkgICAgcHJpdihkZXYpLT4KKwkJCQkJICAgIGRtYV9kZXNjX3BoeXNfYWRkcik7CisJCWlmIChwcml2KGRldiktPmhwZGlfcGh5c19pb2Jhc2UpCisJCQljb21lZGlfcGNpX2Rpc2FibGUocHJpdihkZXYpLT5od19kZXYpOworCQlwY2lfZGV2X3B1dChwcml2KGRldiktPmh3X2Rldik7CiAJfQogCXJldHVybiAwOwogfQpAQCAtODEwLDE1ICs4MTQsMTYgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gNDsKIAotCWlmIChjbWQtPmNoYW5saXN0KSB7Ci0JCWZvciAoaSA9IDE7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgaSsrKSB7Ci0JCQlpZiAoQ1JfQ0hBTihjbWQtPmNoYW5saXN0W2ldKSAhPSBpKSB7Ci0JCQkJLyogIFhYWCBjb3VsZCBzdXBwb3J0IDggY2hhbm5lbHMgb3IgMTYgY2hhbm5lbHMgKi8KLQkJCQljb21lZGlfZXJyb3IoZGV2LAotCQkJCQkgICAgICJjaGFubGlzdCBtdXN0IGJlIGNoYW5uZWxzIDAgdG8gMzEgaW4gb3JkZXIiKTsKLQkJCQllcnIrKzsKLQkJCQlicmVhazsKLQkJCX0KKwlpZiAoIWNtZC0+Y2hhbmxpc3QpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMTsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyBpKyspIHsKKwkJaWYgKENSX0NIQU4oY21kLT5jaGFubGlzdFtpXSkgIT0gaSkgeworCQkJLyogIFhYWCBjb3VsZCBzdXBwb3J0IDggb3IgMTYgY2hhbm5lbHMgKi8KKwkJCWNvbWVkaV9lcnJvcihkZXYsCisJCQkJICAgICAiY2hhbmxpc3QgbXVzdCBiZSBjaCAwIHRvIDMxIGluIG9yZGVyIik7CisJCQllcnIrKzsKKwkJCWJyZWFrOwogCQl9CiAJfQogCkBAIC04MzEsOSArODM2LDkgQEAKIHN0YXRpYyBpbnQgaHBkaV9jbWRfdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewotCWlmIChwcml2KGRldiktPmRpb19jb25maWdfb3V0cHV0KSB7CisJaWYgKHByaXYoZGV2KS0+ZGlvX2NvbmZpZ19vdXRwdXQpCiAJCXJldHVybiAtRUlOVkFMOwotCX0gZWxzZQorCWVsc2UKIAkJcmV0dXJuIGRpX2NtZF90ZXN0KGRldiwgcywgY21kKTsKIH0KIApAQCAtODk5LDkgKzkwNCw5IEBACiAKIHN0YXRpYyBpbnQgaHBkaV9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7Ci0JaWYgKHByaXYoZGV2KS0+ZGlvX2NvbmZpZ19vdXRwdXQpIHsKKwlpZiAocHJpdihkZXYpLT5kaW9fY29uZmlnX291dHB1dCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfSBlbHNlCisJZWxzZQogCQlyZXR1cm4gZGlfY21kKGRldiwgcyk7CiB9CiAKQEAgLTk2MywxNCArOTY4LDEyIEBACiAJdWludDhfdCBkbWEwX3N0YXR1cywgZG1hMV9zdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICghZGV2LT5hdHRhY2hlZCkgeworCWlmICghZGV2LT5hdHRhY2hlZCkKIAkJcmV0dXJuIElSUV9OT05FOwotCX0KIAogCXBseF9zdGF0dXMgPSByZWFkbChwcml2KGRldiktPnBseDkwODBfaW9iYXNlICsgUExYX0lOVFJDU19SRUcpOwotCWlmICgocGx4X3N0YXR1cyAmIChJQ1NfRE1BMF9BIHwgSUNTX0RNQTFfQSB8IElDU19MSUEpKSA9PSAwKSB7CisJaWYgKChwbHhfc3RhdHVzICYgKElDU19ETUEwX0EgfCBJQ1NfRE1BMV9BIHwgSUNTX0xJQSkpID09IDApCiAJCXJldHVybiBJUlFfTk9ORTsKLQl9CiAKIAlocGRpX2ludHJfc3RhdHVzID0gcmVhZGwocHJpdihkZXYpLT5ocGRpX2lvYmFzZSArIElOVEVSUlVQVF9TVEFUVVNfUkVHKTsKIAlocGRpX2JvYXJkX3N0YXR1cyA9IHJlYWRsKHByaXYoZGV2KS0+aHBkaV9pb2Jhc2UgKyBCT0FSRF9TVEFUVVNfUkVHKTsKQEAgLTk5MCw5ICs5OTMsOCBAQAogCQkgICAgICAgcHJpdihkZXYpLT5wbHg5MDgwX2lvYmFzZSArIFBMWF9ETUEwX0NTX1JFRyk7CiAKIAkJREVCVUdfUFJJTlQoImRtYTAgc3RhdHVzIDB4JXhcbiIsIGRtYTBfc3RhdHVzKTsKLQkJaWYgKGRtYTBfc3RhdHVzICYgUExYX0RNQV9FTl9CSVQpIHsKKwkJaWYgKGRtYTBfc3RhdHVzICYgUExYX0RNQV9FTl9CSVQpCiAJCQlkcmFpbl9kbWFfYnVmZmVycyhkZXYsIDApOwotCQl9CiAJCURFQlVHX1BSSU5UKCIgY2xlYXJlZCBkbWEgY2gwIGludGVycnVwdFxuIik7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKQEAgLTEwNDIsNyArMTA0NCw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi12b2lkIGFib3J0X2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3N0YXRpYyB2b2lkIGFib3J0X2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmMKaW5kZXggN2E2N2ZmZi4uZmEwZTQ4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuYwpAQCAtNDYsNyArNDYsNyBAQAogCiBPcHRpb25zOgogIFswXSAtIFBDSSBidXMgbnVtYmVyIC0gaWYgYnVzIG51bWJlciBhbmQgc2xvdCBudW1iZXIgYXJlIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGRyaXZlciBzZWFyY2ggZm9yIGZpcnN0IHVudXNlZCBjYXJkCisJCQl0aGVuIGRyaXZlciBzZWFyY2ggZm9yIGZpcnN0IHVudXNlZCBjYXJkCiAgWzFdIC0gUENJIHNsb3QgbnVtYmVyCiAqLwogCkBAIC0xMzMsNyArMTMzLDcgQEAKIAlEYXRhICYgU3RydWN0dXJlIGRlY2xhcmF0aW9ucwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IHBjaV9saXN0X2J1aWxkZWQgPSAwOwkvKj4wIGxpc3Qgb2YgY2FyZCBpcyBrbm93biAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IHBjaV9saXN0X2J1aWxkZWQ7CS8qPjAgbGlzdCBvZiBjYXJkIGlzIGtub3duICovCiAKIHN0cnVjdCBib2FyZHR5cGUgewogCWNvbnN0IGNoYXIgKm5hbWU7CS8qICBkcml2ZXIgbmFtZSAqLwpAQCAtMTc2LDEzICsxNzYsMTMgQEAKICNkZWZpbmUgbl9ib2FyZHR5cGVzIChzaXplb2YoYm9hcmR0eXBlcykvc2l6ZW9mKHN0cnVjdCBib2FyZHR5cGUpKQogCiBzdGF0aWMgc3RydWN0IGNvbWVkaV9kcml2ZXIgZHJpdmVyX2ljcF9tdWx0aSA9IHsKLWRyaXZlcl9uYW1lOiJpY3BfbXVsdGkiLAotbW9kdWxlOlRISVNfTU9EVUxFLAotYXR0YWNoOmljcF9tdWx0aV9hdHRhY2gsCi1kZXRhY2g6aWNwX211bHRpX2RldGFjaCwKLW51bV9uYW1lczpuX2JvYXJkdHlwZXMsCi1ib2FyZF9uYW1lOiZib2FyZHR5cGVzWzBdLm5hbWUsCi1vZmZzZXQ6c2l6ZW9mKHN0cnVjdCBib2FyZHR5cGUpLAorZHJpdmVyX25hbWU6ICJpY3BfbXVsdGkiLAorbW9kdWxlIDogVEhJU19NT0RVTEUsCithdHRhY2ggOiBpY3BfbXVsdGlfYXR0YWNoLAorZGV0YWNoIDogaWNwX211bHRpX2RldGFjaCwKK251bV9uYW1lcyA6IG5fYm9hcmR0eXBlcywKK2JvYXJkX25hbWUgOiAmYm9hcmR0eXBlc1swXS5uYW1lLAorb2Zmc2V0IDogc2l6ZW9mKHN0cnVjdCBib2FyZHR5cGUpLAogfTsKIAogQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9pY3BfbXVsdGkpOwpAQCAtMjM0LDE4ICsyMzQsMTggQEAKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotCU5hbWU6CWljcF9tdWx0aV9pbnNuX3JlYWRfYWkKK05hbWU6CWljcF9tdWx0aV9pbnNuX3JlYWRfYWkKIAotCURlc2NyaXB0aW9uOgotCQlUaGlzIGZ1bmN0aW9uIHJlYWRzIGEgc2luZ2xlIGFuYWxvZ3VlIGlucHV0LgorRGVzY3JpcHRpb246CisJVGhpcyBmdW5jdGlvbiByZWFkcyBhIHNpbmdsZSBhbmFsb2d1ZSBpbnB1dC4KIAotCVBhcmFtZXRlcnM6Ci0JCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKLQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKLQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KLQkJdW5zaWduZWQgaW50ICpkYXRhCQlQb2ludGVyIHRvIGFuYWxvZ3VlIGlucHV0IGRhdGEKK1BhcmFtZXRlcnM6CisJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KKwl1bnNpZ25lZCBpbnQgKmRhdGEJCVBvaW50ZXIgdG8gYW5hbG9ndWUgaW5wdXQgZGF0YQogCi0JUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCitSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwpAQCAtMjU2LDcgKzI1Niw3IEBACiAJaW50IG4sIHRpbWVvdXQ7CiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQlwcmludGsoImljcCBtdWx0aSBFREJHOiBCR046IGljcF9tdWx0aV9pbnNuX3JlYWRfYWkoLi4uKVxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgImljcCBtdWx0aSBFREJHOiBCR046IGljcF9tdWx0aV9pbnNuX3JlYWRfYWkoLi4uKVxuIik7CiAjZW5kaWYKIAkvKiAgRGlzYWJsZSBBL0QgY29udmVyc2lvbiByZWFkeSBpbnRlcnJ1cHQgKi8KIAlkZXZwcml2LT5JbnRFbmFibGUgJj0gfkFEQ19SRUFEWTsKQEAgLTI2NiwxMSArMjY2LDExIEBACiAJZGV2cHJpdi0+SW50U3RhdHVzIHw9IEFEQ19SRUFEWTsKIAl3cml0ZXcoZGV2cHJpdi0+SW50U3RhdHVzLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9TVEFUKTsKIAotCS8qICBTZXQgdXAgYXBwcm9wcmlhdGUgY2hhbm5lbCwgbW9kZSBhbmQgcmFuZ2UgZGF0YSwgZm9yIHNwZWNpZmllZCBjaGFubmVsICovCisJLyogIFNldCB1cCBhcHByb3ByaWF0ZSBjaGFubmVsLCBtb2RlIGFuZCByYW5nZSBkYXRhLCBmb3Igc3BlY2lmaWVkIGNoICovCiAJc2V0dXBfY2hhbm5lbF9saXN0KGRldiwgcywgJmluc24tPmNoYW5zcGVjLCAxKTsKIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCXByaW50aygiaWNwX211bHRpIEEgU1Q9JTR4IElPPSVwXG4iLAorCXByaW50ayhLRVJOX0RFQlVHICJpY3BfbXVsdGkgQSBTVD0lNHggSU89JXBcbiIsCiAJICAgICAgIHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfQURDX0NTUiksCiAJICAgICAgIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfQURDX0NTUik7CiAjZW5kaWYKQEAgLTI4MywxNCArMjgzLDE0IEBACiAJCWRldnByaXYtPkFkY0NtZFN0YXR1cyAmPSB+QURDX1NUOwogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JCXByaW50aygiaWNwIG11bHRpIEIgbj0lZCBTVD0lNHhcbiIsIG4sCisJCXByaW50ayhLRVJOX0RFQlVHICJpY3AgbXVsdGkgQiBuPSVkIFNUPSU0eFxuIiwgbiwKIAkJICAgICAgIHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfQURDX0NTUikpOwogI2VuZGlmCiAKIAkJdWRlbGF5KDEpOwogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JCXByaW50aygiaWNwIG11bHRpIEMgbj0lZCBTVD0lNHhcbiIsIG4sCisJCXByaW50ayhLRVJOX0RFQlVHICJpY3AgbXVsdGkgQyBuPSVkIFNUPSU0eFxuIiwgbiwKIAkJICAgICAgIHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfQURDX0NTUikpOwogI2VuZGlmCiAKQEAgLTMwMyw3ICszMDMsOCBAQAogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCiAJCQlpZiAoISh0aW1lb3V0ICUgMTApKQotCQkJCXByaW50aygiaWNwIG11bHRpIEQgbj0lZCB0bT0lZCBTVD0lNHhcbiIsIG4sCisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgImljcCBtdWx0aSBEIG49JWQgdG09JWQgU1Q9JTR4XG4iLCBuLAogCQkJCSAgICAgICB0aW1lb3V0LAogCQkJCSAgICAgICByZWFkdyhkZXZwcml2LT5pb19hZGRyICsKIAkJCQkJICAgICBJQ1BfTVVMVElfQURDX0NTUikpOwpAQCAtMzI4LDkgKzMyOSw5IEBACiAJCWRhdGFbbl0gPSAwOwogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JCXByaW50awotCQkgICAgKCJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfaW5zbl9yZWFkX2FpKC4uLikgbj0lZFxuIiwKLQkJICAgICBuKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9pbnNuX3JlYWRfYWkoLi4uKSBuPSVkXG4iLAorCQkgICAgICBuKTsKICNlbmRpZgogCQlyZXR1cm4gLUVUSU1FOwogCkBAIC0zNDgsNyArMzQ5LDggQEAKIAl3cml0ZXcoZGV2cHJpdi0+SW50U3RhdHVzLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9TVEFUKTsKIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2luc25fcmVhZF9haSguLi4pIG49JWRcbiIsIG4pOworCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfaW5zbl9yZWFkX2FpKC4uLikgbj0lZFxuIiwgbik7CiAjZW5kaWYKIAlyZXR1cm4gbjsKIH0KQEAgLTM1NiwxOCArMzU4LDE4IEBACiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLQlOYW1lOglpY3BfbXVsdGlfaW5zbl93cml0ZV9hbworTmFtZToJaWNwX211bHRpX2luc25fd3JpdGVfYW8KIAotCURlc2NyaXB0aW9uOgotCQlUaGlzIGZ1bmN0aW9uIHdyaXRlcyBhIHNpbmdsZSBhbmFsb2d1ZSBvdXRwdXQuCitEZXNjcmlwdGlvbjoKKwlUaGlzIGZ1bmN0aW9uIHdyaXRlcyBhIHNpbmdsZSBhbmFsb2d1ZSBvdXRwdXQuCiAKLQlQYXJhbWV0ZXJzOgotCQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCi0JCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCi0JCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCi0JCXVuc2lnbmVkIGludCAqZGF0YQkJUG9pbnRlciB0byBhbmFsb2d1ZSBvdXRwdXQgZGF0YQorUGFyYW1ldGVyczoKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgorCXVuc2lnbmVkIGludCAqZGF0YQkJUG9pbnRlciB0byBhbmFsb2d1ZSBvdXRwdXQgZGF0YQogCi0JUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCitSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwpAQCAtMzc4LDcgKzM4MCw4IEBACiAJaW50IG4sIGNoYW4sIHJhbmdlLCB0aW1lb3V0OwogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogQkdOOiBpY3BfbXVsdGlfaW5zbl93cml0ZV9hbyguLi4pXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiaWNwIG11bHRpIEVEQkc6IEJHTjogaWNwX211bHRpX2luc25fd3JpdGVfYW8oLi4uKVxuIik7CiAjZW5kaWYKIAkvKiAgRGlzYWJsZSBEL0EgY29udmVyc2lvbiByZWFkeSBpbnRlcnJ1cHQgKi8KIAlkZXZwcml2LT5JbnRFbmFibGUgJj0gfkRBQ19SRUFEWTsKQEAgLTQwNCw3ICs0MDcsOCBAQAogCXdyaXRldyhkZXZwcml2LT5EYWNDbWRTdGF0dXMsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfREFDX0NTUik7CiAKIAlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7Ci0JCS8qICBXYWl0IGZvciBhbmFsb2d1ZSBvdXRwdXQgZGF0YSByZWdpc3RlciB0byBiZSByZWFkeSBmb3IgbmV3IGRhdGEsIG9yIGdldCBmZWQgdXAgd2FpdGluZyAqLworCQkvKiAgV2FpdCBmb3IgYW5hbG9ndWUgb3V0cHV0IGRhdGEgcmVnaXN0ZXIgdG8gYmUKKwkJICogIHJlYWR5IGZvciBuZXcgZGF0YSwgb3IgZ2V0IGZlZCB1cCB3YWl0aW5nICovCiAJCXRpbWVvdXQgPSAxMDA7CiAJCXdoaWxlICh0aW1lb3V0LS0pIHsKIAkJCWlmICghKHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKwpAQCAtNDEzLDcgKzQxNyw4IEBACiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKIAkJCWlmICghKHRpbWVvdXQgJSAxMCkpCi0JCQkJcHJpbnRrKCJpY3AgbXVsdGkgQSBuPSVkIHRtPSVkIFNUPSU0eFxuIiwgbiwKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiaWNwIG11bHRpIEEgbj0lZCB0bT0lZCBTVD0lNHhcbiIsIG4sCiAJCQkJICAgICAgIHRpbWVvdXQsCiAJCQkJICAgICAgIHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKwogCQkJCQkgICAgIElDUF9NVUxUSV9EQUNfQ1NSKSk7CkBAIC00MzgsOCArNDQzLDggQEAKIAkJZGV2cHJpdi0+YW9fZGF0YVtjaGFuXSA9IDA7CiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQkJcHJpbnRrCi0JCSAgICAoImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9pbnNuX3dyaXRlX2FvKC4uLikgbj0lZFxuIiwKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2luc25fd3JpdGVfYW8oLi4uKSBuPSVkXG4iLAogCQkgICAgIG4pOwogI2VuZGlmCiAJCXJldHVybiAtRVRJTUU7CkBAIC00NTksNyArNDY0LDggQEAKIAl9CiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQlwcmludGsoImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9pbnNuX3dyaXRlX2FvKC4uLikgbj0lZFxuIiwgbik7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9pbnNuX3dyaXRlX2FvKC4uLikgbj0lZFxuIiwgbik7CiAjZW5kaWYKIAlyZXR1cm4gbjsKIH0KQEAgLTQ2NywxOCArNDczLDE4IEBACiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLQlOYW1lOglpY3BfbXVsdGlfaW5zbl9yZWFkX2FvCitOYW1lOglpY3BfbXVsdGlfaW5zbl9yZWFkX2FvCiAKLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyBmdW5jdGlvbiByZWFkcyBhIHNpbmdsZSBhbmFsb2d1ZSBvdXRwdXQuCitEZXNjcmlwdGlvbjoKKwlUaGlzIGZ1bmN0aW9uIHJlYWRzIGEgc2luZ2xlIGFuYWxvZ3VlIG91dHB1dC4KIAotCVBhcmFtZXRlcnM6Ci0JCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKLQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKLQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KLQkJdW5zaWduZWQgaW50ICpkYXRhCQlQb2ludGVyIHRvIGFuYWxvZ3VlIG91dHB1dCBkYXRhCitQYXJhbWV0ZXJzOgorCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCisJdW5zaWduZWQgaW50ICpkYXRhCQlQb2ludGVyIHRvIGFuYWxvZ3VlIG91dHB1dCBkYXRhCiAKLQlSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKK1JldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCkBAIC01MDEsMTggKzUwNywxOCBAQAogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0JTmFtZToJaWNwX211bHRpX2luc25fYml0c19kaQorTmFtZToJaWNwX211bHRpX2luc25fYml0c19kaQogCi0JRGVzY3JpcHRpb246Ci0JCVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGRpZ2l0YWwgaW5wdXRzLgorRGVzY3JpcHRpb246CisJVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgZGlnaXRhbCBpbnB1dHMuCiAKLQlQYXJhbWV0ZXJzOgotCQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCi0JCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCi0JCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCi0JCXVuc2lnbmVkIGludCAqZGF0YQkJUG9pbnRlciB0byBhbmFsb2d1ZSBvdXRwdXQgZGF0YQorUGFyYW1ldGVyczoKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgorCXVuc2lnbmVkIGludCAqZGF0YQkJUG9pbnRlciB0byBhbmFsb2d1ZSBvdXRwdXQgZGF0YQogCi0JUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCitSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwpAQCAtNTI4LDE4ICs1MzQsMTggQEAKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotCU5hbWU6CWljcF9tdWx0aV9pbnNuX2JpdHNfZG8KK05hbWU6CWljcF9tdWx0aV9pbnNuX2JpdHNfZG8KIAotCURlc2NyaXB0aW9uOgotCQlUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgYXBwcm9wcmlhdGUgZGlnaXRhbCBvdXRwdXRzLgorRGVzY3JpcHRpb246CisJVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIGFwcHJvcHJpYXRlIGRpZ2l0YWwgb3V0cHV0cy4KIAotCVBhcmFtZXRlcnM6Ci0JCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKLQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKLQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KLQkJdW5zaWduZWQgaW50ICpkYXRhCQlQb2ludGVyIHRvIGFuYWxvZ3VlIG91dHB1dCBkYXRhCitQYXJhbWV0ZXJzOgorCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCisJdW5zaWduZWQgaW50ICpkYXRhCQlQb2ludGVyIHRvIGFuYWxvZ3VlIG91dHB1dCBkYXRhCiAKLQlSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKK1JldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCkBAIC01NDgsMTQgKzU1NCwxNCBAQAogCQkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogQkdOOiBpY3BfbXVsdGlfaW5zbl9iaXRzX2RvKC4uLilcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJpY3AgbXVsdGkgRURCRzogQkdOOiBpY3BfbXVsdGlfaW5zbl9iaXRzX2RvKC4uLilcbiIpOwogI2VuZGlmCiAKIAlpZiAoZGF0YVswXSkgewogCQlzLT5zdGF0ZSAmPSB+ZGF0YVswXTsKIAkJcy0+c3RhdGUgfD0gKGRhdGFbMF0gJiBkYXRhWzFdKTsKIAotCQlwcmludGsoIkRpZ2l0YWwgb3V0cHV0cyA9ICU0eCBcbiIsIHMtPnN0YXRlKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkRpZ2l0YWwgb3V0cHV0cyA9ICU0eCBcbiIsIHMtPnN0YXRlKTsKIAogCQl3cml0ZXcocy0+c3RhdGUsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfRE8pOwogCX0KQEAgLTU2Myw3ICs1NjksNyBAQAogCWRhdGFbMV0gPSByZWFkdyhkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0RJKTsKIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2luc25fYml0c19kbyguLi4pXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2luc25fYml0c19kbyguLi4pXG4iKTsKICNlbmRpZgogCXJldHVybiAyOwogfQpAQCAtNTcxLDE4ICs1NzcsMTggQEAKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotCU5hbWU6CWljcF9tdWx0aV9pbnNuX3JlYWRfY3RyCitOYW1lOglpY3BfbXVsdGlfaW5zbl9yZWFkX2N0cgogCi0JRGVzY3JpcHRpb246Ci0JCVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIHNwZWNpZmllZCBjb3VudGVyLgorRGVzY3JpcHRpb246CisJVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgc3BlY2lmaWVkIGNvdW50ZXIuCiAKLQlQYXJhbWV0ZXJzOgotCQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCi0JCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCi0JCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCi0JCXVuc2lnbmVkIGludCAqZGF0YQkJUG9pbnRlciB0byBjb3VudGVyIGRhdGEKK1BhcmFtZXRlcnM6CisJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KKwl1bnNpZ25lZCBpbnQgKmRhdGEJCVBvaW50ZXIgdG8gY291bnRlciBkYXRhCiAKLQlSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKK1JldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCkBAIC01OTYsMTggKzYwMiwxOCBAQAogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0JTmFtZToJaWNwX211bHRpX2luc25fd3JpdGVfY3RyCitOYW1lOglpY3BfbXVsdGlfaW5zbl93cml0ZV9jdHIKIAotCURlc2NyaXB0aW9uOgotCQlUaGlzIGZ1bmN0aW9uIHdyaXRlIHRvIHRoZSBzcGVjaWZpZWQgY291bnRlci4KK0Rlc2NyaXB0aW9uOgorCVRoaXMgZnVuY3Rpb24gd3JpdGUgdG8gdGhlIHNwZWNpZmllZCBjb3VudGVyLgogCi0JUGFyYW1ldGVyczoKLQkJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQotCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQotCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgotCQl1bnNpZ25lZCBpbnQgKmRhdGEJCVBvaW50ZXIgdG8gY291bnRlciBkYXRhCitQYXJhbWV0ZXJzOgorCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCisJdW5zaWduZWQgaW50ICpkYXRhCQlQb2ludGVyIHRvIGNvdW50ZXIgZGF0YQogCi0JUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCitSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwpAQCAtNjIyLDE1ICs2MjgsMTUgQEAKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotCU5hbWU6CWludGVycnVwdF9zZXJ2aWNlX2ljcF9tdWx0aQorTmFtZToJaW50ZXJydXB0X3NlcnZpY2VfaWNwX211bHRpCiAKLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgYWxsCi0JCWludGVycnVwdHMgZ2VuZXJhdGVkIGJ5IHRoZSBpY3AgbXVsdGkgYm9hcmQuCitEZXNjcmlwdGlvbjoKKwlUaGlzIGZ1bmN0aW9uIGlzIHRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBhbGwKKwlpbnRlcnJ1cHRzIGdlbmVyYXRlZCBieSB0aGUgaWNwIG11bHRpIGJvYXJkLgogCi0JUGFyYW1ldGVyczoKLQkJaW50IGlycQotCQl2b2lkICpkCQkJUG9pbnRlciB0byBjdXJyZW50IGRldmljZQorUGFyYW1ldGVyczoKKwlpbnQgaXJxCisJdm9pZCAqZAkJCVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2UKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwpAQCAtNjQwLDcgKzY0Niw4IEBACiAJaW50IGludF9ubzsKIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEJHTjogaW50ZXJydXB0X3NlcnZpY2VfaWNwX211bHRpKCVkLC4uLilcbiIsCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgImljcCBtdWx0aSBFREJHOiBCR046IGludGVycnVwdF9zZXJ2aWNlX2ljcF9tdWx0aSglZCwuLi4pXG4iLAogCSAgICAgICBpcnEpOwogI2VuZGlmCiAKQEAgLTY1MSw3ICs2NTgsOCBAQAogCQlyZXR1cm4gSVJRX05PTkU7CiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQlwcmludGsoImljcCBtdWx0aSBFREJHOiBpbnRlcnJ1cHRfc2VydmljZV9pY3BfbXVsdGkoKSBTVDogJTR4XG4iLAorCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICJpY3AgbXVsdGkgRURCRzogaW50ZXJydXB0X3NlcnZpY2VfaWNwX211bHRpKCkgU1Q6ICU0eFxuIiwKIAkgICAgICAgcmVhZHcoZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfU1RBVCkpOwogI2VuZGlmCiAKQEAgLTY3OSw3ICs2ODcsOCBAQAogCX0KIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEVORDogaW50ZXJydXB0X3NlcnZpY2VfaWNwX211bHRpKC4uLilcbiIpOworCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICJpY3AgbXVsdGkgRURCRzogRU5EOiBpbnRlcnJ1cHRfc2VydmljZV9pY3BfbXVsdGkoLi4uKVxuIik7CiAjZW5kaWYKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC02ODgsMjAgKzY5NywyMCBAQAogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0JTmFtZToJY2hlY2tfY2hhbm5lbF9saXN0CitOYW1lOgljaGVja19jaGFubmVsX2xpc3QKIAotCURlc2NyaXB0aW9uOgotCQlUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgY2hhbm5lbCBsaXN0LCBwcm92aWRlZCBieSB1c2VyCi0JCWlzIGJ1aWx0IGNvcnJlY3RseQorRGVzY3JpcHRpb246CisJVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGNoYW5uZWwgbGlzdCwgcHJvdmlkZWQgYnkgdXNlcgorCWlzIGJ1aWx0IGNvcnJlY3RseQogCi0JUGFyYW1ldGVyczoKLQkJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgc2V2aWNlIHN0cnVjdHVyZQotCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQotCQl1bnNpZ25lZCBpbnQgKmNoYW5saXN0CVBvaW50ZXIgdG8gcGFja2VkIGNoYW5uZWwgbGlzdAotCQl1bnNpZ25lZCBpbnQgbl9jaGFuCU51bWJlciBvZiBjaGFubmVscyB0byBzY2FuCitQYXJhbWV0ZXJzOgorCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IHNldmljZSBzdHJ1Y3R1cmUKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCXVuc2lnbmVkIGludCAqY2hhbmxpc3QJUG9pbnRlciB0byBwYWNrZWQgY2hhbm5lbCBsaXN0CisJdW5zaWduZWQgaW50IG5fY2hhbglOdW1iZXIgb2YgY2hhbm5lbHMgdG8gc2NhbgogCi0JUmV0dXJuczppbnQgMCA9IGZhaWx1cmUKLQkJICAgIDEgPSBzdWNjZXNzCitSZXR1cm5zOmludCAwID0gZmFpbHVyZQorCSAgICAxID0gc3VjY2VzcwogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCkBAIC03MTIsNyArNzIxLDggQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCXByaW50aygiaWNwIG11bHRpIEVEQkc6ICBjaGVja19jaGFubmVsX2xpc3QoLi4uLCVkKVxuIiwgbl9jaGFuKTsKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiaWNwIG11bHRpIEVEQkc6ICBjaGVja19jaGFubmVsX2xpc3QoLi4uLCVkKVxuIiwgbl9jaGFuKTsKICNlbmRpZgogCS8qICBDaGVjayB0aGF0IHdlIGF0IGxlYXN0IGhhdmUgb25lIGNoYW5uZWwgdG8gY2hlY2sgKi8KIAlpZiAobl9jaGFuIDwgMSkgewpAQCAtNzI1LDcgKzczNSw3IEBACiAJCWlmIChDUl9BUkVGKGNoYW5saXN0W2ldKSA9PSBBUkVGX0RJRkYpIHsKIAkJCWlmIChDUl9DSEFOKGNoYW5saXN0W2ldKSA+IHRoaXNfYm9hcmQtPm5fYWljaGFuZCkgewogCQkJCWNvbWVkaV9lcnJvcihkZXYsCi0JCQkJCSAgICAgIkluY29ycmVjdCBkaWZmZXJlbnRpYWwgYWkgY2hhbm5lbCBudW1iZXIiKTsKKwkJCQkJICAgICAiSW5jb3JyZWN0IGRpZmZlcmVudGlhbCBhaSBjaC1uciIpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQl9IGVsc2UgewpAQCAtNzQzLDIwICs3NTMsMjAgQEAKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotCU5hbWU6CXNldHVwX2NoYW5uZWxfbGlzdAorTmFtZToJc2V0dXBfY2hhbm5lbF9saXN0CiAKLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBhcHByb3ByaWF0ZSBjaGFubmVsIHNlbGVjdGlvbiwKLQkJZGlmZmVyZW50aWFsIGlucHV0IG1vZGUgYW5kIHJhbmdlIGJpdHMgaW4gdGhlIEFEQyBDb21tYW5kLwotCQlTdGF0dXMgcmVnaXN0ZXIuCitEZXNjcmlwdGlvbjoKKwlUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGFwcHJvcHJpYXRlIGNoYW5uZWwgc2VsZWN0aW9uLAorCWRpZmZlcmVudGlhbCBpbnB1dCBtb2RlIGFuZCByYW5nZSBiaXRzIGluIHRoZSBBREMgQ29tbWFuZC8KKwlTdGF0dXMgcmVnaXN0ZXIuCiAKLQlQYXJhbWV0ZXJzOgotCQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBzZXZpY2Ugc3RydWN0dXJlCi0JCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCi0JCXVuc2lnbmVkIGludCAqY2hhbmxpc3QJUG9pbnRlciB0byBwYWNrZWQgY2hhbm5lbCBsaXN0Ci0JCXVuc2lnbmVkIGludCBuX2NoYW4JTnVtYmVyIG9mIGNoYW5uZWxzIHRvIHNjYW4KK1BhcmFtZXRlcnM6CisJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgc2V2aWNlIHN0cnVjdHVyZQorCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJdW5zaWduZWQgaW50ICpjaGFubGlzdAlQb2ludGVyIHRvIHBhY2tlZCBjaGFubmVsIGxpc3QKKwl1bnNpZ25lZCBpbnQgbl9jaGFuCU51bWJlciBvZiBjaGFubmVscyB0byBzY2FuCiAKLQlSZXR1cm5zOlZvaWQKK1JldHVybnM6Vm9pZAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCkBAIC03NjgsNyArNzc4LDggQEAKIAl1bnNpZ25lZCBpbnQgZGlmZjsKIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCXByaW50aygiaWNwIG11bHRpIEVEQkc6ICBzZXR1cF9jaGFubmVsX2xpc3QoLi4uLCVkKVxuIiwgbl9jaGFuKTsKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiaWNwIG11bHRpIEVEQkc6ICBzZXR1cF9jaGFubmVsX2xpc3QoLi4uLCVkKVxuIiwgbl9jaGFuKTsKICNlbmRpZgogCWRldnByaXYtPmFjdF9jaGFubGlzdF9sZW4gPSBuX2NoYW47CiAJZGV2cHJpdi0+YWN0X2NoYW5saXN0X3BvcyA9IDA7CkBAIC03ODYsNyArNzk3LDggQEAKIAkJCWNoYW5wcm9nICY9IDB4MDAwZjsKIAkJfQogCi0JCS8qICBDbGVhciBjaGFubmVsLCByYW5nZSBhbmQgaW5wdXQgbW9kZSBiaXRzIGluIEEvRCBjb21tYW5kL3N0YXR1cyByZWdpc3RlciAqLworCQkvKiAgQ2xlYXIgY2hhbm5lbCwgcmFuZ2UgYW5kIGlucHV0IG1vZGUgYml0cworCQkgKiAgaW4gQS9EIGNvbW1hbmQvc3RhdHVzIHJlZ2lzdGVyICovCiAJCWRldnByaXYtPkFkY0NtZFN0YXR1cyAmPSAweGYwMGY7CiAKIAkJLyogIFNldCBjaGFubmVsIG51bWJlciBhbmQgZGlmZmVyZW50aWFsIG1vZGUgc3RhdHVzIGJpdCAqLwpAQCAtODA4LDcgKzgyMCw4IEBACiAJCSAgICAgICBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FEQ19DU1IpOwogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JCXByaW50aygiR1M6ICUyZC4gWyU0eF09JTR4ICU0eFxuIiwgaSwgY2hhbnByb2csIHJhbmdlLAorCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIkdTOiAlMmQuIFslNHhdPSU0eCAlNHhcbiIsIGksIGNoYW5wcm9nLCByYW5nZSwKIAkJICAgICAgIGRldnByaXYtPmFjdF9jaGFubGlzdFtpXSk7CiAjZW5kaWYKIAl9CkBAIC04MTgsMTUgKzgzMSwxNSBAQAogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0JTmFtZToJaWNwX211bHRpX3Jlc2V0CitOYW1lOglpY3BfbXVsdGlfcmVzZXQKIAotCURlc2NyaXB0aW9uOgotCQlUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgaWNwIG11bHRpIGRldmljZSB0byBhICdzYWZlJyBzdGF0ZQorRGVzY3JpcHRpb246CisJVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIGljcCBtdWx0aSBkZXZpY2UgdG8gYSAnc2FmZScgc3RhdGUKIAotCVBhcmFtZXRlcnM6Ci0JCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IHNldmljZSBzdHJ1Y3R1cmUKK1BhcmFtZXRlcnM6CisJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgc2V2aWNlIHN0cnVjdHVyZQogCi0JUmV0dXJuczppbnQJMCA9IHN1Y2Nlc3MKK1JldHVybnM6aW50CTAgPSBzdWNjZXNzCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KQEAgLTgzNSw3ICs4NDgsOCBAQAogCXVuc2lnbmVkIGludCBpOwogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JcHJpbnRrKCJpY3BfbXVsdGkgRURCRzogQkdOOiBpY3BfbXVsdGlfcmVzZXQoLi4uKVxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgImljcF9tdWx0aSBFREJHOiBCR046IGljcF9tdWx0aV9yZXNldCguLi4pXG4iKTsKICNlbmRpZgogCS8qICBDbGVhciBJTlQgZW5hYmxlcyBhbmQgcmVxdWVzdHMgKi8KIAl3cml0ZXcoMCwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfRU4pOwpAQCAtODY2LDcgKzg4MCw4IEBACiAJd3JpdGV3KDAsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfRE8pOwogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfcmVzZXQoLi4uKVxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9yZXNldCguLi4pXG4iKTsKICNlbmRpZgogCXJldHVybiAwOwogfQpAQCAtODc0LDE3ICs4ODksMTcgQEAKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotCU5hbWU6CWljcF9tdWx0aV9hdHRhY2gKK05hbWU6CWljcF9tdWx0aV9hdHRhY2gKIAotCURlc2NyaXB0aW9uOgotCQlUaGlzIGZ1bmN0aW9uIHNldHMgdXAgYWxsIHRoZSBhcHByb3ByaWF0ZSBkYXRhIGZvciB0aGUgY3VycmVudAotCQlkZXZpY2UuCitEZXNjcmlwdGlvbjoKKwlUaGlzIGZ1bmN0aW9uIHNldHMgdXAgYWxsIHRoZSBhcHByb3ByaWF0ZSBkYXRhIGZvciB0aGUgY3VycmVudAorCWRldmljZS4KIAotCVBhcmFtZXRlcnM6Ci0JCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKLQkJc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2UgY29uZmlndXJhdGlvbgorUGFyYW1ldGVyczoKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2UgY29uZmlndXJhdGlvbgogCi0JUmV0dXJuczppbnQJMCA9IHN1Y2Nlc3MKK1JldHVybnM6aW50CTAgPSBzdWNjZXNzCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KQEAgLTg5OCw3ICs5MTMsOCBAQAogCXJlc291cmNlX3NpemVfdCBpb19hZGRyWzVdLCBpb2Jhc2U7CiAJdW5zaWduZWQgY2hhciBwY2lfYnVzLCBwY2lfc2xvdCwgcGNpX2Z1bmM7CiAKLQlwcmludGsoImljcF9tdWx0aSBFREJHOiBCR046IGljcF9tdWx0aV9hdHRhY2goLi4uKVxuIik7CisJcHJpbnRrKEtFUk5fV0FSTklORworCSAgICAgICAiaWNwX211bHRpIEVEQkc6IEJHTjogaWNwX211bHRpX2F0dGFjaCguLi4pXG4iKTsKIAogCS8qICBBbG9jYXRlIHByaXZhdGUgZGF0YSBzdG9yYWdlIHNwYWNlICovCiAJcmV0ID0gYWxsb2NfcHJpdmF0ZShkZXYsIHNpemVvZihzdHJ1Y3QgaWNwX211bHRpX3ByaXZhdGUpKTsKQEAgLTkxNiw3ICs5MzIsOCBAQAogCQkgICAgKTsKIAl9CiAKLQlwcmludGsoIkFubmUncyBjb21lZGklZDogaWNwX211bHRpOiBib2FyZD0lcyIsIGRldi0+bWlub3IsCisJcHJpbnRrKEtFUk5fV0FSTklORworCSAgICAgICAiQW5uZSdzIGNvbWVkaSVkOiBpY3BfbXVsdGk6IGJvYXJkPSVzIiwgZGV2LT5taW5vciwKIAkgICAgICAgdGhpc19ib2FyZC0+bmFtZSk7CiAKIAljYXJkID0gc2VsZWN0X2FuZF9hbGxvY19wY2lfY2FyZChQQ0lfVkVORE9SX0lEX0lDUCwKQEAgLTkzMCwyNCArOTQ3LDI2IEBACiAKIAlpZiAoKHBjaV9jYXJkX2RhdGEoY2FyZCwgJnBjaV9idXMsICZwY2lfc2xvdCwgJnBjaV9mdW5jLCAmaW9fYWRkclswXSwKIAkJCSAgICZpcnEpKSA8IDApIHsKLQkJcHJpbnRrKCIgLSBDYW4ndCBnZXQgY29uZmlndXJhdGlvbiBkYXRhIVxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiAtIENhbid0IGdldCBjb25maWd1cmF0aW9uIGRhdGEhXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJaW9iYXNlID0gaW9fYWRkclsyXTsKIAlkZXZwcml2LT5waHlzX2lvYmFzZSA9IGlvYmFzZTsKIAotCXByaW50aygiLCBiOnM6Zj0lZDolZDolZCwgaW89MHglOGxseCBcbiIsIHBjaV9idXMsIHBjaV9zbG90LCBwY2lfZnVuYywKKwlwcmludGsoS0VSTl9XQVJOSU5HCisJICAgICAgICIsIGI6czpmPSVkOiVkOiVkLCBpbz0weCU4bGx4IFxuIiwgcGNpX2J1cywgcGNpX3Nsb3QsIHBjaV9mdW5jLAogCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWlvYmFzZSk7CiAKIAlkZXZwcml2LT5pb19hZGRyID0gaW9yZW1hcChpb2Jhc2UsIElDUF9NVUxUSV9TSVpFKTsKIAogCWlmIChkZXZwcml2LT5pb19hZGRyID09IE5VTEwpIHsKLQkJcHJpbnRrKCJpb3JlbWFwIGZhaWxlZC5cbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpb3JlbWFwIGZhaWxlZC5cbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JcHJpbnRrKCIweCUwOGxseCBtYXBwZWQgdG8gJXAsICIsICh1bnNpZ25lZCBsb25nIGxvbmcpaW9iYXNlLAorCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICIweCUwOGxseCBtYXBwZWQgdG8gJXAsICIsICh1bnNpZ25lZCBsb25nIGxvbmcpaW9iYXNlLAogCSAgICAgICBkZXZwcml2LT5pb19hZGRyKTsKICNlbmRpZgogCkBAIC05NzUsMjAgKzk5NCwyMCBAQAogCQlpZiAoaXJxKSB7CiAJCQlpZiAocmVxdWVzdF9pcnEoaXJxLCBpbnRlcnJ1cHRfc2VydmljZV9pY3BfbXVsdGksCiAJCQkJCUlSUUZfU0hBUkVELCAiSW5vdmEgSWNwIE11bHRpIiwgZGV2KSkgewotCQkJCXByaW50awotCQkJCSAgICAoIiwgdW5hYmxlIHRvIGFsbG9jYXRlIElSUSAldSwgRElTQUJMSU5HIElUIiwKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICJ1bmFibGUgdG8gYWxsb2NhdGUgSVJRICV1LCBESVNBQkxJTkcgSVQiLAogCQkJCSAgICAgaXJxKTsKIAkJCQlpcnEgPSAwOwkvKiBDYW4ndCB1c2UgSVJRICovCiAJCQl9IGVsc2UKLQkJCQlwcmludGsoIiwgaXJxPSV1IiwgaXJxKTsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIsIGlycT0ldSIsIGlycSk7CiAJCX0gZWxzZQotCQkJcHJpbnRrKCIsIElSUSBkaXNhYmxlZCIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiLCBJUlEgZGlzYWJsZWQiKTsKIAl9IGVsc2UKIAkJaXJxID0gMDsKIAogCWRldi0+aXJxID0gaXJxOwogCi0JcHJpbnRrKCIuXG4iKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICIuXG4iKTsKIAogCXN1YmRldiA9IDA7CiAKQEAgLTEwNjMsNyArMTA4Miw3IEBACiAJZGV2cHJpdi0+dmFsaWQgPSAxOwogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfYXR0YWNoKC4uLilcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfYXR0YWNoKC4uLilcbiIpOwogI2VuZGlmCiAKIAlyZXR1cm4gMDsKQEAgLTEwNzIsMTYgKzEwOTEsMTYgQEAKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotCU5hbWU6CWljcF9tdWx0aV9kZXRhY2gKK05hbWU6CWljcF9tdWx0aV9kZXRhY2gKIAotCURlc2NyaXB0aW9uOgotCQlUaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIGFsbCB0aGUgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIGN1cnJlbnQKLQkJZGV2aWNlLgorRGVzY3JpcHRpb246CisJVGhpcyBmdW5jdGlvbiByZWxlYXNlcyBhbGwgdGhlIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBjdXJyZW50CisJZGV2aWNlLgogCi0JUGFyYW1ldGVyczoKLQkJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorUGFyYW1ldGVyczoKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCiAKLQlSZXR1cm5zOmludAkwID0gc3VjY2VzcworUmV0dXJuczppbnQJMCA9IHN1Y2Nlc3MKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2lpX3BjaTIwa2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9paV9wY2kyMGtjLmMKaW5kZXggMjRkZjI0NS4uZTI2YzFiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2lpX3BjaTIwa2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWlfcGNpMjBrYy5jCkBAIC0yMyw3ICsyMyw4IEBACiAgKglubyBleHRlcm4gdHJpZ2dlciBpbXBsZW1lbnRlZAogICoKICAqCU5PVCBXT1JLSU5HIChidXQgc29vbikgb25seSA0IG9uLWJvYXJkIGRpZmZlcmVudGlhbCBjaGFubmVscyBzdXBwb3J0ZWQKLSAqCU5PVCBXT1JLSU5HIChidXQgc29vbikgb25seSBPTkUgZGktcG9ydCBhbmQgT05FIGRvLXBvcnQgc3VwcG9ydGVkIGluc3RlYWQgb2YgNCBkaWdpdGFsIHBvcnRzCisgKglOT1QgV09SS0lORyAoYnV0IHNvb24pIG9ubHkgT05FIGRpLXBvcnQgYW5kIE9ORSBkby1wb3J0IHN1cHBvcnRlZAorICoJCQkgICAgICAgaW5zdGVhZCBvZiA0IGRpZ2l0YWwgcG9ydHMKICAqCWRpLXBvcnQgPT0gUG9ydCAwCiAgKglkby1wb3J0ID09IFBvcnQgMQogICoKQEAgLTYzLDE3ICs2NCwxNyBAQAogCiBvcHRpb25zIGZvciBQQ0ktMjAwMDZNOgogICBmaXJzdDogICBBbmFsb2cgb3V0cHV0IGNoYW5uZWwgMCByYW5nZSBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgMCAgYmlwb2xhciAxMCAgKC0xMFYgLS0gKzEwVikKLSAgICAgICAgICAgICAxICB1bmlwb2xhciAxMCAgKDBWIC0tICsxMFYpCi0gICAgICAgICAgICAgMiAgYmlwb2xhciA1ICAoLTVWIC0tIDVWKQorCSAgICAgMCAgYmlwb2xhciAxMCAgKC0xMFYgLS0gKzEwVikKKwkgICAgIDEgIHVuaXBvbGFyIDEwICAoMFYgLS0gKzEwVikKKwkgICAgIDIgIGJpcG9sYXIgNSAgKC01ViAtLSA1VikKICAgc2Vjb25kOiAgQW5hbG9nIG91dHB1dCBjaGFubmVsIDEgcmFuZ2UgY29uZmlndXJhdGlvbgogCiBvcHRpb25zIGZvciBQQ0ktMjAzNDFNOgogICBmaXJzdDogICBBbmFsb2cgaW5wdXQgZ2FpbiBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgMCAgMQotICAgICAgICAgICAgIDEgIDEwCi0gICAgICAgICAgICAgMiAgMTAwCi0gICAgICAgICAgICAgMyAgMjAwCisJICAgICAwICAxCisJICAgICAxICAxMAorCSAgICAgMiAgMTAwCisJICAgICAzICAyMDAKICovCiAKIC8qIFhYWCBuZWVkcyB0byB1c2UgaW9yZW1hcCgpIGZvciBjb21wYXRpYmlsaXR5IHdpdGggMi40IGtlcm5lbHMuICBTaG91bGQgYWxzbwpAQCAtOTUsMTIgKzk2LDEyIEBACiAjZGVmaW5lIFBDSTIwMDAwX0RJT18zCQkJMHhjMQogI2RlZmluZSBQQ0kyMDAwMF9ESU9fQ09OVFJPTF8wMQkJMHg4MwkvKiBwb3J0IDAsIDEgY29udHJvbCAqLwogI2RlZmluZSBQQ0kyMDAwMF9ESU9fQ09OVFJPTF8yMwkJMHhjMwkvKiBwb3J0IDIsIDMgY29udHJvbCAqLwotI2RlZmluZSBQQ0kyMDAwMF9ESU9fQlVGRkVSCQkweDgyCS8qIGJ1ZmZlciBkaXJlY3Rpb24gYW5kIGVuYWJsZSAqLworI2RlZmluZSBQQ0kyMDAwMF9ESU9fQlVGRkVSCQkweDgyCS8qIGJ1ZmZlciBkaXJlY3Rpb24gJiBlbmFibGUgKi8KICNkZWZpbmUgUENJMjAwMDBfRElPX0VPQwkJMHhlZgkvKiBldmVuIHBvcnQsIGNvbnRyb2wgb3V0cHV0ICovCiAjZGVmaW5lIFBDSTIwMDAwX0RJT19PT0MJCTB4ZmQJLyogb2RkIHBvcnQsIGNvbnRyb2wgb3V0cHV0ICovCiAjZGVmaW5lIFBDSTIwMDAwX0RJT19FSUMJCTB4OTAJLyogZXZlbiBwb3J0LCBjb250cm9sIGlucHV0ICovCiAjZGVmaW5lIFBDSTIwMDAwX0RJT19PSUMJCTB4ODIJLyogb2RkIHBvcnQsIGNvbnRyb2wgaW5wdXQgKi8KLSNkZWZpbmUgRElPX0NBTkQJCQkweDEyCS8qIGFuZCBiaXQgMSwgYml0IDQgb2YgY29udHJvbCAqLworI2RlZmluZSBESU9fQ0FORAkJCTB4MTIJLyogYW5kIGJpdCAxICYgNCBvZiBjb250cm9sICovCiAjZGVmaW5lIERJT19CRQkJCQkweDAxCS8qIGJ1ZmZlcjogcG9ydCBlbmFibGUgKi8KICNkZWZpbmUgRElPX0JPCQkJCTB4MDQJLyogYnVmZmVyOiBvdXRwdXQgKi8KICNkZWZpbmUgRElPX0JJCQkJCTB4MDUJLyogYnVmZmVyOiBpbnB1dCAqLwpAQCAtMTM3LDcgKzEzOCw4IEBACiAJdm9pZCAqaW9iYXNlOwogCXN0cnVjdCB7CiAJCXZvaWQgKmlvYmFzZTsKLQkJY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKmFvX3JhbmdlX2xpc3RbMl07CS8qIHJhbmdlIG9mIGNoYW5uZWxzIG9mIGFvIG1vZHVsZSAqLworCQljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqYW9fcmFuZ2VfbGlzdFsyXTsKKwkJCQkJLyogcmFuZ2Ugb2YgY2hhbm5lbHMgb2YgYW8gbW9kdWxlICovCiAJCXVuc2lnbmVkIGludCBsYXN0X2RhdGFbMl07CiAJfSBwY2kyMDAwNjsKIAlzdHJ1Y3QgewpAQCAtMjI0LDE0ICsyMjYsMTMgQEAKIAogCS8qIENoZWNrIFBDSS0yMDAwMSBDLTJBIENhcnJpZXIgQm9hcmQgSUQgKi8KIAlpZiAoKHJlYWRiKGRldnByaXYtPmlvYWRkcikgJiBQQ0kyMDAwMF9JRCkgIT0gUENJMjAwMDBfSUQpIHsKLQkJcHJpbnRrKCJjb21lZGklZDogaWlfcGNpMjBrYyIsIGRldi0+bWlub3IpOwotCQlwcmludGsKLQkJICAgICgiIFBDSS0yMDAwMSBDLTJBIENhcnJpZXIgQm9hcmQgYXQgYmFzZT0weCVwIG5vdCBmb3VuZCAhXG4iLAotCQkgICAgIGRldnByaXYtPmlvYWRkcik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNvbWVkaSVkOiBpaV9wY2kyMGtjIFBDSS0yMDAwMSIKKwkJICAgICAgICIgQy0yQSBDYXJyaWVyIEJvYXJkIGF0IGJhc2U9MHglcCBub3QgZm91bmQgIVxuIiwKKwkJICAgICAgIGRldi0+bWlub3IsIGRldnByaXYtPmlvYWRkcik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlwcmludGsoImNvbWVkaSVkOlxuIiwgZGV2LT5taW5vcik7Ci0JcHJpbnRrKCJpaV9wY2kyMGtjOiBQQ0ktMjAwMDEgQy0yQSBhdCBiYXNlPTB4JXBcbiIsIGRldnByaXYtPmlvYWRkcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IGlpX3BjaTIwa2M6IFBDSS0yMDAwMSBDLTJBIGF0IGJhc2U9MHglcFxuIiwKKwkgICAgICAgZGV2LT5taW5vciwgZGV2cHJpdi0+aW9hZGRyKTsKIAogCWZvciAoaSA9IDA7IGkgPCBQQ0kyMDAwMF9NT0RVTEVTOyBpKyspIHsKIAkJcyA9IGRldi0+c3ViZGV2aWNlcyArIGk7CkBAIC0yNDQsMjEgKzI0NSwyMyBAQAogCQkJICAgIGRldnByaXYtPmlvYWRkciArIChpICsgMSkgKiBQQ0kyMDAwMF9PRkZTRVQ7CiAJCQlwY2kyMDAwNl9pbml0KGRldiwgcywgaXQtPm9wdGlvbnNbMiAqIGkgKyAyXSwKIAkJCQkgICAgICBpdC0+b3B0aW9uc1syICogaSArIDNdKTsKLQkJCXByaW50aygiY29tZWRpJWQ6IGlpX3BjaTIwa2MiLCBkZXYtPm1pbm9yKTsKLQkJCXByaW50aygiIFBDSS0yMDAwNiBtb2R1bGUgaW4gc2xvdCAlZCBcbiIsIGkgKyAxKTsKKwkJCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiAiCisJCQkgICAgICAgImlpX3BjaTIwa2MgUENJLTIwMDA2IG1vZHVsZSBpbiBzbG90ICVkIFxuIiwKKwkJCSAgICAgICBkZXYtPm1pbm9yLCBpICsgMSk7CiAJCQlicmVhazsKIAkJY2FzZSBQQ0kyMDM0MV9JRDoKIAkJCXNkcC0+cGNpMjAzNDEuaW9iYXNlID0KIAkJCSAgICBkZXZwcml2LT5pb2FkZHIgKyAoaSArIDEpICogUENJMjAwMDBfT0ZGU0VUOwogCQkJcGNpMjAzNDFfaW5pdChkZXYsIHMsIGl0LT5vcHRpb25zWzIgKiBpICsgMl0sCiAJCQkJICAgICAgaXQtPm9wdGlvbnNbMiAqIGkgKyAzXSk7Ci0JCQlwcmludGsoImNvbWVkaSVkOiBpaV9wY2kyMGtjIiwgZGV2LT5taW5vcik7Ci0JCQlwcmludGsoIiBQQ0ktMjAzNDEgbW9kdWxlIGluIHNsb3QgJWQgXG4iLCBpICsgMSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogIgorCQkJICAgICAgICJpaV9wY2kyMGtjIFBDSS0yMDM0MSBtb2R1bGUgaW4gc2xvdCAlZCBcbiIsCisJCQkgICAgICAgZGV2LT5taW5vciwgaSArIDEpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsKLQkJCSAgICAoImlpX3BjaTIwa2M6IHVua25vd24gbW9kdWxlIGNvZGUgMHglMDJ4IGluIHNsb3QgJWQ6IG1vZHVsZSBkaXNhYmxlZFxuIiwKLQkJCSAgICAgaWQsIGkpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaWlfcGNpMjBrYzogdW5rbm93biBtb2R1bGUgIgorCQkJICAgICAgICJjb2RlIDB4JTAyeCBpbiBzbG90ICVkOiBtb2R1bGUgZGlzYWJsZWRcbiIsCisJCQkgICAgICAgaWQsIGkpOyAvKiBYWFggdGhpcyBsb29rcyBsaWtlIGEgYnVnISBpICsgMSA/PyAqLwogCQkJLyogZmFsbCB0aHJvdWdoICovCiAJCWNhc2UgUENJMjB4eHhfRU1QVFlfSUQ6CiAJCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwpAQCAtMjc0LDcgKzI3Nyw3IEBACiAKIHN0YXRpYyBpbnQgcGNpMjB4eHhfZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7Ci0JcHJpbnRrKCJjb21lZGklZDogcGNpMjB4eHg6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IHBjaTIweHh4OiByZW1vdmVcbiIsIGRldi0+bWlub3IpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMzksNyArMzQyLDggQEAKIAl1bnNpZ25lZCBpbnQgYm9hcmRkYXRhOwogCiAJc2RwLT5wY2kyMDAwNi5sYXN0X2RhdGFbQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyldID0gZGF0YVswXTsKLQlib2FyZGRhdGEgPSAoKCh1bnNpZ25lZCBpbnQpZGF0YVswXSArIDB4ODAwMCkgJiAweGZmZmYpOwkvKiBjb21lZGktZGF0YSAtPiBib2FyZC1kYXRhICovCisJYm9hcmRkYXRhID0gKCgodW5zaWduZWQgaW50KWRhdGFbMF0gKyAweDgwMDApICYgMHhmZmZmKTsKKwkJCQkJCS8qIGNvbWVkaS1kYXRhIC0+IGJvYXJkLWRhdGEgKi8KIAlsbyA9IChib2FyZGRhdGEgJiAweGZmKTsKIAloaSA9ICgoYm9hcmRkYXRhID4+IDgpICYgMHhmZik7CiAKQEAgLTM1NSw3ICszNTksOCBAQAogCQl3cml0ZWIoMHgwMCwgc2RwLT5pb2Jhc2UgKyBQQ0kyMDAwNl9TVFJPQkUxKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKCIgY29tZWRpJWQ6IHBjaTIweHh4OiBhbyBjaGFubmVsIEVycm9yIVxuIiwgZGV2LT5taW5vcik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIgY29tZWRpJWQ6IHBjaTIweHh4OiBhbyBjaGFubmVsIEVycm9yIVxuIiwgZGV2LT5taW5vcik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMzczLDggKzM3OCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSByYW5nZV9iaXBvbGFyMF81ID0geyAxLCB7QklQX1JBTkdFKDAuNSl9IH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfYmlwb2xhcjBfMDUgPSB7IDEsIHtCSVBfUkFOR0UoMC4wNSl9IH07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfYmlwb2xhcjBfMDI1ID0KLSAgICB7IDEsIHtCSVBfUkFOR0UoMC4wMjUpfSB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXIwXzAyNSA9IHsgMSwge0JJUF9SQU5HRSgwLjAyNSl9IH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqY29uc3QgcGNpMjAzNDFfcmFuZ2VzW10gPSB7CiAJJnJhbmdlX2JpcG9sYXI1LApAQCAtNDQ3LDkgKzQ1MSwxMCBAQAogCQkJZW9jID0gcmVhZGIoc2RwLT5pb2Jhc2UgKyBQQ0kyMDM0MV9TVEFUVVNfUkVHKTsKIAkJfQogCQlpZiAoaiA+PSAxMDApIHsKLQkJCXByaW50awotCQkJICAgICgiY29tZWRpJWQ6ICBwY2kyMHh4eDogQUkgaW50ZXJydXB0IGNoYW5uZWwgJWkgcG9sbGluZyBleGl0ICFcbiIsCi0JCQkgICAgIGRldi0+bWlub3IsIGkpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJjb21lZGklZDogIHBjaTIweHh4OiAiCisJCQkgICAgICAgIkFJIGludGVycnVwdCBjaGFubmVsICVpIHBvbGxpbmcgZXhpdCAhXG4iLAorCQkJICAgICAgIGRldi0+bWlub3IsIGkpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJbG8gPSByZWFkYihzZHAtPmlvYmFzZSArIFBDSTIwMzQxX0xEQVRBKTsKQEAgLTUwMiwyMCArNTA3LDE4IEBACiAJaW50IG1hc2ssIGJpdHM7CiAKIAltYXNrID0gMSA8PCBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQlpZiAobWFzayAmIDB4MDAwMDAwZmYpIHsKKwlpZiAobWFzayAmIDB4MDAwMDAwZmYpCiAJCWJpdHMgPSAweDAwMDAwMGZmOwotCX0gZWxzZSBpZiAobWFzayAmIDB4MDAwMGZmMDApIHsKKwllbHNlIGlmIChtYXNrICYgMHgwMDAwZmYwMCkKIAkJYml0cyA9IDB4MDAwMGZmMDA7Ci0JfSBlbHNlIGlmIChtYXNrICYgMHgwMGZmMDAwMCkgeworCWVsc2UgaWYgKG1hc2sgJiAweDAwZmYwMDAwKQogCQliaXRzID0gMHgwMGZmMDAwMDsKLQl9IGVsc2UgeworCWVsc2UKIAkJYml0cyA9IDB4ZmYwMDAwMDA7Ci0JfQotCWlmIChkYXRhWzBdKSB7CisJaWYgKGRhdGFbMF0pCiAJCXMtPmlvX2JpdHMgfD0gYml0czsKLQl9IGVsc2UgeworCWVsc2UKIAkJcy0+aW9fYml0cyAmPSB+Yml0czsKLQl9CiAJcGNpMjB4eHhfZGlvX2NvbmZpZyhkZXYsIHMpOwogCiAJcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMva2VfY291bnRlci5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2tlX2NvdW50ZXIuYwppbmRleCBjMTQ1ZTgyLi43M2IwNDQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMva2VfY291bnRlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9rZV9jb3VudGVyLmMKQEAgLTE5MiwxMiArMTkyLDE0IEBACiAJCQl9CiAJCX0KIAl9Ci0JcHJpbnRrKCJjb21lZGklZDogbm8gc3VwcG9ydGVkIGJvYXJkIGZvdW5kISAocmVxLiBidXMvc2xvdDogJWQvJWQpXG4iLAorCXByaW50ayhLRVJOX1dBUk5JTkcKKwkgICAgICAgImNvbWVkaSVkOiBubyBzdXBwb3J0ZWQgYm9hcmQgZm91bmQhIChyZXEuIGJ1cy9zbG90OiAlZC8lZClcbiIsCiAJICAgICAgIGRldi0+bWlub3IsIGl0LT5vcHRpb25zWzBdLCBpdC0+b3B0aW9uc1sxXSk7CiAJcmV0dXJuIC1FSU87CiAKIGZvdW5kOgotCXByaW50aygiY29tZWRpJWQ6IGZvdW5kICVzIGF0IFBDSSBidXMgJWQsIHNsb3QgJWRcbiIsIGRldi0+bWlub3IsCisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAiY29tZWRpJWQ6IGZvdW5kICVzIGF0IFBDSSBidXMgJWQsIHNsb3QgJWRcbiIsIGRldi0+bWlub3IsCiAJICAgICAgIGJvYXJkLT5uYW1lLCBwY2lfZGV2aWNlLT5idXMtPm51bWJlciwKIAkgICAgICAgUENJX1NMT1QocGNpX2RldmljZS0+ZGV2Zm4pKTsKIAlkZXZwcml2LT5wY2lkZXYgPSBwY2lfZGV2aWNlOwpAQCAtMjA2LDkgKzIwOCw5IEBACiAJLyogZW5hYmxlIFBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgcmVnaW9ucyAqLwogCWVycm9yID0gY29tZWRpX3BjaV9lbmFibGUocGNpX2RldmljZSwgQ05UX0RSSVZFUl9OQU1FKTsKIAlpZiAoZXJyb3IgPCAwKSB7Ci0JCXByaW50awotCQkgICAgKCJjb21lZGklZDogZmFpbGVkIHRvIGVuYWJsZSBQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IHJlZ2lvbnMhXG4iLAotCQkgICAgIGRldi0+bWlub3IpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjb21lZGklZDogIgorCQkgICAgICAgImZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCByZWdpb25zIVxuIiwKKwkJICAgICAgIGRldi0+bWlub3IpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCkBAIC0yMzksNyArMjQxLDggQEAKIAlvdXRiKDAsIGRldi0+aW9iYXNlICsgMHgyMCk7CiAJb3V0YigwLCBkZXYtPmlvYmFzZSArIDB4NDApOwogCi0JcHJpbnRrKCJjb21lZGklZDogIiBDTlRfRFJJVkVSX05BTUUgIiBhdHRhY2hlZC5cbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiAiIENOVF9EUklWRVJfTkFNRSAiIGF0dGFjaGVkLlxuIiwKKwkgICAgICAgZGV2LT5taW5vcik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0OCwxMSArMjUxLDExIEBACiBzdGF0aWMgaW50IGNudF9kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAlpZiAoZGV2cHJpdiAmJiBkZXZwcml2LT5wY2lkZXYpIHsKLQkJaWYgKGRldi0+aW9iYXNlKSB7CisJCWlmIChkZXYtPmlvYmFzZSkKIAkJCWNvbWVkaV9wY2lfZGlzYWJsZShkZXZwcml2LT5wY2lkZXYpOwotCQl9CiAJCXBjaV9kZXZfcHV0KGRldnByaXYtPnBjaWRldik7CiAJfQotCXByaW50aygiY29tZWRpJWQ6ICIgQ05UX0RSSVZFUl9OQU1FICIgcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogIiBDTlRfRFJJVkVSX05BTUUgIiByZW1vdmVcbiIsCisJICAgICAgIGRldi0+bWlub3IpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5jCmluZGV4IDYwNzk5MTMuLjhiOWZhMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWU0MDAwLmMKQEAgLTg0MCw3ICs4NDAsNyBAQAogCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IHhpbGlueF9kb3dubG9hZCgpOiBET05FIGZsYWcgaXMgbm90IHNldFxuIiwKIAkJICAgICAgIGRldi0+bWlub3IpOwogCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiB4aWxpbnhfZG93bmxvYWQoKTogRG93bmxvYWQgbm90IHN1Y2Nlc2Z1bFxuIiwKKwkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiB4aWxpbnhfZG93bmxvYWQoKTogRG93bmxvYWQgbm90IHN1Y2Nlc3NmdWxcbiIsCiAJCSAgICAgICBkZXYtPm1pbm9yKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmMKaW5kZXggZTY1MmYzYi4uMTg4ZjU4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5jCkBAIC02NCw2ICs2NCw3IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZV9kZXZpY2VzOworRVhQT1JUX1NZTUJPTChtaXRlX2RldmljZXMpOwogCiAjZGVmaW5lIFRPUF9PRl9QQUdFKHgpICgoeCl8KH4oUEFHRV9NQVNLKSkpCiAKQEAgLTgwLDcgKzgxLDcgQEAKIAogCQkJbWl0ZSA9IGt6YWxsb2Moc2l6ZW9mKCptaXRlKSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIW1pdGUpIHsKLQkJCQlwcmludGsoIm1pdGU6IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIm1pdGU6IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJCQlwY2lfZGV2X3B1dChwY2lkZXYpOwogCQkJCXJldHVybjsKIAkJCX0KQEAgLTk5LDE0ICsxMDAsMTQgQEAKIAogc3RhdGljIHZvaWQgZHVtcF9jaGlwX3NpZ25hdHVyZSh1MzIgY3NpZ3JfYml0cykKIHsKLQlwcmludGsKLQkgICAgKCJtaXRlOiB2ZXJzaW9uID0gJWksIHR5cGUgPSAlaSwgbWl0ZSBtb2RlID0gJWksIGludGVyZmFjZSBtb2RlID0gJWlcbiIsCi0JICAgICBtaXRlX2NzaWdyX3ZlcnNpb24oY3NpZ3JfYml0cyksIG1pdGVfY3NpZ3JfdHlwZShjc2lncl9iaXRzKSwKLQkgICAgIG1pdGVfY3NpZ3JfbW1vZGUoY3NpZ3JfYml0cyksIG1pdGVfY3NpZ3JfaW1vZGUoY3NpZ3JfYml0cykpOwotCXByaW50awotCSAgICAoIm1pdGU6IG51bSBjaGFubmVscyA9ICVpLCB3cml0ZSBwb3N0IGZpZm8gZGVwdGggPSAlaSwgd2lucyA9ICVpLCBpb3dpbnMgPSAlaVxuIiwKLQkgICAgIG1pdGVfY3NpZ3JfZG1hYyhjc2lncl9iaXRzKSwgbWl0ZV9jc2lncl93cGRlcChjc2lncl9iaXRzKSwKLQkgICAgIG1pdGVfY3NpZ3Jfd2lucyhjc2lncl9iaXRzKSwgbWl0ZV9jc2lncl9pb3dpbnMoY3NpZ3JfYml0cykpOworCXByaW50ayhLRVJOX0lORk8gIm1pdGU6IHZlcnNpb24gPSAlaSwgdHlwZSA9ICVpLCBtaXRlIG1vZGUgPSAlaSwiCisJICAgICAgICJpbnRlcmZhY2UgbW9kZSA9ICVpXG4iLAorCSAgICAgICBtaXRlX2NzaWdyX3ZlcnNpb24oY3NpZ3JfYml0cyksIG1pdGVfY3NpZ3JfdHlwZShjc2lncl9iaXRzKSwKKwkgICAgICAgbWl0ZV9jc2lncl9tbW9kZShjc2lncl9iaXRzKSwgbWl0ZV9jc2lncl9pbW9kZShjc2lncl9iaXRzKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAibWl0ZTogbnVtIGNoYW5uZWxzID0gJWksIHdyaXRlIHBvc3QgZmlmbyBkZXB0aCA9ICVpLCIKKwkgICAgICAgIndpbnMgPSAlaSwgaW93aW5zID0gJWlcbiIsCisJICAgICAgIG1pdGVfY3NpZ3JfZG1hYyhjc2lncl9iaXRzKSwgbWl0ZV9jc2lncl93cGRlcChjc2lncl9iaXRzKSwKKwkgICAgICAgbWl0ZV9jc2lncl93aW5zKGNzaWdyX2JpdHMpLCBtaXRlX2NzaWdyX2lvd2lucyhjc2lncl9iaXRzKSk7CiB9CiAKIHVuc2lnbmVkIG1pdGVfZmlmb19zaXplKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSwgdW5zaWduZWQgY2hhbm5lbCkKQEAgLTEyNiw3ICsxMjcsNyBAQAogCXVuc2lnbmVkIHVua25vd25fZG1hX2J1cnN0X2JpdHM7CiAKIAlpZiAoY29tZWRpX3BjaV9lbmFibGUobWl0ZS0+cGNpZGV2LCAibWl0ZSIpKSB7Ci0JCXByaW50aygiZXJyb3IgZW5hYmxpbmcgbWl0ZSBhbmQgcmVxdWVzdGluZyBpbyByZWdpb25zXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJlcnJvciBlbmFibGluZyBtaXRlIGFuZCByZXF1ZXN0aW5nIGlvIHJlZ2lvbnNcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJcGNpX3NldF9tYXN0ZXIobWl0ZS0+cGNpZGV2KTsKQEAgLTEzNSwyNyArMTM2LDMwIEBACiAJbWl0ZS0+bWl0ZV9waHlzX2FkZHIgPSBhZGRyOwogCW1pdGUtPm1pdGVfaW9fYWRkciA9IGlvcmVtYXAoYWRkciwgUENJX01JVEVfU0laRSk7CiAJaWYgKCFtaXRlLT5taXRlX2lvX2FkZHIpIHsKLQkJcHJpbnRrKCJmYWlsZWQgdG8gcmVtYXAgbWl0ZSBpbyBtZW1vcnkgYWRkcmVzc1xuIik7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlbWFwIG1pdGUgaW8gbWVtb3J5IGFkZHJlc3NcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JcHJpbnRrKCJNSVRFOjB4JTA4bGx4IG1hcHBlZCB0byAlcCAiLAorCXByaW50ayhLRVJOX0lORk8gIk1JVEU6MHglMDhsbHggbWFwcGVkIHRvICVwICIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbWl0ZS0+bWl0ZV9waHlzX2FkZHIsIG1pdGUtPm1pdGVfaW9fYWRkcik7CiAKIAlhZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KG1pdGUtPnBjaWRldiwgMSk7CiAJbWl0ZS0+ZGFxX3BoeXNfYWRkciA9IGFkZHI7CiAJbGVuZ3RoID0gcGNpX3Jlc291cmNlX2xlbihtaXRlLT5wY2lkZXYsIDEpOwotCS8qICBJbiBjYXNlIG9mIGEgNjYweCBib2FyZCwgREFRIHNpemUgaXMgOGsgaW5zdGVhZCBvZiA0ayAoc2VlIGFzIHNob3duIGJ5IGxzcGNpIG91dHB1dCkgKi8KKwkvKgorCSAqIEluIGNhc2Ugb2YgYSA2NjB4IGJvYXJkLCBEQVEgc2l6ZSBpcyA4ayBpbnN0ZWFkIG9mIDRrCisJICogKHNlZSBhcyBzaG93biBieSBsc3BjaSBvdXRwdXQpCisJICovCiAJbWl0ZS0+ZGFxX2lvX2FkZHIgPSBpb3JlbWFwKG1pdGUtPmRhcV9waHlzX2FkZHIsIGxlbmd0aCk7CiAJaWYgKCFtaXRlLT5kYXFfaW9fYWRkcikgewotCQlwcmludGsoImZhaWxlZCB0byByZW1hcCBkYXEgaW8gbWVtb3J5IGFkZHJlc3NcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZW1hcCBkYXEgaW8gbWVtb3J5IGFkZHJlc3NcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JcHJpbnRrKCJEQVE6MHglMDhsbHggbWFwcGVkIHRvICVwXG4iLAorCXByaW50ayhLRVJOX0lORk8gIkRBUToweCUwOGxseCBtYXBwZWQgdG8gJXBcbiIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbWl0ZS0+ZGFxX3BoeXNfYWRkciwgbWl0ZS0+ZGFxX2lvX2FkZHIpOwogCiAJaWYgKHVzZV9pb2R3YnNyXzEpIHsKIAkJd3JpdGVsKDAsIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfSU9EV0JTUik7Ci0JCXByaW50aygibWl0ZTogdXNpbmcgSS9PIFdpbmRvdyBCYXNlIFNpemUgcmVnaXN0ZXIgMVxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIm1pdGU6IHVzaW5nIEkvTyBXaW5kb3cgQmFzZSBTaXplIHJlZ2lzdGVyIDFcbiIpOwogCQl3cml0ZWwobWl0ZS0+ZGFxX3BoeXNfYWRkciB8IFdFTkFCIHwKIAkJICAgICAgIE1JVEVfSU9EV0JTUl8xX1dTSVpFX2JpdHMobGVuZ3RoKSwKIAkJICAgICAgIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfSU9EV0JTUl8xKTsKQEAgLTE2NCwxMSArMTY4LDEyIEBACiAJCXdyaXRlbChtaXRlLT5kYXFfcGh5c19hZGRyIHwgV0VOQUIsCiAJCSAgICAgICBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0lPRFdCU1IpOwogCX0KLQkvKiBtYWtlIHN1cmUgZG1hIGJ1cnN0cyB3b3JrLiAgSSBnb3QgdGhpcyBmcm9tIHJ1bm5pbmcgYSBidXMgYW5hbHl6ZXIKLQkgICBvbiBhIHB4aS02MjgxIGFuZCBhIHB4aS02NzEzLiAgNjcxMyBwb3dlcmVkIHVwIHdpdGggcmVnaXN0ZXIgdmFsdWUKLQkgICBvZiAweDYxZiBhbmQgYnVyc3RzIHdvcmtlZC4gIDYyODEgcG93ZXJlZCB1cCB3aXRoIHJlZ2lzdGVyIHZhbHVlIG9mCi0JICAgMHgxZiBhbmQgYnVyc3RzIGRpZG4ndCB3b3JrLiAgVGhlIE5JIHdpbmRvd3MgZHJpdmVyIHJlYWRzIHRoZSByZWdpc3RlciwKLQkgICB0aGVuIGRvZXMgYSBiaXR3aXNlLW9yIG9mIDB4NjAwIHdpdGggaXQgYW5kIHdyaXRlcyBpdCBiYWNrLgorCS8qCisJICogbWFrZSBzdXJlIGRtYSBidXJzdHMgd29yay4gSSBnb3QgdGhpcyBmcm9tIHJ1bm5pbmcgYSBidXMgYW5hbHl6ZXIKKwkgKiBvbiBhIHB4aS02MjgxIGFuZCBhIHB4aS02NzEzLiA2NzEzIHBvd2VyZWQgdXAgd2l0aCByZWdpc3RlciB2YWx1ZQorCSAqIG9mIDB4NjFmIGFuZCBidXJzdHMgd29ya2VkLiA2MjgxIHBvd2VyZWQgdXAgd2l0aCByZWdpc3RlciB2YWx1ZSBvZgorCSAqIDB4MWYgYW5kIGJ1cnN0cyBkaWRuJ3Qgd29yay4gVGhlIE5JIHdpbmRvd3MgZHJpdmVyIHJlYWRzIHRoZQorCSAqIHJlZ2lzdGVyLCB0aGVuIGRvZXMgYSBiaXR3aXNlLW9yIG9mIDB4NjAwIHdpdGggaXQgYW5kIHdyaXRlcyBpdCBiYWNrLgogCSAqLwogCXVua25vd25fZG1hX2J1cnN0X2JpdHMgPQogCSAgICByZWFkbChtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX1VOS05PV05fRE1BX0JVUlNUX1JFRyk7CkBAIC0xNzksOSArMTg0LDkgQEAKIAljc2lncl9iaXRzID0gcmVhZGwobWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9DU0lHUik7CiAJbWl0ZS0+bnVtX2NoYW5uZWxzID0gbWl0ZV9jc2lncl9kbWFjKGNzaWdyX2JpdHMpOwogCWlmIChtaXRlLT5udW1fY2hhbm5lbHMgPiBNQVhfTUlURV9ETUFfQ0hBTk5FTFMpIHsKLQkJcHJpbnRrCi0JCSAgICAoIm1pdGU6IGJ1Zz8gY2hpcCBjbGFpbXMgdG8gaGF2ZSAlaSBkbWEgY2hhbm5lbHMuICBTZXR0aW5nIHRvICVpLlxuIiwKLQkJICAgICBtaXRlLT5udW1fY2hhbm5lbHMsIE1BWF9NSVRFX0RNQV9DSEFOTkVMUyk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1pdGU6IGJ1Zz8gY2hpcCBjbGFpbXMgdG8gaGF2ZSAlaSBkbWEgIgorCQkgICAgICAgImNoYW5uZWxzLiBTZXR0aW5nIHRvICVpLlxuIiwKKwkJICAgICAgIG1pdGUtPm51bV9jaGFubmVscywgTUFYX01JVEVfRE1BX0NIQU5ORUxTKTsKIAkJbWl0ZS0+bnVtX2NoYW5uZWxzID0gTUFYX01JVEVfRE1BX0NIQU5ORUxTOwogCX0KIAlkdW1wX2NoaXBfc2lnbmF0dXJlKGNzaWdyX2JpdHMpOwpAQCAtMTk0LDE2ICsxOTksMTggQEAKIAkJICAgICAgIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfQ0hDUihpKSk7CiAJfQogCW1pdGUtPmZpZm9fc2l6ZSA9IG1pdGVfZmlmb19zaXplKG1pdGUsIDApOwotCXByaW50aygibWl0ZTogZmlmbyBzaXplIGlzICVpLlxuIiwgbWl0ZS0+Zmlmb19zaXplKTsKKwlwcmludGsoS0VSTl9JTkZPICJtaXRlOiBmaWZvIHNpemUgaXMgJWkuXG4iLCBtaXRlLT5maWZvX3NpemUpOwogCW1pdGUtPnVzZWQgPSAxOwogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfc2V0dXAyKTsKIAogaW50IG1pdGVfc2V0dXAoc3RydWN0IG1pdGVfc3RydWN0ICptaXRlKQogewogCXJldHVybiBtaXRlX3NldHVwMihtaXRlLCAwKTsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9zZXR1cCk7CiAKIHZvaWQgbWl0ZV9jbGVhbnVwKHZvaWQpCiB7CkBAIC0yMzgsMjIgKzI0NSwyMyBAQAogCiAJbWl0ZS0+dXNlZCA9IDA7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfdW5zZXR1cCk7CiAKIHZvaWQgbWl0ZV9saXN0X2RldmljZXModm9pZCkKIHsKIAlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUsICpuZXh0OwogCi0JcHJpbnRrKCJBdmFpbGFibGUgTkkgZGV2aWNlIElEczoiKTsKKwlwcmludGsoS0VSTl9JTkZPICJBdmFpbGFibGUgTkkgZGV2aWNlIElEczoiKTsKIAlpZiAobWl0ZV9kZXZpY2VzKQogCQlmb3IgKG1pdGUgPSBtaXRlX2RldmljZXM7IG1pdGU7IG1pdGUgPSBuZXh0KSB7CiAJCQluZXh0ID0gbWl0ZS0+bmV4dDsKLQkJCXByaW50aygiIDB4JTA0eCIsIG1pdGVfZGV2aWNlX2lkKG1pdGUpKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiAweCUwNHgiLCBtaXRlX2RldmljZV9pZChtaXRlKSk7CiAJCQlpZiAobWl0ZS0+dXNlZCkKLQkJCQlwcmludGsoIih1c2VkKSIpOworCQkJCXByaW50ayhLRVJOX0lORk8gIih1c2VkKSIpOwogCQl9Ci0JcHJpbnRrKCJcbiIpOwotCisJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9saXN0X2RldmljZXMpOwogCiBzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX3JlcXVlc3RfY2hhbm5lbF9pbl9yYW5nZShzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUsCiAJCQkJCQkgICBzdHJ1Y3QKQEAgLTI2NSw3ICsyNzMsOSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IG1pdGVfY2hhbm5lbCAqY2hhbm5lbCA9IE5VTEw7CiAKLQkvKiAgc3BpbiBsb2NrIHNvIG1pdGVfcmVsZWFzZV9jaGFubmVsIGNhbiBiZSBjYWxsZWQgc2FmZWx5IGZyb20gaW50ZXJydXB0cyAqLworCS8qIHNwaW4gbG9jayBzbyBtaXRlX3JlbGVhc2VfY2hhbm5lbCBjYW4gYmUgY2FsbGVkIHNhZmVseQorCSAqIGZyb20gaW50ZXJydXB0cworCSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZtaXRlLT5sb2NrLCBmbGFncyk7CiAJZm9yIChpID0gbWluX2NoYW5uZWw7IGkgPD0gbWF4X2NoYW5uZWw7ICsraSkgewogCQlpZiAobWl0ZS0+Y2hhbm5lbF9hbGxvY2F0ZWRbaV0gPT0gMCkgewpAQCAtMjc4LDYgKzI4OCw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWl0ZS0+bG9jaywgZmxhZ3MpOwogCXJldHVybiBjaGFubmVsOwogfQorRVhQT1JUX1NZTUJPTChtaXRlX3JlcXVlc3RfY2hhbm5lbF9pbl9yYW5nZSk7CiAKIHZvaWQgbWl0ZV9yZWxlYXNlX2NoYW5uZWwoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQogewpAQCAtMjg5LDggKzMwMCwxMCBAQAogCWlmIChtaXRlLT5jaGFubmVsX2FsbG9jYXRlZFttaXRlX2NoYW4tPmNoYW5uZWxdKSB7CiAJCW1pdGVfZG1hX2Rpc2FybShtaXRlX2NoYW4pOwogCQltaXRlX2RtYV9yZXNldChtaXRlX2NoYW4pOwotLyogZGlzYWJsZSBhbGwgY2hhbm5lbCdzIGludGVycnVwdHMgKGRvIGl0IGFmdGVyIGRpc2FybS9yZXNldCBzbwotTUlURV9DSENSIHJlZyBpc24ndCBjaGFuZ2VkIHdoaWxlIGRtYSBpcyBzdGlsbCBhY3RpdmUhKSAqLworCS8qCisJICogZGlzYWJsZSBhbGwgY2hhbm5lbCdzIGludGVycnVwdHMgKGRvIGl0IGFmdGVyIGRpc2FybS9yZXNldCBzbworCSAqIE1JVEVfQ0hDUiByZWcgaXNuJ3QgY2hhbmdlZCB3aGlsZSBkbWEgaXMgc3RpbGwgYWN0aXZlISkKKwkgKi8KIAkJd3JpdGVsKENIQ1JfQ0xSX0RNQV9JRSB8IENIQ1JfQ0xSX0xJTktQX0lFIHwKIAkJICAgICAgIENIQ1JfQ0xSX1NBUl9JRSB8IENIQ1JfQ0xSX0RPTkVfSUUgfAogCQkgICAgICAgQ0hDUl9DTFJfTVJEWV9JRSB8IENIQ1JfQ0xSX0RSRFlfSUUgfApAQCAtMzAyLDYgKzMxNSw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9yZWxlYXNlX2NoYW5uZWwpOwogCiB2b2lkIG1pdGVfZG1hX2FybShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCiB7CkBAIC0zMTAsOCArMzI0LDEwIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCU1EUFJJTlRLKCJtaXRlX2RtYV9hcm0gY2glaVxuIiwgY2hhbm5lbCk7Ci0JLyogbWVtb3J5IGJhcnJpZXIgaXMgaW50ZW5kZWQgdG8gaW5zdXJlIGFueSB0d2lkZGxpbmcgd2l0aCB0aGUgYnVmZmVyCi0JICAgaXMgZG9uZSBiZWZvcmUgd3JpdGluZyB0byB0aGUgbWl0ZSB0byBhcm0gZG1hIHRyYW5zZmVyICovCisJLyoKKwkgKiBtZW1vcnkgYmFycmllciBpcyBpbnRlbmRlZCB0byBpbnN1cmUgYW55IHR3aWRkbGluZyB3aXRoIHRoZSBidWZmZXIKKwkgKiBpcyBkb25lIGJlZm9yZSB3cml0aW5nIHRvIHRoZSBtaXRlIHRvIGFybSBkbWEgdHJhbnNmZXIKKwkgKi8KIAlzbXBfbWIoKTsKIAkvKiBhcm0gKi8KIAljaG9yID0gQ0hPUl9TVEFSVDsKQEAgLTMyMiw2ICszMzgsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKIC8qICAgICAgIG1pdGVfZG1hX3RjcihtaXRlLCBjaGFubmVsKTsgKi8KIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9kbWFfYXJtKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0zNTQsNyArMzcxLDcgQEAKIAkJCSAgICAgICBuX2xpbmtzICogc2l6ZW9mKHN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yKSwKIAkJCSAgICAgICAmcmluZy0+ZGVzY3JpcHRvcnNfZG1hX2FkZHIsIEdGUF9LRVJORUwpOwogCWlmICghcmluZy0+ZGVzY3JpcHRvcnMpIHsKLQkJcHJpbnRrKCJtaXRlOiByaW5nIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAibWl0ZTogcmluZyBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJcmluZy0+bl9saW5rcyA9IG5fbGlua3M7CkBAIC0zNzAsMTEgKzM4NywxNCBAQAogCX0KIAlyaW5nLT5kZXNjcmlwdG9yc1tuX2xpbmtzIC0gMV0ubmV4dCA9CiAJICAgIGNwdV90b19sZTMyKHJpbmctPmRlc2NyaXB0b3JzX2RtYV9hZGRyKTsKLQkvKiBiYXJyaWVyIGlzIG1lYW50IHRvIGluc3VyZSB0aGF0IGFsbCB0aGUgd3JpdGVzIHRvIHRoZSBkbWEgZGVzY3JpcHRvcnMKLQkgICBoYXZlIGNvbXBsZXRlZCBiZWZvcmUgdGhlIGRtYSBjb250cm9sbGVyIGlzIGNvbW1hbmRlZCB0byByZWFkIHRoZW0gKi8KKwkvKgorCSAqIGJhcnJpZXIgaXMgbWVhbnQgdG8gaW5zdXJlIHRoYXQgYWxsIHRoZSB3cml0ZXMgdG8gdGhlIGRtYSBkZXNjcmlwdG9ycworCSAqIGhhdmUgY29tcGxldGVkIGJlZm9yZSB0aGUgZG1hIGNvbnRyb2xsZXIgaXMgY29tbWFuZGVkIHRvIHJlYWQgdGhlbQorCSAqLwogCXNtcF93bWIoKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9idWZfY2hhbmdlKTsKIAogdm9pZCBtaXRlX3ByZXBfZG1hKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbiwKIAkJICAgdW5zaWduZWQgaW50IG51bV9kZXZpY2VfYml0cywgdW5zaWduZWQgaW50IG51bV9tZW1vcnlfYml0cykKQEAgLTM5NSwxNiArNDE1LDE5IEBACiAJICogTGluayBDb21wbGV0ZSBJbnRlcnJ1cHQ6IGludGVycnVwdCBldmVyeSB0aW1lIGEgbGluawogCSAqIGluIE1JVEVfUklORyBpcyBjb21wbGV0ZWQuIFRoaXMgY2FuIGdlbmVyYXRlIGEgbG90IG9mCiAJICogZXh0cmEgaW50ZXJydXB0cywgYnV0IHJpZ2h0IG5vdyB3ZSB1cGRhdGUgdGhlIHZhbHVlcwotCSAqIG9mIGJ1Zl9pbnRfcHRyIGFuZCBidWZfaW50X2NvdW50IGF0IGVhY2ggaW50ZXJydXB0LiAgQQorCSAqIG9mIGJ1Zl9pbnRfcHRyIGFuZCBidWZfaW50X2NvdW50IGF0IGVhY2ggaW50ZXJydXB0LiBBCiAJICogYmV0dGVyIG1ldGhvZCBpcyB0byBwb2xsIHRoZSBNSVRFIGJlZm9yZSBlYWNoIHVzZXIKIAkgKiAicmVhZCgpIiB0byBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUuCiAJICovCiAJY2hjciB8PSBDSENSX1NFVF9MQ19JRTsKIAlpZiAobnVtX21lbW9yeV9iaXRzID09IDMyICYmIG51bV9kZXZpY2VfYml0cyA9PSAxNikgewotCQkvKiBEb2luZyBhIGNvbWJpbmVkIDMyIGFuZCAxNiBiaXQgYnl0ZXN3YXAgZ2V0cyB0aGUgMTYgYml0IHNhbXBsZXMgaW50byB0aGUgZmlmbyBpbiB0aGUgcmlnaHQgb3JkZXIuCi0JCSAgIFRlc3RlZCBkb2luZyAzMiBiaXQgbWVtb3J5IHRvIDE2IGJpdCBkZXZpY2UgdHJhbnNmZXJzIHRvIHRoZSBhbmFsb2cgb3V0IG9mIGEgcHhpLTYyODEsCi0JCSAgIHdoaWNoIGhhcyBtaXRlIHZlcnNpb24gPSAxLCB0eXBlID0gNC4gIFRoaXMgYWxzbyB3b3JrcyBmb3IgZG1hIHJlYWRzIGZyb20gdGhlIGNvdW50ZXJzCi0JCSAgIG9uIGUtc2VyaWVzIGJvYXJkcy4gICovCisJCS8qCisJCSAqIERvaW5nIGEgY29tYmluZWQgMzIgYW5kIDE2IGJpdCBieXRlc3dhcCBnZXRzIHRoZSAxNiBiaXQKKwkJICogc2FtcGxlcyBpbnRvIHRoZSBmaWZvIGluIHRoZSByaWdodCBvcmRlci4gVGVzdGVkIGRvaW5nIDMyIGJpdAorCQkgKiBtZW1vcnkgdG8gMTYgYml0IGRldmljZSB0cmFuc2ZlcnMgdG8gdGhlIGFuYWxvZyBvdXQgb2YgYQorCQkgKiBweGktNjI4MSwgd2hpY2ggaGFzIG1pdGUgdmVyc2lvbiA9IDEsIHR5cGUgPSA0LiBUaGlzIGFsc28KKwkJICogd29ya3MgZm9yIGRtYSByZWFkcyBmcm9tIHRoZSBjb3VudGVycyBvbiBlLXNlcmllcyBib2FyZHMuCisJCSAqLwogCQljaGNyIHw9IENIQ1JfQllURV9TV0FQX0RFVklDRSB8IENIQ1JfQllURV9TV0FQX01FTU9SWTsKIAl9CiAJaWYgKG1pdGVfY2hhbi0+ZGlyID09IENPTUVESV9JTlBVVCkKQEAgLTQyNSw3ICs0NDgsOCBAQAogCQltY3IgfD0gQ1JfUFNJWkUzMjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKCJtaXRlOiBidWchIGludmFsaWQgbWVtIGJpdCB3aWR0aCBmb3IgZG1hIHRyYW5zZmVyXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWl0ZTogYnVnISBpbnZhbGlkIG1lbSBiaXQgd2lkdGggZm9yIGRtYSAiCisJCSAgICAgICAidHJhbnNmZXJcbiIpOwogCQlicmVhazsKIAl9CiAJd3JpdGVsKG1jciwgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9NQ1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7CkBAIC00NDQsNyArNDY4LDggQEAKIAkJZGNyIHw9IENSX1BTSVpFMzI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50aygibWl0ZTogYnVnISBpbnZhbGlkIGRldiBiaXQgd2lkdGggZm9yIGRtYSB0cmFuc2ZlclxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1pdGU6IGJ1ZyEgaW52YWxpZCBkZXYgYml0IHdpZHRoIGZvciBkbWEgIgorCQkgICAgICAgInRyYW5zZmVyXG4iKTsKIAkJYnJlYWs7CiAJfQogCXdyaXRlbChkY3IsIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfRENSKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOwpAQCAtNDYyLDYgKzQ4Nyw3IEBACiAKIAlNRFBSSU5USygiZXhpdCBtaXRlX3ByZXBfZG1hXG4iKTsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9wcmVwX2RtYSk7CiAKIHUzMiBtaXRlX2RldmljZV9ieXRlc190cmFuc2ZlcnJlZChzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCiB7CkBAIC00NjksNDggKzQ5NSw1MyBAQAogCXJldHVybiByZWFkbChtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0RBUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKIH0KIAotdTMyIG1pdGVfYnl0ZXNfaW5fdHJhbnNpdChzdHJ1Y3QgbWl0ZV9jaGFubmVsICogbWl0ZV9jaGFuKQordTMyIG1pdGVfYnl0ZXNfaW5fdHJhbnNpdChzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCiB7CiAJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlID0gbWl0ZV9jaGFuLT5taXRlOwogCXJldHVybiByZWFkbChtaXRlLT5taXRlX2lvX2FkZHIgKwogCQkgICAgIE1JVEVfRkNSKG1pdGVfY2hhbi0+Y2hhbm5lbCkpICYgMHgwMDAwMDBGRjsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9ieXRlc19pbl90cmFuc2l0KTsKIAotLyogIHJldHVybnMgbG93ZXIgYm91bmQgZm9yIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBmcm9tIGRldmljZSB0byBtZW1vcnkgKi8KLXUzMiBtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X2xiKHN0cnVjdCBtaXRlX2NoYW5uZWwgKiBtaXRlX2NoYW4pCisvKiByZXR1cm5zIGxvd2VyIGJvdW5kIGZvciBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgZnJvbSBkZXZpY2UgdG8gbWVtb3J5ICovCit1MzIgbWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV9sYihzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCiB7CiAJdTMyIGRldmljZV9ieXRlX2NvdW50OwogCiAJZGV2aWNlX2J5dGVfY291bnQgPSBtaXRlX2RldmljZV9ieXRlc190cmFuc2ZlcnJlZChtaXRlX2NoYW4pOwogCXJldHVybiBkZXZpY2VfYnl0ZV9jb3VudCAtIG1pdGVfYnl0ZXNfaW5fdHJhbnNpdChtaXRlX2NoYW4pOwogfQorRVhQT1JUX1NZTUJPTChtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X2xiKTsKIAotLyogIHJldHVybnMgdXBwZXIgYm91bmQgZm9yIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBmcm9tIGRldmljZSB0byBtZW1vcnkgKi8KLXUzMiBtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X3ViKHN0cnVjdCBtaXRlX2NoYW5uZWwgKiBtaXRlX2NoYW4pCisvKiByZXR1cm5zIHVwcGVyIGJvdW5kIGZvciBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgZnJvbSBkZXZpY2UgdG8gbWVtb3J5ICovCit1MzIgbWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV91YihzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCiB7CiAJdTMyIGluX3RyYW5zaXRfY291bnQ7CiAKIAlpbl90cmFuc2l0X2NvdW50ID0gbWl0ZV9ieXRlc19pbl90cmFuc2l0KG1pdGVfY2hhbik7CiAJcmV0dXJuIG1pdGVfZGV2aWNlX2J5dGVzX3RyYW5zZmVycmVkKG1pdGVfY2hhbikgLSBpbl90cmFuc2l0X2NvdW50OwogfQorRVhQT1JUX1NZTUJPTChtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X3ViKTsKIAotLyogIHJldHVybnMgbG93ZXIgYm91bmQgZm9yIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gbWVtb3J5IGZvciB0cmFuc2ZlciB0byBkZXZpY2UgKi8KLXUzMiBtaXRlX2J5dGVzX3JlYWRfZnJvbV9tZW1vcnlfbGIoc3RydWN0IG1pdGVfY2hhbm5lbCAqIG1pdGVfY2hhbikKKy8qIHJldHVybnMgbG93ZXIgYm91bmQgZm9yIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gbWVtb3J5IHRvIGRldmljZSAqLwordTMyIG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV9sYihzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCiB7CiAJdTMyIGRldmljZV9ieXRlX2NvdW50OwogCiAJZGV2aWNlX2J5dGVfY291bnQgPSBtaXRlX2RldmljZV9ieXRlc190cmFuc2ZlcnJlZChtaXRlX2NoYW4pOwogCXJldHVybiBkZXZpY2VfYnl0ZV9jb3VudCArIG1pdGVfYnl0ZXNfaW5fdHJhbnNpdChtaXRlX2NoYW4pOwogfQorRVhQT1JUX1NZTUJPTChtaXRlX2J5dGVzX3JlYWRfZnJvbV9tZW1vcnlfbGIpOwogCi0vKiAgcmV0dXJucyB1cHBlciBib3VuZCBmb3IgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBtZW1vcnkgZm9yIHRyYW5zZmVyIHRvIGRldmljZSAqLwotdTMyIG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV91YihzdHJ1Y3QgbWl0ZV9jaGFubmVsICogbWl0ZV9jaGFuKQorLyogcmV0dXJucyB1cHBlciBib3VuZCBmb3IgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBtZW1vcnkgdG8gZGV2aWNlICovCit1MzIgbWl0ZV9ieXRlc19yZWFkX2Zyb21fbWVtb3J5X3ViKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKIHsKIAl1MzIgaW5fdHJhbnNpdF9jb3VudDsKIAogCWluX3RyYW5zaXRfY291bnQgPSBtaXRlX2J5dGVzX2luX3RyYW5zaXQobWl0ZV9jaGFuKTsKIAlyZXR1cm4gbWl0ZV9kZXZpY2VfYnl0ZXNfdHJhbnNmZXJyZWQobWl0ZV9jaGFuKSArIGluX3RyYW5zaXRfY291bnQ7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV91Yik7CiAKIHVuc2lnbmVkIG1pdGVfZG1hX3RjcihzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCiB7CkBAIC01MjUsNiArNTU2LDcgQEAKIAogCXJldHVybiB0Y3I7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfZG1hX3Rjcik7CiAKIHZvaWQgbWl0ZV9kbWFfZGlzYXJtKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKIHsKQEAgLTUzNSw2ICs1NjcsNyBAQAogCWNob3IgPSBDSE9SX0FCT1JUOwogCXdyaXRlbChjaG9yLCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NIT1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfZG1hX2Rpc2FybSk7CiAKIGludCBtaXRlX3N5bmNfaW5wdXRfZG1hKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbiwKIAkJCXN0cnVjdCBjb21lZGlfYXN5bmMgKmFzeW5jKQpAQCAtNTQ0LDcgKzU3Nyw3IEBACiAJY29uc3QgdW5zaWduZWQgYnl0ZXNfcGVyX3NjYW4gPSBjZmNfYnl0ZXNfcGVyX3NjYW4oYXN5bmMtPnN1YmRldmljZSk7CiAKIAlvbGRfYWxsb2NfY291bnQgPSBhc3luYy0+YnVmX3dyaXRlX2FsbG9jX2NvdW50OwotCS8qICB3cml0ZSBhbGxvYyBhcyBtdWNoIGFzIHdlIGNhbiAqLworCS8qIHdyaXRlIGFsbG9jIGFzIG11Y2ggYXMgd2UgY2FuICovCiAJY29tZWRpX2J1Zl93cml0ZV9hbGxvYyhhc3luYywgYXN5bmMtPnByZWFsbG9jX2J1ZnN6KTsKIAogCW5ieXRlcyA9IG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfbGIobWl0ZV9jaGFuKTsKQEAgLTU3MSw2ICs2MDQsNyBAQAogCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChtaXRlX3N5bmNfaW5wdXRfZG1hKTsKIAogaW50IG1pdGVfc3luY19vdXRwdXRfZG1hKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbiwKIAkJCSBzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYykKQEAgLTU5Myw3ICs2MjcsNyBAQAogCSAgICAoaW50KShuYnl0ZXNfdWIgLSBzdG9wX2NvdW50KSA+IDApCiAJCW5ieXRlc191YiA9IHN0b3BfY291bnQ7CiAJaWYgKChpbnQpKG5ieXRlc191YiAtIG9sZF9hbGxvY19jb3VudCkgPiAwKSB7Ci0JCXByaW50aygibWl0ZTogRE1BIHVuZGVycnVuXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaXRlOiBETUEgdW5kZXJydW5cbiIpOwogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTYwNyw2ICs2NDEsNyBAQAogCX0KIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9zeW5jX291dHB1dF9kbWEpOwogCiB1bnNpZ25lZCBtaXRlX2dldF9zdGF0dXMoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQogewpAQCAtNjI1LDYgKzY2MCw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWl0ZS0+bG9jaywgZmxhZ3MpOwogCXJldHVybiBzdGF0dXM7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfZ2V0X3N0YXR1cyk7CiAKIGludCBtaXRlX2RvbmUoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQogewpAQCAtNjM4LDYgKzY3NCw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWl0ZS0+bG9jaywgZmxhZ3MpOwogCXJldHVybiBkb25lOwogfQorRVhQT1JUX1NZTUJPTChtaXRlX2RvbmUpOwogCiAjaWZkZWYgREVCVUdfTUlURQogCkBAIC03MTksNDYgKzc1Niw1MSBAQAogCXVuc2lnbmVkIGxvbmcgYWRkciA9IDA7CiAJdW5zaWduZWQgbG9uZyB0ZW1wID0gMDsKIAotCXByaW50aygibWl0ZV9kdW1wX3JlZ3MgY2glaVxuIiwgbWl0ZV9jaGFuLT5jaGFubmVsKTsKLQlwcmludGsoIm1pdGUgYWRkcmVzcyBpcyAgPTB4JTA4bHhcbiIsIG1pdGVfaW9fYWRkcik7CisJcHJpbnRrKEtFUk5fREVCVUcgIm1pdGVfZHVtcF9yZWdzIGNoJWlcbiIsIG1pdGVfY2hhbi0+Y2hhbm5lbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIm1pdGUgYWRkcmVzcyBpcyAgPTB4JTA4bHhcbiIsIG1pdGVfaW9fYWRkcik7CiAKIAlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9DSE9SKGNoYW5uZWwpOwotCXByaW50aygibWl0ZSBzdGF0dXNbQ0hPUl1hdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLCB0ZW1wID0KLQkgICAgICAgcmVhZGwoYWRkcikpOworCXByaW50ayhLRVJOX0RFQlVHICJtaXRlIHN0YXR1c1tDSE9SXWF0IDB4JTA4bHggPTB4JTA4bHhcbiIsIGFkZHIsCisJICAgICAgIHRlbXAgPSByZWFkbChhZGRyKSk7CiAJbWl0ZV9kZWNvZGUobWl0ZV9DSE9SX3N0cmluZ3MsIHRlbXApOwogCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0NIQ1IoY2hhbm5lbCk7Ci0JcHJpbnRrKCJtaXRlIHN0YXR1c1tDSENSXWF0IDB4JTA4bHggPTB4JTA4bHhcbiIsIGFkZHIsIHRlbXAgPQotCSAgICAgICByZWFkbChhZGRyKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIm1pdGUgc3RhdHVzW0NIQ1JdYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwKKwkgICAgICAgdGVtcCA9IHJlYWRsKGFkZHIpKTsKIAltaXRlX2RlY29kZShtaXRlX0NIQ1Jfc3RyaW5ncywgdGVtcCk7CiAJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfVENSKGNoYW5uZWwpOwotCXByaW50aygibWl0ZSBzdGF0dXNbVENSXSBhdCAweCUwOGx4ID0weCUwOHhcbiIsIGFkZHIsIHJlYWRsKGFkZHIpKTsKLQlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9NQ1IoY2hhbm5lbCk7Ci0JcHJpbnRrKCJtaXRlIHN0YXR1c1tNQ1JdIGF0IDB4JTA4bHggPTB4JTA4bHhcbiIsIGFkZHIsIHRlbXAgPQorCXByaW50ayhLRVJOX0RFQlVHICJtaXRlIHN0YXR1c1tUQ1JdIGF0IDB4JTA4bHggPTB4JTA4eFxuIiwgYWRkciwKIAkgICAgICAgcmVhZGwoYWRkcikpOworCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX01DUihjaGFubmVsKTsKKwlwcmludGsoS0VSTl9ERUJVRyAibWl0ZSBzdGF0dXNbTUNSXSBhdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLAorCSAgICAgICB0ZW1wID0gcmVhZGwoYWRkcikpOwogCW1pdGVfZGVjb2RlKG1pdGVfTUNSX3N0cmluZ3MsIHRlbXApOwogCiAJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfTUFSKGNoYW5uZWwpOwotCXByaW50aygibWl0ZSBzdGF0dXNbTUFSXSBhdCAweCUwOGx4ID0weCUwOHhcbiIsIGFkZHIsIHJlYWRsKGFkZHIpKTsKLQlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9EQ1IoY2hhbm5lbCk7Ci0JcHJpbnRrKCJtaXRlIHN0YXR1c1tEQ1JdIGF0IDB4JTA4bHggPTB4JTA4bHhcbiIsIGFkZHIsIHRlbXAgPQorCXByaW50ayhLRVJOX0RFQlVHICJtaXRlIHN0YXR1c1tNQVJdIGF0IDB4JTA4bHggPTB4JTA4eFxuIiwgYWRkciwKIAkgICAgICAgcmVhZGwoYWRkcikpOworCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0RDUihjaGFubmVsKTsKKwlwcmludGsoS0VSTl9ERUJVRyAibWl0ZSBzdGF0dXNbRENSXSBhdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLAorCSAgICAgICB0ZW1wID0gcmVhZGwoYWRkcikpOwogCW1pdGVfZGVjb2RlKG1pdGVfRENSX3N0cmluZ3MsIHRlbXApOwogCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0RBUihjaGFubmVsKTsKLQlwcmludGsoIm1pdGUgc3RhdHVzW0RBUl0gYXQgMHglMDhseCA9MHglMDh4XG4iLCBhZGRyLCByZWFkbChhZGRyKSk7Ci0JYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfTEtDUihjaGFubmVsKTsKLQlwcmludGsoIm1pdGUgc3RhdHVzW0xLQ1JdYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwgdGVtcCA9CisJcHJpbnRrKEtFUk5fREVCVUcgIm1pdGUgc3RhdHVzW0RBUl0gYXQgMHglMDhseCA9MHglMDh4XG4iLCBhZGRyLAogCSAgICAgICByZWFkbChhZGRyKSk7CisJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfTEtDUihjaGFubmVsKTsKKwlwcmludGsoS0VSTl9ERUJVRyAibWl0ZSBzdGF0dXNbTEtDUl1hdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLAorCSAgICAgICB0ZW1wID0gcmVhZGwoYWRkcikpOwogCW1pdGVfZGVjb2RlKG1pdGVfTEtDUl9zdHJpbmdzLCB0ZW1wKTsKIAlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9MS0FSKGNoYW5uZWwpOwotCXByaW50aygibWl0ZSBzdGF0dXNbTEtBUl1hdCAweCUwOGx4ID0weCUwOHhcbiIsIGFkZHIsIHJlYWRsKGFkZHIpKTsKLQotCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0NIU1IoY2hhbm5lbCk7Ci0JcHJpbnRrKCJtaXRlIHN0YXR1c1tDSFNSXWF0IDB4JTA4bHggPTB4JTA4bHhcbiIsIGFkZHIsIHRlbXAgPQorCXByaW50ayhLRVJOX0RFQlVHICJtaXRlIHN0YXR1c1tMS0FSXWF0IDB4JTA4bHggPTB4JTA4eFxuIiwgYWRkciwKIAkgICAgICAgcmVhZGwoYWRkcikpOworCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0NIU1IoY2hhbm5lbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIm1pdGUgc3RhdHVzW0NIU1JdYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwKKwkgICAgICAgdGVtcCA9IHJlYWRsKGFkZHIpKTsKIAltaXRlX2RlY29kZShtaXRlX0NIU1Jfc3RyaW5ncywgdGVtcCk7CiAJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfRkNSKGNoYW5uZWwpOwotCXByaW50aygibWl0ZSBzdGF0dXNbRkNSXSBhdCAweCUwOGx4ID0weCUwOHhcblxuIiwgYWRkciwgcmVhZGwoYWRkcikpOworCXByaW50ayhLRVJOX0RFQlVHICJtaXRlIHN0YXR1c1tGQ1JdIGF0IDB4JTA4bHggPTB4JTA4eFxuXG4iLCBhZGRyLAorCSAgICAgICByZWFkbChhZGRyKSk7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfZHVtcF9yZWdzKTsKIAogc3RhdGljIHZvaWQgbWl0ZV9kZWNvZGUoY2hhciAqKmJpdF9zdHIsIHVuc2lnbmVkIGludCBiaXRzKQogewpAQCAtNzY2LDEwICs4MDgsMTEgQEAKIAogCWZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgewogCQlpZiAoYml0cyAmICgxIDw8IGkpKQotCQkJcHJpbnRrKCIgJXMiLCBiaXRfc3RyW2ldKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgJXMiLCBiaXRfc3RyW2ldKTsKIAl9Ci0JcHJpbnRrKCJcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOwogfQorRVhQT1JUX1NZTUJPTChtaXRlX2RlY29kZSk7CiAjZW5kaWYKIAogI2lmZGVmIE1PRFVMRQpAQCAtNzg1LDM2ICs4MjgsNCBAQAogewogCW1pdGVfY2xlYW51cCgpOwogfQotCi1FWFBPUlRfU1lNQk9MKG1pdGVfZG1hX3Rjcik7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfZG1hX2FybSk7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfZG1hX2Rpc2FybSk7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfc3luY19pbnB1dF9kbWEpOwotRVhQT1JUX1NZTUJPTChtaXRlX3N5bmNfb3V0cHV0X2RtYSk7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfc2V0dXApOwotRVhQT1JUX1NZTUJPTChtaXRlX3NldHVwMik7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfdW5zZXR1cCk7Ci0jaWYgMAotRVhQT1JUX1NZTUJPTChtaXRlX2t2bWVtX3NlZ21lbnRfbG9hZCk7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfbGxfZnJvbV9rdm1lbSk7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfc2V0cmVncyk7Ci0jZW5kaWYKLUVYUE9SVF9TWU1CT0wobWl0ZV9kZXZpY2VzKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9saXN0X2RldmljZXMpOwotRVhQT1JUX1NZTUJPTChtaXRlX3JlcXVlc3RfY2hhbm5lbF9pbl9yYW5nZSk7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfcmVsZWFzZV9jaGFubmVsKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9wcmVwX2RtYSk7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfYnVmX2NoYW5nZSk7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfbGIpOwotRVhQT1JUX1NZTUJPTChtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X3ViKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9ieXRlc19yZWFkX2Zyb21fbWVtb3J5X2xiKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9ieXRlc19yZWFkX2Zyb21fbWVtb3J5X3ViKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9ieXRlc19pbl90cmFuc2l0KTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9nZXRfc3RhdHVzKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9kb25lKTsKLSNpZmRlZiBERUJVR19NSVRFCi1FWFBPUlRfU1lNQk9MKG1pdGVfZGVjb2RlKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9kdW1wX3JlZ3MpOwotI2VuZGlmCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmgKaW5kZXggMDUxOGZhZC4uOWQ1MDQ5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5oCkBAIC0xNjMsMTMgKzE2Myw2IEBACiB1bnNpZ25lZCBtaXRlX2dldF9zdGF0dXMoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKTsKIGludCBtaXRlX2RvbmUoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKTsKIAotI2lmIDAKLXVuc2lnbmVkIGxvbmcgbWl0ZV9sbF9mcm9tX2t2bWVtKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSwKLQkJCQkgc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmMsIGludCBsZW4pOwotdm9pZCBtaXRlX3NldHJlZ3Moc3RydWN0IG1pdGVfc3RydWN0ICptaXRlLCB1bnNpZ25lZCBsb25nIGxsX3N0YXJ0LCBpbnQgY2hhbiwKLQkJICBpbnQgZGlyKTsKLSNlbmRpZgotCiB2b2lkIG1pdGVfcHJlcF9kbWEoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuLAogCQkgICB1bnNpZ25lZCBpbnQgbnVtX2RldmljZV9iaXRzLCB1bnNpZ25lZCBpbnQgbnVtX21lbW9yeV9iaXRzKTsKIGludCBtaXRlX2J1Zl9jaGFuZ2Uoc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3JfcmluZyAqcmluZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tdWx0aXEzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXVsdGlxMy5jCmluZGV4IDVkNmFmOWMuLjZiMjJmMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tdWx0aXEzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL211bHRpcTMuYwpAQCAtMTQ0LDkgKzE0NCw4IEBACiAJaW50IGk7CiAJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAotCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKQogCQlkYXRhW2ldID0gZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl07Ci0JfQogCiAJcmV0dXJuIGk7CiB9CkBAIC0yNTMsMjAgKzI1MiwyMCBAQAogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwogCiAJaW9iYXNlID0gaXQtPm9wdGlvbnNbMF07Ci0JcHJpbnRrKCJjb21lZGklZDogbXVsdGlxMzogMHglMDRseCAiLCBkZXYtPm1pbm9yLCBpb2Jhc2UpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBtdWx0aXEzOiAweCUwNGx4ICIsIGRldi0+bWlub3IsIGlvYmFzZSk7CiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2Jhc2UsIE1VTFRJUTNfU0laRSwgIm11bHRpcTMiKSkgewotCQlwcmludGsoImNvbWVkaSVkOiBJL08gcG9ydCBjb25mbGljdFxuIiwgZGV2LT5taW5vcik7CisJCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IEkvTyBwb3J0IGNvbmZsaWN0XG4iLCBkZXYtPm1pbm9yKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJZGV2LT5pb2Jhc2UgPSBpb2Jhc2U7CiAKIAlpcnEgPSBpdC0+b3B0aW9uc1sxXTsKLQlpZiAoaXJxKSB7Ci0JCXByaW50aygiY29tZWRpJWQ6IGlycSA9ICV1IGlnbm9yZWRcbiIsIGRldi0+bWlub3IsIGlycSk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKCJjb21lZGklZDogbm8gaXJxXG4iLCBkZXYtPm1pbm9yKTsKLQl9CisJaWYgKGlycSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY29tZWRpJWQ6IGlycSA9ICV1IGlnbm9yZWRcbiIsCisJCQlkZXYtPm1pbm9yLCBpcnEpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY29tZWRpJWQ6IG5vIGlycVxuIiwgZGV2LT5taW5vcik7CiAJZGV2LT5ib2FyZF9uYW1lID0gIm11bHRpcTMiOwogCXJlc3VsdCA9IGFsbG9jX3N1YmRldmljZXMoZGV2LCA1KTsKIAlpZiAocmVzdWx0IDwgMCkKQEAgLTMzMCwxNCArMzI5LDEyIEBACiAKIHN0YXRpYyBpbnQgbXVsdGlxM19kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKLQlwcmludGsoImNvbWVkaSVkOiBtdWx0aXEzOiByZW1vdmVcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBtdWx0aXEzOiByZW1vdmVcbiIsIGRldi0+bWlub3IpOwogCi0JaWYgKGRldi0+aW9iYXNlKSB7CisJaWYgKGRldi0+aW9iYXNlKQogCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmlvYmFzZSwgTVVMVElRM19TSVpFKTsKLQl9Ci0JaWYgKGRldi0+aXJxKSB7CisJaWYgKGRldi0+aXJxKQogCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NTI3LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjUyNy5jCmluZGV4IGIzN2VmMzcuLjY1M2I0YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NTI3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY1MjcuYwpAQCAtMjczLDcgKzI3Myw4IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKLQkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLworCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCAqLworCS8qICAgICAgICAgYXJlIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIAogCWlmIChlcnIpCiAJCXJldHVybiAyOwpAQCAtMzc3LDcgKzM3OCw3IEBACiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJaW50IHJldDsKIAotCXByaW50aygiY29tZWRpJWQ6IG5pNjUyNzoiLCBkZXYtPm1pbm9yKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogbmk2NTI3XG4iLCBkZXYtPm1pbm9yKTsKIAogCXJldCA9IGFsbG9jX3ByaXZhdGUoZGV2LCBzaXplb2Yoc3RydWN0IG5pNjUyN19wcml2YXRlKSk7CiAJaWYgKHJldCA8IDApCkBAIC0zODksMTQgKzM5MCwxMyBAQAogCiAJcmV0ID0gbWl0ZV9zZXR1cChkZXZwcml2LT5taXRlKTsKIAlpZiAocmV0IDwgMCkgewotCQlwcmludGsoImVycm9yIHNldHRpbmcgdXAgbWl0ZVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiY29tZWRpOiBlcnJvciBzZXR0aW5nIHVwIG1pdGVcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCWRldi0+Ym9hcmRfbmFtZSA9IHRoaXNfYm9hcmQtPm5hbWU7Ci0JcHJpbnRrKCIgJXMiLCBkZXYtPmJvYXJkX25hbWUpOwotCi0JcHJpbnRrKCIgSUQ9MHglMDJ4IiwgcmVhZGIoZGV2cHJpdi0+bWl0ZS0+ZGFxX2lvX2FkZHIgKyBJRF9SZWdpc3RlcikpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSBib2FyZDogJXMsIElEPTB4JTAyeFxuIiwgZGV2LT5ib2FyZF9uYW1lLAorCQlyZWFkYihkZXZwcml2LT5taXRlLT5kYXFfaW9fYWRkciArIElEX1JlZ2lzdGVyKSk7CiAKIAlyZXQgPSBhbGxvY19zdWJkZXZpY2VzKGRldiwgMyk7CiAJaWYgKHJldCA8IDApCkBAIC00MTUsNyArNDE1LDcgQEAKIAlzLT50eXBlID0gQ09NRURJX1NVQkRfRE87CiAJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX1dSSVRBQkxFOwogCXMtPm5fY2hhbiA9IDI0OwotCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3Vua25vd247CS8qIEZJWE1FOiBhY3R1YWxseSBjb25kdWN0YW5jZSAqLworCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3Vua25vd247ICAvKiBGSVhNRTogYWN0dWFsbHkgY29uZHVjdGFuY2UgKi8KIAlzLT5tYXhkYXRhID0gMTsKIAlzLT5pbnNuX2JpdHMgPSBuaTY1MjdfZG9faW5zbl9iaXRzOwogCkBAIC00NDIsMzAgKzQ0MiwyNSBAQAogCiAJcmV0ID0gcmVxdWVzdF9pcnEobWl0ZV9pcnEoZGV2cHJpdi0+bWl0ZSksIG5pNjUyN19pbnRlcnJ1cHQsCiAJCQkgIElSUUZfU0hBUkVELCAibmk2NTI3IiwgZGV2KTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoIiBpcnEgbm90IGF2YWlsYWJsZSIpOwotCX0gZWxzZQorCWlmIChyZXQgPCAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJjb21lZGkgaTY1MjcgaXJxIG5vdCBhdmFpbGFibGVcbiIpOworCWVsc2UKIAkJZGV2LT5pcnEgPSBtaXRlX2lycShkZXZwcml2LT5taXRlKTsKIAotCXByaW50aygiXG4iKTsKLQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG5pNjUyN19kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKLQlpZiAoZGV2cHJpdiAmJiBkZXZwcml2LT5taXRlICYmIGRldnByaXYtPm1pdGUtPmRhcV9pb19hZGRyKSB7CisJaWYgKGRldnByaXYgJiYgZGV2cHJpdi0+bWl0ZSAmJiBkZXZwcml2LT5taXRlLT5kYXFfaW9fYWRkcikKIAkJd3JpdGViKDB4MDAsCiAJCSAgICAgICBkZXZwcml2LT5taXRlLT5kYXFfaW9fYWRkciArIE1hc3Rlcl9JbnRlcnJ1cHRfQ29udHJvbCk7Ci0JfQogCi0JaWYgKGRldi0+aXJxKSB7CisJaWYgKGRldi0+aXJxKQogCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKLQl9CiAKLQlpZiAoZGV2cHJpdiAmJiBkZXZwcml2LT5taXRlKSB7CisJaWYgKGRldnByaXYgJiYgZGV2cHJpdi0+bWl0ZSkKIAkJbWl0ZV91bnNldHVwKGRldnByaXYtPm1pdGUpOwotCX0KIAogCXJldHVybiAwOwogfQpAQCAtNDkxLDcgKzQ4Niw3IEBACiAJCQl9CiAJCX0KIAl9Ci0JcHJpbnRrKCJubyBkZXZpY2UgZm91bmRcbiIpOworCXByaW50ayhLRVJOX0VSUiAiY29tZWRpIDY1Mjc6IG5vIGRldmljZSBmb3VuZFxuIik7CiAJbWl0ZV9saXN0X2RldmljZXMoKTsKIAlyZXR1cm4gLUVJTzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2FvLmMKaW5kZXggOGFkYjIzNy4uMzc3ODU2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2FvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2FvLmMKQEAgLTMyLDcgKzMyLDggQEAKICAgWzBdIC0gSS9PIHBvcnQgYmFzZSBhZGRyZXNzCiAgIFsxXSAtIElSUSAodW51c2VkKQogICBbMl0gLSBETUEgKHVudXNlZCkKLSAgWzNdIC0gYW5hbG9nIG91dHB1dCByYW5nZSwgc2V0IGJ5IGp1bXBlcnMgb24gaGFyZHdhcmUgKDAgZm9yIC0xMCB0byAxMFYgYmlwb2xhciwgMSBmb3IgMFYgdG8gMTBWIHVuaXBvbGFyKQorICBbM10gLSBhbmFsb2cgb3V0cHV0IHJhbmdlLCBzZXQgYnkganVtcGVycyBvbiBoYXJkd2FyZSAoMCBmb3IgLTEwIHRvIDEwVgorCWJpcG9sYXIsIDEgZm9yIDBWIHRvIDEwViB1bmlwb2xhcikKIAogKi8KIC8qCkBAIC00MzEsOSArNDMyLDggQEAKIAkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKIAkJZGF0YVtpXSA9IDA7CS8qIFhYWCAqLwotCX0KIAlyZXR1cm4gaW5zbi0+bjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvMTZkLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8xNmQuYwppbmRleCA5MDE4MzNkLi5jZjRmMjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8xNmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8xNmQuYwpAQCAtMjAwLDggKzIwMCw4IEBACiAJZW51bSB7IGRhY18yY29tcCwgZGFjX3N0cmFpZ2h0IH0gZGFjMF9jb2RpbmcsIGRhYzFfY29kaW5nOwogCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICphb19yYW5nZV90eXBlX2xpc3RbMl07CiAJdW5zaWduZWQgaW50IGFvX3JlYWRiYWNrWzJdOwotCXVuc2lnbmVkIGludCBjb21fcmVnXzFfc3RhdGU7CS8qIGN1cnJlbnQgc3RhdGUgb2YgY29tbWFuZCByZWdpc3RlciAxICovCi0JdW5zaWduZWQgaW50IGNvbV9yZWdfMl9zdGF0ZTsJLyogY3VycmVudCBzdGF0ZSBvZiBjb21tYW5kIHJlZ2lzdGVyIDIgKi8KKwl1bnNpZ25lZCBpbnQgY29tX3JlZ18xX3N0YXRlOyAvKiBjdXJyZW50IHN0YXRlIG9mIGNvbW1hbmQgcmVnaXN0ZXIgMSAqLworCXVuc2lnbmVkIGludCBjb21fcmVnXzJfc3RhdGU7IC8qIGN1cnJlbnQgc3RhdGUgb2YgY29tbWFuZCByZWdpc3RlciAyICovCiB9OwogCiBzdGF0aWMgdm9pZCByZXNldF9jb3VudGVycyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQpAQCAtMjc5LDcgKzI3OSw5IEBACiAJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyAwOwogCi0vKiBwcmludGsoImF0bWlvMTZkX2ludGVycnVwdCFcbiIpOyAqLworI2lmZGVmIERFQlVHMQorCXByaW50ayhLRVJOX0RFQlVHICJhdG1pbzE2ZF9pbnRlcnJ1cHQhXG4iKTsKKyNlbmRpZgogCiAJY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIGludyhkZXYtPmlvYmFzZSArIEFEX0ZJRk9fUkVHKSk7CiAKQEAgLTI5Myw3ICsyOTUsNyBAQAogewogCWludCBlcnIgPSAwLCB0bXA7CiAjaWZkZWYgREVCVUcxCi0JcHJpbnRrKCJhdG1pbzE2ZF9haV9jbWR0ZXN0XG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiYXRtaW8xNmRfYWlfY21kdGVzdFxuIik7CiAjZW5kaWYKIAkvKiBtYWtlIHN1cmUgdHJpZ2dlcnMgYXJlIHZhbGlkICovCiAJdG1wID0gY21kLT5zdGFydF9zcmM7CkBAIC0zMjQsOCArMzI2LDggQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAotCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCi0JLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KKwkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAmIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KKwkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0ZPTExPVyAmJgogCSAgICBjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUICYmCiAJICAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19USU1FUikKQEAgLTM5Nyw3ICszOTksNyBAQAogCXVuc2lnbmVkIGludCBzYW1wbGVfY291bnQsIHRtcCwgY2hhbiwgZ2FpbjsKIAlpbnQgaTsKICNpZmRlZiBERUJVRzEKLQlwcmludGsoImF0bWlvMTZkX2FpX2NtZFxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgImF0bWlvMTZkX2FpX2NtZFxuIik7CiAjZW5kaWYKIAkvKiBUaGlzIGlzIHNsb3dseSBiZWNvbWluZyBhIHdvcmtpbmcgY29tbWFuZCBpbnRlcmZhY2UuICoKIAkgKiBJdCBpcyBzdGlsbCB1YmVyLWV4cGVyaW1lbnRhbCAqLwpAQCAtNDM2LDEwICs0MzgsMTAgQEAKIAl9IGVsc2UgaWYgKGNtZC0+Y29udmVydF9hcmcgPCA2NTUzNjAwMDApIHsKIAkJYmFzZV9jbG9jayA9IENMT0NLXzEwMF9LSFo7CiAJCXRpbWVyID0gY21kLT5jb252ZXJ0X2FyZyAvIDEwMDAwOwotCX0gZWxzZSBpZiAoY21kLT5jb252ZXJ0X2FyZyA8PSAweGZmZmZmZmZmIC8qIDY1NTM2MDAwMDAgKi8gKSB7CisJfSBlbHNlIGlmIChjbWQtPmNvbnZlcnRfYXJnIDw9IDB4ZmZmZmZmZmYgLyogNjU1MzYwMDAwMCAqLykgewogCQliYXNlX2Nsb2NrID0gQ0xPQ0tfMTBfS0haOwogCQl0aW1lciA9IGNtZC0+Y29udmVydF9hcmcgLyAxMDAwMDA7Ci0JfSBlbHNlIGlmIChjbWQtPmNvbnZlcnRfYXJnIDw9IDB4ZmZmZmZmZmYgLyogNjU1MzYwMDAwMDAgKi8gKSB7CisJfSBlbHNlIGlmIChjbWQtPmNvbnZlcnRfYXJnIDw9IDB4ZmZmZmZmZmYgLyogNjU1MzYwMDAwMDAgKi8pIHsKIAkJYmFzZV9jbG9jayA9IENMT0NLXzFfS0haOwogCQl0aW1lciA9IGNtZC0+Y29udmVydF9hcmcgLyAxMDAwMDAwOwogCX0KQEAgLTUwNCwxMCArNTA2LDEwIEBACiAJCX0gZWxzZSBpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8IDY1NTM2MDAwMCkgewogCQkJYmFzZV9jbG9jayA9IENMT0NLXzEwMF9LSFo7CiAJCQl0aW1lciA9IGNtZC0+c2Nhbl9iZWdpbl9hcmcgLyAxMDAwMDsKLQkJfSBlbHNlIGlmIChjbWQtPnNjYW5fYmVnaW5fYXJnIDwgMHhmZmZmZmZmZiAvKiA2NTUzNjAwMDAwICovICkgeworCQl9IGVsc2UgaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgPCAweGZmZmZmZmZmIC8qIDY1NTM2MDAwMDAgKi8pIHsKIAkJCWJhc2VfY2xvY2sgPSBDTE9DS18xMF9LSFo7CiAJCQl0aW1lciA9IGNtZC0+c2Nhbl9iZWdpbl9hcmcgLyAxMDAwMDA7Ci0JCX0gZWxzZSBpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8IDB4ZmZmZmZmZmYgLyogNjU1MzYwMDAwMDAgKi8gKSB7CisJCX0gZWxzZSBpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8IDB4ZmZmZmZmZmYgLyogNjU1MzYwMDAwMDAgKi8pIHsKIAkJCWJhc2VfY2xvY2sgPSBDTE9DS18xX0tIWjsKIAkJCXRpbWVyID0gY21kLT5zY2FuX2JlZ2luX2FyZyAvIDEwMDAwMDA7CiAJCX0KQEAgLTU1OSw3ICs1NjEsNyBAQAogCWludCBzdGF0dXM7CiAKICNpZmRlZiBERUJVRzEKLQlwcmludGsoImF0bWlvMTZkX2FpX2luc25fcmVhZFxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgImF0bWlvMTZkX2FpX2luc25fcmVhZFxuIik7CiAjZW5kaWYKIAljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJZ2FpbiA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKQEAgLTU4MCwxOSArNTgyLDE4IEBACiAJCQkvKiBjaGVjayBjb252ZXJzaW9uIHN0YXR1cyAqLwogCQkJc3RhdHVzID0gaW53KGRldi0+aW9iYXNlICsgU1RBVF9SRUcpOwogI2lmZGVmIERFQlVHMQotCQkJcHJpbnRrKCJzdGF0dXM9JXhcbiIsIHN0YXR1cyk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAic3RhdHVzPSV4XG4iLCBzdGF0dXMpOwogI2VuZGlmCiAJCQlpZiAoc3RhdHVzICYgU1RBVF9BRF9DT05WQVZBSUwpIHsKIAkJCQkvKiByZWFkIHRoZSBkYXRhIG5vdyAqLwogCQkJCWRhdGFbaV0gPSBpbncoZGV2LT5pb2Jhc2UgKyBBRF9GSUZPX1JFRyk7CiAJCQkJLyogY2hhbmdlIHRvIHR3bydzIGNvbXBsZW1lbnQgaWYgbmVlZCBiZSAqLwotCQkJCWlmIChkZXZwcml2LT5hZGNfY29kaW5nID09IGFkY18yY29tcCkgeworCQkJCWlmIChkZXZwcml2LT5hZGNfY29kaW5nID09IGFkY18yY29tcCkKIAkJCQkJZGF0YVtpXSBePSAweDgwMDsKLQkJCQl9CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAoc3RhdHVzICYgU1RBVF9BRF9PVkVSRkxPVykgewotCQkJCXByaW50aygiYXRtaW8xNmQ6IGEvZCBGSUZPIG92ZXJmbG93XG4iKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJhdG1pbzE2ZDogYS9kIEZJRk8gb3ZlcmZsb3dcbiIpOwogCQkJCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyBBRF9DTEVBUl9SRUcpOwogCiAJCQkJcmV0dXJuIC1FVElNRTsKQEAgLTYwMCw3ICs2MDEsNyBAQAogCQl9CiAJCS8qIGVuZCB3YWl0aW5nLCBub3cgY2hlY2sgaWYgaXQgdGltZWQgb3V0ICovCiAJCWlmICh0ID09IEFUTUlPMTZEX1RJTUVPVVQpIHsKLQkJCXByaW50aygiYXRtaW8xNmQ6IHRpbWVvdXRcbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYXRtaW8xNmQ6IHRpbWVvdXRcbiIpOwogCiAJCQlyZXR1cm4gLUVUSU1FOwogCQl9CkBAIC02MTUsMTMgKzYxNiwxMSBAQAogewogCWludCBpOwogI2lmZGVmIERFQlVHMQotCXByaW50aygiYXRtaW8xNmRfYW9faW5zbl9yZWFkXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiYXRtaW8xNmRfYW9faW5zbl9yZWFkXG4iKTsKICNlbmRpZgogCi0JZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspCiAJCWRhdGFbaV0gPSBkZXZwcml2LT5hb19yZWFkYmFja1tDUl9DSEFOKGluc24tPmNoYW5zcGVjKV07Ci0JfQotCiAJcmV0dXJuIGk7CiB9CiAKQEAgLTYzMyw3ICs2MzIsNyBAQAogCWludCBjaGFuOwogCWludCBkOwogI2lmZGVmIERFQlVHMQotCXByaW50aygiYXRtaW8xNmRfYW9faW5zbl93cml0ZVxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgImF0bWlvMTZkX2FvX2luc25fd3JpdGVcbiIpOwogI2VuZGlmCiAKIAljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CkBAIC02NDIsMTUgKzY0MSwxMyBAQAogCQlkID0gZGF0YVtpXTsKIAkJc3dpdGNoIChjaGFuKSB7CiAJCWNhc2UgMDoKLQkJCWlmIChkZXZwcml2LT5kYWMwX2NvZGluZyA9PSBkYWNfMmNvbXApIHsKKwkJCWlmIChkZXZwcml2LT5kYWMwX2NvZGluZyA9PSBkYWNfMmNvbXApCiAJCQkJZCBePSAweDgwMDsKLQkJCX0KIAkJCW91dHcoZCwgZGV2LT5pb2Jhc2UgKyBEQUMwX1JFRyk7CiAJCQlicmVhazsKIAkJY2FzZSAxOgotCQkJaWYgKGRldnByaXYtPmRhYzFfY29kaW5nID09IGRhY18yY29tcCkgeworCQkJaWYgKGRldnByaXYtPmRhYzFfY29kaW5nID09IGRhY18yY29tcCkKIAkJCQlkIF49IDB4ODAwOwotCQkJfQogCQkJb3V0dyhkLCBkZXYtPmlvYmFzZSArIERBQzFfUkVHKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtNzA1LDI5ICs3MDIsMjkgQEAKIC8qCiAgICBvcHRpb25zWzBdIC0gSS9PIHBvcnQKICAgIG9wdGlvbnNbMV0gLSBNSU8gaXJxCi0gICAgICAgICAgICAgICAgMCA9PSBubyBpcnEKLSAgICAgICAgICAgICAgICBOID09IGlycSBOIHszLDQsNSw2LDcsOSwxMCwxMSwxMiwxNCwxNX0KKwkJMCA9PSBubyBpcnEKKwkJTiA9PSBpcnEgTiB7Myw0LDUsNiw3LDksMTAsMTEsMTIsMTQsMTV9CiAgICBvcHRpb25zWzJdIC0gRElPIGlycQotICAgICAgICAgICAgICAgIDAgPT0gbm8gaXJxCi0gICAgICAgICAgICAgICAgTiA9PSBpcnEgTiB7Myw0LDUsNiw3LDl9CisJCTAgPT0gbm8gaXJxCisJCU4gPT0gaXJxIE4gezMsNCw1LDYsNyw5fQogICAgb3B0aW9uc1szXSAtIERNQTEgY2hhbm5lbAotICAgICAgICAgICAgICAgIDAgPT0gbm8gRE1BCi0gICAgICAgICAgICAgICAgTiA9PSBETUEgTiB7NSw2LDd9CisJCTAgPT0gbm8gRE1BCisJCU4gPT0gRE1BIE4gezUsNiw3fQogICAgb3B0aW9uc1s0XSAtIERNQTIgY2hhbm5lbAotICAgICAgICAgICAgICAgIDAgPT0gbm8gRE1BCi0gICAgICAgICAgICAgICAgTiA9PSBETUEgTiB7NSw2LDd9CisJCTAgPT0gbm8gRE1BCisJCU4gPT0gRE1BIE4gezUsNiw3fQogCiAgICBvcHRpb25zWzVdIC0gYS9kIG11eAotICAgCTA9ZGlmZmVyZW50aWFsLCAxPXNpbmdsZQorCTA9ZGlmZmVyZW50aWFsLCAxPXNpbmdsZQogICAgb3B0aW9uc1s2XSAtIGEvZCByYW5nZQotICAgCTA9Ymlwb2xhcjEwLCAxPWJpcG9sYXI1LCAyPXVuaXBvbGFyMTAKKwkwPWJpcG9sYXIxMCwgMT1iaXBvbGFyNSwgMj11bmlwb2xhcjEwCiAKICAgIG9wdGlvbnNbN10gLSBkYWMwIHJhbmdlCi0gICAJMD1iaXBvbGFyLCAxPXVuaXBvbGFyCisJMD1iaXBvbGFyLCAxPXVuaXBvbGFyCiAgICBvcHRpb25zWzhdIC0gZGFjMCByZWZlcmVuY2UKLSAgICAwPWludGVybmFsLCAxPWV4dGVybmFsCisJMD1pbnRlcm5hbCwgMT1leHRlcm5hbAogICAgb3B0aW9uc1s5XSAtIGRhYzAgY29kaW5nCi0gICAJMD0yJ3MgY29tcCwgMT1zdHJhaWdodCBiaW5hcnkKKwkwPTIncyBjb21wLCAxPXN0cmFpZ2h0IGJpbmFyeQogCiAgICBvcHRpb25zWzEwXSAtIGRhYzEgcmFuZ2UKICAgIG9wdGlvbnNbMTFdIC0gZGFjMSByZWZlcmVuY2UKQEAgLTc0NSw3ICs3NDIsNyBAQAogCiAJLyogbWFrZSBzdXJlIHRoZSBhZGRyZXNzIHJhbmdlIGlzIGZyZWUgYW5kIGFsbG9jYXRlIGl0ICovCiAJaW9iYXNlID0gaXQtPm9wdGlvbnNbMF07Ci0JcHJpbnRrKCJjb21lZGklZDogYXRtaW8xNmQ6IDB4JTA0bHggIiwgZGV2LT5taW5vciwgaW9iYXNlKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogYXRtaW8xNmQ6IDB4JTA0bHggIiwgZGV2LT5taW5vciwgaW9iYXNlKTsKIAlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgQVRNSU8xNkRfU0laRSwgIm5pX2F0bWlvMTZkIikpIHsKIAkJcHJpbnRrKCJJL08gcG9ydCBjb25mbGljdFxuIik7CiAJCXJldHVybiAtRUlPOwpAQCAtNzcyLDEzICs3NjksMTMgQEAKIAogCQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGF0bWlvMTZkX2ludGVycnVwdCwgMCwgImF0bWlvMTZkIiwgZGV2KTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCXByaW50aygiZmFpbGVkIHRvIGFsbG9jYXRlIGlycSAldVxuIiwgaXJxKTsKKwkJCXByaW50ayhLRVJOX0lORk8gImZhaWxlZCB0byBhbGxvY2F0ZSBpcnEgJXVcbiIsIGlycSk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJCWRldi0+aXJxID0gaXJxOwotCQlwcmludGsoIiggaXJxID0gJXUgKVxuIiwgaXJxKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiKCBpcnEgPSAldSApXG4iLCBpcnEpOwogCX0gZWxzZSB7Ci0JCXByaW50aygiKCBubyBpcnEgKSIpOworCQlwcmludGsoS0VSTl9JTkZPICIoIG5vIGlycSApIik7CiAJfQogCiAJLyogc2V0IGRldmljZSBvcHRpb25zICovCkBAIC04NTUsMTEgKzg1MiwxMCBAQAogCiAJLyogODI1NSBzdWJkZXZpY2UgKi8KIAlzKys7Ci0JaWYgKGJvYXJkdHlwZS0+aGFzXzgyNTUpIHsKKwlpZiAoYm9hcmR0eXBlLT5oYXNfODI1NSkKIAkJc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIE5VTEwsIGRldi0+aW9iYXNlKTsKLQl9IGVsc2UgeworCWVsc2UKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKLQl9CiAKIC8qIGRvbid0IHlldCBrbm93IGhvdyB0byBkZWFsIHdpdGggY291bnRlci90aW1lcnMgKi8KICNpZiAwCkBAIC04NzYsNyArODcyLDcgQEAKIAogc3RhdGljIGludCBhdG1pbzE2ZF9kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKLQlwcmludGsoImNvbWVkaSVkOiBhdG1pbzE2ZDogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogYXRtaW8xNmQ6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CiAKIAlpZiAoZGV2LT5zdWJkZXZpY2VzICYmIGJvYXJkdHlwZS0+aGFzXzgyNTUpCiAJCXN1YmRldl84MjU1X2NsZWFudXAoZGV2LCBkZXYtPnN1YmRldmljZXMgKyAzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwYy5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjLmgKaW5kZXggODI1OTYzNC4uNDIyY2VlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjLmgKQEAgLTM4LDE5ICszOCwyNyBAQAogCWludCBkZXZpY2VfaWQ7CQkvKiAgZGV2aWNlIGlkIGZvciBwY2kgYW5kIHBjbWNpYSBib2FyZHMgKi8KIAlpbnQgYWlfc3BlZWQ7CQkvKiAgbWF4aW11bSBpbnB1dCBzcGVlZCBpbiBuYW5vc2Vjb25kcyAqLwogCWVudW0gbGFicGNfYnVzdHlwZSBidXN0eXBlOwkvKiAgSVNBL1BDSS9ldGMuICovCi0JZW51bSBsYWJwY19yZWdpc3Rlcl9sYXlvdXQgcmVnaXN0ZXJfbGF5b3V0OwkvKiAgMTIwMCBoYXMgZXh0cmEgcmVnaXN0ZXJzIGNvbXBhcmVkIHRvIHBjKyAqLworCisJLyogIDEyMDAgaGFzIGV4dHJhIHJlZ2lzdGVycyBjb21wYXJlZCB0byBwYysgKi8KKwllbnVtIGxhYnBjX3JlZ2lzdGVyX2xheW91dCByZWdpc3Rlcl9sYXlvdXQ7CiAJaW50IGhhc19hbzsJCS8qICBoYXMgYW5hbG9nIG91dHB1dCB0cnVlL2ZhbHNlICovCiAJY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKmFpX3JhbmdlX3RhYmxlOwogCWNvbnN0IGludCAqYWlfcmFuZ2VfY29kZTsKIAljb25zdCBpbnQgKmFpX3JhbmdlX2lzX3VuaXBvbGFyOwotCXVuc2lnbmVkIGFpX3NjYW5fdXA6MTsJLyogIGJvYXJkIGNhbiBhdXRvIHNjYW4gdXAgaW4gYWkgY2hhbm5lbHMsIG5vdCBqdXN0IGRvd24gKi8KLQl1bnNpZ25lZCBtZW1vcnlfbWFwcGVkX2lvOjE7CS8qIHVzZXMgbWVtb3J5IG1hcHBlZCBpbyBpbnN0ZWFkIG9mIGlvcG9ydHMgKi8KKworCS8qICBib2FyZCBjYW4gYXV0byBzY2FuIHVwIGluIGFpIGNoYW5uZWxzLCBub3QganVzdCBkb3duICovCisJdW5zaWduZWQgYWlfc2Nhbl91cDoxOworCisJLyogdXNlcyBtZW1vcnkgbWFwcGVkIGlvIGluc3RlYWQgb2YgaW9wb3J0cyAqLworCXVuc2lnbmVkIG1lbW9yeV9tYXBwZWRfaW86MTsKIH07CiAKIHN0cnVjdCBsYWJwY19wcml2YXRlIHsKIAlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGU7CS8qICBmb3IgbWl0ZSBjaGlwIG9uIHBjaS0xMjAwICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsb25nIGNvdW50OwkvKiBudW1iZXIgb2YgZGF0YSBwb2ludHMgbGVmdCB0byBiZSB0YWtlbiAqLwotCXVuc2lnbmVkIGludCBhb192YWx1ZVtOVU1fQU9fQ0hBTl07CS8qICBzb2Z0d2FyZSBjb3B5IG9mIGFuYWxvZyBvdXRwdXQgdmFsdWVzICovCisJLyogIG51bWJlciBvZiBkYXRhIHBvaW50cyBsZWZ0IHRvIGJlIHRha2VuICovCisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsb25nIGNvdW50OworCS8qICBzb2Z0d2FyZSBjb3B5IG9mIGFuYWxvZyBvdXRwdXQgdmFsdWVzICovCisJdW5zaWduZWQgaW50IGFvX3ZhbHVlW05VTV9BT19DSEFOXTsKIAkvKiAgc29mdHdhcmUgY29weXMgb2YgYml0cyB3cml0dGVuIHRvIGNvbW1hbmQgcmVnaXN0ZXJzICovCiAJdm9sYXRpbGUgdW5zaWduZWQgaW50IGNvbW1hbmQxX2JpdHM7CiAJdm9sYXRpbGUgdW5zaWduZWQgaW50IGNvbW1hbmQyX2JpdHM7CkBAIC02MSwxNiArNjksMzQgQEAKIAkvKiAgc3RvcmUgbGFzdCByZWFkIG9mIGJvYXJkIHN0YXR1cyByZWdpc3RlcnMgKi8KIAl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc3RhdHVzMV9iaXRzOwogCXZvbGF0aWxlIHVuc2lnbmVkIGludCBzdGF0dXMyX2JpdHM7Ci0JdW5zaWduZWQgaW50IGRpdmlzb3JfYTA7CS8qIHZhbHVlIHRvIGxvYWQgaW50byBib2FyZCdzIGNvdW50ZXIgYTAgKGNvbnZlcnNpb24gcGFjaW5nKSBmb3IgdGltZWQgY29udmVyc2lvbnMgKi8KLQl1bnNpZ25lZCBpbnQgZGl2aXNvcl9iMDsJLyogdmFsdWUgdG8gbG9hZCBpbnRvIGJvYXJkJ3MgY291bnRlciBiMCAobWFzdGVyKSBmb3IgdGltZWQgY29udmVyc2lvbnMgKi8KLQl1bnNpZ25lZCBpbnQgZGl2aXNvcl9iMTsJLyogdmFsdWUgdG8gbG9hZCBpbnRvIGJvYXJkJ3MgY291bnRlciBiMSAoc2NhbiBwYWNpbmcpIGZvciB0aW1lZCBjb252ZXJzaW9ucyAqLworCS8qCisJICogdmFsdWUgdG8gbG9hZCBpbnRvIGJvYXJkJ3MgY291bnRlciBhMCAoY29udmVyc2lvbiBwYWNpbmcpIGZvciB0aW1lZAorCSAqIGNvbnZlcnNpb25zCisJICovCisJdW5zaWduZWQgaW50IGRpdmlzb3JfYTA7CisJLyoKKwkgKiB2YWx1ZSB0byBsb2FkIGludG8gYm9hcmQncyBjb3VudGVyIGIwIChtYXN0ZXIpIGZvciB0aW1lZCBjb252ZXJzaW9ucworCSAqLworCXVuc2lnbmVkIGludCBkaXZpc29yX2IwOworCS8qCisJICogdmFsdWUgdG8gbG9hZCBpbnRvIGJvYXJkJ3MgY291bnRlciBiMSAoc2NhbiBwYWNpbmcpIGZvciB0aW1lZAorCSAqIGNvbnZlcnNpb25zCisJICovCisJdW5zaWduZWQgaW50IGRpdmlzb3JfYjE7CiAJdW5zaWduZWQgaW50IGRtYV9jaGFuOwkvKiAgZG1hIGNoYW5uZWwgdG8gdXNlICovCiAJdTE2ICpkbWFfYnVmZmVyOwkvKiAgYnVmZmVyIGFpIHdpbGwgZG1hIGludG8gKi8KLQl1bnNpZ25lZCBpbnQgZG1hX3RyYW5zZmVyX3NpemU7CS8qICB0cmFuc2ZlciBzaXplIGluIGJ5dGVzIGZvciBjdXJyZW50IHRyYW5zZmVyICovCi0JZW51bSB0cmFuc2Zlcl90eXBlIGN1cnJlbnRfdHJhbnNmZXI7CS8qICB3ZSBhcmUgdXNpbmcgZG1hL2ZpZm8taGFsZi1mdWxsL2V0Yy4gKi8KLQl1bnNpZ25lZCBpbnQgZWVwcm9tX2RhdGFbRUVQUk9NX1NJWkVdOwkvKiAgc3RvcmVzIGNvbnRlbnRzIG9mIGJvYXJkJ3MgZWVwcm9tICovCi0JdW5zaWduZWQgaW50IGNhbGRhY1sxNl07CS8qICBzdG9yZXMgc2V0dGluZ3Mgb2YgY2FsaWJyYXRpb24gZGFjcyAqLwotCS8qICBmdW5jdGlvbiBwb2ludGVycyBzbyB3ZSBjYW4gdXNlIGluYi9vdXRiIG9yIHJlYWRiL3dyaXRlYiBhcyBhcHByb3ByaWF0ZSAqLworCS8qIHRyYW5zZmVyIHNpemUgaW4gYnl0ZXMgZm9yIGN1cnJlbnQgdHJhbnNmZXIgKi8KKwl1bnNpZ25lZCBpbnQgZG1hX3RyYW5zZmVyX3NpemU7CisJLyogd2UgYXJlIHVzaW5nIGRtYS9maWZvLWhhbGYtZnVsbC9ldGMuICovCisJZW51bSB0cmFuc2Zlcl90eXBlIGN1cnJlbnRfdHJhbnNmZXI7CisJLyogc3RvcmVzIGNvbnRlbnRzIG9mIGJvYXJkJ3MgZWVwcm9tICovCisJdW5zaWduZWQgaW50IGVlcHJvbV9kYXRhW0VFUFJPTV9TSVpFXTsKKwkvKiBzdG9yZXMgc2V0dGluZ3Mgb2YgY2FsaWJyYXRpb24gZGFjcyAqLworCXVuc2lnbmVkIGludCBjYWxkYWNbMTZdOworCS8qCisJICogZnVuY3Rpb24gcG9pbnRlcnMgc28gd2UgY2FuIHVzZSBpbmIvb3V0YiBvciByZWFkYi93cml0ZWIgYXMKKwkgKiBhcHByb3ByaWF0ZQorCSAqLwogCXVuc2lnbmVkIGludCAoKnJlYWRfYnl0ZSkgKHVuc2lnbmVkIGxvbmcgYWRkcmVzcyk7CiAJdm9pZCAoKndyaXRlX2J5dGUpICh1bnNpZ25lZCBpbnQgYnl0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwY19jcy5jCmluZGV4IDdkNTE0YjMuLjBiOTYzYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwY19jcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwY19jcy5jCkBAIC01OSw4ICs1OSw3IEBACiAKICovCiAKLSN1bmRlZiBMQUJQQ19ERUJVRwotCQkJICAgIC8qICNkZWZpbmUgTEFCUENfREVCVUcgKi8vKiAgZW5hYmxlIGRlYnVnZ2luZyBtZXNzYWdlcyAqLworI3VuZGVmIExBQlBDX0RFQlVHICAvKiBkZWJ1Z2dpbmcgbWVzc2FnZXMgKi8KIAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCkBAIC03NywxNCArNzYsMTUgQEAKICNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcGNtY2lhX2N1cl9kZXYgPSBOVUxMOworc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlICpwY21jaWFfY3VyX2RldjsKIAogc3RhdGljIGludCBsYWJwY19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBsYWJwY19ib2FyZF9zdHJ1Y3QgbGFicGNfY3NfYm9hcmRzW10gPSB7CiAJewogCSAubmFtZSA9ICJkYXFjYXJkLTEyMDAiLAotCSAuZGV2aWNlX2lkID0gMHgxMDMsCS8qICAweDEwYiBpcyBtYW51ZmFjdHVyZXIgaWQsIDB4MTAzIGlzIGRldmljZSBpZCAqLworCSAuZGV2aWNlX2lkID0gMHgxMDMsCS8qIDB4MTBiIGlzIG1hbnVmYWN0dXJlciBpZCwKKwkJCQkgICAweDEwMyBpcyBkZXZpY2UgaWQgKi8KIAkgLmFpX3NwZWVkID0gMTAwMDAsCiAJIC5idXN0eXBlID0gcGNtY2lhX2J1c3R5cGUsCiAJIC5yZWdpc3Rlcl9sYXlvdXQgPSBsYWJwY18xMjAwX2xheW91dCwKQEAgLTI3Myw5ICsyNzMsOCBAQAogCQlsYWJwY19yZWxlYXNlKGxpbmspOwogCX0KIAotCS8qIFRoaXMgcG9pbnRzIHRvIHRoZSBwYXJlbnQgbG9jYWxfaW5mb190IHN0cnVjdCAqLwotCWlmIChsaW5rLT5wcml2KQotCQlrZnJlZShsaW5rLT5wcml2KTsKKwkvKiBUaGlzIHBvaW50cyB0byB0aGUgcGFyZW50IGxvY2FsX2luZm9fdCBzdHJ1Y3QgKG1heSBiZSBudWxsKSAqLworCWtmcmVlKGxpbmstPnByaXYpOwogCiB9CQkJCS8qIGxhYnBjX2NzX2RldGFjaCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NvbW1vbi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jb21tb24uYwppbmRleCA3NTNlZTA1Li5kNmQ0OWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY29tbW9uLmMKQEAgLTIyMDcsNyArMjIwNyw3IEBACiAKIAkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCi0JLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KKwkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KIAlpZiAoY21kLT5zdGFydF9zcmMgIT0gVFJJR19OT1cgJiYKIAkgICAgY21kLT5zdGFydF9zcmMgIT0gVFJJR19JTlQgJiYgY21kLT5zdGFydF9zcmMgIT0gVFJJR19FWFQpCiAJCWVycisrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jcy5jCmluZGV4IGQ2OTJmNGIuLmRjNDg0OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NzLmMKQEAgLTI1MCw5ICsyNTAsOCBAQAogCiAJLyogUENNQ0lBIGxheWVyIGZyZWVzIHRoZSBJTyByZWdpb24gKi8KIAotCWlmIChkZXYtPmlycSkgeworCWlmIChkZXYtPmlycSkKIAkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7Ci0JfQogCiAJcmV0dXJuIDA7CiB9CkBAIC0yOTMsOSArMjkyLDggQEAKIHsKIAlEUFJJTlRLKCJjc19kZXRhY2gobGluaz0lcClcbiIsIGxpbmspOwogCi0JaWYgKGxpbmstPmRldl9ub2RlKSB7CisJaWYgKGxpbmstPmRldl9ub2RlKQogCQljc19yZWxlYXNlKGxpbmspOwotCX0KIH0KIAogc3RhdGljIGludCBtaW9fY3Nfc3VzcGVuZChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKQEAgLTM4Nyw5ICszODUsOCBAQAogCQl9CiAJCXByaW50aygiXG4iKTsKIAkJcHJpbnRrKCIgYm9hcmQgZmluZ2VycHJpbnQgKHdpbmRvd2VkKToiKTsKLQkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCiAJCQlwcmludGsoIiAweCUwNHgiLCB3aW5faW4oaSkpOwotCQl9CiAJCXByaW50aygiXG4iKTsKIAl9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2lkaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2lkaW8uYwppbmRleCBkNTQ0Njk4Li4yZDg4YTViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpZGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaWRpby5jCkBAIC03OTUsNyArNzk1LDcgQEAKIAogCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKLQkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLworCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLwogCWlmIChjbWQtPnN0YXJ0X3NyYyAhPSBUUklHX05PVyAmJiBjbWQtPnN0YXJ0X3NyYyAhPSBUUklHX0lOVCkKIAkJZXJyKys7CiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19USU1FUiAmJgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcxMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcxMS5jCmluZGV4IGRkOWRiMDYuLjQ5MTQ3ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzExLmMKQEAgLTQwNyw2ICs0MDcsNyBAQAogCQkgKiAgMHhiNCA9IFNlbGVjdCBDb3VudGVyIDIgfCBMU0IvTVNCIHwgTW9kZT0yIHwgQmluYXJ5CiAJCSAqLwogCisJCXRpbWVyMSA9IHRpbWVyMiA9IDA7CiAJCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoaTgyNTNfb3NjX2Jhc2UsICZ0aW1lcjEsICZ0aW1lcjIsCiAJCQkJCSAgJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCiAJCQkJCSAgVFJJR19ST1VORF9ORUFSRVNUKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MjYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MjYuYwppbmRleCBjY2FkZDA5Li42YTFhOTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzI2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcyNi5jCkBAIC0zOSwyNyArMzksMjcgQEAKICAgICBPcHRpb25zIGZvciBQQ0wtNzI2OgogICAgICBbMF0gLSBJTyBCYXNlCiAgICAgIFsyXS4uLls3XSAtIEQvQSBvdXRwdXQgcmFuZ2UgZm9yIGNoYW5uZWwgMS02OgotICAgICAgICAgICAgICAgMDogMC01ViwgMTogMC0xMFYsIDI6ICsvLTVWLCAzOiArLy0xMFYsCi0JICAgICAgIDQ6IDQtMjBtQSwgNTogdW5rbm93biAoZXh0ZXJuYWwgcmVmZXJlbmNlKQorCQkwOiAwLTVWLCAxOiAwLTEwViwgMjogKy8tNVYsIDM6ICsvLTEwViwKKwkJNDogNC0yMG1BLCA1OiB1bmtub3duIChleHRlcm5hbCByZWZlcmVuY2UpCiAKICAgICBPcHRpb25zIGZvciBQQ0wtNzI3OgogICAgICBbMF0gLSBJTyBCYXNlCiAgICAgIFsyXS4uLlsxM10gLSBEL0Egb3V0cHV0IHJhbmdlIGZvciBjaGFubmVsIDEtMTI6Ci0gICAgICAgICAgICAgICAwOiAwLTVWLCAxOiAwLTEwViwgMjogKy8tNVYsCi0JICAgICAgIDM6IDQtMjBtQQorCQkwOiAwLTVWLCAxOiAwLTEwViwgMjogKy8tNVYsCisJCTM6IDQtMjBtQQogCiAgICAgT3B0aW9ucyBmb3IgUENMLTcyOCBhbmQgQUNMLTYxMjg6CiAgICAgIFswXSAtIElPIEJhc2UKICAgICAgWzJdLCBbM10gLSBEL0Egb3V0cHV0IHJhbmdlIGZvciBjaGFubmVsIDEgYW5kIDI6Ci0gICAgICAgICAgICAgICAwOiAwLTVWLCAxOiAwLTEwViwgMjogKy8tNVYsIDM6ICsvLTEwViwKLQkgICAgICAgNDogNC0yMG1BLCA1OiAwLTIwbUEKKwkJMDogMC01ViwgMTogMC0xMFYsIDI6ICsvLTVWLCAzOiArLy0xMFYsCisJCTQ6IDQtMjBtQSwgNTogMC0yMG1BCiAKICAgICBPcHRpb25zIGZvciBBQ0wtNjEyNjoKICAgICAgWzBdIC0gSU8gQmFzZQogICAgICBbMV0gLSBJUlEgKDA9ZGlzYWJsZSwgMywgNSwgNiwgNywgOSwgMTAsIDExLCAxMiwgMTUpIChjdXJyZW50bHkgaWdub3JlZCkKICAgICAgWzJdLi4uWzddIC0gRC9BIG91dHB1dCByYW5nZSBmb3IgY2hhbm5lbCAxLTY6Ci0gICAgICAgICAgICAgICAwOiAwLTVWLCAxOiAwLTEwViwgMjogKy8tNVYsIDM6ICsvLTEwViwKLQkgICAgICAgNDogNC0yMG1BCisJCTA6IDAtNVYsIDE6IDAtMTBWLCAyOiArLy01ViwgMzogKy8tMTBWLAorCQk0OiA0LTIwbUEKICovCiAKIC8qCkBAIC0xMjcsNyArMTI3LDggQEAKIAlpbnQgZGlfbG87CiAJaW50IGRvX2hpOwogCWludCBkb19sbzsKLQljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqY29uc3QgKnJhbmdlX3R5cGVfbGlzdDsJLyogIGxpc3Qgb2Ygc3VwcG9ydGVkIHJhbmdlcyAqLworCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICpjb25zdCAqcmFuZ2VfdHlwZV9saXN0OworCS8qICBsaXN0IG9mIHN1cHBvcnRlZCByYW5nZXMgKi8KIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNsNzI2X2JvYXJkIGJvYXJkdHlwZXNbXSA9IHsKQEAgLTIwNCw5ICsyMDUsOCBAQAogCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJaW50IG47CiAKLQlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CisJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykKIAkJZGF0YVtuXSA9IGRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dOwotCX0KIAlyZXR1cm4gbjsKIH0KIApAQCAtMjU2LDEwICsyNTYsMTAgQEAKIAogCWlvYmFzZSA9IGl0LT5vcHRpb25zWzBdOwogCWlvcmFuZ2UgPSB0aGlzX2JvYXJkLT5pb19yYW5nZTsKLQlwcmludGsoImNvbWVkaSVkOiBwY2w3MjY6IGJvYXJkPSVzLCAweCUwM2x4ICIsIGRldi0+bWlub3IsCisJcHJpbnRrKEtFUk5fV0FSTklORyAiY29tZWRpJWQ6IHBjbDcyNjogYm9hcmQ9JXMsIDB4JTAzbHggIiwgZGV2LT5taW5vciwKIAkgICAgICAgdGhpc19ib2FyZC0+bmFtZSwgaW9iYXNlKTsKIAlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgaW9yYW5nZSwgInBjbDcyNiIpKSB7Ci0JCXByaW50aygiSS9PIHBvcnQgY29uZmxpY3RcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJJL08gcG9ydCBjb25mbGljdFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMjgzLDE2ICsyODMsMTYgQEAKIAkJZGV2cHJpdi0+Zmlyc3RfY2hhbiA9IDI7CiAJCWlmIChpcnEpIHsJLyogd2Ugd2FudCB0byB1c2UgSVJRICovCiAJCQlpZiAoKCgxIDw8IGlycSkgJiBib2FyZHR5cGVzW2JvYXJkXS5JUlFiaXRzKSA9PSAwKSB7Ci0JCQkJcHJpbnRrCi0JCQkJICAgICgiLCBJUlEgJWQgaXMgb3V0IG9mIGFsbG93ZWQgcmFuZ2UsIERJU0FCTElORyBJVCIsCi0JCQkJICAgICBpcnEpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJIiwgSVJRICVkIGlzIG91dCBvZiBhbGxvd2VkIHJhbmdlLCIKKwkJCQkJIiBESVNBQkxJTkcgSVQiLCBpcnEpOwogCQkJCWlycSA9IDA7CS8qIEJhZCBJUlEgKi8KIAkJCX0gZWxzZSB7CiAJCQkJaWYgKHJlcXVlc3RfaXJxKGlycSwgaW50ZXJydXB0X3BjbDgxOCwgMCwKIAkJCQkJCSJwY2w3MjYiLCBkZXYpKSB7Ci0JCQkJCXByaW50awotCQkJCQkgICAgKCIsIHVuYWJsZSB0byBhbGxvY2F0ZSBJUlEgJWQsIERJU0FCTElORyBJVCIsCi0JCQkJCSAgICAgaXJxKTsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkJIiwgdW5hYmxlIHRvIGFsbG9jYXRlIElSUSAlZCwiCisJCQkJCQkiIERJU0FCTElORyBJVCIsIGlycSk7CiAJCQkJCWlycSA9IDA7CS8qIENhbid0IHVzZSBJUlEgKi8KIAkJCQl9IGVsc2UgewogCQkJCQlwcmludGsoIiwgaXJxPSVkIiwgaXJxKTsKQEAgLTM3Miw5ICszNzIsOCBAQAogLyogcHJpbnRrKCJjb21lZGklZDogcGNsNzI2OiByZW1vdmVcbiIsZGV2LT5taW5vcik7ICovCiAKICNpZmRlZiBBQ0w2MTI2X0lSUQotCWlmIChkZXYtPmlycSkgeworCWlmIChkZXYtPmlycSkKIAkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7Ci0JfQogI2VuZGlmCiAKIAlpZiAoZGV2LT5pb2Jhc2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODEyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODEyLmMKaW5kZXggMGI1MWE0OC4uMGE1YmMzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTIuYwpAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICA1PUEvRCBpbnB1dCByYW5nZSBpcyArLy0wLjMxMjVWCiAgIFs1XSAtIDA9RC9BIG91dHB1dHMgMC01ViAgKGludGVybmFsIHJlZmVyZW5jZSAtNVYpCiAgICAgICAgIDE9RC9BIG91dHB1dHMgMC0xMFYgKGludGVybmFsIHJlZmVyZW5jZSAtMTBWKQotICAgICAgICAyPUQvQSBvdXRwdXRzIHVua25vdyAoZXh0ZXJuYWwgcmVmZXJlbmNlKQorICAgICAgICAyPUQvQSBvdXRwdXRzIHVua25vd24gKGV4dGVybmFsIHJlZmVyZW5jZSkKIAogT3B0aW9ucyBmb3IgUENMLTgxMlBHLCBBQ0wtODExMlBHOgogICBbMF0gLSBJTyBCYXNlCkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgIDE9QS9EIGhhdmUgbWF4ICsvLTEwViBpbnB1dAogICBbNV0gLSAwPUQvQSBvdXRwdXRzIDAtNVYgIChpbnRlcm5hbCByZWZlcmVuY2UgLTVWKQogICAgICAgICAxPUQvQSBvdXRwdXRzIDAtMTBWIChpbnRlcm5hbCByZWZlcmVuY2UgLTEwVikKLSAgICAgICAgMj1EL0Egb3V0cHV0cyB1bmtub3cgKGV4dGVybmFsIHJlZmVyZW5jZSkKKyAgICAgICAgMj1EL0Egb3V0cHV0cyB1bmtub3duIChleHRlcm5hbCByZWZlcmVuY2UpCiAKIE9wdGlvbnMgZm9yIEFDTC04MTEyREcvSEcsIEEtODIyUEdML1BHSCwgQS04MjNQR0wvUEdILCBBQ0wtODIxNiwgQS04MjZQRzoKICAgWzBdIC0gSU8gQmFzZQpAQCAtNzUsNyArNzUsNyBAQAogICAgICAgICAxPUEvRCBjaGFubmVscyBhcmUgRElGRgogICBbNV0gLSAwPUQvQSBvdXRwdXRzIDAtNVYgIChpbnRlcm5hbCByZWZlcmVuY2UgLTVWKQogICAgICAgICAxPUQvQSBvdXRwdXRzIDAtMTBWIChpbnRlcm5hbCByZWZlcmVuY2UgLTEwVikKLSAgICAgICAgMj1EL0Egb3V0cHV0cyB1bmtub3cgKGV4dGVybmFsIHJlZmVyZW5jZSkKKyAgICAgICAgMj1EL0Egb3V0cHV0cyB1bmtub3duIChleHRlcm5hbCByZWZlcmVuY2UpCiAKIE9wdGlvbnMgZm9yIEEtODIxUEdML1BHSDoKICAgWzBdIC0gSU8gQmFzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxNi5jCmluZGV4IGZhMjQxNDUuLjg1MmZlMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE2LmMKQEAgLTExMiw3ICsxMTIsNyBAQAogCWludCBuX2RpY2hhbjsJCS8qICBudW0gb2YgREkgY2hhbnMgKi8KIAlpbnQgbl9kb2NoYW47CQkvKiAgbnVtIG9mIERPIGNoYW5zICovCiAJY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKmFpX3JhbmdlX3R5cGU7CS8qICBkZWZhdWx0IEEvRCByYW5nZWxpc3QgKi8KLQljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqYW9fcmFuZ2VfdHlwZTsJLyogIGRhZmF1bHQgRC9BIHJhbmdlbGlzdCAqLworCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICphb19yYW5nZV90eXBlOwkvKiAgZGVmYXVsdCBEL0EgcmFuZ2VsaXN0ICovCiAJdW5zaWduZWQgaW50IGlvX3JhbmdlOwkvKiAgbGVuIG9mIElPIHNwYWNlICovCiAJdW5zaWduZWQgaW50IElSUWJpdHM7CS8qICBhbGxvd2VkIGludGVycnVwdHMgKi8KIAl1bnNpZ25lZCBpbnQgRE1BYml0czsJLyogIGFsbG93ZWQgRE1BIGNoYW5zICovCkBAIC00NDUsNyArNDQ1LDcgQEAKIAkJY29tZWRpX2Vycm9yKGRldiwgImJhZCBJUlEhIik7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9Ci0JY29tZWRpX2Vycm9yKGRldiwgIklSUSBmcm9tIHVua25vdyBzb3VyY2UhIik7CisJY29tZWRpX2Vycm9yKGRldiwgIklSUSBmcm9tIHVua25vd24gc291cmNlISIpOwogCXJldHVybiBJUlFfTk9ORTsKIH0KIApAQCAtNDcyLDcgKzQ3Miw3IEBACiAJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewogCWludCBlcnIgPSAwOwotCWludCB0bXAsIGRpdmlzb3IxLCBkaXZpc29yMjsKKwlpbnQgdG1wLCBkaXZpc29yMSA9IDAsIGRpdmlzb3IyID0gMDsKIAogCURFQlVHKHByaW50aygicGNsODE2IHBjbDgxMl9haV9jbWR0ZXN0XG4iKTsgcGNsODE2X2NtZHRlc3Rfb3V0KC0xLCBjbWQpOwogCSAgICApOwpAQCAtNDg4LDcgKzQ4OCw5IEBACiAJaWYgKCFjbWQtPnNjYW5fYmVnaW5fc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fYmVnaW5fc3JjKQogCQllcnIrKzsKIAotCWlmICghKGNtZC0+Y29udmVydF9zcmMgJiAoVFJJR19FWFQgfCBUUklHX1RJTUVSKSkpCisJdG1wID0gY21kLT5jb252ZXJ0X3NyYzsKKwljbWQtPmNvbnZlcnRfc3JjICY9IFRSSUdfRVhUIHwgVFJJR19USU1FUjsKKwlpZiAoIWNtZC0+Y29udmVydF9zcmMgfHwgdG1wICE9IGNtZC0+Y29udmVydF9zcmMpCiAJCWVycisrOwogCiAJdG1wID0gY21kLT5zY2FuX2VuZF9zcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE4LmMKaW5kZXggZTk1MjI5Yi4uZDA0ODEwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxOC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTguYwpAQCAtNTAsNyArNTAsNyBAQAogICAgICAgICAgIDEsIDEwPUEvRCBpbnB1dCAtMTBWLi4rMTBWCiAgICAgWzVdIC0gMCwgIDU9RC9BIG91dHB1dCAwLTVWICAoaW50ZXJuYWwgcmVmZXJlbmNlIC01VikKICAgICAgICAgICAxLCAxMD1EL0Egb3V0cHV0IDAtMTBWIChpbnRlcm5hbCByZWZlcmVuY2UgLTEwVikKLQkgIDIgICAgPUQvQSBvdXRwdXQgdW5rbm93IChleHRlcm5hbCByZWZlcmVuY2UpCisJICAyICAgID1EL0Egb3V0cHV0IHVua25vd24gKGV4dGVybmFsIHJlZmVyZW5jZSkKIAogICAgT3B0aW9ucyBmb3IgUENMLTgxOCwgUENMLTgxOEg6CiAgICAgWzBdIC0gSU8gQmFzZQpAQCAtNjAsNyArNjAsNyBAQAogICAgICAgICAgICAgICAxPSAxTUh6IGNsb2NrIGZvciA4MjU0CiAgICAgWzRdIC0gMCwgIDU9RC9BIG91dHB1dCAwLTVWICAoaW50ZXJuYWwgcmVmZXJlbmNlIC01VikKICAgICAgICAgICAxLCAxMD1EL0Egb3V0cHV0IDAtMTBWIChpbnRlcm5hbCByZWZlcmVuY2UgLTEwVikKLQkgIDIgICAgPUQvQSBvdXRwdXQgdW5rbm93IChleHRlcm5hbCByZWZlcmVuY2UpCisJICAyICAgID1EL0Egb3V0cHV0IHVua25vd24gKGV4dGVybmFsIHJlZmVyZW5jZSkKIAogICAgT3B0aW9ucyBmb3IgUENMLTgxOEhELCBQQ0wtODE4SEc6CiAgICAgWzBdIC0gSU8gQmFzZQpAQCAtNzEsNyArNzEsNyBAQAogICAgICAgICAgICAgICAxPSAxTUh6IGNsb2NrIGZvciA4MjU0CiAgICAgWzRdIC0gMCwgIDU9RC9BIG91dHB1dCAwLTVWICAoaW50ZXJuYWwgcmVmZXJlbmNlIC01VikKICAgICAgICAgICAxLCAxMD1EL0Egb3V0cHV0IDAtMTBWIChpbnRlcm5hbCByZWZlcmVuY2UgLTEwVikKLSAgIAkgIDIgICAgPUQvQSBvdXRwdXQgdW5rbm93IChleHRlcm5hbCByZWZlcmVuY2UpCisgICAJICAyICAgID1EL0Egb3V0cHV0IHVua25vd24gKGV4dGVybmFsIHJlZmVyZW5jZSkKIAogICAgT3B0aW9ucyBmb3IgUENMLTcxODoKICAgICBbMF0gLSBJTyBCYXNlCkBAIC05Miw3ICs5Miw3IEBACiAJICAgICAxMD0JICAgICB1c2VyIGRlZmluZWQgdW5pcG9sYXIKICAgICBbNV0gLSAwLCAgNT1EL0Egb3V0cHV0cyAwLTVWICAoaW50ZXJuYWwgcmVmZXJlbmNlIC01VikKICAgICAgICAgICAxLCAxMD1EL0Egb3V0cHV0cyAwLTEwViAoaW50ZXJuYWwgcmVmZXJlbmNlIC0xMFYpCi0JICAgICAgMj1EL0Egb3V0cHV0cyB1bmtub3cgKGV4dGVybmFsIHJlZmVyZW5jZSkKKwkgICAgICAyPUQvQSBvdXRwdXRzIHVua25vd24gKGV4dGVybmFsIHJlZmVyZW5jZSkKICAgICBbNl0gLSAwLCA2MD1tYXggIDYwa0h6IEEvRCBzYW1wbGluZwogICAgICAgICAgIDEsMTAwPW1heCAxMDBrSHogQS9EIHNhbXBsaW5nIChQQ0wtNzE4IHdpdGggT3B0aW9uIDAwMSBpbnN0YWxsZWQpCiAKQEAgLTg3Niw3ICs4NzYsNyBAQAogCQlyZXR1cm4gSVJRX05PTkU7CiAJfQogCi0JY29tZWRpX2Vycm9yKGRldiwgIklSUSBmcm9tIHVua25vdyBzb3VyY2UhIik7CisJY29tZWRpX2Vycm9yKGRldiwgIklSUSBmcm9tIHVua25vd24gc291cmNlISIpOwogCXJldHVybiBJUlFfTk9ORTsKIH0KIApAQCAtOTcwLDcgKzk3MCw3IEBACiAJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7Ci0JaW50IGRpdmlzb3IxLCBkaXZpc29yMjsKKwlpbnQgZGl2aXNvcjEgPSAwLCBkaXZpc29yMiA9IDA7CiAJdW5zaWduZWQgaW50IHNlZ2xlbjsKIAogCXByaW50aygicGNsODE4X2FpX2NtZF9tb2RlKClcbiIpOwpAQCAtMTA4OSw3ICsxMDg5LDcgQEAKIHN0YXRpYyBpbnQgcGNsODE4X2FvX21vZGUxMyhpbnQgbW9kZSwgc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgY29tZWRpX3RyaWcgKiBpdCkKIHsKLQlpbnQgZGl2aXNvcjEsIGRpdmlzb3IyOworCWludCBkaXZpc29yMSA9IDAsIGRpdmlzb3IyID0gMDsKIAogCWlmICghZGV2LT5pcnEpIHsKIAkJY29tZWRpX2Vycm9yKGRldiwgIklSUSBub3QgZGVmaW5lZCEiKTsKQEAgLTEyODcsNyArMTI4Nyw3IEBACiAJCSAgICAgIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7CiAJaW50IGVyciA9IDA7Ci0JaW50IHRtcCwgZGl2aXNvcjEsIGRpdmlzb3IyOworCWludCB0bXAsIGRpdmlzb3IxID0gMCwgZGl2aXNvcjIgPSAwOwogCiAJLyogc3RlcCAxOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbV9jb21tb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21fY29tbW9uLmMKaW5kZXggZWJkOTgzOC4uNTJjMmE2NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21fY29tbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbV9jb21tb24uYwpAQCAtNDEsNyArNDEsOCBAQAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCi0JLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KKwkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQKKwkgKiBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKIAkvKiB0aGVzZSB0ZXN0cyBhcmUgdHJ1ZSBpZiBtb3JlIHRoYW4gb25lIF9zcmMgYml0IGlzIHNldCAqLwogCWlmICgoY21kLT5zdGFydF9zcmMgJiAoY21kLT5zdGFydF9zcmMgLSAxKSkgIT0gMCkKQEAgLTEwNyw1ICsxMDgsNCBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KIEVYUE9SVF9TWU1CT0woY29tZWRpX3BjbV9jbWR0ZXN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21taW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21taW8uYwppbmRleCBkODEyYzJjLi4zNWJhOTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtbWlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbW1pby5jCkBAIC0zMiw4ICszMiwxMCBAQAogZm91ciBzdWJkZXZpY2VzOgogICBzdWJkZXZpY2UgMCAtIDE2IGNoYW5uZWxzIG9mIDE2LWJpdCBBSQogICBzdWJkZXZpY2UgMSAtIDggY2hhbm5lbHMgb2YgMTYtYml0IEFPCi0gIHN1YmRldmljZSAyIC0gZmlyc3QgMjQgY2hhbm5lbHMgb2YgdGhlIDQ4IGNoYW5uZWwgb2YgRElPICh3aXRoIGVkZ2UtdHJpZ2dlcmVkIGludGVycnVwdCBzdXBwb3J0KQotICBzdWJkZXZpY2UgMyAtIGxhc3QgMjQgY2hhbm5lbHMgb2YgdGhlIDQ4IGNoYW5uZWwgRElPIChubyBpbnRlcnJ1cHQgc3VwcG9ydCBmb3IgdGhpcyBiYW5rIG9mIGNoYW5uZWxzKQorICBzdWJkZXZpY2UgMiAtIGZpcnN0IDI0IGNoYW5uZWxzIG9mIHRoZSA0OCBjaGFubmVsIG9mIERJTworCSh3aXRoIGVkZ2UtdHJpZ2dlcmVkIGludGVycnVwdCBzdXBwb3J0KQorICBzdWJkZXZpY2UgMyAtIGxhc3QgMjQgY2hhbm5lbHMgb2YgdGhlIDQ4IGNoYW5uZWwgRElPCisJKG5vIGludGVycnVwdCBzdXBwb3J0IGZvciB0aGlzIGJhbmsgb2YgY2hhbm5lbHMpCiAKICAgU29tZSBub3RlczoKIApAQCAtNzAsNyArNzIsOCBAQAogCiBDb25maWd1cmF0aW9uIE9wdGlvbnM6CiAgIFswXSAtIEkvTyBwb3J0IGJhc2UgYWRkcmVzcwotICBbMV0gLSBJUlEgKG9wdGlvbmFsIC0tIGZvciBlZGdlLWRldGVjdCBpbnRlcnJ1cHQgc3VwcG9ydCBvbmx5LCBsZWF2ZSBvdXQgaWYgeW91IGRvbid0IG5lZWQgdGhpcyBmZWF0dXJlKQorICBbMV0gLSBJUlEgKG9wdGlvbmFsIC0tIGZvciBlZGdlLWRldGVjdCBpbnRlcnJ1cHQgc3VwcG9ydCBvbmx5LAorCWxlYXZlIG91dCBpZiB5b3UgZG9uJ3QgbmVlZCB0aGlzIGZlYXR1cmUpCiAqLwogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0xMTUsOSArMTE4LDExIEBACiAjZGVmaW5lIFJFR19QT1JUNCAweDQKICNkZWZpbmUgUkVHX1BPUlQ1IDB4NQogI2RlZmluZSBSRUdfSU5UX1BFTkRJTkcgMHg2Ci0jZGVmaW5lIFJFR19QQUdFTE9DSyAweDcJLyogcGFnZSBzZWxlY3RvciByZWdpc3RlciwgdXBwZXIgMiBiaXRzIHNlbGVjdCBhIHBhZ2UKLQkJCQkgICBhbmQgYml0cyAwLTUgYXJlIHVzZWQgdG8gJ2xvY2sgZG93bicgYSBwYXJ0aWN1bGFyCi0JCQkJICAgcG9ydCBhYm92ZSB0byBtYWtlIGl0IHJlYWRvbmx5LiAgKi8KKyNkZWZpbmUgUkVHX1BBR0VMT0NLIDB4NwkvKgorCQkJCSAqIHBhZ2Ugc2VsZWN0b3IgcmVnaXN0ZXIsIHVwcGVyIDIgYml0cyBzZWxlY3QKKwkJCQkgKiBhIHBhZ2UgYW5kIGJpdHMgMC01IGFyZSB1c2VkIHRvICdsb2NrIGRvd24nCisJCQkJICogYSBwYXJ0aWN1bGFyIHBvcnQgYWJvdmUgdG8gbWFrZSBpdCByZWFkb25seS4KKwkJCQkgKi8KICNkZWZpbmUgUkVHX1BPTDAgMHg4CiAjZGVmaW5lIFJFR19QT0wxIDB4OQogI2RlZmluZSBSRUdfUE9MMiAweEEKQEAgLTEzNCw3ICsxMzksNyBAQAogI2RlZmluZSBSRUdfUEFHRV9CSVRPRkZTRVQgNgogI2RlZmluZSBSRUdfTE9DS19CSVRPRkZTRVQgMAogI2RlZmluZSBSRUdfUEFHRV9NQVNLICh+KCgweDE8PFJFR19QQUdFX0JJVE9GRlNFVCktMSkpCi0jZGVmaW5lIFJFR19MT0NLX01BU0sgfihSRUdfUEFHRV9NQVNLKQorI2RlZmluZSBSRUdfTE9DS19NQVNLICh+KFJFR19QQUdFX01BU0spKQogI2RlZmluZSBQQUdFX1BPTCAxCiAjZGVmaW5lIFBBR0VfRU5BQiAyCiAjZGVmaW5lIFBBR0VfSU5UX0lEIDMKQEAgLTE2OCwxMyArMTczLDEyIEBACiAJY29tZWRpX2luc25fZm5fdCBhaV9yaW5zbiwgYW9fcmluc24sIGFvX3dpbnNuOwogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlc19haSA9Ci0gICAgeyA0LCB7UkFOR0UoLTUuLCA1LiksIFJBTkdFKC0xMC4sIDEwLiksIFJBTkdFKDAuLCA1LiksIFJBTkdFKDAuLAotCQkJCQkJCQkgMTAuKX0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSByYW5nZXNfYWkgPSB7CisJNCwge1JBTkdFKC01LiwgNS4pLCBSQU5HRSgtMTAuLCAxMC4pLCBSQU5HRSgwLiwgNS4pLCBSQU5HRSgwLiwgMTAuKX0KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSByYW5nZXNfYW8gPQotICAgIHsgNiwge1JBTkdFKDAuLCA1LiksIFJBTkdFKDAuLCAxMC4pLCBSQU5HRSgtNS4sIDUuKSwgUkFOR0UoLTEwLiwgMTAuKSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSByYW5nZXNfYW8gPSB7CisJNiwge1JBTkdFKDAuLCA1LiksIFJBTkdFKDAuLCAxMC4pLCBSQU5HRSgtNS4sIDUuKSwgUkFOR0UoLTEwLiwgMTAuKSwKIAkgIFJBTkdFKC0yLjUsIDIuNSksIFJBTkdFKC0yLjUsIDcuNSl9CiB9OwogCkBAIC0yMDQsNyArMjA4LDggQEAKIHN0cnVjdCBwY21taW9fc3ViZGV2X3ByaXZhdGUgewogCiAJdW5pb24gewotCQkvKiBmb3IgRElPOiBtYXBwaW5nIG9mIGhhbGZ3b3JkcyAoYnl0ZXMpIGluIHBvcnQvY2hhbmFycmF5IHRvIGlvYmFzZSAqLworCQkvKiBmb3IgRElPOiBtYXBwaW5nIG9mIGhhbGZ3b3JkcyAoYnl0ZXMpCisJCSAgIGluIHBvcnQvY2hhbmFycmF5IHRvIGlvYmFzZSAqLwogCQl1bnNpZ25lZCBsb25nIGlvYmFzZXNbUE9SVFNfUEVSX1NVQkRFVl07CiAKIAkJLyogZm9yIEFJL0FPICovCkBAIC0yMTUsMTUgKzIyMCwzMSBAQAogCiAJCQkvKiBUaGUgYmVsb3cgaXMgb25seSB1c2VkIGZvciBpbnRyIHN1YmRldmljZXMgKi8KIAkJCXN0cnVjdCB7Ci0JCQkJaW50IGFzaWM7CS8qIGlmIG5vbi1uZWdhdGl2ZSwgdGhpcyBzdWJkZXYgaGFzIGFuIGludGVycnVwdCBhc2ljICovCi0JCQkJaW50IGZpcnN0X2NoYW47CS8qIGlmIG5vbm5lZ2F0aXZlLCB0aGUgZmlyc3QgY2hhbm5lbCBpZCBmb3IKLQkJCQkJCSAgIGludGVycnVwdHMuICovCi0JCQkJaW50IG51bV9hc2ljX2NoYW5zOwkvKiB0aGUgbnVtYmVyIG9mIGFzaWMgY2hhbm5lbHMgaW4gdGhpcyBzdWJkZXYKLQkJCQkJCQkgICB0aGF0IGhhdmUgaW50ZXJydXRwcyAqLwotCQkJCWludCBhc2ljX2NoYW47CS8qIGlmIG5vbm5lZ2F0aXZlLCB0aGUgZmlyc3QgY2hhbm5lbCBpZCB3aXRoCi0JCQkJCQkgICByZXNwZWN0IHRvIHRoZSBhc2ljIHRoYXQgaGFzIGludGVycnVwdHMgKi8KLQkJCQlpbnQgZW5hYmxlZF9tYXNrOwkvKiBzdWJkZXYtcmVsYXRpdmUgY2hhbm5lbCBtYXNrIGZvciBjaGFubmVscwotCQkJCQkJCSAgIHdlIGFyZSBpbnRlcmVzdGVkIGluICovCisJCQkJLyoKKwkJCQkgKiBpZiBub24tbmVnYXRpdmUsIHRoaXMgc3ViZGV2IGhhcyBhbgorCQkJCSAqIGludGVycnVwdCBhc2ljCisJCQkJICovCisJCQkJaW50IGFzaWM7CisJCQkJLyoKKwkJCQkgKiBpZiBub25uZWdhdGl2ZSwgdGhlIGZpcnN0IGNoYW5uZWwgaWQgZm9yCisJCQkJICogaW50ZXJydXB0cy4KKwkJCQkgKi8KKwkJCQlpbnQgZmlyc3RfY2hhbjsKKwkJCQkvKgorCQkJCSAqIHRoZSBudW1iZXIgb2YgYXNpYyBjaGFubmVscyBpbiB0aGlzIHN1YmRldgorCQkJCSAqIHRoYXQgaGF2ZSBpbnRlcnJ1dHBzCisJCQkJICovCisJCQkJaW50IG51bV9hc2ljX2NoYW5zOworCQkJCS8qCisJCQkJICogaWYgbm9ubmVnYXRpdmUsIHRoZSBmaXJzdCBjaGFubmVsIGlkIHdpdGgKKwkJCQkgKiByZXNwZWN0IHRvIHRoZSBhc2ljIHRoYXQgaGFzIGludGVycnVwdHMKKwkJCQkgKi8KKwkJCQlpbnQgYXNpY19jaGFuOworCQkJCS8qCisJCQkJICogc3ViZGV2LXJlbGF0aXZlIGNoYW5uZWwgbWFzayBmb3IgY2hhbm5lbHMKKwkJCQkgKiB3ZSBhcmUgaW50ZXJlc3RlZCBpbgorCQkJCSAqLworCQkJCWludCBlbmFibGVkX21hc2s7CiAJCQkJaW50IGFjdGl2ZTsKIAkJCQlpbnQgc3RvcF9jb3VudDsKIAkJCQlpbnQgY29udGludW91czsKQEAgLTIzMSwyMCArMjUyLDI1IEBACiAJCQl9IGludHI7CiAJCX0gZGlvOwogCQlzdHJ1Y3QgewotCQkJdW5zaWduZWQgaW50IHNoYWRvd19zYW1wbGVzWzhdOwkvKiB0aGUgbGFzdCB1bnNpZ25lZCBpbnQgZGF0YSB3cml0dGVuICovCisJCQkvKiB0aGUgbGFzdCB1bnNpZ25lZCBpbnQgZGF0YSB3cml0dGVuICovCisJCQl1bnNpZ25lZCBpbnQgc2hhZG93X3NhbXBsZXNbOF07CiAJCX0gYW87CiAJfTsKIH07CiAKLS8qIHRoaXMgc3RydWN0dXJlIGlzIGZvciBkYXRhIHVuaXF1ZSB0byB0aGlzIGhhcmR3YXJlIGRyaXZlci4gIElmCi0gICBzZXZlcmFsIGhhcmR3YXJlIGRyaXZlcnMga2VlcCBzaW1pbGFyIGluZm9ybWF0aW9uIGluIHRoaXMgc3RydWN0dXJlLAotICAgZmVlbCBmcmVlIHRvIHN1Z2dlc3QgbW92aW5nIHRoZSB2YXJpYWJsZSB0byB0aGUgc3RydWN0IGNvbWVkaV9kZXZpY2Ugc3RydWN0LiAgKi8KKy8qCisgKiB0aGlzIHN0cnVjdHVyZSBpcyBmb3IgZGF0YSB1bmlxdWUgdG8gdGhpcyBoYXJkd2FyZSBkcml2ZXIuICBJZgorICogc2V2ZXJhbCBoYXJkd2FyZSBkcml2ZXJzIGtlZXAgc2ltaWxhciBpbmZvcm1hdGlvbiBpbiB0aGlzIHN0cnVjdHVyZSwKKyAqIGZlZWwgZnJlZSB0byBzdWdnZXN0IG1vdmluZyB0aGUgdmFyaWFibGUgdG8gdGhlIHN0cnVjdCBjb21lZGlfZGV2aWNlIHN0cnVjdC4KKyAqLwogc3RydWN0IHBjbW1pb19wcml2YXRlIHsKIAkvKiBzdHVmZiBmb3IgRElPICovCiAJc3RydWN0IHsKIAkJdW5zaWduZWQgY2hhciBwYWdlbG9jazsJLyogY3VycmVudCBwYWdlIGFuZCBsb2NrICovCi0JCXVuc2lnbmVkIGNoYXIgcG9sW05VTV9QQUdFRF9SRUdTXTsJLyogc2hhZG93IG9mIFBPTHggcmVnaXN0ZXJzICovCi0JCXVuc2lnbmVkIGNoYXIgZW5hYltOVU1fUEFHRURfUkVHU107CS8qIHNoYWRvdyBvZiBFTkFCeCByZWdpc3RlcnMgKi8KKwkJLyogc2hhZG93IG9mIFBPTHggcmVnaXN0ZXJzICovCisJCXVuc2lnbmVkIGNoYXIgcG9sW05VTV9QQUdFRF9SRUdTXTsKKwkJLyogc2hhZG93IG9mIEVOQUJ4IHJlZ2lzdGVycyAqLworCQl1bnNpZ25lZCBjaGFyIGVuYWJbTlVNX1BBR0VEX1JFR1NdOwogCQlpbnQgbnVtOwogCQl1bnNpZ25lZCBsb25nIGlvYmFzZTsKIAkJdW5zaWduZWQgaW50IGlycTsKQEAgLTMxMiw3ICszMzgsOCBAQAogCQkJICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKTsKIAogLyogc29tZSBoZWxwZXIgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBzcGVjaWZpY3Mgb2YgdGhpcyBkZXZpY2UncyByZWdpc3RlcnMgKi8KLXN0YXRpYyB2b2lkIGluaXRfYXNpY3Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldik7CS8qIHNldHMgdXAvY2xlYXJzIEFTSUMgY2hpcHMgdG8gZGVmYXVsdHMgKi8KKy8qIHNldHMgdXAvY2xlYXJzIEFTSUMgY2hpcHMgdG8gZGVmYXVsdHMgKi8KK3N0YXRpYyB2b2lkIGluaXRfYXNpY3Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBzd2l0Y2hfcGFnZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBpbnQgYXNpYywgaW50IHBhZ2UpOwogI2lmZGVmIG5vdHVzZWQKIHN0YXRpYyB2b2lkIGxvY2tfcG9ydChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBpbnQgYXNpYywgaW50IHBvcnQpOwpAQCAtMzY3LDkgKzM5NCwxMSBAQAogCQlkZXZwcml2LT5hc2ljc1thc2ljXS5udW0gPSBhc2ljOwogCQlkZXZwcml2LT5hc2ljc1thc2ljXS5pb2Jhc2UgPQogCQkgICAgZGV2LT5pb2Jhc2UgKyAxNiArIGFzaWMgKiBBU0lDX0lPU0laRTsKLQkJZGV2cHJpdi0+YXNpY3NbYXNpY10uaXJxID0gMDsJLyogdGhpcyBnZXRzIGFjdHVhbGx5IHNldCBhdCB0aGUgZW5kIG9mCi0JCQkJCQkgICB0aGlzIGZ1bmN0aW9uIHdoZW4gd2UKLQkJCQkJCSAgIHJlcXVlc3RfaXJxcyAqLworCQkvKgorCQkgKiB0aGlzIGdldHMgYWN0dWFsbHkgc2V0IGF0IHRoZSBlbmQgb2YgdGhpcyBmdW5jdGlvbiB3aGVuIHdlCisJCSAqIHJlcXVlc3RfaXJxcworCQkgKi8KKwkJZGV2cHJpdi0+YXNpY3NbYXNpY10uaXJxID0gMDsKIAkJc3Bpbl9sb2NrX2luaXQoJmRldnByaXYtPmFzaWNzW2FzaWNdLnNwaW5sb2NrKTsKIAl9CiAKQEAgLTQ2Myw3ICs0OTIsMTAgQEAKIAkJCWlmICh0aGlzYXNpY19jaGFuY3QgPAogCQkJICAgIENIQU5TX1BFUl9QT1JUICogSU5UUl9QT1JUU19QRVJfQVNJQwogCQkJICAgICYmIHN1YnByaXYtPmRpby5pbnRyLmFzaWMgPCAwKSB7Ci0JCQkJLyogdGhpcyBpcyBhbiBpbnRlcnJ1cHQgc3ViZGV2aWNlLCBzbyBzZXR1cCB0aGUgc3RydWN0ICovCisJCQkJLyoKKwkJCQkgKiB0aGlzIGlzIGFuIGludGVycnVwdCBzdWJkZXZpY2UsCisJCQkJICogc28gc2V0dXAgdGhlIHN0cnVjdAorCQkJCSAqLwogCQkJCXN1YnByaXYtPmRpby5pbnRyLmFzaWMgPSBhc2ljOwogCQkJCXN1YnByaXYtPmRpby5pbnRyLmFjdGl2ZSA9IDA7CiAJCQkJc3VicHJpdi0+ZGlvLmludHIuc3RvcF9jb3VudCA9IDA7CkBAIC00ODQsNyArNTE2LDExIEBACiAJCWNoYW5zX2xlZnQgLT0gcy0+bl9jaGFuOwogCiAJCWlmICghY2hhbnNfbGVmdCkgewotCQkJYXNpYyA9IDA7CS8qIHJlc2V0IHRoZSBhc2ljIHRvIG91ciBmaXJzdCBhc2ljLCB0byBkbyBpbnRyIHN1YmRldnMgKi8KKwkJCS8qCisJCQkgKiByZXNldCB0aGUgYXNpYyB0byBvdXIgZmlyc3QgYXNpYywKKwkJCSAqIHRvIGRvIGludHIgc3ViZGV2cworCQkJICovCisJCQlhc2ljID0gMDsKIAkJCXBvcnQgPSAwOwogCQl9CiAKQEAgLTUwNyw4ICs1NDMsMTAgQEAKIAkJZGV2cHJpdi0+YXNpY3NbYXNpY10uaXJxID0gaXJxW2FzaWNdOwogCX0KIAotCWRldi0+aXJxID0gaXJxWzBdOwkvKiBncnIuLiB3aXNoIGNvbWVkaSBkZXYgc3RydWN0IHN1cHBvcnRlZCBtdWx0aXBsZQotCQkJCSAgIGlycXMuLiAqLworCWRldi0+aXJxID0gaXJxWzBdOwkvKgorCQkJCSAqIGdyci4uIHdpc2ggY29tZWRpIGRldiBzdHJ1Y3Qgc3VwcG9ydGVkCisJCQkJICogbXVsdGlwbGUgaXJxcy4uCisJCQkJICovCiAKIAlpZiAoaXJxWzBdKSB7CiAJCXByaW50aygiaXJxOiAldSAiLCBpcnFbMF0pOwpAQCAtNjA0LDkgKzY0MiwxNCBAQAogI2VuZGlmCiAKIAkJaWYgKHdyaXRlX21hc2tfYnl0ZSkgewotCQkJLyogdGhpcyBieXRlIGhhcyBzb21lIHdyaXRlX2JpdHMgLS0gc28gc2V0IHRoZSBvdXRwdXQgbGluZXMgKi8KLQkJCWJ5dGUgJj0gfndyaXRlX21hc2tfYnl0ZTsJLyogY2xlYXIgYml0cyBmb3Igd3JpdGUgbWFzayAqLwotCQkJYnl0ZSB8PSB+ZGF0YV9ieXRlICYgd3JpdGVfbWFza19ieXRlOwkvKiBzZXQgdG8gaW52ZXJ0ZWQgZGF0YV9ieXRlICovCisJCQkvKgorCQkJICogdGhpcyBieXRlIGhhcyBzb21lIHdyaXRlX2JpdHMKKwkJCSAqIC0tIHNvIHNldCB0aGUgb3V0cHV0IGxpbmVzCisJCQkgKi8KKwkJCS8qIGNsZWFyIGJpdHMgZm9yIHdyaXRlIG1hc2sgKi8KKwkJCWJ5dGUgJj0gfndyaXRlX21hc2tfYnl0ZTsKKwkJCS8qIHNldCB0byBpbnZlcnRlZCBkYXRhX2J5dGUgKi8KKwkJCWJ5dGUgfD0gfmRhdGFfYnl0ZSAmIHdyaXRlX21hc2tfYnl0ZTsKIAkJCS8qIFdyaXRlIG91dCB0aGUgbmV3IGRpZ2l0YWwgb3V0cHV0IHN0YXRlICovCiAJCQlvdXRiKGJ5dGUsIGlvYWRkcik7CiAJCX0KQEAgLTY3MCw5ICs3MTMsMTEgQEAKIAkJYnl0ZSAmPSB+KDEgPDwgYml0X25vKTsKIAkJCQkvKio8IHNldCBpbnB1dCBjaGFubmVsIHRvICcwJyAqLwogCi0JCS8qIHdyaXRlIG91dCBieXRlIC0tIHRoaXMgaXMgdGhlIG9ubHkgdGltZSB3ZSBhY3R1YWxseSBhZmZlY3QgdGhlCi0JCSAgIGhhcmR3YXJlIGFzIGFsbCBjaGFubmVscyBhcmUgaW1wbGljaXRseSBvdXRwdXQgLS0gYnV0IGlucHV0Ci0JCSAgIGNoYW5uZWxzIGFyZSBzZXQgdG8gZmxvYXQtaGlnaCAqLworCQkvKgorCQkgKiB3cml0ZSBvdXQgYnl0ZSAtLSB0aGlzIGlzIHRoZSBvbmx5IHRpbWUgd2UgYWN0dWFsbHkgYWZmZWN0CisJCSAqIHRoZSBoYXJkd2FyZSBhcyBhbGwgY2hhbm5lbHMgYXJlIGltcGxpY2l0bHkgb3V0cHV0CisJCSAqIC0tIGJ1dCBpbnB1dCBjaGFubmVscyBhcmUgc2V0IHRvIGZsb2F0LWhpZ2gKKwkJICovCiAJCW91dGIoYnl0ZSwgaW9hZGRyKTsKIAogCQkvKiBzYXZlIHRvIGlvX2JpdHMgKi8KQEAgLTcyNiw4ICs3NzEsOCBAQAogCQkgICBvdXRiKDB4ZmYsIGJhc2VhZGRyICsgUkVHX0VOQUIwKTsgKi8KIAkJLyogRU5EIERFQlVHICovCiAKLQkJc3dpdGNoX3BhZ2UoZGV2LCBhc2ljLCAwKTsJLyogc3dpdGNoIGJhY2sgdG8gZGVmYXVsdCBwYWdlIDAgKi8KLQorCQkvKiBzd2l0Y2ggYmFjayB0byBkZWZhdWx0IHBhZ2UgMCAqLworCQlzd2l0Y2hfcGFnZShkZXYsIGFzaWMsIDApOwogCX0KIH0KIApAQCAtODA2LDcgKzg1MSwxMCBAQAogCQkJCQkJCVJFR19JTlRfSUQwICsgcG9ydCk7CiAKIAkJCQkJCWlmIChpb19saW5lc193aXRoX2VkZ2VzKQotCQkJCQkJCS8qIGNsZWFyIHBlbmRpbmcgaW50ZXJydXB0ICovCisJCQkJCQkJLyoKKwkJCQkJCQkgKiBjbGVhciBwZW5kaW5nCisJCQkJCQkJICogaW50ZXJydXB0CisJCQkJCQkJICovCiAJCQkJCQkJb3V0YigwLCBpb2Jhc2UgKwogCQkJCQkJCSAgICAgUkVHX0lOVF9JRDAgKwogCQkJCQkJCSAgICAgcG9ydCk7CkBAIC04MjUsMTQgKzg3MywyMSBAQAogCiAJCQlpZiAodHJpZ2dlcmVkKSB7CiAJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7Ci0JCQkJLyogVE9ETyBoZXJlOiBkaXNwYXRjaCBpbyBsaW5lcyB0byBzdWJkZXZzIHdpdGggY29tbWFuZHMuLiAqLworCQkJCS8qCisJCQkJICogVE9ETyBoZXJlOiBkaXNwYXRjaCBpbyBsaW5lcyB0byBzdWJkZXZzCisJCQkJICogd2l0aCBjb21tYW5kcy4uCisJCQkJICovCiAJCQkJcHJpbnRrCiAJCQkJICAgICgiUENNTUlPIERFQlVHOiBnb3QgZWRnZSBkZXRlY3QgaW50ZXJydXB0ICVkIGFzaWMgJWQgd2hpY2hfY2hhbnM6ICUwNnhcbiIsCiAJCQkJICAgICBpcnEsIGFzaWMsIHRyaWdnZXJlZCk7CiAJCQkJZm9yIChzID0gZGV2LT5zdWJkZXZpY2VzICsgMjsKIAkJCQkgICAgIHMgPCBkZXYtPnN1YmRldmljZXMgKyBkZXYtPm5fc3ViZGV2aWNlczsKIAkJCQkgICAgICsrcykgewotCQkJCQlpZiAoc3VicHJpdi0+ZGlvLmludHIuYXNpYyA9PSBhc2ljKSB7CS8qIHRoaXMgaXMgYW4gaW50ZXJydXB0IHN1YmRldiwgYW5kIGl0IG1hdGNoZXMgdGhpcyBhc2ljISAqLworCQkJCQkvKgorCQkJCQkgKiB0aGlzIGlzIGFuIGludGVycnVwdCBzdWJkZXYsCisJCQkJCSAqIGFuZCBpdCBtYXRjaGVzIHRoaXMgYXNpYyEKKwkJCQkJICovCisJCQkJCWlmIChzdWJwcml2LT5kaW8uaW50ci5hc2ljID09IGFzaWMpIHsKIAkJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCQkJCQl1bnNpZ25lZCBvbGRldmVudHM7CiAKQEAgLTg2Nyw5ICs5MjIsOCBAQAogCQkJCQkJCQkgICAgIG4gPCBsZW47CiAJCQkJCQkJCSAgICAgbisrKSB7CiAJCQkJCQkJCQljaCA9IENSX0NIQU4ocy0+YXN5bmMtPmNtZC5jaGFubGlzdFtuXSk7Ci0JCQkJCQkJCQlpZiAobXl0cmlnICYgKDFVIDw8IGNoKSkgeworCQkJCQkJCQkJaWYgKG15dHJpZyAmICgxVSA8PCBjaCkpCiAJCQkJCQkJCQkJdmFsIHw9ICgxVSA8PCBuKTsKLQkJCQkJCQkJCX0KIAkJCQkJCQkJfQogCQkJCQkJCQkvKiBXcml0ZSB0aGUgc2NhbiB0byB0aGUgYnVmZmVyLiAqLwogCQkJCQkJCQlpZiAoY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsICgoc2hvcnQgKikmdmFsKVswXSkKQEAgLTg3Nyw4ICs5MzEsNyBAQAogCQkJCQkJCQkgICAgY29tZWRpX2J1Zl9wdXQKIAkJCQkJCQkJICAgIChzLT5hc3luYywKIAkJCQkJCQkJICAgICAoKHNob3J0ICopCi0JCQkJCQkJCSAgICAgICZ2YWwpWzFdKSkKLQkJCQkJCQkJeworCQkJCQkJCQkgICAgICAmdmFsKVsxXSkpIHsKIAkJCQkJCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gKENPTUVESV9DQl9CTE9DSyB8IENPTUVESV9DQl9FT1MpOwogCQkJCQkJCQl9IGVsc2UgewogCQkJCQkJCQkJLyogT3ZlcmZsb3chIFN0b3AgYWNxdWlzaXRpb24hISAqLwpAQCAtOTgxLDkgKzEwMzQsMTYgQEAKIAkJCSAxKSA8PCBzdWJwcml2LT5kaW8uaW50ci5maXJzdF9jaGFuOwogCQlzdWJwcml2LT5kaW8uaW50ci5lbmFibGVkX21hc2sgPSBiaXRzOwogCi0JCXsJCS8qIHRoZSBiZWxvdyBjb2RlIGNvbmZpZ3VyZXMgdGhlIGJvYXJkIHRvIHVzZSBhIHNwZWNpZmljIElSUSBmcm9tIDAtMTUuICovCisJCXsKKwkJCS8qCisJCQkgKiB0aGUgYmVsb3cgY29kZSBjb25maWd1cmVzIHRoZSBib2FyZAorCQkJICogdG8gdXNlIGEgc3BlY2lmaWMgSVJRIGZyb20gMC0xNS4KKwkJCSAqLwogCQkJdW5zaWduZWQgY2hhciBiOwotCQkJLyogc2V0IHJlc291cmNlIGVuYWJsZSByZWdpc3RlciB0byBlbmFibGUgSVJRIG9wZXJhdGlvbiAqLworCQkJLyoKKwkJCSAqIHNldCByZXNvdXJjZSBlbmFibGUgcmVnaXN0ZXIKKwkJCSAqIHRvIGVuYWJsZSBJUlEgb3BlcmF0aW9uCisJCQkgKi8KIAkJCW91dGIoMSA8PCA0LCBkZXYtPmlvYmFzZSArIDMpOwogCQkJLyogc2V0IGJpdHMgMC0zIG9mIGIgdG8gdGhlIGlycSBudW1iZXIgZnJvbSAwLTE1ICovCiAJCQliID0gZGV2LT5pcnEgJiAoKDEgPDwgNCkgLSAxKTsKQEAgLTEwMzcsMTQgKzEwOTcsMTIgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzdWJwcml2LT5kaW8uaW50ci5zcGlubG9jaywgZmxhZ3MpOwogCXMtPmFzeW5jLT5pbnR0cmlnID0gMDsKLQlpZiAoc3VicHJpdi0+ZGlvLmludHIuYWN0aXZlKSB7CisJaWYgKHN1YnByaXYtPmRpby5pbnRyLmFjdGl2ZSkKIAkJZXZlbnQgPSBwY21taW9fc3RhcnRfaW50cihkZXYsIHMpOwotCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdWJwcml2LT5kaW8uaW50ci5zcGlubG9jaywgZmxhZ3MpOwogCi0JaWYgKGV2ZW50KSB7CisJaWYgKGV2ZW50KQogCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQl9CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTEwODYsOSArMTE0NCw4IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN1YnByaXYtPmRpby5pbnRyLnNwaW5sb2NrLCBmbGFncyk7CiAKLQlpZiAoZXZlbnQpIHsKKwlpZiAoZXZlbnQpCiAJCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTEzNiwxNyArMTE5MywzMiBAQAogCQlzaG9ydCBzYW1wbGUsIGFkY19hZGp1c3QgPSAwOwogCiAJCWlmIChjaGFuID4gNykKLQkJCWNoYW4gLT0gOCwgaW9vZmZzZXQgPSA0OwkvKiB1c2UgdGhlIHNlY29uZCBkd29yZCBmb3IgY2hhbm5lbHMgPiA3ICovCisJCQljaGFuIC09IDgsIGlvb2Zmc2V0ID0gNDsJLyoKKwkJCQkJCQkgKiB1c2UgdGhlIHNlY29uZCBkd29yZAorCQkJCQkJCSAqIGZvciBjaGFubmVscyA+IDcKKwkJCQkJCQkgKi8KIAogCQlpZiAoYXJlZiAhPSBBUkVGX0RJRkYpIHsKIAkJCWFyZWYgPSBBUkVGX0dST1VORDsKLQkJCWNvbW1hbmRfYnl0ZSB8PSAxIDw8IDc7CS8qIHNldCBiaXQgNyB0byBpbmRpY2F0ZSBzaW5nbGUtZW5kZWQgKi8KKwkJCWNvbW1hbmRfYnl0ZSB8PSAxIDw8IDc7CS8qCisJCQkJCQkgKiBzZXQgYml0IDcgdG8gaW5kaWNhdGUKKwkJCQkJCSAqIHNpbmdsZS1lbmRlZAorCQkJCQkJICovCiAJCX0KIAkJaWYgKHJhbmdlIDwgMikKLQkJCWFkY19hZGp1c3QgPSAweDgwMDA7CS8qIGJpcG9sYXIgcmFuZ2VzICgtNSw1IC4uIC0xMCwxMCBuZWVkIHRvIGJlIGFkanVzdGVkIC0tIHRoYXQgaXMuLiB0aGV5IG5lZWQgdG8gd3JhcCBhcm91bmQgYnkgYWRkaW5nIDB4ODAwMCAqLworCQkJYWRjX2FkanVzdCA9IDB4ODAwMDsJLyoKKwkJCQkJCSAqIGJpcG9sYXIgcmFuZ2VzCisJCQkJCQkgKiAoLTUsNSAuLiAtMTAsMTAgbmVlZCB0byBiZQorCQkJCQkJICogYWRqdXN0ZWQgLS0gdGhhdCBpcy4uIHRoZXkKKwkJCQkJCSAqIG5lZWQgdG8gd3JhcCBhcm91bmQgYnkKKwkJCQkJCSAqIGFkZGluZyAweDgwMDAKKwkJCQkJCSAqLwogCiAJCWlmIChjaGFuICUgMikgewotCQkJY29tbWFuZF9ieXRlIHw9IDEgPDwgNjsJLyogb2RkLW51bWJlcmVkIGNoYW5uZWxzIGhhdmUgYml0IDYgc2V0ICovCisJCQljb21tYW5kX2J5dGUgfD0gMSA8PCA2OwkvKgorCQkJCQkJICogb2RkLW51bWJlcmVkIGNoYW5uZWxzCisJCQkJCQkgKiBoYXZlIGJpdCA2IHNldAorCQkJCQkJICovCiAJCX0KIAogCQkvKiBzZWxlY3QgdGhlIGNoYW5uZWwsIGJpdHMgNC01ID09IGNoYW4vMiAqLwpAQCAtMTE1NiwxNiArMTIyOCwyMiBAQAogCQljb21tYW5kX2J5dGUgfD0gKHJhbmdlICYgMHgzKSA8PCAyOwogCiAJCS8qIG5lZWQgdG8gZG8gdGhpcyB0d2ljZSB0byBtYWtlIHN1cmUgbXV4IHNldHRsZWQgKi8KLQkJb3V0Yihjb21tYW5kX2J5dGUsIGlvYmFzZSArIGlvb2Zmc2V0ICsgMik7CS8qIGNoYW4vcmFuZ2UvYXJlZiBzZWxlY3QgKi8KKwkJLyogY2hhbi9yYW5nZS9hcmVmIHNlbGVjdCAqLworCQlvdXRiKGNvbW1hbmRfYnl0ZSwgaW9iYXNlICsgaW9vZmZzZXQgKyAyKTsKIAotCQlhZGNfd2FpdF9yZWFkeShpb2Jhc2UgKyBpb29mZnNldCk7CS8qIHdhaXQgZm9yIHRoZSBhZGMgdG8gc2F5IGl0IGZpbmlzZWQgdGhlIGNvbnZlcnNpb24gKi8KKwkJLyogd2FpdCBmb3IgdGhlIGFkYyB0byBzYXkgaXQgZmluaXNlZCB0aGUgY29udmVyc2lvbiAqLworCQlhZGNfd2FpdF9yZWFkeShpb2Jhc2UgKyBpb29mZnNldCk7CiAKLQkJb3V0Yihjb21tYW5kX2J5dGUsIGlvYmFzZSArIGlvb2Zmc2V0ICsgMik7CS8qIHNlbGVjdCB0aGUgY2hhbi9yYW5nZS9hcmVmIEFHQUlOICovCisJCS8qIHNlbGVjdCB0aGUgY2hhbi9yYW5nZS9hcmVmIEFHQUlOICovCisJCW91dGIoY29tbWFuZF9ieXRlLCBpb2Jhc2UgKyBpb29mZnNldCArIDIpOwogCiAJCWFkY193YWl0X3JlYWR5KGlvYmFzZSArIGlvb2Zmc2V0KTsKIAotCQlzYW1wbGUgPSBpbmIoaW9iYXNlICsgaW9vZmZzZXQgKyAwKTsJLyogcmVhZCBkYXRhIGxvIGJ5dGUgKi8KLQkJc2FtcGxlIHw9IGluYihpb2Jhc2UgKyBpb29mZnNldCArIDEpIDw8IDg7CS8qIHJlYWQgZGF0YSBoaSBieXRlICovCisJCS8qIHJlYWQgZGF0YSBsbyBieXRlICovCisJCXNhbXBsZSA9IGluYihpb2Jhc2UgKyBpb29mZnNldCArIDApOworCisJCS8qIHJlYWQgZGF0YSBoaSBieXRlICovCisJCXNhbXBsZSB8PSBpbmIoaW9iYXNlICsgaW9vZmZzZXQgKyAxKSA8PCA4OwogCQlzYW1wbGUgKz0gYWRjX2FkanVzdDsJLyogYWRqdXN0bWVudCAuLiBtdW5nZSBkYXRhICovCiAJCWRhdGFbbl0gPSBzYW1wbGU7CiAJfQpAQCAtMTIyNywxNSArMTMwNSwyNCBAQAogCiAJCQl3YWl0X2RhY19yZWFkeShpb2Jhc2UgKyBpb29mZnNldCk7CiAKLQkJCW91dGIoZGF0YVtuXSAmIDB4ZmYsIGlvYmFzZSArIGlvb2Zmc2V0ICsgMCk7CS8qIGxvdyBvcmRlciBieXRlICovCi0JCQlvdXRiKChkYXRhW25dID4+IDgpICYgMHhmZiwgaW9iYXNlICsgaW9vZmZzZXQgKyAxKTsJLyogaGlnaCBvcmRlciBieXRlICovCi0JCQljb21tYW5kX2J5dGUgPSAweDcwIHwgKGNoYW4gPDwgMSk7CS8qIHNldCBiaXQgNCBvZiBjb21tYW5kIGJ5dGUgdG8gaW5kaWNhdGUgZGF0YSBpcyBsb2FkZWQgYW5kIHRyaWdnZXIgY29udmVyc2lvbiAqLworCQkJLyogbG93IG9yZGVyIGJ5dGUgKi8KKwkJCW91dGIoZGF0YVtuXSAmIDB4ZmYsIGlvYmFzZSArIGlvb2Zmc2V0ICsgMCk7CisKKwkJCS8qIGhpZ2ggb3JkZXIgYnl0ZSAqLworCQkJb3V0YigoZGF0YVtuXSA+PiA4KSAmIDB4ZmYsIGlvYmFzZSArIGlvb2Zmc2V0ICsgMSk7CisKKwkJCS8qCisJCQkgKiBzZXQgYml0IDQgb2YgY29tbWFuZCBieXRlIHRvIGluZGljYXRlCisJCQkgKiBkYXRhIGlzIGxvYWRlZCBhbmQgdHJpZ2dlciBjb252ZXJzaW9uCisJCQkgKi8KKwkJCWNvbW1hbmRfYnl0ZSA9IDB4NzAgfCAoY2hhbiA8PCAxKTsKIAkJCS8qIHRyaWdnZXIgY29udmVyaW9uICovCiAJCQlvdXRiKGNvbW1hbmRfYnl0ZSwgaW9iYXNlICsgaW9vZmZzZXQgKyAyKTsKIAogCQkJd2FpdF9kYWNfcmVhZHkoaW9iYXNlICsgaW9vZmZzZXQpOwogCi0JCQlzdWJwcml2LT5hby5zaGFkb3dfc2FtcGxlc1tjaGFuXSA9IGRhdGFbbl07CS8qIHNhdmUgdG8gc2hhZG93IHJlZ2lzdGVyIGZvciBhb19yaW5zbiAqLworCQkJLyogc2F2ZSB0byBzaGFkb3cgcmVnaXN0ZXIgZm9yIGFvX3JpbnNuICovCisJCQlzdWJwcml2LT5hby5zaGFkb3dfc2FtcGxlc1tjaGFuXSA9IGRhdGFbbl07CiAJCX0KIAl9CiAJcmV0dXJuIG47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcXVhdGVjaF9kYXFwX2NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcXVhdGVjaF9kYXFwX2NzLmMKaW5kZXggNTI1NmZkOS4uMzMyNWYyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3F1YXRlY2hfZGFxcF9jcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9xdWF0ZWNoX2RhcXBfY3MuYwpAQCAtNDg5LDcgKzQ4OSw3IEBACiAKIAkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCi0JLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KKwkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX1RJTUVSICYmCiAJICAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19GT0xMT1cpCiAJCWVycisrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jCmluZGV4IGYzNWNjZTUuLjg2MjY2NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMKQEAgLTE3NjgsNyArMTc2OCw3IEBACiAKIAkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZQogCSAgIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCi0JLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KKwkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX1RJTUVSICYmCiAJICAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19FWFQpIHsKIAkJZXJyKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuYwppbmRleCA4MGQyNzg3Li5mZGQ3YWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMKQEAgLTE5MjYsNyArMTkyNiw3IEBACiAJLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5CiAJICAgY29tcGF0aWJsZSAqLwogCi0JLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KKwkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX1RJTUVSICYmCiAJICAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19FWFQKIAkgICAgJiYgY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0ZPTExPVykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5oCmluZGV4IDFkMDQ5MjIuLmQwMjc0MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuaApAQCAtNzYsMTQgKzc2LDYgQEAKICNkZWZpbmUgRkFMU0UgICAoMCkKICNlbmRpZgogCi0jaWYgIWRlZmluZWQoRVhURVJOKQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCi0jZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCi0jZWxzZQotI2RlZmluZSBFWFRFUk4gZXh0ZXJuCi0jZW5kaWYKLSNlbmRpZgotCiAjaWYgIWRlZmluZWQoSU5MSU5FKQogI2RlZmluZSBJTkxJTkUgc3RhdGljIF9faW5saW5lCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zZXJpYWwyMDAyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc2VyaWFsMjAwMi5jCmluZGV4IDgyYWE4NmUuLmRiMzdkY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zZXJpYWwyMDAyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3NlcmlhbDIwMDIuYwpAQCAtMTI1LDE0ICsxMjUsOSBAQAogCiBzdGF0aWMgbG9uZyB0dHlfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIG9wLCB1bnNpZ25lZCBsb25nIHBhcmFtKQogewotI2lmZGVmIEhBVkVfVU5MT0NLRURfSU9DVEwKLQlpZiAoZi0+Zl9vcC0+dW5sb2NrZWRfaW9jdGwpIHsKKwlpZiAoZi0+Zl9vcC0+dW5sb2NrZWRfaW9jdGwpCiAJCXJldHVybiBmLT5mX29wLT51bmxvY2tlZF9pb2N0bChmLCBvcCwgcGFyYW0pOwotCX0KLSNlbmRpZgotCWlmIChmLT5mX29wLT5pb2N0bCkgewotCQlyZXR1cm4gZi0+Zl9vcC0+aW9jdGwoZi0+Zl9kZW50cnktPmRfaW5vZGUsIGYsIG9wLCBwYXJhbSk7Ci0JfQorCiAJcmV0dXJuIC1FTk9TWVM7CiB9CiAKQEAgLTQwOSw4ICs0MDQsOCBAQAogCX0gZWxzZSB7CiAJCXN0cnVjdCBjb25maWdfdCB7CiAKLQkJCWludCBraW5kOwotCQkJaW50IGJpdHM7CisJCQlzaG9ydCBpbnQga2luZDsKKwkJCXNob3J0IGludCBiaXRzOwogCQkJaW50IG1pbjsKIAkJCWludCBtYXg7CiAJCX07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc2tlbC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3NrZWwuYwppbmRleCAzZGVlNjJhLi5hYmE1N2Q5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc2tlbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9za2VsLmMKQEAgLTM5OSw3ICszOTksNyBAQAogCiAJLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIAotCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCisJLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19USU1FUiAmJgogCSAgICBjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUKQogCQllcnIrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXguYwppbmRleCBjY2E0ZTg2Li4wNmMwMjA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eC5jCkBAIC0xLDQgKzEsNCBAQAotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjIuMiIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYyLjMiCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkJlcm5kIFBvcnIsIEJlcm5kUG9yckBmMnMuY29tIgogI2RlZmluZSBEUklWRVJfREVTQyAiU3RpcmxpbmcvSVRMIFVTQi1EVVggLS0gQmVybmQuUG9yckBmMnMuY29tIgogLyoKQEAgLTgwLDYgKzgwLDcgQEAKICAqIDIuMDogIFBXTSBzZWVtcyB0byBiZSBzdGFibGUgYW5kIGlzIG5vdCBpbnRlcmZlcmluZyB3aXRoIHRoZSBvdGhlciBmdW5jdGlvbnMKICAqIDIuMTogIGNoYW5nZWQgUFdNIEFQSQogICogMi4yOiAgYWRkZWQgZmlybXdhcmUga2VybmVsIHJlcXVlc3QgdG8gZml4IGFuIHVkZXYgcHJvYmxlbQorICogMi4zOiAgY29ycmVjdGVkIGEgYnVnIGluIGJ1bGsgdGltZW91dHMgd2hpY2ggd2VyZSBmYXIgdG9vIHNob3J0CiAgKgogICovCiAKQEAgLTEwMSw4ICsxMDIsOCBAQAogCiAjZGVmaW5lIEJPQVJETkFNRSAidXNiZHV4IgogCi0vKiB0aW1lb3V0IGZvciB0aGUgVVNCLXRyYW5zZmVyICovCi0jZGVmaW5lIEVaVElNRU9VVCAzMAorLyogdGltZW91dCBmb3IgdGhlIFVTQi10cmFuc2ZlciBpbiBtcyovCisjZGVmaW5lIEJVTEtfVElNRU9VVCAxMDAwCiAKIC8qIGNvbnN0YW50cyBmb3IgImZpcm13YXJlIiB1cGxvYWQgYW5kIGRvd25sb2FkICovCiAjZGVmaW5lIFVTQkRVWFNVQl9GSVJNV0FSRSAweEEwCkBAIC03NTAsNyArNzUxLDcgQEAKIAkJCQkgIC8qIExlbmd0aCAqLwogCQkJCSAgMSwKIAkJCQkgIC8qIFRpbWVvdXQgKi8KLQkJCQkgIEVaVElNRU9VVCk7CisJCQkJICBCVUxLX1RJTUVPVVQpOwogCWlmIChlcnJjb2RlIDwgMCkgewogCQlkZXZfZXJyKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAogCQkJImNvbWVkaV86IGNvbnRyb2wgbXNnIGZhaWxlZCAoc3RhcnQpXG4iKTsKQEAgLTc4MCw3ICs3ODEsNyBAQAogCQkJCSAgLyogTGVuZ3RoICovCiAJCQkJICAxLAogCQkJCSAgLyogVGltZW91dCAqLwotCQkJCSAgRVpUSU1FT1VUKTsKKwkJCQkgIEJVTEtfVElNRU9VVCk7CiAJaWYgKGVycmNvZGUgPCAwKSB7CiAJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCiAJCQkiY29tZWRpXzogY29udHJvbCBtc2cgZmFpbGVkIChzdG9wKVxuIik7CkBAIC04MTAsNyArODExLDcgQEAKIAkJCQkgIC8qIGxlbmd0aCAqLwogCQkJCSAgbGVuLAogCQkJCSAgLyogdGltZW91dCAqLwotCQkJCSAgRVpUSU1FT1VUKTsKKwkJCQkgIEJVTEtfVElNRU9VVCk7CiAJZGV2X2RiZygmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaV86IHJlc3VsdD0lZFxuIiwgZXJyY29kZSk7CiAJaWYgKGVycmNvZGUgPCAwKSB7CiAJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGlfOiB1cGxvYWQgZmFpbGVkXG4iKTsKQEAgLTk3OSw3ICs5ODAsNyBAQAogCiAJLyoKIAkgKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZQotCSAqIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlCisJICogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlCiAJICovCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19GT0xMT1cgJiYKIAkgICAgY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0VYVCAmJgpAQCAtMTExMCw3ICsxMTExLDcgQEAKIAkJCSAgICAgIHVzYl9zbmRidWxrcGlwZSh0aGlzX3VzYmR1eHN1Yi0+dXNiZGV2LAogCQkJCQkgICAgICBDT01NQU5EX09VVF9FUCksCiAJCQkgICAgICB0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzLCBTSVpFT0ZEVVhCVUZGRVIsCi0JCQkgICAgICAmbnNlbnQsIDEwKTsKKwkJCSAgICAgICZuc2VudCwgQlVMS19USU1FT1VUKTsKIAlpZiAocmVzdWx0IDwgMCkKIAkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpJWQ6ICIKIAkJCSJjb3VsZCBub3QgdHJhbnNtaXQgZHV4X2NvbW1hbmQgdG8gdGhlIHVzYi1kZXZpY2UsICIKQEAgLTExMzAsNyArMTEzMSw3IEBACiAJCQkJICAgICAgdXNiX3JjdmJ1bGtwaXBlKHRoaXNfdXNiZHV4c3ViLT51c2JkZXYsCiAJCQkJCQkgICAgICBDT01NQU5EX0lOX0VQKSwKIAkJCQkgICAgICB0aGlzX3VzYmR1eHN1Yi0+aW5zbkJ1ZmZlciwgU0laRUlOU05CVUYsCi0JCQkJICAgICAgJm5yZWMsIDEpOworCQkJCSAgICAgICZucmVjLCBCVUxLX1RJTUVPVVQpOwogCQlpZiAocmVzdWx0IDwgMCkgewogCQkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpJWQ6ICIKIAkJCQkiaW5zbjogVVNCIGVycm9yICVkIHdoaWxlIHJlY2VpdmluZyBEVVggY29tbWFuZCIKQEAgLTE1NTcsNyArMTU1OCw3IEBACiAKIAkvKgogCSAqIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlCi0JICogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUKKwkgKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUKIAkgKi8KIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0ZPTExPVyAmJgogCSAgICBjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUICYmCkBAIC0yMzI3LDkgKzIzMjgsMTEgQEAKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnVzYmRldi0+ZGV2LAogCQkJIkNvdWxkIG5vdCB1cGxvYWQgZmlybXdhcmUgKGVycj0lZClcbiIsIHJldCk7Ci0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAJfQogCWNvbWVkaV91c2JfYXV0b19jb25maWcodXNiZGV2LCBCT0FSRE5BTUUpOworIG91dDoKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIH0KIAogLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgdXJicyBhbmQgaW5pdGlhbGlzZSB0aGVtICovCkBAIC0yNTgwLDYgKzI1ODMsNyBAQAogCQkJCSAgICAgIEZXX0FDVElPTl9IT1RQTFVHLAogCQkJCSAgICAgICJ1c2JkdXhfZmlybXdhcmUuYmluIiwKIAkJCQkgICAgICAmdWRldi0+ZGV2LAorCQkJCSAgICAgIEdGUF9LRVJORUwsCiAJCQkJICAgICAgdXNiZHV4c3ViICsgaW5kZXgsCiAJCQkJICAgICAgdXNiZHV4X2Zpcm13YXJlX3JlcXVlc3RfY29tcGxldGVfaGFuZGxlcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhmYXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4ZmFzdC5jCmluZGV4IGQxNDMyMjIuLjJlNjc1Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhmYXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYwpAQCAtMTQ1MSwxMCArMTQ1MSwxMiBAQAogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmdXNiZGV2LT5kZXYsCiAJCQkiQ291bGQgbm90IHVwbG9hZCBmaXJtd2FyZSAoZXJyPSVkKVxuIiwgcmV0KTsKLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAl9CiAKIAljb21lZGlfdXNiX2F1dG9fY29uZmlnKHVzYmRldiwgQk9BUkROQU1FKTsKKyBvdXQ6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CiB9CiAKIC8qCkBAIC0xNTY5LDYgKzE1NzEsNyBAQAogCQkJCSAgICAgIEZXX0FDVElPTl9IT1RQTFVHLAogCQkJCSAgICAgICJ1c2JkdXhmYXN0X2Zpcm13YXJlLmJpbiIsCiAJCQkJICAgICAgJnVkZXYtPmRldiwKKwkJCQkgICAgICBHRlBfS0VSTkVMLAogCQkJCSAgICAgIHVzYmR1eGZhc3RzdWIgKyBpbmRleCwKIAkJCQkgICAgICB1c2JkdXhmYXN0X2Zpcm13YXJlX3JlcXVlc3RfY29tcGxldGVfaGFuZGxlcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy92bWs4MHh4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdm1rODB4eC5jCmluZGV4IGMzMzUwNDAuLmMzNGEwYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy92bWs4MHh4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3ZtazgweHguYwpAQCAtNzYsMTggKzc2LDE4IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdm1rODB4eF9pZF90YWJsZVtdID0gewotCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg1NTAwKSwuZHJpdmVyX2luZm8gPSBERVZJQ0VfVk1LODA1NX0sCi0Je1VTQl9ERVZJQ0UoMHgxMGNmLCAweDU1MDEpLC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDU1fSwKLQl7VVNCX0RFVklDRSgweDEwY2YsIDB4NTUwMiksLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNTV9LAotCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg1NTAzKSwuZHJpdmVyX2luZm8gPSBERVZJQ0VfVk1LODA1NX0sCi0Je1VTQl9ERVZJQ0UoMHgxMGNmLCAweDgwNjEpLC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDYxfSwKLQl7VVNCX0RFVklDRSgweDEwY2YsIDB4ODA2MiksLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAotCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDYzKSwuZHJpdmVyX2luZm8gPSBERVZJQ0VfVk1LODA2MX0sCi0Je1VTQl9ERVZJQ0UoMHgxMGNmLCAweDgwNjQpLC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDYxfSwKLQl7VVNCX0RFVklDRSgweDEwY2YsIDB4ODA2NSksLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAotCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDY2KSwuZHJpdmVyX2luZm8gPSBERVZJQ0VfVk1LODA2MX0sCi0Je1VTQl9ERVZJQ0UoMHgxMGNmLCAweDgwNjcpLC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDYxfSwKLQl7VVNCX0RFVklDRSgweDEwY2YsIDB4ODA2OCksLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg1NTAwKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNTV9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg1NTAxKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNTV9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg1NTAyKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNTV9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg1NTAzKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNTV9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDYxKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDYyKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDYzKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDY0KSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDY1KSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDY2KSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDY3KSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDY4KSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAogCXt9CQkJLyogdGVybWluYXRpbmcgZW50cnkgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1jb3JlLmMKaW5kZXggOGFjZWFlNS4uNjdmNjg5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1jb3JlLmMKQEAgLTE1MjEsNyArMTUyMSw3IEBACiAJLnJlc3VtZSA9IE5VTEwsCiB9OwogCi1zdGF0aWMgaW50IGN4MjU4MjFfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgY3gyNTgyMV9pbml0KHZvaWQpCiB7CiAJSU5JVF9MSVNUX0hFQUQoJmN4MjU4MjFfZGV2bGlzdCk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiY3gyNTgyMSBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZCBsb2FkZWRcbiIsCkBAIC0xNTMwLDcgKzE1MzAsNyBAQAogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjeDI1ODIxX3BjaV9kcml2ZXIpOwogfQogCi1zdGF0aWMgdm9pZCBjeDI1ODIxX2Zpbmkodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBjeDI1ODIxX2Zpbmkodm9pZCkKIHsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmN4MjU4MjFfcGNpX2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9LY29uZmlnCmluZGV4IDUyYmQxODcuLjRhZmEwODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9LY29uZmlnCkBAIC0xLDMgKzEsNyBAQAorY29uZmlnIERSRUFNCisgICAgICAgdHJpc3RhdGUgIkhUQyBEcmVhbSBzdXBwb3J0IgorICAgICAgIGRlcGVuZHMgb24gQlJPS0VOCisKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2RyZWFtL3NtZC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9kcmVhbS9jYW1lcmEvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3Yzg4MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9UT0RPCkBAIC0wLDAgKzEsMTQgQEAKKyogcmVtb3ZlIHN1cHBvcnQgZm9yIHdha2Vsb2NrcyBzaW5jZSB0aG9zZSBhcmUgbm90IGluIG1haW5saW5lCisKKyogY2FtZXJhIGRyaXZlciB1c2VzIG9sZCBWNEwgQVBJCisKKyogY29kaW5nIHN0eWxlIGluIHNvbWUgcGxhY2VzIGlzIGxhY2tpbmcKKworKiBncGlvX2lucHV0LmMgaGFzIHNvbWUgZmVhdHVyZXMgbWF0cml4X2tleXBhZCBsYWNrcy4gVGhleSBzaG91bGQgYmUKK21lcmdlZCB0byBncGlvX2lucHV0LCB3aXRoIGdwaW9faW5wdXQuYyByZW1vdmVkCisKKyogcG1lbSBwcm92aWRlcyBpbnRlcmZhY2UgZm9yIHVzZXJzcGFjZS4gTmVlZHMgdG8gYmUgcmV2aWV3ZWQgYXQgbGVhc3QuCisKKyogaXQgaXMgcHJvYmFibHkgcG9zc2libGUgdG8gc2ltcGxpZnkgdG91Y2hzY3JlZW4gZHJpdmVyIHVzaW5nIHRocmVhZGVkX2lycSdzLgorCisqIHRvdWNoc2NyZWVuIGRyaXZlciBzaG91bGQgYmUgc3dpdGNoZWQgdG8gb2ZpY2lhbCBtdWx0aXRvdWNoIEFQSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2NhbWVyYS9tc21fY2FtZXJhLmMgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vY2FtZXJhL21zbV9jYW1lcmEuYwppbmRleCA4ODE2NTk5Li43ZDkzODc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vY2FtZXJhL21zbV9jYW1lcmEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vY2FtZXJhL21zbV9jYW1lcmEuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CkBAIC0xNTk3LDcgKzE1OTgsNiBAQAogCQlNU01fRFJBSU5fUVVFVUUoc3luYywgcGljdF9mcmFtZV9xKTsKIAogCQlzeW5jLT5zY3RybC5zX3JlbGVhc2UoKTsKLQkJd2FrZV91bmxvY2soJnN5bmMtPndha2VfbG9jayk7CiAKIAkJc3luYy0+YXBwc19pZCA9IE5VTEw7CiAJCUNEQkcoIm1zbV9yZWxlYXNlIGNvbXBsZXRlZCFcbiIpOwpAQCAtMTgwNiw3ICsxODA2LDYgQEAKIAlzeW5jLT5hcHBzX2lkID0gYXBwc19pZDsKIAogCWlmICghc3luYy0+b3BlbmNudCkgewotCQl3YWtlX2xvY2soJnN5bmMtPndha2VfbG9jayk7CiAKIAkJbXNtX2NhbXZmZV9mbl9pbml0KCZzeW5jLT52ZmVmbiwgc3luYyk7CiAJCWlmIChzeW5jLT52ZmVmbi52ZmVfaW5pdCkgewpAQCAtMjA0NCw4ICsyMDQzLDYgQEAKIAlJTklUX0xJU1RfSEVBRCgmc3luYy0+cGljdF9mcmFtZV9xKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzeW5jLT5waWN0X2ZyYW1lX3dhaXQpOwogCi0Jd2FrZV9sb2NrX2luaXQoJnN5bmMtPndha2VfbG9jaywgV0FLRV9MT0NLX0lETEUsICJtc21fY2FtZXJhIik7Ci0KIAlyYyA9IG1zbV9jYW1pb19wcm9iZV9vbihwZGV2KTsKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CkBAIC0yMDU4LDcgKzIwNTUsNiBAQAogCWlmIChyYyA8IDApIHsKIAkJcHJfZXJyKCJtc21fY2FtZXJhOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSAlc1xuIiwKIAkJCXN5bmMtPnNkYXRhLT5zZW5zb3JfbmFtZSk7Ci0JCXdha2VfbG9ja19kZXN0cm95KCZzeW5jLT53YWtlX2xvY2spOwogCQlyZXR1cm4gcmM7CiAJfQogCkBAIC0yMDcwLDcgKzIwNjYsNiBAQAogCiBzdGF0aWMgaW50IG1zbV9zeW5jX2Rlc3Ryb3koc3RydWN0IG1zbV9zeW5jICpzeW5jKQogewotCXdha2VfbG9ja19kZXN0cm95KCZzeW5jLT53YWtlX2xvY2spOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vY2FtZXJhL21zbV92ZmU3eC5jIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2NhbWVyYS9tc21fdmZlN3guYwppbmRleCA1ZGU5NmM1Li4zM2FiM2FjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vY2FtZXJhL21zbV92ZmU3eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9jYW1lcmEvbXNtX3ZmZTd4LmMKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbXNtX2Fkc3AuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2FuZHJvaWRfcG1lbS5oPgogI2luY2x1ZGUgPG1hY2gvbXNtX2Fkc3AuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2dlbmVyaWNfZ3Bpby5jIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2dlbmVyaWNfZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMjRkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vZ2VuZXJpY19ncGlvLmMKQEAgLTAsMCArMSwyNzQgQEAKKy8qIGFyY2gvYXJtL21hY2gtbXNtL2dlbmVyaWNfZ3Bpby5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CisjaW5jbHVkZSAiZ3Bpb19jaGlwLmgiCisKKyNkZWZpbmUgR1BJT19OVU1fVE9fQ0hJUF9JTkRFWChncGlvKSAoKGdwaW8pPj41KQorCitzdHJ1Y3QgZ3Bpb19zdGF0ZSB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVmY291bnQ7Cit9OworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGdwaW9fY2hpcHNfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKGdwaW9fY2hpcF9saXN0KTsKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwICoqZ3Bpb19jaGlwX2FycmF5Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ3Bpb19jaGlwX2FycmF5X3NpemU7CisKK2ludCByZWdpc3Rlcl9ncGlvX2NoaXAoc3RydWN0IGdwaW9fY2hpcCAqbmV3X2dwaW9fY2hpcCkKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvX2NoaXA7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJdW5zaWduZWQgaW50IGNoaXBfYXJyYXlfc3RhcnRfaW5kZXgsIGNoaXBfYXJyYXlfZW5kX2luZGV4OworCisJbmV3X2dwaW9fY2hpcC0+c3RhdGUgPSBremFsbG9jKChuZXdfZ3Bpb19jaGlwLT5lbmQgKyAxIC0gbmV3X2dwaW9fY2hpcC0+c3RhcnQpICogc2l6ZW9mKG5ld19ncGlvX2NoaXAtPnN0YXRlWzBdKSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5ld19ncGlvX2NoaXAtPnN0YXRlID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyZWdpc3Rlcl9ncGlvX2NoaXA6IGZhaWxlZCB0byBhbGxvY2F0ZSBzdGF0ZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7CisJY2hpcF9hcnJheV9zdGFydF9pbmRleCA9IEdQSU9fTlVNX1RPX0NISVBfSU5ERVgobmV3X2dwaW9fY2hpcC0+c3RhcnQpOworCWNoaXBfYXJyYXlfZW5kX2luZGV4ID0gR1BJT19OVU1fVE9fQ0hJUF9JTkRFWChuZXdfZ3Bpb19jaGlwLT5lbmQpOworCWlmIChjaGlwX2FycmF5X2VuZF9pbmRleCA+PSBncGlvX2NoaXBfYXJyYXlfc2l6ZSkgeworCQlzdHJ1Y3QgZ3Bpb19jaGlwICoqbmV3X2dwaW9fY2hpcF9hcnJheTsKKwkJdW5zaWduZWQgbG9uZyBuZXdfZ3Bpb19jaGlwX2FycmF5X3NpemUgPSBjaGlwX2FycmF5X2VuZF9pbmRleCArIDE7CisKKwkJbmV3X2dwaW9fY2hpcF9hcnJheSA9IGttYWxsb2MobmV3X2dwaW9fY2hpcF9hcnJheV9zaXplICogc2l6ZW9mKG5ld19ncGlvX2NoaXBfYXJyYXlbMF0pLCBHRlBfQVRPTUlDKTsKKwkJaWYgKG5ld19ncGlvX2NoaXBfYXJyYXkgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJyZWdpc3Rlcl9ncGlvX2NoaXA6IGZhaWxlZCB0byBhbGxvY2F0ZSBhcnJheVxuIik7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBmYWlsZWQ7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGdwaW9fY2hpcF9hcnJheV9zaXplOyBpKyspCisJCQluZXdfZ3Bpb19jaGlwX2FycmF5W2ldID0gZ3Bpb19jaGlwX2FycmF5W2ldOworCQlmb3IgKGkgPSBncGlvX2NoaXBfYXJyYXlfc2l6ZTsgaSA8IG5ld19ncGlvX2NoaXBfYXJyYXlfc2l6ZTsgaSsrKQorCQkJbmV3X2dwaW9fY2hpcF9hcnJheVtpXSA9IE5VTEw7CisJCWdwaW9fY2hpcF9hcnJheSA9IG5ld19ncGlvX2NoaXBfYXJyYXk7CisJCWdwaW9fY2hpcF9hcnJheV9zaXplID0gbmV3X2dwaW9fY2hpcF9hcnJheV9zaXplOworCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGdwaW9fY2hpcCwgJmdwaW9fY2hpcF9saXN0LCBsaXN0KSB7CisJCWlmIChncGlvX2NoaXAtPnN0YXJ0ID4gbmV3X2dwaW9fY2hpcC0+ZW5kKSB7CisJCQlsaXN0X2FkZF90YWlsKCZuZXdfZ3Bpb19jaGlwLT5saXN0LCAmZ3Bpb19jaGlwLT5saXN0KTsKKwkJCWdvdG8gYWRkZWQ7CisJCX0KKwkJaWYgKGdwaW9fY2hpcC0+ZW5kID49IG5ld19ncGlvX2NoaXAtPnN0YXJ0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgInJlZ2lzdGVyX2dwaW9fc291cmNlICV1LSV1IG92ZXJsYXBzIHdpdGggJXUtJXVcbiIsCisJCQkgICAgICAgbmV3X2dwaW9fY2hpcC0+c3RhcnQsIG5ld19ncGlvX2NoaXAtPmVuZCwKKwkJCSAgICAgICBncGlvX2NoaXAtPnN0YXJ0LCBncGlvX2NoaXAtPmVuZCk7CisJCQllcnIgPSAtRUJVU1k7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCX0KKwlsaXN0X2FkZF90YWlsKCZuZXdfZ3Bpb19jaGlwLT5saXN0LCAmZ3Bpb19jaGlwX2xpc3QpOworYWRkZWQ6CisJZm9yIChpID0gY2hpcF9hcnJheV9zdGFydF9pbmRleDsgaSA8PSBjaGlwX2FycmF5X2VuZF9pbmRleDsgaSsrKSB7CisJCWlmIChncGlvX2NoaXBfYXJyYXlbaV0gPT0gTlVMTCB8fCBncGlvX2NoaXBfYXJyYXlbaV0tPnN0YXJ0ID4gbmV3X2dwaW9fY2hpcC0+c3RhcnQpCisJCQlncGlvX2NoaXBfYXJyYXlbaV0gPSBuZXdfZ3Bpb19jaGlwOworCX0KK2ZhaWxlZDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7CisJaWYgKGVycikKKwkJa2ZyZWUobmV3X2dwaW9fY2hpcC0+c3RhdGUpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwICpnZXRfZ3Bpb19jaGlwX2xvY2tlZCh1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcDsKKworCWkgPSBHUElPX05VTV9UT19DSElQX0lOREVYKGdwaW8pOworCWlmIChpID49IGdwaW9fY2hpcF9hcnJheV9zaXplKQorCQlyZXR1cm4gTlVMTDsKKwljaGlwID0gZ3Bpb19jaGlwX2FycmF5W2ldOworCWlmIChjaGlwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWxpc3RfZm9yX2VhY2hfZW50cnlfZnJvbShjaGlwLCAmZ3Bpb19jaGlwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGdwaW8gPCBjaGlwLT5zdGFydCkKKwkJCXJldHVybiBOVUxMOworCQlpZiAoZ3BpbyA8PSBjaGlwLT5lbmQpCisJCQlyZXR1cm4gY2hpcDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9ncGlvKHVuc2lnbmVkIGludCBncGlvLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXA7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBjaGlwX2luZGV4OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fY2hpcHNfbG9jaywgaXJxX2ZsYWdzKTsKKwljaGlwID0gZ2V0X2dwaW9fY2hpcF9sb2NrZWQoZ3Bpbyk7CisJaWYgKGNoaXAgPT0gTlVMTCkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisJY2hpcF9pbmRleCA9IGdwaW8gLSBjaGlwLT5zdGFydDsKKwlpZiAoY2hpcC0+c3RhdGVbY2hpcF9pbmRleF0ucmVmY291bnQgPT0gMCkgeworCQljaGlwLT5jb25maWd1cmUoY2hpcCwgZ3BpbywgZmxhZ3MpOworCQljaGlwLT5zdGF0ZVtjaGlwX2luZGV4XS5mbGFncyA9IGZsYWdzOworCQljaGlwLT5zdGF0ZVtjaGlwX2luZGV4XS5yZWZjb3VudCsrOworCX0gZWxzZSBpZiAoKGZsYWdzICYgSVJRRl9TSEFSRUQpICYmIChjaGlwLT5zdGF0ZVtjaGlwX2luZGV4XS5mbGFncyAmIElSUUZfU0hBUkVEKSkKKwkJY2hpcC0+c3RhdGVbY2hpcF9pbmRleF0ucmVmY291bnQrKzsKKwllbHNlCisJCWVyciA9IC1FQlVTWTsKK2VycjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7CisJcmV0dXJuIGVycjsKK30KKworaW50IGdwaW9fcmVxdWVzdCh1bnNpZ25lZCBncGlvLCBjb25zdCBjaGFyICpsYWJlbCkKK3sKKwlyZXR1cm4gcmVxdWVzdF9ncGlvKGdwaW8sIDApOworfQorRVhQT1JUX1NZTUJPTChncGlvX3JlcXVlc3QpOworCit2b2lkIGdwaW9fZnJlZSh1bnNpZ25lZCBncGlvKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXA7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBjaGlwX2luZGV4OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fY2hpcHNfbG9jaywgaXJxX2ZsYWdzKTsKKwljaGlwID0gZ2V0X2dwaW9fY2hpcF9sb2NrZWQoZ3Bpbyk7CisJaWYgKGNoaXApIHsKKwkJY2hpcF9pbmRleCA9IGdwaW8gLSBjaGlwLT5zdGFydDsKKwkJY2hpcC0+c3RhdGVbY2hpcF9pbmRleF0ucmVmY291bnQtLTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19jaGlwc19sb2NrLCBpcnFfZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChncGlvX2ZyZWUpOworCitzdGF0aWMgaW50IGdwaW9fZ2V0X2lycV9udW0odW5zaWduZWQgaW50IGdwaW8sIHVuc2lnbmVkIGludCAqaXJxcCwgdW5zaWduZWQgbG9uZyAqaXJxbnVtZmxhZ3NwKQoreworCWludCByZXQgPSAtRU5PVFNVUFA7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7CisJY2hpcCA9IGdldF9ncGlvX2NoaXBfbG9ja2VkKGdwaW8pOworCWlmIChjaGlwICYmIGNoaXAtPmdldF9pcnFfbnVtKQorCQlyZXQgPSBjaGlwLT5nZXRfaXJxX251bShjaGlwLCBncGlvLCBpcnFwLCBpcnFudW1mbGFnc3ApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fY2hpcHNfbG9jaywgaXJxX2ZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZ3Bpb190b19pcnEodW5zaWduZWQgZ3BpbykKK3sKKwlpbnQgcmV0LCBpcnE7CisJcmV0ID0gZ3Bpb19nZXRfaXJxX251bShncGlvLCAmaXJxLCBOVUxMKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBpcnE7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fdG9faXJxKTsKKworaW50IGdwaW9fY29uZmlndXJlKHVuc2lnbmVkIGludCBncGlvLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWludCByZXQgPSAtRU5PVFNVUFA7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7CisJY2hpcCA9IGdldF9ncGlvX2NoaXBfbG9ja2VkKGdwaW8pOworCWlmIChjaGlwKQorCQlyZXQgPSBjaGlwLT5jb25maWd1cmUoY2hpcCwgZ3BpbywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fY2hpcHNfbG9jaywgaXJxX2ZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChncGlvX2NvbmZpZ3VyZSk7CisKK2ludCBncGlvX2RpcmVjdGlvbl9pbnB1dCh1bnNpZ25lZCBncGlvKQoreworCXJldHVybiBncGlvX2NvbmZpZ3VyZShncGlvLCBHUElPRl9JTlBVVCk7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fZGlyZWN0aW9uX2lucHV0KTsKKworaW50IGdwaW9fZGlyZWN0aW9uX291dHB1dCh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCit7CisJZ3Bpb19zZXRfdmFsdWUoZ3BpbywgdmFsdWUpOworCXJldHVybiBncGlvX2NvbmZpZ3VyZShncGlvLCBHUElPRl9EUklWRV9PVVRQVVQpOworfQorRVhQT1JUX1NZTUJPTChncGlvX2RpcmVjdGlvbl9vdXRwdXQpOworCitpbnQgZ3Bpb19nZXRfdmFsdWUodW5zaWduZWQgZ3BpbykKK3sKKwlpbnQgcmV0ID0gLUVOT1RTVVBQOworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXA7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19jaGlwc19sb2NrLCBpcnFfZmxhZ3MpOworCWNoaXAgPSBnZXRfZ3Bpb19jaGlwX2xvY2tlZChncGlvKTsKKwlpZiAoY2hpcCAmJiBjaGlwLT5yZWFkKQorCQlyZXQgPSBjaGlwLT5yZWFkKGNoaXAsIGdwaW8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fY2hpcHNfbG9jaywgaXJxX2ZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChncGlvX2dldF92YWx1ZSk7CisKK3ZvaWQgZ3Bpb19zZXRfdmFsdWUodW5zaWduZWQgZ3BpbywgaW50IG9uKQoreworCWludCByZXQgPSAtRU5PVFNVUFA7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7CisJY2hpcCA9IGdldF9ncGlvX2NoaXBfbG9ja2VkKGdwaW8pOworCWlmIChjaGlwICYmIGNoaXAtPndyaXRlKQorCQlyZXQgPSBjaGlwLT53cml0ZShjaGlwLCBncGlvLCBvbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19jaGlwc19sb2NrLCBpcnFfZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChncGlvX3NldF92YWx1ZSk7CisKK2ludCBncGlvX3JlYWRfZGV0ZWN0X3N0YXR1cyh1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlpbnQgcmV0ID0gLUVOT1RTVVBQOworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXA7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19jaGlwc19sb2NrLCBpcnFfZmxhZ3MpOworCWNoaXAgPSBnZXRfZ3Bpb19jaGlwX2xvY2tlZChncGlvKTsKKwlpZiAoY2hpcCAmJiBjaGlwLT5yZWFkX2RldGVjdF9zdGF0dXMpCisJCXJldCA9IGNoaXAtPnJlYWRfZGV0ZWN0X3N0YXR1cyhjaGlwLCBncGlvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZ3Bpb19yZWFkX2RldGVjdF9zdGF0dXMpOworCitpbnQgZ3Bpb19jbGVhcl9kZXRlY3Rfc3RhdHVzKHVuc2lnbmVkIGludCBncGlvKQoreworCWludCByZXQgPSAtRU5PVFNVUFA7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7CisJY2hpcCA9IGdldF9ncGlvX2NoaXBfbG9ja2VkKGdwaW8pOworCWlmIChjaGlwICYmIGNoaXAtPmNsZWFyX2RldGVjdF9zdGF0dXMpCisJCXJldCA9IGNoaXAtPmNsZWFyX2RldGVjdF9zdGF0dXMoY2hpcCwgZ3Bpbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19jaGlwc19sb2NrLCBpcnFfZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fY2xlYXJfZGV0ZWN0X3N0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vZ3Bpb19ldmVudC5jIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2dwaW9fZXZlbnQuYwppbmRleCA4YjY0YzFlLi5lNjBlMmMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vZ3Bpb19ldmVudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9ncGlvX2V2ZW50LmMKQEAgLTEzLDcgKzEzLDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2Vhcmx5c3VzcGVuZC5oPgorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvX2V2ZW50Lmg+CkBAIC0yMyw3ICsyMyw2IEBACiBzdHJ1Y3QgZ3Bpb19ldmVudCB7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwogCWNvbnN0IHN0cnVjdCBncGlvX2V2ZW50X3BsYXRmb3JtX2RhdGEgKmluZm87Ci0Jc3RydWN0IGVhcmx5X3N1c3BlbmQgZWFybHlfc3VzcGVuZDsKIAl2b2lkICpzdGF0ZVswXTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9ncGlvX2lucHV0LmMgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vZ3Bpb19pbnB1dC5jCmluZGV4IDdlMzA3ZjIuLjA2MzhlYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9ncGlvX2lucHV0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2dwaW9faW5wdXQuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3dha2Vsb2NrLmg+CiAKIGVudW0gewogCURFQk9VTkNFX1VOU1RBQkxFICAgICA9IEJJVCgwKSwJLyogR290IGlycSwgd2hpbGUgZGVib3VuY2luZyAqLwpAQCAtNDQsNyArNDMsNiBAQAogCWludCB1c2VfaXJxOwogCWludCBkZWJvdW5jZV9jb3VudDsKIAlzcGlubG9ja190IGlycV9sb2NrOwotCXN0cnVjdCB3YWtlX2xvY2sgd2FrZV9sb2NrOwogCXN0cnVjdCBncGlvX2tleV9zdGF0ZSBrZXlfc3RhdGVbMF07CiB9OwogCkBAIC0xNDMsOCArMTQxLDYgQEAKIAkJaHJ0aW1lcl9zdGFydCh0aW1lciwgZHMtPmluZm8tPmRlYm91bmNlX3RpbWUsIEhSVElNRVJfTU9ERV9SRUwpOwogCWVsc2UgaWYgKCFkcy0+dXNlX2lycSkKIAkJaHJ0aW1lcl9zdGFydCh0aW1lciwgZHMtPmluZm8tPnBvbGxfdGltZSwgSFJUSU1FUl9NT0RFX1JFTCk7Ci0JZWxzZQotCQl3YWtlX3VubG9jaygmZHMtPndha2VfbG9jayk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcy0+aXJxX2xvY2ssIGlycWZsYWdzKTsKIApAQCAtMTcwLDcgKzE2Niw2IEBACiAJCWlmIChrcy0+ZGVib3VuY2UgJiBERUJPVU5DRV9XQUlUX0lSUSkgewogCQkJa3MtPmRlYm91bmNlID0gREVCT1VOQ0VfVU5LTk9XTjsKIAkJCWlmIChkcy0+ZGVib3VuY2VfY291bnQrKyA9PSAwKSB7Ci0JCQkJd2FrZV9sb2NrKCZkcy0+d2FrZV9sb2NrKTsKIAkJCQlocnRpbWVyX3N0YXJ0KAogCQkJCQkmZHMtPnRpbWVyLCBkcy0+aW5mby0+ZGVib3VuY2VfdGltZSwKIAkJCQkJSFJUSU1FUl9NT0RFX1JFTCk7CkBAIC0yNzcsNyArMjcyLDYgQEAKIAkJZHMtPmRlYm91bmNlX2NvdW50ID0gZGktPmtleW1hcF9zaXplOwogCQlkcy0+aW5wdXRfZGV2ID0gaW5wdXRfZGV2OwogCQlkcy0+aW5mbyA9IGRpOwotCQl3YWtlX2xvY2tfaW5pdCgmZHMtPndha2VfbG9jaywgV0FLRV9MT0NLX1NVU1BFTkQsICJncGlvX2lucHV0Iik7CiAJCXNwaW5fbG9ja19pbml0KCZkcy0+aXJxX2xvY2spOwogCiAJCWZvciAoaSA9IDA7IGkgPCBkaS0+a2V5bWFwX3NpemU7IGkrKykgewpAQCAtMzM2LDcgKzMzMCw2IEBACiBlcnJfZ3Bpb19yZXF1ZXN0X2ZhaWxlZDoKIAkJOwogCX0KLQl3YWtlX2xvY2tfZGVzdHJveSgmZHMtPndha2VfbG9jayk7CiAJa2ZyZWUoZHMpOwogZXJyX2RzX2FsbG9jX2ZhaWxlZDoKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2dwaW9fbWF0cml4LmMgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vZ3Bpb19tYXRyaXguYwppbmRleCBjMWY0NzY1Li43OTZkZTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vZ3Bpb19tYXRyaXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vZ3Bpb19tYXRyaXguYwpAQCAtMTgsMTMgKzE4LDExIEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpb19ldmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWtlbG9jay5oPgogCiBzdHJ1Y3QgZ3Bpb19rcCB7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwogCXN0cnVjdCBncGlvX2V2ZW50X21hdHJpeF9pbmZvICprZXlwYWRfaW5mbzsKIAlzdHJ1Y3QgaHJ0aW1lciB0aW1lcjsKLQlzdHJ1Y3Qgd2FrZV9sb2NrIHdha2VfbG9jazsKIAlpbnQgY3VycmVudF9vdXRwdXQ7CiAJdW5zaWduZWQgaW50IHVzZV9pcnE6MTsKIAl1bnNpZ25lZCBpbnQga2V5X3N0YXRlX2NoYW5nZWQ6MTsKQEAgLTE5OSw3ICsxOTcsNiBAQAogCX0KIAlmb3IgKGluID0gMDsgaW4gPCBtaS0+bmlucHV0czsgaW4rKykKIAkJZW5hYmxlX2lycShncGlvX3RvX2lycShtaS0+aW5wdXRfZ3Bpb3NbaW5dKSk7Ci0Jd2FrZV91bmxvY2soJmtwLT53YWtlX2xvY2spOwogCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKIH0KIApAQCAtMjIyLDcgKzIxOSw2IEBACiAJCWVsc2UKIAkJCWdwaW9fZGlyZWN0aW9uX2lucHV0KG1pLT5vdXRwdXRfZ3Bpb3NbaV0pOwogCX0KLQl3YWtlX2xvY2soJmtwLT53YWtlX2xvY2spOwogCWhydGltZXJfc3RhcnQoJmtwLT50aW1lciwga3RpbWVfc2V0KDAsIDApLCBIUlRJTUVSX01PREVfUkVMKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0zNjMsNyArMzU5LDYgQEAKIAogCQlocnRpbWVyX2luaXQoJmtwLT50aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKIAkJa3AtPnRpbWVyLmZ1bmN0aW9uID0gZ3Bpb19rZXlwYWRfdGltZXJfZnVuYzsKLQkJd2FrZV9sb2NrX2luaXQoJmtwLT53YWtlX2xvY2ssIFdBS0VfTE9DS19TVVNQRU5ELCAiZ3Bpb19rcCIpOwogCQllcnIgPSBncGlvX2tleXBhZF9yZXF1ZXN0X2lycXMoa3ApOwogCQlrcC0+dXNlX2lycSA9IGVyciA9PSAwOwogCkBAIC0zNzEsOCArMzY2LDYgQEAKIAkJCSJpbiAlcyBtb2RlXG4iLCBpbnB1dF9kZXYtPm5hbWUsCiAJCQlrcC0+dXNlX2lycSA/ICJpbnRlcnJ1cHQiIDogInBvbGxpbmciKTsKIAotCQlpZiAoa3AtPnVzZV9pcnEpCi0JCQl3YWtlX2xvY2soJmtwLT53YWtlX2xvY2spOwogCQlocnRpbWVyX3N0YXJ0KCZrcC0+dGltZXIsIGt0aW1lX3NldCgwLCAwKSwgSFJUSU1FUl9NT0RFX1JFTCk7CiAKIAkJcmV0dXJuIDA7CkBAIC0zODYsNyArMzc5LDYgQEAKIAkJCWZyZWVfaXJxKGdwaW9fdG9faXJxKG1pLT5pbnB1dF9ncGlvc1tpXSksIGtwKTsKIAogCWhydGltZXJfY2FuY2VsKCZrcC0+dGltZXIpOwotCXdha2VfbG9ja19kZXN0cm95KCZrcC0+d2FrZV9sb2NrKTsKIAlmb3IgKGkgPSBtaS0+bm91dHB1dHMgLSAxOyBpID49IDA7IGktLSkgewogZXJyX2dwaW9fZGlyZWN0aW9uX2lucHV0X2ZhaWxlZDoKIAkJZ3Bpb19mcmVlKG1pLT5pbnB1dF9ncGlvc1tpXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vcG1lbS5jIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3BtZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWY2NDY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3BtZW0uYwpAQCAtMCwwICsxLDEzMzUgQEAKKy8qIGRyaXZlcnMvYW5kcm9pZC9wbWVtLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYW5kcm9pZF9wbWVtLmg+CisjaW5jbHVkZSA8bGludXgvbWVtcG9saWN5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisKKyNkZWZpbmUgUE1FTV9NQVhfREVWSUNFUyAxMAorI2RlZmluZSBQTUVNX01BWF9PUkRFUiAxMjgKKyNkZWZpbmUgUE1FTV9NSU5fQUxMT0MgUEFHRV9TSVpFCisKKyNkZWZpbmUgUE1FTV9ERUJVRyAxCisKKy8qIGluZGljYXRlcyB0aGF0IGEgcmVmZXJuY2UgdG8gdGhpcyBmaWxlIGhhcyBiZWVuIHRha2VuIHZpYSBnZXRfcG1lbV9maWxlLAorICogdGhlIGZpbGUgc2hvdWxkIG5vdCBiZSByZWxlYXNlZCB1bnRpbCBwdXRfcG1lbV9maWxlIGlzIGNhbGxlZCAqLworI2RlZmluZSBQTUVNX0ZMQUdTX0JVU1kgMHgxCisvKiBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIGEgc3ViYWxsb2NhdGlvbiBvZiBhIGxhcmdlciBtYXN0ZXIgcmFuZ2UgKi8KKyNkZWZpbmUgUE1FTV9GTEFHU19DT05ORUNURUQgMHgxIDw8IDEKKy8qIGluZGljYXRlcyB0aGlzIGlzIGEgbWFzdGVyIGFuZCBub3QgYSBzdWIgYWxsb2NhdGlvbiBhbmQgdGhhdCBpdCBpcyBtbWFwZWQgKi8KKyNkZWZpbmUgUE1FTV9GTEFHU19NQVNURVJNQVAgMHgxIDw8IDIKKy8qIHN1Ym1hcCBhbmQgdW5zdWJtYXAgZmxhZ3MgaW5kaWNhdGU6CisgKiAwMDogc3VicmVnaW9uIGhhcyBuZXZlciBiZWVuIG1tYXBlZAorICogMTA6IHN1YnJlZ2lvbiBoYXMgYmVlbiBtbWFwZWQsIHJlZmVyZW5jZSB0byB0aGUgbW0gd2FzIHRha2VuCisgKiAxMTogc3VicmV0aW9uIGhhcyBiZW4gcmVsZWFzZWQsIHJlZmVybmVjZSB0byB0aGUgbW0gc3RpbGwgaGVsZAorICogMDE6IHN1YnJldGlvbiBoYXMgYmVlbiByZWxlYXNlZCwgcmVmZXJlbmNlIHRvIHRoZSBtbSBoYXMgYmVlbiByZWxlYXNlZAorICovCisjZGVmaW5lIFBNRU1fRkxBR1NfU1VCTUFQIDB4MSA8PCAzCisjZGVmaW5lIFBNRU1fRkxBR1NfVU5TVUJNQVAgMHgxIDw8IDQKKworCitzdHJ1Y3QgcG1lbV9kYXRhIHsKKwkvKiBpbiBhbGxvYyBtb2RlOiBhbiBpbmRleCBpbnRvIHRoZSBiaXRtYXAKKwkgKiBpbiBub19hbGxvYyBtb2RlOiB0aGUgc2l6ZSBvZiB0aGUgYWxsb2NhdGlvbiAqLworCWludCBpbmRleDsKKwkvKiBzZWUgZmxhZ3MgYWJvdmUgZm9yIGRlc2NyaXB0aW9ucyAqLworCXVuc2lnbmVkIGludCBmbGFnczsKKwkvKiBwcm90ZWN0cyB0aGlzIGRhdGEgZmllbGQsIGlmIHRoZSBtbV9tbWFwIHNlbSB3aWxsIGJlIGhlbGQgYXQgdGhlCisJICogc2FtZSB0aW1lIGFzIHRoaXMgc2VtLCB0aGUgbW0gc2VtIG11c3QgYmUgdGFrZW4gZmlyc3QgKGFzIHRoaXMgaXMKKwkgKiB0aGUgb3JkZXIgZm9yIHZtYV9vcGVuIGFuZCB2bWFfY2xvc2Ugb3BzICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZSBzZW07CisJLyogaW5mbyBhYm91dCB0aGUgbW1hcGluZyBwcm9jZXNzICovCisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJLyogdGFzayBzdHJ1Y3Qgb2YgdGhlIG1hcHBpbmcgcHJvY2VzcyAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwkvKiBwcm9jZXNzIGlkIG9mIHRlaCBtYXBwaW5nIHByb2Nlc3MgKi8KKwlwaWRfdCBwaWQ7CisJLyogZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBtYXN0ZXIgKi8KKwlpbnQgbWFzdGVyX2ZkOworCS8qIGZpbGUgc3RydWN0IG9mIHRoZSBtYXN0ZXIgKi8KKwlzdHJ1Y3QgZmlsZSAqbWFzdGVyX2ZpbGU7CisJLyogYSBsaXN0IG9mIGN1cnJlbnRseSBhdmFpbGFibGUgcmVnaW9ucyBpZiB0aGlzIGlzIGEgc3ViYWxsb2NhdGlvbiAqLworCXN0cnVjdCBsaXN0X2hlYWQgcmVnaW9uX2xpc3Q7CisJLyogYSBsaW5rZWQgbGlzdCBvZiBkYXRhIHNvIHdlIGNhbiBhY2Nlc3MgdGhlbSBmb3IgZGVidWdnaW5nICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworI2lmIFBNRU1fREVCVUcKKwlpbnQgcmVmOworI2VuZGlmCit9OworCitzdHJ1Y3QgcG1lbV9iaXRzIHsKKwl1bnNpZ25lZCBhbGxvY2F0ZWQ6MTsJCS8qIDEgaWYgYWxsb2NhdGVkLCAwIGlmIGZyZWUgKi8KKwl1bnNpZ25lZCBvcmRlcjo3OwkJLyogc2l6ZSBvZiB0aGUgcmVnaW9uIGluIHBtZW0gc3BhY2UgKi8KK307CisKK3N0cnVjdCBwbWVtX3JlZ2lvbl9ub2RlIHsKKwlzdHJ1Y3QgcG1lbV9yZWdpb24gcmVnaW9uOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKyNkZWZpbmUgUE1FTV9ERUJVR19NU0dTIDAKKyNpZiBQTUVNX0RFQlVHX01TR1MKKyNkZWZpbmUgRExPRyhmbXQsYXJncy4uLikgXAorCWRvIHsgcHJpbnRrKEtFUk5fSU5GTyAiWyVzOiVzOiVkXSAiZm10LCBfX0ZJTEVfXywgX19mdW5jX18sIF9fTElORV9fLCBcCisJCSAgICAjI2FyZ3MpOyB9IFwKKwl3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIERMT0coeC4uLikgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworc3RydWN0IHBtZW1faW5mbyB7CisJc3RydWN0IG1pc2NkZXZpY2UgZGV2OworCS8qIHBoeXNpY2FsIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHJlbWFwZWQgcG1lbSBzcGFjZSAqLworCXVuc2lnbmVkIGxvbmcgYmFzZTsKKwkvKiB2aXR1YWwgc3RhcnQgYWRkcmVzcyBvZiB0aGUgcmVtYXBlZCBwbWVtIHNwYWNlICovCisJdW5zaWduZWQgY2hhciBfX2lvbWVtICp2YmFzZTsKKwkvKiB0b3RhbCBzaXplIG9mIHRoZSBwbWVtIHNwYWNlICovCisJdW5zaWduZWQgbG9uZyBzaXplOworCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBwbWVtIHNwYWNlICovCisJdW5zaWduZWQgbG9uZyBudW1fZW50cmllczsKKwkvKiBwZm4gb2YgdGhlIGdhcmJhZ2UgcGFnZSBpbiBtZW1vcnkgKi8KKwl1bnNpZ25lZCBsb25nIGdhcmJhZ2VfcGZuOworCS8qIGluZGV4IG9mIHRoZSBnYXJiYWdlIHBhZ2UgaW4gdGhlIHBtZW0gc3BhY2UgKi8KKwlpbnQgZ2FyYmFnZV9pbmRleDsKKwkvKiB0aGUgYml0bWFwIGZvciB0aGUgcmVnaW9uIGluZGljYXRpbmcgd2hpY2ggZW50cmllcyBhcmUgYWxsb2NhdGVkCisJICogYW5kIHdoaWNoIGFyZSBmcmVlICovCisJc3RydWN0IHBtZW1fYml0cyAqYml0bWFwOworCS8qIGluZGljYXRlcyB0aGUgcmVnaW9uIHNob3VsZCBub3QgYmUgbWFuYWdlZCB3aXRoIGFuIGFsbG9jYXRvciAqLworCXVuc2lnbmVkIG5vX2FsbG9jYXRvcjsKKwkvKiBpbmRpY2F0ZXMgbWFwcyBvZiB0aGlzIHJlZ2lvbiBzaG91bGQgYmUgY2FjaGVkLCBpZiBhIG1peCBvZgorCSAqIGNhY2hlZCBhbmQgdW5jYWNoZWQgaXMgZGVzaXJlZCwgc2V0IHRoaXMgYW5kIG9wZW4gdGhlIGRldmljZSB3aXRoCisJICogT19TWU5DIHRvIGdldCBhbiB1bmNhY2hlZCByZWdpb24gKi8KKwl1bnNpZ25lZCBjYWNoZWQ7CisJdW5zaWduZWQgYnVmZmVyZWQ7CisJLyogaW4gbm9fYWxsb2NhdG9yIG1vZGUgdGhlIGZpcnN0IG1hcHBlciBnZXRzIHRoZSB3aG9sZSBzcGFjZSBhbmQgc2V0cworCSAqIHRoaXMgZmxhZyAqLworCXVuc2lnbmVkIGFsbG9jYXRlZDsKKwkvKiBmb3IgZGVidWdnaW5nLCBjcmVhdGVzIGEgbGlzdCBvZiBwbWVtIGZpbGUgc3RydWN0cywgdGhlCisJICogZGF0YV9saXN0X3NlbSBzaG91bGQgYmUgdGFrZW4gYmVmb3JlIHBtZW1fZGF0YS0+c2VtIGlmIGJvdGggYXJlCisJICogbmVlZGVkICovCisJc3RydWN0IHNlbWFwaG9yZSBkYXRhX2xpc3Rfc2VtOworCXN0cnVjdCBsaXN0X2hlYWQgZGF0YV9saXN0OworCS8qIHBtZW1fc2VtIHByb3RlY3RzIHRoZSBiaXRtYXAgYXJyYXkKKwkgKiBhIHdyaXRlIGxvY2sgc2hvdWxkIGJlIGhlbGQgd2hlbiBtb2RpZnlpbmcgZW50cmllcyBpbiBiaXRtYXAKKwkgKiBhIHJlYWQgbG9jayBzaG91bGQgYmUgaGVsZCB3aGVuIHJlYWRpbmcgZGF0YSBmcm9tIGJpdHMgb3IKKwkgKiBkZXJlZmVyZW5jaW5nIGEgcG9pbnRlciBpbnRvIGJpdG1hcAorCSAqCisJICogcG1lbV9kYXRhLT5zZW0gcHJvdGVjdHMgdGhlIHBtZW0gZGF0YSBvZiBhIHBhcnRpY3VsYXIgZmlsZQorCSAqIE1hbnkgb2YgdGhlIGZ1bmN0aW9uIHRoYXQgcmVxdWlyZSB0aGUgcG1lbV9kYXRhLT5zZW0gaGF2ZSBhIG5vbi0KKwkgKiBsb2NraW5nIHZlcnNpb24gZm9yIHdoZW4gdGhlIGNhbGxlciBpcyBhbHJlYWR5IGhvbGRpbmcgdGhhdCBzZW0uCisJICoKKwkgKiBJRiBZT1UgVEFLRSBCT1RIIExPQ0tTIFRBS0UgVEhFTSBJTiBUSElTIE9SREVSOgorCSAqIGRvd24ocG1lbV9kYXRhLT5zZW0pID0+IGRvd24oYml0bWFwX3NlbSkKKwkgKi8KKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIGJpdG1hcF9zZW07CisKKwlsb25nICgqaW9jdGwpKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CisJaW50ICgqcmVsZWFzZSkoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworfTsKKworc3RhdGljIHN0cnVjdCBwbWVtX2luZm8gcG1lbVtQTUVNX01BWF9ERVZJQ0VTXTsKK3N0YXRpYyBpbnQgaWRfY291bnQ7CisKKyNkZWZpbmUgUE1FTV9JU19GUkVFKGlkLCBpbmRleCkgIShwbWVtW2lkXS5iaXRtYXBbaW5kZXhdLmFsbG9jYXRlZCkKKyNkZWZpbmUgUE1FTV9PUkRFUihpZCwgaW5kZXgpIHBtZW1baWRdLmJpdG1hcFtpbmRleF0ub3JkZXIKKyNkZWZpbmUgUE1FTV9CVUREWV9JTkRFWChpZCwgaW5kZXgpIChpbmRleCBeICgxIDw8IFBNRU1fT1JERVIoaWQsIGluZGV4KSkpCisjZGVmaW5lIFBNRU1fTkVYVF9JTkRFWChpZCwgaW5kZXgpIChpbmRleCArICgxIDw8IFBNRU1fT1JERVIoaWQsIGluZGV4KSkpCisjZGVmaW5lIFBNRU1fT0ZGU0VUKGluZGV4KSAoaW5kZXggKiBQTUVNX01JTl9BTExPQykKKyNkZWZpbmUgUE1FTV9TVEFSVF9BRERSKGlkLCBpbmRleCkgKFBNRU1fT0ZGU0VUKGluZGV4KSArIHBtZW1baWRdLmJhc2UpCisjZGVmaW5lIFBNRU1fTEVOKGlkLCBpbmRleCkgKCgxIDw8IFBNRU1fT1JERVIoaWQsIGluZGV4KSkgKiBQTUVNX01JTl9BTExPQykKKyNkZWZpbmUgUE1FTV9FTkRfQUREUihpZCwgaW5kZXgpIChQTUVNX1NUQVJUX0FERFIoaWQsIGluZGV4KSArIFwKKwlQTUVNX0xFTihpZCwgaW5kZXgpKQorI2RlZmluZSBQTUVNX1NUQVJUX1ZBRERSKGlkLCBpbmRleCkgKFBNRU1fT0ZGU0VUKGlkLCBpbmRleCkgKyBwbWVtW2lkXS52YmFzZSkKKyNkZWZpbmUgUE1FTV9FTkRfVkFERFIoaWQsIGluZGV4KSAoUE1FTV9TVEFSVF9WQUREUihpZCwgaW5kZXgpICsgXAorCVBNRU1fTEVOKGlkLCBpbmRleCkpCisjZGVmaW5lIFBNRU1fUkVWT0tFRChkYXRhKSAoZGF0YS0+ZmxhZ3MgJiBQTUVNX0ZMQUdTX1JFVk9LRUQpCisjZGVmaW5lIFBNRU1fSVNfUEFHRV9BTElHTkVEKGFkZHIpICghKChhZGRyKSAmICh+UEFHRV9NQVNLKSkpCisjZGVmaW5lIFBNRU1fSVNfU1VCTUFQKGRhdGEpICgoZGF0YS0+ZmxhZ3MgJiBQTUVNX0ZMQUdTX1NVQk1BUCkgJiYgXAorCSghKGRhdGEtPmZsYWdzICYgUE1FTV9GTEFHU19VTlNVQk1BUCkpKQorCitzdGF0aWMgaW50IHBtZW1fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgaW50IHBtZW1fbW1hcChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CitzdGF0aWMgaW50IHBtZW1fb3BlbihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgbG9uZyBwbWVtX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgcG1lbV9mb3BzID0geworCS5yZWxlYXNlID0gcG1lbV9yZWxlYXNlLAorCS5tbWFwID0gcG1lbV9tbWFwLAorCS5vcGVuID0gcG1lbV9vcGVuLAorCS51bmxvY2tlZF9pb2N0bCA9IHBtZW1faW9jdGwsCit9OworCitzdGF0aWMgaW50IGdldF9pZChzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gTUlOT1IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfcmRldik7Cit9CisKK3N0YXRpYyBpbnQgaXNfcG1lbV9maWxlKHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBpZDsKKworCWlmICh1bmxpa2VseSghZmlsZSB8fCAhZmlsZS0+Zl9kZW50cnkgfHwgIWZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSkKKwkJcmV0dXJuIDA7CisJaWQgPSBnZXRfaWQoZmlsZSk7CisJaWYgKHVubGlrZWx5KGlkID49IFBNRU1fTUFYX0RFVklDRVMpKQorCQlyZXR1cm4gMDsKKwlpZiAodW5saWtlbHkoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfcmRldiAhPQorCSAgICAgTUtERVYoTUlTQ19NQUpPUiwgcG1lbVtpZF0uZGV2Lm1pbm9yKSkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhhc19hbGxvY2F0aW9uKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBwbWVtX2RhdGEgKmRhdGE7CisJLyogY2hlY2sgaXNfcG1lbV9maWxlIGZpcnN0IGlmIG5vdCBhY2Nlc3NlZCB2aWEgcG1lbV9maWxlX29wcyAqLworCisJaWYgKHVubGlrZWx5KCFmaWxlLT5wcml2YXRlX2RhdGEpKQorCQlyZXR1cm4gMDsKKwlkYXRhID0gKHN0cnVjdCBwbWVtX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKHVubGlrZWx5KGRhdGEtPmluZGV4IDwgMCkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGlzX21hc3Rlcl9vd25lcihzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZmlsZSAqbWFzdGVyX2ZpbGU7CisJc3RydWN0IHBtZW1fZGF0YSAqZGF0YTsKKwlpbnQgcHV0X25lZWRlZCwgcmV0ID0gMDsKKworCWlmICghaXNfcG1lbV9maWxlKGZpbGUpIHx8ICFoYXNfYWxsb2NhdGlvbihmaWxlKSkKKwkJcmV0dXJuIDA7CisJZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmIChQTUVNX0ZMQUdTX01BU1RFUk1BUCAmIGRhdGEtPmZsYWdzKQorCQlyZXR1cm4gMTsKKwltYXN0ZXJfZmlsZSA9IGZnZXRfbGlnaHQoZGF0YS0+bWFzdGVyX2ZkLCAmcHV0X25lZWRlZCk7CisJaWYgKG1hc3Rlcl9maWxlICYmIGRhdGEtPm1hc3Rlcl9maWxlID09IG1hc3Rlcl9maWxlKQorCQlyZXQgPSAxOworCWZwdXRfbGlnaHQobWFzdGVyX2ZpbGUsIHB1dF9uZWVkZWQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcG1lbV9mcmVlKGludCBpZCwgaW50IGluZGV4KQoreworCS8qIGNhbGxlciBzaG91bGQgaG9sZCB0aGUgd3JpdGUgbG9jayBvbiBwbWVtX3NlbSEgKi8KKwlpbnQgYnVkZHksIGN1cnIgPSBpbmRleDsKKwlETE9HKCJpbmRleCAlZFxuIiwgaW5kZXgpOworCisJaWYgKHBtZW1baWRdLm5vX2FsbG9jYXRvcikgeworCQlwbWVtW2lkXS5hbGxvY2F0ZWQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJLyogY2xlYW4gdXAgdGhlIGJpdG1hcCwgbWVyZ2luZyBhbnkgYnVkZGllcyAqLworCXBtZW1baWRdLmJpdG1hcFtjdXJyXS5hbGxvY2F0ZWQgPSAwOworCS8qIGZpbmQgYSBzbG90cyBidWRkeSBCdWRkeSMgPSBTbG90IyBeICgxIDw8IG9yZGVyKQorCSAqIGlmIHRoZSBidWRkeSBpcyBhbHNvIGZyZWUgbWVyZ2UgdGhlbQorCSAqIHJlcGVhdCB1bnRpbCB0aGUgYnVkZHkgaXMgbm90IGZyZWUgb3IgZW5kIG9mIHRoZSBiaXRtYXAgaXMgcmVhY2hlZAorCSAqLworCWRvIHsKKwkJYnVkZHkgPSBQTUVNX0JVRERZX0lOREVYKGlkLCBjdXJyKTsKKwkJaWYgKFBNRU1fSVNfRlJFRShpZCwgYnVkZHkpICYmCisJCQkJUE1FTV9PUkRFUihpZCwgYnVkZHkpID09IFBNRU1fT1JERVIoaWQsIGN1cnIpKSB7CisJCQlQTUVNX09SREVSKGlkLCBidWRkeSkrKzsKKwkJCVBNRU1fT1JERVIoaWQsIGN1cnIpKys7CisJCQljdXJyID0gbWluKGJ1ZGR5LCBjdXJyKTsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoY3VyciA8IHBtZW1baWRdLm51bV9lbnRyaWVzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwbWVtX3Jldm9rZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBtZW1fZGF0YSAqZGF0YSk7CisKK3N0YXRpYyBpbnQgcG1lbV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBwbWVtX2RhdGEgKmRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcG1lbV9yZWdpb25fbm9kZSAqcmVnaW9uX25vZGU7CisJc3RydWN0IGxpc3RfaGVhZCAqZWx0LCAqZWx0MjsKKwlpbnQgaWQgPSBnZXRfaWQoZmlsZSksIHJldCA9IDA7CisKKworCWRvd24oJnBtZW1baWRdLmRhdGFfbGlzdF9zZW0pOworCS8qIGlmIHRoaXMgZmlsZSBpcyBhIG1hc3RlciwgcmV2b2tlIGFsbCB0aGUgbWVtb3J5IGluIHRoZSBjb25uZWN0ZWQKKwkgKiAgZmlsZXMgKi8KKwlpZiAoUE1FTV9GTEFHU19NQVNURVJNQVAgJiBkYXRhLT5mbGFncykgeworCQlzdHJ1Y3QgcG1lbV9kYXRhICpzdWJfZGF0YTsKKwkJbGlzdF9mb3JfZWFjaChlbHQsICZwbWVtW2lkXS5kYXRhX2xpc3QpIHsKKwkJCXN1Yl9kYXRhID0gbGlzdF9lbnRyeShlbHQsIHN0cnVjdCBwbWVtX2RhdGEsIGxpc3QpOworCQkJZG93bl9yZWFkKCZzdWJfZGF0YS0+c2VtKTsKKwkJCWlmIChQTUVNX0lTX1NVQk1BUChzdWJfZGF0YSkgJiYKKwkJCSAgICBmaWxlID09IHN1Yl9kYXRhLT5tYXN0ZXJfZmlsZSkgeworCQkJCXVwX3JlYWQoJnN1Yl9kYXRhLT5zZW0pOworCQkJCXBtZW1fcmV2b2tlKGZpbGUsIHN1Yl9kYXRhKTsKKwkJCX0gIGVsc2UKKwkJCQl1cF9yZWFkKCZzdWJfZGF0YS0+c2VtKTsKKwkJfQorCX0KKwlsaXN0X2RlbCgmZGF0YS0+bGlzdCk7CisJdXAoJnBtZW1baWRdLmRhdGFfbGlzdF9zZW0pOworCisKKwlkb3duX3dyaXRlKCZkYXRhLT5zZW0pOworCisJLyogaWYgaXRzIG5vdCBhIGNvbmVuY3RlZCBmaWxlIGFuZCBpdCBoYXMgYW4gYWxsb2NhdGlvbiwgZnJlZSBpdCAqLworCWlmICghKFBNRU1fRkxBR1NfQ09OTkVDVEVEICYgZGF0YS0+ZmxhZ3MpICYmIGhhc19hbGxvY2F0aW9uKGZpbGUpKSB7CisJCWRvd25fd3JpdGUoJnBtZW1baWRdLmJpdG1hcF9zZW0pOworCQlyZXQgPSBwbWVtX2ZyZWUoaWQsIGRhdGEtPmluZGV4KTsKKwkJdXBfd3JpdGUoJnBtZW1baWRdLmJpdG1hcF9zZW0pOworCX0KKworCS8qIGlmIHRoaXMgZmlsZSBpcyBhIHN1Ym1hcCAobWFwcGVkLCBjb25uZWN0ZWQgZmlsZSksIGRvd25yZWYgdGhlCisJICogdGFzayBzdHJ1Y3QgKi8KKwlpZiAoUE1FTV9GTEFHU19TVUJNQVAgJiBkYXRhLT5mbGFncykKKwkJaWYgKGRhdGEtPnRhc2spIHsKKwkJCXB1dF90YXNrX3N0cnVjdChkYXRhLT50YXNrKTsKKwkJCWRhdGEtPnRhc2sgPSBOVUxMOworCQl9CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGVsdCwgZWx0MiwgJmRhdGEtPnJlZ2lvbl9saXN0KSB7CisJCXJlZ2lvbl9ub2RlID0gbGlzdF9lbnRyeShlbHQsIHN0cnVjdCBwbWVtX3JlZ2lvbl9ub2RlLCBsaXN0KTsKKwkJbGlzdF9kZWwoZWx0KTsKKwkJa2ZyZWUocmVnaW9uX25vZGUpOworCX0KKwlCVUdfT04oIWxpc3RfZW1wdHkoJmRhdGEtPnJlZ2lvbl9saXN0KSk7CisKKwl1cF93cml0ZSgmZGF0YS0+c2VtKTsKKwlrZnJlZShkYXRhKTsKKwlpZiAocG1lbVtpZF0ucmVsZWFzZSkKKwkJcmV0ID0gcG1lbVtpZF0ucmVsZWFzZShpbm9kZSwgZmlsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBtZW1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhOworCWludCBpZCA9IGdldF9pZChmaWxlKTsKKwlpbnQgcmV0ID0gMDsKKworCURMT0coImN1cnJlbnQgJXUgZmlsZSAlcCglZClcbiIsIGN1cnJlbnQtPnBpZCwgZmlsZSwgZmlsZV9jb3VudChmaWxlKSk7CisJLyogc2V0dXAgZmlsZS0+cHJpdmF0ZV9kYXRhIHRvIGluZGljYXRlIGl0cyB1bm1hcHBlZCAqLworCS8qICB5b3UgY2FuIG9ubHkgb3BlbiBhIHBtZW0gZGV2aWNlIG9uZSB0aW1lICovCisJaWYgKGZpbGUtPnByaXZhdGVfZGF0YSAhPSBOVUxMKQorCQlyZXR1cm4gLTE7CisJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbWVtX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpIHsKKwkJcHJpbnRrKCJwbWVtOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwbWVtIG1ldGFkYXRhLiIpOworCQlyZXR1cm4gLTE7CisJfQorCWRhdGEtPmZsYWdzID0gMDsKKwlkYXRhLT5pbmRleCA9IC0xOworCWRhdGEtPnRhc2sgPSBOVUxMOworCWRhdGEtPnZtYSA9IE5VTEw7CisJZGF0YS0+cGlkID0gMDsKKwlkYXRhLT5tYXN0ZXJfZmlsZSA9IE5VTEw7CisjaWYgUE1FTV9ERUJVRworCWRhdGEtPnJlZiA9IDA7CisjZW5kaWYKKwlJTklUX0xJU1RfSEVBRCgmZGF0YS0+cmVnaW9uX2xpc3QpOworCWluaXRfcndzZW0oJmRhdGEtPnNlbSk7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBkYXRhOworCUlOSVRfTElTVF9IRUFEKCZkYXRhLT5saXN0KTsKKworCWRvd24oJnBtZW1baWRdLmRhdGFfbGlzdF9zZW0pOworCWxpc3RfYWRkKCZkYXRhLT5saXN0LCAmcG1lbVtpZF0uZGF0YV9saXN0KTsKKwl1cCgmcG1lbVtpZF0uZGF0YV9saXN0X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcG1lbV9vcmRlcih1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlpbnQgaTsKKworCWxlbiA9IChsZW4gKyBQTUVNX01JTl9BTExPQyAtIDEpL1BNRU1fTUlOX0FMTE9DOworCWxlbi0tOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YobGVuKSo4OyBpKyspCisJCWlmIChsZW4gPj4gaSA9PSAwKQorCQkJYnJlYWs7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgcG1lbV9hbGxvY2F0ZShpbnQgaWQsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCS8qIGNhbGxlciBzaG91bGQgaG9sZCB0aGUgd3JpdGUgbG9jayBvbiBwbWVtX3NlbSEgKi8KKwkvKiByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcGRhdGFbXSBlbnRyeSAqLworCWludCBjdXJyID0gMDsKKwlpbnQgZW5kID0gcG1lbVtpZF0ubnVtX2VudHJpZXM7CisJaW50IGJlc3RfZml0ID0gLTE7CisJdW5zaWduZWQgbG9uZyBvcmRlciA9IHBtZW1fb3JkZXIobGVuKTsKKworCWlmIChwbWVtW2lkXS5ub19hbGxvY2F0b3IpIHsKKwkJRExPRygibm8gYWxsb2NhdG9yIik7CisJCWlmICgobGVuID4gcG1lbVtpZF0uc2l6ZSkgfHwgcG1lbVtpZF0uYWxsb2NhdGVkKQorCQkJcmV0dXJuIC0xOworCQlwbWVtW2lkXS5hbGxvY2F0ZWQgPSAxOworCQlyZXR1cm4gbGVuOworCX0KKworCWlmIChvcmRlciA+IFBNRU1fTUFYX09SREVSKQorCQlyZXR1cm4gLTE7CisJRExPRygib3JkZXIgJWx4XG4iLCBvcmRlcik7CisKKwkvKiBsb29rIHRocm91Z2ggdGhlIGJpdG1hcDoKKwkgKiAJaWYgeW91IGZpbmQgYSBmcmVlIHNsb3Qgb2YgdGhlIGNvcnJlY3Qgb3JkZXIgdXNlIGl0CisJICogCW90aGVyd2lzZSwgdXNlIHRoZSBiZXN0IGZpdCAoc21hbGxlc3Qgd2l0aCBzaXplID4gb3JkZXIpIHNsb3QKKwkgKi8KKwl3aGlsZSAoY3VyciA8IGVuZCkgeworCQlpZiAoUE1FTV9JU19GUkVFKGlkLCBjdXJyKSkgeworCQkJaWYgKFBNRU1fT1JERVIoaWQsIGN1cnIpID09ICh1bnNpZ25lZCBjaGFyKW9yZGVyKSB7CisJCQkJLyogc2V0IHRoZSBub3QgZnJlZSBiaXQgYW5kIGNsZWFyIG90aGVycyAqLworCQkJCWJlc3RfZml0ID0gY3VycjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChQTUVNX09SREVSKGlkLCBjdXJyKSA+ICh1bnNpZ25lZCBjaGFyKW9yZGVyICYmCisJCQkgICAgKGJlc3RfZml0IDwgMCB8fAorCQkJICAgICBQTUVNX09SREVSKGlkLCBjdXJyKSA8IFBNRU1fT1JERVIoaWQsIGJlc3RfZml0KSkpCisJCQkJYmVzdF9maXQgPSBjdXJyOworCQl9CisJCWN1cnIgPSBQTUVNX05FWFRfSU5ERVgoaWQsIGN1cnIpOworCX0KKworCS8qIGlmIGJlc3RfZml0IDwgMCwgdGhlcmUgYXJlIG5vIHN1aXRhYmxlIHNsb3RzLAorCSAqIHJldHVybiBhbiBlcnJvcgorCSAqLworCWlmIChiZXN0X2ZpdCA8IDApIHsKKwkJcHJpbnRrKCJwbWVtOiBubyBzcGFjZSBsZWZ0IHRvIGFsbG9jYXRlIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBub3cgcGFydGl0aW9uIHRoZSBiZXN0IGZpdDoKKwkgKiAJc3BsaXQgdGhlIHNsb3QgaW50byAyIGJ1ZGRpZXMgb2Ygb3JkZXIgLSAxCisJICogCXJlcGVhdCB1bnRpbCB0aGUgc2xvdCBpcyBvZiB0aGUgY29ycmVjdCBvcmRlcgorCSAqLworCXdoaWxlIChQTUVNX09SREVSKGlkLCBiZXN0X2ZpdCkgPiAodW5zaWduZWQgY2hhcilvcmRlcikgeworCQlpbnQgYnVkZHk7CisJCVBNRU1fT1JERVIoaWQsIGJlc3RfZml0KSAtPSAxOworCQlidWRkeSA9IFBNRU1fQlVERFlfSU5ERVgoaWQsIGJlc3RfZml0KTsKKwkJUE1FTV9PUkRFUihpZCwgYnVkZHkpID0gUE1FTV9PUkRFUihpZCwgYmVzdF9maXQpOworCX0KKwlwbWVtW2lkXS5iaXRtYXBbYmVzdF9maXRdLmFsbG9jYXRlZCA9IDE7CisJcmV0dXJuIGJlc3RfZml0OworfQorCitzdGF0aWMgcGdwcm90X3QgcGh5c19tZW1fYWNjZXNzX3Byb3Qoc3RydWN0IGZpbGUgKmZpbGUsIHBncHJvdF90IHZtYV9wcm90KQoreworCWludCBpZCA9IGdldF9pZChmaWxlKTsKKyNpZmRlZiBwZ3Byb3Rfbm9uY2FjaGVkCisJaWYgKHBtZW1baWRdLmNhY2hlZCA9PSAwIHx8IGZpbGUtPmZfZmxhZ3MgJiBPX1NZTkMpCisJCXJldHVybiBwZ3Byb3Rfbm9uY2FjaGVkKHZtYV9wcm90KTsKKyNlbmRpZgorI2lmZGVmIHBncHJvdF9leHRfYnVmZmVyZWQKKwllbHNlIGlmIChwbWVtW2lkXS5idWZmZXJlZCkKKwkJcmV0dXJuIHBncHJvdF9leHRfYnVmZmVyZWQodm1hX3Byb3QpOworI2VuZGlmCisJcmV0dXJuIHZtYV9wcm90OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwbWVtX3N0YXJ0X2FkZHIoaW50IGlkLCBzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhKQoreworCWlmIChwbWVtW2lkXS5ub19hbGxvY2F0b3IpCisJCXJldHVybiBQTUVNX1NUQVJUX0FERFIoaWQsIDApOworCWVsc2UKKwkJcmV0dXJuIFBNRU1fU1RBUlRfQUREUihpZCwgZGF0YS0+aW5kZXgpOworCit9CisKK3N0YXRpYyB2b2lkICpwbWVtX3N0YXJ0X3ZhZGRyKGludCBpZCwgc3RydWN0IHBtZW1fZGF0YSAqZGF0YSkKK3sKKwlyZXR1cm4gcG1lbV9zdGFydF9hZGRyKGlkLCBkYXRhKSAtIHBtZW1baWRdLmJhc2UgKyBwbWVtW2lkXS52YmFzZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcG1lbV9sZW4oaW50IGlkLCBzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhKQoreworCWlmIChwbWVtW2lkXS5ub19hbGxvY2F0b3IpCisJCXJldHVybiBkYXRhLT5pbmRleDsKKwllbHNlCisJCXJldHVybiBQTUVNX0xFTihpZCwgZGF0YS0+aW5kZXgpOworfQorCitzdGF0aWMgaW50IHBtZW1fbWFwX2dhcmJhZ2UoaW50IGlkLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCSAgICBzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlpbnQgaSwgZ2FyYmFnZV9wYWdlcyA9IGxlbiA+PiBQQUdFX1NISUZUOworCisJdm1hLT52bV9mbGFncyB8PSBWTV9JTyB8IFZNX1JFU0VSVkVEIHwgVk1fUEZOTUFQIHwgVk1fU0hBUkVEIHwgVk1fV1JJVEU7CisJZm9yIChpID0gMDsgaSA8IGdhcmJhZ2VfcGFnZXM7IGkrKykgeworCQlpZiAodm1faW5zZXJ0X3Bmbih2bWEsIHZtYS0+dm1fc3RhcnQgKyBvZmZzZXQgKyAoaSAqIFBBR0VfU0laRSksCisJCSAgICBwbWVtW2lkXS5nYXJiYWdlX3BmbikpCisJCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG1lbV91bm1hcF9wZm5fcmFuZ2UoaW50IGlkLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQl1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlpbnQgZ2FyYmFnZV9wYWdlczsKKwlETE9HKCJ1bm1hcCBvZmZzZXQgJWx4IGxlbiAlbHhcbiIsIG9mZnNldCwgbGVuKTsKKworCUJVR19PTighUE1FTV9JU19QQUdFX0FMSUdORUQobGVuKSk7CisKKwlnYXJiYWdlX3BhZ2VzID0gbGVuID4+IFBBR0VfU0hJRlQ7CisJemFwX3BhZ2VfcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0ICsgb2Zmc2V0LCBsZW4sIE5VTEwpOworCXBtZW1fbWFwX2dhcmJhZ2UoaWQsIHZtYSwgZGF0YSwgb2Zmc2V0LCBsZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtZW1fbWFwX3Bmbl9yYW5nZShpbnQgaWQsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJICAgICAgc3RydWN0IHBtZW1fZGF0YSAqZGF0YSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlETE9HKCJtYXAgb2Zmc2V0ICVseCBsZW4gJWx4XG4iLCBvZmZzZXQsIGxlbik7CisJQlVHX09OKCFQTUVNX0lTX1BBR0VfQUxJR05FRCh2bWEtPnZtX3N0YXJ0KSk7CisJQlVHX09OKCFQTUVNX0lTX1BBR0VfQUxJR05FRCh2bWEtPnZtX2VuZCkpOworCUJVR19PTighUE1FTV9JU19QQUdFX0FMSUdORUQobGVuKSk7CisJQlVHX09OKCFQTUVNX0lTX1BBR0VfQUxJR05FRChvZmZzZXQpKTsKKworCWlmIChpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0ICsgb2Zmc2V0LAorCQkocG1lbV9zdGFydF9hZGRyKGlkLCBkYXRhKSArIG9mZnNldCkgPj4gUEFHRV9TSElGVCwKKwkJbGVuLCB2bWEtPnZtX3BhZ2VfcHJvdCkpIHsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtZW1fcmVtYXBfcGZuX3JhbmdlKGludCBpZCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkgICAgICBzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCS8qIGhvbGQgdGhlIG1tIHNlbXAgZm9yIHRoZSB2bWEgeW91IGFyZSBtb2RpZnlpbmcgd2hlbiB5b3UgY2FsbCB0aGlzICovCisJQlVHX09OKCF2bWEpOworCXphcF9wYWdlX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCArIG9mZnNldCwgbGVuLCBOVUxMKTsKKwlyZXR1cm4gcG1lbV9tYXBfcGZuX3JhbmdlKGlkLCB2bWEsIGRhdGEsIG9mZnNldCwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgcG1lbV92bWFfb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IHZtYS0+dm1fZmlsZTsKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBpZCA9IGdldF9pZChmaWxlKTsKKwkvKiB0aGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBjb3B5aW5nIHBtZW0KKwkgKiByYW5nZXMgdmlhIGZvcmsgKi8KKwlCVUdfT04oIWhhc19hbGxvY2F0aW9uKGZpbGUpKTsKKwlkb3duX3dyaXRlKCZkYXRhLT5zZW0pOworCS8qIHJlbWFwIHRoZSBnYXJiYWdlIHBhZ2VzLCBmb3JrZXJzIGRvbid0IGdldCBhY2Nlc3MgdG8gdGhlIGRhdGEgKi8KKwlwbWVtX3VubWFwX3Bmbl9yYW5nZShpZCwgdm1hLCBkYXRhLCAwLCB2bWEtPnZtX3N0YXJ0IC0gdm1hLT52bV9lbmQpOworCXVwX3dyaXRlKCZkYXRhLT5zZW0pOworfQorCitzdGF0aWMgdm9pZCBwbWVtX3ZtYV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IHZtYS0+dm1fZmlsZTsKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJRExPRygiY3VycmVudCAldSBwcGlkICV1IGZpbGUgJXAgY291bnQgJWRcbiIsIGN1cnJlbnQtPnBpZCwKKwkgICAgIGN1cnJlbnQtPnBhcmVudC0+cGlkLCBmaWxlLCBmaWxlX2NvdW50KGZpbGUpKTsKKwlpZiAodW5saWtlbHkoIWlzX3BtZW1fZmlsZShmaWxlKSB8fCAhaGFzX2FsbG9jYXRpb24oZmlsZSkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInBtZW06IHNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLCB5b3UgYXJlICIKKwkJICAgICAgICJjbG9zaW5nIGEgdm0gYmFja2luZyBhbiBhbGxvY2F0aW9uIHRoYXQgZG9lc24ndCAiCisJCSAgICAgICAiZXhpc3QhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlkb3duX3dyaXRlKCZkYXRhLT5zZW0pOworCWlmIChkYXRhLT52bWEgPT0gdm1hKSB7CisJCWRhdGEtPnZtYSA9IE5VTEw7CisJCWlmICgoZGF0YS0+ZmxhZ3MgJiBQTUVNX0ZMQUdTX0NPTk5FQ1RFRCkgJiYKKwkJICAgIChkYXRhLT5mbGFncyAmIFBNRU1fRkxBR1NfU1VCTUFQKSkKKwkJCWRhdGEtPmZsYWdzIHw9IFBNRU1fRkxBR1NfVU5TVUJNQVA7CisJfQorCS8qIHRoZSBrZXJuZWwgaXMgZ29pbmcgdG8gZnJlZSB0aGlzIHZtYSBub3cgYW55d2F5ICovCisJdXBfd3JpdGUoJmRhdGEtPnNlbSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgdm1fb3BzID0geworCS5vcGVuID0gcG1lbV92bWFfb3BlbiwKKwkuY2xvc2UgPSBwbWVtX3ZtYV9jbG9zZSwKK307CisKK3N0YXRpYyBpbnQgcG1lbV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhOworCWludCBpbmRleDsKKwl1bnNpZ25lZCBsb25nIHZtYV9zaXplID0gIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpbnQgcmV0ID0gMCwgaWQgPSBnZXRfaWQoZmlsZSk7CisKKwlpZiAodm1hLT52bV9wZ29mZiB8fCAhUE1FTV9JU19QQUdFX0FMSUdORUQodm1hX3NpemUpKSB7CisjaWYgUE1FTV9ERUJVRworCQlwcmludGsoS0VSTl9FUlIgInBtZW06IG1tYXBzIG11c3QgYmUgYXQgb2Zmc2V0IHplcm8sIGFsaWduZWQiCisJCQkJIiBhbmQgYSBtdWx0aXBsZSBvZiBwYWdlc19zaXplLlxuIik7CisjZW5kaWYKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWRvd25fd3JpdGUoJmRhdGEtPnNlbSk7CisJLyogY2hlY2sgdGhpcyBmaWxlIGlzbid0IGFscmVhZHkgbW1hcGVkLCBmb3Igc3VibWFwcyBjaGVjayB0aGlzIGZpbGUKKwkgKiBoYXMgbmV2ZXIgYmVlbiBtbWFwZWQgKi8KKwlpZiAoKGRhdGEtPmZsYWdzICYgUE1FTV9GTEFHU19NQVNURVJNQVApIHx8CisJICAgIChkYXRhLT5mbGFncyAmIFBNRU1fRkxBR1NfU1VCTUFQKSB8fAorCSAgICAoZGF0YS0+ZmxhZ3MgJiBQTUVNX0ZMQUdTX1VOU1VCTUFQKSkgeworI2lmIFBNRU1fREVCVUcKKwkJcHJpbnRrKEtFUk5fRVJSICJwbWVtOiB5b3UgY2FuIG9ubHkgbW1hcCBhIHBtZW0gZmlsZSBvbmNlLCAiCisJCSAgICAgICAidGhpcyBmaWxlIGlzIGFscmVhZHkgbW1hcGVkLiAleFxuIiwgZGF0YS0+ZmxhZ3MpOworI2VuZGlmCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCS8qIGlmIGZpbGUtPnByaXZhdGVfZGF0YSA9PSB1bmFsbG9jZWQsIGFsbG9jKi8KKwlpZiAoZGF0YSAmJiBkYXRhLT5pbmRleCA9PSAtMSkgeworCQlkb3duX3dyaXRlKCZwbWVtW2lkXS5iaXRtYXBfc2VtKTsKKwkJaW5kZXggPSBwbWVtX2FsbG9jYXRlKGlkLCB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpOworCQl1cF93cml0ZSgmcG1lbVtpZF0uYml0bWFwX3NlbSk7CisJCWRhdGEtPmluZGV4ID0gaW5kZXg7CisJfQorCS8qIGVpdGhlciBubyBzcGFjZSB3YXMgYXZhaWxhYmxlIG9yIGFuIGVycm9yIG9jY3VyZWQgKi8KKwlpZiAoIWhhc19hbGxvY2F0aW9uKGZpbGUpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCXByaW50aygicG1lbTogY291bGQgbm90IGZpbmQgYWxsb2NhdGlvbiBmb3IgbWFwLlxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKHBtZW1fbGVuKGlkLCBkYXRhKSA8IHZtYV9zaXplKSB7CisjaWYgUE1FTV9ERUJVRworCQlwcmludGsoS0VSTl9XQVJOSU5HICJwbWVtOiBtbWFwIHNpemUgWyVsdV0gZG9lcyBub3QgbWF0Y2giCisJCSAgICAgICAic2l6ZSBvZiBiYWNraW5nIHJlZ2lvbiBbJWx1XS5cbiIsIHZtYV9zaXplLAorCQkgICAgICAgcG1lbV9sZW4oaWQsIGRhdGEpKTsKKyNlbmRpZgorCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCXZtYS0+dm1fcGdvZmYgPSBwbWVtX3N0YXJ0X2FkZHIoaWQsIGRhdGEpID4+IFBBR0VfU0hJRlQ7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwaHlzX21lbV9hY2Nlc3NfcHJvdChmaWxlLCB2bWEtPnZtX3BhZ2VfcHJvdCk7CisKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBQTUVNX0ZMQUdTX0NPTk5FQ1RFRCkgeworCQlzdHJ1Y3QgcG1lbV9yZWdpb25fbm9kZSAqcmVnaW9uX25vZGU7CisJCXN0cnVjdCBsaXN0X2hlYWQgKmVsdDsKKwkJaWYgKHBtZW1fbWFwX2dhcmJhZ2UoaWQsIHZtYSwgZGF0YSwgMCwgdm1hX3NpemUpKSB7CisJCQlwcmludGsoInBtZW06IG1tYXAgZmFpbGVkIGluIGtlcm5lbCFcbiIpOworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJbGlzdF9mb3JfZWFjaChlbHQsICZkYXRhLT5yZWdpb25fbGlzdCkgeworCQkJcmVnaW9uX25vZGUgPSBsaXN0X2VudHJ5KGVsdCwgc3RydWN0IHBtZW1fcmVnaW9uX25vZGUsCisJCQkJCQkgbGlzdCk7CisJCQlETE9HKCJyZW1hcHBpbmcgZmlsZTogJXAgJWx4ICVseFxuIiwgZmlsZSwKKwkJCQlyZWdpb25fbm9kZS0+cmVnaW9uLm9mZnNldCwKKwkJCQlyZWdpb25fbm9kZS0+cmVnaW9uLmxlbik7CisJCQlpZiAocG1lbV9yZW1hcF9wZm5fcmFuZ2UoaWQsIHZtYSwgZGF0YSwKKwkJCQkJCSByZWdpb25fbm9kZS0+cmVnaW9uLm9mZnNldCwKKwkJCQkJCSByZWdpb25fbm9kZS0+cmVnaW9uLmxlbikpIHsKKwkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0KKwkJZGF0YS0+ZmxhZ3MgfD0gUE1FTV9GTEFHU19TVUJNQVA7CisJCWdldF90YXNrX3N0cnVjdChjdXJyZW50LT5ncm91cF9sZWFkZXIpOworCQlkYXRhLT50YXNrID0gY3VycmVudC0+Z3JvdXBfbGVhZGVyOworCQlkYXRhLT52bWEgPSB2bWE7CisjaWYgUE1FTV9ERUJVRworCQlkYXRhLT5waWQgPSBjdXJyZW50LT5waWQ7CisjZW5kaWYKKwkJRExPRygic3VibW1hcHBlZCBmaWxlICVwIHZtYSAlcCBwaWQgJXVcbiIsIGZpbGUsIHZtYSwKKwkJICAgICBjdXJyZW50LT5waWQpOworCX0gZWxzZSB7CisJCWlmIChwbWVtX21hcF9wZm5fcmFuZ2UoaWQsIHZtYSwgZGF0YSwgMCwgdm1hX3NpemUpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJwbWVtOiBtbWFwIGZhaWxlZCBpbiBrZXJuZWwhXG4iKTsKKwkJCXJldCA9IC1FQUdBSU47CisJCQlnb3RvIGVycm9yOworCQl9CisJCWRhdGEtPmZsYWdzIHw9IFBNRU1fRkxBR1NfTUFTVEVSTUFQOworCQlkYXRhLT5waWQgPSBjdXJyZW50LT5waWQ7CisJfQorCXZtYS0+dm1fb3BzID0gJnZtX29wczsKK2Vycm9yOgorCXVwX3dyaXRlKCZkYXRhLT5zZW0pOworCXJldHVybiByZXQ7Cit9CisKKy8qIHRoZSBmb2xsb3dpbmcgYXJlIHRoZSBhcGkgZm9yIGFjY2Vzc2luZyBwbWVtIHJlZ2lvbnMgYnkgb3RoZXIgZHJpdmVycworICogZnJvbSBpbnNpZGUgdGhlIGtlcm5lbCAqLworaW50IGdldF9wbWVtX3VzZXJfYWRkcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyAqc3RhcnQsCisJCSAgIHVuc2lnbmVkIGxvbmcgKmxlbikKK3sKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhOworCWlmICghaXNfcG1lbV9maWxlKGZpbGUpIHx8ICFoYXNfYWxsb2NhdGlvbihmaWxlKSkgeworI2lmIFBNRU1fREVCVUcKKwkJcHJpbnRrKEtFUk5fSU5GTyAicG1lbTogcmVxdWVzdGVkIHBtZW0gZGF0YSBmcm9tIGludmFsaWQiCisJCQkJICAiZmlsZS5cbiIpOworI2VuZGlmCisJCXJldHVybiAtMTsKKwl9CisJZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWRvd25fcmVhZCgmZGF0YS0+c2VtKTsKKwlpZiAoZGF0YS0+dm1hKSB7CisJCSpzdGFydCA9IGRhdGEtPnZtYS0+dm1fc3RhcnQ7CisJCSpsZW4gPSBkYXRhLT52bWEtPnZtX2VuZCAtIGRhdGEtPnZtYS0+dm1fc3RhcnQ7CisJfSBlbHNlIHsKKwkJKnN0YXJ0ID0gMDsKKwkJKmxlbiA9IDA7CisJfQorCXVwX3JlYWQoJmRhdGEtPnNlbSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBnZXRfcG1lbV9hZGRyKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nICpzdGFydCwKKwkJICB1bnNpZ25lZCBsb25nICp2c3RhcnQsIHVuc2lnbmVkIGxvbmcgKmxlbikKK3sKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhOworCWludCBpZDsKKworCWlmICghaXNfcG1lbV9maWxlKGZpbGUpIHx8ICFoYXNfYWxsb2NhdGlvbihmaWxlKSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmIChkYXRhLT5pbmRleCA9PSAtMSkgeworI2lmIFBNRU1fREVCVUcKKwkJcHJpbnRrKEtFUk5fSU5GTyAicG1lbTogcmVxdWVzdGVkIHBtZW0gZGF0YSBmcm9tIGZpbGUgd2l0aCBubyAiCisJCSAgICAgICAiYWxsb2NhdGlvbi5cbiIpOworCQlyZXR1cm4gLTE7CisjZW5kaWYKKwl9CisJaWQgPSBnZXRfaWQoZmlsZSk7CisKKwlkb3duX3JlYWQoJmRhdGEtPnNlbSk7CisJKnN0YXJ0ID0gcG1lbV9zdGFydF9hZGRyKGlkLCBkYXRhKTsKKwkqbGVuID0gcG1lbV9sZW4oaWQsIGRhdGEpOworCSp2c3RhcnQgPSAodW5zaWduZWQgbG9uZylwbWVtX3N0YXJ0X3ZhZGRyKGlkLCBkYXRhKTsKKwl1cF9yZWFkKCZkYXRhLT5zZW0pOworI2lmIFBNRU1fREVCVUcKKwlkb3duX3dyaXRlKCZkYXRhLT5zZW0pOworCWRhdGEtPnJlZisrOworCXVwX3dyaXRlKCZkYXRhLT5zZW0pOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK2ludCBnZXRfcG1lbV9maWxlKGludCBmZCwgdW5zaWduZWQgbG9uZyAqc3RhcnQsIHVuc2lnbmVkIGxvbmcgKnZzdGFydCwKKwkJICB1bnNpZ25lZCBsb25nICpsZW4sIHN0cnVjdCBmaWxlICoqZmlscCkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKworCWZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAodW5saWtlbHkoZmlsZSA9PSBOVUxMKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJwbWVtOiByZXF1ZXN0ZWQgZGF0YSBmcm9tIGZpbGUgZGVzY3JpcHRvciAiCisJCSAgICAgICAidGhhdCBkb2Vzbid0IGV4aXN0LiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGdldF9wbWVtX2FkZHIoZmlsZSwgc3RhcnQsIHZzdGFydCwgbGVuKSkKKwkJZ290byBlbmQ7CisKKwlpZiAoZmlscCkKKwkJKmZpbHAgPSBmaWxlOworCXJldHVybiAwOworZW5kOgorCWZwdXQoZmlsZSk7CisJcmV0dXJuIC0xOworfQorCit2b2lkIHB1dF9wbWVtX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHBtZW1fZGF0YSAqZGF0YTsKKwlpbnQgaWQ7CisKKwlpZiAoIWlzX3BtZW1fZmlsZShmaWxlKSkKKwkJcmV0dXJuOworCWlkID0gZ2V0X2lkKGZpbGUpOworCWRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKyNpZiBQTUVNX0RFQlVHCisJZG93bl93cml0ZSgmZGF0YS0+c2VtKTsKKwlpZiAoZGF0YS0+cmVmID09IDApIHsKKwkJcHJpbnRrKCJwbWVtOiBwbWVtX3B1dCA+IHBtZW1fZ2V0ICVzIChwaWQgJWQpXG4iLAorCQkgICAgICAgcG1lbVtpZF0uZGV2Lm5hbWUsIGRhdGEtPnBpZCk7CisJCUJVRygpOworCX0KKwlkYXRhLT5yZWYtLTsKKwl1cF93cml0ZSgmZGF0YS0+c2VtKTsKKyNlbmRpZgorCWZwdXQoZmlsZSk7Cit9CisKK3ZvaWQgZmx1c2hfcG1lbV9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJc3RydWN0IHBtZW1fZGF0YSAqZGF0YTsKKwlpbnQgaWQ7CisJdm9pZCAqdmFkZHI7CisJc3RydWN0IHBtZW1fcmVnaW9uX25vZGUgKnJlZ2lvbl9ub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgKmVsdDsKKwl2b2lkICpmbHVzaF9zdGFydCwgKmZsdXNoX2VuZDsKKworCWlmICghaXNfcG1lbV9maWxlKGZpbGUpIHx8ICFoYXNfYWxsb2NhdGlvbihmaWxlKSkgeworCQlyZXR1cm47CisJfQorCisJaWQgPSBnZXRfaWQoZmlsZSk7CisJZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICghcG1lbVtpZF0uY2FjaGVkKQorCQlyZXR1cm47CisKKwlkb3duX3JlYWQoJmRhdGEtPnNlbSk7CisJdmFkZHIgPSBwbWVtX3N0YXJ0X3ZhZGRyKGlkLCBkYXRhKTsKKwkvKiBpZiB0aGlzIGlzbid0IGEgc3VibW1hcHBlZCBmaWxlLCBmbHVzaCB0aGUgd2hvbGUgdGhpbmcgKi8KKwlpZiAodW5saWtlbHkoIShkYXRhLT5mbGFncyAmIFBNRU1fRkxBR1NfQ09OTkVDVEVEKSkpIHsKKwkJZG1hY19mbHVzaF9yYW5nZSh2YWRkciwgdmFkZHIgKyBwbWVtX2xlbihpZCwgZGF0YSkpOworCQlnb3RvIGVuZDsKKwl9CisJLyogb3RoZXJ3aXNlLCBmbHVzaCB0aGUgcmVnaW9uIG9mIHRoZSBmaWxlIHdlIGFyZSBkcmF3aW5nICovCisJbGlzdF9mb3JfZWFjaChlbHQsICZkYXRhLT5yZWdpb25fbGlzdCkgeworCQlyZWdpb25fbm9kZSA9IGxpc3RfZW50cnkoZWx0LCBzdHJ1Y3QgcG1lbV9yZWdpb25fbm9kZSwgbGlzdCk7CisJCWlmICgob2Zmc2V0ID49IHJlZ2lvbl9ub2RlLT5yZWdpb24ub2Zmc2V0KSAmJgorCQkgICAgKChvZmZzZXQgKyBsZW4pIDw9IChyZWdpb25fbm9kZS0+cmVnaW9uLm9mZnNldCArCisJCQlyZWdpb25fbm9kZS0+cmVnaW9uLmxlbikpKSB7CisJCQlmbHVzaF9zdGFydCA9IHZhZGRyICsgcmVnaW9uX25vZGUtPnJlZ2lvbi5vZmZzZXQ7CisJCQlmbHVzaF9lbmQgPSBmbHVzaF9zdGFydCArIHJlZ2lvbl9ub2RlLT5yZWdpb24ubGVuOworCQkJZG1hY19mbHVzaF9yYW5nZShmbHVzaF9zdGFydCwgZmx1c2hfZW5kKTsKKwkJCWJyZWFrOworCQl9CisJfQorZW5kOgorCXVwX3JlYWQoJmRhdGEtPnNlbSk7Cit9CisKK3N0YXRpYyBpbnQgcG1lbV9jb25uZWN0KHVuc2lnbmVkIGxvbmcgY29ubmVjdCwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHBtZW1fZGF0YSAqZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwbWVtX2RhdGEgKnNyY19kYXRhOworCXN0cnVjdCBmaWxlICpzcmNfZmlsZTsKKwlpbnQgcmV0ID0gMCwgcHV0X25lZWRlZDsKKworCWRvd25fd3JpdGUoJmRhdGEtPnNlbSk7CisJLyogcmV0cmlldmUgdGhlIHNyYyBmaWxlIGFuZCBjaGVjayBpdCBpcyBhIHBtZW0gZmlsZSB3aXRoIGFuIGFsbG9jICovCisJc3JjX2ZpbGUgPSBmZ2V0X2xpZ2h0KGNvbm5lY3QsICZwdXRfbmVlZGVkKTsKKwlETE9HKCJjb25uZWN0ICVwIHRvICVwXG4iLCBmaWxlLCBzcmNfZmlsZSk7CisJaWYgKCFzcmNfZmlsZSkgeworCQlwcmludGsoInBtZW06IHNyYyBmaWxlIG5vdCBmb3VuZCFcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9ub19maWxlOworCX0KKwlpZiAodW5saWtlbHkoIWlzX3BtZW1fZmlsZShzcmNfZmlsZSkgfHwgIWhhc19hbGxvY2F0aW9uKHNyY19maWxlKSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicG1lbTogc3JjIGZpbGUgaXMgbm90IGEgcG1lbSBmaWxlIG9yIGhhcyBubyAiCisJCSAgICAgICAiYWxsb2MhXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfYmFkX2ZpbGU7CisJfQorCXNyY19kYXRhID0gKHN0cnVjdCBwbWVtX2RhdGEgKilzcmNfZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGhhc19hbGxvY2F0aW9uKGZpbGUpICYmIChkYXRhLT5pbmRleCAhPSBzcmNfZGF0YS0+aW5kZXgpKSB7CisJCXByaW50aygicG1lbTogZmlsZSBpcyBhbHJlYWR5IG1hcHBlZCBidXQgZG9lc24ndCBtYXRjaCB0aGlzIgorCQkgICAgICAgIiBzcmNfZmlsZSFcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9iYWRfZmlsZTsKKwl9CisJZGF0YS0+aW5kZXggPSBzcmNfZGF0YS0+aW5kZXg7CisJZGF0YS0+ZmxhZ3MgfD0gUE1FTV9GTEFHU19DT05ORUNURUQ7CisJZGF0YS0+bWFzdGVyX2ZkID0gY29ubmVjdDsKKwlkYXRhLT5tYXN0ZXJfZmlsZSA9IHNyY19maWxlOworCitlcnJfYmFkX2ZpbGU6CisJZnB1dF9saWdodChzcmNfZmlsZSwgcHV0X25lZWRlZCk7CitlcnJfbm9fZmlsZToKKwl1cF93cml0ZSgmZGF0YS0+c2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwbWVtX3VubG9ja19kYXRhX2FuZF9tbShzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhLAorCQkJCSAgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwl1cF93cml0ZSgmZGF0YS0+c2VtKTsKKwlpZiAobW0gIT0gTlVMTCkgeworCQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwkJbW1wdXQobW0pOworCX0KK30KKworc3RhdGljIGludCBwbWVtX2xvY2tfZGF0YV9hbmRfbW0oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwbWVtX2RhdGEgKmRhdGEsCisJCQkJIHN0cnVjdCBtbV9zdHJ1Y3QgKipsb2NrZWRfbW0pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBOVUxMOworCSpsb2NrZWRfbW0gPSBOVUxMOworbG9ja19tbToKKwlkb3duX3JlYWQoJmRhdGEtPnNlbSk7CisJaWYgKFBNRU1fSVNfU1VCTUFQKGRhdGEpKSB7CisJCW1tID0gZ2V0X3Rhc2tfbW0oZGF0YS0+dGFzayk7CisJCWlmICghbW0pIHsKKyNpZiBQTUVNX0RFQlVHCisJCQlwcmludGsoInBtZW06IGNhbid0IHJlbWFwIHRhc2sgaXMgZ29uZSFcbiIpOworI2VuZGlmCisJCQl1cF9yZWFkKCZkYXRhLT5zZW0pOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXVwX3JlYWQoJmRhdGEtPnNlbSk7CisKKwlpZiAobW0pCisJCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisKKwlkb3duX3dyaXRlKCZkYXRhLT5zZW0pOworCS8qIGNoZWNrIHRoYXQgdGhlIGZpbGUgZGlkbid0IGdldCBtbWFwZWQgYmVmb3JlIHdlIGNvdWxkIHRha2UgdGhlCisJICogZGF0YSBzZW0sIHRoaXMgc2hvdWxkIGJlIHNhZmUgYi9jIHlvdSBjYW4gb25seSBzdWJtYXAgZWFjaCBmaWxlCisJICogb25jZSAqLworCWlmIChQTUVNX0lTX1NVQk1BUChkYXRhKSAmJiAhbW0pIHsKKwkJcG1lbV91bmxvY2tfZGF0YV9hbmRfbW0oZGF0YSwgbW0pOworCQl1cF93cml0ZSgmZGF0YS0+c2VtKTsKKwkJZ290byBsb2NrX21tOworCX0KKwkvKiBub3cgY2hlY2sgdGhhdCB2bWEubW0gaXMgc3RpbGwgdGhlcmUsIGl0IGNvdWxkIGhhdmUgYmVlbgorCSAqIGRlbGV0ZWQgYnkgdm1hX2Nsb3NlIGJlZm9yZSB3ZSBjb3VsZCBnZXQgdGhlIGRhdGEtPnNlbSAqLworCWlmICgoZGF0YS0+ZmxhZ3MgJiBQTUVNX0ZMQUdTX1VOU1VCTUFQKSAmJiAobW0gIT0gTlVMTCkpIHsKKwkJLyogbWlnaHQgYXMgd2VsbCByZWxlYXNlIHRoaXMgKi8KKwkJaWYgKGRhdGEtPmZsYWdzICYgUE1FTV9GTEFHU19TVUJNQVApIHsKKwkJCXB1dF90YXNrX3N0cnVjdChkYXRhLT50YXNrKTsKKwkJCWRhdGEtPnRhc2sgPSBOVUxMOworCQkJLyogbG93ZXIgdGhlIHN1Ym1hcCBmbGFnIHRvIHNob3cgdGhlIG1tIGlzIGdvbmUgKi8KKwkJCWRhdGEtPmZsYWdzICY9IH4oUE1FTV9GTEFHU19TVUJNQVApOworCQl9CisJCXBtZW1fdW5sb2NrX2RhdGFfYW5kX21tKGRhdGEsIG1tKTsKKwkJcmV0dXJuIC0xOworCX0KKwkqbG9ja2VkX21tID0gbW07CisJcmV0dXJuIHJldDsKK30KKworaW50IHBtZW1fcmVtYXAoc3RydWN0IHBtZW1fcmVnaW9uICpyZWdpb24sIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICB1bnNpZ25lZCBvcGVyYXRpb24pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcG1lbV9yZWdpb25fbm9kZSAqcmVnaW9uX25vZGU7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVsdCwgKmVsdDI7CisJaW50IGlkID0gZ2V0X2lkKGZpbGUpOworCXN0cnVjdCBwbWVtX2RhdGEgKmRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCS8qIHBtZW0gcmVnaW9uIG11c3QgYmUgYWxpZ25lZCBvbiBhIHBhZ2UgYm91bmRyeSAqLworCWlmICh1bmxpa2VseSghUE1FTV9JU19QQUdFX0FMSUdORUQocmVnaW9uLT5vZmZzZXQpIHx8CisJCSAhUE1FTV9JU19QQUdFX0FMSUdORUQocmVnaW9uLT5sZW4pKSkgeworI2lmIFBNRU1fREVCVUcKKwkJcHJpbnRrKCJwbWVtOiByZXF1ZXN0IGZvciB1bmFsaWduZWQgcG1lbSBzdWJhbGxvY2F0aW9uICIKKwkJICAgICAgICIlbHggJWx4XG4iLCByZWdpb24tPm9mZnNldCwgcmVnaW9uLT5sZW4pOworI2VuZGlmCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGlmIHVzZXJzcGFjZSByZXF1ZXN0cyBhIHJlZ2lvbiBvZiBsZW4gMCwgdGhlcmUncyBub3RoaW5nIHRvIGRvICovCisJaWYgKHJlZ2lvbi0+bGVuID09IDApCisJCXJldHVybiAwOworCisJLyogbG9jayB0aGUgbW0gYW5kIGRhdGEgKi8KKwlyZXQgPSBwbWVtX2xvY2tfZGF0YV9hbmRfbW0oZmlsZSwgZGF0YSwgJm1tKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gMDsKKworCS8qIG9ubHkgdGhlIG93bmVyIG9mIHRoZSBtYXN0ZXIgZmlsZSBjYW4gcmVtYXAgdGhlIGNsaWVudCBmZHMKKwkgKiB0aGF0IGJhY2sgaW4gaXQgKi8KKwlpZiAoIWlzX21hc3Rlcl9vd25lcihmaWxlKSkgeworI2lmIFBNRU1fREVCVUcKKwkJcHJpbnRrKCJwbWVtOiByZW1hcCByZXF1ZXN0ZWQgZnJvbSBub24tbWFzdGVyIHByb2Nlc3NcbiIpOworI2VuZGlmCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCS8qIGNoZWNrIHRoYXQgdGhlIHJlcXVlc3RlZCByYW5nZSBpcyB3aXRoaW4gdGhlIHNyYyBhbGxvY2F0aW9uICovCisJaWYgKHVubGlrZWx5KChyZWdpb24tPm9mZnNldCA+IHBtZW1fbGVuKGlkLCBkYXRhKSkgfHwKKwkJICAgICAocmVnaW9uLT5sZW4gPiBwbWVtX2xlbihpZCwgZGF0YSkpIHx8CisJCSAgICAgKHJlZ2lvbi0+b2Zmc2V0ICsgcmVnaW9uLT5sZW4gPiBwbWVtX2xlbihpZCwgZGF0YSkpKSkgeworI2lmIFBNRU1fREVCVUcKKwkJcHJpbnRrKEtFUk5fSU5GTyAicG1lbTogc3ViYWxsb2MgZG9lc24ndCBmaXQgaW4gc3JjX2ZpbGUhXG4iKTsKKyNlbmRpZgorCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAob3BlcmF0aW9uID09IFBNRU1fTUFQKSB7CisJCXJlZ2lvbl9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBtZW1fcmVnaW9uX25vZGUpLAorCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghcmVnaW9uX25vZGUpIHsKKwkJCXJldCA9IC1FTk9NRU07CisjaWYgUE1FTV9ERUJVRworCQkJcHJpbnRrKEtFUk5fSU5GTyAiTm8gc3BhY2UgdG8gYWxsb2NhdGUgbWV0YWRhdGEhIik7CisjZW5kaWYKKwkJCWdvdG8gZXJyOworCQl9CisJCXJlZ2lvbl9ub2RlLT5yZWdpb24gPSAqcmVnaW9uOworCQlsaXN0X2FkZCgmcmVnaW9uX25vZGUtPmxpc3QsICZkYXRhLT5yZWdpb25fbGlzdCk7CisJfSBlbHNlIGlmIChvcGVyYXRpb24gPT0gUE1FTV9VTk1BUCkgeworCQlpbnQgZm91bmQgPSAwOworCQlsaXN0X2Zvcl9lYWNoX3NhZmUoZWx0LCBlbHQyLCAmZGF0YS0+cmVnaW9uX2xpc3QpIHsKKwkJCXJlZ2lvbl9ub2RlID0gbGlzdF9lbnRyeShlbHQsIHN0cnVjdCBwbWVtX3JlZ2lvbl9ub2RlLAorCQkJCSAgICAgIGxpc3QpOworCQkJaWYgKHJlZ2lvbi0+bGVuID09IDAgfHwKKwkJCSAgICAocmVnaW9uX25vZGUtPnJlZ2lvbi5vZmZzZXQgPT0gcmVnaW9uLT5vZmZzZXQgJiYKKwkJCSAgICByZWdpb25fbm9kZS0+cmVnaW9uLmxlbiA9PSByZWdpb24tPmxlbikpIHsKKwkJCQlsaXN0X2RlbChlbHQpOworCQkJCWtmcmVlKHJlZ2lvbl9ub2RlKTsKKwkJCQlmb3VuZCA9IDE7CisJCQl9CisJCX0KKwkJaWYgKCFmb3VuZCkgeworI2lmIFBNRU1fREVCVUcKKwkJCXByaW50aygicG1lbTogVW5tYXAgcmVnaW9uIGRvZXMgbm90IG1hcCBhbnkgbWFwcGVkICIKKwkJCQkicmVnaW9uISIpOworI2VuZGlmCisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlpZiAoZGF0YS0+dm1hICYmIFBNRU1fSVNfU1VCTUFQKGRhdGEpKSB7CisJCWlmIChvcGVyYXRpb24gPT0gUE1FTV9NQVApCisJCQlyZXQgPSBwbWVtX3JlbWFwX3Bmbl9yYW5nZShpZCwgZGF0YS0+dm1hLCBkYXRhLAorCQkJCQkJICAgcmVnaW9uLT5vZmZzZXQsIHJlZ2lvbi0+bGVuKTsKKwkJZWxzZSBpZiAob3BlcmF0aW9uID09IFBNRU1fVU5NQVApCisJCQlyZXQgPSBwbWVtX3VubWFwX3Bmbl9yYW5nZShpZCwgZGF0YS0+dm1hLCBkYXRhLAorCQkJCQkJICAgcmVnaW9uLT5vZmZzZXQsIHJlZ2lvbi0+bGVuKTsKKwl9CisKK2VycjoKKwlwbWVtX3VubG9ja19kYXRhX2FuZF9tbShkYXRhLCBtbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcG1lbV9yZXZva2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwbWVtX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHBtZW1fcmVnaW9uX25vZGUgKnJlZ2lvbl9ub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgKmVsdCwgKmVsdDI7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBOVUxMOworCWludCBpZCA9IGdldF9pZChmaWxlKTsKKwlpbnQgcmV0ID0gMDsKKworCWRhdGEtPm1hc3Rlcl9maWxlID0gTlVMTDsKKwlyZXQgPSBwbWVtX2xvY2tfZGF0YV9hbmRfbW0oZmlsZSwgZGF0YSwgJm1tKTsKKwkvKiBpZiBsb2NrX2RhdGFfYW5kX21tIGZhaWxzIGVpdGhlciB0aGUgdGFzayB0aGF0IG1hcHBlZCB0aGUgZmQsIG9yCisJICogdGhlIHZtYSB0aGF0IG1hcHBlZCBpdCBoYXZlIGFscmVhZHkgZ29uZSBhd2F5LCBub3RoaW5nIG1vcmUKKwkgKiBuZWVkcyB0byBiZSBkb25lICovCisJaWYgKHJldCkKKwkJcmV0dXJuOworCS8qIHVubWFwIGV2ZXJ5dGhpbmcgKi8KKwkvKiBkZWxldGUgdGhlIHJlZ2lvbnMgYW5kIHJlZ2lvbiBsaXN0IG5vdGhpbmcgaXMgbWFwcGVkIGFueSBtb3JlICovCisJaWYgKGRhdGEtPnZtYSkKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKGVsdCwgZWx0MiwgJmRhdGEtPnJlZ2lvbl9saXN0KSB7CisJCQlyZWdpb25fbm9kZSA9IGxpc3RfZW50cnkoZWx0LCBzdHJ1Y3QgcG1lbV9yZWdpb25fbm9kZSwKKwkJCQkJCSBsaXN0KTsKKwkJCXBtZW1fdW5tYXBfcGZuX3JhbmdlKGlkLCBkYXRhLT52bWEsIGRhdGEsCisJCQkJCSAgICAgcmVnaW9uX25vZGUtPnJlZ2lvbi5vZmZzZXQsCisJCQkJCSAgICAgcmVnaW9uX25vZGUtPnJlZ2lvbi5sZW4pOworCQkJbGlzdF9kZWwoZWx0KTsKKwkJCWtmcmVlKHJlZ2lvbl9ub2RlKTsKKwl9CisJLyogZGVsZXRlIHRoZSBtYXN0ZXIgZmlsZSAqLworCXBtZW1fdW5sb2NrX2RhdGFfYW5kX21tKGRhdGEsIG1tKTsKK30KKworc3RhdGljIHZvaWQgcG1lbV9nZXRfc2l6ZShzdHJ1Y3QgcG1lbV9yZWdpb24gKnJlZ2lvbiwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHBtZW1fZGF0YSAqZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBpZCA9IGdldF9pZChmaWxlKTsKKworCWlmICghaGFzX2FsbG9jYXRpb24oZmlsZSkpIHsKKwkJcmVnaW9uLT5vZmZzZXQgPSAwOworCQlyZWdpb24tPmxlbiA9IDA7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQlyZWdpb24tPm9mZnNldCA9IHBtZW1fc3RhcnRfYWRkcihpZCwgZGF0YSk7CisJCXJlZ2lvbi0+bGVuID0gcG1lbV9sZW4oaWQsIGRhdGEpOworCX0KKwlETE9HKCJvZmZzZXQgJWx4IGxlbiAlbHhcbiIsIHJlZ2lvbi0+b2Zmc2V0LCByZWdpb24tPmxlbik7Cit9CisKKworc3RhdGljIGxvbmcgcG1lbV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHBtZW1fZGF0YSAqZGF0YTsKKwlpbnQgaWQgPSBnZXRfaWQoZmlsZSk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUE1FTV9HRVRfUEhZUzoKKwkJeworCQkJc3RydWN0IHBtZW1fcmVnaW9uIHJlZ2lvbjsKKwkJCURMT0coImdldF9waHlzXG4iKTsKKwkJCWlmICghaGFzX2FsbG9jYXRpb24oZmlsZSkpIHsKKwkJCQlyZWdpb24ub2Zmc2V0ID0gMDsKKwkJCQlyZWdpb24ubGVuID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCQkJCXJlZ2lvbi5vZmZzZXQgPSBwbWVtX3N0YXJ0X2FkZHIoaWQsIGRhdGEpOworCQkJCXJlZ2lvbi5sZW4gPSBwbWVtX2xlbihpZCwgZGF0YSk7CisJCQl9CisJCQlwcmludGsoS0VSTl9JTkZPICJwbWVtOiByZXF1ZXN0IGZvciBwaHlzaWNhbCBhZGRyZXNzIG9mIHBtZW0gcmVnaW9uICIKKwkJCQkJImZyb20gcHJvY2VzcyAlZC5cbiIsIGN1cnJlbnQtPnBpZCk7CisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnJlZ2lvbiwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgcG1lbV9yZWdpb24pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBQTUVNX01BUDoKKwkJeworCQkJc3RydWN0IHBtZW1fcmVnaW9uIHJlZ2lvbjsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmcmVnaW9uLCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJCQlzaXplb2Yoc3RydWN0IHBtZW1fcmVnaW9uKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlkYXRhID0gKHN0cnVjdCBwbWVtX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJCQlyZXR1cm4gcG1lbV9yZW1hcCgmcmVnaW9uLCBmaWxlLCBQTUVNX01BUCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQTUVNX1VOTUFQOgorCQl7CisJCQlzdHJ1Y3QgcG1lbV9yZWdpb24gcmVnaW9uOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZyZWdpb24sICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJCXNpemVvZihzdHJ1Y3QgcG1lbV9yZWdpb24pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwkJCXJldHVybiBwbWVtX3JlbWFwKCZyZWdpb24sIGZpbGUsIFBNRU1fVU5NQVApOworCQkJYnJlYWs7CisJCX0KKwljYXNlIFBNRU1fR0VUX1NJWkU6CisJCXsKKwkJCXN0cnVjdCBwbWVtX3JlZ2lvbiByZWdpb247CisJCQlETE9HKCJnZXRfc2l6ZVxuIik7CisJCQlwbWVtX2dldF9zaXplKCZyZWdpb24sIGZpbGUpOworCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZyZWdpb24sCisJCQkJCQlzaXplb2Yoc3RydWN0IHBtZW1fcmVnaW9uKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCWNhc2UgUE1FTV9HRVRfVE9UQUxfU0laRToKKwkJeworCQkJc3RydWN0IHBtZW1fcmVnaW9uIHJlZ2lvbjsKKwkJCURMT0coImdldCB0b3RhbCBzaXplXG4iKTsKKwkJCXJlZ2lvbi5vZmZzZXQgPSAwOworCQkJZ2V0X2lkKGZpbGUpOworCQkJcmVnaW9uLmxlbiA9IHBtZW1baWRdLnNpemU7CisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnJlZ2lvbiwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgcG1lbV9yZWdpb24pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBQTUVNX0FMTE9DQVRFOgorCQl7CisJCQlpZiAoaGFzX2FsbG9jYXRpb24oZmlsZSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlkYXRhID0gKHN0cnVjdCBwbWVtX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJCQlkYXRhLT5pbmRleCA9IHBtZW1fYWxsb2NhdGUoaWQsIGFyZyk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgUE1FTV9DT05ORUNUOgorCQlETE9HKCJjb25uZWN0XG4iKTsKKwkJcmV0dXJuIHBtZW1fY29ubmVjdChhcmcsIGZpbGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAocG1lbVtpZF0uaW9jdGwpCisJCQlyZXR1cm4gcG1lbVtpZF0uaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZiBQTUVNX0RFQlVHCitzdGF0aWMgc3NpemVfdCBkZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRlYnVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCSAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVsdCwgKmVsdDI7CisJc3RydWN0IHBtZW1fZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgcG1lbV9yZWdpb25fbm9kZSAqcmVnaW9uX25vZGU7CisJaW50IGlkID0gKGludClmaWxlLT5wcml2YXRlX2RhdGE7CisJY29uc3QgaW50IGRlYnVnX2J1Zm1heCA9IDQwOTY7CisJc3RhdGljIGNoYXIgYnVmZmVyWzQwOTZdOworCWludCBuID0gMDsKKworCURMT0coImRlYnVnIG9wZW5cbiIpOworCW4gPSBzY25wcmludGYoYnVmZmVyLCBkZWJ1Z19idWZtYXgsCisJCSAgICAgICJwaWQgIzogbWFwcGVkIHJlZ2lvbnMgKG9mZnNldCwgbGVuKSAob2Zmc2V0LGxlbikuLi5cbiIpOworCisJZG93bigmcG1lbVtpZF0uZGF0YV9saXN0X3NlbSk7CisJbGlzdF9mb3JfZWFjaChlbHQsICZwbWVtW2lkXS5kYXRhX2xpc3QpIHsKKwkJZGF0YSA9IGxpc3RfZW50cnkoZWx0LCBzdHJ1Y3QgcG1lbV9kYXRhLCBsaXN0KTsKKwkJZG93bl9yZWFkKCZkYXRhLT5zZW0pOworCQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLCAicGlkICV1OiIsCisJCQkJZGF0YS0+cGlkKTsKKwkJbGlzdF9mb3JfZWFjaChlbHQyLCAmZGF0YS0+cmVnaW9uX2xpc3QpIHsKKwkJCXJlZ2lvbl9ub2RlID0gbGlzdF9lbnRyeShlbHQyLCBzdHJ1Y3QgcG1lbV9yZWdpb25fbm9kZSwKKwkJCQkgICAgICBsaXN0KTsKKwkJCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCisJCQkJCSIoJWx4LCVseCkgIiwKKwkJCQkJcmVnaW9uX25vZGUtPnJlZ2lvbi5vZmZzZXQsCisJCQkJCXJlZ2lvbl9ub2RlLT5yZWdpb24ubGVuKTsKKwkJfQorCQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLCAiXG4iKTsKKwkJdXBfcmVhZCgmZGF0YS0+c2VtKTsKKwl9CisJdXAoJnBtZW1baWRdLmRhdGFfbGlzdF9zZW0pOworCisJbisrOworCWJ1ZmZlcltuXSA9IDA7CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGJ1ZmZlciwgbik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnX2ZvcHMgPSB7CisJLnJlYWQgPSBkZWJ1Z19yZWFkLAorCS5vcGVuID0gZGVidWdfb3BlbiwKK307CisjZW5kaWYKKworI2lmIDAKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBwbWVtX2RldiA9IHsKKwkubmFtZSA9ICJwbWVtIiwKKwkuZm9wcyA9ICZwbWVtX2ZvcHMsCit9OworI2VuZGlmCisKK2ludCBwbWVtX3NldHVwKHN0cnVjdCBhbmRyb2lkX3BtZW1fcGxhdGZvcm1fZGF0YSAqcGRhdGEsCisJICAgICAgIGxvbmcgKCppb2N0bCkoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKSwKKwkgICAgICAgaW50ICgqcmVsZWFzZSkoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopKQoreworCWludCBlcnIgPSAwOworCWludCBpLCBpbmRleCA9IDA7CisJaW50IGlkID0gaWRfY291bnQ7CisJaWRfY291bnQrKzsKKworCXBtZW1baWRdLm5vX2FsbG9jYXRvciA9IHBkYXRhLT5ub19hbGxvY2F0b3I7CisJcG1lbVtpZF0uY2FjaGVkID0gcGRhdGEtPmNhY2hlZDsKKwlwbWVtW2lkXS5idWZmZXJlZCA9IHBkYXRhLT5idWZmZXJlZDsKKwlwbWVtW2lkXS5iYXNlID0gcGRhdGEtPnN0YXJ0OworCXBtZW1baWRdLnNpemUgPSBwZGF0YS0+c2l6ZTsKKwlwbWVtW2lkXS5pb2N0bCA9IGlvY3RsOworCXBtZW1baWRdLnJlbGVhc2UgPSByZWxlYXNlOworCWluaXRfcndzZW0oJnBtZW1baWRdLmJpdG1hcF9zZW0pOworCWluaXRfTVVURVgoJnBtZW1baWRdLmRhdGFfbGlzdF9zZW0pOworCUlOSVRfTElTVF9IRUFEKCZwbWVtW2lkXS5kYXRhX2xpc3QpOworCXBtZW1baWRdLmRldi5uYW1lID0gcGRhdGEtPm5hbWU7CisJcG1lbVtpZF0uZGV2Lm1pbm9yID0gaWQ7CisJcG1lbVtpZF0uZGV2LmZvcHMgPSAmcG1lbV9mb3BzOworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlZCBpbml0XG4iLCBwZGF0YS0+bmFtZSwgcGRhdGEtPmNhY2hlZCk7CisKKwllcnIgPSBtaXNjX3JlZ2lzdGVyKCZwbWVtW2lkXS5kZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIlVuYWJsZSB0byByZWdpc3RlciBwbWVtIGRyaXZlciFcbiIpOworCQlnb3RvIGVycl9jYW50X3JlZ2lzdGVyX2RldmljZTsKKwl9CisJcG1lbVtpZF0ubnVtX2VudHJpZXMgPSBwbWVtW2lkXS5zaXplIC8gUE1FTV9NSU5fQUxMT0M7CisKKwlwbWVtW2lkXS5iaXRtYXAgPSBrbWFsbG9jKHBtZW1baWRdLm51bV9lbnRyaWVzICoKKwkJCQkgIHNpemVvZihzdHJ1Y3QgcG1lbV9iaXRzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwbWVtW2lkXS5iaXRtYXApCisJCWdvdG8gZXJyX25vX21lbV9mb3JfbWV0YWRhdGE7CisKKwltZW1zZXQocG1lbVtpZF0uYml0bWFwLCAwLCBzaXplb2Yoc3RydWN0IHBtZW1fYml0cykgKgorCQkJCQkgIHBtZW1baWRdLm51bV9lbnRyaWVzKTsKKworCWZvciAoaSA9IHNpemVvZihwbWVtW2lkXS5udW1fZW50cmllcykgKiA4IC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKChwbWVtW2lkXS5udW1fZW50cmllcykgJiAgMTw8aSkgeworCQkJUE1FTV9PUkRFUihpZCwgaW5kZXgpID0gaTsKKwkJCWluZGV4ID0gUE1FTV9ORVhUX0lOREVYKGlkLCBpbmRleCk7CisJCX0KKwl9CisKKwlpZiAocG1lbVtpZF0uY2FjaGVkKQorCQlwbWVtW2lkXS52YmFzZSA9IGlvcmVtYXBfY2FjaGVkKHBtZW1baWRdLmJhc2UsCisJCQkJCQlwbWVtW2lkXS5zaXplKTsKKyNpZmRlZiBpb3JlbWFwX2V4dF9idWZmZXJlZAorCWVsc2UgaWYgKHBtZW1baWRdLmJ1ZmZlcmVkKQorCQlwbWVtW2lkXS52YmFzZSA9IGlvcmVtYXBfZXh0X2J1ZmZlcmVkKHBtZW1baWRdLmJhc2UsCisJCQkJCQkgICAgICBwbWVtW2lkXS5zaXplKTsKKyNlbmRpZgorCWVsc2UKKwkJcG1lbVtpZF0udmJhc2UgPSBpb3JlbWFwKHBtZW1baWRdLmJhc2UsIHBtZW1baWRdLnNpemUpOworCisJaWYgKHBtZW1baWRdLnZiYXNlID09IDApCisJCWdvdG8gZXJyb3JfY2FudF9yZW1hcDsKKworCXBtZW1baWRdLmdhcmJhZ2VfcGZuID0gcGFnZV90b19wZm4oYWxsb2NfcGFnZShHRlBfS0VSTkVMKSk7CisJaWYgKHBtZW1baWRdLm5vX2FsbG9jYXRvcikKKwkJcG1lbVtpZF0uYWxsb2NhdGVkID0gMDsKKworI2lmIFBNRU1fREVCVUcKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKHBkYXRhLT5uYW1lLCBTX0lGUkVHIHwgU19JUlVHTywgTlVMTCwgKHZvaWQgKilpZCwKKwkJCSAgICAmZGVidWdfZm9wcyk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK2Vycm9yX2NhbnRfcmVtYXA6CisJa2ZyZWUocG1lbVtpZF0uYml0bWFwKTsKK2Vycl9ub19tZW1fZm9yX21ldGFkYXRhOgorCW1pc2NfZGVyZWdpc3RlcigmcG1lbVtpZF0uZGV2KTsKK2Vycl9jYW50X3JlZ2lzdGVyX2RldmljZToKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcG1lbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhbmRyb2lkX3BtZW1fcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisKKwlpZiAoIXBkZXYgfHwgIXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKSB7CisJCXByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gcHJvYmUgcG1lbSFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJcmV0dXJuIHBtZW1fc2V0dXAocGRhdGEsIE5VTEwsIE5VTEwpOworfQorCisKK3N0YXRpYyBpbnQgcG1lbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgaWQgPSBwZGV2LT5pZDsKKwlfX2ZyZWVfcGFnZShwZm5fdG9fcGFnZShwbWVtW2lkXS5nYXJiYWdlX3BmbikpOworCW1pc2NfZGVyZWdpc3RlcigmcG1lbVtpZF0uZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcG1lbV9kcml2ZXIgPSB7CisJLnByb2JlID0gcG1lbV9wcm9iZSwKKwkucmVtb3ZlID0gcG1lbV9yZW1vdmUsCisJLmRyaXZlciA9IHsgLm5hbWUgPSAiYW5kcm9pZF9wbWVtIiB9Cit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IHBtZW1faW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBtZW1fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBtZW1fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwbWVtX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBtZW1faW5pdCk7Cittb2R1bGVfZXhpdChwbWVtX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vcWRzcDUvYWRzcC5jIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3Fkc3A1L2Fkc3AuYwppbmRleCBkMDk2NDU2Li45MDY5NTM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vcWRzcDUvYWRzcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9xZHNwNS9hZHNwLmMKQEAgLTMyLDE2ICszMiwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2FrZWxvY2suaD4KIAotc3RhdGljIHN0cnVjdCB3YWtlX2xvY2sgYWRzcF93YWtlX2xvY2s7CiBzdGF0aWMgaW5saW5lIHZvaWQgcHJldmVudF9zdXNwZW5kKHZvaWQpCiB7Ci0Jd2FrZV9sb2NrKCZhZHNwX3dha2VfbG9jayk7CiB9CiBzdGF0aWMgaW5saW5lIHZvaWQgYWxsb3dfc3VzcGVuZCh2b2lkKQogewotCXdha2VfdW5sb2NrKCZhZHNwX3dha2VfbG9jayk7CiB9CiAKICNpbmNsdWRlIDxsaW51eC9pby5oPgpAQCAtMTA0Niw3ICsxMDQyLDYgQEAKIAogCXByX2luZm8oImFkc3A6IHByb2JlXG4iKTsKIAotCXdha2VfbG9ja19pbml0KCZhZHNwX3dha2VfbG9jaywgV0FLRV9MT0NLX1NVU1BFTkQsICJhZHNwIik7CiAjaWYgQ09ORklHX01TTV9BTVNTX1ZFUlNJT04gPj0gNjM1MAogCWFkc3BfaW5mby5pbml0X2luZm9fcHRyID0ga3phbGxvYygKIAkJKHNpemVvZihzdHJ1Y3QgYWRzcF9ydG9zX21wX210b2FfaW5pdF9pbmZvX3R5cGUpKSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vcWRzcDUvYXVkaW9fb3V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vcWRzcDUvYXVkaW9fb3V0LmMKaW5kZXggZDFhZGNmNi4uZGY4N2NhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3Fkc3A1L2F1ZGlvX291dC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9xZHNwNS9hdWRpb19vdXQuYwpAQCAtMzgsOCArMzgsNiBAQAogI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwcGNtZGkuaD4KICNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHBtc2cuaD4KIAotI2luY2x1ZGUgPG1hY2gvaHRjX3B3cnNpbmsuaD4KLQogI2luY2x1ZGUgImV2bG9nLmgiCiAKICNkZWZpbmUgTE9HX0FVRElPX0VWRU5UUyAxCkBAIC0yNjAsNyArMjU4LDYgQEAKIAl9CiAKIAlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JaHRjX3B3cnNpbmtfc2V0KFBXUlNJTktfQVVESU8sIDEwMCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY5NSw3ICs2OTIsNiBAQAogCWF1ZGlvX2ZsdXNoKGF1ZGlvKTsKIAlhdWRpby0+b3BlbmVkID0gMDsKIAltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlodGNfcHdyc2lua19zZXQoUFdSU0lOS19BVURJTywgMCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zbWQvc21kX3FtaS5jIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3NtZC9zbWRfcW1pLmMKaW5kZXggZDRlN2Q4OC4uNjg3ZGIxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3NtZC9zbWRfcW1pLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3NtZC9zbWRfcW1pLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dha2Vsb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPG1hY2gvbXNtX3NtZC5oPgpAQCAtNzQsNyArNzMsNiBAQAogCiAJc21kX2NoYW5uZWxfdCAqY2g7CiAJY29uc3QgY2hhciAqY2hfbmFtZTsKLQlzdHJ1Y3Qgd2FrZV9sb2NrIHdha2VfbG9jazsKIAogCXN0cnVjdCB3b3JrX3N0cnVjdCBvcGVuX3dvcms7CiAJc3RydWN0IHdvcmtfc3RydWN0IHJlYWRfd29yazsKQEAgLTkwLDcgKzg4LDYgQEAKIAltdXRleF9pbml0KCZjdHh0LT5sb2NrKTsKIAlJTklUX1dPUksoJmN0eHQtPnJlYWRfd29yaywgcW1pX3JlYWRfd29yayk7CiAJSU5JVF9XT1JLKCZjdHh0LT5vcGVuX3dvcmssIHFtaV9vcGVuX3dvcmspOwotCXdha2VfbG9ja19pbml0KCZjdHh0LT53YWtlX2xvY2ssIFdBS0VfTE9DS19TVVNQRU5ELCBjdHh0LT5taXNjLm5hbWUpOwogCWN0eHQtPmN0bF90eG5faWQgPSAxOwogCWN0eHQtPndkc190eG5faWQgPSAxOwogCWN0eHQtPndkc19idXN5ID0gMTsKQEAgLTQ1NCw3ICs0NTEsNiBAQAogCQlicmVhazsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZjdHh0LT5sb2NrKTsKLQogCXdha2VfdXAoJnFtaV93YWl0X3F1ZXVlKTsKIH0KIApAQCAtNTA5LDcgKzUwNSw2IEBACiAJCWludCBzejsKIAkJc3ogPSBzbWRfY3VyX3BhY2tldF9zaXplKGN0eHQtPmNoKTsKIAkJaWYgKChzeiA+IDApICYmIChzeiA8PSBzbWRfcmVhZF9hdmFpbChjdHh0LT5jaCkpKSB7Ci0JCQl3YWtlX2xvY2tfdGltZW91dCgmY3R4dC0+d2FrZV9sb2NrLCBIWiAvIDIpOwogCQkJcXVldWVfd29yayhxbWlfd3EsICZjdHh0LT5yZWFkX3dvcmspOwogCQl9CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3NtZC9zbWRfcnBjcm91dGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL3NtZF9ycGNyb3V0ZXIuYwppbmRleCBkNGE0YTg4Li41YWMyY2Q0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL3NtZF9ycGNyb3V0ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL3NtZF9ycGNyb3V0ZXIuYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L3dha2Vsb2NrLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC05Niw3ICs5NSw2IEBACiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNtZF9sb2NrKTsKIAogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpycGNyb3V0ZXJfd29ya3F1ZXVlOwotc3RhdGljIHN0cnVjdCB3YWtlX2xvY2sgcnBjcm91dGVyX3dha2VfbG9jazsKIHN0YXRpYyBpbnQgcnBjcm91dGVyX25lZWRfbGVuOwogCiBzdGF0aWMgYXRvbWljX3QgbmV4dF94aWQgPSBBVE9NSUNfSU5JVCgxKTsKQEAgLTI5MCw3ICsyODgsNiBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVwdC0+d2FpdF9xKTsKIAlJTklUX0xJU1RfSEVBRCgmZXB0LT5yZWFkX3EpOwogCXNwaW5fbG9ja19pbml0KCZlcHQtPnJlYWRfcV9sb2NrKTsKLQl3YWtlX2xvY2tfaW5pdCgmZXB0LT5yZWFkX3Ffd2FrZV9sb2NrLCBXQUtFX0xPQ0tfU1VTUEVORCwgInJwY19yZWFkIik7CiAJSU5JVF9MSVNUX0hFQUQoJmVwdC0+aW5jb21wbGV0ZSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWxfZW5kcG9pbnRzX2xvY2ssIGZsYWdzKTsKQEAgLTMxMyw3ICszMTAsNiBAQAogCWlmIChyYyA8IDApCiAJCXJldHVybiByYzsKIAotCXdha2VfbG9ja19kZXN0cm95KCZlcHQtPnJlYWRfcV93YWtlX2xvY2spOwogCWxpc3RfZGVsKCZlcHQtPmxpc3QpOwogCWtmcmVlKGVwdCk7CiAJcmV0dXJuIDA7CkBAIC01NDAsOCArNTM2LDYgQEAKIAlpZiAoZXZlbnQgIT0gU01EX0VWRU5UX0RBVEEpCiAJCXJldHVybjsKIAotCWlmIChzbWRfcmVhZF9hdmFpbChzbWRfY2hhbm5lbCkgPj0gcnBjcm91dGVyX25lZWRfbGVuKQotCQl3YWtlX2xvY2soJnJwY3JvdXRlcl93YWtlX2xvY2spOwogCXdha2VfdXAoJnNtZF93YWl0KTsKIH0KIApAQCAtNTc2LDcgKzU3MCw2IEBACiAJCQkJcmV0dXJuIC1FSU87CiAJCX0KIAkJcnBjcm91dGVyX25lZWRfbGVuID0gbGVuOwotCQl3YWtlX3VubG9jaygmcnBjcm91dGVyX3dha2VfbG9jayk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtZF9sb2NrLCBmbGFncyk7CiAKIC8vCQlwcmludGsoInJyX3JlYWQ6IHdhaXRpbmcgKCVkKVxuIiwgbGVuKTsKQEAgLTY3Niw3ICs2NjksNiBAQAogCiBwYWNrZXRfY29tcGxldGU6CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVwdC0+cmVhZF9xX2xvY2ssIGZsYWdzKTsKLQl3YWtlX2xvY2soJmVwdC0+cmVhZF9xX3dha2VfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmcGt0LT5saXN0LCAmZXB0LT5yZWFkX3EpOwogCXdha2VfdXAoJmVwdC0+d2FpdF9xKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcHQtPnJlYWRfcV9sb2NrLCBmbGFncyk7CkBAIC02OTksNyArNjkxLDYgQEAKIGZhaWxfaW86CiBmYWlsX2RhdGE6CiAJcHJpbnRrKEtFUk5fRVJSICJycGNfcm91dGVyIGhhcyBkaWVkXG4iKTsKLQl3YWtlX3VubG9jaygmcnBjcm91dGVyX3dha2VfbG9jayk7CiB9CiAKIHZvaWQgbXNtX3JwY19zZXR1cF9yZXEoc3RydWN0IHJwY19yZXF1ZXN0X2hkciAqaGRyLCB1aW50MzJfdCBwcm9nLApAQCAtMTA2MSw4ICsxMDUyLDYgQEAKIAkJcmV0dXJuIC1FVE9PU01BTEw7CiAJfQogCWxpc3RfZGVsKCZwa3QtPmxpc3QpOwotCWlmIChsaXN0X2VtcHR5KCZlcHQtPnJlYWRfcSkpCi0JCXdha2VfdW5sb2NrKCZlcHQtPnJlYWRfcV93YWtlX2xvY2spOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwdC0+cmVhZF9xX2xvY2ssIGZsYWdzKTsKIAogCXJjID0gcGt0LT5sZW5ndGg7CkBAIC0xMjI5LDcgKzEyMTgsNiBAQAogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmbmV3c2VydmVyX3dhaXQpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNtZF93YWl0KTsKLQl3YWtlX2xvY2tfaW5pdCgmcnBjcm91dGVyX3dha2VfbG9jaywgV0FLRV9MT0NLX1NVU1BFTkQsICJTTURfUlBDQ0FMTCIpOwogCiAJcnBjcm91dGVyX3dvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJycGNyb3V0ZXIiKTsKIAlpZiAoIXJwY3JvdXRlcl93b3JrcXVldWUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL3NtZF9ycGNyb3V0ZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zbWQvc21kX3JwY3JvdXRlci5oCmluZGV4IGE3NDE2YTIuLjg2YWI5OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zbWQvc21kX3JwY3JvdXRlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zbWQvc21kX3JwY3JvdXRlci5oCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC93YWtlbG9jay5oPgogCiAjaW5jbHVkZSA8bWFjaC9tc21fc21kLmg+CiAjaW5jbHVkZSA8bWFjaC9tc21fcnBjcm91dGVyLmg+CkBAIC0xNDQsNyArMTQzLDYgQEAKIAkvKiBjb21wbGV0ZSBwYWNrZXRzIHdhaXRpbmcgdG8gYmUgcmVhZCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgcmVhZF9xOwogCXNwaW5sb2NrX3QgcmVhZF9xX2xvY2s7Ci0Jc3RydWN0IHdha2VfbG9jayByZWFkX3Ffd2FrZV9sb2NrOwogCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcTsKIAl1bnNpZ25lZCBmbGFnczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3NtZC9zbWRfdHR5LmMgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL3NtZF90dHkuYwppbmRleCAyZWRkOWQxLi5mNDA5NDQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL3NtZF90dHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL3NtZF90dHkuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2FrZWxvY2suaD4KIAogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KQEAgLTM0LDcgKzMzLDYgQEAKIHN0cnVjdCBzbWRfdHR5X2luZm8gewogCXNtZF9jaGFubmVsX3QgKmNoOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7Ci0Jc3RydWN0IHdha2VfbG9jayB3YWtlX2xvY2s7CiAJaW50IG9wZW5fY291bnQ7CiB9OwogCkBAIC02OSw3ICs2Nyw2IEBACiAJCQlwcmludGsoS0VSTl9FUlIgIk9PUFMgLSBzbWRfdHR5X2J1ZmZlciBtaXNtYXRjaD8hIik7CiAJCX0KIAotCQl3YWtlX2xvY2tfdGltZW91dCgmaW5mby0+d2FrZV9sb2NrLCBIWiAvIDIpOwogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCX0KIApAQCAtOTUsNyArOTIsNiBAQAogCWluZm8gPSBzbWRfdHR5ICsgbjsKIAogCW11dGV4X2xvY2soJnNtZF90dHlfbG9jayk7Ci0Jd2FrZV9sb2NrX2luaXQoJmluZm8tPndha2VfbG9jaywgV0FLRV9MT0NLX1NVU1BFTkQsIG5hbWUpOwogCXR0eS0+ZHJpdmVyX2RhdGEgPSBpbmZvOwogCiAJaWYgKGluZm8tPm9wZW5fY291bnQrKyA9PSAwKSB7CkBAIC0xMjIsNyArMTE4LDYgQEAKIAlpZiAoLS1pbmZvLT5vcGVuX2NvdW50ID09IDApIHsKIAkJaW5mby0+dHR5ID0gMDsKIAkJdHR5LT5kcml2ZXJfZGF0YSA9IDA7Ci0JCXdha2VfbG9ja19kZXN0cm95KCZpbmZvLT53YWtlX2xvY2spOwogCQlpZiAoaW5mby0+Y2gpIHsKIAkJCXNtZF9jbG9zZShpbmZvLT5jaCk7CiAJCQlpbmZvLT5jaCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc3luYXB0aWNzX2kyY19ybWkuYyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zeW5hcHRpY3NfaTJjX3JtaS5jCmluZGV4IGFlNjk2ZDMuLjRkZTZiYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zeW5hcHRpY3NfaTJjX3JtaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zeW5hcHRpY3NfaTJjX3JtaS5jCkBAIC0zNzksNiArMzc5LDEyIEBACiAJCWdvdG8gZXJyX2NoZWNrX2Z1bmN0aW9uYWxpdHlfZmFpbGVkOwogCX0KIAorCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKSB7CisJCXByX2Vycigic3luYXB0aWNzX3RzX3Byb2JlOiBuZWVkIEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2NoZWNrX2Z1bmN0aW9uYWxpdHlfZmFpbGVkOworCX0KKwogCXRzID0ga3phbGxvYyhzaXplb2YoKnRzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHRzID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kc3QvY3J5cHRvLmMgYi9kcml2ZXJzL3N0YWdpbmcvZHN0L2NyeXB0by5jCmluZGV4IDcyNTBmOTAuLjM1MTI5NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kc3QvY3J5cHRvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RzdC9jcnlwdG8uYwpAQCAtNjQsNyArNjQsOCBAQAogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKmRzdF9pbml0X2NpcGhlcihzdHJ1Y3QgZHN0X2NyeXB0b19jdGwgKmN0bCwgdTggKmtleSkKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKmRzdF9pbml0X2NpcGhlcihzdHJ1Y3QgZHN0X2NyeXB0b19jdGwgKmN0bCwKKwkJdTggKmtleSkKIHsKIAlpbnQgZXJyID0gLUVJTlZBTDsKIAlzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKmNpcGhlcjsKQEAgLTEwNSw3ICsxMDYsNyBAQAogewogCXVuc2lnbmVkIGludCBpOwogCi0JZm9yIChpPTA7IGk8ZS0+cGFnZV9udW07ICsraSkKKwlmb3IgKGkgPSAwOyBpIDwgZS0+cGFnZV9udW07ICsraSkKIAkJX19mcmVlX3BhZ2UoZS0+cGFnZXNbaV0pOwogCWtmcmVlKGUtPnBhZ2VzKTsKIH0KQEAgLTExOCw3ICsxMTksNyBAQAogCWlmICghZS0+cGFnZXMpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZm9yIChpPTA7IGk8bnVtOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKIAkJZS0+cGFnZXNbaV0gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOwogCQlpZiAoIWUtPnBhZ2VzW2ldKQogCQkJZ290byBlcnJfb3V0X2ZyZWVfcGFnZXM7CkBAIC0xMzksNyArMTQwLDggQEAKICAqIEluaXRpYWxpemUgY3J5cHRvIGVuZ2luZSBmb3IgZ2l2ZW4gbm9kZS4KICAqIFNldHVwIGNpcGhlci9oYXNoLCBrZXlzLCBwb29sIG9mIHRocmVhZHMgYW5kIHByaXZhdGUgZGF0YS4KICAqLwotc3RhdGljIGludCBkc3RfY3J5cHRvX2VuZ2luZV9pbml0KHN0cnVjdCBkc3RfY3J5cHRvX2VuZ2luZSAqZSwgc3RydWN0IGRzdF9ub2RlICpuKQorc3RhdGljIGludCBkc3RfY3J5cHRvX2VuZ2luZV9pbml0KHN0cnVjdCBkc3RfY3J5cHRvX2VuZ2luZSAqZSwKKwkJc3RydWN0IGRzdF9ub2RlICpuKQogewogCWludCBlcnI7CiAJc3RydWN0IGRzdF9jcnlwdG9fY3RsICpjdGwgPSAmbi0+Y3J5cHRvOwpAQCAtMTk4LDggKzIwMCw3IEBACiAvKgogICogV2FpdGluZyBmb3IgY2lwaGVyIHByb2Nlc3NpbmcgdG8gYmUgY29tcGxldGVkLgogICovCi1zdHJ1Y3QgZHN0X2NyeXB0b19jb21wbGV0aW9uCi17CitzdHJ1Y3QgZHN0X2NyeXB0b19jb21wbGV0aW9uIHsKIAlzdHJ1Y3QgY29tcGxldGlvbgkJY29tcGxldGU7CiAJaW50CQkJCWVycm9yOwogfTsKQEAgLTIzNywxNyArMjM4LDE3IEBACiAJCWVyciA9IGNyeXB0b19hYmxrY2lwaGVyX2RlY3J5cHQocmVxKTsKIAogCXN3aXRjaCAoZXJyKSB7Ci0JCWNhc2UgLUVJTlBST0dSRVNTOgotCQljYXNlIC1FQlVTWToKLQkJCWVyciA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZjLmNvbXBsZXRlLAotCQkJCQl0aW1lb3V0KTsKLQkJCWlmICghZXJyKQotCQkJCWVyciA9IC1FVElNRURPVVQ7Ci0JCQllbHNlCi0JCQkJZXJyID0gYy5lcnJvcjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7CisJY2FzZSAtRUlOUFJPR1JFU1M6CisJY2FzZSAtRUJVU1k6CisJCWVyciA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZjLmNvbXBsZXRlLAorCQkJCXRpbWVvdXQpOworCQlpZiAoIWVycikKKwkJCWVyciA9IC1FVElNRURPVVQ7CisJCWVsc2UKKwkJCWVyciA9IGMuZXJyb3I7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOwogCX0KIAogCXJldHVybiBlcnI7CkBAIC0yNjMsNyArMjY0LDcgQEAKICAqIHRlbXBvcmFyeSBzdG9yYWdlLCB3aGljaCBpcyB0aGVuIGJlaW5nIHNlbnQgdG8gdGhlIHJlbW90ZSBwZWVyLgogICovCiBzdGF0aWMgaW50IGRzdF90cmFuc19pdGVyX291dChzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBkc3RfY3J5cHRvX2VuZ2luZSAqZSwKLQkJaW50ICgqIGl0ZXJhdG9yKSAoc3RydWN0IGRzdF9jcnlwdG9fZW5naW5lICplLAorCQlpbnQgKCppdGVyYXRvcikgKHN0cnVjdCBkc3RfY3J5cHRvX2VuZ2luZSAqZSwKIAkJCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAogCQkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMpKQogewpAQCAtMjg2LDcgKzI4Nyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZHN0X3RyYW5zX2l0ZXJfaW4oc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgZHN0X2NyeXB0b19lbmdpbmUgKmUsCi0JCWludCAoKiBpdGVyYXRvcikgKHN0cnVjdCBkc3RfY3J5cHRvX2VuZ2luZSAqZSwKKwkJaW50ICgqaXRlcmF0b3IpIChzdHJ1Y3QgZHN0X2NyeXB0b19lbmdpbmUgKmUsCiAJCQkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKIAkJCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjKSkKIHsKQEAgLTQxMSw5ICs0MTIsOSBAQAogICogSW5pdGlhbGl6ZSBjcnlwdG8gZW5naW5lIGZvciBnaXZlbiBub2RlOiBzdG9yZSBrZXlzLCBjcmVhdGUgcG9vbAogICogb2YgdGhyZWFkcywgaW5pdGlhbGl6ZSBlYWNoIG9uZS4KICAqCi0gKiBFYWNoIHRocmVhZCBoYXMgdW5pcXVlIElELCBidXQgMCBhbmQgMSBhcmUgcmVzZXJ2ZWQgZm9yIHJlY2VpdmluZyBhbmQgYWNjZXB0aW5nCi0gKiB0aHJlYWRzIChpZiBleHBvcnQgbm9kZSksIHNvIElEcyBjb3VsZCBzdGFydCBmcm9tIDIsIGJ1dCBzdGFydGluZyB0aGVtCi0gKiBmcm9tIDEwIGFsbG93cyBlYXNpbHkgdW5kZXJzdGFuZCB3aGF0IHRoaXMgdGhyZWFkIGlzIGZvci4KKyAqIEVhY2ggdGhyZWFkIGhhcyB1bmlxdWUgSUQsIGJ1dCAwIGFuZCAxIGFyZSByZXNlcnZlZCBmb3IgcmVjZWl2aW5nIGFuZAorICogYWNjZXB0aW5nIHRocmVhZHMgKGlmIGV4cG9ydCBub2RlKSwgc28gSURzIGNvdWxkIHN0YXJ0IGZyb20gMiwgYnV0IHN0YXJ0aW5nCisgKiB0aGVtIGZyb20gMTAgYWxsb3dzIGVhc2lseSB1bmRlcnN0YW5kIHdoYXQgdGhpcyB0aHJlYWQgaXMgZm9yLgogICovCiBpbnQgZHN0X25vZGVfY3J5cHRvX2luaXQoc3RydWN0IGRzdF9ub2RlICpuLCBzdHJ1Y3QgZHN0X2NyeXB0b19jdGwgKmN0bCkKIHsKQEAgLTQzNiwxMCArNDM3LDEwIEBACiAJfQogCW1lbWNweSgmbi0+Y3J5cHRvLCBjdGwsIHNpemVvZihzdHJ1Y3QgZHN0X2NyeXB0b19jdGwpKTsKIAotCWZvciAoaT0wOyBpPGN0bC0+dGhyZWFkX251bTsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IGN0bC0+dGhyZWFkX251bTsgKytpKSB7CiAJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzLWNyeXB0by0lZCIsIG4tPm5hbWUsIGkpOwogCQkvKiBVbmlxdWUgaWRzLi4uICovCi0JCWVyciA9IHRocmVhZF9wb29sX2FkZF93b3JrZXIobi0+cG9vbCwgbmFtZSwgaSsxMCwKKwkJZXJyID0gdGhyZWFkX3Bvb2xfYWRkX3dvcmtlcihuLT5wb29sLCBuYW1lLCBpICsgMTAsCiAJCQlkc3RfY3J5cHRvX3RocmVhZF9pbml0LCBkc3RfY3J5cHRvX3RocmVhZF9jbGVhbnVwLCBuKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZXJyX291dF9mcmVlX3RocmVhZHM7CkBAIC00OTYsOCArNDk3LDggQEAKIAkJCQlidi0+YnZfbGVuLCBidi0+YnZfb2Zmc2V0KTsKIAogCQlwID0ga21hcChidi0+YnZfcGFnZSkgKyBidi0+YnZfb2Zmc2V0OwotCQlmb3IgKGk9MDsgaTxidi0+YnZfbGVuOyArK2kpCi0JCQlwcmludGsoIiUwMnggIiwgcFtpXSk7CisJCWZvciAoaSA9IDA7IGkgPCBidi0+YnZfbGVuOyArK2kpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJTAyeCAiLCBwW2ldKTsKIAkJa3VubWFwKGJ2LT5idl9wYWdlKTsKIAkJcHJpbnRrKCJcbiIpOwogCX0KQEAgLTUzMiw3ICs1MzMsNyBAQAogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBiaW86ICVsbHUvJXUsIHJ3OiAlbHUsIGhhc2g6ICIsCiAJCQkJX19mdW5jX18sICh1NjQpYmlvLT5iaV9zZWN0b3IsCiAJCQkJYmlvLT5iaV9zaXplLCBiaW9fZGF0YV9kaXIoYmlvKSk7Ci0JCQlmb3IgKGk9MDsgaTxjcnlwdG9faGFzaF9kaWdlc3RzaXplKGUtPmhhc2gpOyArK2kpCisJCQlmb3IgKGkgPSAwOyBpIDwgY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShlLT5oYXNoKTsgKytpKQogCQkJCQlwcmludGsoIiUwMnggIiwgaGFzaFtpXSk7CiAJCQlwcmludGsoIlxuIik7CiAJCX0KQEAgLTU3Miw5ICs1NzMsOSBAQAogCQkJdW5zaWduZWQgaW50IGk7CiAKIAkJCXByaW50aygiLCByZWN2L2NhbGM6ICIpOwotCQkJZm9yIChpPTA7IGk8Y3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShlLT5oYXNoKTsgKytpKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShlLT5oYXNoKTsgKytpKQogCQkJCXByaW50aygiJTAyeC8lMDJ4ICIsIHJlY3ZfaGFzaFtpXSwgaGFzaFtpXSk7Ci0JCQl9CisKIAkJfQogCQlwcmludGsoIlxuIik7CiAjZW5kaWYKQEAgLTY4MCw4ICs2ODEsOSBAQAogCXN0cnVjdCBkc3RfZXhwb3J0X3ByaXYgKnAgPSBiaW8tPmJpX3ByaXZhdGU7CiAJaW50IGVycjsKIAotCWRwcmludGsoIiVzOiBlOiAlcCwgZGF0YTogJXAsIGJpbzogJWxsdS8ldSwgZGlyOiAlbHUuXG4iLCBfX2Z1bmNfXywKLQkJZSwgZS0+ZGF0YSwgKHU2NCliaW8tPmJpX3NlY3RvciwgYmlvLT5iaV9zaXplLCBiaW9fZGF0YV9kaXIoYmlvKSk7CisJZHByaW50aygiJXM6IGU6ICVwLCBkYXRhOiAlcCwgYmlvOiAlbGx1LyV1LCBkaXI6ICVsdS5cbiIsCisJCQlfX2Z1bmNfXywgZSwgZS0+ZGF0YSwgKHU2NCliaW8tPmJpX3NlY3RvciwKKwkJCWJpby0+Ymlfc2l6ZSwgYmlvX2RhdGFfZGlyKGJpbykpOwogCiAJZS0+ZW5jID0gKGJpb19kYXRhX2RpcihiaW8pID09IFJFQUQpOwogCWUtPml2ID0gcC0+Y21kLmlkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RzdC9kY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2RzdC9kY29yZS5jCmluZGV4IGMyNGU0ZTAuLmZkNWJkMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kc3QvZGNvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHN0L2Rjb3JlLmMKQEAgLTExNiw3ICsxMTYsNyBAQAogCQkgKiBiaW9fcndfZmxhZ2dlZChiaW8sIEJJT19SV19ESVNDQVJEKSBvbmx5LCB3aGljaCBkb2VzIG5vdAogCQkgKiB3b3JrIGluIHRoaXMgY2FzZS4KIAkJICovCi0JCS8vZXJyID0gLUVPUE5PVFNVUFA7CisJCS8qIGVyciA9IC1FT1BOT1RTVVBQOyAqLwogCQllcnIgPSAwOwogCQlnb3RvIGVuZF9pbzsKIAl9CkBAIC0xOTcsNyArMTk3LDggQEAKIAluLT5kaXNrLT5mb3BzID0gJmRzdF9ibGtfb3BzOwogCW4tPmRpc2stPnF1ZXVlID0gbi0+cXVldWU7CiAJbi0+ZGlzay0+cHJpdmF0ZV9kYXRhID0gbjsKLQlzbnByaW50ZihuLT5kaXNrLT5kaXNrX25hbWUsIHNpemVvZihuLT5kaXNrLT5kaXNrX25hbWUpLCAiZHN0LSVzIiwgbi0+bmFtZSk7CisJc25wcmludGYobi0+ZGlzay0+ZGlza19uYW1lLCBzaXplb2Yobi0+ZGlzay0+ZGlza19uYW1lKSwKKwkJCSJkc3QtJXMiLCBuLT5uYW1lKTsKIAogCXJldHVybiAwOwogCkBAIC0yNDYsNyArMjQ3LDggQEAKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXUuJXUuJXUuJXU6JWRcbiIsCiAJCQlOSVBRVUFEKHNpbi0+c2luX2FkZHIuc19hZGRyKSwgbnRvaHMoc2luLT5zaW5fcG9ydCkpOwogCX0gZWxzZSBpZiAoZmFtaWx5ID09IEFGX0lORVQ2KSB7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJmluZm8tPm5ldC5hZGRyOworCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKQorCQkJCSZpbmZvLT5uZXQuYWRkcjsKIAkJcmV0dXJuIHNwcmludGYoYnVmLAogCQkJIiVwaTY6JWRcbiIsCiAJCQkmc2luLT5zaW42X2FkZHIsIG50b2hzKHNpbi0+c2luNl9wb3J0KSk7CkBAIC0yNjEsNyArMjYzLDcgQEAKIAkJc3ogLT0gc2l6ZTsKIAkJYnVmICs9IHNpemU7CiAKLQkJZm9yIChpPTA7IGk8YWRkcmxlbjsgKytpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBhZGRybGVuOyArK2kpIHsKIAkJCWlmIChzeiA8IDMpCiAJCQkJYnJlYWs7CiAKQEAgLTI4Niw3ICsyODgsNyBAQAogewogCWludCBlcnIsIGk7CiAKLQlmb3IgKGk9MDsgaTxBUlJBWV9TSVpFKGRzdF9ub2RlX2F0dHJzKTsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHN0X25vZGVfYXR0cnMpOyArK2kpIHsKIAkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZuLT5pbmZvLT5kZXZpY2UsCiAJCQkJJmRzdF9ub2RlX2F0dHJzW2ldKTsKIAkJaWYgKGVycikKQEAgLTMwNiw3ICszMDgsNyBAQAogewogCWludCBpOwogCi0JZm9yIChpPTA7IGk8QVJSQVlfU0laRShkc3Rfbm9kZV9hdHRycyk7ICsraSkKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkc3Rfbm9kZV9hdHRycyk7ICsraSkKIAkJZGV2aWNlX3JlbW92ZV9maWxlKCZuLT5pbmZvLT5kZXZpY2UsCiAJCQkJJmRzdF9ub2RlX2F0dHJzW2ldKTsKIH0KQEAgLTM1OCw3ICszNjAsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBkc3RfaGFzaChjaGFyICpzdHIsIHVuc2lnbmVkIGludCBzaXplKQogewotCXJldHVybiAoamhhc2goc3RyLCBzaXplLCAwKSAlIGRzdF9oYXNodGFibGVfc2l6ZSk7CisJcmV0dXJuIGpoYXNoKHN0ciwgc2l6ZSwgMCkgJSBkc3RfaGFzaHRhYmxlX3NpemU7CiB9CiAKIHN0YXRpYyB2b2lkIGRzdF9ub2RlX3JlbW92ZShzdHJ1Y3QgZHN0X25vZGUgKm4pCkBAIC02NDEsNyArNjQzLDggQEAKIAlkc3Rfbm9kZV9zZXRfc2l6ZShuKTsKIAlhZGRfZGlzayhuLT5kaXNrKTsKIAotCWRwcmludGsoIkRTVDogc3RhcnRlZCByZW1vdGUgbm9kZSAnJXMnLCBtaW5vcjogJWQuXG4iLCBuLT5uYW1lLCBuLT5kaXNrLT5maXJzdF9taW5vcik7CisJZHByaW50aygiRFNUOiBzdGFydGVkIHJlbW90ZSBub2RlICclcycsIG1pbm9yOiAlZC5cbiIsCisJCQluLT5uYW1lLCBuLT5kaXNrLT5maXJzdF9taW5vcik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc0MCw3ICs3NDMsOCBAQAogCSAqIGNvdW50ZXIgd2lsbCBiZSBlcXVhbCB0byAxKSwKIAkgKiBhbmQgc3Vic2VxdWVudCBkc3Rfbm9kZV9wdXQoKSBjYWxscyB3aWxsIGZyZWUgdGhlIG5vZGUuCiAJICovCi0JZHByaW50aygiJXM6IGdvaW5nIHRvIHNsZWVwIHdpdGggJWQgcmVmY250LlxuIiwgX19mdW5jX18sIGF0b21pY19yZWFkKCZuLT5yZWZjbnQpKTsKKwlkcHJpbnRrKCIlczogZ29pbmcgdG8gc2xlZXAgd2l0aCAlZCByZWZjbnQuXG4iLAorCQkJX19mdW5jX18sIGF0b21pY19yZWFkKCZuLT5yZWZjbnQpKTsKIAl3YWl0X2V2ZW50KG4tPndhaXQsIGF0b21pY19yZWFkKCZuLT5yZWZjbnQpIDw9IDIpOwogCiAJZHN0X25vZGVfcHV0KG4pOwpAQCAtOTIxLDcgKzkyNSw3IEBACiAJaWYgKCFkc3RfaGFzaHRhYmxlKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWZvciAoaT0wOyBpPGRzdF9oYXNodGFibGVfc2l6ZTsgKytpKQorCWZvciAoaSA9IDA7IGkgPCBkc3RfaGFzaHRhYmxlX3NpemU7ICsraSkKIAkJSU5JVF9MSVNUX0hFQUQoJmRzdF9oYXNodGFibGVbaV0pOwogCiAJcmV0dXJuIDA7CkBAIC05MzIsNyArOTM2LDcgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAlzdHJ1Y3QgZHN0X25vZGUgKm4sICp0bXA7CiAKLQlmb3IgKGk9MDsgaTxkc3RfaGFzaHRhYmxlX3NpemU7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBkc3RfaGFzaHRhYmxlX3NpemU7ICsraSkgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobiwgdG1wLCAmZHN0X2hhc2h0YWJsZVtpXSwgbm9kZV9lbnRyeSkgewogCQkJZHN0X25vZGVfcmVtb3ZlX3VubG9hZChuKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RzdC9leHBvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9kc3QvZXhwb3J0LmMKaW5kZXggNGZiZDg0OC4uYzMyNDIzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RzdC9leHBvcnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHN0L2V4cG9ydC5jCkBAIC01Myw3ICs1Myw4IEBACiAgKiBpdHMgcGVybWlzc2lvbnMgYXJlIGNoZWNrZWQgaW4gYSBzZWN1cml0eSBhdHRyaWJ1dGVzIGFuZCBzZW50CiAgKiBiYWNrLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGRzdF9jaGVja19wZXJtaXNzaW9ucyhzdHJ1Y3QgZHN0X3N0YXRlICptYWluLCBzdHJ1Y3QgZHN0X3N0YXRlICpzdCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHN0X2NoZWNrX3Blcm1pc3Npb25zKHN0cnVjdCBkc3Rfc3RhdGUgKm1haW4sCisJCXN0cnVjdCBkc3Rfc3RhdGUgKnN0KQogewogCXN0cnVjdCBkc3Rfbm9kZSAqbiA9IG1haW4tPm5vZGU7CiAJc3RydWN0IGRzdF9zZWN1cmUgKnNlbnRyeTsKQEAgLTczLDkgKzc0LDkgQEAKIAogCQkvKgogCQkgKiBUaGlzICcyJyBiZWxvdyBpcyBhIHBvcnQgZmllbGQuIFRoaXMgbWF5IGJlIHZlcnkgd3JvbmcgdG8gZG8KLQkJICogaW4gYXRhbGsgZm9yIGV4YW1wbGUgdGhvdWdoLiBJZiB0aGVyZSB3aWxsIGJlIGFueSBuZWVkIHRvIGV4dGVudAotCQkgKiBwcm90b2NvbCB0byBzb21ldGhpbmcgZWxzZSwgSSBjYW4gY3JlYXRlIHBlci1mYW1pbHkgaGVscGVycyBhbmQKLQkJICogdXNlIHRoZW0gaW5zdGVhZCBvZiB0aGlzIG1lbWNtcC4KKwkJICogaW4gYXRhbGsgZm9yIGV4YW1wbGUgdGhvdWdoLiBJZiB0aGVyZSB3aWxsIGJlIGFueSBuZWVkCisJCSAqIHRvIGV4dGVudCBwcm90b2NvbCB0byBzb21ldGhpbmcgZWxzZSwgSSBjYW4gY3JlYXRlCisJCSAqIHBlci1mYW1pbHkgaGVscGVycyBhbmQgdXNlIHRoZW0gaW5zdGVhZCBvZiB0aGlzIG1lbWNtcC4KIAkJICovCiAJCWlmIChtZW1jbXAocy0+YWRkci5zYV9kYXRhICsgMiwgc2EtPnNhX2RhdGEgKyAyLAogCQkJCQlzYS0+c2FfZGF0YV9sZW4gLSAyKSkKQEAgLTEyNSw4ICsxMjYsOCBAQAogCQkJCSAqIE1hZ2ljIEhaPyBQb2xsaW5nIGNoZWNrIGFib3ZlIGlzIG5vdCBzYWZlIGluCiAJCQkJICogYWxsIGNhc2VzIChsaWtlIHNvY2tldCByZXNldCBpbiBCSCBjb250ZXh0KSwKIAkJCQkgKiBzbyBpdCBpcyBzaW1wbGVyIGp1c3QgdG8gcG9zdHBvbmUgaXQgdG8gdGhlCi0JCQkJICogcHJvY2VzcyBjb250ZXh0IGluc3RlYWQgb2YgaW1wbGVtZW50aW5nIHNwZWNpYWwKLQkJCQkgKiBsb2NraW5nIHRoZXJlLgorCQkJCSAqIHByb2Nlc3MgY29udGV4dCBpbnN0ZWFkIG9mIGltcGxlbWVudGluZworCQkJCSAqIHNwZWNpYWwgbG9ja2luZyB0aGVyZS4KIAkJCQkgKi8KIAkJCQlzY2hlZHVsZV90aW1lb3V0KEhaKTsKIAkJCX0KQEAgLTIwMiw3ICsyMDMsNyBAQAogICogc28gdG8gcGxheSBnb29kIHdpdGggYWxsIGNhc2VzIHdlIGp1c3QgcXVldWUgQklPIGludG8gdGhlIHF1ZXVlCiAgKiBhbmQgd2FrZSB1cCBwcm9jZXNzaW5nIHRocmVhZCwgd2hpY2ggZ2V0cyBjb21wbGV0ZWQgcmVxdWVzdCBhbmQKICAqIHNlbmQgKGVuY3J5cHRpbmcgaWYgbmVlZGVkKSBpdCBiYWNrIHRvIHRoZSBjbGllbnQgKGlmIGl0IHdhcyBhIHJlYWQKLSAqIHJlcXVlc3QpLCBvciBzZW5kcyBiYWNrIHJlcGx5IHRoYXQgd3JpdGluZyBzdWNjZXNmdWxseSBjb21wbGV0ZWQuCisgKiByZXF1ZXN0KSwgb3Igc2VuZHMgYmFjayByZXBseSB0aGF0IHdyaXRpbmcgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4KICAqLwogc3RhdGljIGludCBkc3RfZXhwb3J0X3Byb2Nlc3NfcmVxdWVzdF9xdWV1ZShzdHJ1Y3QgZHN0X3N0YXRlICpzdCkKIHsKQEAgLTI3Miw4ICsyNzMsOCBAQAogCQkJaWYgKHApCiAJCQkJYmlvX3B1dChwLT5iaW8pOwogCi0JCQlkcHJpbnRrKCIlczogc3Q6ICVwLCByZWZjbnQ6ICVkLCBsaXN0X2VtcHR5OiAlZCwgcDogJXAuXG4iLAotCQkJCV9fZnVuY19fLCBzdCwgYXRvbWljX3JlYWQoJnN0LT5yZWZjbnQpLAorCQkJZHByaW50aygiJXM6IHN0OiAlcCwgcmVmY250OiAlZCwgbGlzdF9lbXB0eTogJWQsIHA6ICIKKwkJCQkiJXAuXG4iLCBfX2Z1bmNfXywgc3QsIGF0b21pY19yZWFkKCZzdC0+cmVmY250KSwKIAkJCQlsaXN0X2VtcHR5KCZzdC0+cmVxdWVzdF9saXN0KSwgcCk7CiAJCX0KIAl9CkBAIC0zMDMsOSArMzA0LDkgQEAKIAkJaWYgKCFlcnIpIHsKIAkJCXdoaWxlIChuLT50cmFuc19zY2FuX3RpbWVvdXQpIHsKIAkJCQllcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChzdC0+dGhyZWFkX3dhaXQsCi0JCQkJCQkhbGlzdF9lbXB0eSgmc3QtPnJlcXVlc3RfbGlzdCkgfHwKLQkJCQkJCSFuLT50cmFuc19zY2FuX3RpbWVvdXQgfHwKLQkJCQkJCXN0LT5uZWVkX2V4aXQsCisJCQkJCSFsaXN0X2VtcHR5KCZzdC0+cmVxdWVzdF9saXN0KSB8fAorCQkJCQkhbi0+dHJhbnNfc2Nhbl90aW1lb3V0IHx8CisJCQkJCXN0LT5uZWVkX2V4aXQsCiAJCQkJCUhaKTsKIAogCQkJCWlmICghbi0+dHJhbnNfc2Nhbl90aW1lb3V0IHx8IHN0LT5uZWVkX2V4aXQpCkBAIC0zNDEsOCArMzQyLDkgQEAKIGludCBkc3Rfc3RhcnRfZXhwb3J0KHN0cnVjdCBkc3Rfbm9kZSAqbikKIHsKIAlpZiAobGlzdF9lbXB0eSgmbi0+c2VjdXJpdHlfbGlzdCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJZb3UgYXJlIHRyeWluZyB0byBleHBvcnQgbm9kZSAnJXMnIHdpdGhvdXQgc2VjdXJpdHkgYXR0cmlidXRlcy5cbiIKLQkJCQkiTm8gY2xpZW50cyB3aWxsIGJlIGFsbG93ZWQgdG8gY29ubmVjdC4gRXhpdGluZy5cbiIsIG4tPm5hbWUpOworCQlwcmludGsoS0VSTl9FUlIgIllvdSBhcmUgdHJ5aW5nIHRvIGV4cG9ydCBub2RlICclcycgIgorCQkJCSJ3aXRob3V0IHNlY3VyaXR5IGF0dHJpYnV0ZXMuXG5ObyBjbGllbnRzIHdpbGwgIgorCQkJCSJiZSBhbGxvd2VkIHRvIGNvbm5lY3QuIEV4aXRpbmcuXG4iLCBuLT5uYW1lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiBkc3Rfbm9kZV90cmFuc19pbml0KG4sIHNpemVvZihzdHJ1Y3QgZHN0X2V4cG9ydF9wcml2KSk7CkBAIC01NTIsNyArNTU0LDggQEAKIAlpZiAoIWJpbykKIAkJZ290byBlcnJfb3V0X2V4aXQ7CiAKLQlwcml2ID0gKHN0cnVjdCBkc3RfZXhwb3J0X3ByaXYgKikoKCh2b2lkICopYmlvKSAtIHNpemVvZiAoc3RydWN0IGRzdF9leHBvcnRfcHJpdikpOworCXByaXYgPSAoc3RydWN0IGRzdF9leHBvcnRfcHJpdiAqKSgoKHZvaWQgKiliaW8pIC0KKwkJCXNpemVvZiAoc3RydWN0IGRzdF9leHBvcnRfcHJpdikpOwogCiAJcHJpdi0+c3RhdGUgPSBkc3Rfc3RhdGVfZ2V0KHN0KTsKIAlwcml2LT5iaW8gPSBiaW87CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHN0L3N0YXRlLmMgYi9kcml2ZXJzL3N0YWdpbmcvZHN0L3N0YXRlLmMKaW5kZXggZDA1N2U1Mi4uMDJhMDVlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RzdC9zdGF0ZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kc3Qvc3RhdGUuYwpAQCAtMzAsMTMgKzMwLDEzIEBACiAgKiBQb2xsaW5nIG1hY2hpbmVyeS4KICAqLwogCi1zdHJ1Y3QgZHN0X3BvbGxfaGVscGVyCi17Ci0JcG9sbF90YWJsZSAJCXB0Oworc3RydWN0IGRzdF9wb2xsX2hlbHBlciB7CisJcG9sbF90YWJsZQkJcHQ7CiAJc3RydWN0IGRzdF9zdGF0ZQkqc3Q7CiB9OwogCi1zdGF0aWMgaW50IGRzdF9xdWV1ZV93YWtlKHdhaXRfcXVldWVfdCAqd2FpdCwgdW5zaWduZWQgbW9kZSwgaW50IHN5bmMsIHZvaWQgKmtleSkKK3N0YXRpYyBpbnQgZHN0X3F1ZXVlX3dha2Uod2FpdF9xdWV1ZV90ICp3YWl0LCB1bnNpZ25lZCBtb2RlLAorCQlpbnQgc3luYywgdm9pZCAqa2V5KQogewogCXN0cnVjdCBkc3Rfc3RhdGUgKnN0ID0gY29udGFpbmVyX29mKHdhaXQsIHN0cnVjdCBkc3Rfc3RhdGUsIHdhaXQpOwogCkBAIC05Miw3ICs5Miw3IEBACiAJbXNnLm1zZ19uYW1lbGVuID0gMDsKIAltc2cubXNnX2NvbnRyb2wgPSBOVUxMOwogCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7Ci0JbXNnLm1zZ19mbGFncyA9IChibG9jayk/TVNHX1dBSVRBTEw6TVNHX0RPTlRXQUlUOworCW1zZy5tc2dfZmxhZ3MgPSAoYmxvY2spID8gTVNHX1dBSVRBTEwgOiBNU0dfRE9OVFdBSVQ7CiAKIAllcnIgPSBrZXJuZWxfcmVjdm1zZyhzb2NrLCAmbXNnLCAmaW92LCAxLCBpb3YuaW92X2xlbiwKIAkJCW1zZy5tc2dfZmxhZ3MpOwpAQCAtMTIxLDcgKzEyMSw3IEBACiAJbXNnLm1zZ19uYW1lbGVuID0gMDsKIAltc2cubXNnX2NvbnRyb2wgPSBOVUxMOwogCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7Ci0JbXNnLm1zZ19mbGFncyA9IE1TR19XQUlUQUxMIHwgKG1vcmUpP01TR19NT1JFOjA7CisJbXNnLm1zZ19mbGFncyA9IE1TR19XQUlUQUxMIHwgKG1vcmUgPyBNU0dfTU9SRSA6IDApOwogCiAJZXJyID0ga2VybmVsX3NlbmRtc2coc29jaywgJm1zZywgJmlvdiwgMSwgaW92Lmlvdl9sZW4pOwogCWlmIChlcnIgIT0gc2l6ZSkgewpAQCAtMjE3LDggKzIxNyw4IEBACiB7CiAJaWYgKHNrLT5vcHMtPmZhbWlseSA9PSBBRl9JTkVUKSB7CiAJCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhOwotCQlwcmludGsoS0VSTl9JTkZPICIlcyAldS4ldS4ldS4ldTolZC5cbiIsCi0JCQlzdHIsIE5JUFFVQUQoc2luLT5zaW5fYWRkci5zX2FkZHIpLCBudG9ocyhzaW4tPnNpbl9wb3J0KSk7CisJCXByaW50ayhLRVJOX0lORk8gIiVzICV1LiV1LiV1LiV1OiVkLlxuIiwgc3RyLAorCQkJTklQUVVBRChzaW4tPnNpbl9hZGRyLnNfYWRkciksIG50b2hzKHNpbi0+c2luX3BvcnQpKTsKIAl9IGVsc2UgaWYgKHNrLT5vcHMtPmZhbWlseSA9PSBBRl9JTkVUNikgewogCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhOwogCQlwcmludGsoS0VSTl9JTkZPICIlcyAlcGk2OiVkIiwKQEAgLTI3MSwxMyArMjcxLDEzIEBACiAgKiBTdGF0ZSByZXNldCBpcyB1c2VkIHRvIHJlY29ubmVjdCB0byB0aGUgcmVtb3RlIHBlZXIuCiAgKiBNYXkgZmFpbCwgYnV0IHdobyBjYXJlcywgd2Ugd2lsbCB0cnkgYWdhaW4gbGF0ZXIuCiAgKi8KLXN0YXRpYyB2b2lkIGlubGluZSBkc3Rfc3RhdGVfcmVzZXRfbm9sb2NrKHN0cnVjdCBkc3Rfc3RhdGUgKnN0KQorc3RhdGljIGlubGluZSB2b2lkIGRzdF9zdGF0ZV9yZXNldF9ub2xvY2soc3RydWN0IGRzdF9zdGF0ZSAqc3QpCiB7CiAJZHN0X3N0YXRlX2V4aXRfY29ubmVjdGVkKHN0KTsKIAlkc3Rfc3RhdGVfaW5pdF9jb25uZWN0ZWQoc3QpOwogfQogCi1zdGF0aWMgdm9pZCBpbmxpbmUgZHN0X3N0YXRlX3Jlc2V0KHN0cnVjdCBkc3Rfc3RhdGUgKnN0KQorc3RhdGljIGlubGluZSB2b2lkIGRzdF9zdGF0ZV9yZXNldChzdHJ1Y3QgZHN0X3N0YXRlICpzdCkKIHsKIAlkc3Rfc3RhdGVfbG9jayhzdCk7CiAJZHN0X3N0YXRlX3Jlc2V0X25vbG9jayhzdCk7CkBAIC0zMzUsOSArMzM1LDExIEBACiAKIAkJY21kLT5jbWQgPSBfX2NwdV90b19iZTMyKERTVF9QSU5HKTsKIAotCQllcnIgPSBkc3RfZGF0YV9zZW5kX2hlYWRlcihzdC0+c29ja2V0LCBjbWQsIHNpemVvZihzdHJ1Y3QgZHN0X2NtZCksIDApOworCQllcnIgPSBkc3RfZGF0YV9zZW5kX2hlYWRlcihzdC0+c29ja2V0LCBjbWQsCisJCQkJc2l6ZW9mKHN0cnVjdCBkc3RfY21kKSwgMCk7CiAJfQotCWRwcmludGsoIiVzOiBzdDogJXAsIHNvY2tldDogJXAsIGVycjogJWQuXG4iLCBfX2Z1bmNfXywgc3QsIHN0LT5zb2NrZXQsIGVycik7CisJZHByaW50aygiJXM6IHN0OiAlcCwgc29ja2V0OiAlcCwgZXJyOiAlZC5cbiIsIF9fZnVuY19fLAorCQkJc3QsIHN0LT5zb2NrZXQsIGVycik7CiAJZHN0X3N0YXRlX3VubG9jayhzdCk7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMzkwLDggKzM5Miw3IEBACiAJCWVyciA9IC1FQ09OTlJFU0VUOwogCQlkc3Rfc3RhdGVfbG9jayhzdCk7CiAKLQkJaWYgKAkJc3QtPnNvY2tldCAmJgotCQkJCShzdC0+cmVhZF9zb2NrZXQgPT0gc3QtPnNvY2tldCkgJiYKKwkJaWYgKHN0LT5zb2NrZXQgJiYgKHN0LT5yZWFkX3NvY2tldCA9PSBzdC0+c29ja2V0KSAmJgogCQkJCShyZXZlbnRzICYgUE9MTElOKSkgewogCQkJZXJyID0gZHN0X2RhdGFfcmVjdl9yYXcoc3QsIGRhdGEsIHNpemUpOwogCQkJaWYgKGVyciA+IDApIHsKQEAgLTQwMiw4ICs0MDMsOSBAQAogCQl9CiAKIAkJaWYgKHJldmVudHMgJiBlcnJfbWFzayB8fCAhc3QtPnNvY2tldCkgewotCQkJZHByaW50aygiJXM6IHJldmVudHM6ICV4LCBzb2NrZXQ6ICVwLCBzaXplOiAldSwgZXJyOiAlZC5cbiIsCi0JCQkJCV9fZnVuY19fLCByZXZlbnRzLCBzdC0+c29ja2V0LCBzaXplLCBlcnIpOworCQkJZHByaW50aygiJXM6IHJldmVudHM6ICV4LCBzb2NrZXQ6ICVwLCBzaXplOiAldSwgIgorCQkJCQkiZXJyOiAlZC5cbiIsIF9fZnVuY19fLCByZXZlbnRzLAorCQkJCQlzdC0+c29ja2V0LCBzaXplLCBlcnIpOwogCQkJZXJyID0gLUVDT05OUkVTRVQ7CiAJCX0KIApAQCAtNDQwLDcgKzQ0Miw4IEBACiAvKgogICogUmVjZWl2ZSBibG9jayBJTyBmcm9tIHRoZSBuZXR3b3JrLgogICovCi1zdGF0aWMgaW50IGRzdF9yZWN2X2JpbyhzdHJ1Y3QgZHN0X3N0YXRlICpzdCwgc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBpbnQgdG90YWxfc2l6ZSkKK3N0YXRpYyBpbnQgZHN0X3JlY3ZfYmlvKHN0cnVjdCBkc3Rfc3RhdGUgKnN0LCBzdHJ1Y3QgYmlvICpiaW8sCisJCXVuc2lnbmVkIGludCB0b3RhbF9zaXplKQogewogCXN0cnVjdCBiaW9fdmVjICpidjsKIAlpbnQgaSwgZXJyOwpAQCAtNDUwLDkgKzQ1MywxMCBAQAogCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2LCBiaW8sIGkpIHsKIAkJc3ogPSBtaW4odG90YWxfc2l6ZSwgYnYtPmJ2X2xlbik7CiAKLQkJZHByaW50aygiJXM6IGJpbzogJWxsdS8ldSwgdG90YWw6ICV1LCBsZW46ICV1LCBzejogJXUsIG9mZjogJXUuXG4iLAotCQkJX19mdW5jX18sICh1NjQpYmlvLT5iaV9zZWN0b3IsIGJpby0+Ymlfc2l6ZSwgdG90YWxfc2l6ZSwKLQkJCWJ2LT5idl9sZW4sIHN6LCBidi0+YnZfb2Zmc2V0KTsKKwkJZHByaW50aygiJXM6IGJpbzogJWxsdS8ldSwgdG90YWw6ICV1LCBsZW46ICV1LCBzejogJXUsICIKKwkJCQkib2ZmOiAldS5cbiIsIF9fZnVuY19fLCAodTY0KWJpby0+Ymlfc2VjdG9yLAorCQkJCWJpby0+Ymlfc2l6ZSwgdG90YWxfc2l6ZSwgYnYtPmJ2X2xlbiwgc3osCisJCQkJYnYtPmJ2X29mZnNldCk7CiAKIAkJZGF0YSA9IGttYXAoYnYtPmJ2X3BhZ2UpICsgYnYtPmJ2X29mZnNldDsKIAkJZXJyID0gZHN0X2RhdGFfcmVjdihzdCwgZGF0YSwgc3opOwpAQCAtNTkwLDcgKzU5NCw4IEBACiAJCQljbWQtPmZsYWdzLCBjbWQtPnJ3KTsKIAogCS8qCi0JICogVGhpcyBzaG91bGQgY2F0Y2ggcHJvdG9jb2wgYnJlYWthZ2UgYW5kIHJhbmRvbSBnYXJiYWdlIGluc3RlYWQgb2YgY29tbWFuZHMuCisJICogVGhpcyBzaG91bGQgY2F0Y2ggcHJvdG9jb2wgYnJlYWthZ2UgYW5kIHJhbmRvbSBnYXJiYWdlCisJICogaW5zdGVhZCBvZiBjb21tYW5kcy4KIAkgKi8KIAlpZiAodW5saWtlbHkoY21kLT5jc2l6ZSA+IHN0LT5zaXplIC0gc2l6ZW9mKHN0cnVjdCBkc3RfY21kKSkpIHsKIAkJZXJyID0gLUVCQURNU0c7CkBAIC01OTksMjAgKzYwNCwyMCBAQAogCiAJZXJyID0gLUVQUk9UTzsKIAlzd2l0Y2ggKGNtZC0+Y21kKSB7Ci0JCWNhc2UgRFNUX0lPX1JFU1BPTlNFOgotCQkJZXJyID0gZHN0X3Byb2Nlc3NfaW9fcmVzcG9uc2Uoc3QpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRFNUX0lPOgotCQkJZXJyID0gZHN0X3Byb2Nlc3NfaW8oc3QpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRFNUX0NGRzoKLQkJCWVyciA9IGRzdF9wcm9jZXNzX2NmZyhzdCk7Ci0JCQlicmVhazsKLQkJY2FzZSBEU1RfUElORzoKLQkJCWVyciA9IDA7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOworCWNhc2UgRFNUX0lPX1JFU1BPTlNFOgorCQllcnIgPSBkc3RfcHJvY2Vzc19pb19yZXNwb25zZShzdCk7CisJCWJyZWFrOworCWNhc2UgRFNUX0lPOgorCQllcnIgPSBkc3RfcHJvY2Vzc19pbyhzdCk7CisJCWJyZWFrOworCWNhc2UgRFNUX0NGRzoKKwkJZXJyID0gZHN0X3Byb2Nlc3NfY2ZnKHN0KTsKKwkJYnJlYWs7CisJY2FzZSBEU1RfUElORzoKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CiAJfQogCiBvdXRfZXhpdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kc3QvdGhyZWFkX3Bvb2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9kc3QvdGhyZWFkX3Bvb2wuYwppbmRleCA3YmVkNGU4Li4yOWE4MmIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHN0L3RocmVhZF9wb29sLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RzdC90aHJlYWRfcG9vbC5jCkBAIC0zMCw4ICszMCw3IEBACiAgKiBXaGVuIGFjdGlvbiBpcyBiZWluZyBwZXJmb3JtZWQsIHRocmVhZCBjYW4gbm90IGJlIHVzZWQgYnkgb3RoZXIgdXNlcnMsCiAgKiBpbnN0ZWFkIHRoZXkgd2lsbCBzbGVlcCB1bnRpbCB0aGVyZSBpcyBmcmVlIHRocmVhZCB0byBwaWNrIHRoZWlyIHdvcmsuCiAgKi8KLXN0cnVjdCB0aHJlYWRfcG9vbF93b3JrZXIKLXsKK3N0cnVjdCB0aHJlYWRfcG9vbF93b3JrZXIgewogCXN0cnVjdCBsaXN0X2hlYWQJd29ya2VyX2VudHJ5OwogCiAJc3RydWN0IHRhc2tfc3RydWN0CSp0aHJlYWQ7CkBAIC00OCw4ICs0Nyw4IEBACiAJdm9pZAkJCSpwcml2YXRlOwogCXZvaWQJCQkqc2NoZWR1bGVfZGF0YTsKIAotCWludAkJCSgqIGFjdGlvbikodm9pZCAqcHJpdmF0ZSwgdm9pZCAqc2NoZWR1bGVfZGF0YSk7Ci0Jdm9pZAkJCSgqIGNsZWFudXApKHZvaWQgKnByaXZhdGUpOworCWludAkJCSgqYWN0aW9uKSh2b2lkICpwcml2YXRlLCB2b2lkICpzY2hlZHVsZV9kYXRhKTsKKwl2b2lkCQkJKCpjbGVhbnVwKSh2b2lkICpwcml2YXRlKTsKIH07CiAKIHN0YXRpYyB2b2lkIHRocmVhZF9wb29sX2V4aXRfd29ya2VyKHN0cnVjdCB0aHJlYWRfcG9vbF93b3JrZXIgKncpCkBAIC0xMTYsMTAgKzExNSwxMiBAQAogCXN0cnVjdCB0aHJlYWRfcG9vbF93b3JrZXIgKncgPSBOVUxMOwogCiAJd2hpbGUgKCF3ICYmIHAtPnRocmVhZF9udW0pIHsKLQkJd2FpdF9ldmVudChwLT53YWl0LCAhbGlzdF9lbXB0eSgmcC0+cmVhZHlfbGlzdCkgfHwgIXAtPnRocmVhZF9udW0pOworCQl3YWl0X2V2ZW50KHAtPndhaXQsICFsaXN0X2VtcHR5KCZwLT5yZWFkeV9saXN0KSB8fAorCQkJCSFwLT50aHJlYWRfbnVtKTsKIAogCQlkcHJpbnRrKCIlczogbG9ja2luZyBsaXN0X2VtcHR5OiAlZCwgdGhyZWFkX251bTogJWQuXG4iLAotCQkJCV9fZnVuY19fLCBsaXN0X2VtcHR5KCZwLT5yZWFkeV9saXN0KSwgcC0+dGhyZWFkX251bSk7CisJCQkJX19mdW5jX18sIGxpc3RfZW1wdHkoJnAtPnJlYWR5X2xpc3QpLAorCQkJCXAtPnRocmVhZF9udW0pOwogCiAJCW11dGV4X2xvY2soJnAtPnRocmVhZF9sb2NrKTsKIAkJaWYgKCFsaXN0X2VtcHR5KCZwLT5yZWFkeV9saXN0KSkgewpAQCAtMTI3LDggKzEyOCw5IEBACiAJCQkJCXN0cnVjdCB0aHJlYWRfcG9vbF93b3JrZXIsCiAJCQkJCXdvcmtlcl9lbnRyeSk7CiAKLQkJCWRwcmludGsoIiVzOiBkZWxldGluZyB3OiAlcCwgdGhyZWFkX251bTogJWQsIGxpc3Q6ICVwIFslcC4lcF0uXG4iLAotCQkJCQlfX2Z1bmNfXywgdywgcC0+dGhyZWFkX251bSwgJnAtPnJlYWR5X2xpc3QsCisJCQlkcHJpbnRrKCIlczogZGVsZXRpbmcgdzogJXAsIHRocmVhZF9udW06ICVkLCAiCisJCQkJCSJsaXN0OiAlcCBbJXAuJXBdLlxuIiwgX19mdW5jX18sCisJCQkJCXcsIHAtPnRocmVhZF9udW0sICZwLT5yZWFkeV9saXN0LAogCQkJCQlwLT5yZWFkeV9saXN0LnByZXYsIHAtPnJlYWR5X2xpc3QubmV4dCk7CiAKIAkJCXAtPnRocmVhZF9udW0tLTsKQEAgLTE4Miw4ICsxODQsOCBAQAogaW50IHRocmVhZF9wb29sX2FkZF93b3JrZXIoc3RydWN0IHRocmVhZF9wb29sICpwLAogCQljaGFyICpuYW1lLAogCQl1bnNpZ25lZCBpbnQgaWQsCi0JCXZvaWQgKigqIGluaXQpKHZvaWQgKnByaXZhdGUpLAotCQl2b2lkICgqIGNsZWFudXApKHZvaWQgKnByaXZhdGUpLAorCQl2b2lkICooKmluaXQpKHZvaWQgKnByaXZhdGUpLAorCQl2b2lkICgqY2xlYW51cCkodm9pZCAqcHJpdmF0ZSksCiAJCXZvaWQgKnByaXZhdGUpCiB7CiAJc3RydWN0IHRocmVhZF9wb29sX3dvcmtlciAqdzsKQEAgLTI0Myw4ICsyNDUsOCBAQAogICogVGhleSB3aWxsIGhhdmUgc2VxdWVudGlhbCBJRHMgc3RhcnRlZCBmcm9tIHplcm8uCiAgKi8KIHN0cnVjdCB0aHJlYWRfcG9vbCAqdGhyZWFkX3Bvb2xfY3JlYXRlKGludCBudW0sIGNoYXIgKm5hbWUsCi0JCXZvaWQgKigqIGluaXQpKHZvaWQgKnByaXZhdGUpLAotCQl2b2lkICgqIGNsZWFudXApKHZvaWQgKnByaXZhdGUpLAorCQl2b2lkICooKmluaXQpKHZvaWQgKnByaXZhdGUpLAorCQl2b2lkICgqY2xlYW51cCkodm9pZCAqcHJpdmF0ZSksCiAJCXZvaWQgKnByaXZhdGUpCiB7CiAJc3RydWN0IHRocmVhZF9wb29sX3dvcmtlciAqdywgKnRtcDsKQEAgLTI2Miw3ICsyNjQsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZwLT5hY3RpdmVfbGlzdCk7CiAJcC0+dGhyZWFkX251bSA9IDA7CiAKLQlmb3IgKGk9MDsgaTxudW07ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBudW07ICsraSkgewogCQllcnIgPSB0aHJlYWRfcG9vbF9hZGRfd29ya2VyKHAsIG5hbWUsIGksIGluaXQsCiAJCQkJY2xlYW51cCwgcHJpdmF0ZSk7CiAJCWlmIChlcnIpCkBAIC0yODcsOCArMjg5LDggQEAKICAqIHByaXZhdGUgZGF0YS4KICAqLwogaW50IHRocmVhZF9wb29sX3NjaGVkdWxlX3ByaXZhdGUoc3RydWN0IHRocmVhZF9wb29sICpwLAotCQlpbnQgKCogc2V0dXApKHZvaWQgKnByaXZhdGUsIHZvaWQgKmRhdGEpLAotCQlpbnQgKCogYWN0aW9uKSh2b2lkICpwcml2YXRlLCB2b2lkICpkYXRhKSwKKwkJaW50ICgqc2V0dXApKHZvaWQgKnByaXZhdGUsIHZvaWQgKmRhdGEpLAorCQlpbnQgKCphY3Rpb24pKHZvaWQgKnByaXZhdGUsIHZvaWQgKmRhdGEpLAogCQl2b2lkICpkYXRhLCBsb25nIHRpbWVvdXQsIHZvaWQgKmlkKQogewogCXN0cnVjdCB0aHJlYWRfcG9vbF93b3JrZXIgKncsICp0bXAsICp3b3JrZXIgPSBOVUxMOwpAQCAtMzIxLDcgKzMyMyw4IEBACiAJCQkJdy0+aGFzX2RhdGEgPSAxOwogCQkJCXdha2VfdXAoJnctPndhaXQpOwogCQkJfSBlbHNlIHsKLQkJCQlsaXN0X21vdmVfdGFpbCgmdy0+d29ya2VyX2VudHJ5LCAmcC0+cmVhZHlfbGlzdCk7CisJCQkJbGlzdF9tb3ZlX3RhaWwoJnctPndvcmtlcl9lbnRyeSwKKwkJCQkJCSZwLT5yZWFkeV9saXN0KTsKIAkJCX0KIAogCQkJYnJlYWs7CkBAIC0zMzYsOCArMzM5LDggQEAKICAqIFNjaGVkdWxlIGV4ZWN1dGlvbiBvbiBhcmJpdHJhcnkgdGhyZWFkIGZyb20gdGhlIHBvb2wuCiAgKi8KIGludCB0aHJlYWRfcG9vbF9zY2hlZHVsZShzdHJ1Y3QgdGhyZWFkX3Bvb2wgKnAsCi0JCWludCAoKiBzZXR1cCkodm9pZCAqcHJpdmF0ZSwgdm9pZCAqZGF0YSksCi0JCWludCAoKiBhY3Rpb24pKHZvaWQgKnByaXZhdGUsIHZvaWQgKmRhdGEpLAorCQlpbnQgKCpzZXR1cCkodm9pZCAqcHJpdmF0ZSwgdm9pZCAqZGF0YSksCisJCWludCAoKmFjdGlvbikodm9pZCAqcHJpdmF0ZSwgdm9pZCAqZGF0YSksCiAJCXZvaWQgKmRhdGEsIGxvbmcgdGltZW91dCkKIHsKIAlyZXR1cm4gdGhyZWFkX3Bvb2xfc2NoZWR1bGVfcHJpdmF0ZShwLCBzZXR1cCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kc3QvdHJhbnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9kc3QvdHJhbnMuYwppbmRleCA1NTdkMzcyLi4xYzM2YTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHN0L3RyYW5zLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RzdC90cmFucy5jCkBAIC01OCw3ICs1OCw3IEBACiAJfQogCiAJZHByaW50aygiJXM6ICVzIHRyYW5zYWN0aW9uOiBpZDogJWxsdS5cbiIsIF9fZnVuY19fLAotCQkJKHJldCk/ImZvdW5kIjoibm90IGZvdW5kIiwgZ2VuKTsKKwkJCShyZXQpID8gImZvdW5kIiA6ICJub3QgZm91bmQiLCBnZW4pOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTg4LDkgKzg4LDkgQEAKIAogCW5ldy0+c2VuZF90aW1lID0gamlmZmllczsKIAlpZiAocmV0KSB7Ci0JCXByaW50aygiJXM6IGV4aXN0OiBvbGQ6IGdlbjogJWxsdSwgYmlvOiAlbGx1LyV1LCBzZW5kX3RpbWU6ICVsdSwgIgotCQkJCSJuZXc6IGdlbjogJWxsdSwgYmlvOiAlbGx1LyV1LCBzZW5kX3RpbWU6ICVsdS5cbiIsCi0JCQlfX2Z1bmNfXywKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGlzdDogb2xkOiBnZW46ICVsbHUsIGJpbzogJWxsdS8ldSwgIgorCQkJInNlbmRfdGltZTogJWx1LCBuZXc6IGdlbjogJWxsdSwgYmlvOiAlbGx1LyV1LCAiCisJCQkic2VuZF90aW1lOiAlbHUuXG4iLCBfX2Z1bmNfXywKIAkJCXJldC0+Z2VuLCAodTY0KXJldC0+YmlvLT5iaV9zZWN0b3IsCiAJCQlyZXQtPmJpby0+Ymlfc2l6ZSwgcmV0LT5zZW5kX3RpbWUsCiAJCQluZXctPmdlbiwgKHU2NCluZXctPmJpby0+Ymlfc2VjdG9yLApAQCAtMjA2LDcgKzIwNiw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIGRzdF90cmFuc19zY2FuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgZHN0X25vZGUgKm4gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRzdF9ub2RlLCB0cmFuc193b3JrLndvcmspOworCXN0cnVjdCBkc3Rfbm9kZSAqbiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZHN0X25vZGUsCisJCQl0cmFuc193b3JrLndvcmspOwogCXN0cnVjdCByYl9ub2RlICpyYl9ub2RlOwogCXN0cnVjdCBkc3RfdHJhbnMgKnQ7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gbi0+dHJhbnNfc2Nhbl90aW1lb3V0OwpAQCAtMjQ2LDggKzI0Nyw4IEBACiAJbXV0ZXhfdW5sb2NrKCZuLT50cmFuc19sb2NrKTsKIAogCS8qCi0JICogSWYgbm8gdGltZW91dCBzcGVjaWZpZWQgdGhlbiBzeXN0ZW0gaXMgaW4gdGhlIG1pZGRsZSBvZiBleGl0aW5nIHByb2Nlc3MsCi0JICogc28gbm8gbmVlZCB0byByZXNjaGVkdWxlIHNjYW5uaW5nIHByb2Nlc3MgYWdhaW4uCisJICogSWYgbm8gdGltZW91dCBzcGVjaWZpZWQgdGhlbiBzeXN0ZW0gaXMgaW4gdGhlIG1pZGRsZSBvZiBleGl0aW5nCisJICogcHJvY2Vzcywgc28gbm8gbmVlZCB0byByZXNjaGVkdWxlIHNjYW5uaW5nIHByb2Nlc3MgYWdhaW4uCiAJICovCiAJaWYgKHRpbWVvdXQpIHsKIAkJaWYgKCFudW0pCkBAIC0zMTMsNyArMzE0LDggQEAKIAlpZiAoIW4tPnRyYW5zX2NhY2hlKQogCQlnb3RvIGVycl9vdXRfZXhpdDsKIAotCW4tPnRyYW5zX3Bvb2wgPSBtZW1wb29sX2NyZWF0ZV9zbGFiX3Bvb2woZHN0X21lbXBvb2xfbnVtLCBuLT50cmFuc19jYWNoZSk7CisJbi0+dHJhbnNfcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3NsYWJfcG9vbChkc3RfbWVtcG9vbF9udW0sCisJCQluLT50cmFuc19jYWNoZSk7CiAJaWYgKCFuLT50cmFuc19wb29sKQogCQlnb3RvIGVycl9vdXRfY2FjaGVfZGVzdHJveTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfYWRkcmVzc19tYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX2FkZHJlc3NfbWFwLmgKaW5kZXggMmMzZDY1YS4uNmRhODQzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfYWRkcmVzc19tYXAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9hZGRyZXNzX21hcC5oCkBAIC0xOTgsMjAgKzE5OCwxMCBAQAogLyoKICAqIHN0cnVjdHVyZSBmb3IgdHhkbWEgcGFja2V0IHJpbmcgbnVtYmVyIG9mIGRlc2NyaXB0b3IgcmVnIGluIHR4ZG1hIGFkZHJlc3MKICAqIG1hcC4gIExvY2F0ZWQgYXQgYWRkcmVzcyAweDEwMEMKKyAqCisgKiAzMS0xMDogdW51c2VkCisgKiA5LTA6IHByIG5kZXMKICAqLwotdHlwZWRlZiB1bmlvbiBfVFhETUFfUFJfTlVNX0RFU190IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB1bnVzZWQ6MjI7CS8qIGJpdHMgMTAtMzEgKi8KLQkJdTMyIHByX25kZXM6MTA7CS8qIGJpdHMgMC05ICovCi0jZWxzZQotCQl1MzIgcHJfbmRlczoxMDsJLyogYml0cyAwLTkgKi8KLQkJdTMyIHVudXNlZDoyMjsJLyogYml0cyAxMC0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBUWERNQV9QUl9OVU1fREVTX3QsICpQVFhETUFfUFJfTlVNX0RFU190OwotCiAKICNkZWZpbmUgRVRfRE1BMTBfTUFTSwkJMHgzRkYJLyogMTAgYml0IG1hc2sgZm9yIERNQTEwVyB0eXBlcyAqLwogI2RlZmluZSBFVF9ETUExMF9XUkFQCQkweDQwMApAQCAtMjYxLDcgKzI1MSw3IEBACiAJdTMyIGNzcjsJCQkvKiAgMHgxMDAwICovCiAJdTMyIHByX2Jhc2VfaGk7CQkJLyogIDB4MTAwNCAqLwogCXUzMiBwcl9iYXNlX2xvOwkJCS8qICAweDEwMDggKi8KLQlUWERNQV9QUl9OVU1fREVTX3QgcHJfbnVtX2RlczsJLyogIDB4MTAwQyAqLworCXUzMiBwcl9udW1fZGVzOwkJCS8qICAweDEwMEMgKi8KIAl1MzIgdHhxX3dyX2FkZHI7CQkvKiAgMHgxMDEwICovCiAJdTMyIHR4cV93cl9hZGRyX2V4dDsJCS8qICAweDEwMTQgKi8KIAl1MzIgdHhxX3JkX2FkZHI7CQkvKiAgMHgxMDE4ICovCkBAIC0zNDksMzYgKzMzOSwxOCBAQAogLyoKICAqIHN0cnVjdHVyZSBmb3IgbnVtYmVyIG9mIHBhY2tldHMgZG9uZSByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMEMKKyAqCisgKiAzMS04OiB1bnVzZWQKKyAqIDctMDogbnVtIGRvbmUKICAqLwotdHlwZWRlZiB1bmlvbiBfUlhETUFfTlVNX1BLVF9ET05FX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHVudXNlZDoyNDsJLyogYml0cyA4LTMxICovCi0JCXUzMiBudW1fZG9uZTo4OwkvKiBiaXRzIDAtNyAqLwotI2Vsc2UKLQkJdTMyIG51bV9kb25lOjg7CS8qIGJpdHMgMC03ICovCi0JCXUzMiB1bnVzZWQ6MjQ7CS8qIGJpdHMgOC0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBSWERNQV9OVU1fUEtUX0RPTkVfdCwgKlBSWERNQV9OVU1fUEtUX0RPTkVfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgbWF4IHBhY2tldCB0aW1lIHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcAogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MjAxMAorICoKKyAqIDMxLTE4OiB1bnVzZWQKKyAqIDE3LTA6IHRpbWUgZG9uZQogICovCi10eXBlZGVmIHVuaW9uIF9SWERNQV9NQVhfUEtUX1RJTUVfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgdW51c2VkOjE0OwkJLyogYml0cyAxOC0zMSAqLwotCQl1MzIgdGltZV9kb25lOjE4OwkvKiBiaXRzIDAtMTcgKi8KLSNlbHNlCi0JCXUzMiB0aW1lX2RvbmU6MTg7CS8qIGJpdHMgMC0xNyAqLwotCQl1MzIgdW51c2VkOjE0OwkJLyogYml0cyAxOC0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBSWERNQV9NQVhfUEtUX1RJTUVfdCwgKlBSWERNQV9NQVhfUEtUX1RJTUVfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgcnggcXVldWUgcmVhZCBhZGRyZXNzIHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcApAQCAtNDEzLDkxICszODUsNDQgQEAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIHBhY2tldCBzdGF0dXMgcmluZyBudW1iZXIgb2YgZGVzY3JpcHRvcnMgcmVnIGluIHJ4ZG1hIGFkZHJlc3MKICAqIG1hcC4gIExvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMjgKKyAqCisgKiAzMS0xMjogdW51c2VkCisgKiAxMS0wOiBwc3IgbmRlcwogICovCi10eXBlZGVmIHVuaW9uIF9SWERNQV9QU1JfTlVNX0RFU190IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB1bnVzZWQ6MjA7CQkvKiBiaXRzIDEyLTMxICovCi0JCXUzMiBwc3JfbmRlczoxMjsJLyogYml0IDAtMTEgKi8KLSNlbHNlCi0JCXUzMiBwc3JfbmRlczoxMjsJLyogYml0IDAtMTEgKi8KLQkJdTMyIHVudXNlZDoyMDsJCS8qIGJpdHMgMTItMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gUlhETUFfUFNSX05VTV9ERVNfdCwgKlBSWERNQV9QU1JfTlVNX0RFU190OwogCiAvKgogICogc3RydWN0dXJlIGZvciBwYWNrZXQgc3RhdHVzIHJpbmcgYXZhaWxhYmxlIG9mZnNldCByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMkMKKyAqCisgKiAzMS0xMzogdW51c2VkCisgKiAxMjogcHNyIGF2YWlsIHdyYXAKKyAqIDExLTA6IHBzciBhdmFpbAogICovCi10eXBlZGVmIHVuaW9uIF9SWERNQV9QU1JfQVZBSUxfT0ZGU0VUX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHVudXNlZDoxOTsJCS8qIGJpdHMgMTMtMzEgKi8KLQkJdTMyIHBzcl9hdmFpbF93cmFwOjE7CS8qIGJpdCAxMiAqLwotCQl1MzIgcHNyX2F2YWlsOjEyOwkvKiBiaXQgMC0xMSAqLwotI2Vsc2UKLQkJdTMyIHBzcl9hdmFpbDoxMjsJLyogYml0IDAtMTEgKi8KLQkJdTMyIHBzcl9hdmFpbF93cmFwOjE7CS8qIGJpdCAxMiAqLwotCQl1MzIgdW51c2VkOjE5OwkJLyogYml0cyAxMy0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBSWERNQV9QU1JfQVZBSUxfT0ZGU0VUX3QsICpQUlhETUFfUFNSX0FWQUlMX09GRlNFVF90OwogCiAvKgogICogc3RydWN0dXJlIGZvciBwYWNrZXQgc3RhdHVzIHJpbmcgZnVsbCBvZmZzZXQgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDMwCisgKgorICogMzEtMTM6IHVudXNlZAorICogMTI6IHBzciBmdWxsIHdyYXAKKyAqIDExLTA6IHBzciBmdWxsCiAgKi8KLXR5cGVkZWYgdW5pb24gX1JYRE1BX1BTUl9GVUxMX09GRlNFVF90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB1bnVzZWQ6MTk7CQkvKiBiaXRzIDEzLTMxICovCi0JCXUzMiBwc3JfZnVsbF93cmFwOjE7CS8qIGJpdCAxMiAqLwotCQl1MzIgcHNyX2Z1bGw6MTI7CS8qIGJpdCAwLTExICovCi0jZWxzZQotCQl1MzIgcHNyX2Z1bGw6MTI7CS8qIGJpdCAwLTExICovCi0JCXUzMiBwc3JfZnVsbF93cmFwOjE7CS8qIGJpdCAxMiAqLwotCQl1MzIgdW51c2VkOjE5OwkJLyogYml0cyAxMy0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBSWERNQV9QU1JfRlVMTF9PRkZTRVRfdCwgKlBSWERNQV9QU1JfRlVMTF9PRkZTRVRfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgcGFja2V0IHN0YXR1cyByaW5nIGFjY2VzcyBpbmRleCByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMzQKKyAqCisgKiAzMS01OiB1bnVzZWQKKyAqIDQtMDogcHNyX2FpCiAgKi8KLXR5cGVkZWYgdW5pb24gX1JYRE1BX1BTUl9BQ0NFU1NfSU5ERVhfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgdW51c2VkOjI3OwkvKiBiaXRzIDUtMzEgKi8KLQkJdTMyIHBzcl9haTo1OwkvKiBiaXRzIDAtNCAqLwotI2Vsc2UKLQkJdTMyIHBzcl9haTo1OwkvKiBiaXRzIDAtNCAqLwotCQl1MzIgdW51c2VkOjI3OwkvKiBiaXRzIDUtMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gUlhETUFfUFNSX0FDQ0VTU19JTkRFWF90LCAqUFJYRE1BX1BTUl9BQ0NFU1NfSU5ERVhfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgcGFja2V0IHN0YXR1cyByaW5nIG1pbmltdW0gZGVzY3JpcHRvcnMgcmVnIGluIHJ4ZG1hIGFkZHJlc3MKICAqIG1hcC4gIExvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMzgKKyAqCisgKiAzMS0xMjogdW51c2VkCisgKiAxMS0wOiBwc3JfbWluCiAgKi8KLXR5cGVkZWYgdW5pb24gX1JYRE1BX1BTUl9NSU5fREVTX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHVudXNlZDoyMDsJLyogYml0cyAxMi0zMSAqLwotCQl1MzIgcHNyX21pbjoxMjsJLyogYml0cyAwLTExICovCi0jZWxzZQotCQl1MzIgcHNyX21pbjoxMjsJLyogYml0cyAwLTExICovCi0JCXUzMiB1bnVzZWQ6MjA7CS8qIGJpdHMgMTItMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gUlhETUFfUFNSX01JTl9ERVNfdCwgKlBSWERNQV9QU1JfTUlOX0RFU190OwogCiAvKgogICogc3RydWN0dXJlIGZvciBmcmVlIGJ1ZmZlciByaW5nIGJhc2UgbG8gYWRkcmVzcyByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKQEAgLTUxNCw2ICs0MzksOSBAQAogLyoKICAqIHN0cnVjdHVyZSBmb3IgZnJlZSBidWZmZXIgcmluZyBudW1iZXIgb2YgZGVzY3JpcHRvcnMgcmVnIGluIHJ4ZG1hIGFkZHJlc3MKICAqIG1hcC4gIExvY2F0ZWQgYXQgYWRkcmVzcyAweDIwNDQKKyAqCisgKiAzMS0xMDogdW51c2VkCisgKiA5LTA6IGZiciBuZGVzYwogICovCiB0eXBlZGVmIHVuaW9uIF9SWERNQV9GQlJfTlVNX0RFU190IHsKIAl1MzIgdmFsdWU7CkBAIC01NDMsMzYgKzQ3MSwxOCBAQAogLyoKICAqIHN0cnVjdHVyZSBmb3IgZnJlZSBidWZmZXIgY2FjaGUgMCBmdWxsIG9mZnNldCByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwNTAKKyAqCisgKiAzMS01OiB1bnVzZWQKKyAqIDQtMDogZmJjIHJkaQogICovCi10eXBlZGVmIHVuaW9uIF9SWERNQV9GQkNfUkRfSU5ERVhfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgdW51c2VkOjI3OwkvKiBiaXRzIDUtMzEgKi8KLQkJdTMyIGZiY19yZGk6NTsJLyogYml0IDAtNCAqLwotI2Vsc2UKLQkJdTMyIGZiY19yZGk6NTsJLyogYml0IDAtNCAqLwotCQl1MzIgdW51c2VkOjI3OwkvKiBiaXRzIDUtMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gUlhETUFfRkJDX1JEX0lOREVYX3QsICpQUlhETUFfRkJDX1JEX0lOREVYX3Q7CiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIGZyZWUgYnVmZmVyIHJpbmcgMCBtaW5pbXVtIGRlc2NyaXB0b3IgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDU0CisgKgorICogMzEtMTA6IHVudXNlZAorICogOS0wOiBmYnIgbWluCiAgKi8KLXR5cGVkZWYgdW5pb24gX1JYRE1BX0ZCUl9NSU5fREVTX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHVudXNlZDoyMjsJLyogYml0cyAxMC0zMSAqLwotCQl1MzIgZmJyX21pbjoxMDsJLyogYml0cyAwLTkgKi8KLSNlbHNlCi0JCXUzMiBmYnJfbWluOjEwOwkvKiBiaXRzIDAtOSAqLwotCQl1MzIgdW51c2VkOjIyOwkvKiBiaXRzIDEwLTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IFJYRE1BX0ZCUl9NSU5fREVTX3QsICpQUlhETUFfRkJSX01JTl9ERVNfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgZnJlZSBidWZmZXIgcmluZyAxIGJhc2UgYWRkcmVzcyBsbyByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKQEAgLTYxOCwzMiArNTI4LDMyIEBACiAJUlhETUFfQ1NSX3QgY3NyOwkJCQkvKiAgMHgyMDAwICovCiAJdTMyIGRtYV93Yl9iYXNlX2xvOwkJCQkvKiAgMHgyMDA0ICovCiAJdTMyIGRtYV93Yl9iYXNlX2hpOwkJCQkvKiAgMHgyMDA4ICovCi0JUlhETUFfTlVNX1BLVF9ET05FX3QgbnVtX3BrdF9kb25lOwkJLyogIDB4MjAwQyAqLwotCVJYRE1BX01BWF9QS1RfVElNRV90IG1heF9wa3RfdGltZTsJCS8qICAweDIwMTAgKi8KKwl1MzIgbnVtX3BrdF9kb25lOwkJCQkvKiAgMHgyMDBDICovCisJdTMyIG1heF9wa3RfdGltZTsJCQkJLyogIDB4MjAxMCAqLwogCXUzMiByeHFfcmRfYWRkcjsJCQkJLyogIDB4MjAxNCAqLwotCXUzMiByeHFfcmRfYWRkcl9leHQ7CQkJLyogIDB4MjAxOCAqLworCXUzMiByeHFfcmRfYWRkcl9leHQ7CQkJCS8qICAweDIwMTggKi8KIAl1MzIgcnhxX3dyX2FkZHI7CQkJCS8qICAweDIwMUMgKi8KIAl1MzIgcHNyX2Jhc2VfbG87CQkJCS8qICAweDIwMjAgKi8KIAl1MzIgcHNyX2Jhc2VfaGk7CQkJCS8qICAweDIwMjQgKi8KLQlSWERNQV9QU1JfTlVNX0RFU190IHBzcl9udW1fZGVzOwkJLyogIDB4MjAyOCAqLwotCVJYRE1BX1BTUl9BVkFJTF9PRkZTRVRfdCBwc3JfYXZhaWxfb2Zmc2V0OwkvKiAgMHgyMDJDICovCi0JUlhETUFfUFNSX0ZVTExfT0ZGU0VUX3QgcHNyX2Z1bGxfb2Zmc2V0OwkvKiAgMHgyMDMwICovCi0JUlhETUFfUFNSX0FDQ0VTU19JTkRFWF90IHBzcl9hY2Nlc3NfaW5kZXg7CS8qICAweDIwMzQgKi8KLQlSWERNQV9QU1JfTUlOX0RFU190IHBzcl9taW5fZGVzOwkJLyogIDB4MjAzOCAqLworCXUzMiBwc3JfbnVtX2RlczsJCQkJLyogIDB4MjAyOCAqLworCXUzMiBwc3JfYXZhaWxfb2Zmc2V0OwkJCQkvKiAgMHgyMDJDICovCisJdTMyIHBzcl9mdWxsX29mZnNldDsJCQkJLyogIDB4MjAzMCAqLworCXUzMiBwc3JfYWNjZXNzX2luZGV4OwkJCQkvKiAgMHgyMDM0ICovCisJdTMyIHBzcl9taW5fZGVzOwkJCQkvKiAgMHgyMDM4ICovCiAJdTMyIGZicjBfYmFzZV9sbzsJCQkJLyogIDB4MjAzQyAqLwogCXUzMiBmYnIwX2Jhc2VfaGk7CQkJCS8qICAweDIwNDAgKi8KLQlSWERNQV9GQlJfTlVNX0RFU190IGZicjBfbnVtX2RlczsJCS8qICAweDIwNDQgKi8KLQl1MzIgZmJyMF9hdmFpbF9vZmZzZXQ7CQkJLyogIDB4MjA0OCAqLwotCXUzMiBmYnIwX2Z1bGxfb2Zmc2V0OwkJCS8qICAweDIwNEMgKi8KLQlSWERNQV9GQkNfUkRfSU5ERVhfdCBmYnIwX3JkX2luZGV4OwkJLyogIDB4MjA1MCAqLwotCVJYRE1BX0ZCUl9NSU5fREVTX3QgZmJyMF9taW5fZGVzOwkJLyogIDB4MjA1NCAqLworCXUzMiBmYnIwX251bV9kZXM7CQkJCS8qICAweDIwNDQgKi8KKwl1MzIgZmJyMF9hdmFpbF9vZmZzZXQ7CQkJCS8qICAweDIwNDggKi8KKwl1MzIgZmJyMF9mdWxsX29mZnNldDsJCQkJLyogIDB4MjA0QyAqLworCXUzMiBmYnIwX3JkX2luZGV4OwkJCQkvKiAgMHgyMDUwICovCisJdTMyIGZicjBfbWluX2RlczsJCQkJLyogIDB4MjA1NCAqLwogCXUzMiBmYnIxX2Jhc2VfbG87CQkJCS8qICAweDIwNTggKi8KIAl1MzIgZmJyMV9iYXNlX2hpOwkJCQkvKiAgMHgyMDVDICovCi0JUlhETUFfRkJSX05VTV9ERVNfdCBmYnIxX251bV9kZXM7CQkvKiAgMHgyMDYwICovCi0JdTMyIGZicjFfYXZhaWxfb2Zmc2V0OwkJCS8qICAweDIwNjQgKi8KLQl1MzIgZmJyMV9mdWxsX29mZnNldDsJCQkvKiAgMHgyMDY4ICovCi0JUlhETUFfRkJDX1JEX0lOREVYX3QgZmJyMV9yZF9pbmRleDsJCS8qICAweDIwNkMgKi8KLQlSWERNQV9GQlJfTUlOX0RFU190IGZicjFfbWluX2RlczsJCS8qICAweDIwNzAgKi8KKwl1MzIgZmJyMV9udW1fZGVzOwkJCQkvKiAgMHgyMDYwICovCisJdTMyIGZicjFfYXZhaWxfb2Zmc2V0OwkJCQkvKiAgMHgyMDY0ICovCisJdTMyIGZicjFfZnVsbF9vZmZzZXQ7CQkJCS8qICAweDIwNjggKi8KKwl1MzIgZmJyMV9yZF9pbmRleDsJCQkJLyogIDB4MjA2QyAqLworCXUzMiBmYnIxX21pbl9kZXM7CQkJCS8qICAweDIwNzAgKi8KIH0gUlhETUFfdCwgKlBSWERNQV90OwogCiAvKiBFTkQgT0YgUlhETUEgUkVHSVNURVIgQUREUkVTUyBNQVAgKi8KQEAgLTY4NSwyMyArNTk1LDExIEBACiAvKgogICogc3RydWN0dXJlIGZvciBzaGFkb3cgcG9pbnRlciByZWcgaW4gdHhtYWMgYWRkcmVzcyBtYXAKICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDMwMDQKKyAqIDMxLTI3OiByZXNlcnZlZAorICogMjYtMTY6IHR4cSByZCBwdHIKKyAqIDE1LTExOiByZXNlcnZlZAorICogMTAtMDogdHhxIHdyIHB0cgogICovCi10eXBlZGVmIHVuaW9uIF9UWE1BQ19TSEFET1dfUFRSX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHJlc2VydmVkMjo1OwkvKiBiaXRzIDI3LTMxICovCi0JCXUzMiB0eHFfcmRfcHRyOjExOwkvKiBiaXRzIDE2LTI2ICovCi0JCXUzMiByZXNlcnZlZDo1OwkJLyogYml0cyAxMS0xNSAqLwotCQl1MzIgdHhxX3dyX3B0cjoxMTsJLyogYml0cyAwLTEwICovCi0jZWxzZQotCQl1MzIgdHhxX3dyX3B0cjoxMTsJLyogYml0cyAwLTEwICovCi0JCXUzMiByZXNlcnZlZDo1OwkJLyogYml0cyAxMS0xNSAqLwotCQl1MzIgdHhxX3JkX3B0cjoxMTsJLyogYml0cyAxNi0yNiAqLwotCQl1MzIgcmVzZXJ2ZWQyOjU7CS8qIGJpdHMgMjctMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gVFhNQUNfU0hBRE9XX1BUUl90LCAqUFRYTUFDX1NIQURPV19QVFJfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgZXJyb3IgY291bnQgcmVnIGluIHR4bWFjIGFkZHJlc3MgbWFwCkBAIC03MjcsNTkgKzYyNSwyNiBAQAogLyoKICAqIHN0cnVjdHVyZSBmb3IgbWF4IGZpbGwgcmVnIGluIHR4bWFjIGFkZHJlc3MgbWFwCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgzMDBDCisgKiAzMS0xMjogdW51c2VkCisgKiAxMS0wOiBtYXggZmlsbAogICovCi10eXBlZGVmIHVuaW9uIF9UWE1BQ19NQVhfRklMTF90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB1bnVzZWQ6MjA7CQkvKiBiaXRzIDEyLTMxICovCi0JCXUzMiBtYXhfZmlsbDoxMjsJLyogYml0cyAwLTExICovCi0jZWxzZQotCQl1MzIgbWF4X2ZpbGw6MTI7CS8qIGJpdHMgMC0xMSAqLwotCQl1MzIgdW51c2VkOjIwOwkJLyogYml0cyAxMi0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBUWE1BQ19NQVhfRklMTF90LCAqUFRYTUFDX01BWF9GSUxMX3Q7CiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIGNmIHBhcmFtZXRlciByZWcgaW4gdHhtYWMgYWRkcmVzcyBtYXAKICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDMwMTAKKyAqIDMxLTE2OiBjZmVwCisgKiAxNS0wOiBjZnB0CiAgKi8KLXR5cGVkZWYgdW5pb24gX1RYTUFDX0NGX1BBUkFNX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIGNmZXA6MTY7CS8qIGJpdHMgMTYtMzEgKi8KLQkJdTMyIGNmcHQ6MTY7CS8qIGJpdHMgMC0xNSAqLwotI2Vsc2UKLQkJdTMyIGNmcHQ6MTY7CS8qIGJpdHMgMC0xNSAqLwotCQl1MzIgY2ZlcDoxNjsJLyogYml0cyAxNi0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBUWE1BQ19DRl9QQVJBTV90LCAqUFRYTUFDX0NGX1BBUkFNX3Q7CiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIHR4IHRlc3QgcmVnIGluIHR4bWFjIGFkZHJlc3MgbWFwCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgzMDE0CisgKiAzMS0xNzogdW51c2VkCisgKiAxNjogcmVzZXJ2ZWQxCisgKiAxNTogdHh0ZXN0X2VuCisgKiAxNC0xMTogdW51c2VkCisgKiAxMC0wOiB0eHEgdGVzdCBwb2ludGVyCiAgKi8KLXR5cGVkZWYgdW5pb24gX1RYTUFDX1RYVEVTVF90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB1bnVzZWQyOjE1OwkJLyogYml0cyAxNy0zMSAqLwotCQl1MzIgcmVzZXJ2ZWQxOjE7CS8qIGJpdCAxNiAqLwotCQl1MzIgdHh0ZXN0X2VuOjE7CS8qIGJpdCAxNSAqLwotCQl1MzIgdW51c2VkMTo0OwkJLyogYml0cyAxMS0xNCAqLwotCQl1MzIgdHhxdGVzdF9wdHI6MTE7CS8qIGJpdHMgMC0xMSAqLwotI2Vsc2UKLQkJdTMyIHR4cXRlc3RfcHRyOjExOwkvKiBiaXRzIDAtMTAgKi8KLQkJdTMyIHVudXNlZDE6NDsJCS8qIGJpdHMgMTEtMTQgKi8KLQkJdTMyIHR4dGVzdF9lbjoxOwkvKiBiaXQgMTUgKi8KLQkJdTMyIHJlc2VydmVkMToxOwkvKiBiaXQgMTYgKi8KLQkJdTMyIHVudXNlZDI6MTU7CQkvKiBiaXRzIDE3LTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IFRYTUFDX1RYVEVTVF90LCAqUFRYTUFDX1RYVEVTVF90OwogCiAvKgogICogc3RydWN0dXJlIGZvciBlcnJvciByZWcgaW4gdHhtYWMgYWRkcmVzcyBtYXAKQEAgLTg0NiwzNSArNzExLDI1IEBACiAvKgogICogc3RydWN0dXJlIGZvciBlcnJvciBpbnRlcnJ1cHQgcmVnIGluIHR4bWFjIGFkZHJlc3MgbWFwCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgzMDIwCisgKgorICogMzEtMjogdW51c2VkCisgKiAxOiBicF9yZXEKKyAqIDA6IGJwX3hvbnhvZmYKICAqLwotdHlwZWRlZiB1bmlvbiBfVFhNQUNfQ1BfQ1RSTF90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB1bnVzZWQ6MzA7CQkvKiBiaXRzIDItMzEgKi8KLQkJdTMyIGJwX3JlcToxOwkJLyogYml0IDEgKi8KLQkJdTMyIGJwX3hvbnhvZmY6MTsJLyogYml0IDAgKi8KLSNlbHNlCi0JCXUzMiBicF94b254b2ZmOjE7CS8qIGJpdCAwICovCi0JCXUzMiBicF9yZXE6MTsJCS8qIGJpdCAxICovCi0JCXUzMiB1bnVzZWQ6MzA7CQkvKiBiaXRzIDItMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gVFhNQUNfQlBfQ1RSTF90LCAqUFRYTUFDX0JQX0NUUkxfdDsKIAogLyoKICAqIFR4IE1BQyBNb2R1bGUgb2YgSkFHQ29yZSBBZGRyZXNzIE1hcHBpbmcKICAqLwogdHlwZWRlZiBzdHJ1Y3QgX1RYTUFDX3QgewkJLyogTG9jYXRpb246ICovCiAJVFhNQUNfQ1RMX3QgY3RsOwkJLyogIDB4MzAwMCAqLwotCVRYTUFDX1NIQURPV19QVFJfdCBzaGFkb3dfcHRyOwkvKiAgMHgzMDA0ICovCisJdTMyIHNoYWRvd19wdHI7CQkJLyogIDB4MzAwNCAqLwogCVRYTUFDX0VSUl9DTlRfdCBlcnJfY250OwkvKiAgMHgzMDA4ICovCi0JVFhNQUNfTUFYX0ZJTExfdCBtYXhfZmlsbDsJLyogIDB4MzAwQyAqLwotCVRYTUFDX0NGX1BBUkFNX3QgY2ZfcGFyYW07CS8qICAweDMwMTAgKi8KLQlUWE1BQ19UWFRFU1RfdCB0eF90ZXN0OwkJLyogIDB4MzAxNCAqLworCXUzMiBtYXhfZmlsbDsJCQkvKiAgMHgzMDBDICovCisJdTMyIGNmX3BhcmFtOwkJCS8qICAweDMwMTAgKi8KKwl1MzIgdHhfdGVzdDsJCQkvKiAgMHgzMDE0ICovCiAJVFhNQUNfRVJSX3QgZXJyOwkJLyogIDB4MzAxOCAqLwogCVRYTUFDX0VSUl9JTlRfdCBlcnJfaW50OwkvKiAgMHgzMDFDICovCi0JVFhNQUNfQlBfQ1RSTF90IGJwX2N0cmw7CS8qICAweDMwMjAgKi8KKwl1MzIgYnBfY3RybDsJCQkvKiAgMHgzMDIwICovCiB9IFRYTUFDX3QsICpQVFhNQUNfdDsKIAogLyogRU5EIE9GIFRYTUFDIFJFR0lTVEVSIEFERFJFU1MgTUFQICovCkBAIC0xMzA4LDE1NyArMTE2Myw3NyBAQAogLyoKICAqIHN0cnVjdHVyZSBmb3IgY29uZmlndXJhdGlvbiAjMSByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAwMAorICoKKyAqIDMxOiBzb2Z0IHJlc2V0CisgKiAzMDogc2ltIHJlc2V0CisgKiAyOS0yMDogcmVzZXJ2ZWQKKyAqIDE5OiByZXNldCByeCBtYworICogMTg6IHJlc2V0IHR4IG1jCisgKiAxNzogcmVzZXQgcnggZnVuYworICogMTY6IHJlc2V0IHR4IGZuYworICogMTUtOTogcmVzZXJ2ZWQKKyAqIDg6IGxvb3BiYWNrCisgKiA3LTY6IHJlc2VydmVkCisgKiA1OiByeCBmbG93CisgKiA0OiB0eCBmbG93CisgKiAzOiBzeW5jZCByeCBlbgorICogMjogcnggZW5hYmxlCisgKiAxOiBzeW5jZCB0eCBlbgorICogMDogdHggZW5hYmxlCiAgKi8KLXR5cGVkZWYgdW5pb24gX01BQ19DRkcxX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHNvZnRfcmVzZXQ6MTsJCS8qIGJpdCAzMSAqLwotCQl1MzIgc2ltX3Jlc2V0OjE7CQkvKiBiaXQgMzAgKi8KLQkJdTMyIHJlc2VydmVkMzoxMDsJCS8qIGJpdHMgMjAtMjkgKi8KLQkJdTMyIHJlc2V0X3J4X21jOjE7CQkvKiBiaXQgMTkgKi8KLQkJdTMyIHJlc2V0X3R4X21jOjE7CQkvKiBiaXQgMTggKi8KLQkJdTMyIHJlc2V0X3J4X2Z1bjoxOwkvKiBiaXQgMTcgKi8KLQkJdTMyIHJlc2V0X3R4X2Z1bjoxOwkvKiBiaXQgMTYgKi8KLQkJdTMyIHJlc2VydmVkMjo3OwkJLyogYml0cyA5LTE1ICovCi0JCXUzMiBsb29wX2JhY2s6MTsJCS8qIGJpdCA4ICovCi0JCXUzMiByZXNlcnZlZDE6MjsJCS8qIGJpdHMgNi03ICovCi0JCXUzMiByeF9mbG93OjE7CQkvKiBiaXQgNSAqLwotCQl1MzIgdHhfZmxvdzoxOwkJLyogYml0IDQgKi8KLQkJdTMyIHN5bmNkX3J4X2VuOjE7CQkvKiBiaXQgMyAqLwotCQl1MzIgcnhfZW5hYmxlOjE7CQkvKiBiaXQgMiAqLwotCQl1MzIgc3luY2RfdHhfZW46MTsJCS8qIGJpdCAxICovCi0JCXUzMiB0eF9lbmFibGU6MTsJCS8qIGJpdCAwICovCi0jZWxzZQotCQl1MzIgdHhfZW5hYmxlOjE7CQkvKiBiaXQgMCAqLwotCQl1MzIgc3luY2RfdHhfZW46MTsJCS8qIGJpdCAxICovCi0JCXUzMiByeF9lbmFibGU6MTsJCS8qIGJpdCAyICovCi0JCXUzMiBzeW5jZF9yeF9lbjoxOwkJLyogYml0IDMgKi8KLQkJdTMyIHR4X2Zsb3c6MTsJCS8qIGJpdCA0ICovCi0JCXUzMiByeF9mbG93OjE7CQkvKiBiaXQgNSAqLwotCQl1MzIgcmVzZXJ2ZWQxOjI7CQkvKiBiaXRzIDYtNyAqLwotCQl1MzIgbG9vcF9iYWNrOjE7CQkvKiBiaXQgOCAqLwotCQl1MzIgcmVzZXJ2ZWQyOjc7CQkvKiBiaXRzIDktMTUgKi8KLQkJdTMyIHJlc2V0X3R4X2Z1bjoxOwkvKiBiaXQgMTYgKi8KLQkJdTMyIHJlc2V0X3J4X2Z1bjoxOwkvKiBiaXQgMTcgKi8KLQkJdTMyIHJlc2V0X3R4X21jOjE7CQkvKiBiaXQgMTggKi8KLQkJdTMyIHJlc2V0X3J4X21jOjE7CQkvKiBiaXQgMTkgKi8KLQkJdTMyIHJlc2VydmVkMzoxMDsJCS8qIGJpdHMgMjAtMjkgKi8KLQkJdTMyIHNpbV9yZXNldDoxOwkJLyogYml0IDMwICovCi0JCXUzMiBzb2Z0X3Jlc2V0OjE7CQkvKiBiaXQgMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gTUFDX0NGRzFfdCwgKlBNQUNfQ0ZHMV90OworCisjZGVmaW5lIENGRzFfTE9PUEJBQ0sJMHgwMDAwMDEwMAorI2RlZmluZSBDRkcxX1JYX0ZMT1cJMHgwMDAwMDAyMAorI2RlZmluZSBDRkcxX1RYX0ZMT1cJMHgwMDAwMDAxMAorI2RlZmluZSBDRkcxX1JYX0VOQUJMRQkweDAwMDAwMDA0CisjZGVmaW5lIENGRzFfVFhfRU5BQkxFCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ0ZHMV9XQUlUCTB4MDAwMDAwMEEJLyogUlggJiBUWCBzeW5jZCAqLwogCiAvKgogICogc3RydWN0dXJlIGZvciBjb25maWd1cmF0aW9uICMyIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDA0CisgKiAzMS0xNjogcmVzZXJ2ZWQKKyAqIDE1LTEyOiBwcmVhbWJsZQorICogMTEtMTA6IHJlc2VydmVkCisgKiA5LTg6IGlmIG1vZGUKKyAqIDctNjogcmVzZXJ2ZWQKKyAqIDU6IGh1Z2UgZnJhbWUKKyAqIDQ6IGxlbmd0aCBjaGVjaworICogMzogdW5kZWZpbmVkCisgKiAyOiBwYWQgY3JjCisgKiAxOiBjcmMgZW5hYmxlCisgKiAwOiBmdWxsIGR1cGxleAogICovCi10eXBlZGVmIHVuaW9uIF9NQUNfQ0ZHMl90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiByZXNlcnZlZDM6MTY7CQkvKiBiaXRzIDE2LTMxICovCi0JCXUzMiBwcmVhbWJsZV9sZW46NDsJLyogYml0cyAxMi0xNSAqLwotCQl1MzIgcmVzZXJ2ZWQyOjI7CQkvKiBiaXRzIDEwLTExICovCi0JCXUzMiBpZl9tb2RlOjI7CQkvKiBiaXRzIDgtOSAqLwotCQl1MzIgcmVzZXJ2ZWQxOjI7CQkvKiBiaXRzIDYtNyAqLwotCQl1MzIgaHVnZV9mcmFtZToxOwkJLyogYml0IDUgKi8KLQkJdTMyIGxlbl9jaGVjazoxOwkJLyogYml0IDQgKi8KLQkJdTMyIHVuZGVmaW5lZDoxOwkJLyogYml0IDMgKi8KLQkJdTMyIHBhZF9jcmM6MTsJCS8qIGJpdCAyICovCi0JCXUzMiBjcmNfZW5hYmxlOjE7CQkvKiBiaXQgMSAqLwotCQl1MzIgZnVsbF9kdXBsZXg6MTsJCS8qIGJpdCAwICovCi0jZWxzZQotCQl1MzIgZnVsbF9kdXBsZXg6MTsJCS8qIGJpdCAwICovCi0JCXUzMiBjcmNfZW5hYmxlOjE7CQkvKiBiaXQgMSAqLwotCQl1MzIgcGFkX2NyYzoxOwkJLyogYml0IDIgKi8KLQkJdTMyIHVuZGVmaW5lZDoxOwkJLyogYml0IDMgKi8KLQkJdTMyIGxlbl9jaGVjazoxOwkJLyogYml0IDQgKi8KLQkJdTMyIGh1Z2VfZnJhbWU6MTsJCS8qIGJpdCA1ICovCi0JCXUzMiByZXNlcnZlZDE6MjsJCS8qIGJpdHMgNi03ICovCi0JCXUzMiBpZl9tb2RlOjI7CQkvKiBiaXRzIDgtOSAqLwotCQl1MzIgcmVzZXJ2ZWQyOjI7CQkvKiBiaXRzIDEwLTExICovCi0JCXUzMiBwcmVhbWJsZV9sZW46NDsJLyogYml0cyAxMi0xNSAqLwotCQl1MzIgcmVzZXJ2ZWQzOjE2OwkJLyogYml0cyAxNi0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBNQUNfQ0ZHMl90LCAqUE1BQ19DRkcyX3Q7CisKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgSW50ZXJwYWNrZXQgZ2FwIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDA4Ci0gKi8KLXR5cGVkZWYgdW5pb24gX01BQ19JUEdfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgcmVzZXJ2ZWQ6MTsJCS8qIGJpdCAzMSAqLwotCQl1MzIgbm9uX0IyQl9pcGdfMTo3OwkvKiBiaXRzIDI0LTMwICovCi0JCXUzMiB1bmRlZmluZWQyOjE7CQkvKiBiaXQgMjMgKi8KLQkJdTMyIG5vbl9CMkJfaXBnXzI6NzsJLyogYml0cyAxNi0yMiAqLwotCQl1MzIgbWluX2lmZ19lbmZvcmNlOjg7CS8qIGJpdHMgOC0xNSAqLwotCQl1MzIgdW5kZWZpbmVkMToxOwkJLyogYml0IDcgKi8KLQkJdTMyIEIyQl9pcGc6NzsJCS8qIGJpdHMgMC02ICovCi0jZWxzZQotCQl1MzIgQjJCX2lwZzo3OwkJLyogYml0cyAwLTYgKi8KLQkJdTMyIHVuZGVmaW5lZDE6MTsJCS8qIGJpdCA3ICovCi0JCXUzMiBtaW5faWZnX2VuZm9yY2U6ODsJLyogYml0cyA4LTE1ICovCi0JCXUzMiBub25fQjJCX2lwZ18yOjc7CS8qIGJpdHMgMTYtMjIgKi8KLQkJdTMyIHVuZGVmaW5lZDI6MTsJCS8qIGJpdCAyMyAqLwotCQl1MzIgbm9uX0IyQl9pcGdfMTo3OwkvKiBiaXRzIDI0LTMwICovCi0JCXUzMiByZXNlcnZlZDoxOwkJLyogYml0IDMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IE1BQ19JUEdfdCwgKlBNQUNfSVBHX3Q7Ci0KLS8qCisgKgorICogMzE6IHJlc2VydmVkCisgKiAzMC0yNDogbm9uIEIyQiBpcGcgMQorICogMjM6IHVuZGVmaW5lZAorICogMjItMTY6IG5vbiBCMkIgaXBnIDIKKyAqIDE1LTg6IE1pbiBpZmcgZW5mb3JjZQorICogNy0wOiBCMkIgaXBnCisgKgogICogc3RydWN0dXJlIGZvciBoYWxmIGR1cGxleCByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAwQworICogMzEtMjQ6IHJlc2VydmVkCisgKiAyMy0yMDogQWx0IEJFQiB0cnVuYworICogMTk6IEFsdCBCRUIgZW5hYmxlCisgKiAxODogQlAgbm8gYmFja29mZgorICogMTc6IG5vIGJhY2tvZmYKKyAqIDE2OiBleGNlc3MgZGVmZXIKKyAqIDE1LTEyOiByZS14bWl0IG1heAorICogMTEtMTA6IHJlc2VydmVkCisgKiA5LTA6IGNvbGxpc2lvbiB3aW5kb3cKICAqLwotdHlwZWRlZiB1bmlvbiBfTUFDX0hGRFBfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgcmVzZXJ2ZWQyOjg7CQkvKiBiaXRzIDI0LTMxICovCi0JCXUzMiBhbHRfYmViX3RydW5jOjQ7CS8qIGJpdHMgMjMtMjAgKi8KLQkJdTMyIGFsdF9iZWJfZW5hYmxlOjE7CS8qIGJpdCAxOSAqLwotCQl1MzIgYnBfbm9fYmFja29mZjoxOwkvKiBiaXQgMTggKi8KLQkJdTMyIG5vX2JhY2tvZmY6MTsJCS8qIGJpdCAxNyAqLwotCQl1MzIgZXhjZXNzX2RlZmVyOjE7CS8qIGJpdCAxNiAqLwotCQl1MzIgcmV4bWl0X21heDo0OwkJLyogYml0cyAxMi0xNSAqLwotCQl1MzIgcmVzZXJ2ZWQxOjI7CQkvKiBiaXRzIDEwLTExICovCi0JCXUzMiBjb2xsX3dpbmRvdzoxMDsJLyogYml0cyAwLTkgKi8KLSNlbHNlCi0JCXUzMiBjb2xsX3dpbmRvdzoxMDsJLyogYml0cyAwLTkgKi8KLQkJdTMyIHJlc2VydmVkMToyOwkJLyogYml0cyAxMC0xMSAqLwotCQl1MzIgcmV4bWl0X21heDo0OwkJLyogYml0cyAxMi0xNSAqLwotCQl1MzIgZXhjZXNzX2RlZmVyOjE7CS8qIGJpdCAxNiAqLwotCQl1MzIgbm9fYmFja29mZjoxOwkJLyogYml0IDE3ICovCi0JCXUzMiBicF9ub19iYWNrb2ZmOjE7CS8qIGJpdCAxOCAqLwotCQl1MzIgYWx0X2JlYl9lbmFibGU6MTsJLyogYml0IDE5ICovCi0JCXUzMiBhbHRfYmViX3RydW5jOjQ7CS8qIGJpdHMgMjMtMjAgKi8KLQkJdTMyIHJlc2VydmVkMjo4OwkJLyogYml0cyAyNC0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBNQUNfSEZEUF90LCAqUE1BQ19IRkRQX3Q7CiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIE1heGltdW0gRnJhbWUgTGVuZ3RoIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDEwCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDEwOiBiaXRzIDAtMTUgaG9sZCB0aGUgbGVuZ3RoLgogICovCi10eXBlZGVmIHVuaW9uIF9NQUNfTUFYX0ZNX0xFTl90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiByZXNlcnZlZDoxNjsJLyogYml0cyAxNi0zMSAqLwotCQl1MzIgbWF4X2xlbjoxNjsJLyogYml0cyAwLTE1ICovCi0jZWxzZQotCQl1MzIgbWF4X2xlbjoxNjsJLyogYml0cyAwLTE1ICovCi0JCXUzMiByZXNlcnZlZDoxNjsJLyogYml0cyAxNi0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBNQUNfTUFYX0ZNX0xFTl90LCAqUE1BQ19NQVhfRk1fTEVOX3Q7CiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIFJlc2VydmUgMSByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgpAQCAtMTQ2OSwxODYgKzEyNDQsODcgQEAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIFRlc3QgcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwMUMKKyAqIHRlc3Q6IGJpdHMgMC0yLCByZXN0IHVudXNlZAogICovCi10eXBlZGVmIHVuaW9uIF9NQUNfVEVTVF90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB1bnVzZWQ6Mjk7CS8qIGJpdHMgMy0zMSAqLwotCQl1MzIgbWFjX3Rlc3Q6MzsJLyogYml0cyAwLTIgKi8KLSNlbHNlCi0JCXUzMiBtYWNfdGVzdDozOwkvKiBiaXRzIDAtMiAqLwotCQl1MzIgdW51c2VkOjI5OwkvKiBiaXRzIDMtMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gTUFDX1RFU1RfdCwgKlBNQUNfVEVTVF90OwogCiAvKgogICogc3RydWN0dXJlIGZvciBNSUkgTWFuYWdlbWVudCBDb25maWd1cmF0aW9uIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDIwCisgKgorICogMzE6IHJlc2V0IE1JSSBtZ210CisgKiAzMC02OiB1bnVzZWQKKyAqIDU6IHNjYW4gYXV0byBpbmNyZW1lbnQKKyAqIDQ6IHByZWFtYmxlIHN1cHJlc3MKKyAqIDM6IHVuZGVmaW5lZAorICogMi0wOiBtZ210IGNsb2NrIHJlc2V0CiAgKi8KLXR5cGVkZWYgdW5pb24gX01JSV9NR01UX0NGR190IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiByZXNldF9taWlfbWdtdDoxOwkvKiBiaXQgMzEgKi8KLQkJdTMyIHJlc2VydmVkOjI1OwkJLyogYml0cyA2LTMwICovCi0JCXUzMiBzY2FuX2F1dG9faW5jcmVtdDoxOwkvKiBiaXQgNSAqLwotCQl1MzIgcHJlYW1ibGVfc3VwcHJlc3M6MTsJLyogYml0IDQgKi8KLQkJdTMyIHVuZGVmaW5lZDoxOwkJLyogYml0IDMgKi8KLQkJdTMyIG1nbXRfY2xrX3Jlc2V0OjM7CS8qIGJpdHMgMC0yICovCi0jZWxzZQotCQl1MzIgbWdtdF9jbGtfcmVzZXQ6MzsJLyogYml0cyAwLTIgKi8KLQkJdTMyIHVuZGVmaW5lZDoxOwkJLyogYml0IDMgKi8KLQkJdTMyIHByZWFtYmxlX3N1cHByZXNzOjE7CS8qIGJpdCA0ICovCi0JCXUzMiBzY2FuX2F1dG9faW5jcmVtdDoxOwkvKiBiaXQgNSAqLwotCQl1MzIgcmVzZXJ2ZWQ6MjU7CQkvKiBiaXRzIDYtMzAgKi8KLQkJdTMyIHJlc2V0X21paV9tZ210OjE7CS8qIGJpdCAzMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBNSUlfTUdNVF9DRkdfdCwgKlBNSUlfTUdNVF9DRkdfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgTUlJIE1hbmFnZW1lbnQgQ29tbWFuZCByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAyNAorICogYml0IDE6IHNjYW4gY3ljbGUKKyAqIGJpdCAwOiByZWFkIGN5Y2xlCiAgKi8KLXR5cGVkZWYgdW5pb24gX01JSV9NR01UX0NNRF90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiByZXNlcnZlZDozMDsJLyogYml0cyAyLTMxICovCi0JCXUzMiBzY2FuX2N5Y2xlOjE7CS8qIGJpdCAxICovCi0JCXUzMiByZWFkX2N5Y2xlOjE7CS8qIGJpdCAwICovCi0jZWxzZQotCQl1MzIgcmVhZF9jeWNsZToxOwkvKiBiaXQgMCAqLwotCQl1MzIgc2Nhbl9jeWNsZToxOwkvKiBiaXQgMSAqLwotCQl1MzIgcmVzZXJ2ZWQ6MzA7CS8qIGJpdHMgMi0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBNSUlfTUdNVF9DTURfdCwgKlBNSUlfTUdNVF9DTURfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgTUlJIE1hbmFnZW1lbnQgQWRkcmVzcyByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAyOAorICogMzEtMTM6IHJlc2VydmVkCisgKiAxMi04OiBwaHkgYWRkcgorICogNy01OiByZXNlcnZlZAorICogNC0wOiByZWdpc3RlcgogICovCi10eXBlZGVmIHVuaW9uIF9NSUlfTUdNVF9BRERSX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHJlc2VydmVkMjoxOTsJLyogYml0IDEzLTMxICovCi0JCXUzMiBwaHlfYWRkcjo1OwkvKiBiaXRzIDgtMTIgKi8KLQkJdTMyIHJlc2VydmVkMTozOwkvKiBiaXRzIDUtNyAqLwotCQl1MzIgcmVnX2FkZHI6NTsJLyogYml0cyAwLTQgKi8KLSNlbHNlCi0JCXUzMiByZWdfYWRkcjo1OwkvKiBiaXRzIDAtNCAqLwotCQl1MzIgcmVzZXJ2ZWQxOjM7CS8qIGJpdHMgNS03ICovCi0JCXUzMiBwaHlfYWRkcjo1OwkvKiBiaXRzIDgtMTIgKi8KLQkJdTMyIHJlc2VydmVkMjoxOTsJLyogYml0IDEzLTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IE1JSV9NR01UX0FERFJfdCwgKlBNSUlfTUdNVF9BRERSX3Q7CisKKyNkZWZpbmUgTUlJX0FERFIocGh5LHJlZykJKChwaHkpIDw8IDggfCAocmVnKSkKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgTUlJIE1hbmFnZW1lbnQgQ29udHJvbCByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAyQworICogMzEtMTY6IHJlc2VydmVkCisgKiAxNS0wOiBwaHkgY29udHJvbAogICovCi10eXBlZGVmIHVuaW9uIF9NSUlfTUdNVF9DVFJMX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHJlc2VydmVkOjE2OwkvKiBiaXRzIDE2LTMxICovCi0JCXUzMiBwaHlfY3RybDoxNjsJLyogYml0cyAwLTE1ICovCi0jZWxzZQotCQl1MzIgcGh5X2N0cmw6MTY7CS8qIGJpdHMgMC0xNSAqLwotCQl1MzIgcmVzZXJ2ZWQ6MTY7CS8qIGJpdHMgMTYtMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gTUlJX01HTVRfQ1RSTF90LCAqUE1JSV9NR01UX0NUUkxfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgTUlJIE1hbmFnZW1lbnQgU3RhdHVzIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDMwCisgKiAzMS0xNjogcmVzZXJ2ZWQKKyAqIDE1LTA6IHBoeSBjb250cm9sCiAgKi8KLXR5cGVkZWYgdW5pb24gX01JSV9NR01UX1NUQVRfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgcmVzZXJ2ZWQ6MTY7CS8qIGJpdHMgMTYtMzEgKi8KLQkJdTMyIHBoeV9zdGF0OjE2OwkvKiBiaXRzIDAtMTUgKi8KLSNlbHNlCi0JCXUzMiBwaHlfc3RhdDoxNjsJLyogYml0cyAwLTE1ICovCi0JCXUzMiByZXNlcnZlZDoxNjsJLyogYml0cyAxNi0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBNSUlfTUdNVF9TVEFUX3QsICpQTUlJX01HTVRfU1RBVF90OwogCiAvKgogICogc3RydWN0dXJlIGZvciBNSUkgTWFuYWdlbWVudCBJbmRpY2F0b3JzIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDM0CisgKiAzMS0zOiByZXNlcnZlZAorICogMjogbm90IHZhbGlkCisgKiAxOiBzY2FubmluZworICogMDogYnVzeQogICovCi10eXBlZGVmIHVuaW9uIF9NSUlfTUdNVF9JTkRJQ0FUT1JfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgcmVzZXJ2ZWQ6Mjk7CS8qIGJpdHMgMy0zMSAqLwotCQl1MzIgbm90X3ZhbGlkOjE7CS8qIGJpdCAyICovCi0JCXUzMiBzY2FubmluZzoxOwkvKiBiaXQgMSAqLwotCQl1MzIgYnVzeToxOwkvKiBiaXQgMCAqLwotI2Vsc2UKLQkJdTMyIGJ1c3k6MTsJLyogYml0IDAgKi8KLQkJdTMyIHNjYW5uaW5nOjE7CS8qIGJpdCAxICovCi0JCXUzMiBub3RfdmFsaWQ6MTsJLyogYml0IDIgKi8KLQkJdTMyIHJlc2VydmVkOjI5OwkvKiBiaXRzIDMtMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gTUlJX01HTVRfSU5ESUNBVE9SX3QsICpQTUlJX01HTVRfSU5ESUNBVE9SX3Q7CisKKyNkZWZpbmUgTUdNVF9CVVNZCTB4MDAwMDAwMDEJLyogYnVzeSAqLworI2RlZmluZSBNR01UX1dBSVQJMHgwMDAwMDAwNQkvKiBidXN5IHwgbm90IHZhbGlkICovCiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIEludGVyZmFjZSBDb250cm9sIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDM4CisgKgorICogMzE6IHJlc2V0IGlmIG1vZHVsZQorICogMzAtMjg6IHJlc2VydmVkCisgKiAyNzogdGJpIG1vZGUKKyAqIDI2OiBnaGQgbW9kZQorICogMjU6IGxoZCBtb2RlCisgKiAyNDogcGh5IG1vZGUKKyAqIDIzOiByZXNldCBwZXIgbWlpCisgKiAyMi0xNzogcmVzZXJ2ZWQKKyAqIDE2OiBzcGVlZAorICogMTU6IHJlc2V0IHBlMTAweAorICogMTQtMTE6IHJlc2VydmVkCisgKiAxMDogZm9yY2UgcXVpZXQKKyAqIDk6IG5vIGNpcGhlcgorICogODogZGlzYWJsZSBsaW5rIGZhaWwKKyAqIDc6IHJlc2V0IGdwc2kKKyAqIDYtMTogcmVzZXJ2ZWQKKyAqIDA6IGVuYWJsZSBqYWJiZXIgcHJvdGVjdGlvbgogICovCi10eXBlZGVmIHVuaW9uIF9NQUNfSUZfQ1RSTF90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiByZXNldF9pZl9tb2R1bGU6MTsJLyogYml0IDMxICovCi0JCXUzMiByZXNlcnZlZDQ6MzsJCS8qIGJpdCAyOC0zMCAqLwotCQl1MzIgdGJpX21vZGU6MTsJCS8qIGJpdCAyNyAqLwotCQl1MzIgZ2hkX21vZGU6MTsJCS8qIGJpdCAyNiAqLwotCQl1MzIgbGhkX21vZGU6MTsJCS8qIGJpdCAyNSAqLwotCQl1MzIgcGh5X21vZGU6MTsJCS8qIGJpdCAyNCAqLwotCQl1MzIgcmVzZXRfcGVyX21paToxOwkvKiBiaXQgMjMgKi8KLQkJdTMyIHJlc2VydmVkMzo2OwkJLyogYml0cyAxNy0yMiAqLwotCQl1MzIgc3BlZWQ6MTsJCS8qIGJpdCAxNiAqLwotCQl1MzIgcmVzZXRfcGUxMDB4OjE7CS8qIGJpdCAxNSAqLwotCQl1MzIgcmVzZXJ2ZWQyOjQ7CQkvKiBiaXRzIDExLTE0ICovCi0JCXUzMiBmb3JjZV9xdWlldDoxOwkJLyogYml0IDEwICovCi0JCXUzMiBub19jaXBoZXI6MTsJCS8qIGJpdCA5ICovCi0JCXUzMiBkaXNhYmxlX2xpbmtfZmFpbDoxOwkvKiBiaXQgOCAqLwotCQl1MzIgcmVzZXRfZ3BzaToxOwkJLyogYml0IDcgKi8KLQkJdTMyIHJlc2VydmVkMTo2OwkJLyogYml0cyAxLTYgKi8KLQkJdTMyIGVuYWJfamFiX3Byb3RlY3Q6MTsJLyogYml0IDAgKi8KLSNlbHNlCi0JCXUzMiBlbmFiX2phYl9wcm90ZWN0OjE7CS8qIGJpdCAwICovCi0JCXUzMiByZXNlcnZlZDE6NjsJCS8qIGJpdHMgMS02ICovCi0JCXUzMiByZXNldF9ncHNpOjE7CQkvKiBiaXQgNyAqLwotCQl1MzIgZGlzYWJsZV9saW5rX2ZhaWw6MTsJLyogYml0IDggKi8KLQkJdTMyIG5vX2NpcGhlcjoxOwkJLyogYml0IDkgKi8KLQkJdTMyIGZvcmNlX3F1aWV0OjE7CQkvKiBiaXQgMTAgKi8KLQkJdTMyIHJlc2VydmVkMjo0OwkJLyogYml0cyAxMS0xNCAqLwotCQl1MzIgcmVzZXRfcGUxMDB4OjE7CS8qIGJpdCAxNSAqLwotCQl1MzIgc3BlZWQ6MTsJCS8qIGJpdCAxNiAqLwotCQl1MzIgcmVzZXJ2ZWQzOjY7CQkvKiBiaXRzIDE3LTIyICovCi0JCXUzMiByZXNldF9wZXJfbWlpOjE7CS8qIGJpdCAyMyAqLwotCQl1MzIgcGh5X21vZGU6MTsJCS8qIGJpdCAyNCAqLwotCQl1MzIgbGhkX21vZGU6MTsJCS8qIGJpdCAyNSAqLwotCQl1MzIgZ2hkX21vZGU6MTsJCS8qIGJpdCAyNiAqLwotCQl1MzIgdGJpX21vZGU6MTsJCS8qIGJpdCAyNyAqLwotCQl1MzIgcmVzZXJ2ZWQ0OjM7CQkvKiBiaXQgMjgtMzAgKi8KLQkJdTMyIHJlc2V0X2lmX21vZHVsZToxOwkvKiBiaXQgMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gTUFDX0lGX0NUUkxfdCwgKlBNQUNfSUZfQ1RSTF90OwogCiAvKgogICogc3RydWN0dXJlIGZvciBJbnRlcmZhY2UgU3RhdHVzIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCkBAIC0xNzI5LDIxICsxNDA1LDIxIEBACiAgKiBNQUMgTW9kdWxlIG9mIEpBR0NvcmUgQWRkcmVzcyBNYXBwaW5nCiAgKi8KIHR5cGVkZWYgc3RydWN0IF9NQUNfdCB7CQkJCQkvKiBMb2NhdGlvbjogKi8KLQlNQUNfQ0ZHMV90IGNmZzE7CQkJCS8qICAweDUwMDAgKi8KLQlNQUNfQ0ZHMl90IGNmZzI7CQkJCS8qICAweDUwMDQgKi8KLQlNQUNfSVBHX3QgaXBnOwkJCQkJLyogIDB4NTAwOCAqLwotCU1BQ19IRkRQX3QgaGZkcDsJCQkJLyogIDB4NTAwQyAqLwotCU1BQ19NQVhfRk1fTEVOX3QgbWF4X2ZtX2xlbjsJCQkvKiAgMHg1MDEwICovCisJdTMyIGNmZzE7CQkJCQkvKiAgMHg1MDAwICovCisJdTMyIGNmZzI7CQkJCQkvKiAgMHg1MDA0ICovCisJdTMyIGlwZzsJCQkJCS8qICAweDUwMDggKi8KKwl1MzIgaGZkcDsJCQkJCS8qICAweDUwMEMgKi8KKwl1MzIgbWF4X2ZtX2xlbjsJCQkJCS8qICAweDUwMTAgKi8KIAl1MzIgcnN2MTsJCQkJCS8qICAweDUwMTQgKi8KIAl1MzIgcnN2MjsJCQkJCS8qICAweDUwMTggKi8KLQlNQUNfVEVTVF90IG1hY190ZXN0OwkJCQkvKiAgMHg1MDFDICovCi0JTUlJX01HTVRfQ0ZHX3QgbWlpX21nbXRfY2ZnOwkJCS8qICAweDUwMjAgKi8KLQlNSUlfTUdNVF9DTURfdCBtaWlfbWdtdF9jbWQ7CQkJLyogIDB4NTAyNCAqLwotCU1JSV9NR01UX0FERFJfdCBtaWlfbWdtdF9hZGRyOwkJCS8qICAweDUwMjggKi8KLQlNSUlfTUdNVF9DVFJMX3QgbWlpX21nbXRfY3RybDsJCQkvKiAgMHg1MDJDICovCi0JTUlJX01HTVRfU1RBVF90IG1paV9tZ210X3N0YXQ7CQkJLyogIDB4NTAzMCAqLwotCU1JSV9NR01UX0lORElDQVRPUl90IG1paV9tZ210X2luZGljYXRvcjsJLyogIDB4NTAzNCAqLwotCU1BQ19JRl9DVFJMX3QgaWZfY3RybDsJCQkJLyogIDB4NTAzOCAqLworCXUzMiBtYWNfdGVzdDsJCQkJCS8qICAweDUwMUMgKi8KKwl1MzIgbWlpX21nbXRfY2ZnOwkJCQkvKiAgMHg1MDIwICovCisJdTMyIG1paV9tZ210X2NtZDsJCQkJLyogIDB4NTAyNCAqLworCXUzMiBtaWlfbWdtdF9hZGRyOwkJCQkvKiAgMHg1MDI4ICovCisJdTMyIG1paV9tZ210X2N0cmw7CQkJCS8qICAweDUwMkMgKi8KKwl1MzIgbWlpX21nbXRfc3RhdDsJCQkJLyogIDB4NTAzMCAqLworCXUzMiBtaWlfbWdtdF9pbmRpY2F0b3I7CQkJCS8qICAweDUwMzQgKi8KKwl1MzIgaWZfY3RybDsJCQkJCS8qICAweDUwMzggKi8KIAlNQUNfSUZfU1RBVF90IGlmX3N0YXQ7CQkJCS8qICAweDUwM0MgKi8KIAlNQUNfU1RBVElPTl9BRERSMV90IHN0YXRpb25fYWRkcl8xOwkJLyogIDB4NTA0MCAqLwogCU1BQ19TVEFUSU9OX0FERFIyX3Qgc3RhdGlvbl9hZGRyXzI7CQkvKiAgMHg1MDQ0ICovCkBAIC0xNzU2LDEyMCArMTQzMiw2MCBAQAogLyoKICAqIHN0cnVjdHVyZSBmb3IgQ2FycnkgUmVnaXN0ZXIgT25lIGFuZCBpdCdzIE1hc2sgUmVnaXN0ZXIgcmVnIGxvY2F0ZWQgaW4gbWFjCiAgKiBzdGF0IGFkZHJlc3MgbWFwIGFkZHJlc3MgMHg2MTMwIGFuZCAweDYxMzguCisgKgorICogMzE6IHRyNjQKKyAqIDMwOiB0cjEyNworICogMjk6IHRyMjU1CisgKiAyODogdHI1MTEKKyAqIDI3OiB0cjFrCisgKiAyNjogdHJtYXgKKyAqIDI1OiB0cm1ndgorICogMjQtMTc6IHVudXNlZAorICogMTY6IHJieXQKKyAqIDE1OiBycGt0CisgKiAxNDogcmZjcworICogMTM6IHJtY2EKKyAqIDEyOiByYmNhCisgKiAxMTogcnhjZgorICogMTA6IHJ4cGYKKyAqIDk6IHJ4dW8KKyAqIDg6IHJhbG4KKyAqIDc6IHJmbHIKKyAqIDY6IHJjZGUKKyAqIDU6IHJjc2UKKyAqIDQ6IHJ1bmQKKyAqIDM6IHJvdnIKKyAqIDI6IHJmcmcKKyAqIDE6IHJqYnIKKyAqIDA6IHJkcnAKICAqLwotdHlwZWRlZiB1bmlvbiBfTUFDX1NUQVRfUkVHXzFfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgdHI2NDoxOwkvKiBiaXQgMzEgKi8KLQkJdTMyIHRyMTI3OjE7CS8qIGJpdCAzMCAqLwotCQl1MzIgdHIyNTU6MTsJLyogYml0IDI5ICovCi0JCXUzMiB0cjUxMToxOwkvKiBiaXQgMjggKi8KLQkJdTMyIHRyMWs6MTsJLyogYml0IDI3ICovCi0JCXUzMiB0cm1heDoxOwkvKiBiaXQgMjYgKi8KLQkJdTMyIHRybWd2OjE7CS8qIGJpdCAyNSAqLwotCQl1MzIgdW51c2VkOjg7CS8qIGJpdHMgMTctMjQgKi8KLQkJdTMyIHJieXQ6MTsJLyogYml0IDE2ICovCi0JCXUzMiBycGt0OjE7CS8qIGJpdCAxNSAqLwotCQl1MzIgcmZjczoxOwkvKiBiaXQgMTQgKi8KLQkJdTMyIHJtY2E6MTsJLyogYml0IDEzICovCi0JCXUzMiByYmNhOjE7CS8qIGJpdCAxMiAqLwotCQl1MzIgcnhjZjoxOwkvKiBiaXQgMTEgKi8KLQkJdTMyIHJ4cGY6MTsJLyogYml0IDEwICovCi0JCXUzMiByeHVvOjE7CS8qIGJpdCA5ICovCi0JCXUzMiByYWxuOjE7CS8qIGJpdCA4ICovCi0JCXUzMiByZmxyOjE7CS8qIGJpdCA3ICovCi0JCXUzMiByY2RlOjE7CS8qIGJpdCA2ICovCi0JCXUzMiByY3NlOjE7CS8qIGJpdCA1ICovCi0JCXUzMiBydW5kOjE7CS8qIGJpdCA0ICovCi0JCXUzMiByb3ZyOjE7CS8qIGJpdCAzICovCi0JCXUzMiByZnJnOjE7CS8qIGJpdCAyICovCi0JCXUzMiByamJyOjE7CS8qIGJpdCAxICovCi0JCXUzMiByZHJwOjE7CS8qIGJpdCAwICovCi0jZWxzZQotCQl1MzIgcmRycDoxOwkvKiBiaXQgMCAqLwotCQl1MzIgcmpicjoxOwkvKiBiaXQgMSAqLwotCQl1MzIgcmZyZzoxOwkvKiBiaXQgMiAqLwotCQl1MzIgcm92cjoxOwkvKiBiaXQgMyAqLwotCQl1MzIgcnVuZDoxOwkvKiBiaXQgNCAqLwotCQl1MzIgcmNzZToxOwkvKiBiaXQgNSAqLwotCQl1MzIgcmNkZToxOwkvKiBiaXQgNiAqLwotCQl1MzIgcmZscjoxOwkvKiBiaXQgNyAqLwotCQl1MzIgcmFsbjoxOwkvKiBiaXQgOCAqLwotCQl1MzIgcnh1bzoxOwkvKiBiaXQgOSAqLwotCQl1MzIgcnhwZjoxOwkvKiBiaXQgMTAgKi8KLQkJdTMyIHJ4Y2Y6MTsJLyogYml0IDExICovCi0JCXUzMiByYmNhOjE7CS8qIGJpdCAxMiAqLwotCQl1MzIgcm1jYToxOwkvKiBiaXQgMTMgKi8KLQkJdTMyIHJmY3M6MTsJLyogYml0IDE0ICovCi0JCXUzMiBycGt0OjE7CS8qIGJpdCAxNSAqLwotCQl1MzIgcmJ5dDoxOwkvKiBiaXQgMTYgKi8KLQkJdTMyIHVudXNlZDo4OwkvKiBiaXRzIDE3LTI0ICovCi0JCXUzMiB0cm1ndjoxOwkvKiBiaXQgMjUgKi8KLQkJdTMyIHRybWF4OjE7CS8qIGJpdCAyNiAqLwotCQl1MzIgdHIxazoxOwkvKiBiaXQgMjcgKi8KLQkJdTMyIHRyNTExOjE7CS8qIGJpdCAyOCAqLwotCQl1MzIgdHIyNTU6MTsJLyogYml0IDI5ICovCi0JCXUzMiB0cjEyNzoxOwkvKiBiaXQgMzAgKi8KLQkJdTMyIHRyNjQ6MTsJLyogYml0IDMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IE1BQ19TVEFUX1JFR18xX3QsICpQTUFDX1NUQVRfUkVHXzFfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgQ2FycnkgUmVnaXN0ZXIgVHdvIE1hc2sgUmVnaXN0ZXIgcmVnIGluIG1hYyBzdGF0IGFkZHJlc3MgbWFwLgogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NjEzQworICoKKyAqIDMxLTIwOiB1bnVzZWQKKyAqIDE5OiB0amJyCisgKiAxODogdGZjcworICogMTc6IHR4Y2YKKyAqIDE2OiB0b3ZyCisgKiAxNTogdHVuZAorICogMTQ6IHRyZmcKKyAqIDEzOiB0Ynl0CisgKiAxMjogdHBrdAorICogMTE6IHRtY2EKKyAqIDEwOiB0YmNhCisgKiA5OiB0eHBmCisgKiA4OiB0ZGZyCisgKiA3OiB0ZWRmCisgKiA2OiB0c2NsCisgKiA1OiB0bWNsCisgKiA0OiB0bGNsCisgKiAzOiB0eGNsCisgKiAyOiB0bmNsCisgKiAxOiB0cGZoCisgKiAwOiB0ZHJwCiAgKi8KLXR5cGVkZWYgdW5pb24gX01BQ19TVEFUX1JFR18yX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHVudXNlZDoxMjsJLyogYml0IDIwLTMxICovCi0JCXUzMiB0amJyOjE7CS8qIGJpdCAxOSAqLwotCQl1MzIgdGZjczoxOwkvKiBiaXQgMTggKi8KLQkJdTMyIHR4Y2Y6MTsJLyogYml0IDE3ICovCi0JCXUzMiB0b3ZyOjE7CS8qIGJpdCAxNiAqLwotCQl1MzIgdHVuZDoxOwkvKiBiaXQgMTUgKi8KLQkJdTMyIHRmcmc6MTsJLyogYml0IDE0ICovCi0JCXUzMiB0Ynl0OjE7CS8qIGJpdCAxMyAqLwotCQl1MzIgdHBrdDoxOwkvKiBiaXQgMTIgKi8KLQkJdTMyIHRtY2E6MTsJLyogYml0IDExICovCi0JCXUzMiB0YmNhOjE7CS8qIGJpdCAxMCAqLwotCQl1MzIgdHhwZjoxOwkvKiBiaXQgOSAqLwotCQl1MzIgdGRmcjoxOwkvKiBiaXQgOCAqLwotCQl1MzIgdGVkZjoxOwkvKiBiaXQgNyAqLwotCQl1MzIgdHNjbDoxOwkvKiBiaXQgNiAqLwotCQl1MzIgdG1jbDoxOwkvKiBiaXQgNSAqLwotCQl1MzIgdGxjbDoxOwkvKiBiaXQgNCAqLwotCQl1MzIgdHhjbDoxOwkvKiBiaXQgMyAqLwotCQl1MzIgdG5jbDoxOwkvKiBiaXQgMiAqLwotCQl1MzIgdHBmaDoxOwkvKiBiaXQgMSAqLwotCQl1MzIgdGRycDoxOwkvKiBiaXQgMCAqLwotI2Vsc2UKLQkJdTMyIHRkcnA6MTsJLyogYml0IDAgKi8KLQkJdTMyIHRwZmg6MTsJLyogYml0IDEgKi8KLQkJdTMyIHRuY2w6MTsJLyogYml0IDIgKi8KLQkJdTMyIHR4Y2w6MTsJLyogYml0IDMgKi8KLQkJdTMyIHRsY2w6MTsJLyogYml0IDQgKi8KLQkJdTMyIHRtY2w6MTsJLyogYml0IDUgKi8KLQkJdTMyIHRzY2w6MTsJLyogYml0IDYgKi8KLQkJdTMyIHRlZGY6MTsJLyogYml0IDcgKi8KLQkJdTMyIHRkZnI6MTsJLyogYml0IDggKi8KLQkJdTMyIHR4cGY6MTsJLyogYml0IDkgKi8KLQkJdTMyIHRiY2E6MTsJLyogYml0IDEwICovCi0JCXUzMiB0bWNhOjE7CS8qIGJpdCAxMSAqLwotCQl1MzIgdHBrdDoxOwkvKiBiaXQgMTIgKi8KLQkJdTMyIHRieXQ6MTsJLyogYml0IDEzICovCi0JCXUzMiB0ZnJnOjE7CS8qIGJpdCAxNCAqLwotCQl1MzIgdHVuZDoxOwkvKiBiaXQgMTUgKi8KLQkJdTMyIHRvdnI6MTsJLyogYml0IDE2ICovCi0JCXUzMiB0eGNmOjE7CS8qIGJpdCAxNyAqLwotCQl1MzIgdGZjczoxOwkvKiBiaXQgMTggKi8KLQkJdTMyIHRqYnI6MTsJLyogYml0IDE5ICovCi0JCXUzMiB1bnVzZWQ6MTI7CS8qIGJpdCAyMC0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBNQUNfU1RBVF9SRUdfMl90LCAqUE1BQ19TVEFUX1JFR18yX3Q7CiAKIC8qCiAgKiBNQUMgU1RBVFMgTW9kdWxlIG9mIEpBR0NvcmUgQWRkcmVzcyBNYXBwaW5nCkBAIC0yMDEwLDE2ICsxNjI2LDE2IEBACiAJdTMyIFRGcmc7CQkJLyogIDB4NjEyQyAqLwogCiAJLyogQ2FycnkgUmVnaXN0ZXIgT25lIFJlZ2lzdGVyICovCi0JTUFDX1NUQVRfUkVHXzFfdCBDYXJyeTE7CS8qICAweDYxMzAgKi8KKwl1MzIgQ2FycnkxOwkJCS8qICAweDYxMzAgKi8KIAogCS8qIENhcnJ5IFJlZ2lzdGVyIFR3byBSZWdpc3RlciAqLwotCU1BQ19TVEFUX1JFR18yX3QgQ2FycnkyOwkvKiAgMHg2MTM0ICovCisJdTMyIENhcnJ5MjsJCQkvKiAgMHg2MTM0ICovCiAKIAkvKiBDYXJyeSBSZWdpc3RlciBPbmUgTWFzayBSZWdpc3RlciAqLwotCU1BQ19TVEFUX1JFR18xX3QgQ2FycnkxTTsJLyogIDB4NjEzOCAqLworCXUzMiBDYXJyeTFNOwkJCS8qICAweDYxMzggKi8KIAogCS8qIENhcnJ5IFJlZ2lzdGVyIFR3byBNYXNrIFJlZ2lzdGVyICovCi0JTUFDX1NUQVRfUkVHXzJfdCBDYXJyeTJNOwkvKiAgMHg2MTNDICovCisJdTMyIENhcnJ5Mk07CQkJLyogIDB4NjEzQyAqLwogfSBNQUNfU1RBVF90LCAqUE1BQ19TVEFUX3Q7CiAKIC8qIEVORCBPRiBNQUMgU1RBVCBSRUdJU1RFUiBBRERSRVNTIE1BUCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfZWVwcm9tLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9lZXByb20uYwppbmRleCBjODUzYTJjLi5iY2NhMWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9lZXByb20uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9lZXByb20uYwpAQCAtOTUsMTk4ICs5NSwxMjAgQEAKICNpbmNsdWRlICJldDEzMTBfdHguaCIKIAogCi0vKgotICogRUVQUk9NIERlZmluZXMKLSAqLwogCi0vKiBMQkNJRiBSZWdpc3RlciBHcm91cHMgKGFkZHJlc3NlZCB2aWEgMzItYml0IG9mZnNldHMpICovCi0jZGVmaW5lIExCQ0lGX0RXT1JEMF9HUk9VUF9PRkZTRVQgICAgICAgMHhBQwotI2RlZmluZSBMQkNJRl9EV09SRDFfR1JPVVBfT0ZGU0VUICAgICAgIDB4QjAKK3N0YXRpYyBpbnQgZWVwcm9tX3dhaXRfcmVhZHkoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiAqc3RhdHVzKQoreworCXUzMiByZWc7CisJaW50IGk7CiAKLS8qIExCQ0lGIFJlZ2lzdGVycyAoYWRkcmVzc2VkIHZpYSA4LWJpdCBvZmZzZXRzKSAqLwotI2RlZmluZSBMQkNJRl9BRERSRVNTX1JFR0lTVEVSX09GRlNFVCAgIDB4QUMKLSNkZWZpbmUgTEJDSUZfREFUQV9SRUdJU1RFUl9PRkZTRVQgICAgICAweEIwCi0jZGVmaW5lIExCQ0lGX0NPTlRST0xfUkVHSVNURVJfT0ZGU0VUICAgMHhCMQotI2RlZmluZSBMQkNJRl9TVEFUVVNfUkVHSVNURVJfT0ZGU0VUICAgIDB4QjIKKwkvKgorCSAqIDEuIENoZWNrIExCQ0lGIFN0YXR1cyBSZWdpc3RlciBmb3IgYml0cyA2ICYgMzoyIGFsbCBlcXVhbCB0byAwIGFuZAorCSAqICAgIGJpdHMgNywxOjAgYm90aCBlcXVhbCB0byAxLCBhdCBsZWFzdCBvbmNlIGFmdGVyIHJlc2V0LgorCSAqICAgIFN1YnNlcXVlbnQgb3BlcmF0aW9ucyBuZWVkIG9ubHkgdG8gY2hlY2sgdGhhdCBiaXRzIDE6MCBhcmUgZXF1YWwKKwkgKiAgICB0byAxIHByaW9yIHRvIHN0YXJ0aW5nIGEgc2luZ2xlIGJ5dGUgcmVhZC93cml0ZQorCSAqLwogCi0vKiBMQkNJRiBDb250cm9sIFJlZ2lzdGVyIEJpdHMgKi8KLSNkZWZpbmUgTEJDSUZfQ09OVFJPTF9TRVFVRU5USUFMX1JFQUQgICAweDAxCi0jZGVmaW5lIExCQ0lGX0NPTlRST0xfUEFHRV9XUklURSAgICAgICAgMHgwMgotI2RlZmluZSBMQkNJRl9DT05UUk9MX1VOVVNFRDEgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgTEJDSUZfQ09OVFJPTF9FRVBST01fUkVMT0FEICAgICAweDA4Ci0jZGVmaW5lIExCQ0lGX0NPTlRST0xfVU5VU0VEMiAgICAgICAgICAgMHgxMAotI2RlZmluZSBMQkNJRl9DT05UUk9MX1RXT19CWVRFX0FERFIgICAgIDB4MjAKLSNkZWZpbmUgTEJDSUZfQ09OVFJPTF9JMkNfV1JJVEUgICAgICAgICAweDQwCi0jZGVmaW5lIExCQ0lGX0NPTlRST0xfTEJDSUZfRU5BQkxFICAgICAgMHg4MAorCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1JFR0lTVEVSX1BPTExTOyBpKyspIHsKKwkJLyogUmVhZCByZWdpc3RlcnMgZ3JvdXBlZCBpbiBEV09SRDEgKi8KKwkJaWYgKHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBMQkNJRl9EV09SRDFfR1JPVVAsICZyZWcpKQorCQkJcmV0dXJuIC1FSU87CiAKLS8qIExCQ0lGIFN0YXR1cyBSZWdpc3RlciBCaXRzICovCi0jZGVmaW5lIExCQ0lGX1NUQVRVU19QSFlfUVVFVUVfQVZBSUwgICAgMHgwMQotI2RlZmluZSBMQkNJRl9TVEFUVVNfSTJDX0lETEUgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgTEJDSUZfU1RBVFVTX0FDS19FUlJPUiAgICAgICAgICAweDA0Ci0jZGVmaW5lIExCQ0lGX1NUQVRVU19HRU5FUkFMX0VSUk9SICAgICAgMHgwOAotI2RlZmluZSBMQkNJRl9TVEFUVVNfVU5VU0VEICAgICAgICAgICAgIDB4MzAKLSNkZWZpbmUgTEJDSUZfU1RBVFVTX0NIRUNLU1VNX0VSUk9SICAgICAweDQwCi0jZGVmaW5lIExCQ0lGX1NUQVRVU19FRVBST01fUFJFU0VOVCAgICAgMHg4MAorCQkvKiBJMkMgaWRsZSBhbmQgUGh5IFF1ZXVlIEF2YWlsIGJvdGggdHJ1ZSAqLworCQlpZiAoKHJlZyAmIDB4MzAwMCkgPT0gMHgzMDAwKSB7CisJCQlpZiAoc3RhdHVzKQorCQkJCSpzdGF0dXMgPSByZWc7CisJCQlyZXR1cm4gcmVnICYgMHhGRjsKKwkJfQorCX0KKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KIAotLyogTWlzY2VsbGFuZW91cyBDb25zdHJhaW50cyAqLwotI2RlZmluZSBNQVhfTlVNX1JFR0lTVEVSX1BPTExTICAgICAgICAgIDEwMDAKLSNkZWZpbmUgTUFYX05VTV9XUklURV9SRVRSSUVTICAgICAgICAgICAyCi0KLS8qCi0gKiBEZWZpbmUgbWFjcm9zIHRoYXQgYWxsb3cgaW5kaXZpZHVhbCByZWdpc3RlciB2YWx1ZXMgdG8gYmUgZXh0cmFjdGVkIGZyb20gYQotICogRFdPUkQxIHJlZ2lzdGVyIGdyb3VwaW5nCi0gKi8KLSNkZWZpbmUgRVhUUkFDVF9EQVRBX1JFR0lTVEVSKHgpICAgICh1OCkoeCAmIDB4RkYpCi0jZGVmaW5lIEVYVFJBQ1RfU1RBVFVTX1JFR0lTVEVSKHgpICAodTgpKCh4ID4+IDE2KSAmIDB4RkYpCi0jZGVmaW5lIEVYVFJBQ1RfQ09OVFJPTF9SRUcoeCkgICAgICAodTgpKCh4ID4+IDgpICYgMHhGRikKIAogLyoqCi0gKiBFZXByb21Xcml0ZUJ5dGUgLSBXcml0ZSBhIGJ5dGUgdG8gdGhlIEVUMTMxMCdzIEVFUFJPTQorICogZWVwcm9tX3dyaXRlIC0gV3JpdGUgYSBieXRlIHRvIHRoZSBFVDEzMTAncyBFRVBST00KICAqIEBldGRldjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogICogQGFkZHI6IHRoZSBhZGRyZXNzIHRvIHdyaXRlCiAgKiBAZGF0YTogdGhlIHZhbHVlIHRvIHdyaXRlCiAgKgotICogUmV0dXJucyBTVUNDRVNTIG9yIEZBSUxVUkUKKyAqIFJldHVybnMgMSBmb3IgYSBzdWNjZXNzZnVsIHdyaXRlLgogICovCi1pbnQgRWVwcm9tV3JpdGVCeXRlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIHUzMiBhZGRyLCB1OCBkYXRhKQorc3RhdGljIGludCBlZXByb21fd3JpdGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgdTMyIGFkZHIsIHU4IGRhdGEpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBldGRldi0+cGRldjsKLQlpbnQgaW5kZXg7CisJaW50IGluZGV4ID0gMDsKIAlpbnQgcmV0cmllczsKIAlpbnQgZXJyID0gMDsKIAlpbnQgaTJjX3dhY2sgPSAwOwogCWludCB3cml0ZW9rID0gMDsKLQl1OCBjb250cm9sOwotCXU4IHN0YXR1cyA9IDA7Ci0JdTMyIGR3b3JkMSA9IDA7CisJdTMyIHN0YXR1czsKIAl1MzIgdmFsID0gMDsKIAogCS8qCi0JICogVGhlIGZvbGxvd2luZyBleGNlcnB0IGlzIGZyb20gIlNlcmlhbCBFRVBST00gSFcgRGVzaWduCi0JICogU3BlY2lmaWNhdGlvbiIgVmVyc2lvbiAwLjkyICg5LzIwLzIwMDQpOgotCSAqCi0JICogU2luZ2xlIEJ5dGUgV3JpdGVzCi0JICoKIAkgKiBGb3IgYW4gRUVQUk9NLCBhbiBJMkMgc2luZ2xlIGJ5dGUgd3JpdGUgaXMgZGVmaW5lZCBhcyBhIFNUQVJUCiAJICogY29uZGl0aW9uIGZvbGxvd2VkIGJ5IHRoZSBkZXZpY2UgYWRkcmVzcywgRUVQUk9NIGFkZHJlc3MsIG9uZSBieXRlCiAJICogb2YgZGF0YSBhbmQgYSBTVE9QIGNvbmRpdGlvbi4gIFRoZSBTVE9QIGNvbmRpdGlvbiB3aWxsIHRyaWdnZXIgdGhlCiAJICogRUVQUk9NJ3MgaW50ZXJuYWxseSB0aW1lZCB3cml0ZSBjeWNsZSB0byB0aGUgbm9udm9sYXRpbGUgbWVtb3J5LgogCSAqIEFsbCBpbnB1dHMgYXJlIGRpc2FibGVkIGR1cmluZyB0aGlzIHdyaXRlIGN5Y2xlIGFuZCB0aGUgRUVQUk9NIHdpbGwKIAkgKiBub3QgcmVzcG9uZCB0byBhbnkgYWNjZXNzIHVudGlsIHRoZSBpbnRlcm5hbCB3cml0ZSBpcyBjb21wbGV0ZS4KLQkgKiBUaGUgc3RlcHMgdG8gZXhlY3V0ZSBhIHNpbmdsZSBieXRlIHdyaXRlIGFyZSBhcyBmb2xsb3dzOgotCSAqCi0JICogMS4gQ2hlY2sgTEJDSUYgU3RhdHVzIFJlZ2lzdGVyIGZvciBiaXRzIDYgJiAzOjIgYWxsIGVxdWFsIHRvIDAgYW5kCi0JICogICAgYml0cyA3LDE6MCBib3RoIGVxdWFsIHRvIDEsIGF0IGxlYXN0IG9uY2UgYWZ0ZXIgcmVzZXQuCi0JICogICAgU3Vic2VxdWVudCBvcGVyYXRpb25zIG5lZWQgb25seSB0byBjaGVjayB0aGF0IGJpdHMgMTowIGFyZQotCSAqICAgIGVxdWFsIHRvIDEgcHJpb3IgdG8gc3RhcnRpbmcgYSBzaW5nbGUgYnl0ZSB3cml0ZS4KLQkgKgorCSAqLworCisJZXJyID0gZWVwcm9tX3dhaXRfcmVhZHkocGRldiwgTlVMTCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCSAvKgogCSAqIDIuIFdyaXRlIHRvIHRoZSBMQkNJRiBDb250cm9sIFJlZ2lzdGVyOiAgYml0IDc9MSwgYml0IDY9MSwgYml0IDM9MCwKIAkgKiAgICBhbmQgYml0cyAxOjAgYm90aCA9MC4gIEJpdCA1IHNob3VsZCBiZSBzZXQgYWNjb3JkaW5nIHRvIHRoZQogCSAqICAgIHR5cGUgb2YgRUVQUk9NIGJlaW5nIGFjY2Vzc2VkICgxPXR3byBieXRlIGFkZHJlc3NpbmcsIDA9b25lCiAJICogICAgYnl0ZSBhZGRyZXNzaW5nKS4KLQkgKgotCSAqIDMuIFdyaXRlIHRoZSBhZGRyZXNzIHRvIHRoZSBMQkNJRiBBZGRyZXNzIFJlZ2lzdGVyLgotCSAqCi0JICogNC4gV3JpdGUgdGhlIGRhdGEgdG8gdGhlIExCQ0lGIERhdGEgUmVnaXN0ZXIgKHRoZSBJMkMgd3JpdGUgd2lsbAotCSAqICAgIGJlZ2luKS4KLQkgKgotCSAqIDUuIE1vbml0b3IgYml0IDE6MCBvZiB0aGUgTEJDSUYgU3RhdHVzIFJlZ2lzdGVyLiAgV2hlbiBiaXRzIDE6MCBhcmUKLQkgKiAgICBib3RoIGVxdWFsIHRvIDEsIHRoZSBJMkMgd3JpdGUgaGFzIGNvbXBsZXRlZCBhbmQgdGhlIGludGVybmFsCi0JICogICAgd3JpdGUgY3ljbGUgb2YgdGhlIEVFUFJPTSBpcyBhYm91dCB0byBzdGFydC4gKGJpdHMgMTowID0gMDEgaXMKLQkgKiAgICBhIGxlZ2FsIHN0YXRlIHdoaWxlIHdhaXRpbmcgZnJvbSBib3RoIGVxdWFsIHRvIDEsIGJ1dCBiaXRzCi0JICogICAgMTowID0gMTAgaXMgaW52YWxpZCBhbmQgaW1wbGllcyB0aGF0IHNvbWV0aGluZyBpcyBicm9rZW4pLgotCSAqCi0JICogNi4gQ2hlY2sgYml0IDMgb2YgdGhlIExCQ0lGIFN0YXR1cyBSZWdpc3Rlci4gIElmICBlcXVhbCB0byAxLCBhbgotCSAqICAgIGVycm9yIGhhcyBvY2N1cnJlZC4KLQkgKgotCSAqIDcuIENoZWNrIGJpdCAyIG9mIHRoZSBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIuICBJZiBlcXVhbCB0byAxIGFuIEFDSwotCSAqICAgIGVycm9yIGhhcyBvY2N1cnJlZCBvbiB0aGUgYWRkcmVzcyBwaGFzZSBvZiB0aGUgd3JpdGUuICBUaGlzCi0JICogICAgY291bGQgYmUgZHVlIHRvIGFuIGFjdHVhbCBoYXJkd2FyZSBmYWlsdXJlIG9yIHRoZSBFRVBST00gbWF5Ci0JICogICAgc3RpbGwgYmUgaW4gaXRzIGludGVybmFsIHdyaXRlIGN5Y2xlIGZyb20gYSBwcmV2aW91cyB3cml0ZS4KLQkgKiAgICBUaGlzIHdyaXRlIG9wZXJhdGlvbiB3YXMgaWdub3JlZCBhbmQgbXVzdCBiZSByZXBlYXRlZCBsYXRlci4KLQkgKgotCSAqIDguIFNldCBiaXQgNiBvZiB0aGUgTEJDSUYgQ29udHJvbCBSZWdpc3RlciA9IDAuIElmIGFub3RoZXIgd3JpdGUgaXMKLQkgKiAgICByZXF1aXJlZCwgZ28gdG8gc3RlcCAxLgogCSAqLwotCi0JLyogU3RlcCAxOiAqLwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9OVU1fUkVHSVNURVJfUE9MTFM7IGluZGV4KyspIHsKLQkJLyogUmVhZCByZWdpc3RlcnMgZ3JvdXBlZCBpbiBEV09SRDEgKi8KLQkJaWYgKHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBMQkNJRl9EV09SRDFfR1JPVVBfT0ZGU0VULAotCQkJCQkgICZkd29yZDEpKSB7Ci0JCQllcnIgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzdGF0dXMgPSBFWFRSQUNUX1NUQVRVU19SRUdJU1RFUihkd29yZDEpOwotCi0JCWlmIChzdGF0dXMgJiBMQkNJRl9TVEFUVVNfUEhZX1FVRVVFX0FWQUlMICYmCi0JCQlzdGF0dXMgJiBMQkNJRl9TVEFUVVNfSTJDX0lETEUpCi0JCQkvKiBiaXRzIDE6MCBhcmUgZXF1YWwgdG8gMSAqLwotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGVyciB8fCAoaW5kZXggPj0gTUFYX05VTV9SRUdJU1RFUl9QT0xMUykpCi0JCXJldHVybiBGQUlMVVJFOwotCi0JLyogU3RlcCAyOiAqLwotCWNvbnRyb2wgPSAwOwotCWNvbnRyb2wgfD0gTEJDSUZfQ09OVFJPTF9MQkNJRl9FTkFCTEUgfCBMQkNJRl9DT05UUk9MX0kyQ19XUklURTsKLQotCWlmIChwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgTEJDSUZfQ09OVFJPTF9SRUdJU1RFUl9PRkZTRVQsCi0JCQkJICBjb250cm9sKSkgewotCQlyZXR1cm4gRkFJTFVSRTsKLQl9CisJaWYgKHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBMQkNJRl9DT05UUk9MX1JFR0lTVEVSLAorCQkJTEJDSUZfQ09OVFJPTF9MQkNJRl9FTkFCTEUgfCBMQkNJRl9DT05UUk9MX0kyQ19XUklURSkpCisJCXJldHVybiAtRUlPOwogCiAJaTJjX3dhY2sgPSAxOwogCiAJLyogUHJlcGFyZSBFRVBST00gYWRkcmVzcyBmb3IgU3RlcCAzICovCiAKIAlmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgTUFYX05VTV9XUklURV9SRVRSSUVTOyByZXRyaWVzKyspIHsKLQkJLyogU3RlcCAzOiovCi0JCWlmIChwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIExCQ0lGX0FERFJFU1NfUkVHSVNURVJfT0ZGU0VULAotCQkJCQkgICBhZGRyKSkgeworCQkvKiBXcml0ZSB0aGUgYWRkcmVzcyB0byB0aGUgTEJDSUYgQWRkcmVzcyBSZWdpc3RlciAqLworCQlpZiAocGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBMQkNJRl9BRERSRVNTX1JFR0lTVEVSLCBhZGRyKSkKIAkJCWJyZWFrOwotCQl9Ci0KLQkJLyogU3RlcCA0OiAqLwotCQlpZiAocGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIExCQ0lGX0RBVEFfUkVHSVNURVJfT0ZGU0VULAotCQkJCQkgIGRhdGEpKSB7CisJCS8qCisJCSAqIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBMQkNJRiBEYXRhIFJlZ2lzdGVyICh0aGUgSTJDIHdyaXRlCisJCSAqIHdpbGwgYmVnaW4pLgorCQkgKi8KKwkJaWYgKHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBMQkNJRl9EQVRBX1JFR0lTVEVSLCBkYXRhKSkKIAkJCWJyZWFrOwotCQl9CisJCS8qCisJCSAqIE1vbml0b3IgYml0IDE6MCBvZiB0aGUgTEJDSUYgU3RhdHVzIFJlZ2lzdGVyLiAgV2hlbiBiaXRzCisJCSAqIDE6MCBhcmUgYm90aCBlcXVhbCB0byAxLCB0aGUgSTJDIHdyaXRlIGhhcyBjb21wbGV0ZWQgYW5kIHRoZQorCQkgKiBpbnRlcm5hbCB3cml0ZSBjeWNsZSBvZiB0aGUgRUVQUk9NIGlzIGFib3V0IHRvIHN0YXJ0LgorCQkgKiAoYml0cyAxOjAgPSAwMSBpcyBhIGxlZ2FsIHN0YXRlIHdoaWxlIHdhaXRpbmcgZnJvbSBib3RoCisJCSAqIGVxdWFsIHRvIDEsIGJ1dCBiaXRzIDE6MCA9IDEwIGlzIGludmFsaWQgYW5kIGltcGxpZXMgdGhhdAorCQkgKiBzb21ldGhpbmcgaXMgYnJva2VuKS4KKwkJICovCisJCWVyciA9IGVlcHJvbV93YWl0X3JlYWR5KHBkZXYsICZzdGF0dXMpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiAwOwogCi0JCS8qIFN0ZXAgNTogKi8KLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX05VTV9SRUdJU1RFUl9QT0xMUzsgaW5kZXgrKykgewotCQkJLyogUmVhZCByZWdpc3RlcnMgZ3JvdXBlZCBpbiBEV09SRDEgKi8KLQkJCWlmIChwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwKLQkJCQkJCSAgTEJDSUZfRFdPUkQxX0dST1VQX09GRlNFVCwKLQkJCQkJCSAgJmR3b3JkMSkpIHsKLQkJCQllcnIgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlzdGF0dXMgPSBFWFRSQUNUX1NUQVRVU19SRUdJU1RFUihkd29yZDEpOwotCi0JCQlpZiAoc3RhdHVzICYgTEJDSUZfU1RBVFVTX1BIWV9RVUVVRV9BVkFJTCAmJgotCQkJCXN0YXR1cyAmIExCQ0lGX1NUQVRVU19JMkNfSURMRSkgewotCQkJCS8qIEkyQyB3cml0ZSBjb21wbGV0ZSAqLwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKGVyciB8fCAoaW5kZXggPj0gTUFYX05VTV9SRUdJU1RFUl9QT0xMUykpCisJCS8qCisJCSAqIENoZWNrIGJpdCAzIG9mIHRoZSBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIuICBJZiAgZXF1YWwgdG8gMSwKKwkJICogYW4gZXJyb3IgaGFzIG9jY3VycmVkLkRvbid0IGJyZWFrIGhlcmUgaWYgd2UgYXJlIHJldmlzaW9uCisJCSAqIDEsIHRoaXMgaXMgc28gd2UgZG8gYSBibGluZCB3cml0ZSBmb3IgbG9hZCBidWcuCisJCSAqLworCQlpZiAoKHN0YXR1cyAmIExCQ0lGX1NUQVRVU19HRU5FUkFMX0VSUk9SKQorCQkJJiYgZXRkZXYtPnBkZXYtPnJldmlzaW9uID09IDApCiAJCQlicmVhazsKIAogCQkvKgotCQkgKiBTdGVwIDY6IERvbid0IGJyZWFrIGhlcmUgaWYgd2UgYXJlIHJldmlzaW9uIDEsIHRoaXMgaXMKLQkJICoJICAgc28gd2UgZG8gYSBibGluZCB3cml0ZSBmb3IgbG9hZCBidWcuCisJCSAqIENoZWNrIGJpdCAyIG9mIHRoZSBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIuICBJZiBlcXVhbCB0byAxIGFuCisJCSAqIEFDSyBlcnJvciBoYXMgb2NjdXJyZWQgb24gdGhlIGFkZHJlc3MgcGhhc2Ugb2YgdGhlIHdyaXRlLgorCQkgKiBUaGlzIGNvdWxkIGJlIGR1ZSB0byBhbiBhY3R1YWwgaGFyZHdhcmUgZmFpbHVyZSBvciB0aGUKKwkJICogRUVQUk9NIG1heSBzdGlsbCBiZSBpbiBpdHMgaW50ZXJuYWwgd3JpdGUgY3ljbGUgZnJvbSBhCisJCSAqIHByZXZpb3VzIHdyaXRlLiBUaGlzIHdyaXRlIG9wZXJhdGlvbiB3YXMgaWdub3JlZCBhbmQgbXVzdCBiZQorCQkgICpyZXBlYXRlZCBsYXRlci4KIAkJICovCi0JCWlmIChzdGF0dXMgJiBMQkNJRl9TVEFUVVNfR0VORVJBTF9FUlJPUgotCQkgICAgJiYgZXRkZXYtPnBkZXYtPnJldmlzaW9uID09IDApIHsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogU3RlcCA3ICovCiAJCWlmIChzdGF0dXMgJiBMQkNJRl9TVEFUVVNfQUNLX0VSUk9SKSB7CiAJCQkvKgogCQkJICogVGhpcyBjb3VsZCBiZSBkdWUgdG8gYW4gYWN0dWFsIGhhcmR3YXJlIGZhaWx1cmUKQEAgLTMwMiwxNTQgKzIyNCwxNjAgQEAKIAkJYnJlYWs7CiAJfQogCi0JLyogU3RlcCA4OiAqLworCS8qCisJICogU2V0IGJpdCA2IG9mIHRoZSBMQkNJRiBDb250cm9sIFJlZ2lzdGVyID0gMC4KKwkgKi8KIAl1ZGVsYXkoMTApOwotCWluZGV4ID0gMDsKLQl3aGlsZSAoaTJjX3dhY2spIHsKLQkJY29udHJvbCAmPSB+TEJDSUZfQ09OVFJPTF9JMkNfV1JJVEU7CiAKLQkJaWYgKHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBMQkNJRl9DT05UUk9MX1JFR0lTVEVSX09GRlNFVCwKLQkJCQkJICBjb250cm9sKSkgeworCXdoaWxlIChpMmNfd2FjaykgeworCQlpZiAocGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIExCQ0lGX0NPTlRST0xfUkVHSVNURVIsCisJCQlMQkNJRl9DT05UUk9MX0xCQ0lGX0VOQUJMRSkpCiAJCQl3cml0ZW9rID0gMDsKLQkJfQogCiAJCS8qIERvIHJlYWQgdW50aWwgaW50ZXJuYWwgQUNLX0VSUk9SIGdvZXMgYXdheSBtZWFuaW5nIHdyaXRlCiAJCSAqIGNvbXBsZXRlZAogCQkgKi8KIAkJZG8gewogCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LAotCQkJCQkgICAgICAgTEJDSUZfQUREUkVTU19SRUdJU1RFUl9PRkZTRVQsCisJCQkJCSAgICAgICBMQkNJRl9BRERSRVNTX1JFR0lTVEVSLAogCQkJCQkgICAgICAgYWRkcik7CiAJCQlkbyB7CiAJCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsCi0JCQkJCUxCQ0lGX0RBVEFfUkVHSVNURVJfT0ZGU0VULCAmdmFsKTsKKwkJCQkJTEJDSUZfREFUQV9SRUdJU1RFUiwgJnZhbCk7CiAJCQl9IHdoaWxlICgodmFsICYgMHgwMDAxMDAwMCkgPT0gMCk7CiAJCX0gd2hpbGUgKHZhbCAmIDB4MDAwNDAwMDApOwogCi0JCWNvbnRyb2wgPSBFWFRSQUNUX0NPTlRST0xfUkVHKHZhbCk7Ci0KLQkJaWYgKGNvbnRyb2wgIT0gMHhDMCB8fCBpbmRleCA9PSAxMDAwMCkKKwkJaWYgKCh2YWwgJiAweEZGMDApICE9IDB4QzAwMCB8fCBpbmRleCA9PSAxMDAwMCkKIAkJCWJyZWFrOwotCiAJCWluZGV4Kys7CiAJfQotCi0JcmV0dXJuIHdyaXRlb2sgPyBTVUNDRVNTIDogRkFJTFVSRTsKKwlyZXR1cm4gd3JpdGVvayA/IDAgOiAtRUlPOwogfQogCiAvKioKLSAqIEVlcHJvbVJlYWRCeXRlIC0gUmVhZCBhIGJ5dGUgZnJvbSB0aGUgRVQxMzEwJ3MgRUVQUk9NCisgKiBlZXByb21fcmVhZCAtIFJlYWQgYSBieXRlIGZyb20gdGhlIEVUMTMxMCdzIEVFUFJPTQogICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAgKiBAYWRkcjogdGhlIGFkZHJlc3MgZnJvbSB3aGljaCB0byByZWFkCiAgKiBAcGRhdGE6IGEgcG9pbnRlciB0byBhIGJ5dGUgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSByZWFkCiAgKiBAZWVwcm9tX2lkOiB0aGUgSUQgb2YgdGhlIEVFUFJPTQogICogQGFkZHJtb2RlOiBob3cgdGhlIEVFUFJPTSBpcyB0byBiZSBhY2Nlc3NlZAogICoKLSAqIFJldHVybnMgU1VDQ0VTUyBvciBGQUlMVVJFCisgKiBSZXR1cm5zIDEgZm9yIGEgc3VjY2Vzc2Z1bCByZWFkCiAgKi8KLWludCBFZXByb21SZWFkQnl0ZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCB1MzIgYWRkciwgdTggKnBkYXRhKQorc3RhdGljIGludCBlZXByb21fcmVhZChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCB1MzIgYWRkciwgdTggKnBkYXRhKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZXRkZXYtPnBkZXY7Ci0JaW50IGluZGV4OwotCWludCBlcnIgPSAwOwotCXU4IGNvbnRyb2w7Ci0JdTggc3RhdHVzID0gMDsKLQl1MzIgZHdvcmQxID0gMDsKKwlpbnQgZXJyOworCXUzMiBzdGF0dXM7CiAKIAkvKgotCSAqIFRoZSBmb2xsb3dpbmcgZXhjZXJwdCBpcyBmcm9tICJTZXJpYWwgRUVQUk9NIEhXIERlc2lnbgotCSAqIFNwZWNpZmljYXRpb24iIFZlcnNpb24gMC45MiAoOS8yMC8yMDA0KToKLQkgKgotCSAqIFNpbmdsZSBCeXRlIFJlYWRzCi0JICoKIAkgKiBBIHNpbmdsZSBieXRlIHJlYWQgaXMgc2ltaWxhciB0byB0aGUgc2luZ2xlIGJ5dGUgd3JpdGUsIHdpdGggdGhlCiAJICogZXhjZXB0aW9uIG9mIHRoZSBkYXRhIGZsb3c6Ci0JICoKLQkgKiAxLiBDaGVjayBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIgZm9yIGJpdHMgNiAmIDM6MiBhbGwgZXF1YWwgdG8gMCBhbmQKLQkgKiAgICBiaXRzIDcsMTowIGJvdGggZXF1YWwgdG8gMSwgYXQgbGVhc3Qgb25jZSBhZnRlciByZXNldC4KLQkgKiAgICBTdWJzZXF1ZW50IG9wZXJhdGlvbnMgbmVlZCBvbmx5IHRvIGNoZWNrIHRoYXQgYml0cyAxOjAgYXJlIGVxdWFsCi0JICogICAgdG8gMSBwcmlvciB0byBzdGFydGluZyBhIHNpbmdsZSBieXRlIHJlYWQuCi0JICoKLQkgKiAyLiBXcml0ZSB0byB0aGUgTEJDSUYgQ29udHJvbCBSZWdpc3RlcjogIGJpdCA3PTEsIGJpdCA2PTAsIGJpdCAzPTAsCi0JICogICAgYW5kIGJpdHMgMTowIGJvdGggPTAuICBCaXQgNSBzaG91bGQgYmUgc2V0IGFjY29yZGluZyB0byB0aGUgdHlwZQotCSAqICAgIG9mIEVFUFJPTSBiZWluZyBhY2Nlc3NlZCAoMT10d28gYnl0ZSBhZGRyZXNzaW5nLCAwPW9uZSBieXRlCi0JICogICAgYWRkcmVzc2luZykuCi0JICoKLQkgKiAzLiBXcml0ZSB0aGUgYWRkcmVzcyB0byB0aGUgTEJDSUYgQWRkcmVzcyBSZWdpc3RlciAoSTJDIHJlYWQgd2lsbAotCSAqICAgIGJlZ2luKS4KLQkgKgotCSAqIDQuIE1vbml0b3IgYml0IDAgb2YgdGhlIExCQ0lGIFN0YXR1cyBSZWdpc3Rlci4gIFdoZW4gPTEsIEkyQyByZWFkCi0JICogICAgaXMgY29tcGxldGUuIChpZiBiaXQgMSA9MSBhbmQgYml0IDAgc3RheXMgPTAsIGEgaGFyZHdhcmUgZmFpbHVyZQotCSAqICAgIGhhcyBvY2N1cnJlZCkuCi0JICoKLQkgKiA1LiBDaGVjayBiaXQgMiBvZiB0aGUgTEJDSUYgU3RhdHVzIFJlZ2lzdGVyLiAgSWYgPTEsIHRoZW4gYW4gZXJyb3IKLQkgKiAgICBoYXMgb2NjdXJyZWQuICBUaGUgZGF0YSB0aGF0IGhhcyBiZWVuIHJldHVybmVkIGZyb20gdGhlIFBIWSBtYXkKLQkgKiAgICBiZSBpbnZhbGlkLgotCSAqCi0JICogNi4gUmVnYXJkbGVzcyBvZiBlcnJvciBzdGF0dXMsIHJlYWQgZGF0YSBieXRlIGZyb20gTEJDSUYgRGF0YQotCSAqICAgIFJlZ2lzdGVyLiAgSWYgYW5vdGhlciBieXRlIGlzIHJlcXVpcmVkLCBnbyB0byBzdGVwIDEuCiAJICovCiAKLQkvKiBTdGVwIDE6ICovCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX05VTV9SRUdJU1RFUl9QT0xMUzsgaW5kZXgrKykgewotCQkvKiBSZWFkIHJlZ2lzdGVycyBncm91cGVkIGluIERXT1JEMSAqLwotCQlpZiAocGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIExCQ0lGX0RXT1JEMV9HUk9VUF9PRkZTRVQsCi0JCQkJCSAgJmR3b3JkMSkpIHsKLQkJCWVyciA9IDE7Ci0JCQlicmVhazsKLQkJfQorCWVyciA9IGVlcHJvbV93YWl0X3JlYWR5KHBkZXYsIE5VTEwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisgCS8qCisJICogV3JpdGUgdG8gdGhlIExCQ0lGIENvbnRyb2wgUmVnaXN0ZXI6ICBiaXQgNz0xLCBiaXQgNj0wLCBiaXQgMz0wLAorCSAqIGFuZCBiaXRzIDE6MCBib3RoID0wLiAgQml0IDUgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUKKwkgKiBvZiBFRVBST00gYmVpbmcgYWNjZXNzZWQgKDE9dHdvIGJ5dGUgYWRkcmVzc2luZywgMD1vbmUgYnl0ZQorCSAqIGFkZHJlc3NpbmcpLgorCSAqLworCWlmIChwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgTEJDSUZfQ09OVFJPTF9SRUdJU1RFUiwKKwkJCQkgIExCQ0lGX0NPTlRST0xfTEJDSUZfRU5BQkxFKSkKKwkJcmV0dXJuIC1FSU87CisJLyoKKwkgKiBXcml0ZSB0aGUgYWRkcmVzcyB0byB0aGUgTEJDSUYgQWRkcmVzcyBSZWdpc3RlciAoSTJDIHJlYWQgd2lsbAorCSAqIGJlZ2luKS4KKwkgKi8KKwlpZiAocGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBMQkNJRl9BRERSRVNTX1JFR0lTVEVSLCBhZGRyKSkKKwkJcmV0dXJuIC1FSU87CisJLyoKKwkgKiBNb25pdG9yIGJpdCAwIG9mIHRoZSBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIuICBXaGVuID0gMSwgSTJDIHJlYWQKKwkgKiBpcyBjb21wbGV0ZS4gKGlmIGJpdCAxID0xIGFuZCBiaXQgMCBzdGF5cyA9IDAsIGEgaGFyZHdhcmUgZmFpbHVyZQorCSAqIGhhcyBvY2N1cnJlZCkuCisJICovCisJZXJyID0gZWVwcm9tX3dhaXRfcmVhZHkocGRldiwgJnN0YXR1cyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJLyoKKwkgKiBSZWdhcmRsZXNzIG9mIGVycm9yIHN0YXR1cywgcmVhZCBkYXRhIGJ5dGUgZnJvbSBMQkNJRiBEYXRhCisJICogUmVnaXN0ZXIuCisJICovCisJKnBkYXRhID0gZXJyOworCS8qCisJICogQ2hlY2sgYml0IDIgb2YgdGhlIExCQ0lGIFN0YXR1cyBSZWdpc3Rlci4gIElmID0gMSwKKwkgKiB0aGVuIGFuIGVycm9yIGhhcyBvY2N1cnJlZC4KKwkgKi8KKwlyZXR1cm4gKHN0YXR1cyAmIExCQ0lGX1NUQVRVU19BQ0tfRVJST1IpID8gLUVJTyA6IDA7Cit9CiAKLQkJc3RhdHVzID0gRVhUUkFDVF9TVEFUVVNfUkVHSVNURVIoZHdvcmQxKTsKK2ludCBldDEzMXhfaW5pdF9lZXByb20oc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGV0ZGV2LT5wZGV2OworCXU4IGVlc3RhdHVzOwogCi0JCWlmIChzdGF0dXMgJiBMQkNJRl9TVEFUVVNfUEhZX1FVRVVFX0FWQUlMICYmCi0JCSAgICBzdGF0dXMgJiBMQkNJRl9TVEFUVVNfSTJDX0lETEUpIHsKLQkJCS8qIGJpdHMgMTowIGFyZSBlcXVhbCB0byAxICovCi0JCQlicmVhazsKLQkJfQorCS8qIFdlIGZpcnN0IG5lZWQgdG8gY2hlY2sgdGhlIEVFUFJPTSBTdGF0dXMgY29kZSBsb2NhdGVkIGF0IG9mZnNldAorCSAqIDB4QjIgb2YgY29uZmlnIHNwYWNlCisJICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgRVQxMzEwX1BDSV9FRVBST01fU1RBVFVTLAorCQkJCSAgICAgICZlZXN0YXR1cyk7CisKKwkvKiBUSElTIElTIEEgV09SS0FST1VORDoKKwkgKiBJIG5lZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHR3aWNlIHRvIGdldCBteSBjYXJkIGluIGEKKwkgKiBMRyBNMSBFeHByZXNzIER1YWwgcnVubmluZy4gSSB0cmllZCBhbHNvIGEgbXNsZWVwIGJlZm9yZSB0aGlzCisJICogZnVuY3Rpb24sIGJlY2F1c2UgSSB0aG91Z3RoIHRoZXJlIGNvdWxkIGJlIHNvbWUgdGltZSBjb25kaWRpb25zCisJICogYnV0IGl0IGRpZG4ndCB3b3JrLiBDYWxsIHRoZSB3aG9sZSBmdW5jdGlvbiB0d2ljZSBhbHNvIHdvcmsuCisJICovCisJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIEVUMTMxMF9QQ0lfRUVQUk9NX1NUQVRVUywgJmVlc3RhdHVzKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCSAgICAgICAiQ291bGQgbm90IHJlYWQgUENJIGNvbmZpZyBzcGFjZSBmb3IgRUVQUk9NIFN0YXR1c1xuIik7CisJCXJldHVybiAtRUlPOwogCX0KIAotCWlmIChlcnIgfHwgKGluZGV4ID49IE1BWF9OVU1fUkVHSVNURVJfUE9MTFMpKQotCQlyZXR1cm4gRkFJTFVSRTsKKwkvKiBEZXRlcm1pbmUgaWYgdGhlIGVycm9yKHMpIHdlIGNhcmUgYWJvdXQgYXJlIHByZXNlbnQuIElmIHRoZXkgYXJlCisJICogcHJlc2VudCB3ZSBuZWVkIHRvIGZhaWwuCisJICovCisJaWYgKGVlc3RhdHVzICYgMHg0QykgeworCQlpbnQgd3JpdGVfZmFpbGVkID0gMDsKKwkJaWYgKHBkZXYtPnJldmlzaW9uID09IDB4MDEpIHsKKwkJCWludAlpOworCQkJc3RhdGljIGNvbnN0IHU4IGVlZGF0YVs0XSA9IHsgMHhGRSwgMHgxMywgMHgxMCwgMHhGRiB9OwogCi0JLyogU3RlcCAyOiAqLwotCWNvbnRyb2wgPSAwOwotCWNvbnRyb2wgfD0gTEJDSUZfQ09OVFJPTF9MQkNJRl9FTkFCTEU7Ci0KLQlpZiAocGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIExCQ0lGX0NPTlRST0xfUkVHSVNURVJfT0ZGU0VULAotCQkJCSAgY29udHJvbCkpIHsKLQkJcmV0dXJuIEZBSUxVUkU7Ci0JfQotCi0JLyogU3RlcCAzOiAqLwotCi0JaWYgKHBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgTEJDSUZfQUREUkVTU19SRUdJU1RFUl9PRkZTRVQsCi0JCQkJICAgYWRkcikpIHsKLQkJcmV0dXJuIEZBSUxVUkU7Ci0JfQotCi0JLyogU3RlcCA0OiAqLwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9OVU1fUkVHSVNURVJfUE9MTFM7IGluZGV4KyspIHsKLQkJLyogUmVhZCByZWdpc3RlcnMgZ3JvdXBlZCBpbiBEV09SRDEgKi8KLQkJaWYgKHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBMQkNJRl9EV09SRDFfR1JPVVBfT0ZGU0VULAotCQkJCQkgICZkd29yZDEpKSB7Ci0JCQllcnIgPSAxOwotCQkJYnJlYWs7CisJCQkvKiBSZS13cml0ZSB0aGUgZmlyc3QgNCBieXRlcyBpZiB3ZSBoYXZlIGFuIGVlcHJvbQorCQkJICogcHJlc2VudCBhbmQgdGhlIHJldmlzaW9uIGlkIGlzIDEsIHRoaXMgZml4ZXMgdGhlCisJCQkgKiBjb3JydXB0aW9uIHNlZW4gd2l0aCAxMzEwIEIgU2lsaWNvbgorCQkJICovCisJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJCWlmIChlZXByb21fd3JpdGUoZXRkZXYsIGksIGVlZGF0YVtpXSkgPCAwKQorCQkJCQl3cml0ZV9mYWlsZWQgPSAxOwogCQl9CisJCWlmIChwZGV2LT5yZXZpc2lvbiAgIT0gMHgwMSB8fCB3cml0ZV9mYWlsZWQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSAgICAiRmF0YWwgRUVQUk9NIFN0YXR1cyBFcnJvciAtIDB4JTA0eFxuIiwgZWVzdGF0dXMpOwogCi0JCXN0YXR1cyA9IEVYVFJBQ1RfU1RBVFVTX1JFR0lTVEVSKGR3b3JkMSk7Ci0KLQkJaWYgKHN0YXR1cyAmIExCQ0lGX1NUQVRVU19QSFlfUVVFVUVfQVZBSUwKLQkJICAgICYmIHN0YXR1cyAmIExCQ0lGX1NUQVRVU19JMkNfSURMRSkgewotCQkJLyogSTJDIHJlYWQgY29tcGxldGUgKi8KLQkJCWJyZWFrOworCQkJLyogVGhpcyBlcnJvciBjb3VsZCBtZWFuIHRoYXQgdGhlcmUgd2FzIGFuIGVycm9yCisJCQkgKiByZWFkaW5nIHRoZSBlZXByb20gb3IgdGhhdCB0aGUgZWVwcm9tIGRvZXNuJ3QgZXhpc3QuCisJCQkgKiBXZSB3aWxsIHRyZWF0IGVhY2ggY2FzZSB0aGUgc2FtZSBhbmQgbm90IHRyeSB0byBnYXRoZXIKKwkJCSAqIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhdCBub3JtYWxseSB3b3VsZCBjb21lIGZyb20gdGhlCisJCQkgKiBlZXByb20sIGxpa2UgTUFDIEFkZHJlc3MKKwkJCSAqLworCQkJZXRkZXYtPmhhc19lZXByb20gPSAwOworCQkJcmV0dXJuIC1FSU87CiAJCX0KIAl9CisJZXRkZXYtPmhhc19lZXByb20gPSAxOwogCi0JaWYgKGVyciB8fCAoaW5kZXggPj0gTUFYX05VTV9SRUdJU1RFUl9QT0xMUykpCi0JCXJldHVybiBGQUlMVVJFOworCS8qIFJlYWQgdGhlIEVFUFJPTSBmb3IgaW5mb3JtYXRpb24gcmVnYXJkaW5nIExFRCBiZWhhdmlvci4gUmVmZXIgdG8KKwkgKiBFVDEzMTBfcGh5LmMsIGV0MTMxeF94Y3ZyX2luaXQoKSwgZm9yIGl0cyB1c2UuCisJICovCisJZWVwcm9tX3JlYWQoZXRkZXYsIDB4NzAsICZldGRldi0+ZWVwcm9tRGF0YVswXSk7CisJZWVwcm9tX3JlYWQoZXRkZXYsIDB4NzEsICZldGRldi0+ZWVwcm9tRGF0YVsxXSk7CiAKLQkvKiBTdGVwIDY6ICovCi0JKnBkYXRhID0gRVhUUkFDVF9EQVRBX1JFR0lTVEVSKGR3b3JkMSk7CisJaWYgKGV0ZGV2LT5lZXByb21EYXRhWzBdICE9IDB4Y2QpCisJCS8qIERpc2FibGUgYWxsIG9wdGlvbmFsIGZlYXR1cmVzICovCisJCWV0ZGV2LT5lZXByb21EYXRhWzFdID0gMHgwMDsKIAotCXJldHVybiAoc3RhdHVzICYgTEJDSUZfU1RBVFVTX0FDS19FUlJPUikgPyBGQUlMVVJFIDogU1VDQ0VTUzsKKwlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX2VlcHJvbS5oIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfZWVwcm9tLmgKaW5kZXggZDhhYzlhMC4uNmE2YzZhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfZWVwcm9tLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfZWVwcm9tLmgKQEAgLTYxLDE3ICs2MSw0MyBAQAogCiAjaW5jbHVkZSAiZXQxMzEwX2FkZHJlc3NfbWFwLmgiCiAKLSNpZm5kZWYgU1VDQ0VTUwotI2RlZmluZSBTVUNDRVNTCQkwCi0jZGVmaW5lIEZBSUxVUkUJCTEKLSNlbmRpZgorLyoKKyAqIEVFUFJPTSBEZWZpbmVzCisgKi8KKworLyogTEJDSUYgUmVnaXN0ZXIgR3JvdXBzIChhZGRyZXNzZWQgdmlhIDMyLWJpdCBvZmZzZXRzKSAqLworI2RlZmluZSBMQkNJRl9EV09SRDBfR1JPVVAgICAgICAgMHhBQworI2RlZmluZSBMQkNJRl9EV09SRDFfR1JPVVAgICAgICAgMHhCMAorCisvKiBMQkNJRiBSZWdpc3RlcnMgKGFkZHJlc3NlZCB2aWEgOC1iaXQgb2Zmc2V0cykgKi8KKyNkZWZpbmUgTEJDSUZfQUREUkVTU19SRUdJU1RFUiAgIDB4QUMKKyNkZWZpbmUgTEJDSUZfREFUQV9SRUdJU1RFUiAgICAgIDB4QjAKKyNkZWZpbmUgTEJDSUZfQ09OVFJPTF9SRUdJU1RFUiAgIDB4QjEKKyNkZWZpbmUgTEJDSUZfU1RBVFVTX1JFR0lTVEVSICAgIDB4QjIKKworLyogTEJDSUYgQ29udHJvbCBSZWdpc3RlciBCaXRzICovCisjZGVmaW5lIExCQ0lGX0NPTlRST0xfU0VRVUVOVElBTF9SRUFEICAgMHgwMQorI2RlZmluZSBMQkNJRl9DT05UUk9MX1BBR0VfV1JJVEUgICAgICAgIDB4MDIKKyNkZWZpbmUgTEJDSUZfQ09OVFJPTF9FRVBST01fUkVMT0FEICAgICAweDA4CisjZGVmaW5lIExCQ0lGX0NPTlRST0xfVFdPX0JZVEVfQUREUiAgICAgMHgyMAorI2RlZmluZSBMQkNJRl9DT05UUk9MX0kyQ19XUklURSAgICAgICAgIDB4NDAKKyNkZWZpbmUgTEJDSUZfQ09OVFJPTF9MQkNJRl9FTkFCTEUgICAgICAweDgwCisKKy8qIExCQ0lGIFN0YXR1cyBSZWdpc3RlciBCaXRzICovCisjZGVmaW5lIExCQ0lGX1NUQVRVU19QSFlfUVVFVUVfQVZBSUwgICAgMHgwMQorI2RlZmluZSBMQkNJRl9TVEFUVVNfSTJDX0lETEUgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTEJDSUZfU1RBVFVTX0FDS19FUlJPUiAgICAgICAgICAweDA0CisjZGVmaW5lIExCQ0lGX1NUQVRVU19HRU5FUkFMX0VSUk9SICAgICAgMHgwOAorI2RlZmluZSBMQkNJRl9TVEFUVVNfQ0hFQ0tTVU1fRVJST1IgICAgIDB4NDAKKyNkZWZpbmUgTEJDSUZfU1RBVFVTX0VFUFJPTV9QUkVTRU5UICAgICAweDgwCisKKy8qIE1pc2NlbGxhbmVvdXMgQ29uc3RyYWludHMgKi8KKyNkZWZpbmUgTUFYX05VTV9SRUdJU1RFUl9QT0xMUyAgICAgICAgICAxMDAwCisjZGVmaW5lIE1BWF9OVU1fV1JJVEVfUkVUUklFUyAgICAgICAgICAgMgogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlICovCiBzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXI7CiAKLWludDMyX3QgRWVwcm9tV3JpdGVCeXRlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwgdTMyIHVuQWRkcmVzcywKLQkJCXU4IGJEYXRhKTsKLWludDMyX3QgRWVwcm9tUmVhZEJ5dGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLCB1MzIgdW5BZGRyZXNzLAotCQkJdTggKnBiRGF0YSk7CitpbnQgZXQxMzF4X2luaXRfZWVwcm9tKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpOwogCiAjZW5kaWYgLyogX0VUMTMxMF9FRVBST01fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX21hYy5jIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfbWFjLmMKaW5kZXggZjgxZTFjYi4uYjhhMWYyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfbWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfbWFjLmMKQEAgLTEwMSw0MSArMTAxLDI3IEBACiAJc3RydWN0IF9NQUNfdCBfX2lvbWVtICpwTWFjID0gJmV0ZGV2LT5yZWdzLT5tYWM7CiAJTUFDX1NUQVRJT05fQUREUjFfdCBzdGF0aW9uMTsKIAlNQUNfU1RBVElPTl9BRERSMl90IHN0YXRpb24yOwotCU1BQ19JUEdfdCBpcGc7Ci0JTUFDX0hGRFBfdCBoZmRwOwotCU1JSV9NR01UX0NGR190IG1paV9tZ210X2NmZzsKKwl1MzIgaXBnOwogCiAJLyogRmlyc3Qgd2UgbmVlZCB0byByZXNldCBldmVyeXRoaW5nLiAgV3JpdGUgdG8gTUFDIGNvbmZpZ3VyYXRpb24KIAkgKiByZWdpc3RlciAxIHRvIHBlcmZvcm0gcmVzZXQuCiAJICovCi0Jd3JpdGVsKDB4QzAwRjAwMDAsICZwTWFjLT5jZmcxLnZhbHVlKTsKKwl3cml0ZWwoMHhDMDBGMDAwMCwgJnBNYWMtPmNmZzEpOwogCiAJLyogTmV4dCBsZXRzIGNvbmZpZ3VyZSB0aGUgTUFDIEludGVyLXBhY2tldCBnYXAgcmVnaXN0ZXIgKi8KLQlpcGcuYml0cy5ub25fQjJCX2lwZ18xID0gMHgzODsJCS8qIDU4ZCAqLwotCWlwZy5iaXRzLm5vbl9CMkJfaXBnXzIgPSAweDU4OwkJLyogODhkICovCi0JaXBnLmJpdHMubWluX2lmZ19lbmZvcmNlID0gMHg1MDsJLyogODBkICovCi0JaXBnLmJpdHMuQjJCX2lwZyA9IDB4NjA7CQkvKiA5NmQgKi8KLQl3cml0ZWwoaXBnLnZhbHVlLCAmcE1hYy0+aXBnLnZhbHVlKTsKKwlpcGcgPSAweDM4MDA1ODYwOwkJLyogSVBHMSAweDM4IElQRzIgMHg1OCBCMkIgMHg2MCAqLworCWlwZyB8PSAweDUwIDw8IDg7CQkvKiBpZmcgZW5mb3JjZSAweDUwICovCisJd3JpdGVsKGlwZywgJnBNYWMtPmlwZyk7CiAKIAkvKiBOZXh0IGxldHMgY29uZmlndXJlIHRoZSBNQUMgSGFsZiBEdXBsZXggcmVnaXN0ZXIgKi8KLQloZmRwLmJpdHMuYWx0X2JlYl90cnVuYyA9IDB4QTsKLQloZmRwLmJpdHMuYWx0X2JlYl9lbmFibGUgPSAweDA7Ci0JaGZkcC5iaXRzLmJwX25vX2JhY2tvZmYgPSAweDA7Ci0JaGZkcC5iaXRzLm5vX2JhY2tvZmYgPSAweDA7Ci0JaGZkcC5iaXRzLmV4Y2Vzc19kZWZlciA9IDB4MTsKLQloZmRwLmJpdHMucmV4bWl0X21heCA9IDB4RjsKLQloZmRwLmJpdHMuY29sbF93aW5kb3cgPSAweDM3OwkJLyogNTVkICovCi0Jd3JpdGVsKGhmZHAudmFsdWUsICZwTWFjLT5oZmRwLnZhbHVlKTsKKwkvKiBCRUIgdHJ1bmMgMHhBLCBFeCBEZWZlciwgUmV4bWl0IDB4RiBDb2xsIDB4MzcgKi8KKwl3cml0ZWwoMHgwMEExRjAzNywgJnBNYWMtPmhmZHApOwogCiAJLyogTmV4dCBsZXRzIGNvbmZpZ3VyZSB0aGUgTUFDIEludGVyZmFjZSBDb250cm9sIHJlZ2lzdGVyICovCi0Jd3JpdGVsKDAsICZwTWFjLT5pZl9jdHJsLnZhbHVlKTsKKwl3cml0ZWwoMCwgJnBNYWMtPmlmX2N0cmwpOwogCiAJLyogTGV0J3MgbW92ZSBvbiB0byBzZXR0aW5nIHVwIHRoZSBtaWkgbWFuYWdlbWVudCBjb25maWd1cmF0aW9uICovCi0JbWlpX21nbXRfY2ZnLmJpdHMucmVzZXRfbWlpX21nbXQgPSAwOwotCW1paV9tZ210X2NmZy5iaXRzLnNjYW5fYXV0b19pbmNyZW10ID0gMDsKLQltaWlfbWdtdF9jZmcuYml0cy5wcmVhbWJsZV9zdXBwcmVzcyA9IDA7Ci0JbWlpX21nbXRfY2ZnLmJpdHMubWdtdF9jbGtfcmVzZXQgPSAweDc7Ci0Jd3JpdGVsKG1paV9tZ210X2NmZy52YWx1ZSwgJnBNYWMtPm1paV9tZ210X2NmZy52YWx1ZSk7CisJd3JpdGVsKDB4MDcsICZwTWFjLT5taWlfbWdtdF9jZmcpOwkvKiBDbG9jayByZXNldCAweDcgKi8KIAogCS8qIE5leHQgbGV0cyBjb25maWd1cmUgdGhlIE1BQyBTdGF0aW9uIEFkZHJlc3MgcmVnaXN0ZXIuICBUaGVzZQogCSAqIHZhbHVlcyBhcmUgcmVhZCBmcm9tIHRoZSBFRVBST00gZHVyaW5nIGluaXRpYWxpemF0aW9uIGFuZCBzdG9yZWQKQEAgLTE2MCwxMCArMTQ2LDEwIEBACiAJICogUGFja2V0cyBsYXJnZXIgdGhhbiAoUmVnaXN0cnlKdW1ib1BhY2tldCkgdGhhdCBkbyBub3QgY29udGFpbiBhCiAJICogVkxBTiBJRCB3aWxsIGJlIGRyb3BwZWQgYnkgdGhlIFJ4IGZ1bmN0aW9uLgogCSAqLwotCXdyaXRlbChldGRldi0+UmVnaXN0cnlKdW1ib1BhY2tldCArIDQsICZwTWFjLT5tYXhfZm1fbGVuLnZhbHVlKTsKKwl3cml0ZWwoZXRkZXYtPlJlZ2lzdHJ5SnVtYm9QYWNrZXQgKyA0LCAmcE1hYy0+bWF4X2ZtX2xlbik7CiAKIAkvKiBjbGVhciBvdXQgTUFDIGNvbmZpZyByZXNldCAqLwotCXdyaXRlbCgwLCAmcE1hYy0+Y2ZnMS52YWx1ZSk7CisJd3JpdGVsKDAsICZwTWFjLT5jZmcxKTsKIH0KIAogLyoqCkBAIC0xNzQsNzkgKzE2MCw2MiBAQAogewogCWludDMyX3QgZGVsYXkgPSAwOwogCXN0cnVjdCBfTUFDX3QgX19pb21lbSAqcE1hYyA9ICZldGRldi0+cmVncy0+bWFjOwotCU1BQ19DRkcxX3QgY2ZnMTsKLQlNQUNfQ0ZHMl90IGNmZzI7Ci0JTUFDX0lGX0NUUkxfdCBpZmN0cmw7CisJdTMyIGNmZzE7CisJdTMyIGNmZzI7CisJdTMyIGlmY3RybDsKIAlUWE1BQ19DVExfdCBjdGw7CiAKIAljdGwudmFsdWUgPSByZWFkbCgmZXRkZXYtPnJlZ3MtPnR4bWFjLmN0bC52YWx1ZSk7Ci0JY2ZnMS52YWx1ZSA9IHJlYWRsKCZwTWFjLT5jZmcxLnZhbHVlKTsKLQljZmcyLnZhbHVlID0gcmVhZGwoJnBNYWMtPmNmZzIudmFsdWUpOwotCWlmY3RybC52YWx1ZSA9IHJlYWRsKCZwTWFjLT5pZl9jdHJsLnZhbHVlKTsKKwljZmcxID0gcmVhZGwoJnBNYWMtPmNmZzEpOworCWNmZzIgPSByZWFkbCgmcE1hYy0+Y2ZnMik7CisJaWZjdHJsID0gcmVhZGwoJnBNYWMtPmlmX2N0cmwpOwogCisJLyogU2V0IHVwIHRoZSBpZiBtb2RlIGJpdHMgKi8KKwljZmcyICY9IH4weDMwMDsKIAlpZiAoZXRkZXYtPmxpbmtzcGVlZCA9PSBUUlVFUEhZX1NQRUVEXzEwMDBNQlBTKSB7Ci0JCWNmZzIuYml0cy5pZl9tb2RlID0gMHgyOwotCQlpZmN0cmwuYml0cy5waHlfbW9kZSA9IDB4MDsKKwkJY2ZnMiB8PSAweDIwMDsKKwkJLyogUGh5IG1vZGUgYml0ICovCisJCWlmY3RybCAmPSB+KDEgPDwgMjQpOwogCX0gZWxzZSB7Ci0JCWNmZzIuYml0cy5pZl9tb2RlID0gMHgxOwotCQlpZmN0cmwuYml0cy5waHlfbW9kZSA9IDB4MTsKKwkJY2ZnMiB8PSAweDEwMDsKKwkJaWZjdHJsIHw9ICgxIDw8IDI0KTsKIAl9CiAKIAkvKiBXZSBuZWVkIHRvIGVuYWJsZSBSeC9UeCAqLwotCWNmZzEuYml0cy5yeF9lbmFibGUgPSAweDE7Ci0JY2ZnMS5iaXRzLnR4X2VuYWJsZSA9IDB4MTsKLQotCS8qIFNldCB1cCBmbG93IGNvbnRyb2wgKi8KLQljZmcxLmJpdHMudHhfZmxvdyA9IDB4MTsKLQotCWlmICgoZXRkZXYtPkZsb3dDb250cm9sID09IFJ4T25seSkgfHwKLQkgICAgKGV0ZGV2LT5GbG93Q29udHJvbCA9PSBCb3RoKSkgewotCQljZmcxLmJpdHMucnhfZmxvdyA9IDB4MTsKLQl9IGVsc2UgewotCQljZmcxLmJpdHMucnhfZmxvdyA9IDB4MDsKLQl9Ci0KKwljZmcxIHw9IENGRzFfUlhfRU5BQkxFfENGRzFfVFhfRU5BQkxFfENGRzFfVFhfRkxPVzsKIAkvKiBJbml0aWFsaXplIGxvb3AgYmFjayB0byBvZmYgKi8KLQljZmcxLmJpdHMubG9vcF9iYWNrID0gMDsKLQotCXdyaXRlbChjZmcxLnZhbHVlLCAmcE1hYy0+Y2ZnMS52YWx1ZSk7CisJY2ZnMSAmPSB+KENGRzFfTE9PUEJBQ0t8Q0ZHMV9SWF9GTE9XKTsKKwlpZiAoZXRkZXYtPkZsb3dDb250cm9sID09IFJ4T25seSB8fCBldGRldi0+Rmxvd0NvbnRyb2wgPT0gQm90aCkKKwkJY2ZnMSB8PSBDRkcxX1JYX0ZMT1c7CisJd3JpdGVsKGNmZzEsICZwTWFjLT5jZmcxKTsKIAogCS8qIE5vdyB3ZSBuZWVkIHRvIGluaXRpYWxpemUgdGhlIE1BQyBDb25maWd1cmF0aW9uIDIgcmVnaXN0ZXIgKi8KLQljZmcyLmJpdHMucHJlYW1ibGVfbGVuID0gMHg3OwotCWNmZzIuYml0cy5odWdlX2ZyYW1lID0gMHgwOwotCS8qIExFTkdUSCBGSUVMRCBDSEVDS0lORyBiaXQ0OiBTZXQgdGhpcyBiaXQgdG8gY2F1c2UgdGhlIE1BQyB0byBjaGVjawotCSAqIHRoZSBmcmFtZSdzIGxlbmd0aCBmaWVsZCB0byBlbnN1cmUgaXQgbWF0Y2hlcyB0aGUgYWN0dWFsIGRhdGEKLQkgKiBmaWVsZCBsZW5ndGguIENsZWFyIHRoaXMgYml0IGlmIG5vIGxlbmd0aCBmaWVsZCBjaGVja2luZyBpcwotCSAqIGRlc2lyZWQuIEl0cyBkZWZhdWx0IGlzIDAuCi0JICovCi0JY2ZnMi5iaXRzLmxlbl9jaGVjayA9IDB4MTsKKwkvKiBwcmVhbWJsZSA3LCBjaGVjayBsZW5ndGgsIGh1Z2UgZnJhbWUgb2ZmLCBwYWQgY3JjLCBjcmMgZW5hYmxlCisJICAgZnVsbCBkdXBsZXggb2ZmICovCisJY2ZnMiB8PSAweDcwMTY7CisJY2ZnMiAmPSB+MHgwMDIxOwogCi0JaWYgKGV0ZGV2LT5SZWdpc3RyeVBoeUxvb3BiayA9PSBmYWxzZSkgewotCQljZmcyLmJpdHMucGFkX2NyYyA9IDB4MTsKLQkJY2ZnMi5iaXRzLmNyY19lbmFibGUgPSAweDE7Ci0JfSBlbHNlIHsKLQkJY2ZnMi5iaXRzLnBhZF9jcmMgPSAwOwotCQljZmcyLmJpdHMuY3JjX2VuYWJsZSA9IDA7Ci0JfQorCS8qIFR1cm4gb24gZHVwbGV4IGlmIG5lZWRlZCAqLworCWlmIChldGRldi0+ZHVwbGV4X21vZGUpCisJCWNmZzIgfD0gMHgwMTsKIAotCS8qIDEgLSBmdWxsIGR1cGxleCwgMCAtIGhhbGYtZHVwbGV4ICovCi0JY2ZnMi5iaXRzLmZ1bGxfZHVwbGV4ID0gZXRkZXYtPmR1cGxleF9tb2RlOwotCWlmY3RybC5iaXRzLmdoZF9tb2RlID0gIWV0ZGV2LT5kdXBsZXhfbW9kZTsKKwlpZmN0cmwgJj0gfigxIDw8IDI2KTsKKwlpZiAoIWV0ZGV2LT5kdXBsZXhfbW9kZSkKKwkJaWZjdHJsIHw9ICgxPDwyNik7CS8qIEVuYWJsZSBnaGQgKi8KIAotCXdyaXRlbChpZmN0cmwudmFsdWUsICZwTWFjLT5pZl9jdHJsLnZhbHVlKTsKLQl3cml0ZWwoY2ZnMi52YWx1ZSwgJnBNYWMtPmNmZzIudmFsdWUpOworCXdyaXRlbChpZmN0cmwsICZwTWFjLT5pZl9jdHJsKTsKKwl3cml0ZWwoY2ZnMiwgJnBNYWMtPmNmZzIpOwogCiAJZG8gewogCQl1ZGVsYXkoMTApOwogCQlkZWxheSsrOwotCQljZmcxLnZhbHVlID0gcmVhZGwoJnBNYWMtPmNmZzEudmFsdWUpOwotCX0gd2hpbGUgKCghY2ZnMS5iaXRzLnN5bmNkX3J4X2VuIHx8ICFjZmcxLmJpdHMuc3luY2RfdHhfZW4pICYmCi0JCQkJCQkJCSBkZWxheSA8IDEwMCk7CisJCWNmZzEgPSByZWFkbCgmcE1hYy0+Y2ZnMSk7CisJfSB3aGlsZSAoKGNmZzEgJiBDRkcxX1dBSVQpICE9IENGRzFfV0FJVCAmJiBkZWxheSA8IDEwMCk7CiAKIAlpZiAoZGVsYXkgPT0gMTAwKSB7CiAJCWRldl93YXJuKCZldGRldi0+cGRldi0+ZGV2LAogCQkgICAgIlN5bmNkIGJpdHMgZGlkIG5vdCByZXNwb25kIGNvcnJlY3RseSBjZmcxIHdvcmQgMHglMDh4XG4iLAotCQkJY2ZnMS52YWx1ZSk7CisJCQljZmcxKTsKIAl9CiAKIAkvKiBFbmFibGUgVFhNQUMgKi8KQEAgLTQwMiwxMDYgKzM3MSw0NyBAQAogdm9pZCBDb25maWdUeE1hY1JlZ3Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKIAlzdHJ1Y3QgX1RYTUFDX3QgX19pb21lbSAqcFR4TWFjID0gJmV0ZGV2LT5yZWdzLT50eG1hYzsKLQlUWE1BQ19DRl9QQVJBTV90IExvY2FsOwogCiAJLyogV2UgbmVlZCB0byB1cGRhdGUgdGhlIENvbnRyb2wgRnJhbWUgUGFyYW1ldGVycwogCSAqIGNmcHQgLSBjb250cm9sIGZyYW1lIHBhdXNlIHRpbWVyIHNldCB0byA2NCAoMHg0MCkKIAkgKiBjZmVwIC0gY29udHJvbCBmcmFtZSBleHRlbmRlZCBwYXVzZSB0aW1lciBzZXQgdG8gMHgwCiAJICovCi0JaWYgKGV0ZGV2LT5GbG93Q29udHJvbCA9PSBOb25lKSB7Ci0JCXdyaXRlbCgwLCAmcFR4TWFjLT5jZl9wYXJhbS52YWx1ZSk7Ci0JfSBlbHNlIHsKLQkJTG9jYWwuYml0cy5jZnB0ID0gMHg0MDsKLQkJTG9jYWwuYml0cy5jZmVwID0gMHgwOwotCQl3cml0ZWwoTG9jYWwudmFsdWUsICZwVHhNYWMtPmNmX3BhcmFtLnZhbHVlKTsKLQl9CisJaWYgKGV0ZGV2LT5GbG93Q29udHJvbCA9PSBOb25lKQorCQl3cml0ZWwoMCwgJnBUeE1hYy0+Y2ZfcGFyYW0pOworCWVsc2UKKwkJd3JpdGVsKDB4NDAsICZwVHhNYWMtPmNmX3BhcmFtKTsKIH0KIAogdm9pZCBDb25maWdNYWNTdGF0UmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewotCXN0cnVjdCBfTUFDX1NUQVRfdCBfX2lvbWVtICpwRGV2TWFjU3RhdCA9CisJc3RydWN0IF9NQUNfU1RBVF90IF9faW9tZW0gKm1hY3N0YXQgPQogCQkmZXRkZXYtPnJlZ3MtPm1hY1N0YXQ7CiAKIAkvKiBOZXh0IHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSBhbGwgdGhlIE1BQ19TVEFUIHJlZ2lzdGVycyB0byB6ZXJvIG9uCiAJICogdGhlIGRldmljZS4KIAkgKi8KLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5SRmNzKTsKLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5SQWxuKTsKLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5SRmxyKTsKLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5SRHJwKTsKLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5SQ2RlKTsKLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5ST3ZyKTsKLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5SRnJnKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPlJGY3MpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+UkFsbik7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5SRmxyKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPlJEcnApOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+UkNkZSk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5ST3ZyKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPlJGcmcpOwogCi0Jd3JpdGVsKDAsICZwRGV2TWFjU3RhdC0+VFNjbCk7Ci0Jd3JpdGVsKDAsICZwRGV2TWFjU3RhdC0+VERmcik7Ci0Jd3JpdGVsKDAsICZwRGV2TWFjU3RhdC0+VE1jbCk7Ci0Jd3JpdGVsKDAsICZwRGV2TWFjU3RhdC0+VExjbCk7Ci0Jd3JpdGVsKDAsICZwRGV2TWFjU3RhdC0+VE5jbCk7Ci0Jd3JpdGVsKDAsICZwRGV2TWFjU3RhdC0+VE92cik7Ci0Jd3JpdGVsKDAsICZwRGV2TWFjU3RhdC0+VFVuZCk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5UU2NsKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPlREZnIpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+VE1jbCk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5UTGNsKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPlROY2wpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+VE92cik7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5UVW5kKTsKIAogCS8qIFVubWFzayBhbnkgY291bnRlcnMgdGhhdCB3ZSB3YW50IHRvIHRyYWNrIHRoZSBvdmVyZmxvdyBvZi4KIAkgKiBJbml0aWFsbHkgdGhpcyB3aWxsIGJlIGFsbCBjb3VudGVycy4gIEl0IG1heSBiZWNvbWUgY2xlYXIgbGF0ZXIKIAkgKiB0aGF0IHdlIGRvIG5vdCBuZWVkIHRvIHRyYWNrIGFsbCBjb3VudGVycy4KIAkgKi8KLQl7Ci0JCU1BQ19TVEFUX1JFR18xX3QgQ2FycnkxTSA9IHsgMHhmZmZmZmZmZiB9OwotCi0JCUNhcnJ5MU0uYml0cy5yZHJwID0gMDsKLQkJQ2FycnkxTS5iaXRzLnJqYnIgPSAxOwotCQlDYXJyeTFNLmJpdHMucmZyZyA9IDA7Ci0JCUNhcnJ5MU0uYml0cy5yb3ZyID0gMDsKLQkJQ2FycnkxTS5iaXRzLnJ1bmQgPSAxOwotCQlDYXJyeTFNLmJpdHMucmNzZSA9IDE7Ci0JCUNhcnJ5MU0uYml0cy5yY2RlID0gMDsKLQkJQ2FycnkxTS5iaXRzLnJmbHIgPSAwOwotCQlDYXJyeTFNLmJpdHMucmFsbiA9IDA7Ci0JCUNhcnJ5MU0uYml0cy5yeHVvID0gMTsKLQkJQ2FycnkxTS5iaXRzLnJ4cGYgPSAxOwotCQlDYXJyeTFNLmJpdHMucnhjZiA9IDE7Ci0JCUNhcnJ5MU0uYml0cy5yYmNhID0gMTsKLQkJQ2FycnkxTS5iaXRzLnJtY2EgPSAxOwotCQlDYXJyeTFNLmJpdHMucmZjcyA9IDA7Ci0JCUNhcnJ5MU0uYml0cy5ycGt0ID0gMTsKLQkJQ2FycnkxTS5iaXRzLnJieXQgPSAxOwotCQlDYXJyeTFNLmJpdHMudHJtZ3YgPSAxOwotCQlDYXJyeTFNLmJpdHMudHJtYXggPSAxOwotCQlDYXJyeTFNLmJpdHMudHIxayA9IDE7Ci0JCUNhcnJ5MU0uYml0cy50cjUxMSA9IDE7Ci0JCUNhcnJ5MU0uYml0cy50cjI1NSA9IDE7Ci0JCUNhcnJ5MU0uYml0cy50cjEyNyA9IDE7Ci0JCUNhcnJ5MU0uYml0cy50cjY0ID0gMTsKLQotCQl3cml0ZWwoQ2FycnkxTS52YWx1ZSwgJnBEZXZNYWNTdGF0LT5DYXJyeTFNLnZhbHVlKTsKLQl9Ci0KLQl7Ci0JCU1BQ19TVEFUX1JFR18yX3QgQ2FycnkyTSA9IHsgMHhmZmZmZmZmZiB9OwotCi0JCUNhcnJ5Mk0uYml0cy50ZHJwID0gMTsKLQkJQ2FycnkyTS5iaXRzLnRwZmggPSAxOwotCQlDYXJyeTJNLmJpdHMudG5jbCA9IDA7Ci0JCUNhcnJ5Mk0uYml0cy50eGNsID0gMTsKLQkJQ2FycnkyTS5iaXRzLnRsY2wgPSAwOwotCQlDYXJyeTJNLmJpdHMudG1jbCA9IDA7Ci0JCUNhcnJ5Mk0uYml0cy50c2NsID0gMDsKLQkJQ2FycnkyTS5iaXRzLnRlZGYgPSAxOwotCQlDYXJyeTJNLmJpdHMudGRmciA9IDA7Ci0JCUNhcnJ5Mk0uYml0cy50eHBmID0gMTsKLQkJQ2FycnkyTS5iaXRzLnRiY2EgPSAxOwotCQlDYXJyeTJNLmJpdHMudG1jYSA9IDE7Ci0JCUNhcnJ5Mk0uYml0cy50cGt0ID0gMTsKLQkJQ2FycnkyTS5iaXRzLnRieXQgPSAxOwotCQlDYXJyeTJNLmJpdHMudGZyZyA9IDE7Ci0JCUNhcnJ5Mk0uYml0cy50dW5kID0gMDsKLQkJQ2FycnkyTS5iaXRzLnRvdnIgPSAwOwotCQlDYXJyeTJNLmJpdHMudHhjZiA9IDE7Ci0JCUNhcnJ5Mk0uYml0cy50ZmNzID0gMTsKLQkJQ2FycnkyTS5iaXRzLnRqYnIgPSAxOwotCi0JCXdyaXRlbChDYXJyeTJNLnZhbHVlLCAmcERldk1hY1N0YXQtPkNhcnJ5Mk0udmFsdWUpOwotCX0KKwl3cml0ZWwoMHhGRkZGQkUzMiwgJm1hY3N0YXQtPkNhcnJ5MU0pOworCXdyaXRlbCgweEZGRkU3RThCLCAmbWFjc3RhdC0+Q2FycnkyTSk7CiB9CiAKIHZvaWQgQ29uZmlnRmxvd0NvbnRyb2woc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKQEAgLTUwOSwyOCArNDE5LDI4IEBACiAJaWYgKGV0ZGV2LT5kdXBsZXhfbW9kZSA9PSAwKSB7CiAJCWV0ZGV2LT5GbG93Q29udHJvbCA9IE5vbmU7CiAJfSBlbHNlIHsKLQkJY2hhciBSZW1vdGVQYXVzZSwgUmVtb3RlQXN5bmNQYXVzZTsKKwkJY2hhciByZW1vdGVfcGF1c2UsIHJlbW90ZV9hc3luY19wYXVzZTsKIAogCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoZXRkZXYsCi0JCQkJICAgICAgVFJVRVBIWV9CSVRfUkVBRCwgNSwgMTAsICZSZW1vdGVQYXVzZSk7CisJCQkJICAgICAgVFJVRVBIWV9CSVRfUkVBRCwgNSwgMTAsICZyZW1vdGVfcGF1c2UpOwogCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoZXRkZXYsCiAJCQkJICAgICAgVFJVRVBIWV9CSVRfUkVBRCwgNSwgMTEsCi0JCQkJICAgICAgJlJlbW90ZUFzeW5jUGF1c2UpOworCQkJCSAgICAgICZyZW1vdGVfYXN5bmNfcGF1c2UpOwogCi0JCWlmICgoUmVtb3RlUGF1c2UgPT0gVFJVRVBIWV9CSVRfU0VUKSAmJgotCQkgICAgKFJlbW90ZUFzeW5jUGF1c2UgPT0gVFJVRVBIWV9CSVRfU0VUKSkgeworCQlpZiAoKHJlbW90ZV9wYXVzZSA9PSBUUlVFUEhZX0JJVF9TRVQpICYmCisJCSAgICAocmVtb3RlX2FzeW5jX3BhdXNlID09IFRSVUVQSFlfQklUX1NFVCkpIHsKIAkJCWV0ZGV2LT5GbG93Q29udHJvbCA9IGV0ZGV2LT5SZWdpc3RyeUZsb3dDb250cm9sOwotCQl9IGVsc2UgaWYgKChSZW1vdGVQYXVzZSA9PSBUUlVFUEhZX0JJVF9TRVQpICYmCi0JCQkgICAoUmVtb3RlQXN5bmNQYXVzZSA9PSBUUlVFUEhZX0JJVF9DTEVBUikpIHsKKwkJfSBlbHNlIGlmICgocmVtb3RlX3BhdXNlID09IFRSVUVQSFlfQklUX1NFVCkgJiYKKwkJCSAgIChyZW1vdGVfYXN5bmNfcGF1c2UgPT0gVFJVRVBIWV9CSVRfQ0xFQVIpKSB7CiAJCQlpZiAoZXRkZXYtPlJlZ2lzdHJ5Rmxvd0NvbnRyb2wgPT0gQm90aCkKIAkJCQlldGRldi0+Rmxvd0NvbnRyb2wgPSBCb3RoOwogCQkJZWxzZQogCQkJCWV0ZGV2LT5GbG93Q29udHJvbCA9IE5vbmU7Ci0JCX0gZWxzZSBpZiAoKFJlbW90ZVBhdXNlID09IFRSVUVQSFlfQklUX0NMRUFSKSAmJgotCQkJICAgKFJlbW90ZUFzeW5jUGF1c2UgPT0gVFJVRVBIWV9CSVRfQ0xFQVIpKSB7CisJCX0gZWxzZSBpZiAoKHJlbW90ZV9wYXVzZSA9PSBUUlVFUEhZX0JJVF9DTEVBUikgJiYKKwkJCSAgIChyZW1vdGVfYXN5bmNfcGF1c2UgPT0gVFJVRVBIWV9CSVRfQ0xFQVIpKSB7CiAJCQlldGRldi0+Rmxvd0NvbnRyb2wgPSBOb25lOwotCQl9IGVsc2Ugey8qIGlmIChSZW1vdGVQYXVzZSA9PSBUUlVFUEhZX0NMRUFSX0JJVCAmJgotCQkJICAgICAgIFJlbW90ZUFzeW5jUGF1c2UgPT0gVFJVRVBIWV9TRVRfQklUKSAqLworCQl9IGVsc2Ugey8qIGlmIChyZW1vdGVfcGF1c2UgPT0gVFJVRVBIWV9DTEVBUl9CSVQgJiYKKwkJCSAgICAgICByZW1vdGVfYXN5bmNfcGF1c2UgPT0gVFJVRVBIWV9TRVRfQklUKSAqLwogCQkJaWYgKGV0ZGV2LT5SZWdpc3RyeUZsb3dDb250cm9sID09IEJvdGgpCiAJCQkJZXRkZXYtPkZsb3dDb250cm9sID0gUnhPbmx5OwogCQkJZWxzZQpAQCAtNTQ2LDI1ICs0NTYsMjUgQEAKIHZvaWQgVXBkYXRlTWFjU3RhdEhvc3RDb3VudGVycyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewogCXN0cnVjdCBfY2Vfc3RhdHNfdCAqc3RhdHMgPSAmZXRkZXYtPlN0YXRzOwotCXN0cnVjdCBfTUFDX1NUQVRfdCBfX2lvbWVtICpwRGV2TWFjU3RhdCA9CisJc3RydWN0IF9NQUNfU1RBVF90IF9faW9tZW0gKm1hY3N0YXQgPQogCQkmZXRkZXYtPnJlZ3MtPm1hY1N0YXQ7CiAKLQlzdGF0cy0+Y29sbGlzaW9ucyArPSByZWFkbCgmcERldk1hY1N0YXQtPlROY2wpOwotCXN0YXRzLT5maXJzdF9jb2xsaXNpb24gKz0gcmVhZGwoJnBEZXZNYWNTdGF0LT5UU2NsKTsKLQlzdGF0cy0+dHhfZGVmZXJyZWQgKz0gcmVhZGwoJnBEZXZNYWNTdGF0LT5URGZyKTsKLQlzdGF0cy0+ZXhjZXNzaXZlX2NvbGxpc2lvbnMgKz0gcmVhZGwoJnBEZXZNYWNTdGF0LT5UTWNsKTsKLQlzdGF0cy0+bGF0ZV9jb2xsaXNpb25zICs9IHJlYWRsKCZwRGV2TWFjU3RhdC0+VExjbCk7Ci0Jc3RhdHMtPnR4X3VmbG8gKz0gcmVhZGwoJnBEZXZNYWNTdGF0LT5UVW5kKTsKLQlzdGF0cy0+bWF4X3BrdF9lcnJvciArPSByZWFkbCgmcERldk1hY1N0YXQtPlRPdnIpOworCXN0YXRzLT5jb2xsaXNpb25zICs9IHJlYWRsKCZtYWNzdGF0LT5UTmNsKTsKKwlzdGF0cy0+Zmlyc3RfY29sbGlzaW9uICs9IHJlYWRsKCZtYWNzdGF0LT5UU2NsKTsKKwlzdGF0cy0+dHhfZGVmZXJyZWQgKz0gcmVhZGwoJm1hY3N0YXQtPlREZnIpOworCXN0YXRzLT5leGNlc3NpdmVfY29sbGlzaW9ucyArPSByZWFkbCgmbWFjc3RhdC0+VE1jbCk7CisJc3RhdHMtPmxhdGVfY29sbGlzaW9ucyArPSByZWFkbCgmbWFjc3RhdC0+VExjbCk7CisJc3RhdHMtPnR4X3VmbG8gKz0gcmVhZGwoJm1hY3N0YXQtPlRVbmQpOworCXN0YXRzLT5tYXhfcGt0X2Vycm9yICs9IHJlYWRsKCZtYWNzdGF0LT5UT3ZyKTsKIAotCXN0YXRzLT5hbGlnbm1lbnRfZXJyICs9IHJlYWRsKCZwRGV2TWFjU3RhdC0+UkFsbik7Ci0Jc3RhdHMtPmNyY19lcnIgKz0gcmVhZGwoJnBEZXZNYWNTdGF0LT5SQ2RlKTsKLQlzdGF0cy0+bm9yY3ZidWYgKz0gcmVhZGwoJnBEZXZNYWNTdGF0LT5SRHJwKTsKLQlzdGF0cy0+cnhfb3ZfZmxvdyArPSByZWFkbCgmcERldk1hY1N0YXQtPlJPdnIpOwotCXN0YXRzLT5jb2RlX3Zpb2xhdGlvbnMgKz0gcmVhZGwoJnBEZXZNYWNTdGF0LT5SRmNzKTsKLQlzdGF0cy0+bGVuZ3RoX2VyciArPSByZWFkbCgmcERldk1hY1N0YXQtPlJGbHIpOworCXN0YXRzLT5hbGlnbm1lbnRfZXJyICs9IHJlYWRsKCZtYWNzdGF0LT5SQWxuKTsKKwlzdGF0cy0+Y3JjX2VyciArPSByZWFkbCgmbWFjc3RhdC0+UkNkZSk7CisJc3RhdHMtPm5vcmN2YnVmICs9IHJlYWRsKCZtYWNzdGF0LT5SRHJwKTsKKwlzdGF0cy0+cnhfb3ZfZmxvdyArPSByZWFkbCgmbWFjc3RhdC0+Uk92cik7CisJc3RhdHMtPmNvZGVfdmlvbGF0aW9ucyArPSByZWFkbCgmbWFjc3RhdC0+UkZjcyk7CisJc3RhdHMtPmxlbmd0aF9lcnIgKz0gcmVhZGwoJm1hY3N0YXQtPlJGbHIpOwogCi0Jc3RhdHMtPm90aGVyX2Vycm9ycyArPSByZWFkbCgmcERldk1hY1N0YXQtPlJGcmcpOworCXN0YXRzLT5vdGhlcl9lcnJvcnMgKz0gcmVhZGwoJm1hY3N0YXQtPlJGcmcpOwogfQogCiAvKioKQEAgLTU3NywxNyArNDg3LDE3IEBACiAgKi8KIHZvaWQgSGFuZGxlTWFjU3RhdEludGVycnVwdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewotCU1BQ19TVEFUX1JFR18xX3QgQ2FycnkxOwotCU1BQ19TVEFUX1JFR18yX3QgQ2FycnkyOworCXUzMiBDYXJyeTE7CisJdTMyIENhcnJ5MjsKIAogCS8qIFJlYWQgdGhlIGludGVycnVwdCBiaXRzIGZyb20gdGhlIHJlZ2lzdGVyKHMpLiAgVGhlc2UgYXJlIENsZWFyIE9uCiAJICogV3JpdGUuCiAJICovCi0JQ2FycnkxLnZhbHVlID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT5tYWNTdGF0LkNhcnJ5MS52YWx1ZSk7Ci0JQ2FycnkyLnZhbHVlID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT5tYWNTdGF0LkNhcnJ5Mi52YWx1ZSk7CisJQ2FycnkxID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT5tYWNTdGF0LkNhcnJ5MSk7CisJQ2FycnkyID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT5tYWNTdGF0LkNhcnJ5Mik7CiAKLQl3cml0ZWwoQ2FycnkxLnZhbHVlLCAmZXRkZXYtPnJlZ3MtPm1hY1N0YXQuQ2FycnkxLnZhbHVlKTsKLQl3cml0ZWwoQ2FycnkyLnZhbHVlLCAmZXRkZXYtPnJlZ3MtPm1hY1N0YXQuQ2FycnkyLnZhbHVlKTsKKwl3cml0ZWwoQ2FycnkxLCAmZXRkZXYtPnJlZ3MtPm1hY1N0YXQuQ2FycnkxKTsKKwl3cml0ZWwoQ2FycnkyLCAmZXRkZXYtPnJlZ3MtPm1hY1N0YXQuQ2FycnkyKTsKIAogCS8qIFdlIG5lZWQgdG8gZG8gdXBkYXRlIHRoZSBob3N0IGNvcHkgb2YgYWxsIHRoZSBNQUNfU1RBVCBjb3VudGVycy4KIAkgKiBGb3IgZWFjaCBjb3VudGVyLCBjaGVjayBpdCdzIG92ZXJmbG93IGJpdC4gIElmIHRoZSBvdmVyZmxvdyBiaXQgaXMKQEAgLTU5NSwzMyArNTA1LDMzIEBACiAJICogcmV2b2x1dGlvbiBvZiB0aGUgY291bnRlci4gIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiB0aGUgY291bnRlcgogCSAqIGJsb2NrIGluZGljYXRlcyB0aGF0IG9uZSBvZiB0aGUgY291bnRlcnMgaGFzIHdyYXBwZWQuCiAJICovCi0JaWYgKENhcnJ5MS5iaXRzLnJmY3MpCisJaWYgKENhcnJ5MSAmICgxIDw8IDE0KSkKIAkJZXRkZXYtPlN0YXRzLmNvZGVfdmlvbGF0aW9ucyArPSBDT1VOVEVSX1dSQVBfMTZfQklUOwotCWlmIChDYXJyeTEuYml0cy5yYWxuKQorCWlmIChDYXJyeTEgJiAoMSA8PCA4KSkKIAkJZXRkZXYtPlN0YXRzLmFsaWdubWVudF9lcnIgKz0gQ09VTlRFUl9XUkFQXzEyX0JJVDsKLQlpZiAoQ2FycnkxLmJpdHMucmZscikKKwlpZiAoQ2FycnkxICYgKDEgPDwgNykpCiAJCWV0ZGV2LT5TdGF0cy5sZW5ndGhfZXJyICs9IENPVU5URVJfV1JBUF8xNl9CSVQ7Ci0JaWYgKENhcnJ5MS5iaXRzLnJmcmcpCisJaWYgKENhcnJ5MSAmICgxIDw8IDIpKQogCQlldGRldi0+U3RhdHMub3RoZXJfZXJyb3JzICs9IENPVU5URVJfV1JBUF8xNl9CSVQ7Ci0JaWYgKENhcnJ5MS5iaXRzLnJjZGUpCisJaWYgKENhcnJ5MSAmICgxIDw8IDYpKQogCQlldGRldi0+U3RhdHMuY3JjX2VyciArPSBDT1VOVEVSX1dSQVBfMTZfQklUOwotCWlmIChDYXJyeTEuYml0cy5yb3ZyKQorCWlmIChDYXJyeTEgJiAoMSA8PCAzKSkKIAkJZXRkZXYtPlN0YXRzLnJ4X292X2Zsb3cgKz0gQ09VTlRFUl9XUkFQXzE2X0JJVDsKLQlpZiAoQ2FycnkxLmJpdHMucmRycCkKKwlpZiAoQ2FycnkxICYgKDEgPDwgMCkpCiAJCWV0ZGV2LT5TdGF0cy5ub3JjdmJ1ZiArPSBDT1VOVEVSX1dSQVBfMTZfQklUOwotCWlmIChDYXJyeTIuYml0cy50b3ZyKQorCWlmIChDYXJyeTIgJiAoMSA8PCAxNikpCiAJCWV0ZGV2LT5TdGF0cy5tYXhfcGt0X2Vycm9yICs9IENPVU5URVJfV1JBUF8xMl9CSVQ7Ci0JaWYgKENhcnJ5Mi5iaXRzLnR1bmQpCisJaWYgKENhcnJ5MiAmICgxIDw8IDE1KSkKIAkJZXRkZXYtPlN0YXRzLnR4X3VmbG8gKz0gQ09VTlRFUl9XUkFQXzEyX0JJVDsKLQlpZiAoQ2FycnkyLmJpdHMudHNjbCkKKwlpZiAoQ2FycnkyICYgKDEgPDwgNikpCiAJCWV0ZGV2LT5TdGF0cy5maXJzdF9jb2xsaXNpb24gKz0gQ09VTlRFUl9XUkFQXzEyX0JJVDsKLQlpZiAoQ2FycnkyLmJpdHMudGRmcikKKwlpZiAoQ2FycnkyICYgKDEgPDwgOCkpCiAJCWV0ZGV2LT5TdGF0cy50eF9kZWZlcnJlZCArPSBDT1VOVEVSX1dSQVBfMTJfQklUOwotCWlmIChDYXJyeTIuYml0cy50bWNsKQorCWlmIChDYXJyeTIgJiAoMSA8PCA1KSkKIAkJZXRkZXYtPlN0YXRzLmV4Y2Vzc2l2ZV9jb2xsaXNpb25zICs9IENPVU5URVJfV1JBUF8xMl9CSVQ7Ci0JaWYgKENhcnJ5Mi5iaXRzLnRsY2wpCisJaWYgKENhcnJ5MiAmICgxIDw8IDQpKQogCQlldGRldi0+U3RhdHMubGF0ZV9jb2xsaXNpb25zICs9IENPVU5URVJfV1JBUF8xMl9CSVQ7Ci0JaWYgKENhcnJ5Mi5iaXRzLnRuY2wpCisJaWYgKENhcnJ5MiAmICgxIDw8IDIpKQogCQlldGRldi0+U3RhdHMuY29sbGlzaW9ucyArPSBDT1VOVEVSX1dSQVBfMTJfQklUOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9waHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3BoeS5jCmluZGV4IGRkMTk5YmQuLjZlY2FkNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3BoeS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3BoeS5jCkBAIC05OCwyMzggKzk4LDQ5OCBAQAogI2luY2x1ZGUgImV0MTMxMF9tYWMuaCIKIAogLyogUHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIHdpdGggbG9jYWwgc2NvcGUgKi8KLXN0YXRpYyBpbnQgZXQxMzF4X3hjdnJfaW5pdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgZXQxMzF4X3hjdnJfaW5pdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KTsKIAogLyoqCiAgKiBQaHlNaVJlYWQgLSBSZWFkIGZyb20gdGhlIFBIWSB0aHJvdWdoIHRoZSBNSUkgSW50ZXJmYWNlIG9uIHRoZSBNQUMKLSAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICAqIEB4Y3ZyQWRkcjogdGhlIGFkZHJlc3Mgb2YgdGhlIHRyYW5zY2lldmVyCiAgKiBAeGN2clJlZzogdGhlIHJlZ2lzdGVyIHRvIHJlYWQKICAqIEB2YWx1ZTogcG9pbnRlciB0byBhIDE2LWJpdCB2YWx1ZSBpbiB3aGljaCB0aGUgdmFsdWUgd2lsbCBiZSBzdG9yZWQKICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQogICovCi1pbnQgUGh5TWlSZWFkKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwgdWludDhfdCB4Y3ZyQWRkciwKLQkgICAgICB1aW50OF90IHhjdnJSZWcsIHVpbnQxNl90ICp2YWx1ZSkKK2ludCBQaHlNaVJlYWQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgdTggeGN2ckFkZHIsCisJICAgICAgdTggeGN2clJlZywgdTE2ICp2YWx1ZSkKIHsKLQlzdHJ1Y3QgX01BQ190IF9faW9tZW0gKm1hYyA9ICZhZGFwdGVyLT5yZWdzLT5tYWM7CisJc3RydWN0IF9NQUNfdCBfX2lvbWVtICptYWMgPSAmZXRkZXYtPnJlZ3MtPm1hYzsKIAlpbnQgc3RhdHVzID0gMDsKLQl1aW50MzJfdCBkZWxheTsKLQlNSUlfTUdNVF9BRERSX3QgbWlpQWRkcjsKLQlNSUlfTUdNVF9DTURfdCBtaWlDbWQ7Ci0JTUlJX01HTVRfSU5ESUNBVE9SX3QgbWlpSW5kaWNhdG9yOworCXUzMiBkZWxheTsKKwl1MzIgbWlpQWRkcjsKKwl1MzIgbWlpQ21kOworCXUzMiBtaWlJbmRpY2F0b3I7CiAKIAkvKiBTYXZlIGEgbG9jYWwgY29weSBvZiB0aGUgcmVnaXN0ZXJzIHdlIGFyZSBkZWFsaW5nIHdpdGggc28gd2UgY2FuCiAJICogc2V0IHRoZW0gYmFjawogCSAqLwotCW1paUFkZHIudmFsdWUgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9hZGRyLnZhbHVlKTsKLQltaWlDbWQudmFsdWUgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9jbWQudmFsdWUpOworCW1paUFkZHIgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9hZGRyKTsKKwltaWlDbWQgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9jbWQpOwogCiAJLyogU3RvcCB0aGUgY3VycmVudCBvcGVyYXRpb24gKi8KLQl3cml0ZWwoMCwgJm1hYy0+bWlpX21nbXRfY21kLnZhbHVlKTsKKwl3cml0ZWwoMCwgJm1hYy0+bWlpX21nbXRfY21kKTsKIAogCS8qIFNldCB1cCB0aGUgcmVnaXN0ZXIgd2UgbmVlZCB0byByZWFkIGZyb20gb24gdGhlIGNvcnJlY3QgUEhZICovCi0JewotCQlNSUlfTUdNVF9BRERSX3QgbWlpX21nbXRfYWRkciA9IHsgMCB9OwotCi0JCW1paV9tZ210X2FkZHIuYml0cy5waHlfYWRkciA9IHhjdnJBZGRyOwotCQltaWlfbWdtdF9hZGRyLmJpdHMucmVnX2FkZHIgPSB4Y3ZyUmVnOwotCQl3cml0ZWwobWlpX21nbXRfYWRkci52YWx1ZSwgJm1hYy0+bWlpX21nbXRfYWRkci52YWx1ZSk7Ci0JfQorCXdyaXRlbChNSUlfQUREUih4Y3ZyQWRkciwgeGN2clJlZyksICZtYWMtPm1paV9tZ210X2FkZHIpOwogCiAJLyogS2ljayB0aGUgcmVhZCBjeWNsZSBvZmYgKi8KIAlkZWxheSA9IDA7CiAKLQl3cml0ZWwoMHgxLCAmbWFjLT5taWlfbWdtdF9jbWQudmFsdWUpOworCXdyaXRlbCgweDEsICZtYWMtPm1paV9tZ210X2NtZCk7CiAKIAlkbyB7CiAJCXVkZWxheSg1MCk7CiAJCWRlbGF5Kys7Ci0JCW1paUluZGljYXRvci52YWx1ZSA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2luZGljYXRvci52YWx1ZSk7Ci0JfSB3aGlsZSAoKG1paUluZGljYXRvci5iaXRzLm5vdF92YWxpZCB8fCBtaWlJbmRpY2F0b3IuYml0cy5idXN5KSAmJgotCQkgZGVsYXkgPCA1MCk7CisJCW1paUluZGljYXRvciA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2luZGljYXRvcik7CisJfSB3aGlsZSAoKG1paUluZGljYXRvciAmIE1HTVRfV0FJVCkgJiYgZGVsYXkgPCA1MCk7CiAKIAkvKiBJZiB3ZSBoaXQgdGhlIG1heCBkZWxheSwgd2UgY291bGQgbm90IHJlYWQgdGhlIHJlZ2lzdGVyICovCi0JaWYgKGRlbGF5ID49IDUwKSB7Ci0JCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJaWYgKGRlbGF5ID09IDUwKSB7CisJCWRldl93YXJuKCZldGRldi0+cGRldi0+ZGV2LAogCQkJICAgICJ4Y3ZyUmVnIDB4JTA4eCBjb3VsZCBub3QgYmUgcmVhZFxuIiwgeGN2clJlZyk7Ci0JCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJzdGF0dXMgaXMgIDB4JTA4eFxuIiwKLQkJCSAgICBtaWlJbmRpY2F0b3IudmFsdWUpOworCQlkZXZfd2FybigmZXRkZXYtPnBkZXYtPmRldiwgInN0YXR1cyBpcyAgMHglMDh4XG4iLAorCQkJICAgIG1paUluZGljYXRvcik7CiAKIAkJc3RhdHVzID0gLUVJTzsKIAl9CiAKIAkvKiBJZiB3ZSBoaXQgaGVyZSB3ZSB3ZXJlIGFibGUgdG8gcmVhZCB0aGUgcmVnaXN0ZXIgYW5kIHdlIG5lZWQgdG8KLQkgKiByZXR1cm4gdGhlIHZhbHVlIHRvIHRoZSBjYWxsZXIKLQkgKi8KLQkvKiBUT0RPOiBtYWtlIHRoaXMgc3R1ZmYgYSBzaW1wbGUgcmVhZHcoKT8hICovCi0JewotCQlNSUlfTUdNVF9TVEFUX3QgbWlpX21nbXRfc3RhdDsKLQotCQltaWlfbWdtdF9zdGF0LnZhbHVlID0gcmVhZGwoJm1hYy0+bWlpX21nbXRfc3RhdC52YWx1ZSk7Ci0JCSp2YWx1ZSA9ICh1aW50MTZfdCkgbWlpX21nbXRfc3RhdC5iaXRzLnBoeV9zdGF0OwotCX0KKwkgKiByZXR1cm4gdGhlIHZhbHVlIHRvIHRoZSBjYWxsZXIgKi8KKwkqdmFsdWUgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9zdGF0KSAmIDB4RkZGRjsKIAogCS8qIFN0b3AgdGhlIHJlYWQgb3BlcmF0aW9uICovCi0Jd3JpdGVsKDAsICZtYWMtPm1paV9tZ210X2NtZC52YWx1ZSk7CisJd3JpdGVsKDAsICZtYWMtPm1paV9tZ210X2NtZCk7CiAKIAkvKiBzZXQgdGhlIHJlZ2lzdGVycyB3ZSB0b3VjaGVkIGJhY2sgdG8gdGhlIHN0YXRlIGF0IHdoaWNoIHdlIGVudGVyZWQKIAkgKiB0aGlzIGZ1bmN0aW9uCiAJICovCi0Jd3JpdGVsKG1paUFkZHIudmFsdWUsICZtYWMtPm1paV9tZ210X2FkZHIudmFsdWUpOwotCXdyaXRlbChtaWlDbWQudmFsdWUsICZtYWMtPm1paV9tZ210X2NtZC52YWx1ZSk7CisJd3JpdGVsKG1paUFkZHIsICZtYWMtPm1paV9tZ210X2FkZHIpOworCXdyaXRlbChtaWlDbWQsICZtYWMtPm1paV9tZ210X2NtZCk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKioKICAqIE1pV3JpdGUgLSBXcml0ZSB0byBhIFBIWSByZWdpc3RlciB0aHJvdWdoIHRoZSBNSUkgaW50ZXJmYWNlIG9mIHRoZSBNQUMKLSAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICAqIEB4Y3ZyUmVnOiB0aGUgcmVnaXN0ZXIgdG8gcmVhZAogICogQHZhbHVlOiAxNi1iaXQgdmFsdWUgdG8gd3JpdGUKICAqCisgKiBGSVhNRTogb25lIGNhbGxlciBpbiBuZXRkZXYgc3RpbGwKKyAqCiAgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCiAgKi8KLWludCBNaVdyaXRlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwgdWludDhfdCB4Y3ZyUmVnLCB1aW50MTZfdCB2YWx1ZSkKK2ludCBNaVdyaXRlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIHU4IHhjdnJSZWcsIHUxNiB2YWx1ZSkKIHsKLQlzdHJ1Y3QgX01BQ190IF9faW9tZW0gKm1hYyA9ICZhZGFwdGVyLT5yZWdzLT5tYWM7CisJc3RydWN0IF9NQUNfdCBfX2lvbWVtICptYWMgPSAmZXRkZXYtPnJlZ3MtPm1hYzsKIAlpbnQgc3RhdHVzID0gMDsKLQl1aW50OF90IHhjdnJBZGRyID0gYWRhcHRlci0+U3RhdHMueGN2cl9hZGRyOwotCXVpbnQzMl90IGRlbGF5OwotCU1JSV9NR01UX0FERFJfdCBtaWlBZGRyOwotCU1JSV9NR01UX0NNRF90IG1paUNtZDsKLQlNSUlfTUdNVF9JTkRJQ0FUT1JfdCBtaWlJbmRpY2F0b3I7CisJdTggeGN2ckFkZHIgPSBldGRldi0+U3RhdHMueGN2cl9hZGRyOworCXUzMiBkZWxheTsKKwl1MzIgbWlpQWRkcjsKKwl1MzIgbWlpQ21kOworCXUzMiBtaWlJbmRpY2F0b3I7CiAKIAkvKiBTYXZlIGEgbG9jYWwgY29weSBvZiB0aGUgcmVnaXN0ZXJzIHdlIGFyZSBkZWFsaW5nIHdpdGggc28gd2UgY2FuCiAJICogc2V0IHRoZW0gYmFjawogCSAqLwotCW1paUFkZHIudmFsdWUgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9hZGRyLnZhbHVlKTsKLQltaWlDbWQudmFsdWUgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9jbWQudmFsdWUpOworCW1paUFkZHIgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9hZGRyKTsKKwltaWlDbWQgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9jbWQpOwogCiAJLyogU3RvcCB0aGUgY3VycmVudCBvcGVyYXRpb24gKi8KLQl3cml0ZWwoMCwgJm1hYy0+bWlpX21nbXRfY21kLnZhbHVlKTsKKwl3cml0ZWwoMCwgJm1hYy0+bWlpX21nbXRfY21kKTsKIAogCS8qIFNldCB1cCB0aGUgcmVnaXN0ZXIgd2UgbmVlZCB0byB3cml0ZSB0byBvbiB0aGUgY29ycmVjdCBQSFkgKi8KLQl7Ci0JCU1JSV9NR01UX0FERFJfdCBtaWlfbWdtdF9hZGRyOwotCi0JCW1paV9tZ210X2FkZHIuYml0cy5waHlfYWRkciA9IHhjdnJBZGRyOwotCQltaWlfbWdtdF9hZGRyLmJpdHMucmVnX2FkZHIgPSB4Y3ZyUmVnOwotCQl3cml0ZWwobWlpX21nbXRfYWRkci52YWx1ZSwgJm1hYy0+bWlpX21nbXRfYWRkci52YWx1ZSk7Ci0JfQorCXdyaXRlbChNSUlfQUREUih4Y3ZyQWRkciwgeGN2clJlZyksICZtYWMtPm1paV9tZ210X2FkZHIpOwogCiAJLyogQWRkIHRoZSB2YWx1ZSB0byB3cml0ZSB0byB0aGUgcmVnaXN0ZXJzIHRvIHRoZSBtYWMgKi8KLQl3cml0ZWwodmFsdWUsICZtYWMtPm1paV9tZ210X2N0cmwudmFsdWUpOworCXdyaXRlbCh2YWx1ZSwgJm1hYy0+bWlpX21nbXRfY3RybCk7CiAJZGVsYXkgPSAwOwogCiAJZG8gewogCQl1ZGVsYXkoNTApOwogCQlkZWxheSsrOwotCQltaWlJbmRpY2F0b3IudmFsdWUgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9pbmRpY2F0b3IudmFsdWUpOwotCX0gd2hpbGUgKG1paUluZGljYXRvci5iaXRzLmJ1c3kgJiYgZGVsYXkgPCAxMDApOworCQltaWlJbmRpY2F0b3IgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9pbmRpY2F0b3IpOworCX0gd2hpbGUgKChtaWlJbmRpY2F0b3IgJiBNR01UX0JVU1kpICYmIGRlbGF5IDwgMTAwKTsKIAogCS8qIElmIHdlIGhpdCB0aGUgbWF4IGRlbGF5LCB3ZSBjb3VsZCBub3Qgd3JpdGUgdGhlIHJlZ2lzdGVyICovCiAJaWYgKGRlbGF5ID09IDEwMCkgewotCQl1aW50MTZfdCBUZW1wVmFsdWU7CisJCXUxNiBUZW1wVmFsdWU7CiAKLQkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsCiAJCSAgICAieGN2clJlZyAweCUwOHggY291bGQgbm90IGJlIHdyaXR0ZW4iLCB4Y3ZyUmVnKTsKLQkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwgInN0YXR1cyBpcyAgMHglMDh4XG4iLAotCQkJICAgIG1paUluZGljYXRvci52YWx1ZSk7Ci0JCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJjb21tYW5kIGlzICAweCUwOHhcbiIsCi0JCQkgICAgcmVhZGwoJm1hYy0+bWlpX21nbXRfY21kLnZhbHVlKSk7CisJCWRldl93YXJuKCZldGRldi0+cGRldi0+ZGV2LCAic3RhdHVzIGlzICAweCUwOHhcbiIsCisJCQkgICAgbWlpSW5kaWNhdG9yKTsKKwkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsICJjb21tYW5kIGlzICAweCUwOHhcbiIsCisJCQkgICAgcmVhZGwoJm1hYy0+bWlpX21nbXRfY21kKSk7CiAKLQkJTWlSZWFkKGFkYXB0ZXIsIHhjdnJSZWcsICZUZW1wVmFsdWUpOworCQlNaVJlYWQoZXRkZXYsIHhjdnJSZWcsICZUZW1wVmFsdWUpOwogCiAJCXN0YXR1cyA9IC1FSU87CiAJfQotCiAJLyogU3RvcCB0aGUgd3JpdGUgb3BlcmF0aW9uICovCi0Jd3JpdGVsKDAsICZtYWMtPm1paV9tZ210X2NtZC52YWx1ZSk7CisJd3JpdGVsKDAsICZtYWMtPm1paV9tZ210X2NtZCk7CiAKIAkvKiBzZXQgdGhlIHJlZ2lzdGVycyB3ZSB0b3VjaGVkIGJhY2sgdG8gdGhlIHN0YXRlIGF0IHdoaWNoIHdlIGVudGVyZWQKIAkgKiB0aGlzIGZ1bmN0aW9uCiAJICovCi0Jd3JpdGVsKG1paUFkZHIudmFsdWUsICZtYWMtPm1paV9tZ210X2FkZHIudmFsdWUpOwotCXdyaXRlbChtaWlDbWQudmFsdWUsICZtYWMtPm1paV9tZ210X2NtZC52YWx1ZSk7CisJd3JpdGVsKG1paUFkZHIsICZtYWMtPm1paV9tZ210X2FkZHIpOworCXdyaXRlbChtaWlDbWQsICZtYWMtPm1paV9tZ210X2NtZCk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKioKICAqIGV0MTMxeF94Y3ZyX2ZpbmQgLSBGaW5kIHRoZSBQSFkgSUQKLSAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQogICovCi1pbnQgZXQxMzF4X3hjdnJfZmluZChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCitpbnQgZXQxMzF4X3hjdnJfZmluZChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewotCWludCBzdGF0dXMgPSAtRU5PREVWOwotCXVpbnQ4X3QgeGN2cl9hZGRyOworCXU4IHhjdnJfYWRkcjsKIAlNSV9JRFIxX3QgaWRyMTsKIAlNSV9JRFIyX3QgaWRyMjsKLQl1aW50MzJfdCB4Y3ZyX2lkOworCXUzMiB4Y3ZyX2lkOwogCiAJLyogV2UgbmVlZCB0byBnZXQgeGN2ciBpZCBhbmQgYWRkcmVzcyB3ZSBqdXN0IGdldCB0aGUgZmlyc3Qgb25lICovCiAJZm9yICh4Y3ZyX2FkZHIgPSAwOyB4Y3ZyX2FkZHIgPCAzMjsgeGN2cl9hZGRyKyspIHsKIAkJLyogUmVhZCB0aGUgSUQgZnJvbSB0aGUgUEhZICovCi0JCVBoeU1pUmVhZChhZGFwdGVyLCB4Y3ZyX2FkZHIsCi0JCQkgICh1aW50OF90KSBvZmZzZXRvZihNSV9SRUdTX3QsIGlkcjEpLAorCQlQaHlNaVJlYWQoZXRkZXYsIHhjdnJfYWRkciwKKwkJCSAgKHU4KSBvZmZzZXRvZihNSV9SRUdTX3QsIGlkcjEpLAogCQkJICAmaWRyMS52YWx1ZSk7Ci0JCVBoeU1pUmVhZChhZGFwdGVyLCB4Y3ZyX2FkZHIsCi0JCQkgICh1aW50OF90KSBvZmZzZXRvZihNSV9SRUdTX3QsIGlkcjIpLAorCQlQaHlNaVJlYWQoZXRkZXYsIHhjdnJfYWRkciwKKwkJCSAgKHU4KSBvZmZzZXRvZihNSV9SRUdTX3QsIGlkcjIpLAogCQkJICAmaWRyMi52YWx1ZSk7CiAKLQkJeGN2cl9pZCA9ICh1aW50MzJfdCkgKChpZHIxLnZhbHVlIDw8IDE2KSB8IGlkcjIudmFsdWUpOworCQl4Y3ZyX2lkID0gKHUzMikgKChpZHIxLnZhbHVlIDw8IDE2KSB8IGlkcjIudmFsdWUpOwogCi0JCWlmICgoaWRyMS52YWx1ZSAhPSAwKSAmJiAoaWRyMS52YWx1ZSAhPSAweGZmZmYpKSB7Ci0JCQlhZGFwdGVyLT5TdGF0cy54Y3ZyX2lkID0geGN2cl9pZDsKLQkJCWFkYXB0ZXItPlN0YXRzLnhjdnJfYWRkciA9IHhjdnJfYWRkcjsKLQotCQkJc3RhdHVzID0gMDsKLQkJCWJyZWFrOworCQlpZiAoaWRyMS52YWx1ZSAhPSAwICYmIGlkcjEudmFsdWUgIT0gMHhmZmZmKSB7CisJCQlldGRldi0+U3RhdHMueGN2cl9pZCA9IHhjdnJfaWQ7CisJCQlldGRldi0+U3RhdHMueGN2cl9hZGRyID0geGN2cl9hZGRyOworCQkJcmV0dXJuIDA7CiAJCX0KIAl9Ci0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKwordm9pZCBFVDEzMTBfUGh5UmVzZXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKK3sKKwlNaVdyaXRlKGV0ZGV2LCBQSFlfQ09OVFJPTCwgMHg4MDAwKTsKK30KKworLyoqCisgKglFVDEzMTBfUGh5UG93ZXJEb3duCS0JUEhZIHBvd2VyIGNvbnRyb2wKKyAqCUBldGRldjogZGV2aWNlIHRvIGNvbnRyb2wKKyAqCUBkb3duOiB0cnVlIGZvciBvZmYvZmFsc2UgZm9yIGJhY2sgb24KKyAqCisgKglvbmUgaHVuZHJlZCwgdGVuLCBvbmUgdGhvdXNhbmQgbWVncworICoJSG93IHdvdWxkIHlvdSBsaWtlIHRvIGhhdmUgeW91ciBMQU4gYWNjZXNzZWQKKyAqCUNhbid0IHlvdSBzZWUgdGhhdCB0aGlzIGNvZGUgcHJvY2Vzc2VkCisgKglQaHkgcG93ZXIsIHBoeSBwb3dlci4uCisgKi8KKwordm9pZCBFVDEzMTBfUGh5UG93ZXJEb3duKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIGJvb2wgZG93bikKK3sKKwl1MTYgZGF0YTsKKworCU1pUmVhZChldGRldiwgUEhZX0NPTlRST0wsICZkYXRhKTsKKwlkYXRhICY9IH4weDA4MDA7CS8qIFBvd2VyIFVQICovCisJaWYgKGRvd24pIC8qIFBvd2VyIERPV04gKi8KKwkJZGF0YSB8PSAweDA4MDA7CisJTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIGRhdGEpOworfQorCisvKioKKyAqCUVUMTMwX1BoeUF1dG9ORWcJLQlhdXRvbmVnb3RpYXRlIGNvbnRyb2wKKyAqCUBldGRldjogZGV2aWNlIHRvIGNvbnRyb2wKKyAqCUBlbmFiZTogYXV0b25lZyBvbi9vZmYKKyAqCisgKglTZXQgdXAgdGhlIGF1dG9uZWdvdGlhdGlvbiBzdGF0ZSBhY2NvcmRpbmcgdG8gd2hldGhlciB3ZSB3aWxsIGJlCisgKgluZWdvdGlhdGluZyB0aGUgc3RhdGUgb3IgZm9yY2luZyBhIHNwZWVkLgorICovCisKK3N0YXRpYyB2b2lkIEVUMTMxMF9QaHlBdXRvTmVnKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIGJvb2wgZW5hYmxlKQoreworCXUxNiBkYXRhOworCisJTWlSZWFkKGV0ZGV2LCBQSFlfQ09OVFJPTCwgJmRhdGEpOworCWRhdGEgJj0gfjB4MTAwMDsJLyogQXV0b25lZ290aWF0aW9uIE9GRiAqLworCWlmIChlbmFibGUpCisJCWRhdGEgfD0gMHgxMDAwOwkJLyogQXV0b25lZ290aWF0aW9uIE9OICovCisJTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIGRhdGEpOworfQorCisvKioKKyAqCUVUMTMwX1BoeUR1cGxleE1vZGUJLQlkdXBsZXggY29udHJvbAorICoJQGV0ZGV2OiBkZXZpY2UgdG8gY29udHJvbAorICoJQGR1cGxleDogZHVwbGV4IG9uL29mZgorICoKKyAqCVNldCB1cCB0aGUgZHVwbGV4IHN0YXRlIG9uIHRoZSBQSFkKKyAqLworCitzdGF0aWMgdm9pZCBFVDEzMTBfUGh5RHVwbGV4TW9kZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCB1MTYgZHVwbGV4KQoreworCXUxNiBkYXRhOworCisJTWlSZWFkKGV0ZGV2LCBQSFlfQ09OVFJPTCwgJmRhdGEpOworCWRhdGEgJj0gfjB4MTAwOwkJLyogU2V0IEhhbGYgRHVwbGV4ICovCisJaWYgKGR1cGxleCA9PSBUUlVFUEhZX0RVUExFWF9GVUxMKQorCQlkYXRhIHw9IDB4MTAwOwkvKiBTZXQgRnVsbCBEdXBsZXggKi8KKwlNaVdyaXRlKGV0ZGV2LCBQSFlfQ09OVFJPTCwgZGF0YSk7Cit9CisKKy8qKgorICoJRVQxMzBfUGh5U3BlZWRTZWxlY3QJLQlzcGVlZCBjb250cm9sCisgKglAZXRkZXY6IGRldmljZSB0byBjb250cm9sCisgKglAZHVwbGV4OiBkdXBsZXggb24vb2ZmCisgKgorICoJU2V0IHRoZSBzcGVlZCBvZiBvdXIgUEhZLgorICovCisKK3N0YXRpYyB2b2lkIEVUMTMxMF9QaHlTcGVlZFNlbGVjdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCB1MTYgc3BlZWQpCit7CisJdTE2IGRhdGE7CisJc3RhdGljIGNvbnN0IHUxNiBiaXRzWzNdPXsweDAwMDAsIDB4MjAwMCwgMHgwMDQwfTsKKworCS8qIFJlYWQgdGhlIFBIWSBjb250cm9sIHJlZ2lzdGVyICovCisJTWlSZWFkKGV0ZGV2LCBQSFlfQ09OVFJPTCwgJmRhdGEpOworCS8qIENsZWFyIGFsbCBTcGVlZCBzZXR0aW5ncyAoQml0cyA2LCAxMykgKi8KKwlkYXRhICY9IH4weDIwNDA7CisJLyogV3JpdGUgYmFjayB0aGUgbmV3IHNwZWVkICovCisJTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIGRhdGEgfCBiaXRzW3NwZWVkXSk7Cit9CisKKy8qKgorICoJRVQxMzEwX1BoeUxpbmtTdGF0dXMJLQlyZWFkIGxpbmsgc3RhdGUKKyAqCUBldGRldjogZGV2aWNlIHRvIHJlYWQKKyAqCUBsaW5rX3N0YXR1czogcmVwb3J0ZWQgbGluayBzdGF0ZQorICoJQGF1dG9uZWc6IHJlcG9ydGVkIGF1dG9uZWdvdGlhdGlvbiBzdGF0ZSAoY29tcGxldGUvaW5jb21wbGV0ZS9kaXNhYmxlZCkKKyAqCUBsaW5rc3BlZWQ6IHJldHVybmVkbGluayBzcGVlZCBpbiB1c2UKKyAqCUBkdXBsZXhfbW9kZTogcmVwb3J0ZWQgaGFsZi9mdWxsIGR1cGxleCBzdGF0ZQorICoJQG1kaV9tZGl4OiBub3QgeWV0IHdvcmtpbmcKKyAqCUBtYXN0ZXJzbGF2ZTogcmVwb3J0IHdoZXRoZXIgd2UgYXJlIG1hc3RlciBvciBzbGF2ZQorICoJQHBvbGFyaXR5OiBsaW5rIHBvbGFyaXR5CisgKgorICoJSSBjYW4gcmVhZCB5b3VyIGxhbiBsaWtlIGEgbWFnYXppbmUKKyAqCUkgc2VlIGlmIHlvdXIgdXAKKyAqCUkga25vdyB5b3VyIGxpbmsgc3BlZWQKKyAqCUkgc2VlIGFsbCB0aGUgc2V0dGluZyB0aGF0IHlvdSdkIHJhdGhlciBrZWVwCisgKi8KKworc3RhdGljIHZvaWQgRVQxMzEwX1BoeUxpbmtTdGF0dXMoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKKwkJCSAgdTggKmxpbmtfc3RhdHVzLAorCQkJICB1MzIgKmF1dG9uZWcsCisJCQkgIHUzMiAqbGlua3NwZWVkLAorCQkJICB1MzIgKmR1cGxleF9tb2RlLAorCQkJICB1MzIgKm1kaV9tZGl4LAorCQkJICB1MzIgKm1hc3RlcnNsYXZlLCB1MzIgKnBvbGFyaXR5KQoreworCXUxNiBtaXN0YXR1cyA9IDA7CisJdTE2IGlzMTAwMEJhc2VUID0gMDsKKwl1MTYgdm1pX3BoeXN0YXR1cyA9IDA7CisJdTE2IGNvbnRyb2wgPSAwOworCisJTWlSZWFkKGV0ZGV2LCBQSFlfU1RBVFVTLCAmbWlzdGF0dXMpOworCU1pUmVhZChldGRldiwgUEhZXzEwMDBfU1RBVFVTLCAmaXMxMDAwQmFzZVQpOworCU1pUmVhZChldGRldiwgUEhZX1BIWV9TVEFUVVMsICZ2bWlfcGh5c3RhdHVzKTsKKwlNaVJlYWQoZXRkZXYsIFBIWV9DT05UUk9MLCAmY29udHJvbCk7CisKKwkqbGlua19zdGF0dXMgPSAodm1pX3BoeXN0YXR1cyAmIDB4MDA0MCkgPyAxIDogMDsKKwkqYXV0b25lZyA9IChjb250cm9sICYgMHgxMDAwKSA/ICgodm1pX3BoeXN0YXR1cyAmIDB4MDAyMCkgPworCQkJCQkgICAgVFJVRVBIWV9BTkVHX0NPTVBMRVRFIDoKKwkJCQkJICAgIFRSVUVQSFlfQU5FR19OT1RfQ09NUExFVEUpIDoKKwkJICAgIFRSVUVQSFlfQU5FR19ESVNBQkxFRDsKKwkqbGlua3NwZWVkID0gKHZtaV9waHlzdGF0dXMgJiAweDAzMDApID4+IDg7CisJKmR1cGxleF9tb2RlID0gKHZtaV9waHlzdGF0dXMgJiAweDAwODApID4+IDc7CisJLyogTk9URTogTmVlZCB0byBjb21wbGV0ZSB0aGlzICovCisJKm1kaV9tZGl4ID0gMDsKKworCSptYXN0ZXJzbGF2ZSA9IChpczEwMDBCYXNlVCAmIDB4NDAwMCkgPworCQkJVFJVRVBIWV9DRkdfTUFTVEVSIDogVFJVRVBIWV9DRkdfU0xBVkU7CisJKnBvbGFyaXR5ID0gKHZtaV9waHlzdGF0dXMgJiAweDA0MDApID8KKwkJCVRSVUVQSFlfUE9MQVJJVFlfSU5WRVJURUQgOiBUUlVFUEhZX1BPTEFSSVRZX05PUk1BTDsKK30KKworc3RhdGljIHZvaWQgRVQxMzEwX1BoeUFuZE9yUmVnKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsCisJCQl1MTYgcmVnbnVtLCB1MTYgYW5kTWFzaywgdTE2IG9yTWFzaykKK3sKKwl1MTYgcmVnOworCisJTWlSZWFkKGV0ZGV2LCByZWdudW0sICZyZWcpOworCXJlZyAmPSBhbmRNYXNrOworCXJlZyB8PSBvck1hc2s7CisJTWlXcml0ZShldGRldiwgcmVnbnVtLCByZWcpOworfQorCisvKiBTdGlsbCB1c2VkIGZyb20gX21hYyAgZm9yIEJJVF9SRUFEICovCit2b2lkIEVUMTMxMF9QaHlBY2Nlc3NNaUJpdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCB1MTYgYWN0aW9uLAorCQkJICAgdTE2IHJlZ251bSwgdTE2IGJpdG51bSwgdTggKnZhbHVlKQoreworCXUxNiByZWc7CisJdTE2IG1hc2sgPSAweDAwMDEgPDwgYml0bnVtOworCisJLyogUmVhZCB0aGUgcmVxdWVzdGVkIHJlZ2lzdGVyICovCisJTWlSZWFkKGV0ZGV2LCByZWdudW0sICZyZWcpOworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIFRSVUVQSFlfQklUX1JFQUQ6CisJCSp2YWx1ZSA9IChyZWcgJiBtYXNrKSA+PiBiaXRudW07CisJCWJyZWFrOworCisJY2FzZSBUUlVFUEhZX0JJVF9TRVQ6CisJCU1pV3JpdGUoZXRkZXYsIHJlZ251bSwgcmVnIHwgbWFzayk7CisJCWJyZWFrOworCisJY2FzZSBUUlVFUEhZX0JJVF9DTEVBUjoKKwkJTWlXcml0ZShldGRldiwgcmVnbnVtLCByZWcgJiB+bWFzayk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIEVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKKwkJCQkgIHUxNiBkdXBsZXgpCit7CisJdTE2IGRhdGE7CisKKwkvKiBSZWFkIHRoZSBQSFkgMTAwMCBCYXNlLVQgQ29udHJvbCBSZWdpc3RlciAqLworCU1pUmVhZChldGRldiwgUEhZXzEwMDBfQ09OVFJPTCwgJmRhdGEpOworCisJLyogQ2xlYXIgQml0cyA4LDkgKi8KKwlkYXRhICY9IH4weDAzMDA7CisKKwlzd2l0Y2ggKGR1cGxleCkgeworCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkU6CisJCS8qIER1cGxleCBhbHJlYWR5IGNsZWFyZWQsIGRvIG5vdGhpbmcgKi8KKwkJYnJlYWs7CisKKwljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9GVUxMOgorCQkvKiBTZXQgQml0IDkgKi8KKwkJZGF0YSB8PSAweDAyMDA7CisJCWJyZWFrOworCisJY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfSEFMRjoKKwkJLyogU2V0IEJpdCA4ICovCisJCWRhdGEgfD0gMHgwMTAwOworCQlicmVhazsKKworCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0JPVEg6CisJZGVmYXVsdDoKKwkJZGF0YSB8PSAweDAzMDA7CisJCWJyZWFrOworCX0KKworCS8qIFdyaXRlIGJhY2sgYWR2ZXJ0aXNlbWVudCAqLworCU1pV3JpdGUoZXRkZXYsIFBIWV8xMDAwX0NPTlRST0wsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwQmFzZVQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKKwkJCQkgdTE2IGR1cGxleCkKK3sKKwl1MTYgZGF0YTsKKworCS8qIFJlYWQgdGhlIEF1dG9uZWdvdGlhdGlvbiBSZWdpc3RlciAoMTAvMTAwKSAqLworCU1pUmVhZChldGRldiwgUEhZX0FVVE9fQURWRVJUSVNFTUVOVCwgJmRhdGEpOworCisJLyogQ2xlYXIgYml0cyA3LDggKi8KKwlkYXRhICY9IH4weDAxODA7CisKKwlzd2l0Y2ggKGR1cGxleCkgeworCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkU6CisJCS8qIER1cGxleCBhbHJlYWR5IGNsZWFyZWQsIGRvIG5vdGhpbmcgKi8KKwkJYnJlYWs7CisKKwljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9GVUxMOgorCQkvKiBTZXQgQml0IDggKi8KKwkJZGF0YSB8PSAweDAxMDA7CisJCWJyZWFrOworCisJY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfSEFMRjoKKwkJLyogU2V0IEJpdCA3ICovCisJCWRhdGEgfD0gMHgwMDgwOworCQlicmVhazsKKworCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0JPVEg6CisJZGVmYXVsdDoKKwkJLyogU2V0IEJpdHMgNyw4ICovCisJCWRhdGEgfD0gMHgwMTgwOworCQlicmVhazsKKwl9CisKKwkvKiBXcml0ZSBiYWNrIGFkdmVydGlzZW1lbnQgKi8KKwlNaVdyaXRlKGV0ZGV2LCBQSFlfQVVUT19BRFZFUlRJU0VNRU5ULCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQgRVQxMzEwX1BoeUFkdmVydGlzZTEwQmFzZVQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKKwkJCQl1MTYgZHVwbGV4KQoreworCXUxNiBkYXRhOworCisJLyogUmVhZCB0aGUgQXV0b25lZ290aWF0aW9uIFJlZ2lzdGVyICgxMC8xMDApICovCisJTWlSZWFkKGV0ZGV2LCBQSFlfQVVUT19BRFZFUlRJU0VNRU5ULCAmZGF0YSk7CisKKwkvKiBDbGVhciBiaXRzIDUsNiAqLworCWRhdGEgJj0gfjB4MDA2MDsKKworCXN3aXRjaCAoZHVwbGV4KSB7CisJY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORToKKwkJLyogRHVwbGV4IGFscmVhZHkgY2xlYXJlZCwgZG8gbm90aGluZyAqLworCQlicmVhazsKKworCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEw6CisJCS8qIFNldCBCaXQgNiAqLworCQlkYXRhIHw9IDB4MDA0MDsKKwkJYnJlYWs7CisKKwljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9IQUxGOgorCQkvKiBTZXQgQml0IDUgKi8KKwkJZGF0YSB8PSAweDAwMjA7CisJCWJyZWFrOworCisJY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfQk9USDoKKwlkZWZhdWx0OgorCQkvKiBTZXQgQml0cyA1LDYgKi8KKwkJZGF0YSB8PSAweDAwNjA7CisJCWJyZWFrOworCX0KKworCS8qIFdyaXRlIGJhY2sgYWR2ZXJ0aXNlbWVudCAqLworCU1pV3JpdGUoZXRkZXYsIFBIWV9BVVRPX0FEVkVSVElTRU1FTlQsIGRhdGEpOwogfQogCiAvKioKICAqIGV0MTMxeF9zZXRwaHlfbm9ybWFsIC0gU2V0IFBIWSBmb3Igbm9ybWFsIG9wZXJhdGlvbi4KLSAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICAqCiAgKiBVc2VkIGJ5IFBvd2VyIE1hbmFnZW1lbnQgdG8gZm9yY2UgdGhlIFBIWSBpbnRvIDEwIEJhc2UgVCBoYWxmLWR1cGxleCBtb2RlLAogICogd2hlbiBnb2luZyB0byBEMyBpbiBXT0wgbW9kZS4gQWxzbyB1c2VkIGR1cmluZyBpbml0aWFsaXphdGlvbiB0byBzZXQgdGhlCiAgKiBQSFkgZm9yIG5vcm1hbCBvcGVyYXRpb24uCiAgKi8KLWludCBldDEzMXhfc2V0cGh5X25vcm1hbChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCit2b2lkIGV0MTMxeF9zZXRwaHlfbm9ybWFsKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCiB7Ci0JaW50IHN0YXR1czsKLQogCS8qIE1ha2Ugc3VyZSB0aGUgUEhZIGlzIHBvd2VyZWQgdXAgKi8KLQlFVDEzMTBfUGh5UG93ZXJEb3duKGFkYXB0ZXIsIDApOwotCXN0YXR1cyA9IGV0MTMxeF94Y3ZyX2luaXQoYWRhcHRlcik7Ci0JcmV0dXJuIHN0YXR1czsKKwlFVDEzMTBfUGh5UG93ZXJEb3duKGV0ZGV2LCAwKTsKKwlldDEzMXhfeGN2cl9pbml0KGV0ZGV2KTsKIH0KIAorCiAvKioKICAqIGV0MTMxeF94Y3ZyX2luaXQgLSBJbml0IHRoZSBwaHkgaWYgd2UgYXJlIHNldHRpbmcgaXQgaW50byBmb3JjZSBtb2RlCi0gKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAgKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUgKGFzIGRlZmluZWQgaW4gZXJybm8uaCkKICAqLwotc3RhdGljIGludCBldDEzMXhfeGN2cl9pbml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKK3N0YXRpYyB2b2lkIGV0MTMxeF94Y3ZyX2luaXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKLQlpbnQgc3RhdHVzID0gMDsKIAlNSV9JTVJfdCBpbXI7CiAJTUlfSVNSX3QgaXNyOwogCU1JX0xDUjJfdCBsY3IyOwogCiAJLyogWmVybyBvdXQgdGhlIGFkYXB0ZXIgc3RydWN0dXJlIHZhcmlhYmxlIHJlcHJlc2VudGluZyBCTVNSICovCi0JYWRhcHRlci0+Qm1zci52YWx1ZSA9IDA7CisJZXRkZXYtPkJtc3IudmFsdWUgPSAwOwogCi0JTWlSZWFkKGFkYXB0ZXIsICh1aW50OF90KSBvZmZzZXRvZihNSV9SRUdTX3QsIGlzciksICZpc3IudmFsdWUpOwotCi0JTWlSZWFkKGFkYXB0ZXIsICh1aW50OF90KSBvZmZzZXRvZihNSV9SRUdTX3QsIGltciksICZpbXIudmFsdWUpOworCU1pUmVhZChldGRldiwgKHU4KSBvZmZzZXRvZihNSV9SRUdTX3QsIGlzciksICZpc3IudmFsdWUpOworCU1pUmVhZChldGRldiwgKHU4KSBvZmZzZXRvZihNSV9SRUdTX3QsIGltciksICZpbXIudmFsdWUpOwogCiAJLyogU2V0IHRoZSBsaW5rIHN0YXR1cyBpbnRlcnJ1cHQgb25seS4gIEJhZCBiZWhhdmlvciB3aGVuIGxpbmsgc3RhdHVzCiAJICogYW5kIGF1dG8gbmVnIGFyZSBzZXQsIHdlIHJ1biBpbnRvIGEgbmVzdGVkIGludGVycnVwdCBwcm9ibGVtCkBAIC0zMzgsNyArNTk4LDcgQEAKIAlpbXIuYml0cy5saW5rX3N0YXR1cyA9IDB4MTsKIAlpbXIuYml0cy5hdXRvbmVnX3N0YXR1cyA9IDB4MTsKIAotCU1pV3JpdGUoYWRhcHRlciwgKHVpbnQ4X3QpIG9mZnNldG9mKE1JX1JFR1NfdCwgaW1yKSwgaW1yLnZhbHVlKTsKKwlNaVdyaXRlKGV0ZGV2LCAodTgpIG9mZnNldG9mKE1JX1JFR1NfdCwgaW1yKSwgaW1yLnZhbHVlKTsKIAogCS8qIFNldCB0aGUgTEVEIGJlaGF2aW9yIHN1Y2ggdGhhdCBMRUQgMSBpbmRpY2F0ZXMgc3BlZWQgKG9mZiA9CiAJICogMTBNYml0cywgYmxpbmsgPSAxMDBNYml0cywgb24gPSAxMDAwTWJpdHMpIGFuZCBMRUQgMiBpbmRpY2F0ZXMKQEAgLTM0OCwxMTEgKzYwOCwxMzggQEAKIAkgKiB2ZW5kb3JzOyBUaGUgTEVEIGJlaGF2aW9yIGlzIG5vdyBkZXRlcm1pbmVkIGJ5IHZlbmRvciBkYXRhIGluIHRoZQogCSAqIEVFUFJPTS4gSG93ZXZlciwgdGhlIGFib3ZlIGRlc2NyaXB0aW9uIGlzIHRoZSBkZWZhdWx0LgogCSAqLwotCWlmICgoYWRhcHRlci0+ZWVwcm9tRGF0YVsxXSAmIDB4NCkgPT0gMCkgewotCQlNaVJlYWQoYWRhcHRlciwgKHVpbnQ4X3QpIG9mZnNldG9mKE1JX1JFR1NfdCwgbGNyMiksCisJaWYgKChldGRldi0+ZWVwcm9tRGF0YVsxXSAmIDB4NCkgPT0gMCkgeworCQlNaVJlYWQoZXRkZXYsICh1OCkgb2Zmc2V0b2YoTUlfUkVHU190LCBsY3IyKSwKIAkJICAgICAgICZsY3IyLnZhbHVlKTsKLQkJaWYgKChhZGFwdGVyLT5lZXByb21EYXRhWzFdICYgMHg4KSA9PSAwKQorCQlpZiAoKGV0ZGV2LT5lZXByb21EYXRhWzFdICYgMHg4KSA9PSAwKQogCQkJbGNyMi5iaXRzLmxlZF90eF9yeCA9IDB4MzsKIAkJZWxzZQogCQkJbGNyMi5iaXRzLmxlZF90eF9yeCA9IDB4NDsKIAkJbGNyMi5iaXRzLmxlZF9saW5rID0gMHhhOwotCQlNaVdyaXRlKGFkYXB0ZXIsICh1aW50OF90KSBvZmZzZXRvZihNSV9SRUdTX3QsIGxjcjIpLAorCQlNaVdyaXRlKGV0ZGV2LCAodTgpIG9mZnNldG9mKE1JX1JFR1NfdCwgbGNyMiksCiAJCQlsY3IyLnZhbHVlKTsKIAl9CiAKIAkvKiBEZXRlcm1pbmUgaWYgd2UgbmVlZCB0byBnbyBpbnRvIGEgZm9yY2UgbW9kZSBhbmQgc2V0IGl0ICovCi0JaWYgKGFkYXB0ZXItPkFpRm9yY2VTcGVlZCA9PSAwICYmIGFkYXB0ZXItPkFpRm9yY2VEcHggPT0gMCkgewotCQlpZiAoKGFkYXB0ZXItPlJlZ2lzdHJ5Rmxvd0NvbnRyb2wgPT0gVHhPbmx5KSB8fAotCQkgICAgKGFkYXB0ZXItPlJlZ2lzdHJ5Rmxvd0NvbnRyb2wgPT0gQm90aCkpIHsKLQkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChhZGFwdGVyLAorCWlmIChldGRldi0+QWlGb3JjZVNwZWVkID09IDAgJiYgZXRkZXYtPkFpRm9yY2VEcHggPT0gMCkgeworCQlpZiAoZXRkZXYtPlJlZ2lzdHJ5Rmxvd0NvbnRyb2wgPT0gVHhPbmx5IHx8CisJCSAgICBldGRldi0+UmVnaXN0cnlGbG93Q29udHJvbCA9PSBCb3RoKQorCQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGV0ZGV2LAogCQkJCQkgICAgICBUUlVFUEhZX0JJVF9TRVQsIDQsIDExLCBOVUxMKTsKLQkJfSBlbHNlIHsKLQkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChhZGFwdGVyLAorCQllbHNlCisJCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoZXRkZXYsCiAJCQkJCSAgICAgIFRSVUVQSFlfQklUX0NMRUFSLCA0LCAxMSwgTlVMTCk7Ci0JCX0KIAotCQlpZiAoYWRhcHRlci0+UmVnaXN0cnlGbG93Q29udHJvbCA9PSBCb3RoKSB7Ci0JCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoYWRhcHRlciwKKwkJaWYgKGV0ZGV2LT5SZWdpc3RyeUZsb3dDb250cm9sID09IEJvdGgpCisJCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoZXRkZXYsCiAJCQkJCSAgICAgIFRSVUVQSFlfQklUX1NFVCwgNCwgMTAsIE5VTEwpOwotCQl9IGVsc2UgewotCQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGFkYXB0ZXIsCisJCWVsc2UKKwkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwKIAkJCQkJICAgICAgVFJVRVBIWV9CSVRfQ0xFQVIsIDQsIDEwLCBOVUxMKTsKLQkJfQogCiAJCS8qIFNldCB0aGUgcGh5IHRvIGF1dG9uZWdvdGlhdGlvbiAqLwotCQlFVDEzMTBfUGh5QXV0b05lZyhhZGFwdGVyLCB0cnVlKTsKKwkJRVQxMzEwX1BoeUF1dG9OZWcoZXRkZXYsIHRydWUpOwogCiAJCS8qIE5PVEUgLSBEbyB3ZSBuZWVkIHRoaXM/ICovCi0JCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChhZGFwdGVyLCBUUlVFUEhZX0JJVF9TRVQsIDAsIDksIE5VTEwpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0gZWxzZSB7Ci0JCUVUMTMxMF9QaHlBdXRvTmVnKGFkYXB0ZXIsIGZhbHNlKTsKLQotCQkvKiBTZXQgdG8gdGhlIGNvcnJlY3QgZm9yY2UgbW9kZS4gKi8KLQkJaWYgKGFkYXB0ZXItPkFpRm9yY2VEcHggIT0gMSkgewotCQkJaWYgKChhZGFwdGVyLT5SZWdpc3RyeUZsb3dDb250cm9sID09IFR4T25seSkgfHwKLQkJCSAgICAoYWRhcHRlci0+UmVnaXN0cnlGbG93Q29udHJvbCA9PSBCb3RoKSkgewotCQkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChhZGFwdGVyLAotCQkJCQkJICAgICAgVFJVRVBIWV9CSVRfU0VULCA0LCAxMSwKLQkJCQkJCSAgICAgIE5VTEwpOwotCQkJfSBlbHNlIHsKLQkJCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoYWRhcHRlciwKLQkJCQkJCSAgICAgIFRSVUVQSFlfQklUX0NMRUFSLCA0LCAxMSwKLQkJCQkJCSAgICAgIE5VTEwpOwotCQkJfQotCi0JCQlpZiAoYWRhcHRlci0+UmVnaXN0cnlGbG93Q29udHJvbCA9PSBCb3RoKSB7Ci0JCQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGFkYXB0ZXIsCi0JCQkJCQkgICAgICBUUlVFUEhZX0JJVF9TRVQsIDQsIDEwLAotCQkJCQkJICAgICAgTlVMTCk7Ci0JCQl9IGVsc2UgewotCQkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChhZGFwdGVyLAotCQkJCQkJICAgICAgVFJVRVBIWV9CSVRfQ0xFQVIsIDQsIDEwLAotCQkJCQkJICAgICAgTlVMTCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoYWRhcHRlciwKLQkJCQkJICAgICAgVFJVRVBIWV9CSVRfQ0xFQVIsIDQsIDEwLCBOVUxMKTsKLQkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChhZGFwdGVyLAotCQkJCQkgICAgICBUUlVFUEhZX0JJVF9DTEVBUiwgNCwgMTEsIE5VTEwpOwotCQl9Ci0KLQkJc3dpdGNoIChhZGFwdGVyLT5BaUZvcmNlU3BlZWQpIHsKLQkJY2FzZSAxMDoKLQkJCWlmIChhZGFwdGVyLT5BaUZvcmNlRHB4ID09IDEpCi0JCQkJVFBBTF9TZXRQaHkxMEhhbGZEdXBsZXgoYWRhcHRlcik7Ci0JCQllbHNlIGlmIChhZGFwdGVyLT5BaUZvcmNlRHB4ID09IDIpCi0JCQkJVFBBTF9TZXRQaHkxMEZ1bGxEdXBsZXgoYWRhcHRlcik7Ci0JCQllbHNlCi0JCQkJVFBBTF9TZXRQaHkxMEZvcmNlKGFkYXB0ZXIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTAwOgotCQkJaWYgKGFkYXB0ZXItPkFpRm9yY2VEcHggPT0gMSkKLQkJCQlUUEFMX1NldFBoeTEwMEhhbGZEdXBsZXgoYWRhcHRlcik7Ci0JCQllbHNlIGlmIChhZGFwdGVyLT5BaUZvcmNlRHB4ID09IDIpCi0JCQkJVFBBTF9TZXRQaHkxMDBGdWxsRHVwbGV4KGFkYXB0ZXIpOwotCQkJZWxzZQotCQkJCVRQQUxfU2V0UGh5MTAwRm9yY2UoYWRhcHRlcik7Ci0JCQlicmVhazsKLQkJY2FzZSAxMDAwOgotCQkJVFBBTF9TZXRQaHkxMDAwRnVsbER1cGxleChhZGFwdGVyKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIHN0YXR1czsKKwkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGV0ZGV2LCBUUlVFUEhZX0JJVF9TRVQsIDAsIDksIE5VTEwpOworCQlyZXR1cm47CiAJfQorCisJRVQxMzEwX1BoeUF1dG9OZWcoZXRkZXYsIGZhbHNlKTsKKworCS8qIFNldCB0byB0aGUgY29ycmVjdCBmb3JjZSBtb2RlLiAqLworCWlmIChldGRldi0+QWlGb3JjZURweCAhPSAxKSB7CisJCWlmIChldGRldi0+UmVnaXN0cnlGbG93Q29udHJvbCA9PSBUeE9ubHkgfHwKKwkJICAgIGV0ZGV2LT5SZWdpc3RyeUZsb3dDb250cm9sID09IEJvdGgpCisJCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoZXRkZXYsCisJCQkJICAgICAgVFJVRVBIWV9CSVRfU0VULCA0LCAxMSwgTlVMTCk7CisJCWVsc2UKKwkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwKKwkJCQkJICAgICAgVFJVRVBIWV9CSVRfQ0xFQVIsIDQsIDExLCBOVUxMKTsKKworCQlpZiAoZXRkZXYtPlJlZ2lzdHJ5Rmxvd0NvbnRyb2wgPT0gQm90aCkKKwkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwKKwkJCQkJICAgICAgVFJVRVBIWV9CSVRfU0VULCA0LCAxMCwgTlVMTCk7CisJCWVsc2UKKwkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwKKwkJCQkJICAgICAgVFJVRVBIWV9CSVRfQ0xFQVIsIDQsIDEwLCBOVUxMKTsKKwl9IGVsc2UgeworCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoZXRkZXYsIFRSVUVQSFlfQklUX0NMRUFSLCA0LCAxMCwgTlVMTCk7CisJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwgVFJVRVBIWV9CSVRfQ0xFQVIsIDQsIDExLCBOVUxMKTsKKwl9CisJRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMSk7CisJc3dpdGNoIChldGRldi0+QWlGb3JjZVNwZWVkKSB7CisJY2FzZSAxMDoKKwkJLyogRmlyc3Qgd2UgbmVlZCB0byB0dXJuIG9mZiBhbGwgb3RoZXIgYWR2ZXJ0aXNlbWVudCAqLworCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7CisJCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOworCQlpZiAoZXRkZXYtPkFpRm9yY2VEcHggPT0gMSkgeworCQkJLyogU2V0IG91ciBhZHZlcnRpc2UgdmFsdWVzIGFjY29yZGluZ2x5ICovCisJCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTBCYXNlVChldGRldiwKKwkJCQkJCVRSVUVQSFlfQURWX0RVUExFWF9IQUxGKTsKKwkJfSBlbHNlIGlmIChldGRldi0+QWlGb3JjZURweCA9PSAyKSB7CisJCQkvKiBTZXQgb3VyIGFkdmVydGlzZSB2YWx1ZXMgYWNjb3JkaW5nbHkgKi8KKwkJCUVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKGV0ZGV2LAorCQkJCQkJVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEwpOworCQl9IGVsc2UgeworCQkJLyogRGlzYWJsZSBhdXRvbmVnICovCisJCQlFVDEzMTBfUGh5QXV0b05lZyhldGRldiwgZmFsc2UpOworCQkJLyogRGlzYWJsZSByZXN0IG9mIHRoZSBhZHZlcnRpc2VtZW50cyAqLworCQkJRVQxMzEwX1BoeUFkdmVydGlzZTEwQmFzZVQoZXRkZXYsCisJCQkJCVRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKKwkJCS8qIEZvcmNlIDEwIE1icHMgKi8KKwkJCUVUMTMxMF9QaHlTcGVlZFNlbGVjdChldGRldiwgVFJVRVBIWV9TUEVFRF8xME1CUFMpOworCQkJLyogRm9yY2UgRnVsbCBkdXBsZXggKi8KKwkJCUVUMTMxMF9QaHlEdXBsZXhNb2RlKGV0ZGV2LCBUUlVFUEhZX0RVUExFWF9GVUxMKTsKKwkJfQorCQlicmVhazsKKwljYXNlIDEwMDoKKwkJLyogZmlyc3Qgd2UgbmVlZCB0byB0dXJuIG9mZiBhbGwgb3RoZXIgYWR2ZXJ0aXNlbWVudCAqLworCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7CisJCUVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7CisJCWlmIChldGRldi0+QWlGb3JjZURweCA9PSAxKSB7CisJCQkvKiBTZXQgb3VyIGFkdmVydGlzZSB2YWx1ZXMgYWNjb3JkaW5nbHkgKi8KKwkJCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDBCYXNlVChldGRldiwKKwkJCQkJCVRSVUVQSFlfQURWX0RVUExFWF9IQUxGKTsKKwkJCS8qIFNldCBzcGVlZCAqLworCQkJRVQxMzEwX1BoeVNwZWVkU2VsZWN0KGV0ZGV2LCBUUlVFUEhZX1NQRUVEXzEwME1CUFMpOworCQl9IGVsc2UgaWYgKGV0ZGV2LT5BaUZvcmNlRHB4ID09IDIpIHsKKwkJCS8qIFNldCBvdXIgYWR2ZXJ0aXNlIHZhbHVlcyBhY2NvcmRpbmdseSAqLworCQkJRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKGV0ZGV2LAorCQkJCQkJVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEwpOworCQl9IGVsc2UgeworCQkJLyogRGlzYWJsZSBhdXRvbmVnICovCisJCQlFVDEzMTBfUGh5QXV0b05lZyhldGRldiwgZmFsc2UpOworCQkJLyogRGlzYWJsZSBvdGhlciBhZHZlcnRpc2VtZW50ICovCisJCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwQmFzZVQoZXRkZXYsCisJCQkJCQlUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7CisJCQkvKiBGb3JjZSAxMDAgTWJwcyAqLworCQkJRVQxMzEwX1BoeVNwZWVkU2VsZWN0KGV0ZGV2LCBUUlVFUEhZX1NQRUVEXzEwME1CUFMpOworCQkJLyogRm9yY2UgRnVsbCBkdXBsZXggKi8KKwkJCUVUMTMxMF9QaHlEdXBsZXhNb2RlKGV0ZGV2LCBUUlVFUEhZX0RVUExFWF9GVUxMKTsKKwkJfQorCQlicmVhazsKKwljYXNlIDEwMDA6CisJCS8qIGZpcnN0IHdlIG5lZWQgdG8gdHVybiBvZmYgYWxsIG90aGVyIGFkdmVydGlzZW1lbnQgKi8KKwkJRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7CisJCUVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7CisJCS8qIHNldCBvdXIgYWR2ZXJ0aXNlIHZhbHVlcyBhY2NvcmRpbmdseSAqLworCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfRlVMTCk7CisJCWJyZWFrOworCX0KKwlFVDEzMTBfUGh5UG93ZXJEb3duKGV0ZGV2LCAwKTsKIH0KIAogdm9pZCBldDEzMXhfTWlpX2NoZWNrKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsCiAJCSAgICAgIE1JX0JNU1JfdCBibXNyLCBNSV9CTVNSX3QgYm1zcl9pbnRzKQogewotCXVpbnQ4X3QgbGlua19zdGF0dXM7Ci0JdWludDMyX3QgYXV0b25lZ19zdGF0dXM7Ci0JdWludDMyX3Qgc3BlZWQ7Ci0JdWludDMyX3QgZHVwbGV4OwotCXVpbnQzMl90IG1kaV9tZGl4OwotCXVpbnQzMl90IG1hc3RlcnNsYXZlOwotCXVpbnQzMl90IHBvbGFyaXR5OworCXU4IGxpbmtfc3RhdHVzOworCXUzMiBhdXRvbmVnX3N0YXR1czsKKwl1MzIgc3BlZWQ7CisJdTMyIGR1cGxleDsKKwl1MzIgbWRpX21kaXg7CisJdTMyIG1hc3RlcnNsYXZlOworCXUzMiBwb2xhcml0eTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGJtc3JfaW50cy5iaXRzLmxpbmtfc3RhdHVzKSB7CkBAIC00NjksOSArNzU2LDcgQEAKIAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPkxvY2ssIGZsYWdzKTsKIAotCQkJLyogRG9uJ3QgaW5kaWNhdGUgc3RhdGUgaWYgd2UncmUgaW4gbG9vcGJhY2sgbW9kZSAqLwotCQkJaWYgKGV0ZGV2LT5SZWdpc3RyeVBoeUxvb3BiayA9PSBmYWxzZSkKLQkJCQluZXRpZl9jYXJyaWVyX29uKGV0ZGV2LT5uZXRkZXYpOworCQkJbmV0aWZfY2Fycmllcl9vbihldGRldi0+bmV0ZGV2KTsKIAkJfSBlbHNlIHsKIAkJCWRldl93YXJuKCZldGRldi0+cGRldi0+ZGV2LAogCQkJICAgICJMaW5rIGRvd24gLSBjYWJsZSBwcm9ibGVtID9cbiIpOwpAQCAtNDgxLDcgKzc2Niw3IEBACiAJCQkJICogVHJ1ZVBIWT8KIAkJCQkgKiAmJiBUUlVfUXVlcnlDb3JlVHlwZShldGRldi0+aFRydWVQaHksIDApID09IEVNSV9UUlVFUEhZX0ExM08pIHsKIAkJCQkgKi8KLQkJCQl1aW50MTZfdCBSZWdpc3RlcjE4OworCQkJCXUxNiBSZWdpc3RlcjE4OwogCiAJCQkJTWlSZWFkKGV0ZGV2LCAweDEyLCAmUmVnaXN0ZXIxOCk7CiAJCQkJTWlXcml0ZShldGRldiwgMHgxMiwgUmVnaXN0ZXIxOCB8IDB4NCk7CkBAIC01MDQsMTEgKzc4OSw3IEBACiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPkxvY2ssCiAJCQkJCQkgICAgICAgZmxhZ3MpOwogCi0JCQkJLyogT25seSBpbmRpY2F0ZSBzdGF0ZSBpZiB3ZSdyZSBpbiBsb29wYmFjawotCQkJCSAqIG1vZGUKLQkJCQkgKi8KLQkJCQlpZiAoZXRkZXYtPlJlZ2lzdHJ5UGh5TG9vcGJrID09IGZhbHNlKQotCQkJCQluZXRpZl9jYXJyaWVyX29mZihldGRldi0+bmV0ZGV2KTsKKwkJCQluZXRpZl9jYXJyaWVyX29mZihldGRldi0+bmV0ZGV2KTsKIAkJCX0KIAogCQkJZXRkZXYtPmxpbmtzcGVlZCA9IDA7CkBAIC01NjEsNyArODQyLDcgQEAKIAkJCQkgKiBUcnVlUEhZPwogCQkJCSAqICYmIFRSVV9RdWVyeUNvcmVUeXBlKGV0ZGV2LT5oVHJ1ZVBoeSwgMCk9PSBFTUlfVFJVRVBIWV9BMTNPKSB7CiAJCQkJICovCi0JCQkJdWludDE2X3QgUmVnaXN0ZXIxODsKKwkJCQl1MTYgUmVnaXN0ZXIxODsKIAogCQkJCU1pUmVhZChldGRldiwgMHgxMiwgJlJlZ2lzdGVyMTgpOwogCQkJCU1pV3JpdGUoZXRkZXYsIDB4MTIsIFJlZ2lzdGVyMTggfCAweDQpOwpAQCAtNTgzLDIxMiArODY0LDEzIEBACiAJfQogfQogCi0vKioKLSAqIFRQQUxfU2V0UGh5MTBIYWxmRHVwbGV4IC0gRm9yY2UgdGhlIHBoeSBpbnRvIDEwIEJhc2UgVCBIYWxmIER1cGxleCBtb2RlLgotICogQGV0ZGV2OiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIHN0cnVjdHVyZQotICoKLSAqIEFsc28gc2V0cyB0aGUgTUFDIHNvIGl0IGlzIHN5bmNkIHVwIHByb3Blcmx5Ci0gKi8KLXZvaWQgVFBBTF9TZXRQaHkxMEhhbGZEdXBsZXgoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQkvKiBQb3dlciBkb3duIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDEpOwotCi0JLyogRmlyc3Qgd2UgbmVlZCB0byB0dXJuIG9mZiBhbGwgb3RoZXIgYWR2ZXJ0aXNlbWVudCAqLwotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKLQotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCi0JLyogU2V0IG91ciBhZHZlcnRpc2UgdmFsdWVzIGFjY29yZGluZ2x5ICovCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9IQUxGKTsKLQotCS8qIFBvd2VyIHVwIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDApOwotfQotCi0vKioKLSAqIFRQQUxfU2V0UGh5MTBGdWxsRHVwbGV4IC0gRm9yY2UgdGhlIHBoeSBpbnRvIDEwIEJhc2UgVCBGdWxsIER1cGxleCBtb2RlLgotICogQGV0ZGV2OiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIHN0cnVjdHVyZQotICoKLSAqIEFsc28gc2V0cyB0aGUgTUFDIHNvIGl0IGlzIHN5bmNkIHVwIHByb3Blcmx5Ci0gKi8KLXZvaWQgVFBBTF9TZXRQaHkxMEZ1bGxEdXBsZXgoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQkvKiBQb3dlciBkb3duIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDEpOwotCi0JLyogRmlyc3Qgd2UgbmVlZCB0byB0dXJuIG9mZiBhbGwgb3RoZXIgYWR2ZXJ0aXNlbWVudCAqLwotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKLQotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCi0JLyogU2V0IG91ciBhZHZlcnRpc2UgdmFsdWVzIGFjY29yZGluZ2x5ICovCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9GVUxMKTsKLQotCS8qIFBvd2VyIHVwIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDApOwotfQotCi0vKioKLSAqIFRQQUxfU2V0UGh5MTBGb3JjZSAtIEZvcmNlIEJhc2UtVCBGRCBtb2RlIFdJVEhPVVQgdXNpbmcgYXV0b25lZ290aWF0aW9uCi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIgc3RydWN0dXJlCi0gKi8KLXZvaWQgVFBBTF9TZXRQaHkxMEZvcmNlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCi17Ci0JLyogUG93ZXIgZG93biBQSFkgKi8KLQlFVDEzMTBfUGh5UG93ZXJEb3duKGV0ZGV2LCAxKTsKLQotCS8qIERpc2FibGUgYXV0b25lZyAqLwotCUVUMTMxMF9QaHlBdXRvTmVnKGV0ZGV2LCBmYWxzZSk7Ci0KLQkvKiBEaXNhYmxlIGFsbCBhZHZlcnRpc2VtZW50ICovCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0KLQkvKiBGb3JjZSAxMCBNYnBzICovCi0JRVQxMzEwX1BoeVNwZWVkU2VsZWN0KGV0ZGV2LCBUUlVFUEhZX1NQRUVEXzEwTUJQUyk7Ci0KLQkvKiBGb3JjZSBGdWxsIGR1cGxleCAqLwotCUVUMTMxMF9QaHlEdXBsZXhNb2RlKGV0ZGV2LCBUUlVFUEhZX0RVUExFWF9GVUxMKTsKLQotCS8qIFBvd2VyIHVwIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDApOwotfQotCi0vKioKLSAqIFRQQUxfU2V0UGh5MTAwSGFsZkR1cGxleCAtIEZvcmNlIDEwMCBCYXNlIFQgSGFsZiBEdXBsZXggbW9kZS4KLSAqIEBldGRldjogcG9pbnRlciB0byB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqCi0gKiBBbHNvIHNldHMgdGhlIE1BQyBzbyBpdCBpcyBzeW5jZCB1cCBwcm9wZXJseS4KLSAqLwotdm9pZCBUUEFMX1NldFBoeTEwMEhhbGZEdXBsZXgoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQkvKiBQb3dlciBkb3duIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDEpOwotCi0JLyogZmlyc3Qgd2UgbmVlZCB0byB0dXJuIG9mZiBhbGwgb3RoZXIgYWR2ZXJ0aXNlbWVudCAqLwotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKLQotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0KLQkvKiBTZXQgb3VyIGFkdmVydGlzZSB2YWx1ZXMgYWNjb3JkaW5nbHkgKi8KLQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9IQUxGKTsKLQotCS8qIFNldCBzcGVlZCAqLwotCUVUMTMxMF9QaHlTcGVlZFNlbGVjdChldGRldiwgVFJVRVBIWV9TUEVFRF8xMDBNQlBTKTsKLQotCS8qIFBvd2VyIHVwIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDApOwotfQotCi0vKioKLSAqIFRQQUxfU2V0UGh5MTAwRnVsbER1cGxleCAtIEZvcmNlIDEwMCBCYXNlIFQgRnVsbCBEdXBsZXggbW9kZS4KLSAqIEBldGRldjogcG9pbnRlciB0byB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqCi0gKiBBbHNvIHNldHMgdGhlIE1BQyBzbyBpdCBpcyBzeW5jZCB1cCBwcm9wZXJseQotICovCi12b2lkIFRQQUxfU2V0UGh5MTAwRnVsbER1cGxleChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCS8qIFBvd2VyIGRvd24gUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMSk7Ci0KLQkvKiBGaXJzdCB3ZSBuZWVkIHRvIHR1cm4gb2ZmIGFsbCBvdGhlciBhZHZlcnRpc2VtZW50ICovCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKLQotCS8qIFNldCBvdXIgYWR2ZXJ0aXNlIHZhbHVlcyBhY2NvcmRpbmdseSAqLwotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEwpOwotCi0JLyogUG93ZXIgdXAgUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMCk7Ci19Ci0KLS8qKgotICogVFBBTF9TZXRQaHkxMDBGb3JjZSAtIEZvcmNlIDEwMCBCYXNlVCBGRCBtb2RlIFdJVEhPVVQgdXNpbmcgYXV0b25lZ290aWF0aW9uCi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIgc3RydWN0dXJlCi0gKi8KLXZvaWQgVFBBTF9TZXRQaHkxMDBGb3JjZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCS8qIFBvd2VyIGRvd24gUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMSk7Ci0KLQkvKiBEaXNhYmxlIGF1dG9uZWcgKi8KLQlFVDEzMTBfUGh5QXV0b05lZyhldGRldiwgZmFsc2UpOwotCi0JLyogRGlzYWJsZSBhbGwgYWR2ZXJ0aXNlbWVudCAqLwotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKLQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCi0JLyogRm9yY2UgMTAwIE1icHMgKi8KLQlFVDEzMTBfUGh5U3BlZWRTZWxlY3QoZXRkZXYsIFRSVUVQSFlfU1BFRURfMTAwTUJQUyk7Ci0KLQkvKiBGb3JjZSBGdWxsIGR1cGxleCAqLwotCUVUMTMxMF9QaHlEdXBsZXhNb2RlKGV0ZGV2LCBUUlVFUEhZX0RVUExFWF9GVUxMKTsKLQotCS8qIFBvd2VyIHVwIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDApOwotfQotCi0vKioKLSAqIFRQQUxfU2V0UGh5MTAwMEZ1bGxEdXBsZXggLSBGb3JjZSAxMDAwIEJhc2UgVCBGdWxsIER1cGxleCBtb2RlCi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIgc3RydWN0dXJlCi0gKgotICogQWxzbyBzZXRzIHRoZSBNQUMgc28gaXQgaXMgc3luY2QgdXAgcHJvcGVybHkuCi0gKi8KLXZvaWQgVFBBTF9TZXRQaHkxMDAwRnVsbER1cGxleChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCS8qIFBvd2VyIGRvd24gUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMSk7Ci0KLQkvKiBmaXJzdCB3ZSBuZWVkIHRvIHR1cm4gb2ZmIGFsbCBvdGhlciBhZHZlcnRpc2VtZW50ICovCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0KLQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCi0JLyogc2V0IG91ciBhZHZlcnRpc2UgdmFsdWVzIGFjY29yZGluZ2x5ICovCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEwpOwotCi0JLyogcG93ZXIgdXAgUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMCk7Ci19Ci0KLS8qKgotICogVFBBTF9TZXRQaHlBdXRvTmVnIC0gU2V0IHBoeSB0byBhdXRvbmVnb3RpYXRpb24gbW9kZS4KLSAqIEBldGRldjogcG9pbnRlciB0byB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqLwotdm9pZCBUUEFMX1NldFBoeUF1dG9OZWcoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQkvKiBQb3dlciBkb3duIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDEpOwotCi0JLyogVHVybiBvbiBhZHZlcnRpc2VtZW50IG9mIGFsbCBjYXBhYmlsaXRpZXMgKi8KLQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX0JPVEgpOwotCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfQk9USCk7Ci0KLQlpZiAoZXRkZXYtPnBkZXYtPmRldmljZSAhPSBFVDEzMVhfUENJX0RFVklDRV9JRF9GQVNUKQotCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfRlVMTCk7Ci0JZWxzZQotCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0KLQkvKiBNYWtlIHN1cmUgYXV0by1uZWcgaXMgT04gKGl0IGlzIGRpc2FibGVkIGluIEZPUkNFIG1vZGVzKSAqLwotCUVUMTMxMF9QaHlBdXRvTmVnKGV0ZGV2LCB0cnVlKTsKLQotCS8qIFBvd2VyIHVwIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDApOwotfQotCi0KIC8qCiAgKiBUaGUgcm91dGluZXMgd2hpY2ggZm9sbG93IHByb3ZpZGUgbG93LWxldmVsIGFjY2VzcyB0byB0aGUgUEhZLCBhbmQgYXJlIHVzZWQKICAqIHByaW1hcmlseSBieSB0aGUgcm91dGluZXMgYWJvdmUgKGFsdGhvdWdoIHRoZXJlIGFyZSBhIGZldyBwbGFjZXMgZWxzZXdoZXJlCiAgKiBpbiB0aGUgZHJpdmVyIHdoZXJlIHRoaXMgbGV2ZWwgb2YgYWNjZXNzIGlzIHJlcXVpcmVkKS4KICAqLwogCi1zdGF0aWMgY29uc3QgdWludDE2X3QgQ29uZmlnUGh5WzI1XVsyXSA9IHsKK3N0YXRpYyBjb25zdCB1MTYgQ29uZmlnUGh5WzI1XVsyXSA9IHsKIAkvKiBSZWcgICAgICBWYWx1ZSAgICAgIFJlZ2lzdGVyICovCiAJLyogQWRkciAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCXsweDg4MEIsIDB4MDkyNn0sCS8qIEFmZUlmQ3JlZzRCMTAwME1zYnMgKi8KQEAgLTgzMSw3ICs5MTMsNyBAQAogLyogY29uZGVuc2VkIHZlcnNpb24gb2YgdGhlIHBoeSBpbml0aWFsaXphdGlvbiByb3V0aW5lICovCiB2b2lkIEVUMTMxMF9QaHlJbml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCiB7Ci0JdWludDE2X3QgZGF0YSwgaW5kZXg7CisJdTE2IGRhdGEsIGluZGV4OwogCiAJaWYgKGV0ZGV2ID09IE5VTEwpCiAJCXJldHVybjsKQEAgLTg5NiwzMDQgKzk3OCwzIEBACiAJTWlXcml0ZShldGRldiwgUEhZX01QSFlfQ09OVFJPTF9SRUcsIDB4MDAwMik7CiB9CiAKLXZvaWQgRVQxMzEwX1BoeVJlc2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCi17Ci0JTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIDB4ODAwMCk7Ci19Ci0KLXZvaWQgRVQxMzEwX1BoeVBvd2VyRG93bihzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCBib29sIGRvd24pCi17Ci0JdWludDE2X3QgZGF0YTsKLQotCU1pUmVhZChldGRldiwgUEhZX0NPTlRST0wsICZkYXRhKTsKLQotCWlmIChkb3duID09IGZhbHNlKSB7Ci0JCS8qIFBvd2VyIFVQICovCi0JCWRhdGEgJj0gfjB4MDgwMDsKLQkJTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIGRhdGEpOwotCX0gZWxzZSB7Ci0JCS8qIFBvd2VyIERPV04gKi8KLQkJZGF0YSB8PSAweDA4MDA7Ci0JCU1pV3JpdGUoZXRkZXYsIFBIWV9DT05UUk9MLCBkYXRhKTsKLQl9Ci19Ci0KLXZvaWQgRVQxMzEwX1BoeUF1dG9OZWcoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgYm9vbCBlbmFibGUpCi17Ci0JdWludDE2X3QgZGF0YTsKLQotCU1pUmVhZChldGRldiwgUEhZX0NPTlRST0wsICZkYXRhKTsKLQotCWlmIChlbmFibGUgPT0gdHJ1ZSkgewotCQkvKiBBdXRvbmVnb3RpYXRpb24gT04gKi8KLQkJZGF0YSB8PSAweDEwMDA7Ci0JCU1pV3JpdGUoZXRkZXYsIFBIWV9DT05UUk9MLCBkYXRhKTsKLQl9IGVsc2UgewotCQkvKiBBdXRvbmVnb3RpYXRpb24gT0ZGICovCi0JCWRhdGEgJj0gfjB4MTAwMDsKLQkJTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIGRhdGEpOwotCX0KLX0KLQotdm9pZCBFVDEzMTBfUGh5RHVwbGV4TW9kZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCB1aW50MTZfdCBkdXBsZXgpCi17Ci0JdWludDE2X3QgZGF0YTsKLQotCU1pUmVhZChldGRldiwgUEhZX0NPTlRST0wsICZkYXRhKTsKLQotCWlmIChkdXBsZXggPT0gVFJVRVBIWV9EVVBMRVhfRlVMTCkgewotCQkvKiBTZXQgRnVsbCBEdXBsZXggKi8KLQkJZGF0YSB8PSAweDEwMDsKLQkJTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIGRhdGEpOwotCX0gZWxzZSB7Ci0JCS8qIFNldCBIYWxmIER1cGxleCAqLwotCQlkYXRhICY9IH4weDEwMDsKLQkJTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIGRhdGEpOwotCX0KLX0KLQotdm9pZCBFVDEzMTBfUGh5U3BlZWRTZWxlY3Qoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgdWludDE2X3Qgc3BlZWQpCi17Ci0JdWludDE2X3QgZGF0YTsKLQotCS8qIFJlYWQgdGhlIFBIWSBjb250cm9sIHJlZ2lzdGVyICovCi0JTWlSZWFkKGV0ZGV2LCBQSFlfQ09OVFJPTCwgJmRhdGEpOwotCi0JLyogQ2xlYXIgYWxsIFNwZWVkIHNldHRpbmdzIChCaXRzIDYsIDEzKSAqLwotCWRhdGEgJj0gfjB4MjA0MDsKLQotCS8qIFJlc2V0IHRoZSBzcGVlZCBiaXRzIGJhc2VkIG9uIHVzZXIgc2VsZWN0aW9uICovCi0Jc3dpdGNoIChzcGVlZCkgewotCWNhc2UgVFJVRVBIWV9TUEVFRF8xME1CUFM6Ci0JCS8qIEJpdHMgYWxyZWFkeSBjbGVhcmVkIGFib3ZlLCBkbyBub3RoaW5nICovCi0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX1NQRUVEXzEwME1CUFM6Ci0JCS8qIDEwME0gPT0gU2V0IGJpdCAxMyAqLwotCQlkYXRhIHw9IDB4MjAwMDsKLQkJYnJlYWs7Ci0KLQljYXNlIFRSVUVQSFlfU1BFRURfMTAwME1CUFM6Ci0JZGVmYXVsdDoKLQkJZGF0YSB8PSAweDAwNDA7Ci0JCWJyZWFrOwotCX0KLQotCS8qIFdyaXRlIGJhY2sgdGhlIG5ldyBzcGVlZCAqLwotCU1pV3JpdGUoZXRkZXYsIFBIWV9DT05UUk9MLCBkYXRhKTsKLX0KLQotdm9pZCBFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwMEJhc2VUKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsCi0JCQkJICB1aW50MTZfdCBkdXBsZXgpCi17Ci0JdWludDE2X3QgZGF0YTsKLQotCS8qIFJlYWQgdGhlIFBIWSAxMDAwIEJhc2UtVCBDb250cm9sIFJlZ2lzdGVyICovCi0JTWlSZWFkKGV0ZGV2LCBQSFlfMTAwMF9DT05UUk9MLCAmZGF0YSk7Ci0KLQkvKiBDbGVhciBCaXRzIDgsOSAqLwotCWRhdGEgJj0gfjB4MDMwMDsKLQotCXN3aXRjaCAoZHVwbGV4KSB7Ci0JY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORToKLQkJLyogRHVwbGV4IGFscmVhZHkgY2xlYXJlZCwgZG8gbm90aGluZyAqLwotCQlicmVhazsKLQotCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEw6Ci0JCS8qIFNldCBCaXQgOSAqLwotCQlkYXRhIHw9IDB4MDIwMDsKLQkJYnJlYWs7Ci0KLQljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9IQUxGOgotCQkvKiBTZXQgQml0IDggKi8KLQkJZGF0YSB8PSAweDAxMDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfQk9USDoKLQlkZWZhdWx0OgotCQlkYXRhIHw9IDB4MDMwMDsKLQkJYnJlYWs7Ci0JfQotCi0JLyogV3JpdGUgYmFjayBhZHZlcnRpc2VtZW50ICovCi0JTWlXcml0ZShldGRldiwgUEhZXzEwMDBfQ09OVFJPTCwgZGF0YSk7Ci19Ci0KLXZvaWQgRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsCi0JCQkJIHVpbnQxNl90IGR1cGxleCkKLXsKLQl1aW50MTZfdCBkYXRhOwotCi0JLyogUmVhZCB0aGUgQXV0b25lZ290aWF0aW9uIFJlZ2lzdGVyICgxMC8xMDApICovCi0JTWlSZWFkKGV0ZGV2LCBQSFlfQVVUT19BRFZFUlRJU0VNRU5ULCAmZGF0YSk7Ci0KLQkvKiBDbGVhciBiaXRzIDcsOCAqLwotCWRhdGEgJj0gfjB4MDE4MDsKLQotCXN3aXRjaCAoZHVwbGV4KSB7Ci0JY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORToKLQkJLyogRHVwbGV4IGFscmVhZHkgY2xlYXJlZCwgZG8gbm90aGluZyAqLwotCQlicmVhazsKLQotCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEw6Ci0JCS8qIFNldCBCaXQgOCAqLwotCQlkYXRhIHw9IDB4MDEwMDsKLQkJYnJlYWs7Ci0KLQljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9IQUxGOgotCQkvKiBTZXQgQml0IDcgKi8KLQkJZGF0YSB8PSAweDAwODA7Ci0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfQk9USDoKLQlkZWZhdWx0OgotCQkvKiBTZXQgQml0cyA3LDggKi8KLQkJZGF0YSB8PSAweDAxODA7Ci0JCWJyZWFrOwotCX0KLQotCS8qIFdyaXRlIGJhY2sgYWR2ZXJ0aXNlbWVudCAqLwotCU1pV3JpdGUoZXRkZXYsIFBIWV9BVVRPX0FEVkVSVElTRU1FTlQsIGRhdGEpOwotfQotCi12b2lkIEVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsCi0JCQkJdWludDE2X3QgZHVwbGV4KQotewotCXVpbnQxNl90IGRhdGE7Ci0KLQkvKiBSZWFkIHRoZSBBdXRvbmVnb3RpYXRpb24gUmVnaXN0ZXIgKDEwLzEwMCkgKi8KLQlNaVJlYWQoZXRkZXYsIFBIWV9BVVRPX0FEVkVSVElTRU1FTlQsICZkYXRhKTsKLQotCS8qIENsZWFyIGJpdHMgNSw2ICovCi0JZGF0YSAmPSB+MHgwMDYwOwotCi0Jc3dpdGNoIChkdXBsZXgpIHsKLQljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9OT05FOgotCQkvKiBEdXBsZXggYWxyZWFkeSBjbGVhcmVkLCBkbyBub3RoaW5nICovCi0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfRlVMTDoKLQkJLyogU2V0IEJpdCA2ICovCi0JCWRhdGEgfD0gMHgwMDQwOwotCQlicmVhazsKLQotCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0hBTEY6Ci0JCS8qIFNldCBCaXQgNSAqLwotCQlkYXRhIHw9IDB4MDAyMDsKLQkJYnJlYWs7Ci0KLQljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9CT1RIOgotCWRlZmF1bHQ6Ci0JCS8qIFNldCBCaXRzIDUsNiAqLwotCQlkYXRhIHw9IDB4MDA2MDsKLQkJYnJlYWs7Ci0JfQotCi0JLyogV3JpdGUgYmFjayBhZHZlcnRpc2VtZW50ICovCi0JTWlXcml0ZShldGRldiwgUEhZX0FVVE9fQURWRVJUSVNFTUVOVCwgZGF0YSk7Ci19Ci0KLXZvaWQgRVQxMzEwX1BoeUxpbmtTdGF0dXMoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKLQkJCSAgdWludDhfdCAqbGlua19zdGF0dXMsCi0JCQkgIHVpbnQzMl90ICphdXRvbmVnLAotCQkJICB1aW50MzJfdCAqbGlua3NwZWVkLAotCQkJICB1aW50MzJfdCAqZHVwbGV4X21vZGUsCi0JCQkgIHVpbnQzMl90ICptZGlfbWRpeCwKLQkJCSAgdWludDMyX3QgKm1hc3RlcnNsYXZlLCB1aW50MzJfdCAqcG9sYXJpdHkpCi17Ci0JdWludDE2X3QgbWlzdGF0dXMgPSAwOwotCXVpbnQxNl90IGlzMTAwMEJhc2VUID0gMDsKLQl1aW50MTZfdCB2bWlfcGh5c3RhdHVzID0gMDsKLQl1aW50MTZfdCBjb250cm9sID0gMDsKLQotCU1pUmVhZChldGRldiwgUEhZX1NUQVRVUywgJm1pc3RhdHVzKTsKLQlNaVJlYWQoZXRkZXYsIFBIWV8xMDAwX1NUQVRVUywgJmlzMTAwMEJhc2VUKTsKLQlNaVJlYWQoZXRkZXYsIFBIWV9QSFlfU1RBVFVTLCAmdm1pX3BoeXN0YXR1cyk7Ci0JTWlSZWFkKGV0ZGV2LCBQSFlfQ09OVFJPTCwgJmNvbnRyb2wpOwotCi0JaWYgKGxpbmtfc3RhdHVzKSB7Ci0JCSpsaW5rX3N0YXR1cyA9Ci0JCSAgICAodW5zaWduZWQgY2hhcikoKHZtaV9waHlzdGF0dXMgJiAweDAwNDApID8gMSA6IDApOwotCX0KLQotCWlmIChhdXRvbmVnKSB7Ci0JCSphdXRvbmVnID0KLQkJICAgIChjb250cm9sICYgMHgxMDAwKSA/ICgodm1pX3BoeXN0YXR1cyAmIDB4MDAyMCkgPwotCQkJCQkgICAgVFJVRVBIWV9BTkVHX0NPTVBMRVRFIDoKLQkJCQkJICAgIFRSVUVQSFlfQU5FR19OT1RfQ09NUExFVEUpIDoKLQkJICAgIFRSVUVQSFlfQU5FR19ESVNBQkxFRDsKLQl9Ci0KLQlpZiAobGlua3NwZWVkKQotCQkqbGlua3NwZWVkID0gKHZtaV9waHlzdGF0dXMgJiAweDAzMDApID4+IDg7Ci0KLQlpZiAoZHVwbGV4X21vZGUpCi0JCSpkdXBsZXhfbW9kZSA9ICh2bWlfcGh5c3RhdHVzICYgMHgwMDgwKSA+PiA3OwotCi0JaWYgKG1kaV9tZGl4KQotCQkvKiBOT1RFOiBOZWVkIHRvIGNvbXBsZXRlIHRoaXMgKi8KLQkJKm1kaV9tZGl4ID0gMDsKLQotCWlmIChtYXN0ZXJzbGF2ZSkgewotCQkqbWFzdGVyc2xhdmUgPQotCQkgICAgKGlzMTAwMEJhc2VUICYgMHg0MDAwKSA/IFRSVUVQSFlfQ0ZHX01BU1RFUiA6Ci0JCSAgICBUUlVFUEhZX0NGR19TTEFWRTsKLQl9Ci0KLQlpZiAocG9sYXJpdHkpIHsKLQkJKnBvbGFyaXR5ID0KLQkJICAgICh2bWlfcGh5c3RhdHVzICYgMHgwNDAwKSA/IFRSVUVQSFlfUE9MQVJJVFlfSU5WRVJURUQgOgotCQkgICAgVFJVRVBIWV9QT0xBUklUWV9OT1JNQUw7Ci0JfQotfQotCi12b2lkIEVUMTMxMF9QaHlBbmRPclJlZyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LAotCQkJdWludDE2X3QgcmVnbnVtLCB1aW50MTZfdCBhbmRNYXNrLCB1aW50MTZfdCBvck1hc2spCi17Ci0JdWludDE2X3QgcmVnOwotCi0JLyogUmVhZCB0aGUgcmVxdWVzdGVkIHJlZ2lzdGVyICovCi0JTWlSZWFkKGV0ZGV2LCByZWdudW0sICZyZWcpOwotCi0JLyogQXBwbHkgdGhlIEFORCBtYXNrICovCi0JcmVnICY9IGFuZE1hc2s7Ci0KLQkvKiBBcHBseSB0aGUgT1IgbWFzayAqLwotCXJlZyB8PSBvck1hc2s7Ci0KLQkvKiBXcml0ZSB0aGUgdmFsdWUgYmFjayB0byB0aGUgcmVnaXN0ZXIgKi8KLQlNaVdyaXRlKGV0ZGV2LCByZWdudW0sIHJlZyk7Ci19Ci0KLXZvaWQgRVQxMzEwX1BoeUFjY2Vzc01pQml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIHVpbnQxNl90IGFjdGlvbiwKLQkJCSAgIHVpbnQxNl90IHJlZ251bSwgdWludDE2X3QgYml0bnVtLCB1aW50OF90ICp2YWx1ZSkKLXsKLQl1aW50MTZfdCByZWc7Ci0JdWludDE2X3QgbWFzayA9IDA7Ci0KLQkvKiBDcmVhdGUgYSBtYXNrIHRvIGlzb2xhdGUgdGhlIHJlcXVlc3RlZCBiaXQgKi8KLQltYXNrID0gMHgwMDAxIDw8IGJpdG51bTsKLQotCS8qIFJlYWQgdGhlIHJlcXVlc3RlZCByZWdpc3RlciAqLwotCU1pUmVhZChldGRldiwgcmVnbnVtLCAmcmVnKTsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBUUlVFUEhZX0JJVF9SRUFEOgotCQlpZiAodmFsdWUgIT0gTlVMTCkKLQkJCSp2YWx1ZSA9IChyZWcgJiBtYXNrKSA+PiBiaXRudW07Ci0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX0JJVF9TRVQ6Ci0JCXJlZyB8PSBtYXNrOwotCQlNaVdyaXRlKGV0ZGV2LCByZWdudW0sIHJlZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX0JJVF9DTEVBUjoKLQkJcmVnICY9IH5tYXNrOwotCQlNaVdyaXRlKGV0ZGV2LCByZWdudW0sIHJlZyk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcGh5LmggYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9waHkuaAppbmRleCAwODA2NTZjLi43NThiOWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9waHkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9waHkuaApAQCAtNjEsOSArNjEsNiBAQAogCiAjaW5jbHVkZSAiZXQxMzEwX2FkZHJlc3NfbWFwLmgiCiAKLSNkZWZpbmUgVFJVRVBIWV9TVUNDRVNTIDAKLSNkZWZpbmUgVFJVRVBIWV9GQUlMVVJFIDEKLQogLyogTUkgUmVnaXN0ZXIgQWRkcmVzc2VzICovCiAjZGVmaW5lIE1JX0NPTlRST0xfUkVHICAgICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgTUlfU1RBVFVTX1JFRyAgICAgICAgICAgICAgICAgICAgICAgMQpAQCAtNzQyLDI1ICs3MzksMTUgQEAKIC8qIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgdGhlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUgKi8KIHN0cnVjdCBldDEzMXhfYWRhcHRlcjsKIAotLyogT1MgU3BlY2lmaWMgRnVuY3Rpb25zKi8KLXZvaWQgVFBBTF9TZXRQaHkxMEhhbGZEdXBsZXgoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgVFBBTF9TZXRQaHkxMEZ1bGxEdXBsZXgoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgVFBBTF9TZXRQaHkxMEZvcmNlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqcEFkYXB0ZXIpOwotdm9pZCBUUEFMX1NldFBoeTEwMEhhbGZEdXBsZXgoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgVFBBTF9TZXRQaHkxMDBGdWxsRHVwbGV4KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIFRQQUxfU2V0UGh5MTAwRm9yY2Uoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpwQWRhcHRlcik7Ci12b2lkIFRQQUxfU2V0UGh5MTAwMEZ1bGxEdXBsZXgoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgVFBBTF9TZXRQaHlBdXRvTmVnKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci0KIC8qIFByb3RvdHlwZXMgZm9yIEVUMTMxMF9waHkuYyAqLwogaW50IGV0MTMxeF94Y3ZyX2ZpbmQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLWludCBldDEzMXhfc2V0cGh5X25vcm1hbChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotaW50MzJfdCBQaHlNaVJlYWQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLAotCSAgICAgICB1OCB4Y3ZyQWRkciwgdTggeGN2clJlZywgdTE2ICp2YWx1ZSk7Cit2b2lkIGV0MTMxeF9zZXRwaHlfbm9ybWFsKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7CiAKIC8qIHN0YXRpYyBpbmxpbmUgZnVuY3Rpb24gZG9lcyBub3Qgd29yayBiZWNhdXNlIGV0MTMxeF9hZGFwdGVyIGlzIG5vdCBhbHdheXMKICAqIGRlZmluZWQKICAqLworaW50IFBoeU1pUmVhZChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IHhjdnJBZGRyLAorCSAgICAgIHU4IHhjdnJSZWcsIHUxNiAqdmFsdWUpOwogI2RlZmluZSBNaVJlYWQoYWRhcHRlciwgeGN2clJlZywgdmFsdWUpIFwKIAlQaHlNaVJlYWQoKGFkYXB0ZXIpLCAoYWRhcHRlciktPlN0YXRzLnhjdnJfYWRkciwgKHhjdnJSZWcpLCAodmFsdWUpKQogCkBAIC04NjAsMjQgKzg0Nyw4IEBACiB2b2lkIEVUMTMxMF9QaHlJbml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7CiB2b2lkIEVUMTMxMF9QaHlSZXNldChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwogdm9pZCBFVDEzMTBfUGh5UG93ZXJEb3duKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwgYm9vbCBkb3duKTsKLXZvaWQgRVQxMzEwX1BoeUF1dG9OZWcoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLCBib29sIGVuYWJsZSk7Ci12b2lkIEVUMTMxMF9QaHlEdXBsZXhNb2RlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwgdTE2IGR1cGxleCk7Ci12b2lkIEVUMTMxMF9QaHlTcGVlZFNlbGVjdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBzcGVlZCk7CiB2b2lkIEVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLAogCQkJCSAgdTE2IGR1cGxleCk7Ci12b2lkIEVUMTMxMF9QaHlBZHZlcnRpc2UxMDBCYXNlVChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJIHUxNiBkdXBsZXgpOwotdm9pZCBFVDEzMTBfUGh5QWR2ZXJ0aXNlMTBCYXNlVChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJdTE2IGR1cGxleCk7Ci12b2lkIEVUMTMxMF9QaHlMaW5rU3RhdHVzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwKLQkJCSAgdTggKkxpbmtfc3RhdHVzLAotCQkJICB1MzIgKmF1dG9uZWcsCi0JCQkgIHUzMiAqbGlua3NwZWVkLAotCQkJICB1MzIgKmR1cGxleF9tb2RlLAotCQkJICB1MzIgKm1kaV9tZGl4LAotCQkJICB1MzIgKm1hc3RlcnNsYXZlLCB1MzIgKnBvbGFyaXR5KTsKLXZvaWQgRVQxMzEwX1BoeUFuZE9yUmVnKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwKLQkJCXUxNiByZWdudW0sIHUxNiBhbmRNYXNrLCB1MTYgb3JNYXNrKTsKIHZvaWQgRVQxMzEwX1BoeUFjY2Vzc01pQml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwKIAkJCSAgIHUxNiBhY3Rpb24sCiAJCQkgICB1MTYgcmVnbnVtLCB1MTYgYml0bnVtLCB1OCAqdmFsdWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcnguYyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3J4LmMKaW5kZXggMTBlMjFkYi4uM2RkYzliMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9yeC5jCkBAIC0xMDYsOSArMTA2LDkgQEAKICAqLwogaW50IGV0MTMxeF9yeF9kbWFfbWVtb3J5X2FsbG9jKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKIHsKLQl1aW50MzJfdCBPdXRlckxvb3AsIElubmVyTG9vcDsKLQl1aW50MzJfdCBidWZzaXplOwotCXVpbnQzMl90IHBrdFN0YXRSaW5nU2l6ZSwgRkJSQ2h1bmtTaXplOworCXUzMiBpLCBqOworCXUzMiBidWZzaXplOworCXUzMiBwa3RTdGF0UmluZ1NpemUsIEZCUkNodW5rU2l6ZTsKIAlSWF9SSU5HX3QgKnJ4X3Jpbmc7CiAKIAkvKiBTZXR1cCBzb21lIGNvbnZlbmllbmNlIHBvaW50ZXJzICovCkBAIC0yMjcsMTEgKzIyNywxMSBAQAogCQkJCQlyeF9yaW5nLT5GYnIwb2Zmc2V0KTsKICNlbmRpZgogCi0JZm9yIChPdXRlckxvb3AgPSAwOyBPdXRlckxvb3AgPCAocnhfcmluZy0+RmJyMU51bUVudHJpZXMgLyBGQlJfQ0hVTktTKTsKLQkgICAgIE91dGVyTG9vcCsrKSB7Ci0JCXVpbnQ2NF90IEZicjFPZmZzZXQ7Ci0JCXVpbnQ2NF90IEZicjFUZW1wUGE7Ci0JCXVpbnQzMl90IEZicjFBbGlnbjsKKwlmb3IgKGkgPSAwOyBpIDwgKHJ4X3JpbmctPkZicjFOdW1FbnRyaWVzIC8gRkJSX0NIVU5LUyk7CisJICAgICBpKyspIHsKKwkJdTY0IEZicjFPZmZzZXQ7CisJCXU2NCBGYnIxVGVtcFBhOworCQl1MzIgRmJyMUFsaWduOwogCiAJCS8qIFRoaXMgY29kZSBhbGxvY2F0ZXMgYW4gYXJlYSBvZiBtZW1vcnkgYmlnIGVub3VnaCBmb3IgTgogCQkgKiBmcmVlIGJ1ZmZlcnMgKyAoYnVmZmVyX3NpemUgLSAxKSBzbyB0aGF0IHRoZSBidWZmZXJzIGNhbgpAQCAtMjQ3LDM5ICsyNDcsMzkgQEAKIAogCQlGQlJDaHVua1NpemUgPQogCQkgICAgKEZCUl9DSFVOS1MgKiByeF9yaW5nLT5GYnIxQnVmZmVyU2l6ZSkgKyBGYnIxQWxpZ24gLSAxOwotCQlyeF9yaW5nLT5GYnIxTWVtVmFbT3V0ZXJMb29wXSA9CisJCXJ4X3JpbmctPkZicjFNZW1WYVtpXSA9CiAJCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBGQlJDaHVua1NpemUsCi0JCQkJCSAmcnhfcmluZy0+RmJyMU1lbVBhW091dGVyTG9vcF0pOworCQkJCQkgJnJ4X3JpbmctPkZicjFNZW1QYVtpXSk7CiAKLQkJaWYgKCFyeF9yaW5nLT5GYnIxTWVtVmFbT3V0ZXJMb29wXSkgeworCQlpZiAoIXJ4X3JpbmctPkZicjFNZW1WYVtpXSkgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkJIkNvdWxkIG5vdCBhbGxvYyBtZW1vcnlcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAogCQkvKiBTZWUgTk9URSBpbiAiU2F2ZSBQaHlzaWNhbCBBZGRyZXNzIiBjb21tZW50IGFib3ZlICovCi0JCUZicjFUZW1wUGEgPSByeF9yaW5nLT5GYnIxTWVtUGFbT3V0ZXJMb29wXTsKKwkJRmJyMVRlbXBQYSA9IHJ4X3JpbmctPkZicjFNZW1QYVtpXTsKIAogCQlldDEzMXhfYWxpZ25fYWxsb2NhdGVkX21lbW9yeShhZGFwdGVyLAogCQkJCQkgICAgICAmRmJyMVRlbXBQYSwKIAkJCQkJICAgICAgJkZicjFPZmZzZXQsIChGYnIxQWxpZ24gLSAxKSk7CiAKLQkJZm9yIChJbm5lckxvb3AgPSAwOyBJbm5lckxvb3AgPCBGQlJfQ0hVTktTOyBJbm5lckxvb3ArKykgewotCQkJdWludDMyX3QgaW5kZXggPSAoT3V0ZXJMb29wICogRkJSX0NIVU5LUykgKyBJbm5lckxvb3A7CisJCWZvciAoaiA9IDA7IGogPCBGQlJfQ0hVTktTOyBqKyspIHsKKwkJCXUzMiBpbmRleCA9IChpICogRkJSX0NIVU5LUykgKyBqOwogCiAJCQkvKiBTYXZlIHRoZSBWaXJ0dWFsIGFkZHJlc3Mgb2YgdGhpcyBpbmRleCBmb3IgcXVpY2sKIAkJCSAqIGFjY2VzcyBsYXRlcgogCQkJICovCiAJCQlyeF9yaW5nLT5GYnJbMV0tPlZhW2luZGV4XSA9Ci0JCQkgICAgKHVpbnQ4X3QgKikgcnhfcmluZy0+RmJyMU1lbVZhW091dGVyTG9vcF0gKwotCQkJICAgIChJbm5lckxvb3AgKiByeF9yaW5nLT5GYnIxQnVmZmVyU2l6ZSkgKyBGYnIxT2Zmc2V0OworCQkJICAgICh1aW50OF90ICopIHJ4X3JpbmctPkZicjFNZW1WYVtpXSArCisJCQkgICAgKGogKiByeF9yaW5nLT5GYnIxQnVmZmVyU2l6ZSkgKyBGYnIxT2Zmc2V0OwogCiAJCQkvKiBub3cgc3RvcmUgdGhlIHBoeXNpY2FsIGFkZHJlc3MgaW4gdGhlIGRlc2NyaXB0b3IKIAkJCSAqIHNvIHRoZSBkZXZpY2UgY2FuIGFjY2VzcyBpdAogCQkJICovCiAJCQlyeF9yaW5nLT5GYnJbMV0tPlBBSGlnaFtpbmRleF0gPQotCQkJICAgICh1aW50MzJfdCkgKEZicjFUZW1wUGEgPj4gMzIpOwotCQkJcnhfcmluZy0+RmJyWzFdLT5QQUxvd1tpbmRleF0gPSAodWludDMyX3QpIEZicjFUZW1wUGE7CisJCQkgICAgKHUzMikgKEZicjFUZW1wUGEgPj4gMzIpOworCQkJcnhfcmluZy0+RmJyWzFdLT5QQUxvd1tpbmRleF0gPSAodTMyKSBGYnIxVGVtcFBhOwogCiAJCQlGYnIxVGVtcFBhICs9IHJ4X3JpbmctPkZicjFCdWZmZXJTaXplOwogCkBAIC0yOTIsNDAgKzI5Miw0MCBAQAogCiAjaWZkZWYgVVNFX0ZCUjAKIAkvKiBTYW1lIGZvciBGQlIwIChpZiBpbiB1c2UpICovCi0JZm9yIChPdXRlckxvb3AgPSAwOyBPdXRlckxvb3AgPCAocnhfcmluZy0+RmJyME51bUVudHJpZXMgLyBGQlJfQ0hVTktTKTsKLQkgICAgIE91dGVyTG9vcCsrKSB7Ci0JCXVpbnQ2NF90IEZicjBPZmZzZXQ7Ci0JCXVpbnQ2NF90IEZicjBUZW1wUGE7CisJZm9yIChpID0gMDsgaSA8IChyeF9yaW5nLT5GYnIwTnVtRW50cmllcyAvIEZCUl9DSFVOS1MpOworCSAgICAgaSsrKSB7CisJCXU2NCBGYnIwT2Zmc2V0OworCQl1NjQgRmJyMFRlbXBQYTsKIAogCQlGQlJDaHVua1NpemUgPSAoKEZCUl9DSFVOS1MgKyAxKSAqIHJ4X3JpbmctPkZicjBCdWZmZXJTaXplKSAtIDE7Ci0JCXJ4X3JpbmctPkZicjBNZW1WYVtPdXRlckxvb3BdID0KKwkJcnhfcmluZy0+RmJyME1lbVZhW2ldID0KIAkJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIEZCUkNodW5rU2l6ZSwKLQkJCQkJICZyeF9yaW5nLT5GYnIwTWVtUGFbT3V0ZXJMb29wXSk7CisJCQkJCSAmcnhfcmluZy0+RmJyME1lbVBhW2ldKTsKIAotCQlpZiAoIXJ4X3JpbmctPkZicjBNZW1WYVtPdXRlckxvb3BdKSB7CisJCWlmICghcnhfcmluZy0+RmJyME1lbVZhW2ldKSB7CiAJCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkJIkNvdWxkIG5vdCBhbGxvYyBtZW1vcnlcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAogCQkvKiBTZWUgTk9URSBpbiAiU2F2ZSBQaHlzaWNhbCBBZGRyZXNzIiBjb21tZW50IGFib3ZlICovCi0JCUZicjBUZW1wUGEgPSByeF9yaW5nLT5GYnIwTWVtUGFbT3V0ZXJMb29wXTsKKwkJRmJyMFRlbXBQYSA9IHJ4X3JpbmctPkZicjBNZW1QYVtpXTsKIAogCQlldDEzMXhfYWxpZ25fYWxsb2NhdGVkX21lbW9yeShhZGFwdGVyLAogCQkJCQkgICAgICAmRmJyMFRlbXBQYSwKIAkJCQkJICAgICAgJkZicjBPZmZzZXQsCiAJCQkJCSAgICAgIHJ4X3JpbmctPkZicjBCdWZmZXJTaXplIC0gMSk7CiAKLQkJZm9yIChJbm5lckxvb3AgPSAwOyBJbm5lckxvb3AgPCBGQlJfQ0hVTktTOyBJbm5lckxvb3ArKykgewotCQkJdWludDMyX3QgaW5kZXggPSAoT3V0ZXJMb29wICogRkJSX0NIVU5LUykgKyBJbm5lckxvb3A7CisJCWZvciAoaiA9IDA7IGogPCBGQlJfQ0hVTktTOyBqKyspIHsKKwkJCXUzMiBpbmRleCA9IChpICogRkJSX0NIVU5LUykgKyBqOwogCiAJCQlyeF9yaW5nLT5GYnJbMF0tPlZhW2luZGV4XSA9Ci0JCQkgICAgKHVpbnQ4X3QgKikgcnhfcmluZy0+RmJyME1lbVZhW091dGVyTG9vcF0gKwotCQkJICAgIChJbm5lckxvb3AgKiByeF9yaW5nLT5GYnIwQnVmZmVyU2l6ZSkgKyBGYnIwT2Zmc2V0OworCQkJICAgICh1aW50OF90ICopIHJ4X3JpbmctPkZicjBNZW1WYVtpXSArCisJCQkgICAgKGogKiByeF9yaW5nLT5GYnIwQnVmZmVyU2l6ZSkgKyBGYnIwT2Zmc2V0OwogCiAJCQlyeF9yaW5nLT5GYnJbMF0tPlBBSGlnaFtpbmRleF0gPQotCQkJICAgICh1aW50MzJfdCkgKEZicjBUZW1wUGEgPj4gMzIpOwotCQkJcnhfcmluZy0+RmJyWzBdLT5QQUxvd1tpbmRleF0gPSAodWludDMyX3QpIEZicjBUZW1wUGE7CisJCQkgICAgKHUzMikgKEZicjBUZW1wUGEgPj4gMzIpOworCQkJcnhfcmluZy0+RmJyWzBdLT5QQUxvd1tpbmRleF0gPSAodTMyKSBGYnIwVGVtcFBhOwogCiAJCQlGYnIwVGVtcFBhICs9IHJ4X3JpbmctPkZicjBCdWZmZXJTaXplOwogCkBAIC0zNDIsNyArMzQyLDcgQEAKIAkgICAgc2l6ZW9mKFBLVF9TVEFUX0RFU0NfdCkgKiBhZGFwdGVyLT5SeFJpbmcuUHNyTnVtRW50cmllczsKIAogCXJ4X3JpbmctPnBQU1JpbmdWYSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCi0JCQkJCQkgIHBrdFN0YXRSaW5nU2l6ZSArIDB4MGZmZiwKKwkJCQkJCSAgcGt0U3RhdFJpbmdTaXplLAogCQkJCQkJICAmcnhfcmluZy0+cFBTUmluZ1BhKTsKIAogCWlmICghcnhfcmluZy0+cFBTUmluZ1ZhKSB7CkBAIC0zNTAsNDUgKzM1MCwyNiBAQAogCQkJICAiQ2Fubm90IGFsbG9jIG1lbW9yeSBmb3IgUGFja2V0IFN0YXR1cyBSaW5nXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQorCXByaW50aygiUFNSICVseFxuIiwgKHVuc2lnbmVkIGxvbmcpIHJ4X3JpbmctPnBQU1JpbmdQYSk7CiAKLQkvKiBTYXZlIHBoeXNpY2FsIGFkZHJlc3MKLQkgKgorCS8qCiAJICogTk9URSA6IHBjaV9hbGxvY19jb25zaXN0ZW50KCksIHVzZWQgYWJvdmUgdG8gYWxsb2MgRE1BIHJlZ2lvbnMsCiAJICogQUxXQVlTIHJldHVybnMgU0FDICgzMi1iaXQpIGFkZHJlc3Nlcy4gSWYgREFDICg2NC1iaXQpIGFkZHJlc3NlcwogCSAqIGFyZSBldmVyIHJldHVybmVkLCBtYWtlIHN1cmUgdGhlIGhpZ2ggcGFydCBpcyByZXRyaWV2ZWQgaGVyZSBiZWZvcmUKIAkgKiBzdG9yaW5nIHRoZSBhZGp1c3RlZCBhZGRyZXNzLgogCSAqLwotCXJ4X3JpbmctPnBQU1JpbmdSZWFsUGEgPSByeF9yaW5nLT5wUFNSaW5nUGE7Ci0KLQkvKiBBbGlnbiBQYWNrZXQgU3RhdHVzIFJpbmcgb24gYSA0SyBib3VuZGFyeSAqLwotCWV0MTMxeF9hbGlnbl9hbGxvY2F0ZWRfbWVtb3J5KGFkYXB0ZXIsCi0JCQkJICAgICAgJnJ4X3JpbmctPnBQU1JpbmdSZWFsUGEsCi0JCQkJICAgICAgJnJ4X3JpbmctPnBQU1JpbmdPZmZzZXQsIDB4MEZGRik7Ci0KLQlyeF9yaW5nLT5wUFNSaW5nVmEgPSAodm9pZCAqKSgodWludDhfdCAqKSByeF9yaW5nLT5wUFNSaW5nVmEgKwotCQkJCSAgICAgIHJ4X3JpbmctPnBQU1JpbmdPZmZzZXQpOwogCiAJLyogQWxsb2NhdGUgYW4gYXJlYSBvZiBtZW1vcnkgZm9yIHdyaXRlYmFjayBvZiBzdGF0dXMgaW5mb3JtYXRpb24gKi8KIAlyeF9yaW5nLT5wUnhTdGF0dXNWYSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCi0JCQkJCQkgICAgc2l6ZW9mKFJYX1NUQVRVU19CTE9DS190KSArCi0JCQkJCQkgICAgMHg3LCAmcnhfcmluZy0+cFJ4U3RhdHVzUGEpOworCQkJCQkJICAgIHNpemVvZihSWF9TVEFUVVNfQkxPQ0tfdCksCisJCQkJCQkgICAgJnJ4X3JpbmctPnBSeFN0YXR1c1BhKTsKIAlpZiAoIXJ4X3JpbmctPnBSeFN0YXR1c1ZhKSB7CiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCSAgIkNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIFN0YXR1cyBCbG9ja1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQotCS8qIFNhdmUgcGh5c2ljYWwgYWRkcmVzcyAqLwotCXJ4X3JpbmctPlJ4U3RhdHVzUmVhbFBBID0gcnhfcmluZy0+cFJ4U3RhdHVzUGE7Ci0KLQkvKiBBbGlnbiB3cml0ZSBiYWNrIG9uIGFuIDggYnl0ZSBib3VuZGFyeSAqLwotCWV0MTMxeF9hbGlnbl9hbGxvY2F0ZWRfbWVtb3J5KGFkYXB0ZXIsCi0JCQkJICAgICAgJnJ4X3JpbmctPlJ4U3RhdHVzUmVhbFBBLAotCQkJCSAgICAgICZyeF9yaW5nLT5SeFN0YXR1c09mZnNldCwgMHgwNyk7Ci0KLQlyeF9yaW5nLT5wUnhTdGF0dXNWYSA9ICh2b2lkICopKCh1aW50OF90ICopIHJ4X3JpbmctPnBSeFN0YXR1c1ZhICsKLQkJCQkJcnhfcmluZy0+UnhTdGF0dXNPZmZzZXQpOwogCXJ4X3JpbmctPk51bVJmZCA9IE5JQ19ERUZBVUxUX05VTV9SRkQ7CisJcHJpbnRrKCJQUlMgJWx4XG4iLCAodW5zaWduZWQgbG9uZylyeF9yaW5nLT5wUnhTdGF0dXNQYSk7CiAKIAkvKiBSZWN2CiAJICogcGNpX3Bvb2xfY3JlYXRlIGluaXRpYWxpemVzIGEgbG9va2FzaWRlIGxpc3QuIEFmdGVyIHN1Y2Nlc3NmdWwKQEAgLTQwOSw3ICszOTAsNiBAQAogCSAqIGxpc3RzIG5vdy4KIAkgKi8KIAlJTklUX0xJU1RfSEVBRCgmcnhfcmluZy0+UmVjdkxpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZyeF9yaW5nLT5SZWN2UGVuZGluZ0xpc3QpOwogCXJldHVybiAwOwogfQogCkBAIC00MTksMTAgKzM5OSwxMCBAQAogICovCiB2b2lkIGV0MTMxeF9yeF9kbWFfbWVtb3J5X2ZyZWUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQogewotCXVpbnQzMl90IGluZGV4OwotCXVpbnQzMl90IGJ1ZnNpemU7Ci0JdWludDMyX3QgcGt0U3RhdFJpbmdTaXplOwotCVBNUF9SRkQgcE1wUmZkOworCXUzMiBpbmRleDsKKwl1MzIgYnVmc2l6ZTsKKwl1MzIgcGt0U3RhdFJpbmdTaXplOworCVBNUF9SRkQgcmZkOwogCVJYX1JJTkdfdCAqcnhfcmluZzsKIAogCS8qIFNldHVwIHNvbWUgY29udmVuaWVuY2UgcG9pbnRlcnMgKi8KQEAgLTQzMiwxOCArNDEyLDEyIEBACiAJV0FSTl9PTihyeF9yaW5nLT5uUmVhZHlSZWN2ICE9IHJ4X3JpbmctPk51bVJmZCk7CiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnJ4X3JpbmctPlJlY3ZMaXN0KSkgewotCQlwTXBSZmQgPSAoTVBfUkZEICopIGxpc3RfZW50cnkocnhfcmluZy0+UmVjdkxpc3QubmV4dCwKKwkJcmZkID0gKE1QX1JGRCAqKSBsaXN0X2VudHJ5KHJ4X3JpbmctPlJlY3ZMaXN0Lm5leHQsCiAJCQkJCSAgICAgICBNUF9SRkQsIGxpc3Rfbm9kZSk7CiAKLQkJbGlzdF9kZWwoJnBNcFJmZC0+bGlzdF9ub2RlKTsKLQkJZXQxMzF4X3JmZF9yZXNvdXJjZXNfZnJlZShhZGFwdGVyLCBwTXBSZmQpOwotCX0KLQotCXdoaWxlICghbGlzdF9lbXB0eSgmcnhfcmluZy0+UmVjdlBlbmRpbmdMaXN0KSkgewotCQlwTXBSZmQgPSAoTVBfUkZEICopIGxpc3RfZW50cnkocnhfcmluZy0+UmVjdlBlbmRpbmdMaXN0Lm5leHQsCi0JCQkJCSAgICAgICBNUF9SRkQsIGxpc3Rfbm9kZSk7Ci0JCWxpc3RfZGVsKCZwTXBSZmQtPmxpc3Rfbm9kZSk7Ci0JCWV0MTMxeF9yZmRfcmVzb3VyY2VzX2ZyZWUoYWRhcHRlciwgcE1wUmZkKTsKKwkJbGlzdF9kZWwoJnJmZC0+bGlzdF9ub2RlKTsKKwkJcmZkLT5QYWNrZXQgPSBOVUxMOworCQlrbWVtX2NhY2hlX2ZyZWUoYWRhcHRlci0+UnhSaW5nLlJlY3ZMb29rYXNpZGUsIHJmZCk7CiAJfQogCiAJLyogRnJlZSBGcmVlIEJ1ZmZlciBSaW5nIDEgKi8KQEAgLTQ1Miw3ICs0MjYsNyBAQAogCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPAogCQkgICAgIChyeF9yaW5nLT5GYnIxTnVtRW50cmllcyAvIEZCUl9DSFVOS1MpOyBpbmRleCsrKSB7CiAJCQlpZiAocnhfcmluZy0+RmJyMU1lbVZhW2luZGV4XSkgewotCQkJCXVpbnQzMl90IEZicjFBbGlnbjsKKwkJCQl1MzIgRmJyMUFsaWduOwogCiAJCQkJaWYgKHJ4X3JpbmctPkZicjFCdWZmZXJTaXplID4gNDA5NikKIAkJCQkJRmJyMUFsaWduID0gNDA5NjsKQEAgLTUyMywxNCArNDk3LDEwIEBACiAKIAkvKiBGcmVlIFBhY2tldCBTdGF0dXMgUmluZyAqLwogCWlmIChyeF9yaW5nLT5wUFNSaW5nVmEpIHsKLQkJcnhfcmluZy0+cFBTUmluZ1ZhID0gKHZvaWQgKikoKHVpbnQ4X3QgKikgcnhfcmluZy0+cFBTUmluZ1ZhIC0KLQkJCQkJICAgICAgcnhfcmluZy0+cFBTUmluZ09mZnNldCk7Ci0KIAkJcGt0U3RhdFJpbmdTaXplID0KIAkJICAgIHNpemVvZihQS1RfU1RBVF9ERVNDX3QpICogYWRhcHRlci0+UnhSaW5nLlBzck51bUVudHJpZXM7CiAKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LAotCQkJCSAgICBwa3RTdGF0UmluZ1NpemUgKyAweDBmZmYsCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcGt0U3RhdFJpbmdTaXplLAogCQkJCSAgICByeF9yaW5nLT5wUFNSaW5nVmEsIHJ4X3JpbmctPnBQU1JpbmdQYSk7CiAKIAkJcnhfcmluZy0+cFBTUmluZ1ZhID0gTlVMTDsKQEAgLTUzOCwxMSArNTA4LDggQEAKIAogCS8qIEZyZWUgYXJlYSBvZiBtZW1vcnkgZm9yIHRoZSB3cml0ZWJhY2sgb2Ygc3RhdHVzIGluZm9ybWF0aW9uICovCiAJaWYgKHJ4X3JpbmctPnBSeFN0YXR1c1ZhKSB7Ci0JCXJ4X3JpbmctPnBSeFN0YXR1c1ZhID0gKHZvaWQgKikoKHVpbnQ4X3QgKikKLQkJCQlyeF9yaW5nLT5wUnhTdGF0dXNWYSAtIHJ4X3JpbmctPlJ4U3RhdHVzT2Zmc2V0KTsKLQogCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCi0JCQkJc2l6ZW9mKFJYX1NUQVRVU19CTE9DS190KSArIDB4NywKKwkJCQlzaXplb2YoUlhfU1RBVFVTX0JMT0NLX3QpLAogCQkJCXJ4X3JpbmctPnBSeFN0YXR1c1ZhLCByeF9yaW5nLT5wUnhTdGF0dXNQYSk7CiAKIAkJcnhfcmluZy0+cFJ4U3RhdHVzVmEgPSBOVUxMOwpAQCAtNTc4LDQ5ICs1NDUsNDMgQEAKIGludCBldDEzMXhfaW5pdF9yZWN2KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlpbnQgc3RhdHVzID0gLUVOT01FTTsKLQlQTVBfUkZEIHBNcFJmZCA9IE5VTEw7Ci0JdWludDMyX3QgUmZkQ291bnQ7Ci0JdWludDMyX3QgVG90YWxOdW1SZmQgPSAwOworCVBNUF9SRkQgcmZkID0gTlVMTDsKKwl1MzIgcmZkY3Q7CisJdTMyIG51bXJmZCA9IDA7CiAJUlhfUklOR190ICpyeF9yaW5nID0gTlVMTDsKIAogCS8qIFNldHVwIHNvbWUgY29udmVuaWVuY2UgcG9pbnRlcnMgKi8KIAlyeF9yaW5nID0gKFJYX1JJTkdfdCAqKSAmYWRhcHRlci0+UnhSaW5nOwogCiAJLyogU2V0dXAgZWFjaCBSRkQgKi8KLQlmb3IgKFJmZENvdW50ID0gMDsgUmZkQ291bnQgPCByeF9yaW5nLT5OdW1SZmQ7IFJmZENvdW50KyspIHsKLQkJcE1wUmZkID0gKE1QX1JGRCAqKSBrbWVtX2NhY2hlX2FsbG9jKHJ4X3JpbmctPlJlY3ZMb29rYXNpZGUsCisJZm9yIChyZmRjdCA9IDA7IHJmZGN0IDwgcnhfcmluZy0+TnVtUmZkOyByZmRjdCsrKSB7CisJCXJmZCA9IChNUF9SRkQgKikga21lbV9jYWNoZV9hbGxvYyhyeF9yaW5nLT5SZWN2TG9va2FzaWRlLAogCQkJCQkJICAgICBHRlBfQVRPTUlDIHwgR0ZQX0RNQSk7CiAKLQkJaWYgKCFwTXBSZmQpIHsKKwkJaWYgKCFyZmQpIHsKIAkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCQkgICJDb3VsZG4ndCBhbGxvYyBSRkQgb3V0IG9mIGttZW1fY2FjaGVcbiIpOwogCQkJc3RhdHVzID0gLUVOT01FTTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJc3RhdHVzID0gZXQxMzF4X3JmZF9yZXNvdXJjZXNfYWxsb2MoYWRhcHRlciwgcE1wUmZkKTsKLQkJaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkJICAiQ291bGRuJ3QgYWxsb2MgcGFja2V0IGZvciBSRkRcbiIpOwotCQkJa21lbV9jYWNoZV9mcmVlKHJ4X3JpbmctPlJlY3ZMb29rYXNpZGUsIHBNcFJmZCk7Ci0JCQljb250aW51ZTsKLQkJfQorCQlyZmQtPlBhY2tldCA9IE5VTEw7CiAKIAkJLyogQWRkIHRoaXMgUkZEIHRvIHRoZSBSZWN2TGlzdCAqLwotCQlsaXN0X2FkZF90YWlsKCZwTXBSZmQtPmxpc3Rfbm9kZSwgJnJ4X3JpbmctPlJlY3ZMaXN0KTsKKwkJbGlzdF9hZGRfdGFpbCgmcmZkLT5saXN0X25vZGUsICZyeF9yaW5nLT5SZWN2TGlzdCk7CiAKIAkJLyogSW5jcmVtZW50IGJvdGggdGhlIGF2YWlsYWJsZSBSRkQncywgYW5kIHRoZSB0b3RhbCBSRkQncy4gKi8KIAkJcnhfcmluZy0+blJlYWR5UmVjdisrOwotCQlUb3RhbE51bVJmZCsrOworCQludW1yZmQrKzsKIAl9CiAKLQlpZiAoVG90YWxOdW1SZmQgPiBOSUNfTUlOX05VTV9SRkQpCisJaWYgKG51bXJmZCA+IE5JQ19NSU5fTlVNX1JGRCkKIAkJc3RhdHVzID0gMDsKIAotCXJ4X3JpbmctPk51bVJmZCA9IFRvdGFsTnVtUmZkOworCXJ4X3JpbmctPk51bVJmZCA9IG51bXJmZDsKIAogCWlmIChzdGF0dXMgIT0gMCkgewotCQlrbWVtX2NhY2hlX2ZyZWUocnhfcmluZy0+UmVjdkxvb2thc2lkZSwgcE1wUmZkKTsKKwkJa21lbV9jYWNoZV9mcmVlKHJ4X3JpbmctPlJlY3ZMb29rYXNpZGUsIHJmZCk7CiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCSAgIkFsbG9jYXRpb24gcHJvYmxlbXMgaW4gZXQxMzF4X2luaXRfcmVjdlxuIik7CiAJfQpAQCAtNjI4LDQxICs1ODksMTYgQEAKIH0KIAogLyoqCi0gKiBldDEzMXhfcmZkX3Jlc291cmNlc19hbGxvYwotICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqIEBwTXBSZmQ6IHBvaW50ZXIgdG8gYSBSRkQKLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQotICovCi1pbnQgZXQxMzF4X3JmZF9yZXNvdXJjZXNfYWxsb2Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLCBNUF9SRkQgKnBNcFJmZCkKLXsKLQlwTXBSZmQtPlBhY2tldCA9IE5VTEw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBldDEzMXhfcmZkX3Jlc291cmNlc19mcmVlIC0gRnJlZSB0aGUgcGFja2V0IGFsbG9jYXRlZCBmb3IgdGhlIGdpdmVuIFJGRAotICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqIEBwTXBSZmQ6IHBvaW50ZXIgdG8gYSBSRkQKLSAqLwotdm9pZCBldDEzMXhfcmZkX3Jlc291cmNlc19mcmVlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwgTVBfUkZEICpwTXBSZmQpCi17Ci0JcE1wUmZkLT5QYWNrZXQgPSBOVUxMOwotCWttZW1fY2FjaGVfZnJlZShhZGFwdGVyLT5SeFJpbmcuUmVjdkxvb2thc2lkZSwgcE1wUmZkKTsKLX0KLQotLyoqCiAgKiBDb25maWdSeERtYVJlZ3MgLSBTdGFydCBvZiBSeF9ETUEgaW5pdCBzZXF1ZW5jZQogICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBhZGFwdGVyIHN0cnVjdHVyZQogICovCiB2b2lkIENvbmZpZ1J4RG1hUmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewogCXN0cnVjdCBfUlhETUFfdCBfX2lvbWVtICpyeF9kbWEgPSAmZXRkZXYtPnJlZ3MtPnJ4ZG1hOwotCXN0cnVjdCBfcnhfcmluZ190ICpwUnhMb2NhbCA9ICZldGRldi0+UnhSaW5nOworCXN0cnVjdCBfcnhfcmluZ190ICpyeF9sb2NhbCA9ICZldGRldi0+UnhSaW5nOwogCVBGQlJfREVTQ190IGZicl9lbnRyeTsKLQl1aW50MzJfdCBlbnRyeTsKLQlSWERNQV9QU1JfTlVNX0RFU190IHBzcl9udW1fZGVzOworCXUzMiBlbnRyeTsKKwl1MzIgcHNyX251bV9kZXM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIEhhbHQgUlhETUEgdG8gcGVyZm9ybSB0aGUgcmVjb25maWd1cmUuICAqLwpAQCAtNjc1LDM2ICs2MTEsMzUgQEAKIAkgKiBhcmUgZXZlciByZXR1cm5lZCwgbWFrZSBzdXJlIHRoZSBoaWdoIHBhcnQgaXMgcmV0cmlldmVkIGhlcmUKIAkgKiBiZWZvcmUgc3RvcmluZyB0aGUgYWRqdXN0ZWQgYWRkcmVzcy4KIAkgKi8KLQl3cml0ZWwoKHVpbnQzMl90KSAocFJ4TG9jYWwtPlJ4U3RhdHVzUmVhbFBBID4+IDMyKSwKKwl3cml0ZWwoKHUzMikgKCh1NjQpcnhfbG9jYWwtPnBSeFN0YXR1c1BhID4+IDMyKSwKIAkgICAgICAgJnJ4X2RtYS0+ZG1hX3diX2Jhc2VfaGkpOwotCXdyaXRlbCgodWludDMyX3QpIHBSeExvY2FsLT5SeFN0YXR1c1JlYWxQQSwgJnJ4X2RtYS0+ZG1hX3diX2Jhc2VfbG8pOworCXdyaXRlbCgodTMyKSByeF9sb2NhbC0+cFJ4U3RhdHVzUGEsICZyeF9kbWEtPmRtYV93Yl9iYXNlX2xvKTsKIAotCW1lbXNldChwUnhMb2NhbC0+cFJ4U3RhdHVzVmEsIDAsIHNpemVvZihSWF9TVEFUVVNfQkxPQ0tfdCkpOworCW1lbXNldChyeF9sb2NhbC0+cFJ4U3RhdHVzVmEsIDAsIHNpemVvZihSWF9TVEFUVVNfQkxPQ0tfdCkpOwogCiAJLyogU2V0IHRoZSBhZGRyZXNzIGFuZCBwYXJhbWV0ZXJzIG9mIHRoZSBwYWNrZXQgc3RhdHVzIHJpbmcgaW50byB0aGUKIAkgKiAxMzEwJ3MgcmVnaXN0ZXJzCiAJICovCi0Jd3JpdGVsKCh1aW50MzJfdCkgKHBSeExvY2FsLT5wUFNSaW5nUmVhbFBhID4+IDMyKSwKKwl3cml0ZWwoKHUzMikgKCh1NjQpcnhfbG9jYWwtPnBQU1JpbmdQYSA+PiAzMiksCiAJICAgICAgICZyeF9kbWEtPnBzcl9iYXNlX2hpKTsKLQl3cml0ZWwoKHVpbnQzMl90KSBwUnhMb2NhbC0+cFBTUmluZ1JlYWxQYSwgJnJ4X2RtYS0+cHNyX2Jhc2VfbG8pOwotCXdyaXRlbChwUnhMb2NhbC0+UHNyTnVtRW50cmllcyAtIDEsICZyeF9kbWEtPnBzcl9udW1fZGVzLnZhbHVlKTsKLQl3cml0ZWwoMCwgJnJ4X2RtYS0+cHNyX2Z1bGxfb2Zmc2V0LnZhbHVlKTsKKwl3cml0ZWwoKHUzMikgcnhfbG9jYWwtPnBQU1JpbmdQYSwgJnJ4X2RtYS0+cHNyX2Jhc2VfbG8pOworCXdyaXRlbChyeF9sb2NhbC0+UHNyTnVtRW50cmllcyAtIDEsICZyeF9kbWEtPnBzcl9udW1fZGVzKTsKKwl3cml0ZWwoMCwgJnJ4X2RtYS0+cHNyX2Z1bGxfb2Zmc2V0KTsKIAotCXBzcl9udW1fZGVzLnZhbHVlID0gcmVhZGwoJnJ4X2RtYS0+cHNyX251bV9kZXMudmFsdWUpOwotCXdyaXRlbCgocHNyX251bV9kZXMuYml0cy5wc3JfbmRlcyAqIExPX01BUktfUEVSQ0VOVF9GT1JfUFNSKSAvIDEwMCwKLQkgICAgICAgJnJ4X2RtYS0+cHNyX21pbl9kZXMudmFsdWUpOworCXBzcl9udW1fZGVzID0gcmVhZGwoJnJ4X2RtYS0+cHNyX251bV9kZXMpICYgMHhGRkY7CisJd3JpdGVsKChwc3JfbnVtX2RlcyAqIExPX01BUktfUEVSQ0VOVF9GT1JfUFNSKSAvIDEwMCwKKwkgICAgICAgJnJ4X2RtYS0+cHNyX21pbl9kZXMpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5SY3ZMb2NrLCBmbGFncyk7CiAKIAkvKiBUaGVzZSBsb2NhbCB2YXJpYWJsZXMgdHJhY2sgdGhlIFBTUiBpbiB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUgKi8KLQlwUnhMb2NhbC0+bG9jYWxfcHNyX2Z1bGwuYml0cy5wc3JfZnVsbCA9IDA7Ci0JcFJ4TG9jYWwtPmxvY2FsX3Bzcl9mdWxsLmJpdHMucHNyX2Z1bGxfd3JhcCA9IDA7CisJcnhfbG9jYWwtPmxvY2FsX3Bzcl9mdWxsID0gMDsKIAogCS8qIE5vdydzIHRoZSBiZXN0IHRpbWUgdG8gaW5pdGlhbGl6ZSBGQlIxIGNvbnRlbnRzICovCi0JZmJyX2VudHJ5ID0gKFBGQlJfREVTQ190KSBwUnhMb2NhbC0+cEZicjFSaW5nVmE7Ci0JZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgcFJ4TG9jYWwtPkZicjFOdW1FbnRyaWVzOyBlbnRyeSsrKSB7Ci0JCWZicl9lbnRyeS0+YWRkcl9oaSA9IHBSeExvY2FsLT5GYnJbMV0tPlBBSGlnaFtlbnRyeV07Ci0JCWZicl9lbnRyeS0+YWRkcl9sbyA9IHBSeExvY2FsLT5GYnJbMV0tPlBBTG93W2VudHJ5XTsKKwlmYnJfZW50cnkgPSAoUEZCUl9ERVNDX3QpIHJ4X2xvY2FsLT5wRmJyMVJpbmdWYTsKKwlmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCByeF9sb2NhbC0+RmJyMU51bUVudHJpZXM7IGVudHJ5KyspIHsKKwkJZmJyX2VudHJ5LT5hZGRyX2hpID0gcnhfbG9jYWwtPkZiclsxXS0+UEFIaWdoW2VudHJ5XTsKKwkJZmJyX2VudHJ5LT5hZGRyX2xvID0gcnhfbG9jYWwtPkZiclsxXS0+UEFMb3dbZW50cnldOwogCQlmYnJfZW50cnktPndvcmQyLmJpdHMuYmkgPSBlbnRyeTsKIAkJZmJyX2VudHJ5Kys7CiAJfQpAQCAtNzEyLDM5ICs2NDcsMzkgQEAKIAkvKiBTZXQgdGhlIGFkZHJlc3MgYW5kIHBhcmFtZXRlcnMgb2YgRnJlZSBidWZmZXIgcmluZyAxIChhbmQgMCBpZgogCSAqIHJlcXVpcmVkKSBpbnRvIHRoZSAxMzEwJ3MgcmVnaXN0ZXJzCiAJICovCi0Jd3JpdGVsKCh1aW50MzJfdCkgKHBSeExvY2FsLT5GYnIxUmVhbHBhID4+IDMyKSwgJnJ4X2RtYS0+ZmJyMV9iYXNlX2hpKTsKLQl3cml0ZWwoKHVpbnQzMl90KSBwUnhMb2NhbC0+RmJyMVJlYWxwYSwgJnJ4X2RtYS0+ZmJyMV9iYXNlX2xvKTsKLQl3cml0ZWwocFJ4TG9jYWwtPkZicjFOdW1FbnRyaWVzIC0gMSwgJnJ4X2RtYS0+ZmJyMV9udW1fZGVzLnZhbHVlKTsKKwl3cml0ZWwoKHUzMikgKHJ4X2xvY2FsLT5GYnIxUmVhbHBhID4+IDMyKSwgJnJ4X2RtYS0+ZmJyMV9iYXNlX2hpKTsKKwl3cml0ZWwoKHUzMikgcnhfbG9jYWwtPkZicjFSZWFscGEsICZyeF9kbWEtPmZicjFfYmFzZV9sbyk7CisJd3JpdGVsKHJ4X2xvY2FsLT5GYnIxTnVtRW50cmllcyAtIDEsICZyeF9kbWEtPmZicjFfbnVtX2Rlcyk7CiAJd3JpdGVsKEVUX0RNQTEwX1dSQVAsICZyeF9kbWEtPmZicjFfZnVsbF9vZmZzZXQpOwogCiAJLyogVGhpcyB2YXJpYWJsZSB0cmFja3MgdGhlIGZyZWUgYnVmZmVyIHJpbmcgMSBmdWxsIHBvc2l0aW9uLCBzbyBpdAogCSAqIGhhcyB0byBtYXRjaCB0aGUgYWJvdmUuCiAJICovCi0JcFJ4TG9jYWwtPmxvY2FsX0ZicjFfZnVsbCA9IEVUX0RNQTEwX1dSQVA7Ci0Jd3JpdGVsKCgocFJ4TG9jYWwtPkZicjFOdW1FbnRyaWVzICogTE9fTUFSS19QRVJDRU5UX0ZPUl9SWCkgLyAxMDApIC0gMSwKLQkgICAgICAgJnJ4X2RtYS0+ZmJyMV9taW5fZGVzLnZhbHVlKTsKKwlyeF9sb2NhbC0+bG9jYWxfRmJyMV9mdWxsID0gRVRfRE1BMTBfV1JBUDsKKwl3cml0ZWwoKChyeF9sb2NhbC0+RmJyMU51bUVudHJpZXMgKiBMT19NQVJLX1BFUkNFTlRfRk9SX1JYKSAvIDEwMCkgLSAxLAorCSAgICAgICAmcnhfZG1hLT5mYnIxX21pbl9kZXMpOwogCiAjaWZkZWYgVVNFX0ZCUjAKIAkvKiBOb3cncyB0aGUgYmVzdCB0aW1lIHRvIGluaXRpYWxpemUgRkJSMCBjb250ZW50cyAqLwotCWZicl9lbnRyeSA9IChQRkJSX0RFU0NfdCkgcFJ4TG9jYWwtPnBGYnIwUmluZ1ZhOwotCWZvciAoZW50cnkgPSAwOyBlbnRyeSA8IHBSeExvY2FsLT5GYnIwTnVtRW50cmllczsgZW50cnkrKykgewotCQlmYnJfZW50cnktPmFkZHJfaGkgPSBwUnhMb2NhbC0+RmJyWzBdLT5QQUhpZ2hbZW50cnldOwotCQlmYnJfZW50cnktPmFkZHJfbG8gPSBwUnhMb2NhbC0+RmJyWzBdLT5QQUxvd1tlbnRyeV07CisJZmJyX2VudHJ5ID0gKFBGQlJfREVTQ190KSByeF9sb2NhbC0+cEZicjBSaW5nVmE7CisJZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgcnhfbG9jYWwtPkZicjBOdW1FbnRyaWVzOyBlbnRyeSsrKSB7CisJCWZicl9lbnRyeS0+YWRkcl9oaSA9IHJ4X2xvY2FsLT5GYnJbMF0tPlBBSGlnaFtlbnRyeV07CisJCWZicl9lbnRyeS0+YWRkcl9sbyA9IHJ4X2xvY2FsLT5GYnJbMF0tPlBBTG93W2VudHJ5XTsKIAkJZmJyX2VudHJ5LT53b3JkMi5iaXRzLmJpID0gZW50cnk7CiAJCWZicl9lbnRyeSsrOwogCX0KIAotCXdyaXRlbCgodWludDMyX3QpIChwUnhMb2NhbC0+RmJyMFJlYWxwYSA+PiAzMiksICZyeF9kbWEtPmZicjBfYmFzZV9oaSk7Ci0Jd3JpdGVsKCh1aW50MzJfdCkgcFJ4TG9jYWwtPkZicjBSZWFscGEsICZyeF9kbWEtPmZicjBfYmFzZV9sbyk7Ci0Jd3JpdGVsKHBSeExvY2FsLT5GYnIwTnVtRW50cmllcyAtIDEsICZyeF9kbWEtPmZicjBfbnVtX2Rlcy52YWx1ZSk7CisJd3JpdGVsKCh1MzIpIChyeF9sb2NhbC0+RmJyMFJlYWxwYSA+PiAzMiksICZyeF9kbWEtPmZicjBfYmFzZV9oaSk7CisJd3JpdGVsKCh1MzIpIHJ4X2xvY2FsLT5GYnIwUmVhbHBhLCAmcnhfZG1hLT5mYnIwX2Jhc2VfbG8pOworCXdyaXRlbChyeF9sb2NhbC0+RmJyME51bUVudHJpZXMgLSAxLCAmcnhfZG1hLT5mYnIwX251bV9kZXMpOwogCXdyaXRlbChFVF9ETUExMF9XUkFQLCAmcnhfZG1hLT5mYnIwX2Z1bGxfb2Zmc2V0KTsKIAogCS8qIFRoaXMgdmFyaWFibGUgdHJhY2tzIHRoZSBmcmVlIGJ1ZmZlciByaW5nIDAgZnVsbCBwb3NpdGlvbiwgc28gaXQKIAkgKiBoYXMgdG8gbWF0Y2ggdGhlIGFib3ZlLgogCSAqLwotCXBSeExvY2FsLT5sb2NhbF9GYnIwX2Z1bGwgPSBFVF9ETUExMF9XUkFQOwotCXdyaXRlbCgoKHBSeExvY2FsLT5GYnIwTnVtRW50cmllcyAqIExPX01BUktfUEVSQ0VOVF9GT1JfUlgpIC8gMTAwKSAtIDEsCi0JICAgICAgICZyeF9kbWEtPmZicjBfbWluX2Rlcy52YWx1ZSk7CisJcnhfbG9jYWwtPmxvY2FsX0ZicjBfZnVsbCA9IEVUX0RNQTEwX1dSQVA7CisJd3JpdGVsKCgocnhfbG9jYWwtPkZicjBOdW1FbnRyaWVzICogTE9fTUFSS19QRVJDRU5UX0ZPUl9SWCkgLyAxMDApIC0gMSwKKwkgICAgICAgJnJ4X2RtYS0+ZmJyMF9taW5fZGVzKTsKICNlbmRpZgogCiAJLyogUHJvZ3JhbSB0aGUgbnVtYmVyIG9mIHBhY2tldHMgd2Ugd2lsbCByZWNlaXZlIGJlZm9yZSBnZW5lcmF0aW5nIGFuCkBAIC03NTIsMTQgKzY4NywxNCBAQAogCSAqIEZvciB2ZXJzaW9uIEIgc2lsaWNvbiwgdGhpcyB2YWx1ZSBnZXRzIHVwZGF0ZWQgb25jZSBhdXRvbmVnIGlzCiAJICpjb21wbGV0ZS4KIAkgKi8KLQl3cml0ZWwoUEFSTV9SWF9OVU1fQlVGU19ERUYsICZyeF9kbWEtPm51bV9wa3RfZG9uZS52YWx1ZSk7CisJd3JpdGVsKFBBUk1fUlhfTlVNX0JVRlNfREVGLCAmcnhfZG1hLT5udW1fcGt0X2RvbmUpOwogCiAJLyogVGhlICJ0aW1lX2RvbmUiIGlzIG5vdCB3b3JraW5nIGNvcnJlY3RseSB0byBjb2FsZXNjZSBpbnRlcnJ1cHRzCiAJICogYWZ0ZXIgYSBnaXZlbiB0aW1lIHBlcmlvZCwgYnV0IHJhdGhlciBpcyBnaXZpbmcgdXMgYW4gaW50ZXJydXB0CiAJICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlIGhhdmUgcmVjZWl2ZWQgcGFja2V0cy4KIAkgKiBUaGlzIHZhbHVlIGdldHMgdXBkYXRlZCBvbmNlIGF1dG9uZWcgaXMgY29tcGxldGUuCiAJICovCi0Jd3JpdGVsKFBBUk1fUlhfVElNRV9JTlRfREVGLCAmcnhfZG1hLT5tYXhfcGt0X3RpbWUudmFsdWUpOworCXdyaXRlbChQQVJNX1JYX1RJTUVfSU5UX0RFRiwgJnJ4X2RtYS0+bWF4X3BrdF90aW1lKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5SY3ZMb2NrLCBmbGFncyk7CiB9CkBAIC03NzUsOCArNzEwLDggQEAKIAkgKi8KIAlpZiAoKGV0ZGV2LT5saW5rc3BlZWQgPT0gVFJVRVBIWV9TUEVFRF8xMDBNQlBTKSB8fAogCSAgICAoZXRkZXYtPmxpbmtzcGVlZCA9PSBUUlVFUEhZX1NQRUVEXzEwTUJQUykpIHsKLQkJd3JpdGVsKDAsICZldGRldi0+cmVncy0+cnhkbWEubWF4X3BrdF90aW1lLnZhbHVlKTsKLQkJd3JpdGVsKDEsICZldGRldi0+cmVncy0+cnhkbWEubnVtX3BrdF9kb25lLnZhbHVlKTsKKwkJd3JpdGVsKDAsICZldGRldi0+cmVncy0+cnhkbWEubWF4X3BrdF90aW1lKTsKKwkJd3JpdGVsKDEsICZldGRldi0+cmVncy0+cnhkbWEubnVtX3BrdF9kb25lKTsKIAl9CiB9CiAKQEAgLTgwNyw0MCArNzQyLDM1IEBACiAgKi8KIHZvaWQgZXQxMzF4X3J4X2RtYV9lbmFibGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKLQlpZiAoZXRkZXYtPlJlZ2lzdHJ5UGh5TG9vcGJrKQotCQkvKiBSeERNQSBpcyBkaXNhYmxlZCBmb3IgbG9vcGJhY2sgb3BlcmF0aW9uLiAqLwotCQl3cml0ZWwoMHgxLCAmZXRkZXYtPnJlZ3MtPnJ4ZG1hLmNzci52YWx1ZSk7Ci0JZWxzZSB7CiAJLyogU2V0dXAgdGhlIHJlY2VpdmUgZG1hIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgZm9yIG5vcm1hbCBvcGVyYXRpb24gKi8KLQkJUlhETUFfQ1NSX3QgY3NyID0geyAwIH07CisJUlhETUFfQ1NSX3QgY3NyID0geyAwIH07CiAKLQkJY3NyLmJpdHMuZmJyMV9lbmFibGUgPSAxOwotCQlpZiAoZXRkZXYtPlJ4UmluZy5GYnIxQnVmZmVyU2l6ZSA9PSA0MDk2KQotCQkJY3NyLmJpdHMuZmJyMV9zaXplID0gMTsKLQkJZWxzZSBpZiAoZXRkZXYtPlJ4UmluZy5GYnIxQnVmZmVyU2l6ZSA9PSA4MTkyKQotCQkJY3NyLmJpdHMuZmJyMV9zaXplID0gMjsKLQkJZWxzZSBpZiAoZXRkZXYtPlJ4UmluZy5GYnIxQnVmZmVyU2l6ZSA9PSAxNjM4NCkKLQkJCWNzci5iaXRzLmZicjFfc2l6ZSA9IDM7CisJY3NyLmJpdHMuZmJyMV9lbmFibGUgPSAxOworCWlmIChldGRldi0+UnhSaW5nLkZicjFCdWZmZXJTaXplID09IDQwOTYpCisJCWNzci5iaXRzLmZicjFfc2l6ZSA9IDE7CisJZWxzZSBpZiAoZXRkZXYtPlJ4UmluZy5GYnIxQnVmZmVyU2l6ZSA9PSA4MTkyKQorCQljc3IuYml0cy5mYnIxX3NpemUgPSAyOworCWVsc2UgaWYgKGV0ZGV2LT5SeFJpbmcuRmJyMUJ1ZmZlclNpemUgPT0gMTYzODQpCisJCWNzci5iaXRzLmZicjFfc2l6ZSA9IDM7CiAjaWZkZWYgVVNFX0ZCUjAKLQkJY3NyLmJpdHMuZmJyMF9lbmFibGUgPSAxOwotCQlpZiAoZXRkZXYtPlJ4UmluZy5GYnIwQnVmZmVyU2l6ZSA9PSAyNTYpCi0JCQljc3IuYml0cy5mYnIwX3NpemUgPSAxOwotCQllbHNlIGlmIChldGRldi0+UnhSaW5nLkZicjBCdWZmZXJTaXplID09IDUxMikKLQkJCWNzci5iaXRzLmZicjBfc2l6ZSA9IDI7Ci0JCWVsc2UgaWYgKGV0ZGV2LT5SeFJpbmcuRmJyMEJ1ZmZlclNpemUgPT0gMTAyNCkKLQkJCWNzci5iaXRzLmZicjBfc2l6ZSA9IDM7CisJY3NyLmJpdHMuZmJyMF9lbmFibGUgPSAxOworCWlmIChldGRldi0+UnhSaW5nLkZicjBCdWZmZXJTaXplID09IDI1NikKKwkJY3NyLmJpdHMuZmJyMF9zaXplID0gMTsKKwllbHNlIGlmIChldGRldi0+UnhSaW5nLkZicjBCdWZmZXJTaXplID09IDUxMikKKwkJY3NyLmJpdHMuZmJyMF9zaXplID0gMjsKKwllbHNlIGlmIChldGRldi0+UnhSaW5nLkZicjBCdWZmZXJTaXplID09IDEwMjQpCisJCWNzci5iaXRzLmZicjBfc2l6ZSA9IDM7CiAjZW5kaWYKLQkJd3JpdGVsKGNzci52YWx1ZSwgJmV0ZGV2LT5yZWdzLT5yeGRtYS5jc3IudmFsdWUpOworCXdyaXRlbChjc3IudmFsdWUsICZldGRldi0+cmVncy0+cnhkbWEuY3NyLnZhbHVlKTsKIAorCWNzci52YWx1ZSA9IHJlYWRsKCZldGRldi0+cmVncy0+cnhkbWEuY3NyLnZhbHVlKTsKKwlpZiAoY3NyLmJpdHMuaGFsdF9zdGF0dXMgIT0gMCkgeworCQl1ZGVsYXkoNSk7CiAJCWNzci52YWx1ZSA9IHJlYWRsKCZldGRldi0+cmVncy0+cnhkbWEuY3NyLnZhbHVlKTsKIAkJaWYgKGNzci5iaXRzLmhhbHRfc3RhdHVzICE9IDApIHsKLQkJCXVkZWxheSg1KTsKLQkJCWNzci52YWx1ZSA9IHJlYWRsKCZldGRldi0+cmVncy0+cnhkbWEuY3NyLnZhbHVlKTsKLQkJCWlmIChjc3IuYml0cy5oYWx0X3N0YXR1cyAhPSAwKSB7Ci0JCQkJZGV2X2VycigmZXRkZXYtPnBkZXYtPmRldiwKLQkJCQkJIlJYIERtYSBmYWlsZWQgdG8gZXhpdCBoYWx0IHN0YXRlLiAgQ1NSIDB4JTA4eFxuIiwKLQkJCQkJY3NyLnZhbHVlKTsKLQkJCX0KKwkJCWRldl9lcnIoJmV0ZGV2LT5wZGV2LT5kZXYsCisJCQkgICAgIlJYIERtYSBmYWlsZWQgdG8gZXhpdCBoYWx0IHN0YXRlLiAgQ1NSIDB4JTA4eFxuIiwKKwkJCQljc3IudmFsdWUpOwogCQl9CiAJfQogfQpAQCAtODQ5LDcgKzc3OSw3IEBACiAgKiBuaWNfcnhfcGt0cyAtIENoZWNrcyB0aGUgaGFyZHdhcmUgZm9yIGF2YWlsYWJsZSBwYWNrZXRzCiAgKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKICAqCi0gKiBSZXR1cm5zIHBNcFJmZCwgYSBwb2ludGVyIHRvIG91ciBNUFJGRC4KKyAqIFJldHVybnMgcmZkLCBhIHBvaW50ZXIgdG8gb3VyIE1QUkZELgogICoKICAqIENoZWNrcyB0aGUgaGFyZHdhcmUgZm9yIGF2YWlsYWJsZSBwYWNrZXRzLCB1c2luZyBjb21wbGV0aW9uIHJpbmcKICAqIElmIHBhY2tldHMgYXJlIGF2YWlsYWJsZSwgaXQgZ2V0cyBhbiBSRkQgZnJvbSB0aGUgUmVjdkxpc3QsIGF0dGFjaGVzCkBAIC04NTgsMTE5ICs3ODgsMTIyIEBACiAgKi8KIFBNUF9SRkQgbmljX3J4X3BrdHMoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKLQlzdHJ1Y3QgX3J4X3JpbmdfdCAqcFJ4TG9jYWwgPSAmZXRkZXYtPlJ4UmluZzsKLQlQUlhfU1RBVFVTX0JMT0NLX3QgcFJ4U3RhdHVzQmxvY2s7Ci0JUFBLVF9TVEFUX0RFU0NfdCBwUFNSRW50cnk7Ci0JUE1QX1JGRCBwTXBSZmQ7Ci0JdWludDMyX3QgbkluZGV4OwotCXVpbnQ4X3QgKnBCdWZWYTsKKwlzdHJ1Y3QgX3J4X3JpbmdfdCAqcnhfbG9jYWwgPSAmZXRkZXYtPlJ4UmluZzsKKwlQUlhfU1RBVFVTX0JMT0NLX3Qgc3RhdHVzOworCVBQS1RfU1RBVF9ERVNDX3QgcHNyOworCVBNUF9SRkQgcmZkOworCXUzMiBpOworCXVpbnQ4X3QgKmJ1ZjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7Ci0JdWludDhfdCByaW5nSW5kZXg7Ci0JdWludDE2X3QgYnVmZmVySW5kZXg7Ci0JdWludDMyX3QgbG9jYWxMZW47CisJdWludDhfdCByaW5kZXg7CisJdWludDE2X3QgYmluZGV4OworCXUzMiBsZW47CiAJUEtUX1NUQVRfREVTQ19XT1JEMF90IFdvcmQwOwogCiAJLyogUlggU3RhdHVzIGJsb2NrIGlzIHdyaXR0ZW4gYnkgdGhlIERNQSBlbmdpbmUgcHJpb3IgdG8gZXZlcnkKIAkgKiBpbnRlcnJ1cHQuIEl0IGNvbnRhaW5zIHRoZSBuZXh0IHRvIGJlIHVzZWQgZW50cnkgaW4gdGhlIFBhY2tldAogCSAqIFN0YXR1cyBSaW5nLCBhbmQgYWxzbyB0aGUgdHdvIEZyZWUgQnVmZmVyIHJpbmdzLgogCSAqLwotCXBSeFN0YXR1c0Jsb2NrID0gKFBSWF9TVEFUVVNfQkxPQ0tfdCkgcFJ4TG9jYWwtPnBSeFN0YXR1c1ZhOworCXN0YXR1cyA9IChQUlhfU1RBVFVTX0JMT0NLX3QpIHJ4X2xvY2FsLT5wUnhTdGF0dXNWYTsKIAotCWlmIChwUnhTdGF0dXNCbG9jay0+V29yZDEuYml0cy5QU1JvZmZzZXQgPT0KLQkJCXBSeExvY2FsLT5sb2NhbF9wc3JfZnVsbC5iaXRzLnBzcl9mdWxsICYmCi0JCQlwUnhTdGF0dXNCbG9jay0+V29yZDEuYml0cy5QU1J3cmFwID09Ci0JCQlwUnhMb2NhbC0+bG9jYWxfcHNyX2Z1bGwuYml0cy5wc3JfZnVsbF93cmFwKSB7CisJLyogRklYTUU6IHRpZHkgbGF0ZXIgd2hlbiBjb252ZXJzaW9ucyBjb21wbGV0ZSAqLworCWlmIChzdGF0dXMtPldvcmQxLmJpdHMuUFNSb2Zmc2V0ID09CisJCQkocnhfbG9jYWwtPmxvY2FsX3Bzcl9mdWxsICYgMHhGRkYpICYmCisJCQlzdGF0dXMtPldvcmQxLmJpdHMuUFNSd3JhcCA9PQorCQkJKChyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwgPj4gMTIpICYgMSkpIHsKIAkJLyogTG9va3MgbGlrZSB0aGlzIHJpbmcgaXMgbm90IHVwZGF0ZWQgeWV0ICovCiAJCXJldHVybiBOVUxMOwogCX0KIAogCS8qIFRoZSBwYWNrZXQgc3RhdHVzIHJpbmcgaW5kaWNhdGVzIHRoYXQgZGF0YSBpcyBhdmFpbGFibGUuICovCi0JcFBTUkVudHJ5ID0gKFBQS1RfU1RBVF9ERVNDX3QpIChwUnhMb2NhbC0+cFBTUmluZ1ZhKSArCi0JCQlwUnhMb2NhbC0+bG9jYWxfcHNyX2Z1bGwuYml0cy5wc3JfZnVsbDsKKwlwc3IgPSAoUFBLVF9TVEFUX0RFU0NfdCkgKHJ4X2xvY2FsLT5wUFNSaW5nVmEpICsKKwkJCShyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwgJiAweEZGRik7CiAKIAkvKiBHcmFiIGFueSBpbmZvcm1hdGlvbiB0aGF0IGlzIHJlcXVpcmVkIG9uY2UgdGhlIFBTUiBpcwogCSAqIGFkdmFuY2VkLCBzaW5jZSB3ZSBjYW4gbm8gbG9uZ2VyIHJlbHkgb24gdGhlIG1lbW9yeSBiZWluZwogCSAqIGFjY3VyYXRlCiAJICovCi0JbG9jYWxMZW4gPSBwUFNSRW50cnktPndvcmQxLmJpdHMubGVuZ3RoOwotCXJpbmdJbmRleCA9ICh1aW50OF90KSBwUFNSRW50cnktPndvcmQxLmJpdHMucmk7Ci0JYnVmZmVySW5kZXggPSAodWludDE2X3QpIHBQU1JFbnRyeS0+d29yZDEuYml0cy5iaTsKLQlXb3JkMCA9IHBQU1JFbnRyeS0+d29yZDA7CisJbGVuID0gcHNyLT53b3JkMS5iaXRzLmxlbmd0aDsKKwlyaW5kZXggPSAodWludDhfdCkgcHNyLT53b3JkMS5iaXRzLnJpOworCWJpbmRleCA9ICh1aW50MTZfdCkgcHNyLT53b3JkMS5iaXRzLmJpOworCVdvcmQwID0gcHNyLT53b3JkMDsKIAogCS8qIEluZGljYXRlIHRoYXQgd2UgaGF2ZSB1c2VkIHRoaXMgUFNSIGVudHJ5LiAqLwotCWlmICgrK3BSeExvY2FsLT5sb2NhbF9wc3JfZnVsbC5iaXRzLnBzcl9mdWxsID4KLQkgICAgcFJ4TG9jYWwtPlBzck51bUVudHJpZXMgLSAxKSB7Ci0JCXBSeExvY2FsLT5sb2NhbF9wc3JfZnVsbC5iaXRzLnBzcl9mdWxsID0gMDsKLQkJcFJ4TG9jYWwtPmxvY2FsX3Bzcl9mdWxsLmJpdHMucHNyX2Z1bGxfd3JhcCBePSAxOworCS8qIEZJWE1FIHdyYXAgMTIgKi8KKwlyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwgPSAocnhfbG9jYWwtPmxvY2FsX3Bzcl9mdWxsICsgMSkgJiAweEZGRjsKKwlpZiAocnhfbG9jYWwtPmxvY2FsX3Bzcl9mdWxsICA+IHJ4X2xvY2FsLT5Qc3JOdW1FbnRyaWVzIC0gMSkgeworCQkvKiBDbGVhciBwc3IgZnVsbCBhbmQgdG9nZ2xlIHRoZSB3cmFwIGJpdCAqLworCQlyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwgJj0gIDB4RkZGOworCQlyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwgXj0gMHgxMDAwOwogCX0KIAotCXdyaXRlbChwUnhMb2NhbC0+bG9jYWxfcHNyX2Z1bGwudmFsdWUsCi0JICAgICAgICZldGRldi0+cmVncy0+cnhkbWEucHNyX2Z1bGxfb2Zmc2V0LnZhbHVlKTsKKwl3cml0ZWwocnhfbG9jYWwtPmxvY2FsX3Bzcl9mdWxsLAorCSAgICAgICAmZXRkZXYtPnJlZ3MtPnJ4ZG1hLnBzcl9mdWxsX29mZnNldCk7CiAKICNpZm5kZWYgVVNFX0ZCUjAKLQlpZiAocmluZ0luZGV4ICE9IDEpIHsKKwlpZiAocmluZGV4ICE9IDEpIHsKIAkJcmV0dXJuIE5VTEw7CiAJfQogI2VuZGlmCiAKICNpZmRlZiBVU0VfRkJSMAotCWlmIChyaW5nSW5kZXggPiAxIHx8Ci0JCShyaW5nSW5kZXggPT0gMCAmJgotCQlidWZmZXJJbmRleCA+IHBSeExvY2FsLT5GYnIwTnVtRW50cmllcyAtIDEpIHx8Ci0JCShyaW5nSW5kZXggPT0gMSAmJgotCQlidWZmZXJJbmRleCA+IHBSeExvY2FsLT5GYnIxTnVtRW50cmllcyAtIDEpKQorCWlmIChyaW5kZXggPiAxIHx8CisJCShyaW5kZXggPT0gMCAmJgorCQliaW5kZXggPiByeF9sb2NhbC0+RmJyME51bUVudHJpZXMgLSAxKSB8fAorCQkocmluZGV4ID09IDEgJiYKKwkJYmluZGV4ID4gcnhfbG9jYWwtPkZicjFOdW1FbnRyaWVzIC0gMSkpCiAjZWxzZQotCWlmIChyaW5nSW5kZXggIT0gMSB8fAotCQlidWZmZXJJbmRleCA+IHBSeExvY2FsLT5GYnIxTnVtRW50cmllcyAtIDEpCisJaWYgKHJpbmRleCAhPSAxIHx8CisJCWJpbmRleCA+IHJ4X2xvY2FsLT5GYnIxTnVtRW50cmllcyAtIDEpCiAjZW5kaWYKIAl7CiAJCS8qIElsbGVnYWwgYnVmZmVyIG9yIHJpbmcgaW5kZXggY2Fubm90IGJlIHVzZWQgYnkgUy9XKi8KIAkJZGV2X2VycigmZXRkZXYtPnBkZXYtPmRldiwKIAkJCSAgIk5JQ1J4UGt0cyBQU1IgRW50cnkgJWQgaW5kaWNhdGVzICIKIAkJCSAgImxlbmd0aCBvZiAlZCBhbmQvb3IgYmFkIGJpKCVkKVxuIiwKLQkJCSAgcFJ4TG9jYWwtPmxvY2FsX3Bzcl9mdWxsLmJpdHMucHNyX2Z1bGwsCi0JCQkgIGxvY2FsTGVuLCBidWZmZXJJbmRleCk7CisJCQkgIHJ4X2xvY2FsLT5sb2NhbF9wc3JfZnVsbCAmIDB4RkZGLAorCQkJICBsZW4sIGJpbmRleCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCS8qIEdldCBhbmQgZmlsbCB0aGUgUkZELiAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZldGRldi0+UmN2TG9jaywgZmxhZ3MpOwogCi0JcE1wUmZkID0gTlVMTDsKLQllbGVtZW50ID0gcFJ4TG9jYWwtPlJlY3ZMaXN0Lm5leHQ7Ci0JcE1wUmZkID0gKFBNUF9SRkQpIGxpc3RfZW50cnkoZWxlbWVudCwgTVBfUkZELCBsaXN0X25vZGUpOworCXJmZCA9IE5VTEw7CisJZWxlbWVudCA9IHJ4X2xvY2FsLT5SZWN2TGlzdC5uZXh0OworCXJmZCA9IChQTVBfUkZEKSBsaXN0X2VudHJ5KGVsZW1lbnQsIE1QX1JGRCwgbGlzdF9ub2RlKTsKIAotCWlmIChwTXBSZmQgPT0gTlVMTCkgeworCWlmIChyZmQgPT0gTlVMTCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+UmN2TG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlsaXN0X2RlbCgmcE1wUmZkLT5saXN0X25vZGUpOwotCXBSeExvY2FsLT5uUmVhZHlSZWN2LS07CisJbGlzdF9kZWwoJnJmZC0+bGlzdF9ub2RlKTsKKwlyeF9sb2NhbC0+blJlYWR5UmVjdi0tOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPlJjdkxvY2ssIGZsYWdzKTsKIAotCXBNcFJmZC0+YnVmZmVyaW5kZXggPSBidWZmZXJJbmRleDsKLQlwTXBSZmQtPnJpbmdpbmRleCA9IHJpbmdJbmRleDsKKwlyZmQtPmJ1ZmZlcmluZGV4ID0gYmluZGV4OworCXJmZC0+cmluZ2luZGV4ID0gcmluZGV4OwogCiAJLyogSW4gVjEgc2lsaWNvbiwgdGhlcmUgaXMgYSBidWcgd2hpY2ggc2NyZXdzIHVwIGZpbHRlcmluZyBvZgogCSAqIHJ1bnQgcGFja2V0cy4gIFRoZXJlZm9yZSBydW50IHBhY2tldCBmaWx0ZXJpbmcgaXMgZGlzYWJsZWQKIAkgKiBpbiB0aGUgTUFDIGFuZCB0aGUgcGFja2V0cyBhcmUgZHJvcHBlZCBoZXJlLiAgVGhleSBhcmUKIAkgKiBhbHNvIGNvdW50ZWQgaGVyZS4KIAkgKi8KLQlpZiAobG9jYWxMZW4gPCAoTklDX01JTl9QQUNLRVRfU0laRSArIDQpKSB7CisJaWYgKGxlbiA8IChOSUNfTUlOX1BBQ0tFVF9TSVpFICsgNCkpIHsKIAkJZXRkZXYtPlN0YXRzLm90aGVyX2Vycm9ycysrOwotCQlsb2NhbExlbiA9IDA7CisJCWxlbiA9IDA7CiAJfQogCi0JaWYgKGxvY2FsTGVuKSB7CisJaWYgKGxlbikgewogCQlpZiAoZXRkZXYtPlJlcGxpY2FQaHlMb29wYmsgPT0gMSkgewotCQkJcEJ1ZlZhID0gcFJ4TG9jYWwtPkZicltyaW5nSW5kZXhdLT5WYVtidWZmZXJJbmRleF07CisJCQlidWYgPSByeF9sb2NhbC0+RmJyW3JpbmRleF0tPlZhW2JpbmRleF07CiAKLQkJCWlmIChtZW1jbXAoJnBCdWZWYVs2XSwgJmV0ZGV2LT5DdXJyZW50QWRkcmVzc1swXSwKKwkJCWlmIChtZW1jbXAoJmJ1Zls2XSwgJmV0ZGV2LT5DdXJyZW50QWRkcmVzc1swXSwKIAkJCQkgICBFVEhfQUxFTikgPT0gMCkgewotCQkJCWlmIChtZW1jbXAoJnBCdWZWYVs0Ml0sICJSZXBsaWNhIHBhY2tldCIsCisJCQkJaWYgKG1lbWNtcCgmYnVmWzQyXSwgIlJlcGxpY2EgcGFja2V0IiwKIAkJCQkJICAgRVRIX0hMRU4pKSB7CiAJCQkJCWV0ZGV2LT5SZXBsaWNhUGh5TG9vcGJrUEYgPSAxOwogCQkJCX0KQEAgLTk5MCwyOCArOTIzLDI4IEBACiAJCQlpZiAoKGV0ZGV2LT5QYWNrZXRGaWx0ZXIgJiBFVDEzMVhfUEFDS0VUX1RZUEVfTVVMVElDQVNUKQogCQkJICAgICYmICEoZXRkZXYtPlBhY2tldEZpbHRlciAmIEVUMTMxWF9QQUNLRVRfVFlQRV9QUk9NSVNDVU9VUykKIAkJCSAgICAmJiAhKGV0ZGV2LT5QYWNrZXRGaWx0ZXIgJiBFVDEzMVhfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVCkpIHsKLQkJCQlwQnVmVmEgPSBwUnhMb2NhbC0+RmJyW3JpbmdJbmRleF0tPgotCQkJCQkJVmFbYnVmZmVySW5kZXhdOworCQkJCWJ1ZiA9IHJ4X2xvY2FsLT5GYnJbcmluZGV4XS0+CisJCQkJCQlWYVtiaW5kZXhdOwogCiAJCQkJLyogTG9vcCB0aHJvdWdoIG91ciBsaXN0IHRvIHNlZSBpZiB0aGUKIAkJCQkgKiBkZXN0aW5hdGlvbiBhZGRyZXNzIG9mIHRoaXMgcGFja2V0CiAJCQkJICogbWF0Y2hlcyBvbmUgaW4gb3VyIGxpc3QuCiAJCQkJICovCi0JCQkJZm9yIChuSW5kZXggPSAwOwotCQkJCSAgICAgbkluZGV4IDwgZXRkZXYtPk1DQWRkcmVzc0NvdW50OwotCQkJCSAgICAgbkluZGV4KyspIHsKLQkJCQkJaWYgKHBCdWZWYVswXSA9PQotCQkJCQkgICAgZXRkZXYtPk1DTGlzdFtuSW5kZXhdWzBdCi0JCQkJCSAgICAmJiBwQnVmVmFbMV0gPT0KLQkJCQkJICAgIGV0ZGV2LT5NQ0xpc3RbbkluZGV4XVsxXQotCQkJCQkgICAgJiYgcEJ1ZlZhWzJdID09Ci0JCQkJCSAgICBldGRldi0+TUNMaXN0W25JbmRleF1bMl0KLQkJCQkJICAgICYmIHBCdWZWYVszXSA9PQotCQkJCQkgICAgZXRkZXYtPk1DTGlzdFtuSW5kZXhdWzNdCi0JCQkJCSAgICAmJiBwQnVmVmFbNF0gPT0KLQkJCQkJICAgIGV0ZGV2LT5NQ0xpc3RbbkluZGV4XVs0XQotCQkJCQkgICAgJiYgcEJ1ZlZhWzVdID09Ci0JCQkJCSAgICBldGRldi0+TUNMaXN0W25JbmRleF1bNV0pIHsKKwkJCQlmb3IgKGkgPSAwOworCQkJCSAgICAgaSA8IGV0ZGV2LT5NQ0FkZHJlc3NDb3VudDsKKwkJCQkgICAgIGkrKykgeworCQkJCQlpZiAoYnVmWzBdID09CisJCQkJCSAgICBldGRldi0+TUNMaXN0W2ldWzBdCisJCQkJCSAgICAmJiBidWZbMV0gPT0KKwkJCQkJICAgIGV0ZGV2LT5NQ0xpc3RbaV1bMV0KKwkJCQkJICAgICYmIGJ1ZlsyXSA9PQorCQkJCQkgICAgZXRkZXYtPk1DTGlzdFtpXVsyXQorCQkJCQkgICAgJiYgYnVmWzNdID09CisJCQkJCSAgICBldGRldi0+TUNMaXN0W2ldWzNdCisJCQkJCSAgICAmJiBidWZbNF0gPT0KKwkJCQkJICAgIGV0ZGV2LT5NQ0xpc3RbaV1bNF0KKwkJCQkJICAgICYmIGJ1Zls1XSA9PQorCQkJCQkgICAgZXRkZXYtPk1DTGlzdFtpXVs1XSkgewogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQl9CkBAIC0xMDI0LDExICs5NTcsMTEgQEAKIAkJCQkgKiBzbyB3ZSBmcmVlIG91ciBSRkQgd2hlbiB3ZSByZXR1cm4KIAkJCQkgKiBmcm9tIHRoaXMgZnVuY3Rpb24uCiAJCQkJICovCi0JCQkJaWYgKG5JbmRleCA9PSBldGRldi0+TUNBZGRyZXNzQ291bnQpCi0JCQkJCWxvY2FsTGVuID0gMDsKKwkJCQlpZiAoaSA9PSBldGRldi0+TUNBZGRyZXNzQ291bnQpCisJCQkJCWxlbiA9IDA7CiAJCQl9CiAKLQkJCWlmIChsb2NhbExlbiA+IDApCisJCQlpZiAobGVuID4gMCkKIAkJCQlldGRldi0+U3RhdHMubXVsdGlyY3YrKzsKIAkJfSBlbHNlIGlmIChXb3JkMC52YWx1ZSAmIEFMQ0FURUxfQlJPQURDQVNUX1BLVCkKIAkJCWV0ZGV2LT5TdGF0cy5icmRjc3RyY3YrKzsKQEAgLTEwNDEsMjQgKzk3NCwyNCBAQAogCQkJZXRkZXYtPlN0YXRzLnVuaXJjdisrOwogCX0KIAotCWlmIChsb2NhbExlbiA+IDApIHsKKwlpZiAobGVuID4gMCkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAotCQkvKiBwTXBSZmQtPlBhY2tldFNpemUgPSBsb2NhbExlbiAtIDQ7ICovCi0JCXBNcFJmZC0+UGFja2V0U2l6ZSA9IGxvY2FsTGVuOworCQkvKiByZmQtPlBhY2tldFNpemUgPSBsZW4gLSA0OyAqLworCQlyZmQtPlBhY2tldFNpemUgPSBsZW47CiAKLQkJc2tiID0gZGV2X2FsbG9jX3NrYihwTXBSZmQtPlBhY2tldFNpemUgKyAyKTsKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihyZmQtPlBhY2tldFNpemUgKyAyKTsKIAkJaWYgKCFza2IpIHsKIAkJCWRldl9lcnIoJmV0ZGV2LT5wZGV2LT5kZXYsCiAJCQkJICAiQ291bGRuJ3QgYWxsb2MgYW4gU0tCIGZvciBSeFxuIik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCi0JCWV0ZGV2LT5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gcE1wUmZkLT5QYWNrZXRTaXplOworCQlldGRldi0+bmV0X3N0YXRzLnJ4X2J5dGVzICs9IHJmZC0+UGFja2V0U2l6ZTsKIAotCQltZW1jcHkoc2tiX3B1dChza2IsIHBNcFJmZC0+UGFja2V0U2l6ZSksCi0JCSAgICAgICBwUnhMb2NhbC0+RmJyW3JpbmdJbmRleF0tPlZhW2J1ZmZlckluZGV4XSwKLQkJICAgICAgIHBNcFJmZC0+UGFja2V0U2l6ZSk7CisJCW1lbWNweShza2JfcHV0KHNrYiwgcmZkLT5QYWNrZXRTaXplKSwKKwkJICAgICAgIHJ4X2xvY2FsLT5GYnJbcmluZGV4XS0+VmFbYmluZGV4XSwKKwkJICAgICAgIHJmZC0+UGFja2V0U2l6ZSk7CiAKIAkJc2tiLT5kZXYgPSBldGRldi0+bmV0ZGV2OwogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBldGRldi0+bmV0ZGV2KTsKQEAgLTEwNjYsMTEgKzk5OSwxMSBAQAogCiAJCW5ldGlmX3J4KHNrYik7CiAJfSBlbHNlIHsKLQkJcE1wUmZkLT5QYWNrZXRTaXplID0gMDsKKwkJcmZkLT5QYWNrZXRTaXplID0gMDsKIAl9CiAKLQluaWNfcmV0dXJuX3JmZChldGRldiwgcE1wUmZkKTsKLQlyZXR1cm4gcE1wUmZkOworCW5pY19yZXR1cm5fcmZkKGV0ZGV2LCByZmQpOworCXJldHVybiByZmQ7CiB9CiAKIC8qKgpAQCAtMTA4MSwyMSArMTAxNCw4IEBACiAgKi8KIHZvaWQgZXQxMzF4X3Jlc2V0X3JlY3Yoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKLQlQTVBfUkZEIHBNcFJmZDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OwotCiAJV0FSTl9PTihsaXN0X2VtcHR5KCZldGRldi0+UnhSaW5nLlJlY3ZMaXN0KSk7CiAKLQkvKiBUYWtlIGFsbCB0aGUgUkZEJ3MgZnJvbSB0aGUgcGVuZGluZyBsaXN0LCBhbmQgc3RpY2sgdGhlbSBvbiB0aGUKLQkgKiBSZWN2TGlzdC4KLQkgKi8KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmV0ZGV2LT5SeFJpbmcuUmVjdlBlbmRpbmdMaXN0KSkgewotCQllbGVtZW50ID0gZXRkZXYtPlJ4UmluZy5SZWN2UGVuZGluZ0xpc3QubmV4dDsKLQotCQlwTXBSZmQgPSAoUE1QX1JGRCkgbGlzdF9lbnRyeShlbGVtZW50LCBNUF9SRkQsIGxpc3Rfbm9kZSk7Ci0KLQkJbGlzdF9tb3ZlX3RhaWwoJnBNcFJmZC0+bGlzdF9ub2RlLCAmZXRkZXYtPlJ4UmluZy5SZWN2TGlzdCk7Ci0JfQogfQogCiAvKioKQEAgLTExMDYsMjcgKzEwMjYsMjEgQEAKICAqLwogdm9pZCBldDEzMXhfaGFuZGxlX3JlY3ZfaW50ZXJydXB0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCiB7Ci0JUE1QX1JGRCBwTXBSZmQgPSBOVUxMOwotCXN0cnVjdCBza19idWZmICpQYWNrZXRBcnJheVtOVU1fUEFDS0VUU19IQU5ETEVEXTsKLQlQTVBfUkZEIFJGREZyZWVBcnJheVtOVU1fUEFDS0VUU19IQU5ETEVEXTsKLQl1aW50MzJfdCBQYWNrZXRBcnJheUNvdW50ID0gMDsKLQl1aW50MzJfdCBQYWNrZXRzVG9IYW5kbGU7Ci0JdWludDMyX3QgUGFja2V0RnJlZUNvdW50ID0gMDsKLQlib29sIFRlbXBVbmZpbmlzaGVkUmVjID0gZmFsc2U7Ci0KLQlQYWNrZXRzVG9IYW5kbGUgPSBOVU1fUEFDS0VUU19IQU5ETEVEOworCVBNUF9SRkQgcmZkID0gTlVMTDsKKwl1MzIgY291bnQgPSAwOworCWJvb2wgZG9uZSA9IHRydWU7CiAKIAkvKiBQcm9jZXNzIHVwIHRvIGF2YWlsYWJsZSBSRkQncyAqLwotCXdoaWxlIChQYWNrZXRBcnJheUNvdW50IDwgUGFja2V0c1RvSGFuZGxlKSB7CisJd2hpbGUgKGNvdW50IDwgTlVNX1BBQ0tFVFNfSEFORExFRCkgewogCQlpZiAobGlzdF9lbXB0eSgmZXRkZXYtPlJ4UmluZy5SZWN2TGlzdCkpIHsKIAkJCVdBUk5fT04oZXRkZXYtPlJ4UmluZy5uUmVhZHlSZWN2ICE9IDApOwotCQkJVGVtcFVuZmluaXNoZWRSZWMgPSB0cnVlOworCQkJZG9uZSA9IGZhbHNlOwogCQkJYnJlYWs7CiAJCX0KIAotCQlwTXBSZmQgPSBuaWNfcnhfcGt0cyhldGRldik7CisJCXJmZCA9IG5pY19yeF9wa3RzKGV0ZGV2KTsKIAotCQlpZiAocE1wUmZkID09IE5VTEwpCisJCWlmIChyZmQgPT0gTlVMTCkKIAkJCWJyZWFrOwogCiAJCS8qIERvIG5vdCByZWNlaXZlIGFueSBwYWNrZXRzIHVudGlsIGEgZmlsdGVyIGhhcyBiZWVuIHNldC4KQEAgLTExMzYsNyArMTA1MCw3IEBACiAJCSAqLwogCQlpZiAoIWV0ZGV2LT5QYWNrZXRGaWx0ZXIgfHwKIAkJICAgICEoZXRkZXYtPkZsYWdzICYgZk1QX0FEQVBURVJfTElOS19ERVRFQ1RJT04pIHx8Ci0JCSAgICBwTXBSZmQtPlBhY2tldFNpemUgPT0gMCkgeworCQkgICAgcmZkLT5QYWNrZXRTaXplID09IDApIHsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTExNDQsMzUgKzEwNTgsMjAgQEAKIAkJZXRkZXYtPlN0YXRzLmlwYWNrZXRzKys7CiAKIAkJLyogU2V0IHRoZSBzdGF0dXMgb24gdGhlIHBhY2tldCwgZWl0aGVyIHJlc291cmNlcyBvciBzdWNjZXNzICovCi0JCWlmIChldGRldi0+UnhSaW5nLm5SZWFkeVJlY3YgPj0gUkZEX0xPV19XQVRFUl9NQVJLKSB7Ci0JCQkvKiBQdXQgdGhpcyBSRkQgb24gdGhlIHBlbmRpbmcgbGlzdAotCQkJICoKLQkJCSAqIE5PVEU6IG5pY19yeF9wa3RzKCkgYWJvdmUgaXMgYWxyZWFkeSByZXR1cm5pbmcgdGhlCi0JCQkgKiBSRkQgdG8gdGhlIFJlY3ZMaXN0LCBzbyBkb24ndCBhZGRpdGlvbmFsbHkgZG8gdGhhdAotCQkJICogaGVyZS4KLQkJCSAqIEJlc2lkZXMsIHdlIGRvbid0IHJlYWxseSBuZWVkIChhdCB0aGlzIHBvaW50KSB0aGUKLQkJCSAqIHBlbmRpbmcgbGlzdCBhbnl3YXkuCi0JCQkgKi8KLQkJfSBlbHNlIHsKLQkJCVJGREZyZWVBcnJheVtQYWNrZXRGcmVlQ291bnRdID0gcE1wUmZkOwotCQkJUGFja2V0RnJlZUNvdW50Kys7Ci0KKwkJaWYgKGV0ZGV2LT5SeFJpbmcublJlYWR5UmVjdiA8IFJGRF9MT1dfV0FURVJfTUFSSykgewogCQkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsCiAJCQkJICAgICJSRkQncyBhcmUgcnVubmluZyBvdXRcbiIpOwogCQl9Ci0KLQkJUGFja2V0QXJyYXlbUGFja2V0QXJyYXlDb3VudF0gPSBwTXBSZmQtPlBhY2tldDsKLQkJUGFja2V0QXJyYXlDb3VudCsrOworCQljb3VudCsrOwogCX0KIAotCWlmICgoUGFja2V0QXJyYXlDb3VudCA9PSBOVU1fUEFDS0VUU19IQU5ETEVEKSB8fCBUZW1wVW5maW5pc2hlZFJlYykgeworCWlmIChjb3VudCA9PSBOVU1fUEFDS0VUU19IQU5ETEVEIHx8ICFkb25lKSB7CiAJCWV0ZGV2LT5SeFJpbmcuVW5maW5pc2hlZFJlY2VpdmVzID0gdHJ1ZTsKIAkJd3JpdGVsKFBBUk1fVFhfVElNRV9JTlRfREVGICogTkFOT19JTl9BX01JQ1JPLAogCQkgICAgICAgJmV0ZGV2LT5yZWdzLT5nbG9iYWwud2F0Y2hkb2dfdGltZXIpOwotCX0gZWxzZSB7CisJfSBlbHNlCiAJCS8qIFdhdGNoZG9nIHRpbWVyIHdpbGwgZGlzYWJsZSBpdHNlbGYgaWYgYXBwcm9wcmlhdGUuICovCiAJCWV0ZGV2LT5SeFJpbmcuVW5maW5pc2hlZFJlY2VpdmVzID0gZmFsc2U7Ci0JfQogfQogCiBzdGF0aWMgaW5saW5lIHUzMiBidW1wX2Zicih1MzIgKmZiciwgdTMyIGxpbWl0KQpAQCAtMTE5NiwxNCArMTA5NSwxNCBAQAogLyoqCiAgKiBOSUNSZXR1cm5SRkQgLSBSZWN5Y2xlIGEgUkZEIGFuZCBwdXQgaXQgYmFjayBvbnRvIHRoZSByZWNlaXZlIGxpc3QKICAqIEBldGRldjogcG9pbnRlciB0byBvdXIgYWRhcHRlcgotICogQHBNcFJmZDogcG9pbnRlciB0byB0aGUgUkZECisgKiBAcmZkOiBwb2ludGVyIHRvIHRoZSBSRkQKICAqLwotdm9pZCBuaWNfcmV0dXJuX3JmZChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCBQTVBfUkZEIHBNcFJmZCkKK3ZvaWQgbmljX3JldHVybl9yZmQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgUE1QX1JGRCByZmQpCiB7CiAJc3RydWN0IF9yeF9yaW5nX3QgKnJ4X2xvY2FsID0gJmV0ZGV2LT5SeFJpbmc7CiAJc3RydWN0IF9SWERNQV90IF9faW9tZW0gKnJ4X2RtYSA9ICZldGRldi0+cmVncy0+cnhkbWE7Ci0JdWludDE2X3QgYmkgPSBwTXBSZmQtPmJ1ZmZlcmluZGV4OwotCXVpbnQ4X3QgcmkgPSBwTXBSZmQtPnJpbmdpbmRleDsKKwl1aW50MTZfdCBiaSA9IHJmZC0+YnVmZmVyaW5kZXg7CisJdWludDhfdCByaSA9IHJmZC0+cmluZ2luZGV4OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBXZSBkb24ndCB1c2UgYW55IG9mIHRoZSBPT0IgZGF0YSBiZXNpZGVzIHN0YXR1cy4gT3RoZXJ3aXNlLCB3ZQpAQCAtMTIxNyw3ICsxMTE2LDcgQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5GYnJMb2NrLCBmbGFncyk7CiAKIAkJaWYgKHJpID09IDEpIHsKLQkJCVBGQlJfREVTQ190IHBOZXh0RGVzYyA9CisJCQlQRkJSX0RFU0NfdCBuZXh0ID0KIAkJCSAgICAoUEZCUl9ERVNDX3QpIChyeF9sb2NhbC0+cEZicjFSaW5nVmEpICsKIAkJCSAgICBJTkRFWDEwKHJ4X2xvY2FsLT5sb2NhbF9GYnIxX2Z1bGwpOwogCkBAIC0xMjI1LDkgKzExMjQsOSBAQAogCQkJICogdGhlIFBBIC8gQnVmZmVyIEluZGV4IGZvciB0aGUgcmV0dXJuZWQgYnVmZmVyIGludG8KIAkJCSAqIHRoZSBvbGRlc3QgKG5leHQgdG8gYmUgZnJlZWQpRkJSIGVudHJ5CiAJCQkgKi8KLQkJCXBOZXh0RGVzYy0+YWRkcl9oaSA9IHJ4X2xvY2FsLT5GYnJbMV0tPlBBSGlnaFtiaV07Ci0JCQlwTmV4dERlc2MtPmFkZHJfbG8gPSByeF9sb2NhbC0+RmJyWzFdLT5QQUxvd1tiaV07Ci0JCQlwTmV4dERlc2MtPndvcmQyLnZhbHVlID0gYmk7CisJCQluZXh0LT5hZGRyX2hpID0gcnhfbG9jYWwtPkZiclsxXS0+UEFIaWdoW2JpXTsKKwkJCW5leHQtPmFkZHJfbG8gPSByeF9sb2NhbC0+RmJyWzFdLT5QQUxvd1tiaV07CisJCQluZXh0LT53b3JkMi52YWx1ZSA9IGJpOwogCiAJCQl3cml0ZWwoYnVtcF9mYnIoJnJ4X2xvY2FsLT5sb2NhbF9GYnIxX2Z1bGwsCiAJCQkJcnhfbG9jYWwtPkZicjFOdW1FbnRyaWVzIC0gMSksCkBAIC0xMjM1LDcgKzExMzQsNyBAQAogCQl9CiAjaWZkZWYgVVNFX0ZCUjAKIAkJZWxzZSB7Ci0JCQlQRkJSX0RFU0NfdCBwTmV4dERlc2MgPQorCQkJUEZCUl9ERVNDX3QgbmV4dCA9CiAJCQkgICAgKFBGQlJfREVTQ190KSByeF9sb2NhbC0+cEZicjBSaW5nVmEgKwogCQkJICAgIElOREVYMTAocnhfbG9jYWwtPmxvY2FsX0ZicjBfZnVsbCk7CiAKQEAgLTEyNDMsOSArMTE0Miw5IEBACiAJCQkgKiB0aGUgUEEgLyBCdWZmZXIgSW5kZXggZm9yIHRoZSByZXR1cm5lZCBidWZmZXIgaW50bwogCQkJICogdGhlIG9sZGVzdCAobmV4dCB0byBiZSBmcmVlZCkgRkJSIGVudHJ5CiAJCQkgKi8KLQkJCXBOZXh0RGVzYy0+YWRkcl9oaSA9IHJ4X2xvY2FsLT5GYnJbMF0tPlBBSGlnaFtiaV07Ci0JCQlwTmV4dERlc2MtPmFkZHJfbG8gPSByeF9sb2NhbC0+RmJyWzBdLT5QQUxvd1tiaV07Ci0JCQlwTmV4dERlc2MtPndvcmQyLnZhbHVlID0gYmk7CisJCQluZXh0LT5hZGRyX2hpID0gcnhfbG9jYWwtPkZiclswXS0+UEFIaWdoW2JpXTsKKwkJCW5leHQtPmFkZHJfbG8gPSByeF9sb2NhbC0+RmJyWzBdLT5QQUxvd1tiaV07CisJCQluZXh0LT53b3JkMi52YWx1ZSA9IGJpOwogCiAJCQl3cml0ZWwoYnVtcF9mYnIoJnJ4X2xvY2FsLT5sb2NhbF9GYnIwX2Z1bGwsCiAJCQkJCXJ4X2xvY2FsLT5GYnIwTnVtRW50cmllcyAtIDEpLApAQCAtMTI2Miw3ICsxMTYxLDcgQEAKIAkgKiBvdXIgbGlzdAogCSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZldGRldi0+UmN2TG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJnBNcFJmZC0+bGlzdF9ub2RlLCAmcnhfbG9jYWwtPlJlY3ZMaXN0KTsKKwlsaXN0X2FkZF90YWlsKCZyZmQtPmxpc3Rfbm9kZSwgJnJ4X2xvY2FsLT5SZWN2TGlzdCk7CiAJcnhfbG9jYWwtPm5SZWFkeVJlY3YrKzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+UmN2TG9jaywgZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9yeC5oIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcnguaAppbmRleCA3MmE1MjI5Li42OTUxNDU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9yeC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3J4LmgKQEAgLTIwOSwzNiArMjA5LDI2IEBACiAvKiBUeXBlZGVmcyBmb3IgdGhlIFJYIERNQSBzdGF0dXMgd29yZCAqLwogCiAvKgotICogUlhTVEFUX1dPUkQwX3Qgc3RydWN0dXJlIGhvbGRzIHBhcnQgb2YgdGhlIHN0YXR1cyBiaXRzIG9mIHRoZSBSeCBETUEgZW5naW5lCisgKiByeCBzdGF0dXMgd29yZCAwIGhvbGRzIHBhcnQgb2YgdGhlIHN0YXR1cyBiaXRzIG9mIHRoZSBSeCBETUEgZW5naW5lCiAgKiB0aGF0IGdldCBjb3BpZWQgb3V0IHRvIG1lbW9yeSBieSB0aGUgRVQtMTMxMC4gIFdvcmQgMCBpcyBhIDMyIGJpdCB3b3JkCi0gKiB3aGljaGNvbnRhaW5zIEZyZWUgQnVmZmVyIHJpbmcgMCBhbmQgMSBhdmFpbGFibGUgb2Zmc2V0LgorICogd2hpY2ggY29udGFpbnMgdGhlIEZyZWUgQnVmZmVyIHJpbmcgMCBhbmQgMSBhdmFpbGFibGUgb2Zmc2V0LgorICoKKyAqIGJpdCAwLTkgRkJSMSBvZmZzZXQKKyAqIGJpdCAxMCBXcmFwIGZsYWcgZm9yIEZCUjEKKyAqIGJpdCAxNi0yNSBGQlIwIG9mZnNldAorICogYml0IDI2IFdyYXAgZmxhZyBmb3IgRkJSMAogICovCi10eXBlZGVmIHVuaW9uIF9yeHN0YXRfd29yZDBfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgRkJSMXVudXNlZDo1OwkvKiBiaXRzIDI3LTMxICovCi0JCXUzMiBGQlIxd3JhcDoxOwkvKiBiaXQgMjYgKi8KLQkJdTMyIEZCUjFvZmZzZXQ6MTA7CS8qIGJpdHMgMTYtMjUgKi8KLQkJdTMyIEZCUjB1bnVzZWQ6NTsJLyogYml0cyAxMS0xNSAqLwotCQl1MzIgRkJSMHdyYXA6MTsJLyogYml0IDEwICovCi0JCXUzMiBGQlIwb2Zmc2V0OjEwOwkvKiBiaXRzIDAtOSAqLwotI2Vsc2UKLQkJdTMyIEZCUjBvZmZzZXQ6MTA7CS8qIGJpdHMgMC05ICovCi0JCXUzMiBGQlIwd3JhcDoxOwkvKiBiaXQgMTAgKi8KLQkJdTMyIEZCUjB1bnVzZWQ6NTsJLyogYml0cyAxMS0xNSAqLwotCQl1MzIgRkJSMW9mZnNldDoxMDsJLyogYml0cyAxNi0yNSAqLwotCQl1MzIgRkJSMXdyYXA6MTsJLyogYml0IDI2ICovCi0JCXUzMiBGQlIxdW51c2VkOjU7CS8qIGJpdHMgMjctMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gUlhTVEFUX1dPUkQwX3QsICpQUlhTVEFUX1dPUkQwX3Q7CiAKIC8qCiAgKiBSWFNUQVRfV09SRDFfdCBzdHJ1Y3R1cmUgaG9sZHMgcGFydCBvZiB0aGUgc3RhdHVzIGJpdHMgb2YgdGhlIFJ4IERNQSBlbmdpbmUKICAqIHRoYXQgZ2V0IGNvcGllZCBvdXQgdG8gbWVtb3J5IGJ5IHRoZSBFVC0xMzEwLiAgV29yZCAzIGlzIGEgMzIgYml0IHdvcmQKICAqIHdoaWNoIGNvbnRhaW5zIHRoZSBQYWNrZXQgU3RhdHVzIFJpbmcgYXZhaWxhYmxlIG9mZnNldC4KICAqLworCisjZGVmaW5lIFJYU1RBVDFfT0ZGU0VUCTE2CisjZGVmaW5lIFJYU1RBVDFfTUFTSwkweEZGRgorI2RlZmluZSBSWFNUQVQxX1dSQVAJMHgxMDAwMDAwMAorCiB0eXBlZGVmIHVuaW9uIF9yeHN0YXRfd29yZDFfdCB7CiAJdTMyIHZhbHVlOwogCXN0cnVjdCB7CkBAIC0yNjEsNyArMjUxLDcgQEAKICAqIGl0IHNpdHMgaW4gZnJlZSBtZW1vcnksIGFuZCBpcyBwb2ludGVkIHRvIGJ5IDB4MTAxYyAvIDB4MTAyMAogICovCiB0eXBlZGVmIHN0cnVjdCBfcnhfc3RhdHVzX2Jsb2NrX3QgewotCVJYU1RBVF9XT1JEMF90IFdvcmQwOworCXUzMiBXb3JkMDsKIAlSWFNUQVRfV09SRDFfdCBXb3JkMTsKIH0gUlhfU1RBVFVTX0JMT0NLX3QsICpQUlhfU1RBVFVTX0JMT0NLX3Q7CiAKQEAgLTI4MiwxNSArMjcyLDYgQEAKIH0gZVJYX0lOVEVSUlVQVF9TVEFURV90LCAqUGVSWF9JTlRFUlJVUFRfU1RBVEVfdDsKIAogLyoKLSAqIFN0cnVjdHVyZSB0byBob2xkIHRoZSBza2IncyBpbiBhIGxpc3QKLSAqLwotdHlwZWRlZiBzdHJ1Y3Qgcnhfc2tiX2xpc3RfZWxlbSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBza2JfbGlzdF9lbGVtOwotCWRtYV9hZGRyX3QgZG1hX2FkZHI7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLX0gUlhfU0tCX0xJU1RfRUxFTSwgKlBSWF9TS0JfTElTVF9FTEVNOwotCi0vKgogICogUlhfUklOR190IGlzIHNydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgYWRhcHRvcidzIGxvY2FsIHJlZmVyZW5jZShzKSB0byB0aGUKICAqIHJpbmdzCiAgKi8KQEAgLTMxOSwyMSArMzAwLDE2IEBACiAKIAl2b2lkICpwUFNSaW5nVmE7CiAJZG1hX2FkZHJfdCBwUFNSaW5nUGE7Ci0JdWludDY0X3QgcFBTUmluZ1JlYWxQYTsKLQl1aW50NjRfdCBwUFNSaW5nT2Zmc2V0OwotCVJYRE1BX1BTUl9GVUxMX09GRlNFVF90IGxvY2FsX3Bzcl9mdWxsOworCXUzMiBsb2NhbF9wc3JfZnVsbDsKIAl1MzIgUHNyTnVtRW50cmllczsKIAogCXZvaWQgKnBSeFN0YXR1c1ZhOwogCWRtYV9hZGRyX3QgcFJ4U3RhdHVzUGE7Ci0JdWludDY0X3QgUnhTdGF0dXNSZWFsUEE7Ci0JdWludDY0X3QgUnhTdGF0dXNPZmZzZXQ7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIFJlY3ZCdWZmZXJQb29sOwogCiAJLyogUkVDViAqLwogCXN0cnVjdCBsaXN0X2hlYWQgUmVjdkxpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCBSZWN2UGVuZGluZ0xpc3Q7CiAJdTMyIG5SZWFkeVJlY3Y7CiAKIAl1MzIgTnVtUmZkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfdHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3R4LmMKaW5kZXggOTRmNzc1Mi4uOTc3ZThiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfdHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF90eC5jCkBAIC05NCwxMyArOTQsMTEgQEAKICNpbmNsdWRlICJldDEzMTBfdHguaCIKIAogCi1zdGF0aWMgdm9pZCBldDEzMXhfdXBkYXRlX3RjYl9saXN0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpOwotc3RhdGljIHZvaWQgZXQxMzF4X2NoZWNrX3NlbmRfd2FpdF9saXN0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpOwogc3RhdGljIGlubGluZSB2b2lkIGV0MTMxeF9mcmVlX3NlbmRfcGFja2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsCi0JCQkJCSAgIFBNUF9UQ0IgcE1wVGNiKTsKKwkJCQkJICAgc3RydWN0IHRjYiAqdGNiKTsKIHN0YXRpYyBpbnQgZXQxMzF4X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgICBzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KTsKLXN0YXRpYyBpbnQgbmljX3NlbmRfcGFja2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIFBNUF9UQ0IgcE1wVGNiKTsKK3N0YXRpYyBpbnQgbmljX3NlbmRfcGFja2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIHN0cnVjdCB0Y2IgKnRjYik7CiAKIC8qKgogICogZXQxMzF4X3R4X2RtYV9tZW1vcnlfYWxsb2MKQEAgLTExNywxMiArMTE1LDEyIEBACiBpbnQgZXQxMzF4X3R4X2RtYV9tZW1vcnlfYWxsb2Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQogewogCWludCBkZXNjX3NpemUgPSAwOwotCVRYX1JJTkdfdCAqdHhfcmluZyA9ICZhZGFwdGVyLT5UeFJpbmc7CisJc3RydWN0IHR4X3JpbmcgKnR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZzsKIAogCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFRDQidzIChUcmFuc21pdCBDb250cm9sIEJsb2NrKSAqLwotCWFkYXB0ZXItPlR4UmluZy5NcFRjYk1lbSA9IChNUF9UQ0IgKilrY2FsbG9jKE5VTV9UQ0IsIHNpemVvZihNUF9UQ0IpLAotCQkJCQkJICAgICAgR0ZQX0FUT01JQyB8IEdGUF9ETUEpOwotCWlmICghYWRhcHRlci0+VHhSaW5nLk1wVGNiTWVtKSB7CisJYWRhcHRlci0+dHhfcmluZy50Y2JfcmluZyA9IChzdHJ1Y3QgdGNiICopCisJCWtjYWxsb2MoTlVNX1RDQiwgc2l6ZW9mKHN0cnVjdCB0Y2IpLCBHRlBfQVRPTUlDIHwgR0ZQX0RNQSk7CisJaWYgKCFhZGFwdGVyLT50eF9yaW5nLnRjYl9yaW5nKSB7CiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIkNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIFRDQnNcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0xMzAsMTIgKzEyOCwxMyBAQAogCS8qIEFsbG9jYXRlIGVub3VnaCBtZW1vcnkgZm9yIHRoZSBUeCBkZXNjcmlwdG9yIHJpbmcsIGFuZCBhbGxvY2F0ZQogCSAqIHNvbWUgZXh0cmEgc28gdGhhdCB0aGUgcmluZyBjYW4gYmUgYWxpZ25lZCBvbiBhIDRrIGJvdW5kYXJ5LgogCSAqLwotCWRlc2Nfc2l6ZSA9IChzaXplb2YoVFhfREVTQ19FTlRSWV90KSAqIE5VTV9ERVNDX1BFUl9SSU5HX1RYKSArIDQwOTYgLSAxOwotCXR4X3JpbmctPnBUeERlc2NSaW5nVmEgPQotCSAgICAoUFRYX0RFU0NfRU5UUllfdCkgcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgZGVzY19zaXplLAotCQkJCQkJICAgICZ0eF9yaW5nLT5wVHhEZXNjUmluZ1BhKTsKLQlpZiAoIWFkYXB0ZXItPlR4UmluZy5wVHhEZXNjUmluZ1ZhKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIkNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIFR4IFJpbmdcbiIpOworCWRlc2Nfc2l6ZSA9IChzaXplb2Yoc3RydWN0IHR4X2Rlc2MpICogTlVNX0RFU0NfUEVSX1JJTkdfVFgpICsgNDA5NiAtIDE7CisJdHhfcmluZy0+dHhfZGVzY19yaW5nID0KKwkgICAgKHN0cnVjdCB0eF9kZXNjICopIHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIGRlc2Nfc2l6ZSwKKwkJCQkJCSAgICAmdHhfcmluZy0+dHhfZGVzY19yaW5nX3BhKTsKKwlpZiAoIWFkYXB0ZXItPnR4X3JpbmcudHhfZGVzY19yaW5nKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkJIkNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIFR4IFJpbmdcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTE0NiwzNSArMTQ1LDE1IEBACiAJICogYXJlIGV2ZXIgcmV0dXJuZWQsIG1ha2Ugc3VyZSB0aGUgaGlnaCBwYXJ0IGlzIHJldHJpZXZlZCBoZXJlIGJlZm9yZQogCSAqIHN0b3JpbmcgdGhlIGFkanVzdGVkIGFkZHJlc3MuCiAJICovCi0JdHhfcmluZy0+cFR4RGVzY1JpbmdBZGp1c3RlZFBhID0gdHhfcmluZy0+cFR4RGVzY1JpbmdQYTsKLQotCS8qIEFsaWduIFR4IERlc2NyaXB0b3IgUmluZyBvbiBhIDRrICgweDEwMDApIGJ5dGUgYm91bmRhcnkgKi8KLQlldDEzMXhfYWxpZ25fYWxsb2NhdGVkX21lbW9yeShhZGFwdGVyLAotCQkJCSAgICAgICZ0eF9yaW5nLT5wVHhEZXNjUmluZ0FkanVzdGVkUGEsCi0JCQkJICAgICAgJnR4X3JpbmctPlR4RGVzY09mZnNldCwgMHgwRkZGKTsKLQotCXR4X3JpbmctPnBUeERlc2NSaW5nVmEgKz0gdHhfcmluZy0+VHhEZXNjT2Zmc2V0OwotCiAJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgVHggc3RhdHVzIGJsb2NrICovCi0JdHhfcmluZy0+cFR4U3RhdHVzVmEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LAotCQkJCQkJICAgIHNpemVvZihUWF9TVEFUVVNfQkxPQ0tfdCksCi0JCQkJCQkgICAgJnR4X3JpbmctPnBUeFN0YXR1c1BhKTsKLQlpZiAoIWFkYXB0ZXItPlR4UmluZy5wVHhTdGF0dXNQYSkgeworCXR4X3JpbmctPnR4X3N0YXR1cyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCisJCQkJCQkgICAgc2l6ZW9mKHUzMiksCisJCQkJCQkgICAgJnR4X3JpbmctPnR4X3N0YXR1c19wYSk7CisJaWYgKCFhZGFwdGVyLT50eF9yaW5nLnR4X3N0YXR1c19wYSkgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkJICAiQ2Fubm90IGFsbG9jIG1lbW9yeSBmb3IgVHggc3RhdHVzIGJsb2NrXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhIGR1bW15IGJ1ZmZlciAqLwotCXR4X3JpbmctPnBUeER1bW15QmxrVmEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LAotCQkJCQkJICAgICAgTklDX01JTl9QQUNLRVRfU0laRSwKLQkJCQkJCSAgICAgICZ0eF9yaW5nLT5wVHhEdW1teUJsa1BhKTsKLQlpZiAoIWFkYXB0ZXItPlR4UmluZy5wVHhEdW1teUJsa1BhKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCSJDYW5ub3QgYWxsb2MgbWVtb3J5IGZvciBUeCBkdW1teSBidWZmZXJcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTg4LDc2ICsxNjcsNTkgQEAKIHsKIAlpbnQgZGVzY19zaXplID0gMDsKIAotCWlmIChhZGFwdGVyLT5UeFJpbmcucFR4RGVzY1JpbmdWYSkgeworCWlmIChhZGFwdGVyLT50eF9yaW5nLnR4X2Rlc2NfcmluZykgewogCQkvKiBGcmVlIG1lbW9yeSByZWxhdGluZyB0byBUeCByaW5ncyBoZXJlICovCi0JCWFkYXB0ZXItPlR4UmluZy5wVHhEZXNjUmluZ1ZhIC09IGFkYXB0ZXItPlR4UmluZy5UeERlc2NPZmZzZXQ7Ci0KLQkJZGVzY19zaXplID0KLQkJICAgIChzaXplb2YoVFhfREVTQ19FTlRSWV90KSAqIE5VTV9ERVNDX1BFUl9SSU5HX1RYKSArIDQwOTYgLSAxOwotCisJCWRlc2Nfc2l6ZSA9IChzaXplb2Yoc3RydWN0IHR4X2Rlc2MpICogTlVNX0RFU0NfUEVSX1JJTkdfVFgpCisJCQkJCQkJCSsgNDA5NiAtIDE7CiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwKIAkJCQkgICAgZGVzY19zaXplLAotCQkJCSAgICBhZGFwdGVyLT5UeFJpbmcucFR4RGVzY1JpbmdWYSwKLQkJCQkgICAgYWRhcHRlci0+VHhSaW5nLnBUeERlc2NSaW5nUGEpOwotCi0JCWFkYXB0ZXItPlR4UmluZy5wVHhEZXNjUmluZ1ZhID0gTlVMTDsKKwkJCQkgICAgYWRhcHRlci0+dHhfcmluZy50eF9kZXNjX3JpbmcsCisJCQkJICAgIGFkYXB0ZXItPnR4X3JpbmcudHhfZGVzY19yaW5nX3BhKTsKKwkJYWRhcHRlci0+dHhfcmluZy50eF9kZXNjX3JpbmcgPSBOVUxMOwogCX0KIAogCS8qIEZyZWUgbWVtb3J5IGZvciB0aGUgVHggc3RhdHVzIGJsb2NrICovCi0JaWYgKGFkYXB0ZXItPlR4UmluZy5wVHhTdGF0dXNWYSkgeworCWlmIChhZGFwdGVyLT50eF9yaW5nLnR4X3N0YXR1cykgewogCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCi0JCQkJICAgIHNpemVvZihUWF9TVEFUVVNfQkxPQ0tfdCksCi0JCQkJICAgIGFkYXB0ZXItPlR4UmluZy5wVHhTdGF0dXNWYSwKLQkJCQkgICAgYWRhcHRlci0+VHhSaW5nLnBUeFN0YXR1c1BhKTsKKwkJCQkgICAgc2l6ZW9mKHUzMiksCisJCQkJICAgIGFkYXB0ZXItPnR4X3JpbmcudHhfc3RhdHVzLAorCQkJCSAgICBhZGFwdGVyLT50eF9yaW5nLnR4X3N0YXR1c19wYSk7CiAKLQkJYWRhcHRlci0+VHhSaW5nLnBUeFN0YXR1c1ZhID0gTlVMTDsKKwkJYWRhcHRlci0+dHhfcmluZy50eF9zdGF0dXMgPSBOVUxMOwogCX0KLQotCS8qIEZyZWUgbWVtb3J5IGZvciB0aGUgZHVtbXkgYnVmZmVyICovCi0JaWYgKGFkYXB0ZXItPlR4UmluZy5wVHhEdW1teUJsa1ZhKSB7Ci0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwKLQkJCQkgICAgTklDX01JTl9QQUNLRVRfU0laRSwKLQkJCQkgICAgYWRhcHRlci0+VHhSaW5nLnBUeER1bW15QmxrVmEsCi0JCQkJICAgIGFkYXB0ZXItPlR4UmluZy5wVHhEdW1teUJsa1BhKTsKLQotCQlhZGFwdGVyLT5UeFJpbmcucFR4RHVtbXlCbGtWYSA9IE5VTEw7Ci0JfQotCi0JLyogRnJlZSB0aGUgbWVtb3J5IGZvciBNUF9UQ0Igc3RydWN0dXJlcyAqLwotCWtmcmVlKGFkYXB0ZXItPlR4UmluZy5NcFRjYk1lbSk7CisJLyogRnJlZSB0aGUgbWVtb3J5IGZvciB0aGUgdGNiIHN0cnVjdHVyZXMgKi8KKwlrZnJlZShhZGFwdGVyLT50eF9yaW5nLnRjYl9yaW5nKTsKIH0KIAogLyoqCiAgKiBDb25maWdUeERtYVJlZ3MgLSBTZXQgdXAgdGhlIHR4IGRtYSBzZWN0aW9uIG9mIHRoZSBKQUdDb3JlLgogICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogQ29uZmlndXJlIHRoZSB0cmFuc21pdCBlbmdpbmUgd2l0aCB0aGUgcmluZyBidWZmZXJzIHdlIGhhdmUgY3JlYXRlZAorICogYW5kIHByZXBhcmUgaXQgZm9yIHVzZS4KICAqLwogdm9pZCBDb25maWdUeERtYVJlZ3Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKIAlzdHJ1Y3QgX1RYRE1BX3QgX19pb21lbSAqdHhkbWEgPSAmZXRkZXYtPnJlZ3MtPnR4ZG1hOwogCiAJLyogTG9hZCB0aGUgaGFyZHdhcmUgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZy4gKi8KLQl3cml0ZWwoKHVpbnQzMl90KSAoZXRkZXYtPlR4UmluZy5wVHhEZXNjUmluZ0FkanVzdGVkUGEgPj4gMzIpLAorCXdyaXRlbCgodTMyKSAoKHU2NClldGRldi0+dHhfcmluZy50eF9kZXNjX3JpbmdfcGEgPj4gMzIpLAogCSAgICAgICAmdHhkbWEtPnByX2Jhc2VfaGkpOwotCXdyaXRlbCgodWludDMyX3QpIGV0ZGV2LT5UeFJpbmcucFR4RGVzY1JpbmdBZGp1c3RlZFBhLAorCXdyaXRlbCgodTMyKSBldGRldi0+dHhfcmluZy50eF9kZXNjX3JpbmdfcGEsCiAJICAgICAgICZ0eGRtYS0+cHJfYmFzZV9sbyk7CiAKIAkvKiBJbml0aWFsaXNlIHRoZSB0cmFuc21pdCBETUEgZW5naW5lICovCi0Jd3JpdGVsKE5VTV9ERVNDX1BFUl9SSU5HX1RYIC0gMSwgJnR4ZG1hLT5wcl9udW1fZGVzLnZhbHVlKTsKKwl3cml0ZWwoTlVNX0RFU0NfUEVSX1JJTkdfVFggLSAxLCAmdHhkbWEtPnByX251bV9kZXMpOwogCi0JLyogTG9hZCB0aGUgY29tcGxldGlvbiB3cml0ZWJhY2sgcGh5c2ljYWwgYWRkcmVzcwotCSAqCi0JICogTk9URTogcGNpX2FsbG9jX2NvbnNpc3RlbnQoKSwgdXNlZCBhYm92ZSB0byBhbGxvYyBETUEgcmVnaW9ucywKLQkgKiBBTFdBWVMgcmV0dXJucyBTQUMgKDMyLWJpdCkgYWRkcmVzc2VzLiBJZiBEQUMgKDY0LWJpdCkgYWRkcmVzc2VzCi0JICogYXJlIGV2ZXIgcmV0dXJuZWQsIG1ha2Ugc3VyZSB0aGUgaGlnaCBwYXJ0IGlzIHJldHJpZXZlZCBoZXJlIGJlZm9yZQotCSAqIHN0b3JpbmcgdGhlIGFkanVzdGVkIGFkZHJlc3MuCi0JICovCi0Jd3JpdGVsKDAsICZ0eGRtYS0+ZG1hX3diX2Jhc2VfaGkpOwotCXdyaXRlbChldGRldi0+VHhSaW5nLnBUeFN0YXR1c1BhLCAmdHhkbWEtPmRtYV93Yl9iYXNlX2xvKTsKKwkvKiBMb2FkIHRoZSBjb21wbGV0aW9uIHdyaXRlYmFjayBwaHlzaWNhbCBhZGRyZXNzICovCisJd3JpdGVsKCh1MzIpKCh1NjQpZXRkZXYtPnR4X3JpbmcudHhfc3RhdHVzX3BhID4+IDMyKSwKKwkJCQkJCSZ0eGRtYS0+ZG1hX3diX2Jhc2VfaGkpOworCXdyaXRlbCgodTMyKWV0ZGV2LT50eF9yaW5nLnR4X3N0YXR1c19wYSwgJnR4ZG1hLT5kbWFfd2JfYmFzZV9sbyk7CiAKLQltZW1zZXQoZXRkZXYtPlR4UmluZy5wVHhTdGF0dXNWYSwgMCwgc2l6ZW9mKFRYX1NUQVRVU19CTE9DS190KSk7CisJKmV0ZGV2LT50eF9yaW5nLnR4X3N0YXR1cyA9IDA7CiAKIAl3cml0ZWwoMCwgJnR4ZG1hLT5zZXJ2aWNlX3JlcXVlc3QpOwotCWV0ZGV2LT5UeFJpbmcudHhEbWFSZWFkeVRvU2VuZCA9IDA7CisJZXRkZXYtPnR4X3Jpbmcuc2VuZF9pZHggPSAwOwogfQogCiAvKioKQEAgLTI3OSwxNiArMjQxLDExIEBACiAgKi8KIHZvaWQgZXQxMzF4X3R4X2RtYV9lbmFibGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKLQl1MzIgY3NyID0gRVRfVFhETUFfU05HTF9FUEtUOwotCWlmIChldGRldi0+UmVnaXN0cnlQaHlMb29wYmspCi0JCS8qIFR4RE1BIGlzIGRpc2FibGVkIGZvciBsb29wYmFjayBvcGVyYXRpb24uICovCi0JCWNzciB8PSBFVF9UWERNQV9DU1JfSEFMVDsKLQllbHNlCi0JCS8qIFNldHVwIHRoZSB0cmFuc21pdCBkbWEgY29uZmlndXJhdGlvbiByZWdpc3RlciBmb3Igbm9ybWFsCi0JCSAqIG9wZXJhdGlvbgotCQkgKi8KLQkJY3NyIHw9IFBBUk1fRE1BX0NBQ0hFX0RFRiA8PCBFVF9UWERNQV9DQUNIRV9TSElGVDsKLQl3cml0ZWwoY3NyLCAmZXRkZXYtPnJlZ3MtPnR4ZG1hLmNzcik7CisJLyogU2V0dXAgdGhlIHRyYW5zbWl0IGRtYSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGZvciBub3JtYWwKKwkgKiBvcGVyYXRpb24KKwkgKi8KKwl3cml0ZWwoRVRfVFhETUFfU05HTF9FUEtUfChQQVJNX0RNQV9DQUNIRV9ERUYgPDwgRVRfVFhETUFfQ0FDSEVfU0hJRlQpLAorCQkJCQkmZXRkZXYtPnJlZ3MtPnR4ZG1hLmNzcik7CiB9CiAKIC8qKgpAQCAtMjk3LDM5ICsyNTQsMzIgQEAKICAqLwogdm9pZCBldDEzMXhfaW5pdF9zZW5kKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlQTVBfVENCIHBNcFRjYjsKLQl1aW50MzJfdCBUY2JDb3VudDsKLQlUWF9SSU5HX3QgKnR4X3Jpbmc7CisJc3RydWN0IHRjYiAqdGNiOworCXUzMiBjdDsKKwlzdHJ1Y3QgdHhfcmluZyAqdHhfcmluZzsKIAogCS8qIFNldHVwIHNvbWUgY29udmVuaWVuY2UgcG9pbnRlcnMgKi8KLQl0eF9yaW5nID0gJmFkYXB0ZXItPlR4UmluZzsKLQlwTXBUY2IgPSBhZGFwdGVyLT5UeFJpbmcuTXBUY2JNZW07CisJdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nOworCXRjYiA9IGFkYXB0ZXItPnR4X3JpbmcudGNiX3Jpbmc7CiAKLQl0eF9yaW5nLT5UQ0JSZWFkeVF1ZXVlSGVhZCA9IHBNcFRjYjsKKwl0eF9yaW5nLT50Y2JfcWhlYWQgPSB0Y2I7CisKKwltZW1zZXQodGNiLCAwLCBzaXplb2Yoc3RydWN0IHRjYikgKiBOVU1fVENCKTsKIAogCS8qIEdvIHRocm91Z2ggYW5kIHNldCB1cCBlYWNoIFRDQiAqLwotCWZvciAoVGNiQ291bnQgPSAwOyBUY2JDb3VudCA8IE5VTV9UQ0I7IFRjYkNvdW50KyspIHsKLQkJbWVtc2V0KHBNcFRjYiwgMCwgc2l6ZW9mKE1QX1RDQikpOwotCisJZm9yIChjdCA9IDA7IGN0KysgPCBOVU1fVENCOyB0Y2IrKykKIAkJLyogU2V0IHRoZSBsaW5rIHBvaW50ZXIgaW4gSFcgVENCIHRvIHRoZSBuZXh0IFRDQiBpbiB0aGUKLQkJICogY2hhaW4uICBJZiB0aGlzIGlzIHRoZSBsYXN0IFRDQiBpbiB0aGUgY2hhaW4sIGFsc28gc2V0IHRoZQotCQkgKiB0YWlsIHBvaW50ZXIuCisJCSAqIGNoYWluCiAJCSAqLwotCQlpZiAoVGNiQ291bnQgPCBOVU1fVENCIC0gMSkgewotCQkJcE1wVGNiLT5OZXh0ID0gcE1wVGNiICsgMTsKLQkJfSBlbHNlIHsKLQkJCXR4X3JpbmctPlRDQlJlYWR5UXVldWVUYWlsID0gcE1wVGNiOwotCQkJcE1wVGNiLT5OZXh0ID0gKFBNUF9UQ0IpIE5VTEw7Ci0JCX0KKwkJdGNiLT5uZXh0ID0gdGNiICsgMTsKIAotCQlwTXBUY2IrKzsKLQl9Ci0KKwkvKiBTZXQgdGhlICB0YWlsIHBvaW50ZXIgKi8KKwl0Y2ItLTsKKwl0eF9yaW5nLT50Y2JfcXRhaWwgPSB0Y2I7CisJdGNiLT5uZXh0ID0gTlVMTDsKIAkvKiBDdXJyIHNlbmQgcXVldWUgc2hvdWxkIG5vdyBiZSBlbXB0eSAqLwotCXR4X3JpbmctPkN1cnJTZW5kSGVhZCA9IChQTVBfVENCKSBOVUxMOwotCXR4X3JpbmctPkN1cnJTZW5kVGFpbCA9IChQTVBfVENCKSBOVUxMOwotCi0JSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXItPlR4UmluZy5TZW5kV2FpdFF1ZXVlKTsKKwl0eF9yaW5nLT5zZW5kX2hlYWQgPSBOVUxMOworCXR4X3JpbmctPnNlbmRfdGFpbCA9IE5VTEw7CiB9CiAKIC8qKgpAQCAtMzUyLDkgKzMwMiw4IEBACiAJICogdG8gVHgsIHNvIHRoZSBQYWNrZXRDb3VudCBhbmQgaXQncyBhcnJheSB1c2VkIG1ha2VzIG5vIHNlbnNlIGhlcmUKIAkgKi8KIAotCS8qIFF1ZXVlIGlzIG5vdCBlbXB0eSBvciBUQ0IgaXMgbm90IGF2YWlsYWJsZSAqLwotCWlmICghbGlzdF9lbXB0eSgmZXRkZXYtPlR4UmluZy5TZW5kV2FpdFF1ZXVlKSB8fAotCSAgICBNUF9UQ0JfUkVTT1VSQ0VTX05PVF9BVkFJTEFCTEUoZXRkZXYpKSB7CisJLyogVENCIGlzIG5vdCBhdmFpbGFibGUgKi8KKwlpZiAoZXRkZXYtPnR4X3JpbmcudXNlZCA+PSBOVU1fVENCKSB7CiAJCS8qIE5PVEU6IElmIHRoZXJlJ3MgYW4gZXJyb3Igb24gc2VuZCwgbm8gbmVlZCB0byBxdWV1ZSB0aGUKIAkJICogcGFja2V0IHVuZGVyIExpbnV4OyBpZiB3ZSBqdXN0IHNlbmQgYW4gZXJyb3IgdXAgdG8gdGhlCiAJCSAqIG5ldGlmIGxheWVyLCBpdCB3aWxsIHJlc2VuZCB0aGUgc2tiIHRvIHVzLgpAQCAtMzY0LDI3ICszMTMsMTUgQEAKIAkJLyogV2UgbmVlZCB0byBzZWUgaWYgdGhlIGxpbmsgaXMgdXA7IGlmIGl0J3Mgbm90LCBtYWtlIHRoZQogCQkgKiBuZXRpZiBsYXllciB0aGluayB3ZSdyZSBnb29kIGFuZCBkcm9wIHRoZSBwYWNrZXQKIAkJICovCi0JCS8qCi0JCSAqIGlmKCBNUF9TSE9VTERfRkFJTF9TRU5EKCBldGRldiApIHx8Ci0JCSAqICBldGRldi0+RHJpdmVyTm9QaHlBY2Nlc3MgKQotCQkgKi8KLQkJaWYgKE1QX1NIT1VMRF9GQUlMX1NFTkQoZXRkZXYpIHx8IGV0ZGV2LT5Ecml2ZXJOb1BoeUFjY2VzcwotCQkgICAgfHwgIW5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgeworCQlpZiAoKGV0ZGV2LT5GbGFncyAmIGZNUF9BREFQVEVSX0ZBSUxfU0VORF9NQVNLKSB8fAorCQkJCQkhbmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CiAJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQkJc2tiID0gTlVMTDsKIAogCQkJZXRkZXYtPm5ldF9zdGF0cy50eF9kcm9wcGVkKys7CiAJCX0gZWxzZSB7CiAJCQlzdGF0dXMgPSBldDEzMXhfc2VuZF9wYWNrZXQoc2tiLCBldGRldik7Ci0KLQkJCWlmIChzdGF0dXMgPT0gLUVOT01FTSkgewotCi0JCQkJLyogTk9URTogSWYgdGhlcmUncyBhbiBlcnJvciBvbiBzZW5kLCBubyBuZWVkCi0JCQkJICogdG8gcXVldWUgdGhlIHBhY2tldCB1bmRlciBMaW51eDsgaWYgd2UganVzdAotCQkJCSAqIHNlbmQgYW4gZXJyb3IgdXAgdG8gdGhlIG5ldGlmIGxheWVyLCBpdAotCQkJCSAqIHdpbGwgcmVzZW5kIHRoZSBza2IgdG8gdXMuCi0JCQkJICovCi0JCQl9IGVsc2UgaWYgKHN0YXR1cyAhPSAwKSB7CisJCQlpZiAoc3RhdHVzICE9IDAgJiYgc3RhdHVzICE9IC1FTk9NRU0pIHsKIAkJCQkvKiBPbiBhbnkgb3RoZXIgZXJyb3IsIG1ha2UgbmV0aWYgdGhpbmsgd2UncmUKIAkJCQkgKiBPSyBhbmQgZHJvcCB0aGUgcGFja2V0CiAJCQkJICovCkBAIC00MDksODcgKzM0Niw4MyBAQAogc3RhdGljIGludCBldDEzMXhfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgIHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCiB7Ci0JaW50IHN0YXR1cyA9IDA7Ci0JUE1QX1RDQiBwTXBUY2IgPSBOVUxMOwotCXVpbnQxNl90ICpzaGJ1ZnZhOworCWludCBzdGF0dXM7CisJc3RydWN0IHRjYiAqdGNiID0gTlVMTDsKKwl1MTYgKnNoYnVmdmE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIEFsbCBwYWNrZXRzIG11c3QgaGF2ZSBhdCBsZWFzdCBhIE1BQyBhZGRyZXNzIGFuZCBhIHByb3RvY29sIHR5cGUgKi8KLQlpZiAoc2tiLT5sZW4gPCBFVEhfSExFTikgeworCWlmIChza2ItPmxlbiA8IEVUSF9ITEVOKQogCQlyZXR1cm4gLUVJTzsKLQl9CiAKIAkvKiBHZXQgYSBUQ0IgZm9yIHRoaXMgcGFja2V0ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5UQ0JSZWFkeVFMb2NrLCBmbGFncyk7CiAKLQlwTXBUY2IgPSBldGRldi0+VHhSaW5nLlRDQlJlYWR5UXVldWVIZWFkOworCXRjYiA9IGV0ZGV2LT50eF9yaW5nLnRjYl9xaGVhZDsKIAotCWlmIChwTXBUY2IgPT0gTlVMTCkgeworCWlmICh0Y2IgPT0gTlVMTCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+VENCUmVhZHlRTG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlldGRldi0+VHhSaW5nLlRDQlJlYWR5UXVldWVIZWFkID0gcE1wVGNiLT5OZXh0OworCWV0ZGV2LT50eF9yaW5nLnRjYl9xaGVhZCA9IHRjYi0+bmV4dDsKIAotCWlmIChldGRldi0+VHhSaW5nLlRDQlJlYWR5UXVldWVIZWFkID09IE5VTEwpCi0JCWV0ZGV2LT5UeFJpbmcuVENCUmVhZHlRdWV1ZVRhaWwgPSBOVUxMOworCWlmIChldGRldi0+dHhfcmluZy50Y2JfcWhlYWQgPT0gTlVMTCkKKwkJZXRkZXYtPnR4X3JpbmcudGNiX3F0YWlsID0gTlVMTDsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5UQ0JSZWFkeVFMb2NrLCBmbGFncyk7CiAKLQlwTXBUY2ItPlBhY2tldExlbmd0aCA9IHNrYi0+bGVuOwotCXBNcFRjYi0+UGFja2V0ID0gc2tiOworCXRjYi0+c2tiID0gc2tiOwogCi0JaWYgKChza2ItPmRhdGEgIT0gTlVMTCkgJiYgKChza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW4pID49IDYpKSB7Ci0JCXNoYnVmdmEgPSAodWludDE2X3QgKikgc2tiLT5kYXRhOworCWlmIChza2ItPmRhdGEgIT0gTlVMTCAmJiBza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW4gPj0gNikgeworCQlzaGJ1ZnZhID0gKHUxNiAqKSBza2ItPmRhdGE7CiAKIAkJaWYgKChzaGJ1ZnZhWzBdID09IDB4ZmZmZikgJiYKIAkJICAgIChzaGJ1ZnZhWzFdID09IDB4ZmZmZikgJiYgKHNoYnVmdmFbMl0gPT0gMHhmZmZmKSkgewotCQkJcE1wVGNiLT5GbGFncyB8PSBmTVBfREVTVF9CUk9BRDsKKwkJCXRjYi0+ZmxhZ3MgfD0gZk1QX0RFU1RfQlJPQUQ7CiAJCX0gZWxzZSBpZiAoKHNoYnVmdmFbMF0gJiAweDMpID09IDB4MDAwMSkgewotCQkJcE1wVGNiLT5GbGFncyB8PSAgZk1QX0RFU1RfTVVMVEk7CisJCQl0Y2ItPmZsYWdzIHw9ICBmTVBfREVTVF9NVUxUSTsKIAkJfQogCX0KIAotCXBNcFRjYi0+TmV4dCA9IE5VTEw7CisJdGNiLT5uZXh0ID0gTlVMTDsKIAogCS8qIENhbGwgdGhlIE5JQyBzcGVjaWZpYyBzZW5kIGhhbmRsZXIuICovCi0JaWYgKHN0YXR1cyA9PSAwKQotCQlzdGF0dXMgPSBuaWNfc2VuZF9wYWNrZXQoZXRkZXYsIHBNcFRjYik7CisJc3RhdHVzID0gbmljX3NlbmRfcGFja2V0KGV0ZGV2LCB0Y2IpOwogCiAJaWYgKHN0YXR1cyAhPSAwKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZldGRldi0+VENCUmVhZHlRTG9jaywgZmxhZ3MpOwogCi0JCWlmIChldGRldi0+VHhSaW5nLlRDQlJlYWR5UXVldWVUYWlsKSB7Ci0JCQlldGRldi0+VHhSaW5nLlRDQlJlYWR5UXVldWVUYWlsLT5OZXh0ID0gcE1wVGNiOwotCQl9IGVsc2UgeworCQlpZiAoZXRkZXYtPnR4X3JpbmcudGNiX3F0YWlsKQorCQkJZXRkZXYtPnR4X3JpbmcudGNiX3F0YWlsLT5uZXh0ID0gdGNiOworCQllbHNlCiAJCQkvKiBBcHBhcmVudGx5IHJlYWR5IFEgaXMgZW1wdHkuICovCi0JCQlldGRldi0+VHhSaW5nLlRDQlJlYWR5UXVldWVIZWFkID0gcE1wVGNiOwotCQl9CisJCQlldGRldi0+dHhfcmluZy50Y2JfcWhlYWQgPSB0Y2I7CiAKLQkJZXRkZXYtPlR4UmluZy5UQ0JSZWFkeVF1ZXVlVGFpbCA9IHBNcFRjYjsKKwkJZXRkZXYtPnR4X3JpbmcudGNiX3F0YWlsID0gdGNiOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+VENCUmVhZHlRTG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KLQlXQVJOX09OKGV0ZGV2LT5UeFJpbmcubkJ1c3lTZW5kID4gTlVNX1RDQik7CisJV0FSTl9PTihldGRldi0+dHhfcmluZy51c2VkID4gTlVNX1RDQik7CiAJcmV0dXJuIDA7CiB9CiAKIC8qKgogICogbmljX3NlbmRfcGFja2V0IC0gTklDIHNwZWNpZmljIHNlbmQgaGFuZGxlciBmb3IgdmVyc2lvbiBCIHNpbGljb24uCiAgKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAqIEBwTXBUY2I6IHBvaW50ZXIgdG8gTVBfVENCCisgKiBAdGNiOiBwb2ludGVyIHRvIHN0cnVjdCB0Y2IKICAqCiAgKiBSZXR1cm5zIDAgb3IgZXJybm8uCiAgKi8KLXN0YXRpYyBpbnQgbmljX3NlbmRfcGFja2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIFBNUF9UQ0IgcE1wVGNiKQorc3RhdGljIGludCBuaWNfc2VuZF9wYWNrZXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgc3RydWN0IHRjYiAqdGNiKQogewotCXVpbnQzMl90IGxvb3BJbmRleDsKLQlUWF9ERVNDX0VOVFJZX3QgQ3VyRGVzY1syNF07Ci0JdWludDMyX3QgRnJhZ21lbnROdW1iZXIgPSAwOwotCXVpbnQzMl90IHRoaXNjb3B5LCByZW1haW5kZXI7Ci0Jc3RydWN0IHNrX2J1ZmYgKnBQYWNrZXQgPSBwTXBUY2ItPlBhY2tldDsKLQl1aW50MzJfdCBGcmFnTGlzdENvdW50ID0gc2tiX3NoaW5mbyhwUGFja2V0KS0+bnJfZnJhZ3MgKyAxOwotCXN0cnVjdCBza2JfZnJhZ19zdHJ1Y3QgKnBGcmFnTGlzdCA9ICZza2Jfc2hpbmZvKHBQYWNrZXQpLT5mcmFnc1swXTsKKwl1MzIgaTsKKwlzdHJ1Y3QgdHhfZGVzYyBkZXNjWzI0XTsJLyogMjQgeCAxNiBieXRlICovCisJdTMyIGZyYWcgPSAwOworCXUzMiB0aGlzY29weSwgcmVtYWluZGVyOworCXN0cnVjdCBza19idWZmICpza2IgPSB0Y2ItPnNrYjsKKwl1MzIgbnJfZnJhZ3MgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMTsKKwlzdHJ1Y3Qgc2tiX2ZyYWdfc3RydWN0ICpmcmFncyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBQYXJ0IG9mIHRoZSBvcHRpbWl6YXRpb25zIG9mIHRoaXMgc2VuZCByb3V0aW5lIHJlc3RyaWN0IHVzIHRvCkBAIC01MDAsMTcgKzQzMywxNiBAQAogCSAqIG51bWJlciBvZiBmcmFnbWVudHMuIElmIG5lZWRlZCwgd2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiwKIAkgKiBhbHRob3VnaCBpdCBpcyBsZXNzIGVmZmljaWVudC4KIAkgKi8KLQlpZiAoRnJhZ0xpc3RDb3VudCA+IDIzKSB7CisJaWYgKG5yX2ZyYWdzID4gMjMpCiAJCXJldHVybiAtRUlPOwotCX0KIAotCW1lbXNldChDdXJEZXNjLCAwLCBzaXplb2YoVFhfREVTQ19FTlRSWV90KSAqIChGcmFnTGlzdENvdW50ICsgMSkpOworCW1lbXNldChkZXNjLCAwLCBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpICogKG5yX2ZyYWdzICsgMSkpOwogCi0JZm9yIChsb29wSW5kZXggPSAwOyBsb29wSW5kZXggPCBGcmFnTGlzdENvdW50OyBsb29wSW5kZXgrKykgeworCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsgaSsrKSB7CiAJCS8qIElmIHRoZXJlIGlzIHNvbWV0aGluZyBpbiB0aGlzIGVsZW1lbnQsIGxldHMgZ2V0IGEKIAkJICogZGVzY3JpcHRvciBmcm9tIHRoZSByaW5nIGFuZCBnZXQgdGhlIG5lY2Vzc2FyeSBkYXRhCiAJCSAqLwotCQlpZiAobG9vcEluZGV4ID09IDApIHsKKwkJaWYgKGkgPT0gMCkgewogCQkJLyogSWYgdGhlIGZyYWdtZW50cyBhcmUgc21hbGxlciB0aGFuIGEgc3RhbmRhcmQgTVRVLAogCQkJICogdGhlbiBtYXAgdGhlbSB0byBhIHNpbmdsZSBkZXNjcmlwdG9yIGluIHRoZSBUeAogCQkJICogRGVzYyByaW5nLiBIb3dldmVyLCBpZiB0aGV5J3JlIGxhcmdlciwgYXMgaXMKQEAgLTUyMCwxNjYgKzQ1MiwxNjQgQEAKIAkJCSAqIFRoaXMgd2lsbCB3b3JrIHVudGlsIHdlIGRldGVybWluZSB3aHkgdGhlIGhhcmR3YXJlCiAJCQkgKiBkb2Vzbid0IHNlZW0gdG8gbGlrZSBsYXJnZSBmcmFnbWVudHMuCiAJCQkgKi8KLQkJCWlmICgocFBhY2tldC0+bGVuIC0gcFBhY2tldC0+ZGF0YV9sZW4pIDw9IDE1MTQpIHsKLQkJCQlDdXJEZXNjW0ZyYWdtZW50TnVtYmVyXS5EYXRhQnVmZmVyUHRySGlnaCA9IDA7Ci0JCQkJQ3VyRGVzY1tGcmFnbWVudE51bWJlcl0ud29yZDIuYml0cy4KLQkJCQkgICAgbGVuZ3RoX2luX2J5dGVzID0KLQkJCQkgICAgcFBhY2tldC0+bGVuIC0gcFBhY2tldC0+ZGF0YV9sZW47CisJCQlpZiAoKHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbikgPD0gMTUxNCkgeworCQkJCWRlc2NbZnJhZ10uYWRkcl9oaSA9IDA7CisJCQkJLyogTG93IDE2Yml0cyBhcmUgbGVuZ3RoLCBoaWdoIGlzIHZsYW4gYW5kCisJCQkJICAgdW51c2VkIGN1cnJlbnRseSBzbyB6ZXJvICovCisJCQkJZGVzY1tmcmFnXS5sZW5fdmxhbiA9CisJCQkJCXNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbjsKIAogCQkJCS8qIE5PVEU6IEhlcmUsIHRoZSBkbWFfYWRkcl90IHJldHVybmVkIGZyb20KIAkJCQkgKiBwY2lfbWFwX3NpbmdsZSgpIGlzIGltcGxpY2l0bHkgY2FzdCBhcyBhCi0JCQkJICogdWludDMyX3QuIEFsdGhvdWdoIGRtYV9hZGRyX3QgY2FuIGJlCisJCQkJICogdTMyLiBBbHRob3VnaCBkbWFfYWRkcl90IGNhbiBiZQogCQkJCSAqIDY0LWJpdCwgdGhlIGFkZHJlc3MgcmV0dXJuZWQgYnkKIAkJCQkgKiBwY2lfbWFwX3NpbmdsZSgpIGlzIGFsd2F5cyAzMi1iaXQKIAkJCQkgKiBhZGRyZXNzYWJsZSAoYXMgZGVmaW5lZCBieSB0aGUgcGNpL2RtYQogCQkJCSAqIHN1YnN5c3RlbSkKIAkJCQkgKi8KLQkJCQlDdXJEZXNjW0ZyYWdtZW50TnVtYmVyKytdLkRhdGFCdWZmZXJQdHJMb3cgPQorCQkJCWRlc2NbZnJhZysrXS5hZGRyX2xvID0KIAkJCQkgICAgcGNpX21hcF9zaW5nbGUoZXRkZXYtPnBkZXYsCi0JCQkJCQkgICBwUGFja2V0LT5kYXRhLAotCQkJCQkJICAgcFBhY2tldC0+bGVuIC0KLQkJCQkJCSAgIHBQYWNrZXQtPmRhdGFfbGVuLAorCQkJCQkJICAgc2tiLT5kYXRhLAorCQkJCQkJICAgc2tiLT5sZW4gLQorCQkJCQkJICAgc2tiLT5kYXRhX2xlbiwKIAkJCQkJCSAgIFBDSV9ETUFfVE9ERVZJQ0UpOwogCQkJfSBlbHNlIHsKLQkJCQlDdXJEZXNjW0ZyYWdtZW50TnVtYmVyXS5EYXRhQnVmZmVyUHRySGlnaCA9IDA7Ci0JCQkJQ3VyRGVzY1tGcmFnbWVudE51bWJlcl0ud29yZDIuYml0cy4KLQkJCQkgICAgbGVuZ3RoX2luX2J5dGVzID0KLQkJCQkgICAgKChwUGFja2V0LT5sZW4gLSBwUGFja2V0LT5kYXRhX2xlbikgLyAyKTsKKwkJCQlkZXNjW2ZyYWddLmFkZHJfaGkgPSAwOworCQkJCWRlc2NbZnJhZ10ubGVuX3ZsYW4gPQorCQkJCSAgICAoc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuKSAvIDI7CiAKIAkJCQkvKiBOT1RFOiBIZXJlLCB0aGUgZG1hX2FkZHJfdCByZXR1cm5lZCBmcm9tCiAJCQkJICogcGNpX21hcF9zaW5nbGUoKSBpcyBpbXBsaWNpdGx5IGNhc3QgYXMgYQotCQkJCSAqIHVpbnQzMl90LiBBbHRob3VnaCBkbWFfYWRkcl90IGNhbiBiZQorCQkJCSAqIHUzMi4gQWx0aG91Z2ggZG1hX2FkZHJfdCBjYW4gYmUKIAkJCQkgKiA2NC1iaXQsIHRoZSBhZGRyZXNzIHJldHVybmVkIGJ5CiAJCQkJICogcGNpX21hcF9zaW5nbGUoKSBpcyBhbHdheXMgMzItYml0CiAJCQkJICogYWRkcmVzc2FibGUgKGFzIGRlZmluZWQgYnkgdGhlIHBjaS9kbWEKIAkJCQkgKiBzdWJzeXN0ZW0pCiAJCQkJICovCi0JCQkJQ3VyRGVzY1tGcmFnbWVudE51bWJlcisrXS5EYXRhQnVmZmVyUHRyTG93ID0KKwkJCQlkZXNjW2ZyYWcrK10uYWRkcl9sbyA9CiAJCQkJICAgIHBjaV9tYXBfc2luZ2xlKGV0ZGV2LT5wZGV2LAotCQkJCQkJICAgcFBhY2tldC0+ZGF0YSwKLQkJCQkJCSAgICgocFBhY2tldC0+bGVuIC0KLQkJCQkJCSAgICAgcFBhY2tldC0+ZGF0YV9sZW4pIC8gMiksCisJCQkJCQkgICBza2ItPmRhdGEsCisJCQkJCQkgICAoKHNrYi0+bGVuIC0KKwkJCQkJCSAgICAgc2tiLT5kYXRhX2xlbikgLyAyKSwKIAkJCQkJCSAgIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCUN1ckRlc2NbRnJhZ21lbnROdW1iZXJdLkRhdGFCdWZmZXJQdHJIaWdoID0gMDsKKwkJCQlkZXNjW2ZyYWddLmFkZHJfaGkgPSAwOwogCi0JCQkJQ3VyRGVzY1tGcmFnbWVudE51bWJlcl0ud29yZDIuYml0cy4KLQkJCQkgICAgbGVuZ3RoX2luX2J5dGVzID0KLQkJCQkgICAgKChwUGFja2V0LT5sZW4gLSBwUGFja2V0LT5kYXRhX2xlbikgLyAyKTsKKwkJCQlkZXNjW2ZyYWddLmxlbl92bGFuID0KKwkJCQkgICAgKHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbikgLyAyOwogCiAJCQkJLyogTk9URTogSGVyZSwgdGhlIGRtYV9hZGRyX3QgcmV0dXJuZWQgZnJvbQogCQkJCSAqIHBjaV9tYXBfc2luZ2xlKCkgaXMgaW1wbGljaXRseSBjYXN0IGFzIGEKLQkJCQkgKiB1aW50MzJfdC4gQWx0aG91Z2ggZG1hX2FkZHJfdCBjYW4gYmUKKwkJCQkgKiB1MzIuIEFsdGhvdWdoIGRtYV9hZGRyX3QgY2FuIGJlCiAJCQkJICogNjQtYml0LCB0aGUgYWRkcmVzcyByZXR1cm5lZCBieQogCQkJCSAqIHBjaV9tYXBfc2luZ2xlKCkgaXMgYWx3YXlzIDMyLWJpdAogCQkJCSAqIGFkZHJlc3NhYmxlIChhcyBkZWZpbmVkIGJ5IHRoZSBwY2kvZG1hCiAJCQkJICogc3Vic3lzdGVtKQogCQkJCSAqLwotCQkJCUN1ckRlc2NbRnJhZ21lbnROdW1iZXIrK10uRGF0YUJ1ZmZlclB0ckxvdyA9CisJCQkJZGVzY1tmcmFnKytdLmFkZHJfbG8gPQogCQkJCSAgICBwY2lfbWFwX3NpbmdsZShldGRldi0+cGRldiwKLQkJCQkJCSAgIHBQYWNrZXQtPmRhdGEgKwotCQkJCQkJICAgKChwUGFja2V0LT5sZW4gLQotCQkJCQkJICAgICBwUGFja2V0LT5kYXRhX2xlbikgLyAyKSwKLQkJCQkJCSAgICgocFBhY2tldC0+bGVuIC0KLQkJCQkJCSAgICAgcFBhY2tldC0+ZGF0YV9sZW4pIC8gMiksCisJCQkJCQkgICBza2ItPmRhdGEgKworCQkJCQkJICAgKChza2ItPmxlbiAtCisJCQkJCQkgICAgIHNrYi0+ZGF0YV9sZW4pIC8gMiksCisJCQkJCQkgICAoKHNrYi0+bGVuIC0KKwkJCQkJCSAgICAgc2tiLT5kYXRhX2xlbikgLyAyKSwKIAkJCQkJCSAgIFBDSV9ETUFfVE9ERVZJQ0UpOwogCQkJfQogCQl9IGVsc2UgewotCQkJQ3VyRGVzY1tGcmFnbWVudE51bWJlcl0uRGF0YUJ1ZmZlclB0ckhpZ2ggPSAwOwotCQkJQ3VyRGVzY1tGcmFnbWVudE51bWJlcl0ud29yZDIuYml0cy5sZW5ndGhfaW5fYnl0ZXMgPQotCQkJICAgIHBGcmFnTGlzdFtsb29wSW5kZXggLSAxXS5zaXplOworCQkJZGVzY1tmcmFnXS5hZGRyX2hpID0gMDsKKwkJCWRlc2NbZnJhZ10ubGVuX3ZsYW4gPQorCQkJCQlmcmFnc1tpIC0gMV0uc2l6ZTsKIAogCQkJLyogTk9URTogSGVyZSwgdGhlIGRtYV9hZGRyX3QgcmV0dXJuZWQgZnJvbQotCQkJICogcGNpX21hcF9wYWdlKCkgaXMgaW1wbGljaXRseSBjYXN0IGFzIGEgdWludDMyX3QuCisJCQkgKiBwY2lfbWFwX3BhZ2UoKSBpcyBpbXBsaWNpdGx5IGNhc3QgYXMgYSB1MzIuCiAJCQkgKiBBbHRob3VnaCBkbWFfYWRkcl90IGNhbiBiZSA2NC1iaXQsIHRoZSBhZGRyZXNzCiAJCQkgKiByZXR1cm5lZCBieSBwY2lfbWFwX3BhZ2UoKSBpcyBhbHdheXMgMzItYml0CiAJCQkgKiBhZGRyZXNzYWJsZSAoYXMgZGVmaW5lZCBieSB0aGUgcGNpL2RtYSBzdWJzeXN0ZW0pCiAJCQkgKi8KLQkJCUN1ckRlc2NbRnJhZ21lbnROdW1iZXIrK10uRGF0YUJ1ZmZlclB0ckxvdyA9CisJCQlkZXNjW2ZyYWcrK10uYWRkcl9sbyA9CiAJCQkgICAgcGNpX21hcF9wYWdlKGV0ZGV2LT5wZGV2LAotCQkJCQkgcEZyYWdMaXN0W2xvb3BJbmRleCAtIDFdLnBhZ2UsCi0JCQkJCSBwRnJhZ0xpc3RbbG9vcEluZGV4IC0gMV0ucGFnZV9vZmZzZXQsCi0JCQkJCSBwRnJhZ0xpc3RbbG9vcEluZGV4IC0gMV0uc2l6ZSwKKwkJCQkJIGZyYWdzW2kgLSAxXS5wYWdlLAorCQkJCQkgZnJhZ3NbaSAtIDFdLnBhZ2Vfb2Zmc2V0LAorCQkJCQkgZnJhZ3NbaSAtIDFdLnNpemUsCiAJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKIAkJfQogCX0KIAotCWlmIChGcmFnbWVudE51bWJlciA9PSAwKQorCWlmIChmcmFnID09IDApCiAJCXJldHVybiAtRUlPOwogCiAJaWYgKGV0ZGV2LT5saW5rc3BlZWQgPT0gVFJVRVBIWV9TUEVFRF8xMDAwTUJQUykgewotCQlpZiAoKytldGRldi0+VHhSaW5nLlR4UGFja2V0c1NpbmNlTGFzdGludGVycnVwdCA9PQotCQkgICAgUEFSTV9UWF9OVU1fQlVGU19ERUYpIHsKLQkJCUN1ckRlc2NbRnJhZ21lbnROdW1iZXIgLSAxXS53b3JkMy52YWx1ZSA9IDB4NTsKLQkJCWV0ZGV2LT5UeFJpbmcuVHhQYWNrZXRzU2luY2VMYXN0aW50ZXJydXB0ID0gMDsKLQkJfSBlbHNlIHsKLQkJCUN1ckRlc2NbRnJhZ21lbnROdW1iZXIgLSAxXS53b3JkMy52YWx1ZSA9IDB4MTsKKwkJaWYgKCsrZXRkZXYtPnR4X3Jpbmcuc2luY2VfaXJxID09IFBBUk1fVFhfTlVNX0JVRlNfREVGKSB7CisJCQkvKiBMYXN0IGVsZW1lbnQgJiBJbnRlcnJ1cHQgZmxhZyAqLworCQkJZGVzY1tmcmFnIC0gMV0uZmxhZ3MgPSAweDU7CisJCQlldGRldi0+dHhfcmluZy5zaW5jZV9pcnEgPSAwOworCQl9IGVsc2UgeyAvKiBMYXN0IGVsZW1lbnQgKi8KKwkJCWRlc2NbZnJhZyAtIDFdLmZsYWdzID0gMHgxOwogCQl9Ci0JfSBlbHNlIHsKLQkJQ3VyRGVzY1tGcmFnbWVudE51bWJlciAtIDFdLndvcmQzLnZhbHVlID0gMHg1OwotCX0KKwl9IGVsc2UKKwkJZGVzY1tmcmFnIC0gMV0uZmxhZ3MgPSAweDU7CiAKLQlDdXJEZXNjWzBdLndvcmQzLmJpdHMuZiA9IDE7CisJZGVzY1swXS5mbGFncyB8PSAyOwkvKiBGaXJzdCBlbGVtZW50IGZsYWcgKi8KIAotCXBNcFRjYi0+V3JJbmRleFN0YXJ0ID0gZXRkZXYtPlR4UmluZy50eERtYVJlYWR5VG9TZW5kOwotCXBNcFRjYi0+UGFja2V0U3RhbGVDb3VudCA9IDA7CisJdGNiLT5pbmRleF9zdGFydCA9IGV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4OworCXRjYi0+c3RhbGUgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5TZW5kSFdMb2NrLCBmbGFncyk7CiAKIAl0aGlzY29weSA9IE5VTV9ERVNDX1BFUl9SSU5HX1RYIC0KLQkJCQlJTkRFWDEwKGV0ZGV2LT5UeFJpbmcudHhEbWFSZWFkeVRvU2VuZCk7CisJCQkJSU5ERVgxMChldGRldi0+dHhfcmluZy5zZW5kX2lkeCk7CiAKLQlpZiAodGhpc2NvcHkgPj0gRnJhZ21lbnROdW1iZXIpIHsKKwlpZiAodGhpc2NvcHkgPj0gZnJhZykgewogCQlyZW1haW5kZXIgPSAwOwotCQl0aGlzY29weSA9IEZyYWdtZW50TnVtYmVyOworCQl0aGlzY29weSA9IGZyYWc7CiAJfSBlbHNlIHsKLQkJcmVtYWluZGVyID0gRnJhZ21lbnROdW1iZXIgLSB0aGlzY29weTsKKwkJcmVtYWluZGVyID0gZnJhZyAtIHRoaXNjb3B5OwogCX0KIAotCW1lbWNweShldGRldi0+VHhSaW5nLnBUeERlc2NSaW5nVmEgKwotCSAgICAgICBJTkRFWDEwKGV0ZGV2LT5UeFJpbmcudHhEbWFSZWFkeVRvU2VuZCksIEN1ckRlc2MsCi0JICAgICAgIHNpemVvZihUWF9ERVNDX0VOVFJZX3QpICogdGhpc2NvcHkpOworCW1lbWNweShldGRldi0+dHhfcmluZy50eF9kZXNjX3JpbmcgKworCSAgICAgICBJTkRFWDEwKGV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4KSwgZGVzYywKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIHRoaXNjb3B5KTsKIAotCWFkZF8xMGJpdCgmZXRkZXYtPlR4UmluZy50eERtYVJlYWR5VG9TZW5kLCB0aGlzY29weSk7CisJYWRkXzEwYml0KCZldGRldi0+dHhfcmluZy5zZW5kX2lkeCwgdGhpc2NvcHkpOwogCi0JaWYgKElOREVYMTAoZXRkZXYtPlR4UmluZy50eERtYVJlYWR5VG9TZW5kKT09IDAgfHwKLQkgICAgSU5ERVgxMChldGRldi0+VHhSaW5nLnR4RG1hUmVhZHlUb1NlbmQpID09IE5VTV9ERVNDX1BFUl9SSU5HX1RYKSB7Ci0JICAgICAJZXRkZXYtPlR4UmluZy50eERtYVJlYWR5VG9TZW5kICY9IH5FVF9ETUExMF9NQVNLOwotCSAgICAgCWV0ZGV2LT5UeFJpbmcudHhEbWFSZWFkeVRvU2VuZCBePSBFVF9ETUExMF9XUkFQOworCWlmIChJTkRFWDEwKGV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4KSA9PSAwIHx8CisJCSAgICBJTkRFWDEwKGV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4KSA9PSBOVU1fREVTQ19QRVJfUklOR19UWCkgeworCQlldGRldi0+dHhfcmluZy5zZW5kX2lkeCAmPSB+RVRfRE1BMTBfTUFTSzsKKwkJZXRkZXYtPnR4X3Jpbmcuc2VuZF9pZHggXj0gRVRfRE1BMTBfV1JBUDsKIAl9CiAKIAlpZiAocmVtYWluZGVyKSB7Ci0JCW1lbWNweShldGRldi0+VHhSaW5nLnBUeERlc2NSaW5nVmEsCi0JCSAgICAgICBDdXJEZXNjICsgdGhpc2NvcHksCi0JCSAgICAgICBzaXplb2YoVFhfREVTQ19FTlRSWV90KSAqIHJlbWFpbmRlcik7CisJCW1lbWNweShldGRldi0+dHhfcmluZy50eF9kZXNjX3JpbmcsCisJCSAgICAgICBkZXNjICsgdGhpc2NvcHksCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpICogcmVtYWluZGVyKTsKIAotCQlhZGRfMTBiaXQoJmV0ZGV2LT5UeFJpbmcudHhEbWFSZWFkeVRvU2VuZCwgcmVtYWluZGVyKTsKKwkJYWRkXzEwYml0KCZldGRldi0+dHhfcmluZy5zZW5kX2lkeCwgcmVtYWluZGVyKTsKIAl9CiAKLQlpZiAoSU5ERVgxMChldGRldi0+VHhSaW5nLnR4RG1hUmVhZHlUb1NlbmQpID09IDApIHsKLQkJaWYgKGV0ZGV2LT5UeFJpbmcudHhEbWFSZWFkeVRvU2VuZCkKLQkJCXBNcFRjYi0+V3JJbmRleCA9IE5VTV9ERVNDX1BFUl9SSU5HX1RYIC0gMTsKKwlpZiAoSU5ERVgxMChldGRldi0+dHhfcmluZy5zZW5kX2lkeCkgPT0gMCkgeworCQlpZiAoZXRkZXYtPnR4X3Jpbmcuc2VuZF9pZHgpCisJCQl0Y2ItPmluZGV4ID0gTlVNX0RFU0NfUEVSX1JJTkdfVFggLSAxOwogCQllbHNlCi0JCQlwTXBUY2ItPldySW5kZXg9IEVUX0RNQTEwX1dSQVAgfCAoTlVNX0RFU0NfUEVSX1JJTkdfVFggLSAxKTsKKwkJCXRjYi0+aW5kZXggPSBFVF9ETUExMF9XUkFQfChOVU1fREVTQ19QRVJfUklOR19UWCAtIDEpOwogCX0gZWxzZQotCQlwTXBUY2ItPldySW5kZXggPSBldGRldi0+VHhSaW5nLnR4RG1hUmVhZHlUb1NlbmQgLSAxOworCQl0Y2ItPmluZGV4ID0gZXRkZXYtPnR4X3Jpbmcuc2VuZF9pZHggLSAxOwogCiAJc3Bpbl9sb2NrKCZldGRldi0+VENCU2VuZFFMb2NrKTsKIAotCWlmIChldGRldi0+VHhSaW5nLkN1cnJTZW5kVGFpbCkKLQkJZXRkZXYtPlR4UmluZy5DdXJyU2VuZFRhaWwtPk5leHQgPSBwTXBUY2I7CisJaWYgKGV0ZGV2LT50eF9yaW5nLnNlbmRfdGFpbCkKKwkJZXRkZXYtPnR4X3Jpbmcuc2VuZF90YWlsLT5uZXh0ID0gdGNiOwogCWVsc2UKLQkJZXRkZXYtPlR4UmluZy5DdXJyU2VuZEhlYWQgPSBwTXBUY2I7CisJCWV0ZGV2LT50eF9yaW5nLnNlbmRfaGVhZCA9IHRjYjsKIAotCWV0ZGV2LT5UeFJpbmcuQ3VyclNlbmRUYWlsID0gcE1wVGNiOworCWV0ZGV2LT50eF9yaW5nLnNlbmRfdGFpbCA9IHRjYjsKIAotCVdBUk5fT04ocE1wVGNiLT5OZXh0ICE9IE5VTEwpOworCVdBUk5fT04odGNiLT5uZXh0ICE9IE5VTEwpOwogCi0JZXRkZXYtPlR4UmluZy5uQnVzeVNlbmQrKzsKKwlldGRldi0+dHhfcmluZy51c2VkKys7CiAKIAlzcGluX3VubG9jaygmZXRkZXYtPlRDQlNlbmRRTG9jayk7CiAKIAkvKiBXcml0ZSB0aGUgbmV3IHdyaXRlIHBvaW50ZXIgYmFjayB0byB0aGUgZGV2aWNlLiAqLwotCXdyaXRlbChldGRldi0+VHhSaW5nLnR4RG1hUmVhZHlUb1NlbmQsCisJd3JpdGVsKGV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4LAogCSAgICAgICAmZXRkZXYtPnJlZ3MtPnR4ZG1hLnNlcnZpY2VfcmVxdWVzdCk7CiAKIAkvKiBGb3IgR2lnIG9ubHksIHdlIHVzZSBUeCBJbnRlcnJ1cHQgY29hbGVzY2luZy4gIEVuYWJsZSB0aGUgc29mdHdhcmUKQEAgLTY5Niw3MiArNjI2LDcxIEBACiAKIAogLyoqCi0gKiBldDEzMXhfZnJlZV9zZW5kX3BhY2tldCAtIFJlY3ljbGUgYSBNUF9UQ0IsIGNvbXBsZXRlIHRoZSBwYWNrZXQgaWYgbmVjZXNzYXJ5CisgKiBldDEzMXhfZnJlZV9zZW5kX3BhY2tldCAtIFJlY3ljbGUgYSBzdHJ1Y3QgdGNiCiAgKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAqIEBwTXBUY2I6IHBvaW50ZXIgdG8gTVBfVENCCisgKiBAdGNiOiBwb2ludGVyIHRvIHN0cnVjdCB0Y2IKICAqCisgKiBDb21wbGV0ZSB0aGUgcGFja2V0IGlmIG5lY2Vzc2FyeQogICogQXNzdW1wdGlvbiAtIFNlbmQgc3BpbmxvY2sgaGFzIGJlZW4gYWNxdWlyZWQKICAqLwogaW5saW5lIHZvaWQgZXQxMzF4X2ZyZWVfc2VuZF9wYWNrZXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKLQkJCQkJCQlQTVBfVENCIHBNcFRjYikKKwkJCQkJCXN0cnVjdCB0Y2IgKnRjYikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCVRYX0RFU0NfRU5UUllfdCAqZGVzYyA9IE5VTEw7CisJc3RydWN0IHR4X2Rlc2MgKmRlc2MgPSBOVUxMOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZldGRldi0+bmV0X3N0YXRzOwogCi0JaWYgKHBNcFRjYi0+RmxhZ3MgJiBmTVBfREVTVF9CUk9BRCkKKwlpZiAodGNiLT5mbGFncyAmIGZNUF9ERVNUX0JST0FEKQogCQlhdG9taWNfaW5jKCZldGRldi0+U3RhdHMuYnJkY3N0eG10KTsKLQllbHNlIGlmIChwTXBUY2ItPkZsYWdzICYgZk1QX0RFU1RfTVVMVEkpCisJZWxzZSBpZiAodGNiLT5mbGFncyAmIGZNUF9ERVNUX01VTFRJKQogCQlhdG9taWNfaW5jKCZldGRldi0+U3RhdHMubXVsdGl4bXQpOwogCWVsc2UKIAkJYXRvbWljX2luYygmZXRkZXYtPlN0YXRzLnVuaXhtdCk7CiAKLQlpZiAocE1wVGNiLT5QYWNrZXQpIHsKLQkJc3RhdHMtPnR4X2J5dGVzICs9IHBNcFRjYi0+UGFja2V0LT5sZW47CisJaWYgKHRjYi0+c2tiKSB7CisJCXN0YXRzLT50eF9ieXRlcyArPSB0Y2ItPnNrYi0+bGVuOwogCiAJCS8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgVFggZGVzY3JpcHRvcnMgb24gdGhlIHJpbmcKIAkJICogY29ycmVzcG9uZGluZyB0byB0aGlzIHBhY2tldCBhbmQgdW1hcCB0aGUgZnJhZ21lbnRzCiAJCSAqIHRoZXkgcG9pbnQgdG8KIAkJICovCiAJCWRvIHsKLQkJCWRlc2MgPQotCQkJICAgIChUWF9ERVNDX0VOVFJZX3QgKikgKGV0ZGV2LT5UeFJpbmcucFR4RGVzY1JpbmdWYSArCi0JCQkgICAgCUlOREVYMTAocE1wVGNiLT5XckluZGV4U3RhcnQpKTsKKwkJCWRlc2MgPSAoc3RydWN0IHR4X2Rlc2MgKikoZXRkZXYtPnR4X3JpbmcudHhfZGVzY19yaW5nICsKKwkJCQkJCUlOREVYMTAodGNiLT5pbmRleF9zdGFydCkpOwogCiAJCQlwY2lfdW5tYXBfc2luZ2xlKGV0ZGV2LT5wZGV2LAotCQkJCQkgZGVzYy0+RGF0YUJ1ZmZlclB0ckxvdywKLQkJCQkJIGRlc2MtPndvcmQyLnZhbHVlLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQkJIGRlc2MtPmFkZHJfbG8sCisJCQkJCSBkZXNjLT5sZW5fdmxhbiwgUENJX0RNQV9UT0RFVklDRSk7CiAKLQkJCWFkZF8xMGJpdCgmcE1wVGNiLT5XckluZGV4U3RhcnQsIDEpOwotCQkJaWYgKElOREVYMTAocE1wVGNiLT5XckluZGV4U3RhcnQpID49Ci0JCQkgICAgTlVNX0RFU0NfUEVSX1JJTkdfVFgpIHsKLQkJCSAgICAJcE1wVGNiLT5XckluZGV4U3RhcnQgJj0gfkVUX0RNQTEwX01BU0s7Ci0JCQkgICAgCXBNcFRjYi0+V3JJbmRleFN0YXJ0IF49IEVUX0RNQTEwX1dSQVA7CisJCQlhZGRfMTBiaXQoJnRjYi0+aW5kZXhfc3RhcnQsIDEpOworCQkJaWYgKElOREVYMTAodGNiLT5pbmRleF9zdGFydCkgPj0KKwkJCQkJCQlOVU1fREVTQ19QRVJfUklOR19UWCkgeworCQkJCXRjYi0+aW5kZXhfc3RhcnQgJj0gfkVUX0RNQTEwX01BU0s7CisJCQkJdGNiLT5pbmRleF9zdGFydCBePSBFVF9ETUExMF9XUkFQOwogCQkJfQotCQl9IHdoaWxlIChkZXNjICE9IChldGRldi0+VHhSaW5nLnBUeERlc2NSaW5nVmEgKwotCQkJCUlOREVYMTAocE1wVGNiLT5XckluZGV4KSkpOworCQl9IHdoaWxlIChkZXNjICE9IChldGRldi0+dHhfcmluZy50eF9kZXNjX3JpbmcgKworCQkJCUlOREVYMTAodGNiLT5pbmRleCkpKTsKIAotCQlkZXZfa2ZyZWVfc2tiX2FueShwTXBUY2ItPlBhY2tldCk7CisJCWRldl9rZnJlZV9za2JfYW55KHRjYi0+c2tiKTsKIAl9CiAKLQltZW1zZXQocE1wVGNiLCAwLCBzaXplb2YoTVBfVENCKSk7CisJbWVtc2V0KHRjYiwgMCwgc2l6ZW9mKHN0cnVjdCB0Y2IpKTsKIAogCS8qIEFkZCB0aGUgVENCIHRvIHRoZSBSZWFkeSBRICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5UQ0JSZWFkeVFMb2NrLCBmbGFncyk7CiAKIAlldGRldi0+U3RhdHMub3BhY2tldHMrKzsKIAotCWlmIChldGRldi0+VHhSaW5nLlRDQlJlYWR5UXVldWVUYWlsKSB7Ci0JCWV0ZGV2LT5UeFJpbmcuVENCUmVhZHlRdWV1ZVRhaWwtPk5leHQgPSBwTXBUY2I7Ci0JfSBlbHNlIHsKKwlpZiAoZXRkZXYtPnR4X3JpbmcudGNiX3F0YWlsKQorCQlldGRldi0+dHhfcmluZy50Y2JfcXRhaWwtPm5leHQgPSB0Y2I7CisJZWxzZQogCQkvKiBBcHBhcmVudGx5IHJlYWR5IFEgaXMgZW1wdHkuICovCi0JCWV0ZGV2LT5UeFJpbmcuVENCUmVhZHlRdWV1ZUhlYWQgPSBwTXBUY2I7Ci0JfQorCQlldGRldi0+dHhfcmluZy50Y2JfcWhlYWQgPSB0Y2I7CiAKLQlldGRldi0+VHhSaW5nLlRDQlJlYWR5UXVldWVUYWlsID0gcE1wVGNiOworCWV0ZGV2LT50eF9yaW5nLnRjYl9xdGFpbCA9IHRjYjsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5UQ0JSZWFkeVFMb2NrLCBmbGFncyk7Ci0JV0FSTl9PTihldGRldi0+VHhSaW5nLm5CdXN5U2VuZCA8IDApOworCVdBUk5fT04oZXRkZXYtPnR4X3JpbmcudXNlZCA8IDApOwogfQogCiAvKioKQEAgLTc3Miw1MiArNzAxLDQwIEBACiAgKi8KIHZvaWQgZXQxMzF4X2ZyZWVfYnVzeV9zZW5kX3BhY2tldHMoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKLQlQTVBfVENCIHBNcFRjYjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwlzdHJ1Y3QgdGNiICp0Y2I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1aW50MzJfdCBGcmVlQ291bnRlciA9IDA7Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmV0ZGV2LT5UeFJpbmcuU2VuZFdhaXRRdWV1ZSkpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5TZW5kV2FpdExvY2ssIGZsYWdzKTsKLQotCQlldGRldi0+VHhSaW5nLm5XYWl0U2VuZC0tOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+U2VuZFdhaXRMb2NrLCBmbGFncyk7Ci0KLQkJZW50cnkgPSBldGRldi0+VHhSaW5nLlNlbmRXYWl0UXVldWUubmV4dDsKLQl9Ci0KLQlldGRldi0+VHhSaW5nLm5XYWl0U2VuZCA9IDA7CisJdTMyIGZyZWVkID0gMDsKIAogCS8qIEFueSBwYWNrZXRzIGJlaW5nIHNlbnQ/IENoZWNrIHRoZSBmaXJzdCBUQ0Igb24gdGhlIHNlbmQgbGlzdCAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZldGRldi0+VENCU2VuZFFMb2NrLCBmbGFncyk7CiAKLQlwTXBUY2IgPSBldGRldi0+VHhSaW5nLkN1cnJTZW5kSGVhZDsKKwl0Y2IgPSBldGRldi0+dHhfcmluZy5zZW5kX2hlYWQ7CiAKLQl3aGlsZSAoKHBNcFRjYiAhPSBOVUxMKSAmJiAoRnJlZUNvdW50ZXIgPCBOVU1fVENCKSkgewotCQlQTVBfVENCIHBOZXh0ID0gcE1wVGNiLT5OZXh0OworCXdoaWxlICh0Y2IgIT0gTlVMTCAmJiBmcmVlZCA8IE5VTV9UQ0IpIHsKKwkJc3RydWN0IHRjYiAqbmV4dCA9IHRjYi0+bmV4dDsKIAotCQlldGRldi0+VHhSaW5nLkN1cnJTZW5kSGVhZCA9IHBOZXh0OworCQlldGRldi0+dHhfcmluZy5zZW5kX2hlYWQgPSBuZXh0OwogCi0JCWlmIChwTmV4dCA9PSBOVUxMKQotCQkJZXRkZXYtPlR4UmluZy5DdXJyU2VuZFRhaWwgPSBOVUxMOworCQlpZiAobmV4dCA9PSBOVUxMKQorCQkJZXRkZXYtPnR4X3Jpbmcuc2VuZF90YWlsID0gTlVMTDsKIAotCQlldGRldi0+VHhSaW5nLm5CdXN5U2VuZC0tOworCQlldGRldi0+dHhfcmluZy51c2VkLS07CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPlRDQlNlbmRRTG9jaywgZmxhZ3MpOwogCi0JCUZyZWVDb3VudGVyKys7Ci0JCWV0MTMxeF9mcmVlX3NlbmRfcGFja2V0KGV0ZGV2LCBwTXBUY2IpOworCQlmcmVlZCsrOworCQlldDEzMXhfZnJlZV9zZW5kX3BhY2tldChldGRldiwgdGNiKTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXRkZXYtPlRDQlNlbmRRTG9jaywgZmxhZ3MpOwogCi0JCXBNcFRjYiA9IGV0ZGV2LT5UeFJpbmcuQ3VyclNlbmRIZWFkOworCQl0Y2IgPSBldGRldi0+dHhfcmluZy5zZW5kX2hlYWQ7CiAJfQogCi0JV0FSTl9PTihGcmVlQ291bnRlciA9PSBOVU1fVENCKTsKKwlXQVJOX09OKGZyZWVkID09IE5VTV9UQ0IpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPlRDQlNlbmRRTG9jaywgZmxhZ3MpOwogCi0JZXRkZXYtPlR4UmluZy5uQnVzeVNlbmQgPSAwOworCWV0ZGV2LT50eF9yaW5nLnVzZWQgPSAwOwogfQogCiAvKioKQEAgLTgzMSw5OSArNzQ4LDU2IEBACiAgKi8KIHZvaWQgZXQxMzF4X2hhbmRsZV9zZW5kX2ludGVycnVwdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewotCS8qIE1hcmsgYXMgY29tcGxldGVkIGFueSBwYWNrZXRzIHdoaWNoIGhhdmUgYmVlbiBzZW50IGJ5IHRoZSBkZXZpY2UuICovCi0JZXQxMzF4X3VwZGF0ZV90Y2JfbGlzdChldGRldik7Ci0KLQkvKiBJZiB3ZSBxdWV1ZWQgYW55IHRyYW5zbWl0cyBiZWNhdXNlIHdlIGRpZG4ndCBoYXZlIGFueSBUQ0JzIGVhcmxpZXIsCi0JICogZGVxdWV1ZSBhbmQgc2VuZCB0aG9zZSBwYWNrZXRzIG5vdywgYXMgbG9uZyBhcyB3ZSBoYXZlIGZyZWUgVENCcy4KLQkgKi8KLQlldDEzMXhfY2hlY2tfc2VuZF93YWl0X2xpc3QoZXRkZXYpOwotfQotCi0vKioKLSAqIGV0MTMxeF91cGRhdGVfdGNiX2xpc3QgLSBIZWxwZXIgcm91dGluZSBmb3IgU2VuZCBJbnRlcnJ1cHQgaGFuZGxlcgotICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gKgotICogUmUtY2xhaW1zIHRoZSBzZW5kIHJlc291cmNlcyBhbmQgY29tcGxldGVzIHNlbmRzLiAgQ2FuIGFsc28gYmUgY2FsbGVkIGFzCi0gKiBwYXJ0IG9mIHRoZSBOSUMgc2VuZCByb3V0aW5lIHdoZW4gdGhlICJTZXJ2aWNlQ29tcGxldGUiIGluZGljYXRpb24gaGFzCi0gKiB3cmFwcGVkLgotICovCi1zdGF0aWMgdm9pZCBldDEzMXhfdXBkYXRlX3RjYl9saXN0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCi17CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgU2VydmljZUNvbXBsZXRlOwotCVBNUF9UQ0IgcE1wVGNiOworCXUzMiBzZXJ2aWNlZDsKKwlzdHJ1Y3QgdGNiICp0Y2I7CiAJdTMyIGluZGV4OwogCi0JU2VydmljZUNvbXBsZXRlID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT50eGRtYS5OZXdTZXJ2aWNlQ29tcGxldGUpOwotCWluZGV4ID0gSU5ERVgxMChTZXJ2aWNlQ29tcGxldGUpOworCXNlcnZpY2VkID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT50eGRtYS5OZXdTZXJ2aWNlQ29tcGxldGUpOworCWluZGV4ID0gSU5ERVgxMChzZXJ2aWNlZCk7CiAKIAkvKiBIYXMgdGhlIHJpbmcgd3JhcHBlZD8gIFByb2Nlc3MgYW55IGRlc2NyaXB0b3JzIHRoYXQgZG8gbm90IGhhdmUKIAkgKiB0aGUgc2FtZSAid3JhcCIgaW5kaWNhdG9yIGFzIHRoZSBjdXJyZW50IGNvbXBsZXRpb24gaW5kaWNhdG9yCiAJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5UQ0JTZW5kUUxvY2ssIGZsYWdzKTsKIAotCXBNcFRjYiA9IGV0ZGV2LT5UeFJpbmcuQ3VyclNlbmRIZWFkOworCXRjYiA9IGV0ZGV2LT50eF9yaW5nLnNlbmRfaGVhZDsKIAotCXdoaWxlIChwTXBUY2IgJiYKLQkgICAgICAgKChTZXJ2aWNlQ29tcGxldGUgXiBwTXBUY2ItPldySW5kZXgpICYgRVRfRE1BMTBfV1JBUCkgJiYKLQkgICAgICAgaW5kZXggPCBJTkRFWDEwKHBNcFRjYi0+V3JJbmRleCkpIHsKLQkJZXRkZXYtPlR4UmluZy5uQnVzeVNlbmQtLTsKLQkJZXRkZXYtPlR4UmluZy5DdXJyU2VuZEhlYWQgPSBwTXBUY2ItPk5leHQ7Ci0JCWlmIChwTXBUY2ItPk5leHQgPT0gTlVMTCkKLQkJCWV0ZGV2LT5UeFJpbmcuQ3VyclNlbmRUYWlsID0gTlVMTDsKKwl3aGlsZSAodGNiICYmCisJICAgICAgICgoc2VydmljZWQgXiB0Y2ItPmluZGV4KSAmIEVUX0RNQTEwX1dSQVApICYmCisJICAgICAgIGluZGV4IDwgSU5ERVgxMCh0Y2ItPmluZGV4KSkgeworCQlldGRldi0+dHhfcmluZy51c2VkLS07CisJCWV0ZGV2LT50eF9yaW5nLnNlbmRfaGVhZCA9IHRjYi0+bmV4dDsKKwkJaWYgKHRjYi0+bmV4dCA9PSBOVUxMKQorCQkJZXRkZXYtPnR4X3Jpbmcuc2VuZF90YWlsID0gTlVMTDsKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+VENCU2VuZFFMb2NrLCBmbGFncyk7Ci0JCWV0MTMxeF9mcmVlX3NlbmRfcGFja2V0KGV0ZGV2LCBwTXBUY2IpOworCQlldDEzMXhfZnJlZV9zZW5kX3BhY2tldChldGRldiwgdGNiKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5UQ0JTZW5kUUxvY2ssIGZsYWdzKTsKIAogCQkvKiBHb3RvIHRoZSBuZXh0IHBhY2tldCAqLwotCQlwTXBUY2IgPSBldGRldi0+VHhSaW5nLkN1cnJTZW5kSGVhZDsKKwkJdGNiID0gZXRkZXYtPnR4X3Jpbmcuc2VuZF9oZWFkOwogCX0KLQl3aGlsZSAocE1wVGNiICYmCi0JICAgICAgICEoKFNlcnZpY2VDb21wbGV0ZSBeIHBNcFRjYi0+V3JJbmRleCkgJiBFVF9ETUExMF9XUkFQKQotCSAgICAgICAmJiBpbmRleCA+IChwTXBUY2ItPldySW5kZXggJiBFVF9ETUExMF9NQVNLKSkgewotCQlldGRldi0+VHhSaW5nLm5CdXN5U2VuZC0tOwotCQlldGRldi0+VHhSaW5nLkN1cnJTZW5kSGVhZCA9IHBNcFRjYi0+TmV4dDsKLQkJaWYgKHBNcFRjYi0+TmV4dCA9PSBOVUxMKQotCQkJZXRkZXYtPlR4UmluZy5DdXJyU2VuZFRhaWwgPSBOVUxMOworCXdoaWxlICh0Y2IgJiYKKwkgICAgICAgISgoc2VydmljZWQgXiB0Y2ItPmluZGV4KSAmIEVUX0RNQTEwX1dSQVApCisJICAgICAgICYmIGluZGV4ID4gKHRjYi0+aW5kZXggJiBFVF9ETUExMF9NQVNLKSkgeworCQlldGRldi0+dHhfcmluZy51c2VkLS07CisJCWV0ZGV2LT50eF9yaW5nLnNlbmRfaGVhZCA9IHRjYi0+bmV4dDsKKwkJaWYgKHRjYi0+bmV4dCA9PSBOVUxMKQorCQkJZXRkZXYtPnR4X3Jpbmcuc2VuZF90YWlsID0gTlVMTDsKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+VENCU2VuZFFMb2NrLCBmbGFncyk7Ci0JCWV0MTMxeF9mcmVlX3NlbmRfcGFja2V0KGV0ZGV2LCBwTXBUY2IpOworCQlldDEzMXhfZnJlZV9zZW5kX3BhY2tldChldGRldiwgdGNiKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5UQ0JTZW5kUUxvY2ssIGZsYWdzKTsKIAogCQkvKiBHb3RvIHRoZSBuZXh0IHBhY2tldCAqLwotCQlwTXBUY2IgPSBldGRldi0+VHhSaW5nLkN1cnJTZW5kSGVhZDsKKwkJdGNiID0gZXRkZXYtPnR4X3Jpbmcuc2VuZF9oZWFkOwogCX0KIAogCS8qIFdha2UgdXAgdGhlIHF1ZXVlIHdoZW4gd2UgaGl0IGEgbG93LXdhdGVyIG1hcmsgKi8KLQlpZiAoZXRkZXYtPlR4UmluZy5uQnVzeVNlbmQgPD0gKE5VTV9UQ0IgLyAzKSkKKwlpZiAoZXRkZXYtPnR4X3JpbmcudXNlZCA8PSBOVU1fVENCIC8gMykKIAkJbmV0aWZfd2FrZV9xdWV1ZShldGRldi0+bmV0ZGV2KTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5UQ0JTZW5kUUxvY2ssIGZsYWdzKTsKIH0KIAotLyoqCi0gKiBldDEzMXhfY2hlY2tfc2VuZF93YWl0X2xpc3QgLSBIZWxwZXIgcm91dGluZSBmb3IgdGhlIGludGVycnVwdCBoYW5kbGVyCi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAqCi0gKiBUYWtlcyBwYWNrZXRzIGZyb20gdGhlIHNlbmQgd2FpdCBxdWV1ZSBhbmQgcG9zdHMgdGhlbSB0byB0aGUgZGV2aWNlIChpZgotICogcm9vbSBhdmFpbGFibGUpLgotICovCi1zdGF0aWMgdm9pZCBldDEzMXhfY2hlY2tfc2VuZF93YWl0X2xpc3Qoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5TZW5kV2FpdExvY2ssIGZsYWdzKTsKLQotCXdoaWxlICghbGlzdF9lbXB0eSgmZXRkZXYtPlR4UmluZy5TZW5kV2FpdFF1ZXVlKSAmJgotCQkJCU1QX1RDQl9SRVNPVVJDRVNfQVZBSUxBQkxFKGV0ZGV2KSkgewotCQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLQotCQllbnRyeSA9IGV0ZGV2LT5UeFJpbmcuU2VuZFdhaXRRdWV1ZS5uZXh0OwotCi0JCWV0ZGV2LT5UeFJpbmcubldhaXRTZW5kLS07Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPlNlbmRXYWl0TG9jaywgZmxhZ3MpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfdHguaCBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3R4LmgKaW5kZXggYWQwMzcyMS4uNGYwZWE4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfdHguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF90eC5oCkBAIC02MywxNjcgKzYzLDg5IEBACiAvKiBUeXBlZGVmcyBmb3IgVHggRGVzY3JpcHRvciBSaW5nICovCiAKIC8qCi0gKiBUWERFU0NfV09SRDJfdCBzdHJ1Y3R1cmUgaG9sZHMgcGFydCBvZiB0aGUgY29udHJvbCBiaXRzIGluIHRoZSBUeCBEZXNjcmlwdG9yCi0gKiByaW5nIGZvciB0aGUgRVQtMTMxMAorICogd29yZCAyIG9mIHRoZSBjb250cm9sIGJpdHMgaW4gdGhlIFR4IERlc2NyaXB0b3IgcmluZyBmb3IgdGhlIEVULTEzMTAKKyAqCisgKiAwLTE1OiBsZW5ndGggb2YgcGFja2V0CisgKiAxNi0yNzogVkxBTiB0YWcKKyAqIDI4OiBWTEFOIENGSQorICogMjktMzE6IFZMQU4gcHJpb3JpdHkKKyAqCisgKiB3b3JkIDMgb2YgdGhlIGNvbnRyb2wgYml0cyBpbiB0aGUgVHggRGVzY3JpcHRvciByaW5nIGZvciB0aGUgRVQtMTMxMAorICoKKyAqIDA6IGxhc3QgcGFja2V0IGluIHRoZSBzZXF1ZW5jZQorICogMTogZmlyc3QgcGFja2V0IGluIHRoZSBzZXF1ZW5jZQorICogMjogaW50ZXJydXB0IHRoZSBwcm9jZXNzb3Igd2hlbiB0aGlzIHBrdCBzZW50CisgKiAzOiBDb250cm9sIHdvcmQgLSBubyBwYWNrZXQgZGF0YQorICogNDogSXNzdWUgaGFsZi1kdXBsZXggYmFja3ByZXNzdXJlIDogWE9OL1hPRkYKKyAqIDU6IHNlbmQgcGF1c2UgZnJhbWUKKyAqIDY6IFR4IGZyYW1lIGhhcyBlcnJvcgorICogNzogYXBwZW5kIENSQworICogODogTUFDIG92ZXJyaWRlCisgKiA5OiBwYWQgcGFja2V0CisgKiAxMDogUGFja2V0IGlzIGEgSHVnZSBwYWNrZXQKKyAqIDExOiBhcHBlbmQgVkxBTiB0YWcKKyAqIDEyOiBJUCBjaGVja3N1bSBhc3Npc3QKKyAqIDEzOiBUQ1AgY2hlY2tzdW0gYXNzaXN0CisgKiAxNDogVURQIGNoZWNrc3VtIGFzc2lzdAogICovCi10eXBlZGVmIHVuaW9uIF90eGRlc2Nfd29yZDJfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgdmxhbl9wcmlvOjM7CQkvKiBiaXRzIDI5LTMxKFZMQU4gcHJpb3JpdHkpICovCi0JCXUzMiB2bGFuX2NmaToxOwkJLyogYml0IDI4KGNmaSkgKi8KLQkJdTMyIHZsYW5fdGFnOjEyOwkJLyogYml0cyAxNi0yNyhWTEFOIHRhZykgKi8KLQkJdTMyIGxlbmd0aF9pbl9ieXRlczoxNjsJLyogYml0cyAgMC0xNShwYWNrZXQgbGVuZ3RoKSAqLwotI2Vsc2UKLQkJdTMyIGxlbmd0aF9pbl9ieXRlczoxNjsJLyogYml0cyAgMC0xNShwYWNrZXQgbGVuZ3RoKSAqLwotCQl1MzIgdmxhbl90YWc6MTI7CQkvKiBiaXRzIDE2LTI3KFZMQU4gdGFnKSAqLwotCQl1MzIgdmxhbl9jZmk6MTsJCS8qIGJpdCAyOChjZmkpICovCi0JCXUzMiB2bGFuX3ByaW86MzsJCS8qIGJpdHMgMjktMzEoVkxBTiBwcmlvcml0eSkgKi8KLSNlbmRpZgkvKiBfQklUX0ZJRUxEU19IVE9MICovCi0JfSBiaXRzOwotfSBUWERFU0NfV09SRDJfdCwgKlBUWERFU0NfV09SRDJfdDsKKworLyogc3RydWN0IHR4X2Rlc2MgcmVwcmVzZW50cyBlYWNoIGRlc2NyaXB0b3Igb24gdGhlIHJpbmcgKi8KK3N0cnVjdCB0eF9kZXNjIHsKKwl1MzIgYWRkcl9oaTsKKwl1MzIgYWRkcl9sbzsKKwl1MzIgbGVuX3ZsYW47CS8qIGNvbnRyb2wgd29yZHMgaG93IHRvIHhtaXQgdGhlICovCisJdTMyIGZsYWdzOwkvKiBkYXRhIChkZXRhaWxlZCBhYm92ZSkgKi8KK307CiAKIC8qCi0gKiBUWERFU0NfV09SRDNfdCBzdHJ1Y3R1cmUgaG9sZHMgcGFydCBvZiB0aGUgY29udHJvbCBiaXRzIGluIHRoZSBUeCBEZXNjcmlwdG9yCi0gKiByaW5nIGZvciB0aGUgRVQtMTMxMAorICogVGhlIHN0YXR1cyBvZiB0aGUgVHggRE1BIGVuZ2luZSBpdCBzaXRzIGluIGZyZWUgbWVtb3J5LCBhbmQgaXMgcG9pbnRlZCB0bworICogYnkgMHgxMDFjIC8gMHgxMDIwLiBUaGlzIGlzIGEgRE1BMTAgdHlwZQogICovCi10eXBlZGVmIHVuaW9uIF90eGRlc2Nfd29yZDNfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgdW51c2VkOjE3OwkvKiBiaXRzIDE1LTMxICovCi0JCXUzMiB1ZHBhOjE7CS8qIGJpdCAxNChVRFAgY2hlY2tzdW0gYXNzaXN0KSAqLwotCQl1MzIgdGNwYToxOwkvKiBiaXQgMTMoVENQIGNoZWNrc3VtIGFzc2lzdCkgKi8KLQkJdTMyIGlwYToxOwkJLyogYml0IDEyKElQIGNoZWNrc3VtIGFzc2lzdCkgKi8KLQkJdTMyIHZsYW46MTsJLyogYml0IDExKGFwcGVuZCBWTEFOIHRhZykgKi8KLQkJdTMyIGhwOjE7CQkvKiBiaXQgMTAoUGFja2V0IGlzIGEgSHVnZSBwYWNrZXQpICovCi0JCXUzMiBwcDoxOwkJLyogYml0ICA5KHBhZCBwYWNrZXQpICovCi0JCXUzMiBtYWM6MTsJCS8qIGJpdCAgOChNQUMgb3ZlcnJpZGUpICovCi0JCXUzMiBjcmM6MTsJCS8qIGJpdCAgNyhhcHBlbmQgQ1JDKSAqLwotCQl1MzIgZToxOwkJLyogYml0ICA2KFR4IGZyYW1lIGhhcyBlcnJvcikgKi8KLQkJdTMyIHBmOjE7CQkvKiBiaXQgIDUoc2VuZCBwYXVzZSBmcmFtZSkgKi8KLQkJdTMyIGJwOjE7CQkvKiBiaXQgIDQoSXNzdWUgaGFsZi1kdXBsZXggYmFja3ByZXNzdXJlIChYT04vWE9GRikgKi8KLQkJdTMyIGN3OjE7CQkvKiBiaXQgIDMoQ29udHJvbCB3b3JkIC0gbm8gcGFja2V0IGRhdGEpICovCi0JCXUzMiBpcjoxOwkJLyogYml0ICAyKGludGVycnVwdCB0aGUgcHJvY2Vzc29yIHdoZW4gdGhpcyBwa3Qgc2VudCkgKi8KLQkJdTMyIGY6MTsJCS8qIGJpdCAgMShmaXJzdCBwYWNrZXQgaW4gdGhlIHNlcXVlbmNlKSAqLwotCQl1MzIgbDoxOwkJLyogYml0ICAwKGxhc3QgcGFja2V0IGluIHRoZSBzZXF1ZW5jZSkgKi8KLSNlbHNlCi0JCXUzMiBsOjE7CQkvKiBiaXQgIDAobGFzdCBwYWNrZXQgaW4gdGhlIHNlcXVlbmNlKSAqLwotCQl1MzIgZjoxOwkJLyogYml0ICAxKGZpcnN0IHBhY2tldCBpbiB0aGUgc2VxdWVuY2UpICovCi0JCXUzMiBpcjoxOwkJLyogYml0ICAyKGludGVycnVwdCB0aGUgcHJvY2Vzc29yIHdoZW4gdGhpcyBwa3Qgc2VudCkgKi8KLQkJdTMyIGN3OjE7CQkvKiBiaXQgIDMoQ29udHJvbCB3b3JkIC0gbm8gcGFja2V0IGRhdGEpICovCi0JCXUzMiBicDoxOwkJLyogYml0ICA0KElzc3VlIGhhbGYtZHVwbGV4IGJhY2twcmVzc3VyZSAoWE9OL1hPRkYpICovCi0JCXUzMiBwZjoxOwkJLyogYml0ICA1KHNlbmQgcGF1c2UgZnJhbWUpICovCi0JCXUzMiBlOjE7CQkvKiBiaXQgIDYoVHggZnJhbWUgaGFzIGVycm9yKSAqLwotCQl1MzIgY3JjOjE7CQkvKiBiaXQgIDcoYXBwZW5kIENSQykgKi8KLQkJdTMyIG1hYzoxOwkJLyogYml0ICA4KE1BQyBvdmVycmlkZSkgKi8KLQkJdTMyIHBwOjE7CQkvKiBiaXQgIDkocGFkIHBhY2tldCkgKi8KLQkJdTMyIGhwOjE7CQkvKiBiaXQgMTAoUGFja2V0IGlzIGEgSHVnZSBwYWNrZXQpICovCi0JCXUzMiB2bGFuOjE7CS8qIGJpdCAxMShhcHBlbmQgVkxBTiB0YWcpICovCi0JCXUzMiBpcGE6MTsJCS8qIGJpdCAxMihJUCBjaGVja3N1bSBhc3Npc3QpICovCi0JCXUzMiB0Y3BhOjE7CS8qIGJpdCAxMyhUQ1AgY2hlY2tzdW0gYXNzaXN0KSAqLwotCQl1MzIgdWRwYToxOwkvKiBiaXQgMTQoVURQIGNoZWNrc3VtIGFzc2lzdCkgKi8KLQkJdTMyIHVudXNlZDoxNzsJLyogYml0cyAxNS0zMSAqLwotI2VuZGlmCS8qIF9CSVRfRklFTERTX0hUT0wgKi8KLQl9IGJpdHM7Ci19IFRYREVTQ19XT1JEM190LCAqUFRYREVTQ19XT1JEM190OwogCi0vKiBUWF9ERVNDX0VOVFJZX3QgaXMgc3J1Y3R1cmUgcmVwcmVzZW50aW5nIGVhY2ggZGVzY3JpcHRvciBvbiB0aGUgcmluZyAqLwotdHlwZWRlZiBzdHJ1Y3QgX3R4X2Rlc2NfZW50cnlfdCB7Ci0JdTMyIERhdGFCdWZmZXJQdHJIaWdoOwotCXUzMiBEYXRhQnVmZmVyUHRyTG93OwotCVRYREVTQ19XT1JEMl90IHdvcmQyOwkvKiBjb250cm9sIHdvcmRzIGhvdyB0byB4bWl0IHRoZSAqLwotCVRYREVTQ19XT1JEM190IHdvcmQzOwkvKiBkYXRhIChkZXRhaWxlZCBhYm92ZSkgKi8KLX0gVFhfREVTQ19FTlRSWV90LCAqUFRYX0RFU0NfRU5UUllfdDsKKy8qIFRDQiAoVHJhbnNtaXQgQ29udHJvbCBCbG9jazogSG9zdCBTaWRlKSAqLworc3RydWN0IHRjYiB7CisJc3RydWN0IHRjYiAqbmV4dDsJLyogTmV4dCBlbnRyeSBpbiByaW5nICovCisJdTMyIGZsYWdzOwkJLyogT3VyIGZsYWdzIGZvciB0aGUgcGFja2V0ICovCisJdTMyIGNvdW50OwkJLyogVXNlZCB0byBzcG90IHN0dWNrL2xvc3QgcGFja2V0cyAqLworCXUzMiBzdGFsZTsJCS8qIFVzZWQgdG8gc3BvdCBzdHVjay9sb3N0IHBhY2tldHMgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwkvKiBOZXR3b3JrIHNrYiB3ZSBhcmUgdGllZCB0byAqLworCXUzMiBpbmRleDsJCS8qIFJpbmcgaW5kZXhlcyAqLworCXUzMiBpbmRleF9zdGFydDsKK307CiAKLQotLyogVHlwZWRlZnMgZm9yIFR4IERNQSBlbmdpbmUgc3RhdHVzIHdyaXRlYmFjayAqLwotCi0vKgotICogVFhfU1RBVFVTX0JMT0NLX3QgaXMgc3J1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBzdGF0dXMgb2YgdGhlIFR4IERNQSBlbmdpbmUKLSAqIGl0IHNpdHMgaW4gZnJlZSBtZW1vcnksIGFuZCBpcyBwb2ludGVkIHRvIGJ5IDB4MTAxYyAvIDB4MTAyMAotICovCi10eXBlZGVmIHVuaW9uIF90eF9zdGF0dXNfYmxvY2tfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgdW51c2VkOjIxOwkJLyogYml0cyAxMS0zMSAqLwotCQl1MzIgc2Vydl9jcGxfd3JhcDoxOwkvKiBiaXQgMTAgKi8KLQkJdTMyIHNlcnZfY3BsOjEwOwkJLyogYml0cyAwLTkgKi8KLSNlbHNlCi0JCXUzMiBzZXJ2X2NwbDoxMDsJCS8qIGJpdHMgMC05ICovCi0JCXUzMiBzZXJ2X2NwbF93cmFwOjE7CS8qIGJpdCAxMCAqLwotCQl1MzIgdW51c2VkOjIxOwkJLyogYml0cyAxMS0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBUWF9TVEFUVVNfQkxPQ0tfdCwgKlBUWF9TVEFUVVNfQkxPQ0tfdDsKLQotLyogVENCIChUcmFuc21pdCBDb250cm9sIEJsb2NrKSAqLwotdHlwZWRlZiBzdHJ1Y3QgX01QX1RDQiB7Ci0Jc3RydWN0IF9NUF9UQ0IgKk5leHQ7Ci0JdTMyIEZsYWdzOwotCXUzMiBDb3VudDsKLQl1MzIgUGFja2V0U3RhbGVDb3VudDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqUGFja2V0OwotCXUzMiBQYWNrZXRMZW5ndGg7Ci0JdTMyIFdySW5kZXg7Ci0JdTMyIFdySW5kZXhTdGFydDsKLX0gTVBfVENCLCAqUE1QX1RDQjsKLQotLyogU3RydWN0dXJlIHRvIGhvbGQgdGhlIHNrYidzIGluIGEgbGlzdCAqLwotdHlwZWRlZiBzdHJ1Y3QgdHhfc2tiX2xpc3RfZWxlbSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBza2JfbGlzdF9lbGVtOwotCXN0cnVjdCBza19idWZmICpza2I7Ci19IFRYX1NLQl9MSVNUX0VMRU0sICpQVFhfU0tCX0xJU1RfRUxFTTsKLQotLyogVFhfUklOR190IGlzIHNydWN0dXJlIHJlcHJlc2VudGluZyBvdXIgbG9jYWwgcmVmZXJlbmNlKHMpIHRvIHRoZSByaW5nICovCi10eXBlZGVmIHN0cnVjdCBfdHhfcmluZ190IHsKKy8qIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgb3VyIGxvY2FsIHJlZmVyZW5jZShzKSB0byB0aGUgcmluZyAqLworc3RydWN0IHR4X3JpbmcgewogCS8qIFRDQiAoVHJhbnNtaXQgQ29udHJvbCBCbG9jaykgbWVtb3J5IGFuZCBsaXN0cyAqLwotCVBNUF9UQ0IgTXBUY2JNZW07CisJc3RydWN0IHRjYiAqdGNiX3Jpbmc7CiAKIAkvKiBMaXN0IG9mIFRDQnMgdGhhdCBhcmUgcmVhZHkgdG8gYmUgdXNlZCAqLwotCVBNUF9UQ0IgVENCUmVhZHlRdWV1ZUhlYWQ7Ci0JUE1QX1RDQiBUQ0JSZWFkeVF1ZXVlVGFpbDsKKwlzdHJ1Y3QgdGNiICp0Y2JfcWhlYWQ7CisJc3RydWN0IHRjYiAqdGNiX3F0YWlsOwogCiAJLyogbGlzdCBvZiBUQ0JzIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyBzZW50LiAgTk9URSB0aGF0IGFjY2VzcyB0byBhbGwKLQkgKiB0aHJlZSBvZiB0aGVzZSAoaW5jbHVkaW5nIG5CdXN5U2VuZCkgYXJlIGNvbnRyb2xsZWQgdmlhIHRoZQorCSAqIHRocmVlIG9mIHRoZXNlIChpbmNsdWRpbmcgdXNlZCkgYXJlIGNvbnRyb2xsZWQgdmlhIHRoZQogCSAqIFRDQlNlbmRRTG9jay4gIFRoaXMgbG9jayBzaG91bGQgYmUgc2VjdXJlZCBwcmlvciB0byBpbmNlbWVudGluZyAvCi0JICogZGVjcmVtZW50aW5nIG5CdXN5U2VuZCwgb3IgYW55IHF1ZXVlIG1hbmlwdWxhdGlvbiBvbiBDdXJyU2VuZEhlYWQgLwotCSAqIFRhaWwKKwkgKiBkZWNyZW1lbnRpbmcgdXNlZCwgb3IgYW55IHF1ZXVlIG1hbmlwdWxhdGlvbiBvbiBzZW5kX2hlYWQgLworCSAqIHRhaWwKIAkgKi8KLQlQTVBfVENCIEN1cnJTZW5kSGVhZDsKLQlQTVBfVENCIEN1cnJTZW5kVGFpbDsKLQlpbnQzMl90IG5CdXN5U2VuZDsKLQotCS8qIExpc3Qgb2YgcGFja2V0cyAobm90IFRDQnMpIHRoYXQgd2VyZSBxdWV1ZWQgZm9yIGxhY2sgb2YgcmVzb3VyY2VzICovCi0Jc3RydWN0IGxpc3RfaGVhZCBTZW5kV2FpdFF1ZXVlOwotCWludDMyX3QgbldhaXRTZW5kOworCXN0cnVjdCB0Y2IgKnNlbmRfaGVhZDsKKwlzdHJ1Y3QgdGNiICpzZW5kX3RhaWw7CisJaW50IHVzZWQ7CiAKIAkvKiBUaGUgYWN0dWFsIGRlc2NyaXB0b3IgcmluZyAqLwotCVBUWF9ERVNDX0VOVFJZX3QgcFR4RGVzY1JpbmdWYTsKLQlkbWFfYWRkcl90IHBUeERlc2NSaW5nUGE7Ci0JdWludDY0X3QgcFR4RGVzY1JpbmdBZGp1c3RlZFBhOwotCXVpbnQ2NF90IFR4RGVzY09mZnNldDsKKwlzdHJ1Y3QgdHhfZGVzYyAqdHhfZGVzY19yaW5nOworCWRtYV9hZGRyX3QgdHhfZGVzY19yaW5nX3BhOwogCi0JLyogUmVhZHlUb1NlbmQgaW5kaWNhdGVzIHdoZXJlIHdlIGxhc3Qgd3JvdGUgdG8gaW4gdGhlIGRlc2NyaXB0b3IgcmluZy4gKi8KLQl1MzIgdHhEbWFSZWFkeVRvU2VuZDsKKwkvKiBzZW5kX2lkeCBpbmRpY2F0ZXMgd2hlcmUgd2UgbGFzdCB3cm90ZSB0byBpbiB0aGUgZGVzY3JpcHRvciByaW5nLiAqLworCXUzMiBzZW5kX2lkeDsKIAogCS8qIFRoZSBsb2NhdGlvbiBvZiB0aGUgd3JpdGUtYmFjayBzdGF0dXMgYmxvY2sgKi8KLQlQVFhfU1RBVFVTX0JMT0NLX3QgcFR4U3RhdHVzVmE7Ci0JZG1hX2FkZHJfdCBwVHhTdGF0dXNQYTsKKwl1MzIgKnR4X3N0YXR1czsKKwlkbWFfYWRkcl90IHR4X3N0YXR1c19wYTsKIAotCS8qIEEgQmxvY2sgb2YgemVyb2VzIHVzZWQgdG8gcGFkIHBhY2tldHMgdGhhdCBhcmUgbGVzcyB0aGFuIDYwIGJ5dGVzICovCi0Jdm9pZCAqcFR4RHVtbXlCbGtWYTsKLQlkbWFfYWRkcl90IHBUeER1bW15QmxrUGE7Ci0KLQlUWE1BQ19FUlJfdCBUeE1hY0VycjsKLQotCS8qIFZhcmlhYmxlcyB0byB0cmFjayB0aGUgVHggaW50ZXJydXB0IGNvYWxlc2NpbmcgZmVhdHVyZXMgKi8KLQlpbnQzMl90IFR4UGFja2V0c1NpbmNlTGFzdGludGVycnVwdDsKLX0gVFhfUklOR190LCAqUFRYX1JJTkdfdDsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiB0aGUgZnJhZy1saXN0IGZvciB0aGUgZm9sbG93aW5nIHByb3RvdHlwZXMgKi8KLXR5cGVkZWYgc3RydWN0IF9NUF9GUkFHX0xJU1QgTVBfRlJBR19MSVNULCAqUE1QX0ZSQUdfTElTVDsKKwkvKiBQYWNrZXRzIHNpbmNlIHRoZSBsYXN0IElSUTogdXNlZCBmb3IgaW50ZXJydXB0IGNvYWxlc2NpbmcgKi8KKwlpbnQgc2luY2VfaXJxOworfTsKIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiB0aGUgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZSAqLwogc3RydWN0IGV0MTMxeF9hZGFwdGVyOwpAQCAtMjMxLDEyICsxNTMsMTIgQEAKIC8qIFBST1RPVFlQRVMgZm9yIGV0MTMxMF90eC5jICovCiBpbnQgZXQxMzF4X3R4X2RtYV9tZW1vcnlfYWxsb2Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKIHZvaWQgZXQxMzF4X3R4X2RtYV9tZW1vcnlfZnJlZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBDb25maWdUeERtYVJlZ3Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICpwQWRhcHRlcik7Cit2b2lkIENvbmZpZ1R4RG1hUmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwogdm9pZCBldDEzMXhfaW5pdF9zZW5kKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIGV0MTMxeF90eF9kbWFfZGlzYWJsZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKnBBZGFwdGVyKTsKLXZvaWQgZXQxMzF4X3R4X2RtYV9lbmFibGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpwQWRhcHRlcik7Ci12b2lkIGV0MTMxeF9oYW5kbGVfc2VuZF9pbnRlcnJ1cHQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpwQWRhcHRlcik7Ci12b2lkIGV0MTMxeF9mcmVlX2J1c3lfc2VuZF9wYWNrZXRzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqcEFkYXB0ZXIpOwordm9pZCBldDEzMXhfdHhfZG1hX2Rpc2FibGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgZXQxMzF4X3R4X2RtYV9lbmFibGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgZXQxMzF4X2hhbmRsZV9zZW5kX2ludGVycnVwdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBldDEzMXhfZnJlZV9idXN5X3NlbmRfcGFja2V0cyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwogaW50IGV0MTMxeF9zZW5kX3BhY2tldHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiAKICNlbmRpZiAvKiBfX0VUMTMxMF9UWF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2FkYXB0ZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2FkYXB0ZXIuaAppbmRleCAxZGZlMDZmLi4zZjdmMzdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9hZGFwdGVyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfYWRhcHRlci5oCkBAIC0xMDAsMTIgKzEwMCw2IEBACiAjZGVmaW5lIExPX01BUktfUEVSQ0VOVF9GT1JfUFNSICAgICAxNQogI2RlZmluZSBMT19NQVJLX1BFUkNFTlRfRk9SX1JYICAgICAgMTUKIAotLyogTWFjcm9zIHNwZWNpZmljIHRvIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlICovCi0jZGVmaW5lIE1QX1RDQl9SRVNPVVJDRVNfQVZBSUxBQkxFKF9NKSAoKF9NKS0+VHhSaW5nLm5CdXN5U2VuZCA8IE5VTV9UQ0IpCi0jZGVmaW5lIE1QX1RDQl9SRVNPVVJDRVNfTk9UX0FWQUlMQUJMRShfTSkgKChfTSktPlR4UmluZy5uQnVzeVNlbmQgPj0gTlVNX1RDQikKLQotI2RlZmluZSBNUF9TSE9VTERfRkFJTF9TRU5EKF9NKSAgICgoX00pLT5GbGFncyAmIGZNUF9BREFQVEVSX0ZBSUxfU0VORF9NQVNLKQotCiAvKiBDb3VudGVycyBmb3IgZXJyb3IgcmF0ZSBtb25pdG9yaW5nICovCiB0eXBlZGVmIHN0cnVjdCBfTVBfRVJSX0NPVU5URVJTIHsKIAl1MzIgUGt0Q291bnRUeFBhY2tldHM7CkBAIC0xNjgsNyArMTYyLDcgQEAKIAl1MzIgdHhfZGVmZXJyZWQ7CiAKIAkvKiBSeCBTdGF0aXN0aWNzLiAqLwotCXUzMiByeF9vdl9mbG93OwkvKiBSeCBPdmVyIEZsb3cgKi8KKwl1MzIgcnhfb3ZfZmxvdzsJLyogUnggT3ZlcmZsb3cgKi8KIAogCXUzMiBsZW5ndGhfZXJyOwogCXUzMiBhbGlnbm1lbnRfZXJyOwpAQCAtMjAzLDcgKzE5Nyw2IEBACiAJc3BpbmxvY2tfdCBUQ0JTZW5kUUxvY2s7CiAJc3BpbmxvY2tfdCBUQ0JSZWFkeVFMb2NrOwogCXNwaW5sb2NrX3QgU2VuZEhXTG9jazsKLQlzcGlubG9ja190IFNlbmRXYWl0TG9jazsKIAogCXNwaW5sb2NrX3QgUmN2TG9jazsKIAlzcGlubG9ja190IFJjdlBlbmRMb2NrOwpAQCAtMjIwLDkgKzIxMyw2IEBACiAJdTMyIE1DQWRkcmVzc0NvdW50OwogCXU4IE1DTGlzdFtOSUNfTUFYX01DQVNUX0xJU1RdW0VUSF9BTEVOXTsKIAotCS8qIE1BQyB0ZXN0ICovCi0JVFhNQUNfVFhURVNUX3QgVHhNYWNUZXN0OwotCiAJLyogUG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgUENJIHJlZ2lzdGVyIHNwYWNlICovCiAJQUREUkVTU19NQVBfdCBfX2lvbWVtICpyZWdzOwogCkBAIC0yMzQsOSArMjI0LDYgQEAKIAl1MzIgUmVnaXN0cnlSeE1lbUVuZDsJLyogU2l6ZSBvZiBpbnRlcm5hbCByeCBtZW1vcnkgKi8KIAl1MzIgUmVnaXN0cnlKdW1ib1BhY2tldDsJLyogTWF4IHN1cHBvcnRlZCBldGhlcm5ldCBwYWNrZXQgc2l6ZSAqLwogCi0JLyogVmFsaWRhdGlvbiBoZWxwZXJzICovCi0JdTggUmVnaXN0cnlOTUlEaXNhYmxlOwotCXU4IFJlZ2lzdHJ5UGh5TG9vcGJrOwkvKiBFbmFibGUgUGh5IGxvb3BiYWNrICovCiAKIAkvKiBEZXJpdmVkIGZyb20gdGhlIHJlZ2lzdHJ5OiAqLwogCXU4IEFpRm9yY2VEcHg7CQkvKiBkdXBsZXggc2V0dGluZyAqLwpAQCAtMjQ4LDcgKzIzNSw2IEBACiAJCU5FVElGX1NUQVRVU19NRURJQV9ESVNDT05ORUNULAogCQlORVRJRl9TVEFUVVNfTUFYCiAJfSBNZWRpYVN0YXRlOwotCXU4IERyaXZlck5vUGh5QWNjZXNzOwogCiAJLyogTWluaW1pemUgaW5pdC10aW1lICovCiAJc3RydWN0IHRpbWVyX2xpc3QgRXJyb3JUaW1lcjsKQEAgLTI1OSw3ICsyNDUsNyBAQAogCU1JX0JNU1JfdCBCbXNyOwogCiAJLyogVHggTWVtb3J5IFZhcmlhYmxlcyAqLwotCVRYX1JJTkdfdCBUeFJpbmc7CisJc3RydWN0IHR4X3JpbmcgdHhfcmluZzsKIAogCS8qIFJ4IE1lbW9yeSBWYXJpYWJsZXMgKi8KIAlSWF9SSU5HX3QgUnhSaW5nOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfZGVmcy5oIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfZGVmcy5oCmluZGV4IGY5OGRjYTUuLmQ4MWZjNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2RlZnMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9kZWZzLmgKQEAgLTEwMiw3ICsxMDIsNiBAQAogCiAvKiBTb21lIG9mZnNldHMgaW4gUENJIGNvbmZpZyBzcGFjZSB0aGF0IGFyZSBhY3R1YWxseSB1c2VkLiAqLwogI2RlZmluZSBFVDEzMTBfUENJX01BWF9QWUxECQkweDRDCi0jZGVmaW5lIEVUMTMxMF9OTUlfRElTQUJMRQkJMHg2MQogI2RlZmluZSBFVDEzMTBfUENJX01BQ19BRERSRVNTCQkweEE0CiAjZGVmaW5lIEVUMTMxMF9QQ0lfRUVQUk9NX1NUQVRVUwkweEIyCiAjZGVmaW5lIEVUMTMxMF9QQ0lfQUNLX05BQ0sJCTB4QzAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2luaXRwY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2luaXRwY2kuYwppbmRleCA5ZGIyMDU2Li4wODkyYjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9pbml0cGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfaW5pdHBjaS5jCkBAIC0xMDYsMTcgKzEwNiw2IEBACiAjZGVmaW5lIFBBUk1fU1BFRURfRFVQTEVYX01JTiAgIDAKICNkZWZpbmUgUEFSTV9TUEVFRF9EVVBMRVhfTUFYICAgNQogCi0vKiBNb2R1bGUgcGFyYW1ldGVyIGZvciBkaXNhYmxpbmcgTk1JCi0gKiBldDEzMXhfbm1pX2Rpc2FibGUgOgotICogRGlzYWJsZSBOTUkgKDAtMikgWzBdCi0gKiAgMCA6Ci0gKiAgMSA6Ci0gKiAgMiA6Ci0gKi8KLXN0YXRpYyB1MzIgZXQxMzF4X25taV9kaXNhYmxlOwkvKiAwLTIgKi8KLW1vZHVsZV9wYXJhbShldDEzMXhfbm1pX2Rpc2FibGUsIHVpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhldDEzMXhfbm1pX2Rpc2FibGUsICJEaXNhYmxlIE5NSSAoMC0yKSBbMF0iKTsKLQogLyogTW9kdWxlIHBhcmFtZXRlciBmb3IgbWFudWFsIHNwZWVkIHNldHRpbmcKICAqIFNldCBMaW5rIHNwZWVkIGFuZCBkdWJsZXggbWFudWFsbHkgKDAtNSkgIFswXQogICogIDEgOiAxME1iICAgSGFsZi1EdXBsZXgKQEAgLTEzMiwxMjggKzEyMSw4OCBAQAogCQkiU2V0IExpbmsgc3BlZWQgYW5kIGR1YmxleCBtYW51YWxseSAoMC01KSAgWzBdIFxuICAxIDogMTBNYiAgIEhhbGYtRHVwbGV4IFxuICAyIDogMTBNYiAgIEZ1bGwtRHVwbGV4IFxuICAzIDogMTAwTWIgIEhhbGYtRHVwbGV4IFxuICA0IDogMTAwTWIgIEZ1bGwtRHVwbGV4IFxuICA1IDogMTAwME1iIEZ1bGwtRHVwbGV4IFxuIDAgOiBBdXRvIFNwZWVkIEF1dG8gRHVibGV4Iik7CiAKIC8qKgotICogZXQxMzF4X2ZpbmRfYWRhcHRlciAtIEZpbmQgdGhlIGFkYXB0ZXIgYW5kIGdldCBhbGwgdGhlIGFzc2lnbmVkIHJlc291cmNlcworICogZXQxMzF4X2h3YWRkcl9pbml0IC0gc2V0IHVwIHRoZSBNQUMgQWRkcmVzcyBvbiB0aGUgRVQxMzEwCiAgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCiAgKi8KLWludCBldDEzMXhfZmluZF9hZGFwdGVyKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit2b2lkIGV0MTMxeF9od2FkZHJfaW5pdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JaW50IHJlc3VsdDsKLQl1aW50OF90IGVlcHJvbVN0YXQ7Ci0JdWludDhfdCBtYXhQYXlsb2FkID0gMDsKLQl1aW50OF90IHJlYWRfc2l6ZV9yZWc7Ci0JdTggcmV2OwotCi0JLyogQWxsb3cgZGlzYWJsaW5nIG9mIE5vbi1NYXNrYWJsZSBJbnRlcnJ1cHRzIGluIEkvTyBzcGFjZSwgdG8KLQkgKiBzdXBwb3J0IHZhbGlkYXRpb24uCisJLyogSWYgaGF2ZSBvdXIgZGVmYXVsdCBtYWMgZnJvbSBpbml0IGFuZCBubyBtYWMgYWRkcmVzcyBmcm9tCisJICogRUVQUk9NIHRoZW4gd2UgbmVlZCB0byBnZW5lcmF0ZSB0aGUgbGFzdCBvY3RldCBhbmQgc2V0IGl0IG9uIHRoZQorCSAqIGRldmljZQogCSAqLwotCWlmIChhZGFwdGVyLT5SZWdpc3RyeU5NSURpc2FibGUpIHsKLQkJdWludDhfdCBSZWdpc3RlclZhbDsKLQotCQlSZWdpc3RlclZhbCA9IGluYihFVDEzMTBfTk1JX0RJU0FCTEUpOwotCQlSZWdpc3RlclZhbCAmPSAweGYzOwotCi0JCWlmIChhZGFwdGVyLT5SZWdpc3RyeU5NSURpc2FibGUgPT0gMikKLQkJCVJlZ2lzdGVyVmFsIHw9IDB4YzsKLQotCQlvdXRiKEVUMTMxMF9OTUlfRElTQUJMRSwgUmVnaXN0ZXJWYWwpOwotCX0KLQotCS8qIFdlIGZpcnN0IG5lZWQgdG8gY2hlY2sgdGhlIEVFUFJPTSBTdGF0dXMgY29kZSBsb2NhdGVkIGF0IG9mZnNldAotCSAqIDB4QjIgb2YgY29uZmlnIHNwYWNlCi0JICovCi0JcmVzdWx0ID0gcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgRVQxMzEwX1BDSV9FRVBST01fU1RBVFVTLAotCQkJCSAgICAgICZlZXByb21TdGF0KTsKLQotCS8qIFRISVMgSVMgQSBXT1JLQVJPVU5EOgotCSAqIEkgbmVlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gdHdpY2UgdG8gZ2V0IG15IGNhcmQgaW4gYQotCSAqIExHIE0xIEV4cHJlc3MgRHVhbCBydW5uaW5nLiBJIHRyaWVkIGFsc28gYSBtc2xlZXAgYmVmb3JlIHRoaXMKLQkgKiBmdW5jdGlvbiwgYmVjYXVzZSBJIHRob3VndGggdGhlcmUgY291bGQgYmUgc29tZSB0aW1lIGNvbmRpZGlvbnMKLQkgKiBidXQgaXQgZGlkbid0IHdvcmsuIENhbGwgdGhlIHdob2xlIGZ1bmN0aW9uIHR3aWNlIGFsc28gd29yay4KLQkgKi8KLQlyZXN1bHQgPSBwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBFVDEzMTBfUENJX0VFUFJPTV9TVEFUVVMsCi0JCQkJICAgICAgJmVlcHJvbVN0YXQpOwotCWlmIChyZXN1bHQgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkIG5vdCByZWFkIFBDSSBjb25maWcgc3BhY2UgZm9yICIKLQkJCSAgIkVFUFJPTSBTdGF0dXNcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiBEZXRlcm1pbmUgaWYgdGhlIGVycm9yKHMpIHdlIGNhcmUgYWJvdXQgYXJlIHByZXNlbnQuICBJZiB0aGV5IGFyZQotCSAqIHByZXNlbnQsIHdlIG5lZWQgdG8gZmFpbC4KLQkgKi8KLQlpZiAoZWVwcm9tU3RhdCAmIDB4NEMpIHsKLQkJcmVzdWx0ID0gcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmcmV2KTsKLQkJaWYgKHJlc3VsdCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCQkgICJDb3VsZCBub3QgcmVhZCBQQ0kgY29uZmlnIHNwYWNlIGZvciAiCi0JCQkJICAiUmV2aXNpb24gSURcbiIpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0gZWxzZSBpZiAocmV2ID09IDB4MDEpIHsKLQkJCWludDMyX3Qgbkxvb3A7Ci0JCQl1aW50OF90IHRlbXBbNF0gPSB7IDB4RkUsIDB4MTMsIDB4MTAsIDB4RkYgfTsKLQotCQkJLyogUmUtd3JpdGUgdGhlIGZpcnN0IDQgYnl0ZXMgaWYgd2UgaGF2ZSBhbiBlZXByb20KLQkJCSAqIHByZXNlbnQgYW5kIHRoZSByZXZpc2lvbiBpZCBpcyAxLCB0aGlzIGZpeGVzIHRoZQotCQkJICogY29ycnVwdGlvbiBzZWVuIHdpdGggMTMxMCBCIFNpbGljb24KLQkJCSAqLwotCQkJZm9yIChuTG9vcCA9IDA7IG5Mb29wIDwgMzsgbkxvb3ArKykgewotCQkJCUVlcHJvbVdyaXRlQnl0ZShhZGFwdGVyLCBuTG9vcCwgdGVtcFtuTG9vcF0pOwotCQkJfQotCQl9Ci0KLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmF0YWwgRUVQUk9NIFN0YXR1cyBFcnJvciAtIDB4JTA0eFxuIiwgZWVwcm9tU3RhdCk7Ci0KLQkJLyogVGhpcyBlcnJvciBjb3VsZCBtZWFuIHRoYXQgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgdGhlCi0JCSAqIGVlcHJvbSBvciB0aGF0IHRoZSBlZXByb20gZG9lc24ndCBleGlzdC4gIFdlIHdpbGwgdHJlYXQKLQkJICogZWFjaCBjYXNlIHRoZSBzYW1lIGFuZCBub3QgdHJ5IHRvIGdhdGhlciBhZGRpdGlvbmFsCi0JCSAqIGluZm9ybWF0aW9uIHRoYXQgbm9ybWFsbHkgd291bGQgY29tZSBmcm9tIHRoZSBlZXByb20sIGxpa2UKLQkJICogTUFDIEFkZHJlc3MKKwlpZiAoYWRhcHRlci0+UGVybWFuZW50QWRkcmVzc1swXSA9PSAweDAwICYmCisJICAgIGFkYXB0ZXItPlBlcm1hbmVudEFkZHJlc3NbMV0gPT0gMHgwMCAmJgorCSAgICBhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzWzJdID09IDB4MDAgJiYKKwkgICAgYWRhcHRlci0+UGVybWFuZW50QWRkcmVzc1szXSA9PSAweDAwICYmCisJICAgIGFkYXB0ZXItPlBlcm1hbmVudEFkZHJlc3NbNF0gPT0gMHgwMCAmJgorCSAgICBhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzWzVdID09IDB4MDApIHsKKwkJLyoKKwkJICogV2UgbmVlZCB0byByYW5kb21seSBnZW5lcmF0ZSB0aGUgbGFzdCBvY3RldCBzbyB3ZQorCQkgKiBkZWNyZWFzZSBvdXIgY2hhbmNlcyBvZiBzZXR0aW5nIHRoZSBtYWMgYWRkcmVzcyB0bworCQkgKiBzYW1lIGFzIGFub3RoZXIgb25lIG9mIG91ciBjYXJkcyBpbiB0aGUgc3lzdGVtCiAJCSAqLwotCQlhZGFwdGVyLT5oYXNfZWVwcm9tID0gMDsKKwkJZ2V0X3JhbmRvbV9ieXRlcygmYWRhcHRlci0+Q3VycmVudEFkZHJlc3NbNV0sIDEpOworCQkvKgorCQkgKiBXZSBoYXZlIHRoZSBkZWZhdWx0IHZhbHVlIGluIHRoZSByZWdpc3RlciB3ZSBhcmUKKwkJICogd29ya2luZyB3aXRoIHNvIHdlIG5lZWQgdG8gY29weSB0aGUgY3VycmVudAorCQkgKiBhZGRyZXNzIGludG8gdGhlIHBlcm1hbmVudCBhZGRyZXNzCisJCSAqLworCQltZW1jcHkoYWRhcHRlci0+UGVybWFuZW50QWRkcmVzcywKKwkJCWFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCBFVEhfQUxFTik7CisJfSBlbHNlIHsKKwkJLyogV2UgZG8gbm90IGhhdmUgYW4gb3ZlcnJpZGUgYWRkcmVzcywgc28gc2V0IHRoZQorCQkgKiBjdXJyZW50IGFkZHJlc3MgdG8gdGhlIHBlcm1hbmVudCBhZGRyZXNzIGFuZCBhZGQKKwkJICogaXQgdG8gdGhlIGRldmljZQorCQkgKi8KKwkJbWVtY3B5KGFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLAorCQkgICAgICAgYWRhcHRlci0+UGVybWFuZW50QWRkcmVzcywgRVRIX0FMRU4pOworCX0KK30KKworCisvKioKKyAqIGV0MTMxeF9wY2lfaW5pdAkgLSBpbml0aWFsIFBDSSBzZXR1cAorICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqIEBwZGV2OiBvdXIgUENJIGRldmljZQorICoKKyAqIFBlcmZvcm0gdGhlIGluaXRpYWwgc2V0dXAgb2YgUENJIHJlZ2lzdGVycyBhbmQgaWYgcG9zc2libGUgaW5pdGlhbGlzZQorICogdGhlIE1BQyBhZGRyZXNzLiBBdCB0aGlzIHBvaW50IHRoZSBJL08gcmVnaXN0ZXJzIGhhdmUgeWV0IHRvIGJlIG1hcHBlZAorICovCisKK3N0YXRpYyBpbnQgZXQxMzF4X3BjaV9pbml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJCXN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCBpOworCXU4IG1heF9wYXlsb2FkOworCXU4IHJlYWRfc2l6ZV9yZWc7CisKKwlpZiAoZXQxMzF4X2luaXRfZWVwcm9tKGFkYXB0ZXIpIDwgMCkKIAkJcmV0dXJuIC1FSU87Ci0JfSBlbHNlCi0JCWFkYXB0ZXItPmhhc19lZXByb20gPSAxOwotCi0JLyogUmVhZCB0aGUgRUVQUk9NIGZvciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgTEVEIGJlaGF2aW9yLiBSZWZlciB0bwotCSAqIEVUMTMxMF9waHkuYywgZXQxMzF4X3hjdnJfaW5pdCgpLCBmb3IgaXRzIHVzZS4KLQkgKi8KLQlFZXByb21SZWFkQnl0ZShhZGFwdGVyLCAweDcwLCAmYWRhcHRlci0+ZWVwcm9tRGF0YVswXSk7Ci0JRWVwcm9tUmVhZEJ5dGUoYWRhcHRlciwgMHg3MSwgJmFkYXB0ZXItPmVlcHJvbURhdGFbMV0pOwotCi0JaWYgKGFkYXB0ZXItPmVlcHJvbURhdGFbMF0gIT0gMHhjZCkKLQkJLyogRGlzYWJsZSBhbGwgb3B0aW9uYWwgZmVhdHVyZXMgKi8KLQkJYWRhcHRlci0+ZWVwcm9tRGF0YVsxXSA9IDB4MDA7CiAKIAkvKiBMZXQncyBzZXQgdXAgdGhlIFBPUlQgTE9HSUMgUmVnaXN0ZXIuICBGaXJzdCB3ZSBuZWVkIHRvIGtub3cgd2hhdAogCSAqIHRoZSBtYXhfcGF5bG9hZF9zaXplIGlzCiAJICovCi0JcmVzdWx0ID0gcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgRVQxMzEwX1BDSV9NQVhfUFlMRCwgJm1heFBheWxvYWQpOwotCWlmIChyZXN1bHQgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CisJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIEVUMTMxMF9QQ0lfTUFYX1BZTEQsICZtYXhfcGF5bG9hZCkpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkgICAgIkNvdWxkIG5vdCByZWFkIFBDSSBjb25maWcgc3BhY2UgZm9yIE1heCBQYXlsb2FkIFNpemVcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAkvKiBQcm9ncmFtIHRoZSBBY2svTmFrIGxhdGVuY3kgYW5kIHJlcGxheSB0aW1lcnMgKi8KLQltYXhQYXlsb2FkICY9IDB4MDc7CS8qIE9ubHkgdGhlIGxvd2VyIDMgYml0cyBhcmUgdmFsaWQgKi8KKwltYXhfcGF5bG9hZCAmPSAweDA3OwkvKiBPbmx5IHRoZSBsb3dlciAzIGJpdHMgYXJlIHZhbGlkICovCiAKLQlpZiAobWF4UGF5bG9hZCA8IDIpIHsKLQkJY29uc3QgdWludDE2X3QgQWNrTmFrWzJdID0geyAweDc2LCAweEQwIH07Ci0JCWNvbnN0IHVpbnQxNl90IFJlcGxheVsyXSA9IHsgMHgxRTAsIDB4MkVEIH07CisJaWYgKG1heF9wYXlsb2FkIDwgMikgeworCQlzdGF0aWMgY29uc3QgdTE2IEFja05ha1syXSA9IHsgMHg3NiwgMHhEMCB9OworCQlzdGF0aWMgY29uc3QgdTE2IFJlcGxheVsyXSA9IHsgMHgxRTAsIDB4MkVEIH07CiAKLQkJcmVzdWx0ID0gcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIEVUMTMxMF9QQ0lfQUNLX05BQ0ssCi0JCQkJCSAgICAgICBBY2tOYWtbbWF4UGF5bG9hZF0pOwotCQlpZiAocmVzdWx0ICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgeworCQlpZiAocGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIEVUMTMxMF9QQ0lfQUNLX05BQ0ssCisJCQkJCSAgICAgICBBY2tOYWtbbWF4X3BheWxvYWRdKSkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJICAiQ291bGQgbm90IHdyaXRlIFBDSSBjb25maWcgc3BhY2UgZm9yIEFDSy9OQUtcbiIpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KLQotCQlyZXN1bHQgPSBwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgRVQxMzEwX1BDSV9SRVBMQVksCi0JCQkJCSAgICAgICBSZXBsYXlbbWF4UGF5bG9hZF0pOwotCQlpZiAocmVzdWx0ICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgeworCQlpZiAocGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIEVUMTMxMF9QQ0lfUkVQTEFZLAorCQkJCQkgICAgICAgUmVwbGF5W21heF9wYXlsb2FkXSkpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCSAgIkNvdWxkIG5vdCB3cml0ZSBQQ0kgY29uZmlnIHNwYWNlIGZvciBSZXBsYXkgVGltZXJcbiIpOwogCQkJcmV0dXJuIC1FSU87CkBAIC0yNjMsMTYgKzIxMiwxNCBAQAogCS8qIGwwcyBhbmQgbDEgbGF0ZW5jeSB0aW1lcnMuICBXZSBhcmUgdXNpbmcgZGVmYXVsdCB2YWx1ZXMuCiAJICogUmVwcmVzZW50aW5nIDAwMSBmb3IgTDBzIGFuZCAwMTAgZm9yIEwxCiAJICovCi0JcmVzdWx0ID0gcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIEVUMTMxMF9QQ0lfTDBMMUxBVEVOQ1ksIDB4MTEpOwotCWlmIChyZXN1bHQgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CisJaWYgKHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBFVDEzMTBfUENJX0wwTDFMQVRFTkNZLCAweDExKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCSAgIkNvdWxkIG5vdCB3cml0ZSBQQ0kgY29uZmlnIHNwYWNlIGZvciBMYXRlbmN5IFRpbWVyc1xuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAogCS8qIENoYW5nZSB0aGUgbWF4IHJlYWQgc2l6ZSB0byAyayAqLwotCXJlc3VsdCA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTEsICZyZWFkX3NpemVfcmVnKTsKLQlpZiAocmVzdWx0ICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgeworCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDUxLCAmcmVhZF9zaXplX3JlZykpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJIkNvdWxkIG5vdCByZWFkIFBDSSBjb25maWcgc3BhY2UgZm9yIE1heCByZWFkIHNpemVcbiIpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTI4MSw4ICsyMjgsNyBAQAogCXJlYWRfc2l6ZV9yZWcgJj0gMHg4ZjsKIAlyZWFkX3NpemVfcmVnIHw9IDB4NDA7CiAKLQlyZXN1bHQgPSBwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg1MSwgcmVhZF9zaXplX3JlZyk7Ci0JaWYgKHJlc3VsdCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKKwlpZiAocGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTEsIHJlYWRfc2l6ZV9yZWcpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJICAgICAgIkNvdWxkIG5vdCB3cml0ZSBQQ0kgY29uZmlnIHNwYWNlIGZvciBNYXggcmVhZCBzaXplXG4iKTsKIAkJcmV0dXJuIC1FSU87CkBAIC0yOTEsMTkgKzIzNywxOSBAQAogCS8qIEdldCBNQUMgYWRkcmVzcyBmcm9tIGNvbmZpZyBzcGFjZSBpZiBhbiBlZXByb20gZXhpc3RzLCBvdGhlcndpc2UKIAkgKiB0aGUgTUFDIGFkZHJlc3MgdGhlcmUgd2lsbCBub3QgYmUgdmFsaWQKIAkgKi8KLQlpZiAoYWRhcHRlci0+aGFzX2VlcHJvbSkgewotCQlpbnQgaTsKKwlpZiAoIWFkYXB0ZXItPmhhc19lZXByb20pIHsKKwkJZXQxMzF4X2h3YWRkcl9pbml0KGFkYXB0ZXIpOworCQlyZXR1cm4gMDsKKwl9CiAKLQkJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKLQkJCXJlc3VsdCA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKAotCQkJCQlwZGV2LCBFVDEzMTBfUENJX01BQ19BRERSRVNTICsgaSwKLQkJCQkJYWRhcHRlci0+UGVybWFuZW50QWRkcmVzcyArIGkpOwotCQkJaWYgKHJlc3VsdCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKLQkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICI7Q291bGQgbm90IHJlYWQgUENJIGNvbmZpZyBzcGFjZSBmb3IgTUFDIGFkZHJlc3NcbiIpOwotCQkJCXJldHVybiAtRUlPOwotCQkJfQorCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7CisJCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBFVDEzMTBfUENJX01BQ19BRERSRVNTICsgaSwKKwkJCQkJYWRhcHRlci0+UGVybWFuZW50QWRkcmVzcyArIGkpKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZCBub3QgcmVhZCBQQ0kgY29uZmlnIHNwYWNlIGZvciBNQUMgYWRkcmVzc1xuIik7CisJCQlyZXR1cm4gLUVJTzsKIAkJfQogCX0KKwltZW1jcHkoYWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIGFkYXB0ZXItPlBlcm1hbmVudEFkZHJlc3MsIEVUSF9BTEVOKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzgzLDUyICszMjksMzQgQEAKIHsKIAlzdHJ1Y3QgX0dMT0JBTF90IF9faW9tZW0gKnJlZ3MgPSAmZXRkZXYtPnJlZ3MtPmdsb2JhbDsKIAotCWlmIChldGRldi0+UmVnaXN0cnlQaHlMb29wYmsgPT0gZmFsc2UpIHsKLQkJaWYgKGV0ZGV2LT5SZWdpc3RyeUp1bWJvUGFja2V0IDwgMjA0OCkgewotCQkJLyogVHggLyBSeERNQSBhbmQgVHgvUnggTUFDIGludGVyZmFjZXMgaGF2ZSBhIDFrIHdvcmQKLQkJCSAqIGJsb2NrIG9mIFJBTSB0aGF0IHRoZSBkcml2ZXIgY2FuIHNwbGl0IGJldHdlZW4gVHgKLQkJCSAqIGFuZCBSeCBhcyBpdCBkZXNpcmVzLiAgT3VyIGRlZmF1bHQgaXMgdG8gc3BsaXQgaXQKLQkJCSAqIDUwLzUwOgotCQkJICovCi0JCQl3cml0ZWwoMCwgJnJlZ3MtPnJ4cV9zdGFydF9hZGRyKTsKLQkJCXdyaXRlbChQQVJNX1JYX01FTV9FTkRfREVGLCAmcmVncy0+cnhxX2VuZF9hZGRyKTsKLQkJCXdyaXRlbChQQVJNX1JYX01FTV9FTkRfREVGICsgMSwgJnJlZ3MtPnR4cV9zdGFydF9hZGRyKTsKLQkJCXdyaXRlbChJTlRFUk5BTF9NRU1fU0laRSAtIDEsICZyZWdzLT50eHFfZW5kX2FkZHIpOwotCQl9IGVsc2UgaWYgKGV0ZGV2LT5SZWdpc3RyeUp1bWJvUGFja2V0IDwgODE5MikgewotCQkJLyogRm9yIGp1bWJvIHBhY2tldHMgPiAyayBidXQgPCA4aywgc3BsaXQgNTAtNTAuICovCi0JCQl3cml0ZWwoMCwgJnJlZ3MtPnJ4cV9zdGFydF9hZGRyKTsKLQkJCXdyaXRlbChJTlRFUk5BTF9NRU1fUlhfT0ZGU0VULCAmcmVncy0+cnhxX2VuZF9hZGRyKTsKLQkJCXdyaXRlbChJTlRFUk5BTF9NRU1fUlhfT0ZGU0VUICsgMSwgJnJlZ3MtPnR4cV9zdGFydF9hZGRyKTsKLQkJCXdyaXRlbChJTlRFUk5BTF9NRU1fU0laRSAtIDEsICZyZWdzLT50eHFfZW5kX2FkZHIpOwotCQl9IGVsc2UgewotCQkJLyogOTIxNiBpcyB0aGUgb25seSBwYWNrZXQgc2l6ZSBncmVhdGVyIHRoYW4gOGsgdGhhdAotCQkJICogaXMgYXZhaWxhYmxlLiBUaGUgVHggYnVmZmVyIGhhcyB0byBiZSBiaWcgZW5vdWdoCi0JCQkgKiBmb3Igb25lIHdob2xlIHBhY2tldCBvbiB0aGUgVHggc2lkZS4gV2UnbGwgbWFrZQotCQkJICogdGhlIFR4IDk0MDgsIGFuZCBnaXZlIHRoZSByZXN0IHRvIFJ4Ci0JCQkgKi8KLQkJCXdyaXRlbCgweDAwMDAsICZyZWdzLT5yeHFfc3RhcnRfYWRkcik7Ci0JCQl3cml0ZWwoMHgwMWIzLCAmcmVncy0+cnhxX2VuZF9hZGRyKTsKLQkJCXdyaXRlbCgweDAxYjQsICZyZWdzLT50eHFfc3RhcnRfYWRkcik7Ci0JCQl3cml0ZWwoSU5URVJOQUxfTUVNX1NJWkUgLSAxLCZyZWdzLT50eHFfZW5kX2FkZHIpOwotCQl9CisJd3JpdGVsKDAsICZyZWdzLT5yeHFfc3RhcnRfYWRkcik7CisJd3JpdGVsKElOVEVSTkFMX01FTV9TSVpFIC0gMSwgJnJlZ3MtPnR4cV9lbmRfYWRkcik7CiAKLQkJLyogSW5pdGlhbGl6ZSB0aGUgbG9vcGJhY2sgcmVnaXN0ZXIuIERpc2FibGUgYWxsIGxvb3BiYWNrcy4gKi8KLQkJd3JpdGVsKDAsICZyZWdzLT5sb29wYmFjayk7Ci0JfSBlbHNlIHsKLQkJLyogRm9yIFBIWSBMaW5lIGxvb3BiYWNrLCB0aGUgbWVtb3J5IGlzIGNvbmZpZ3VyZWQgYXMgaWYgVHgKLQkJICogYW5kIFJ4IGJvdGggaGF2ZSBhbGwgdGhlIG1lbW9yeS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUKLQkJICogUnhNQUMgd2lsbCB3cml0ZSBkYXRhIGludG8gdGhlIHNwYWNlLCBhbmQgdGhlIFR4TUFDIHdpbGwKLQkJICogcmVhZCBpdCBvdXQuCisJaWYgKGV0ZGV2LT5SZWdpc3RyeUp1bWJvUGFja2V0IDwgMjA0OCkgeworCQkvKiBUeCAvIFJ4RE1BIGFuZCBUeC9SeCBNQUMgaW50ZXJmYWNlcyBoYXZlIGEgMWsgd29yZAorCQkgKiBibG9jayBvZiBSQU0gdGhhdCB0aGUgZHJpdmVyIGNhbiBzcGxpdCBiZXR3ZWVuIFR4CisJCSAqIGFuZCBSeCBhcyBpdCBkZXNpcmVzLiAgT3VyIGRlZmF1bHQgaXMgdG8gc3BsaXQgaXQKKwkJICogNTAvNTA6CiAJCSAqLwotCQl3cml0ZWwoMCwgJnJlZ3MtPnJ4cV9zdGFydF9hZGRyKTsKLQkJd3JpdGVsKElOVEVSTkFMX01FTV9TSVpFIC0gMSwgJnJlZ3MtPnJ4cV9lbmRfYWRkcik7Ci0JCXdyaXRlbCgwLCAmcmVncy0+dHhxX3N0YXJ0X2FkZHIpOwotCQl3cml0ZWwoSU5URVJOQUxfTUVNX1NJWkUgLSAxLCAmcmVncy0+dHhxX2VuZF9hZGRyKTsKLQotCQkvKiBJbml0aWFsaXplIHRoZSBsb29wYmFjayByZWdpc3RlciAoTUFDIGxvb3BiYWNrKS4gKi8KLQkJd3JpdGVsKEVUX0xPT1BfTUFDLCAmcmVncy0+bG9vcGJhY2spOworCQl3cml0ZWwoUEFSTV9SWF9NRU1fRU5EX0RFRiwgJnJlZ3MtPnJ4cV9lbmRfYWRkcik7CisJCXdyaXRlbChQQVJNX1JYX01FTV9FTkRfREVGICsgMSwgJnJlZ3MtPnR4cV9zdGFydF9hZGRyKTsKKwl9IGVsc2UgaWYgKGV0ZGV2LT5SZWdpc3RyeUp1bWJvUGFja2V0IDwgODE5MikgeworCQkvKiBGb3IganVtYm8gcGFja2V0cyA+IDJrIGJ1dCA8IDhrLCBzcGxpdCA1MC01MC4gKi8KKwkJd3JpdGVsKElOVEVSTkFMX01FTV9SWF9PRkZTRVQsICZyZWdzLT5yeHFfZW5kX2FkZHIpOworCQl3cml0ZWwoSU5URVJOQUxfTUVNX1JYX09GRlNFVCArIDEsICZyZWdzLT50eHFfc3RhcnRfYWRkcik7CisJfSBlbHNlIHsKKwkJLyogOTIxNiBpcyB0aGUgb25seSBwYWNrZXQgc2l6ZSBncmVhdGVyIHRoYW4gOGsgdGhhdAorCQkgKiBpcyBhdmFpbGFibGUuIFRoZSBUeCBidWZmZXIgaGFzIHRvIGJlIGJpZyBlbm91Z2gKKwkJICogZm9yIG9uZSB3aG9sZSBwYWNrZXQgb24gdGhlIFR4IHNpZGUuIFdlJ2xsIG1ha2UKKwkJICogdGhlIFR4IDk0MDgsIGFuZCBnaXZlIHRoZSByZXN0IHRvIFJ4CisJCSAqLworCQl3cml0ZWwoMHgwMWIzLCAmcmVncy0+cnhxX2VuZF9hZGRyKTsKKwkJd3JpdGVsKDB4MDFiNCwgJnJlZ3MtPnR4cV9zdGFydF9hZGRyKTsKIAl9CiAKKwkvKiBJbml0aWFsaXplIHRoZSBsb29wYmFjayByZWdpc3Rlci4gRGlzYWJsZSBhbGwgbG9vcGJhY2tzLiAqLworCXdyaXRlbCgwLCAmcmVncy0+bG9vcGJhY2spOworCiAJLyogTVNJIFJlZ2lzdGVyICovCiAJd3JpdGVsKDAsICZyZWdzLT5tc2lfY29uZmlnKTsKIApAQCAtNDk4LDU3ICs0MjYsMTggQEAKIH0KIAogLyoqCi0gKiBldDEzMXhfc2V0dXBfaGFyZHdhcmVfcHJvcGVydGllcyAtIHNldCB1cCB0aGUgTUFDIEFkZHJlc3Mgb24gdGhlIEVUMTMxMAotICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqLwotdm9pZCBldDEzMXhfc2V0dXBfaGFyZHdhcmVfcHJvcGVydGllcyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JLyogSWYgaGF2ZSBvdXIgZGVmYXVsdCBtYWMgZnJvbSByZWdpc3RyeSBhbmQgbm8gbWFjIGFkZHJlc3MgZnJvbQotCSAqIEVFUFJPTSB0aGVuIHdlIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIGxhc3Qgb2N0ZXQgYW5kIHNldCBpdCBvbiB0aGUKLQkgKiBkZXZpY2UKLQkgKi8KLQlpZiAoYWRhcHRlci0+UGVybWFuZW50QWRkcmVzc1swXSA9PSAweDAwICYmCi0JICAgIGFkYXB0ZXItPlBlcm1hbmVudEFkZHJlc3NbMV0gPT0gMHgwMCAmJgotCSAgICBhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzWzJdID09IDB4MDAgJiYKLQkgICAgYWRhcHRlci0+UGVybWFuZW50QWRkcmVzc1szXSA9PSAweDAwICYmCi0JICAgIGFkYXB0ZXItPlBlcm1hbmVudEFkZHJlc3NbNF0gPT0gMHgwMCAmJgotCSAgICBhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzWzVdID09IDB4MDApIHsKLQkJLyoKLQkJICogV2UgbmVlZCB0byByYW5kb21seSBnZW5lcmF0ZSB0aGUgbGFzdCBvY3RldCBzbyB3ZQotCQkgKiBkZWNyZWFzZSBvdXIgY2hhbmNlcyBvZiBzZXR0aW5nIHRoZSBtYWMgYWRkcmVzcyB0bwotCQkgKiBzYW1lIGFzIGFub3RoZXIgb25lIG9mIG91ciBjYXJkcyBpbiB0aGUgc3lzdGVtCi0JCSAqLwotCQlnZXRfcmFuZG9tX2J5dGVzKCZhZGFwdGVyLT5DdXJyZW50QWRkcmVzc1s1XSwgMSk7Ci0JCS8qCi0JCSAqIFdlIGhhdmUgdGhlIGRlZmF1bHQgdmFsdWUgaW4gdGhlIHJlZ2lzdGVyIHdlIGFyZQotCQkgKiB3b3JraW5nIHdpdGggc28gd2UgbmVlZCB0byBjb3B5IHRoZSBjdXJyZW50Ci0JCSAqIGFkZHJlc3MgaW50byB0aGUgcGVybWFuZW50IGFkZHJlc3MKLQkJICovCi0JCW1lbWNweShhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzLAotCQkJYWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIEVUSF9BTEVOKTsKLQl9IGVsc2UgewotCQkvKiBXZSBkbyBub3QgaGF2ZSBhbiBvdmVycmlkZSBhZGRyZXNzLCBzbyBzZXQgdGhlCi0JCSAqIGN1cnJlbnQgYWRkcmVzcyB0byB0aGUgcGVybWFuZW50IGFkZHJlc3MgYW5kIGFkZAotCQkgKiBpdCB0byB0aGUgZGV2aWNlCi0JCSAqLwotCQltZW1jcHkoYWRhcHRlci0+Q3VycmVudEFkZHJlc3MsCi0JCSAgICAgICBhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzLCBFVEhfQUxFTik7Ci0JfQotfQotCi0vKioKICAqIGV0MTMxeF9zb2Z0X3Jlc2V0IC0gSXNzdWUgYSBzb2Z0IHJlc2V0IHRvIHRoZSBoYXJkd2FyZSwgY29tcGxldGUgZm9yIEVUMTMxMAogICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICAqLwogdm9pZCBldDEzMXhfc29mdF9yZXNldChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJLyogRGlzYWJsZSBNQUMgQ29yZSAqLwotCXdyaXRlbCgweGMwMGYwMDAwLCAmYWRhcHRlci0+cmVncy0+bWFjLmNmZzEudmFsdWUpOworCXdyaXRlbCgweGMwMGYwMDAwLCAmYWRhcHRlci0+cmVncy0+bWFjLmNmZzEpOwogCiAJLyogU2V0IGV2ZXJ5dGhpbmcgdG8gYSByZXNldCB2YWx1ZSAqLwogCXdyaXRlbCgweDdGLCAmYWRhcHRlci0+cmVncy0+Z2xvYmFsLnN3X3Jlc2V0KTsKLQl3cml0ZWwoMHgwMDBmMDAwMCwgJmFkYXB0ZXItPnJlZ3MtPm1hYy5jZmcxLnZhbHVlKTsKLQl3cml0ZWwoMHgwMDAwMDAwMCwgJmFkYXB0ZXItPnJlZ3MtPm1hYy5jZmcxLnZhbHVlKTsKKwl3cml0ZWwoMHgwMDBmMDAwMCwgJmFkYXB0ZXItPnJlZ3MtPm1hYy5jZmcxKTsKKwl3cml0ZWwoMHgwMDAwMDAwMCwgJmFkYXB0ZXItPnJlZ3MtPm1hYy5jZmcxKTsKIH0KIAogLyoqCkBAIC01ODgsMzYgKzQ3NywzMiBAQAogICovCiBpbnQgZXQxMzF4X2FkYXB0ZXJfbWVtb3J5X2FsbG9jKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlpbnQgc3RhdHVzID0gMDsKKwlpbnQgc3RhdHVzOwogCi0JZG8gewotCQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBUeCBSaW5nICovCi0JCXN0YXR1cyA9IGV0MTMxeF90eF9kbWFfbWVtb3J5X2FsbG9jKGFkYXB0ZXIpOwotCQlpZiAoc3RhdHVzICE9IDApIHsKLQkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCQkgICJldDEzMXhfdHhfZG1hX21lbW9yeV9hbGxvYyBGQUlMRURcbiIpOwotCQkJYnJlYWs7Ci0JCX0KKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBUeCBSaW5nICovCisJc3RhdHVzID0gZXQxMzF4X3R4X2RtYV9tZW1vcnlfYWxsb2MoYWRhcHRlcik7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSAgImV0MTMxeF90eF9kbWFfbWVtb3J5X2FsbG9jIEZBSUxFRFxuIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCS8qIFJlY2VpdmUgYnVmZmVyIG1lbW9yeSBhbGxvY2F0aW9uICovCisJc3RhdHVzID0gZXQxMzF4X3J4X2RtYV9tZW1vcnlfYWxsb2MoYWRhcHRlcik7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSAgImV0MTMxeF9yeF9kbWFfbWVtb3J5X2FsbG9jIEZBSUxFRFxuIik7CisJCWV0MTMxeF90eF9kbWFfbWVtb3J5X2ZyZWUoYWRhcHRlcik7CisJCXJldHVybiBzdGF0dXM7CisJfQogCi0JCS8qIFJlY2VpdmUgYnVmZmVyIG1lbW9yeSBhbGxvY2F0aW9uICovCi0JCXN0YXR1cyA9IGV0MTMxeF9yeF9kbWFfbWVtb3J5X2FsbG9jKGFkYXB0ZXIpOwotCQlpZiAoc3RhdHVzICE9IDApIHsKLQkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCQkgICJldDEzMXhfcnhfZG1hX21lbW9yeV9hbGxvYyBGQUlMRURcbiIpOwotCQkJZXQxMzF4X3R4X2RtYV9tZW1vcnlfZnJlZShhZGFwdGVyKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogSW5pdCByZWNlaXZlIGRhdGEgc3RydWN0dXJlcyAqLwotCQlzdGF0dXMgPSBldDEzMXhfaW5pdF9yZWN2KGFkYXB0ZXIpOwotCQlpZiAoc3RhdHVzICE9IDApIHsKLQkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCQkiZXQxMzF4X2luaXRfcmVjdiBGQUlMRURcbiIpOwotCQkJZXQxMzF4X3R4X2RtYV9tZW1vcnlfZnJlZShhZGFwdGVyKTsKLQkJCWV0MTMxeF9yeF9kbWFfbWVtb3J5X2ZyZWUoYWRhcHRlcik7Ci0JCQlicmVhazsKLQkJfQotCX0gd2hpbGUgKDApOworCS8qIEluaXQgcmVjZWl2ZSBkYXRhIHN0cnVjdHVyZXMgKi8KKwlzdGF0dXMgPSBldDEzMXhfaW5pdF9yZWN2KGFkYXB0ZXIpOworCWlmIChzdGF0dXMgIT0gMCkgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkiZXQxMzF4X2luaXRfcmVjdiBGQUlMRURcbiIpOworCQlldDEzMXhfdHhfZG1hX21lbW9yeV9mcmVlKGFkYXB0ZXIpOworCQlldDEzMXhfcnhfZG1hX21lbW9yeV9mcmVlKGFkYXB0ZXIpOworCX0KIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC02MzIsMjIgKzUxNyw1MCBAQAogCWV0MTMxeF9yeF9kbWFfbWVtb3J5X2ZyZWUoYWRhcHRlcik7CiB9CiAKKworCiAvKioKLSAqIGV0MTMxeF9jb25maWdfcGFyc2UKKyAqIGV0MTMxeF9hZGFwdGVyX2luaXQKICAqIEBldGRldjogcG9pbnRlciB0byB0aGUgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdAorICogQHBkZXY6IHBvaW50ZXIgdG8gdGhlIFBDSSBkZXZpY2UKICAqCi0gKiBQYXJzZXMgYSBjb25maWd1cmF0aW9uIGZyb20gc29tZSBsb2NhdGlvbiAobW9kdWxlIHBhcmFtZXRlcnMsIGZvciBleGFtcGxlKQotICogaW50byB0aGUgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdC4gVGhpcyByZWFsbHkgaGFzIG5vIHNlbnNpYmxlIGFuYWxvZ3kgaW4KLSAqIExpbnV4IGFzIHN5c2ZzIHBhcmFtZXRlcnMgYXJlIGR5bmFtaWMuIFNldmVyYWwgdGhpbmdzIHRoYXQgd2VyZSBoZWUgY291bGQKLSAqIGdvIGludG8gc3lzZnMsIGJ1dCBvdGhlciBzdHVmZiBsaWtlIHNwZWVkIGhhbmRsaW5nIGlzIHBhcnQgb2YgdGhlIG1paQotICogaW50ZXJmYWNlcy9ldGh0b29sLgorICogSW5pdGlhbGl6ZSB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgZXQxMzF4X2FkYXB0ZXIgb2JqZWN0IGFuZCBsaW5rCisgKiB0aGVtIHRvZ2V0aGVyIHdpdGggdGhlIHBsYXRmb3JtIHByb3ZpZGVkIGRldmljZSBzdHJ1Y3R1cmVzLgogICovCi12b2lkIGV0MTMxeF9jb25maWdfcGFyc2Uoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKKworCitzdGF0aWMgc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldDEzMXhfYWRhcHRlcl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCXN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0YXRpYyBjb25zdCB1OCBkZWZhdWx0X21hY1tdID0geyAweDAwLCAweDA1LCAweDNkLCAweDAwLCAweDAyLCAweDAwIH07CiAJc3RhdGljIGNvbnN0IHU4IGR1cGxleFtdID0geyAwLCAxLCAyLCAxLCAyLCAyIH07CiAJc3RhdGljIGNvbnN0IHUxNiBzcGVlZFtdID0geyAwLCAxMCwgMTAsIDEwMCwgMTAwLCAxMDAwIH07CiAKKwlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2OworCisJLyogU2V0dXAgdGhlIGZ1bmRhbWVudGFsIG5ldF9kZXZpY2UgYW5kIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUgZWxlbWVudHMgICovCisJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmcGRldi0+ZGV2KTsKKworCS8qIEFsbG9jYXRlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3QgYW5kIGNvcHkgaW4gcmVsZXZhbnQgaW5mb3JtYXRpb24gKi8KKwlldGRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJZXRkZXYtPnBkZXYgPSBwY2lfZGV2X2dldChwZGV2KTsKKwlldGRldi0+bmV0ZGV2ID0gbmV0ZGV2OworCisJLyogRG8gdGhlIHNhbWUgZm9yIHRoZSBuZXRkZXYgc3RydWN0ICovCisJbmV0ZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJbmV0ZGV2LT5iYXNlX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisKKwkvKiBJbml0aWFsaXplIHNwaW5sb2NrcyBoZXJlICovCisJc3Bpbl9sb2NrX2luaXQoJmV0ZGV2LT5Mb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZXRkZXYtPlRDQlNlbmRRTG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmV0ZGV2LT5UQ0JSZWFkeVFMb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZXRkZXYtPlNlbmRIV0xvY2spOworCXNwaW5fbG9ja19pbml0KCZldGRldi0+UmN2TG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmV0ZGV2LT5SY3ZQZW5kTG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmV0ZGV2LT5GYnJMb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZXRkZXYtPlBIWUxvY2spOworCisJLyogUGFyc2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGludG8gdGhlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3QgKi8KIAlpZiAoZXQxMzF4X3NwZWVkX3NldCkKIAkJZGV2X2luZm8oJmV0ZGV2LT5wZGV2LT5kZXYsCiAJCQkiU3BlZWQgc2V0IG1hbnVhbGx5IHRvIDogJWQgXG4iLCBldDEzMXhfc3BlZWRfc2V0KTsKQEAgLTY1NSw4ICs1NjgsNiBAQAogCWV0ZGV2LT5TcGVlZER1cGxleCA9IGV0MTMxeF9zcGVlZF9zZXQ7CiAJZXRkZXYtPlJlZ2lzdHJ5SnVtYm9QYWNrZXQgPSAxNTE0OwkvKiAxNTE0LTkyMTYgKi8KIAotCWV0ZGV2LT5SZWdpc3RyeU5NSURpc2FibGUgPSBldDEzMXhfbm1pX2Rpc2FibGU7Ci0KIAkvKiBTZXQgdGhlIE1BQyBhZGRyZXNzIHRvIGEgZGVmYXVsdCAqLwogCW1lbWNweShldGRldi0+Q3VycmVudEFkZHJlc3MsIGRlZmF1bHRfbWFjLCBFVEhfQUxFTik7CiAKQEAgLTY3NCw0MCArNTg1LDEwIEBACiAKIAlldGRldi0+QWlGb3JjZVNwZWVkID0gc3BlZWRbZXRkZXYtPlNwZWVkRHVwbGV4XTsKIAlldGRldi0+QWlGb3JjZURweCA9IGR1cGxleFtldGRldi0+U3BlZWREdXBsZXhdOwkvKiBBdXRvIEZEWCAqLworCisJcmV0dXJuIGV0ZGV2OwogfQogCi0KLS8qKgotICogZXQxMzF4X3BjaV9yZW1vdmUKLSAqIEBwZGV2OiBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCi0gKgotICogUmVnaXN0ZXJlZCBpbiB0aGUgcGNpX2RyaXZlciBzdHJ1Y3R1cmUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlCi0gKiBQQ0kgc3Vic3lzdGVtIGRldGVjdHMgdGhhdCBhIFBDSSBkZXZpY2Ugd2hpY2ggbWF0Y2hlcyB0aGUgaW5mb3JtYXRpb24KLSAqIGNvbnRhaW5lZCBpbiB0aGUgcGNpX2RldmljZV9pZCB0YWJsZSBoYXMgYmVlbiByZW1vdmVkLgotICovCi0KLXZvaWQgX19kZXZleGl0IGV0MTMxeF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7Ci0Jc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyOwotCi0JLyogUmV0cmlldmUgdGhlIG5ldF9kZXZpY2UgcG9pbnRlciBmcm9tIHRoZSBwY2lfZGV2IHN0cnVjdCwgYXMgd2VsbAotCSAqIGFzIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0Ci0JICovCi0JbmV0ZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlhZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCS8qIFBlcmZvcm0gZGV2aWNlIGNsZWFudXAgKi8KLQl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOwotCWV0MTMxeF9hZGFwdGVyX21lbW9yeV9mcmVlKGFkYXB0ZXIpOwotCWlvdW5tYXAoYWRhcHRlci0+cmVncyk7Ci0JcGNpX2Rldl9wdXQoYWRhcHRlci0+cGRldik7Ci0JZnJlZV9uZXRkZXYobmV0ZGV2KTsKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLX0KLQotCiAvKioKICAqIGV0MTMxeF9wY2lfc2V0dXAgLSBQZXJmb3JtIGRldmljZSBpbml0aWFsaXphdGlvbgogICogQHBkZXY6IGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKQEAgLTcyMSwzNCArNjAyLDMxIEBACiAgKiBhIGRldmljZSBpbnNlcnRpb24gcm91dGluZS4KICAqLwogCi1pbnQgX19kZXZpbml0IGV0MTMxeF9wY2lfc2V0dXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBldDEzMXhfcGNpX3NldHVwKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7Ci0JaW50IHJlc3VsdCA9IDA7CisJaW50IHJlc3VsdCA9IC1FQlVTWTsKIAlpbnQgcG1fY2FwOwogCWJvb2wgcGNpX3VzaW5nX2RhYzsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyOwogCiAJLyogRW5hYmxlIHRoZSBkZXZpY2UgdmlhIHRoZSBQQ0kgc3Vic3lzdGVtICovCi0JcmVzdWx0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikgIT0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkicGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWRcbiIpOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIC1FSU87CiAJfQogCiAJLyogUGVyZm9ybSBzb21lIGJhc2ljIFBDSSBjaGVja3MgKi8KIAlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkgICJDYW4ndCBmaW5kIFBDSSBkZXZpY2UncyBiYXNlIGFkZHJlc3NcbiIpOwotCQlyZXN1bHQgPSAtRU5PREVWOwotCQlnb3RvIG91dDsKKwkJZ290byBlcnJfZGlzYWJsZTsKIAl9CiAKLQlyZXN1bHQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSSVZFUl9OQU1FKTsKLQlpZiAocmVzdWx0ICE9IDApIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSSVZFUl9OQU1FKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkiQ2FuJ3QgZ2V0IFBDSSByZXNvdXJjZXNcbiIpOwogCQlnb3RvIGVycl9kaXNhYmxlOwogCX0KQEAgLTc2MywyNyArNjQxLDI2IEBACiAJICovCiAJcG1fY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX1BNKTsKIAlpZiAocG1fY2FwID09IDApIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkgICJDYW5ub3QgZmluZCBQb3dlciBNYW5hZ2VtZW50IGNhcGFiaWxpdGllc1xuIik7CiAJCXJlc3VsdCA9IC1FSU87CiAJCWdvdG8gZXJyX3JlbGVhc2VfcmVzOwogCX0KIAogCS8qIENoZWNrIHRoZSBETUEgYWRkcmVzc2luZyBzdXBwb3J0IG9mIHRoaXMgZGV2aWNlICovCi0JaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCkpIHsKKwlpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSkpIHsKIAkJcGNpX3VzaW5nX2RhYyA9IHRydWU7CiAKLQkJcmVzdWx0ID0KLQkJICAgIHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpOworCQlyZXN1bHQgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSk7CiAJCWlmIChyZXN1bHQgIT0gMCkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJCSAgIlVuYWJsZSB0byBvYnRhaW4gNjQgYml0IERNQSBmb3IgY29uc2lzdGVudCBhbGxvY2F0aW9uc1xuIik7CiAJCQlnb3RvIGVycl9yZWxlYXNlX3JlczsKIAkJfQotCX0gZWxzZSBpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZlVMTCkpIHsKKwl9IGVsc2UgaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpKSB7CiAJCXBjaV91c2luZ19kYWMgPSBmYWxzZTsKIAl9IGVsc2UgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCSJObyB1c2FibGUgRE1BIGFkZHJlc3NpbmcgbWV0aG9kXG4iKTsKIAkJcmVzdWx0ID0gLUVJTzsKIAkJZ290byBlcnJfcmVsZWFzZV9yZXM7CkBAIC03OTIsODcgKzY2OSwyMiBAQAogCS8qIEFsbG9jYXRlIG5ldGRldiBhbmQgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHMgKi8KIAluZXRkZXYgPSBldDEzMXhfZGV2aWNlX2FsbG9jKCk7CiAJaWYgKG5ldGRldiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCSJDb3VsZG4ndCBhbGxvYyBuZXRkZXYgc3RydWN0XG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2MgbmV0ZGV2IHN0cnVjdFxuIik7CiAJCXJlc3VsdCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX3JlbGVhc2VfcmVzOwogCX0KLQotCS8qIFNldHVwIHRoZSBmdW5kYW1lbnRhbCBuZXRfZGV2aWNlIGFuZCBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlIGVsZW1lbnRzICAqLwotCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJnBkZXYtPmRldik7Ci0JLyoKLQlpZiAocGNpX3VzaW5nX2RhYykgewotCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKLQl9Ci0JKi8KLQotCS8qCi0JICogTk9URSAtIFR1cm4gdGhpcyBvbiB3aGVuIHdlJ3JlIHJlYWR5IHRvIGRlYWwgd2l0aCBTRy1ETUEKLQkgKgotCSAqIE5PVEU6IEFjY29yZGluZyB0byAiTGludXggRGV2aWNlIERyaXZlcnMiLCAzcmQgZWQsIFJ1YmluaSBldCBhbCwKLQkgKiBpZiBjaGVja3N1bW1pbmcgaXMgbm90IHBlcmZvcm1lZCBpbiBIVywgdGhlbiB0aGUga2VybmVsIHdpbGwgbm90Ci0JICogdXNlIFNHLgotCSAqIEZyb20gcHAgNTEwLTUxMToKLQkgKgotCSAqICJOb3RlIHRoYXQgdGhlIGtlcm5lbCBkb2VzIG5vdCBwZXJmb3JtIHNjYXR0ZXIvZ2F0aGVyIEkvTyB0byB5b3VyCi0JICogZGV2aWNlIGlmIGl0IGRvZXMgbm90IGFsc28gcHJvdmlkZSBzb21lIGZvcm0gb2YgY2hlY2tzdW1taW5nIGFzCi0JICogd2VsbC4gVGhlIHJlYXNvbiBpcyB0aGF0LCBpZiB0aGUga2VybmVsIGhhcyB0byBtYWtlIGEgcGFzcyBvdmVyIGEKLQkgKiBmcmFnbWVudGVkICgibm9ubGluZWFyIikgcGFja2V0IHRvIGNhbGN1bGF0ZSB0aGUgY2hlY2tzdW0sIGl0Ci0JICogbWlnaHQgYXMgd2VsbCBjb3B5IHRoZSBkYXRhIGFuZCBjb2FsZXNjZSB0aGUgcGFja2V0IGF0IHRoZSBzYW1lCi0JICogdGltZS4iCi0JICoKLQkgKiBUaGlzIGhhcyBiZWVuIHZlcmlmaWVkIGJ5IHNldHRpbmcgdGhlIGZsYWdzIGJlbG93IGFuZCBzdGlsbCBub3QKLQkgKiByZWNlaXZpbmcgYSBzY2F0dGVyZWQgYnVmZmVyIGZyb20gdGhlIG5ldHdvcmsgc3RhY2ssIHNvIGxlYXZlIGl0Ci0JICogb2ZmIHVudGlsIGNoZWNrc3VtcyBhcmUgY2FsY3VsYXRlZCBpbiBIVy4KLQkgKi8KLQkvKiBuZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0c7ICovCi0JLyogbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX05PX0NTVU07ICovCi0JLyogbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0xMVFg7ICovCi0KLQkvKiBBbGxvY2F0ZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0IGFuZCBjb3B5IGluIHJlbGV2YW50IGluZm9ybWF0aW9uICovCi0JYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JYWRhcHRlci0+cGRldiA9IHBjaV9kZXZfZ2V0KHBkZXYpOwotCWFkYXB0ZXItPm5ldGRldiA9IG5ldGRldjsKLQotCS8qIERvIHRoZSBzYW1lIGZvciB0aGUgbmV0ZGV2IHN0cnVjdCAqLwotCW5ldGRldi0+aXJxID0gcGRldi0+aXJxOwotCW5ldGRldi0+YmFzZV9hZGRyID0gcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQ7Ci0KLQkvKiBJbml0aWFsaXplIHNwaW5sb2NrcyBoZXJlICovCi0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPkxvY2spOwotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5UQ0JTZW5kUUxvY2spOwotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5UQ0JSZWFkeVFMb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+U2VuZEhXTG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPlNlbmRXYWl0TG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPlJjdkxvY2spOwotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5SY3ZQZW5kTG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPkZickxvY2spOwotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5QSFlMb2NrKTsKLQotCS8qIFBhcnNlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbnRvIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0ICovCi0JZXQxMzF4X2NvbmZpZ19wYXJzZShhZGFwdGVyKTsKLQotCS8qIEZpbmQgdGhlIHBoeXNpY2FsIGFkYXB0ZXIKLQkgKgotCSAqIE5PVEU6IFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIE1wRmluZEFkYXB0ZXIoKSByb3V0aW5lOyBjYW4gd2UKLQkgKiAgICAgICBsdW1wIGl0J3MgaW5pdCB3aXRoIHRoZSBkZXZpY2Ugc3BlY2lmaWMgaW5pdCBiZWxvdyBpbnRvIGEKLQkgKiAgICAgICBzaW5nbGUgaW5pdCBmdW5jdGlvbj8KLQkgKi8KLQkvKiB3aGlsZSAoZXQxMzF4X2ZpbmRfYWRhcHRlcihhZGFwdGVyLCBwZGV2KSAhPSAwKTsgKi8KLQlldDEzMXhfZmluZF9hZGFwdGVyKGFkYXB0ZXIsIHBkZXYpOworCWFkYXB0ZXIgPSBldDEzMXhfYWRhcHRlcl9pbml0KG5ldGRldiwgcGRldik7CisJLyogSW5pdGlhbGlzZSB0aGUgUENJIHNldHVwIGZvciB0aGUgZGV2aWNlICovCisJZXQxMzF4X3BjaV9pbml0KGFkYXB0ZXIsIHBkZXYpOwogCiAJLyogTWFwIHRoZSBidXMtcmVsYXRpdmUgcmVnaXN0ZXJzIHRvIHN5c3RlbSB2aXJ0dWFsIG1lbW9yeSAqLwotCi0JYWRhcHRlci0+cmVncyA9IGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCi0JCQkJCSAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCWFkYXB0ZXItPnJlZ3MgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgMCk7CiAJaWYgKGFkYXB0ZXItPnJlZ3MgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgbWFwIGRldmljZSByZWdpc3RlcnNcbiIpOwogCQlyZXN1bHQgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9mcmVlX2RldjsKIAl9CiAKLQkvKiBQZXJmb3JtIGRldmljZS1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBoZXJlIChTZWUgY29kZSBiZWxvdykgKi8KLQogCS8qIElmIFBoeSBDT01BIG1vZGUgd2FzIGVuYWJsZWQgd2hlbiB3ZSB3ZW50IGRvd24sIGRpc2FibGUgaXQgaGVyZS4gKi8KIAl3cml0ZWwoRVRfUE1DU1JfSU5JVCwgICZhZGFwdGVyLT5yZWdzLT5nbG9iYWwucG1fY3NyKTsKIApAQCAtODkyLDIwICs3MDQsMTIgQEAKIAkvKiBJbml0IHNlbmQgZGF0YSBzdHJ1Y3R1cmVzICovCiAJZXQxMzF4X2luaXRfc2VuZChhZGFwdGVyKTsKIAotCS8qIFJlZ2lzdGVyIHRoZSBpbnRlcnJ1cHQKLQkgKgotCSAqIE5PVEUgLSBUaGlzIGlzIGJlaW5nIGRvbmUgaW4gdGhlIG9wZW4gcm91dGluZSwgd2hlcmUgbW9zdCBvdGhlcgotCSAqICAgICAgICAgTGludXggZHJpdmVycyBzZXR1cCBJUlEgaGFuZGxlcnMuIE1ha2Ugc3VyZSBkZXZpY2UKLQkgKiAgICAgICAgIGludGVycnVwdHMgYXJlIG5vdCB0dXJuZWQgb24gYmVmb3JlIHRoZSBJUlEgaXMgcmVnaXN0ZXJlZCEhCi0JICoKLQkgKiAgICAgICAgIFdoYXQgd2Ugd2lsbCBkbyBoZXJlIGlzIHNldHVwIHRoZSB0YXNrIHN0cnVjdHVyZSBmb3IgdGhlCi0JICogICAgICAgICBJU1IncyBkZWZlcnJlZCBoYW5kbGVyCisJLyoKKwkgKiBTZXQgdXAgdGhlIHRhc2sgc3RydWN0dXJlIGZvciB0aGUgSVNSJ3MgZGVmZXJyZWQgaGFuZGxlcgogCSAqLwogCUlOSVRfV09SSygmYWRhcHRlci0+dGFzaywgZXQxMzF4X2lzcl9oYW5kbGVyKTsKIAotCS8qIERldGVybWluZSBNQUMgQWRkcmVzcywgYW5kIGNvcHkgaW50byB0aGUgbmV0X2RldmljZSBzdHJ1Y3QgKi8KLQlldDEzMXhfc2V0dXBfaGFyZHdhcmVfcHJvcGVydGllcyhhZGFwdGVyKTsKLQorCS8qIENvcHkgYWRkcmVzcyBpbnRvIHRoZSBuZXRfZGV2aWNlIHN0cnVjdCAqLwogCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgRVRIX0FMRU4pOwogCiAJLyogU2V0dXAgZXQxMzEwIGFzIHBlciB0aGUgZG9jdW1lbnRhdGlvbiAqLwpAQCAtOTQ0LDEwICs3NDgsNyBAQAogCSAqIGJlZW4gaW5pdGlhbGl6ZWQsIGp1c3QgaW4gY2FzZSBpdCBuZWVkcyB0byBiZSBxdWlja2x5IHJlc3RvcmVkLgogCSAqLwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBuZXRkZXYpOwotCiAJcGNpX3NhdmVfc3RhdGUoYWRhcHRlci0+cGRldik7Ci0KLW91dDoKIAlyZXR1cm4gcmVzdWx0OwogCiBlcnJfbWVtX2ZyZWU6CkBAIC05NjEsNyArNzYyLDM3IEBACiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIGVycl9kaXNhYmxlOgogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQlnb3RvIG91dDsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIGV0MTMxeF9wY2lfcmVtb3ZlCisgKiBAcGRldjogYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQorICoKKyAqIFJlZ2lzdGVyZWQgaW4gdGhlIHBjaV9kcml2ZXIgc3RydWN0dXJlLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZQorICogUENJIHN1YnN5c3RlbSBkZXRlY3RzIHRoYXQgYSBQQ0kgZGV2aWNlIHdoaWNoIG1hdGNoZXMgdGhlIGluZm9ybWF0aW9uCisgKiBjb250YWluZWQgaW4gdGhlIHBjaV9kZXZpY2VfaWQgdGFibGUgaGFzIGJlZW4gcmVtb3ZlZC4KKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZXQxMzF4X3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXI7CisKKwkvKiBSZXRyaWV2ZSB0aGUgbmV0X2RldmljZSBwb2ludGVyIGZyb20gdGhlIHBjaV9kZXYgc3RydWN0LCBhcyB3ZWxsCisJICogYXMgdGhlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3QKKwkgKi8KKwluZXRkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJLyogUGVyZm9ybSBkZXZpY2UgY2xlYW51cCAqLworCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisJZXQxMzF4X2FkYXB0ZXJfbWVtb3J5X2ZyZWUoYWRhcHRlcik7CisJaW91bm1hcChhZGFwdGVyLT5yZWdzKTsKKwlwY2lfZGV2X3B1dChhZGFwdGVyLT5wZGV2KTsKKwlmcmVlX25ldGRldihuZXRkZXYpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZXQxMzF4X3BjaV90YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7CkBAIC05ODksNyArODIwLDcgQEAKICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQogICovCi1zdGF0aWMgaW50IGV0MTMxeF9pbml0X21vZHVsZSh2b2lkKQorc3RhdGljIGludCBfX2luaXQgZXQxMzF4X2luaXRfbW9kdWxlKHZvaWQpCiB7CiAJaWYgKGV0MTMxeF9zcGVlZF9zZXQgPCBQQVJNX1NQRUVEX0RVUExFWF9NSU4gfHwKIAkgICAgZXQxMzF4X3NwZWVkX3NldCA+IFBBUk1fU1BFRURfRFVQTEVYX01BWCkgewpAQCAtMTAwMiw3ICs4MzMsNyBAQAogLyoqCiAgKiBldDEzMXhfY2xlYW51cF9tb2R1bGUgLSBUaGUgZW50cnkgcG9pbnQgY2FsbGVkIG9uIGRyaXZlciBjbGVhbnVwCiAgKi8KLXN0YXRpYyB2b2lkIGV0MTMxeF9jbGVhbnVwX21vZHVsZSh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGV0MTMxeF9jbGVhbnVwX21vZHVsZSh2b2lkKQogewogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZXQxMzF4X2RyaXZlcik7CiB9CkBAIC0xMDEwLDcgKzg0MSw2IEBACiBtb2R1bGVfaW5pdChldDEzMXhfaW5pdF9tb2R1bGUpOwogbW9kdWxlX2V4aXQoZXQxMzF4X2NsZWFudXBfbW9kdWxlKTsKIAotCiAvKiBNb2RpbmZvIHBhcmFtZXRlcnMgKGZpbGxlZCBvdXQgdXNpbmcgZGVmaW5lcyBmcm9tIGV0MTMxeF92ZXJzaW9uLmgpICovCiBNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwogTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9JTkZPKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2luaXRwY2kuaCBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2luaXRwY2kuaAppbmRleCA4MTMxZDZhLi43MjY5NTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9pbml0cGNpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfaW5pdHBjaS5oCkBAIC02Nyw3ICs2Nyw3IEBACiBpbnQgZXQxMzF4X2FkYXB0ZXJfc2V0dXAoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKIGludCBldDEzMXhfYWRhcHRlcl9tZW1vcnlfYWxsb2Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKIHZvaWQgZXQxMzF4X2FkYXB0ZXJfbWVtb3J5X2ZyZWUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgZXQxMzF4X3NldHVwX2hhcmR3YXJlX3Byb3BlcnRpZXMoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgZXQxMzF4X2h3YWRkcl9pbml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7CiB2b2lkIGV0MTMxeF9zb2Z0X3Jlc2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7CiAKICNlbmRpZiAvKiBfX0VUMTMxWF9JTklUUENJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfaXNyLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9pc3IuYwppbmRleCBmODAxODlkLi5mNmQ0NTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9pc3IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9pc3IuYwpAQCAtMTA5LDkgKzEwOSw2IEBACiAJZWxzZQogCQltYXNrID0gSU5UX01BU0tfRU5BQkxFX05PX0ZMT1c7CiAKLQlpZiAoYWRhcHRlci0+RHJpdmVyTm9QaHlBY2Nlc3MpCi0JCW1hc2sgfD0gRVRfSU5UUl9QSFk7Ci0KIAlhZGFwdGVyLT5DYWNoZWRNYXNrVmFsdWUgPSBtYXNrOwogCXdyaXRlbChtYXNrLCAmYWRhcHRlci0+cmVncy0+Z2xvYmFsLmludF9tYXNrKTsKIH0KQEAgLTE4MiwxNSArMTc5LDE1IEBACiAJLyogVGhpcyBpcyBvdXIgaW50ZXJydXB0LCBzbyBwcm9jZXNzIGFjY29yZGluZ2x5ICovCiAKIAlpZiAoc3RhdHVzICYgRVRfSU5UUl9XQVRDSERPRykgewotCQlQTVBfVENCIHBNcFRjYiA9IGFkYXB0ZXItPlR4UmluZy5DdXJyU2VuZEhlYWQ7CisJCXN0cnVjdCB0Y2IgKnRjYiA9IGFkYXB0ZXItPnR4X3Jpbmcuc2VuZF9oZWFkOwogCi0JCWlmIChwTXBUY2IpCi0JCQlpZiAoKytwTXBUY2ItPlBhY2tldFN0YWxlQ291bnQgPiAxKQorCQlpZiAodGNiKQorCQkJaWYgKCsrdGNiLT5zdGFsZSA+IDEpCiAJCQkJc3RhdHVzIHw9IEVUX0lOVFJfVFhETUFfSVNSOwogCiAJCWlmIChhZGFwdGVyLT5SeFJpbmcuVW5maW5pc2hlZFJlY2VpdmVzKQogCQkJc3RhdHVzIHw9IEVUX0lOVFJfUlhETUFfWEZSX0RPTkU7Ci0JCWVsc2UgaWYgKHBNcFRjYiA9PSBOVUxMKQorCQllbHNlIGlmICh0Y2IgPT0gTlVMTCkKIAkJCXdyaXRlbCgwLCAmYWRhcHRlci0+cmVncy0+Z2xvYmFsLndhdGNoZG9nX3RpbWVyKTsKIAogCQlzdGF0dXMgJj0gfkVUX0lOVFJfV0FUQ0hET0c7CkBAIC0yOTAsMTcgKzI4NywxMiBAQAogCQkJCXUzMiBwbV9jc3I7CiAKIAkJCQkvKiBUZWxsIHRoZSBkZXZpY2UgdG8gc2VuZCBhIHBhdXNlIHBhY2tldCB2aWEKLQkJCQkgKiB0aGUgYmFjayBwcmVzc3VyZSByZWdpc3RlcgorCQkJCSAqIHRoZSBiYWNrIHByZXNzdXJlIHJlZ2lzdGVyIChicCByZXEgIGFuZAorCQkJCSAqIGJwIHhvbi94b2ZmKQogCQkJCSAqLwogCQkJCXBtX2NzciA9IHJlYWRsKCZpb21lbS0+Z2xvYmFsLnBtX2Nzcik7Ci0JCQkJaWYgKChwbV9jc3IgJiBFVF9QTV9QSFlfU1dfQ09NQSkgPT0gMCkgewotCQkJCQlUWE1BQ19CUF9DVFJMX3QgYnBfY3RybCA9IHsgMCB9OwotCi0JCQkJCWJwX2N0cmwuYml0cy5icF9yZXEgPSAxOwotCQkJCQlicF9jdHJsLmJpdHMuYnBfeG9ueG9mZiA9IDE7Ci0JCQkJCXdyaXRlbChicF9jdHJsLnZhbHVlLAotCQkJCQkgICAgICAgJmlvbWVtLT50eG1hYy5icF9jdHJsLnZhbHVlKTsKLQkJCQl9CisJCQkJaWYgKChwbV9jc3IgJiBFVF9QTV9QSFlfU1dfQ09NQSkgPT0gMCkKKwkJCQkJd3JpdGVsKDMsICZpb21lbS0+dHhtYWMuYnBfY3RybCk7CiAJCQl9CiAJCX0KIApAQCAtMzQwLDExICszMzIsOSBAQAogCQkJICovCiAJCQkvKiBUUkFQKCk7Ki8KIAotCQkJZXRkZXYtPlR4TWFjVGVzdC52YWx1ZSA9Ci0JCQkJcmVhZGwoJmlvbWVtLT50eG1hYy50eF90ZXN0LnZhbHVlKTsKIAkJCWRldl93YXJuKCZldGRldi0+cGRldi0+ZGV2LAogCQkJCSAgICAiUnhETUFfRVJSIGludGVycnVwdCwgZXJyb3IgJXhcbiIsCi0JCQkJICAgIGV0ZGV2LT5UeE1hY1Rlc3QudmFsdWUpOworCQkJCSAgICByZWFkbCgmaW9tZW0tPnR4bWFjLnR4X3Rlc3QpKTsKIAkJfQogCiAJCS8qIEhhbmRsZSB0aGUgV2FrZSBvbiBMQU4gRXZlbnQgKi8KQEAgLTQwMCw4ICszOTAsNyBAQAogCiAJCS8qIExldCdzIG1vdmUgb24gdG8gdGhlIFR4TWFjICovCiAJCWlmIChzdGF0dXMgJiBFVF9JTlRSX1RYTUFDKSB7Ci0JCQlldGRldi0+VHhSaW5nLlR4TWFjRXJyLnZhbHVlID0KLQkJCQlyZWFkbCgmaW9tZW0tPnR4bWFjLmVyci52YWx1ZSk7CisJCQl1MzIgZXJyID0gcmVhZGwoJmlvbWVtLT50eG1hYy5lcnIudmFsdWUpOwogCiAJCQkvKgogCQkJICogV2hlbiBhbnkgb2YgdGhlIGVycm9ycyBvY2N1ciBhbmQgVFhNQUMgZ2VuZXJhdGVzCkBAIC00MTUsNyArNDA0LDcgQEAKIAkJCSAqLwogCQkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsCiAJCQkJICAgICJUWE1BQyBpbnRlcnJ1cHQsIGVycm9yIDB4JTA4eFxuIiwKLQkJCQkgICAgZXRkZXYtPlR4UmluZy5UeE1hY0Vyci52YWx1ZSk7CisJCQkJICAgIGVycik7CiAKIAkJCS8qIElmIHdlIGFyZSBkZWJ1Z2dpbmcsIHdlIHdhbnQgdG8gc2VlIHRoaXMgZXJyb3IsCiAJCQkgKiBvdGhlcndpc2Ugd2UganVzdCB3YW50IHRoZSBkZXZpY2UgdG8gYmUgcmVzZXQgYW5kCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9uZXRkZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X25ldGRldi5jCmluZGV4IDhjNzYxMmYuLjI0ZDk3YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X25ldGRldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X25ldGRldi5jCkBAIC01MTksNyArNTE5LDcgQEAKIHZvaWQgZXQxMzF4X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlQTVBfVENCIHBNcFRjYjsKKwlzdHJ1Y3QgdGNiICp0Y2I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIEp1c3Qgc2tpcCB0aGlzIHBhcnQgaWYgdGhlIGFkYXB0ZXIgaXMgZG9pbmcgbGluayBkZXRlY3Rpb24gKi8KQEAgLTU0MSwyOCArNTQxLDE5IEBACiAJLyogSXMgc2VuZCBzdHVjaz8gKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZXRkZXYtPlRDQlNlbmRRTG9jaywgZmxhZ3MpOwogCi0JcE1wVGNiID0gZXRkZXYtPlR4UmluZy5DdXJyU2VuZEhlYWQ7CisJdGNiID0gZXRkZXYtPnR4X3Jpbmcuc2VuZF9oZWFkOwogCi0JaWYgKHBNcFRjYiAhPSBOVUxMKSB7Ci0JCXBNcFRjYi0+Q291bnQrKzsKKwlpZiAodGNiICE9IE5VTEwpIHsKKwkJdGNiLT5jb3VudCsrOwogCi0JCWlmIChwTXBUY2ItPkNvdW50ID4gTklDX1NFTkRfSEFOR19USFJFU0hPTEQpIHsKLQkJCVRYX0RFU0NfRU5UUllfdCBTdHVja0Rlc2NyaXB0b3JzWzEwXTsKLQotCQkJaWYgKElOREVYMTAocE1wVGNiLT5XckluZGV4KSA+IDcpIHsKLQkJCQltZW1jcHkoU3R1Y2tEZXNjcmlwdG9ycywKLQkJCQkgICAgICAgZXRkZXYtPlR4UmluZy5wVHhEZXNjUmluZ1ZhICsKLQkJCQkgICAgICAgSU5ERVgxMChwTXBUY2ItPldySW5kZXgpIC0gNiwKLQkJCQkgICAgICAgc2l6ZW9mKFRYX0RFU0NfRU5UUllfdCkgKiAxMCk7Ci0JCQl9Ci0KKwkJaWYgKHRjYi0+Y291bnQgPiBOSUNfU0VORF9IQU5HX1RIUkVTSE9MRCkgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPlRDQlNlbmRRTG9jaywKIAkJCQkJICAgICAgIGZsYWdzKTsKIAogCQkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsCi0JCQkJIlNlbmQgc3R1Y2sgLSByZXNldC4gIHBNcFRjYi0+V3JJbmRleCAleCwgRmxhZ3MgMHglMDh4XG4iLAotCQkJCXBNcFRjYi0+V3JJbmRleCwKLQkJCQlwTXBUY2ItPkZsYWdzKTsKKwkJCQkiU2VuZCBzdHVjayAtIHJlc2V0LiAgdGNiLT5XckluZGV4ICV4LCBGbGFncyAweCUwOHhcbiIsCisJCQkJdGNiLT5pbmRleCwKKwkJCQl0Y2ItPmZsYWdzKTsKIAogCQkJZXQxMzF4X2Nsb3NlKG5ldGRldik7CiAJCQlldDEzMXhfb3BlbihuZXRkZXYpOwpAQCAtNjIyLDcgKzYxMyw3IEBACiAKIAlldDEzMXhfaW5pdF9zZW5kKGFkYXB0ZXIpOwogCi0JZXQxMzF4X3NldHVwX2hhcmR3YXJlX3Byb3BlcnRpZXMoYWRhcHRlcik7CisJZXQxMzF4X2h3YWRkcl9pbml0KGFkYXB0ZXIpOwogCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgRVRIX0FMRU4pOwogCiAJLyogSW5pdCB0aGUgZGV2aWNlIHdpdGggdGhlIG5ldyBzZXR0aW5ncyAqLwpAQCAtNzA5LDkgKzcwMCw3IEBACiAKIAlldDEzMXhfaW5pdF9zZW5kKGFkYXB0ZXIpOwogCi0JZXQxMzF4X3NldHVwX2hhcmR3YXJlX3Byb3BlcnRpZXMoYWRhcHRlcik7Ci0JLyogbWVtY3B5KCBuZXRkZXYtPmRldl9hZGRyLCBhZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgRVRIX0FMRU4gKTsgKi8KLQkvKiBibHV4OiBubywgZG8gbm90IG92ZXJyaWRlIG91ciBuaWNlIGFkZHJlc3MgKi8KKwlldDEzMXhfaHdhZGRyX2luaXQoYWRhcHRlcik7CiAKIAkvKiBJbml0IHRoZSBkZXZpY2Ugd2l0aCB0aGUgbmV3IHNldHRpbmdzICovCiAJZXQxMzF4X2FkYXB0ZXJfc2V0dXAoYWRhcHRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvaHZfYXBpLmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvaHZfYXBpLmgKaW5kZXggMjUxZTJkMS4uOWViODE4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2X2FwaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9odl9hcGkuaApAQCAtMzE2LDEzICszMTYsMTMgQEAKIAogLyoKICAqIEhWX1NUQVRVU19WTVhfSU5TVFJVQ1RJT05fRkFJTEVECi0gKiBUaGUgcmVxdWVzdGVkIFZNWCBpbnN0cnVjdGlvbiBmYWlsZWQgdG8gY29tcGxldGUgc3VjY2VzZnVsbHkuCisgKiBUaGUgcmVxdWVzdGVkIFZNWCBpbnN0cnVjdGlvbiBmYWlsZWQgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LgogICovCiAjZGVmaW5lIEhWX1NUQVRVU19WTVhfSU5TVFJVQ1RJT05fRkFJTEVECQkoKHUxNikweDEwMTEpCiAKIC8qCiAgKiBIVl9TVEFUVVNfVk1YX0lOU1RSVUNUSU9OX0ZBSUxFRF9XSVRIX1NUQVRVUwotICogVGhlIHJlcXVlc3RlZCBWTVggaW5zdHJ1Y3Rpb24gZmFpbGVkIHRvIGNvbXBsZXRlIHN1Y2Nlc2Z1bGx5IGluZGljYXRpbmcKKyAqIFRoZSByZXF1ZXN0ZWQgVk1YIGluc3RydWN0aW9uIGZhaWxlZCB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHkgaW5kaWNhdGluZwogICogc3RhdHVzLgogICovCiAjZGVmaW5lIEhWX1NUQVRVU19WTVhfSU5TVFJVQ1RJT05fRkFJTEVEX1dJVEhfU1RBVFVTCSgodTE2KTB4MTAxMikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9kZXZpY2UudHh0IGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2RldmljZS50eHQKaW5kZXggNjkxNmNkMy4uNjlkOTU3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2RldmljZS50eHQKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2RldmljZS50eHQKQEAgLTEwLDcgKzEwLDcgQEAKIAogc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKIAotVGhlIGZpbGwgaW4gdGhlIGZvbGxvd2luZy4KK1RoZW4gZmlsbCBpbiB0aGUgZm9sbG93aW5nOgogCiBpbmRpb19kZXYtPmRldi5wYXJlbnQKICAgdGhlIHN0cnVjdCBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlLgpAQCAtNDUsNSArNDUsNSBAQAogYmUgcmVnaXN0ZXJlZCBhZnRlcndhcmRzIChvdGhlcndpc2UgdGhlIHdob2xlIHBhcmVudGFnZSBvZiBkZXZpY2VzCiBnZXRzIGNvbmZ1c2VkKQogCi1PbiByZW1vdmUgaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldikgd2lsbCByZW1vdmUgdGhlIGRldmljZSBmcm9tCitPbiByZW1vdmUsIGlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpIHdpbGwgcmVtb3ZlIHRoZSBkZXZpY2UgZnJvbQogdGhlIGNvcmUsIGFuZCBpaW9fZnJlZV9kZXZpY2Ugd2lsbCBjbGVhbiB1cC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9vdmVydmlldy50eHQgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vb3ZlcnZpZXcudHh0CmluZGV4IDY0NTg0YWQuLmUzOWRmYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9vdmVydmlldy50eHQKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL292ZXJ2aWV3LnR4dApAQCAtMjQsMTEgKzI0LDEyIEBACiAqIEV2ZW50IGNocmRldnMuICBUaGVzZSBhcmUgc2ltaWxhciB0byBpbnB1dCBpbiB0aGF0IHRoZXkgcHJvdmlkZSBhCiByb3V0ZSB0byB1c2VyIHNwYWNlIGZvciBoYXJkd2FyZSB0cmlnZ2VyZWQgZXZlbnRzLiBTdWNoIGV2ZW50cyBpbmNsdWRlCiB0aHJlc2hvbGQgZGV0ZWN0b3JzLCBmcmVlLWZhbGwgZGV0ZWN0b3JzIGFuZCBtb3JlIGNvbXBsZXggYWN0aW9uCi1kZXRlY3Rpb24uICBUaGV5IGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBjdXJyZW50bHkgdmVyeSBzaW1wbGUgd2l0aAorZGV0ZWN0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBjdXJyZW50bHkgdmVyeSBzaW1wbGUgd2l0aAogbWVyZWx5IGFuIGV2ZW50IGNvZGUgYW5kIGEgdGltZXN0YW1wLiAgQW55IGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZQotZXZlbnQgbXVzdCBiZSBhY2Nlc3NlZCB2aWEgcG9sbGluZy4gTm90ZSBhIGdpdmVuIGRldmljZSBtYXkgaGF2ZSBvbmUKLW9yIG1vcmUgZXZlbnQgY2hhbm5lbC4gIFRoZXNlIGV2ZW50cyBhcmUgdHVybmVkIG9uIG9yIG9mZiAoaWYgcG9zc2libGUpCi12aWEgc3lzZnMgaW50ZXJmYWNlcy4KK2V2ZW50IG11c3QgYmUgYWNjZXNzZWQgdmlhIHBvbGxpbmcuCisKK05vdGU6IEEgZ2l2ZW4gZGV2aWNlIG1heSBoYXZlIG9uZSBvciBtb3JlIGV2ZW50IGNoYW5uZWwuICBUaGVzZSBldmVudHMgYXJlCit0dXJuZWQgb24gb3Igb2ZmIChpZiBwb3NzaWJsZSkgdmlhIHN5c2ZzIGludGVyZmFjZXMuCiAKICogSGFyZHdhcmUgcmluZyBidWZmZXIgc3VwcG9ydC4gIFNvbWUgcmVjZW50IHNlbnNvcnMgaGF2ZSBpbmNsdWRlZAogZmlmbyAvIHJpbmcgYnVmZmVycyBvbiB0aGUgc2Vuc29yIGNoaXAuICBUaGVzZSBncmVhdGx5IHJlZHVjZSB0aGUgbG9hZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnCmluZGV4IDQ1ODY2NTAuLmFjZTk5ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWcKQEAgLTgsNyArOCw3IEBACiAJLS0taGVscC0tLQogCSAgVGhlIGluZHVzdHJpYWwgSS9PIHN1YnN5c3RlbSBwcm92aWRlcyBhIHVuaWZpZWQgZnJhbWV3b3JrIGZvcgogCSAgZHJpdmVycyBmb3IgbWFueSBkaWZmZXJlbnQgdHlwZXMgb2YgZW1iZWRkZWQgc2Vuc29ycyB1c2luZyBhCi0JICBudW1iZXIgb2YgZGlmZmVyZW50IHBoeXNpY2FsIGludGVyZmFjZXMgKGkyYywgc3BpIGV0YykuIFNlZQorCSAgbnVtYmVyIG9mIGRpZmZlcmVudCBwaHlzaWNhbCBpbnRlcmZhY2VzIChpMmMsIHNwaSwgZXRjKS4gU2VlCiAJICBEb2N1bWVudGF0aW9uL2luZHVzdHJpYWxpbyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIGlmIElJTwogCkBAIC0yMywxMCArMjMsMTAgQEAKIGNvbmZpZyBJSU9fU1dfUklORwogCXRyaXN0YXRlICJJbmR1c3RyaWFsIEkvTyBsb2NrIGZyZWUgc29mdHdhcmUgcmluZyIKIAloZWxwCi0JZXhhbXBsZSBzb2Z0d2FyZSByaW5nIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbi4gIFRoZSBkZXNpZ24gYWltCi0Jb2YgdGhpcyBwYXJ0aWN1bGFyIHJlYWxpemF0aW9uIHdhcyB0byBtaW5pemUgd3JpdGUgbG9ja2luZwotCXdpdGggdGhlIGludGVudGlvbiB0aGF0IHNvbWUgZGV2aWNlcyB3b3VsZCBiZSBhYmxlIHRvIHdyaXRlCi0JaW4gaW50ZXJydXB0IGNvbnRleHQuCisJICBFeGFtcGxlIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uLiAgVGhlIGRlc2lnbiBhaW0KKwkgIG9mIHRoaXMgcGFydGljdWxhciByZWFsaXphdGlvbiB3YXMgdG8gbWluaW1pemUgd3JpdGUgbG9ja2luZworCSAgd2l0aCB0aGUgaW50ZW50aW9uIHRoYXQgc29tZSBkZXZpY2VzIHdvdWxkIGJlIGFibGUgdG8gd3JpdGUKKwkgIGluIGludGVycnVwdCBjb250ZXh0LgogCiBlbmRpZiAjIElJT19SSU5HQlVGRkVSCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvS2NvbmZpZwppbmRleCBmZWYzZGE0Li4zZDNjMzMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9LY29uZmlnCkBAIC0xMyw2ICsxMyw4IEBACiBjb25maWcgTElTM0wwMkRRCiAJdHJpc3RhdGUgIlNUIE1pY3JvZWxlY3Ryb25pY3MgTElTM0wwMkRRIEFjY2VsZXJvbWV0ZXIgRHJpdmVyIgogCWRlcGVuZHMgb24gU1BJCisJc2VsZWN0IElJT19UUklHR0VSIGlmIElJT19SSU5HX0JVRkZFUgorCXNlbGVjdCBJSU9fU1dfUklORyBpZiBJSU9fUklOR19CVUZGRVIKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgU1BJIHN1cHBvcnQgZm9yIHRoZSBTVCBtaWNyb2VsZWN0cm9uaWNzCiAJICBhY2NlbGVyb21ldGVyLiBUaGUgZHJpdmVyIHN1cHBsaWVzIGRpcmVjdCBhY2Nlc3MgdmlhIHN5c2ZzIGZpbGVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FjY2VsLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FjY2VsLmgKaW5kZXggODExZmEwNS4uZDdmYzdmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hY2NlbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWNjZWwuaApAQCAtMzEsMTMgKzMxLDEzIEBACiAJSUlPX0RFVklDRV9BVFRSKGFjY2VsX3osIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKIAogLyogVGhyZXNob2xkcyBhcmUgc29tZXdoYXQgY2hpcCBkZXBlbmRlbnQgLSBtYXkgbmVlZCBxdWl0ZSBhIGZldyBkZWZzIGhlcmUgKi8KLS8qIEZvciB1bmlmaWVkIHRoZXNob2xkcyAoc2hhcmVkIGFjcm9zcyBhbGwgZGlyZWN0aW9ucyAqLworLyogRm9yIHVuaWZpZWQgdGhyZXNob2xkcyAoc2hhcmVkIGFjcm9zcyBhbGwgZGlyZWN0aW9ucyAqLwogCiAvKioKICAqIElJT19ERVZfQVRUUl9BQ0NFTF9USFJFU0g6IHVuaWZpZWQgdGhyZXNob2xkCiAgKiBAX21vZGU6IHJlYWQvd3JpdGUKICAqIEBfc2hvdzogcmVhZCBkZXRlY3RvciB0aHJlc2hvbGQgdmFsdWUKLSAqIEBfc3RvcmU6IHdyaXRlIGRldGVjdG9yIHRoZXNob2xkIHZhbHVlCisgKiBAX3N0b3JlOiB3cml0ZSBkZXRlY3RvciB0aHJlc2hvbGQgdmFsdWUKICAqIEBfYWRkcjogZHJpdmVyIHNwZWNpZmljIGRhdGEsIHR5cGljYWxseSBhIHJlZ2lzdGVyIGFkZHJlc3MKICAqCiAgKiBUaGlzIG9uZSBpcyBmb3IgY2FzZXMgd2hlcmUgYXMgc2luZ2xlIHRocmVzaG9sZCBjb3ZlcnMgYWxsIGRpcmVjdGlvbnMKQEAgLTQ4LDcgKzQ4LDcgQEAKIC8qKgogICogSUlPX0RFVl9BVFRSX0FDQ0VMX1RIUkVTSF9YOiBpbmRlcGVuZGFudCBkaXJlY3Rpb24gdGhyZXNob2xkLCB4IGF4aXMKICAqIEBfbW9kZTogcmVhZGFibGUgLyB3cml0YWJsZQotICogQF9zaG93OiByZWFkIHggYXhpcyBkZXRlY3RvciB0aGVzaG9sZCB2YWx1ZQorICogQF9zaG93OiByZWFkIHggYXhpcyBkZXRlY3RvciB0aHJlc2hvbGQgdmFsdWUKICAqIEBfc3RvcmU6IHdyaXRlIHggYXhpcyBkZXRlY3RvciB0aHJlc2hvbGQgdmFsdWUKICAqIEBfYWRkcjogZGV2aWNlIGRyaXZlciBkZXBlbmRhbnQsIHR5cGljYWxseSBhIHJlZ2lzdGVyIGFkZHJlc3MKICAqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwLmgKaW5kZXggMjllMTFkYS4uZGE3ZDNjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwLmgKQEAgLTc0LDcgKzc0LDcgQEAKICNkZWZpbmUgU0NBMzAwMF9NRUFTX01PREVfT1BfMgkJCTB4MDIKIAogLyogSW4gbW90aW9uIGRldGVjdGlvbiBtb2RlIHRoZSBhY2NlbGVyYXRpb25zIGFyZSBiYW5kIHBhc3MgZmlsdGVyZWQKLSAqIChhcHJveCAxIC0gMjVIeikgYW5kIHRoZW4gYSBwcm9ncmFtbWFibGUgdGhlc2hvbGQgdXNlZCB0byB0cmlnZ2VyCisgKiAoYXByb3ggMSAtIDI1SHopIGFuZCB0aGVuIGEgcHJvZ3JhbW1hYmxlIHRocmVzaG9sZCB1c2VkIHRvIHRyaWdnZXIKICAqIGFuZCBpbnRlcnJ1cHQuCiAgKi8KICNkZWZpbmUgU0NBMzAwMF9NRUFTX01PREVfTU9UX0RFVAkJMHgwMwpAQCAtMTM5LDcgKzEzOSw3IEBACiAvKiBWYWx1ZXMgb2YgbXVsaXBleGVkIHJlZ2lzdGVycyAod3JpdGUgdG8gY3RybF9kYXRhIGFmdGVyIHNlbGVjdCkgKi8KICNkZWZpbmUgU0NBMzAwMF9SRUdfQUREUl9DVFJMX0RBVEEJCTB4MjIKIAotLyogTWVhc3VybWVudCBtb2RlcyBhdmFpbGFibGUgb24gc29tZSBzY2EzMDAwIHNlcmllcyBjaGlwcy4gQ29kZSBhc3N1bWVzIG90aGVycworLyogTWVhc3VyZW1lbnQgbW9kZXMgYXZhaWxhYmxlIG9uIHNvbWUgc2NhMzAwMCBzZXJpZXMgY2hpcHMuIENvZGUgYXNzdW1lcyBvdGhlcnMKICAqIG1heSBiZWNvbWUgYXZhaWxhYmxlIGluIHRoZSBmdXR1cmUuCiAgKgogICogQnlwYXNzIC0gQnlwYXNzIHRoZSBsb3ctcGFzcyBmaWx0ZXIgaW4gdGhlIHNpZ25hbCBjaGFubmVsIHNvIGFzIHRvIGluY3JlYXNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX2NvcmUuYwppbmRleCBlMjdlM2I3Li5jZWRjYWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9jb3JlLmMKQEAgLTcyMCw3ICs3MjAsNyBAQAogc3RhdGljIElJT19ERVZfQVRUUl9URU1QKHNjYTMwMDBfcmVhZF90ZW1wKTsKIAogLyoqCi0gKiBzY2EzMDAwX3Nob3dfdGhyZXNoKCkgc3lzZnMgcXVlcnkgb2YgYSB0aGVzaG9sZAorICogc2NhMzAwMF9zaG93X3RocmVzaCgpIHN5c2ZzIHF1ZXJ5IG9mIGEgdGhyZXNob2xkCiAgKiovCiBzdGF0aWMgc3NpemVfdCBzY2EzMDAwX3Nob3dfdGhyZXNoKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9LY29uZmlnCmluZGV4IGI4YzI4NTguLjM5ODljMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvS2NvbmZpZwpAQCAtNiw4ICs2LDE4IEBACiBjb25maWcgTUFYMTM2MwogCXRyaXN0YXRlICJNQVhJTSBtYXgxMzYzIEFEQyBkcml2ZXIiCiAJZGVwZW5kcyBvbiBJMkMKKwlzZWxlY3QgSUlPX1RSSUdHRVIgaWYgSUlPX1JJTkdfQlVGRkVSCiAJaGVscAogCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIG1hbnkgTUFYSU0gaTJjIGFuYWxvZyB0byBkaWdpdGFsCiAJICBjb252ZXJ0b3JzIChBREMpLiAobWF4MTM2MSwgbWF4MTM2MiwgbWF4MTM2MywgbWF4MTM2NCwgbWF4MTEzNiwKIAkgIG1heDExMzYsIG1heDExMzcsIG1heDExMzgsIG1heDExMzksIG1heDEyMzYsIG1heDEyMzcsIG1heDExMjM4LAogCSAgbWF4MTIzOSkgUHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCisKK2NvbmZpZyBNQVgxMzYzX1JJTkdfQlVGRkVSCisJYm9vbCAiTUFYSU0gbWF4MTM2MzogdXNlIHJpbmcgYnVmZmVyIgorCWRlcGVuZHMgb24gTUFYMTM2MworCXNlbGVjdCBJSU9fUklOR19CVUZGRVIKKwlzZWxlY3QgSUlPX1NXX1JJTkcKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gaW5jbHVkZSByaW5nIGJ1ZmZlciBzdXBwb3J0IGluIHRoZSBNQVgxMzYzCisJICBBREMgZHJpdmVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9NYWtlZmlsZQppbmRleCAwYzJiNmYzLi4wOGNlZTVjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvTWFrZWZpbGUKQEAgLTMsNiArMyw2IEBACiAjCiAKIG1heDEzNjMteSA6PSBtYXgxMzYzX2NvcmUubwotbWF4MTM2My0kKENPTkZJR19JSU9fUklOR19CVUZGRVIpICs9IG1heDEzNjNfcmluZy5vCittYXgxMzYzLSQoQ09ORklHX01BWDEzNjNfUklOR19CVUZGRVIpICs9IG1heDEzNjNfcmluZy5vCiAKIG9iai0kKENPTkZJR19NQVgxMzYzKSArPSBtYXgxMzYzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL21heDEzNjMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL21heDEzNjMuaAppbmRleCA4YWNhODFmLi5jMTEyZmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9tYXgxMzYzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvbWF4MTM2My5oCkBAIC0yMjgsNyArMjI4LDcgQEAKIAlzdHJ1Y3QgaWlvX3RyaWdnZXIJCSp0cmlnOwogCXN0cnVjdCByZWd1bGF0b3IJCSpyZWc7CiB9OwotI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKKyNpZmRlZiBDT05GSUdfTUFYMTM2M19SSU5HX0JVRkZFUgogCiBzc2l6ZV90IG1heDEzNjNfc2Nhbl9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLApAQCAtMjM5LDcgKzIzOSw3IEBACiBpbnQgbWF4MTM2M19pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CiB2b2lkIG1heDEzNjNfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CiAKLSNlbHNlIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKyNlbHNlIC8qIENPTkZJR19NQVgxMzYzX1JJTkdfQlVGRkVSICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXgxMzYzX3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCiB7CkBAIC0yNjUsNSArMjY1LDUgQEAKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXgxMzYzX3JpbmdfY2xlYW51cChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KSB7fTsKLSNlbmRpZiAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisjZW5kaWYgLyogQ09ORklHX01BWDEzNjNfUklOR19CVUZGRVIgKi8KICNlbmRpZiAvKiBfTUFYMTM2M19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9jaHJkZXYuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vY2hyZGV2LmgKaW5kZXggOGJjNjRiZi4uZjQyYmFmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9jaHJkZXYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2NocmRldi5oCkBAIC03NSwxMCArNzUsMTIgQEAKICAqIEBjdXJyZW50X2V2ZW50czoJbnVtYmVyIG9mIGV2ZW50cyBpbiBkZXRlY3RlZCBsaXN0CiAgKiBAaWQ6CQkJaW5kZW50aWZpZXIgdG8gYWxsb3cgdGhlIGV2ZW50IGludGVyZmFjZSB0byBrbm93IHdoaWNoCiAgKgkJCXBoeXNpY2FsIGxpbmUgaXQgY29ycmVzcG9uZHMgdG8KKyAqIEBhdHRyOgkJdGhpcyBjaHJkZXYncyBtaW5vciBudW1iZXIgc3lzZnMgYXR0cmlidXRlCiAgKiBAb3duZXI6CQllbnN1cmUgdGhlIGRyaXZlciBtb2R1bGUgb3ducyB0aGUgZmlsZSwgbm90IGlpbwogICogQHByaXZhdGU6CQlkcml2ZXIgc3BlY2lmaWMgZGF0YQogICogQF9uYW1lOgkJdXNlZCBpbnRlcm5hbGx5IHRvIHN0b3JlIHRoZSBzeXNmcyBuYW1lIGZvciBtaW5vciBpZAogICoJCQlhdHRyaWJ1dGUKKyAqIEBfYXR0cm5hbWU6CQl0aGUgZXZlbnQgaW50ZXJmYWNlJ3MgYXR0cmlidXRlIG5hbWUKICAqLwogc3RydWN0IGlpb19ldmVudF9pbnRlcmZhY2UgewogCXN0cnVjdCBkZXZpY2UJCQkJZGV2OwpAQCAtMTA1LDcgKzEwNyw3IEBACiAgKiBAaGFuZGxlcjoJCWV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gLSBjYWxsZWQgb24gZXZlbnQgaWYgdGhpcwogICoJCQlldmVudF9oYW5kbGVyIGlzIGVuYWJsZWQuCiAgKgotICogRWFjaCBkZXZpY2UgaGFzIG9uZSBsaXN0IG9mIHRoZXNlIHBlciBpbnRlcnJ1cHQgbGluZQorICogRWFjaCBkZXZpY2UgaGFzIG9uZSBsaXN0IG9mIHRoZXNlIHBlciBpbnRlcnJ1cHQgbGluZS4KICAqKi8KIHN0cnVjdCBpaW9fZXZlbnRfaGFuZGxlcl9saXN0IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpby5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9paW8uaAppbmRleCAyNWNjYjgwLi43MWRiZmUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpby5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaWlvLmgKQEAgLTE2Niw3ICsxNjYsNyBAQAogICogQGJpdDogd2hpY2ggbnVtYmVyIHNjYW4gZWxlbWVudCBpcyB0aGlzCiAgKiovCiBzdGF0aWMgaW5saW5lIGludCBpaW9fc2Nhbl9tYXNrX2NvdW50X3RvX3JpZ2h0KHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKLWludCBiaXQpCisJCQkJCQlpbnQgYml0KQogewogCWludCBjb3VudCA9IDA7CiAJaW50IG1hc2sgPSAoMSA8PCBiaXQpOwpAQCAtMjM5LDcgKzIzOSw3IEBACiAgKiBAZGV2X2luZm86CQlJSU8gZGV2aWNlIHN0cnVjdHVyZQogICogQGV2X2xpbmU6CQlXaGljaCBldmVudCBsaW5lIChoYXJkd2FyZSBpbnRlcnJ1cHQpCiAgKiBAZXZfY29kZToJCVdoYXQgZXZlbnQKLSAqIEB0aW1lc3RhbXA6CQlXaGVuIHRoZSBldmVudCBvY2N1cmVkCisgKiBAdGltZXN0YW1wOgkJV2hlbiB0aGUgZXZlbnQgb2NjdXJyZWQKICAqKi8KIGludCBpaW9fcHVzaF9ldmVudChzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8sCiAJCSAgaW50IGV2X2xpbmUsCkBAIC0yNDgsMTEgKzI0OCwxMSBAQAogCiAvKioKICAqIHN0cnVjdCBpaW9fd29ya19jb250IC0gY29udGFpbmVyIGZvciB3aGVuIHNpbmdsZXRvbiBoYW5kbGVyIGNhc2UgbWF0dGVycwotICogQHdzOgkJCVtERVZJQ0Vdd29ya19zdHJ1Y3Qgd2hlbiBub3Qgb25seSBwb3NzaWJsZSBldmVudAotICogQHdzX25vY2hlY2s6CQlbREVWSUNFXXdvcmtfc3RydWN0IHdoZW4gb25seSBwb3NzaWJsZSBldmVudAotICogQGFkZHJlc3M6CQlbREVWSUNFXWFzc29jaWF0ZWQgcmVnaXN0ZXIgYWRkcmVzcwotICogQG1hc2s6CQlbREVWSUNFXWFzc29jaWF0ZWQgbWFzayBmb3IgaWRlbnRpZnlpbmcgZXZlbnQgc291cmNlCi0gKiBAc3Q6CQkJW0RFVklDRV1kZXZpY2Ugc3BlY2lmaWMgc3RhdGUgaW5mb3JtYXRpb24KKyAqIEB3czoJCQlbREVWSUNFXSB3b3JrX3N0cnVjdCB3aGVuIG5vdCBvbmx5IHBvc3NpYmxlIGV2ZW50CisgKiBAd3Nfbm9jaGVjazoJCVtERVZJQ0VdIHdvcmtfc3RydWN0IHdoZW4gb25seSBwb3NzaWJsZSBldmVudAorICogQGFkZHJlc3M6CQlbREVWSUNFXSBhc3NvY2lhdGVkIHJlZ2lzdGVyIGFkZHJlc3MKKyAqIEBtYXNrOgkJW0RFVklDRV0gYXNzb2NpYXRlZCBtYXNrIGZvciBpZGVudGlmeWluZyBldmVudCBzb3VyY2UKKyAqIEBzdDoJCQlbREVWSUNFXSBkZXZpY2Ugc3BlY2lmaWMgc3RhdGUgaW5mb3JtYXRpb24KICAqKi8KIHN0cnVjdCBpaW9fd29ya19jb250IHsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd3M7CkBAIC0yNzMsOSArMjczLDkgQEAKICAqIEBjb250OiB0aGUgd29yayBjb250YWluZXIKICAqIEBfY2hlY2tmdW5jOiBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgcG9zc2libGUgaW50IHNvdXJjZXMKICAqIEBfbm9jaGVja2Z1bmM6IGZ1bmN0aW9uIGZvciB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGludCBzb3VyY2UKLSAqIEBfYWRkOiBkcml2ZXIgZGVwZW5kYW50LCB0eXBpY2FsbHkgYSByZWdpc3RlciBhZGRyZXNzCi0gKiBAX21hc2s6IGRyaXZlciBkZXBlbmRhbnQsIHR5cGljYWxseSBhIGJpdCBtYXNrIGZvciBhIHJlZ2lzdGVyCi0gKiBAX3N0OiBkcml2ZXIgZGVwZW5kYW50LCB0eXBpY2FsbHkgcG9pbnRlciB0byBhIGRldmljZSBzdGF0ZSBzdHJ1Y3R1cmUKKyAqIEBfYWRkOiBkcml2ZXIgZGVwZW5kZW50LCB0eXBpY2FsbHkgYSByZWdpc3RlciBhZGRyZXNzCisgKiBAX21hc2s6IGRyaXZlciBkZXBlbmRlbnQsIHR5cGljYWxseSBhIGJpdCBtYXNrIGZvciBhIHJlZ2lzdGVyCisgKiBAX3N0OiBkcml2ZXIgZGVwZW5kZW50LCB0eXBpY2FsbHkgcG9pbnRlciB0byBhIGRldmljZSBzdGF0ZSBzdHJ1Y3R1cmUKICAqKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAogaWlvX2luaXRfd29ya19jb250KHN0cnVjdCBpaW9fd29ya19jb250ICpjb250LApAQCAtMjkwLDcgKzI5MCw3IEBACiAJY29udC0+c3QgPSBfc3Q7CiB9CiAvKioKLSAqIF9faWlvX3B1c2hfZXZlbnQoKSB0cmllcyB0byBhZGQgYW4gZXZlbnQgdG8gdGhlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIGEgY2hyZGV2CisgKiBfX2lpb19wdXNoX2V2ZW50KCkgLSB0cmllcyB0byBhZGQgYW4gZXZlbnQgdG8gdGhlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIGEgY2hyZGV2CiAgKiBAZXZfaW50OgkJdGhlIGV2ZW50IGludGVyZmFjZSB0byB3aGljaCB3ZSBhcmUgcHVzaGluZyB0aGUgZXZlbnQKICAqIEBldl9jb2RlOgkJdGhlIG91dGdvaW5nIGV2ZW50IGNvZGUKICAqIEB0aW1lc3RhbXA6CQl0aW1lc3RhbXAgb2YgdGhlIGV2ZW50CkBAIC0zMDIsOCArMzAyLDggQEAKIAkJICAgIHN0cnVjdCBpaW9fc2hhcmVkX2V2X3BvaW50ZXIqCiAJCSAgICBzaGFyZWRfcG9pbnRlcl9wKTsKIC8qKgotICogX19paW9fY2hhbmdlX2V2ZW50KCkgY2hhbmdlIGFuIGV2ZW50IGNvZGUgaW4gY2FzZSBvZiBldmVudCBlc2NhbGxhdGlvbgotICogQGV2OgkJCXRoZSBldm5ldCB0byBiZSBjaGFuZ2VkCisgKiBfX2lpb19jaGFuZ2VfZXZlbnQoKSAtIGNoYW5nZSBhbiBldmVudCBjb2RlIGluIGNhc2Ugb2YgZXZlbnQgZXNjYWxhdGlvbgorICogQGV2OgkJCXRoZSBldmVudCB0byBiZSBjaGFuZ2VkCiAgKiBAZXZfY29kZToJCW5ldyBldmVudCBjb2RlCiAgKiBAdGltZXN0YW1wOgkJbmV3IHRpbWVzdGFtcAogICoqLwpAQCAtMzEyLDcgKzMxMiw3IEBACiAJCQlzNjQgdGltZXN0YW1wKTsKIAogLyoqCi0gKiBpaW9fc2V0dXBfZXZfaW50KCkgQ29uZmlndXJlIGFuIGV2ZW50IGludGVyZmFjZSAoY2hyZGV2KQorICogaWlvX3NldHVwX2V2X2ludCgpIC0gY29uZmlndXJlIGFuIGV2ZW50IGludGVyZmFjZSAoY2hyZGV2KQogICogQG5hbWU6CQluYW1lIHVzZWQgZm9yIHJlc3VsdGluZyBzeXNmcyBkaXJlY3RvcnkgZXRjLgogICogQGV2X2ludDoJCWludGVyZmFjZSB3ZSBhcmUgY29uZmlndXJpbmcKICAqIEBvd25lcjoJCW1vZHVsZSB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciByZWdpc3RlcmluZyB0aGlzIGV2X2ludApAQCAtMzQzLDcgKzM0Myw3IEBACiBleHRlcm4gc3RydWN0IGNsYXNzIGlpb19jbGFzczsKIAogLyoqCi0gKiBpaW9fcHV0X2RldmljZSgpIC0gcmVmZXJlbmNlIGNvdW50ZWQgZGVhbGxvY2F0ZWQgb2Ygc3RydWN0IGRldmljZQorICogaWlvX3B1dF9kZXZpY2UoKSAtIHJlZmVyZW5jZSBjb3VudGVkIGRlYWxsb2NhdGlvbiBvZiBzdHJ1Y3QgZGV2aWNlCiAgKiBAZGV2OiB0aGUgaWlvX2RldmljZSBjb250YWluaW5nIHRoZSBkZXZpY2UKICAqKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBpaW9fcHV0X2RldmljZShzdHJ1Y3QgaWlvX2RldiAqZGV2KQpAQCAtMzUzLDcgKzM1Myw3IEBACiB9OwogCiAvKioKLSAqIHRvX2lpb19kZXYoKSAtIGdldCBpaW9fZGV2IGZvciB3aGljaCB3ZSBoYXZlIGhhdmUgdGhlIHN0cnVjdCBkZXZpY2UKKyAqIHRvX2lpb19kZXYoKSAtIGdldCBpaW9fZGV2IGZvciB3aGljaCB3ZSBoYXZlIHRoZSBzdHJ1Y3QgZGV2aWNlCiAgKiBAZDogdGhlIHN0cnVjdCBkZXZpY2UKICAqKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGlpb19kZXYgKnRvX2lpb19kZXYoc3RydWN0IGRldmljZSAqZCkKQEAgLTM3Nyw2ICszNzcsNyBAQAogCiAvKioKICAqIGlpb19mcmVlX2RldmljZSgpIC0gZnJlZSBhbiBpaW9fZGV2IGZyb20gYSBkcml2ZXIKKyAqIEBkZXY6IHRoZSBpaW9fZGV2IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlCiAgKiovCiB2b2lkIGlpb19mcmVlX2RldmljZShzdHJ1Y3QgaWlvX2RldiAqZGV2KTsKIApAQCAtMzk1LDcgKzM5Niw4IEBACiB2b2lkIGlpb19kZXZpY2VfZnJlZV9jaHJkZXZfbWlub3IoaW50IHZhbCk7CiAKIC8qKgotICogaWlvX3JpbmdfZW5hYmxlZCgpIGhlbHBlciBmdW5jdGlvbiB0byB0ZXN0IGlmIGFueSBmb3JtIG9mIHJpbmcgZW5hYmxlZAorICogaWlvX3JpbmdfZW5hYmxlZCgpIC0gaGVscGVyIGZ1bmN0aW9uIHRvIHRlc3QgaWYgYW55IGZvcm0gb2YgcmluZyBpcyBlbmFibGVkCisgKiBAZGV2X2luZm86CQlJSU8gZGV2aWNlIGluZm8gc3RydWN0dXJlIGZvciBkZXZpY2UKICAqKi8KIHN0YXRpYyBpbmxpbmUgYm9vbCBpaW9fcmluZ19lbmFibGVkKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvS2NvbmZpZwppbmRleCAxMmFmMGM0Li44MGNiNmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9LY29uZmlnCkBAIC0zLDExICszLDEzIEBACiAjCiBjb21tZW50ICJMaWdodCBzZW5zb3JzIgogCi1jb25maWcgVFNMMjU2MQotICAgICAgIHRyaXN0YXRlICJUQU9TIFRTTDI1NjEgbGlnaHQtdG8tZGlnaXRhbCBjb252ZXJ0b3IiCi0gICAgICAgZGVwZW5kcyBvbiBJMkMKLSAgICAgICBoZWxwCi0JU2F5IHllcyBiZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBUQU9TIGxpZ2h0IHRvIGRpZ2l0YWwKLQljb252ZXJ0b3IuICBUaGlzIGNoaXAgaGFzIHR3byBsaWdodCBzZW5zb3JzLiBPbmUgaXMgYnJvYWRiYW5kCi0JaW5jbHVkaW5nIGluZnJhcmVkIHdoaWxzdCB0aGUgb3RoZXIgbWVhc3VyZXMgb25seSBpbmZyYXJlZC4KLQlQcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSBzeXNmcy4KK2NvbmZpZyBTRU5TT1JTX1RTTDI1NjMKKwl0cmlzdGF0ZSAiVEFPUyBUU0wyNTZbMC0zXSBhbWJpZW50IGxpZ2h0IHNlbnNvciIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBUYW9zIFRTTDI1NjAsCisJIFRTTDI1NjEsIFRTTDI1NjIgYW5kIFRTTDI1NjMgYW1iaWVudCBsaWdodCBzZW5zb3JzLgorCisJIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgd2lsbCBiZSBjYWxsZWQgdHNsMjU2My4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvTWFrZWZpbGUKaW5kZXggY2NmZjE1MS4uMzBmMzMwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L01ha2VmaWxlCkBAIC0yLDQgKzIsNCBAQAogIyBNYWtlZmlsZSBmb3IgaW5kdXN0cmlhbCBJL08gTGlnaHQgc2Vuc29ycwogIwogCi1vYmotJChDT05GSUdfVFNMMjU2MSkgICArPSB0c2wyNTYxLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1RTTDI1NjMpCSs9IHRzbDI1NjMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTYxLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1NjEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMyMTA3Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1NjEuYworKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKgotICogIHRzbDI1NjEuYyAtIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBsaWdodCB0byBkaWdpdGFsIGNvbnZlcnRvcgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBKb25hdGhhbiBDYW1lcm9uIDxqaWMyM0BjYW0uYWMudWs+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKiAgU29tZSBwb3J0aW9ucyBiYXNlZCB1cG9uIHRoZSB0c2wyNTUwIGRyaXZlci4KLSAqCi0gKiAgVGhpcyBkcml2ZXIgY291bGQgcHJvYmFibHkgYmUgYWRhcHRlZCBlYXNpbHkgdG8gdGFsayB0byB0aGUgdHNsMjU2MCAoc21idXMpCi0gKgotICogIE5lZWRzIHNvbWUgd29yayB0byBzdXBwb3J0IHRoZSBldmVudHMgdGhpcyBjYW4gZ2VuZXJhdGUuCi0gKiAgVG9kbzogSW1wbGVtZW50IGludGVycnVwdCBoYW5kbGluZy4gIEN1cnJlbnRseSBhIGhhcmR3YXJlIGJ1ZyBtZWFucwotICogIHRoaXMgaXNuJ3QgYXZhaWxhYmxlIG9uIG15IHRlc3QgYm9hcmQuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlICIuLi9paW8uaCIKLSNpbmNsdWRlICIuLi9zeXNmcy5oIgotI2luY2x1ZGUgImxpZ2h0LmgiCi0KLSNkZWZpbmUgVFNMMjU2MV9DT05UUk9MX1JFR0lTVEVSIDB4MDAKLSNkZWZpbmUgVFNMMjU2MV9USU1JTkdfUkVHSVNURVIgMHgwMQotI2RlZmluZSBUU0wyNTYxX1RIUkVTSExPV19MT1dfUkVHSVNURVIgMHgwMgotI2RlZmluZSBUU0wyNTYxX1RIUkVTSExPV19ISUdIX1JFR0lTVEVSIDB4MDMKLSNkZWZpbmUgVFNMMjU2MV9USFJFU0hISUdIX0xPV19SRUdJU1RFUiAweDA0Ci0jZGVmaW5lIFRTTDI1NjFfVEhSRVNISElHSF9ISUdIX1JFR0lTVEVSIDB4MDUKLSNkZWZpbmUgVFNMMjU2MV9JTlRfQ09OVFJPTF9SRUdJU1RFUiAweDA2Ci0KLSNkZWZpbmUgVFNMMjU2MV9JTlRfUkVHX0lOVF9PRkYgMHgwMAotI2RlZmluZSBUU0wyNTYxX0lOVF9SRUdfSU5UX0xFVkVMIDB4MDgKLSNkZWZpbmUgVFNMMjU2MV9JTlRfUkVHX0lOVF9TTUJVUyAweDEwCi0jZGVmaW5lIFRTTDI1NjFfSU5UX1JFR19JTlRfVEVTVCAweDE4Ci0KLSNkZWZpbmUgVFNMMjU2MV9JRF9SRUdJU1RFUiAweDBBCi0KLSNkZWZpbmUgVFNMMjU2MV9EQVRBXzBfTE9XIDB4MEMKLSNkZWZpbmUgVFNMMjU2MV9EQVRBXzFfTE9XIDB4MEUKLQotLyogQ29udHJvbCBSZWdpc3RlciBWYWx1ZXMgKi8KLSNkZWZpbmUgVFNMMjU2MV9DT05UX1JFR19QV1JfT04gMHgwMwotI2RlZmluZSBUU0wyNTYxX0NPTlRfUkVHX1BXUl9PRkYgMHgwMAotCi0vKioKLSAqIHN0cnVjdCB0c2wyNTYxX3N0YXRlIC0gZGV2aWNlIHNwZWNpZmljIHN0YXRlCi0gKiBAaW5kaW9fZGV2OgkJdGhlIGluZHVzdHJpYWxpbyBJL08gaW5mbyBzdHJ1Y3R1cmUKLSAqIEBjbGllbnQ6CQlpMmMgY2xpZW50Ci0gKiBAY29tbWFuZF9idWY6CXNpbmdsZSBjb21tYW5kIGJ1ZmZlciB1c2VkIGZvciBhbGwgb3BlcmF0aW9ucwotICogQGNvbW1hbmRfYnVmX2xvY2s6CWVuc3VyZSB1bmlxdWUgYWNjZXNzIHRvIGNvbW1hbmRfYnVmCi0gKi8KLXN0cnVjdCB0c2wyNTYxX3N0YXRlIHsKLQlzdHJ1Y3QgaWlvX2RldgkJKmluZGlvX2RldjsKLQlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OwotCXN0cnVjdCB0c2wyNTYxX2NvbW1hbmQJKmNvbW1hbmRfYnVmOwotCXN0cnVjdCBtdXRleAkJY29tbWFuZF9idWZfbG9jazsKLX07Ci0KLS8qKgotICogc3RydWN0IHRzbDI1NjFfY29tbWFuZCAtIGNvbW1hbmQgYnl0ZSBmb3Igc21idXMKLSAqIEBhZGRyZXNzOglyZWdpc3RlciBhZGRyZXNzCi0gKiBAYmxvY2s6CWlzIHRoaXMgYSBibG9jayByL3cKLSAqIEB3b3JkOglpcyB0aGlzIGEgd29yZCByL3cKLSAqIEBjbGVhcjoJc2V0IHRvIDEgdG8gY2xlYXIgcGVuZGluZyBpbnRlcnJ1cHQKLSAqIEBjbWQ6CXNlbGVjdCB0aGUgY29tbWFuZCByZWdpc3RlciAtIGFsd2F5cyAxLgotICovCi1zdHJ1Y3QgdHNsMjU2MV9jb21tYW5kIHsKLQl1bnNpZ25lZCBpbnQgYWRkcmVzczo0OwotCXVuc2lnbmVkIGludCBibG9jazoxOwotCXVuc2lnbmVkIGludCB3b3JkOjE7Ci0JdW5zaWduZWQgaW50IGNsZWFyOjE7Ci0JdW5zaWduZWQgaW50IGNtZDoxOwotfTsKLQotc3RhdGljIGlubGluZSB2b2lkIHRzbDI1NjFfaW5pdF9jb21tYW5kX2J1ZihzdHJ1Y3QgdHNsMjU2MV9jb21tYW5kICpidWYpCi17Ci0JYnVmLT5hZGRyZXNzID0gMDsKLQlidWYtPmJsb2NrID0gMDsKLQlidWYtPndvcmQgPSAwOwotCWJ1Zi0+Y2xlYXIgPSAwOwotCWJ1Zi0+Y21kID0gMTsKLX0KLQotc3RhdGljIHNzaXplX3QgdHNsMjU2MV9yZWFkX3ZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJY2hhciAqYnVmKQotewotCWludCByZXQgPSAwLCBkYXRhOwotCXNzaXplX3QgbGVuID0gMDsKLQlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCB0c2wyNTYxX3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7Ci0KLQltdXRleF9sb2NrKCZzdC0+Y29tbWFuZF9idWZfbG9jayk7Ci0Jc3QtPmNvbW1hbmRfYnVmLT5jbWQgPSAxOwotCXN0LT5jb21tYW5kX2J1Zi0+d29yZCA9IDE7Ci0Jc3QtPmNvbW1hbmRfYnVmLT5hZGRyZXNzID0gdGhpc19hdHRyLT5hZGRyZXNzOwotCi0JZGF0YSA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShzdC0+Y2xpZW50LCAqKGNoYXIgKikoc3QtPmNvbW1hbmRfYnVmKSk7Ci0JaWYgKGRhdGEgPCAwKSB7Ci0JCXJldCA9IGRhdGE7Ci0JCWdvdG8gZXJyb3JfcmV0OwotCX0KLQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhKTsKLQotZXJyb3JfcmV0OgotCW11dGV4X3VubG9jaygmc3QtPmNvbW1hbmRfYnVmX2xvY2spOwotCi0JcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKLX0KLQotc3RhdGljIElJT19ERVZfQVRUUl9MSUdIVF9JTkZSQVJFRCgwLCB0c2wyNTYxX3JlYWRfdmFsLCBUU0wyNTYxX0RBVEFfMF9MT1cpOwotc3RhdGljIElJT19ERVZfQVRUUl9MSUdIVF9CUk9BRCgwLCB0c2wyNTYxX3JlYWRfdmFsLCBUU0wyNTYxX0RBVEFfMV9MT1cpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdHNsMjU2MV9hdHRyaWJ1dGVzW10gPSB7Ci0JJmlpb19kZXZfYXR0cl9saWdodF9pbmZyYXJlZDAuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2xpZ2h0X2Jyb2Fkc3BlY3RydW0wLmRldl9hdHRyLmF0dHIsCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHRzbDI1NjFfYXR0cmlidXRlX2dyb3VwID0gewotCS5hdHRycyA9IHRzbDI1NjFfYXR0cmlidXRlcywKLX07Ci0KLXN0YXRpYyBpbnQgdHNsMjU2MV9pbml0aWFsaXplKHN0cnVjdCB0c2wyNTYxX3N0YXRlICpzdCkKLXsKLQlpbnQgZXJyOwotCi0JbXV0ZXhfbG9jaygmc3QtPmNvbW1hbmRfYnVmX2xvY2spOwotCXN0LT5jb21tYW5kX2J1Zi0+d29yZCA9IDA7Ci0Jc3QtPmNvbW1hbmRfYnVmLT5ibG9jayA9IDA7Ci0Jc3QtPmNvbW1hbmRfYnVmLT5hZGRyZXNzID0gVFNMMjU2MV9DT05UUk9MX1JFR0lTVEVSOwotCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoc3QtPmNsaWVudCwgKihjaGFyICopKHN0LT5jb21tYW5kX2J1ZiksCi0JCQkJCVRTTDI1NjFfQ09OVF9SRUdfUFdSX09OKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycm9yX3JldDsKLQotCXN0LT5jb21tYW5kX2J1Zi0+YWRkcmVzcyA9IFRTTDI1NjFfSU5UX0NPTlRST0xfUkVHSVNURVI7Ci0JZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShzdC0+Y2xpZW50LCAqKGNoYXIgKikoc3QtPmNvbW1hbmRfYnVmKSwKLQkJCQkJVFNMMjU2MV9JTlRfUkVHX0lOVF9URVNUKTsKLQotZXJyb3JfcmV0OgotCW11dGV4X3VubG9jaygmc3QtPmNvbW1hbmRfYnVmX2xvY2spOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCB0c2wyNTYxX3Bvd2VyZG93bihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCWludCBlcnI7Ci0Jc3RydWN0IHRzbDI1NjFfY29tbWFuZCBDb21tYW5kID0gewotCQkuY21kID0gIDEsCi0JCS5jbGVhciA9IDAsCi0JCS53b3JkID0gMCwKLQkJLmJsb2NrID0gMCwKLQkJLmFkZHJlc3MgPSBUU0wyNTYxX0NPTlRST0xfUkVHSVNURVIsCi0JfTsKLQotCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCAqKGNoYXIgKikoJkNvbW1hbmQpLAotCQkJCQlUU0wyNTYxX0NPTlRfUkVHX1BXUl9PRkYpOwotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOwotfQotc3RhdGljIGludCBfX2RldmluaXQgdHNsMjU2MV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJCSAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlpbnQgcmV0ID0gMCwgcmVnZG9uZSA9IDA7Ci0Jc3RydWN0IHRzbDI1NjFfc3RhdGUgKnN0ID0ga3phbGxvYyhzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoc3QgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yX3JldDsKLQl9Ci0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgc3QpOwotCXN0LT5jbGllbnQgPSBjbGllbnQ7Ci0JbXV0ZXhfaW5pdCgmc3QtPmNvbW1hbmRfYnVmX2xvY2spOwotCi0Jc3QtPmNvbW1hbmRfYnVmID0ga21hbGxvYyhzaXplb2YoKnN0LT5jb21tYW5kX2J1ZiksIEdGUF9LRVJORUwpOwotCWlmIChzdC0+Y29tbWFuZF9idWYgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yX2ZyZWVfc3RhdGU7Ci0JfQotCXRzbDI1NjFfaW5pdF9jb21tYW5kX2J1ZihzdC0+Y29tbWFuZF9idWYpOwotCi0Jc3QtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKLQlpZiAoc3QtPmluZGlvX2RldiA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfZnJlZV9jb21tYW5kX2J1ZjsKLQl9Ci0Jc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmdHNsMjU2MV9hdHRyaWJ1dGVfZ3JvdXA7Ci0Jc3QtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKLQlzdC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKLQlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7Ci0Jc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfZnJlZV9paW9kZXY7Ci0JcmVnZG9uZSA9IDE7Ci0JLyogSW50aWFsaXplIHRoZSBjaGlwICovCi0JcmV0ID0gdHNsMjU2MV9pbml0aWFsaXplKHN0KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX3VucmVnaXN0ZXJfaWlvZGV2OwotCi0JcmV0dXJuIDA7Ci1lcnJvcl91bnJlZ2lzdGVyX2lpb2RldjoKLWVycm9yX2ZyZWVfaWlvZGV2OgotCWlmIChyZWdkb25lKQotCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7Ci0JZWxzZQotCQlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7Ci1lcnJvcl9mcmVlX2NvbW1hbmRfYnVmOgotCWtmcmVlKHN0LT5jb21tYW5kX2J1Zik7Ci1lcnJvcl9mcmVlX3N0YXRlOgotCWtmcmVlKHN0KTsKLWVycm9yX3JldDoKLQlyZXR1cm4gcmV0OwotCi19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IHRzbDI1NjFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IHRzbDI1NjFfc3RhdGUgKnN0ID0gIGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOwotCWtmcmVlKHN0KTsKLQotCXJldHVybiB0c2wyNTYxX3Bvd2VyZG93bihjbGllbnQpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdHNsMjU2MV9pZFtdID0gewotCXsgInRzbDI1NjEiLCAwIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHRzbDI1NjFfaWQpOwotCi0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB0c2wyNTYxX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJ0c2wyNTYxIiwKLQl9LAotCS5wcm9iZSA9IHRzbDI1NjFfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHRzbDI1NjFfcmVtb3ZlKSwKLQkuaWRfdGFibGUgID0gdHNsMjU2MV9pZCwKLX07Ci0KLXN0YXRpYyBfX2luaXQgaW50IHRzbDI1NjFfaW5pdCh2b2lkKQotewotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmdHNsMjU2MV9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQodHNsMjU2MV9pbml0KTsKLQotc3RhdGljIF9fZXhpdCB2b2lkIHRzbDI1NjFfZXhpdCh2b2lkKQotewotCWkyY19kZWxfZHJpdmVyKCZ0c2wyNTYxX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdCh0c2wyNTYxX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJKb25hdGhhbiBDYW1lcm9uIDxqaWMyM0BjYW0uYWMudWs+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlRTTDI1NjEgbGlnaHQgc2Vuc29yIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTYzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1NjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGI5NDMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTYzLmMKQEAgLTAsMCArMSw3NzMgQEAKKy8qCisgKiBkcml2ZXJzL2kyYy9jaGlwcy90c2wyNTYzLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBXcml0dGVuIGJ5IFRpbW8gTy4gS2FyamFsYWluZW4gPHRpbW8uby5rYXJqYWxhaW5lbkBub2tpYS5jb20+CisgKiBDb250YWN0OiBBbWl0IEt1Y2hlcmlhIDxhbWl0Lmt1Y2hlcmlhQHZlcmR1cmVudC5jb20+CisgKgorICogQ29udmVydGVkIHRvIElJTyBkcml2ZXIKKyAqIEFtaXQgS3VjaGVyaWEgPGFtaXQua3VjaGVyaWFAdmVyZHVyZW50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgInRzbDI1NjMuaCIKKworLyogVXNlIHRoaXMgbWFueSBiaXRzIGZvciBmcmFjdGlvbiBwYXJ0LiAqLworI2RlZmluZSBBRENfRlJBQ19CSVRTCQkoMTQpCisKKy8qIEdpdmVuIG51bWJlciBvZiAxLzEwMDAwJ3MgaW4gQURDX0ZSQUNfQklUUyBwcmVjaXNpb24uICovCisjZGVmaW5lIEZSQUMxMEsoZikJCSgoKGYpICogKDFMIDw8IChBRENfRlJBQ19CSVRTKSkpIC8gKDEwMDAwKSkKKworLyogQml0cyB1c2VkIGZvciBmcmFjdGlvbiBpbiBjYWxpYnJhdGlvbiBjb2VmZmljaWVudHMuKi8KKyNkZWZpbmUgQ0FMSUJfRlJBQ19CSVRTCQkoMTApCisvKiAwLjUgaW4gQ0FMSUJfRlJBQ19CSVRTIHByZWNpc2lvbiAqLworI2RlZmluZSBDQUxJQl9GUkFDX0hBTEYJCSgxIDw8IChDQUxJQl9GUkFDX0JJVFMgLSAxKSkKKy8qIE1ha2UgYSBmcmFjdGlvbiBmcm9tIGEgbnVtYmVyIG4gdGhhdCB3YXMgbXVsdGlwbGllZCB3aXRoIGIuICovCisjZGVmaW5lIENBTElCX0ZSQUMobiwgYikJKCgobikgPDwgQ0FMSUJfRlJBQ19CSVRTKSAvIChiKSkKKy8qIERlY2ltYWwgMTBeKGRpZ2l0cyBpbiBzeXNmcyBwcmVzZW50YXRpb24pICovCisjZGVmaW5lIENBTElCX0JBU0VfU1lTRlMJKDEwMDApCisKKyNkZWZpbmUgVFNMMjU2M19DTUQJCSgweDgwKQorI2RlZmluZSBUU0wyNTYzX0NMRUFSSU5UCSgweDQwKQorCisjZGVmaW5lIFRTTDI1NjNfUkVHX0NUUkwJKDB4MDApCisjZGVmaW5lIFRTTDI1NjNfUkVHX1RJTUlORwkoMHgwMSkKKyNkZWZpbmUgVFNMMjU2M19SRUdfTE9XTE9XCSgweDAyKSAvKiBkYXRhMCBsb3cgdGhyZXNob2xkLCAyIGJ5dGVzICovCisjZGVmaW5lIFRTTDI1NjNfUkVHX0xPV0hJR0gJKDB4MDMpCisjZGVmaW5lIFRTTDI1NjNfUkVHX0hJR0hMT1cJKDB4MDQpIC8qIGRhdGEwIGhpZ2ggdGhyZXNob2xkLCAyIGJ5dGVzICovCisjZGVmaW5lIFRTTDI1NjNfUkVHX0hJR0hISUdICSgweDA1KQorI2RlZmluZSBUU0wyNTYzX1JFR19JTlQJCSgweDA2KQorI2RlZmluZSBUU0wyNTYzX1JFR19JRAkJKDB4MGEpCisjZGVmaW5lIFRTTDI1NjNfUkVHX0RBVEEwTE9XCSgweDBjKSAvKiBicm9hZGJhbmQgc2Vuc29yIHZhbHVlLCAyIGJ5dGVzICovCisjZGVmaW5lIFRTTDI1NjNfUkVHX0RBVEEwSElHSAkoMHgwZCkKKyNkZWZpbmUgVFNMMjU2M19SRUdfREFUQTFMT1cJKDB4MGUpIC8qIGluZnJhcmVkIHNlbnNvciB2YWx1ZSwgMiBieXRlcyAqLworI2RlZmluZSBUU0wyNTYzX1JFR19EQVRBMUhJR0gJKDB4MGYpCisKKyNkZWZpbmUgVFNMMjU2M19DTURfUE9XRVJfT04JKDB4MDMpCisjZGVmaW5lIFRTTDI1NjNfQ01EX1BPV0VSX09GRgkoMHgwMCkKKyNkZWZpbmUgVFNMMjU2M19DVFJMX1BPV0VSX01BU0sJKDB4MDMpCisKKyNkZWZpbmUgVFNMMjU2M19USU1JTkdfMTNNUwkoMHgwMCkKKyNkZWZpbmUgVFNMMjU2M19USU1JTkdfMTAwTVMJKDB4MDEpCisjZGVmaW5lIFRTTDI1NjNfVElNSU5HXzQwME1TCSgweDAyKQorI2RlZmluZSBUU0wyNTYzX1RJTUlOR19NQVNLCSgweDAzKQorI2RlZmluZSBUU0wyNTYzX1RJTUlOR19HQUlOMTYJKDB4MTApCisjZGVmaW5lIFRTTDI1NjNfVElNSU5HX0dBSU4xCSgweDAwKQorCisjZGVmaW5lIFRTTDI1NjNfSU5UX0RJU0JMRUQJKDB4MDApCisjZGVmaW5lIFRTTDI1NjNfSU5UX0xFVkVMCSgweDEwKQorI2RlZmluZSBUU0wyNTYzX0lOVF9QRVJTSVNUKG4pCSgobikgJiAweDBGKQorCitzdHJ1Y3QgdHNsMjU2M19nYWlubGV2ZWxfY29lZmYgeworCXU4IGdhaW50aW1lOworCXUxNiBtaW47CisJdTE2IG1heDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHNsMjU2M19nYWlubGV2ZWxfY29lZmYgdHNsMjU2M19nYWlubGV2ZWxfdGFibGVbXSA9IHsKKwl7CisJCS5nYWludGltZQk9IFRTTDI1NjNfVElNSU5HXzQwME1TIHwgVFNMMjU2M19USU1JTkdfR0FJTjE2LAorCQkubWluCQk9IDAsCisJCS5tYXgJCT0gNjU1MzQsCisJfSwgeworCQkuZ2FpbnRpbWUJPSBUU0wyNTYzX1RJTUlOR180MDBNUyB8IFRTTDI1NjNfVElNSU5HX0dBSU4xLAorCQkubWluCQk9IDIwNDgsCisJCS5tYXgJCT0gNjU1MzQsCisJfSwgeworCQkuZ2FpbnRpbWUJPSBUU0wyNTYzX1RJTUlOR18xMDBNUyB8IFRTTDI1NjNfVElNSU5HX0dBSU4xLAorCQkubWluCQk9IDQwOTUsCisJCS5tYXgJCT0gMzcxNzcsCisJfSwgeworCQkuZ2FpbnRpbWUJPSBUU0wyNTYzX1RJTUlOR18xM01TIHwgVFNMMjU2M19USU1JTkdfR0FJTjEsCisJCS5taW4JCT0gMzAwMCwKKwkJLm1heAkJPSA2NTUzNSwKKwl9LAorfTsKKworc3RydWN0IHRzbDI1NjNfY2hpcCB7CisJc3RydWN0IG11dGV4CQlsb2NrOworCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CisJc3RydWN0IGlpb19kZXYJCSppbmRpb19kZXY7CisJc3RydWN0IGRlbGF5ZWRfd29yawlwb3dlcm9mZl93b3JrOworCisJLyogUmVtZW1iZXIgc3RhdGUgZm9yIHN1c3BlbmQgYW5kIHJlc3VtZSBmdW5jdGlvbnMgKi8KKwlwbV9tZXNzYWdlX3QJCXN0YXRlOworCisJc3RydWN0IHRzbDI1NjNfZ2FpbmxldmVsX2NvZWZmICpnYWlubGV2ZWw7CisKKwkvKiBUaHJlc2hvbGRzIGFyZSBpbiBsdXggKi8KKwl1MTYJCQlsb3dfdGhyZXM7CisJdTE2CQkJaGlnaF90aHJlczsKKwl1OAkJCWludHI7CisKKwkvKiBDYWxpYnJhdGlvbiBjb2VmZmljaWVudHMgKi8KKwl1MzIJCQljYWxpYjA7CisJdTMyCQkJY2FsaWIxOworCWludAkJCWNvdmVyX2NvbXBfZ2FpbjsKKworCS8qIENhY2hlIGN1cnJlbnQgdmFsdWVzLCB0byBiZSByZXR1cm5lZCB3aGlsZSBzdXNwZW5kZWQgKi8KKwl1MzIJCQlkYXRhMDsKKwl1MzIJCQlkYXRhMTsKK307CisKK3N0YXRpYyBpbnQgdHNsMjU2M193cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbHVlKQoreworCWludCByZXQ7CisJdTggYnVmWzJdOworCisJYnVmWzBdID0gVFNMMjU2M19DTUQgfCByZWc7CisJYnVmWzFdID0gdmFsdWU7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIHNpemVvZihidWYpKTsKKwlyZXR1cm4gKHJldCA9PSBzaXplb2YoYnVmKSkgPyAwIDogcmV0OworfQorCitzdGF0aWMgaW50IHRzbDI1NjNfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgcmV0OworCXU4IGNtZCA9IFRTTDI1NjNfQ01EIHwgcmVnOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgJmNtZCwgc2l6ZW9mKGNtZCkpOworCWlmIChyZXQgIT0gc2l6ZW9mKGNtZCkpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW50IHRzbDI1NjNfc2V0X3Bvd2VyKHN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXAsIGludCBvbikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCXU4IGNtZDsKKworCWNtZCA9IG9uID8gVFNMMjU2M19DTURfUE9XRVJfT04gOiBUU0wyNTYzX0NNRF9QT1dFUl9PRkY7CisJcmV0dXJuIHRzbDI1NjNfd3JpdGUoY2xpZW50LCBUU0wyNTYzX1JFR19DVFJMLCBjbWQpOworfQorCisvKgorICogUmV0dXJuIHZhbHVlIGlzIDAgZm9yIG9mZiwgMSBmb3Igb24sIG9yIGEgbmVnYXRpdmUgZXJyb3IKKyAqIGNvZGUgaWYgcmVhZGluZyBmYWlsZWQuCisgKi8KK3N0YXRpYyBpbnQgdHNsMjU2M19nZXRfcG93ZXIoc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCWludCByZXQ7CisJdTggdmFsOworCisJcmV0ID0gdHNsMjU2M19yZWFkKGNsaWVudCwgVFNMMjU2M19SRUdfQ1RSTCwgJnZhbCwgc2l6ZW9mKHZhbCkpOworCWlmIChyZXQgIT0gc2l6ZW9mKHZhbCkpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gKHZhbCAmIFRTTDI1NjNfQ1RSTF9QT1dFUl9NQVNLKSA9PSBUU0wyNTYzX0NNRF9QT1dFUl9PTjsKK30KKworc3RhdGljIGludCB0c2wyNTYzX2NvbmZpZ3VyZShzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CisJaW50IHJldDsKKworCXJldCA9IHRzbDI1NjNfd3JpdGUoY2xpZW50LCBUU0wyNTYzX1JFR19USU1JTkcsCisJCQljaGlwLT5nYWlubGV2ZWwtPmdhaW50aW1lKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IHRzbDI1NjNfd3JpdGUoY2xpZW50LCBUU0wyNTYzX1JFR19JTlQsIGNoaXAtPmludHIpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdHNsMjU2M19wb3dlcm9mZl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0c2wyNTYzX2NoaXAsIHBvd2Vyb2ZmX3dvcmsud29yayk7CisJdHNsMjU2M19zZXRfcG93ZXIoY2hpcCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgdHNsMjU2M19kZXRlY3Qoc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gdHNsMjU2M19zZXRfcG93ZXIoY2hpcCwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHRzbDI1NjNfZ2V0X3Bvd2VyKGNoaXApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHJldCA/IDAgOiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IHRzbDI1NjNfcmVhZF9pZChzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwLCB1OCAqaWQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0OworCisJcmV0ID0gdHNsMjU2M19yZWFkKGNsaWVudCwgVFNMMjU2M19SRUdfSUQsIGlkLCBzaXplb2YoKmlkKSk7CisJaWYgKHJldCAhPSBzaXplb2YoKmlkKSkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCisvKgorICogIk5vcm1hbGl6ZWQiIEFEQyB2YWx1ZSBpcyBvbmUgb2J0YWluZWQgd2l0aCA0MDBtcyBvZiBpbnRlZ3JhdGlvbiB0aW1lIGFuZAorICogMTZ4IGdhaW4uIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJpdHMgb2Ygc2hpZnQgbmVlZGVkIHRvCisgKiBjb252ZXJ0IGJldHdlZW4gbm9ybWFsaXplZCB2YWx1ZXMgYW5kIEhXIHZhbHVlcyBvYnRhaW5lZCB1c2luZyBnaXZlbgorICogdGltaW5nIGFuZCBnYWluIHNldHRpbmdzLgorICovCitzdGF0aWMgaW50IGFkY19zaGlmdGJpdHModTggdGltaW5nKQoreworCWludCBzaGlmdCA9IDA7CisKKwlzd2l0Y2ggKHRpbWluZyAmIFRTTDI1NjNfVElNSU5HX01BU0spIHsKKwljYXNlIFRTTDI1NjNfVElNSU5HXzEzTVM6CisJCXNoaWZ0ICs9IDU7CisJCWJyZWFrOworCWNhc2UgVFNMMjU2M19USU1JTkdfMTAwTVM6CisJCXNoaWZ0ICs9IDI7CisJCWJyZWFrOworCWNhc2UgVFNMMjU2M19USU1JTkdfNDAwTVM6CisJCS8qIG5vLW9wICovCisJCWJyZWFrOworCX0KKworCWlmICghKHRpbWluZyAmIFRTTDI1NjNfVElNSU5HX0dBSU4xNikpCisJCXNoaWZ0ICs9IDQ7CisKKwlyZXR1cm4gc2hpZnQ7Cit9CisKKy8qIENvbnZlcnQgYSBIVyBBREMgdmFsdWUgdG8gbm9ybWFsaXplZCBzY2FsZS4gKi8KK3N0YXRpYyB1MzIgbm9ybWFsaXplX2FkYyh1MTYgYWRjLCB1OCB0aW1pbmcpCit7CisJcmV0dXJuIGFkYyA8PCBhZGNfc2hpZnRiaXRzKHRpbWluZyk7Cit9CisKK3N0YXRpYyB2b2lkIHRzbDI1NjNfd2FpdF9hZGMoc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgZGVsYXk7CisKKwlzd2l0Y2ggKGNoaXAtPmdhaW5sZXZlbC0+Z2FpbnRpbWUgJiBUU0wyNTYzX1RJTUlOR19NQVNLKSB7CisJY2FzZSBUU0wyNTYzX1RJTUlOR18xM01TOgorCQlkZWxheSA9IDE0OworCQlicmVhazsKKwljYXNlIFRTTDI1NjNfVElNSU5HXzEwME1TOgorCQlkZWxheSA9IDEwMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGVsYXkgPSA0MDI7CisJfQorCS8qCisJICogVE9ETzogTWFrZSBzdXJlIHRoYXQgd2Ugd2FpdCBhdCBsZWFzdCByZXF1aXJlZCBkZWxheSBidXQgd2h5IHdlCisJICogaGF2ZSB0byBleHRlbmQgaXQgb25lIHRpY2sgbW9yZT8KKwkgKi8KKwlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcyhkZWxheSkgKyAyKTsKK30KKworc3RhdGljIGludCB0c2wyNTYzX2FkanVzdF9nYWlubGV2ZWwoc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCwgdTE2IGFkYykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCisJaWYgKGFkYyA+IGNoaXAtPmdhaW5sZXZlbC0+bWF4IHx8IGFkYyA8IGNoaXAtPmdhaW5sZXZlbC0+bWluKSB7CisKKwkJKGFkYyA+IGNoaXAtPmdhaW5sZXZlbC0+bWF4KSA/CisJCQljaGlwLT5nYWlubGV2ZWwrKyA6IGNoaXAtPmdhaW5sZXZlbC0tOworCisJCXRzbDI1NjNfd3JpdGUoY2xpZW50LCBUU0wyNTYzX1JFR19USU1JTkcsCisJCQkgICAgICBjaGlwLT5nYWlubGV2ZWwtPmdhaW50aW1lKTsKKworCQl0c2wyNTYzX3dhaXRfYWRjKGNoaXApOworCQl0c2wyNTYzX3dhaXRfYWRjKGNoaXApOworCisJCXJldHVybiAxOworCX0gZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0c2wyNTYzX2dldF9hZGMoc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCXU4IGJ1ZjBbMl0sIGJ1ZjFbMl07CisJdTE2IGFkYzAsIGFkYzE7CisJaW50IHJldHJ5ID0gMTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjaGlwLT5zdGF0ZS5ldmVudCAhPSBQTV9FVkVOVF9PTikKKwkJZ290byBvdXQ7CisKKwljYW5jZWxfZGVsYXllZF93b3JrKCZjaGlwLT5wb3dlcm9mZl93b3JrKTsKKworCWlmICghdHNsMjU2M19nZXRfcG93ZXIoY2hpcCkpIHsKKwkJcmV0ID0gdHNsMjU2M19zZXRfcG93ZXIoY2hpcCwgMSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwkJcmV0ID0gdHNsMjU2M19jb25maWd1cmUoY2hpcCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwkJdHNsMjU2M193YWl0X2FkYyhjaGlwKTsKKwl9CisKKwl3aGlsZSAocmV0cnkpIHsKKwkJcmV0ID0gdHNsMjU2M19yZWFkKGNsaWVudCwKKwkJCQkgICBUU0wyNTYzX1JFR19EQVRBMExPVyB8IFRTTDI1NjNfQ0xFQVJJTlQsCisJCQkJICAgYnVmMCwgc2l6ZW9mKGJ1ZjApKTsKKwkJaWYgKHJldCAhPSBzaXplb2YoYnVmMCkpCisJCQlnb3RvIG91dDsKKworCQlyZXQgPSB0c2wyNTYzX3JlYWQoY2xpZW50LCBUU0wyNTYzX1JFR19EQVRBMUxPVywKKwkJCQkgICBidWYxLCBzaXplb2YoYnVmMSkpOworCQlpZiAocmV0ICE9IHNpemVvZihidWYxKSkKKwkJCWdvdG8gb3V0OworCisJCWFkYzAgPSAoYnVmMFsxXSA8PCA4KSArIGJ1ZjBbMF07CisJCWFkYzEgPSAoYnVmMVsxXSA8PCA4KSArIGJ1ZjFbMF07CisKKwkJcmV0cnkgPSB0c2wyNTYzX2FkanVzdF9nYWlubGV2ZWwoY2hpcCwgYWRjMCk7CisJfQorCisJY2hpcC0+ZGF0YTAgPSBub3JtYWxpemVfYWRjKGFkYzAsIGNoaXAtPmdhaW5sZXZlbC0+Z2FpbnRpbWUpOworCWNoaXAtPmRhdGExID0gbm9ybWFsaXplX2FkYyhhZGMxLCBjaGlwLT5nYWlubGV2ZWwtPmdhaW50aW1lKTsKKworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2hpcC0+cG93ZXJvZmZfd29yaywgNSAqIEhaKTsKKworCXJldCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2FsaWJfdG9fc3lzZnModTMyIGNhbGliKQoreworCXJldHVybiAoaW50KSAoKChjYWxpYiAqIENBTElCX0JBU0VfU1lTRlMpICsKKwkJICAgICAgIENBTElCX0ZSQUNfSEFMRikgPj4gQ0FMSUJfRlJBQ19CSVRTKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgY2FsaWJfZnJvbV9zeXNmcyhpbnQgdmFsdWUpCit7CisJcmV0dXJuICgoKHUzMikgdmFsdWUpIDw8IENBTElCX0ZSQUNfQklUUykgLyBDQUxJQl9CQVNFX1NZU0ZTOworfQorCisvKgorICogQ29udmVyc2lvbnMgYmV0d2VlbiBsdXggYW5kIEFEQyB2YWx1ZXMuCisgKgorICogVGhlIGJhc2ljIGZvcm11bGEgaXMgbHV4ID0gYzAgKiBhZGMwIC0gYzEgKiBhZGMxLCB3aGVyZSBjMCBhbmQgYzEgYXJlCisgKiBhcHByb3ByaWF0ZSBjb25zdGFudHMuIERpZmZlcmVudCBjb25zdGFudHMgYXJlIG5lZWRlZCBmb3IgZGlmZmVyZW50CisgKiBraW5kcyBvZiBsaWdodCwgZGV0ZXJtaW5lZCBieSB0aGUgcmF0aW8gYWRjMS9hZGMwIChiYXNpY2FsbHkgdGhlIHJhdGlvCisgKiBvZiB0aGUgaW50ZW5zaXRpZXMgaW4gaW5mcmFyZWQgYW5kIHZpc2libGUgd2F2ZWxlbmd0aHMpLiBsdXhfdGFibGUgYmVsb3cKKyAqIGxpc3RzIHRoZSB1cHBlciB0aHJlc2hvbGQgb2YgdGhlIGFkYzEvYWRjMCByYXRpbyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGNvbnN0YW50cy4KKyAqLworCitzdHJ1Y3QgdHNsMjU2M19sdXhfY29lZmYgeworCXVuc2lnbmVkIGxvbmcgY2hfcmF0aW87CisJdW5zaWduZWQgbG9uZyBjaDBfY29lZmY7CisJdW5zaWduZWQgbG9uZyBjaDFfY29lZmY7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRzbDI1NjNfbHV4X2NvZWZmIGx1eF90YWJsZVtdID0geworCXsKKwkJLmNoX3JhdGlvCT0gRlJBQzEwSygxMzAwKSwKKwkJLmNoMF9jb2VmZgk9IEZSQUMxMEsoMzE1KSwKKwkJLmNoMV9jb2VmZgk9IEZSQUMxMEsoMjYyKSwKKwl9LCB7CisJCS5jaF9yYXRpbwk9IEZSQUMxMEsoMjYwMCksCisJCS5jaDBfY29lZmYJPSBGUkFDMTBLKDMzNyksCisJCS5jaDFfY29lZmYJPSBGUkFDMTBLKDQzMCksCisJfSwgeworCQkuY2hfcmF0aW8JPSBGUkFDMTBLKDM5MDApLAorCQkuY2gwX2NvZWZmCT0gRlJBQzEwSygzNjMpLAorCQkuY2gxX2NvZWZmCT0gRlJBQzEwSyg1MjkpLAorCX0sIHsKKwkJLmNoX3JhdGlvCT0gRlJBQzEwSyg1MjAwKSwKKwkJLmNoMF9jb2VmZgk9IEZSQUMxMEsoMzkyKSwKKwkJLmNoMV9jb2VmZgk9IEZSQUMxMEsoNjA1KSwKKwl9LCB7CisJCS5jaF9yYXRpbwk9IEZSQUMxMEsoNjUwMCksCisJCS5jaDBfY29lZmYJPSBGUkFDMTBLKDIyOSksCisJCS5jaDFfY29lZmYJPSBGUkFDMTBLKDI5MSksCisJfSwgeworCQkuY2hfcmF0aW8JPSBGUkFDMTBLKDgwMDApLAorCQkuY2gwX2NvZWZmCT0gRlJBQzEwSygxNTcpLAorCQkuY2gxX2NvZWZmCT0gRlJBQzEwSygxODApLAorCX0sIHsKKwkJLmNoX3JhdGlvCT0gRlJBQzEwSygxMzAwMCksCisJCS5jaDBfY29lZmYJPSBGUkFDMTBLKDM0KSwKKwkJLmNoMV9jb2VmZgk9IEZSQUMxMEsoMjYpLAorCX0sIHsKKwkJLmNoX3JhdGlvCT0gVUxPTkdfTUFYLAorCQkuY2gwX2NvZWZmCT0gMCwKKwkJLmNoMV9jb2VmZgk9IDAsCisJfSwKK307CisKKy8qCisgKiBDb252ZXJ0IG5vcm1hbGl6ZWQsIHNjYWxlZCBBREMgdmFsdWVzIHRvIGx1eC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBhZGNfdG9fbHV4KHUzMiBhZGMwLCB1MzIgYWRjMSkKK3sKKwljb25zdCBzdHJ1Y3QgdHNsMjU2M19sdXhfY29lZmYgKmxwID0gbHV4X3RhYmxlOworCXVuc2lnbmVkIGxvbmcgcmF0aW8sIGx1eCwgY2gwID0gYWRjMCwgY2gxID0gYWRjMTsKKworCXJhdGlvID0gY2gwID8gKChjaDEgPDwgQURDX0ZSQUNfQklUUykgLyBjaDApIDogVUxPTkdfTUFYOworCisJd2hpbGUgKGxwLT5jaF9yYXRpbyA8IHJhdGlvKQorCQlscCsrOworCisJbHV4ID0gY2gwICogbHAtPmNoMF9jb2VmZiAtIGNoMSAqIGxwLT5jaDFfY29lZmY7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGludCkgKGx1eCA+PiBBRENfRlJBQ19CSVRTKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgICAgICAgICAgICAgICAgICAgICBTeXNmcyBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3NpemVfdCB0c2wyNTYzX2FkYzBfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNoaXAtPmxvY2spOworCisJcmV0ID0gdHNsMjU2M19nZXRfYWRjKGNoaXApOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgY2hpcC0+ZGF0YTApOworb3V0OgorCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgdHNsMjU2M19hZGMxX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXAgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKKworCXJldCA9IHRzbDI1NjNfZ2V0X2FkYyhjaGlwKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGNoaXAtPmRhdGExKTsKK291dDoKKwltdXRleF91bmxvY2soJmNoaXAtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qIEFwcGx5IGNhbGlicmF0aW9uIGNvZWZmaWNpZW50IHRvIEFEQyBjb3VudC4gKi8KK3N0YXRpYyB1MzIgY2FsaWJfYWRjKHUzMiBhZGMsIHUzMiBjYWxpYikKK3sKKwl1bnNpZ25lZCBsb25nIHNjYWxlZCA9IGFkYzsKKworCXNjYWxlZCAqPSBjYWxpYjsKKwlzY2FsZWQgPj49IENBTElCX0ZSQUNfQklUUzsKKworCXJldHVybiAodTMyKSBzY2FsZWQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRzbDI1NjNfbHV4X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXAgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCXUzMiBjYWxpYjAsIGNhbGliMTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2hpcC0+bG9jayk7CisKKwlyZXQgPSB0c2wyNTYzX2dldF9hZGMoY2hpcCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwljYWxpYjAgPSBjYWxpYl9hZGMoY2hpcC0+ZGF0YTAsIGNoaXAtPmNhbGliMCkgKiBjaGlwLT5jb3Zlcl9jb21wX2dhaW47CisJY2FsaWIxID0gY2FsaWJfYWRjKGNoaXAtPmRhdGExLCBjaGlwLT5jYWxpYjEpICogY2hpcC0+Y292ZXJfY29tcF9nYWluOworCisJcmV0ID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgYWRjX3RvX2x1eChjYWxpYjAsIGNhbGliMSkpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBmb3JtYXRfY2FsaWIoY2hhciAqYnVmLCBpbnQgbGVuLCB1MzIgY2FsaWIpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGNhbGliX3RvX3N5c2ZzKGNhbGliKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRzbDI1NjNfY2FsaWIwX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXAgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKKwlyZXQgPSBmb3JtYXRfY2FsaWIoYnVmLCBQQUdFX1NJWkUsIGNoaXAtPmNhbGliMCk7CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCB0c2wyNTYzX2NhbGliMV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2hpcC0+bG9jayk7CisJcmV0ID0gZm9ybWF0X2NhbGliKGJ1ZiwgUEFHRV9TSVpFLCBjaGlwLT5jYWxpYjEpOworCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkb19jYWxpYl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwKKwkJCSAgaW50IGNoKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKwlpbnQgdmFsdWU7CisJdTMyIGNhbGliOworCisJaWYgKDEgIT0gc3NjYW5mKGJ1ZiwgIiVkIiwgJnZhbHVlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYWxpYiA9IGNhbGliX2Zyb21fc3lzZnModmFsdWUpOworCisJaWYgKGNoKQorCQljaGlwLT5jYWxpYjEgPSBjYWxpYjsKKwllbHNlCisJCWNoaXAtPmNhbGliMCA9IGNhbGliOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgdHNsMjU2M19jYWxpYjBfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXJldHVybiBkb19jYWxpYl9zdG9yZShkZXYsIGJ1ZiwgbGVuLCAwKTsKK30KKworc3RhdGljIHNzaXplX3QgdHNsMjU2M19jYWxpYjFfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXJldHVybiBkb19jYWxpYl9zdG9yZShkZXYsIGJ1ZiwgbGVuLCAxKTsKK30KKworLyogQW1pdFhYWFg6IENvbnZlcnQgdG8gSUlPX0RFVl9BVFRSX0xJR0hUKiBhcyBpbiB0c2wyNTYxCisgKiBvbmNlIEkgdW5kZXJzdGFuZCB3aGF0IHRoZXkgbWVhbiAqLworc3RhdGljIERFVklDRV9BVFRSKGFkYzAsIFNfSVJVR08sIHRzbDI1NjNfYWRjMF9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhZGMxLCBTX0lSVUdPLCB0c2wyNTYzX2FkYzFfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIobHV4LCBTX0lSVUdPLCB0c2wyNTYzX2x1eF9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihjYWxpYjAsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICB0c2wyNTYzX2NhbGliMF9zaG93LCB0c2wyNTYzX2NhbGliMF9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoY2FsaWIxLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgdHNsMjU2M19jYWxpYjFfc2hvdywgdHNsMjU2M19jYWxpYjFfc3RvcmUpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdHNsMjU2M19hdHRyaWJ1dGVzW10gPSB7CisJJmRldl9hdHRyX2FkYzAuYXR0ciwKKwkmZGV2X2F0dHJfYWRjMS5hdHRyLAorCSZkZXZfYXR0cl9sdXguYXR0ciwKKwkmZGV2X2F0dHJfY2FsaWIwLmF0dHIsCisJJmRldl9hdHRyX2NhbGliMS5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHRzbDI1NjNfZ3JvdXAgPSB7CisJLmF0dHJzID0gdHNsMjU2M19hdHRyaWJ1dGVzLAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgICAgICAgICAgICAgICAgICAgICBQcm9iZSwgQXR0YWNoLCBSZW1vdmUgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHRzbDI1NjNfaTJjX2RyaXZlcjsKKworc3RhdGljIGludCBfX2RldmluaXQgdHNsMjU2M19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkZXZpY2VfaWQpCit7CisJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcDsKKwlzdHJ1Y3QgdHNsMjU2M19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IGVyciA9IDA7CisJaW50IHJldDsKKwl1OCBpZDsKKworCWNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOworCWlmICghY2hpcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjaGlwKTsKKwljaGlwLT5jbGllbnQgPSBjbGllbnQ7CisKKwllcnIgPSB0c2wyNTYzX2RldGVjdChjaGlwKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZGV2aWNlIG5vdCBmb3VuZCwgZXJyb3IgJWQgXG4iLCAtZXJyKTsKKwkJZ290byBmYWlsMTsKKwl9CisKKwllcnIgPSB0c2wyNTYzX3JlYWRfaWQoY2hpcCwgJmlkKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWwxOworCisJbXV0ZXhfaW5pdCgmY2hpcC0+bG9jayk7CisKKwkvKiBEZWZhdWx0IHZhbHVlcyB1c2VkIHVudGlsIHVzZXJzcGFjZSBzYXlzIG90aGVyd2lzZSAqLworCWNoaXAtPmxvd190aHJlcyA9IDB4MDsKKwljaGlwLT5oaWdoX3RocmVzID0gMHhmZmZmOworCWNoaXAtPmdhaW5sZXZlbCA9IHRzbDI1NjNfZ2FpbmxldmVsX3RhYmxlOworCWNoaXAtPmludHIgPSBUU0wyNTYzX0lOVF9QRVJTSVNUKDQpOworCWNoaXAtPmNhbGliMCA9IGNhbGliX2Zyb21fc3lzZnMoQ0FMSUJfQkFTRV9TWVNGUyk7CisJY2hpcC0+Y2FsaWIxID0gY2FsaWJfZnJvbV9zeXNmcyhDQUxJQl9CQVNFX1NZU0ZTKTsKKworCWlmIChwZGF0YSkKKwkJY2hpcC0+Y292ZXJfY29tcF9nYWluID0gcGRhdGEtPmNvdmVyX2NvbXBfZ2FpbjsKKwllbHNlCisJCWNoaXAtPmNvdmVyX2NvbXBfZ2FpbiA9IDE7CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJtb2RlbCAlZCwgcmV2LiAlZFxuIiwgaWQgPj4gNCwgaWQgJiAweDBmKTsKKworCWNoaXAtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWNoaXAtPmluZGlvX2RldikKKwkJZ290byBmYWlsMTsKKwljaGlwLT5pbmRpb19kZXYtPmF0dHJzID0gJnRzbDI1NjNfZ3JvdXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWNoaXAtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShjaGlwKTsKKwljaGlwLT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwljaGlwLT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDE7CisKKwllcnIgPSB0c2wyNTYzX2NvbmZpZ3VyZShjaGlwKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWwyOworCisJSU5JVF9ERUxBWUVEX1dPUksoJmNoaXAtPnBvd2Vyb2ZmX3dvcmssIHRzbDI1NjNfcG93ZXJvZmZfd29yayk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaGlwLT5wb3dlcm9mZl93b3JrLCA1ICogSFopOworCisJcmV0dXJuIDA7CitmYWlsMjoKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKK2ZhaWwxOgorCWtmcmVlKGNoaXApOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdHNsMjU2M19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKKworCWtmcmVlKGNoaXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRzbDI1NjNfc3VzcGVuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKKworCXJldCA9IHRzbDI1NjNfc2V0X3Bvd2VyKGNoaXAsIDApOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJY2hpcC0+c3RhdGUgPSBzdGF0ZTsKKworb3V0OgorCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0c2wyNTYzX3Jlc3VtZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2hpcC0+bG9jayk7CisKKwlyZXQgPSB0c2wyNTYzX3NldF9wb3dlcihjaGlwLCAxKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IHRzbDI1NjNfY29uZmlndXJlKGNoaXApOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJY2hpcC0+c3RhdGUuZXZlbnQgPSBQTV9FVkVOVF9PTjsKKworb3V0OgorCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHRzbDI1NjNfaWRbXSA9IHsKKwl7ICJ0c2wyNTYwIiwgMCB9LAorCXsgInRzbDI1NjEiLCAxIH0sCisJeyAidHNsMjU2MiIsIDIgfSwKKwl7ICJ0c2wyNTYzIiwgMyB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHRzbDI1NjNfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdHNsMjU2M19pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCSA9ICJ0c2wyNTYzIiwKKwl9LAorCS5zdXNwZW5kCT0gdHNsMjU2M19zdXNwZW5kLAorCS5yZXN1bWUJCT0gdHNsMjU2M19yZXN1bWUsCisJLnByb2JlCQk9IHRzbDI1NjNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh0c2wyNTYzX3JlbW92ZSksCisJLmlkX3RhYmxlCT0gdHNsMjU2M19pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRzbDI1NjNfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmdHNsMjU2M19pMmNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRzbDI1NjNfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZ0c2wyNTYzX2kyY19kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJOb2tpYSBDb3Jwb3JhdGlvbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ0c2wyNTYzIGxpZ2h0IHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQodHNsMjU2M19pbml0KTsKK21vZHVsZV9leGl0KHRzbDI1NjNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1NjMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMjU2My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NzM2OGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1NjMuaApAQCAtMCwwICsxLDkgQEAKKyNpZm5kZWYgX19MSU5VWF9UU0wyNTYzX0gKKyNkZWZpbmUgX19MSU5VWF9UU0wyNTYzX0gKKworc3RydWN0IHRzbDI1NjNfcGxhdGZvcm1fZGF0YSB7CisJaW50IGNvdmVyX2NvbXBfZ2FpbjsKK307CisKKyNlbmRpZiAvKiBfX0xJTlVYX1RTTDI1NjNfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3JpbmdfZ2VuZXJpYy5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yaW5nX2dlbmVyaWMuaAppbmRleCBkOTI2MTg5Li45M2I5MWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3JpbmdfZ2VuZXJpYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vcmluZ19nZW5lcmljLmgKQEAgLTI1LDkgKzI1LDEyIEBACiAJCQlpbnQgZXZlbnRfY29kZSwKIAkJCXM2NCB0aW1lc3RhbXApOwogLyoqCi0gKiBpaW9fcHVzaF9vcl9lc2NhbGxhdGVfcmluZ19ldmVudCgpIC0JZXNjYWxsYXRlIG9yIGFkZCBhcyBhcHByb3ByaWF0ZQorICogaWlvX3B1c2hfb3JfZXNjYWxsYXRlX3JpbmdfZXZlbnQoKSAtCWVzY2FsYXRlIG9yIGFkZCBhcyBhcHByb3ByaWF0ZQorICogQHJpbmdfYnVmOgkJcmluZyBidWZmZXIgdGhhdCBpcyB0aGUgZXZlbnQgc291cmNlCisgKiBAZXZlbnRfY29kZToJCWV2ZW50IGluZGVudGlmaWNhdGlvbiBjb2RlCisgKiBAdGltZXN0YW1wOgkJdGltZSBvZiBldmVudAogICoKLSAqIFR5cGljYWwgdXNlY2FzZSBpcyB0byBlc2NhbGxhdGUgYSA1MCUgcmluZyBmdWxsIHRvIDc1JSBmdWxsIGlmIG5vb25lIGhhcyB5ZXQKKyAqIFR5cGljYWwgdXNlY2FzZSBpcyB0byBlc2NhbGF0ZSBhIDUwJSByaW5nIGZ1bGwgdG8gNzUlIGZ1bGwgaWYgbm9vbmUgaGFzIHlldAogICogcmVhZCB0aGUgZmlyc3QgZXZlbnQuIENsZWFybHkgdGhlIDUwJSBmdWxsIGlzIG5vIGxvbmdlciBvZiBpbnRlcmVzdCBpbgogICogdHlwaWNhbCB1c2UgY2FzZS4KICAqKi8KQEAgLTM3LDEwICs0MCw2IEBACiAKIC8qKgogICogc3RydWN0IGlpb19yaW5nX2FjY2Vzc19mdW5jcyAtIGFjY2VzcyBmdW5jdGlvbnMgZm9yIHJpbmcgYnVmZmVycy4KLSAqIEBjcmVhdGU6CQlwZXJmb3JtIGFsbG9jYXRpb24KLSAqIEBpbml0OgkJZ2V0IHJpbmcgYnVmZmVyIHJlYWR5IGZvciB1c2UKLSAqIEBfZXhpdDoJCXJldmVyc2Ugc3RlcHMgaW4gaW5pdAotICogQF9mcmVlOgkJZGVhbGxvY2F0ZSByaW5nIGJ1ZmZlcgogICogQG1hcmtfaW5fdXNlOglyZWZlcmVuY2UgY291bnRpbmcsIHR5cGljYWxseSB0byBwcmV2ZW50IG1vZHVsZSByZW1vdmFsCiAgKiBAdW5tYXJrX2luX3VzZToJcmVkdWNlIHJlZmVyZW5jZSBjb3VudCB3aGVuIG5vIGxvbmdlciB1c2luZyByaW5nIGJ1ZmZlcgogICogQHN0b3JlX3RvOgkJYWN0dWFsbHkgc3RvcmUgc3R1ZmYgdG8gdGhlIHJpbmcgYnVmZmVyCkBAIC02MCw3ICs1OSw3IEBACiAgKgogICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgaXMgdG8gbWFrZSB0aGUgcmluZyBidWZmZXIgZWxlbWVudAogICogbW9kdWxhciBhcyBldmVudCBmb3IgYSBnaXZlbiBkcml2ZXIsIGRpZmZlcmVudCB1c2VjYXNlcyBtYXkgcmVxdWlyZQotICogZGlmZmVyZW50IHJpbmcgZGVzaWducyAoc3BhY2UgZWZmaWNpZW5jeSB2cyBzcGVlZCBmb3IgZXhhbXBsZS4KKyAqIGRpZmZlcmVudCByaW5nIGRlc2lnbnMgKHNwYWNlIGVmZmljaWVuY3kgdnMgc3BlZWQgZm9yIGV4YW1wbGUpLgogICoKICAqIEl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IGEgZ2l2ZW4gcmluZyBpbXBsZW1lbnRhdGlvbiBtYXkgb25seSBzdXBwb3J0IGEgc21hbGwKICAqIHByb3BvcnRpb24gb2YgdGhlc2UgZnVuY3Rpb25zLiAgVGhlIGNvcmUgY29kZSAnc2hvdWxkJyBjb3BlIGZpbmUgd2l0aCBhbnkgb2YKQEAgLTkxLDIzICs5MCwyNSBAQAogCiAvKioKICAqIHN0cnVjdCBpaW9fcmluZ19idWZmZXIgLSBnZW5lcmFsIHJpbmcgYnVmZmVyIHN0cnVjdHVyZQotICogQGxlbmd0aDoJCVtERVZJQ0VdbnVtYmVyIG9mIGRhdHVtcyBpbiByaW5nCi0gKiBAYnBkOgkJW0RFVklDRV1zaXplIG9mIGluZGl2aWR1YWwgZGF0dW0gaW5jbHVkaW5nIHRpbWVzdGFtcAotICogQGxvb3Bjb3VudDoJCVtJTlRFUk5dbnVtYmVyIG9mIHRpbWVzIHRoZSByaW5nIGhhcyBsb29wZWQKLSAqIEBhY2Nlc3NfbWlub3JfbmFtZToJW0lOVEVSTl1zdG9yZSBvZiBuYW1lIG9mIHRoZSBhY2Nlc3MgY2hyZGV2IG1pbm9yIG51bWJlcgotICoJCQlzeXNmcyBhdHRyaWJ1dGUKLSAqIEBhY2Nlc3NfaGFuZGxlcjoJW0lOVEVSTl1jaHJkZXYgYWNjZXNzIGhhbmRsaW5nCi0gKiBAZXZlbnRfbWlub3JfbmFtZToJW0lOVEVSTl1zdG9yZSBvZiBuYW1lIG9mIHRoZSBldmVudCBjaHJkZXYgbWlub3IgbnVtYmVyCi0gKgkJCXN5c2ZzIGF0dHJpYnV0ZQotICogQGV2X2ludDoJCVtJTlRFUk5dY2hyZGV2IGludGVyZmFjZSBmb3IgdGhlIGV2ZW50IGNocmRldgotICogQHNoYXJlZF9ldl9wb2ludGVyOglbSU5URVJOXXRoZSBzaGFyZWQgZXZlbnQgcG9pbnRlciB0byBhbGxvdyBlc2NhbGF0aW9uIG9mCisgKiBAZGV2OgkJcmluZyBidWZmZXIgZGV2aWNlIHN0cnVjdAorICogQGFjY2Vzc19kZXY6CQlzeXN0ZW0gZGV2aWNlIHN0cnVjdCBmb3IgdGhlIGNocmRldgorICogQGluZGlvX2RldjoJCWluZHVzdHJpYWwgSS9PIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBvd25lcjoJCW1vZHVsZSB0aGF0IG93bnMgdGhlIHJpbmcgYnVmZmVyIChmb3IgcmVmIGNvdW50aW5nKQorICogQGlkOgkJCXVuaXF1ZSBpZCBudW1iZXIKKyAqIEBhY2Nlc3NfaWQ6CQlkZXZpY2UgaWQgbnVtYmVyCisgKiBAbGVuZ3RoOgkJW0RFVklDRV0gbnVtYmVyIG9mIGRhdHVtcyBpbiByaW5nCisgKiBAYnBkOgkJW0RFVklDRV0gc2l6ZSBvZiBpbmRpdmlkdWFsIGRhdHVtIGluY2x1ZGluZyB0aW1lc3RhbXAKKyAqIEBsb29wY291bnQ6CQlbSU5URVJOXSBudW1iZXIgb2YgdGltZXMgdGhlIHJpbmcgaGFzIGxvb3BlZAorICogQGFjY2Vzc19oYW5kbGVyOglbSU5URVJOXSBjaHJkZXYgYWNjZXNzIGhhbmRsaW5nCisgKiBAZXZfaW50OgkJW0lOVEVSTl0gY2hyZGV2IGludGVyZmFjZSBmb3IgdGhlIGV2ZW50IGNocmRldgorICogQHNoYXJlZF9ldl9wb2ludGVyOglbSU5URVJOXSB0aGUgc2hhcmVkIGV2ZW50IHBvaW50ZXIgdG8gYWxsb3cgZXNjYWxhdGlvbiBvZgogICoJCQlldmVudHMKLSAqIEByaW5nX2FjY2VzczoJW0RSSVZFUl1yaW5nIGFjY2VzcyBmdW5jdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogQGFjY2VzczoJCVtEUklWRVJdIHJpbmcgYWNjZXNzIGZ1bmN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlCiAgKgkJCWltcGxlbWVudGF0aW9uLgotICogQHJpbmdfcHJlbmFibGU6CVtEUklWRVJdIGZ1bmN0aW9uIHRvIHJ1biBwcmlvciB0byBtYXJraW5nIHJpbmcgZW5hYmxlZAotICogQHJpbmdfcG9zdGVuYWJsZToJW0RSSVZFUl0gZnVuY3Rpb24gdG8gcnVuIGFmdGVyIG1hcmtpbmcgcmluZyBlbmFibGVkCi0gKiBAcmluZ19wcmVkaXNhYmxlOglbRFJJVkVSXSBmdW5jdGlvbiB0byBydW4gcHJpb3IgdG8gbWFya2luZyByaW5nIGRpc2FibGVkCi0gKiBAcmluZ19wb3N0ZGlzYWJsZToJW0RSSVZFUl0gZnVuY3Rpb24gdG8gcnVuIGFmdGVyIG1hcmtpbmcgcmluZyBkaXNhYmxlZAorICogQHByZWVuYWJsZToJCVtEUklWRVJdIGZ1bmN0aW9uIHRvIHJ1biBwcmlvciB0byBtYXJraW5nIHJpbmcgZW5hYmxlZAorICogQHBvc3RlbmFibGU6CQlbRFJJVkVSXSBmdW5jdGlvbiB0byBydW4gYWZ0ZXIgbWFya2luZyByaW5nIGVuYWJsZWQKKyAqIEBwcmVkaXNhYmxlOgkJW0RSSVZFUl0gZnVuY3Rpb24gdG8gcnVuIHByaW9yIHRvIG1hcmtpbmcgcmluZyBkaXNhYmxlZAorICogQHBvc3RkaXNhYmxlOglbRFJJVkVSXSBmdW5jdGlvbiB0byBydW4gYWZ0ZXIgbWFya2luZyByaW5nIGRpc2FibGVkCiAgICoqLwogc3RydWN0IGlpb19yaW5nX2J1ZmZlciB7CiAJc3RydWN0IGRldmljZSBkZXY7CkBAIC0xMzMsNyArMTM0LDEwIEBACiAJCQkgIHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyk7CiAKIC8qKgotICogX19paW9faW5pdF9yaW5nX2J1ZmZlcigpIC0gaW5pdGlhbGl6ZSBjb21tb24gZWxlbWVudHMgb2YgcmluZyBidWZmZXJzLgorICogX19paW9faW5pdF9yaW5nX2J1ZmZlcigpIC0gaW5pdGlhbGl6ZSBjb21tb24gZWxlbWVudHMgb2YgcmluZyBidWZmZXJzCisgKiBAcmluZzoJCXJpbmcgYnVmZmVyIHRoYXQgaXMgdGhlIGV2ZW50IHNvdXJjZQorICogQGJ5dGVzX3Blcl9kYXR1bToJc2l6ZSBvZiBpbmRpdmlkdWFsIGRhdHVtIGluY2x1ZGluZyB0aW1lc3RhbXAKKyAqIEBsZW5ndGg6CQludW1iZXIgb2YgZGF0dW1zIGluIHJpbmcKICAqKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2lpb19pbml0X3JpbmdfYnVmZmVyKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcsCiAJCQkJIGludCBieXRlc19wZXJfZGF0dW0sIGludCBsZW5ndGgpCkBAIC0xNzEsNyArMTc1LDExIEBACiAJY29udGFpbmVyX29mKF9kZXZfYXR0ciwgc3RydWN0IGlpb19zY2FuX2VsLCBkZXZfYXR0cik7CiAKIC8qKgotICogaWlvX3NjYW5fZWxfc3RvcmUoKSAtIHN5c2ZzIHNjYW4gZWxlbWVudCBzZWxlY3Rpb24gaW50ZXJmYWNlLgorICogaWlvX3NjYW5fZWxfc3RvcmUoKSAtIHN5c2ZzIHNjYW4gZWxlbWVudCBzZWxlY3Rpb24gaW50ZXJmYWNlCisgKiBAZGV2OiB0aGUgdGFyZ2V0IGRldmljZQorICogQGF0dHI6IHRoZSBkZXZpY2UgYXR0cmlidXRlIHRoYXQgaXMgYmVpbmcgcHJvY2Vzc2VkCisgKiBAYnVmOiBpbnB1dCBmcm9tIHVzZXJzcGFjZQorICogQGxlbjogbGVuZ3RoIG9mIGlucHV0CiAgKgogICogQSBnZW5lcmljIGZ1bmN0aW9uIHVzZWQgdG8gZW5hYmxlIHZhcmlvdXMgc2NhbiBlbGVtZW50cy4gIEluIHNvbWUKICAqIGRldmljZXMgZXhwbGljaXQgcmVhZCBjb21tYW5kcyBmb3IgZWFjaCBjaGFubmVsIG1lYW4gdGhpcyBpcyBtZXJlbHkKQEAgLTE4NCwxMiArMTkyLDE1IEBACiAJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CiAvKioKICAqIGlpb19zY2FsX2VsX3Nob3coKSAtCXN5c2ZzIGludGVyZmFjZSB0byBxdWVyeSB3aGV0aGVyIGEgc2NhbiBlbGVtZW50IGlzCi0gKgkJCWlzIGVuYWJsZWQgb3Igbm90LgorICoJCQlpcyBlbmFibGVkIG9yIG5vdAorICogQGRldjogdGhlIHRhcmdldCBkZXZpY2UKKyAqIEBhdHRyOiB0aGUgZGV2aWNlIGF0dHJpYnV0ZSB0aGF0IGlzIGJlaW5nIHByb2Nlc3NlZAorICogQGJ1Zjogb3V0cHV0IGJ1ZmZlcgogICoqLwogc3NpemVfdCBpaW9fc2Nhbl9lbF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgY2hhciAqYnVmKTsKIC8qKgotICogSUlPX1NDQU5fRUw6IC0gZGVjbGFyZSBhbmQgaW5pdGlhbGl6ZSBhIHNjYW4gZWxlbWVudCB3aXRob3V0IGNvbnRyb2wgZnVuYworICogSUlPX1NDQU5fRUwgLSBkZWNsYXJlIGFuZCBpbml0aWFsaXplIGEgc2NhbiBlbGVtZW50IHdpdGhvdXQgY29udHJvbCBmdW5jCiAgKiBAX25hbWU6CWlkZW50aWZ5aW5nIG5hbWUuIFJlc3VsdGluZyBzdHJ1Y3QgaXMgaWlvX3NjYW5fZWxfIyNfbmFtZSwKICAqCQlzeXNmcyBlbGVtZW50LCBzY2FuX2VuXyMjX25hbWUuCiAgKiBAX251bWJlcjoJdW5pcXVlIGlkIG51bWJlciBmb3IgdGhlIHNjYW4gZWxlbWVudC4KQEAgLTIxNCw4ICsyMjUsMTQgQEAKIHNzaXplX3QgaWlvX3NjYW5fZWxfdHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJICAgIGNoYXIgKmJ1Zik7CiAvKioKLSAqIElJT19TQ0FOX0VMX0M6IC0gZGVjbGFyZSBhbmQgaW5pdGlhbGl6ZSBhIHNjYW4gZWxlbWVudCB3aXRoIGEgY29udHJvbCBmdW5jCisgKiBJSU9fU0NBTl9FTF9DIC0gZGVjbGFyZSBhbmQgaW5pdGlhbGl6ZSBhIHNjYW4gZWxlbWVudCB3aXRoIGEgY29udHJvbCBmdW5jCiAgKgorICogQF9uYW1lOglpZGVudGlmeWluZyBuYW1lLiBSZXN1bHRpbmcgc3RydWN0IGlzIGlpb19zY2FuX2VsXyMjX25hbWUsCisgKgkJc3lzZnMgZWxlbWVudCwgc2Nhbl9lbl8jI19uYW1lLgorICogQF9udW1iZXI6CXVuaXF1ZSBpZCBudW1iZXIgZm9yIHRoZSBzY2FuIGVsZW1lbnQuCisgKiBAX2JpdHM6CW51bWJlciBvZiBiaXRzIGluIHRoZSBzY2FuIGVsZW1lbnQgcmVzdWx0ICh1c2VkIGluIG1peGVkIGJpdAorICoJCWxlbmd0aCBkZXZpY2VzKS4KKyAqIEBfbGFiZWw6CWluZGVudGlmaWNhdGlvbiB2YXJpYWJsZSB1c2VkIGJ5IGRyaXZlcnMuICBPZnRlbiBhIHJlZyBhZGRyZXNzLgogICogQF9jb250cm9sZnVuYzogZnVuY3Rpb24gdXNlZCB0byBub3RpZnkgaGFyZHdhcmUgb2Ygd2hldGhlciBzdGF0ZSBjaGFuZ2VzCiAgKiovCiAjZGVmaW5lIElJT19TQ0FOX0VMX0MoX25hbWUsIF9udW1iZXIsIF9iaXRzLCBfbGFiZWwsIF9jb250cm9sZnVuYykJXApAQCAtMjMwLDcgKzI0Nyw3IEBACiAJCS5zZXRfc3RhdGUgPSBfY29udHJvbGZ1bmMsCQkJCVwKIAl9CiAvKioKLSAqIElJT19TQ0FOX0VMX1RJTUVTVEFNUDogLSBkZWNsYXJlIGEgc3BlY2lhbCBzY2FuIGVsZW1lbnQgZm9yIHRpbWVzdGFtcHMKKyAqIElJT19TQ0FOX0VMX1RJTUVTVEFNUCAtIGRlY2xhcmUgYSBzcGVjaWFsIHNjYW4gZWxlbWVudCBmb3IgdGltZXN0YW1wcwogICoKICAqIE9kZCBvbmUgb3V0LiBIYW5kbGVkIHNsaWdodGx5IGRpZmZlcmVudGx5IGZyb20gb3RoZXIgc2NhbiBlbGVtZW50cy4KICAqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmluZ19zdy5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yaW5nX3N3LmgKaW5kZXggYWU3MGVlMC4uZjBiODZmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9yaW5nX3N3LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yaW5nX3N3LmgKQEAgLTM2LDUyICszNiw2NSBAQAogI2lmIGRlZmluZWQgQ09ORklHX0lJT19TV19SSU5HIHx8IGRlZmluZWQgQ09ORklHX0lJT19TV19SSU5HX01PRFVMRQogCiAvKioKLSAqIGlpb19jcmVhdGVfc3dfcmIoKSBzb2Z0d2FyZSByaW5nIGJ1ZmZlciBhbGxvY2F0aW9uCisgKiBpaW9fY3JlYXRlX3N3X3JiKCkgLSBzb2Z0d2FyZSByaW5nIGJ1ZmZlciBhbGxvY2F0aW9uCiAgKiBAcjoJCXBvaW50ZXIgdG8gcmluZyBidWZmZXIgcG9pbnRlcgogICoqLwogaW50IGlpb19jcmVhdGVfc3dfcmIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqKnIpOwogCiAvKioKLSAqIGlpb19pbml0X3N3X3JiKCkgaW5pdGlhbGl6ZSB0aGUgc29mdHdhcmUgcmluZyBidWZmZXIKKyAqIGlpb19pbml0X3N3X3JiKCkgLSBpbml0aWFsaXplIHRoZSBzb2Z0d2FyZSByaW5nIGJ1ZmZlcgogICogQHI6CQlwb2ludGVyIHRvIGEgc29mdHdhcmUgcmluZyBidWZmZXIgY3JlYXRlZCBieSBhbgotICoJCWlpb19jcmVhdGVfc3dfcmIgY2FsbC4KKyAqCQlpaW9fY3JlYXRlX3N3X3JiIGNhbGwKKyAqIEBpbmRpb19kZXY6CQlpbmR1c3RyaWFsIEkvTyBkZXZpY2Ugc3RydWN0dXJlCiAgKiovCiBpbnQgaWlvX2luaXRfc3dfcmIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqciwgc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKIC8qKgotICogaWlvX2V4aXRfc3dfcmIoKSByZXZlcnNlIHdoYXQgd2FzIGRvbmUgaW4gaWlvX2luaXRfc3dfcmIKKyAqIGlpb19leGl0X3N3X3JiKCkgLSByZXZlcnNlIHdoYXQgd2FzIGRvbmUgaW4gaWlvX2luaXRfc3dfcmIKKyAqIEByOgkJcG9pbnRlciB0byBhIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGNyZWF0ZWQgYnkgYW4KKyAqCQlpaW9fY3JlYXRlX3N3X3JiIGNhbGwKICAqKi8KIHZvaWQgaWlvX2V4aXRfc3dfcmIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcik7CiAKIC8qKgotICogaWlvX2ZyZWVfc3dfcmIoKSBmcmVlIG1lbW9yeSBvY2N1cGllZCBieSB0aGUgY29yZSByaW5nIGJ1ZmZlciBzdHJ1Y3QKKyAqIGlpb19mcmVlX3N3X3JiKCkgLSBmcmVlIG1lbW9yeSBvY2N1cGllZCBieSB0aGUgY29yZSByaW5nIGJ1ZmZlciBzdHJ1Y3QKKyAqIEByOgkJcG9pbnRlciB0byBhIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGNyZWF0ZWQgYnkgYW4KKyAqCQlpaW9fY3JlYXRlX3N3X3JiIGNhbGwKICAqKi8KIHZvaWQgaWlvX2ZyZWVfc3dfcmIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcik7CiAKIC8qKgotICogaWlvX21hcmtfc3dfcmJfaW5fdXNlKCkgcmVmZXJlbmNlIGNvdW50aW5nIHRvIHByZXZlbnQgaW5jb3JyZWN0IGNoYW5jZXMKKyAqIGlpb19tYXJrX3N3X3JiX2luX3VzZSgpIC0gcmVmZXJlbmNlIGNvdW50aW5nIHRvIHByZXZlbnQgaW5jb3JyZWN0IGNoYW5jZXMKKyAqIEByOgkJcG9pbnRlciB0byBhIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGNyZWF0ZWQgYnkgYW4KKyAqCQlpaW9fY3JlYXRlX3N3X3JiIGNhbGwKICAqKi8KIHZvaWQgaWlvX21hcmtfc3dfcmJfaW5fdXNlKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIpOwogCiAvKioKLSAqICBpaW9fdW5tYXJrX3N3X3JiX2luX3VzZSgpIG5vdGlmeSB0aGUgcmluZyBidWZmZXIgdGhhdCB3ZSBkb24ndCBjYXJlIGFueW1vcmUKKyAqICBpaW9fdW5tYXJrX3N3X3JiX2luX3VzZSgpIC0gbm90aWZ5IHRoZSByaW5nIGJ1ZmZlciB0aGF0IHdlIGRvbid0IGNhcmUgYW55bW9yZQorICogQHI6CQlwb2ludGVyIHRvIGEgc29mdHdhcmUgcmluZyBidWZmZXIgY3JlYXRlZCBieSBhbgorICoJCWlpb19jcmVhdGVfc3dfcmIgY2FsbAogICoqLwogdm9pZCBpaW9fdW5tYXJrX3N3X3JiX2luX3VzZShzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyKTsKIAogLyoqCi0gKiBpaW9fcmVhZF9sYXN0X2Zyb21fc3dfcmIoKSBhdHRlbXB0IHRvIHJlYWQgdGhlIGxhc3Qgc3RvcmVkIGRhdHVtIGZyb20gdGhlIHJiCisgKiBpaW9fcmVhZF9sYXN0X2Zyb21fc3dfcmIoKSAtIGF0dGVtcHQgdG8gcmVhZCB0aGUgbGFzdCBzdG9yZWQgZGF0dW0gZnJvbSB0aGUgcmIKKyAqIEByOgkJcG9pbnRlciB0byBhIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGNyZWF0ZWQgYnkgYW4KKyAqCQlpaW9fY3JlYXRlX3N3X3JiIGNhbGwKKyAqIEBkYXRhOgl3aGVyZSB0byBzdG9yZSB0aGUgbGFzdCBkYXR1bQogICoqLwogaW50IGlpb19yZWFkX2xhc3RfZnJvbV9zd19yYihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyLCB1OCAqZGF0YSk7CiAKIC8qKgotICogaWlvX3N0b3JlX3RvX3N3X3JiKCkgc3RvcmUgYSBuZXcgZGF0dW0gdG8gdGhlIHJpbmcgYnVmZmVyCi0gKiBAcmI6CXBvaW50ZXIgdG8gcmluZyBidWZmZXIgaW5zdGFuY2UKLSAqIEBkYXRhOgl0aGUgZGF0dW0gdG8gYmUgc3RvcmVkIGluY2x1ZGluZyB0aW1lc3RhbXAgaWYgcmVsZXZhbnQuCi0gKiBAdGltZXN0YW1wOgl0aW1lc3RhbXAgd2hpY2ggd2lsbCBiZSBhdHRhY2hlZCB0byBidWZmZXIgZXZlbnRzIGlmIHJlbGV2YW50LgorICogaWlvX3N0b3JlX3RvX3N3X3JiKCkgLSBzdG9yZSBhIG5ldyBkYXR1bSB0byB0aGUgcmluZyBidWZmZXIKKyAqIEByOgkJcG9pbnRlciB0byByaW5nIGJ1ZmZlciBpbnN0YW5jZQorICogQGRhdGE6CXRoZSBkYXR1bSB0byBiZSBzdG9yZWQgaW5jbHVkaW5nIHRpbWVzdGFtcCBpZiByZWxldmFudAorICogQHRpbWVzdGFtcDoJdGltZXN0YW1wIHdoaWNoIHdpbGwgYmUgYXR0YWNoZWQgdG8gYnVmZmVyIGV2ZW50cyBpZiByZWxldmFudAogICoqLwogaW50IGlpb19zdG9yZV90b19zd19yYihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyLCB1OCAqZGF0YSwgczY0IHRpbWVzdGFtcCk7CiAKIC8qKgotICogaWlvX3JpcF9zd19yYigpIGF0dGVtcHQgdG8gcmVhZCBkYXRhIGZyb20gdGhlIHJpbmcgYnVmZmVyCisgKiBpaW9fcmlwX3N3X3JiKCkgLSBhdHRlbXB0IHRvIHJlYWQgZGF0YSBmcm9tIHRoZSByaW5nIGJ1ZmZlcgogICogQHI6CQkJcmluZyBidWZmZXIgaW5zdGFuY2UKICAqIEBjb3VudDoJCW51bWJlciBvZiBkYXR1bSdzIHRvIHRyeSBhbmQgcmVhZAogICogQGRhdGE6CQl3aGVyZSB0aGUgZGF0YSB3aWxsIGJlIHN0b3JlZC4KQEAgLTk0LDM4ICsxMDcsNTMgQEAKIAkJICBpbnQgKmRlYWRfb2Zmc2V0KTsKIAogLyoqCi0gKiBpaW9fcmVxdWVzdF91cGRhdGVfc3dfcmIoKSB1cGRhdGUgcGFyYW1zIGlmIHVwZGF0ZSBuZWVkZWQKKyAqIGlpb19yZXF1ZXN0X3VwZGF0ZV9zd19yYigpIC0gdXBkYXRlIHBhcmFtcyBpZiB1cGRhdGUgbmVlZGVkCisgKiBAcjoJCXBvaW50ZXIgdG8gYSBzb2Z0d2FyZSByaW5nIGJ1ZmZlciBjcmVhdGVkIGJ5IGFuCisgKgkJaWlvX2NyZWF0ZV9zd19yYiBjYWxsCiAgKiovCiBpbnQgaWlvX3JlcXVlc3RfdXBkYXRlX3N3X3JiKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIpOwogCiAvKioKLSAqIGlpb19tYXJrX3VwZGF0ZV9uZWVkZWRfc3dfcmIoKSB0ZWxsIHRoZSByaW5nIGJ1ZmZlciBpdCBuZWVkcyBhIHBhcmFtIHVwZGF0ZQorICogaWlvX21hcmtfdXBkYXRlX25lZWRlZF9zd19yYigpIC0gdGVsbCB0aGUgcmluZyBidWZmZXIgaXQgbmVlZHMgYSBwYXJhbSB1cGRhdGUKKyAqIEByOgkJcG9pbnRlciB0byBhIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGNyZWF0ZWQgYnkgYW4KKyAqCQlpaW9fY3JlYXRlX3N3X3JiIGNhbGwKICAqKi8KIGludCBpaW9fbWFya191cGRhdGVfbmVlZGVkX3N3X3JiKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIpOwogCiAKIC8qKgotICogaWlvX2dldF9icGRfc3dfcmIoKSBnZXQgdGhlIGRhdHVtIHNpemUgaW4gYnl0ZXMKKyAqIGlpb19nZXRfYnBkX3N3X3JiKCkgLSBnZXQgdGhlIGRhdHVtIHNpemUgaW4gYnl0ZXMKKyAqIEByOgkJcG9pbnRlciB0byBhIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGNyZWF0ZWQgYnkgYW4KKyAqCQlpaW9fY3JlYXRlX3N3X3JiIGNhbGwKICAqKi8KIGludCBpaW9fZ2V0X2JwZF9zd19yYihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyKTsKIAogLyoqCi0gKiBpaW9fc2V0X2JwZF9zd19yYigpIHNldCB0aGUgZGF0dW0gc2l6ZSBpbiBieXRlcworICogaWlvX3NldF9icGRfc3dfcmIoKSAtIHNldCB0aGUgZGF0dW0gc2l6ZSBpbiBieXRlcworICogQHI6CQlwb2ludGVyIHRvIGEgc29mdHdhcmUgcmluZyBidWZmZXIgY3JlYXRlZCBieSBhbgorICoJCWlpb19jcmVhdGVfc3dfcmIgY2FsbAorICogQGJwZDoJYnl0ZXMgcGVyIGRhdHVtIHZhbHVlCiAgKiovCiBpbnQgaWlvX3NldF9icGRfc3dfcmIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqciwgc2l6ZV90IGJwZCk7CiAKIC8qKgotICogaWlvX2dldF9sZW5ndGhfc3dfcmIoKSBnZXQgaG93IG1hbnkgZGF0dW1zIHRoZSByYiBtYXkgY29udGFpbgorICogaWlvX2dldF9sZW5ndGhfc3dfcmIoKSAtIGdldCBob3cgbWFueSBkYXR1bXMgdGhlIHJiIG1heSBjb250YWluCisgKiBAcjoJCXBvaW50ZXIgdG8gYSBzb2Z0d2FyZSByaW5nIGJ1ZmZlciBjcmVhdGVkIGJ5IGFuCisgKgkJaWlvX2NyZWF0ZV9zd19yYiBjYWxsCiAgKiovCiBpbnQgaWlvX2dldF9sZW5ndGhfc3dfcmIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcik7CiAKIC8qKgotICogaWlvX3NldF9sZW5ndGhfc3dfcmIoKSBzZXQgaG93IG1hbnkgZGF0dW1zIHRoZSByYiBtYXkgY29udGFpbgorICogaWlvX3NldF9sZW5ndGhfc3dfcmIoKSAtIHNldCBob3cgbWFueSBkYXR1bXMgdGhlIHJiIG1heSBjb250YWluCisgKiBAcjoJCXBvaW50ZXIgdG8gYSBzb2Z0d2FyZSByaW5nIGJ1ZmZlciBjcmVhdGVkIGJ5IGFuCisgKgkJaWlvX2NyZWF0ZV9zd19yYiBjYWxsCisgKiBAbGVuZ3RoOgltYXggbnVtYmVyIG9mIGRhdGEgaXRlbXMgZm9yIHRoZSByaW5nIGJ1ZmZlcgogICoqLwogaW50IGlpb19zZXRfbGVuZ3RoX3N3X3JiKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIsIGludCBsZW5ndGgpOwogCiAvKioKLSAqIGlpb19yaW5nX3N3X3JlZ2lzdGVyX2Z1bmNzKCkgaGVscGVyIGZ1bmN0aW9uIHRvIHNldCB1cCByYiBhY2Nlc3MKKyAqIGlpb19yaW5nX3N3X3JlZ2lzdGVyX2Z1bmNzKCkgLSBoZWxwZXIgZnVuY3Rpb24gdG8gc2V0IHVwIHJiIGFjY2VzcworICogQHJhOgkJcG9pbnRlciB0byBAaWlvX3JpbmdfYWNjZXNzX2Z1bmNzCiAgKiovCiBzdGF0aWMgaW5saW5lIHZvaWQgaWlvX3Jpbmdfc3dfcmVnaXN0ZXJfZnVuY3Moc3RydWN0IGlpb19yaW5nX2FjY2Vzc19mdW5jcyAqcmEpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3N5c2ZzLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3N5c2ZzLmgKaW5kZXggYmZlNDA1NS4uZTUwMWUxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9zeXNmcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vc3lzZnMuaApAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgImlpby5oIgogCiAvKioKLSAqIHN0cnVjdCBpaW9fZXZlbnRfYXR0cmlidXRlIC0gZXZlbnQgY29udHJvbCBhdHRyaWJ1dGUKKyAqIHN0cnVjdCBpaW9fZXZlbnRfYXR0ciAtIGV2ZW50IGNvbnRyb2wgYXR0cmlidXRlCiAgKiBAZGV2X2F0dHI6CXVuZGVybHlpbmcgZGV2aWNlIGF0dHJpYnV0ZQogICogQG1hc2s6CW1hc2sgZm9yIHRoZSBldmVudCB3aGVuIGRldGVjdGluZwogICogQGxpc3RlbDoJbGlzdCBoZWFkZXIgdG8gYWxsb3cgYWRkaXRpb24gdG8gbGlzdCBvZiBldmVudCBoYW5kbGVycwpAQCAtNTQsNiArNTQsNyBAQAogICogc3RydWN0IGlpb19kZXZfYXR0ciAtIGlpbyBzcGVjaWZpYyBkZXZpY2UgYXR0cmlidXRlCiAgKiBAZGV2X2F0dHI6CXVuZGVybHlpbmcgZGV2aWNlIGF0dHJpYnV0ZQogICogQGFkZHJlc3M6CWFzc29jaWF0ZWQgcmVnaXN0ZXIgYWRkcmVzcworICogQHZhbDI6CXNlY29uZGFyeSBhdHRyaWJ1dGUgdmFsdWUKICAqLwogc3RydWN0IGlpb19kZXZfYXR0ciB7CiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHI7CkBAIC03MSw2ICs3Miw4IEBACiAvKioKICAqIHN0cnVjdCBpaW9fY29uc3RfYXR0ciAtIGNvbnN0YW50IGRldmljZSBzcGVjaWZpYyBhdHRyaWJ1dGUKICAqICAgICAgICAgICAgICAgICAgICAgICAgIG9mdGVuIHVzZWQgZm9yIHRoaW5ncyBsaWtlIGF2YWlsYWJsZSBtb2RlcworICogQHN0cmluZzoJYXR0cmlidXRlIHN0cmluZworICogQGRldl9hdHRyOgl1bmRlcmx5aW5nIGRldmljZSBhdHRyaWJ1dGUKICAqLwogc3RydWN0IGlpb19jb25zdF9hdHRyIHsKIAljb25zdCBjaGFyICpzdHJpbmc7CkBAIC04MCw3ICs4Myw3IEBACiAjZGVmaW5lIHRvX2lpb19jb25zdF9hdHRyKF9kZXZfYXR0cikgXAogCWNvbnRhaW5lcl9vZihfZGV2X2F0dHIsIHN0cnVjdCBpaW9fY29uc3RfYXR0ciwgZGV2X2F0dHIpCiAKLS8qIFNvbWUgYXR0cmlidXRlcyB3aWxsIGJlIGhhcmQgY29kZWQgKGRldmljZSBkZXBlbmRhbnQpIGFuZCBub3QgcmVxdWlyZSBhbgorLyogU29tZSBhdHRyaWJ1dGVzIHdpbGwgYmUgaGFyZCBjb2RlZCAoZGV2aWNlIGRlcGVuZGVudCkgYW5kIG5vdCByZXF1aXJlIGFuCiAgICBhZGRyZXNzLCBpbiB0aGVzZSBjYXNlcyBwYXNzIGEgbmVnYXRpdmUgKi8KICNkZWZpbmUgSUlPX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCVwKIAl7IC5kZXZfYXR0ciA9IF9fQVRUUihfbmFtZSwgX21vZGUsIF9zaG93LCBfc3RvcmUpLAlcCkBAIC0xMDgsMTAyICsxMTEsMTMwIEBACiAvKiBHZW5lcmljIGF0dHJpYnV0ZXMgb2Ygb25ldHlwZSBvciBhbm90aGVyICovCiAKIC8qKgotICogSUlPX0RFVl9BVFRSX1JFRzogcmV2aXNpb24gbnVtYmVyIGZvciB0aGUgZGV2aWNlCisgKiBJSU9fREVWX0FUVFJfUkVWIC0gcmV2aXNpb24gbnVtYmVyIGZvciB0aGUgZGV2aWNlCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKICAqCiAgKiBWZXJ5IG11Y2ggZGV2aWNlIGRlcGVuZGVudC4KICAqKi8KICNkZWZpbmUgSUlPX0RFVl9BVFRSX1JFVihfc2hvdykJCQlcCiAJSUlPX0RFVklDRV9BVFRSKHJldmlzaW9uLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKwogLyoqCi0gKiBJSU9fREVWX0FUVFJfTkFNRTogY2hpcCB0eXBlIGRlcGVuZGFudCBpZGVudGlmaWVyCisgKiBJSU9fREVWX0FUVFJfTkFNRSAtIGNoaXAgdHlwZSBkZXBlbmRlbnQgaWRlbnRpZmllcgorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCiAgKiovCiAjZGVmaW5lIElJT19ERVZfQVRUUl9OQU1FKF9zaG93KQkJCQlcCiAJSUlPX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIF9zaG93LCBOVUxMLCAwKQogCiAvKioKLSAqIElJT19ERVZfQVRUUl9TQU1QX0ZSRVE6IHNldHMgYW55IGludGVybmFsIGNsb2NrIGZyZXF1ZW5jeQorICogSUlPX0RFVl9BVFRSX1NBTVBfRlJFUSAtIHNldHMgYW55IGludGVybmFsIGNsb2NrIGZyZXF1ZW5jeQorICogQF9tb2RlOiBzeXNmcyBmaWxlIG1vZGUvcGVybWlzc2lvbnMKKyAqIEBfc2hvdzogb3V0cHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQorICogQF9zdG9yZTogaW5wdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCiAgKiovCiAjZGVmaW5lIElJT19ERVZfQVRUUl9TQU1QX0ZSRVEoX21vZGUsIF9zaG93LCBfc3RvcmUpCQkJXAogCUlJT19ERVZJQ0VfQVRUUihzYW1wbGluZ19mcmVxdWVuY3ksIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQogCiAvKioKLSAqIElJT19ERVZfQVRUUl9BVkFJTF9TQU1QX0ZSRVE6IGxpc3QgYXZhaWxhYmxlIHNhbXBsaW5nIGZyZXF1ZW5jaWVzLgorICogSUlPX0RFVl9BVFRSX0FWQUlMX1NBTVBfRlJFUSAtIGxpc3QgYXZhaWxhYmxlIHNhbXBsaW5nIGZyZXF1ZW5jaWVzCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKICAqCi0gKiBNYXkgYmUgbW9kZSBkZXBlbmRhbnQgb24gc29tZSBkZXZpY2VzCisgKiBNYXkgYmUgbW9kZSBkZXBlbmRlbnQgb24gc29tZSBkZXZpY2VzCiAgKiovCiAjZGVmaW5lIElJT19ERVZfQVRUUl9BVkFJTF9TQU1QX0ZSRVEoX3Nob3cpCQkJCVwKIAlJSU9fREVWSUNFX0FUVFIoYXZhaWxhYmxlX3NhbXBsaW5nX2ZyZXF1ZW5jeSwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCiAKIC8qKgotICogSUlPX0RFVl9BVFRSX0NPTlNUX0FWQUlMX1NBTVBfRlJFUTogbGlzdCBhdmFpbGFibGUgc2FtcGxpbmcgZnJlcXVlbmNpZXMuCisgKiBJSU9fQ09OU1RfQVRUUl9BVkFJTF9TQU1QX0ZSRVEgLSBsaXN0IGF2YWlsYWJsZSBzYW1wbGluZyBmcmVxdWVuY2llcworICogQF9zdHJpbmc6IGZyZXF1ZW5jeSBzdHJpbmcgZm9yIHRoZSBhdHRyaWJ1dGUKICAqCiAgKiBDb25zdGFudCB2ZXJzaW9uCiAgKiovCiAjZGVmaW5lIElJT19DT05TVF9BVFRSX0FWQUlMX1NBTVBfRlJFUShfc3RyaW5nKQlcCiAJSUlPX0NPTlNUX0FUVFIoYXZhaWxhYmxlX3NhbXBsaW5nX2ZyZXF1ZW5jeSwgX3N0cmluZykKKwogLyoqCi0gKiBJSU9fREVWX0FUVFJfU0NBTl9NT0RFOiBzZWxlY3QgYSBzY2FuIG1vZGUKKyAqIElJT19ERVZfQVRUUl9TQ0FOX01PREUgLSBzZWxlY3QgYSBzY2FuIG1vZGUKKyAqIEBfbW9kZTogc3lzZnMgZmlsZSBtb2RlL3Blcm1pc3Npb25zCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfc3RvcmU6IGlucHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQogICoKICAqIFRoaXMgaXMgdXNlZCB3aGVuIG9ubHkgY2VydGFpbiBjb21iaW5hdGlvbnMgb2YgaW5wdXRzIG1heSBiZSByZWFkIGluIG9uZQogICogc2Nhbi4KICAqKi8KICNkZWZpbmUgSUlPX0RFVl9BVFRSX1NDQU5fTU9ERShfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKIAlJSU9fREVWSUNFX0FUVFIoc2Nhbl9tb2RlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKwogLyoqCi0gKiBJSU9fREVWX0FUVFJfQVZBSUxfU0NBTl9NT0RFUzogbGlzdCBhdmFpbGFibGUgc2NhbiBtb2RlcworICogSUlPX0RFVl9BVFRSX0FWQUlMX1NDQU5fTU9ERVMgLSBsaXN0IGF2YWlsYWJsZSBzY2FuIG1vZGVzCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKICAqKi8KICNkZWZpbmUgSUlPX0RFVl9BVFRSX0FWQUlMX1NDQU5fTU9ERVMoX3Nob3cpCQkJCVwKIAlJSU9fREVWSUNFX0FUVFIoYXZhaWxhYmxlX3NjYW5fbW9kZXMsIFNfSVJVR08sIF9zaG93LCBOVUxMLCAwKQogCiAvKioKLSAqIElJT19ERVZfQVRUUl9TQ0FOOiByZXN1bHQgb2Ygc2NhbiBvZiBtdWx0aXBsZSBjaGFubmVscworICogSUlPX0RFVl9BVFRSX1NDQU4gLSByZXN1bHQgb2Ygc2NhbiBvZiBtdWx0aXBsZSBjaGFubmVscworICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCiAgKiovCiAjZGVmaW5lIElJT19ERVZfQVRUUl9TQ0FOKF9zaG93KQkJXAogCUlJT19ERVZJQ0VfQVRUUihzY2FuLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCk7CiAKIC8qKgotICogSUlPX0RFVl9BVFRSX0lOUFVUOiBkaXJlY3QgcmVhZCBvZiBhIHNpbmdsZSBpbnB1dCBjaGFubmVsCisgKiBJSU9fREVWX0FUVFJfSU5QVVQgLSBkaXJlY3QgcmVhZCBvZiBhIHNpbmdsZSBpbnB1dCBjaGFubmVsCisgKiBAX251bWJlcjogaW5wdXQgY2hhbm5lbCBudW1iZXIKKyAqIEBfc2hvdzogb3V0cHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQogICoqLwogI2RlZmluZSBJSU9fREVWX0FUVFJfSU5QVVQoX251bWJlciwgX3Nob3cpCQkJCVwKIAlJSU9fREVWSUNFX0FUVFIoaW4jI19udW1iZXIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfbnVtYmVyKQogCi0KIC8qKgotICogSUlPX0RFVl9BVFRSX1NXX1JJTkdfRU5BQkxFOiBlbmFibGUgc29mdHdhcmUgcmluZyBidWZmZXIKKyAqIElJT19ERVZfQVRUUl9TV19SSU5HX0VOQUJMRSAtIGVuYWJsZSBzb2Z0d2FyZSByaW5nIGJ1ZmZlcgorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKICAqCi0gKiBTdWNjZXNzIG1heSBiZSBkZXBlbmRhbnQgb24gYXR0YWNobWVudCBvZiB0cmlnZ2VyIHByZXZpb3VzbHkKKyAqIFN1Y2Nlc3MgbWF5IGJlIGRlcGVuZGVudCBvbiBhdHRhY2htZW50IG9mIHRyaWdnZXIgcHJldmlvdXNseS4KICAqKi8KICNkZWZpbmUgSUlPX0RFVl9BVFRSX1NXX1JJTkdfRU5BQkxFKF9zaG93LCBfc3RvcmUpCQkJXAogCUlJT19ERVZJQ0VfQVRUUihzd19yaW5nX2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsIF9zaG93LCBfc3RvcmUsIDApCiAKIC8qKgotICogSUlPX0RFVl9BVFRSX0hXX1JJTkdfRU5BQkxFOiBlbmFibGUgaGFyZHdhcmUgcmluZyBidWZmZXIKKyAqIElJT19ERVZfQVRUUl9IV19SSU5HX0VOQUJMRSAtIGVuYWJsZSBoYXJkd2FyZSByaW5nIGJ1ZmZlcgorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKICAqCi0gKiBUaGlzIGlzIGEgZGlmZmVyZW50IGF0dHJpYnV0ZSBmcm9tIHRoZSBzb2Z0d2FyZSBvbmUgYXMgb25lIGNhbiBpbnZpc2lvbgorICogVGhpcyBpcyBhIGRpZmZlcmVudCBhdHRyaWJ1dGUgZnJvbSB0aGUgc29mdHdhcmUgb25lIGFzIG9uZSBjYW4gZW52aXNpb24KICAqIHNjaGVtZXMgd2hlcmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIG1heSBiZSB1c2VkLgogICoqLwogI2RlZmluZSBJSU9fREVWX0FUVFJfSFdfUklOR19FTkFCTEUoX3Nob3csIF9zdG9yZSkJCQlcCiAJSUlPX0RFVklDRV9BVFRSKGh3X3JpbmdfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwgX3Nob3csIF9zdG9yZSwgMCkKIAogLyoqCi0gKiBJSU9fREVWX0FUVFJfQlBTRTogc2V0IG51bWJlciBvZiBiaXRzIHBlciBzY2FuIGVsZW1lbnQKKyAqIElJT19ERVZfQVRUUl9CUFNFIC0gc2V0IG51bWJlciBvZiBiaXRzIHBlciBzY2FuIGVsZW1lbnQKKyAqIEBfbW9kZTogc3lzZnMgZmlsZSBtb2RlL3Blcm1pc3Npb25zCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfc3RvcmU6IGlucHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQogICoqLwogI2RlZmluZSBJSU9fREVWX0FUVFJfQlBTRShfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKIAlJSU9fREVWSUNFX0FUVFIoYnBzZSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCiAKIC8qKgotICogSUlPX0RFVl9BVFRSX0JQU0VfQVZBSUxBQkxFOiBubyBvZiBiaXRzIHBlciBzY2FuIGVsZW1lbnQgc3VwcG9ydGVkCisgKiBJSU9fREVWX0FUVFJfQlBTRV9BVkFJTEFCTEUgLSBudW1iZXIgb2YgYml0cyBwZXIgc2NhbiBlbGVtZW50IHN1cHBvcnRlZAorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCiAgKiovCiAjZGVmaW5lIElJT19ERVZfQVRUUl9CUFNFX0FWQUlMQUJMRShfc2hvdykJCQkJXAogCUlJT19ERVZJQ0VfQVRUUihicHNlX2F2YWlsYWJsZSwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCiAKIC8qKgotICogSUlPX0RFVl9BVFRSX1RFTVA6IG1hbnkgc2Vuc29ycyBoYXZlIGF1eGlsaWFyeSB0ZW1wZXJhdHVyZSBzZW5zb3JzCisgKiBJSU9fREVWX0FUVFJfVEVNUCAtIG1hbnkgc2Vuc29ycyBoYXZlIGF1eGlsaWFyeSB0ZW1wZXJhdHVyZSBzZW5zb3JzCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKICAqKi8KICNkZWZpbmUgSUlPX0RFVl9BVFRSX1RFTVAoX3Nob3cpCQkJXAogCUlJT19ERVZJQ0VfQVRUUih0ZW1wLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKwogLyoqCi0gKiBJSU9fRVZFTlRfU0g6IGdlbmVyaWMgc2hhcmVkIGV2ZW50IGhhbmRsZXIKKyAqIElJT19FVkVOVF9TSCAtIGdlbmVyaWMgc2hhcmVkIGV2ZW50IGhhbmRsZXIKKyAqIEBfbmFtZTogZXZlbnQgbmFtZQorICogQF9oYW5kbGVyOiBoYW5kbGVyIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAogICoKICAqIFRoaXMgaXMgdXNlZCBpbiBjYXNlcyB3aGVyZSBtb3JlIHRoYW4gb25lIGV2ZW50IG1heSByZXN1bHQgZnJvbSBhIHNpbmdsZQogICogaGFuZGxlci4gIE9mdGVuIHRoZSBjYXNlIHRoYXQgc29tZSBhbGFybSByZWdpc3RlciBtdXN0IGJlIHJlYWQgYW5kIG11bHRpcGxlCkBAIC0yMjEsOCArMjUyLDE0IEBACiAJCQkucHJldiA9ICZpaW9fZXZlbnRfIyNfbmFtZS5saXN0LAkJXAogCQl9LAkJCQkJCQlcCiAJfTsKKwogLyoqCi0gKiBJSU9fRVZFTlRfQVRUUl9TSDogZ2VuZXJpYyBzaGFyZWQgZXZlbnQgYXR0cmlidXRlCisgKiBJSU9fRVZFTlRfQVRUUl9TSCAtIGdlbmVyaWMgc2hhcmVkIGV2ZW50IGF0dHJpYnV0ZQorICogQF9uYW1lOiBldmVudCBuYW1lCisgKiBAX2V2X2xpc3Q6IGV2ZW50IGhhbmRsZXIgbGlzdAorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfbWFzazogbWFzayB1c2VkIHdoZW4gZGV0ZWN0aW5nIHRoZSBldmVudAogICoKICAqIEFuIGF0dHJpYnV0ZSB3aXRoIGFuIGFzc29jaWF0ZWQgSUlPX0VWRU5UX1NICiAgKiovCkBAIC0yMzUsNyArMjcyLDEyIEBACiAJICAgIC5saXN0ZWwgPSAmX2V2X2xpc3QgfTsKIAogLyoqCi0gKiBJSU9fRVZFTlRfQVRUUjogbm9uIHNoYXJlZCBldmVudCBhdHRyaWJ1dGUKKyAqIElJT19FVkVOVF9BVFRSIC0gbm9uLXNoYXJlZCBldmVudCBhdHRyaWJ1dGUKKyAqIEBfbmFtZTogZXZlbnQgbmFtZQorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfbWFzazogbWFzayB1c2VkIHdoZW4gZGV0ZWN0aW5nIHRoZSBldmVudAorICogQF9oYW5kbGVyOiBoYW5kbGVyIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAogICoqLwogI2RlZmluZSBJSU9fRVZFTlRfQVRUUihfbmFtZSwgX3Nob3csIF9zdG9yZSwgX21hc2ssIF9oYW5kbGVyKQkJXAogCXN0YXRpYyBzdHJ1Y3QgaWlvX2V2ZW50X2hhbmRsZXJfbGlzdAkJCQlcCkBAIC0yNTEsMTAgKzI5MywxNCBAQAogCSAgICAubGlzdGVsID0gJmlpb19ldmVudF8jI19uYW1lIH07CQkJCVwKIAogLyoqCi0gKiBJSU9fRVZFTlRfQVRUUl9EQVRBX1JEWTogZXZlbnQgZHJpdmVuIGJ5IGRhdGEgcmVhZHkgc2lnbmFsCisgKiBJSU9fRVZFTlRfQVRUUl9EQVRBX1JEWSAtIGV2ZW50IGRyaXZlbiBieSBkYXRhIHJlYWR5IHNpZ25hbAorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfbWFzazogbWFzayB1c2VkIHdoZW4gZGV0ZWN0aW5nIHRoZSBldmVudAorICogQF9oYW5kbGVyOiBoYW5kbGVyIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAogICoKICAqIE5vdCB0eXBpY2FsbHkgaW1wbGVtZW50ZWQgaW4gZGV2aWNlcyB3aGVyZSBmdWxsIHRyaWdnZXJpbmcgc3VwcG9ydAotICogaGFzIGJlZW4gaW1wbGVtZW50ZWQKKyAqIGhhcyBiZWVuIGltcGxlbWVudGVkLgogICoqLwogI2RlZmluZSBJSU9fRVZFTlRfQVRUUl9EQVRBX1JEWShfc2hvdywgX3N0b3JlLCBfbWFzaywgX2hhbmRsZXIpIFwKIAlJSU9fRVZFTlRfQVRUUihkYXRhX3JkeSwgX3Nob3csIF9zdG9yZSwgX21hc2ssIF9oYW5kbGVyKQpAQCAtMjY5LDE5ICszMTUsMzEgQEAKICNkZWZpbmUgSUlPX0VWRU5UX0NPREVfREVWSUNFX1NQRUNJRklDCTEwMDAKIAogLyoqCi0gKiBJSU9fRVZFTlRfQVRUUl9SSU5HXzUwX0ZVTEw6IHJpbmcgYnVmZmVyIGV2ZW50IHRvIGluZGljYXRlIDUwJSBmdWxsCisgKiBJSU9fRVZFTlRfQVRUUl9SSU5HXzUwX0ZVTEwgLSByaW5nIGJ1ZmZlciBldmVudCB0byBpbmRpY2F0ZSA1MCUgZnVsbAorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfbWFzazogbWFzayB1c2VkIHdoZW4gZGV0ZWN0aW5nIHRoZSBldmVudAorICogQF9oYW5kbGVyOiBoYW5kbGVyIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAogICoqLwogI2RlZmluZSBJSU9fRVZFTlRfQVRUUl9SSU5HXzUwX0ZVTEwoX3Nob3csIF9zdG9yZSwgX21hc2ssIF9oYW5kbGVyKQlcCiAJSUlPX0VWRU5UX0FUVFIocmluZ181MF9mdWxsLCBfc2hvdywgX3N0b3JlLCBfbWFzaywgX2hhbmRsZXIpCiAKIC8qKgotICogSUlPX0VWRU5UX0FUVFJfUklOR181MF9GVUxMX1NIOiBzaGFyZWQgcmluZyBldmVudCB0byBpbmRpY2F0ZSA1MCUgZnVsbAorICogSUlPX0VWRU5UX0FUVFJfUklOR181MF9GVUxMX1NIIC0gc2hhcmVkIHJpbmcgZXZlbnQgdG8gaW5kaWNhdGUgNTAlIGZ1bGwKKyAqIEBfZXZsaXN0OiBldmVudCBoYW5kbGVyIGxpc3QKKyAqIEBfc2hvdzogb3V0cHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQorICogQF9zdG9yZTogaW5wdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX21hc2s6IG1hc2sgdXNlZCB3aGVuIGRldGVjdGluZyB0aGUgZXZlbnQKICAqKi8KICNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfUklOR181MF9GVUxMX1NIKF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQlcCiAJSUlPX0VWRU5UX0FUVFJfU0gocmluZ181MF9mdWxsLCBfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykKIAogLyoqCi0gKiBJSU9fRVZFTlRfQVRUUl9SSU5HXzc1X0ZVTExfU0g6IHNoYXJlZCByaW5nIGV2ZW50IHRvIGluZGljYXRlIDc1JSBmdWxsCisgKiBJSU9fRVZFTlRfQVRUUl9SSU5HXzc1X0ZVTExfU0ggLSBzaGFyZWQgcmluZyBldmVudCB0byBpbmRpY2F0ZSA3NSUgZnVsbAorICogQF9ldmxpc3Q6IGV2ZW50IGhhbmRsZXIgbGlzdAorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfbWFzazogbWFzayB1c2VkIHdoZW4gZGV0ZWN0aW5nIHRoZSBldmVudAogICoqLwogI2RlZmluZSBJSU9fRVZFTlRfQVRUUl9SSU5HXzc1X0ZVTExfU0goX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCVwKIAlJSU9fRVZFTlRfQVRUUl9TSChyaW5nXzc1X2Z1bGwsIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIuaAppbmRleCA4Mjg0MDk4Li43ODRlN2I2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIuaApAQCAtMTksMTYgKzE5LDE4IEBACiAgKiBAaWQ6CQkJW0lOVEVSTl0gdW5pcXVlIGlkIG51bWJlcgogICogQG5hbWU6CQlbRFJJVkVSXSB1bmlxdWUgbmFtZQogICogQGRldjoJCVtEUklWRVJdIGFzc29jaWF0ZWQgZGV2aWNlIChpZiByZWxldmFudCkKLSAqIEBzeXNmc19kZXY6CQlbSU5URVJOXSBzeXNmcyByZWxldmFudCBkZXZpY2UKICAqIEBwcml2YXRlX2RhdGE6CVtEUklWRVJdIGRldmljZSBzcGVjaWZpYyBkYXRhCiAgKiBAbGlzdDoJCVtJTlRFUk5dIHVzZWQgaW4gbWFpbnRlbmFuY2Ugb2YgZ2xvYmFsIHRyaWdnZXIgbGlzdAogICogQGFsbG9jX2xpc3Q6CQlbRFJJVkVSXSB1c2VkIGZvciBkcml2ZXIgc3BlY2lmaWMgdHJpZ2dlciBsaXN0Ci0gKiBAcG9sbF9mdW5jX2xpc3RfbG9jazpbSU5URVJOXSBwcm90ZWN0aW9uIG9mIHRoZSBwb2xsaW5nIGZ1bmN0aW9uIGxpc3QKKyAqIEBwb2xsZnVuY19saXN0X2xvY2s6CVtJTlRFUk5dIHByb3RlY3Rpb24gb2YgdGhlIHBvbGxpbmcgZnVuY3Rpb24gbGlzdAogICogQHBvbGxmdW5jX2xpc3Q6CVtJTlRFUk5dIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIHJ1biBvbiB0cmlnZ2VyLgogICogQGNvbnRyb2xfYXR0cnM6CVtEUklWRVJdIHN5c2ZzIGF0dHJpYnV0ZXMgcmVsZXZhbnQgdG8gdHJpZ2dlciB0eXBlCi0gKiBAc2V0X3RyaWdnZXJfc3RhdGU6CVtEUklWRVJdIHN3aXRjaCBvbi9vZmYgdGhlIHRyaWdnZXIgb24gZGVtYW5kCiAgKiBAdGltZXN0YW1wOgkJW0lOVEVSTl0gdGltZXN0YW1wIHVzZXNkIGJ5IHNvbWUgdHJpZ3MgKGUuZy4gZGF0YXJkeSkKICAqIEBvd25lcjoJCVtEUklWRVJdIHVzZWQgdG8gbW9uaXRvciB1c2FnZSBjb3VudCBvZiB0aGUgdHJpZ2dlci4KKyAqIEB1c2VfY291bnQ6CQl1c2UgY291bnQgZm9yIHRoZSB0cmlnZ2VyCisgKiBAc2V0X3RyaWdnZXJfc3RhdGU6CVtEUklWRVJdIHN3aXRjaCBvbi9vZmYgdGhlIHRyaWdnZXIgb24gZGVtYW5kCisgKiBAdHJ5X3JlZW5hYmxlOglmdW5jdGlvbiB0byByZWVuYWJsZSB0aGUgdHJpZ2dlciB3aGVuIHRoZQorICoJCQl1c2UgY291bnQgaXMgemVybyAobWF5IGJlIE5VTEwpCiAgKiovCiBzdHJ1Y3QgaWlvX3RyaWdnZXIgewogCWludAkJCQlpZDsKQEAgLTY4LDYgKzcwLDkgQEAKIAogLyoqCiAgKiBpaW9fdHJpZ2dlcl9yZWFkX25hbWUoKSAtIHN5c2ZzIGFjY2VzcyBmdW5jdGlvbiB0byBnZXQgdGhlIHRyaWdnZXIgbmFtZQorICogQGRldjogdGhlIHN5c3RlbSBkZXZpY2UKKyAqIEBhdHRyOiBkZXZpY2UgYXR0cmlidXRlcyBmb3IgdGhlIGRldmljZQorICogQGJ1Zjogb3V0cHV0IGJ1ZmZlciB0byBzdG9yZSB0aGUgdHJpZ2dlciBuYW1lCiAgKiovCiBzc2l6ZV90IGlpb190cmlnZ2VyX3JlYWRfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKQEAgLTc5LDYgKzg0LDggQEAKIAogLyoqCiAgKiBpaW9fdHJpZ2dlcl9maW5kX2J5X25hbWUoKSAtIHNlYXJjaCBnbG9iYWwgdHJpZ2dlciBsaXN0CisgKiBAbmFtZTogdHJpZ2dlciBuYW1lIHRvIHNlYXJjaCBmb3IKKyAqIEBsZW46IHRyaWdnZXIgbmFtZSBzdHJpbmcgbGVuZ3RoIHRvIGNvbXBhcmUKICAqKi8KIHN0cnVjdCBpaW9fdHJpZ2dlciAqaWlvX3RyaWdnZXJfZmluZF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pOwogCkBAIC05MCwzMiArOTcsMzUgQEAKIAogLyoqCiAgKiBpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKCkgLSB1bnJlZ2lzdGVyIGEgdHJpZ2dlciBmcm9tIHRoZSBjb3JlCisgKiBAdHJpZ19pbmZvOgl0cmlnZ2VyIHRvIGJlIHVucmVnaXN0ZXJlZAogICoqLwogdm9pZCBpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZ19pbmZvKTsKIAogLyoqCiAgKiBpaW9fdHJpZ2dlcl9hdHRhY2hfcG9sbF9mdW5jKCkgLSBhZGQgYSBmdW5jdGlvbiBwYWlyIHRvIGJlIHJ1biBvbiB0cmlnZ2VyCiAgKiBAdHJpZzoJdHJpZ2dlciB0byB3aGljaCB0aGUgZnVuY3Rpb24gcGFpciBhcmUgYmVpbmcgYWRkZWQKLSAqIEBwZjoJcG9sbCBmdW5jdGlvbiBwYWlyCisgKiBAcGY6CQlwb2xsIGZ1bmN0aW9uIHBhaXIKICAqKi8KIGludCBpaW9fdHJpZ2dlcl9hdHRhY2hfcG9sbF9mdW5jKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywKIAkJCQkgc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmKTsKIAogLyoqCiAgKiBpaW9fdHJpZ2dlcl9kZXR0YWNoX3BvbGxfZnVuYygpIC0JcmVtb3ZlIGZ1bmN0aW9uIHBhaXIgZnJvbSB0aG9zZSB0byBiZQotICoJCQkJCXJ1biBvbiB0cmlnZ2VyLgotICogQHRyaWc6CXRyaWdnZXIgZnJvbSB3aGljaCB0aGUgZnVuY3Rpb24gaXMgYmVpbmcgcmVtb3ZlZC4KKyAqCQkJCQlydW4gb24gdHJpZ2dlcgorICogQHRyaWc6CXRyaWdnZXIgZnJvbSB3aGljaCB0aGUgZnVuY3Rpb24gaXMgYmVpbmcgcmVtb3ZlZAogICogQHBmOgkJcG9sbCBmdW5jdGlvbiBwYWlyCiAgKiovCiBpbnQgaWlvX3RyaWdnZXJfZGV0dGFjaF9wb2xsX2Z1bmMoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnLAogCQkJCSAgc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmKTsKIAogLyoqCi0gKiBpaW9fdHJpZ2dlcl9wb2xsKCkgLSBjYWxsZWQgb24gYSB0cmlnZ2VyIG9jY3VyaW5nCisgKiBpaW9fdHJpZ2dlcl9wb2xsKCkgLSBjYWxsZWQgb24gYSB0cmlnZ2VyIG9jY3VycmluZworICogQHRyaWc6IHRyaWdnZXIgd2hpY2ggb2NjdXJyZWQKKyAqCiAgKiBUeXBpY2FsbHkgY2FsbGVkIGluIHJlbGV2YW50IGhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyLgogICoqLwotdm9pZCBpaW9fdHJpZ2dlcl9wb2xsKHN0cnVjdCBpaW9fdHJpZ2dlciAqKTsKLXZvaWQgaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoc3RydWN0IGlpb190cmlnZ2VyICopOwordm9pZCBpaW9fdHJpZ2dlcl9wb2xsKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZyk7Cit2b2lkIGlpb190cmlnZ2VyX25vdGlmeV9kb25lKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZyk7CiAKIC8qKgogICogc3RydWN0IGlpb19wb2xsX2Z1bmMgLSBwb2xsIGZ1bmN0aW9uIHBhaXIKQEAgLTEyNywxMSArMTM3LDEwIEBACiAgKgkJCQljb250cm9sIG9uIHNlbnNvciBzdXBwb3J0aW5nIGl0LgogICogQHBvbGxfZnVuY19tYWluOgkJZnVuY3Rpb24gaW4gaGVyZSBpcyBydW4gYWZ0ZXIgYWxsIGltbWVkaWF0ZXMuCiAgKgkJCQlSZWFkaW5nIGZyb20gc2Vuc29yIGV0YyB0eXBpY2FsbHkgaW52b2x2ZXMKLSAqCQkJCXNjaGVkdWxpbmcKLSAqCQkJCWZyb20gaGVyZS4KKyAqCQkJCXNjaGVkdWxpbmcgZnJvbSBoZXJlLgogICoKLSAqIFRoZSB0d28gc3RhZ2UgYXBwcm9hY2ggdXNlZCBoZXJlIG9ubHkgaW1wb3J0YW50IHdoZW4gbXVsdGlwbGUgc2Vuc29ycyBhcmUKLSAqIGJlaW5nIHRyaWdnZXJlZCBieSBhIHNpbmdsZSB0cmlnZ2VyLiBUaGlzIHJlYWxseSBjb21lcyBpbnRvIGl0J3Mgb3duIHdpdGgKKyAqIFRoZSB0d28gc3RhZ2UgYXBwcm9hY2ggdXNlZCBoZXJlIGlzIG9ubHkgaW1wb3J0YW50IHdoZW4gbXVsdGlwbGUgc2Vuc29ycyBhcmUKKyAqIGJlaW5nIHRyaWdnZXJlZCBieSBhIHNpbmdsZSB0cmlnZ2VyLiBUaGlzIHJlYWxseSBjb21lcyBpbnRvIGl0cyBvd24gd2l0aAogICogc2ltdWx0YW5lb3VzIHNhbXBsaW5nIGRldmljZXMgd2hlcmUgYSBzaW1wbGUgbGF0Y2ggY29tbWFuZCBjYW4gYmUgdXNlZCB0bwogICogbWFrZSB0aGUgZGV2aWNlIHN0b3JlIHRoZSB2YWx1ZXMgb24gYWxsIGlucHV0cy4KICAqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL0tjb25maWcKaW5kZXggZmRkOTMwMS4uZDg0MmE1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL0tjb25maWcKQEAgLTksMTMgKzksMTMgQEAKIAl0cmlzdGF0ZSAiUGVyaW9kaWMgUlRDIHRyaWdnZXJzIgogCWRlcGVuZHMgb24gUlRDX0NMQVNTCiAJaGVscAotCSAgICBQcm92aWRlcyBzdXBwb3J0IGZvciB1c2luZyBwZXJpb2RpYyBjYXBhYmxlIHJlYWwgdGltZQotCSAgICBjbG9ja3MgYXMgSUlPIHRyaWdnZXJzLgorCSAgUHJvdmlkZXMgc3VwcG9ydCBmb3IgdXNpbmcgcGVyaW9kaWMgY2FwYWJsZSByZWFsIHRpbWUKKwkgIGNsb2NrcyBhcyBJSU8gdHJpZ2dlcnMuCiAKIGNvbmZpZyBJSU9fR1BJT19UUklHR0VSCiAJdHJpc3RhdGUgIkdQSU8gdHJpZ2dlciIKIAlkZXBlbmRzIG9uIEdFTkVSSUNfR1BJTwogCWhlbHAKLQkgICAgUHJvdmlkZXMgc3VwcG9ydCBmb3IgdXNpbmcgR1BJTyBwaW5zIGFzIElJTyB0cmlnZ2Vycy4KKwkgIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHVzaW5nIEdQSU8gcGlucyBhcyBJSU8gdHJpZ2dlcnMuCiAKIGVuZGlmICMgSUlPX1RSSUdHRVIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlcl9jb25zdW1lci5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyX2NvbnN1bWVyLmgKaW5kZXggNGM3ZjUyNy4uYTAyZDcwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyX2NvbnN1bWVyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyX2NvbnN1bWVyLmgKQEAgLTEwLDEyICsxMCwxMyBAQAogCiAjaWZkZWYgQ09ORklHX0lJT19UUklHR0VSCiAvKioKLSAqIGlpb19kZXZpY2VfcmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcigpIC0gc2V0IHVwIGFuIGlpb19kZXYgdG8gdXNlIHRyaWdnZXJzLgorICogaWlvX2RldmljZV9yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKCkgLSBzZXQgdXAgYW4gaWlvX2RldiB0byB1c2UgdHJpZ2dlcnMKICAqIEBkZXZfaW5mbzogaWlvX2RldiBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZSB0aGF0IHdpbGwgY29uc3VtZSB0aGUgdHJpZ2dlcgogICoqLwogaW50IGlpb19kZXZpY2VfcmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcihzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8pOworCiAvKioKLSAqIGlpb19kZXZpY2VfdW5yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKCkgLSByZXZlcnNlIHRoZSByZWdpc3RyYXRpb24gcHJvY2Vzcy4KKyAqIGlpb19kZXZpY2VfdW5yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKCkgLSByZXZlcnNlIHRoZSByZWdpc3RyYXRpb24gcHJvY2VzcwogICogQGRldl9pbmZvOiBpaW9fZGV2IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlIHRoYXQgY29uc3VtZWQgdGhlIHRyaWdnZXIKICAqKi8KIGludCBpaW9fZGV2aWNlX3VucmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcihzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8pOwpAQCAtMjMsMTMgKzI0LDE0IEBACiAjZWxzZQogCiAvKioKLSAqIGlpb19kZXZpY2VfcmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcigpIC0gc2V0IHVwIGFuIGlpb19kZXYgdG8gdXNlIHRyaWdnZXJzLgorICogaWlvX2RldmljZV9yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKCkgLSBzZXQgdXAgYW4gaWlvX2RldiB0byB1c2UgdHJpZ2dlcnMKICAqIEBkZXZfaW5mbzogaWlvX2RldiBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZSB0aGF0IHdpbGwgY29uc3VtZSB0aGUgdHJpZ2dlcgogICoqLwogaW50IGlpb19kZXZpY2VfcmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcihzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8pCiB7CiAJcmV0dXJuIDA7CiB9OworCiAvKioKICAqIGlpb19kZXZpY2VfdW5yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKCkgLSByZXZlcnNlIHRoZSByZWdpc3RyYXRpb24gcHJvY2VzcwogICogQGRldl9pbmZvOiBpaW9fZGV2IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlIHRoYXQgY29uc3VtZWQgdGhlIHRyaWdnZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9jYXB0dXJlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvY2FwdHVyZS5jCmluZGV4IGVhMjA2MGIuLmZkNDg5MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9jYXB0dXJlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2NhcHR1cmUuYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgInBvZC5oIgogI2luY2x1ZGUgImNhcHR1cmUuaCIKIAotCiAvKgogCUZpbmQgYSBmcmVlIFVSQiBhbmQgc3VibWl0IGl0LgogKi8KQEAgLTMzLDcgKzMyLDggQEAKIAlzdHJ1Y3QgdXJiICp1cmJfaW47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbGluZTZwY20tPmxvY2tfYXVkaW9faW4sIGZsYWdzKTsKLQlpbmRleCA9IGZpbmRfZmlyc3RfemVyb19iaXQoJmxpbmU2cGNtLT5hY3RpdmVfdXJiX2luLCBMSU5FNl9JU09fQlVGRkVSUyk7CisJaW5kZXggPQorCSAgICBmaW5kX2ZpcnN0X3plcm9fYml0KCZsaW5lNnBjbS0+YWN0aXZlX3VyYl9pbiwgTElORTZfSVNPX0JVRkZFUlMpOwogCiAJaWYgKGluZGV4ID49IExJTkU2X0lTT19CVUZGRVJTKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpbmU2cGNtLT5sb2NrX2F1ZGlvX2luLCBmbGFncyk7CkBAIC00NSwyMCArNDUsMjQgQEAKIAl1cmJfc2l6ZSA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTElORTZfSVNPX1BBQ0tFVFM7ICsraSkgewotCQlzdHJ1Y3QgdXNiX2lzb19wYWNrZXRfZGVzY3JpcHRvciAqZmluID0gJnVyYl9pbi0+aXNvX2ZyYW1lX2Rlc2NbaV07CisJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpmaW4gPQorCQkgICAgJnVyYl9pbi0+aXNvX2ZyYW1lX2Rlc2NbaV07CiAJCWZpbi0+b2Zmc2V0ID0gdXJiX3NpemU7CiAJCWZpbi0+bGVuZ3RoID0gbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZTsKIAkJdXJiX3NpemUgKz0gbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZTsKIAl9CiAKLQl1cmJfaW4tPnRyYW5zZmVyX2J1ZmZlciA9IGxpbmU2cGNtLT5idWZmZXJfaW4gKyBpbmRleCAqIExJTkU2X0lTT19QQUNLRVRTICogbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZTsKKwl1cmJfaW4tPnRyYW5zZmVyX2J1ZmZlciA9CisJICAgIGxpbmU2cGNtLT5idWZmZXJfaW4gKworCSAgICBpbmRleCAqIExJTkU2X0lTT19QQUNLRVRTICogbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZTsKIAl1cmJfaW4tPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSB1cmJfc2l6ZTsKIAl1cmJfaW4tPmNvbnRleHQgPSBzdWJzdHJlYW07CiAKIAlpZiAodXNiX3N1Ym1pdF91cmIodXJiX2luLCBHRlBfQVRPTUlDKSA9PSAwKQogCQlzZXRfYml0KGluZGV4LCAmbGluZTZwY20tPmFjdGl2ZV91cmJfaW4pOwogCWVsc2UKLQkJZGV2X2VycihzMm0oc3Vic3RyZWFtKSwgIlVSQiBpbiAjJWQgc3VibWlzc2lvbiBmYWlsZWRcbiIsIGluZGV4KTsKKwkJZGV2X2VycihzMm0oc3Vic3RyZWFtKSwgIlVSQiBpbiAjJWQgc3VibWlzc2lvbiBmYWlsZWRcbiIsCisJCQlpbmRleCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaW5lNnBjbS0+bG9ja19hdWRpb19pbiwgZmxhZ3MpOwogCXJldHVybiAwOwpAQCAtMTQzLDcgKzE0Nyw4IEBACiAJaW50IGZyYW1lczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0KKwkgICAgKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqKXVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJY29uc3QgaW50IGJ5dGVzX3Blcl9mcmFtZSA9IGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5ieXRlc19wZXJfZnJhbWU7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKQEAgLTE1NSw4ICsxNjAsMTEgQEAKIAogI2lmIERPX0RVTVBfUENNX1JFQ0VJVkUKIAlmb3IgKGkgPSAwOyBpIDwgTElORTZfSVNPX1BBQ0tFVFM7ICsraSkgewotCQlzdHJ1Y3QgdXNiX2lzb19wYWNrZXRfZGVzY3JpcHRvciAqZm91dCA9ICZ1cmItPmlzb19mcmFtZV9kZXNjW2ldOwotCQlsaW5lNl93cml0ZV9oZXhkdW1wKGxpbmU2cGNtLT5saW5lNiwgJ0MnLCB1cmItPnRyYW5zZmVyX2J1ZmZlciArIGZvdXQtPm9mZnNldCwgZm91dC0+bGVuZ3RoKTsKKwkJc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKmZvdXQgPQorCQkgICAgJnVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV07CisJCWxpbmU2X3dyaXRlX2hleGR1bXAobGluZTZwY20tPmxpbmU2LCAnQycsCisJCQkJICAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgZm91dC0+b2Zmc2V0LAorCQkJCSAgICBmb3V0LT5sZW5ndGgpOwogCX0KICNlbmRpZgogCkBAIC0xNzksMjUgKzE4Nyw0MCBAQAogCQlpZiAoZnNpemUgPiAwKSB7CiAJCQlmcmFtZXMgPSBmc2l6ZSAvIGJ5dGVzX3Blcl9mcmFtZTsKIAotCQkJaWYgKGxpbmU2cGNtLT5wb3NfaW5fZG9uZSArIGZyYW1lcyA+IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKSB7CisJCQlpZiAobGluZTZwY20tPnBvc19pbl9kb25lICsgZnJhbWVzID4KKwkJCSAgICBydW50aW1lLT5idWZmZXJfc2l6ZSkgewogCQkJCS8qCi0JCQkJCVRoZSB0cmFuc2ZlcnJlZCBhcmVhIGdvZXMgb3ZlciBidWZmZXIgYm91bmRhcnksCi0JCQkJCWNvcHkgdHdvIHNlcGFyYXRlIGNodW5rcy4KLQkJCQkqLworCQkJCSAgIFRoZSB0cmFuc2ZlcnJlZCBhcmVhIGdvZXMgb3ZlciBidWZmZXIKKwkJCQkgICBib3VuZGFyeSwgY29weSB0d28gc2VwYXJhdGUgY2h1bmtzLgorCQkJCSAqLwogCQkJCWludCBsZW47Ci0JCQkJbGVuID0gcnVudGltZS0+YnVmZmVyX3NpemUgLSBsaW5lNnBjbS0+cG9zX2luX2RvbmU7CisJCQkJbGVuID0KKwkJCQkgICAgcnVudGltZS0+YnVmZmVyX3NpemUgLQorCQkJCSAgICBsaW5lNnBjbS0+cG9zX2luX2RvbmU7CiAKIAkJCQlpZiAobGVuID4gMCkgewotCQkJCQltZW1jcHkocnVudGltZS0+ZG1hX2FyZWEgKyBsaW5lNnBjbS0+cG9zX2luX2RvbmUgKiBieXRlc19wZXJfZnJhbWUsIGZidWYsIGxlbiAqIGJ5dGVzX3Blcl9mcmFtZSk7Ci0JCQkJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSwgZmJ1ZiArIGxlbiAqIGJ5dGVzX3Blcl9mcmFtZSwgKGZyYW1lcyAtIGxlbikgKiBieXRlc19wZXJfZnJhbWUpOwotCQkJCX0gZWxzZQotCQkJCQlkZXZfZXJyKHMybShzdWJzdHJlYW0pLCAiZHJpdmVyIGJ1ZzogbGVuID0gJWRcbiIsIGxlbik7ICAvKiB0aGlzIGlzIHNvbWV3aGF0IHBhcmFub2lkICovCisJCQkJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSArCisJCQkJCSAgICAgICBsaW5lNnBjbS0+cG9zX2luX2RvbmUgKgorCQkJCQkgICAgICAgYnl0ZXNfcGVyX2ZyYW1lLCBmYnVmLAorCQkJCQkgICAgICAgbGVuICogYnl0ZXNfcGVyX2ZyYW1lKTsKKwkJCQkJbWVtY3B5KHJ1bnRpbWUtPmRtYV9hcmVhLAorCQkJCQkgICAgICAgZmJ1ZiArIGxlbiAqIGJ5dGVzX3Blcl9mcmFtZSwKKwkJCQkJICAgICAgIChmcmFtZXMgLQorCQkJCQkJbGVuKSAqIGJ5dGVzX3Blcl9mcmFtZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogdGhpcyBpcyBzb21ld2hhdCBwYXJhbm9pZCAqLworCQkJCQlkZXZfZXJyKHMybShzdWJzdHJlYW0pLAorCQkJCQkJImRyaXZlciBidWc6IGxlbiA9ICVkXG4iLCBsZW4pOworCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJLyogY29weSBzaW5nbGUgY2h1bmsgKi8KLQkJCQltZW1jcHkocnVudGltZS0+ZG1hX2FyZWEgKyBsaW5lNnBjbS0+cG9zX2luX2RvbmUgKiBieXRlc19wZXJfZnJhbWUsIGZidWYsIGZzaXplICogYnl0ZXNfcGVyX2ZyYW1lKTsKKwkJCQltZW1jcHkocnVudGltZS0+ZG1hX2FyZWEgKworCQkJCSAgICAgICBsaW5lNnBjbS0+cG9zX2luX2RvbmUgKiBieXRlc19wZXJfZnJhbWUsCisJCQkJICAgICAgIGZidWYsIGZzaXplICogYnl0ZXNfcGVyX2ZyYW1lKTsKIAkJCX0KIAotCQkJaWYgKChsaW5lNnBjbS0+cG9zX2luX2RvbmUgKz0gZnJhbWVzKSA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkKKwkJCWxpbmU2cGNtLT5wb3NfaW5fZG9uZSArPSBmcmFtZXM7CisJCQlpZiAobGluZTZwY20tPnBvc19pbl9kb25lID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQogCQkJCWxpbmU2cGNtLT5wb3NfaW5fZG9uZSAtPSBydW50aW1lLT5idWZmZXJfc2l6ZTsKIAkJfQogCX0KQEAgLTIxMiw3ICsyMzUsOCBAQAogCWlmICghc2h1dGRvd24pIHsKIAkJc3VibWl0X2F1ZGlvX2luX3VyYihzdWJzdHJlYW0pOwogCi0JCWlmICgobGluZTZwY20tPmJ5dGVzX2luICs9IGxlbmd0aCkgPj0gbGluZTZwY20tPnBlcmlvZF9pbikgeworCQlsaW5lNnBjbS0+Ynl0ZXNfaW4gKz0gbGVuZ3RoOworCQlpZiAobGluZTZwY20tPmJ5dGVzX2luID49IGxpbmU2cGNtLT5wZXJpb2RfaW4pIHsKIAkJCWxpbmU2cGNtLT5ieXRlc19pbiAtPSBsaW5lNnBjbS0+cGVyaW9kX2luOwogCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOwogCQl9CkBAIC0yMjgsNyArMjUyLDggQEAKIAogCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9yYXRkZW5zKHJ1bnRpbWUsIDAsCiAJCQkJCSAgICBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKLQkJCQkJICAgICgmbGluZTZwY20tPnByb3BlcnRpZXMtPnNuZF9saW5lNl9yYXRlcykpOworCQkJCQkgICAgKCZsaW5lNnBjbS0+cHJvcGVydGllcy0+CisJCQkJCSAgICAgc25kX2xpbmU2X3JhdGVzKSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTI2Nyw3ICsyOTIsOSBAQAogCQlyZXR1cm4gcmV0OwogCiAJbGluZTZwY20tPnBlcmlvZF9pbiA9IHBhcmFtc19wZXJpb2RfYnl0ZXMoaHdfcGFyYW1zKTsKLQlsaW5lNnBjbS0+YnVmZmVyX2luID0ga21hbGxvYyhMSU5FNl9JU09fQlVGRkVSUyAqIExJTkU2X0lTT19QQUNLRVRTICogTElORTZfSVNPX1BBQ0tFVF9TSVpFX01BWCwgR0ZQX0tFUk5FTCk7CisJbGluZTZwY20tPmJ1ZmZlcl9pbiA9CisJICAgIGttYWxsb2MoTElORTZfSVNPX0JVRkZFUlMgKiBMSU5FNl9JU09fUEFDS0VUUyAqCisJCSAgICBMSU5FNl9JU09fUEFDS0VUX1NJWkVfTUFYLCBHRlBfS0VSTkVMKTsKIAogCWlmICghbGluZTZwY20tPmJ1ZmZlcl9pbikgewogCQlkZXZfZXJyKHMybShzdWJzdHJlYW0pLCAiY2Fubm90IG1hbGxvYyBidWZmZXJfaW5cbiIpOwpAQCAtMzAyLDcgKzMyOSw4IEBACiAJCQllcnIgPSBzdWJtaXRfYXVkaW9faW5fYWxsX3VyYnMoc3Vic3RyZWFtKTsKIAogCQkJaWYgKGVyciA8IDApIHsKLQkJCQljbGVhcl9iaXQoQklUX1JVTk5JTkdfQ0FQVFVSRSwgJmxpbmU2cGNtLT5mbGFncyk7CisJCQkJY2xlYXJfYml0KEJJVF9SVU5OSU5HX0NBUFRVUkUsCisJCQkJCSAgJmxpbmU2cGNtLT5mbGFncyk7CiAJCQkJcmV0dXJuIGVycjsKIAkJCX0KIAkJfQpAQCAtMzMyLDE0ICszNjAsMTQgQEAKIAogLyogY2FwdHVyZSBvcGVyYXRvcnMgKi8KIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfbGluZTZfY2FwdHVyZV9vcHMgPSB7Ci0JLm9wZW4gPSAgICAgICAgc25kX2xpbmU2X2NhcHR1cmVfb3BlbiwKLQkuY2xvc2UgPSAgICAgICBzbmRfbGluZTZfY2FwdHVyZV9jbG9zZSwKLQkuaW9jdGwgPSAgICAgICBzbmRfcGNtX2xpYl9pb2N0bCwKLQkuaHdfcGFyYW1zID0gICBzbmRfbGluZTZfY2FwdHVyZV9od19wYXJhbXMsCi0JLmh3X2ZyZWUgPSAgICAgc25kX2xpbmU2X2NhcHR1cmVfaHdfZnJlZSwKLQkucHJlcGFyZSA9ICAgICBzbmRfbGluZTZfcHJlcGFyZSwKLQkudHJpZ2dlciA9ICAgICBzbmRfbGluZTZfdHJpZ2dlciwKLQkucG9pbnRlciA9ICAgICBzbmRfbGluZTZfY2FwdHVyZV9wb2ludGVyLAorCS5vcGVuID0gc25kX2xpbmU2X2NhcHR1cmVfb3BlbiwKKwkuY2xvc2UgPSBzbmRfbGluZTZfY2FwdHVyZV9jbG9zZSwKKwkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0gc25kX2xpbmU2X2NhcHR1cmVfaHdfcGFyYW1zLAorCS5od19mcmVlID0gc25kX2xpbmU2X2NhcHR1cmVfaHdfZnJlZSwKKwkucHJlcGFyZSA9IHNuZF9saW5lNl9wcmVwYXJlLAorCS50cmlnZ2VyID0gc25kX2xpbmU2X3RyaWdnZXIsCisJLnBvaW50ZXIgPSBzbmRfbGluZTZfY2FwdHVyZV9wb2ludGVyLAogfTsKIAogaW50IGNyZWF0ZV9hdWRpb19pbl91cmJzKHN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSkKQEAgLTM1MSw3ICszNzksOCBAQAogCQlzdHJ1Y3QgdXJiICp1cmI7CiAKIAkJLyogVVJCIGZvciBhdWRpbyBpbjogKi8KLQkJdXJiID0gbGluZTZwY20tPnVyYl9hdWRpb19pbltpXSA9IHVzYl9hbGxvY191cmIoTElORTZfSVNPX1BBQ0tFVFMsIEdGUF9LRVJORUwpOworCQl1cmIgPSBsaW5lNnBjbS0+dXJiX2F1ZGlvX2luW2ldID0KKwkJICAgIHVzYl9hbGxvY191cmIoTElORTZfSVNPX1BBQ0tFVFMsIEdGUF9LRVJORUwpOwogCiAJCWlmICh1cmIgPT0gTlVMTCkgewogCQkJZGV2X2VycihsaW5lNnBjbS0+bGluZTYtPmlmY2RldiwgIk91dCBvZiBtZW1vcnlcbiIpOwpAQCAtMzU5LDcgKzM4OCwxMCBAQAogCQl9CiAKIAkJdXJiLT5kZXYgPSBsaW5lNnBjbS0+bGluZTYtPnVzYmRldjsKLQkJdXJiLT5waXBlID0gdXNiX3Jjdmlzb2NwaXBlKGxpbmU2cGNtLT5saW5lNi0+dXNiZGV2LCBsaW5lNnBjbS0+ZXBfYXVkaW9fcmVhZCAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSyk7CisJCXVyYi0+cGlwZSA9CisJCSAgICB1c2JfcmN2aXNvY3BpcGUobGluZTZwY20tPmxpbmU2LT51c2JkZXYsCisJCQkJICAgIGxpbmU2cGNtLT4KKwkJCQkgICAgZXBfYXVkaW9fcmVhZCAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSyk7CiAJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CiAJCXVyYi0+c3RhcnRfZnJhbWUgPSAtMTsKIAkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IExJTkU2X0lTT19QQUNLRVRTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2NvbnRyb2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9jb250cm9sLmMKaW5kZXggMjNhZDA4ZS4uMGI1OTg1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2NvbnRyb2wuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvY29udHJvbC5jCkBAIC0yMiwxOCArMjIsMTggQEAKIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyXyMjX25hbWUxID0gX19BVFRSKF9uYW1lMiwgX21vZGUsIF9zaG93LCBfc3RvcmUpCiAKICNkZWZpbmUgTElORTZfUEFSQU1fUihQUkVGSVgsIHByZWZpeCwgdHlwZSwgcGFyYW0pIFwKLXN0YXRpYyBzc2l6ZV90IHByZWZpeCAjIyBfZ2V0XyAjIyBwYXJhbShzdHJ1Y3QgZGV2aWNlICpkZXYsIFwKK3N0YXRpYyBzc2l6ZV90IHByZWZpeCMjX2dldF8jI3BhcmFtKHN0cnVjdCBkZXZpY2UgKmRldiwgXAogCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAogeyBcCi0JcmV0dXJuIHByZWZpeCAjIyBfZ2V0X3BhcmFtXyAjIyB0eXBlKGRldiwgYnVmLCBQUkVGSVggIyMgXyAjIyBwYXJhbSk7IFwKKwlyZXR1cm4gcHJlZml4IyNfZ2V0X3BhcmFtXyMjdHlwZShkZXYsIGJ1ZiwgUFJFRklYIyNfIyNwYXJhbSk7IFwKIH0KIAogI2RlZmluZSBMSU5FNl9QQVJBTV9SVyhQUkVGSVgsIHByZWZpeCwgdHlwZSwgcGFyYW0pIFwKIExJTkU2X1BBUkFNX1IoUFJFRklYLCBwcmVmaXgsIHR5cGUsIHBhcmFtKTsgXAotc3RhdGljIHNzaXplX3QgcHJlZml4ICMjIF9zZXRfICMjIHBhcmFtKHN0cnVjdCBkZXZpY2UgKmRldiwgXAorc3RhdGljIHNzaXplX3QgcHJlZml4IyNfc2V0XyMjcGFyYW0oc3RydWN0IGRldmljZSAqZGV2LCBcCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAogeyBcCi0JcmV0dXJuIHByZWZpeCAjIyBfc2V0X3BhcmFtXyAjIyB0eXBlKGRldiwgYnVmLCBjb3VudCwgUFJFRklYICMjIF8gIyMgcGFyYW0pOyBcCisJcmV0dXJuIHByZWZpeCMjX3NldF9wYXJhbV8jI3R5cGUoZGV2LCBidWYsIGNvdW50LCBQUkVGSVgjI18jI3BhcmFtKTsgXAogfQogCiAjZGVmaW5lIFBPRF9QQVJBTV9SKHR5cGUsIHBhcmFtKSBMSU5FNl9QQVJBTV9SKFBPRCwgcG9kLCB0eXBlLCBwYXJhbSkKQEAgLTQxLDcgKzQxLDYgQEAKICNkZWZpbmUgVkFSSUFYX1BBUkFNX1IodHlwZSwgcGFyYW0pIExJTkU2X1BBUkFNX1IoVkFSSUFYLCB2YXJpYXgsIHR5cGUsIHBhcmFtKQogI2RlZmluZSBWQVJJQVhfUEFSQU1fUlcodHlwZSwgcGFyYW0pIExJTkU2X1BBUkFNX1JXKFZBUklBWCwgdmFyaWF4LCB0eXBlLCBwYXJhbSkKIAotCiBzdGF0aWMgc3NpemVfdCBwb2RfZ2V0X3BhcmFtX2ludChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IHBhcmFtKQogewogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CkBAIC01MiwxMSArNTEsMTggQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcG9kLT5wcm9nX2RhdGEuY29udHJvbFtwYXJhbV0pOwogfQogCi1zdGF0aWMgc3NpemVfdCBwb2Rfc2V0X3BhcmFtX2ludChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgcGFyYW0pCitzdGF0aWMgc3NpemVfdCBwb2Rfc2V0X3BhcmFtX2ludChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgc2l6ZV90IGNvdW50LCBpbnQgcGFyYW0pCiB7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKIAlzdHJ1Y3QgdXNiX2xpbmU2X3BvZCAqcG9kID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwotCWludCB2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWx1ZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwogCXBvZF90cmFuc21pdF9wYXJhbWV0ZXIocG9kLCBwYXJhbSwgdmFsdWUpOwogCXJldHVybiBjb3VudDsKIH0KQEAgLTc0LDEzICs4MCwxMyBAQAogc3RhdGljIHNzaXplX3QgdmFyaWF4X2dldF9wYXJhbV9mbG9hdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IHBhcmFtKQogewogCS8qCi0JCVdlIGRvIG91ciBvd24gZmxvYXRpbmcgcG9pbnQgaGFuZGxpbmcgaGVyZSBzaW5jZSBmbG9hdHMgaW4gdGhlCi0JCWtlcm5lbCBhcmUgcHJvYmxlbWF0aWMgZm9yIGF0IGxlYXN0IHR3byByZWFzb25zOiAtIG1hbnkgZGlzdHJvcwotCQlhcmUgc3RpbGwgc2hpcHBlZCB3aXRoIGJpbmFyeSBrZXJuZWxzIG9wdGltaXplZCBmb3IgdGhlIGFuY2llbnQKLQkJODAzODYgd2l0aG91dCBGUFUKLQkJLSB0aGVyZSBpc24ndCBhIHByaW50ZigiJWYiKQotCQkgIChzZWUgaHR0cDovL3d3dy5rZXJuZWx0aHJlYWQuY29tL3B1YmxpY2F0aW9ucy9mYXEvMzM1Lmh0bWwpCi0JKi8KKwkgICBXZSBkbyBvdXIgb3duIGZsb2F0aW5nIHBvaW50IGhhbmRsaW5nIGhlcmUgc2luY2UgZmxvYXRzIGluIHRoZQorCSAgIGtlcm5lbCBhcmUgcHJvYmxlbWF0aWMgZm9yIGF0IGxlYXN0IHR3byByZWFzb25zOiAtIG1hbnkgZGlzdHJvcworCSAgIGFyZSBzdGlsbCBzaGlwcGVkIHdpdGggYmluYXJ5IGtlcm5lbHMgb3B0aW1pemVkIGZvciB0aGUgYW5jaWVudAorCSAgIDgwMzg2IHdpdGhvdXQgRlBVCisJICAgLSB0aGVyZSBpc24ndCBhIHByaW50ZigiJWYiKQorCSAgIChzZWUgaHR0cDovL3d3dy5rZXJuZWx0aHJlYWQuY29tL3B1YmxpY2F0aW9ucy9mYXEvMzM1Lmh0bWwpCisJICovCiAKIAlzdGF0aWMgY29uc3QgaW50IEJJQVMgPSAweDdmOwogCXN0YXRpYyBjb25zdCBpbnQgT0ZGU0VUID0gMHhmOwpAQCAtMTEwLDEwICsxMTYsMTMgQEAKIAkJCXBhcnRfZnJhYyA9IChtYW50aXNzYSA8PCAoMzIgKyBleHBvbmVudCkpICYgMHhmZmZmZmZmZjsKIAkJfQogCi0JCXBhcnRfZnJhYyA9IChwYXJ0X2ZyYWMgLyAoKDFVTCA8PCAzMSkgLyAoUFJFQ0lTSU9OIC8gMiAqIDEwKSkgKyA1KSAvIDEwOworCQlwYXJ0X2ZyYWMgPQorCQkgICAgKHBhcnRfZnJhYyAvICgoMVVMIDw8IDMxKSAvIChQUkVDSVNJT04gLyAyICogMTApKSArIDUpIC8gMTA7CiAJfQogCi0JbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiJXMlZC4lMDNkXG4iLCAoKHBbMF0gJiAweDgwKSA/ICItIiA6ICIiKSwgcGFydF9pbnQsIHBhcnRfZnJhYyk7CisJbGVuICs9CisJICAgIHNwcmludGYoYnVmICsgbGVuLCAiJXMlZC4lMDNkXG4iLCAoKHBbMF0gJiAweDgwKSA/ICItIiA6ICIiKSwKKwkJICAgIHBhcnRfaW50LCBwYXJ0X2ZyYWMpOwogCXJldHVybiBsZW47CiB9CiAKQEAgLTI2MCwxMjcgKzI2OSwyNDYgQEAKIFZBUklBWF9QQVJBTV9SKGludCwgcGlja3VwX3dpcmluZyk7CiAKIHN0YXRpYyBERVZJQ0VfQVRUUih0d2VhaywgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfdHdlYWssIHBvZF9zZXRfdHdlYWspOwotc3RhdGljIERFVklDRV9BVFRSKHdhaF9wb3NpdGlvbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfd2FoX3Bvc2l0aW9uLCBwb2Rfc2V0X3dhaF9wb3NpdGlvbik7Ci1zdGF0aWMgREVWSUNFX0FUVFIoY29tcHJlc3Npb25fZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfY29tcHJlc3Npb25fZ2FpbiwgcG9kX3NldF9jb21wcmVzc2lvbl9nYWluKTsKLXN0YXRpYyBERVZJQ0VfQVRUUih2b2xfcGVkYWxfcG9zaXRpb24sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3ZvbF9wZWRhbF9wb3NpdGlvbiwgcG9kX3NldF92b2xfcGVkYWxfcG9zaXRpb24pOwotc3RhdGljIERFVklDRV9BVFRSKGNvbXByZXNzaW9uX3RocmVzaG9sZCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfY29tcHJlc3Npb25fdGhyZXNob2xkLCBwb2Rfc2V0X2NvbXByZXNzaW9uX3RocmVzaG9sZCk7CitzdGF0aWMgREVWSUNFX0FUVFIod2FoX3Bvc2l0aW9uLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF93YWhfcG9zaXRpb24sCisJCSAgIHBvZF9zZXRfd2FoX3Bvc2l0aW9uKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihjb21wcmVzc2lvbl9nYWluLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9jb21wcmVzc2lvbl9nYWluLCBwb2Rfc2V0X2NvbXByZXNzaW9uX2dhaW4pOworc3RhdGljIERFVklDRV9BVFRSKHZvbF9wZWRhbF9wb3NpdGlvbiwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfdm9sX3BlZGFsX3Bvc2l0aW9uLCBwb2Rfc2V0X3ZvbF9wZWRhbF9wb3NpdGlvbik7CitzdGF0aWMgREVWSUNFX0FUVFIoY29tcHJlc3Npb25fdGhyZXNob2xkLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9jb21wcmVzc2lvbl90aHJlc2hvbGQsCisJCSAgIHBvZF9zZXRfY29tcHJlc3Npb25fdGhyZXNob2xkKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihwYW4sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3BhbiwgcG9kX3NldF9wYW4pOwotc3RhdGljIERFVklDRV9BVFRSKGFtcF9tb2RlbF9zZXR1cCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYW1wX21vZGVsX3NldHVwLCBwb2Rfc2V0X2FtcF9tb2RlbF9zZXR1cCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoYW1wX21vZGVsLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9hbXBfbW9kZWwsIHBvZF9zZXRfYW1wX21vZGVsKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhbXBfbW9kZWxfc2V0dXAsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2FtcF9tb2RlbF9zZXR1cCwKKwkJICAgcG9kX3NldF9hbXBfbW9kZWxfc2V0dXApOworc3RhdGljIERFVklDRV9BVFRSKGFtcF9tb2RlbCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYW1wX21vZGVsLAorCQkgICBwb2Rfc2V0X2FtcF9tb2RlbCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoZHJpdmUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RyaXZlLCBwb2Rfc2V0X2RyaXZlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihiYXNzLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYXNzLCBwb2Rfc2V0X2Jhc3MpOwogc3RhdGljIERFVklDRV9BVFRSKG1pZCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbWlkLCBwb2Rfc2V0X21pZCk7CiBzdGF0aWMgREVWSUNFX0FUVFIobG93bWlkLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9sb3dtaWQsIHBvZF9zZXRfbG93bWlkKTsKIHN0YXRpYyBERVZJQ0VfQVRUUih0cmVibGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3RyZWJsZSwgcG9kX3NldF90cmVibGUpOwotc3RhdGljIERFVklDRV9BVFRSKGhpZ2htaWQsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2hpZ2htaWQsIHBvZF9zZXRfaGlnaG1pZCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoY2hhbl92b2wsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2NoYW5fdm9sLCBwb2Rfc2V0X2NoYW5fdm9sKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihyZXZlcmJfbWl4LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfbWl4LCBwb2Rfc2V0X3JldmVyYl9taXgpOwotc3RhdGljIERFVklDRV9BVFRSKGVmZmVjdF9zZXR1cCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZWZmZWN0X3NldHVwLCBwb2Rfc2V0X2VmZmVjdF9zZXR1cCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoYmFuZF8xX2ZyZXF1ZW5jeSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF8xX2ZyZXF1ZW5jeSwgcG9kX3NldF9iYW5kXzFfZnJlcXVlbmN5KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihwcmVzZW5jZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfcHJlc2VuY2UsIHBvZF9zZXRfcHJlc2VuY2UpOwotc3RhdGljIERFVklDRV9BVFRSMih0cmVibGVfX2Jhc3MsIHRyZWJsZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfdHJlYmxlX19iYXNzLCBwb2Rfc2V0X3RyZWJsZV9fYmFzcyk7Ci1zdGF0aWMgREVWSUNFX0FUVFIobm9pc2VfZ2F0ZV9lbmFibGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X25vaXNlX2dhdGVfZW5hYmxlLCBwb2Rfc2V0X25vaXNlX2dhdGVfZW5hYmxlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihnYXRlX3RocmVzaG9sZCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZ2F0ZV90aHJlc2hvbGQsIHBvZF9zZXRfZ2F0ZV90aHJlc2hvbGQpOwotc3RhdGljIERFVklDRV9BVFRSKGdhdGVfZGVjYXlfdGltZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZ2F0ZV9kZWNheV90aW1lLCBwb2Rfc2V0X2dhdGVfZGVjYXlfdGltZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfZW5hYmxlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9zdG9tcF9lbmFibGUsIHBvZF9zZXRfc3RvbXBfZW5hYmxlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihjb21wX2VuYWJsZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfY29tcF9lbmFibGUsIHBvZF9zZXRfY29tcF9lbmFibGUpOwotc3RhdGljIERFVklDRV9BVFRSKHN0b21wX3RpbWUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX3RpbWUsIHBvZF9zZXRfc3RvbXBfdGltZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfZW5hYmxlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9lbmFibGUsIHBvZF9zZXRfZGVsYXlfZW5hYmxlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihtb2RfcGFyYW1fMSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kX3BhcmFtXzEsIHBvZF9zZXRfbW9kX3BhcmFtXzEpOwotc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3BhcmFtXzEsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RlbGF5X3BhcmFtXzEsIHBvZF9zZXRfZGVsYXlfcGFyYW1fMSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfcGFyYW1fMV9ub3RlX3ZhbHVlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9wYXJhbV8xX25vdGVfdmFsdWUsIHBvZF9zZXRfZGVsYXlfcGFyYW1fMV9ub3RlX3ZhbHVlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUjIoYmFuZF8yX2ZyZXF1ZW5jeV9fYmFzcywgYmFuZF8yX2ZyZXF1ZW5jeSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF8yX2ZyZXF1ZW5jeV9fYmFzcywgcG9kX3NldF9iYW5kXzJfZnJlcXVlbmN5X19iYXNzKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihkZWxheV9wYXJhbV8yLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9wYXJhbV8yLCBwb2Rfc2V0X2RlbGF5X3BhcmFtXzIpOwotc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3ZvbHVtZV9taXgsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RlbGF5X3ZvbHVtZV9taXgsIHBvZF9zZXRfZGVsYXlfdm9sdW1lX21peCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfcGFyYW1fMywgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfcGFyYW1fMywgcG9kX3NldF9kZWxheV9wYXJhbV8zKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihyZXZlcmJfZW5hYmxlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfZW5hYmxlLCBwb2Rfc2V0X3JldmVyYl9lbmFibGUpOwotc3RhdGljIERFVklDRV9BVFRSKHJldmVyYl90eXBlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfdHlwZSwgcG9kX3NldF9yZXZlcmJfdHlwZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocmV2ZXJiX2RlY2F5LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfZGVjYXksIHBvZF9zZXRfcmV2ZXJiX2RlY2F5KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihyZXZlcmJfdG9uZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfcmV2ZXJiX3RvbmUsIHBvZF9zZXRfcmV2ZXJiX3RvbmUpOwotc3RhdGljIERFVklDRV9BVFRSKHJldmVyYl9wcmVfZGVsYXksIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3JldmVyYl9wcmVfZGVsYXksIHBvZF9zZXRfcmV2ZXJiX3ByZV9kZWxheSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocmV2ZXJiX3ByZV9wb3N0LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfcHJlX3Bvc3QsIHBvZF9zZXRfcmV2ZXJiX3ByZV9wb3N0KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihiYW5kXzJfZnJlcXVlbmN5LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzJfZnJlcXVlbmN5LCBwb2Rfc2V0X2JhbmRfMl9mcmVxdWVuY3kpOwotc3RhdGljIERFVklDRV9BVFRSMihiYW5kXzNfZnJlcXVlbmN5X19iYXNzLCBiYW5kXzNfZnJlcXVlbmN5LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzNfZnJlcXVlbmN5X19iYXNzLCBwb2Rfc2V0X2JhbmRfM19mcmVxdWVuY3lfX2Jhc3MpOwotc3RhdGljIERFVklDRV9BVFRSKHdhaF9lbmFibGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3dhaF9lbmFibGUsIHBvZF9zZXRfd2FoX2VuYWJsZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIobW9kdWxhdGlvbl9sb19jdXQsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZHVsYXRpb25fbG9fY3V0LCBwb2Rfc2V0X21vZHVsYXRpb25fbG9fY3V0KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihkZWxheV9yZXZlcmJfbG9fY3V0LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9yZXZlcmJfbG9fY3V0LCBwb2Rfc2V0X2RlbGF5X3JldmVyYl9sb19jdXQpOwotc3RhdGljIERFVklDRV9BVFRSKHZvbHVtZV9wZWRhbF9taW5pbXVtLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF92b2x1bWVfcGVkYWxfbWluaW11bSwgcG9kX3NldF92b2x1bWVfcGVkYWxfbWluaW11bSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZXFfcHJlX3Bvc3QsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2VxX3ByZV9wb3N0LCBwb2Rfc2V0X2VxX3ByZV9wb3N0KTsKLXN0YXRpYyBERVZJQ0VfQVRUUih2b2x1bWVfcHJlX3Bvc3QsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3ZvbHVtZV9wcmVfcG9zdCwgcG9kX3NldF92b2x1bWVfcHJlX3Bvc3QpOwotc3RhdGljIERFVklDRV9BVFRSKGRpX21vZGVsLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kaV9tb2RlbCwgcG9kX3NldF9kaV9tb2RlbCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGlfZGVsYXksIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RpX2RlbGF5LCBwb2Rfc2V0X2RpX2RlbGF5KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihtb2RfZW5hYmxlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9tb2RfZW5hYmxlLCBwb2Rfc2V0X21vZF9lbmFibGUpOwotc3RhdGljIERFVklDRV9BVFRSKG1vZF9wYXJhbV8xX25vdGVfdmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZF9wYXJhbV8xX25vdGVfdmFsdWUsIHBvZF9zZXRfbW9kX3BhcmFtXzFfbm90ZV92YWx1ZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIobW9kX3BhcmFtXzIsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZF9wYXJhbV8yLCBwb2Rfc2V0X21vZF9wYXJhbV8yKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihtb2RfcGFyYW1fMywgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kX3BhcmFtXzMsIHBvZF9zZXRfbW9kX3BhcmFtXzMpOwotc3RhdGljIERFVklDRV9BVFRSKG1vZF9wYXJhbV80LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9tb2RfcGFyYW1fNCwgcG9kX3NldF9tb2RfcGFyYW1fNCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIobW9kX3BhcmFtXzUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZF9wYXJhbV81LCBwb2Rfc2V0X21vZF9wYXJhbV81KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihtb2Rfdm9sdW1lX21peCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kX3ZvbHVtZV9taXgsIHBvZF9zZXRfbW9kX3ZvbHVtZV9taXgpOwotc3RhdGljIERFVklDRV9BVFRSKG1vZF9wcmVfcG9zdCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kX3ByZV9wb3N0LCBwb2Rfc2V0X21vZF9wcmVfcG9zdCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIobW9kdWxhdGlvbl9tb2RlbCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kdWxhdGlvbl9tb2RlbCwgcG9kX3NldF9tb2R1bGF0aW9uX21vZGVsKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihiYW5kXzNfZnJlcXVlbmN5LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzNfZnJlcXVlbmN5LCBwb2Rfc2V0X2JhbmRfM19mcmVxdWVuY3kpOwotc3RhdGljIERFVklDRV9BVFRSMihiYW5kXzRfZnJlcXVlbmN5X19iYXNzLCBiYW5kXzRfZnJlcXVlbmN5LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzRfZnJlcXVlbmN5X19iYXNzLCBwb2Rfc2V0X2JhbmRfNF9mcmVxdWVuY3lfX2Jhc3MpOwotc3RhdGljIERFVklDRV9BVFRSKG1vZF9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZF9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24sIHBvZF9zZXRfbW9kX3BhcmFtXzFfZG91YmxlX3ByZWNpc2lvbik7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24sIHBvZF9zZXRfZGVsYXlfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihlcV9lbmFibGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2VxX2VuYWJsZSwgcG9kX3NldF9lcV9lbmFibGUpOworc3RhdGljIERFVklDRV9BVFRSKGhpZ2htaWQsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2hpZ2htaWQsCisJCSAgIHBvZF9zZXRfaGlnaG1pZCk7CitzdGF0aWMgREVWSUNFX0FUVFIoY2hhbl92b2wsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2NoYW5fdm9sLAorCQkgICBwb2Rfc2V0X2NoYW5fdm9sKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihyZXZlcmJfbWl4LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfbWl4LAorCQkgICBwb2Rfc2V0X3JldmVyYl9taXgpOworc3RhdGljIERFVklDRV9BVFRSKGVmZmVjdF9zZXR1cCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZWZmZWN0X3NldHVwLAorCQkgICBwb2Rfc2V0X2VmZmVjdF9zZXR1cCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmFuZF8xX2ZyZXF1ZW5jeSwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfYmFuZF8xX2ZyZXF1ZW5jeSwgcG9kX3NldF9iYW5kXzFfZnJlcXVlbmN5KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwcmVzZW5jZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfcHJlc2VuY2UsCisJCSAgIHBvZF9zZXRfcHJlc2VuY2UpOworc3RhdGljIERFVklDRV9BVFRSMih0cmVibGVfX2Jhc3MsIHRyZWJsZSwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgICBwb2RfZ2V0X3RyZWJsZV9fYmFzcywgcG9kX3NldF90cmVibGVfX2Jhc3MpOworc3RhdGljIERFVklDRV9BVFRSKG5vaXNlX2dhdGVfZW5hYmxlLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9ub2lzZV9nYXRlX2VuYWJsZSwgcG9kX3NldF9ub2lzZV9nYXRlX2VuYWJsZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ2F0ZV90aHJlc2hvbGQsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2dhdGVfdGhyZXNob2xkLAorCQkgICBwb2Rfc2V0X2dhdGVfdGhyZXNob2xkKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihnYXRlX2RlY2F5X3RpbWUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2dhdGVfZGVjYXlfdGltZSwKKwkJICAgcG9kX3NldF9nYXRlX2RlY2F5X3RpbWUpOworc3RhdGljIERFVklDRV9BVFRSKHN0b21wX2VuYWJsZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfc3RvbXBfZW5hYmxlLAorCQkgICBwb2Rfc2V0X3N0b21wX2VuYWJsZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoY29tcF9lbmFibGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2NvbXBfZW5hYmxlLAorCQkgICBwb2Rfc2V0X2NvbXBfZW5hYmxlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzdG9tcF90aW1lLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9zdG9tcF90aW1lLAorCQkgICBwb2Rfc2V0X3N0b21wX3RpbWUpOworc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X2VuYWJsZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfZW5hYmxlLAorCQkgICBwb2Rfc2V0X2RlbGF5X2VuYWJsZSk7CitzdGF0aWMgREVWSUNFX0FUVFIobW9kX3BhcmFtXzEsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZF9wYXJhbV8xLAorCQkgICBwb2Rfc2V0X21vZF9wYXJhbV8xKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkZWxheV9wYXJhbV8xLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9wYXJhbV8xLAorCQkgICBwb2Rfc2V0X2RlbGF5X3BhcmFtXzEpOworc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3BhcmFtXzFfbm90ZV92YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfZGVsYXlfcGFyYW1fMV9ub3RlX3ZhbHVlLAorCQkgICBwb2Rfc2V0X2RlbGF5X3BhcmFtXzFfbm90ZV92YWx1ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIyKGJhbmRfMl9mcmVxdWVuY3lfX2Jhc3MsIGJhbmRfMl9mcmVxdWVuY3ksIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICAgcG9kX2dldF9iYW5kXzJfZnJlcXVlbmN5X19iYXNzLAorCQkgICAgcG9kX3NldF9iYW5kXzJfZnJlcXVlbmN5X19iYXNzKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkZWxheV9wYXJhbV8yLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9wYXJhbV8yLAorCQkgICBwb2Rfc2V0X2RlbGF5X3BhcmFtXzIpOworc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3ZvbHVtZV9taXgsIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X2RlbGF5X3ZvbHVtZV9taXgsIHBvZF9zZXRfZGVsYXlfdm9sdW1lX21peCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfcGFyYW1fMywgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfcGFyYW1fMywKKwkJICAgcG9kX3NldF9kZWxheV9wYXJhbV8zKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihyZXZlcmJfZW5hYmxlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfZW5hYmxlLAorCQkgICBwb2Rfc2V0X3JldmVyYl9lbmFibGUpOworc3RhdGljIERFVklDRV9BVFRSKHJldmVyYl90eXBlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfdHlwZSwKKwkJICAgcG9kX3NldF9yZXZlcmJfdHlwZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocmV2ZXJiX2RlY2F5LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfZGVjYXksCisJCSAgIHBvZF9zZXRfcmV2ZXJiX2RlY2F5KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihyZXZlcmJfdG9uZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfcmV2ZXJiX3RvbmUsCisJCSAgIHBvZF9zZXRfcmV2ZXJiX3RvbmUpOworc3RhdGljIERFVklDRV9BVFRSKHJldmVyYl9wcmVfZGVsYXksIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X3JldmVyYl9wcmVfZGVsYXksIHBvZF9zZXRfcmV2ZXJiX3ByZV9kZWxheSk7CitzdGF0aWMgREVWSUNFX0FUVFIocmV2ZXJiX3ByZV9wb3N0LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfcHJlX3Bvc3QsCisJCSAgIHBvZF9zZXRfcmV2ZXJiX3ByZV9wb3N0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihiYW5kXzJfZnJlcXVlbmN5LCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9iYW5kXzJfZnJlcXVlbmN5LCBwb2Rfc2V0X2JhbmRfMl9mcmVxdWVuY3kpOworc3RhdGljIERFVklDRV9BVFRSMihiYW5kXzNfZnJlcXVlbmN5X19iYXNzLCBiYW5kXzNfZnJlcXVlbmN5LCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgIHBvZF9nZXRfYmFuZF8zX2ZyZXF1ZW5jeV9fYmFzcywKKwkJICAgIHBvZF9zZXRfYmFuZF8zX2ZyZXF1ZW5jeV9fYmFzcyk7CitzdGF0aWMgREVWSUNFX0FUVFIod2FoX2VuYWJsZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfd2FoX2VuYWJsZSwKKwkJICAgcG9kX3NldF93YWhfZW5hYmxlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihtb2R1bGF0aW9uX2xvX2N1dCwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfbW9kdWxhdGlvbl9sb19jdXQsIHBvZF9zZXRfbW9kdWxhdGlvbl9sb19jdXQpOworc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3JldmVyYl9sb19jdXQsIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X2RlbGF5X3JldmVyYl9sb19jdXQsIHBvZF9zZXRfZGVsYXlfcmV2ZXJiX2xvX2N1dCk7CitzdGF0aWMgREVWSUNFX0FUVFIodm9sdW1lX3BlZGFsX21pbmltdW0sIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X3ZvbHVtZV9wZWRhbF9taW5pbXVtLCBwb2Rfc2V0X3ZvbHVtZV9wZWRhbF9taW5pbXVtKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihlcV9wcmVfcG9zdCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZXFfcHJlX3Bvc3QsCisJCSAgIHBvZF9zZXRfZXFfcHJlX3Bvc3QpOworc3RhdGljIERFVklDRV9BVFRSKHZvbHVtZV9wcmVfcG9zdCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfdm9sdW1lX3ByZV9wb3N0LAorCQkgICBwb2Rfc2V0X3ZvbHVtZV9wcmVfcG9zdCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGlfbW9kZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RpX21vZGVsLAorCQkgICBwb2Rfc2V0X2RpX21vZGVsKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkaV9kZWxheSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGlfZGVsYXksCisJCSAgIHBvZF9zZXRfZGlfZGVsYXkpOworc3RhdGljIERFVklDRV9BVFRSKG1vZF9lbmFibGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZF9lbmFibGUsCisJCSAgIHBvZF9zZXRfbW9kX2VuYWJsZSk7CitzdGF0aWMgREVWSUNFX0FUVFIobW9kX3BhcmFtXzFfbm90ZV92YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfbW9kX3BhcmFtXzFfbm90ZV92YWx1ZSwKKwkJICAgcG9kX3NldF9tb2RfcGFyYW1fMV9ub3RlX3ZhbHVlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihtb2RfcGFyYW1fMiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kX3BhcmFtXzIsCisJCSAgIHBvZF9zZXRfbW9kX3BhcmFtXzIpOworc3RhdGljIERFVklDRV9BVFRSKG1vZF9wYXJhbV8zLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9tb2RfcGFyYW1fMywKKwkJICAgcG9kX3NldF9tb2RfcGFyYW1fMyk7CitzdGF0aWMgREVWSUNFX0FUVFIobW9kX3BhcmFtXzQsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZF9wYXJhbV80LAorCQkgICBwb2Rfc2V0X21vZF9wYXJhbV80KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihtb2RfcGFyYW1fNSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kX3BhcmFtXzUsCisJCSAgIHBvZF9zZXRfbW9kX3BhcmFtXzUpOworc3RhdGljIERFVklDRV9BVFRSKG1vZF92b2x1bWVfbWl4LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9tb2Rfdm9sdW1lX21peCwKKwkJICAgcG9kX3NldF9tb2Rfdm9sdW1lX21peCk7CitzdGF0aWMgREVWSUNFX0FUVFIobW9kX3ByZV9wb3N0LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9tb2RfcHJlX3Bvc3QsCisJCSAgIHBvZF9zZXRfbW9kX3ByZV9wb3N0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihtb2R1bGF0aW9uX21vZGVsLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9tb2R1bGF0aW9uX21vZGVsLCBwb2Rfc2V0X21vZHVsYXRpb25fbW9kZWwpOworc3RhdGljIERFVklDRV9BVFRSKGJhbmRfM19mcmVxdWVuY3ksIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X2JhbmRfM19mcmVxdWVuY3ksIHBvZF9zZXRfYmFuZF8zX2ZyZXF1ZW5jeSk7CitzdGF0aWMgREVWSUNFX0FUVFIyKGJhbmRfNF9mcmVxdWVuY3lfX2Jhc3MsIGJhbmRfNF9mcmVxdWVuY3ksIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICAgcG9kX2dldF9iYW5kXzRfZnJlcXVlbmN5X19iYXNzLAorCQkgICAgcG9kX3NldF9iYW5kXzRfZnJlcXVlbmN5X19iYXNzKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihtb2RfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9tb2RfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uLAorCQkgICBwb2Rfc2V0X21vZF9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24pOworc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3BhcmFtXzFfZG91YmxlX3ByZWNpc2lvbiwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfZGVsYXlfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uLAorCQkgICBwb2Rfc2V0X2RlbGF5X3BhcmFtXzFfZG91YmxlX3ByZWNpc2lvbik7CitzdGF0aWMgREVWSUNFX0FUVFIoZXFfZW5hYmxlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9lcV9lbmFibGUsCisJCSAgIHBvZF9zZXRfZXFfZW5hYmxlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUih0YXAsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3RhcCwgcG9kX3NldF90YXApOwotc3RhdGljIERFVklDRV9BVFRSKHZvbHVtZV90d2Vha19wZWRhbF9hc3NpZ24sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3ZvbHVtZV90d2Vha19wZWRhbF9hc3NpZ24sIHBvZF9zZXRfdm9sdW1lX3R3ZWFrX3BlZGFsX2Fzc2lnbik7Ci1zdGF0aWMgREVWSUNFX0FUVFIoYmFuZF81X2ZyZXF1ZW5jeSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF81X2ZyZXF1ZW5jeSwgcG9kX3NldF9iYW5kXzVfZnJlcXVlbmN5KTsKK3N0YXRpYyBERVZJQ0VfQVRUUih2b2x1bWVfdHdlYWtfcGVkYWxfYXNzaWduLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF92b2x1bWVfdHdlYWtfcGVkYWxfYXNzaWduLAorCQkgICBwb2Rfc2V0X3ZvbHVtZV90d2Vha19wZWRhbF9hc3NpZ24pOworc3RhdGljIERFVklDRV9BVFRSKGJhbmRfNV9mcmVxdWVuY3ksIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X2JhbmRfNV9mcmVxdWVuY3ksIHBvZF9zZXRfYmFuZF81X2ZyZXF1ZW5jeSk7CiBzdGF0aWMgREVWSUNFX0FUVFIodHVuZXIsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3R1bmVyLCBwb2Rfc2V0X3R1bmVyKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihtaWNfc2VsZWN0aW9uLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9taWNfc2VsZWN0aW9uLCBwb2Rfc2V0X21pY19zZWxlY3Rpb24pOwotc3RhdGljIERFVklDRV9BVFRSKGNhYmluZXRfbW9kZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2NhYmluZXRfbW9kZWwsIHBvZF9zZXRfY2FiaW5ldF9tb2RlbCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfbW9kZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX21vZGVsLCBwb2Rfc2V0X3N0b21wX21vZGVsKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihyb29tbGV2ZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3Jvb21sZXZlbCwgcG9kX3NldF9yb29tbGV2ZWwpOwotc3RhdGljIERFVklDRV9BVFRSKGJhbmRfNF9mcmVxdWVuY3ksIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2JhbmRfNF9mcmVxdWVuY3ksIHBvZF9zZXRfYmFuZF80X2ZyZXF1ZW5jeSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoYmFuZF82X2ZyZXF1ZW5jeSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF82X2ZyZXF1ZW5jeSwgcG9kX3NldF9iYW5kXzZfZnJlcXVlbmN5KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihzdG9tcF9wYXJhbV8xX25vdGVfdmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX3BhcmFtXzFfbm90ZV92YWx1ZSwgcG9kX3NldF9zdG9tcF9wYXJhbV8xX25vdGVfdmFsdWUpOwotc3RhdGljIERFVklDRV9BVFRSKHN0b21wX3BhcmFtXzIsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX3BhcmFtXzIsIHBvZF9zZXRfc3RvbXBfcGFyYW1fMik7Ci1zdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfcGFyYW1fMywgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfc3RvbXBfcGFyYW1fMywgcG9kX3NldF9zdG9tcF9wYXJhbV8zKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihzdG9tcF9wYXJhbV80LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9zdG9tcF9wYXJhbV80LCBwb2Rfc2V0X3N0b21wX3BhcmFtXzQpOwotc3RhdGljIERFVklDRV9BVFRSKHN0b21wX3BhcmFtXzUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX3BhcmFtXzUsIHBvZF9zZXRfc3RvbXBfcGFyYW1fNSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfcGFyYW1fNiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfc3RvbXBfcGFyYW1fNiwgcG9kX3NldF9zdG9tcF9wYXJhbV82KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihhbXBfc3dpdGNoX3NlbGVjdCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYW1wX3N3aXRjaF9zZWxlY3QsIHBvZF9zZXRfYW1wX3N3aXRjaF9zZWxlY3QpOwotc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3BhcmFtXzQsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RlbGF5X3BhcmFtXzQsIHBvZF9zZXRfZGVsYXlfcGFyYW1fNCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfcGFyYW1fNSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfcGFyYW1fNSwgcG9kX3NldF9kZWxheV9wYXJhbV81KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihkZWxheV9wcmVfcG9zdCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfcHJlX3Bvc3QsIHBvZF9zZXRfZGVsYXlfcHJlX3Bvc3QpOwotc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X21vZGVsLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9tb2RlbCwgcG9kX3NldF9kZWxheV9tb2RlbCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfdmVyYl9tb2RlbCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfdmVyYl9tb2RlbCwgcG9kX3NldF9kZWxheV92ZXJiX21vZGVsKTsKLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wb19tc2IsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3RlbXBvX21zYiwgcG9kX3NldF90ZW1wb19tc2IpOwotc3RhdGljIERFVklDRV9BVFRSKHRlbXBvX2xzYiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfdGVtcG9fbHNiLCBwb2Rfc2V0X3RlbXBvX2xzYik7Ci1zdGF0aWMgREVWSUNFX0FUVFIod2FoX21vZGVsLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF93YWhfbW9kZWwsIHBvZF9zZXRfd2FoX21vZGVsKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihieXBhc3Nfdm9sdW1lLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9ieXBhc3Nfdm9sdW1lLCBwb2Rfc2V0X2J5cGFzc192b2x1bWUpOwotc3RhdGljIERFVklDRV9BVFRSKGZ4X2xvb3Bfb25fb2ZmLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9meF9sb29wX29uX29mZiwgcG9kX3NldF9meF9sb29wX29uX29mZik7Ci1zdGF0aWMgREVWSUNFX0FUVFIodHdlYWtfcGFyYW1fc2VsZWN0LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF90d2Vha19wYXJhbV9zZWxlY3QsIHBvZF9zZXRfdHdlYWtfcGFyYW1fc2VsZWN0KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihhbXAxX2VuZ2FnZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYW1wMV9lbmdhZ2UsIHBvZF9zZXRfYW1wMV9lbmdhZ2UpOwotc3RhdGljIERFVklDRV9BVFRSKGJhbmRfMV9nYWluLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzFfZ2FpbiwgcG9kX3NldF9iYW5kXzFfZ2Fpbik7Ci1zdGF0aWMgREVWSUNFX0FUVFIyKGJhbmRfMl9nYWluX19iYXNzLCBiYW5kXzJfZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF8yX2dhaW5fX2Jhc3MsIHBvZF9zZXRfYmFuZF8yX2dhaW5fX2Jhc3MpOwotc3RhdGljIERFVklDRV9BVFRSKGJhbmRfMl9nYWluLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzJfZ2FpbiwgcG9kX3NldF9iYW5kXzJfZ2Fpbik7Ci1zdGF0aWMgREVWSUNFX0FUVFIyKGJhbmRfM19nYWluX19iYXNzLCBiYW5kXzNfZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF8zX2dhaW5fX2Jhc3MsIHBvZF9zZXRfYmFuZF8zX2dhaW5fX2Jhc3MpOwotc3RhdGljIERFVklDRV9BVFRSKGJhbmRfM19nYWluLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzNfZ2FpbiwgcG9kX3NldF9iYW5kXzNfZ2Fpbik7Ci1zdGF0aWMgREVWSUNFX0FUVFIyKGJhbmRfNF9nYWluX19iYXNzLCBiYW5kXzRfZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF80X2dhaW5fX2Jhc3MsIHBvZF9zZXRfYmFuZF80X2dhaW5fX2Jhc3MpOwotc3RhdGljIERFVklDRV9BVFRSMihiYW5kXzVfZ2Fpbl9fYmFzcywgYmFuZF81X2dhaW4sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2JhbmRfNV9nYWluX19iYXNzLCBwb2Rfc2V0X2JhbmRfNV9nYWluX19iYXNzKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihiYW5kXzRfZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF80X2dhaW4sIHBvZF9zZXRfYmFuZF80X2dhaW4pOwotc3RhdGljIERFVklDRV9BVFRSMihiYW5kXzZfZ2Fpbl9fYmFzcywgYmFuZF82X2dhaW4sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2JhbmRfNl9nYWluX19iYXNzLCBwb2Rfc2V0X2JhbmRfNl9nYWluX19iYXNzKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihtaWNfc2VsZWN0aW9uLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9taWNfc2VsZWN0aW9uLAorCQkgICBwb2Rfc2V0X21pY19zZWxlY3Rpb24pOworc3RhdGljIERFVklDRV9BVFRSKGNhYmluZXRfbW9kZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2NhYmluZXRfbW9kZWwsCisJCSAgIHBvZF9zZXRfY2FiaW5ldF9tb2RlbCk7CitzdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfbW9kZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX21vZGVsLAorCQkgICBwb2Rfc2V0X3N0b21wX21vZGVsKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihyb29tbGV2ZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3Jvb21sZXZlbCwKKwkJICAgcG9kX3NldF9yb29tbGV2ZWwpOworc3RhdGljIERFVklDRV9BVFRSKGJhbmRfNF9mcmVxdWVuY3ksIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X2JhbmRfNF9mcmVxdWVuY3ksIHBvZF9zZXRfYmFuZF80X2ZyZXF1ZW5jeSk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmFuZF82X2ZyZXF1ZW5jeSwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfYmFuZF82X2ZyZXF1ZW5jeSwgcG9kX3NldF9iYW5kXzZfZnJlcXVlbmN5KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzdG9tcF9wYXJhbV8xX25vdGVfdmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X3N0b21wX3BhcmFtXzFfbm90ZV92YWx1ZSwKKwkJICAgcG9kX3NldF9zdG9tcF9wYXJhbV8xX25vdGVfdmFsdWUpOworc3RhdGljIERFVklDRV9BVFRSKHN0b21wX3BhcmFtXzIsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX3BhcmFtXzIsCisJCSAgIHBvZF9zZXRfc3RvbXBfcGFyYW1fMik7CitzdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfcGFyYW1fMywgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfc3RvbXBfcGFyYW1fMywKKwkJICAgcG9kX3NldF9zdG9tcF9wYXJhbV8zKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzdG9tcF9wYXJhbV80LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9zdG9tcF9wYXJhbV80LAorCQkgICBwb2Rfc2V0X3N0b21wX3BhcmFtXzQpOworc3RhdGljIERFVklDRV9BVFRSKHN0b21wX3BhcmFtXzUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX3BhcmFtXzUsCisJCSAgIHBvZF9zZXRfc3RvbXBfcGFyYW1fNSk7CitzdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfcGFyYW1fNiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfc3RvbXBfcGFyYW1fNiwKKwkJICAgcG9kX3NldF9zdG9tcF9wYXJhbV82KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhbXBfc3dpdGNoX3NlbGVjdCwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfYW1wX3N3aXRjaF9zZWxlY3QsIHBvZF9zZXRfYW1wX3N3aXRjaF9zZWxlY3QpOworc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3BhcmFtXzQsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RlbGF5X3BhcmFtXzQsCisJCSAgIHBvZF9zZXRfZGVsYXlfcGFyYW1fNCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfcGFyYW1fNSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfcGFyYW1fNSwKKwkJICAgcG9kX3NldF9kZWxheV9wYXJhbV81KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkZWxheV9wcmVfcG9zdCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfcHJlX3Bvc3QsCisJCSAgIHBvZF9zZXRfZGVsYXlfcHJlX3Bvc3QpOworc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X21vZGVsLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9tb2RlbCwKKwkJICAgcG9kX3NldF9kZWxheV9tb2RlbCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfdmVyYl9tb2RlbCwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfZGVsYXlfdmVyYl9tb2RlbCwgcG9kX3NldF9kZWxheV92ZXJiX21vZGVsKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wb19tc2IsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3RlbXBvX21zYiwKKwkJICAgcG9kX3NldF90ZW1wb19tc2IpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXBvX2xzYiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfdGVtcG9fbHNiLAorCQkgICBwb2Rfc2V0X3RlbXBvX2xzYik7CitzdGF0aWMgREVWSUNFX0FUVFIod2FoX21vZGVsLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF93YWhfbW9kZWwsCisJCSAgIHBvZF9zZXRfd2FoX21vZGVsKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihieXBhc3Nfdm9sdW1lLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9ieXBhc3Nfdm9sdW1lLAorCQkgICBwb2Rfc2V0X2J5cGFzc192b2x1bWUpOworc3RhdGljIERFVklDRV9BVFRSKGZ4X2xvb3Bfb25fb2ZmLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9meF9sb29wX29uX29mZiwKKwkJICAgcG9kX3NldF9meF9sb29wX29uX29mZik7CitzdGF0aWMgREVWSUNFX0FUVFIodHdlYWtfcGFyYW1fc2VsZWN0LCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF90d2Vha19wYXJhbV9zZWxlY3QsIHBvZF9zZXRfdHdlYWtfcGFyYW1fc2VsZWN0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhbXAxX2VuZ2FnZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYW1wMV9lbmdhZ2UsCisJCSAgIHBvZF9zZXRfYW1wMV9lbmdhZ2UpOworc3RhdGljIERFVklDRV9BVFRSKGJhbmRfMV9nYWluLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzFfZ2FpbiwKKwkJICAgcG9kX3NldF9iYW5kXzFfZ2Fpbik7CitzdGF0aWMgREVWSUNFX0FUVFIyKGJhbmRfMl9nYWluX19iYXNzLCBiYW5kXzJfZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgICBwb2RfZ2V0X2JhbmRfMl9nYWluX19iYXNzLCBwb2Rfc2V0X2JhbmRfMl9nYWluX19iYXNzKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihiYW5kXzJfZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF8yX2dhaW4sCisJCSAgIHBvZF9zZXRfYmFuZF8yX2dhaW4pOworc3RhdGljIERFVklDRV9BVFRSMihiYW5kXzNfZ2Fpbl9fYmFzcywgYmFuZF8zX2dhaW4sIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICAgcG9kX2dldF9iYW5kXzNfZ2Fpbl9fYmFzcywgcG9kX3NldF9iYW5kXzNfZ2Fpbl9fYmFzcyk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmFuZF8zX2dhaW4sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2JhbmRfM19nYWluLAorCQkgICBwb2Rfc2V0X2JhbmRfM19nYWluKTsKK3N0YXRpYyBERVZJQ0VfQVRUUjIoYmFuZF80X2dhaW5fX2Jhc3MsIGJhbmRfNF9nYWluLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgIHBvZF9nZXRfYmFuZF80X2dhaW5fX2Jhc3MsIHBvZF9zZXRfYmFuZF80X2dhaW5fX2Jhc3MpOworc3RhdGljIERFVklDRV9BVFRSMihiYW5kXzVfZ2Fpbl9fYmFzcywgYmFuZF81X2dhaW4sIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICAgcG9kX2dldF9iYW5kXzVfZ2Fpbl9fYmFzcywgcG9kX3NldF9iYW5kXzVfZ2Fpbl9fYmFzcyk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmFuZF80X2dhaW4sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2JhbmRfNF9nYWluLAorCQkgICBwb2Rfc2V0X2JhbmRfNF9nYWluKTsKK3N0YXRpYyBERVZJQ0VfQVRUUjIoYmFuZF82X2dhaW5fX2Jhc3MsIGJhbmRfNl9nYWluLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgIHBvZF9nZXRfYmFuZF82X2dhaW5fX2Jhc3MsIHBvZF9zZXRfYmFuZF82X2dhaW5fX2Jhc3MpOwogc3RhdGljIERFVklDRV9BVFRSKGJvZHksIFNfSVJVR08sIHZhcmlheF9nZXRfYm9keSwgbGluZTZfbm9wX3dyaXRlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXAxX2VuYWJsZSwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAxX2VuYWJsZSwgbGluZTZfbm9wX3dyaXRlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXAxX3R5cGUsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwMV90eXBlLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDFfcG9zaXRpb24sIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwMV9wb3NpdGlvbiwgbGluZTZfbm9wX3dyaXRlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXAxX2FuZ2xlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDFfYW5nbGUsIGxpbmU2X25vcF93cml0ZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMV9sZXZlbCwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAxX2xldmVsLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDJfZW5hYmxlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDJfZW5hYmxlLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDJfdHlwZSwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAyX3R5cGUsIGxpbmU2X25vcF93cml0ZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMl9wb3NpdGlvbiwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAyX3Bvc2l0aW9uLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDJfYW5nbGUsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwMl9hbmdsZSwgbGluZTZfbm9wX3dyaXRlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXAyX2xldmVsLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDJfbGV2ZWwsIGxpbmU2X25vcF93cml0ZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocGlja3VwX3BoYXNlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cF9waGFzZSwgbGluZTZfbm9wX3dyaXRlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihjYXBhY2l0YW5jZSwgU19JUlVHTywgdmFyaWF4X2dldF9jYXBhY2l0YW5jZSwgbGluZTZfbm9wX3dyaXRlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUih0b25lX3Jlc2lzdGFuY2UsIFNfSVJVR08sIHZhcmlheF9nZXRfdG9uZV9yZXNpc3RhbmNlLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHZvbHVtZV9yZXNpc3RhbmNlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3ZvbHVtZV9yZXNpc3RhbmNlLCBsaW5lNl9ub3Bfd3JpdGUpOworc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDFfZW5hYmxlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDFfZW5hYmxlLAorCQkgICBsaW5lNl9ub3Bfd3JpdGUpOworc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDFfdHlwZSwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAxX3R5cGUsCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMV9wb3NpdGlvbiwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAxX3Bvc2l0aW9uLAorCQkgICBsaW5lNl9ub3Bfd3JpdGUpOworc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDFfYW5nbGUsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwMV9hbmdsZSwKKwkJICAgbGluZTZfbm9wX3dyaXRlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXAxX2xldmVsLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDFfbGV2ZWwsCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMl9lbmFibGUsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwMl9lbmFibGUsCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMl90eXBlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDJfdHlwZSwKKwkJICAgbGluZTZfbm9wX3dyaXRlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXAyX3Bvc2l0aW9uLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDJfcG9zaXRpb24sCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMl9hbmdsZSwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAyX2FuZ2xlLAorCQkgICBsaW5lNl9ub3Bfd3JpdGUpOworc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDJfbGV2ZWwsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwMl9sZXZlbCwKKwkJICAgbGluZTZfbm9wX3dyaXRlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXBfcGhhc2UsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwX3BoYXNlLAorCQkgICBsaW5lNl9ub3Bfd3JpdGUpOworc3RhdGljIERFVklDRV9BVFRSKGNhcGFjaXRhbmNlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X2NhcGFjaXRhbmNlLAorCQkgICBsaW5lNl9ub3Bfd3JpdGUpOworc3RhdGljIERFVklDRV9BVFRSKHRvbmVfcmVzaXN0YW5jZSwgU19JUlVHTywgdmFyaWF4X2dldF90b25lX3Jlc2lzdGFuY2UsCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIodm9sdW1lX3Jlc2lzdGFuY2UsIFNfSVJVR08sIHZhcmlheF9nZXRfdm9sdW1lX3Jlc2lzdGFuY2UsCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIodGFwZXIsIFNfSVJVR08sIHZhcmlheF9nZXRfdGFwZXIsIGxpbmU2X25vcF93cml0ZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIodG9uZV9kdW1wLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3RvbmVfZHVtcCwgbGluZTZfbm9wX3dyaXRlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihzYXZlX3RvbmUsIFNfSVJVR08sIHZhcmlheF9nZXRfc2F2ZV90b25lLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHZvbHVtZV9kdW1wLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3ZvbHVtZV9kdW1wLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHR1bmluZ19lbmFibGUsIFNfSVJVR08sIHZhcmlheF9nZXRfdHVuaW5nX2VuYWJsZSwgbGluZTZfbm9wX3dyaXRlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih2b2x1bWVfZHVtcCwgU19JUlVHTywgdmFyaWF4X2dldF92b2x1bWVfZHVtcCwKKwkJICAgbGluZTZfbm9wX3dyaXRlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0dW5pbmdfZW5hYmxlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3R1bmluZ19lbmFibGUsCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIodHVuaW5nNiwgU19JUlVHTywgdmFyaWF4X2dldF90dW5pbmc2LCBsaW5lNl9ub3Bfd3JpdGUpOwogc3RhdGljIERFVklDRV9BVFRSKHR1bmluZzUsIFNfSVJVR08sIHZhcmlheF9nZXRfdHVuaW5nNSwgbGluZTZfbm9wX3dyaXRlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUih0dW5pbmc0LCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3R1bmluZzQsIGxpbmU2X25vcF93cml0ZSk7CkBAIC0zOTksNyArNTI3LDggQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihtaXgzLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X21peDMsIGxpbmU2X25vcF93cml0ZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIobWl4MiwgU19JUlVHTywgdmFyaWF4X2dldF9taXgyLCBsaW5lNl9ub3Bfd3JpdGUpOwogc3RhdGljIERFVklDRV9BVFRSKG1peDEsIFNfSVJVR08sIHZhcmlheF9nZXRfbWl4MSwgbGluZTZfbm9wX3dyaXRlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXBfd2lyaW5nLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cF93aXJpbmcsIGxpbmU2X25vcF93cml0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocGlja3VwX3dpcmluZywgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXBfd2lyaW5nLAorCQkgICBsaW5lNl9ub3Bfd3JpdGUpOwogCiBpbnQgcG9kX2NyZWF0ZV9maWxlcyhpbnQgZmlybXdhcmUsIGludCB0eXBlLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC00MDcsNyArNTM2LDggQEAKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3R3ZWFrKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl93YWhfcG9zaXRpb24pKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19QT0RYVEFMTCkpICE9IDApCi0JCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfY29tcHJlc3Npb25fZ2FpbikpOworCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkgICAgIChkZXYsICZkZXZfYXR0cl9jb21wcmVzc2lvbl9nYWluKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl92b2xfcGVkYWxfcG9zaXRpb24pKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2NvbXByZXNzaW9uX3RocmVzaG9sZCkpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcGFuKSk7CkBAIC00MjksNyArNTU5LDggQEAKIAkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9yZXZlcmJfbWl4KSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9lZmZlY3Rfc2V0dXApKTsKIAlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfMV9mcmVxdWVuY3kpKTsKKwkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfYmFuZF8xX2ZyZXF1ZW5jeSkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX1BPRFhUQUxMKSkgIT0gMCkKIAkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9wcmVzZW5jZSkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCkBAIC00NDMsMTAgKzU3NCwxMiBAQAogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfZW5hYmxlKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9tb2RfcGFyYW1fMSkpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfcGFyYW1fMSkpOwotCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfcGFyYW1fMV9ub3RlX3ZhbHVlKSk7CisJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkgICAgIChkZXYsICZkZXZfYXR0cl9kZWxheV9wYXJhbV8xX25vdGVfdmFsdWUpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzJfZnJlcXVlbmN5X19iYXNzKSk7CisJCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfYmFuZF8yX2ZyZXF1ZW5jeV9fYmFzcykpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfcGFyYW1fMikpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfdm9sdW1lX21peCkpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfcGFyYW1fMykpOwpAQCAtNDU5LDI2ICs1OTIsMzQgQEAKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19QT0RYVEFMTCkpICE9IDApCiAJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmV2ZXJiX3RvbmUpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19QT0RYVEFMTCkpICE9IDApCi0JCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmV2ZXJiX3ByZV9kZWxheSkpOworCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkgICAgIChkZXYsICZkZXZfYXR0cl9yZXZlcmJfcHJlX2RlbGF5KSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfUE9EWFRBTEwpKSAhPSAwKQotCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3JldmVyYl9wcmVfcG9zdCkpOworCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkgICAgIChkZXYsICZkZXZfYXR0cl9yZXZlcmJfcHJlX3Bvc3QpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19QT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfMl9mcmVxdWVuY3kpKTsKKwkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCQkgICAgIChkZXYsICZkZXZfYXR0cl9iYW5kXzJfZnJlcXVlbmN5KSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfQkFTU1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF8zX2ZyZXF1ZW5jeV9fYmFzcykpOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2JhbmRfM19mcmVxdWVuY3lfX2Jhc3MpKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3dhaF9lbmFibGUpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQotCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX21vZHVsYXRpb25fbG9fY3V0KSk7CisJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCSAgICAgKGRldiwgJmRldl9hdHRyX21vZHVsYXRpb25fbG9fY3V0KSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfQkFTU1BPRFhUQUxMKSkgIT0gMCkKLQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9yZXZlcmJfbG9fY3V0KSk7CisJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCSAgICAgKGRldiwgJmRldl9hdHRyX2RlbGF5X3JldmVyYl9sb19jdXQpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19QT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3ZvbHVtZV9wZWRhbF9taW5pbXVtKSk7CisJCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfdm9sdW1lX3BlZGFsX21pbmltdW0pKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9lcV9wcmVfcG9zdCkpOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2VxX3ByZV9wb3N0KSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl92b2x1bWVfcHJlX3Bvc3QpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQogCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2RpX21vZGVsKSk7CkBAIC00OTYsMTkgKzYzNywyNSBAQAogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfbW9kdWxhdGlvbl9tb2RlbCkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF8zX2ZyZXF1ZW5jeSkpOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2JhbmRfM19mcmVxdWVuY3kpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzRfZnJlcXVlbmN5X19iYXNzKSk7Ci0JQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9tb2RfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uKSk7Ci0JQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24pKTsKKwkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCQkgICAgIChkZXYsICZkZXZfYXR0cl9iYW5kXzRfZnJlcXVlbmN5X19iYXNzKSk7CisJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkgICAgIChkZXYsICZkZXZfYXR0cl9tb2RfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uKSk7CisJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkgICAgIChkZXYsICZkZXZfYXR0cl9kZWxheV9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24pKTsKIAlpZiAoZmlybXdhcmUgPj0gMjAwKQogCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2VxX2VuYWJsZSkpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdGFwKSk7Ci0JQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl92b2x1bWVfdHdlYWtfcGVkYWxfYXNzaWduKSk7CisJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkgICAgIChkZXYsICZkZXZfYXR0cl92b2x1bWVfdHdlYWtfcGVkYWxfYXNzaWduKSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfQkFTU1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF81X2ZyZXF1ZW5jeSkpOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2JhbmRfNV9mcmVxdWVuY3kpKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3R1bmVyKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9taWNfc2VsZWN0aW9uKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9jYWJpbmV0X21vZGVsKSk7CkBAIC01MTYsMjUgKzY2MywzMCBAQAogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcm9vbWxldmVsKSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzRfZnJlcXVlbmN5KSk7CisJCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfYmFuZF80X2ZyZXF1ZW5jeSkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfNl9mcmVxdWVuY3kpKTsKLQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3N0b21wX3BhcmFtXzFfbm90ZV92YWx1ZSkpOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2JhbmRfNl9mcmVxdWVuY3kpKTsKKwlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCSAgICAgKGRldiwgJmRldl9hdHRyX3N0b21wX3BhcmFtXzFfbm90ZV92YWx1ZSkpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc3RvbXBfcGFyYW1fMikpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc3RvbXBfcGFyYW1fMykpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc3RvbXBfcGFyYW1fNCkpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc3RvbXBfcGFyYW1fNSkpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc3RvbXBfcGFyYW1fNikpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0xJVkUpKSAhPSAwKQotCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2FtcF9zd2l0Y2hfc2VsZWN0KSk7CisJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCSAgICAgKGRldiwgJmRldl9hdHRyX2FtcF9zd2l0Y2hfc2VsZWN0KSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9wYXJhbV80KSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9wYXJhbV81KSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9wcmVfcG9zdCkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX1BPRFhUQUxMKSkgIT0gMCkKIAkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9tb2RlbCkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCi0JCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfdmVyYl9tb2RlbCkpOworCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkgICAgIChkZXYsICZkZXZfYXR0cl9kZWxheV92ZXJiX21vZGVsKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl90ZW1wb19tc2IpKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3RlbXBvX2xzYikpOwogCWlmIChmaXJtd2FyZSA+PSAzMDApCkBAIC01NDksMzAgKzcwMSwzOSBAQAogCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfMV9nYWluKSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfQkFTU1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF8yX2dhaW5fX2Jhc3MpKTsKKwkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCQkgICAgIChkZXYsICZkZXZfYXR0cl9iYW5kXzJfZ2Fpbl9fYmFzcykpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF8yX2dhaW4pKTsKKwkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCQkgICAgIChkZXYsICZkZXZfYXR0cl9iYW5kXzJfZ2FpbikpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfM19nYWluX19iYXNzKSk7CisJCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfYmFuZF8zX2dhaW5fX2Jhc3MpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19QT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfM19nYWluKSk7CisJCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfYmFuZF8zX2dhaW4pKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzRfZ2Fpbl9fYmFzcykpOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2JhbmRfNF9nYWluX19iYXNzKSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfQkFTU1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF81X2dhaW5fX2Jhc3MpKTsKKwkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCQkgICAgIChkZXYsICZkZXZfYXR0cl9iYW5kXzVfZ2Fpbl9fYmFzcykpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF80X2dhaW4pKTsKKwkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCQkgICAgIChkZXYsICZkZXZfYXR0cl9iYW5kXzRfZ2FpbikpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfNl9nYWluX19iYXNzKSk7Ci0gIHJldHVybiAwOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2JhbmRfNl9nYWluX19iYXNzKSk7CisJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHBvZF9jcmVhdGVfZmlsZXMpOwogCiB2b2lkIHBvZF9yZW1vdmVfZmlsZXMoaW50IGZpcm13YXJlLCBpbnQgdHlwZSwgc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtNjE4LDcgKzc3OSw4IEBACiAJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2RlbGF5X3BhcmFtXzFfbm90ZV92YWx1ZSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfQkFTU1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzJfZnJlcXVlbmN5X19iYXNzKTsKKwkJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsCisJCQkJCSAgICZkZXZfYXR0cl9iYW5kXzJfZnJlcXVlbmN5X19iYXNzKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfcGFyYW1fMik7CiAJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2RlbGF5X3ZvbHVtZV9taXgpOwogCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9wYXJhbV8zKTsKQEAgLTYzOSw3ICs4MDEsOCBAQAogCQkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfMl9mcmVxdWVuY3kpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF8zX2ZyZXF1ZW5jeV9fYmFzcyk7CisJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LAorCQkJCQkgICAmZGV2X2F0dHJfYmFuZF8zX2ZyZXF1ZW5jeV9fYmFzcyk7CiAJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3dhaF9lbmFibGUpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCiAJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9tb2R1bGF0aW9uX2xvX2N1dCk7CkBAIC02NzEsNyArODM0LDggQEAKIAkJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzNfZnJlcXVlbmN5KTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfNF9mcmVxdWVuY3lfX2Jhc3MpOworCQkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwKKwkJCQkJICAgJmRldl9hdHRyX2JhbmRfNF9mcmVxdWVuY3lfX2Jhc3MpOwogCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9tb2RfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uKTsKIAlpZiAoZmlybXdhcmUgPj0gMjAwKQpAQCAtNzQ0LDggKzkwOCw2IEBACiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCiAJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF82X2dhaW5fX2Jhc3MpOwogfQotCi1FWFBPUlRfU1lNQk9MKHBvZF9jcmVhdGVfZmlsZXMpOwogRVhQT1JUX1NZTUJPTChwb2RfcmVtb3ZlX2ZpbGVzKTsKIAogaW50IHZhcmlheF9jcmVhdGVfZmlsZXMoaW50IGZpcm13YXJlLCBpbnQgdHlwZSwgc3RydWN0IGRldmljZSAqZGV2KQpAQCAtNzkwLDggKzk1Miw5IEBACiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9taXgyKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9taXgxKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9waWNrdXBfd2lyaW5nKSk7Ci0gIHJldHVybiAwOworCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTCh2YXJpYXhfY3JlYXRlX2ZpbGVzKTsKIAogdm9pZCB2YXJpYXhfcmVtb3ZlX2ZpbGVzKGludCBmaXJtd2FyZSwgaW50IHR5cGUsIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTgzNSw2ICs5OTgsNCBAQAogCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9taXgxKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcGlja3VwX3dpcmluZyk7CiB9Ci0KLUVYUE9SVF9TWU1CT0wodmFyaWF4X2NyZWF0ZV9maWxlcyk7CiBFWFBPUlRfU1lNQk9MKHZhcmlheF9yZW1vdmVfZmlsZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2RyaXZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2RyaXZlci5jCmluZGV4IGYxODhlY2UuLmU0MDc4YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvZHJpdmVyLmMKQEAgLTE2OCwxOSArMTY4LDE5IEBACiAjZW5kaWYKIAogLyoKLQlTZW5kIHJhdyBtZXNzYWdlIGluIHBpZWNlcyBvZiB3TWF4UGFja2V0U2l6ZSBieXRlcy4KKwlTZW5kIHJhdyBtZXNzYWdlIGluIHBpZWNlcyBvZiBtYXhfcGFja2V0X3NpemUgYnl0ZXMuCiAqLwogaW50IGxpbmU2X3NlbmRfcmF3X21lc3NhZ2Uoc3RydWN0IHVzYl9saW5lNiAqbGluZTYsIGNvbnN0IGNoYXIgKmJ1ZmZlciwKIAkJCSAgIGludCBzaXplKQogewogCWludCBpLCBkb25lID0gMDsKKwlpbnQgYWN0dWFsX3NpemU7CiAKICNpZiBET19EVU1QX1VSQl9TRU5ECiAJbGluZTZfd3JpdGVfaGV4ZHVtcChsaW5lNiwgJ1MnLCBidWZmZXIsIHNpemUpOwogI2VuZGlmCiAKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBsaW5lNi0+bWF4X3BhY2tldF9zaXplKSB7Ci0JCWludCBwYXJ0aWFsOworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IGFjdHVhbF9zaXplKSB7CiAJCWNvbnN0IGNoYXIgKmZyYWdfYnVmID0gYnVmZmVyICsgaTsKIAkJaW50IGZyYWdfc2l6ZSA9IG1pbihsaW5lNi0+bWF4X3BhY2tldF9zaXplLCBzaXplIC0gaSk7CiAJCWludCByZXR2YWw7CkBAIC0xODksNyArMTg5LDcgQEAKIAkJCQkJICAgdXNiX3NuZGludHBpcGUobGluZTYtPnVzYmRldiwKIAkJCQkJCQkgIGxpbmU2LT5lcF9jb250cm9sX3dyaXRlKSwKIAkJCQkJICAgKGNoYXIgKilmcmFnX2J1ZiwgZnJhZ19zaXplLAotCQkJCQkgICAmcGFydGlhbCwgTElORTZfVElNRU9VVCAqIEhaKTsKKwkJCQkJICAgJmFjdHVhbF9zaXplLCBMSU5FNl9USU1FT1VUICogSFopOwogCiAJCWlmIChyZXR2YWwpIHsKIAkJCWRldl9lcnIobGluZTYtPmlmY2RldiwKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlkb25lICs9IGZyYWdfc2l6ZTsKKwkJZG9uZSArPSBhY3R1YWxfc2l6ZTsKIAl9CiAKIAlyZXR1cm4gZG9uZTsKQEAgLTM5NSwxNyArMzk1LDQ0IEBACiAJbGluZTZfc3RhcnRfbGlzdGVuKGxpbmU2KTsKIH0KIAorc3RhdGljIGludCBsaW5lNl9zZW5kKHN0cnVjdCB1c2JfbGluZTYgKmxpbmU2LCB1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBpbnQgcGFydGlhbDsKKworI2lmIERPX0RVTVBfVVJCX1NFTkQKKwlsaW5lNl93cml0ZV9oZXhkdW1wKGxpbmU2LCAnUycsIGJ1ZiwgbGVuKTsKKyNlbmRpZgorCisJcmV0dmFsID0gdXNiX2ludGVycnVwdF9tc2cobGluZTYtPnVzYmRldiwKKwkJCQkgICB1c2Jfc25kaW50cGlwZShsaW5lNi0+dXNiZGV2LAorCQkJCQkJICBsaW5lNi0+ZXBfY29udHJvbF93cml0ZSksCisJCQkJICAgYnVmLCBsZW4sICZwYXJ0aWFsLAorCQkJCSAgIExJTkU2X1RJTUVPVVQgKiBIWik7CisKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIobGluZTYtPmlmY2RldiwKKwkJCSJ1c2JfaW50ZXJydXB0X21zZyBmYWlsZWQgKCVkKVxuIiwgcmV0dmFsKTsKKwl9CisKKwlpZiAocGFydGlhbCAhPSBsZW4pIHsKKwkJZGV2X2VycihsaW5lNi0+aWZjZGV2LAorCQkJInVzYl9pbnRlcnJ1cHRfbXNnIHNlbnQgcGFydGlhbCBtZXNzYWdlICglZClcbiIsCisJCQkgcmV0dmFsKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCiAvKgogCVNlbmQgY2hhbm5lbCBudW1iZXIgKGkuZS4sIHN3aXRjaCB0byBhIGRpZmZlcmVudCBzb3VuZCkuCiAqLwogaW50IGxpbmU2X3NlbmRfcHJvZ3JhbShzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNiwgaW50IHZhbHVlKQogewotCWludCByZXR2YWw7CiAJdW5zaWduZWQgY2hhciAqYnVmZmVyOwotCXVuc2lnbmVkIGludCBwYXJ0aWFsOworCXNpemVfdCBsZW4gPSAyOwogCi0JYnVmZmVyID0ga21hbGxvYygyLCBHRlBfS0VSTkVMKTsKLQorCWJ1ZmZlciA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZmZlcikgewogCQlkZXZfZXJyKGxpbmU2LT5pZmNkZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC00MTQsMjAgKzQ0MSw3IEBACiAJYnVmZmVyWzBdID0gTElORTZfUFJPR1JBTV9DSEFOR0UgfCBMSU5FNl9DSEFOTkVMX0hPU1Q7CiAJYnVmZmVyWzFdID0gdmFsdWU7CiAKLSNpZiBET19EVU1QX1VSQl9TRU5ECi0JbGluZTZfd3JpdGVfaGV4ZHVtcChsaW5lNiwgJ1MnLCBidWZmZXIsIDIpOwotI2VuZGlmCi0KLQlyZXR2YWwgPSB1c2JfaW50ZXJydXB0X21zZyhsaW5lNi0+dXNiZGV2LAotCQkJCSAgIHVzYl9zbmRpbnRwaXBlKGxpbmU2LT51c2JkZXYsCi0JCQkJCQkgIGxpbmU2LT5lcF9jb250cm9sX3dyaXRlKSwKLQkJCQkgICBidWZmZXIsIDIsICZwYXJ0aWFsLCBMSU5FNl9USU1FT1VUICogSFopOwotCi0JaWYgKHJldHZhbCkKLQkJZGV2X2VycihsaW5lNi0+aWZjZGV2LCAidXNiX2ludGVycnVwdF9tc2cgZmFpbGVkICglZClcbiIsIHJldHZhbCk7Ci0KLQlrZnJlZShidWZmZXIpOwotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIGxpbmU2X3NlbmQobGluZTYsIGJ1ZmZlciwgbGVuKTsKIH0KIAogLyoKQEAgLTQzNSwxMiArNDQ5LDEwIEBACiAqLwogaW50IGxpbmU2X3RyYW5zbWl0X3BhcmFtZXRlcihzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNiwgaW50IHBhcmFtLCBpbnQgdmFsdWUpCiB7Ci0JaW50IHJldHZhbDsKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7Ci0JdW5zaWduZWQgaW50IHBhcnRpYWw7CisJc2l6ZV90IGxlbiA9IDM7CiAKLQlidWZmZXIgPSBrbWFsbG9jKDMsIEdGUF9LRVJORUwpOwotCisJYnVmZmVyID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwogCWlmICghYnVmZmVyKSB7CiAJCWRldl9lcnIobGluZTYtPmlmY2RldiwgIm91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTQ1MCwxOSArNDYyLDcgQEAKIAlidWZmZXJbMV0gPSBwYXJhbTsKIAlidWZmZXJbMl0gPSB2YWx1ZTsKIAotI2lmIERPX0RVTVBfVVJCX1NFTkQKLQlsaW5lNl93cml0ZV9oZXhkdW1wKGxpbmU2LCAnUycsIGJ1ZmZlciwgMyk7Ci0jZW5kaWYKLQotCXJldHZhbCA9IHVzYl9pbnRlcnJ1cHRfbXNnKGxpbmU2LT51c2JkZXYsCi0JCQkJCQkJCQkJCQkJCSB1c2Jfc25kaW50cGlwZShsaW5lNi0+dXNiZGV2LCBsaW5lNi0+ZXBfY29udHJvbF93cml0ZSksCi0JCQkJCQkJCQkJCQkJCSBidWZmZXIsIDMsICZwYXJ0aWFsLCBMSU5FNl9USU1FT1VUICogSFopOwotCi0JaWYgKHJldHZhbCkKLQkJZGV2X2VycihsaW5lNi0+aWZjZGV2LCAidXNiX2ludGVycnVwdF9tc2cgZmFpbGVkICglZClcbiIsIHJldHZhbCk7Ci0KLQlrZnJlZShidWZmZXIpOwotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIGxpbmU2X3NlbmQobGluZTYsIGJ1ZmZlciwgbGVuKTsKIH0KIAogLyoKQEAgLTQ3Niw4ICs0NzYsMTAgQEAKIAogCS8qIHF1ZXJ5IHRoZSBzZXJpYWwgbnVtYmVyOiAqLwogCXJldCA9IHVzYl9jb250cm9sX21zZyh1c2JkZXYsIHVzYl9zbmRjdHJscGlwZSh1c2JkZXYsIDApLCAweDY3LAotCQkJCQkJCQkJCQkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSB8IFVTQl9ESVJfT1VULAotCQkJCQkJCQkJCQkJKGRhdGFsZW4gPDwgOCkgfCAweDIxLCBhZGRyZXNzLCBOVUxMLCAwLCBMSU5FNl9USU1FT1VUICogSFopOworCQkJCSAgICAgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UKKwkJCQkgICAgICB8IFVTQl9ESVJfT1VULAorCQkJCSAgICAgIChkYXRhbGVuIDw8IDgpIHwgMHgyMSwgYWRkcmVzcywKKwkJCQkgICAgICBOVUxMLCAwLCBMSU5FNl9USU1FT1VUICogSFopOwogCiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihsaW5lNi0+aWZjZGV2LCAicmVhZCByZXF1ZXN0IGZhaWxlZCAoZXJyb3IgJWQpXG4iLCByZXQpOwpAQCAtNDk2LDkgKzQ5OCw3IEBACiAJCQkJInJlY2VpdmUgbGVuZ3RoIGZhaWxlZCAoZXJyb3IgJWQpXG4iLCByZXQpOwogCQkJcmV0dXJuIHJldDsKIAkJfQotCX0KLQl3aGlsZSAobGVuID09IDB4ZmYpCi0JCTsKKwl9IHdoaWxlIChsZW4gPT0gMHhmZik7CiAKIAlpZiAobGVuICE9IGRhdGFsZW4pIHsKIAkJLyogc2hvdWxkIGJlIGVxdWFsIG9yIHNvbWV0aGluZyB3ZW50IHdyb25nICovCkBAIC02ODIsMTAgKzY4MiwxNCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIGNoZWNrIHZlbmRvciBhbmQgcHJvZHVjdCBpZCAqLwotCWZvciAoZGV2dHlwZSA9IEFSUkFZX1NJWkUobGluZTZfaWRfdGFibGUpIC0gMTsgZGV2dHlwZS0tOykKLQkJaWYgKChsZTE2X3RvX2NwdSh1c2JkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpID09IGxpbmU2X2lkX3RhYmxlW2RldnR5cGVdLmlkVmVuZG9yKSAmJgotCQkJIChsZTE2X3RvX2NwdSh1c2JkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBsaW5lNl9pZF90YWJsZVtkZXZ0eXBlXS5pZFByb2R1Y3QpKQorCWZvciAoZGV2dHlwZSA9IEFSUkFZX1NJWkUobGluZTZfaWRfdGFibGUpIC0gMTsgZGV2dHlwZS0tOykgeworCQl1MTYgdmVuZG9yID0gbGUxNl90b19jcHUodXNiZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKKwkJdTE2IHByb2R1Y3QgPSBsZTE2X3RvX2NwdSh1c2JkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKworCQlpZiAodmVuZG9yID09IGxpbmU2X2lkX3RhYmxlW2RldnR5cGVdLmlkVmVuZG9yCisJCSAgICAgJiYgcHJvZHVjdCA9PSBsaW5lNl9pZF90YWJsZVtkZXZ0eXBlXS5pZFByb2R1Y3QpCiAJCQlicmVhazsKKwl9CiAKIAlpZiAoZGV2dHlwZSA8IDApCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTAzNiw5ICsxMDQwLDEwIEBACiAKIAkJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiTGluZTYgJXMgbm93IGRpc2Nvbm5lY3RlZFxuIiwgbGluZTYtPnByb3BlcnRpZXMtPm5hbWUpOwogCi0JCWZvciAoaSA9IExJTkU2X01BWF9ERVZJQ0VTOyBpLS07KQorCQlmb3IgKGkgPSBMSU5FNl9NQVhfREVWSUNFUzsgaS0tOykgewogCQkJaWYgKGxpbmU2X2RldmljZXNbaV0gPT0gbGluZTYpCiAJCQkJbGluZTZfZGV2aWNlc1tpXSA9IE5VTEw7CisJCX0KIAl9CiAKIAlsaW5lNl9kZXN0cnVjdChpbnRlcmZhY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L21pZGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9taWRpLmMKaW5kZXggODlhMmIxNy4uNmVmNDQ1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L21pZGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvbWlkaS5jCkBAIC0zMTgsNyArMzE4LDEzIEBACiB7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKIAlzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKLQlpbnQgdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlsaW5lNi0+bGluZTZtaWRpLT5taWRpX21hc2tfdHJhbnNtaXQgPSB2YWx1ZTsKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0zNDQsNyArMzUwLDEzIEBACiB7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKIAlzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKLQlpbnQgdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlsaW5lNi0+bGluZTZtaWRpLT5taWRpX21hc2tfcmVjZWl2ZSA9IHZhbHVlOwogCXJldHVybiBjb3VudDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wY20uYyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wY20uYwppbmRleCBmYzQxMTNmLi5kZDk4MTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcGNtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3BjbS5jCkBAIC0xNTYsNyArMTU2LDggQEAKIAlzdHJjcHkocGNtLT5uYW1lLCBsaW5lNnBjbS0+bGluZTYtPnByb3BlcnRpZXMtPm5hbWUpOwogCiAJLyogc2V0IG9wZXJhdG9ycyAqLwotCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfbGluZTZfcGxheWJhY2tfb3BzKTsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAorCQkJJnNuZF9saW5lNl9wbGF5YmFja19vcHMpOwogCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9saW5lNl9jYXB0dXJlX29wcyk7CiAKIAkvKiBwcmUtYWxsb2NhdGlvbiBvZiBidWZmZXJzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcGxheWJhY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wbGF5YmFjay5jCmluZGV4IGFjYjA2MTIuLjM0MzFmNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wbGF5YmFjay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wbGF5YmFjay5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSAicG9kLmgiCiAjaW5jbHVkZSAicGxheWJhY2suaCIKIAotCiAvKgogCVNvZnR3YXJlIHN0ZXJlbyB2b2x1bWUgY29udHJvbC4KICovCkBAIC0zMCw3ICsyOSw3IEBACiAJaW50IGNobiA9IDA7CiAKIAlpZiAodm9sdW1lWzBdID09IDI1NiAmJiB2b2x1bWVbMV0gPT0gMjU2KQotCQlyZXR1cm47ICAvKiBtYXhpbXVtIHZvbHVtZSAtIG5vIGNoYW5nZSAqLworCQlyZXR1cm47CQkvKiBtYXhpbXVtIHZvbHVtZSAtIG5vIGNoYW5nZSAqLwogCiAJaWYgKGJ5dGVzX3Blcl9mcmFtZSA9PSA0KSB7CiAJCXNob3J0ICpwLCAqYnVmX2VuZDsKQEAgLTY4LDEzICs2NywxNyBAQAogCWludCBpLCB1cmJfc2l6ZSwgdXJiX2ZyYW1lczsKIAlzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJY29uc3QgaW50IGJ5dGVzX3Blcl9mcmFtZSA9IGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5ieXRlc19wZXJfZnJhbWU7Ci0JY29uc3QgaW50IGZyYW1lX2luY3JlbWVudCA9IGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5zbmRfbGluZTZfcmF0ZXMucmF0c1swXS5udW1fbWluOwotCWNvbnN0IGludCBmcmFtZV9mYWN0b3IgPSBsaW5lNnBjbS0+cHJvcGVydGllcy0+c25kX2xpbmU2X3JhdGVzLnJhdHNbMF0uZGVuICogKFVTQl9JTlRFUlZBTFNfUEVSX1NFQ09ORCAvIExJTkU2X0lTT19JTlRFUlZBTCk7CisJY29uc3QgaW50IGZyYW1lX2luY3JlbWVudCA9CisJICAgIGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5zbmRfbGluZTZfcmF0ZXMucmF0c1swXS5udW1fbWluOworCWNvbnN0IGludCBmcmFtZV9mYWN0b3IgPQorCSAgICBsaW5lNnBjbS0+cHJvcGVydGllcy0+c25kX2xpbmU2X3JhdGVzLnJhdHNbMF0uZGVuICoKKwkgICAgKFVTQl9JTlRFUlZBTFNfUEVSX1NFQ09ORCAvIExJTkU2X0lTT19JTlRFUlZBTCk7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlzdHJ1Y3QgdXJiICp1cmJfb3V0OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxpbmU2cGNtLT5sb2NrX2F1ZGlvX291dCwgZmxhZ3MpOwotCWluZGV4ID0gZmluZF9maXJzdF96ZXJvX2JpdCgmbGluZTZwY20tPmFjdGl2ZV91cmJfb3V0LCBMSU5FNl9JU09fQlVGRkVSUyk7CisJaW5kZXggPQorCSAgICBmaW5kX2ZpcnN0X3plcm9fYml0KCZsaW5lNnBjbS0+YWN0aXZlX3VyYl9vdXQsIExJTkU2X0lTT19CVUZGRVJTKTsKIAogCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTElORTZfSVNPX0JVRkZFUlMpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGluZTZwY20tPmxvY2tfYXVkaW9fb3V0LCBmbGFncyk7CkBAIC04OCw3ICs5MSw4IEBACiAJZm9yIChpID0gMDsgaSA8IExJTkU2X0lTT19QQUNLRVRTOyArK2kpIHsKIAkJLyogY29tcHV0ZSBmcmFtZSBzaXplIGZvciBnaXZlbiBzYW1wbGluZyByYXRlICovCiAJCWludCBuLCBmczsKLQkJc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKmZvdXQgPSAmdXJiX291dC0+aXNvX2ZyYW1lX2Rlc2NbaV07CisJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpmb3V0ID0KKwkJICAgICZ1cmJfb3V0LT5pc29fZnJhbWVfZGVzY1tpXTsKIAkJbGluZTZwY20tPmNvdW50X291dCArPSBmcmFtZV9pbmNyZW1lbnQ7CiAJCW4gPSBsaW5lNnBjbS0+Y291bnRfb3V0IC8gZnJhbWVfZmFjdG9yOwogCQlsaW5lNnBjbS0+Y291bnRfb3V0IC09IG4gKiBmcmFtZV9mYWN0b3I7CkBAIC0xMDYsMjUgKzExMCwzNiBAQAogCX0gZWxzZSB7CiAJCWlmIChsaW5lNnBjbS0+cG9zX291dCArIHVyYl9mcmFtZXMgPiBydW50aW1lLT5idWZmZXJfc2l6ZSkgewogCQkJLyoKLQkJCQlUaGUgdHJhbnNmZXJyZWQgYXJlYSBnb2VzIG92ZXIgYnVmZmVyIGJvdW5kYXJ5LAotCQkJCWNvcHkgdGhlIGRhdGEgdG8gdGhlIHRlbXAgYnVmZmVyLgotCQkJKi8KKwkJCSAgIFRoZSB0cmFuc2ZlcnJlZCBhcmVhIGdvZXMgb3ZlciBidWZmZXIgYm91bmRhcnksCisJCQkgICBjb3B5IHRoZSBkYXRhIHRvIHRoZSB0ZW1wIGJ1ZmZlci4KKwkJCSAqLwogCQkJaW50IGxlbjsKIAkJCWxlbiA9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplIC0gbGluZTZwY20tPnBvc19vdXQ7CiAJCQl1cmJfb3V0LT50cmFuc2Zlcl9idWZmZXIgPSBsaW5lNnBjbS0+d3JhcF9vdXQ7CiAKIAkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJbWVtY3B5KGxpbmU2cGNtLT53cmFwX291dCwgcnVudGltZS0+ZG1hX2FyZWEgKyBsaW5lNnBjbS0+cG9zX291dCAqIGJ5dGVzX3Blcl9mcmFtZSwgbGVuICogYnl0ZXNfcGVyX2ZyYW1lKTsKLQkJCQltZW1jcHkobGluZTZwY20tPndyYXBfb3V0ICsgbGVuICogYnl0ZXNfcGVyX2ZyYW1lLCBydW50aW1lLT5kbWFfYXJlYSwgKHVyYl9mcmFtZXMgLSBsZW4pICogYnl0ZXNfcGVyX2ZyYW1lKTsKLQkJCX0gZWxzZQotCQkJCWRldl9lcnIoczJtKHN1YnN0cmVhbSksICJkcml2ZXIgYnVnOiBsZW4gPSAlZFxuIiwgbGVuKTsgIC8qIHRoaXMgaXMgc29tZXdoYXQgcGFyYW5vaWQgKi8KKwkJCQltZW1jcHkobGluZTZwY20tPndyYXBfb3V0LAorCQkJCSAgICAgICBydW50aW1lLT5kbWFfYXJlYSArCisJCQkJICAgICAgIGxpbmU2cGNtLT5wb3Nfb3V0ICogYnl0ZXNfcGVyX2ZyYW1lLAorCQkJCSAgICAgICBsZW4gKiBieXRlc19wZXJfZnJhbWUpOworCQkJCW1lbWNweShsaW5lNnBjbS0+d3JhcF9vdXQgKworCQkJCSAgICAgICBsZW4gKiBieXRlc19wZXJfZnJhbWUsIHJ1bnRpbWUtPmRtYV9hcmVhLAorCQkJCSAgICAgICAodXJiX2ZyYW1lcyAtIGxlbikgKiBieXRlc19wZXJfZnJhbWUpOworCQkJfSBlbHNlIHsKKwkJCQkvKiB0aGlzIGlzIHNvbWV3aGF0IHBhcmFub2lkICovCisJCQkJZGV2X2VycihzMm0oc3Vic3RyZWFtKSwKKwkJCQkJImRyaXZlciBidWc6IGxlbiA9ICVkXG4iLCBsZW4pOworCQkJfQogCQl9IGVsc2UgewogCQkJLyogc2V0IHRoZSBidWZmZXIgcG9pbnRlciAqLwotCQkJdXJiX291dC0+dHJhbnNmZXJfYnVmZmVyID0gcnVudGltZS0+ZG1hX2FyZWEgKyBsaW5lNnBjbS0+cG9zX291dCAqIGJ5dGVzX3Blcl9mcmFtZTsKKwkJCXVyYl9vdXQtPnRyYW5zZmVyX2J1ZmZlciA9CisJCQkgICAgcnVudGltZS0+ZG1hX2FyZWEgKworCQkJICAgIGxpbmU2cGNtLT5wb3Nfb3V0ICogYnl0ZXNfcGVyX2ZyYW1lOwogCQl9CiAJfQogCi0JaWYgKChsaW5lNnBjbS0+cG9zX291dCArPSB1cmJfZnJhbWVzKSA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkKKwlsaW5lNnBjbS0+cG9zX291dCArPSB1cmJfZnJhbWVzOworCWlmIChsaW5lNnBjbS0+cG9zX291dCA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkKIAkJbGluZTZwY20tPnBvc19vdXQgLT0gcnVudGltZS0+YnVmZmVyX3NpemU7CiAKIAl1cmJfb3V0LT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gdXJiX3NpemU7CkBAIC0xMzMsMTUgKzE0OCwxOSBAQAogCiAjaWYgRE9fRFVNUF9QQ01fU0VORAogCWZvciAoaSA9IDA7IGkgPCBMSU5FNl9JU09fUEFDS0VUUzsgKytpKSB7Ci0JCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpmb3V0ID0gJnVyYl9vdXQtPmlzb19mcmFtZV9kZXNjW2ldOwotCQlsaW5lNl93cml0ZV9oZXhkdW1wKGxpbmU2cGNtLT5saW5lNiwgJ1AnLCB1cmJfb3V0LT50cmFuc2Zlcl9idWZmZXIgKyBmb3V0LT5vZmZzZXQsIGZvdXQtPmxlbmd0aCk7CisJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpmb3V0ID0KKwkJICAgICZ1cmJfb3V0LT5pc29fZnJhbWVfZGVzY1tpXTsKKwkJbGluZTZfd3JpdGVfaGV4ZHVtcChsaW5lNnBjbS0+bGluZTYsICdQJywKKwkJCQkgICAgdXJiX291dC0+dHJhbnNmZXJfYnVmZmVyICsgZm91dC0+b2Zmc2V0LAorCQkJCSAgICBmb3V0LT5sZW5ndGgpOwogCX0KICNlbmRpZgogCiAJaWYgKHVzYl9zdWJtaXRfdXJiKHVyYl9vdXQsIEdGUF9BVE9NSUMpID09IDApCiAJCXNldF9iaXQoaW5kZXgsICZsaW5lNnBjbS0+YWN0aXZlX3VyYl9vdXQpOwogCWVsc2UKLQkJZGV2X2VycihzMm0oc3Vic3RyZWFtKSwgIlVSQiBvdXQgIyVkIHN1Ym1pc3Npb24gZmFpbGVkXG4iLCBpbmRleCk7CisJCWRldl9lcnIoczJtKHN1YnN0cmVhbSksICJVUkIgb3V0ICMlZCBzdWJtaXNzaW9uIGZhaWxlZFxuIiwKKwkJCWluZGV4KTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpbmU2cGNtLT5sb2NrX2F1ZGlvX291dCwgZmxhZ3MpOwogCXJldHVybiAwOwpAQCAtMTgxLDcgKzIwMCw3IEBACiB9CiAKIC8qCi0JV2FpdCB1bnRpbCB1bmxpbmtpbmcgb2YgYWxsIGN1cnJlbnRseSBhY3RpdmUgcGxheWJhY2sgVVJCcyBoYXMgYmVlbiBmaW5pc2hlZC4KKyAgIFdhaXQgdW50aWwgdW5saW5raW5nIG9mIGFsbCBjdXJyZW50bHkgYWN0aXZlIHBsYXliYWNrIFVSQnMgaGFzIGJlZW4gZmluaXNoZWQuCiAqLwogc3RhdGljIHZvaWQgd2FpdF9jbGVhcl9hdWRpb19vdXRfdXJicyhzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20pCiB7CkBAIC0yMjQsNyArMjQzLDggQEAKIAlpbnQgaSwgaW5kZXgsIGxlbmd0aCA9IDAsIHNodXRkb3duID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0KKwkgICAgKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqKXVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIApAQCAtMjM0LDEzICsyNTQsMTQgQEAKIAkJCWJyZWFrOwogCiAJaWYgKGluZGV4IDwgMCkKLQkJcmV0dXJuOyAgLyogVVJCIGhhcyBiZWVuIHVubGlua2VkIGFzeW5jaHJvbm91c2x5ICovCisJCXJldHVybjsJCS8qIFVSQiBoYXMgYmVlbiB1bmxpbmtlZCBhc3luY2hyb25vdXNseSAqLwogCiAJZm9yIChpID0gTElORTZfSVNPX1BBQ0tFVFM7IGktLTspCiAJCWxlbmd0aCArPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZsaW5lNnBjbS0+bG9ja19hdWRpb19vdXQsIGZsYWdzKTsKLQlsaW5lNnBjbS0+cG9zX291dF9kb25lICs9IGxlbmd0aCAvIGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5ieXRlc19wZXJfZnJhbWU7CisJbGluZTZwY20tPnBvc19vdXRfZG9uZSArPQorCSAgICBsZW5ndGggLyBsaW5lNnBjbS0+cHJvcGVydGllcy0+Ynl0ZXNfcGVyX2ZyYW1lOwogCiAJaWYgKGxpbmU2cGNtLT5wb3Nfb3V0X2RvbmUgPj0gcnVudGltZS0+YnVmZmVyX3NpemUpCiAJCWxpbmU2cGNtLT5wb3Nfb3V0X2RvbmUgLT0gcnVudGltZS0+YnVmZmVyX3NpemU7CkBAIC0yNjEsNyArMjgyLDggQEAKIAlpZiAoIXNodXRkb3duKSB7CiAJCXN1Ym1pdF9hdWRpb19vdXRfdXJiKHN1YnN0cmVhbSk7CiAKLQkJaWYgKChsaW5lNnBjbS0+Ynl0ZXNfb3V0ICs9IGxlbmd0aCkgPj0gbGluZTZwY20tPnBlcmlvZF9vdXQpIHsKKwkJbGluZTZwY20tPmJ5dGVzX291dCArPSBsZW5ndGg7CisJCWlmIChsaW5lNnBjbS0+Ynl0ZXNfb3V0ID49IGxpbmU2cGNtLT5wZXJpb2Rfb3V0KSB7CiAJCQlsaW5lNnBjbS0+Ynl0ZXNfb3V0IC09IGxpbmU2cGNtLT5wZXJpb2Rfb3V0OwogCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOwogCQl9CkBAIC0yNzYsNyArMjk4LDggQEAKIAlzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAKIAllcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfcmF0ZGVucyhydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKLQkJCQkJICAgICgmbGluZTZwY20tPnByb3BlcnRpZXMtPnNuZF9saW5lNl9yYXRlcykpOworCQkJCQkgICAgKCZsaW5lNnBjbS0+cHJvcGVydGllcy0+CisJCQkJCSAgICAgc25kX2xpbmU2X3JhdGVzKSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTI5MSw3ICszMTQsOCBAQAogfQogCiAvKiBod19wYXJhbXMgcGxheWJhY2sgY2FsbGJhY2sgKi8KLXN0YXRpYyBpbnQgc25kX2xpbmU2X3BsYXliYWNrX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCitzdGF0aWMgaW50IHNuZF9saW5lNl9wbGF5YmFja19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQogewogCWludCByZXQ7CiAJc3RydWN0IHNuZF9saW5lNl9wY20gKmxpbmU2cGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwpAQCAtMzQ5LDcgKzM3Myw4IEBACiAJCQllcnIgPSBzdWJtaXRfYXVkaW9fb3V0X2FsbF91cmJzKHN1YnN0cmVhbSk7CiAKIAkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJY2xlYXJfYml0KEJJVF9SVU5OSU5HX1BMQVlCQUNLLCAmbGluZTZwY20tPmZsYWdzKTsKKwkJCQljbGVhcl9iaXQoQklUX1JVTk5JTkdfUExBWUJBQ0ssCisJCQkJCSAgJmxpbmU2cGNtLT5mbGFncyk7CiAJCQkJcmV0dXJuIGVycjsKIAkJCX0KIAkJfQpAQCAtMzg3LDE0ICs0MTIsMTQgQEAKIAogLyogcGxheWJhY2sgb3BlcmF0b3JzICovCiBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2xpbmU2X3BsYXliYWNrX29wcyA9IHsKLQkub3BlbiA9ICAgICAgICBzbmRfbGluZTZfcGxheWJhY2tfb3BlbiwKLQkuY2xvc2UgPSAgICAgICBzbmRfbGluZTZfcGxheWJhY2tfY2xvc2UsCi0JLmlvY3RsID0gICAgICAgc25kX3BjbV9saWJfaW9jdGwsCi0JLmh3X3BhcmFtcyA9ICAgc25kX2xpbmU2X3BsYXliYWNrX2h3X3BhcmFtcywKLQkuaHdfZnJlZSA9ICAgICBzbmRfbGluZTZfcGxheWJhY2tfaHdfZnJlZSwKLQkucHJlcGFyZSA9ICAgICBzbmRfbGluZTZfcHJlcGFyZSwKLQkudHJpZ2dlciA9ICAgICBzbmRfbGluZTZfdHJpZ2dlciwKLQkucG9pbnRlciA9ICAgICBzbmRfbGluZTZfcGxheWJhY2tfcG9pbnRlciwKKwkub3BlbiA9IHNuZF9saW5lNl9wbGF5YmFja19vcGVuLAorCS5jbG9zZSA9IHNuZF9saW5lNl9wbGF5YmFja19jbG9zZSwKKwkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0gc25kX2xpbmU2X3BsYXliYWNrX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9IHNuZF9saW5lNl9wbGF5YmFja19od19mcmVlLAorCS5wcmVwYXJlID0gc25kX2xpbmU2X3ByZXBhcmUsCisJLnRyaWdnZXIgPSBzbmRfbGluZTZfdHJpZ2dlciwKKwkucG9pbnRlciA9IHNuZF9saW5lNl9wbGF5YmFja19wb2ludGVyLAogfTsKIAogaW50IGNyZWF0ZV9hdWRpb19vdXRfdXJicyhzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20pCkBAIC00MDYsNyArNDMxLDggQEAKIAkJc3RydWN0IHVyYiAqdXJiOwogCiAJCS8qIFVSQiBmb3IgYXVkaW8gb3V0OiAqLwotCQl1cmIgPSBsaW5lNnBjbS0+dXJiX2F1ZGlvX291dFtpXSA9IHVzYl9hbGxvY191cmIoTElORTZfSVNPX1BBQ0tFVFMsIEdGUF9LRVJORUwpOworCQl1cmIgPSBsaW5lNnBjbS0+dXJiX2F1ZGlvX291dFtpXSA9CisJCSAgICB1c2JfYWxsb2NfdXJiKExJTkU2X0lTT19QQUNLRVRTLCBHRlBfS0VSTkVMKTsKIAogCQlpZiAodXJiID09IE5VTEwpIHsKIAkJCWRldl9lcnIobGluZTZwY20tPmxpbmU2LT5pZmNkZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKQEAgLTQxNCw3ICs0NDAsMTAgQEAKIAkJfQogCiAJCXVyYi0+ZGV2ID0gbGluZTZwY20tPmxpbmU2LT51c2JkZXY7Ci0JCXVyYi0+cGlwZSA9IHVzYl9zbmRpc29jcGlwZShsaW5lNnBjbS0+bGluZTYtPnVzYmRldiwgbGluZTZwY20tPmVwX2F1ZGlvX3dyaXRlICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKTsKKwkJdXJiLT5waXBlID0KKwkJICAgIHVzYl9zbmRpc29jcGlwZShsaW5lNnBjbS0+bGluZTYtPnVzYmRldiwKKwkJCQkgICAgbGluZTZwY20tPgorCQkJCSAgICBlcF9hdWRpb193cml0ZSAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSyk7CiAJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CiAJCXVyYi0+c3RhcnRfZnJhbWUgPSAtMTsKIAkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IExJTkU2X0lTT19QQUNLRVRTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3BvZC5jIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3BvZC5jCmluZGV4IDRjNWI5ZDUuLjY4NWM1MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wb2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcG9kLmMKQEAgLTQyMiwxMyArNDIyLDIxIEBACiAvKgogCVJlc29sdmUgdmFsdWUgdG8gbWVtb3J5IGxvY2F0aW9uLgogKi8KLXN0YXRpYyB2b2lkIHBvZF9yZXNvbHZlKGNvbnN0IGNoYXIgKmJ1Ziwgc2hvcnQgYmxvY2swLCBzaG9ydCBibG9jazEsIHVuc2lnbmVkIGNoYXIgKmxvY2F0aW9uKQorc3RhdGljIGludCBwb2RfcmVzb2x2ZShjb25zdCBjaGFyICpidWYsIHNob3J0IGJsb2NrMCwgc2hvcnQgYmxvY2sxLCB1bnNpZ25lZCBjaGFyICpsb2NhdGlvbikKIHsKLQlpbnQgdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKLQlzaG9ydCBibG9jayA9ICh2YWx1ZSA8IDB4NDApID8gYmxvY2swIDogYmxvY2sxOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJc2hvcnQgYmxvY2s7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWx1ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWJsb2NrID0gKHZhbHVlIDwgMHg0MCkgPyBibG9jazAgOiBibG9jazE7CiAJdmFsdWUgJj0gMHgzZjsKIAlsb2NhdGlvblswXSA9IGJsb2NrID4+IDc7CiAJbG9jYXRpb25bMV0gPSB2YWx1ZSB8IChibG9jayAmIDB4N2YpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtNDM4LDE0ICs0NDYsMjAgQEAKIHsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwogCXN0cnVjdCB1c2JfbGluZTZfcG9kICpwb2QgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7Ci0KKwlpbnQgcmV0OwogCWludCBzaXplID0gMyArIHNpemVvZihwb2QtPnByb2dfZGF0YV9idWYpOwogCWNoYXIgKnN5c2V4ID0gcG9kX2FsbG9jX3N5c2V4X2J1ZmZlcihwb2QsIFBPRF9TWVNFWF9TVE9SRSwgc2l6ZSk7CisKIAlpZiAoIXN5c2V4KQogCQlyZXR1cm4gMDsKIAogCXN5c2V4W1NZU0VYX0RBVEFfT0ZTXSA9IDU7ICAvKiBzZWUgcG9kX2R1bXAoKSAqLwotCXBvZF9yZXNvbHZlKGJ1ZiwgYmxvY2swLCBibG9jazEsIHN5c2V4ICsgU1lTRVhfREFUQV9PRlMgKyAxKTsKKwlyZXQgPSBwb2RfcmVzb2x2ZShidWYsIGJsb2NrMCwgYmxvY2sxLCBzeXNleCArIFNZU0VYX0RBVEFfT0ZTICsgMSk7CisJaWYgKHJldCkgeworCQlrZnJlZShzeXNleCk7CisJCXJldHVybiByZXQ7CisJfQorCiAJbWVtY3B5KHN5c2V4ICsgU1lTRVhfREFUQV9PRlMgKyAzLCAmcG9kLT5wcm9nX2RhdGFfYnVmLCBzaXplb2YocG9kLT5wcm9nX2RhdGFfYnVmKSk7CiAKIAlsaW5lNl9zZW5kX3N5c2V4X21lc3NhZ2UoJnBvZC0+bGluZTYsIHN5c2V4LCBzaXplKTsKQEAgLTQ2MSwxMyArNDc1LDE4IEBACiB7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKIAlzdHJ1Y3QgdXNiX2xpbmU2X3BvZCAqcG9kID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCWludCByZXQ7CiAJaW50IHNpemUgPSA0OwogCWNoYXIgKnN5c2V4ID0gcG9kX2FsbG9jX3N5c2V4X2J1ZmZlcihwb2QsIFBPRF9TWVNFWF9EVU1QTUVNLCBzaXplKTsKIAogCWlmICghc3lzZXgpCiAJCXJldHVybiAwOwogCi0JcG9kX3Jlc29sdmUoYnVmLCBibG9jazAsIGJsb2NrMSwgc3lzZXggKyBTWVNFWF9EQVRBX09GUyk7CisJcmV0ID0gcG9kX3Jlc29sdmUoYnVmLCBibG9jazAsIGJsb2NrMSwgc3lzZXggKyBTWVNFWF9EQVRBX09GUyk7CisJaWYgKHJldCkgeworCQlrZnJlZShzeXNleCk7CisJCXJldHVybiByZXQ7CisJfQogCXN5c2V4W1NZU0VYX0RBVEFfT0ZTICsgMl0gPSAwOwogCXN5c2V4W1NZU0VYX0RBVEFfT0ZTICsgM10gPSAwOwogCWxpbmU2X2R1bXBfc3RhcnRlZCgmcG9kLT5kdW1wcmVxLCBQT0RfRFVNUF9NRU1PUlkpOwpAQCAtNTI2LDcgKzU0NSwxMyBAQAogewogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CiAJc3RydWN0IHVzYl9saW5lNl9wb2QgKnBvZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKLQlpbnQgdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlwb2Rfc2VuZF9jaGFubmVsKHBvZCwgdmFsdWUpOwogCXJldHVybiBjb3VudDsKIH0KQEAgLTU3OSw3ICs2MDQsNyBAQAogCiAJaWYgKGNvdW50ICE9IHNpemVvZihwb2QtPnByb2dfZGF0YSkpIHsKIAkJZGV2X2Vycihwb2QtPmxpbmU2LmlmY2RldiwKLQkJCSJkYXRhIGJsb2NrIG11c3QgYmUgZXhhY3RseSAlZCBieXRlc1xuIiwKKwkJCSJkYXRhIGJsb2NrIG11c3QgYmUgZXhhY3RseSAlenUgYnl0ZXNcbiIsCiAJCQlzaXplb2YocG9kLT5wcm9nX2RhdGEpKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNjQ1LDYgKzY3MCw4IEBACiAJY2hhciAqc3lzZXg7CiAJc3RhdGljIGNvbnN0IGludCBzaXplID0gNTsKIAl1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIHJlc3VsdDsKKwlpbnQgcmV0OwogCiAJaWYgKCgocG9kLT5wcm9nX2RhdGEuY29udHJvbFtQT0RfdHVuZXJdICYgMHg0MCkgPT0gMCkgJiYgdHVuZXIpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNjUzLDcgKzY4MCwxMiBAQAogCXN5c2V4ID0gcG9kX2FsbG9jX3N5c2V4X2J1ZmZlcihwb2QsIFBPRF9TWVNFWF9TWVNURU0sIHNpemUpOwogCWlmICghc3lzZXgpCiAJCXJldHVybiAwOwotCXZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgJiBtYXNrOworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnJlc3VsdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXZhbHVlID0gcmVzdWx0ICYgbWFzazsKIAlzeXNleFtTWVNFWF9EQVRBX09GU10gPSBjb2RlOwogCXN5c2V4W1NZU0VYX0RBVEFfT0ZTICsgMV0gPSAodmFsdWUgPj4gMTIpICYgMHgwZjsKIAlzeXNleFtTWVNFWF9EQVRBX09GUyArIDJdID0gKHZhbHVlID4+ICA4KSAmIDB4MGY7CkBAIC02OTEsNyArNzIzLDcgQEAKIAogCWlmIChjb3VudCAhPSBzaXplb2YocG9kLT5wcm9nX2RhdGEpKSB7CiAJCWRldl9lcnIocG9kLT5saW5lNi5pZmNkZXYsCi0JCQkJCQkiZGF0YSBibG9jayBtdXN0IGJlIGV4YWN0bHkgJWQgYnl0ZXNcbiIsCisJCQkJCQkiZGF0YSBibG9jayBtdXN0IGJlIGV4YWN0bHkgJXp1IGJ5dGVzXG4iLAogCQkJCQkJc2l6ZW9mKHBvZC0+cHJvZ19kYXRhKSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTgxMiw3ICs4NDQsMTMgQEAKIHsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwogCXN0cnVjdCB1c2JfbGluZTZfcG9kICpwb2QgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7Ci0JaW50IHZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbHVlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJcG9kLT5taWRpX3Bvc3Rwcm9jZXNzID0gdmFsdWUgPyAxIDogMDsKIAlyZXR1cm4gY291bnQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvdG9uZXBvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi90b25lcG9ydC5jCmluZGV4IGVhYTEyMjkuLmU2NzcwZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi90b25lcG9ydC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi90b25lcG9ydC5jCkBAIC0xNywxMCArMTcsOCBAQAogI2luY2x1ZGUgInBsYXliYWNrLmgiCiAjaW5jbHVkZSAidG9uZXBvcnQuaCIKIAotCiBzdGF0aWMgaW50IHRvbmVwb3J0X3NlbmRfY21kKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXYsIGludCBjbWQxLCBpbnQgY21kMik7CiAKLQogc3RhdGljIHN0cnVjdCBzbmRfcmF0ZGVuIHRvbmVwb3J0X3JhdGRlbiA9IHsKIAkubnVtX21pbiA9IDQ0MTAwLAogCS5udW1fbWF4ID0gNDQxMDAsCkBAIC0yOSw0NyArMjcsNDQgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbGluZTZfcGNtX3Byb3BlcnRpZXMgdG9uZXBvcnRfcGNtX3Byb3BlcnRpZXMgPSB7Ci0gIC5zbmRfbGluZTZfcGxheWJhY2tfaHcgPSB7Ci0JCS5pbmZvID0gKFNORFJWX1BDTV9JTkZPX01NQVAgfAotCQkJCQkJIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKLQkJCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8Ci0JCQkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8Ci0JCQkJCQkgU05EUlZfUENNX0lORk9fUEFVU0UgfAotCQkJCQkJIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQpLAotCQkuZm9ybWF0cyA9ICAgICAgICAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkucmF0ZXMgPSAgICAgICAgICAgIFNORFJWX1BDTV9SQVRFX0tOT1QsCi0JCS5yYXRlX21pbiA9ICAgICAgICAgNDQxMDAsCi0JCS5yYXRlX21heCA9ICAgICAgICAgNDQxMDAsCi0JCS5jaGFubmVsc19taW4gPSAgICAgMiwKLQkJLmNoYW5uZWxzX21heCA9ICAgICAyLAotCQkuYnVmZmVyX2J5dGVzX21heCA9IDYwMDAwLAotCQkucGVyaW9kX2J5dGVzX21pbiA9IDE4MCAqIDQsCi0JCS5wZXJpb2RfYnl0ZXNfbWF4ID0gODE5MiwKLQkJLnBlcmlvZHNfbWluID0gICAgICAxLAotCQkucGVyaW9kc19tYXggPSAgICAgIDEwMjQKLQl9LAotICAuc25kX2xpbmU2X2NhcHR1cmVfaHcgPSB7Ci0JCS5pbmZvID0gKFNORFJWX1BDTV9JTkZPX01NQVAgfAotCQkJCQkJIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKLQkJCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8Ci0JCQkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8Ci0JCQkJCQkgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCi0JCS5mb3JtYXRzID0gICAgICAgICAgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCS5yYXRlcyA9ICAgICAgICAgICAgU05EUlZfUENNX1JBVEVfS05PVCwKLQkJLnJhdGVfbWluID0gICAgICAgICA0NDEwMCwKLQkJLnJhdGVfbWF4ID0gICAgICAgICA0NDEwMCwKLQkJLmNoYW5uZWxzX21pbiA9ICAgICAyLAotCQkuY2hhbm5lbHNfbWF4ID0gICAgIDIsCi0JCS5idWZmZXJfYnl0ZXNfbWF4ID0gNjAwMDAsCi0JCS5wZXJpb2RfYnl0ZXNfbWluID0gMTg4ICogNCwKLQkJLnBlcmlvZF9ieXRlc19tYXggPSA4MTkyLAotCQkucGVyaW9kc19taW4gPSAgICAgIDEsCi0JCS5wZXJpb2RzX21heCA9ICAgICAgMTAyNAotCX0sCisJLnNuZF9saW5lNl9wbGF5YmFja19odyA9IHsKKwkJCQkgIC5pbmZvID0gKFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJCQkgICBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJCSAgIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkJICAgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJCSAgIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJCQkJICAgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCisJCQkJICAuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJCSAgLnJhdGVzID0gU05EUlZfUENNX1JBVEVfS05PVCwKKwkJCQkgIC5yYXRlX21pbiA9IDQ0MTAwLAorCQkJCSAgLnJhdGVfbWF4ID0gNDQxMDAsCisJCQkJICAuY2hhbm5lbHNfbWluID0gMiwKKwkJCQkgIC5jaGFubmVsc19tYXggPSAyLAorCQkJCSAgLmJ1ZmZlcl9ieXRlc19tYXggPSA2MDAwMCwKKwkJCQkgIC5wZXJpb2RfYnl0ZXNfbWluID0gMTgwICogNCwKKwkJCQkgIC5wZXJpb2RfYnl0ZXNfbWF4ID0gODE5MiwKKwkJCQkgIC5wZXJpb2RzX21pbiA9IDEsCisJCQkJICAucGVyaW9kc19tYXggPSAxMDI0fSwKKwkuc25kX2xpbmU2X2NhcHR1cmVfaHcgPSB7CisJCQkJIC5pbmZvID0gKFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJCQkgIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkJICBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJCSAgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJCSAgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCisJCQkJIC5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkJIC5yYXRlcyA9IFNORFJWX1BDTV9SQVRFX0tOT1QsCisJCQkJIC5yYXRlX21pbiA9IDQ0MTAwLAorCQkJCSAucmF0ZV9tYXggPSA0NDEwMCwKKwkJCQkgLmNoYW5uZWxzX21pbiA9IDIsCisJCQkJIC5jaGFubmVsc19tYXggPSAyLAorCQkJCSAuYnVmZmVyX2J5dGVzX21heCA9IDYwMDAwLAorCQkJCSAucGVyaW9kX2J5dGVzX21pbiA9IDE4OCAqIDQsCisJCQkJIC5wZXJpb2RfYnl0ZXNfbWF4ID0gODE5MiwKKwkJCQkgLnBlcmlvZHNfbWluID0gMSwKKwkJCQkgLnBlcmlvZHNfbWF4ID0gMTAyNH0sCiAJLnNuZF9saW5lNl9yYXRlcyA9IHsKLQkJLm5yYXRzID0gMSwKLQkJLnJhdHMgPSAmdG9uZXBvcnRfcmF0ZGVuCi0JfSwKKwkJCSAgICAubnJhdHMgPSAxLAorCQkJICAgIC5yYXRzID0gJnRvbmVwb3J0X3JhdGRlbn0sCiAJLmJ5dGVzX3Blcl9mcmFtZSA9IDQKIH07CiAKQEAgLTEwMSw4ICs5NiwxNCBAQAogCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JY2hhciAqYzsKLQlsZWRfcmVkID0gc2ltcGxlX3N0cnRvbChidWYsICZjLCAxMCk7CisJaW50IHJldHZhbDsKKwlsb25nIHZhbHVlOworCisJcmV0dmFsID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsdWUpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlsZWRfcmVkID0gdmFsdWU7CiAJdG9uZXBvcnRfdXBkYXRlX2xlZChkZXYpOwogCXJldHVybiBjb3VudDsKIH0KQEAgLTExMSwxNSArMTEyLDIyIEBACiAJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JY2hhciAqYzsKLQlsZWRfZ3JlZW4gPSBzaW1wbGVfc3RydG9sKGJ1ZiwgJmMsIDEwKTsKKwlpbnQgcmV0dmFsOworCWxvbmcgdmFsdWU7CisKKwlyZXR2YWwgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWx1ZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWxlZF9ncmVlbiA9IHZhbHVlOwogCXRvbmVwb3J0X3VwZGF0ZV9sZWQoZGV2KTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBERVZJQ0VfQVRUUihsZWRfcmVkLCBTX0lXVUdPIHwgU19JUlVHTywgbGluZTZfbm9wX3JlYWQsIHRvbmVwb3J0X3NldF9sZWRfcmVkKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihsZWRfZ3JlZW4sIFNfSVdVR08gfCBTX0lSVUdPLCBsaW5lNl9ub3BfcmVhZCwgdG9uZXBvcnRfc2V0X2xlZF9ncmVlbik7Ci0KK3N0YXRpYyBERVZJQ0VfQVRUUihsZWRfcmVkLCBTX0lXVUdPIHwgU19JUlVHTywgbGluZTZfbm9wX3JlYWQsCisJCSAgIHRvbmVwb3J0X3NldF9sZWRfcmVkKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihsZWRfZ3JlZW4sIFNfSVdVR08gfCBTX0lSVUdPLCBsaW5lNl9ub3BfcmVhZCwKKwkJICAgdG9uZXBvcnRfc2V0X2xlZF9ncmVlbik7CiAKIHN0YXRpYyBpbnQgdG9uZXBvcnRfc2VuZF9jbWQoc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldiwgaW50IGNtZDEsIGludCBjbWQyKQogewpAQCAtMTk2LDE2ICsyMDQsMTggQEAKIAlsaW5lNl93cml0ZV9kYXRhKGxpbmU2LCAweDgwYzYsICZ0aWNrcywgNCk7CiAKIAkvKgotCXNlZW1zIHRvIHdvcmsgd2l0aG91dCB0aGUgZmlyc3QgdHdvLi4uCi0JKi8KKwkgICBzZWVtcyB0byB3b3JrIHdpdGhvdXQgdGhlIGZpcnN0IHR3by4uLgorCSAqLwogCS8qIHRvbmVwb3J0X3NlbmRfY21kKHVzYmRldiwgMHgwMjAxLCAweDAwMDIpOyAqLwogCS8qIHRvbmVwb3J0X3NlbmRfY21kKHVzYmRldiwgMHgwODAxLCAweDAwMDApOyAqLwogCS8qIG9ubHkgb25lIHRoYXQgd29ya3MgZm9yIG1lOyBvbiBHUCwgVFAgbWlnaHQgYmUgZGlmZmVyZW50PyAqLwogCXRvbmVwb3J0X3NlbmRfY21kKHVzYmRldiwgMHgwMzAxLCAweDAwMDApOwogCiAJaWYgKHVzYmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgIT0gTElORTZfREVWSURfR1VJVEFSUE9SVCkgewotCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX2xlZF9yZWQpKTsKLQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9sZWRfZ3JlZW4pKTsKKwkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJICAgICAoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfbGVkX3JlZCkpOworCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkgICAgICgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9sZWRfZ3JlZW4pKTsKIAkJdG9uZXBvcnRfdXBkYXRlX2xlZCgmdXNiZGV2LT5kZXYpOwogCX0KIApAQCAtMjIzLDcgKzIzMyw4IEBACiAJCXJldHVybjsKIAl0b25lcG9ydCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKIAotCWlmICh0b25lcG9ydC0+bGluZTYudXNiZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCAhPSBMSU5FNl9ERVZJRF9HVUlUQVJQT1JUKSB7CisJaWYgKHRvbmVwb3J0LT5saW5lNi51c2JkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ICE9CisJICAgIExJTkU2X0RFVklEX0dVSVRBUlBPUlQpIHsKIAkJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX2xlZF9yZWQpOwogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfbGVkX2dyZWVuKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvdmFyaWF4LmMgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvdmFyaWF4LmMKaW5kZXggZjlkOTY5OC4uNDhkODM0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3ZhcmlheC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi92YXJpYXguYwpAQCAtMTg0LDcgKzE4NCwxMiBAQAogCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgdXNiX2xpbmU2X3ZhcmlheCAqdmFyaWF4ID0gdXNiX2dldF9pbnRmZGF0YSh0b191c2JfaW50ZXJmYWNlKGRldikpOwotCWludCB2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWx1ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWlmIChsaW5lNl90cmFuc21pdF9wYXJhbWV0ZXIoJnZhcmlheC0+bGluZTYsIFZBUklBWE1JRElfdm9sdW1lLAogCQkJCSAgICAgdmFsdWUpID09IDApCkBAIC0yMTEsNyArMjE2LDEyIEBACiAJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHVzYl9saW5lNl92YXJpYXggKnZhcmlheCA9IHVzYl9nZXRfaW50ZmRhdGEodG9fdXNiX2ludGVyZmFjZShkZXYpKTsKLQlpbnQgdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlpZiAobGluZTZfc2VuZF9wcm9ncmFtKCZ2YXJpYXgtPmxpbmU2LCB2YWx1ZSkgPT0gMCkKIAkJdmFyaWF4LT5tb2RlbCA9IHZhbHVlOwpAQCAtMjM3LDggKzI0NywxNCBAQAogCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgdXNiX2xpbmU2X3ZhcmlheCAqdmFyaWF4ID0gdXNiX2dldF9pbnRmZGF0YSh0b191c2JfaW50ZXJmYWNlKGRldikpOwotCWludCB2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApID8gMSA6IDA7Ci0JdmFyaWF4LT5idWZmZXJfYWN0aXZhdGVbVkFSSUFYX09GRlNFVF9BQ1RJVkFURV0gPSB2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl2YXJpYXgtPmJ1ZmZlcl9hY3RpdmF0ZVtWQVJJQVhfT0ZGU0VUX0FDVElWQVRFXSA9IHZhbHVlID8gMTogMDsKIAlsaW5lNl9zZW5kX3Jhd19tZXNzYWdlX2FzeW5jKCZ2YXJpYXgtPmxpbmU2LCB2YXJpYXgtPmJ1ZmZlcl9hY3RpdmF0ZSwKIAkJCQkgICAgIHNpemVvZih2YXJpYXhfYWN0aXZhdGUpKTsKIAlyZXR1cm4gY291bnQ7CkBAIC0yNjIsNyArMjc4LDEyIEBACiAJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHVzYl9saW5lNl92YXJpYXggKnZhcmlheCA9IHVzYl9nZXRfaW50ZmRhdGEodG9fdXNiX2ludGVyZmFjZShkZXYpKTsKLQlpbnQgdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlpZiAobGluZTZfdHJhbnNtaXRfcGFyYW1ldGVyKCZ2YXJpYXgtPmxpbmU2LCBWQVJJQVhNSURJX3RvbmUsCiAJCQkJICAgICB2YWx1ZSkgPT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vY3ZteC1wb3cuaCBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vY3ZteC1wb3cuaAppbmRleCBjNWQ2NmYyLi5iZjllMDY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2N2bXgtcG93LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9jdm14LXBvdy5oCkBAIC0xOTU5LDcgKzE5NTksNyBAQAogICogQGJ1ZmZlcl9zaXplOgogICogICAgICAgICAgICAgICBUaGUgc2l6ZSBvZiB0aGUgc3VwcGxpZWQgYnVmZmVyCiAgKgotICogUmV0dXJucyBaZXJvIG9uIHN1Y2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICogUmV0dXJucyBaZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKICAqLwogZXh0ZXJuIGludCBjdm14X3Bvd19jYXB0dXJlKHZvaWQgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1yZ21paS5jIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1yZ21paS5jCmluZGV4IDg3MDQxMzMuLmZiYWE0NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtcmdtaWkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXJnbWlpLmMKQEAgLTMwOCw3ICszMDgsNyBAQAogCiAJLyoKIAkgKiBEdWUgdG8gR01YIGVycmF0YSBpbiBDTjNYWFggc2VyaWVzIGNoaXBzLCBpdCBpcyBuZWNlc3NhcnkKLQkgKiB0byB0YWtlIHRoZSBsaW5rIGRvd24gaW1tZWRpYXRlbHkgd2huZSB0aGUgUEhZIGNoYW5nZXMKKwkgKiB0byB0YWtlIHRoZSBsaW5rIGRvd24gaW1tZWRpYXRlbHkgd2hlbiB0aGUgUEhZIGNoYW5nZXMKIAkgKiBzdGF0ZS4gSW4gb3JkZXIgdG8gZG8gdGhpcyB3ZSBjYWxsIHRoZSBwb2xsIGZ1bmN0aW9uIGV2ZXJ5CiAJICogdGltZSB0aGUgUkdNSUkgaW5iYW5kIHN0YXR1cyBjaGFuZ2VzLiAgVGhpcyBtYXkgY2F1c2UKIAkgKiBwcm9ibGVtcyBpZiB0aGUgUEhZIGRvZXNuJ3QgaW1wbGVtZW50IGluYmFuZCBzdGF0dXMKQEAgLTMxNyw2ICszMTcsOCBAQAogCWlmIChudW1iZXJfcmdtaWlfcG9ydHMgPT0gMCkgewogCQlyID0gcmVxdWVzdF9pcnEoT0NURU9OX0lSUV9STUwsIGN2bV9vY3RfcmdtaWlfcm1sX2ludGVycnVwdCwKIAkJCQlJUlFGX1NIQVJFRCwgIlJHTUlJIiwgJm51bWJlcl9yZ21paV9wb3J0cyk7CisJCWlmIChyICE9IDApCisJCQlyZXR1cm4gcjsKIAl9CiAJbnVtYmVyX3JnbWlpX3BvcnRzKys7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtdHguYyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtdHguYwppbmRleCA4MWE4NTEzLi41MzUyOTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXR4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC10eC5jCkBAIC02MjQsNyArNjI0LDcgQEAKIEVYUE9SVF9TWU1CT0woY3ZtX29jdF90cmFuc21pdF9xb3MpOwogCiAvKioKLSAqIFRoaXMgZnVuY3Rpb24gZnJlZXMgYWxsIHNrYiB0aGF0IGFyZSBjdXJyZW50eSBxdWV1ZWQgZm9yIFRYLgorICogVGhpcyBmdW5jdGlvbiBmcmVlcyBhbGwgc2tiIHRoYXQgYXJlIGN1cnJlbnRseSBxdWV1ZWQgZm9yIFRYLgogICoKICAqIEBkZXY6ICAgIERldmljZSBiZWluZyBzaHV0ZG93bgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2NtZC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NjbWQuYwppbmRleCA4M2RkOGJhLi44ZGEyOGVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2NtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jY21kLmMKQEAgLTg5OSw3ICs4OTksNyBAQAogCQl6ZlN0YURpc2FibGVTV0VuY3J5cHRpb24oZGV2KTsKIAl9CiAKLQkvKiBJbXByb3ZlIFdFUC9US0lQIHBlcmZvcm1hY2Ugd2l0aCBIVCBBUCwKKwkvKiBJbXByb3ZlIFdFUC9US0lQIHBlcmZvcm1hbmNlIHdpdGggSFQgQVAsCiAJZGV0YWlsIGluZm9ybWF0aW9uIHBsZWFzZSBsb29rIGJ1ZyMzMjQ5NSAqLwogCS8qIHpmSHBTZXRUVFNJRlNUaW1lKGRldiwgMHg4KTsgKi8KIApAQCAtMTQwNyw3ICsxNDA3LDcgQEAKIAkJemZTdGFEaXNhYmxlU1dFbmNyeXB0aW9uKGRldik7CiAJfQogCi0JLyogCUltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFjZSB3aXRoIEhUIEFQLAorCS8qIAlJbXByb3ZlIFdFUC9US0lQIHBlcmZvcm1hbmNlIHdpdGggSFQgQVAsCiAJCWRldGFpbCBpbmZvcm1hdGlvbiBwbGVhc2UgbG9vayBidWcjMzI0OTUKIAkqLwogCS8qIHpmSHBTZXRUVFNJRlNUaW1lKGRldiwgMHg4KTsgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW0uYwppbmRleCBiZWQxNmI1Li5hNmMxYjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY21tLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbS5jCkBAIC0xNDI4LDcgKzE0MjgsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICAgICAgLyogQmVhY29uICovCiAgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9CRUFDT04gOgotICAgICAgICAgICAgICAgIC8qIGlmIGVuYWJsZSA4MDIuMTFoIGFuZCBjdXJyZW50IGNoYW5lbCBpcyBzaWxlbnQgYnV0IHJlY2VpdmUgYmVhY29uIGZyb20gb3RoZXIgQVAgKi8KKyAgICAgICAgICAgICAgICAvKiBpZiBlbmFibGUgODAyLjExaCBhbmQgY3VycmVudCBjaGFubmVsIGlzIHNpbGVudCBidXQgcmVjZWl2ZSBiZWFjb24gZnJvbSBvdGhlciBBUCAqLwogICAgICAgICAgICAgICAgIGlmICgoKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW3dkLT5yZWd1bGF0aW9uVGFibGUuQ3VyQ2hJbmRleF0uY2hhbm5lbEZsYWdzCiAgICAgICAgICAgICAgICAgICAgICAgICAmIFpNX1JFR19GTEFHX0NIQU5ORUxfQ1NBKSAhPSAwKSAmJiB3ZC0+c3RhLkRGU0VuYWJsZSkKICAgICAgICAgICAgICAgICB7CkBAIC0xNDY5LDcgKzE0NjksNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIC8qIFByb2JlIHJlc3BvbnNlICovCiAgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJTUCA6Ci0gICAgICAgICAgICAgICAgLyogaWYgZW5hYmxlIDgwMi4xMWggYW5kIGN1cnJlbnQgY2hhbmVsIGlzIHNpbGVudCBidXQgcmVjZWl2ZSBwcm9iZSByZXNwb25zZSBmcm9tIG90aGVyIEFQICovCisgICAgICAgICAgICAgICAgLyogaWYgZW5hYmxlIDgwMi4xMWggYW5kIGN1cnJlbnQgY2hhbm5lbCBpcyBzaWxlbnQgYnV0IHJlY2VpdmUgcHJvYmUgcmVzcG9uc2UgZnJvbSBvdGhlciBBUCAqLwogICAgICAgICAgICAgICAgIGlmICgoKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW3dkLT5yZWd1bGF0aW9uVGFibGUuQ3VyQ2hJbmRleF0uY2hhbm5lbEZsYWdzCiAgICAgICAgICAgICAgICAgICAgICAgICAmIFpNX1JFR19GTEFHX0NIQU5ORUxfQ1NBKSAhPSAwKSAmJiB3ZC0+c3RhLkRGU0VuYWJsZSkKICAgICAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY21tc3RhLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY21tc3RhLmMKaW5kZXggYjI4YTRlMi4uYTExZDU1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbXN0YS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW1zdGEuYwpAQCAtMjE2LDcgKzIxNiw3IEBACiAgICAgLyogQ2hhbmdlIGludGVybmFsIHN0YXRlICovCiAgICAgemZDaGFuZ2VBZGFwdGVyU3RhdGUoZGV2LCBaTV9TVEFfU1RBVEVfRElTQ09OTkVDVCk7CiAKLSAgICAvKiBJbXByb3ZlIFdFUC9US0lQIHBlcmZvcm1hY2Ugd2l0aCBIVCBBUCwgZGV0YWlsIGluZm9ybWF0aW9uIHBsZWFzZSBsb29rIGJ1ZyMzMjQ5NSAqLworICAgIC8qIEltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFuY2Ugd2l0aCBIVCBBUCwgZGV0YWlsIGluZm9ybWF0aW9uIHBsZWFzZSBsb29rIGJ1ZyMzMjQ5NSAqLwogICAgIC8vemZIcFNldFRUU0lGU1RpbWUoZGV2LCAweDgpOwogCiAgICAgLyogTm90aWZ5IHdyYXBwZXIgb2YgY29ubmVjdGlvbiBzdGF0dXMgY2hhbmdlcyAqLwpAQCAtNDE0OCw3ICs0MTQ4LDcgQEAKICAgICAgICAgICAgIHdkLT5zdGEuYklzU2hhcmVkS2V5ID0gMDsKICAgICAgICAgfQogCi0gICAgICAgIC8qIEltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFjZSB3aXRoIEhUIEFQLCBkZXRhaWwgaW5mb3JtYXRpb24gcGxlYXNlIGxvb2sgYnVnIzMyNDk1ICovCisgICAgICAgIC8qIEltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFuY2Ugd2l0aCBIVCBBUCwgZGV0YWlsIGluZm9ybWF0aW9uIHBsZWFzZSBsb29rIGJ1ZyMzMjQ5NSAqLwogICAgICAgICAvKgogICAgICAgICBpZiAoIChwQnNzSW5mby0+YnJvYWRjb21IVEFwID09IDEpCiAgICAgICAgICAgICAgJiYgKHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICE9IDApICkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jdHhyeC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N0eHJ4LmMKaW5kZXggZTI1OGE3ZC4uYWM1NGQ1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N0eHJ4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N0eHJ4LmMKQEAgLTMwOTMsNyArMzA5Myw3IEBACiAKICAgICBmcmFtZVR5cGUgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQpOwogCi0gICAgLy8gRG9uJ3QgZGl2aWRlIDJeNCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdGhlIGZyYWdlbWVudGF0aW9uIHBrdCB0byBiZSB0cmVhdGVkIGFzCisgICAgLy8gRG9uJ3QgZGl2aWRlIDJeNCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdGhlIGZyYWdtZW50YXRpb24gcGt0IHRvIGJlIHRyZWF0ZWQgYXMKICAgICAvLyBkdXBsaWNhdGVkIGZyYW1lcwogICAgIHNlcSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsyMik7CiAgICAgZHN0MCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCs0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfemZpLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcHViX3pmaS5oCmluZGV4IDYwYjdkMWMuLmI3YjdmNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfemZpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl96ZmkuaApAQCAtNzgyLDcgKzc4Miw3IEBACiAKIC8qKioqKiBFbmQgb2Ygc2VjdGlvbiAyICoqKioqLwogCi0vKioqKiogc2VjdGlvbiAzIHBlcmZvcm1hY2UgZXZhbHVhdGlvbiAqKioqKi8KKy8qKioqKiBzZWN0aW9uIDMgcGVyZm9ybWFuY2UgZXZhbHVhdGlvbiAqKioqKi8KICNpZmRlZiBaTV9FTkFCTEVfUEVSRk9STUFOQ0VfRVZBTFVBVElPTgogZXh0ZXJuIHZvaWQgemZpVHhQZXJmb3JtYW5jZU1TRFUoemRldl90KiBkZXYsIHUzMl90IHRpY2spOwogZXh0ZXJuIHZvaWQgemZpUnhQZXJmb3JtYW5jZU1QRFUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2FwZGJnLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9hcGRiZy5jCmluZGV4IGQzZTJmNjIuLjBlYjkzZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2FwZGJnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvYXBkYmcuYwpAQCAtMzgsMzkgKzM4LDM5IEBACiAKICNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CiAKLSNkZWZpbmUgWk1fSU9DVExfUkVHX1JFQUQgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgWk1fSU9DVExfUkVHX1dSSVRFICAgICAgICAgIDB4MDIKLSNkZWZpbmUgWk1fSU9DVExfTUVNX0RVTVAgICAgICAgICAgIDB4MDMKLSNkZWZpbmUgWk1fSU9DVExfUkVHX0RVTVAgICAgICAgICAgIDB4MDUKLSNkZWZpbmUgWk1fSU9DVExfVFhEX0RVTVAgICAgICAgICAgIDB4MDYKLSNkZWZpbmUgWk1fSU9DVExfUlhEX0RVTVAgICAgICAgICAgIDB4MDcKLSNkZWZpbmUgWk1fSU9DVExfTUVNX1JFQUQgICAgICAgICAgIDB4MEIKLSNkZWZpbmUgWk1fSU9DVExfTUVNX1dSSVRFICAgICAgICAgIDB4MEMKLSNkZWZpbmUgWk1fSU9DVExfRE1BX1RFU1QgICAgICAgICAgIDB4MTAKLSNkZWZpbmUgWk1fSU9DVExfUkVHX1RFU1QgICAgICAgICAgIDB4MTEKLSNkZWZpbmUgWk1fSU9DVExfVEVTVCAgICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgWk1fSU9DVExfVEFMTFkgICAgICAgICAgICAgIDB4ODEgLy9DV1lhbmcoKykKLSNkZWZpbmUgWk1fSU9DVExfUlRTICAgICAgICAgICAgICAgIDB4QTAKLSNkZWZpbmUgWk1fSU9DVExfTUlYX01PREUgICAgICAgICAgIDB4QTEKLSNkZWZpbmUgWk1fSU9DVExfRlJBRyAgICAgICAgICAgICAgIDB4QTIKLSNkZWZpbmUgWk1fSU9DVExfU0NBTiAgICAgICAgICAgICAgIDB4QTMKLSNkZWZpbmUgWk1fSU9DVExfS0VZICAgICAgICAgICAgICAgIDB4QTQKLSNkZWZpbmUgWk1fSU9DVExfUkFURSAgICAgICAgICAgICAgIDB4QTUKLSNkZWZpbmUgWk1fSU9DVExfRU5DUllQVElPTl9NT0RFICAgIDB4QTYKLSNkZWZpbmUgWk1fSU9DVExfR0VUX1RYQ05UICAgICAgICAgIDB4QTcKLSNkZWZpbmUgWk1fSU9DVExfR0VUX0RFQUdHX0NOVCAgICAgIDB4QTgKLSNkZWZpbmUgWk1fSU9DVExfRFVSQVRJT05fTU9ERSAgICAgIDB4QTkKLSNkZWZpbmUgWk1fSU9DVExfU0VUX0FFU19LRVkgICAgICAgIDB4QUEKLSNkZWZpbmUgWk1fSU9DVExfU0VUX0FFU19NT0RFICAgICAgIDB4QUIKLSNkZWZpbmUgWk1fSU9DVExfU0lHTkFMX1NUUkVOR1RIICAgIDB4QUMgLy9DV1lhbmcoKykKLSNkZWZpbmUgWk1fSU9DVExfU0lHTkFMX1FVQUxJVFkgICAgIDB4QUQgLy9DV1lhbmcoKykKLSNkZWZpbmUgWk1fSU9DVExfU0VUX1BJQlNTX01PREUgICAgIDB4QUUKLSNkZWZpbmUJWkRBUElPQ1RMICAgICAgICAgICAgICAgICAgIFNJT0NERVZQUklWQVRFCisjZGVmaW5lIFpNX0lPQ1RMX1JFR19SRUFECQkJMHgwMQorI2RlZmluZSBaTV9JT0NUTF9SRUdfV1JJVEUJCQkweDAyCisjZGVmaW5lIFpNX0lPQ1RMX01FTV9EVU1QCQkJMHgwMworI2RlZmluZSBaTV9JT0NUTF9SRUdfRFVNUAkJCTB4MDUKKyNkZWZpbmUgWk1fSU9DVExfVFhEX0RVTVAJCQkweDA2CisjZGVmaW5lIFpNX0lPQ1RMX1JYRF9EVU1QCQkJMHgwNworI2RlZmluZSBaTV9JT0NUTF9NRU1fUkVBRAkJCTB4MEIKKyNkZWZpbmUgWk1fSU9DVExfTUVNX1dSSVRFCQkJMHgwQworI2RlZmluZSBaTV9JT0NUTF9ETUFfVEVTVAkJCTB4MTAKKyNkZWZpbmUgWk1fSU9DVExfUkVHX1RFU1QJCQkweDExCisjZGVmaW5lIFpNX0lPQ1RMX1RFU1QJCQkJMHg4MAorI2RlZmluZSBaTV9JT0NUTF9UQUxMWQkJCQkweDgxIC8qIENXWWFuZygrKSAqLworI2RlZmluZSBaTV9JT0NUTF9SVFMJCQkJMHhBMAorI2RlZmluZSBaTV9JT0NUTF9NSVhfTU9ERQkJCTB4QTEKKyNkZWZpbmUgWk1fSU9DVExfRlJBRwkJCQkweEEyCisjZGVmaW5lIFpNX0lPQ1RMX1NDQU4JCQkJMHhBMworI2RlZmluZSBaTV9JT0NUTF9LRVkJCQkJMHhBNAorI2RlZmluZSBaTV9JT0NUTF9SQVRFCQkJCTB4QTUKKyNkZWZpbmUgWk1fSU9DVExfRU5DUllQVElPTl9NT0RFCQkweEE2CisjZGVmaW5lIFpNX0lPQ1RMX0dFVF9UWENOVAkJCTB4QTcKKyNkZWZpbmUgWk1fSU9DVExfR0VUX0RFQUdHX0NOVAkJCTB4QTgKKyNkZWZpbmUgWk1fSU9DVExfRFVSQVRJT05fTU9ERQkJCTB4QTkKKyNkZWZpbmUgWk1fSU9DVExfU0VUX0FFU19LRVkJCQkweEFBCisjZGVmaW5lIFpNX0lPQ1RMX1NFVF9BRVNfTU9ERQkJCTB4QUIKKyNkZWZpbmUgWk1fSU9DVExfU0lHTkFMX1NUUkVOR1RICQkweEFDIC8qIENXWWFuZygrKSAqLworI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfUVVBTElUWQkJCTB4QUQgLyogQ1dZYW5nKCspICovCisjZGVmaW5lIFpNX0lPQ1RMX1NFVF9QSUJTU19NT0RFCQkJMHhBRQorI2RlZmluZQlaREFQSU9DVEwJCQkJU0lPQ0RFVlBSSVZBVEUKIAogc3RydWN0IHpkYXBfaW9jdGwgewotCXVuc2lnbmVkIHNob3J0IGNtZDsgICAgICAgICAgICAgICAgLyogQ29tbWFuZCB0byBydW4gKi8KLQl1bnNpZ25lZCBpbnQgICBhZGRyOyAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgdGhlIGRhdGEgYnVmZmVyICovCi0JdW5zaWduZWQgaW50ICAgdmFsdWU7ICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgKi8KKwl1bnNpZ25lZCBzaG9ydCBjbWQ7CQkJLyogQ29tbWFuZCB0byBydW4gKi8KKwl1bnNpZ25lZCBpbnQgICBhZGRyOwkJCS8qIExlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgICB2YWx1ZTsJCQkvKiBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciAqLwogCXVuc2lnbmVkIGNoYXIgZGF0YVsweDEwMF07CiB9OwogCkBAIC03OSwxMyArNzksMTMgQEAKICNpZiAwCiAKICNkZWZpbmUgU0tJUF9FTEVNIHsgXAotICAgIHdoaWxlKGlzeGRpZ2l0KCpwKSkgXAotICAgICAgICBwKys7IFwKKwl3aGlsZSAoaXN4ZGlnaXQoKnApKSBcCisJCXArKzsgXAogfQogCiAjZGVmaW5lIFNLSVBfREVMSU1FVEVSIHsgXAotICAgIGlmKCpwID09ICc6JyB8fCAqcCA9PSAnICcpIFwKLSAgICAgICAgcCsrOyBcCisJaWYgKCpwID09ICc6JyB8fCAqcCA9PSAnICcpIFwKKwkJcCsrOyBcCiB9CiAKICNlbmRpZgpAQCAtOTcsMzYxICs5NywzMDggQEAKIAogaW50IHNldF9pb2N0bChpbnQgc29jaywgc3RydWN0IGlmcmVxICpyZXEpCiB7Ci0gICAgaWYgKGlvY3RsKHNvY2ssIFpEQVBJT0NUTCwgcmVxKSA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogaW9jdGwoU0lPQ0dJRk1BUCk6ICVzXG4iLAotICAgICAgICAgICAgICAgIHByZ25hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CisJaWYgKGlvY3RsKHNvY2ssIFpEQVBJT0NUTCwgcmVxKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogaW9jdGwoU0lPQ0dJRk1BUCk6ICVzXG4iLAorCQkJcHJnbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiAKIGludCByZWFkX3JlZyhpbnQgc29jaywgc3RydWN0IGlmcmVxICpyZXEpCiB7Ci0gICAgc3RydWN0IHpkYXBfaW9jdGwgKnpkcmVxID0gMDsKKwlzdHJ1Y3QgemRhcF9pb2N0bCAqemRyZXEgPSAwOwogCi0gICAgaWYgKCFzZXRfaW9jdGwoc29jaywgcmVxKSkKLSAgICAgICAgcmV0dXJuIC0xOworCWlmICghc2V0X2lvY3RsKHNvY2ssIHJlcSkpCisJCQlyZXR1cm4gLTE7CiAKLSAgICAvL3pkcmVxID0gKHN0cnVjdCB6ZGFwX2lvY3RsICopcmVxLT5pZnJfZGF0YTsKLSAgICAvL3ByaW50ZiggInJlZyA9ICU0eCwgdmFsdWUgPSAlNHhcbiIsIHpkcmVxLT5hZGRyLCB6ZHJlcS0+dmFsdWUpOworCS8qCisJICogemRyZXEgPSAoc3RydWN0IHpkYXBfaW9jdGwgKilyZXEtPmlmcl9kYXRhOworCSAqIHByaW50ZiggInJlZyA9ICU0eCwgdmFsdWUgPSAlNHhcbiIsIHpkcmVxLT5hZGRyLCB6ZHJlcS0+dmFsdWUpOworCSAqLwogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIAogaW50IHJlYWRfbWVtKGludCBzb2NrLCBzdHJ1Y3QgaWZyZXEgKnJlcSkKIHsKLSAgICBzdHJ1Y3QgemRhcF9pb2N0bCAqemRyZXEgPSAwOwotICAgIGludCBpOworCXN0cnVjdCB6ZGFwX2lvY3RsICp6ZHJlcSA9IDA7CisJaW50IGk7CiAKLSAgICBpZiAoIXNldF9pb2N0bChzb2NrLCByZXEpKQotICAgICAgICByZXR1cm4gLTE7CisJaWYgKCFzZXRfaW9jdGwoc29jaywgcmVxKSkKKwkJcmV0dXJuIC0xOwogCi0gICAgLyp6ZHJlcSA9IChzdHJ1Y3QgemRhcF9pb2N0bCAqKXJlcS0+aWZyX2RhdGE7Ci0gICAgcHJpbnRmKCAiZHVtcCBtZW0gZnJvbSAleCwgbGVuZ3RoID0gJXhcbiIsIHpkcmVxLT5hZGRyLCB6ZHJlcS0+dmFsdWUpOworCS8qCisJICogemRyZXEgPSAoc3RydWN0IHpkYXBfaW9jdGwgKilyZXEtPmlmcl9kYXRhOworCSAqIHByaW50ZigiZHVtcCBtZW0gZnJvbSAleCwgbGVuZ3RoID0gJXhcbiIsIHpkcmVxLT5hZGRyLCB6ZHJlcS0+dmFsdWUpOworCSAqCisJICogZm9yIChpPTA7IGk8emRyZXEtPnZhbHVlOyBpKyspIHsKKwkgKglwcmludGYoIiUwMngiLCB6ZHJlcS0+ZGF0YVtpXSk7CisJICoJcHJpbnRmKCIgIik7CisJICoKKwkgKglpZiAoKGk+MCkgJiYgKChpKzEpJTE2ID09IDApKQorCSAqCQlwcmludGYoIlxuIik7CisJICogfQorCSAqLwogCi0gICAgZm9yIChpPTA7IGk8emRyZXEtPnZhbHVlOyBpKyspIHsKLSAgICAgICAgcHJpbnRmKCIlMDJ4IiwgemRyZXEtPmRhdGFbaV0pOwotICAgICAgICBwcmludGYoIiAiKTsKLQotICAgICAgICBpZiAoKGk+MCkgJiYgKChpKzEpJTE2ID09IDApKQotICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgIH0qLwotCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotICAgIGludCBzb2NrOwotICAgIGludCBhZGRyLCB2YWx1ZTsKLSAgICBzdHJ1Y3QgaWZyZXEgcmVxOwotICAgIGNoYXIgKmFjdGlvbiA9IE5VTEw7Ci0gICAgc3RydWN0IHpkYXBfaW9jdGwgemRyZXE7CisJaW50IHNvY2s7CisJaW50IGFkZHIsIHZhbHVlOworCXN0cnVjdCBpZnJlcSByZXE7CisJY2hhciAqYWN0aW9uID0gTlVMTDsKKwlzdHJ1Y3QgemRhcF9pb2N0bCB6ZHJlcTsKIAotICAgIHByZ25hbWUgPSBhcmd2WzBdOworCXByZ25hbWUgPSBhcmd2WzBdOwogCi0gICAgaWYgKGFyZ2MgPCAzKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIlczogdXNhZ2UgaXMgXCIlcyA8aWZuYW1lPiA8b3BlcmF0aW9uPiBbPGFkZHJlc3M+XSBbPHZhbHVlPl1cIlxuIiwKLSAgICAgICAgICAgICAgICBwcmduYW1lLCBwcmduYW1lKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsInZhbGlkIG9wZXJhdGlvbjogcmVhZCwgd3JpdGUsIG1lbSwgcmVnLFxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgICA6IHR4ZCwgcnhkLCBybWVtLCB3bWVtXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICAgICAgICAgICAgIDogZG1hdCwgcmVndCwgdGVzdFxuIik7CisJaWYgKGFyZ2MgPCAzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IHVzYWdlIGlzIFwiJXMgPGlmbmFtZT4gPG9wZXJhdGlvbj4iCisJCQkJIls8YWRkcmVzcz5dIFs8dmFsdWU+XVwiXG4iLCBwcmduYW1lLCBwcmduYW1lKTsKKwkJZnByaW50ZihzdGRlcnIsICJ2YWxpZCBvcGVyYXRpb24gOiByZWFkLCB3cml0ZSwgbWVtLCByZWcsIFxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiCQk6IHR4ZCwgcnhkLCBybWVtLCB3bWVtXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICIJCTogZG1hdCwgcmVndCwgdGVzdFxuIik7CiAKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBzY2FuLCBDaGFubmVsIFNjYW5cbiIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIHJ0cyA8ZGVjaW1hbD4sIFNldCBSVFMgVGhyZXNob2xkXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBmcmFnIDxkZWNpbWFsPiwgU2V0IEZyYWdtZW50IFRocmVzaG9sZFxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgcmF0ZSA8MC0yOD4sIDA6QVVUTywgMS00OkNDSywgNS0xMjpPRkRNLCAxMy0yODpIVFxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgVEJEIG1peCA8MCBvciAxPiwgU2V0IDEgdG8gZW5hYmxlIG1peGVkIG1vZGVcbiIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIGVuYywgPDAtMz4sIDA9Pk9QRU4sIDE9PldFUDY0LCAyPT5XRVAxMjgsIDM9PldFUDI1NlxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgc2tleSA8a2V5PiwgU2V0IFdFUCBrZXlcbiIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIHR4Y250LCBHZXQgVHhRIENudFxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgZGFnY250LCBHZXQgRGVhZ2dyZWdhdGUgQ250XG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBkdXJtb2RlIDxtb2RlPiwgU2V0IER1cmF0aW9uIE1vZGUgMD0+SFcsIDE9PlNXXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBhZXNrZXkgPHVzZXI+IDxrZXk+XG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBhZXNtb2RlIDxtb2RlPlxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgd2xhbm1vZGUgPDAsMT4gMDpTdGF0aW9uIG1vZGUsIDE6UElCU1MgbW9kZVxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgdGFsIDwwLDE+LCBHZXQgQ3VycmVudCBUYWxseSBJbmZvLCAwPT5yZWFkLCAxPT5yZWFkIGFuZCByZXNldFxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiCXNjYW4sIENoYW5uZWwgU2NhblxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiCXJ0cyA8ZGVjaW1hbD4sIFNldCBSVFMgVGhyZXNob2xkXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICIJZnJhZyA8ZGVjaW1hbD4sIFNldCBGcmFnbWVudCIKKwkJCSIgVGhyZXNob2xkXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICIJcmF0ZSA8MC0yOD4sIDA6QVVUTywgMS00OkNDSywiCisJCQkiIDUtMTI6T0ZETSwgMTMtMjg6SFRcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIglUQkQgbWl4IDwwIG9yIDE+LCBTZXQgMSB0byBlbmFibGUiCisJCQkiIG1peGVkIG1vZGVcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIgllbmMsIDwwLTM+LCAwPT5PUEVOLCAxPT5XRVA2NCwgIgorCQkJIjI9PldFUDEyOCwgMz0+V0VQMjU2XG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICIJc2tleSA8a2V5PiwgU2V0IFdFUCBrZXlcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIgl0eGNudCwgR2V0IFR4USBDbnRcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIglkYWdjbnQsIEdldCBEZWFnZ3JlZ2F0ZSBDbnRcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIglkdXJtb2RlIDxtb2RlPiwgU2V0IER1cmF0aW9uIE1vZGUgIgorCQkJIjA9PkhXLCAxPT5TV1xuIik7CisJCWZwcmludGYoc3RkZXJyLCAiCWFlc2tleSA8dXNlcj4gPGtleT5cbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIglhZXNtb2RlIDxtb2RlPlxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiCXdsYW5tb2RlIDwwLDE+IDA6U3RhdGlvbiBtb2RlLCAiCisJCQkiMTpQSUJTUyBtb2RlXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICIJdGFsIDwwLDE+LCBHZXQgQ3VycmVudCBUYWxseSBJbmZvLCAiCisJCQkiMD0+cmVhZCwgMT0+cmVhZCBhbmQgcmVzZXRcbiIpOwogCi0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQorCQlleGl0KDEpOworCX0KIAotICAgIHN0cmNweShyZXEuaWZyX25hbWUsIGFyZ3ZbMV0pOwotICAgIHpkcmVxLmFkZHIgPSAwOwotICAgIHpkcmVxLnZhbHVlID0gMDsKKwlzdHJjcHkocmVxLmlmcl9uYW1lLCBhcmd2WzFdKTsKKwl6ZHJlcS5hZGRyID0gMDsKKwl6ZHJlcS52YWx1ZSA9IDA7CiAKLSAgICAvKiBhIHNpbGx5IHJhdyBzb2NrZXQganVzdCBmb3IgaW9jdGwoKWxpbmcgaXQgKi8KLSAgICBzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX1JBVyk7Ci0gICAgaWYgKHNvY2sgPCAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvY2tldCgpOiAlc1xuIiwgYXJndlswXSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9CisJLyogYSBzaWxseSByYXcgc29ja2V0IGp1c3QgZm9yIGlvY3RsKClsaW5nIGl0ICovCisJc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1JBVywgSVBQUk9UT19SQVcpOworCWlmIChzb2NrIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb2NrZXQoKTogJXNcbiIsIGFyZ3ZbMF0sIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoMSk7CisJfQogCi0gICAgaWYgKGFyZ2MgPj0gNCkKLSAgICB7Ci0gICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJXgiLCAmYWRkcik7Ci0gICAgfQorCWlmIChhcmdjID49IDQpCisJCXNzY2FuZihhcmd2WzNdLCAiJXgiLCAmYWRkcik7CiAKLSAgICBpZiAoYXJnYyA+PSA1KQotICAgIHsKLSAgICAgICAgc3NjYW5mKGFyZ3ZbNF0sICIleCIsICZ2YWx1ZSk7Ci0gICAgfQorCWlmIChhcmdjID49IDUpCisJCXNzY2FuZihhcmd2WzRdLCAiJXgiLCAmdmFsdWUpOwogCi0gICAgemRyZXEuYWRkciA9IGFkZHI7Ci0gICAgemRyZXEudmFsdWUgPSB2YWx1ZTsKKwl6ZHJlcS5hZGRyID0gYWRkcjsKKwl6ZHJlcS52YWx1ZSA9IHZhbHVlOwogCi0gICAgaWYgKCFzdHJjbXAoYXJndlsyXSwgInJlYWQiKSkKLSAgICB7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JFR19SRUFEOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJtZW0iKSkKLSAgICB7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX01FTV9EVU1QOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ3cml0ZSIpKQotICAgIHsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfUkVHX1dSSVRFOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJyZWciKSkKLSAgICB7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JFR19EVU1QOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0eGQiKSkKLSAgICB7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1RYRF9EVU1QOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJyeGQiKSkKLSAgICB7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JYRF9EVU1QOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJybWVtIikpCi0gICAgewotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9NRU1fUkVBRDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAid21lbSIpKQotICAgIHsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfTUVNX1dSSVRFOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJkbWF0IikpCi0gICAgewotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9ETUFfVEVTVDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicmVndCIpKQotICAgIHsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfUkVHX1RFU1Q7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInRlc3QiKSkKLSAgICB7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1RFU1Q7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInRhbCIpKQotICAgIHsKLSAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKLSAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1RBTExZOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJydHMiKSkKLSAgICB7Ci0gICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7Ci0gICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOwotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SVFM7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIm1peCIpKQotICAgIHsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfTUlYX01PREU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImZyYWciKSkKLSAgICB7Ci0gICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7Ci0gICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOwotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9GUkFHOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJzY2FuIikpCi0gICAgewotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9TQ0FOOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJza2V5IikpCi0gICAgewotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9LRVk7CisJaWYgKCFzdHJjbXAoYXJndlsyXSwgInJlYWQiKSkKKwkJemRyZXEuY21kID0gWk1fSU9DVExfUkVHX1JFQUQ7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAibWVtIikpCisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX01FTV9EVU1QOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIndyaXRlIikpCisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JFR19XUklURTsKKwllbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJyZWciKSkKKwkJemRyZXEuY21kID0gWk1fSU9DVExfUkVHX0RVTVA7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAidHhkIikpCisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX1RYRF9EVU1QOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInJ4ZCIpKQorCQl6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SWERfRFVNUDsKKwllbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJybWVtIikpCisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX01FTV9SRUFEOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIndtZW0iKSkKKwkJemRyZXEuY21kID0gWk1fSU9DVExfTUVNX1dSSVRFOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImRtYXQiKSkKKwkJemRyZXEuY21kID0gWk1fSU9DVExfRE1BX1RFU1Q7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicmVndCIpKQorCQl6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SRUdfVEVTVDsKKwllbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0ZXN0IikpCisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX1RFU1Q7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAidGFsIikpIHsKKwkJc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKwkJemRyZXEuYWRkciA9IGFkZHI7CisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX1RBTExZOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicnRzIikpIHsKKwkJc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKwkJemRyZXEuYWRkciA9IGFkZHI7CisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JUUzsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIm1peCIpKSB7CisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX01JWF9NT0RFOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAiZnJhZyIpKSB7CisJCXNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisJCXpkcmVxLmFkZHIgPSBhZGRyOworCQl6ZHJlcS5jbWQgPSBaTV9JT0NUTF9GUkFHOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAic2NhbiIpKSB7CisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX1NDQU47CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJza2V5IikpIHsKKwkJemRyZXEuY21kID0gWk1fSU9DVExfS0VZOwogCi0gICAgICAgIGlmIChhcmdjID49IDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdGVtcFsyOV07Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGludCBrZXlMZW47Ci0gICAgICAgICAgICBpbnQgZW5jVHlwZTsKKwkJaWYgKGFyZ2MgPj0gNCkgeworCQkJdW5zaWduZWQgY2hhciB0ZW1wWzI5XTsKKwkJCWludCBpOworCQkJaW50IGtleUxlbjsKKwkJCWludCBlbmNUeXBlOwogCi0gICAgICAgICAgICBrZXlMZW4gPSBzdHJsZW4oYXJndlszXSk7CisJCQlrZXlMZW4gPSBzdHJsZW4oYXJndlszXSk7CiAKLSAgICAgICAgICAgIGlmIChrZXlMZW4gPT0gMTApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCIsICZ0ZW1wWzBdLCAmdGVtcFsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wWzJdLCAmdGVtcFszXSwgJnRlbXBbNF0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoa2V5TGVuID09IDI2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFswXSwgJnRlbXBbMV0sICZ0ZW1wWzJdLCAmdGVtcFszXSwgJnRlbXBbNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFs1XSwgJnRlbXBbNl0sICZ0ZW1wWzddLCAmdGVtcFs4XSwgJnRlbXBbOV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbMTBdLCAmdGVtcFsxMV0sICZ0ZW1wWzEyXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChrZXlMZW4gPT0gNTgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFswXSwgJnRlbXBbMV0sICZ0ZW1wWzJdLCAmdGVtcFszXSwgJnRlbXBbNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFs1XSwgJnRlbXBbNl0sICZ0ZW1wWzddLCAmdGVtcFs4XSwgJnRlbXBbOV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFsxMF0sICZ0ZW1wWzExXSwgJnRlbXBbMTJdLCAmdGVtcFsxM10sICZ0ZW1wWzE0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wWzE1XSwgJnRlbXBbMTZdLCAmdGVtcFsxN10sICZ0ZW1wWzE4XSwgJnRlbXBbMTldLAotICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbMjBdLCAmdGVtcFsyMV0sICZ0ZW1wWzIyXSwgJnRlbXBbMjNdLCAmdGVtcFsyNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFsyNV0sICZ0ZW1wWzI2XSwgJnRlbXBbMjddLCAmdGVtcFsyOF0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBrZXkgbGVuZ3RoXG4iKTsKLSAgICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgemRyZXEuYWRkciA9IGtleUxlbi8yOworCQkJaWYgKGtleUxlbiA9PSAxMCkKKwkJCQlzc2NhbmYoYXJndlszXSwgIiUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKwkJCQkJJnRlbXBbMF0sICZ0ZW1wWzFdLCAmdGVtcFsyXSwgJnRlbXBbM10sCisJCQkJCSZ0ZW1wWzRdKTsKKwkJCWVsc2UgaWYgKGtleUxlbiA9PSAyNikKKwkJCQlzc2NhbmYoYXJndlszXSwgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIKKwkJCQkJIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorCQkJCQkmdGVtcFswXSwgJnRlbXBbMV0sICZ0ZW1wWzJdLCAmdGVtcFszXSwKKwkJCQkJJnRlbXBbNF0sICZ0ZW1wWzVdLCAmdGVtcFs2XSwgJnRlbXBbN10sCisJCQkJCSZ0ZW1wWzhdLCAmdGVtcFs5XSwgJnRlbXBbMTBdLAorCQkJCQkmdGVtcFsxMV0sICZ0ZW1wWzEyXSk7CisJCQllbHNlIGlmIChrZXlMZW4gPT0gNTgpCisJCQkJc3NjYW5mKGFyZ3ZbM10sICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiCisJCQkJCSIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiCisJCQkJCSIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiCisJCQkJCSIlMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisJCQkJCSZ0ZW1wWzBdLCAmdGVtcFsxXSwgJnRlbXBbMl0sICZ0ZW1wWzNdLAorCQkJCQkmdGVtcFs0XSwgJnRlbXBbNV0sICZ0ZW1wWzZdLCAmdGVtcFs3XSwKKwkJCQkJJnRlbXBbOF0sICZ0ZW1wWzldLCAmdGVtcFsxMF0sCisJCQkJCSZ0ZW1wWzExXSwgJnRlbXBbMTJdLCAmdGVtcFsxM10sCisJCQkJCSZ0ZW1wWzE0XSwgJnRlbXBbMTVdLCAmdGVtcFsxNl0sCisJCQkJCSZ0ZW1wWzE3XSwgJnRlbXBbMThdLCAmdGVtcFsxOV0sCisJCQkJCSZ0ZW1wWzIwXSwgJnRlbXBbMjFdLCAmdGVtcFsyMl0sCisJCQkJCSZ0ZW1wWzIzXSwgJnRlbXBbMjRdLCAmdGVtcFsyNV0sCisJCQkJCSZ0ZW1wWzI2XSwgJnRlbXBbMjddLCAmdGVtcFsyOF0pOworCQkJZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGtleSBsZW5ndGhcbiIpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQl6ZHJlcS5hZGRyID0ga2V5TGVuLzI7CiAKLSAgICAgICAgICAgIGZvcihpPTA7IGk8emRyZXEuYWRkcjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHpkcmVxLmRhdGFbaV0gPSB0ZW1wW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRmKCJFcnJvciA6IEtleSByZXF1aXJlZCFcbiIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInJhdGUiKSkKLSAgICB7Ci0gICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisJCQlmb3IgKGkgPSAwOyBpIDwgemRyZXEuYWRkcjsgaSsrKQorCQkJCXpkcmVxLmRhdGFbaV0gPSB0ZW1wW2ldOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJFcnJvciA6IEtleSByZXF1aXJlZCFcbiIpOworCQl9CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJyYXRlIikpIHsKKwkJc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKIAotICAgICAgICBpZiAoYWRkciA+IDI4KQotICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgcmF0ZSwgcmFuZ2U6MH4yOFxuIik7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOwotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SQVRFOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJlbmMiKSkKLSAgICB7Ci0gICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisJCWlmIChhZGRyID4gMjgpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCByYXRlLCByYW5nZTowfjI4XG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJemRyZXEuYWRkciA9IGFkZHI7CisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JBVEU7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJlbmMiKSkgeworCQlzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOwogCi0gICAgICAgIGlmIChhZGRyID4gMykKLSAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGVuY3J5cHRpb24gbW9kZSwgcmFuZ2U6MH4zXG4iKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KKwkJaWYgKGFkZHIgPiAzKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgZW5jcnlwdGlvbiBtb2RlLCByYW5nZTowfjNcbiIpOworCQkJZXhpdCgxKTsKKwkJfQogCi0gICAgICAgIGlmIChhZGRyID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZHIgPSA1OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFkZHIgPT0gMykKLSAgICAgICAgewotICAgICAgICAgICAgYWRkciA9IDY7Ci0gICAgICAgIH0KKwkJaWYgKGFkZHIgPT0gMikKKwkJCWFkZHIgPSA1OworCQllbHNlIGlmIChhZGRyID09IDMpCisJCQlhZGRyID0gNjsKIAotICAgICAgICB6ZHJlcS5hZGRyID0gYWRkcjsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfRU5DUllQVElPTl9NT0RFOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0eGNudCIpKQotICAgIHsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfR0VUX1RYQ05UOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJkYWdjbnQiKSkKLSAgICB7Ci0gICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisJCXpkcmVxLmFkZHIgPSBhZGRyOworCQl6ZHJlcS5jbWQgPSBaTV9JT0NUTF9FTkNSWVBUSU9OX01PREU7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0eGNudCIpKSB7CisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX0dFVF9UWENOVDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImRhZ2NudCIpKSB7CisJCXNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CiAKLSAgICAgICAgaWYgKGFkZHIgIT0gMCAmJiBhZGRyICE9IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhlIHZhbHVlIHNob3VsZCBiZSAwIG9yIDFcbiIpOwotICAgICAgICAgICAgZXhpdCgwKTsKLSAgICAgICAgfQorCQlpZiAoYWRkciAhPSAwICYmIGFkZHIgIT0gMSkgeworCQkJZnByaW50ZihzdGRlcnIsICJUaGUgdmFsdWUgc2hvdWxkIGJlIDAgb3IgMVxuIik7CisJCQlleGl0KDApOworCQl9CiAKLSAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX0dFVF9ERUFHR19DTlQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImR1cm1vZGUiKSkKLSAgICB7Ci0gICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisJCXpkcmVxLmFkZHIgPSBhZGRyOworCQl6ZHJlcS5jbWQgPSBaTV9JT0NUTF9HRVRfREVBR0dfQ05UOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAiZHVybW9kZSIpKQl7CisJCXNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CiAKLSAgICAgICAgaWYgKGFkZHIgIT0gMCAmJiBhZGRyICE9IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhlIER1cmF0aW9uIG1vZGUgc2hvdWxkIGJlIDAgb3IgMVxuIik7Ci0gICAgICAgICAgICBleGl0KDApOwotICAgICAgICB9CisJCWlmIChhZGRyICE9IDAgJiYgYWRkciAhPSAxKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlRoZSBEdXJhdGlvbiBtb2RlIHNob3VsZCBiZSAwIG9yIDFcbiIpOworCQkJZXhpdCgwKTsKKwkJfQogCi0gICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOwotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9EVVJBVElPTl9NT0RFOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJhZXNrZXkiKSkKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgdGVtcFsxNl07Ci0gICAgICAgIGludCBpOworCQl6ZHJlcS5hZGRyID0gYWRkcjsKKwkJemRyZXEuY21kID0gWk1fSU9DVExfRFVSQVRJT05fTU9ERTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImFlc2tleSIpKSB7CisJCXVuc2lnbmVkIGNoYXIgdGVtcFsxNl07CisJCWludCBpOwogCi0gICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisJCXNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CiAKLSAgICAgICAgc3NjYW5mKGFyZ3ZbNF0sICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwgJnRlbXBbMF0sICZ0ZW1wWzFdLCAmdGVtcFsyXSwgJnRlbXBbM10sICZ0ZW1wWzRdLCAmdGVtcFs1XSwgJnRlbXBbNl0sICZ0ZW1wWzddLCAmdGVtcFs4XSwgJnRlbXBbOV0sICZ0ZW1wWzEwXSwgJnRlbXBbMTFdLCAmdGVtcFsxMl0sICZ0ZW1wWzEzXSwgJnRlbXBbMTRdLCAmdGVtcFsxNV0pOworCQlzc2NhbmYoYXJndls0XSwgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiCisJCQkiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwgJnRlbXBbMF0sICZ0ZW1wWzFdLAorCQkJJnRlbXBbMl0sICZ0ZW1wWzNdLCAmdGVtcFs0XSwgJnRlbXBbNV0sICZ0ZW1wWzZdLAorCQkJJnRlbXBbN10sICZ0ZW1wWzhdLCAmdGVtcFs5XSwgJnRlbXBbMTBdLCAmdGVtcFsxMV0sCisJCQkmdGVtcFsxMl0sICZ0ZW1wWzEzXSwgJnRlbXBbMTRdLCAmdGVtcFsxNV0pOwogCi0gICAgICAgIGZvcihpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHpkcmVxLmRhdGFbaV0gPSB0ZW1wW2ldOwotICAgICAgICB9CisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJemRyZXEuZGF0YVtpXSA9IHRlbXBbaV07CiAKLSAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1NFVF9BRVNfS0VZOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJhZXNtb2RlIikpCi0gICAgewotICAgICAgICBzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOworCQl6ZHJlcS5hZGRyID0gYWRkcjsKKwkJemRyZXEuY21kID0gWk1fSU9DVExfU0VUX0FFU19LRVk7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJhZXNtb2RlIikpIHsKKwkJc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKIAotICAgICAgICB6ZHJlcS5hZGRyID0gYWRkcjsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfU0VUX0FFU19NT0RFOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ3bGFubW9kZSIpKQotICAgIHsKLSAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKwkJemRyZXEuYWRkciA9IGFkZHI7CisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX1NFVF9BRVNfTU9ERTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIndsYW5tb2RlIikpIHsKKwkJc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKIAotICAgICAgICB6ZHJlcS5hZGRyID0gYWRkcjsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfU0VUX1BJQlNTX01PREU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3IgYWN0aW9uXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9CisJCXpkcmVxLmFkZHIgPSBhZGRyOworCQl6ZHJlcS5jbWQgPSBaTV9JT0NUTF9TRVRfUElCU1NfTU9ERTsKKwl9IGVsc2UgCXsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvciBhY3Rpb25cbiIpOworCQlleGl0KDEpOworCX0KIAotICAgIHJlcS5pZnJfZGF0YSA9IChjaGFyICopJnpkcmVxOwotICAgIHNldF9pb2N0bChzb2NrLCAmcmVxKTsKKwlyZXEuaWZyX2RhdGEgPSAoY2hhciAqKSZ6ZHJlcTsKKwlzZXRfaW9jdGwoc29jaywgJnJlcSk7CiAKIGZhaWw6Ci0gICAgZXhpdCgwKTsKKwlleGl0KDApOwogfQogCiB1bnNpZ25lZCBjaGFyIGFzY3RvaGV4KGNoYXIgKnN0cikKIHsKLSAgICB1bnNpZ25lZCBjaGFyIHZhbHVlOworCXVuc2lnbmVkIGNoYXIgdmFsdWU7CiAKLSAgICB2YWx1ZSA9IGhleCgqc3RyKSAmIDB4MGY7Ci0gICAgdmFsdWUgPSB2YWx1ZSA8PCA0OwotICAgIHN0cisrOwotICAgIHZhbHVlIHw9IGhleCgqc3RyKSAmIDB4MGY7CisJdmFsdWUgPSBoZXgoKnN0cikgJiAweDBmOworCXZhbHVlID0gdmFsdWUgPDwgNDsKKwlzdHIrKzsKKwl2YWx1ZSB8PSBoZXgoKnN0cikgJiAweDBmOwogCi0gICAgcmV0dXJuIHZhbHVlOworCXJldHVybiB2YWx1ZTsKIH0KIAogY2hhciBoZXgoY2hhciB2KQogewotICAgIGlmKGlzZGlnaXQodikpCi0gICAgICAgIHJldHVybiB2IC0gJzAnOwotICAgIGVsc2UgaWYoaXN4ZGlnaXQodikpCi0gICAgICAgIHJldHVybiAodG9sb3dlcih2KSAtICdhJyArIDEwKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOworCWlmIChpc2RpZ2l0KHYpKQorCQlyZXR1cm4gdiAtICcwJzsKKwllbHNlIGlmIChpc3hkaWdpdCh2KSkKKwkJcmV0dXJuIHRvbG93ZXIodikgLSAnYScgKyAxMDsKKwllbHNlCisJCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9hdGhyX2NvbW1vbi5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvYXRocl9jb21tb24uaAppbmRleCA2MjBmNzhhLi4zZTMyZjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9hdGhyX2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2F0aHJfY29tbW9uLmgKQEAgLTY4LDcgKzY4LDcgQEAKIAogI2RlZmluZSBaTV9XQVBJX0tFWV9TSVpFICAgICAgICAgICAgICAgIDMyCiAjZGVmaW5lIFpNX1dBUElfSVZfTEVOICAgICAgICAgICAgICAgICAgMTYKLSNlbmRpZiAvL1pNX0VOQUxCRV9XQVBJCisjZW5kaWYgLyogWk1fRU5BTEJFX1dBUEkgKi8KIC8qIHN0cnVjdHVyZSBkZWZpbml0aW9uICovCiAKIHN0cnVjdCBhdGhyX3dsYW5fcGFyYW0gewpAQCAtMTIzLDcgKzEyMyw3IEBACiAJCQl1OCBrZXlbWk1fV0FQSV9LRVlfU0laRV07CiAJCX0gY3J5cHQ7CiAJCXN0cnVjdCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1OCB3YXBpX3BvbGljeTsKKwkJCXU4IHdhcGlfcG9saWN5OwogCQl9IGluZm87CiAJfSB1OwogfTsKQEAgLTEzMiwxMCArMTMyLDEwIEBACiB7CiAJdTE2CW1zZ190eXBlOwogCXUxNglkYXRhbGVuOwotICAgIAl1OAlzdGFfbWFjW0VUSF9BTEVOXTsKKwl1OAlzdGFfbWFjW0VUSF9BTEVOXTsKIAl1OAlyZXNlcnZlX2RhdGFbMl07Ci0gICAgCXU4CWdzbltaTV9XQVBJX0lWX0xFTl07CisJdTgJZ3NuW1pNX1dBUElfSVZfTEVOXTsKIAl1OAl3aWVbMjU2XTsKIH07Ci0jZW5kaWYgLy9aTV9FTkFMQkVfV0FQSQorI2VuZGlmIC8qIFpNX0VOQUxCRV9XQVBJICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL29hbF9kdC5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX2R0LmgKaW5kZXggZTgyYjk3Ny4uZmI2ZDExYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX2R0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX2R0LmgKQEAgLTM5LDE1ICszOSwxNSBAQAogdHlwZWRlZiAgICAgc2hvcnQgICAgICAgICAgICAgICBzMTZfdDsKIHR5cGVkZWYgICAgIGNoYXIgICAgICAgICAgICAgICAgczhfdDsKIAotI2lmbmRlZiAgICAgVFJVRQotI2RlZmluZSAgICAgVFJVRSAgICAgICAgICAgICAgICAoMT09MSkKKyNpZm5kZWYgVFJVRQorI2RlZmluZSAgICAgVFJVRSAgICAgICAgICAgICAgICAoMSA9PSAxKQogI2VuZGlmCiAKLSNpZm5kZWYgICAgIEZBTFNFCi0jZGVmaW5lICAgICBGQUxTRSAgICAgICAgICAgICAgICgxPT0wKQorI2lmbmRlZiBGQUxTRQorI2RlZmluZSAgICAgRkFMU0UgICAgICAgICAgICAgICAoMSA9PSAwKQogI2VuZGlmCiAKLSNpZm5kZWYgICAgIE5VTEwKKyNpZm5kZWYJTlVMTAogI2RlZmluZSAgICAgTlVMTCAgICAgICAgICAgICAgICAwCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX21hcmMuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL29hbF9tYXJjLmgKaW5kZXggMjA2MTExNi4uZTdhOTA4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX21hcmMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9vYWxfbWFyYy5oCkBAIC0zNCwxNyArMzQsMTkgQEAKIC8qKioqKiBDcml0aWNhbCBzZWN0aW9uICoqKioqLwogLyogRGVjbGFyZSBmb3IgY3JpdGljYWwgc2VjdGlvbiAqLwogI2lmbmRlZiBaTV9IQUxQTFVTX0xPQ0sKLSNkZWZpbmUgem13X2dldF93bGFuX2RldihkZXYpICAgIHN0cnVjdCB6c1dsYW5EZXYgKndkID0gKHN0cnVjdCB6c1dsYW5EZXYqKSAoKCgoc3RydWN0IHVzYmRydl9wcml2YXRlKilkZXYtPnByaXYpLT53ZCkpCisjZGVmaW5lIHptd19nZXRfd2xhbl9kZXYoZGV2KSBzdHJ1Y3QgenNXbGFuRGV2ICp3ZCA9IChzdHJ1Y3QgenNXbGFuRGV2ICopIFwKKwkoKCgoc3RydWN0IHVzYmRydl9wcml2YXRlICopZGV2LT5wcml2KS0+d2QpKQogCiAjZGVmaW5lIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCkgdW5zaWduZWQgbG9uZyBpcnFGbGFnOwogCiAvKiBFbnRlciBjcml0aWNhbCBzZWN0aW9uICovCi0jZGVmaW5lIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldikgXAotICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmKCgoc3RydWN0IHVzYmRydl9wcml2YXRlICopKGRldi0+cHJpdikpLT5jc19sb2NrKSwgaXJxRmxhZyk7CisjZGVmaW5lIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldikgc3Bpbl9sb2NrX2lycXNhdmUoCVwKKwkmKCgoc3RydWN0IHVzYmRydl9wcml2YXRlICopKGRldi0+cHJpdikpLT5jc19sb2NrKSwgaXJxRmxhZyk7CiAKIC8qIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gKi8KICNkZWZpbmUgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KSBcCi0gICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJigoKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqKShkZXYtPnByaXYpKS0+Y3NfbG9jayksIGlycUZsYWcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJigoKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqKQlcCisJCQkoZGV2LT5wcml2KSktPmNzX2xvY2spLCBpcnFGbGFnKTsKICNlbHNlCiAjZGVmaW5lIHptd19nZXRfd2xhbl9kZXYoZGV2KSAgICBzdHJ1Y3QgenNXbGFuRGV2ICp3ZCA9IHpmd0dldFdsYW5EZXYoZGV2KTsKIApAQCAtNTIsMzEgKzU0LDI5IEBACiAjZGVmaW5lIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCkKIAogLyogRW50ZXIgY3JpdGljYWwgc2VjdGlvbiAqLwotI2RlZmluZSB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpIFwKLSAgICAgICAgemZ3RW50ZXJDcml0aWNhbFNlY3Rpb24oZGV2KTsKKyNkZWZpbmUgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KSB6ZndFbnRlckNyaXRpY2FsU2VjdGlvbihkZXYpOwogCiAvKiBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uICovCi0jZGVmaW5lIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldikgXAotICAgICAgICB6ZndMZWF2ZUNyaXRpY2FsU2VjdGlvbihkZXYpOworI2RlZmluZSB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpIHpmd0xlYXZlQ3JpdGljYWxTZWN0aW9uKGRldik7CiAjZW5kaWYKIAogLyoqKioqIEJ5dGUgb3JkZXIgY29udmVydGluZyAqKioqKi8KICNpZmRlZiBaTV9DT05GSUdfQklHX0VORElBTgotI2RlZmluZSB6bXdfY3B1X3RvX2xlMzIodikgICAgKCgodiAmIDB4ZmYwMDAwMDApID4+IDI0KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHYgJiAweDAwZmYwMDAwKSA+PiA4KSAgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMDAwZmYwMCkgPDwgOCkgIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDAwMDAwZmYpIDw8IDI0KSkKKyNkZWZpbmUgem13X2NwdV90b19sZTMyKHYpICAgIAkoKCh2ICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgCVwKKwkJCQkoKHYgJiAweDAwZmYwMDAwKSA+PiA4KSAgfCAJXAorCQkJCSgodiAmIDB4MDAwMGZmMDApIDw8IDgpICB8IAlcCisJCQkJKCh2ICYgMHgwMDAwMDBmZikgPDwgMjQpKQogCi0jZGVmaW5lIHptd19sZTMyX3RvX2NwdSh2KSAgICAoKCh2ICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDBmZjAwMDApID4+IDgpICB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHYgJiAweDAwMDBmZjAwKSA8PCA4KSAgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMDAwMDBmZikgPDwgMjQpKQorI2RlZmluZSB6bXdfbGUzMl90b19jcHUodikgICAgKCgodiAmIDB4ZmYwMDAwMDApID4+IDI0KSB8IAlcCisJCQkJKCh2ICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAJXAorCQkJCSgodiAmIDB4MDAwMGZmMDApIDw8IDgpIHwgCVwKKwkJCQkoKHYgJiAweDAwMDAwMGZmKSA8PCAyNCkpCiAKICNkZWZpbmUgem13X2NwdV90b19sZTE2KHYpICAgICgoKHYgJiAweGZmMDApID4+IDgpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDBmZikgPDwgOCkpCisJCQkJKCh2ICYgMHgwMGZmKSA8PCA4KSkKIAogI2RlZmluZSB6bXdfbGUxNl90b19jcHUodikgICAgKCgodiAmIDB4ZmYwMCkgPj4gOCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMGZmKSA8PCA4KSkKKwkJCQkoKHYgJiAweDAwZmYpIDw8IDgpKQogI2Vsc2UKICNkZWZpbmUgem13X2NwdV90b19sZTMyKHYpICAgICh2KQogI2RlZmluZSB6bXdfbGUzMl90b19jcHUodikgICAgKHYpCkBAIC04OCwzMyArODgsNDEgQEAKIC8qIENhbGxlZCB0byByZWFkL3dyaXRlIGJ1ZmZlciAqLwogI2lmbmRlZiBaTV9IQUxQTFVTX0xPQ0sKIAotI2RlZmluZSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpICoodThfdCopKCh1OF90KilidWYtPmRhdGErb2Zmc2V0KQotI2RlZmluZSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQpIHptd19jcHVfdG9fbGUxNigqKHUxNl90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpKQotI2RlZmluZSB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkgKih1OF90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpID0gdmFsdWUKLSNkZWZpbmUgem13X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpICoodTE2X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCkgPSB6bXdfY3B1X3RvX2xlMTYodmFsdWUpCi0jZGVmaW5lIHptd19idWZfZ2V0X2J1ZmZlcihkZXYsIGJ1ZikgKHU4X3QqKShidWYtPmRhdGEpCisjZGVmaW5lIHptd19idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkgKCoodThfdCAqKSgodThfdCAqKWJ1Zi0+ZGF0YStvZmZzZXQpKQorI2RlZmluZSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQpIHptd19jcHVfdG9fbGUxNigqKHUxNl90ICopCVwKKwkJCQkJKCh1OF90ICopYnVmLT5kYXRhK29mZnNldCkpCisjZGVmaW5lIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKSAoKih1OF90ICopCQlcCisJCQkJCSgodThfdCAqKWJ1Zi0+ZGF0YStvZmZzZXQpID0gdmFsdWUpCisjZGVmaW5lIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKSAoKih1MTZfdCAqKQkJXAorCQkJKCh1OF90ICopYnVmLT5kYXRhK29mZnNldCkgPSB6bXdfY3B1X3RvX2xlMTYodmFsdWUpKQorI2RlZmluZSB6bXdfYnVmX2dldF9idWZmZXIoZGV2LCBidWYpICh1OF90ICopKGJ1Zi0+ZGF0YSkKIAogI2Vsc2UKIAogI2RlZmluZSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpIHpmd0J1ZlJlYWRCeXRlKGRldiwgYnVmLCBvZmZzZXQpCiAjZGVmaW5lIHptd19idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCkgemZ3QnVmUmVhZEhhbGZXb3JkKGRldiwgYnVmLCBvZmZzZXQpCi0jZGVmaW5lIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKSB6ZndCdWZXcml0ZUJ5dGUoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpCi0jZGVmaW5lIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKSB6ZndCdWZXcml0ZUhhbGZXb3JkKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKQorI2RlZmluZSB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkgCQkJXAorCQkJemZ3QnVmV3JpdGVCeXRlKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKQorI2RlZmluZSB6bXdfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkJCQkJXAorCQkJemZ3QnVmV3JpdGVIYWxmV29yZChkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkKICNkZWZpbmUgem13X2J1Zl9nZXRfYnVmZmVyKGRldiwgYnVmKSB6ZndHZXRCdWZmZXIoZGV2LCBidWYpCiAKICNlbmRpZgogCiAvKioqKiogRGVidWcgbWVzc2FnZSAqKioqKi8KICNpZiAwCi0jZGVmaW5lIHptX2RlYnVnX21zZzAobXNnKSBwcmludGsoIiVzOiVzXG4iLCBfX2Z1bmNfXywgbXNnKTsKLSNkZWZpbmUgem1fZGVidWdfbXNnMShtc2csIHZhbCkgcHJpbnRrKCIlczolcyVsZFxuIiwgX19mdW5jX18sIFwKLSAgICAgICAgbXNnLCAodTMyX3QpdmFsKTsKLSNkZWZpbmUgem1fZGVidWdfbXNnMihtc2csIHZhbCkgcHJpbnRrKCIlczolcyVseGhcbiIsIF9fZnVuY19fLCBcCi0gICAgICAgIG1zZywgKHUzMl90KXZhbCk7Ci0jZGVmaW5lIHptX2RlYnVnX21zZ19zKG1zZywgdmFsKSBwcmludGsoIiVzOiVzJXNcbiIsIF9fZnVuY19fLCBcCi0gICAgICAgIG1zZywgdmFsKTsKLSNkZWZpbmUgem1fZGVidWdfbXNnX3AobXNnLCB2YWwxLCB2YWwyKSBwcmludGsoIiVzOiVzJTAxbGQuJTAybGRcbiIsIF9fZnVuY19fLCBcCi0gICAgICAgIG1zZywgKHZhbDEvdmFsMiksICgoKHZhbDEqMTAwKS92YWwyKSUxMDApKTsKKyNkZWZpbmUgem1fZGVidWdfbXNnMChtc2cpIHByaW50ayhLRVJOX0RFQlVHICIlczolc1xuIiwgX19mdW5jX18sIG1zZyk7CisjZGVmaW5lIHptX2RlYnVnX21zZzEobXNnLCB2YWwpIHByaW50ayhLRVJOX0RFQlVHICIlczolcyVsZFxuIiwgX19mdW5jX18sIFwKKwltc2csICh1MzJfdCl2YWwpOworI2RlZmluZSB6bV9kZWJ1Z19tc2cyKG1zZywgdmFsKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6JXMlbHhoXG4iLCBfX2Z1bmNfXywgXAorCW1zZywgKHUzMl90KXZhbCk7CisjZGVmaW5lIHptX2RlYnVnX21zZ19zKG1zZywgdmFsKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6JXMlc1xuIiwgX19mdW5jX18sIFwKKwltc2csIHZhbCk7CisjZGVmaW5lIHptX2RlYnVnX21zZ19wKG1zZywgdmFsMSwgdmFsMikgZG8geyAJCQlcCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6JXMlMDFsZC4lMDJsZFxuIiwJXAorCQkJCQkJX19mdW5jX18sIAlcCisJCQltc2csICh2YWwxL3ZhbDIpLCAoKCh2YWwxKjEwMCkvdmFsMiklMTAwKSk7CisJCQl9IHdoaWxlICgwKQogI2RlZmluZSB6bV9kYmcoUykgcHJpbnRrIFMKICNlbHNlCiAjZGVmaW5lIHptX2RlYnVnX21zZzAobXNnKQpAQCAtMTI1LDEwICsxMzMsMTAgQEAKICNkZWZpbmUgem1fZGJnKFMpCiAjZW5kaWYKIAotI2RlZmluZSB6bV9hc3NlcnQoZXhwcikgaWYoIShleHByKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcHJpbnRrKCAiQXRoZW9ycyBBc3NlcnRpb24gZmFpbGVkISAlcywlcywlcyxsaW5lPSVkXG4iLCAgIFwKLSAgICAgICAgI2V4cHIsX19GSUxFX18sX19mdW5jX18sX19MSU5FX18pOyAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfQorI2RlZmluZSB6bV9hc3NlcnQoZXhwcikgaWYgKCEoZXhwcikpIHsJCQkJCSBcCisJcHJpbnRrKEtFUk5fRVJSICJBdGhlb3JzIEFzc2VydGlvbiBmYWlsZWQhICVzLCAlcywgJXMsbGluZT0lZFxuIixcCisJCSNleHByLCBfX0ZJTEVfXywgX19mdW5jX18sIF9fTElORV9fKTsJCQkgXAorCX0KIAogI2RlZmluZSBEYmdQcmludCBwcmludGsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvdXNiZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy91c2JkcnYuYwppbmRleCA0OGFhMzBhLi5iMGFkYmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy91c2JkcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy91c2JkcnYuYwpAQCAtMTExLDcgKzExMSw3IEBACiAKIC8qIERlZmluaXRpb24gb2YgV2lyZWxlc3MgRXh0ZW5zaW9uICovCiAKLS8vd2lyZWxlc3MgZXh0ZW5zaW9uIGhlbHBlciBmdW5jdGlvbnMKKy8qIHdpcmVsZXNzIGV4dGVuc2lvbiBoZWxwZXIgZnVuY3Rpb25zICovCiBleHRlcm4gaW50IHVzYmRydl9pb2N0bF9zZXRlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSk7CiBleHRlcm4gaW50IHVzYmRydl9pb2N0bF9zZXRydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpycnEpOwogLyogV2lyZWxlc3MgRXh0ZW5zaW9uIEhhbmRsZXIgZnVuY3Rpb25zICovCkBAIC0yODIsOCArMjgyLDggQEAKIH07CiAKIC8qIFdEUyAqLwotLy9zdHJ1Y3QgenNXZHNTdHJ1Y3Qgd2RzW1pNX1dEU19QT1JUX05VTUJFUl07Ci0vL3ZvaWQgemZJbml0V2RzU3RydWN0KHZvaWQpOworLyogc3RydWN0IHpzV2RzU3RydWN0IHdkc1taTV9XRFNfUE9SVF9OVU1CRVJdOyAqLworLyogdm9pZCB6ZkluaXRXZHNTdHJ1Y3Qodm9pZCk7CSovCiAKIC8qIFZBUCAqLwogc3RydWN0IHpzVmFwU3RydWN0IHZhcFtaTV9WQVBfUE9SVF9OVU1CRVJdOwpAQCAtMzE0LDEzICszMTQsMTEgQEAKICAgICAgICAgcmV0dXJuIElSUV9OT05FOwogCiAgICAgLyogdGhlIGRldmljZSBpcyBjbG9zZWQsIGRvbid0IGNvbnRpbnVlIG9yIGVsc2UgYmFkIHRoaW5ncyBtYXkgaGFwcGVuLiAqLwotICAgIGlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CisgICAgaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCiAgICAgICAgIHJldHVybiBJUlFfTk9ORTsKLSAgICB9CiAKLSAgICBpZiAobWFjcC0+ZHJpdmVyX2lzb2xhdGVkKSB7CisgICAgaWYgKG1hY3AtPmRyaXZlcl9pc29sYXRlZCkKICAgICAgICAgcmV0dXJuIElSUV9OT05FOwotICAgIH0KIAogI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKICAgICAvL3pmaUlzclBjaShkZXYpOwpAQCAtMzQwLDkgKzMzOCwxMSBAQAogCiAgICAgcHJpbnRrKCJFbnRlciBvcGVuKClcbiIpOwogCi0vLyNpZm5kZWYgQ09ORklHX1NNUAotLy8gICAgcmVhZF9sb2NrKCYobWFjcC0+aXNvbGF0ZV9sb2NrKSk7Ci0vLyNlbmRpZgorLyoKKyAqICNpZm5kZWYgQ09ORklHX1NNUAorICogICByZWFkX2xvY2soJihtYWNwLT5pc29sYXRlX2xvY2spKTsKKyAqICNlbmRpZgorICovCiAgICAgaWYgKG1hY3AtPmRyaXZlcl9pc29sYXRlZCkgewogICAgICAgICByYyA9IC1FQlVTWTsKICAgICAgICAgZ290byBleGl0OwpAQCAtMzkzLDExICszOTMsMTEgQEAKICAgICBkZXYtPmRldl9hZGRyWzRdID0gYWRkcls0XTsKICAgICBkZXYtPmRldl9hZGRyWzVdID0gYWRkcls1XTsKICNlbmRpZgotICAgIC8vemZ3TWFjQWRkcmVzc05vdGlmeSgpIHdpbGwgYmUgY2FsbGVkIHRvIHNldHVwIGRldi0+ZGV2X2FkZHJbXQorICAgIC8qIHpmd01hY0FkZHJlc3NOb3RpZnkoKSB3aWxsIGJlIGNhbGxlZCB0byBzZXR1cCBkZXYtPmRldl9hZGRyW10gKi8KIAogICAgIHpmTG54Q3JlYXRlVGhyZWFkKGRldik7CiAKLSAgICBtb2RfdGltZXIoJihtYWNwLT5oYlRpbWVyMTBtcyksIGppZmZpZXMgKyAoMSpIWikvMTAwKTsgICAvLzEwIG1zCisgICAgbW9kX3RpbWVyKCYobWFjcC0+aGJUaW1lcjEwbXMpLCBqaWZmaWVzICsgKDEqSFopLzEwMCk7ICAgLyogMTAgbXMgKi8KIAogICAgIG5ldGlmX2NhcnJpZXJfb24oZGV2KTsKIApAQCAtNDI1LDE1ICs0MjUsMTUgQEAKIAogICAgICNpZiBaTV9TSEFSRV9BVVRIID09IDEKICAgICB6ZmlXbGFuU2V0QXV0aGVudGljYXRpb25Nb2RlKGRldiwgMSk7Ci0gICAgI2VuZGlmIC8vI2lmIFpNX1NIQVJFX0FVVEggPT0gMQotICAjZW5kaWYgLy8jaWYgWk1fV0VQX01PTUUgPT0gMQorICAgICNlbmRpZiAvKiAjaWYgWk1fU0hBUkVfQVVUSCA9PSAxICovCisgICNlbmRpZiAvKiAjaWYgWk1fV0VQX01PTUUgPT0gMSAqLwogCiAjZWxpZiBaTV9QSUJTU19NT0RFID09IDEKICAgICB6ZmlXbGFuU2V0V2xhbk1vZGUoZGV2LCBaTV9NT0RFX1BTRVVETyk7CiAjZWxzZQogICAgIHpmaVdsYW5TZXRXbGFuTW9kZShkZXYsIFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpOwogI2VuZGlmCi0gICAgLy96ZmlXbGFuU2V0Q2hhbm5lbChkZXYsIFpNX0NIQU5ORUwsIEZBTFNFKTsKKyAgICAvKiB6ZmlXbGFuU2V0Q2hhbm5lbChkZXYsIFpNX0NIQU5ORUwsIEZBTFNFKTsgKi8KICAgICB6ZmlXbGFuU2V0RnJlcXVlbmN5KGRldiwgMjQ2MjAwMCwgRkFMU0UpOwogICAgIHpmaVdsYW5TZXRSdHNUaHJlc2hvbGQoZGV2LCAzMjc2Nyk7CiAgICAgemZpV2xhblNldEZyYWdUaHJlc2hvbGQoZGV2LCAwKTsKQEAgLTcyMCw3ICs3MjAsNyBAQAogewogICAgIHUxNl90IGk7CiAKLSAgICBmb3IgKGk9MDsgaTxaTV9WQVBfUE9SVF9OVU1CRVI7IGkrKykKKyAgICBmb3IgKGkgPSAwOyBpIDwgWk1fVkFQX1BPUlRfTlVNQkVSOyBpKyspCiAgICAgewogICAgICAgICB2YXBbaV0uZGV2ID0gTlVMTDsKICAgICAgICAgdmFwW2ldLm9wZW5GbGFnID0gMDsKQEAgLTExMjgsOCArMTEyOCw3IEBACiAKICAgICBwcmludGsoS0VSTl9FUlIgIlR4UUNudDogJWRcbiIsIFR4UUNudCk7CiAKLSAgICBmb3IoaWkgPSAwOyBpaSA8IFR4UUNudDsgaWkrKykKLSAgICB7CisgICAgZm9yIChpaSA9IDA7IGlpIDwgVHhRQ250OyBpaSsrKSB7CiAgICAgICAgIFVzYlR4UV90ICpUeFEgPSB6ZkxueEdldFVzYlR4QnVmZmVyKGRldik7CiAKICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJkZXZfa2ZyZWVfc2tiX2FueVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy91c2JkcnYuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3VzYmRydi5oCmluZGV4IDc4MDA0MDYuLjMzMGQxYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3VzYmRydi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3VzYmRydi5oCkBAIC00NSw3ICs0NSw3IEBACiAjaW5jbHVkZSAib2FsX2R0LmgiCiAjaW5jbHVkZSAib2FsX21hcmMuaCIKICNpbmNsdWRlICI4MDIxMWNvcmUvcHViX3pmaS5oIgotLy8jaW5jbHVkZSAicHViX3pmdy5oIgorLyogI2luY2x1ZGUgInB1Yl96ZncuaCIJKi8KICNpbmNsdWRlICI4MDIxMWNvcmUvcHViX3VzYi5oIgogCiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CkBAIC04Niw4ICs4Niw3IEBACiAjZGVmaW5lIFpNX01BWF9SWF9VUkJfTlVNICAgICAgICAgICAgICAgICAgIDE2CiAjZGVmaW5lIFpNX01BWF9UWF9CVUZfTlVNICAgICAgICAgICAgICAgICAgIDEyOAogCi10eXBlZGVmIHN0cnVjdCBVc2JUeFEKLXsKK3R5cGVkZWYgc3RydWN0IFVzYlR4USB7CiAgICAgemJ1Zl90ICpidWY7CiAgICAgdThfdCBoZHJbODBdOwogICAgIHUxNl90IGhkcmxlbjsKQEAgLTEwMCwxNyArOTksMTYgQEAKIAogCiBzdHJ1Y3QgemRhcF9pb2N0bCB7Ci0JdTE2X3QgY21kOyAgICAgICAgICAgICAgICAvKiBDb21tYW5kIHRvIHJ1biAqLwotCXUzMl90IGFkZHI7ICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIgKi8KLQl1MzJfdCB2YWx1ZTsgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyICovCisJdTE2X3QgY21kOwkJICAvKiBDb21tYW5kIHRvIHJ1biAqLworCXUzMl90IGFkZHI7CQkgIC8qIExlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIgKi8KKwl1MzJfdCB2YWx1ZTsJCS8qIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyICovCiAJdThfdAlkYXRhWzB4MTAwXTsKIH07CiAKICNkZWZpbmUgWk1fT0FMX01BWF9TVEFfU1VQUE9SVCAxNgogCi1zdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUKLXsKLQkvL2xpbnV4IHVzZWQKK3N0cnVjdCB1c2JkcnZfcHJpdmF0ZSB7CisJLyogbGludXggdXNlZCAqLwogCXN0cnVjdCBuZXRfZGV2aWNlIAkqZGV2aWNlOwogI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKIAlzdHJ1Y3QgcGNpX2RldiAJCSpwZGV2OwpAQCAtMTIxLDcgKzExOSw3IEBACiAjZW5kaWYKIAlzdHJ1Y3QgZHJpdmVyX3N0YXRzIGRydl9zdGF0czsKIAljaGFyIGlmbmFtZVtJRk5BTVNJWl07Ci0JaW50CSAgICAgICAgICAgICAgICB1c2luZ19kYWM7CisJaW50CQkJICB1c2luZ19kYWM7CiAJdThfdAkJCXJldl9pZDsJCS8qIGFkYXB0ZXIgUENJIHJldmlzaW9uIElEICovCiAJcndsb2NrX3QgCQlpc29sYXRlX2xvY2s7CiAgICAgc3BpbmxvY2tfdCAgICAgIGNzX2xvY2s7CkBAIC0xMzAsNzggKzEyOCw3NiBAQAogCXZvaWQJCQkqcmVncDsKICNlbmRpZgogCi0gICAgICAgIC8qIHRpbWVyIGZvciBoZWFydCBiZWF0ICovCisJIC8qIHRpbWVyIGZvciBoZWFydCBiZWF0ICovCiAJc3RydWN0IHRpbWVyX2xpc3QgaGJUaW1lcjEwbXM7CiAKIAkvKiBGb3IgZHJpdmVyIGNvcmUgKi8KLQl2b2lkKiB3ZDsKKwl2b2lkICp3ZDsKIAogI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKLQl1OF90ICAgICAgICAgICAgICAgICAgICB0eFVzYkJ1ZltaTV9NQVhfVFhfVVJCX05VTV1bWk1fVVNCX1RYX0JVRl9TSVpFXTsKLQl1OF90ICAgICAgICAgICAgICAgICAgICByZWdVc2JSZWFkQnVmW1pNX1VTQl9SRUdfTUFYX0JVRl9TSVpFXTsKLQl1OF90ICAgICAgICAgICAgICAgICAgICByZWdVc2JXcml0ZUJ1ZltaTV9VU0JfUkVHX01BWF9CVUZfU0laRV07CisJdThfdAkJICAgICAgdHhVc2JCdWZbWk1fTUFYX1RYX1VSQl9OVU1dW1pNX1VTQl9UWF9CVUZfU0laRV07CisJdThfdAkJICAgICAgcmVnVXNiUmVhZEJ1ZltaTV9VU0JfUkVHX01BWF9CVUZfU0laRV07CisJdThfdAkJICAgICAgcmVnVXNiV3JpdGVCdWZbWk1fVVNCX1JFR19NQVhfQlVGX1NJWkVdOwogCXVyYl90CQkJKldsYW5UeERhdGFVcmJbWk1fTUFYX1RYX1VSQl9OVU1dOwogCXVyYl90CQkJKldsYW5SeERhdGFVcmJbWk1fTUFYX1JYX1VSQl9OVU1dOwogCXVyYl90CQkJKlJlZ091dFVyYjsKIAl1cmJfdAkJCSpSZWdJblVyYjsKLQlVc2JUeFFfdCAgICAgICAgICAgICAgICBVc2JUeEJ1ZlFbWk1fTUFYX1RYX0JVRl9OVU1dOwotCXpidWZfdCAgICAgICAgICAgICAgICAgICpVc2JSeEJ1ZlFbWk1fTUFYX1JYX1VSQl9OVU1dOwotICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBUeEJ1ZkhlYWQ7Ci0gICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFR4QnVmVGFpbDsKLSAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgVHhCdWZDbnQ7Ci0gICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFR4VXJiSGVhZDsKLSAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgVHhVcmJUYWlsOwotICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBUeFVyYkNudDsKLSAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgUnhCdWZIZWFkOwotICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBSeEJ1ZlRhaWw7Ci0gICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFJ4QnVmQ250OworCVVzYlR4UV90CQkgIFVzYlR4QnVmUVtaTV9NQVhfVFhfQlVGX05VTV07CisJemJ1Zl90CQkgICAgKlVzYlJ4QnVmUVtaTV9NQVhfUlhfVVJCX05VTV07CisJIHUxNl90CQkgICAgIFR4QnVmSGVhZDsKKwkgdTE2X3QJCSAgICAgVHhCdWZUYWlsOworCSB1MTZfdAkJICAgICBUeEJ1ZkNudDsKKwkgdTE2X3QJCSAgICAgVHhVcmJIZWFkOworCSB1MTZfdAkJICAgICBUeFVyYlRhaWw7CisJIHUxNl90CQkgICAgIFR4VXJiQ250OworCSB1MTZfdAkJICAgICBSeEJ1ZkhlYWQ7CisJIHUxNl90CQkgICAgIFJ4QnVmVGFpbDsKKwkgdTE2X3QJCSAgICAgUnhCdWZDbnQ7CiAjZW5kaWYKIAogI2lmIFpNX1VTQl9TVFJFQU1fTU9ERSA9PSAxCi0gICAgICAgIHpidWZfdCAgICAgICAgICAgICAgICAgICpyZWFtaW5fYnVmOworCSB6YnVmX3QJCSAgICAqcmVhbWluX2J1ZjsKICNlbmRpZgogCiAjaWZkZWYgWk1fSE9TVEFQRF9TVVBQT1JUCi0gICAgICAgIHN0cnVjdCBhdGhyX3dsYW5fcGFyYW0gIGF0aHJfd3BhX3JlcTsKKwkgc3RydWN0IGF0aHJfd2xhbl9wYXJhbSAgYXRocl93cGFfcmVxOwogI2VuZGlmCi0gICAgICAgIHN0cnVjdCBzb2NrICAgICAgICAgICAgICpuZXRsaW5rX3NrOwotICAgICAgICB1OF90ICAgICAgICAgICAgRGV2aWNlT3BlbmVkOyAvL0NXWWFuZygrKQotICAgICAgICB1OF90ICAgICAgICAgICAgc3VwSWVbNTBdOwotICAgICAgICB1OF90ICAgICAgICAgICAgc3VwTGVuOwotICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExcmVxX3dwYWllIHN0YXdwYWllW1pNX09BTF9NQVhfU1RBX1NVUFBPUlRdOwotICAgICAgICB1OF90ICAgICAgICAgICAgZm9yd2FyZE1nbXQ7CisJIHN0cnVjdCBzb2NrCSAgICAgICpuZXRsaW5rX3NrOworCSB1OF90CSAgICAgRGV2aWNlT3BlbmVkOyAvKiBDV1lhbmcoKykgKi8KKwkgdThfdAkgICAgIHN1cEllWzUwXTsKKwkgdThfdAkgICAgIHN1cExlbjsKKwkgc3RydWN0IGllZWU4MDIxMXJlcV93cGFpZSBzdGF3cGFpZVtaTV9PQUxfTUFYX1NUQV9TVVBQT1JUXTsKKwkgdThfdAkgICAgIGZvcndhcmRNZ210OwogCi0gICAgICAgIHN0cnVjdCB6ZkNiVXNiRnVuY1RibCB1c2JDYkZ1bmN0aW9uczsKKwkgc3RydWN0IHpmQ2JVc2JGdW5jVGJsIHVzYkNiRnVuY3Rpb25zOwogCi0gICAgICAgIC8qIEZvciBrZXZlbnRkICovCi0gICAgICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIGZsYWdzOwotICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBrZXZlbnRfZmxhZ3M7Ci0gICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGtldmVudF9yZWFkeTsKKwkgLyogRm9yIGtldmVudGQgKi8KKwkgdTMyX3QJCSAgICAgZmxhZ3M7CisJIHVuc2lnbmVkIGxvbmcJICAgIGtldmVudF9mbGFnczsKKwkgdTE2X3QJCSAgICAga2V2ZW50X3JlYWR5OwogCi0gICAgICAgIHN0cnVjdCBzZW1hcGhvcmUgICAgICAgIGlvY3RsX3NlbTsKLSAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0ICAgICAga2V2ZW50OwotICAgICAgICB3YWl0X3F1ZXVlX2hlYWRfdCAgICAgICB3YWl0X3F1ZXVlX2V2ZW50OworCSBzdHJ1Y3Qgc2VtYXBob3JlCSBpb2N0bF9zZW07CisJIHN0cnVjdCB3b3JrX3N0cnVjdCAgICAgIGtldmVudDsKKwkgd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdF9xdWV1ZV9ldmVudDsKICNpZmRlZiBaTV9IQUxQTFVTX0xPQ0sKLSAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgaGFsX2lycUZsYWc7CisJIHVuc2lnbmVkIGxvbmcJICAgIGhhbF9pcnFGbGFnOwogI2VuZGlmCi0gICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGFkYXB0ZXJTdGF0ZTsKKwkgdTE2X3QJCSAgICAgYWRhcHRlclN0YXRlOwogfTsKIAogLyogV0RTICovCiAjZGVmaW5lIFpNX1dEU19QT1JUX05VTUJFUiAgNgogCi1zdHJ1Y3QgenNXZHNTdHJ1Y3QKLXsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSogZGV2Oworc3RydWN0IHpzV2RzU3RydWN0IHsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogICAgIHUxNl90IG9wZW5GbGFnOwogfTsKIAogLyogVkFQICovCiAjZGVmaW5lIFpNX1ZBUF9QT1JUX05VTUJFUiAgNwogCi1zdHJ1Y3QgenNWYXBTdHJ1Y3QKLXsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSogZGV2Oworc3RydWN0IHpzVmFwU3RydWN0IHsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogICAgIHUxNl90IG9wZW5GbGFnOwogfTsKIApAQCAtMjE1LDI1ICsyMTEsMjUgQEAKICNkZWZpbmUgWk1fSU9DVExfUlhEX0RVTVAgCQkJMHgwNwogI2RlZmluZSBaTV9JT0NUTF9NRU1fUkVBRAkJCTB4MEIKICNkZWZpbmUgWk1fSU9DVExfTUVNX1dSSVRFCQkJMHgwQwotI2RlZmluZSBaTV9JT0NUTF9ETUFfVEVTVCAgICAgICAgICAgMHgxMAotI2RlZmluZSBaTV9JT0NUTF9SRUdfVEVTVCAgICAgICAgICAgMHgxMQotI2RlZmluZSBaTV9JT0NUTF9URVNUICAgICAgICAgICAgICAgMHg4MAotI2RlZmluZSBaTV9JT0NUTF9UQUxMWSAgICAgICAgICAgICAgMHg4MSAvL0NXWWFuZygrKQotI2RlZmluZSBaTV9JT0NUTF9SVFMgICAgICAgICAgICAgICAgMHhBMAotI2RlZmluZSBaTV9JT0NUTF9NSVhfTU9ERSAgICAgICAgICAgMHhBMQotI2RlZmluZSBaTV9JT0NUTF9GUkFHICAgICAgICAgICAgICAgMHhBMgotI2RlZmluZSBaTV9JT0NUTF9TQ0FOICAgICAgICAgICAgICAgMHhBMwotI2RlZmluZSBaTV9JT0NUTF9LRVkgICAgICAgICAgICAgICAgMHhBNAotI2RlZmluZSBaTV9JT0NUTF9SQVRFICAgICAgICAgICAgICAgMHhBNQotI2RlZmluZSBaTV9JT0NUTF9FTkNSWVBUSU9OX01PREUgICAgMHhBNgotI2RlZmluZSBaTV9JT0NUTF9HRVRfVFhDTlQgICAgICAgICAgMHhBNwotI2RlZmluZSBaTV9JT0NUTF9HRVRfREVBR0dfQ05UICAgICAgMHhBOAotI2RlZmluZSBaTV9JT0NUTF9EVVJBVElPTl9NT0RFICAgICAgMHhBOQotI2RlZmluZSBaTV9JT0NUTF9TRVRfQUVTX0tFWSAgICAgICAgMHhBQQotI2RlZmluZSBaTV9JT0NUTF9TRVRfQUVTX01PREUgICAgICAgMHhBQgotI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfU1RSRU5HVEggICAgMHhBQyAvL0NXWWFuZygrKQotI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfUVVBTElUWSAgICAgMHhBRCAvL0NXWWFuZygrKQotI2RlZmluZSBaTV9JT0NUTF9TRVRfUElCU1NfTU9ERSAgICAgMHhBRQorI2RlZmluZSBaTV9JT0NUTF9ETUFfVEVTVAkgICAgCQkweDEwCisjZGVmaW5lIFpNX0lPQ1RMX1JFR19URVNUCSAgICAJCTB4MTEKKyNkZWZpbmUgWk1fSU9DVExfVEVTVAkJIAkJMHg4MAorI2RlZmluZSBaTV9JT0NUTF9UQUxMWQkJCQkweDgxIC8qIENXWWFuZygrKSAqLworI2RlZmluZSBaTV9JT0NUTF9SVFMJCQkJMHhBMAorI2RlZmluZSBaTV9JT0NUTF9NSVhfTU9ERQkJCTB4QTEKKyNkZWZpbmUgWk1fSU9DVExfRlJBRwkJCQkweEEyCisjZGVmaW5lIFpNX0lPQ1RMX1NDQU4JCQkJMHhBMworI2RlZmluZSBaTV9JT0NUTF9LRVkJCQkJMHhBNAorI2RlZmluZSBaTV9JT0NUTF9SQVRFCQkJCTB4QTUKKyNkZWZpbmUgWk1fSU9DVExfRU5DUllQVElPTl9NT0RFCQkweEE2CisjZGVmaW5lIFpNX0lPQ1RMX0dFVF9UWENOVAkJCTB4QTcKKyNkZWZpbmUgWk1fSU9DVExfR0VUX0RFQUdHX0NOVCAgICAJCTB4QTgKKyNkZWZpbmUgWk1fSU9DVExfRFVSQVRJT05fTU9ERQkJCTB4QTkKKyNkZWZpbmUgWk1fSU9DVExfU0VUX0FFU19LRVkJCQkweEFBCisjZGVmaW5lIFpNX0lPQ1RMX1NFVF9BRVNfTU9ERQkJCTB4QUIKKyNkZWZpbmUgWk1fSU9DVExfU0lHTkFMX1NUUkVOR1RICQkweEFDIC8qIENXWWFuZygrKSAqLworI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfUVVBTElUWQkJCTB4QUQgLyogQ1dZYW5nKCspICovCisjZGVmaW5lIFpNX0lPQ1RMX1NFVF9QSUJTU19NT0RFCQkJMHhBRQogCiAjZGVmaW5lCVpEQVBJT0NUTAkJCQlTSU9DREVWUFJJVkFURQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2J1Zi5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9idWYuYwppbmRleCBhMGY2NzdhLi5kN2VlMGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2J1Zi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfYnVmLmMKQEAgLTM0LDkgKzM0LDkgQEAKIAogCiAvKiBDYWxsZWQgdG8gYWxsb2NhdGUgYnVmZmVyLCBtdXN0IHJldHVybiBhIGNvbnRpbnVlIGJ1ZmZlciBzcGFjZSAqLwotemJ1Zl90KiB6ZndCdWZBbGxvY2F0ZSh6ZGV2X3QqIGRldiwgdTE2X3QgbGVuKQoremJ1Zl90ICp6ZndCdWZBbGxvY2F0ZSh6ZGV2X3QgKmRldiwgdTE2X3QgbGVuKQogewotICAgIHpidWZfdCogYnVmOworICAgIHpidWZfdCAqYnVmOwogCiAgICAgLyogQWxsb2NhdGUgU0tCIGZvciBwYWNrZXQqLwogICAgIGJ1ZiA9IGRldl9hbGxvY19za2IobGVuKTsKQEAgLTQ2LDE1ICs0NiwxNSBAQAogCiAKIC8qIENhbGxlZCB0byBmcmVlIGJ1ZmZlciwgcmVwbGFjZSBiZWxvdyAzIGZ1bmN0aW9ucyAqLwotdm9pZCB6ZndCdWZGcmVlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgc3RhdHVzKQordm9pZCB6ZndCdWZGcmVlKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgc3RhdHVzKQogewogICAgIGRldl9rZnJlZV9za2JfYW55KGJ1Zik7CiB9CiAKIC8qIENhbGxlZCB0byBhZGp1c3QgYnVmZmVyIHNpemUgYW5kIGhlYWQgcG9pbnRlciAqLwotdTE2X3QgemZ3QnVmUmVtb3ZlSGVhZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHNpemUpCit1MTZfdCB6ZndCdWZSZW1vdmVIZWFkKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgc2l6ZSkKIHsKLSAgICAvL3ptX2Fzc2VydChidWYtPmxlbiA+IHNpemUpOworICAgIC8qIHptX2Fzc2VydChidWYtPmxlbiA+IHNpemUpOyAqLwogCiAgICAgYnVmLT5kYXRhICs9IHNpemU7CiAgICAgYnVmLT5sZW4gLT0gc2l6ZTsKQEAgLTY4LDcgKzY4LDcgQEAKIC8qIFVzZWQgdG8gY2hhaW4gUnggYnVmZmVyIHRvIGZvcm0gYSBmcmFtZS4gaWYgdGhlIHByZXBhcmVkIFJ4IGJ1ZmZlciAgKi8KIC8qIGlzIGdyZWF0ZXIgdGhhbiBhbiBldGhlcm5ldCBmcmFtZSgxNTE4KzMyIGJ5dGUpLCB0aGVuIHRoaXMgZnVuY3Rpb24gICAgKi8KIC8qIHdpbGwgb25seSBiZSBjYWxsZWQgd2l0aCBoZWFkPU5VTEwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXUxNl90IHpmd0J1ZkNoYWluKHpkZXZfdCogZGV2LCB6YnVmX3QqKiBoZWFkLCB6YnVmX3QqIHRhaWwpCit1MTZfdCB6ZndCdWZDaGFpbih6ZGV2X3QgKmRldiwgemJ1Zl90ICoqaGVhZCwgemJ1Zl90ICp0YWlsKQogewogCiAgICAgKmhlYWQgPSB0YWlsOwpAQCAtNzcsNyArNzcsNyBAQAogCiAKIC8qIENhbGxlZCB3aGVuIGRvaW5nIGluZnJhLWJzcyBmb3J3YXJkaW5nICovCi11MTZfdCB6ZndCdWZDb3B5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGRzdCwgemJ1Zl90KiBzcmMpCit1MTZfdCB6ZndCdWZDb3B5KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmRzdCwgemJ1Zl90ICpzcmMpCiB7CiAgICAgbWVtY3B5KGRzdC0+ZGF0YSwgc3JjLT5kYXRhLCBzcmMtPmxlbik7CiAgICAgZHN0LT50YWlsID0gZHN0LT5kYXRhOwpAQCAtODcsNyArODcsNyBAQAogCiAKIC8qIENhbGxlZCB0byBhZGp1c3QgYnVmZmVyIHNpemUgYW5kIHRhaWwgcG9pbnRlciAqLwotdTE2X3QgemZ3QnVmU2V0U2l6ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHNpemUpCit1MTZfdCB6ZndCdWZTZXRTaXplKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgc2l6ZSkKIHsKICNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKICAgICBidWYtPnRhaWwgPSAwOwpAQCAtMTAxLDExICsxMDEsMTEgQEAKICAgICByZXR1cm4gMDsKIH0KIAotdTE2X3QgemZ3QnVmR2V0U2l6ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit1MTZfdCB6ZndCdWZHZXRTaXplKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZikKIHsKICAgICByZXR1cm4gYnVmLT5sZW47CiB9CiAKLXZvaWQgemZ3Q29weUJ1ZkNvbnRleHQoemRldl90KiBkZXYsIHpidWZfdCogc291cmNlLCB6YnVmX3QqIGRzdCkKK3ZvaWQgemZ3Q29weUJ1ZkNvbnRleHQoemRldl90ICpkZXYsIHpidWZfdCAqc291cmNlLCB6YnVmX3QgKmRzdCkKIHsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfZGJnLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2RiZy5jCmluZGV4IGQ0N2U5YWIuLmVlMGVlMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfZGJnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9kYmcuYwpAQCAtMjksNzAgKzI5LDY3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CiAKLXZvaWQgemZ3RHVtcEJ1Zih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit2b2lkIHpmd0R1bXBCdWYoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKQogewotICAgIHUxNl90IGk7CisJdTE2X3QgaTsKIAotICAgIGZvciAoaT0wOyBpPGJ1Zi0+bGVuOyBpKyspCi0gICAgewotICAgICAgICBwcmludGsoIiUwMnggIiwgKigoKHU4X3QqKWJ1Zi0+ZGF0YSkraSkpOwotICAgICAgICBpZiAoKGkmMHhmKT09MHhmKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGsoIlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpbnRrKCJcbiIpOworCWZvciAoaSA9IDA7IGkgPCBidWYtPmxlbjsgaSsrKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlMDJ4ICIsICooKCh1OF90ICopYnVmLT5kYXRhKStpKSk7CisJCWlmICgoaSAmIDB4ZikgPT0gMHhmKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7CisJfQorCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOwogfQogCiAKLXZvaWQgemZ3RGJnUmVhZFJlZ0RvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKK3ZvaWQgemZ3RGJnUmVhZFJlZ0RvbmUoemRldl90ICpkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKIHsKLSAgICBwcmludGsoIlJlYWQgYWRkcjoleCA9ICV4XG4iLCBhZGRyLCB2YWwpOworCXByaW50ayhLRVJOX0RFQlVHICJSZWFkIGFkZHI6JXggPSAleFxuIiwgYWRkciwgdmFsKTsKIH0KIAotdm9pZCB6ZndEYmdXcml0ZVJlZ0RvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKK3ZvaWQgemZ3RGJnV3JpdGVSZWdEb25lKHpkZXZfdCAqZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpCiB7Ci0gICAgcHJpbnRrKCJXcml0ZSBhZGRyOiV4ID0gJXhcbiIsIGFkZHIsIHZhbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIldyaXRlIGFkZHI6JXggPSAleFxuIiwgYWRkciwgdmFsKTsKIH0KIAotdm9pZCB6ZndEYmdSZWFkVGFsbHlEb25lKHpkZXZfdCogZGV2KQordm9pZCB6ZndEYmdSZWFkVGFsbHlEb25lKHpkZXZfdCAqZGV2KQogewotICAgIC8vcHJpbnRrKCJSZWFkIFRhbGwgRG9uZVxuIik7CisJLyogcHJpbnRrKEtFUk5fREVCVUcgIlJlYWQgVGFsbCBEb25lXG4iKTsgKi8KIH0KIAotdm9pZCB6ZndEYmdXcml0ZUVlcHJvbURvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKK3ZvaWQgemZ3RGJnV3JpdGVFZXByb21Eb25lKHpkZXZfdCAqZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpCiB7CiB9CiAKLXZvaWQgemZ3RGJnUXVlcnlId1R4QnVzeURvbmUoemRldl90KiBkZXYsIHUzMl90IHZhbCkKK3ZvaWQgemZ3RGJnUXVlcnlId1R4QnVzeURvbmUoemRldl90ICpkZXYsIHUzMl90IHZhbCkKIHsKIH0KIAotLy9Gb3IgRXZsICsrCi12b2lkIHpmd0RiZ1JlYWRGbGFzaERvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90KiByc3BkYXRhLCB1MzJfdCBkYXRhbGVuKQorLyogRm9yIEV2bCArKyAqLwordm9pZCB6ZndEYmdSZWFkRmxhc2hEb25lKHpkZXZfdCAqZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCAqcnNwZGF0YSwgdTMyX3QgZGF0YWxlbikKIHsKLSAgICBwcmludGsoIlJlYWQgRmxhc2ggYWRkcjoleCBsZW5ndGg6JXhcbiIsIGFkZHIsIGRhdGFsZW4pOworCXByaW50ayhLRVJOX0RFQlVHICJSZWFkIEZsYXNoIGFkZHI6JXggbGVuZ3RoOiV4XG4iLCBhZGRyLCBkYXRhbGVuKTsKIH0KIAotdm9pZCB6ZndEYmdQcm9ncmFtZUZsYXNoRG9uZSh6ZGV2X3QqIGRldikKK3ZvaWQgemZ3RGJnUHJvZ3JhbWVGbGFzaERvbmUoemRldl90ICpkZXYpCiB7Ci0gICAgcHJpbnRrKCJQcm9ncmFtIEZsYXNoIERvbmVcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJQcm9ncmFtIEZsYXNoIERvbmVcbiIpOwogfQogCi12b2lkIHpmd0RiZ1Byb2dyYW1lRmxhc2hDaGtEb25lKHpkZXZfdCogZGV2KQordm9pZCB6ZndEYmdQcm9ncmFtZUZsYXNoQ2hrRG9uZSh6ZGV2X3QgKmRldikKIHsKLSAgICBwcmludGsoIlByb2dyYW0gRmxhc2ggRG9uZVxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIlByb2dyYW0gRmxhc2ggRG9uZVxuIik7CiB9CiAKLXZvaWQgemZ3RGJnR2V0Rmxhc2hDaGtTdW1Eb25lKHpkZXZfdCogZGV2LCB1MzJfdCogcnNwZGF0YSkKK3ZvaWQgemZ3RGJnR2V0Rmxhc2hDaGtTdW1Eb25lKHpkZXZfdCAqZGV2LCB1MzJfdCAqcnNwZGF0YSkKIHsKLSAgICBwcmludGsoIkdldCBGbGFzaCBDaGtTdW0gRG9uZVxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIkdldCBGbGFzaCBDaGtTdW0gRG9uZVxuIik7CiB9CiAKLXZvaWQgemZ3RGJnRG93bmxvYWRGd0luaXREb25lKHpkZXZfdCogZGV2KQordm9pZCB6ZndEYmdEb3dubG9hZEZ3SW5pdERvbmUoemRldl90ICpkZXYpCiB7Ci0gICAgcHJpbnRrKCJEb3dubG9hZCBGVyBJbml0IERvbmVcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJEb3dubG9hZCBGVyBJbml0IERvbmVcbiIpOwogfQotLy9Gb3IgRXZsIC0tCisvKiBGb3IgRXZsIC0tICovCiAKIC8qIExlYXZlIGFuIGVtcHR5IGxpbmUgYmVsb3cgdG8gcmVtb3ZlIHdhcm5pbmcgbWVzc2FnZSBvbiBzb21lIGNvbXBpbGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2V2LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2V2LmMKaW5kZXggYmNkYTBiOS4uMjlmNTYwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9ldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfZXYuYwpAQCAtMzIsMjAyICszMiwyMTQgQEAKIAogCiAvKioqKiogTWFuYWdlbWVudCAqKioqKi8KLXUxNl90IHpmTG54QXV0aE5vdGlmeSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIpCit1MTZfdCB6ZkxueEF1dGhOb3RpZnkoemRldl90ICpkZXYsIHUxNl90ICptYWNBZGRyKQogewotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCi11MTZfdCB6ZkxueEFzb2NOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyLCB1OF90KiBib2R5LCB1MTZfdCBib2R5U2l6ZSwgdTE2X3QgcG9ydCkKK3UxNl90IHpmTG54QXNvY05vdGlmeSh6ZGV2X3QgKmRldiwgdTE2X3QgKm1hY0FkZHIsIHU4X3QgKmJvZHksIHUxNl90IGJvZHlTaXplLAorCQkJIHUxNl90IHBvcnQpCiB7Ci0vLyNpZmRlZiBaTV9IT1NUQVBEX1NVUFBPUlQKLSAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7Ci0gICAgdW5pb24gaXdyZXFfZGF0YSB3cmVxOwotICAgIHU4X3QgKmFkZHIgPSAodThfdCAqKSBtYWNBZGRyOwotICAgIHUxNl90IGksIGo7CisvKiAjaWZkZWYgWk1fSE9TVEFQRF9TVVBQT1JUCSovCisJc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCXVuaW9uIGl3cmVxX2RhdGEgd3JlcTsKKwl1OF90ICphZGRyID0gKHU4X3QgKikgbWFjQWRkcjsKKwl1MTZfdCBpLCBqOwogCi0gICAgbWVtc2V0KCZ3cmVxLCAwLCBzaXplb2Yod3JlcSkpOwotICAgIG1lbWNweSh3cmVxLmFkZHIuc2FfZGF0YSwgbWFjQWRkciwgRVRIX0FMRU4pOwotICAgIHdyZXEuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0gICAgcHJpbnRrKEtFUk5fREVCVUcgImpvaW5fZXZlbnQgb2YgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLSAgICAgICAgICAgIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOworCW1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKKwltZW1jcHkod3JlcS5hZGRyLnNhX2RhdGEsIG1hY0FkZHIsIEVUSF9BTEVOKTsKKwl3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCXByaW50ayhLRVJOX0RFQlVHICJqb2luX2V2ZW50IG9mIE1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKIAotICAgIGZvcihpID0gMDsgaSA8IFpNX09BTF9NQVhfU1RBX1NVUFBPUlQ7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvcihqID0gMDsgaiA8IElFRUU4MDIxMV9BRERSX0xFTjsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKG1hY3AtPnN0YXdwYWllW2ldLndwYV9tYWNhZGRyW2pdICE9IDApICYmCi0gICAgICAgICAgICAgICAgKG1hY3AtPnN0YXdwYWllW2ldLndwYV9tYWNhZGRyW2pdICE9IGFkZHJbal0pKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqID09IDYpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGkgPCBaTV9PQUxfTUFYX1NUQV9TVVBQT1JUKQotICAgIHsKLSAgICAgICAgLy9wcmludGsoInpmd0Fzb2NOb3RpZnkgLSBzdG9yZSB3cGEgaWUgaW4gbWFjcCwgaW5kZXggPSAlZFxuIiwgaSk7Ci0gICAgICAgIG1lbWNweShtYWNwLT5zdGF3cGFpZVtpXS53cGFfbWFjYWRkciwgbWFjQWRkciwgSUVFRTgwMjExX0FERFJfTEVOKTsKLSAgICAgICAgbWVtY3B5KG1hY3AtPnN0YXdwYWllW2ldLndwYV9pZSwgYm9keSwgYm9keVNpemUpOwotICAgIH0KLSAgICAvL2lmKG1hY3AtPmNhcmRTZXR0aW5nLkJzc1R5cGUgPT0gSU5GUkFTVFJVQ1RVUkVfQlNTKSB7Ci0gICAgLy8gICAgICAgICAgICAvL3dpcmVsZXNzX3NlbmRfZXZlbnQobWFjcC0+ZGV2aWNlLCBTSU9DR0lXU0NBTiwgJndyZXEsIE5VTEwpOwotICAgIC8vICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQobWFjcC0+ZGV2aWNlLCBTSU9DR0lXQVAsICZ3cmVxLCBOVUxMKTsKLSAgICAvL30KLSAgICAvL2Vsc2UgaWYobWFjcC0+Y2FyZFNldHRpbmcuQnNzVHlwZSA9PSBBUF9CU1MpIHsKLS8vICAgICAgICBpZiAocG9ydCA9PSAwKQotLy8gICAgICAgIHsKLSAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWUkVHSVNURVJFRCwgJndyZXEsIE5VTEwpOwotLy8gICAgICAgIH0KLS8vICAgICAgICBlbHNlCi0vLyAgICAgICAgewotLy8gICAgICAgICAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBWQVAgZGV2aWNlIGlzIHZhbGlkICovCi0vLyAgICAgICAgICAgIGlmICh2YXBbcG9ydF0uZGV2ICE9IE5VTEwpCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQodmFwW3BvcnRdLmRldiwgSVdFVlJFR0lTVEVSRUQsICZ3cmVxLCBOVUxMKTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICBlbHNlCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiQ2FuJyBmaW5kIGEgdmFsaWQgVkFQIGRldmljZSwgcG9ydDogJWRcbiIsIHBvcnQpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfQotICAgIC8vfQotLy8jZW5kaWYKKwlmb3IgKGkgPSAwOyBpIDwgWk1fT0FMX01BWF9TVEFfU1VQUE9SVDsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBJRUVFODAyMTFfQUREUl9MRU47IGorKykgeworCQkJaWYgKChtYWNwLT5zdGF3cGFpZVtpXS53cGFfbWFjYWRkcltqXSAhPSAwKSAmJgorCQkJCShtYWNwLT5zdGF3cGFpZVtpXS53cGFfbWFjYWRkcltqXSAhPSBhZGRyW2pdKSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaiA9PSA2KQorCQkJYnJlYWs7CisJfQorCWlmIChpIDwgWk1fT0FMX01BWF9TVEFfU1VQUE9SVCkgeworCQkvKgorCQkgKiBwcmludGsoInpmd0Fzb2NOb3RpZnkgLSBzdG9yZSB3cGEgaWUgaW4gbWFjcCwKKwkJICogCWluZGV4ID0gJWRcbiIsIGkpOworCQkgKi8KKwkJbWVtY3B5KG1hY3AtPnN0YXdwYWllW2ldLndwYV9tYWNhZGRyLCBtYWNBZGRyLAorCQkJSUVFRTgwMjExX0FERFJfTEVOKTsKKwkJbWVtY3B5KG1hY3AtPnN0YXdwYWllW2ldLndwYV9pZSwgYm9keSwgYm9keVNpemUpOworCX0KKwkvKgorCSAqIGlmKG1hY3AtPmNhcmRTZXR0aW5nLkJzc1R5cGUgPT0gSU5GUkFTVFJVQ1RVUkVfQlNTKSB7CisJICogd2lyZWxlc3Nfc2VuZF9ldmVudChtYWNwLT5kZXZpY2UsIFNJT0NHSVdTQ0FOLCAmd3JlcSwgTlVMTCk7CisJICoJd2lyZWxlc3Nfc2VuZF9ldmVudChtYWNwLT5kZXZpY2UsIFNJT0NHSVdBUCwgJndyZXEsIE5VTEwpOworCSAqIH0KKwkgKiBlbHNlIGlmKG1hY3AtPmNhcmRTZXR0aW5nLkJzc1R5cGUgPT0gQVBfQlNTKSB7CisJICoJaWYgKHBvcnQgPT0gMCkKKwkgKgl7CisJICovCisJCQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVlJFR0lTVEVSRUQsICZ3cmVxLCBOVUxMKTsKKwkvKgorCSAqCX0KKwkgKgllbHNlCisJICoJeworCSAqCQkgQ2hlY2sgd2hldGhlciB0aGUgVkFQIGRldmljZSBpcyB2YWxpZAorCSAqCQlpZiAodmFwW3BvcnRdLmRldiAhPSBOVUxMKQorCSAqCQl7CisJICoJCQl3aXJlbGVzc19zZW5kX2V2ZW50KHZhcFtwb3J0XS5kZXYsCisJICoJCQkJCUlXRVZSRUdJU1RFUkVELCAmd3JlcSwgTlVMTCk7CisJICoJCX0KKwkgKgkJZWxzZQorCSAqCQl7CisJICoJCQlwcmludGsoS0VSTl9FUlIgIkNhbicgZmluZCBhIHZhbGlkIFZBUCBkZXZpY2UsCisJICoJCQkJIHBvcnQ6ICVkXG4iLCBwb3J0KTsKKwkgKgkJfQorCSAqCX0KKwkgKiB9CisJICovCisvKiAjZW5kaWYJKi8KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiAKIC8qIE5vdGlmaWNhdGlvbiB0aGF0IGEgU1RBIGlzIGRpc2Fzc29jaWF0ZWQgZnJvbSBBUCAqLwogLyogQVAgbW9kZSBvbmx5ICovCi11MTZfdCB6ZkxueERpc0Fzb2NOb3RpZnkoemRldl90KiBkZXYsIHU4X3QqIG1hY0FkZHIsIHUxNl90IHBvcnQpCit1MTZfdCB6ZkxueERpc0Fzb2NOb3RpZnkoemRldl90ICpkZXYsIHU4X3QgKm1hY0FkZHIsIHUxNl90IHBvcnQpCiB7Ci0gICAgdW5pb24gaXdyZXFfZGF0YSB3cmVxOwotICAgIHU4X3QgKmFkZHIgPSAodThfdCAqKSBtYWNBZGRyOworCXVuaW9uIGl3cmVxX2RhdGEgd3JlcTsKKwl1OF90ICphZGRyID0gKHU4X3QgKikgbWFjQWRkcjsKIAotICAgIG1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKLSAgICBtZW1jcHkod3JlcS5hZGRyLnNhX2RhdGEsIG1hY0FkZHIsIEVUSF9BTEVOKTsKLSAgICB3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotICAgIHByaW50ayhLRVJOX0RFQlVHICJ6ZndEaXNBc29jTm90aWZ5KCksIE1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0gICAgICAgICAgICBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKKwltZW1zZXQoJndyZXEsIDAsIHNpemVvZih3cmVxKSk7CisJbWVtY3B5KHdyZXEuYWRkci5zYV9kYXRhLCBtYWNBZGRyLCBFVEhfQUxFTik7CisJd3JlcS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwlwcmludGsoS0VSTl9ERUJVRyAiemZ3RGlzQXNvY05vdGlmeSgpLCBNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CiAKIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiAvKiBOb3RpZmljYXRpb24gdGhhdCBhIFNUQSBpcyBjb25uZWN0IHRvIEFQICovCiAvKiBBUCBtb2RlIG9ubHkgKi8KLXUxNl90IHpmTG54QXBDb25uZWN0Tm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBtYWNBZGRyLCB1MTZfdCBwb3J0KQordTE2X3QgemZMbnhBcENvbm5lY3ROb3RpZnkoemRldl90ICpkZXYsIHU4X3QgKm1hY0FkZHIsIHUxNl90IHBvcnQpCiB7Ci0gICAgdW5pb24gaXdyZXFfZGF0YSB3cmVxOwotICAgIHU4X3QgKmFkZHIgPSAodThfdCAqKSBtYWNBZGRyOworCXVuaW9uIGl3cmVxX2RhdGEgd3JlcTsKKwl1OF90ICphZGRyID0gKHU4X3QgKikgbWFjQWRkcjsKIAotICAgIG1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKLSAgICBtZW1jcHkod3JlcS5hZGRyLnNhX2RhdGEsIG1hY0FkZHIsIEVUSF9BTEVOKTsKLSAgICB3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotICAgIHByaW50ayhLRVJOX0RFQlVHICJ6ZndBcENvbm5lY3ROb3RpZnkoKSwgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLSAgICAgICAgICAgIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOworCW1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKKwltZW1jcHkod3JlcS5hZGRyLnNhX2RhdGEsIG1hY0FkZHIsIEVUSF9BTEVOKTsKKwl3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCXByaW50ayhLRVJOX0RFQlVHICJ6ZndBcENvbm5lY3ROb3RpZnkoKSwgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCWFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOwogCiAKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogCiAKLXZvaWQgemZMbnhDb25uZWN0Tm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCBzdGF0dXMsIHUxNl90KiBic3NpZCkKK3ZvaWQgemZMbnhDb25uZWN0Tm90aWZ5KHpkZXZfdCAqZGV2LCB1MTZfdCBzdGF0dXMsIHUxNl90ICpic3NpZCkKIHsKLSAgICB1bmlvbiBpd3JlcV9kYXRhIHdyZXE7Ci0gICAgdThfdCAqYWRkciA9ICh1OF90ICopIGJzc2lkOwotICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKwl1bmlvbiBpd3JlcV9kYXRhIHdyZXE7CisJdThfdCAqYWRkciA9ICh1OF90ICopIGJzc2lkOworCXN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKIAotICAgIGlmIChic3NpZCAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgbWVtc2V0KCZ3cmVxLCAwLCBzaXplb2Yod3JlcSkpOwotICAgICAgICBpZiAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9DT05ORUNUKQotICAgICAgICAgICAgbWVtY3B5KHdyZXEuYWRkci5zYV9kYXRhLCBic3NpZCwgRVRIX0FMRU4pOwotICAgICAgICB3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCWlmIChic3NpZCAhPSBOVUxMKSB7CisJCW1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKKwkJaWYgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVCkKKwkJCW1lbWNweSh3cmVxLmFkZHIuc2FfZGF0YSwgYnNzaWQsIEVUSF9BTEVOKTsKKwkJd3JlcS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKIAotICAgICAgICBpZiAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9DT05ORUNUKQotICAgICAgICB7CisJCWlmIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QpIHsKICNpZmRlZiBaTV9DT05GSUdfQklHX0VORElBTgotICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIkNvbm5lY3RlZCB0byBBUCwgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLSAgICAgICAgICAgICAgICAgICAgYWRkclsxXSwgYWRkclswXSwgYWRkclszXSwgYWRkclsyXSwgYWRkcls1XSwgYWRkcls0XSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQ29ubmVjdGVkIHRvIEFQLCBNQUM6IgorCQkJCSIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQlhZGRyWzFdLCBhZGRyWzBdLCBhZGRyWzNdLCBhZGRyWzJdLAorCQkJCWFkZHJbNV0sIGFkZHJbNF0pOwogI2Vsc2UKLSAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJDb25uZWN0ZWQgdG8gQVAsIE1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0gICAgICAgICAgICAgICAgICAgIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNvbm5lY3RlZCB0byBBUCwgTUFDOiIKKwkJCQkgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCWFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sCisJCQkJYWRkcls0XSwgYWRkcls1XSk7CiAjZW5kaWYKIAotICAgICAgICAgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUKSB8fAotICAgICAgICAgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNBQkxFRCkgfHwKLSAgICAgICAgICAgICAgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVElPTl9ESVNBQkxFRCkgfHwKLQkgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9DT05ORUNUSU9OX1JFU0VUKSB8fAotCSAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX1JFU0VUKSB8fAotCSAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfREVBVVRIKSB8fAotCSAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfRElTQVNPQykgfHwKLQkgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0JFQUNPTl9NSVNTKSB8fAotICAgICAgICAgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX05PVF9GT1VORCkgfHwKLQkgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX1RJTUVPVVQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiRGlzY29ubmVjdGlvbiBOb3RpZnlcbiIpOworCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJfSBlbHNlIGlmICgoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUKSB8fAorCQkJICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0FCTEVEKSB8fAorCQkJICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0NPTk5FQ1RJT05fRElTQUJMRUQpIHx8CisJCQkgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVElPTl9SRVNFVCkgfHwKKwkJCSAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9SRVNFVCkgfHwKKwkJCSAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0RFQVVUSCkgfHwKKwkJCSAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0RJU0FTT0MpIHx8CisJCQkgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0JFQUNPTl9NSVNTKSB8fAorCQkJICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfTk9UX0ZPVU5EKSB8fAorCQkJICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfVElNRU9VVCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJEaXNjb25uZWN0aW9uIE5vdGlmeVxuIik7CiAKLSAgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLSAgICAgICAgfQorCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQl9CiAKIAkvKiBTYXZlIHRoZSBjb25uZWN0ZWQgc3RhdHVzICovCiAJbWFjcC0+YWRhcHRlclN0YXRlID0gc3RhdHVzOwogCi0gICAgICAgIGlmKHpmaVdsYW5RdWVyeVdsYW5Nb2RlKGRldikgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkgewotICAgICAgICAvLyAgICAgICAgICAgIC8vd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIFNJT0NHSVdTQ0FOLCAmd3JlcSwgTlVMTCk7Ci0gICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgU0lPQ0dJV0FQLCAmd3JlcSwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZih6ZmlXbGFuUXVlcnlXbGFuTW9kZShkZXYpID09IFpNX01PREVfQVApIHsKLSAgICAgICAgICAgIC8vaWYgKHBvcnQgPT0gMCkKLSAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWUkVHSVNURVJFRCwgJndyZXEsIE5VTEwpOwotICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAvL2Vsc2UKLSAgICAgICAgICAgIC8vewotICAgICAgICAgICAgLy8gICAgLyogQ2hlY2sgd2hldGhlciB0aGUgVkFQIGRldmljZSBpcyB2YWxpZCAqLwotICAgICAgICAgICAgLy8gICAgaWYgKHZhcFtwb3J0XS5kZXYgIT0gTlVMTCkKLSAgICAgICAgICAgIC8vICAgIHsKLSAgICAgICAgICAgIC8vICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHZhcFtwb3J0XS5kZXYsIElXRVZSRUdJU1RFUkVELCAmd3JlcSwgTlVMTCk7Ci0gICAgICAgICAgICAvLyAgICB9Ci0gICAgICAgICAgICAvLyAgICBlbHNlCi0gICAgICAgICAgICAvLyAgICB7Ci0gICAgICAgICAgICAvLyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJDYW4nIGZpbmQgYSB2YWxpZCBWQVAgZGV2aWNlLCBwb3J0OiAlZFxuIiwgcG9ydCk7Ci0gICAgICAgICAgICAvLyAgICB9Ci0gICAgICAgICAgICAvL30KLSAgICAgICAgfQotICAgIH0KLSAgICAvL3JldHVybiAwOworCQlpZiAoemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSB7CisJCQkvKndpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBTSU9DR0lXU0NBTiwgJndyZXEsIE5VTEwpOyovCisJCQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgU0lPQ0dJV0FQLCAmd3JlcSwgTlVMTCk7CisJCX0gZWxzZSBpZiAoemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSA9PSBaTV9NT0RFX0FQKSB7CisJCQkvKgorCQkJICogaWYgKHBvcnQgPT0gMCkKKwkJCSAqIHsKKwkJCSAqCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWUkVHSVNURVJFRCwKKwkJCSAqCQkJCSAmd3JlcSwgTlVMTCk7CisJCQkgKiB9CisJCQkgKiBlbHNlCisJCQkgKiB7CisJCQkgKglDaGVjayB3aGV0aGVyIHRoZSBWQVAgZGV2aWNlIGlzIHZhbGlkCisJCQkgKglpZiAodmFwW3BvcnRdLmRldiAhPSBOVUxMKQorCQkJICoJeworCQkJICoJCXdpcmVsZXNzX3NlbmRfZXZlbnQodmFwW3BvcnRdLmRldiwKKwkJICoJCQkJIElXRVZSRUdJU1RFUkVELCAmd3JlcSwgTlVMTCk7CisJCQkgKgl9CisJCQkgKgllbHNlCisJCQkgKgl7CisJCQkgKgkJcHJpbnRrKEtFUk5fRVJSICJDYW4nIGZpbmQgYSB2YWxpZCBWQVAiCisJCQkgKgkJCSIgZGV2aWNlLCBwb3J0OiAlZFxuIiwgcG9ydCk7CisJCQkgKgl9CisJCQkgKiB9CisJCQkqLworCQl9CisJfQorCS8qIHJldHVybiAwOwkqLwogfQogCi12b2lkIHpmTG54U2Nhbk5vdGlmeSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzU2NhblJlc3VsdCogcmVzdWx0KQordm9pZCB6ZkxueFNjYW5Ob3RpZnkoemRldl90ICpkZXYsIHN0cnVjdCB6c1NjYW5SZXN1bHQgKnJlc3VsdCkKIHsKLSAgICByZXR1cm47CisJcmV0dXJuOwogfQogCi12b2lkIHpmTG54U3RhdGlzdGljc05vdGlmeSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzU3Rhc3RpY3MqIHJlc3VsdCkKK3ZvaWQgemZMbnhTdGF0aXN0aWNzTm90aWZ5KHpkZXZfdCAqZGV2LCBzdHJ1Y3QgenNTdGFzdGljcyAqcmVzdWx0KQogewotICAgIHJldHVybjsKKwlyZXR1cm47CiB9CiAKLS8vdm9pZCB6ZndNaWNGYWlsdXJlTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBtZXNzYWdlLCB1MTZfdCBldmVudCkKLXZvaWQgemZMbnhNaWNGYWlsdXJlTm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3Qgc3RhdHVzKQorLyogdm9pZCB6ZndNaWNGYWlsdXJlTm90aWZ5KHpkZXZfdCAqZGV2LCB1OF90ICptZXNzYWdlLCB1MTZfdCBldmVudCkgKi8KK3ZvaWQgemZMbnhNaWNGYWlsdXJlTm90aWZ5KHpkZXZfdCAqZGV2LCB1MTZfdCAqYWRkciwgdTE2X3Qgc3RhdHVzKQogewogCXN0YXRpYyBjb25zdCBjaGFyICp0YWcgPSAiTUxNRS1NSUNIQUVMTUlDRkFJTFVSRS5pbmRpY2F0aW9uIjsKIAl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CiAJY2hhciBidWZbMTI4XTsKIAogCS8qIFRPRE86IG5lZWRlZCBwYXJhbWV0ZXJzOiBjb3VudCwgdHlwZSwgc3JjIGFkZHJlc3MgKi8KLQkvL3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyglc2Nhc3QgYWRkcj0lcykiLCB0YWcsCi0JLy8gICAgKHN0YXR1cyA9PSBaTV9NSUNfR1JPVVBfRVJST1IpID8gICJicm9hZCIgOiAidW5pIiwKLQkvLyAgICBldGhlcl9zcHJpbnRmKCh1OF90ICopYWRkcikpOworCS8qCisJICogc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzKCVzY2FzdCBhZGRyPSVzKSIsIHRhZywKKwkgKgkoc3RhdHVzID09IFpNX01JQ19HUk9VUF9FUlJPUikgPyAgImJyb2FkIiA6ICJ1bmkiLAorCSAqCWV0aGVyX3NwcmludGYoKHU4X3QgKilhZGRyKSk7CisJICovCiAKIAlpZiAoemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKQotCXsKIAkJc3RyY3B5KGJ1ZiwgdGFnKTsKLQl9CiAKIAltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CiAJd3JxdS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOwpAQCAtMjM1LDQyICsyNDcsNDYgQEAKIH0KIAogCi12b2lkIHpmTG54QXBNaWNGYWlsdXJlTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBhZGRyLCB6YnVmX3QqIGJ1ZikKK3ZvaWQgemZMbnhBcE1pY0ZhaWx1cmVOb3RpZnkoemRldl90ICpkZXYsIHU4X3QgKmFkZHIsIHpidWZfdCAqYnVmKQogewotICAgIHVuaW9uIGl3cmVxX2RhdGEgd3JlcTsKKwl1bmlvbiBpd3JlcV9kYXRhIHdyZXE7CiAKLSAgICBtZW1zZXQoJndyZXEsIDAsIHNpemVvZih3cmVxKSk7Ci0gICAgbWVtY3B5KHdyZXEuYWRkci5zYV9kYXRhLCBhZGRyLCBFVEhfQUxFTik7Ci0gICAgd3JlcS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLSAgICBwcmludGsoS0VSTl9ERUJVRyAiemZ3QXBNaWNGYWlsdXJlTm90aWZ5KCksIE1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0gICAgICAgICAgICBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKKwltZW1zZXQoJndyZXEsIDAsIHNpemVvZih3cmVxKSk7CisJbWVtY3B5KHdyZXEuYWRkci5zYV9kYXRhLCBhZGRyLCBFVEhfQUxFTik7CisJd3JlcS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwlwcmludGsoS0VSTl9ERUJVRyAiemZ3QXBNaWNGYWlsdXJlTm90aWZ5KCksICIKKwkJCSJNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CiAKLSAgICByZXR1cm47CisJcmV0dXJuOwogfQotCi0vLyBzdGF0dXMgPSAwICA9PiBwYXJ0bmVyIGxvc3QKLS8vICAgICAgICA9IDEgID0+IHBhcnRuZXIgYWxpdmUKLS8vdm9pZCB6ZndJYnNzUGFydG5lck5vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCBzdGF0dXMpCi12b2lkIHpmTG54SWJzc1BhcnRuZXJOb3RpZnkoemRldl90KiBkZXYsIHUxNl90IHN0YXR1cywgc3RydWN0IHpzUGFydG5lck5vdGlmeUV2ZW50ICpldmVudCkKKy8qCisgKiBzdGF0dXMgPSAwICA9PiBwYXJ0bmVyIGxvc3QKKyAqCQk9IDEgID0+IHBhcnRuZXIgYWxpdmUKKyAqIHZvaWQgemZ3SWJzc1BhcnRuZXJOb3RpZnkoemRldl90KiBkZXYsIHU4X3Qgc3RhdHVzKQorICovCit2b2lkIHpmTG54SWJzc1BhcnRuZXJOb3RpZnkoemRldl90ICpkZXYsIHUxNl90IHN0YXR1cywKKwkJCQlzdHJ1Y3QgenNQYXJ0bmVyTm90aWZ5RXZlbnQgKmV2ZW50KQogewogfQogCi12b2lkIHpmTG54TWFjQWRkcmVzc05vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCogYWRkcikKK3ZvaWQgemZMbnhNYWNBZGRyZXNzTm90aWZ5KHpkZXZfdCAqZGV2LCB1OF90ICphZGRyKQogewotICAgIGRldi0+ZGV2X2FkZHJbMF0gPSBhZGRyWzBdOwotICAgIGRldi0+ZGV2X2FkZHJbMV0gPSBhZGRyWzFdOwotICAgIGRldi0+ZGV2X2FkZHJbMl0gPSBhZGRyWzJdOwotICAgIGRldi0+ZGV2X2FkZHJbM10gPSBhZGRyWzNdOwotICAgIGRldi0+ZGV2X2FkZHJbNF0gPSBhZGRyWzRdOwotICAgIGRldi0+ZGV2X2FkZHJbNV0gPSBhZGRyWzVdOworCWRldi0+ZGV2X2FkZHJbMF0gPSBhZGRyWzBdOworCWRldi0+ZGV2X2FkZHJbMV0gPSBhZGRyWzFdOworCWRldi0+ZGV2X2FkZHJbMl0gPSBhZGRyWzJdOworCWRldi0+ZGV2X2FkZHJbM10gPSBhZGRyWzNdOworCWRldi0+ZGV2X2FkZHJbNF0gPSBhZGRyWzRdOworCWRldi0+ZGV2X2FkZHJbNV0gPSBhZGRyWzVdOwogfQogCi12b2lkIHpmTG54U2VuZENvbXBsZXRlSW5kaWNhdGlvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit2b2lkIHpmTG54U2VuZENvbXBsZXRlSW5kaWNhdGlvbih6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYpCiB7CiB9CiAKIAotdm9pZCB6ZkxueFJlc3RvcmVCdWZEYXRhKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zikgewordm9pZCB6ZkxueFJlc3RvcmVCdWZEYXRhKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZikKK3sKIAogfQogLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfbWVtLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX21lbS5jCmluZGV4IDMyNDE2ZDcuLjQ3Y2JjZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfbWVtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9tZW0uYwpAQCAtMzAsNjkgKzMwLDc1IEBACiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KIAogLyogTWVtb3J5IG1hbmFnZW1lbnQgKi8KLS8qIENhbGxlZCB0byBhbGxvY2F0ZSB1bmNhY2hlZCBtZW1vcnksIGFsbG9jYXRlZCBtZW1vcnkgbXVzdCAgICAqLwotLyogaW4gNC1ieXRlIGJvdW5kYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi12b2lkKiB6ZndNZW1BbGxvY2F0ZSh6ZGV2X3QqIGRldiwgdTMyX3Qgc2l6ZSkKKy8qIENhbGxlZCB0byBhbGxvY2F0ZSB1bmNhY2hlZCBtZW1vcnksIGFsbG9jYXRlZCBtZW1vcnkgbXVzdAkqLworLyogaW4gNC1ieXRlIGJvdW5kYXJ5CQkJCQkJKi8KK3ZvaWQgKnpmd01lbUFsbG9jYXRlKHpkZXZfdCAqZGV2LCB1MzJfdCBzaXplKQogewotICAgIHZvaWQqIG1lbSA9IE5VTEw7Ci0gICAgbWVtID0ga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKLSAgICByZXR1cm4gbWVtOworCXZvaWQgKm1lbSA9IE5VTEw7CisJbWVtID0ga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKKwlyZXR1cm4gbWVtOwogfQogCiAKIC8qIENhbGxlZCB0byBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KLXZvaWQgemZ3TWVtRnJlZSh6ZGV2X3QqIGRldiwgdm9pZCogbWVtLCB1MzJfdCBzaXplKQordm9pZCB6ZndNZW1GcmVlKHpkZXZfdCAqZGV2LCB2b2lkICptZW0sIHUzMl90IHNpemUpCiB7Ci0gICAga2ZyZWUobWVtKTsKLSAgICByZXR1cm47CisJa2ZyZWUobWVtKTsKKwlyZXR1cm47CiB9CiAKLXZvaWQgemZ3TWVtb3J5Q29weSh1OF90KiBkc3QsIHU4X3QqIHNyYywgdTE2X3QgbGVuZ3RoKQordm9pZCB6ZndNZW1vcnlDb3B5KHU4X3QgKmRzdCwgdThfdCAqc3JjLCB1MTZfdCBsZW5ndGgpCiB7Ci0gICAgLy91MTZfdCBpOworCS8qIHUxNl90IGk7ICovCiAKLSAgICBtZW1jcHkoZHN0LCBzcmMsIGxlbmd0aCk7Ci0gICAgLy9mb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQotICAgIC8vewotICAgIC8vICAgIGRzdFtpXSA9IHNyY1tpXTsKLSAgICAvL30KLSAgICByZXR1cm47CisJbWVtY3B5KGRzdCwgc3JjLCBsZW5ndGgpOworCS8qCisJICogZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKwkgKiB7CisJICoJZHN0W2ldID0gc3JjW2ldOworCSAqIH0KKwkgKi8KKwlyZXR1cm47CiB9CiAKLXZvaWQgemZ3WmVyb01lbW9yeSh1OF90KiB2YSwgdTE2X3QgbGVuZ3RoKQordm9pZCB6ZndaZXJvTWVtb3J5KHU4X3QgKnZhLCB1MTZfdCBsZW5ndGgpCiB7Ci0gICAgLy91MTZfdCBpOwotICAgIG1lbXNldCh2YSwgMCwgbGVuZ3RoKTsKLSAgICAvL2ZvcihpPTA7IGk8bGVuZ3RoOyBpKyspCi0gICAgLy97Ci0gICAgLy8gICAgdmFbaV0gPSAwOwotICAgIC8vfQotICAgIHJldHVybjsKKwkvKiB1MTZfdCBpOyAqLworCW1lbXNldCh2YSwgMCwgbGVuZ3RoKTsKKwkvKgorCSAqIGZvcihpPTA7IGk8bGVuZ3RoOyBpKyspCisJICogeworCSAqCXZhW2ldID0gMDsKKwkgKiB9CisJICovCisJcmV0dXJuOwogfQogCi12b2lkIHpmd01lbW9yeU1vdmUodThfdCogZHN0LCB1OF90KiBzcmMsIHUxNl90IGxlbmd0aCkKK3ZvaWQgemZ3TWVtb3J5TW92ZSh1OF90ICpkc3QsIHU4X3QgKnNyYywgdTE2X3QgbGVuZ3RoKQogewotICAgIG1lbWNweShkc3QsIHNyYywgbGVuZ3RoKTsKLSAgICByZXR1cm47CisJbWVtY3B5KGRzdCwgc3JjLCBsZW5ndGgpOworCXJldHVybjsKIH0KIAotdThfdCB6ZndNZW1vcnlJc0VxdWFsKHU4X3QqIG0xLCB1OF90KiBtMiwgdTE2X3QgbGVuZ3RoKQordThfdCB6ZndNZW1vcnlJc0VxdWFsKHU4X3QgKm0xLCB1OF90ICptMiwgdTE2X3QgbGVuZ3RoKQogewotICAgIC8vdTE2X3QgaTsKLSAgICBpbnQgcmV0OworCS8qIHUxNl90IGk7ICovCisJaW50IHJldDsKIAotICAgIHJldCA9IG1lbWNtcChtMSwgbTIsIGxlbmd0aCk7CisJcmV0ID0gbWVtY21wKG0xLCBtMiwgbGVuZ3RoKTsKIAotICAgIHJldHVybiAoKHJldD09MCk/VFJVRTpGQUxTRSk7Ci0gICAgLy9mb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQotICAgIC8vewotICAgIC8vICAgIGlmICggbTFbaV0gIT0gbTJbaV0gKQotICAgIC8vICAgIHsKLSAgICAvLyAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIC8vICAgIH0KLSAgICAvL30KLQotICAgIC8vcmV0dXJuIFRSVUU7CisJcmV0dXJuICgocmV0ID09IDApID8gVFJVRSA6IEZBTFNFKTsKKwkvKgorCSAqIGZvcihpPTA7IGk8bGVuZ3RoOyBpKyspCisJICp7CisJICoJIGlmICggbTFbaV0gIT0gbTJbaV0gKQorCSAqCXsKKwkgKgkJcmV0dXJuIEZBTFNFOworCSAqCX0KKwkgKn0KKwkgKgorCSAqIHJldHVybiBUUlVFOworCSAqLwogfQogCiAvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9taXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfbWlzLmMKaW5kZXggZWEyMTk5Zi4uMjZmNDliNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9taXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX21pcy5jCkBAIC0zMCw3NiArMzAsNzMgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KIAotLy9leHRlcm4gc3RydWN0IHpzV2RzU3RydWN0IHdkc1taTV9XRFNfUE9SVF9OVU1CRVJdOworLyogZXh0ZXJuIHN0cnVjdCB6c1dkc1N0cnVjdCB3ZHNbWk1fV0RTX1BPUlRfTlVNQkVSXTsJKi8KIGV4dGVybiBzdHJ1Y3QgenNWYXBTdHJ1Y3QgdmFwW1pNX1ZBUF9QT1JUX05VTUJFUl07Ci1leHRlcm4gdTE2X3QgemZMbnhHZXRWYXBJZCh6ZGV2X3QqIGRldik7CitleHRlcm4gdTE2X3QgemZMbnhHZXRWYXBJZCh6ZGV2X3QgKmRldik7CiAKIC8qIFNpbXBseSByZXR1cm4gMHhmZmZmIGlmIFZBUCBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkICovCi11MTZfdCB6ZndHZXRWYXBJZCh6ZGV2X3QqIGRldikKK3UxNl90IHpmd0dldFZhcElkKHpkZXZfdCAqZGV2KQogewotICAgIHJldHVybiB6ZkxueEdldFZhcElkKGRldik7CisJcmV0dXJuIHpmTG54R2V0VmFwSWQoZGV2KTsKIH0KIAotdm9pZCB6ZndTbGVlcCh6ZGV2X3QqIGRldiwgdTMyX3QgbXMpCit2b2lkIHpmd1NsZWVwKHpkZXZfdCAqZGV2LCB1MzJfdCBtcykKIHsKLSAgICBpZiAoaW5faW50ZXJydXB0KCkgPT0gMCkKLSAgICB7Ci0gICAgICAgIG1kZWxheShtcyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGludCBpaTsKLSAgICAgICAgaW50IGl0ZXIgPSAxMDAwMDAgKiBtczsKKwlpZiAoaW5faW50ZXJydXB0KCkgPT0gMCkKKwkJbWRlbGF5KG1zKTsKKwllbHNlIHsKKwkJaW50IGlpOworCQlpbnQgaXRlciA9IDEwMDAwMCAqIG1zOwogCi0gICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IGl0ZXI7IGlpKyspCi0gICAgICAgIHsKLQotICAgICAgICB9Ci0gICAgfQorCQlmb3IgKGlpID0gMDsgaWkgPCBpdGVyOyBpaSsrKSB7CisJCX0KKwl9CiB9CiAKICNpZmRlZiBaTV9IQUxQTFVTX0xPQ0sKLWFzbWxpbmthZ2Ugc3RydWN0IHpzV2xhbkRldiAqemZ3R2V0V2xhbkRldih6ZGV2X3QqIGRldikKK2FzbWxpbmthZ2Ugc3RydWN0IHpzV2xhbkRldiAqemZ3R2V0V2xhbkRldih6ZGV2X3QgKmRldikKIHsKIAlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CiAJcmV0dXJuIG1hY3AtPndkOwogfQogCi1hc21saW5rYWdlIHZvaWQgemZ3RW50ZXJDcml0aWNhbFNlY3Rpb24oemRldl90KiBkZXYpCithc21saW5rYWdlIHZvaWQgemZ3RW50ZXJDcml0aWNhbFNlY3Rpb24oemRldl90ICpkZXYpCiB7CiAJc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwogCXNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBtYWNwLT5oYWxfaXJxRmxhZyk7CiB9CiAKLWFzbWxpbmthZ2Ugdm9pZCB6ZndMZWF2ZUNyaXRpY2FsU2VjdGlvbih6ZGV2X3QqIGRldikKK2FzbWxpbmthZ2Ugdm9pZCB6ZndMZWF2ZUNyaXRpY2FsU2VjdGlvbih6ZGV2X3QgKmRldikKIHsKIAlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgbWFjcC0+aGFsX2lycUZsYWcpOwogfQogCi1hc21saW5rYWdlIHU4X3QgemZ3QnVmUmVhZEJ5dGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpCithc21saW5rYWdlIHU4X3QgemZ3QnVmUmVhZEJ5dGUoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQpCiB7Ci0gICAgcmV0dXJuICoodThfdCopKCh1OF90KilidWYtPmRhdGErb2Zmc2V0KTsKKwlyZXR1cm4gKih1OF90ICopKCh1OF90ICopYnVmLT5kYXRhK29mZnNldCk7CiB9CiAKLWFzbWxpbmthZ2UgdTE2X3QgemZ3QnVmUmVhZEhhbGZXb3JkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQorYXNtbGlua2FnZSB1MTZfdCB6ZndCdWZSZWFkSGFsZldvcmQoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQpCiB7Ci0gICAgcmV0dXJuIHptd19jcHVfdG9fbGUxNigqKHUxNl90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpKTsKKwlyZXR1cm4gem13X2NwdV90b19sZTE2KCoodTE2X3QgKikoKHU4X3QgKilidWYtPmRhdGErb2Zmc2V0KSk7CiB9CiAKLWFzbWxpbmthZ2Ugdm9pZCB6ZndCdWZXcml0ZUJ5dGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgdmFsdWUpCithc21saW5rYWdlIHZvaWQgemZ3QnVmV3JpdGVCeXRlKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0LAorCQkJCXU4X3QgdmFsdWUpCiB7Ci0gICAgKih1OF90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpID0gdmFsdWU7CisJKih1OF90ICopKCh1OF90ICopYnVmLT5kYXRhK29mZnNldCkgPSB2YWx1ZTsKIH0KIAotYXNtbGlua2FnZSB2b2lkIHpmd0J1ZldyaXRlSGFsZldvcmQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IHZhbHVlKQorYXNtbGlua2FnZSB2b2lkIHpmd0J1ZldyaXRlSGFsZldvcmQoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQsCisJCQkJCXUxNl90IHZhbHVlKQogewotICAgICoodTE2X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCkgPSB6bXdfY3B1X3RvX2xlMTYodmFsdWUpOworCSoodTE2X3QgKikoKHU4X3QgKilidWYtPmRhdGErb2Zmc2V0KSA9IHptd19jcHVfdG9fbGUxNih2YWx1ZSk7CiB9CiAKLWFzbWxpbmthZ2UgdThfdCAqemZ3R2V0QnVmZmVyKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK2FzbWxpbmthZ2UgdThfdCAqemZ3R2V0QnVmZmVyKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZikKIHsKLSAgICByZXR1cm4gKHU4X3QqKShidWYtPmRhdGEpOworCXJldHVybiAodThfdCAqKShidWYtPmRhdGEpOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfcGt0LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3BrdC5jCmluZGV4IDBkNTkyMGYuLjc1YmI5NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfcGt0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9wa3QuYwpAQCAtMzEsMTM2ICszMSwxMjIgQEAKICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgogCiAKLS8vZXh0ZXJuIHN0cnVjdCB6c1dkc1N0cnVjdCB3ZHNbWk1fV0RTX1BPUlRfTlVNQkVSXTsKKy8qIGV4dGVybiBzdHJ1Y3QgenNXZHNTdHJ1Y3Qgd2RzW1pNX1dEU19QT1JUX05VTUJFUl07IAkqLwogZXh0ZXJuIHN0cnVjdCB6c1ZhcFN0cnVjdCB2YXBbWk1fVkFQX1BPUlRfTlVNQkVSXTsKIAogCiAvKioqKiogUnggKioqKiovCi12b2lkIHpmTG54UmVjdjgwMjExKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKQordm9pZCB6ZkxueFJlY3Y4MDIxMSh6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyAqYWRkSW5mbykKIHsKLSAgICB1MTZfdCBmcmFtZVR5cGU7Ci0gICAgdTE2X3QgZnJhbWVDdHJsOwotICAgIHUxNl90IGZyYW1lU3VidHlwZTsKLSAgICB6YnVmX3QgKnNrYjE7Ci0gICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCXUxNl90IGZyYW1lVHlwZTsKKwl1MTZfdCBmcmFtZUN0cmw7CisJdTE2X3QgZnJhbWVTdWJ0eXBlOworCXpidWZfdCAqc2tiMTsKKwlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CiAKLSAgICAvL2ZyYW1lQ3RybCA9IHptd19idWZfcmVhZGIoZGV2LCBidWYsIDApOwotICAgIGZyYW1lQ3RybCA9ICoodThfdCopKCh1OF90KilidWYtPmRhdGEpOwotICAgIGZyYW1lVHlwZSA9IGZyYW1lQ3RybCAmIDB4ZjsKLSAgICBmcmFtZVN1YnR5cGUgPSBmcmFtZUN0cmwgJiAweGYwOworCS8qIGZyYW1lQ3RybCA9IHptd19idWZfcmVhZGIoZGV2LCBidWYsIDApOwkqLworCWZyYW1lQ3RybCA9ICoodThfdCAqKSgodThfdCAqKWJ1Zi0+ZGF0YSk7CisJZnJhbWVUeXBlID0gZnJhbWVDdHJsICYgMHhmOworCWZyYW1lU3VidHlwZSA9IGZyYW1lQ3RybCAmIDB4ZjA7CiAKLSAgICBpZiAoKGZyYW1lVHlwZSA9PSAweDApICYmIChtYWNwLT5mb3J3YXJkTWdtdCkpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGZyYW1lU3VidHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIEJlYWNvbiAqLwotICAgICAgICAgICAgY2FzZSAweDgwIDoKLSAgICAgICAgICAgICAgICAvKiBQcm9iZSByZXNwb25zZSAqLwotICAgICAgICAgICAgY2FzZSAweDUwIDoKLSAgICAgICAgICAgICAgICBza2IxID0gc2tiX2NvcHkoYnVmLCBHRlBfQVRPTUlDKTsKLSAgICAgICAgICAgICAgICBpZihza2IxICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBza2IxLT5kZXYgPSBkZXY7Ci0gICAgICAgICAgICAgICAgICAgIHNrYjEtPm1hY19oZWFkZXIgPSBza2IxLT5kYXRhOwotCSAgICAgICAgICAgIHNrYjEtPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Ci0JICAgICAgICAgICAgc2tiMS0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOwotCSAgICAgICAgICAgIHNrYjEtPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucygweDAwMTkpOyAgLyogRVRIX1BfODAyMTFfUkFXICovCi0gICAgCSAgICAgICAgICAgIG5ldGlmX3J4KHNrYjEpOwotCSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9CisJaWYgKChmcmFtZVR5cGUgPT0gMHgwKSAmJiAobWFjcC0+Zm9yd2FyZE1nbXQpKSB7CisJCXN3aXRjaCAoZnJhbWVTdWJ0eXBlKSB7CisJCQkvKiBCZWFjb24gKi8KKwkJY2FzZSAweDgwOgorCQkJLyogUHJvYmUgcmVzcG9uc2UgKi8KKwkJY2FzZSAweDUwOgorCQkJc2tiMSA9IHNrYl9jb3B5KGJ1ZiwgR0ZQX0FUT01JQyk7CisJCQlpZiAoc2tiMSAhPSBOVUxMKSB7CisJCQkJc2tiMS0+ZGV2ID0gZGV2OworCQkJCXNrYjEtPm1hY19oZWFkZXIgPSBza2IxLT5kYXRhOworCQkJCXNrYjEtPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCQkJc2tiMS0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOworCQkJCS8qIEVUSF9QXzgwMjExX1JBVyAqLworCQkJCXNrYjEtPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucygweDAwMTkpOworCQkJCW5ldGlmX3J4KHNrYjEpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KIAotICAgIHpmaVJlY3Y4MDIxMShkZXYsIGJ1ZiwgYWRkSW5mbyk7Ci0gICAgcmV0dXJuOworCXpmaVJlY3Y4MDIxMShkZXYsIGJ1ZiwgYWRkSW5mbyk7CisJcmV0dXJuOwogfQogCiAjZGVmaW5lIFpNX0FWT0lEX1VEUF9MQVJHRV9QQUNLRVRfRkFJTAotdm9pZCB6ZkxueFJlY3ZFdGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBwb3J0KQordm9pZCB6ZkxueFJlY3ZFdGgoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCBwb3J0KQogewotICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CiAjaWZkZWYgWk1fQVZPSURfVURQX0xBUkdFX1BBQ0tFVF9GQUlMCi0gICAgemJ1Zl90ICpuZXdfYnVmOworCXpidWZfdCAqbmV3X2J1ZjsKIAotICAgIC8vbmV3X2J1ZiA9IGRldl9hbGxvY19za2IoMjA0OCk7Ci0gICAgbmV3X2J1ZiA9IGRldl9hbGxvY19za2IoYnVmLT5sZW4pOworCS8qIG5ld19idWYgPSBkZXZfYWxsb2Nfc2tiKDIwNDgpOwkqLworCW5ld19idWYgPSBkZXZfYWxsb2Nfc2tiKGJ1Zi0+bGVuKTsKIAogI2lmZGVmIE5FVF9TS0JVRkZfREFUQV9VU0VTX09GRlNFVAotICAgIG5ld19idWYtPnRhaWwgPSAwOwotICAgIG5ld19idWYtPmxlbiA9IDA7CisJbmV3X2J1Zi0+dGFpbCA9IDA7CisJbmV3X2J1Zi0+bGVuID0gMDsKICNlbHNlCi0gICAgbmV3X2J1Zi0+dGFpbCA9IG5ld19idWYtPmRhdGE7Ci0gICAgbmV3X2J1Zi0+bGVuID0gMDsKKwluZXdfYnVmLT50YWlsID0gbmV3X2J1Zi0+ZGF0YTsKKwluZXdfYnVmLT5sZW4gPSAwOwogI2VuZGlmCiAKLSAgICBza2JfcHV0KG5ld19idWYsIGJ1Zi0+bGVuKTsKLSAgICBtZW1jcHkobmV3X2J1Zi0+ZGF0YSwgYnVmLT5kYXRhLCBidWYtPmxlbik7CisJc2tiX3B1dChuZXdfYnVmLCBidWYtPmxlbik7CisJbWVtY3B5KG5ld19idWYtPmRhdGEsIGJ1Zi0+ZGF0YSwgYnVmLT5sZW4pOwogCi0gICAgLyogRnJlZSBidWZmZXIgKi8KLSAgICBkZXZfa2ZyZWVfc2tiX2FueShidWYpOworCS8qIEZyZWUgYnVmZmVyICovCisJZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKIAotICAgIGlmIChwb3J0ID09IDApCi0gICAgewotICAgICAgICBuZXdfYnVmLT5kZXYgPSBkZXY7Ci0gICAgICAgIG5ld19idWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMobmV3X2J1ZiwgZGV2KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogVkFQICovCi0gICAgICAgIGlmICh2YXBbMF0uZGV2ICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5ld19idWYtPmRldiA9IHZhcFswXS5kZXY7Ci0gICAgICAgICAgICBuZXdfYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKG5ld19idWYsIHZhcFswXS5kZXYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbmV3X2J1Zi0+ZGV2ID0gZGV2OwotICAgICAgICAgICAgbmV3X2J1Zi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhuZXdfYnVmLCBkZXYpOwotICAgICAgICB9Ci0gICAgfQorCWlmIChwb3J0ID09IDApIHsKKwkJbmV3X2J1Zi0+ZGV2ID0gZGV2OworCQluZXdfYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKG5ld19idWYsIGRldik7CisJfSBlbHNlIHsKKwkJLyogVkFQICovCisJCWlmICh2YXBbMF0uZGV2ICE9IE5VTEwpIHsKKwkJCW5ld19idWYtPmRldiA9IHZhcFswXS5kZXY7CisJCQluZXdfYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKG5ld19idWYsIHZhcFswXS5kZXYpOworCQl9IGVsc2UgeworCQkJbmV3X2J1Zi0+ZGV2ID0gZGV2OworCQkJbmV3X2J1Zi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhuZXdfYnVmLCBkZXYpOworCQl9CisJfQogCi0gICAgbmV3X2J1Zi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLSAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCW5ld19idWYtPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIAotICAgIHN3aXRjaChuZXRpZl9yeChuZXdfYnVmKSkKKwlzd2l0Y2ggKG5ldGlmX3J4KG5ld19idWYpKQogI2Vsc2UKLSAgICBpZiAocG9ydCA9PSAwKQotICAgIHsKLSAgICAgICAgYnVmLT5kZXYgPSBkZXY7Ci0gICAgICAgIGJ1Zi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhidWYsIGRldik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFZBUCAqLwotICAgICAgICBpZiAodmFwWzBdLmRldiAhPSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWYtPmRldiA9IHZhcFswXS5kZXY7Ci0gICAgICAgICAgICBidWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoYnVmLCB2YXBbMF0uZGV2KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1Zi0+ZGV2ID0gZGV2OwotICAgICAgICAgICAgYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKGJ1ZiwgZGV2KTsKLSAgICAgICAgfQotICAgIH0KKwlpZiAocG9ydCA9PSAwKSB7CisJCWJ1Zi0+ZGV2ID0gZGV2OworCQlidWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoYnVmLCBkZXYpOworCX0gZWxzZSB7CisJCS8qIFZBUCAqLworCQlpZiAodmFwWzBdLmRldiAhPSBOVUxMKSB7CisJCQlidWYtPmRldiA9IHZhcFswXS5kZXY7CisJCQlidWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoYnVmLCB2YXBbMF0uZGV2KTsKKwkJfSBlbHNlIHsKKwkJCWJ1Zi0+ZGV2ID0gZGV2OworCQkJYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKGJ1ZiwgZGV2KTsKKwkJfQorCX0KIAotICAgIGJ1Zi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLSAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCWJ1Zi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCi0gICAgc3dpdGNoKG5ldGlmX3J4KGJ1ZikpCisJc3dpdGNoIChuZXRpZl9yeChidWYpKQogI2VuZGlmCi0gICAgewotICAgIGNhc2UgTkVUX1JYX0RST1A6Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnJ4X3BhY2tldHMrKzsKLSAgICAgICAgICAgIG1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gYnVmLT5sZW47Ci0gICAgICAgIGJyZWFrOwotICAgIH0KKwl7CisJY2FzZSBORVRfUlhfRFJPUDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJCW1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMucnhfcGFja2V0cysrOworCQkJbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy5yeF9ieXRlcyArPSBidWYtPmxlbjsKKwkJYnJlYWs7CisJfQogCi0gICAgcmV0dXJuOworCXJldHVybjsKIH0KIAogLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfc2VjLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3NlYy5jCmluZGV4IDBmNzgwYmEuLjBiMjM4ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfc2VjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9zZWMuYwpAQCAtMzMsOTIgKzMzLDkzIEBACiAjaWZkZWYgWk1fRU5BQkxFX0NFTkMKIGV4dGVybiBpbnQgemZMbnhDZW5jU2VuZE1zZyhzdHJ1Y3Qgc29jayAqbmV0bGlua19zaywgdV9pbnQ4X3QgKm1zZywgaW50IGxlbik7CiAKLXUxNl90IHpmTG54Q2VuY0Fzb2NOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyLCB1OF90KiBib2R5LCB1MTZfdCBib2R5U2l6ZSwgdTE2X3QgcG9ydCkKK3UxNl90IHpmTG54Q2VuY0Fzb2NOb3RpZnkoemRldl90ICpkZXYsIHUxNl90ICptYWNBZGRyLCB1OF90ICpib2R5LAorCQkJCXUxNl90IGJvZHlTaXplLCB1MTZfdCBwb3J0KQogewotICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IChzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKilkZXYtPnByaXY7Ci0gICAgc3RydWN0IHp5ZGFzX2NlbmNfc3RhX2luZm8gY2VuY19pbmZvOwotICAgIC8vc3RydWN0IHNvY2sgKm5ldGxpbmtfc2s7Ci0gICAgdThfdCBpZV9sZW47Ci0gICAgaW50IGlpOworCXN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IChzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKilkZXYtPnByaXY7CisJc3RydWN0IHp5ZGFzX2NlbmNfc3RhX2luZm8gY2VuY19pbmZvOworCS8qIHN0cnVjdCBzb2NrICpuZXRsaW5rX3NrOwkqLworCXU4X3QgaWVfbGVuOworCWludCBpaTsKIAotICAgIC8qIENyZWF0ZSBORVRMSU5LIHNvY2tldCAqLwotICAgIC8vbmV0bGlua19zayA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX1VTRVJTT0NLLCBOVUxMKTsKKwkvKiBDcmVhdGUgTkVUTElOSyBzb2NrZXQgKi8KKwkvKm5ldGxpbmtfc2sgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19VU0VSU09DSywgTlVMTCk7CSovCiAKLSAgICBpZiAobWFjcC0+bmV0bGlua19zayA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJORVRMSU5LIFNvY2tldCBpcyBOVUxMXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KKwlpZiAobWFjcC0+bmV0bGlua19zayA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTkVUTElOSyBTb2NrZXQgaXMgTlVMTFxuIik7CisJCXJldHVybiAtMTsKKwl9CiAKLSAgICBtZW1zZXQoJmNlbmNfaW5mbywgMCwgc2l6ZW9mKGNlbmNfaW5mbykpOworCW1lbXNldCgmY2VuY19pbmZvLCAwLCBzaXplb2YoY2VuY19pbmZvKSk7CiAKLSAgICAvL21lbWNweShjZW5jX2luZm8uZ3NuLCB2YXAtPml2X2NlbmNtc2tfa2V5cy53a190eGl2LCBaTV9DRU5DX0lWX0xFTik7Ci0gICAgemZpV2xhblF1ZXJ5R1NOKGRldiwgY2VuY19pbmZvLmdzbiwgcG9ydCk7Ci0gICAgY2VuY19pbmZvLmRhdGFsZW4gKz0gWk1fQ0VOQ19JVl9MRU47Ci0gICAgaWVfbGVuID0gYm9keVsxXSArIDI7Ci0gICAgbWVtY3B5KGNlbmNfaW5mby53aWUsIGJvZHksIGllX2xlbik7Ci0gICAgY2VuY19pbmZvLmRhdGFsZW4gKz0gaWVfbGVuOworCS8qIG1lbWNweShjZW5jX2luZm8uZ3NuLCB2YXAtPml2X2NlbmNtc2tfa2V5cy53a190eGl2LAorCSAqICAJWk1fQ0VOQ19JVl9MRU4pOworCSAqLworCXpmaVdsYW5RdWVyeUdTTihkZXYsIGNlbmNfaW5mby5nc24sIHBvcnQpOworCWNlbmNfaW5mby5kYXRhbGVuICs9IFpNX0NFTkNfSVZfTEVOOworCWllX2xlbiA9IGJvZHlbMV0gKyAyOworCW1lbWNweShjZW5jX2luZm8ud2llLCBib2R5LCBpZV9sZW4pOworCWNlbmNfaW5mby5kYXRhbGVuICs9IGllX2xlbjsKIAotICAgIG1lbWNweShjZW5jX2luZm8uc3RhX21hYywgbWFjQWRkciwgNik7Ci0gICAgY2VuY19pbmZvLm1zZ190eXBlID0gWk1fQ0VOQ19XQUlfUkVRVUVTVDsKLSAgICBjZW5jX2luZm8uZGF0YWxlbiArPSA2ICsgMjsKKwltZW1jcHkoY2VuY19pbmZvLnN0YV9tYWMsIG1hY0FkZHIsIDYpOworCWNlbmNfaW5mby5tc2dfdHlwZSA9IFpNX0NFTkNfV0FJX1JFUVVFU1Q7CisJY2VuY19pbmZvLmRhdGFsZW4gKz0gNiArIDI7CiAKLSAgICBwcmludGsoS0VSTl9FUlIgIj09PT09IHpmd0NlbmNTZW5kTXNnLCBib2R5U2l6ZTogJWQgPT09PT1cbiIsIGJvZHlTaXplKTsKKwlwcmludGsoS0VSTl9FUlIgIj09PT09IHpmd0NlbmNTZW5kTXNnLCBib2R5U2l6ZTogJWQgPT09PT1cbiIsIGJvZHlTaXplKTsKIAotICAgIGZvcihpaSA9IDA7IGlpIDwgYm9keVNpemU7IGlpKyspCi0gICAgewotICAgICAgICBwcmludGsoS0VSTl9FUlIgIiUwMnggIiwgYm9keVtpaV0pOworCWZvciAoaWkgPSAwOyBpaSA8IGJvZHlTaXplOyBpaSsrKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJTAyeCAiLCBib2R5W2lpXSk7CiAKLSAgICAgICAgaWYgKChpaSAmIDB4ZikgPT0gMHhmKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlxuIik7Ci0gICAgICAgIH0KLSAgICB9CisJCWlmICgoaWkgJiAweGYpID09IDB4ZikKKwkJCXByaW50ayhLRVJOX0VSUiAiXG4iKTsKKwl9CiAKLSAgICB6ZkxueENlbmNTZW5kTXNnKG1hY3AtPm5ldGxpbmtfc2ssICh1OF90ICopJmNlbmNfaW5mbywgY2VuY19pbmZvLmRhdGFsZW4rNCk7CisJemZMbnhDZW5jU2VuZE1zZyhtYWNwLT5uZXRsaW5rX3NrLCAodThfdCAqKSZjZW5jX2luZm8sCisJCQkgY2VuY19pbmZvLmRhdGFsZW4rNCk7CiAKLSAgICAvKiBDbG9zZSBORVRMSU5LIHNvY2tldCAqLwotICAgIC8vc29ja19yZWxlYXNlKG5ldGxpbmtfc2spOworCS8qIENsb3NlIE5FVExJTksgc29ja2V0ICovCisJLyogc29ja19yZWxlYXNlKG5ldGxpbmtfc2spOwkqLwogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworI2VuZGlmIC8qIFpNX0VOQUJMRV9DRU5DCSovCiAKLXU4X3QgemZ3Q2VuY0hhbmRsZUJlYWNvblByb2JyZXNwb24oemRldl90KiBkZXYsIHU4X3QgKnBXSUVjLAotICAgICAgICB1OF90ICpwUGVlclNTSURjLCB1OF90ICpwUGVlckFkZHJjKQordThfdCB6ZndDZW5jSGFuZGxlQmVhY29uUHJvYnJlc3Bvbih6ZGV2X3QgKmRldiwgdThfdCAqcFdJRWMsCisJCXU4X3QgKnBQZWVyU1NJRGMsIHU4X3QgKnBQZWVyQWRkcmMpCiB7Ci0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLXU4X3QgemZ3R2V0UGt0RW5jRXhlbXB0aW9uQWN0aW9uVHlwZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit1OF90IHpmd0dldFBrdEVuY0V4ZW1wdGlvbkFjdGlvblR5cGUoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKQogewotICAgIHJldHVybiBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT047CisJcmV0dXJuIFpNX0VOQ1JZUFRJT05fRVhFTVBUX05PX0VYRU1QVElPTjsKIH0KIAotdm9pZCBjb3B5VG9JbnRUeEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCkKK3ZvaWQgY29weVRvSW50VHhCdWZmZXIoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1OF90ICpzcmMsCisJCQkJCQkgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBsZW5ndGgpCiB7Ci0gICAgdTE2X3QgaTsKKwl1MTZfdCBpOwogCi0gICAgZm9yKGk9MDsgaTxsZW5ndGg7aSsrKQotICAgIHsKLSAgICAgICAgLy96bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0K2ksIHNyY1tpXSk7Ci0gICAgICAgICoodThfdCopKCh1OF90KilidWYtPmRhdGErb2Zmc2V0K2kpID0gc3JjW2ldOwotICAgIH0KKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJLyogem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCtpLCBzcmNbaV0pOwkqLworCQkqKHU4X3QgKikoKHU4X3QgKilidWYtPmRhdGErb2Zmc2V0K2kpID0gc3JjW2ldOworCX0KIH0KIAotdTE2X3QgemZ3U3RhQWRkSWVXcGFSc24oemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgZnJhbWVUeXBlKQordTE2X3QgemZ3U3RhQWRkSWVXcGFSc24oemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgZnJhbWVUeXBlKQogewotICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKLSAgICAvL3ptX21zZzFfbW0oWk1fTFZfMCwgIkNXWSAtIGFkZCB3cGFpZSBjb250ZW50IExlbmd0aCA6ICIsIG1hY3AtPnN1cEllWzFdKTsKLSAgICBpZiAobWFjcC0+c3VwSWVbMV0gIT0gMCkKLSAgICB7Ci0gICAgICAgIGNvcHlUb0ludFR4QnVmZmVyKGRldiwgYnVmLCBtYWNwLT5zdXBJZSwgb2Zmc2V0LCBtYWNwLT5zdXBJZVsxXSsyKTsKLSAgICAgICAgLy9tZW1jcHkoYnVmLT5kYXRhW29mZnNldF0sIG1hY3AtPnN1cEllLCBtYWNwLT5zdXBJZVsxXSsyKTsKLSAgICAgICAgb2Zmc2V0ICs9IChtYWNwLT5zdXBJZVsxXSsyKTsKLSAgICB9CisJc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCS8qIHptX21zZzFfbW0oWk1fTFZfMCwgIkNXWSAtIGFkZCB3cGFpZSBjb250ZW50IExlbmd0aCA6ICIKKwkgKiAJCSwgbWFjcC0+c3VwSWVbMV0pOworCSAqLworCWlmIChtYWNwLT5zdXBJZVsxXSAhPSAwKSB7CisJCWNvcHlUb0ludFR4QnVmZmVyKGRldiwgYnVmLCBtYWNwLT5zdXBJZSwgb2Zmc2V0LAorCQkJCQkgbWFjcC0+c3VwSWVbMV0rMik7CisJCS8qIG1lbWNweShidWYtPmRhdGFbb2Zmc2V0XSwgbWFjcC0+c3VwSWUsIG1hY3AtPnN1cEllWzFdKzIpOyovCisJCW9mZnNldCArPSAobWFjcC0+c3VwSWVbMV0rMik7CisJfQogCi0gICAgcmV0dXJuIG9mZnNldDsKKwlyZXR1cm4gb2Zmc2V0OwogfQogCiAvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfdXNiLmMKaW5kZXggNzBmZDQxMC4uNmIzMzZlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF91c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3VzYi5jCkBAIC0zMCwxNTkgKzMwLDE1MiBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgogCi1leHRlcm4gdm9pZCB6ZkxueEluaXRVc2JUeFEoemRldl90KiBkZXYpOwotZXh0ZXJuIHZvaWQgemZMbnhJbml0VXNiUnhRKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmTG54SW5pdFVzYlR4USh6ZGV2X3QgKmRldik7CitleHRlcm4gdm9pZCB6ZkxueEluaXRVc2JSeFEoemRldl90ICpkZXYpOwogZXh0ZXJuIHUzMl90IHpmTG54U3VibWl0UmVnSW5VcmIoemRldl90ICpkZXYpOwotdTMyX3QgemZMbnhVc2JPdXQoemRldl90KiBkZXYsIHU4X3QgKmhkciwgdTE2X3QgaGRybGVuLCB1OF90ICpzbmFwLCB1MTZfdCBzbmFwTGVuLAotICAgICAgICB1OF90ICp0YWlsLCB1MTZfdCB0YWlsTGVuLCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKLXUzMl90IHpmTG54VXNiV3JpdGVSZWcoemRldl90KiBkZXYsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbik7Cit1MzJfdCB6ZkxueFVzYk91dCh6ZGV2X3QgKmRldiwgdThfdCAqaGRyLCB1MTZfdCBoZHJsZW4sIHU4X3QgKnNuYXAsCisJCXUxNl90IHNuYXBMZW4sIHU4X3QgKnRhaWwsIHUxNl90IHRhaWxMZW4sIHpidWZfdCAqYnVmLAorCQl1MTZfdCBvZmZzZXQpOwordTMyX3QgemZMbnhVc2JXcml0ZVJlZyh6ZGV2X3QgKmRldiwgdTMyX3QgKmNtZCwgdTE2X3QgY21kTGVuKTsKIAotdm9pZCB6ZndVc2JSZWdpc3RlckNhbGxCYWNrKHpkZXZfdCogZGV2LCBzdHJ1Y3QgemZDYlVzYkZ1bmNUYmwgKnpmVXNiRnVuYykgewotICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKK3ZvaWQgemZ3VXNiUmVnaXN0ZXJDYWxsQmFjayh6ZGV2X3QgKmRldiwgc3RydWN0IHpmQ2JVc2JGdW5jVGJsICp6ZlVzYkZ1bmMpCit7CisJc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwogCi0gICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYlJlY3YgPSB6ZlVzYkZ1bmMtPnpmY2JVc2JSZWN2OwotICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JSZWdJbiA9IHpmVXNiRnVuYy0+emZjYlVzYlJlZ0luOwotICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JPdXRDb21wbGV0ZSA9IHpmVXNiRnVuYy0+emZjYlVzYk91dENvbXBsZXRlOworCW1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JSZWN2ID0gemZVc2JGdW5jLT56ZmNiVXNiUmVjdjsKKwltYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiUmVnSW4gPSB6ZlVzYkZ1bmMtPnpmY2JVc2JSZWdJbjsKKwltYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiT3V0Q29tcGxldGUgPSB6ZlVzYkZ1bmMtPnpmY2JVc2JPdXRDb21wbGV0ZTsKIAotICAgIHJldHVybjsKKwlyZXR1cm47CiB9CiAKLXUzMl90IHpmd1VzYkdldEZyZWVUeFFTaXplKHpkZXZfdCogZGV2KQordTMyX3QgemZ3VXNiR2V0RnJlZVR4UVNpemUoemRldl90ICpkZXYpCiB7Ci0gICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwotICAgIHUzMl90ICAgICAgICBmcmVlVHhRU2l6ZTsKLSAgICB1bnNpZ25lZCBsb25nIGlycUZsYWc7Ci0gICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCXN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKwl1MzJfdAkJZnJlZVR4UVNpemU7CisJdW5zaWduZWQgbG9uZyBpcnFGbGFnOworCS8qIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CSovCiAKLSAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7Ci0gICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCS8qIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CSovCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwogCi0gICAgZnJlZVR4UVNpemUgPSBaTV9NQVhfVFhfQlVGX05VTSAtIG1hY3AtPlR4QnVmQ250OworCWZyZWVUeFFTaXplID0gWk1fTUFYX1RYX0JVRl9OVU0gLSBtYWNwLT5UeEJ1ZkNudDsKIAotICAgIC8vem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKLSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKwkvKiB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOwkqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwogCi0gICAgcmV0dXJuIGZyZWVUeFFTaXplOworCXJldHVybiBmcmVlVHhRU2l6ZTsKIH0KIAotdTMyX3QgemZ3VXNiR2V0TWF4VHhRU2l6ZSh6ZGV2X3QqIGRldikKK3UzMl90IHpmd1VzYkdldE1heFR4UVNpemUoemRldl90ICpkZXYpCiB7Ci0gICAgcmV0dXJuIFpNX01BWF9UWF9CVUZfTlVNOworCXJldHVybiBaTV9NQVhfVFhfQlVGX05VTTsKIH0KIAogdTMyX3QgemZ3VXNiRW5hYmxlSW50RXB0KHpkZXZfdCAqZGV2LCB1OF90IGVuZHB0KQogewotICAgIC8qIEluaXRpYWxpemUgVVNCIFR4USAqLwotICAgIHpmTG54SW5pdFVzYlR4UShkZXYpOworCS8qIEluaXRpYWxpemUgVVNCIFR4USAqLworCXpmTG54SW5pdFVzYlR4UShkZXYpOwogCi0gICAgLyogSW5pdGlhbGl6ZSBVU0IgUnhRICovCi0gICAgemZMbnhJbml0VXNiUnhRKGRldik7CisJLyogSW5pdGlhbGl6ZSBVU0IgUnhRICovCisJemZMbnhJbml0VXNiUnhRKGRldik7CiAKLSAgICAvKiBJbml0aWFsaXplIFVTQiBSZWdpc3RlciBJbiBVUkIgKi8KLSAgICAvL3pmd1VzYlN1Ym1pdFJlZ0luKGRldik7Ci0gICAgLyogSW5pdGlhbGl6ZSBVU0IgUmVnaXN0ZXIgSW4gVVJCICovCi0gICAgemZMbnhTdWJtaXRSZWdJblVyYihkZXYpOworCS8qIEluaXRpYWxpemUgVVNCIFJlZ2lzdGVyIEluIFVSQiAqLworCS8qIHpmd1VzYlN1Ym1pdFJlZ0luKGRldik7CSovCisJLyogSW5pdGlhbGl6ZSBVU0IgUmVnaXN0ZXIgSW4gVVJCICovCisJemZMbnhTdWJtaXRSZWdJblVyYihkZXYpOwogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLWludCB6ZndVc2JFbmFibGVSeEVwdCh6ZGV2X3QqIGRldiwgdThfdCBlbmRwdCkKK2ludCB6ZndVc2JFbmFibGVSeEVwdCh6ZGV2X3QgKmRldiwgdThfdCBlbmRwdCkKIHsKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAotdTMyX3QgemZ3VXNiU3VibWl0Q29udHJvbCh6ZGV2X3QqIGRldiwgdThfdCByZXEsIHUxNl90IHZhbHVlLCB1MTZfdCBpbmRleCwgdm9pZCAqZGF0YSwgdTMyX3Qgc2l6ZSkKK3UzMl90IHpmd1VzYlN1Ym1pdENvbnRyb2woemRldl90ICpkZXYsIHU4X3QgcmVxLCB1MTZfdCB2YWx1ZSwgdTE2X3QgaW5kZXgsCisJCQkgdm9pZCAqZGF0YSwgdTMyX3Qgc2l6ZSkKIHsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICB1MzJfdCByZXQgPSAwOwotICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKLSAgICB1OF90KiBidWY7CisJaW50IHJlc3VsdCA9IDA7CisJdTMyX3QgcmV0ID0gMDsKKwlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisJdThfdCAqYnVmOwogCi0gICAgaWYgKHNpemUgPiAwKQotICAgIHsKLSAgICAgICAgYnVmID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLSAgICAgICAgbWVtY3B5KGJ1ZiwgKHU4X3QqKWRhdGEsIHNpemUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBidWYgPSBOVUxMOwotICAgIH0KKwlpZiAoc2l6ZSA+IDApIHsKKwkJYnVmID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJbWVtY3B5KGJ1ZiwgKHU4X3QgKilkYXRhLCBzaXplKTsKKwl9IGVsc2UKKwkJYnVmID0gTlVMTDsKIAogI2lmIDAKLSAgICBwcmludGsoS0VSTl9FUlIgInJlcSA9IDB4JTAyeFxuIiwgcmVxKTsKLSAgICBwcmludGsoS0VSTl9FUlIgInZhbHVlID0gMHglMDR4XG4iLCB2YWx1ZSk7Ci0gICAgcHJpbnRrKEtFUk5fRVJSICJpbmRleCA9IDB4JTA0eFxuIiwgaW5kZXgpOwotICAgIHByaW50ayhLRVJOX0VSUiAiZGF0YSA9IDB4JWx4XG4iLCAodTMyX3QpIGRhdGEpOwotICAgIHByaW50ayhLRVJOX0VSUiAic2l6ZSA9ICVsZFxuIiwgc2l6ZSk7CisJcHJpbnRrKEtFUk5fRVJSICJyZXEgPSAweCUwMnhcbiIsIHJlcSk7CisJcHJpbnRrKEtFUk5fRVJSICJ2YWx1ZSA9IDB4JTA0eFxuIiwgdmFsdWUpOworCXByaW50ayhLRVJOX0VSUiAiaW5kZXggPSAweCUwNHhcbiIsIGluZGV4KTsKKwlwcmludGsoS0VSTl9FUlIgImRhdGEgPSAweCVseFxuIiwgKHUzMl90KSBkYXRhKTsKKwlwcmludGsoS0VSTl9FUlIgInNpemUgPSAlbGRcbiIsIHNpemUpOwogI2VuZGlmCiAKLSAgICByZXN1bHQgPSB1c2JfY29udHJvbF9tc2cobWFjcC0+dWRldiwgdXNiX3NuZGN0cmxwaXBlKG1hY3AtPnVkZXYsIDApLAotICAgICAgICAgICAgcmVxLCBVU0JfRElSX09VVCB8IDB4NDAsIHZhbHVlLCBpbmRleCwgYnVmLCBzaXplLCBIWik7CisJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKG1hY3AtPnVkZXYsIHVzYl9zbmRjdHJscGlwZShtYWNwLT51ZGV2LCAwKSwKKwkJCXJlcSwgVVNCX0RJUl9PVVQgfCAweDQwLCB2YWx1ZSwgaW5kZXgsIGJ1Ziwgc2l6ZSwgSFopOwogCi0gICAgaWYgKHJlc3VsdCA8IDApCi0gICAgewotICAgICAgICBwcmludGsoInpmd1VzYlN1Ym1pdENvbnRyb2woKSBmYWlsZWQsIHJlc3VsdD0weCV4XG4iLCByZXN1bHQpOwotICAgICAgICByZXQgPSAxOwotICAgIH0KLSAgICBrZnJlZShidWYpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiemZ3VXNiU3VibWl0Q29udHJvbCgpIGZhaWxlZCwgcmVzdWx0ID0gMHgleFxuIiwKKwkJCXJlc3VsdCk7CisJCXJldCA9IDE7CisJfQorCWtmcmVlKGJ1Zik7CiAKLSAgICByZXR1cm4gcmV0OworCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgemZ3VXNiQ21kKHpkZXZfdCogZGV2LCB1OF90IGVuZHB0LCB1MzJfdCogY21kLCB1MTZfdCBjbWRMZW4pCit2b2lkIHpmd1VzYkNtZCh6ZGV2X3QgKmRldiwgdThfdCBlbmRwdCwgdTMyX3QgKmNtZCwgdTE2X3QgY21kTGVuKQogewotICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKLSAgICB1MzJfdCByZXQ7CisJc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCXUzMl90IHJldDsKIAotICAgIC8vTVBVc2JDb21tYW5kKGRldiwgZW5kcHQsIGNtZCwgY21kTGVuKTsKLSAgICByZXQgPSB6ZkxueFVzYldyaXRlUmVnKGRldiwgY21kLCBjbWRMZW4pOworCS8qIE1QVXNiQ29tbWFuZChkZXYsIGVuZHB0LCBjbWQsIGNtZExlbik7CSovCisJcmV0ID0gemZMbnhVc2JXcml0ZVJlZyhkZXYsIGNtZCwgY21kTGVuKTsKIAotICAgIC8qIGlmIHpmTG54VXNiV3JpdGVSZWcoKSByZXR1cm4gZXJyb3IsIGZyZWUgYW5kIGFsbG9jYXRlIHVyYiwgcmVzZW5kIGFnYWluICovCi0gICAgaWYgKHJldCAhPSAwKQotICAgIHsKLSAgICAgICAgdXNiX2ZyZWVfdXJiKG1hY3AtPlJlZ091dFVyYik7Ci0gICAgICAgIG1hY3AtPlJlZ091dFVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7Ci0gICAgICAgIHJldCA9IHpmTG54VXNiV3JpdGVSZWcoZGV2LCBjbWQsIGNtZExlbik7Ci0gICAgfQorCS8qCisJICogaWYgemZMbnhVc2JXcml0ZVJlZygpIHJldHVybiBlcnJvciwgZnJlZSBhbmQgYWxsb2NhdGUgdXJiLAorCSAqIHJlc2VuZCBhZ2FpbgorCSAqLworCWlmIChyZXQgIT0gMCkgeworCQl1c2JfZnJlZV91cmIobWFjcC0+UmVnT3V0VXJiKTsKKwkJbWFjcC0+UmVnT3V0VXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKKwkJcmV0ID0gemZMbnhVc2JXcml0ZVJlZyhkZXYsIGNtZCwgY21kTGVuKTsKKwl9CiB9CiAKLXUzMl90IHpmd1VzYlNlbmQoemRldl90KiBkZXYsIHU4X3QgZW5kcHQsIHU4X3QgKmhkciwgdTE2X3QgaGRybGVuLCB1OF90ICpzbmFwLCB1MTZfdCBzbmFwTGVuLAotICAgICAgICAgICAgICAgIHU4X3QgKnRhaWwsIHUxNl90IHRhaWxMZW4sIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQpCit1MzJfdCB6ZndVc2JTZW5kKHpkZXZfdCAqZGV2LCB1OF90IGVuZHB0LCB1OF90ICpoZHIsIHUxNl90IGhkcmxlbiwgdThfdCAqc25hcCwKKwkJCXUxNl90IHNuYXBMZW4sCXU4X3QgKnRhaWwsIHUxNl90IHRhaWxMZW4sCisJCQl6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0KQogewotICAgIHUzMl90IHN0YXR1czsKKwl1MzJfdCBzdGF0dXM7CiAKICNpZmRlZiBaTV9DT05GSUdfQklHX0VORElBTgotICAgIHUzMl90IGlpID0gMDsKLSAgICB1MTZfdCAqcGMgPSBOVUxMOworCXUzMl90IGlpID0gMDsKKwl1MTZfdCAqcGMgPSBOVUxMOwogCi0gICAgcGMgPSAodTE2X3QgKiloZHI7Ci0gICAgZm9yKGlpPTA7IGlpPChoZHJsZW4+PjEpOyBpaSsrKQotICAgIHsKLSAgICAgICAgcGNbaWldID0gY3B1X3RvX2xlMTYocGNbaWldKTsKLSAgICB9CisJcGMgPSAodTE2X3QgKiloZHI7CisJZm9yIChpaSA9IDA7IGlpIDwgKGhkcmxlbiA+PiAxKTsgaWkrKykKKwkJcGNbaWldID0gY3B1X3RvX2xlMTYocGNbaWldKTsKIAotICAgIHBjID0gKHUxNl90ICopc25hcDsKLSAgICBmb3IoaWk9MDsgaWk8KHNuYXBMZW4+PjEpOyBpaSsrKQotICAgIHsKLSAgICAgICAgcGNbaWldID0gY3B1X3RvX2xlMTYocGNbaWldKTsKLSAgICB9CisJcGMgPSAodTE2X3QgKilzbmFwOworCWZvciAoaWkgPSAwOyBpaSA8IChzbmFwTGVuID4+IDEpOyBpaSsrKQorCQlwY1tpaV0gPSBjcHVfdG9fbGUxNihwY1tpaV0pOwogCi0gICAgcGMgPSAodTE2X3QgKil0YWlsOwotICAgIGZvcihpaT0wOyBpaTwodGFpbExlbj4+MSk7IGlpKyspCi0gICAgewotICAgICAgICBwY1tpaV0gPSBjcHVfdG9fbGUxNihwY1tpaV0pOwotICAgIH0KKwlwYyA9ICh1MTZfdCAqKXRhaWw7CisJZm9yIChpaSA9IDA7IGlpIDwgKHRhaWxMZW4+PjEpOyBpaSsrKQorCQlwY1tpaV0gPSBjcHVfdG9fbGUxNihwY1tpaV0pOwogI2VuZGlmCiAKLSAgICBzdGF0dXMgPSB6ZkxueFVzYk91dChkZXYsIGhkciwgaGRybGVuLCBzbmFwLCBzbmFwTGVuLCB0YWlsLCB0YWlsTGVuLCBidWYsIG9mZnNldCk7Ci0gICAgaWYgKCBzdGF0dXMgPT0gMCApCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQorCXN0YXR1cyA9IHpmTG54VXNiT3V0KGRldiwgaGRyLCBoZHJsZW4sIHNuYXAsIHNuYXBMZW4sIHRhaWwsIHRhaWxMZW4sCisJCQkJYnVmLCBvZmZzZXQpOworCWlmIChzdGF0dXMgPT0gMCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKIH0KIAogLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3pkdXNiLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy96ZHVzYi5oCmluZGV4IDlmOGFiMmUuLjk3ZTRlZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3pkdXNiLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvemR1c2IuaApAQCAtMzQsMTAgKzM0LDEwIEBACiAjZGVmaW5lIFZFUlNJT05JRCAgICAgICAgICAgICAgICIwLjAuMC45OTkiCiAKIC8qIERlZmluZSB0aGVzZSB2YWx1ZXMgdG8gbWF0Y2ggeW91ciBkZXZpY2UgKi8KLSNkZWZpbmUgVkVORE9SX0FUSFIgICAgICAgICAgICAgMHgwQ0YzICAvL0F0aGVyb3MKKyNkZWZpbmUgVkVORE9SX0FUSFIgICAgICAgICAgICAgMHgwQ0YzICAvKiBBdGhlcm9zICovCiAjZGVmaW5lIFBST0RVQ1RfQVI5MTcwICAgICAgICAgIDB4OTE3MAogCi0jZGVmaW5lIFZFTkRPUl9ETElOSyAgICAgICAgICAgIDB4MDdEMSAgLy9EbGluaworI2RlZmluZSBWRU5ET1JfRExJTksgICAgICAgICAgICAweDA3RDEgIC8qIERsaW5rICovCiAjZGVmaW5lIFBST0RVQ1RfRFdBMTYwQSAgICAgICAgIDB4M0MxMAogCiAjZGVmaW5lCVZFTkRPUl9ORVRHRUFSCQkweDA4NDYJLyogTmV0R2VhciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3A5YXV0aC9wOWF1dGguYyBiL2RyaXZlcnMvc3RhZ2luZy9wOWF1dGgvcDlhdXRoLmMKaW5kZXggOGNjZmZmNy4uZGI3OTYyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3A5YXV0aC9wOWF1dGguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcDlhdXRoL3A5YXV0aC5jCkBAIC0zMzQsNiArMzM0LDcgQEAKIAkucmVsZWFzZSA9IGNhcF9yZWxlYXNlLAogfTsKIAorLyogbm8gX19leGl0IGhlcmUgYmVjYXVzZSBpdCBjYW4gYmUgY2FsbGVkIGJ5IHRoZSBpbml0IGZ1bmN0aW9uICovCiBzdGF0aWMgdm9pZCBjYXBfY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAlpbnQgaTsKQEAgLTM2MCw3ICszNjEsNyBAQAogCQlwcmludGsoS0VSTl9OT1RJQ0UgIkVycm9yICVkIGFkZGluZyBjYXAlZCIsIGVyciwgaW5kZXgpOwogfQogCi1zdGF0aWMgaW50IGNhcF9pbml0X21vZHVsZSh2b2lkKQorc3RhdGljIGludCBfX2luaXQgY2FwX2luaXRfbW9kdWxlKHZvaWQpCiB7CiAJaW50IHJlc3VsdCwgaTsKIAlkZXZfdCBkZXYgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BoaXNvbi9waGlzb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9waGlzb24vcGhpc29uLmMKaW5kZXggMjcwZWJjYi4uMzgxN2Q3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3BoaXNvbi9waGlzb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcGhpc29uL3BoaXNvbi5jCkBAIC04NywxMiArODcsMTIgQEAKICNlbmRpZgogfTsKIAotc3RhdGljIGludCBwaGlzb25faWRlX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHBoaXNvbl9pZGVfaW5pdCh2b2lkKQogewogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZwaGlzb25fcGNpX2RyaXZlcik7CiB9CiAKLXN0YXRpYyB2b2lkIHBoaXNvbl9pZGVfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHBoaXNvbl9pZGVfZXhpdCh2b2lkKQogewogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcGhpc29uX3BjaV9kcml2ZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BvY2gvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL3BvY2gvUkVBRE1FCmluZGV4IDg0MmFmZDQuLmFjNzZmZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9wb2NoL1JFQURNRQorKysgYi9kcml2ZXJzL3N0YWdpbmcvcG9jaC9SRUFETUUKQEAgLTEsNyArMSw2IEBACiBUT0RPOgogCS0gUnggYmxvY2sgc2l6ZSBpcyBsaW1pdGVkIHRvIDwgMjA0OCwgaGFyZHdhcmUgYnVnPwogCS0gR3JvdXAgc2l6ZSBpcyBsaW1pdGVkIHRvIDwgcGFnZSBzaXplLCBrZXJuZWwgYWxsb2MvbW1hcCBBUEkgaXNzdWVzCi0JLSBmaXgvd29ya2Fyb3VuZCBjYWNoZSBpc3N1ZXMgaW4gY2lyY3VsYXIgYnVmZmVyIGhlYWRlcgogCS0gdGVzdCB3aGV0aGVyIFR4IGlzIHRyYW5zbWl0dGluZyBkYXRhIGZyb20gcHJvdmlkZWQgYnVmZmVycwogCS0gaGFuZGxlIGRldmljZSB1bnBsdWcgY2FzZQogCS0gaGFuZGxlIHRlbXBlcmF0dXJlIGFib3ZlIHRocmVzaG9sZApAQCAtMTAsNSArOSwxMjggQEAKIAktIGF1ZGl0IHVzZXJzcGFjZSBpbnRlcmZhY2VzCiAJLSBnZXQgcmVzZXJ2ZWQgbWFqb3IvbWlub3IgaWYgbmVlZGVkCiAKK1NhbXBsZSBDb2RlOgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm9yLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8c3lzZnMvbGlic3lzZnMuaD4KKworI2luY2x1ZGUgPHBvY2guaD4KKworc3RydWN0IHBjb25zdW1lIHsKKwl1aW50MzJfdCAqIG9mZnNldHM7CisJdWludDMyX3QgbmZldGNoOworCXVpbnQzMl90IG5mbHVzaDsKK307CisKK3VpbnQzMl90IG9mZnNldHNbMTBdOworCit2b2lkIHByb2Nlc3NfZ3JvdXAodW5zaWduZWQgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKQoreworCXVpbnQxNl90ICpidWYxNiA9ICh1aW50MTZfdCAqKWJ1ZjsKKworCXByaW50ZigiUlg6ICVwICV1ICUwNHggJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4XG4iLCBidWYsIHNpemUsCisJICAgICAgIGJ1ZjE2WzBdLCBidWYxNlsxXSwgYnVmMTZbMl0sIGJ1ZjE2WzNdLCBidWYxNls0XSwgYnVmMTZbNV0pOworfQorCitpbnQgbWFpbigpCit7CisJc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYXR0cjsKKwljaGFyICpwYXRoOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBtbWFwX3NpemU7CisJaW50IGZkOworCXVuc2lnbmVkIGNoYXIgKmNidWY7CisKKwl1aW50MzJfdCBuZmx1c2g7CisJc3RydWN0IHBvbGxmZCBwb2xsX2ZkczsKKwlpbnQgY291bnQgPSAwOworCWludCBpOworCisJcGF0aCA9ICIvc3lzL2NsYXNzL3BvY2tldGNoYW5nZS9wb2NoMC9jaDAvYmxvY2tfc2l6ZSI7CisJYXR0ciA9IHN5c2ZzX29wZW5fYXR0cmlidXRlKHBhdGgpOworCXJldCA9IHN5c2ZzX3dyaXRlX2F0dHJpYnV0ZShhdHRyLCAiMjU2Iiwgc3RybGVuKCIyNTYiKSk7CisJaWYgKHJldCA9PSAtMSkKKwkJZXJyb3IoMSwgZXJybm8sICJlcnJvciB3cml0aW5nIGF0dHJpYnV0ZSAlcyIsIHBhdGgpOworCXN5c2ZzX2Nsb3NlX2F0dHJpYnV0ZShhdHRyKTsKKworCXBhdGggPSAiL3N5cy9jbGFzcy9wb2NrZXRjaGFuZ2UvcG9jaDAvY2gwL2dyb3VwX3NpemUiOworCWF0dHIgPSBzeXNmc19vcGVuX2F0dHJpYnV0ZShwYXRoKTsKKwlyZXQgPSBzeXNmc193cml0ZV9hdHRyaWJ1dGUoYXR0ciwgIjQwOTYiLCBzdHJsZW4oIjQwOTYiKSk7CisJaWYgKHJldCA9PSAtMSkKKwkJZXJyb3IoMSwgZXJybm8sICJlcnJvciB3cml0aW5nIGF0dHJpYnV0ZSAlcyIsIHBhdGgpOworCXN5c2ZzX2Nsb3NlX2F0dHJpYnV0ZShhdHRyKTsKKworCXBhdGggPSAiL3N5cy9jbGFzcy9wb2NrZXRjaGFuZ2UvcG9jaDAvY2gwL2dyb3VwX2NvdW50IjsKKwlhdHRyID0gc3lzZnNfb3Blbl9hdHRyaWJ1dGUocGF0aCk7CisJcmV0ID0gc3lzZnNfd3JpdGVfYXR0cmlidXRlKGF0dHIsICI2NCIsIHN0cmxlbigiNjQiKSk7CisJaWYgKHJldCA9PSAtMSkKKwkJZXJyb3IoMSwgZXJybm8sICJlcnJvciB3cml0aW5nIGF0dHJpYnV0ZSAlcyIsIHBhdGgpOworCXN5c2ZzX2Nsb3NlX2F0dHJpYnV0ZShhdHRyKTsKKworCWZkID0gb3BlbigiL2Rldi9jaDAiLCBPX1JEV1IpOworCWlmIChmZCA9PSAtMSkKKwkJZXJyb3IoMSwgZXJybm8sICJlcnJvciBvcGVuaW5nIGRldmljZSBub2RlIik7CisKKwlwYXRoID0gIi9zeXMvY2xhc3MvcG9ja2V0Y2hhbmdlL3BvY2gwL2NoMC9tbWFwX3NpemUiOworCWF0dHIgPSBzeXNmc19vcGVuX2F0dHJpYnV0ZShwYXRoKTsKKwlyZXQgPSBzeXNmc19yZWFkX2F0dHJpYnV0ZShhdHRyKTsKKwlpZiAocmV0ID09IC0xKQorCQllcnJvcigxLCBlcnJubywgImVycm9yIHJlYWRpbmcgYXR0cmlidXRlICVzIiwgcGF0aCk7CisJcHJpbnRmKCIlcyIsIGF0dHItPnZhbHVlKTsKKwlzc2NhbmYoYXR0ci0+dmFsdWUsICIlbHUiLCAmbW1hcF9zaXplKTsKKwlzeXNmc19jbG9zZV9hdHRyaWJ1dGUoYXR0cik7CisKKwljYnVmID0gbW1hcChOVUxMLCBtbWFwX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCSAgICBNQVBfUFJJVkFURSwgZmQsIDApOworCWlmIChjYnVmID09IE1BUF9GQUlMRUQpCisJCWVycm9yKDEsIGVycm5vLCAiZXJyb3IgbWFwcGluZyBETUEgYnVmZmVycyIpOworCisJcmV0ID0gaW9jdGwoZmQsIFBPQ0hfSU9DX1RSQU5TRkVSX1NUQVJULCAwKTsKKwlpZiAocmV0ID09IC0xKQorCQllcnJvcigxLCBlcnJubywgImVycm9yIHN0YXJ0aW5nIHRyYW5zZmVyIik7CisKKwluZmx1c2ggPSAwOworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBwY29uc3VtZSBjb25zdW1lOworCisJCWNvbnN1bWUub2Zmc2V0cyA9IG9mZnNldHM7CisJCWNvbnN1bWUubmZldGNoID0gMTA7CisJCWNvbnN1bWUubmZsdXNoID0gbmZsdXNoOworCisJCXJldCA9IGlvY3RsKGZkLCBQT0NIX0lPQ19DT05TVU1FLCAmY29uc3VtZSk7CisJCWlmIChyZXQgPT0gLTEpCisJCQllcnJvcigxLCBlcnJubywgImVycm9yIGNvbnN1bWluZyBncm91cHMiKTsKKworCQluZmx1c2ggPSBjb25zdW1lLm5mZXRjaDsKKworCQlmb3IgKGkgPSAwOyBpIDwgbmZsdXNoOyBpKyspIHsKKwkJCXByb2Nlc3NfZ3JvdXAoY2J1ZiArIGNvbnN1bWUub2Zmc2V0c1tpXSwgNDA5Nik7CisKKwkJCWNvdW50Kys7CisJCQlpZiAoY291bnQgPT0gMTAwMCkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChjb3VudCA9PSAxMDAwKQorCQkJYnJlYWs7CisJfQorCisJcmV0ID0gaW9jdGwoZmQsIFBPQ0hfSU9DX1RSQU5TRkVSX1NUT1AsIDApOworCWlmIChyZXQgPT0gLTEpCisJCWVycm9yKDEsIGVycm5vLCAiZXJyb3Igc3RhcnRpbmcgdHJhbnNmZXIiKTsKKworCXJldHVybiAwOworfQorCiBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZAogVmlqYXkgS3VtYXIgPHZpamF5a3VtYXJAYnJhdmVnbnUub3JnPiBhbmQgSmF5YSBLdW1hciA8amF5YWt1bWFyLmxrbWxAZ21haWwuY29tPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BvY2gvcG9jaC5jIGIvZHJpdmVycy9zdGFnaW5nL3BvY2gvcG9jaC5jCmluZGV4IDJlYjhlM2QuLjkwOTUxNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9wb2NoL3BvY2guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcG9jaC9wb2NoLmMKQEAgLTE5NywxMCArMTk3LDkgQEAKIAogCS8qIENvbnRhaW5zIHRoZSBoZWFkZXIgYW5kIGNpcmN1bGFyIGJ1ZmZlciBleHBvcnRlZCB0byB1c2Vyc3BhY2UuICovCiAJc3BpbmxvY2tfdCBncm91cF9vZmZzZXRzX2xvY2s7Ci0Jc3RydWN0IHBvY2hfY2J1Zl9oZWFkZXIgKmhlYWRlcjsKLQlzdHJ1Y3QgcGFnZSAqaGVhZGVyX3BnOwotCXVuc2lnbmVkIGxvbmcgaGVhZGVyX3NpemU7CiAKKwkvKiBMYXN0IGdyb3VwIGNvbnN1bWVkIGJ5IHVzZXIgc3BhY2UuICovCisJdW5zaWduZWQgaW50IGNvbnN1bWVkOwogCS8qIExhc3QgZ3JvdXAgaW5kaWNhdGVkIGFzICdjb21wbGV0ZScgdG8gdXNlciBzcGFjZS4gKi8KIAl1bnNpZ25lZCBpbnQgdHJhbnNmZXI7CiAKQEAgLTI0NSw2ICsyNDQsMTYgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiB9OwogCitzdGF0aWMgaW50IHN5bnRoX3J4OworbW9kdWxlX3BhcmFtKHN5bnRoX3J4LCBib29sLCAwNjAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc3ludGhfcngsCisJCSJTeW50aGVzaXplIHJlY2VpdmVkIHZhbHVlcyB1c2luZyBhIGNvdW50ZXIuIERlZmF1bHQ6IE5vIik7CisKK3N0YXRpYyBpbnQgbG9vcGJhY2s7Cittb2R1bGVfcGFyYW0obG9vcGJhY2ssIGJvb2wsIDA2MDApOworTU9EVUxFX1BBUk1fREVTQyhsb29wYmFjaywKKwkJIkVuYWJsZSBoYXJkd2FyZSBsb29wYmFjayBvZiB0cmFzbm1pdHRlZCBkYXRhLiBEZWZhdWx0OiBObyIpOworCiBzdGF0aWMgZGV2X3QgcG9jaF9maXJzdF9kZXY7CiBzdGF0aWMgc3RydWN0IGNsYXNzICpwb2NoX2NsczsKIHN0YXRpYyBERUZJTkVfSURSKHBvY2hfaWRzKTsKQEAgLTMxNywxNCArMzI2LDEyIEBACiAJaW50IGxlbjsKIAl1bnNpZ25lZCBsb25nIG1tYXBfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGdyb3VwX3BhZ2VzOwotCXVuc2lnbmVkIGxvbmcgaGVhZGVyX3BhZ2VzOwogCXVuc2lnbmVkIGxvbmcgdG90YWxfZ3JvdXBfcGFnZXM7CiAKIAlncm91cF9wYWdlcyA9IG5wYWdlcyhjaGFubmVsLT5ncm91cF9zaXplKTsKLQloZWFkZXJfcGFnZXMgPSBucGFnZXMoY2hhbm5lbC0+aGVhZGVyX3NpemUpOwogCXRvdGFsX2dyb3VwX3BhZ2VzID0gZ3JvdXBfcGFnZXMgKiBjaGFubmVsLT5ncm91cF9jb3VudDsKIAotCW1tYXBfc2l6ZSA9IChoZWFkZXJfcGFnZXMgKyB0b3RhbF9ncm91cF9wYWdlcykgKiBQQUdFX1NJWkU7CisJbW1hcF9zaXplID0gdG90YWxfZ3JvdXBfcGFnZXMgKiBQQUdFX1NJWkU7CiAJbGVuID0gc3ByaW50ZihidWYsICIlbHVcbiIsIG1tYXBfc2l6ZSk7CiAJcmV0dXJuIGxlbjsKIH0KQEAgLTM1NywxMCArMzY0LDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGk7CiAJdW5zaWduZWQgbG9uZyBncm91cF9wYWdlczsKLQl1bnNpZ25lZCBsb25nIGhlYWRlcl9wYWdlczsKIAogCWdyb3VwX3BhZ2VzID0gbnBhZ2VzKGNoYW5uZWwtPmdyb3VwX3NpemUpOwotCWhlYWRlcl9wYWdlcyA9IG5wYWdlcyhjaGFubmVsLT5oZWFkZXJfc2l6ZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbC0+Z3JvdXBfY291bnQ7IGkrKykgewogCQlzdHJ1Y3QgcG9jaF9ncm91cF9pbmZvICpncm91cDsKQEAgLTM5MCw4ICszOTUsNyBAQAogCQkgKiB0aGlzPwogCQkgKi8KIAkJZ3JvdXAtPmRtYV9hZGRyID0gcGFnZV90b19wZm4oZ3JvdXAtPnBnKSAqIFBBR0VfU0laRTsKLQkJZ3JvdXAtPnVzZXJfb2Zmc2V0ID0KLQkJCShoZWFkZXJfcGFnZXMgKyAoaSAqIGdyb3VwX3BhZ2VzKSkgKiBQQUdFX1NJWkU7CisJCWdyb3VwLT51c2VyX29mZnNldCA9IChpICogZ3JvdXBfcGFnZXMpICogUEFHRV9TSVpFOwogCiAJCXByaW50ayhLRVJOX0lORk8gUEZYICIlbGQ6IHVzZXJfb2Zmc2V0OiAweCVseFxuIiwgaSwKIAkJICAgICAgIGdyb3VwLT51c2VyX29mZnNldCk7CkBAIC00NzYsNyArNDgwLDcgQEAKIAkJICBmcGdhICsgYmxvY2tfY291bnRfcmVnKTsKIAlpb3dyaXRlMzIoY2hhbm5lbC0+Z3JvdXBfY291bnQsIGZwZ2EgKyBncm91cF9jb3VudF9yZWcpOwogCS8qIEZJWE1FOiBIYXJkY29kZWQgZ3JvdXBzIHBlciBpbnQuIEdldCBpdCBmcm9tIHN5c2ZzPyAqLwotCWlvd3JpdGUzMigxLCBmcGdhICsgZ3JvdXBzX3Blcl9pbnRfcmVnKTsKKwlpb3dyaXRlMzIoMTYsIGZwZ2EgKyBncm91cHNfcGVyX2ludF9yZWcpOwogCiAJLyogVW5sb2NrIFBDSSBhZGRyZXNzPyBOb3QgZGVmaW5lZCBpbiB0aGUgZGF0YSBzaGVldCwgYnV0IHVzZWQKIAkgKiBpbiB0aGUgcmVmZXJlbmNlIGNvZGUgYnkgUmVkcmFwaWRzLgpAQCAtNTEzLDU2ICs1MTcsNiBAQAogCiB9CiAKLXN0YXRpYyBpbnQgcG9jaF9jaGFubmVsX2FsbG9jX2hlYWRlcihzdHJ1Y3QgY2hhbm5lbF9pbmZvICpjaGFubmVsKQotewotCXN0cnVjdCBwb2NoX2NidWZfaGVhZGVyICpoZWFkZXIgPSBjaGFubmVsLT5oZWFkZXI7Ci0JdW5zaWduZWQgbG9uZyBncm91cF9vZmZzZXRfc2l6ZTsKLQl1bnNpZ25lZCBsb25nIHRvdF9ncm91cF9vZmZzZXRzX3NpemU7Ci0KLQkvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gaG9sZCBoZWFkZXIgZXhwb3J0ZWQgdXNlcnNwYWNlICovCi0JZ3JvdXBfb2Zmc2V0X3NpemUgPSBzaXplb2YoaGVhZGVyLT5ncm91cF9vZmZzZXRzWzBdKTsKLQl0b3RfZ3JvdXBfb2Zmc2V0c19zaXplID0gZ3JvdXBfb2Zmc2V0X3NpemUgKiBjaGFubmVsLT5ncm91cF9jb3VudDsKLQljaGFubmVsLT5oZWFkZXJfc2l6ZSA9IHNpemVvZigqaGVhZGVyKSArIHRvdF9ncm91cF9vZmZzZXRzX3NpemU7Ci0JY2hhbm5lbC0+aGVhZGVyX3BnID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sCi0JCQkJCSBnZXRfb3JkZXIoY2hhbm5lbC0+aGVhZGVyX3NpemUpKTsKLQlpZiAoIWNoYW5uZWwtPmhlYWRlcl9wZykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljaGFubmVsLT5oZWFkZXIgPSBwYWdlX2FkZHJlc3MoY2hhbm5lbC0+aGVhZGVyX3BnKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwb2NoX2NoYW5uZWxfZnJlZV9oZWFkZXIoc3RydWN0IGNoYW5uZWxfaW5mbyAqY2hhbm5lbCkKLXsKLQl1bnNpZ25lZCBpbnQgb3JkZXI7Ci0KLQlvcmRlciA9IGdldF9vcmRlcihjaGFubmVsLT5oZWFkZXJfc2l6ZSk7Ci0JX19mcmVlX3BhZ2VzKGNoYW5uZWwtPmhlYWRlcl9wZywgb3JkZXIpOwotfQotCi1zdGF0aWMgdm9pZCBwb2NoX2NoYW5uZWxfaW5pdF9oZWFkZXIoc3RydWN0IGNoYW5uZWxfaW5mbyAqY2hhbm5lbCkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgcG9jaF9ncm91cF9pbmZvICpncm91cHM7Ci0JczMyICpncm91cF9vZmZzZXRzOwotCi0JY2hhbm5lbC0+aGVhZGVyLT5ncm91cF9zaXplX2J5dGVzID0gY2hhbm5lbC0+Z3JvdXBfc2l6ZTsKLQljaGFubmVsLT5oZWFkZXItPmdyb3VwX2NvdW50ID0gY2hhbm5lbC0+Z3JvdXBfY291bnQ7Ci0KLQlzcGluX2xvY2tfaW5pdCgmY2hhbm5lbC0+Z3JvdXBfb2Zmc2V0c19sb2NrKTsKLQotCWdyb3VwX29mZnNldHMgPSBjaGFubmVsLT5oZWFkZXItPmdyb3VwX29mZnNldHM7Ci0JZ3JvdXBzID0gY2hhbm5lbC0+Z3JvdXBzOwotCi0JZm9yIChpID0gMDsgaSA8IGNoYW5uZWwtPmdyb3VwX2NvdW50OyBpKyspIHsKLQkJaWYgKGNoYW5uZWwtPmRpciA9PSBDSEFOTkVMX0RJUl9SWCkKLQkJCWdyb3VwX29mZnNldHNbaV0gPSAtMTsKLQkJZWxzZQotCQkJZ3JvdXBfb2Zmc2V0c1tpXSA9IGdyb3Vwc1tpXS51c2VyX29mZnNldDsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIF9fcG9jaF9jaGFubmVsX2NsZWFyX2NvdW50ZXJzKHN0cnVjdCBjaGFubmVsX2luZm8gKmNoYW5uZWwpCiB7CiAJY2hhbm5lbC0+Y291bnRlcnMucGxsX3VubG9jayA9IDA7CkBAIC01ODQsNiArNTM4LDcgQEAKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gb3V0OwogCisJY2hhbm5lbC0+Y29uc3VtZWQgPSAwOwogCWNoYW5uZWwtPnRyYW5zZmVyID0gMDsKIAogCS8qIEFsbG9jYXRlIG1lbW9yeSB0byBob2xkIGdyb3VwIGluZm9ybWF0aW9uLiAqLwpAQCAtNjA0LDEyICs1NTksNiBAQAogCQlnb3RvIG91dF9mcmVlX2dyb3VwX2luZm87CiAJfQogCi0JcmV0ID0gcG9jaF9jaGFubmVsX2FsbG9jX2hlYWRlcihjaGFubmVsKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGV2LCAiZXJyb3IgYWxsb2NhdGluZyB1c2VyIHNwYWNlIGhlYWRlclxuIik7Ci0JCWdvdG8gb3V0X2ZyZWVfZ3JvdXBzOwotCX0KLQogCWNoYW5uZWwtPmZwZ2FfaW9tZW0gPSBwb2NoX2Rldi0+ZnBnYV9pb21lbTsKIAljaGFubmVsLT5icmlkZ2VfaW9tZW0gPSBwb2NoX2Rldi0+YnJpZGdlX2lvbWVtOwogCWNoYW5uZWwtPmlvbWVtX2xvY2sgPSAmcG9jaF9kZXYtPmlvbWVtX2xvY2s7CkBAIC02MTcsMTQgKzU2Niw4IEBACiAKIAlfX3BvY2hfY2hhbm5lbF9jbGVhcl9jb3VudGVycyhjaGFubmVsKTsKIAotCXByaW50ayhLRVJOX1dBUk5JTkcgInBvY2hfY2hhbm5lbF9pbml0X2hlYWRlclxuIik7Ci0KLQlwb2NoX2NoYW5uZWxfaW5pdF9oZWFkZXIoY2hhbm5lbCk7Ci0KIAlyZXR1cm4gMDsKIAotIG91dF9mcmVlX2dyb3VwczoKLQlwb2NoX2NoYW5uZWxfZnJlZV9ncm91cHMoY2hhbm5lbCk7CiAgb3V0X2ZyZWVfZ3JvdXBfaW5mbzoKIAlrZnJlZShjaGFubmVsLT5ncm91cHMpOwogIG91dDoKQEAgLTgyMiwxNCArNzY1LDIxIEBACiAKIAlpZiAoY2hhbm5lbC0+ZGlyID09IENIQU5ORUxfRElSX1RYKSB7CiAJCS8qIEZsdXNoIFRYIEZJRk8gYW5kIG91dHB1dCBkYXRhIGZyb20gY2FyZGJ1cy4gKi8KLQkJaW93cml0ZTMyKEZQR0FfVFhfQ1RMX0ZJRk9fRkxVU0gKLQkJCSAgfCBGUEdBX1RYX0NUTF9PVVRQVVRfQ0FSREJVUywKLQkJCSAgZnBnYSArIEZQR0FfVFhfQ1RMX1JFRyk7CisJCXUzMiBjdGxfdmFsID0gMDsKKworCQljdGxfdmFsIHw9IEZQR0FfVFhfQ1RMX0ZJRk9fRkxVU0g7CisJCWN0bF92YWwgfD0gRlBHQV9UWF9DVExfT1VUUFVUX0NBUkRCVVM7CisJCWlmIChsb29wYmFjaykKKwkJCWN0bF92YWwgfD0gRlBHQV9UWF9DVExfTE9PUEJBQ0s7CisKKwkJaW93cml0ZTMyKGN0bF92YWwsIGZwZ2EgKyBGUEdBX1RYX0NUTF9SRUcpOwogCX0gZWxzZSB7CiAJCS8qIEZsdXNoIFJYIEZJRk8gYW5kIG91dHB1dCBkYXRhIHRvIGNhcmRidXMuICovCi0JCWlvd3JpdGUzMihGUEdBX1JYX0NUTF9DT05UX0NBUAotCQkJICB8IEZQR0FfUlhfQ1RMX0ZJRk9fRkxVU0gsCi0JCQkgIGZwZ2EgKyBGUEdBX1JYX0NUTF9SRUcpOworCQl1MzIgY3RsX3ZhbCA9IEZQR0FfUlhfQ1RMX0NPTlRfQ0FQIHwgRlBHQV9SWF9DVExfRklGT19GTFVTSDsKKwkJaWYgKHN5bnRoX3J4KQorCQkJY3RsX3ZhbCB8PSBGUEdBX1JYX0NUTF9TWU5USF9EQVRBOworCisJCWlvd3JpdGUzMihjdGxfdmFsLCBmcGdhICsgRlBHQV9SWF9DVExfUkVHKTsKIAl9CiAKIAlhdG9taWNfaW5jKCZjaGFubmVsLT5pbml0ZWQpOwpAQCAtODYxLDcgKzgxMSw2IEBACiAJfQogCiAJYXRvbWljX2RlYygmY2hhbm5lbC0+aW5pdGVkKTsKLQlwb2NoX2NoYW5uZWxfZnJlZV9oZWFkZXIoY2hhbm5lbCk7CiAJcG9jaF9jaGFubmVsX2ZyZWVfZ3JvdXBzKGNoYW5uZWwpOwogCWtmcmVlKGNoYW5uZWwtPmdyb3Vwcyk7CiAJYXRvbWljX2luYygmY2hhbm5lbC0+ZnJlZSk7CkBAIC04NzAsNyArODE5LDcgQEAKIH0KIAogLyoKLSAqIE1hcCB0aGUgaGVhZGVyIGFuZCB0aGUgZ3JvdXAgYnVmZmVycywgdG8gdXNlciBzcGFjZS4KKyAqIE1hcCB0aGUgdGhlIGdyb3VwIGJ1ZmZlcnMsIHRvIHVzZXIgc3BhY2UuCiAgKi8KIHN0YXRpYyBpbnQgcG9jaF9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKQEAgLTg4MCw3ICs4MjksNiBAQAogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIAogCXVuc2lnbmVkIGxvbmcgZ3JvdXBfcGFnZXM7Ci0JdW5zaWduZWQgbG9uZyBoZWFkZXJfcGFnZXM7CiAJdW5zaWduZWQgbG9uZyB0b3RhbF9ncm91cF9wYWdlczsKIAogCWludCBwZ19udW07CkBAIC04OTcsMzAgKzg0NSwxNiBAQAogCX0KIAogCWdyb3VwX3BhZ2VzID0gbnBhZ2VzKGNoYW5uZWwtPmdyb3VwX3NpemUpOwotCWhlYWRlcl9wYWdlcyA9IG5wYWdlcyhjaGFubmVsLT5oZWFkZXJfc2l6ZSk7CiAJdG90YWxfZ3JvdXBfcGFnZXMgPSBncm91cF9wYWdlcyAqIGNoYW5uZWwtPmdyb3VwX2NvdW50OwogCiAJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKLQlpZiAoc2l6ZSAhPSAoaGVhZGVyX3BhZ2VzICsgdG90YWxfZ3JvdXBfcGFnZXMpICogUEFHRV9TSVpFKSB7CisJaWYgKHNpemUgIT0gdG90YWxfZ3JvdXBfcGFnZXMgKiBQQUdFX1NJWkUpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggInJlcXVpcmVkICVsdSBieXRlc1xuIiwgc2l6ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXN0YXJ0ID0gdm1hLT52bV9zdGFydDsKIAotCS8qIEZJWE1FOiBDbGVhbnVwIHJlcXVpcmVkIG9uIGZhaWx1cmU/ICovCi0JcGcgPSBjaGFubmVsLT5oZWFkZXJfcGc7Ci0JZm9yIChwZ19udW0gPSAwOyBwZ19udW0gPCBoZWFkZXJfcGFnZXM7IHBnX251bSsrLCBwZysrKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHIFBGWCAicGFnZV9jb3VudDogJWRcbiIsIHBhZ2VfY291bnQocGcpKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICIlZDogaGVhZGVyOiAweCVseFxuIiwgcGdfbnVtLCBzdGFydCk7Ci0JCXJldCA9IHZtX2luc2VydF9wYWdlKHZtYSwgc3RhcnQsIHBnKTsKLQkJaWYgKHJldCkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgInZtX2luc2VydCAxIGZhaWxlZCBhdCAlbHhcbiIsIHN0YXJ0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJc3RhcnQgKz0gUEFHRV9TSVpFOwotCX0KLQogCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsLT5ncm91cF9jb3VudDsgaSsrKSB7CiAJCXBnID0gY2hhbm5lbC0+Z3JvdXBzW2ldLnBnOwogCQlmb3IgKHBnX251bSA9IDA7IHBnX251bSA8IGdyb3VwX3BhZ2VzOyBwZ19udW0rKywgcGcrKykgewpAQCAtOTQ3LDIwICs4ODEsMTYgQEAKICAqLwogc3RhdGljIGludCBwb2NoX2NoYW5uZWxfYXZhaWxhYmxlKHN0cnVjdCBjaGFubmVsX2luZm8gKmNoYW5uZWwpCiB7Ci0JaW50IGk7CisJaW50IGF2YWlsYWJsZSA9IDA7CiAKIAlzcGluX2xvY2tfaXJxKCZjaGFubmVsLT5ncm91cF9vZmZzZXRzX2xvY2spOwogCi0JZm9yIChpID0gMDsgaSA8IGNoYW5uZWwtPmdyb3VwX2NvdW50OyBpKyspIHsKLQkJaWYgKGNoYW5uZWwtPmhlYWRlci0+Z3JvdXBfb2Zmc2V0c1tpXSAhPSAtMSkgewotCQkJc3Bpbl91bmxvY2tfaXJxKCZjaGFubmVsLT5ncm91cF9vZmZzZXRzX2xvY2spOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9CisJaWYgKGNoYW5uZWwtPmNvbnN1bWVkICE9IGNoYW5uZWwtPnRyYW5zZmVyKQorCQlhdmFpbGFibGUgPSAxOwogCiAJc3Bpbl91bmxvY2tfaXJxKCZjaGFubmVsLT5ncm91cF9vZmZzZXRzX2xvY2spOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGF2YWlsYWJsZTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBwb2NoX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsIHBvbGxfdGFibGUgKnB0KQpAQCAtMTAyNiw2ICs5NTYsNTEgQEAKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOworCWNhc2UgUE9DSF9JT0NfQ09OU1VNRToKKwl7CisJCWludCBhdmFpbGFibGU7CisJCWludCBuZmV0Y2g7CisJCXVuc2lnbmVkIGludCBmcm9tOworCQl1bnNpZ25lZCBpbnQgY291bnQ7CisJCXVuc2lnbmVkIGludCBpLCBqOworCQlzdHJ1Y3QgcG9jaF9jb25zdW1lIGNvbnN1bWU7CisJCXN0cnVjdCBwb2NoX2NvbnN1bWUgKnVjb25zdW1lOworCisJCXVjb25zdW1lID0gYXJncDsKKwkJcmV0ID0gY29weV9mcm9tX3VzZXIoJmNvbnN1bWUsIHVjb25zdW1lLCBzaXplb2YoY29uc3VtZSkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlzcGluX2xvY2tfaXJxKCZjaGFubmVsLT5ncm91cF9vZmZzZXRzX2xvY2spOworCisJCWNoYW5uZWwtPmNvbnN1bWVkICs9IGNvbnN1bWUubmZsdXNoOworCQljaGFubmVsLT5jb25zdW1lZCAlPSBjaGFubmVsLT5ncm91cF9jb3VudDsKKworCQlhdmFpbGFibGUgPSBjaGFubmVsLT50cmFuc2ZlciAtIGNoYW5uZWwtPmNvbnN1bWVkOworCQlpZiAoYXZhaWxhYmxlIDwgMCkKKwkJCWF2YWlsYWJsZSArPSBjaGFubmVsLT5ncm91cF9jb3VudDsKKworCQlmcm9tID0gY2hhbm5lbC0+Y29uc3VtZWQ7CisKKwkJc3Bpbl91bmxvY2tfaXJxKCZjaGFubmVsLT5ncm91cF9vZmZzZXRzX2xvY2spOworCisJCW5mZXRjaCA9IGNvbnN1bWUubmZldGNoOworCQljb3VudCA9IG1pbihhdmFpbGFibGUsIG5mZXRjaCk7CisKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCWogPSAoZnJvbSArIGkpICUgY2hhbm5lbC0+Z3JvdXBfY291bnQ7CisJCQlyZXQgPSBwdXRfdXNlcihjaGFubmVsLT5ncm91cHNbal0udXNlcl9vZmZzZXQsCisJCQkJICAgICAgICZjb25zdW1lLm9mZnNldHNbaV0pOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXJldCA9IHB1dF91c2VyKGNvdW50LCAmdWNvbnN1bWUtPm5mZXRjaCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlicmVhazsKKwl9CiAJY2FzZSBQT0NIX0lPQ19HRVRfQ09VTlRFUlM6CiAJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYXJncCwgc2l6ZW9mKHN0cnVjdCBwb2NoX2NvdW50ZXJzKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTEwNzMsNyArMTA0OCw2IEBACiAJbG9uZyBncm91cHNfZG9uZTsKIAl1bnNpZ25lZCBsb25nIGksIGo7CiAJc3RydWN0IHBvY2hfZ3JvdXBfaW5mbyAqZ3JvdXBzOwotCXMzMiAqZ3JvdXBfb2Zmc2V0czsKIAl1MzIgY3Vycl9ncm91cF9yZWc7CiAKIAlpZiAoIWF0b21pY19yZWFkKCZjaGFubmVsLT5pbml0ZWQpKQpAQCAtMTA5MywyMCArMTA2NywyNCBAQAogCWlmIChncm91cHNfZG9uZSA8PSAwKQogCQlncm91cHNfZG9uZSArPSBjaGFubmVsLT5ncm91cF9jb3VudDsKIAotCWdyb3VwX29mZnNldHMgPSBjaGFubmVsLT5oZWFkZXItPmdyb3VwX29mZnNldHM7CiAJZ3JvdXBzID0gY2hhbm5lbC0+Z3JvdXBzOwogCiAJc3Bpbl9sb2NrKCZjaGFubmVsLT5ncm91cF9vZmZzZXRzX2xvY2spOwogCiAJZm9yIChpID0gMDsgaSA8IGdyb3Vwc19kb25lOyBpKyspIHsKIAkJaiA9IChwcmV2X3RyYW5zZmVyICsgaSkgJSBjaGFubmVsLT5ncm91cF9jb3VudDsKLQkJZ3JvdXBfb2Zmc2V0c1tqXSA9IGdyb3Vwc1tqXS51c2VyX29mZnNldDsKKworCQljaGFubmVsLT50cmFuc2ZlciArPSAxOworCQljaGFubmVsLT50cmFuc2ZlciAlPSBjaGFubmVsLT5ncm91cF9jb3VudDsKKworCQlpZiAoY2hhbm5lbC0+dHJhbnNmZXIgPT0gY2hhbm5lbC0+Y29uc3VtZWQpIHsKKwkJCWNoYW5uZWwtPmNvbnN1bWVkICs9IDE7CisJCQljaGFubmVsLT5jb25zdW1lZCAlPSBjaGFubmVsLT5ncm91cF9jb3VudDsKKwkJfQogCX0KIAogCXNwaW5fdW5sb2NrKCZjaGFubmVsLT5ncm91cF9vZmZzZXRzX2xvY2spOwogCi0JY2hhbm5lbC0+dHJhbnNmZXIgPSBjdXJyX3RyYW5zZmVyOwotCiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaGFubmVsLT53cSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9wb2NoL3BvY2guaCBiL2RyaXZlcnMvc3RhZ2luZy9wb2NoL3BvY2guaAppbmRleCA1MWEyZDE0Li44YjA4Mzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcG9jaC9wb2NoLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3BvY2gvcG9jaC5oCkBAIC03LDExICs3LDggQEAKICAqIGluY2x1ZGUvbGludXggZm9yIGZpbmFsIHZlcnNpb24uCiAgKgogICovCi1zdHJ1Y3QgcG9jaF9jYnVmX2hlYWRlciB7Ci0JX19zMzIgZ3JvdXBfc2l6ZV9ieXRlczsKLQlfX3MzMiBncm91cF9jb3VudDsKLQlfX3MzMiBncm91cF9vZmZzZXRzWzBdOwotfTsKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIHN0cnVjdCBwb2NoX2NvdW50ZXJzIHsKIAlfX3UzMiBmaWZvX2VtcHR5OwpAQCAtMTksNiArMTYsMTIgQEAKIAlfX3UzMiBwbGxfdW5sb2NrOwogfTsKIAorc3RydWN0IHBvY2hfY29uc3VtZSB7CisJX191MzIgX191c2VyICpvZmZzZXRzOworCV9fdTMyIG5mZXRjaDsKKwlfX3UzMiBuZmx1c2g7Cit9OworCiAjZGVmaW5lIFBPQ0hfSU9DX05VTQkJCSc5JwogCiAjZGVmaW5lIFBPQ0hfSU9DX1RSQU5TRkVSX1NUQVJUCQlfSU8oUE9DSF9JT0NfTlVNLCAwKQpAQCAtMjcsMyArMzAsNiBAQAogCQkJCQkgICAgIHN0cnVjdCBwb2NoX2NvdW50ZXJzKQogI2RlZmluZSBQT0NIX0lPQ19TWU5DX0dST1VQX0ZPUl9VU0VSCV9JTyhQT0NIX0lPQ19OVU0sIDMpCiAjZGVmaW5lIFBPQ0hfSU9DX1NZTkNfR1JPVVBfRk9SX0RFVklDRQlfSU8oUE9DSF9JT0NfTlVNLCA0KQorCisjZGVmaW5lIFBPQ0hfSU9DX0NPTlNVTUUJCV9JT1dSKFBPQ0hfSU9DX05VTSwgNSwgXAorCQkJCQkgICAgICBzdHJ1Y3QgcG9jaF9jb25zdW1lKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3F1YXRlY2hfdXNiMi9xdWF0ZWNoX3VzYjIuYyBiL2RyaXZlcnMvc3RhZ2luZy9xdWF0ZWNoX3VzYjIvcXVhdGVjaF91c2IyLmMKaW5kZXggMmFjZWY5NC4uZjc3MjZmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3F1YXRlY2hfdXNiMi9xdWF0ZWNoX3VzYjIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcXVhdGVjaF91c2IyL3F1YXRlY2hfdXNiMi5jCkBAIC0xNjcwLDcgKzE2NzAsNyBAQAogCQlkYmcoIiVzKCk6IGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwKIAkJCV9fZnVuY19fLCByZXN1bHQpOwogCX0gZWxzZSB7Ci0JCWRiZygiJXMoKSBzdWNlc3NmdWxseSByZXN1bWl0dGVkIHJlYWQgdXJiIiwgX19mdW5jX18pOworCQlkYmcoIiVzKCkgc3VjY2Vzc2Z1bGx5IHJlc3VibWl0dGVkIHJlYWQgdXJiIiwgX19mdW5jX18pOwogCQlpZiAodHR5X3N0ICYmIFJ4Q291bnQpIHsKIAkJCS8qIGlmIHNvbWUgaW5ib3VuZCBkYXRhIHdhcyBwcm9jZXNzZWQsIHRoZW4KIAkJCSAqIHdlIG5lZWQgdG8gcHVzaCB0aGF0IHRocm91Z2ggdGhlIHR0eSBsYXllcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGUyNTY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL0tjb25maWcKQEAgLTAsMCArMSwyMSBAQAorY29uZmlnIFJBTVpTV0FQCisJdHJpc3RhdGUgIkNvbXByZXNzZWQgaW4tbWVtb3J5IHN3YXAgZGV2aWNlIChyYW16c3dhcCkiCisJZGVwZW5kcyBvbiBTV0FQCisJc2VsZWN0IExaT19DT01QUkVTUworCXNlbGVjdCBMWk9fREVDT01QUkVTUworCWRlZmF1bHQgbgorCWhlbHAKKwkgIENyZWF0ZXMgdmlydHVhbCBibG9jayBkZXZpY2VzIHdoaWNoIGNhbiBiZSB1c2VkIChvbmx5KSBhcyBhIHN3YXAKKwkgIGRpc2tzLiBQYWdlcyBzd2FwcGVkIHRvIHRoZXNlIGRpc2tzIGFyZSBjb21wcmVzc2VkIGFuZCBzdG9yZWQgaW4KKwkgIG1lbW9yeSBpdHNlbGYuCisKKwkgIFNlZSByYW16c3dhcC50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisJICBQcm9qZWN0IGhvbWU6IGh0dHA6Ly9jb21wY2FjaGUuZ29vZ2xlY29kZS5jb20vCisKK2NvbmZpZyBSQU1aU1dBUF9TVEFUUworCWJvb2wgIkVuYWJsZSByYW16c3dhcCBzdGF0cyIKKwlkZXBlbmRzIG9uIFJBTVpTV0FQCisJZGVmYXVsdCB5CisJaGVscAorCSAgRW5hYmxlIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBmb3IgcmFtenN3YXAuIFRoaXMgYWRkcyBvbmx5IGEgbWluaW1hbAorCSAgb3ZlcmhlYWQuIEluIHVuc3VyZSwgc2F5IFkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA3ZDdkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9NYWtlZmlsZQpAQCAtMCwwICsxLDMgQEAKK3JhbXpzd2FwLW9ianMJOj0JcmFtenN3YXBfZHJ2Lm8geHZtYWxsb2MubworCitvYmotJChDT05GSUdfUkFNWlNXQVApCSs9CXJhbXpzd2FwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjNDBkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9UT0RPCkBAIC0wLDAgKzEsNiBAQAorVE9ETzoKKwktIEFkZCBzdXBwb3J0IGZvciBzd2FwIG5vdGlmaWVycworCS0gUmVtb3ZlIENPTkZJR19BUk0gaGFjaworCitQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZAorTml0aW4gR3VwdGEgPG5ndXB0YUB2ZmxhcmUub3JnPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3JhbXpzd2FwLnR4dCBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9yYW16c3dhcC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlmMTYxOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9yYW16c3dhcC50eHQKQEAgLTAsMCArMSw1MSBAQAorcmFtenN3YXA6IENvbXByZXNzZWQgUkFNIGJhc2VkIHN3YXAgZGV2aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1Byb2plY3QgaG9tZTogaHR0cDovL2NvbXBjYWNoZS5nb29nbGVjb2RlLmNvbS8KKworKiBJbnRyb2R1Y3Rpb24KKworSXQgY3JlYXRlcyBSQU0gYmFzZWQgYmxvY2sgZGV2aWNlcyB3aGljaCBjYW4gYmUgdXNlZCAob25seSkgYXMgc3dhcCBkaXNrcy4KK1BhZ2VzIHN3YXBwZWQgdG8gdGhlc2UgZGV2aWNlcyBhcmUgY29tcHJlc3NlZCBhbmQgc3RvcmVkIGluIG1lbW9yeSBpdHNlbGYuCitTZWUgcHJvamVjdCBob21lIGZvciB1c2UgY2FzZXMsIHBlcmZvcm1hbmNlIG51bWJlcnMgYW5kIGEgbG90IG1vcmUuCisKK0luZGl2aWR1YWwgcmFtenN3YXAgZGV2aWNlcyBhcmUgY29uZmlndXJlZCBhbmQgaW5pdGlhbGl6ZWQgdXNpbmcgcnpzY29udHJvbAordXNlcnNwYWNlIHV0aWxpdHkgYXMgc2hvd24gaW4gZXhhbXBsZXMgYmVsb3cuIFNlZSByenNjb250cm9sIG1hbiBwYWdlIGZvciBtb3JlCitkZXRhaWxzLgorCisqIFVzYWdlCisKK0ZvbGxvd2luZyBzaG93cyBhIHR5cGljYWwgc2VxdWVuY2Ugb2Ygc3RlcHMgZm9yIHVzaW5nIHJhbXpzd2FwLgorCisxKSBMb2FkIE1vZHVsZXM6CisJbW9kcHJvYmUgcmFtenN3YXAgbnVtX2RldmljZXM9NAorCVRoaXMgY3JlYXRlcyA0ICh1bmluaXRpYWxpemVkKSBkZXZpY2VzOiAvZGV2L3JhbXpzd2FwezAsMSwyLDN9CisJKG51bV9kZXZpY2VzIHBhcmFtZXRlciBpcyBvcHRpb25hbC4gRGVmYXVsdDogMSkKKworMikgSW5pdGlhbGl6ZToKKwlVc2UgcnpzY29udHJvbCB1dGlsaXR5IHRvIGNvbmZpZ3VyZSBhbmQgaW5pdGlhbGl6ZSBpbmRpdmlkdWFsCisJcmFtenN3YXAgZGV2aWNlcy4gRXhhbXBsZToKKwlyenNjb250cm9sIC9kZXYvcmFtenN3YXAyIC0taW5pdCAjIHVzZXMgZGVmYXVsdCB2YWx1ZSBvZiBkaXNrc2l6ZV9rYgorCisJKlNlZSByenNjb250cm9sIG1hbiBwYWdlIGZvciBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGVzKgorCiszKSBBY3RpdmF0ZToKKwlzd2Fwb24gL2Rldi9yYW16c3dhcDIgIyBvciBhbnkgb3RoZXIgaW5pdGlhbGl6ZWQgcmFtenN3YXAgZGV2aWNlCisKKzQpIFN0YXRzOgorCXJ6c2NvbnRyb2wgL2Rldi9yYW16c3dhcDIgLS1zdGF0cworCis1KSBEZWFjdGl2YXRlOgorCXN3YXBvZmYgL2Rldi9yYW16c3dhcDIKKworNikgUmVzZXQ6CisJcnpzY29udHJvbCAvZGV2L3JhbXpzd2FwMiAtLXJlc2V0CisJKFRoaXMgZnJlZXMgYWxsIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGlzIGRldmljZSkuCisKKworUGxlYXNlIHJlcG9ydCBhbnkgcHJvYmxlbXMgYXQ6CisgLSBNYWlsaW5nIGxpc3Q6IGxpbnV4LW1tLWNjIGF0IGxhcHRvcCBkb3Qgb3JnCisgLSBJc3N1ZSB0cmFja2VyOiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvY29tcGNhY2hlL2lzc3Vlcy9saXN0CisKK05pdGluIEd1cHRhCituZ3VwdGFAdmZsYXJlLm9yZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3JhbXpzd2FwX2Rydi5jIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3JhbXpzd2FwX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MzlmMDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXBfZHJ2LmMKQEAgLTAsMCArMSwxNDM1IEBACisvKgorICogQ29tcHJlc3NlZCBSQU0gYmFzZWQgc3dhcCBkZXZpY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgIE5pdGluIEd1cHRhCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVzaW5nIGEgZHVhbCBsaWNlbnNlIHN0cmF0ZWd5OiBCU0QvR1BMCisgKiBZb3UgY2FuIGNob29zZSB0aGUgbGljZW5jZSB0aGF0IGJldHRlciBmaXRzIHlvdXIgcmVxdWlyZW1lbnRzLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiAzLWNsYXVzZSBCU0QgTGljZW5zZQorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wCisgKgorICogUHJvamVjdCBob21lOiBodHRwOi8vY29tcGNhY2hlLmdvb2dsZWNvZGUuY29tCisgKi8KKworI2RlZmluZSBLTVNHX0NPTVBPTkVOVCAicmFtenN3YXAiCisjZGVmaW5lIHByX2ZtdChmbXQpIEtNU0dfQ09NUE9ORU5UICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2x6by5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXBvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSAicmFtenN3YXBfZHJ2LmgiCisKKy8qIEdsb2JhbHMgKi8KK3N0YXRpYyBpbnQgcmFtenN3YXBfbWFqb3I7CitzdGF0aWMgc3RydWN0IHJhbXpzd2FwICpkZXZpY2VzOworCisvKgorICogUGFnZXMgdGhhdCBjb21wcmVzcyB0byBsYXJnZXIgdGhhbiB0aGlzIHNpemUgYXJlCisgKiBmb3J3YXJkZWQgdG8gYmFja2luZyBzd2FwLCBpZiBwcmVzZW50IG9yIHN0b3JlZAorICogdW5jb21wcmVzc2VkIGluIG1lbW9yeSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X3pwYWdlX3NpemU7CisKKy8qIE1vZHVsZSBwYXJhbXMgKGRvY3VtZW50YXRpb24gYXQgZW5kKSAqLworc3RhdGljIHVuc2lnbmVkIGludCBudW1fZGV2aWNlczsKKworc3RhdGljIGludCByenNfdGVzdF9mbGFnKHN0cnVjdCByYW16c3dhcCAqcnpzLCB1MzIgaW5kZXgsCisJCQllbnVtIHJ6c19wYWdlZmxhZ3MgZmxhZykKK3sKKwlyZXR1cm4gcnpzLT50YWJsZVtpbmRleF0uZmxhZ3MgJiBCSVQoZmxhZyk7Cit9CisKK3N0YXRpYyB2b2lkIHJ6c19zZXRfZmxhZyhzdHJ1Y3QgcmFtenN3YXAgKnJ6cywgdTMyIGluZGV4LAorCQkJZW51bSByenNfcGFnZWZsYWdzIGZsYWcpCit7CisJcnpzLT50YWJsZVtpbmRleF0uZmxhZ3MgfD0gQklUKGZsYWcpOworfQorCitzdGF0aWMgdm9pZCByenNfY2xlYXJfZmxhZyhzdHJ1Y3QgcmFtenN3YXAgKnJ6cywgdTMyIGluZGV4LAorCQkJZW51bSByenNfcGFnZWZsYWdzIGZsYWcpCit7CisJcnpzLT50YWJsZVtpbmRleF0uZmxhZ3MgJj0gfkJJVChmbGFnKTsKK30KKworc3RhdGljIGludCBwYWdlX3plcm9fZmlsbGVkKHZvaWQgKnB0cikKK3sKKwl1bnNpZ25lZCBpbnQgcG9zOworCXVuc2lnbmVkIGxvbmcgKnBhZ2U7CisKKwlwYWdlID0gKHVuc2lnbmVkIGxvbmcgKilwdHI7CisKKwlmb3IgKHBvcyA9IDA7IHBvcyAhPSBQQUdFX1NJWkUgLyBzaXplb2YoKnBhZ2UpOyBwb3MrKykgeworCQlpZiAocGFnZVtwb3NdKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBtZW1saW1pdCBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIGJhY2tpbmcgZGlzayBzaXplLgorICovCitzdGF0aWMgdm9pZCByYW16c3dhcF9zZXRfbWVtbGltaXQoc3RydWN0IHJhbXpzd2FwICpyenMsIHNpemVfdCB0b3RhbHJhbV9ieXRlcykKK3sKKwlpbnQgbWVtbGltaXRfdmFsaWQgPSAxOworCisJaWYgKCFyenMtPm1lbWxpbWl0KSB7CisJCXByX2luZm8oIk1lbW9yeSBsaW1pdCBub3Qgc2V0LlxuIik7CisJCW1lbWxpbWl0X3ZhbGlkID0gMDsKKwl9CisKKwlpZiAocnpzLT5tZW1saW1pdCA+IHJ6cy0+ZGlza3NpemUpIHsKKwkJcHJfaW5mbygiTWVtb3J5IGxpbWl0IGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gIgorCQkJImRpc2tzaXplOiBsaW1pdD0lenUsIGRpc2tzaXplPSV6dVxuIiwKKwkJCXJ6cy0+bWVtbGltaXQsIHJ6cy0+ZGlza3NpemUpOworCQltZW1saW1pdF92YWxpZCA9IDA7CisJfQorCisJaWYgKCFtZW1saW1pdF92YWxpZCkgeworCQlzaXplX3QgbWVtcGFydCwgZGlza3NpemU7CisJCXByX2luZm8oIlVzaW5nIGRlZmF1bHQ6IHNtYWxsZXIgb2YgKCV1JSUgb2YgUkFNKSBhbmQgIgorCQkJIihiYWNraW5nIGRpc2sgc2l6ZSkuXG4iLAorCQkJZGVmYXVsdF9tZW1saW1pdF9wZXJjX3JhbSk7CisJCW1lbXBhcnQgPSBkZWZhdWx0X21lbWxpbWl0X3BlcmNfcmFtICogKHRvdGFscmFtX2J5dGVzIC8gMTAwKTsKKwkJZGlza3NpemUgPSByenMtPmRpc2tzaXplOworCQlyenMtPm1lbWxpbWl0ID0gbWVtcGFydCA+IGRpc2tzaXplID8gZGlza3NpemUgOiBtZW1wYXJ0OworCX0KKworCWlmIChyenMtPm1lbWxpbWl0ID4gdG90YWxyYW1fYnl0ZXMgLyAyKSB7CisJCXByX2luZm8oCisJCSJJdHMgbm90IGFkdmlzYWJsZSBzZXR0aW5nIGxpbWl0IG1vcmUgdGhhbiBoYWxmIG9mICIKKwkJInNpemUgb2YgbWVtb3J5IHNpbmNlIHdlIGV4cGVjdCBhIDI6MSBjb21wcmVzc2lvbiByYXRpby4gIgorCQkiTGltaXQgcmVwcmVzZW50cyBhbW91bnQgb2YgKmNvbXByZXNzZWQqIGRhdGEgd2UgY2FuIGtlZXAgIgorCQkiaW4gbWVtb3J5IVxuIgorCQkiXHRNZW1vcnkgU2l6ZTogJXp1IGtCXG4iCisJCSJcdExpbWl0IHlvdSBzZWxlY3RlZDogJXp1IGtCXG4iCisJCSJDb250aW51aW5nIGFueXdheSAuLi5cbiIsCisJCXRvdGFscmFtX2J5dGVzID4+IDEwLCByenMtPm1lbWxpbWl0ID4+IDEwCisJCSk7CisJfQorCisJcnpzLT5tZW1saW1pdCAmPSBQQUdFX01BU0s7CisJQlVHX09OKCFyenMtPm1lbWxpbWl0KTsKK30KKworc3RhdGljIHZvaWQgcmFtenN3YXBfc2V0X2Rpc2tzaXplKHN0cnVjdCByYW16c3dhcCAqcnpzLCBzaXplX3QgdG90YWxyYW1fYnl0ZXMpCit7CisJaWYgKCFyenMtPmRpc2tzaXplKSB7CisJCXByX2luZm8oCisJCSJkaXNrIHNpemUgbm90IHByb3ZpZGVkLiBZb3UgY2FuIHVzZSBkaXNrc2l6ZV9rYiBtb2R1bGUgIgorCQkicGFyYW0gdG8gc3BlY2lmeSBzaXplLlxuVXNpbmcgZGVmYXVsdDogKCV1JSUgb2YgUkFNKS5cbiIsCisJCWRlZmF1bHRfZGlza3NpemVfcGVyY19yYW0KKwkJKTsKKwkJcnpzLT5kaXNrc2l6ZSA9IGRlZmF1bHRfZGlza3NpemVfcGVyY19yYW0gKgorCQkJCQkodG90YWxyYW1fYnl0ZXMgLyAxMDApOworCX0KKworCWlmIChyenMtPmRpc2tzaXplID4gMiAqICh0b3RhbHJhbV9ieXRlcykpIHsKKwkJcHJfaW5mbygKKwkJIlRoZXJlIGlzIGxpdHRsZSBwb2ludCBjcmVhdGluZyBhIHJhbXpzd2FwIG9mIGdyZWF0ZXIgdGhhbiAiCisJCSJ0d2ljZSB0aGUgc2l6ZSBvZiBtZW1vcnkgc2luY2Ugd2UgZXhwZWN0IGEgMjoxIGNvbXByZXNzaW9uICIKKwkJInJhdGlvLiBOb3RlIHRoYXQgcmFtenN3YXAgdXNlcyBhYm91dCAwLjElJSBvZiB0aGUgc2l6ZSBvZiAiCisJCSJ0aGUgc3dhcCBkZXZpY2Ugd2hlbiBub3QgaW4gdXNlIHNvIGEgaHVnZSByYW16c3dhcCBpcyAiCisJCSJ3YXN0ZWZ1bC5cbiIKKwkJIlx0TWVtb3J5IFNpemU6ICV6dSBrQlxuIgorCQkiXHRTaXplIHlvdSBzZWxlY3RlZDogJXp1IGtCXG4iCisJCSJDb250aW51aW5nIGFueXdheSAuLi5cbiIsCisJCXRvdGFscmFtX2J5dGVzID4+IDEwLCByenMtPmRpc2tzaXplCisJCSk7CisJfQorCisJcnpzLT5kaXNrc2l6ZSAmPSBQQUdFX01BU0s7Cit9CisKKy8qCisgKiBTd2FwIGhlYWRlciAoMXN0IHBhZ2Ugb2Ygc3dhcCBkZXZpY2UpIGNvbnRhaW5zIGluZm9ybWF0aW9uCisgKiB0byBpbmRlbnRpZnkgaXQgYXMgYSBzd2FwIHBhcnRpdGlvbi4gUHJlcGFyZSBzdWNoIGEgaGVhZGVyCisgKiBmb3IgcmFtenN3YXAgZGV2aWNlIChyYW16c3dhcDApIHNvIHRoYXQgc3dhcG9uIGNhbiBpZGVudGlmeQorICogaXQgYXMgc3dhcCBwYXJ0aXRpb24uIEluIGNhc2UgYmFja2luZyBzd2FwIGRldmljZSBpcyBwcm92aWRlZCwKKyAqIGNvcHkgaXRzIHN3YXAgaGVhZGVyLgorICovCitzdGF0aWMgaW50IHNldHVwX3N3YXBfaGVhZGVyKHN0cnVjdCByYW16c3dhcCAqcnpzLCB1bmlvbiBzd2FwX2hlYWRlciAqcykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwl1bmlvbiBzd2FwX2hlYWRlciAqYmFja2luZ19zd2FwX2hlYWRlcjsKKworCS8qCisJICogVGhlcmUgaXMgbm8gYmFja2luZyBzd2FwIGRldmljZS4gQ3JlYXRlIGEgc3dhcCBoZWFkZXIKKwkgKiB0aGF0IGlzIGFjY2VwdGFibGUgYnkgc3dhcG9uLgorCSAqLworCWlmICghcnpzLT5iYWNraW5nX3N3YXApIHsKKwkJcy0+aW5mby52ZXJzaW9uID0gMTsKKwkJcy0+aW5mby5sYXN0X3BhZ2UgPSAocnpzLT5kaXNrc2l6ZSA+PiBQQUdFX1NISUZUKSAtIDE7CisJCXMtPmluZm8ubnJfYmFkcGFnZXMgPSAwOworCQltZW1jcHkocy0+bWFnaWMubWFnaWMsICJTV0FQU1BBQ0UyIiwgMTApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFdlIGhhdmUgYSBiYWNraW5nIHN3YXAgZGV2aWNlLiBDb3B5IGl0cyBzd2FwIGhlYWRlcgorCSAqIHRvIHJhbXpzd2FwIGRldmljZSBoZWFkZXIuIElmIHRoaXMgaGVhZGVyIGNvbnRhaW5zCisJICogaW52YWxpZCBpbmZvcm1hdGlvbiAoYmFja2luZyBkZXZpY2Ugbm90IGEgc3dhcAorCSAqIHBhcnRpdGlvbiwgZXRjLiksIHN3YXBvbiB3aWxsIGZhaWwgZm9yIHJhbXpzd2FwCisJICogd2hpY2ggaXMgY29ycmVjdCBiZWhhdmlvciAtIHdlIGRvbid0IHdhbnQgdG8gc3dhcAorCSAqIG92ZXIgZmlsZXN5c3RlbSBwYXJ0aXRpb24hCisJICovCisKKwkvKiBSZWFkIHRoZSBiYWNraW5nIHN3YXAgaGVhZGVyIChjb2RlIGZyb20gc3lzX3N3YXBvbikgKi8KKwltYXBwaW5nID0gcnpzLT5zd2FwX2ZpbGUtPmZfbWFwcGluZzsKKwlpZiAoIW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgMCwgcnpzLT5zd2FwX2ZpbGUpOworCWlmIChJU19FUlIocGFnZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihwYWdlKTsKKwkJZ290byBvdXQ7CisJfQorCisJYmFja2luZ19zd2FwX2hlYWRlciA9IGttYXAocGFnZSk7CisJbWVtY3B5KHMsIGJhY2tpbmdfc3dhcF9oZWFkZXIsIHNpemVvZigqcykpOworCWlmIChzLT5pbmZvLm5yX2JhZHBhZ2VzKSB7CisJCXByX2luZm8oIkNhbm5vdCB1c2UgYmFja2luZyBzd2FwIHdpdGggYmFkIHBhZ2VzICgldSlcbiIsCisJCQlzLT5pbmZvLm5yX2JhZHBhZ2VzKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJLyoKKwkgKiByYW16c3dhcCBkaXNrc2l6ZSBlcXVhbHMgbnVtYmVyIG9mIHVzYWJsZSBwYWdlcyBpbiBiYWNraW5nCisJICogc3dhcC4gU2V0IGxhc3RfcGFnZSBpbiBzd2FwIGhlYWRlciB0byBtYXRjaCB0aGlzIGRpc2tzaXplCisJICogKCdsYXN0X3BhZ2UnIG1lYW5zIDAtYmFzZWQgaW5kZXggb2YgbGFzdCB1c2FibGUgc3dhcCBwYWdlKS4KKwkgKi8KKwlzLT5pbmZvLmxhc3RfcGFnZSA9IChyenMtPmRpc2tzaXplID4+IFBBR0VfU0hJRlQpIC0gMTsKKwlrdW5tYXAocGFnZSk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCByYW16c3dhcF9mbHVzaF9kY2FjaGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKyNpZmRlZiBDT05GSUdfQVJNCisJaW50IGZsYWcgPSAwOworCS8qCisJICogVWdseSBoYWNrIHRvIGdldCBmbHVzaF9kY2FjaGVfcGFnZSgpIHdvcmsgb24gQVJNLgorCSAqIHBhZ2VfbWFwcGluZyhwYWdlKSA9PSBOVUxMIGFmdGVyIGNsZWFyaW5nIHRoaXMgc3dhcCBjYWNoZSBmbGFnLgorCSAqIFdpdGhvdXQgY2xlYXJpbmcgdGhpcyBmbGFnLCBmbHVzaF9kY2FjaGVfcGFnZSgpIHdpbGwgc2ltcGx5IHNldAorCSAqICJQR19kY2FjaGVfZGlydHkiIGJpdCBhbmQgcmV0dXJuLgorCSAqLworCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpKSB7CisJCWZsYWcgPSAxOworCQlDbGVhclBhZ2VTd2FwQ2FjaGUocGFnZSk7CisJfQorI2VuZGlmCisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisjaWZkZWYgQ09ORklHX0FSTQorCWlmIChmbGFnKQorCQlTZXRQYWdlU3dhcENhY2hlKHBhZ2UpOworI2VuZGlmCit9CisKK3ZvaWQgcmFtenN3YXBfaW9jdGxfZ2V0X3N0YXRzKHN0cnVjdCByYW16c3dhcCAqcnpzLAorCQkJc3RydWN0IHJhbXpzd2FwX2lvY3RsX3N0YXRzICpzKQoreworCXN0cm5jcHkocy0+YmFja2luZ19zd2FwX25hbWUsIHJ6cy0+YmFja2luZ19zd2FwX25hbWUsCisJCU1BWF9TV0FQX05BTUVfTEVOIC0gMSk7CisJcy0+YmFja2luZ19zd2FwX25hbWVbTUFYX1NXQVBfTkFNRV9MRU4gLSAxXSA9ICdcMCc7CisKKwlzLT5kaXNrc2l6ZSA9IHJ6cy0+ZGlza3NpemU7CisJcy0+bWVtbGltaXQgPSByenMtPm1lbWxpbWl0OworCisjaWYgZGVmaW5lZChDT05GSUdfUkFNWlNXQVBfU1RBVFMpCisJeworCXN0cnVjdCByYW16c3dhcF9zdGF0cyAqcnMgPSAmcnpzLT5zdGF0czsKKwlzaXplX3Qgc3VjY193cml0ZXMsIG1lbV91c2VkOworCXVuc2lnbmVkIGludCBnb29kX2NvbXByZXNzX3BlcmMgPSAwLCBub19jb21wcmVzc19wZXJjID0gMDsKKworCW1lbV91c2VkID0geHZfZ2V0X3RvdGFsX3NpemVfYnl0ZXMocnpzLT5tZW1fcG9vbCkKKwkJCSsgKHJzLT5wYWdlc19leHBhbmQgPDwgUEFHRV9TSElGVCk7CisJc3VjY193cml0ZXMgPSBycy0+bnVtX3dyaXRlcyAtIHJzLT5mYWlsZWRfd3JpdGVzOworCisJaWYgKHN1Y2Nfd3JpdGVzICYmIHJzLT5wYWdlc19zdG9yZWQpIHsKKwkJZ29vZF9jb21wcmVzc19wZXJjID0gcnMtPmdvb2RfY29tcHJlc3MgKiAxMDAKKwkJCQkJLyBycy0+cGFnZXNfc3RvcmVkOworCQlub19jb21wcmVzc19wZXJjID0gcnMtPnBhZ2VzX2V4cGFuZCAqIDEwMAorCQkJCQkvIHJzLT5wYWdlc19zdG9yZWQ7CisJfQorCisJcy0+bnVtX3JlYWRzID0gcnMtPm51bV9yZWFkczsKKwlzLT5udW1fd3JpdGVzID0gcnMtPm51bV93cml0ZXM7CisJcy0+ZmFpbGVkX3JlYWRzID0gcnMtPmZhaWxlZF9yZWFkczsKKwlzLT5mYWlsZWRfd3JpdGVzID0gcnMtPmZhaWxlZF93cml0ZXM7CisJcy0+aW52YWxpZF9pbyA9IHJzLT5pbnZhbGlkX2lvOworCXMtPnBhZ2VzX3plcm8gPSBycy0+cGFnZXNfemVybzsKKworCXMtPmdvb2RfY29tcHJlc3NfcGN0ID0gZ29vZF9jb21wcmVzc19wZXJjOworCXMtPnBhZ2VzX2V4cGFuZF9wY3QgPSBub19jb21wcmVzc19wZXJjOworCisJcy0+cGFnZXNfc3RvcmVkID0gcnMtPnBhZ2VzX3N0b3JlZDsKKwlzLT5wYWdlc191c2VkID0gbWVtX3VzZWQgPj4gUEFHRV9TSElGVDsKKwlzLT5vcmlnX2RhdGFfc2l6ZSA9IHJzLT5wYWdlc19zdG9yZWQgPDwgUEFHRV9TSElGVDsKKwlzLT5jb21wcl9kYXRhX3NpemUgPSBycy0+Y29tcHJfc2l6ZTsKKwlzLT5tZW1fdXNlZF90b3RhbCA9IG1lbV91c2VkOworCisJcy0+YmRldl9udW1fcmVhZHMgPSBycy0+YmRldl9udW1fcmVhZHM7CisJcy0+YmRldl9udW1fd3JpdGVzID0gcnMtPmJkZXZfbnVtX3dyaXRlczsKKwl9CisjZW5kaWYgLyogQ09ORklHX1JBTVpTV0FQX1NUQVRTICovCit9CisKK3N0YXRpYyBpbnQgYWRkX2JhY2tpbmdfc3dhcF9leHRlbnQoc3RydWN0IHJhbXpzd2FwICpyenMsCisJCQkJcGdvZmZfdCBwaHlfcGFnZW51bSwKKwkJCQlwZ29mZl90IG51bV9wYWdlcykKK3sKKwl1bnNpZ25lZCBpbnQgaWR4OworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CisJc3RydWN0IHBhZ2UgKmN1cnJfcGFnZSwgKm5ld19wYWdlOworCXVuc2lnbmVkIGludCBleHRlbnRzX3Blcl9wYWdlID0gUEFHRV9TSVpFIC8KKwkJCQlzaXplb2Yoc3RydWN0IHJhbXpzd2FwX2JhY2tpbmdfZXh0ZW50KTsKKworCWlkeCA9IHJ6cy0+bnVtX2V4dGVudHMgJSBleHRlbnRzX3Blcl9wYWdlOworCWlmICghaWR4KSB7CisJCW5ld19wYWdlID0gYWxsb2NfcGFnZShfX0dGUF9aRVJPKTsKKwkJaWYgKCFuZXdfcGFnZSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWlmIChyenMtPm51bV9leHRlbnRzKSB7CisJCQljdXJyX3BhZ2UgPSB2aXJ0X3RvX3BhZ2UocnpzLT5jdXJyX2V4dGVudCk7CisJCQloZWFkID0gJmN1cnJfcGFnZS0+bHJ1OworCQl9IGVsc2UgeworCQkJaGVhZCA9ICZyenMtPmJhY2tpbmdfc3dhcF9leHRlbnRfbGlzdDsKKwkJfQorCisJCWxpc3RfYWRkKCZuZXdfcGFnZS0+bHJ1LCBoZWFkKTsKKwkJcnpzLT5jdXJyX2V4dGVudCA9IHBhZ2VfYWRkcmVzcyhuZXdfcGFnZSk7CisJfQorCisJcnpzLT5jdXJyX2V4dGVudC0+cGh5X3BhZ2VudW0gPSBwaHlfcGFnZW51bTsKKwlyenMtPmN1cnJfZXh0ZW50LT5udW1fcGFnZXMgPSBudW1fcGFnZXM7CisKKwlwcl9kZWJ1ZygiYWRkX2V4dGVudDogaWR4PSV1LCBwaHlfcGdudW09JWx1LCBudW1fcGdzPSVsdSwgIgorCQkicGdfbGFzdD0lbHUsIGN1cnJfZXh0PSVwXG4iLCBpZHgsIHBoeV9wYWdlbnVtLCBudW1fcGFnZXMsCisJCXBoeV9wYWdlbnVtICsgbnVtX3BhZ2VzIC0gMSwgcnpzLT5jdXJyX2V4dGVudCk7CisKKwlpZiAoaWR4ICE9IGV4dGVudHNfcGVyX3BhZ2UgLSAxKQorCQlyenMtPmN1cnJfZXh0ZW50Kys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXR1cF9iYWNraW5nX3N3YXBfZXh0ZW50cyhzdHJ1Y3QgcmFtenN3YXAgKnJ6cywKKwkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nICpudW1fcGFnZXMpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgYmxrYml0czsKKwl1bnNpZ25lZCBibG9ja3NfcGVyX3BhZ2U7CisJcGdvZmZfdCBjb250aWdfcGFnZXMgPSAwLCB0b3RhbF9wYWdlcyA9IDA7CisJcGdvZmZfdCBwYWdlbnVtID0gMCwgcHJldl9wYWdlbnVtID0gMDsKKwlzZWN0b3JfdCBwcm9iZV9ibG9jayA9IDA7CisJc2VjdG9yX3QgbGFzdF9ibG9jazsKKworCWJsa2JpdHMgPSBpbm9kZS0+aV9ibGtiaXRzOworCWJsb2Nrc19wZXJfcGFnZSA9IFBBR0VfU0laRSA+PiBibGtiaXRzOworCisJbGFzdF9ibG9jayA9IGlfc2l6ZV9yZWFkKGlub2RlKSA+PiBibGtiaXRzOworCXdoaWxlIChwcm9iZV9ibG9jayArIGJsb2Nrc19wZXJfcGFnZSA8PSBsYXN0X2Jsb2NrKSB7CisJCXVuc2lnbmVkIGJsb2NrX2luX3BhZ2U7CisJCXNlY3Rvcl90IGZpcnN0X2Jsb2NrOworCisJCWZpcnN0X2Jsb2NrID0gYm1hcChpbm9kZSwgcHJvYmVfYmxvY2spOworCQlpZiAoZmlyc3RfYmxvY2sgPT0gMCkKKwkJCWdvdG8gYmFkX2JtYXA7CisKKwkJLyogSXQgbXVzdCBiZSBQQUdFX1NJWkUgYWxpZ25lZCBvbi1kaXNrICovCisJCWlmIChmaXJzdF9ibG9jayAmIChibG9ja3NfcGVyX3BhZ2UgLSAxKSkgeworCQkJcHJvYmVfYmxvY2srKzsKKwkJCWdvdG8gcHJvYmVfbmV4dDsKKwkJfQorCisJCS8qIEFsbCBibG9ja3Mgd2l0aGluIHRoaXMgcGFnZSBtdXN0IGJlIGNvbnRpZ3VvdXMgb24gZGlzayAqLworCQlmb3IgKGJsb2NrX2luX3BhZ2UgPSAxOyBibG9ja19pbl9wYWdlIDwgYmxvY2tzX3Blcl9wYWdlOworCQkJCQlibG9ja19pbl9wYWdlKyspIHsKKwkJCXNlY3Rvcl90IGJsb2NrOworCisJCQlibG9jayA9IGJtYXAoaW5vZGUsIHByb2JlX2Jsb2NrICsgYmxvY2tfaW5fcGFnZSk7CisJCQlpZiAoYmxvY2sgPT0gMCkKKwkJCQlnb3RvIGJhZF9ibWFwOworCQkJaWYgKGJsb2NrICE9IGZpcnN0X2Jsb2NrICsgYmxvY2tfaW5fcGFnZSkgeworCQkJCS8qIERpc2NvbnRpZ3VpdHkgKi8KKwkJCQlwcm9iZV9ibG9jaysrOworCQkJCWdvdG8gcHJvYmVfbmV4dDsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFdlIGZvdW5kIGEgUEFHRV9TSVpFIGxlbmd0aCwgUEFHRV9TSVpFIGFsaWduZWQKKwkJICogcnVuIG9mIGJsb2Nrcy4KKwkJICovCisJCXBhZ2VudW0gPSBmaXJzdF9ibG9jayA+PiAoUEFHRV9TSElGVCAtIGJsa2JpdHMpOworCisJCWlmICh0b3RhbF9wYWdlcyAmJiAocGFnZW51bSAhPSBwcmV2X3BhZ2VudW0gKyAxKSkgeworCQkJcmV0ID0gYWRkX2JhY2tpbmdfc3dhcF9leHRlbnQocnpzLCBwcmV2X3BhZ2VudW0gLQorCQkJCQkoY29udGlnX3BhZ2VzIC0gMSksIGNvbnRpZ19wYWdlcyk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCXJ6cy0+bnVtX2V4dGVudHMrKzsKKwkJCWNvbnRpZ19wYWdlcyA9IDA7CisJCX0KKwkJdG90YWxfcGFnZXMrKzsKKwkJY29udGlnX3BhZ2VzKys7CisJCXByZXZfcGFnZW51bSA9IHBhZ2VudW07CisJCXByb2JlX2Jsb2NrICs9IGJsb2Nrc19wZXJfcGFnZTsKKworcHJvYmVfbmV4dDoKKwkJY29udGludWU7CisJfQorCisJaWYgKGNvbnRpZ19wYWdlcykgeworCQlwcl9kZWJ1ZygiYWRkaW5nIGxhc3QgZXh0ZW50OiBwYWdlbnVtPSVsdSwgIgorCQkJImNvbnRpZ19wYWdlcz0lbHVcbiIsIHBhZ2VudW0sIGNvbnRpZ19wYWdlcyk7CisJCXJldCA9IGFkZF9iYWNraW5nX3N3YXBfZXh0ZW50KHJ6cywKKwkJCXByZXZfcGFnZW51bSAtIChjb250aWdfcGFnZXMgLSAxKSwgY29udGlnX3BhZ2VzKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwkJcnpzLT5udW1fZXh0ZW50cysrOworCX0KKwlpZiAoIXJ6cy0+bnVtX2V4dGVudHMpIHsKKwkJcHJfZXJyKCJObyBzd2FwIGV4dGVudHMgZm91bmQhXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXJldCkgeworCQkqbnVtX3BhZ2VzID0gdG90YWxfcGFnZXM7CisJCXByX2luZm8oIkZvdW5kICVsdSBleHRlbnRzIGNvbnRhaW5pbmcgJWx1a1xuIiwKKwkJCXJ6cy0+bnVtX2V4dGVudHMsICpudW1fcGFnZXMgPDwgKFBBR0VfU0hJRlQgLSAxMCkpOworCX0KKwlnb3RvIG91dDsKKworYmFkX2JtYXA6CisJcHJfZXJyKCJCYWNraW5nIHN3YXBmaWxlIGhhcyBob2xlc1xuIik7CisJcmV0ID0gLUVJTlZBTDsKK291dDoKKwl3aGlsZSAocmV0ICYmICFsaXN0X2VtcHR5KCZyenMtPmJhY2tpbmdfc3dhcF9leHRlbnRfbGlzdCkpIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5ID0gcnpzLT5iYWNraW5nX3N3YXBfZXh0ZW50X2xpc3QubmV4dDsKKwkJcGFnZSA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBwYWdlLCBscnUpOworCQlsaXN0X2RlbChlbnRyeSk7CisJCV9fZnJlZV9wYWdlKHBhZ2UpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtYXBfYmFja2luZ19zd2FwX2V4dGVudHMoc3RydWN0IHJhbXpzd2FwICpyenMpCit7CisJc3RydWN0IHJhbXpzd2FwX2JhY2tpbmdfZXh0ZW50ICpzZTsKKwlzdHJ1Y3QgcGFnZSAqdGFibGVfcGFnZSwgKnNlX3BhZ2U7CisJdW5zaWduZWQgbG9uZyBudW1fcGFnZXMsIG51bV90YWJsZV9wYWdlcywgZW50cnk7CisJdW5zaWduZWQgbG9uZyBzZV9pZHgsIHNwYW47CisJdW5zaWduZWQgZW50cmllc19wZXJfcGFnZSA9IFBBR0VfU0laRSAvIHNpemVvZigqcnpzLT50YWJsZSk7CisJdW5zaWduZWQgZXh0ZW50c19wZXJfcGFnZSA9IFBBR0VfU0laRSAvIHNpemVvZigqc2UpOworCisJLyogVHJ1ZSBmb3IgYmxvY2sgZGV2aWNlICovCisJaWYgKCFyenMtPm51bV9leHRlbnRzKQorCQlyZXR1cm47CisKKwlzZV9wYWdlID0gbGlzdF9lbnRyeShyenMtPmJhY2tpbmdfc3dhcF9leHRlbnRfbGlzdC5uZXh0LAorCQkJCQlzdHJ1Y3QgcGFnZSwgbHJ1KTsKKwlzZSA9IHBhZ2VfYWRkcmVzcyhzZV9wYWdlKTsKKwlzcGFuID0gc2UtPm51bV9wYWdlczsKKwludW1fcGFnZXMgPSByenMtPmRpc2tzaXplID4+IFBBR0VfU0hJRlQ7CisJbnVtX3RhYmxlX3BhZ2VzID0gRElWX1JPVU5EX1VQKG51bV9wYWdlcyAqIHNpemVvZigqcnpzLT50YWJsZSksCisJCQkJCQkJUEFHRV9TSVpFKTsKKworCWVudHJ5ID0gMDsKKwlzZV9pZHggPSAwOworCXdoaWxlIChudW1fdGFibGVfcGFnZXMtLSkgeworCQl0YWJsZV9wYWdlID0gdm1hbGxvY190b19wYWdlKCZyenMtPnRhYmxlW2VudHJ5XSk7CisJCXdoaWxlIChzcGFuIDw9IGVudHJ5KSB7CisJCQlzZV9pZHgrKzsKKwkJCWlmIChzZV9pZHggPT0gcnpzLT5udW1fZXh0ZW50cykKKwkJCQlCVUcoKTsKKworCQkJaWYgKCEoc2VfaWR4ICUgZXh0ZW50c19wZXJfcGFnZSkpIHsKKwkJCQlzZV9wYWdlID0gbGlzdF9lbnRyeShzZV9wYWdlLT5scnUubmV4dCwKKwkJCQkJCXN0cnVjdCBwYWdlLCBscnUpOworCQkJCXNlID0gcGFnZV9hZGRyZXNzKHNlX3BhZ2UpOworCQkJfSBlbHNlCisJCQkJc2UrKzsKKworCQkJc3BhbiArPSBzZS0+bnVtX3BhZ2VzOworCQl9CisJCXRhYmxlX3BhZ2UtPm1hcHBpbmcgPSAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKilzZTsKKwkJdGFibGVfcGFnZS0+cHJpdmF0ZSA9IHNlLT5udW1fcGFnZXMgLSAoc3BhbiAtIGVudHJ5KTsKKwkJcHJfZGVidWcoIm1hcF90YWJsZTogZW50cnk9JWx1LCBzcGFuPSVsdSwgbWFwPSVwLCBwcml2PSVsdVxuIiwKKwkJCWVudHJ5LCBzcGFuLCB0YWJsZV9wYWdlLT5tYXBwaW5nLCB0YWJsZV9wYWdlLT5wcml2YXRlKTsKKwkJZW50cnkgKz0gZW50cmllc19wZXJfcGFnZTsKKwl9Cit9CisKKy8qCisgKiBDaGVjayBpZiB2YWx1ZSBvZiBiYWNraW5nX3N3YXAgbW9kdWxlIHBhcmFtIGlzIHNhbmUuCisgKiBDbGFpbSB0aGlzIGRldmljZSBhbmQgc2V0IHJhbXpzd2FwIHNpemUgZXF1YWwgdG8KKyAqIHNpemUgb2YgdGhpcyBibG9jayBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgc2V0dXBfYmFja2luZ19zd2FwKHN0cnVjdCByYW16c3dhcCAqcnpzKQoreworCWludCByZXQgPSAwOworCXNpemVfdCBkaXNrc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG51bV9wYWdlcyA9IDA7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZmlsZSAqc3dhcF9maWxlOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBOVUxMOworCisJaWYgKCFyenMtPmJhY2tpbmdfc3dhcF9uYW1lWzBdKSB7CisJCXByX2RlYnVnKCJiYWNraW5nX3N3YXAgcGFyYW0gbm90IGdpdmVuXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcHJfaW5mbygiVXNpbmcgYmFja2luZyBzd2FwIGRldmljZTogJXNcbiIsIHJ6cy0+YmFja2luZ19zd2FwX25hbWUpOworCisJc3dhcF9maWxlID0gZmlscF9vcGVuKHJ6cy0+YmFja2luZ19zd2FwX25hbWUsCisJCQkJT19SRFdSIHwgT19MQVJHRUZJTEUsIDApOworCWlmIChJU19FUlIoc3dhcF9maWxlKSkgeworCQlwcl9lcnIoIkVycm9yIG9wZW5pbmcgYmFja2luZyBkZXZpY2U6ICVzXG4iLAorCQkJcnpzLT5iYWNraW5nX3N3YXBfbmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCW1hcHBpbmcgPSBzd2FwX2ZpbGUtPmZfbWFwcGluZzsKKwlpbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisKKwlpZiAoU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkgeworCQliZGV2ID0gSV9CREVWKGlub2RlKTsKKwkJcmV0ID0gYmRfY2xhaW0oYmRldiwgc2V0dXBfYmFja2luZ19zd2FwKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWJkZXYgPSBOVUxMOworCQkJZ290byBiYWRfcGFyYW07CisJCX0KKwkJZGlza3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJfSBlbHNlIGlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCWJkZXYgPSBpbm9kZS0+aV9zYi0+c19iZGV2OworCQlpZiAoSVNfU1dBUEZJTEUoaW5vZGUpKSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIGJhZF9wYXJhbTsKKwkJfQorCQlyZXQgPSBzZXR1cF9iYWNraW5nX3N3YXBfZXh0ZW50cyhyenMsIGlub2RlLCAmbnVtX3BhZ2VzKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGJhZF9wYXJhbTsKKwkJZGlza3NpemUgPSBudW1fcGFnZXMgPDwgUEFHRV9TSElGVDsKKwl9IGVsc2UgeworCQlnb3RvIGJhZF9wYXJhbTsKKwl9CisKKwlyenMtPnN3YXBfZmlsZSA9IHN3YXBfZmlsZTsKKwlyenMtPmJhY2tpbmdfc3dhcCA9IGJkZXY7CisJcnpzLT5kaXNrc2l6ZSA9IGRpc2tzaXplOworCUJVR19PTighcnpzLT5kaXNrc2l6ZSk7CisKKwlyZXR1cm4gMDsKKworYmFkX3BhcmFtOgorCWlmIChiZGV2KQorCQliZF9yZWxlYXNlKGJkZXYpOworCWZpbHBfY2xvc2Uoc3dhcF9maWxlLCBOVUxMKTsKKworb3V0OgorCXJ6cy0+YmFja2luZ19zd2FwID0gTlVMTDsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTWFwIGxvZ2ljYWwgcGFnZSBudW1iZXIgJ3BhZ2VudW0nIHRvIHBoeXNpY2FsIHBhZ2UgbnVtYmVyCisgKiBvbiBiYWNraW5nIHN3YXAgZGV2aWNlLiBGb3IgYmxvY2sgZGV2aWNlLCB0aGlzIGlzIGEgbm9wLgorICovCit1MzIgbWFwX2JhY2tpbmdfc3dhcF9wYWdlKHN0cnVjdCByYW16c3dhcCAqcnpzLCB1MzIgcGFnZW51bSkKK3sKKwl1MzIgc2tpcF9wYWdlcywgZW50cmllc19wZXJfcGFnZTsKKwlzaXplX3QgZGVsdGEsIHNlX29mZnNldCwgc2tpcHBlZDsKKwlzdHJ1Y3QgcGFnZSAqdGFibGVfcGFnZSwgKnNlX3BhZ2U7CisJc3RydWN0IHJhbXpzd2FwX2JhY2tpbmdfZXh0ZW50ICpzZTsKKworCWlmICghcnpzLT5udW1fZXh0ZW50cykKKwkJcmV0dXJuIHBhZ2VudW07CisKKwllbnRyaWVzX3Blcl9wYWdlID0gUEFHRV9TSVpFIC8gc2l6ZW9mKCpyenMtPnRhYmxlKTsKKworCXRhYmxlX3BhZ2UgPSB2bWFsbG9jX3RvX3BhZ2UoJnJ6cy0+dGFibGVbcGFnZW51bV0pOworCXNlID0gKHN0cnVjdCByYW16c3dhcF9iYWNraW5nX2V4dGVudCAqKXRhYmxlX3BhZ2UtPm1hcHBpbmc7CisJc2VfcGFnZSA9IHZpcnRfdG9fcGFnZShzZSk7CisKKwlza2lwX3BhZ2VzID0gcGFnZW51bSAtIChwYWdlbnVtIC8gZW50cmllc19wZXJfcGFnZSAqIGVudHJpZXNfcGVyX3BhZ2UpOworCXNlX29mZnNldCA9IHRhYmxlX3BhZ2UtPnByaXZhdGUgKyBza2lwX3BhZ2VzOworCisJaWYgKHNlX29mZnNldCA8IHNlLT5udW1fcGFnZXMpCisJCXJldHVybiBzZS0+cGh5X3BhZ2VudW0gKyBzZV9vZmZzZXQ7CisKKwlza2lwcGVkID0gc2UtPm51bV9wYWdlcyAtIHRhYmxlX3BhZ2UtPnByaXZhdGU7CisJZG8geworCQlzdHJ1Y3QgcmFtenN3YXBfYmFja2luZ19leHRlbnQgKnNlX2Jhc2U7CisJCXUzMiBzZV9lbnRyaWVzX3Blcl9wYWdlID0gUEFHRV9TSVpFIC8gc2l6ZW9mKCpzZSk7CisKKwkJLyogR2V0IG5leHQgc3dhcCBleHRlbnQgKi8KKwkJc2VfYmFzZSA9IChzdHJ1Y3QgcmFtenN3YXBfYmFja2luZ19leHRlbnQgKikKKwkJCQkJCXBhZ2VfYWRkcmVzcyhzZV9wYWdlKTsKKwkJaWYgKHNlIC0gc2VfYmFzZSA9PSBzZV9lbnRyaWVzX3Blcl9wYWdlIC0gMSkgeworCQkJc2VfcGFnZSA9IGxpc3RfZW50cnkoc2VfcGFnZS0+bHJ1Lm5leHQsCisJCQkJCQlzdHJ1Y3QgcGFnZSwgbHJ1KTsKKwkJCXNlID0gcGFnZV9hZGRyZXNzKHNlX3BhZ2UpOworCQl9IGVsc2UgeworCQkJc2UrKzsKKwkJfQorCisJCXNraXBwZWQgKz0gc2UtPm51bV9wYWdlczsKKwl9IHdoaWxlIChza2lwcGVkIDwgc2tpcF9wYWdlcyk7CisKKwlkZWx0YSA9IHNraXBwZWQgLSBza2lwX3BhZ2VzOworCXNlX29mZnNldCA9IHNlLT5udW1fcGFnZXMgLSBkZWx0YTsKKworCXJldHVybiBzZS0+cGh5X3BhZ2VudW0gKyBzZV9vZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHJhbXpzd2FwX2ZyZWVfcGFnZShzdHJ1Y3QgcmFtenN3YXAgKnJ6cywgc2l6ZV90IGluZGV4KQoreworCXUzMiBjbGVuOworCXZvaWQgKm9iajsKKworCXN0cnVjdCBwYWdlICpwYWdlID0gcnpzLT50YWJsZVtpbmRleF0ucGFnZTsKKwl1MzIgb2Zmc2V0ID0gcnpzLT50YWJsZVtpbmRleF0ub2Zmc2V0OworCisJaWYgKHVubGlrZWx5KCFwYWdlKSkgeworCQlpZiAocnpzX3Rlc3RfZmxhZyhyenMsIGluZGV4LCBSWlNfWkVSTykpIHsKKwkJCXJ6c19jbGVhcl9mbGFnKHJ6cywgaW5kZXgsIFJaU19aRVJPKTsKKwkJCXN0YXRfZGVjKHJ6cy0+c3RhdHMucGFnZXNfemVybyk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCWlmICh1bmxpa2VseShyenNfdGVzdF9mbGFnKHJ6cywgaW5kZXgsIFJaU19VTkNPTVBSRVNTRUQpKSkgeworCQljbGVuID0gUEFHRV9TSVpFOworCQlfX2ZyZWVfcGFnZShwYWdlKTsKKwkJcnpzX2NsZWFyX2ZsYWcocnpzLCBpbmRleCwgUlpTX1VOQ09NUFJFU1NFRCk7CisJCXN0YXRfZGVjKHJ6cy0+c3RhdHMucGFnZXNfZXhwYW5kKTsKKwkJZ290byBvdXQ7CisJfQorCisJb2JqID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApICsgb2Zmc2V0OworCWNsZW4gPSB4dl9nZXRfb2JqZWN0X3NpemUob2JqKSAtIHNpemVvZihzdHJ1Y3Qgem9ial9oZWFkZXIpOworCWt1bm1hcF9hdG9taWMob2JqLCBLTV9VU0VSMCk7CisKKwl4dl9mcmVlKHJ6cy0+bWVtX3Bvb2wsIHBhZ2UsIG9mZnNldCk7CisJaWYgKGNsZW4gPD0gUEFHRV9TSVpFIC8gMikKKwkJc3RhdF9kZWMocnpzLT5zdGF0cy5nb29kX2NvbXByZXNzKTsKKworb3V0OgorCXJ6cy0+c3RhdHMuY29tcHJfc2l6ZSAtPSBjbGVuOworCXN0YXRfZGVjKHJ6cy0+c3RhdHMucGFnZXNfc3RvcmVkKTsKKworCXJ6cy0+dGFibGVbaW5kZXhdLnBhZ2UgPSBOVUxMOworCXJ6cy0+dGFibGVbaW5kZXhdLm9mZnNldCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3plcm9fcGFnZShzdHJ1Y3QgYmlvICpiaW8pCit7CisJdm9pZCAqdXNlcl9tZW07CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBiaW8tPmJpX2lvX3ZlY1swXS5idl9wYWdlOworCisJdXNlcl9tZW0gPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJbWVtc2V0KHVzZXJfbWVtLCAwLCBQQUdFX1NJWkUpOworCWt1bm1hcF9hdG9taWModXNlcl9tZW0sIEtNX1VTRVIwKTsKKworCXJhbXpzd2FwX2ZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCisJc2V0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKKwliaW9fZW5kaW8oYmlvLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfdW5jb21wcmVzc2VkX3BhZ2Uoc3RydWN0IHJhbXpzd2FwICpyenMsIHN0cnVjdCBiaW8gKmJpbykKK3sKKwl1MzIgaW5kZXg7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgY2hhciAqdXNlcl9tZW0sICpjbWVtOworCisJcGFnZSA9IGJpby0+YmlfaW9fdmVjWzBdLmJ2X3BhZ2U7CisJaW5kZXggPSBiaW8tPmJpX3NlY3RvciA+PiBTRUNUT1JTX1BFUl9QQUdFX1NISUZUOworCisJdXNlcl9tZW0gPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJY21lbSA9IGttYXBfYXRvbWljKHJ6cy0+dGFibGVbaW5kZXhdLnBhZ2UsIEtNX1VTRVIxKSArCisJCQlyenMtPnRhYmxlW2luZGV4XS5vZmZzZXQ7CisKKwltZW1jcHkodXNlcl9tZW0sIGNtZW0sIFBBR0VfU0laRSk7CisJa3VubWFwX2F0b21pYyh1c2VyX21lbSwgS01fVVNFUjApOworCWt1bm1hcF9hdG9taWMoY21lbSwgS01fVVNFUjEpOworCisJcmFtenN3YXBfZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisKKwlzZXRfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpOworCWJpb19lbmRpbyhiaW8sIDApOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBDYWxsZWQgd2hlbiByZXF1ZXN0IHBhZ2UgaXMgbm90IHByZXNlbnQgaW4gcmFtenN3YXAuCisgKiBJdHMgZWl0aGVyIGluIGJhY2tpbmcgc3dhcCBkZXZpY2UgKGlmIHByZXNlbnQpIG9yCisgKiB0aGlzIGlzIGFuIGF0dGVtcHQgdG8gcmVhZCBiZWZvcmUgYW55IHByZXZpb3VzIHdyaXRlCisgKiB0byB0aGlzIGxvY2F0aW9uIC0gdGhpcyBoYXBwZW5zIGR1ZSB0byByZWFkYWhlYWQgd2hlbgorICogc3dhcCBkZXZpY2UgaXMgcmVhZCBmcm9tIHVzZXItc3BhY2UgKGUuZy4gZHVyaW5nIHN3YXBvbikKKyAqLworc3RhdGljIGludCBoYW5kbGVfcmFtenN3YXBfZmF1bHQoc3RydWN0IHJhbXpzd2FwICpyenMsIHN0cnVjdCBiaW8gKmJpbykKK3sKKwkvKgorCSAqIEFsd2F5cyBmb3J3YXJkIHN1Y2ggcmVxdWVzdHMgdG8gYmFja2luZyBzd2FwCisJICogZGV2aWNlIChpZiBwcmVzZW50KQorCSAqLworCWlmIChyenMtPmJhY2tpbmdfc3dhcCkgeworCQl1MzIgcGFnZW51bTsKKwkJc3RhdF9kZWMocnpzLT5zdGF0cy5udW1fcmVhZHMpOworCQlzdGF0X2luYyhyenMtPnN0YXRzLmJkZXZfbnVtX3JlYWRzKTsKKwkJYmlvLT5iaV9iZGV2ID0gcnpzLT5iYWNraW5nX3N3YXA7CisKKwkJLyoKKwkJICogSW4gY2FzZSBiYWNraW5nIHN3YXAgaXMgYSBmaWxlLCBmaW5kIHRoZSByaWdodCBvZmZzZXQgd2l0aGluCisJCSAqIHRoZSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gbG9naWNhbCBwb3NpdGlvbiAnaW5kZXgnLiBGb3IgYmxvY2sKKwkJICogZGV2aWNlLCB0aGlzIGlzIGEgbm9wLgorCQkgKi8KKwkJcGFnZW51bSA9IGJpby0+Ymlfc2VjdG9yID4+IFNFQ1RPUlNfUEVSX1BBR0VfU0hJRlQ7CisJCWJpby0+Ymlfc2VjdG9yID0gbWFwX2JhY2tpbmdfc3dhcF9wYWdlKHJ6cywgcGFnZW51bSkKKwkJCQkJPDwgU0VDVE9SU19QRVJfUEFHRV9TSElGVDsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBJdHMgdW5saWtlbHkgZXZlbnQgaW4gY2FzZSBiYWNraW5nIGRldiBpcworCSAqIG5vdCBwcmVzZW50CisJICovCisJcHJfZGVidWcoIlJlYWQgYmVmb3JlIHdyaXRlIG9uIHN3YXAgZGV2aWNlOiAiCisJCSJzZWN0b3I9JWx1LCBzaXplPSV1LCBvZmZzZXQ9JXVcbiIsCisJCSh1bG9uZykoYmlvLT5iaV9zZWN0b3IpLCBiaW8tPmJpX3NpemUsCisJCWJpby0+YmlfaW9fdmVjWzBdLmJ2X29mZnNldCk7CisKKwkvKiBEbyBub3RoaW5nLiBKdXN0IHJldHVybiBzdWNjZXNzICovCisJc2V0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKKwliaW9fZW5kaW8oYmlvLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYW16c3dhcF9yZWFkKHN0cnVjdCByYW16c3dhcCAqcnpzLCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJaW50IHJldDsKKwl1MzIgaW5kZXg7CisJc2l6ZV90IGNsZW47CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IHpvYmpfaGVhZGVyICp6aGVhZGVyOworCXVuc2lnbmVkIGNoYXIgKnVzZXJfbWVtLCAqY21lbTsKKworCXN0YXRfaW5jKHJ6cy0+c3RhdHMubnVtX3JlYWRzKTsKKworCXBhZ2UgPSBiaW8tPmJpX2lvX3ZlY1swXS5idl9wYWdlOworCWluZGV4ID0gYmlvLT5iaV9zZWN0b3IgPj4gU0VDVE9SU19QRVJfUEFHRV9TSElGVDsKKworCWlmIChyenNfdGVzdF9mbGFnKHJ6cywgaW5kZXgsIFJaU19aRVJPKSkKKwkJcmV0dXJuIGhhbmRsZV96ZXJvX3BhZ2UoYmlvKTsKKworCS8qIFJlcXVlc3RlZCBwYWdlIGlzIG5vdCBwcmVzZW50IGluIGNvbXByZXNzZWQgYXJlYSAqLworCWlmICghcnpzLT50YWJsZVtpbmRleF0ucGFnZSkKKwkJcmV0dXJuIGhhbmRsZV9yYW16c3dhcF9mYXVsdChyenMsIGJpbyk7CisKKwkvKiBQYWdlIGlzIHN0b3JlZCB1bmNvbXByZXNzZWQgc2luY2UgaXRzIGluY29tcHJlc3NpYmxlICovCisJaWYgKHVubGlrZWx5KHJ6c190ZXN0X2ZsYWcocnpzLCBpbmRleCwgUlpTX1VOQ09NUFJFU1NFRCkpKQorCQlyZXR1cm4gaGFuZGxlX3VuY29tcHJlc3NlZF9wYWdlKHJ6cywgYmlvKTsKKworCXVzZXJfbWVtID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCWNsZW4gPSBQQUdFX1NJWkU7CisKKwljbWVtID0ga21hcF9hdG9taWMocnpzLT50YWJsZVtpbmRleF0ucGFnZSwgS01fVVNFUjEpICsKKwkJCXJ6cy0+dGFibGVbaW5kZXhdLm9mZnNldDsKKworCXJldCA9IGx6bzF4X2RlY29tcHJlc3Nfc2FmZSgKKwkJY21lbSArIHNpemVvZigqemhlYWRlciksCisJCXh2X2dldF9vYmplY3Rfc2l6ZShjbWVtKSAtIHNpemVvZigqemhlYWRlciksCisJCXVzZXJfbWVtLCAmY2xlbik7CisKKwlrdW5tYXBfYXRvbWljKHVzZXJfbWVtLCBLTV9VU0VSMCk7CisJa3VubWFwX2F0b21pYyhjbWVtLCBLTV9VU0VSMSk7CisKKwkvKiBzaG91bGQgTkVWRVIgaGFwcGVuICovCisJaWYgKHVubGlrZWx5KHJldCAhPSBMWk9fRV9PSykpIHsKKwkJcHJfZXJyKCJEZWNvbXByZXNzaW9uIGZhaWxlZCEgZXJyPSVkLCBwYWdlPSV1XG4iLAorCQkJcmV0LCBpbmRleCk7CisJCXN0YXRfaW5jKHJ6cy0+c3RhdHMuZmFpbGVkX3JlYWRzKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmFtenN3YXBfZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisKKwlzZXRfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpOworCWJpb19lbmRpbyhiaW8sIDApOworCXJldHVybiAwOworCitvdXQ6CisJYmlvX2lvX2Vycm9yKGJpbyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFtenN3YXBfd3JpdGUoc3RydWN0IHJhbXpzd2FwICpyenMsIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlpbnQgcmV0LCBmd2Rfd3JpdGVfcmVxdWVzdCA9IDA7CisJdTMyIG9mZnNldCwgaW5kZXg7CisJc2l6ZV90IGNsZW47CisJc3RydWN0IHpvYmpfaGVhZGVyICp6aGVhZGVyOworCXN0cnVjdCBwYWdlICpwYWdlLCAqcGFnZV9zdG9yZTsKKwl1bnNpZ25lZCBjaGFyICp1c2VyX21lbSwgKmNtZW0sICpzcmM7CisKKwlzdGF0X2luYyhyenMtPnN0YXRzLm51bV93cml0ZXMpOworCisJcGFnZSA9IGJpby0+YmlfaW9fdmVjWzBdLmJ2X3BhZ2U7CisJaW5kZXggPSBiaW8tPmJpX3NlY3RvciA+PiBTRUNUT1JTX1BFUl9QQUdFX1NISUZUOworCisJc3JjID0gcnpzLT5jb21wcmVzc19idWZmZXI7CisKKwkvKgorCSAqIFN5c3RlbSBzd2FwcyB0byBzYW1lIHNlY3RvciBhZ2FpbiB3aGVuIHRoZSBzdG9yZWQgcGFnZQorCSAqIGlzIG5vIGxvbmdlciByZWZlcmVuY2VkIGJ5IGFueSBwcm9jZXNzLiBTbywgaXRzIG5vdyBzYWZlCisJICogdG8gZnJlZSB0aGUgbWVtb3J5IHRoYXQgd2FzIGFsbG9jYXRlZCBmb3IgdGhpcyBwYWdlLgorCSAqLworCWlmIChyenMtPnRhYmxlW2luZGV4XS5wYWdlKQorCQlyYW16c3dhcF9mcmVlX3BhZ2UocnpzLCBpbmRleCk7CisKKwkvKgorCSAqIE5vIG1lbW9yeSBpYSBhbGxvY2F0ZWQgZm9yIHplcm8gZmlsbGVkIHBhZ2VzLgorCSAqIFNpbXBseSBjbGVhciB6ZXJvIHBhZ2UgZmxhZy4KKwkgKi8KKwlpZiAocnpzX3Rlc3RfZmxhZyhyenMsIGluZGV4LCBSWlNfWkVSTykpIHsKKwkJc3RhdF9kZWMocnpzLT5zdGF0cy5wYWdlc196ZXJvKTsKKwkJcnpzX2NsZWFyX2ZsYWcocnpzLCBpbmRleCwgUlpTX1pFUk8pOworCX0KKworCW11dGV4X2xvY2soJnJ6cy0+bG9jayk7CisKKwl1c2VyX21lbSA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwlpZiAocGFnZV96ZXJvX2ZpbGxlZCh1c2VyX21lbSkpIHsKKwkJa3VubWFwX2F0b21pYyh1c2VyX21lbSwgS01fVVNFUjApOworCQltdXRleF91bmxvY2soJnJ6cy0+bG9jayk7CisJCXN0YXRfaW5jKHJ6cy0+c3RhdHMucGFnZXNfemVybyk7CisJCXJ6c19zZXRfZmxhZyhyenMsIGluZGV4LCBSWlNfWkVSTyk7CisKKwkJc2V0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKKwkJYmlvX2VuZGlvKGJpbywgMCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChyenMtPmJhY2tpbmdfc3dhcCAmJgorCQkocnpzLT5zdGF0cy5jb21wcl9zaXplID4gcnpzLT5tZW1saW1pdCAtIFBBR0VfU0laRSkpIHsKKwkJa3VubWFwX2F0b21pYyh1c2VyX21lbSwgS01fVVNFUjApOworCQltdXRleF91bmxvY2soJnJ6cy0+bG9jayk7CisJCWZ3ZF93cml0ZV9yZXF1ZXN0ID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gbHpvMXhfMV9jb21wcmVzcyh1c2VyX21lbSwgUEFHRV9TSVpFLCBzcmMsICZjbGVuLAorCQkJCXJ6cy0+Y29tcHJlc3Nfd29ya21lbSk7CisKKwlrdW5tYXBfYXRvbWljKHVzZXJfbWVtLCBLTV9VU0VSMCk7CisKKwlpZiAodW5saWtlbHkocmV0ICE9IExaT19FX09LKSkgeworCQltdXRleF91bmxvY2soJnJ6cy0+bG9jayk7CisJCXByX2VycigiQ29tcHJlc3Npb24gZmFpbGVkISBlcnI9JWRcbiIsIHJldCk7CisJCXN0YXRfaW5jKHJ6cy0+c3RhdHMuZmFpbGVkX3dyaXRlcyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogUGFnZSBpcyBpbmNvbXByZXNzaWJsZS4gRm9yd2FyZCBpdCB0byBiYWNraW5nIHN3YXAKKwkgKiBpZiBwcmVzZW50LiBPdGhlcndpc2UsIHN0b3JlIGl0IGFzLWlzICh1bmNvbXByZXNzZWQpCisJICogc2luY2Ugd2UgZG8gbm90IHdhbnQgdG8gcmV0dXJuIHRvbyBtYW55IHN3YXAgd3JpdGUKKwkgKiBlcnJvcnMgd2hpY2ggaGFzIHNpZGUgZWZmZWN0IG9mIGhhbmdpbmcgdGhlIHN5c3RlbS4KKwkgKi8KKwlpZiAodW5saWtlbHkoY2xlbiA+IG1heF96cGFnZV9zaXplKSkgeworCQlpZiAocnpzLT5iYWNraW5nX3N3YXApIHsKKwkJCW11dGV4X3VubG9jaygmcnpzLT5sb2NrKTsKKwkJCWZ3ZF93cml0ZV9yZXF1ZXN0ID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJY2xlbiA9IFBBR0VfU0laRTsKKwkJcGFnZV9zdG9yZSA9IGFsbG9jX3BhZ2UoR0ZQX05PSU8gfCBfX0dGUF9ISUdITUVNKTsKKwkJaWYgKHVubGlrZWx5KCFwYWdlX3N0b3JlKSkgeworCQkJbXV0ZXhfdW5sb2NrKCZyenMtPmxvY2spOworCQkJcHJfaW5mbygiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkgZm9yIGluY29tcHJlc3NpYmxlICIKKwkJCQkicGFnZTogJXVcbiIsIGluZGV4KTsKKwkJCXN0YXRfaW5jKHJ6cy0+c3RhdHMuZmFpbGVkX3dyaXRlcyk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCW9mZnNldCA9IDA7CisJCXJ6c19zZXRfZmxhZyhyenMsIGluZGV4LCBSWlNfVU5DT01QUkVTU0VEKTsKKwkJc3RhdF9pbmMocnpzLT5zdGF0cy5wYWdlc19leHBhbmQpOworCQlyenMtPnRhYmxlW2luZGV4XS5wYWdlID0gcGFnZV9zdG9yZTsKKwkJc3JjID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQlnb3RvIG1lbXN0b3JlOworCX0KKworCWlmICh4dl9tYWxsb2MocnpzLT5tZW1fcG9vbCwgY2xlbiArIHNpemVvZigqemhlYWRlciksCisJCQkmcnpzLT50YWJsZVtpbmRleF0ucGFnZSwgJm9mZnNldCwKKwkJCUdGUF9OT0lPIHwgX19HRlBfSElHSE1FTSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZyenMtPmxvY2spOworCQlwcl9pbmZvKCJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgY29tcHJlc3NlZCAiCisJCQkicGFnZTogJXUsIHNpemU9JXp1XG4iLCBpbmRleCwgY2xlbik7CisJCXN0YXRfaW5jKHJ6cy0+c3RhdHMuZmFpbGVkX3dyaXRlcyk7CisJCWlmIChyenMtPmJhY2tpbmdfc3dhcCkKKwkJCWZ3ZF93cml0ZV9yZXF1ZXN0ID0gMTsKKwkJZ290byBvdXQ7CisJfQorCittZW1zdG9yZToKKwlyenMtPnRhYmxlW2luZGV4XS5vZmZzZXQgPSBvZmZzZXQ7CisKKwljbWVtID0ga21hcF9hdG9taWMocnpzLT50YWJsZVtpbmRleF0ucGFnZSwgS01fVVNFUjEpICsKKwkJCXJ6cy0+dGFibGVbaW5kZXhdLm9mZnNldDsKKworI2lmIDAKKwkvKiBCYWNrLXJlZmVyZW5jZSBuZWVkZWQgZm9yIG1lbW9yeSBkZWZyYWdtZW50YXRpb24gKi8KKwlpZiAoIXJ6c190ZXN0X2ZsYWcocnpzLCBpbmRleCwgUlpTX1VOQ09NUFJFU1NFRCkpIHsKKwkJemhlYWRlciA9IChzdHJ1Y3Qgem9ial9oZWFkZXIgKiljbWVtOworCQl6aGVhZGVyLT50YWJsZV9pZHggPSBpbmRleDsKKwkJY21lbSArPSBzaXplb2YoKnpoZWFkZXIpOworCX0KKyNlbmRpZgorCisJbWVtY3B5KGNtZW0sIHNyYywgY2xlbik7CisKKwlrdW5tYXBfYXRvbWljKGNtZW0sIEtNX1VTRVIxKTsKKwlpZiAodW5saWtlbHkocnpzX3Rlc3RfZmxhZyhyenMsIGluZGV4LCBSWlNfVU5DT01QUkVTU0VEKSkpCisJCWt1bm1hcF9hdG9taWMoc3JjLCBLTV9VU0VSMCk7CisKKwkvKiBVcGRhdGUgc3RhdHMgKi8KKwlyenMtPnN0YXRzLmNvbXByX3NpemUgKz0gY2xlbjsKKwlzdGF0X2luYyhyenMtPnN0YXRzLnBhZ2VzX3N0b3JlZCk7CisJaWYgKGNsZW4gPD0gUEFHRV9TSVpFIC8gMikKKwkJc3RhdF9pbmMocnpzLT5zdGF0cy5nb29kX2NvbXByZXNzKTsKKworCW11dGV4X3VubG9jaygmcnpzLT5sb2NrKTsKKworCXNldF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CisJYmlvX2VuZGlvKGJpbywgMCk7CisJcmV0dXJuIDA7CisKK291dDoKKwlpZiAoZndkX3dyaXRlX3JlcXVlc3QpIHsKKwkJc3RhdF9pbmMocnpzLT5zdGF0cy5iZGV2X251bV93cml0ZXMpOworCQliaW8tPmJpX2JkZXYgPSByenMtPmJhY2tpbmdfc3dhcDsKKyNpZiAwCisJCS8qCisJCSAqIFRPRE86IFdlIGN1cnJlbnRseSBoYXZlIGxpbmVhciBtYXBwaW5nIG9mIHJhbXpzd2FwIGFuZAorCQkgKiBiYWNraW5nIHN3YXAgc2VjdG9ycy4gVGhpcyBpcyBub3QgZGVzaXJlZCBzaW5jZSB3ZSB3YW50CisJCSAqIHRvIG9wdGltaXplIHdyaXRlcyB0byBiYWNraW5nIHN3YXAgdG8gbWluaW1pemUgZGlzayBzZWVrcworCQkgKiBvciBoYXZlIGVmZmVjdGl2ZSB3ZWFyIGxldmVsaW5nIChmb3IgU1NEcykuIEFsc28sIGEKKwkJICogbm9uLWxpbmVhciBtYXBwaW5nIGlzIHJlcXVpcmVkIHRvIGltcGxlbWVudCBjb21wcmVzc2VkCisJCSAqIG9uLWRpc2sgc3dhcHBpbmcuCisJCSAqLworCQkgYmlvLT5iaV9zZWN0b3IgPSBnZXRfYmFja2luZ19zd2FwX3BhZ2UoKQorCQkJCQk8PCBTRUNUT1JTX1BFUl9QQUdFX1NISUZUOworI2VuZGlmCisJCS8qCisJCSAqIEluIGNhc2UgYmFja2luZyBzd2FwIGlzIGEgZmlsZSwgZmluZCB0aGUgcmlnaHQgb2Zmc2V0IHdpdGhpbgorCQkgKiB0aGUgZmlsZSBjb3JyZXNwb25kaW5nIHRvIGxvZ2ljYWwgcG9zaXRpb24gJ2luZGV4Jy4gRm9yIGJsb2NrCisJCSAqIGRldmljZSwgdGhpcyBpcyBhIG5vcC4KKwkJICovCisJCWJpby0+Ymlfc2VjdG9yID0gbWFwX2JhY2tpbmdfc3dhcF9wYWdlKHJ6cywgaW5kZXgpCisJCQkJCTw8IFNFQ1RPUlNfUEVSX1BBR0VfU0hJRlQ7CisJCXJldHVybiAxOworCX0KKworCWJpb19pb19lcnJvcihiaW8pOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBDaGVjayBpZiByZXF1ZXN0IGlzIHdpdGhpbiBib3VuZHMgYW5kIHBhZ2UgYWxpZ25lZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdmFsaWRfc3dhcF9yZXF1ZXN0KHN0cnVjdCByYW16c3dhcCAqcnpzLCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJaWYgKHVubGlrZWx5KAorCQkoYmlvLT5iaV9zZWN0b3IgPj0gKHJ6cy0+ZGlza3NpemUgPj4gU0VDVE9SX1NISUZUKSkgfHwKKwkJKGJpby0+Ymlfc2VjdG9yICYgKFNFQ1RPUlNfUEVSX1BBR0UgLSAxKSkgfHwKKwkJKGJpby0+YmlfdmNudCAhPSAxKSB8fAorCQkoYmlvLT5iaV9zaXplICE9IFBBR0VfU0laRSkgfHwKKwkJKGJpby0+YmlfaW9fdmVjWzBdLmJ2X29mZnNldCAhPSAwKSkpIHsKKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBzd2FwIHJlcXVlc3QgaXMgdmFsaWQgKi8KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEhhbmRsZXIgZnVuY3Rpb24gZm9yIGFsbCByYW16c3dhcCBJL08gcmVxdWVzdHMuCisgKi8KK3N0YXRpYyBpbnQgcmFtenN3YXBfbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZSwgc3RydWN0IGJpbyAqYmlvKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCByYW16c3dhcCAqcnpzID0gcXVldWUtPnF1ZXVlZGF0YTsKKworCWlmICh1bmxpa2VseSghcnpzLT5pbml0X2RvbmUpKSB7CisJCWJpb19pb19lcnJvcihiaW8pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXZhbGlkX3N3YXBfcmVxdWVzdChyenMsIGJpbykpIHsKKwkJc3RhdF9pbmMocnpzLT5zdGF0cy5pbnZhbGlkX2lvKTsKKwkJYmlvX2lvX2Vycm9yKGJpbyk7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoYmlvX2RhdGFfZGlyKGJpbykpIHsKKwljYXNlIFJFQUQ6CisJCXJldCA9IHJhbXpzd2FwX3JlYWQocnpzLCBiaW8pOworCQlicmVhazsKKworCWNhc2UgV1JJVEU6CisJCXJldCA9IHJhbXpzd2FwX3dyaXRlKHJ6cywgYmlvKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfZGV2aWNlKHN0cnVjdCByYW16c3dhcCAqcnpzKQoreworCWludCBpc19iYWNraW5nX2Jsa2RldiA9IDA7CisJc2l6ZV90IGluZGV4LCBudW1fcGFnZXM7CisJdW5zaWduZWQgZW50cmllc19wZXJfcGFnZTsKKwl1bnNpZ25lZCBsb25nIG51bV90YWJsZV9wYWdlcywgZW50cnkgPSAwOworCisJaWYgKHJ6cy0+YmFja2luZ19zd2FwICYmICFyenMtPm51bV9leHRlbnRzKQorCQlpc19iYWNraW5nX2Jsa2RldiA9IDE7CisKKwludW1fcGFnZXMgPSByenMtPmRpc2tzaXplID4+IFBBR0VfU0hJRlQ7CisKKwkvKiBGcmVlIHZhcmlvdXMgcGVyLWRldmljZSBidWZmZXJzICovCisJa2ZyZWUocnpzLT5jb21wcmVzc193b3JrbWVtKTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXJ6cy0+Y29tcHJlc3NfYnVmZmVyLCAxKTsKKworCXJ6cy0+Y29tcHJlc3Nfd29ya21lbSA9IE5VTEw7CisJcnpzLT5jb21wcmVzc19idWZmZXIgPSBOVUxMOworCisJLyogRnJlZSBhbGwgcGFnZXMgdGhhdCBhcmUgc3RpbGwgaW4gdGhpcyByYW16c3dhcCBkZXZpY2UgKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1fcGFnZXM7IGluZGV4KyspIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCXUxNiBvZmZzZXQ7CisKKwkJcGFnZSA9IHJ6cy0+dGFibGVbaW5kZXhdLnBhZ2U7CisJCW9mZnNldCA9IHJ6cy0+dGFibGVbaW5kZXhdLm9mZnNldDsKKworCQlpZiAoIXBhZ2UpCisJCQljb250aW51ZTsKKworCQlpZiAodW5saWtlbHkocnpzX3Rlc3RfZmxhZyhyenMsIGluZGV4LCBSWlNfVU5DT01QUkVTU0VEKSkpCisJCQlfX2ZyZWVfcGFnZShwYWdlKTsKKwkJZWxzZQorCQkJeHZfZnJlZShyenMtPm1lbV9wb29sLCBwYWdlLCBvZmZzZXQpOworCX0KKworCWVudHJpZXNfcGVyX3BhZ2UgPSBQQUdFX1NJWkUgLyBzaXplb2YoKnJ6cy0+dGFibGUpOworCW51bV90YWJsZV9wYWdlcyA9IERJVl9ST1VORF9VUChudW1fcGFnZXMgKiBzaXplb2YoKnJ6cy0+dGFibGUpLAorCQkJCQlQQUdFX1NJWkUpOworCS8qCisJICogU2V0IHBhZ2UtPm1hcHBpbmcgdG8gTlVMTCBmb3IgZXZlcnkgdGFibGUgcGFnZS4KKwkgKiBPdGhlcndpc2UsIHdlIHdpbGwgaGl0IGJhZF9wYWdlKCkgZHVyaW5nIGZyZWUuCisJICovCisJd2hpbGUgKHJ6cy0+bnVtX2V4dGVudHMgJiYgbnVtX3RhYmxlX3BhZ2VzLS0pIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCXBhZ2UgPSB2bWFsbG9jX3RvX3BhZ2UoJnJ6cy0+dGFibGVbZW50cnldKTsKKwkJcGFnZS0+bWFwcGluZyA9IE5VTEw7CisJCWVudHJ5ICs9IGVudHJpZXNfcGVyX3BhZ2U7CisJfQorCXZmcmVlKHJ6cy0+dGFibGUpOworCXJ6cy0+dGFibGUgPSBOVUxMOworCisJeHZfZGVzdHJveV9wb29sKHJ6cy0+bWVtX3Bvb2wpOworCXJ6cy0+bWVtX3Bvb2wgPSBOVUxMOworCisJLyogRnJlZSBhbGwgc3dhcCBleHRlbnQgcGFnZXMgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnJ6cy0+YmFja2luZ19zd2FwX2V4dGVudF9saXN0KSkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisJCWVudHJ5ID0gcnpzLT5iYWNraW5nX3N3YXBfZXh0ZW50X2xpc3QubmV4dDsKKwkJcGFnZSA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBwYWdlLCBscnUpOworCQlsaXN0X2RlbChlbnRyeSk7CisJCV9fZnJlZV9wYWdlKHBhZ2UpOworCX0KKwlJTklUX0xJU1RfSEVBRCgmcnpzLT5iYWNraW5nX3N3YXBfZXh0ZW50X2xpc3QpOworCXJ6cy0+bnVtX2V4dGVudHMgPSAwOworCisJLyogQ2xvc2UgYmFja2luZyBzd2FwIGRldmljZSwgaWYgcHJlc2VudCAqLworCWlmIChyenMtPmJhY2tpbmdfc3dhcCkgeworCQlpZiAoaXNfYmFja2luZ19ibGtkZXYpCisJCQliZF9yZWxlYXNlKHJ6cy0+YmFja2luZ19zd2FwKTsKKwkJZmlscF9jbG9zZShyenMtPnN3YXBfZmlsZSwgTlVMTCk7CisJCXJ6cy0+YmFja2luZ19zd2FwID0gTlVMTDsKKwl9CisKKwkvKiBSZXNldCBzdGF0cyAqLworCW1lbXNldCgmcnpzLT5zdGF0cywgMCwgc2l6ZW9mKHJ6cy0+c3RhdHMpKTsKKworCXJ6cy0+ZGlza3NpemUgPSAwOworCXJ6cy0+bWVtbGltaXQgPSAwOworCisJLyogQmFjayB0byB1bmluaXRpYWxpemVkIHN0YXRlICovCisJcnpzLT5pbml0X2RvbmUgPSAwOworfQorCitzdGF0aWMgaW50IHJhbXpzd2FwX2lvY3RsX2luaXRfZGV2aWNlKHN0cnVjdCByYW16c3dhcCAqcnpzKQoreworCWludCByZXQ7CisJc2l6ZV90IG51bV9wYWdlczsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bmlvbiBzd2FwX2hlYWRlciAqc3dhcF9oZWFkZXI7CisKKwlpZiAocnpzLT5pbml0X2RvbmUpIHsKKwkJcHJfaW5mbygiRGV2aWNlIGFscmVhZHkgaW5pdGlhbGl6ZWQhXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXQgPSBzZXR1cF9iYWNraW5nX3N3YXAocnpzKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisKKwlpZiAocnpzLT5iYWNraW5nX3N3YXApCisJCXJhbXpzd2FwX3NldF9tZW1saW1pdChyenMsIHRvdGFscmFtX3BhZ2VzIDw8IFBBR0VfU0hJRlQpOworCWVsc2UKKwkJcmFtenN3YXBfc2V0X2Rpc2tzaXplKHJ6cywgdG90YWxyYW1fcGFnZXMgPDwgUEFHRV9TSElGVCk7CisKKwlyenMtPmNvbXByZXNzX3dvcmttZW0gPSBremFsbG9jKExaTzFYX01FTV9DT01QUkVTUywgR0ZQX0tFUk5FTCk7CisJaWYgKCFyenMtPmNvbXByZXNzX3dvcmttZW0pIHsKKwkJcHJfZXJyKCJFcnJvciBhbGxvY2F0aW5nIGNvbXByZXNzb3Igd29ya2luZyBtZW1vcnkhXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCXJ6cy0+Y29tcHJlc3NfYnVmZmVyID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKF9fR0ZQX1pFUk8sIDEpOworCWlmICghcnpzLT5jb21wcmVzc19idWZmZXIpIHsKKwkJcHJfZXJyKCJFcnJvciBhbGxvY2F0aW5nIGNvbXByZXNzb3IgYnVmZmVyIHNwYWNlXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCW51bV9wYWdlcyA9IHJ6cy0+ZGlza3NpemUgPj4gUEFHRV9TSElGVDsKKwlyenMtPnRhYmxlID0gdm1hbGxvYyhudW1fcGFnZXMgKiBzaXplb2YoKnJ6cy0+dGFibGUpKTsKKwlpZiAoIXJ6cy0+dGFibGUpIHsKKwkJcHJfZXJyKCJFcnJvciBhbGxvY2F0aW5nIHJhbXpzd2FwIGFkZHJlc3MgdGFibGVcbiIpOworCQkvKiBUbyBwcmV2ZW50IGFjY2Vzc2luZyB0YWJsZSBlbnRyaWVzIGR1cmluZyBjbGVhbnVwICovCisJCXJ6cy0+ZGlza3NpemUgPSAwOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCW1lbXNldChyenMtPnRhYmxlLCAwLCBudW1fcGFnZXMgKiBzaXplb2YoKnJ6cy0+dGFibGUpKTsKKworCW1hcF9iYWNraW5nX3N3YXBfZXh0ZW50cyhyenMpOworCisJcGFnZSA9IGFsbG9jX3BhZ2UoX19HRlBfWkVSTyk7CisJaWYgKCFwYWdlKSB7CisJCXByX2VycigiRXJyb3IgYWxsb2NhdGluZyBzd2FwIGhlYWRlciBwYWdlXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKwlyenMtPnRhYmxlWzBdLnBhZ2UgPSBwYWdlOworCXJ6c19zZXRfZmxhZyhyenMsIDAsIFJaU19VTkNPTVBSRVNTRUQpOworCisJc3dhcF9oZWFkZXIgPSBrbWFwKHBhZ2UpOworCXJldCA9IHNldHVwX3N3YXBfaGVhZGVyKHJ6cywgc3dhcF9oZWFkZXIpOworCWt1bm1hcChwYWdlKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiRXJyb3Igc2V0dGluZyBzd2FwIGhlYWRlclxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlzZXRfY2FwYWNpdHkocnpzLT5kaXNrLCByenMtPmRpc2tzaXplID4+IFNFQ1RPUl9TSElGVCk7CisKKwkvKgorCSAqIFdlIGhhdmUgaWRlbnQgbWFwcGluZyBvZiBzZWN0b3JzIGZvciByYW16c3dhcCBhbmQKKwkgKiBhbmQgdGhlIGJhY2tpbmcgc3dhcCBkZXZpY2UuIFNvLCB0aGlzIHF1ZXVlIGZsYWcKKwkgKiBzaG91bGQgYmUgYWNjb3JkaW5nIHRvIGJhY2tpbmcgZGV2LgorCSAqLworCWlmICghcnpzLT5iYWNraW5nX3N3YXAgfHwKKwkJCWJsa19xdWV1ZV9ub25yb3QocnpzLT5iYWNraW5nX3N3YXAtPmJkX2Rpc2stPnF1ZXVlKSkKKwkJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19OT05ST1QsIHJ6cy0+ZGlzay0+cXVldWUpOworCisJcnpzLT5tZW1fcG9vbCA9IHh2X2NyZWF0ZV9wb29sKCk7CisJaWYgKCFyenMtPm1lbV9wb29sKSB7CisJCXByX2VycigiRXJyb3IgY3JlYXRpbmcgbWVtb3J5IHBvb2xcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJLyoKKwkgKiBQYWdlcyB0aGF0IGNvbXByZXNzIHRvIHNpemUgZ3JlYXRlciB0aGFuIHRoaXMgYXJlIGZvcndhcmRlZAorCSAqIHRvIHBoeXNpY2FsIHN3YXAgZGlzayAoaWYgYmFja2luZyBkZXYgaXMgcHJvdmlkZWQpCisJICogVE9ETzogbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZQorCSAqLworCWlmIChyenMtPmJhY2tpbmdfc3dhcCkKKwkJbWF4X3pwYWdlX3NpemUgPSBtYXhfenBhZ2Vfc2l6ZV9iZGV2OworCWVsc2UKKwkJbWF4X3pwYWdlX3NpemUgPSBtYXhfenBhZ2Vfc2l6ZV9ub2JkZXY7CisJcHJfZGVidWcoIk1heCBjb21wcmVzc2VkIHBhZ2Ugc2l6ZTogJXUgYnl0ZXNcbiIsIG1heF96cGFnZV9zaXplKTsKKworCXJ6cy0+aW5pdF9kb25lID0gMTsKKworCXByX2RlYnVnKCJJbml0aWFsaXphdGlvbiBkb25lIVxuIik7CisJcmV0dXJuIDA7CisKK2ZhaWw6CisJcmVzZXRfZGV2aWNlKHJ6cyk7CisKKwlwcl9lcnIoIkluaXRpYWxpemF0aW9uIGZhaWxlZDogZXJyPSVkXG4iLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmFtenN3YXBfaW9jdGxfcmVzZXRfZGV2aWNlKHN0cnVjdCByYW16c3dhcCAqcnpzKQoreworCWlmIChyenMtPmluaXRfZG9uZSkKKwkJcmVzZXRfZGV2aWNlKHJ6cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYW16c3dhcF9pb2N0bChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzaXplX3QgZGlza3NpemVfa2IsIG1lbWxpbWl0X2tiOworCisJc3RydWN0IHJhbXpzd2FwICpyenMgPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlpTSU9fU0VUX0RJU0tTSVpFX0tCOgorCQlpZiAocnpzLT5pbml0X2RvbmUpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmZGlza3NpemVfa2IsICh2b2lkICopYXJnLAorCQkJCQkJX0lPQ19TSVpFKGNtZCkpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJcnpzLT5kaXNrc2l6ZSA9IGRpc2tzaXplX2tiIDw8IDEwOworCQlwcl9pbmZvKCJEaXNrIHNpemUgc2V0IHRvICV6dSBrQlxuIiwgZGlza3NpemVfa2IpOworCQlicmVhazsKKworCWNhc2UgUlpTSU9fU0VUX01FTUxJTUlUX0tCOgorCQlpZiAocnpzLT5pbml0X2RvbmUpIHsKKwkJCS8qIFRPRE86IGFsbG93IGNoYW5naW5nIG1lbWxpbWl0ICovCisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIoJm1lbWxpbWl0X2tiLCAodm9pZCAqKWFyZywKKwkJCQkJCV9JT0NfU0laRShjbWQpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJ6cy0+bWVtbGltaXQgPSBtZW1saW1pdF9rYiA8PCAxMDsKKwkJcHJfaW5mbygiTWVtb3J5IGxpbWl0IHNldCB0byAlenUga0JcbiIsIG1lbWxpbWl0X2tiKTsKKwkJYnJlYWs7CisKKwljYXNlIFJaU0lPX1NFVF9CQUNLSU5HX1NXQVA6CisJCWlmIChyenMtPmluaXRfZG9uZSkgeworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnJ6cy0+YmFja2luZ19zd2FwX25hbWUsICh2b2lkICopYXJnLAorCQkJCQkJX0lPQ19TSVpFKGNtZCkpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJcnpzLT5iYWNraW5nX3N3YXBfbmFtZVtNQVhfU1dBUF9OQU1FX0xFTiAtIDFdID0gJ1wwJzsKKwkJcHJfaW5mbygiQmFja2luZyBzd2FwIHNldCB0byAlc1xuIiwgcnpzLT5iYWNraW5nX3N3YXBfbmFtZSk7CisJCWJyZWFrOworCisJY2FzZSBSWlNJT19HRVRfU1RBVFM6CisJeworCQlzdHJ1Y3QgcmFtenN3YXBfaW9jdGxfc3RhdHMgKnN0YXRzOworCQlpZiAoIXJ6cy0+aW5pdF9kb25lKSB7CisJCQlyZXQgPSAtRU5PVFRZOworCQkJZ290byBvdXQ7CisJCX0KKwkJc3RhdHMgPSBremFsbG9jKHNpemVvZigqc3RhdHMpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzdGF0cykgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJhbXpzd2FwX2lvY3RsX2dldF9zdGF0cyhyenMsIHN0YXRzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgc3RhdHMsIHNpemVvZigqc3RhdHMpKSkgeworCQkJa2ZyZWUoc3RhdHMpOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWtmcmVlKHN0YXRzKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgUlpTSU9fSU5JVDoKKwkJcmV0ID0gcmFtenN3YXBfaW9jdGxfaW5pdF9kZXZpY2UocnpzKTsKKwkJYnJlYWs7CisKKwljYXNlIFJaU0lPX1JFU0VUOgorCQkvKiBEbyBub3QgcmVzZXQgYW4gYWN0aXZlIGRldmljZSEgKi8KKwkJaWYgKGJkZXYtPmJkX2hvbGRlcnMpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJldCA9IHJhbXpzd2FwX2lvY3RsX3Jlc2V0X2RldmljZShyenMpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByX2luZm8oIkludmFsaWQgaW9jdGwgJXVcbiIsIGNtZCk7CisJCXJldCA9IC1FTk9UVFk7CisJfQorCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyByYW16c3dhcF9kZXZvcHMgPSB7CisJLmlvY3RsID0gcmFtenN3YXBfaW9jdGwsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgdm9pZCBjcmVhdGVfZGV2aWNlKHN0cnVjdCByYW16c3dhcCAqcnpzLCBpbnQgZGV2aWNlX2lkKQoreworCW11dGV4X2luaXQoJnJ6cy0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnJ6cy0+YmFja2luZ19zd2FwX2V4dGVudF9saXN0KTsKKworCXJ6cy0+cXVldWUgPSBibGtfYWxsb2NfcXVldWUoR0ZQX0tFUk5FTCk7CisJaWYgKCFyenMtPnF1ZXVlKSB7CisJCXByX2VycigiRXJyb3IgYWxsb2NhdGluZyBkaXNrIHF1ZXVlIGZvciBkZXZpY2UgJWRcbiIsCisJCQlkZXZpY2VfaWQpOworCQlyZXR1cm47CisJfQorCisJYmxrX3F1ZXVlX21ha2VfcmVxdWVzdChyenMtPnF1ZXVlLCByYW16c3dhcF9tYWtlX3JlcXVlc3QpOworCXJ6cy0+cXVldWUtPnF1ZXVlZGF0YSA9IHJ6czsKKworCSAvKiBnZW5kaXNrIHN0cnVjdHVyZSAqLworCXJ6cy0+ZGlzayA9IGFsbG9jX2Rpc2soMSk7CisJaWYgKCFyenMtPmRpc2spIHsKKwkJYmxrX2NsZWFudXBfcXVldWUocnpzLT5xdWV1ZSk7CisJCXByX3dhcm5pbmcoIkVycm9yIGFsbG9jYXRpbmcgZGlzayBzdHJ1Y3R1cmUgZm9yIGRldmljZSAlZFxuIiwKKwkJCWRldmljZV9pZCk7CisJCXJldHVybjsKKwl9CisKKwlyenMtPmRpc2stPm1ham9yID0gcmFtenN3YXBfbWFqb3I7CisJcnpzLT5kaXNrLT5maXJzdF9taW5vciA9IGRldmljZV9pZDsKKwlyenMtPmRpc2stPmZvcHMgPSAmcmFtenN3YXBfZGV2b3BzOworCXJ6cy0+ZGlzay0+cXVldWUgPSByenMtPnF1ZXVlOworCXJ6cy0+ZGlzay0+cHJpdmF0ZV9kYXRhID0gcnpzOworCXNucHJpbnRmKHJ6cy0+ZGlzay0+ZGlza19uYW1lLCAxNiwgInJhbXpzd2FwJWQiLCBkZXZpY2VfaWQpOworCisJLyoKKwkgKiBBY3R1YWwgY2FwYWNpdHkgc2V0IHVzaW5nIFJaU0lPX1NFVF9ESVNLU0laRV9LQiBpb2N0bAorCSAqIG9yIHNldCBlcXVhbCB0byBiYWNraW5nIHN3YXAgZGV2aWNlIChpZiBwcm92aWRlZCkKKwkgKi8KKwlzZXRfY2FwYWNpdHkocnpzLT5kaXNrLCAwKTsKKwlhZGRfZGlzayhyenMtPmRpc2spOworCisJcnpzLT5pbml0X2RvbmUgPSAwOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2RldmljZShzdHJ1Y3QgcmFtenN3YXAgKnJ6cykKK3sKKwlpZiAocnpzLT5kaXNrKSB7CisJCWRlbF9nZW5kaXNrKHJ6cy0+ZGlzayk7CisJCXB1dF9kaXNrKHJ6cy0+ZGlzayk7CisJfQorCisJaWYgKHJ6cy0+cXVldWUpCisJCWJsa19jbGVhbnVwX3F1ZXVlKHJ6cy0+cXVldWUpOworfQorCitzdGF0aWMgaW50IF9faW5pdCByYW16c3dhcF9pbml0KHZvaWQpCit7CisJaW50IGksIHJldDsKKworCWlmIChudW1fZGV2aWNlcyA+IG1heF9udW1fZGV2aWNlcykgeworCQlwcl93YXJuaW5nKCJJbnZhbGlkIHZhbHVlIGZvciBudW1fZGV2aWNlczogJXVcbiIsCisJCQkJbnVtX2RldmljZXMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYW16c3dhcF9tYWpvciA9IHJlZ2lzdGVyX2Jsa2RldigwLCAicmFtenN3YXAiKTsKKwlpZiAocmFtenN3YXBfbWFqb3IgPD0gMCkgeworCQlwcl93YXJuaW5nKCJVbmFibGUgdG8gZ2V0IG1ham9yIG51bWJlclxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKCFudW1fZGV2aWNlcykgeworCQlwcl9pbmZvKCJudW1fZGV2aWNlcyBub3Qgc3BlY2lmaWVkLiBVc2luZyBkZWZhdWx0OiAxXG4iKTsKKwkJbnVtX2RldmljZXMgPSAxOworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBkZXZpY2UgYXJyYXkgYW5kIGluaXRpYWxpemUgZWFjaCBvbmUgKi8KKwlwcl9pbmZvKCJDcmVhdGluZyAldSBkZXZpY2VzIC4uLlxuIiwgbnVtX2RldmljZXMpOworCWRldmljZXMgPSBremFsbG9jKG51bV9kZXZpY2VzICogc2l6ZW9mKHN0cnVjdCByYW16c3dhcCksIEdGUF9LRVJORUwpOworCWlmICghZGV2aWNlcykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2RldmljZXM7IGkrKykKKwkJY3JlYXRlX2RldmljZSgmZGV2aWNlc1tpXSwgaSk7CisKKwlyZXR1cm4gMDsKK291dDoKKwl1bnJlZ2lzdGVyX2Jsa2RldihyYW16c3dhcF9tYWpvciwgInJhbXpzd2FwIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHJhbXpzd2FwX2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcmFtenN3YXAgKnJ6czsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fZGV2aWNlczsgaSsrKSB7CisJCXJ6cyA9ICZkZXZpY2VzW2ldOworCisJCWRlc3Ryb3lfZGV2aWNlKHJ6cyk7CisJCWlmIChyenMtPmluaXRfZG9uZSkKKwkJCXJlc2V0X2RldmljZShyenMpOworCX0KKworCXVucmVnaXN0ZXJfYmxrZGV2KHJhbXpzd2FwX21ham9yLCAicmFtenN3YXAiKTsKKworCWtmcmVlKGRldmljZXMpOworCXByX2RlYnVnKCJDbGVhbnVwIGRvbmUhXG4iKTsKK30KKworbW9kdWxlX3BhcmFtKG51bV9kZXZpY2VzLCB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobnVtX2RldmljZXMsICJOdW1iZXIgb2YgcmFtenN3YXAgZGV2aWNlcyIpOworCittb2R1bGVfaW5pdChyYW16c3dhcF9pbml0KTsKK21vZHVsZV9leGl0KHJhbXpzd2FwX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfQVVUSE9SKCJOaXRpbiBHdXB0YSA8bmd1cHRhQHZmbGFyZS5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbXByZXNzZWQgUkFNIEJhc2VkIFN3YXAgRGV2aWNlIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXBfZHJ2LmggYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXBfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZlYTI0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9yYW16c3dhcF9kcnYuaApAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIENvbXByZXNzZWQgUkFNIGJhc2VkIHN3YXAgZGV2aWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5ICBOaXRpbiBHdXB0YQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1c2luZyBhIGR1YWwgbGljZW5zZSBzdHJhdGVneTogQlNEL0dQTAorICogWW91IGNhbiBjaG9vc2UgdGhlIGxpY2VuY2UgdGhhdCBiZXR0ZXIgZml0cyB5b3VyIHJlcXVpcmVtZW50cy4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgMy1jbGF1c2UgQlNEIExpY2Vuc2UKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMAorICoKKyAqIFByb2plY3QgaG9tZTogaHR0cDovL2NvbXBjYWNoZS5nb29nbGVjb2RlLmNvbQorICovCisKKyNpZm5kZWYgX1JBTVpTV0FQX0RSVl9IXworI2RlZmluZSBfUkFNWlNXQVBfRFJWX0hfCisKKyNpbmNsdWRlICJyYW16c3dhcF9pb2N0bC5oIgorI2luY2x1ZGUgInh2bWFsbG9jLmgiCisKKy8qCisgKiBTb21lIGFyYml0cmFyeSB2YWx1ZS4gVGhpcyBpcyBqdXN0IHRvIGNhdGNoCisgKiBpbnZhbGlkIHZhbHVlIGZvciBudW1fZGV2aWNlcyBtb2R1bGUgcGFyYW1ldGVyLgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF4X251bV9kZXZpY2VzID0gMzI7CisKKy8qCisgKiBTdG9yZWQgYXQgYmVnaW5uaW5nIG9mIGVhY2ggY29tcHJlc3NlZCBvYmplY3QuCisgKgorICogSXQgc3RvcmVzIGJhY2stcmVmZXJlbmNlIHRvIHRhYmxlIGVudHJ5IHdoaWNoIHBvaW50cyB0byB0aGlzCisgKiBvYmplY3QuIFRoaXMgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBtZW1vcnkgZGVmcmFnbWVudGF0aW9uIG9yCisgKiBtaWdyYXRpbmcgY29tcHJlc3NlZCBwYWdlcyB0byBiYWNraW5nIHN3YXAgZGlzay4KKyAqLworc3RydWN0IHpvYmpfaGVhZGVyIHsKKyNpZiAwCisJdTMyIHRhYmxlX2lkeDsKKyNlbmRpZgorfTsKKworLyotLSBDb25maWd1cmFibGUgcGFyYW1ldGVycyAqLworCisvKiBEZWZhdWx0IHJhbXpzd2FwIGRpc2sgc2l6ZTogMjUlIG9mIHRvdGFsIFJBTSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRlZmF1bHRfZGlza3NpemVfcGVyY19yYW0gPSAyNTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkZWZhdWx0X21lbWxpbWl0X3BlcmNfcmFtID0gMTU7CisKKy8qCisgKiBNYXggY29tcHJlc3NlZCBwYWdlIHNpemUgd2hlbiBiYWNraW5nIGRldmljZSBpcyBwcm92aWRlZC4KKyAqIFBhZ2VzIHRoYXQgY29tcHJlc3MgdG8gc2l6ZSBncmVhdGVyIHRoYW4gdGhpcyBhcmUgc2VudCB0bworICogcGh5c2ljYWwgc3dhcCBkaXNrLgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF4X3pwYWdlX3NpemVfYmRldiA9IFBBR0VfU0laRSAvIDI7CisKKy8qCisgKiBNYXggY29tcHJlc3NlZCBwYWdlIHNpemUgd2hlbiB0aGVyZSBpcyBubyBiYWNraW5nIGRldi4KKyAqIFBhZ2VzIHRoYXQgY29tcHJlc3MgdG8gc2l6ZSBncmVhdGVyIHRoYW4gdGhpcyBhcmUgc3RvcmVkCisgKiB1bmNvbXByZXNzZWQgaW4gbWVtb3J5LgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF4X3pwYWdlX3NpemVfbm9iZGV2ID0gUEFHRV9TSVpFIC8gNCAqIDM7CisKKy8qCisgKiBOT1RFOiBtYXhfenBhZ2Vfc2l6ZV97YmRldixub2JkZXZ9IHNpemVzIG11c3QgYmUKKyAqIGxlc3MgdGhhbiBvciBlcXVhbCB0bzoKKyAqICAgWFZfTUFYX0FMTE9DX1NJWkUgLSBzaXplb2Yoc3RydWN0IHpvYmpfaGVhZGVyKQorICogc2luY2Ugb3RoZXJ3aXNlIHh2X21hbGxvYyB3b3VsZCBhbHdheXMgcmV0dXJuIGZhaWx1cmUuCisgKi8KKworLyotLSBFbmQgb2YgY29uZmlndXJhYmxlIHBhcmFtcyAqLworCisjZGVmaW5lIFNFQ1RPUl9TSElGVAkJOQorI2RlZmluZSBTRUNUT1JfU0laRQkJKDEgPDwgU0VDVE9SX1NISUZUKQorI2RlZmluZSBTRUNUT1JTX1BFUl9QQUdFX1NISUZUCShQQUdFX1NISUZUIC0gU0VDVE9SX1NISUZUKQorI2RlZmluZSBTRUNUT1JTX1BFUl9QQUdFCSgxIDw8IFNFQ1RPUlNfUEVSX1BBR0VfU0hJRlQpCisKKy8qIERlYnVnZ2luZyBhbmQgU3RhdHMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19SQU1aU1dBUF9TVEFUUykKKyNkZWZpbmUgc3RhdF9pbmMoc3RhdCkJKChzdGF0KSsrKQorI2RlZmluZSBzdGF0X2RlYyhzdGF0KQkoKHN0YXQpLS0pCisjZWxzZQorI2RlZmluZSBzdGF0X2luYyh4KQorI2RlZmluZSBzdGF0X2RlYyh4KQorI2VuZGlmCisKKy8qIEZsYWdzIGZvciByYW16c3dhcCBwYWdlcyAodGFibGVbcGFnZV9ub10uZmxhZ3MpICovCitlbnVtIHJ6c19wYWdlZmxhZ3MgeworCS8qIFBhZ2UgaXMgc3RvcmVkIHVuY29tcHJlc3NlZCAqLworCVJaU19VTkNPTVBSRVNTRUQsCisKKwkvKiBQYWdlIGNvbnNpc3RzIGVudGlyZWx5IG9mIHplcm9zICovCisJUlpTX1pFUk8sCisKKwlfX05SX1JaU19QQUdFRkxBR1MsCit9OworCisvKi0tIERhdGEgc3RydWN0dXJlcyAqLworCisvKgorICogQWxsb2NhdGVkIGZvciBlYWNoIHN3YXAgc2xvdCwgaW5kZXhlZCBieSBwYWdlIG5vLgorICogVGhlc2UgdGFibGUgZW50cmllcyBtdXN0IGZpdCBleGFjdGx5IGluIGEgcGFnZS4KKyAqLworc3RydWN0IHRhYmxlIHsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1MTYgb2Zmc2V0OworCXU4IGNvdW50OwkvKiBvYmplY3QgcmVmIGNvdW50IChub3QgeWV0IHVzZWQpICovCisJdTggZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKTs7CisKKy8qCisgKiBTd2FwIGV4dGVudCBpbmZvcm1hdGlvbiBpbiBjYXNlIGJhY2tpbmcgc3dhcCBpcyBhIHJlZ3VsYXIKKyAqIGZpbGUuIFRoZXNlIGV4dGVudCBlbnRyaWVzIG11c3QgZml0IGV4YWN0bHkgaW4gYSBwYWdlLgorICovCitzdHJ1Y3QgcmFtenN3YXBfYmFja2luZ19leHRlbnQgeworCXBnb2ZmX3QgcGh5X3BhZ2VudW07CisJcGdvZmZfdCBudW1fcGFnZXM7Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKTsKKworc3RydWN0IHJhbXpzd2FwX3N0YXRzIHsKKwkvKiBiYXNpYyBzdGF0cyAqLworCXNpemVfdCBjb21wcl9zaXplOwkvKiBjb21wcmVzc2VkIHNpemUgb2YgcGFnZXMgc3RvcmVkIC0KKwkJCQkgKiBuZWVkZWQgdG8gZW5mb3JjZSBtZW1saW1pdCAqLworCS8qIG1vcmUgc3RhdHMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19SQU1aU1dBUF9TVEFUUykKKwl1NjQgbnVtX3JlYWRzOwkJLyogZmFpbGVkICsgc3VjY2Vzc2Z1bCAqLworCXU2NCBudW1fd3JpdGVzOwkJLyogLS1kby0tICovCisJdTY0IGZhaWxlZF9yZWFkczsJLyogY2FuIGhhcHBlbiB3aGVuIG1lbW9yeSBpcyB0b28gbG93ICovCisJdTY0IGZhaWxlZF93cml0ZXM7CS8qIHNob3VsZCBORVZFUiEgaGFwcGVuICovCisJdTY0IGludmFsaWRfaW87CQkvKiBub24tc3dhcCBJL08gcmVxdWVzdHMgKi8KKwl1MzIgcGFnZXNfemVybzsJCS8qIG5vLiBvZiB6ZXJvIGZpbGxlZCBwYWdlcyAqLworCXUzMiBwYWdlc19zdG9yZWQ7CS8qIG5vLiBvZiBwYWdlcyBjdXJyZW50bHkgc3RvcmVkICovCisJdTMyIGdvb2RfY29tcHJlc3M7CS8qICUgb2YgcGFnZXMgd2l0aCBjb21wcmVzc2lvbiByYXRpbzw9NTAlICovCisJdTMyIHBhZ2VzX2V4cGFuZDsJLyogJSBvZiBpbmNvbXByZXNzaWJsZSBwYWdlcyAqLworCXU2NCBiZGV2X251bV9yZWFkczsJLyogbm8uIG9mIHJlYWRzIG9uIGJhY2tpbmcgZGV2ICovCisJdTY0IGJkZXZfbnVtX3dyaXRlczsJLyogbm8uIG9mIHdyaXRlcyBvbiBiYWNraW5nIGRldiAqLworI2VuZGlmCit9OworCitzdHJ1Y3QgcmFtenN3YXAgeworCXN0cnVjdCB4dl9wb29sICptZW1fcG9vbDsKKwl2b2lkICpjb21wcmVzc193b3JrbWVtOworCXZvaWQgKmNvbXByZXNzX2J1ZmZlcjsKKwlzdHJ1Y3QgdGFibGUgKnRhYmxlOworCXN0cnVjdCBtdXRleCBsb2NrOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKKwlpbnQgaW5pdF9kb25lOworCS8qCisJICogVGhpcyBpcyBsaW1pdCBvbiBjb21wcmVzc2VkIGRhdGEgc2l6ZSAoc3RhdHMuY29tcHJfc2l6ZSkKKwkgKiBJdHMgYXBwbGljYWJsZSBvbmx5IHdoZW4gYmFja2luZyBzd2FwIGRldmljZSBpcyBwcmVzZW50LgorCSAqLworCXNpemVfdCBtZW1saW1pdDsJLyogYnl0ZXMgKi8KKwkvKgorCSAqIFRoaXMgaXMgbGltaXQgb24gYW1vdW50IG9mICp1bmNvbXByZXNzZWQqIHdvcnRoIG9mIGRhdGEKKwkgKiB3ZSBjYW4gaG9sZC4gV2hlbiBiYWNraW5nIHN3YXAgZGV2aWNlIGlzIHByb3ZpZGVkLCBpdCBpcworCSAqIHNldCBlcXVhbCB0byBkZXZpY2Ugc2l6ZS4KKwkgKi8KKwlzaXplX3QgZGlza3NpemU7CS8qIGJ5dGVzICovCisKKwlzdHJ1Y3QgcmFtenN3YXBfc3RhdHMgc3RhdHM7CisKKwkvKiBiYWNraW5nIHN3YXAgZGV2aWNlIGluZm8gKi8KKwlzdHJ1Y3QgcmFtenN3YXBfYmFja2luZ19leHRlbnQgKmN1cnJfZXh0ZW50OworCXN0cnVjdCBsaXN0X2hlYWQgYmFja2luZ19zd2FwX2V4dGVudF9saXN0OworCXVuc2lnbmVkIGxvbmcgbnVtX2V4dGVudHM7CisJY2hhciBiYWNraW5nX3N3YXBfbmFtZVtNQVhfU1dBUF9OQU1FX0xFTl07CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmFja2luZ19zd2FwOworCXN0cnVjdCBmaWxlICpzd2FwX2ZpbGU7Cit9OworCisvKi0tICovCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXBfaW9jdGwuaCBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9yYW16c3dhcF9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MTNhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXBfaW9jdGwuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29tcHJlc3NlZCBSQU0gYmFzZWQgc3dhcCBkZXZpY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgIE5pdGluIEd1cHRhCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVzaW5nIGEgZHVhbCBsaWNlbnNlIHN0cmF0ZWd5OiBCU0QvR1BMCisgKiBZb3UgY2FuIGNob29zZSB0aGUgbGljZW5jZSB0aGF0IGJldHRlciBmaXRzIHlvdXIgcmVxdWlyZW1lbnRzLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiAzLWNsYXVzZSBCU0QgTGljZW5zZQorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wCisgKgorICogUHJvamVjdCBob21lOiBodHRwOi8vY29tcGNhY2hlLmdvb2dsZWNvZGUuY29tCisgKi8KKworI2lmbmRlZiBfUkFNWlNXQVBfSU9DVExfSF8KKyNkZWZpbmUgX1JBTVpTV0FQX0lPQ1RMX0hfCisKKyNkZWZpbmUgTUFYX1NXQVBfTkFNRV9MRU4gMTI4CisKK3N0cnVjdCByYW16c3dhcF9pb2N0bF9zdGF0cyB7CisJY2hhciBiYWNraW5nX3N3YXBfbmFtZVtNQVhfU1dBUF9OQU1FX0xFTl07CisJdTY0IG1lbWxpbWl0OwkJLyogb25seSBhcHBsaWNhYmxlIGlmIGJhY2tpbmcgc3dhcCBwcmVzZW50ICovCisJdTY0IGRpc2tzaXplOwkJLyogdXNlciBzcGVjaWZpZWQgb3IgZXF1YWwgdG8gYmFja2luZyBzd2FwCisJCQkJICogc2l6ZSAoaWYgcHJlc2VudCkgKi8KKwl1NjQgbnVtX3JlYWRzOwkJLyogZmFpbGVkICsgc3VjY2Vzc2Z1bCAqLworCXU2NCBudW1fd3JpdGVzOwkJLyogLS1kby0tICovCisJdTY0IGZhaWxlZF9yZWFkczsJLyogY2FuIGhhcHBlbiB3aGVuIG1lbW9yeSBpcyB0b28gbG93ICovCisJdTY0IGZhaWxlZF93cml0ZXM7CS8qIHNob3VsZCBORVZFUiEgaGFwcGVuICovCisJdTY0IGludmFsaWRfaW87CQkvKiBub24tc3dhcCBJL08gcmVxdWVzdHMgKi8KKwl1MzIgcGFnZXNfemVybzsJCS8qIG5vLiBvZiB6ZXJvIGZpbGxlZCBwYWdlcyAqLworCXUzMiBnb29kX2NvbXByZXNzX3BjdDsJLyogbm8uIG9mIHBhZ2VzIHdpdGggY29tcHJlc3Npb24gcmF0aW88PTUwJSAqLworCXUzMiBwYWdlc19leHBhbmRfcGN0OwkvKiBuby4gb2YgaW5jb21wcmVzc2libGUgcGFnZXMgKi8KKwl1MzIgcGFnZXNfc3RvcmVkOworCXUzMiBwYWdlc191c2VkOworCXU2NCBvcmlnX2RhdGFfc2l6ZTsKKwl1NjQgY29tcHJfZGF0YV9zaXplOworCXU2NCBtZW1fdXNlZF90b3RhbDsKKwl1NjQgYmRldl9udW1fcmVhZHM7CS8qIG5vLiBvZiByZWFkcyBvbiBiYWNraW5nIGRldiAqLworCXU2NCBiZGV2X251bV93cml0ZXM7CS8qIG5vLiBvZiB3cml0ZXMgb24gYmFja2luZyBkZXYgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCwgYWxpZ25lZCg0KSkpOworCisjZGVmaW5lIFJaU0lPX1NFVF9ESVNLU0laRV9LQglfSU9XKCd6JywgMCwgc2l6ZV90KQorI2RlZmluZSBSWlNJT19TRVRfTUVNTElNSVRfS0IJX0lPVygneicsIDEsIHNpemVfdCkKKyNkZWZpbmUgUlpTSU9fU0VUX0JBQ0tJTkdfU1dBUAlfSU9XKCd6JywgMiwgdW5zaWduZWQgY2hhcltNQVhfU1dBUF9OQU1FX0xFTl0pCisjZGVmaW5lIFJaU0lPX0dFVF9TVEFUUwkJX0lPUigneicsIDMsIHN0cnVjdCByYW16c3dhcF9pb2N0bF9zdGF0cykKKyNkZWZpbmUgUlpTSU9fSU5JVAkJX0lPKCd6JywgNCkKKyNkZWZpbmUgUlpTSU9fUkVTRVQJCV9JTygneicsIDUpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3h2bWFsbG9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAveHZtYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2U5ODZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3h2bWFsbG9jLmMKQEAgLTAsMCArMSw1MDcgQEAKKy8qCisgKiB4dm1hbGxvYyBtZW1vcnkgYWxsb2NhdG9yCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5ICBOaXRpbiBHdXB0YQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1c2luZyBhIGR1YWwgbGljZW5zZSBzdHJhdGVneTogQlNEL0dQTAorICogWW91IGNhbiBjaG9vc2UgdGhlIGxpY2VuY2UgdGhhdCBiZXR0ZXIgZml0cyB5b3VyIHJlcXVpcmVtZW50cy4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgMy1jbGF1c2UgQlNEIExpY2Vuc2UKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMAorICovCisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAieHZtYWxsb2MuaCIKKyNpbmNsdWRlICJ4dm1hbGxvY19pbnQuaCIKKworc3RhdGljIHZvaWQgc3RhdF9pbmModTY0ICp2YWx1ZSkKK3sKKwkqdmFsdWUgPSAqdmFsdWUgKyAxOworfQorCitzdGF0aWMgdm9pZCBzdGF0X2RlYyh1NjQgKnZhbHVlKQoreworCSp2YWx1ZSA9ICp2YWx1ZSAtIDE7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9mbGFnKHN0cnVjdCBibG9ja19oZWFkZXIgKmJsb2NrLCBlbnVtIGJsb2NrZmxhZ3MgZmxhZykKK3sKKwlyZXR1cm4gYmxvY2stPnByZXYgJiBCSVQoZmxhZyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mbGFnKHN0cnVjdCBibG9ja19oZWFkZXIgKmJsb2NrLCBlbnVtIGJsb2NrZmxhZ3MgZmxhZykKK3sKKwlibG9jay0+cHJldiB8PSBCSVQoZmxhZyk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2ZsYWcoc3RydWN0IGJsb2NrX2hlYWRlciAqYmxvY2ssIGVudW0gYmxvY2tmbGFncyBmbGFnKQoreworCWJsb2NrLT5wcmV2ICY9IH5CSVQoZmxhZyk7Cit9CisKKy8qCisgKiBHaXZlbiA8cGFnZSwgb2Zmc2V0PiBwYWlyLCBwcm92aWRlIGEgZGVyZWZyZW5jYWJsZSBwb2ludGVyLgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSB4dl9tYWxsb2MveHZfZnJlZSBwYXRoLCBzbyBpdAorICogbmVlZHMgdG8gYmUgZmFzdC4KKyAqLworc3RhdGljIHZvaWQgKmdldF9wdHJfYXRvbWljKHN0cnVjdCBwYWdlICpwYWdlLCB1MTYgb2Zmc2V0LCBlbnVtIGttX3R5cGUgdHlwZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpiYXNlOworCisJYmFzZSA9IGttYXBfYXRvbWljKHBhZ2UsIHR5cGUpOworCXJldHVybiBiYXNlICsgb2Zmc2V0OworfQorCitzdGF0aWMgdm9pZCBwdXRfcHRyX2F0b21pYyh2b2lkICpwdHIsIGVudW0ga21fdHlwZSB0eXBlKQoreworCWt1bm1hcF9hdG9taWMocHRyLCB0eXBlKTsKK30KKworc3RhdGljIHUzMiBnZXRfYmxvY2twcmV2KHN0cnVjdCBibG9ja19oZWFkZXIgKmJsb2NrKQoreworCXJldHVybiBibG9jay0+cHJldiAmIFBSRVZfTUFTSzsKK30KKworc3RhdGljIHZvaWQgc2V0X2Jsb2NrcHJldihzdHJ1Y3QgYmxvY2tfaGVhZGVyICpibG9jaywgdTE2IG5ld19vZmZzZXQpCit7CisJYmxvY2stPnByZXYgPSBuZXdfb2Zmc2V0IHwgKGJsb2NrLT5wcmV2ICYgRkxBR1NfTUFTSyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfaGVhZGVyICpCTE9DS19ORVhUKHN0cnVjdCBibG9ja19oZWFkZXIgKmJsb2NrKQoreworCXJldHVybiAoc3RydWN0IGJsb2NrX2hlYWRlciAqKQorCQkoKGNoYXIgKilibG9jayArIGJsb2NrLT5zaXplICsgWFZfQUxJR04pOworfQorCisvKgorICogR2V0IGluZGV4IG9mIGZyZWUgbGlzdCBjb250YWluaW5nIGJsb2NrcyBvZiBtYXhpbXVtIHNpemUKKyAqIHdoaWNoIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBnaXZlbiBzaXplLgorICovCitzdGF0aWMgdTMyIGdldF9pbmRleF9mb3JfaW5zZXJ0KHUzMiBzaXplKQoreworCWlmICh1bmxpa2VseShzaXplID4gWFZfTUFYX0FMTE9DX1NJWkUpKQorCQlzaXplID0gWFZfTUFYX0FMTE9DX1NJWkU7CisJc2l6ZSAmPSB+RkxfREVMVEFfTUFTSzsKKwlyZXR1cm4gKHNpemUgLSBYVl9NSU5fQUxMT0NfU0laRSkgPj4gRkxfREVMVEFfU0hJRlQ7Cit9CisKKy8qCisgKiBHZXQgaW5kZXggb2YgZnJlZSBsaXN0IGhhdmluZyBibG9ja3Mgb2Ygc2l6ZSBncmVhdGVyIHRoYW4KKyAqIG9yIGVxdWFsIHRvIHJlcXVlc3RlZCBzaXplLgorICovCitzdGF0aWMgdTMyIGdldF9pbmRleCh1MzIgc2l6ZSkKK3sKKwlpZiAodW5saWtlbHkoc2l6ZSA8IFhWX01JTl9BTExPQ19TSVpFKSkKKwkJc2l6ZSA9IFhWX01JTl9BTExPQ19TSVpFOworCXNpemUgPSBBTElHTihzaXplLCBGTF9ERUxUQSk7CisJcmV0dXJuIChzaXplIC0gWFZfTUlOX0FMTE9DX1NJWkUpID4+IEZMX0RFTFRBX1NISUZUOworfQorCisvKioKKyAqIGZpbmRfYmxvY2sgLSBmaW5kIGJsb2NrIG9mIGF0IGxlYXN0IGdpdmVuIHNpemUKKyAqIEBwb29sOiBtZW1vcnkgcG9vbCB0byBzZWFyY2ggZnJvbQorICogQHNpemU6IHNpemUgb2YgYmxvY2sgcmVxdWlyZWQKKyAqIEBwYWdlOiBwYWdlIGNvbnRhaW5pbmcgcmVxdWlyZWQgYmxvY2sKKyAqIEBvZmZzZXQ6IG9mZnNldCB3aXRoaW4gdGhlIHBhZ2Ugd2hlcmUgYmxvY2sgaXMgbG9jYXRlZC4KKyAqCisgKiBTZWFyY2hlcyB0d28gbGV2ZWwgYml0bWFwIHRvIGxvY2F0ZSBibG9jayBvZiBhdCBsZWFzdAorICogdGhlIGdpdmVuIHNpemUuIElmIHN1Y2ggYSBibG9jayBpcyBmb3VuZCwgaXQgcHJvdmlkZXMKKyAqIDxwYWdlLCBvZmZzZXQ+IHRvIGlkZW50aWZ5IHRoaXMgYmxvY2sgYW5kIHJldHVybnMgaW5kZXgKKyAqIGluIGZyZWVsaXN0IHdoZXJlIHdlIGZvdW5kIHRoaXMgYmxvY2suCisgKiBPdGhlcndpc2UsIHJldHVybnMgMCBhbmQgPHBhZ2UsIG9mZnNldD4gcGFyYW1zIGFyZSBub3QgdG91Y2hlZC4KKyAqLworc3RhdGljIHUzMiBmaW5kX2Jsb2NrKHN0cnVjdCB4dl9wb29sICpwb29sLCB1MzIgc2l6ZSwKKwkJCXN0cnVjdCBwYWdlICoqcGFnZSwgdTMyICpvZmZzZXQpCit7CisJdWxvbmcgZmxiaXRtYXAsIHNsYml0bWFwOworCXUzMiBmbGluZGV4LCBzbGluZGV4LCBzbGJpdHN0YXJ0OworCisJLyogVGhlcmUgYXJlIG5vIGZyZWUgYmxvY2tzIGluIHRoaXMgcG9vbCAqLworCWlmICghcG9vbC0+ZmxiaXRtYXApCisJCXJldHVybiAwOworCisJLyogR2V0IGZyZWVsaXN0IGluZGV4IGNvcnJlc3BvZGluZyB0byB0aGlzIHNpemUgKi8KKwlzbGluZGV4ID0gZ2V0X2luZGV4KHNpemUpOworCXNsYml0bWFwID0gcG9vbC0+c2xiaXRtYXBbc2xpbmRleCAvIEJJVFNfUEVSX0xPTkddOworCXNsYml0c3RhcnQgPSBzbGluZGV4ICUgQklUU19QRVJfTE9ORzsKKworCS8qCisJICogSWYgZnJlZWxpc3QgaXMgbm90IGVtcHR5IGF0IHRoaXMgaW5kZXgsIHdlIGZvdW5kIHRoZQorCSAqIGJsb2NrIC0gaGVhZCBvZiB0aGlzIGxpc3QuIFRoaXMgaXMgYXBwcm94aW1hdGUgYmVzdC1maXQgbWF0Y2guCisJICovCisJaWYgKHRlc3RfYml0KHNsYml0c3RhcnQsICZzbGJpdG1hcCkpIHsKKwkJKnBhZ2UgPSBwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5wYWdlOworCQkqb2Zmc2V0ID0gcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ub2Zmc2V0OworCQlyZXR1cm4gc2xpbmRleDsKKwl9CisKKwkvKgorCSAqIE5vIGJlc3QtZml0IGZvdW5kLiBTZWFyY2ggYSBiaXQgZnVydGhlciBpbiBiaXRtYXAgZm9yIGEgZnJlZSBibG9jay4KKwkgKiBTZWNvbmQgbGV2ZWwgYml0bWFwIGNvbnNpc3RzIG9mIHNlcmllcyBvZiAzMi1iaXQgY2h1bmtzLiBTZWFyY2gKKwkgKiBmdXJ0aGVyIGluIHRoZSBjaHVuayB3aGVyZSB3ZSBleHBlY3RlZCBhIGJlc3QtZml0LCBzdGFydGluZyBmcm9tCisJICogaW5kZXggbG9jYXRpb24gZm91bmQgYWJvdmUuCisJICovCisJc2xiaXRzdGFydCsrOworCXNsYml0bWFwID4+PSBzbGJpdHN0YXJ0OworCisJLyogU2tpcCB0aGlzIHNlYXJjaCBpZiB3ZSB3ZXJlIGFscmVhZHkgYXQgZW5kIG9mIHRoaXMgYml0bWFwIGNodW5rICovCisJaWYgKChzbGJpdHN0YXJ0ICE9IEJJVFNfUEVSX0xPTkcpICYmIHNsYml0bWFwKSB7CisJCXNsaW5kZXggKz0gX19mZnMoc2xiaXRtYXApICsgMTsKKwkJKnBhZ2UgPSBwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5wYWdlOworCQkqb2Zmc2V0ID0gcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ub2Zmc2V0OworCQlyZXR1cm4gc2xpbmRleDsKKwl9CisKKwkvKiBOb3cgZG8gYSBmdWxsIHR3by1sZXZlbCBiaXRtYXAgc2VhcmNoIHRvIGZpbmQgbmV4dCBuZWFyZXN0IGZpdCAqLworCWZsaW5kZXggPSBzbGluZGV4IC8gQklUU19QRVJfTE9ORzsKKworCWZsYml0bWFwID0gKHBvb2wtPmZsYml0bWFwKSA+PiAoZmxpbmRleCArIDEpOworCWlmICghZmxiaXRtYXApCisJCXJldHVybiAwOworCisJZmxpbmRleCArPSBfX2ZmcyhmbGJpdG1hcCkgKyAxOworCXNsYml0bWFwID0gcG9vbC0+c2xiaXRtYXBbZmxpbmRleF07CisJc2xpbmRleCA9IChmbGluZGV4ICogQklUU19QRVJfTE9ORykgKyBfX2ZmcyhzbGJpdG1hcCk7CisJKnBhZ2UgPSBwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5wYWdlOworCSpvZmZzZXQgPSBwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5vZmZzZXQ7CisKKwlyZXR1cm4gc2xpbmRleDsKK30KKworLyoKKyAqIEluc2VydCBibG9jayBhdCA8cGFnZSwgb2Zmc2V0PiBpbiBmcmVlbGlzdCBvZiBnaXZlbiBwb29sLgorICogZnJlZWxpc3QgdXNlZCBkZXBlbmRzIG9uIGJsb2NrIHNpemUuCisgKi8KK3N0YXRpYyB2b2lkIGluc2VydF9ibG9jayhzdHJ1Y3QgeHZfcG9vbCAqcG9vbCwgc3RydWN0IHBhZ2UgKnBhZ2UsIHUzMiBvZmZzZXQsCisJCQlzdHJ1Y3QgYmxvY2tfaGVhZGVyICpibG9jaykKK3sKKwl1MzIgZmxpbmRleCwgc2xpbmRleDsKKwlzdHJ1Y3QgYmxvY2tfaGVhZGVyICpuZXh0YmxvY2s7CisKKwlzbGluZGV4ID0gZ2V0X2luZGV4X2Zvcl9pbnNlcnQoYmxvY2stPnNpemUpOworCWZsaW5kZXggPSBzbGluZGV4IC8gQklUU19QRVJfTE9ORzsKKworCWJsb2NrLT5saW5rLnByZXZfcGFnZSA9IDA7CisJYmxvY2stPmxpbmsucHJldl9vZmZzZXQgPSAwOworCWJsb2NrLT5saW5rLm5leHRfcGFnZSA9IHBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2U7CisJYmxvY2stPmxpbmsubmV4dF9vZmZzZXQgPSBwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5vZmZzZXQ7CisJcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ucGFnZSA9IHBhZ2U7CisJcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ub2Zmc2V0ID0gb2Zmc2V0OworCisJaWYgKGJsb2NrLT5saW5rLm5leHRfcGFnZSkgeworCQluZXh0YmxvY2sgPSBnZXRfcHRyX2F0b21pYyhibG9jay0+bGluay5uZXh0X3BhZ2UsCisJCQkJCWJsb2NrLT5saW5rLm5leHRfb2Zmc2V0LCBLTV9VU0VSMSk7CisJCW5leHRibG9jay0+bGluay5wcmV2X3BhZ2UgPSBwYWdlOworCQluZXh0YmxvY2stPmxpbmsucHJldl9vZmZzZXQgPSBvZmZzZXQ7CisJCXB1dF9wdHJfYXRvbWljKG5leHRibG9jaywgS01fVVNFUjEpOworCX0KKworCV9fc2V0X2JpdChzbGluZGV4ICUgQklUU19QRVJfTE9ORywgJnBvb2wtPnNsYml0bWFwW2ZsaW5kZXhdKTsKKwlfX3NldF9iaXQoZmxpbmRleCwgJnBvb2wtPmZsYml0bWFwKTsKK30KKworLyoKKyAqIFJlbW92ZSBibG9jayBmcm9tIGhlYWQgb2YgZnJlZWxpc3QuIEluZGV4ICdzbGluZGV4JyBpZGVudGlmaWVzIHRoZSBmcmVlbGlzdC4KKyAqLworc3RhdGljIHZvaWQgcmVtb3ZlX2Jsb2NrX2hlYWQoc3RydWN0IHh2X3Bvb2wgKnBvb2wsCisJCQlzdHJ1Y3QgYmxvY2tfaGVhZGVyICpibG9jaywgdTMyIHNsaW5kZXgpCit7CisJc3RydWN0IGJsb2NrX2hlYWRlciAqdG1wYmxvY2s7CisJdTMyIGZsaW5kZXggPSBzbGluZGV4IC8gQklUU19QRVJfTE9ORzsKKworCXBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2UgPSBibG9jay0+bGluay5uZXh0X3BhZ2U7CisJcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ub2Zmc2V0ID0gYmxvY2stPmxpbmsubmV4dF9vZmZzZXQ7CisJYmxvY2stPmxpbmsucHJldl9wYWdlID0gMDsKKwlibG9jay0+bGluay5wcmV2X29mZnNldCA9IDA7CisKKwlpZiAoIXBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2UpIHsKKwkJX19jbGVhcl9iaXQoc2xpbmRleCAlIEJJVFNfUEVSX0xPTkcsICZwb29sLT5zbGJpdG1hcFtmbGluZGV4XSk7CisJCWlmICghcG9vbC0+c2xiaXRtYXBbZmxpbmRleF0pCisJCQlfX2NsZWFyX2JpdChmbGluZGV4LCAmcG9vbC0+ZmxiaXRtYXApOworCX0gZWxzZSB7CisJCS8qCisJCSAqIERFQlVHIE9OTFk6IFdlIG5lZWQgbm90IHJlaW5pdGlhbGl6ZSBmcmVlbGlzdCBoZWFkIHByZXZpb3VzCisJCSAqIHBvaW50ZXIgdG8gMCAtIHdlIG5ldmVyIGRlcGVuZCBvbiBpdHMgdmFsdWUuIEJ1dCBqdXN0IGZvcgorCQkgKiBzYW5pdHksIGxldHMgZG8gaXQuCisJCSAqLworCQl0bXBibG9jayA9IGdldF9wdHJfYXRvbWljKHBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2UsCisJCQkJcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ub2Zmc2V0LCBLTV9VU0VSMSk7CisJCXRtcGJsb2NrLT5saW5rLnByZXZfcGFnZSA9IDA7CisJCXRtcGJsb2NrLT5saW5rLnByZXZfb2Zmc2V0ID0gMDsKKwkJcHV0X3B0cl9hdG9taWModG1wYmxvY2ssIEtNX1VTRVIxKTsKKwl9Cit9CisKKy8qCisgKiBSZW1vdmUgYmxvY2sgZnJvbSBmcmVlbGlzdC4gSW5kZXggJ3NsaW5kZXgnIGlkZW50aWZpZXMgdGhlIGZyZWVsaXN0LgorICovCitzdGF0aWMgdm9pZCByZW1vdmVfYmxvY2soc3RydWN0IHh2X3Bvb2wgKnBvb2wsIHN0cnVjdCBwYWdlICpwYWdlLCB1MzIgb2Zmc2V0LAorCQkJc3RydWN0IGJsb2NrX2hlYWRlciAqYmxvY2ssIHUzMiBzbGluZGV4KQoreworCXUzMiBmbGluZGV4OworCXN0cnVjdCBibG9ja19oZWFkZXIgKnRtcGJsb2NrOworCisJaWYgKHBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2UgPT0gcGFnZQorCSAgICYmIHBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLm9mZnNldCA9PSBvZmZzZXQpIHsKKwkJcmVtb3ZlX2Jsb2NrX2hlYWQocG9vbCwgYmxvY2ssIHNsaW5kZXgpOworCQlyZXR1cm47CisJfQorCisJZmxpbmRleCA9IHNsaW5kZXggLyBCSVRTX1BFUl9MT05HOworCisJaWYgKGJsb2NrLT5saW5rLnByZXZfcGFnZSkgeworCQl0bXBibG9jayA9IGdldF9wdHJfYXRvbWljKGJsb2NrLT5saW5rLnByZXZfcGFnZSwKKwkJCQlibG9jay0+bGluay5wcmV2X29mZnNldCwgS01fVVNFUjEpOworCQl0bXBibG9jay0+bGluay5uZXh0X3BhZ2UgPSBibG9jay0+bGluay5uZXh0X3BhZ2U7CisJCXRtcGJsb2NrLT5saW5rLm5leHRfb2Zmc2V0ID0gYmxvY2stPmxpbmsubmV4dF9vZmZzZXQ7CisJCXB1dF9wdHJfYXRvbWljKHRtcGJsb2NrLCBLTV9VU0VSMSk7CisJfQorCisJaWYgKGJsb2NrLT5saW5rLm5leHRfcGFnZSkgeworCQl0bXBibG9jayA9IGdldF9wdHJfYXRvbWljKGJsb2NrLT5saW5rLm5leHRfcGFnZSwKKwkJCQlibG9jay0+bGluay5uZXh0X29mZnNldCwgS01fVVNFUjEpOworCQl0bXBibG9jay0+bGluay5wcmV2X3BhZ2UgPSBibG9jay0+bGluay5wcmV2X3BhZ2U7CisJCXRtcGJsb2NrLT5saW5rLnByZXZfb2Zmc2V0ID0gYmxvY2stPmxpbmsucHJldl9vZmZzZXQ7CisJCXB1dF9wdHJfYXRvbWljKHRtcGJsb2NrLCBLTV9VU0VSMSk7CisJfQorfQorCisvKgorICogQWxsb2NhdGUgYSBwYWdlIGFuZCBhZGQgaXQgZnJlZWxpc3Qgb2YgZ2l2ZW4gcG9vbC4KKyAqLworc3RhdGljIGludCBncm93X3Bvb2woc3RydWN0IHh2X3Bvb2wgKnBvb2wsIGdmcF90IGZsYWdzKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBibG9ja19oZWFkZXIgKmJsb2NrOworCisJcGFnZSA9IGFsbG9jX3BhZ2UoZmxhZ3MpOworCWlmICh1bmxpa2VseSghcGFnZSkpCisJCXJldHVybiAtRU5PTUVNOworCisJc3RhdF9pbmMoJnBvb2wtPnRvdGFsX3BhZ2VzKTsKKworCXNwaW5fbG9jaygmcG9vbC0+bG9jayk7CisJYmxvY2sgPSBnZXRfcHRyX2F0b21pYyhwYWdlLCAwLCBLTV9VU0VSMCk7CisKKwlibG9jay0+c2l6ZSA9IFBBR0VfU0laRSAtIFhWX0FMSUdOOworCXNldF9mbGFnKGJsb2NrLCBCTE9DS19GUkVFKTsKKwljbGVhcl9mbGFnKGJsb2NrLCBQUkVWX0ZSRUUpOworCXNldF9ibG9ja3ByZXYoYmxvY2ssIDApOworCisJaW5zZXJ0X2Jsb2NrKHBvb2wsIHBhZ2UsIDAsIGJsb2NrKTsKKworCXB1dF9wdHJfYXRvbWljKGJsb2NrLCBLTV9VU0VSMCk7CisJc3Bpbl91bmxvY2soJnBvb2wtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBtZW1vcnkgcG9vbC4gQWxsb2NhdGVzIGZyZWVsaXN0LCBiaXRtYXBzIGFuZCBvdGhlcgorICogcGVyLXBvb2wgbWV0YWRhdGEuCisgKi8KK3N0cnVjdCB4dl9wb29sICp4dl9jcmVhdGVfcG9vbCh2b2lkKQoreworCXUzMiBvdmhkX3NpemU7CisJc3RydWN0IHh2X3Bvb2wgKnBvb2w7CisKKwlvdmhkX3NpemUgPSByb3VuZHVwKHNpemVvZigqcG9vbCksIFBBR0VfU0laRSk7CisJcG9vbCA9IGt6YWxsb2Mob3ZoZF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvb2wpCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrX2luaXQoJnBvb2wtPmxvY2spOworCisJcmV0dXJuIHBvb2w7Cit9CisKK3ZvaWQgeHZfZGVzdHJveV9wb29sKHN0cnVjdCB4dl9wb29sICpwb29sKQoreworCWtmcmVlKHBvb2wpOworfQorCisvKioKKyAqIHh2X21hbGxvYyAtIEFsbG9jYXRlIGJsb2NrIG9mIGdpdmVuIHNpemUgZnJvbSBwb29sLgorICogQHBvb2w6IHBvb2wgdG8gYWxsb2NhdGUgZnJvbQorICogQHNpemU6IHNpemUgb2YgYmxvY2sgdG8gYWxsb2NhdGUKKyAqIEBwYWdlOiBwYWdlIG5vLiB0aGF0IGhvbGRzIHRoZSBvYmplY3QKKyAqIEBvZmZzZXQ6IGxvY2F0aW9uIG9mIG9iamVjdCB3aXRoaW4gcGFnZQorICoKKyAqIE9uIHN1Y2Nlc3MsIDxwYWdlLCBvZmZzZXQ+IGlkZW50aWZpZXMgYmxvY2sgYWxsb2NhdGVkCisgKiBhbmQgMCBpcyByZXR1cm5lZC4gT24gZmFpbHVyZSwgPHBhZ2UsIG9mZnNldD4gaXMgc2V0IHRvCisgKiAwIGFuZCAtRU5PTUVNIGlzIHJldHVybmVkLgorICoKKyAqIEFsbG9jYXRpb24gcmVxdWVzdHMgd2l0aCBzaXplID4gWFZfTUFYX0FMTE9DX1NJWkUgd2lsbCBmYWlsLgorICovCitpbnQgeHZfbWFsbG9jKHN0cnVjdCB4dl9wb29sICpwb29sLCB1MzIgc2l6ZSwgc3RydWN0IHBhZ2UgKipwYWdlLAorCQl1MzIgKm9mZnNldCwgZ2ZwX3QgZmxhZ3MpCit7CisJaW50IGVycm9yOworCXUzMiBpbmRleCwgdG1wc2l6ZSwgb3JpZ3NpemUsIHRtcG9mZnNldDsKKwlzdHJ1Y3QgYmxvY2tfaGVhZGVyICpibG9jaywgKnRtcGJsb2NrOworCisJKnBhZ2UgPSBOVUxMOworCSpvZmZzZXQgPSAwOworCW9yaWdzaXplID0gc2l6ZTsKKworCWlmICh1bmxpa2VseSghc2l6ZSB8fCBzaXplID4gWFZfTUFYX0FMTE9DX1NJWkUpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNpemUgPSBBTElHTihzaXplLCBYVl9BTElHTik7CisKKwlzcGluX2xvY2soJnBvb2wtPmxvY2spOworCisJaW5kZXggPSBmaW5kX2Jsb2NrKHBvb2wsIHNpemUsIHBhZ2UsIG9mZnNldCk7CisKKwlpZiAoISpwYWdlKSB7CisJCXNwaW5fdW5sb2NrKCZwb29sLT5sb2NrKTsKKwkJaWYgKGZsYWdzICYgR0ZQX05PV0FJVCkKKwkJCXJldHVybiAtRU5PTUVNOworCQllcnJvciA9IGdyb3dfcG9vbChwb29sLCBmbGFncyk7CisJCWlmICh1bmxpa2VseShlcnJvcikpCisJCQlyZXR1cm4gZXJyb3I7CisKKwkJc3Bpbl9sb2NrKCZwb29sLT5sb2NrKTsKKwkJaW5kZXggPSBmaW5kX2Jsb2NrKHBvb2wsIHNpemUsIHBhZ2UsIG9mZnNldCk7CisJfQorCisJaWYgKCEqcGFnZSkgeworCQlzcGluX3VubG9jaygmcG9vbC0+bG9jayk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWJsb2NrID0gZ2V0X3B0cl9hdG9taWMoKnBhZ2UsICpvZmZzZXQsIEtNX1VTRVIwKTsKKworCXJlbW92ZV9ibG9ja19oZWFkKHBvb2wsIGJsb2NrLCBpbmRleCk7CisKKwkvKiBTcGxpdCB0aGUgYmxvY2sgaWYgcmVxdWlyZWQgKi8KKwl0bXBvZmZzZXQgPSAqb2Zmc2V0ICsgc2l6ZSArIFhWX0FMSUdOOworCXRtcHNpemUgPSBibG9jay0+c2l6ZSAtIHNpemU7CisJdG1wYmxvY2sgPSAoc3RydWN0IGJsb2NrX2hlYWRlciAqKSgoY2hhciAqKWJsb2NrICsgc2l6ZSArIFhWX0FMSUdOKTsKKwlpZiAodG1wc2l6ZSkgeworCQl0bXBibG9jay0+c2l6ZSA9IHRtcHNpemUgLSBYVl9BTElHTjsKKwkJc2V0X2ZsYWcodG1wYmxvY2ssIEJMT0NLX0ZSRUUpOworCQljbGVhcl9mbGFnKHRtcGJsb2NrLCBQUkVWX0ZSRUUpOworCisJCXNldF9ibG9ja3ByZXYodG1wYmxvY2ssICpvZmZzZXQpOworCQlpZiAodG1wYmxvY2stPnNpemUgPj0gWFZfTUlOX0FMTE9DX1NJWkUpCisJCQlpbnNlcnRfYmxvY2socG9vbCwgKnBhZ2UsIHRtcG9mZnNldCwgdG1wYmxvY2spOworCisJCWlmICh0bXBvZmZzZXQgKyBYVl9BTElHTiArIHRtcGJsb2NrLT5zaXplICE9IFBBR0VfU0laRSkgeworCQkJdG1wYmxvY2sgPSBCTE9DS19ORVhUKHRtcGJsb2NrKTsKKwkJCXNldF9ibG9ja3ByZXYodG1wYmxvY2ssIHRtcG9mZnNldCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBUaGlzIGJsb2NrIGlzIGV4YWN0IGZpdCAqLworCQlpZiAodG1wb2Zmc2V0ICE9IFBBR0VfU0laRSkKKwkJCWNsZWFyX2ZsYWcodG1wYmxvY2ssIFBSRVZfRlJFRSk7CisJfQorCisJYmxvY2stPnNpemUgPSBvcmlnc2l6ZTsKKwljbGVhcl9mbGFnKGJsb2NrLCBCTE9DS19GUkVFKTsKKworCXB1dF9wdHJfYXRvbWljKGJsb2NrLCBLTV9VU0VSMCk7CisJc3Bpbl91bmxvY2soJnBvb2wtPmxvY2spOworCisJKm9mZnNldCArPSBYVl9BTElHTjsKKworCXJldHVybiAwOworfQorCisvKgorICogRnJlZSBibG9jayBpZGVudGlmaWVkIHdpdGggPHBhZ2UsIG9mZnNldD4KKyAqLwordm9pZCB4dl9mcmVlKHN0cnVjdCB4dl9wb29sICpwb29sLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdTMyIG9mZnNldCkKK3sKKwl2b2lkICpwYWdlX3N0YXJ0OworCXN0cnVjdCBibG9ja19oZWFkZXIgKmJsb2NrLCAqdG1wYmxvY2s7CisKKwlvZmZzZXQgLT0gWFZfQUxJR047CisKKwlzcGluX2xvY2soJnBvb2wtPmxvY2spOworCisJcGFnZV9zdGFydCA9IGdldF9wdHJfYXRvbWljKHBhZ2UsIDAsIEtNX1VTRVIwKTsKKwlibG9jayA9IChzdHJ1Y3QgYmxvY2tfaGVhZGVyICopKChjaGFyICopcGFnZV9zdGFydCArIG9mZnNldCk7CisKKwkvKiBDYXRjaCBkb3VibGUgZnJlZSBidWdzICovCisJQlVHX09OKHRlc3RfZmxhZyhibG9jaywgQkxPQ0tfRlJFRSkpOworCisJYmxvY2stPnNpemUgPSBBTElHTihibG9jay0+c2l6ZSwgWFZfQUxJR04pOworCisJdG1wYmxvY2sgPSBCTE9DS19ORVhUKGJsb2NrKTsKKwlpZiAob2Zmc2V0ICsgYmxvY2stPnNpemUgKyBYVl9BTElHTiA9PSBQQUdFX1NJWkUpCisJCXRtcGJsb2NrID0gTlVMTDsKKworCS8qIE1lcmdlIG5leHQgYmxvY2sgaWYgaXRzIGZyZWUgKi8KKwlpZiAodG1wYmxvY2sgJiYgdGVzdF9mbGFnKHRtcGJsb2NrLCBCTE9DS19GUkVFKSkgeworCQkvKgorCQkgKiBCbG9ja3Mgc21hbGxlciB0aGFuIFhWX01JTl9BTExPQ19TSVpFCisJCSAqIGFyZSBub3QgaW5zZXJ0ZWQgaW4gYW55IGZyZWUgbGlzdC4KKwkJICovCisJCWlmICh0bXBibG9jay0+c2l6ZSA+PSBYVl9NSU5fQUxMT0NfU0laRSkgeworCQkJcmVtb3ZlX2Jsb2NrKHBvb2wsIHBhZ2UsCisJCQkJICAgIG9mZnNldCArIGJsb2NrLT5zaXplICsgWFZfQUxJR04sIHRtcGJsb2NrLAorCQkJCSAgICBnZXRfaW5kZXhfZm9yX2luc2VydCh0bXBibG9jay0+c2l6ZSkpOworCQl9CisJCWJsb2NrLT5zaXplICs9IHRtcGJsb2NrLT5zaXplICsgWFZfQUxJR047CisJfQorCisJLyogTWVyZ2UgcHJldmlvdXMgYmxvY2sgaWYgaXRzIGZyZWUgKi8KKwlpZiAodGVzdF9mbGFnKGJsb2NrLCBQUkVWX0ZSRUUpKSB7CisJCXRtcGJsb2NrID0gKHN0cnVjdCBibG9ja19oZWFkZXIgKikoKGNoYXIgKikocGFnZV9zdGFydCkgKworCQkJCQkJZ2V0X2Jsb2NrcHJldihibG9jaykpOworCQlvZmZzZXQgPSBvZmZzZXQgLSB0bXBibG9jay0+c2l6ZSAtIFhWX0FMSUdOOworCisJCWlmICh0bXBibG9jay0+c2l6ZSA+PSBYVl9NSU5fQUxMT0NfU0laRSkKKwkJCXJlbW92ZV9ibG9jayhwb29sLCBwYWdlLCBvZmZzZXQsIHRtcGJsb2NrLAorCQkJCSAgICBnZXRfaW5kZXhfZm9yX2luc2VydCh0bXBibG9jay0+c2l6ZSkpOworCisJCXRtcGJsb2NrLT5zaXplICs9IGJsb2NrLT5zaXplICsgWFZfQUxJR047CisJCWJsb2NrID0gdG1wYmxvY2s7CisJfQorCisJLyogTm8gdXNlZCBvYmplY3RzIGluIHRoaXMgcGFnZS4gRnJlZSBpdC4gKi8KKwlpZiAoYmxvY2stPnNpemUgPT0gUEFHRV9TSVpFIC0gWFZfQUxJR04pIHsKKwkJcHV0X3B0cl9hdG9taWMocGFnZV9zdGFydCwgS01fVVNFUjApOworCQlzcGluX3VubG9jaygmcG9vbC0+bG9jayk7CisKKwkJX19mcmVlX3BhZ2UocGFnZSk7CisJCXN0YXRfZGVjKCZwb29sLT50b3RhbF9wYWdlcyk7CisJCXJldHVybjsKKwl9CisKKwlzZXRfZmxhZyhibG9jaywgQkxPQ0tfRlJFRSk7CisJaWYgKGJsb2NrLT5zaXplID49IFhWX01JTl9BTExPQ19TSVpFKQorCQlpbnNlcnRfYmxvY2socG9vbCwgcGFnZSwgb2Zmc2V0LCBibG9jayk7CisKKwlpZiAob2Zmc2V0ICsgYmxvY2stPnNpemUgKyBYVl9BTElHTiAhPSBQQUdFX1NJWkUpIHsKKwkJdG1wYmxvY2sgPSBCTE9DS19ORVhUKGJsb2NrKTsKKwkJc2V0X2ZsYWcodG1wYmxvY2ssIFBSRVZfRlJFRSk7CisJCXNldF9ibG9ja3ByZXYodG1wYmxvY2ssIG9mZnNldCk7CisJfQorCisJcHV0X3B0cl9hdG9taWMocGFnZV9zdGFydCwgS01fVVNFUjApOworCXNwaW5fdW5sb2NrKCZwb29sLT5sb2NrKTsKK30KKwordTMyIHh2X2dldF9vYmplY3Rfc2l6ZSh2b2lkICpvYmopCit7CisJc3RydWN0IGJsb2NrX2hlYWRlciAqYmxrOworCisJYmxrID0gKHN0cnVjdCBibG9ja19oZWFkZXIgKikoKGNoYXIgKikob2JqKSAtIFhWX0FMSUdOKTsKKwlyZXR1cm4gYmxrLT5zaXplOworfQorCisvKgorICogUmV0dXJucyB0b3RhbCBtZW1vcnkgdXNlZCBieSBhbGxvY2F0b3IgKHVzZXJkYXRhICsgbWV0YWRhdGEpCisgKi8KK3U2NCB4dl9nZXRfdG90YWxfc2l6ZV9ieXRlcyhzdHJ1Y3QgeHZfcG9vbCAqcG9vbCkKK3sKKwlyZXR1cm4gcG9vbC0+dG90YWxfcGFnZXMgPDwgUEFHRV9TSElGVDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC94dm1hbGxvYy5oIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3h2bWFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwYzZmZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC94dm1hbGxvYy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiB4dm1hbGxvYyBtZW1vcnkgYWxsb2NhdG9yCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5ICBOaXRpbiBHdXB0YQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1c2luZyBhIGR1YWwgbGljZW5zZSBzdHJhdGVneTogQlNEL0dQTAorICogWW91IGNhbiBjaG9vc2UgdGhlIGxpY2VuY2UgdGhhdCBiZXR0ZXIgZml0cyB5b3VyIHJlcXVpcmVtZW50cy4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgMy1jbGF1c2UgQlNEIExpY2Vuc2UKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMAorICovCisKKyNpZm5kZWYgX1hWX01BTExPQ19IXworI2RlZmluZSBfWFZfTUFMTE9DX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgeHZfcG9vbDsKKworc3RydWN0IHh2X3Bvb2wgKnh2X2NyZWF0ZV9wb29sKHZvaWQpOwordm9pZCB4dl9kZXN0cm95X3Bvb2woc3RydWN0IHh2X3Bvb2wgKnBvb2wpOworCitpbnQgeHZfbWFsbG9jKHN0cnVjdCB4dl9wb29sICpwb29sLCB1MzIgc2l6ZSwgc3RydWN0IHBhZ2UgKipwYWdlLAorCQkJdTMyICpvZmZzZXQsIGdmcF90IGZsYWdzKTsKK3ZvaWQgeHZfZnJlZShzdHJ1Y3QgeHZfcG9vbCAqcG9vbCwgc3RydWN0IHBhZ2UgKnBhZ2UsIHUzMiBvZmZzZXQpOworCit1MzIgeHZfZ2V0X29iamVjdF9zaXplKHZvaWQgKm9iaik7Cit1NjQgeHZfZ2V0X3RvdGFsX3NpemVfYnl0ZXMoc3RydWN0IHh2X3Bvb2wgKnBvb2wpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC94dm1hbGxvY19pbnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC94dm1hbGxvY19pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2MxYTY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3h2bWFsbG9jX2ludC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiB4dm1hbGxvYyBtZW1vcnkgYWxsb2NhdG9yCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5ICBOaXRpbiBHdXB0YQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1c2luZyBhIGR1YWwgbGljZW5zZSBzdHJhdGVneTogQlNEL0dQTAorICogWW91IGNhbiBjaG9vc2UgdGhlIGxpY2VuY2UgdGhhdCBiZXR0ZXIgZml0cyB5b3VyIHJlcXVpcmVtZW50cy4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgMy1jbGF1c2UgQlNEIExpY2Vuc2UKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMAorICovCisKKyNpZm5kZWYgX1hWX01BTExPQ19JTlRfSF8KKyNkZWZpbmUgX1hWX01BTExPQ19JTlRfSF8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIFVzZXIgY29uZmlndXJhYmxlIHBhcmFtcyAqLworCisvKiBNdXN0IGJlIHBvd2VyIG9mIHR3byAqLworI2RlZmluZSBYVl9BTElHTl9TSElGVAkyCisjZGVmaW5lIFhWX0FMSUdOCSgxIDw8IFhWX0FMSUdOX1NISUZUKQorI2RlZmluZSBYVl9BTElHTl9NQVNLCShYVl9BTElHTiAtIDEpCisKKy8qIFRoaXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gc2l6ZW9mKGxpbmtfZnJlZSkgKi8KKyNkZWZpbmUgWFZfTUlOX0FMTE9DX1NJWkUJMzIKKyNkZWZpbmUgWFZfTUFYX0FMTE9DX1NJWkUJKFBBR0VfU0laRSAtIFhWX0FMSUdOKQorCisvKiBGcmVlIGxpc3RzIGFyZSBzZXBhcmF0ZWQgYnkgRkxfREVMVEEgYnl0ZXMgKi8KKyNkZWZpbmUgRkxfREVMVEFfU0hJRlQJMworI2RlZmluZSBGTF9ERUxUQQkoMSA8PCBGTF9ERUxUQV9TSElGVCkKKyNkZWZpbmUgRkxfREVMVEFfTUFTSwkoRkxfREVMVEEgLSAxKQorI2RlZmluZSBOVU1fRlJFRV9MSVNUUwkoKFhWX01BWF9BTExPQ19TSVpFIC0gWFZfTUlOX0FMTE9DX1NJWkUpIFwKKwkJCQkvIEZMX0RFTFRBICsgMSkKKworI2RlZmluZSBNQVhfRkxJCQlESVZfUk9VTkRfVVAoTlVNX0ZSRUVfTElTVFMsIEJJVFNfUEVSX0xPTkcpCisKKy8qIEVuZCBvZiB1c2VyIHBhcmFtcyAqLworCitlbnVtIGJsb2NrZmxhZ3MgeworCUJMT0NLX0ZSRUUsCisJUFJFVl9GUkVFLAorCV9fTlJfQkxPQ0tGTEFHUywKK307CisKKyNkZWZpbmUgRkxBR1NfTUFTSwlYVl9BTElHTl9NQVNLCisjZGVmaW5lIFBSRVZfTUFTSwkofkZMQUdTX01BU0spCisKK3N0cnVjdCBmcmVlbGlzdF9lbnRyeSB7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdTE2IG9mZnNldDsKKwl1MTYgcGFkOworfTsKKworc3RydWN0IGxpbmtfZnJlZSB7CisJc3RydWN0IHBhZ2UgKnByZXZfcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqbmV4dF9wYWdlOworCXUxNiBwcmV2X29mZnNldDsKKwl1MTYgbmV4dF9vZmZzZXQ7Cit9OworCitzdHJ1Y3QgYmxvY2tfaGVhZGVyIHsKKwl1bmlvbiB7CisJCS8qIFRoaXMgY29tbW9uIGhlYWRlciBtdXN0IGJlIEFMSUdOIGJ5dGVzICovCisJCXU4IGNvbW1vbltYVl9BTElHTl07CisJCXN0cnVjdCB7CisJCQl1MTYgc2l6ZTsKKwkJCXUxNiBwcmV2OworCQl9OworCX07CisJc3RydWN0IGxpbmtfZnJlZSBsaW5rOworfTsKKworc3RydWN0IHh2X3Bvb2wgeworCXVsb25nIGZsYml0bWFwOworCXVsb25nIHNsYml0bWFwW01BWF9GTEldOworCXNwaW5sb2NrX3QgbG9jazsKKworCXN0cnVjdCBmcmVlbGlzdF9lbnRyeSBmcmVlbGlzdFtOVU1fRlJFRV9MSVNUU107CisKKwkvKiBzdGF0cyAqLworCXU2NCB0b3RhbF9wYWdlczsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Jhci9yYXJfZHJpdmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcmFyL3Jhcl9kcml2ZXIuYwppbmRleCA5ODA1ZDc0Li5kODVkMTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcmFyL3Jhcl9kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcmFyL3Jhcl9kcml2ZXIuYwpAQCAtNjYsNyArNjYsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IHJhcl9leGl0X2hhbmRsZXIodm9pZCk7CiAKIC8qCi0gIGZ1bmN0aW9uIHRoYXQgaXMgYWN0aXZhdGVkIG9uIHRoZSBzdWNjZXNmdWxsIHByb2JlIG9mIHRoZSBSQVIgZGV2aWNlCisgIGZ1bmN0aW9uIHRoYXQgaXMgYWN0aXZhdGVkIG9uIHRoZSBzdWNjZXNzZnVsbCBwcm9iZSBvZiB0aGUgUkFSIGRldmljZQogKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0IHJhcl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CiAKQEAgLTMxOSw3ICszMTksNyBAQAogfQogCiAvKgotICBmdW5jdGlvbiB0aGF0IGlzIGFjdGl2YWVkIG9uIHRoZSBzdWNjZXNmdWxsIHByb2JlIG9mIHRoZSBSQVIgZGV2aWNlCisgIGZ1bmN0aW9uIHRoYXQgaXMgYWN0aXZhdGVkIG9uIHRoZSBzdWNjZXNzZnVsbCBwcm9iZSBvZiB0aGUgUkFSIGRldmljZQogKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0IHJhcl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvMjg2MF9tYWluX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC8yODYwX21haW5fZGV2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZjAyOTYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC8yODYwX21haW5fZGV2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzE5ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgMjg3MF9tYWluX2Rldi5jCi0KLSAgICBBYnN0cmFjdDoKLSAgICBDcmVhdGUgYW5kIHJlZ2lzdGVyIG5ldHdvcmsgaW50ZXJmYWNlLgotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaW5jbHVkZSAicnRfY29uZmlnLmgiCi0KLWV4dGVybiBJTlQgX19kZXZpbml0IHJ0Mjh4eF9wcm9iZShJTiB2b2lkICpfZGV2X3AsIElOIHZvaWQgKl9kZXZfaWRfcCwKLQkJCQkJCQkJCUlOIFVJTlQgYXJnYywgT1VUIFBSVE1QX0FEQVBURVIgKnBwQWQpOwotCi1zdGF0aWMgdm9pZCByeF9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIG1nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgYWMwX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIGFjMV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBhYzJfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgYWMzX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIGhjY2FfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogU3ltYm9sICYgTWFjcm8gRGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBSVDI4NjBfSU5UX1JYX0RMWQkJCQkoMTw8MCkJCS8vIGJpdCAwCi0jZGVmaW5lIFJUMjg2MF9JTlRfVFhfRExZCQkJCSgxPDwxKQkJLy8gYml0IDEKLSNkZWZpbmUgUlQyODYwX0lOVF9SWF9ET05FCQkJCSgxPDwyKQkJLy8gYml0IDIKLSNkZWZpbmUgUlQyODYwX0lOVF9BQzBfRE1BX0RPTkUJCQkoMTw8MykJCS8vIGJpdCAzCi0jZGVmaW5lIFJUMjg2MF9JTlRfQUMxX0RNQV9ET05FCQkJKDE8PDQpCQkvLyBiaXQgNAotI2RlZmluZSBSVDI4NjBfSU5UX0FDMl9ETUFfRE9ORQkJCSgxPDw1KQkJLy8gYml0IDUKLSNkZWZpbmUgUlQyODYwX0lOVF9BQzNfRE1BX0RPTkUJCQkoMTw8NikJCS8vIGJpdCA2Ci0jZGVmaW5lIFJUMjg2MF9JTlRfSENDQV9ETUFfRE9ORQkJKDE8PDcpCQkvLyBiaXQgNwotI2RlZmluZSBSVDI4NjBfSU5UX01HTVRfRE9ORQkJCSgxPDw4KQkJLy8gYml0IDgKLQotI2RlZmluZSBJTlRfUlgJCQlSVDI4NjBfSU5UX1JYX0RPTkUKLQotI2RlZmluZSBJTlRfQUMwX0RMWQkJKFJUMjg2MF9JTlRfQUMwX0RNQV9ET05FKSAvL3wgUlQyODYwX0lOVF9UWF9ETFkpCi0jZGVmaW5lIElOVF9BQzFfRExZCQkoUlQyODYwX0lOVF9BQzFfRE1BX0RPTkUpIC8vfCBSVDI4NjBfSU5UX1RYX0RMWSkKLSNkZWZpbmUgSU5UX0FDMl9ETFkJCShSVDI4NjBfSU5UX0FDMl9ETUFfRE9ORSkgLy98IFJUMjg2MF9JTlRfVFhfRExZKQotI2RlZmluZSBJTlRfQUMzX0RMWQkJKFJUMjg2MF9JTlRfQUMzX0RNQV9ET05FKSAvL3wgUlQyODYwX0lOVF9UWF9ETFkpCi0jZGVmaW5lIElOVF9IQ0NBX0RMWSAJKFJUMjg2MF9JTlRfSENDQV9ETUFfRE9ORSkgLy98IFJUMjg2MF9JTlRfVFhfRExZKQotI2RlZmluZSBJTlRfTUdNVF9ETFkJUlQyODYwX0lOVF9NR01UX0RPTkUKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogUHJvdG90eXBlcyBvZiBGdW5jdGlvbnMgVXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCi1zdGF0aWMgSU5UIF9fZGV2aW5pdCBydDI4NjBfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAgKmVudCk7Ci1zdGF0aWMgVk9JRCBfX2RldmV4aXQgcnQyODYwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpOwotc3RhdGljIElOVCBfX2RldmluaXQgcnQyODYwX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAgKmVudCk7Ci12b2lkIGluaXRfdGhyZWFkX3Rhc2soUFJUTVBfQURBUFRFUiBwQWQpOwotc3RhdGljIHZvaWQgX19leGl0IHJ0Mjg2MF9jbGVhbnVwX21vZHVsZSh2b2lkKTsKLXN0YXRpYyBpbnQgX19pbml0IHJ0Mjg2MF9pbml0X21vZHVsZSh2b2lkKTsKLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBydDI4NjBfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLXN0YXRpYyBpbnQgcnQyODYwX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldik7Ci0jZW5kaWYgLy8gQ09ORklHX1BNIC8vCi0KLQotLy8KLS8vIFJhbGluayBQQ0kgZGV2aWNlIHRhYmxlLCBpbmNsdWRlIGFsbCBzdXBwb3J0ZWQgY2hpcHNldHMKLS8vCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcnQyODYwX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0KLXsKLQl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMjg2MF9QQ0lfREVWSUNFX0lEKX0sCQkvL1JUMjg2MDIuNEcKLQl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMjg2MF9QQ0llX0RFVklDRV9JRCl9LAotCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMyNzYwX1BDSV9ERVZJQ0VfSUQpfSwKLQl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMjc5MF9QQ0llX0RFVklDRV9JRCl9LAotCXtQQ0lfREVWSUNFKFZFTl9BV1RfUENJX1ZFTkRPUl9JRCwgVkVOX0FXVF9QQ0llX0RFVklDRV9JRCl9LAotCXtQQ0lfREVWSUNFKEVESU1BWF9QQ0lfVkVORE9SX0lELCAweDc3MDgpfSwKLQl7UENJX0RFVklDRShFRElNQVhfUENJX1ZFTkRPUl9JRCwgMHg3NzI4KX0sCi0Je1BDSV9ERVZJQ0UoRURJTUFYX1BDSV9WRU5ET1JfSUQsIDB4Nzc1OCl9LAotCXtQQ0lfREVWSUNFKEVESU1BWF9QQ0lfVkVORE9SX0lELCAweDc3MjcpfSwKLQl7UENJX0RFVklDRShFRElNQVhfUENJX1ZFTkRPUl9JRCwgMHg3NzM4KX0sCi0Je1BDSV9ERVZJQ0UoRURJTUFYX1BDSV9WRU5ET1JfSUQsIDB4Nzc0OCl9LAotCXtQQ0lfREVWSUNFKEVESU1BWF9QQ0lfVkVORE9SX0lELCAweDc3NjgpfSwKLSAgICB7MCx9CQkvLyB0ZXJtaW5hdGUgbGlzdAotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHJ0Mjg2MF9wY2lfdGJsKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLSNpZmRlZiBNT0RVTEVfVkVSU0lPTgotTU9EVUxFX1ZFUlNJT04oU1RBX0RSSVZFUl9WRVJTSU9OKTsKLSNlbmRpZgotCi0vLwotLy8gT3VyIFBDSSBkcml2ZXIgc3RydWN0dXJlCi0vLwotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHJ0Mjg2MF9kcml2ZXIgPQotewotICAgIG5hbWU6ICAgICAgICJydDI4NjAiLAotICAgIGlkX3RhYmxlOiAgIHJ0Mjg2MF9wY2lfdGJsLAotICAgIHByb2JlOiAgICAgIHJ0Mjg2MF9pbml0X29uZSwKLSAgICByZW1vdmU6ICAgICBfX2RldmV4aXRfcChydDI4NjBfcmVtb3ZlX29uZSksCi0KLSNpZmRlZiBDT05GSUdfUE0KLQlzdXNwZW5kOglydDI4NjBfc3VzcGVuZCwKLQlyZXN1bWU6CQlydDI4NjBfcmVzdW1lLAotI2VuZGlmCi19OwotCi0KLSNpZmRlZiBDT05GSUdfUE0KLQotVk9JRCBSVDI4NjBSZWplY3RQZW5kaW5nUGFja2V0cygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQkvLyBjbGVhciBQUyBwYWNrZXRzCi0JLy8gY2xlYXIgVHhTdyBwYWNrZXRzCi19Ci0KLXN0YXRpYyBpbnQgcnQyODYwX3N1c3BlbmQoCi0Jc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCi0JcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpTlVMTDsKLQlJTlQzMiByZXR2YWw7Ci0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3N1c3BlbmQoKVxuIikpOwotCi0JaWYgKG5ldF9kZXYgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIm5ldF9kZXYgPT0gTlVMTCFcbiIpKTsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKLQotCQkvKiB3ZSBjYW4gbm90IHVzZSBJRkZfVVAgYmVjYXVzZSByYTAgZG93biBidXQgcmExIHVwICovCi0JCS8qIGFuZCAxIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIGZvciAxIG1vZHVsZSwgbm90IGZvciBlYWNoIGludGVyZmFjZSAqLwotCQkvKiBzbyBMaW51eCB3aWxsIGNhbGwgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb24gb25jZSAqLwotCQlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA+IDApCi0JCXsKLQkJCS8vIGF2b2lkIHVzZXJzIGRvIHN1c3BlbmQgYWZ0ZXIgaW50ZXJmYWNlIGlzIGRvd24KLQotCQkJLy8gc3RvcCBpbnRlcmZhY2UKLQkJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldF9kZXYpOwotCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKLQotCQkJLy8gbWFyayBkZXZpY2UgYXMgcmVtb3ZlZCBmcm9tIHN5c3RlbSBhbmQgdGhlcmVmb3JlIG5vIGxvbmdlciBhdmFpbGFibGUKLQkJCW5ldGlmX2RldmljZV9kZXRhY2gobmV0X2Rldik7Ci0KLQkJCS8vIG1hcmsgaGFsdCBmbGFnCi0JCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKLQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7Ci0KLQkJCS8vIHRha2UgZG93biB0aGUgZGV2aWNlCi0JCQlydDI4eHhfY2xvc2UoKFBORVRfREVWKW5ldF9kZXYpOwotCi0JCQlSVF9NT0RfREVDX1VTRV9DT1VOVCgpOwotCQl9Ci0JfQotCi0JLy8gcmVmZXJlbmNlIHRvIGh0dHA6Ly92b3ZvMjAwMC5jb20vdHlwZS1sYWIvbGludXgva2VybmVsLWFwaS9saW51eC1rZXJuZWwtYXBpLmh0bWwKLQkvLyBlbmFibGUgZGV2aWNlIHRvIGdlbmVyYXRlIFBNRSMgd2hlbiBzdXNwZW5kZWQKLQkvLyBwY2lfY2hvb3NlX3N0YXRlKCk6IENob29zZSB0aGUgcG93ZXIgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlIHRvIGJlIHN1c3BlbmRlZAotCXJldHZhbCA9IHBjaV9lbmFibGVfd2FrZShwY2lfZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBjaV9kZXYsIHN0YXRlKSwgMSk7Ci0JLy8gc2F2ZSB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2Ugb2YgYSBkZXZpY2UgYmVmb3JlIHN1c3BlbmRpbmcKLQlwY2lfc2F2ZV9zdGF0ZShwY2lfZGV2KTsKLQkvLyBkaXNhYmxlIFBDSSBkZXZpY2UgYWZ0ZXIgdXNlCi0JcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOwotCi0JcmV0dmFsID0gcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBjaV9kZXYsIHN0YXRlKSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg2MF9zdXNwZW5kKClcbiIpKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IHJ0Mjg2MF9yZXN1bWUoCi0Jc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUilOVUxMOwotCUlOVDMyIHJldHZhbDsKLQotCi0JLy8gc2V0IHRoZSBwb3dlciBzdGF0ZSBvZiBhIFBDSSBkZXZpY2UKLQkvLyBQQ0kgaGFzIDQgcG93ZXIgc3RhdGVzLCBETyAobm9ybWFsKSB+IEQzKGxlc3MgcG93ZXIpCi0JLy8gaW4gaW5jbHVkZS9saW51eC9wY2kuaCwgeW91IGNhbiBmaW5kIHRoYXQKLQkvLyAjZGVmaW5lIFBDSV9EMCAgICAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDApCi0JLy8gI2RlZmluZSBQQ0lfRDEgICAgICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAxKQotCS8vICNkZWZpbmUgUENJX0QyICAgICAgICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgMikKLQkvLyAjZGVmaW5lIFBDSV9EM2hvdCAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDMpCi0JLy8gI2RlZmluZSBQQ0lfRDNjb2xkICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSA0KQotCS8vICNkZWZpbmUgUENJX1VOS05PV04gICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgNSkKLQkvLyAjZGVmaW5lIFBDSV9QT1dFUl9FUlJPUiAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIC0xKQotCXJldHZhbCA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKLQotCS8vIHJlc3RvcmUgdGhlIHNhdmVkIHN0YXRlIG9mIGEgUENJIGRldmljZQotCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOwotCi0JLy8gaW5pdGlhbGl6ZSBkZXZpY2UgYmVmb3JlIGl0J3MgdXNlZCBieSBhIGRyaXZlcgotCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkKLQl7Ci0JCXByaW50aygicGNpIGVuYWJsZSBmYWlsIVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3Jlc3VtZSgpXG4iKSk7Ci0KLQlpZiAobmV0X2RldiA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgibmV0X2RldiA9PSBOVUxMIVxuIikpOwotCX0KLQllbHNlCi0JCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7Ci0KLQlpZiAocEFkICE9IE5VTEwpCi0JewotCQkvKiB3ZSBjYW4gbm90IHVzZSBJRkZfVVAgYmVjYXVzZSByYTAgZG93biBidXQgcmExIHVwICovCi0JCS8qIGFuZCAxIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIGZvciAxIG1vZHVsZSwgbm90IGZvciBlYWNoIGludGVyZmFjZSAqLwotCQkvKiBzbyBMaW51eCB3aWxsIGNhbGwgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb24gb25jZSAqLwotCQlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA+IDApCi0JCXsKLQkJCS8vIG1hcmsgZGV2aWNlIGFzIGF0dGFjaGVkIGZyb20gc3lzdGVtIGFuZCByZXN0YXJ0IGlmIG5lZWRlZAotCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRfZGV2KTsKLQotCQkJaWYgKHJ0Mjh4eF9vcGVuKChQTkVUX0RFViluZXRfZGV2KSAhPSAwKQotCQkJewotCQkJCS8vIG9wZW4gZmFpbAotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX3Jlc3VtZSgpXG4iKSk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0KLQkJCS8vIGluY3JlYXNlIE1PRFVMRSB1c2UgY291bnQKLQkJCVJUX01PRF9JTkNfVVNFX0NPVU5UKCk7Ci0KLQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7Ci0JCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7Ci0KLQkJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOwotCQkJbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKLQkJCW5ldGlmX3dha2VfcXVldWUobmV0X2Rldik7Ci0JCX0KLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg2MF9yZXN1bWUoKVxuIikpOwotCXJldHVybiAwOwotfQotI2VuZGlmIC8vIENPTkZJR19QTSAvLwotCi0KLXN0YXRpYyBJTlQgX19pbml0IHJ0Mjg2MF9pbml0X21vZHVsZShWT0lEKQotewotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZydDI4NjBfZHJpdmVyKTsKLX0KLQotCi0vLwotLy8gRHJpdmVyIG1vZHVsZSB1bmxvYWQgZnVuY3Rpb24KLS8vCi1zdGF0aWMgVk9JRCBfX2V4aXQgcnQyODYwX2NsZWFudXBfbW9kdWxlKFZPSUQpCi17Ci0gICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZydDI4NjBfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQocnQyODYwX2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KHJ0Mjg2MF9jbGVhbnVwX21vZHVsZSk7Ci0KLQotc3RhdGljIElOVCBfX2RldmluaXQgcnQyODYwX2luaXRfb25lICgKLSAgICBJTiAgc3RydWN0IHBjaV9kZXYgICAgICAgICAgICAgICpwY2lfZGV2LAotICAgIElOICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAgKmVudCkKLXsKLSAgICBJTlQgcmM7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjg2MF9pbml0X29uZVxuIikpOwotCi0gICAgLy8gd2FrZSB1cCBhbmQgZW5hYmxlIGRldmljZQotICAgIGlmIChwY2lfZW5hYmxlX2RldmljZSAocGNpX2RldikpCi0gICAgewotICAgICAgICByYyA9IC1FSU87Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJjID0gcnQyODYwX3Byb2JlKHBjaV9kZXYsIGVudCk7Ci0gICAgfQotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4NjBfaW5pdF9vbmVcbiIpKTsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLQotc3RhdGljIFZPSUQgX19kZXZleGl0IHJ0Mjg2MF9yZW1vdmVfb25lKAotICAgIElOICBzdHJ1Y3QgcGNpX2RldiAgKnBjaV9kZXYpCi17Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgICAqbmV0X2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKLSAgICBSVE1QX0FEQVBURVIgICAgICAgICpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NjBfcmVtb3ZlX29uZVxuIikpOwotCi0JaWYgKHBBZCAhPSBOVUxMKQotCXsKLQkJLy8gVW5yZWdpc3RlciBuZXR3b3JrIGRldmljZQotCQl1bnJlZ2lzdGVyX25ldGRldihuZXRfZGV2KTsKLQotCQkvLyBVbm1hcCBDU1IgYmFzZSBhZGRyZXNzCi0JCWlvdW5tYXAoKGNoYXIgKikobmV0X2Rldi0+YmFzZV9hZGRyKSk7Ci0KLQkJUlRNUEZyZWVBZGFwdGVyKHBBZCk7Ci0KLQkJLy8gcmVsZWFzZSBtZW1vcnkgcmVnaW9uCi0JCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksIHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCkpOwotCX0KLQllbHNlCi0JewotCQkvLyBVbnJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlCi0JCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOwotCi0JCS8vIFVubWFwIENTUiBiYXNlIGFkZHJlc3MKLQkJaW91bm1hcCgoY2hhciAqKShuZXRfZGV2LT5iYXNlX2FkZHIpKTsKLQotCQkvLyByZWxlYXNlIG1lbW9yeSByZWdpb24KLQkJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKSwgcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCAwKSk7Ci0JfQotCi0JLy8gRnJlZSBwcmUtYWxsb2NhdGVkIG5ldF9kZXZpY2UgbWVtb3J5Ci0JZnJlZV9uZXRkZXYobmV0X2Rldik7Ci19Ci0KLS8vCi0vLyBQQ0kgZGV2aWNlIHByb2JlICYgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KLS8vCi1zdGF0aWMgSU5UIF9fZGV2aW5pdCAgIHJ0Mjg2MF9wcm9iZSgKLSAgICBJTiAgc3RydWN0IHBjaV9kZXYgICAgICAgICAgICAgICpwY2lfZGV2LAotICAgIElOICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAgKmVudCkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZDsKLSAgICBJTlQgcnYgPSAwOwotCi0gICAgcnYgPSAoSU5UKXJ0Mjh4eF9wcm9iZSgodm9pZCAqKXBjaV9kZXYsICh2b2lkICopZW50LCAwLCAmcEFkKTsKLQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpOwotCXJldHVybiBydjsKLX0KLQotCi12b2lkIGluaXRfdGhyZWFkX3Rhc2soSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JUE9TX0NPT0tJRSBwT2JqOwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCXRhc2tsZXRfaW5pdCgmcE9iai0+cnhfZG9uZV90YXNrLCByeF9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2ssIG1nbXRfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrLCBhYzBfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrLCBhYzFfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrLCBhYzJfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrLCBhYzNfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmhjY2FfZG1hX2RvbmVfdGFzaywgaGNjYV9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+dGJ0dF90YXNrLCB0YnR0X3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5maWZvX3N0YXRpc3RpY19mdWxsX3Rhc2ssIGZpZm9fc3RhdGlzdGljX2Z1bGxfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLX0KLQotdm9pZCBraWxsX3RocmVhZF90YXNrKElOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVBPU19DT09LSUUgcE9iajsKLQotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQl0YXNrbGV0X2tpbGwoJnBPYmotPnJ4X2RvbmVfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPnRidHRfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5maWZvX3N0YXRpc3RpY19mdWxsX3Rhc2spOwotfQotCi0KLXN0YXRpYyB2b2lkIHJ0Mjg2MF9pbnRfZW5hYmxlKFBSVE1QX0FEQVBURVIgcEFkLCB1bnNpZ25lZCBpbnQgbW9kZSkKLXsKLQl1MzIgcmVnVmFsdWU7Ci0KLQlwQWQtPmludF9kaXNhYmxlX21hc2sgJj0gfihtb2RlKTsKLQlyZWdWYWx1ZSA9IHBBZC0+aW50X2VuYWJsZV9yZWcgJiB+KHBBZC0+aW50X2Rpc2FibGVfbWFzayk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCByZWdWYWx1ZSk7ICAgICAvLyAxOmVuYWJsZQotCi0JaWYgKHJlZ1ZhbHVlICE9IDApCi0JCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpOwotfQotCi0KLXN0YXRpYyB2b2lkIHJ0Mjg2MF9pbnRfZGlzYWJsZShQUlRNUF9BREFQVEVSIHBBZCwgdW5zaWduZWQgaW50IG1vZGUpCi17Ci0JdTMyIHJlZ1ZhbHVlOwotCi0JcEFkLT5pbnRfZGlzYWJsZV9tYXNrIHw9IG1vZGU7Ci0JcmVnVmFsdWUgPSAJcEFkLT5pbnRfZW5hYmxlX3JlZyAmIH4ocEFkLT5pbnRfZGlzYWJsZV9tYXNrKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIHJlZ1ZhbHVlKTsgICAgIC8vIDA6IGRpc2FibGUKLQotCWlmIChyZWdWYWx1ZSA9PSAwKQotCXsKLQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG1nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLSAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JSW50U291cmNlLndvcmQgPSAwOwotCUludFNvdXJjZS5maWVsZC5NZ210RG1hRG9uZSA9IDE7Ci0JcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX01HTVRfRExZOwotCi0JUlRNUEhhbmRsZU1nbXRSaW5nRG1hRG9uZUludGVycnVwdChwQWQpOwotCi0JLy8gaWYgeW91IHVzZSBSVE1QX1NFTV9MT0NLLCBzb21ldGltZXMga2VybmVsIHdpbGwgaGFuZyB1cCwgbm8gYW55Ci0JLy8gYnVnIHJlcG9ydCBvdXRwdXQKLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfTUdNVF9ETFkpCi0JewotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9NR01UX0RMWSk7Ci0JUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ4X2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotCUJPT0xFQU4JYlJlc2NoZWR1bGUgPSAwOwotCVBPU19DT09LSUUgcE9iajsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybjsKLQotICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlwQWQtPmludF9wZW5kaW5nICY9IH4oSU5UX1JYKTsKLQotCWJSZXNjaGVkdWxlID0gU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKHBBZCwgMCk7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgcm90dGluZyBwYWNrZXQKLQkgKi8KLQlpZiAocEFkLT5pbnRfcGVuZGluZyAmIElOVF9SWCB8fCBiUmVzY2hlZHVsZSkKLQl7Ci0JCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPnJ4X2RvbmVfdGFzayk7Ci0JCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZW5hYmxlIFJ4SU5UIGFnYWluICovCi0JcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfUlgpOwotCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCi19Ci0KLXZvaWQgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJcmV0dXJuOwotCi0gICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCXBBZC0+aW50X3BlbmRpbmcgJj0gfihGaWZvU3RhRnVsbEludCk7Ci0JTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKHBBZCk7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgcm90dGluZyBwYWNrZXQKLQkgKi8KLQlpZiAocEFkLT5pbnRfcGVuZGluZyAmIEZpZm9TdGFGdWxsSW50KQotCXsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+Zmlmb19zdGF0aXN0aWNfZnVsbF90YXNrKTsKLQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBlbmFibGUgUnhJTlQgYWdhaW4gKi8KLQotCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgRmlmb1N0YUZ1bGxJbnQpOwotCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCi19Ci0KLXN0YXRpYyB2b2lkIGhjY2FfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLSAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0KLQlJbnRTb3VyY2Uud29yZCA9IDA7Ci0JSW50U291cmNlLmZpZWxkLkhjY2FEbWFEb25lID0gMTsKLQlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfSENDQV9ETFk7Ci0KLQlSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfSENDQV9ETFkpCi0JewotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9IQ0NBX0RMWSk7Ci0JUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjM19kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7Ci0gICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOwotCVBPU19DT09LSUUgcE9iajsKLQlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybjsKLQotICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlJbnRTb3VyY2Uud29yZCA9IDA7Ci0JSW50U291cmNlLmZpZWxkLkFjM0RtYURvbmUgPSAxOwotCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzNfRExZOwotCi0JYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDM19ETFkpIHx8IGJSZXNjaGVkdWxlKQotCXsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzNfRExZKTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYWMyX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGF0YTsKLSAgICBJTlRfU09VUkNFX0NTUl9TVFJVQwlJbnRTb3VyY2U7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSAwOwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJcmV0dXJuOwotCi0gICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCUludFNvdXJjZS53b3JkID0gMDsKLQlJbnRTb3VyY2UuZmllbGQuQWMyRG1hRG9uZSA9IDE7Ci0JcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX0FDMl9ETFk7Ci0KLQliUmVzY2hlZHVsZSA9IFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCwgSW50U291cmNlKTsKLQotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQotCS8qCi0JICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIGxvc2Ugb2YgaW50ZXJydXB0cwotCSAqLwotCWlmICgocEFkLT5pbnRfcGVuZGluZyAmIElOVF9BQzJfRExZKSB8fCBiUmVzY2hlZHVsZSkKLQl7Ci0JCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKLQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBlbmFibGUgVHhEYXRhSW50IGFnYWluICovCi0JcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfQUMyX0RMWSk7Ci0JUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjMV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7Ci0gICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOwotCVBPU19DT09LSUUgcE9iajsKLQlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybjsKLQotICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlJbnRTb3VyY2Uud29yZCA9IDA7Ci0JSW50U291cmNlLmZpZWxkLkFjMURtYURvbmUgPSAxOwotCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzFfRExZOwotCi0JYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDMV9ETFkpIHx8IGJSZXNjaGVkdWxlKQotCXsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzFfRExZKTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYWMwX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGF0YTsKLSAgICBJTlRfU09VUkNFX0NTUl9TVFJVQwlJbnRTb3VyY2U7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSAwOwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJcmV0dXJuOwotCi0gICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCUludFNvdXJjZS53b3JkID0gMDsKLQlJbnRTb3VyY2UuZmllbGQuQWMwRG1hRG9uZSA9IDE7Ci0JcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX0FDMF9ETFk7Ci0KLQliUmVzY2hlZHVsZSA9IFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCwgSW50U291cmNlKTsKLQotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkvKgotCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCBsb3NlIG9mIGludGVycnVwdHMKLQkgKi8KLQlpZiAoKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfQUMwX0RMWSkgfHwgYlJlc2NoZWR1bGUpCi0JewotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7Ci0JCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLwotCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX0FDMF9ETFkpOwotCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotfQotCi0KLWludCBwcmludF9pbnRfY291bnQ7Ci0KLUlSUV9IQU5ETEVfVFlQRQotcnQyODYwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2luc3RhbmNlOwotCVBSVE1QX0FEQVBURVIgcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKLQlJTlRfU09VUkNFX0NTUl9TVFJVQwlJbnRTb3VyY2U7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCUJPT0xFQU4JYk9sZFZhbHVlOwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCi0JLyogTm90ZSAwMzMxMjAwODogd2UgY2FuIG5vdCByZXR1cm4gaGVyZSBiZWZvcmUKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgJkludFNvdXJjZS53b3JkKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsIEludFNvdXJjZS53b3JkKTsKLQkJT3Iga2VybmVsIHdpbGwgcGFuaWMgYWZ0ZXIgaWZjb25maWcgcmEwIGRvd24gc29tZXRpbWVzICovCi0KLQotCS8vCi0JLy8gSW5pdGFsIHRoZSBJbnRlcnJ1cHQgc291cmNlLgotCS8vCi0JSW50U291cmNlLndvcmQgPSAweDAwMDAwMDAwTDsKLS8vCU1jdUludFNvdXJjZS53b3JkID0gMHgwMDAwMDAwMEw7Ci0KLQkvLwotCS8vIEdldCB0aGUgaW50ZXJydXB0IHNvdXJjZXMgJiBzYXZlZCB0byBsb2NhbCB2YXJpYWJsZQotCS8vCi0JLy9SVE1QX0lPX1JFQUQzMihwQWQsIHdoZXJlLCAmTWN1SW50U291cmNlLndvcmQpOwotCS8vUlRNUF9JT19XUklURTMyKHBBZCwgLCBNY3VJbnRTb3VyY2Uud29yZCk7Ci0KLQkvLwotCS8vIEZsYWcgZk9QX1NUQVRVU19ET1pFIE9uLCBtZWFucyBBU0lDIHB1dCB0byBzbGVlcCwgZWxhc2UgbWVhbnMgQVNJQ0sgV2FrZVVwCi0JLy8gQW5kIGF0IHRoZSBzYW1lIHRpbWUsIGNsb2NrIG1heWJlIHR1cm5lZCBvZmYgdGhhdCBzYXkgdGhlcmUgaXMgbm8gRE1BIHNlcnZpY2UuCi0JLy8gd2hlbiBBU0lDIGdldCB0byBzbGVlcC4KLQkvLyBUbyBwcmV2ZW50IHN5c3RlbSBoYW5nIG9uIHBvd2VyIHNhdmluZy4KLQkvLyBXZSBuZWVkIHRvIGNoZWNrIGl0IGJlZm9yZSBoYW5kbGUgdGhlIElOVF9TT1VSQ0VfQ1NSLCBBU0lDIG11c3QgYmUgd2FrZSB1cC4KLQkvLwotCS8vIFJUMjY2MSA9PiB3aGVuIEFTSUMgaXMgc2xlZXBpbmcsIE1BQyByZWdpc3RlciBjYW5ub3QgYmUgcmVhZCBhbmQgd3JpdHRlbi4KLQkvLyBSVDI4NjAgPT4gd2hlbiBBU0lDIGlzIHNsZWVwaW5nLCBNQUMgcmVnaXN0ZXIgY2FuIGJlIHJlYWQgYW5kIHdyaXR0ZW4uCi0KLQliT2xkVmFsdWUgPSBwQWQtPmJQQ0ljbGtPZmY7Ci0JcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7Ci0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAmSW50U291cmNlLndvcmQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgSW50U291cmNlLndvcmQpOyAvLyB3cml0ZSAxIHRvIGNsZWFyCi0JfQotCXBBZC0+YlBDSWNsa09mZiA9IGJPbGRWYWx1ZTsKLQotCS8vIERvIG5vdGhpbmcgaWYgUmVzZXQgaW4gcHJvZ3Jlc3MKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAotCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCi0JewotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JLy8KLQkvLyBIYW5kbGUgaW50ZXJydXB0LCB3YWxrIHRocm91Z2ggYWxsIGJpdHMKLQkvLyBTaG91bGQgc3RhcnQgZnJvbSBoaWdoZXN0IHByaW9yaXR5IGludGVycnVwdAotCS8vIFRoZSBwcmlvcml0eSBjYW4gYmUgYWRqdXN0IGJ5IGFsdGVyaW5nIHByb2Nlc3NpbmcgaWYgc3RhdGVtZW50Ci0JLy8KLQotCS8vIElmIHJlcXVpcmVkIHNwaW5sb2NrLCBlYWNoIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgaGFzIHRvIGFjcXVpcmUKLQkvLyBhbmQgcmVsZWFzZSBpdHNlbGYuCi0JLy8KLQotCS8vIERvIG5vdGhpbmcgaWYgTklDIGRvZXNuJ3QgZXhpc3QKLQlpZiAoSW50U291cmNlLndvcmQgPT0gMHhmZmZmZmZmZikKLQl7Ci0JCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOwotCQlwcmludGsoInNub3dwaW4gLSBJbnRTb3VyY2Uud29yZCA9PSAweGZmZmZmZmZmXG4iKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIFR4Q29oZXJlbnQpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI+Pj5UeENvaGVyZW50PDw8XG4iKSk7Ci0JCVJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0KHBBZCk7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgUnhDb2hlcmVudCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj4+PlJ4Q29oZXJlbnQ8PDxcbiIpKTsKLQkJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQocEFkKTsKLQl9Ci0KLQlpZiAoSW50U291cmNlLndvcmQgJiBGaWZvU3RhRnVsbEludCkKLQl7Ci0jaWYgMQotCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIEZpZm9TdGFGdWxsSW50KSA9PSAwKQotCQl7Ci0JCQkvKiBtYXNrIEZpZm9TdGFGdWxsSW50ICovCi0JCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBGaWZvU3RhRnVsbEludCk7Ci0JCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5maWZvX3N0YXRpc3RpY19mdWxsX3Rhc2spOwotCQl9Ci0JCXBBZC0+aW50X3BlbmRpbmcgfD0gRmlmb1N0YUZ1bGxJbnQ7Ci0jZWxzZQotCQlOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMocEFkKTsKLSNlbmRpZgotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9NR01UX0RMWSkKLQl7Ci0JCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX01HTVRfRExZKSA9PTAgKQotCQl7Ci0JCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfTUdNVF9ETFkpOwotCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKLQkJfQotCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9NR01UX0RMWSA7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgSU5UX1JYKQotCXsKLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfUlgpID09IDApCi0JCXsKLQkJCS8qIG1hc2sgUnhJTlQgKi8KLQkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9SWCk7Ci0JCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5yeF9kb25lX3Rhc2spOwotCQl9Ci0JCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX1JYOwotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9IQ0NBX0RMWSkKLQl7Ci0KLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfSENDQV9ETFkpID09IDApCi0JCXsKLQkJCS8qIG1hc2sgVHhEYXRhSW50ICovCi0JCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfSENDQV9ETFkpOwotCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrKTsKLQkJfQotCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9IQ0NBX0RMWTsKLQl9Ci0KLQlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMzX0RMWSkKLQl7Ci0KLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMzX0RMWSkgPT0gMCkKLQkJewotCQkJLyogbWFzayBUeERhdGFJbnQgKi8KLQkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzNfRExZKTsKLQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKLQkJfQotCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9BQzNfRExZOwotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9BQzJfRExZKQotCXsKLQotCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9BQzJfRExZKSA9PSAwKQotCQl7Ci0JCQkvKiBtYXNrIFR4RGF0YUludCAqLwotCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX0FDMl9ETFkpOwotCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2spOwotCQl9Ci0JCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDMl9ETFk7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0FDMV9ETFkpCi0JewotCi0JCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDMV9ETFk7Ci0KLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMxX0RMWSkgPT0gMCkKLQkJewotCQkJLyogbWFzayBUeERhdGFJbnQgKi8KLQkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzFfRExZKTsKLQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKLQkJfQotCi0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0FDMF9ETFkpCi0JewotCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9BQzBfRExZOwotCi0JCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX0FDMF9ETFkpID09IDApCi0JCXsKLQkJCS8qIG1hc2sgVHhEYXRhSW50ICovCi0JCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfQUMwX0RMWSk7Ci0JCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7Ci0JCX0KLQotCX0KLQotICAgIGlmIChJbnRTb3VyY2Uud29yZCAmIFByZVRCVFRJbnQpCi0JewotCQlSVE1QSGFuZGxlUHJlVEJUVEludGVycnVwdChwQWQpOwotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIFRCVFRJbnQpCi0JewotCQlSVE1QSGFuZGxlVEJUVEludGVycnVwdChwQWQpOwotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIEF1dG9XYWtldXBJbnQpCi0JCVJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KHBBZCk7Ci0KLSAgICByZXR1cm4gIElSUV9IQU5ETEVEOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIENoZWNrIHRoZSBjaGlwc2V0IHZlbmRvci9wcm9kdWN0IElELgotCi1Bcmd1bWVudHM6Ci0gICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQotCi1SZXR1cm4gVmFsdWU6Ci0gICAgVFJVRQkJCQlDaGVjayBvawotCUZBTFNFCQkJCUNoZWNrIGZhaWwKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4gUlQyOFhYQ2hpcHNldENoZWNrKAotCUlOIHZvaWQgKl9kZXZfcCkKLXsKLQkvKiBhbHdheXMgVFJVRSAqLwotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgSW5pdCBuZXQgZGV2aWNlIHN0cnVjdHVyZS4KLQotQXJndW1lbnRzOgotICAgIF9kZXZfcAkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKLSAgICAqbmV0X2RldgkJCVBvaW50IHRvIHRoZSBuZXQgZGV2aWNlCi0JKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLSAgICBUUlVFCQkJCUluaXQgb2sKLQlGQUxTRQkJCQlJbml0IGZhaWwKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4gUlQyOFhYTmV0RGV2SW5pdCgKLQlJTiB2b2lkIAkJCQkqX2Rldl9wLAotCUlOIHN0cnVjdCAgbmV0X2RldmljZQkqbmV0X2RldiwKLQlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKQotewotCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gKHN0cnVjdCBwY2lfZGV2ICopX2Rldl9wOwotICAgIGNvbnN0IENIQVIJKnByaW50X25hbWU7Ci0gICAgVUxPTkcJY3NyX2FkZHI7Ci0KLQotCXByaW50X25hbWUgPSBwY2lfZGV2ID8gcGNpX25hbWUocGNpX2RldikgOiAicnQyODYwIjsKLQotCW5ldF9kZXYtPmJhc2VfYWRkciA9IDA7Ci0JbmV0X2Rldi0+aXJxID0gMDsKLQotICAgIGlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBjaV9kZXYsIHByaW50X25hbWUpKQotICAgICAgICBnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7Ci0KLSAgICAvLyBpbnRlcnJ1cHQgSVJRIG51bWJlcgotICAgIG5ldF9kZXYtPmlycSA9IHBjaV9kZXYtPmlycTsKLQotICAgIC8vIG1hcCBwaHlzaWNhbCBhZGRyZXNzIHRvIHZpcnR1YWwgYWRkcmVzcyBmb3IgYWNjZXNzaW5nIHJlZ2lzdGVyCi0gICAgY3NyX2FkZHIgPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksCi0JCQkJCQkJCQkJcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCAwKSk7Ci0KLSAgICBpZiAoIWNzcl9hZGRyKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCi0JCQkJKCJpb3JlbWFwIGZhaWxlZCBmb3IgZGV2aWNlICVzLCByZWdpb24gMHglbFggQCAweCVsWFxuIiwKLQkJCQlwcmludF9uYW1lLCAoVUxPTkcpcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCAwKSwKLQkJCQkoVUxPTkcpcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApKSk7Ci0gICAgICAgIGdvdG8gZXJyX291dF9mcmVlX3JlczsKLSAgICB9Ci0KLSAgICAvLyBTYXZlIENTUiB2aXJ0dWFsIGFkZHJlc3MgYW5kIGlycSB0byBkZXZpY2Ugc3RydWN0dXJlCi0gICAgbmV0X2Rldi0+YmFzZV9hZGRyID0gY3NyX2FkZHI7Ci0gICAgcEFkLT5DU1JCYXNlQWRkcmVzcyA9IChQVUNIQVIpbmV0X2Rldi0+YmFzZV9hZGRyOwotCi0gICAgLy8gU2V0IERNQSBtYXN0ZXIKLSAgICBwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKLQotICAgIG5ldF9kZXYtPnByaXZfZmxhZ3MgPSBJTlRfTUFJTjsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBhdCAweCVseCwgVkEgMHglbHgsIElSUSAlZC4gXG4iLAotICAgICAgICAJbmV0X2Rldi0+bmFtZSwgKFVMT05HKXBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKSwKLQkJCShVTE9ORyljc3JfYWRkciwgcGNpX2Rldi0+aXJxKSk7Ci0JcmV0dXJuIFRSVUU7Ci0KLQotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFUlJPUiBIQU5ETEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1lcnJfb3V0X2ZyZWVfcmVzOgotICAgIHBjaV9yZWxlYXNlX3JlZ2lvbnMocGNpX2Rldik7Ci1lcnJfb3V0X2ZyZWVfbmV0ZGV2OgotCS8qIGZyZWUgbmV0ZGV2IGluIGNhbGxlciwgbm90IGhlcmUgKi8KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBJbml0IG5ldCBkZXZpY2Ugc3RydWN0dXJlLgotCi1Bcmd1bWVudHM6Ci0gICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQotCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgVFJVRQkJCQlDb25maWcgb2sKLQlGQUxTRQkJCQlDb25maWcgZmFpbAotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBSVDI4WFhQcm9iZVBvc3RDb25maWcoCi0JSU4gdm9pZCAJCQkJKl9kZXZfcCwKLQlJTiBSVE1QX0FEQVBURVIgCQkqcEFkLAotCUlOIElOVDMyCQkJCWFyZ2MpCi17Ci0JLyogbm8gdXNlICovCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBEaXNhYmxlIERNQS4KLQotQXJndW1lbnRzOgotCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVDI4WFhETUFEaXNhYmxlKAotCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpCi17Ci0JV1BETUFfR0xPX0NGR19TVFJVQyAgICAgR2xvQ2ZnOwotCi0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7Ci0JR2xvQ2ZnLndvcmQgJj0gMHhmZjA7Ci0JR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9MTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBFbmFibGUgRE1BLgotCi1Bcmd1bWVudHM6Ci0JKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUMjhYWERNQUVuYWJsZSgKLQlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKQotewotCVdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOwotCWludCBpID0gMDsKLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHg0KTsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwotCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQotCQkJYnJlYWs7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+ICBETUFCdXN5XG4iKSk7Ci0JCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JCWkrKzsKLQl9d2hpbGUgKCBpIDwyMDApOwotCi0JUlRNUHVzZWNEZWxheSg1MCk7Ci0KLQlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0gMTsKLQlHbG9DZmcuZmllbGQuV1BETUFCdXJzdFNJWkUgPSAyOwotCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDE7Ci0JR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBXUklURSBETUEgb2Zmc2V0IDB4MjA4ID0gMHgleFxuIiwgR2xvQ2ZnLndvcmQpKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7Ci0KLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBXcml0ZSBCZWFjb24gYnVmZmVyIHRvIEFzaWMuCi0KLUFyZ3VtZW50czoKLQkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlQyOHh4X1VwZGF0ZUJlYWNvblRvQXNpYygKLQlJTiBSVE1QX0FEQVBURVIJCSpwQWQsCi0JSU4gSU5UCQkJCWFwaWR4LAotCUlOIFVMT05HCQkJRnJhbWVMZW4sCi0JSU4gVUxPTkcJCQlVcGRhdGVQb3MpCi17Ci0JVUxPTkcJCQkJQ2FwSW5mb1BvcyA9IDA7Ci0JVUNIQVIgIAkJCSpwdHIsICpwdHJfdXBkYXRlLCAqcHRyX2NhcGluZm87Ci0JVUlOVCAgCQkJaTsKLQlCT09MRUFOCQkJYkJjblJlcSA9IEZBTFNFOwotCVVDSEFSCQkJYmNuX2lkeCA9IDA7Ci0KLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzKCkgOiBObyB2YWxpZCBJbnRlcmZhY2UgYmUgZm91bmQuXG4iLCBfX2Z1bmNfXykpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGJCY25SZXEgPT0gRkFMU0UpCi0JewotCQkvKiB3aGVuIHRoZSByYSBpbnRlcmZhY2UgaXMgZG93biwgZG8gbm90IHNlbmQgaXRzIGJlYWNvbiBmcmFtZSAqLwotCQkvKiBjbGVhciBhbGwgemVybyAqLwotCQlmb3IoaT0wOyBpPFRYV0lfU0laRTsgaSs9NCkKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgaSwgMHgwMCk7Ci0JfQotCWVsc2UKLQl7Ci0JCXB0ciA9IChQVUNIQVIpJnBBZC0+QmVhY29uVHhXSTsKLQotCQlmb3IgKGk9MDsgaTxUWFdJX1NJWkU7IGkrPTQpICAvLyAxNi1ieXRlIFRYV0kgZmllbGQKLQkJewotCQkJVUlOVDMyIGxvbmdwdHIgPSAgKnB0ciArICgqKHB0cisxKTw8OCkgKyAoKihwdHIrMik8PDE2KSArICgqKHB0ciszKTw8MjQpOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBpLCBsb25ncHRyKTsKLQkJCXB0ciArPSA0OwotCQl9Ci0KLQkJLy8gVXBkYXRlIENhcGFiaWxpdHlJbmZvIGluIEJlYWNvbgotCQlmb3IgKGkgPSBDYXBJbmZvUG9zOyBpIDwgKENhcEluZm9Qb3MrMik7IGkrKykKLQkJewotCQkJUlRNUF9JT19XUklURTgocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIFRYV0lfU0laRSArIGksICpwdHJfY2FwaW5mbyk7Ci0JCQlwdHJfY2FwaW5mbyArKzsKLQkJfQotCi0JCWlmIChGcmFtZUxlbiA+IFVwZGF0ZVBvcykKLQkJewotCQkJZm9yIChpPSBVcGRhdGVQb3M7IGk8IChGcmFtZUxlbik7IGkrKykKLQkJCXsKLQkJCQlSVE1QX0lPX1dSSVRFOChwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgVFhXSV9TSVpFICsgaSwgKnB0cl91cGRhdGUpOwotCQkJCXB0cl91cGRhdGUgKys7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQotCi1WT0lEIFJUTVBJbml0UENJZUxpbmtDdHJsVmFsdWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci19Ci0KLVZPSUQgUlRNUEZpbmRIb3N0UENJRGV2KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkKQotewotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQkJTGV2ZWwgPSBSRVNUT1JFX0hBTFQgOiBSZXN0b3JlIFBDSSBob3N0IGFuZCBSYWxpbmsgUENJZSBMaW5rIENvbnRyb2wgZmllbGQgdG8gaXRzIGRlZmF1bHQgdmFsdWUuCi0JCUxldmVsID0gT3RoZXIgVmFsdWUgOiBSZXN0b3JlIGZyb20gZG90MTEgcG93ZXIgc2F2ZSBvciByYWRpbyBvZmYgc3RhdHVzLiBBbmQgZm9yY2UgUENJIGhvc3QgTGluayBDb250cm9sIGZpZWxkcyB0byAweDEKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgIFVDSEFSCQlMZXZlbCkKLXsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0JCU1heCA6IGxpbWl0IEhvc3QgUENJIGFuZCBSYWxpbmsgUENJZSBkZXZpY2UncyBMSU5LIENPTlRST0wgZmllbGQncyB2YWx1ZS4KLQkJQmVjYXVzZSBub3cgZnJlcXVlbnRseSBzZXQgb3VyIGRldmljZSB0byBtb2RlIDEgb3IgbW9kZSAzIHdpbGwgY2F1c2UgcHJvYmxlbS4KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gCVVTSE9SVAkJTWF4KQotewotfQotCi1WT0lEIHJ0Mjg2MF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQotewotICAgIFBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpTlVMTDsKLSAgICBpZiAobmV0X2RldiA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgibmV0X2RldiA9PSBOVUxMIVxuIikpOwotCX0KLQllbHNlCi0JCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7Ci0KLQlpZiAocEFkICE9IE5VTEwpCi0JewotCSAgICAvLyBzdG9wIGludGVyZmFjZQotCQluZXRpZl9jYXJyaWVyX29mZihuZXRfZGV2KTsKLQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKLQotCQkvLyBtYXJrIGRldmljZSBhcyByZW1vdmVkIGZyb20gc3lzdGVtIGFuZCB0aGVyZWZvcmUgbm8gbG9uZ2VyIGF2YWlsYWJsZQotCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldF9kZXYpOwotCi0JCS8vIG1hcmsgaGFsdCBmbGFnCi0JCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOwotCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOwotCi0JCS8vIHRha2UgZG93biB0aGUgZGV2aWNlCi0JCXJ0Mjh4eF9jbG9zZSgoUE5FVF9ERVYpbmV0X2Rldik7Ci0JCVJUX01PRF9ERUNfVVNFX0NPVU5UKCk7Ci0JfQotICAgIHJldHVybjsKLX0KLQotLyoKLSAqIGludmFpbGQgb3Igd3JpdGViYWNrIGNhY2hlCi0gKiBhbmQgY29udmVydCB2aXJ0dWFsIGFkZHJlc3MgdG8gcGh5c2ljYWwgYWRkcmVzcwotICovCi1kbWFfYWRkcl90IGxpbnV4X3BjaV9tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgaW50IHNkX2lkeCwgaW50IGRpcmVjdGlvbikKLXsKLQlQUlRNUF9BREFQVEVSIHBBZDsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQkvKgotCQktLS0tLS0gUG9ydGluZyBJbmZvcm1hdGlvbiAtLS0tLS0KLQkJPiBGb3IgVHggQWxsb2M6Ci0JCQltZ210IHBhY2tldHMgPT4gc2RfaWR4ID0gMAotCQkJU3dJZHg6IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgKLQkJCXBUeEQgOiBwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLkFsbG9jVmE7Ci0KLQkJCWRhdGEgcGFja2V0cyA9PiBzZF9pZHggPSAxCi0JIAkJVHhJZHggOiBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHgKLQkgCQlRdWVJZHg6IHBUeEJsay0+UXVlSWR4Ci0JIAkJcFR4RCAgOiBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uQ2VsbFtUeElkeF0uQWxsb2NWYTsKLQotCSAJPiBGb3IgUnggQWxsb2M6Ci0JIAkJc2RfaWR4ID0gLTEKLQkqLwotCi0JcEFkID0gKFBSVE1QX0FEQVBURVIpaGFuZGxlOwotCXBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCWlmIChzZF9pZHggPT0gMSkKLQl7Ci0JCVBUWF9CTEsJCXBUeEJsazsKLQkJcFR4QmxrID0gKFBUWF9CTEspcHRyOwotCQlyZXR1cm4gcGNpX21hcF9zaW5nbGUocE9iai0+cGNpX2RldiwgcFR4QmxrLT5wU3JjQnVmRGF0YSwgcFR4QmxrLT5TcmNCdWZMZW4sIGRpcmVjdGlvbik7Ci0JfQotCWVsc2UKLQl7Ci0JCXJldHVybiBwY2lfbWFwX3NpbmdsZShwT2JqLT5wY2lfZGV2LCBwdHIsIHNpemUsIGRpcmVjdGlvbik7Ci0JfQotCi19Ci0KLXZvaWQgbGludXhfcGNpX3VubWFwX3NpbmdsZSh2b2lkICpoYW5kbGUsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQotewotCVBSVE1QX0FEQVBURVIgcEFkOwotCVBPU19DT09LSUUgcE9iajsKLQotCXBBZD0oUFJUTVBfQURBUFRFUiloYW5kbGU7Ci0JcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JcGNpX3VubWFwX3NpbmdsZShwT2JqLT5wY2lfZGV2LCBkbWFfYWRkciwgc2l6ZSwgZGlyZWN0aW9uKTsKLQotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL0tjb25maWcKaW5kZXggZWZlMzhlMi4uZjk5NjJiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvS2NvbmZpZwpAQCAtMSw1ICsxLDggQEAKIGNvbmZpZyBSVDI4NjAKLQl0cmlzdGF0ZSAiUmFsaW5rIDI4NjAgd2lyZWxlc3Mgc3VwcG9ydCIKKwl0cmlzdGF0ZSAiUmFsaW5rIDI4NjAvMzA5MCB3aXJlbGVzcyBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJICYmIFg4NiAmJiBXTEFOCisJc2VsZWN0IFdJUkVMRVNTX0VYVAorCXNlbGVjdCBXRVhUX1BSSVYKIAktLS1oZWxwLS0tCi0JICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBkcml2ZXIgZm9yIHRoZSBSYWxpbmsgMjg2MCB3aXJlbGVzcyBjaGlwLgorCSAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZHJpdmVyIGZvciB0aGUgUmFsaW5rIDI4NjAgYW5kIDMwOTAKKwkgIHdpcmVsZXNzIGNoaXBzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvTWFrZWZpbGUKaW5kZXggYzlmZTkyNS4uMjNhZTA3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL01ha2VmaWxlCkBAIC0yLDI2ICsyLDMzIEBACiAKICMgVE9ETzogYWxsIG9mIHRoZXNlIHNob3VsZCBiZSByZW1vdmVkCiBFWFRSQV9DRkxBR1MgKz0gLURMSU5VWCAtREFHR1JFR0FUSU9OX1NVUFBPUlQgLURQSUdHWUJBQ0tfU1VQUE9SVCAtRFdNTV9TVVBQT1JUCi1FWFRSQV9DRkxBR1MgKz0gLURSVDI4NjAKK0VYVFJBX0NGTEFHUyArPSAtRFJUTVBfTUFDX1BDSSAtRFJUTVBfUENJX1NVUFBPUlQgLURSVDI4NjAKK0VYVFJBX0NGTEFHUyArPSAtRFJUTVBfUkZfUldfU1VQUE9SVCAtRFJUTVBfRUZVU0VfU1VQUE9SVCAtRFJUMzB4eCAtRFJUMzA5MAogRVhUUkFfQ0ZMQUdTICs9IC1EREJHCiAKIHJ0Mjg2MHN0YS1vYmpzIDo9CVwKLQljb21tb24vbWQ1Lm8JCVwKKwljb21tb24vY3J5cHRfbWQ1Lm8JXAorCWNvbW1vbi9jcnlwdF9zaGEyLm8JXAorCWNvbW1vbi9jcnlwdF9obWFjLm8JXAogCWNvbW1vbi9tbG1lLm8JCVwKLQljb21tb24vcnRtcF93ZXAubwlcCisJY29tbW9uL2NtbV93ZXAubwlcCiAJY29tbW9uL2FjdGlvbi5vCQlcCiAJY29tbW9uL2NtbV9kYXRhLm8JXAogCWNvbW1vbi9ydG1wX2luaXQubwlcCi0JY29tbW9uL3J0bXBfdGtpcC5vCVwKKwljb21tb24vY21tX3RraXAubwlcCisJY29tbW9uL2NtbV9hZXMubwlcCiAJY29tbW9uL2NtbV9zeW5jLm8JXAogCWNvbW1vbi9lZXByb20ubwkJXAogCWNvbW1vbi9jbW1fc2FuaXR5Lm8JXAogCWNvbW1vbi9jbW1faW5mby5vCVwKKwljb21tb24vY21tX2NmZy5vCVwKIAljb21tb24vY21tX3dwYS5vCVwKIAljb21tb24vZGZzLm8JCVwKIAljb21tb24vc3BlY3RydW0ubwlcCisJY29tbW9uL3J0bXBfdGltZXIubwlcCisJY29tbW9uL3J0X2NoYW5uZWwubwlcCisJY29tbW9uL2NtbV9hc2ljLm8JXAogCXN0YS9hc3NvYy5vCQlcCi0Jc3RhL2Fpcm9uZXQubwkJXAogCXN0YS9hdXRoLm8JCVwKIAlzdGEvYXV0aF9yc3AubwkJXAogCXN0YS9zeW5jLm8JCVwKQEAgLTMwLDEwICszNywxNiBAQAogCXN0YS9jb25uZWN0Lm8JCVwKIAlzdGEvd3BhLm8JCVwKIAlydF9saW51eC5vCQlcCi0JcnRfcHJvZmlsZS5vCQlcCiAJcnRfbWFpbl9kZXYubwkJXAogCXN0YV9pb2N0bC5vCQlcCiAJY29tbW9uL2JhX2FjdGlvbi5vCVwKLQljb21tb24vMjg2MF9ydG1wX2luaXQubwlcCi0JMjg2MF9tYWluX2Rldi5vCQlcCi0JY29tbW9uL2NtbV9kYXRhXzI4NjAubworCXBjaV9tYWluX2Rldi5vCQlcCisJcnRfcGNpX3JidXMubwkJXAorCWNvbW1vbi9jbW1fbWFjX3BjaS5vCVwKKwljb21tb24vY21tX2RhdGFfcGNpLm8JXAorCWNvbW1vbi9lZV9wcm9tLm8JXAorCWNvbW1vbi9ydG1wX21jdS5vCVwKKwljb21tb24vZWVfZWZ1c2UubwlcCisJY2hpcHMvcnQzMHh4Lm8JCVwKKwljb21tb24vcnRfcmYubwkJXAorCWNoaXBzL3J0MzA5MC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL1RPRE8KaW5kZXggNjE1OGRjMi4uOGUyZjZlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9UT0RPCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvVE9ETwpAQCAtOSw3ICs5LDYgQEAKIAktIGNoZWNrcGF0Y2gucGwgY2xlYW4KIAktIHNwYXJzZSBjbGVhbgogCS0gcG9ydCB0byBpbi1rZXJuZWwgODAyMTEgc3RhY2sgYW5kIGNvbW1vbiBydDJ4MDAgaW5mcmFzdHJ1Y3R1cmUKLQktIHJlbW92ZSByZWFkaW5nIGZyb20gL2V0Yy8gY29uZmlnIGZpbGVzCiAJLSByZXZpZXcgYnkgdGhlIHdpcmVsZXNzIGRldmVsb3BlciBjb21tdW5pdHkKIAogUGxlYXNlIHNlbmQgYW55IHBhdGNoZXMgb3IgY29tcGxhaW50cyBhYm91dCB0aGlzIGRyaXZlciB0byBHcmVnCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Fpcm9uZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvYWlyb25ldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTA3YjE5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvYWlyb25ldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JYWlyb25ldC5oCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCi0JUGF1bCBMaW4JMDQtMDYtMTUJCUluaXRpYWwKLSovCi0KLSNpZm5kZWYJX19BSVJPTkVUX0hfXwotI2RlZmluZQlfX0FJUk9ORVRfSF9fCi0KLS8vIE1lYXN1cmVtZW50IFR5cGUgZGVmaW5pdGlvbgotI2RlZmluZQlNU1JOX1RZUEVfVU5VU0VECQkJCTAKLSNkZWZpbmUJTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVEJCTEKLSNkZWZpbmUJTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRCQkyCi0jZGVmaW5lCU1TUk5fVFlQRV9CRUFDT05fUkVRCQkJMwotI2RlZmluZQlNU1JOX1RZUEVfRlJBTUVfUkVRCQkJCTQKLQotLy8gU2NhbiBNb2RlIGluIEJlYWNvbiBSZXF1ZXN0Ci0jZGVmaW5lCU1TUk5fU0NBTl9NT0RFX1BBU1NJVkUJCQkwCi0jZGVmaW5lCU1TUk5fU0NBTl9NT0RFX0FDVElWRQkJCTEKLSNkZWZpbmUJTVNSTl9TQ0FOX01PREVfQkVBQ09OX1RBQkxFCQkyCi0KLS8vIFBIWSB0eXBlIGRlZmluaXRpb24gZm9yIEFpcm9uZXQgYmVhY29uIHJlcG9ydCwgQ0NYIDIgdGFibGUgMzYtOQotI2RlZmluZQlQSFlfRkgJCQkJCQkJMQotI2RlZmluZQlQSFlfRFNTCQkJCQkJCTIKLSNkZWZpbmUJUEhZX1VOVVNFRAkJCQkJCTMKLSNkZWZpbmUJUEhZX09GRE0JCQkJCQk0Ci0jZGVmaW5lCVBIWV9IUl9EU1MJCQkJCQk1Ci0jZGVmaW5lCVBIWV9FUlAJCQkJCQkJNgotCi0vLyBSUEkgdGFibGUgaW4gZEJtCi0jZGVmaW5lCVJQSV8wCQkJMAkJCS8vCVBvd2VyIDw9IC04NwotI2RlZmluZQlSUElfMQkJCTEJCQkvLwktODcgPCBQb3dlciA8PSAtODIKLSNkZWZpbmUJUlBJXzIJCQkyCQkJLy8JLTgyIDwgUG93ZXIgPD0gLTc3Ci0jZGVmaW5lCVJQSV8zCQkJMwkJCS8vCS03NyA8IFBvd2VyIDw9IC03MgotI2RlZmluZQlSUElfNAkJCTQJCQkvLwktNzIgPCBQb3dlciA8PSAtNjcKLSNkZWZpbmUJUlBJXzUJCQk1CQkJLy8JLTY3IDwgUG93ZXIgPD0gLTYyCi0jZGVmaW5lCVJQSV82CQkJNgkJCS8vCS02MiA8IFBvd2VyIDw9IC01NwotI2RlZmluZQlSUElfNwkJCTcJCQkvLwktNTcgPCBQb3dlcgotCi0vLyBDaXNjbyBBaXJvbmV0IElBUFAgZGVmaW5ldGlvbnMKLSNkZWZpbmUJQUlST05FVF9JQVBQX1RZUEUJCQkJCTB4MzIKLSNkZWZpbmUJQUlST05FVF9JQVBQX1NVQlRZUEVfUkVRVUVTVAkJMHgwMQotI2RlZmluZQlBSVJPTkVUX0lBUFBfU1VCVFlQRV9SRVBPUlQJCQkweDgxCi0KLS8vIE1lYXN1cmVtZW50IFJlcXVlc3QgZGV0YWlsIGZvcm1hdAotdHlwZWRlZglzdHJ1Y3QJX01FQVNVUkVNRU5UX1JFUVVFU1QJewotCVVDSEFSCUNoYW5uZWw7Ci0JVUNIQVIJU2Nhbk1vZGU7CQkJLy8gVXNlIG9ubHkgaW4gYmVhY29uIHJlcXVlc3QsIG90aGVyIHJlcXVlc3RzIGRpZCBub3QgdXNlIHRoaXMgZmllbGQKLQlVU0hPUlQJRHVyYXRpb247Ci19CU1FQVNVUkVNRU5UX1JFUVVFU1QsICpQTUVBU1VSRU1FTlRfUkVRVUVTVDsKLQotLy8gQmVhY29uIE1lYXN1cmVtZW50IFJlcG9ydAotLy8gQWxsIHRoZXNlIGZpZWxkIG1pZ2h0IGNoYW5nZSB0byBVQ0hBUiwgYmVjYXVzZSB3ZSBkaWRuJ3QgZG8gYW55dGhpbmcgdG8gdGhlc2UgcmVwb3J0LgotLy8gV2UgY29weSBhbGwgdGhlc2UgYmVhY29ucyBhbmQgcmVwb3J0IHRvIENDWCAyIEFQLgotdHlwZWRlZglzdHJ1Y3QJX0JFQUNPTl9SRVBPUlQJewotCVVDSEFSCUNoYW5uZWw7Ci0JVUNIQVIJU3BhcmU7Ci0JVVNIT1JUCUR1cmF0aW9uOwotCVVDSEFSCVBoeVR5cGU7CQkJLy8gRGVmaW5pYXRpb24gaXMgbGlzdGVkIGFib3ZlIHRhYmxlIDM2LTkKLQlVQ0hBUglSeFBvd2VyOwotCVVDSEFSCUJTU0lEWzZdOwotCVVDSEFSCVBhcmVudFRTRls0XTsKLQlVQ0hBUglUYXJnZXRUU0ZbOF07Ci0JVVNIT1JUCUJlYWNvbkludGVydmFsOwotCVVTSE9SVAlDYXBhYmlsaXR5SW5mbzsKLX0JQkVBQ09OX1JFUE9SVCwgKlBCRUFDT05fUkVQT1JUOwotCi0vLyBGcmFtZSBNZWFzdXJlbWVudCBSZXBvcnQgKE9wdGlvbmFsKQotdHlwZWRlZglzdHJ1Y3QJX0ZSQU1FX1JFUE9SVAl7Ci0JVUNIQVIJQ2hhbm5lbDsKLQlVQ0hBUglTcGFyZTsKLQlVU0hPUlQJRHVyYXRpb247Ci0JVUNIQVIJVEE7Ci0JVUNIQVIJQlNTSURbNl07Ci0JVUNIQVIJUlNTSTsKLQlVQ0hBUglDb3VudDsKLX0JRlJBTUVfUkVQT1JULCAqUEZSQU1FX1JFUE9SVDsKLQotI3ByYWdtYSBwYWNrKDEpCi0vLyBDaGFubmVsIExvYWQgUmVwb3J0Ci10eXBlZGVmCXN0cnVjdAlfQ0hBTk5FTF9MT0FEX1JFUE9SVAl7Ci0JVUNIQVIJQ2hhbm5lbDsKLQlVQ0hBUglTcGFyZTsKLQlVU0hPUlQJRHVyYXRpb247Ci0JVUNIQVIJQ0NBQnVzeTsKLX0JQ0hBTk5FTF9MT0FEX1JFUE9SVCwgKlBDSEFOTkVMX0xPQURfUkVQT1JUOwotI3ByYWdtYSBwYWNrKCkKLQotLy8gTm9zaWUgSGlzdG9ncmFtIFJlcG9ydAotdHlwZWRlZglzdHJ1Y3QJX05PSVNFX0hJU1RfUkVQT1JUCXsKLQlVQ0hBUglDaGFubmVsOwotCVVDSEFSCVNwYXJlOwotCVVTSE9SVAlEdXJhdGlvbjsKLQlVQ0hBUglEZW5zaXR5WzhdOwotfQlOT0lTRV9ISVNUX1JFUE9SVCwgKlBOT0lTRV9ISVNUX1JFUE9SVDsKLQotLy8gUmFkaW8gTWFuYWdlbWVudCBDYXBhYmlsaXR5IGVsZW1lbnQKLXR5cGVkZWYJc3RydWN0CV9SQURJT19NQU5BR0VNRU5UX0NBUEFCSUxJVFkJewotCVVDSEFSCUVpZDsJCQkJLy8gVE9ETzogV2h5IHRoZSBFaWQgaXMgMSBieXRlLCBub3Qgbm9ybWFsIDIgYnl0ZXM/Pz8KLQlVQ0hBUglMZW5ndGg7Ci0JVUNIQVIJQWlyb25ldE91aVszXTsJCS8vIEFJcm9uZXQgT1VJICgwMCA0MCA5NikKLQlVQ0hBUglUeXBlOwkJCQkvLyBUeXBlIC8gVmVyc2lvbgotCVVTSE9SVAlTdGF0dXM7CQkJCS8vIHN3YXAxNiByZXF1aXJlZAotfQlSQURJT19NQU5BR0VNRU5UX0NBUEFCSUxJVFksICpQUkFESU9fTUFOQUdFTUVOVF9DQVBBQklMSVRZOwotCi0vLyBNZWFzdXJlbWVudCBNb2RlIEJpdCBkZWZpbml0aW9uCi10eXBlZGVmCXN0cnVjdAlfTUVBU1VSRU1FTlRfTU9ERQl7Ci0JVUNIQVIJUnN2ZDo0OwotCVVDSEFSCVJlcG9ydDoxOwotCVVDSEFSCU5vdFVzZWQ6MTsKLQlVQ0hBUglFbmFibGU6MTsKLQlVQ0hBUglQYXJhbGxlbDoxOwotfQlNRUFTVVJFTUVOVF9NT0RFLCAqUE1FQVNVUkVNRU5UX01PREU7Ci0KLS8vIE1lYXN1cmVtZW50IFJlcXVlc3QgZWxlbWVudCwgVGhpcyBpcyBsaXR0bGUgZW5kaWFuIG1vZGUKLXR5cGVkZWYJc3RydWN0CV9NRUFTVVJFTUVOVF9SRVFVRVNUX0VMRU1FTlQJewotCVVTSE9SVAkJCQlFaWQ7Ci0JVVNIT1JUCQkJCUxlbmd0aDsJCQkJLy8gc3dhcDE2IHJlcXVpcmVkCi0JVVNIT1JUCQkJCVRva2VuOwkJCQkvLyBub24temVybyB1bmlxdWUgdG9rZW4KLQlVQ0hBUgkJCQlNb2RlOwkJCQkvLyBNZWFzdXJlbWVudCBNb2RlCi0JVUNIQVIJCQkJVHlwZTsJCQkJLy8gTWVhc3VyZW1lbnQgdHlwZQotfQlNRUFTVVJFTUVOVF9SRVFVRVNUX0VMRU1FTlQsICpQTUVBU1VSRU1FTlRfUkVRVUVTVF9FTEVNRU5UOwotCi0vLyBNZWFzdXJlbWVudCBSZXBvcnQgZWxlbWVudCwgVGhpcyBpcyBsaXR0bGUgZW5kaWFuIG1vZGUKLXR5cGVkZWYJc3RydWN0CV9NRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAl7Ci0JVVNIT1JUCQkJCUVpZDsKLQlVU0hPUlQJCQkJTGVuZ3RoOwkJCQkvLyBzd2FwMTYgcmVxdWlyZWQKLQlVU0hPUlQJCQkJVG9rZW47CQkJCS8vIG5vbi16ZXJvIHVuaXF1ZSB0b2tlbgotCVVDSEFSCQkJCU1vZGU7CQkJCS8vIE1lYXN1cmVtZW50IE1vZGUKLQlVQ0hBUgkJCQlUeXBlOwkJCQkvLyBNZWFzdXJlbWVudCB0eXBlCi19CU1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5ULCAqUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UOwotCi0vLyBDaXNjbyBBaXJvbmV0IElBUFAgRnJhbWUgSGVhZGVyLCBOZXR3b3JrIGJ5dGUgb3JkZXIgdXNlZAotdHlwZWRlZglzdHJ1Y3QJX0FJUk9ORVRfSUFQUF9IRUFERVIgewotCVVDSEFSCUNpc2NvU25hcEhlYWRlcls4XTsJLy8gOCBieXRlcyBDaXNjbyBzbmFwIGhlYWRlcgotCVVTSE9SVAlMZW5ndGg7CQkJCS8vIElBUFAgSUQgJiBsZW5ndGgsIHJlbWVtYmVyIHRvIHN3YXAxNiBpbiBMRSBzeXN0ZW0KLQlVQ0hBUglUeXBlOwkJCQkvLyBJQVBQIHR5cGUKLQlVQ0hBUglTdWJUeXBlOwkJCS8vIElBUFAgc3VidHlwZQotCVVDSEFSCURBWzZdOwkJCQkvLyBEZXN0aW5hdGlvbiBNQUMgYWRkcmVzcwotCVVDSEFSCVNBWzZdOwkJCQkvLyBTb3VyY2UgTUFDIGFkZHJlc3MKLQlVU0hPUlQJVG9rZW47CQkJCS8vIERpYWxvZyB0b2tlbiwgbm8gbmVlZCB0byBzd2FwMTYgc2luY2UgaXQgaXMgZm9yIHlva2VuIHVzYWdlIG9ubHkKLX0JQUlST05FVF9JQVBQX0hFQURFUiwgKlBBSVJPTkVUX0lBUFBfSEVBREVSOwotCi0vLyBSYWRpbyBNZWFzdXJlbWVudCBSZXF1ZXN0IGZyYW1lCi10eXBlZGVmCXN0cnVjdAlfQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FCXsKLSAgICBBSVJPTkVUX0lBUFBfSEVBREVSCUlBUFA7CQkJLy8gQ29tbW9uIGhlYWRlcgotCVVDSEFSCQkJCURlbGF5OwkJCS8vIEFjdGl2YXRpb24gRGVsYXkKLQlVQ0hBUgkJCQlPZmZzZXQ7CQkJLy8gTWVhc3VyZW1lbnQgb2Zmc2V0Ci19CUFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRSwgKlBBSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUU7Ci0KLS8vIFJhZGlvIE1lYXN1cmVtZW50IFJlcG9ydCBmcmFtZQotdHlwZWRlZglzdHJ1Y3QJX0FJUk9ORVRfUk1fUkVQT1JUX0ZSQU1FCXsKLSAgICBBSVJPTkVUX0lBUFBfSEVBREVSCUlBUFA7CQkJLy8gQ29tbW9uIGhlYWRlcgotfQlBSVJPTkVUX1JNX1JFUE9SVF9GUkFNRSwgKlBBSVJPTkVUX1JNX1JFUE9SVF9GUkFNRTsKLQotLy8gU2F2ZWQgZWxlbWVudCByZXF1ZXN0IGFjdGlvbnMgd2hpY2ggd2lsbCBzYXZlZCBpbiBTdGFDZmcuCi10eXBlZGVmCXN0cnVjdAlfUk1fUkVRVUVTVF9BQ1RJT04JewotCU1FQVNVUkVNRU5UX1JFUVVFU1RfRUxFTUVOVAlSZXFFbGVtOwkJLy8gU2F2ZWQgcmVxdWVzdCBlbGVtZW50Ci0JTUVBU1VSRU1FTlRfUkVRVUVTVAkJCU1lYXN1cmVtZW50OwkvLyBTYXZlZCBtZWFzdXJlbWVudCB3aXRoaW4gdGhlIHJlcXVlc3QgZWxlbWVudAotfQlSTV9SRVFVRVNUX0FDVElPTiwgKlBSTV9SRVFVRVNUX0FDVElPTjsKLQotLy8gQ0NYIGFkbWluaXN0cmF0aW9uIGNvbnRyb2wKLXR5cGVkZWYJdW5pb24JX0NDWF9DT05UUk9MCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCUVuYWJsZToxOwkJCS8vIEVuYWJsZSBDQ1gyCi0JCVVJTlQzMgkJTGVhcEVuYWJsZToxOwkJLy8gRW5hYmxlIExFQVAgYXQgQ0NYMgotCQlVSU5UMzIJCVJNRW5hYmxlOjE7CQkJLy8gUmFkaW8gTWVhc3VyZW1lbnQgRW5hYmxlCi0JCVVJTlQzMgkJRENSTUVuYWJsZToxOwkJLy8gTm9uIHNlcnZpbmcgY2hhbm5lbCBSYWRpbyBNZWFzdXJlbWVudCBlbmFibGUKLQkJVUlOVDMyCQlRT1NFbmFibGU6MTsJCS8vIEVuYWJsZSBRT1MgZm9yIENDWCAyLjAgc3VwcG9ydAotCQlVSU5UMzIJCUZhc3RSb2FtRW5hYmxlOjE7CS8vIEVuYWJsZSBmYXN0IHJvYW1pbmcKLQkJVUlOVDMyCQlSc3ZkOjI7CQkJCS8vIE5vdCB1c2VkCi0JCVVJTlQzMgkJZEJtVG9Sb2FtOjg7CQkvLyB0aGUgY29uZGl0aW9uIHRvIHJvYW0gd2hlbiByZWNlaXZpbmcgUnNzaSBsZXNzIHRoYW4gdGhpcyB2YWx1ZS4gSXQncyBuZWdhdGl2ZSB2YWx1ZS4KLQkJVUlOVDMyCQlUdUxpbWl0OjE2OwkJCS8vIExpbWl0IGZvciBkaWZmZXJlbnQgY2hhbm5lbCBzY2FuCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlDQ1hfQ09OVFJPTCwgKlBDQ1hfQ09OVFJPTDsKLQotI2VuZGlmCS8vIF9fQUlST05FVF9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvYXAuaAppbmRleCBmY2RiMzU4Li4zZjc0NGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2FwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9hcC5oCkBAIC00MCwzOSArNDAsMjcgQEAKICNpZm5kZWYgX19BUF9IX18KICNkZWZpbmUgX19BUF9IX18KIAotLy8gYXBfbWxtZS5jCisvKiBhcF93cGEuYyAqLwordm9pZCBXcGFTdGF0ZU1hY2hpbmVJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSBzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSAqU20sIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CiAKLSNpZmRlZiBSVDI4NzAKLVZPSUQgQmVhY29uVXBkYXRlRXhlYygKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotI2VuZGlmIC8vIFJUMjg3MCAvLworI2lmZGVmIFJUTVBfTUFDX1VTQgordm9pZCBCZWFjb25VcGRhdGVFeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKLVZPSUQgUlRNUFNldFBpZ2d5QmFjaygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBCT09MRUFOCQkJYlBpZ2d5QmFjayk7Cit2b2lkIFJUTVBTZXRQaWdneUJhY2soc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJQaWdneUJhY2spOwogCi0vLyBhcC5jCit2b2lkIE1hY1RhYmxlUmVzZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBNYWNUYWJsZVJlc2V0KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3N0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKk1hY1RhYmxlSW5zZXJ0RW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgICAgdTggKnBBZGRyLAorCQkJCSAgICAgdTggYXBpZHgsIElOIEJPT0xFQU4gQ2xlYW5BbGwpOwogCi1NQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlSW5zZXJ0RW50cnkoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkciwKLQlJTglVQ0hBUgkJCWFwaWR4LAotCUlOIEJPT0xFQU4JQ2xlYW5BbGwpOworQk9PTEVBTiBNYWNUYWJsZURlbGV0ZUVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1MTYgd2NpZCwgdTggKnBBZGRyKTsKIAotQk9PTEVBTiBNYWNUYWJsZURlbGV0ZUVudHJ5KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIFVTSE9SVCB3Y2lkLAotICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIpOworc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqTWFjVGFibGVMb29rdXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqcEFkZHIpOwogCi1NQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlTG9va3VwKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIpOwotCi0jZW5kaWYgIC8vIF9fQVBfSF9fCi0KKyNlbmRpZiAvKiBfX0FQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL21hY19wY2kuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9tYWNfcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3MDRhYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9tYWNfcGNpLmgKQEAgLTAsMCArMSwzNTUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisJbWFjX3BjaS5oCisKKyAgICBBYnN0cmFjdDoKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIF9fTUFDX1BDSV9IX18KKyNkZWZpbmUgX19NQUNfUENJX0hfXworCisjaW5jbHVkZSAiLi4vcnRtcF90eXBlLmgiCisjaW5jbHVkZSAicnRtcF9tYWMuaCIKKyNpbmNsdWRlICJydG1wX3BoeS5oIgorI2luY2x1ZGUgIi4uL3J0bXBfaWZhY2UuaCIKKyNpbmNsdWRlICIuLi9ydG1wX2RvdDExLmgiCisKKy8qICovCisvKiBEZXZpY2UgSUQgJiBWZW5kb3IgSUQgcmVsYXRlZCBkZWZpbml0aW9ucywgKi8KKy8qIE5PVEU6IHlvdSBzaG91bGQgbm90IGFkZCB0aGUgbmV3IFZlbmRvcklEL0RldmljZUlEIGhlcmUgdW5sZXNzIHlvdSBub3Qgc3VyZSBpdCBiZWxvbmdzIHRvIHdoYXQgY2hpcC4gKi8KKy8qICovCisjZGVmaW5lIE5JQ19QQ0lfVkVORE9SX0lECQkweDE4MTQKKyNkZWZpbmUgUENJQlVTX0lOVEVMX1ZFTkRPUgkweDgwODYKKworI2lmICFkZWZpbmVkKFBDSV9DQVBfSURfRVhQKQorI2RlZmluZSBQQ0lfQ0FQX0lEX0VYUAkJCSAgICAweDEwCisjZW5kaWYKKyNpZiAhZGVmaW5lZChQQ0lfRVhQX0xOS0NUTCkKKyNkZWZpbmUgUENJX0VYUF9MTktDVEwJCQkgICAgMHgxMAorI2VuZGlmCisjaWYgIWRlZmluZWQoUENJX0NMQVNTX0JSSURHRV9QQ0kpCisjZGVmaW5lIFBDSV9DTEFTU19CUklER0VfUENJCQkweDA2MDQKKyNlbmRpZgorCisjZGVmaW5lIFRYSU5GT19TSVpFCQkJCQkJMAorI2RlZmluZSBSVE1QX1BLVF9UQUlMX1BBRERJTkcJCQkwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYCTAKKworI2RlZmluZSBBVVhfQ1RSTCAgICAgICAgICAgMHgxMGMKKworLyogKi8KKy8qIFRYIGRlc2NyaXB0b3IgZm9ybWF0LCBUeCAgICAgcmluZywgTWdtdCBSaW5nICovCisvKiAqLworc3RydWN0IFBBQ0tFRCBydF90eGQgeworCS8qIFdvcmQgMCAqLworCXUzMiBTRFB0cjA7CisJLyogV29yZCAxICovCisJdTMyIFNETGVuMToxNDsKKwl1MzIgTGFzdFNlYzE6MTsKKwl1MzIgQnVyc3Q6MTsKKwl1MzIgU0RMZW4wOjE0OworCXUzMiBMYXN0U2VjMDoxOworCXUzMiBETUFET05FOjE7CisJLypXb3JkMiAqLworCXUzMiBTRFB0cjE7CisJLypXb3JkMyAqLworCXUzMiByc3YyOjI0OworCXUzMiBXSVY6MTsJCS8qIFdpcmVsZXNzIEluZm8gVmFsaWQuIDEgaWYgRHJpdmVyIGFscmVhZHkgZmlsbCBXSSwgIG8gaWYgRE1BIG5lZWRzIHRvIGNvcHkgV0kgdG8gY29ycmVjdHBvc2l0aW9uICovCisJdTMyIFFTRUw6MjsJCS8qIHNlbGVjdCBvbi1jaGlwIEZJRk8gSUQgZm9yIDJuZC1zdGFnZSBvdXRwdXQgc2NoZWR1bGVyLjA6TUdNVCwgMTpIQ0NBIDI6RURDQSAqLworCXUzMiByc3Y6MjsKKwl1MzIgVENPOjE7CQkvKiAqLworCXUzMiBVQ086MTsJCS8qICovCisJdTMyIElDTzoxOwkJLyogKi8KK307CisKKy8qICovCisvKiBSeCBkZXNjcmlwdG9yIGZvcm1hdCwgUnggUmluZyAqLworLyogKi8KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBydF9yeGQgeworCS8qIFdvcmQgMCAqLworCXUzMiBTRFAwOworCS8qIFdvcmQgMSAqLworCXUzMiBTREwxOjE0OworCXUzMiBSc3Y6MjsKKwl1MzIgU0RMMDoxNDsKKwl1MzIgTFMwOjE7CisJdTMyIERET05FOjE7CisJLyogV29yZCAyICovCisJdTMyIFNEUDE7CisJLyogV29yZCAzICovCisJdTMyIEJBOjE7CisJdTMyIERBVEE6MTsKKwl1MzIgTlVMTERBVEE6MTsKKwl1MzIgRlJBRzoxOworCXUzMiBVMk06MTsJCS8qIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZSAqLworCXUzMiBNY2FzdDoxOwkJLyogMTogdGhpcyBpcyBhIG11bHRpY2FzdCBmcmFtZSAqLworCXUzMiBCY2FzdDoxOwkJLyogMTogdGhpcyBpcyBhIGJyb2FkY2FzdCBmcmFtZSAqLworCXUzMiBNeUJzczoxOwkJLyogMTogdGhpcyBmcmFtZSBiZWxvbmdzIHRvIHRoZSBzYW1lIEJTU0lEICovCisJdTMyIENyYzoxOwkJLyogMTogQ1JDIGVycm9yICovCisJdTMyIENpcGhlckVycjoyOwkvKiAwOiBkZWNyeXB0aW9uIG9rYXksIDE6SUNWIGVycm9yLCAyOk1JQyBlcnJvciwgMzpLRVkgbm90IHZhbGlkICovCisJdTMyIEFNU0RVOjE7CQkvKiByeCB3aXRoIDgwMi4zIGhlYWRlciwgbm90IDgwMi4xMSBoZWFkZXIuICovCisJdTMyIEhUQzoxOworCXUzMiBSU1NJOjE7CisJdTMyIEwyUEFEOjE7CisJdTMyIEFNUERVOjE7CisJdTMyIERlY3J5cHRlZDoxOwkvKiB0aGlzIGZyYW1lIGlzIGJlaW5nIGRlY3J5cHRlZC4gKi8KKwl1MzIgUGxjcFNpZ25hbDoxOwkvKiBUbyBiZSBtb3ZlZCAqLworCXUzMiBQbGNwUnNzaWw6MTsJLyogVG8gYmUgbW92ZWQgKi8KKwl1MzIgUnN2MToxMzsKK30gUlQyOFhYX1JYRF9TVFJVQywgKlBSVDI4WFhfUlhEX1NUUlVDOworCit0eXBlZGVmIHVuaW9uIF9UWF9BVFRFTlVBVElPTl9DVFJMX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIFJGX0lTT0xBVElPTl9FTkFCTEU6MTsKKwkJdW5zaWduZWQgbG9uZyBSZXNlcnZlMjo3OworCQl1bnNpZ25lZCBsb25nIFBDSUVfUEhZX1RYX0FUVEVOX1ZBTFVFOjM7CisJCXVuc2lnbmVkIGxvbmcgUENJRV9QSFlfVFhfQVRURU5fRU46MTsKKwkJdW5zaWduZWQgbG9uZyBSZXNlcnZlMToyMDsKKwl9IGZpZWxkOworCisJdW5zaWduZWQgbG9uZyB3b3JkOworfSBUWF9BVFRFTlVBVElPTl9DVFJMX1NUUlVDLCAqUFRYX0FUVEVOVUFUSU9OX0NUUkxfU1RSVUM7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIEVFUFJPTSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIDgwNTEgZmlybXdhcmUgaW1hZ2UgZm9yIFJUMjg2MCAtIGJhc2UgYWRkcmVzcyA9IDB4NDAwMCAqLworI2RlZmluZSBGSVJNV0FSRV9JTUFHRV9CQVNFICAgICAweDIwMDAKKyNkZWZpbmUgTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUgMHgyMDAwCS8qIDhrYnl0ZSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBGcmltd2FyZSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJUTVBfV1JJVEVfRklSTVdBUkUoX3BBZCwgX3BGd0ltYWdlLCBfRndMZW4pCQkJXAorCWRvewkJCQkJCQkJXAorCQl1bnNpZ25lZCBsb25nCV9pLCBfZmlybTsJCQkJCVwKKwkJUlRNUF9JT19XUklURTMyKF9wQWQsIFBCRl9TWVNfQ1RSTCwgMHgxMDAwMCk7CQlcCisJCQkJCQkJCQlcCisJCWZvcihfaT0wOyBfaTxfRndMZW47IF9pKz00KQkJCQlcCisJCXsJCQkJCQkJXAorCQkJX2Zpcm0gPSBfcEZ3SW1hZ2VbX2ldICsJCQkJXAorCQkJICAgKF9wRndJbWFnZVtfaSszXSA8PCAyNCkgKwkJCVwKKwkJCSAgIChfcEZ3SW1hZ2VbX2krMl0gPDwgMTYpICsJCQlcCisJCQkgICAoX3BGd0ltYWdlW19pKzFdIDw8IDgpOwkJCVwKKwkJCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBGSVJNV0FSRV9JTUFHRV9CQVNFICsgX2ksIF9maXJtKTsJXAorCQl9CQkJCQkJCVwKKwkJUlRNUF9JT19XUklURTMyKF9wQWQsIFBCRl9TWVNfQ1RSTCwgMHgwMDAwMCk7CQlcCisJCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBQQkZfU1lTX0NUUkwsIDB4MDAwMDEpOwkJXAorCQkJCQkJCQkJXAorCQkvKiBpbml0aWFsaXplIEJCUCBSL1cgYWNjZXNzIGFnZW50ICovCQkJXAorCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgSDJNX0JCUF9BR0VOVCwgMCk7CQlcCisJCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBIMk1fTUFJTEJPWF9DU1IsIDApOwkJXAorCX13aGlsZSgwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBUWCBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJUTVBfU1RBUlRfREVRVUVVRShwQWQsIFF1ZUlkeCwgaXJxRmxhZ3MpCQlkb3t9d2hpbGUoMCkKKyNkZWZpbmUgUlRNUF9TVE9QX0RFUVVFVUUocEFkLCBRdWVJZHgsIGlycUZsYWdzKQkJZG97fXdoaWxlKDApCisKKyNkZWZpbmUgUlRNUF9IQVNfRU5PVUdIX0ZSRUVfREVTQyhwQWQsIHBUeEJsaywgZnJlZU51bSwgcFBhY2tldCkgXAorCQkoKGZyZWVOdW0pID49ICh1bnNpZ25lZCBsb25nKShwVHhCbGstPlRvdGFsRnJhZ051bSArIFJUTVBfR0VUX1BBQ0tFVF9GUkFHTUVOVFMocFBhY2tldCkgKyAzKSkJLyogcm91Z2ggZXN0aW1hdGUgd2Ugd2lsbCB1c2UgMyBtb3JlIGRlc2NyaXB0b3IuICovCisjZGVmaW5lIFJUTVBfUkVMRUFTRV9ERVNDX1JFU09VUkNFKHBBZCwgUXVlSWR4KQlcCisJCWRve313aGlsZSgwKQorCisjZGVmaW5lIE5FRURfUVVFVUVfQkFDS19GT1JfQUdHKHBBZCwgUXVlSWR4LCBmcmVlTnVtLCBfVHhGcmFtZVR5cGUpIFwKKwkJKCgoZnJlZU51bSAhPSAoVFhfUklOR19TSVpFLTEpKSAmJiAocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPT0gMCkpIHx8IChmcmVlTnVtPDMpKQorCisjZGVmaW5lIEhBTF9LaWNrT3V0TWdtdFR4KF9wQWQsIF9RdWVJZHgsIF9wUGFja2V0LCBfcFNyY0J1ZlZBLCBfU3JjQnVmTGVuKQlcCisJCQlSdG1wUENJTWdtdEtpY2tPdXQoX3BBZCwgX1F1ZUlkeCwgX3BQYWNrZXQsIF9wU3JjQnVmVkEsIF9TcmNCdWZMZW4pCisKKyNkZWZpbmUgSEFMX1dyaXRlU3ViVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKKwkJCQkvKiBSdG1wUENJX1dyaXRlU3ViVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgYklzTGFzdCwgcEZyZWVOdW1iZXIpICovCisKKyNkZWZpbmUgSEFMX1dyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsayxiSXNMYXN0LCBwRnJlZU51bWJlcikJXAorCQkJUnRtcFBDSV9Xcml0ZVNpbmdsZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKQorCisjZGVmaW5lIEhBTF9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCBwRnJlZU51bWJlcikgXAorCQkJUnRtcFBDSV9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssZnJhbWVOdW0sIHBGcmVlTnVtYmVyKQlcCisJCQlSdG1wUENJX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgcEZyZWVOdW1iZXIpCisKKyNkZWZpbmUgSEFMX0ZpbmFsV3JpdGVUeFJlc291cmNlKF9wQWQsIF9wVHhCbGssIF9Ub3RhbE1QRFVTaXplLCBfRmlyc3RUeElkeCkJXAorCQkJUnRtcFBDSV9GaW5hbFdyaXRlVHhSZXNvdXJjZShfcEFkLCBfcFR4QmxrLCBfVG90YWxNUERVU2l6ZSwgX0ZpcnN0VHhJZHgpCisKKyNkZWZpbmUgSEFMX0xhc3RUeElkeChfcEFkLCBfUXVlSWR4LF9MYXN0VHhJZHgpIFwKKwkJCQkvKlJ0bXBQQ0lEYXRhTGFzdFR4SWR4KF9wQWQsIF9RdWVJZHgsX0xhc3RUeElkeCkgKi8KKworI2RlZmluZSBIQUxfS2lja091dFR4KF9wQWQsIF9wVHhCbGssIF9RdWVJZHgpCVwKKwkJCVJUTVBfSU9fV1JJVEUzMigoX3BBZCksIFRYX0NUWF9JRFgwKygoX1F1ZUlkeCkqMHgxMCksIChfcEFkKS0+VHhSaW5nWyhfUXVlSWR4KV0uVHhDcHVJZHgpCisvKgkJCVJ0bXBQQ0lEYXRhS2lja091dChfcEFkLCBfcFR4QmxrLCBfUXVlSWR4KSovCisKKyNkZWZpbmUgSEFMX0tpY2tPdXROdWxsRnJhbWVUeChfcEFkLCBfUXVlSWR4LCBfcE51bGxGcmFtZSwgX2ZyYW1lTGVuKQlcCisJCQlNaW5pcG9ydE1NUmVxdWVzdChfcEFkLCBfUXVlSWR4LCBfcE51bGxGcmFtZSwgX2ZyYW1lTGVuKQorCisjZGVmaW5lIEdFVF9UWFJJTkdfRlJFRU5PKF9wQWQsIF9RdWVJZHgpIFwKKwkoX3BBZC0+VHhSaW5nW19RdWVJZHhdLlR4U3dGcmVlSWR4ID4gX3BBZC0+VHhSaW5nW19RdWVJZHhdLlR4Q3B1SWR4KQk/IFwKKwkJCShfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHggLSBfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhDcHVJZHggLSAxKSBcCisJCQkgOglcCisJCQkoX3BBZC0+VHhSaW5nW19RdWVJZHhdLlR4U3dGcmVlSWR4ICsgVFhfUklOR19TSVpFIC0gX3BBZC0+VHhSaW5nW19RdWVJZHhdLlR4Q3B1SWR4IC0gMSk7CisKKyNkZWZpbmUgR0VUX01HTVRSSU5HX0ZSRUVOTyhfcEFkKSBcCisJKF9wQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID4gX3BBZC0+TWdtdFJpbmcuVHhDcHVJZHgpCT8gXAorCQkJKF9wQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4IC0gX3BBZC0+TWdtdFJpbmcuVHhDcHVJZHggLSAxKSBcCisJCQkgOglcCisJCQkoX3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggKyBNR01UX1JJTkdfU0laRSAtIF9wQWQtPk1nbXRSaW5nLlR4Q3B1SWR4IC0gMSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIFJYIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0gQVNJQyBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisvKiByZXNldCBNQUMgb2YgYSBzdGF0aW9uIGVudHJ5IHRvIDB4MDAwMDAwMDAwMDAwICovCisjZGVmaW5lIFJUTVBfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIFdjaWQpCVwKKwlBc2ljRGVsV2NpZFRhYihwQWQsIFdjaWQpOworCisvKiBhZGQgdGhpcyBlbnRyeSBpbnRvIEFTSUMgUlggV0NJRCBzZWFyY2ggdGFibGUgKi8KKyNkZWZpbmUgUlRNUF9TVEFfRU5UUllfQUREKHBBZCwgcEVudHJ5KQkJXAorCUFzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIHBFbnRyeS0+QWlkLCBwRW50cnktPkFkZHIpOworCisvKiBhZGQgYnkgam9obmxpLCBmaXggImluX2ludGVycnVwdCIgZXJyb3Igd2hlbiBjYWxsICJNYWNUYWJsZURlbGV0ZUVudHJ5IiBpbiBSeCB0YXNrbGV0ICovCisvKiBTZXQgTUFDIHJlZ2lzdGVyIHZhbHVlIGFjY29yZGluZyBvcGVyYXRpb24gbW9kZSAqLworI2RlZmluZSBSVE1QX1VQREFURV9QUk9URUNUKHBBZCkJXAorCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCwgKEFMTE5fU0VUUFJPVEVDVCksIFRSVUUsIDApOworLyogZW5kIGpvaG5saSAqLworCisvKiByZW1vdmUgUGFpci13aXNlIGtleSBtYXRlcmlhbCBmcm9tIEFTSUMgKi8KKyNkZWZpbmUgUlRNUF9TVEFfRU5UUllfS0VZX0RFTChwQWQsIEJzc0lkeCwgV2NpZCkJXAorCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgQnNzSWR4LCAodTgpV2NpZCk7CisKKy8qIGFkZCBDbGllbnQgc2VjdXJpdHkgaW5mb3JtYXRpb24gaW50byBBU0lDIFdDSUQgdGFibGUgYW5kIElWRUlWIHRhYmxlICovCisjZGVmaW5lIFJUTVBfU1RBX1NFQ1VSSVRZX0lORk9fQUREKHBBZCwgYXBpZHgsIEtleUlELCBwRW50cnkpCQlcCisJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIGFwaWR4LCBLZXlJRCwJCQlcCisJCQkJCQkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5DaXBoZXJBbGcsIHBFbnRyeSk7CisKKyNkZWZpbmUgUlRNUF9TRUNVUklUWV9LRVlfQUREKHBBZCwgYXBpZHgsIEtleUlELCBwRW50cnkpCQlcCisJewkvKiB1cGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZSAqLwlcCisJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIGFwaWR4LCBLZXlJRCwJCQkJCVwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5DaXBoZXJBbGcsCQlcCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uS2V5LAkJCQlcCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uVHhNaWMsCQkJXAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLlJ4TWljKTsJCQlcCisJCS8qIHVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSAqLwkJCVwKKwkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIGFwaWR4LCBLZXlJRCwJCQkJCVwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5DaXBoZXJBbGcsCQlcCisJCQkJCQkgIHBFbnRyeSk7IH0KKworLyogSW5zZXJ0IHRoZSBCQSBiaXRtYXAgdG8gQVNJQyBmb3IgdGhlIFdjaWQgZW50cnkgKi8KKyNkZWZpbmUgUlRNUF9BRERfQkFfU0VTU0lPTl9UT19BU0lDKF9wQWQsIF9BaWQsIF9USUQpCVwKKwkJZG97CQkJCQlcCisJCQl1MzIgX1ZhbHVlID0gMCwgX09mZnNldDsJCQkJCVwKKwkJCV9PZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgKF9BaWQpICogSFdfV0NJRF9FTlRSWV9TSVpFICsgNDsJXAorCQkJUlRNUF9JT19SRUFEMzIoKF9wQWQpLCBfT2Zmc2V0LCAmX1ZhbHVlKTtcCisJCQlfVmFsdWUgfD0gKDB4MTAwMDA8PChfVElEKSk7CVwKKwkJCVJUTVBfSU9fV1JJVEUzMigoX3BBZCksIF9PZmZzZXQsIF9WYWx1ZSk7XAorCQl9d2hpbGUoMCkKKworLyogUmVtb3ZlIHRoZSBCQSBiaXRtYXAgZnJvbSBBU0lDIGZvciB0aGUgV2NpZCBlbnRyeSAqLworLyogICAgICAgICAgICAgIGJpdG1hcCBmaWVsZCBzdGFydHMgYXQgMHgxMDAwMCBpbiBBU0lDIFdDSUQgdGFibGUgKi8KKyNkZWZpbmUgUlRNUF9ERUxfQkFfU0VTU0lPTl9GUk9NX0FTSUMoX3BBZCwgX1djaWQsIF9USUQpCQkJCVwKKwkJZG97CQkJCQkJCQlcCisJCQl1MzIgX1ZhbHVlID0gMCwgX09mZnNldDsJCQkJXAorCQkJX09mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyAoX1djaWQpICogSFdfV0NJRF9FTlRSWV9TSVpFICsgNDsJXAorCQkJUlRNUF9JT19SRUFEMzIoKF9wQWQpLCBfT2Zmc2V0LCAmX1ZhbHVlKTsJCQlcCisJCQlfVmFsdWUgJj0gKH4oMHgxMDAwMCA8PCAoX1RJRCkpKTsJCQkJXAorCQkJUlRNUF9JT19XUklURTMyKChfcEFkKSwgX09mZnNldCwgX1ZhbHVlKTsJCQlcCisJCX13aGlsZSgwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBJbnRlcmZhY2UgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAqLworLyogRW5hYmxlICYgRGlzYWJsZSBOSUMgaW50ZXJydXB0IHZpYSB3cml0aW5nIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisvKiBTaW5jZSBpdCB1c2UgQURBUFRFUiBzdHJ1Y3R1cmUsIGl0IGhhdmUgdG8gYmUgcHV0IGFmdGVyIHN0cnVjdHVyZSBkZWZpbml0aW9uLiAqLworLyogKi8KKyNkZWZpbmUgUlRNUF9BU0lDX0lOVEVSUlVQVF9ESVNBQkxFKF9wQWQpCQlcCisJZG97CQkJXAorCQlSVE1QX0lPX1dSSVRFMzIoKF9wQWQpLCBJTlRfTUFTS19DU1IsIDB4MCk7ICAgICAvKiAwOiBkaXNhYmxlICovCVwKKwkJUlRNUF9DTEVBUl9GTEFHKChfcEFkKSwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFKTsJCVwKKwl9d2hpbGUoMCkKKworI2RlZmluZSBSVE1QX0FTSUNfSU5URVJSVVBUX0VOQUJMRShfcEFkKVwKKwlkb3sJCQkJXAorCQlSVE1QX0lPX1dSSVRFMzIoKF9wQWQpLCBJTlRfTUFTS19DU1IsIChfcEFkKS0+aW50X2VuYWJsZV9yZWcgLypERUxBWUlOVE1BU0sqLyk7ICAgICAvKiAxOmVuYWJsZSAqLwlcCisJCVJUTVBfU0VUX0ZMQUcoKF9wQWQpLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpOwlcCisJfXdoaWxlKDApCisKKyNkZWZpbmUgUlRNUF9JUlFfSU5JVChwQWQpCVwKKwl7CXBBZC0+aW50X2VuYWJsZV9yZWcgPSAoKERFTEFZSU5UTUFTSykgfAkJXAorCQkJCQkoUnhJTlR8VHhEYXRhSW50fFR4TWdtdEludCkpICYgfigweDAzKTsJXAorCQlwQWQtPmludF9kaXNhYmxlX21hc2sgPSAwOwkJCQkJCVwKKwkJcEFkLT5pbnRfcGVuZGluZyA9IDA7IH0KKworI2RlZmluZSBSVE1QX0lSUV9FTkFCTEUocEFkKQkJCQkJXAorCXsJLyogY2xlYXIgZ2FyYmFnZSBpbnRzICovCQkJXAorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgMHhmZmZmZmZmZik7XAorCQlSVE1QX0FTSUNfSU5URVJSVVBUX0VOQUJMRShwQWQpOyB9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIE1MTUUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSVE1QX01MTUVfSEFORExFUihwQWQpCQkJTWxtZUhhbmRsZXIocEFkKQorCisjZGVmaW5lIFJUTVBfTUxNRV9QUkVfU0FOSVRZX0NIRUNLKHBBZCkKKworI2RlZmluZSBSVE1QX01MTUVfU1RBX1FVSUNLX1JTUF9XQUtFX1VQKHBBZCkJXAorCQlSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLCAxMDApOworCisjZGVmaW5lIFJUTVBfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZCkJXAorCQlNbG1lUmVzdGFydFN0YXRlTWFjaGluZShwQWQpCisKKyNkZWZpbmUgUlRNUF9IQU5ETEVfQ09VTlRFUl9NRUFTVVJFKF9wQWQsIF9wRW50cnkpXAorCQlIYW5kbGVDb3VudGVyTWVhc3VyZShfcEFkLCBfcEVudHJ5KQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBQb3dlciBTYXZlIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUlRNUF9QU19QT0xMX0VOUVVFVUUocEFkKQkJCQlFbnF1ZXVlUHNQb2xsKHBBZCkKKworLyogRm9yIFJUTVBQQ0llUG93ZXJMaW5rQ3RybFJlc3RvcmUgKCkgZnVuY3Rpb24gKi8KKyNkZWZpbmUgUkVTVE9SRV9IQUxUCQkxCisjZGVmaW5lIFJFU1RPUkVfV0FLRVVQCQkyCisjZGVmaW5lIFJFU1RPUkVfQ0xPU0UgICAgICAgICAgIDMKKworI2RlZmluZSBQb3dlclNhZmVDSUQJCTEKKyNkZWZpbmUgUG93ZXJSYWRpb09mZkNJRAkyCisjZGVmaW5lIFBvd2VyV2FrZUNJRAkJMworI2RlZmluZSBDSUQwTUFTSwkJMHgwMDAwMDBmZgorI2RlZmluZSBDSUQxTUFTSwkJMHgwMDAwZmYwMAorI2RlZmluZSBDSUQyTUFTSwkJMHgwMGZmMDAwMAorI2RlZmluZSBDSUQzTUFTSwkJMHhmZjAwMDAwMAorCisjZGVmaW5lIFJUTVBfU1RBX0ZPUkNFX1dBS0VVUChwQWQsIGJGcm9tVHgpIFwKKyAgICBSVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXAocEFkLCBiRnJvbVR4KTsKKworI2RlZmluZSBSVE1QX1NUQV9TTEVFUF9USEVOX0FVVE9fV0FLRVVQKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCkgXAorICAgIFJUMjh4eFBjaVN0YUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7CisKKyNkZWZpbmUgUlRNUF9TRVRfUFNNX0JJVChfcEFkLCBfdmFsKSBcCisJTWxtZVNldFBzbUJpdChfcEFkLCBfdmFsKTsKKworI2RlZmluZSBSVE1QX01MTUVfUkFESU9fT04ocEFkKSBcCisgICAgUlQyOHh4UGNpTWxtZVJhZGlvT24ocEFkKTsKKworI2RlZmluZSBSVE1QX01MTUVfUkFESU9fT0ZGKHBBZCkgXAorICAgIFJUMjh4eFBjaU1sbWVSYWRpb09GRihwQWQpOworCisjZW5kaWYgLypfX01BQ19QQ0lfSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvbWFjX3VzYi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL21hY191c2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjY3YzBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL21hY191c2IuaApAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICAgICAgbWFjX3VzYi5oCisKKyAgICBBYnN0cmFjdDoKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIF9fTUFDX1VTQl9IX18KKyNkZWZpbmUgX19NQUNfVVNCX0hfXworCisjaW5jbHVkZSAiLi4vcnRtcF90eXBlLmgiCisjaW5jbHVkZSAicnRtcF9tYWMuaCIKKyNpbmNsdWRlICJydG1wX3BoeS5oIgorI2luY2x1ZGUgIi4uL3J0bXBfaWZhY2UuaCIKKyNpbmNsdWRlICIuLi9ydG1wX2RvdDExLmgiCisKKyNkZWZpbmUgVVNCX0NZQ19DRkcJCQkJMHgwMmE0CisKKyNkZWZpbmUgQkVBQ09OX1JJTkdfU0laRQkJMgorI2RlZmluZSBNR01UUElQRUlEWAkJCQkwCS8qIEVQNiBpcyBoaWdoZXN0IHByaW9yaXR5ICovCisKKyNkZWZpbmUgUlRNUF9QS1RfVEFJTF9QQURESU5HCTExCS8qIDMobWF4IDQgYnl0ZSBwYWRkaW5nKSArIDQgKGxhc3QgcGFja2V0IHBhZGRpbmcpICsgNCAoTWF4QnVsa091dHNpemUgYWxpZ24gcGFkZGluZykgKi8KKworI2RlZmluZSBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWAkJXAorCQkoZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwJXAorCQkgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCB8IFwKKwkJIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpCisKKy8qICovCisvKiBSWElORk8gYXBwZW5kcyBhdCB0aGUgZW5kIG9mIGVhY2ggcnggcGFja2V0LiAqLworLyogKi8KKyNkZWZpbmUgUlhJTkZPX1NJWkUJCQkJNAorI2RlZmluZSBSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRQk0CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBydF9yeGluZm8geworCXUzMiBCQToxOworCXUzMiBEQVRBOjE7CisJdTMyIE5VTExEQVRBOjE7CisJdTMyIEZSQUc6MTsKKwl1MzIgVTJNOjE7CQkvKiAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUgKi8KKwl1MzIgTWNhc3Q6MTsJCS8qIDE6IHRoaXMgaXMgYSBtdWx0aWNhc3QgZnJhbWUgKi8KKwl1MzIgQmNhc3Q6MTsJCS8qIDE6IHRoaXMgaXMgYSBicm9hZGNhc3QgZnJhbWUgKi8KKwl1MzIgTXlCc3M6MTsJCS8qIDE6IHRoaXMgZnJhbWUgYmVsb25ncyB0byB0aGUgc2FtZSBCU1NJRCAqLworCXUzMiBDcmM6MTsJCS8qIDE6IENSQyBlcnJvciAqLworCXUzMiBDaXBoZXJFcnI6MjsJLyogMDogZGVjcnlwdGlvbiBva2F5LCAxOklDViBlcnJvciwgMjpNSUMgZXJyb3IsIDM6S0VZIG5vdCB2YWxpZCAqLworCXUzMiBBTVNEVToxOwkJLyogcnggd2l0aCA4MDIuMyBoZWFkZXIsIG5vdCA4MDIuMTEgaGVhZGVyLiAqLworCXUzMiBIVEM6MTsKKwl1MzIgUlNTSToxOworCXUzMiBMMlBBRDoxOworCXUzMiBBTVBEVToxOwkJLyogVG8gYmUgbW92ZWQgKi8KKwl1MzIgRGVjcnlwdGVkOjE7CisJdTMyIFBsY3BSc3NpbDoxOworCXUzMiBDaXBoZXJBbGc6MTsKKwl1MzIgTGFzdEFNU0RVOjE7CisJdTMyIFBsY3BTaWduYWw6MTI7Cit9IFJUMjhYWF9SWERfU1RSVUMsICpQUlQyOFhYX1JYRF9TVFJVQzsKKworLyogKi8KKy8qIFRYSU5GTyAqLworLyogKi8KKyNkZWZpbmUgVFhJTkZPX1NJWkUJCQkJNAorCitzdHJ1Y3QgcnRfdHhpbmZvIHsKKwkvKiBXb3JkIDAgKi8KKwl1MzIgVVNCRE1BVHhQa3RMZW46MTY7CS8qdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlZ2F0aW9uLCAgVG90YWwgYnl0ZSBjb3VudHMgb2YgYWxsIHN1Yi1mcmFtZS4gKi8KKwl1MzIgcnN2Ojg7CisJdTMyIFdJVjoxOwkJLyogV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24gKi8KKwl1MzIgUVNFTDoyOwkJLyogc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBICovCisJdTMyIFN3VXNlTGFzdFJvdW5kOjE7CS8qIFNvZnR3YXJlIHVzZS4gKi8KKwl1MzIgcnN2MjoyOwkJLyogU29mdHdhcmUgdXNlLiAqLworCXUzMiBVU0JETUFOZXh0VkxEOjE7CS8qdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlZ2F0aW9uLCBOZXh0VmFsaWQgKi8KKwl1MzIgVVNCRE1BVHhidXJzdDoxOwkvKnVzZWQgT05MWSBpbiBVU0IgYnVsayBBZ2dyZS4gRm9yY2UgVVNCIERNQSB0cmFuc21pdCBmcmFtZSBmcm9tIGN1cnJlbnQgc2VsZWN0ZWQgZW5kcG9pbnQgKi8KK307CisKKy8qICovCisvKiBNYW5hZ2VtZW50IHJpbmcgYnVmZmVyIGZvcm1hdCAqLworLyogKi8KK3N0cnVjdCBydF9tZ210IHsKKwlCT09MRUFOIFZhbGlkOworCXU4ICpwQnVmZmVyOworCXVuc2lnbmVkIGxvbmcgTGVuZ3RoOworfTsKKworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworLyogVGhlIHN0cnVjdCBydF90eF9idWZmZXIgc3RydWN0dXJlIGZvcm1zIHRoZSB0cmFuc21pdHRlZCBVU0IgcGFja2V0IHRvIHRoZSBkZXZpY2UgKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KK3N0cnVjdCBydF90eF9idWZmZXIgeworCXVuaW9uIHsKKwkJdTggV2lyZWxlc3NQYWNrZXRbVFhfQlVGRkVSX05PUk1TSVpFXTsKKwkJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgTnVsbEZyYW1lOworCQlzdHJ1Y3QgcnRfcHNwb2xsX2ZyYW1lIFBzUG9sbFBhY2tldDsKKwkJc3RydWN0IHJ0X3J0c19mcmFtZSBSVFNGcmFtZTsKKwl9IGZpZWxkOworCXU4IEFnZ3JlZ2F0aW9uWzRdOwkvKkJ1ZmZlciBmb3Igc2F2ZSBBZ2dyZWdhdGlvbiBzaXplLiAqLworfTsKKworc3RydWN0IHJ0X2h0dHhfYnVmZmVyIHsKKwl1bmlvbiB7CisJCXU4IFdpcmVsZXNzUGFja2V0W01BWF9UWEJVTEtfU0laRV07CisJCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIE51bGxGcmFtZTsKKwkJc3RydWN0IHJ0X3BzcG9sbF9mcmFtZSBQc1BvbGxQYWNrZXQ7CisJCXN0cnVjdCBydF9ydHNfZnJhbWUgUlRTRnJhbWU7CisJfSBmaWVsZDsKKwl1OCBBZ2dyZWdhdGlvbls0XTsJLypCdWZmZXIgZm9yIHNhdmUgQWdncmVnYXRpb24gc2l6ZS4gKi8KK307CisKKy8qIHVzZWQgdG8gdHJhY2sgZHJpdmVyLWdlbmVyYXRlZCB3cml0ZSBpcnBzICovCitzdHJ1Y3QgcnRfdHhfY29udGV4dCB7CisJdm9pZCAqcEFkOwkJLypJbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUgKi8KKwlQVVJCIHBVcmI7CQkvKkluaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZSAqLworCVBJUlAgcElycDsJCS8qdXNlZCB0byBjYW5jZWwgcGVuZGluZyBidWxrIG91dC4gKi8KKwkvKkluaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZSAqLworCXN0cnVjdCBydF90eF9idWZmZXIgKlRyYW5zZmVyQnVmZmVyOwkvKkluaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZSAqLworCXVuc2lnbmVkIGxvbmcgQnVsa091dFNpemU7CisJdTggQnVsa091dFBpcGVJZDsKKwl1OCBTZWxmSWR4OworCUJPT0xFQU4gSW5Vc2U7CisJQk9PTEVBTiBiV2FpdGluZ0J1bGtPdXQ7CS8qIGF0IGxlYXN0IG9uZSBwYWNrZXQgaXMgaW4gdGhpcyBUeENvbnRleHQsIHJlYWR5IGZvciBtYWtpbmcgSVJQIGFueXRpbWUuICovCisJQk9PTEVBTiBiRnVsbEZvckJ1bGtPdXQ7CS8qIGFsbCB0eCBidWZmZXIgYXJlIGZ1bGwgLCBzbyB3YWl0aW5nIGZvciB0eCBidWxrb3V0LiAqLworCUJPT0xFQU4gSVJQUGVuZGluZzsKKwlCT09MRUFOIExhc3RPbmU7CisJQk9PTEVBTiBiQWdncmVnYXRpYmxlOworCXU4IEhlYWRlcl84MDJfM1tMRU5HVEhfODAyXzNdOworCXU4IFJzdlsyXTsKKwl1bnNpZ25lZCBsb25nIERhdGFPZmZzZXQ7CisJdTMyIFR4UmF0ZTsKKwlkbWFfYWRkcl90IGRhdGFfZG1hOwkvKiB1cmIgZG1hIG9uIGxpbnV4ICovCisKK307CisKKy8qIHVzZWQgdG8gdHJhY2sgZHJpdmVyLWdlbmVyYXRlZCB3cml0ZSBpcnBzICovCitzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCB7CisJdm9pZCAqcEFkOwkJLypJbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUgKi8KKwlQVVJCIHBVcmI7CQkvKkluaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZSAqLworCVBJUlAgcElycDsJCS8qdXNlZCB0byBjYW5jZWwgcGVuZGluZyBidWxrIG91dC4gKi8KKwkvKkluaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZSAqLworCXN0cnVjdCBydF9odHR4X2J1ZmZlciAqVHJhbnNmZXJCdWZmZXI7CS8qSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplICovCisJdW5zaWduZWQgbG9uZyBCdWxrT3V0U2l6ZTsJLyogSW5kaWNhdGUgdGhlIHRvdGFsIGJ1bGstb3V0IHNpemUgaW4gYnl0ZXMgaW4gb25lIGJ1bGstdHJhbnNtaXNzaW9uICovCisJdTggQnVsa091dFBpcGVJZDsKKwlCT09MRUFOIElSUFBlbmRpbmc7CisJQk9PTEVBTiBMYXN0T25lOworCUJPT0xFQU4gYkN1cldyaXRpbmc7CisJQk9PTEVBTiBiUmluZ0VtcHR5OworCUJPT0xFQU4gYkNvcHlTYXZlUGFkOworCXU4IFNhdmVkUGFkWzhdOworCXU4IEhlYWRlcl84MDJfM1tMRU5HVEhfODAyXzNdOworCXVuc2lnbmVkIGxvbmcgQ3VyV3JpdGVQb3NpdGlvbjsJLyogSW5kaWNhdGUgdGhlIGJ1ZmZlciBvZmZzZXQgd2hpY2ggcGFja2V0IHdpbGwgYmUgaW5zZXJ0ZWQgc3RhcnQgZnJvbS4gKi8KKwl1bnNpZ25lZCBsb25nIEN1cldyaXRlUmVhbFBvczsJLyogSW5kaWNhdGUgdGhlIGJ1ZmZlciBvZmZzZXQgd2hpY2ggcGFja2V0IG5vdyBhcmUgd3JpdGluZyB0by4gKi8KKwl1bnNpZ25lZCBsb25nIE5leHRCdWxrT3V0UG9zaXRpb247CS8qIEluZGljYXRlIHRoZSBidWZmZXIgc3RhcnQgb2Zmc2V0IG9mIGEgYnVsay10cmFuc21pc3Npb24gKi8KKwl1bnNpZ25lZCBsb25nIEVOZXh0QnVsa091dFBvc2l0aW9uOwkvKiBJbmRpY2F0ZSB0aGUgYnVmZmVyIGVuZCBvZmZzZXQgb2YgYSBidWxrLXRyYW5zbWlzc2lvbiAqLworCXUzMiBUeFJhdGU7CisJZG1hX2FkZHJfdCBkYXRhX2RtYTsJLyogdXJiIGRtYSBvbiBsaW51eCAqLworfTsKKworLyogKi8KKy8qIFN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mIHJlY2VpdmUgcGFja2V0cyBhbmQgYnVmZmVycyB0byBpbmRpY2F0ZSAqLworLyogcmVjZWl2ZSBkYXRhIHRvIHRoZSBwcm90b2NvbC4gKi8KKy8qICovCitzdHJ1Y3QgcnRfcnhfY29udGV4dCB7CisJdTggKlRyYW5zZmVyQnVmZmVyOworCXZvaWQgKnBBZDsKKwlQSVJQIHBJcnA7CQkvKnVzZWQgdG8gY2FuY2VsIHBlbmRpbmcgYnVsayBpbi4gKi8KKwlQVVJCIHBVcmI7CisJLypUaGVzZSAyIEJvb2xlYW4gc2hvdWxkbid0IGJvdGggYmUgMSBhdCB0aGUgc2FtZSB0aW1lLiAqLworCXVuc2lnbmVkIGxvbmcgQnVsa0luT2Zmc2V0OwkvKiBudW1iZXIgb2YgcGFja2V0cyB3YWl0aW5nIGZvciByZW9yZGVyaW5nIC4gKi8KKy8qICAgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBSZW9yZGVySW5Vc2U7ICAgLy8gQXQgbGVhc3Qgb25lIHBhY2tldCBpbiB0aGlzIGJ1ZmZlciBhcmUgaW4gcmVvcmRlcmluZyBidWZmZXIgYW5kIHdhaXQgZm9yIHJlY2VpdmUgaW5kaWNhdGlvbiAqLworCUJPT0xFQU4gYlJ4SGFuZGxpbmc7CS8qIE5vdGlmeSB0aGlzIHBhY2tldCBpcyBiZWluZyBwcm9jZXNzIG5vdy4gKi8KKwlCT09MRUFOIEluVXNlOwkJLyogVVNCIEhhcmR3YXJlIE9jY3VwaWVkLiBXYWl0IGZvciBVU0IgSFcgdG8gcHV0IHBhY2tldC4gKi8KKwlCT09MRUFOIFJlYWRhYmxlOwkvKiBSZWNlaXZlIENvbXBsZXRlIGJhY2suIE9LIGZvciBkcml2ZXIgdG8gaW5kaWNhdGUgcmVjZWl2aW5nIHBhY2tldC4gKi8KKwlCT09MRUFOIElSUFBlbmRpbmc7CS8qIFRPRE86IFRvIGJlIHJlbW92ZWQgKi8KKwlhdG9taWNfdCBJcnBMb2NrOworCXNwaW5sb2NrX3QgUnhDb250ZXh0TG9jazsKKwlkbWFfYWRkcl90IGRhdGFfZG1hOwkvKiB1cmIgZG1hIG9uIGxpbnV4ICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlVU0IgRnJpbXdhcmUgUmVsYXRlZCBNQUNSTworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiA4MDUxIGZpcm13YXJlIGltYWdlIGZvciB1c2IgLSB1c2UgbGFzdC1oYWxmIGJhc2UgYWRkcmVzcyA9IDB4MzAwMCAqLworI2RlZmluZSBGSVJNV0FSRV9JTUFHRV9CQVNFCQkJMHgzMDAwCisjZGVmaW5lIE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFCQkweDEwMDAJLyogNGtieXRlICovCisKKyNkZWZpbmUgUlRNUF9XUklURV9GSVJNV0FSRShfcEFkLCBfcEZ3SW1hZ2UsIF9Gd0xlbikJCVwKKwlSVFVTQkZpcm13YXJlV3JpdGUoX3BBZCwgX3BGd0ltYWdlLCBfRndMZW4pCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCVVTQiBUWCBSZWxhdGVkIE1BQ1JPCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUlRNUF9TVEFSVF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBpcnFGbGFncykJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCVwKKwkJCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTsJCVwKKwkJCQlpZiAocEFkLT5EZVF1ZXVlUnVubmluZ1tRdWVJZHhdKQkJCQkJCVwKKwkJCQl7CQkJCQkJCQkJCQkJCQlcCisJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5EZVF1ZXVlTG9ja1tRdWVJZHhdLCBpcnFGbGFncyk7XAorCQkJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiRGVRdWV1ZVJ1bm5pbmdbJWRdPSBUUlVFIVxuIiwgUXVlSWR4KSk7CQlcCisJCQkJCWNvbnRpbnVlOwkJCQkJCQkJCQkJXAorCQkJCX0JCQkJCQkJCQkJCQkJCVwKKwkJCQllbHNlCQkJCQkJCQkJCQkJCVwKKwkJCQl7CQkJCQkJCQkJCQkJCQlcCisJCQkJCXBBZC0+RGVRdWV1ZVJ1bm5pbmdbUXVlSWR4XSA9IFRSVUU7CQkJCQlcCisJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5EZVF1ZXVlTG9ja1tRdWVJZHhdLCBpcnFGbGFncyk7XAorCQkJCX0JCQkJCQkJCQkJCQkJCVwKKwkJCX13aGlsZSgwKQorCisjZGVmaW5lIFJUTVBfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBpcnFGbGFncykJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQlcCisJCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5EZVF1ZXVlTG9ja1tRdWVJZHhdLCBpcnFGbGFncyk7CQlcCisJCQkJcEFkLT5EZVF1ZXVlUnVubmluZ1tRdWVJZHhdID0gRkFMU0U7CQkJCQlcCisJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTsJXAorCQkJfXdoaWxlKDApCisKKyNkZWZpbmUJUlRNUF9IQVNfRU5PVUdIX0ZSRUVfREVTQyhwQWQsIHBUeEJsaywgZnJlZU51bSwgcFBhY2tldCkgXAorCQkoUlRVU0JGcmVlRGVzY3JpcHRvclJlcXVlc3QocEFkLCBwVHhCbGstPlF1ZUlkeCwgKHBUeEJsay0+VG90YWxGcmFtZUxlbiArIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpKSkgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKworI2RlZmluZSBSVE1QX1JFTEVBU0VfREVTQ19SRVNPVVJDRShwQWQsIFF1ZUlkeCkJCQlcCisJCWRve313aGlsZSgwKQorCisjZGVmaW5lIE5FRURfUVVFVUVfQkFDS19GT1JfQUdHKF9wQWQsIF9RdWVJZHgsIF9mcmVlTnVtLCBfVHhGcmFtZVR5cGUpCQlcCisJCSgoX1R4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRSkgJiYgKFJUVVNCTmVlZFF1ZXVlQmFja0ZvckFnZyhfcEFkLCBfUXVlSWR4KSkpCisKKyNkZWZpbmUgSEFMX1dyaXRlU3ViVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKKwkJCVJ0bXBVU0JfV3JpdGVTdWJUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLGJJc0xhc3QsIHBGcmVlTnVtYmVyKQlcCisJCQlSdG1wVVNCX1dyaXRlU2luZ2xlVHhSZXNvdXJjZShwQWQsIHBUeEJsayxiSXNMYXN0LCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgcEZyZWVOdW1iZXIpIFwKKwkJCVJ0bXBVU0JfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgcEZyZWVOdW1iZXIpCisKKyNkZWZpbmUgSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLGZyYW1lTnVtLCBwRnJlZU51bWJlcikJXAorCQkJUnRtcFVTQl9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsayxmcmFtZU51bSwgcEZyZWVOdW1iZXIpCisKKyNkZWZpbmUgSEFMX0ZpbmFsV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCB0b3RhbE1QRFVTaXplLCBUeElkeCkJXAorCQkJUnRtcFVTQl9GaW5hbFdyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgdG90YWxNUERVU2l6ZSwgVHhJZHgpCisKKyNkZWZpbmUgSEFMX0xhc3RUeElkeChwQWQsIFF1ZUlkeCxUeElkeCkgXAorCQkJCS8qUnRtcFVTQkRhdGFMYXN0VHhJZHgocEFkLCBRdWVJZHgsVHhJZHgpICovCisKKyNkZWZpbmUgSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgUXVlSWR4KQlcCisJCQlSdG1wVVNCRGF0YUtpY2tPdXQocEFkLCBwVHhCbGssIFF1ZUlkeCkKKworI2RlZmluZSBIQUxfS2lja091dE1nbXRUeChwQWQsIFF1ZUlkeCwgcFBhY2tldCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pCVwKKwkJCVJ0bXBVU0JNZ210S2lja091dChwQWQsIFF1ZUlkeCwgcFBhY2tldCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pCisKKyNkZWZpbmUgSEFMX0tpY2tPdXROdWxsRnJhbWVUeChfcEFkLCBfUXVlSWR4LCBfcE51bGxGcmFtZSwgX2ZyYW1lTGVuKQlcCisJCQlSdG1wVVNCTnVsbEZyYW1lS2lja091dChfcEFkLCBfUXVlSWR4LCBfcE51bGxGcmFtZSwgX2ZyYW1lTGVuKQorCisjZGVmaW5lIEdFVF9UWFJJTkdfRlJFRU5PKF9wQWQsIF9RdWVJZHgpCShfUXVlSWR4KQkvKihfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHgpICovCisjZGVmaW5lIEdFVF9NR01UUklOR19GUkVFTk8oX3BBZCkJCQkoX3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIFJYIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAgKglEZXZpY2UgSGFyZHdhcmUgSW50ZXJmYWNlIFJlbGF0ZWQgTUFDUk8KKyAgKi8KKyNkZWZpbmUgUlRNUF9JUlFfSU5JVChwQWQpCQkJCWRve313aGlsZSgwKQorI2RlZmluZSBSVE1QX0lSUV9FTkFCTEUocEFkKQkJCWRve313aGlsZSgwKQorCisvKgorICAqCU1MTUUgUmVsYXRlZCBNQUNSTworICAqLworI2RlZmluZSBSVE1QX01MTUVfSEFORExFUihwQWQpCQkJUlRVU0JNbG1lVXAocEFkKQorCisjZGVmaW5lIFJUTVBfTUxNRV9QUkVfU0FOSVRZX0NIRUNLKHBBZCkJCQkJCQkJCVwKKwl7CWlmICgocEFkLT5Db21tb25DZmcuYkhhcmR3YXJlUmFkaW8gPT0gVFJVRSkgJiYJCQkJCVwKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgkJXAorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpKSB7CVwKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX0NIRUNLX0dQSU8sIE5VTEwsIDApOyB9IH0KKworI2RlZmluZSBSVE1QX01MTUVfU1RBX1FVSUNLX1JTUF9XQUtFX1VQKHBBZCkJXAorCXsJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUUtFUklPRElDX0VYRUNVVCwgTlVMTCwgMCk7CVwKKwkJUlRVU0JNbG1lVXAocEFkKTsgfQorCisjZGVmaW5lIFJUTVBfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZCkJXAorCQkgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRVNFVF9DT05GLCAwLCBOVUxMKTsJXAorCQkgICAgICAgIFJUVVNCTWxtZVVwKHBBZCk7CisKKyNkZWZpbmUgUlRNUF9IQU5ETEVfQ09VTlRFUl9NRUFTVVJFKF9wQWQsIF9wRW50cnkpCQlcCisJewlSVFVTQkVucXVldWVJbnRlcm5hbENtZChfcEFkLCBDTURUSFJFQURfODAyXzExX0NPVU5URVJfTUVBU1VSRSwgX3BFbnRyeSwgc2l6ZW9mKHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkpKTsJXAorCQlSVFVTQk1sbWVVcChfcEFkKTsJCQkJCQkJCQlcCisJfQorCisvKgorICAqCVBvd2VyIFNhdmUgUmVsYXRlZCBNQUNSTworICAqLworI2RlZmluZSBSVE1QX1BTX1BPTExfRU5RVUVVRShwQWQpCQkJCQkJXAorCXsJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9QU1BPTEwpOwlcCisJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsgfQorCisjZGVmaW5lIFJUTVBfU1RBX0ZPUkNFX1dBS0VVUChfcEFkLCBiRnJvbVR4KSBcCisJUlQyOHh4VXNiU3RhQXNpY0ZvcmNlV2FrZXVwKF9wQWQsIGJGcm9tVHgpOworCisjZGVmaW5lIFJUTVBfU1RBX1NMRUVQX1RIRU5fQVVUT19XQUtFVVAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKSBcCisgICAgUlQyOHh4VXNiU3RhQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKworI2RlZmluZSBSVE1QX1NFVF9QU01fQklUKF9wQWQsIF92YWwpIFwKKwl7XAorCQlpZiAoKF9wQWQpLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1ApIFwKKwkJCU1sbWVTZXRQc21CaXQoX3BBZCwgX3ZhbCk7XAorCQllbHNlIFwKKwkJeyBcCisJCQl1MTYgX3BzbV92YWw7IFwKKwkJCV9wc21fdmFsID0gX3ZhbDsgXAorCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQoX3BBZCwgQ01EVEhSRUFEX1NFVF9QU01fQklULCAmKF9wc21fdmFsKSwgc2l6ZW9mKHUxNikpOyBcCisJCX1cCisJfQorCisjZGVmaW5lIFJUTVBfTUxNRV9SQURJT19PTihwQWQpIFwKKyAgICBSVDI4eHhVc2JNbG1lUmFkaW9PbihwQWQpOworCisjZGVmaW5lIFJUTVBfTUxNRV9SQURJT19PRkYocEFkKSBcCisgICAgUlQyOHh4VXNiTWxtZVJhZGlvT0ZGKHBBZCk7CisKKyNlbmRpZiAvKl9fTUFDX1VTQl9IX18gLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydDI4NjAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydDI4NjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzBiODA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0Mjg2MC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX19SVDI4NjBfSF9fCisjZGVmaW5lIF9fUlQyODYwX0hfXworCisjaW5jbHVkZSAibWFjX3BjaS5oIgorCisjaWZuZGVmIFJUTVBfUENJX1NVUFBPUlQKKyNlcnJvciAiRm9yIFJUMjg2MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfUENJX1NVUFBPUlQiCisjZW5kaWYKKworI2lmbmRlZiBSVE1QX01BQ19QQ0kKKyNlcnJvciAiRm9yIFJUMjg4MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfTUFDX1BDSSIKKyNlbmRpZgorCisvKiAqLworLyogRGV2aWNlIElEICYgVmVuZG9yIElELCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoIEVFUFJPTSB2YWx1ZSAqLworLyogKi8KKyNkZWZpbmUgTklDMjg2MF9QQ0lfREVWSUNFX0lECTB4MDYwMQorI2RlZmluZSBOSUMyODYwX1BDSWVfREVWSUNFX0lECTB4MDY4MQorI2RlZmluZSBOSUMyNzYwX1BDSV9ERVZJQ0VfSUQJMHgwNzAxCS8qIDFULzJSIENhcmRidXMgPz8/ICovCisjZGVmaW5lIE5JQzI3OTBfUENJZV9ERVZJQ0VfSUQgIDB4MDc4MQkvKiAxVC8yUiBtaW5pQ2FyZCAqLworCisjZGVmaW5lIFZFTl9BV1RfUENJZV9ERVZJQ0VfSUQJMHgxMDU5CisjZGVmaW5lIFZFTl9BV1RfUENJX1ZFTkRPUl9JRAkJMHgxQTNCCisKKyNkZWZpbmUgRURJTUFYX1BDSV9WRU5ET1JfSUQJCTB4MTQzMgorCisjZW5kaWYgLypfX1JUMjg2MF9IX18gLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydDI4NzAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydDI4NzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjYzZjFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0Mjg3MC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisjaWZuZGVmIF9fUlQyODcwX0hfXworI2RlZmluZSBfX1JUMjg3MF9IX18KKworI2lmZGVmIFJUMjg3MAorCisjaWZuZGVmIFJUTVBfVVNCX1NVUFBPUlQKKyNlcnJvciAiRm9yIFJUMjg3MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfVVNCX1NVUFBPUlQiCisjZW5kaWYKKworI2lmbmRlZiBSVE1QX01BQ19VU0IKKyNlcnJvciAiRm9yIFJUMjg3MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfTUFDX1VTQiIKKyNlbmRpZgorCisjaW5jbHVkZSAiLi4vcnRtcF90eXBlLmgiCisjaW5jbHVkZSAibWFjX3VzYi5oIgorCisvKiNkZWZpbmUgUlRNUF9DSElQX05BTUUgICAgICAgICAgICAgICAgIlJUMjg3MCIgKi8KKworI2VuZGlmIC8qIFJUMjg3MCAvLyAqLworI2VuZGlmIC8qX19SVDI4NzBfSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnQzMDcwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnQzMDcwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcyY2U3MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydDMwNzAuaApAQCAtMCwwICsxLDY3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorCXJ0MzA3MC5oCisKKyAgICBBYnN0cmFjdDoKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIF9fUlQzMDcwX0hfXworI2RlZmluZSBfX1JUMzA3MF9IX18KKworI2lmZGVmIFJUMzA3MAorCisjaWZuZGVmIFJUTVBfVVNCX1NVUFBPUlQKKyNlcnJvciAiRm9yIFJUMzA3MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfVVNCX1NVUFBPUlQiCisjZW5kaWYKKworI2lmbmRlZiBSVE1QX01BQ19VU0IKKyNlcnJvciAiRm9yIFJUMzA3MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfTUFDX1VTQiIKKyNlbmRpZgorCisjaWZuZGVmIFJUTVBfUkZfUldfU1VQUE9SVAorI2Vycm9yICJGb3IgUlQzMDcwLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGUgY29tcGlsZSBmbGFnIC1EUlRNUF9SRl9SV19TVVBQT1JUIgorI2VuZGlmCisKKyNpZm5kZWYgUlQzMHh4CisjZXJyb3IgIkZvciBSVDMwNzAsIHlvdSBzaG91bGQgZGVmaW5lIHRoZSBjb21waWxlIGZsYWcgLURSVDMweHgiCisjZW5kaWYKKworI2luY2x1ZGUgIm1hY191c2IuaCIKKyNpbmNsdWRlICJydDMweHguaCIKKworLyogKi8KKy8qIERldmljZSBJRCAmIFZlbmRvciBJRCwgdGhlc2UgdmFsdWVzIHNob3VsZCBtYXRjaCBFRVBST00gdmFsdWUgKi8KKy8qICovCisKKyNlbmRpZiAvKiBSVDMwNzAgLy8gKi8KKworI2VuZGlmIC8qX19SVDMwNzBfSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnQzMDkwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnQzMDkwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAyYjkzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydDMwOTAuaApAQCAtMCwwICsxLDcyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorCXJ0MzA5MC5oCisKKyAgICBBYnN0cmFjdDoKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIF9fUlQzMDkwX0hfXworI2RlZmluZSBfX1JUMzA5MF9IX18KKworI2lmZGVmIFJUMzA5MAorCisjaWZuZGVmIFJUTVBfUENJX1NVUFBPUlQKKyNlcnJvciAiRm9yIFJUMzA5MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfUENJX1NVUFBPUlQiCisjZW5kaWYKKworI2lmbmRlZiBSVE1QX01BQ19QQ0kKKyNlcnJvciAiRm9yIFJUMzA5MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfTUFDX1BDSSIKKyNlbmRpZgorCisjaWZuZGVmIFJUTVBfUkZfUldfU1VQUE9SVAorI2Vycm9yICJGb3IgUlQzMDkwLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGUgY29tcGlsZSBmbGFnIC1EUlRNUF9SRl9SV19TVVBQT1JUIgorI2VuZGlmCisKKyNpZm5kZWYgUlQzMHh4CisjZXJyb3IgIkZvciBSVDMwOTAsIHlvdSBzaG91bGQgZGVmaW5lIHRoZSBjb21waWxlIGZsYWcgLURSVDMweHgiCisjZW5kaWYKKworI2RlZmluZSBQQ0lFX1BTX1NVUFBPUlQKKworI2luY2x1ZGUgIm1hY19wY2kuaCIKKyNpbmNsdWRlICJydDMweHguaCIKKworLyogKi8KKy8qIERldmljZSBJRCAmIFZlbmRvciBJRCwgdGhlc2UgdmFsdWVzIHNob3VsZCBtYXRjaCBFRVBST00gdmFsdWUgKi8KKy8qICovCisjZGVmaW5lIE5JQzMwOTBfUENJZV9ERVZJQ0VfSUQgIDB4MzA5MAkvKiAxVC8xUiBtaW5pQ2FyZCAqLworI2RlZmluZSBOSUMzMDkxX1BDSWVfREVWSUNFX0lEICAweDMwOTEJLyogMVQvMlIgbWluaUNhcmQgKi8KKyNkZWZpbmUgTklDMzA5Ml9QQ0llX0RFVklDRV9JRCAgMHgzMDkyCS8qIDJULzJSIG1pbmlDYXJkICovCisKKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KKworI2VuZGlmIC8qX19SVDMwOTBfSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnQzMHh4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnQzMHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlMWQ3MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydDMweHguaApAQCAtMCwwICsxLDQ3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorCXJ0MzB4eC5oCisKKyAgICBBYnN0cmFjdDoKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIF9fUlQzMFhYX0hfXworI2RlZmluZSBfX1JUMzBYWF9IX18KKworI2lmZGVmIFJUMzB4eAorCitleHRlcm4gc3RydWN0IHJ0X3JlZ19wYWlyIFJUMzB4eF9SRlJlZ1RhYmxlW107CitleHRlcm4gdTggTlVNX1JGX1JFR19QQVJNUzsKKworI2VuZGlmIC8qIFJUMzB4eCAvLyAqLworCisjZW5kaWYgLypfX1JUMzBYWF9IX18gLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydG1wX21hYy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfbWFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhNzI1OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydG1wX21hYy5oCkBAIC0wLDAgKzEsMTMwNyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX21hYy5oCisKKwlBYnN0cmFjdDoKKwlSYWxpbmsgV2lyZWxlc3MgQ2hpcCBNQUMgcmVsYXRlZCBkZWZpbml0aW9uICYgc3RydWN0dXJlcworCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkgIFdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX1JUTVBfTUFDX0hfXworI2RlZmluZSBfX1JUTVBfTUFDX0hfXworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIFRYIC8gUlggcmluZyBkZXNjcmlwdG9yIGZvcm1hdCAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIHRoZSBmaXJzdCAyNC1ieXRlIGluIFRYRCBpcyBjYWxsZWQgVFhJTkZPIGFuZCB3aWxsIGJlIERNQWVkIHRvIE1BQyBibG9jayB0aHJvdWdoIFRYRklGTy4gKi8KKy8qIE1BQyBibG9jayB1c2UgdGhpcyBUWElORk8gdG8gY29udHJvbCB0aGUgdHJhbnNtaXNzaW9uIGJlaGF2aW9yIG9mIHRoaXMgZnJhbWUuICovCisjZGVmaW5lIEZJRk9fTUdNVCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBGSUZPX0hDQ0EgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRklGT19FRENBICAgICAgICAgICAgICAgICAyCisKKy8qICovCisvKiBUWEQgV2lyZWxlc3MgSW5mb3JtYXRpb24gZm9ybWF0IGZvciBUeCByaW5nIGFuZCBNZ210IFJpbmcgKi8KKy8qICovCisvKnR4b3AgOiBmb3IgdHhvcCBtb2RlICovCisvKiAwOnR4b3AgZm9yIHRoZSBNUERVIGZyYW1lIHdpbGwgYmUgaGFuZGxlcyBieSBBU0lDIGJ5IHJlZ2lzdGVyICovCisvKiAxLzIvMzp0aGUgTVBEVSBmcmFtZSBpcyBzZW5kIGFmdGVyIFBJRlMvYmFja29mZi9TSUZTICovCitzdHJ1Y3QgUEFDS0VEIHJ0X3R4d2kgeworCS8qIFdvcmQgMCAqLworCS8qIGV4OiAwMCAwMyAwMCA0MCBtZWFucyB0eG9wID0gMywgUEhZTU9ERSA9IDEgKi8KKwl1MzIgRlJBRzoxOwkJLyogMSB0byBpbmZvcm0gVEtJUCBlbmdpbmUgdGhpcyBpcyBhIGZyYWdtZW50LiAqLworCXUzMiBNSU1PcHM6MTsJLyogdGhlIHJlbW90ZSBwZWVyIGlzIGluIGR5bmFtaWMgTUlNTy1QUyBtb2RlICovCisJdTMyIENGQUNLOjE7CisJdTMyIFRTOjE7CisKKwl1MzIgQU1QRFU6MTsKKwl1MzIgTXBkdURlbnNpdHk6MzsKKwl1MzIgdHhvcDoyOwkJLypGT1IgIlRISVMiIGZyYW1lLiAwOkhUIFRYT1AgcnVsZSAsIDE6UElGUyBUWCAsMjpCYWNrb2ZmLCAzOnNpZnMgb25seSB3aGVuIHByZXZpb3VzIGZyYW1lIGV4Y2hhbmdlIGlzIHN1Y2Nlc3NmdWwuICovCisJdTMyIHJzdjo2OworCisJdTMyIE1DUzo3OworCXUzMiBCVzoxOwkJLypjaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHogKi8KKwl1MzIgU2hvcnRHSToxOworCXUzMiBTVEJDOjI7CQkvKiAxOiBTVEJDIHN1cHBvcnQgTUNTID0wLTcsICAgMiwzIDogUkVTRVJWRSAqLworCXUzMiBJZnM6MTsJCS8qICovCisvKiAgICAgIHUzMiAgICAgICAgICByc3YyOjI7IC8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6ICovCisJdTMyIHJzdjI6MTsKKwl1MzIgVHhCRjoxOwkJLyogMyozICovCisJdTMyIFBIWU1PREU6MjsKKwkvKiBXb3JkMSAqLworCS8qIGV4OiAgMWMgZmYgMzggMDAgbWVhbnMgQUNLPTAsIEJBV2luU2l6ZT03LCBNUERVdG90YWxCeXRlQ291bnQgPSAweDM4ICovCisJdTMyIEFDSzoxOworCXUzMiBOU0VROjE7CisJdTMyIEJBV2luU2l6ZTo2OworCXUzMiBXaXJlbGVzc0NsaUlEOjg7CisJdTMyIE1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKKwl1MzIgUGFja2V0SWQ6NDsKKwkvKldvcmQyICovCisJdTMyIElWOworCS8qV29yZDMgKi8KKwl1MzIgRUlWOworfTsKKworLyogKi8KKy8qIFJYV0kgd2lyZWxlc3MgaW5mb3JtYXRpb24gZm9ybWF0LCBpbiBQQkYuIGludmlzaWJsZSBpbiBkcml2ZXIuICovCisvKiAqLworc3RydWN0IFBBQ0tFRCBydF9yeHdpIHsKKwkvKiBXb3JkIDAgKi8KKwl1MzIgV2lyZWxlc3NDbGlJRDo4OworCXUzMiBLZXlJbmRleDoyOworCXUzMiBCU1NJRDozOworCXUzMiBVREY6MzsKKwl1MzIgTVBEVXRvdGFsQnl0ZUNvdW50OjEyOworCXUzMiBUSUQ6NDsKKwkvKiBXb3JkIDEgKi8KKwl1MzIgRlJBRzo0OworCXUzMiBTRVFVRU5DRToxMjsKKwl1MzIgTUNTOjc7CisJdTMyIEJXOjE7CisJdTMyIFNob3J0R0k6MTsKKwl1MzIgU1RCQzoyOworCXUzMiByc3Y6MzsKKwl1MzIgUEhZTU9ERToyOwkvKiAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUgKi8KKwkvKldvcmQyICovCisJdTMyIFJTU0kwOjg7CisJdTMyIFJTU0kxOjg7CisJdTMyIFJTU0kyOjg7CisJdTMyIHJzdjE6ODsKKwkvKldvcmQzICovCisJdTMyIFNOUjA6ODsKKwl1MzIgU05SMTo4OworCXUzMiBGT0ZGU0VUOjg7CS8qIFJUMzV4eCAqLworCXUzMiByc3YyOjg7CisJLyp1MzIgICAgICAgICAgICAgICAgcnN2MjoxNjsgKi8KK307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogUmVnaXN0ZXIgZm9ybWF0ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogKi8KKy8qIFNDSC9ETUEgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MDIwMCAqLworLyogKi8KKy8qIElOVF9TT1VSQ0VfQ1NSOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyLiBXcml0ZSBvbmUgdG8gY2xlYXIgY29ycmVzcG9uZGluZyBiaXQgKi8KKy8qICovCisjZGVmaW5lIERNQV9DU1IwCQkweDIwMAorI2RlZmluZSBJTlRfU09VUkNFX0NTUgkJMHgyMDAKK3R5cGVkZWYgdW5pb24gX0lOVF9TT1VSQ0VfQ1NSX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgUnhEZWxheUlOVDoxOworCQl1MzIgVHhEZWxheUlOVDoxOworCQl1MzIgUnhEb25lOjE7CisJCXUzMiBBYzBEbWFEb25lOjE7CS8qNCAqLworCQl1MzIgQWMxRG1hRG9uZToxOworCQl1MzIgQWMyRG1hRG9uZToxOworCQl1MzIgQWMzRG1hRG9uZToxOworCQl1MzIgSGNjYURtYURvbmU6MTsJLyogYml0NyAqLworCQl1MzIgTWdtdERtYURvbmU6MTsKKwkJdTMyIE1DVUNvbW1hbmRJTlQ6MTsJLypiaXQgOSAqLworCQl1MzIgUnhUeENvaGVyZW50OjE7CisJCXUzMiBUQlRUSW50OjE7CisJCXUzMiBQcmVUQlRUOjE7CisJCXUzMiBUWEZpZm9TdGF0dXNJbnQ6MTsJLypGSUZPIFN0YXRpc3RpY3MgaXMgZnVsbCwgc3cgc2hvdWxkIHJlYWQgMHgxNzFjICovCisJCXUzMiBBdXRvV2FrZXVwOjE7CS8qYml0MTQgKi8KKwkJdTMyIEdQVGltZXI6MTsKKwkJdTMyIFJ4Q29oZXJlbnQ6MTsJLypiaXQxNiAqLworCQl1MzIgVHhDb2hlcmVudDoxOworCQl1MzIgOiAxNDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBJTlRfU09VUkNFX0NTUl9TVFJVQywgKlBJTlRfU09VUkNFX0NTUl9TVFJVQzsKKworLyogKi8KKy8qIElOVF9NQVNLX0NTUjogICBJbnRlcnJ1cHQgTUFTSyByZWdpc3Rlci4gICAxOiB0aGUgaW50ZXJydXB0IGlzIG1hc2sgT0ZGICovCisvKiAqLworI2RlZmluZSBJTlRfTUFTS19DU1IgICAgICAgIDB4MjA0Cit0eXBlZGVmIHVuaW9uIF9JTlRfTUFTS19DU1JfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBSWERlbGF5X0lOVF9NU0s6MTsKKwkJdTMyIFR4RGVsYXk6MTsKKwkJdTMyIFJ4RG9uZToxOworCQl1MzIgQWMwRG1hRG9uZToxOworCQl1MzIgQWMxRG1hRG9uZToxOworCQl1MzIgQWMyRG1hRG9uZToxOworCQl1MzIgQWMzRG1hRG9uZToxOworCQl1MzIgSGNjYURtYURvbmU6MTsKKwkJdTMyIE1nbXREbWFEb25lOjE7CisJCXUzMiBNQ1VDb21tYW5kSU5UOjE7CisJCXUzMiA6IDIwOworCQl1MzIgUnhDb2hlcmVudDoxOworCQl1MzIgVHhDb2hlcmVudDoxOworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IElOVF9NQVNLX0NTUl9TVFJVQywgKlBJTlRfTUFTS19DU1JfU1RSVUM7CisKKyNkZWZpbmUgV1BETUFfR0xPX0NGRwkweDIwOAordHlwZWRlZiB1bmlvbiBfV1BETUFfR0xPX0NGR19TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIEVuYWJsZVR4RE1BOjE7CisJCXUzMiBUeERNQUJ1c3k6MTsKKwkJdTMyIEVuYWJsZVJ4RE1BOjE7CisJCXUzMiBSeERNQUJ1c3k6MTsKKwkJdTMyIFdQRE1BQnVyc3RTSVpFOjI7CisJCXUzMiBFblRYV3JpdGVCYWNrRERPTkU6MTsKKwkJdTMyIEJpZ0VuZGlhbjoxOworCQl1MzIgUlhIZHJTY2F0ZXI6ODsKKwkJdTMyIEhEUl9TRUdfTEVOOjE2OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFdQRE1BX0dMT19DRkdfU1RSVUMsICpQV1BETUFfR0xPX0NGR19TVFJVQzsKKworI2RlZmluZSBXUERNQV9SU1RfSURYCTB4MjBjCit0eXBlZGVmIHVuaW9uIF9XUERNQV9SU1RfSURYX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgUlNUX0RUWF9JRFgwOjE7CisJCXUzMiBSU1RfRFRYX0lEWDE6MTsKKwkJdTMyIFJTVF9EVFhfSURYMjoxOworCQl1MzIgUlNUX0RUWF9JRFgzOjE7CisJCXUzMiBSU1RfRFRYX0lEWDQ6MTsKKwkJdTMyIFJTVF9EVFhfSURYNToxOworCQl1MzIgcnN2OjEwOworCQl1MzIgUlNUX0RSWF9JRFgwOjE7CisJCXUzMiA6IDE1OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFdQRE1BX1JTVF9JRFhfU1RSVUMsICpQV1BETUFfUlNUX0lEWF9TVFJVQzsKKyNkZWZpbmUgREVMQVlfSU5UX0NGRyAgMHgwMjEwCit0eXBlZGVmIHVuaW9uIF9ERUxBWV9JTlRfQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgUlhNQVhfUFRJTUU6ODsKKwkJdTMyIFJYTUFYX1BJTlQ6NzsKKwkJdTMyIFJYRExZX0lOVF9FTjoxOworCQl1MzIgVFhNQVhfUFRJTUU6ODsKKwkJdTMyIFRYTUFYX1BJTlQ6NzsKKwkJdTMyIFRYRExZX0lOVF9FTjoxOworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IERFTEFZX0lOVF9DRkdfU1RSVUMsICpQREVMQVlfSU5UX0NGR19TVFJVQzsKKyNkZWZpbmUgV01NX0FJRlNOX0NGRyAgIDB4MDIxNAordHlwZWRlZiB1bmlvbiBfQUlGU05fQ1NSX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgQWlmc24wOjQ7CS8qIGZvciBBQ19CRSAqLworCQl1MzIgQWlmc24xOjQ7CS8qIGZvciBBQ19CSyAqLworCQl1MzIgQWlmc24yOjQ7CS8qIGZvciBBQ19WSSAqLworCQl1MzIgQWlmc24zOjQ7CS8qIGZvciBBQ19WTyAqLworCQl1MzIgUnN2OjE2OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IEFJRlNOX0NTUl9TVFJVQywgKlBBSUZTTl9DU1JfU1RSVUM7CisvKiAqLworLyogQ1dNSU5fQ1NSOiBDV21pbiBmb3IgZWFjaCBFRENBIEFDICovCisvKiAqLworI2RlZmluZSBXTU1fQ1dNSU5fQ0ZHICAgMHgwMjE4Cit0eXBlZGVmIHVuaW9uIF9DV01JTl9DU1JfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBDd21pbjA6NDsJLyogZm9yIEFDX0JFICovCisJCXUzMiBDd21pbjE6NDsJLyogZm9yIEFDX0JLICovCisJCXUzMiBDd21pbjI6NDsJLyogZm9yIEFDX1ZJICovCisJCXUzMiBDd21pbjM6NDsJLyogZm9yIEFDX1ZPICovCisJCXUzMiBSc3Y6MTY7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gQ1dNSU5fQ1NSX1NUUlVDLCAqUENXTUlOX0NTUl9TVFJVQzsKKworLyogKi8KKy8qIENXTUFYX0NTUjogQ1dtaW4gZm9yIGVhY2ggRURDQSBBQyAqLworLyogKi8KKyNkZWZpbmUgV01NX0NXTUFYX0NGRyAgIDB4MDIxYwordHlwZWRlZiB1bmlvbiBfQ1dNQVhfQ1NSX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgQ3dtYXgwOjQ7CS8qIGZvciBBQ19CRSAqLworCQl1MzIgQ3dtYXgxOjQ7CS8qIGZvciBBQ19CSyAqLworCQl1MzIgQ3dtYXgyOjQ7CS8qIGZvciBBQ19WSSAqLworCQl1MzIgQ3dtYXgzOjQ7CS8qIGZvciBBQ19WTyAqLworCQl1MzIgUnN2OjE2OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IENXTUFYX0NTUl9TVFJVQywgKlBDV01BWF9DU1JfU1RSVUM7CisKKy8qICovCisvKiBBQ19UWE9QX0NTUjA6IEFDX0JLL0FDX0JFIFRYT1AgcmVnaXN0ZXIgKi8KKy8qICovCisjZGVmaW5lIFdNTV9UWE9QMF9DRkcgICAgMHgwMjIwCit0eXBlZGVmIHVuaW9uIF9BQ19UWE9QX0NTUjBfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBBYzBUeG9wOwkvKiBmb3IgQUNfQkssIGluIHVuaXQgb2YgMzJ1cyAqLworCQl1MTYgQWMxVHhvcDsJLyogZm9yIEFDX0JFLCBpbiB1bml0IG9mIDMydXMgKi8KKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBBQ19UWE9QX0NTUjBfU1RSVUMsICpQQUNfVFhPUF9DU1IwX1NUUlVDOworCisvKiAqLworLyogQUNfVFhPUF9DU1IxOiBBQ19WTy9BQ19WSSBUWE9QIHJlZ2lzdGVyICovCisvKiAqLworI2RlZmluZSBXTU1fVFhPUDFfQ0ZHICAgIDB4MDIyNAordHlwZWRlZiB1bmlvbiBfQUNfVFhPUF9DU1IxX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgQWMyVHhvcDsJLyogZm9yIEFDX1ZJLCBpbiB1bml0IG9mIDMydXMgKi8KKwkJdTE2IEFjM1R4b3A7CS8qIGZvciBBQ19WTywgaW4gdW5pdCBvZiAzMnVzICovCisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gQUNfVFhPUF9DU1IxX1NUUlVDLCAqUEFDX1RYT1BfQ1NSMV9TVFJVQzsKKworI2RlZmluZSBSSU5HUkVHX0RJRkYJCQkweDEwCisjZGVmaW5lIEdQSU9fQ1RSTF9DRkcgICAgMHgwMjI4CS8qTUFDX0NTUjEzICovCisjZGVmaW5lIE1DVV9DTURfQ0ZHICAgIDB4MDIyYworI2RlZmluZSBUWF9CQVNFX1BUUjAgICAgIDB4MDIzMAkvKkFDX0JLIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBUWF9NQVhfQ05UMCAgICAgIDB4MDIzNAorI2RlZmluZSBUWF9DVFhfSURYMCAgICAgICAweDAyMzgKKyNkZWZpbmUgVFhfRFRYX0lEWDAgICAgICAweDAyM2MKKyNkZWZpbmUgVFhfQkFTRV9QVFIxICAgICAweDAyNDAJLypBQ19CRSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgVFhfTUFYX0NOVDEgICAgICAweDAyNDQKKyNkZWZpbmUgVFhfQ1RYX0lEWDEgICAgICAgMHgwMjQ4CisjZGVmaW5lIFRYX0RUWF9JRFgxICAgICAgMHgwMjRjCisjZGVmaW5lIFRYX0JBU0VfUFRSMiAgICAgMHgwMjUwCS8qQUNfVkkgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFRYX01BWF9DTlQyICAgICAgMHgwMjU0CisjZGVmaW5lIFRYX0NUWF9JRFgyICAgICAgIDB4MDI1OAorI2RlZmluZSBUWF9EVFhfSURYMiAgICAgIDB4MDI1YworI2RlZmluZSBUWF9CQVNFX1BUUjMgICAgIDB4MDI2MAkvKkFDX1ZPIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBUWF9NQVhfQ05UMyAgICAgIDB4MDI2NAorI2RlZmluZSBUWF9DVFhfSURYMyAgICAgICAweDAyNjgKKyNkZWZpbmUgVFhfRFRYX0lEWDMgICAgICAweDAyNmMKKyNkZWZpbmUgVFhfQkFTRV9QVFI0ICAgICAweDAyNzAJLypIQ0NBIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBUWF9NQVhfQ05UNCAgICAgIDB4MDI3NAorI2RlZmluZSBUWF9DVFhfSURYNCAgICAgICAweDAyNzgKKyNkZWZpbmUgVFhfRFRYX0lEWDQgICAgICAweDAyN2MKKyNkZWZpbmUgVFhfQkFTRV9QVFI1ICAgICAweDAyODAJLypNR01UIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSAgVFhfTUFYX0NOVDUgICAgIDB4MDI4NAorI2RlZmluZSBUWF9DVFhfSURYNSAgICAgICAweDAyODgKKyNkZWZpbmUgVFhfRFRYX0lEWDUgICAgICAweDAyOGMKKyNkZWZpbmUgVFhfTUdNVE1BWF9DTlQgICAgICBUWF9NQVhfQ05UNQorI2RlZmluZSBUWF9NR01UQ1RYX0lEWCAgICAgICBUWF9DVFhfSURYNQorI2RlZmluZSBUWF9NR01URFRYX0lEWCAgICAgIFRYX0RUWF9JRFg1CisjZGVmaW5lIFJYX0JBU0VfUFRSICAgICAweDAyOTAJLypSWCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUlhfTUFYX0NOVCAgICAgIDB4MDI5NAorI2RlZmluZSBSWF9DUlhfSURYICAgICAgIDB4MDI5OAorI2RlZmluZSBSWF9EUlhfSURYICAgICAgMHgwMjljCisKKyNkZWZpbmUgVVNCX0RNQV9DRkcgICAgICAweDAyYTAKK3R5cGVkZWYgdW5pb24gX1VTQl9ETUFfQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgUnhCdWxrQWdnVE91dDo4OwkvKlJ4IEJ1bGsgQWdncmVnYXRpb24gVGltZU91dCAgaW4gdW5pdCBvZiAzM25zICovCisJCXUzMiBSeEJ1bGtBZ2dMbXQ6ODsJLypSeCBCdWxrIEFnZ3JlZ2F0aW9uIExpbWl0ICBpbiB1bml0IG9mIDI1NiBieXRlcyAqLworCQl1MzIgcGh5Y2xlYXI6MTsJLypwaHkgd2F0Y2ggZG9nIGVuYWJsZS4gd3JpdGUgMSAqLworCQl1MzIgcnN2OjI7CisJCXUzMiBUeENsZWFyOjE7CS8qQ2xlYXIgVVNCIERNQSBUWCBwYXRoICovCisJCXUzMiBUeG9wSGFsdDoxOwkvKkhhbHQgVFhPUCBjb3VudCBkb3duIHdoZW4gVFggYnVmZmVyIGlzIGZ1bGwuICovCisJCXUzMiBSeEJ1bGtBZ2dFbjoxOwkvKkVuYWJsZSBSeCBCdWxrIEFnZ3JlZ2F0aW9uICovCisJCXUzMiBSeEJ1bGtFbjoxOwkvKkVuYWJsZSBVU0IgRE1BIFJ4ICovCisJCXUzMiBUeEJ1bGtFbjoxOwkvKkVuYWJsZSBVU0IgRE1BIFR4ICovCisJCXUzMiBFcG91dFZhbGlkOjY7CS8qT1VUIGVuZHBvaW50IGRhdGEgdmFsaWQgKi8KKwkJdTMyIFJ4QnVzeToxOwkvKlVTQiBETUEgUlggRlNNIGJ1c3kgKi8KKwkJdTMyIFR4QnVzeToxOwkvKlVTQiBETUEgVFggRlNNIGJ1c3kgKi8KKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBVU0JfRE1BX0NGR19TVFJVQywgKlBVU0JfRE1BX0NGR19TVFJVQzsKKworLyogKi8KKy8qICAzICBQQkYgIHJlZ2lzdGVycyAqLworLyogKi8KKy8qICovCisvKiBNb3N0IGFyZSBmb3IgZGVidWcuIERyaXZlciBkb2Vzbid0IHRvdWNoIFBCRiByZWdpc3Rlci4gKi8KKyNkZWZpbmUgUEJGX1NZU19DVFJMCSAweDA0MDAKKyNkZWZpbmUgUEJGX0NGRyAgICAgICAgICAgICAgICAgMHgwNDA4CisjZGVmaW5lIFBCRl9NQVhfUENOVAkgMHgwNDBDCisjZGVmaW5lIFBCRl9DVFJMCQkweDA0MTAKKyNkZWZpbmUgUEJGX0lOVF9TVEEJIDB4MDQxNAorI2RlZmluZSBQQkZfSU5UX0VOQQkgMHgwNDE4CisjZGVmaW5lIFRYUlhRX1BDTlQJIDB4MDQzOAorI2RlZmluZSBQQkZfREJHCQkJIDB4MDQzYworI2RlZmluZSBQQkZfQ0FQX0NUUkwgICAgIDB4MDQ0MAorCisjaWZkZWYgUlQzMHh4CisjaWZkZWYgUlRNUF9FRlVTRV9TVVBQT1JUCisvKiBlRnVzZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRUZVU0VfQ1RSTAkJCQkweDA1ODAKKyNkZWZpbmUgRUZVU0VfREFUQTAJCQkJMHgwNTkwCisjZGVmaW5lIEVGVVNFX0RBVEExCQkJCTB4MDU5NAorI2RlZmluZSBFRlVTRV9EQVRBMgkJCQkweDA1OTgKKyNkZWZpbmUgRUZVU0VfREFUQTMJCQkJMHgwNTljCisjZW5kaWYgLyogUlRNUF9FRlVTRV9TVVBQT1JUIC8vICovCisjZW5kaWYgLyogUlQzMHh4IC8vICovCisKKyNkZWZpbmUgT1NDX0NUUkwJCTB4NWE0CisjZGVmaW5lIFBDSUVfUEhZX1RYX0FUVEVOVUFUSU9OX0NUUkwJMHgwNUM4CisjZGVmaW5lIExET19DRkcwCQkJCTB4MDVkNAorI2RlZmluZSBHUElPX1NXSVRDSAkJCQkweDA1ZGMKKworLyogKi8KKy8qICA0ICBNQUMgIHJlZ2lzdGVycyAqLworLyogKi8KKy8qICovCisvKiAgNC4xIE1BQyBTWVNURU0gIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMDAwKSAqLworLyogKi8KKyNkZWZpbmUgTUFDX0NTUjAgICAgICAgICAgICAweDEwMDAKK3R5cGVkZWYgdW5pb24gX0FTSUNfVkVSX0lEX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgQVNJQ1JldjsJLyogcmV2ZXJzaW9uICA6IDAgKi8KKwkJdTE2IEFTSUNWZXI7CS8qIHZlcnNpb24gOiAyODYwICovCisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gQVNJQ19WRVJfSURfU1RSVUMsICpQQVNJQ19WRVJfSURfU1RSVUM7CisjZGVmaW5lIE1BQ19TWVNfQ1RSTCAgICAgICAgICAgIDB4MTAwNAkvKk1BQ19DU1IxICovCisjZGVmaW5lIE1BQ19BRERSX0RXMAkJCQkweDEwMDgJLyogTUFDIEFERFIgRFcwICovCisjZGVmaW5lIE1BQ19BRERSX0RXMQkJCSAweDEwMGMJLyogTUFDIEFERFIgRFcxICovCisvKiAqLworLyogTUFDX0NTUjI6IFNUQSBNQUMgcmVnaXN0ZXIgMCAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX01BQ19EVzBfU1RSVUMgeworCXN0cnVjdCB7CisJCXU4IEJ5dGUwOwkvKiBNQUMgYWRkcmVzcyBieXRlIDAgKi8KKwkJdTggQnl0ZTE7CS8qIE1BQyBhZGRyZXNzIGJ5dGUgMSAqLworCQl1OCBCeXRlMjsJLyogTUFDIGFkZHJlc3MgYnl0ZSAyICovCisJCXU4IEJ5dGUzOwkvKiBNQUMgYWRkcmVzcyBieXRlIDMgKi8KKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBNQUNfRFcwX1NUUlVDLCAqUE1BQ19EVzBfU1RSVUM7CisKKy8qICovCisvKiBNQUNfQ1NSMzogU1RBIE1BQyByZWdpc3RlciAxICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfTUFDX0RXMV9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTggQnl0ZTQ7CS8qIE1BQyBhZGRyZXNzIGJ5dGUgNCAqLworCQl1OCBCeXRlNTsJLyogTUFDIGFkZHJlc3MgYnl0ZSA1ICovCisJCXU4IFUyTWVNYXNrOworCQl1OCBSc3ZkMTsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBNQUNfRFcxX1NUUlVDLCAqUE1BQ19EVzFfU1RSVUM7CisKKyNkZWZpbmUgTUFDX0JTU0lEX0RXMAkJCQkweDEwMTAJLyogTUFDIEJTU0lEIERXMCAqLworI2RlZmluZSBNQUNfQlNTSURfRFcxCQkJCTB4MTAxNAkvKiBNQUMgQlNTSUQgRFcxICovCisKKy8qICovCisvKiBNQUNfQ1NSNTogQlNTSUQgcmVnaXN0ZXIgMSAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX01BQ19DU1I1X1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1OCBCeXRlNDsJLyogQlNTSUQgYnl0ZSA0ICovCisJCXU4IEJ5dGU1OwkvKiBCU1NJRCBieXRlIDUgKi8KKwkJdTE2IEJzc0lkTWFzazoyOwkvKiAwOiBvbmUgQlNTSUQsIDEwOiA0IEJTU0lELCAgMDE6IDIgQlNTSUQgLCAxMTogOEJTU0lEICovCisJCXUxNiBNQnNzQmNuTnVtOjM7CisJCXUxNiBSc3ZkOjExOworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IE1BQ19DU1I1X1NUUlVDLCAqUE1BQ19DU1I1X1NUUlVDOworCisjZGVmaW5lIE1BWF9MRU5fQ0ZHICAgICAgICAgICAgICAweDEwMTgJLyogcnQyODYwYiBtYXggMTZrIGJ5dGVzLiBiaXQxMjoxMyBNYXhpbXVtIFBTRFUgbGVuZ3RoIChwb3dlciBmYWN0b3IpIDA6Ml4xMywgMToyXjE0LCAyOjJeMTUsIDM6Ml4xNiAqLworI2RlZmluZSBCQlBfQ1NSX0NGRwkJCTB4MTAxYwkvKiAqLworLyogKi8KKy8qIEJCUF9DU1JfQ0ZHOiBCQlAgc2VyaWFsIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9CQlBfQ1NSX0NGR19TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIFZhbHVlOjg7CS8qIFJlZ2lzdGVyICAgICB2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQICovCisJCXUzMiBSZWdOdW06ODsJLyogU2VsZWN0ZWQgICAgIEJCUCAgICAgcmVnaXN0ZXIgKi8KKwkJdTMyIGZSZWFkOjE7CS8qIDA6IFdyaXRlIEJCUCwgMTogUmVhZCBCQlAgKi8KKwkJdTMyIEJ1c3k6MTsJLyogMTogQVNJQyBpcyBidXN5IGV4ZWN1dGUgQkJQIHByb2dyYW1taW5nLiAqLworCQl1MzIgQkJQX1BBUl9EVVI6MTsJLyogMDogNCBNQUMgY2xvY2sgY3ljbGVzICAxOiA4IE1BQyBjbG9jayBjeWNsZXMgKi8KKwkJdTMyIEJCUF9SV19NT0RFOjE7CS8qIDA6IHVzZSBzZXJpYWwgbW9kZSAgMTpwYXJhbGxlbCAqLworCQl1MzIgOiAxMjsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBCQlBfQ1NSX0NGR19TVFJVQywgKlBCQlBfQ1NSX0NGR19TVFJVQzsKKyNkZWZpbmUgUkZfQ1NSX0NGRzAJCQkweDEwMjAKKy8qICovCisvKiBSRl9DU1JfQ0ZHOiBSRiBjb250cm9sIHJlZ2lzdGVyICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfUkZfQ1NSX0NGRzBfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBSZWdJZEFuZENvbnRlbnQ6MjQ7CS8qIFJlZ2lzdGVyICAgICB2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQICovCisJCXUzMiBiaXR3aWR0aDo1OwkvKiBTZWxlY3RlZCAgICAgQkJQICAgICByZWdpc3RlciAqLworCQl1MzIgU3RhbmRieU1vZGU6MTsJLyogMDogaGlnaCB3aGVuIHN0YW5kIGJ5IDE6IGxvdyB3aGVuIHN0YW5kYnkgKi8KKwkJdTMyIFNlbDoxOwkvKiAwOlJGX0xFMCBhY3RpdmF0ZSAgMTpSRl9MRTEgYWN0aXZhdGUgKi8KKwkJdTMyIEJ1c3k6MTsJLyogMDogaWRsZSAxOiA4YnVzeSAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFJGX0NTUl9DRkcwX1NUUlVDLCAqUFJGX0NTUl9DRkcwX1NUUlVDOworI2RlZmluZSBSRl9DU1JfQ0ZHMQkJCTB4MTAyNAordHlwZWRlZiB1bmlvbiBfUkZfQ1NSX0NGRzFfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBSZWdJZEFuZENvbnRlbnQ6MjQ7CS8qIFJlZ2lzdGVyICAgICB2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQICovCisJCXUzMiBSRkdhcDo1OwkvKiBHYXAgYmV0d2VlbiBCQl9DT05UUk9MX1JGIGFuZCBSRl9MRS4gMDogMyBzeXN0ZW0gY2xvY2sgY3ljbGUgKDM3LjV1c2VjKSAxOiA1IHN5c3RlbSBjbG9jayBjeWNsZSAoNjIuNXVzZWMpICovCisJCXUzMiByc3Y6NzsJLyogMDogaWRsZSAxOiA4YnVzeSAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFJGX0NTUl9DRkcxX1NUUlVDLCAqUFJGX0NTUl9DRkcxX1NUUlVDOworI2RlZmluZSBSRl9DU1JfQ0ZHMgkJCTB4MTAyOAkvKiAqLwordHlwZWRlZiB1bmlvbiBfUkZfQ1NSX0NGRzJfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBSZWdJZEFuZENvbnRlbnQ6MjQ7CS8qIFJlZ2lzdGVyICAgICB2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQICovCisJCXUzMiByc3Y6ODsJLyogMDogaWRsZSAxOiA4YnVzeSAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFJGX0NTUl9DRkcyX1NUUlVDLCAqUFJGX0NTUl9DRkcyX1NUUlVDOworI2RlZmluZSBMRURfQ0ZHCQkJCTB4MTAyYwkvKiAgTUFDX0NTUjE0ICovCit0eXBlZGVmIHVuaW9uIF9MRURfQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgT25QZXJpb2Q6ODsJLyogYmxpbmtpbmcgb24gcGVyaW9kIHVuaXQgMW1zICovCisJCXUzMiBPZmZQZXJpb2Q6ODsJLyogYmxpbmtpbmcgb2ZmIHBlcmlvZCB1bml0IDFtcyAqLworCQl1MzIgU2xvd0JsaW5rUGVyaW9kOjY7CS8qIHNsb3cgYmxpbmtpbmcgcGVyaW9kLiB1bml0OjFtcyAqLworCQl1MzIgcnN2OjI7CisJCXUzMiBSTGVkTW9kZToyOwkvKiByZWQgTGVkIE1vZGUgICAgMDogb2ZmMTogYmxpbmtpbmcgdXBvbiBUWDI6IHBlcmlvZGljIHNsb3cgYmxpbmtpbmczOiBhbHdheXMgb24gKi8KKwkJdTMyIEdMZWRNb2RlOjI7CS8qIGdyZWVuIExlZCBNb2RlICovCisJCXUzMiBZTGVkTW9kZToyOwkvKiB5ZWxsb3cgTGVkIE1vZGUgKi8KKwkJdTMyIExlZFBvbGFyOjE7CS8qIExlZCBQb2xhcml0eS4gIDA6IGFjdGl2ZSBsb3cxOiBhY3RpdmUgaGlnaCAqLworCQl1MzIgOiAxOworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IExFRF9DRkdfU1RSVUMsICpQTEVEX0NGR19TVFJVQzsKKy8qICovCisvKiAgNC4yIE1BQyBUSU1JTkcgIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMTAwKSAqLworLyogKi8KKyNkZWZpbmUgWElGU19USU1FX0NGRyAgICAgICAgICAgICAweDExMDAJLyogTUFDX0NTUjggIE1BQ19DU1I5ICovCit0eXBlZGVmIHVuaW9uIF9JRlNfU0xPVF9DRkdfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBDY2ttU2lmc1RpbWU6ODsJLyogIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIENDSyBSWC9UWCAqLworCQl1MzIgT2ZkbVNpZnNUaW1lOjg7CS8qICB1bml0IDF1cy4gQXBwbGllZCBhZnRlciBPRkRNIFJYL1RYICovCisJCXUzMiBPZmRtWGlmc1RpbWU6NDsJLypPRkRNIFNJRlMuIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlggd2hlbiBNQUMgZG9lc24ndCByZWZlcmVuY2UgQkJQIHNpZ25hbCBCQlJYRU5EICovCisJCXUzMiBFSUZTOjk7CS8qICB1bml0IDF1cyAqLworCQl1MzIgQkJSeGVuZEVuYWJsZToxOwkvKiAgcmVmZXJlbmNlIFJYRU5EIHNpZ25hbCB0byBiZWdpbiBYSUZTIGRlZmVyICovCisJCXUzMiByc3Y6MjsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBJRlNfU0xPVF9DRkdfU1RSVUMsICpQSUZTX1NMT1RfQ0ZHX1NUUlVDOworCisjZGVmaW5lIEJLT0ZGX1NMT1RfQ0ZHICAgICAgICAgICAgIDB4MTEwNAkvKiAgbWFjX2NzcjkgbGFzdCA4IGJpdHMgKi8KKyNkZWZpbmUgTkFWX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTEwOAkvKiBOQVYgIChNQUNfQ1NSMTUpICovCisjZGVmaW5lIENIX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTEwQwkvKiBDb3VudCBhcyBjaGFubmVsIGJ1c3kgKi8KKyNkZWZpbmUgUEJGX0xJRkVfVElNRVIgICAgICAgICAgICAgMHgxMTEwCS8qVFgvUlggTVBEVSB0aW1lc3RhbXAgdGltZXIgKGZyZWUgcnVuKVVuaXQ6IDF1cyAqLworI2RlZmluZSBCQ05fVElNRV9DRkcgICAgICAgICAgICAgMHgxMTE0CS8qIFRYUlhfQ1NSOSAqLworCisjZGVmaW5lIEJDTl9PRkZTRVQwCQkJCTB4MDQyQworI2RlZmluZSBCQ05fT0ZGU0VUMQkJCQkweDA0MzAKKworLyogKi8KKy8qIEJDTl9USU1FX0NGRyA6IFN5bmNocm9uaXphdGlvbiBjb250cm9sIHJlZ2lzdGVyICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfQkNOX1RJTUVfQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgQmVhY29uSW50ZXJ2YWw6MTY7CS8qIGluIHVuaXQgb2YgMS8xNiBUVSAqLworCQl1MzIgYlRzZlRpY2tpbmc6MTsJLyogRW5hYmxlIFRTRiBhdXRvIGNvdW50aW5nICovCisJCXUzMiBUc2ZTeW5jTW9kZToyOwkvKiBFbmFibGUgVFNGIHN5bmMsIDAwOiBkaXNhYmxlLCAwMTogaW5mcmEgbW9kZSwgMTA6IGFkLWhvYyBtb2RlICovCisJCXUzMiBiVEJUVEVuYWJsZToxOworCQl1MzIgYkJlYWNvbkdlbjoxOwkvKiBFbmFibGUgYmVhY29uIGdlbmVyYXRvciAqLworCQl1MzIgOiAzOworCQl1MzIgVHhUaW1lc3RhbXBDb21wZW5zYXRlOjg7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gQkNOX1RJTUVfQ0ZHX1NUUlVDLCAqUEJDTl9USU1FX0NGR19TVFJVQzsKKyNkZWZpbmUgVEJUVF9TWU5DX0NGRyAgICAgICAgICAgIDB4MTExOAkvKiB0eHJ4X2NzcjEwICovCisjZGVmaW5lIFRTRl9USU1FUl9EVzAgICAgICAgICAgICAgMHgxMTFDCS8qIExvY2FsIFRTRiB0aW1lciBsc2IgMzIgYml0cy4gUmVhZC1vbmx5ICovCisjZGVmaW5lIFRTRl9USU1FUl9EVzEgICAgICAgICAgICAgMHgxMTIwCS8qIG1zYiAzMiBiaXRzLiBSZWFkLW9ubHkuICovCisjZGVmaW5lIFRCVFRfVElNRVIJCTB4MTEyNAkvKiBUSW1lciByZW1haW5zIHRpbGwgbmV4dCBUQlRULiBSZWFkLW9ubHkuICBUWFJYX0NTUjE0ICovCisjZGVmaW5lIElOVF9USU1FUl9DRkcJCQkweDExMjgJLyogKi8KKyNkZWZpbmUgSU5UX1RJTUVSX0VOCQkJMHgxMTJjCS8qICBHUC10aW1lciBhbmQgcHJlLXRidHQgSW50IGVuYWJsZSAqLworI2RlZmluZSBDSF9JRExFX1NUQQkJCTB4MTEzMAkvKiAgY2hhbm5lbCBpZGxlIHRpbWUgKi8KKyNkZWZpbmUgQ0hfQlVTWV9TVEEJCQkweDExMzQJLyogIGNoYW5ubGUgYnVzeSB0aW1lICovCisvKiAqLworLyogIDQuMiBNQUMgUE9XRVIgIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMjAwKSAqLworLyogKi8KKyNkZWZpbmUgTUFDX1NUQVRVU19DRkcgICAgICAgICAgICAgMHgxMjAwCS8qIG9sZCBNQUNfQ1NSMTIgKi8KKyNkZWZpbmUgUFdSX1BJTl9DRkcgICAgICAgICAgICAgMHgxMjA0CS8qIG9sZCBNQUNfQ1NSMTIgKi8KKyNkZWZpbmUgQVVUT19XQUtFVVBfQ0ZHICAgICAgICAgICAgIDB4MTIwOAkvKiBvbGQgTUFDX0NTUjEwICovCisvKiAqLworLyogQVVUT19XQUtFVVBfQ0ZHOiBNYW51YWwgcG93ZXIgY29udHJvbCAvIHN0YXR1cyByZWdpc3RlciAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX0FVVE9fV0FLRVVQX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgQXV0b0xlYWRUaW1lOjg7CisJCXUzMiBOdW1vZlNsZWVwaW5nVGJ0dDo3OwkvKiBGb3JjZVdha2UgaGFzIGhpZ2ggcHJpdmlsZWdlIHRoYW4gUHV0VG9TbGVlcCB3aGVuIGJvdGggc2V0ICovCisJCXUzMiBFbmFibGVBdXRvV2FrZXVwOjE7CS8qIDA6c2xlZXAsIDE6YXdha2UgKi8KKwkJdTMyIDogMTY7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gQVVUT19XQUtFVVBfU1RSVUMsICpQQVVUT19XQUtFVVBfU1RSVUM7CisvKiAqLworLyogIDQuMyBNQUMgVFggIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMzAwKSAqLworLyogKi8KKworI2RlZmluZSBFRENBX0FDMF9DRkcJMHgxMzAwCS8qQUNfVFhPUF9DU1IwIDB4MzQ3NCAqLworI2RlZmluZSBFRENBX0FDMV9DRkcJMHgxMzA0CisjZGVmaW5lIEVEQ0FfQUMyX0NGRwkweDEzMDgKKyNkZWZpbmUgRURDQV9BQzNfQ0ZHCTB4MTMwYwordHlwZWRlZiB1bmlvbiBfRURDQV9BQ19DRkdfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBBY1R4b3A6ODsJLyogIGluIHVuaXQgb2YgMzJ1cyAqLworCQl1MzIgQWlmc246NDsJLyogIyBvZiBzbG90IHRpbWUgKi8KKwkJdTMyIEN3bWluOjQ7CS8qICovCisJCXUzMiBDd21heDo0OwkvKnVuaXQgcG93ZXIgb2YgMiAqLworCQl1MzIgOiAxMjsJLyogKi8KKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBFRENBX0FDX0NGR19TVFJVQywgKlBFRENBX0FDX0NGR19TVFJVQzsKKworI2RlZmluZSBFRENBX1RJRF9BQ19NQVAJMHgxMzEwCisjZGVmaW5lIFRYX1BXUl9DRkdfMAkweDEzMTQKKyNkZWZpbmUgVFhfUFdSX0NGR18xCTB4MTMxOAorI2RlZmluZSBUWF9QV1JfQ0ZHXzIJMHgxMzFDCisjZGVmaW5lIFRYX1BXUl9DRkdfMwkweDEzMjAKKyNkZWZpbmUgVFhfUFdSX0NGR180CTB4MTMyNAorI2RlZmluZSBUWF9QSU5fQ0ZHCQkweDEzMjgKKyNkZWZpbmUgVFhfQkFORF9DRkcJMHgxMzJjCS8qIDB4MSB1c2UgdXBwZXIgMjBNSHouIDAganVzZSBsb3dlciAyME1IeiAqLworI2RlZmluZSBUWF9TV19DRkcwCQkweDEzMzAKKyNkZWZpbmUgVFhfU1dfQ0ZHMQkJMHgxMzM0CisjZGVmaW5lIFRYX1NXX0NGRzIJCTB4MTMzOAorI2RlZmluZSBUWE9QX1RIUkVTX0NGRwkJMHgxMzNjCisjZGVmaW5lIFRYT1BfQ1RSTF9DRkcJCTB4MTM0MAorI2RlZmluZSBUWF9SVFNfQ0ZHCQkweDEzNDQKKwordHlwZWRlZiB1bmlvbiBfVFhfUlRTX0NGR19TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIEF1dG9SdHNSZXRyeUxpbWl0Ojg7CisJCXUzMiBSdHNUaHJlczoxNjsJLyogdW5pdDpieXRlICovCisJCXUzMiBSdHNGYmtFbjoxOwkvKiBlbmFibGUgcnRzIHJhdGUgZmFsbGJhY2sgKi8KKwkJdTMyIHJzdjo3OwkvKiAxOiBIVCBub24tU1RCQyBjb250cm9sIGZyYW1lIGVuYWJsZSAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFRYX1JUU19DRkdfU1RSVUMsICpQVFhfUlRTX0NGR19TVFJVQzsKKyNkZWZpbmUgVFhfVElNRU9VVF9DRkcJMHgxMzQ4Cit0eXBlZGVmIHVuaW9uIF9UWF9USU1FT1VUX0NGR19TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIHJzdjo0OworCQl1MzIgTXBkdUxpZmVUaW1lOjQ7CS8qICBleHBpcmF0aW9uIHRpbWUgPSAyXig5K01QRFUgTElGRSBUSU1FKSAgdXMgKi8KKwkJdTMyIFJ4QWNrVGltZW91dDo4OwkvKiB1bml0OnNsb3QuIFVzZWQgZm9yIFRYIHByZWNlZHVyZSAqLworCQl1MzIgVHhvcFRpbWVvdXQ6ODsJLypUWE9QIHRpbWVvdXQgdmFsdWUgZm9yIFRYT1AgdHJ1bmNhdGlvbi4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgKFNMT1RfVElNRSkgPiAoVFhfT1BfVElNRU9VVCkgPiAoUlhfQUNLX1RJTUVPVVQpICovCisJCXUzMiByc3YyOjg7CS8qIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlICovCisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gVFhfVElNRU9VVF9DRkdfU1RSVUMsICpQVFhfVElNRU9VVF9DRkdfU1RSVUM7CisjZGVmaW5lIFRYX1JUWV9DRkcJMHgxMzRjCit0eXBlZGVmIHVuaW9uIFBBQ0tFRCBfVFhfUlRZX0NGR19TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIFNob3J0UnR5TGltaXQ6ODsJLyogIHNob3J0IHJldHJ5IGxpbWl0ICovCisJCXUzMiBMb25nUnR5TGltaXQ6ODsJLypsb25nIHJldHJ5IGxpbWl0ICovCisJCXUzMiBMb25nUnR5VGhyZToxMjsJLyogTG9uZyByZXRyeSB0aHJlc2hvb2xkICovCisJCXUzMiBOb25BZ2dSdHlNb2RlOjE7CS8qIE5vbi1BZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lciAqLworCQl1MzIgQWdnUnR5TW9kZToxOwkvKiBBZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lciAqLworCQl1MzIgVHhhdXRvRkJFbmFibGU6MTsJLyogVHggcmV0cnkgUEhZIHJhdGUgYXV0byBmYWxsYmFjayBlbmFibGUgKi8KKwkJdTMyIHJzdjoxOwkvKiAxOiBIVCBub24tU1RCQyBjb250cm9sIGZyYW1lIGVuYWJsZSAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFRYX1JUWV9DRkdfU1RSVUMsICpQVFhfUlRZX0NGR19TVFJVQzsKKyNkZWZpbmUgVFhfTElOS19DRkcJMHgxMzUwCit0eXBlZGVmIHVuaW9uIFBBQ0tFRCBfVFhfTElOS19DRkdfU1RSVUMgeworCXN0cnVjdCBQQUNLRUQgeworCQl1MzIgUmVtb3RlTUZCTGlmZVRpbWU6ODsJLypyZW1vdGUgTUZCIGxpZmUgdGltZS4gdW5pdCA6IDMydXMgKi8KKwkJdTMyIE1GQkVuYWJsZToxOwkvKiAgVFggYXBwbHkgcmVtb3RlIE1GQiAxOmVuYWJsZSAqLworCQl1MzIgUmVtb3RlVU1GU0VuYWJsZToxOwkvKiAgcmVtb3RlIHVuc29saWNpdCAgTUZCIGVuYWJsZS4gIDA6IG5vdCBhcHBseSByZW1vdGUgcmVtb3RlIHVuc29saWNpdCAoTUZTPTcpICovCisJCXUzMiBUeE1SUUVuOjE7CS8qICBNQ1MgcmVxdWVzdCBUWCBlbmFibGUgKi8KKwkJdTMyIFR4UkRHRW46MTsJLyogUkRHIFRYIGVuYWJsZSAqLworCQl1MzIgVHhDRkFja0VuOjE7CS8qICAgUGlnZ3liYWNrIENGLUFDSyBlbmFibGUgKi8KKwkJdTMyIHJzdjozOwkvKiAqLworCQl1MzIgUmVtb3RNRkI6ODsJLyogIHJlbW90ZSBNQ1MgZmVlZGJhY2sgKi8KKwkJdTMyIFJlbW90TUZTOjg7CS8qcmVtb3RlIE1DUyBmZWVkYmFjayBzZXF1ZW5jZSBudW1iZXIgKi8KKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9MSU5LX0NGR19TVFJVQywgKlBUWF9MSU5LX0NGR19TVFJVQzsKKyNkZWZpbmUgSFRfRkJLX0NGRzAJMHgxMzU0Cit0eXBlZGVmIHVuaW9uIFBBQ0tFRCBfSFRfRkJLX0NGRzBfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBIVE1DUzBGQks6NDsKKwkJdTMyIEhUTUNTMUZCSzo0OworCQl1MzIgSFRNQ1MyRkJLOjQ7CisJCXUzMiBIVE1DUzNGQks6NDsKKwkJdTMyIEhUTUNTNEZCSzo0OworCQl1MzIgSFRNQ1M1RkJLOjQ7CisJCXUzMiBIVE1DUzZGQks6NDsKKwkJdTMyIEhUTUNTN0ZCSzo0OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IEhUX0ZCS19DRkcwX1NUUlVDLCAqUEhUX0ZCS19DRkcwX1NUUlVDOworI2RlZmluZSBIVF9GQktfQ0ZHMQkweDEzNTgKK3R5cGVkZWYgdW5pb24gX0hUX0ZCS19DRkcxX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgSFRNQ1M4RkJLOjQ7CisJCXUzMiBIVE1DUzlGQks6NDsKKwkJdTMyIEhUTUNTMTBGQks6NDsKKwkJdTMyIEhUTUNTMTFGQks6NDsKKwkJdTMyIEhUTUNTMTJGQks6NDsKKwkJdTMyIEhUTUNTMTNGQks6NDsKKwkJdTMyIEhUTUNTMTRGQks6NDsKKwkJdTMyIEhUTUNTMTVGQks6NDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBIVF9GQktfQ0ZHMV9TVFJVQywgKlBIVF9GQktfQ0ZHMV9TVFJVQzsKKyNkZWZpbmUgTEdfRkJLX0NGRzAJMHgxMzVjCit0eXBlZGVmIHVuaW9uIF9MR19GQktfQ0ZHMF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIE9GRE1NQ1MwRkJLOjQ7CS8qaW5pdGlhbCB2YWx1ZSBpcyAwICovCisJCXUzMiBPRkRNTUNTMUZCSzo0OwkvKmluaXRpYWwgdmFsdWUgaXMgMCAqLworCQl1MzIgT0ZETU1DUzJGQks6NDsJLyppbml0aWFsIHZhbHVlIGlzIDEgKi8KKwkJdTMyIE9GRE1NQ1MzRkJLOjQ7CS8qaW5pdGlhbCB2YWx1ZSBpcyAyICovCisJCXUzMiBPRkRNTUNTNEZCSzo0OwkvKmluaXRpYWwgdmFsdWUgaXMgMyAqLworCQl1MzIgT0ZETU1DUzVGQks6NDsJLyppbml0aWFsIHZhbHVlIGlzIDQgKi8KKwkJdTMyIE9GRE1NQ1M2RkJLOjQ7CS8qaW5pdGlhbCB2YWx1ZSBpcyA1ICovCisJCXUzMiBPRkRNTUNTN0ZCSzo0OwkvKmluaXRpYWwgdmFsdWUgaXMgNiAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IExHX0ZCS19DRkcwX1NUUlVDLCAqUExHX0ZCS19DRkcwX1NUUlVDOworI2RlZmluZSBMR19GQktfQ0ZHMQkJMHgxMzYwCit0eXBlZGVmIHVuaW9uIF9MR19GQktfQ0ZHMV9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIENDS01DUzBGQks6NDsJLyppbml0aWFsIHZhbHVlIGlzIDAgKi8KKwkJdTMyIENDS01DUzFGQks6NDsJLyppbml0aWFsIHZhbHVlIGlzIDAgKi8KKwkJdTMyIENDS01DUzJGQks6NDsJLyppbml0aWFsIHZhbHVlIGlzIDEgKi8KKwkJdTMyIENDS01DUzNGQks6NDsJLyppbml0aWFsIHZhbHVlIGlzIDIgKi8KKwkJdTMyIHJzdjoxNjsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBMR19GQktfQ0ZHMV9TVFJVQywgKlBMR19GQktfQ0ZHMV9TVFJVQzsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKj09PT09PT09PT09PT09PT0gUHJvdGVjdGlvbiBQYXJhbWF0ZXI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjZGVmaW5lIENDS19QUk9UX0NGRwkweDEzNjQJLypDQ0sgUHJvdGVjdGlvbiAqLworI2RlZmluZSBBU0lDX1NIT1JUTkFWCQkxCisjZGVmaW5lIEFTSUNfbG9uZ05BVgkJMgorI2RlZmluZSBBU0lDX1JUUwkJMQorI2RlZmluZSBBU0lDX0NUUwkJMgordHlwZWRlZiB1bmlvbiBfUFJPVF9DRkdfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBQcm90ZWN0UmF0ZToxNjsJLypQcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgcmF0ZSBmb3IgQ0NLIFRYKFJUUy9DVFMvQ0ZFbmQpLiAqLworCQl1MzIgUHJvdGVjdEN0cmw6MjsJLypQcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgdHlwZSBmb3IgQ0NLIFRYLiAxOlJUUy9DVFMsIDI6Q1RTLXRvLXNlbGYsIDA6Tm9uZSwgMzpyc3YgKi8KKwkJdTMyIFByb3RlY3ROYXY6MjsJLypUWE9QIHByb3RlY3Rpb24gdHlwZSBmb3IgQ0NLIFRYLiAwOk5vbmUsIDE6U2hvcnROQVZwcm90ZWN0LCAgMjpMb25nTkFWUHJvdGVjdCwgMzpyc3YgKi8KKwkJdTMyIFR4b3BBbGxvd0NjazoxOwkvKkNDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LiAqLworCQl1MzIgVHhvcEFsbG93T2ZkbToxOwkvKkNDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LiAqLworCQl1MzIgVHhvcEFsbG93TU0yMDoxOwkvKkNDSyBUWE9QIGFsbG93YW5jZS4gMDpkaXNhbGxvdy4gKi8KKwkJdTMyIFR4b3BBbGxvd01NNDA6MTsJLypDQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4gKi8KKwkJdTMyIFR4b3BBbGxvd0dGMjA6MTsJLypDQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4gKi8KKwkJdTMyIFR4b3BBbGxvd0dGNDA6MTsJLypDQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4gKi8KKwkJdTMyIFJUU1RoRW46MTsJLypSVFMgdGhyZXNob2xkIGVuYWJsZSBvbiBDQ0sgVFggKi8KKwkJdTMyIHJzdjo1OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFBST1RfQ0ZHX1NUUlVDLCAqUFBST1RfQ0ZHX1NUUlVDOworCisjZGVmaW5lIE9GRE1fUFJPVF9DRkcJMHgxMzY4CS8qT0ZETSBQcm90ZWN0aW9uICovCisjZGVmaW5lIE1NMjBfUFJPVF9DRkcJMHgxMzZDCS8qTU0yMCBQcm90ZWN0aW9uICovCisjZGVmaW5lIE1NNDBfUFJPVF9DRkcJMHgxMzcwCS8qTU00MCBQcm90ZWN0aW9uICovCisjZGVmaW5lIEdGMjBfUFJPVF9DRkcJMHgxMzc0CS8qR0YyMCBQcm90ZWN0aW9uICovCisjZGVmaW5lIEdGNDBfUFJPVF9DRkcJMHgxMzc4CS8qR1I0MCBQcm90ZWN0aW9uICovCisjZGVmaW5lIEVYUF9DVFNfVElNRQkweDEzN0MJLyogKi8KKyNkZWZpbmUgRVhQX0FDS19USU1FCTB4MTM4MAkvKiAqLworCisvKiAqLworLyogIDQuNCBNQUMgUlggY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDE0MDApICovCisvKiAqLworI2RlZmluZSBSWF9GSUxUUl9DRkcJMHgxNDAwCS8qVFhSWF9DU1IwICovCisjZGVmaW5lIEFVVE9fUlNQX0NGRwkweDE0MDQJLypUWFJYX0NTUjQgKi8KKy8qICovCisvKiBUWFJYX0NTUjQ6IEF1dG8tUmVzcG9uZGVyLyAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX0FVVE9fUlNQX0NGR19TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIEF1dG9SZXNwb25kZXJFbmFibGU6MTsKKwkJdTMyIEJBQ0Fja1BvbGljeUVuYWJsZToxOwkvKiAwOmxvbmcsIDE6c2hvcnQgcHJlYW1ibGUgKi8KKwkJdTMyIENUUzQwTU1vZGU6MTsJLyogUmVzcG9uc2UgQ1RTIDQwTUh6IGR1cGxpY2F0ZSBtb2RlICovCisJCXUzMiBDVFM0ME1SZWY6MTsJLyogUmVzcG9uc2UgQ1RTIDQwTUh6IGR1cGxpY2F0ZSBtb2RlICovCisJCXUzMiBBdXRvUmVzcG9uZGVyUHJlYW1ibGU6MTsJLyogMDpsb25nLCAxOnNob3J0IHByZWFtYmxlICovCisJCXUzMiByc3Y6MTsJLyogUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lICovCisJCXUzMiBEdWFsQ1RTRW46MTsJLyogUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lICovCisJCXUzMiBBY2tDdHNQc21CaXQ6MTsJLyogUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lICovCisJCXUzMiA6IDI0OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IEFVVE9fUlNQX0NGR19TVFJVQywgKlBBVVRPX1JTUF9DRkdfU1RSVUM7CisKKyNkZWZpbmUgTEVHQUNZX0JBU0lDX1JBVEUJMHgxNDA4CS8qICBUWFJYX0NTUjUgICAgICAgICAgIDB4MzA1NCAqLworI2RlZmluZSBIVF9CQVNJQ19SQVRFCQkweDE0MGMKKyNkZWZpbmUgSFRfQ1RSTF9DRkcJCTB4MTQxMAorI2RlZmluZSBTSUZTX0NPU1RfQ0ZHCQkweDE0MTQKKyNkZWZpbmUgUlhfUEFSU0VSX0NGRwkJMHgxNDE4CS8qU2V0IE5BViBmb3IgYWxsIHJlY2VpdmVkIGZyYW1lcyAqLworCisvKiAqLworLyogIDQuNSBNQUMgU2VjdXJpdHkgY29uZmlndXJhdGlvbiAob2Zmc2V0OjB4MTUwMCkgKi8KKy8qICovCisjZGVmaW5lIFRYX1NFQ19DTlQwCQkweDE1MDAJLyogKi8KKyNkZWZpbmUgUlhfU0VDX0NOVDAJCTB4MTUwNAkvKiAqLworI2RlZmluZSBDQ01QX0ZDX01VVEUJCTB4MTUwOAkvKiAqLworLyogKi8KKy8qICA0LjYgSENDQS9QU01QIChvZmZzZXQ6MHgxNjAwKSAqLworLyogKi8KKyNkZWZpbmUgVFhPUF9ITERSX0FERFIwCQkweDE2MDAKKyNkZWZpbmUgVFhPUF9ITERSX0FERFIxCQkweDE2MDQKKyNkZWZpbmUgVFhPUF9ITERSX0VUCQkweDE2MDgKKyNkZWZpbmUgUU9TX0NGUE9MTF9SQV9EVzAJCTB4MTYwYworI2RlZmluZSBRT1NfQ0ZQT0xMX0ExX0RXMQkJMHgxNjEwCisjZGVmaW5lIFFPU19DRlBPTExfUUMJCTB4MTYxNAorLyogKi8KKy8qICA0LjcgTUFDIFN0YXRpc3RpcyByZWdpc3RlcnMgKG9mZnNldDoweDE3MDApICovCisvKiAqLworI2RlZmluZSBSWF9TVEFfQ05UMAkJMHgxNzAwCS8qICovCisjZGVmaW5lIFJYX1NUQV9DTlQxCQkweDE3MDQJLyogKi8KKyNkZWZpbmUgUlhfU1RBX0NOVDIJCTB4MTcwOAkvKiAqLworCisvKiAqLworLyogUlhfU1RBX0NOVDBfU1RSVUM6IFJYIFBMQ1AgZXJyb3IgY291bnQgJiBSWCBDUkMgZXJyb3IgY291bnQgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9SWF9TVEFfQ05UMF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IENyY0VycjsKKwkJdTE2IFBoeUVycjsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBSWF9TVEFfQ05UMF9TVFJVQywgKlBSWF9TVEFfQ05UMF9TVFJVQzsKKworLyogKi8KKy8qIFJYX1NUQV9DTlQxX1NUUlVDOiBSWCBGYWxzZSBDQ0EgY291bnQgJiBSWCBsb25nIGZyYW1lIGNvdW50ICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfUlhfU1RBX0NOVDFfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBGYWxzZUNjYTsKKwkJdTE2IFBsY3BFcnI7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gUlhfU1RBX0NOVDFfU1RSVUMsICpQUlhfU1RBX0NOVDFfU1RSVUM7CisKKy8qICovCisvKiBSWF9TVEFfQ05UMl9TVFJVQzogKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9SWF9TVEFfQ05UMl9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IFJ4RHVwbGlDb3VudDsKKwkJdTE2IFJ4Rmlmb092ZXJmbG93Q291bnQ7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gUlhfU1RBX0NOVDJfU1RSVUMsICpQUlhfU1RBX0NOVDJfU1RSVUM7CisjZGVmaW5lIFRYX1NUQV9DTlQwCQkweDE3MEMJLyogKi8KKy8qICovCisvKiBTVEFfQ1NSMzogVFggQmVhY29uIGNvdW50ICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfVFhfU1RBX0NOVDBfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBUeEZhaWxDb3VudDsKKwkJdTE2IFR4QmVhY29uQ291bnQ7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gVFhfU1RBX0NOVDBfU1RSVUMsICpQVFhfU1RBX0NOVDBfU1RSVUM7CisjZGVmaW5lIFRYX1NUQV9DTlQxCQkweDE3MTAJLyogKi8KKy8qICovCisvKiBUWF9TVEFfQ05UMTogVFggdHggY291bnQgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9UWF9TVEFfQ05UMV9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IFR4U3VjY2VzczsKKwkJdTE2IFR4UmV0cmFuc21pdDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9TVEFfQ05UMV9TVFJVQywgKlBUWF9TVEFfQ05UMV9TVFJVQzsKKyNkZWZpbmUgVFhfU1RBX0NOVDIJCTB4MTcxNAkvKiAqLworLyogKi8KKy8qIFRYX1NUQV9DTlQyOiBUWCB0eCBjb3VudCAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX1RYX1NUQV9DTlQyX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgVHhaZXJvTGVuQ291bnQ7CisJCXUxNiBUeFVuZGVyRmxvd0NvdW50OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFRYX1NUQV9DTlQyX1NUUlVDLCAqUFRYX1NUQV9DTlQyX1NUUlVDOworI2RlZmluZSBUWF9TVEFfRklGTwkJMHgxNzE4CS8qICovCisvKiAqLworLyogVFhfU1RBX0ZJRk9fU1RSVUM6IFRYIFJlc3VsdCBmb3Igc3BlY2lmaWMgUElEIHN0YXR1cyBmaWZvIHJlZ2lzdGVyICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBQQUNLRUQgX1RYX1NUQV9GSUZPX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgYlZhbGlkOjE7CS8qIDE6VGhpcyByZWdpc3RlciBjb250YWlucyBhIHZhbGlkIFRYIHJlc3VsdCAqLworCQl1MzIgUGlkVHlwZTo0OworCQl1MzIgVHhTdWNjZXNzOjE7CS8qIFR4IE5vIHJldHJ5IHN1Y2Nlc3MgKi8KKwkJdTMyIFR4QWdncmU6MTsJLyogVHggUmV0cnkgU3VjY2VzcyAqLworCQl1MzIgVHhBY2tSZXF1aXJlZDoxOwkvKiBUeCBmYWlsICovCisJCXUzMiB3Y2lkOjg7CS8qd2lyZWxlc3MgY2xpZW50IGluZGV4ICovCisvKiAgICAgICAgICAgICAgdTMyICAgICAgICAgIFN1Y2Nlc3NSYXRlOjE2OyAvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LiAqLworCQl1MzIgU3VjY2Vzc1JhdGU6MTM7CS8qaW5jbHVkZSBNQ1MsIG1vZGUgLHNob3J0R0ksIEJXIHNldHRpbmdTYW1lIGZvcm1hdCBhcyBUWFdJIFdvcmQgMCBCaXQgMzEtMTYuICovCisJCXUzMiBUeEJGOjE7CisJCXUzMiBSZXNlcnZlOjI7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gVFhfU1RBX0ZJRk9fU1RSVUMsICpQVFhfU1RBX0ZJRk9fU1RSVUM7CisvKiBEZWJ1ZyBjb3VudGVyICovCisjZGVmaW5lIFRYX0FHR19DTlQJMHgxNzFjCit0eXBlZGVmIHVuaW9uIF9UWF9BR0dfQ05UX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgTm9uQWdnVHhDb3VudDsKKwkJdTE2IEFnZ1R4Q291bnQ7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gVFhfQUdHX0NOVF9TVFJVQywgKlBUWF9BR0dfQ05UX1NUUlVDOworLyogRGVidWcgY291bnRlciAqLworI2RlZmluZSBUWF9BR0dfQ05UMAkweDE3MjAKK3R5cGVkZWYgdW5pb24gX1RYX0FHR19DTlQwX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgQWdnU2l6ZTFDb3VudDsKKwkJdTE2IEFnZ1NpemUyQ291bnQ7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gVFhfQUdHX0NOVDBfU1RSVUMsICpQVFhfQUdHX0NOVDBfU1RSVUM7CisvKiBEZWJ1ZyBjb3VudGVyICovCisjZGVmaW5lIFRYX0FHR19DTlQxCTB4MTcyNAordHlwZWRlZiB1bmlvbiBfVFhfQUdHX0NOVDFfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBBZ2dTaXplM0NvdW50OworCQl1MTYgQWdnU2l6ZTRDb3VudDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9BR0dfQ05UMV9TVFJVQywgKlBUWF9BR0dfQ05UMV9TVFJVQzsKKyNkZWZpbmUgVFhfQUdHX0NOVDIJMHgxNzI4Cit0eXBlZGVmIHVuaW9uIF9UWF9BR0dfQ05UMl9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IEFnZ1NpemU1Q291bnQ7CisJCXUxNiBBZ2dTaXplNkNvdW50OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFRYX0FHR19DTlQyX1NUUlVDLCAqUFRYX0FHR19DTlQyX1NUUlVDOworLyogRGVidWcgY291bnRlciAqLworI2RlZmluZSBUWF9BR0dfQ05UMwkweDE3MmMKK3R5cGVkZWYgdW5pb24gX1RYX0FHR19DTlQzX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgQWdnU2l6ZTdDb3VudDsKKwkJdTE2IEFnZ1NpemU4Q291bnQ7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gVFhfQUdHX0NOVDNfU1RSVUMsICpQVFhfQUdHX0NOVDNfU1RSVUM7CisvKiBEZWJ1ZyBjb3VudGVyICovCisjZGVmaW5lIFRYX0FHR19DTlQ0CTB4MTczMAordHlwZWRlZiB1bmlvbiBfVFhfQUdHX0NOVDRfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBBZ2dTaXplOUNvdW50OworCQl1MTYgQWdnU2l6ZTEwQ291bnQ7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gVFhfQUdHX0NOVDRfU1RSVUMsICpQVFhfQUdHX0NOVDRfU1RSVUM7CisjZGVmaW5lIFRYX0FHR19DTlQ1CTB4MTczNAordHlwZWRlZiB1bmlvbiBfVFhfQUdHX0NOVDVfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBBZ2dTaXplMTFDb3VudDsKKwkJdTE2IEFnZ1NpemUxMkNvdW50OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFRYX0FHR19DTlQ1X1NUUlVDLCAqUFRYX0FHR19DTlQ1X1NUUlVDOworI2RlZmluZSBUWF9BR0dfQ05UNgkJMHgxNzM4Cit0eXBlZGVmIHVuaW9uIF9UWF9BR0dfQ05UNl9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IEFnZ1NpemUxM0NvdW50OworCQl1MTYgQWdnU2l6ZTE0Q291bnQ7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gVFhfQUdHX0NOVDZfU1RSVUMsICpQVFhfQUdHX0NOVDZfU1RSVUM7CisjZGVmaW5lIFRYX0FHR19DTlQ3CQkweDE3M2MKK3R5cGVkZWYgdW5pb24gX1RYX0FHR19DTlQ3X1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgQWdnU2l6ZTE1Q291bnQ7CisJCXUxNiBBZ2dTaXplMTZDb3VudDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9BR0dfQ05UN19TVFJVQywgKlBUWF9BR0dfQ05UN19TVFJVQzsKKyNkZWZpbmUgTVBEVV9ERU5TSVRZX0NOVAkJMHgxNzQwCit0eXBlZGVmIHVuaW9uIF9NUERVX0RFTl9DTlRfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBUWFplcm9EZWxDb3VudDsJLypUWCB6ZXJvIGxlbmd0aCBkZWxpbWl0ZXIgY291bnQgKi8KKwkJdTE2IFJYWmVyb0RlbENvdW50OwkvKlJYIHplcm8gbGVuZ3RoIGRlbGltaXRlciBjb3VudCAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IE1QRFVfREVOX0NOVF9TVFJVQywgKlBNUERVX0RFTl9DTlRfU1RSVUM7CisvKiAqLworLyogVFhSWCBjb250cm9sIHJlZ2lzdGVycyAtIGJhc2UgYWRkcmVzcyAweDMwMDAgKi8KKy8qICovCisvKiBydDI4NjBiICBVTktOT1dOIHJlZyB1c2UgUi9PIFJlZyBBZGRyIDB4NzdkMCBmaXJzdC4uICovCisjZGVmaW5lIFRYUlhfQ1NSMSAgICAgICAgICAgMHg3N2QwCisKKy8qICovCisvKiBTZWN1cml0eSBrZXkgdGFibGUgbWVtb3J5LCBiYXNlIGFkZHJlc3MgPSAweDEwMDAgKi8KKy8qICovCisjZGVmaW5lIE1BQ19XQ0lEX0JBU0UJCTB4MTgwMAkvKjgtYnl0ZXModXNlIG9ubHkgNi1ieXRlcykgKiAyNTYgZW50cnkgPSAqLworI2RlZmluZSBIV19XQ0lEX0VOVFJZX1NJWkUgICA4CisjZGVmaW5lIFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICAgICAweDQwMDAJLyogMzItYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZSAqLworI2RlZmluZSBIV19LRVlfRU5UUllfU0laRSAgICAgICAgICAgMHgyMAorI2RlZmluZSBQQUlSV0lTRV9JVkVJVl9UQUJMRV9CQVNFICAgICAweDYwMDAJLyogOC1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlICovCisjZGVmaW5lIE1BQ19JVkVJVl9UQUJMRV9CQVNFICAgICAweDYwMDAJLyogOC1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlICovCisjZGVmaW5lIEhXX0lWRUlWX0VOVFJZX1NJWkUgICA4CisjZGVmaW5lIE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICAgICAweDY4MDAJLyogNC1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlICovCisjZGVmaW5lIEhXX1dDSURfQVRUUklfU0laRSAgIDQKKyNkZWZpbmUgV0NJRF9SRVNFUlZFRAkJCTB4NmJmYworI2RlZmluZSBTSEFSRURfS0VZX1RBQkxFX0JBU0UgICAgICAgMHg2YzAwCS8qIDMyLWJ5dGUgKiAxNi1lbnRyeSA9IDUxMi1ieXRlICovCisjZGVmaW5lIFNIQVJFRF9LRVlfTU9ERV9CQVNFICAgICAgIDB4NzAwMAkvKiAzMi1ieXRlICogMTYtZW50cnkgPSA1MTItYnl0ZSAqLworI2RlZmluZSBIV19TSEFSRURfS0VZX01PREVfU0laRSAgIDQKKyNkZWZpbmUgU0hBUkVES0VZVEFCTEUJCQkwCisjZGVmaW5lIFBBSVJXSVNFS0VZVEFCTEUJCQkxCisKK3R5cGVkZWYgdW5pb24gX1NIQVJFREtFWV9NT0RFX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgQnNzMEtleTBDaXBoZXJBbGc6MzsKKwkJdTMyIDogMTsKKwkJdTMyIEJzczBLZXkxQ2lwaGVyQWxnOjM7CisJCXUzMiA6IDE7CisJCXUzMiBCc3MwS2V5MkNpcGhlckFsZzozOworCQl1MzIgOiAxOworCQl1MzIgQnNzMEtleTNDaXBoZXJBbGc6MzsKKwkJdTMyIDogMTsKKwkJdTMyIEJzczFLZXkwQ2lwaGVyQWxnOjM7CisJCXUzMiA6IDE7CisJCXUzMiBCc3MxS2V5MUNpcGhlckFsZzozOworCQl1MzIgOiAxOworCQl1MzIgQnNzMUtleTJDaXBoZXJBbGc6MzsKKwkJdTMyIDogMTsKKwkJdTMyIEJzczFLZXkzQ2lwaGVyQWxnOjM7CisJCXUzMiA6IDE7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gU0hBUkVES0VZX01PREVfU1RSVUMsICpQU0hBUkVES0VZX01PREVfU1RSVUM7CisKKy8qIDgtYnl0ZSBwZXIgZW50cnksIDY0LWVudHJ5IGZvciBwYWlyd2lzZSBrZXkgdGFibGUgKi8KK3N0cnVjdCBydF9od193Y2lkX2VudHJ5IHsKKwl1OCBBZGRyZXNzWzZdOworCXU4IFJzdlsyXTsKK307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogV0NJRCAgZm9ybWF0ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qNy4xICAgV0NJRCAgRU5UUlkgIGZvcm1hdCAgOiA4Ynl0ZXMgKi8KK3N0cnVjdCBydF93Y2lkX2VudHJ5IHsKKwl1OCBSWEJBQml0bWFwNzsJLyogYml0MCBmb3IgVElEOCwgYml0NyBmb3IgVElEIDE1ICovCisJdTggUlhCQUJpdG1hcDA7CS8qIGJpdDAgZm9yIFRJRDAsIGJpdDcgZm9yIFRJRCA3ICovCisJdTggTUFDWzZdOwkJLyogMCBmb3Igc2hhcmVkIGtleSB0YWJsZS4gIDEgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZSAqLworfTsKKworLyo4LjEuMSBTRUNVUklUWSAgS0VZICBmb3JtYXQgIDogOERXICovCisvKiAzMi1ieXRlIHBlciBlbnRyeSwgdG90YWwgMTYtZW50cnkgZm9yIHNoYXJlZCBrZXkgdGFibGUsIDY0LWVudHJ5IGZvciBwYWlyd2lzZSBrZXkgdGFibGUgKi8KK3N0cnVjdCBydF9od19rZXlfZW50cnkgeworCXU4IEtleVsxNl07CisJdTggVHhNaWNbOF07CisJdTggUnhNaWNbOF07Cit9OworCisvKjguMS4yIElWL0VJViAgZm9ybWF0ICA6IDJEVyAqLworCisvKjguMS4zIFJYIGF0dHJpYnV0ZSBlbnRyeSBmb3JtYXQgIDogMURXICovCitzdHJ1Y3QgcnRfbWFjX2F0dHJpYnV0ZSB7CisJdTMyIEtleVRhYjoxOwkvKiAwIGZvciBzaGFyZWQga2V5IHRhYmxlLiAgMSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlICovCisJdTMyIFBhaXJLZXlNb2RlOjM7CisJdTMyIEJTU0lESWR4OjM7CS8qbXVsdGlwbGVCU1MgaW5kZXggZm9yIHRoZSBXQ0lEICovCisJdTMyIFJYV0lVREY6MzsKKwl1MzIgcnN2OjIyOworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBIT1NULU1DVSBjb21tdW5pY2F0aW9uIGRhdGEgc3RydWN0dXJlICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogKi8KKy8qIEgyTV9NQUlMQk9YX0NTUjogSG9zdC10by1NQ1UgTWFpbGJveCAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX0gyTV9NQUlMQk9YX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgTG93Qnl0ZTo4OworCQl1MzIgSGlnaEJ5dGU6ODsKKwkJdTMyIENtZFRva2VuOjg7CisJCXUzMiBPd25lcjo4OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IEgyTV9NQUlMQk9YX1NUUlVDLCAqUEgyTV9NQUlMQk9YX1NUUlVDOworCisvKiAqLworLyogTTJIX0NNRF9ET05FX0NTUjogTUNVLXRvLUhvc3QgY29tbWFuZCBjb21wbGV0ZSBpbmRpY2F0aW9uICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfTTJIX0NNRF9ET05FX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgQ21kVG9rZW4wOworCQl1MzIgQ21kVG9rZW4xOworCQl1MzIgQ21kVG9rZW4yOworCQl1MzIgQ21kVG9rZW4zOworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IE0ySF9DTURfRE9ORV9TVFJVQywgKlBNMkhfQ01EX0RPTkVfU1RSVUM7CisKKy8qTkFWX1RJTUVfQ0ZHIDpOQVYgKi8KK3R5cGVkZWYgdW5pb24gX05BVl9USU1FX0NGR19TVFJVQyB7CisJc3RydWN0IHsKKwkJdTggU2lmczsJLyogaW4gdW5pdCBvZiAxLXVzICovCisJCXU4IFNsb3RUaW1lOwkvKiBpbiB1bml0IG9mIDEtdXMgKi8KKwkJdTE2IEVpZnM6OTsJLyogaW4gdW5pdCBvZiAxLXVzICovCisJCXUxNiBaZXJvU2lmczoxOwkvKiBBcHBsaWVkIHplcm8gU0lGUyB0aW1lciBhZnRlciBPRkRNIFJYIDA6IGRpc2FibGUgKi8KKwkJdTE2IHJzdjo2OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IE5BVl9USU1FX0NGR19TVFJVQywgKlBOQVZfVElNRV9DRkdfU1RSVUM7CisKKy8qICovCisvKiBSWF9GSUxUUl9DRkc6ICAvUlggY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX1JYX0ZJTFRSX0NGR19TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIERyb3BDUkNFcnI6MTsJLyogRHJvcCBDUkMgZXJyb3IgKi8KKwkJdTMyIERyb3BQaHlFcnI6MTsJLyogRHJvcCBwaHlzaWNhbCBlcnJvciAqLworCQl1MzIgRHJvcE5vdFRvTWU6MTsJLyogRHJvcCBub3QgdG8gbWUgdW5pY2FzdCBmcmFtZSAqLworCQl1MzIgRHJvcE5vdE15QlNTSUQ6MTsJLyogRHJvcCBmcmFtIFRvRHMgYml0IGlzIHRydWUgKi8KKworCQl1MzIgRHJvcFZlckVycjoxOwkvKiBEcm9wIHZlcnNpb24gZXJyb3IgZnJhbWUgKi8KKwkJdTMyIERyb3BNY2FzdDoxOwkvKiBEcm9wIG11bHRpY2FzdCBmcmFtZXMgKi8KKwkJdTMyIERyb3BCY2FzdDoxOwkvKiBEcm9wIGJyb2FkY2FzdCBmcmFtZXMgKi8KKwkJdTMyIERyb3BEdXBsaWNhdGU6MTsJLyogRHJvcCBkdXBsaWNhdGUgZnJhbWUgKi8KKworCQl1MzIgRHJvcENGRW5kQWNrOjE7CS8qIERyb3AgUHMtUG9sbCAqLworCQl1MzIgRHJvcENGRW5kOjE7CS8qIERyb3AgUHMtUG9sbCAqLworCQl1MzIgRHJvcEFjazoxOwkvKiBEcm9wIFBzLVBvbGwgKi8KKwkJdTMyIERyb3BDdHM6MTsJLyogRHJvcCBQcy1Qb2xsICovCisKKwkJdTMyIERyb3BSdHM6MTsJLyogRHJvcCBQcy1Qb2xsICovCisJCXUzMiBEcm9wUHNQb2xsOjE7CS8qIERyb3AgUHMtUG9sbCAqLworCQl1MzIgRHJvcEJBOjE7CS8qICovCisJCXUzMiBEcm9wQkFSOjE7CS8qICovCisKKwkJdTMyIERyb3BSc3ZDbnRsVHlwZToxOworCQl1MzIgOiAxNTsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBSWF9GSUxUUl9DRkdfU1RSVUMsICpQUlhfRklMVFJfQ0ZHX1NUUlVDOworCisvKiAqLworLyogUEhZX0NTUjQ6IFJGIHNlcmlhbCBjb250cm9sIHJlZ2lzdGVyICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfUEhZX0NTUjRfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBSRlJlZ1ZhbHVlOjI0OwkvKiBSZWdpc3RlciAgICAgdmFsdWUgKGluY2x1ZGUgcmVnaXN0ZXIgaWQpICAgICBzZXJpYWwgb3V0IHRvIFJGL0lGICAgICBjaGlwLiAqLworCQl1MzIgTnVtYmVyT2ZCaXRzOjU7CS8qIE51bWJlciBvZiBiaXRzIHVzZWQgaW4gUkZSZWdWYWx1ZSAoSToyMCwgICAgIFJGTUQ6MjIpICovCisJCXUzMiBJRlNlbGVjdDoxOwkvKiAxOiBzZWxlY3QgSUYgdG8gcHJvZ3JhbSwgICAgIDA6IHNlbGVjdCBSRiB0byBwcm9ncmFtICovCisJCXUzMiBQTExfTEQ6MTsJLyogUkYgUExMX0xEIHN0YXR1cyAqLworCQl1MzIgQnVzeToxOwkvKiAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBSRiBwcm9ncmFtbWluZy4gKi8KKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBQSFlfQ1NSNF9TVFJVQywgKlBQSFlfQ1NSNF9TVFJVQzsKKworLyogKi8KKy8qIFNFQ19DU1I1OiBzaGFyZWQga2V5IHRhYmxlIHNlY3VyaXR5IG1vZGUgcmVnaXN0ZXIgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9TRUNfQ1NSNV9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIEJzczJLZXkwQ2lwaGVyQWxnOjM7CisJCXUzMiA6IDE7CisJCXUzMiBCc3MyS2V5MUNpcGhlckFsZzozOworCQl1MzIgOiAxOworCQl1MzIgQnNzMktleTJDaXBoZXJBbGc6MzsKKwkJdTMyIDogMTsKKwkJdTMyIEJzczJLZXkzQ2lwaGVyQWxnOjM7CisJCXUzMiA6IDE7CisJCXUzMiBCc3MzS2V5MENpcGhlckFsZzozOworCQl1MzIgOiAxOworCQl1MzIgQnNzM0tleTFDaXBoZXJBbGc6MzsKKwkJdTMyIDogMTsKKwkJdTMyIEJzczNLZXkyQ2lwaGVyQWxnOjM7CisJCXUzMiA6IDE7CisJCXUzMiBCc3MzS2V5M0NpcGhlckFsZzozOworCQl1MzIgOiAxOworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFNFQ19DU1I1X1NUUlVDLCAqUFNFQ19DU1I1X1NUUlVDOworCisvKiAqLworLyogSE9TVF9DTURfQ1NSOiBGb3IgSE9TVCB0byBpbnRlcnJ1cHQgZW1iZWRkZWQgcHJvY2Vzc29yICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfSE9TVF9DTURfQ1NSX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgSG9zdENvbW1hbmQ6ODsKKwkJdTMyIFJzdjoyNDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBIT1NUX0NNRF9DU1JfU1RSVUMsICpQSE9TVF9DTURfQ1NSX1NUUlVDOworCisvKiAqLworLyogQUlGU05fQ1NSOiBBSUZTTiBmb3IgZWFjaCBFRENBIEFDICovCisvKiAqLworCisvKiAqLworLyogRTJQUk9NX0NTUjogRUVQUk9NIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9FMlBST01fQ1NSX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgUmVsb2FkOjE7CS8qIFJlbG9hZCBFRVBST00gY29udGVudCwgd3JpdGUgb25lIHRvIHJlbG9hZCwgc2VsZi1jbGVhcmVkLiAqLworCQl1MzIgRWVwcm9tU0s6MTsKKwkJdTMyIEVlcHJvbUNTOjE7CisJCXUzMiBFZXByb21ESToxOworCQl1MzIgRWVwcm9tRE86MTsKKwkJdTMyIFR5cGU6MTsJLyogMTogOTNDNDYsIDA6OTNDNjYgKi8KKwkJdTMyIExvYWRTdGF0dXM6MTsJLyogMTpsb2FkaW5nLCAwOmRvbmUgKi8KKwkJdTMyIFJzdmQ6MjU7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gRTJQUk9NX0NTUl9TVFJVQywgKlBFMlBST01fQ1NSX1NUUlVDOworCisvKiAqLworLyogUU9TX0NTUjA6IFRYT1AgaG9sZGVyIGFkZHJlc3MwIHJlZ2lzdGVyICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfUU9TX0NTUjBfU1RSVUMgeworCXN0cnVjdCB7CisJCXU4IEJ5dGUwOwkvKiBNQUMgYWRkcmVzcyBieXRlIDAgKi8KKwkJdTggQnl0ZTE7CS8qIE1BQyBhZGRyZXNzIGJ5dGUgMSAqLworCQl1OCBCeXRlMjsJLyogTUFDIGFkZHJlc3MgYnl0ZSAyICovCisJCXU4IEJ5dGUzOwkvKiBNQUMgYWRkcmVzcyBieXRlIDMgKi8KKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBRT1NfQ1NSMF9TVFJVQywgKlBRT1NfQ1NSMF9TVFJVQzsKKworLyogKi8KKy8qIFFPU19DU1IxOiBUWE9QIGhvbGRlciBhZGRyZXNzMSByZWdpc3RlciAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX1FPU19DU1IxX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1OCBCeXRlNDsJLyogTUFDIGFkZHJlc3MgYnl0ZSA0ICovCisJCXU4IEJ5dGU1OwkvKiBNQUMgYWRkcmVzcyBieXRlIDUgKi8KKwkJdTggUnN2ZDA7CisJCXU4IFJzdmQxOworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFFPU19DU1IxX1NUUlVDLCAqUFFPU19DU1IxX1NUUlVDOworCisjZGVmaW5lCVJGX0NTUl9DRkcJMHg1MDAKK3R5cGVkZWYgdW5pb24gX1JGX0NTUl9DRkdfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBSRl9DU1JfREFUQTo4OwkvKiBEQVRBICovCisJCXUzMiBURVNUQ1NSX1JGQUNDX1JFR05VTTo1OwkvKiBSRiByZWdpc3RlciBJRCAqLworCQl1MzIgUnN2ZDI6MzsJLyogUmVzZXJ2ZWQgKi8KKwkJdTMyIFJGX0NTUl9XUjoxOwkvKiAwOiByZWFkICAxOiB3cml0ZSAqLworCQl1MzIgUkZfQ1NSX0tJQ0s6MTsJLyoga2ljayBSRiByZWdpc3RlciByZWFkL3dyaXRlICovCisJCXUzMiBSc3ZkMToxNDsJLyogUmVzZXJ2ZWQgKi8KKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBSRl9DU1JfQ0ZHX1NUUlVDLCAqUFJGX0NTUl9DRkdfU1RSVUM7CisKKy8qICovCisvKiBPdGhlciBvbi1jaGlwIHNoYXJlZCBtZW1vcnkgc3BhY2UsIGJhc2UgPSAweDIwMDAgKi8KKy8qICovCisKKy8qIENJUyBzcGFjZSAtIGJhc2UgYWRkcmVzcyA9IDB4MjAwMCAqLworI2RlZmluZSBIV19DSVNfQkFTRSAgICAgICAgICAgICAweDIwMDAKKworLyogQ2Fycmllci1zZW5zZSBDVFMgZnJhbWUgYmFzZSBhZGRyZXNzLiBJdCdzIHdoZXJlIG1hYyBzdG9yZXMgY2Fycmllci1zZW5zZSBmcmFtZSBmb3IgY2Fycmllci1zZW5zZSBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSFdfQ1NfQ1RTX0JBU0UJCQkweDc3MDAKKy8qIERGUyBDVFMgZnJhbWUgYmFzZSBhZGRyZXNzLiBJdCdzIHdoZXJlIG1hYyBzdG9yZXMgQ1RTIGZyYW1lIGZvciBERlMuICovCisjZGVmaW5lIEhXX0RGU19DVFNfQkFTRQkJCTB4Nzc4MAorI2RlZmluZSBIV19DVFNfRlJBTUVfU0laRQkJMHg4MAorCisvKiAyMDA0LTExLTA4IGpvaG4gLSBzaW5jZSBOVUxMIGZyYW1lIHdvbid0IGJlIHRoYXQgbG9uZyAoMjU2IGJ5dGUpLiBXZSBzdGVhbCAxNiB0YWlsIGJ5dGVzICovCisvKiB0byBzYXZlIGRlYnVnZ2luZyBzZXR0aW5ncyAqLworI2RlZmluZSBIV19ERUJVR19TRVRUSU5HX0JBU0UgICAweDc3ZjAJLyogMHg3N2YwfjB4NzdmZiB0b3RhbCAxNiBieXRlcyAqLworI2RlZmluZSBIV19ERUJVR19TRVRUSU5HX0JBU0UyICAgMHg3NzcwCS8qIDB4NzdmMH4weDc3ZmYgdG90YWwgMTYgYnl0ZXMgKi8KKworLyogSW4gb3JkZXIgdG8gc3VwcG9ydCBtYXhpbXVtIDggTUJTUyBhbmQgaXRzIG1heGltdW0gbGVuZ3RoIGlzIDUxMiBmb3IgZWFjaCBiZWFjb24gKi8KKy8qIFRocmVlIHNlY3Rpb24gZGlzY29udGludWUgbWVtb3J5IHNlZ21lbnRzIHdpbGwgYmUgdXNlZC4gKi8KKy8qIDEuIFRoZSBvcmlnaW5hbCByZWdpb24gZm9yIEJDTiAwfjMgKi8KKy8qIDIuIEV4dHJhY3QgbWVtb3J5IGZyb20gRkNFIHRhYmxlIGZvciBCQ04gNH41ICovCisvKiAzLiBFeHRyYWN0IG1lbW9yeSBmcm9tIFBhaXItd2lzZSBrZXkgdGFibGUgZm9yIEJDTiA2fjcgKi8KKy8qICAgICAgICBJdCBvY2N1cGllZCB0aG9zZSBtZW1vcnkgb2Ygd2NpZCAyMzh+MjUzIGZvciBCQ04gNiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHdjaWQgMjIyfjIzNyBmb3IgQkNOIDcgKi8KKyNkZWZpbmUgSFdfQkVBQ09OX01BWF9TSVpFICAgICAgMHgxMDAwCS8qIHVuaXQ6IGJ5dGUgKi8KKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0UwICAgICAgICAgMHg3ODAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMSAgICAgICAgIDB4N0EwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTIgICAgICAgICAweDdDMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0UzICAgICAgICAgMHg3RTAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFNCAgICAgICAgIDB4NzIwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTUgICAgICAgICAweDc0MDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U2ICAgICAgICAgMHg1REMwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFNyAgICAgICAgIDB4NUJDMAorCisjZGVmaW5lIEhXX0JFQUNPTl9NQVhfQ09VTlQgICAgIDgKKyNkZWZpbmUgSFdfQkVBQ09OX09GRlNFVAkJMHgwMjAwCisjZGVmaW5lIEhXX0JFQUNPTl9DT05URU5UX0xFTgkoSFdfQkVBQ09OX09GRlNFVCAtIFRYV0lfU0laRSkKKworLyogSE9TVC1NQ1Ugc2hhcmVkIG1lbW9yeSAtIGJhc2UgYWRkcmVzcyA9IDB4MjEwMCAqLworI2RlZmluZSBIT1NUX0NNRF9DU1IJCTB4NDA0CisjZGVmaW5lIEgyTV9NQUlMQk9YX0NTUiAgICAgICAgIDB4NzAxMAorI2RlZmluZSBIMk1fTUFJTEJPWF9DSUQgICAgICAgICAweDcwMTQKKyNkZWZpbmUgSDJNX01BSUxCT1hfU1RBVFVTICAgICAgMHg3MDFjCisjZGVmaW5lIEgyTV9JTlRfU1JDICAgICAgICAgICAgIDB4NzAyNAorI2RlZmluZSBIMk1fQkJQX0FHRU5UICAgICAgICAgICAweDcwMjgKKyNkZWZpbmUgTTJIX0NNRF9ET05FX0NTUiAgICAgICAgMHgwMDBjCisjZGVmaW5lIE1DVV9UWE9QX0FSUkFZX0JBU0UgICAgIDB4MDAwYwkvKiBUT0RPOiB0byBiZSBwcm92aWRlZCBieSBBbGJlcnQgKi8KKyNkZWZpbmUgTUNVX1RYT1BfRU5UUllfU0laRSAgICAgMzIJLyogVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0ICovCisjZGVmaW5lIE1BWF9OVU1fT0ZfVFhPUF9FTlRSWSAgIDE2CS8qIFRPRE86IG11c3QgYmUgc2FtZSB3aXRoIDgwNTEgZmlybXdhcmUgKi8KKyNkZWZpbmUgTUNVX01CT1hfVkVSU0lPTiAgICAgICAgMHgwMQkvKiBUT0RPOiB0byBiZSBjb25maXJtZWQgYnkgQWxiZXJ0ICovCisjZGVmaW5lIE1DVV9NQk9YX1ZFUlNJT05fT0ZGU0VUIDUJLyogVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0ICovCisKKy8qICovCisvKiBIb3N0IERNQSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgyMDAgLiAgVFgwLTM9RURDQVFpZDAtMywgVFg0PUhDQ0EsIFRYNT1NR01ULCAqLworLyogKi8KKy8qICovCisvKiAgRE1BIFJJTkcgREVTQ1JJUFRPUiAqLworLyogKi8KKyNkZWZpbmUgRTJQUk9NX0NTUiAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgSU9fQ05UTF9DU1IgICAgICAgICAweDc3ZDAKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogVHggLyBSeCAvIE1nbXQgcmluZyBkZXNjcmlwdG9yIGRlZmluaXRpb24gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogdGhlIGZvbGxvd2luZyBQSUQgdmFsdWVzIGFyZSB1c2VkIHRvIG1hcmsgb3V0Z29pbmcgZnJhbWUgdHlwZSBpbiBUWEQtPlBJRCBzbyB0aGF0ICovCisvKiBwcm9wZXIgVFggc3RhdGlzdGljcyBjYW4gYmUgY29sbGVjdGVkIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMgKi8KKy8qIGIzLTIgb2YgUElEIGZpZWxkIC0gKi8KKyNkZWZpbmUgUElEX01HTVQJCQkweDA1CisjZGVmaW5lIFBJRF9CRUFDT04JCQkweDBjCisjZGVmaW5lIFBJRF9EQVRBX05PUk1BTFVDQVNUCQkweDAyCisjZGVmaW5lIFBJRF9EQVRBX0FNUERVCQkweDA0CisjZGVmaW5lIFBJRF9EQVRBX05PX0FDSwkJMHgwOAorI2RlZmluZSBQSURfREFUQV9OT1RfTk9STV9BQ0sJCTB4MDMKKy8qIHZhbHVlIGRvbWFpbiBvZiBwVHhELT5Ib3N0UUlkICg0LWJpdDogMH4xNSkgKi8KKyNkZWZpbmUgUUlEX0FDX0JLICAgICAgICAgICAgICAgMQkvKiBtZWV0IEFDSSBkZWZpbml0aW9uIGluIDgwMi4xMWUgKi8KKyNkZWZpbmUgUUlEX0FDX0JFICAgICAgICAgICAgICAgMAkvKiBtZWV0IEFDSSBkZWZpbml0aW9uIGluIDgwMi4xMWUgKi8KKyNkZWZpbmUgUUlEX0FDX1ZJICAgICAgICAgICAgICAgMgorI2RlZmluZSBRSURfQUNfVk8gICAgICAgICAgICAgICAzCisjZGVmaW5lIFFJRF9IQ0NBICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTlVNX09GX1RYX1JJTkcgICAgICAgICAgNAorI2RlZmluZSBRSURfTUdNVCAgICAgICAgICAgICAgICAxMworI2RlZmluZSBRSURfUlggICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBRSURfT1RIRVIgICAgICAgICAgICAgICAxNQorCisjZW5kaWYgLyogX19SVE1QX01BQ19IX18gLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydG1wX3BoeS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfcGh5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI4YjBmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydG1wX3BoeS5oCkBAIC0wLDAgKzEsNTU2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0bXBfcGh5LmgKKworCUFic3RyYWN0OgorCVJhbGluayBXaXJlbGVzcyBDaGlwIFBIWShCQlAvUkYpIHJlbGF0ZWQgZGVmaW5pdGlvbiAmIHN0cnVjdHVyZXMKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJICBXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19SVE1QX1BIWV9IX18KKyNkZWZpbmUgX19SVE1QX1BIWV9IX18KKworLyoKKwlSRiBzZWN0aW9ucworKi8KKyNkZWZpbmUgUkZfUjAwCQkJMAorI2RlZmluZSBSRl9SMDEJCQkxCisjZGVmaW5lIFJGX1IwMgkJCTIKKyNkZWZpbmUgUkZfUjAzCQkJMworI2RlZmluZSBSRl9SMDQJCQk0CisjZGVmaW5lIFJGX1IwNQkJCTUKKyNkZWZpbmUgUkZfUjA2CQkJNgorI2RlZmluZSBSRl9SMDcJCQk3CisjZGVmaW5lIFJGX1IwOAkJCTgKKyNkZWZpbmUgUkZfUjA5CQkJOQorI2RlZmluZSBSRl9SMTAJCQkxMAorI2RlZmluZSBSRl9SMTEJCQkxMQorI2RlZmluZSBSRl9SMTIJCQkxMgorI2RlZmluZSBSRl9SMTMJCQkxMworI2RlZmluZSBSRl9SMTQJCQkxNAorI2RlZmluZSBSRl9SMTUJCQkxNQorI2RlZmluZSBSRl9SMTYJCQkxNgorI2RlZmluZSBSRl9SMTcJCQkxNworI2RlZmluZSBSRl9SMTgJCQkxOAorI2RlZmluZSBSRl9SMTkJCQkxOQorI2RlZmluZSBSRl9SMjAJCQkyMAorI2RlZmluZSBSRl9SMjEJCQkyMQorI2RlZmluZSBSRl9SMjIJCQkyMgorI2RlZmluZSBSRl9SMjMJCQkyMworI2RlZmluZSBSRl9SMjQJCQkyNAorI2RlZmluZSBSRl9SMjUJCQkyNQorI2RlZmluZSBSRl9SMjYJCQkyNgorI2RlZmluZSBSRl9SMjcJCQkyNworI2RlZmluZSBSRl9SMjgJCQkyOAorI2RlZmluZSBSRl9SMjkJCQkyOQorI2RlZmluZSBSRl9SMzAJCQkzMAorI2RlZmluZSBSRl9SMzEJCQkzMQorCisvKiB2YWx1ZSBkb21haW4gb2YgcEFkLT5SZkljVHlwZSAqLworI2RlZmluZSBSRklDXzI4MjAgICAgICAgICAgICAgICAgICAgMQkvKiAyLjRHIDJUM1IgKi8KKyNkZWZpbmUgUkZJQ18yODUwICAgICAgICAgICAgICAgICAgIDIJLyogMi40Ry81RyAyVDNSICovCisjZGVmaW5lIFJGSUNfMjcyMCAgICAgICAgICAgICAgICAgICAzCS8qIDIuNEcgMVQyUiAqLworI2RlZmluZSBSRklDXzI3NTAgICAgICAgICAgICAgICAgICAgNAkvKiAyLjRHLzVHIDFUMlIgKi8KKyNkZWZpbmUgUkZJQ18zMDIwICAgICAgICAgICAgICAgICAgIDUJLyogMi40RyAxVDFSICovCisjZGVmaW5lIFJGSUNfMjAyMCAgICAgICAgICAgICAgICAgICA2CS8qIDIuNEcgQi9HICovCisjZGVmaW5lIFJGSUNfMzAyMSAgICAgICAgICAgICAgICAgICA3CS8qIDIuNEcgMVQyUiAqLworI2RlZmluZSBSRklDXzMwMjIgICAgICAgICAgICAgICAgICAgOAkvKiAyLjRHIDJUMlIgKi8KKyNkZWZpbmUgUkZJQ18zMDUyICAgICAgICAgICAgICAgICAgIDkJLyogMi40Ry81RyAyVDJSICovCisKKy8qCisJQkJQIHNlY3Rpb25zCisqLworI2RlZmluZSBCQlBfUjAJCQkwCS8qIHZlcnNpb24gKi8KKyNkZWZpbmUgQkJQX1IxCQkJMQkvKiBUU1NJICovCisjZGVmaW5lIEJCUF9SMgkJCTIJLyogVFggY29uZmlndXJlICovCisjZGVmaW5lIEJCUF9SMwkJCTMKKyNkZWZpbmUgQkJQX1I0CQkJNAorI2RlZmluZSBCQlBfUjUJCQk1CisjZGVmaW5lIEJCUF9SNgkJCTYKKyNkZWZpbmUgQkJQX1IxNAkJCTE0CS8qIFJYIGNvbmZpZ3VyZSAqLworI2RlZmluZSBCQlBfUjE2CQkJMTYKKyNkZWZpbmUgQkJQX1IxNwkJCTE3CS8qIFJYIHNlbnNpYmlsaXR5ICovCisjZGVmaW5lIEJCUF9SMTgJCQkxOAorI2RlZmluZSBCQlBfUjIxCQkJMjEKKyNkZWZpbmUgQkJQX1IyMgkJCTIyCisjZGVmaW5lIEJCUF9SMjQJCQkyNAorI2RlZmluZSBCQlBfUjI1CQkJMjUKKyNkZWZpbmUgQkJQX1IyNgkJCTI2CisjZGVmaW5lIEJCUF9SMjcJCQkyNworI2RlZmluZSBCQlBfUjMxCQkJMzEKKyNkZWZpbmUgQkJQX1I0OQkJCTQ5CS8qVFNTSSAqLworI2RlZmluZSBCQlBfUjUwCQkJNTAKKyNkZWZpbmUgQkJQX1I1MQkJCTUxCisjZGVmaW5lIEJCUF9SNTIJCQk1MgorI2RlZmluZSBCQlBfUjU1CQkJNTUKKyNkZWZpbmUgQkJQX1I2MgkJCTYyCS8qIFJ4IFNRMCBUaHJlc2hvbGQgSElHSCAqLworI2RlZmluZSBCQlBfUjYzCQkJNjMKKyNkZWZpbmUgQkJQX1I2NAkJCTY0CisjZGVmaW5lIEJCUF9SNjUJCQk2NQorI2RlZmluZSBCQlBfUjY2CQkJNjYKKyNkZWZpbmUgQkJQX1I2NwkJCTY3CisjZGVmaW5lIEJCUF9SNjgJCQk2OAorI2RlZmluZSBCQlBfUjY5CQkJNjkKKyNkZWZpbmUgQkJQX1I3MAkJCTcwCS8qIFJ4IEFHQyBTUSBDQ0sgWGNvcnIgdGhyZXNob2xkICovCisjZGVmaW5lIEJCUF9SNzMJCQk3MworI2RlZmluZSBCQlBfUjc1CQkJNzUKKyNkZWZpbmUgQkJQX1I3NwkJCTc3CisjZGVmaW5lIEJCUF9SNzgJCQk3OAorI2RlZmluZSBCQlBfUjc5CQkJNzkKKyNkZWZpbmUgQkJQX1I4MAkJCTgwCisjZGVmaW5lIEJCUF9SODEJCQk4MQorI2RlZmluZSBCQlBfUjgyCQkJODIKKyNkZWZpbmUgQkJQX1I4MwkJCTgzCisjZGVmaW5lIEJCUF9SODQJCQk4NAorI2RlZmluZSBCQlBfUjg2CQkJODYKKyNkZWZpbmUgQkJQX1I5MQkJCTkxCisjZGVmaW5lIEJCUF9SOTIJCQk5MgorI2RlZmluZSBCQlBfUjk0CQkJOTQJLyogVHggR2FpbiBDb250cm9sICovCisjZGVmaW5lIEJCUF9SMTAzCQkxMDMKKyNkZWZpbmUgQkJQX1IxMDUJCTEwNQorI2RlZmluZSBCQlBfUjEwNgkJMTA2CisjZGVmaW5lIEJCUF9SMTEzCQkxMTMKKyNkZWZpbmUgQkJQX1IxMTQJCTExNAorI2RlZmluZSBCQlBfUjExNQkJMTE1CisjZGVmaW5lIEJCUF9SMTE2CQkxMTYKKyNkZWZpbmUgQkJQX1IxMTcJCTExNworI2RlZmluZSBCQlBfUjExOAkJMTE4CisjZGVmaW5lIEJCUF9SMTE5CQkxMTkKKyNkZWZpbmUgQkJQX1IxMjAJCTEyMAorI2RlZmluZSBCQlBfUjEyMQkJMTIxCisjZGVmaW5lIEJCUF9SMTIyCQkxMjIKKyNkZWZpbmUgQkJQX1IxMjMJCTEyMworI2lmZGVmIFJUMzB4eAorI2RlZmluZSBCQlBfUjEzOAkJMTM4CS8qIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwLCBBREMgZHluYW1pYyBvbi9vZmYgY29udHJvbCAqLworI2VuZGlmIC8qIFJUMzB4eCAvLyAqLworCisjZGVmaW5lIEJCUFI5NF9ERUZBVUxUCTB4MDYJLyogQWRkIDEgdmFsdWUgd2lsbCBnYWluIDFkYiAqLworCisvKiAqLworLyogQkJQICYgUkYgYXJlIHVzaW5nIGluZGlyZWN0IGFjY2Vzcy4gQmVmb3JlIHdyaXRlIGFueSB2YWx1ZSBpbnRvIGl0LiAqLworLyogV2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gb3V0c3RhbmRpbmcgY29tbWFuZCBwZW5kaW5nIHZpYSBjaGVja2luZyBidXN5IGJpdC4gKi8KKy8qICovCisjZGVmaW5lIE1BWF9CVVNZX0NPVU5UICAxMDAJLyogTnVtYmVyIG9mIHJldHJ5IGJlZm9yZSBmYWlsaW5nIGFjY2VzcyBCQlAgJiBSRiBpbmRpcmVjdCByZWdpc3RlciAqLworCisvKiNkZWZpbmUgUEhZX1RSX1NXSVRDSF9USU1FICAgICAgICAgIDUgIC8vIHVzZWMgKi8KKworLyojZGVmaW5lIEJCUF9SMTdfTE9XX1NFTlNJQklMSVRZICAgICAweDUwICovCisvKiNkZWZpbmUgQkJQX1IxN19NSURfU0VOU0lCSUxJVFkgICAgIDB4NDEgKi8KKy8qI2RlZmluZSBCQlBfUjE3X0RZTkFNSUNfVVBfQk9VTkQgICAgMHg0MCAqLworCisjZGVmaW5lIFJTU0lfRk9SX1ZFUllfTE9XX1NFTlNJQklMSVRZICAgLTM1CisjZGVmaW5lIFJTU0lfRk9SX0xPV19TRU5TSUJJTElUWQkJLTU4CisjZGVmaW5lIFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkJLTgwCisjZGVmaW5lIFJTU0lfRk9SX01JRF9TRU5TSUJJTElUWQkJLTkwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCVJGIHJlZ2lzdGVyIFJlYWQvV3JpdGUgbWFyY28gZGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFJUTVBfTUFDX1BDSQorI2RlZmluZSBSVE1QX1JGX0lPX1dSSVRFMzIoX0EsIF9WKSAgICAgICAgICAgICAgICAgIFwKK3sJCQkJCQkJCQkJCVwKKwlpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkJICAgICAgICAgICAgICAgIFwKKwl7CQkJCQkJCQkJCQkJXAorCQlQSFlfQ1NSNF9TVFJVQyAgX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQl1bnNpZ25lZCBsb25nICAgICAgICAgICBfYnVzeUNudCA9IDA7ICAgICAgICAgICAgICAgICAgICBcCisJCQkJCQkJCQkJCVwKKwkJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJUlRNUF9JT19SRUFEMzIoKF9BKSwgUkZfQ1NSX0NGRzAsICZfdmFsdWUud29yZCk7ICBcCisJCQlpZiAoX3ZhbHVlLmZpZWxkLkJ1c3kgPT0gSURMRSkgICAgICAgICAgICAgICBcCisJCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCV9idXN5Q250Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJfXdoaWxlIChfYnVzeUNudCA8IE1BWF9CVVNZX0NPVU5UKTsJCQlcCisJCWlmKF9idXN5Q250IDwgTUFYX0JVU1lfQ09VTlQpICAgICAgICAgICAgICAgICAgIFwKKwkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJUlRNUF9JT19XUklURTMyKChfQSksIFJGX0NTUl9DRkcwLCAoX1YpKTsgICAgICAgICAgXAorCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJfQkJCQkJCQkJXAorfQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorI2RlZmluZSBSVE1QX1JGX0lPX1dSSVRFMzIoX0EsIF9WKSAgICAgICAgICAgICAgICAgUlRVU0JXcml0ZVJGUmVnaXN0ZXIoX0EsIF9WKQorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisjaWZkZWYgUlQzMHh4CisjZGVmaW5lIFJUTVBfUkZfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKSAgICBSVDMweHhSZWFkUkZSZWdpc3RlcihfQSwgX0ksIF9wVikKKyNkZWZpbmUgUlRNUF9SRl9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpICAgIFJUMzB4eFdyaXRlUkZSZWdpc3RlcihfQSwgX0ksIF9WKQorI2VuZGlmIC8qIFJUMzB4eCAvLyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlCQlAgcmVnaXN0ZXIgUmVhZC9Xcml0ZSBtYXJjbyBkZWZpbml0aW9ucy4KKwl3ZSByZWFkL3dyaXRlIHRoZSBiYnAgdmFsdWUgYnkgcmVnaXN0ZXIncyBJRC4KKwlHZW5lcmF0ZSBQRVIgdG8gdGVzdCBCQQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFJUTVBfTUFDX1BDSQorLyoKKwliYXNpYyBtYXJjbyBmb3IgQkJQIHJlYWQgb3BlcmF0aW9uLgorCV9wQWQ6IHRoZSBkYXRhIHN0cnVjdHVyZSBwb2ludGVyIG9mIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIKKwlfYmJwSUQgOiB0aGUgYmJwIHJlZ2lzdGVyIElECisJX3BWOiBkYXRhIHBvaW50ZXIgdXNlZCB0byBzYXZlIHRoZSB2YWx1ZSBvZiBxdWVyaWVkIGJicCByZWdpc3Rlci4KKwlfYlZpYU1DVTogaWYgd2UgbmVlZCBhY2Nlc3MgdGhlIGJicCB2aWEgdGhlIE1DVS4KKyovCisjZGVmaW5lIFJUTVBfQkJQX0lPX1JFQUQ4KF9wQWQsIF9iYnBJRCwgX3BWLCBfYlZpYU1DVSkJCQlcCisJZG97CQkJCQkJCQkJCQkJCQkJXAorCQlCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOwkJCQkJCQkJXAorCQlpbnQgICBfYnVzeUNudCwgX3NlY0NudCwgX3JlZ0lEOwkJCQkJCVwKKwkJCQkJCQkJCQkJCQkJCQlcCisJCV9yZWdJRCA9ICgoX2JWaWFNQ1UpID09IFRSVUUgPyBIMk1fQkJQX0FHRU5UIDogQkJQX0NTUl9DRkcpOwlcCisJCWZvciAoX2J1c3lDbnQ9MDsgX2J1c3lDbnQ8TUFYX0JVU1lfQ09VTlQ7IF9idXN5Q250KyspICAgICAgXAorCQl7CQkJCQkJCQkJCQkJCVwKKwkJCVJUTVBfSU9fUkVBRDMyKF9wQWQsIF9yZWdJRCwgJkJicENzci53b3JkKTsJCVwKKwkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKKwkJCQljb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCUJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCUJicENzci5maWVsZC5mUmVhZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCUJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCUJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCUJicENzci5maWVsZC5SZWdOdW0gPSBfYmJwSUQ7ICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgX3JlZ0lELCBCYnBDc3Iud29yZCk7ICAgICBcCisJCQlpZiAoKF9iVmlhTUNVKSA9PSBUUlVFKQkJCQkJCQlcCisJCQl7CQkJCQkJCQkJCQkJCVwKKwkJCQlBc2ljU2VuZENvbW1hbmRUb01jdShfcEFkLCAweDgwLCAweGZmLCAweDAsIDB4MCk7IFwKKwkJCQlSVE1QdXNlY0RlbGF5KDEwMDApOwlcCisJCQl9CQkJCQkJCVwKKwkJCWZvciAoX3NlY0NudD0wOyBfc2VjQ250PE1BWF9CVVNZX0NPVU5UOyBfc2VjQ250KyspICAgICAgIFwKKwkJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQlSVE1QX0lPX1JFQUQzMihfcEFkLCBfcmVnSUQsICZCYnBDc3Iud29yZCk7IFwKKwkJCQlpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgICAgICAgICAgICAgIFwKKwkJCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCWlmICgoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgJiYgICAgICAgICAgICAgIFwKKwkJCQkoQmJwQ3NyLmZpZWxkLlJlZ051bSA9PSBfYmJwSUQpKSAgICAgICAgICAgICAgICBcCisJCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJKihfcFYpID0gKHU4KUJicENzci5maWVsZC5WYWx1ZTsgICAgICAgICBcCisJCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgICAgICBcCisJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlEQkdQUklOVF9FUlIoKCJCQlAodmlhTUNVPSVkKSByZWFkIFIlZCBmYWlsXG4iLCAoX2JWaWFNQ1UpLCBfYmJwSUQpKTsgICAgICBcCisJCQkqKF9wVikgPSAoX3BBZCktPkJicFdyaXRlTGF0Y2hbX2JicElEXTsgICAgICAgICAgICAgICBcCisJCQlpZiAoKF9iVmlhTUNVKSA9PSBUUlVFKQkJCQlcCisJCQl7CQkJCQkJCQkJXAorCQkJCVJUTVBfSU9fUkVBRDMyKF9wQWQsIF9yZWdJRCwgJkJicENzci53b3JkKTsJCQkJXAorCQkJCUJicENzci5maWVsZC5CdXN5ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgX3JlZ0lELCBCYnBDc3Iud29yZCk7CQkJCVwKKwkJCX0JCQkJXAorCQl9CQkJCQkJCQkJCQkJCVwKKwl9d2hpbGUoMCkKKworLyoKKwlUaGlzIG1hcmNvIHVzZWQgZm9yIHRoZSBCQlAgcmVhZCBvcGVyYXRpb24gd2hpY2ggZGlkbid0IG5lZWQgdmlhIE1DVS4KKyovCisjZGVmaW5lIEJCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpCQkJXAorCVJUTVBfQkJQX0lPX1JFQUQ4KChfQSksIChfSSksIChfcFYpLCBGQUxTRSkKKworLyoKKwlUaGlzIG1hcmNvIHVzZWQgZm9yIHRoZSBCQlAgcmVhZCBvcGVyYXRpb24gd2hpY2ggbmVlZCB2aWEgTUNVLgorCUJ1dCBmb3Igc29tZSBjaGlwc2V0IHdoaWNoIGRpZG4ndCBoYXZlIG1jdSAoZS5nLiwgUkJVUyBiYXNlZCBjaGlwc2V0KSwgd2UKKwl3aWxsIHVzZSB0aGlzIGZ1bmN0aW9uIHRvbyBhbmQgZGlkbid0IGFjY2VzcyB0aGUgYmJwIHJlZ2lzdGVyIHZpYSB0aGUgTUNVLgorKi8KKy8qIFJlYWQgQkJQIHJlZ2lzdGVyIGJ5IHJlZ2lzdGVyJ3MgSUQuIEdlbmVyYXRlIFBFUiB0byB0ZXN0IEJBICovCisjZGVmaW5lIFJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJXAorCUJCUF9DU1JfQ0ZHX1NUUlVDCUJicENzcjsJCQkJCQkJCQkJCVwKKwlpbnQJCQkJCWksIGs7CQkJXAorCUJPT0xFQU4JCQkJCWJyYzsJCQlcCisJQmJwQ3NyLmZpZWxkLkJ1c3kgPSBJRExFOwkJCVwKKwlpZiAoKElTX1JUMzA5MCgoX0EpKSB8fCBJU19SVDM1NzIoKF9BKSkgfHwgSVNfUlQzMzkwKChfQSkpKSAmJiAoKF9BKS0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykJXAorCQkmJiAoKF9BKS0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKQlcCisJCSYmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKQlcCisJCSYmICgoX0EpLT5icnQzMHh4QmFuTWN1Q21kID09IEZBTFNFKSkJXAorCXsJCQkJCQkJCQkJCQkJCQkJCVwKKwkJZm9yIChpPTA7IGk8TUFYX0JVU1lfQ09VTlQ7IGkrKykJCQkJCQkJCQlcCisJCXsJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCVJUTVBfSU9fUkVBRDMyKF9BLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwkJCQlcCisJCQlpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkJCQkJCQkJCQlcCisJCQl7CQkJCQkJCQkJCQkJCQkJCVwKKwkJCQljb250aW51ZTsJCQkJCQkJCQkJCQkJXAorCQkJfQkJCQkJCQkJCQkJCQkJCQlcCisJCQlCYnBDc3Iud29yZCA9IDA7CQkJCQkJCQkJCQkJXAorCQkJQmJwQ3NyLmZpZWxkLmZSZWFkID0gMTsJCQkJCQkJCQkJCVwKKwkJCUJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7CQkJCQkJCQkJXAorCQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOwkJCQkJCQkJCQkJXAorCQkJQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOwkJCQkJCQkJCQlcCisJCQlSVE1QX0lPX1dSSVRFMzIoX0EsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJCQkJXAorCQkJYnJjID0gQXNpY1NlbmRDb21tYW5kVG9NY3UoX0EsIDB4ODAsIDB4ZmYsIDB4MCwgMHgwKTsJCQkJCVwKKwkJCWlmIChicmMgPT0gVFJVRSkJCQkJCQkJCQkJCQkJCQkJXAorCQkJewkJCQkJCQkJCQkJCQkJCQlcCisJCQkJZm9yIChrPTA7IGs8TUFYX0JVU1lfQ09VTlQ7IGsrKykJCQkJCQkJCVwKKwkJCQl7CQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJUlRNUF9JT19SRUFEMzIoX0EsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CQkJXAorCQkJCQlpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkJCQkJCQkJCVwKKwkJCQkJCWJyZWFrOwkJCQkJCQkJCQkJCQlcCisJCQkJfQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAmJgkJCQkJCQkJXAorCQkJCQkoQmJwQ3NyLmZpZWxkLlJlZ051bSA9PSBfSSkpCQkJCQkJCQlcCisJCQkJewkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCSooX3BWKSA9ICh1OClCYnBDc3IuZmllbGQuVmFsdWU7CQkJCQkJCVwKKwkJCQkJYnJlYWs7CQkJCQkJCQkJCQkJCQlcCisJCQkJfQkJCQkJCQkJCQkJCQkJCQlcCisJCQl9CQkJCQkJCQkJCQkJCQkJCVwKKwkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJXAorCQkJewkJCQkJCQkJCQkJCQkJCQlcCisJCQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAwOwkJCQkJCQkJCQkJXAorCQkJCVJUTVBfSU9fV1JJVEUzMihfQSwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOwkJCQlcCisJCQl9CQkJCQkJCQkJCQkJCQkJCVwKKwkJfQkJCQkJCQkJCQkJCQkJCQkJXAorCX0JXAorCWVsc2UgaWYgKCEoKElTX1JUMzA5MCgoX0EpKSB8fCBJU19SVDM1NzIoKF9BKSkgfHwgSVNfUlQzMzkwKChfQSkpKSAmJiAoKF9BKS0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykJXAorCQkmJiAoKF9BKS0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkJXAorCQkmJiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkpCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQlcCisJCWZvciAoaT0wOyBpPE1BWF9CVVNZX0NPVU5UOyBpKyspCQkJCQkJCQkJXAorCQl7CQkJCQkJCQkJCQkJCQkJCQlcCisJCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQkJXAorCQkJaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpCQkJCQkJCQkJXAorCQkJewkJCQkJCQkJCQkJCQkJCQlcCisJCQkJY29udGludWU7CQkJCQkJCQkJCQkJCVwKKwkJCX0JCQkJCQkJCQkJCQkJCQkJXAorCQkJQmJwQ3NyLndvcmQgPSAwOwkJCQkJCQkJCQkJCVwKKwkJCUJicENzci5maWVsZC5mUmVhZCA9IDE7CQkJCQkJCQkJCQlcCisJCQlCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOwkJCQkJCQkJCVwKKwkJCUJicENzci5maWVsZC5CdXN5ID0gMTsJCQkJCQkJCQkJCVwKKwkJCUJicENzci5maWVsZC5SZWdOdW0gPSBfSTsJCQkJCQkJCQkJXAorCQkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KF9BLCAweDgwLCAweGZmLCAweDAsIDB4MCk7CQkJCQlcCisJCQlmb3IgKGs9MDsgazxNQVhfQlVTWV9DT1VOVDsgaysrKQkJCQkJCQkJXAorCQkJewkJCQkJCQkJCQkJCQkJCQlcCisJCQkJUlRNUF9JT19SRUFEMzIoX0EsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CQkJXAorCQkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKQkJCQkJCQkJXAorCQkJCQlicmVhazsJCQkJCQkJCQkJCQkJXAorCQkJfQkJCQkJCQkJCQkJCQkJCQlcCisJCQlpZiAoKEJicENzci5maWVsZC5CdXN5ID09IElETEUpICYmCQkJCQkJCQlcCisJCQkJKEJicENzci5maWVsZC5SZWdOdW0gPT0gX0kpKQkJCQkJCQkJXAorCQkJewkJCQkJCQkJCQkJCQkJCQlcCisJCQkJKihfcFYpID0gKHU4KUJicENzci5maWVsZC5WYWx1ZTsJCQkJCQkJXAorCQkJCWJyZWFrOwkJCQkJCQkJCQkJCQkJXAorCQkJfQkJCQkJCQkJCQkJCQkJCQlcCisJCX0JCQkJCQkJCQkJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJCQlcCisJZWxzZQkJCQkJCQkJCQlcCisJewkJCQkJCQkJCQkJCQkJCQkJXAorCQlEQkdQUklOVF9FUlIoKCIgLCBicnQzMHh4QmFuTWN1Q21kID0gJWQsIFJlYWQgQkJQICVkIFxuIiwgKF9BKS0+YnJ0MzB4eEJhbk1jdUNtZCwgKF9JKSkpOwlcCisJCSooX3BWKSA9IChfQSktPkJicFdyaXRlTGF0Y2hbX0ldOwkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQkJCQkJCVwKKwlpZiAoKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpIHx8ICgoX0EpLT5iUENJY2xrT2ZmID09IFRSVUUpKQkJCQkJCQkJCQlcCisJewkJCQkJCQkJCQkJCQkJCQkJXAorCQlEQkdQUklOVF9FUlIoKCJCQlAgcmVhZCBSJWQ9MHgleCBmYWlsXG4iLCBfSSwgQmJwQ3NyLndvcmQpKTsJXAorCQkqKF9wVikgPSAoX0EpLT5CYnBXcml0ZUxhdGNoW19JXTsJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJCQlcCit9CisKKy8qCisJYmFzaWMgbWFyY28gZm9yIEJCUCB3cml0ZSBvcGVyYXRpb24uCisJX3BBZDogdGhlIGRhdGEgc3RydWN0dXJlIHBvaW50ZXIgb2Ygc3RydWN0IHJ0X3J0bXBfYWRhcHRlcgorCV9iYnBJRCA6IHRoZSBiYnAgcmVnaXN0ZXIgSUQKKwlfcFY6IGRhdGEgdXNlZCB0byBzYXZlIHRoZSB2YWx1ZSBvZiBxdWVyaWVkIGJicCByZWdpc3Rlci4KKwlfYlZpYU1DVTogaWYgd2UgbmVlZCBhY2Nlc3MgdGhlIGJicCB2aWEgdGhlIE1DVS4KKyovCisjZGVmaW5lIFJUTVBfQkJQX0lPX1dSSVRFOChfcEFkLCBfYmJwSUQsIF9wViwgX2JWaWFNQ1UpCQkJXAorCWRvewkJCQkJCQkJCQkJCQkJCVwKKwkJQkJQX0NTUl9DRkdfU1RSVUMgIEJicENzcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaW50ICAgICAgICAgICAgIF9idXN5Q250LCBfcmVnSUQ7CQkJCQkJCVwKKwkJCQkJCQkJCQkJCQkJCQlcCisJCV9yZWdJRCA9ICgoX2JWaWFNQ1UpID09IFRSVUUgPyBIMk1fQkJQX0FHRU5UIDogQkJQX0NTUl9DRkcpOwlcCisJCWZvciAoX2J1c3lDbnQ9MDsgX2J1c3lDbnQ8TUFYX0JVU1lfQ09VTlQ7IF9idXN5Q250KyspICBcCisJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlSVE1QX0lPX1JFQUQzMigoX3BBZCksIEJCUF9DU1JfQ0ZHLCAmQmJwQ3NyLndvcmQpOyAgICAgXAorCQkJaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgXAorCQkJCWNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJQmJwQ3NyLndvcmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJQmJwQ3NyLmZpZWxkLmZSZWFkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJQmJwQ3NyLmZpZWxkLlZhbHVlID0gX3BWOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCUJicENzci5maWVsZC5SZWdOdW0gPSBfYmJwSUQ7ICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlSVE1QX0lPX1dSSVRFMzIoKF9wQWQpLCBCQlBfQ1NSX0NGRywgQmJwQ3NyLndvcmQpOyAgICAgXAorCQkJaWYgKChfYlZpYU1DVSkgPT0gVFJVRSkJCQkJCQkJCQlcCisJCQl7CQkJCQkJCQkJCQkJCQlcCisJCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UoX3BBZCwgMHg4MCwgMHhmZiwgMHgwLCAweDApOwkJXAorCQkJCWlmICgoX3BBZCktPk9wTW9kZSA9PSBPUE1PREVfQVApCQkJCQkJXAorCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDApOwkJCQkJCQlcCisJCQl9CQkJCQkJCQkJCQkJCQlcCisJCQkoX3BBZCktPkJicFdyaXRlTGF0Y2hbX2JicElEXSA9IF9wVjsJCQkJCVwKKwkJCWJyZWFrOwkJCQkJCQkJCQkJCQlcCisJCX0JCQkJCQkJCQkJCQkJCVwKKwkJaWYgKF9idXN5Q250ID09IE1BWF9CVVNZX0NPVU5UKQkJCQkJCQkJXAorCQl7CQkJCQkJCQkJCQkJCQlcCisJCQlEQkdQUklOVF9FUlIoKCJCQlAgd3JpdGUgUiVkIGZhaWxcbiIsIF9iYnBJRCkpOwkJCQlcCisJCQlpZigoX2JWaWFNQ1UpID09IFRSVUUpCQkJCQkJCQkJXAorCQkJewkJCQkJCQkJCQkJCQkJXAorCQkJCVJUTVBfSU9fUkVBRDMyKF9wQWQsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CVwKKwkJCQlCYnBDc3IuZmllbGQuQnVzeSA9IDA7CQkJCQkJCQkJXAorCQkJCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CVwKKwkJCX0JCQkJCQkJCQkJCQkJCVwKKwkJfQkJCQkJCQkJCQkJCQkJXAorCX13aGlsZSgwKQorCisvKgorCVRoaXMgbWFyY28gdXNlZCBmb3IgdGhlIEJCUCB3cml0ZSBvcGVyYXRpb24gd2hpY2ggZGlkbid0IG5lZWQgdmlhIE1DVS4KKyovCisjZGVmaW5lIEJCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX3BWKQkJCVwKKwlSVE1QX0JCUF9JT19XUklURTgoKF9BKSwgKF9JKSwgKF9wViksIEZBTFNFKQorCisvKgorCVRoaXMgbWFyY28gdXNlZCBmb3IgdGhlIEJCUCB3cml0ZSBvcGVyYXRpb24gd2hpY2ggbmVlZCB2aWEgTUNVLgorCUJ1dCBmb3Igc29tZSBjaGlwc2V0IHdoaWNoIGRpZG4ndCBoYXZlIG1jdSAoZS5nLiwgUkJVUyBiYXNlZCBjaGlwc2V0KSwgd2UKKwl3aWxsIHVzZSB0aGlzIGZ1bmN0aW9uIHRvbyBhbmQgZGlkbid0IGFjY2VzcyB0aGUgYmJwIHJlZ2lzdGVyIHZpYSB0aGUgTUNVLgorKi8KKy8qIFdyaXRlIEJCUCByZWdpc3RlciBieSByZWdpc3RlcidzIElEICYgdmFsdWUgKi8KKyNkZWZpbmUgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9WKQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQlcCisJQkJQX0NTUl9DRkdfU1RSVUMJQmJwQ3NyOwkJCQkJCQkJCQkJXAorCWludAkJCQkJQnVzeUNudCA9IDA7CQkJCQkJCQkJCVwKKwlCT09MRUFOCQkJCQlicmM7CQkJXAorCWlmIChfSSA8IE1BWF9OVU1fT0ZfQkJQX0xBVENIKQkJCQkJCQkJCQlcCisJewkJCQkJCQkJCQkJCQkJCQkJXAorCQlpZiAoKElTX1JUMzA5MCgoX0EpKSB8fCBJU19SVDM1NzIoKF9BKSkgfHwgSVNfUlQzMzkwKChfQSkpKSAmJiAoKF9BKS0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykJXAorCQkJJiYgKChfQSktPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkJXAorCQkJJiYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpCVwKKwkJCSYmICgoX0EpLT5icnQzMHh4QmFuTWN1Q21kID09IEZBTFNFKSkJXAorCQl7CQkJCQkJCQkJCQkJCQkJCQlcCisJCQlpZiAoX0EtPkFjY2Vzc0JCUEZhaWxDb3VudCA+IDIwKQkJCQkJCQkJCVwKKwkJCXsJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlBc2ljUmVzZXRCQlBBZ2VudChfQSk7CQkJCVwKKwkJCQlfQS0+QWNjZXNzQkJQRmFpbENvdW50ID0gMDsJCQkJCQkJCQkJCVwKKwkJCX0JCQkJCQkJCQkJCQkJCQkJCVwKKwkJCWZvciAoQnVzeUNudD0wOyBCdXN5Q250PE1BWF9CVVNZX0NPVU5UOyBCdXN5Q250KyspCQkJCQlcCisJCQl7CQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJUlRNUF9JT19SRUFEMzIoX0EsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CQkJCVwKKwkJCQlpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkJCQkJCQkJCQlcCisJCQkJCWNvbnRpbnVlOwkJCQkJCQkJCQkJCQlcCisJCQkJQmJwQ3NyLndvcmQgPSAwOwkJCQkJCQkJCQkJCVwKKwkJCQlCYnBDc3IuZmllbGQuZlJlYWQgPSAwOwkJCQkJCQkJCQkJXAorCQkJCUJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7CQkJCQkJCQkJXAorCQkJCUJicENzci5maWVsZC5CdXN5ID0gMTsJCQkJCQkJCQkJCVwKKwkJCQlCYnBDc3IuZmllbGQuVmFsdWUgPSBfVjsJCQkJCQkJCQkJXAorCQkJCUJicENzci5maWVsZC5SZWdOdW0gPSBfSTsJCQkJCQkJCQkJXAorCQkJCVJUTVBfSU9fV1JJVEUzMihfQSwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOwkJCQlcCisJCQkJYnJjID0gQXNpY1NlbmRDb21tYW5kVG9NY3UoX0EsIDB4ODAsIDB4ZmYsIDB4MCwgMHgwKTsJCQkJCVwKKwkJCQlpZiAoYnJjID09IFRSVUUpCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQl7CQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV0gPSBfVjsJCQkJCQkJCQlcCisJCQkJfQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJewkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCUJicENzci5maWVsZC5CdXN5ID0gMDsJCQkJCQkJCQkJCVwKKwkJCQkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKKwkJCQl9CQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlicmVhazsJCQkJCQkJCQkJCQkJCQlcCisJCQl9CQkJCQkJCQkJCQkJCQkJCQlcCisJCX0JCQkJCQkJCQkJCQkJCQkJCVwKKwkJZWxzZSBpZiAoISgoSVNfUlQzMDkwKChfQSkpIHx8IElTX1JUMzU3MigoX0EpKSB8fCBJU19SVDMzOTAoKF9BKSkpICYmICgoX0EpLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQlcCisJCQkmJiAoKF9BKS0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkJXAorCQkJJiYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpKQlcCisJCXsJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCWlmIChfQS0+QWNjZXNzQkJQRmFpbENvdW50ID4gMjApCQkJCQkJCQkJXAorCQkJewkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCUFzaWNSZXNldEJCUEFnZW50KF9BKTsJCQkJXAorCQkJCV9BLT5BY2Nlc3NCQlBGYWlsQ291bnQgPSAwOwkJCQkJCQkJCQkJXAorCQkJfQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJZm9yIChCdXN5Q250PTA7IEJ1c3lDbnQ8TUFYX0JVU1lfQ09VTlQ7IEJ1c3lDbnQrKykJCQkJCVwKKwkJCXsJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQkJXAorCQkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKQkJCQkJCQkJCVwKKwkJCQkJY29udGludWU7CQkJCQkJCQkJCQkJCVwKKwkJCQlCYnBDc3Iud29yZCA9IDA7CQkJCQkJCQkJCQkJXAorCQkJCUJicENzci5maWVsZC5mUmVhZCA9IDA7CQkJCQkJCQkJCQlcCisJCQkJQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsJCQkJCQkJCQlcCisJCQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOwkJCQkJCQkJCQkJXAorCQkJCUJicENzci5maWVsZC5WYWx1ZSA9IF9WOwkJCQkJCQkJCQlcCisJCQkJQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOwkJCQkJCQkJCQlcCisJCQkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKKwkJCQlBc2ljU2VuZENvbW1hbmRUb01jdShfQSwgMHg4MCwgMHhmZiwgMHgwLCAweDApOwkJCQkJXAorCQkJCShfQSktPkJicFdyaXRlTGF0Y2hbX0ldID0gX1Y7CQkJCQkJCQkJXAorCQkJCWJyZWFrOwkJCQkJCQkJCQkJCQkJCVwKKwkJCX0JCQkJCQkJCQkJCQkJCQkJCVwKKwkJfQkJCQkJCQkJCQkJCQkJCQkJXAorCQllbHNlCQkJCQkJCQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJCQkJXAorCQkJREJHUFJJTlRfRVJSKCgiICBicnQzMHh4QmFuTWN1Q21kID0gJWQuIFdyaXRlIEJCUCAlZCBcbiIsICAoX0EpLT5icnQzMHh4QmFuTWN1Q21kLCAoX0kpKSk7CVwKKwkJfQkJCQkJCQkJCQkJCQkJCQkJXAorCQlpZiAoKEJ1c3lDbnQgPT0gTUFYX0JVU1lfQ09VTlQpIHx8ICgoX0EpLT5iUENJY2xrT2ZmID09IFRSVUUpKQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJCQkJXAorCQkJaWYgKEJ1c3lDbnQgPT0gTUFYX0JVU1lfQ09VTlQpCQkJCQlcCisJCQkJKF9BKS0+QWNjZXNzQkJQRmFpbENvdW50Kys7CQkJCQlcCisJCQlEQkdQUklOVF9FUlIoKCJCQlAgd3JpdGUgUiVkPTB4JXggZmFpbC4gQnVzeUNudD0gJWQuYlBDSWNsa09mZiA9ICVkLiBcbiIsIF9JLCBCYnBDc3Iud29yZCwgQnVzeUNudCwgKF9BKS0+YlBDSWNsa09mZiApKTsJXAorCQl9CQkJCQkJCQkJCQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJCQkJCQkJCVwKKwllbHNlCQkJCQkJCQkJCQkJCQkJCQkJXAorCXsJCQkJCQkJCQkJCQkJCQkJCQlcCisJCURCR1BSSU5UX0VSUigoIioqKioqKiBCQlBfV3JpdGVfTGF0Y2ggQnVmZmVyIGV4Y2VlZHMgbWF4IGJvdW5kcnkgKioqKioqIFxuIikpOwlcCisJfQkJCQkJCQkJCQkJCQkJCQkJCVwKK30KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKworI2lmZGVmIFJUTVBfTUFDX1VTQgorI2RlZmluZSBSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgUlRVU0JSZWFkQkJQUmVnaXN0ZXIoX0EsIF9JLCBfcFYpCisjZGVmaW5lIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICBSVFVTQldyaXRlQkJQUmVnaXN0ZXIoX0EsIF9JLCBfVikKKworI2RlZmluZSBCQlBfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9WKQkJCVJUVVNCV3JpdGVCQlBSZWdpc3RlcihfQSwgX0ksIF9WKQorI2RlZmluZSBCQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKQkJUlRVU0JSZWFkQkJQUmVnaXN0ZXIoX0EsIF9JLCBfcFYpCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisKKyNpZmRlZiBSVDMweHgKKyNkZWZpbmUgUlRNUF9BU0lDX01NUFNfRElTQUJMRShfcEFkKQkJCQkJCQlcCisJZG97CQkJCQkJCQkJCQkJCQkJXAorCQl1MzIgX21hY0RhdGE7IFwKKwkJdTggX2JicERhdGEgPSAwOyBcCisJCS8qIGRpc2FibGUgTU1QUyBCQlAgY29udHJvbCByZWdpc3RlciAqLwkJCQkJCVwKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9wQWQsIEJCUF9SMywgJl9iYnBEYXRhKTsJXAorCQlfYmJwRGF0YSAmPSB+KDB4MDQpOwkvKmJpdCAyKi8JCQkJCQkJCVwKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChfcEFkLCBCQlBfUjMsIF9iYnBEYXRhKTsJXAorCQkJCQkJCQkJCQkJCQkJCVwKKwkJLyogZGlzYWJsZSBNTVBTIE1BQyBjb250cm9sIHJlZ2lzdGVyICovCQkJCQkJXAorCQlSVE1QX0lPX1JFQUQzMihfcEFkLCAweDEyMTAsICZfbWFjRGF0YSk7CQkJCVwKKwkJX21hY0RhdGEgJj0gfigweDA5KTsJLypiaXQgMCwgMyovCQkJCQkJCVwKKwkJUlRNUF9JT19XUklURTMyKF9wQWQsIDB4MTIxMCwgX21hY0RhdGEpOwkJCQlcCisJfXdoaWxlKDApCisKKyNkZWZpbmUgUlRNUF9BU0lDX01NUFNfRU5BQkxFKF9wQWQpCQkJCQkJCVwKKwlkb3sJCQkJCQkJCQkJCQkJCQlcCisJCXUzMiBfbWFjRGF0YTsgXAorCQl1OCBfYmJwRGF0YSA9IDA7IFwKKwkJLyogZW5hYmxlIE1NUFMgQkJQIGNvbnRyb2wgcmVnaXN0ZXIgKi8JCQkJCQlcCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfcEFkLCBCQlBfUjMsICZfYmJwRGF0YSk7CVwKKwkJX2JicERhdGEgfD0gKDB4MDQpOwkvKmJpdCAyKi8JCQkJCQkJCVwKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChfcEFkLCBCQlBfUjMsIF9iYnBEYXRhKTsJXAorCQkJCQkJCQkJCQkJCQkJCVwKKwkJLyogZW5hYmxlIE1NUFMgTUFDIGNvbnRyb2wgcmVnaXN0ZXIgKi8JCQkJCQlcCisJCVJUTVBfSU9fUkVBRDMyKF9wQWQsIDB4MTIxMCwgJl9tYWNEYXRhKTsJCQkJXAorCQlfbWFjRGF0YSB8PSAoMHgwOSk7CS8qYml0IDAsIDMqLwkJCQkJCQlcCisJCVJUTVBfSU9fV1JJVEUzMihfcEFkLCAweDEyMTAsIF9tYWNEYXRhKTsJCQkJXAorCX13aGlsZSgwKQorCisjZW5kaWYgLyogUlQzMHh4IC8vICovCisKKyNlbmRpZiAvKiBfX1JUTVBfUEhZX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwcy9ydDMwNzAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcHMvcnQzMDcwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3YmFkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcHMvcnQzMDcwLmMKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnQzMDcwLmMKKworCUFic3RyYWN0OgorCVNwZWNpZmljIGZ1bmNpdG9ucyBhbmQgdmFyaWFibGVzIGZvciBSVDMwNzAKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisJLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZkZWYgUlQzMDcwCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworI2lmbmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKKyNlcnJvciAiWW91IFNob3VsZCBFbmFibGUgY29tcGlsZSBmbGFnIFJUTVBfUkZfUldfU1VQUE9SVCBmb3IgdGhpcyBjaGlwIgorI2VuZGlmIC8qIFJUTVBfUkZfUldfU1VQUE9SVCAvLyAqLworCit2b2lkIE5JQ0luaXRSVDMwNzBSRlJlZ2lzdGVycyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJaW50IGk7CisJdTggUkZWYWx1ZTsKKworCS8qIERyaXZlciBtdXN0IHJlYWQgRUVQUk9NIHRvIGdldCBSZkljVHlwZSBiZWZvcmUgaW5pdGlhbCBSRiByZWdpc3RlcnMgKi8KKwkvKiBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUgKi8KKwlpZiAoSVNfUlQzMDcwKHBBZCkgfHwgSVNfUlQzMDcxKHBBZCkpIHsKKwkJLyogSW5pdCBSRiBjYWxpYnJhdGlvbiAqLworCQkvKiBEcml2ZXIgc2hvdWxkIHRvZ2dsZSBSRiBSMzAgYml0NyBiZWZvcmUgaW5pdCBSRiByZWdpc3RlcnMgKi8KKwkJdTMyIFJmUmVnID0gMDsKKwkJdTMyIGRhdGE7CisKKwkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMzAsICh1OCAqKSYgUmZSZWcpOworCQlSZlJlZyB8PSAweDgwOworCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzAsICh1OClSZlJlZyk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCVJmUmVnICY9IDB4N0Y7CisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKHU4KVJmUmVnKTsKKworCQkvKiBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUgKi8KKwkJZm9yIChpID0gMDsgaSA8IE5VTV9SRl9SRUdfUEFSTVM7IGkrKykgeworCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwKKwkJCQkJICAgICAgUlQzMHh4X1JGUmVnVGFibGVbaV0uUmVnaXN0ZXIsCisJCQkJCSAgICAgIFJUMzB4eF9SRlJlZ1RhYmxlW2ldLlZhbHVlKTsKKwkJfQorCisJCS8qIGFkZCBieSBqb2hubGkgKi8KKwkJaWYgKElTX1JUMzA3MChwQWQpKSB7CisJCQkvKiAqLworCQkJLyogVGhlIERBQyBpc3N1ZShMRE9fQ0ZHMCkgaGFzIGJlZW4gZml4ZWQgaW4gUlQzMDcwKEYpLiAqLworCQkJLyogVGhlIHZvbHRhZ2UgcmFpc2luZyBwYXRjaCBpcyBubyBsb25nZXIgbmVlZGVkIGZvciBSVDMwNzAoRikgKi8KKwkJCS8qICovCisJCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMDEpIHsKKwkJCQkvKiAgVXBkYXRlIE1BQyAweDA1RDQgZnJvbSAwMXh4eHh4eCB0byAwRHh4eHh4eCAodm9sdGFnZSAxLjJWIHRvIDEuMzVWKSBmb3IgUlQzMDcwIHRvIGltcHJvdmUgeWllbGQgcmF0ZSAqLworCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgTERPX0NGRzAsICZkYXRhKTsKKwkJCQlkYXRhID0gKChkYXRhICYgMHhGMEZGRkZGRikgfCAweDBEMDAwMDAwKTsKKwkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBMRE9fQ0ZHMCwgZGF0YSk7CisJCQl9CisJCX0gZWxzZSBpZiAoSVNfUlQzMDcxKHBBZCkpIHsKKwkJCS8qIERyaXZlciBzaG91bGQgc2V0IFJGIFI2IGJpdDYgb24gYmVmb3JlIGluaXQgUkYgcmVnaXN0ZXJzICovCisJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKHU4ICopJiBSZlJlZyk7CisJCQlSZlJlZyB8PSAweDQwOworCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA2LCAodTgpUmZSZWcpOworCisJCQkvKiBpbml0IFIzMSAqLworCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCAweDE0KTsKKworCQkJLyogUlQzMDcxIHZlcnNpb24gRSBoYXMgZml4ZWQgdGhpcyBpc3N1ZSAqLworCQkJaWYgKChwQWQtPk5pY0NvbmZpZzIuZmllbGQuREFDVGVzdEJpdCA9PSAxKQorCQkJICAgICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkpIHsKKwkJCQkvKiBwYXRjaCB0eCBFVk0gaXNzdWUgdGVtcG9yYXJpbHkgKi8KKwkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIExET19DRkcwLCAmZGF0YSk7CisJCQkJZGF0YSA9ICgoZGF0YSAmIDB4RTBGRkZGRkYpIHwgMHgwRDAwMDAwMCk7CisJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgTERPX0NGRzAsIGRhdGEpOworCQkJfSBlbHNlIHsKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIExET19DRkcwLCAmZGF0YSk7CisJCQkJZGF0YSA9ICgoZGF0YSAmIDB4RTBGRkZGRkYpIHwgMHgwMTAwMDAwMCk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTERPX0NGRzAsIGRhdGEpOworCQkJfQorCisJCQkvKiBwYXRjaCBMTkFfUEVfRzEgZmFpbGVkIGlzc3VlICovCisJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIEdQSU9fU1dJVENILCAmZGF0YSk7CisJCQlkYXRhICY9IH4oMHgyMCk7CisJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBHUElPX1NXSVRDSCwgZGF0YSk7CisJCX0KKwkJLypGb3IgUkYgZmlsdGVyIENhbGlicmF0aW9uICovCisJCVJUTVBGaWx0ZXJDYWxpYnJhdGlvbihwQWQpOworCisJCS8qIEluaXRpYWxpemUgUkYgUjI3IHJlZ2lzdGVyLCBzZXQgUkYgUjI3IG11c3QgYmUgYmVoaW5kIFJUTVBGaWx0ZXJDYWxpYnJhdGlvbigpICovCisJCS8qICovCisJCS8qIFRYIHRvIFJYIElRIGdsaXRjaChSRl9SMjcpIGhhcyBiZWVuIGZpeGVkIGluIFJUMzA3MChGKS4gKi8KKwkJLyogUmFpc2luZyBSRiB2b2x0YWdlIGlzIG5vIGxvbmdlciBuZWVkZWQgZm9yIFJUMzA3MChGKSAqLworCQkvKiAqLworCQlpZiAoKElTX1JUMzA3MChwQWQpKSAmJiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMDEpKSB7CisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIDB4Myk7CisJCX0gZWxzZSBpZiAoKElTX1JUMzA3MShwQWQpKQorCQkJICAgJiYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKSkgeworCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCAweDMpOworCQl9CisJCS8qIHNldCBsZWQgb3BlbiBkcmFpbiBlbmFibGUgKi8KKwkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBPUFRfMTQsICZkYXRhKTsKKwkJZGF0YSB8PSAweDAxOworCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBPUFRfMTQsIGRhdGEpOworCisJCS8qIG1vdmUgZnJvbSBSVDMweHhMb2FkUkZOb3JtYWxNb2RlU2V0dXAgYmVjYXVzZSBpdCdzIG5lZWRlZCBmb3IgYm90aCBSVDMwNzAgYW5kIFJUMzA3MSAqLworCQkvKiBUWF9MTzFfZW4sIFJGIFIxNyByZWdpc3RlciBCaXQgMyB0byAwICovCisJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjE3LCAmUkZWYWx1ZSk7CisJCVJGVmFsdWUgJj0gKH4weDA4KTsKKwkJLyogdG8gZml4IHJ4IGxvbmcgcmFuZ2UgaXNzdWUgKi8KKwkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcgPT0gMCkgeworCQkJaWYgKChJU19SVDMwNzEocEFkKQorCQkJICAgICAmJiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPj0gMHgwMjExKSkKKwkJCSAgICB8fCBJU19SVDMwNzAocEFkKSkgeworCQkJCVJGVmFsdWUgfD0gMHgyMDsKKwkJCX0KKwkJfQorCQkvKiBzZXQgUkZfUjE3X2JpdFsyOjBdIGVxdWFsIHRvIEVFUFJPTSBzZXR0aW5nIGF0IDB4NDhoICovCisJCWlmIChwQWQtPlR4TWl4ZXJHYWluMjRHID49IDEpIHsKKwkJCVJGVmFsdWUgJj0gKH4weDcpOwkvKiBjbGVhbiBiaXQgWzI6MF0gKi8KKwkJCVJGVmFsdWUgfD0gcEFkLT5UeE1peGVyR2FpbjI0RzsKKwkJfQorCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMTcsIFJGVmFsdWUpOworCisJCWlmIChJU19SVDMwNzEocEFkKSkgeworCQkJLyogYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAsIGxvYWQgUkYgbm9ybWFsIG9wZXJhdGlvbi1tb2RlIHNldHVwICovCisJCQlSVDMweHhMb2FkUkZOb3JtYWxNb2RlU2V0dXAocEFkKTsKKwkJfSBlbHNlIGlmIChJU19SVDMwNzAocEFkKSkgeworCQkJLyogYWRkIGJ5IGpvaG5saSwgcmVzZXQgUkZfUjI3IHdoZW4gaW50ZXJmYWNlIGRvd24gJiB1cCB0byBmaXggdGhyb3VnaHB1dCBwcm9ibGVtICovCisJCQkvKiBMRE9SRl9WQywgUkYgUjI3IHJlZ2lzdGVyIEJpdCAyIHRvIDAgKi8KKwkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCAmUkZWYWx1ZSk7CisJCQkvKiBUWCB0byBSWCBJUSBnbGl0Y2goUkZfUjI3KSBoYXMgYmVlbiBmaXhlZCBpbiBSVDMwNzAoRikuICovCisJCQkvKiBSYWlzaW5nIFJGIHZvbHRhZ2UgaXMgbm8gbG9uZ2VyIG5lZWRlZCBmb3IgUlQzMDcwKEYpICovCisJCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMDEpCisJCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSkgfCAweDM7CisJCQllbHNlCisJCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSk7CisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIFJGVmFsdWUpOworCQkJLyogZW5kIGpvaG5saSAqLworCQl9CisJfQorCit9CisjZW5kaWYgLyogUlQzMDcwIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXBzL3J0MzA5MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwcy9ydDMwOTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTI3YmE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwcy9ydDMwOTAuYwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydDMwOTAuYworCisJQWJzdHJhY3Q6CisJU3BlY2lmaWMgZnVuY2l0b25zIGFuZCB2YXJpYWJsZXMgZm9yIFJUMzA3MAorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZmRlZiBSVDMwOTAKKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisjaWZuZGVmIFJUTVBfUkZfUldfU1VQUE9SVAorI2Vycm9yICJZb3UgU2hvdWxkIEVuYWJsZSBjb21waWxlIGZsYWcgUlRNUF9SRl9SV19TVVBQT1JUIGZvciB0aGlzIGNoaXAiCisjZW5kaWYgLyogUlRNUF9SRl9SV19TVVBQT1JUIC8vICovCisKK3ZvaWQgTklDSW5pdFJUMzA5MFJGUmVnaXN0ZXJzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlpbnQgaTsKKwkvKiBEcml2ZXIgbXVzdCByZWFkIEVFUFJPTSB0byBnZXQgUmZJY1R5cGUgYmVmb3JlIGluaXRpYWwgUkYgcmVnaXN0ZXJzICovCisJLyogSW5pdGlhbGl6ZSBSRiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlICovCisJaWYgKElTX1JUMzA5MChwQWQpKSB7CisJCS8qIEluaXQgUkYgY2FsaWJyYXRpb24gKi8KKwkJLyogRHJpdmVyIHNob3VsZCB0b2dnbGUgUkYgUjMwIGJpdDcgYmVmb3JlIGluaXQgUkYgcmVnaXN0ZXJzICovCisJCXUzMiBSZlJlZyA9IDAsIGRhdGE7CisKKwkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMzAsICh1OCAqKSYgUmZSZWcpOworCQlSZlJlZyB8PSAweDgwOworCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzAsICh1OClSZlJlZyk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCVJmUmVnICY9IDB4N0Y7CisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKHU4KVJmUmVnKTsKKworCQkvKiBpbml0IFIyNCwgUjMxICovCisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgMHgwRik7CisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgMHgwRik7CisKKwkJLyogUlQzMDl4IHZlcnNpb24gRSBoYXMgZml4ZWQgdGhpcyBpc3N1ZSAqLworCQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5EQUNUZXN0Qml0ID09IDEpCisJCSAgICAmJiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpKSB7CisJCQkvKiBwYXRjaCB0eCBFVk0gaXNzdWUgdGVtcG9yYXJpbHkgKi8KKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTERPX0NGRzAsICZkYXRhKTsKKwkJCWRhdGEgPSAoKGRhdGEgJiAweEUwRkZGRkZGKSB8IDB4MEQwMDAwMDApOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTERPX0NGRzAsIGRhdGEpOworCQl9IGVsc2UgeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJmRhdGEpOworCQkJZGF0YSA9ICgoZGF0YSAmIDB4RTBGRkZGRkYpIHwgMHgwMTAwMDAwMCk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgZGF0YSk7CisJCX0KKworCQkvKiBwYXRjaCBMTkFfUEVfRzEgZmFpbGVkIGlzc3VlICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19TV0lUQ0gsICZkYXRhKTsKKwkJZGF0YSAmPSB+KDB4MjApOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBHUElPX1NXSVRDSCwgZGF0YSk7CisKKwkJLyogSW5pdGlhbGl6ZSBSRiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlICovCisJCWZvciAoaSA9IDA7IGkgPCBOVU1fUkZfUkVHX1BBUk1TOyBpKyspIHsKKwkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsCisJCQkJCSAgICAgIFJUMzB4eF9SRlJlZ1RhYmxlW2ldLlJlZ2lzdGVyLAorCQkJCQkgICAgICBSVDMweHhfUkZSZWdUYWJsZVtpXS5WYWx1ZSk7CisJCX0KKworCQkvKiBEcml2ZXIgc2hvdWxkIHNldCBSRiBSNiBiaXQ2IG9uIGJlZm9yZSBjYWxpYnJhdGlvbiAqLworCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKHU4ICopJiBSZlJlZyk7CisJCVJmUmVnIHw9IDB4NDA7CisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKHU4KVJmUmVnKTsKKworCQkvKkZvciBSRiBmaWx0ZXIgQ2FsaWJyYXRpb24gKi8KKwkJUlRNUEZpbHRlckNhbGlicmF0aW9uKHBBZCk7CisKKwkJLyogSW5pdGlhbGl6ZSBSRiBSMjcgcmVnaXN0ZXIsIHNldCBSRiBSMjcgbXVzdCBiZSBiZWhpbmQgUlRNUEZpbHRlckNhbGlicmF0aW9uKCkgKi8KKwkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKQorCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCAweDMpOworCisJCS8qIHNldCBsZWQgb3BlbiBkcmFpbiBlbmFibGUgKi8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBPUFRfMTQsICZkYXRhKTsKKwkJZGF0YSB8PSAweDAxOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBPUFRfMTQsIGRhdGEpOworCisJCS8qIHNldCBkZWZhdWx0IGFudGVubmEgYXMgbWFpbiAqLworCQlpZiAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApCisJCQlBc2ljU2V0UnhBbnQocEFkLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50KTsKKworCQkvKiBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cCwgbG9hZCBSRiBub3JtYWwgb3BlcmF0aW9uLW1vZGUgc2V0dXAgKi8KKwkJUlQzMHh4TG9hZFJGTm9ybWFsTW9kZVNldHVwKHBBZCk7CisJfQorCit9CisKKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcHMvcnQzMHh4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXBzL3J0MzB4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNjg0YTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXBzL3J0MzB4eC5jCkBAIC0wLDAgKzEsNTE4IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0MzB4eC5jCisKKwlBYnN0cmFjdDoKKwlTcGVjaWZpYyBmdW5jaXRvbnMgYW5kIHZhcmlhYmxlcyBmb3IgUlQzMHh4LgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZmRlZiBSVDMweHgKKworI2lmbmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKKyNlcnJvciAiWW91IFNob3VsZCBFbmFibGUgY29tcGlsZSBmbGFnIFJUTVBfUkZfUldfU1VQUE9SVCBmb3IgdGhpcyBjaGlwIgorI2VuZGlmIC8qIFJUTVBfUkZfUldfU1VQUE9SVCAvLyAqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8qICovCisvKiBSRiByZWdpc3RlciBpbml0aWFsaXphdGlvbiBzZXQgKi8KKy8qICovCitzdHJ1Y3QgcnRfcmVnX3BhaXIgUlQzMHh4X1JGUmVnVGFibGVbXSA9IHsKKwl7UkZfUjA0LCAweDQwfQorCSwKKwl7UkZfUjA1LCAweDAzfQorCSwKKwl7UkZfUjA2LCAweDAyfQorCSwKKwl7UkZfUjA3LCAweDcwfQorCSwKKwl7UkZfUjA5LCAweDBGfQorCSwKKwl7UkZfUjEwLCAweDQxfQorCSwKKwl7UkZfUjExLCAweDIxfQorCSwKKwl7UkZfUjEyLCAweDdCfQorCSwKKwl7UkZfUjE0LCAweDkwfQorCSwKKwl7UkZfUjE1LCAweDU4fQorCSwKKwl7UkZfUjE2LCAweEIzfQorCSwKKwl7UkZfUjE3LCAweDkyfQorCSwKKwl7UkZfUjE4LCAweDJDfQorCSwKKwl7UkZfUjE5LCAweDAyfQorCSwKKwl7UkZfUjIwLCAweEJBfQorCSwKKwl7UkZfUjIxLCAweERCfQorCSwKKwl7UkZfUjI0LCAweDE2fQorCSwKKwl7UkZfUjI1LCAweDAxfQorCSwKKwl7UkZfUjI5LCAweDFGfQorCSwKK307CisKK3U4IE5VTV9SRl9SRUdfUEFSTVMgPSAoc2l6ZW9mKFJUMzB4eF9SRlJlZ1RhYmxlKSAvIHNpemVvZihzdHJ1Y3QgcnRfcmVnX3BhaXIpKTsKKworLyogQW50ZW5uYSBkaXZlc2l0eSB1c2UgR1BJTzMgYW5kIEVFU0sgcGluIGZvciBjb250cm9sICovCisvKiBBbnRlbm5hIGFuZCBFRVBST00gYWNjZXNzIGFyZSBib3RoIHVzaW5nIEVFU0sgcGluLCAqLworLyogVGhlcmVmb3Igd2Ugc2hvdWxkIGF2b2lkIGFjY2Vzc2luZyBFRVNLIGF0IHRoZSBzYW1lIHRpbWUgKi8KKy8qIFRoZW4gcmVzdG9yZSBhbnRlbm5hIGFmdGVyIEVFUFJPTSBhY2Nlc3MgKi8KKy8qIFRoZSBvcmlnaW5hbCBuYW1lIG9mIHRoaXMgZnVuY3Rpb24gaXMgQXNpY1NldFJ4QW50KCksIG5vdyBjaGFuZ2UgdG8gKi8KKy8qdm9pZCBBc2ljU2V0UnhBbnQoICovCit2b2lkIFJUMzB4eFNldFJ4QW50KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQW50KQoreworCXUzMiBWYWx1ZTsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwl1MzIgeDsKKyNlbmRpZgorCisJaWYgKChwQWQtPkVlcHJvbUFjY2VzcykgfHwKKwkgICAgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpIHx8CisJICAgIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpIHx8CisJICAgIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkgfHwKKwkgICAgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpIHsKKwkJcmV0dXJuOworCX0KKwkvKiB0aGUgYW50ZW5uYSBzZWxlY3Rpb24gaXMgdGhyb3VnaCBmaXJtd2FyZSBhbmQgTUFDIHJlZ2lzdGVyKEdQSU8zKSAqLworCWlmIChBbnQgPT0gMCkgeworCQkvKiBNYWluIGFudGVubmEgKi8KKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisJCXggfD0gKEVFU0spOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKyNlbHNlCisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg3MywgMHhGRiwgMHgxLCAweDApOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigweDA4MDgpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCBWYWx1ZSk7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCSAgICAgKCJBc2ljU2V0UnhBbnQsIHN3aXRjaCB0byBtYWluIGFudGVubmFcbiIpKTsKKwl9IGVsc2UgeworCQkvKiBBdXggYW50ZW5uYSAqLworI2lmZGVmIFJUTVBfTUFDX1BDSQorCQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKwkJeCAmPSB+KEVFU0spOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKyNlbHNlCisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg3MywgMHhGRiwgMHgwLCAweDApOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMHgwODA4KTsKKwkJVmFsdWUgfD0gMHgwODsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgR1BJT19DVFJMX0NGRywgVmFsdWUpOworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkgICAgICgiQXNpY1NldFJ4QW50LCBzd2l0Y2ggdG8gYXV4IGFudGVubmFcbiIpKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlGb3IgUkYgZmlsdGVyIGNhbGlicmF0aW9uIHB1cnBvc2UKKworCUFyZ3VtZW50czoKKwkJcEFkICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUTVBGaWx0ZXJDYWxpYnJhdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJdTggUjU1eCA9IDAsIHZhbHVlLCBGaWx0ZXJUYXJnZXQgPSAweDFFLCBCQlBWYWx1ZSA9IDA7CisJdTMyIGxvb3AgPSAwLCBjb3VudCA9IDAsIGxvb3BjbnQgPSAwLCBSZVRyeSA9IDA7CisJdTggUkZfUjI0X1ZhbHVlID0gMDsKKworCS8qIEdpdmUgYmJwIGZpbHRlciBpbml0aWFsIHZhbHVlICovCisJcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQgPSAweDFGOworCXBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0ID0gMHgyRjsJLypCaXRbNV0gbXVzdCBiZSAxIGZvciBCVyA0MCAqLworCisJZG8geworCQlpZiAobG9vcCA9PSAxKQkvKkJhbmRXaWR0aCA9IDQwIE1IeiAqLworCQl7CisJCQkvKiBXcml0ZSAweDI3IHRvIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlciAqLworCQkJUkZfUjI0X1ZhbHVlID0gMHgyNzsKKwkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKKwkJCWlmIChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkKKwkJCQlGaWx0ZXJUYXJnZXQgPSAweDE1OworCQkJZWxzZQorCQkJCUZpbHRlclRhcmdldCA9IDB4MTk7CisKKwkJCS8qIHdoZW4gY2FsaWJyYXRlIEJXNDAsIEJCUCBtYXNrIG11c3Qgc2V0IHRvIEJXNDAuICovCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSAmPSAofjB4MTgpOworCQkJQkJQVmFsdWUgfD0gKDB4MTApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCisJCQkvKiBzZXQgdG8gQlc0MCAqLworCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsICZ2YWx1ZSk7CisJCQl2YWx1ZSB8PSAweDIwOworCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCB2YWx1ZSk7CisJCX0gZWxzZQkJLypCYW5kV2lkdGggPSAyMCBNSHogKi8KKwkJeworCQkJLyogV3JpdGUgMHgwNyB0byBSRl9SMjQgdG8gcHJvZ3JhbSBmaWx0ZXIgKi8KKwkJCVJGX1IyNF9WYWx1ZSA9IDB4MDc7CisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7CisJCQlpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCisJCQkJRmlsdGVyVGFyZ2V0ID0gMHgxMzsKKwkJCWVsc2UKKwkJCQlGaWx0ZXJUYXJnZXQgPSAweDE2OworCisJCQkvKiBzZXQgdG8gQlcyMCAqLworCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsICZ2YWx1ZSk7CisJCQl2YWx1ZSAmPSAofjB4MjApOworCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCB2YWx1ZSk7CisJCX0KKworCQkvKiBXcml0ZSAweDAxIHRvIFJGX1IyMiB0byBlbmFibGUgYmFzZWJhbmQgbG9vcGJhY2sgbW9kZSAqLworCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgJnZhbHVlKTsKKwkJdmFsdWUgfD0gMHgwMTsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIyLCB2YWx1ZSk7CisKKwkJLyogV3JpdGUgMHgwMCB0byBCQlBfUjI0IHRvIHNldCBwb3dlciAmIGZyZXF1ZW5jeSBvZiBwYXNzYmFuZCB0ZXN0IHRvbmUgKi8KKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIDApOworCisJCWRvIHsKKwkJCS8qIFdyaXRlIDB4OTAgdG8gQkJQX1IyNSB0byB0cmFuc21pdCB0ZXN0IHRvbmUgKi8KKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI1LCAweDkwKTsKKworCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJCS8qIFJlYWQgQkJQX1I1NVs2OjBdIGZvciByZWNlaXZlZCBwb3dlciwgc2V0IFI1NXggPSBCQlBfUjU1WzY6MF0gKi8KKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNTUsICZ2YWx1ZSk7CisJCQlSNTV4ID0gdmFsdWUgJiAweEZGOworCisJCX0gd2hpbGUgKChSZVRyeSsrIDwgMTAwKSAmJiAoUjU1eCA9PSAwKSk7CisKKwkJLyogV3JpdGUgMHgwNiB0byBCQlBfUjI0IHRvIHNldCBwb3dlciAmIGZyZXF1ZW5jeSBvZiBzdG9wYmFuZCB0ZXN0IHRvbmUgKi8KKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIDB4MDYpOworCisJCXdoaWxlIChUUlVFKSB7CisJCQkvKiBXcml0ZSAweDkwIHRvIEJCUF9SMjUgdG8gdHJhbnNtaXQgdGVzdCB0b25lICovCisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNSwgMHg5MCk7CisKKwkJCS8qV2UgbmVlZCB0byB3YWl0IGZvciBjYWxpYnJhdGlvbiAqLworCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNTUsICZ2YWx1ZSk7CisJCQl2YWx1ZSAmPSAweEZGOworCQkJaWYgKChSNTV4IC0gdmFsdWUpIDwgRmlsdGVyVGFyZ2V0KSB7CisJCQkJUkZfUjI0X1ZhbHVlKys7CisJCQl9IGVsc2UgaWYgKChSNTV4IC0gdmFsdWUpID09IEZpbHRlclRhcmdldCkgeworCQkJCVJGX1IyNF9WYWx1ZSsrOworCQkJCWNvdW50Kys7CisJCQl9IGVsc2UgeworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBwcmV2ZW50IGluZmluaXRlIGxvb3AgY2F1c2UgZHJpdmVyIGhhbmcuICovCisJCQlpZiAobG9vcGNudCsrID4gMTAwKSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCSAoIlJUTVBGaWx0ZXJDYWxpYnJhdGlvbiAtIGNhbid0IGZpbmQgYSB2YWxpZCB2YWx1ZSwgbG9vcGNudD0lZCBzdG9wIGNhbGlicmF0aW5nIiwKKwkJCQkJICBsb29wY250KSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBXcml0ZSBSRl9SMjQgdG8gcHJvZ3JhbSBmaWx0ZXIgKi8KKwkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKKwkJfQorCisJCWlmIChjb3VudCA+IDApIHsKKwkJCVJGX1IyNF9WYWx1ZSA9IFJGX1IyNF9WYWx1ZSAtICgoY291bnQpID8gKDEpIDogKDApKTsKKwkJfQorCQkvKiBTdG9yZSBmb3IgZnV0dXJlIHVzYWdlICovCisJCWlmIChsb29wY250IDwgMTAwKSB7CisJCQlpZiAobG9vcCsrID09IDApIHsKKwkJCQkvKkJhbmRXaWR0aCA9IDIwIE1IeiAqLworCQkJCXBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0ID0gKHU4KVJGX1IyNF9WYWx1ZTsKKwkJCX0gZWxzZSB7CisJCQkJLypCYW5kV2lkdGggPSA0MCBNSHogKi8KKwkJCQlwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNCA9ICh1OClSRl9SMjRfVmFsdWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZQorCQkJYnJlYWs7CisKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOworCisJCS8qIHJlc2V0IGNvdW50ICovCisJCWNvdW50ID0gMDsKKwl9IHdoaWxlIChUUlVFKTsKKworCS8qICovCisJLyogU2V0IGJhY2sgdG8gaW5pdGlhbCBzdGF0ZSAqLworCS8qICovCisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIDApOworCisJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjIsICZ2YWx1ZSk7CisJdmFsdWUgJj0gfigweDAxKTsKKwlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjIsIHZhbHVlKTsKKworCS8qIHNldCBCQlAgYmFjayB0byBCVzIwICovCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlJUTVBGaWx0ZXJDYWxpYnJhdGlvbiAtIENhbGlCVzIwUmZSMjQ9MHgleCwgQ2FsaUJXNDBSZlIyND0weCV4XG4iLAorCQkgIHBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0LCBwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNCkpOworfQorCisvKiBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cCAqLworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJTG9hZCBSRiBub3JtYWwgb3BlcmF0aW9uLW1vZGUgc2V0dXAKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgUlQzMHh4TG9hZFJGTm9ybWFsTW9kZVNldHVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwl1OCBSRlZhbHVlOworCisJLyogUlgwX1BEICYgVFgwX1BELCBSRiBSMSByZWdpc3RlciBCaXQgMiAmIEJpdCAzIHRvIDAgYW5kIFJGX0JMT0NLX2VuLFJYMV9QRCAmIFRYMV9QRCwgQml0MCwgQml0IDQgJiBCaXQ1IHRvIDEgKi8KKwlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgJlJGVmFsdWUpOworCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHgwQykpIHwgMHgzMTsKKwlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsIFJGVmFsdWUpOworCisJLyogVFhfTE8yX2VuLCBSRiBSMTUgcmVnaXN0ZXIgQml0IDMgdG8gMCAqLworCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjE1LCAmUkZWYWx1ZSk7CisJUkZWYWx1ZSAmPSAofjB4MDgpOworCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxNSwgUkZWYWx1ZSk7CisKKwkvKiBtb3ZlIHRvIE5JQ0luaXRSVDMweHhSRlJlZ2lzdGVycworCSAgIC8vIFRYX0xPMV9lbiwgUkYgUjE3IHJlZ2lzdGVyIEJpdCAzIHRvIDAKKwkgICBSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IxNywgJlJGVmFsdWUpOworCSAgIFJGVmFsdWUgJj0gKH4weDA4KTsKKwkgICAvLyB0byBmaXggcnggbG9uZyByYW5nZSBpc3N1ZQorCSAgIGlmICgoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPj0gMHgwMjExKSAmJiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRyA9PSAwKSkKKwkgICB7CisJICAgUkZWYWx1ZSB8PSAweDIwOworCSAgIH0KKwkgICAvLyBzZXQgUkZfUjE3X2JpdFsyOjBdIGVxdWFsIHRvIEVFUFJPTSBzZXR0aW5nIGF0IDB4NDhoCisJICAgaWYgKHBBZC0+VHhNaXhlckdhaW4yNEcgPj0gMikKKwkgICB7CisJICAgUkZWYWx1ZSAmPSAofjB4Nyk7ICAvLyBjbGVhbiBiaXQgWzI6MF0KKwkgICBSRlZhbHVlIHw9IHBBZC0+VHhNaXhlckdhaW4yNEc7CisJICAgfQorCSAgIFJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxNywgUkZWYWx1ZSk7CisJICovCisKKwkvKiBSWF9MTzFfZW4sIFJGIFIyMCByZWdpc3RlciBCaXQgMyB0byAwICovCisJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjAsICZSRlZhbHVlKTsKKwlSRlZhbHVlICY9ICh+MHgwOCk7CisJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIwLCBSRlZhbHVlKTsKKworCS8qIFJYX0xPMl9lbiwgUkYgUjIxIHJlZ2lzdGVyIEJpdCAzIHRvIDAgKi8KKwlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgJlJGVmFsdWUpOworCVJGVmFsdWUgJj0gKH4weDA4KTsKKwlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsIFJGVmFsdWUpOworCisJLyogYWRkIGJ5IGpvaG5saSwgcmVzZXQgUkZfUjI3IHdoZW4gaW50ZXJmYWNlIGRvd24gJiB1cCB0byBmaXggdGhyb3VnaHB1dCBwcm9ibGVtICovCisJLyogTERPUkZfVkMsIFJGIFIyNyByZWdpc3RlciBCaXQgMiB0byAwICovCisJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsICZSRlZhbHVlKTsKKwkvKiBUWCB0byBSWCBJUSBnbGl0Y2goUkZfUjI3KSBoYXMgYmVlbiBmaXhlZCBpbiBSVDMwNzAoRikuICovCisJLyogUmFpc2luZyBSRiB2b2x0YWdlIGlzIG5vIGxvbmdlciBuZWVkZWQgZm9yIFJUMzA3MChGKSAqLworCWlmIChJU19SVDMwOTAocEFkKSkJLyogUlQzMDl4IGFuZCBSVDMwNzEvNzIgKi8KKwl7CisJCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkKKwkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHg3NykpIHwgMHgzOworCQllbHNlCisJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAofjB4NzcpKTsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCBSRlZhbHVlKTsKKwl9CisJLyogZW5kIGpvaG5saSAqLworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlMb2FkIFJGIHNsZWVwLW1vZGUgc2V0dXAKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgUlQzMHh4TG9hZFJGU2xlZXBNb2RlU2V0dXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXU4IFJGVmFsdWU7CisJdTMyIE1BQ1ZhbHVlOworCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJaWYgKCFJU19SVDM1NzIocEFkKSkKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKwl7CisJCS8qIFJGX0JMT0NLX2VuLiBSRiBSMSByZWdpc3RlciBCaXQgMCB0byAwICovCisJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCAmUkZWYWx1ZSk7CisJCVJGVmFsdWUgJj0gKH4weDAxKTsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCBSRlZhbHVlKTsKKworCQkvKiBWQ09fSUMsIFJGIFI3IHJlZ2lzdGVyIEJpdCA0ICYgQml0IDUgdG8gMCAqLworCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgJlJGVmFsdWUpOworCQlSRlZhbHVlICY9ICh+MHgzMCk7CisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgUkZWYWx1ZSk7CisKKwkJLyogSWRvaCwgUkYgUjkgcmVnaXN0ZXIgQml0IDEsIEJpdCAyICYgQml0IDMgdG8gMCAqLworCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwOSwgJlJGVmFsdWUpOworCQlSRlZhbHVlICY9ICh+MHgwRSk7CisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwOSwgUkZWYWx1ZSk7CisKKwkJLyogUlhfQ1RCX2VuLCBSRiBSMjEgcmVnaXN0ZXIgQml0IDcgdG8gMCAqLworCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgJlJGVmFsdWUpOworCQlSRlZhbHVlICY9ICh+MHg4MCk7CisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgUkZWYWx1ZSk7CisJfQorCisJaWYgKElTX1JUMzA5MChwQWQpIHx8CS8qIElTX1JUMzA5MCBpbmNsdWRpbmcgUlQzMDl4IGFuZCBSVDMwNzEvNzIgKi8KKwkgICAgSVNfUlQzNTcyKHBBZCkgfHwKKwkgICAgKElTX1JUMzA3MChwQWQpICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIwMSkpKSB7CisjaWZkZWYgUlRNUF9NQUNfVVNCCisJCWlmICghSVNfUlQzNTcyKHBBZCkpCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisJCXsKKwkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCAmUkZWYWx1ZSk7CisJCQlSRlZhbHVlIHw9IDB4Nzc7CisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIFJGVmFsdWUpOworCQl9CisKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJk1BQ1ZhbHVlKTsKKwkJTUFDVmFsdWUgfD0gMHgxRDAwMDAwMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTERPX0NGRzAsIE1BQ1ZhbHVlKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCVJldmVyc2UgUkYgc2xlZXAtbW9kZSBzZXR1cAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBSVDMweHhSZXZlcnNlUkZTbGVlcE1vZGVTZXR1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJdTggUkZWYWx1ZTsKKwl1MzIgTUFDVmFsdWU7CisKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwlpZiAoIUlTX1JUMzU3MihwQWQpKQorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCXsKKwkJLyogUkZfQkxPQ0tfZW4sIFJGIFIxIHJlZ2lzdGVyIEJpdCAwIHRvIDEgKi8KKwkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsICZSRlZhbHVlKTsKKwkJUkZWYWx1ZSB8PSAweDAxOworCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsIFJGVmFsdWUpOworCisJCS8qIFZDT19JQywgUkYgUjcgcmVnaXN0ZXIgQml0IDQgJiBCaXQgNSB0byAxICovCisJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCAmUkZWYWx1ZSk7CisJCVJGVmFsdWUgfD0gMHgzMDsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCBSRlZhbHVlKTsKKworCQkvKiBJZG9oLCBSRiBSOSByZWdpc3RlciBCaXQgMSwgQml0IDIgJiBCaXQgMyB0byAxICovCisJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA5LCAmUkZWYWx1ZSk7CisJCVJGVmFsdWUgfD0gMHgwRTsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA5LCBSRlZhbHVlKTsKKworCQkvKiBSWF9DVEJfZW4sIFJGIFIyMSByZWdpc3RlciBCaXQgNyB0byAxICovCisJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCAmUkZWYWx1ZSk7CisJCVJGVmFsdWUgfD0gMHg4MDsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCBSRlZhbHVlKTsKKwl9CisKKwlpZiAoSVNfUlQzMDkwKHBBZCkgfHwJLyogSVNfUlQzMDkwIGluY2x1ZGluZyBSVDMwOXggYW5kIFJUMzA3MS83MiAqLworCSAgICBJU19SVDM1NzIocEFkKSB8fAorCSAgICBJU19SVDMzOTAocEFkKSB8fAorCSAgICAoSVNfUlQzMDcwKHBBZCkgJiYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjAxKSkpIHsKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkJaWYgKCFJU19SVDM1NzIocEFkKSkKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKwkJeworCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsICZSRlZhbHVlKTsKKwkJCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkKKwkJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAofjB4NzcpKSB8IDB4MzsKKwkJCWVsc2UKKwkJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAofjB4NzcpKTsKKwkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgUkZWYWx1ZSk7CisJCX0KKwkJLyogUlQzMDcxIHZlcnNpb24gRSBoYXMgZml4ZWQgdGhpcyBpc3N1ZSAqLworCQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5EQUNUZXN0Qml0ID09IDEpCisJCSAgICAmJiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpKSB7CisJCQkvKiBwYXRjaCB0eCBFVk0gaXNzdWUgdGVtcG9yYXJpbHkgKi8KKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTERPX0NGRzAsICZNQUNWYWx1ZSk7CisJCQlNQUNWYWx1ZSA9ICgoTUFDVmFsdWUgJiAweEUwRkZGRkZGKSB8IDB4MEQwMDAwMDApOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTERPX0NGRzAsIE1BQ1ZhbHVlKTsKKwkJfSBlbHNlIHsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTERPX0NGRzAsICZNQUNWYWx1ZSk7CisJCQlNQUNWYWx1ZSA9ICgoTUFDVmFsdWUgJiAweEUwRkZGRkZGKSB8IDB4MDEwMDAwMDApOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTERPX0NGRzAsIE1BQ1ZhbHVlKTsKKwkJfQorCX0KKworCWlmIChJU19SVDM1NzIocEFkKSkKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA4LCAweDgwKTsKK30KKworLyogZW5kIGpvaG5saSAqLworCit2b2lkIFJUMzB4eEhhbHRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXUzMiBUeFBpbkNmZyA9IDB4MDAwNTBGMEY7CisKKwkvKiAqLworCS8qIFR1cm4gb2ZmIExOQV9QRSBvciBUUlNXX1BPTCAqLworCS8qICovCisJaWYgKElTX1JUMzA3MChwQWQpIHx8IElTX1JUMzA3MShwQWQpIHx8IElTX1JUMzU3MihwQWQpKSB7CisJCWlmICgoSVNfUlQzMDcxKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkpCisjaWZkZWYgUlRNUF9FRlVTRV9TVVBQT1JUCisJCSAgICAmJiAocEFkLT5iVXNlRWZ1c2UpCisjZW5kaWYgLyogUlRNUF9FRlVTRV9TVVBQT1JUIC8vICovCisJCSAgICApIHsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGQkYwRjA7CS8qIGJpdDE4IG9mZiAqLworCQl9IGVsc2UgeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjBGMDsKKwkJfQorCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKKwl9Cit9CisKKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hsaXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NobGlzdC5oCmluZGV4IGY0OWEzNWMuLmFkYTY1ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hsaXN0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGxpc3QuaApAQCAtNDEsNyArNDEsNiBAQAogI2luY2x1ZGUgInJ0bXBfdHlwZS5oIgogI2luY2x1ZGUgInJ0bXBfZGVmLmgiCiAKLQogI2RlZmluZSBPRE9SCQkJMAogI2RlZmluZSBJRE9SCQkJMQogI2RlZmluZSBCT1RICQkJMgpAQCAtNTAsMTE5NiArNDksNjkgQEAKICNkZWZpbmUgQkFORF8yNEcgICAgICAgIDEKICNkZWZpbmUgQkFORF9CT1RIICAgICAgIDIKIAotdHlwZWRlZiBzdHJ1Y3QgX0NIX0RFU1AgewotCVVDSEFSIEZpcnN0Q2hhbm5lbDsKLQlVQ0hBUiBOdW1PZkNoOwotCUNIQVIgTWF4VHhQd3I7CQkJLy8gZEJtCi0JVUNIQVIgR2VvZ3JhcGh5OwkJCS8vIDA6b3V0IGRvb3IsIDE6aW4gZG9vciwgMjpib3RoCi0JQk9PTEVBTiBEZnNSZXE7CQkJLy8gRGZzIHJlcXVpcmUsIDA6IE5vLCAxOiB5ZXMuCi19IENIX0RFU1AsICpQQ0hfREVTUDsKLQotdHlwZWRlZiBzdHJ1Y3QgX0NIX1JFR0lPTiB7Ci0JVUNIQVIgQ291bnRSZWdbM107Ci0JVUNIQVIgRGZzVHlwZTsJCQkvLyAwOiBDRSwgMTogRkNDLCAyOiBKQVAsIDM6SkFQX1c1MywgSkFQX1c1NgotCUNIX0RFU1AgQ2hEZXNwWzEwXTsKLX0gQ0hfUkVHSU9OLCAqUENIX1JFR0lPTjsKLQotc3RhdGljIENIX1JFR0lPTiBDaFJlZ2lvbltdID0KLXsKLQkJewkvLyBBbnRpZ3VhIGFuZCBCZXJidWRhCi0JCQkiQUciLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBBcmdlbnRpbmEKLQkJCSJBUiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBBcnViYQotCQkJIkFXIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQXVzdHJhbGlhCi0JCQkiQVUiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBBdXN0cmlhCi0JCQkiQVQiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBCYWhhbWFzCi0JCQkiQlMiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBCYXJiYWRvcwotCQkJIkJCIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQmVybXVkYQotCQkJIkJNIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQnJhemlsCi0JCQkiQlIiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAxNDksIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQmVsZ2l1bQotCQkJIkJFIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDE4LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMTgsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBCdWxnYXJpYQotCQkJIkJHIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBPRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIENhbmFkYQotCQkJIkNBIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ2F5bWFuIElzTGFuZHMKLQkJCSJLWSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIENoaWxlCi0JCQkiQ0wiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgNSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBDaGluYQotCQkJIkNOIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDE0OSwgNCwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBDb2xvbWJpYQotCQkJIkNPIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIENvc3RhIFJpY2EKLQkJCSJDUiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAxNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEN5cHJ1cwotCQkJIkNZIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjQsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0sCQkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ3plY2hfUmVwdWJsaWMKLQkJCSJDWiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gRGVubWFyawotCQkJIkRLIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjMsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0sCQkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gRG9taW5pY2FuIFJlcHVibGljCi0JCQkiRE8iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDAsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMAotCQkJCXsgMTQ5LCA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEVxdWFkb3IKLQkJCSJFQyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMTAwLCAxMSwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBFbCBTYWx2YWRvcgotCQkJIlNWIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgNCwgICAzNiwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxNDl+MTY1Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBGaW5sYW5kCi0JCQkiRkkiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEZyYW5jZQotCQkJIkZSIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEdlcm1hbnkKLQkJCSJERSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gR3JlZWNlCi0JCQkiR1IiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBPRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEd1YW0KLQkJCSJHVSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTEsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQotCQkJCXsgMzYsICA0LCAgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAxNDksICA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEd1YXRlbWFsYQotCQkJIkdUIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEhhaXRpCi0JCQkiSFQiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgICAxNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSG9uZHVyYXMKLQkJCSJITiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMTQ5LCAgNCwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBIb25nIEtvbmcKLQkJCSJISyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBIdW5nYXJ5Ci0JCQkiSFUiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSWNlbGFuZAotCQkJIklTIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBJbmRpYQotCQkJIklOIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAxNDksIAk0LCAgMjQsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEluZG9uZXNpYQotCQkJIklEIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAxNDksIAk0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIElyZWxhbmQKLQkJCSJJRSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBPRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIElzcmFlbAotCQkJIklMIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAgMywgIDIwLCBJRE9SLCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjMKLQkJCQl7IDQsIAk2LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDR+OQotCQkJCXsgMTAsIAk0LCAgMjAsIElET1IsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDEwfjEzCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBJdGFseQotCQkJIklUIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSmFwYW4KLQkJCSJKUCIsCi0JCQlKQVAsCi0JCQl7Ci0JCQkJeyAxLCAgIDE0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTQKLQkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSm9yZGFuCi0JCQkiSk8iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIElET1IsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgMTQ5LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBMYXR2aWEKLQkJCSJMViIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIExpZWNodGVuc3RlaW4KLQkJCSJMSSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBMaXRodWFuaWEKLQkJCSJMVCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEx1eGVtYnVyZwotCQkJIkxVIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTWFsYXlzaWEKLQkJCSJNWSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDM2LCAJNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsIAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksICA1LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIE1hbHRhCi0JCQkiTVQiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBNYXJvY2NvCi0JCQkiTUEiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAJNCwgIDI0LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTWV4aWNvCi0JCQkiTVgiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAJNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsIAk0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksICA1LCAgMzAsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIE5ldGhlcmxhbmRzCi0JCQkiTkwiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsIAk0LCAgMjQsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBOZXcgWmVhbGFuZAotCQkJIk5aIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgCTQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAJNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBOb3J3YXkKLQkJCSJOTyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsIAk0LCAgMjQsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgCTQsICAyNCwgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFBlcnUKLQkJCSJQRSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMTQ5LCAgNCwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBQb3J0dWdhbAotCQkJIlBUIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBQb2xhbmQKLQkJCSJQTCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gUm9tYW5pYQotCQkJIlJPIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBSdXNzaWEKLQkJCSJSVSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMTQ5LCAgNCwgIDIwLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTYXVkaSBBcmFiaWEKLQkJCSJTQSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTZXJiaWFfYW5kX01vbnRlbmVncm8KLQkJCSJDUyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gU2luZ2Fwb3JlCi0JCQkiU0ciLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gU2xvdmFraWEKLQkJCSJTSyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gU2xvdmVuaWEKLQkJCSJTSSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTb3V0aCBBZnJpY2EKLQkJCSJaQSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDE0OSwgIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gU291dGggS29yZWEKLQkJCSJLUiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAgOCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTI4Ci0JCQkJeyAxNDksICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFNwYWluCi0JCQkiRVMiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAxNywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFN3ZWRlbgotCQkJIlNFIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTd2l0emVybGFuZAotCQkJIkNIIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gVGFpd2FuCi0JCQkiVFciLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDExLCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFR1cmtleQotCQkJIlRSIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCi0JCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBVSwotCQkJIkdCIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBVa3JhaW5lCi0JCQkiVUEiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFVuaXRlZF9BcmFiX0VtaXJhdGVzCi0JCQkiQUUiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFVuaXRlZF9TdGF0ZXMKLQkJCSJVUyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTEsICAzMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQotCQkJCXsgMzYsICAgNCwgIDE3LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgNTIsICAgNCwgIDI0LCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMTQ5LCAgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBWZW5lenVlbGEKLQkJCSJWRSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQotCQkJCXsgMTQ5LCAgNCwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBEZWZhdWx0Ci0JCQkiIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCi0JCQkJeyAzNiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyA1MiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDE0OSwgIDUsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAorc3RydWN0IHJ0X2NoX2Rlc3AgeworCXU4IEZpcnN0Q2hhbm5lbDsKKwl1OCBOdW1PZkNoOworCWNoYXIgTWF4VHhQd3I7CQkvKiBkQm0gKi8KKwl1OCBHZW9ncmFwaHk7CS8qIDA6b3V0IGRvb3IsIDE6aW4gZG9vciwgMjpib3RoICovCisJQk9PTEVBTiBEZnNSZXE7CQkvKiBEZnMgcmVxdWlyZSwgMDogTm8sIDE6IHllcy4gKi8KIH07CiAKLXN0YXRpYyBpbmxpbmUgUENIX1JFR0lPTiBHZXRDaFJlZ2lvbigKLQlJTiBQVUNIQVIgQ250cnlDb2RlKQotewotCUlOVCBsb29wID0gMDsKLQlQQ0hfUkVHSU9OIHBDaFJlZ2lvbiA9IE5VTEw7CitzdHJ1Y3QgcnRfY2hfcmVnaW9uIHsKKwl1OCBDb3VudFJlZ1szXTsKKwl1OCBEZnNUeXBlOwkJLyogMDogQ0UsIDE6IEZDQywgMjogSkFQLCAzOkpBUF9XNTMsIEpBUF9XNTYgKi8KKwlzdHJ1Y3QgcnRfY2hfZGVzcCBDaERlc3BbMTBdOworfTsKIAotCXdoaWxlIChzdHJjbXAoQ2hSZWdpb25bbG9vcF0uQ291bnRSZWcsICIiKSAhPSAwKQotCXsKLQkJaWYgKHN0cm5jbXAoQ2hSZWdpb25bbG9vcF0uQ291bnRSZWcsIENudHJ5Q29kZSwgMikgPT0gMCkKLQkJewotCQkJcENoUmVnaW9uID0gJkNoUmVnaW9uW2xvb3BdOwotCQkJYnJlYWs7Ci0JCX0KLQkJbG9vcCsrOwotCX0KK2V4dGVybiBzdHJ1Y3QgcnRfY2hfcmVnaW9uIENoUmVnaW9uW107CiAKLQlpZiAocENoUmVnaW9uID09IE5VTEwpCi0JCXBDaFJlZ2lvbiA9ICZDaFJlZ2lvbltsb29wXTsKLQlyZXR1cm4gcENoUmVnaW9uOwotfQorc3RydWN0IHJ0X2NoX2ZyZXFfbWFwIHsKKwl1MTYgY2hhbm5lbDsKKwl1MTYgZnJlcUtIejsKK307CiAKLXN0YXRpYyBpbmxpbmUgVk9JRCBDaEJhbmRDaGVjaygKLQlJTiBVQ0hBUiBQaHlNb2RlLAotCU9VVCBQVUNIQVIgcENoVHlwZSkKLXsKLQlzd2l0Y2goUGh5TW9kZSkKLQl7Ci0JCWNhc2UgUEhZXzExQToKLQkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKLQkJCSpwQ2hUeXBlID0gQkFORF81RzsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKLQkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6Ci0JCWNhc2UgUEhZXzExQUJHTl9NSVhFRDoKLQkJCSpwQ2hUeXBlID0gQkFORF9CT1RIOwotCQkJYnJlYWs7CitleHRlcm4gc3RydWN0IHJ0X2NoX2ZyZXFfbWFwIENIX0haX0lEX01BUFtdOworZXh0ZXJuIGludCBDSF9IWl9JRF9NQVBfTlVNOwogCi0JCWRlZmF1bHQ6Ci0JCQkqcENoVHlwZSA9IEJBTkRfMjRHOwotCQkJYnJlYWs7Ci0JfQotfQorI2RlZmluZSAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKF9jaCwgX2toeikJCQkJCVwKKwkJZG97CQkJCQkJCQkJCQkJCVwKKwkJCWludCBfY2hJZHg7CQkJCQkJCQkJCQlcCisJCQlmb3IgKF9jaElkeCA9IDA7IF9jaElkeCA8IENIX0haX0lEX01BUF9OVU07IF9jaElkeCsrKVwKKwkJCXsJCQkJCQkJCQkJCQkJXAorCQkJCWlmICgoX2NoKSA9PSBDSF9IWl9JRF9NQVBbX2NoSWR4XS5jaGFubmVsKQkJCVwKKwkJCQl7CQkJCQkJCQkJCQkJXAorCQkJCQkoX2toeikgPSBDSF9IWl9JRF9NQVBbX2NoSWR4XS5mcmVxS0h6ICogMTAwMDsJXAorCQkJCQlicmVhazsJCQkJCQkJCQkJXAorCQkJCX0JCQkJCQkJCQkJCQlcCisJCQl9CQkJCQkJCQkJCQkJCVwKKwkJCWlmIChfY2hJZHggPT0gQ0hfSFpfSURfTUFQX05VTSkJCQkJCVwKKwkJCQkoX2toeikgPSAyNDEyMDAwOwkJCQkJCQkJCVwKKyAgICAgICAgICAgIH13aGlsZSgwKQogCi1zdGF0aWMgaW5saW5lIFVDSEFSIEZpbGxDaExpc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUENIX0RFU1AgcENoRGVzcCwKLQlJTiBVQ0hBUiBPZmZzZXQsCi0JSU4gVUNIQVIgaW5jcmVtZW50KQotewotCUlOVCBpLCBqLCBsOwotCVVDSEFSIGNoYW5uZWw7CisjZGVmaW5lICAgICBNQVBfS0haX1RPX0NIQU5ORUxfSUQoX2toeiwgX2NoKSAgICAgICAgICAgICAgICAgXAorCQlkb3sJCQkJCQkJCQkJCQkJXAorCQkJaW50IF9jaElkeDsJCQkJCQkJCQkJCVwKKwkJCWZvciAoX2NoSWR4ID0gMDsgX2NoSWR4IDwgQ0hfSFpfSURfTUFQX05VTTsgX2NoSWR4KyspXAorCQkJewkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKChfa2h6KSA9PSBDSF9IWl9JRF9NQVBbX2NoSWR4XS5mcmVxS0h6KQkJCVwKKwkJCQl7CQkJCQkJCQkJCQkJXAorCQkJCQkoX2NoKSA9IENIX0haX0lEX01BUFtfY2hJZHhdLmNoYW5uZWw7CQkJXAorCQkJCQlicmVhazsJCQkJCQkJCQkJXAorCQkJCX0JCQkJCQkJCQkJCQlcCisJCQl9CQkJCQkJCQkJCQkJCVwKKwkJCWlmIChfY2hJZHggPT0gQ0hfSFpfSURfTUFQX05VTSkJCQkJCVwKKwkJCQkoX2NoKSA9IDE7CQkJCQkJCQkJCQlcCisJCX13aGlsZSgwKQogCi0JaiA9IE9mZnNldDsKLQlmb3IgKGkgPSAwOyBpIDwgcENoRGVzcC0+TnVtT2ZDaDsgaSsrKQotCXsKLQkJY2hhbm5lbCA9IHBDaERlc3AtPkZpcnN0Q2hhbm5lbCArIGkgKiBpbmNyZW1lbnQ7Ci0JCWZvciAobD0wOyBsPE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGwrKykKLQkJewotCQkJaWYgKGNoYW5uZWwgPT0gcEFkLT5UeFBvd2VyW2xdLkNoYW5uZWwpCi0JCQl7Ci0JCQkJcEFkLT5DaGFubmVsTGlzdFtqXS5Qb3dlciA9IHBBZC0+VHhQb3dlcltsXS5Qb3dlcjsKLQkJCQlwQWQtPkNoYW5uZWxMaXN0W2pdLlBvd2VyMiA9IHBBZC0+VHhQb3dlcltsXS5Qb3dlcjI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGwgPT0gTUFYX05VTV9PRl9DSEFOTkVMUykKLQkJCWNvbnRpbnVlOwordm9pZCBCdWlsZENoYW5uZWxMaXN0RXgoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotCQlwQWQtPkNoYW5uZWxMaXN0W2pdLkNoYW5uZWwgPSBwQ2hEZXNwLT5GaXJzdENoYW5uZWwgKyBpICogaW5jcmVtZW50OwotCQlwQWQtPkNoYW5uZWxMaXN0W2pdLk1heFR4UHdyID0gcENoRGVzcC0+TWF4VHhQd3I7Ci0JCXBBZC0+Q2hhbm5lbExpc3Rbal0uRGZzUmVxID0gcENoRGVzcC0+RGZzUmVxOwotCQlqKys7Ci0JfQotCXBBZC0+Q2hhbm5lbExpc3ROdW0gPSBqOwordm9pZCBCdWlsZEJlYWNvbkNoTGlzdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCAqcEJ1ZiwgdW5zaWduZWQgbG9uZyAqcEJ1Zkxlbik7CiAKLQlyZXR1cm4gajsKLX0KK3ZvaWQgTl9DaGFubmVsQ2hlY2soc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotc3RhdGljIGlubGluZSBWT0lEIENyZWF0ZUNoTGlzdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQQ0hfUkVHSU9OIHBDaFJlZ2lvbiwKLQlJTiBVQ0hBUiBHZW9ncmFwaHkpCi17Ci0JSU5UIGk7Ci0JVUNIQVIgb2Zmc2V0ID0gMDsKLQlQQ0hfREVTUCBwQ2hEZXNwOwotCVVDSEFSIENoVHlwZTsKLQlVQ0hBUiBpbmNyZW1lbnQ7Cit2b2lkIE5fU2V0Q2VuQ2goc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotCWlmIChwQ2hSZWdpb24gPT0gTlVMTCkKLQkJcmV0dXJuOwordTggR2V0Q3VudHJ5TWF4VHhQd3Ioc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBjaGFubmVsKTsKIAotCUNoQmFuZENoZWNrKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsICZDaFR5cGUpOwotCi0JZm9yIChpPTA7IGk8MTA7IGkrKykKLQl7Ci0JCXBDaERlc3AgPSAmcENoUmVnaW9uLT5DaERlc3BbaV07Ci0JCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPT0gMCkKLQkJCWJyZWFrOwotCi0JCWlmIChDaFR5cGUgPT0gQkFORF81RykKLQkJewotCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA8PSAxNCkKLQkJCQljb250aW51ZTsKLQkJfQotCQllbHNlIGlmIChDaFR5cGUgPT0gQkFORF8yNEcpCi0JCXsKLQkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKLQkJCQljb250aW51ZTsKLQkJfQotCi0JCWlmICgocENoRGVzcC0+R2VvZ3JhcGh5ID09IEJPVEgpCi0JCQl8fCAocENoRGVzcC0+R2VvZ3JhcGh5ID09IEdlb2dyYXBoeSkpCi0gICAgICAgIHsKLQkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKLSAgICAgICAgICAgICAgICBpbmNyZW1lbnQgPSA0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGluY3JlbWVudCA9IDE7Ci0JCQlvZmZzZXQgPSBGaWxsQ2hMaXN0KHBBZCwgcENoRGVzcCwgb2Zmc2V0LCBpbmNyZW1lbnQpOwotICAgICAgICB9Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIFZPSUQgQnVpbGRDaGFubmVsTGlzdEV4KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVBDSF9SRUdJT04gcENoUmVnOwotCi0JcENoUmVnID0gR2V0Q2hSZWdpb24ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOwotCUNyZWF0ZUNoTGlzdChwQWQsIHBDaFJlZywgcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KTsKLX0KLQotc3RhdGljIGlubGluZSBWT0lEIEJ1aWxkQmVhY29uQ2hMaXN0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEJ1ZiwKLQlPVVQJUFVMT05HIHBCdWZMZW4pCi17Ci0JSU5UIGk7Ci0JVUxPTkcgVG1wTGVuOwotCVBDSF9SRUdJT04gcENoUmVnaW9uOwotCVBDSF9ERVNQIHBDaERlc3A7Ci0JVUNIQVIgQ2hUeXBlOwotCi0JcENoUmVnaW9uID0gR2V0Q2hSZWdpb24ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOwotCi0JaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlDaEJhbmRDaGVjayhwQWQtPkNvbW1vbkNmZy5QaHlNb2RlLCAmQ2hUeXBlKTsKLQkqcEJ1ZkxlbiA9IDA7Ci0KLQlmb3IgKGk9MDsgaTwxMDsgaSsrKQotCXsKLQkJcENoRGVzcCA9ICZwQ2hSZWdpb24tPkNoRGVzcFtpXTsKLQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKENoVHlwZSA9PSBCQU5EXzVHKQotCQl7Ci0JCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsIDw9IDE0KQotCQkJCWNvbnRpbnVlOwotCQl9Ci0JCWVsc2UgaWYgKENoVHlwZSA9PSBCQU5EXzI0RykKLQkJewotCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA+IDE0KQotCQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gQk9USCkKLQkJCXx8IChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KSkKLQkJewotCQkJTWFrZU91dGdvaW5nRnJhbWUocEJ1ZiArICpwQnVmTGVuLAkJJlRtcExlbiwKLQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgIAkmcENoRGVzcC0+Rmlyc3RDaGFubmVsLAotCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgCSZwQ2hEZXNwLT5OdW1PZkNoLAotCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgCSZwQ2hEZXNwLT5NYXhUeFB3ciwKLQkJCQkJCQkJRU5EX09GX0FSR1MpOwotCQkJKnBCdWZMZW4gKz0gVG1wTGVuOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIEJPT0xFQU4gSXNWYWxpZENoYW5uZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgY2hhbm5lbCkKLQotewotCUlOVCBpOwotCi0JZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykKLQl7Ci0JCWlmIChwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwgPT0gY2hhbm5lbCkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChpID09IHBBZC0+Q2hhbm5lbExpc3ROdW0pCi0JCXJldHVybiBGQUxTRTsKLQllbHNlCi0JCXJldHVybiBUUlVFOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgVUNIQVIgR2V0RXh0Q2goCi0JSU4gVUNIQVIgQ2hhbm5lbCwKLQlJTiBVQ0hBUiBEaXJlY3Rpb24pCi17Ci0JQ0hBUiBFeHRDaDsKLQotCWlmIChEaXJlY3Rpb24gPT0gRVhUQ0hBX0FCT1ZFKQotCQlFeHRDaCA9IENoYW5uZWwgKyA0OwotCWVsc2UKLQkJRXh0Q2ggPSAoQ2hhbm5lbCAtIDQpID4gMCA/IChDaGFubmVsIC0gNCkgOiAwOwotCi0JcmV0dXJuIEV4dENoOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgVk9JRCBOX0NoYW5uZWxDaGVjaygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQkvL1VDSEFSIENoYW5uZWxOdW0gPSBwQWQtPkNoYW5uZWxMaXN0TnVtOwotCVVDSEFSIENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpICYmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID09IEJXXzQwKSkKLQl7Ci0JCWlmIChDaGFubmVsID4gMTQpCi0JCXsKLQkJCWlmICgoQ2hhbm5lbCA9PSAzNikgfHwgKENoYW5uZWwgPT0gNDQpIHx8IChDaGFubmVsID09IDUyKSB8fCAoQ2hhbm5lbCA9PSA2MCkgfHwgKENoYW5uZWwgPT0gMTAwKSB8fCAoQ2hhbm5lbCA9PSAxMDgpIHx8Ci0JCQkgICAgKENoYW5uZWwgPT0gMTE2KSB8fCAoQ2hhbm5lbCA9PSAxMjQpIHx8IChDaGFubmVsID09IDEzMikgfHwgKENoYW5uZWwgPT0gMTQ5KSB8fCAoQ2hhbm5lbCA9PSAxNTcpKQotCQkJewotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQUJPVkU7Ci0JCQl9Ci0JCQllbHNlIGlmICgoQ2hhbm5lbCA9PSA0MCkgfHwgKENoYW5uZWwgPT0gNDgpIHx8IChDaGFubmVsID09IDU2KSB8fCAoQ2hhbm5lbCA9PSA2NCkgfHwgKENoYW5uZWwgPT0gMTA0KSB8fCAoQ2hhbm5lbCA9PSAxMTIpIHx8Ci0JCQkJCShDaGFubmVsID09IDEyMCkgfHwgKENoYW5uZWwgPT0gMTI4KSB8fCAoQ2hhbm5lbCA9PSAxMzYpIHx8IChDaGFubmVsID09IDE1MykgfHwgKENoYW5uZWwgPT0gMTYxKSkKLQkJCXsKLQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0JFTE9XOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCWRvCi0JCQl7Ci0JCQkJVUNIQVIgRXh0Q2g7Ci0JCQkJVUNIQVIgRGlyID0gcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQTsKLQkJCQlFeHRDaCA9IEdldEV4dENoKENoYW5uZWwsIERpcik7Ci0JCQkJaWYgKElzVmFsaWRDaGFubmVsKHBBZCwgRXh0Q2gpKQotCQkJCQlicmVhazsKLQotCQkJCURpciA9IChEaXIgPT0gRVhUQ0hBX0FCT1ZFKSA/IEVYVENIQV9CRUxPVyA6IEVYVENIQV9BQk9WRTsKLQkJCQlFeHRDaCA9IEdldEV4dENoKENoYW5uZWwsIERpcik7Ci0JCQkJaWYgKElzVmFsaWRDaGFubmVsKHBBZCwgRXh0Q2gpKQotCQkJCXsKLQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IERpcjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKLQkJCX0gd2hpbGUoRkFMU0UpOwotCi0JCQlpZiAoQ2hhbm5lbCA9PSAxNCkKLQkJCXsKLQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7Ci0JCQkJLy9wQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX05PTkU7CS8vIFdlIGRpZG4ndCBzZXQgdGhlIEV4dENoIGFzIE5PTkUgZHVlIHRvIGl0J2xsIHNldCBpbiBSVE1QU2V0SFQoKQotCQkJfQotCQl9Ci0JfQotCi0KLX0KLQotCi1zdGF0aWMgaW5saW5lIFZPSUQgTl9TZXRDZW5DaCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlpZiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0FCT1ZFKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gMTQpCi0JCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMTsKLQkJCWVsc2UKLQkJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAyOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgVUlOVDggR2V0Q3VudHJ5TWF4VHhQd3IoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUlOVDggY2hhbm5lbCkKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBjaGFubmVsKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKLQkJcmV0dXJuIDB4ZmY7Ci0JZWxzZQotCQlyZXR1cm4gcEFkLT5DaGFubmVsTGlzdFtpXS5NYXhUeFB3cjsKLX0KLSNlbmRpZiAvLyBfX0NITElTVF9IX18KLQorI2VuZGlmIC8qIF9fQ0hMSVNUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vMjg2MF9ydG1wX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uLzI4NjBfcnRtcF9pbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYzBmYjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vMjg2MF9ydG1wX2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDg5NyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCTI4NjBfcnRtcF9pbml0LmMKLQotCUFic3RyYWN0OgotCU1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLQktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlQYXVsIExpbiAgICAyMDAyLTA4LTAxICAgIGNyZWF0ZWQKLSAgICBKb2huIENoYW5nICAyMDA0LTA4LTIwICAgIFJUMjU2MS8yNjYxIHVzZSBzY2F0dGVyLWdhdGhlciBzY2hlbWUKLSAgICBKYW4gTGVlICAyMDA2LTA5LTE1ICAgIFJUMjg2MC4gQ2hhbmdlIGZvciA4MDIuMTFuICwgRUVQUk9NLCBMZWQsIEJBLCBIVC4KLSovCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlBbGxvY2F0ZSBETUEgbWVtb3J5IGJsb2NrcyBmb3Igc2VuZCwgcmVjZWl2ZQotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX1NVQ0NFU1MKLQkJTkRJU19TVEFUVVNfRkFJTFVSRQotCQlORElTX1NUQVRVU19SRVNPVVJDRVMKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMJUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JTkRJU19TVEFUVVMJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JVUxPTkcJCQlSaW5nQmFzZVBhSGlnaDsKLQlVTE9ORwkJCVJpbmdCYXNlUGFMb3c7Ci0JUFZPSUQJCQlSaW5nQmFzZVZhOwotCUlOVAkJCQlpbmRleCwgbnVtOwotCVBUWERfU1RSVUMJCXBUeEQ7Ci0JUFJYRF9TVFJVQwkJcFJ4RDsKLQlVTE9ORwkJCUVycm9yVmFsdWUgPSAwOwotCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKLQlQUlRNUF9ETUFCVUYJcERtYUJ1ZjsKLQlQTkRJU19QQUNLRVQJcFBhY2tldDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeVxuIikpOwotCWRvCi0JewotCQkvLwotCQkvLyBBbGxvY2F0ZSBhbGwgcmluZyBkZXNjcmlwdG9ycywgaW5jbHVkZSBUeEQsIFJ4RCwgTWdtdEQuCi0JCS8vIEFsdGhvdWdoIGVhY2ggc2l6ZSBpcyBkaWZmZXJlbnQsIHRvIHByZXZlbnQgY2FjaGVsaW5lIGFuZCBhbGlnbm1lbnQKLQkJLy8gaXNzdWUsIEkgaW50ZW50aW9uYWwgc2V0IHRoZW0gYWxsIHRvIDY0IGJ5dGVzLgotCQkvLwotCQlmb3IgKG51bT0wOyBudW08TlVNX09GX1RYX1JJTkc7IG51bSsrKQotCQl7Ci0JCQlVTE9ORyAgQnVmQmFzZVBhSGlnaDsKLQkJCVVMT05HICBCdWZCYXNlUGFMb3c7Ci0JCQlQVk9JRCAgQnVmQmFzZVZhOwotCi0JCQkvLwotCQkJLy8gQWxsb2NhdGUgVHggcmluZyBkZXNjcmlwdG9yJ3MgbWVtb3J5ICg1IFRYIHJpbmdzID0gNCBBQ3MgKyAxIEhDQ0EpCi0JCQkvLwotCQkJcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplID0gVFhfUklOR19TSVpFICogVFhEX1NJWkU7Ci0JCQlSVE1QX0FsbG9jYXRlVHhEZXNjTWVtb3J5KAotCQkJCXBBZCwKLQkJCQludW0sCi0JCQkJcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplLAotCQkJCUZBTFNFLAotCQkJCSZwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhLAotCQkJCSZwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKLQotCQkJaWYgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEgPT0gTlVMTCkKLQkJCXsKLQkJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOwotCQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKLQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIFplcm8gaW5pdCB0aGlzIG1lbW9yeSBibG9jawotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYSwgcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplKTsKLQotCQkJLy8gU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbgotCQkJUmluZ0Jhc2VQYUhpZ2ggPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NQYSk7Ci0JCQlSaW5nQmFzZVBhTG93ICA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKLQkJCVJpbmdCYXNlVmEgICAgID0gcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYTsKLQotCQkJLy8KLQkJCS8vIEFsbG9jYXRlIGFsbCAxc3QgVFhCdWYncyBtZW1vcnkgZm9yIHRoaXMgVHhSaW5nCi0JCQkvLwotCQkJcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NTaXplID0gVFhfUklOR19TSVpFICogVFhfRE1BXzFTVF9CVUZGRVJfU0laRTsKLQkJCVJUTVBfQWxsb2NhdGVGaXJzdFR4QnVmZmVyKAotCQkJCXBBZCwKLQkJCQludW0sCi0JCQkJcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NTaXplLAotCQkJCUZBTFNFLAotCQkJCSZwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhLAotCQkJCSZwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1BhKTsKLQotCQkJaWYgKHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEgPT0gTlVMTCkKLQkJCXsKLQkJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOwotCQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKLQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIFplcm8gaW5pdCB0aGlzIG1lbW9yeSBibG9jawotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSwgcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NTaXplKTsKLQotCQkJLy8gU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbgotCQkJQnVmQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1BhKTsKLQkJCUJ1ZkJhc2VQYUxvdyAgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NQYSk7Ci0JCQlCdWZCYXNlVmEgICAgID0gcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYTsKLQotCQkJLy8KLQkJCS8vIEluaXRpYWxpemUgVHggUmluZyBEZXNjcmlwdG9yIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlciBtZW1vcnkKLQkJCS8vCi0JCQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW251bV07Ci0JCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBUWF9SSU5HX1NJWkU7IGluZGV4KyspCi0JCQl7Ci0JCQkJcFR4UmluZy0+Q2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCQkJCXBUeFJpbmctPkNlbGxbaW5kZXhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0JCQkJLy8gSW5pdCBUeCBSaW5nIFNpemUsIFZhLCBQYSB2YXJpYWJsZXMKLQkJCQlwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1NpemUgPSBUWERfU0laRTsKLQkJCQlwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1ZhID0gUmluZ0Jhc2VWYTsKLQkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2gocFR4UmluZy0+Q2VsbFtpbmRleF0uQWxsb2NQYSwgUmluZ0Jhc2VQYUhpZ2gpOwotCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93IChwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhTG93KTsKLQotCQkJCS8vIFNldHVwIFR4IEJ1ZmZlciBzaXplICYgYWRkcmVzcy4gb25seSA4MDIuMTEgaGVhZGVyIHdpbGwgc3RvcmUgaW4gdGhpcyBzcGFjZQotCQkJCXBEbWFCdWYgPSAmcFR4UmluZy0+Q2VsbFtpbmRleF0uRG1hQnVmOwotCQkJCXBEbWFCdWYtPkFsbG9jU2l6ZSA9IFRYX0RNQV8xU1RfQlVGRkVSX1NJWkU7Ci0JCQkJcERtYUJ1Zi0+QWxsb2NWYSA9IEJ1ZkJhc2VWYTsKLQkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2gocERtYUJ1Zi0+QWxsb2NQYSwgQnVmQmFzZVBhSGlnaCk7Ci0JCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3cocERtYUJ1Zi0+QWxsb2NQYSwgQnVmQmFzZVBhTG93KTsKLQotCQkJCS8vIGxpbmsgdGhlIHByZS1hbGxvY2F0ZWQgVHhCdWYgdG8gVFhECi0JCQkJcFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1ZhOwotCQkJCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKLQkJCQkvLyBhZHZhbmNlIHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MKLQkJCQlwVHhELT5ETUFET05FID0gMTsKLQkJCQlSaW5nQmFzZVBhTG93ICs9IFRYRF9TSVpFOwotCQkJCVJpbmdCYXNlVmEgPSAoUFVDSEFSKSBSaW5nQmFzZVZhICsgVFhEX1NJWkU7Ci0KLQkJCQkvLyBhZHZhbmNlIHRvIG5leHQgVHhCdWYgYWRkcmVzcwotCQkJCUJ1ZkJhc2VQYUxvdyArPSBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFOwotCQkJCUJ1ZkJhc2VWYSA9IChQVUNIQVIpIEJ1ZkJhc2VWYSArIFRYX0RNQV8xU1RfQlVGRkVSX1NJWkU7Ci0JCQl9Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeFJpbmdbJWRdOiB0b3RhbCAlZCBlbnRyeSBhbGxvY2F0ZWRcbiIsIG51bSwgaW5kZXgpKTsKLQkJfQotCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1JFU09VUkNFUykKLQkJCWJyZWFrOwotCi0JCS8vCi0JCS8vIEFsbG9jYXRlIE1HTVQgcmluZyBkZXNjcmlwdG9yJ3MgbWVtb3J5IGV4Y2VwdCBUeCByaW5nIHdoaWNoIGFsbG9jYXRlZCBlYXJpbGVyCi0JCS8vCi0JCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSA9IE1HTVRfUklOR19TSVpFICogVFhEX1NJWkU7Ci0JCVJUTVBfQWxsb2NhdGVNZ210RGVzY01lbW9yeSgKLQkJCXBBZCwKLQkJCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSwKLQkJCUZBTFNFLAotCQkJJnBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsCi0JCQkmcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NQYSk7Ci0KLQkJaWYgKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEgPT0gTlVMTCkKLQkJewotCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKLQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKLQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCi0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSk7Ci0KLQkJLy8gU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbgotCQlSaW5nQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKLQkJUmluZ0Jhc2VQYUxvdyAgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NQYSk7Ci0JCVJpbmdCYXNlVmEgICAgID0gcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYTsKLQotCQkvLwotCQkvLyBJbml0aWFsaXplIE1HTVQgUmluZyBhbmQgYXNzb2NpYXRlZCBidWZmZXIgbWVtb3J5Ci0JCS8vCi0JCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1HTVRfUklOR19TSVpFOyBpbmRleCsrKQotCQl7Ci0JCQlwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0ID0gTlVMTDsKLQkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQkJCS8vIEluaXQgTUdNVCBSaW5nIFNpemUsIFZhLCBQYSB2YXJpYWJsZXMKLQkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NTaXplID0gVFhEX1NJWkU7Ci0JCQlwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmEgPSBSaW5nQmFzZVZhOwotCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NQYSwgUmluZ0Jhc2VQYUhpZ2gpOwotCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NQYSwgUmluZ0Jhc2VQYUxvdyk7Ci0KLQkJCS8vIE9mZnNldCB0byBuZXh0IHJpbmcgZGVzY3JpcHRvciBhZGRyZXNzCi0JCQlSaW5nQmFzZVBhTG93ICs9IFRYRF9TSVpFOwotCQkJUmluZ0Jhc2VWYSA9IChQVUNIQVIpIFJpbmdCYXNlVmEgKyBUWERfU0laRTsKLQotCQkJLy8gbGluayB0aGUgcHJlLWFsbG9jYXRlZCBUeEJ1ZiB0byBUWEQKLQkJCXBUeEQgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1ZhOwotCQkJcFR4RC0+RE1BRE9ORSA9IDE7Ci0KLQkJCS8vIG5vIHByZS1hbGxvY2F0ZWQgYnVmZmVyIHJlcXVpcmVkIGluIE1nbXRSaW5nIGZvciBzY2F0dGVyLWdhdGhlciBjYXNlCi0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUdNVCBSaW5nOiB0b3RhbCAlZCBlbnRyeSBhbGxvY2F0ZWRcbiIsIGluZGV4KSk7Ci0KLQkJLy8KLQkJLy8gQWxsb2NhdGUgUlggcmluZyBkZXNjcmlwdG9yJ3MgbWVtb3J5IGV4Y2VwdCBUeCByaW5nIHdoaWNoIGFsbG9jYXRlZCBlYXJpbGVyCi0JCS8vCi0JCXBBZC0+UnhEZXNjUmluZy5BbGxvY1NpemUgPSBSWF9SSU5HX1NJWkUgKiBSWERfU0laRTsKLQkJUlRNUF9BbGxvY2F0ZVJ4RGVzY01lbW9yeSgKLQkJCXBBZCwKLQkJCXBBZC0+UnhEZXNjUmluZy5BbGxvY1NpemUsCi0JCQlGQUxTRSwKLQkJCSZwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwKLQkJCSZwQWQtPlJ4RGVzY1JpbmcuQWxsb2NQYSk7Ci0KLQkJaWYgKHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhID09IE5VTEwpCi0JCXsKLQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7Ci0JCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyXG4iKSk7Ci0JCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8vIFplcm8gaW5pdCB0aGlzIG1lbW9yeSBibG9jawotCQlOZGlzWmVyb01lbW9yeShwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSk7Ci0KLQotCQlwcmludGsoIlJYIERFU0MgJXAgIHNpemUgPSAlbGRcbiIsIHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhLAotCQkJCQlwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplKTsKLQotCQkvLyBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uCi0JCVJpbmdCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+UnhEZXNjUmluZy5BbGxvY1BhKTsKLQkJUmluZ0Jhc2VQYUxvdyAgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOwotCQlSaW5nQmFzZVZhICAgICA9IHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhOwotCi0JCS8vCi0JCS8vIEluaXRpYWxpemUgUnggUmluZyBhbmQgYXNzb2NpYXRlZCBidWZmZXIgbWVtb3J5Ci0JCS8vCi0JCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFJYX1JJTkdfU0laRTsgaW5kZXgrKykKLQkJewotCQkJLy8gSW5pdCBSWCBSaW5nIFNpemUsIFZhLCBQYSB2YXJpYWJsZXMKLQkJCXBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jU2l6ZSA9IFJYRF9TSVpFOwotCQkJcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NWYSA9IFJpbmdCYXNlVmE7Ci0JCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NQYSwgUmluZ0Jhc2VQYUhpZ2gpOwotCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jUGEsIFJpbmdCYXNlUGFMb3cpOwotCi0JCQkvLyBPZmZzZXQgdG8gbmV4dCByaW5nIGRlc2NyaXB0b3IgYWRkcmVzcwotCQkJUmluZ0Jhc2VQYUxvdyArPSBSWERfU0laRTsKLQkJCVJpbmdCYXNlVmEgPSAoUFVDSEFSKSBSaW5nQmFzZVZhICsgUlhEX1NJWkU7Ci0KLQkJCS8vIFNldHVwIFJ4IGFzc29jaWF0ZWQgQnVmZmVyIHNpemUgJiBhbGxvY2F0ZSBzaGFyZSBtZW1vcnkKLQkJCXBEbWFCdWYgPSAmcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uRG1hQnVmOwotCQkJcERtYUJ1Zi0+QWxsb2NTaXplID0gUlhfQlVGRkVSX0FHR1JFU0laRTsKLQkJCXBQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIoCi0JCQkJcEFkLAotCQkJCXBEbWFCdWYtPkFsbG9jU2l6ZSwKLQkJCQlGQUxTRSwKLQkJCQkmcERtYUJ1Zi0+QWxsb2NWYSwKLQkJCQkmcERtYUJ1Zi0+QWxsb2NQYSk7Ci0KLQkJCS8qIGtlZXAgYWxsb2NhdGVkIHJ4IHBhY2tldCAqLwotCQkJcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OwotCi0JCQkvLyBFcnJvciBoYW5kbGluZwotCQkJaWYgKHBEbWFCdWYtPkFsbG9jVmEgPT0gTlVMTCkKLQkJCXsKLQkJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOwotCQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBSeFJpbmcncyAxc3QgYnVmZmVyXG4iKSk7Ci0JCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvLyBaZXJvIGluaXQgdGhpcyBtZW1vcnkgYmxvY2sKLQkJCU5kaXNaZXJvTWVtb3J5KHBEbWFCdWYtPkFsbG9jVmEsIHBEbWFCdWYtPkFsbG9jU2l6ZSk7Ci0KLQkJCS8vIFdyaXRlIFJ4RCBidWZmZXIgYWRkcmVzcyAmIGFsbG9jYXRlZCBidWZmZXIgbGVuZ3RoCi0JCQlwUnhEID0gKFBSWERfU1RSVUMpIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmE7Ci0JCQlwUnhELT5TRFAwID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocERtYUJ1Zi0+QWxsb2NQYSk7Ci0JCQlwUnhELT5ERE9ORSA9IDA7Ci0JCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSeCBSaW5nOiB0b3RhbCAlZCBlbnRyeSBhbGxvY2F0ZWRcbiIsIGluZGV4KSk7Ci0KLQl9CXdoaWxlIChGQUxTRSk7Ci0KLQotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkZyYWdGcmFtZSwgc2l6ZW9mKEZSQUdNRU5UX0ZSQU1FKSk7Ci0JcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPSAgUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfTk9STVNJWkUpOwotCi0JaWYgKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0ID09IE5VTEwpCi0JewotCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0JfQotCi0JaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJLy8gTG9nIGVycm9yIGluZm9yYW10aW9uCi0JCU5kaXNXcml0ZUVycm9yTG9nRW50cnkoCi0JCQlwQWQtPkFkYXB0ZXJIYW5kbGUsCi0JCQlORElTX0VSUk9SX0NPREVfT1VUX09GX1JFU09VUkNFUywKLQkJCTEsCi0JCQlFcnJvclZhbHVlKTsKLQl9Ci0KLQlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnksIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7Ci0JcmV0dXJuIFN0YXR1czsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJSW5pdGlhbGl6ZSB0cmFuc21pdCBkYXRhIHN0cnVjdHVyZXMKLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCU5vdGU6Ci0JCUluaXRpYWxpemUgYWxsIHRyYW5zbWl0IHJlbGVhdGVkIHByaXZhdGUgYnVmZmVyLCBpbmNsdWRlIHRob3NlIGRlZmluZQotCQlpbiBSVE1QX0FEQVBURVIgc3RydWN0dXJlIGFuZCBhbGwgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZXMuCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECU5JQ0luaXRUeFJ4UmluZ0FuZEJhY2tsb2dRdWV1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQkvL1dQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOwotCWludCBpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tPiBOSUNJbml0VHhSeFJpbmdBbmRCYWNrbG9nUXVldWVcbiIpKTsKLQotCS8vIEluaXRpYWxpemUgYWxsIHRyYW5zbWl0IHJlbGF0ZWQgc29mdHdhcmUgcXVldWVzCi0JSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdKTsKLQlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CS10pOwotCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXSk7Ci0JSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dKTsKLQlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+VHhTd1F1ZXVlW1FJRF9IQ0NBXSk7Ci0KLQkvLyBJbml0IFJYIFJpbmcgaW5kZXggcG9pbnRlcgotCXBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID0gMDsKLQlwQWQtPlJ4UmluZy5SeENwdUlkeCA9IFJYX1JJTkdfU0laRSAtIDE7Ci0KLQkvLyBJbml0IFRYIHJpbmdzIGluZGV4IHBvaW50ZXIKLQkJZm9yIChpPTA7IGk8TlVNX09GX1RYX1JJTkc7IGkrKykKLQkJewotCQkJcEFkLT5UeFJpbmdbaV0uVHhTd0ZyZWVJZHggPSAwOwotCQkJcEFkLT5UeFJpbmdbaV0uVHhDcHVJZHggPSAwOwotCQl9Ci0KLQkvLyBpbml0IE1HTVQgcmluZyBpbmRleCBwb2ludGVyCi0JcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA9IDA7Ci0JcEFkLT5NZ210UmluZy5UeENwdUlkeCA9IDA7Ci0KLQlwQWQtPlByaXZhdGVJbmZvLlR4UmluZ0Z1bGxDbnQgICAgICAgPSAwOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlSZXNldCBOSUMgQXNpY3MuIENhbGwgYWZ0ZXIgcmVzdCBETUEuIFNvIHJlc2V0IFRYX0NUWF9JRFggdG8gemVyby4KLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0JCVJlc2V0IE5JQyB0byBpbml0aWFsIHN0YXRlIEFTIElTIHN5c3RlbSBib290IHVwIHRpbWUuCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBSaW5nQ2xlYW5VcCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVJpbmdUeXBlKQotewotCVBUWERfU1RSVUMJCXBUeEQ7Ci0JUFJYRF9TVFJVQwkJcFJ4RDsKLQlQUVVFVUVfRU5UUlkJcEVudHJ5OwotCVBORElTX1BBQ0tFVAlwUGFja2V0OwotCWludAkJCQlpOwotCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QUmluZ0NsZWFuVXAoUmluZ0lkeD0lZCwgUGVuZGluZy1ORElTPSVsZClcbiIsIFJpbmdUeXBlLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBlbmRpbmdOZGlzUGFja2V0Q291bnQpKTsKLQlzd2l0Y2ggKFJpbmdUeXBlKQotCXsKLQkJY2FzZSBRSURfQUNfQks6Ci0JCWNhc2UgUUlEX0FDX0JFOgotCQljYXNlIFFJRF9BQ19WSToKLQkJY2FzZSBRSURfQUNfVk86Ci0JCWNhc2UgUUlEX0hDQ0E6Ci0JCQlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0JCQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1JpbmdUeXBlXTsKLQotCQkJLy8gV2UgaGF2ZSB0byBjbGVhbiBhbGwgZGVzY3JpcHRvcnMgaW4gY2FzZSBzb21lIGVycm9yIGhhcHBlbmVkIHdpdGggcmVzZXQKLQkJCWZvciAoaT0wOyBpPFRYX1JJTkdfU0laRTsgaSsrKSAvLyBXZSBoYXZlIHRvIHNjYW4gYWxsIFRYIHJpbmcKLQkJCXsKLQkJCQlwVHhEICA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW2ldLkFsbG9jVmE7Ci0KLQkJCQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgcFR4UmluZy0+Q2VsbFtpXS5wTmRpc1BhY2tldDsKLQkJCQkvLyByZWxlYXNlIHNjYXR0ZXItYW5kLWdhdGhlciBORElTX1BBQ0tFVAotCQkJCWlmIChwUGFja2V0KQotCQkJCXsKLQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKLQkJCQl9Ci0KLQkJCQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQ7Ci0JCQkJLy8gcmVsZWFzZSBzY2F0dGVyLWFuZC1nYXRoZXIgTkRJU19QQUNLRVQKLQkJCQlpZiAocFBhY2tldCkKLQkJCQl7Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCQkJcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCQkJCX0KLQkJCX0KLQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFJpbmdUeXBlICogMHgxMCwgJnBUeFJpbmctPlR4RG1hSWR4KTsKLQkJCXBUeFJpbmctPlR4U3dGcmVlSWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7Ci0JCQlwVHhSaW5nLT5UeENwdUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBSaW5nVHlwZSAqIDB4MTAsIHBUeFJpbmctPlR4Q3B1SWR4KTsKLQotCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0JCQlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0JCQl3aGlsZSAocEFkLT5UeFN3UXVldWVbUmluZ1R5cGVdLkhlYWQgIT0gTlVMTCkKLQkJCXsKLQkJCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBBZC0+VHhTd1F1ZXVlW1JpbmdUeXBlXSk7Ci0JCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJlbGVhc2UgMSBORElTIHBhY2tldCBmcm9tIHMvdyBiYWNrbG9nIHF1ZXVlXG4iKSk7Ci0JCQl9Ci0JCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUUlEX01HTVQ6Ci0JCQkvLyBXZSBoYXZlIHRvIGNsZWFuIGFsbCBkZXNjcmlwdG9ycyBpbiBjYXNlIHNvbWUgZXJyb3IgaGFwcGVuZWQgd2l0aCByZXNldAotCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOwotCi0JCQlmb3IgKGk9MDsgaTxNR01UX1JJTkdfU0laRTsgaSsrKQotCQkJewotCQkJCXBUeEQgID0gKFBUWERfU1RSVUMpIHBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOwotCi0JCQkJcFBhY2tldCA9IChQTkRJU19QQUNLRVQpIHBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmRpc1BhY2tldDsKLQkJCQkvLyBybGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIE5ESVNfUEFDS0VUCi0JCQkJaWYgKHBQYWNrZXQpCi0JCQkJewotCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJfQotCQkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJCQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldDsKLQkJCQkvLyByZWxlYXNlIHNjYXR0ZXItYW5kLWdhdGhlciBORElTX1BBQ0tFVAotCQkJCWlmIChwUGFja2V0KQotCQkJCXsKLQkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCX0KLQkJCQlwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQotCQkJfQotCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX01HTVREVFhfSURYLCAmcEFkLT5NZ210UmluZy5UeERtYUlkeCk7Ci0JCQlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gcEFkLT5NZ210UmluZy5UeERtYUlkeDsKLQkJCXBBZC0+TWdtdFJpbmcuVHhDcHVJZHggPSBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4OwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUdNVENUWF9JRFgsIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgpOwotCi0JCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50ID0gMDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUUlEX1JYOgotCQkJLy8gV2UgaGF2ZSB0byBjbGVhbiBhbGwgZGVzY3JpcHRvcnMgaW4gY2FzZSBzb21lIGVycm9yIGhhcHBlbmVkIHdpdGggcmVzZXQKLQkJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+UnhSaW5nTG9jayk7Ci0KLQkJCWZvciAoaT0wOyBpPFJYX1JJTkdfU0laRTsgaSsrKQotCQkJewotCQkJCXBSeEQgID0gKFBSWERfU1RSVUMpIHBBZC0+UnhSaW5nLkNlbGxbaV0uQWxsb2NWYTsKLQkJCQlwUnhELT5ERE9ORSA9IDAgOwotCQkJfQotCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0RSWF9JRFgsICZwQWQtPlJ4UmluZy5SeERtYUlkeCk7Ci0JCQlwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCA9IHBBZC0+UnhSaW5nLlJ4RG1hSWR4OwotCQkJcEFkLT5SeFJpbmcuUnhDcHVJZHggPSAoKHBBZC0+UnhSaW5nLlJ4RG1hSWR4ID09IDApID8gKFJYX1JJTkdfU0laRS0xKSA6IChwQWQtPlJ4UmluZy5SeERtYUlkeC0xKSk7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9DUlhfSURYLCBwQWQtPlJ4UmluZy5SeENwdUlkeCk7Ci0KLQkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+UnhSaW5nTG9jayk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotfQotCi0KLU5ESVNfU1RBVFVTIEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KAotCUlOIFBWT0lECWhhbmRsZSwKLQlPVVQJUFZPSUQJKnBwQWQpCi17Ci0JUFBDSV9ERVYgcGNpX2RldjsKLQlkbWFfYWRkcl90CSpwaHlfYWRkcjsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSkgaGFuZGxlOwotCi0JcGNpX2RldiA9IHBPYmotPnBjaV9kZXY7Ci0JcGh5X2FkZHIgPSAmcE9iai0+cEFkX3BhOwotCi0JKnBwQWQgPSAoUFZPSUQpdm1hbGxvYyhzaXplb2YoUlRNUF9BREFQVEVSKSk7IC8vcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2Rldiwgc2l6ZW9mKFJUTVBfQURBUFRFUiksIHBoeV9hZGRyKTsKLQotCWlmICgqcHBBZCkKLQl7Ci0JCU5kaXNaZXJvTWVtb3J5KCpwcEFkLCBzaXplb2YoUlRNUF9BREFQVEVSKSk7Ci0JCSgoUFJUTVBfQURBUFRFUikqcHBBZCktPk9TX0Nvb2tpZSA9IGhhbmRsZTsKLQkJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLX0KLQotCi12b2lkIFJUTVBfQWxsb2NhdGVUeERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUlOVAlJbmRleCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpCi17Ci0JUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpUENJX0FMTE9DX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldixzaXplb2YoY2hhcikqTGVuZ3RoLCBQaHlzaWNhbEFkZHJlc3MpOwotCi19Ci0KLXZvaWQgUlRNUF9BbGxvY2F0ZU1nbXREZXNjTWVtb3J5KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKLXsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRClQQ0lfQUxMT0NfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LHNpemVvZihjaGFyKSpMZW5ndGgsIFBoeXNpY2FsQWRkcmVzcyk7Ci0KLX0KLQotdm9pZCBSVE1QX0FsbG9jYXRlUnhEZXNjTWVtb3J5KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKLXsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRClQQ0lfQUxMT0NfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LHNpemVvZihjaGFyKSpMZW5ndGgsIFBoeXNpY2FsQWRkcmVzcyk7Ci0KLX0KLQotdm9pZCBSVE1QX0ZyZWVSeERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCVBWT0lECVZpcnR1YWxBZGRyZXNzLAotCUlOCU5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpCi17Ci0JUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQlQQ0lfRlJFRV9DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsIExlbmd0aCwgVmlydHVhbEFkZHJlc3MsIFBoeXNpY2FsQWRkcmVzcyk7Ci19Ci0KLQotdm9pZCBSVE1QX0FsbG9jYXRlRmlyc3RUeEJ1ZmZlcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVSU5UCUluZGV4LAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKLXsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRClQQ0lfQUxMT0NfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LHNpemVvZihjaGFyKSpMZW5ndGgsIFBoeXNpY2FsQWRkcmVzcyk7Ci19Ci0KLS8qCi0gKiBGVU5DVElPTjogQWxsb2NhdGUgYSBjb21tb24gYnVmZmVyIGZvciBETUEKLSAqIEFSR1VNRU5UUzoKLSAqICAgICBBZGFwdGVySGFuZGxlOiAgQWRhcHRlckhhbmRsZQotICogICAgIExlbmd0aDogIE51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQotICogICAgIENhY2hlZDogIFdoZXRoZXIgb3Igbm90IHRoZSBtZW1vcnkgY2FuIGJlIGNhY2hlZAotICogICAgIFZpcnR1YWxBZGRyZXNzOiAgUG9pbnRlciB0byBtZW1vcnkgaXMgcmV0dXJuZWQgaGVyZQotICogICAgIFBoeXNpY2FsQWRkcmVzczogIFBoeXNpY2FsIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB2aXJ0dWFsIGFkZHJlc3MKLSAqLwotCi12b2lkIFJUTVBfQWxsb2NhdGVTaGFyZWRNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQotewotCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKVBDSV9BTExPQ19DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKLX0KLQotVk9JRCBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKQotewotCWludCBpbmRleCwgbnVtICwgajsKLQlQUlRNUF9UWF9SSU5HIHBUeFJpbmc7Ci0JUFRYRF9TVFJVQwkgIHBUeEQ7Ci0JUE5ESVNfUEFDS0VUICBwUGFja2V0OwotCXVuc2lnbmVkIGludCAgSXJxRmxhZ3M7Ci0KLQlQT1NfQ09PS0lFIHBPYmogPShQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5XG4iKSk7Ci0KLQkvLyBGcmVlIFR4U3dRdWV1ZSBQYWNrZXQKLQlmb3IgKGluZGV4PTA7IGluZGV4IDxOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykKLQl7Ci0JCVBRVUVVRV9FTlRSWSBwRW50cnk7Ci0JCVBORElTX1BBQ0tFVCBwUGFja2V0OwotCQlQUVVFVUVfSEVBREVSICAgcFF1ZXVlOwotCi0JCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQkJcFF1ZXVlID0gJnBBZC0+VHhTd1F1ZXVlW2luZGV4XTsKLQkJd2hpbGUgKHBRdWV1ZS0+SGVhZCkKLQkJewotCQkJcEVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKHBRdWV1ZSk7Ci0JCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCX0KLQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0JfQotCi0JLy8gRnJlZSBUeCBSaW5nIFBhY2tldAotCWZvciAoaW5kZXg9MDtpbmRleDwgTlVNX09GX1RYX1JJTkc7aW5kZXgrKykKLQl7Ci0JCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbaW5kZXhdOwotCi0JCWZvciAoaj0wOyBqPCBUWF9SSU5HX1NJWkU7IGorKykKLQkJewotCQkJcFR4RCA9IChQVFhEX1NUUlVDKSAocFR4UmluZy0+Q2VsbFtqXS5BbGxvY1ZhKTsKLQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW2pdLnBOZGlzUGFja2V0OwotCi0JCQlpZiAocFBhY2tldCkKLQkJCXsKLSAgICAgICAgICAgIAlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCX0KLQkJCS8vQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCi0JCQlwVHhSaW5nLT5DZWxsW2pdLnBOZGlzUGFja2V0ID0gTlVMTDsKLQotCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbal0ucE5leHROZGlzUGFja2V0OwotCi0JCQlpZiAocFBhY2tldCkKLQkJCXsKLSAgICAgICAgICAgIAlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCX0KLQkJCS8vQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJcFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQotCQl9Ci0JfQotCi0JZm9yIChpbmRleCA9IFJYX1JJTkdfU0laRSAtIDEgOyBpbmRleCA+PSAwOyBpbmRleC0tKQotCXsKLQkJaWYgKChwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5EbWFCdWYuQWxsb2NWYSkgJiYgKHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0KSkKLQkJewotCQkJUENJX1VOTUFQX1NJTkdMRShwT2JqLT5wY2lfZGV2LCBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5EbWFCdWYuQWxsb2NQYSwgcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uRG1hQnVmLkFsbG9jU2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCX0KLQl9Ci0JTmRpc1plcm9NZW1vcnkocEFkLT5SeFJpbmcuQ2VsbCwgUlhfUklOR19TSVpFICogc2l6ZW9mKFJUTVBfRE1BQ0IpKTsKLQotCWlmIChwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSkKLSAgICB7Ci0gICAgCVBDSV9GUkVFX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldiwgcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSwgcEFkLT5SeERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+UnhEZXNjUmluZy5BbGxvY1BhKTsKLSAgICB9Ci0gICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+UnhEZXNjUmluZywgc2l6ZW9mKFJUTVBfRE1BQlVGKSk7Ci0KLQlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSkKLQl7Ci0JCVBDSV9GUkVFX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldiwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplLAlwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhLCBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKLQl9Ci0JTmRpc1plcm9NZW1vcnkoJnBBZC0+TWdtdERlc2NSaW5nLCBzaXplb2YoUlRNUF9ETUFCVUYpKTsKLQotCWZvciAobnVtID0gMDsgbnVtIDwgTlVNX09GX1RYX1JJTkc7IG51bSsrKQotCXsKLSAgICAJaWYgKHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEpCi0JICAgIHsKLQkgICAgCVBDSV9GUkVFX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldiwgcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NTaXplLCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1BhKTsKLQkgICAgfQotCSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5UeEJ1ZlNwYWNlW251bV0sIHNpemVvZihSVE1QX0RNQUJVRikpOwotCi0gICAgCWlmIChwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhKQotCSAgICB7Ci0JICAgIAlQQ0lfRlJFRV9DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsIHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jU2l6ZSwgcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYSwgcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NQYSk7Ci0JICAgIH0KLQkgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+VHhEZXNjUmluZ1tudW1dLCBzaXplb2YoUlRNUF9ETUFCVUYpKTsKLQl9Ci0KLQlpZiAocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQpCi0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gUlRNUEZyZWVUeFJ4UmluZ01lbW9yeVxuIikpOwotfQotCi0KLS8qCi0gKiBGVU5DVElPTjogQWxsb2NhdGUgYSBwYWNrZXQgYnVmZmVyIGZvciBETUEKLSAqIEFSR1VNRU5UUzoKLSAqICAgICBBZGFwdGVySGFuZGxlOiAgQWRhcHRlckhhbmRsZQotICogICAgIExlbmd0aDogIE51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQotICogICAgIENhY2hlZDogIFdoZXRoZXIgb3Igbm90IHRoZSBtZW1vcnkgY2FuIGJlIGNhY2hlZAotICogICAgIFZpcnR1YWxBZGRyZXNzOiAgUG9pbnRlciB0byBtZW1vcnkgaXMgcmV0dXJuZWQgaGVyZQotICogICAgIFBoeXNpY2FsQWRkcmVzczogIFBoeXNpY2FsIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB2aXJ0dWFsIGFkZHJlc3MKLSAqIE5vdGVzOgotICogICAgIENhY2hlZCBpcyBpZ25vcmVkOiBhbHdheXMgY2FjaGVkIG1lbW9yeQotICovCi1QTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKLXsKLQlQTkRJU19QQUNLRVQgcGt0OwotCi0JcGt0ID0gUlRQS1RfVE9fT1NQS1QoREVWX0FMTE9DX1NLQihMZW5ndGgpKTsKLQotCWlmIChwa3QgPT0gTlVMTCkgewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjYW4ndCBhbGxvY2F0ZSByeCAlbGQgc2l6ZSBwYWNrZXRcbiIsTGVuZ3RoKSk7Ci0JfQotCi0JaWYgKHBrdCkgewotCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKHBrdCwgUEtUU1JDX05ESVMpOwotCQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpIFJUUEtUX1RPX09TUEtUKHBrdCktPmRhdGE7Ci0JCSpQaHlzaWNhbEFkZHJlc3MgPSBQQ0lfTUFQX1NJTkdMRShwQWQsICpWaXJ0dWFsQWRkcmVzcywgTGVuZ3RoLCAtMSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQl9IGVsc2UgewotCQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpIE5VTEw7Ci0JCSpQaHlzaWNhbEFkZHJlc3MgPSAoTkRJU19QSFlTSUNBTF9BRERSRVNTKSBOVUxMOwotCX0KLQotCXJldHVybiAoUE5ESVNfUEFDS0VUKSBwa3Q7Ci19Ci0KLQotVk9JRCBJbnZhbGlkX1JlbWFpbmluZ19QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JIFVMT05HIFZpcnR1YWxBZGRyZXNzKQotewotCU5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3M7Ci0KLQlQaHlzaWNhbEFkZHJlc3MgPSBQQ0lfTUFQX1NJTkdMRShwQWQsICh2b2lkICopKFZpcnR1YWxBZGRyZXNzKzE2MDApLCBSWF9CVUZGRVJfTk9STVNJWkUtMTYwMCwgLTEsIFBDSV9ETUFfRlJPTURFVklDRSk7Ci19Ci0KLVBORElTX1BBQ0tFVCBHZXRQYWNrZXRGcm9tUnhSaW5nKAotCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJCVBSVDI4WFhfUlhEX1NUUlVDCXBTYXZlUnhELAotCU9VVAkJQk9PTEVBTgkJCSpwYlJlc2NoZWR1bGUsCi0JSU4gT1VUCVVJTlQzMgkJCSpwUnhQZW5kaW5nKQotewotCVBSWERfU1RSVUMJCQkJcFJ4RDsKLQlQTkRJU19QQUNLRVQJCQlwUnhQYWNrZXQgPSBOVUxMOwotCVBORElTX1BBQ0tFVAkJCXBOZXdQYWNrZXQ7Ci0JUFZPSUQJCQkJCUFsbG9jVmE7Ci0JTkRJU19QSFlTSUNBTF9BRERSRVNTCUFsbG9jUGE7Ci0JQk9PTEVBTgkJCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKLQotCVJUTVBfU0VNX0xPQ0soJnBBZC0+UnhSaW5nTG9jayk7Ci0KLQlpZiAoKnBSeFBlbmRpbmcgPT0gMCkKLQl7Ci0JCS8vIEdldCBob3cgbWF5IHBhY2tldHMgaGFkIGJlZW4gcmVjZWl2ZWQKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9EUlhfSURYICwgJnBBZC0+UnhSaW5nLlJ4RG1hSWR4KTsKLQotCQlpZiAocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPT0gcEFkLT5SeFJpbmcuUnhEbWFJZHgpCi0JCXsKLQkJCS8vIG5vIG1vcmUgcnggcGFja2V0cwotCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCS8vIGdldCByeCBwZW5kaW5nIGNvdW50Ci0JCWlmIChwQWQtPlJ4UmluZy5SeERtYUlkeCA+IHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4KQotCQkJKnBSeFBlbmRpbmcgPSBwQWQtPlJ4UmluZy5SeERtYUlkeCAtIHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4OwotCQllbHNlCi0JCQkqcFJ4UGVuZGluZwk9IHBBZC0+UnhSaW5nLlJ4RG1hSWR4ICsgUlhfUklOR19TSVpFIC0gcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHg7Ci0KLQl9Ci0KLQkvLyBQb2ludCB0byBSeCBpbmRleGVkIHJ4IHJpbmcgZGVzY3JpcHRvcgotCXBSeEQgPSAoUFJYRF9TVFJVQykgcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uQWxsb2NWYTsKLQotCWlmIChwUnhELT5ERE9ORSA9PSAwKQotCXsKLQkJKnBSeFBlbmRpbmcgPSAwOwotCQkvLyBETUFJbmR4IGhhZCBkb25lIGJ1dCBERE9ORSBiaXQgbm90IHJlYWR5Ci0JCWJSZXNjaGVkdWxlID0gVFJVRTsKLQkJZ290byBkb25lOwotCX0KLQotCi0JLy8gcmV0dXJuIHJ4IGRlc2NyaXB0b3IKLQlOZGlzTW92ZU1lbW9yeShwU2F2ZVJ4RCwgcFJ4RCwgUlhEX1NJWkUpOwotCi0JcE5ld1BhY2tldCA9IFJUTVBfQWxsb2NhdGVSeFBhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9BR0dSRVNJWkUsIEZBTFNFLCAmQWxsb2NWYSwgJkFsbG9jUGEpOwotCi0JaWYgKHBOZXdQYWNrZXQpCi0JewotCQkvLyB1bm1hcCB0aGUgcnggYnVmZmVyCi0JCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NQYSwKLQkJCQkJIHBBZC0+UnhSaW5nLkNlbGxbcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHhdLkRtYUJ1Zi5BbGxvY1NpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCXBSeFBhY2tldCA9IHBBZC0+UnhSaW5nLkNlbGxbcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHhdLnBOZGlzUGFja2V0OwotCi0JCXBBZC0+UnhSaW5nLkNlbGxbcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHhdLkRtYUJ1Zi5BbGxvY1NpemUJPSBSWF9CVUZGRVJfQUdHUkVTSVpFOwotCQlwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5wTmRpc1BhY2tldAkJPSAoUE5ESVNfUEFDS0VUKSBwTmV3UGFja2V0OwotCQlwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NWYQk9IEFsbG9jVmE7Ci0JCXBBZC0+UnhSaW5nLkNlbGxbcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHhdLkRtYUJ1Zi5BbGxvY1BhCT0gQWxsb2NQYTsKLQkJLyogdXBkYXRlIFNEUDAgdG8gbmV3IGJ1ZmZlciBvZiByeCBwYWNrZXQgKi8KLQkJcFJ4RC0+U0RQMCA9IEFsbG9jUGE7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vcHJpbnRrKCJObyBSeCBCdWZmZXJcbiIpOwotCQlwUnhQYWNrZXQgPSBOVUxMOwotCQliUmVzY2hlZHVsZSA9IFRSVUU7Ci0JfQotCi0JcFJ4RC0+RERPTkUgPSAwOwotCi0JLy8gaGFkIGhhbmRsZWQgb25lIHJ4IHBhY2tldAotCSpwUnhQZW5kaW5nID0gKnBSeFBlbmRpbmcgLSAxOwotCi0JLy8gdXBkYXRlIHJ4IGRlc2NyaXB0b3IgYW5kIGtpY2sgcngKLQlJTkNfUklOR19JTkRFWChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCwgUlhfUklOR19TSVpFKTsKLQotCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gKHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID09IDApID8gKFJYX1JJTkdfU0laRS0xKSA6IChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeC0xKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9DUlhfSURYLCBwQWQtPlJ4UmluZy5SeENwdUlkeCk7Ci0KLWRvbmU6Ci0JUlRNUF9TRU1fVU5MT0NLKCZwQWQtPlJ4UmluZ0xvY2spOwotCSpwYlJlc2NoZWR1bGUgPSBiUmVzY2hlZHVsZTsKLQlyZXR1cm4gcFJ4UGFja2V0OwotfQotLyogRW5kIG9mIDI4NjBfcnRtcF9pbml0LmMgKi8KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9hY3Rpb24uYwppbmRleCAyNTZjYjY3Li41NmFkMjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9hY3Rpb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9hY3Rpb24uYwpAQCAtMzksMTAgKzM5LDcgQEAKICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKICNpbmNsdWRlICJhY3Rpb24uaCIKIAotCi1zdGF0aWMgVk9JRCBSZXNlcnZlZEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworc3RhdGljIHZvaWQgUmVzZXJ2ZWRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAogLyoKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNjEsNzUgKzU4LDg5IEBACiAgICAgICAgIE1UMl9DTFMzRVJSICAgICAgICAgICAgICBjbHMzZXJyX2FjdGlvbgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgQWN0aW9uU3RhdGVNYWNoaW5lSW5pdCgKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLSAgICBJTiAgU1RBVEVfTUFDSElORSAqUywKLSAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit2b2lkIEFjdGlvblN0YXRlTWFjaGluZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTLAorCQkJICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKIHsKLQlTdGF0ZU1hY2hpbmVJbml0KFMsIChTVEFURV9NQUNISU5FX0ZVTkMgKilUcmFucywgTUFYX0FDVF9TVEFURSwgTUFYX0FDVF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQUNUX0lETEUsIEFDVF9NQUNISU5FX0JBU0UpOworCVN0YXRlTWFjaGluZUluaXQoUywgKFNUQVRFX01BQ0hJTkVfRlVOQyAqKSBUcmFucywgTUFYX0FDVF9TVEFURSwKKwkJCSBNQVhfQUNUX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQykgRHJvcCwgQUNUX0lETEUsCisJCQkgQUNUX01BQ0hJTkVfQkFTRSk7CiAKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1NQRUNUUlVNX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclNwZWN0cnVtQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1FPU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJRT1NBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfU1BFQ1RSVU1fQ0FURSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJTcGVjdHJ1bUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9RT1NfQ0FURSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJRT1NBY3Rpb24pOwogCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9ETFNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylSZXNlcnZlZEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9ETFNfQ0FURSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFJlc2VydmVkQWN0aW9uKTsKIAotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQkFBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfSFRfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVySFRBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfQUREX0JBX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUFEREJBQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVERUxCQUFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9SRUNfREVMQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lREVMQkFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfQkFfQ0FURSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJCQUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9IVF9DQVRFLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlckhUQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX0FERF9CQV9DQVRFLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgTWxtZUFEREJBQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgTWxtZURFTEJBQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX1JFQ19ERUxCQV9DQVRFLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgTWxtZURFTEJBQWN0aW9uKTsKIAotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfUFVCTElDX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclB1YmxpY0FjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9STV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJSTUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9QVUJMSUNfQ0FURSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJQdWJsaWNBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfUk1fQ0FURSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJSTUFjdGlvbik7CiAKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX1FPU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVRT1NBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfRExTX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURMU0FjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfQUNUX0lOVkFMSUQsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUludmFsaWRBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfUU9TX0NBVEUsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBNbG1lUU9TQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX0RMU19DQVRFLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgTWxtZURMU0FjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfQUNUX0lOVkFMSUQsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBNbG1lSW52YWxpZEFjdGlvbik7CiB9CiAKLVZPSUQgTWxtZUFEREJBQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLQordm9pZCBNbG1lQUREQkFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCU1MTUVfQUREQkFfUkVRX1NUUlVDVCAqcEluZm87Ci0JVUNIQVIgICAgICAgICAgIEFkZHJbNl07Ci0JUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7Ci0JVUxPTkcJCUlkeDsKLQlGUkFNRV9BRERCQV9SRVEgIEZyYW1lOwotCVVMT05HCQlGcmFtZUxlbjsKLQlCQV9PUklfRU5UUlkJCQkqcEJBRW50cnkgPSBOVUxMOworCXN0cnVjdCBydF9tbG1lX2FkZGJhX3JlcSAqcEluZm87CisJdTggQWRkcls2XTsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyBJZHg7CisJc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JlcSBGcmFtZTsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuOworCXN0cnVjdCBydF9iYV9vcmlfZW50cnkgKnBCQUVudHJ5ID0gTlVMTDsKIAotCXBJbmZvID0gKE1MTUVfQUREQkFfUkVRX1NUUlVDVCAqKUVsZW0tPk1zZzsKLQlOZGlzWmVyb01lbW9yeSgmRnJhbWUsIHNpemVvZihGUkFNRV9BRERCQV9SRVEpKTsKKwlwSW5mbyA9IChzdHJ1Y3QgcnRfbWxtZV9hZGRiYV9yZXEgKilFbGVtLT5Nc2c7CisJTmRpc1plcm9NZW1vcnkoJkZyYW1lLCBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JlcSkpOwogCi0JaWYoTWxtZUFkZEJBUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIpKQotCXsKLQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwlpZiAoTWxtZUFkZEJBUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIpKSB7CisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KKwkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOwogCQkJcmV0dXJuOwogCQl9Ci0JCS8vIDEuIGZpbmQgZW50cnkKLQkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQkFPcmlXY2lkQXJyYXlbcEluZm8tPlRJRF07Ci0JCWlmIChJZHggPT0gMCkKLQkJeworCQkvKiAxLiBmaW5kIGVudHJ5ICovCisJCUlkeCA9CisJCSAgICBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5CQU9yaVdjaWRBcnJheVtwSW5mby0+VElEXTsKKwkJaWYgKElkeCA9PSAwKSB7CiAJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJCQSAtIE1sbWVBRERCQUFjdGlvbigpIGNhbid0IGZpbmQgQkFPcmlFbnRyeSBcbiIpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgY2FuJ3QgZmluZCBCQU9yaUVudHJ5IFxuIikpOwogCQkJcmV0dXJuOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOworCQl9IGVsc2UgeworCQkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKIAkJfQogCiAJCXsKIAkJCWlmIChBREhPQ19PTihwQWQpKQotCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwSW5mby0+cEFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEluZm8tPnBBZGRyLAorCQkJCQkgICAgICBwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAJCQllbHNlCi0JCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwSW5mby0+cEFkZHIpOworCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLAorCQkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJCQkJICAgICAgcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkJICAgICAgcEluZm8tPnBBZGRyKTsKIAkJfQogCiAJCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfQkE7CkBAIC0xNDEsMjAgKzE1MiwyOSBAQAogCQlGcmFtZS5Ub2tlbiA9IHBJbmZvLT5Ub2tlbjsKIAkJRnJhbWUuVGltZU91dFZhbHVlID0gcEluZm8tPlRpbWVPdXRWYWx1ZTsKIAkJRnJhbWUuQmFTdGFydFNlcS5maWVsZC5GcmFnTnVtID0gMDsKLQkJRnJhbWUuQmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlR4U2VxW3BJbmZvLT5USURdOworCQlGcmFtZS5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxID0KKwkJICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlR4U2VxW3BJbmZvLT5USURdOwogCi0JCSooVVNIT1JUICopKCZGcmFtZS5CYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkZyYW1lLkJhUGFybSkpOworCQkqKHUxNiAqKSAoJkZyYW1lLkJhUGFybSkgPQorCQkgICAgY3B1MmxlMTYoKih1MTYgKikgKCZGcmFtZS5CYVBhcm0pKTsKIAkJRnJhbWUuVGltZU91dFZhbHVlID0gY3B1MmxlMTYoRnJhbWUuVGltZU91dFZhbHVlKTsKIAkJRnJhbWUuQmFTdGFydFNlcS53b3JkID0gY3B1MmxlMTYoRnJhbWUuQmFTdGFydFNlcS53b3JkKTsKIAotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJICAgJkZyYW1lTGVuLAotCQkgICAgICAgICAgICAgIHNpemVvZihGUkFNRV9BRERCQV9SRVEpLCAmRnJhbWUsCi0JCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOwotCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sCisJCQkJICBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JlcSksICZGcmFtZSwgRU5EX09GX0FSR1MpOworCisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwKKwkJCQkgIChNR01UX1VTRV9RVUVVRV9GTEFHIHwKKwkJCQkgICBNYXBVc2VyUHJpb3JpdHlUb0FjY2Vzc0NhdGVnb3J5W3BJbmZvLT5USURdKSwKKwkJCQkgIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwogCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBIC0gU2VuZCBBRERCQSByZXF1ZXN0LiBTdGFydFNlcSA9ICV4LCAgRnJhbWVMZW4gPSAlbGQuIEJ1ZlNpemUgPSAlZFxuIiwgRnJhbWUuQmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSwgRnJhbWVMZW4sIEZyYW1lLkJhUGFybS5CdWZTaXplKSk7Ci0gICAgfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkJBIC0gU2VuZCBBRERCQSByZXF1ZXN0LiBTdGFydFNlcSA9ICV4LCAgRnJhbWVMZW4gPSAlbGQuIEJ1ZlNpemUgPSAlZFxuIiwKKwkJCSAgRnJhbWUuQmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSwgRnJhbWVMZW4sCisJCQkgIEZyYW1lLkJhUGFybS5CdWZTaXplKSk7CisJfQogfQogCiAvKgpAQCAtMTYyLDI4OCArMTgyLDI3NyBAQAogICAgIERlc2NyaXB0aW9uOgogICAgICAgICBzZW5kIERFTEJBIGFuZCBkZWxldGUgQmFFbnRyeSBpZiBhbnkKICAgICBQYXJhbWV0cnM6Ci0gICAgICAgIEVsZW0gLSBNTE1FIG1lc3NhZ2UgTUxNRV9ERUxCQV9SRVFfU1RSVUNUCisgICAgICAgIEVsZW0gLSBNTE1FIG1lc3NhZ2Ugc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxCiAKIAlJUlFMID0gRElTUEFUQ0hfTEVWRUwKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZURFTEJBQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgTWxtZURFTEJBQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgKnBJbmZvOwotCVBVQ0hBUiAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCVBVQ0hBUgkJICAgcE91dEJ1ZmZlcjIgPSBOVUxMOwotCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOwotCVVMT05HCQlJZHg7Ci0JRlJBTUVfREVMQkFfUkVRICBGcmFtZTsKLQlVTE9ORwkJRnJhbWVMZW47Ci0JRlJBTUVfQkFSCUZyYW1lQmFyOworCXN0cnVjdCBydF9tbG1lX2RlbGJhX3JlcSAqcEluZm87CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCXU4ICpwT3V0QnVmZmVyMiA9IE5VTEw7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyBJZHg7CisJc3RydWN0IHJ0X2ZyYW1lX2RlbGJhX3JlcSBGcmFtZTsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuOworCXN0cnVjdCBydF9mcmFtZV9iYXIgRnJhbWVCYXI7CiAKLQlwSW5mbyA9IChNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgKilFbGVtLT5Nc2c7Ci0JLy8gbXVzdCBzZW5kIGJhY2sgREVMQkEKLQlOZGlzWmVyb01lbW9yeSgmRnJhbWUsIHNpemVvZihGUkFNRV9ERUxCQV9SRVEpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZURFTEJBQWN0aW9uKCksIEluaXRpYXRvciglZCkgXG4iLCBwSW5mby0+SW5pdGlhdG9yKSk7CisJcEluZm8gPSAoc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxICopRWxlbS0+TXNnOworCS8qIG11c3Qgc2VuZCBiYWNrIERFTEJBICovCisJTmRpc1plcm9NZW1vcnkoJkZyYW1lLCBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2RlbGJhX3JlcSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCI9PT4gTWxtZURFTEJBQWN0aW9uKCksIEluaXRpYXRvciglZCkgXG4iLCBwSW5mby0+SW5pdGlhdG9yKSk7CiAKLQlpZihNbG1lRGVsQkFSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCi0JewotCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIDEuIFxuIikpOworCWlmIChNbG1lRGVsQkFSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpIHsKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgMS4gXG4iKSk7CiAJCQlyZXR1cm47CiAJCX0KIAotCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7CisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcjIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgMi4gXG4iKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgMi4gXG4iKSk7CiAJCQlyZXR1cm47CiAJCX0KKwkJLyogU0VORCBCQVIgKFNlbmQgQkFSIHRvIHJlZnJlc2ggcGVlciByZW9yZGVyaW5nIGJ1ZmZlci4pICovCisJCUlkeCA9CisJCSAgICBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5CQU9yaVdjaWRBcnJheVtwSW5mby0+VElEXTsKIAotCQkvLyBTRU5EIEJBUiAoU2VuZCBCQVIgdG8gcmVmcmVzaCBwZWVyIHJlb3JkZXJpbmcgYnVmZmVyLikKLQkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQkFPcmlXY2lkQXJyYXlbcEluZm8tPlRJRF07CisJCUJhckhlYWRlckluaXQocEFkLCAmRnJhbWVCYXIsCisJCQkgICAgICBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyLAorCQkJICAgICAgcEFkLT5DdXJyZW50QWRkcmVzcyk7CiAKLQkJQmFySGVhZGVySW5pdChwQWQsICZGcmFtZUJhciwgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLkZyYWdOdW0gPSAwOwkvKiBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4gKi8KKwkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5UeFNlcVtwSW5mby0+VElEXTsJLyogbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uICovCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuVElEID0gcEluZm8tPlRJRDsJLyogbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uICovCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuQUNLUG9saWN5ID0gSU1NRURfQkE7CS8qIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLiAqLworCQlGcmFtZUJhci5CYXJDb250cm9sLkNvbXByZXNzZWQgPSAxOwkvKiBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4gKi8KKwkJRnJhbWVCYXIuQmFyQ29udHJvbC5NVElEID0gMDsJLyogbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uICovCiAKLQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlR4U2VxW3BJbmZvLT5USURdOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQkJRnJhbWVCYXIuQmFyQ29udHJvbC5USUQgPSBwSW5mby0+VElEOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQkJRnJhbWVCYXIuQmFyQ29udHJvbC5BQ0tQb2xpY3kgPSBJTU1FRF9CQTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCi0JCUZyYW1lQmFyLkJhckNvbnRyb2wuQ29tcHJlc3NlZCA9IDE7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCQlGcmFtZUJhci5CYXJDb250cm9sLk1USUQgPSAwOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyMiwJCQkJJkZyYW1lTGVuLAotCQkJCQkgIHNpemVvZihGUkFNRV9CQVIpLAkgICZGcmFtZUJhciwKLQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIyLCAmRnJhbWVMZW4sCisJCQkJICBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2JhciksICZGcmFtZUJhciwgRU5EX09GX0FSR1MpOwogCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlcjIsIEZyYW1lTGVuKTsKIAkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyMik7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSAuIFNlbmQgQkFSIHRvIHJlZnJlc2ggcGVlciByZW9yZGVyaW5nIGJ1ZmZlciBcbiIpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIC4gU2VuZCBCQVIgdG8gcmVmcmVzaCBwZWVyIHJlb3JkZXJpbmcgYnVmZmVyIFxuIikpOwogCi0JCS8vIFNFTkQgREVMQkEgRlJBTUUKKwkJLyogU0VORCBERUxCQSBGUkFNRSAqLwogCQlGcmFtZUxlbiA9IDA7CiAKIAkJewogCQkJaWYgKEFESE9DX09OKHBBZCkpCi0JCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwKKwkJCQkJICAgICAgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uCisJCQkJCSAgICAgIEFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJCSAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAkJCWVsc2UKLQkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyKTsKKwkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwKKwkJCQkJICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkJCSAgICAgIHBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLgorCQkJCQkgICAgICBBZGRyKTsKIAkJfQogCiAJCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfQkE7CiAJCUZyYW1lLkFjdGlvbiA9IERFTEJBOwogCQlGcmFtZS5EZWxiYVBhcm0uSW5pdGlhdG9yID0gcEluZm8tPkluaXRpYXRvcjsKIAkJRnJhbWUuRGVsYmFQYXJtLlRJRCA9IHBJbmZvLT5USUQ7Ci0JCUZyYW1lLlJlYXNvbkNvZGUgPSAzOTsgLy8gVGltZSBPdXQKLQkJKihVU0hPUlQgKikoJkZyYW1lLkRlbGJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmRnJhbWUuRGVsYmFQYXJtKSk7CisJCUZyYW1lLlJlYXNvbkNvZGUgPSAzOTsJLyogVGltZSBPdXQgKi8KKwkJKih1MTYgKikgKCZGcmFtZS5EZWxiYVBhcm0pID0KKwkJICAgIGNwdTJsZTE2KCoodTE2ICopICgmRnJhbWUuRGVsYmFQYXJtKSk7CiAJCUZyYW1lLlJlYXNvbkNvZGUgPSBjcHUybGUxNihGcmFtZS5SZWFzb25Db2RlKTsKIAotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJICAgICAgICAgICAgICBzaXplb2YoRlJBTUVfREVMQkFfUkVRKSwgICAgJkZyYW1lLAotCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgJkZyYW1lTGVuLAorCQkJCSAgc2l6ZW9mKHN0cnVjdCBydF9mcmFtZV9kZWxiYV9yZXEpLCAmRnJhbWUsIEVORF9PRl9BUkdTKTsKIAkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSAuIDMgREVMQkEgc2VudC4gSW5pdGlhdG9yKCVkKVxuIiwgcEluZm8tPkluaXRpYXRvcikpOwotICAgIAl9Ci19Ci0KLVZPSUQgTWxtZVFPU0FjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci19Ci0KLVZPSUQgTWxtZURMU0FjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci19Ci0KLVZPSUQgTWxtZUludmFsaWRBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCS8vUFVDSEFSCQkgICBwT3V0QnVmZmVyID0gTlVMTDsKLQkvL1JldHVybiB0aGUgcmVjZWl2aW5nIGZyYW1lIGV4Y2VwdCB0aGUgTVNCIG9mIGNhdGVnb3J5IGZpbGVkIHNldCB0byAxLiAgNy4zLjEuMTEKLX0KLQotVk9JRCBQZWVyUU9TQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLX0KLQotVk9JRCBQZWVyQkFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVDSEFSCUFjdGlvbiA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzFdOwotCi0Jc3dpdGNoKEFjdGlvbikKLQl7Ci0JCWNhc2UgQUREQkFfUkVROgotCQkJUGVlckFkZEJBUmVxQWN0aW9uKHBBZCxFbGVtKTsKLQkJCWJyZWFrOwotCQljYXNlIEFEREJBX1JFU1A6Ci0JCQlQZWVyQWRkQkFSc3BBY3Rpb24ocEFkLEVsZW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgREVMQkE6Ci0JCQlQZWVyRGVsQkFBY3Rpb24ocEFkLEVsZW0pOwotCQkJYnJlYWs7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSAuIDMgREVMQkEgc2VudC4gSW5pdGlhdG9yKCVkKVxuIiwKKwkJCSAgcEluZm8tPkluaXRpYXRvcikpOwogCX0KIH0KIAotVk9JRCBQZWVyUHVibGljQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgTWxtZVFPU0FjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7Cit9CisKK3ZvaWQgTWxtZURMU0FjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7Cit9CisKK3ZvaWQgTWxtZUludmFsaWRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQoreworCS8qdTggKiAgICAgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOyAqLworCS8qUmV0dXJuIHRoZSByZWNlaXZpbmcgZnJhbWUgZXhjZXB0IHRoZSBNU0Igb2YgY2F0ZWdvcnkgZmlsZWQgc2V0IHRvIDEuICA3LjMuMS4xMSAqLworfQorCit2b2lkIFBlZXJRT1NBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQoreworfQorCit2b2lkIFBlZXJCQUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7CisJdTggQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyAxXTsKKworCXN3aXRjaCAoQWN0aW9uKSB7CisJY2FzZSBBRERCQV9SRVE6CisJCVBlZXJBZGRCQVJlcUFjdGlvbihwQWQsIEVsZW0pOworCQlicmVhazsKKwljYXNlIEFEREJBX1JFU1A6CisJCVBlZXJBZGRCQVJzcEFjdGlvbihwQWQsIEVsZW0pOworCQlicmVhazsKKwljYXNlIERFTEJBOgorCQlQZWVyRGVsQkFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIFBlZXJQdWJsaWNBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewogCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQogCQlyZXR1cm47CiB9CiAKLQotc3RhdGljIFZPSUQgUmVzZXJ2ZWRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorc3RhdGljIHZvaWQgUmVzZXJ2ZWRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVDSEFSIENhdGVnb3J5OworCXU4IENhdGVnb3J5OwogCi0JaWYgKEVsZW0tPk1zZ0xlbiA8PSBMRU5HVEhfODAyXzExKQotCXsKKwlpZiAoRWxlbS0+TXNnTGVuIDw9IExFTkdUSF84MDJfMTEpIHsKIAkJcmV0dXJuOwogCX0KIAogCUNhdGVnb3J5ID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTFdOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmN2IHJlc2VydmVkIGNhdGVnb3J5KCVkKSBBY3Rpb24gRnJhbWVcbiIsIENhdGVnb3J5KSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlJjdiByZXNlcnZlZCBjYXRlZ29yeSglZCkgQWN0aW9uIEZyYW1lXG4iLCBDYXRlZ29yeSkpOwogCWhleF9kdW1wKCJSZXNlcnZlZCBBY3Rpb24gRnJhbWUiLCAmRWxlbS0+TXNnWzBdLCBFbGVtLT5Nc2dMZW4pOwogfQogCi1WT0lEIFBlZXJSTUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi0KK3ZvaWQgUGVlclJNQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBWT0lEIHJlc3BvbmRfaHRfaW5mb3JtYXRpb25fZXhjaGFuZ2VfYWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3N0YXRpYyB2b2lkIHJlc3BvbmRfaHRfaW5mb3JtYXRpb25fZXhjaGFuZ2VfYWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJCSAgIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMJCU5TdGF0dXM7Ci0JVUxPTkcJCQlGcmFtZUxlbjsKLQlGUkFNRV9IVF9JTkZPCUhUSU5GT2ZyYW1lLCAqcEZyYW1lOwotCVVDSEFSICAgCQkqcEFkZHI7CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCWludCBOU3RhdHVzOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW47CisJc3RydWN0IHJ0X2ZyYW1lX2h0X2luZm8gSFRJTkZPZnJhbWUsICpwRnJhbWU7CisJdTggKnBBZGRyOwogCisJLyogMi4gQWx3YXlzIHNlbmQgYmFjayBBRERCQSBSZXNwb25zZSAqLworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KIAotCS8vIDIuIEFsd2F5cyBzZW5kIGJhY2sgQUREQkEgUmVzcG9uc2UKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCi0JaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gcmVzcG9uZF9odF9pbmZvcm1hdGlvbl9leGNoYW5nZV9hY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJBQ1RJT04gLSByZXNwb25kX2h0X2luZm9ybWF0aW9uX2V4Y2hhbmdlX2FjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CiAJCXJldHVybjsKIAl9Ci0KLQkvLyBnZXQgUkEKLQlwRnJhbWUgPSAoRlJBTUVfSFRfSU5GTyAqKSAmRWxlbS0+TXNnWzBdOworCS8qIGdldCBSQSAqLworCXBGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfaHRfaW5mbyAqKSAmIEVsZW0tPk1zZ1swXTsKIAlwQWRkciA9IHBGcmFtZS0+SGRyLkFkZHIyOwogCi0JTmRpc1plcm9NZW1vcnkoJkhUSU5GT2ZyYW1lLCBzaXplb2YoRlJBTUVfSFRfSU5GTykpOwotCS8vIDItMS4gUHJlcGFyZSBBRERCQSBSZXNwb25zZSBmcmFtZS4KKwlOZGlzWmVyb01lbW9yeSgmSFRJTkZPZnJhbWUsIHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfaHRfaW5mbykpOworCS8qIDItMS4gUHJlcGFyZSBBRERCQSBSZXNwb25zZSBmcmFtZS4gKi8KIAl7CiAJCWlmIChBREhPQ19PTihwQWQpKQotCQkJQWN0SGVhZGVySW5pdChwQWQsICZIVElORk9mcmFtZS5IZHIsIHBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkhUSU5GT2ZyYW1lLkhkciwgcEFkZHIsCisJCQkJICAgICAgcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAJCWVsc2UKLQkJCUFjdEhlYWRlckluaXQocEFkLCAmSFRJTkZPZnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkZHIpOworCQkJQWN0SGVhZGVySW5pdChwQWQsICZIVElORk9mcmFtZS5IZHIsCisJCQkJICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJICAgICAgcEFkZHIpOwogCX0KIAogCUhUSU5GT2ZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfSFQ7CiAJSFRJTkZPZnJhbWUuQWN0aW9uID0gSFRfSU5GT19FWENIQU5HRTsKIAlIVElORk9mcmFtZS5IVF9JbmZvLlJlcXVlc3QgPSAwOwotCUhUSU5GT2ZyYW1lLkhUX0luZm8uRm9ydHlfTUh6X0ludG9sZXJhbnQgPSBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkZvcnR5X01oel9JbnRvbGVyYW50OwotCUhUSU5GT2ZyYW1lLkhUX0luZm8uU1RBX0NoYW5uZWxfV2lkdGgJID0gcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoOworCUhUSU5GT2ZyYW1lLkhUX0luZm8uRm9ydHlfTUh6X0ludG9sZXJhbnQgPQorCSAgICBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkZvcnR5X01oel9JbnRvbGVyYW50OworCUhUSU5GT2ZyYW1lLkhUX0luZm8uU1RBX0NoYW5uZWxfV2lkdGggPQorCSAgICBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGg7CiAKLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkJJkZyYW1lTGVuLAotCQkJCQkgIHNpemVvZihGUkFNRV9IVF9JTkZPKSwJJkhUSU5GT2ZyYW1lLAotCQkJCQkgIEVORF9PRl9BUkdTKTsKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sCisJCQkgIHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfaHRfaW5mbyksICZIVElORk9mcmFtZSwgRU5EX09GX0FSR1MpOwogCiAJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogfQogCi1WT0lEIFBlZXJIVEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIFBlZXJIVEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07CisJdTggQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyAxXTsKIAogCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQogCQlyZXR1cm47CiAKLQlzd2l0Y2goQWN0aW9uKQotCXsKLQkJY2FzZSBOT1RJRllfQldfQUNUSU9OOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBIVCBOb3RpZnkgQ2hhbm5lbCBiYW5kd2lkdGggYWN0aW9uLS0tLT4gXG4iKSk7CisJc3dpdGNoIChBY3Rpb24pIHsKKwljYXNlIE5PVElGWV9CV19BQ1RJT046CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQUNUSU9OIC0gSFQgTm90aWZ5IENoYW5uZWwgYmFuZHdpZHRoIGFjdGlvbi0tLS0+IFxuIikpOwogCi0JCQlpZihwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkKLQkJCXsKLQkJCQkvLyBOb3RlLCB0aGlzIGlzIHRvIHBhdGNoIERJUi0xMzUzIEFQLiBXaGVuIHRoZSBBUCBzZXQgdG8gV2VwLCBpdCB3aWxsIHVzZSBsZWdhY3kgbW9kZS4gQnV0IEFQIHN0aWxsIGtlZXBzCi0JCQkJLy8gc2VuZGluZyBCV19Ob3RpZnkgQWN0aW9uIGZyYW1lLCBhbmQgY2F1c2UgdXMgdG8gbGlua3VwIGFuZCBsaW5rZG93bi4KLQkJCQkvLyBJbiBsZWdhY3kgbW9kZSwgZG9uJ3QgbmVlZCB0byBwYXJzZSBIVCBhY3Rpb24gZnJhbWUuCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLUlnbm9yZSBIVCBOb3RpZnkgQ2hhbm5lbCBCVyB3aGVuIGxpbmsgYXMgbGVnYWN5IG1vZGUuIEJXID0gJWQtLS0+IFxuIiwKLQkJCQkJCQkJRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0gKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsyXSA9PSAwKQkvLyA3LjQuOC4yLiBpZiB2YWx1ZSBpcyAxLCBrZWVwIHRoZSBzYW1lIGFzIHN1cHBvcnRlZCBjaGFubmVsIGJhbmR3aWR0aC4KLQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLkhUUGh5TW9kZS5maWVsZC5CVyA9IDA7Ci0KKwkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKSB7CisJCQkvKiBOb3RlLCB0aGlzIGlzIHRvIHBhdGNoIERJUi0xMzUzIEFQLiBXaGVuIHRoZSBBUCBzZXQgdG8gV2VwLCBpdCB3aWxsIHVzZSBsZWdhY3kgbW9kZS4gQnV0IEFQIHN0aWxsIGtlZXBzICovCisJCQkvKiBzZW5kaW5nIEJXX05vdGlmeSBBY3Rpb24gZnJhbWUsIGFuZCBjYXVzZSB1cyB0byBsaW5rdXAgYW5kIGxpbmtkb3duLiAqLworCQkJLyogSW4gbGVnYWN5IG1vZGUsIGRvbid0IG5lZWQgdG8gcGFyc2UgSFQgYWN0aW9uIGZyYW1lLiAqLworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQUNUSU9OIC1JZ25vcmUgSFQgTm90aWZ5IENoYW5uZWwgQlcgd2hlbiBsaW5rIGFzIGxlZ2FjeSBtb2RlLiBCVyA9ICVkLS0tPiBcbiIsCisJCQkJICBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIDJdKSk7CiAJCQlicmVhazsKLQkJY2FzZSBTTVBTX0FDVElPTjoKLQkJCS8vIDcuMy4xLjI1Ci0gCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBTTVBTIGFjdGlvbi0tLS0+IFxuIikpOwotCQkJaWYgKCgoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0mMHgxKSA9PSAwKSkKLQkJCXsKLQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlID0gTU1QU19FTkFCTEU7Ci0JCQl9Ci0JCQllbHNlIGlmICgoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdJjB4MikgPT0gMCkpCi0JCQl7Ci0JCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSA9IE1NUFNfU1RBVElDOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUgPSBNTVBTX0RZTkFNSUM7Ci0JCQl9CisJCX0KIAotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBaWQoJWQpIE1JTU8gUFMgPSAlZFxuIiwgRWxlbS0+V2NpZCwgcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSkpOwotCQkJLy8gcnQyODYwYyA6IGFkZCBzb21ldGhpbmcgZm9yIHNtcHMgY2hhbmdlLgotCQkJYnJlYWs7CisJCWlmIChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIDJdID09IDApCS8qIDcuNC44LjIuIGlmIHZhbHVlIGlzIDEsIGtlZXAgdGhlIHNhbWUgYXMgc3VwcG9ydGVkIGNoYW5uZWwgYmFuZHdpZHRoLiAqLworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5IVFBoeU1vZGUuZmllbGQuQlcgPSAwOwogCi0JCWNhc2UgU0VUUENPX0FDVElPTjoKLQkJCWJyZWFrOwotCQljYXNlIE1JTU9fQ0hBX01FQVNVUkVfQUNUSU9OOgotCQkJYnJlYWs7Ci0JCWNhc2UgSFRfSU5GT19FWENIQU5HRToKLQkJCXsKLQkJCQlIVF9JTkZPUk1BVElPTl9PQ1RFVAkqcEhUX2luZm87CisJCWJyZWFrOworCWNhc2UgU01QU19BQ1RJT046CisJCS8qIDcuMy4xLjI1ICovCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFDVElPTiAtIFNNUFMgYWN0aW9uLS0tLT4gXG4iKSk7CisJCWlmICgoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgMl0gJiAweDEpID09IDApKSB7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlID0gTU1QU19FTkFCTEU7CisJCX0gZWxzZSBpZiAoKChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIDJdICYgMHgyKSA9PSAwKSkgeworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSA9IE1NUFNfU1RBVElDOworCQl9IGVsc2UgeworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSA9IE1NUFNfRFlOQU1JQzsKKwkJfQogCi0JCQkJcEhUX2luZm8gPSAoSFRfSU5GT1JNQVRJT05fT0NURVQgKikgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdOwotICAgIAkJCQkvLyA3LjQuOC4xMAotICAgIAkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtIEhUIEluZm9ybWF0aW9uIEV4Y2hhbmdlIGFjdGlvbi0tLS0+IFxuIikpOwotICAgIAkJCQlpZiAocEhUX2luZm8tPlJlcXVlc3QpCi0gICAgCQkJCXsKLSAgICAJCQkJCXJlc3BvbmRfaHRfaW5mb3JtYXRpb25fZXhjaGFuZ2VfYWN0aW9uKHBBZCwgRWxlbSk7Ci0gICAgCQkJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJBaWQoJWQpIE1JTU8gUFMgPSAlZFxuIiwgRWxlbS0+V2NpZCwKKwkJCSAgcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSkpOworCQkvKiBydDI4NjBjIDogYWRkIHNvbWV0aGluZyBmb3Igc21wcyBjaGFuZ2UuICovCisJCWJyZWFrOworCisJY2FzZSBTRVRQQ09fQUNUSU9OOgorCQlicmVhazsKKwljYXNlIE1JTU9fQ0hBX01FQVNVUkVfQUNUSU9OOgorCQlicmVhazsKKwljYXNlIEhUX0lORk9fRVhDSEFOR0U6CisJCXsKKwkJCXN0cnVjdCBydF9odF9pbmZvcm1hdGlvbl9vY3RldCAqcEhUX2luZm87CisKKwkJCXBIVF9pbmZvID0KKwkJCSAgICAoc3RydWN0IHJ0X2h0X2luZm9ybWF0aW9uX29jdGV0ICopICYgRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKworCQkJCQkJCQkgMl07CisJCQkvKiA3LjQuOC4xMCAqLworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQUNUSU9OIC0gSFQgSW5mb3JtYXRpb24gRXhjaGFuZ2UgYWN0aW9uLS0tLT4gXG4iKSk7CisJCQlpZiAocEhUX2luZm8tPlJlcXVlc3QpIHsKKwkJCQlyZXNwb25kX2h0X2luZm9ybWF0aW9uX2V4Y2hhbmdlX2FjdGlvbihwQWQsCisJCQkJCQkJCSAgICAgICBFbGVtKTsKIAkJCX0KLSAgICAJCQlicmVhazsKKwkJfQorCQlicmVhazsKIAl9CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgpAQCAtNDU4LDEyMCArNDY3LDExNiBAQAogCQkJCUZBTFNFICwgdGhlbiBjb250aW51ZSBpbmRpY2F0ZXJ4IGF0IHRoaXMgbW9tZW50LgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgT1JJQkFUaW1lclRpbWVvdXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIE9SSUJBVGltZXJUaW1lb3V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeTsKLQlJTlQJCQlpLCB0b3RhbDsKLQlVQ0hBUgkJCVRJRDsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnk7CisJaW50IGksIHRvdGFsOworCXU4IFRJRDsKIAogCXRvdGFsID0gcEFkLT5NYWNUYWIuU2l6ZSAqIE5VTV9PRl9USUQ7CiAKLQlmb3IgKGkgPSAxOyAoKGkgPE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSAmJiAodG90YWwgPiAwKSkgOyBpKyspCi0JewotCQlpZiAgKHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQotCQl7Ci0JCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5XY2lkXTsKKwlmb3IgKGkgPSAxOyAoKGkgPCBNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkgJiYgKHRvdGFsID4gMCkpOyBpKyspIHsKKwkJaWYgKHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKSB7CisJCQlwRW50cnkgPQorCQkJICAgICZwQWQtPk1hY1RhYi5Db250ZW50W3BBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLgorCQkJCQkJIFdjaWRdOwogCQkJVElEID0gcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV0uVElEOwogCi0JCQlBU1NFUlQocEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV0uV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKTsKKwkJCUFTU0VSVChwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5XY2lkIDwKKwkJCSAgICAgICBNQVhfTEVOX09GX01BQ19UQUJMRSk7CiAJCX0KLQkJdG90YWwgLS07CisJCXRvdGFsLS07CiAJfQogfQogCi0KLVZPSUQgU2VuZFJlZnJlc2hCQVIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnkpCit2b2lkIFNlbmRSZWZyZXNoQkFSKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5KQogewotCUZSQU1FX0JBUgkJRnJhbWVCYXI7Ci0JVUxPTkcJCQlGcmFtZUxlbjsKLQlORElTX1NUQVRVUyAJTlN0YXR1czsKLQlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlVU0hPUlQJCQlTZXF1ZW5jZTsKLQlVQ0hBUgkJCWksIFRJRDsKLQlVU0hPUlQJCQlpZHg7Ci0JQkFfT1JJX0VOVFJZCSpwQkFFbnRyeTsKKwlzdHJ1Y3QgcnRfZnJhbWVfYmFyIEZyYW1lQmFyOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW47CisJaW50IE5TdGF0dXM7CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCXUxNiBTZXF1ZW5jZTsKKwl1OCBpLCBUSUQ7CisJdTE2IGlkeDsKKwlzdHJ1Y3QgcnRfYmFfb3JpX2VudHJ5ICpwQkFFbnRyeTsKIAotCWZvciAoaSA9IDA7IGkgPE5VTV9PRl9USUQ7IGkrKykKLQl7CisJZm9yIChpID0gMDsgaSA8IE5VTV9PRl9USUQ7IGkrKykgewogCQlpZHggPSBwRW50cnktPkJBT3JpV2NpZEFycmF5W2ldOwotCQlpZiAoaWR4ID09IDApCi0JCXsKKwkJaWYgKGlkeCA9PSAwKSB7CiAJCQljb250aW51ZTsKIAkJfQogCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpZHhdOwogCi0JCWlmICAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQotCQl7CisJCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpIHsKIAkJCVRJRCA9IHBCQUVudHJ5LT5USUQ7CiAKIAkJCUFTU0VSVChwQkFFbnRyeS0+V2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKTsKIAotCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KKwkJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJICgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOwogCQkJCXJldHVybjsKIAkJCX0KIAogCQkJU2VxdWVuY2UgPSBwRW50cnktPlR4U2VxW1RJRF07CiAKLQkJCUJhckhlYWRlckluaXQocEFkLCAmRnJhbWVCYXIsIHBFbnRyeS0+QWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQlCYXJIZWFkZXJJbml0KHBBZCwgJkZyYW1lQmFyLCBwRW50cnktPkFkZHIsCisJCQkJICAgICAgcEFkLT5DdXJyZW50QWRkcmVzcyk7CiAKLQkJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLkZyYWdOdW0gPSAwOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jdGlvbi4KLQkJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID0gU2VxdWVuY2U7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCQkJRnJhbWVCYXIuQmFyQ29udHJvbC5USUQgPSBUSUQ7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7CS8qIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmN0aW9uLiAqLworCQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBTZXF1ZW5jZTsJLyogbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uICovCisJCQlGcmFtZUJhci5CYXJDb250cm9sLlRJRCA9IFRJRDsJLyogbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uICovCiAKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKLQkJCQkJCQkgIHNpemVvZihGUkFNRV9CQVIpLAkgICZGcmFtZUJhciwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2JhciksICZGcmFtZUJhciwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkvKmlmICghKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpKSkgKi8KKwkJCWlmICgxKQkvKiBOb3cgd2UgYWx3YXlzIHNlbmQgQkFSLiAqLworCQkJeworCQkJCS8qTWluaXBvcnRNTVJlcXVlc3RVbmxvY2socEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7ICovCisJCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLAorCQkJCQkJICAoTUdNVF9VU0VfUVVFVUVfRkxBRyB8CisJCQkJCQkgICBNYXBVc2VyUHJpb3JpdHlUb0FjY2Vzc0NhdGVnb3J5CisJCQkJCQkgICBbVElEXSksIHBPdXRCdWZmZXIsCisJCQkJCQkgIEZyYW1lTGVuKTsKIAotCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQorCQkJfQogCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKIAkJfQogCX0KIH0KIAotVk9JRCBBY3RIZWFkZXJJbml0KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCi0gICAgSU4gUFVDSEFSIEFkZHIxLAotICAgIElOIFBVQ0hBUiBBZGRyMiwKLSAgICBJTiBQVUNIQVIgQWRkcjMpCit2b2lkIEFjdEhlYWRlckluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICBzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZHI4MDIxMSwKKwkJICAgdTggKkFkZHIxLCB1OCAqQWRkcjIsIHU4ICpBZGRyMykKIHsKLSAgICBOZGlzWmVyb01lbW9yeShwSGRyODAyMTEsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0gICAgcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfTUdNVDsKLSAgICBwSGRyODAyMTEtPkZDLlN1YlR5cGUgPSBTVUJUWVBFX0FDVElPTjsKKwlOZGlzWmVyb01lbW9yeShwSGRyODAyMTEsIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOworCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX01HTVQ7CisJcEhkcjgwMjExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9BQ1RJT047CiAKLSAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIEFkZHIxKTsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIEFkZHIxKTsKIAlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjIsIEFkZHIyKTsKLSAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIEFkZHIzKTsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIEFkZHIzKTsKIH0KIAotVk9JRCBCYXJIZWFkZXJJbml0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE9VVCBQRlJBTUVfQkFSIHBDbnRsQmFyLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gUFVDSEFSIHBTQSkKK3ZvaWQgQmFySGVhZGVySW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgIHN0cnVjdCBydF9mcmFtZV9iYXIgKiBwQ250bEJhciwgdTggKnBEQSwgdTggKnBTQSkKIHsKLQlOZGlzWmVyb01lbW9yeShwQ250bEJhciwgc2l6ZW9mKEZSQU1FX0JBUikpOworCU5kaXNaZXJvTWVtb3J5KHBDbnRsQmFyLCBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2JhcikpOwogCXBDbnRsQmFyLT5GQy5UeXBlID0gQlRZUEVfQ05UTDsKIAlwQ250bEJhci0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfQkxPQ0tfQUNLX1JFUTsKLSAgIAlwQ250bEJhci0+QmFyQ29udHJvbC5NVElEID0gMDsKKwlwQ250bEJhci0+QmFyQ29udHJvbC5NVElEID0gMDsKIAlwQ250bEJhci0+QmFyQ29udHJvbC5Db21wcmVzc2VkID0gMTsKIAlwQ250bEJhci0+QmFyQ29udHJvbC5BQ0tQb2xpY3kgPSAwOwogCi0KLQlwQ250bEJhci0+RHVyYXRpb24gPSAxNiArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBSQVRFXzEsIHNpemVvZihGUkFNRV9CQSkpOworCXBDbnRsQmFyLT5EdXJhdGlvbiA9CisJICAgIDE2ICsgUlRNUENhbGNEdXJhdGlvbihwQWQsIFJBVEVfMSwgc2l6ZW9mKHN0cnVjdCBydF9mcmFtZV9iYSkpOwogCiAJQ09QWV9NQUNfQUREUihwQ250bEJhci0+QWRkcjEsIHBEQSk7CiAJQ09QWV9NQUNfQUREUihwQ250bEJhci0+QWRkcjIsIHBTQSk7CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgpAQCAtNTg2LDE5ICs1OTEsMTQgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgSW5zZXJ0QWN0RmllbGQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4sCi0JSU4gVUlOVDggQ2F0ZWdvcnksCi0JSU4gVUlOVDggQWN0Q29kZSkKK3ZvaWQgSW5zZXJ0QWN0RmllbGQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgdTggKnBGcmFtZUJ1ZiwKKwkJICAgIHVuc2lnbmVkIGxvbmcgKnBGcmFtZUxlbiwgdTggQ2F0ZWdvcnksIHU4IEFjdENvZGUpCiB7Ci0JVUxPTkcgVGVtcExlbjsKKwl1bnNpZ25lZCBsb25nIFRlbXBMZW47CiAKLQlNYWtlT3V0Z29pbmdGcmFtZSgJcEZyYW1lQnVmLAkJJlRlbXBMZW4sCi0JCQkJCQkxLAkJCQkmQ2F0ZWdvcnksCi0JCQkJCQkxLAkJCQkmQWN0Q29kZSwKLQkJCQkJCUVORF9PRl9BUkdTKTsKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsICZUZW1wTGVuLAorCQkJICAxLCAmQ2F0ZWdvcnksIDEsICZBY3RDb2RlLCBFTkRfT0ZfQVJHUyk7CiAKIAkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2FjdGlvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmgKaW5kZXggY2ZjMmE1Zi4uOTc0ZjhiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmgKQEAgLTM5LDIzICszOSwxOCBAQAogI2lmbmRlZglfX0FDVElPTl9IX18KICNkZWZpbmUJX19BQ1RJT05fSF9fCiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfX0hUX0lORk9fT0NURVQKLXsKLQlVQ0hBUglSZXF1ZXN0OjE7Ci0JVUNIQVIJRm9ydHlfTUh6X0ludG9sZXJhbnQ6MTsKLQlVQ0hBUiAJU1RBX0NoYW5uZWxfV2lkdGg6MTsKLQlVQ0hBUglSZXNlcnZlZDo1OwotfSBIVF9JTkZPUk1BVElPTl9PQ1RFVDsKK3N0cnVjdCBQQUNLRUQgcnRfaHRfaW5mb3JtYXRpb25fb2N0ZXQgeworCXU4IFJlcXVlc3Q6MTsKKwl1OCBGb3J0eV9NSHpfSW50b2xlcmFudDoxOworCXU4IFNUQV9DaGFubmVsX1dpZHRoOjE7CisJdTggUmVzZXJ2ZWQ6NTsKK307CiAKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9fRlJBTUVfSFRfSU5GTwotewotCUhFQURFUl84MDJfMTEgICAJCUhkcjsKLQlVQ0hBUgkJCQkJQ2F0ZWdvcnk7Ci0JVUNIQVIJCQkJCUFjdGlvbjsKLQlIVF9JTkZPUk1BVElPTl9PQ1RFVAlIVF9JbmZvOwotfSAgIEZSQU1FX0hUX0lORk8sICpQRlJBTUVfSFRfSU5GTzsKK3N0cnVjdCBQQUNLRUQgcnRfZnJhbWVfaHRfaW5mbyB7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgSGRyOworCXU4IENhdGVnb3J5OworCXU4IEFjdGlvbjsKKwlzdHJ1Y3QgcnRfaHRfaW5mb3JtYXRpb25fb2N0ZXQgSFRfSW5mbzsKK307CiAKICNlbmRpZiAvKiBfX0FDVElPTl9IX18gKi8KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9iYV9hY3Rpb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jCmluZGV4IGI3YmJlOTkuLjE3NGYyYTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9iYV9hY3Rpb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9iYV9hY3Rpb24uYwpAQCAtMjcsNDIgKzI3LDMzIEBACiAKICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAotCi0KLSNkZWZpbmUgQkFfT1JJX0lOSVRfU0VRCQkocEVudHJ5LT5UeFNlcVtUSURdKSAvLzEJCQkvLyBpbml0YWwgc2VxdWVuY2UgbnVtYmVyIG9mIEJBIHNlc3Npb24KKyNkZWZpbmUgQkFfT1JJX0lOSVRfU0VRCQkocEVudHJ5LT5UeFNlcVtUSURdKQkvKjEgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0YWwgc2VxdWVuY2UgbnVtYmVyIG9mIEJBIHNlc3Npb24gKi8KIAogI2RlZmluZSBPUklfU0VTU0lPTl9NQVhfUkVUUlkJOAotI2RlZmluZSBPUklfQkFfU0VTU0lPTl9USU1FT1VUCSgyMDAwKQkvLyBtcwotI2RlZmluZSBSRUNfQkFfU0VTU0lPTl9JRExFX1RJTUVPVVQJKDEwMDApCS8vIG1zCisjZGVmaW5lIE9SSV9CQV9TRVNTSU9OX1RJTUVPVVQJKDIwMDApCS8qIG1zICovCisjZGVmaW5lIFJFQ19CQV9TRVNTSU9OX0lETEVfVElNRU9VVAkoMTAwMCkJLyogbXMgKi8KIAotI2RlZmluZSBSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUCQkoKDEwMCAqIEhaKS8xMDAwKQkvLyBzeXN0ZW0gdGlja3MgLS0gMTAwIG1zCi0jZGVmaW5lIE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUCSgoMzAwMCAqIEhaKS8xMDAwKQkvLyBzeXN0ZW0gdGlja3MgLS0gMTAwIG1zCisjZGVmaW5lIFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJCSgoMTAwICogT1NfSFopLzEwMDApCS8qIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMgKi8KKyNkZWZpbmUgTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJKCgzMDAwICogT1NfSFopLzEwMDApCS8qIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMgKi8KIAogI2RlZmluZSBSRVNFVF9SQ1ZfU0VRCQkoMHhGRkZGKQogCi1zdGF0aWMgdm9pZCBiYV9tcGR1X2Jsa19mcmVlKFBSVE1QX0FEQVBURVIgcEFkLCBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2Jsayk7CitzdGF0aWMgdm9pZCBiYV9tcGR1X2Jsa19mcmVlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGspOwogCitzdHJ1Y3QgcnRfYmFfb3JpX2VudHJ5ICpCQVRhYmxlQWxsb2NPcmlFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHUxNiAqIElkeCk7CiAKLUJBX09SSV9FTlRSWSAqQkFUYWJsZUFsbG9jT3JpRW50cnkoCi0JCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KTsKK3N0cnVjdCBydF9iYV9yZWNfZW50cnkgKkJBVGFibGVBbGxvY1JlY0VudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTE2ICogSWR4KTsKIAotQkFfUkVDX0VOVFJZICpCQVRhYmxlQWxsb2NSZWNFbnRyeSgKLQkJCQkJCQkJICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQkJCQkJCQkJICBPVVQgVVNIT1JUICAgICAgICAgICpJZHgpOwordm9pZCBCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkJICAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkJICAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLAorCQkJICAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAotVk9JRCBCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBCQVJlY1Nlc3Npb25JZGxlVGltZW91dCgKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCit2b2lkIEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJCSAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkJICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsCisJCQkgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CiAKIEJVSUxEX1RJTUVSX0ZVTkNUSU9OKEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCk7CiBCVUlMRF9USU1FUl9GVU5DVElPTihCQVJlY1Nlc3Npb25JZGxlVGltZW91dCk7CkBAIC03MCw5MSArNjEsNzggQEAKICNkZWZpbmUgQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQoX3BBZCwgX21wZHVfYmxrKQlcCiAJCQlBbm5vdW5jZV9SZW9yZGVyaW5nX1BhY2tldChfcEFkLCBfbXBkdV9ibGspOwogCi1WT0lEIEJBX01heFdpblNpemVSZWFzaWduKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeVBlZXIsCi0JT1VUIFVDSEFSCQkJKnBXaW5TaXplKQordm9pZCBCQV9NYXhXaW5TaXplUmVhc2lnbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeVBlZXIsIHU4ICogcFdpblNpemUpCiB7Ci0JVUNIQVIgTWF4U2l6ZTsKKwl1OCBNYXhTaXplOwogCi0KLQlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgzX1ZFUlNJT04pIC8vIDMqMworCWlmIChwQWQtPk1BQ1ZlcnNpb24gPj0gUkFMSU5LXzI4ODNfVkVSU0lPTikJLyogMyozICovCiAJewotCQlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18zMDcwX1ZFUlNJT04pCi0JCXsKLQkJCWlmIChwRW50cnlQZWVyLT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKLQkJCQlNYXhTaXplID0gNzsgLy8gZm9yIG5vbi1vcGVuIG1vZGUKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMzA3MF9WRVJTSU9OKSB7CisJCQlpZiAocEVudHJ5UGVlci0+V2VwU3RhdHVzICE9CisJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKKwkJCQlNYXhTaXplID0gNzsJLyogZm9yIG5vbi1vcGVuIG1vZGUgKi8KIAkJCWVsc2UKIAkJCQlNYXhTaXplID0gMTM7Ci0JCX0KLQkJZWxzZQorCQl9IGVsc2UKIAkJCU1heFNpemUgPSAzMTsKLQl9Ci0JZWxzZSBpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgwRV9WRVJTSU9OKSAvLyAyODgwIGUKKwl9IGVsc2UgaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4MEVfVkVSU0lPTikJLyogMjg4MCBlICovCiAJewogCQlpZiAocEVudHJ5UGVlci0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCi0JCQlNYXhTaXplID0gNzsgLy8gZm9yIG5vbi1vcGVuIG1vZGUKKwkJCU1heFNpemUgPSA3OwkvKiBmb3Igbm9uLW9wZW4gbW9kZSAqLwogCQllbHNlCiAJCQlNYXhTaXplID0gMTM7Ci0JfQotCWVsc2UKKwl9IGVsc2UKIAkJTWF4U2l6ZSA9IDc7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJiYT4gV2luIFNpemUgPSAlZCwgTWF4IFNpemUgPSAlZFxuIiwKLQkJCSpwV2luU2l6ZSwgTWF4U2l6ZSkpOworCQkJCSAgKnBXaW5TaXplLCBNYXhTaXplKSk7CiAKLQlpZiAoKCpwV2luU2l6ZSkgPiBNYXhTaXplKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiYmE+IHJlYXNzaWduIG1heCB3aW4gc2l6ZSBmcm9tICVkIHRvICVkXG4iLAotCQkJCSpwV2luU2l6ZSwgTWF4U2l6ZSkpOworCWlmICgoKnBXaW5TaXplKSA+IE1heFNpemUpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJiYT4gcmVhc3NpZ24gbWF4IHdpbiBzaXplIGZyb20gJWQgdG8gJWRcbiIsCisJCQkgICpwV2luU2l6ZSwgTWF4U2l6ZSkpOwogCiAJCSpwV2luU2l6ZSA9IE1heFNpemU7CiAJfQogfQogCi12b2lkIEFubm91bmNlX1Jlb3JkZXJpbmdfUGFja2V0KElOIFBSVE1QX0FEQVBURVIJCQlwQWQsCi0JCQkJCQkJCUlOIHN0cnVjdCByZW9yZGVyaW5nX21wZHUJKm1wZHUpCit2b2lkIEFubm91bmNlX1Jlb3JkZXJpbmdfUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQlJTiBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1KQogewotCVBORElTX1BBQ0tFVCAgICBwUGFja2V0OworCXZvaWQgKnBQYWNrZXQ7CiAKIAlwUGFja2V0ID0gbXBkdS0+cFBhY2tldDsKIAotCWlmIChtcGR1LT5iQU1TRFUpCi0JeworCWlmIChtcGR1LT5iQU1TRFUpIHsKIAkJQVNTRVJUKDApOwogCQlCQV9SZW9yZGVyX0FNU0RVX0Fubm5vdW5jZShwQWQsIHBQYWNrZXQpOwotCX0KLQllbHNlCi0JewotCQkvLwotCQkvLyBwYXNzIHRoaXMgODAyLjMgcGFja2V0IHRvIHVwcGVyIGxheWVyIG9yIGZvcndhcmQgdGhpcyBwYWNrZXQgdG8gV00gZGlyZWN0bHkKLQkJLy8KKwl9IGVsc2UgeworCQkvKiAqLworCQkvKiBwYXNzIHRoaXMgODAyLjMgcGFja2V0IHRvIHVwcGVyIGxheWVyIG9yIGZvcndhcmQgdGhpcyBwYWNrZXQgdG8gV00gZGlyZWN0bHkgKi8KKwkJLyogKi8KIAotCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBQYWNrZXQsIFJUTVBfR0VUX1BBQ0tFVF9JRihwUGFja2V0KSk7CisJCUFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKHBBZCwgcFBhY2tldCwKKwkJCQkJCSBSVE1QX0dFVF9QQUNLRVRfSUYocFBhY2tldCkpOwogCX0KIH0KIAogLyoKICAqIEluc2VydCBhIHJlb3JkZXJpbmcgbXBkdSBpbnRvIHNvcnRlZCBsaW5rZWQgbGlzdCBieSBzZXF1ZW5jZSBuby4KICAqLwotQk9PTEVBTiBiYV9yZW9yZGVyaW5nX21wZHVfaW5zZXJ0c29ydGVkKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHUpCitCT09MRUFOIGJhX3Jlb3JkZXJpbmdfbXBkdV9pbnNlcnRzb3J0ZWQoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCwKKwkJCQkJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdSkKIHsKIAogCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKipwcFNjYW4gPSAmbGlzdC0+bmV4dDsKIAotCXdoaWxlICgqcHBTY2FuICE9IE5VTEwpCi0JewotCQlpZiAoU0VRX1NNQUxMRVIoKCpwcFNjYW4pLT5TZXF1ZW5jZSwgbXBkdS0+U2VxdWVuY2UsIE1BWFNFUSkpCi0JCXsKKwl3aGlsZSAoKnBwU2NhbiAhPSBOVUxMKSB7CisJCWlmIChTRVFfU01BTExFUigoKnBwU2NhbiktPlNlcXVlbmNlLCBtcGR1LT5TZXF1ZW5jZSwgTUFYU0VRKSkgewogCQkJcHBTY2FuID0gJigqcHBTY2FuKS0+bmV4dDsKLQkJfQotCQllbHNlIGlmICgoKnBwU2NhbiktPlNlcXVlbmNlID09IG1wZHUtPlNlcXVlbmNlKQotCQl7CisJCX0gZWxzZSBpZiAoKCpwcFNjYW4pLT5TZXF1ZW5jZSA9PSBtcGR1LT5TZXF1ZW5jZSkgewogCQkJLyogZ2l2ZSB1cCB0aGlzIGR1cGxpY2F0ZWQgZnJhbWUgKi8KLQkJCXJldHVybihGQUxTRSk7Ci0JCX0KLQkJZWxzZQotCQl7CisJCQlyZXR1cm4gKEZBTFNFKTsKKwkJfSBlbHNlIHsKIAkJCS8qIGZpbmQgcG9zaXRpb24gKi8KIAkJCWJyZWFrOwogCQl9CkBAIC0xNjYsMTEgKzE0NCwxMSBAQAogCXJldHVybiBUUlVFOwogfQogCi0KIC8qCiAgKiBjYWxsZXIgbG9jayBjcml0aWNhbCBzZWN0aW9uIGlmIG5lY2Vzc2FyeQogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYmFfZW5xdWV1ZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0LCBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBiYV9lbnF1ZXVlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QsCisJCQkgICAgICBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsaykKIHsKIAlsaXN0LT5xbGVuKys7CiAJbXBkdV9ibGstPm5leHQgPSBsaXN0LT5uZXh0OwpAQCAtMTgwLDQ3ICsxNTgsNDYgQEAKIC8qCiAgKiBjYWxsZXIgbG9jayBjcml0aWNhbCBzZWN0aW9uIGlmIG5lY2Vzc2FyeQogICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKiBiYV9kZXF1ZXVlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QpCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKmJhX2RlcXVldWUoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCkKIHsKIAlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsayA9IE5VTEw7CiAKIAlBU1NFUlQobGlzdCk7CiAKLQkJaWYgKGxpc3QtPnFsZW4pCi0JCXsKLQkJCWxpc3QtPnFsZW4tLTsKLQkJCW1wZHVfYmxrID0gbGlzdC0+bmV4dDsKLQkJCWlmIChtcGR1X2JsaykKLQkJCXsKLQkJCQlsaXN0LT5uZXh0ID0gbXBkdV9ibGstPm5leHQ7Ci0JCQkJbXBkdV9ibGstPm5leHQgPSBOVUxMOwotCQkJfQorCWlmIChsaXN0LT5xbGVuKSB7CisJCWxpc3QtPnFsZW4tLTsKKwkJbXBkdV9ibGsgPSBsaXN0LT5uZXh0OworCQlpZiAobXBkdV9ibGspIHsKKwkJCWxpc3QtPm5leHQgPSBtcGR1X2Jsay0+bmV4dDsKKwkJCW1wZHVfYmxrLT5uZXh0ID0gTlVMTDsKIAkJfQorCX0KIAlyZXR1cm4gbXBkdV9ibGs7CiB9CiAKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICAqYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoc3RydWN0CisJCQkJCQkJCSByZW9yZGVyaW5nX2xpc3QKKwkJCQkJCQkJICpsaXN0KQogewotCXJldHVybihiYV9kZXF1ZXVlKGxpc3QpKTsKKwlyZXR1cm4gKGJhX2RlcXVldWUobGlzdCkpOwogfQogCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAgKmJhX3Jlb3JkZXJpbmdfbXBkdV9wcm9iZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0KQotCXsKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKHN0cnVjdAorCQkJCQkJCSAgICAgICByZW9yZGVyaW5nX2xpc3QKKwkJCQkJCQkgICAgICAgKmxpc3QpCit7CiAJQVNTRVJUKGxpc3QpOwogCi0JCXJldHVybihsaXN0LT5uZXh0KTsKLQl9Ci0KKwlyZXR1cm4gKGxpc3QtPm5leHQpOworfQogCiAvKgogICogZnJlZSBhbGwgcmVzb3VyY2UgZm9yIHJlb3JkZXJpbmcgbWVjaGFuaXNtCiAgKi8KLXZvaWQgYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCUJBX1RBQkxFICAgICAgICAqVGFiOwotCVBCQV9SRUNfRU5UUlkgICBwQkFFbnRyeTsKKwlzdHJ1Y3QgcnRfYmFfdGFibGUgKlRhYjsKKwlzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwQkFFbnRyeTsKIAlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKIAlpbnQgaTsKIApAQCAtMjI4LDE1ICsyMDUsMTQgQEAKIAogCS8qIEkuICByZWxlYXNlIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgcGFja2V0ICovCiAJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykgewogCQlwQkFFbnRyeSA9ICZUYWItPkJBUmVjRW50cnlbaV07Ci0JCWlmIChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyAhPSBSZWNpcGllbnRfTk9ORSkKLQkJewotCQkJd2hpbGUgKChtcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCkpKQotCQkJeworCQlpZiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgIT0gUmVjaXBpZW50X05PTkUpIHsKKwkJCXdoaWxlICgobXBkdV9ibGsgPQorCQkJCWJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCkpKSB7CiAJCQkJQVNTRVJUKG1wZHVfYmxrLT5wUGFja2V0KTsKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgbXBkdV9ibGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBtcGR1X2Jsay0+cFBhY2tldCwKKwkJCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOwogCQkJfQogCQl9CkBAIC0yNTAsMTUgKzIyNiwxMyBAQAogCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKIH0KIAotCi0KIC8qCiAgKiBBbGxvY2F0ZSBhbGwgcmVzb3VyY2UgZm9yIHJlb3JkZXJpbmcgbWVjaGFuaXNtCiAgKi8KLUJPT0xFQU4gYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KFBSVE1QX0FEQVBURVIgcEFkLCBpbnQgbnVtKQorQk9PTEVBTiBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBpbnQgbnVtKQogewotCWludCAgICAgaTsKLQlQVUNIQVIgIG1lbTsKKwlpbnQgaTsKKwl1OCAqbWVtOwogCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwogCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmZyZWVsaXN0OwogCkBAIC0yNzAsMjQgKzI0NCwyNiBAQAogCWZyZWVsaXN0LT5uZXh0ID0gTlVMTDsKIAlmcmVlbGlzdC0+cWxlbiA9IDA7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBbGxvY2F0ZSAlZCBtZW1vcnkgZm9yIEJBIHJlb3JkZXJpbmdcbiIsIChVSU5UMzIpKG51bSpzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFsbG9jYXRlICVkIG1lbW9yeSBmb3IgQkEgcmVvcmRlcmluZ1xuIiwKKwkJICAodTMyKShudW0gKiBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpKSk7CiAKIAkvKiBhbGxvY2F0ZSBudW1iZXIgb2YgbXBkdV9ibGsgbWVtb3J5ICovCi0Jb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtZW0sIChudW0qc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKSk7CisJb3NfYWxsb2NfbWVtKHBBZCwgKHU4ICoqKSAmIG1lbSwKKwkJICAgICAobnVtICogc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKSk7CiAKIAlwQWQtPm1wZHVfYmxrX3Bvb2wubWVtID0gbWVtOwogCi0JaWYgKG1lbSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ2FuJ3QgQWxsb2NhdGUgTWVtb3J5IGZvciBCQSBSZW9yZGVyaW5nXG4iKSk7Ci0JCXJldHVybihGQUxTRSk7CisJaWYgKG1lbSA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiQ2FuJ3QgQWxsb2NhdGUgTWVtb3J5IGZvciBCQSBSZW9yZGVyaW5nXG4iKSk7CisJCXJldHVybiAoRkFMU0UpOwogCX0KIAogCS8qIGJ1aWxkIG1wZHVfYmxrIGZyZWUgbGlzdCAqLwotCWZvciAoaT0wOyBpPG51bTsgaSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKIAkJLyogZ2V0IG1wZHVfYmxrICovCi0JCW1wZHVfYmxrID0gKHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKikgbWVtOworCQltcGR1X2JsayA9IChzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICopbWVtOwogCQkvKiBpbml0aWFsIG1wZHVfYmxrICovCiAJCU5kaXNaZXJvTWVtb3J5KG1wZHVfYmxrLCBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpOwogCQkvKiBuZXh0IG1wZHVfYmxrICovCkBAIC0yOTYsMjAgKzI3MiwxOSBAQAogCQliYV9lbnF1ZXVlKGZyZWVsaXN0LCBtcGR1X2Jsayk7CiAJfQogCi0JcmV0dXJuKFRSVUUpOworCXJldHVybiAoVFJVRSk7CiB9CiAKLS8vc3RhdGljIGludCBibGtfY291bnQ9MDsgLy8gc2FtcGxlIHRha2Ugb2ZmLCBubyB1c2UKKy8qc3RhdGljIGludCBibGtfY291bnQ9MDsgLy8gc2FtcGxlIHRha2Ugb2ZmLCBubyB1c2UgKi8KIAotc3RhdGljIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKmJhX21wZHVfYmxrX2FsbG9jKFBSVE1QX0FEQVBURVIgcEFkKQorc3RhdGljIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKmJhX21wZHVfYmxrX2FsbG9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKIAlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKIAogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKIAltcGR1X2JsayA9IGJhX2RlcXVldWUoJnBBZC0+bXBkdV9ibGtfcG9vbC5mcmVlbGlzdCk7Ci0JaWYgKG1wZHVfYmxrKQotCXsKLS8vCQlibGtfY291bnQrKzsKKwlpZiAobXBkdV9ibGspIHsKKy8qICAgICAgICAgICAgICBibGtfY291bnQrKzsgKi8KIAkJLyogcmVzZXQgbXBkdV9ibGsgKi8KIAkJTmRpc1plcm9NZW1vcnkobXBkdV9ibGssIHNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KSk7CiAJfQpAQCAtMzE3LDQzICsyOTIsNDAgQEAKIAlyZXR1cm4gbXBkdV9ibGs7CiB9CiAKLXN0YXRpYyB2b2lkIGJhX21wZHVfYmxrX2ZyZWUoUFJUTVBfQURBUFRFUiBwQWQsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrKQorc3RhdGljIHZvaWQgYmFfbXBkdV9ibGtfZnJlZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrKQogewogCUFTU0VSVChtcGR1X2Jsayk7CiAKIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPm1wZHVfYmxrX3Bvb2wubG9jayk7Ci0vLwlibGtfY291bnQtLTsKKy8qICAgICAgYmxrX2NvdW50LS07ICovCiAJYmFfZW5xdWV1ZSgmcEFkLT5tcGR1X2Jsa19wb29sLmZyZWVsaXN0LCBtcGR1X2Jsayk7CiAJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOwogfQogCi0KLXN0YXRpYyBVU0hPUlQgYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcigKLQkJCQkJCQkJCQkJCSAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCQkJCQkJCQkJCQkJICAgSU4gUEJBX1JFQ19FTlRSWSAgICBwQkFFbnRyeSwKLQkJCQkJCQkJCQkJCSAgIElOIFVTSE9SVCAgICAgICAgICAgU3RhcnRTZXEpCitzdGF0aWMgdTE2IGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkJICAgIHN0cnVjdCBydF9iYV9yZWNfZW50cnkgKnBCQUVudHJ5LAorCQkJCQkJICAgIHUxNiBTdGFydFNlcSkKIHsKIAlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKLQlVU0hPUlQgIExhc3RJbmRTZXEgPSBSRVNFVF9SQ1ZfU0VROworCXUxNiBMYXN0SW5kU2VxID0gUkVTRVRfUkNWX1NFUTsKIAogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOwogCi0Jd2hpbGUgKChtcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9wcm9iZSgmcEJBRW50cnktPmxpc3QpKSkKLQkJewotCQkJLyogZmluZCBpbi1vcmRlciBmcmFtZSAqLwotCQlpZiAoIVNFUV9TVEVQT05FKG1wZHVfYmxrLT5TZXF1ZW5jZSwgU3RhcnRTZXEsIE1BWFNFUSkpCi0JCQl7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiBkZXF1ZXVlIGluLW9yZGVyIGZyYW1lIGZyb20gcmVvZGVyaW5nIGxpc3QgKi8KLQkJCW1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KTsKLQkJCS8qIHBhc3MgdGhpcyBmcmFtZSB1cCAqLworCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfcHJvYmUoJnBCQUVudHJ5LT5saXN0KSkpIHsKKwkJLyogZmluZCBpbi1vcmRlciBmcmFtZSAqLworCQlpZiAoIVNFUV9TVEVQT05FKG1wZHVfYmxrLT5TZXF1ZW5jZSwgU3RhcnRTZXEsIE1BWFNFUSkpIHsKKwkJCWJyZWFrOworCQl9CisJCS8qIGRlcXVldWUgaW4tb3JkZXIgZnJhbWUgZnJvbSByZW9kZXJpbmcgbGlzdCAqLworCQltcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCk7CisJCS8qIHBhc3MgdGhpcyBmcmFtZSB1cCAqLwogCQlBTk5PVU5DRV9SRU9SREVSSU5HX1BBQ0tFVChwQWQsIG1wZHVfYmxrKTsKIAkJLyogbW92ZSB0byBuZXh0IHNlcXVlbmNlICovCi0JCQlTdGFydFNlcSA9IG1wZHVfYmxrLT5TZXF1ZW5jZTsKKwkJU3RhcnRTZXEgPSBtcGR1X2Jsay0+U2VxdWVuY2U7CiAJCUxhc3RJbmRTZXEgPSBTdGFydFNlcTsKIAkJLyogZnJlZSBtcGR1X2JsayAqLwotCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKwkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKIAl9CiAKIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKQEAgLTM2Miw1MSArMzM0LDQ0IEBACiAJcmV0dXJuIExhc3RJbmRTZXE7CiB9CiAKLXN0YXRpYyB2b2lkIGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKAotCQkJCQkJCQkJCQkgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQkJCQkJCQkJCQkJICAgSU4gUEJBX1JFQ19FTlRSWSAgICBwQkFFbnRyeSwKLQkJCQkJCQkJCQkJICAgSU4gVVNIT1JUICAgICAgICAgICBTZXF1ZW5jZSkKK3N0YXRpYyB2b2lkIGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJCXN0cnVjdCBydF9iYV9yZWNfZW50cnkgKnBCQUVudHJ5LAorCQkJCQkJdTE2IFNlcXVlbmNlKQogewogCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwogCiAJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Ci0Jd2hpbGUgKChtcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9wcm9iZSgmcEJBRW50cnktPmxpc3QpKSkKLQkJewotCQkJLyogZmluZCBpbi1vcmRlciBmcmFtZSAqLwotCQlpZiAoKG1wZHVfYmxrLT5TZXF1ZW5jZSA9PSBTZXF1ZW5jZSkgfHwgU0VRX1NNQUxMRVIobXBkdV9ibGstPlNlcXVlbmNlLCBTZXF1ZW5jZSwgTUFYU0VRKSkKLQkJeworCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfcHJvYmUoJnBCQUVudHJ5LT5saXN0KSkpIHsKKwkJLyogZmluZCBpbi1vcmRlciBmcmFtZSAqLworCQlpZiAoKG1wZHVfYmxrLT5TZXF1ZW5jZSA9PSBTZXF1ZW5jZSkKKwkJICAgIHx8IFNFUV9TTUFMTEVSKG1wZHVfYmxrLT5TZXF1ZW5jZSwgU2VxdWVuY2UsIE1BWFNFUSkpIHsKIAkJCS8qIGRlcXVldWUgaW4tb3JkZXIgZnJhbWUgZnJvbSByZW9kZXJpbmcgbGlzdCAqLwogCQkJbXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpOwogCQkJLyogcGFzcyB0aGlzIGZyYW1lIHVwICovCiAJCQlBTk5PVU5DRV9SRU9SREVSSU5HX1BBQ0tFVChwQWQsIG1wZHVfYmxrKTsKIAkJCS8qIGZyZWUgbXBkdV9ibGsgKi8KIAkJCWJhX21wZHVfYmxrX2ZyZWUocEFkLCBtcGR1X2Jsayk7CisJCX0gZWxzZSB7CisJCQlicmVhazsKIAkJfQotCQllbHNlCi0JCQl7Ci0JCQkJYnJlYWs7Ci0JCQl9CiAJfQogCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOwogfQogCi0KLXN0YXRpYyB2b2lkIGJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cygKLQkJCQkJCQkJCSAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCQkJCQkJCQkJICAgUEJBX1JFQ19FTlRSWSAgICAgICBwQkFFbnRyeSkKK3N0YXRpYyB2b2lkIGJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCXN0cnVjdCBydF9iYV9yZWNfZW50cnkgKnBCQUVudHJ5KQogewogCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwogCiAJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CiAKLQkJCS8qIGRlcXVldWUgaW4tb3JkZXIgZnJhbWUgZnJvbSByZW9kZXJpbmcgbGlzdCAqLwotCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpKSkKLQl7Ci0JCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KKwkvKiBkZXF1ZXVlIGluLW9yZGVyIGZyYW1lIGZyb20gcmVvZGVyaW5nIGxpc3QgKi8KKwl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KSkpIHsKKwkJLyogcGFzcyB0aGlzIGZyYW1lIHVwICovCiAJCUFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKHBBZCwgbXBkdV9ibGspOwogCiAJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gbXBkdV9ibGstPlNlcXVlbmNlOwotCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKwkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKIAogCQkvKiB1cGRhdGUgbGFzdCBpbmRpY2F0ZWQgc2VxdWVuY2UgKi8KIAl9CkBAIC00MTUsMjQ4ICszODAsMjQwIEBACiAJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CiB9CiAKLQotLy9zdGF0aWMKLXZvaWQgYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKAotCQkJCQkJCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JCQkJCQkJCQlJTiBQQkFfUkVDX0VOVFJZICAgIHBCQUVudHJ5LAotCQkJCQkJCQkJSU4gVUxPTkcgICAgICAgICAgICBOb3czMikKLQorLypzdGF0aWMgKi8KK3ZvaWQgYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgICAgc3RydWN0IHJ0X2JhX3JlY19lbnRyeSAqcEJBRW50cnksCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgTm93MzIpCiB7Ci0JVVNIT1JUIFNlcXVlbmNlOworCXUxNiBTZXF1ZW5jZTsKIAotLy8JaWYgKChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpICYmCi0vLwkJIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gKChwQkFFbnRyeS0+QkFXaW5TaXplKjcpLzgpKSkgLy98fAotLy8JCShSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrKDEwKlJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSkgJiYKLS8vCQkgKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAocEJBRW50cnktPkJBV2luU2l6ZS84KSkpCi0JaWYgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQvNikpKQotCQkgJiYocEJBRW50cnktPmxpc3QucWxlbiA+IDEpCi0JCSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidGltZW91dFslZF0gKCUwOGx4LSUwOGx4ID0gJWQgPiAlZCk6ICV4LCBmbHVzaCBhbGwhXG4gIiwgcEJBRW50cnktPmxpc3QucWxlbiwgTm93MzIsIChwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpLAotCQkJICAgKGludCkoKGxvbmcpIE5vdzMyIC0gKGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcikpLCBNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCwKLQkJCSAgIHBCQUVudHJ5LT5MYXN0SW5kU2VxKSk7CisvKiAgICAgIGlmICgoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyK1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSAmJiAqLworLyogICAgICAgICAgICAgICAocEJBRW50cnktPmxpc3QucWxlbiA+ICgocEJBRW50cnktPkJBV2luU2l6ZSo3KS84KSkpIC8vfHwgKi8KKy8qICAgICAgICAgICAgICAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKygxMCpSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkpICYmICovCisvKiAgICAgICAgICAgICAgIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gKHBCQUVudHJ5LT5CQVdpblNpemUvOCkpKSAqLworCWlmIChSVE1QX1RJTUVfQUZURVIKKwkgICAgKCh1bnNpZ25lZCBsb25nKU5vdzMyLAorCSAgICAgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciArCisJCQkgICAgIChNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCAvIDYpKSkKKwkgICAgJiYgKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAxKQorCSAgICApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJ0aW1lb3V0WyVkXSAoJTA4bHgtJTA4bHggPSAlZCA+ICVkKTogJXgsIGZsdXNoIGFsbCFcbiAiLAorCQkJICBwQkFFbnRyeS0+bGlzdC5xbGVuLCBOb3czMiwKKwkJCSAgKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciksCisJCQkgIChpbnQpKChsb25nKU5vdzMyIC0KKwkJCQkobG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKSksCisJCQkgIE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VULCBwQkFFbnRyeS0+TGFzdEluZFNlcSkpOwogCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CiAJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOwotCX0KLQllbHNlCi0JaWYgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpKQorCX0gZWxzZQorCSAgICBpZiAoUlRNUF9USU1FX0FGVEVSCisJCSgodW5zaWduZWQgbG9uZylOb3czMiwKKwkJICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgKworCQkJCSAoUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpKQogCQkmJiAocEJBRW50cnktPmxpc3QucWxlbiA+IDApCi0JICAgKQotCQl7Ci0gICAgCQkvLwotCQkvLyBmb3JjZSBMYXN0SW5kU2VxIHRvIHNoaWZ0IHRvIExhc3RJbmRTZXErMQotICAgIAkJLy8KLSAgICAJCVNlcXVlbmNlID0gKHBCQUVudHJ5LT5MYXN0SW5kU2VxKzEpICYgTUFYU0VROwotICAgIAkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwgU2VxdWVuY2UpOwotICAgIAkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisJICAgICkgeworCQkvKiAqLworCQkvKiBmb3JjZSBMYXN0SW5kU2VxIHRvIHNoaWZ0IHRvIExhc3RJbmRTZXErMSAqLworCQkvKiAqLworCQlTZXF1ZW5jZSA9IChwQkFFbnRyeS0+TGFzdEluZFNlcSArIDEpICYgTUFYU0VROworCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBTZXF1ZW5jZSk7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOworCQkvKiAqLworCQkvKiBpbmRpY2F0ZSBpbi1vcmRlciBtcGR1cyAqLworCQkvKiAqLworCQlTZXF1ZW5jZSA9CisJCSAgICBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKHBBZCwgcEJBRW50cnksCisJCQkJCQkJICBTZXF1ZW5jZSk7CisJCWlmIChTZXF1ZW5jZSAhPSBSRVNFVF9SQ1ZfU0VRKSB7CiAJCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOwotICAgIAkJLy8KLSAgICAJCS8vIGluZGljYXRlIGluLW9yZGVyIG1wZHVzCi0gICAgCQkvLwotICAgIAkJU2VxdWVuY2UgPSBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKHBBZCwgcEJBRW50cnksIFNlcXVlbmNlKTsKLSAgICAJCWlmIChTZXF1ZW5jZSAhPSBSRVNFVF9SQ1ZfU0VRKQotICAgIAkJewotICAgIAkJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7Ci0gICAgCQl9CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19PRkYsCisJCQkgKCIleCwgZmx1c2ggb25lIVxuIiwgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsKIAogCX0KIH0KIAotCiAvKgogICogZ2VuZXJhdGUgQUREQkEgcmVxdWVzdCB0bwogICogc2V0IHVwIEJBIGFncmVlbWVudAogICovCi1WT0lEIEJBT3JpU2Vzc2lvblNldFVwKAotCQkJCQkgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCQkJCQkgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLQkJCQkJICBJTiBVQ0hBUiAgICAgICAgICAgIFRJRCwKLQkJCQkJICBJTiBVU0hPUlQgICAgICAgICAgIFRpbWVPdXQsCi0JCQkJCSAgSU4gVUxPTkcgICAgICAgICAgICBEZWxheVRpbWUsCi0JCQkJCSAgSU4gQk9PTEVBTiAgICAgICAgICBpc0ZvcmNlZCkKLQordm9pZCBCQU9yaVNlc3Npb25TZXRVcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksCisJCSAgICAgICB1OCBUSUQsCisJCSAgICAgICB1MTYgVGltZU91dCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgRGVsYXlUaW1lLCBJTiBCT09MRUFOIGlzRm9yY2VkKQogewotCS8vTUxNRV9BRERCQV9SRVFfU1RSVUNUCUFkZGJhUmVxOwotCUJBX09SSV9FTlRSWSAgICAgICAgICAgICpwQkFFbnRyeSA9IE5VTEw7Ci0JVVNIT1JUICAgICAgICAgICAgICAgICAgSWR4OwotCUJPT0xFQU4gICAgICAgICAgICAgICAgIENhbmNlbGxlZDsKKwkvKnN0cnVjdCBydF9tbG1lX2FkZGJhX3JlcSBBZGRiYVJlcTsgKi8KKwlzdHJ1Y3QgcnRfYmFfb3JpX2VudHJ5ICpwQkFFbnRyeSA9IE5VTEw7CisJdTE2IElkeDsKKwlCT09MRUFOIENhbmNlbGxlZDsKIAotCWlmICgocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSAhPSBUUlVFKSAgJiYgIChpc0ZvcmNlZCA9PSBGQUxTRSkpCisJaWYgKChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBICE9IFRSVUUpCisJICAgICYmIChpc0ZvcmNlZCA9PSBGQUxTRSkpCiAJCXJldHVybjsKIAotCS8vIGlmIHRoaXMgZW50cnkgaXMgbGltaXRlZCB0byB1c2UgbGVnYWN5IHR4IG1vZGUsIGl0IGRvZXNuJ3QgZ2VuZXJhdGUgQkEuCisJLyogaWYgdGhpcyBlbnRyeSBpcyBsaW1pdGVkIHRvIHVzZSBsZWdhY3kgdHggbW9kZSwgaXQgZG9lc24ndCBnZW5lcmF0ZSBCQS4gKi8KIAlpZiAoUlRNUFN0YUZpeGVkVHhNb2RlKHBBZCwgcEVudHJ5KSAhPSBGSVhFRF9UWE1PREVfSFQpCiAJCXJldHVybjsKIAotCWlmICgocEVudHJ5LT5CQURlY2xpbmVCaXRtYXAgJiAoMTw8VElEKSkgJiYgKGlzRm9yY2VkID09IEZBTFNFKSkKLQl7Ci0JCS8vIHRyeSBhZ2FpbiBhZnRlciAzIHNlY3MKKwlpZiAoKHBFbnRyeS0+QkFEZWNsaW5lQml0bWFwICYgKDEgPDwgVElEKSkgJiYgKGlzRm9yY2VkID09IEZBTFNFKSkgeworCQkvKiB0cnkgYWdhaW4gYWZ0ZXIgMyBzZWNzICovCiAJCURlbGF5VGltZSA9IDMwMDA7Ci0vLwkJcHJpbnRrKCJEZUNsaW5lIEJBIGZyb20gUGVlclxuIik7Ci0vLwkJcmV0dXJuOworLyogICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRlQ2xpbmUgQkEgZnJvbSBQZWVyXG4iKSk7ICovCisvKiAgICAgICAgICAgICAgcmV0dXJuOyAqLwogCX0KIAotCiAJSWR4ID0gcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtUSURdOwotCWlmIChJZHggPT0gMCkKLQl7Ci0JCS8vIGFsbG9jYXRlIGEgQkEgc2Vzc2lvbgorCWlmIChJZHggPT0gMCkgeworCQkvKiBhbGxvY2F0ZSBhIEJBIHNlc3Npb24gKi8KIAkJcEJBRW50cnkgPSBCQVRhYmxlQWxsb2NPcmlFbnRyeShwQWQsICZJZHgpOwotCQlpZiAocEJBRW50cnkgPT0gTlVMTCkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBRERCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIEJBIHNlc3Npb24gZmFpbGVkIFxuIikpOworCQlpZiAocEJBRW50cnkgPT0gTlVMTCkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQUREQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBCQSBzZXNzaW9uIGZhaWxlZCBcbiIpKTsKIAkJCXJldHVybjsKIAkJfQotCX0KLQllbHNlCi0JewotCQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07CisJfSBlbHNlIHsKKwkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKIAl9CiAKLQlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPj0gT3JpZ2luYXRvcl9XYWl0UmVzKQotCXsKKwlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPj0gT3JpZ2luYXRvcl9XYWl0UmVzKSB7CiAJCXJldHVybjsKIAl9CiAKIAlwRW50cnktPkJBT3JpV2NpZEFycmF5W1RJRF0gPSBJZHg7CiAKLQkvLyBJbml0aWFsaXplIEJBIHNlc3Npb24KKwkvKiBJbml0aWFsaXplIEJBIHNlc3Npb24gKi8KIAlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfV2FpdFJlczsKIAlwQkFFbnRyeS0+V2NpZCA9IHBFbnRyeS0+QWlkOwogCXBCQUVudHJ5LT5CQVdpblNpemUgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0OwogCXBCQUVudHJ5LT5TZXF1ZW5jZSA9IEJBX09SSV9JTklUX1NFUTsKLQlwQkFFbnRyeS0+VG9rZW4gPSAxOwkvLyAoMjAwOC0wMS0yMSkgSmFuIExlZSByZWNvbW1lbmRzIGl0IC0gdGhpcyB0b2tlbiBjYW4ndCBiZSAwCisJcEJBRW50cnktPlRva2VuID0gMTsJLyogKDIwMDgtMDEtMjEpIEphbiBMZWUgcmVjb21tZW5kcyBpdCAtIHRoaXMgdG9rZW4gY2FuJ3QgYmUgMCAqLwogCXBCQUVudHJ5LT5USUQgPSBUSUQ7CiAJcEJBRW50cnktPlRpbWVPdXRWYWx1ZSA9IFRpbWVPdXQ7CiAJcEJBRW50cnktPnBBZGFwdGVyID0gcEFkOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZW5kIEFkZEJBIHRvICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFRpZDolZCBpc0ZvcmNlZDolZCBXY2lkOiVkXG4iCi0JCSxwRW50cnktPkFkZHJbMF0scEVudHJ5LT5BZGRyWzFdLHBFbnRyeS0+QWRkclsyXQotCQkscEVudHJ5LT5BZGRyWzNdLHBFbnRyeS0+QWRkcls0XSxwRW50cnktPkFkZHJbNV0KLQkJLFRJRCxpc0ZvcmNlZCxwRW50cnktPkFpZCkpOwotCi0JaWYgKCEocEVudHJ5LT5UWEJBYml0bWFwICYgKDE8PFRJRCkpKQotCXsKLQkJUlRNUEluaXRUaW1lcihwQWQsICZwQkFFbnRyeS0+T1JJQkFUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCksIHBCQUVudHJ5LCBGQUxTRSk7Ci0JfQotCWVsc2UKKwlpZiAoIShwRW50cnktPlRYQkFiaXRtYXAgJiAoMSA8PCBUSUQpKSkgeworCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBCQUVudHJ5LT5PUklCQVRpbWVyLAorCQkJICAgICAgR0VUX1RJTUVSX0ZVTkNUSU9OKEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCksCisJCQkgICAgICBwQkFFbnRyeSwgRkFMU0UpOworCX0gZWxzZQogCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKIAotCS8vIHNldCB0aW1lciB0byBzZW5kIEFEREJBIHJlcXVlc3QKKwkvKiBzZXQgdGltZXIgdG8gc2VuZCBBRERCQSByZXF1ZXN0ICovCiAJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgRGVsYXlUaW1lKTsKIH0KIAotVk9JRCBCQU9yaVNlc3Npb25BZGQoCi0JCQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQkJCQkJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotCQkJSU4gUEZSQU1FX0FEREJBX1JTUCBwRnJhbWUpCit2b2lkIEJBT3JpU2Vzc2lvbkFkZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCBzdHJ1Y3QgcnRfZnJhbWVfYWRkYmFfcnNwICogcEZyYW1lKQogewotCUJBX09SSV9FTlRSWSAgKnBCQUVudHJ5ID0gTlVMTDsKLQlCT09MRUFOICAgICAgIENhbmNlbGxlZDsKLQlVQ0hBUiAgICAgICAgIFRJRDsKLQlVU0hPUlQgICAgICAgIElkeDsKLQlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlcjIgPSBOVUxMOwotCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOwotCVVMT05HICAgICAgICAgICBGcmFtZUxlbjsKLQlGUkFNRV9CQVIgICAgICAgRnJhbWVCYXI7CisJc3RydWN0IHJ0X2JhX29yaV9lbnRyeSAqcEJBRW50cnkgPSBOVUxMOworCUJPT0xFQU4gQ2FuY2VsbGVkOworCXU4IFRJRDsKKwl1MTYgSWR4OworCXU4ICpwT3V0QnVmZmVyMiA9IE5VTEw7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbjsKKwlzdHJ1Y3QgcnRfZnJhbWVfYmFyIEZyYW1lQmFyOwogCiAJVElEID0gcEZyYW1lLT5CYVBhcm0uVElEOwogCUlkeCA9IHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbVElEXTsKLQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07CisJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKIAotCS8vIFN0YXJ0IGZpbGwgaW4gcGFyYW1ldGVycy4KLQlpZiAoKElkeCAhPTApICYmIChwQkFFbnRyeS0+VElEID09IFRJRCkgJiYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfV2FpdFJlcykpCi0JewotCQlwQkFFbnRyeS0+QkFXaW5TaXplID0gbWluKHBCQUVudHJ5LT5CQVdpblNpemUsICgoVUNIQVIpcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSkpOworCS8qIFN0YXJ0IGZpbGwgaW4gcGFyYW1ldGVycy4gKi8KKwlpZiAoKElkeCAhPSAwKSAmJiAocEJBRW50cnktPlRJRCA9PSBUSUQpCisJICAgICYmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX1dhaXRSZXMpKSB7CisJCXBCQUVudHJ5LT5CQVdpblNpemUgPQorCQkgICAgbWluKHBCQUVudHJ5LT5CQVdpblNpemUsICgodTgpcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSkpOwogCQlCQV9NYXhXaW5TaXplUmVhc2lnbihwQWQsIHBFbnRyeSwgJnBCQUVudHJ5LT5CQVdpblNpemUpOwogCiAJCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBwRnJhbWUtPlRpbWVPdXRWYWx1ZTsKIAkJcEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX0RvbmU7Ci0JCS8vIHJlc2V0IHNlcXVlbmNlIG51bWJlcgorCQlwQWQtPkJBVGFibGUubnVtRG9uZU9yaWdpbmF0b3IrKzsKKworCQkvKiByZXNldCBzZXF1ZW5jZSBudW1iZXIgKi8KIAkJcEJBRW50cnktPlNlcXVlbmNlID0gQkFfT1JJX0lOSVRfU0VROwotCQkvLyBTZXQgQml0bWFwIGZsYWcuCi0JCXBFbnRyeS0+VFhCQWJpdG1hcCB8PSAoMTw8VElEKTsKLQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJLyogU2V0IEJpdG1hcCBmbGFnLiAqLworCQlwRW50cnktPlRYQkFiaXRtYXAgfD0gKDEgPDwgVElEKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgJkNhbmNlbGxlZCk7CiAKLQkJcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSA9IDA7CS8vcEZyYW1lLT5UaW1lT3V0VmFsdWU7CisJCXBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUgPSAwOwkvKnBGcmFtZS0+VGltZU91dFZhbHVlOyAqLwogCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMgOiBUWEJBYml0bWFwID0gJXgsIEJBV2luU2l6ZSA9ICVkLCBUaW1lT3V0ID0gJWxkXG4iLCBfX2Z1bmNfXywgcEVudHJ5LT5UWEJBYml0bWFwLAotCQkJCQkJCQkgcEJBRW50cnktPkJBV2luU2l6ZSwgcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSkpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiVzIDogVFhCQWJpdG1hcCA9ICV4LCBCQVdpblNpemUgPSAlZCwgVGltZU91dCA9ICVsZFxuIiwKKwkJCSAgX19mdW5jX18sIHBFbnRyeS0+VFhCQWJpdG1hcCwgcEJBRW50cnktPkJBV2luU2l6ZSwKKwkJCSAgcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSkpOwogCi0JCS8vIFNFTkQgQkFSIDsKLQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyMik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBCQU9yaVNlc3Npb25BZGQoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQkvKiBTRU5EIEJBUiA7ICovCisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcjIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkJBIC0gQkFPcmlTZXNzaW9uQWRkKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKIAkJCXJldHVybjsKIAkJfQogCi0JCUJhckhlYWRlckluaXQocEFkLCAmRnJhbWVCYXIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBRW50cnktPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCQlCYXJIZWFkZXJJbml0KHBBZCwgJkZyYW1lQmFyLAorCQkJICAgICAgcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF0uQWRkciwKKwkJCSAgICAgIHBBZC0+Q3VycmVudEFkZHJlc3MpOwogCi0JCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLkZyYWdOdW0gPSAwOwkvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jdGlvbi4KLQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBwQkFFbnRyeS0+U2VxdWVuY2U7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCQlGcmFtZUJhci5CYXJDb250cm9sLlRJRCA9IHBCQUVudHJ5LT5USUQ7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyMiwgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJCSAgc2l6ZW9mKEZSQU1FX0JBUiksICAgICAgJkZyYW1lQmFyLAotCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7CS8qIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmN0aW9uLiAqLworCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9IHBCQUVudHJ5LT5TZXF1ZW5jZTsJLyogbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uICovCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuVElEID0gcEJBRW50cnktPlRJRDsJLyogbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uICovCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIyLCAmRnJhbWVMZW4sCisJCQkJICBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2JhciksICZGcmFtZUJhciwgRU5EX09GX0FSR1MpOwogCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlcjIsIEZyYW1lTGVuKTsKIAkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyMik7CiAKLQogCQlpZiAocEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSkKLQkJCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsIHBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUpOyAvLyBpbiBtU2VjCisJCQlSVE1QU2V0VGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCBwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlKTsJLyogaW4gbVNlYyAqLwogCX0KIH0KIAotQk9PTEVBTiBCQVJlY1Nlc3Npb25BZGQoCi0JCQkJCSAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCQkJCQkgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCi0JCQkJCSAgIElOIFBGUkFNRV9BRERCQV9SRVEgcEZyYW1lKQorQk9PTEVBTiBCQVJlY1Nlc3Npb25BZGQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCBzdHJ1Y3QgcnRfZnJhbWVfYWRkYmFfcmVxICogcEZyYW1lKQogewotCUJBX1JFQ19FTlRSWSAgICAgICAgICAgICpwQkFFbnRyeSA9IE5VTEw7Ci0JQk9PTEVBTiAgICAgICAgICAgICAgICAgU3RhdHVzID0gVFJVRTsKLQlCT09MRUFOICAgICAgICAgICAgICAgICBDYW5jZWxsZWQ7Ci0JVVNIT1JUICAgICAgICAgICAgICAgICAgSWR4OwotCVVDSEFSICAgICAgICAgICAgICAgICAgIFRJRDsKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBCQVdpblNpemU7Ci0JLy9VSU5UMzIgICAgICAgICAgICAgICAgICBWYWx1ZTsKLQkvL1VJTlQgICAgICAgICAgICAgICAgICAgIG9mZnNldDsKLQorCXN0cnVjdCBydF9iYV9yZWNfZW50cnkgKnBCQUVudHJ5ID0gTlVMTDsKKwlCT09MRUFOIFN0YXR1cyA9IFRSVUU7CisJQk9PTEVBTiBDYW5jZWxsZWQ7CisJdTE2IElkeDsKKwl1OCBUSUQ7CisJdTggQkFXaW5TaXplOworCS8qdTMyICAgICAgICAgICAgICAgICAgVmFsdWU7ICovCisJLyp1MzIgICAgICAgICAgICAgICAgICAgIG9mZnNldDsgKi8KIAogCUFTU0VSVChwRW50cnkpOwogCi0JLy8gZmluZCBUSUQKKwkvKiBmaW5kIFRJRCAqLwogCVRJRCA9IHBGcmFtZS0+QmFQYXJtLlRJRDsKIAotCUJBV2luU2l6ZSA9IG1pbigoKFVDSEFSKXBGcmFtZS0+QmFQYXJtLkJ1ZlNpemUpLCAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7CisJQkFXaW5TaXplID0KKwkgICAgbWluKCgodTgpcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSksCisJCSh1OClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KTsKIAotCS8vIEludGVsIHBhdGNoCi0JaWYgKEJBV2luU2l6ZSA9PSAwKQotCXsKKwkvKiBJbnRlbCBwYXRjaCAqLworCWlmIChCQVdpblNpemUgPT0gMCkgewogCQlCQVdpblNpemUgPSA2NDsKIAl9CiAKIAlJZHggPSBwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF07CiAKLQotCWlmIChJZHggPT0gMCkKLQl7CisJaWYgKElkeCA9PSAwKSB7CiAJCXBCQUVudHJ5ID0gQkFUYWJsZUFsbG9jUmVjRW50cnkocEFkLCAmSWR4KTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOwotCQkvLyBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzCisJCS8qIGZsdXNoIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgbXBkdXMgKi8KIAkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOwogCX0KIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMoJWxkKTogSWR4ID0gJWQsIEJBV2luU2l6ZShyZXEgJWQpID0gJWRcbiIsIF9fZnVuY19fLCBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQsIElkeCwKLQkJCQkJCQkgcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSwgQkFXaW5TaXplKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiVzKCVsZCk6IElkeCA9ICVkLCBCQVdpblNpemUocmVxICVkKSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJICBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQsIElkeCwgcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSwKKwkJICBCQVdpblNpemUpKTsKIAotCS8vIFN0YXJ0IGZpbGwgaW4gcGFyYW1ldGVycy4KLQlpZiAocEJBRW50cnkgIT0gTlVMTCkKLQl7CisJLyogU3RhcnQgZmlsbCBpbiBwYXJhbWV0ZXJzLiAqLworCWlmIChwQkFFbnRyeSAhPSBOVUxMKSB7CiAJCUFTU0VSVChwQkFFbnRyeS0+bGlzdC5xbGVuID09IDApOwogCiAJCXBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X0hhbmRsZVJlczsKQEAgLTY2NSw2NiArNjIyLDYyIEBACiAJCXBCQUVudHJ5LT5USUQgPSBUSUQ7CiAJCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBwRnJhbWUtPlRpbWVPdXRWYWx1ZTsKIAkJcEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPSBSZWNpcGllbnRfQWNjZXB0OwotCQkvLyBpbml0aWFsIHNlcXVlbmNlIG51bWJlcgotCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7IC8vcEZyYW1lLT5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxOworCQkvKiBpbml0aWFsIHNlcXVlbmNlIG51bWJlciAqLworCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7CS8qcEZyYW1lLT5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxOyAqLwogCi0JCXByaW50aygiU3RhcnQgU2VxID0gJTA4eFxuIiwgIHBGcmFtZS0+QmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwKKwkJCSAoIlN0YXJ0IFNlcSA9ICUwOHhcbiIsCisJCQkgIHBGcmFtZS0+QmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSkpOwogCi0JCWlmIChwRW50cnktPlJYQkFiaXRtYXAgJiAoMTw8VElEKSkKLQkJeworCQlpZiAocEVudHJ5LT5SWEJBYml0bWFwICYgKDEgPDwgVElEKSkgewogCQkJUlRNUENhbmNlbFRpbWVyKCZwQkFFbnRyeS0+UkVDQkFUaW1lciwgJkNhbmNlbGxlZCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBCQUVudHJ5LT5SRUNCQVRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQpLCBwQkFFbnRyeSwgVFJVRSk7CisJCX0gZWxzZSB7CisJCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBCQUVudHJ5LT5SRUNCQVRpbWVyLAorCQkJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTgorCQkJCSAgICAgIChCQVJlY1Nlc3Npb25JZGxlVGltZW91dCksIHBCQUVudHJ5LAorCQkJCSAgICAgIFRSVUUpOwogCQl9CiAKLQkJLy8gU2V0IEJpdG1hcCBmbGFnLgotCQlwRW50cnktPlJYQkFiaXRtYXAgfD0gKDE8PFRJRCk7CisJCS8qIFNldCBCaXRtYXAgZmxhZy4gKi8KKwkJcEVudHJ5LT5SWEJBYml0bWFwIHw9ICgxIDw8IFRJRCk7CiAJCXBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbVElEXSA9IElkeDsKIAotCQlwRW50cnktPkJBRGVjbGluZUJpdG1hcCAmPSB+KDE8PFRJRCk7CisJCXBFbnRyeS0+QkFEZWNsaW5lQml0bWFwICY9IH4oMSA8PCBUSUQpOwogCi0JCS8vIFNldCBCQSBzZXNzaW9uIG1hc2sgaW4gV0NJRCB0YWJsZS4KLQkJUlQyOFhYX0FERF9CQV9TRVNTSU9OX1RPX0FTSUMocEFkLCBwRW50cnktPkFpZCwgVElEKTsKKwkJLyogU2V0IEJBIHNlc3Npb24gbWFzayBpbiBXQ0lEIHRhYmxlLiAqLworCQlSVE1QX0FERF9CQV9TRVNTSU9OX1RPX0FTSUMocEFkLCBwRW50cnktPkFpZCwgVElEKTsKIAotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1BQ0VudHJ5WyVkXVJYQkFiaXRtYXAgPSAweCV4LiBCQVJlY1djaWRBcnJheT0lZFxuIiwKLQkJCQlwRW50cnktPkFpZCwgcEVudHJ5LT5SWEJBYml0bWFwLCBwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF0pKTsKLQl9Ci0JZWxzZQotCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNQUNFbnRyeVslZF1SWEJBYml0bWFwID0gMHgleC4gQkFSZWNXY2lkQXJyYXk9JWRcbiIsCisJCQkgIHBFbnRyeS0+QWlkLCBwRW50cnktPlJYQkFiaXRtYXAsCisJCQkgIHBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbVElEXSkpOworCX0gZWxzZSB7CiAJCVN0YXR1cyA9IEZBTFNFOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNhbid0IEFjY2VwdCBBRERCQSBmb3IgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggVElEID0gJWRcbiIsCi0JCQkJUFJJTlRfTUFDKHBFbnRyeS0+QWRkciksIFRJRCkpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkNhbid0IEFjY2VwdCBBRERCQSBmb3IgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggVElEID0gJWRcbiIsCisJCQkgIFBSSU5UX01BQyhwRW50cnktPkFkZHIpLCBUSUQpKTsKIAl9Ci0JcmV0dXJuKFN0YXR1cyk7CisJcmV0dXJuIChTdGF0dXMpOwogfQogCi0KLUJBX1JFQ19FTlRSWSAqQkFUYWJsZUFsbG9jUmVjRW50cnkoCi0JCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KQorc3RydWN0IHJ0X2JhX3JlY19lbnRyeSAqQkFUYWJsZUFsbG9jUmVjRW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MTYgKiBJZHgpCiB7Ci0JaW50ICAgICAgICAgICAgIGk7Ci0JQkFfUkVDX0VOVFJZICAgICpwQkFFbnRyeSA9IE5VTEw7Ci0KKwlpbnQgaTsKKwlzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwQkFFbnRyeSA9IE5VTEw7CiAKIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CiAKLQlpZiAocEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50ID49IE1BWF9CQVJFQ0lfU0VTU0lPTikKLQl7Ci0JCXByaW50aygiQkEgUmVjaXBlaW50IFNlc3Npb24gKCVsZCkgPiAlZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50LAotCQkJTUFYX0JBUkVDSV9TRVNTSU9OKTsKKwlpZiAocEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50ID49IE1BWF9CQVJFQ0lfU0VTU0lPTikgeworCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiQkEgUmVjaXBlaW50IFNlc3Npb24gKCVsZCkgPiAlZFxuIiwKKwkJCQkJcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50LAorCQkJCQlNQVhfQkFSRUNJX1NFU1NJT04pKTsKIAkJZ290byBkb25lOwogCX0KLQotCS8vIHJlc2VydmUgaWR4IDAgdG8gaWRlbnRpZnkgQkFXY2lkQXJyYXlbVElEXSBhcyBlbXB0eQotCWZvciAoaT0xOyBpIDwgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykKLQl7Ci0JCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbaV07Ci0JCWlmICgocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X05PTkUpKQotCQl7Ci0JCQkvLyBnZXQgb25lCisJLyogcmVzZXJ2ZSBpZHggMCB0byBpZGVudGlmeSBCQVdjaWRBcnJheVtUSURdIGFzIGVtcHR5ICovCisJZm9yIChpID0gMTsgaSA8IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBpKyspIHsKKwkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbaV07CisJCWlmICgocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X05PTkUpKSB7CisJCQkvKiBnZXQgb25lICovCiAJCQlwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQrKzsKIAkJCXBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X1VTRUQ7CiAJCQkqSWR4ID0gaTsKQEAgLTczNywyNyArNjkwLDIxIEBACiAJcmV0dXJuIHBCQUVudHJ5OwogfQogCi1CQV9PUklfRU5UUlkgKkJBVGFibGVBbGxvY09yaUVudHJ5KAotCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCkKK3N0cnVjdCBydF9iYV9vcmlfZW50cnkgKkJBVGFibGVBbGxvY09yaUVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTE2ICogSWR4KQogewotCWludCAgICAgICAgICAgICBpOwotCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCWludCBpOworCXN0cnVjdCBydF9iYV9vcmlfZW50cnkgKnBCQUVudHJ5ID0gTlVMTDsKIAogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKIAotCWlmIChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yID49IChNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkpCi0JeworCWlmIChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yID49IChNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkpIHsKIAkJZ290byBkb25lOwogCX0KLQotCS8vIHJlc2VydmUgaWR4IDAgdG8gaWRlbnRpZnkgQkFXY2lkQXJyYXlbVElEXSBhcyBlbXB0eQotCWZvciAoaT0xOyBpPE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFOyBpKyspCi0JewotCQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldOwotCQlpZiAoKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfTk9ORSkpCi0JCXsKLQkJCS8vIGdldCBvbmUKKwkvKiByZXNlcnZlIGlkeCAwIHRvIGlkZW50aWZ5IEJBV2NpZEFycmF5W1RJRF0gYXMgZW1wdHkgKi8KKwlmb3IgKGkgPSAxOyBpIDwgTUFYX0xFTl9PRl9CQV9PUklfVEFCTEU7IGkrKykgeworCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXTsKKwkJaWYgKChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX05PTkUpKSB7CisJCQkvKiBnZXQgb25lICovCiAJCQlwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yKys7CiAJCQlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfVVNFRDsKIAkJCXBCQUVudHJ5LT5wQWRhcHRlciA9IHBBZDsKQEAgLTc3MSwzMiArNzE4LDI4IEBACiAJcmV0dXJuIHBCQUVudHJ5OwogfQogCi0KLVZPSUQgQkFUYWJsZUZyZWVPcmlFbnRyeSgKLQkJCQkJCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCQkJCQkJSU4gIFVMT05HICAgICAgICAgICBJZHgpCit2b2lkIEJBVGFibGVGcmVlT3JpRW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1bnNpZ25lZCBsb25nIElkeCkKIHsKLQlCQV9PUklfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKLQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQorCXN0cnVjdCBydF9iYV9vcmlfZW50cnkgKnBCQUVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnk7CiAKIAlpZiAoKElkeCA9PSAwKSB8fCAoSWR4ID49IE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSkKIAkJcmV0dXJuOwogCi0JcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOworCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07CiAKLQlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgIT0gT3JpZ2luYXRvcl9OT05FKQotCXsKKwlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgIT0gT3JpZ2luYXRvcl9OT05FKSB7CiAJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BCQUVudHJ5LT5XY2lkXTsKIAkJcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtwQkFFbnRyeS0+VElEXSA9IDA7CiAKLQogCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0JCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpCi0JCXsKLQkJIAlwRW50cnktPlRYQkFiaXRtYXAgJj0gKH4oMTw8KHBCQUVudHJ5LT5USUQpICkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFUYWJsZUZyZWVPcmlFbnRyeSBudW1Bc09yaWdpbmF0b3I9ICVsZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50KSk7Ci0JCQkvLyBFcmFzZSBCaXRtYXAgZmxhZy4KKwkJaWYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkgeworCQkJcEFkLT5CQVRhYmxlLm51bURvbmVPcmlnaW5hdG9yIC09IDE7CisJCQlwRW50cnktPlRYQkFiaXRtYXAgJj0gKH4oMSA8PCAocEJBRW50cnktPlRJRCkpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkJBVGFibGVGcmVlT3JpRW50cnkgbnVtQXNPcmlnaW5hdG9yPSAlbGRcbiIsCisJCQkJICBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQpKTsKKwkJCS8qIEVyYXNlIEJpdG1hcCBmbGFnLiAqLwogCQl9CiAKIAkJQVNTRVJUKHBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgIT0gMCk7CkBAIC04MDksMjIgKzc1MiwxNyBAQAogCX0KIH0KIAotCi1WT0lEIEJBVGFibGVGcmVlUmVjRW50cnkoCi0JCQkJCQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQkJCQkJCUlOICBVTE9ORyAgICAgICAgICAgSWR4KQordm9pZCBCQVRhYmxlRnJlZVJlY0VudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdW5zaWduZWQgbG9uZyBJZHgpCiB7Ci0JQkFfUkVDX0VOVFJZICAgICpwQkFFbnRyeSA9IE5VTEw7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7Ci0KKwlzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwQkFFbnRyeSA9IE5VTEw7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5OwogCiAJaWYgKChJZHggPT0gMCkgfHwgKElkeCA+PSBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRSkpCiAJCXJldHVybjsKIAotCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKKwlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOwogCi0JaWYgKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzICE9IFJlY2lwaWVudF9OT05FKQotCXsKKwlpZiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgIT0gUmVjaXBpZW50X05PTkUpIHsKIAkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBRW50cnktPldjaWRdOwogCQlwRW50cnktPkJBUmVjV2NpZEFycmF5W3BCQUVudHJ5LT5USURdID0gMDsKIApAQCAtODM5LDE3NyArNzc3LDE3NyBAQAogCX0KIH0KIAotCi1WT0lEIEJBT3JpU2Vzc2lvblRlYXJEb3duKAotCQkJCQkJIElOIE9VVCAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQkJCQkJCSBJTiAgICAgIFVDSEFSICAgICAgICAgICBXY2lkLAotCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFRJRCwKLQkJCQkJCSBJTiAgICAgIEJPT0xFQU4gICAgICAgICBiUGFzc2l2ZSwKLQkJCQkJCSBJTiAgICAgIEJPT0xFQU4gICAgICAgICBiRm9yY2VTZW5kKQordm9pZCBCQU9yaVNlc3Npb25UZWFyRG93bihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHU4IFdjaWQsCisJCQkgIHU4IFRJRCwKKwkJCSAgSU4gQk9PTEVBTiBiUGFzc2l2ZSwgSU4gQk9PTEVBTiBiRm9yY2VTZW5kKQogewotCVVMT05HICAgICAgICAgICBJZHggPSAwOwotCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnk7Ci0JQk9PTEVBTiAgICAgICAgIENhbmNlbGxlZDsKKwl1bnNpZ25lZCBsb25nIElkeCA9IDA7CisJc3RydWN0IHJ0X2JhX29yaV9lbnRyeSAqcEJBRW50cnk7CisJQk9PTEVBTiBDYW5jZWxsZWQ7CiAKLQlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQl7CisJaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpIHsKIAkJcmV0dXJuOwogCX0KLQotCS8vCi0JLy8gTG9jYXRlIGNvcnJlc3BvbmRpbmcgQkEgT3JpZ2luYXRvciBFbnRyeSBpbiBCQSBUYWJsZSB3aXRoIHRoZSAocEFkZHIsVElEKS4KLQkvLworCS8qICovCisJLyogTG9jYXRlIGNvcnJlc3BvbmRpbmcgQkEgT3JpZ2luYXRvciBFbnRyeSBpbiBCQSBUYWJsZSB3aXRoIHRoZSAocEFkZHIsVElEKS4gKi8KKwkvKiAqLwogCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFPcmlXY2lkQXJyYXlbVElEXTsKLQlpZiAoKElkeCA9PSAwKSB8fCAoSWR4ID49IE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSkKLQl7Ci0JCWlmIChiRm9yY2VTZW5kID09IFRSVUUpCi0JCXsKLQkJCS8vIGZvcmNlIHNlbmQgc3BlY2lmaWVkIFRJRCBEZWxCQQotCQkJTUxNRV9ERUxCQV9SRVFfU1RSVUNUICAgRGVsYmFSZXE7Ci0JCQlNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKLQkJCWlmIChFbGVtID09IE5VTEwpCi0JCQkJcmV0dXJuOworCWlmICgoSWR4ID09IDApIHx8IChJZHggPj0gTUFYX0xFTl9PRl9CQV9PUklfVEFCTEUpKSB7CisJCWlmIChiRm9yY2VTZW5kID09IFRSVUUpIHsKKwkJCS8qIGZvcmNlIHNlbmQgc3BlY2lmaWVkIFRJRCBEZWxCQSAqLworCQkJc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxIERlbGJhUmVxOworCQkJc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSA9CisJCQkgICAgKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKKwkJCQkJCQlNRU1fQUxMT0NfRkxBRyk7CisJCQlpZiAoRWxlbSAhPSBOVUxMKSB7CisJCQkJTmRpc1plcm9NZW1vcnkoJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKKwkJCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2Yoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSkpOwogCi0JCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOwotCQkJTmRpc1plcm9NZW1vcnkoRWxlbSwgc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSkpOwotCi0JCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7Ci0JCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKLQkJCURlbGJhUmVxLlRJRCA9IFRJRDsKLQkJCURlbGJhUmVxLkluaXRpYXRvciA9IE9SSUdJTkFUT1I7Ci0jaWYgMQotCQkJRWxlbS0+TXNnTGVuICA9IHNpemVvZihEZWxiYVJlcSk7Ci0JCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7Ci0JCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCWtmcmVlKEVsZW0pOwotI2Vsc2UKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZEZWxiYVJlcSk7Ci0JCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Ci0jZW5kaWYKKwkJCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsCisJCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisJCQkJRGVsYmFSZXEuV2NpZCA9IFdjaWQ7CisJCQkJRGVsYmFSZXEuVElEID0gVElEOworCQkJCURlbGJhUmVxLkluaXRpYXRvciA9IE9SSUdJTkFUT1I7CisJCQkJRWxlbS0+TXNnTGVuID0gc2l6ZW9mKERlbGJhUmVxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwKKwkJCQkJICAgICAgIHNpemVvZihEZWxiYVJlcSkpOworCQkJCU1sbWVERUxCQUFjdGlvbihwQWQsIEVsZW0pOworCQkJCWtmcmVlKEVsZW0pOworCQkJfSBlbHNlIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJICgiJXMoYkZvcmNlU2VuZCk6YWxsb2MgbWVtb3J5IGZhaWxlZCFcbiIsCisJCQkJCSAgX19mdW5jX18pKTsKKwkJCX0KIAkJfQogCiAJCXJldHVybjsKIAl9CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PldjaWQ9JWQuVElEPSVkIFxuIiwgX19mdW5jX18sIFdjaWQsIFRJRCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCIlcz09PT5XY2lkPSVkLlRJRD0lZCBcbiIsIF9fZnVuY19fLCBXY2lkLCBUSUQpKTsKIAogCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJcdD09PT5JZHggPSAlbGQsIFdjaWQ9JWQuVElEPSVkLCBPUklfQkFfU3RhdHVzID0gJWQgXG4iLCBJZHgsIFdjaWQsIFRJRCwgcEJBRW50cnktPk9SSV9CQV9TdGF0dXMpKTsKLQkvLwotCS8vIFByZXBhcmUgRGVsQkEgYWN0aW9uIGZyYW1lIGFuZCBzZW5kIHRvIHRoZSBwZWVyLgotCS8vCi0JaWYgKChiUGFzc2l2ZSA9PSBGQUxTRSkgJiYgKFRJRCA9PSBwQkFFbnRyeS0+VElEKSAmJiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKSkKLQl7Ci0JCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAgIERlbGJhUmVxOwotCQlNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKLQkJaWYgKEVsZW0gPT0gTlVMTCkKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiXHQ9PT0+SWR4ID0gJWxkLCBXY2lkPSVkLlRJRD0lZCwgT1JJX0JBX1N0YXR1cyA9ICVkIFxuIiwgSWR4LAorCQkgIFdjaWQsIFRJRCwgcEJBRW50cnktPk9SSV9CQV9TdGF0dXMpKTsKKwkvKiAqLworCS8qIFByZXBhcmUgRGVsQkEgYWN0aW9uIGZyYW1lIGFuZCBzZW5kIHRvIHRoZSBwZWVyLiAqLworCS8qICovCisJaWYgKChiUGFzc2l2ZSA9PSBGQUxTRSkgJiYgKFRJRCA9PSBwQkFFbnRyeS0+VElEKQorCSAgICAmJiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKSkgeworCQlzdHJ1Y3QgcnRfbWxtZV9kZWxiYV9yZXEgRGVsYmFSZXE7CisJCXN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0gPQorCQkgICAgKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKKwkJCQkJCU1FTV9BTExPQ19GTEFHKTsKKwkJaWYgKEVsZW0gIT0gTlVMTCkgeworCQkJTmRpc1plcm9NZW1vcnkoJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKKwkJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSk7CisKKwkJCUNPUFlfTUFDX0FERFIoRGVsYmFSZXEuQWRkciwKKwkJCQkgICAgICBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOworCQkJRGVsYmFSZXEuV2NpZCA9IFdjaWQ7CisJCQlEZWxiYVJlcS5USUQgPSBwQkFFbnRyeS0+VElEOworCQkJRGVsYmFSZXEuSW5pdGlhdG9yID0gT1JJR0lOQVRPUjsKKwkJCUVsZW0tPk1zZ0xlbiA9IHNpemVvZihEZWxiYVJlcSk7CisJCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWtmcmVlKEVsZW0pOworCQl9IGVsc2UgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiJXMoKTphbGxvYyBtZW1vcnkgZmFpbGVkIVxuIiwgX19mdW5jX18pKTsKIAkJCXJldHVybjsKLQotCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOwotCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSk7Ci0KLQkJQ09QWV9NQUNfQUREUihEZWxiYVJlcS5BZGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOwotCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKLQkJRGVsYmFSZXEuVElEID0gcEJBRW50cnktPlRJRDsKLQkJRGVsYmFSZXEuSW5pdGlhdG9yID0gT1JJR0lOQVRPUjsKLSNpZiAxCi0JCUVsZW0tPk1zZ0xlbiAgPSBzaXplb2YoRGVsYmFSZXEpOwotCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7Ci0JCU1sbWVERUxCQUFjdGlvbihwQWQsIEVsZW0pOwotCQlrZnJlZShFbGVtKTsKLSNlbHNlCi0JCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZEZWxiYVJlcSk7Ci0JCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKLSNlbmRpZgorCQl9CiAJfQogCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsICZDYW5jZWxsZWQpOwogCUJBVGFibGVGcmVlT3JpRW50cnkocEFkLCBJZHgpOwogCi0JaWYgKGJQYXNzaXZlKQotCXsKLQkJLy9CQU9yaVNlc3Npb25TZXRVcChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBUSUQsIDAsIDEwMDAwLCBUUlVFKTsKKwlpZiAoYlBhc3NpdmUpIHsKKwkJLypCQU9yaVNlc3Npb25TZXRVcChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBUSUQsIDAsIDEwMDAwLCBUUlVFKTsgKi8KIAl9CiB9CiAKLVZPSUQgQkFSZWNTZXNzaW9uVGVhckRvd24oCi0JCQkJCQkgSU4gT1VUICBQUlRNUF9BREFQVEVSICAgcEFkLAotCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFdjaWQsCi0JCQkJCQkgSU4gICAgICBVQ0hBUiAgICAgICAgICAgVElELAotCQkJCQkJIElOICAgICAgQk9PTEVBTiAgICAgICAgIGJQYXNzaXZlKQordm9pZCBCQVJlY1Nlc3Npb25UZWFyRG93bihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHU4IFdjaWQsIHU4IFRJRCwgSU4gQk9PTEVBTiBiUGFzc2l2ZSkKIHsKLQlVTE9ORyAgICAgICAgICAgSWR4ID0gMDsKLQlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5OworCXVuc2lnbmVkIGxvbmcgSWR4ID0gMDsKKwlzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwQkFFbnRyeTsKIAotCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCXsKKwlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkgewogCQlyZXR1cm47CiAJfQotCi0JLy8KLQkvLyAgTG9jYXRlIGNvcnJlc3BvbmRpbmcgQkEgT3JpZ2luYXRvciBFbnRyeSBpbiBCQSBUYWJsZSB3aXRoIHRoZSAocEFkZHIsVElEKS4KLQkvLworCS8qICovCisJLyogIExvY2F0ZSBjb3JyZXNwb25kaW5nIEJBIE9yaWdpbmF0b3IgRW50cnkgaW4gQkEgVGFibGUgd2l0aCB0aGUgKHBBZGRyLFRJRCkuICovCisJLyogKi8KIAlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF07CiAJaWYgKElkeCA9PSAwKQogCQlyZXR1cm47CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PldjaWQ9JWQuVElEPSVkIFxuIiwgX19mdW5jX18sIFdjaWQsIFRJRCkpOwotCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiVzPT09PldjaWQ9JWQuVElEPSVkIFxuIiwgX19mdW5jX18sIFdjaWQsIFRJRCkpOwogCiAJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlx0PT09PklkeCA9ICVsZCwgV2NpZD0lZC5USUQ9JWQsIFJFQ19CQV9TdGF0dXMgPSAlZCBcbiIsIElkeCwgV2NpZCwgVElELCBwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cykpOwotCS8vCi0JLy8gUHJlcGFyZSBEZWxCQSBhY3Rpb24gZnJhbWUgYW5kIHNlbmQgdG8gdGhlIHBlZXIuCi0JLy8KLQlpZiAoKFRJRCA9PSBwQkFFbnRyeS0+VElEKSAmJiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X0FjY2VwdCkpCi0JewotCQlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgICBEZWxiYVJlcTsKLQkJQk9PTEVBTiAJCQkJQ2FuY2VsbGVkOwotCQlNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKLQkJLy9VTE9ORyAgIG9mZnNldDsKLQkJLy9VSU5UMzIgIFZBTFVFOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJcdD09PT5JZHggPSAlbGQsIFdjaWQ9JWQuVElEPSVkLCBSRUNfQkFfU3RhdHVzID0gJWQgXG4iLCBJZHgsCisJCSAgV2NpZCwgVElELCBwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cykpOworCS8qICovCisJLyogUHJlcGFyZSBEZWxCQSBhY3Rpb24gZnJhbWUgYW5kIHNlbmQgdG8gdGhlIHBlZXIuICovCisJLyogKi8KKwlpZiAoKFRJRCA9PSBwQkFFbnRyeS0+VElEKQorCSAgICAmJiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X0FjY2VwdCkpIHsKKwkJc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxIERlbGJhUmVxOworCQlCT09MRUFOIENhbmNlbGxlZDsKKwkJLyp1bnNpZ25lZCBsb25nICAgb2Zmc2V0OyAqLworCQkvKnUzMiAgVkFMVUU7ICovCiAKIAkJUlRNUENhbmNlbFRpbWVyKCZwQkFFbnRyeS0+UkVDQkFUaW1lciwgJkNhbmNlbGxlZCk7CiAKLQkJLy8KLQkJLy8gMS4gU2VuZCBERUxCQSBBY3Rpb24gRnJhbWUKLQkJLy8KLQkJaWYgKGJQYXNzaXZlID09IEZBTFNFKQotCQl7Ci0JCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOwotCQkJTmRpc1plcm9NZW1vcnkoRWxlbSwgc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSkpOworCQkvKiAqLworCQkvKiAxLiBTZW5kIERFTEJBIEFjdGlvbiBGcmFtZSAqLworCQkvKiAqLworCQlpZiAoYlBhc3NpdmUgPT0gRkFMU0UpIHsKKwkJCXN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0gPQorCQkJICAgIChzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSksCisJCQkJCQkJTUVNX0FMTE9DX0ZMQUcpOworCQkJaWYgKEVsZW0gIT0gTlVMTCkgeworCQkJCU5kaXNaZXJvTWVtb3J5KCZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCQkJTmRpc1plcm9NZW1vcnkoRWxlbSwgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0pKTsKIAotCQkJQ09QWV9NQUNfQUREUihEZWxiYVJlcS5BZGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOwotCQkJRGVsYmFSZXEuV2NpZCA9IFdjaWQ7Ci0JCQlEZWxiYVJlcS5USUQgPSBUSUQ7Ci0JCQlEZWxiYVJlcS5Jbml0aWF0b3IgPSBSRUNJUElFTlQ7Ci0jaWYgMQotCQkJRWxlbS0+TXNnTGVuICA9IHNpemVvZihEZWxiYVJlcSk7Ci0JCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7Ci0JCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCWtmcmVlKEVsZW0pOwotI2Vsc2UKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZEZWxiYVJlcSk7Ci0JCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Ci0jZW5kaWYKKwkJCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsCisJCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisJCQkJRGVsYmFSZXEuV2NpZCA9IFdjaWQ7CisJCQkJRGVsYmFSZXEuVElEID0gVElEOworCQkJCURlbGJhUmVxLkluaXRpYXRvciA9IFJFQ0lQSUVOVDsKKwkJCQlFbGVtLT5Nc2dMZW4gPSBzaXplb2YoRGVsYmFSZXEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KEVsZW0tPk1zZywgJkRlbGJhUmVxLAorCQkJCQkgICAgICAgc2l6ZW9mKERlbGJhUmVxKSk7CisJCQkJTWxtZURFTEJBQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJa2ZyZWUoRWxlbSk7CisJCQl9IGVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgKCIlcygpOmFsbG9jIG1lbW9yeSBmYWlsZWQhXG4iLAorCQkJCQkgIF9fZnVuY19fKSk7CisJCQkJcmV0dXJuOworCQkJfQogCQl9CiAKLQotCQkvLwotCQkvLyAyLiBGcmVlIHJlc291cmNlIG9mIEJBIHNlc3Npb24KLQkJLy8KLQkJLy8gZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cworCQkvKiAqLworCQkvKiAyLiBGcmVlIHJlc291cmNlIG9mIEJBIHNlc3Npb24gKi8KKwkJLyogKi8KKwkJLyogZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cyAqLwogCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CiAKIAkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwogCi0JCS8vIEVyYXNlIEJpdG1hcCBmbGFnLgorCQkvKiBFcmFzZSBCaXRtYXAgZmxhZy4gKi8KIAkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBSRVNFVF9SQ1ZfU0VROwogCQlwQkFFbnRyeS0+QkFXaW5TaXplID0gMDsKLQkJLy8gRXJhc2UgQml0bWFwIGZsYWcgYXQgc29mdHdhcmUgbWFjdGFibGUKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5SWEJBYml0bWFwICY9ICh+KDE8PChwQkFFbnRyeS0+VElEKSkpOworCQkvKiBFcmFzZSBCaXRtYXAgZmxhZyBhdCBzb2Z0d2FyZSBtYWN0YWJsZSAqLworCQlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLlJYQkFiaXRtYXAgJj0KKwkJICAgICh+KDEgPDwgKHBCQUVudHJ5LT5USUQpKSk7CiAJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXSA9IDA7CiAKLQkJUlQyOFhYX0RFTF9CQV9TRVNTSU9OX0ZST01fQVNJQyhwQWQsIFdjaWQsIFRJRCk7CisJCVJUTVBfREVMX0JBX1NFU1NJT05fRlJPTV9BU0lDKHBBZCwgV2NpZCwgVElEKTsKIAogCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CiAKQEAgLTEwMTgsMjAgKzk1NiwxNiBAQAogCUJBVGFibGVGcmVlUmVjRW50cnkocEFkLCBJZHgpOwogfQogCi1WT0lEIEJBU2Vzc2lvblRlYXJEb3duQUxMKAotCQkJCQkJIElOIE9VVCAgUFJUTVBfQURBUFRFUiBwQWQsCi0JCQkJCQkgSU4gICAgICBVQ0hBUiBXY2lkKQordm9pZCBCQVNlc3Npb25UZWFyRG93bkFMTChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IFdjaWQpCiB7CiAJaW50IGk7CiAKLQlmb3IgKGk9MDsgaTxOVU1fT0ZfVElEOyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCBOVU1fT0ZfVElEOyBpKyspIHsKIAkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBXY2lkLCBpLCBGQUxTRSwgRkFMU0UpOwogCQlCQVJlY1Nlc3Npb25UZWFyRG93bihwQWQsIFdjaWQsIGksIEZBTFNFKTsKIAl9CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgpAQCAtMTA0Niw1MCArOTgwLDUwIEBACiAJCQkJRkFMU0UgLCB0aGVuIGNvbnRpbnVlIGluZGljYXRlcnggYXQgdGhpcyBtb21lbnQuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQordm9pZCBCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkJICAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkJICAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLAorCQkJICAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQogewotCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnkgPSAoQkFfT1JJX0VOVFJZICopRnVuY3Rpb25Db250ZXh0OwotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCVBSVE1QX0FEQVBURVIgICBwQWQ7CisJc3RydWN0IHJ0X2JhX29yaV9lbnRyeSAqcEJBRW50cnkgPSAoc3RydWN0IHJ0X2JhX29yaV9lbnRyeSAqKUZ1bmN0aW9uQ29udGV4dDsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnk7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOwogCiAJaWYgKHBCQUVudHJ5ID09IE5VTEwpCiAJCXJldHVybjsKIAogCXBBZCA9IHBCQUVudHJ5LT5wQWRhcHRlcjsKIAotCS8vIERvIG5vdGhpbmcgaWYgbW9uaXRvciBtb2RlIGlzIG9uCi0JaWYgKE1PTklUT1JfT04ocEFkKSkKLQkJcmV0dXJuOworCXsKKwkJLyogRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24gKi8KKwkJaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJCXJldHVybjsKKwl9CiAKIAlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF07CiAKLQlpZiAoKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfV2FpdFJlcykgJiYgKHBCQUVudHJ5LT5Ub2tlbiA8IE9SSV9TRVNTSU9OX01BWF9SRVRSWSkpCi0JewotCQlNTE1FX0FEREJBX1JFUV9TVFJVQ1QgICAgQWRkYmFSZXE7CisJaWYgKChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX1dhaXRSZXMpCisJICAgICYmIChwQkFFbnRyeS0+VG9rZW4gPCBPUklfU0VTU0lPTl9NQVhfUkVUUlkpKSB7CisJCXN0cnVjdCBydF9tbG1lX2FkZGJhX3JlcSBBZGRiYVJlcTsKIAogCQlOZGlzWmVyb01lbW9yeSgmQWRkYmFSZXEsIHNpemVvZihBZGRiYVJlcSkpOwogCQlDT1BZX01BQ19BRERSKEFkZGJhUmVxLnBBZGRyLCBwRW50cnktPkFkZHIpOwotCQlBZGRiYVJlcS5XY2lkID0gKFVDSEFSKShwRW50cnktPkFpZCk7CisJCUFkZGJhUmVxLldjaWQgPSAodTgpKHBFbnRyeS0+QWlkKTsKIAkJQWRkYmFSZXEuVElEID0gcEJBRW50cnktPlRJRDsKLQkJQWRkYmFSZXEuQmFCdWZTaXplID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdDsKKwkJQWRkYmFSZXEuQmFCdWZTaXplID0KKwkJICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQ7CiAJCUFkZGJhUmVxLlRpbWVPdXRWYWx1ZSA9IDA7CiAJCUFkZGJhUmVxLlRva2VuID0gcEJBRW50cnktPlRva2VuOwotCQlNbG1lRW5xdWV1ZShwQWQsIEFDVElPTl9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BRERfQkFfQ0FURSwgc2l6ZW9mKE1MTUVfQUREQkFfUkVRX1NUUlVDVCksIChQVk9JRCkmQWRkYmFSZXEpOwotCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgT3JpIFNlc3Npb24gVGltZW91dCglZCkgdG8gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggVGlkOiVkIFdjaWQ6JWRcbiIKLQkJLHBCQUVudHJ5LT5Ub2tlbgotCQkscEVudHJ5LT5BZGRyWzBdLHBFbnRyeS0+QWRkclsxXSxwRW50cnktPkFkZHJbMl0KLQkJLHBFbnRyeS0+QWRkclszXSxwRW50cnktPkFkZHJbNF0scEVudHJ5LT5BZGRyWzVdCi0JCSxwQkFFbnRyeS0+VElELHBFbnRyeS0+QWlkKSk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FERF9CQV9DQVRFLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9hZGRiYV9yZXEpLCAodm9pZCAqKSYgQWRkYmFSZXEpOworCQlSVE1QX01MTUVfSEFORExFUihwQWQpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkJBIE9yaSBTZXNzaW9uIFRpbWVvdXQoJWQpIDogU2VuZCBBREQgQkEgYWdhaW5cbiIsCisJCQkgIHBCQUVudHJ5LT5Ub2tlbikpOworCiAJCXBCQUVudHJ5LT5Ub2tlbisrOwogCQlSVE1QU2V0VGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCBPUklfQkFfU0VTU0lPTl9USU1FT1VUKTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlCQVRhYmxlRnJlZU9yaUVudHJ5KHBBZCwgcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtwQkFFbnRyeS0+VElEXSk7CiAJfQogfQpAQCAtMTEwOCw0MTkgKzEwNDIsMzgzIEBACiAJCQkJRkFMU0UgLCB0aGVuIGNvbnRpbnVlIGluZGljYXRlcnggYXQgdGhpcyBtb21lbnQuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBCQVJlY1Nlc3Npb25JZGxlVGltZW91dCgKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit2b2lkIEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJCSAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkJICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMykKIHsKIAotCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnkgPSAoQkFfUkVDX0VOVFJZICopRnVuY3Rpb25Db250ZXh0OwotCVBSVE1QX0FEQVBURVIgICBwQWQ7Ci0JVUxPTkcgICAgICAgICAgIE5vdzMyOworCXN0cnVjdCBydF9iYV9yZWNfZW50cnkgKnBCQUVudHJ5ID0gKHN0cnVjdCBydF9iYV9yZWNfZW50cnkgKilGdW5jdGlvbkNvbnRleHQ7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXVuc2lnbmVkIGxvbmcgTm93MzI7CiAKIAlpZiAocEJBRW50cnkgPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JaWYgKChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9PSBSZWNpcGllbnRfQWNjZXB0KSkKLQl7CisJaWYgKChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9PSBSZWNpcGllbnRfQWNjZXB0KSkgewogCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3czMik7CiAKLQkJaWYgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciArIFJFQ19CQV9TRVNTSU9OX0lETEVfVElNRU9VVCkpKQotCQl7CisJCWlmIChSVE1QX1RJTUVfQUZURVIKKwkJICAgICgodW5zaWduZWQgbG9uZylOb3czMiwKKwkJICAgICAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyICsKKwkJCQkgICAgIFJFQ19CQV9TRVNTSU9OX0lETEVfVElNRU9VVCkpKSB7CiAJCQlwQWQgPSBwQkFFbnRyeS0+cEFkYXB0ZXI7Ci0JCQkvLyBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzCisJCQkvKiBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzICovCiAJCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7Ci0JCQlwcmludGsoIiVsZDogUkVDIEJBIHNlc3Npb24gVGltZW91dFxuIiwgTm93MzIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLAorCQkJCSAoIiVsZDogUkVDIEJBIHNlc3Npb24gVGltZW91dFxuIiwgTm93MzIpKTsKIAkJfQogCX0KIH0KIAotCi1WT0lEIFBlZXJBZGRCQVJlcUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi0KK3ZvaWQgUGVlckFkZEJBUmVxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQkvLwk3LjQuNC4xCi0JLy9VTE9ORwlJZHg7Ci0JVUNIQVIgICBTdGF0dXMgPSAxOwotCVVDSEFSICAgcEFkZHJbNl07Ci0JRlJBTUVfQUREQkFfUlNQIEFERGZyYW1lOwotCVBVQ0hBUiAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOwotCVBGUkFNRV9BRERCQV9SRVEgIHBBZGRyZXFGcmFtZSA9IE5VTEw7Ci0JLy9VQ0hBUgkJQnVmU2l6ZTsKLQlVTE9ORyAgICAgICBGcmFtZUxlbjsKLQlQVUxPTkcgICAgICBwdGVtcDsKLQlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeTsKKwkvKiAgICAgIDcuNC40LjEgKi8KKwkvKnVuc2lnbmVkIGxvbmcgSWR4OyAqLworCXU4IFN0YXR1cyA9IDE7CisJdTggcEFkZHJbNl07CisJc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JzcCBBRERmcmFtZTsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJaW50IE5TdGF0dXM7CisJc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JlcSAqIHBBZGRyZXFGcmFtZSA9IE5VTEw7CisJLyp1OCAgICAgICAgIEJ1ZlNpemU7ICovCisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbjsKKwl1bnNpZ25lZCBsb25nICpwdGVtcDsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwTWFjRW50cnk7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA9PT4gKFdjaWQgPSAlZClcbiIsIF9fZnVuY19fLCBFbGVtLT5XY2lkKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiVzID09PiAoV2NpZCA9ICVkKVxuIiwgX19mdW5jX18sIEVsZW0tPldjaWQpKTsKIAotCS8vaGV4X2R1bXAoIkFkZEJBUmVxIiwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4pOworCS8qaGV4X2R1bXAoIkFkZEJBUmVxIiwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4pOyAqLwogCi0JLy9BRERCQSBSZXF1ZXN0IGZyb20gdW5rbm93biBwZWVyLCBpZ25vcmUgdGhpcy4KKwkvKkFEREJBIFJlcXVlc3QgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLiAqLwogCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQogCQlyZXR1cm47CiAKIAlwTWFjRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gUGVlckFkZEJBUmVxQWN0aW9uLS0tLT4gXG4iKSk7Ci0JcHRlbXAgPSAoUFVMT05HKUVsZW0tPk1zZzsKLQkvL0RCR1BSSU5UX1JBVyhSVF9ERUJVR19FTVUsICgiJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4XG4iLCAqKHB0ZW1wKSwgKihwdGVtcCsxKSwgKihwdGVtcCsyKSwgKihwdGVtcCszKSwgKihwdGVtcCs0KSwgKihwdGVtcCs1KSwgKihwdGVtcCs2KSwgKihwdGVtcCs3KSwgKihwdGVtcCs4KSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBIC0gUGVlckFkZEJBUmVxQWN0aW9uLS0tLT4gXG4iKSk7CisJcHRlbXAgPSAodW5zaWduZWQgbG9uZyAqKUVsZW0tPk1zZzsKKwkvKkRCR1BSSU5UX1JBVyhSVF9ERUJVR19FTVUsICgiJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4XG4iLCAqKHB0ZW1wKSwgKihwdGVtcCsxKSwgKihwdGVtcCsyKSwgKihwdGVtcCszKSwgKihwdGVtcCs0KSwgKihwdGVtcCs1KSwgKihwdGVtcCs2KSwgKihwdGVtcCs3KSwgKihwdGVtcCs4KSkpOyAqLwogCi0JaWYgKFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBwQWRkcikpCi0JeworCWlmIChQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgcEFkZHIpKSB7CiAKLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID09IEZBTFNFKSAmJiBJU19IVF9TVEEocE1hY0VudHJ5KSkKLQkJewotCQkJcEFkZHJlcUZyYW1lID0gKFBGUkFNRV9BRERCQV9SRVEpKCZFbGVtLT5Nc2dbMF0pOwotCQkJcHJpbnRrKCJSY3YgV2NpZCglZCkgQWRkQkFSZXFcbiIsIEVsZW0tPldjaWQpOwotCQkJaWYgKEJBUmVjU2Vzc2lvbkFkZChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLCBwQWRkcmVxRnJhbWUpKQorCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPT0gRkFMU0UpCisJCSAgICAmJiBJU19IVF9TVEEocE1hY0VudHJ5KSkgeworCQkJcEFkZHJlcUZyYW1lID0gKHN0cnVjdCBydF9mcmFtZV9hZGRiYV9yZXEgKikgKCZFbGVtLT5Nc2dbMF0pOworCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLAorCQkJCSAoIlJjdiBXY2lkKCVkKSBBZGRCQVJlcVxuIiwgRWxlbS0+V2NpZCkpOworCQkJaWYgKEJBUmVjU2Vzc2lvbkFkZAorCQkJICAgIChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLAorCQkJICAgICBwQWRkcmVxRnJhbWUpKQogCQkJCVN0YXR1cyA9IDA7CiAJCQllbHNlCi0JCQkJU3RhdHVzID0gMzg7IC8vIG1vcmUgcGFyYW1ldGVycyBoYXZlIGludmFsaWQgdmFsdWVzCi0JCX0KLQkJZWxzZQotCQl7Ci0JCQlTdGF0dXMgPSAzNzsgLy8gdGhlIHJlcXVlc3QgaGFzIGJlZW4gZGVjbGluZWQuCisJCQkJU3RhdHVzID0gMzg7CS8qIG1vcmUgcGFyYW1ldGVycyBoYXZlIGludmFsaWQgdmFsdWVzICovCisJCX0gZWxzZSB7CisJCQlTdGF0dXMgPSAzNzsJLyogdGhlIHJlcXVlc3QgaGFzIGJlZW4gZGVjbGluZWQuICovCiAJCX0KIAl9CiAKIAlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5WYWxpZEFzQ0xJKQogCQlBU1NFUlQocEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5Tc3QgPT0gU1NUX0FTU09DKTsKIAotCXBBZGRyZXFGcmFtZSA9IChQRlJBTUVfQUREQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKLQkvLyAyLiBBbHdheXMgc2VuZCBiYWNrIEFEREJBIFJlc3BvbnNlCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBQZWVyQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCXBBZGRyZXFGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfYWRkYmFfcmVxICopICgmRWxlbS0+TXNnWzBdKTsKKwkvKiAyLiBBbHdheXMgc2VuZCBiYWNrIEFEREJBIFJlc3BvbnNlICovCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJBQ1RJT04gLSBQZWVyQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOwogCQlyZXR1cm47CiAJfQogCi0JTmRpc1plcm9NZW1vcnkoJkFERGZyYW1lLCBzaXplb2YoRlJBTUVfQUREQkFfUlNQKSk7CisJTmRpc1plcm9NZW1vcnkoJkFERGZyYW1lLCBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JzcCkpOwogCi0JLy8gMi0xLiBQcmVwYXJlIEFEREJBIFJlc3BvbnNlIGZyYW1lLgorCS8qIDItMS4gUHJlcGFyZSBBRERCQSBSZXNwb25zZSBmcmFtZS4gKi8KIAl7CiAJCWlmIChBREhPQ19PTihwQWQpKQotCQkJQWN0SGVhZGVySW5pdChwQWQsICZBRERmcmFtZS5IZHIsIHBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkFERGZyYW1lLkhkciwgcEFkZHIsCisJCQkJICAgICAgcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAJCWVsc2UKLQkJCUFjdEhlYWRlckluaXQocEFkLCAmQUREZnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkZHIpOworCQkJQWN0SGVhZGVySW5pdChwQWQsICZBRERmcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJCSAgICAgIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZGRyKTsKIAl9CiAKIAlBRERmcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0JBOwogCUFERGZyYW1lLkFjdGlvbiA9IEFEREJBX1JFU1A7CiAJQUREZnJhbWUuVG9rZW4gPSBwQWRkcmVxRnJhbWUtPlRva2VuOwotCS8vIFdoYXQgaXMgdGhlIFN0YXR1cyBjb2RlPz8gIG5lZWQgdG8gY2hlY2suCisJLyogV2hhdCBpcyB0aGUgU3RhdHVzIGNvZGU/PyAgbmVlZCB0byBjaGVjay4gKi8KIAlBRERmcmFtZS5TdGF0dXNDb2RlID0gU3RhdHVzOwogCUFERGZyYW1lLkJhUGFybS5CQVBvbGljeSA9IElNTUVEX0JBOwogCUFERGZyYW1lLkJhUGFybS5BTVNEVVN1cHBvcnRlZCA9IDA7CiAJQUREZnJhbWUuQmFQYXJtLlRJRCA9IHBBZGRyZXFGcmFtZS0+QmFQYXJtLlRJRDsKLQlBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IG1pbigoKFVDSEFSKXBBZGRyZXFGcmFtZS0+QmFQYXJtLkJ1ZlNpemUpLCAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7Ci0JaWYgKEFERGZyYW1lLkJhUGFybS5CdWZTaXplID09IDApCi0JeworCUFERGZyYW1lLkJhUGFybS5CdWZTaXplID0KKwkgICAgbWluKCgodTgpcEFkZHJlcUZyYW1lLT5CYVBhcm0uQnVmU2l6ZSksCisJCSh1OClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KTsKKwlpZiAoQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUgPT0gMCkgewogCQlBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IDY0OwogCX0KLQlBRERmcmFtZS5UaW1lT3V0VmFsdWUgPSAwOyAvL3BBZGRyZXFGcmFtZS0+VGltZU91dFZhbHVlOworCUFERGZyYW1lLlRpbWVPdXRWYWx1ZSA9IDA7CS8qcEFkZHJlcUZyYW1lLT5UaW1lT3V0VmFsdWU7ICovCiAKLQkqKFVTSE9SVCAqKSgmQUREZnJhbWUuQmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZBRERmcmFtZS5CYVBhcm0pKTsKKwkqKHUxNiAqKSAoJkFERGZyYW1lLkJhUGFybSkgPQorCSAgICBjcHUybGUxNigqKHUxNiAqKSAoJkFERGZyYW1lLkJhUGFybSkpOwogCUFERGZyYW1lLlN0YXR1c0NvZGUgPSBjcHUybGUxNihBRERmcmFtZS5TdGF0dXNDb2RlKTsKIAlBRERmcmFtZS5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihBRERmcmFtZS5UaW1lT3V0VmFsdWUpOwogCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0JCQkJCSAgc2l6ZW9mKEZSQU1FX0FEREJBX1JTUCksICAmQUREZnJhbWUsCi0JCQkgIEVORF9PRl9BUkdTKTsKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sCisJCQkgIHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfYWRkYmFfcnNwKSwgJkFERGZyYW1lLCBFTkRfT0ZfQVJHUyk7CiAJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoJWQpOiBUSUQoJWQpLCBCdWZTaXplKCVkKSA8PT0gXG4iLCBfX2Z1bmNfXywgRWxlbS0+V2NpZCwgQUREZnJhbWUuQmFQYXJtLlRJRCwKLQkJCQkJCQkgIEFERGZyYW1lLkJhUGFybS5CdWZTaXplKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiVzKCVkKTogVElEKCVkKSwgQnVmU2l6ZSglZCkgPD09IFxuIiwgX19mdW5jX18sIEVsZW0tPldjaWQsCisJCSAgQUREZnJhbWUuQmFQYXJtLlRJRCwgQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUpKTsKIH0KIAotCi1WT0lEIFBlZXJBZGRCQVJzcEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi0KK3ZvaWQgUGVlckFkZEJBUnNwQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQkvL1VDSEFSCQlJZHgsIGk7Ci0JLy9QVUNIQVIJCSAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCVBGUkFNRV9BRERCQV9SU1AgICAgcEZyYW1lID0gTlVMTDsKLQkvL1BCQV9PUklfRU5UUlkJCXBCQUVudHJ5OworCS8qdTggICAgICAgICBJZHgsIGk7ICovCisJLyp1OCAqICAgICAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7ICovCisJc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JzcCAqIHBGcmFtZSA9IE5VTEw7CisJLypzdHJ1Y3QgcnRfYmFfb3JpX2VudHJ5ICpwQkFFbnRyeTsgKi8KIAotCS8vQUREQkEgUmVzcG9uc2UgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLgorCS8qQUREQkEgUmVzcG9uc2UgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLiAqLwogCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQogCQlyZXR1cm47CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA9PT4gV2NpZCglZClcbiIsIF9fZnVuY19fLCBFbGVtLT5XY2lkKSk7CiAKLQkvL2hleF9kdW1wKCJQZWVyQWRkQkFSc3BBY3Rpb24oKSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsKKwkvKmhleF9kdW1wKCJQZWVyQWRkQkFSc3BBY3Rpb24oKSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsgKi8KIAotCWlmIChQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCi0JewotCQlwRnJhbWUgPSAoUEZSQU1FX0FEREJBX1JTUCkoJkVsZW0tPk1zZ1swXSk7CisJaWYgKFBlZXJBZGRCQVJzcEFjdGlvblNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkgeworCQlwRnJhbWUgPSAoc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JzcCAqKSAoJkVsZW0tPk1zZ1swXSk7CiAKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXHRcdCBTdGF0dXNDb2RlID0gJWRcbiIsIHBGcmFtZS0+U3RhdHVzQ29kZSkpOwotCQlzd2l0Y2ggKHBGcmFtZS0+U3RhdHVzQ29kZSkKLQkJewotCQkJY2FzZSAwOgotCQkJCS8vIEkgd2FudCBhIEJBc2Vzc2lvbiB3aXRoIHRoaXMgcGVlciBhcyBhbiBvcmlnaW5hdG9yLgotCQkJCUJBT3JpU2Vzc2lvbkFkZChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLCBwRnJhbWUpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvLyBjaGVjayBzdGF0dXMgPT0gVVNFRCA/Pz8KLQkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIEVsZW0tPldjaWQsIHBGcmFtZS0+QmFQYXJtLlRJRCwgVFJVRSwgRkFMU0UpOwotCQkJCWJyZWFrOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlx0XHQgU3RhdHVzQ29kZSA9ICVkXG4iLCBwRnJhbWUtPlN0YXR1c0NvZGUpKTsKKwkJc3dpdGNoIChwRnJhbWUtPlN0YXR1c0NvZGUpIHsKKwkJY2FzZSAwOgorCQkJLyogSSB3YW50IGEgQkFzZXNzaW9uIHdpdGggdGhpcyBwZWVyIGFzIGFuIG9yaWdpbmF0b3IuICovCisJCQlCQU9yaVNlc3Npb25BZGQocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXSwKKwkJCQkJcEZyYW1lKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogY2hlY2sgc3RhdHVzID09IFVTRUQgPz8/ICovCisJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIEVsZW0tPldjaWQsCisJCQkJCSAgICAgcEZyYW1lLT5CYVBhcm0uVElELCBUUlVFLCBGQUxTRSk7CisJCQlicmVhazsKIAkJfQotCQkvLyBSY3YgRGVjbGluZSBTdGF0dXNDb2RlCisJCS8qIFJjdiBEZWNsaW5lIFN0YXR1c0NvZGUgKi8KIAkJaWYgKChwRnJhbWUtPlN0YXR1c0NvZGUgPT0gMzcpCi0gICAgICAgICAgICB8fCAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIFNUQV9UR05fV0lGSV9PTihwQWQpICYmIChwRnJhbWUtPlN0YXR1c0NvZGUgIT0gMCkpCi0gICAgICAgICAgICApCi0JCXsKLQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uQkFEZWNsaW5lQml0bWFwIHw9IDE8PHBGcmFtZS0+QmFQYXJtLlRJRDsKKwkJICAgIHx8ICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgU1RBX1RHTl9XSUZJX09OKHBBZCkKKwkJCSYmIChwRnJhbWUtPlN0YXR1c0NvZGUgIT0gMCkpCisJCSAgICApIHsKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uQkFEZWNsaW5lQml0bWFwIHw9CisJCQkgICAgMSA8PCBwRnJhbWUtPkJhUGFybS5USUQ7CiAJCX0KIAl9CiB9CiAKLVZPSUQgUGVlckRlbEJBQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLQordm9pZCBQZWVyRGVsQkFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCS8vVUNIQVIJCQkJSWR4OwotCS8vUFVDSEFSCQkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCVBGUkFNRV9ERUxCQV9SRVEgICAgcERlbEZyYW1lID0gTlVMTDsKKwkvKnU4ICAgICAgICAgICAgICAgICAgICAgICAgIElkeDsgKi8KKwkvKnU4ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7ICovCisJc3RydWN0IHJ0X2ZyYW1lX2RlbGJhX3JlcSAqIHBEZWxGcmFtZSA9IE5VTEw7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzID09PlxuIiwgX19mdW5jX18pKTsKLQkvL0RFTEJBIFJlcXVlc3QgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLgotCWlmIChQZWVyRGVsQkFBY3Rpb25TYW5pdHkocEFkLCBFbGVtLT5XY2lkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCi0JewotCQlwRGVsRnJhbWUgPSAoUEZSQU1FX0RFTEJBX1JFUSkoJkVsZW0tPk1zZ1swXSk7Ci0JCWlmIChwRGVsRnJhbWUtPkRlbGJhUGFybS5Jbml0aWF0b3IgPT0gT1JJR0lOQVRPUikKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIFBlZXJEZWxCQUFjdGlvbi0tLS0+IE9SSUdJTkFUT1JcbiIpKTsKLQkJCUJBUmVjU2Vzc2lvblRlYXJEb3duKHBBZCwgRWxlbS0+V2NpZCwgcERlbEZyYW1lLT5EZWxiYVBhcm0uVElELCBUUlVFKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBQZWVyRGVsQkFBY3Rpb24tLS0tPiBSRUNJUElFTlQsIFJlYXNvbiA9ICVkXG4iLCAgcERlbEZyYW1lLT5SZWFzb25Db2RlKSk7Ci0JCQkvL2hleF9kdW1wKCJEZWxCQSBGcmFtZSIsIHBEZWxGcmFtZSwgRWxlbS0+TXNnTGVuKTsKLQkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgRWxlbS0+V2NpZCwgcERlbEZyYW1lLT5EZWxiYVBhcm0uVElELCBUUlVFLCBGQUxTRSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgPT0+XG4iLCBfX2Z1bmNfXykpOworCS8qREVMQkEgUmVxdWVzdCBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuICovCisJaWYgKFBlZXJEZWxCQUFjdGlvblNhbml0eShwQWQsIEVsZW0tPldjaWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkgeworCQlwRGVsRnJhbWUgPSAoc3RydWN0IHJ0X2ZyYW1lX2RlbGJhX3JlcSAqKSAoJkVsZW0tPk1zZ1swXSk7CisJCWlmIChwRGVsRnJhbWUtPkRlbGJhUGFybS5Jbml0aWF0b3IgPT0gT1JJR0lOQVRPUikgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQkEgLSBQZWVyRGVsQkFBY3Rpb24tLS0tPiBPUklHSU5BVE9SXG4iKSk7CisJCQlCQVJlY1Nlc3Npb25UZWFyRG93bihwQWQsIEVsZW0tPldjaWQsCisJCQkJCSAgICAgcERlbEZyYW1lLT5EZWxiYVBhcm0uVElELCBUUlVFKTsKKwkJfSBlbHNlIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkJBIC0gUGVlckRlbEJBQWN0aW9uLS0tLT4gUkVDSVBJRU5ULCBSZWFzb24gPSAlZFxuIiwKKwkJCQkgIHBEZWxGcmFtZS0+UmVhc29uQ29kZSkpOworCQkJLypoZXhfZHVtcCgiRGVsQkEgRnJhbWUiLCBwRGVsRnJhbWUsIEVsZW0tPk1zZ0xlbik7ICovCisJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIEVsZW0tPldjaWQsCisJCQkJCSAgICAgcERlbEZyYW1lLT5EZWxiYVBhcm0uVElELCBUUlVFLAorCQkJCQkgICAgIEZBTFNFKTsKIAkJfQogCX0KIH0KIAotCi1CT09MRUFOIENudGxFbnF1ZXVlRm9yUmVjdigKLQkJCQkJCSAgSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCQkJCQkJICBJTiBVTE9ORwkJCQlXY2lkLAotCQkJCQkJICBJTiBVTE9ORwkJCQlNc2dMZW4sCi0JCQkJCQkgIElOIFBGUkFNRV9CQV9SRVEJCXBNc2cpCitCT09MRUFOIENudGxFbnF1ZXVlRm9yUmVjdihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1bnNpZ25lZCBsb25nIFdjaWQsCisJCQkgICB1bnNpZ25lZCBsb25nIE1zZ0xlbiwgc3RydWN0IHJ0X2ZyYW1lX2JhX3JlcSAqIHBNc2cpCiB7Ci0JUEZSQU1FX0JBX1JFUSAgIHBGcmFtZSA9IHBNc2c7Ci0JLy9QUlRNUF9SRU9SREVSQlVGCXBCdWZmZXI7Ci0JLy9QUlRNUF9SRU9SREVSQlVGCXBEbWFCdWY7Ci0JUEJBX1JFQ19FTlRSWSBwQkFFbnRyeTsKLQkvL0JPT0xFQU4gCVJlc3VsdDsKLQlVTE9ORyAgIElkeDsKLQkvL1VDSEFSCU51bVJ4UGt0OwotCVVDSEFSCVRJRDsvLywgaTsKKwlzdHJ1Y3QgcnRfZnJhbWVfYmFfcmVxICogcEZyYW1lID0gcE1zZzsKKwkvKlBSVE1QX1JFT1JERVJCVUYgICAgICBwQnVmZmVyOyAqLworCS8qUFJUTVBfUkVPUkRFUkJVRiAgICAgIHBEbWFCdWY7ICovCisJc3RydWN0IHJ0X2JhX3JlY19lbnRyeSAqcEJBRW50cnk7CisJLypCT09MRUFOICAgICAgIFJlc3VsdDsgKi8KKwl1bnNpZ25lZCBsb25nIElkeDsKKwkvKnU4IE51bVJ4UGt0OyAqLworCXU4IFRJRDsJCS8qLCBpOyAqLwogCi0JVElEID0gKFVDSEFSKXBGcmFtZS0+QkFSQ29udHJvbC5USUQ7CisJVElEID0gKHU4KXBGcmFtZS0+QkFSQ29udHJvbC5USUQ7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpOiBCQVItV2NpZCglbGQpLCBUaWQgKCVkKVxuIiwgX19mdW5jX18sIFdjaWQsIFRJRCkpOwotCS8vaGV4X2R1bXAoIkJBUiIsIChQQ0hBUikgcEZyYW1lLCBNc2dMZW4pOwotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiVzKCk6IEJBUi1XY2lkKCVsZCksIFRpZCAoJWQpXG4iLCBfX2Z1bmNfXywgV2NpZCwgVElEKSk7CisJLypoZXhfZHVtcCgiQkFSIiwgKGNoYXIgKilwRnJhbWUsIE1zZ0xlbik7ICovCisJLyogRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuICovCisJLyogVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0ICovCisJaWYgKFJUTVBfVEVTVF9GTEFHCisJICAgIChwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCiAJCXJldHVybiBGQUxTRTsKIAotCS8vIEZpcnN0IGNoZWNrIHRoZSBzaXplLCBpdCBNVVNUIG5vdCBleGNlZWQgdGhlIG1sbWUgcXVldWUgc2l6ZQotCWlmIChNc2dMZW4gPiBNR01UX0RNQV9CVUZGRVJfU0laRSkKLQl7CisJLyogRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplICovCisJaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKSB7CiAJCURCR1BSSU5UX0VSUigoIkNudGxFbnF1ZXVlRm9yUmVjdjogZnJhbWUgdG9vIGxhcmdlLCBzaXplID0gJWxkIFxuIiwgTXNnTGVuKSk7CiAJCXJldHVybiBGQUxTRTsKLQl9Ci0JZWxzZSBpZiAoTXNnTGVuICE9IHNpemVvZihGUkFNRV9CQV9SRVEpKQotCXsKKwl9IGVsc2UgaWYgKE1zZ0xlbiAhPSBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2JhX3JlcSkpIHsKIAkJREJHUFJJTlRfRVJSKCgiQ250bEVucXVldWVGb3JSZWN2OiBCbG9ja0FjayBSZXF1ZXN0IGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKSk7CiAJCXJldHVybiBGQUxTRTsKLQl9Ci0JZWxzZSBpZiAoTXNnTGVuICE9IHNpemVvZihGUkFNRV9CQV9SRVEpKQotCXsKKwl9IGVsc2UgaWYgKE1zZ0xlbiAhPSBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2JhX3JlcSkpIHsKIAkJREJHUFJJTlRfRVJSKCgiQ250bEVucXVldWVGb3JSZWN2OiBCbG9ja0FjayBSZXF1ZXN0IGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKSk7CiAJCXJldHVybiBGQUxTRTsKIAl9CiAKLQlpZiAoKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkgJiYgKFRJRCA8IDgpKQotCQl7Ci0JCS8vIGlmIHRoaXMgcmVjZWl2aW5nIHBhY2tldCBpcyBmcm9tIFNBIHRoYXQgaXMgaW4gb3VyIE9yaUVudHJ5LiBTaW5jZSBXQ0lEIDw5IGhhcyBkaXJlY3QgbWFwcGluZy4gbm8gbmVlZCBzZWFyY2guCisJaWYgKChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpICYmIChUSUQgPCA4KSkgeworCQkvKiBpZiB0aGlzIHJlY2VpdmluZyBwYWNrZXQgaXMgZnJvbSBTQSB0aGF0IGlzIGluIG91ciBPcmlFbnRyeS4gU2luY2UgV0NJRCA8OSBoYXMgZGlyZWN0IG1hcHBpbmcuIG5vIG5lZWQgc2VhcmNoLiAqLwogCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF07CiAJCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07Ci0JCX0KLQkJZWxzZQotCQl7CisJfSBlbHNlIHsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBUiglbGQpIDogVGlkICglZCkgLSAlMDR4OiUwNHhcbiIsIFdjaWQsIFRJRCwgcEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxLCBwQkFFbnRyeS0+TGFzdEluZFNlcSApKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQkFSKCVsZCkgOiBUaWQgKCVkKSAtICUwNHg6JTA0eFxuIiwgV2NpZCwgVElELAorCQkgIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsKIAotCWlmIChTRVFfU01BTExFUihwQkFFbnRyeS0+TGFzdEluZFNlcSwgcEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxLCBNQVhTRVEpKQotCXsKLQkJLy9wcmludGsoIkJBUiBTZXEgPSAleCwgTGFzdEluZFNlcSA9ICV4XG4iLCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsIHBCQUVudHJ5LT5MYXN0SW5kU2VxKTsKLQkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwgcEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxKTsKLQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSAocEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID09IDApID8gTUFYU0VRIDoocEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxIC0xKTsKKwlpZiAoU0VRX1NNQUxMRVIKKwkgICAgKHBCQUVudHJ5LT5MYXN0SW5kU2VxLCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsCisJICAgICBNQVhTRVEpKSB7CisJCS8qREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFSIFNlcSA9ICV4LCBMYXN0SW5kU2VxID0gJXhcbiIsIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsgKi8KKwkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwKKwkJCQkJCSAgICBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuCisJCQkJCQkgICAgU3RhcnRTZXEpOworCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9CisJCSAgICAocEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID09CisJCSAgICAgMCkgPyBNQVhTRVEgOiAocEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxIC0gMSk7CiAJfQotCS8vYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCS8qYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOyAqLwogCXJldHVybiBUUlVFOwogfQogCiAvKgogRGVzY3JpcHRpb24gOiBTZW5kIFBTTVAgQWN0aW9uIGZyYW1lIElmIFBTTVAgbW9kZSBzd2l0Y2hlcy4KICovCi1WT0lEIFNlbmRQU01QQWN0aW9uKAotCQkJCSAgIElOIFBSVE1QX0FEQVBURVIJCXBBZCwKLQkJCQkgICBJTiBVQ0hBUgkJCQlXY2lkLAotCQkJCSAgIElOIFVDSEFSCQkJCVBzbXApCit2b2lkIFNlbmRQU01QQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggV2NpZCwgdTggUHNtcCkKIHsKLQlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7Ci0JLy9VTE9ORyAgICAgICAgICAgSWR4OwotCUZSQU1FX1BTTVBfQUNUSU9OICAgRnJhbWU7Ci0JVUxPTkcgICAgICAgICAgIEZyYW1lTGVuOwotCVVDSEFSCQkJYmJwZGF0YT0wOwotCVVJTlQzMgkJCW1hY2RhdGE7CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCWludCBOU3RhdHVzOworCS8qdW5zaWduZWQgbG9uZyAgICAgICAgICAgSWR4OyAqLworCXN0cnVjdCBydF9mcmFtZV9wc21wX2FjdGlvbiBGcmFtZTsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuOwogCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CiAJCXJldHVybjsKIAl9CiAKLQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkgICAgICBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOwogCiAJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9IVDsKIAlGcmFtZS5BY3Rpb24gPSBTTVBTX0FDVElPTjsKLQlzd2l0Y2ggKFBzbXApCi0JewotCQljYXNlIE1NUFNfRU5BQkxFOgotCQkJaWYgKElTX1JUMzA5MChwQWQpKQotCQkJewotCQkJCS8vIGRpc2FibGUgTU1QUyBCQlAgY29udHJvbCByZWdpc3RlcgotCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJmJicGRhdGEpOwotCQkJCWJicGRhdGEgJj0gfigweDA0KTsJLy9iaXQgMgotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIGJicGRhdGEpOwotCi0JCQkJLy8gZGlzYWJsZSBNTVBTIE1BQyBjb250cm9sIHJlZ2lzdGVyCi0JCQkJUlRNUF9JT19SRUFEMzIocEFkLCAweDEyMTAsICZtYWNkYXRhKTsKLQkJCQltYWNkYXRhICY9IH4oMHgwOSk7CS8vYml0IDAsIDMKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAweDEyMTAsIG1hY2RhdGEpOwotCQkJfQotCQkJRnJhbWUuUHNtcCA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBNTVBTX0RZTkFNSUM6Ci0JCQlpZiAoSVNfUlQzMDkwKHBBZCkpCi0JCQl7Ci0JCQkJLy8gZW5hYmxlIE1NUFMgQkJQIGNvbnRyb2wgcmVnaXN0ZXIKLQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZiYnBkYXRhKTsKLQkJCQliYnBkYXRhIHw9IDB4MDQ7CS8vYml0IDIKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBiYnBkYXRhKTsKLQotCQkJCS8vIGVuYWJsZSBNTVBTIE1BQyBjb250cm9sIHJlZ2lzdGVyCi0JCQkJUlRNUF9JT19SRUFEMzIocEFkLCAweDEyMTAsICZtYWNkYXRhKTsKLQkJCQltYWNkYXRhIHw9IDB4MDk7CS8vYml0IDAsIDMKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAweDEyMTAsIG1hY2RhdGEpOwotCQkJfQotCQkJRnJhbWUuUHNtcCA9IDM7Ci0JCQlicmVhazsKLQkJY2FzZSBNTVBTX1NUQVRJQzoKLQkJCWlmIChJU19SVDMwOTAocEFkKSkKLQkJCXsKLQkJCQkvLyBlbmFibGUgTU1QUyBCQlAgY29udHJvbCByZWdpc3RlcgotCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJmJicGRhdGEpOwotCQkJCWJicGRhdGEgfD0gMHgwNDsJLy9iaXQgMgotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIGJicGRhdGEpOwotCi0JCQkJLy8gZW5hYmxlIE1NUFMgTUFDIGNvbnRyb2wgcmVnaXN0ZXIKLQkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTIxMCwgJm1hY2RhdGEpOwotCQkJCW1hY2RhdGEgfD0gMHgwOTsJLy9iaXQgMCwgMwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIDB4MTIxMCwgbWFjZGF0YSk7Ci0JCQl9Ci0JCQlGcmFtZS5Qc21wID0gMTsKLQkJCWJyZWFrOworCXN3aXRjaCAoUHNtcCkgeworCWNhc2UgTU1QU19FTkFCTEU6CisjaWZkZWYgUlQzMHh4CisJCWlmIChJU19SVDMweHgocEFkKQorCQkgICAgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPiAxCisJCQl8fCBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID4gMSkpIHsKKwkJCVJUTVBfQVNJQ19NTVBTX0RJU0FCTEUocEFkKTsKKwkJfQorI2VuZGlmIC8qIFJUMzB4eCAvLyAqLworCQlGcmFtZS5Qc21wID0gMDsKKwkJYnJlYWs7CisJY2FzZSBNTVBTX0RZTkFNSUM6CisJCUZyYW1lLlBzbXAgPSAzOworCQlicmVhazsKKwljYXNlIE1NUFNfU1RBVElDOgorI2lmZGVmIFJUMzB4eAorCQlpZiAoSVNfUlQzMHh4KHBBZCkKKwkJICAgICYmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID4gMQorCQkJfHwgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA+IDEpKSB7CisJCQlSVE1QX0FTSUNfTU1QU19FTkFCTEUocEFkKTsKKwkJfQorI2VuZGlmIC8qIFJUMzB4eCAvLyAqLworCQlGcmFtZS5Qc21wID0gMTsKKwkJYnJlYWs7CiAJfQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkgIHNpemVvZihGUkFNRV9QU01QX0FDVElPTiksICAgICAgJkZyYW1lLAotCQkJCQkgIEVORF9PRl9BUkdTKTsKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sCisJCQkgIHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfcHNtcF9hY3Rpb24pLCAmRnJhbWUsIEVORF9PRl9BUkdTKTsKIAlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwogCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJIVCAtIFNlbmRQU01QQWN0aW9uKCAlZCApICBcbiIsIEZyYW1lLlBzbXApKTsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJIVCAtIFNlbmRQU01QQWN0aW9uKCAlZCApICBcbiIsIEZyYW1lLlBzbXApKTsKIH0KIAotCiAjZGVmaW5lIFJBRElPX01FQVNVUkVNRU5UX1JFUVVFU1RfQUNUSU9OCTAKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VECitzdHJ1Y3QgUEFDS0VEIHJ0X2JlYWNvbl9yZXF1ZXN0IHsKKwl1OCBSZWd1bGF0b3J5Q2xhc3M7CisJdTggQ2hhbm5lbE51bWJlcjsKKwl1MTYgUmFuZG9tSW50ZXJ2YWw7CisJdTE2IE1lYXN1cmVtZW50RHVyYXRpb247CisJdTggTWVhc3VyZW1lbnRNb2RlOworCXU4IEJTU0lEW01BQ19BRERSX0xFTl07CisJdTggUmVwb3J0aW5nQ29uZGl0aW9uOworCXU4IFRocmVzaG9sZDsKKwl1OCBTU0lESUVbMl07CS8qIDIgYnl0ZSAqLworfTsKKworc3RydWN0IFBBQ0tFRCBydF9tZWFzdXJlbWVudF9yZXEgeworCXU4IElEOworCXU4IExlbmd0aDsKKwl1OCBUb2tlbjsKKwl1OCBSZXF1ZXN0TW9kZTsKKwl1OCBUeXBlOworfTsKKwordm9pZCBjb252ZXJ0X3Jlb3JkZXJpbmdfcGFja2V0X3RvX3ByZUFNU0RVX29yXzgwMl8zX3BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCQkJICAgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLAorCQkJCQkJCSAgIHU4CisJCQkJCQkJICAgRnJvbVdoaWNoQlNTSUQpCiB7Ci0JVUNIQVIJUmVndWxhdG9yeUNsYXNzOwotCVVDSEFSCUNoYW5uZWxOdW1iZXI7Ci0JVVNIT1JUCVJhbmRvbUludGVydmFsOwotCVVTSE9SVAlNZWFzdXJlbWVudER1cmF0aW9uOwotCVVDSEFSCU1lYXN1cmVtZW50TW9kZTsKLQlVQ0hBUiAgIEJTU0lEW01BQ19BRERSX0xFTl07Ci0JVUNIQVIJUmVwb3J0aW5nQ29uZGl0aW9uOwotCVVDSEFSCVRocmVzaG9sZDsKLQlVQ0hBUiAgIFNTSURJRVsyXTsJCQkvLyAyIGJ5dGUKLX0gQkVBQ09OX1JFUVVFU1Q7CisJdm9pZCAqcFJ4UGt0OworCXU4IEhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRAotewotCVVDSEFSCUlEOwotCVVDSEFSCUxlbmd0aDsKLQlVQ0hBUglUb2tlbjsKLQlVQ0hBUglSZXF1ZXN0TW9kZTsKLQlVQ0hBUglUeXBlOwotfSBNRUFTVVJFTUVOVF9SRVE7Ci0KLQotCi0KLXZvaWQgY29udmVydF9yZW9yZGVyaW5nX3BhY2tldF90b19wcmVBTVNEVV9vcl84MDJfM19wYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKLXsKLQlQTkRJU19QQUNLRVQJcFJ4UGt0OwotCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKLQotCS8vIDEuIGdldCA4MDIuMyBIZWFkZXIKLQkvLyAyLiByZW1vdmUgTExDCi0JLy8gCQlhLiBwb2ludGVyIHBSeEJsay0+cERhdGEgdG8gcGF5bG9hZAotCS8vICAgICAgYi4gbW9kaWZ5IHBSeEJsay0+RGF0YVNpemUKKwkvKiAxLiBnZXQgODAyLjMgSGVhZGVyICovCisJLyogMi4gcmVtb3ZlIExMQyAqLworCS8qICAgICAgICAgICAgICBhLiBwb2ludGVyIHBSeEJsay0+cERhdGEgdG8gcGF5bG9hZCAqLworCS8qICAgICAgYi4gbW9kaWZ5IHBSeEJsay0+RGF0YVNpemUgKi8KIAogCVJUTVBfODAyXzExX1JFTU9WRV9MTENfQU5EX0NPTlZFUlRfVE9fODAyXzMocFJ4QmxrLCBIZWFkZXI4MDJfMyk7CiAKIAlBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOwogCXBSeFBrdCA9IFJUUEtUX1RPX09TUEtUKHBSeEJsay0+cFJ4UGFja2V0KTsKIAotCVJUUEtUX1RPX09TUEtUKHBSeFBrdCktPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKLQlSVFBLVF9UT19PU1BLVChwUnhQa3QpLT5kYXRhID0gcFJ4QmxrLT5wRGF0YTsKLQlSVFBLVF9UT19PU1BLVChwUnhQa3QpLT5sZW4gPSBwUnhCbGstPkRhdGFTaXplOwotCVJUUEtUX1RPX09TUEtUKHBSeFBrdCktPnRhaWwgPSBSVFBLVF9UT19PU1BLVChwUnhQa3QpLT5kYXRhICsgUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+bGVuOworCVNFVF9PU19QS1RfTkVUREVWKHBSeFBrdCwgZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpKTsKKwlTRVRfT1NfUEtUX0RBVEFQVFIocFJ4UGt0LCBwUnhCbGstPnBEYXRhKTsKKwlTRVRfT1NfUEtUX0xFTihwUnhQa3QsIHBSeEJsay0+RGF0YVNpemUpOworCVNFVF9PU19QS1RfREFUQVRBSUwocFJ4UGt0LCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplKTsKIAotCS8vCi0JLy8gY29weSA4MDIuMyBoZWFkZXIsIGlmIG5lY2Vzc2FyeQotCS8vCi0JaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSkKLQl7CisJLyogKi8KKwkvKiBjb3B5IDgwMi4zIGhlYWRlciwgaWYgbmVjZXNzYXJ5ICovCisJLyogKi8KKwlpZiAoIVJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1TRFUpKSB7CisJCXsKICNpZmRlZiBMSU5VWAotCQlOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwUnhQa3QsIExFTkdUSF84MDJfMyksIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMpOworCQkJTmRpc01vdmVNZW1vcnkoc2tiX3B1c2gocFJ4UGt0LCBMRU5HVEhfODAyXzMpLAorCQkJCSAgICAgICBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zKTsKICNlbmRpZgorCQl9CiAJfQogfQogCi0KICNkZWZpbmUgSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKF9wQWQsIF9wUnhCbGssIF9mcm9tV2hpY2hCU1NJRCkJCVwKIAlkbwkJCQkJCQkJCQkJCQkJCQkJXAogCXsJCQkJCQkJCQkJCQkJCQkJCVwKQEAgLTE1MzgsNjEgKzE0MzYsNjAgQEAKICAgICAJfQkJCQkJCQkJCQkJCQkJCQlcCiAJfSB3aGlsZSAoMCk7CiAKLQotCi1zdGF0aWMgVk9JRCBiYV9lbnF1ZXVlX3Jlb3JkZXJpbmdfcGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBCQV9SRUNfRU5UUlkJcEJBRW50cnksCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQorc3RhdGljIHZvaWQgYmFfZW5xdWV1ZV9yZW9yZGVyaW5nX3BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSBzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwQkFFbnRyeSwKKwkJCQkJIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywKKwkJCQkJIHU4IEZyb21XaGljaEJTU0lEKQogewogCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwotCVVJTlQxNglTZXF1ZW5jZSA9IChVSU5UMTYpIHBSeEJsay0+cEhlYWRlci0+U2VxdWVuY2U7CisJdTE2IFNlcXVlbmNlID0gKHUxNilwUnhCbGstPnBIZWFkZXItPlNlcXVlbmNlOwogCiAJbXBkdV9ibGsgPSBiYV9tcGR1X2Jsa19hbGxvYyhwQWQpOwotCWlmIChtcGR1X2JsayAhPSBOVUxMKQotCXsKLQkJLy8gV3JpdGUgUnhEIGJ1ZmZlciBhZGRyZXNzICYgYWxsb2NhdGVkIGJ1ZmZlciBsZW5ndGgKKwlpZiAoKG1wZHVfYmxrICE9IE5VTEwpICYmICghUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9FQVApKSkgeworCQkvKiBXcml0ZSBSeEQgYnVmZmVyIGFkZHJlc3MgJiBhbGxvY2F0ZWQgYnVmZmVyIGxlbmd0aCAqLwogCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKIAogCQltcGR1X2Jsay0+U2VxdWVuY2UgPSBTZXF1ZW5jZTsKIAogCQltcGR1X2Jsay0+YkFNU0RVID0gUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSk7CiAKLQkJY29udmVydF9yZW9yZGVyaW5nX3BhY2tldF90b19wcmVBTVNEVV9vcl84MDJfM19wYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJY29udmVydF9yZW9yZGVyaW5nX3BhY2tldF90b19wcmVBTVNEVV9vcl84MDJfM19wYWNrZXQocEFkLAorCQkJCQkJCQkgICAgICBwUnhCbGssCisJCQkJCQkJCSAgICAgIEZyb21XaGljaEJTU0lEKTsKIAogCQlTVEFUU19JTkNfUlhfUEFDS0VUUyhwQWQsIEZyb21XaGljaEJTU0lEKTsKIAotICAgICAgICAvLwotCQkvLyBpdCBpcyBuZWNlc3NhcnkgZm9yIHJlb3JkZXJpbmcgcGFja2V0IHRvIHJlY29yZAotCQkvLyB3aGljaCBCU1MgaXQgY29tZSBmcm9tCi0JCS8vCisJCS8qICovCisJCS8qIGl0IGlzIG5lY2Vzc2FyeSBmb3IgcmVvcmRlcmluZyBwYWNrZXQgdG8gcmVjb3JkICovCisJCS8qIHdoaWNoIEJTUyBpdCBjb21lIGZyb20gKi8KKwkJLyogKi8KIAkJUlRNUF9TRVRfUEFDS0VUX0lGKHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7CiAKIAkJbXBkdV9ibGstPnBQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKIAotCQlpZiAoYmFfcmVvcmRlcmluZ19tcGR1X2luc2VydHNvcnRlZCgmcEJBRW50cnktPmxpc3QsIG1wZHVfYmxrKSA9PSBGQUxTRSkKLQkJewotCQkJLy8gaGFkIGJlZW4gYWxyZWFkeSB3aXRoaW4gcmVvcmRlcmluZyBsaXN0Ci0JCQkvLyBkb24ndCBpbmRpY2F0ZQotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJaWYgKGJhX3Jlb3JkZXJpbmdfbXBkdV9pbnNlcnRzb3J0ZWQoJnBCQUVudHJ5LT5saXN0LCBtcGR1X2JsaykKKwkJICAgID09IEZBTFNFKSB7CisJCQkvKiBoYWQgYmVlbiBhbHJlYWR5IHdpdGhpbiByZW9yZGVyaW5nIGxpc3QgKi8KKwkJCS8qIGRvbid0IGluZGljYXRlICovCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsCisJCQkJCSAgICBORElTX1NUQVRVU19TVUNDRVNTKTsKIAkJCWJhX21wZHVfYmxrX2ZyZWUocEFkLCBtcGR1X2Jsayk7CiAJCX0KIAotCQlBU1NFUlQoKDA8PSBwQkFFbnRyeS0+bGlzdC5xbGVuKSAgJiYgKHBCQUVudHJ5LT5saXN0LnFsZW4gPD0gcEJBRW50cnktPkJBV2luU2l6ZSkpOworCQlBU1NFUlQoKDAgPD0gcEJBRW50cnktPmxpc3QucWxlbikKKwkJICAgICAgICYmIChwQkFFbnRyeS0+bGlzdC5xbGVuIDw9IHBCQUVudHJ5LT5CQVdpblNpemUpKTsKIAkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAgKCIhISEgKCVkKSBDYW4ndCBhbGxvY2F0ZSByZW9yZGVyaW5nIG1wZHUgYmxrXG4iLAotCQkJCQkJCQkgICBwQkFFbnRyeS0+bGlzdC5xbGVuKSk7CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIgKCVkKSBDYW4ndCBhbGxvY2F0ZSByZW9yZGVyaW5nIG1wZHUgYmxrXG4iLAorCQkJICBwQkFFbnRyeS0+bGlzdC5xbGVuKSk7CiAKIAkJLyoKIAkJICogZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cwogCQkgKiBhbmQgcmVjZXZpbmcgbXBkdSB0byB1cHBlciBsYXllcgogCQkgKiBtYWtlIHRjcC9pcCB0byB0YWtlIGNhcmUgcmVvcmRlcmluZyBtZWNoYW5pc20KIAkJICovCi0JCS8vYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCQkvKmJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsgKi8KIAkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwgU2VxdWVuY2UpOwogCiAJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7CkBAIC0xNjAwLDcgKzE0OTcsNiBAQAogCX0KIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CkBAIC0xNjE5LDEzOSArMTUxNSwxMzQgQEAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCiAKLVZPSUQgSW5kaWNhdGVfQU1QRFVfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3ZvaWQgSW5kaWNhdGVfQU1QRFVfUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpCiB7Ci0JVVNIT1JUCQkJCUlkeDsKLQlQQkFfUkVDX0VOVFJZCQlwQkFFbnRyeSA9IE5VTEw7Ci0JVUlOVDE2CQkJCVNlcXVlbmNlID0gcFJ4QmxrLT5wSGVhZGVyLT5TZXF1ZW5jZTsKLQlVTE9ORwkJCQlOb3czMjsKLQlVQ0hBUgkJCQlXY2lkID0gcFJ4QmxrLT5wUnhXSS0+V2lyZWxlc3NDbGlJRDsKLQlVQ0hBUgkJCQlUSUQgPSBwUnhCbGstPnBSeFdJLT5USUQ7CisJdTE2IElkeDsKKwlzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwQkFFbnRyeSA9IE5VTEw7CisJdTE2IFNlcXVlbmNlID0gcFJ4QmxrLT5wSGVhZGVyLT5TZXF1ZW5jZTsKKwl1bnNpZ25lZCBsb25nIE5vdzMyOworCXU4IFdjaWQgPSBwUnhCbGstPnBSeFdJLT5XaXJlbGVzc0NsaUlEOworCXU4IFRJRCA9IHBSeEJsay0+cFJ4V0ktPlRJRDsKIAotCi0JaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSAmJiAgKHBSeEJsay0+RGF0YVNpemUgPiBNQVhfUlhfUEtUX0xFTikpCi0JewotCQkvLyByZWxlYXNlIHBhY2tldAotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCWlmICghUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSkKKwkgICAgJiYgKHBSeEJsay0+RGF0YVNpemUgPiBNQVhfUlhfUEtUX0xFTikpIHsKKwkJLyogcmVsZWFzZSBwYWNrZXQgKi8KKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LAorCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JeworCWlmIChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpIHsKIAkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQVJlY1djaWRBcnJheVtUSURdOwotCQlpZiAoSWR4ID09IDApCi0JCXsKKwkJaWYgKElkeCA9PSAwKSB7CiAJCQkvKiBSZWMgQkEgU2Vzc2lvbiBoYWQgYmVlbiB0b3JuIGRvd24gKi8KIAkJCUlORElDQVRFX0xFR0FDWV9PUl9BTVNEVShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwogCQkJcmV0dXJuOwogCQl9CiAJCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIGltcG9zc2libGUgISEhCisJfSBlbHNlIHsKKwkJLyogaW1wb3NzaWJsZSAhICovCiAJCUFTU0VSVCgwKTsKLQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJLyogcmVsZWFzZSBwYWNrZXQgKi8KKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LAorCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJcmV0dXJuOwogCX0KIAogCUFTU0VSVChwQkFFbnRyeSk7CiAKLQkvLyB1cGRhdGUgbGFzdCByeCB0aW1lCisJLyogdXBkYXRlIGxhc3QgcnggdGltZSAqLwogCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdzMyKTsKIAogCXBCQUVudHJ5LT5yY3ZTZXEgPSBTZXF1ZW5jZTsKIAotCiAJYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKHBBZCwgcEJBRW50cnksIE5vdzMyKTsKIAlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKIAotCS8vCi0JLy8gUmVzZXQgTGFzdCBJbmRpY2F0ZSBTZXF1ZW5jZQotCS8vCi0JaWYgKHBCQUVudHJ5LT5MYXN0SW5kU2VxID09IFJFU0VUX1JDVl9TRVEpCi0JewotCQlBU1NFUlQoKHBCQUVudHJ5LT5saXN0LnFsZW4gPT0gMCkgJiYgKHBCQUVudHJ5LT5saXN0Lm5leHQgPT0gTlVMTCkpOworCS8qICovCisJLyogUmVzZXQgTGFzdCBJbmRpY2F0ZSBTZXF1ZW5jZSAqLworCS8qICovCisJaWYgKHBCQUVudHJ5LT5MYXN0SW5kU2VxID09IFJFU0VUX1JDVl9TRVEpIHsKKwkJQVNTRVJUKChwQkFFbnRyeS0+bGlzdC5xbGVuID09IDApCisJCSAgICAgICAmJiAocEJBRW50cnktPmxpc3QubmV4dCA9PSBOVUxMKSk7CiAKLQkJLy8gcmVzZXQgcmN2IHNlcXVlbmNlIG9mIEJBIHNlc3Npb24KKwkJLyogcmVzZXQgcmN2IHNlcXVlbmNlIG9mIEJBIHNlc3Npb24gKi8KIAkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKIAkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CiAJCUlORElDQVRFX0xFR0FDWV9PUl9BTVNEVShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwogCQlyZXR1cm47CiAJfQogCi0KLQkvLwotCS8vIEkuIENoZWNrIGlmIGluIG9yZGVyLgotCS8vCi0JaWYgKFNFUV9TVEVQT05FKFNlcXVlbmNlLCBwQkFFbnRyeS0+TGFzdEluZFNlcSwgTUFYU0VRKSkKLQl7Ci0JCVVTSE9SVCAgTGFzdEluZFNlcTsKKwkvKiAqLworCS8qIEkuIENoZWNrIGlmIGluIG9yZGVyLiAqLworCS8qICovCisJaWYgKFNFUV9TVEVQT05FKFNlcXVlbmNlLCBwQkFFbnRyeS0+TGFzdEluZFNlcSwgTUFYU0VRKSkgeworCQl1MTYgTGFzdEluZFNlcTsKIAogCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOwogCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLSAJCUxhc3RJbmRTZXEgPSBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKHBBZCwgcEJBRW50cnksIHBCQUVudHJ5LT5MYXN0SW5kU2VxKTsKLQkJaWYgKExhc3RJbmRTZXEgIT0gUkVTRVRfUkNWX1NFUSkKLQkJeworCQlMYXN0SW5kU2VxID0KKwkJICAgIGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIocEFkLCBwQkFFbnRyeSwKKwkJCQkJCQkgIHBCQUVudHJ5LT5MYXN0SW5kU2VxKTsKKwkJaWYgKExhc3RJbmRTZXEgIT0gUkVTRVRfUkNWX1NFUSkgewogCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBMYXN0SW5kU2VxOwogCQl9CiAJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOwogCX0KLQkvLwotCS8vIElJLiBEcm9wIER1cGxpY2F0ZWQgUGFja2V0Ci0JLy8KLQllbHNlIGlmIChTZXF1ZW5jZSA9PSBwQkFFbnRyeS0+TGFzdEluZFNlcSkKLQl7CisJLyogKi8KKwkvKiBJSS4gRHJvcCBEdXBsaWNhdGVkIFBhY2tldCAqLworCS8qICovCisJZWxzZSBpZiAoU2VxdWVuY2UgPT0gcEJBRW50cnktPkxhc3RJbmRTZXEpIHsKIAotCQkvLyBkcm9wIGFuZCByZWxlYXNlIHBhY2tldAorCQkvKiBkcm9wIGFuZCByZWxlYXNlIHBhY2tldCAqLwogCQlwQkFFbnRyeS0+bkRyb3BQYWNrZXQrKzsKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LAorCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAl9Ci0JLy8KLQkvLyBJSUkuIERyb3AgT2xkIFJlY2VpdmVkIFBhY2tldAotCS8vCi0JZWxzZSBpZiAoU0VRX1NNQUxMRVIoU2VxdWVuY2UsIHBCQUVudHJ5LT5MYXN0SW5kU2VxLCBNQVhTRVEpKQotCXsKKwkvKiAqLworCS8qIElJSS4gRHJvcCBPbGQgUmVjZWl2ZWQgUGFja2V0ICovCisJLyogKi8KKwllbHNlIGlmIChTRVFfU01BTExFUihTZXF1ZW5jZSwgcEJBRW50cnktPkxhc3RJbmRTZXEsIE1BWFNFUSkpIHsKIAotCQkvLyBkcm9wIGFuZCByZWxlYXNlIHBhY2tldAorCQkvKiBkcm9wIGFuZCByZWxlYXNlIHBhY2tldCAqLwogCQlwQkFFbnRyeS0+bkRyb3BQYWNrZXQrKzsKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LAorCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAl9Ci0JLy8KLQkvLyBJVi4gUmVjZWl2ZSBTZXF1ZW5jZSB3aXRoaW4gV2luZG93IFNpemUKLQkvLwotCWVsc2UgaWYgKFNFUV9TTUFMTEVSKFNlcXVlbmNlLCAoKChwQkFFbnRyeS0+TGFzdEluZFNlcStwQkFFbnRyeS0+QkFXaW5TaXplKzEpKSAmIE1BWFNFUSksIE1BWFNFUSkpCi0JewotCQliYV9lbnF1ZXVlX3Jlb3JkZXJpbmdfcGFja2V0KHBBZCwgcEJBRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCS8qICovCisJLyogSVYuIFJlY2VpdmUgU2VxdWVuY2Ugd2l0aGluIFdpbmRvdyBTaXplICovCisJLyogKi8KKwllbHNlIGlmIChTRVFfU01BTExFUgorCQkgKFNlcXVlbmNlLAorCQkgICgoKHBCQUVudHJ5LT5MYXN0SW5kU2VxICsgcEJBRW50cnktPkJBV2luU2l6ZSArIDEpKSAmIE1BWFNFUSksCisJCSAgTUFYU0VRKSkgeworCQliYV9lbnF1ZXVlX3Jlb3JkZXJpbmdfcGFja2V0KHBBZCwgcEJBRW50cnksIHBSeEJsaywKKwkJCQkJICAgICBGcm9tV2hpY2hCU1NJRCk7CiAJfQotCS8vCi0JLy8gVi4gUmVjZWl2ZSBzZXEgc3VycGFzc2VzIFdpbihsYXN0c2VxICsgbk1TRFUpLiBTbyByZWZyZXNoIGFsbCByZW9yZGVyIGJ1ZmZlcgotCS8vCi0JZWxzZQotCXsKLQkJTE9ORyBXaW5TdGFydFNlcSwgVG1wU2VxOworCS8qICovCisJLyogVi4gUmVjZWl2ZSBzZXEgc3VycGFzc2VzIFdpbihsYXN0c2VxICsgbk1TRFUpLiBTbyByZWZyZXNoIGFsbCByZW9yZGVyIGJ1ZmZlciAqLworCS8qICovCisJZWxzZSB7CisJCWxvbmcgV2luU3RhcnRTZXEsIFRtcFNlcTsKIAotCi0JCVRtcFNlcSA9IFNlcXVlbmNlIC0gKHBCQUVudHJ5LT5CQVdpblNpemUpIC0xOwotCQlpZiAoVG1wU2VxIDwgMCkKLQkJewotCQkJVG1wU2VxID0gKE1BWFNFUSsxKSArIFRtcFNlcTsKKwkJVG1wU2VxID0gU2VxdWVuY2UgLSAocEJBRW50cnktPkJBV2luU2l6ZSkgLSAxOworCQlpZiAoVG1wU2VxIDwgMCkgeworCQkJVG1wU2VxID0gKE1BWFNFUSArIDEpICsgVG1wU2VxOwogCQl9Ci0JCVdpblN0YXJ0U2VxID0gKFRtcFNlcSsxKSAmIE1BWFNFUTsKKwkJV2luU3RhcnRTZXEgPSAoVG1wU2VxICsgMSkgJiBNQVhTRVE7CiAJCWJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHBBZCwgcEJBRW50cnksIFdpblN0YXJ0U2VxKTsKLQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBXaW5TdGFydFNlcTsgLy9UbXBTZXE7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gV2luU3RhcnRTZXE7CS8qVG1wU2VxOyAqLwogCiAJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOwogCi0JCWJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQocEFkLCBwQkFFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCWJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQocEFkLCBwQkFFbnRyeSwgcFJ4QmxrLAorCQkJCQkgICAgIEZyb21XaGljaEJTU0lEKTsKIAotCQlUbXBTZXEgPSBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKHBBZCwgcEJBRW50cnksIHBCQUVudHJ5LT5MYXN0SW5kU2VxKTsKLQkJaWYgKFRtcFNlcSAhPSBSRVNFVF9SQ1ZfU0VRKQotCQl7CisJCVRtcFNlcSA9CisJCSAgICBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKHBBZCwgcEJBRW50cnksCisJCQkJCQkJICBwQkFFbnRyeS0+TGFzdEluZFNlcSk7CisJCWlmIChUbXBTZXEgIT0gUkVTRVRfUkNWX1NFUSkgewogCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBUbXBTZXE7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fYWVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fYWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUwMzU3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9hZXMuYwpAQCAtMCwwICsxLDEzMTMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJY21tX2Flcy5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUGF1bCBXdQkJMDItMjUtMDIJCUluaXRpYWwKKyovCisKKyNpbmNsdWRlCSIuLi9ydF9jb25maWcuaCIKKworc3RydWN0IGFlc19jb250ZXh0IHsKKwl1MzIgZXJrWzY0XTsJCS8qIGVuY3J5cHRpb24gcm91bmQga2V5cyAqLworCXUzMiBkcmtbNjRdOwkJLyogZGVjcnlwdGlvbiByb3VuZCBrZXlzICovCisJaW50IG5yOwkJCS8qIG51bWJlciBvZiByb3VuZHMgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKiBTQk9YIFRhYmxlICoqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTggU2JveFRhYmxlWzI1Nl0gPSB7CisJMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSwKKwkweDMwLCAweDAxLCAweDY3LCAweDJiLCAweGZlLCAweGQ3LCAweGFiLCAweDc2LAorCTB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAsCisJMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCwKKwkweGI3LCAweGZkLCAweDkzLCAweDI2LCAweDM2LCAweDNmLCAweGY3LCAweGNjLAorCTB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUsCisJMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YSwKKwkweDA3LCAweDEyLCAweDgwLCAweGUyLCAweGViLCAweDI3LCAweGIyLCAweDc1LAorCTB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTAsCisJMHg1MiwgMHgzYiwgMHhkNiwgMHhiMywgMHgyOSwgMHhlMywgMHgyZiwgMHg4NCwKKwkweDUzLCAweGQxLCAweDAwLCAweGVkLCAweDIwLCAweGZjLCAweGIxLCAweDViLAorCTB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YsCisJMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NSwKKwkweDQ1LCAweGY5LCAweDAyLCAweDdmLCAweDUwLCAweDNjLCAweDlmLCAweGE4LAorCTB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUsCisJMHhiYywgMHhiNiwgMHhkYSwgMHgyMSwgMHgxMCwgMHhmZiwgMHhmMywgMHhkMiwKKwkweGNkLCAweDBjLCAweDEzLCAweGVjLCAweDVmLCAweDk3LCAweDQ0LCAweDE3LAorCTB4YzQsIDB4YTcsIDB4N2UsIDB4M2QsIDB4NjQsIDB4NWQsIDB4MTksIDB4NzMsCisJMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCwKKwkweDQ2LCAweGVlLCAweGI4LCAweDE0LCAweGRlLCAweDVlLCAweDBiLCAweGRiLAorCTB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMsCisJMHhjMiwgMHhkMywgMHhhYywgMHg2MiwgMHg5MSwgMHg5NSwgMHhlNCwgMHg3OSwKKwkweGU3LCAweGM4LCAweDM3LCAweDZkLCAweDhkLCAweGQ1LCAweDRlLCAweGE5LAorCTB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgsCisJMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNiwKKwkweGU4LCAweGRkLCAweDc0LCAweDFmLCAweDRiLCAweGJkLCAweDhiLCAweDhhLAorCTB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUsCisJMHg2MSwgMHgzNSwgMHg1NywgMHhiOSwgMHg4NiwgMHhjMSwgMHgxZCwgMHg5ZSwKKwkweGUxLCAweGY4LCAweDk4LCAweDExLCAweDY5LCAweGQ5LCAweDhlLCAweDk0LAorCTB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYsCisJMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OCwKKwkweDQxLCAweDk5LCAweDJkLCAweDBmLCAweGIwLCAweDU0LCAweGJiLCAweDE2Cit9OworCit2b2lkIHhvcl8zMih1OCAqYSwgdTggKmIsIHU4ICpvdXQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCW91dFtpXSA9IGFbaV0gXiBiW2ldOworCX0KK30KKwordm9pZCB4b3JfMTI4KHU4ICphLCB1OCAqYiwgdTggKm91dCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCW91dFtpXSA9IGFbaV0gXiBiW2ldOworCX0KK30KKwordTggUlRNUENraXBTYm94KHU4IGEpCit7CisJcmV0dXJuIFNib3hUYWJsZVsoaW50KWFdOworfQorCit2b2lkIG5leHRfa2V5KHU4ICprZXksIGludCByb3VuZCkKK3sKKwl1OCByY29uOworCXU4IHNib3hfa2V5WzRdOworCXU4IHJjb25fdGFibGVbMTJdID0geworCQkweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLAorCQkweDFiLCAweDM2LCAweDM2LCAweDM2CisJfTsKKworCXNib3hfa2V5WzBdID0gUlRNUENraXBTYm94KGtleVsxM10pOworCXNib3hfa2V5WzFdID0gUlRNUENraXBTYm94KGtleVsxNF0pOworCXNib3hfa2V5WzJdID0gUlRNUENraXBTYm94KGtleVsxNV0pOworCXNib3hfa2V5WzNdID0gUlRNUENraXBTYm94KGtleVsxMl0pOworCisJcmNvbiA9IHJjb25fdGFibGVbcm91bmRdOworCisJeG9yXzMyKCZrZXlbMF0sIHNib3hfa2V5LCAma2V5WzBdKTsKKwlrZXlbMF0gPSBrZXlbMF0gXiByY29uOworCisJeG9yXzMyKCZrZXlbNF0sICZrZXlbMF0sICZrZXlbNF0pOworCXhvcl8zMigma2V5WzhdLCAma2V5WzRdLCAma2V5WzhdKTsKKwl4b3JfMzIoJmtleVsxMl0sICZrZXlbOF0sICZrZXlbMTJdKTsKK30KKwordm9pZCBieXRlX3N1Yih1OCAqaW4sIHU4ICpvdXQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlvdXRbaV0gPSBSVE1QQ2tpcFNib3goaW5baV0pOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGJpdHdpc2VfeG9yKCkgICAgICAgICAgICAgICAgICAgICovCisvKiBBIDEyOCBiaXQsIGJpdHdpc2UgZXhjbHVzaXZlIG9yICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBiaXR3aXNlX3hvcih1bnNpZ25lZCBjaGFyICppbmEsIHVuc2lnbmVkIGNoYXIgKmluYiwgdW5zaWduZWQgY2hhciAqb3V0KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCW91dFtpXSA9IGluYVtpXSBeIGluYltpXTsKKwl9Cit9CisKK3ZvaWQgc2hpZnRfcm93KHU4ICppbiwgdTggKm91dCkKK3sKKwlvdXRbMF0gPSBpblswXTsKKwlvdXRbMV0gPSBpbls1XTsKKwlvdXRbMl0gPSBpblsxMF07CisJb3V0WzNdID0gaW5bMTVdOworCW91dFs0XSA9IGluWzRdOworCW91dFs1XSA9IGluWzldOworCW91dFs2XSA9IGluWzE0XTsKKwlvdXRbN10gPSBpblszXTsKKwlvdXRbOF0gPSBpbls4XTsKKwlvdXRbOV0gPSBpblsxM107CisJb3V0WzEwXSA9IGluWzJdOworCW91dFsxMV0gPSBpbls3XTsKKwlvdXRbMTJdID0gaW5bMTJdOworCW91dFsxM10gPSBpblsxXTsKKwlvdXRbMTRdID0gaW5bNl07CisJb3V0WzE1XSA9IGluWzExXTsKK30KKwordm9pZCBtaXhfY29sdW1uKHU4ICppbiwgdTggKm91dCkKK3sKKwlpbnQgaTsKKwl1OCBhZGQxYls0XTsKKwl1OCBhZGQxYmY3WzRdOworCXU4IHJvdGxbNF07CisJdTggc3dhcF9oYWxmc1s0XTsKKwl1OCBhbmRmN1s0XTsKKwl1OCByb3RyWzRdOworCXU4IHRlbXBbNF07CisJdTggdGVtcGJbNF07CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmICgoaW5baV0gJiAweDgwKSA9PSAweDgwKQorCQkJYWRkMWJbaV0gPSAweDFiOworCQllbHNlCisJCQlhZGQxYltpXSA9IDB4MDA7CisJfQorCisJc3dhcF9oYWxmc1swXSA9IGluWzJdOwkvKiBTd2FwIGhhbGZzICovCisJc3dhcF9oYWxmc1sxXSA9IGluWzNdOworCXN3YXBfaGFsZnNbMl0gPSBpblswXTsKKwlzd2FwX2hhbGZzWzNdID0gaW5bMV07CisKKwlyb3RsWzBdID0gaW5bM107CS8qIFJvdGF0ZSBsZWZ0IDggYml0cyAqLworCXJvdGxbMV0gPSBpblswXTsKKwlyb3RsWzJdID0gaW5bMV07CisJcm90bFszXSA9IGluWzJdOworCisJYW5kZjdbMF0gPSBpblswXSAmIDB4N2Y7CisJYW5kZjdbMV0gPSBpblsxXSAmIDB4N2Y7CisJYW5kZjdbMl0gPSBpblsyXSAmIDB4N2Y7CisJYW5kZjdbM10gPSBpblszXSAmIDB4N2Y7CisKKwlmb3IgKGkgPSAzOyBpID4gMDsgaS0tKSB7CS8qIGxvZ2ljYWwgc2hpZnQgbGVmdCAxIGJpdCAqLworCQlhbmRmN1tpXSA9IGFuZGY3W2ldIDw8IDE7CisJCWlmICgoYW5kZjdbaSAtIDFdICYgMHg4MCkgPT0gMHg4MCkgeworCQkJYW5kZjdbaV0gPSAoYW5kZjdbaV0gfCAweDAxKTsKKwkJfQorCX0KKwlhbmRmN1swXSA9IGFuZGY3WzBdIDw8IDE7CisJYW5kZjdbMF0gPSBhbmRmN1swXSAmIDB4ZmU7CisKKwl4b3JfMzIoYWRkMWIsIGFuZGY3LCBhZGQxYmY3KTsKKworCXhvcl8zMihpbiwgYWRkMWJmNywgcm90cik7CisKKwl0ZW1wWzBdID0gcm90clswXTsJLyogUm90YXRlIHJpZ2h0IDggYml0cyAqLworCXJvdHJbMF0gPSByb3RyWzFdOworCXJvdHJbMV0gPSByb3RyWzJdOworCXJvdHJbMl0gPSByb3RyWzNdOworCXJvdHJbM10gPSB0ZW1wWzBdOworCisJeG9yXzMyKGFkZDFiZjcsIHJvdHIsIHRlbXApOworCXhvcl8zMihzd2FwX2hhbGZzLCByb3RsLCB0ZW1wYik7CisJeG9yXzMyKHRlbXAsIHRlbXBiLCBvdXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY29uc3RydWN0X21pY19oZWFkZXIxKCkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJ1aWxkcyB0aGUgZmlyc3QgTUlDIGhlYWRlciBibG9jayBmcm9tICAgICAgICovCisvKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjEodW5zaWduZWQgY2hhciAqbWljX2hlYWRlcjEsCisJCQkgICBpbnQgaGVhZGVyX2xlbmd0aCwgdW5zaWduZWQgY2hhciAqbXBkdSkKK3sKKwltaWNfaGVhZGVyMVswXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpIC8gMjU2KTsKKwltaWNfaGVhZGVyMVsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpICUgMjU2KTsKKwltaWNfaGVhZGVyMVsyXSA9IG1wZHVbMF0gJiAweGNmOwkvKiBNdXRlIENGIHBvbGwgJiBDRiBhY2sgYml0cyAqLworCW1pY19oZWFkZXIxWzNdID0gbXBkdVsxXSAmIDB4Yzc7CS8qIE11dGUgcmV0cnksIG1vcmUgZGF0YSBhbmQgcHdyIG1ndCBiaXRzICovCisJbWljX2hlYWRlcjFbNF0gPSBtcGR1WzRdOwkvKiBBMSAqLworCW1pY19oZWFkZXIxWzVdID0gbXBkdVs1XTsKKwltaWNfaGVhZGVyMVs2XSA9IG1wZHVbNl07CisJbWljX2hlYWRlcjFbN10gPSBtcGR1WzddOworCW1pY19oZWFkZXIxWzhdID0gbXBkdVs4XTsKKwltaWNfaGVhZGVyMVs5XSA9IG1wZHVbOV07CisJbWljX2hlYWRlcjFbMTBdID0gbXBkdVsxMF07CS8qIEEyICovCisJbWljX2hlYWRlcjFbMTFdID0gbXBkdVsxMV07CisJbWljX2hlYWRlcjFbMTJdID0gbXBkdVsxMl07CisJbWljX2hlYWRlcjFbMTNdID0gbXBkdVsxM107CisJbWljX2hlYWRlcjFbMTRdID0gbXBkdVsxNF07CisJbWljX2hlYWRlcjFbMTVdID0gbXBkdVsxNV07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoKSAgICAgICAgICAgICAgICAgICAgICAqLworLyogQnVpbGRzIHRoZSBsYXN0IE1JQyBoZWFkZXIgYmxvY2sgZnJvbSAgICAgICAgKi8KKy8qIGhlYWRlciBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGNvbnN0cnVjdF9taWNfaGVhZGVyMih1bnNpZ25lZCBjaGFyICptaWNfaGVhZGVyMiwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKm1wZHUsIGludCBhNF9leGlzdHMsIGludCBxY19leGlzdHMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJbWljX2hlYWRlcjJbaV0gPSAweDAwOworCisJbWljX2hlYWRlcjJbMF0gPSBtcGR1WzE2XTsJLyogQTMgKi8KKwltaWNfaGVhZGVyMlsxXSA9IG1wZHVbMTddOworCW1pY19oZWFkZXIyWzJdID0gbXBkdVsxOF07CisJbWljX2hlYWRlcjJbM10gPSBtcGR1WzE5XTsKKwltaWNfaGVhZGVyMls0XSA9IG1wZHVbMjBdOworCW1pY19oZWFkZXIyWzVdID0gbXBkdVsyMV07CisKKwkvKiBJbiBTZXF1ZW5jZSBDb250cm9sIGZpZWxkLCBtdXRlIHNlcXVlbmNlIG51bWVyIGJpdHMgKDEyLWJpdCkgKi8KKwltaWNfaGVhZGVyMls2XSA9IG1wZHVbMjJdICYgMHgwZjsJLyogU0MgKi8KKwltaWNfaGVhZGVyMls3XSA9IDB4MDA7CS8qIG1wZHVbMjNdOyAqLworCisJaWYgKCghcWNfZXhpc3RzKSAmIGE0X2V4aXN0cykgeworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJbWljX2hlYWRlcjJbOCArIGldID0gbXBkdVsyNCArIGldOwkvKiBBNCAqLworCisJfQorCisJaWYgKHFjX2V4aXN0cyAmJiAoIWE0X2V4aXN0cykpIHsKKwkJbWljX2hlYWRlcjJbOF0gPSBtcGR1WzI0XSAmIDB4MGY7CS8qIG11dGUgYml0cyAxNSAtIDQgKi8KKwkJbWljX2hlYWRlcjJbOV0gPSBtcGR1WzI1XSAmIDB4MDA7CisJfQorCisJaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpIHsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCW1pY19oZWFkZXIyWzggKyBpXSA9IG1wZHVbMjQgKyBpXTsJLyogQTQgKi8KKworCQltaWNfaGVhZGVyMlsxNF0gPSBtcGR1WzMwXSAmIDB4MGY7CisJCW1pY19oZWFkZXIyWzE1XSA9IG1wZHVbMzFdICYgMHgwMDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjb25zdHJ1Y3RfbWljX2l2KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQnVpbGRzIHRoZSBNSUMgSVYgZnJvbSBoZWFkZXIgZmllbGRzIGFuZCBQTiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgY29uc3RydWN0X21pY19pdih1bnNpZ25lZCBjaGFyICptaWNfaXYsCisJCSAgICAgIGludCBxY19leGlzdHMsCisJCSAgICAgIGludCBhNF9leGlzdHMsCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKm1wZHUsCisJCSAgICAgIHVuc2lnbmVkIGludCBwYXlsb2FkX2xlbmd0aCwgdW5zaWduZWQgY2hhciAqcG5fdmVjdG9yKQoreworCWludCBpOworCisJbWljX2l2WzBdID0gMHg1OTsKKwlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKKwkJbWljX2l2WzFdID0gbXBkdVszMF0gJiAweDBmOwkvKiBRb1NfVEMgICAgICAgICAgICovCisJaWYgKHFjX2V4aXN0cyAmJiAhYTRfZXhpc3RzKQorCQltaWNfaXZbMV0gPSBtcGR1WzI0XSAmIDB4MGY7CS8qIG11dGUgYml0cyA3LTQgICAgKi8KKwlpZiAoIXFjX2V4aXN0cykKKwkJbWljX2l2WzFdID0gMHgwMDsKKwlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQorCQltaWNfaXZbaV0gPSBtcGR1W2kgKyA4XTsJLyogbWljX2l2WzI6N10gPSBBMlswOjVdID0gbXBkdVsxMDoxNV0gKi8KKyNpZmRlZiBDT05TSVNURU5UX1BOX09SREVSCisJZm9yIChpID0gODsgaSA8IDE0OyBpKyspCisJCW1pY19pdltpXSA9IHBuX3ZlY3RvcltpIC0gOF07CS8qIG1pY19pdls4OjEzXSA9IFBOWzA6NV0gKi8KKyNlbHNlCisJZm9yIChpID0gODsgaSA8IDE0OyBpKyspCisJCW1pY19pdltpXSA9IHBuX3ZlY3RvclsxMyAtIGldOwkvKiBtaWNfaXZbODoxM10gPSBQTls1OjBdICovCisjZW5kaWYKKwlpID0gKHBheWxvYWRfbGVuZ3RoIC8gMjU2KTsKKwlpID0gKHBheWxvYWRfbGVuZ3RoICUgMjU2KTsKKwltaWNfaXZbMTRdID0gKHVuc2lnbmVkIGNoYXIpKHBheWxvYWRfbGVuZ3RoIC8gMjU2KTsKKwltaWNfaXZbMTVdID0gKHVuc2lnbmVkIGNoYXIpKHBheWxvYWRfbGVuZ3RoICUgMjU2KTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGFlczEyOGsxMjhkKCkgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGVyZm9ybXMgYSAxMjggYml0IEFFUyBlbmNyeXB0IHdpdGggICovCisvKiAxMjggYml0IGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBhZXMxMjhrMTI4ZCh1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCSB1bnNpZ25lZCBjaGFyICpjaXBoZXJ0ZXh0KQoreworCWludCByb3VuZDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGludGVybWVkaWF0ZWFbMTZdOworCXVuc2lnbmVkIGNoYXIgaW50ZXJtZWRpYXRlYlsxNl07CisJdW5zaWduZWQgY2hhciByb3VuZF9rZXlbMTZdOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCXJvdW5kX2tleVtpXSA9IGtleVtpXTsKKworCWZvciAocm91bmQgPSAwOyByb3VuZCA8IDExOyByb3VuZCsrKSB7CisJCWlmIChyb3VuZCA9PSAwKSB7CisJCQl4b3JfMTI4KHJvdW5kX2tleSwgZGF0YSwgY2lwaGVydGV4dCk7CisJCQluZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKKwkJfSBlbHNlIGlmIChyb3VuZCA9PSAxMCkgeworCQkJYnl0ZV9zdWIoY2lwaGVydGV4dCwgaW50ZXJtZWRpYXRlYSk7CisJCQlzaGlmdF9yb3coaW50ZXJtZWRpYXRlYSwgaW50ZXJtZWRpYXRlYik7CisJCQl4b3JfMTI4KGludGVybWVkaWF0ZWIsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7CisJCX0gZWxzZSB7CS8qIDEgLSA5ICovCisKKwkJCWJ5dGVfc3ViKGNpcGhlcnRleHQsIGludGVybWVkaWF0ZWEpOworCQkJc2hpZnRfcm93KGludGVybWVkaWF0ZWEsIGludGVybWVkaWF0ZWIpOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlswXSwgJmludGVybWVkaWF0ZWFbMF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls0XSwgJmludGVybWVkaWF0ZWFbNF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls4XSwgJmludGVybWVkaWF0ZWFbOF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlsxMl0sICZpbnRlcm1lZGlhdGVhWzEyXSk7CisJCQl4b3JfMTI4KGludGVybWVkaWF0ZWEsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7CisJCQluZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKKwkJfQorCX0KKworfQorCit2b2lkIGNvbnN0cnVjdF9jdHJfcHJlbG9hZCh1bnNpZ25lZCBjaGFyICpjdHJfcHJlbG9hZCwKKwkJCSAgIGludCBhNF9leGlzdHMsCisJCQkgICBpbnQgcWNfZXhpc3RzLAorCQkJICAgdW5zaWduZWQgY2hhciAqbXBkdSwgdW5zaWduZWQgY2hhciAqcG5fdmVjdG9yLCBpbnQgYykKK3sKKworCWludCBpID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJY3RyX3ByZWxvYWRbaV0gPSAweDAwOworCWkgPSAwOworCisJY3RyX3ByZWxvYWRbMF0gPSAweDAxOwkvKiBmbGFnICovCisJaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpCisJCWN0cl9wcmVsb2FkWzFdID0gbXBkdVszMF0gJiAweDBmOwkvKiBRb0NfQ29udHJvbCAgKi8KKwlpZiAocWNfZXhpc3RzICYmICFhNF9leGlzdHMpCisJCWN0cl9wcmVsb2FkWzFdID0gbXBkdVsyNF0gJiAweDBmOworCisJZm9yIChpID0gMjsgaSA8IDg7IGkrKykKKwkJY3RyX3ByZWxvYWRbaV0gPSBtcGR1W2kgKyA4XTsJLyogY3RyX3ByZWxvYWRbMjo3XSA9IEEyWzA6NV0gPSBtcGR1WzEwOjE1XSAqLworI2lmZGVmIENPTlNJU1RFTlRfUE5fT1JERVIKKwlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKKwkJY3RyX3ByZWxvYWRbaV0gPSBwbl92ZWN0b3JbaSAtIDhdOwkvKiBjdHJfcHJlbG9hZFs4OjEzXSA9IFBOWzA6NV0gKi8KKyNlbHNlCisJZm9yIChpID0gODsgaSA8IDE0OyBpKyspCisJCWN0cl9wcmVsb2FkW2ldID0gcG5fdmVjdG9yWzEzIC0gaV07CS8qIGN0cl9wcmVsb2FkWzg6MTNdID0gUE5bNTowXSAqLworI2VuZGlmCisJY3RyX3ByZWxvYWRbMTRdID0gKHVuc2lnbmVkIGNoYXIpKGMgLyAyNTYpOwkvKiBDdHIgKi8KKwljdHJfcHJlbG9hZFsxNV0gPSAodW5zaWduZWQgY2hhcikoYyAlIDI1Nik7CisKK30KKworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRBRVMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdTggKnBEYXRhLAorCQkJICAgdW5zaWduZWQgbG9uZyBEYXRhQnl0ZUNudCwgc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBXcGFLZXkpCit7CisJdTggS2V5SUQ7CisJdTMyIEhlYWRlckxlbjsKKwl1OCBQTls2XTsKKwl1MzIgcGF5bG9hZF9sZW47CisJdTMyIG51bV9ibG9ja3M7CisJdTMyIHBheWxvYWRfcmVtYWluZGVyOworCXUxNiBmYzsKKwl1OCBmYzA7CisJdTggZmMxOworCXUzMiBmcmFtZV90eXBlOworCXUzMiBmcmFtZV9zdWJ0eXBlOworCXUzMiBmcm9tX2RzOworCXUzMiB0b19kczsKKwlpbnQgYTRfZXhpc3RzOworCWludCBxY19leGlzdHM7CisJdTggYWVzX291dFsxNl07CisJaW50IHBheWxvYWRfaW5kZXg7CisJdTMyIGk7CisJdTggY3RyX3ByZWxvYWRbMTZdOworCXU4IGNoYWluX2J1ZmZlclsxNl07CisJdTggcGFkZGVkX2J1ZmZlclsxNl07CisJdTggbWljX2l2WzE2XTsKKwl1OCBtaWNfaGVhZGVyMVsxNl07CisJdTggbWljX2hlYWRlcjJbMTZdOworCXU4IE1JQ1s4XTsKKwl1OCBUcmFpbE1JQ1s4XTsKKworCWZjMCA9ICpwRGF0YTsKKwlmYzEgPSAqKHBEYXRhICsgMSk7CisKKwlmYyA9ICooKHUxNiAqKXBEYXRhKTsKKworCWZyYW1lX3R5cGUgPSAoKGZjMCA+PiAyKSAmIDB4MDMpOworCWZyYW1lX3N1YnR5cGUgPSAoKGZjMCA+PiA0KSAmIDB4MGYpOworCisJZnJvbV9kcyA9IChmYzEgJiAweDIpID4+IDE7CisJdG9fZHMgPSAoZmMxICYgMHgxKTsKKworCWE0X2V4aXN0cyA9IChmcm9tX2RzICYgdG9fZHMpOworCXFjX2V4aXN0cyA9ICgoZnJhbWVfc3VidHlwZSA9PSAweDA4KSB8fAkvKiBBc3N1bWVkIFFvUyBzdWJ0eXBlcyAqLworCQkgICAgIChmcmFtZV9zdWJ0eXBlID09IDB4MDkpIHx8CS8qIExpa2VseSB0byBjaGFuZ2UuICAgICovCisJCSAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYSkgfHwgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYikKKwkgICAgKTsKKworCUhlYWRlckxlbiA9IDI0OworCWlmIChhNF9leGlzdHMpCisJCUhlYWRlckxlbiArPSA2OworCisJS2V5SUQgPSAqKCh1OCAqKShwRGF0YSArIEhlYWRlckxlbiArIDMpKTsKKwlLZXlJRCA9IEtleUlEID4+IDY7CisKKwlpZiAocFdwYUtleVtLZXlJRF0uS2V5TGVuID09IDApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSVE1QU29mdERlY3J5cHRBRVMgZmFpbGVkIShLZXlJRFslZF0gTGVuZ3RoIGNhbiBub3QgYmUgMClcbiIsCisJCQkgIEtleUlEKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlQTlswXSA9ICoocERhdGEgKyBIZWFkZXJMZW4pOworCVBOWzFdID0gKihwRGF0YSArIEhlYWRlckxlbiArIDEpOworCVBOWzJdID0gKihwRGF0YSArIEhlYWRlckxlbiArIDQpOworCVBOWzNdID0gKihwRGF0YSArIEhlYWRlckxlbiArIDUpOworCVBOWzRdID0gKihwRGF0YSArIEhlYWRlckxlbiArIDYpOworCVBOWzVdID0gKihwRGF0YSArIEhlYWRlckxlbiArIDcpOworCisJcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSA4OwkvKiA4IGJ5dGVzIGZvciBDQ01QIGhlYWRlciAsIDggYnl0ZXMgZm9yIE1JQyAqLworCXBheWxvYWRfcmVtYWluZGVyID0gKHBheWxvYWRfbGVuKSAlIDE2OworCW51bV9ibG9ja3MgPSAocGF5bG9hZF9sZW4pIC8gMTY7CisKKwkvKiBGaW5kIHN0YXJ0IG9mIHBheWxvYWQgKi8KKwlwYXlsb2FkX2luZGV4ID0gSGVhZGVyTGVuICsgODsJLypJVitFSVYgKi8KKworCWZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKKwkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAorCQkJCSAgICAgIGE0X2V4aXN0cywgcWNfZXhpc3RzLCBwRGF0YSwgUE4sIGkgKyAxKTsKKworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKKworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIGNoYWluX2J1ZmZlcik7CisJCU5kaXNNb3ZlTWVtb3J5KHBEYXRhICsgcGF5bG9hZF9pbmRleCAtIDgsIGNoYWluX2J1ZmZlciwgMTYpOworCQlwYXlsb2FkX2luZGV4ICs9IDE2OworCX0KKworCS8qICovCisJLyogSWYgdGhlcmUgaXMgYSBzaG9ydCBmaW5hbCBibG9jaywgdGhlbiBwYWQgaXQgKi8KKwkvKiBlbmNyeXB0IGl0IGFuZCBjb3B5IHRoZSB1bnBhZGRlZCBwYXJ0IGJhY2sgKi8KKwkvKiAqLworCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApIHsKKwkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAorCQkJCSAgICAgIGE0X2V4aXN0cywKKwkJCQkgICAgICBxY19leGlzdHMsIHBEYXRhLCBQTiwgbnVtX2Jsb2NrcyArIDEpOworCisJCU5kaXNaZXJvTWVtb3J5KHBhZGRlZF9idWZmZXIsIDE2KTsKKwkJTmRpc01vdmVNZW1vcnkocGFkZGVkX2J1ZmZlciwgcERhdGEgKyBwYXlsb2FkX2luZGV4LAorCQkJICAgICAgIHBheWxvYWRfcmVtYWluZGVyKTsKKworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKKworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOworCQlOZGlzTW92ZU1lbW9yeShwRGF0YSArIHBheWxvYWRfaW5kZXggLSA4LCBjaGFpbl9idWZmZXIsCisJCQkgICAgICAgcGF5bG9hZF9yZW1haW5kZXIpOworCQlwYXlsb2FkX2luZGV4ICs9IHBheWxvYWRfcmVtYWluZGVyOworCX0KKwkvKiAqLworCS8qIERlc2NyeXB0IHRoZSBNSUMgKi8KKwkvKiAqLworCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwgYTRfZXhpc3RzLCBxY19leGlzdHMsIHBEYXRhLCBQTiwgMCk7CisJTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOworCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgOCk7CisKKwlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKKworCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7CisKKwlOZGlzTW92ZU1lbW9yeShUcmFpbE1JQywgY2hhaW5fYnVmZmVyLCA4KTsKKworCS8qICovCisJLyogQ2FsY3VsYXRlIE1JQyAqLworCS8qICovCisKKwkvKkZvcmNlIHRoZSBwcm90ZWN0ZWQgZnJhbWUgYml0IG9uICovCisJKihwRGF0YSArIDEpID0gKihwRGF0YSArIDEpIHwgMHg0MDsKKworCS8qIEZpbmQgc3RhcnQgb2YgcGF5bG9hZCAqLworCS8qIEJlY2F1c2UgdGhlIENDTVAgaGVhZGVyIGhhcyBiZWVuIHJlbW92ZWQgKi8KKwlwYXlsb2FkX2luZGV4ID0gSGVhZGVyTGVuOworCisJY29uc3RydWN0X21pY19pdihtaWNfaXYsIHFjX2V4aXN0cywgYTRfZXhpc3RzLCBwRGF0YSwgcGF5bG9hZF9sZW4sIFBOKTsKKworCWNvbnN0cnVjdF9taWNfaGVhZGVyMShtaWNfaGVhZGVyMSwgSGVhZGVyTGVuLCBwRGF0YSk7CisKKwljb25zdHJ1Y3RfbWljX2hlYWRlcjIobWljX2hlYWRlcjIsIHBEYXRhLCBhNF9leGlzdHMsIHFjX2V4aXN0cyk7CisKKwlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIG1pY19pdiwgYWVzX291dCk7CisJYml0d2lzZV94b3IoYWVzX291dCwgbWljX2hlYWRlcjEsIGNoYWluX2J1ZmZlcik7CisJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOworCWJpdHdpc2VfeG9yKGFlc19vdXQsIG1pY19oZWFkZXIyLCBjaGFpbl9idWZmZXIpOworCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKKworCS8qIGl0ZXJhdGUgdGhyb3VnaCBlYWNoIDE2IGJ5dGUgcGF5bG9hZCBibG9jayAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKKwkJYml0d2lzZV94b3IoYWVzX291dCwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBjaGFpbl9idWZmZXIpOworCQlwYXlsb2FkX2luZGV4ICs9IDE2OworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisJfQorCisJLyogQWRkIG9uIHRoZSBmaW5hbCBwYXlsb2FkIGJsb2NrIGlmIGl0IG5lZWRzIHBhZGRpbmcgKi8KKwlpZiAocGF5bG9hZF9yZW1haW5kZXIgPiAwKSB7CisJCU5kaXNaZXJvTWVtb3J5KHBhZGRlZF9idWZmZXIsIDE2KTsKKwkJTmRpc01vdmVNZW1vcnkocGFkZGVkX2J1ZmZlciwgcERhdGEgKyBwYXlsb2FkX2luZGV4LAorCQkJICAgICAgIHBheWxvYWRfcmVtYWluZGVyKTsKKworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisJfQorCS8qIGFlc19vdXQgY29udGFpbnMgcGFkZGVkIG1pYywgZGlzY2FyZCBtb3N0IHNpZ25pZmljYW50ICovCisJLyogOCBieXRlcyB0byBnZW5lcmF0ZSA2NCBiaXQgTUlDICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJTUlDW2ldID0gYWVzX291dFtpXTsKKworCWlmICghTmRpc0VxdWFsTWVtb3J5KE1JQywgVHJhaWxNSUMsIDgpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTb2Z0RGVjcnlwdEFFUywgTUlDIEVycm9yICFcbiIpKTsJLypNSUMgZXJyb3IuICovCisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PSAgQUVTIEVuL0RlY3J5cHRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNpZm5kZWYJdWludDgKKyNkZWZpbmUJdWludDggIHVuc2lnbmVkCWNoYXIKKyNlbmRpZgorCisjaWZuZGVmCXVpbnQzMgorI2RlZmluZQl1aW50MzIgdW5zaWduZWQJaW50CisjZW5kaWYKKworLyogZm9yd2FyZCBTLWJveCAqLworc3RhdGljIHVpbnQzMiBGU2JbMjU2XSA9IHsKKwkweDYzLCAweDdDLCAweDc3LCAweDdCLCAweEYyLCAweDZCLCAweDZGLCAweEM1LAorCTB4MzAsIDB4MDEsIDB4NjcsIDB4MkIsIDB4RkUsIDB4RDcsIDB4QUIsIDB4NzYsCisJMHhDQSwgMHg4MiwgMHhDOSwgMHg3RCwgMHhGQSwgMHg1OSwgMHg0NywgMHhGMCwKKwkweEFELCAweEQ0LCAweEEyLCAweEFGLCAweDlDLCAweEE0LCAweDcyLCAweEMwLAorCTB4QjcsIDB4RkQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M0YsIDB4RjcsIDB4Q0MsCisJMHgzNCwgMHhBNSwgMHhFNSwgMHhGMSwgMHg3MSwgMHhEOCwgMHgzMSwgMHgxNSwKKwkweDA0LCAweEM3LCAweDIzLCAweEMzLCAweDE4LCAweDk2LCAweDA1LCAweDlBLAorCTB4MDcsIDB4MTIsIDB4ODAsIDB4RTIsIDB4RUIsIDB4MjcsIDB4QjIsIDB4NzUsCisJMHgwOSwgMHg4MywgMHgyQywgMHgxQSwgMHgxQiwgMHg2RSwgMHg1QSwgMHhBMCwKKwkweDUyLCAweDNCLCAweEQ2LCAweEIzLCAweDI5LCAweEUzLCAweDJGLCAweDg0LAorCTB4NTMsIDB4RDEsIDB4MDAsIDB4RUQsIDB4MjAsIDB4RkMsIDB4QjEsIDB4NUIsCisJMHg2QSwgMHhDQiwgMHhCRSwgMHgzOSwgMHg0QSwgMHg0QywgMHg1OCwgMHhDRiwKKwkweEQwLCAweEVGLCAweEFBLCAweEZCLCAweDQzLCAweDRELCAweDMzLCAweDg1LAorCTB4NDUsIDB4RjksIDB4MDIsIDB4N0YsIDB4NTAsIDB4M0MsIDB4OUYsIDB4QTgsCisJMHg1MSwgMHhBMywgMHg0MCwgMHg4RiwgMHg5MiwgMHg5RCwgMHgzOCwgMHhGNSwKKwkweEJDLCAweEI2LCAweERBLCAweDIxLCAweDEwLCAweEZGLCAweEYzLCAweEQyLAorCTB4Q0QsIDB4MEMsIDB4MTMsIDB4RUMsIDB4NUYsIDB4OTcsIDB4NDQsIDB4MTcsCisJMHhDNCwgMHhBNywgMHg3RSwgMHgzRCwgMHg2NCwgMHg1RCwgMHgxOSwgMHg3MywKKwkweDYwLCAweDgxLCAweDRGLCAweERDLCAweDIyLCAweDJBLCAweDkwLCAweDg4LAorCTB4NDYsIDB4RUUsIDB4QjgsIDB4MTQsIDB4REUsIDB4NUUsIDB4MEIsIDB4REIsCisJMHhFMCwgMHgzMiwgMHgzQSwgMHgwQSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1QywKKwkweEMyLCAweEQzLCAweEFDLCAweDYyLCAweDkxLCAweDk1LCAweEU0LCAweDc5LAorCTB4RTcsIDB4QzgsIDB4MzcsIDB4NkQsIDB4OEQsIDB4RDUsIDB4NEUsIDB4QTksCisJMHg2QywgMHg1NiwgMHhGNCwgMHhFQSwgMHg2NSwgMHg3QSwgMHhBRSwgMHgwOCwKKwkweEJBLCAweDc4LCAweDI1LCAweDJFLCAweDFDLCAweEE2LCAweEI0LCAweEM2LAorCTB4RTgsIDB4REQsIDB4NzQsIDB4MUYsIDB4NEIsIDB4QkQsIDB4OEIsIDB4OEEsCisJMHg3MCwgMHgzRSwgMHhCNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhGNiwgMHgwRSwKKwkweDYxLCAweDM1LCAweDU3LCAweEI5LCAweDg2LCAweEMxLCAweDFELCAweDlFLAorCTB4RTEsIDB4RjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4RDksIDB4OEUsIDB4OTQsCisJMHg5QiwgMHgxRSwgMHg4NywgMHhFOSwgMHhDRSwgMHg1NSwgMHgyOCwgMHhERiwKKwkweDhDLCAweEExLCAweDg5LCAweDBELCAweEJGLCAweEU2LCAweDQyLCAweDY4LAorCTB4NDEsIDB4OTksIDB4MkQsIDB4MEYsIDB4QjAsIDB4NTQsIDB4QkIsIDB4MTYKK307CisKKy8qIGZvcndhcmQgdGFibGUgKi8KKyNkZWZpbmUJRlQgXAorXAorCVYoQzYsNjMsNjMsQTUpLAlWKEY4LDdDLDdDLDg0KSwJVihFRSw3Nyw3Nyw5OSksCVYoRjYsN0IsN0IsOEQpLAlcCisJVihGRixGMixGMiwwRCksCVYoRDYsNkIsNkIsQkQpLAlWKERFLDZGLDZGLEIxKSwJVig5MSxDNSxDNSw1NCksCVwKKwlWKDYwLDMwLDMwLDUwKSwJVigwMiwwMSwwMSwwMyksCVYoQ0UsNjcsNjcsQTkpLAlWKDU2LDJCLDJCLDdEKSwJXAorCVYoRTcsRkUsRkUsMTkpLAlWKEI1LEQ3LEQ3LDYyKSwJVig0RCxBQixBQixFNiksCVYoRUMsNzYsNzYsOUEpLAlcCisJVig4RixDQSxDQSw0NSksCVYoMUYsODIsODIsOUQpLAlWKDg5LEM5LEM5LDQwKSwJVihGQSw3RCw3RCw4NyksCVwKKwlWKEVGLEZBLEZBLDE1KSwJVihCMiw1OSw1OSxFQiksCVYoOEUsNDcsNDcsQzkpLAlWKEZCLEYwLEYwLDBCKSwJXAorCVYoNDEsQUQsQUQsRUMpLAlWKEIzLEQ0LEQ0LDY3KSwJVig1RixBMixBMixGRCksCVYoNDUsQUYsQUYsRUEpLAlcCisJVigyMyw5Qyw5QyxCRiksCVYoNTMsQTQsQTQsRjcpLAlWKEU0LDcyLDcyLDk2KSwJVig5QixDMCxDMCw1QiksCVwKKwlWKDc1LEI3LEI3LEMyKSwJVihFMSxGRCxGRCwxQyksCVYoM0QsOTMsOTMsQUUpLAlWKDRDLDI2LDI2LDZBKSwJXAorCVYoNkMsMzYsMzYsNUEpLAlWKDdFLDNGLDNGLDQxKSwJVihGNSxGNyxGNywwMiksCVYoODMsQ0MsQ0MsNEYpLAlcCisJVig2OCwzNCwzNCw1QyksCVYoNTEsQTUsQTUsRjQpLAlWKEQxLEU1LEU1LDM0KSwJVihGOSxGMSxGMSwwOCksCVwKKwlWKEUyLDcxLDcxLDkzKSwJVihBQixEOCxEOCw3MyksCVYoNjIsMzEsMzEsNTMpLAlWKDJBLDE1LDE1LDNGKSwJXAorCVYoMDgsMDQsMDQsMEMpLAlWKDk1LEM3LEM3LDUyKSwJVig0NiwyMywyMyw2NSksCVYoOUQsQzMsQzMsNUUpLAlcCisJVigzMCwxOCwxOCwyOCksCVYoMzcsOTYsOTYsQTEpLAlWKDBBLDA1LDA1LDBGKSwJVigyRiw5QSw5QSxCNSksCVwKKwlWKDBFLDA3LDA3LDA5KSwJVigyNCwxMiwxMiwzNiksCVYoMUIsODAsODAsOUIpLAlWKERGLEUyLEUyLDNEKSwJXAorCVYoQ0QsRUIsRUIsMjYpLAlWKDRFLDI3LDI3LDY5KSwJVig3RixCMixCMixDRCksCVYoRUEsNzUsNzUsOUYpLAlcCisJVigxMiwwOSwwOSwxQiksCVYoMUQsODMsODMsOUUpLAlWKDU4LDJDLDJDLDc0KSwJVigzNCwxQSwxQSwyRSksCVwKKwlWKDM2LDFCLDFCLDJEKSwJVihEQyw2RSw2RSxCMiksCVYoQjQsNUEsNUEsRUUpLAlWKDVCLEEwLEEwLEZCKSwJXAorCVYoQTQsNTIsNTIsRjYpLAlWKDc2LDNCLDNCLDREKSwJVihCNyxENixENiw2MSksCVYoN0QsQjMsQjMsQ0UpLAlcCisJVig1MiwyOSwyOSw3QiksCVYoREQsRTMsRTMsM0UpLAlWKDVFLDJGLDJGLDcxKSwJVigxMyw4NCw4NCw5NyksCVwKKwlWKEE2LDUzLDUzLEY1KSwJVihCOSxEMSxEMSw2OCksCVYoMDAsMDAsMDAsMDApLAlWKEMxLEVELEVELDJDKSwJXAorCVYoNDAsMjAsMjAsNjApLAlWKEUzLEZDLEZDLDFGKSwJVig3OSxCMSxCMSxDOCksCVYoQjYsNUIsNUIsRUQpLAlcCisJVihENCw2QSw2QSxCRSksCVYoOEQsQ0IsQ0IsNDYpLAlWKDY3LEJFLEJFLEQ5KSwJVig3MiwzOSwzOSw0QiksCVwKKwlWKDk0LDRBLDRBLERFKSwJVig5OCw0Qyw0QyxENCksCVYoQjAsNTgsNTgsRTgpLAlWKDg1LENGLENGLDRBKSwJXAorCVYoQkIsRDAsRDAsNkIpLAlWKEM1LEVGLEVGLDJBKSwJVig0RixBQSxBQSxFNSksCVYoRUQsRkIsRkIsMTYpLAlcCisJVig4Niw0Myw0MyxDNSksCVYoOUEsNEQsNEQsRDcpLAlWKDY2LDMzLDMzLDU1KSwJVigxMSw4NSw4NSw5NCksCVwKKwlWKDhBLDQ1LDQ1LENGKSwJVihFOSxGOSxGOSwxMCksCVYoMDQsMDIsMDIsMDYpLAlWKEZFLDdGLDdGLDgxKSwJXAorCVYoQTAsNTAsNTAsRjApLAlWKDc4LDNDLDNDLDQ0KSwJVigyNSw5Riw5RixCQSksCVYoNEIsQTgsQTgsRTMpLAlcCisJVihBMiw1MSw1MSxGMyksCVYoNUQsQTMsQTMsRkUpLAlWKDgwLDQwLDQwLEMwKSwJVigwNSw4Riw4Riw4QSksCVwKKwlWKDNGLDkyLDkyLEFEKSwJVigyMSw5RCw5RCxCQyksCVYoNzAsMzgsMzgsNDgpLAlWKEYxLEY1LEY1LDA0KSwJXAorCVYoNjMsQkMsQkMsREYpLAlWKDc3LEI2LEI2LEMxKSwJVihBRixEQSxEQSw3NSksCVYoNDIsMjEsMjEsNjMpLAlcCisJVigyMCwxMCwxMCwzMCksCVYoRTUsRkYsRkYsMUEpLAlWKEZELEYzLEYzLDBFKSwJVihCRixEMixEMiw2RCksCVwKKwlWKDgxLENELENELDRDKSwJVigxOCwwQywwQywxNCksCVYoMjYsMTMsMTMsMzUpLAlWKEMzLEVDLEVDLDJGKSwJXAorCVYoQkUsNUYsNUYsRTEpLAlWKDM1LDk3LDk3LEEyKSwJVig4OCw0NCw0NCxDQyksCVYoMkUsMTcsMTcsMzkpLAlcCisJVig5MyxDNCxDNCw1NyksCVYoNTUsQTcsQTcsRjIpLAlWKEZDLDdFLDdFLDgyKSwJVig3QSwzRCwzRCw0NyksCVwKKwlWKEM4LDY0LDY0LEFDKSwJVihCQSw1RCw1RCxFNyksCVYoMzIsMTksMTksMkIpLAlWKEU2LDczLDczLDk1KSwJXAorCVYoQzAsNjAsNjAsQTApLAlWKDE5LDgxLDgxLDk4KSwJVig5RSw0Riw0RixEMSksCVYoQTMsREMsREMsN0YpLAlcCisJVig0NCwyMiwyMiw2NiksCVYoNTQsMkEsMkEsN0UpLAlWKDNCLDkwLDkwLEFCKSwJVigwQiw4OCw4OCw4MyksCVwKKwlWKDhDLDQ2LDQ2LENBKSwJVihDNyxFRSxFRSwyOSksCVYoNkIsQjgsQjgsRDMpLAlWKDI4LDE0LDE0LDNDKSwJXAorCVYoQTcsREUsREUsNzkpLAlWKEJDLDVFLDVFLEUyKSwJVigxNiwwQiwwQiwxRCksCVYoQUQsREIsREIsNzYpLAlcCisJVihEQixFMCxFMCwzQiksCVYoNjQsMzIsMzIsNTYpLAlWKDc0LDNBLDNBLDRFKSwJVigxNCwwQSwwQSwxRSksCVwKKwlWKDkyLDQ5LDQ5LERCKSwJVigwQywwNiwwNiwwQSksCVYoNDgsMjQsMjQsNkMpLAlWKEI4LDVDLDVDLEU0KSwJXAorCVYoOUYsQzIsQzIsNUQpLAlWKEJELEQzLEQzLDZFKSwJVig0MyxBQyxBQyxFRiksCVYoQzQsNjIsNjIsQTYpLAlcCisJVigzOSw5MSw5MSxBOCksCVYoMzEsOTUsOTUsQTQpLAlWKEQzLEU0LEU0LDM3KSwJVihGMiw3OSw3OSw4QiksCVwKKwlWKEQ1LEU3LEU3LDMyKSwJVig4QixDOCxDOCw0MyksCVYoNkUsMzcsMzcsNTkpLAlWKERBLDZELDZELEI3KSwJXAorCVYoMDEsOEQsOEQsOEMpLAlWKEIxLEQ1LEQ1LDY0KSwJVig5Qyw0RSw0RSxEMiksCVYoNDksQTksQTksRTApLAlcCisJVihEOCw2Qyw2QyxCNCksCVYoQUMsNTYsNTYsRkEpLAlWKEYzLEY0LEY0LDA3KSwJVihDRixFQSxFQSwyNSksCVwKKwlWKENBLDY1LDY1LEFGKSwJVihGNCw3QSw3QSw4RSksCVYoNDcsQUUsQUUsRTkpLAlWKDEwLDA4LDA4LDE4KSwJXAorCVYoNkYsQkEsQkEsRDUpLAlWKEYwLDc4LDc4LDg4KSwJVig0QSwyNSwyNSw2RiksCVYoNUMsMkUsMkUsNzIpLAlcCisJVigzOCwxQywxQywyNCksCVYoNTcsQTYsQTYsRjEpLAlWKDczLEI0LEI0LEM3KSwJVig5NyxDNixDNiw1MSksCVwKKwlWKENCLEU4LEU4LDIzKSwJVihBMSxERCxERCw3QyksCVYoRTgsNzQsNzQsOUMpLAlWKDNFLDFGLDFGLDIxKSwJXAorCVYoOTYsNEIsNEIsREQpLAlWKDYxLEJELEJELERDKSwJVigwRCw4Qiw4Qiw4NiksCVYoMEYsOEEsOEEsODUpLAlcCisJVihFMCw3MCw3MCw5MCksCVYoN0MsM0UsM0UsNDIpLAlWKDcxLEI1LEI1LEM0KSwJVihDQyw2Niw2NixBQSksCVwKKwlWKDkwLDQ4LDQ4LEQ4KSwJVigwNiwwMywwMywwNSksCVYoRjcsRjYsRjYsMDEpLAlWKDFDLDBFLDBFLDEyKSwJXAorCVYoQzIsNjEsNjEsQTMpLAlWKDZBLDM1LDM1LDVGKSwJVihBRSw1Nyw1NyxGOSksCVYoNjksQjksQjksRDApLAlcCisJVigxNyw4Niw4Niw5MSksCVYoOTksQzEsQzEsNTgpLAlWKDNBLDFELDFELDI3KSwJVigyNyw5RSw5RSxCOSksCVwKKwlWKEQ5LEUxLEUxLDM4KSwJVihFQixGOCxGOCwxMyksCVYoMkIsOTgsOTgsQjMpLAlWKDIyLDExLDExLDMzKSwJXAorCVYoRDIsNjksNjksQkIpLAlWKEE5LEQ5LEQ5LDcwKSwJVigwNyw4RSw4RSw4OSksCVYoMzMsOTQsOTQsQTcpLAlcCisJVigyRCw5Qiw5QixCNiksCVYoM0MsMUUsMUUsMjIpLAlWKDE1LDg3LDg3LDkyKSwJVihDOSxFOSxFOSwyMCksCVwKKwlWKDg3LENFLENFLDQ5KSwJVihBQSw1NSw1NSxGRiksCVYoNTAsMjgsMjgsNzgpLAlWKEE1LERGLERGLDdBKSwJXAorCVYoMDMsOEMsOEMsOEYpLAlWKDU5LEExLEExLEY4KSwJVigwOSw4OSw4OSw4MCksCVYoMUEsMEQsMEQsMTcpLAlcCisJVig2NSxCRixCRixEQSksCVYoRDcsRTYsRTYsMzEpLAlWKDg0LDQyLDQyLEM2KSwJVihEMCw2OCw2OCxCOCksCVwKKwlWKDgyLDQxLDQxLEMzKSwJVigyOSw5OSw5OSxCMCksCVYoNUEsMkQsMkQsNzcpLAlWKDFFLDBGLDBGLDExKSwJXAorCVYoN0IsQjAsQjAsQ0IpLAlWKEE4LDU0LDU0LEZDKSwJVig2RCxCQixCQixENiksCVYoMkMsMTYsMTYsM0EpCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYSMjYiMjYyMjZAorc3RhdGljIHVpbnQzMiBGVDBbMjU2XSA9IHsgRlQgfTsKKworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNkIyNhIyNiIyNjCitzdGF0aWMgdWludDMyIEZUMVsyNTZdID0geyBGVCB9OworCisjdW5kZWYgVgorCisjZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2MjI2QjI2EjI2IKK3N0YXRpYyB1aW50MzIgRlQyWzI1Nl0gPSB7IEZUIH07CisKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYiMjYyMjZCMjYQorc3RhdGljIHVpbnQzMiBGVDNbMjU2XSA9IHsgRlQgfTsKKworI3VuZGVmIFYKKworI3VuZGVmIEZUCisKKy8qIHJldmVyc2UgUy1ib3ggKi8KKworc3RhdGljIHVpbnQzMiBSU2JbMjU2XSA9IHsKKwkweDUyLCAweDA5LCAweDZBLCAweEQ1LCAweDMwLCAweDM2LCAweEE1LCAweDM4LAorCTB4QkYsIDB4NDAsIDB4QTMsIDB4OUUsIDB4ODEsIDB4RjMsIDB4RDcsIDB4RkIsCisJMHg3QywgMHhFMywgMHgzOSwgMHg4MiwgMHg5QiwgMHgyRiwgMHhGRiwgMHg4NywKKwkweDM0LCAweDhFLCAweDQzLCAweDQ0LCAweEM0LCAweERFLCAweEU5LCAweENCLAorCTB4NTQsIDB4N0IsIDB4OTQsIDB4MzIsIDB4QTYsIDB4QzIsIDB4MjMsIDB4M0QsCisJMHhFRSwgMHg0QywgMHg5NSwgMHgwQiwgMHg0MiwgMHhGQSwgMHhDMywgMHg0RSwKKwkweDA4LCAweDJFLCAweEExLCAweDY2LCAweDI4LCAweEQ5LCAweDI0LCAweEIyLAorCTB4NzYsIDB4NUIsIDB4QTIsIDB4NDksIDB4NkQsIDB4OEIsIDB4RDEsIDB4MjUsCisJMHg3MiwgMHhGOCwgMHhGNiwgMHg2NCwgMHg4NiwgMHg2OCwgMHg5OCwgMHgxNiwKKwkweEQ0LCAweEE0LCAweDVDLCAweENDLCAweDVELCAweDY1LCAweEI2LCAweDkyLAorCTB4NkMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4RkQsIDB4RUQsIDB4QjksIDB4REEsCisJMHg1RSwgMHgxNSwgMHg0NiwgMHg1NywgMHhBNywgMHg4RCwgMHg5RCwgMHg4NCwKKwkweDkwLCAweEQ4LCAweEFCLCAweDAwLCAweDhDLCAweEJDLCAweEQzLCAweDBBLAorCTB4RjcsIDB4RTQsIDB4NTgsIDB4MDUsIDB4QjgsIDB4QjMsIDB4NDUsIDB4MDYsCisJMHhEMCwgMHgyQywgMHgxRSwgMHg4RiwgMHhDQSwgMHgzRiwgMHgwRiwgMHgwMiwKKwkweEMxLCAweEFGLCAweEJELCAweDAzLCAweDAxLCAweDEzLCAweDhBLCAweDZCLAorCTB4M0EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NEYsIDB4NjcsIDB4REMsIDB4RUEsCisJMHg5NywgMHhGMiwgMHhDRiwgMHhDRSwgMHhGMCwgMHhCNCwgMHhFNiwgMHg3MywKKwkweDk2LCAweEFDLCAweDc0LCAweDIyLCAweEU3LCAweEFELCAweDM1LCAweDg1LAorCTB4RTIsIDB4RjksIDB4MzcsIDB4RTgsIDB4MUMsIDB4NzUsIDB4REYsIDB4NkUsCisJMHg0NywgMHhGMSwgMHgxQSwgMHg3MSwgMHgxRCwgMHgyOSwgMHhDNSwgMHg4OSwKKwkweDZGLCAweEI3LCAweDYyLCAweDBFLCAweEFBLCAweDE4LCAweEJFLCAweDFCLAorCTB4RkMsIDB4NTYsIDB4M0UsIDB4NEIsIDB4QzYsIDB4RDIsIDB4NzksIDB4MjAsCisJMHg5QSwgMHhEQiwgMHhDMCwgMHhGRSwgMHg3OCwgMHhDRCwgMHg1QSwgMHhGNCwKKwkweDFGLCAweERELCAweEE4LCAweDMzLCAweDg4LCAweDA3LCAweEM3LCAweDMxLAorCTB4QjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4RUMsIDB4NUYsCisJMHg2MCwgMHg1MSwgMHg3RiwgMHhBOSwgMHgxOSwgMHhCNSwgMHg0QSwgMHgwRCwKKwkweDJELCAweEU1LCAweDdBLCAweDlGLCAweDkzLCAweEM5LCAweDlDLCAweEVGLAorCTB4QTAsIDB4RTAsIDB4M0IsIDB4NEQsIDB4QUUsIDB4MkEsIDB4RjUsIDB4QjAsCisJMHhDOCwgMHhFQiwgMHhCQiwgMHgzQywgMHg4MywgMHg1MywgMHg5OSwgMHg2MSwKKwkweDE3LCAweDJCLCAweDA0LCAweDdFLCAweEJBLCAweDc3LCAweEQ2LCAweDI2LAorCTB4RTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MEMsIDB4N0QKK307CisKKy8qIHJldmVyc2UgdGFibGUgKi8KKworI2RlZmluZQlSVCBcCitcCisJVig1MSxGNCxBNyw1MCksCVYoN0UsNDEsNjUsNTMpLAlWKDFBLDE3LEE0LEMzKSwJVigzQSwyNyw1RSw5NiksCVwKKwlWKDNCLEFCLDZCLENCKSwJVigxRiw5RCw0NSxGMSksCVYoQUMsRkEsNTgsQUIpLAlWKDRCLEUzLDAzLDkzKSwJXAorCVYoMjAsMzAsRkEsNTUpLAlWKEFELDc2LDZELEY2KSwJVig4OCxDQyw3Niw5MSksCVYoRjUsMDIsNEMsMjUpLAlcCisJVig0RixFNSxENyxGQyksCVYoQzUsMkEsQ0IsRDcpLAlWKDI2LDM1LDQ0LDgwKSwJVihCNSw2MixBMyw4RiksCVwKKwlWKERFLEIxLDVBLDQ5KSwJVigyNSxCQSwxQiw2NyksCVYoNDUsRUEsMEUsOTgpLAlWKDVELEZFLEMwLEUxKSwJXAorCVYoQzMsMkYsNzUsMDIpLAlWKDgxLDRDLEYwLDEyKSwJVig4RCw0Niw5NyxBMyksCVYoNkIsRDMsRjksQzYpLAlcCisJVigwMyw4Riw1RixFNyksCVYoMTUsOTIsOUMsOTUpLAlWKEJGLDZELDdBLEVCKSwJVig5NSw1Miw1OSxEQSksCVwKKwlWKEQ0LEJFLDgzLDJEKSwJVig1OCw3NCwyMSxEMyksCVYoNDksRTAsNjksMjkpLAlWKDhFLEM5LEM4LDQ0KSwJXAorCVYoNzUsQzIsODksNkEpLAlWKEY0LDhFLDc5LDc4KSwJVig5OSw1OCwzRSw2QiksCVYoMjcsQjksNzEsREQpLAlcCisJVihCRSxFMSw0RixCNiksCVYoRjAsODgsQUQsMTcpLAlWKEM5LDIwLEFDLDY2KSwJVig3RCxDRSwzQSxCNCksCVwKKwlWKDYzLERGLDRBLDE4KSwJVihFNSwxQSwzMSw4MiksCVYoOTcsNTEsMzMsNjApLAlWKDYyLDUzLDdGLDQ1KSwJXAorCVYoQjEsNjQsNzcsRTApLAlWKEJCLDZCLEFFLDg0KSwJVihGRSw4MSxBMCwxQyksCVYoRjksMDgsMkIsOTQpLAlcCisJVig3MCw0OCw2OCw1OCksCVYoOEYsNDUsRkQsMTkpLAlWKDk0LERFLDZDLDg3KSwJVig1Miw3QixGOCxCNyksCVwKKwlWKEFCLDczLEQzLDIzKSwJVig3Miw0QiwwMixFMiksCVYoRTMsMUYsOEYsNTcpLAlWKDY2LDU1LEFCLDJBKSwJXAorCVYoQjIsRUIsMjgsMDcpLAlWKDJGLEI1LEMyLDAzKSwJVig4NixDNSw3Qiw5QSksCVYoRDMsMzcsMDgsQTUpLAlcCisJVigzMCwyOCw4NyxGMiksCVYoMjMsQkYsQTUsQjIpLAlWKDAyLDAzLDZBLEJBKSwJVihFRCwxNiw4Miw1QyksCVwKKwlWKDhBLENGLDFDLDJCKSwJVihBNyw3OSxCNCw5MiksCVYoRjMsMDcsRjIsRjApLAlWKDRFLDY5LEUyLEExKSwJXAorCVYoNjUsREEsRjQsQ0QpLAlWKDA2LDA1LEJFLEQ1KSwJVihEMSwzNCw2MiwxRiksCVYoQzQsQTYsRkUsOEEpLAlcCisJVigzNCwyRSw1Myw5RCksCVYoQTIsRjMsNTUsQTApLAlWKDA1LDhBLEUxLDMyKSwJVihBNCxGNixFQiw3NSksCVwKKwlWKDBCLDgzLEVDLDM5KSwJVig0MCw2MCxFRixBQSksCVYoNUUsNzEsOUYsMDYpLAlWKEJELDZFLDEwLDUxKSwJXAorCVYoM0UsMjEsOEEsRjkpLAlWKDk2LERELDA2LDNEKSwJVihERCwzRSwwNSxBRSksCVYoNEQsRTYsQkQsNDYpLAlcCisJVig5MSw1NCw4RCxCNSksCVYoNzEsQzQsNUQsMDUpLAlWKDA0LDA2LEQ0LDZGKSwJVig2MCw1MCwxNSxGRiksCVwKKwlWKDE5LDk4LEZCLDI0KSwJVihENixCRCxFOSw5NyksCVYoODksNDAsNDMsQ0MpLAlWKDY3LEQ5LDlFLDc3KSwJXAorCVYoQjAsRTgsNDIsQkQpLAlWKDA3LDg5LDhCLDg4KSwJVihFNywxOSw1QiwzOCksCVYoNzksQzgsRUUsREIpLAlcCisJVihBMSw3QywwQSw0NyksCVYoN0MsNDIsMEYsRTkpLAlWKEY4LDg0LDFFLEM5KSwJVigwMCwwMCwwMCwwMCksCVwKKwlWKDA5LDgwLDg2LDgzKSwJVigzMiwyQixFRCw0OCksCVYoMUUsMTEsNzAsQUMpLAlWKDZDLDVBLDcyLDRFKSwJXAorCVYoRkQsMEUsRkYsRkIpLAlWKDBGLDg1LDM4LDU2KSwJVigzRCxBRSxENSwxRSksCVYoMzYsMkQsMzksMjcpLAlcCisJVigwQSwwRixEOSw2NCksCVYoNjgsNUMsQTYsMjEpLAlWKDlCLDVCLDU0LEQxKSwJVigyNCwzNiwyRSwzQSksCVwKKwlWKDBDLDBBLDY3LEIxKSwJVig5Myw1NyxFNywwRiksCVYoQjQsRUUsOTYsRDIpLAlWKDFCLDlCLDkxLDlFKSwJXAorCVYoODAsQzAsQzUsNEYpLAlWKDYxLERDLDIwLEEyKSwJVig1QSw3Nyw0Qiw2OSksCVYoMUMsMTIsMUEsMTYpLAlcCisJVihFMiw5MyxCQSwwQSksCVYoQzAsQTAsMkEsRTUpLAlWKDNDLDIyLEUwLDQzKSwJVigxMiwxQiwxNywxRCksCVwKKwlWKDBFLDA5LDBELDBCKSwJVihGMiw4QixDNyxBRCksCVYoMkQsQjYsQTgsQjkpLAlWKDE0LDFFLEE5LEM4KSwJXAorCVYoNTcsRjEsMTksODUpLAlWKEFGLDc1LDA3LDRDKSwJVihFRSw5OSxERCxCQiksCVYoQTMsN0YsNjAsRkQpLAlcCisJVihGNywwMSwyNiw5RiksCVYoNUMsNzIsRjUsQkMpLAlWKDQ0LDY2LDNCLEM1KSwJVig1QixGQiw3RSwzNCksCVwKKwlWKDhCLDQzLDI5LDc2KSwJVihDQiwyMyxDNixEQyksCVYoQjYsRUQsRkMsNjgpLAlWKEI4LEU0LEYxLDYzKSwJXAorCVYoRDcsMzEsREMsQ0EpLAlWKDQyLDYzLDg1LDEwKSwJVigxMyw5NywyMiw0MCksCVYoODQsQzYsMTEsMjApLAlcCisJVig4NSw0QSwyNCw3RCksCVYoRDIsQkIsM0QsRjgpLAlWKEFFLEY5LDMyLDExKSwJVihDNywyOSxBMSw2RCksCVwKKwlWKDFELDlFLDJGLDRCKSwJVihEQyxCMiwzMCxGMyksCVYoMEQsODYsNTIsRUMpLAlWKDc3LEMxLEUzLEQwKSwJXAorCVYoMkIsQjMsMTYsNkMpLAlWKEE5LDcwLEI5LDk5KSwJVigxMSw5NCw0OCxGQSksCVYoNDcsRTksNjQsMjIpLAlcCisJVihBOCxGQyw4QyxDNCksCVYoQTAsRjAsM0YsMUEpLAlWKDU2LDdELDJDLEQ4KSwJVigyMiwzMyw5MCxFRiksCVwKKwlWKDg3LDQ5LDRFLEM3KSwJVihEOSwzOCxEMSxDMSksCVYoOEMsQ0EsQTIsRkUpLAlWKDk4LEQ0LDBCLDM2KSwJXAorCVYoQTYsRjUsODEsQ0YpLAlWKEE1LDdBLERFLDI4KSwJVihEQSxCNyw4RSwyNiksCVYoM0YsQUQsQkYsQTQpLAlcCisJVigyQywzQSw5RCxFNCksCVYoNTAsNzgsOTIsMEQpLAlWKDZBLDVGLENDLDlCKSwJVig1NCw3RSw0Niw2MiksCVwKKwlWKEY2LDhELDEzLEMyKSwJVig5MCxEOCxCOCxFOCksCVYoMkUsMzksRjcsNUUpLAlWKDgyLEMzLEFGLEY1KSwJXAorCVYoOUYsNUQsODAsQkUpLAlWKDY5LEQwLDkzLDdDKSwJVig2RixENSwyRCxBOSksCVYoQ0YsMjUsMTIsQjMpLAlcCisJVihDOCxBQyw5OSwzQiksCVYoMTAsMTgsN0QsQTcpLAlWKEU4LDlDLDYzLDZFKSwJVihEQiwzQixCQiw3QiksCVwKKwlWKENELDI2LDc4LDA5KSwJVig2RSw1OSwxOCxGNCksCVYoRUMsOUEsQjcsMDEpLAlWKDgzLDRGLDlBLEE4KSwJXAorCVYoRTYsOTUsNkUsNjUpLAlWKEFBLEZGLEU2LDdFKSwJVigyMSxCQyxDRiwwOCksCVYoRUYsMTUsRTgsRTYpLAlcCisJVihCQSxFNyw5QixEOSksCVYoNEEsNkYsMzYsQ0UpLAlWKEVBLDlGLDA5LEQ0KSwJVigyOSxCMCw3QyxENiksCVwKKwlWKDMxLEE0LEIyLEFGKSwJVigyQSwzRiwyMywzMSksCVYoQzYsQTUsOTQsMzApLAlWKDM1LEEyLDY2LEMwKSwJXAorCVYoNzQsNEUsQkMsMzcpLAlWKEZDLDgyLENBLEE2KSwJVihFMCw5MCxEMCxCMCksCVYoMzMsQTcsRDgsMTUpLAlcCisJVihGMSwwNCw5OCw0QSksCVYoNDEsRUMsREEsRjcpLAlWKDdGLENELDUwLDBFKSwJVigxNyw5MSxGNiwyRiksCVwKKwlWKDc2LDRELEQ2LDhEKSwJVig0MyxFRixCMCw0RCksCVYoQ0MsQUEsNEQsNTQpLAlWKEU0LDk2LDA0LERGKSwJXAorCVYoOUUsRDEsQjUsRTMpLAlWKDRDLDZBLDg4LDFCKSwJVihDMSwyQywxRixCOCksCVYoNDYsNjUsNTEsN0YpLAlcCisJVig5RCw1RSxFQSwwNCksCVYoMDEsOEMsMzUsNUQpLAlWKEZBLDg3LDc0LDczKSwJVihGQiwwQiw0MSwyRSksCVwKKwlWKEIzLDY3LDFELDVBKSwJVig5MixEQixEMiw1MiksCVYoRTksMTAsNTYsMzMpLAlWKDZELEQ2LDQ3LDEzKSwJXAorCVYoOUEsRDcsNjEsOEMpLAlWKDM3LEExLDBDLDdBKSwJVig1OSxGOCwxNCw4RSksCVYoRUIsMTMsM0MsODkpLAlcCisJVihDRSxBOSwyNyxFRSksCVYoQjcsNjEsQzksMzUpLAlWKEUxLDFDLEU1LEVEKSwJVig3QSw0NyxCMSwzQyksCVwKKwlWKDlDLEQyLERGLDU5KSwJVig1NSxGMiw3MywzRiksCVYoMTgsMTQsQ0UsNzkpLAlWKDczLEM3LDM3LEJGKSwJXAorCVYoNTMsRjcsQ0QsRUEpLAlWKDVGLEZELEFBLDVCKSwJVihERiwzRCw2RiwxNCksCVYoNzgsNDQsREIsODYpLAlcCisJVihDQSxBRixGMyw4MSksCVYoQjksNjgsQzQsM0UpLAlWKDM4LDI0LDM0LDJDKSwJVihDMixBMyw0MCw1RiksCVwKKwlWKDE2LDFELEMzLDcyKSwJVihCQyxFMiwyNSwwQyksCVYoMjgsM0MsNDksOEIpLAlWKEZGLDBELDk1LDQxKSwJXAorCVYoMzksQTgsMDEsNzEpLAlWKDA4LDBDLEIzLERFKSwJVihEOCxCNCxFNCw5QyksCVYoNjQsNTYsQzEsOTApLAlcCisJVig3QixDQiw4NCw2MSksCVYoRDUsMzIsQjYsNzApLAlWKDQ4LDZDLDVDLDc0KSwJVihEMCxCOCw1Nyw0MikKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNhIyNiIyNjIyNkCitzdGF0aWMgdWludDMyIFJUMFsyNTZdID0geyBSVCB9OworCisjdW5kZWYgVgorCisjZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2QjI2EjI2IjI2MKK3N0YXRpYyB1aW50MzIgUlQxWzI1Nl0gPSB7IFJUIH07CisKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYyMjZCMjYSMjYgorc3RhdGljIHVpbnQzMiBSVDJbMjU2XSA9IHsgUlQgfTsKKworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNiIyNjIyNkIyNhCitzdGF0aWMgdWludDMyIFJUM1syNTZdID0geyBSVCB9OworCisjdW5kZWYgVgorCisjdW5kZWYgUlQKKworLyogcm91bmQgY29uc3RhbnRzICovCisKK3N0YXRpYyB1aW50MzIgUkNPTlsxMF0gPSB7CisJMHgwMTAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwNDAwMDAwMCwgMHgwODAwMDAwMCwKKwkweDEwMDAwMDAwLCAweDIwMDAwMDAwLCAweDQwMDAwMDAwLCAweDgwMDAwMDAwLAorCTB4MUIwMDAwMDAsIDB4MzYwMDAwMDAKK307CisKKy8qIGtleSBzY2hlZHVsZQl0YWJsZXMgKi8KKworc3RhdGljIGludCBLVF9pbml0ID0gMTsKKworc3RhdGljIHVpbnQzMiBLVDBbMjU2XTsKK3N0YXRpYyB1aW50MzIgS1QxWzI1Nl07CitzdGF0aWMgdWludDMyIEtUMlsyNTZdOworc3RhdGljIHVpbnQzMiBLVDNbMjU2XTsKKworLyogcGxhdGZvcm0taW5kZXBlbmRhbnQJMzItYml0IGludGVnZXIgbWFuaXB1bGF0aW9uCW1hY3JvcyAqLworCisjZGVmaW5lCUdFVF9VSU5UMzIobixiLGkpCQkJCQkJXAorewkJCQkJCQkJCQkJCVwKKwkobikJPSAoCSh1aW50MzIpIChiKVsoaSkJXSA8PCAyNAkpCQlcCisJCXwgKAkodWludDMyKSAoYilbKGkpICsgMV0gPDwgMTYJKQkJXAorCQl8ICgJKHVpbnQzMikgKGIpWyhpKSArIDJdIDw8ICA4CSkJCVwKKwkJfCAoCSh1aW50MzIpIChiKVsoaSkgKyAzXQkJKTsJCVwKK30KKworI2RlZmluZQlQVVRfVUlOVDMyKG4sYixpKQkJCQkJCVwKK3sJCQkJCQkJCQkJCQlcCisJKGIpWyhpKQkgICBdID0gKHVpbnQ4KSAoIChuKSA+PgkyNCApOwkJXAorCShiKVsoaSkJKyAxXSA9ICh1aW50OCkgKCAobikgPj4JMTYgKTsJCVwKKwkoYilbKGkpCSsgMl0gPSAodWludDgpICggKG4pID4+CSA4ICk7CQlcCisJKGIpWyhpKQkrIDNdID0gKHVpbnQ4KSAoIChuKQkgICApOwkJXAorfQorCitpbnQgcnRfYWVzX3NldF9rZXkoc3RydWN0IGFlc19jb250ZXh0ICogY3R4LCB1aW50OCAqIGtleSwgaW50IG5iaXRzKQoreworCWludCBpOworCXVpbnQzMiAqUkssICpTSzsKKworCXN3aXRjaCAobmJpdHMpIHsKKwljYXNlIDEyODoKKwkJY3R4LT5uciA9IDEwOworCQlicmVhazsKKwljYXNlIDE5MjoKKwkJY3R4LT5uciA9IDEyOworCQlicmVhazsKKwljYXNlIDI1NjoKKwkJY3R4LT5uciA9IDE0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKDEpOworCX0KKworCVJLID0gKHVpbnQzMiAqKSBjdHgtPmVyazsKKworCWZvciAoaSA9IDA7IGkgPCAobmJpdHMgPj4gNSk7IGkrKykgeworCQlHRVRfVUlOVDMyKFJLW2ldLCBrZXksIGkgKiA0KTsKKwl9CisKKwkvKiBzZXR1cCBlbmNyeXB0aW9uICAgICByb3VuZCBrZXlzICovCisKKwlzd2l0Y2ggKG5iaXRzKSB7CisJY2FzZSAxMjg6CisKKwkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyssIFJLICs9IDQpIHsKKwkJCVJLWzRdID0gUktbMF0gXiBSQ09OW2ldIF4KKwkJCSAgICAoRlNiWyh1aW50OCkgKFJLWzNdID4+IDE2KV0gPDwgMjQpIF4KKwkJCSAgICAoRlNiWyh1aW50OCkgKFJLWzNdID4+IDgpXSA8PCAxNikgXgorCQkJICAgIChGU2JbKHVpbnQ4KSAoUktbM10pXSA8PCA4KSBeCisJCQkgICAgKEZTYlsodWludDgpIChSS1szXSA+PiAyNCldKTsKKworCQkJUktbNV0gPSBSS1sxXSBeIFJLWzRdOworCQkJUktbNl0gPSBSS1syXSBeIFJLWzVdOworCQkJUktbN10gPSBSS1szXSBeIFJLWzZdOworCQl9CisJCWJyZWFrOworCisJY2FzZSAxOTI6CisKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKywgUksgKz0gNikgeworCQkJUktbNl0gPSBSS1swXSBeIFJDT05baV0gXgorCQkJICAgIChGU2JbKHVpbnQ4KSAoUktbNV0gPj4gMTYpXSA8PCAyNCkgXgorCQkJICAgIChGU2JbKHVpbnQ4KSAoUktbNV0gPj4gOCldIDw8IDE2KSBeCisJCQkgICAgKEZTYlsodWludDgpIChSS1s1XSldIDw8IDgpIF4KKwkJCSAgICAoRlNiWyh1aW50OCkgKFJLWzVdID4+IDI0KV0pOworCisJCQlSS1s3XSA9IFJLWzFdIF4gUktbNl07CisJCQlSS1s4XSA9IFJLWzJdIF4gUktbN107CisJCQlSS1s5XSA9IFJLWzNdIF4gUktbOF07CisJCQlSS1sxMF0gPSBSS1s0XSBeIFJLWzldOworCQkJUktbMTFdID0gUktbNV0gXiBSS1sxMF07CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDI1NjoKKworCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrLCBSSyArPSA4KSB7CisJCQlSS1s4XSA9IFJLWzBdIF4gUkNPTltpXSBeCisJCQkgICAgKEZTYlsodWludDgpIChSS1s3XSA+PiAxNildIDw8IDI0KSBeCisJCQkgICAgKEZTYlsodWludDgpIChSS1s3XSA+PiA4KV0gPDwgMTYpIF4KKwkJCSAgICAoRlNiWyh1aW50OCkgKFJLWzddKV0gPDwgOCkgXgorCQkJICAgIChGU2JbKHVpbnQ4KSAoUktbN10gPj4gMjQpXSk7CisKKwkJCVJLWzldID0gUktbMV0gXiBSS1s4XTsKKwkJCVJLWzEwXSA9IFJLWzJdIF4gUktbOV07CisJCQlSS1sxMV0gPSBSS1szXSBeIFJLWzEwXTsKKworCQkJUktbMTJdID0gUktbNF0gXgorCQkJICAgIChGU2JbKHVpbnQ4KSAoUktbMTFdID4+IDI0KV0gPDwgMjQpIF4KKwkJCSAgICAoRlNiWyh1aW50OCkgKFJLWzExXSA+PiAxNildIDw8IDE2KSBeCisJCQkgICAgKEZTYlsodWludDgpIChSS1sxMV0gPj4gOCldIDw8IDgpIF4KKwkJCSAgICAoRlNiWyh1aW50OCkgKFJLWzExXSldKTsKKworCQkJUktbMTNdID0gUktbNV0gXiBSS1sxMl07CisJCQlSS1sxNF0gPSBSS1s2XSBeIFJLWzEzXTsKKwkJCVJLWzE1XSA9IFJLWzddIF4gUktbMTRdOworCQl9CisJCWJyZWFrOworCX0KKworCS8qIHNldHVwIGRlY3J5cHRpb24gICAgIHJvdW5kIGtleXMgKi8KKworCWlmIChLVF9pbml0KSB7CisJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQkJS1QwW2ldID0gUlQwW0ZTYltpXV07CisJCQlLVDFbaV0gPSBSVDFbRlNiW2ldXTsKKwkJCUtUMltpXSA9IFJUMltGU2JbaV1dOworCQkJS1QzW2ldID0gUlQzW0ZTYltpXV07CisJCX0KKworCQlLVF9pbml0ID0gMDsKKwl9CisKKwlTSyA9ICh1aW50MzIgKikgY3R4LT5kcms7CisKKwkqU0srKyA9ICpSSysrOworCSpTSysrID0gKlJLKys7CisJKlNLKysgPSAqUksrKzsKKwkqU0srKyA9ICpSSysrOworCisJZm9yIChpID0gMTsgaSA8IGN0eC0+bnI7IGkrKykgeworCQlSSyAtPSA4OworCisJCSpTSysrID0gS1QwWyh1aW50OCkgKCpSSyA+PiAyNCldIF4KKwkJICAgIEtUMVsodWludDgpICgqUksgPj4gMTYpXSBeCisJCSAgICBLVDJbKHVpbnQ4KSAoKlJLID4+IDgpXSBeIEtUM1sodWludDgpICgqUkspXTsKKwkJUksrKzsKKworCQkqU0srKyA9IEtUMFsodWludDgpICgqUksgPj4gMjQpXSBeCisJCSAgICBLVDFbKHVpbnQ4KSAoKlJLID4+IDE2KV0gXgorCQkgICAgS1QyWyh1aW50OCkgKCpSSyA+PiA4KV0gXiBLVDNbKHVpbnQ4KSAoKlJLKV07CisJCVJLKys7CisKKwkJKlNLKysgPSBLVDBbKHVpbnQ4KSAoKlJLID4+IDI0KV0gXgorCQkgICAgS1QxWyh1aW50OCkgKCpSSyA+PiAxNildIF4KKwkJICAgIEtUMlsodWludDgpICgqUksgPj4gOCldIF4gS1QzWyh1aW50OCkgKCpSSyldOworCQlSSysrOworCisJCSpTSysrID0gS1QwWyh1aW50OCkgKCpSSyA+PiAyNCldIF4KKwkJICAgIEtUMVsodWludDgpICgqUksgPj4gMTYpXSBeCisJCSAgICBLVDJbKHVpbnQ4KSAoKlJLID4+IDgpXSBeIEtUM1sodWludDgpICgqUkspXTsKKwkJUksrKzsKKwl9CisKKwlSSyAtPSA4OworCisJKlNLKysgPSAqUksrKzsKKwkqU0srKyA9ICpSSysrOworCSpTSysrID0gKlJLKys7CisJKlNLKysgPSAqUksrKzsKKworCXJldHVybiAoMCk7Cit9CisKKy8qIEFFUyAxMjgtYml0IGJsb2NrIGVuY3J5cHRpb24Jcm91dGluZQkqLworCit2b2lkIHJ0X2Flc19lbmNyeXB0KHN0cnVjdCBhZXNfY29udGV4dCAqIGN0eCwgdWludDggaW5wdXRbMTZdLCB1aW50OCBvdXRwdXRbMTZdKQoreworCXVpbnQzMiAqUkssIFgwLCBYMSwgWDIsIFgzLCBZMCwgWTEsIFkyLCBZMzsKKworCVJLID0gKHVpbnQzMiAqKSBjdHgtPmVyazsKKwlHRVRfVUlOVDMyKFgwLCBpbnB1dCwgMCk7CisJWDAgXj0gUktbMF07CisJR0VUX1VJTlQzMihYMSwgaW5wdXQsIDQpOworCVgxIF49IFJLWzFdOworCUdFVF9VSU5UMzIoWDIsIGlucHV0LCA4KTsKKwlYMiBePSBSS1syXTsKKwlHRVRfVUlOVDMyKFgzLCBpbnB1dCwgMTIpOworCVgzIF49IFJLWzNdOworCisjZGVmaW5lCUFFU19GUk9VTkQoWDAsWDEsWDIsWDMsWTAsWTEsWTIsWTMpCQlcCit7CQkJCQkJCQkJCQkJXAorCVJLICs9IDQ7CQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJXAorCVgwID0gUktbMF0gXiBGVDBbICh1aW50OCkgKAlZMCA+PiAyNCApIF0gXglcCisJCQkJIEZUMVsgKHVpbnQ4KSAoCVkxID4+IDE2ICkgXSBeCVwKKwkJCQkgRlQyWyAodWludDgpICgJWTIgPj4gIDggKSBdIF4JXAorCQkJCSBGVDNbICh1aW50OCkgKAlZMwkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgxID0gUktbMV0gXiBGVDBbICh1aW50OCkgKAlZMSA+PiAyNCApIF0gXglcCisJCQkJIEZUMVsgKHVpbnQ4KSAoCVkyID4+IDE2ICkgXSBeCVwKKwkJCQkgRlQyWyAodWludDgpICgJWTMgPj4gIDggKSBdIF4JXAorCQkJCSBGVDNbICh1aW50OCkgKAlZMAkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgyID0gUktbMl0gXiBGVDBbICh1aW50OCkgKAlZMiA+PiAyNCApIF0gXglcCisJCQkJIEZUMVsgKHVpbnQ4KSAoCVkzID4+IDE2ICkgXSBeCVwKKwkJCQkgRlQyWyAodWludDgpICgJWTAgPj4gIDggKSBdIF4JXAorCQkJCSBGVDNbICh1aW50OCkgKAlZMQkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgzID0gUktbM10gXiBGVDBbICh1aW50OCkgKAlZMyA+PiAyNCApIF0gXglcCisJCQkJIEZUMVsgKHVpbnQ4KSAoCVkwID4+IDE2ICkgXSBeCVwKKwkJCQkgRlQyWyAodWludDgpICgJWTEgPj4gIDggKSBdIF4JXAorCQkJCSBGVDNbICh1aW50OCkgKAlZMgkJICkgXTsJXAorfQorCisJQUVTX0ZST1VORChZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMpOwkvKiByb3VuZCAxICovCisJQUVTX0ZST1VORChYMCwgWDEsIFgyLCBYMywgWTAsIFkxLCBZMiwgWTMpOwkvKiByb3VuZCAyICovCisJQUVTX0ZST1VORChZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMpOwkvKiByb3VuZCAzICovCisJQUVTX0ZST1VORChYMCwgWDEsIFgyLCBYMywgWTAsIFkxLCBZMiwgWTMpOwkvKiByb3VuZCA0ICovCisJQUVTX0ZST1VORChZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMpOwkvKiByb3VuZCA1ICovCisJQUVTX0ZST1VORChYMCwgWDEsIFgyLCBYMywgWTAsIFkxLCBZMiwgWTMpOwkvKiByb3VuZCA2ICovCisJQUVTX0ZST1VORChZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMpOwkvKiByb3VuZCA3ICovCisJQUVTX0ZST1VORChYMCwgWDEsIFgyLCBYMywgWTAsIFkxLCBZMiwgWTMpOwkvKiByb3VuZCA4ICovCisJQUVTX0ZST1VORChZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMpOwkvKiByb3VuZCA5ICovCisKKwlpZiAoY3R4LT5uciA+IDEwKSB7CisJCUFFU19GUk9VTkQoWDAsIFgxLCBYMiwgWDMsIFkwLCBZMSwgWTIsIFkzKTsJLyogcm91bmQgMTAgICAgICovCisJCUFFU19GUk9VTkQoWTAsIFkxLCBZMiwgWTMsIFgwLCBYMSwgWDIsIFgzKTsJLyogcm91bmQgMTEgICAgICovCisJfQorCisJaWYgKGN0eC0+bnIgPiAxMikgeworCQlBRVNfRlJPVU5EKFgwLCBYMSwgWDIsIFgzLCBZMCwgWTEsIFkyLCBZMyk7CS8qIHJvdW5kIDEyICAgICAqLworCQlBRVNfRlJPVU5EKFkwLCBZMSwgWTIsIFkzLCBYMCwgWDEsIFgyLCBYMyk7CS8qIHJvdW5kIDEzICAgICAqLworCX0KKworCS8qIGxhc3Qgcm91bmQgKi8KKworCVJLICs9IDQ7CisKKwlYMCA9IFJLWzBdIF4gKEZTYlsodWludDgpIChZMCA+PiAyNCldIDw8IDI0KSBeCisJICAgIChGU2JbKHVpbnQ4KSAoWTEgPj4gMTYpXSA8PCAxNikgXgorCSAgICAoRlNiWyh1aW50OCkgKFkyID4+IDgpXSA8PCA4KSBeIChGU2JbKHVpbnQ4KSAoWTMpXSk7CisKKwlYMSA9IFJLWzFdIF4gKEZTYlsodWludDgpIChZMSA+PiAyNCldIDw8IDI0KSBeCisJICAgIChGU2JbKHVpbnQ4KSAoWTIgPj4gMTYpXSA8PCAxNikgXgorCSAgICAoRlNiWyh1aW50OCkgKFkzID4+IDgpXSA8PCA4KSBeIChGU2JbKHVpbnQ4KSAoWTApXSk7CisKKwlYMiA9IFJLWzJdIF4gKEZTYlsodWludDgpIChZMiA+PiAyNCldIDw8IDI0KSBeCisJICAgIChGU2JbKHVpbnQ4KSAoWTMgPj4gMTYpXSA8PCAxNikgXgorCSAgICAoRlNiWyh1aW50OCkgKFkwID4+IDgpXSA8PCA4KSBeIChGU2JbKHVpbnQ4KSAoWTEpXSk7CisKKwlYMyA9IFJLWzNdIF4gKEZTYlsodWludDgpIChZMyA+PiAyNCldIDw8IDI0KSBeCisJICAgIChGU2JbKHVpbnQ4KSAoWTAgPj4gMTYpXSA8PCAxNikgXgorCSAgICAoRlNiWyh1aW50OCkgKFkxID4+IDgpXSA8PCA4KSBeIChGU2JbKHVpbnQ4KSAoWTIpXSk7CisKKwlQVVRfVUlOVDMyKFgwLCBvdXRwdXQsIDApOworCVBVVF9VSU5UMzIoWDEsIG91dHB1dCwgNCk7CisJUFVUX1VJTlQzMihYMiwgb3V0cHV0LCA4KTsKKwlQVVRfVUlOVDMyKFgzLCBvdXRwdXQsIDEyKTsKK30KKworLyogQUVTIDEyOC1iaXQgYmxvY2sgZGVjcnlwdGlvbglyb3V0aW5lCSovCisKK3ZvaWQgcnRfYWVzX2RlY3J5cHQoc3RydWN0IGFlc19jb250ZXh0ICogY3R4LCB1aW50OCBpbnB1dFsxNl0sIHVpbnQ4IG91dHB1dFsxNl0pCit7CisJdWludDMyICpSSywgWDAsIFgxLCBYMiwgWDMsIFkwLCBZMSwgWTIsIFkzOworCisJUksgPSAodWludDMyICopIGN0eC0+ZHJrOworCisJR0VUX1VJTlQzMihYMCwgaW5wdXQsIDApOworCVgwIF49IFJLWzBdOworCUdFVF9VSU5UMzIoWDEsIGlucHV0LCA0KTsKKwlYMSBePSBSS1sxXTsKKwlHRVRfVUlOVDMyKFgyLCBpbnB1dCwgOCk7CisJWDIgXj0gUktbMl07CisJR0VUX1VJTlQzMihYMywgaW5wdXQsIDEyKTsKKwlYMyBePSBSS1szXTsKKworI2RlZmluZQlBRVNfUlJPVU5EKFgwLFgxLFgyLFgzLFkwLFkxLFkyLFkzKQkJXAorewkJCQkJCQkJCQkJCVwKKwlSSyArPSA0OwkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCVwKKwlYMCA9IFJLWzBdIF4gUlQwWyAodWludDgpICgJWTAgPj4gMjQgKSBdIF4JXAorCQkJCSBSVDFbICh1aW50OCkgKAlZMyA+PiAxNiApIF0gXglcCisJCQkJIFJUMlsgKHVpbnQ4KSAoCVkyID4+ICA4ICkgXSBeCVwKKwkJCQkgUlQzWyAodWludDgpICgJWTEJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMSA9IFJLWzFdIF4gUlQwWyAodWludDgpICgJWTEgPj4gMjQgKSBdIF4JXAorCQkJCSBSVDFbICh1aW50OCkgKAlZMCA+PiAxNiApIF0gXglcCisJCQkJIFJUMlsgKHVpbnQ4KSAoCVkzID4+ICA4ICkgXSBeCVwKKwkJCQkgUlQzWyAodWludDgpICgJWTIJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMiA9IFJLWzJdIF4gUlQwWyAodWludDgpICgJWTIgPj4gMjQgKSBdIF4JXAorCQkJCSBSVDFbICh1aW50OCkgKAlZMSA+PiAxNiApIF0gXglcCisJCQkJIFJUMlsgKHVpbnQ4KSAoCVkwID4+ICA4ICkgXSBeCVwKKwkJCQkgUlQzWyAodWludDgpICgJWTMJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMyA9IFJLWzNdIF4gUlQwWyAodWludDgpICgJWTMgPj4gMjQgKSBdIF4JXAorCQkJCSBSVDFbICh1aW50OCkgKAlZMiA+PiAxNiApIF0gXglcCisJCQkJIFJUMlsgKHVpbnQ4KSAoCVkxID4+ICA4ICkgXSBeCVwKKwkJCQkgUlQzWyAodWludDgpICgJWTAJCSApIF07CVwKK30KKworCUFFU19SUk9VTkQoWTAsIFkxLCBZMiwgWTMsIFgwLCBYMSwgWDIsIFgzKTsJLyogcm91bmQgMSAqLworCUFFU19SUk9VTkQoWDAsIFgxLCBYMiwgWDMsIFkwLCBZMSwgWTIsIFkzKTsJLyogcm91bmQgMiAqLworCUFFU19SUk9VTkQoWTAsIFkxLCBZMiwgWTMsIFgwLCBYMSwgWDIsIFgzKTsJLyogcm91bmQgMyAqLworCUFFU19SUk9VTkQoWDAsIFgxLCBYMiwgWDMsIFkwLCBZMSwgWTIsIFkzKTsJLyogcm91bmQgNCAqLworCUFFU19SUk9VTkQoWTAsIFkxLCBZMiwgWTMsIFgwLCBYMSwgWDIsIFgzKTsJLyogcm91bmQgNSAqLworCUFFU19SUk9VTkQoWDAsIFgxLCBYMiwgWDMsIFkwLCBZMSwgWTIsIFkzKTsJLyogcm91bmQgNiAqLworCUFFU19SUk9VTkQoWTAsIFkxLCBZMiwgWTMsIFgwLCBYMSwgWDIsIFgzKTsJLyogcm91bmQgNyAqLworCUFFU19SUk9VTkQoWDAsIFgxLCBYMiwgWDMsIFkwLCBZMSwgWTIsIFkzKTsJLyogcm91bmQgOCAqLworCUFFU19SUk9VTkQoWTAsIFkxLCBZMiwgWTMsIFgwLCBYMSwgWDIsIFgzKTsJLyogcm91bmQgOSAqLworCisJaWYgKGN0eC0+bnIgPiAxMCkgeworCQlBRVNfUlJPVU5EKFgwLCBYMSwgWDIsIFgzLCBZMCwgWTEsIFkyLCBZMyk7CS8qIHJvdW5kIDEwICAgICAqLworCQlBRVNfUlJPVU5EKFkwLCBZMSwgWTIsIFkzLCBYMCwgWDEsIFgyLCBYMyk7CS8qIHJvdW5kIDExICAgICAqLworCX0KKworCWlmIChjdHgtPm5yID4gMTIpIHsKKwkJQUVTX1JST1VORChYMCwgWDEsIFgyLCBYMywgWTAsIFkxLCBZMiwgWTMpOwkvKiByb3VuZCAxMiAgICAgKi8KKwkJQUVTX1JST1VORChZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMpOwkvKiByb3VuZCAxMyAgICAgKi8KKwl9CisKKwkvKiBsYXN0IHJvdW5kICovCisKKwlSSyArPSA0OworCisJWDAgPSBSS1swXSBeIChSU2JbKHVpbnQ4KSAoWTAgPj4gMjQpXSA8PCAyNCkgXgorCSAgICAoUlNiWyh1aW50OCkgKFkzID4+IDE2KV0gPDwgMTYpIF4KKwkgICAgKFJTYlsodWludDgpIChZMiA+PiA4KV0gPDwgOCkgXiAoUlNiWyh1aW50OCkgKFkxKV0pOworCisJWDEgPSBSS1sxXSBeIChSU2JbKHVpbnQ4KSAoWTEgPj4gMjQpXSA8PCAyNCkgXgorCSAgICAoUlNiWyh1aW50OCkgKFkwID4+IDE2KV0gPDwgMTYpIF4KKwkgICAgKFJTYlsodWludDgpIChZMyA+PiA4KV0gPDwgOCkgXiAoUlNiWyh1aW50OCkgKFkyKV0pOworCisJWDIgPSBSS1syXSBeIChSU2JbKHVpbnQ4KSAoWTIgPj4gMjQpXSA8PCAyNCkgXgorCSAgICAoUlNiWyh1aW50OCkgKFkxID4+IDE2KV0gPDwgMTYpIF4KKwkgICAgKFJTYlsodWludDgpIChZMCA+PiA4KV0gPDwgOCkgXiAoUlNiWyh1aW50OCkgKFkzKV0pOworCisJWDMgPSBSS1szXSBeIChSU2JbKHVpbnQ4KSAoWTMgPj4gMjQpXSA8PCAyNCkgXgorCSAgICAoUlNiWyh1aW50OCkgKFkyID4+IDE2KV0gPDwgMTYpIF4KKwkgICAgKFJTYlsodWludDgpIChZMSA+PiA4KV0gPDwgOCkgXiAoUlNiWyh1aW50OCkgKFkwKV0pOworCisJUFVUX1VJTlQzMihYMCwgb3V0cHV0LCAwKTsKKwlQVVRfVUlOVDMyKFgxLCBvdXRwdXQsIDQpOworCVBVVF9VSU5UMzIoWDIsIG91dHB1dCwgOCk7CisJUFVUX1VJTlQzMihYMywgb3V0cHV0LCAxMik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgRU5DUllQVCBBRVMgR1RLIGJlZm9yZSBzZW5kaW5nIGluIEVBUE9MIGZyYW1lLgorICAgICAgICBBRVMgR1RLIGxlbmd0aCA9IDEyOCBiaXQsICBzbyBmaXggYmxvY2tzIGZvciBhZXMta2V5LXdyYXAgYXMgMiBpbiB0aGlzIGZ1bmN0aW9uLgorICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlZmVyZW5jZXMgdG8gUkZDIDMzOTQgZm9yIGFlcyBrZXkgd3JhcCBhbGdvcml0aG0uCisgICAgUmV0dXJuOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBBRVNfR1RLX0tFWV9XUkFQKHU4ICoga2V5LAorCQkgICAgICB1OCAqIHBsYWludGV4dCwKKwkJICAgICAgdTMyIHBfbGVuLCB1OCAqIGNpcGhlcnRleHQpCit7CisJdTggQVs4XSwgQklOWzE2XSwgQk9VVFsxNl07CisJdTggUls1MTJdOworCWludCBudW1fYmxvY2tzID0gcF9sZW4gLyA4OwkvKiB1bml0OjY0Yml0cyAqLworCWludCBpLCBqOworCXN0cnVjdCBhZXNfY29udGV4dCBhZXNjdHg7CisJdTggeG9yOworCisJcnRfYWVzX3NldF9rZXkoJmFlc2N0eCwga2V5LCAxMjgpOworCisJLyogSW5pdCBJQSAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCUFbaV0gPSAweGE2OworCisJLypJbnB1dCBwbGFpbnRleHQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCisJCQlSWzggKiAoaSArIDEpICsgal0gPSBwbGFpbnRleHRbOCAqIGkgKyBqXTsKKwl9CisKKwkvKiBLZXkgTWl4ICovCisJZm9yIChqID0gMDsgaiA8IDY7IGorKykgeworCQlmb3IgKGkgPSAxOyBpIDw9IG51bV9ibG9ja3M7IGkrKykgeworCQkJLypwaGFzZSAxICovCisJCQlOZGlzTW92ZU1lbW9yeShCSU4sIEEsIDgpOworCQkJTmRpc01vdmVNZW1vcnkoJkJJTls4XSwgJlJbOCAqIGldLCA4KTsKKwkJCXJ0X2Flc19lbmNyeXB0KCZhZXNjdHgsIEJJTiwgQk9VVCk7CisKKwkJCU5kaXNNb3ZlTWVtb3J5KEEsICZCT1VUWzBdLCA4KTsKKwkJCXhvciA9IG51bV9ibG9ja3MgKiBqICsgaTsKKwkJCUFbN10gPSBCT1VUWzddIF4geG9yOworCQkJTmRpc01vdmVNZW1vcnkoJlJbOCAqIGldLCAmQk9VVFs4XSwgOCk7CisJCX0KKwl9CisKKwkvKiBPdXRwdXQgY2lwaGVydGV4dCAqLworCU5kaXNNb3ZlTWVtb3J5KGNpcGhlcnRleHQsIEEsIDgpOworCisJZm9yIChpID0gMTsgaSA8PSBudW1fYmxvY2tzOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCWNpcGhlcnRleHRbOCAqIGkgKyBqXSA9IFJbOCAqIGkgKyBqXTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlNaXNjIGZ1bmN0aW9uIHRvIGRlY3J5cHQgQUVTIGJvZHkKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisJCVRoaXMgZnVuY3Rpb24gcmVmZXJlbmNlcyB0bwlSRkMJMzM5NCBmb3IgYWVzIGtleSB1bndyYXAgYWxnb3JpdGhtLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBBRVNfR1RLX0tFWV9VTldSQVAodTggKiBrZXksCisJCQl1OCAqIHBsYWludGV4dCwKKwkJCXUzMiBjX2xlbiwgdTggKiBjaXBoZXJ0ZXh0KQoreworCXU4IEFbOF0sIEJJTlsxNl0sIEJPVVRbMTZdOworCXU4IHhvcjsKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgYWVzX2NvbnRleHQgYWVzY3R4OworCXU4ICpSOworCWludCBudW1fYmxvY2tzID0gY19sZW4gLyA4OwkvKiB1bml0OjY0Yml0cyAqLworCisJb3NfYWxsb2NfbWVtKE5VTEwsICh1OCAqKikgJiBSLCA1MTIpOworCisJaWYgKFIgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIkFFU19HVEtfS0VZX1VOV1JBUDogbm8gbWVtb3J5IVxuIikpOworCQlyZXR1cm47CisJfQorCS8qIEVuZCBvZiBpZiAqLworCS8qIEluaXRpYWxpemUgKi8KKwlOZGlzTW92ZU1lbW9yeShBLCBjaXBoZXJ0ZXh0LCA4KTsKKwkvKklucHV0IHBsYWludGV4dCAqLworCWZvciAoaSA9IDA7IGkgPCAoY19sZW4gLSA4KTsgaSsrKSB7CisJCVJbaV0gPSBjaXBoZXJ0ZXh0W2kgKyA4XTsKKwl9CisKKwlydF9hZXNfc2V0X2tleSgmYWVzY3R4LCBrZXksIDEyOCk7CisKKwlmb3IgKGogPSA1OyBqID49IDA7IGotLSkgeworCQlmb3IgKGkgPSAobnVtX2Jsb2NrcyAtIDEpOyBpID4gMDsgaS0tKSB7CisJCQl4b3IgPSAobnVtX2Jsb2NrcyAtIDEpICogaiArIGk7CisJCQlOZGlzTW92ZU1lbW9yeShCSU4sIEEsIDgpOworCQkJQklOWzddID0gQVs3XSBeIHhvcjsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZCSU5bOF0sICZSWyhpIC0gMSkgKiA4XSwgOCk7CisJCQlydF9hZXNfZGVjcnlwdCgmYWVzY3R4LCBCSU4sIEJPVVQpOworCQkJTmRpc01vdmVNZW1vcnkoQSwgJkJPVVRbMF0sIDgpOworCQkJTmRpc01vdmVNZW1vcnkoJlJbKGkgLSAxKSAqIDhdLCAmQk9VVFs4XSwgOCk7CisJCX0KKwl9CisKKwkvKiBPVVRQVVQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY19sZW47IGkrKykgeworCQlwbGFpbnRleHRbaV0gPSBSW2ldOworCX0KKworCW9zX2ZyZWVfbWVtKE5VTEwsIFIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2FzaWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9hc2ljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3N2U4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9hc2ljLmMKQEAgLTAsMCArMSwyNTY1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWNtbV9hc2ljLmMKKworCUFic3RyYWN0OgorCUZ1bmN0aW9ucyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggQVNJQworCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLyogUmVzZXQgdGhlIFJGSUMgc2V0dGluZyB0byBuZXcgc2VyaWVzICovCitzdHJ1Y3QgcnRfcnRtcF9yZl9yZWdzIFJGMjg1MFJlZ1RhYmxlW10gPSB7CisvKiAgICAgICAgICAgICAgY2ggICAgICAgUjEgICAgICAgICAgICAgIFIyICAgICAgICAgICAgICBSMyhUWDB+ND0wKSBSNCAqLworCXsxLCAweDk4NDAyZWNjLCAweDk4NGMwNzg2LCAweDk4MTZiNDU1LCAweDk4MDA1MTBifQorCSwKKwl7MiwgMHg5ODQwMmVjYywgMHg5ODRjMDc4NiwgMHg5ODE2OGE1NSwgMHg5ODAwNTE5Zn0KKwksCisJezMsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9CisJLAorCXs0LCAweDk4NDAyZWNjLCAweDk4NGMwNzhhLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfQorCSwKKwl7NSwgMHg5ODQwMmVjYywgMHg5ODRjMDc4ZSwgMHg5ODE2OGE1NSwgMHg5ODAwNTE4Yn0KKwksCisJezYsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGUsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9CisJLAorCXs3LCAweDk4NDAyZWNjLCAweDk4NGMwNzkyLCAweDk4MTY4YTU1LCAweDk4MDA1MThifQorCSwKKwl7OCwgMHg5ODQwMmVjYywgMHg5ODRjMDc5MiwgMHg5ODE2OGE1NSwgMHg5ODAwNTE5Zn0KKwksCisJezksIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTYsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9CisJLAorCXsxMCwgMHg5ODQwMmVjYywgMHg5ODRjMDc5NiwgMHg5ODE2OGE1NSwgMHg5ODAwNTE5Zn0KKwksCisJezExLCAweDk4NDAyZWNjLCAweDk4NGMwNzlhLCAweDk4MTY4YTU1LCAweDk4MDA1MThifQorCSwKKwl7MTIsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OWEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9CisJLAorCXsxMywgMHg5ODQwMmVjYywgMHg5ODRjMDc5ZSwgMHg5ODE2OGE1NSwgMHg5ODAwNTE4Yn0KKwksCisJezE0LCAweDk4NDAyZWNjLCAweDk4NGMwN2EyLCAweDk4MTY4YTU1LCAweDk4MDA1MTkzfQorCSwKKworCS8qIDgwMi4xMSBVTkkgLyBIeXBlckxhbiAyICovCisJezM2LCAweDk4NDAyZWNjLCAweDk4NGMwOTlhLCAweDk4MTU4YTU1LCAweDk4MGVkMWEzfQorCSwKKwl7MzgsIDB4OTg0MDJlY2MsIDB4OTg0YzA5OWUsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9CisJLAorCXs0MCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4M30KKwksCisJezQ0LCAweDk4NDAyZWM4LCAweDk4NGMwNjgyLCAweDk4MTU4YTU1LCAweDk4MGVkMWEzfQorCSwKKwl7NDYsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODYsIDB4OTgxNThhNTUsIDB4OTgwZWQxOGJ9CisJLAorCXs0OCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4NiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5Yn0KKwksCisJezUyLCAweDk4NDAyZWM4LCAweDk4NGMwNjhhLCAweDk4MTU4YTU1LCAweDk4MGVkMTkzfQorCSwKKwl7NTQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGEsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9CisJLAorCXs1NiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4ZSwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4Yn0KKwksCisJezYwLCAweDk4NDAyZWM4LCAweDk4NGMwNjkyLCAweDk4MTU4YTU1LCAweDk4MGVkMTgzfQorCSwKKwl7NjIsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9CisJLAorCXs2NCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY5MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30KKwksCQkJLyogUGx1Z2Zlc3QjNCwgRGF5NCwgY2hhbmdlIFJGUjMgbGVmdDR0aCA5LT41LiAqLworCisJLyogODAyLjExIEh5cGVyTGFuIDIgKi8KKwl7MTAwLCAweDk4NDAyZWM4LCAweDk4NGMwNmIyLCAweDk4MTc4YTU1LCAweDk4MGVkNzgzfQorCSwKKworCS8qIDIwMDguMDQuMzAgbW9kaWZpZWQgKi8KKwkvKiBUaGUgc3lzdGVtIHRlYW0gaGFzIEFOIHRvIGltcHJvdmUgdGhlIEVWTSB2YWx1ZSAqLworCS8qIGZvciBjaGFubmVsIDEwMiB0byAxMDggZm9yIHRoZSBSVDI4NTAvUlQyNzUwIGR1YWwgYmFuZCBzb2x1dGlvbi4gKi8KKwl7MTAyLCAweDk4NDAyZWM4LCAweDk4NWMwNmIyLCAweDk4NTc4YTU1LCAweDk4MGVkNzkzfQorCSwKKwl7MTA0LCAweDk4NDAyZWM4LCAweDk4NWMwNmIyLCAweDk4NTc4YTU1LCAweDk4MGVkMWEzfQorCSwKKwl7MTA4LCAweDk4NDAyZWNjLCAweDk4NWMwYTMyLCAweDk4NTc4YTU1LCAweDk4MGVkMTkzfQorCSwKKworCXsxMTAsIDB4OTg0MDJlY2MsIDB4OTg0YzBhMzYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODN9CisJLAorCXsxMTIsIDB4OTg0MDJlY2MsIDB4OTg0YzBhMzYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOWJ9CisJLAorCXsxMTYsIDB4OTg0MDJlY2MsIDB4OTg0YzBhM2EsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTN9CisJLAorCXsxMTgsIDB4OTg0MDJlY2MsIDB4OTg0YzBhM2UsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9CisJLAorCXsxMjAsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODN9CisJLAorCXsxMjQsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9CisJLAorCXsxMjYsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxNWJ9CisJLAkJCS8qIDB4OTgwZWQxYmItPjB4OTgwZWQxNWIgcmVxdWlyZWQgYnkgUm9yeSAyMDA3MDkyNyAqLworCXsxMjgsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTN9CisJLAorCXsxMzIsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOGJ9CisJLAorCXsxMzQsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9CisJLAorCXsxMzYsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOWJ9CisJLAorCXsxNDAsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGEsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODN9CisJLAorCisJLyogODAyLjExIFVOSUkgKi8KKwl7MTQ5LCAweDk4NDAyZWM0LCAweDk4NGMwMzhhLCAweDk4MTc4YTU1LCAweDk4MGVkMWE3fQorCSwKKwl7MTUxLCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMTg3fQorCSwKKwl7MTUzLCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMThmfQorCSwKKwl7MTU3LCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMTlmfQorCSwKKwl7MTU5LCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMWE3fQorCSwKKwl7MTYxLCAweDk4NDAyZWM0LCAweDk4NGMwMzkyLCAweDk4MTc4YTU1LCAweDk4MGVkMTg3fQorCSwKKwl7MTY1LCAweDk4NDAyZWM0LCAweDk4NGMwMzkyLCAweDk4MTc4YTU1LCAweDk4MGVkMTk3fQorCSwKKwl7MTY3LCAweDk4NDAyZWM0LCAweDk4NGMwM2QyLCAweDk4MTc5ODU1LCAweDk4MTU1MzFmfQorCSwKKwl7MTY5LCAweDk4NDAyZWM0LCAweDk4NGMwM2QyLCAweDk4MTc5ODU1LCAweDk4MTU1MzI3fQorCSwKKwl7MTcxLCAweDk4NDAyZWM0LCAweDk4NGMwM2Q2LCAweDk4MTc5ODU1LCAweDk4MTU1MzA3fQorCSwKKwl7MTczLCAweDk4NDAyZWM0LCAweDk4NGMwM2Q2LCAweDk4MTc5ODU1LCAweDk4MTU1MzBmfQorCSwKKworCS8qIEphcGFuICovCisJezE4NCwgMHg5NTAwMmNjYywgMHg5NTAwNDkxZSwgMHg5NTA5YmU1NSwgMHg5NTBjMGEwYn0KKwksCisJezE4OCwgMHg5NTAwMmNjYywgMHg5NTAwNDkyMiwgMHg5NTA5YmU1NSwgMHg5NTBjMGExM30KKwksCisJezE5MiwgMHg5NTAwMmNjYywgMHg5NTAwNDkyNiwgMHg5NTA5YmU1NSwgMHg5NTBjMGExYn0KKwksCisJezE5NiwgMHg5NTAwMmNjYywgMHg5NTAwNDkyYSwgMHg5NTA5YmU1NSwgMHg5NTBjMGEyM30KKwksCisJezIwOCwgMHg5NTAwMmNjYywgMHg5NTAwNDkzYSwgMHg5NTA5YmU1NSwgMHg5NTBjMGExM30KKwksCisJezIxMiwgMHg5NTAwMmNjYywgMHg5NTAwNDkzZSwgMHg5NTA5YmU1NSwgMHg5NTBjMGExYn0KKwksCisJezIxNiwgMHg5NTAwMmNjYywgMHg5NTAwNDk4MiwgMHg5NTA5YmU1NSwgMHg5NTBjMGEyM30KKwksCisKKwkvKiBzdGlsbCBsYWNrIG9mIE1NQUMoSmFwYW4pIGNoIDM0LDM4LDQyLDQ2ICovCit9OworCit1OCBOVU1fT0ZfMjg1MF9DSE5MID0gKHNpemVvZihSRjI4NTBSZWdUYWJsZSkgLyBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfcmZfcmVncykpOworCitzdHJ1Y3QgcnRfZnJlcXVlbmN5X2l0ZW0gRnJlcUl0ZW1zMzAyMFtdID0geworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKiBJU00gOiAyLjQgdG8gMi40ODMgR0h6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vICovCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qIDExZyAqLworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKi1DSC0tLU4tLS0tLS0tUi0tLUstLS0tLS0tLS0tLSAqLworCXsxLCAyNDEsIDIsIDJ9CisJLAorCXsyLCAyNDEsIDIsIDd9CisJLAorCXszLCAyNDIsIDIsIDJ9CisJLAorCXs0LCAyNDIsIDIsIDd9CisJLAorCXs1LCAyNDMsIDIsIDJ9CisJLAorCXs2LCAyNDMsIDIsIDd9CisJLAorCXs3LCAyNDQsIDIsIDJ9CisJLAorCXs4LCAyNDQsIDIsIDd9CisJLAorCXs5LCAyNDUsIDIsIDJ9CisJLAorCXsxMCwgMjQ1LCAyLCA3fQorCSwKKwl7MTEsIDI0NiwgMiwgMn0KKwksCisJezEyLCAyNDYsIDIsIDd9CisJLAorCXsxMywgMjQ3LCAyLCAyfQorCSwKKwl7MTQsIDI0OCwgMiwgNH0KKwksCit9OworCit1OCBOVU1fT0ZfMzAyMF9DSE5MID0gKHNpemVvZihGcmVxSXRlbXMzMDIwKSAvIHNpemVvZihzdHJ1Y3QgcnRfZnJlcXVlbmN5X2l0ZW0pKTsKKwordm9pZCBBc2ljVXBkYXRlQXV0b0ZhbGxCYWNrVGFibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqcFJhdGVUYWJsZSkKK3sKKwl1OCBpOworCUhUX0ZCS19DRkcwX1NUUlVDIEh0Q2ZnMDsKKwlIVF9GQktfQ0ZHMV9TVFJVQyBIdENmZzE7CisJTEdfRkJLX0NGRzBfU1RSVUMgTGdDZmcwOworCUxHX0ZCS19DRkcxX1NUUlVDIExnQ2ZnMTsKKwlzdHJ1Y3QgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCAqcEN1cnJUeFJhdGUsICpwTmV4dFR4UmF0ZTsKKworCS8qIHNldCB0byBpbml0aWFsIHZhbHVlICovCisJSHRDZmcwLndvcmQgPSAweDY1NDMyMTAwOworCUh0Q2ZnMS53b3JkID0gMHhlZGNiYTk4ODsKKwlMZ0NmZzAud29yZCA9IDB4ZWRjYmE5ODg7CisJTGdDZmcxLndvcmQgPSAweDAwMDAyMTAwOworCisJcE5leHRUeFJhdGUgPSAoc3RydWN0IHJ0X3J0bXBfdHhfcmF0ZV9zd2l0Y2ggKikgcFJhdGVUYWJsZSArIDE7CisJZm9yIChpID0gMTsgaSA8ICooKHU4ICopcFJhdGVUYWJsZSk7IGkrKykgeworCQlwQ3VyclR4UmF0ZSA9IChzdHJ1Y3QgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCAqKSBwUmF0ZVRhYmxlICsgMSArIGk7CisJCXN3aXRjaCAocEN1cnJUeFJhdGUtPk1vZGUpIHsKKwkJY2FzZSAwOgkvKkNDSyAqLworCQkJYnJlYWs7CisJCWNhc2UgMToJLypPRkRNICovCisJCQl7CisJCQkJc3dpdGNoIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUykgeworCQkJCWNhc2UgMDoKKwkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MwRkJLID0KKwkJCQkJICAgIChwTmV4dFR4UmF0ZS0+TW9kZSA9PQorCQkJCQkgICAgIE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPgorCQkJCQkJCSAgIEN1cnJNQ1MgKworCQkJCQkJCSAgIDgpIDogcE5leHRUeFJhdGUtPgorCQkJCQkgICAgQ3Vyck1DUzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxOgorCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzFGQksgPQorCQkJCQkgICAgKHBOZXh0VHhSYXRlLT5Nb2RlID09CisJCQkJCSAgICAgTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+CisJCQkJCQkJICAgQ3Vyck1DUyArCisJCQkJCQkJICAgOCkgOiBwTmV4dFR4UmF0ZS0+CisJCQkJCSAgICBDdXJyTUNTOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI6CisJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTMkZCSyA9CisJCQkJCSAgICAocE5leHRUeFJhdGUtPk1vZGUgPT0KKwkJCQkJICAgICBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT4KKwkJCQkJCQkgICBDdXJyTUNTICsKKwkJCQkJCQkgICA4KSA6IHBOZXh0VHhSYXRlLT4KKwkJCQkJICAgIEN1cnJNQ1M7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMzoKKwkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MzRkJLID0KKwkJCQkJICAgIChwTmV4dFR4UmF0ZS0+TW9kZSA9PQorCQkJCQkgICAgIE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPgorCQkJCQkJCSAgIEN1cnJNQ1MgKworCQkJCQkJCSAgIDgpIDogcE5leHRUeFJhdGUtPgorCQkJCQkgICAgQ3Vyck1DUzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA0OgorCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzRGQksgPQorCQkJCQkgICAgKHBOZXh0VHhSYXRlLT5Nb2RlID09CisJCQkJCSAgICAgTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+CisJCQkJCQkJICAgQ3Vyck1DUyArCisJCQkJCQkJICAgOCkgOiBwTmV4dFR4UmF0ZS0+CisJCQkJCSAgICBDdXJyTUNTOworCQkJCQlicmVhazsKKwkJCQljYXNlIDU6CisJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTNUZCSyA9CisJCQkJCSAgICAocE5leHRUeFJhdGUtPk1vZGUgPT0KKwkJCQkJICAgICBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT4KKwkJCQkJCQkgICBDdXJyTUNTICsKKwkJCQkJCQkgICA4KSA6IHBOZXh0VHhSYXRlLT4KKwkJCQkJICAgIEN1cnJNQ1M7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNjoKKwkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1M2RkJLID0KKwkJCQkJICAgIChwTmV4dFR4UmF0ZS0+TW9kZSA9PQorCQkJCQkgICAgIE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPgorCQkJCQkJCSAgIEN1cnJNQ1MgKworCQkJCQkJCSAgIDgpIDogcE5leHRUeFJhdGUtPgorCQkJCQkgICAgQ3Vyck1DUzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA3OgorCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzdGQksgPQorCQkJCQkgICAgKHBOZXh0VHhSYXRlLT5Nb2RlID09CisJCQkJCSAgICAgTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+CisJCQkJCQkJICAgQ3Vyck1DUyArCisJCQkJCQkJICAgOCkgOiBwTmV4dFR4UmF0ZS0+CisJCQkJCSAgICBDdXJyTUNTOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyOgkvKkhULU1JWCAqLworCQljYXNlIDM6CS8qSFQtR0YgKi8KKwkJCXsKKwkJCQlpZiAoKHBOZXh0VHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpCisJCQkJICAgICYmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyAhPQorCQkJCQlwTmV4dFR4UmF0ZS0+Q3Vyck1DUykpIHsKKwkJCQkJc3dpdGNoIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUykgeworCQkJCQljYXNlIDA6CisJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MwRkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDE6CisJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MxRkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDI6CisJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MyRkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDM6CisJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MzRkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDQ6CisJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M0RkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDU6CisJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M1RkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDY6CisJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M2RkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDc6CisJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M3RkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDg6CisJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1M4RkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDk6CisJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1M5RkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDEwOgorCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTBGQksgPQorCQkJCQkJICAgIHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMTE6CisJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1MxMUZCSyA9CisJCQkJCQkgICAgcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxMjoKKwkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEyRkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDEzOgorCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTNGQksgPQorCQkJCQkJICAgIHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMTQ6CisJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1MxNEZCSyA9CisJCQkJCQkgICAgcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxNToKKwkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzE1RkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCQkJICgiQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlOiBub3Qgc3VwcG9ydCBDdXJyTUNTPSVkXG4iLAorCQkJCQkJCSAgcEN1cnJUeFJhdGUtPgorCQkJCQkJCSAgQ3Vyck1DUykpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlwTmV4dFR4UmF0ZSA9IHBDdXJyVHhSYXRlOworCX0KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEhUX0ZCS19DRkcwLCBIdENmZzAud29yZCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSFRfRkJLX0NGRzEsIEh0Q2ZnMS53b3JkKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBMR19GQktfQ0ZHMCwgTGdDZmcwLndvcmQpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIExHX0ZCS19DRkcxLCBMZ0NmZzEud29yZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTZXQgTUFDIHJlZ2lzdGVyIHZhbHVlIGFjY29yZGluZyBvcGVyYXRpb24gbW9kZS4KKwkJT3BlcmF0aW9uTW9kZSBBTkQgYk5vbkdGRXhpc3QgYXJlIGZvciBNTSBhbmQgR0YgUHJvdGVjaXRvbi4KKwkJSWYgTU0gb3IgR0YgbWFzayBpcyBub3Qgc2V0LCB0aG9zZSBwYXNzaW5nIGFyZ3VtZW50IGRvZXNuJ3Qgbm90IHRha2UgZWZmZWN0LgorCisJCU9wZXJhdGlvbiBtb2RlIG1lYW5pbmc6CisJCT0gMCA6IFB1cmUgSFQsIG5vIHByZW90ZWN0aW9uLgorCQk9IDB4MDE7IHRoZXJlIG1heSBiZSBub24tSFQgZGV2aWNlcyBpbiBib3RoIHRoZSBjb250cm9sIGFuZCBleHRlbnNpb24gY2hhbm5lbCwgcHJvdGVjdGlvbiBpcyBvcHRpb25hbCBpbiBCU1MuCisJCT0gMHgxMDogTm8gVHJhbnNtaXNzaW9uIGluIDQwTSBpcyBwcm90ZWN0ZWQuCisJCT0gMHgxMTogVHJhbnNtaXNzaW9uIGluIGJvdGggNDBNIGFuZCAyME0gc2hhbGwgYmUgcHJvdGVjdGVkCisJCWlmIChiTm9uR0ZFeGlzdCkKKwkJCXdlIHNob3VsZCBjaG9vc2Ugbm90IHRvIHVzZSBHRi4gQnV0IHN0aWxsIHNldCBjb3JyZWN0IEFTSUMgcmVnaXN0ZXJzLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgQXNpY1VwZGF0ZVByb3RlY3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgdTE2IE9wZXJhdGlvbk1vZGUsCisJCSAgICAgICB1OCBTZXRNYXNrLAorCQkgICAgICAgSU4gQk9PTEVBTiBiRGlzYWJsZUJHUHJvdGVjdCwgSU4gQk9PTEVBTiBiTm9uR0ZFeGlzdCkKK3sKKwlQUk9UX0NGR19TVFJVQyBQcm90Q2ZnLCBQcm90Q2ZnNDsKKwl1MzIgUHJvdGVjdFs2XTsKKwl1MTYgb2Zmc2V0OworCXU4IGk7CisJdTMyIE1hY1JlZyA9IDA7CisKKwlpZiAoIShwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0KSAmJiAoT3BlcmF0aW9uTW9kZSAhPSA4KSkgeworCQlyZXR1cm47CisJfQorCisJaWYgKHBBZC0+QkFUYWJsZS5udW1Eb25lT3JpZ2luYXRvcikgeworCQkvKiAqLworCQkvKiBlbmFibGUgdGhlIFJUUy9DVFMgdG8gYXZvaWQgY2hhbm5lbCBjb2xsaXNpb24gKi8KKwkJLyogKi8KKwkJU2V0TWFzayA9IEFMTE5fU0VUUFJPVEVDVDsKKwkJT3BlcmF0aW9uTW9kZSA9IDg7CisJfQorCS8qIENvbmZpZyBBU0lDIFJUUyB0aHJlc2hvbGQgcmVnaXN0ZXIgKi8KKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUU19DRkcsICZNYWNSZWcpOworCU1hY1JlZyAmPSAweEZGMDAwMEZGOworCS8qIElmIHRoZSB1c2VyIHdhbnQgZGlzYWJsZSBSdHNUaHJlc2hvbGQgYW5kIGVuYWJsZSBBbXNkdS9SYWxpbmstQWdncmVnYXRpb24sIHNldCB0aGUgUnRzVGhyZXNob2xkIGFzIDQwOTYgKi8KKwlpZiAoKChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUpIHx8CisJICAgICAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9PSBUUlVFKSkKKwkgICAgJiYgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID09IE1BWF9SVFNfVEhSRVNIT0xEKSB7CisJCU1hY1JlZyB8PSAoMHgxMDAwIDw8IDgpOworCX0gZWxzZSB7CisJCU1hY1JlZyB8PSAocEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkIDw8IDgpOworCX0KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1JUU19DRkcsIE1hY1JlZyk7CisKKwkvKiBJbml0aWFsIGNvbW1vbiBwcm90ZWN0aW9uIHNldHRpbmdzICovCisJUlRNUFplcm9NZW1vcnkoUHJvdGVjdCwgc2l6ZW9mKFByb3RlY3QpKTsKKwlQcm90Q2ZnNC53b3JkID0gMDsKKwlQcm90Q2ZnLndvcmQgPSAwOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0Y0MCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dHRjIwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NNDAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93TU0yMCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dPZmRtID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0NjayA9IDE7CisJUHJvdENmZy5maWVsZC5SVFNUaEVuID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCisJLyogdXBkYXRlIFBIWSBtb2RlIGFuZCByYXRlICovCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSA9IDB4NDAwMDsKKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlIHw9IHBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGU7CisKKwkvKiBIYW5kbGUgbGVnYWN5KEIvRykgcHJvdGVjdGlvbiAqLworCWlmIChiRGlzYWJsZUJHUHJvdGVjdCkgeworCQkvKlByb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOyAqLworCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsKKwkJUHJvdGVjdFswXSA9IFByb3RDZmcud29yZDsKKwkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKKwkJcEFkLT5GbGdDdHNFbmFibGVkID0gMDsJLyogQ1RTLXNlbGYgaXMgbm90IHVzZWQgKi8KKwl9IGVsc2UgeworCQkvKlByb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOyAqLworCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsJLyogQ0NLIGRvIG5vdCBuZWVkIHRvIGJlIHByb3RlY3RlZCAqLworCQlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOworCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19DVFM7CS8qIE9GRE0gbmVlZHMgdXNpbmcgQ0NLIHRvIHByb3RlY3QgKi8KKwkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKKwkJcEFkLT5GbGdDdHNFbmFibGVkID0gMTsJLyogQ1RTLXNlbGYgaXMgdXNlZCAqLworCX0KKworCS8qIERlY2lkZSBIVCBmcmFtZSBwcm90ZWN0aW9uLiAqLworCWlmICgoU2V0TWFzayAmIEFMTE5fU0VUUFJPVEVDVCkgIT0gMCkgeworCQlzd2l0Y2ggKE9wZXJhdGlvbk1vZGUpIHsKKwkJY2FzZSAweDA6CisJCQkvKiBOTyBQUk9URUNUICovCisJCQkvKiAxLkFsbCBTVEFzIGluIHRoZSBCU1MgYXJlIDIwLzQwIE1IeiBIVCAqLworCQkJLyogMi4gaW4gYWkgMjAvNDBNSHogQlNTICovCisJCQkvKiAzLiBhbGwgU1RBcyBhcmUgMjBNSHogaW4gYSAyME1IeiBCU1MgKi8KKwkJCS8qIFB1cmUgSFQuIG5vIHByb3RlY3Rpb24uICovCisKKwkJCS8qIE1NMjBfUFJPVF9DRkcgKi8KKwkJCS8qICAgICAgUmVzZXJ2ZWQgKDMxOjI3KSAqLworCQkJLyogICAgICBQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMSAqLworCQkJLyogICAgICBQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikgKi8KKwkJCS8qICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKSAqLworCQkJLyogICAgICBQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDAwNCAoT0ZETSAyNE0pICovCisJCQlQcm90ZWN0WzJdID0gMHgwMTc0NDAwNDsKKworCQkJLyogTU00MF9QUk9UX0NGRyAqLworCQkJLyogICAgICBSZXNlcnZlZCAoMzE6MjcpICovCisJCQkvKiAgICAgIFBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExICovCisJCQkvKiAgICAgIFBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKSAqLworCQkJLyogIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpICovCisJCQkvKiAgICAgIFBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pICovCisJCQlQcm90ZWN0WzNdID0gMHgwM2Y0NDA4NDsKKworCQkJLyogQ0YyMF9QUk9UX0NGRyAqLworCQkJLyogICAgICBSZXNlcnZlZCAoMzE6MjcpICovCisJCQkvKiAgICAgIFBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExICovCisJCQkvKiAgICAgIFBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKSAqLworCQkJLyogIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpICovCisJCQkvKiAgICAgIFBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkgKi8KKwkJCVByb3RlY3RbNF0gPSAweDAxNzQ0MDA0OworCisJCQkvKiBDRjQwX1BST1RfQ0ZHICovCisJCQkvKiAgICAgIFJlc2VydmVkICgzMToyNykgKi8KKwkJCS8qICAgICAgUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEgKi8KKwkJCS8qICAgICAgUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pICovCisJCQkvKiAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkgKi8KKwkJCS8qICAgICAgUFJPVF9SQVRFKDE1OjApICAtLSAweDQwODQgKGR1cGxpY2F0ZSBPRkRNIDI0TSkgKi8KKwkJCVByb3RlY3RbNV0gPSAweDAzZjQ0MDg0OworCisJCQlpZiAoYk5vbkdGRXhpc3QpIHsKKwkJCQkvKiBQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlpb24pICovCisJCQkJLyogUFJPVF9DVFJMKDE3OjE2KSAtLSAwMSAoUlRTL0NUUykgKi8KKwkJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKKwkJCQlQcm90ZWN0WzVdID0gMHgwM2Y1NDA4NDsKKwkJCX0KKwkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKKwkJCWJyZWFrOworCisJCWNhc2UgMToKKwkJCS8qIFRoaXMgaXMgIkhUIG5vbi1tZW1iZXIgcHJvdGVjdGlvbiBtb2RlLiIgKi8KKwkJCS8qIElmIHRoZXJlIG1heSBiZSBub24tSFQgU1RBcyBteSBCU1MgKi8KKwkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8qIFBST1RfQ1RSTCgxNzoxNikgOiAwIChOb25lKSAqLworCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7CS8qIGR1cGxpY2FldCBsZWdhY3kgMjRNLiBCVyBzZXQgMS4gKi8KKwkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcKKwkJCSAgICAocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKSkgeworCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDAwMDM7CS8qRVJQIHVzZSBQcm90ZWN0aW9uIGJpdCBpcyBzZXQsIHVzZSBwcm90ZWN0aW9uIHJhdGUgYXQgQ2xhdXNlIDE4Li4gKi8KKwkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0MDAwMzsJLyogRG9uJ3QgZHVwbGljYXRlIFJUUy9DVFMgaW4gQ0NLIG1vZGUuIDB4MDNmNDAwODM7ICovCisJCQl9CisJCQkvKkFzc2lnbiBQcm90ZWN0aW9uIG1ldGhvZCBmb3IgMjAmNDAgTUh6IHBhY2tldHMgKi8KKwkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCVByb3RDZmcuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOworCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOworCQkJUHJvdGVjdFszXSA9IFByb3RDZmc0LndvcmQ7CisJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOworCQkJUHJvdGVjdFs1XSA9IFByb3RDZmc0LndvcmQ7CisJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gVFJVRTsKKwkJCWJyZWFrOworCisJCWNhc2UgMjoKKwkJCS8qIElmIG9ubHkgSFQgU1RBcyBhcmUgaW4gQlNTLiBhdCBsZWFzdCBvbmUgaXMgMjBNSHouIE9ubHkgcHJvdGVjdCA0ME1IeiBwYWNrZXRzICovCisJCQlQcm90Q2ZnLndvcmQgPSAweDAxNzQ0MDA0OwkvKiBQUk9UX0NUUkwoMTc6MTYpIDogMCAoTm9uZSkgKi8KKwkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQ0MDg0OwkvKiBkdXBsaWNhZXQgbGVnYWN5IDI0TS4gQlcgc2V0IDEuICovCisKKwkJCS8qQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciA0ME1IeiBwYWNrZXRzICovCisJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOworCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOworCQkJUHJvdGVjdFszXSA9IFByb3RDZmc0LndvcmQ7CisJCQlpZiAoYk5vbkdGRXhpc3QpIHsKKwkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7CisJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCX0KKwkJCVByb3RlY3RbNF0gPSBQcm90Q2ZnLndvcmQ7CisJCQlQcm90ZWN0WzVdID0gUHJvdENmZzQud29yZDsKKworCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IEZBTFNFOworCQkJYnJlYWs7CisKKwkJY2FzZSAzOgorCQkJLyogSFQgbWl4ZWQgbW9kZS4gICAgICAgIFBST1RFQ1QgQUxMISAqLworCQkJLyogQXNzaWduIFJhdGUgKi8KKwkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8qZHVwbGljYWV0IGxlZ2FjeSAyNE0uIEJXIHNldCAxLiAqLworCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7CisJCQkvKiBib3RoIDIwTUh6IGFuZCA0ME1IeiBhcmUgcHJvdGVjdGVkLiBXaGV0aGVyIHVzZSBSVFMgb3IgQ1RTLXRvLXNlbGYgZGVwZW5kcyBvbiB0aGUgKi8KKwkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcKKwkJCSAgICAocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKSkgeworCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDAwMDM7CS8qRVJQIHVzZSBQcm90ZWN0aW9uIGJpdCBpcyBzZXQsIHVzZSBwcm90ZWN0aW9uIHJhdGUgYXQgQ2xhdXNlIDE4Li4gKi8KKwkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0MDAwMzsJLyogRG9uJ3QgZHVwbGljYXRlIFJUUy9DVFMgaW4gQ0NLIG1vZGUuIDB4MDNmNDAwODMgKi8KKwkJCX0KKwkJCS8qQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciAyMCY0MCBNSHogcGFja2V0cyAqLworCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOworCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7CisJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCVByb3RlY3RbMl0gPSBQcm90Q2ZnLndvcmQ7CisJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKKwkJCVByb3RlY3RbNF0gPSBQcm90Q2ZnLndvcmQ7CisJCQlQcm90ZWN0WzVdID0gUHJvdENmZzQud29yZDsKKwkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOworCQkJYnJlYWs7CisKKwkJY2FzZSA4OgorCQkJLyogU3BlY2lhbCBvbiBmb3IgQXRoZXJvcyBwcm9ibGVtIG4gY2hpcC4gKi8KKwkJCVByb3RlY3RbMl0gPSAweDAxNzU0MDA0OworCQkJUHJvdGVjdFszXSA9IDB4MDNmNTQwODQ7CisJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKKwkJCVByb3RlY3RbNV0gPSAweDAzZjU0MDg0OworCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IFRSVUU7CisJCQlicmVhazsKKwkJfQorCX0KKworCW9mZnNldCA9IENDS19QUk9UX0NGRzsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWlmICgoU2V0TWFzayAmICgxIDw8IGkpKSkgeworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgaSAqIDQsIFByb3RlY3RbaV0pOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBBc2ljU3dpdGNoQ2hhbm5lbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IENoYW5uZWwsIElOIEJPT0xFQU4gYlNjYW4pCit7CisJdW5zaWduZWQgbG9uZyBSMiA9IDAsIFIzID0gREVGQVVMVF9SRl9UWF9QT1dFUiwgUjQgPSAwOworCWNoYXIgVHhQd2VyID0gMCwgVHhQd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CS8qQmJwOTQgPSBCQlBSOTRfREVGQVVMVCwgVHhQd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7ICovCisJdTggaW5kZXg7CisJdTMyIFZhbHVlID0gMDsJLypCYnBSZWcsIFZhbHVlOyAqLworCXN0cnVjdCBydF9ydG1wX3JmX3JlZ3MgKlJGUmVnVGFibGU7CisJdTggUkZWYWx1ZTsKKworCVJGVmFsdWUgPSAwOworCS8qIFNlYXJjaCBUeCBwb3dlciB2YWx1ZSAqLworCS8qIFdlIGNhbid0IHVzZSBDaGFubmVsTGlzdCB0byBzZWFyY2ggY2hhbm5lbCwgc2luY2Ugc29tZSBjZW50cmFsIGNoYW5ubCdzIHR4cG93ciBkb2Vzbid0IGxpc3QgKi8KKwkvKiBpbiBDaGFubmVsTGlzdCwgc28gdXNlIFR4UG93ZXIgYXJyYXkgaW5zdGVhZC4gKi8KKwkvKiAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGluZGV4KyspIHsKKwkJaWYgKENoYW5uZWwgPT0gcEFkLT5UeFBvd2VyW2luZGV4XS5DaGFubmVsKSB7CisJCQlUeFB3ZXIgPSBwQWQtPlR4UG93ZXJbaW5kZXhdLlBvd2VyOworCQkJVHhQd2VyMiA9IHBBZC0+VHhQb3dlcltpbmRleF0uUG93ZXIyOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaW5kZXggPT0gTUFYX05VTV9PRl9DSEFOTkVMUykgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIkFzaWNTd2l0Y2hDaGFubmVsOiBDYW4ndCBmaW5kIHRoZSBDaGFubmVsIyVkIFxuIiwKKwkJCSAgQ2hhbm5lbCkpOworCX0KKyNpZmRlZiBSVDMweHgKKwkvKiBUaGUgUkYgcHJvZ3JhbW1pbmcgc2VxdWVuY2UgaXMgZGlmZmVyZW5jZSBiZXR3ZWVuIDN4eHggYW5kIDJ4eHggKi8KKwlpZiAoKElTX1JUMzA3MChwQWQpIHx8IElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCSAgICAmJiAoKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwKSB8fCAocEFkLT5SZkljVHlwZSA9PSBSRklDXzIwMjApCisJCXx8IChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMSkKKwkJfHwgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIyKSkpIHsKKwkJLyogbW9kaWZ5IGJ5IFdZIGZvciBSZWFkIFJGIFJlZy4gZXJyb3IgKi8KKworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMzAyMF9DSE5MOyBpbmRleCsrKSB7CisJCQlpZiAoQ2hhbm5lbCA9PSBGcmVxSXRlbXMzMDIwW2luZGV4XS5DaGFubmVsKSB7CisJCQkJLyogUHJvZ3JhbW1pbmcgY2hhbm5lbCBwYXJhbWV0ZXJzICovCisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAyLAorCQkJCQkJICAgICAgRnJlcUl0ZW1zMzAyMFtpbmRleF0uTik7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAzLAorCQkJCQkJICAgICAgRnJlcUl0ZW1zMzAyMFtpbmRleF0uSyk7CisJCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDYsICZSRlZhbHVlKTsKKwkJCQlSRlZhbHVlID0KKwkJCQkgICAgKFJGVmFsdWUgJiAweEZDKSB8IEZyZXFJdGVtczMwMjBbaW5kZXhdLlI7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA2LCBSRlZhbHVlKTsKKworCQkJCS8qIFNldCBUeDAgUG93ZXIgKi8KKwkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IxMiwgJlJGVmFsdWUpOworCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4RTApIHwgVHhQd2VyOworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxMiwgUkZWYWx1ZSk7CisKKwkJCQkvKiBTZXQgVHgxIFBvd2VyICovCisJCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMTMsICZSRlZhbHVlKTsKKwkJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAweEUwKSB8IFR4UHdlcjI7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjEzLCBSRlZhbHVlKTsKKworCQkJCS8qIFR4L1J4IFN0cmVhbSBzZXR0aW5nICovCisJCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsICZSRlZhbHVlKTsKKwkJCQkvKmlmIChJU19SVDMwOTAocEFkKSkgKi8KKwkJCQkvKiAgICAgIFJGVmFsdWUgfD0gMHgwMTsgLy8gRW5hYmxlIFJGIGJsb2NrLiAqLworCQkJCVJGVmFsdWUgJj0gMHgwMzsJLypjbGVhciBiaXRbN34yXSAqLworCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCQkJCVJGVmFsdWUgfD0gMHhBMDsKKwkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpCisJCQkJCVJGVmFsdWUgfD0gMHg4MDsKKwkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCQkJCQlSRlZhbHVlIHw9IDB4NTA7CisJCQkJZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCQkJCQlSRlZhbHVlIHw9IDB4NDA7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCBSRlZhbHVlKTsKKworCQkJCS8qIFNldCBSRiBvZmZzZXQgKi8KKwkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMywgJlJGVmFsdWUpOworCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4ODApIHwgcEFkLT5SZkZyZXFPZmZzZXQ7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIzLCBSRlZhbHVlKTsKKworCQkJCS8qIFNldCBCVyAqLworCQkJCWlmICghYlNjYW4KKwkJCQkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkpIHsKKwkJCQkJUkZWYWx1ZSA9IHBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0OworCQkJCQkvKkRJU0FCTEVfMTFOX0NIRUNLKHBBZCk7ICovCisJCQkJfSBlbHNlIHsKKwkJCQkJUkZWYWx1ZSA9IHBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0OworCQkJCX0KKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGVmFsdWUpOworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgUkZWYWx1ZSk7CisKKwkJCQkvKiBFbmFibGUgUkYgdHVuaW5nICovCisJCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsICZSRlZhbHVlKTsKKwkJCQlSRlZhbHVlID0gUkZWYWx1ZSB8IDB4MTsKKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsIFJGVmFsdWUpOworCisJCQkJLyogbGF0Y2ggY2hhbm5lbCBmb3IgZnV0dXJlIHVzYWdlLiAqLworCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IENoYW5uZWw7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiU3dpdGNoQ2hhbm5lbCMlZChSRj0lZCwgUHdyMD0lZCwgUHdyMT0lZCwgJWRUKSwgTj0weCUwMlgsIEs9MHglMDJYLCBSPTB4JTAyWFxuIiwKKwkJCQkJICBDaGFubmVsLCBwQWQtPlJmSWNUeXBlLCBUeFB3ZXIsCisJCQkJCSAgVHhQd2VyMiwgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCQkJICBGcmVxSXRlbXMzMDIwW2luZGV4XS5OLAorCQkJCQkgIEZyZXFJdGVtczMwMjBbaW5kZXhdLkssCisJCQkJCSAgRnJlcUl0ZW1zMzAyMFtpbmRleF0uUikpOworCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UKKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKwl7CisJCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKKwkJc3dpdGNoIChwQWQtPlJmSWNUeXBlKSB7CisJCWNhc2UgUkZJQ18yODIwOgorCQljYXNlIFJGSUNfMjg1MDoKKwkJY2FzZSBSRklDXzI3MjA6CisJCWNhc2UgUkZJQ18yNzUwOgorCisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKSB7CisJCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkgeworCQkJCQlSMiA9IFJGUmVnVGFibGVbaW5kZXhdLlIyOworCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSB7CisJCQkJCQlSMiB8PSAweDQwMDA7CS8qIElmIFRYcGF0aCBpcyAxLCBiaXQgMTQgPSAxOyAqLworCQkJCQl9CisKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikgeworCQkJCQkJUjIgfD0gMHg0MDsJLyogd3JpdGUgMSB0byBvZmYgUnhwYXRoLiAqLworCQkJCQl9IGVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0KKwkJCQkJCSAgIDEpIHsKKwkJCQkJCVIyIHw9IDB4MjAwNDA7CS8qIHdyaXRlIDEgdG8gb2ZmIFJ4UGF0aCAqLworCQkJCQl9CisKKwkJCQkJaWYgKENoYW5uZWwgPiAxNCkgeworCQkJCQkJLyogaW5pdGlhbGl6ZSBSMywgUjQgKi8KKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLgorCQkJCQkJICAgICAgUjMgJiAweGZmZmZjMWZmKTsKKwkJCQkJCVI0ID0gKFJGUmVnVGFibGVbaW5kZXhdLgorCQkJCQkJICAgICAgUjQgJiAofjB4MDAxZjg3YzApKSB8CisJCQkJCQkgICAgKHBBZC0+UmZGcmVxT2Zmc2V0IDw8IDE1KTsKKworCQkJCQkJLyogNUcgYmFuZCBwb3dlciByYW5nZTogMHhGOX4wWDBGLCBUWDAgUmVnMyBiaXQ5L1RYMSBSZWc0IGJpdDY9IjAiIG1lYW5zIHRoZSBUWCBwb3dlciByZWR1Y2UgN2RCICovCisJCQkJCQkvKiBSMyAqLworCQkJCQkJaWYgKChUeFB3ZXIgPj0gLTcpCisJCQkJCQkgICAgJiYgKFR4UHdlciA8IDApKSB7CisJCQkJCQkJVHhQd2VyID0gKDcgKyBUeFB3ZXIpOworCQkJCQkJCVR4UHdlciA9CisJCQkJCQkJICAgIChUeFB3ZXIgPgorCQkJCQkJCSAgICAgMHhGKSA/ICgweEYpCisJCQkJCQkJICAgIDogKFR4UHdlcik7CisJCQkJCQkJUjMgfD0gKFR4UHdlciA8PCAxMCk7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCQkJCSAoIkFzaWNTd2l0Y2hDaGFubmVsOiBUeFB3ZXI9JWQgXG4iLAorCQkJCQkJCQkgIFR4UHdlcikpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlUeFB3ZXIgPQorCQkJCQkJCSAgICAoVHhQd2VyID4KKwkJCQkJCQkgICAgIDB4RikgPyAoMHhGKQorCQkJCQkJCSAgICA6IChUeFB3ZXIpOworCQkJCQkJCVIzIHw9CisJCQkJCQkJICAgIChUeFB3ZXIgPDwgMTApIHwgKDEKKwkJCQkJCQkJCSAgICAgIDw8CisJCQkJCQkJCQkgICAgICA5KTsKKwkJCQkJCX0KKworCQkJCQkJLyogUjQgKi8KKwkJCQkJCWlmICgoVHhQd2VyMiA+PSAtNykKKwkJCQkJCSAgICAmJiAoVHhQd2VyMiA8IDApKSB7CisJCQkJCQkJVHhQd2VyMiA9ICg3ICsgVHhQd2VyMik7CisJCQkJCQkJVHhQd2VyMiA9CisJCQkJCQkJICAgIChUeFB3ZXIyID4KKwkJCQkJCQkgICAgIDB4RikgPyAoMHhGKQorCQkJCQkJCSAgICA6IChUeFB3ZXIyKTsKKwkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkJICgiQXNpY1N3aXRjaENoYW5uZWw6IFR4UHdlcjI9JWQgXG4iLAorCQkJCQkJCQkgIFR4UHdlcjIpKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJVHhQd2VyMiA9CisJCQkJCQkJICAgIChUeFB3ZXIyID4KKwkJCQkJCQkgICAgIDB4RikgPyAoMHhGKQorCQkJCQkJCSAgICA6IChUeFB3ZXIyKTsKKwkJCQkJCQlSNCB8PQorCQkJCQkJCSAgICAoVHhQd2VyMiA8PCA3KSB8ICgxCisJCQkJCQkJCQkgICAgICA8PAorCQkJCQkJCQkJICAgICAgNik7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlSMyA9IChSRlJlZ1RhYmxlW2luZGV4XS5SMyAmIDB4ZmZmZmMxZmYpIHwgKFR4UHdlciA8PCA5KTsJLyogc2V0IFRYIHBvd2VyMCAqLworCQkJCQkJUjQgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjQgJiAofjB4MDAxZjg3YzApKSB8IChwQWQtPlJmRnJlcU9mZnNldCA8PCAxNSkgfCAoVHhQd2VyMiA8PCA2KTsJLyogU2V0IGZyZXEgT2Zmc2V0ICYgVHhQd3IxICovCisJCQkJCX0KKworCQkJCQkvKiBCYXNlZCBvbiBCQlAgY3VycmVudCBtb2RlIGJlZm9yZSBjaGFuZ2luZyBSRiBjaGFubmVsLiAqLworCQkJCQlpZiAoIWJTY2FuCisJCQkJCSAgICAmJiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09CisJCQkJCQlCV180MCkpIHsKKwkJCQkJCVI0IHw9IDB4MjAwMDAwOworCQkJCQl9CisJCQkJCS8qIFVwZGF0ZSB2YXJpYWJsZXMgKi8KKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID0gQ2hhbm5lbDsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMSA9CisJCQkJCSAgICBSRlJlZ1RhYmxlW2luZGV4XS5SMTsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMiA9IFIyOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjM7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSNDsKKworCQkJCQkvKiBTZXQgUkYgdmFsdWUgMSdzIHNldCBSM1tiaXQyXSA9IFswXSAqLworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLAorCQkJCQkJCSAgIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLAorCQkJCQkJCSAgIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLAorCQkJCQkJCSAgIChwQWQtPkxhdGNoUmZSZWdzLgorCQkJCQkJCSAgICBSMyAmICh+MHgwNCkpKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwKKwkJCQkJCQkgICBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCQkJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CisKKwkJCQkJLyogU2V0IFJGIHZhbHVlIDIncyBzZXQgUjNbYml0Ml0gPSBbMV0gKi8KKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwKKwkJCQkJCQkgICBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwKKwkJCQkJCQkgICBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwKKwkJCQkJCQkgICAocEFkLT5MYXRjaFJmUmVncy4KKwkJCQkJCQkgICAgUjMgfCAweDA0KSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsCisJCQkJCQkJICAgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwkJCQkJUlRNUHVzZWNEZWxheSgyMDApOworCisJCQkJCS8qIFNldCBSRiB2YWx1ZSAzJ3Mgc2V0IFIzW2JpdDJdID0gWzBdICovCisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsCisJCQkJCQkJICAgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsCisJCQkJCQkJICAgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsCisJCQkJCQkJICAgKHBBZC0+TGF0Y2hSZlJlZ3MuCisJCQkJCQkJICAgIFIzICYgKH4weDA0KSkpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLAorCQkJCQkJCSAgIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiU3dpdGNoQ2hhbm5lbCMlZChSRj0lZCwgUHdyMD0lbHUsIFB3cjE9JWx1LCAlZFQpIHRvICwgUjE9MHglMDhseCwgUjI9MHglMDhseCwgUjM9MHglMDhseCwgUjQ9MHglMDhseFxuIiwKKwkJCSAgQ2hhbm5lbCwgcEFkLT5SZkljVHlwZSwgKFIzICYgMHgwMDAwM2UwMCkgPj4gOSwKKwkJCSAgKFI0ICYgMHgwMDAwMDdjMCkgPj4gNiwgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMSwgcEFkLT5MYXRjaFJmUmVncy5SMiwKKwkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMywgcEFkLT5MYXRjaFJmUmVncy5SNCkpOworCX0KKworCS8qIENoYW5nZSBCQlAgc2V0dGluZyBkdXJpbmcgc2l3dGNoIGZyb20gYS0+ZywgZy0+YSAqLworCWlmIChDaGFubmVsIDw9IDE0KSB7CisJCXVuc2lnbmVkIGxvbmcgVHhQaW5DZmcgPSAweDAwMDUwRjBBOwkvKkdhcnkgMjAwNy8wOC8wOSAweDA1MEEwQSAqLworCisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLAorCQkJCQkgICAgICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsCisJCQkJCSAgICAgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwKKwkJCQkJICAgICAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAwKTsJLyooMHg0NCAtIEdFVF9MTkFfR0FJTihwQWQpKSk7ICAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4gKi8KKwkJLypSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg2Mik7ICovCisKKwkJLyogUnggSGlnaCBwb3dlciBWR0Egb2Zmc2V0IGZvciBMTkEgc2VsZWN0ICovCisJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHKSB7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg2Mik7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg0Nik7CisJCX0gZWxzZSB7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg4NCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg1MCk7CisJCX0KKworCQkvKiA1RyBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQgKi8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDYpOworCQlWYWx1ZSB8PSAoMHgwNCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKwkJLyogVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIgKi8KKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkgeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRkZGMzsKKwkJfQorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKSB7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGM0ZGOworCQl9CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOworCisjaWYgZGVmaW5lZChSVDMwOTApIHx8IGRlZmluZWQoUlQzMzkwKQorCQkvKiBQQ0llIFBIWSBUcmFuc21pdCBhdHRlbnVhdGlvbiBhZGp1c3RtZW50ICovCisJCWlmIChJU19SVDMwOTBBKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpIHsKKwkJCVRYX0FUVEVOVUFUSU9OX0NUUkxfU1RSVUMgVHhBdHRlbnVhdGlvbkN0cmwgPSB7CisJCQkud29yZCA9IDB9OworCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFBDSUVfUEhZX1RYX0FUVEVOVUFUSU9OX0NUUkwsCisJCQkJICAgICAgICZUeEF0dGVudWF0aW9uQ3RybC53b3JkKTsKKworCQkJaWYgKENoYW5uZWwgPT0gMTQpCS8qIENoYW5uZWwgIzE0ICovCisJCQl7CisJCQkJVHhBdHRlbnVhdGlvbkN0cmwuZmllbGQuUENJRV9QSFlfVFhfQVRURU5fRU4gPSAxOwkvKiBFbmFibGUgUENJZSBQSFkgVHggYXR0ZW51YXRpb24gKi8KKwkJCQlUeEF0dGVudWF0aW9uQ3RybC5maWVsZC5QQ0lFX1BIWV9UWF9BVFRFTl9WQUxVRSA9IDQ7CS8qIDkvMTYgZnVsbCBkcml2ZSBsZXZlbCAqLworCQkJfSBlbHNlCS8qIENoYW5uZWwgIzF+IzEzICovCisJCQl7CisJCQkJVHhBdHRlbnVhdGlvbkN0cmwuZmllbGQuUENJRV9QSFlfVFhfQVRURU5fRU4gPSAwOwkvKiBEaXNhYmxlIFBDSWUgUEhZIFR4IGF0dGVudWF0aW9uICovCisJCQkJVHhBdHRlbnVhdGlvbkN0cmwuZmllbGQuUENJRV9QSFlfVFhfQVRURU5fVkFMVUUgPSAwOwkvKiBuL2EgKi8KKwkJCX0KKworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgUENJRV9QSFlfVFhfQVRURU5VQVRJT05fQ1RSTCwKKwkJCQkJVHhBdHRlbnVhdGlvbkN0cmwud29yZCk7CisJCX0KKyNlbmRpZgorCX0gZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgVHhQaW5DZmcgPSAweDAwMDUwRjA1OwkvKkdhcnkgMjAwNy84LzkgMHgwNTA1MDUgKi8KKworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MiwKKwkJCQkJICAgICAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYzLAorCQkJCQkgICAgICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjQsCisJCQkJCSAgICAgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgMCk7CS8qKDB4NDQgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOyAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4gKi8KKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4RjIpOworCisJCS8qIFJ4IEhpZ2ggcG93ZXIgVkdBIG9mZnNldCBmb3IgTE5BIHNlbGVjdCAqLworCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yQSkgeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NDYpOworCQl9IGVsc2UgeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NTApOworCQl9CisKKwkJLyogNUcgYmFuZCBzZWxlY3Rpb24gUElOLCBiaXQxIGFuZCBiaXQyIGFyZSBjb21wbGVtZW50ICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHg2KTsKKwkJVmFsdWUgfD0gKDB4MDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCisJCS8qIFR1cm4gb2ZmIHVudXNlZCBQQSBvciBMTkEgd2hlbiBvbmx5IDFUIG9yIDFSICovCisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpIHsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjM7CisJCX0KKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkgeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjNGRjsKKwkJfQorCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKKworCX0KKworCS8qIFI2NiBzaG91bGQgYmUgc2V0IGFjY29yZGluZyB0byBDaGFubmVsIGFuZCB1c2UgMjBNSHogd2hlbiBzY2FubmluZyAqLworCS8qUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpKTsgKi8KKwlpZiAoYlNjYW4pCisJCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBCV18yMCk7CisJZWxzZQorCQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXKTsKKworCS8qICovCisJLyogT24gMTFBLCBXZSBzaG91bGQgZGVsYXkgYW5kIHdhaXQgUkYvQkJQIHRvIGJlIHN0YWJsZSAqLworCS8qIGFuZCB0aGUgYXBwcm9wcmlhdGUgdGltZSBzaG91bGQgYmUgMTAwMCBtaWNybyBzZWNvbmRzICovCisJLyogMjAwNS8wNi8wNSAtIE9uIDExRywgV2UgYWxzbyBuZWVkIHRoaXMgZGVsYXkgdGltZS4gT3RoZXJ3aXNlIGl0J3MgZGlmZmljdWx0IHRvIHBhc3MgdGhlIFdIUUwuICovCisJLyogKi8KKwlSVE1QdXNlY0RlbGF5KDEwMDApOworfQorCit2b2lkIEFzaWNSZXNldEJCUEFnZW50KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlCQlBfQ1NSX0NGR19TVFJVQyBCYnBDc3I7CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUmVzZXQgQkJQIEFnZW50IGJ1c3kgYml0IVxuIikpOworCS8qIFN0aWxsIG5lZWQgdG8gZmluZCB3aHkgQkJQIGFnZW50IGtlZXBzIGJ1c3ksIGJ1dCBpbiBmYWN0LCBoYXJkd2FyZSBzdGlsbCBmdW5jdGlvbiBvay4gTm93IGNsZWFyIGJ1c3kgZmlyc3QuICovCisJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOworCUJicENzci5maWVsZC5CdXN5ID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgMjQyMSBvbmx5LCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGR1cmluZworCQlzaXRlIHN1cnZleS4gSXQncyBvbmx5IHJlcXVpcmVkIGFmdGVyIE5JQyBkZWNpZGVkIHRvIHN0YXkgYXQgYSBjaGFubmVsCisJCWZvciBhIGxvbmdlciBwZXJpb2QuCisJCVdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIGl0J3MgYWx3YXlzIGFmdGVyIEFzaWNTd2l0Y2hDaGFubmVsKCkuCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBBc2ljTG9ja0NoYW5uZWwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBDaGFubmVsKQoreworfQorCit2b2lkIEFzaWNSZlR1bmluZ0V4ZWModm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgICAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQoreworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUdpdmVzIENDSyBUWCByYXRlIDIgbW9yZSBkQiBUWCBwb3dlci4KKwkJVGhpcyByb3V0aW5lIHdvcmtzIG9ubHkgaW4gTElOSyBVUCBpbiBJTkZSQVNUUlVDVFVSRSBtb2RlLgorCisJCWNhbGN1bGF0ZSBkZXNpcmVkIFR4IHBvd2VyIGluIFJGIFIzLlR4MH41LAlzaG91bGQgY29uc2lkZXIgLQorCQkwLiBpZiBjdXJyZW50IHJhZGlvIGlzIGEgbm9pc3kgZW52aXJvbm1lbnQgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpCisJCTEuIFR4UG93ZXJQZXJjZW50YWdlCisJCTIuIGF1dG8gY2FsaWJyYXRpb24gYmFzZWQgb24gVFNTSSBmZWVkYmFjaworCQkzLiBleHRyYSAyIGRiIGZvciBDQ0sKKwkJNC4gLTEwIGRiIHVwb24gdmVyeS1zaG9ydCBkaXN0YW5jZSAoQXZnUlNTSSA+PSAtNDBkYikgdG8gQVAKKworCU5PVEU6IFNpbmNlIHRoaXMgcm91dGluZSByZXF1aXJlcyB0aGUgdmFsdWUgb2YgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpLAorCQlpdCBzaG91bGQgYmUgY2FsbGVkIEFGVEVSIE1sbWVEeW5hbWljVHhSYXRTd2l0Y2hpbmcoKQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgQXNpY0FkanVzdFR4UG93ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCWludCBpLCBqOworCWNoYXIgRGVsdGFQd3IgPSAwOworCUJPT0xFQU4gYkF1dG9UeEFnYyA9IEZBTFNFOworCXU4IFRzc2lSZWYsICpwVHNzaU1pbnVzQm91bmRhcnksICpwVHNzaVBsdXNCb3VuZGFyeSwgVHhBZ2NTdGVwOworCXU4IEJicFIxID0gMCwgQmJwUjQ5ID0gMCwgaWR4OworCWNoYXIgKnBUeEFnY0NvbXBlbnNhdGU7CisJdW5zaWduZWQgbG9uZyBUeFB3cls1XTsKKwljaGFyIFZhbHVlOworCWNoYXIgUnNzaSA9IC0xMjc7CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSB8fAorI2lmZGVmIFJUTVBfTUFDX1BDSQorCSAgICAocEFkLT5iUENJY2xrT2ZmID09IFRSVUUpIHx8CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisJICAgIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikgfHwKKwkgICAgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJcmV0dXJuOworCisJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKKwkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAsCisJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLAorCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMik7CisKKwlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKSB7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IDE0KSB7CisJCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzRdOworCQl9IGVsc2UgeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFs0XTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpIHsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbNF07CisJCX0gZWxzZSB7CisJCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzRdOworCQl9CisJfQorCisJLyogVFggcG93ZXIgY29tcGVuc2F0aW9uIGZvciB0ZW1wZXJhdHVyZSB2YXJpYXRpb24gYmFzZWQgb24gVFNTSS4gdHJ5IGV2ZXJ5IDQgc2Vjb25kICovCisJaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNCA9PSAwKSB7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSB7CisJCQkvKiBiZyBjaGFubmVsICovCisJCQliQXV0b1R4QWdjID0gcEFkLT5iQXV0b1R4QWdjRzsKKwkJCVRzc2lSZWYgPSBwQWQtPlRzc2lSZWZHOworCQkJcFRzc2lNaW51c0JvdW5kYXJ5ID0gJnBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzBdOworCQkJcFRzc2lQbHVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1swXTsKKwkJCVR4QWdjU3RlcCA9IHBBZC0+VHhBZ2NTdGVwRzsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVHOworCQl9IGVsc2UgeworCQkJLyogYSBjaGFubmVsICovCisJCQliQXV0b1R4QWdjID0gcEFkLT5iQXV0b1R4QWdjQTsKKwkJCVRzc2lSZWYgPSBwQWQtPlRzc2lSZWZBOworCQkJcFRzc2lNaW51c0JvdW5kYXJ5ID0gJnBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzBdOworCQkJcFRzc2lQbHVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVswXTsKKwkJCVR4QWdjU3RlcCA9IHBBZC0+VHhBZ2NTdGVwQTsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOworCQl9CisKKwkJaWYgKGJBdXRvVHhBZ2MpIHsKKwkJCS8qIEJicFIxIGlzIHVuc2lnbmVkIGNoYXIgKi8KKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNDksICZCYnBSNDkpOworCisJCQkvKiAocCkgVHNzaVBsdXNCb3VuZGFyeUdbMF0gPSAwID0gKG0pIFRzc2lNaW51c0JvdW5kYXJ5R1swXSAqLworCQkJLyogY29tcGVuc2F0ZTogKzQgICAgICszICAgKzIgICArMSAgICAwICAgLTEgICAtMiAgIC0zICAgLTQgKiBzdGVwcyAqLworCQkJLyogc3RlcCB2YWx1ZSBpcyBkZWZpbmVkIGluIHBBZC0+VHhBZ2NTdGVwRyBmb3IgdHggcG93ZXIgdmFsdWUgKi8KKworCQkJLyogWzRdKzErWzRdICAgcDQgICAgIHAzICAgcDIgICBwMSAgIG8xICAgbTEgICBtMiAgIG0zICAgbTQgKi8KKwkJCS8qIGV4OiAgICAgICAgIDB4MDAgMHgxNSAweDI1IDB4NDUgMHg4OCAweEEwIDB4QjUgMHhEMCAweEYwCisJCQkgICBhYm92ZSB2YWx1ZSBhcmUgZXhhbWluZWQgaW4gbWFzcyBmYWN0b3J5IHByb2R1Y3Rpb24gKi8KKwkJCS8qICAgICAgICAgICAgIFs0XSAgICBbM10gIFsyXSAgWzFdICBbMF0gIFsxXSAgWzJdICBbM10gIFs0XSAqLworCisJCQkvKiBwbHVzICgrKSBpcyAweDAwIH4gMHg0NSwgbWludXMgKC0pIGlzIDB4YTAgfiAweGYwICovCisJCQkvKiBpZiB2YWx1ZSBpcyBiZXR3ZWVuIHAxIH4gbzEgb3IgbzEgfiBzMSwgbm8gbmVlZCB0byBhZGp1c3QgdHggcG93ZXIgKi8KKwkJCS8qIGlmIHZhbHVlIGlzIDB4YTUsIHR4IHBvd2VyIHdpbGwgYmUgLT0gVHhBZ2NTdGVwKigyLTEpICovCisKKwkJCWlmIChCYnBSNDkgPiBwVHNzaU1pbnVzQm91bmRhcnlbMV0pIHsKKwkJCQkvKiBSZWFkaW5nIGlzIGxhcmdlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUgKi8KKwkJCQkvKiBjaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gZGVjcmVhc2UgdGhlIFR4IHBvd2VyICovCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykgeworCQkJCQlpZiAoQmJwUjQ5IDw9IHBUc3NpTWludXNCb3VuZGFyeVtpZHhdKQkvKiBGb3VuZCB0aGUgcmFuZ2UgKi8KKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGRlY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUjMgPiAodW5zaWduZWQgbG9uZykoVHhBZ2NTdGVwICogKGlkeC0xKSkpICovCisJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAtKFR4QWdjU3RlcCAqIChpZHggLSAxKSk7CisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oKHU4KVIzKTsgKi8KKworCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIi0tIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9IC0lZFxuIiwKKwkJCQkJICBCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4IC0gMSkpOworCQkJfSBlbHNlIGlmIChCYnBSNDkgPCBwVHNzaVBsdXNCb3VuZGFyeVsxXSkgeworCQkJCS8qIFJlYWRpbmcgaXMgc21hbGxlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUgKi8KKwkJCQkvKiBjaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gaW5jcmVhc2UgdGhlIFR4IHBvd2VyICovCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykgeworCQkJCQlpZiAoQmJwUjQ5ID49IHBUc3NpUGx1c0JvdW5kYXJ5W2lkeF0pCS8qIEZvdW5kIHRoZSByYW5nZSAqLworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIFRoZSBpbmRleCBpcyB0aGUgc3RlcCB3ZSBzaG91bGQgaW5jcmVhc2UsIGlkeCA9IDAgbWVhbnMgdGhlcmUgaXMgbm90aGluZyB0byBjb21wZW5zYXRlICovCisJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSBUeEFnY1N0ZXAgKiAoaWR4IC0gMSk7CisJCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiKysgVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAorCQkJCQkgIEJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCBpZHggLSAxKSk7CisJCQl9IGVsc2UgeworCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gMDsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiICAgVHggUG93ZXIsIEJCUCBSNDk9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9ICslZFxuIiwKKwkJCQkJICBCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgMCkpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpIHsKKwkJCWJBdXRvVHhBZ2MgPSBwQWQtPmJBdXRvVHhBZ2NHOworCQkJcFR4QWdjQ29tcGVuc2F0ZSA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUc7CisJCX0gZWxzZSB7CisJCQliQXV0b1R4QWdjID0gcEFkLT5iQXV0b1R4QWdjQTsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOworCQl9CisKKwkJaWYgKGJBdXRvVHhBZ2MpCisJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCX0KKworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJicFIxKTsKKwlCYnBSMSAmPSAweEZDOworCisJLyogY2FsY3VsYXRlIGRlbHRhIHBvd2VyIGJhc2VkIG9uIHRoZSBwZXJjZW50YWdlIHNwZWNpZmllZCBmcm9tIFVJICovCisJLyogRTJQUk9NIHNldHRpbmcgaXMgY2FsaWJyYXRlZCBmb3IgbWF4aW11bSBUWCBwb3dlciAoaS5lLiAxMDAlKSAqLworCS8qIFdlIGxvd2VyIFRYIHBvd2VyIGhlcmUgYWNjb3JkaW5nIHRvIHRoZSBwZXJjZW50YWdlIHNwZWNpZmllZCBmcm9tIFVJICovCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID09IDB4ZmZmZmZmZmYpCS8qIEFVVE8gVFggUE9XRVIgY29udHJvbCAqLworCXsKKwkJeworCQkJLyogdG8gcGF0Y2ggaGlnaCBwb3dlciBpc3N1ZSB3aXRoIHNvbWUgQVBzLCBsaWtlIEJlbGtpbiBOMS4gKi8KKwkJCWlmIChSc3NpID4gLTM1KSB7CisJCQkJQmJwUjEgfD0gMHgwMjsJLyogRGVsdGFQd3IgLT0gMTI7ICovCisJCQl9IGVsc2UgaWYgKFJzc2kgPiAtNDApIHsKKwkJCQlCYnBSMSB8PSAweDAxOwkvKiBEZWx0YVB3ciAtPSA2OyAqLworCQkJfSBlbHNlOworCQl9CisJfSBlbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkwKQkvKiA5MSB+IDEwMCUgJiBBVVRPLCB0cmVhdCBhcyAxMDAlIGluIHRlcm1zIG9mIG1XICovCisJCTsKKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDYwKQkvKiA2MSB+IDkwJSwgdHJlYXQgYXMgNzUlIGluIHRlcm1zIG9mIG1XICAgICAgICAgICAgICAgLy8gRGVsdGFQd3IgLT0gMTsgKi8KKwl7CisJCURlbHRhUHdyIC09IDE7CisJfSBlbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDMwKQkvKiAzMSB+IDYwJSwgdHJlYXQgYXMgNTAlIGluIHRlcm1zIG9mIG1XICAgICAgICAgICAgICAgLy8gRGVsdGFQd3IgLT0gMzsgKi8KKwl7CisJCURlbHRhUHdyIC09IDM7CisJfSBlbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDE1KQkvKiAxNiB+IDMwJSwgdHJlYXQgYXMgMjUlIGluIHRlcm1zIG9mIG1XICAgICAgICAgICAgICAgLy8gRGVsdGFQd3IgLT0gNjsgKi8KKwl7CisJCUJicFIxIHw9IDB4MDE7CisJfSBlbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkpCS8qIDEwIH4gMTUlLCB0cmVhdCBhcyAxMi41JSBpbiB0ZXJtcyBvZiBtVyAgICAgICAgICAgICAvLyBEZWx0YVB3ciAtPSA5OyAqLworCXsKKwkJQmJwUjEgfD0gMHgwMTsKKwkJRGVsdGFQd3IgLT0gMzsKKwl9IGVsc2UJCQkvKiAwIH4gOSAlLCB0cmVhdCBhcyBNSU4ofjMlKSBpbiB0ZXJtcyBvZiBtVyAgICAgICAgICAgICAvLyBEZWx0YVB3ciAtPSAxMjsgKi8KKwl7CisJCUJicFIxIHw9IDB4MDI7CisJfQorCisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQmJwUjEpOworCisJLyogcmVzZXQgZGlmZmVyZW50IG5ldyB0eCBwb3dlciBmb3IgZGlmZmVyZW50IFRYIHJhdGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCWlmIChUeFB3cltpXSAhPSAweGZmZmZmZmZmKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCQkJVmFsdWUgPSAoY2hhcikoKFR4UHdyW2ldID4+IGogKiA0KSAmIDB4MEYpOwkvKiAwIH4gMTUgKi8KKworCQkJCWlmICgoVmFsdWUgKyBEZWx0YVB3cikgPCAwKSB7CisJCQkJCVZhbHVlID0gMDsJLyogbWluICovCisJCQkJfSBlbHNlIGlmICgoVmFsdWUgKyBEZWx0YVB3cikgPiAweEYpIHsKKwkJCQkJVmFsdWUgPSAweEY7CS8qIG1heCAqLworCQkJCX0gZWxzZSB7CisJCQkJCVZhbHVlICs9IERlbHRhUHdyOwkvKiB0ZW1wZXJhdHVyZSBjb21wZW5zYXRpb24gKi8KKwkJCQl9CisKKwkJCQkvKiBmaWxsIG5ldyB2YWx1ZSB0byBDU1Igb2Zmc2V0ICovCisJCQkJVHhQd3JbaV0gPQorCQkJCSAgICAoVHhQd3JbaV0gJiB+KDB4MDAwMDAwMEYgPDwgaiAqIDQpKSB8IChWYWx1ZQorCQkJCQkJCQkJICAgPDwgagorCQkJCQkJCQkJICAgKiA0KTsKKwkJCX0KKworCQkJLyogd3JpdGUgdHggcG93ZXIgdmFsdWUgdG8gQ1NSICovCisJCQkvKiBUWF9QV1JfQ0ZHXzAgKDggdHggcmF0ZSkgZm9yIFRYIHBvd2VyIGZvciBPRkRNIDEyTS8xOE0KKwkJCSAgIFRYIHBvd2VyIGZvciBPRkRNIDZNLzlNCisJCQkgICBUWCBwb3dlciBmb3IgQ0NLNS41TS8xMU0KKwkJCSAgIFRYIHBvd2VyIGZvciBDQ0sxTS8yTSAqLworCQkJLyogVFhfUFdSX0NGR18xIH4gVFhfUFdSX0NGR180ICovCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpICogNCwgVHhQd3JbaV0pOworCQl9CisJfQorCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJcHV0IFBIWSB0byBzbGVlcCBoZXJlLCBhbmQgc2V0IG5leHQgd2FrZXVwIHRpbWVyLiBQSFkgZG9lc24ndCBub3Qgd2FrZXVwCisJCWF1dG9tYXRpY2FsbHkuIEluc3RlYWQsIE1DVSB3aWxsIGlzc3VlIGEgVHdha2VVcEludGVycnVwdCB0byBob3N0IGFmdGVyCisJCXRoZSB3YWtldXAgdGltZXIgdGltZW91dC4gRHJpdmVyIGhhcyB0byBpc3N1ZSBhIHNlcGFyYXRlIGNvbW1hbmQgdG8gd2FrZQorCQlQSFkgdXAuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1MTYgVGJ0dE51bVRvTmV4dFdha2VVcCkKK3sKKwlSVE1QX1NUQV9TTEVFUF9USEVOX0FVVE9fV0FLRVVQKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQXNpY0ZvcmNlV2FrZXVwKCkgaXMgdXNlZCB3aGVuZXZlciBtYW51YWwgd2FrZXVwIGlzIHJlcXVpcmVkCisJCUFzaWNGb3JjZVNsZWVwKCkgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIG5vdCBpbiBJTkZSQSBCU1MuIFdoZW4KKwkJaW4gSU5GUkEgQlNTLCB3ZSBzaG91bGQgdXNlIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKCkgaW5zdGVhZC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIEFzaWNGb3JjZVNsZWVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUFzaWNGb3JjZVdha2V1cCgpIGlzIHVzZWQgd2hlbmV2ZXIgVHdha2V1cCB0aW1lciAoc2V0IHZpYSBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCkKKwkJZXhwaXJlZC4KKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBBc2ljRm9yY2VXYWtldXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJGcm9tVHgpCit7CisJREJHUFJJTlQoUlRfREVCVUdfSU5GTywgKCItLT4gQXNpY0ZvcmNlV2FrZXVwIFxuIikpOworCVJUTVBfU1RBX0ZPUkNFX1dBS0VVUChwQWQsIGJGcm9tVHgpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNldCBNeSBCU1NJRAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIEFzaWNTZXRCc3NpZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICpwQnNzaWQpCit7CisJdW5zaWduZWQgbG9uZyBBZGRyNDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPT09PT09PT09PT09PT0+IEFzaWNTZXRCc3NpZCAleDoleDoleDoleDoleDoleFxuIiwgcEJzc2lkWzBdLAorCQkgIHBCc3NpZFsxXSwgcEJzc2lkWzJdLCBwQnNzaWRbM10sIHBCc3NpZFs0XSwgcEJzc2lkWzVdKSk7CisKKwlBZGRyNCA9ICh1bnNpZ25lZCBsb25nKShwQnNzaWRbMF0pIHwKKwkgICAgKHVuc2lnbmVkIGxvbmcpKHBCc3NpZFsxXSA8PCA4KSB8CisJICAgICh1bnNpZ25lZCBsb25nKShwQnNzaWRbMl0gPDwgMTYpIHwgKHVuc2lnbmVkIGxvbmcpKHBCc3NpZFszXSA8PCAyNCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0JTU0lEX0RXMCwgQWRkcjQpOworCisJQWRkcjQgPSAwOworCS8qIGFsd2F5cyBvbmUgQlNTSUQgaW4gU1RBIG1vZGUgKi8KKwlBZGRyNCA9ICh1bnNpZ25lZCBsb25nKShwQnNzaWRbNF0pIHwgKHVuc2lnbmVkIGxvbmcpKHBCc3NpZFs1XSA8PCA4KTsKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19CU1NJRF9EVzEsIEFkZHI0KTsKK30KKwordm9pZCBBc2ljU2V0TWNhc3RXQyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF07CisJdTE2IG9mZnNldDsKKworCXBFbnRyeS0+U3N0ID0gU1NUX0FTU09DOworCXBFbnRyeS0+QWlkID0gTUNBU1RfV0NJRDsJLyogU29mdGFwIHN1cHBvcnRzIDEgQlNTSUQgYW5kIHVzZSBXQ0lEPTAgYXMgbXVsdGljYXN0IFdjaWQgaW5kZXggKi8KKwlwRW50cnktPlBzTW9kZSA9IFBXUl9BQ1RJVkU7CisJcEVudHJ5LT5DdXJyVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIEJTUzBNY2FzdF9XQ0lEICogSFdfV0NJRF9FTlRSWV9TSVpFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgQXNpY0RlbFdjaWRUYWIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBXY2lkKQoreworCXVuc2lnbmVkIGxvbmcgQWRkcjAgPSAweDAsIEFkZHIxID0gMHgwOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0RlbFdjaWRUYWI9PT5XY2lkID0gMHgleFxuIiwgV2NpZCkpOworCW9mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyBXY2lkICogSFdfV0NJRF9FTlRSWV9TSVpFOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgQWRkcjApOworCW9mZnNldCArPSA0OworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgQWRkcjEpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgQXNpY0VuYWJsZVJERyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJVFhfTElOS19DRkdfU1RSVUMgVHhMaW5rQ2ZnOworCXUzMiBEYXRhID0gMDsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTElOS19DRkcsICZUeExpbmtDZmcud29yZCk7CisJVHhMaW5rQ2ZnLmZpZWxkLlR4UkRHRW4gPSAxOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOworCURhdGEgJj0gMHhGRkZGRkYwMDsKKwlEYXRhIHw9IDB4ODA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKKworCS8qT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsgKi8KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIEFzaWNEaXNhYmxlUkRHKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlUWF9MSU5LX0NGR19TVFJVQyBUeExpbmtDZmc7CisJdTMyIERhdGEgPSAwOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9MSU5LX0NGRywgJlR4TGlua0NmZy53b3JkKTsKKwlUeExpbmtDZmcuZmllbGQuVHhSREdFbiA9IDA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTElOS19DRkcsIFR4TGlua0NmZy53b3JkKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7CisKKwlEYXRhICY9IDB4RkZGRkZGMDA7CisJLypEYXRhICB8PSAweDIwOyAqLworI2lmbmRlZiBXSUZJX1RFU1QKKwkvKmlmICggcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgKSAqLworCS8qICAgICAgRGF0YSB8PSAweDYwOyAvLyBmb3IgcGVyZm9ybWFuY2UgaXNzdWUgbm90IHNldCB0aGUgVFhPUCB0byAwICovCisjZW5kaWYKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0RZTkFNSUNfQkVfVFhPUF9BQ1RJVkUpCisJICAgICYmIChwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk1JTU9QU0R5bmFtaWMgPT0gRkFMU0UpCisJICAgICkgeworCQkvKiBGb3IgQ1dDIHRlc3QsIGNoYW5nZSB0eG9wIGZyb20gMHgzMCB0byAweDIwIGluIFR4QnVyc3QgbW9kZSAqLworCQlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCisJCQlEYXRhIHw9IDB4MjA7CisJfQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIEFzaWNEaXNhYmxlU3luYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5EaXNhYmxlIFRTRiBzeW5jaHJvbml6YXRpb25cbiIpKTsKKworCS8qIDIwMDMtMTItMjAgZGlzYWJsZSBUU0YgYW5kIFRCVFQgd2hpbGUgTklDIGluIHBvd2VyLXNhdmluZyBoYXZlIHNpZGUgZWZmZWN0ICovCisJLyogICAgICAgICAgICAgICAgICAgICAgICB0aGF0IE5JQyB3aWxsIG5ldmVyIHdha2VzIHVwIGJlY2F1c2UgVFNGIHN0b3BzIGFuZCBubyBtb3JlICovCisJLyogICAgICAgICAgICAgICAgICAgICAgICBUQlRUIGludGVycnVwdHMgKi8KKwlwQWQtPlRidHRUaWNrQ291bnQgPSAwOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCWNzci5maWVsZC5iQmVhY29uR2VuID0gMDsKKwljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAwOworCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDA7CisJY3NyLmZpZWxkLmJUc2ZUaWNraW5nID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgQXNpY0VuYWJsZUJzc1N5bmMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+QXNpY0VuYWJsZUJzc1N5bmMoSU5GUkEgbW9kZSlcbiIpKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworLyogICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIDB4MDAwMDAwMDApOyAqLworCXsKKwkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDQ7CS8qIEFTSUMgcmVnaXN0ZXIgaW4gdW5pdHMgb2YgMS8xNiBUVSAqLworCQljc3IuZmllbGQuYlRzZlRpY2tpbmcgPSAxOworCQljc3IuZmllbGQuVHNmU3luY01vZGUgPSAxOwkvKiBzeW5jIFRTRiBpbiBJTkZSQVNUUlVDVFVSRSBtb2RlICovCisJCWNzci5maWVsZC5iQmVhY29uR2VuID0gMDsJLyogZG8gTk9UIGdlbmVyYXRlIEJFQUNPTiAqLworCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAxOworCX0KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCU5vdGU6CisJCUJFQUNPTiBmcmFtZSBpbiBzaGFyZWQgbWVtb3J5IHNob3VsZCBiZSBidWlsdCBvayBiZWZvcmUgdGhpcyByb3V0aW5lCisJCWNhbiBiZSBjYWxsZWQuIE90aGVyd2lzZSwgYSBnYXJiYWdlIGZyYW1lIG1heWJlIHRyYW5zbWl0dGVkIG91dCBldmVyeQorCQlCZWFjb24gcGVyaW9kLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIEFzaWNFbmFibGVJYnNzU3luYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjk7CisJdTggKnB0cjsKKwl1MzIgaTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCItLS0+QXNpY0VuYWJsZUlic3NTeW5jKEFESE9DIG1vZGUuIE1QRFV0b3RhbEJ5dGVDb3VudCA9ICVkKVxuIiwKKwkJICBwQWQtPkJlYWNvblR4V0kuTVBEVXRvdGFsQnl0ZUNvdW50KSk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzcjkud29yZCk7CisJY3NyOS5maWVsZC5iQmVhY29uR2VuID0gMDsKKwljc3I5LmZpZWxkLmJUQlRURW5hYmxlID0gMDsKKwljc3I5LmZpZWxkLmJUc2ZUaWNraW5nID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzcjkud29yZCk7CisKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkvKiBtb3ZlIEJFQUNPTiBUWEQgYW5kIGZyYW1lIGNvbnRlbnQgdG8gb24tY2hpcCBtZW1vcnkgKi8KKwlwdHIgPSAodTggKikmIHBBZC0+QmVhY29uVHhXSTsKKwlmb3IgKGkgPSAwOyBpIDwgVFhXSV9TSVpFOyBpICs9IDQpCS8qIDE2LWJ5dGUgVFhXSSBmaWVsZCAqLworCXsKKwkJdTMyIGxvbmdwdHIgPQorCQkgICAgKnB0ciArICgqKHB0ciArIDEpIDw8IDgpICsgKCoocHRyICsgMikgPDwgMTYpICsKKwkJICAgICgqKHB0ciArIDMpIDw8IDI0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgaSwgbG9uZ3B0cik7CisJCXB0ciArPSA0OworCX0KKworCS8qIHN0YXJ0IHJpZ2h0IGFmdGVyIHRoZSAxNi1ieXRlIFRYV0kgZmllbGQgKi8KKwlwdHIgPSBwQWQtPkJlYWNvbkJ1ZjsKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5CZWFjb25UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudDsgaSArPSA0KSB7CisJCXUzMiBsb25ncHRyID0KKwkJICAgICpwdHIgKyAoKihwdHIgKyAxKSA8PCA4KSArICgqKHB0ciArIDIpIDw8IDE2KSArCisJCSAgICAoKihwdHIgKyAzKSA8PCAyNCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEhXX0JFQUNPTl9CQVNFMCArIFRYV0lfU0laRSArIGksIGxvbmdwdHIpOworCQlwdHIgKz0gNDsKKwl9CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJLyogbW92ZSBCRUFDT04gVFhEIGFuZCBmcmFtZSBjb250ZW50IHRvIG9uLWNoaXAgbWVtb3J5ICovCisJcHRyID0gKHU4ICopJiBwQWQtPkJlYWNvblR4V0k7CisJZm9yIChpID0gMDsgaSA8IFRYV0lfU0laRTsgaSArPSAyKQkvKiAxNi1ieXRlIFRYV0kgZmllbGQgKi8KKwl7CisJCS8qdTMyIGxvbmdwdHIgPSAgKnB0ciArICgqKHB0cisxKTw8OCkgKyAoKihwdHIrMik8PDE2KSArICgqKHB0ciszKTw8MjQpOyAqLworCQkvKlJUTVBfSU9fV1JJVEUzMihwQWQsIEhXX0JFQUNPTl9CQVNFMCArIGksIGxvbmdwdHIpOyAqLworCQlSVFVTQk11bHRpV3JpdGUocEFkLCBIV19CRUFDT05fQkFTRTAgKyBpLCBwdHIsIDIpOworCQlwdHIgKz0gMjsKKwl9CisKKwkvKiBzdGFydCByaWdodCBhZnRlciB0aGUgMTYtYnl0ZSBUWFdJIGZpZWxkICovCisJcHRyID0gcEFkLT5CZWFjb25CdWY7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+QmVhY29uVHhXSS5NUERVdG90YWxCeXRlQ291bnQ7IGkgKz0gMikgeworCQkvKnUzMiBsb25ncHRyID0gICpwdHIgKyAoKihwdHIrMSk8PDgpICsgKCoocHRyKzIpPDwxNikgKyAoKihwdHIrMyk8PDI0KTsgKi8KKwkJLypSVE1QX0lPX1dSSVRFMzIocEFkLCBIV19CRUFDT05fQkFTRTAgKyBUWFdJX1NJWkUgKyBpLCBsb25ncHRyKTsgKi8KKwkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgVFhXSV9TSVpFICsgaSwgcHRyLCAyKTsKKwkJcHRyICs9IDI7CisJfQorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisJLyogKi8KKwkvKiBGb3IgV2ktRmkgZmFpbHkgZ2VuZXJhdGVkIGJlYWNvbnMgYmV0d2VlbiBwYXJ0aWNpcGF0aW5nIHN0YXRpb25zLiAqLworCS8qIFNldCBUQlRUIHBoYXNlIGFkYXB0aXZlIGFkanVzdG1lbnQgc3RlcCB0byA4dXMgKGRlZmF1bHQgMTZ1cykgKi8KKwkvKiBkb24ndCBjaGFuZ2Ugc2V0dGluZ3MgMjAwNi01LSBieSBKZXJyeSAqLworCS8qUlRNUF9JT19XUklURTMyKHBBZCwgVEJUVF9TWU5DX0NGRywgMHgwMDAwMTAxMCk7ICovCisKKwkvKiBzdGFydCBzZW5kaW5nIEJFQUNPTiAqLworCWNzcjkuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgNDsJLyogQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVICovCisJY3NyOS5maWVsZC5iVHNmVGlja2luZyA9IDE7CisJY3NyOS5maWVsZC5Uc2ZTeW5jTW9kZSA9IDI7CS8qIHN5bmMgVFNGIGluIElCU1MgbW9kZSAqLworCWNzcjkuZmllbGQuYlRCVFRFbmFibGUgPSAxOworCWNzcjkuZmllbGQuYkJlYWNvbkdlbiA9IDE7CisJUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3I5LndvcmQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBBc2ljU2V0RWRjYVBhcm0oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfZWRjYV9wYXJtICpwRWRjYVBhcm0pCit7CisJRURDQV9BQ19DRkdfU1RSVUMgQWMwQ2ZnLCBBYzFDZmcsIEFjMkNmZywgQWMzQ2ZnOworCUFDX1RYT1BfQ1NSMF9TVFJVQyBjc3IwOworCUFDX1RYT1BfQ1NSMV9TVFJVQyBjc3IxOworCUFJRlNOX0NTUl9TVFJVQyBBaWZzbkNzcjsKKwlDV01JTl9DU1JfU1RSVUMgQ3dtaW5Dc3I7CisJQ1dNQVhfQ1NSX1NUUlVDIEN3bWF4Q3NyOworCWludCBpOworCisJQWMwQ2ZnLndvcmQgPSAwOworCUFjMUNmZy53b3JkID0gMDsKKwlBYzJDZmcud29yZCA9IDA7CisJQWMzQ2ZnLndvcmQgPSAwOworCWlmICgocEVkY2FQYXJtID09IE5VTEwpIHx8IChwRWRjYVBhcm0tPmJWYWxpZCA9PSBGQUxTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1NldEVkY2FQYXJtXG4iKSk7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykgeworCQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSQorCQkJICAgIHx8IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0FwQ2xpKQorCQkJCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRygmcEFkLT5NYWNUYWIuCisJCQkJCQkJIENvbnRlbnRbaV0sCisJCQkJCQkJIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKwkJfQorCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwkJLyogICAgICBNQUMgUmVnaXN0ZXIgaGFzIGEgY29weSAuICovCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qI2lmbmRlZiBXSUZJX1RFU1QgKi8KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KSB7CisJCQkvKiBGb3IgQ1dDIHRlc3QsIGNoYW5nZSB0eG9wIGZyb20gMHgzMCB0byAweDIwIGluIFR4QnVyc3QgbW9kZSAqLworCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IDB4MjA7CS8qIFN1Z2dlc3QgYnkgSm9obiBmb3IgVHhCdXJzdCBpbiBIVCBNb2RlICovCisJCX0gZWxzZQorCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IDA7CS8qIFFJRF9BQ19CRSAqLworLyojZWxzZSAqLworLyogICAgICAgICAgICAgIEFjMENmZy5maWVsZC5BY1R4b3AgPSAwOyAgICAgICAgLy8gUUlEX0FDX0JFICovCisvKiNlbmRpZiAqLworCQlBYzBDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKKwkJQWMwQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7CisJCUFjMENmZy5maWVsZC5BaWZzbiA9IDI7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgQWMwQ2ZnLndvcmQpOworCisJCUFjMUNmZy5maWVsZC5BY1R4b3AgPSAwOwkvKiBRSURfQUNfQksgKi8KKwkJQWMxQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7CisJCUFjMUNmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOworCQlBYzFDZmcuZmllbGQuQWlmc24gPSAyOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMV9DRkcsIEFjMUNmZy53b3JkKTsKKworCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKSB7CisJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gMTkyOwkvKiBBQ19WSTogMTkyKjMydXMgfj0gNm1zICovCisJCQlBYzNDZmcuZmllbGQuQWNUeG9wID0gOTY7CS8qIEFDX1ZPOiA5NiozMnVzICB+PSAzbXMgKi8KKwkJfSBlbHNlIHsKKwkJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSA5NjsJLyogQUNfVkk6IDk2KjMydXMgfj0gM21zICovCisJCQlBYzNDZmcuZmllbGQuQWNUeG9wID0gNDg7CS8qIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zICovCisJCX0KKwkJQWMyQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7CisJCUFjMkNmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOworCQlBYzJDZmcuZmllbGQuQWlmc24gPSAyOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMl9DRkcsIEFjMkNmZy53b3JkKTsKKwkJQWMzQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7CisJCUFjM0NmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOworCQlBYzNDZmcuZmllbGQuQWlmc24gPSAyOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDM19DRkcsIEFjM0NmZy53b3JkKTsKKworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJCS8qICAgICAgRE1BIFJlZ2lzdGVyIGhhcyBhIGNvcHkgdG9vLiAqLworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJCWNzcjAuZmllbGQuQWMwVHhvcCA9IDA7CS8qIFFJRF9BQ19CRSAqLworCQljc3IwLmZpZWxkLkFjMVR4b3AgPSAwOwkvKiBRSURfQUNfQksgKi8KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikgeworCQkJY3NyMS5maWVsZC5BYzJUeG9wID0gMTkyOwkvKiBBQ19WSTogMTkyKjMydXMgfj0gNm1zICovCisJCQljc3IxLmZpZWxkLkFjM1R4b3AgPSA5NjsJLyogQUNfVk86IDk2KjMydXMgIH49IDNtcyAqLworCQl9IGVsc2UgeworCQkJY3NyMS5maWVsZC5BYzJUeG9wID0gOTY7CS8qIEFDX1ZJOiA5NiozMnVzIH49IDNtcyAqLworCQkJY3NyMS5maWVsZC5BYzNUeG9wID0gNDg7CS8qIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zICovCisJCX0KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AxX0NGRywgY3NyMS53b3JkKTsKKworCQlDd21pbkNzci53b3JkID0gMDsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4wID0gQ1dfTUlOX0lOX0JJVFM7CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMSA9IENXX01JTl9JTl9CSVRTOworCQlDd21pbkNzci5maWVsZC5Dd21pbjIgPSBDV19NSU5fSU5fQklUUzsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4zID0gQ1dfTUlOX0lOX0JJVFM7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9DV01JTl9DRkcsIEN3bWluQ3NyLndvcmQpOworCisJCUN3bWF4Q3NyLndvcmQgPSAwOworCQlDd21heENzci5maWVsZC5Dd21heDAgPSBDV19NQVhfSU5fQklUUzsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgxID0gQ1dfTUFYX0lOX0JJVFM7CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MiA9IENXX01BWF9JTl9CSVRTOworCQlDd21heENzci5maWVsZC5Dd21heDMgPSBDV19NQVhfSU5fQklUUzsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0NXTUFYX0NGRywgQ3dtYXhDc3Iud29yZCk7CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0FJRlNOX0NGRywgMHgwMDAwMjIyMik7CisKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0sIHNpemVvZihzdHJ1Y3QgcnRfZWRjYV9wYXJtKSk7CisJfSBlbHNlIHsKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpOworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJCS8qICAgICAgTUFDIFJlZ2lzdGVyIGhhcyBhIGNvcHkuICovCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwkJLyogKi8KKwkJLyogTW9kaWZ5IEN3bWluL0N3bWF4L1R4b3Agb24gcXVldWVbUUlEX0FDX1ZJXSwgUmVjb21tZW5kIGJ5IEplcnJ5IDIwMDUvMDcvMjcgKi8KKwkJLyogVG8gZGVncmFkZSBvdXIgVklETyBRdWV1ZSdzIHRocm91Z2hwdXQgZm9yIFdpRmkgV01NIFMzVDA3IElzc3VlLiAqLworCQkvKiAqLworCQkvKnBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gKiA3IC8gMTA7IC8vIHJ0Mjg2MGMgbmVlZCB0aGlzICovCisKKwkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdOworCQlBYzBDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV07CisJCUFjMENmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JFXTsKKwkJQWMwQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdOwkvKisxOyAqLworCisJCUFjMUNmZy5maWVsZC5BY1R4b3AgPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JLXTsKKwkJQWMxQ2ZnLmZpZWxkLkN3bWluID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQktdOwkvKisyOyAqLworCQlBYzFDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS107CisJCUFjMUNmZy5maWVsZC5BaWZzbiA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsJLyorMTsgKi8KKworCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gKHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldICogNikgLyAxMDsKKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkgeworCQkJQWMyQ2ZnLmZpZWxkLkN3bWluID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldICsgMTsKKwkJCUFjMkNmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXSArIDE7CisJCX0gZWxzZSB7CisJCQlBYzJDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WSV07CisJCQlBYzJDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WSV07CisJCX0KKwkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldICsgMTsKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldICsgMzsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworCQl7CisJCQkvKiBUdW5pbmcgZm9yIFdpLUZpIFdNTSBTMDYgKi8KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QgJiYKKwkJCSAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCisJCQkJQWMyQ2ZnLmZpZWxkLkFpZnNuIC09IDE7CisKKwkJCS8qIFR1bmluZyBmb3IgVEduIFdpLUZpIDUuMi4zMiAqLworCQkJLyogU1RBIFRlc3RCZWQgY2hhbmdlcyBpbiB0aGlzIGl0ZW06IGNvbmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEgKi8KKwkJCWlmIChTVEFfVEdOX1dJRklfT04ocEFkKSAmJgorCQkJICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkgeworCQkJCUFjMENmZy5maWVsZC5BaWZzbiA9IDM7CisJCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IDU7CisJCQl9CisjaWZkZWYgUlQzMHh4CisJCQlpZiAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjAKKwkJCSAgICB8fCBwQWQtPlJmSWNUeXBlID09IFJGSUNfMjAyMCkgeworCQkJCS8qIFR1bmluZyBmb3IgV2lGaSBXTU0gUzMtVDA3OiBjb25uZXhhbnQgbGVnYWN5IHN0YSA9PT4gYnJvYWRjb20gMTFuIHN0YS4gKi8KKwkJCQlBYzJDZmcuZmllbGQuQWlmc24gPSA1OworCQkJfQorI2VuZGlmIC8qIFJUMzB4eCAvLyAqLworCQl9CisKKwkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVk9dOworCQlBYzNDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WT107CisJCUFjM0NmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZPXTsKKwkJQWMzQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dOworCisvKiNpZmRlZiBXSUZJX1RFU1QgKi8KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCkgeworCQkJaWYgKEFjM0NmZy5maWVsZC5BY1R4b3AgPT0gMTAyKSB7CisJCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9CisJCQkJICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdID8gcEVkY2FQYXJtLT4KKwkJCQkgICAgVHhvcFtRSURfQUNfQkVdIDogMTA7CisJCQkJQWMwQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdIC0gMTsJLyogQUlGU04gbXVzdCA+PSAxICovCisJCQkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9CisJCQkJICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdOworCQkJCUFjMUNmZy5maWVsZC5BaWZzbiA9CisJCQkJICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsKKwkJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0KKwkJCQkgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV07CisJCQl9CS8qIEVuZCBvZiBpZiAqLworCQl9CisvKiNlbmRpZiAvLyBXSUZJX1RFU1QgLy8gKi8KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIEFjMENmZy53b3JkKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzFfQ0ZHLCBBYzFDZmcud29yZCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMyX0NGRywgQWMyQ2ZnLndvcmQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDM19DRkcsIEFjM0NmZy53b3JkKTsKKworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJCS8qICAgICAgRE1BIFJlZ2lzdGVyIGhhcyBhIGNvcHkgdG9vLiAqLworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJCWNzcjAuZmllbGQuQWMwVHhvcCA9IEFjMENmZy5maWVsZC5BY1R4b3A7CisJCWNzcjAuZmllbGQuQWMxVHhvcCA9IEFjMUNmZy5maWVsZC5BY1R4b3A7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMF9DRkcsIGNzcjAud29yZCk7CisKKwkJY3NyMS5maWVsZC5BYzJUeG9wID0gQWMyQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJY3NyMS5maWVsZC5BYzNUeG9wID0gQWMzQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AxX0NGRywgY3NyMS53b3JkKTsKKworCQlDd21pbkNzci53b3JkID0gMDsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4wID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQkVdOworCQlDd21pbkNzci5maWVsZC5Dd21pbjEgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CS107CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMiA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZJXTsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4zID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dIC0gMTsJLypmb3IgVEduIHdpZmkgdGVzdCAqLworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNSU5fQ0ZHLCBDd21pbkNzci53b3JkKTsKKworCQlDd21heENzci53b3JkID0gMDsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgwID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQkVdOworCQlDd21heENzci5maWVsZC5Dd21heDEgPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS107CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MiA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXTsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgzID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNQVhfQ0ZHLCBDd21heENzci53b3JkKTsKKworCQlBaWZzbkNzci53b3JkID0gMDsKKwkJQWlmc25Dc3IuZmllbGQuQWlmc24wID0gQWMwQ2ZnLmZpZWxkLkFpZnNuOwkvKnBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXTsgKi8KKwkJQWlmc25Dc3IuZmllbGQuQWlmc24xID0gQWMxQ2ZnLmZpZWxkLkFpZnNuOwkvKnBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsgKi8KKwkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gQWMyQ2ZnLmZpZWxkLkFpZnNuOwkvKnBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXTsgKi8KKworCQl7CisJCQkvKiBUdW5pbmcgZm9yIFdpLUZpIFdNTSBTMDYgKi8KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QgJiYKKwkJCSAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCisJCQkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gQWMyQ2ZnLmZpZWxkLkFpZnNuIC0gNDsKKworCQkJLyogVHVuaW5nIGZvciBUR24gV2ktRmkgNS4yLjMyICovCisJCQkvKiBTVEEgVGVzdEJlZCBjaGFuZ2VzIGluIHRoaXMgaXRlbTogY29ubmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEgKi8KKwkJCWlmIChTVEFfVEdOX1dJRklfT04ocEFkKSAmJgorCQkJICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkgeworCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMCA9IDM7CisJCQkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gNzsKKwkJCX0KKworCQkJaWYgKElORlJBX09OKHBBZCkpCisJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuCisJCQkJCQkgICAgICAgQ29udGVudFtCU1NJRF9XQ0lEXSwKKwkJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7CisJCX0KKworCQl7CisJCQlBaWZzbkNzci5maWVsZC5BaWZzbjMgPSBBYzNDZmcuZmllbGQuQWlmc24gLSAxOwkvKnBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZPXTsgLy9mb3IgVEduIHdpZmkgdGVzdCAqLworI2lmZGVmIFJUMzB4eAorCQkJLyogVE9ETzogU2hpYW5nLCB0aGlzIG1vZGlmaWNhdGlvbiBhbHNvIHN1aXRhYmxlIGZvciBSVDMwNTIvUlQzMDUwID8/PyAqLworCQkJaWYgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwCisJCQkgICAgfHwgcEFkLT5SZkljVHlwZSA9PSBSRklDXzIwMjApIHsKKwkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjIgPSAweDI7CS8qcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldOyAvL2ZvciBXaUZpIFdNTSBTNC1UMDQuICovCisJCQl9CisjZW5kaWYgLyogUlQzMHh4IC8vICovCisJCX0KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0FJRlNOX0NGRywgQWlmc25Dc3Iud29yZCk7CisKKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0sIHBFZGNhUGFybSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2VkY2FfcGFybSkpOworCQlpZiAoIUFESE9DX09OKHBBZCkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkVEQ0EgWyMlZF06IEFJRlNOIENXbWluIENXbWF4ICBUWE9QKHVzKSAgQUNNXG4iLAorCQkJCSAgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIiAgICAgQUNfQkUgICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKKwkJCQkgIHBFZGNhUGFybS0+QWlmc25bMF0sIHBFZGNhUGFybS0+Q3dtaW5bMF0sCisJCQkJICBwRWRjYVBhcm0tPkN3bWF4WzBdLCBwRWRjYVBhcm0tPlR4b3BbMF0gPDwgNSwKKwkJCQkgIHBFZGNhUGFybS0+YkFDTVswXSkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiICAgICBBQ19CSyAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAorCQkJCSAgcEVkY2FQYXJtLT5BaWZzblsxXSwgcEVkY2FQYXJtLT5Dd21pblsxXSwKKwkJCQkgIHBFZGNhUGFybS0+Q3dtYXhbMV0sIHBFZGNhUGFybS0+VHhvcFsxXSA8PCA1LAorCQkJCSAgcEVkY2FQYXJtLT5iQUNNWzFdKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCIgICAgIEFDX1ZJICAgICAgJTJkICAgICAlMmQgICAgICUyZCAgICAgICU0ZCAgICAgJWRcbiIsCisJCQkJICBwRWRjYVBhcm0tPkFpZnNuWzJdLCBwRWRjYVBhcm0tPkN3bWluWzJdLAorCQkJCSAgcEVkY2FQYXJtLT5Dd21heFsyXSwgcEVkY2FQYXJtLT5UeG9wWzJdIDw8IDUsCisJCQkJICBwRWRjYVBhcm0tPmJBQ01bMl0pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIiAgICAgQUNfVk8gICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKKwkJCQkgIHBFZGNhUGFybS0+QWlmc25bM10sIHBFZGNhUGFybS0+Q3dtaW5bM10sCisJCQkJICBwRWRjYVBhcm0tPkN3bWF4WzNdLCBwRWRjYVBhcm0tPlR4b3BbM10gPDwgNSwKKwkJCQkgIHBFZGNhUGFybS0+YkFDTVszXSkpOworCQl9CisJfQorCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIEFzaWNTZXRTbG90VGltZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYlVzZVNob3J0U2xvdFRpbWUpCit7CisJdW5zaWduZWQgbG9uZyBTbG90VGltZTsKKwl1MzIgUmVnVmFsdWUgPSAwOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOworCisJaWYgKGJVc2VTaG9ydFNsb3RUaW1lCisJICAgICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQpKQorCQlyZXR1cm47CisJZWxzZSBpZiAoKCFiVXNlU2hvcnRTbG90VGltZSkKKwkJICYmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCkpKQorCQlyZXR1cm47CisKKwlpZiAoYlVzZVNob3J0U2xvdFRpbWUpCisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7CisJZWxzZQorCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7CisKKwlTbG90VGltZSA9IChiVXNlU2hvcnRTbG90VGltZSkgPyA5IDogMjA7CisKKwl7CisJCS8qIGZvcmNlIHVzaW5nIHNob3J0IFNMT1QgdGltZSBmb3IgRkFFIHRvIGRlbW8gcGVyZm9ybWFuY2Ugd2hlbiBUeEJ1cnN0IGlzIE9OICovCisJCWlmICgoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKQorCQkgICAgICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpKSkKKwkJICAgIHx8ICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkKKwkJCSYmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID09CisJCQkgICAgQkFfTk9UVVNFKSkKKwkJICAgICkgeworCQkJLyogSW4gdGhpcyBjYXNlLCB3ZSB3aWxsIHRoaW5rIGl0IGlzIGRvaW5nIFdpLUZpIHRlc3QgKi8KKwkJCS8qIEFuZCB3ZSB3aWxsIG5vdCBzZXQgdG8gc2hvcnQgc2xvdCB3aGVuIGJFbmFibGVUeEJ1cnN0IGlzIFRSVUUuICovCisJCX0gZWxzZSBpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpIHsKKwkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7CisJCQlTbG90VGltZSA9IDk7CisJCX0KKwl9CisKKwkvKiAqLworCS8qIEZvciBzb21lIHJlYXNvbnMsIGFsd2F5cyBzZXQgaXQgdG8gc2hvcnQgc2xvdCB0aW1lLiAqLworCS8qICovCisJLyogVG9EbzogU2hvdWxkIGNvbnNpZGVyIGNhcGFiaWxpdHkgd2l0aCAxMUIgKi8KKwkvKiAqLworCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKSB7CisJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7CisJCQlTbG90VGltZSA9IDIwOworCQl9CisJfQorCisJUlRNUF9JT19SRUFEMzIocEFkLCBCS09GRl9TTE9UX0NGRywgJlJlZ1ZhbHVlKTsKKwlSZWdWYWx1ZSA9IFJlZ1ZhbHVlICYgMHhGRkZGRkYwMDsKKworCVJlZ1ZhbHVlIHw9IFNsb3RUaW1lOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgQktPRkZfU0xPVF9DRkcsIFJlZ1ZhbHVlKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQWRkIFNoYXJlZCBrZXkgaW5mb3JtYXRpb24gaW50byBBU0lDLgorCQlVcGRhdGUgc2hhcmVkIGtleSwgVHhNaWMgYW5kIFJ4TWljIHRvIEFzaWMgU2hhcmVkIGtleSB0YWJsZQorCQlVcGRhdGUgaXRzIGNpcGhlckFsZyB0byBBc2ljIFNoYXJlZCBrZXkgTW9kZS4KKworICAgIFJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1OCBCc3NJbmRleCwKKwkJCSAgIHU4IEtleUlkeCwKKwkJCSAgIHU4IENpcGhlckFsZywKKwkJCSAgIHU4ICpwS2V5LCB1OCAqcFR4TWljLCB1OCAqcFJ4TWljKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkJLyosIGNzcjA7ICovCisJU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlpbnQgaTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJBc2ljQWRkU2hhcmVkS2V5RW50cnkgQnNzSW5kZXg9JWQsIEtleUlkeD0lZFxuIiwgQnNzSW5kZXgsCisJCSAgS2V5SWR4KSk7CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQXNpY0FkZFNoYXJlZEtleUVudHJ5OiAlcyBrZXkgIyVkXG4iLCBDaXBoZXJOYW1lW0NpcGhlckFsZ10sCisJCSAgQnNzSW5kZXggKiA0ICsgS2V5SWR4KSk7CisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkgICAgICgiCQlLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkgICAgICBwS2V5WzBdLCBwS2V5WzFdLCBwS2V5WzJdLCBwS2V5WzNdLCBwS2V5WzRdLAorCQkgICAgICBwS2V5WzVdLCBwS2V5WzZdLCBwS2V5WzddLCBwS2V5WzhdLCBwS2V5WzldLAorCQkgICAgICBwS2V5WzEwXSwgcEtleVsxMV0sIHBLZXlbMTJdLCBwS2V5WzEzXSwgcEtleVsxNF0sCisJCSAgICAgIHBLZXlbMTVdKSk7CisJaWYgKHBSeE1pYykgeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkgICAgICgiCQlSeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJICAgICAgcFJ4TWljWzBdLCBwUnhNaWNbMV0sIHBSeE1pY1syXSwgcFJ4TWljWzNdLAorCQkJICAgICAgcFJ4TWljWzRdLCBwUnhNaWNbNV0sIHBSeE1pY1s2XSwgcFJ4TWljWzddKSk7CisJfQorCWlmIChwVHhNaWMpIHsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJICAgICAoIgkJVHggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCSAgICAgIHBUeE1pY1swXSwgcFR4TWljWzFdLCBwVHhNaWNbMl0sIHBUeE1pY1szXSwKKwkJCSAgICAgIHBUeE1pY1s0XSwgcFR4TWljWzVdLCBwVHhNaWNbNl0sIHBUeE1pY1s3XSkpOworCX0KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwkvKiAqLworCS8qIGZpbGwga2V5IG1hdGVyaWFsIC0ga2V5ICsgVFggTUlDICsgUlggTUlDICovCisJLyogKi8KKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlvZmZzZXQgPQorCSAgICBTSEFSRURfS0VZX1RBQkxFX0JBU0UgKyAoNCAqIEJzc0luZGV4ICsgS2V5SWR4KSAqIEhXX0tFWV9FTlRSWV9TSVpFOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX1NIQVJFX0tFWTsgaSsrKSB7CisJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcEtleVtpXSk7CisJfQorCisJb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfU0hBUkVfS0VZOworCWlmIChwVHhNaWMpIHsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwVHhNaWNbaV0pOworCQl9CisJfQorCisJb2Zmc2V0ICs9IDg7CisJaWYgKHBSeE1pYykgeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBSeE1pY1tpXSk7CisJCX0KKwl9CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJeworCQlvZmZzZXQgPQorCQkgICAgU0hBUkVEX0tFWV9UQUJMRV9CQVNFICsgKDQgKiBCc3NJbmRleCArCisJCQkJCSAgICAgS2V5SWR4KSAqIEhXX0tFWV9FTlRSWV9TSVpFOworCQlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsIHBLZXksIE1BWF9MRU5fT0ZfU0hBUkVfS0VZKTsKKworCQlvZmZzZXQgKz0gTUFYX0xFTl9PRl9TSEFSRV9LRVk7CisJCWlmIChwVHhNaWMpIHsKKwkJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcFR4TWljLCA4KTsKKwkJfQorCisJCW9mZnNldCArPSA4OworCQlpZiAocFJ4TWljKSB7CisJCQlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsIHBSeE1pYywgOCk7CisJCX0KKwl9CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisKKwkvKiAqLworCS8qIFVwZGF0ZSBjaXBoZXIgYWxnb3JpdGhtLiBXU1RBIGFsd2F5cyB1c2UgQlNTMCAqLworCS8qICovCisJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQgKiAoQnNzSW5kZXggLyAyKSwKKwkJICAgICAgICZjc3IxLndvcmQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJSZWFkOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gS2V5SWR4WyVkXT0gMHgleCBcbiIsCisJCSAgQnNzSW5kZXgsIEtleUlkeCwgY3NyMS53b3JkKSk7CisJaWYgKChCc3NJbmRleCAlIDIpID09IDApIHsKKwkJaWYgKEtleUlkeCA9PSAwKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJfSBlbHNlIHsKKwkJaWYgKEtleUlkeCA9PSAwKQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQljc3IxLmZpZWxkLkJzczFLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UKKwkJCWNzcjEuZmllbGQuQnNzMUtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJfQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJXcml0ZTogU0hBUkVEX0tFWV9NT0RFX0JBU0UgYXQgdGhpcyBCc3NbJWRdID0gMHgleCBcbiIsCisJCSAgQnNzSW5kZXgsIGNzcjEud29yZCkpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCAqIChCc3NJbmRleCAvIDIpLAorCQkJY3NyMS53b3JkKTsKKworfQorCisvKiAgICAgIElSUUwgPSBESVNQQVRDSF9MRVZFTCAqLwordm9pZCBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTggQnNzSW5kZXgsIHU4IEtleUlkeCkKK3sKKwkvKnVuc2lnbmVkIGxvbmcgU2VjQ3NyMDsgKi8KKwlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeTogIyVkIFxuIiwgQnNzSW5kZXggKiA0ICsgS2V5SWR4KSk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCAqIChCc3NJbmRleCAvIDIpLAorCQkgICAgICAgJmNzcjEud29yZCk7CisJaWYgKChCc3NJbmRleCAlIDIpID09IDApIHsKKwkJaWYgKEtleUlkeCA9PSAwKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IDA7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IDA7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IDA7CisJCWVsc2UKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSAwOworCX0gZWxzZSB7CisJCWlmIChLZXlJZHggPT0gMCkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSAwOworCQllbHNlIGlmIChLZXlJZHggPT0gMSkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTFDaXBoZXJBbGcgPSAwOworCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSAwOworCQllbHNlCisJCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gMDsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIldyaXRlOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gPSAweCV4IFxuIiwKKwkJICBCc3NJbmRleCwgY3NyMS53b3JkKSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UgKyA0ICogKEJzc0luZGV4IC8gMiksCisJCQljc3IxLndvcmQpOworCUFTU0VSVChCc3NJbmRleCA8IDQpOworCUFTU0VSVChLZXlJZHggPCA0KTsKKworfQorCit2b2lkIEFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTE2IFdDSUQsCisJCQkgICAgIHU4IEJzc0luZGV4LAorCQkJICAgICB1OCBDaXBoZXJBbGcsCisJCQkgICAgIElOIEJPT0xFQU4gYlVzZVBhaXJld2lzZUtleVRhYmxlKQoreworCXVuc2lnbmVkIGxvbmcgV0NJREF0dHJpID0gMCwgb2Zmc2V0OworCisJLyogKi8KKwkvKiBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUuICovCisJLyogT25seSBUeEtleSBjb3VsZCB1cGRhdGUgV0NJRCBhdHRyaWJ1dGUuICovCisJLyogKi8KKwlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChXQ0lEICogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwlXQ0lEQXR0cmkgPQorCSAgICAoQnNzSW5kZXggPDwgNCkgfCAoQ2lwaGVyQWxnIDw8IDEpIHwgKGJVc2VQYWlyZXdpc2VLZXlUYWJsZSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOworfQorCit2b2lkIEFzaWNVcGRhdGVXQ0lESVZFSVYoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHUxNiBXQ0lELCB1bnNpZ25lZCBsb25nIHVJViwgdW5zaWduZWQgbG9uZyB1RUlWKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCisJb2Zmc2V0ID0gTUFDX0lWRUlWX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCB1SVYpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCArIDQsIHVFSVYpOworfQorCit2b2lkIEFzaWNVcGRhdGVSeFdDSURUYWJsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1MTYgV0NJRCwgdTggKnBBZGRyKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgQWRkcjsKKworCW9mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyAoV0NJRCAqIEhXX1dDSURfRU5UUllfU0laRSk7CisJQWRkciA9IHBBZGRyWzBdICsgKHBBZGRyWzFdIDw8IDgpICsgKHBBZGRyWzJdIDw8IDE2KSArIChwQWRkclszXSA8PCAyNCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyKTsKKwlBZGRyID0gcEFkZHJbNF0gKyAocEFkZHJbNV0gPDwgOCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgNCwgQWRkcik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQ2lwaGVyIEtleSwgQ2lwaGVyIGFsZ29yaXRobSwgSVYvRUlWIHRvIEFzaWMKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgICBXQ0lEICAgICAgICAgICAgICAgICAgICBXQ0lEIEVudHJ5IG51bWJlci4KKyAgICAgICAgQnNzSW5kZXggICAgICAgICAgICAgICAgQlNTSUQgaW5kZXgsIHN0YXRpb24gb3Igbm9uZSBtdWx0aXBsZSBCU1NJRCBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdmFsdWUgc2hvdWxkIGJlIDAuCisgICAgICAgIEtleUlkeCAgICAgICAgICAgICAgICAgIFRoaXMgS2V5SWR4IHdpbGwgc2V0IHRvIElWJ3MgS2V5SUQgaWYgYlR4S2V5IGVuYWJsZWQKKyAgICAgICAgcENpcGhlcktleSAgICAgICAgICAgICAgUG9pbnRlciB0byBDaXBoZXIgS2V5LgorICAgICAgICBiVXNlUGFpcmV3aXNlS2V5VGFibGUgICBUUlVFIG1lYW5zIHNhdmVkIHRoZSBrZXkgaW4gU2hhcmVkS2V5IHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgUGFpcmV3aXNlS2V5IHRhYmxlCisgICAgICAgIGJUeEtleSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHRyYW5zbWl0IGtleSBpZiBlbmFibGVkLgorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBUaGlzIHJvdXRpbmUgd2lsbCBzZXQgdGhlIHJlbGF0aXZlIGtleSBzdHVmZiB0byBBc2ljIGluY2x1ZGluZyBXQ0lEIGF0dHJpYnV0ZSwKKyAgICAgICAgQ2lwaGVyIEtleSwgQ2lwaGVyIGFsZ29yaXRobSBhbmQgSVYvRUlWLgorCisgICAgICAgIElWL0VJViB3aWxsIGJlIHVwZGF0ZSBpZiB0aGlzIENpcGhlcktleSBpcyB0aGUgdHJhbnNtaXNzaW9uIGtleSBiZWNhdXNlCisgICAgICAgIEFTSUMgd2lsbCBiYXNlIG9uIElWJ3MgS2V5SUQgdmFsdWUgdG8gc2VsZWN0IENpcGhlciBLZXkuCisKKyAgICAgICAgSWYgYlR4S2V5IHNldHMgdG8gRkFMU0UsIHRoaXMgaXMgbm90IHRoZSBUWCBrZXksIGJ1dCBpdCBjb3VsZCBiZQorICAgICAgICBSWCBrZXkKKworCUZvciBBUCBtb2RlIGJUeEtleSBtdXN0IGJlIGFsd2F5cyBzZXQgdG8gVFJVRS4KKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIEFzaWNBZGRLZXlFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgdTE2IFdDSUQsCisJCSAgICAgdTggQnNzSW5kZXgsCisJCSAgICAgdTggS2V5SWR4LAorCQkgICAgIHN0cnVjdCBydF9jaXBoZXJfa2V5ICpwQ2lwaGVyS2V5LAorCQkgICAgIElOIEJPT0xFQU4gYlVzZVBhaXJld2lzZUtleVRhYmxlLCBJTiBCT09MRUFOIGJUeEtleSkKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKy8qICAgICAgdW5zaWduZWQgbG9uZyAgIFdDSURBdHRyaSA9IDA7ICovCisJdTggSVY0ID0gMDsKKwl1OCAqcEtleSA9IHBDaXBoZXJLZXktPktleTsKKy8qICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgS2V5TGVuID0gcENpcGhlcktleS0+S2V5TGVuOyAqLworCXU4ICpwVHhNaWMgPSBwQ2lwaGVyS2V5LT5UeE1pYzsKKwl1OCAqcFJ4TWljID0gcENpcGhlcktleS0+UnhNaWM7CisJdTggKnBUeHRzYyA9IHBDaXBoZXJLZXktPlR4VHNjOworCXU4IENpcGhlckFsZyA9IHBDaXBoZXJLZXktPkNpcGhlckFsZzsKKwlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOworI2lmZGVmIFJUTVBfTUFDX1BDSQorCXU4IGk7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisKKy8qICAgICAgQVNTRVJUKEtleUxlbiA8PSBNQVhfTEVOX09GX1BFRVJfS0VZKTsgKi8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBBc2ljQWRkS2V5RW50cnlcbiIpKTsKKwkvKiAqLworCS8qIDEuKSBkZWNpZGUga2V5IHRhYmxlIG9mZnNldCAqLworCS8qICovCisJaWYgKGJVc2VQYWlyZXdpc2VLZXlUYWJsZSkKKwkJb2Zmc2V0ID0gUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0tFWV9FTlRSWV9TSVpFKTsKKwllbHNlCisJCW9mZnNldCA9CisJCSAgICBTSEFSRURfS0VZX1RBQkxFX0JBU0UgKyAoNCAqIEJzc0luZGV4ICsKKwkJCQkJICAgICBLZXlJZHgpICogSFdfS0VZX0VOVFJZX1NJWkU7CisKKwkvKiAqLworCS8qIDIuKSBTZXQgS2V5IHRvIEFzaWMgKi8KKwkvKiAqLworCS8qZm9yIChpID0gMDsgaSA8IEtleUxlbjsgaSsrKSAqLworI2lmZGVmIFJUTVBfTUFDX1BDSQorCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX1BFRVJfS0VZOyBpKyspIHsKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwS2V5W2ldKTsKKwl9CisJb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfUEVFUl9LRVk7CisKKwkvKiAqLworCS8qIDMuKSBTZXQgTUlDIGtleSBpZiBhdmFpbGFibGUgKi8KKwkvKiAqLworCWlmIChwVHhNaWMpIHsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwVHhNaWNbaV0pOworCQl9CisJfQorCW9mZnNldCArPSBMRU5fVEtJUF9UWE1JQ0s7CisKKwlpZiAocFJ4TWljKSB7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFJ4TWljW2ldKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKwlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsIHBLZXksIE1BWF9MRU5fT0ZfUEVFUl9LRVkpOworCW9mZnNldCArPSBNQVhfTEVOX09GX1BFRVJfS0VZOworCisJLyogKi8KKwkvKiAzLikgU2V0IE1JQyBrZXkgaWYgYXZhaWxhYmxlICovCisJLyogKi8KKwlpZiAocFR4TWljKSB7CisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcFR4TWljLCA4KTsKKwl9CisJb2Zmc2V0ICs9IExFTl9US0lQX1RYTUlDSzsKKworCWlmIChwUnhNaWMpIHsKKwkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCBwUnhNaWMsIDgpOworCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworCS8qICovCisJLyogNC4pIE1vZGlmeSBJVi9FSVYgaWYgbmVlZHMgKi8KKwkvKiAgICAgVGhpcyB3aWxsIGZvcmNlIEFzaWMgdG8gdXNlIHRoaXMga2V5IElEIGJ5IHNldHRpbmcgSVYuICovCisJLyogKi8KKwlpZiAoYlR4S2V5KSB7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJCW9mZnNldCA9IE1BQ19JVkVJVl9UQUJMRV9CQVNFICsgKFdDSUQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKKwkJLyogKi8KKwkJLyogV3JpdGUgSVYgKi8KKwkJLyogKi8KKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQsIHBUeHRzY1sxXSk7CisJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgMSwgKChwVHh0c2NbMV0gfCAweDIwKSAmIDB4N2YpKTsKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyAyLCBwVHh0c2NbMF0pOworCisJCUlWNCA9IChLZXlJZHggPDwgNik7CisJCWlmICgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKQorCQkgICAgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpCisJCSAgICB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKQorCQkJSVY0IHw9IDB4MjA7CS8qIHR1cm4gb24gZXh0ZW5zaW9uIGJpdCBtZWFucyBFSVYgZXhpc3RlbmNlICovCisKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyAzLCBJVjQpOworCisJCS8qICovCisJCS8qIFdyaXRlIEVJViAqLworCQkvKiAqLworCQlvZmZzZXQgKz0gNDsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwVHh0c2NbaSArIDJdKTsKKwkJfQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQl1MzIgdG1wVmFsOworCisJCS8qICovCisJCS8qIFdyaXRlIElWICovCisJCS8qICovCisJCUlWNCA9IChLZXlJZHggPDwgNik7CisJCWlmICgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKQorCQkgICAgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpCisJCSAgICB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKQorCQkJSVY0IHw9IDB4MjA7CS8qIHR1cm4gb24gZXh0ZW5zaW9uIGJpdCBtZWFucyBFSVYgZXhpc3RlbmNlICovCisKKwkJdG1wVmFsID0KKwkJICAgIHBUeHRzY1sxXSArICgoKHBUeHRzY1sxXSB8IDB4MjApICYgMHg3ZikgPDwgOCkgKworCQkgICAgKHBUeHRzY1swXSA8PCAxNikgKyAoSVY0IDw8IDI0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCB0bXBWYWwpOworCisJCS8qICovCisJCS8qIFdyaXRlIEVJViAqLworCQkvKiAqLworCQlvZmZzZXQgKz0gNDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCAqKHUzMiAqKSYgcENpcGhlcktleS0+VHhUc2NbMl0pOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisJCUFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKHBBZCwgV0NJRCwgQnNzSW5kZXgsIENpcGhlckFsZywKKwkJCQkJYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKKwl9CisKKwlpZiAoIWJVc2VQYWlyZXdpc2VLZXlUYWJsZSkgeworCQkvKiAqLworCQkvKiBPbmx5IHVwZGF0ZSB0aGUgc2hhcmVkIGtleSBzZWN1cml0eSBtb2RlICovCisJCS8qICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UgKyA0ICogKEJzc0luZGV4IC8gMiksCisJCQkgICAgICAgJmNzcjEud29yZCk7CisJCWlmICgoQnNzSW5kZXggJSAyKSA9PSAwKSB7CisJCQlpZiAoS2V5SWR4ID09IDApCisJCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZQorCQkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCX0gZWxzZSB7CisJCQlpZiAoS2V5SWR4ID09IDApCisJCQkJY3NyMS5maWVsZC5Cc3MxS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJCWNzcjEuZmllbGQuQnNzMUtleTFDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCQljc3IxLmZpZWxkLkJzczFLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZQorCQkJCWNzcjEuZmllbGQuQnNzMUtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCX0KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UgKyA0ICogKEJzc0luZGV4IC8gMiksCisJCQkJY3NyMS53b3JkKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gQXNpY0FkZEtleUVudHJ5XG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUFkZCBQYWlyLXdpc2Uga2V5IG1hdGVyaWFsIGludG8gQVNJQy4KKwkJVXBkYXRlIHBhaXJ3aXNlIGtleSwgVHhNaWMgYW5kIFJ4TWljIHRvIEFzaWMgUGFpci13aXNlIGtleSB0YWJsZQorCisgICAgUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1OCAqcEFkZHIsCisJCQkgICAgIHU4IFdDSUQsIHN0cnVjdCBydF9jaXBoZXJfa2V5ICpwQ2lwaGVyS2V5KQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXU4ICpwS2V5ID0gcENpcGhlcktleS0+S2V5OworCXU4ICpwVHhNaWMgPSBwQ2lwaGVyS2V5LT5UeE1pYzsKKwl1OCAqcFJ4TWljID0gcENpcGhlcktleS0+UnhNaWM7CisjaWZkZWYgREJHCisJdTggQ2lwaGVyQWxnID0gcENpcGhlcktleS0+Q2lwaGVyQWxnOworI2VuZGlmIC8qIERCRyAvLyAqLworCisJLyogRUtFWSAqLworCW9mZnNldCA9IFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICsgKFdDSUQgKiBIV19LRVlfRU5UUllfU0laRSk7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfUEVFUl9LRVk7IGkrKykgeworCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBLZXlbaV0pOworCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKwlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsICZwQ2lwaGVyS2V5LT5LZXlbMF0sIE1BWF9MRU5fT0ZfUEVFUl9LRVkpOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX1BFRVJfS0VZOyBpICs9IDQpIHsKKwkJdTMyIFZhbHVlOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIG9mZnNldCArIGksICZWYWx1ZSk7CisJfQorCisJb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfUEVFUl9LRVk7CisKKwkvKiAgTUlDIEtFWSAqLworCWlmIChwVHhNaWMpIHsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwVHhNaWNbaV0pOworCQl9CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgJnBDaXBoZXJLZXktPlR4TWljWzBdLCA4KTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKwl9CisJb2Zmc2V0ICs9IDg7CisJaWYgKHBSeE1pYykgeworI2lmZGVmIFJUTVBfTUFDX1BDSQorCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBSeE1pY1tpXSk7CisJCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCAmcENpcGhlcktleS0+UnhNaWNbMF0sIDgpOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJBc2ljQWRkUGFpcndpc2VLZXlFbnRyeTogV0NJRCAjJWQgQWxnPSVzXG4iLCBXQ0lELAorCQkgIENpcGhlck5hbWVbQ2lwaGVyQWxnXSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCIJS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJICBwS2V5WzBdLCBwS2V5WzFdLCBwS2V5WzJdLCBwS2V5WzNdLCBwS2V5WzRdLCBwS2V5WzVdLAorCQkgIHBLZXlbNl0sIHBLZXlbN10sIHBLZXlbOF0sIHBLZXlbOV0sIHBLZXlbMTBdLCBwS2V5WzExXSwKKwkJICBwS2V5WzEyXSwgcEtleVsxM10sIHBLZXlbMTRdLCBwS2V5WzE1XSkpOworCWlmIChwUnhNaWMpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIJUnggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCSAgcFJ4TWljWzBdLCBwUnhNaWNbMV0sIHBSeE1pY1syXSwgcFJ4TWljWzNdLAorCQkJICBwUnhNaWNbNF0sIHBSeE1pY1s1XSwgcFJ4TWljWzZdLCBwUnhNaWNbN10pKTsKKwl9CisJaWYgKHBUeE1pYykgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIglUeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJICBwVHhNaWNbMF0sIHBUeE1pY1sxXSwgcFR4TWljWzJdLCBwVHhNaWNbM10sCisJCQkgIHBUeE1pY1s0XSwgcFR4TWljWzVdLCBwVHhNaWNbNl0sIHBUeE1pY1s3XSkpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUmVtb3ZlIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgZnJvbSBBU0lDLgorCisgICAgUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCXU4IEJzc0lkeCwgdTggV2NpZCkKK3sKKwl1bnNpZ25lZCBsb25nIFdDSURBdHRyaTsKKwl1MTYgb2Zmc2V0OworCisJLyogcmUtc2V0IHRoZSBlbnRyeSdzIFdDSUQgYXR0cmlidXRlIGFzIE9QRU4tTk9ORS4gKi8KKwlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChXY2lkICogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwlXQ0lEQXR0cmkgPSAoQnNzSWR4IDw8IDQpIHwgUEFJUldJU0VLRVlUQUJMRTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Cit9CisKK0JPT0xFQU4gQXNpY1NlbmRDb21tYW5kVG9NY3Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1OCBDb21tYW5kLAorCQkJICAgICB1OCBUb2tlbiwgdTggQXJnMCwgdTggQXJnMSkKK3sKKworCWlmIChwQWQtPmNoaXBPcHMuc2VuZENvbW1hbmRUb01jdSkKKwkJcEFkLT5jaGlwT3BzLnNlbmRDb21tYW5kVG9NY3UocEFkLCBDb21tYW5kLCBUb2tlbiwgQXJnMCwgQXJnMSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKwordm9pZCBBc2ljU2V0UnhBbnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBBbnQpCit7CisjaWZkZWYgUlQzMHh4CisJLyogUlQzNTcyIEFURSBuZWVkIG5vdCB0byBkbyB0aGlzLiAqLworCVJUMzB4eFNldFJ4QW50KHBBZCwgQW50KTsKKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KK30KKwordm9pZCBBc2ljVHVybk9mZlJGQ2xrKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQ2hhbm5lbCkKK3sKKwlpZiAocEFkLT5jaGlwT3BzLkFzaWNSZlR1cm5PZmYpIHsKKwkJcEFkLT5jaGlwT3BzLkFzaWNSZlR1cm5PZmYocEFkKTsKKwl9IGVsc2UgeworCQkvKiBSRiBSMiBiaXQgMTggPSAwICovCisJCXUzMiBSMSA9IDAsIFIyID0gMCwgUjMgPSAwOworCQl1OCBpbmRleDsKKwkJc3RydWN0IHJ0X3J0bXBfcmZfcmVncyAqUkZSZWdUYWJsZTsKKworCQlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7CisKKwkJc3dpdGNoIChwQWQtPlJmSWNUeXBlKSB7CisJCWNhc2UgUkZJQ18yODIwOgorCQljYXNlIFJGSUNfMjg1MDoKKwkJY2FzZSBSRklDXzI3MjA6CisJCWNhc2UgUkZJQ18yNzUwOgorCisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKSB7CisJCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkgeworCQkJCQlSMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxICYgMHhmZmZmZGZmZjsKKwkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMiAmIDB4ZmZmYmZmZmY7CisJCQkJCVIzID0gUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZjNmZmZmOworCisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjIpOworCisJCQkJCS8qIFByb2dyYW0gUjFiMTMgdG8gMSwgUjMvYjE4LDE5IHRvIDAsIFIyYjE4IHRvIDAuICovCisJCQkJCS8qIFNldCBSRiBSMiBiaXQxOD0wLCBSMyBiaXRbMTg6MTldPTAgKi8KKwkJCQkJLyppZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKSAqLworCQkJCQlpZiAoMSkgeworCQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjMpOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkgKCJBc2ljVHVybk9mZlJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4LCAgUjMgPSAweCUwOHggXG4iLAorCQkJCQkJCSAgQ2hhbm5lbCwKKwkJCQkJCQkgIHBBZC0+UmZJY1R5cGUsIFIyLAorCQkJCQkJCSAgUjMpKTsKKwkJCQkJfSBlbHNlCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkgKCJBc2ljVHVybk9mZlJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4IFxuIiwKKwkJCQkJCQkgIENoYW5uZWwsCisJCQkJCQkJICBwQWQtPlJmSWNUeXBlLCBSMikpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3ZvaWQgQXNpY1R1cm5PblJGQ2xrKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQ2hhbm5lbCkKK3sKKwkvKiBSRiBSMiBiaXQgMTggPSAwICovCisJdTMyIFIxID0gMCwgUjIgPSAwLCBSMyA9IDA7CisJdTggaW5kZXg7CisJc3RydWN0IHJ0X3J0bXBfcmZfcmVncyAqUkZSZWdUYWJsZTsKKworI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAorCS8qIFRoZSBSRiBwcm9ncmFtbWluZyBzZXF1ZW5jZSBpcyBkaWZmZXJlbmNlIGJldHdlZW4gM3h4eCBhbmQgMnh4eCAqLworCWlmICgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpKSB7CisJCXJldHVybjsKKwl9CisjZW5kaWYgLyogUENJRV9QU19TVVBQT1JUIC8vICovCisKKwlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7CisKKwlzd2l0Y2ggKHBBZC0+UmZJY1R5cGUpIHsKKwljYXNlIFJGSUNfMjgyMDoKKwljYXNlIFJGSUNfMjg1MDoKKwljYXNlIFJGSUNfMjcyMDoKKwljYXNlIFJGSUNfMjc1MDoKKworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKSB7CisJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKSB7CisJCQkJUjMgPSBwQWQtPkxhdGNoUmZSZWdzLlIzOworCQkJCVIzICY9IDB4ZmZmM2ZmZmY7CisJCQkJUjMgfD0gMHgwMDA4MDAwMDsKKwkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMyk7CisKKwkJCQlSMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxOworCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKKworCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjI7CisJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkgeworCQkJCQlSMiB8PSAweDQwMDA7CS8qIElmIFRYcGF0aCBpcyAxLCBiaXQgMTQgPSAxOyAqLworCQkJCX0KKworCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpIHsKKwkJCQkJUjIgfD0gMHg0MDsJLyogd3JpdGUgMSB0byBvZmYgUnhwYXRoLiAqLworCQkJCX0gZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKSB7CisJCQkJCVIyIHw9IDB4MjAwNDA7CS8qIHdyaXRlIDEgdG8gb2ZmIFJ4UGF0aCAqLworCQkJCX0KKwkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMik7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNUdXJuT25SRkNsayMlZChSRj0lZCwgKSAsIFIyPTB4JTA4eFxuIiwKKwkJCQkgIENoYW5uZWwsIHBBZC0+UmZJY1R5cGUsIFIyKSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fY2ZnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fY2ZnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRmNDM5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9jZmcuYwpAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKwljbW1fY2ZnLmMKKworICAgIEFic3RyYWN0OgorICAgIFJhbGluayBXaUZpIERyaXZlciBjb25maWd1cmF0aW9uIHJlbGF0ZWQgc3Vicm91dGluZXMKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworY2hhciAqR2V0UGh5TW9kZShpbnQgTW9kZSkKK3sKKwlzd2l0Y2ggKE1vZGUpIHsKKwljYXNlIE1PREVfQ0NLOgorCQlyZXR1cm4gIkNDSyI7CisKKwljYXNlIE1PREVfT0ZETToKKwkJcmV0dXJuICJPRkRNIjsKKwljYXNlIE1PREVfSFRNSVg6CisJCXJldHVybiAiSFRNSVgiOworCisJY2FzZSBNT0RFX0hUR1JFRU5GSUVMRDoKKwkJcmV0dXJuICJHUkVFTiI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJOL0EiOworCX0KK30KKworY2hhciAqR2V0QlcoaW50IEJXKQoreworCXN3aXRjaCAoQlcpIHsKKwljYXNlIEJXXzEwOgorCQlyZXR1cm4gIjEwTSI7CisKKwljYXNlIEJXXzIwOgorCQlyZXR1cm4gIjIwTSI7CisJY2FzZSBCV180MDoKKwkJcmV0dXJuICI0ME0iOworCWRlZmF1bHQ6CisJCXJldHVybiAiTi9BIjsKKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IENvdW50cnkgUmVnaW9uIHRvIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24uCisgICAgICAgIFRoaXMgY29tbWFuZCB3aWxsIG5vdCB3b3JrLCBpZiB0aGUgZmllbGQgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZC4KKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJUX0NmZ1NldENvdW50cnlSZWdpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyICphcmcsIGludCBiYW5kKQoreworCWxvbmcgcmVnaW9uLCByZWdpb25NYXg7CisJdTggKnBDb3VudHJ5UmVnaW9uOworCisJcmVnaW9uID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChiYW5kID09IEJBTkRfMjRHKSB7CisJCXBDb3VudHJ5UmVnaW9uID0gJnBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb247CisJCXJlZ2lvbk1heCA9IFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQ7CisJfSBlbHNlIHsKKwkJcENvdW50cnlSZWdpb24gPSAmcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kOworCQlyZWdpb25NYXggPSBSRUdJT05fTUFYSU1VTV9BX0JBTkQ7CisJfQorCisJLyogVE9ETzogSXMgaXQgbmVjY2VzYXkgZm9yIGZvbGxvd2luZyBjaGVjaz8/PyAqLworCS8qIENvdW50cnkgY2FuIGJlIHNldCBvbmx5IHdoZW4gRUVQUk9NIG5vdCBwcm9ncmFtbWVkICovCisJaWYgKCpwQ291bnRyeVJlZ2lvbiAmIDB4ODApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJDZmdTZXRDb3VudHJ5UmVnaW9uKCk6Q291bnRyeVJlZ2lvbiBpbiBlZXByb20gd2FzIHByb2dyYW1tZWRcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmICgocmVnaW9uID49IDApICYmIChyZWdpb24gPD0gUkVHSU9OX01BWElNVU1fQkdfQkFORCkpIHsKKwkJKnBDb3VudHJ5UmVnaW9uID0gKHU4KXJlZ2lvbjsKKwl9IGVsc2UgaWYgKChyZWdpb24gPT0gUkVHSU9OXzMxX0JHX0JBTkQpICYmIChiYW5kID09IEJBTkRfMjRHKSkgeworCQkqcENvdW50cnlSZWdpb24gPSAodTgpcmVnaW9uOworCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiQ2ZnU2V0Q291bnRyeVJlZ2lvbigpOnJlZ2lvbiglbGQpIG91dCBvZiByYW5nZSFcbiIsCisJCQkgIHJlZ2lvbikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcmV0dXJuIFRSVUU7CisKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV2lyZWxlc3MgTW9kZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJUX0NmZ1NldFdpcmVsZXNzTW9kZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGNoYXIgKmFyZykKK3sKKwlpbnQgTWF4UGh5TW9kZSA9IFBIWV8xMUc7CisJbG9uZyBXaXJlbGVzc01vZGU7CisKKwlNYXhQaHlNb2RlID0gUEhZXzExTl81RzsKKworCVdpcmVsZXNzTW9kZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFdpcmVsZXNzTW9kZSA8PSBNYXhQaHlNb2RlKSB7CisJCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSBXaXJlbGVzc01vZGU7CisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKKworfQorCitpbnQgUlRfQ2ZnU2V0U2hvcnRTbG90KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgY2hhciAqYXJnKQoreworCWxvbmcgU2hvcnRTbG90OworCisJU2hvcnRTbG90ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChTaG9ydFNsb3QgPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOworCWVsc2UgaWYgKFNob3J0U2xvdCA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOwkvKkludmFsaWQgYXJndW1lbnQgKi8KKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZIGJhc2Ugb24gS2V5SWR4CisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgUlRfQ2ZnU2V0V2VwS2V5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgIGNoYXIgKmtleVN0cmluZywKKwkJICAgIHN0cnVjdCBydF9jaXBoZXJfa2V5ICpwU2hhcmVkS2V5LCBpbnQga2V5SWR4KQoreworCWludCBLZXlMZW47CisJaW50IGk7CisJdTggQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJQk9PTEVBTiBiS2V5SXNIZXggPSBGQUxTRTsKKworCS8qIFRPRE86IFNoYWxsIHdlIGRvIG1lbXNldCBmb3IgdGhlIG9yaWdpbmFsIGtleSBpbmZvPz8gKi8KKwltZW1zZXQocFNoYXJlZEtleSwgMCwgc2l6ZW9mKHN0cnVjdCBydF9jaXBoZXJfa2V5KSk7CisJS2V5TGVuID0gc3RybGVuKGtleVN0cmluZyk7CisJc3dpdGNoIChLZXlMZW4pIHsKKwljYXNlIDU6CQkvKndlcCA0MCBBc2NpaSB0eXBlICovCisJY2FzZSAxMzoJCS8qd2VwIDEwNCBBc2NpaSB0eXBlICovCisJCWJLZXlJc0hleCA9IEZBTFNFOworCQlwU2hhcmVkS2V5LT5LZXlMZW4gPSBLZXlMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPktleSwga2V5U3RyaW5nLCBLZXlMZW4pOworCQlicmVhazsKKworCWNhc2UgMTA6CQkvKndlcCA0MCBIZXggdHlwZSAqLworCWNhc2UgMjY6CQkvKndlcCAxMDQgSGV4IHR5cGUgKi8KKwkJZm9yIChpID0gMDsgaSA8IEtleUxlbjsgaSsrKSB7CisJCQlpZiAoIWlzeGRpZ2l0KCooa2V5U3RyaW5nICsgaSkpKQorCQkJCXJldHVybiBGQUxTRTsJLypOb3QgSGV4IHZhbHVlOyAqLworCQl9CisJCWJLZXlJc0hleCA9IFRSVUU7CisJCXBTaGFyZWRLZXktPktleUxlbiA9IEtleUxlbiAvIDI7CisJCUF0b0goa2V5U3RyaW5nLCBwU2hhcmVkS2V5LT5LZXksIHBTaGFyZWRLZXktPktleUxlbik7CisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8qSW52YWxpZCBhcmd1bWVudCAqLworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJUX0NmZ1NldFdlcEtleShrZXlJZHg9JWQpOkludmFsaWQgYXJndW1lbnQgKGFyZz0lcylcbiIsCisJCQkgIGtleUlkeCwga2V5U3RyaW5nKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSAoKEtleUxlbiAlIDUpID8gQ0lQSEVSX1dFUDEyOCA6IENJUEhFUl9XRVA2NCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlJUX0NmZ1NldFdlcEtleTooS2V5SWR4PSVkLHR5cGU9JXMsIEFsZz0lcylcbiIsIGtleUlkeCwKKwkJICAoYktleUlzSGV4ID09IEZBTFNFID8gIkFzY2lpIiA6ICJIZXgiKSwKKwkJICBDaXBoZXJOYW1lW0NpcGhlckFsZ10pKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXUEEgUFNLIGtleQorCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWRhcHRlcglQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIGtleVN0cmluZwlXUEEgcHJlLXNoYXJlZCBrZXkgc3RyaW5nCisgICAgICAgIHBIYXNoU3RyCVN0cmluZyB1c2VkIGZvciBwYXNzd29yZCBoYXNoIGZ1bmN0aW9uCisgICAgICAgIGhhc2hTdHJMZW4JTGVuZ2h0IG9mIHRoZSBoYXNoIHN0cmluZworICAgICAgICBwUE1LQnVmCQlPdXRwdXQgYnVmZmVyIG9mIFdQQVBTSyBrZXkKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJUX0NmZ1NldFdQQVBTS0tleShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICBjaGFyICprZXlTdHJpbmcsCisJCSAgICAgICB1OCAqIHBIYXNoU3RyLAorCQkgICAgICAgaW50IGhhc2hTdHJMZW4sIHU4ICpwUE1LQnVmKQoreworCWludCBrZXlMZW47CisJdTgga2V5TWF0ZXJpYWxbNDBdOworCisJa2V5TGVuID0gc3RybGVuKGtleVN0cmluZyk7CisJaWYgKChrZXlMZW4gPCA4KSB8fCAoa2V5TGVuID4gNjQpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiV1BBUFNLIEtleSBsZW5ndGgoJWQpIGVycm9yLCByZXF1aXJlZCA4IH4gNjQgY2hhcmFjdGVycyEoa2V5U3RyPSVzKVxuIiwKKwkJCSAga2V5TGVuLCBrZXlTdHJpbmcpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCW1lbXNldChwUE1LQnVmLCAwLCAzMik7CisJaWYgKGtleUxlbiA9PSA2NCkgeworCQlBdG9IKGtleVN0cmluZywgcFBNS0J1ZiwgMzIpOworCX0gZWxzZSB7CisJCVBhc3N3b3JkSGFzaChrZXlTdHJpbmcsIHBIYXNoU3RyLCBoYXNoU3RyTGVuLCBrZXlNYXRlcmlhbCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBQTUtCdWYsIGtleU1hdGVyaWFsLCAzMik7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGEuYwppbmRleCA3NzRmYWJiLi42ODI2M2NlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhLmMKQEAgLTI3LDUwICsyNyw1OCBAQAogCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKLSNkZWZpbmUgTUFYX1RYX0lOX1RCVFQJCSgxNikKK3U4IFNOQVBfODAyXzFIW10gPSB7IDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAgfTsKK3U4IFNOQVBfQlJJREdFX1RVTk5FTFtdID0geyAweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweGY4IH07CiAKKy8qIEFkZCBDaXNjbyBBaXJvbmV0IFNOQVAgaGVhZGUgZm9yIENDWDIgc3VwcG9ydCAqLwordTggU05BUF9BSVJPTkVUW10gPSB7IDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDAgfTsKK3U4IENLSVBfTExDX1NOQVBbXSA9IHsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMiB9OwordTggRUFQT0xfTExDX1NOQVBbXSA9IHsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4ZSB9OwordTggRUFQT0xbXSA9IHsgMHg4OCwgMHg4ZSB9OwordTggVFBJRFtdID0geyAweDgxLCAweDAwIH07CS8qIFZMQU4gcmVsYXRlZCAqLwogCi1VQ0hBUglTTkFQXzgwMl8xSFtdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OwotVUNIQVIJU05BUF9CUklER0VfVFVOTkVMW10gPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHhmOH07Ci0vLyBBZGQgQ2lzY28gQWlyb25ldCBTTkFQIGhlYWRlIGZvciBDQ1gyIHN1cHBvcnQKLVVDSEFSCVNOQVBfQUlST05FVFtdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDB9OwotVUNIQVIJQ0tJUF9MTENfU05BUFtdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDJ9OwotVUNIQVIJRUFQT0xfTExDX1NOQVBbXT0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4OGV9OwotVUNIQVIJRUFQT0xbXSA9IHsweDg4LCAweDhlfTsKLVVDSEFSICAgVFBJRFtdID0gezB4ODEsIDB4MDB9OyAvKiBWTEFOIHJlbGF0ZWQgKi8KK3U4IElQWFtdID0geyAweDgxLCAweDM3IH07Cit1OCBBUFBMRV9UQUxLW10gPSB7IDB4ODAsIDB4ZjMgfTsKIAotVUNIQVIJSVBYW10gPSB7MHg4MSwgMHgzN307Ci1VQ0hBUglBUFBMRV9UQUxLW10gPSB7MHg4MCwgMHhmM307Ci1VQ0hBUglSYXRlSWRUb1BsY3BTaWduYWxbMTJdID0gewotCSAwLCAvKiBSQVRFXzEgKi8JMSwgLyogUkFURV8yICovIAkyLCAvKiBSQVRFXzVfNSAqLwkzLCAvKiBSQVRFXzExICovCS8vIHNlZSBCQlAgc3BlYwotCTExLCAvKiBSQVRFXzYgKi8gICAxNSwgLyogUkFURV85ICovICAgIDEwLCAvKiBSQVRFXzEyICovICAgMTQsIC8qIFJBVEVfMTggKi8JLy8gc2VlIElFRUU4MDIuMTFhLTE5OTkgcC4xNAotCSA5LCAvKiBSQVRFXzI0ICovICAxMywgLyogUkFURV8zNiAqLwk4LCAvKiBSQVRFXzQ4ICovICAgMTIgIC8qIFJBVEVfNTQgKi8gfTsgLy8gc2VlIElFRUU4MDIuMTFhLTE5OTkgcC4xNAordTggUmF0ZUlkVG9QbGNwU2lnbmFsWzEyXSA9IHsKKwkwLCAvKiBSQVRFXzEgKi8gMSwgLyogUkFURV8yICovIDIsIC8qIFJBVEVfNV81ICovIDMsCS8qIFJBVEVfMTEgKi8vKiBzZWUgQkJQIHNwZWMgKi8KKwkxMSwgLyogUkFURV82ICovIDE1LCAvKiBSQVRFXzkgKi8gMTAsIC8qIFJBVEVfMTIgKi8gMTQsCS8qIFJBVEVfMTggKi8vKiBzZWUgSUVFRTgwMi4xMWEtMTk5OSBwLjE0ICovCisJOSwgLyogUkFURV8yNCAqLyAxMywgLyogUkFURV8zNiAqLyA4LCAvKiBSQVRFXzQ4ICovIDEyIC8qIFJBVEVfNTQgKi8KK307CQkJCS8qIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQgKi8KIAotVUNIQVIJIE9mZG1TaWduYWxUb1JhdGVJZFsxNl0gPSB7Ci0JUkFURV81NCwgIFJBVEVfNTQsCVJBVEVfNTQsICBSQVRFXzU0LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gMCwgIDEsICAyLCAgMyByZXNwZWN0aXZlbHkKLQlSQVRFXzU0LCAgUkFURV81NCwJUkFURV81NCwgIFJBVEVfNTQsCS8vIE9GRE0gUExDUCBTaWduYWwgPSA0LCAgNSwgIDYsICA3IHJlc3BlY3RpdmVseQotCVJBVEVfNDgsICBSQVRFXzI0LAlSQVRFXzEyLCAgUkFURV82LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gOCwgIDksICAxMCwgMTEgcmVzcGVjdGl2ZWx5Ci0JUkFURV81NCwgIFJBVEVfMzYsCVJBVEVfMTgsICBSQVRFXzksCS8vIE9GRE0gUExDUCBTaWduYWwgPSAxMiwgMTMsIDE0LCAxNSByZXNwZWN0aXZlbHkKK3U4IE9mZG1TaWduYWxUb1JhdGVJZFsxNl0gPSB7CisJUkFURV81NCwgUkFURV81NCwgUkFURV81NCwgUkFURV81NCwJLyogT0ZETSBQTENQIFNpZ25hbCA9IDAsICAxLCAgMiwgIDMgcmVzcGVjdGl2ZWx5ICovCisJUkFURV81NCwgUkFURV81NCwgUkFURV81NCwgUkFURV81NCwJLyogT0ZETSBQTENQIFNpZ25hbCA9IDQsICA1LCAgNiwgIDcgcmVzcGVjdGl2ZWx5ICovCisJUkFURV80OCwgUkFURV8yNCwgUkFURV8xMiwgUkFURV82LAkvKiBPRkRNIFBMQ1AgU2lnbmFsID0gOCwgIDksICAxMCwgMTEgcmVzcGVjdGl2ZWx5ICovCisJUkFURV81NCwgUkFURV8zNiwgUkFURV8xOCwgUkFURV85LAkvKiBPRkRNIFBMQ1AgU2lnbmFsID0gMTIsIDEzLCAxNCwgMTUgcmVzcGVjdGl2ZWx5ICovCiB9OwogCi1VQ0hBUgkgT2ZkbVJhdGVUb1J4d2lNQ1NbMTJdID0gewotCTAsICAwLAkwLCAgMCwKLQkwLCAgMSwJMiwgIDMsCS8vIE9GRE0gcmF0ZSA2LDksMTIsMTggPSByeHdpIG1jcyAwLDEsMiwzCi0JNCwgIDUsCTYsICA3LAkvLyBPRkRNIHJhdGUgMjQsMzYsNDgsNTQgPSByeHdpIG1jcyA0LDUsNiw3Ci19OwotVUNIQVIJIFJ4d2lNQ1NUb09mZG1SYXRlWzEyXSA9IHsKLQlSQVRFXzYsICBSQVRFXzksCVJBVEVfMTIsICBSQVRFXzE4LAotCVJBVEVfMjQsICBSQVRFXzM2LAlSQVRFXzQ4LCAgUkFURV81NCwJLy8gT0ZETSByYXRlIDYsOSwxMiwxOCA9IHJ4d2kgbWNzIDAsMSwyLDMKLQk0LCAgNSwJNiwgIDcsCS8vIE9GRE0gcmF0ZSAyNCwzNiw0OCw1NCA9IHJ4d2kgbWNzIDQsNSw2LDcKK3U4IE9mZG1SYXRlVG9SeHdpTUNTWzEyXSA9IHsKKwkwLCAwLCAwLCAwLAorCTAsIDEsIDIsIDMsCQkvKiBPRkRNIHJhdGUgNiw5LDEyLDE4ID0gcnh3aSBtY3MgMCwxLDIsMyAqLworCTQsIDUsIDYsIDcsCQkvKiBPRkRNIHJhdGUgMjQsMzYsNDgsNTQgPSByeHdpIG1jcyA0LDUsNiw3ICovCiB9OwogCi1jaGFyKiAgIE1DU1RvTWJwc1tdID0geyIxTWJwcyIsIjJNYnBzIiwiNS41TWJwcyIsIjExTWJwcyIsIjA2TWJwcyIsIjA5TWJwcyIsIjEyTWJwcyIsIjE4TWJwcyIsIjI0TWJwcyIsIjM2TWJwcyIsIjQ4TWJwcyIsIjU0TWJwcyIsIk1NLTAiLCJNTS0xIiwiTU0tMiIsIk1NLTMiLCJNTS00IiwiTU0tNSIsIk1NLTYiLCJNTS03IiwiTU0tOCIsIk1NLTkiLCJNTS0xMCIsIk1NLTExIiwiTU0tMTIiLCJNTS0xMyIsIk1NLTE0IiwiTU0tMTUiLCJNTS0zMiIsImVlMSIsImVlMiIsImVlMyJ9OwordTggUnh3aU1DU1RvT2ZkbVJhdGVbMTJdID0geworCVJBVEVfNiwgUkFURV85LCBSQVRFXzEyLCBSQVRFXzE4LAorCVJBVEVfMjQsIFJBVEVfMzYsIFJBVEVfNDgsIFJBVEVfNTQsCS8qIE9GRE0gcmF0ZSA2LDksMTIsMTggPSByeHdpIG1jcyAwLDEsMiwzICovCisJNCwgNSwgNiwgNywJCS8qIE9GRE0gcmF0ZSAyNCwzNiw0OCw1NCA9IHJ4d2kgbWNzIDQsNSw2LDcgKi8KK307CiAKLVVDSEFSIGRlZmF1bHRfY3dtaW5bXT17Q1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLCBDV19NSU5fSU5fQklUUy0xLCBDV19NSU5fSU5fQklUUy0yfTsKLVVDSEFSIGRlZmF1bHRfc3RhX2FpZnNuW109ezMsNywyLDJ9OworY2hhciAqTUNTVG9NYnBzW10gPQorICAgIHsgIjFNYnBzIiwgIjJNYnBzIiwgIjUuNU1icHMiLCAiMTFNYnBzIiwgIjA2TWJwcyIsICIwOU1icHMiLCAiMTJNYnBzIiwKKyIxOE1icHMiLCAiMjRNYnBzIiwgIjM2TWJwcyIsICI0OE1icHMiLCAiNTRNYnBzIiwgIk1NLTAiLCAiTU0tMSIsICJNTS0yIiwgIk1NLTMiLAorIk1NLTQiLCAiTU0tNSIsICJNTS02IiwgIk1NLTciLCAiTU0tOCIsICJNTS05IiwgIk1NLTEwIiwgIk1NLTExIiwgIk1NLTEyIiwgIk1NLTEzIiwKKyJNTS0xNCIsICJNTS0xNSIsICJNTS0zMiIsICJlZTEiLCAiZWUyIiwgImVlMyIgfTsKIAotVUNIQVIgTWFwVXNlclByaW9yaXR5VG9BY2Nlc3NDYXRlZ29yeVs4XSA9IHtRSURfQUNfQkUsIFFJRF9BQ19CSywgUUlEX0FDX0JLLCBRSURfQUNfQkUsIFFJRF9BQ19WSSwgUUlEX0FDX1ZJLCBRSURfQUNfVk8sIFFJRF9BQ19WT307Cit1OCBkZWZhdWx0X2N3bWluW10gPQorICAgIHsgQ1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLCBDV19NSU5fSU5fQklUUyAtIDEsIENXX01JTl9JTl9CSVRTIC0gMiB9OworLyp1OCBkZWZhdWx0X2N3bWF4W109e0NXX01BWF9JTl9CSVRTLCBDV19NQVhfSU5fQklUUywgQ1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLTF9OyAqLwordTggZGVmYXVsdF9zdGFfYWlmc25bXSA9IHsgMywgNywgMiwgMiB9OwogCit1OCBNYXBVc2VyUHJpb3JpdHlUb0FjY2Vzc0NhdGVnb3J5WzhdID0KKyAgICB7IFFJRF9BQ19CRSwgUUlEX0FDX0JLLCBRSURfQUNfQkssIFFJRF9BQ19CRSwgUUlEX0FDX1ZJLCBRSURfQUNfVkksCitRSURfQUNfVk8sIFFJRF9BQ19WTyB9OwogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtOTYsMTYyICsxMDQsMTE5IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1ORElTX1NUQVRVUyBNaW5pcG9ydE1NUmVxdWVzdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVSU5UCQkJTGVuZ3RoKQoraW50IE1pbmlwb3J0TU1SZXF1ZXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHU4IFF1ZUlkeCwgdTggKnBEYXRhLCB1MzIgTGVuZ3RoKQogewotCVBORElTX1BBQ0tFVAlwUGFja2V0OwotCU5ESVNfU1RBVFVTICAJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlVTE9ORwkgCQlGcmVlTnVtOwotI2lmZGVmIFJUMjg2MAotCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3MgPSAwOwotI2VuZGlmCi0JVUNIQVIJCQlJcnFTdGF0ZTsKLQlVQ0hBUgkJCXJ0bXBId0hkcltUWElORk9fU0laRSArIFRYV0lfU0laRV07IC8vUlRNUF9IV19IRFJfTEVOXTsKKwl2b2lkICpwUGFja2V0OworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgRnJlZU51bTsKKwl1OCBydG1wSHdIZHJbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOwkvKlJUTVBfSFdfSERSX0xFTl07ICovCisjaWZkZWYgUlRNUF9NQUNfUENJCisJdW5zaWduZWQgbG9uZyBJcnFGbGFncyA9IDA7CisJdTggSXJxU3RhdGU7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisJQk9PTEVBTiBiVXNlRGF0YVEgPSBGQUxTRTsKKwlpbnQgcmV0cnlDbnQgPSAwOwogCiAJQVNTRVJUKExlbmd0aCA8PSBNR01UX0RNQV9CVUZGRVJfU0laRSk7CiAKLQlRdWVJZHg9MzsKLQotCS8vIDI4NjBDIHVzZSBUeCBSaW5nCi0KKwlpZiAoKFF1ZUlkeCAmIE1HTVRfVVNFX1FVRVVFX0ZMQUcpID09IE1HTVRfVVNFX1FVRVVFX0ZMQUcpIHsKKwkJYlVzZURhdGFRID0gVFJVRTsKKwkJUXVlSWR4ICY9ICh+TUdNVF9VU0VfUVVFVUVfRkxBRyk7CisJfQorI2lmZGVmIFJUTVBfTUFDX1BDSQorCS8qIDI4NjBDIHVzZSBUeCBSaW5nICovCiAJSXJxU3RhdGUgPSBwQWQtPmlycV9kaXNhYmxlZDsKLQotI2lmZGVmIFJUMjg2MAotCWlmICgocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApICYmICghSXJxU3RhdGUpKQorCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkgeworCQlRdWVJZHggPSAoYlVzZURhdGFRID09IFRSVUUgPyBRdWVJZHggOiAzKTsKKwkJYlVzZURhdGFRID0gVFJVRTsKKwl9CisJaWYgKGJVc2VEYXRhUSAmJiAoIUlycVN0YXRlKSkKIAkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotI2VuZGlmCi0JZG8KLQl7Ci0JCS8vIFJlc2V0IGlzIGluIHByb2dyZXNzLCBzdG9wIGltbWVkaWF0ZWx5Ci0JCWlmICggUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAotCQkJIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKXx8Ci0JCQkgIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCi0JCXsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKworCWRvIHsKKwkJLyogUmVzZXQgaXMgaW4gcHJvZ3Jlc3MsIHN0b3AgaW1tZWRpYXRlbHkgKi8KKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykgfHwKKwkJICAgIFJUTVBfVEVTVF9GTEFHKHBBZCwKKwkJCQkgICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCSAgIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkKKwkJICAgIHx8ICFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApKSB7CiAJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwogCQkJYnJlYWs7CiAJCX0KLQotCQkvLyBDaGVjayBGcmVlIHByaW9yaXR5IHF1ZXVlCi0JCS8vIFNpbmNlIHdlIHVzZSBQQkYgUXVldWUyIGZvciBtYW5hZ2VtZW50IGZyYW1lLiAgSXRzIGNvcnJlc3BvbmRpbmcgRE1BIHJpbmcgc2hvdWxkIGJlIHVzaW5nIFR4UmluZy4KLQotCQkvLyAyODYwQyB1c2UgVHggUmluZwotCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCi0JCXsKKwkJLyogQ2hlY2sgRnJlZSBwcmlvcml0eSBxdWV1ZSAqLworCQkvKiBTaW5jZSB3ZSB1c2UgUEJGIFF1ZXVlMiBmb3IgbWFuYWdlbWVudCBmcmFtZS4gIEl0cyBjb3JyZXNwb25kaW5nIERNQSByaW5nIHNob3VsZCBiZSB1c2luZyBUeFJpbmcuICovCisjaWZkZWYgUlRNUF9NQUNfUENJCisJCWlmIChiVXNlRGF0YVEpIHsKKwkJCXJldHJ5Q250ID0gTUFYX0RBVEFNTV9SRVRSWTsKKwkJCS8qIGZyZWUgVHgoUXVlSWR4KSByZXNvdXJjZXMgKi8KKwkJCVJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZShwQWQsIFF1ZUlkeCk7CiAJCQlGcmVlTnVtID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOwotCQl9Ci0JCWVsc2UKKwkJfSBlbHNlCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAJCXsKIAkJCUZyZWVOdW0gPSBHRVRfTUdNVFJJTkdfRlJFRU5PKHBBZCk7CiAJCX0KIAotCQlpZiAoKEZyZWVOdW0gPiAwKSkKLQkJewotCQkJLy8gV2UgbmVlZCB0byByZXNlcnZlIHNwYWNlIGZvciBydG1wIGhhcmR3YXJlIGhlYWRlci4gaS5lLiwgVHhXSSBmb3IgUlQyODYwIGFuZCBUeEluZm8rVHhXSSBmb3IgUlQyODcwCisJCWlmICgoRnJlZU51bSA+IDApKSB7CisJCQkvKiBXZSBuZWVkIHRvIHJlc2VydmUgc3BhY2UgZm9yIHJ0bXAgaGFyZHdhcmUgaGVhZGVyLiBpLmUuLCBUeFdJIGZvciBSVDI4NjAgYW5kIFR4SW5mbytUeFdJIGZvciBSVDI4NzAgKi8KIAkJCU5kaXNaZXJvTWVtb3J5KCZydG1wSHdIZHIsIChUWElORk9fU0laRSArIFRYV0lfU0laRSkpOwotCQkJU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwUGFja2V0LCAoUFVDSEFSKSZydG1wSHdIZHIsIChUWElORk9fU0laRSArIFRYV0lfU0laRSksIHBEYXRhLCBMZW5ndGgpOwotCQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiTWluaXBvcnRNTVJlcXVlc3QgKGVycm9yOjogY2FuJ3QgYWxsb2NhdGUgTkRJUyBQQUNLRVQpXG4iKSk7CisJCQlTdGF0dXMgPQorCQkJICAgIFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQocEFkLCAmcFBhY2tldCwKKwkJCQkJCSAgICh1OCAqKSYgcnRtcEh3SGRyLAorCQkJCQkJICAgKFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKSwKKwkJCQkJCSAgIHBEYXRhLCBMZW5ndGgpOworCQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwKKwkJCQkJICgiTWluaXBvcnRNTVJlcXVlc3QgKGVycm9yOjogY2FuJ3QgYWxsb2NhdGUgTkRJUyBQQUNLRVQpXG4iKSk7CiAJCQkJYnJlYWs7CiAJCQl9CisJCQkvKnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7ICovCisJCQkvKnBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8yOyAqLwogCi0JCQkvL3BBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQkvL3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8yOwotCi0KLQkJCVN0YXR1cyA9IE1sbWVIYXJkVHJhbnNtaXQocEFkLCBRdWVJZHgsIHBQYWNrZXQpOwotCQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorI2lmZGVmIFJUTVBfTUFDX1BDSQorCQkJaWYgKGJVc2VEYXRhUSkgeworCQkJCVN0YXR1cyA9CisJCQkJICAgIE1sbWVEYXRhSGFyZFRyYW5zbWl0KHBBZCwgUXVlSWR4LCBwUGFja2V0KTsKKwkJCQlyZXRyeUNudC0tOworCQkJfSBlbHNlCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisJCQkJU3RhdHVzID0gTWxtZUhhcmRUcmFuc21pdChwQWQsIFF1ZUlkeCwgcFBhY2tldCk7CisJCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJcmV0cnlDbnQgPSAwOworCQkJZWxzZQogCQkJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsIHBQYWNrZXQpOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJcEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCsrOwotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUWlkeCglZCksIG5vdCBlbm91Z2ggc3BhY2UgaW4gTWdtdFJpbmcsIE1nbXRSaW5nRnVsbENvdW50PSVsZCFcbiIsCi0JCQkJCQkJCQkJUXVlSWR4LCBwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50KSk7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJCQlpZiAoYlVzZURhdGFRKSB7CisJCQkJcmV0cnlDbnQtLTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgicmV0cnlDbnQgJWRcbiIsIHJldHJ5Q250KSk7CisJCQkJaWYgKHJldHJ5Q250ID09IDApIHsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCQkgKCJRaWR4KCVkKSwgbm90IGVub3VnaCBzcGFjZSBpbiBEYXRhUmluZywgTWdtdFJpbmdGdWxsQ291bnQ9JWxkIVxuIiwKKwkJCQkJCSAgUXVlSWR4LAorCQkJCQkJICBwQWQtPlJhbGlua0NvdW50ZXJzLgorCQkJCQkJICBNZ210UmluZ0Z1bGxDb3VudCkpOworCQkJCX0KKwkJCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIlFpZHgoJWQpLCBub3QgZW5vdWdoIHNwYWNlIGluIE1nbXRSaW5nLCBNZ210UmluZ0Z1bGxDb3VudD0lbGQhXG4iLAorCQkJCSAgUXVlSWR4LAorCQkJCSAgcEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCkpOwogCQl9CisJfSB3aGlsZSAocmV0cnlDbnQgPiAwKTsKIAotCX0gd2hpbGUgKEZBTFNFKTsKLQotI2lmZGVmIFJUMjg2MAotCS8vIDI4NjBDIHVzZSBUeCBSaW5nCi0JaWYgKChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkgJiYgKCFJcnFTdGF0ZSkpCisjaWZkZWYgUlRNUF9NQUNfUENJCisJaWYgKGJVc2VEYXRhUSAmJiAoIUlycVN0YXRlKSkKIAkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0jZW5kaWYKLQlyZXR1cm4gU3RhdHVzOwotfQotCi0jaWZkZWYgUlQyODYwCi1ORElTX1NUQVRVUyBNaW5pcG9ydE1NUmVxdWVzdFVubG9jaygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVSU5UCQkJTGVuZ3RoKQotewotCVBORElTX1BBQ0tFVAlwUGFja2V0OwotCU5ESVNfU1RBVFVTICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCVVMT05HCSBGcmVlTnVtOwotCVRYV0lfU1RSVUMJCVRYV0k7Ci0JVUxPTkcJU1dfVFhfSURYOwotCVBUWERfU1RSVUMJCXBUeEQ7Ci0KLQlRdWVJZHggPSAzOwotCUFTU0VSVChMZW5ndGggPD0gTUdNVF9ETUFfQlVGRkVSX1NJWkUpOwotCi0JZG8KLQl7Ci0JCS8vIFJlc2V0IGlzIGluIHByb2dyZXNzLCBzdG9wIGltbWVkaWF0ZWx5Ci0JCWlmICggUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAotCQkJIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKXx8Ci0JCQkgIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCi0JCXsKLQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8vIENoZWNrIEZyZWUgcHJpb3JpdHkgcXVldWUKLQkJLy8gU2luY2Ugd2UgdXNlIFBCRiBRdWV1ZTIgZm9yIG1hbmFnZW1lbnQgZnJhbWUuICBJdHMgY29ycmVzcG9uZGluZyBETUEgcmluZyBzaG91bGQgYmUgdXNpbmcgVHhSaW5nLgotCQkvLyAyODYwQyB1c2UgVHggUmluZwotCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCi0JCXsKLQkJCUZyZWVOdW0gPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7Ci0JCQlTV19UWF9JRFggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4OwotCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5UeFJpbmdbUXVlSWR4XS5DZWxsW1NXX1RYX0lEWF0uQWxsb2NWYTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZyZWVOdW0gPSBHRVRfTUdNVFJJTkdfRlJFRU5PKHBBZCk7Ci0JCQlTV19UWF9JRFggPSBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4OwotCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW1NXX1RYX0lEWF0uQWxsb2NWYTsKLQkJfQotCQlpZiAoKEZyZWVOdW0gPiAwKSkKLQkJewotCQkJTmRpc1plcm9NZW1vcnkoJlRYV0ksIFRYV0lfU0laRSk7Ci0JCQlTdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBQYWNrZXQsIChQVUNIQVIpJlRYV0ksIFRYV0lfU0laRSwgcERhdGEsIExlbmd0aCk7Ci0JCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJNaW5pcG9ydE1NUmVxdWVzdCAoZXJyb3I6OiBjYW4ndCBhbGxvY2F0ZSBORElTIFBBQ0tFVClcbiIpKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJU3RhdHVzID0gTWxtZUhhcmRUcmFuc21pdChwQWQsIFF1ZUlkeCwgcFBhY2tldCk7Ci0JCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQkJUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgcFBhY2tldCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50Kys7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJRaWR4KCVkKSwgbm90IGVub3VnaCBzcGFjZSBpbiBNZ210UmluZ1xuIiwgUXVlSWR4KSk7Ci0JCX0KLQotCX0gd2hpbGUgKEZBTFNFKTsKLQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCiAJcmV0dXJuIFN0YXR1czsKIH0KLSNlbmRpZgogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMjc3LDI3MCArMjQyLDg1IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1ORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJUXVlSWR4LAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoraW50IE1sbWVIYXJkVHJhbnNtaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1OCBRdWVJZHgsIHZvaWQgKnBQYWNrZXQpCiB7Ci0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkKLQl7CisJc3RydWN0IHJ0X3BhY2tldF9pbmZvIFBhY2tldEluZm87CisJdTggKnBTcmNCdWZWQTsKKwl1MzIgU3JjQnVmTGVuOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlcl84MDJfMTE7CisKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkKKwkgICAgKSB7CiAJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwogCX0KIAotI2lmZGVmIFJUMjg2MAotCWlmICggcEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDAgKQotCQlyZXR1cm4gTWxtZUhhcmRUcmFuc21pdFR4UmluZyhwQWQsUXVlSWR4LHBQYWNrZXQpOworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKKwlpZiAocFNyY0J1ZlZBID09IE5VTEwpCisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCisJcEhlYWRlcl84MDJfMTEgPSAoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKikgKHBTcmNCdWZWQSArIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKTsKKworI2lmZGVmIFJUTVBfTUFDX1BDSQorCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJcmV0dXJuIE1sbWVIYXJkVHJhbnNtaXRUeFJpbmcocEFkLCBRdWVJZHgsIHBQYWNrZXQpOwogCWVsc2UKLSNlbmRpZgotCQlyZXR1cm4gTWxtZUhhcmRUcmFuc21pdE1nbXRSaW5nKHBBZCxRdWVJZHgscFBhY2tldCk7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisJCXJldHVybiBNbG1lSGFyZFRyYW5zbWl0TWdtdFJpbmcocEFkLCBRdWVJZHgsIHBQYWNrZXQpOwogCiB9CiAKLSNpZmRlZiBSVDI4NjAKLU5ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXRUeFJpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJUXVlSWR4LAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoraW50IE1sbWVIYXJkVHJhbnNtaXRNZ210UmluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgICB1OCBRdWVJZHgsIHZvaWQgKnBQYWNrZXQpCiB7Ci0JUEFDS0VUX0lORk8gCVBhY2tldEluZm87Ci0JUFVDSEFSCQkJcFNyY0J1ZlZBOwotCVVJTlQJCQlTcmNCdWZMZW47Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyXzgwMl8xMTsKLQlCT09MRUFOIAkJYkFja1JlcXVpcmVkLCBiSW5zZXJ0VGltZXN0YW1wOwotCVVMT05HCQkJU3JjQnVmUEE7Ci0JVUNIQVIJCQlNbG1lUmF0ZTsKLQlVTE9ORwkJCVN3SWR4ID0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeDsKLQlQVFhXSV9TVFJVQyAJcEZpcnN0VHhXSTsKLQlVTE9ORwkgRnJlZU51bTsKLQlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7Ci0KKwlzdHJ1Y3QgcnRfcGFja2V0X2luZm8gUGFja2V0SW5mbzsKKwl1OCAqcFNyY0J1ZlZBOworCXUzMiBTcmNCdWZMZW47CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyXzgwMl8xMTsKKwlCT09MRUFOIGJBY2tSZXF1aXJlZCwgYkluc2VydFRpbWVzdGFtcDsKKwl1OCBNbG1lUmF0ZTsKKwlzdHJ1Y3QgcnRfdHh3aSAqIHBGaXJzdFR4V0k7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5ID0gTlVMTDsKKwl1OCBQSUQ7CiAKIAlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7CiAKLQlpZiAocFNyY0J1ZlZBID09IE5VTEwpCi0JewotCQkvLyBUaGUgYnVmZmVyIHNob3VsZG4ndCBiZSBOVUxMCi0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCS8vIE1ha2Ugc3VyZSBNR01UIHJpbmcgcmVzb3VyY2Ugd29uJ3QgYmUgdXNlZCBieSBvdGhlciB0aHJlYWRzCi0JLy9OZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPlR4UmluZ0xvY2spOwotCi0JRnJlZU51bSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKLQotCWlmIChGcmVlTnVtID09IDApCi0JewotCQkvL05kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+VHhSaW5nTG9jayk7Ci0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCVN3SWR4ID0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeDsKLQotCXBUeEQgID0gKFBUWERfU1RSVUMpIHBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0uQWxsb2NWYTsKLQotCWlmIChwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0KQotCXsKLQkJcHJpbnRrKCJNbG1lSGFyZFRyYW5zbWl0IEVycm9yXG4iKTsKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JLy8gb3V0Z29pbmcgZnJhbWUgYWx3YXlzIHdha2V1cCBQSFkgdG8gcHJldmVudCBmcmFtZSBsb3N0Ci0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JCUFzaWNGb3JjZVdha2V1cChwQWQsIEZST01fVFgpOwotCi0JcEZpcnN0VHhXSQk9KFBUWFdJX1NUUlVDKXBTcmNCdWZWQTsKLQotCXBIZWFkZXJfODAyXzExID0gKFBIRUFERVJfODAyXzExKSAocFNyY0J1ZlZBICsgVFhXSV9TSVpFKTsKLQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkKLQl7Ci0JCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKLQl9Ci0JZWxzZQotCXsKLQkJTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKLQl9Ci0KLQlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpICYmCi0JCShwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1FPU19OVUxMKSkKLQl7Ci0JCXBNYWNFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEhlYWRlcl84MDJfMTEtPkFkZHIxKTsKLQl9Ci0KLQkvLyBWZXJpZnkgTWxtZSByYXRlIGZvciBhIC8gZyBiYW5kcy4KLQlpZiAoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSAmJiAoTWxtZVJhdGUgPCBSQVRFXzYpKSAvLyAxMUEgYmFuZAotCQlNbG1lUmF0ZSA9IFJBVEVfNjsKLQotCS8vCi0JLy8gU2hvdWxkIG5vdCBiZSBoYXJkIGNvZGUgdG8gc2V0IFB3ck1nbXQgdG8gMCAoUFdSX0FDVElWRSkKLQkvLyBTbmljZSBpdCdzIGJlZW4gc2V0IHRvIDAgd2hpbGUgb24gTWd0TWFjSGVhZGVySW5pdAotCS8vIEJ5IHRoZSB3YXkgdGhpcyB3aWxsIGNhdXNlIGZyYW1lIHRvIGJlIHNlbmQgb24gUFdSX1NBVkUgZmFpbGVkLgotCS8vCi0JLy8KLQkvLyBJbiBXTU0tVUFQU0QsIG1sbWUgZnJhbWUgc2hvdWxkIGJlIHNldCBwc20gYXMgcG93ZXIgc2F2aW5nIGJ1dCBwcm9iZSByZXF1ZXN0IGZyYW1lCi0KLSAgICAvLyBEYXRhLU51bGwgcGFja2V0cyBhbHNlIHBhc3MgdGhyb3VnaCBNTVJlcXVlc3QgaW4gUlQyODYwLCBob3dldmVyLCB3ZSBob3BlIGNvbnRyb2wgdGhlIHBzbSBiaXQgdG8gcGFzcyBBUFNECi0JaWYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlICE9IEJUWVBFX0RBVEEpCi0gICAgewotICAgIAlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUkVRKSB8fCAhKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkpCi0gICAgCXsKLSAgICAJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX0FDVElWRTsKLSAgICAJfQotICAgIAllbHNlCi0gICAgCXsKLSAgICAJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gcEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZTsKLSAgICAJfQotICAgIH0KLQotCWJJbnNlcnRUaW1lc3RhbXAgPSBGQUxTRTsKLQlpZiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfQ05UTCkgLy8gbXVzdCBiZSBQUy1QT0xMCi0JewotCQliQWNrUmVxdWlyZWQgPSBGQUxTRTsKLQl9Ci0JZWxzZSAvLyBCVFlQRV9NR01UIG9yIEJUWVBFX0RBVEEobXVzdCBiZSBOVUxMIGZyYW1lKQotCXsKLQkJaWYgKHBIZWFkZXJfODAyXzExLT5BZGRyMVswXSAmIDB4MDEpIC8vIE1VTFRJQ0FTVCwgQlJPQURDQVNUCi0JCXsKLQkJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOwotCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gMDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWJBY2tSZXF1aXJlZCA9IFRSVUU7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgTWxtZVJhdGUsIDE0KTsKLQkJCWlmIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BST0JFX1JTUCkKLQkJCXsKLQkJCQliSW5zZXJ0VGltZXN0YW1wID0gVFJVRTsKLQkJCX0KLQkJfQotCX0KLQlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlNlcXVlbmNlKys7Ci0JaWYgKHBBZC0+U2VxdWVuY2UgPiAweGZmZikKLQkJcEFkLT5TZXF1ZW5jZSA9IDA7Ci0JLy8gQmVmb3JlIHJhZGFyIGRldGVjdGlvbiBkb25lLCBtZ210IGZyYW1lIGNhbiBub3QgYmUgc2VudCBidXQgcHJvYmUgcmVxCi0JLy8gQmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSBwcm9iZSByZXEgdG8gdHJpZ2dlciBkcml2ZXIgdG8gc2VuZCBwcm9iZSByZXEgaW4gcGFzc2l2ZSBzY2FuCi0JaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSAhPSBTVUJUWVBFX1BST0JFX1JFUSkKLQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCi0JCSYmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJNbG1lSGFyZFRyYW5zbWl0IC0tPiByYWRhciBkZXRlY3Qgbm90IGluIG5vcm1hbCBtb2RlICEhIVxuIikpOwotCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLQotCS8vCi0JLy8gZmlsbCBzY2F0dGVyLWFuZC1nYXRoZXIgYnVmZmVyIGxpc3QgaW50byBUWEQuIEludGVybmFsbHkgY3JlYXRlZCBORElTIFBBQ0tFVAotCS8vIHNob3VsZCBhbHdheXMgaGFzIG9ubHkgb25lIG9oeXNpY2FsIGJ1ZmZlciwgYW5kIHRoZSB3aG9sZSBmcmFtZSBzaXplIGVxdWFscwotCS8vIHRvIHRoZSBmaXJzdCBzY2F0dGVyIGJ1ZmZlciBzaXplCi0JLy8KLQotCS8vIEluaXRpYWxpemUgVFggRGVzY3JpcHRvcgotCS8vIEZvciBpbnRlci1mcmFtZSBnYXAsIHRoZSBudW1iZXIgaXMgZm9yIHRoaXMgZnJhbWUgYW5kIG5leHQgZnJhbWUKLQkvLyBGb3IgTUxNRSByYXRlLCB3ZSB3aWxsIGZpeCBhcyAyTWIgdG8gbWF0Y2ggb3RoZXIgdmVuZG9yJ3MgaW1wbGVtZW50Ci0KLS8vIG1hbmFnZW1lbnQgZnJhbWUgZG9lc24ndCBuZWVkIGVuY3J5cHRpb24uIHNvIHVzZSBSRVNFUlZFRF9XQ0lEIG5vIG1hdHRlciB1IGFyZSBzZW5kaW5nIHRvIHNwZWNpZmljIHdjaWQgb3Igbm90LgotCS8vIE9ubHkgYmVhY29uIHVzZSBOc2VxPVRSVUUuIFNvIGhlcmUgd2UgdXNlIE5zZXE9RkFMU0UuCi0JaWYgKHBNYWNFbnRyeSA9PSBOVUxMKQotCXsKLQkJUlRNUFdyaXRlVHhXSShwQWQsIHBGaXJzdFR4V0ksIEZBTFNFLCBGQUxTRSwgYkluc2VydFRpbWVzdGFtcCwgRkFMU0UsIGJBY2tSZXF1aXJlZCwgRkFMU0UsCi0JCTAsIFJFU0VSVkVEX1dDSUQsIChTcmNCdWZMZW4gLSBUWFdJX1NJWkUpLCBQSURfTUdNVCwgMCwgIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLCBJRlNfQkFDS09GRiwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOwotCX0KLQllbHNlCi0JewotCQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLAotCQkJCQliSW5zZXJ0VGltZXN0YW1wLCBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwKLQkJCQkJMCwgcE1hY0VudHJ5LT5BaWQsIChTcmNCdWZMZW4gLSBUWFdJX1NJWkUpLAotCQkJCQlwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MsIDAsCi0JCQkJCShVQ0hBUilwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MsCi0JCQkJCUlGU19CQUNLT0ZGLCBGQUxTRSwgJnBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlKTsKLQl9Ci0KLQlwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKLQlwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0KLQlTcmNCdWZQQSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4sIDAsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCi0KLQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBUUlVFLCBGSUZPX0VEQ0EpOwotCXBUeEQtPkxhc3RTZWMwID0gMTsKLQlwVHhELT5MYXN0U2VjMSA9IDE7Ci0JcFR4RC0+U0RMZW4wID0gU3JjQnVmTGVuOwotCXBUeEQtPlNETGVuMSA9IDA7Ci0JcFR4RC0+U0RQdHIwID0gU3JjQnVmUEE7Ci0JcFR4RC0+RE1BRE9ORSA9IDA7Ci0KLQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOwotCi0gICAJLy8gSW5jcmVhc2UgVFhfQ1RYX0lEWCwgYnV0IHdyaXRlIHRvIHJlZ2lzdGVyIGxhdGVyLgotCUlOQ19SSU5HX0lOREVYKHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHgsIFRYX1JJTkdfU0laRSk7Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFF1ZUlkeCoweDEwLCAgcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLSNlbmRpZiAvKiBSVDI4NjAgKi8KLQotTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdE1nbXRSaW5nKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCVF1ZUlkeCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKLXsKLQlQQUNLRVRfSU5GTyAJUGFja2V0SW5mbzsKLQlQVUNIQVIJCQlwU3JjQnVmVkE7Ci0JVUlOVAkJCVNyY0J1ZkxlbjsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyXzgwMl8xMTsKLQlCT09MRUFOIAkJYkFja1JlcXVpcmVkLCBiSW5zZXJ0VGltZXN0YW1wOwotCVVDSEFSCQkJTWxtZVJhdGU7Ci0JUFRYV0lfU1RSVUMgCXBGaXJzdFR4V0k7Ci0JTUFDX1RBQkxFX0VOVFJZCSpwTWFjRW50cnkgPSBOVUxMOwotCi0JUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwU3JjQnVmVkEsICZTcmNCdWZMZW4pOwotCQlSVE1QX1NFTV9MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7Ci0KLQotCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkKLQl7CisJLyogTWFrZSBzdXJlIE1HTVQgcmluZyByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMgKi8KKwlSVE1QX1NFTV9MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7CisJaWYgKHBTcmNCdWZWQSA9PSBOVUxMKSB7CisJCS8qIFRoZSBidWZmZXIgc2hvdWxkbid0IGJlIE5VTEwgKi8KIAkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7CiAJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwogCX0KIAotCS8vIG91dGdvaW5nIGZyYW1lIGFsd2F5cyB3YWtldXAgUEhZIHRvIHByZXZlbnQgZnJhbWUgbG9zdAotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotI2lmZGVmIFJUMjg2MAotCQlBc2ljRm9yY2VXYWtldXAocEFkLCBGUk9NX1RYKTsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKLSNlbmRpZgotCi0JcEZpcnN0VHhXSSA9IChQVFhXSV9TVFJVQykocFNyY0J1ZlZBICsgIFRYSU5GT19TSVpFKTsKLQlwSGVhZGVyXzgwMl8xMSA9IChQSEVBREVSXzgwMl8xMSkgKHBTcmNCdWZWQSArIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKTsgLy9UWFdJX1NJWkUpOwotCi0JaWYgKHBIZWFkZXJfODAyXzExLT5BZGRyMVswXSAmIDB4MDEpCiAJewotCQlNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7CisJCS8qIG91dGdvaW5nIGZyYW1lIGFsd2F5cyB3YWtldXAgUEhZIHRvIHByZXZlbnQgZnJhbWUgbG9zdCAqLworCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOwogCX0KLQllbHNlCi0JeworCisJcEZpcnN0VHhXSSA9IChzdHJ1Y3QgcnRfdHh3aSAqKSAocFNyY0J1ZlZBICsgVFhJTkZPX1NJWkUpOworCXBIZWFkZXJfODAyXzExID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIChwU3JjQnVmVkEgKyBUWElORk9fU0laRSArIFRYV0lfU0laRSk7CS8qVFhXSV9TSVpFKTsgKi8KKworCWlmIChwSGVhZGVyXzgwMl8xMS0+QWRkcjFbMF0gJiAweDAxKSB7CisJCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKKwl9IGVsc2UgewogCQlNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOwogCX0KIAotCS8vIFZlcmlmeSBNbG1lIHJhdGUgZm9yIGEgLyBnIGJhbmRzLgotCWlmICgocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpICYmIChNbG1lUmF0ZSA8IFJBVEVfNikpIC8vIDExQSBiYW5kCisJLyogVmVyaWZ5IE1sbWUgcmF0ZSBmb3IgYSAvIGcgYmFuZHMuICovCisJaWYgKChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkgJiYgKE1sbWVSYXRlIDwgUkFURV82KSkJLyogMTFBIGJhbmQgKi8KIAkJTWxtZVJhdGUgPSBSQVRFXzY7CiAKIAlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpICYmCi0JCShwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1FPU19OVUxMKSkKLQl7CisJICAgIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1FPU19OVUxMKSkgewogCQlwTWFjRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBIZWFkZXJfODAyXzExLT5BZGRyMSk7CiAJfQogCiAJewotCQkvLyBGaXhlZCBXNTIgd2l0aCBBY3Rpdml0eSBzY2FuIGlzc3VlIGluIEFCR19NSVhFRCBhbmQgQUJHTl9NSVhFRCBtb2RlLgorCQkvKiBGaXhlZCBXNTIgd2l0aCBBY3Rpdml0eSBzY2FuIGlzc3VlIGluIEFCR19NSVhFRCBhbmQgQUJHTl9NSVhFRCBtb2RlLiAqLwogCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQKLQkJCXx8IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRAotCQkpCi0JCXsKKwkJICAgIHx8IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkgewogCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KQogCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gMTsKIAkJCWVsc2UKQEAgLTU0OCwxMDMgKzMyOCwxMjEgQEAKIAkJfQogCX0KIAotCS8vCi0JLy8gU2hvdWxkIG5vdCBiZSBoYXJkIGNvZGUgdG8gc2V0IFB3ck1nbXQgdG8gMCAoUFdSX0FDVElWRSkKLQkvLyBTbmljZSBpdCdzIGJlZW4gc2V0IHRvIDAgd2hpbGUgb24gTWd0TWFjSGVhZGVySW5pdAotCS8vIEJ5IHRoZSB3YXkgdGhpcyB3aWxsIGNhdXNlIGZyYW1lIHRvIGJlIHNlbmQgb24gUFdSX1NBVkUgZmFpbGVkLgotCS8vCi0JLy8gcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSAwOyAvLyAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKTsKLQkvLwotCS8vIEluIFdNTS1VQVBTRCwgbWxtZSBmcmFtZSBzaG91bGQgYmUgc2V0IHBzbSBhcyBwb3dlciBzYXZpbmcgYnV0IHByb2JlIHJlcXVlc3QgZnJhbWUKKwkvKiAqLworCS8qIFNob3VsZCBub3QgYmUgaGFyZCBjb2RlIHRvIHNldCBQd3JNZ210IHRvIDAgKFBXUl9BQ1RJVkUpICovCisJLyogU25pY2UgaXQncyBiZWVuIHNldCB0byAwIHdoaWxlIG9uIE1ndE1hY0hlYWRlckluaXQgKi8KKwkvKiBCeSB0aGUgd2F5IHRoaXMgd2lsbCBjYXVzZSBmcmFtZSB0byBiZSBzZW5kIG9uIFBXUl9TQVZFIGZhaWxlZC4gKi8KKwkvKiAqLworCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX0FDVElWRTsJLyogKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSk7ICovCiAKLSAgICAvLyBEYXRhLU51bGwgcGFja2V0cyBhbHNlIHBhc3MgdGhyb3VnaCBNTVJlcXVlc3QgaW4gUlQyODYwLCBob3dldmVyLCB3ZSBob3BlIGNvbnRyb2wgdGhlIHBzbSBiaXQgdG8gcGFzcyBBUFNECi0JaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSAhPSBCVFlQRV9EQVRBKSAmJiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgIT0gQlRZUEVfQ05UTCkpCisJLyogKi8KKwkvKiBJbiBXTU0tVUFQU0QsIG1sbWUgZnJhbWUgc2hvdWxkIGJlIHNldCBwc20gYXMgcG93ZXIgc2F2aW5nIGJ1dCBwcm9iZSByZXF1ZXN0IGZyYW1lICovCisJLyogRGF0YS1OdWxsIHBhY2tldHMgYWxzZSBwYXNzIHRocm91Z2ggTU1SZXF1ZXN0IGluIFJUMjg2MCwgaG93ZXZlciwgd2UgaG9wZSBjb250cm9sIHRoZSBwc20gYml0IHRvIHBhc3MgQVBTRCAqLworLyogICAgICBpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlICE9IEJUWVBFX0RBVEEpICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSAhPSBCVFlQRV9DTlRMKSkgKi8KIAl7Ci0JCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJgotCQkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQUNUSU9OKSkKLQkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7Ci0JCWVsc2UKLQkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX0FDVElWRTsKKwkJaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX0FDVElPTikgfHwKKwkJICAgICgocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkgJiYKKwkJICAgICAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUU9TX05VTEwpIHx8CisJCSAgICAgIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX05VTExfRlVOQykpKSkgeworCQkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKKwkJCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCQkJZWxzZQorCQkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0KKwkJCQkgICAgcEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZTsKKwkJfQogCX0KIAogCWJJbnNlcnRUaW1lc3RhbXAgPSBGQUxTRTsKLQlpZiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfQ05UTCkgLy8gbXVzdCBiZSBQUy1QT0xMCisJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0NOVEwpCS8qIG11c3QgYmUgUFMtUE9MTCAqLwogCXsKLQkJLy9TZXQgUE0gYml0IGluIHBzLXBvbGwsIHRvIGZpeCBXTEsgMS4yICBQb3dlclNhdmVNb2RlX2V4dCBmYWlsdXJlIGlzc3VlLgotCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BTX1BPTEwpKQotCQl7CisJCS8qU2V0IFBNIGJpdCBpbiBwcy1wb2xsLCB0byBmaXggV0xLIDEuMiAgUG93ZXJTYXZlTW9kZV9leHQgZmFpbHVyZSBpc3N1ZS4gKi8KKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQkgICAgJiYgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFNfUE9MTCkpIHsKIAkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CiAJCX0KIAkJYkFja1JlcXVpcmVkID0gRkFMU0U7Ci0JfQotCWVsc2UgLy8gQlRZUEVfTUdNVCBvciBCVFlQRV9EQVRBKG11c3QgYmUgTlVMTCBmcmFtZSkKKwl9IGVsc2UJCQkvKiBCVFlQRV9NR01UIG9yIEJUWVBFX0RBVEEobXVzdCBiZSBOVUxMIGZyYW1lKSAqLwogCXsKLQkJaWYgKHBIZWFkZXJfODAyXzExLT5BZGRyMVswXSAmIDB4MDEpIC8vIE1VTFRJQ0FTVCwgQlJPQURDQVNUCisJCS8qcEFkLT5TZXF1ZW5jZSsrOyAqLworCQkvKnBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2U7ICovCisKKwkJaWYgKHBIZWFkZXJfODAyXzExLT5BZGRyMVswXSAmIDB4MDEpCS8qIE1VTFRJQ0FTVCwgQlJPQURDQVNUICovCiAJCXsKIAkJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOwogCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gMDsKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCWJBY2tSZXF1aXJlZCA9IFRSVUU7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgTWxtZVJhdGUsIDE0KTsKLQkJCWlmIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BST0JFX1JTUCkKLQkJCXsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9CisJCQkgICAgUlRNUENhbGNEdXJhdGlvbihwQWQsIE1sbWVSYXRlLCAxNCk7CisJCQlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUlNQKQorCQkJICAgICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9NR01UKSkgewogCQkJCWJJbnNlcnRUaW1lc3RhbXAgPSBUUlVFOworCQkJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOwkvKiBEaXNhYmxlIEFDSyB0byBwcmV2ZW50IHJldHJ5IDB4MWYgZm9yIFByb2JlIFJlc3BvbnNlICovCisJCQl9IGVsc2UKKwkJCSAgICBpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09CisJCQkJIFNVQlRZUEVfUFJPQkVfUkVRKQorCQkJCSYmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9NR01UKSkgeworCQkJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOwkvKiBEaXNhYmxlIEFDSyB0byBwcmV2ZW50IHJldHJ5IDB4MWYgZm9yIFByb2JlIFJlcXVlc3QgKi8KIAkJCX0KIAkJfQogCX0KIAogCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2UrKzsKLQlpZiAocEFkLT5TZXF1ZW5jZSA+MHhmZmYpCisJaWYgKHBBZC0+U2VxdWVuY2UgPiAweGZmZikKIAkJcEFkLT5TZXF1ZW5jZSA9IDA7CiAKLQkvLyBCZWZvcmUgcmFkYXIgZGV0ZWN0aW9uIGRvbmUsIG1nbXQgZnJhbWUgY2FuIG5vdCBiZSBzZW50IGJ1dCBwcm9iZSByZXEKLQkvLyBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIHByb2JlIHJlcSB0byB0cmlnZ2VyIGRyaXZlciB0byBzZW5kIHByb2JlIHJlcSBpbiBwYXNzaXZlIHNjYW4KKwkvKiBCZWZvcmUgcmFkYXIgZGV0ZWN0aW9uIGRvbmUsIG1nbXQgZnJhbWUgY2FuIG5vdCBiZSBzZW50IGJ1dCBwcm9iZSByZXEgKi8KKwkvKiBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIHByb2JlIHJlcSB0byB0cmlnZ2VyIGRyaXZlciB0byBzZW5kIHByb2JlIHJlcSBpbiBwYXNzaXZlIHNjYW4gKi8KIAlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlICE9IFNVQlRZUEVfUFJPQkVfUkVRKQotCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKLQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIk1sbWVIYXJkVHJhbnNtaXQgLS0+IHJhZGFyIGRldGVjdCBub3QgaW4gbm9ybWFsIG1vZGUgISEhXG4iKSk7CisJICAgICYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCSAgICAmJiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIk1sbWVIYXJkVHJhbnNtaXQgLS0+IHJhZGFyIGRldGVjdCBub3QgaW4gbm9ybWFsIG1vZGUhXG4iKSk7CisvKiAgICAgICAgICAgICAgaWYgKCFJcnFTdGF0ZSkgKi8KIAkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7CiAJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJfQogCi0JLy8KLQkvLyBmaWxsIHNjYXR0ZXItYW5kLWdhdGhlciBidWZmZXIgbGlzdCBpbnRvIFRYRC4gSW50ZXJuYWxseSBjcmVhdGVkIE5ESVMgUEFDS0VUCi0JLy8gc2hvdWxkIGFsd2F5cyBoYXMgb25seSBvbmUgb2h5c2ljYWwgYnVmZmVyLCBhbmQgdGhlIHdob2xlIGZyYW1lIHNpemUgZXF1YWxzCi0JLy8gdG8gdGhlIGZpcnN0IHNjYXR0ZXIgYnVmZmVyIHNpemUKLQkvLworCS8qICovCisJLyogZmlsbCBzY2F0dGVyLWFuZC1nYXRoZXIgYnVmZmVyIGxpc3QgaW50byBUWEQuIEludGVybmFsbHkgY3JlYXRlZCBORElTIFBBQ0tFVCAqLworCS8qIHNob3VsZCBhbHdheXMgaGFzIG9ubHkgb25lIHBoeXNpY2FsIGJ1ZmZlciwgYW5kIHRoZSB3aG9sZSBmcmFtZSBzaXplIGVxdWFscyAqLworCS8qIHRvIHRoZSBmaXJzdCBzY2F0dGVyIGJ1ZmZlciBzaXplICovCisJLyogKi8KIAotCS8vIEluaXRpYWxpemUgVFggRGVzY3JpcHRvcgotCS8vIEZvciBpbnRlci1mcmFtZSBnYXAsIHRoZSBudW1iZXIgaXMgZm9yIHRoaXMgZnJhbWUgYW5kIG5leHQgZnJhbWUKLQkvLyBGb3IgTUxNRSByYXRlLCB3ZSB3aWxsIGZpeCBhcyAyTWIgdG8gbWF0Y2ggb3RoZXIgdmVuZG9yJ3MgaW1wbGVtZW50CisJLyogSW5pdGlhbGl6ZSBUWCBEZXNjcmlwdG9yICovCisJLyogRm9yIGludGVyLWZyYW1lIGdhcCwgdGhlIG51bWJlciBpcyBmb3IgdGhpcyBmcmFtZSBhbmQgbmV4dCBmcmFtZSAqLworCS8qIEZvciBNTE1FIHJhdGUsIHdlIHdpbGwgZml4IGFzIDJNYiB0byBtYXRjaCBvdGhlciB2ZW5kb3IncyBpbXBsZW1lbnQgKi8KKy8qICAgICAgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSAxOyAqLwogCi0vLyBtYW5hZ2VtZW50IGZyYW1lIGRvZXNuJ3QgbmVlZCBlbmNyeXB0aW9uLiBzbyB1c2UgUkVTRVJWRURfV0NJRCBubyBtYXR0ZXIgdSBhcmUgc2VuZGluZyB0byBzcGVjaWZpYyB3Y2lkIG9yIG5vdC4KLQlpZiAocE1hY0VudHJ5ID09IE5VTEwpCi0JewotCQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLCBiSW5zZXJ0VGltZXN0YW1wLCBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwKLQkJMCwgUkVTRVJWRURfV0NJRCwgKFNyY0J1ZkxlbiAtIFRYSU5GT19TSVpFIC0gVFhXSV9TSVpFKSwgUElEX01HTVQsIDAsICAoVUNIQVIpcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUywgSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKLQl9Ci0JZWxzZQotCXsKKy8qIG1hbmFnZW1lbnQgZnJhbWUgZG9lc24ndCBuZWVkIGVuY3J5cHRpb24uIHNvIHVzZSBSRVNFUlZFRF9XQ0lEIG5vIG1hdHRlciB1IGFyZSBzZW5kaW5nIHRvIHNwZWNpZmljIHdjaWQgb3Igbm90LiAqLworCVBJRCA9IFBJRF9NR01UOworCisJaWYgKHBNYWNFbnRyeSA9PSBOVUxMKSB7CisJCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsIGJJbnNlcnRUaW1lc3RhbXAsCisJCQkgICAgICBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwgMCwgUkVTRVJWRURfV0NJRCwKKwkJCSAgICAgIChTcmNCdWZMZW4gLSBUWElORk9fU0laRSAtIFRYV0lfU0laRSksIFBJRCwgMCwKKwkJCSAgICAgICh1OClwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLAorCQkJICAgICAgSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKKwl9IGVsc2UgeworCQkvKiBkb250IHVzZSBsb3cgcmF0ZSB0byBzZW5kIFFvUyBOdWxsIGRhdGEgZnJhbWUgKi8KIAkJUlRNUFdyaXRlVHhXSShwQWQsIHBGaXJzdFR4V0ksIEZBTFNFLCBGQUxTRSwKLQkJCQkJYkluc2VydFRpbWVzdGFtcCwgRkFMU0UsIGJBY2tSZXF1aXJlZCwgRkFMU0UsCi0JCQkJCTAsIHBNYWNFbnRyeS0+QWlkLCAoU3JjQnVmTGVuIC0gVFhJTkZPX1NJWkUgLSBUWFdJX1NJWkUpLAotCQkJCQlwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MsIDAsCi0JCQkJCShVQ0hBUilwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MsCi0JCQkJCUlGU19CQUNLT0ZGLCBGQUxTRSwgJnBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlKTsKKwkJCSAgICAgIGJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAorCQkJICAgICAgMCwgcE1hY0VudHJ5LT5BaWQsCisJCQkgICAgICAoU3JjQnVmTGVuIC0gVFhJTkZPX1NJWkUgLSBUWFdJX1NJWkUpLAorCQkJICAgICAgcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLCAwLAorCQkJICAgICAgKHU4KXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywKKwkJCSAgICAgIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlKTsKIAl9CiAKLQkvLyBOb3cgZG8gaGFyZHdhcmUtZGVwZW5lZCBraWNrIG91dC4KKwkvKiBOb3cgZG8gaGFyZHdhcmUtZGVwZW5lZCBraWNrIG91dC4gKi8KIAlIQUxfS2lja091dE1nbXRUeChwQWQsIFF1ZUlkeCwgcFBhY2tldCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pOwogCi0JLy8gTWFrZSBzdXJlIHRvIHJlbGVhc2UgTUdNVCByaW5nIHJlc291cmNlCisJLyogTWFrZSBzdXJlIHRvIHJlbGVhc2UgTUdNVCByaW5nIHJlc291cmNlICovCisvKiAgICAgIGlmICghSXJxU3RhdGUpICovCiAJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7CiAJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKIAlOZXcgRGVRdWV1ZSBQcm9jZWR1cmVzLgpAQCAtNzA4LDE3OCArNTA2LDE1MyBAQAogCQkJCQkJCQkoMikuTm9ybWFsCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotc3RhdGljIFVDSEFSIFR4UGt0Q2xhc3NpZmljYXRpb24oCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUE5ESVNfUEFDS0VUICBwUGFja2V0KQorc3RhdGljIHU4IFR4UGt0Q2xhc3NpZmljYXRpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICpwUGFja2V0KQogewotCVVDSEFSCQkJVHhGcmFtZVR5cGUgPSBUWF9VTktPV05fRlJBTUU7Ci0JVUNIQVIJCQlXY2lkOwotCU1BQ19UQUJMRV9FTlRSWQkqcE1hY0VudHJ5ID0gTlVMTDsKLQlCT09MRUFOCQkJYkhUUmF0ZSA9IEZBTFNFOworCXU4IFR4RnJhbWVUeXBlID0gVFhfVU5LT1dOX0ZSQU1FOworCXU4IFdjaWQ7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5ID0gTlVMTDsKKwlCT09MRUFOIGJIVFJhdGUgPSBGQUxTRTsKIAogCVdjaWQgPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKLQlpZiAoV2NpZCA9PSBNQ0FTVF9XQ0lEKQotCXsJLy8gSGFuZGxlIGZvciBSQSBpcyBCcm9hZGNhc3QvTXVsdGljYXN0IEFkZHJlc3MuCisJaWYgKFdjaWQgPT0gTUNBU1RfV0NJRCkgewkvKiBIYW5kbGUgZm9yIFJBIGlzIEJyb2FkY2FzdC9NdWx0aWNhc3QgQWRkcmVzcy4gKi8KIAkJcmV0dXJuIFRYX01DQVNUX0ZSQU1FOwogCX0KLQotCS8vIEhhbmRsZSBmb3IgdW5pY2FzdCBwYWNrZXRzCisJLyogSGFuZGxlIGZvciB1bmljYXN0IHBhY2tldHMgKi8KIAlwTWFjRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXTsKLQlpZiAoUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUocFBhY2tldCkpCi0JewkvLyBJdCdzIGEgc3BlY2lmaWMgcGFja2V0IG5lZWQgdG8gZm9yY2UgbG93IHJhdGUsIGkuZS4sIGJESENQRnJhbWUsIGJFQVBPTEZyYW1lLCBiV0FJRnJhbWUKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUocFBhY2tldCkpIHsJLyogSXQncyBhIHNwZWNpZmljIHBhY2tldCBuZWVkIHRvIGZvcmNlIGxvdyByYXRlLCBpLmUuLCBiREhDUEZyYW1lLCBiRUFQT0xGcmFtZSwgYldBSUZyYW1lICovCiAJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOwotCX0KLQllbHNlIGlmIChJU19IVF9SQVRFKHBNYWNFbnRyeSkpCi0JewkvLyBpdCdzIGEgMTFuIGNhcGFibGUgcGFja2V0CisJfSBlbHNlIGlmIChJU19IVF9SQVRFKHBNYWNFbnRyeSkpIHsJLyogaXQncyBhIDExbiBjYXBhYmxlIHBhY2tldCAqLwogCi0JCS8vIERlcGVuZHMgb24gSFRQaHlNb2RlIHRvIGNoZWNrIGlmIHRoZSBwZWVyIHN1cHBvcnQgdGhlIEhUUmF0ZSB0cmFuc21pc3Npb24uCi0JCS8vIAlDdXJyZW50bHkgZGlkbid0IHN1cHBvcnQgQS1NU0RVIGVtYmVkZGVkIGluIEEtTVBEVQorCQkvKiBEZXBlbmRzIG9uIEhUUGh5TW9kZSB0byBjaGVjayBpZiB0aGUgcGVlciBzdXBwb3J0IHRoZSBIVFJhdGUgdHJhbnNtaXNzaW9uLiAqLworCQkvKiAgICAgIEN1cnJlbnRseSBkaWRuJ3Qgc3VwcG9ydCBBLU1TRFUgZW1iZWRkZWQgaW4gQS1NUERVICovCiAJCWJIVFJhdGUgPSBUUlVFOwotCQlpZiAoUlRNUF9HRVRfUEFDS0VUX01PUkVEQVRBKHBQYWNrZXQpIHx8IChwTWFjRW50cnktPlBzTW9kZSA9PSBQV1JfU0FWRSkpCisJCWlmIChSVE1QX0dFVF9QQUNLRVRfTU9SRURBVEEocFBhY2tldCkKKwkJICAgIHx8IChwTWFjRW50cnktPlBzTW9kZSA9PSBQV1JfU0FWRSkpCiAJCQlUeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKLSNpZmRlZiBVQVBTRF9BUF9TVVBQT1JUCi0JCWVsc2UgaWYgKFJUTVBfR0VUX1BBQ0tFVF9FT1NQKHBQYWNrZXQpKQotCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7Ci0jZW5kaWYgLy8gVUFQU0RfQVBfU1VQUE9SVCAvLwotCQllbHNlIGlmKChwTWFjRW50cnktPlRYQkFiaXRtYXAgJiAoMTw8KFJUTVBfR0VUX1BBQ0tFVF9VUChwUGFja2V0KSkpKSAhPSAwKQorCQllbHNlIGlmICgocE1hY0VudHJ5LT4KKwkJCSAgVFhCQWJpdG1hcCAmICgxIDw8IChSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCkpKSkgIT0KKwkJCSAwKQogCQkJcmV0dXJuIFRYX0FNUERVX0ZSQU1FOwotCQllbHNlIGlmKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEKSkKKwkJZWxzZSBpZiAoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcKKwkJCSAocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpKQogCQkJcmV0dXJuIFRYX0FNU0RVX0ZSQU1FOwogCQllbHNlCiAJCQlUeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKLQl9Ci0JZWxzZQotCXsJLy8gaXQncyBhIGxlZ2FjeSBiL2cgcGFja2V0LgotCQlpZiAoKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSkgJiYgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkgJiYKLQkJCShSVE1QX0dFVF9QQUNLRVRfVFhSQVRFKHBQYWNrZXQpID49IFJBVEVfNikgJiYKLQkJCSghKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpKSkKLQkJewkvLyBpZiBwZWVyIHN1cHBvcnQgUmFsaW5rIEFnZ3JlZ2F0aW9uLCB3ZSB1c2UgaXQuCisJfSBlbHNlIHsJCS8qIGl0J3MgYSBsZWdhY3kgYi9nIHBhY2tldC4gKi8KKwkJaWYgKChDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUpICYmIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpICYmIChSVE1QX0dFVF9QQUNLRVRfVFhSQVRFKHBQYWNrZXQpID49IFJBVEVfNikgJiYgKCEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkpKSB7CS8qIGlmIHBlZXIgc3VwcG9ydCBSYWxpbmsgQWdncmVnYXRpb24sIHdlIHVzZSBpdC4gKi8KIAkJCVR4RnJhbWVUeXBlID0gVFhfUkFMSU5LX0ZSQU1FOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CiAJCX0KIAl9CiAKLQkvLyBDdXJyZW50bHksIG91ciBmcmFnbWVudCBvbmx5IHN1cHBvcnQgd2hlbiBhIHVuaWNhc3QgcGFja2V0IHNlbmQgYXMgTk9ULUFSQUxJTkssIE5PVC1BTVNEVSBhbmQgTk9ULUFNUERVLgotCWlmICgoUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KSA+IDEpICYmIChUeEZyYW1lVHlwZSA9PSBUWF9MRUdBQ1lfRlJBTUUpKQorCS8qIEN1cnJlbnRseSwgb3VyIGZyYWdtZW50IG9ubHkgc3VwcG9ydCB3aGVuIGEgdW5pY2FzdCBwYWNrZXQgc2VuZCBhcyBOT1QtQVJBTElOSywgTk9ULUFNU0RVIGFuZCBOT1QtQU1QRFUuICovCisJaWYgKChSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpID4gMSkKKwkgICAgJiYgKFR4RnJhbWVUeXBlID09IFRYX0xFR0FDWV9GUkFNRSkpCiAJCVR4RnJhbWVUeXBlID0gVFhfRlJBR19GUkFNRTsKIAogCXJldHVybiBUeEZyYW1lVHlwZTsKIH0KIAotCi1CT09MRUFOIFJUTVBfRmlsbFR4QmxrSW5mbygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBUWF9CTEsgKnBUeEJsaykKK0JPT0xFQU4gUlRNUF9GaWxsVHhCbGtJbmZvKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrKQogewotCVBBQ0tFVF9JTkZPCQkJUGFja2V0SW5mbzsKLQlQTkRJU19QQUNLRVQJCXBQYWNrZXQ7Ci0JUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnkgPSBOVUxMOworCXN0cnVjdCBydF9wYWNrZXRfaW5mbyBQYWNrZXRJbmZvOworCXZvaWQgKnBQYWNrZXQ7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5ID0gTlVMTDsKIAogCXBQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7Ci0JUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwVHhCbGstPnBTcmNCdWZIZWFkZXIsICZwVHhCbGstPlNyY0J1Zkxlbik7CisJUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwVHhCbGstPnBTcmNCdWZIZWFkZXIsCisJCQkgICAgICZwVHhCbGstPlNyY0J1Zkxlbik7CiAKLQlwVHhCbGstPldjaWQJIAkgCQk9IFJUTVBfR0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQpOwotCXBUeEJsay0+YXBpZHgJCSAJCT0gUlRNUF9HRVRfUEFDS0VUX0lGKHBQYWNrZXQpOwotCXBUeEJsay0+VXNlclByaW9yaXR5IAkJPSBSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCk7Ci0JcFR4QmxrLT5GcmFtZUdhcCA9IElGU19IVFRYT1A7CQkvLyBBU0lDIGRldGVybWluZSBGcmFtZSBHYXAKKwlwVHhCbGstPldjaWQgPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKKwlwVHhCbGstPmFwaWR4ID0gUlRNUF9HRVRfUEFDS0VUX0lGKHBQYWNrZXQpOworCXBUeEJsay0+VXNlclByaW9yaXR5ID0gUlRNUF9HRVRfUEFDS0VUX1VQKHBQYWNrZXQpOworCXBUeEJsay0+RnJhbWVHYXAgPSBJRlNfSFRUWE9QOwkvKiBBU0lDIGRldGVybWluZSBGcmFtZSBHYXAgKi8KIAogCWlmIChSVE1QX0dFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBUeEJsay0+cFBhY2tldCkpCiAJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iQ2xlYXJFQVBGcmFtZSk7CiAJZWxzZQogCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQ2xlYXJFQVBGcmFtZSk7CiAKLQkvLyBEZWZhdWx0IHRvIGNsZWFyIHRoaXMgZmxhZworCS8qIERlZmF1bHQgdG8gY2xlYXIgdGhpcyBmbGFnICovCiAJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTm9uUW9TKTsKIAotCi0JaWYgKHBUeEJsay0+V2NpZCA9PSBNQ0FTVF9XQ0lEKQotCXsKKwlpZiAocFR4QmxrLT5XY2lkID09IE1DQVNUX1dDSUQpIHsKIAkJcFR4QmxrLT5wTWFjRW50cnkgPSBOVUxMOwogCQl7Ci0jaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQwotCQkJUFVDSEFSIHBEQSA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKLQkJCWlmICgoKCpwREEgJiAweDAxKSA9PSAweDAxKSAmJiAoKnBEQSAhPSAweGZmKSkKLQkJCQlwVHhCbGstPnBUcmFuc21pdCA9ICZwQWQtPkNvbW1vbkNmZy5NQ2FzdFBoeU1vZGU7Ci0JCQllbHNlCi0jZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLwotCQkJCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF0uSFRQaHlNb2RlOworCQkJcFR4QmxrLT5wVHJhbnNtaXQgPQorCQkJICAgICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZTsKIAkJfQogCi0JCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CS8vIEFja1JlcXVpcmVkID0gRkFMU0UsIHdoZW4gYnJvYWRjYXN0IHBhY2tldCBpbiBBZGhvYyBtb2RlLgotCQkvL1RYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VMb3dSYXRlKTsKKwkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkFja1JlcXVpcmVkKTsJLyogQWNrUmVxdWlyZWQgPSBGQUxTRSwgd2hlbiBicm9hZGNhc3QgcGFja2V0IGluIEFkaG9jIG1vZGUuICovCisJCS8qVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JGb3JjZUxvd1JhdGUpOyAqLwogCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQWxsb3dGcmFnKTsKIAkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYldNTSk7Ci0JCWlmIChSVE1QX0dFVF9QQUNLRVRfTU9SRURBVEEocFBhY2tldCkpCi0JCXsKKwkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSkgewogCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7CiAJCX0KIAotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXBUeEJsay0+cE1hY0VudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcFR4QmxrLT5XY2lkXTsKIAkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcFR4QmxrLT5wTWFjRW50cnktPkhUUGh5TW9kZTsKIAogCQlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKIAotCi0JCS8vIEZvciBhbGwgdW5pY2FzdCBwYWNrZXRzLCBuZWVkIEFjayB1bmxlc3MgdGhlIEFjayBQb2xpY3kgaXMgbm90IHNldCBhcyBOT1JNQUxfQUNLLgorCQkvKiBGb3IgYWxsIHVuaWNhc3QgcGFja2V0cywgbmVlZCBBY2sgdW5sZXNzIHRoZSBBY2sgUG9saWN5IGlzIG5vdCBzZXQgYXMgTk9STUFMX0FDSy4gKi8KIAkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtwVHhCbGstPlF1ZUlkeF0gIT0gTk9STUFMX0FDSykKIAkJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CiAJCWVsc2UKIAkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOwogCi0JCXsKLQkJCS8vIElmIHN1cHBvcnQgV01NLCBlbmFibGUgaXQuCi0jaWZkZWYgUlQyODYwCi0JCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSkKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYKLQkJCQlDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkKLSNlbmRpZgotCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgorCQkgICAgKEFESE9DX09OKHBBZCkpICYmCisJCSAgICAoUlhfRklMVEVSX1RFU1RfRkxBRyhwQWQsIGZSWF9GSUxURVJfQUNDRVBUX1BST01JU0NVT1VTKSkpIHsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5QU1BYbGluaykKKwkJCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOwogCQl9CiAKLQkJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfTEVHQUNZX0ZSQU1FKQogCQl7Ci0JCQlpZiAoIChSVE1QX0dFVF9QQUNLRVRfTE9XUkFURShwUGFja2V0KSkgfHwKLSAgICAgICAgICAgICAgICAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgJiYgKHBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9DQ0spICYmIChwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gUkFURV8xKSkpCi0JCQl7CS8vIFNwZWNpZmljIHBhY2tldCwgaS5lLiwgYkRIQ1BGcmFtZSwgYkVBUE9MRnJhbWUsIGJXQUlGcmFtZSwgbmVlZCBmb3JjZSBsb3cgcmF0ZS4KLQkJCQlwVHhCbGstPnBUcmFuc21pdCA9ICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZTsKKwkJCXsKIAotCQkJCS8vIE1vZGlmeSB0aGUgV01NIGJpdCBmb3IgSUNWIGlzc3VlLiBJZiB3ZSBoYXZlIGEgcGFja2V0IHdpdGggRU9TUCBmaWVsZCBuZWVkIHRvIHNldCBhcyAxLCBob3cgdG8gaGFuZGxlIGl0Pz8/CisJCQkJLyogSWYgc3VwcG9ydCBXTU0sIGVuYWJsZSBpdC4gKi8KKwkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkKKwkJCQkgICAgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LAorCQkJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpCisJCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2gpICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX0F1dG9SYXRlU3dpdGNoKTsgKi8KKwkJCX0KKwkJfQorCisJCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0xFR0FDWV9GUkFNRSkgeworCQkJaWYgKChSVE1QX0dFVF9QQUNLRVRfTE9XUkFURShwUGFja2V0KSkgfHwgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApICYmIChwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfQ0NLKSAmJiAocE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID09IFJBVEVfMSkpKSB7CS8qIFNwZWNpZmljIHBhY2tldCwgaS5lLiwgYkRIQ1BGcmFtZSwgYkVBUE9MRnJhbWUsIGJXQUlGcmFtZSwgbmVlZCBmb3JjZSBsb3cgcmF0ZS4gKi8KKwkJCQlwVHhCbGstPnBUcmFuc21pdCA9CisJCQkJICAgICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZTsKKworCQkJCS8qIE1vZGlmeSB0aGUgV01NIGJpdCBmb3IgSUNWIGlzc3VlLiBJZiB3ZSBoYXZlIGEgcGFja2V0IHdpdGggRU9TUCBmaWVsZCBuZWVkIHRvIHNldCBhcyAxLCBob3cgdG8gaGFuZGxlIGl0Pz8/ICovCiAJCQkJaWYgKElTX0hUX1NUQShwVHhCbGstPnBNYWNFbnRyeSkgJiYKLQkJCQkJKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpKSAmJgotCQkJCQkoKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgPT0gVFJVRSkgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSkpKQorCQkJCSAgICAoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcKKwkJCQkgICAgIChwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKSkKKwkJCQkgICAgJiYgKChwQWQtPkNvbW1vbkNmZy5iUmRnID09IFRSVUUpCisJCQkJCSYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwKKwkJCQkJCQkJICAgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpKSkKIAkJCQl7CiAJCQkJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JXTU0pOwotCQkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTm9uUW9TKTsKKwkJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywKKwkJCQkJCQlmVFhfYkZvcmNlTm9uUW9TKTsKIAkJCQl9CiAJCQl9CiAKLQkJCWlmICggKElTX0hUX1JBVEUocE1hY0VudHJ5KSA9PSBGQUxTRSkgJiYKLQkJCQkoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19QSUdHWUJBQ0tfQ0FQQUJMRSkpKQotCQkJewkvLyBDdXJyZW50bHkgcGlnZ3ktYmFjayBvbmx5IHN1cHBvcnQgd2hlbiBwZWVyIGlzIG9wZXJhdGUgaW4gYi9nIG1vZGUuCisJCQlpZiAoKElTX0hUX1JBVEUocE1hY0VudHJ5KSA9PSBGQUxTRSkgJiYgKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUpKSkgewkvKiBDdXJyZW50bHkgcGlnZ3ktYmFjayBvbmx5IHN1cHBvcnQgd2hlbiBwZWVyIGlzIG9wZXJhdGUgaW4gYi9nIG1vZGUuICovCiAJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JQaWdneUJhY2spOwogCQkJfQogCi0JCQlpZiAoUlRNUF9HRVRfUEFDS0VUX01PUkVEQVRBKHBQYWNrZXQpKQotCQkJeworCQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSkgewogCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iTW9yZURhdGEpOwogCQkJfQotI2lmZGVmIFVBUFNEX0FQX1NVUFBPUlQKLQkJCWlmIChSVE1QX0dFVF9QQUNLRVRfRU9TUChwUGFja2V0KSkKLQkJCXsKLQkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYldNTV9VQVBTRF9FT1NQKTsKLQkJCX0KLSNlbmRpZiAvLyBVQVBTRF9BUF9TVVBQT1JUIC8vCi0JCX0KLQkJZWxzZSBpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9GUkFHX0ZSQU1FKQotCQl7CisJCX0gZWxzZSBpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9GUkFHX0ZSQU1FKSB7CiAJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkFsbG93RnJhZyk7CiAJCX0KIApAQCAtODg5LDQxICs2NjIsMzMgQEAKIAlyZXR1cm4gVFJVRTsKIH0KIAotCi1CT09MRUFOIENhbkRvQWdncmVnYXRlVHJhbnNtaXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gTkRJU19QQUNLRVQgKnBQYWNrZXQsCi0JSU4gVFhfQkxLCQkqcFR4QmxrKQorQk9PTEVBTiBDYW5Eb0FnZ3JlZ2F0ZVRyYW5zbWl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICBjaGFyICogcFBhY2tldCwgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrKQogewogCi0JLy9wcmludGsoIkNoZWNrIGlmIGNhbiBkbyBhZ2dyZWdhdGlvbiEgVHhGcmFtZVR5cGU9JWQhXG4iLCBwVHhCbGstPlR4RnJhbWVUeXBlKTsKKwkvKkRCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoZWNrIGlmIGNhbiBkbyBhZ2dyZWdhdGlvbiEgVHhGcmFtZVR5cGU9JWQhXG4iLCBwVHhCbGstPlR4RnJhbWVUeXBlKSk7ICovCiAKIAlpZiAoUlRNUF9HRVRfUEFDS0VUX1dDSUQocFBhY2tldCkgPT0gTUNBU1RfV0NJRCkKIAkJcmV0dXJuIEZBTFNFOwogCiAJaWYgKFJUTVBfR0VUX1BBQ0tFVF9ESENQKHBQYWNrZXQpIHx8Ci0JCVJUTVBfR0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0KSB8fAotCQlSVE1QX0dFVF9QQUNLRVRfV0FJKHBQYWNrZXQpKQorCSAgICBSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFBhY2tldCkgfHwgUlRNUF9HRVRfUEFDS0VUX1dBSShwUGFja2V0KSkKIAkJcmV0dXJuIEZBTFNFOwogCi0JaWYgKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKSAmJgotCQkoKHBUeEJsay0+VG90YWxGcmFtZUxlbiArIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpKT4gKFJYX0JVRkZFUl9BR0dSRVNJWkUgLSAxMDApKSkKLQl7CS8vIEZvciBBTVNEVSwgYWxsb3cgdGhlIHBhY2tldHMgd2l0aCB0b3RhbCBsZW5ndGggPCBtYXgtYW1zZHUgc2l6ZQorCWlmICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkgJiYgKChwVHhCbGstPlRvdGFsRnJhbWVMZW4gKyBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSkgPiAoUlhfQlVGRkVSX0FHR1JFU0laRSAtIDEwMCkpKSB7CS8qIEZvciBBTVNEVSwgYWxsb3cgdGhlIHBhY2tldHMgd2l0aCB0b3RhbCBsZW5ndGggPCBtYXgtYW1zZHUgc2l6ZSAqLwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCi0JaWYgKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRSkgJiYKLQkJKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA9PSAyKSkKLQl7CS8vIEZvciBSQUxJTkstQWdncmVnYXRpb24sIGFsbG93IHR3byBmcmFtZXMgaW4gb25lIGJhdGNoLgorCWlmICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpICYmIChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIgPT0gMikpIHsJLyogRm9yIFJBTElOSy1BZ2dyZWdhdGlvbiwgYWxsb3cgdHdvIGZyYW1lcyBpbiBvbmUgYmF0Y2guICovCiAJCXJldHVybiBGQUxTRTsKIAl9CiAKLQlpZiAoKElORlJBX09OKHBBZCkpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkgLy8gbXVzdCBiZSB1bmljYXN0IHRvIEFQCisJaWYgKChJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCS8qIG11c3QgYmUgdW5pY2FzdCB0byBBUCAqLwogCQlyZXR1cm4gVFJVRTsKIAllbHNlCiAJCXJldHVybiBGQUxTRTsKLX0KIAorfQogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtOTQ3LDUzICs3MTIsNDIgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgUlRNUERlUXVldWVQYWNrZXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIEJPT0xFQU4gICAgICAgICBiSW50Q29udGV4dCwKLQlJTiAgVUNIQVIJCQlRSWR4LCAvKiBCdWxrT3V0UGlwZUlkICovCi0JSU4gIFVDSEFSICAgICAgICAgICBNYXhfVHhfUGFja2V0cykKK3ZvaWQgUlRNUERlUXVldWVQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJJbnRDb250ZXh0LCB1OCBRSWR4LAkvKiBCdWxrT3V0UGlwZUlkICovCisJCSAgICAgICB1OCBNYXhfVHhfUGFja2V0cykKIHsKLQlQUVVFVUVfRU5UUlkgICAgcEVudHJ5ID0gTlVMTDsKLQlQTkRJU19QQUNLRVQgCXBQYWNrZXQ7Ci0JTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JVUNIQVIgICAgICAgICAgIENvdW50PTA7Ci0JUFFVRVVFX0hFQURFUiAgIHBRdWV1ZTsKLQlVTE9ORyAgICAgICAgICAgRnJlZU51bWJlcltOVU1fT0ZfVFhfUklOR107Ci0JVUNIQVIJCQlRdWVJZHgsIHNRSWR4LCBlUUlkeDsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzID0gMDsKLQlCT09MRUFOCQkJaGFzVHhEZXNjID0gRkFMU0U7Ci0JVFhfQkxLCQkJVHhCbGs7Ci0JVFhfQkxLCQkJKnBUeEJsazsKKwlzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKnBFbnRyeSA9IE5VTEw7CisJdm9pZCAqcFBhY2tldDsKKwlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwl1OCBDb3VudCA9IDA7CisJc3RydWN0IHJ0X3F1ZXVlX2hlYWRlciAqcFF1ZXVlOworCXVuc2lnbmVkIGxvbmcgRnJlZU51bWJlcltOVU1fT0ZfVFhfUklOR107CisJdTggUXVlSWR4LCBzUUlkeCwgZVFJZHg7CisJdW5zaWduZWQgbG9uZyBJcnFGbGFncyA9IDA7CisJQk9PTEVBTiBoYXNUeERlc2MgPSBGQUxTRTsKKwlzdHJ1Y3QgcnRfdHhfYmxrIFR4QmxrOworCXN0cnVjdCBydF90eF9ibGsgKnBUeEJsazsKIAotCi0KLQlpZiAoUUlkeCA9PSBOVU1fT0ZfVFhfUklORykKLQl7CisJaWYgKFFJZHggPT0gTlVNX09GX1RYX1JJTkcpIHsKIAkJc1FJZHggPSAwOwotLy9QUyBwYWNrZXRzIHVzZSBIQ0NBIHF1ZXVlIHdoZW4gZGVxdWV1ZSBmcm9tIFBTIHVuaWNhc3QgcXVldWUgKFdpRmkgV1BBMiBNQTlfRFQxIGZvciBNYXJ2ZWxsIEIgU1RBKQotCQllUUlkeCA9IDM7CS8vIDQgQUNzLCBzdGFydCBmcm9tIDAuCi0JfQotCWVsc2UKLQl7CisJCWVRSWR4ID0gMzsJLyogNCBBQ3MsIHN0YXJ0IGZyb20gMC4gKi8KKwl9IGVsc2UgewogCQlzUUlkeCA9IGVRSWR4ID0gUUlkeDsKIAl9CiAKLQlmb3IgKFF1ZUlkeD1zUUlkeDsgUXVlSWR4IDw9IGVRSWR4OyBRdWVJZHgrKykKLQl7Ci0JCUNvdW50PTA7CisJZm9yIChRdWVJZHggPSBzUUlkeDsgUXVlSWR4IDw9IGVRSWR4OyBRdWVJZHgrKykgeworCQlDb3VudCA9IDA7CiAKLQkJUlQyOFhYX1NUQVJUX0RFUVVFVUUocEFkLCBRdWVJZHgsIElycUZsYWdzKTsKKwkJUlRNUF9TVEFSVF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBJcnFGbGFncyk7CiAKLQotCQl3aGlsZSAoMSkKLQkJewotCQkJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8Ci0JCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCi0JCQl7Ci0JCQkJUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOworCQl3aGlsZSAoMSkgeworCQkJaWYgKChSVE1QX1RFU1RfRkxBRworCQkJICAgICAocEFkLAorCQkJICAgICAgKGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MgfAorCQkJICAgICAgIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKKwkJCSAgICAgICBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCSAgICAgICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJICAgICAgIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkgeworCQkJCVJUTVBfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBJcnFGbGFncyk7CiAJCQkJcmV0dXJuOwogCQkJfQogCkBAIC0xMDAxLDQzICs3NTUsNDcgQEAKIAkJCQlicmVhazsKIAogCQkJREVRVUVVRV9MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOwotCQkJaWYgKCZwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdID09IE5VTEwpCi0JCQl7Ci0JCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQlpZiAoJnBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0gPT0gTlVMTCkgeworCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwKKwkJCQkJICAgICAgIElycUZsYWdzKTsKIAkJCQlicmVhazsKIAkJCX0KLSNpZmRlZiBSVDI4NjAKKyNpZmRlZiBSVE1QX01BQ19QQ0kKIAkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKIAotCi0JCQlpZiAoRnJlZU51bWJlcltRdWVJZHhdIDw9IDUpCi0JCQl7Ci0JCQkJLy8gZnJlZSBUeChRdWVJZHgpIHJlc291cmNlcworCQkJaWYgKEZyZWVOdW1iZXJbUXVlSWR4XSA8PSA1KSB7CisJCQkJLyogZnJlZSBUeChRdWVJZHgpIHJlc291cmNlcyAqLwogCQkJCVJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZShwQWQsIFF1ZUlkeCk7Ci0JCQkJRnJlZU51bWJlcltRdWVJZHhdID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOworCQkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9CisJCQkJICAgIEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKIAkJCX0KLSNlbmRpZiAvKiBSVDI4NjAgKi8KLQkJCS8vIHByb2JlIHRoZSBRdWV1ZSBIZWFkCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisKKwkJCS8qIHByb2JlIHRoZSBRdWV1ZSBIZWFkICovCiAJCQlwUXVldWUgPSAmcEFkLT5UeFN3UXVldWVbUXVlSWR4XTsKLQkJCWlmICgocEVudHJ5ID0gcFF1ZXVlLT5IZWFkKSA9PSBOVUxMKQotCQkJewotCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworCQkJaWYgKChwRW50cnkgPSBwUXVldWUtPkhlYWQpID09IE5VTEwpIHsKKwkJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsCisJCQkJCSAgICAgICBJcnFGbGFncyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKIAkJCXBUeEJsayA9ICZUeEJsazsKLQkJCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpcFR4QmxrLCBzaXplb2YoVFhfQkxLKSk7CisJCQlOZGlzWmVyb01lbW9yeSgodTggKilwVHhCbGssIHNpemVvZihzdHJ1Y3QgcnRfdHhfYmxrKSk7CisJCQkvKkluaXRpYWxpemVRdWV1ZUhlYWRlcigmcFR4QmxrLT5UeFBhY2tldExpc3QpOyAgICAgICAgIC8vIERpZG4ndCBuZWVkIGl0IGJlY2F1c2Ugd2UgYWxyZWFkeSBtZW16ZXJvIGl0LiAqLwogCQkJcFR4QmxrLT5RdWVJZHggPSBRdWVJZHg7CiAKLQkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QS1QocEVudHJ5KTsKKwkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KTsKIAotCQkJLy8gRWFybHkgY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhdmUgZW5vZ3VoIFR4IFJlc291cmNlLgotCQkJaGFzVHhEZXNjID0gUlQyOFhYX0hBU19FTk9VR0hfRlJFRV9ERVNDKHBBZCwgcFR4QmxrLCBGcmVlTnVtYmVyW1F1ZUlkeF0sIHBQYWNrZXQpOwotCQkJaWYgKCFoYXNUeERlc2MpCi0JCQl7CisJCQkvKiBFYXJseSBjaGVjayB0byBtYWtlIHN1cmUgd2UgaGF2ZSBlbm9ndWggVHggUmVzb3VyY2UuICovCisJCQloYXNUeERlc2MgPQorCQkJICAgIFJUTVBfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLCBwVHhCbGssCisJCQkJCQkgICAgICBGcmVlTnVtYmVyW1F1ZUlkeF0sCisJCQkJCQkgICAgICBwUGFja2V0KTsKKwkJCWlmICghaGFzVHhEZXNjKSB7CiAJCQkJcEFkLT5Qcml2YXRlSW5mby5UeFJpbmdGdWxsQ250Kys7CiAKLQkJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKKwkJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsCisJCQkJCSAgICAgICBJcnFGbGFncyk7CiAKIAkJCQlicmVhazsKIAkJCX0KQEAgLTEwNDUsNzQgKzgwMyw4OSBAQAogCQkJcFR4QmxrLT5UeEZyYW1lVHlwZSA9IFR4UGt0Q2xhc3NpZmljYXRpb24ocEFkLCBwUGFja2V0KTsKIAkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZShwUXVldWUpOwogCQkJcFR4QmxrLT5Ub3RhbEZyYW1lTnVtKys7Ci0JCQlwVHhCbGstPlRvdGFsRnJhZ051bSArPSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpOwkvLyBUaGUgcmVhbCBmcmFnbWVudCBudW1iZXIgbWF5YmUgdmFyeQorCQkJcFR4QmxrLT5Ub3RhbEZyYWdOdW0gKz0gUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KTsJLyogVGhlIHJlYWwgZnJhZ21lbnQgbnVtYmVyIG1heWJlIHZhcnkgKi8KIAkJCXBUeEJsay0+VG90YWxGcmFtZUxlbiArPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKIAkJCXBUeEJsay0+cFBhY2tldCA9IHBQYWNrZXQ7Ci0JCQlJbnNlcnRUYWlsUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0LCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOworCQkJSW5zZXJ0VGFpbFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCwKKwkJCQkJUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpKTsKIAotCQkJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfUkFMSU5LX0ZSQU1FIHx8IHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1TRFVfRlJBTUUpCi0JCQl7Ci0JCQkJLy8gRW5oYW5jZSBTVyBBZ2dyZWdhdGlvbiBNZWNoYW5pc20KLQkJCQlpZiAoTkVFRF9RVUVVRV9CQUNLX0ZPUl9BR0cocEFkLCBRdWVJZHgsIEZyZWVOdW1iZXJbUXVlSWR4XSwgcFR4QmxrLT5UeEZyYW1lVHlwZSkpCi0JCQkJewotCQkJCQlJbnNlcnRIZWFkUXVldWUocFF1ZXVlLCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOwotCQkJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKKwkJCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRQorCQkJICAgIHx8IHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1TRFVfRlJBTUUpIHsKKwkJCQkvKiBFbmhhbmNlIFNXIEFnZ3JlZ2F0aW9uIE1lY2hhbmlzbSAqLworCQkJCWlmIChORUVEX1FVRVVFX0JBQ0tfRk9SX0FHRworCQkJCSAgICAocEFkLCBRdWVJZHgsIEZyZWVOdW1iZXJbUXVlSWR4XSwKKwkJCQkgICAgIHBUeEJsay0+VHhGcmFtZVR5cGUpKSB7CisJCQkJCUluc2VydEhlYWRRdWV1ZShwUXVldWUsCisJCQkJCQkJUEFDS0VUX1RPX1FVRVVFX0VOVFJZCisJCQkJCQkJKHBQYWNrZXQpKTsKKwkJCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssCisJCQkJCQkgICAgICAgYkludENvbnRleHQsIElycUZsYWdzKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCi0JCQkJZG97Ci0JCQkJCWlmKChwRW50cnkgPSBwUXVldWUtPkhlYWQpID09IE5VTEwpCisJCQkJZG8geworCQkJCQlpZiAoKHBFbnRyeSA9IHBRdWV1ZS0+SGVhZCkgPT0gTlVMTCkKIAkJCQkJCWJyZWFrOwogCi0JCQkJCS8vIEZvciBUWF9BTVNEVV9GUkFNRS9UWF9SQUxJTktfRlJBTUUsIE5lZWQgdG8gY2hlY2sgaWYgbmV4dCBwYWtjZXQgY2FuIGRvIGFnZ3JlZ2F0aW9uLgotCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEtUKHBFbnRyeSk7Ci0JCQkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKLQkJCQkJaGFzVHhEZXNjID0gUlQyOFhYX0hBU19FTk9VR0hfRlJFRV9ERVNDKHBBZCwgcFR4QmxrLCBGcmVlTnVtYmVyW1F1ZUlkeF0sIHBQYWNrZXQpOwotCQkJCQlpZiAoKGhhc1R4RGVzYyA9PSBGQUxTRSkgfHwgKENhbkRvQWdncmVnYXRlVHJhbnNtaXQocEFkLCBwUGFja2V0LCBwVHhCbGspID09IEZBTFNFKSkKKwkJCQkJLyogRm9yIFRYX0FNU0RVX0ZSQU1FL1RYX1JBTElOS19GUkFNRSwgTmVlZCB0byBjaGVjayBpZiBuZXh0IHBha2NldCBjYW4gZG8gYWdncmVnYXRpb24uICovCisJCQkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KTsKKwkJCQkJRnJlZU51bWJlcltRdWVJZHhdID0KKwkJCQkJICAgIEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJCQkJaGFzVHhEZXNjID0KKwkJCQkJICAgIFJUTVBfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLAorCQkJCQkJCQkgICAgICBwVHhCbGssCisJCQkJCQkJCSAgICAgIEZyZWVOdW1iZXIKKwkJCQkJCQkJICAgICAgW1F1ZUlkeF0sCisJCQkJCQkJCSAgICAgIHBQYWNrZXQpOworCQkJCQlpZiAoKGhhc1R4RGVzYyA9PSBGQUxTRSkKKwkJCQkJICAgIHx8CisJCQkJCSAgICAoQ2FuRG9BZ2dyZWdhdGVUcmFuc21pdAorCQkJCQkgICAgIChwQWQsIHBQYWNrZXQsIHBUeEJsaykgPT0gRkFMU0UpKQogCQkJCQkJYnJlYWs7CiAKLQkJCQkJLy9SZW1vdmUgdGhlIHBhY2tldCBmcm9tIHRoZSBUeFN3UXVldWUgYW5kIGluc2VydCBpbnRvIHBUeEJsaworCQkJCQkvKlJlbW92ZSB0aGUgcGFja2V0IGZyb20gdGhlIFR4U3dRdWV1ZSBhbmQgaW5zZXJ0IGludG8gcFR4QmxrICovCiAJCQkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZShwUXVldWUpOwogCQkJCQlBU1NFUlQocEVudHJ5KTsKLQkJCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BLVChwRW50cnkpOworCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7CiAJCQkJCXBUeEJsay0+VG90YWxGcmFtZU51bSsrOwotCQkJCQlwVHhCbGstPlRvdGFsRnJhZ051bSArPSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpOwkvLyBUaGUgcmVhbCBmcmFnbWVudCBudW1iZXIgbWF5YmUgdmFyeQotCQkJCQlwVHhCbGstPlRvdGFsRnJhbWVMZW4gKz0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7Ci0JCQkJCUluc2VydFRhaWxRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7Ci0JCQkJfXdoaWxlKDEpOworCQkJCQlwVHhCbGstPlRvdGFsRnJhZ051bSArPSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpOwkvKiBUaGUgcmVhbCBmcmFnbWVudCBudW1iZXIgbWF5YmUgdmFyeSAqLworCQkJCQlwVHhCbGstPlRvdGFsRnJhbWVMZW4gKz0KKwkJCQkJICAgIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCQkJCQlJbnNlcnRUYWlsUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0LAorCQkJCQkJCVBBQ0tFVF9UT19RVUVVRV9FTlRSWQorCQkJCQkJCShwUGFja2V0KSk7CisJCQkJfSB3aGlsZSAoMSk7CiAKIAkJCQlpZiAocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyID09IDEpCiAJCQkJCXBUeEJsay0+VHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CiAJCQl9Ci0KLSNpZmRlZiBSVDI4NzAKKyNpZmRlZiBSVE1QX01BQ19VU0IKIAkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAJCQlDb3VudCArPSBwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXI7CiAKLQkJCS8vIERvIEhhcmRUcmFuc21pdCBub3cuCisJCQkvKiBEbyBIYXJkVHJhbnNtaXQgbm93LiAqLwogCQkJU3RhdHVzID0gU1RBSGFyZFRyYW5zbWl0KHBBZCwgcFR4QmxrLCBRdWVJZHgpOwogCi0jaWZkZWYgUlQyODYwCisjaWZkZWYgUlRNUF9NQUNfUENJCiAJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKLQkJCS8vIHN0YXRpYyByYXRlIGFsc28gbmVlZCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoKSBmdW5jdGlvbi4KLQkJCS8vaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkpCi0JCQkJTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKHBBZCk7Ci0jZW5kaWYKKwkJCS8qIHN0YXRpYyByYXRlIGFsc28gbmVlZCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoKSBmdW5jdGlvbi4gKi8KKwkJCS8qaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkpICovCisJCQlOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMocEFkKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKwogCQl9CiAKLQkJUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOworCQlSVE1QX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOwogCi0jaWZkZWYgUlQyODcwCisjaWZkZWYgUlRNUF9NQUNfVVNCCiAJCWlmICghaGFzVHhEZXNjKQogCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOwotI2VuZGlmIC8vIFJUMjg3MCAvLworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCX0KIAogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTExMzUsNDAgKzkwOCwzNyBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVVNIT1JUCVJUTVBDYWxjRHVyYXRpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlSYXRlLAotCUlOCVVMT05HCQkJU2l6ZSkKK3UxNiBSVE1QQ2FsY0R1cmF0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggUmF0ZSwgdW5zaWduZWQgbG9uZyBTaXplKQogewotCVVMT05HCUR1cmF0aW9uID0gMDsKKwl1bnNpZ25lZCBsb25nIER1cmF0aW9uID0gMDsKIAotCWlmIChSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpIC8vIENDSworCWlmIChSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpCS8qIENDSyAqLwogCXsKLQkJaWYgKChSYXRlID4gUkFURV8xKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCkpCi0JCQlEdXJhdGlvbiA9IDk2OwkvLyA3MisyNCBwcmVhbWJsZStwbGNwCisJCWlmICgoUmF0ZSA+IFJBVEVfMSkKKwkJICAgICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsCisJCQkJCSAgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpKQorCQkJRHVyYXRpb24gPSA5NjsJLyogNzIrMjQgcHJlYW1ibGUrcGxjcCAqLwogCQllbHNlCi0JCQlEdXJhdGlvbiA9IDE5MjsgLy8gMTQ0KzQ4IHByZWFtYmxlK3BsY3AKKwkJCUR1cmF0aW9uID0gMTkyOwkvKiAxNDQrNDggcHJlYW1ibGUrcGxjcCAqLwogCi0JCUR1cmF0aW9uICs9IChVU0hPUlQpKChTaXplIDw8IDQpIC8gUmF0ZUlkVG81MDBLYnBzW1JhdGVdKTsKKwkJRHVyYXRpb24gKz0gKHUxNikoKFNpemUgPDwgNCkgLyBSYXRlSWRUbzUwMEticHNbUmF0ZV0pOwogCQlpZiAoKFNpemUgPDwgNCkgJSBSYXRlSWRUbzUwMEticHNbUmF0ZV0pCi0JCQlEdXJhdGlvbiArKzsKLQl9Ci0JZWxzZSBpZiAoUmF0ZSA8PSBSQVRFX0xBU1RfT0ZETV9SQVRFKS8vIE9GRE0gcmF0ZXMKKwkJCUR1cmF0aW9uKys7CisJfSBlbHNlIGlmIChSYXRlIDw9IFJBVEVfTEFTVF9PRkRNX1JBVEUpCS8qIE9GRE0gcmF0ZXMgKi8KIAl7Ci0JCUR1cmF0aW9uID0gMjAgKyA2OwkJLy8gMTYrNCBwcmVhbWJsZStwbGNwICsgU2lnbmFsIEV4dGVuc2lvbgotCQlEdXJhdGlvbiArPSA0ICogKFVTSE9SVCkoKDExICsgU2l6ZSAqIDQpIC8gUmF0ZUlkVG81MDBLYnBzW1JhdGVdKTsKKwkJRHVyYXRpb24gPSAyMCArIDY7CS8qIDE2KzQgcHJlYW1ibGUrcGxjcCArIFNpZ25hbCBFeHRlbnNpb24gKi8KKwkJRHVyYXRpb24gKz0KKwkJICAgIDQgKiAodTE2KSgoMTEgKyBTaXplICogNCkgLyBSYXRlSWRUbzUwMEticHNbUmF0ZV0pOwogCQlpZiAoKDExICsgU2l6ZSAqIDQpICUgUmF0ZUlkVG81MDBLYnBzW1JhdGVdKQogCQkJRHVyYXRpb24gKz0gNDsKLQl9Ci0JZWxzZQkvL21pbW8gcmF0ZQorCX0gZWxzZQkJCS8qbWltbyByYXRlICovCiAJewotCQlEdXJhdGlvbiA9IDIwICsgNjsJCS8vIDE2KzQgcHJlYW1ibGUrcGxjcCArIFNpZ25hbCBFeHRlbnNpb24KKwkJRHVyYXRpb24gPSAyMCArIDY7CS8qIDE2KzQgcHJlYW1ibGUrcGxjcCArIFNpZ25hbCBFeHRlbnNpb24gKi8KIAl9CiAKLQlyZXR1cm4gKFVTSE9SVClEdXJhdGlvbjsKKwlyZXR1cm4gKHUxNilEdXJhdGlvbjsKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0xMTk0LDU4ICs5NjQsNTMgQEAKIAlJUlFMID0gUEFTU0lWRV9MRVZFTAogCUlSUUwgPSBESVNQQVRDSF9MRVZFTAogCi0gICAgU2VlIGFsc28gOiBCQVNtYXJ0SGFyZFRyYW5zbWl0KCkgICAgISEhCisgICAgU2VlIGFsc28gOiBCQVNtYXJ0SGFyZFRyYW5zbWl0KCkgICAgIQogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBSVE1QV3JpdGVUeFdJKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBUWFdJX1NUUlVDIAlwT3V0VHhXSSwKLQlJTglCT09MRUFOCQkJRlJBRywKLQlJTglCT09MRUFOCQkJQ0ZBQ0ssCi0JSU4JQk9PTEVBTgkJCUluc1RpbWVzdGFtcCwKLQlJTglCT09MRUFOIAkJQU1QRFUsCi0JSU4JQk9PTEVBTiAJCUFjaywKLQlJTglCT09MRUFOIAkJTlNlcSwJCS8vIEhXIG5ldyBhIHNlcXVlbmNlLgotCUlOCVVDSEFSCQkJQkFTaXplLAotCUlOCVVDSEFSCQkJV0NJRCwKLQlJTglVTE9ORwkJCUxlbmd0aCwKLQlJTglVQ0hBUiAJCQlQSUQsCi0JSU4JVUNIQVIJCQlUSUQsCi0JSU4JVUNIQVIJCQlUeFJhdGUsCi0JSU4JVUNIQVIJCQlUeG9wbW9kZSwKLQlJTglCT09MRUFOCQkJQ2ZBY2ssCi0JSU4JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQpCit2b2lkIFJUTVBXcml0ZVR4V0koc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfdHh3aSAqIHBPdXRUeFdJLCBJTiBCT09MRUFOIEZSQUcsIElOIEJPT0xFQU4gQ0ZBQ0ssIElOIEJPT0xFQU4gSW5zVGltZXN0YW1wLCBJTiBCT09MRUFOIEFNUERVLCBJTiBCT09MRUFOIEFjaywgSU4gQk9PTEVBTiBOU2VxLAkvKiBIVyBuZXcgYSBzZXF1ZW5jZS4gKi8KKwkJICAgdTggQkFTaXplLAorCQkgICB1OCBXQ0lELAorCQkgICB1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJICAgdTggUElELAorCQkgICB1OCBUSUQsCisJCSAgIHU4IFR4UmF0ZSwKKwkJICAgdTggVHhvcG1vZGUsCisJCSAgIElOIEJPT0xFQU4gQ2ZBY2ssIElOIEhUVFJBTlNNSVRfU0VUVElORyAqIHBUcmFuc21pdCkKIHsKLQlQTUFDX1RBQkxFX0VOVFJZCXBNYWMgPSBOVUxMOwotCVRYV0lfU1RSVUMgCQlUeFdJOwotCVBUWFdJX1NUUlVDIAlwVHhXSTsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwTWFjID0gTlVMTDsKKwlzdHJ1Y3QgcnRfdHh3aSBUeFdJOworCXN0cnVjdCBydF90eHdpICogcFR4V0k7CiAKIAlpZiAoV0NJRCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQogCQlwTWFjID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbV0NJRF07CiAKLQkvLwotCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgotCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcwotCS8vCisJLyogKi8KKwkvKiBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4gKi8KKwkvKiBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MgKi8KKwkvKiAqLwogCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7CiAJTmRpc1plcm9NZW1vcnkoJlR4V0ksIFRYV0lfU0laRSk7CiAJcFR4V0kgPSAmVHhXSTsKIAotCXBUeFdJLT5GUkFHPSBGUkFHOworCXBUeFdJLT5GUkFHID0gRlJBRzsKIAogCXBUeFdJLT5DRkFDSyA9IENGQUNLOwotCXBUeFdJLT5UUz0gSW5zVGltZXN0YW1wOworCXBUeFdJLT5UUyA9IEluc1RpbWVzdGFtcDsKIAlwVHhXSS0+QU1QRFUgPSBBTVBEVTsKIAlwVHhXSS0+QUNLID0gQWNrOwotCXBUeFdJLT50eG9wPSBUeG9wbW9kZTsKKwlwVHhXSS0+dHhvcCA9IFR4b3Btb2RlOwogCiAJcFR4V0ktPk5TRVEgPSBOU2VxOwotCS8vIEpvaG4gdHVuZSB0aGUgcGVyZm9ybWFjZSB3aXRoIEludGVsIENsaWVudCBpbiAyMCBNSHogcGVyZm9ybWFuY2UKKwkvKiBKb2huIHR1bmUgdGhlIHBlcmZvcm1hY2Ugd2l0aCBJbnRlbCBDbGllbnQgaW4gMjAgTUh6IHBlcmZvcm1hbmNlICovCiAJQkFTaXplID0gcEFkLT5Db21tb25DZmcuVHhCQVNpemU7Ci0KLQlpZiggQkFTaXplID43ICkKLQkJQkFTaXplID03OworCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODcyMDIwMCkgeworCQlpZiAoQkFTaXplID4gMTMpCisJCQlCQVNpemUgPSAxMzsKKwl9IGVsc2UgeworCQlpZiAoQkFTaXplID4gNykKKwkJCUJBU2l6ZSA9IDc7CisJfQogCXBUeFdJLT5CQVdpblNpemUgPSBCQVNpemU7CiAJcFR4V0ktPlNob3J0R0kgPSBwVHJhbnNtaXQtPmZpZWxkLlNob3J0R0k7CiAJcFR4V0ktPlNUQkMgPSBwVHJhbnNtaXQtPmZpZWxkLlNUQkM7CkBAIC0xMjU0LDkwICsxMDE5LDg0IEBACiAJcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IExlbmd0aDsKIAlwVHhXSS0+UGFja2V0SWQgPSBQSUQ7CiAKLQkvLyBJZiBDQ0sgb3IgT0ZETSwgQlcgbXVzdCBiZSAyMAotCXBUeFdJLT5CVyA9IChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisJLyogSWYgQ0NLIG9yIE9GRE0sIEJXIG11c3QgYmUgMjAgKi8KKwlwVHhXSS0+QlcgPQorCSAgICAocFRyYW5zbWl0LT5maWVsZC5NT0RFIDw9CisJICAgICBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKIAogCXBUeFdJLT5NQ1MgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKIAlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKIAlwVHhXSS0+Q0ZBQ0sgPSBDZkFjazsKIAotCWlmIChwTWFjKQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUpCi0JCXsKLQkJCWlmICgocE1hYy0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKLQkJCXsKLQkJCQkvLyBEeW5hbWljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJaWYgKHBNYWMpIHsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUpIHsKKwkJCWlmICgocE1hYy0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKQorCQkJICAgICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKSB7CisJCQkJLyogRHluYW1pYyBNSU1PIFBvd2VyIFNhdmUgTW9kZSAqLwogCQkJCXBUeFdJLT5NSU1PcHMgPSAxOwotCQkJfQotCQkJZWxzZSBpZiAocE1hYy0+TW1wc01vZGUgPT0gTU1QU19TVEFUSUMpCi0JCQl7Ci0JCQkJLy8gU3RhdGljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCi0JCQkJaWYgKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYICYmIHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykKLQkJCQl7CisJCQl9IGVsc2UgaWYgKHBNYWMtPk1tcHNNb2RlID09IE1NUFNfU1RBVElDKSB7CisJCQkJLyogU3RhdGljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlICovCisJCQkJaWYgKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYCisJCQkJICAgICYmIHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykgewogCQkJCQlwVHhXSS0+TUNTID0gNzsKIAkJCQkJcFR4V0ktPk1JTU9wcyA9IDA7CiAJCQkJfQogCQkJfQogCQl9Ci0JCS8vcFR4V0ktPk1JTU9wcyA9IChwTWFjLT5Qc01vZGUgPT0gUFdSX01NUFMpPyAxOjA7Ci0JCWlmIChwTWFjLT5iSUFtQmFkQXRoZXJvcyAmJiAocE1hYy0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpCi0JCXsKKwkJLypwVHhXSS0+TUlNT3BzID0gKHBNYWMtPlBzTW9kZSA9PSBQV1JfTU1QUyk/IDE6MDsgKi8KKwkJaWYgKHBNYWMtPmJJQW1CYWRBdGhlcm9zCisJCSAgICAmJiAocE1hYy0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpIHsKIAkJCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDc7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlwVHhXSS0+TXBkdURlbnNpdHkgPSBwTWFjLT5NcGR1RGVuc2l0eTsKIAkJfQogCX0KIAogCXBUeFdJLT5QYWNrZXRJZCA9IHBUeFdJLT5NQ1M7Ci0JTmRpc01vdmVNZW1vcnkocE91dFR4V0ksICZUeFdJLCBzaXplb2YoVFhXSV9TVFJVQykpOworCU5kaXNNb3ZlTWVtb3J5KHBPdXRUeFdJLCAmVHhXSSwgc2l6ZW9mKHN0cnVjdCBydF90eHdpKSk7CiB9CiAKLQotVk9JRCBSVE1QV3JpdGVUeFdJX0RhdGEoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCi0JSU4JVFhfQkxLCQkJCSpwVHhCbGspCit2b2lkIFJUTVBXcml0ZVR4V0lfRGF0YShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgcnRfdHh3aSAqIHBUeFdJLCBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspCiB7Ci0JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQ7Ci0JUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnk7Ci0JVUNIQVIJCQkJQkFTaXplOworCUhUVFJBTlNNSVRfU0VUVElORyAqcFRyYW5zbWl0OworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBNYWNFbnRyeTsKKwl1OCBCQVNpemU7CiAKIAlBU1NFUlQocFR4V0kpOwogCiAJcFRyYW5zbWl0ID0gcFR4QmxrLT5wVHJhbnNtaXQ7CiAJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7CiAKLQotCS8vCi0JLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCi0JLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCi0JLy8KKwkvKiAqLworCS8qIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLiAqLworCS8qIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyAqLworCS8qICovCiAJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKIAlOZGlzWmVyb01lbW9yeShwVHhXSSwgVFhXSV9TSVpFKTsKIAotCXBUeFdJLT5GUkFHCQk9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkFsbG93RnJhZyk7Ci0JcFR4V0ktPkFDSwkJPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7Ci0JcFR4V0ktPnR4b3AJCT0gcFR4QmxrLT5GcmFtZUdhcDsKKwlwVHhXSS0+RlJBRyA9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkFsbG93RnJhZyk7CisJcFR4V0ktPkFDSyA9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkFja1JlcXVpcmVkKTsKKwlwVHhXSS0+dHhvcCA9IHBUeEJsay0+RnJhbWVHYXA7CiAKLQkJcFR4V0ktPldpcmVsZXNzQ2xpSUQJCT0gcFR4QmxrLT5XY2lkOworCXBUeFdJLT5XaXJlbGVzc0NsaUlEID0gcFR4QmxrLT5XY2lkOwogCi0JcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudAk9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOwotCXBUeFdJLT5DRkFDSwkJCQk9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYlBpZ2d5QmFjayk7CisJcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOworCXBUeFdJLT5DRkFDSyA9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYlBpZ2d5QmFjayk7CiAKLQkvLyBJZiBDQ0sgb3IgT0ZETSwgQlcgbXVzdCBiZSAyMAotCXBUeFdJLT5CVyA9IChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7Ci0JcFR4V0ktPkFNUERVCT0gKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNUERVX0ZSQU1FKSA/IFRSVUUgOiBGQUxTRSk7CisJLyogSWYgQ0NLIG9yIE9GRE0sIEJXIG11c3QgYmUgMjAgKi8KKwlwVHhXSS0+QlcgPQorCSAgICAocFRyYW5zbWl0LT5maWVsZC5NT0RFIDw9CisJICAgICBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKwlwVHhXSS0+QU1QRFUgPSAoKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1QRFVfRlJBTUUpID8gVFJVRSA6IEZBTFNFKTsKIAotCS8vIEpvaG4gdHVuZSB0aGUgcGVyZm9ybWFjZSB3aXRoIEludGVsIENsaWVudCBpbiAyMCBNSHogcGVyZm9ybWFuY2UKKwkvKiBKb2huIHR1bmUgdGhlIHBlcmZvcm1hY2Ugd2l0aCBJbnRlbCBDbGllbnQgaW4gMjAgTUh6IHBlcmZvcm1hbmNlICovCiAJQkFTaXplID0gcEFkLT5Db21tb25DZmcuVHhCQVNpemU7Ci0JaWYoKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1QRFVfRlJBTUUpICYmIChwTWFjRW50cnkpKQotCXsKLQkJVUNIQVIJCVJBQkFPcmlJZHggPSAwOwkvL1RoZSBSQSdzIEJBIE9yaWdpbmF0b3IgdGFibGUgaW5kZXguCisJaWYgKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNUERVX0ZSQU1FKSAmJiAocE1hY0VudHJ5KSkgeworCQl1OCBSQUJBT3JpSWR4ID0gMDsJLypUaGUgUkEncyBCQSBPcmlnaW5hdG9yIHRhYmxlIGluZGV4LiAqLwogCi0JCVJBQkFPcmlJZHggPSBwVHhCbGstPnBNYWNFbnRyeS0+QkFPcmlXY2lkQXJyYXlbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOworCQlSQUJBT3JpSWR4ID0KKwkJICAgIHBUeEJsay0+cE1hY0VudHJ5LT5CQU9yaVdjaWRBcnJheVtwVHhCbGstPlVzZXJQcmlvcml0eV07CiAJCUJBU2l6ZSA9IHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W1JBQkFPcmlJZHhdLkJBV2luU2l6ZTsKIAl9CiAKQEAgLTEzNDksMTcyICsxMTA4LDExMiBAQAogCXBUeFdJLT5NQ1MgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKIAlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKIAotCWlmIChwTWFjRW50cnkpCi0JewotCQlpZiAoKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKLQkJewotCQkJLy8gRHluYW1pYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCWlmIChwTWFjRW50cnkpIHsKKwkJaWYgKChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfRFlOQU1JQykKKwkJICAgICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKSB7CisJCQkvKiBEeW5hbWljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlICovCiAJCQlwVHhXSS0+TUlNT3BzID0gMTsKLQkJfQotCQllbHNlIGlmIChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfU1RBVElDKQotCQl7Ci0JCQkvLyBTdGF0aWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKLQkJCWlmIChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCAmJiBwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpCi0JCQl7CisJCX0gZWxzZSBpZiAocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX1NUQVRJQykgeworCQkJLyogU3RhdGljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlICovCisJCQlpZiAocFRyYW5zbWl0LT5maWVsZC5NT0RFID49IE1PREVfSFRNSVgKKwkJCSAgICAmJiBwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpIHsKIAkJCQlwVHhXSS0+TUNTID0gNzsKIAkJCQlwVHhXSS0+TUlNT3BzID0gMDsKIAkJCX0KIAkJfQogCi0JCWlmIChwTWFjRW50cnktPmJJQW1CYWRBdGhlcm9zICYmIChwTWFjRW50cnktPldlcFN0YXR1cyAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpKQotCQl7CisJCWlmIChwTWFjRW50cnktPmJJQW1CYWRBdGhlcm9zCisJCSAgICAmJiAocE1hY0VudHJ5LT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKSkgewogCQkJcFR4V0ktPk1wZHVEZW5zaXR5ID0gNzsKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCXBUeFdJLT5NcGR1RGVuc2l0eSA9IHBNYWNFbnRyeS0+TXBkdURlbnNpdHk7CiAJCX0KIAl9CiAKLQotCS8vIGZvciByYXRlIGFkYXBhdGlvbgorCS8qIGZvciByYXRlIGFkYXBhdGlvbiAqLwogCXBUeFdJLT5QYWNrZXRJZCA9IHBUeFdJLT5NQ1M7CiB9CiAKLQotVk9JRCBSVE1QV3JpdGVUeFdJX0NhY2hlKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAotCUlOCVRYX0JMSwkJCQkqcFR4QmxrKQordm9pZCBSVE1QV3JpdGVUeFdJX0NhY2hlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSBzdHJ1Y3QgcnRfdHh3aSAqIHBUeFdJLCBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspCiB7Ci0JUEhUVFJBTlNNSVRfU0VUVElORwlwVHJhbnNtaXQ7Ci0JUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnk7CisJUEhUVFJBTlNNSVRfU0VUVElORyAvKnBUeEhUUGh5TW9kZSwgKi8gcFRyYW5zbWl0OworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBNYWNFbnRyeTsKIAotCS8vCi0JLy8gdXBkYXRlIFRYV0kKLQkvLworCS8qICovCisJLyogdXBkYXRlIFRYV0kgKi8KKwkvKiAqLwogCXBNYWNFbnRyeSA9IHBUeEJsay0+cE1hY0VudHJ5OwogCXBUcmFuc21pdCA9IHBUeEJsay0+cFRyYW5zbWl0OwogCi0JaWYgKHBNYWNFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2gpCi0JeworCS8qaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkpICovCisJLyppZiAoUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaChwQWQsIHBNYWNFbnRyeSkpICovCisJLyppZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9BdXRvUmF0ZVN3aXRjaCkpICovCisJaWYgKHBNYWNFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2gpIHsKIAkJcFR4V0ktPnR4b3AgPSBJRlNfSFRUWE9QOwogCi0JCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCi0JCXBUeFdJLT5CVyA9IChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisJCS8qIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwICovCisJCXBUeFdJLT5CVyA9CisJCSAgICAocFRyYW5zbWl0LT5maWVsZC5NT0RFIDw9CisJCSAgICAgTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CiAJCXBUeFdJLT5TaG9ydEdJID0gcFRyYW5zbWl0LT5maWVsZC5TaG9ydEdJOwogCQlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKIAogCQlwVHhXSS0+TUNTID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7CiAJCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOwogCi0JCS8vIHNldCBQSUQgZm9yIFR4UmF0ZVN3aXRjaGluZworCQkvKiBzZXQgUElEIGZvciBUeFJhdGVTd2l0Y2hpbmcgKi8KIAkJcFR4V0ktPlBhY2tldElkID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7CiAJfQogCi0JcFR4V0ktPkFNUERVID0gKChwTWFjRW50cnktPk5vQkFEYXRhQ291bnREb3duID09IDApID8gVFJVRTogRkFMU0UpOworCXBUeFdJLT5BTVBEVSA9ICgocE1hY0VudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA9PSAwKSA/IFRSVUUgOiBGQUxTRSk7CiAJcFR4V0ktPk1JTU9wcyA9IDA7CiAKLQlpZiAocEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSkKLQl7Ci0JCS8vIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCi0JCWlmICgocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX0RZTkFNSUMpICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKQotCQl7Ci0JCQkvLyBEeW5hbWljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUpIHsKKwkJLyogTUlNTyBQb3dlciBTYXZlIE1vZGUgKi8KKwkJaWYgKChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfRFlOQU1JQykKKwkJICAgICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKSB7CisJCQkvKiBEeW5hbWljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlICovCiAJCQlwVHhXSS0+TUlNT3BzID0gMTsKLQkJfQotCQllbHNlIGlmIChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfU1RBVElDKQotCQl7Ci0JCQkvLyBTdGF0aWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKLQkJCWlmICgocFRyYW5zbWl0LT5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKQotCQkJeworCQl9IGVsc2UgaWYgKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19TVEFUSUMpIHsKKwkJCS8qIFN0YXRpYyBNSU1PIFBvd2VyIFNhdmUgTW9kZSAqLworCQkJaWYgKChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKwkJCSAgICAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkgewogCQkJCXBUeFdJLT5NQ1MgPSA3OwogCQkJCXBUeFdJLT5NSU1PcHMgPSAwOwogCQkJfQogCQl9CiAJfQogCi0KIAlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CiAKIH0KIAotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gdHJhbnNtaXQgb3V0IGZyYW1lcwotCXdpdGggZ2l2ZW4gc2l6ZSBhbmQgc3BlY2lmaWVkIHJhdGUuCi0KLQlBcmd1bWVudHM6Ci0JCXBUeEQJCVBvaW50ZXIgdG8gdHJhbnNtaXQgZGVzY3JpcHRvcgotCQlBY2sgCQlTZXR0aW5nIGZvciBBY2sgcmVxdWlyZW1lbnQgYml0Ci0JCUZyYWdtZW50CVNldHRpbmcgZm9yIEZyYWdtZW50IGJpdAotCQlSZXRyeU1vZGUJU2V0dGluZyBmb3IgcmV0cnkgbW9kZQotCQlJZnMgCQlTZXR0aW5nIGZvciBJRlMgZ2FwCi0JCVJhdGUJCVNldHRpbmcgZm9yIHRyYW5zbWl0IHJhdGUKLQkJU2VydmljZSAJU2V0dGluZyBmb3Igc2VydmljZQotCQlMZW5ndGgJCUZyYW1lIGxlbmd0aAotCQlUeFByZWFtYmxlCVNob3J0IG9yIExvbmcgcHJlYW1ibGUgd2hlbiB1c2luZyBDQ0sgcmF0ZXMKLQkJUXVlSWR4IC0gMC0zLCBhY2NvcmRpbmcgdG8gODAyLjExZS9kNC40IEp1bmUvMjAwMwotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QV3JpdGVUeERlc2NyaXB0b3IoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFRYRF9TVFJVQwkJcFR4RCwKLQlJTglCT09MRUFOIAkJYldJViwKLQlJTglVQ0hBUgkJCVF1ZXVlU0VMKQotewotCS8vCi0JLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCi0JLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCi0JLy8KLQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOwotCi0JcFR4RC0+V0lWCT0gKGJXSVYpID8gMTogMDsKLQlwVHhELT5RU0VMPSAoUXVldWVTRUwpOwotCWlmIChwQWQtPmJHZW5PbmVIQ0NBID09IFRSVUUpCi0JCXBUeEQtPlFTRUw9IEZJRk9fSENDQTsKLQlwVHhELT5ETUFET05FID0gMDsKLX0KLQotCi0vLyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiAtCi0vLyAxLiBNRUFESUFfQ09OTkVDVEVECi0vLyAyLiBBR0dSRUdBVElPTl9JTl9VU0VECi0vLyAzLiBGcmFnbWVudGF0aW9uIG5vdCBpbiB1c2VkCi0vLyA0LiBlaXRoZXIgbm8gcHJldmlvdXMgZnJhbWUgKHBQcmV2QWRkcjE9TlVMTCkgLk9SLiBwcmV2aW91ZCBmcmFtZSBpcyBhZ2dyZWdhdGlibGUKLUJPT0xFQU4gVHhGcmFtZUlzQWdncmVnYXRpYmxlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBQcmV2QWRkcjEsCi0JSU4JUFVDSEFSCQkJcDgwMjNoZHIpCisvKiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiAtICovCisvKiAxLiBNRUFESUFfQ09OTkVDVEVEICovCisvKiAyLiBBR0dSRUdBVElPTl9JTl9VU0VEICovCisvKiAzLiBGcmFnbWVudGF0aW9uIG5vdCBpbiB1c2VkICovCisvKiA0LiBlaXRoZXIgbm8gcHJldmlvdXMgZnJhbWUgKHBQcmV2QWRkcjE9TlVMTCkgLk9SLiBwcmV2aW91ZCBmcmFtZSBpcyBhZ2dyZWdhdGlibGUgKi8KK0JPT0xFQU4gVHhGcmFtZUlzQWdncmVnYXRpYmxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHU4ICpwUHJldkFkZHIxLCB1OCAqcDgwMjNoZHIpCiB7CiAKLQkvLyBjYW4ndCBhZ2dyZWdhdGUgRUFQT0wgKDgwMi4xeCkgZnJhbWUKKwkvKiBjYW4ndCBhZ2dyZWdhdGUgRUFQT0wgKDgwMi4xeCkgZnJhbWUgKi8KIAlpZiAoKHA4MDIzaGRyWzEyXSA9PSAweDg4KSAmJiAocDgwMjNoZHJbMTNdID09IDB4OGUpKQogCQlyZXR1cm4gRkFMU0U7CiAKLQkvLyBjYW4ndCBhZ2dyZWdhdGUgbXVsdGljYXN0L2Jyb2FkY2FzdCBmcmFtZQorCS8qIGNhbid0IGFnZ3JlZ2F0ZSBtdWx0aWNhc3QvYnJvYWRjYXN0IGZyYW1lICovCiAJaWYgKHA4MDIzaGRyWzBdICYgMHgwMSkKIAkJcmV0dXJuIEZBTFNFOwogCi0JaWYgKElORlJBX09OKHBBZCkpIC8vIG11c3QgYmUgdW5pY2FzdCB0byBBUAorCWlmIChJTkZSQV9PTihwQWQpKQkvKiBtdXN0IGJlIHVuaWNhc3QgdG8gQVAgKi8KIAkJcmV0dXJuIFRSVUU7Ci0JZWxzZSBpZiAoKHBQcmV2QWRkcjEgPT0gTlVMTCkgfHwgTUFDX0FERFJfRVFVQUwocFByZXZBZGRyMSwgcDgwMjNoZHIpKSAvLyB1bmljYXN0IHRvIHNhbWUgU1RBCisJZWxzZSBpZiAoKHBQcmV2QWRkcjEgPT0gTlVMTCkgfHwgTUFDX0FERFJfRVFVQUwocFByZXZBZGRyMSwgcDgwMjNoZHIpKQkvKiB1bmljYXN0IHRvIHNhbWUgU1RBICovCiAJCXJldHVybiBUUlVFOwogCWVsc2UKIAkJcmV0dXJuIEZBTFNFOwogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTE1MzEsMzMgKzEyMzAsMjcgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLUJPT0xFQU4gUGVlcklzQWdncmVPbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVTE9ORwkJICAgVHhSYXRlLAotCUlOCVBNQUNfVEFCTEVfRU5UUlkgcE1hY0VudHJ5KQorQk9PTEVBTiBQZWVySXNBZ2dyZU9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBUeFJhdGUsIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBNYWNFbnRyeSkKIHsKLQlVTE9ORwlBRmxhZ3MgPSAoZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEIHwgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSk7CisJdW5zaWduZWQgbG9uZyBBRmxhZ3MgPQorCSAgICAoZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEIHwgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSk7CiAKLQlpZiAocE1hY0VudHJ5ICE9IE5VTEwgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBBRmxhZ3MpKQotCXsKLQkJaWYgKHBNYWNFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKLQkJeworCWlmIChwTWFjRW50cnkgIT0gTlVMTCAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIEFGbGFncykpIHsKKwkJaWYgKHBNYWNFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkgewogCQkJcmV0dXJuIFRSVUU7CiAJCX0KLQogI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLQkJaWYgKFR4UmF0ZSA+PSBSQVRFXzYgJiYgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSAmJiAoIShPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKSkpCi0JCXsJLy8gbGVnYWN5ICBSYWxpbmsgQWdncmVnYXRpb24gc3VwcG9ydAorCQlpZiAoVHhSYXRlID49IFJBVEVfNiAmJiBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlICYmICghKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpKSkgewkvKiBsZWdhY3kgIFJhbGluayBBZ2dyZWdhdGlvbiBzdXBwb3J0ICovCiAJCQlyZXR1cm4gVFJVRTsKIAkJfQotI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KKyNlbmRpZiAvKiBBR0dSRUdBVElPTl9TVVBQT1JUIC8vICovCiAJfQogCiAJcmV0dXJuIEZBTFNFOwogCiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMTU3NiwzMjMgKzEyNjksMzggQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVBRVUVVRV9IRUFERVIJUlRNUENoZWNrVHhTd1F1ZXVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVCBQVUNIQVIJCQlwUXVlSWR4KQorc3RydWN0IHJ0X3F1ZXVlX2hlYWRlciAqUlRNUENoZWNrVHhTd1F1ZXVlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKnBRdWVJZHgpCiB7CiAKLQlVTE9ORwlOdW1iZXI7CisJdW5zaWduZWQgbG9uZyBOdW1iZXI7CisJLyogMjAwNC0xMS0xNSB0byBiZSByZW1vdmVkLiB0ZXN0IGFnZ3JlZ2F0aW9uIG9ubHkgKi8KKy8qICAgICAgaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpICYmICgqcE51bWJlciA8IDIpKSAqLworLyogICAgICAgICAgICAgICByZXR1cm4gTlVMTDsgKi8KIAogCU51bWJlciA9IHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CS10uTnVtYmVyCi0JCQkgKyBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdLk51bWJlcgotCQkJICsgcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5OdW1iZXIKLQkJCSArIHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10uTnVtYmVyCi0JCQkgKyBwQWQtPlR4U3dRdWV1ZVtRSURfSENDQV0uTnVtYmVyOworCSAgICArIHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uTnVtYmVyCisJICAgICsgcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5OdW1iZXIKKwkgICAgKyBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLk51bWJlcjsKIAotCWlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLkhlYWQgIT0gTlVMTCkKLQl7CisJaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10uSGVhZCAhPSBOVUxMKSB7CiAJCSpwUXVlSWR4ID0gUUlEX0FDX1ZPOwogCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dKTsKLQl9Ci0JZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5IZWFkICE9IE5VTEwpCi0JeworCX0gZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5IZWFkICE9IE5VTEwpIHsKIAkJKnBRdWVJZHggPSBRSURfQUNfVkk7CiAJCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WSV0pOwotCX0KLQllbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdLkhlYWQgIT0gTlVMTCkKLQl7CisJfSBlbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdLkhlYWQgIT0gTlVMTCkgewogCQkqcFF1ZUlkeCA9IFFJRF9BQ19CRTsKIAkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JFXSk7Ci0JfQotCWVsc2UgaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CS10uSGVhZCAhPSBOVUxMKQotCXsKKwl9IGVsc2UgaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CS10uSGVhZCAhPSBOVUxMKSB7CiAJCSpwUXVlSWR4ID0gUUlEX0FDX0JLOwogCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdKTsKIAl9Ci0JZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdLkhlYWQgIT0gTlVMTCkKLQl7Ci0JCSpwUXVlSWR4ID0gUUlEX0hDQ0E7Ci0JCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9IQ0NBXSk7Ci0JfQotCi0JLy8gTm8gcGFja2V0IHBlbmRpbmcgaW4gVHggU3cgcXVldWUKKwkvKiBObyBwYWNrZXQgcGVuZGluZyBpbiBUeCBTdyBxdWV1ZSAqLwogCSpwUXVlSWR4ID0gUUlEX0FDX0JLOwogCiAJcmV0dXJuIChOVUxMKTsKIH0KIAotI2lmZGVmIFJUMjg2MAotQk9PTEVBTiAgUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJUXVlSWR4KQotewotCVBSVE1QX1RYX1JJTkcgcFR4UmluZzsKLQlQVFhEX1NUUlVDCSAgcFR4RDsKLQlQTkRJU19QQUNLRVQgIHBQYWNrZXQ7Ci0JVUNIQVIJRlJFRSA9IDA7Ci0JVFhEX1NUUlVDCVR4RCwgKnBPcmlUeEQ7Ci0JLy9VTE9ORwkJSXJxRmxhZ3M7Ci0JQk9PTEVBTgkJCWJSZXNjaGVkdWxlID0gRkFMU0U7Ci0KLQotCUFTU0VSVChRdWVJZHggPCBOVU1fT0ZfVFhfUklORyk7Ci0JcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tRdWVJZHhdOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFF1ZUlkeCAqIFJJTkdSRUdfRElGRiwgJnBUeFJpbmctPlR4RG1hSWR4KTsKLQl3aGlsZSAocFR4UmluZy0+VHhTd0ZyZWVJZHggIT0gcFR4UmluZy0+VHhEbWFJZHgpCi0JewotCQkvLyBzdGF0aWMgcmF0ZSBhbHNvIG5lZWQgTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKCkgZnVuY3Rpb24uCi0JCS8vaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkpCi0JCQlOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMocEFkKTsKLQotCQkvKiBOb3RlIDogSWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSksIHdlIHdpbGwgbmV2ZXIgcmVhY2ggaGVyZS4gKi8KLQkJRlJFRSsrOwotICAgICAgICAgICAgICAgIHBUeEQgPSAoUFRYRF9TVFJVQykgKHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLkFsbG9jVmEpOwotCQlwT3JpVHhEID0gcFR4RDsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmVHhELCBwVHhELCBzaXplb2YoVFhEX1NUUlVDKSk7Ci0JCXBUeEQgPSAmVHhEOwotCi0JCXBUeEQtPkRNQURPTkUgPSAwOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQkJewotCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLnBOZGlzUGFja2V0OwotCQkJaWYgKHBQYWNrZXQpCi0JCQl7Ci0jaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCi0JCQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF81VlQocFBhY2tldCkpCi0JCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIDE2LCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQllbHNlCi0jZW5kaWYgLy8gQ09ORklHXzVWVF9FTkhBTkNFIC8vCi0JCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQkJfQotCQkJLy9BbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKLQkJCXBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLnBOZGlzUGFja2V0ID0gTlVMTDsKLQotCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLnBOZXh0TmRpc1BhY2tldDsKLQotCQkJQVNTRVJUKHBQYWNrZXQgPT0gTlVMTCk7Ci0JCQlpZiAocFBhY2tldCkKLQkJCXsKLSNpZmRlZiBDT05GSUdfNVZUX0VOSEFOQ0UKLQkJCQlpZiAoUlRNUF9HRVRfUEFDS0VUXzVWVChwUGFja2V0KSkKLQkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgMTYsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCWVsc2UKLSNlbmRpZiAvLyBDT05GSUdfNVZUX0VOSEFOQ0UgLy8KLQkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQl9Ci0JCQkvL0Fsd2F5cyBhc3NpZ24gcE5leHROZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKLQkJCXBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0JCX0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIChwVHhELT5TRExlbjEgKyBwVHhELT5TRExlbjApOwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRdWVJZHhdICsrOwotCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeFN3RnJlZUlkeCwgVFhfUklOR19TSVpFKTsKLQkJLyogZ2V0IHR4X3RkeF9pZHggYWdhaW4gKi8KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFF1ZUlkeCAqIFJJTkdSRUdfRElGRiAsICAmcFR4UmluZy0+VHhEbWFJZHgpOwotCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBPcmlUeEQsIHBUeEQsIHNpemVvZihUWERfU1RSVUMpKTsKLQl9Ci0KLQotCXJldHVybiAgYlJlc2NoZWR1bGU7Ci0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUHJvY2VzcyBUWCBSaW5ncyBETUEgRG9uZSBpbnRlcnJ1cHQsIHJ1bm5pbmcgaW4gRFBDIGxldmVsCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOCVJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCUlOVF9TT1VSQ0VfQ1NSX1NUUlVDIFR4UmluZ0JpdG1hcCkKLXsKLSAgICB1bnNpZ25lZCBsb25nCUlycUZsYWdzOwotCUJPT0xFQU4JCQliUmVzY2hlZHVsZSA9IEZBTFNFOwotCi0JLy8gTWFrZSBzdXJlIFR4IHJpbmcgcmVzb3VyY2Ugd29uJ3QgYmUgdXNlZCBieSBvdGhlciB0aHJlYWRzCi0KLQlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0KLQlpZiAoVHhSaW5nQml0bWFwLmZpZWxkLkFjMERtYURvbmUpCi0JCWJSZXNjaGVkdWxlID0gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUUlEX0FDX0JFKTsKLQotCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuSGNjYURtYURvbmUpCi0JCWJSZXNjaGVkdWxlIHw9IFJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZShwQWQsIFFJRF9IQ0NBKTsKLQotCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuQWMzRG1hRG9uZSkKLQkJYlJlc2NoZWR1bGUgfD0gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUUlEX0FDX1ZPKTsKLQotCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuQWMyRG1hRG9uZSkKLQkJYlJlc2NoZWR1bGUgfD0gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUUlEX0FDX1ZJKTsKLQotCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuQWMxRG1hRG9uZSkKLQkJYlJlc2NoZWR1bGUgfD0gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUUlEX0FDX0JLKTsKLQotCS8vIE1ha2Ugc3VyZSB0byByZWxlYXNlIFR4IHJpbmcgcmVzb3VyY2UKLQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQotCS8vIERlcXVldWUgb3V0Z29pbmcgZnJhbWVzIGZyb20gVHhTd1F1ZXVlW10gYW5kIHByb2Nlc3MgaXQKLQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOwotCi0JcmV0dXJuICBiUmVzY2hlZHVsZTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUHJvY2VzcyBNR01UIHJpbmcgRE1BIGRvbmUgaW50ZXJydXB0LCBydW5uaW5nIGluIERQQyBsZXZlbAotCi0JQXJndW1lbnRzOgotCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCVBUWERfU1RSVUMJIHBUeEQ7Ci0JUE5ESVNfUEFDS0VUIHBQYWNrZXQ7Ci0JVUNIQVIJRlJFRSA9IDA7Ci0JUFJUTVBfTUdNVF9SSU5HIHBNZ210UmluZyA9ICZwQWQtPk1nbXRSaW5nOwotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9NR01URFRYX0lEWCwgJnBNZ210UmluZy0+VHhEbWFJZHgpOwotCXdoaWxlIChwTWdtdFJpbmctPlR4U3dGcmVlSWR4IT0gcE1nbXRSaW5nLT5UeERtYUlkeCkKLQl7Ci0JCUZSRUUrKzsKLQkJcFR4RCA9IChQVFhEX1NUUlVDKSAocE1nbXRSaW5nLT5DZWxsW3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHhdLkFsbG9jVmEpOwotCQlwVHhELT5ETUFET05FID0gMDsKLQkJcFBhY2tldCA9IHBNZ210UmluZy0+Q2VsbFtwTWdtdFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldDsKLQotCi0JCWlmIChwUGFja2V0KQotCQl7Ci0JCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQl9Ci0JCXBNZ210UmluZy0+Q2VsbFtwTWdtdFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJcFBhY2tldCA9IHBNZ210UmluZy0+Q2VsbFtwTWdtdFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQ7Ci0JCWlmIChwUGFja2V0KQotCQl7Ci0JCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQl9Ci0JCXBNZ210UmluZy0+Q2VsbFtwTWdtdFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCQlJTkNfUklOR19JTkRFWChwTWdtdFJpbmctPlR4U3dGcmVlSWR4LCBNR01UX1JJTkdfU0laRSk7Ci0JfQotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKLQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCUFyZ3VtZW50czoKLQkJQWRhcHRlciAJUG9pbnRlciB0byBvdXIgYWRhcHRlci4gRGVxdWV1ZSBhbGwgcG93ZXIgc2FmZSBkZWxheWVkIGJyYW9kY2FzdCBmcmFtZXMgYWZ0ZXIgYmVhY29uLgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCXsKLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JCXsKLQkJfQotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIuIFJld3JpdGUgYmVhY29uIGNvbnRlbnQgYmVmb3JlIG5leHQgc2VuZC1vdXQuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JewotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQuLi5cbiIpKTsKLQkJfQotCX0KLQotCi19Ci0KLVZPSUQJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7Ci0KLQlpZiAocEFkID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBwQWQgaXMgTlVMTCwgcmV0dXJuLlxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0IFxuIikpOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHICwgJkdsb0NmZy53b3JkKTsKLQotCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAwOwotCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDA7Ci0JR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7Ci0KLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CSyk7Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9IQ0NBKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfTUdNVCk7Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKLQotCVJUTVBFbmFibGVSeFR4KHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQgXG4iKSk7Ci19Ci0jZW5kaWYgLyogUlQyODYwICovCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTE5MDksMjUgKzEzMTcsMjUgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU0NBTk5JTkcsIHN1c3BlbmQgTVNEVSB0cmFuc21pc3Npb24gLi4uXG4iKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU0NBTk5JTkcsIHN1c3BlbmQgTVNEVSB0cmFuc21pc3Npb24gLi4uXG4iKSk7CiAKKwkvKiAqLworCS8qIEJlZm9yZSBCU1NfU0NBTl9JTl9QUk9HUkVTUywgd2UgbmVlZCB0byBrZWVwIEN1cnJlbnQgUjY2IHZhbHVlIGFuZCAqLworCS8qIHVzZSBMb3dib3VuZCBhcyBSNjYgdmFsdWUgb24gU2Nhbk5leHRDaGFubmVsKC4uLikgKi8KKwkvKiAqLworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsCisJCQkJICAgICZwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUpOwogCi0JLy8KLQkvLyBCZWZvcmUgQlNTX1NDQU5fSU5fUFJPR1JFU1MsIHdlIG5lZWQgdG8ga2VlcCBDdXJyZW50IFI2NiB2YWx1ZSBhbmQKLQkvLyB1c2UgTG93Ym91bmQgYXMgUjY2IHZhbHVlIG9uIFNjYW5OZXh0Q2hhbm5lbCguLi4pCi0JLy8KLQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKLQotCS8vIHNldCBCQlBfUjY2IHRvIDB4MzAvMHg0MCB3aGVuIHNjYW5uaW5nIChBc2ljU3dpdGNoQ2hhbm5lbCB3aWxsIHNldCBSNjYgYWNjb3JkaW5nIHRvIGNoYW5uZWwgd2hlbiBzY2FubmluZykKKwkvKiBzZXQgQkJQX1I2NiB0byAweDMwLzB4NDAgd2hlbiBzY2FubmluZyAoQXNpY1N3aXRjaENoYW5uZWwgd2lsbCBzZXQgUjY2IGFjY29yZGluZyB0byBjaGFubmVsIHdoZW4gc2Nhbm5pbmcpICovCisJLypSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgKDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkKSkpOyAqLwogCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBCV18yMCk7CiAKIAlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CisJLypSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DTlRMX0NTUiwgMHgwMDBmMDAwMCk7ICAgICAgICAgICAgICAgIC8vIGFib3J0IGFsbCBUWCByaW5ncyAqLwogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTE5NDYsMTQxICsxMzU0LDE0NSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU0NBTiBkb25lLCByZXN1bWUgTVNEVSB0cmFuc21pc3Npb24gLi4uXG4iKSk7CisvKiAgICB1OCAgICAgICAgICAgICAgICAgICAgIElycVN0YXRlOyAqLwogCi0JLy8gQWZ0ZXIgZmluaXNoIEJTU19TQ0FOX0lOX1BST0dSRVNTLCB3ZSBuZWVkIHRvIHJlc3RvcmUgQ3VycmVudCBSNjYgdmFsdWUKLQkvLyBSNjYgc2hvdWxkIG5vdCBiZSAwCi0JaWYgKHBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSA9PSAwKQotCXsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTQ0FOIGRvbmUsIHJlc3VtZSBNU0RVIHRyYW5zbWlzc2lvbiAuLi5cbiIpKTsKKworCS8qIEFmdGVyIGZpbmlzaCBCU1NfU0NBTl9JTl9QUk9HUkVTUywgd2UgbmVlZCB0byByZXN0b3JlIEN1cnJlbnQgUjY2IHZhbHVlICovCisJLyogUjY2IHNob3VsZCBub3QgYmUgMCAqLworCWlmIChwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgPT0gMCkgewogCQlwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgPSAweDM4OwogCQlEQkdQUklOVF9FUlIoKCJSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbiwgUjY2Q3VycmVudFZhbHVlPTAuLi5cbiIpKTsKIAl9CiAKLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwKKwkJCQkgICAgIHBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSk7CiAKIAlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKy8qIHNhbXBsZSwgZm9yIElSUSBMT0NLIHRvIFNFTSBMT0NLICovCisvKiAgICBJcnFTdGF0ZSA9IHBBZC0+aXJxX2Rpc2FibGVkOyAqLworLyogICAgICBpZiAoSXJxU3RhdGUpICovCisvKiAgICAgICAgICAgICAgUlRNUERlUXVldWVQYWNrZXQocEFkLCBUUlVFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOyAqLworLyogICAgZWxzZSAqLwogCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CiB9CiAKLQotVUlOVCBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlQTkRJU19QQUNLRVQJCXBQYWNrZXQsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVUxPTkcJCQlEYXRhU2l6ZSkKK3UzMiBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJdm9pZCAqcFBhY2tldCwKKwkJCQl1OCAqcERhdGEsIHVuc2lnbmVkIGxvbmcgRGF0YVNpemUpCiB7Ci0JVVNIT1JUIAkJCVBheWxvYWRTaXplOwotCVVTSE9SVCAJCQlTdWJGcmFtZVNpemU7Ci0JUEhFQURFUl84MDJfMyAJcEFNU0RVc3ViaGVhZGVyOwotCVVJTlQJCQluTVNEVTsKLSAgICBVQ0hBUgkJCUhlYWRlcjgwMl8zWzE0XTsKKwl1MTYgUGF5bG9hZFNpemU7CisJdTE2IFN1YkZyYW1lU2l6ZTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8zICogcEFNU0RVc3ViaGVhZGVyOworCXUzMiBuTVNEVTsKKwl1OCBIZWFkZXI4MDJfM1sxNF07CiAKLQlQVUNIQVIJCQlwUGF5bG9hZCwgcERBLCBwU0EsIHBSZW1vdmVkTExDU05BUDsKLQlQTkRJU19QQUNLRVQJcENsb25lUGFja2V0OwotCi0KKwl1OCAqcFBheWxvYWQsICpwREEsICpwU0EsICpwUmVtb3ZlZExMQ1NOQVA7CisJdm9pZCAqcENsb25lUGFja2V0OwogCiAJbk1TRFUgPSAwOwogCi0Jd2hpbGUgKERhdGFTaXplID4gTEVOR1RIXzgwMl8zKQotCXsKKwl3aGlsZSAoRGF0YVNpemUgPiBMRU5HVEhfODAyXzMpIHsKIAogCQluTVNEVSsrOwogCi0JCXBBTVNEVXN1YmhlYWRlciA9IChQSEVBREVSXzgwMl8zKXBEYXRhOwotCQlQYXlsb2FkU2l6ZSA9IHBBTVNEVXN1YmhlYWRlci0+T2N0ZXRbMV0gKyAocEFNU0RVc3ViaGVhZGVyLT5PY3RldFswXTw8OCk7CisJCS8qaGV4X2R1bXAoInN1YmhlYWRlciIsIHBEYXRhLCA2NCk7ICovCisJCXBBTVNEVXN1YmhlYWRlciA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8zICopIHBEYXRhOworCQkvKnBEYXRhICs9IExFTkdUSF84MDJfMzsgKi8KKwkJUGF5bG9hZFNpemUgPQorCQkgICAgcEFNU0RVc3ViaGVhZGVyLT5PY3RldFsxXSArCisJCSAgICAocEFNU0RVc3ViaGVhZGVyLT5PY3RldFswXSA8PCA4KTsKIAkJU3ViRnJhbWVTaXplID0gUGF5bG9hZFNpemUgKyBMRU5HVEhfODAyXzM7CiAKLQotCQlpZiAoKERhdGFTaXplIDwgU3ViRnJhbWVTaXplKSB8fCAoUGF5bG9hZFNpemUgPiAxNTE4ICkpCi0JCXsKKwkJaWYgKChEYXRhU2l6ZSA8IFN1YkZyYW1lU2l6ZSkgfHwgKFBheWxvYWRTaXplID4gMTUxOCkpIHsKIAkJCWJyZWFrOwogCQl9CisJCS8qREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlZCBzdWJmcmFtZTogU2l6ZSA9ICVkXG4iLCAgbk1TRFUsIFBheWxvYWRTaXplKSk7ICovCiAKIAkJcFBheWxvYWQgPSBwRGF0YSArIExFTkdUSF84MDJfMzsKIAkJcERBID0gcERhdGE7CiAJCXBTQSA9IHBEYXRhICsgTUFDX0FERFJfTEVOOwogCi0JCS8vIGNvbnZlcnQgdG8gODAyLjMgaGVhZGVyCi0gICAgICAgIENPTlZFUlRfVE9fODAyXzMoSGVhZGVyODAyXzMsIHBEQSwgcFNBLCBwUGF5bG9hZCwgUGF5bG9hZFNpemUsIHBSZW1vdmVkTExDU05BUCk7CisJCS8qIGNvbnZlcnQgdG8gODAyLjMgaGVhZGVyICovCisJCUNPTlZFUlRfVE9fODAyXzMoSGVhZGVyODAyXzMsIHBEQSwgcFNBLCBwUGF5bG9hZCwgUGF5bG9hZFNpemUsCisJCQkJIHBSZW1vdmVkTExDU05BUCk7CiAKLQkJaWYgKChIZWFkZXI4MDJfM1sxMl0gPT0gMHg4OCkgJiYgKEhlYWRlcjgwMl8zWzEzXSA9PSAweDhFKSApCi0JCXsKLQkJICAgIC8vIGF2b2lkIGxvY2FsIGhlYXAgb3ZlcmZsb3csIHVzZSBkeWFuYW1pYyBhbGxvY2F0aW9uCi0JCSAgIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOwotCQkgICBpZiAoRWxlbSA9PSBOVUxMKQotCQkJcmV0dXJuOwotCQkgICBtZW1tb3ZlKEVsZW0tPk1zZysoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IKSwgcFBheWxvYWQsIFBheWxvYWRTaXplKTsKLQkJICAgRWxlbS0+TXNnTGVuID0gTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgUGF5bG9hZFNpemU7Ci0JCSAgIFdwYUVBUE9MS2V5QWN0aW9uKHBBZCwgRWxlbSk7Ci0JCSAgIGtmcmVlKEVsZW0pOworCQlpZiAoKEhlYWRlcjgwMl8zWzEyXSA9PSAweDg4KSAmJiAoSGVhZGVyODAyXzNbMTNdID09IDB4OEUpKSB7CisJCQkvKiBhdm9pZCBsb2NhbCBoZWFwIG92ZXJmbG93LCB1c2UgZHlhbmFtaWMgYWxsb2NhdGlvbiAqLworCQkJc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSA9CisJCQkgICAgKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKKwkJCQkJCQlNRU1fQUxMT0NfRkxBRyk7CisJCQlpZiAoRWxlbSAhPSBOVUxMKSB7CisJCQkJbWVtbW92ZShFbGVtLT5Nc2cgKworCQkJCQkoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IKSwKKwkJCQkJcFBheWxvYWQsIFBheWxvYWRTaXplKTsKKwkJCQlFbGVtLT5Nc2dMZW4gPQorCQkJCSAgICBMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKworCQkJCSAgICBQYXlsb2FkU2l6ZTsKKwkJCQkvKldwYUVBUE9MS2V5QWN0aW9uKHBBZCwgRWxlbSk7ICovCisJCQkJUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShwQWQsIEJTU0lEX1dDSUQsCisJCQkJCQkJICBFbGVtLT5Nc2csCisJCQkJCQkJICBFbGVtLT5Nc2dMZW4sIDAsIDAsIDAsCisJCQkJCQkJICAwKTsKKwkJCQlrZnJlZShFbGVtKTsKKwkJCX0KIAkJfQogCiAJCXsKLQkgICAgICAgIAlpZiAocFJlbW92ZWRMTENTTkFQKQotCSAgICAgICAgCXsKLQkgICAgCQkJcFBheWxvYWQgLT0gTEVOR1RIXzgwMl8zOwotCSAgICAJCQlQYXlsb2FkU2l6ZSArPSBMRU5HVEhfODAyXzM7Ci0JICAgIAkJCU5kaXNNb3ZlTWVtb3J5KHBQYXlsb2FkLCAmSGVhZGVyODAyXzNbMF0sIExFTkdUSF84MDJfMyk7Ci0JICAgICAgICAJfQorCQkJaWYgKHBSZW1vdmVkTExDU05BUCkgeworCQkJCXBQYXlsb2FkIC09IExFTkdUSF84MDJfMzsKKwkJCQlQYXlsb2FkU2l6ZSArPSBMRU5HVEhfODAyXzM7CisJCQkJTmRpc01vdmVNZW1vcnkocFBheWxvYWQsICZIZWFkZXI4MDJfM1swXSwKKwkJCQkJICAgICAgIExFTkdUSF84MDJfMyk7CisJCQl9CiAJCX0KIAogCQlwQ2xvbmVQYWNrZXQgPSBDbG9uZVBhY2tldChwQWQsIHBQYWNrZXQsIHBQYXlsb2FkLCBQYXlsb2FkU2l6ZSk7Ci0JCWlmIChwQ2xvbmVQYWNrZXQpCi0JCXsKLQkJCUFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKHBBZCwgcENsb25lUGFja2V0LCBSVE1QX0dFVF9QQUNLRVRfSUYocFBhY2tldCkpOworCQlpZiAocENsb25lUGFja2V0KSB7CisJCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBDbG9uZVBhY2tldCwKKwkJCQkJCQkgUlRNUF9HRVRfUEFDS0VUX0lGCisJCQkJCQkJIChwUGFja2V0KSk7CiAJCX0KIAorCQkvKiBBLU1TRFUgaGFzIHBhZGRpbmcgdG8gbXVsdGlwbGUgb2YgNCBpbmNsdWRpbmcgc3ViZnJhbWUgaGVhZGVyLiAqLworCQkvKiBhbGlnbiBTdWJGcmFtZVNpemUgdXAgdG8gbXVsdGlwbGUgb2YgNCAqLworCQlTdWJGcmFtZVNpemUgPSAoU3ViRnJhbWVTaXplICsgMykgJiAofjB4Myk7CiAKLQkJLy8gQS1NU0RVIGhhcyBwYWRkaW5nIHRvIG11bHRpcGxlIG9mIDQgaW5jbHVkaW5nIHN1YmZyYW1lIGhlYWRlci4KLQkJLy8gYWxpZ24gU3ViRnJhbWVTaXplIHVwIHRvIG11bHRpcGxlIG9mIDQKLQkJU3ViRnJhbWVTaXplID0gKFN1YkZyYW1lU2l6ZSszKSYofjB4Myk7Ci0KLQotCQlpZiAoU3ViRnJhbWVTaXplID4gMTUyOCB8fCBTdWJGcmFtZVNpemUgPCAzMikKLQkJeworCQlpZiAoU3ViRnJhbWVTaXplID4gMTUyOCB8fCBTdWJGcmFtZVNpemUgPCAzMikgewogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoRGF0YVNpemUgPiBTdWJGcmFtZVNpemUpCi0JCXsKKwkJaWYgKERhdGFTaXplID4gU3ViRnJhbWVTaXplKSB7CiAJCQlwRGF0YSArPSBTdWJGcmFtZVNpemU7CiAJCQlEYXRhU2l6ZSAtPSBTdWJGcmFtZVNpemU7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBlbmQgb2YgQS1NU0RVCisJCX0gZWxzZSB7CisJCQkvKiBlbmQgb2YgQS1NU0RVICovCiAJCQlEYXRhU2l6ZSA9IDA7CiAJCX0KIAl9CiAKLQkvLyBmaW5hbGx5IHJlbGVhc2Ugb3JpZ2luYWwgcnggcGFja2V0CisJLyogZmluYWxseSByZWxlYXNlIG9yaWdpbmFsIHJ4IHBhY2tldCAqLwogCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKIAogCXJldHVybiBuTVNEVTsKIH0KIAotCi1VSU5UIEJBX1Jlb3JkZXJfQU1TRFVfQW5ubm91bmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQordTMyIEJBX1Jlb3JkZXJfQU1TRFVfQW5ubm91bmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqcFBhY2tldCkKIHsKLQlQVUNIQVIJCQlwRGF0YTsKLQlVU0hPUlQJCQlEYXRhU2l6ZTsKLQlVSU5UCQkJbk1TRFUgPSAwOworCXU4ICpwRGF0YTsKKwl1MTYgRGF0YVNpemU7CisJdTMyIG5NU0RVID0gMDsKIAotCXBEYXRhID0gKFBVQ0hBUikgR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwotCURhdGFTaXplID0gKFVTSE9SVCkgR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisJcERhdGEgPSAodTggKilHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJRGF0YVNpemUgPSAodTE2KUdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwogCiAJbk1TRFUgPSBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShwQWQsIHBQYWNrZXQsIHBEYXRhLCBEYXRhU2l6ZSk7CiAKIAlyZXR1cm4gbk1TRFU7CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgpAQCAtMjA4OSw0MCArMTUwMSwzNyBAQAogCQlwRW50cnkgLSBwb2ludGVyIHRvIHRoZSBNQUMgZW50cnk7IE5VTEwgaXMgbm90IGZvdW5kCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1NQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlTG9va3VwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCVBVQ0hBUiBwQWRkcikKK3N0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKk1hY1RhYmxlTG9va3VwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKnBBZGRyKQogewotCVVMT05HIEhhc2hJZHg7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgSGFzaElkeDsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkgPSBOVUxMOwogCiAJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkZHIpOwogCXBFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07CiAKLQl3aGlsZSAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzV0RTIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpIHx8IHBFbnRyeS0+VmFsaWRBc01lc2gpKQotCXsKLQkJaWYgKE1BQ19BRERSX0VRVUFMKHBFbnRyeS0+QWRkciwgcEFkZHIpKQotCQl7CisJd2hpbGUgKHBFbnRyeQorCSAgICAgICAmJiAocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc1dEUworCQkgICB8fCBwRW50cnktPlZhbGlkQXNBcENsaSB8fCBwRW50cnktPlZhbGlkQXNNZXNoKSkgeworCQlpZiAoTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwQWRkcikpIHsKIAkJCWJyZWFrOwotCQl9Ci0JCWVsc2UKKwkJfSBlbHNlCiAJCQlwRW50cnkgPSBwRW50cnktPnBOZXh0OwogCX0KIAogCXJldHVybiBwRW50cnk7CiB9CiAKLU1BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnRFbnRyeSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSCQkJcEFkZHIsCi0JSU4JVUNIQVIJCQlhcGlkeCwKLQlJTiBCT09MRUFOCUNsZWFuQWxsKQorc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqTWFjVGFibGVJbnNlcnRFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgICB1OCAqcEFkZHIsCisJCQkJICAgICB1OCBhcGlkeCwgSU4gQk9PTEVBTiBDbGVhbkFsbCkKIHsKLQlVQ0hBUiBIYXNoSWR4OworCXU4IEhhc2hJZHg7CiAJaW50IGksIEZpcnN0V2NpZDsKLQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5OworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5OworLyogICAgICB1MTYgIG9mZnNldDsgKi8KKy8qICAgICAgdW5zaWduZWQgbG9uZyAgIGFkZHI7ICovCiAKLQkvLyBpZiBGVUxMLCByZXR1cm4KKwkvKiBpZiBGVUxMLCByZXR1cm4gKi8KIAlpZiAocEFkLT5NYWNUYWIuU2l6ZSA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTIxMzEsMjMgKzE1NDAsMjEgQEAKIAlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCiAJCUZpcnN0V2NpZCA9IDI7CiAKLQkvLyBhbGxvY2F0ZSBvbmUgTUFDIGVudHJ5CisJLyogYWxsb2NhdGUgb25lIE1BQyBlbnRyeSAqLwogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0JZm9yIChpID0gRmlyc3RXY2lkOyBpPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKSAgIC8vIHNraXAgZW50cnkjMCBzbyB0aGF0ICJlbnRyeSBpbmRleCA9PSBBSUQiIGZvciBmYXN0IGxvb2t1cAorCWZvciAoaSA9IEZpcnN0V2NpZDsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCS8qIHNraXAgZW50cnkjMCBzbyB0aGF0ICJlbnRyeSBpbmRleCA9PSBBSUQiIGZvciBmYXN0IGxvb2t1cCAqLwogCXsKLQkJLy8gcGljayB1cCB0aGUgZmlyc3QgYXZhaWxhYmxlIHZhY2FuY3kKKwkJLyogcGljayB1cCB0aGUgZmlyc3QgYXZhaWxhYmxlIHZhY2FuY3kgKi8KIAkJaWYgKChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgPT0gRkFMU0UpICYmCi0JCQkocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzV0RTID09IEZBTFNFKSAmJgotCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0FwQ2xpPT0gRkFMU0UpICYmCi0JCQkocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzTWVzaCA9PSBGQUxTRSkKLQkJCSkKLQkJeworCQkgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc1dEUyA9PSBGQUxTRSkgJiYKKwkJICAgIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNBcENsaSA9PSBGQUxTRSkgJiYKKwkJICAgIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNNZXNoID09IEZBTFNFKQorCQkgICAgKSB7CiAJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKLQkJCWlmIChDbGVhbkFsbCA9PSBUUlVFKQotCQkJeworCQkJaWYgKENsZWFuQWxsID09IFRSVUUpIHsKIAkJCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOwogCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IFJBVEVfMTE7Ci0JCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7CisJCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2Yoc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSkpOwogCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuS2V5TGVuID0gMDsKIAkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwogCQkJfQpAQCAtMjE2NCw3NyArMTU3MSw3NiBAQAogCQkJcEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9IEZBTFNFOwogCQkJcEVudHJ5LT5wQWQgPSBwQWQ7CiAJCQlwRW50cnktPkNNVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0JCQlwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKKwkJCXBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgPQorCQkJICAgIEVBUE9MX1NUQVJUX0RJU0FCTEU7CiAJCQlwRW50cnktPlJTTklFX0xlbiA9IDA7Ci0JCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlJfQ291bnRlciwgc2l6ZW9mKHBFbnRyeS0+Ul9Db3VudGVyKSk7CisJCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlJfQ291bnRlciwKKwkJCQkgICAgICAgc2l6ZW9mKHBFbnRyeS0+Ul9Db3VudGVyKSk7CiAJCQlwRW50cnktPlJlVHJ5Q291bnRlciA9IFBFRVJfTVNHMV9SRVRSWV9USU1FUl9DVFI7CiAKIAkJCWlmIChwRW50cnktPlZhbGlkQXNNZXNoKQotCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfTUVTSCk7CisJCQkJcEVudHJ5LT5hcGlkeCA9CisJCQkJICAgIChhcGlkeCAtIE1JTl9ORVRfREVWSUNFX0ZPUl9NRVNIKTsKIAkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc0FwQ2xpKQotCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpOworCQkJCXBFbnRyeS0+YXBpZHggPQorCQkJCSAgICAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpOwogCQkJZWxzZSBpZiAocEVudHJ5LT5WYWxpZEFzV0RTKQotCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKTsKKwkJCQlwRW50cnktPmFwaWR4ID0KKwkJCQkgICAgKGFwaWR4IC0gTUlOX05FVF9ERVZJQ0VfRk9SX1dEUyk7CiAJCQllbHNlCiAJCQkJcEVudHJ5LT5hcGlkeCA9IGFwaWR4OwogCiAJCQl7CiAJCQkJewogCQkJCQlwRW50cnktPkF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7Ci0JCQkJCXBFbnRyeS0+V2VwU3RhdHVzID0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOwotCQkJCQlwRW50cnktPlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKLSNpZmRlZiBSVDI4NjAKLQkJCQkJQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBwRW50cnktPmFwaWR4LCAoVUNIQVIpaSk7Ci0jZW5kaWYKKwkJCQkJcEVudHJ5LT5XZXBTdGF0dXMgPQorCQkJCQkgICAgcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworCQkJCQlwRW50cnktPlByaXZhY3lGaWx0ZXIgPQorCQkJCQkgICAgTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJCQkJCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwKKwkJCQkJCQkJICAgcEVudHJ5LT4KKwkJCQkJCQkJICAgYXBpZHgsCisJCQkJCQkJCSAgICh1OClpKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAkJCQl9CiAJCQl9CiAKIAkJCXBFbnRyeS0+R1RLU3RhdGUgPSBSRUtFWV9ORUdPVElBVElORzsKIAkJCXBFbnRyeS0+UGFpcndpc2VLZXkuS2V5TGVuID0gMDsKIAkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0KLSNpZmRlZiBSVDI4NjAKLQkJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYKLQkJCQkocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpKQotCQkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQkJCWVsc2UKLSNlbmRpZgogCQkJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKIAogCQkJcEVudHJ5LT5QTUtJRF9DYWNoZUlkeCA9IEVOVFJZX05PVF9GT1VORDsKIAkJCUNPUFlfTUFDX0FERFIocEVudHJ5LT5BZGRyLCBwQWRkcik7CiAJCQlwRW50cnktPlNzdCA9IFNTVF9OT1RfQVVUSDsKIAkJCXBFbnRyeS0+QXV0aFN0YXRlID0gQVNfTk9UX0FVVEg7Ci0JCQlwRW50cnktPkFpZCA9IChVU0hPUlQpaTsgIC8vMDsKKwkJCXBFbnRyeS0+QWlkID0gKHUxNilpOwkvKjA7ICovCiAJCQlwRW50cnktPkNhcGFiaWxpdHlJbmZvID0gMDsKIAkJCXBFbnRyeS0+UHNNb2RlID0gUFdSX0FDVElWRTsKIAkJCXBFbnRyeS0+UHNRSWRsZUNvdW50ID0gMDsKIAkJCXBFbnRyeS0+Tm9EYXRhSWRsZUNvdW50ID0gMDsKKwkJCXBFbnRyeS0+QXNzb2NEZWFkTGluZSA9IE1BQ19UQUJMRV9BU1NPQ19USU1FT1VUOwogCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCA9IDA7CiAJCQlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBFbnRyeS0+UHNRdWV1ZSk7CiAKKwkJCXBBZC0+TWFjVGFiLlNpemUrKzsKKwkJCS8qIEFkZCB0aGlzIGVudHJ5IGludG8gQVNJQyBSWCBXQ0lEIHNlYXJjaCB0YWJsZSAqLworCQkJUlRNUF9TVEFfRU5UUllfQUREKHBBZCwgcEVudHJ5KTsKIAotCQkJcEFkLT5NYWNUYWIuU2l6ZSArKzsKLQkJCS8vIEFkZCB0aGlzIGVudHJ5IGludG8gQVNJQyBSWCBXQ0lEIHNlYXJjaCB0YWJsZQotCQkJUlQyOFhYX1NUQV9FTlRSWV9BREQocEFkLCBwRW50cnkpOwotCi0KLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjVGFibGVJbnNlcnRFbnRyeSAtIGFsbG9jYXRlIGVudHJ5ICMlZCwgVG90YWw9ICVkXG4iLGksIHBBZC0+TWFjVGFiLlNpemUpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk1hY1RhYmxlSW5zZXJ0RW50cnkgLSBhbGxvY2F0ZSBlbnRyeSAjJWQsIFRvdGFsPSAlZFxuIiwKKwkJCQkgIGksIHBBZC0+TWFjVGFiLlNpemUpKTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi0JLy8gYWRkIHRoaXMgTUFDIGVudHJ5IGludG8gSEFTSCB0YWJsZQotCWlmIChwRW50cnkpCi0JeworCS8qIGFkZCB0aGlzIE1BQyBlbnRyeSBpbnRvIEhBU0ggdGFibGUgKi8KKwlpZiAocEVudHJ5KSB7CiAJCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKLQkJaWYgKHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKLQkJeworCQlpZiAocEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9PSBOVUxMKSB7CiAJCQlwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID0gcEVudHJ5OwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJcEN1cnJFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07CiAJCQl3aGlsZSAocEN1cnJFbnRyeS0+cE5leHQgIT0gTlVMTCkKIAkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7CkBAIC0yMjUyLDE0ICsxNjU4LDE0IEBACiAJCURlbGV0ZSBhIHNwZWNpZmllZCBjbGllbnQgZnJvbSBNQUMgdGFibGUKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1CT09MRUFOIE1hY1RhYmxlRGVsZXRlRW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIHdjaWQsCi0JSU4gUFVDSEFSIHBBZGRyKQorQk9PTEVBTiBNYWNUYWJsZURlbGV0ZUVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1MTYgd2NpZCwgdTggKnBBZGRyKQogewotCVVTSE9SVCBIYXNoSWR4OwotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LCAqcFByZXZFbnRyeSwgKnBQcm9iZUVudHJ5OworCXUxNiBIYXNoSWR4OworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwgKnBQcmV2RW50cnksICpwUHJvYmVFbnRyeTsKIAlCT09MRUFOIENhbmNlbGxlZDsKKwkvKnUxNiAgICAgICAgb2Zmc2V0OyAvLyB1bnVzZWQgdmFyaWFibGUgKi8KKwkvKnU4IGo7ICAgICAgICAgICAgICAgICAgICAgIC8vIHVudXNlZCB2YXJpYWJsZSAqLwogCiAJaWYgKHdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCiAJCXJldHVybiBGQUxTRTsKQEAgLTIyNjcsMzYgKzE2NzMsMzMgQEAKIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwogCiAJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkZHIpOworCS8qcEVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsgKi8KIAlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFt3Y2lkXTsKIAotCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSB8fCBwRW50cnktPlZhbGlkQXNXRFMgfHwgcEVudHJ5LT5WYWxpZEFzTWVzaAotCQkpKQotCXsKLQkJaWYgKE1BQ19BRERSX0VRVUFMKHBFbnRyeS0+QWRkciwgcEFkZHIpKQotCQl7CisJaWYgKHBFbnRyeQorCSAgICAmJiAocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpIHx8IHBFbnRyeS0+VmFsaWRBc1dEUworCQl8fCBwRW50cnktPlZhbGlkQXNNZXNoKSkgeworCQlpZiAoTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwQWRkcikpIHsKIAotCQkJLy8gRGVsZXRlIHRoaXMgZW50cnkgZnJvbSBBU0lDIG9uLWNoaXAgV0NJRCBUYWJsZQotCQkJUlQyOFhYX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCB3Y2lkKTsKKwkJCS8qIERlbGV0ZSB0aGlzIGVudHJ5IGZyb20gQVNJQyBvbi1jaGlwIFdDSUQgVGFibGUgKi8KKwkJCVJUTVBfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIHdjaWQpOwogCi0JCQkvLyBmcmVlIHJlc291cmNlcyBvZiBCQQorCQkJLyogZnJlZSByZXNvdXJjZXMgb2YgQkEgKi8KIAkJCUJBU2Vzc2lvblRlYXJEb3duQUxMKHBBZCwgcEVudHJ5LT5BaWQpOwogCiAJCQlwUHJldkVudHJ5ID0gTlVMTDsKIAkJCXBQcm9iZUVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKIAkJCUFTU0VSVChwUHJvYmVFbnRyeSk7CiAKLQkJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKLQkJCWRvCi0JCQl7Ci0JCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKLQkJCQl7Ci0JCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpCi0JCQkJCXsKLQkJCQkJCXBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OworCQkJLyogdXBkYXRlIEhhc2ggbGlzdCAqLworCQkJZG8geworCQkJCWlmIChwUHJvYmVFbnRyeSA9PSBwRW50cnkpIHsKKwkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkgeworCQkJCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9CisJCQkJCQkgICAgcEVudHJ5LT5wTmV4dDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0KKwkJCQkJCSAgICBwRW50cnktPnBOZXh0OwogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCX0KQEAgLTIzMDUsNDggKzE3MDgsNDMgQEAKIAkJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKIAkJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKIAotCQkJLy8gbm90IGZvdW5kICEhIQorCQkJLyogbm90IGZvdW5kICEgKi8KIAkJCUFTU0VSVChwUHJvYmVFbnRyeSAhPSBOVUxMKTsKIAotCQkJUlQyOFhYX1NUQV9FTlRSWV9LRVlfREVMKHBBZCwgQlNTMCwgd2NpZCk7CisJCQlSVE1QX1NUQV9FTlRSWV9LRVlfREVMKHBBZCwgQlNTMCwgd2NpZCk7CiAKKwkJCWlmIChwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nICE9CisJCQkgICAgRUFQT0xfU1RBUlRfRElTQUJMRSkgeworCQkJCVJUTVBDYW5jZWxUaW1lcigmcEVudHJ5LT4KKwkJCQkJCUVucXVldWVTdGFydEZvclBTS1RpbWVyLAorCQkJCQkJJkNhbmNlbGxlZCk7CisJCQkJcEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyA9CisJCQkJICAgIEVBUE9MX1NUQVJUX0RJU0FCTEU7CisJCQl9CiAKLQkJaWYgKHBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgIT0gRUFQT0xfU1RBUlRfRElTQUJMRSkKLQkJewotCQkJUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPkVucXVldWVTdGFydEZvclBTS1RpbWVyLCAmQ2FuY2VsbGVkKTsKLQkJCXBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgPSBFQVBPTF9TVEFSVF9ESVNBQkxFOwotCQl9Ci0KLQotICAgCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7Ci0JCQlwQWQtPk1hY1RhYi5TaXplIC0tOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjVGFibGVEZWxldGVFbnRyeTEgLSBUb3RhbD0gJWRcbiIsIHBBZC0+TWFjVGFiLlNpemUpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXByaW50aygiXG4lczogSW1wb3NzaWJsZSBXY2lkID0gJWQgISEhISFcbiIsIF9fZnVuY19fLCB3Y2lkKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkpKTsKKwkJCXBBZC0+TWFjVGFiLlNpemUtLTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk1hY1RhYmxlRGVsZXRlRW50cnkxIC0gVG90YWw9ICVkXG4iLAorCQkJCSAgcEFkLT5NYWNUYWIuU2l6ZSkpOworCQl9IGVsc2UgeworCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLAorCQkJCSAoIlxuJXM6IEltcG9zc2libGUgV2NpZCA9ICVkICFcbiIsCisJCQkJICBfX2Z1bmNfXywgd2NpZCkpOwogCQl9CiAJfQogCiAJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKIAotCS8vUmVzZXQgb3BlcmF0aW5nIG1vZGUgd2hlbiBubyBTdGEuCi0JaWYgKHBBZC0+TWFjVGFiLlNpemUgPT0gMCkKLQl7CisJLypSZXNldCBvcGVyYXRpbmcgbW9kZSB3aGVuIG5vIFN0YS4gKi8KKwlpZiAocEFkLT5NYWNUYWIuU2l6ZSA9PSAwKSB7CiAJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSA9IDA7Ci0jaWZkZWYgUlQyODYwCi0JCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCAvKnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSovLCAoQUxMTl9TRVRQUk9URUNUKSwgVFJVRSwgMCAvKnBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YqLyk7Ci0jZWxzZQotCQkvLyBlZGl0IGJ5IGpvaG5saSwgZml4ICJpbl9pbnRlcnJ1cHQiIGVycm9yIHdoZW4gY2FsbCAiTWFjVGFibGVEZWxldGVFbnRyeSIgaW4gUnggdGFza2xldAotCQkvLyBTZXQgTUFDIHJlZ2lzdGVyIHZhbHVlIGFjY29yZGluZyBvcGVyYXRpb24gbW9kZQotCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9VUERBVEVfUFJPVEVDVCwgTlVMTCwgMCk7Ci0jZW5kaWYKKwkJUlRNUF9VUERBVEVfUFJPVEVDVChwQWQpOwkvKiBlZGl0IGJ5IGpvaG5saSwgZml4ICJpbl9pbnRlcnJ1cHQiIGVycm9yIHdoZW4gY2FsbCAiTWFjVGFibGVEZWxldGVFbnRyeSIgaW4gUnggdGFza2xldCAqLwogCX0KIAogCXJldHVybiBUUlVFOwogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAlEZXNjcmlwdGlvbjoKQEAgLTIzNTQsMzQgKzE3NTIsMzAgQEAKIAkJdGhlIHBvd2VyLXNhdmluZyBxdWV1ZXMgYXJlIGZyZWVkIGhlcmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBNYWNUYWJsZVJlc2V0KAotCUlOICBQUlRNUF9BREFQVEVSICBwQWQpCit2b2lkIE1hY1RhYmxlUmVzZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCWludCAgICAgICAgIGk7CisJaW50IGk7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZVJlc2V0XG4iKSk7Ci0JLy9OZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCS8qTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsgKi8KIAotCWZvciAoaT0xOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCi0JewotI2lmZGVmIFJUMjg2MAotCQlSVDI4WFhfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIGkpOwotI2VuZGlmCi0JCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgPT0gVFJVRSkKLQkgICB7Ci0JCQkvLyBmcmVlIHJlc291cmNlcyBvZiBCQQorCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKSB7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJCVJUTVBfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIGkpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID09IFRSVUUpIHsKKworCQkJLyogZnJlZSByZXNvdXJjZXMgb2YgQkEgKi8KIAkJCUJBU2Vzc2lvblRlYXJEb3duQUxMKHBBZCwgaSk7CiAKIAkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9IEZBTFNFOwogCi0KLQotI2lmZGVmIFJUMjg3MAorI2lmZGVmIFJUTVBfTUFDX1VTQgogCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtpXS5BZGRyLCA2KTsKLQkJCVJUMjhYWF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgaSk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisJCQlSVE1QX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCBpKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCQkJLy9Bc2ljRGVsV2NpZFRhYihwQWQsIGkpOworCQkJLypBc2ljRGVsV2NpZFRhYihwQWQsIGkpOyAqLwogCQl9CiAJfQogCkBAIC0yMzk2LDIyICsxNzkwLDE5IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgQXNzb2NQYXJtRmlsbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBPVVQgTUxNRV9BU1NPQ19SRVFfU1RSVUNUICpBc3NvY1JlcSwKLQlJTiBQVUNIQVIgICAgICAgICAgICAgICAgICAgICBwQWRkciwKLQlJTiBVU0hPUlQgICAgICAgICAgICAgICAgICAgICBDYXBhYmlsaXR5SW5mbywKLQlJTiBVTE9ORyAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0LAotCUlOIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIExpc3RlbkludHYpCit2b2lkIEFzc29jUGFybUZpbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICBzdHJ1Y3QgcnRfbWxtZV9hc3NvY19yZXEgKkFzc29jUmVxLAorCQkgICB1OCAqcEFkZHIsCisJCSAgIHUxNiBDYXBhYmlsaXR5SW5mbywKKwkJICAgdW5zaWduZWQgbG9uZyBUaW1lb3V0LCB1MTYgTGlzdGVuSW50dikKIHsKIAlDT1BZX01BQ19BRERSKEFzc29jUmVxLT5BZGRyLCBwQWRkcik7Ci0JLy8gQWRkIG1hc2sgdG8gc3VwcG9ydCA4MDIuMTFiIG1vZGUgb25seQotCUFzc29jUmVxLT5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvICYgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTzsgLy8gbm90IGNmLXBvbGxhYmxlLCBub3QgY2YtcG9sbC1yZXF1ZXN0CisJLyogQWRkIG1hc2sgdG8gc3VwcG9ydCA4MDIuMTFiIG1vZGUgb25seSAqLworCUFzc29jUmVxLT5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvICYgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTzsJLyogbm90IGNmLXBvbGxhYmxlLCBub3QgY2YtcG9sbC1yZXF1ZXN0ICovCiAJQXNzb2NSZXEtPlRpbWVvdXQgPSBUaW1lb3V0OwogCUFzc29jUmVxLT5MaXN0ZW5JbnR2ID0gTGlzdGVuSW50djsKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CkBAIC0yNDIwLDE3ICsxODExLDE0IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgRGlzYXNzb2NQYXJtRmlsbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBPVVQgTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICpEaXNhc3NvY1JlcSwKLQlJTiBQVUNIQVIgcEFkZHIsCi0JSU4gVVNIT1JUIFJlYXNvbikKK3ZvaWQgRGlzYXNzb2NQYXJtRmlsbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgIHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSAqRGlzYXNzb2NSZXEsCisJCSAgICAgIHU4ICpwQWRkciwgdTE2IFJlYXNvbikKIHsKIAlDT1BZX01BQ19BRERSKERpc2Fzc29jUmVxLT5BZGRyLCBwQWRkcik7CiAJRGlzYXNzb2NSZXEtPlJlYXNvbiA9IFJlYXNvbjsKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0yNDY1LDc2ICsxODUzLDY5IEBACiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwogCi1CT09MRUFOIFJUTVBDaGVja0RIQ1BGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK0JPT0xFQU4gUlRNUENoZWNrREhDUEZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqcFBhY2tldCkKIHsKLQlQQUNLRVRfSU5GTyAJUGFja2V0SW5mbzsKLQlVTE9ORwkJCU51bWJlck9mQnl0ZXNSZWFkID0gMDsKLQlVTE9ORwkJCUN1cnJlbnRPZmZzZXQgPSAwOwotCVBWT0lECQkJcFZpcnR1YWxBZGRyZXNzID0gTlVMTDsKLQlVSU5UCQkJTmRpc0J1ZmZlckxlbmd0aDsKLQlQVUNIQVIJCQlwU3JjOwotCVVTSE9SVAkJCVByb3RvY29sOwotCVVDSEFSCQkJQnl0ZU9mZnNldDM2ID0gMDsKLQlVQ0hBUgkJCUJ5dGVPZmZzZXQzOCA9IDA7Ci0JQk9PTEVBTiAJCVJlYWRGaXJzdFBhcm0gPSBUUlVFOworCXN0cnVjdCBydF9wYWNrZXRfaW5mbyBQYWNrZXRJbmZvOworCXVuc2lnbmVkIGxvbmcgTnVtYmVyT2ZCeXRlc1JlYWQgPSAwOworCXVuc2lnbmVkIGxvbmcgQ3VycmVudE9mZnNldCA9IDA7CisJdm9pZCAqcFZpcnR1YWxBZGRyZXNzID0gTlVMTDsKKwl1MzIgTmRpc0J1ZmZlckxlbmd0aDsKKwl1OCAqcFNyYzsKKwl1MTYgUHJvdG9jb2w7CisJdTggQnl0ZU9mZnNldDM2ID0gMDsKKwl1OCBCeXRlT2Zmc2V0MzggPSAwOworCUJPT0xFQU4gUmVhZEZpcnN0UGFybSA9IFRSVUU7CiAKLQlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgKFBVQ0hBUiAqKSZwVmlydHVhbEFkZHJlc3MsICZOZGlzQnVmZmVyTGVuZ3RoKTsKKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgKHU4ICoqKSAmIHBWaXJ0dWFsQWRkcmVzcywKKwkJCSAgICAgJk5kaXNCdWZmZXJMZW5ndGgpOwogCiAJTnVtYmVyT2ZCeXRlc1JlYWQgKz0gTmRpc0J1ZmZlckxlbmd0aDsKLQlwU3JjID0gKFBVQ0hBUikgcFZpcnR1YWxBZGRyZXNzOworCXBTcmMgPSAodTggKilwVmlydHVhbEFkZHJlc3M7CiAJUHJvdG9jb2wgPSAqKHBTcmMgKyAxMikgKiAyNTYgKyAqKHBTcmMgKyAxMyk7CiAKLQkvLwotCS8vIENoZWNrIERIQ1AgJiBCT09UUCBwcm90b2NvbAotCS8vCi0Jd2hpbGUgKE51bWJlck9mQnl0ZXNSZWFkIDw9IFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGgpCi0JewotCQlpZiAoKE51bWJlck9mQnl0ZXNSZWFkID49IDM1KSAmJiAoUmVhZEZpcnN0UGFybSA9PSBUUlVFKSkKLQkJewotCQkJQ3VycmVudE9mZnNldCA9IDM1IC0gKE51bWJlck9mQnl0ZXNSZWFkIC0gTmRpc0J1ZmZlckxlbmd0aCk7CisJLyogKi8KKwkvKiBDaGVjayBESENQICYgQk9PVFAgcHJvdG9jb2wgKi8KKwkvKiAqLworCXdoaWxlIChOdW1iZXJPZkJ5dGVzUmVhZCA8PSBQYWNrZXRJbmZvLlRvdGFsUGFja2V0TGVuZ3RoKSB7CisJCWlmICgoTnVtYmVyT2ZCeXRlc1JlYWQgPj0gMzUpICYmIChSZWFkRmlyc3RQYXJtID09IFRSVUUpKSB7CisJCQlDdXJyZW50T2Zmc2V0ID0KKwkJCSAgICAzNSAtIChOdW1iZXJPZkJ5dGVzUmVhZCAtIE5kaXNCdWZmZXJMZW5ndGgpOwogCQkJQnl0ZU9mZnNldDM2ID0gKihwU3JjICsgQ3VycmVudE9mZnNldCk7CiAJCQlSZWFkRmlyc3RQYXJtID0gRkFMU0U7CiAJCX0KIAotCQlpZiAoTnVtYmVyT2ZCeXRlc1JlYWQgPj0gMzcpCi0JCXsKLQkJCUN1cnJlbnRPZmZzZXQgPSAzNyAtIChOdW1iZXJPZkJ5dGVzUmVhZCAtIE5kaXNCdWZmZXJMZW5ndGgpOworCQlpZiAoTnVtYmVyT2ZCeXRlc1JlYWQgPj0gMzcpIHsKKwkJCUN1cnJlbnRPZmZzZXQgPQorCQkJICAgIDM3IC0gKE51bWJlck9mQnl0ZXNSZWFkIC0gTmRpc0J1ZmZlckxlbmd0aCk7CiAJCQlCeXRlT2Zmc2V0MzggPSAqKHBTcmMgKyBDdXJyZW50T2Zmc2V0KTsKLQkJCS8vRW5kIG9mIFJlYWQKKwkJCS8qRW5kIG9mIFJlYWQgKi8KIAkJCWJyZWFrOwogCQl9CiAJCXJldHVybiBGQUxTRTsKIAl9CiAKLQkvLyBDaGVjayBmb3IgREhDUCAmIEJPT1RQIHByb3RvY29sCi0JaWYgKChCeXRlT2Zmc2V0MzYgIT0gMHg0NCkgfHwgKEJ5dGVPZmZzZXQzOCAhPSAweDQzKSkKLQkJewotCQkvLwotCQkvLyAyMDU0IChoZXggMDgwNikgZm9yIEFSUCBkYXRhZ3JhbXMKLQkJLy8gaWYgdGhpcyBwYWNrZXQgaXMgbm90IEFSUCBkYXRhZ3JhbXMsIHRoZW4gZG8gbm90aGluZwotCQkvLyBBUlAgZGF0YWdyYW1zIHdpbGwgYWxzbyBiZSBkdXBsaWNhdGUgYXQgMW1iIGJyb2FkY2FzdCBmcmFtZXMKLQkJLy8KLQkJaWYgKFByb3RvY29sICE9IDB4MDgwNiApCisJLyogQ2hlY2sgZm9yIERIQ1AgJiBCT09UUCBwcm90b2NvbCAqLworCWlmICgoQnl0ZU9mZnNldDM2ICE9IDB4NDQpIHx8IChCeXRlT2Zmc2V0MzggIT0gMHg0MykpIHsKKwkJLyogKi8KKwkJLyogMjA1NCAoaGV4IDA4MDYpIGZvciBBUlAgZGF0YWdyYW1zICovCisJCS8qIGlmIHRoaXMgcGFja2V0IGlzIG5vdCBBUlAgZGF0YWdyYW1zLCB0aGVuIGRvIG5vdGhpbmcgKi8KKwkJLyogQVJQIGRhdGFncmFtcyB3aWxsIGFsc28gYmUgZHVwbGljYXRlIGF0IDFtYiBicm9hZGNhc3QgZnJhbWVzICovCisJCS8qICovCisJCWlmIChQcm90b2NvbCAhPSAweDA4MDYpCiAJCQlyZXR1cm4gRkFMU0U7Ci0JCX0KKwl9CiAKIAlyZXR1cm4gVFJVRTsKIH0KIAotCi1CT09MRUFOIFJUTVBDaGVja0V0aGVyVHlwZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK0JPT0xFQU4gUlRNUENoZWNrRXRoZXJUeXBlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqcFBhY2tldCkKIHsKLQlVU0hPUlQJVHlwZUxlbjsKLQlVQ0hBUglCeXRlMCwgQnl0ZTE7Ci0JUFVDSEFSCXBTcmNCdWY7Ci0JVUlOVDMyCXBrdExlbjsKLQlVSU5UMTYgCXNyY1BvcnQsIGRzdFBvcnQ7Ci0JQk9PTEVBTglzdGF0dXMgPSBUUlVFOwotCisJdTE2IFR5cGVMZW47CisJdTggQnl0ZTAsIEJ5dGUxOworCXU4ICpwU3JjQnVmOworCXUzMiBwa3RMZW47CisJdTE2IHNyY1BvcnQsIGRzdFBvcnQ7CisJQk9PTEVBTiBzdGF0dXMgPSBUUlVFOwogCiAJcFNyY0J1ZiA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKIAlwa3RMZW4gPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKQEAgLTI1NDMsMzUgKzE5MjQsMzEgQEAKIAogCVJUTVBfU0VUX1BBQ0tFVF9TUEVDSUZJQyhwUGFja2V0LCAwKTsKIAotCS8vIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZAotCVR5cGVMZW4gPSAocFNyY0J1ZlsxMl0gPDwgOCkgKyBwU3JjQnVmWzEzXTsKKwkvKiBnZXQgRXRoZXJuZXQgcHJvdG9jb2wgZmllbGQgKi8KKwlUeXBlTGVuID0gKHBTcmNCdWZbMTJdIDw8IDgpIHwgcFNyY0J1ZlsxM107CiAKLQlwU3JjQnVmICs9IExFTkdUSF84MDJfMzsJLy8gU2tpcCB0aGUgRXRoZXJuZXQgSGVhZGVyLgorCXBTcmNCdWYgKz0gTEVOR1RIXzgwMl8zOwkvKiBTa2lwIHRoZSBFdGhlcm5ldCBIZWFkZXIuICovCiAKLQlpZiAoVHlwZUxlbiA8PSAxNTAwKQotCXsJLy8gODAyLjMsIDgwMi4zIExMQworCWlmIChUeXBlTGVuIDw9IDE1MDApIHsJLyogODAyLjMsIDgwMi4zIExMQyAqLwogCQkvKgotCQkJRGVzdE1BQyg2KSArIFNyY01BQyg2KSArIExlbmdodCgyKSArCi0JCQlEU0FQKDEpICsgU1NBUCgxKSArIENvbnRyb2woMSkgKwotCQkJaWYgdGhlIERTQVAgPSAweEFBLCBTU0FQPTB4QUEsIENvbnRvcmwgPSAweDAzLCBpdCBoYXMgYSA1LWJ5dGVzIFNOQVAgaGVhZGVyLgotCQkJCT0+ICsgU05BUCAoNSwgT3JpZ2luYXRpb25JRCgzKSArIGV0aGVyVHlwZSgyKSkKLQkJKi8KLQkJaWYgKHBTcmNCdWZbMF0gPT0gMHhBQSAmJiBwU3JjQnVmWzFdID09IDB4QUEgJiYgcFNyY0J1ZlsyXSA9PSAweDAzKQotCQl7Ci0JCQlTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKHBTcmNCdWYsIDYsICZCeXRlMCwgJkJ5dGUxKTsKKwkJICAgRGVzdE1BQyg2KSArIFNyY01BQyg2KSArIExlbmdodCgyKSArCisJCSAgIERTQVAoMSkgKyBTU0FQKDEpICsgQ29udHJvbCgxKSArCisJCSAgIGlmIHRoZSBEU0FQID0gMHhBQSwgU1NBUD0weEFBLCBDb250b3JsID0gMHgwMywgaXQgaGFzIGEgNS1ieXRlcyBTTkFQIGhlYWRlci4KKwkJICAgPT4gKyBTTkFQICg1LCBPcmlnaW5hdGlvbklEKDMpICsgZXRoZXJUeXBlKDIpKQorCQkgKi8KKwkJaWYgKHBTcmNCdWZbMF0gPT0gMHhBQSAmJiBwU3JjQnVmWzFdID09IDB4QUEKKwkJICAgICYmIHBTcmNCdWZbMl0gPT0gMHgwMykgeworCQkJU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcigoY2hhciAqKXBTcmNCdWYsIDYsCisJCQkJCQkgICZCeXRlMCwgJkJ5dGUxKTsKIAkJCVJUTVBfU0VUX1BBQ0tFVF9MTENTTkFQKHBQYWNrZXQsIDEpOwotCQkJVHlwZUxlbiA9IChVU0hPUlQpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKLQkJCXBTcmNCdWYgKz0gODsgLy8gU2tpcCB0aGlzIExMQy9TTkFQIGhlYWRlcgotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy9JdCBqdXN0IGhhcyAzLWJ5dGUgTExDIGhlYWRlciwgbWF5YmUgYSBsZWdhY3kgZXRoZXIgdHlwZSBmcmFtZS4gd2UgZGlkbid0IGhhbmRsZSBpdC4KKwkJCVR5cGVMZW4gPSAodTE2KSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CisJCQlwU3JjQnVmICs9IDg7CS8qIFNraXAgdGhpcyBMTEMvU05BUCBoZWFkZXIgKi8KKwkJfSBlbHNlIHsKKwkJCS8qSXQganVzdCBoYXMgMy1ieXRlIExMQyBoZWFkZXIsIG1heWJlIGEgbGVnYWN5IGV0aGVyIHR5cGUgZnJhbWUuIHdlIGRpZG4ndCBoYW5kbGUgaXQuICovCiAJCX0KIAl9Ci0KLQkvLyBJZiBpdCdzIGEgVkxBTiBwYWNrZXQsIGdldCB0aGUgcmVhbCBUeXBlL0xlbmd0aCBmaWVsZC4KLQlpZiAoVHlwZUxlbiA9PSAweDgxMDApCi0JeworCS8qIElmIGl0J3MgYSBWTEFOIHBhY2tldCwgZ2V0IHRoZSByZWFsIFR5cGUvTGVuZ3RoIGZpZWxkLiAqLworCWlmIChUeXBlTGVuID09IDB4ODEwMCkgewogCQkvKiAweDgxMDAgbWVhbnMgVkxBTiBwYWNrZXRzICovCiAKIAkJLyogRGVzdC4gTUFDIEFkZHJlc3MgKDYtYnl0ZXMpICsKQEAgLTI1ODQsMjQzICsxOTYxLDIyOSBAQAogCQkgICBGcmFtZSBDaGVjayBTZXF1ZW5jZSAoNC1ieXRlcykgKi8KIAogCQlSVE1QX1NFVF9QQUNLRVRfVkxBTihwUGFja2V0LCAxKTsKLQkJU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihwU3JjQnVmLCAyLCAmQnl0ZTAsICZCeXRlMSk7Ci0JCVR5cGVMZW4gPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CisJCVNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoKGNoYXIgKilwU3JjQnVmLCAyLCAmQnl0ZTAsCisJCQkJCSAgJkJ5dGUxKTsKKwkJVHlwZUxlbiA9ICh1MTYpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKIAotCQlwU3JjQnVmICs9IDQ7IC8vIFNraXAgdGhlIFZMQU4gSGVhZGVyLgorCQlwU3JjQnVmICs9IDQ7CS8qIFNraXAgdGhlIFZMQU4gSGVhZGVyLiAqLwogCX0KIAotCXN3aXRjaCAoVHlwZUxlbikKLQl7Ci0JCWNhc2UgMHgwODAwOgotCQkJewotCQkJCUFTU0VSVCgocGt0TGVuID4gMzQpKTsKLQkJCQlpZiAoKihwU3JjQnVmICsgOSkgPT0gMHgxMSkKLQkJCQl7CS8vIHVkcCBwYWNrZXQKLQkJCQkJQVNTRVJUKChwa3RMZW4gPiAzNCkpOwkvLyAxNCBmb3IgZXRoZXJuZXQgaGVhZGVyLCAyMCBmb3IgSVAgaGVhZGVyCisJc3dpdGNoIChUeXBlTGVuKSB7CisJY2FzZSAweDA4MDA6CisJCXsKKwkJCUFTU0VSVCgocGt0TGVuID4gMzQpKTsKKwkJCWlmICgqKHBTcmNCdWYgKyA5KSA9PSAweDExKSB7CS8qIHVkcCBwYWNrZXQgKi8KKwkJCQlBU1NFUlQoKHBrdExlbiA+IDM0KSk7CS8qIDE0IGZvciBldGhlcm5ldCBoZWFkZXIsIDIwIGZvciBJUCBoZWFkZXIgKi8KIAotCQkJCQlwU3JjQnVmICs9IDIwOwkvLyBTa2lwIHRoZSBJUCBoZWFkZXIKLQkJCQkJc3JjUG9ydCA9IE9TX05UT0hTKCooKFVJTlQxNiAqKXBTcmNCdWYpKTsKLQkJCQkJZHN0UG9ydCA9IE9TX05UT0hTKCooKFVJTlQxNiAqKShwU3JjQnVmICsyKSkpOworCQkJCXBTcmNCdWYgKz0gMjA7CS8qIFNraXAgdGhlIElQIGhlYWRlciAqLworCQkJCXNyY1BvcnQgPQorCQkJCSAgICBPU19OVE9IUyhnZXRfdW5hbGlnbmVkCisJCQkJCSAgICAgKCh1MTYgKikocFNyY0J1ZikpKTsKKwkJCQlkc3RQb3J0ID0KKwkJCQkgICAgT1NfTlRPSFMoZ2V0X3VuYWxpZ25lZAorCQkJCQkgICAgICgodTE2ICopKHBTcmNCdWYgKyAyKSkpOwogCi0JCQkJCWlmICgoc3JjUG9ydD09MHg0NCAmJiBkc3RQb3J0PT0weDQzKSB8fCAoc3JjUG9ydD09MHg0MyAmJiBkc3RQb3J0PT0weDQ0KSkKLQkJCQkJewkvL0l0J3MgYSBCT09UUC9ESENQIHBhY2tldAotCQkJCQkJUlRNUF9TRVRfUEFDS0VUX0RIQ1AocFBhY2tldCwgMSk7Ci0JCQkJCX0KKwkJCQlpZiAoKHNyY1BvcnQgPT0gMHg0NCAmJiBkc3RQb3J0ID09IDB4NDMpIHx8IChzcmNQb3J0ID09IDB4NDMgJiYgZHN0UG9ydCA9PSAweDQ0KSkgewkvKkl0J3MgYSBCT09UUC9ESENQIHBhY2tldCAqLworCQkJCQlSVE1QX1NFVF9QQUNLRVRfREhDUChwUGFja2V0LCAxKTsKIAkJCQl9CiAJCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAweDA4MDY6Ci0JCQl7Ci0JCQkJLy9BUlAgUGFja2V0LgotCQkJCVJUTVBfU0VUX1BBQ0tFVF9ESENQKHBQYWNrZXQsIDEpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMHg4ODhlOgotCQkJewotCQkJCS8vIEVBUE9MIFBhY2tldC4KLQkJCQlSVE1QX1NFVF9QQUNLRVRfRUFQT0wocFBhY2tldCwgMSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXN0YXR1cyA9IEZBTFNFOwotCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAweDA4MDY6CisJCXsKKwkJCS8qQVJQIFBhY2tldC4gKi8KKwkJCVJUTVBfU0VUX1BBQ0tFVF9ESENQKHBQYWNrZXQsIDEpOworCQl9CisJCWJyZWFrOworCWNhc2UgMHg4ODhlOgorCQl7CisJCQkvKiBFQVBPTCBQYWNrZXQuICovCisJCQlSVE1QX1NFVF9QQUNLRVRfRUFQT0wocFBhY2tldCwgMSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RhdHVzID0gRkFMU0U7CisJCWJyZWFrOwogCX0KIAogCXJldHVybiBzdGF0dXM7CiAKIH0KIAordm9pZCBVcGRhdGVfUnNzaV9TYW1wbGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X3Jzc2lfc2FtcGxlICpwUnNzaSwgc3RydWN0IHJ0X3J4d2kgKiBwUnhXSSkKK3sKKwljaGFyIHJzc2kwID0gcFJ4V0ktPlJTU0kwOworCWNoYXIgcnNzaTEgPSBwUnhXSS0+UlNTSTE7CisJY2hhciByc3NpMiA9IHBSeFdJLT5SU1NJMjsKIAotCi1WT0lEIFVwZGF0ZV9Sc3NpX1NhbXBsZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBSU1NJX1NBTVBMRQkJKnBSc3NpLAotCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSkKLQkJewotCUNIQVIJcnNzaTAgPSBwUnhXSS0+UlNTSTA7Ci0JQ0hBUglyc3NpMSA9IHBSeFdJLT5SU1NJMTsKLQlDSEFSCXJzc2kyID0gcFJ4V0ktPlJTU0kyOwotCi0JaWYgKHJzc2kwICE9IDApCi0JewotCQlwUnNzaS0+TGFzdFJzc2kwCT0gQ29udmVydFRvUnNzaShwQWQsIChDSEFSKXJzc2kwLCBSU1NJXzApOwotCQlwUnNzaS0+QXZnUnNzaTBYOAk9IChwUnNzaS0+QXZnUnNzaTBYOCAtIHBSc3NpLT5BdmdSc3NpMCkgKyBwUnNzaS0+TGFzdFJzc2kwOwotCQlwUnNzaS0+QXZnUnNzaTAJPSBwUnNzaS0+QXZnUnNzaTBYOCA+PiAzOworCWlmIChyc3NpMCAhPSAwKSB7CisJCXBSc3NpLT5MYXN0UnNzaTAgPSBDb252ZXJ0VG9Sc3NpKHBBZCwgKGNoYXIpcnNzaTAsIFJTU0lfMCk7CisJCXBSc3NpLT5BdmdSc3NpMFg4ID0KKwkJICAgIChwUnNzaS0+QXZnUnNzaTBYOCAtIHBSc3NpLT5BdmdSc3NpMCkgKyBwUnNzaS0+TGFzdFJzc2kwOworCQlwUnNzaS0+QXZnUnNzaTAgPSBwUnNzaS0+QXZnUnNzaTBYOCA+PiAzOwogCX0KIAotCWlmIChyc3NpMSAhPSAwKQotCXsKLQkJcFJzc2ktPkxhc3RSc3NpMQk9IENvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUilyc3NpMSwgUlNTSV8xKTsKLQkJcFJzc2ktPkF2Z1Jzc2kxWDgJPSAocFJzc2ktPkF2Z1Jzc2kxWDggLSBwUnNzaS0+QXZnUnNzaTEpICsgcFJzc2ktPkxhc3RSc3NpMTsKLQkJcFJzc2ktPkF2Z1Jzc2kxCT0gcFJzc2ktPkF2Z1Jzc2kxWDggPj4gMzsKKwlpZiAocnNzaTEgIT0gMCkgeworCQlwUnNzaS0+TGFzdFJzc2kxID0gQ29udmVydFRvUnNzaShwQWQsIChjaGFyKXJzc2kxLCBSU1NJXzEpOworCQlwUnNzaS0+QXZnUnNzaTFYOCA9CisJCSAgICAocFJzc2ktPkF2Z1Jzc2kxWDggLSBwUnNzaS0+QXZnUnNzaTEpICsgcFJzc2ktPkxhc3RSc3NpMTsKKwkJcFJzc2ktPkF2Z1Jzc2kxID0gcFJzc2ktPkF2Z1Jzc2kxWDggPj4gMzsKIAl9CiAKLQlpZiAocnNzaTIgIT0gMCkKLQl7Ci0JCXBSc3NpLT5MYXN0UnNzaTIJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpcnNzaTIsIFJTU0lfMik7Ci0JCXBSc3NpLT5BdmdSc3NpMlg4ICA9IChwUnNzaS0+QXZnUnNzaTJYOCAtIHBSc3NpLT5BdmdSc3NpMikgKyBwUnNzaS0+TGFzdFJzc2kyOworCWlmIChyc3NpMiAhPSAwKSB7CisJCXBSc3NpLT5MYXN0UnNzaTIgPSBDb252ZXJ0VG9Sc3NpKHBBZCwgKGNoYXIpcnNzaTIsIFJTU0lfMik7CisJCXBSc3NpLT5BdmdSc3NpMlg4ID0KKwkJICAgIChwUnNzaS0+QXZnUnNzaTJYOCAtIHBSc3NpLT5BdmdSc3NpMikgKyBwUnNzaS0+TGFzdFJzc2kyOwogCQlwUnNzaS0+QXZnUnNzaTIgPSBwUnNzaS0+QXZnUnNzaTJYOCA+PiAzOwogCX0KIH0KIAotCi0KLS8vIE5vcm1hbCBsZWdhY3kgUnggcGFja2V0IGluZGljYXRpb24KLVZPSUQgSW5kaWNhdGVfTGVnYWN5X1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCisvKiBOb3JtYWwgbGVnYWN5IFJ4IHBhY2tldCBpbmRpY2F0aW9uICovCit2b2lkIEluZGljYXRlX0xlZ2FjeV9QYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpCiB7Ci0JUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OwotCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKKwl2b2lkICpwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKwl1OCBIZWFkZXI4MDJfM1tMRU5HVEhfODAyXzNdOwogCi0JLy8gMS4gZ2V0IDgwMi4zIEhlYWRlcgotCS8vIDIuIHJlbW92ZSBMTEMKLQkvLyAJCWEuIHBvaW50ZXIgcFJ4QmxrLT5wRGF0YSB0byBwYXlsb2FkCi0JLy8gICAgICBiLiBtb2RpZnkgcFJ4QmxrLT5EYXRhU2l6ZQorCS8qIDEuIGdldCA4MDIuMyBIZWFkZXIgKi8KKwkvKiAyLiByZW1vdmUgTExDICovCisJLyogICAgICAgICAgICAgIGEuIHBvaW50ZXIgcFJ4QmxrLT5wRGF0YSB0byBwYXlsb2FkICovCisJLyogICAgICBiLiBtb2RpZnkgcFJ4QmxrLT5EYXRhU2l6ZSAqLwogCVJUTVBfODAyXzExX1JFTU9WRV9MTENfQU5EX0NPTlZFUlRfVE9fODAyXzMocFJ4QmxrLCBIZWFkZXI4MDJfMyk7CiAKLQlpZiAocFJ4QmxrLT5EYXRhU2l6ZSA+IE1BWF9SWF9QS1RfTEVOKQotCXsKKwlpZiAocFJ4QmxrLT5EYXRhU2l6ZSA+IE1BWF9SWF9QS1RfTEVOKSB7CiAKLQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJLyogcmVsZWFzZSBwYWNrZXQgKi8KIAkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCXJldHVybjsKIAl9CiAKLQogCVNUQVRTX0lOQ19SWF9QQUNLRVRTKHBBZCwgRnJvbVdoaWNoQlNTSUQpOwogCi0jaWZkZWYgUlQyODcwCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKQotCXsKLQkJUEJBX1JFQ19FTlRSWQkJcEJBRW50cnk7Ci0JCVVMT05HCQkJCU5vdzMyOwotCQlVQ0hBUgkJCQlXY2lkID0gcFJ4QmxrLT5wUnhXSS0+V2lyZWxlc3NDbGlJRDsKLQkJVUNIQVIJCQkJVElEID0gcFJ4QmxrLT5wUnhXSS0+VElEOwotCQlVU0hPUlQJCQkJSWR4OworI2lmZGVmIFJUTVBfTUFDX1VTQgorCWlmIChwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPT0gMCkgeworCQlzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwQkFFbnRyeTsKKwkJdW5zaWduZWQgbG9uZyBOb3czMjsKKwkJdTggV2NpZCA9IHBSeEJsay0+cFJ4V0ktPldpcmVsZXNzQ2xpSUQ7CisJCXU4IFRJRCA9IHBSeEJsay0+cFJ4V0ktPlRJRDsKKwkJdTE2IElkeDsKIAotI2RlZmluZSBSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUCQkoKDEwMCAqIEhaKS8xMDAwKQkvLyBzeXN0ZW0gdGlja3MgLS0gMTAwIG1zCisjZGVmaW5lIFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJCSgoMTAwICogT1NfSFopLzEwMDApCS8qIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMgKi8KIAotCQlpZiAoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCQl7CisJCWlmIChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpIHsKIAkJCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXTsKLQkJCWlmIChJZHggIT0gMCkKLQkJCXsKKwkJCWlmIChJZHggIT0gMCkgewogCQkJCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07Ci0JCQkJLy8gdXBkYXRlIGxhc3QgcnggdGltZQorCQkJCS8qIHVwZGF0ZSBsYXN0IHJ4IHRpbWUgKi8KIAkJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3czMik7CiAJCQkJaWYgKChwQkFFbnRyeS0+bGlzdC5xbGVuID4gMCkgJiYKLQkJCQkJIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpKQotCSAgIAkJCQkpCi0JCQkJewotCQkJCQlwcmludGsoIkluZGljYXRlX0xlZ2FjeV9QYWNrZXQoKTpmbHVzaCByZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMhIFJ4V0ktPkZsYWdzPSVkLCBwUnhXSS5USUQ9JWQsIFJ4RC0+QU1QRFU9JWQhXG4iLCBwUnhCbGstPkZsYWdzLCBwUnhCbGstPnBSeFdJLT5USUQsIHBSeEJsay0+UnhELkFNUERVKTsKLQkJCQkJaGV4X2R1bXAoIkR1bXAgdGhlIGxlZ2FjeSBQYWNrZXQ6IiwgR0VUX09TX1BLVF9EQVRBUFRSKHBSeEJsay0+cFJ4UGFja2V0KSwgNjQpOwotCQkJCQliYV9mbHVzaF9yZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMocEFkLCBwQkFFbnRyeSwgTm93MzIpOworCQkJCSAgICBSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsCisJCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT4KKwkJCQkJCQkJICAgIExhc3RJbmRTZXFBdFRpbWVyCisJCQkJCQkJCSAgICArCisJCQkJCQkJCSAgICAoUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpKQorCQkJCSAgICApIHsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLAorCQkJCQkJICgiSW5kaWNhdGVfTGVnYWN5X1BhY2tldCgpOmZsdXNoIHJlb3JkZXJpbmdfdGltZW91dF9tcGR1cyEgUnhXSS0+RmxhZ3M9JWQsIHBSeFdJLlRJRD0lZCwgUnhELT5BTVBEVT0lZCFcbiIsCisJCQkJCQkgIHBSeEJsay0+RmxhZ3MsCisJCQkJCQkgIHBSeEJsay0+cFJ4V0ktPlRJRCwKKwkJCQkJCSAgcFJ4QmxrLT5SeEQuQU1QRFUpKTsKKwkJCQkJaGV4X2R1bXAoIkR1bXAgdGhlIGxlZ2FjeSBQYWNrZXQ6IiwKKwkJCQkJCSBHRVRfT1NfUEtUX0RBVEFQVFIocFJ4QmxrLT4KKwkJCQkJCQkJICAgIHBSeFBhY2tldCksCisJCQkJCQkgNjQpOworCQkJCQliYV9mbHVzaF9yZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMocEFkLAorCQkJCQkJCQkJICBwQkFFbnRyeSwKKwkJCQkJCQkJCSAgTm93MzIpOwogCQkJCX0KIAkJCX0KIAkJfQogCX0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAogCXdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldChwQWQsIHBSeEJsaywgSGVhZGVyODAyXzMsIEZyb21XaGljaEJTU0lEKTsKIAotCS8vCi0JLy8gcGFzcyB0aGlzIDgwMi4zIHBhY2tldCB0byB1cHBlciBsYXllciBvciBmb3J3YXJkIHRoaXMgcGFja2V0IHRvIFdNIGRpcmVjdGx5Ci0JLy8KKwkvKiAqLworCS8qIHBhc3MgdGhpcyA4MDIuMyBwYWNrZXQgdG8gdXBwZXIgbGF5ZXIgb3IgZm9yd2FyZCB0aGlzIHBhY2tldCB0byBXTSBkaXJlY3RseSAqLworCS8qICovCiAJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKIH0KIAotCi0vLyBOb3JtYWwsIEFNUERVIG9yIEFNU0RVCi1WT0lEIENtbVJ4bm9uUmFsaW5rRnJhbWVJbmRpY2F0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCisvKiBOb3JtYWwsIEFNUERVIG9yIEFNU0RVICovCit2b2lkIENtbVJ4bm9uUmFsaW5rRnJhbWVJbmRpY2F0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpCiB7Ci0JaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1QRFUpICYmIChwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPT0gMCkpCi0JeworCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNUERVKQorCSAgICAmJiAocEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID09IDApKSB7CiAJCUluZGljYXRlX0FNUERVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCX0KLQllbHNlCi0JewotCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSkpCi0JCXsKLQkJCS8vIGhhbmRsZSBBLU1TRFUKKwl9IGVsc2UgeworCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSkpIHsKKwkJCS8qIGhhbmRsZSBBLU1TRFUgKi8KIAkJCUluZGljYXRlX0FNU0RVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwogCQl9CiAJfQogfQogCi0KLVZPSUQgQ21tUnhSYWxpbmtGcmFtZUluZGljYXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3ZvaWQgQ21tUnhSYWxpbmtGcmFtZUluZGljYXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJCSAgICAgIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpCiB7Ci0JVUNIQVIJCQlIZWFkZXI4MDJfM1tMRU5HVEhfODAyXzNdOwotCVVJTlQxNgkJCU1zZHUyU2l6ZTsKLQlVSU5UMTYgCQkJUGF5bG9hZDFTaXplLCBQYXlsb2FkMlNpemU7Ci0JUFVDSEFSIAkJCXBEYXRhMjsKLQlQTkRJU19QQUNLRVQJcFBhY2tldDIgPSBOVUxMOworCXU4IEhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107CisJdTE2IE1zZHUyU2l6ZTsKKwl1MTYgUGF5bG9hZDFTaXplLCBQYXlsb2FkMlNpemU7CisJdTggKnBEYXRhMjsKKwl2b2lkICpwUGFja2V0MiA9IE5VTEw7CiAKKwlNc2R1MlNpemUgPSAqKHBSeEJsay0+cERhdGEpICsgKCoocFJ4QmxrLT5wRGF0YSArIDEpIDw8IDgpOwogCi0KLQlNc2R1MlNpemUgPSAqKHBSeEJsay0+cERhdGEpICsgKCoocFJ4QmxrLT5wRGF0YSsxKSA8PCA4KTsKLQotCWlmICgoTXNkdTJTaXplIDw9IDE1MzYpICYmIChNc2R1MlNpemUgPCBwUnhCbGstPkRhdGFTaXplKSkKLQl7CisJaWYgKChNc2R1MlNpemUgPD0gMTUzNikgJiYgKE1zZHUyU2l6ZSA8IHBSeEJsay0+RGF0YVNpemUpKSB7CiAJCS8qIHNraXAgdHdvIGJ5dGUgTVNEVTIgbGVuICovCiAJCXBSeEJsay0+cERhdGEgKz0gMjsKIAkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSAyOwotCX0KLQllbHNlCi0JewotCQkvLyByZWxlYXNlIHBhY2tldAotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0gZWxzZSB7CisJCS8qIHJlbGVhc2UgcGFja2V0ICovCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwKKwkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCXJldHVybjsKIAl9CiAKLQkvLyBnZXQgODAyLjMgSGVhZGVyIGFuZCAgcmVtb3ZlIExMQworCS8qIGdldCA4MDIuMyBIZWFkZXIgYW5kICByZW1vdmUgTExDICovCiAJUlRNUF84MDJfMTFfUkVNT1ZFX0xMQ19BTkRfQ09OVkVSVF9UT184MDJfMyhwUnhCbGssIEhlYWRlcjgwMl8zKTsKIAogCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7CiAKLQkvLyBSYWxpbmsgQWdncmVnYXRpb24gZnJhbWUKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4QWdncmVnYXRpb25Db3VudCArKzsKKwkvKiBSYWxpbmsgQWdncmVnYXRpb24gZnJhbWUgKi8KKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4QWdncmVnYXRpb25Db3VudCsrOwogCVBheWxvYWQxU2l6ZSA9IHBSeEJsay0+RGF0YVNpemUgLSBNc2R1MlNpemU7CiAJUGF5bG9hZDJTaXplID0gTXNkdTJTaXplIC0gTEVOR1RIXzgwMl8zOwogCiAJcERhdGEyID0gcFJ4QmxrLT5wRGF0YSArIFBheWxvYWQxU2l6ZSArIExFTkdUSF84MDJfMzsKIAotCXBQYWNrZXQyID0gZHVwbGljYXRlX3BrdChwQWQsIChwRGF0YTItTEVOR1RIXzgwMl8zKSwgTEVOR1RIXzgwMl8zLCBwRGF0YTIsIFBheWxvYWQyU2l6ZSwgRnJvbVdoaWNoQlNTSUQpOworCXBQYWNrZXQyID0KKwkgICAgZHVwbGljYXRlX3BrdChwQWQsIChwRGF0YTIgLSBMRU5HVEhfODAyXzMpLCBMRU5HVEhfODAyXzMsIHBEYXRhMiwKKwkJCSAgUGF5bG9hZDJTaXplLCBGcm9tV2hpY2hCU1NJRCk7CiAKLQlpZiAoIXBQYWNrZXQyKQotCXsKLQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwlpZiAoIXBQYWNrZXQyKSB7CisJCS8qIHJlbGVhc2UgcGFja2V0ICovCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwKKwkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCXJldHVybjsKIAl9Ci0KLQkvLyB1cGRhdGUgcGF5bG9hZCBzaXplIG9mIDFzdCBwYWNrZXQKKwkvKiB1cGRhdGUgcGF5bG9hZCBzaXplIG9mIDFzdCBwYWNrZXQgKi8KIAlwUnhCbGstPkRhdGFTaXplID0gUGF5bG9hZDFTaXplOwogCXdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldChwQWQsIHBSeEJsaywgSGVhZGVyODAyXzMsIEZyb21XaGljaEJTU0lEKTsKIAotCUFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKKwlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LAorCQkJCQkgRnJvbVdoaWNoQlNTSUQpOwogCi0JaWYgKHBQYWNrZXQyKQotCXsKKwlpZiAocFBhY2tldDIpIHsKIAkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUGFja2V0MiwgRnJvbVdoaWNoQlNTSUQpOwogCX0KIH0KIAotCiAjZGVmaW5lIFJFU0VUX0ZSQUdGUkFNRShfZnJhZ0ZyYW1lKSBcCiAJewkJCQkJCQkJXAogCQlfZnJhZ0ZyYW1lLlJ4U2l6ZSA9IDA7CQlcCkBAIC0yODI5LDEwOSArMjE5MiwxMDIgQEAKIAkJX2ZyYWdGcmFtZS5GbGFncyA9IDA7CQlcCiAJfQogCi0KLVBORElTX1BBQ0tFVCBSVE1QRGVGcmFnbWVudERhdGFGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrKQordm9pZCAqUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGspCiB7Ci0JUEhFQURFUl84MDJfMTEJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKLQlQTkRJU19QQUNLRVQJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7Ci0JVUNIQVIJCQkqcERhdGEgPSBwUnhCbGstPnBEYXRhOwotCVVTSE9SVAkJCURhdGFTaXplID0gcFJ4QmxrLT5EYXRhU2l6ZTsKLQlQTkRJU19QQUNLRVQJcFJldFBhY2tldCA9IE5VTEw7Ci0JVUNIQVIJCQkqcEZyYWdCdWZmZXIgPSBOVUxMOwotCUJPT0xFQU4gCQliUmVhc3NEb25lID0gRkFMU0U7Ci0JVUNIQVIJCQlIZWFkZXJSb29tID0gMDsKLQorCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKKwl2b2lkICpwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKwl1OCAqcERhdGEgPSBwUnhCbGstPnBEYXRhOworCXUxNiBEYXRhU2l6ZSA9IHBSeEJsay0+RGF0YVNpemU7CisJdm9pZCAqcFJldFBhY2tldCA9IE5VTEw7CisJdTggKnBGcmFnQnVmZmVyID0gTlVMTDsKKwlCT09MRUFOIGJSZWFzc0RvbmUgPSBGQUxTRTsKKwl1OCBIZWFkZXJSb29tID0gMDsKIAogCUFTU0VSVChwSGVhZGVyKTsKIAotCUhlYWRlclJvb20gPSBwRGF0YSAtIChVQ0hBUiAqKXBIZWFkZXI7CisJSGVhZGVyUm9vbSA9IHBEYXRhIC0gKHU4ICopIHBIZWFkZXI7CiAKLQkvLyBSZS1hc3NlbWJsZSB0aGUgZnJhZ21lbnRlZCBwYWNrZXRzCi0JaWYgKHBIZWFkZXItPkZyYWcgPT0gMCkJCS8vIEZyYWcuIE51bWJlciBpcyAwIDogRmlyc3QgZnJhZyBvciBvbmx5IG9uZSBwa3QKKwkvKiBSZS1hc3NlbWJsZSB0aGUgZnJhZ21lbnRlZCBwYWNrZXRzICovCisJaWYgKHBIZWFkZXItPkZyYWcgPT0gMCkJLyogRnJhZy4gTnVtYmVyIGlzIDAgOiBGaXJzdCBmcmFnIG9yIG9ubHkgb25lIHBrdCAqLwogCXsKLQkJLy8gdGhlIGZpcnN0IHBrdCBvZiBmcmFnbWVudCwgcmVjb3JkIGl0LgotCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcpCi0JCXsKKwkJLyogdGhlIGZpcnN0IHBrdCBvZiBmcmFnbWVudCwgcmVjb3JkIGl0LiAqLworCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcpIHsKIAkJCUFTU0VSVChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCk7Ci0JCQlwRnJhZ0J1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCk7Ci0JCQlwQWQtPkZyYWdGcmFtZS5SeFNpemUgICA9IERhdGFTaXplICsgSGVhZGVyUm9vbTsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBGcmFnQnVmZmVyLAkgcEhlYWRlciwgcEFkLT5GcmFnRnJhbWUuUnhTaXplKTsKKwkJCXBGcmFnQnVmZmVyID0KKwkJCSAgICBHRVRfT1NfUEtUX0RBVEFQVFIocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQpOworCQkJcEFkLT5GcmFnRnJhbWUuUnhTaXplID0gRGF0YVNpemUgKyBIZWFkZXJSb29tOworCQkJTmRpc01vdmVNZW1vcnkocEZyYWdCdWZmZXIsIHBIZWFkZXIsCisJCQkJICAgICAgIHBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSk7CiAJCQlwQWQtPkZyYWdGcmFtZS5TZXF1ZW5jZSA9IHBIZWFkZXItPlNlcXVlbmNlOwotCQkJcEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgPSBwSGVhZGVyLT5GcmFnOwkgICAvLyBTaG91bGQgYmUgMAorCQkJcEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgPSBwSGVhZGVyLT5GcmFnOwkvKiBTaG91bGQgYmUgMCAqLwogCQkJQVNTRVJUKHBBZC0+RnJhZ0ZyYW1lLkxhc3RGcmFnID09IDApOwotCQkJZ290byBkb25lOwkvLyBlbmQgb2YgcHJvY2Vzc2luZyB0aGlzIGZyYW1lCisJCQlnb3RvIGRvbmU7CS8qIGVuZCBvZiBwcm9jZXNzaW5nIHRoaXMgZnJhbWUgKi8KIAkJfQotCX0KLQllbHNlCS8vTWlkZGxlICYgRW5kIG9mIGZyYWdtZW50CisJfSBlbHNlCQkJLypNaWRkbGUgJiBFbmQgb2YgZnJhZ21lbnQgKi8KIAl7CiAJCWlmICgocEhlYWRlci0+U2VxdWVuY2UgIT0gcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UpIHx8Ci0JCQkocEhlYWRlci0+RnJhZyAhPSAocEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgKyAxKSkpCi0JCXsKLQkJCS8vIEZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyCi0JCQkvLyBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsaworCQkgICAgKHBIZWFkZXItPkZyYWcgIT0gKHBBZC0+RnJhZ0ZyYW1lLkxhc3RGcmFnICsgMSkpKSB7CisJCQkvKiBGcmFnbWVudCBpcyBub3QgdGhlIHNhbWUgc2VxdWVuY2Ugb3Igb3V0IG9mIGZyYWdtZW50IG51bWJlciBvcmRlciAqLworCQkJLyogUmVzZXQgRnJhZ21lbnQgY29udHJvbCBibGsgKi8KIAkJCVJFU0VUX0ZSQUdGUkFNRShwQWQtPkZyYWdGcmFtZSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJGcmFnbWVudCBpcyBub3QgdGhlIHNhbWUgc2VxdWVuY2Ugb3Igb3V0IG9mIGZyYWdtZW50IG51bWJlciBvcmRlci5cbiIpKTsKLQkJCWdvdG8gZG9uZTsgLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCi0JCX0KLQkJZWxzZSBpZiAoKHBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSArIERhdGFTaXplKSA+IE1BWF9GUkFNRV9TSVpFKQotCQl7Ci0JCQkvLyBGcmFnbWVudCBmcmFtZSBpcyB0b28gbGFyZ2UsIGl0IGV4ZWVkcyB0aGUgbWF4aW11bSBmcmFtZSBzaXplLgotCQkJLy8gUmVzZXQgRnJhZ21lbnQgY29udHJvbCBibGsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIkZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyLlxuIikpOworCQkJZ290byBkb25lOwkvKiBnaXZlIHVwIHRoaXMgZnJhbWUgKi8KKwkJfSBlbHNlIGlmICgocEFkLT5GcmFnRnJhbWUuUnhTaXplICsgRGF0YVNpemUpID4gTUFYX0ZSQU1FX1NJWkUpIHsKKwkJCS8qIEZyYWdtZW50IGZyYW1lIGlzIHRvbyBsYXJnZSwgaXQgZXhlZWRzIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUuICovCisJCQkvKiBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsayAqLwogCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZyYWdtZW50IGZyYW1lIGlzIHRvbyBsYXJnZSwgaXQgZXhlZWRzIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUuXG4iKSk7Ci0JCQlnb3RvIGRvbmU7IC8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiRnJhZ21lbnQgZnJhbWUgaXMgdG9vIGxhcmdlLCBpdCBleGVlZHMgdGhlIG1heGltdW0gZnJhbWUgc2l6ZS5cbiIpKTsKKwkJCWdvdG8gZG9uZTsJLyogZ2l2ZSB1cCB0aGlzIGZyYW1lICovCiAJCX0KLQotICAgICAgICAvLwotCQkvLyBCcm9hZGNvbSBBUChCQ005NDcwNEFHUikgd2lsbCBzZW5kIG91dCBMTEMgaW4gZnJhZ21lbnQncyBwYWNrZXQsIExMQyBvbmx5IGNhbiBhY2NwZXQgYXQgZmlyc3QgZnJhZ21lbnQuCi0JCS8vIEluIHRoaXMgY2FzZSwgd2Ugd2lsbCBkcm9wdCBpdC4KLQkJLy8KLQkJaWYgKE5kaXNFcXVhbE1lbW9yeShwRGF0YSwgU05BUF84MDJfMUgsIHNpemVvZihTTkFQXzgwMl8xSCkpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJGaW5kIGFub3RoZXIgTExDIGF0IE1pZGRsZSBvciBFbmQgZnJhZ21lbnQoU049JWQsIEZyYWc9JWQpXG4iLCBwSGVhZGVyLT5TZXF1ZW5jZSwgcEhlYWRlci0+RnJhZykpOwotCQkJZ290byBkb25lOyAvLyBnaXZlIHVwIHRoaXMgZnJhbWUKKwkJLyogKi8KKwkJLyogQnJvYWRjb20gQVAoQkNNOTQ3MDRBR1IpIHdpbGwgc2VuZCBvdXQgTExDIGluIGZyYWdtZW50J3MgcGFja2V0LCBMTEMgb25seSBjYW4gYWNjcGV0IGF0IGZpcnN0IGZyYWdtZW50LiAqLworCQkvKiBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgZHJvcHQgaXQuICovCisJCS8qICovCisJCWlmIChOZGlzRXF1YWxNZW1vcnkocERhdGEsIFNOQVBfODAyXzFILCBzaXplb2YoU05BUF84MDJfMUgpKSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiRmluZCBhbm90aGVyIExMQyBhdCBNaWRkbGUgb3IgRW5kIGZyYWdtZW50KFNOPSVkLCBGcmFnPSVkKVxuIiwKKwkJCQkgIHBIZWFkZXItPlNlcXVlbmNlLCBwSGVhZGVyLT5GcmFnKSk7CisJCQlnb3RvIGRvbmU7CS8qIGdpdmUgdXAgdGhpcyBmcmFtZSAqLwogCQl9CiAKIAkJcEZyYWdCdWZmZXIgPSBHRVRfT1NfUEtUX0RBVEFQVFIocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQpOwogCi0JCS8vIGNvbmNhdGVuYXRlIHRoaXMgZnJhZ21lbnQgaW50byB0aGUgcmUtYXNzZW1ibHkgYnVmZmVyCi0JCU5kaXNNb3ZlTWVtb3J5KChwRnJhZ0J1ZmZlciArIHBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSksIHBEYXRhLCBEYXRhU2l6ZSk7Ci0JCXBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSAgKz0gRGF0YVNpemU7Ci0JCXBBZC0+RnJhZ0ZyYW1lLkxhc3RGcmFnID0gcEhlYWRlci0+RnJhZzsJICAgLy8gVXBkYXRlIGZyYWdtZW50IG51bWJlcgorCQkvKiBjb25jYXRlbmF0ZSB0aGlzIGZyYWdtZW50IGludG8gdGhlIHJlLWFzc2VtYmx5IGJ1ZmZlciAqLworCQlOZGlzTW92ZU1lbW9yeSgocEZyYWdCdWZmZXIgKyBwQWQtPkZyYWdGcmFtZS5SeFNpemUpLCBwRGF0YSwKKwkJCSAgICAgICBEYXRhU2l6ZSk7CisJCXBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSArPSBEYXRhU2l6ZTsKKwkJcEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgPSBwSGVhZGVyLT5GcmFnOwkvKiBVcGRhdGUgZnJhZ21lbnQgbnVtYmVyICovCiAKLQkJLy8gTGFzdCBmcmFnbWVudAotCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcgPT0gRkFMU0UpCi0JCXsKKwkJLyogTGFzdCBmcmFnbWVudCAqLworCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcgPT0gRkFMU0UpIHsKIAkJCWJSZWFzc0RvbmUgPSBUUlVFOwogCQl9CiAJfQogCiBkb25lOgotCS8vIGFsd2F5cyByZWxlYXNlIHJ4IGZyYWdtZW50ZWQgcGFja2V0CisJLyogYWx3YXlzIHJlbGVhc2UgcnggZnJhZ21lbnRlZCBwYWNrZXQgKi8KIAlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKIAotCS8vIHJldHVybiBkZWZyYWdtZW50ZWQgcGFja2V0IGlmIHBhY2tldCBpcyByZWFzc2VtYmxlZCBjb21wbGV0ZWx5Ci0JLy8gb3RoZXJ3aXNlIHJldHVybiBOVUxMCi0JaWYgKGJSZWFzc0RvbmUpCi0JewotCQlQTkRJU19QQUNLRVQgcE5ld0ZyYWdQYWNrZXQ7CisJLyogcmV0dXJuIGRlZnJhZ21lbnRlZCBwYWNrZXQgaWYgcGFja2V0IGlzIHJlYXNzZW1ibGVkIGNvbXBsZXRlbHkgKi8KKwkvKiBvdGhlcndpc2UgcmV0dXJuIE5VTEwgKi8KKwlpZiAoYlJlYXNzRG9uZSkgeworCQl2b2lkICpwTmV3RnJhZ1BhY2tldDsKIAotCQkvLyBhbGxvY2F0ZSBhIG5ldyBwYWNrZXQgYnVmZmVyIGZvciBmcmFnbWVudAotCQlwTmV3RnJhZ1BhY2tldCA9IFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKHBBZCwgUlhfQlVGRkVSX05PUk1TSVpFKTsKLQkJaWYgKHBOZXdGcmFnUGFja2V0KQotCQl7Ci0JCQkvLyB1cGRhdGUgUnhCbGsKKwkJLyogYWxsb2NhdGUgYSBuZXcgcGFja2V0IGJ1ZmZlciBmb3IgZnJhZ21lbnQgKi8KKwkJcE5ld0ZyYWdQYWNrZXQgPQorCQkgICAgUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfTk9STVNJWkUpOworCQlpZiAocE5ld0ZyYWdQYWNrZXQpIHsKKwkJCS8qIHVwZGF0ZSBSeEJsayAqLwogCQkJcFJldFBhY2tldCA9IHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0OwogCQkJcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPSBwTmV3RnJhZ1BhY2tldDsKLQkJCXBSeEJsay0+cEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgR0VUX09TX1BLVF9EQVRBUFRSKHBSZXRQYWNrZXQpOwotCQkJcFJ4QmxrLT5wRGF0YSA9IChVQ0hBUiAqKXBSeEJsay0+cEhlYWRlciArIEhlYWRlclJvb207CisJCQlwUnhCbGstPnBIZWFkZXIgPQorCQkJICAgIChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSBHRVRfT1NfUEtUX0RBVEFQVFIocFJldFBhY2tldCk7CisJCQlwUnhCbGstPnBEYXRhID0gKHU4ICopIHBSeEJsay0+cEhlYWRlciArIEhlYWRlclJvb207CiAJCQlwUnhCbGstPkRhdGFTaXplID0gcEFkLT5GcmFnRnJhbWUuUnhTaXplIC0gSGVhZGVyUm9vbTsKIAkJCXBSeEJsay0+cFJ4UGFja2V0ID0gcFJldFBhY2tldDsKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCVJFU0VUX0ZSQUdGUkFNRShwQWQtPkZyYWdGcmFtZSk7CiAJCX0KIAl9CkBAIC0yOTM5LDI1ICsyMjk1LDIyIEBACiAJcmV0dXJuIHBSZXRQYWNrZXQ7CiB9CiAKLQotVk9JRCBJbmRpY2F0ZV9BTVNEVV9QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQordm9pZCBJbmRpY2F0ZV9BTVNEVV9QYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLCB1OCBGcm9tV2hpY2hCU1NJRCkKIHsKLQlVSU5UCQkJbk1TRFU7CisJdTMyIG5NU0RVOwogCiAJdXBkYXRlX29zX3BhY2tldF9pbmZvKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CiAJUlRNUF9TRVRfUEFDS0VUX0lGKHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7Ci0Jbk1TRFUgPSBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplKTsKKwluTVNEVSA9CisJICAgIGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIHBSeEJsay0+cERhdGEsCisJCQkJICAgICAgIHBSeEJsay0+RGF0YVNpemUpOwogfQogCi1WT0lEIEluZGljYXRlX0VBUE9MX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit2b2lkIEluZGljYXRlX0VBUE9MX1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGssIHU4IEZyb21XaGljaEJTU0lEKQogewotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkgPSBOVUxMOwogCiAJewogCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKQEAgLTI5NjUsNDggKzIzMTgsNDIgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChwRW50cnkgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiSW5kaWNhdGVfRUFQT0xfUGFja2V0OiBkcm9wIGFuZCByZWxlYXNlIHRoZSBpbnZhbGlkIHBhY2tldC5cbiIpKTsKLQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwlpZiAocEVudHJ5ID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwKKwkJCSAoIkluZGljYXRlX0VBUE9MX1BhY2tldDogZHJvcCBhbmQgcmVsZWFzZSB0aGUgaW52YWxpZCBwYWNrZXQuXG4iKSk7CisJCS8qIHJlbGVhc2UgcGFja2V0ICovCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwKKwkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCXJldHVybjsKIAl9CiB9CiAKLSNkZWZpbmUgQkNOX1RCVFRfT0ZGU0VUCQk2NAkvL2RlZmVyIDY0IHVzCi1WT0lEIFJlU3luY0JlYWNvblRpbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCisjZGVmaW5lIEJDTl9UQlRUX09GRlNFVAkJNjQJLypkZWZlciA2NCB1cyAqLwordm9pZCBSZVN5bmNCZWFjb25UaW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKIAotCVVJTlQzMiAgT2Zmc2V0OwotCisJdTMyIE9mZnNldDsKIAogCU9mZnNldCA9IChwQWQtPlRidHRUaWNrQ291bnQpICUgKEJDTl9UQlRUX09GRlNFVCk7CiAKIAlwQWQtPlRidHRUaWNrQ291bnQrKzsKIAotCS8vCi0JLy8gVGhlIHVwZGF0ZWQgQmVhY29uSW50ZXJ2YWwgVmFsdWUgd2lsbCBhZmZlY3QgQmVhY29uIEludGVydmFsIGFmdGVyIHR3byBUQlRUCi0JLy8gYmVhY2FzdWUgdGhlIG9yaWdpbmFsIEJlYWNvbkludGVydmFsIGhhZCBiZWVuIGxvYWRlZCBpbnRvIG5leHQgVEJUVF9USU1FUgotCS8vCi0JaWYgKE9mZnNldCA9PSAoQkNOX1RCVFRfT0ZGU0VULTIpKQotCXsKKwkvKiAqLworCS8qIFRoZSB1cGRhdGVkIEJlYWNvbkludGVydmFsIFZhbHVlIHdpbGwgYWZmZWN0IEJlYWNvbiBJbnRlcnZhbCBhZnRlciB0d28gVEJUVCAqLworCS8qIGJlYWNhc3VlIHRoZSBvcmlnaW5hbCBCZWFjb25JbnRlcnZhbCBoYWQgYmVlbiBsb2FkZWQgaW50byBuZXh0IFRCVFRfVElNRVIgKi8KKwkvKiAqLworCWlmIChPZmZzZXQgPT0gKEJDTl9UQlRUX09GRlNFVCAtIDIpKSB7CiAJCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOwotCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDQpIC0gMSA7CS8vIEFTSUMgcmVnaXN0ZXIgaW4gdW5pdHMgb2YgMS8xNiBUVSA9IDY0dXMKKwkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCA0KSAtIDE7CS8qIEFTSUMgcmVnaXN0ZXIgaW4gdW5pdHMgb2YgMS8xNiBUVSA9IDY0dXMgKi8KIAkJUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3Iud29yZCk7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChPZmZzZXQgPT0gKEJDTl9UQlRUX09GRlNFVC0xKSkKLQkJeworCX0gZWxzZSB7CisJCWlmIChPZmZzZXQgPT0gKEJDTl9UQlRUX09GRlNFVCAtIDEpKSB7CiAJCQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOwogCiAJCQlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKLQkJCWNzci5maWVsZC5CZWFjb25JbnRlcnZhbCA9IChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QpIDw8IDQ7IC8vIEFTSUMgcmVnaXN0ZXIgaW4gdW5pdHMgb2YgMS8xNiBUVQorCQkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCkgPDwgNDsJLyogQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVICovCiAJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKIAkJfQogCX0KIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfMjg2MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfMjg2MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTdmZjQ1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhXzI4NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDExOTkgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKgotICAgQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgbXVzdCBiZSBQQ0ktZGVwZW5kZWQsIG9yIHlvdSBzaG91bGQgb3V0IHlvdXIgZnVuY3Rpb24KLQlpbiBvdGhlciBmaWxlcy4KLQotKi8KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotZXh0ZXJuIFJUTVBfUkZfUkVHUyBSRjI4NTBSZWdUYWJsZVtdOwotZXh0ZXJuIFVDSEFSCU5VTV9PRl8yODUwX0NITkw7Ci0KLVVTSE9SVCBSdG1wUENJX1dyaXRlVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCUJPT0xFQU4JCQliSXNMYXN0LAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKLXsKLQotCVVDSEFSCQkJKnBETUFIZWFkZXJCdWZWQTsKLQlVU0hPUlQJCQlUeElkeCwgUmV0VHhJZHg7Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLQlVSU5UMzIJCQlCdWZCYXNlUGFMb3c7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nOwotCVVTSE9SVAkJCWh3SGVhZGVyTGVuOwotCi0JLy8KLQkvLyBnZXQgVHggUmluZyBSZXNvdXJjZQotCS8vCi0JcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07Ci0JVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7Ci0JcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7Ci0JQnVmQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOwotCi0JLy8gY29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlcgotCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKQotCXsKLQkJaHdIZWFkZXJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gLSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsgcFR4QmxrLT5IZHJQYWRMZW4gKyBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOwotCX0KLQllbHNlCi0JewotCQlod0hlYWRlckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOwotCX0KLQlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkEsIHBUeEJsay0+SGVhZGVyQnVmLCBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuKTsKLQotCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OwotCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkvLwotCS8vIGJ1aWxkIFR4IERlc2NyaXB0b3IKLQkvLwotCi0JcFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOwotCU5kaXNaZXJvTWVtb3J5KHBUeEQsIFRYRF9TSVpFKTsKLQotCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKLQlwVHhELT5TRExlbjAgPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuOyAvLyBpbmNsdWRlIHBhZGRpbmcKLQlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7OwotCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOwotCXBUeEQtPkxhc3RTZWMwID0gMDsKLQlwVHhELT5MYXN0U2VjMSA9IChiSXNMYXN0KSA/IDEgOiAwOwotCi0JUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7Ci0KLQlSZXRUeElkeCA9IFR4SWR4OwotCS8vCi0JLy8gVXBkYXRlIFR4IGluZGV4Ci0JLy8KLQlJTkNfUklOR19JTkRFWChUeElkeCwgVFhfUklOR19TSVpFKTsKLQlwVHhSaW5nLT5UeENwdUlkeCA9IFR4SWR4OwotCi0JKkZyZWVOdW1iZXIgLT0gMTsKLQotCXJldHVybiBSZXRUeElkeDsKLX0KLQotCi1VU0hPUlQgUnRtcFBDSV9Xcml0ZVNpbmdsZVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglCT09MRUFOCQkJYklzTGFzdCwKLQlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpCi17Ci0KLQlVQ0hBUgkJCSpwRE1BSGVhZGVyQnVmVkE7Ci0JVVNIT1JUCQkJVHhJZHgsIFJldFR4SWR4OwotCVBUWERfU1RSVUMJCXBUeEQ7Ci0JVUlOVDMyCQkJQnVmQmFzZVBhTG93OwotCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKLQlVU0hPUlQJCQlod0hlYWRlckxlbjsKLQotCS8vCi0JLy8gZ2V0IFR4IFJpbmcgUmVzb3VyY2UKLQkvLwotCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdOwotCVR4SWR4ID0gcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdLlR4Q3B1SWR4OwotCXBETUFIZWFkZXJCdWZWQSA9IChQVUNIQVIpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOwotCUJ1ZkJhc2VQYUxvdyA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1BhKTsKLQotCS8vIGNvcHkgVFhJTkZPICsgVFhXSSArIFdMQU4gSGVhZGVyICsgTExDIGludG8gRE1BIEhlYWRlciBCdWZmZXIKLQlod0hlYWRlckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOwotCi0JTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBLCBwVHhCbGstPkhlYWRlckJ1ZiwgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hlYWRlckxlbik7Ci0KLQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IHBUeEJsay0+cFBhY2tldDsKLQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JLy8KLQkvLyBidWlsZCBUeCBEZXNjcmlwdG9yCi0JLy8KLQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0KLQlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7Ci0KLQlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7Ci0JcFR4RC0+U0RMZW4wID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hlYWRlckxlbjsgLy8gaW5jbHVkZSBwYWRkaW5nCi0JcFR4RC0+U0RQdHIxID0gUENJX01BUF9TSU5HTEUocEFkLCBwVHhCbGssIDAsIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOzsKLQlwVHhELT5TRExlbjEgPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQlwVHhELT5MYXN0U2VjMCA9IDA7Ci0JcFR4RC0+TGFzdFNlYzEgPSAoYklzTGFzdCkgPyAxIDogMDsKLQotCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIEZBTFNFLCBGSUZPX0VEQ0EpOwotCi0JUmV0VHhJZHggPSBUeElkeDsKLQkvLwotCS8vIFVwZGF0ZSBUeCBpbmRleAotCS8vCi0JSU5DX1JJTkdfSU5ERVgoVHhJZHgsIFRYX1JJTkdfU0laRSk7Ci0JcFR4UmluZy0+VHhDcHVJZHggPSBUeElkeDsKLQotCSpGcmVlTnVtYmVyIC09IDE7Ci0KLQlyZXR1cm4gUmV0VHhJZHg7Ci19Ci0KLQotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVNdWx0aVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYW1lTnVtLAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKLXsKLQlCT09MRUFOIGJJc0xhc3Q7Ci0JVUNIQVIJCQkqcERNQUhlYWRlckJ1ZlZBOwotCVVTSE9SVAkJCVR4SWR4LCBSZXRUeElkeDsKLQlQVFhEX1NUUlVDCQlwVHhEOwotCVVJTlQzMgkJCUJ1ZkJhc2VQYUxvdzsKLQlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7Ci0JVVNIT1JUCQkJaHdIZHJMZW47Ci0JVUlOVDMyCQkJZmlyc3RETUFMZW47Ci0KLQliSXNMYXN0ID0gKChmcmFtZU51bSA9PSAocFR4QmxrLT5Ub3RhbEZyYW1lTnVtIC0gMSkpID8gMSA6IDApOwotCi0JLy8KLQkvLyBnZXQgVHggUmluZyBSZXNvdXJjZQotCS8vCi0JcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07Ci0JVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7Ci0JcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7Ci0JQnVmQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOwotCi0JaWYgKGZyYW1lTnVtID09IDApCi0JewotCQkvLyBjb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCi0JCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKQotCQkJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFELCA0KStMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOwotCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gLSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsgcFR4QmxrLT5IZHJQYWRMZW4gKyBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOwotCQllbHNlIGlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRSkKLQkJCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxELCA0KStMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQ7Ci0JCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiAtIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRCArIHBUeEJsay0+SGRyUGFkTGVuICsgTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxEOwotCQllbHNlCi0JCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsKLQkJCWh3SGRyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47Ci0KLQkJZmlyc3RETUFMZW4gPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuOwotCX0KLQllbHNlCi0JewotCQlmaXJzdERNQUxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKLQl9Ci0KLQlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkEsIHBUeEJsay0+SGVhZGVyQnVmLCBmaXJzdERNQUxlbik7Ci0KLQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IHBUeEJsay0+cFBhY2tldDsKLQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JLy8KLQkvLyBidWlsZCBUeCBEZXNjcmlwdG9yCi0JLy8KLQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0KLQlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7Ci0KLQlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7Ci0JcFR4RC0+U0RMZW4wID0gZmlyc3RETUFMZW47IC8vIGluY2x1ZGUgcGFkZGluZwotCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTs7Ci0JcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47Ci0JcFR4RC0+TGFzdFNlYzAgPSAwOwotCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7Ci0KLQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKLQotCVJldFR4SWR4ID0gVHhJZHg7Ci0JLy8KLQkvLyBVcGRhdGUgVHggaW5kZXgKLQkvLwotCUlOQ19SSU5HX0lOREVYKFR4SWR4LCBUWF9SSU5HX1NJWkUpOwotCXBUeFJpbmctPlR4Q3B1SWR4ID0gVHhJZHg7Ci0KLQkqRnJlZU51bWJlciAtPSAxOwotCi0JcmV0dXJuIFJldFR4SWR4OwotCi19Ci0KLQotVk9JRCBSdG1wUENJX0ZpbmFsV3JpdGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVVNIT1JUCQkJdG90YWxNUERVU2l6ZSwKLQlJTglVU0hPUlQJCQlGaXJzdFR4SWR4KQotewotCi0JUFRYV0lfU1RSVUMJCXBUeFdJOwotCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKLQotCS8vCi0JLy8gZ2V0IFR4IFJpbmcgUmVzb3VyY2UKLQkvLwotCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdOwotCXBUeFdJID0gKFBUWFdJX1NUUlVDKSBwVHhSaW5nLT5DZWxsW0ZpcnN0VHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOwotCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSB0b3RhbE1QRFVTaXplOwotfQotCi0KLVZPSUQgUnRtcFBDSURhdGFMYXN0VHhJZHgoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlRdWVJZHgsCi0JSU4JVVNIT1JUCQkJTGFzdFR4SWR4KQotewotCVBUWERfU1RSVUMJCXBUeEQ7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nOwotCi0JLy8KLQkvLyBnZXQgVHggUmluZyBSZXNvdXJjZQotCS8vCi0JcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tRdWVJZHhdOwotCi0JLy8KLQkvLyBidWlsZCBUeCBEZXNjcmlwdG9yCi0JLy8KLQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbTGFzdFR4SWR4XS5BbGxvY1ZhOwotCi0JcFR4RC0+TGFzdFNlYzEgPSAxOwotfQotCi0KLVVTSE9SVAlSdG1wUENJX1dyaXRlRnJhZ1R4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYWdOdW0sCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQotewotCVVDSEFSCQkJKnBETUFIZWFkZXJCdWZWQTsKLQlVU0hPUlQJCQlUeElkeCwgUmV0VHhJZHg7Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLQlVSU5UMzIJCQlCdWZCYXNlUGFMb3c7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nOwotCVVTSE9SVAkJCWh3SGVhZGVyTGVuOwotCVVJTlQzMgkJCWZpcnN0RE1BTGVuOwotCi0JLy8KLQkvLyBHZXQgVHggUmluZyBSZXNvdXJjZQotCS8vCi0JcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07Ci0JVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7Ci0JcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7Ci0JQnVmQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOwotCi0JLy8KLQkvLyBDb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCi0JLy8KLQlod0hlYWRlckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOwotCi0JZmlyc3RETUFMZW4gPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuOwotCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsIGZpcnN0RE1BTGVuKTsKLQotCi0JLy8KLQkvLyBCdWlsZCBUeCBEZXNjcmlwdG9yCi0JLy8KLQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0KLQlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7Ci0KLQlpZiAoZnJhZ051bSA9PSBwVHhCbGstPlRvdGFsRnJhZ051bSkKLQl7Ci0JCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OwotCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCX0KLQotCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKLQlwVHhELT5TRExlbjAgPSBmaXJzdERNQUxlbjsgLy8gaW5jbHVkZSBwYWRkaW5nCi0JcFR4RC0+U0RQdHIxID0gUENJX01BUF9TSU5HTEUocEFkLCBwVHhCbGssIDAsIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOwotCXBUeEQtPkxhc3RTZWMwID0gMDsKLQlwVHhELT5MYXN0U2VjMSA9IDE7Ci0KLQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKLQotCVJldFR4SWR4ID0gVHhJZHg7Ci0JcFR4QmxrLT5Qcml2ICs9IHBUeEJsay0+U3JjQnVmTGVuOwotCi0JLy8KLQkvLyBVcGRhdGUgVHggaW5kZXgKLQkvLwotCUlOQ19SSU5HX0lOREVYKFR4SWR4LCBUWF9SSU5HX1NJWkUpOwotCXBUeFJpbmctPlR4Q3B1SWR4ID0gVHhJZHg7Ci0KLQkqRnJlZU51bWJlciAtPSAxOwotCi0JcmV0dXJuIFJldFR4SWR4OwotCi19Ci0KLS8qCi0JTXVzdCBiZSBydW4gaW4gSW50ZXJydXB0IGNvbnRleHQKLQlUaGlzIGZ1bmN0aW9uIGhhbmRsZSBQQ0kgc3BlY2lmaWMgVHhEZXNjIGFuZCBjcHUgaW5kZXggdXBkYXRlIGFuZCBraWNrIHRoZSBwYWNrZXQgb3V0LgotICovCi1pbnQgUnRtcFBDSU1nbXRLaWNrT3V0KAotCUlOIFJUTVBfQURBUFRFUiAJKnBBZCwKLQlJTiBVQ0hBUiAJCQlRdWVJZHgsCi0JSU4gUE5ESVNfUEFDS0VUCQlwUGFja2V0LAotCUlOIFBVQ0hBUgkJCXBTcmNCdWZWQSwKLQlJTiBVSU5UIAkJCVNyY0J1ZkxlbikKLXsKLQlQVFhEX1NUUlVDCQlwVHhEOwotCVVMT05HCQkJU3dJZHggPSBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4OwotCi0JcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW1N3SWR4XS5BbGxvY1ZhOwotCWlmICghcFR4RCkKLQkJcmV0dXJuIDA7Ci0KLQlwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKLQlwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0KLQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBUUlVFLCBGSUZPX01HTVQpOwotCXBUeEQtPkxhc3RTZWMwID0gMTsKLQlwVHhELT5MYXN0U2VjMSA9IDE7Ci0JcFR4RC0+RE1BRE9ORSA9IDA7Ci0JcFR4RC0+U0RMZW4xID0gMDsKLQlwVHhELT5TRFB0cjAgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBTcmNCdWZWQSwgU3JjQnVmTGVuLCAwLCBQQ0lfRE1BX1RPREVWSUNFKTs7Ci0JcFR4RC0+U0RMZW4wID0gU3JjQnVmTGVuOwotCi0JcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKLQotCS8vIEluY3JlYXNlIFRYX0NUWF9JRFgsIGJ1dCB3cml0ZSB0byByZWdpc3RlciBsYXRlci4KLQlJTkNfUklOR19JTkRFWChwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBNR01UX1JJTkdfU0laRSk7Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDaGVjayBSeCBkZXNjcmlwdG9yLCByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBpZiBhbnkgZXJyb3IgZG91bmQKLQotCUFyZ3VtZW50czoKLQkJcFJ4RAkJUG9pbnRlciB0byB0aGUgUnggZGVzY3JpcHRvcgotCi0JUmV0dXJuIFZhbHVlOgotCQlORElTX1NUQVRVU19TVUNDRVNTIAlObyBlcnIKLQkJTkRJU19TVEFUVVNfRkFJTFVSRSAJRXJyb3IKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUyBSVE1QQ2hlY2tSeEVycm9yKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglQSEVBREVSXzgwMl8xMQkJcEhlYWRlciwKLQlJTglQUlhXSV9TVFJVQyAJCXBSeFdJLAotCUlOICBQUlQyOFhYX1JYRF9TVFJVQyAJcFJ4RCkKLXsKLQlQQ0lQSEVSX0tFWSBwV3BhS2V5OwotCUlOVCBkQm07Ci0KLQkvLyBQaHkgZXJyb3JzICYgQ1JDIGVycm9ycwotCWlmICgvKihwUnhELT5QaHlFcnIpIHx8Ki8gKHBSeEQtPkNyYykpCi0JewotCQkvLyBDaGVjayBSU1NJIGZvciBOb2lzZSBIaXN0IHN0YXRpc3RpYyBjb2xsZWN0aW9uLgotCQlkQm0gPSAoSU5UKSAocFJ4V0ktPlJTU0kwKSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7Ci0JCWlmIChkQm0gPD0gLTg3KQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVswXSArPSAxOwotCQllbHNlIGlmIChkQm0gPD0gLTgyKQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVsxXSArPSAxOwotCQllbHNlIGlmIChkQm0gPD0gLTc3KQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVsyXSArPSAxOwotCQllbHNlIGlmIChkQm0gPD0gLTcyKQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVszXSArPSAxOwotCQllbHNlIGlmIChkQm0gPD0gLTY3KQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs0XSArPSAxOwotCQllbHNlIGlmIChkQm0gPD0gLTYyKQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs1XSArPSAxOwotCQllbHNlIGlmIChkQm0gPD0gLTU3KQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs2XSArPSAxOwotCQllbHNlIGlmIChkQm0gPiAtNTcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzddICs9IDE7Ci0KLQkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLQotCS8vIEFkZCBSeCBzaXplIHRvIGNoYW5uZWwgbG9hZCBjb3VudGVyLCB3ZSBzaG91bGQgaWdub3JlIGVycm9yIGNvdW50cwotCXBBZC0+U3RhQ2ZnLkNMQnVzeUJ5dGVzICs9IChwUnhELT5TREwwICsgMTQpOwotCi0JLy8gRHJvcCBUb0RzIHByb21pc2NvdXMgZnJhbWUsIGl0IGlzIG9wZW5lZCBkdWUgdG8gQ0NYIDIgY2hhbm5lbCBsb2FkIHN0YXRpc3RpY3MKLQlpZiAocEhlYWRlciAhPSBOVUxMKQotCXsKLQkJaWYgKHBIZWFkZXItPkZDLlRvRHMpCi0JCXsKLQkJCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJfQotCX0KLQotCS8vIERyb3Agbm90IFUyTSBmcmFtZXMsIGNhbnQncyBkcm9wIGhlcmUgYmVjYXVzZSB3ZSB3aWxsIGRyb3AgYmVhY29uIGluIHRoaXMgY2FzZQotCS8vIEkgYW0ga2luZCBvZiBkb3VidGluZyB0aGUgVTJNIGJpdCBvcGVyYXRpb24KLQkvLyBpZiAocFJ4RC0+VTJNID09IDApCi0JLy8JcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCi0JLy8gZHJvcCBkZWN5cHRpb24gZmFpbCBmcmFtZQotCWlmIChwUnhELT5DaXBoZXJFcnIpCi0JewotCQlpZiAocFJ4RC0+Q2lwaGVyRXJyID09IDIpCi0JCQl7REJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgicFJ4RCBFUlJPUjogSUNWIG9rIGJ1dCBNSUNFcnIgIikpO30KLQkJZWxzZSBpZiAocFJ4RC0+Q2lwaGVyRXJyID09IDEpCi0JCQl7REJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgicFJ4RCBFUlJPUjogSUNWIEVyciAiKSk7fQotCQllbHNlIGlmIChwUnhELT5DaXBoZXJFcnIgPT0gMykKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoInBSeEQgRVJST1I6IEtleSBub3QgdmFsaWQgIikpOwotCi0gICAgICAgIGlmICgoKHBSeEQtPkNpcGhlckVyciAmIDEpID09IDEpICYmIHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ICYmIElORlJBX09OKHBBZCkpCi0gICAgICAgICAgICBSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19JQ1ZfRVJST1JfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIgJWQgKGxlbj0lZCwgTWNhc3Q9JWQsIE15QnNzPSVkLCBXY2lkPSVkLCBLZXlJZD0lZClcbiIsCi0JCQlwUnhELT5DaXBoZXJFcnIsCi0JCQlwUnhELT5TREwwLAotCQkJcFJ4RC0+TWNhc3QgfCBwUnhELT5CY2FzdCwKLQkJCXBSeEQtPk15QnNzLAotCQkJcFJ4V0ktPldpcmVsZXNzQ2xpSUQsCi0JCQlwUnhXSS0+S2V5SW5kZXgpKTsKLQotCQkvLwotCQkvLyBNSUMgRXJyb3IKLQkJLy8KLQkJaWYgKHBSeEQtPkNpcGhlckVyciA9PSAyKQotCQl7Ci0JCQlwV3BhS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BSeFdJLT5LZXlJbmRleF07Ci0KLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCi0gICAgICAgICAgICAgICAgV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQocEFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFdwYUtleS0+VHlwZSA9PSBQQUlSV0lTRUtFWSkgPyBUUlVFOkZBTFNFKTsKLSAgICAgICAgICAgIGVsc2UKLQkJCSAgICBSVE1QUmVwb3J0TWljRXJyb3IocEFkLCBwV3BhS2V5KTsKLQotICAgICAgICAgICAgaWYgKCgocFJ4RC0+Q2lwaGVyRXJyICYgMikgPT0gMikgJiYgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgJiYgSU5GUkFfT04ocEFkKSkKLSAgICAgICAgICAgICAgICBSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19NSUNfRVJST1JfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiUnggTUlDIFZhbHVlIGVycm9yXG4iKSk7Ci0JCX0KLQotCQlpZiAocEhlYWRlciA9PSBOVUxMKQotCQkJcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKLQl9Ci0KLQlyZXR1cm4oTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyByb3V0aW5lIHNlbmRzIGNvbW1hbmQgdG8gZmlybXdhcmUgYW5kIHR1cm4gb3VyIGNoaXAgdG8gcG93ZXIgc2F2ZSBtb2RlLgotCQlCb3RoIFJhZGlvT2ZmIGFuZCAuMTEgcG93ZXIgc2F2ZSBmdW5jdGlvbiBuZWVkcyB0byBjYWxsIHRoaXMgcm91dGluZS4KLQlJbnB1dDoKLQkJTGV2ZWwgPSBHVUlSQURJT19PRkYgIDogR1VJIFJhZGlvIE9mZiBtb2RlCi0JCUxldmVsID0gRE9UMTFQT1dFUlNBVkUgIDogODAyLjExIHBvd2VyIHNhdmUgbW9kZQotCQlMZXZlbCA9IFJUTVBfSEFMVCAgOiBXaGVuIERpc2FibGUgZGV2aWNlLgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBSVDI4eHhQY2lBc2ljUmFkaW9PZmYoCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gVUNIQVIgICAgICAgICAgICBMZXZlbCwKLQlJTiBVU0hPUlQgICAgICAgICAgIFRidHROdW1Ub05leHRXYWtlVXApCi17Ci0JV1BETUFfR0xPX0NGR19TVFJVQwlEbWFDZmc7Ci0JVUNIQVIJCWksIHRlbXBCQlBfUjMgPSAwOwotCUJPT0xFQU4JCWJyYyA9IEZBTFNFLCBDYW5jZWxsZWQ7Ci0gICAgVUlOVDMyCQlUYlRUVGltZSA9IDA7Ci0JVUlOVDMyCQlQc1BvbGxUaW1lID0gMCwgTUFDVmFsdWU7Ci0gICAgVUxPTkcJCUJlYWNvblBlcmlvZFRpbWU7Ci0gICAgVUlOVDMyCQlSeERtYUlkeCwgUnhDcHVJZHg7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1JhZGlvT2ZmID09PT4gVHhDcHVJZHggPSAlZCwgVHhEbWFJZHggPSAlZC4gUnhDcHVJZHggPSAlZCwgUnhEbWFJZHggPSAlZC5cbiIsIHBBZC0+VHhSaW5nWzBdLlR4Q3B1SWR4LCBwQWQtPlR4UmluZ1swXS5UeERtYUlkeCwgcEFkLT5SeFJpbmcuUnhDcHVJZHgsIHBBZC0+UnhSaW5nLlJ4RG1hSWR4KSk7Ci0KLSAgICAvLyBDaGVjayBSeCBETUEgYnVzeSBzdGF0dXMsIGlmIG1vcmUgdGhhbiBoYWxmIGlzIG9jY3VwaWVkLCBnaXZlIHVwIHRoaXMgcmFkaW8gb2ZmLgotCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfRFJYX0lEWCAsICZSeERtYUlkeCk7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBSWF9DUlhfSURYICwgJlJ4Q3B1SWR4KTsKLQlpZiAoKFJ4RG1hSWR4ID4gUnhDcHVJZHgpICYmICgoUnhEbWFJZHggLSBSeENwdUlkeCkgPiBSWF9SSU5HX1NJWkUvMykpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljUmFkaW9PZmYgPT09PiByZXR1cm4xLiBSeERtYUlkeCA9ICVkICwgIFJ4Q3B1SWR4ID0gJWQuIFxuIiwgUnhEbWFJZHgsIFJ4Q3B1SWR4KSk7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZSBpZiAoKFJ4Q3B1SWR4ID49IFJ4RG1hSWR4KSAmJiAoKFJ4Q3B1SWR4IC0gUnhEbWFJZHgpIDwgUlhfUklOR19TSVpFLzMpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1JhZGlvT2ZmID09PT4gcmV0dXJuMi4gIFJ4Q3B1SWR4ID0gJWQuIFJ4RG1hSWR4ID0gJWQgLCAgXG4iLCBSeENwdUlkeCwgUnhEbWFJZHgpKTsKLQkJcmV0dXJuOwotCX0KLQotICAgIC8vIE9uY2UgZ28gaW50byB0aGlzIGZ1bmN0aW9uLCBkaXNhYmxlIHR4IGJlY2F1c2UgZG9uJ3Qgd2FudCB0b28gbWFueSBwYWNrZXRzIGluIHF1ZXVlIHRvIHByZXZlbnQgSFcgc3RvcHMuCi0JUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCk7Ci0KLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQotCXsKLQkgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLAkmQ2FuY2VsbGVkKTsKLQkgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOwotCi0JICAgIGlmIChMZXZlbCA9PSBET1QxMVBPV0VSU0FWRSkKLQkJewotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUQlRUX1RJTUVSLCAmVGJUVFRpbWUpOwotCQkJVGJUVFRpbWUgJj0gMHgxZmZmZjsKLQkJCS8vIDAwLiBjaGVjayBpZiBuZWVkIHRvIGRvIHNsZWVwIGluIHRoaXMgRFRJTSBwZXJpb2QuICAgSWYgbmV4dCBiZWFjb24gd2lsbCBhcnJpdmUgd2l0aGluIDMwbXMgLCAuLi5kb2Vzbid0IG5lY2Vzc2FyaWx5IHNsZWVwLgotCQkJLy8gVGJUVFRpbWUgdWludCA9IDY0dXMsIExFQURfVElNRSB1bml0ID0gMTAyNHVzLCBQc1BvbGxUaW1lIHVuaXQgPSAxbXMKLQkgICAgICAgIGlmICAoKCg2NCpUYlRUVGltZSkgPCgoTEVBRF9USU1FKjEwMjQpICsgNDAwMDApKSAmJiAoVGJ0dE51bVRvTmV4dFdha2VVcCA9PSAwKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUYlRUVGltZSA9IDB4JXggLCBnaXZlIHVwIHRoaXMgc2xlZXAuIFxuIiwgVGJUVFRpbWUpKTsKLQkgICAgICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKLQkJCQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlQc1BvbGxUaW1lID0gKDY0KlRiVFRUaW1lLSBMRUFEX1RJTUUqMTAyNCkvMTAwMDsKLQkJCQlQc1BvbGxUaW1lIC09IDM7Ci0KLQkgICAgICAgICAgICBCZWFjb25QZXJpb2RUaW1lID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kKjEwMi8xMDA7Ci0JCQkJaWYgKFRidHROdW1Ub05leHRXYWtlVXAgPiAwKQotCQkJCQlQc1BvbGxUaW1lICs9ICgoVGJ0dE51bVRvTmV4dFdha2VVcCAtMSkgKiBCZWFjb25QZXJpb2RUaW1lKTsKLQotCSAgICAgICAgICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gVFJVRTsKLQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgUHNQb2xsVGltZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLSAgICAvLyAwLiBEaXNhYmxlIFR4IERNQS4KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7Ci0JRG1hQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBEbWFDZmcud29yZCk7Ci0KLQkvLyAxLiBXYWl0IERNQSBub3QgYnVzeQotCWkgPSAwOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7Ci0JCWlmICgoRG1hQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSAmJiAoRG1hQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKLQkJCWJyZWFrOwotCQlSVE1QdXNlY0RlbGF5KDIwKTsKLQkJaSsrOwotCX13aGlsZShpIDwgNTApOwotCi0JaWYgKGkgPj0gNTApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJETUEga2VlcHMgYnVzeS4gIHJldHVybiBvbiBSVDI4eHhQY2lBc2ljUmFkaW9PZmYgKClcbiIpKTsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmRG1hQ2ZnLndvcmQpOwotCQlEbWFDZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBEbWFDZmcud29yZCk7Ci0JCXBBZC0+Q2hlY2tEbWFCdXN5Q291bnQrKzsKLQkJcmV0dXJuOwotCX0KLQllbHNlCi0JewotCQlwQWQtPkNoZWNrRG1hQnVzeUNvdW50ID0gMDsKLQl9Ci0KLSAgICBSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRik7Ci0KLSAgICAvLyBTZXQgdG8gMVIuCi0JaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPiAxKQotCXsKLQkJdGVtcEJCUF9SMyA9IChwQWQtPlN0YUNmZy5CQlBSMyAmIDB4RTcpOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCB0ZW1wQkJQX1IzKTsKLQl9Ci0KLQkvLyBJbiBSYWRpbyBPZmYsIHdlIHR1cm4gb2ZmIFJGIGNsaywgU28gbm93IG5lZWQgdG8gY2FsbCBBU0lDU3dpdGNoQ2hhbm5lbCBhZ2Fpbi4KLQlpZiAoSU5GUkFfT04ocEFkKSAmJiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JewotCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgotCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotCX0KLQllbHNlCi0JewotCQkvLyBNdXN0IHVzaW5nIDIwTUh6LgotCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JfQotCi0JaWYgKExldmVsICE9IFJUTVBfSEFMVCkKLQl7Ci0JCS8vIENoYW5nZSBJbnRlcnJ1cHQgYml0bWFzay4KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCBBdXRvV2FrZXVwSW50KTsKLQl9Ci0JZWxzZQotCXsKLQkJTklDRGlzYWJsZUludGVycnVwdChwQWQpOwotCX0KLQotICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKLQkvLyBEaXNhYmxlIE1BQyBSeAotCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMICwgJk1BQ1ZhbHVlKTsKLQlNQUNWYWx1ZSAmPSAweGY3OwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCAsIE1BQ1ZhbHVlKTsKLQotCS8vICAyLiBTZW5kIFNsZWVwIGNvbW1hbmQKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9TVEFUVVMsIDB4ZmZmZmZmZmYpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgMHhmZmZmZmZmZik7Ci0JLy8gc2VuZCBQT1dFUi1TQVZFIGNvbW1hbmQgdG8gTUNVLiBoaWdoLWJ5dGUgPSAxIHNhdmUgcG93ZXIgYXMgbXVjaCBhcyBwb3NzaWJsZS4gaGlnaCBieXRlID0gMCBzYXZlIGxlc3MgcG93ZXIKLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIFBvd2VyU2FmZUNJRCwgMHhmZiwgMHgxKTsKLQkvLyAgMi0xLiBXYWl0IGNvbW1hbmQgc3VjY2VzcwotCS8vIFN0YXR1cyA9IDEgOiBzdWNjZXNzLCBTdGF0dXMgPSAyLCBhbHJlYWR5IHNsZWVwLCBTdGF0dXMgPSAzLCBNYXliZSBNQUMgaXMgYnVzeSBzbyBjYW4ndCBmaW5pc2ggdGhpcyB0YXNrLgotCWJyYyA9IEFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJTYWZlQ0lEKTsKLQotICAgIGlmIChicmMgPT0gRkFMU0UpCi0gICAgewotICAgICAgICAvLyB0cnkgYWdhaW4KLSAgICAJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCBQb3dlclNhZmVDSUQsIDB4ZmYsIDB4MDEpOyAgIC8vIHNlbmQgUE9XRVItU0FWRSBjb21tYW5kIHRvIE1DVS4gVGltZW91dCB1bml0OjQwdXMuCi0gICAgCS8vUlRNUHVzZWNEZWxheSgyMDApOwotICAgIAlicmMgPSBBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyU2FmZUNJRCk7Ci0gICAgfQotCi0JLy8gIDMuIEFmdGVyIDB4MzAgY29tbWFuZCBpcyBvaywgc2VuZCByYWRpbyBvZmYgY29tbWFuZC4gbG93Ynl0ZSA9IDAgZm9yIHBvd2VyIHNhZmUuCi0JLy8gSWYgMHgzMCBjb21tYW5kIGlzIG5vdCBvayB0aGlzIHRpbWUsIHdlIGNhbiBpZ25vcmUgMHgzNSBjb21tYW5kLiBJdCB3aWxsIG1ha2Ugc3VyZSBub3QgY2F1c2UgZmlybXdhcmUnciBwcm9ibGVtLgotCWlmICgoTGV2ZWwgPT0gRE9UMTFQT1dFUlNBVkUpICYmIChicmMgPT0gVFJVRSkpCi0JewotCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzUsIFBvd2VyUmFkaW9PZmZDSUQsIDAsIDB4MDApOwkvLyBsb3dieXRlID0gMCBtZWFucyB0byBkbyBwb3dlciBzYWZlLCBOT1QgdHVybiBvZmYgcmFkaW8uCi0JIAkvLyAgMy0xLiBXYWl0IGNvbW1hbmQgc3VjY2VzcwotCSAJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclJhZGlvT2ZmQ0lEKTsKLQl9Ci0JZWxzZSBpZiAoYnJjID09IFRSVUUpCi0JewotCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzUsIFBvd2VyUmFkaW9PZmZDSUQsIDEsIDB4MDApOwkvLyBsb3dieXRlID0gMCBtZWFucyB0byBkbyBwb3dlciBzYWZlLCBOT1QgdHVybiBvZmYgcmFkaW8uCi0JIAkvLyAgMy0xLiBXYWl0IGNvbW1hbmQgc3VjY2VzcwotCSAJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclJhZGlvT2ZmQ0lEKTsKLQl9Ci0KLSAgICAvLyBXYWl0IERNQSBub3QgYnVzeQotCWkgPSAwOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7Ci0JCWlmICgoRG1hQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSAmJiAoRG1hQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSkKLQkJCWJyZWFrOwotCQlSVE1QdXNlY0RlbGF5KDIwKTsKLQkJaSsrOwotCX13aGlsZShpIDwgNTApOwotCi0JaWYgKGkgPj0gNTApCi0JewotCQlwQWQtPkNoZWNrRG1hQnVzeUNvdW50Kys7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRNQSBSeCBrZWVwcyBidXN5LiAgb24gUlQyOHh4UGNpQXNpY1JhZGlvT2ZmICgpXG4iKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+Q2hlY2tEbWFCdXN5Q291bnQgPSAwOwotCX0KLQotCWlmIChMZXZlbCA9PSBET1QxMVBPV0VSU0FWRSkKLQl7Ci0JCUFVVE9fV0FLRVVQX1NUUlVDCUF1dG9XYWtldXBDZmc7Ci0JCS8vUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsIDkwKTsKLQotCQkvLyB3ZSBoYXZlIGRlY2lkZWQgdG8gU0xFRVAsIHNvIGF0IGxlYXN0IGRvIGl0IGZvciBhIEJFQUNPTiBwZXJpb2QuCi0JCWlmIChUYnR0TnVtVG9OZXh0V2FrZVVwID09IDApCi0JCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gMTsKLQotCQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0KLQkJLy8gMS4gU2V0IGF1dG8gd2FrZSB1cCB0aW1lci4KLQkJQXV0b1dha2V1cENmZy5maWVsZC5OdW1vZlNsZWVwaW5nVGJ0dCA9IFRidHROdW1Ub05leHRXYWtlVXAgLSAxOwotCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkVuYWJsZUF1dG9XYWtldXAgPSAxOwotCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkF1dG9MZWFkVGltZSA9IExFQURfVElNRTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOwotCX0KLQotCS8vICA0LTEuIElmIGl0J3MgdG8gZGlzYWJsZSBvdXIgZGV2aWNlLiBOZWVkIHRvIHJlc3RvcmUgUENJIENvbmZpZ3VyYXRpb24gU3BhY2UgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLgotCWlmIChMZXZlbCA9PSBSVE1QX0hBTFQpCi0JewotCQlpZiAoKGJyYyA9PSBUUlVFKSAmJiAoaSA8IDUwKSkKLQkJCVJUTVBQQ0llTGlua0N0cmxTZXR0aW5nKHBBZCwgMCk7Ci0JfQotCS8vICA0LiBTZXQgUENJIGNvbmZpZ3VyYXRpb24gU3BhY2UgTGluayBDb210cm9sIGZpZWxkcy4gIE9ubHkgUmFkaW8gT2ZmIG5lZWRzIHRvIGNhbGwgdGhpcyBmdW5jdGlvbgotCWVsc2UKLQl7Ci0JCWlmICgoYnJjID09IFRSVUUpICYmIChpIDwgNTApKQotCQkJUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcocEFkLCAzKTsKLQl9Ci0KLQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyByb3V0aW5lIHNlbmRzIGNvbW1hbmQgdG8gZmlybXdhcmUgYW5kIHR1cm4gb3VyIGNoaXAgdG8gd2FrZSB1cCBtb2RlIGZyb20gcG93ZXIgc2F2ZSBtb2RlLgotCQlCb3RoIFJhZGlvT24gYW5kIC4xMSBwb3dlciBzYXZlIGZ1bmN0aW9uIG5lZWRzIHRvIGNhbGwgdGhpcyByb3V0aW5lLgotCUlucHV0OgotCQlMZXZlbCA9IEdVSVJBRElPX09GRiA6IGNhbGwgdGhpcyBmdW5jdGlvbiBpcyBmcm9tIFJhZGlvIE9mZiB0byBSYWRpbyBPbi4gIE5lZWQgdG8gcmVzdG9yZSBQQ0kgaG9zdCB2YWx1ZS4KLQkJTGV2ZWwgPSBvdGhlciB2YWx1ZSA6IG5vcm1hbCB3YWtlIHVwIGZ1bmN0aW9uLgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBSVDI4eHhQY2lBc2ljUmFkaW9PbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiAgICAgTGV2ZWwpCi17Ci0gICAgV1BETUFfR0xPX0NGR19TVFJVQwlEbWFDZmc7Ci0JQk9PTEVBTgkJCQlDYW5jZWxsZWQsIGJydiA9IFRSVUU7Ci0gICAgVUlOVDMyCQkJICAgIE1BQ1ZhbHVlOwotCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKLQl7Ci0JICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKLQkJaWYgKChMZXZlbCA9PSBHVUlSQURJT19PRkYpIHx8IChMZXZlbCA9PSBHVUlfSURMRV9QT1dFUl9TQVZFKQotCQl8fCAoUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX1NFVF9QQ0lfQ0xLX09GRl9DT01NQU5EKSkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUMjh4eFBjaUFzaWNSYWRpb09uICgpXG4iKSk7Ci0JCQkvLyAxLiBTZXQgUENJIExpbmsgQ29udHJvbCBpbiBDb25maWd1cmF0aW9uIFNwYWNlLgotCQkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfV0FLRVVQKTsKLQkJCVJUTVB1c2VjRGVsYXkoNjAwMCk7Ci0JCX0KLQl9Ci0KLSAgICBwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4M2E4MCk7Ci0JLy8gMi4gU2VuZCB3YWtlIHVwIGNvbW1hbmQuCi0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCBQb3dlcldha2VDSUQsIDB4MDAsIDB4MDIpOwotCi0JLy8gMi0xLiB3YWl0IGNvbW1hbmQgb2suCi0JYnJ2ID0gQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlcldha2VDSUQpOwotICAgIGlmIChicnYpCi0gICAgewotICAgIAlOSUNFbmFibGVJbnRlcnJ1cHQocEFkKTsKLQotICAgIAkvLyAzLiBFbmFibGUgVHggRE1BLgotICAgIAlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7Ci0gICAgCURtYUNmZy5maWVsZC5FbmFibGVUeERNQSA9IDE7Ci0gICAgICAgIERtYUNmZy5maWVsZC5FbmFibGVSeERNQSA9IDE7Ci0gICAgCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIERtYUNmZy53b3JkKTsKLQotICAgICAgICAvLyBFYWJsZSBNQUMgUngKLSAgICAJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwgLCAmTUFDVmFsdWUpOwotICAgIAlNQUNWYWx1ZSB8PSAweDg7Ci0gICAgCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCAsIE1BQ1ZhbHVlKTsKLQotICAgIAlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKTsKLSAgICAJaWYgKExldmVsID09IEdVSV9JRExFX1BPV0VSX1NBVkUpCi0gICAgCXsKLSAgICAJCS8vIEluIFJhZGlvIE9mZiwgd2UgdHVybiBvZmYgUkYgY2xrLCBTbyBub3cgbmVlZCB0byBjYWxsIEFTSUNTd2l0Y2hDaGFubmVsIGFnYWluLgotICAgIAkJaWYgKElORlJBX09OKHBBZCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCi0gICAgCQkJJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0gICAgCQl7Ci0gICAgCQkJLy8gTXVzdCB1c2luZyA0ME1Iei4KLSAgICAJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0gICAgCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotICAgIAkJfQotICAgIAkJZWxzZQotICAgIAkJewotICAgIAkJCS8vIE11c3QgdXNpbmcgMjBNSHouCi0gICAgCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0gICAgCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotfQotCi1WT0lEIFJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiAgICAJIExldmVsKQotewotICAgIEFVVE9fV0FLRVVQX1NUUlVDCUF1dG9XYWtldXBDZmc7Ci0KLSAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndha2luZyB1cCBub3chXG4iKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVyk7Ci0JUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cpOwotCi0gICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKLSAgICB7Ci0gICAgICAgIC8vIFN1cHBvcnQgUENJZSBBZHZhbmNlIFBvd2VyIFNhdmUKLSAgICAJaWYgKCgoTGV2ZWwgPT0gRlJPTV9UWCkgJiYgKHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID09IFRSVUUpKSB8fAotCQkJKExldmVsID09IFJUTVBfSEFMVCkpCi0gICAgCXsKLSAgICAgICAgICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0gICAgCQlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9XQUtFVVApOwotICAgIAkJUlRNUHVzZWNEZWxheSg1MDAwKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT09PT1Bc2ljRm9yY2VXYWtldXA9PT1iRnJvbVR4XG4iKSk7Ci0gICAgCX0KLQotCQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0KLQkJLy8gSWYgdGhpcyBpcyBjYWxsZWQgZnJvbSBIYWx0LiBBTFdBWVMgZm9yY2Ugd2FrZXVwISEhCi0JCWlmIChMZXZlbCA9PSBSVE1QX0hBTFQpCi0JCXsKLQkJCVJUMjh4eFBjaUFzaWNSYWRpb09uKHBBZCwgUlRNUF9IQUxUKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChSVDI4eHhQY2lBc2ljUmFkaW9PbihwQWQsIERPVDExUE9XRVJTQVZFKSkKLQkJCXsKLQkJCQkvLyBJbiBSYWRpbyBPZmYsIHdlIHR1cm4gb2ZmIFJGIGNsaywgU28gbm93IG5lZWQgdG8gY2FsbCBBU0lDU3dpdGNoQ2hhbm5lbCBhZ2Fpbi4KLQkJCQlpZiAoSU5GUkFfT04ocEFkKSAmJiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJCQkJJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JCQkJewotCQkJCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgotCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8gTXVzdCB1c2luZyAyME1Iei4KLQkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCQkJCX0KLQkJCX0KLQkJfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvLyBQQ0ksIDI4NjAtUENJZQotICAgICAgICBBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIDB4ZmYsIDB4MDAsIDB4MDApOwotCQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0gICAgfQotCi0gICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci0gICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVyk7Ci0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PT09PT1SVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXBcbiIpKTsKLX0KLQotVk9JRCBSVDI4eHhQY2lTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCkKLXsKLSAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQotCXsKLQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci0JCXJldHVybjsKLQl9Ci0gICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKLSAgICB7Ci0gICAgCVVMT05HCU5vdyA9IDA7Ci0gICAgICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dBS0VVUF9OT1cpKQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3YWtpbmcgdXAgbm93IVxuIikpOwotICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCQkvLyBJZiBsYXN0IHNlbmQgTlVMTCBmcmFtIHRpbWUgaXMgdG9vIGNsb3NlIHRvIHRoaXMgcmVjZWl2aW5nIGJlYWNvbiAod2l0aGluIDhtcyksIGRvbid0IGdvIHRvIHNsZWVwIGZvciB0aGlzIERUTS4KLQkJLy8gQmVjYXVzZSBTb21lIEFQIGNhbid0IHF1ZXVpbmcgb3V0Z29pbmcgZnJhbWVzIGltbWVkaWF0ZWx5LgotCQlpZiAoKChwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSArIDgpID49IE5vdykgJiYgKHBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lIDw9IE5vdykpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vdyA9ICVsdSwgTGFzdFNlbmROVUxMcHNtVGltZT0lbHUgOiAgUnhDb3VudFNpbmNlTGFzdE5VTEwgPSAlbHUuIFxuIiwgTm93LCBwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSwgcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWVsc2UgaWYgKChwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMID4gMCkgJiYgKChwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSArIHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCkgPj0gTm93KSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm93ID0gJWx1LCBMYXN0U2VuZE5VTExwc21UaW1lPSVsdTogUnhDb3VudFNpbmNlTGFzdE5VTEwgPSAlbHUgPiAwIFxuIiwgTm93LCBwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSwgIHBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwpKTsKLQkJCXJldHVybjsKLQkJfQotCi0gICAgICAgIFJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIERPVDExUE9XRVJTQVZFLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQVVUT19XQUtFVVBfU1RSVUMJQXV0b1dha2V1cENmZzsKLSAgICAgICAgLy8gd2UgaGF2ZSBkZWNpZGVkIHRvIFNMRUVQLCBzbyBhdCBsZWFzdCBkbyBpdCBmb3IgYSBCRUFDT04gcGVyaW9kLgotICAgICAgICBpZiAoVGJ0dE51bVRvTmV4dFdha2VVcCA9PSAwKQotICAgICAgICAgICAgVGJ0dE51bVRvTmV4dFdha2VVcCA9IDE7Ci0KLSAgICAgICAgQXV0b1dha2V1cENmZy53b3JkID0gMDsKLSAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOwotICAgICAgICBBdXRvV2FrZXVwQ2ZnLmZpZWxkLk51bW9mU2xlZXBpbmdUYnR0ID0gVGJ0dE51bVRvTmV4dFdha2VVcCAtIDE7Ci0gICAgICAgIEF1dG9XYWtldXBDZmcuZmllbGQuRW5hYmxlQXV0b1dha2V1cCA9IDE7Ci0gICAgICAgIEF1dG9XYWtldXBDZmcuZmllbGQuQXV0b0xlYWRUaW1lID0gNTsKLSAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOwotICAgICAgICBBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIDB4ZmYsIDB4ZmYsIDB4MDApOyAgIC8vIHNlbmQgUE9XRVItU0FWRSBjb21tYW5kIHRvIE1DVS4gVGltZW91dCA0MHVzLgotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gJXMsIFRidHROdW1Ub05leHRXYWtlVXA9JWQgXG4iLCBfX2Z1bmNfXywgVGJ0dE51bVRvTmV4dFdha2VVcCkpOwotICAgIH0KLSAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci19Ci0KLVZPSUQgUHNQb2xsV2FrZUV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCItLT5Qc1BvbGxXYWtlRXhlYyBcbiIpKTsKLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0gICAgaWYgKHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nKQotICAgIHsKLQkgICAgUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfV0FLRVVQKTsKLSAgICB9Ci0gICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotVk9JRCAgUmFkaW9PbkV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKLQlXUERNQV9HTE9fQ0ZHX1NUUlVDCURtYUNmZzsKLQlCT09MRUFOCQkJCUNhbmNlbGxlZDsKLQotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCItLT5SYWRpb09uRXhlYygpIHJldHVybiBvbiBmT1BfU1RBVFVTX0RPWkUgPT0gVFJVRTsgXG4iKSk7Ci0JCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwgMTApOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tPlJhZGlvT25FeGVjKCkgcmV0dXJuIG9uIFNDQU5fSU5fUFJPR1JFU1M7IFxuIikpOwotCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsIDEwKTsKLQkJcmV0dXJuOwotCX0KLSAgICBwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOwotCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKLQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCi0JewotCQlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLSAgICAgICAgUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JFKTsKLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0hDQ0EpOwotCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfTUdNVCk7Ci0JCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9SWCk7Ci0KLQkJLy8gMi4gU2VuZCB3YWtlIHVwIGNvbW1hbmQuCi0JCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgUG93ZXJXYWtlQ0lELCAweDAwLCAweDAyKTsKLQkJLy8gMi0xLiB3YWl0IGNvbW1hbmQgb2suCi0JCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJXYWtlQ0lEKTsKLQotCQkvLyBXaGVuIFBDSSBjbG9jayBpcyBvZmYsIGRvbid0IHdhbnQgdG8gc2VydmljZSBpbnRlcnJ1cHQuIFNvIHdoZW4gYmFjayB0byBjbG9jayBvbiwgZW5hYmxlIGludGVycnVwdC4KLQkJTklDRW5hYmxlSW50ZXJydXB0KHBBZCk7Ci0KLQkJLy8gMy4gRW5hYmxlIFR4IERNQS4KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmRG1hQ2ZnLndvcmQpOwotCQlEbWFDZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBEbWFDZmcud29yZCk7Ci0KLQkJLy8gSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uCi0JCWlmIChJTkZSQV9PTihwQWQpICYmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQkJJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JCXsKLQkJCS8vIE11c3QgdXNpbmcgNDBNSHouCi0JCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBNdXN0IHVzaW5nIDIwTUh6LgotCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJfQotCi0JCS8vIENsZWFyIFJhZGlvIG9mZiBmbGFnCi0JCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKLQotCQkvLyBTZXQgTEVECi0JCVJUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT04pOwotCi0gICAgICAgIGlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX0FDVElWRSkKLSAgICAgICAgewotICAgIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOwotICAgICAgICB9Ci0JfQotCWVsc2UKLQl7Ci0JCVJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIEdVSVJBRElPX09GRiwgMCk7Ci0JfQotfQotCi1WT0lEIFJUMjh4eFBjaU1sbWVSYWRpb09uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotICAgIGlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCi0gICAJCXJldHVybjsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXM9PT0+XG4iLCBfX2Z1bmNfXykpOwotCi0gICAgaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApIHx8Ci0gICAgICAgICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpKSkKLSAgICB7Ci0gICAgCU5JQ1Jlc2V0RnJvbUVycm9yKHBBZCk7Ci0KLSAgICAJLyoKLSAgICAJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKLSAgICAJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JFKTsKLSAgICAJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKLSAgICAJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKLSAgICAJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0hDQ0EpOwotICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfTUdNVCk7Ci0gICAgCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9SWCk7Ci0JCSovCi0KLSAgICAJLy8gRW5hYmxlIFR4L1J4Ci0gICAgCVJUTVBFbmFibGVSeFR4KHBBZCk7Ci0KLSAgICAJLy8gQ2xlYXIgUmFkaW8gb2ZmIGZsYWcKLSAgICAJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOwotCi0JICAgIC8vIFNldCBMRUQKLQkgICAgUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7Ci0gICAgfQotCi0gICAgaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgotICAgICAgICAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKSkKLSAgICB7Ci0gICAgICAgIEJPT0xFQU4JCUNhbmNlbGxlZDsKLQotICAgIAlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9XQUtFVVApOwotCi0gICAgICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0gICAgCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKLSAgICAJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLAkmQ2FuY2VsbGVkKTsKLSAgICAJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAxMCk7Ci0gICAgfQotfQotCi1WT0lEIFJUMjh4eFBjaU1sbWVSYWRpb09GRigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLSAgICBXUERNQV9HTE9fQ0ZHX1NUUlVDCUdsb0NmZzsKLQlVSU5UMzIJaTsKLQotCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiLS0+TWxtZVJhZGlvT2ZmKCkgcmV0dXJuIG9uIGJSYWRpbyA9PSBUUlVFOyBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKLSAgICAJcmV0dXJuOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5cbiIsIF9fZnVuY19fKSk7Ci0KLQkvLyBTZXQgTEVECi0JUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOwotCi0gICAgewotICAgIAlCT09MRUFOCQlDYW5jZWxsZWQ7Ci0KLSAgICAJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0gICAgCXsKLQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJkNhbmNlbGxlZCk7Ci0JCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKLSAgICAJfQotCi0JCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJPT0xFQU4gQ2FuY2VsbGVkOwotCi0JCQkvLyBBbHdheXMgcmFkaW8gb24gc2luY2UgdGhlIE5JQyBuZWVkcyB0byBzZXQgdGhlIE1DVSBjb21tYW5kIChMRURfUkFESU9fT0ZGKS4NCi0JCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIA0KLQkJCSAgICAgKElETEVfT04ocEFkKSkgJiYgDQotCQkJICAgICAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkpDQotCQkJew0KLQkJCQlSVDI4eHhQY2lBc2ljUmFkaW9PbihwQWQsIEdVSV9JRExFX1BPV0VSX1NBVkUpOw0KLQkJCX0KLQotICAgICAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLSAgICAgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKLQkgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwJJkNhbmNlbGxlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMaW5rIGRvd24gZmlyc3QgaWYgYW55IGFzc29jaWF0aW9uIGV4aXN0cwotICAgICAgICBpZiAoSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpKQotICAgICAgICAgICAgTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0gICAgICAgIFJUTVB1c2VjRGVsYXkoMTAwMDApOwotICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAvLyBDbGVhbiB1cCBvbGQgYnNzIHRhYmxlCi0gICAgICAgIEJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKLQotCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkspOwotICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOwotICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOwotICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOwotICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfSENDQSk7Ci0gICAgCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKLSAgICAJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKLQotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQotCQl7Ci0JCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsIDUwMCk7Ci0JCQlyZXR1cm47Ci0JCX0KLSAgICB9Ci0KLQkvLyBTZXQgUmFkaW8gb2ZmIGZsYWcKLQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOwotCi0JLy8gRGlzYWJsZSBUeC9SeCBETUEKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CSAgIC8vIGRpc2FibGUgRE1BCi0JR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMDsKLQlHbG9DZmcuZmllbGQuRW5hYmxlUnhETUEgPSAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsJICAgLy8gYWJvcnQgYWxsIFRYIHJpbmdzCi0KLQotCS8vIE1BQ19TWVNfQ1RSTCA9PiB2YWx1ZSA9IDB4MCA9PiA0MG1BCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAwKTsKLQotCS8vIFBXUl9QSU5fQ0ZHID0+IHZhbHVlID0gMHgwID0+IDQwbUEKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQV1JfUElOX0NGRywgMCk7Ci0KLQkvLyBUWF9QSU5fQ0ZHID0+IHZhbHVlID0gMHgwID0+IDIwbUEKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCAwKTsKLQotCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCi0JewotCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgotCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotCX0KLQllbHNlCi0JewotCQkvLyBNdXN0IHVzaW5nIDIwTUh6LgotCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JfQotCi0JLy8gV2FpdGluZyBmb3IgRE1BIGlkbGUKLQlpID0gMDsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwotCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCi0JCQlicmVhazsKLQotCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCX13aGlsZSAoaSsrIDwgMTAwKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhX3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkNzNhMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhX3BjaS5jCkBAIC0wLDAgKzEsMTA5NiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoKKyAgIEFsbCBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIG11c3QgYmUgUENJLWRlcGVuZGVkLCBvciB5b3Ugc2hvdWxkIG91dCB5b3VyIGZ1bmN0aW9uCisJaW4gb3RoZXIgZmlsZXMuCisKKyovCisjaW5jbHVkZQkiLi4vcnRfY29uZmlnLmgiCisKK3UxNiBSdG1wUENJX1dyaXRlVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJICAgICAgIElOIEJPT0xFQU4gYklzTGFzdCwgdTE2ICogRnJlZU51bWJlcikKK3sKKworCXU4ICpwRE1BSGVhZGVyQnVmVkE7CisJdTE2IFR4SWR4LCBSZXRUeElkeDsKKwlzdHJ1Y3QgcnRfdHhkICogcFR4RDsKKwl1MzIgQnVmQmFzZVBhTG93OworCXN0cnVjdCBydF9ydG1wX3R4X3JpbmcgKnBUeFJpbmc7CisJdTE2IGh3SGVhZGVyTGVuOworCisJLyogKi8KKwkvKiBnZXQgVHggUmluZyBSZXNvdXJjZSAqLworCS8qICovCisJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07CisJVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7CisJcERNQUhlYWRlckJ1ZlZBID0gKHU4ICopcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7CisJQnVmQmFzZVBhTG93ID0KKwkgICAgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOworCisJLyogY29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlciAqLworCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKSB7CisJCS8qaHdIZWFkZXJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCwgNCkrTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsgKi8KKwkJaHdIZWFkZXJMZW4gPQorCQkgICAgcFR4QmxrLT5NcGR1SGVhZGVyTGVuIC0gTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArCisJCSAgICBwVHhCbGstPkhkclBhZExlbiArIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7CisJfSBlbHNlIHsKKwkJLypod0hlYWRlckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7ICovCisJCWh3SGVhZGVyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47CisJfQorCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsCisJCSAgICAgICBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuKTsKKworCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OworCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisKKwkvKiAqLworCS8qIGJ1aWxkIFR4IERlc2NyaXB0b3IgKi8KKwkvKiAqLworCisJcFR4RCA9IChzdHJ1Y3QgcnRfdHhkICopIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisJTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOworCisJcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OworCXBUeEQtPlNETGVuMCA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW47CS8qIGluY2x1ZGUgcGFkZGluZyAqLworCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlwVHhELT5TRExlbjEgPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwlwVHhELT5MYXN0U2VjMCA9IDA7CisJcFR4RC0+TGFzdFNlYzEgPSAoYklzTGFzdCkgPyAxIDogMDsKKworCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIEZBTFNFLCBGSUZPX0VEQ0EpOworCisJUmV0VHhJZHggPSBUeElkeDsKKwkvKiAqLworCS8qIFVwZGF0ZSBUeCBpbmRleCAqLworCS8qICovCisJSU5DX1JJTkdfSU5ERVgoVHhJZHgsIFRYX1JJTkdfU0laRSk7CisJcFR4UmluZy0+VHhDcHVJZHggPSBUeElkeDsKKworCSpGcmVlTnVtYmVyIC09IDE7CisKKwlyZXR1cm4gUmV0VHhJZHg7Cit9CisKK3UxNiBSdG1wUENJX1dyaXRlU2luZ2xlVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICAgICBJTiBCT09MRUFOIGJJc0xhc3QsCisJCQkJICAgICB1MTYgKiBGcmVlTnVtYmVyKQoreworCisJdTggKnBETUFIZWFkZXJCdWZWQTsKKwl1MTYgVHhJZHgsIFJldFR4SWR4OworCXN0cnVjdCBydF90eGQgKiBwVHhEOworCXUzMiBCdWZCYXNlUGFMb3c7CisJc3RydWN0IHJ0X3J0bXBfdHhfcmluZyAqcFR4UmluZzsKKwl1MTYgaHdIZWFkZXJMZW47CisKKwkvKiAqLworCS8qIGdldCBUeCBSaW5nIFJlc291cmNlICovCisJLyogKi8KKwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKKwlUeElkeCA9IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeDsKKwlwRE1BSGVhZGVyQnVmVkEgPSAodTggKilwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKKwlCdWZCYXNlUGFMb3cgPQorCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7CisKKwkvKiBjb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyICovCisJLypod0hlYWRlckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7ICovCisJaHdIZWFkZXJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsCisJCSAgICAgICBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuKTsKKworCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OworCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisKKwkvKiAqLworCS8qIGJ1aWxkIFR4IERlc2NyaXB0b3IgKi8KKwkvKiAqLworCXBUeEQgPSAoc3RydWN0IHJ0X3R4ZCAqKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOworCU5kaXNaZXJvTWVtb3J5KHBUeEQsIFRYRF9TSVpFKTsKKworCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKKwlwVHhELT5TRExlbjAgPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuOwkvKiBpbmNsdWRlIHBhZGRpbmcgKi8KKwlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7OworCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOworCXBUeEQtPkxhc3RTZWMwID0gMDsKKwlwVHhELT5MYXN0U2VjMSA9IChiSXNMYXN0KSA/IDEgOiAwOworCisJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7CisKKwlSZXRUeElkeCA9IFR4SWR4OworCS8qICovCisJLyogVXBkYXRlIFR4IGluZGV4ICovCisJLyogKi8KKwlJTkNfUklOR19JTkRFWChUeElkeCwgVFhfUklOR19TSVpFKTsKKwlwVHhSaW5nLT5UeENwdUlkeCA9IFR4SWR4OworCisJKkZyZWVOdW1iZXIgLT0gMTsKKworCXJldHVybiBSZXRUeElkeDsKK30KKwordTE2IFJ0bXBQQ0lfV3JpdGVNdWx0aVR4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICAgIHU4IGZyYW1lTnVtLCB1MTYgKiBGcmVlTnVtYmVyKQoreworCUJPT0xFQU4gYklzTGFzdDsKKwl1OCAqcERNQUhlYWRlckJ1ZlZBOworCXUxNiBUeElkeCwgUmV0VHhJZHg7CisJc3RydWN0IHJ0X3R4ZCAqIHBUeEQ7CisJdTMyIEJ1ZkJhc2VQYUxvdzsKKwlzdHJ1Y3QgcnRfcnRtcF90eF9yaW5nICpwVHhSaW5nOworCXUxNiBod0hkckxlbjsKKwl1MzIgZmlyc3RETUFMZW47CisKKwliSXNMYXN0ID0gKChmcmFtZU51bSA9PSAocFR4QmxrLT5Ub3RhbEZyYW1lTnVtIC0gMSkpID8gMSA6IDApOworCisJLyogKi8KKwkvKiBnZXQgVHggUmluZyBSZXNvdXJjZSAqLworCS8qICovCisJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07CisJVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7CisJcERNQUhlYWRlckJ1ZlZBID0gKHU4ICopcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7CisJQnVmQmFzZVBhTG93ID0KKwkgICAgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOworCisJaWYgKGZyYW1lTnVtID09IDApIHsKKwkJLyogY29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlciAqLworCQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkKKwkJCS8qaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCwgNCkrTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsgKi8KKwkJCWh3SGRyTGVuID0KKwkJCSAgICBwVHhCbGstPk1wZHVIZWFkZXJMZW4gLSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsKKwkJCSAgICBwVHhCbGstPkhkclBhZExlbiArIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7CisJCWVsc2UgaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfUkFMSU5LX0ZSQU1FKQorCQkJLypod0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQsIDQpK0xFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRDsgKi8KKwkJCWh3SGRyTGVuID0KKwkJCSAgICBwVHhCbGstPk1wZHVIZWFkZXJMZW4gLQorCQkJICAgIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRCArIHBUeEJsay0+SGRyUGFkTGVuICsKKwkJCSAgICBMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQ7CisJCWVsc2UKKwkJCS8qaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4sIDQpOyAqLworCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCQlmaXJzdERNQUxlbiA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW47CisJfSBlbHNlIHsKKwkJZmlyc3RETUFMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CisJfQorCisJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBLCBwVHhCbGstPkhlYWRlckJ1ZiwgZmlyc3RETUFMZW4pOworCisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7CisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworCS8qICovCisJLyogYnVpbGQgVHggRGVzY3JpcHRvciAqLworCS8qICovCisJcFR4RCA9IChzdHJ1Y3QgcnRfdHhkICopIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisJTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOworCisJcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OworCXBUeEQtPlNETGVuMCA9IGZpcnN0RE1BTGVuOwkvKiBpbmNsdWRlIHBhZGRpbmcgKi8KKwlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7OworCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOworCXBUeEQtPkxhc3RTZWMwID0gMDsKKwlwVHhELT5MYXN0U2VjMSA9IChiSXNMYXN0KSA/IDEgOiAwOworCisJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7CisKKwlSZXRUeElkeCA9IFR4SWR4OworCS8qICovCisJLyogVXBkYXRlIFR4IGluZGV4ICovCisJLyogKi8KKwlJTkNfUklOR19JTkRFWChUeElkeCwgVFhfUklOR19TSVpFKTsKKwlwVHhSaW5nLT5UeENwdUlkeCA9IFR4SWR4OworCisJKkZyZWVOdW1iZXIgLT0gMTsKKworCXJldHVybiBSZXRUeElkeDsKKworfQorCit2b2lkIFJ0bXBQQ0lfRmluYWxXcml0ZVR4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJCSAgdTE2IHRvdGFsTVBEVVNpemUsIHUxNiBGaXJzdFR4SWR4KQoreworCisJc3RydWN0IHJ0X3R4d2kgKiBwVHhXSTsKKwlzdHJ1Y3QgcnRfcnRtcF90eF9yaW5nICpwVHhSaW5nOworCisJLyogKi8KKwkvKiBnZXQgVHggUmluZyBSZXNvdXJjZSAqLworCS8qICovCisJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07CisJcFR4V0kgPSAoc3RydWN0IHJ0X3R4d2kgKikgcFR4UmluZy0+Q2VsbFtGaXJzdFR4SWR4XS5EbWFCdWYuQWxsb2NWYTsKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gdG90YWxNUERVU2l6ZTsKKworfQorCit2b2lkIFJ0bXBQQ0lEYXRhTGFzdFR4SWR4KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgdTggUXVlSWR4LCB1MTYgTGFzdFR4SWR4KQoreworCXN0cnVjdCBydF90eGQgKiBwVHhEOworCXN0cnVjdCBydF9ydG1wX3R4X3JpbmcgKnBUeFJpbmc7CisKKwkvKiAqLworCS8qIGdldCBUeCBSaW5nIFJlc291cmNlICovCisJLyogKi8KKwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1F1ZUlkeF07CisKKwkvKiAqLworCS8qIGJ1aWxkIFR4IERlc2NyaXB0b3IgKi8KKwkvKiAqLworCXBUeEQgPSAoc3RydWN0IHJ0X3R4ZCAqKSBwVHhSaW5nLT5DZWxsW0xhc3RUeElkeF0uQWxsb2NWYTsKKworCXBUeEQtPkxhc3RTZWMxID0gMTsKKworfQorCit1MTYgUnRtcFBDSV9Xcml0ZUZyYWdUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICAgdTggZnJhZ051bSwgdTE2ICogRnJlZU51bWJlcikKK3sKKwl1OCAqcERNQUhlYWRlckJ1ZlZBOworCXUxNiBUeElkeCwgUmV0VHhJZHg7CisJc3RydWN0IHJ0X3R4ZCAqIHBUeEQ7CisJdTMyIEJ1ZkJhc2VQYUxvdzsKKwlzdHJ1Y3QgcnRfcnRtcF90eF9yaW5nICpwVHhSaW5nOworCXUxNiBod0hlYWRlckxlbjsKKwl1MzIgZmlyc3RETUFMZW47CisKKwkvKiAqLworCS8qIEdldCBUeCBSaW5nIFJlc291cmNlICovCisJLyogKi8KKwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKKwlUeElkeCA9IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeDsKKwlwRE1BSGVhZGVyQnVmVkEgPSAodTggKilwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKKwlCdWZCYXNlUGFMb3cgPQorCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7CisKKwkvKiAqLworCS8qIENvcHkgVFhJTkZPICsgVFhXSSArIFdMQU4gSGVhZGVyICsgTExDIGludG8gRE1BIEhlYWRlciBCdWZmZXIgKi8KKwkvKiAqLworCS8qaHdIZWFkZXJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4sIDQpOyAqLworCWh3SGVhZGVyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47CisKKwlmaXJzdERNQUxlbiA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW47CisJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBLCBwVHhCbGstPkhlYWRlckJ1ZiwgZmlyc3RETUFMZW4pOworCisJLyogKi8KKwkvKiBCdWlsZCBUeCBEZXNjcmlwdG9yICovCisJLyogKi8KKwlwVHhEID0gKHN0cnVjdCBydF90eGQgKikgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKwlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7CisKKwlpZiAoZnJhZ051bSA9PSBwVHhCbGstPlRvdGFsRnJhZ051bSkgeworCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IHBUeEJsay0+cFBhY2tldDsKKwkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKwl9CisKKwlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7CisJcFR4RC0+U0RMZW4wID0gZmlyc3RETUFMZW47CS8qIGluY2x1ZGUgcGFkZGluZyAqLworCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlwVHhELT5TRExlbjEgPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwlwVHhELT5MYXN0U2VjMCA9IDA7CisJcFR4RC0+TGFzdFNlYzEgPSAxOworCisJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7CisKKwlSZXRUeElkeCA9IFR4SWR4OworCXBUeEJsay0+UHJpdiArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworCS8qICovCisJLyogVXBkYXRlIFR4IGluZGV4ICovCisJLyogKi8KKwlJTkNfUklOR19JTkRFWChUeElkeCwgVFhfUklOR19TSVpFKTsKKwlwVHhSaW5nLT5UeENwdUlkeCA9IFR4SWR4OworCisJKkZyZWVOdW1iZXIgLT0gMTsKKworCXJldHVybiBSZXRUeElkeDsKKworfQorCisvKgorCU11c3QgYmUgcnVuIGluIEludGVycnVwdCBjb250ZXh0CisJVGhpcyBmdW5jdGlvbiBoYW5kbGUgUENJIHNwZWNpZmljIFR4RGVzYyBhbmQgY3B1IGluZGV4IHVwZGF0ZSBhbmQga2ljayB0aGUgcGFja2V0IG91dC4KKyAqLworaW50IFJ0bXBQQ0lNZ210S2lja091dChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCBRdWVJZHgsCisJCSAgICAgICB2b2lkICpwUGFja2V0LAorCQkgICAgICAgdTggKnBTcmNCdWZWQSwgdTMyIFNyY0J1ZkxlbikKK3sKKwlzdHJ1Y3QgcnRfdHhkICogcFR4RDsKKwl1bnNpZ25lZCBsb25nIFN3SWR4ID0gcEFkLT5NZ210UmluZy5UeENwdUlkeDsKKworCXBUeEQgPSAoc3RydWN0IHJ0X3R4ZCAqKSBwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLkFsbG9jVmE7CisKKwlwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKKwlwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisKKwlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBUUlVFLCBGSUZPX01HTVQpOworCXBUeEQtPkxhc3RTZWMwID0gMTsKKwlwVHhELT5MYXN0U2VjMSA9IDE7CisJcFR4RC0+RE1BRE9ORSA9IDA7CisJcFR4RC0+U0RMZW4xID0gMDsKKwlwVHhELT5TRFB0cjAgPQorCSAgICBQQ0lfTUFQX1NJTkdMRShwQWQsIHBTcmNCdWZWQSwgU3JjQnVmTGVuLCAwLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlwVHhELT5TRExlbjAgPSBTcmNCdWZMZW47CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKglEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiTUxNRUhhcmRUcmFuc21pdFxuIikpOworCWZvciAoaSA9IDA7IGkgPCAoVFhXSV9TSVpFKzI0KTsgaSsrKQorCXsKKworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiJXg6IiwgKihwU3JjQnVmVkEraSkpKTsKKwkJaWYgKCBpJTQgPT0gMykKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgOjogIikpOworCQlpZiAoIGklMTYgPT0gMTUpCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXG4gICAgICAiKSk7CisJfQorCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJcbiAgICAgICIpKTsqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKworCS8qIEluY3JlYXNlIFRYX0NUWF9JRFgsIGJ1dCB3cml0ZSB0byByZWdpc3RlciBsYXRlci4gKi8KKwlJTkNfUklOR19JTkRFWChwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBNR01UX1JJTkdfU0laRSk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgcEFkLT5NZ210UmluZy5UeENwdUlkeCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNoZWNrIFJ4IGRlc2NyaXB0b3IsIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGlmIGFueSBlcnJvciBkb3VuZAorCisJQXJndW1lbnRzOgorCQlwUnhECQlQb2ludGVyIHRvIHRoZSBSeCBkZXNjcmlwdG9yCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MJTm8gZXJyCisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUJRXJyb3IKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgUlRNUENoZWNrUnhFcnJvcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlciwKKwkJCSAgICAgc3RydWN0IHJ0X3J4d2kgKiBwUnhXSSwgSU4gUFJUMjhYWF9SWERfU1RSVUMgcFJ4RCkKK3sKKwlzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcFdwYUtleTsKKwlpbnQgZEJtOworCisJLyogUGh5IGVycm9ycyAmIENSQyBlcnJvcnMgKi8KKwlpZiAoIC8qKHBSeEQtPlBoeUVycikgfHwgKi8gKHBSeEQtPkNyYykpIHsKKwkJLyogQ2hlY2sgUlNTSSBmb3IgTm9pc2UgSGlzdCBzdGF0aXN0aWMgY29sbGVjdGlvbi4gKi8KKwkJZEJtID0gKGludCkocFJ4V0ktPlJTU0kwKSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CisJCWlmIChkQm0gPD0gLTg3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVswXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTgyKQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVsxXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTc3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVsyXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTcyKQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVszXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTY3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs0XSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTYyKQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs1XSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTU3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs2XSArPSAxOworCQllbHNlIGlmIChkQm0gPiAtNTcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzddICs9IDE7CisKKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisJLyogQWRkIFJ4IHNpemUgdG8gY2hhbm5lbCBsb2FkIGNvdW50ZXIsIHdlIHNob3VsZCBpZ25vcmUgZXJyb3IgY291bnRzICovCisJcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgKz0gKHBSeEQtPlNETDAgKyAxNCk7CisKKwkvKiBEcm9wIFRvRHMgcHJvbWlzY291cyBmcmFtZSwgaXQgaXMgb3BlbmVkIGR1ZSB0byBDQ1ggMiBjaGFubmVsIGxvYWQgc3RhdGlzdGljcyAqLworCWlmIChwSGVhZGVyICE9IE5VTEwpIHsKKwkJaWYgKHBIZWFkZXItPkZDLlRvRHMpIHsKKwkJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCX0KKwl9CisJLyogRHJvcCBub3QgVTJNIGZyYW1lcywgY2FudCdzIGRyb3AgaGVyZSBiZWNhdXNlIHdlIHdpbGwgZHJvcCBiZWFjb24gaW4gdGhpcyBjYXNlICovCisJLyogSSBhbSBraW5kIG9mIGRvdWJ0aW5nIHRoZSBVMk0gYml0IG9wZXJhdGlvbiAqLworCS8qIGlmIChwUnhELT5VMk0gPT0gMCkgKi8KKwkvKiAgICAgIHJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsgKi8KKworCS8qIGRyb3AgZGVjeXB0aW9uIGZhaWwgZnJhbWUgKi8KKwlpZiAocFJ4RC0+Q2lwaGVyRXJyKSB7CisJCWlmIChwUnhELT5DaXBoZXJFcnIgPT0gMikgeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAgICAgKCJwUnhEIEVSUk9SOiBJQ1Ygb2sgYnV0IE1JQ0VyciAiKSk7CisJCX0gZWxzZSBpZiAocFJ4RC0+Q2lwaGVyRXJyID09IDEpIHsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJwUnhEIEVSUk9SOiBJQ1YgRXJyICIpKTsKKwkJfSBlbHNlIGlmIChwUnhELT5DaXBoZXJFcnIgPT0gMykKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkgICAgICgicFJ4RCBFUlJPUjogS2V5IG5vdCB2YWxpZCAiKSk7CisKKwkJaWYgKCgocFJ4RC0+Q2lwaGVyRXJyICYgMSkgPT0gMSkKKwkJICAgICYmIHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ICYmIElORlJBX09OKHBBZCkpCisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19JQ1ZfRVJST1JfRVZFTlRfRkxBRywKKwkJCQkJICAgICAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4KKwkJCQkJICAgICAgQWRkciwgQlNTMCwgMCk7CisKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJICAgICAoIiAlZCAobGVuPSVkLCBNY2FzdD0lZCwgTXlCc3M9JWQsIFdjaWQ9JWQsIEtleUlkPSVkKVxuIiwKKwkJCSAgICAgIHBSeEQtPkNpcGhlckVyciwgcFJ4RC0+U0RMMCwKKwkJCSAgICAgIHBSeEQtPk1jYXN0IHwgcFJ4RC0+QmNhc3QsIHBSeEQtPk15QnNzLAorCQkJICAgICAgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsCisvKiAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJOYW1lW3BSeEQtPkNpcGhlckFsZ10sICovCisJCQkgICAgICBwUnhXSS0+S2V5SW5kZXgpKTsKKworCQkvKiAqLworCQkvKiBNSUMgRXJyb3IgKi8KKwkJLyogKi8KKwkJaWYgKHBSeEQtPkNpcGhlckVyciA9PSAyKSB7CisJCQlwV3BhS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BSeFdJLT5LZXlJbmRleF07CisJCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKQorCQkJCVdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KHBBZCwKKwkJCQkJCQkJIChwV3BhS2V5LT4KKwkJCQkJCQkJICBUeXBlID09CisJCQkJCQkJCSAgUEFJUldJU0VLRVkpID8KKwkJCQkJCQkJIFRSVUUgOiBGQUxTRSk7CisJCQllbHNlCisJCQkJUlRNUFJlcG9ydE1pY0Vycm9yKHBBZCwgcFdwYUtleSk7CisKKwkJCWlmICgoKHBSeEQtPkNpcGhlckVyciAmIDIpID09IDIpCisJCQkgICAgJiYgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgJiYgSU5GUkFfT04ocEFkKSkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLAorCQkJCQkJICAgICAgSVdfTUlDX0VSUk9SX0VWRU5UX0ZMQUcsCisJCQkJCQkgICAgICBwQWQtPk1hY1RhYi4KKwkJCQkJCSAgICAgIENvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwKKwkJCQkJCSAgICAgIEJTUzAsIDApOworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUnggTUlDIFZhbHVlIGVycm9yXG4iKSk7CisJCX0KKworCQlpZiAocEhlYWRlciA9PSBOVUxMKQorCQkJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJLyppZiAoKHBSeEQtPkNpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSAmJgorCQkgICAocEhlYWRlci0+U2VxdWVuY2UgPT0gcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UpKQorCQkgICB7CisJCSAgIC8vCisJCSAgIC8vIEFjY2VwdGFibGUgc2luY2UgdGhlIEZpcnN0IEZyYWdGcmFtZSBubyBDaXBoZXJFcnIgcHJvYmxlbS4KKwkJICAgLy8KKwkJICAgcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkgICB9ICovCisKKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKwlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworfQorCitCT09MRUFOIFJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IFF1ZUlkeCkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF90eF9yaW5nICpwVHhSaW5nOworCXN0cnVjdCBydF90eGQgKiBwVHhEOworCXZvaWQgKnBQYWNrZXQ7CisJdTggRlJFRSA9IDA7CisJc3RydWN0IHJ0X3R4ZCBUeEQsICpwT3JpVHhEOworCS8qdW5zaWduZWQgbG9uZyAgICAgICAgIElycUZsYWdzOyAqLworCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSBGQUxTRTsKKworCUFTU0VSVChRdWVJZHggPCBOVU1fT0ZfVFhfUklORyk7CisJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tRdWVJZHhdOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFF1ZUlkeCAqIFJJTkdSRUdfRElGRiwKKwkJICAgICAgICZwVHhSaW5nLT5UeERtYUlkeCk7CisJd2hpbGUgKHBUeFJpbmctPlR4U3dGcmVlSWR4ICE9IHBUeFJpbmctPlR4RG1hSWR4KSB7CisvKiAgICAgICAgICAgICAgUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOyAqLworCisJCS8qIHN0YXRpYyByYXRlIGFsc28gbmVlZCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoKSBmdW5jdGlvbi4gKi8KKwkJLyppZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkgKi8KKwkJTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKHBBZCk7CisKKwkJLyogTm90ZSA6IElmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpLCB3ZSB3aWxsIG5ldmVyIHJlYWNoIGhlcmUuICovCisJCUZSRUUrKzsKKwkJcFR4RCA9CisJCSAgICAoc3RydWN0IHJ0X3R4ZCAqKSAocFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0uQWxsb2NWYSk7CisJCXBPcmlUeEQgPSBwVHhEOworCQlOZGlzTW92ZU1lbW9yeSgmVHhELCBwVHhELCBzaXplb2Yoc3RydWN0IHJ0X3R4ZCkpOworCQlwVHhEID0gJlR4RDsKKworCQlwVHhELT5ETUFET05FID0gMDsKKworCQl7CisJCQlwUGFja2V0ID0KKwkJCSAgICBwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldDsKKwkJCWlmIChwUGFja2V0KSB7CisJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwKKwkJCQkJCSBwVHhELT5TRExlbjEsCisJCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsCisJCQkJCQkgICAgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCQl9CisJCQkvKkFsd2F5cyBhc3NpZ24gcE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhciAqLworCQkJcFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJCQlwUGFja2V0ID0KKwkJCSAgICBwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQ7CisKKwkJCUFTU0VSVChwUGFja2V0ID09IE5VTEwpOworCQkJaWYgKHBQYWNrZXQpIHsKKwkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLAorCQkJCQkJIHBUeEQtPlNETGVuMSwKKwkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwKKwkJCQkJCSAgICBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8qQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhciAqLworCQkJcFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0ID0KKwkJCSAgICBOVUxMOworCQl9CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudCArPQorCQkgICAgKHBUeEQtPlNETGVuMSArIHBUeEQtPlNETGVuMCk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRG1hRG9uZUNvdW50W1F1ZUlkeF0rKzsKKwkJSU5DX1JJTkdfSU5ERVgocFR4UmluZy0+VHhTd0ZyZWVJZHgsIFRYX1JJTkdfU0laRSk7CisJCS8qIGdldCB0eF90ZHhfaWR4IGFnYWluICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRdWVJZHggKiBSSU5HUkVHX0RJRkYsCisJCQkgICAgICAgJnBUeFJpbmctPlR4RG1hSWR4KTsKKwkJTmRpc01vdmVNZW1vcnkocE9yaVR4RCwgcFR4RCwgc2l6ZW9mKHN0cnVjdCBydF90eGQpKTsKKworLyogICAgICAgICBSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsgKi8KKwl9CisKKwlyZXR1cm4gYlJlc2NoZWR1bGU7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgVFggUmluZ3MgRE1BIERvbmUgaW50ZXJydXB0LCBydW5uaW5nIGluIERQQyBsZXZlbAorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSBJTlRfU09VUkNFX0NTUl9TVFJVQyBUeFJpbmdCaXRtYXApCit7CisvKiAgICAgIHU4ICAgICAgICAgICAgICAgICAgIENvdW50ID0gMDsgKi8KKwl1bnNpZ25lZCBsb25nIElycUZsYWdzOworCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSBGQUxTRTsKKworCS8qIE1ha2Ugc3VyZSBUeCByaW5nIHJlc291cmNlIHdvbid0IGJlIHVzZWQgYnkgb3RoZXIgdGhyZWFkcyAqLworCS8qTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsgKi8KKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKworCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuQWMwRG1hRG9uZSkKKwkJYlJlc2NoZWR1bGUgPSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfQkUpOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzNEbWFEb25lKQorCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfVk8pOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzJEbWFEb25lKQorCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfVkkpOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzFEbWFEb25lKQorCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfQkspOworCisJLyogTWFrZSBzdXJlIHRvIHJlbGVhc2UgVHggcmluZyByZXNvdXJjZSAqLworCS8qTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsgKi8KKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKworCS8qIERlcXVldWUgb3V0Z29pbmcgZnJhbWVzIGZyb20gVHhTd1F1ZXVlW10gYW5kIHByb2Nlc3MgaXQgKi8KKwlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworCisJcmV0dXJuIGJSZXNjaGVkdWxlOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBNR01UIHJpbmcgRE1BIGRvbmUgaW50ZXJydXB0LCBydW5uaW5nIGluIERQQyBsZXZlbAorCisJQXJndW1lbnRzOgorCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUTVBIYW5kbGVNZ210UmluZ0RtYURvbmVJbnRlcnJ1cHQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBydF90eGQgKiBwVHhEOworCXZvaWQgKnBQYWNrZXQ7CisvKiAgICAgIGludCAgICAgICAgICAgICAgaTsgKi8KKwl1OCBGUkVFID0gMDsKKwlzdHJ1Y3QgcnRfcnRtcF9tZ210X3JpbmcgKnBNZ210UmluZyA9ICZwQWQtPk1nbXRSaW5nOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9NR01URFRYX0lEWCwgJnBNZ210UmluZy0+VHhEbWFJZHgpOworCXdoaWxlIChwTWdtdFJpbmctPlR4U3dGcmVlSWR4ICE9IHBNZ210UmluZy0+VHhEbWFJZHgpIHsKKwkJRlJFRSsrOworCQlwVHhEID0KKwkJICAgIChzdHJ1Y3QgcnRfdHhkICopIChwTWdtdFJpbmctPkNlbGxbcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeF0uCisJCQkJICBBbGxvY1ZhKTsKKwkJcFR4RC0+RE1BRE9ORSA9IDA7CisJCXBQYWNrZXQgPSBwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5kaXNQYWNrZXQ7CisKKwkJaWYgKHBQYWNrZXQpIHsKKwkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQl9CisJCXBNZ210UmluZy0+Q2VsbFtwTWdtdFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkJcFBhY2tldCA9CisJCSAgICBwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0OworCQlpZiAocFBhY2tldCkgeworCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLAorCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCX0KKwkJcE1nbXRSaW5nLT5DZWxsW3BNZ210UmluZy0+VHhTd0ZyZWVJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisJCUlOQ19SSU5HX0lOREVYKHBNZ210UmluZy0+VHhTd0ZyZWVJZHgsIE1HTVRfUklOR19TSVpFKTsKKworCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyLiBEZXF1ZXVlIGFsbCBwb3dlciBzYWZlIGRlbGF5ZWQgYnJhb2RjYXN0IGZyYW1lcyBhZnRlciBiZWFjb24uCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUEhhbmRsZVRCVFRJbnRlcnJ1cHQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXsKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpIHsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJQXJndW1lbnRzOgorCQlwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIuIFJld3JpdGUgYmVhY29uIGNvbnRlbnQgYmVmb3JlIG5leHQgc2VuZC1vdXQuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXsKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlJUTVBIYW5kbGVQcmVUQlRUSW50ZXJydXB0Li4uXG4iKSk7CisJCX0KKwl9CisKK30KKwordm9pZCBSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJV1BETUFfR0xPX0NGR19TVFJVQyBHbG9DZmc7CisKKwlpZiAocEFkID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gcEFkIGlzIE5VTEwsIHJldHVybi5cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdCBcbiIpKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKKworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAwOworCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDA7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CisKKwlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOworCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CSyk7CisJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKKwlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOworCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKKwlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfUlgpOworCisJUlRNUEVuYWJsZVJ4VHgocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdCBcbiIpKTsKK30KKwordm9pZCAqR2V0UGFja2V0RnJvbVJ4UmluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIE9VVCBQUlQyOFhYX1JYRF9TVFJVQyBwU2F2ZVJ4RCwKKwkJCQkgT1VUIEJPT0xFQU4gKiBwYlJlc2NoZWR1bGUsCisJCQkJIElOIHUzMiAqIHBSeFBlbmRpbmcpCit7CisJc3RydWN0IHJ0X3J4ZCAqIHBSeEQ7CisJdm9pZCAqcFJ4UGFja2V0ID0gTlVMTDsKKwl2b2lkICpwTmV3UGFja2V0OworCXZvaWQgKkFsbG9jVmE7CisJZG1hX2FkZHJfdCBBbGxvY1BhOworCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSBGQUxTRTsKKwlzdHJ1Y3QgcnRfcnRtcF9kbWFjYiAqcFJ4Q2VsbDsKKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+UnhSaW5nTG9jayk7CisKKwlpZiAoKnBSeFBlbmRpbmcgPT0gMCkgeworCQkvKiBHZXQgaG93IG1heSBwYWNrZXRzIGhhZCBiZWVuIHJlY2VpdmVkICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfRFJYX0lEWCwgJnBBZC0+UnhSaW5nLlJ4RG1hSWR4KTsKKworCQlpZiAocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPT0gcEFkLT5SeFJpbmcuUnhEbWFJZHgpIHsKKwkJCS8qIG5vIG1vcmUgcnggcGFja2V0cyAqLworCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQkvKiBnZXQgcnggcGVuZGluZyBjb3VudCAqLworCQlpZiAocEFkLT5SeFJpbmcuUnhEbWFJZHggPiBwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCkKKwkJCSpwUnhQZW5kaW5nID0KKwkJCSAgICBwQWQtPlJ4UmluZy5SeERtYUlkeCAtIHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4OworCQllbHNlCisJCQkqcFJ4UGVuZGluZyA9CisJCQkgICAgcEFkLT5SeFJpbmcuUnhEbWFJZHggKyBSWF9SSU5HX1NJWkUgLQorCQkJICAgIHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4OworCisJfQorCisJcFJ4Q2VsbCA9ICZwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XTsKKworCS8qIFBvaW50IHRvIFJ4IGluZGV4ZWQgcnggcmluZyBkZXNjcmlwdG9yICovCisJcFJ4RCA9IChzdHJ1Y3QgcnRfcnhkICopIHBSeENlbGwtPkFsbG9jVmE7CisKKwlpZiAocFJ4RC0+RERPTkUgPT0gMCkgeworCQkqcFJ4UGVuZGluZyA9IDA7CisJCS8qIERNQUluZHggaGFkIGRvbmUgYnV0IERET05FIGJpdCBub3QgcmVhZHkgKi8KKwkJYlJlc2NoZWR1bGUgPSBUUlVFOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogcmV0dXJuIHJ4IGRlc2NyaXB0b3IgKi8KKwlOZGlzTW92ZU1lbW9yeShwU2F2ZVJ4RCwgcFJ4RCwgUlhEX1NJWkUpOworCisJcE5ld1BhY2tldCA9CisJICAgIFJUTVBfQWxsb2NhdGVSeFBhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9BR0dSRVNJWkUsIEZBTFNFLAorCQkJCQkmQWxsb2NWYSwgJkFsbG9jUGEpOworCisJaWYgKHBOZXdQYWNrZXQpIHsKKwkJLyogdW5tYXAgdGhlIHJ4IGJ1ZmZlciAqLworCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFJ4Q2VsbC0+RG1hQnVmLkFsbG9jUGEsCisJCQkJIHBSeENlbGwtPkRtYUJ1Zi5BbGxvY1NpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCXBSeFBhY2tldCA9IHBSeENlbGwtPnBOZGlzUGFja2V0OworCisJCXBSeENlbGwtPkRtYUJ1Zi5BbGxvY1NpemUgPSBSWF9CVUZGRVJfQUdHUkVTSVpFOworCQlwUnhDZWxsLT5wTmRpc1BhY2tldCA9ICh2b2lkICopcE5ld1BhY2tldDsKKwkJcFJ4Q2VsbC0+RG1hQnVmLkFsbG9jVmEgPSBBbGxvY1ZhOworCQlwUnhDZWxsLT5EbWFCdWYuQWxsb2NQYSA9IEFsbG9jUGE7CisJCS8qIHVwZGF0ZSBTRFAwIHRvIG5ldyBidWZmZXIgb2YgcnggcGFja2V0ICovCisJCXBSeEQtPlNEUDAgPSBBbGxvY1BhOworCX0gZWxzZSB7CisJCS8qREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJObyBSeCBCdWZmZXJcbiIpKTsgKi8KKwkJcFJ4UGFja2V0ID0gTlVMTDsKKwkJYlJlc2NoZWR1bGUgPSBUUlVFOworCX0KKworCXBSeEQtPkRET05FID0gMDsKKworCS8qIGhhZCBoYW5kbGVkIG9uZSByeCBwYWNrZXQgKi8KKwkqcFJ4UGVuZGluZyA9ICpwUnhQZW5kaW5nIC0gMTsKKworCS8qIHVwZGF0ZSByeCBkZXNjcmlwdG9yIGFuZCBraWNrIHJ4ICovCisJSU5DX1JJTkdfSU5ERVgocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHgsIFJYX1JJTkdfU0laRSk7CisKKwlwQWQtPlJ4UmluZy5SeENwdUlkeCA9CisJICAgIChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCA9PQorCSAgICAgMCkgPyAoUlhfUklOR19TSVpFIC0gMSkgOiAocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggLSAxKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9DUlhfSURYLCBwQWQtPlJ4UmluZy5SeENwdUlkeCk7CisKK2RvbmU6CisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPlJ4UmluZ0xvY2spOworCSpwYlJlc2NoZWR1bGUgPSBiUmVzY2hlZHVsZTsKKwlyZXR1cm4gcFJ4UGFja2V0OworfQorCitpbnQgTWxtZUhhcmRUcmFuc21pdFR4UmluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgdTggUXVlSWR4LCB2b2lkICpwUGFja2V0KQoreworCXN0cnVjdCBydF9wYWNrZXRfaW5mbyBQYWNrZXRJbmZvOworCXU4ICpwU3JjQnVmVkE7CisJdTMyIFNyY0J1ZkxlbjsKKwlzdHJ1Y3QgcnRfdHhkICogcFR4RDsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZWFkZXJfODAyXzExOworCUJPT0xFQU4gYkFja1JlcXVpcmVkLCBiSW5zZXJ0VGltZXN0YW1wOworCXVuc2lnbmVkIGxvbmcgU3JjQnVmUEE7CisJLyp1OCAgICAgICAgICAgICAgICAgVHhCdWZJZHg7ICovCisJdTggTWxtZVJhdGU7CisJdW5zaWduZWQgbG9uZyBTd0lkeCA9IHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHg7CisJc3RydWN0IHJ0X3R4d2kgKiBwRmlyc3RUeFdJOworCS8qdW5zaWduZWQgbG9uZyBpOyAqLworCS8qSFRUUkFOU01JVF9TRVRUSU5HICAgIE1sbWVUcmFuc21pdDsgICAvL1JhdGUgZm9yIHRoaXMgTUdNVCBmcmFtZS4gKi8KKwl1bnNpZ25lZCBsb25nIEZyZWVOdW07CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5ID0gTlVMTDsKKworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKKworCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkgeworCQkvKiBUaGUgYnVmZmVyIHNob3VsZG4ndCBiZSBOVUxMICovCisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKwkvKiBNYWtlIHN1cmUgTUdNVCByaW5nIHJlc291cmNlIHdvbid0IGJlIHVzZWQgYnkgb3RoZXIgdGhyZWFkcyAqLworCS8qTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsgKi8KKworCUZyZWVOdW0gPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7CisKKwlpZiAoRnJlZU51bSA9PSAwKSB7CisJCS8qTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsgKi8KKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJU3dJZHggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4OworCisJcFR4RCA9IChzdHJ1Y3QgcnRfdHhkICopIHBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0uQWxsb2NWYTsKKworCWlmIChwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0KSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJNbG1lSGFyZFRyYW5zbWl0IEVycm9yXG4iKSk7CisJCS8qTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsgKi8KKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJeworCQkvKiBvdXRnb2luZyBmcmFtZSBhbHdheXMgd2FrZXVwIFBIWSB0byBwcmV2ZW50IGZyYW1lIGxvc3QgKi8KKwkJLyogaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgKi8KKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKwl9CisJcEZpcnN0VHhXSSA9IChzdHJ1Y3QgcnRfdHh3aSAqKSBwU3JjQnVmVkE7CisKKwlwSGVhZGVyXzgwMl8xMSA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSAocFNyY0J1ZlZBICsgVFhXSV9TSVpFKTsKKwlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkgeworCQlNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7CisJfSBlbHNlIHsKKwkJTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwl9CisKKwlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpICYmCisJICAgIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1FPU19OVUxMKSkgeworCQlwTWFjRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBIZWFkZXJfODAyXzExLT5BZGRyMSk7CisJfQorCS8qIFZlcmlmeSBNbG1lIHJhdGUgZm9yIGEgLyBnIGJhbmRzLiAqLworCWlmICgocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpICYmIChNbG1lUmF0ZSA8IFJBVEVfNikpCS8qIDExQSBiYW5kICovCisJCU1sbWVSYXRlID0gUkFURV82OworCisJLyogKi8KKwkvKiBTaG91bGQgbm90IGJlIGhhcmQgY29kZSB0byBzZXQgUHdyTWdtdCB0byAwIChQV1JfQUNUSVZFKSAqLworCS8qIFNuaWNlIGl0J3MgYmVlbiBzZXQgdG8gMCB3aGlsZSBvbiBNZ3RNYWNIZWFkZXJJbml0ICovCisJLyogQnkgdGhlIHdheSB0aGlzIHdpbGwgY2F1c2UgZnJhbWUgdG8gYmUgc2VuZCBvbiBQV1JfU0FWRSBmYWlsZWQuICovCisJLyogKi8KKwkvKiAqLworCS8qIEluIFdNTS1VQVBTRCwgbWxtZSBmcmFtZSBzaG91bGQgYmUgc2V0IHBzbSBhcyBwb3dlciBzYXZpbmcgYnV0IHByb2JlIHJlcXVlc3QgZnJhbWUgKi8KKwkvKiBEYXRhLU51bGwgcGFja2V0cyBhbHNlIHBhc3MgdGhyb3VnaCBNTVJlcXVlc3QgaW4gUlQyODYwLCBob3dldmVyLCB3ZSBob3BlIGNvbnRyb2wgdGhlIHBzbSBiaXQgdG8gcGFzcyBBUFNEICovCisJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlICE9IEJUWVBFX0RBVEEpIHsKKwkJaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BST0JFX1JFUSkKKwkJICAgIHx8ICEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlCisJCQkgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUpKSB7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9BQ1RJVkU7CisJCX0gZWxzZSB7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9CisJCQkgICAgcEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZTsKKwkJfQorCX0KKworCWJJbnNlcnRUaW1lc3RhbXAgPSBGQUxTRTsKKwlpZiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfQ05UTCkJLyogbXVzdCBiZSBQUy1QT0xMICovCisJeworCQliQWNrUmVxdWlyZWQgPSBGQUxTRTsKKwl9IGVsc2UJCQkvKiBCVFlQRV9NR01UIG9yIEJUWVBFX0RBVEEobXVzdCBiZSBOVUxMIGZyYW1lKSAqLworCXsKKwkJaWYgKHBIZWFkZXJfODAyXzExLT5BZGRyMVswXSAmIDB4MDEpCS8qIE1VTFRJQ0FTVCwgQlJPQURDQVNUICovCisJCXsKKwkJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOworCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gMDsKKwkJfSBlbHNlIHsKKwkJCWJBY2tSZXF1aXJlZCA9IFRSVUU7CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPQorCQkJICAgIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBNbG1lUmF0ZSwgMTQpOworCQkJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUlNQKSB7CisJCQkJYkluc2VydFRpbWVzdGFtcCA9IFRSVUU7CisJCQl9CisJCX0KKwl9CisJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZSsrOworCWlmIChwQWQtPlNlcXVlbmNlID4gMHhmZmYpCisJCXBBZC0+U2VxdWVuY2UgPSAwOworCS8qIEJlZm9yZSByYWRhciBkZXRlY3Rpb24gZG9uZSwgbWdtdCBmcmFtZSBjYW4gbm90IGJlIHNlbnQgYnV0IHByb2JlIHJlcSAqLworCS8qIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgcHJvYmUgcmVxIHRvIHRyaWdnZXIgZHJpdmVyIHRvIHNlbmQgcHJvYmUgcmVxIGluIHBhc3NpdmUgc2NhbiAqLworCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgIT0gU1VCVFlQRV9QUk9CRV9SRVEpCisJICAgICYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCSAgICAmJiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIk1sbWVIYXJkVHJhbnNtaXQgLS0+IHJhZGFyIGRldGVjdCBub3QgaW4gbm9ybWFsIG1vZGUhXG4iKSk7CisJCS8qTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsgKi8KKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisJLyogKi8KKwkvKiBmaWxsIHNjYXR0ZXItYW5kLWdhdGhlciBidWZmZXIgbGlzdCBpbnRvIFRYRC4gSW50ZXJuYWxseSBjcmVhdGVkIE5ESVMgUEFDS0VUICovCisJLyogc2hvdWxkIGFsd2F5cyBoYXMgb25seSBvbmUgb2h5c2ljYWwgYnVmZmVyLCBhbmQgdGhlIHdob2xlIGZyYW1lIHNpemUgZXF1YWxzICovCisJLyogdG8gdGhlIGZpcnN0IHNjYXR0ZXIgYnVmZmVyIHNpemUgKi8KKwkvKiAqLworCisJLyogSW5pdGlhbGl6ZSBUWCBEZXNjcmlwdG9yICovCisJLyogRm9yIGludGVyLWZyYW1lIGdhcCwgdGhlIG51bWJlciBpcyBmb3IgdGhpcyBmcmFtZSBhbmQgbmV4dCBmcmFtZSAqLworCS8qIEZvciBNTE1FIHJhdGUsIHdlIHdpbGwgZml4IGFzIDJNYiB0byBtYXRjaCBvdGhlciB2ZW5kb3IncyBpbXBsZW1lbnQgKi8KKy8qICAgICAgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSAxOyAqLworCisvKiBtYW5hZ2VtZW50IGZyYW1lIGRvZXNuJ3QgbmVlZCBlbmNyeXB0aW9uLiBzbyB1c2UgUkVTRVJWRURfV0NJRCBubyBtYXR0ZXIgdSBhcmUgc2VuZGluZyB0byBzcGVjaWZpYyB3Y2lkIG9yIG5vdC4gKi8KKwkvKiBPbmx5IGJlYWNvbiB1c2UgTnNlcT1UUlVFLiBTbyBoZXJlIHdlIHVzZSBOc2VxPUZBTFNFLiAqLworCWlmIChwTWFjRW50cnkgPT0gTlVMTCkgeworCQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLCBiSW5zZXJ0VGltZXN0YW1wLAorCQkJICAgICAgRkFMU0UsIGJBY2tSZXF1aXJlZCwgRkFMU0UsIDAsIFJFU0VSVkVEX1dDSUQsCisJCQkgICAgICAoU3JjQnVmTGVuIC0gVFhXSV9TSVpFKSwgUElEX01HTVQsIDAsCisJCQkgICAgICAodTgpcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUywKKwkJCSAgICAgIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisJfSBlbHNlIHsKKwkJUlRNUFdyaXRlVHhXSShwQWQsIHBGaXJzdFR4V0ksIEZBTFNFLCBGQUxTRSwKKwkJCSAgICAgIGJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAorCQkJICAgICAgMCwgcE1hY0VudHJ5LT5BaWQsIChTcmNCdWZMZW4gLSBUWFdJX1NJWkUpLAorCQkJICAgICAgcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLCAwLAorCQkJICAgICAgKHU4KXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywKKwkJCSAgICAgIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlKTsKKwl9CisKKwlwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKKwlwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisvKiAgICAgIHBGaXJzdFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IFNyY0J1ZkxlbiAtIFRYV0lfU0laRTsgKi8KKwlTcmNCdWZQQSA9CisJICAgIFBDSV9NQVBfU0lOR0xFKHBBZCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4sIDAsIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgVFJVRSwgRklGT19FRENBKTsKKwlwVHhELT5MYXN0U2VjMCA9IDE7CisJcFR4RC0+TGFzdFNlYzEgPSAxOworCXBUeEQtPlNETGVuMCA9IFNyY0J1ZkxlbjsKKwlwVHhELT5TRExlbjEgPSAwOworCXBUeEQtPlNEUHRyMCA9IFNyY0J1ZlBBOworCXBUeEQtPkRNQURPTkUgPSAwOworCisJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKworCS8qIEluY3JlYXNlIFRYX0NUWF9JRFgsIGJ1dCB3cml0ZSB0byByZWdpc3RlciBsYXRlci4gKi8KKwlJTkNfUklOR19JTkRFWChwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4LCBUWF9SSU5HX1NJWkUpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBRdWVJZHggKiAweDEwLAorCQkJcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCk7CisKKwkvKiBNYWtlIHN1cmUgdG8gcmVsZWFzZSBNR01UIHJpbmcgcmVzb3VyY2UgKi8KKy8qICAgICAgTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsgKi8KKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCitpbnQgTWxtZURhdGFIYXJkVHJhbnNtaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSB1OCBRdWVJZHgsIHZvaWQgKnBQYWNrZXQpCit7CisJaWYgKChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpCisJICAgICkgeworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gTWxtZUhhcmRUcmFuc21pdFR4UmluZyhwQWQsIFF1ZUlkeCwgcFBhY2tldCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxjdWxhdGVzIHRoZSBkdXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byB0cmFuc21pdCBvdXQgZnJhbWVzCisJd2l0aCBnaXZlbiBzaXplIGFuZCBzcGVjaWZpZWQgcmF0ZS4KKworCUFyZ3VtZW50czoKKwkJcFR4RAkJUG9pbnRlciB0byB0cmFuc21pdCBkZXNjcmlwdG9yCisJCUFjawkJU2V0dGluZyBmb3IgQWNrIHJlcXVpcmVtZW50IGJpdAorCQlGcmFnbWVudAlTZXR0aW5nIGZvciBGcmFnbWVudCBiaXQKKwkJUmV0cnlNb2RlCVNldHRpbmcgZm9yIHJldHJ5IG1vZGUKKwkJSWZzCQlTZXR0aW5nIGZvciBJRlMgZ2FwCisJCVJhdGUJCVNldHRpbmcgZm9yIHRyYW5zbWl0IHJhdGUKKwkJU2VydmljZQkJU2V0dGluZyBmb3Igc2VydmljZQorCQlMZW5ndGgJCUZyYW1lIGxlbmd0aAorCQlUeFByZWFtYmxlCVNob3J0IG9yIExvbmcgcHJlYW1ibGUgd2hlbiB1c2luZyBDQ0sgcmF0ZXMKKwkJUXVlSWR4IC0gMC0zLCBhY2NvcmRpbmcgdG8gODAyLjExZS9kNC40IEp1bmUvMjAwMworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QV3JpdGVUeERlc2NyaXB0b3Ioc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X3R4ZCAqIHBUeEQsCisJCQkgICBJTiBCT09MRUFOIGJXSVYsIHU4IFF1ZXVlU0VMKQoreworCS8qICovCisJLyogQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuICovCisJLyogVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzICovCisJLyogKi8KKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCisJcFR4RC0+V0lWID0gKGJXSVYpID8gMSA6IDA7CisJcFR4RC0+UVNFTCA9IChRdWV1ZVNFTCk7CisJLypSVDI4NjBjPz8gIGZpeGVkIHVzaW5nIEVEQ0EgcXVldWUgZm9yIHRlc3QuLi4gIFdlIGRvdWJ0IFF1ZXVlMSBoYXMgcHJvYmxlbS4gIDIwMDYtMDktMjYgSmFuICovCisJLypwVHhELT5RU0VMPSBGSUZPX0VEQ0E7ICovCisJcFR4RC0+RE1BRE9ORSA9IDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhX3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNTZjMmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV91c2IuYwpAQCAtMCwwICsxLDk1MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvKgorICAgQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgbXVzdCBiZSBVU0ItZGVwZW5kZWQsIG9yIHlvdSBzaG91bGQgb3V0IHlvdXIgZnVuY3Rpb24KKwlpbiBvdGhlciBmaWxlcy4KKworKi8KKworI2lmZGVmIFJUTVBfTUFDX1VTQgorCisjaW5jbHVkZQkiLi4vcnRfY29uZmlnLmgiCisKKy8qCisJV2UgY2FuIGRvIGNvcHkgdGhlIGZyYW1lIGludG8gcFR4Q29udGV4dCB3aGVuIG1hdGNoIGZvbGxvd2luZyBjb25kaXRpb25zLgorCQk9PgorCQk9PgorCQk9PgorKi8KK3N0YXRpYyBpbmxpbmUgaW50IFJ0bXBVU0JDYW5Eb1dyaXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJICAgIHU4IFF1ZUlkeCwKKwkJCQkJICAgIHN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQpCit7CisJaW50IGNhbldyaXRlID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCisJaWYgKCgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSA8CisJICAgICBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pCisJICAgICYmIChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyBMT0NBTF9UWEJVRl9TSVpFKSA+CisJICAgIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSdG1wVVNCQ2FuRG9Xcml0ZSBjMSFcbiIpKTsKKwkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsCisJCQkJICAgIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgUXVlSWR4KSk7CisJfSBlbHNlIGlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID09IDgpCisJCSAgICYmIChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPCBMT0NBTF9UWEJVRl9TSVpFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSdG1wVVNCQ2FuRG9Xcml0ZSBjMiFcbiIpKTsKKwkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsCisJCQkJICAgIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgUXVlSWR4KSk7CisJfSBlbHNlIGlmIChwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IFRSVUUpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUnRtcFVTQkNhbkRvV3JpdGUgYzMhXG4iKSk7CisJfSBlbHNlIHsKKwkJY2FuV3JpdGUgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKworCXJldHVybiBjYW5Xcml0ZTsKK30KKwordTE2IFJ0bXBVU0JfV3JpdGVTdWJUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgIElOIEJPT0xFQU4gYklzTGFzdCwgdTE2ICogRnJlZU51bWJlcikKK3sKKworCS8qIER1bW15IGZ1bmN0aW9uLiBTaG91bGQgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiAqLworCXJldHVybiAwOworCit9CisKK3UxNiBSdG1wVVNCX1dyaXRlRnJhZ1R4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgICB1OCBmcmFnTnVtLCB1MTYgKiBGcmVlTnVtYmVyKQoreworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CisJdTE2IGh3SGRyTGVuOwkvKiBUaGUgaHdIZHJMZW4gY29uc2lzdCBvZiA4MDIuMTEgaGVhZGVyIGxlbmd0aCBwbHVzIHRoZSBoZWFkZXIgcGFkZGluZyBsZW5ndGguICovCisJdTMyIGZpbGxPZmZzZXQ7CisJc3RydWN0IHJ0X3R4aW5mbyAqcFR4SW5mbzsKKwlzdHJ1Y3QgcnRfdHh3aSAqcFR4V0k7CisJdTggKnBXaXJlbGVzc1BhY2tldCA9IE5VTEw7CisJdTggUXVlSWR4OworCWludCBTdGF0dXM7CisJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKKwl1MzIgVVNCRE1BcGt0TGVuID0gMCwgRE1BSGRyTGVuLCBwYWRkaW5nOworCUJPT0xFQU4gVHhRTGFzdFJvdW5kID0gRkFMU0U7CisKKwkvKiAqLworCS8qIGdldCBUeCBSaW5nIFJlc291cmNlICYgRG1hIEJ1ZmZlciBhZGRyZXNzICovCisJLyogKi8KKwlRdWVJZHggPSBwVHhCbGstPlF1ZUlkeDsKKwlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbUXVlSWR4XTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCWZpbGxPZmZzZXQgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisKKwlpZiAoZnJhZ051bSA9PSAwKSB7CisJCS8qIENoZWNrIGlmIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGlzIGJ1bGstb3V0IGJhdGNoLiAqLworCQlTdGF0dXMgPSBSdG1wVVNCQ2FuRG9Xcml0ZShwQWQsIFF1ZUlkeCwgcEhUVFhDb250ZXh0KTsKKwkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gVFJVRTsKKworCQkJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgOCBieXRlcyBwYWRkaW5nLiAqLworCQkJaWYgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09CisJCQkgICAgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpIHsKKwkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICs9IDg7CisJCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICs9IDg7CisJCQkJZmlsbE9mZnNldCArPSA4OworCQkJfQorCQkJcFR4QmxrLT5Qcml2ID0gMDsKKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0KKwkJCSAgICBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisJCX0gZWxzZSB7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sCisJCQkJCUlycUZsYWdzKTsKKworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwKKwkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJcmV0dXJuIChTdGF0dXMpOworCQl9CisJfSBlbHNlIHsKKwkJLyogRm9yIHN1Yi1zZXF1ZW50IGZyYW1lcyBvZiB0aGlzIGJ1bGstb3V0IGJhdGNoLiBKdXN0IGNvcHkgaXQgdG8gb3VyIGJ1bGstb3V0IGJ1ZmZlci4gKi8KKwkJU3RhdHVzID0KKwkJICAgICgocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PQorCQkgICAgICBUUlVFKSA/IE5ESVNfU1RBVFVTX1NVQ0NFU1MgOiBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQlmaWxsT2Zmc2V0ICs9IHBUeEJsay0+UHJpdjsKKwkJfSBlbHNlIHsKKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwKKwkJCQkJSXJxRmxhZ3MpOworCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LAorCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm4gKFN0YXR1cyk7CisJCX0KKwl9CisKKwlOZGlzWmVyb01lbW9yeSgodTggKikoJnBUeEJsay0+SGVhZGVyQnVmWzBdKSwgVFhJTkZPX1NJWkUpOworCXBUeEluZm8gPSAoc3RydWN0IHJ0X3R4aW5mbyAqKSgmcFR4QmxrLT5IZWFkZXJCdWZbMF0pOworCXBUeFdJID0gKHN0cnVjdCBydF90eHdpICopICgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKTsKKworCXBXaXJlbGVzc1BhY2tldCA9CisJICAgICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XTsKKworCS8qIGNvcHkgVFhXSSArIFdMQU4gSGVhZGVyICsgTExDIGludG8gRE1BIEhlYWRlciBCdWZmZXIgKi8KKwkvKmh3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsgKi8KKwlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOworCisJLyogQnVpbGQgb3VyIFVSQiBmb3IgVVNCRCAqLworCURNQUhkckxlbiA9IFRYV0lfU0laRSArIGh3SGRyTGVuOworCVVTQkRNQXBrdExlbiA9IERNQUhkckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOworCXBhZGRpbmcgPSAoNCAtIChVU0JETUFwa3RMZW4gJSA0KSkgJiAweDAzOwkvKiByb3VuZCB1cCB0byA0IGJ5dGUgYWxpZ25tZW50ICovCisJVVNCRE1BcGt0TGVuICs9IHBhZGRpbmc7CisKKwlwVHhCbGstPlByaXYgKz0gKFRYSU5GT19TSVpFICsgVVNCRE1BcGt0TGVuKTsKKworCS8qIEZvciBUeEluZm8sIHRoZSBsZW5ndGggb2YgVVNCRE1BcGt0TGVuID0gVFhXSV9TSVpFICsgODAyLjExIGhlYWRlciArIHBheWxvYWQgKi8KKwlSVE1QV3JpdGVUeEluZm8ocEFkLCBwVHhJbmZvLCAodTE2KShVU0JETUFwa3RMZW4pLCBGQUxTRSwgRklGT19FRENBLAorCQkJRkFMU0UgLypOZXh0VmFsaWQgKi8gLCBGQUxTRSk7CisKKwlpZiAoZnJhZ051bSA9PSBwVHhCbGstPlRvdGFsRnJhZ051bSkgeworCQlwVHhJbmZvLT5VU0JETUFUeGJ1cnN0ID0gMDsKKwkJaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyBwVHhCbGstPlByaXYgKyAzOTA2KSA+CisJCSAgICBNQVhfVFhCVUxLX0xJTUlUKSB7CisJCQlwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9IDE7CisJCQlUeFFMYXN0Um91bmQgPSBUUlVFOworCQl9CisJfSBlbHNlIHsKKwkJcFR4SW5mby0+VVNCRE1BVHhidXJzdCA9IDE7CisJfQorCisJTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPkhlYWRlckJ1ZiwKKwkJICAgICAgIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOworCXBXaXJlbGVzc1BhY2tldCArPSAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgKz0gKFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOworCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKKwlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+cFNyY0J1ZkRhdGEsIHBUeEJsay0+U3JjQnVmTGVuKTsKKworCS8qICAgICAgWmVybyB0aGUgbGFzdCBwYWRkaW5nLiAqLworCXBXaXJlbGVzc1BhY2tldCArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwlOZGlzWmVyb01lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBhZGRpbmcgKyA4KTsKKworCWlmIChmcmFnTnVtID09IHBUeEJsay0+VG90YWxGcmFnTnVtKSB7CisJCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCQkvKiBVcGRhdGUgdGhlIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbi4gMzkwNiB1c2VkIHRvIHByZXZlbnQgdGhlIE5leHRCdWxrT3V0IGlzIGEgQS1SQUxJTksvQS1NU0RVIEZyYW1lLiAqLworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gcFR4QmxrLT5Qcml2OworCQlpZiAoVHhRTGFzdFJvdW5kID09IFRSVUUpCisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSA4OworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCQkvKiBGaW5hbGx5LCBzZXQgYkN1cldyaXRpbmcgYXMgRkFMU0UgKi8KKwkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IEZBTFNFOworCisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJCS8qIHN1Y2NlZWQgYW5kIHJlbGVhc2UgdGhlIHNrYiBidWZmZXIgKi8KKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJfQorCisJcmV0dXJuIChTdGF0dXMpOworCit9CisKK3UxNiBSdG1wVVNCX1dyaXRlU2luZ2xlVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICAgICBJTiBCT09MRUFOIGJJc0xhc3QsCisJCQkJICAgICB1MTYgKiBGcmVlTnVtYmVyKQoreworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CisJdTE2IGh3SGRyTGVuOworCXUzMiBmaWxsT2Zmc2V0OworCXN0cnVjdCBydF90eGluZm8gKnBUeEluZm87CisJc3RydWN0IHJ0X3R4d2kgKnBUeFdJOworCXU4ICpwV2lyZWxlc3NQYWNrZXQ7CisJdTggUXVlSWR4OworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisJaW50IFN0YXR1czsKKwl1MzIgVVNCRE1BcGt0TGVuID0gMCwgRE1BSGRyTGVuLCBwYWRkaW5nOworCUJPT0xFQU4gYlR4UUxhc3RSb3VuZCA9IEZBTFNFOworCisJLyogRm9yIFVTQiwgZGlkbid0IG5lZWQgUENJX01BUF9TSU5HTEUoKSAqLworCS8qU3JjQnVmUEEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIChjaGFyICopIHBUeEJsay0+cFNyY0J1ZkRhdGEsIHBUeEJsay0+U3JjQnVmTGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsgKi8KKworCS8qICovCisJLyogZ2V0IFR4IFJpbmcgUmVzb3VyY2UgJiBEbWEgQnVmZmVyIGFkZHJlc3MgKi8KKwkvKiAqLworCVF1ZUlkeCA9IHBUeEJsay0+UXVlSWR4OworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCWZpbGxPZmZzZXQgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisKKwkvKiBDaGVjayByaW5nIGZ1bGwuICovCisJU3RhdHVzID0gUnRtcFVTQkNhbkRvV3JpdGUocEFkLCBRdWVJZHgsIHBIVFRYQ29udGV4dCk7CisJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBUUlVFOworCisJCXBUeEluZm8gPSAoc3RydWN0IHJ0X3R4aW5mbyAqKSgmcFR4QmxrLT5IZWFkZXJCdWZbMF0pOworCQlwVHhXSSA9IChzdHJ1Y3QgcnRfdHh3aSAqKSAoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSk7CisKKwkJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgOCBieXRlcyBwYWRkaW5nLiAqLworCQlpZiAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPT0KKwkJICAgICBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKSB7CisJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICs9IDg7CisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gODsKKwkJCWZpbGxPZmZzZXQgKz0gODsKKwkJfQorCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCQlwV2lyZWxlc3NQYWNrZXQgPQorCQkgICAgJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLgorCQkgICAgV2lyZWxlc3NQYWNrZXRbZmlsbE9mZnNldF07CisKKwkJLyogY29weSBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlciAqLworCQkvKmh3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsgKi8KKwkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCQkvKiBCdWlsZCBvdXIgVVJCIGZvciBVU0JEICovCisJCURNQUhkckxlbiA9IFRYV0lfU0laRSArIGh3SGRyTGVuOworCQlVU0JETUFwa3RMZW4gPSBETUFIZHJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKKwkJcGFkZGluZyA9ICg0IC0gKFVTQkRNQXBrdExlbiAlIDQpKSAmIDB4MDM7CS8qIHJvdW5kIHVwIHRvIDQgYnl0ZSBhbGlnbm1lbnQgKi8KKwkJVVNCRE1BcGt0TGVuICs9IHBhZGRpbmc7CisKKwkJcFR4QmxrLT5Qcml2ID0gKFRYSU5GT19TSVpFICsgVVNCRE1BcGt0TGVuKTsKKworCQkvKiBGb3IgVHhJbmZvLCB0aGUgbGVuZ3RoIG9mIFVTQkRNQXBrdExlbiA9IFRYV0lfU0laRSArIDgwMi4xMSBoZWFkZXIgKyBwYXlsb2FkICovCisJCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sICh1MTYpKFVTQkRNQXBrdExlbiksIEZBTFNFLAorCQkJCUZJRk9fRURDQSwgRkFMU0UgLypOZXh0VmFsaWQgKi8gLCBGQUxTRSk7CisKKwkJaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAzOTA2ICsgcFR4QmxrLT5Qcml2KSA+CisJCSAgICBNQVhfVFhCVUxLX0xJTUlUKSB7CisJCQlwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9IDE7CisJCQliVHhRTGFzdFJvdW5kID0gVFJVRTsKKwkJfQorCQlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+SGVhZGVyQnVmLAorCQkJICAgICAgIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOworCQlwV2lyZWxlc3NQYWNrZXQgKz0gKFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOworCisJCS8qIFdlIHVubG9jayBpdCBoZXJlIHRvIHByZXZlbnQgdGhlIGZpcnN0IDggYnl0ZXMgbWF5YmUgb3Zlci13cml0ZWQgaXNzdWUuICovCisJCS8qICAgICAgMS4gRmlyc3Qgd2UgZ290IEN1cldyaXRlUG9zaXRpb24gYnV0IHRoZSBmaXJzdCA4IGJ5dGVzIHN0aWxsIG5vdCB3cml0ZSB0byB0aGUgcFR4Y29udGV4dC4gKi8KKwkJLyogICAgICAyLiBBbiBpbnRlcnJ1cHQgYnJlYWsgb3VyIHJvdXRpbmUgYW5kIGhhbmRsZSBidWxrLW91dCBjb21wbGV0ZS4gKi8KKwkJLyogICAgICAzLiBJbiB0aGUgYnVsay1vdXQgY29tcGxsZXRlLCBpdCBuZWVkIHRvIGRvIGFub3RoZXIgYnVsay1vdXQsICovCisJCS8qICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBFTmV4dEJ1bGtPdXRQb3NpdGlvbiBpcyBqdXN0IHRoZSBzYW1lIGFzIEN1cldyaXRlUG9zaXRpb24sIGl0IHdpbGwgc2F2ZSB0aGUgZmlyc3QgOCBieXRlcyBmcm9tIEN1cldyaXRlUG9zaXRpb24sICovCisJCS8qICAgICAgICAgICAgICAgICAgICAgIGJ1dCB0aGUgcGF5bG9hZCBzdGlsbCBub3QgY29weWVkLiB0aGUgcFR4Q29udGV4dC0+U2F2ZWRQYWRbXSB3aWxsIHNhdmUgYXMgYWxsemVyby4gYW5kIHNldCB0aGUgYkNvcHlQYWQgPSBUUlVFLiAqLworCQkvKiAgICAgIDQuIEludGVycnVwdCBjb21wbGV0ZS4gKi8KKwkJLyogIDUuIE91ciBpbnRlcnJ1cHRlZCByb3V0aW5lIGdvIGJhY2sgYW5kIGZpbGwgdGhlIGZpcnN0IDggYnl0ZXMgdG8gcFR4Q29udGV4dC4gKi8KKwkJLyogICAgICA2LiBOZXh0IHRpbWUgd2hlbiBkbyBidWxrLW91dCwgaXQgZm91bmQgdGhlIGJDb3B5UGFkPT1UUlVFIGFuZCB3aWxsIGNvcHkgdGhlIFNhdmVkUGFkW10gdG8gcFR4Q29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbi4gKi8KKwkJLyogICAgICAgICAgICAgIGFuZCB0aGUgcGFja2V0IHdpbGwgd3JvbmcuICovCisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zICs9CisJCSAgICAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5wU3JjQnVmRGF0YSwKKwkJCSAgICAgICBwVHhCbGstPlNyY0J1Zkxlbik7CisJCXBXaXJlbGVzc1BhY2tldCArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwkJTmRpc1plcm9NZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwYWRkaW5nICsgOCk7CisKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSBwVHhCbGstPlByaXY7CisJCWlmIChiVHhRTGFzdFJvdW5kKQorCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID0gODsKKwkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisKKwkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IEZBTFNFOworCX0KKworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJLyogc3VjY2VlZCBhbmQgcmVsZWFzZSB0aGUgc2tiIGJ1ZmZlciAqLworCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCisJcmV0dXJuIChTdGF0dXMpOworCit9CisKK3UxNiBSdG1wVVNCX1dyaXRlTXVsdGlUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJCSAgICB1OCBmcmFtZU51bSwgdTE2ICogRnJlZU51bWJlcikKK3sKKwlzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqcEhUVFhDb250ZXh0OworCXUxNiBod0hkckxlbjsJLyogVGhlIGh3SGRyTGVuIGNvbnNpc3Qgb2YgODAyLjExIGhlYWRlciBsZW5ndGggcGx1cyB0aGUgaGVhZGVyIHBhZGRpbmcgbGVuZ3RoLiAqLworCXUzMiBmaWxsT2Zmc2V0OworCXN0cnVjdCBydF90eGluZm8gKnBUeEluZm87CisJc3RydWN0IHJ0X3R4d2kgKnBUeFdJOworCXU4ICpwV2lyZWxlc3NQYWNrZXQgPSBOVUxMOworCXU4IFF1ZUlkeDsKKwlpbnQgU3RhdHVzOworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisJLyp1MzIgICAgICAgICAgICAgICAgICAgICAgICBVU0JETUFwa3RMZW4gPSAwLCBETUFIZHJMZW4sIHBhZGRpbmc7ICovCisKKwkvKiAqLworCS8qIGdldCBUeCBSaW5nIFJlc291cmNlICYgRG1hIEJ1ZmZlciBhZGRyZXNzICovCisJLyogKi8KKwlRdWVJZHggPSBwVHhCbGstPlF1ZUlkeDsKKwlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbUXVlSWR4XTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCWlmIChmcmFtZU51bSA9PSAwKSB7CisJCS8qIENoZWNrIGlmIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGlzIGJ1bGstb3V0IGJhdGNoLiAqLworCQlTdGF0dXMgPSBSdG1wVVNCQ2FuRG9Xcml0ZShwQWQsIFF1ZUlkeCwgcEhUVFhDb250ZXh0KTsKKwkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gVFJVRTsKKworCQkJcFR4SW5mbyA9IChzdHJ1Y3QgcnRfdHhpbmZvICopKCZwVHhCbGstPkhlYWRlckJ1ZlswXSk7CisJCQlwVHhXSSA9IChzdHJ1Y3QgcnRfdHh3aSAqKSAoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSk7CisKKwkJCS8qIFJlc2VydmUgc3BhY2UgZm9yIDggYnl0ZXMgcGFkZGluZy4gKi8KKwkJCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PQorCQkJICAgICBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKSB7CisKKwkJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gODsKKwkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICs9IDg7CisJCQl9CisJCQlmaWxsT2Zmc2V0ID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPQorCQkJICAgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCQkJcFdpcmVsZXNzUGFja2V0ID0KKwkJCSAgICAmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuCisJCQkgICAgV2lyZWxlc3NQYWNrZXRbZmlsbE9mZnNldF07CisKKwkJCS8qICovCisJCQkvKiBDb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyICovCisJCQkvKiAqLworCQkJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1TRFVfRlJBTUUpCisJCQkJLypod0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFELCA0KStMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOyAqLworCQkJCWh3SGRyTGVuID0KKwkJCQkgICAgcFR4QmxrLT5NcGR1SGVhZGVyTGVuIC0KKwkJCQkgICAgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArCisJCQkJICAgIHBUeEJsay0+SGRyUGFkTGVuICsKKwkJCQkgICAgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKKwkJCWVsc2UgaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfUkFMSU5LX0ZSQU1FKQorCQkJCS8qaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxELCA0KStMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQ7ICovCisJCQkJaHdIZHJMZW4gPQorCQkJCSAgICBwVHhCbGstPk1wZHVIZWFkZXJMZW4gLQorCQkJCSAgICBMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQgKworCQkJCSAgICBwVHhCbGstPkhkclBhZExlbiArCisJCQkJICAgIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRDsKKwkJCWVsc2UKKwkJCQkvKmh3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsgKi8KKwkJCQlod0hkckxlbiA9CisJCQkJICAgIHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOworCisJCQkvKiBVcGRhdGUgdGhlIHBUeEJsay0+UHJpdi4gKi8KKwkJCXBUeEJsay0+UHJpdiA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW47CisKKwkJCS8qICAgICAgcFR4SW5mby0+VVNCRE1BcGt0TGVuIG5vdyBqdXN0IGEgdGVtcCB2YWx1ZSBhbmQgd2lsbCB0byBjb3JyZWN0IGxhdHRlci4gKi8KKwkJCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sICh1MTYpKHBUeEJsay0+UHJpdiksCisJCQkJCUZBTFNFLCBGSUZPX0VEQ0EsIEZBTFNFIC8qTmV4dFZhbGlkICovICwKKwkJCQkJRkFMU0UpOworCisJCQkvKiBDb3B5IGl0LiAqLworCQkJTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPkhlYWRlckJ1ZiwKKwkJCQkgICAgICAgcFR4QmxrLT5Qcml2KTsKKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zICs9IHBUeEJsay0+UHJpdjsKKwkJCXBXaXJlbGVzc1BhY2tldCArPSBwVHhCbGstPlByaXY7CisJCX0KKwl9IGVsc2UgewkJLyogRm9yIHN1Yi1zZXF1ZW50IGZyYW1lcyBvZiB0aGlzIGJ1bGstb3V0IGJhdGNoLiBKdXN0IGNvcHkgaXQgdG8gb3VyIGJ1bGstb3V0IGJ1ZmZlci4gKi8KKworCQlTdGF0dXMgPQorCQkgICAgKChwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09CisJCSAgICAgIFRSVUUpID8gTkRJU19TVEFUVVNfU1VDQ0VTUyA6IE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWZpbGxPZmZzZXQgPQorCQkJICAgIChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyBwVHhCbGstPlByaXYpOworCQkJcFdpcmVsZXNzUGFja2V0ID0KKwkJCSAgICAmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuCisJCQkgICAgV2lyZWxlc3NQYWNrZXRbZmlsbE9mZnNldF07CisKKwkJCS8qaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47ICovCisJCQlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+SGVhZGVyQnVmLAorCQkJCSAgICAgICBwVHhCbGstPk1wZHVIZWFkZXJMZW4pOworCQkJcFdpcmVsZXNzUGFja2V0ICs9IChwVHhCbGstPk1wZHVIZWFkZXJMZW4pOworCQkJcFR4QmxrLT5Qcml2ICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKwkJfSBlbHNlIHsJLyogSXQgc2hvdWxkIG5vdCBoYXBwZW5lZCBub3cgdW5sZXNzIHdlIGFyZSBnb2luZyB0byBzaHV0ZG93bi4gKi8KKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIldyaXRlTXVsdGlUeFJlc291cmNlKCk6YkN1cldyaXRpbmcgaXMgRkFMU0Ugd2hlbiBoYW5kbGUgc3ViLXNlcXVlbnQgZnJhbWVzLlxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJfQorCX0KKworCS8qIFdlIHVubG9jayBpdCBoZXJlIHRvIHByZXZlbnQgdGhlIGZpcnN0IDggYnl0ZXMgbWF5YmUgb3Zlci13cml0ZSBpc3N1ZS4gKi8KKwkvKiAgICAgIDEuIEZpcnN0IHdlIGdvdCBDdXJXcml0ZVBvc2l0aW9uIGJ1dCB0aGUgZmlyc3QgOCBieXRlcyBzdGlsbCBub3Qgd3JpdGUgdG8gdGhlIHBUeENvbnRleHQuICovCisJLyogICAgICAyLiBBbiBpbnRlcnJ1cHQgYnJlYWsgb3VyIHJvdXRpbmUgYW5kIGhhbmRsZSBidWxrLW91dCBjb21wbGV0ZS4gKi8KKwkvKiAgICAgIDMuIEluIHRoZSBidWxrLW91dCBjb21wbGxldGUsIGl0IG5lZWQgdG8gZG8gYW5vdGhlciBidWxrLW91dCwgKi8KKwkvKiAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgRU5leHRCdWxrT3V0UG9zaXRpb24gaXMganVzdCB0aGUgc2FtZSBhcyBDdXJXcml0ZVBvc2l0aW9uLCBpdCB3aWxsIHNhdmUgdGhlIGZpcnN0IDggYnl0ZXMgZnJvbSBDdXJXcml0ZVBvc2l0aW9uLCAqLworCS8qICAgICAgICAgICAgICAgICAgICAgIGJ1dCB0aGUgcGF5bG9hZCBzdGlsbCBub3QgY29weWVkLiB0aGUgcFR4Q29udGV4dC0+U2F2ZWRQYWRbXSB3aWxsIHNhdmUgYXMgYWxsemVyby4gYW5kIHNldCB0aGUgYkNvcHlQYWQgPSBUUlVFLiAqLworCS8qICAgICAgNC4gSW50ZXJydXB0IGNvbXBsZXRlLiAqLworCS8qICA1LiBPdXIgaW50ZXJydXB0ZWQgcm91dGluZSBnbyBiYWNrIGFuZCBmaWxsIHRoZSBmaXJzdCA4IGJ5dGVzIHRvIHBUeENvbnRleHQuICovCisJLyogICAgICA2LiBOZXh0IHRpbWUgd2hlbiBkbyBidWxrLW91dCwgaXQgZm91bmQgdGhlIGJDb3B5UGFkPT1UUlVFIGFuZCB3aWxsIGNvcHkgdGhlIFNhdmVkUGFkW10gdG8gcFR4Q29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbi4gKi8KKwkvKiAgICAgICAgICAgICAgYW5kIHRoZSBwYWNrZXQgd2lsbCB3cm9uZy4gKi8KKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIldyaXRlTXVsdGlUeFJlc291cmNlOiBDV1BvcyA9ICVsZCwgTkJPdXRQb3MgPSAlbGQuXG4iLAorCQkJICBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sCisJCQkgIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikpOworCQlnb3RvIGRvbmU7CisJfQorCS8qIENvcHkgdGhlIGZyYW1lIGNvbnRlbnQgaW50byBETUEgYnVmZmVyIGFuZCB1cGRhdGUgdGhlIHBUeEJsay0+UHJpdiAqLworCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5wU3JjQnVmRGF0YSwgcFR4QmxrLT5TcmNCdWZMZW4pOworCXBXaXJlbGVzc1BhY2tldCArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwlwVHhCbGstPlByaXYgKz0gcFR4QmxrLT5TcmNCdWZMZW47CisKK2RvbmU6CisJLyogUmVsZWFzZSB0aGUgc2tiIGJ1ZmZlciBoZXJlICovCisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisKKwlyZXR1cm4gKFN0YXR1cyk7CisKK30KKwordm9pZCBSdG1wVVNCX0ZpbmFsV3JpdGVUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgIHUxNiB0b3RhbE1QRFVTaXplLCB1MTYgVHhJZHgpCit7CisJdTggUXVlSWR4OworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CisJdTMyIGZpbGxPZmZzZXQ7CisJc3RydWN0IHJ0X3R4aW5mbyAqcFR4SW5mbzsKKwlzdHJ1Y3QgcnRfdHh3aSAqcFR4V0k7CisJdTMyIFVTQkRNQXBrdExlbiwgcGFkZGluZzsKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzOworCXU4ICpwV2lyZWxlc3NQYWNrZXQ7CisKKwlRdWVJZHggPSBwVHhCbGstPlF1ZUlkeDsKKwlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbUXVlSWR4XTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCWlmIChwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IFRSVUUpIHsKKwkJZmlsbE9mZnNldCA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKwkJaWYgKCgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PQorCQkgICAgICBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pCisJCSAgICAgfHwgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uIC0gOCkgPT0KKwkJCSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQorCQkgICAgJiYgKHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkID09IFRSVUUpKQorCQkJcFdpcmVsZXNzUGFja2V0ID0gKHU4ICopKCZwSFRUWENvbnRleHQtPlNhdmVkUGFkWzBdKTsKKwkJZWxzZQorCQkJcFdpcmVsZXNzUGFja2V0ID0KKwkJCSAgICAodTggKikoJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLgorCQkJCSAgICAgIFdpcmVsZXNzUGFja2V0W2ZpbGxPZmZzZXRdKTsKKworCQkvKiAqLworCQkvKiBVcGRhdGUgVHhJbmZvLT5VU0JETUFwa3RMZW4gLCAqLworCQkvKiAgICAgICAgICAgICAgdGhlIGxlbmd0aCA9IFRYV0lfU0laRSArIDgwMi4xMV9oZHIgKyA4MDIuMTFfaGRyX3BhZCArIHBheWxvYWRfb2ZfYWxsX2JhdGNoX2ZyYW1lcyArIEJ1bGstT3V0LXBhZGRpbmcgKi8KKwkJLyogKi8KKwkJcFR4SW5mbyA9IChzdHJ1Y3QgcnRfdHhpbmZvICopKHBXaXJlbGVzc1BhY2tldCk7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSBidWxrLW91dCBwYWRkaW5nICovCisJCVVTQkRNQXBrdExlbiA9IHBUeEJsay0+UHJpdiAtIFRYSU5GT19TSVpFOworCQlwYWRkaW5nID0gKDQgLSAoVVNCRE1BcGt0TGVuICUgNCkpICYgMHgwMzsJLyogcm91bmQgdXAgdG8gNCBieXRlIGFsaWdubWVudCAqLworCQlVU0JETUFwa3RMZW4gKz0gcGFkZGluZzsKKworCQlwVHhJbmZvLT5VU0JETUFUeFBrdExlbiA9IFVTQkRNQXBrdExlbjsKKworCQkvKiAqLworCQkvKiBVcGRhdGUgVFhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ICwgKi8KKwkJLyogICAgICAgICAgICAgIHRoZSBsZW5ndGggPSA4MDIuMTEgaGVhZGVyICsgcGF5bG9hZF9vZl9hbGxfYmF0Y2hfZnJhbWVzICovCisJCXBUeFdJID0gKHN0cnVjdCBydF90eHdpICopIChwV2lyZWxlc3NQYWNrZXQgKyBUWElORk9fU0laRSk7CisJCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSB0b3RhbE1QRFVTaXplOworCisJCS8qICovCisJCS8qIFVwZGF0ZSB0aGUgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICovCisJCS8qICovCisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSAoVFhJTkZPX1NJWkUgKyBVU0JETUFwa3RMZW4pOworCQlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDM5MDYpID4gTUFYX1RYQlVMS19MSU1JVCkgewkvKiBBZGQgMzkwNiBmb3IgcHJldmVudCB0aGUgTmV4dEJ1bGtPdXQgcGFja2V0IHNpemUgaXMgYSBBLVJBTElOSy9BLU1TRFUgRnJhbWUuICovCisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSA4OworCQkJcFR4SW5mby0+U3dVc2VMYXN0Um91bmQgPSAxOworCQl9CisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCisJCS8qICovCisJCS8qICAgICAgWmVybyB0aGUgbGFzdCBwYWRkaW5nLiAqLworCQkvKiAqLworCQlwV2lyZWxlc3NQYWNrZXQgPQorCQkgICAgKCZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC4KKwkJICAgICBXaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0ICsgcFR4QmxrLT5Qcml2XSk7CisJCU5kaXNaZXJvTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcGFkZGluZyArIDgpOworCisJCS8qIEZpbmFsbHksIHNldCBiQ3VyV3JpdGluZyBhcyBGQUxTRSAqLworCQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gRkFMU0U7CisKKwl9IGVsc2UgewkJLyogSXQgc2hvdWxkIG5vdCBoYXBwZW5lZCBub3cgdW5sZXNzIHdlIGFyZSBnb2luZyB0byBzaHV0ZG93bi4gKi8KKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJGaW5hbFdyaXRlVHhSZXNvdXJjZSgpOmJDdXJXcml0aW5nIGlzIEZBTFNFIHdoZW4gaGFuZGxlIGxhc3QgZnJhbWVzLlxuIikpOworCX0KKworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCit9CisKK3ZvaWQgUnRtcFVTQkRhdGFMYXN0VHhJZHgoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICB1OCBRdWVJZHgsIHUxNiBUeElkeCkKK3sKKwkvKiBETyBub3RoaW5nIGZvciBVU0IuICovCit9CisKKy8qCisJV2hlbiBjYW4gZG8gYnVsay1vdXQ6CisJCTEuIFR4U3dGcmVlSWR4IDwgVFhfUklOR19TSVpFOworCQkJSXQgbWVhbnMgaGFzIGF0IGxlYXN0IG9uZSBSaW5nIGVudGl0eSBpcyByZWFkeSBmb3IgYnVsay1vdXQsIGtpY2sgaXQgb3V0LgorCQkyLiBJZiBUeFN3RnJlZUlkeCA9PSBUWF9SSU5HX1NJWkUKKwkJCUNoZWNrIGlmIHRoZSBDdXJXcml0aW5nIGZsYWcgaXMgRkFMU0UsIGlmIGl0J3MgRkFMU0UsIHdlIGNhbiBkbyBraWNrIG91dC4KKworKi8KK3ZvaWQgUnRtcFVTQkRhdGFLaWNrT3V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywgdTggUXVlSWR4KQoreworCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IFF1ZUlkeCkpOworCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworfQorCisvKgorCU11c3QgYmUgcnVuIGluIEludGVycnVwdCBjb250ZXh0CisJVGhpcyBmdW5jdGlvbiBoYW5kbGUgUlQyODcwIHNwZWNpZmljIFR4RGVzYyBhbmQgY3B1IGluZGV4IHVwZGF0ZSBhbmQga2ljayB0aGUgcGFja2V0IG91dC4KKyAqLworaW50IFJ0bXBVU0JNZ210S2lja091dChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCBRdWVJZHgsCisJCSAgICAgICB2b2lkICpwUGFja2V0LAorCQkgICAgICAgdTggKnBTcmNCdWZWQSwgdTMyIFNyY0J1ZkxlbikKK3sKKwlzdHJ1Y3QgcnRfdHhpbmZvICpwVHhJbmZvOworCXVuc2lnbmVkIGxvbmcgQnVsa091dFNpemU7CisJdTggcGFkTGVuOworCXU4ICpwRGVzdDsKKwl1bnNpZ25lZCBsb25nIFN3SWR4ID0gcEFkLT5NZ210UmluZy5UeENwdUlkeDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcE1MTUVDb250ZXh0ID0KKwkgICAgKHN0cnVjdCBydF90eF9jb250ZXh0ICopcEFkLT5NZ210UmluZy5DZWxsW1N3SWR4XS5BbGxvY1ZhOworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisKKwlwVHhJbmZvID0gKHN0cnVjdCBydF90eGluZm8gKikocFNyY0J1ZlZBKTsKKworCS8qIEJ1aWxkIG91ciBVUkIgZm9yIFVTQkQgKi8KKwlCdWxrT3V0U2l6ZSA9IFNyY0J1ZkxlbjsKKwlCdWxrT3V0U2l6ZSA9IChCdWxrT3V0U2l6ZSArIDMpICYgKH4zKTsKKwlSVE1QV3JpdGVUeEluZm8ocEFkLCBwVHhJbmZvLCAodTE2KShCdWxrT3V0U2l6ZSAtIFRYSU5GT19TSVpFKSwKKwkJCVRSVUUsIEVwVG9RdWV1ZVtNR01UUElQRUlEWF0sIEZBTFNFLCBGQUxTRSk7CisKKwlCdWxrT3V0U2l6ZSArPSA0OwkvKiBBbHdheXMgYWRkIDQgZXh0cmEgYnl0ZXMgYXQgZXZlcnkgcGFja2V0LiAqLworCisJLyogSWYgQnVsa091dFNpemUgaXMgbXVsdGlwbGUgb2YgQnVsa091dE1heFBhY2tldFNpemUsIGFkZCBleHRyYSA0IGJ5dGVzIGFnYWluLiAqLworCWlmICgoQnVsa091dFNpemUgJSBwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplKSA9PSAwKQorCQlCdWxrT3V0U2l6ZSArPSA0OworCisJcGFkTGVuID0gQnVsa091dFNpemUgLSBTcmNCdWZMZW47CisJQVNTRVJUKChwYWRMZW4gPD0gUlRNUF9QS1RfVEFJTF9QQURESU5HKSk7CisKKwkvKiBOb3cgbWVtemVybyBhbGwgZXh0cmEgcGFkZGluZyBieXRlcy4gKi8KKwlwRGVzdCA9ICh1OCAqKShwU3JjQnVmVkEgKyBTcmNCdWZMZW4pOworCXNrYl9wdXQoR0VUX09TX1BLVF9UWVBFKHBQYWNrZXQpLCBwYWRMZW4pOworCU5kaXNaZXJvTWVtb3J5KHBEZXN0LCBwYWRMZW4pOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5NTE1FQnVsa091dExvY2ssIElycUZsYWdzKTsKKworCXBBZC0+TWdtdFJpbmcuQ2VsbFtwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4XS5wTmRpc1BhY2tldCA9IHBQYWNrZXQ7CisJcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9CisJICAgIChzdHJ1Y3QgcnRfdHhfYnVmZmVyICopKEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KSk7CisKKwkvKiBMZW5ndGggaW4gVHhJbmZvIHNob3VsZCBiZSA4IGxlc3MgdGhhbiBidWxrb3V0IHNpemUuICovCisJcE1MTUVDb250ZXh0LT5CdWxrT3V0U2l6ZSA9IEJ1bGtPdXRTaXplOworCXBNTE1FQ29udGV4dC0+SW5Vc2UgPSBUUlVFOworCXBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID0gVFJVRTsKKworCS8qZm9yIGRlYnVnICovCisJLypoZXhfZHVtcCgiUnRtcFVTQk1nbXRLaWNrT3V0IiwgJnBNTE1FQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdLCAocE1MTUVDb250ZXh0LT5CdWxrT3V0U2l6ZSA+IDE2ID8gMTYgOiBwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplKSk7ICovCisKKwkvKnBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsgKi8KKwkvKnBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsgKi8KKworCS8qaWYgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPT0gTUdNVF9SSU5HX1NJWkUpICovCisJLyogICAgICBuZWVkS2lja091dCA9IFRSVUU7ICovCisKKwkvKiBEZWNyZWFzZSB0aGUgVHhTd0ZyZWVJZHggYW5kIEluY3JlYXNlIHRoZSBUWF9DVFhfSURYICovCisJcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeC0tOworCUlOQ19SSU5HX0lOREVYKHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgsIE1HTVRfUklOR19TSVpFKTsKKworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5NTE1FQnVsa091dExvY2ssIElycUZsYWdzKTsKKworCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfTUxNRSk7CisJLyppZiAobmVlZEtpY2tPdXQpICovCisJUlRVU0JLaWNrQnVsa091dChwQWQpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgUnRtcFVTQk51bGxGcmFtZUtpY2tPdXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1OCBRdWVJZHgsCisJCQkgICAgIHU4ICogcE51bGxGcmFtZSwgdTMyIGZyYW1lTGVuKQoreworCWlmIChwQWQtPk51bGxDb250ZXh0LkluVXNlID09IEZBTFNFKSB7CisJCXN0cnVjdCBydF90eF9jb250ZXh0ICpwTnVsbENvbnRleHQ7CisJCXN0cnVjdCBydF90eGluZm8gKnBUeEluZm87CisJCXN0cnVjdCBydF90eHdpICogcFR4V0k7CisJCXU4ICpwV2lyZWxlc3NQa3Q7CisKKwkJcE51bGxDb250ZXh0ID0gJihwQWQtPk51bGxDb250ZXh0KTsKKworCQkvKiBTZXQgdGhlIGluIHVzZSBiaXQgKi8KKwkJcE51bGxDb250ZXh0LT5JblVzZSA9IFRSVUU7CisJCXBXaXJlbGVzc1BrdCA9CisJCSAgICAodTggKikmIHBOdWxsQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLgorCQkgICAgV2lyZWxlc3NQYWNrZXRbMF07CisKKwkJUlRNUFplcm9NZW1vcnkoJnBXaXJlbGVzc1BrdFswXSwgMTAwKTsKKwkJcFR4SW5mbyA9IChzdHJ1Y3QgcnRfdHhpbmZvICopJiBwV2lyZWxlc3NQa3RbMF07CisJCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sCisJCQkJKHUxNikoc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSArIFRYV0lfU0laRSksCisJCQkJVFJVRSwgRXBUb1F1ZXVlW01HTVRQSVBFSURYXSwgRkFMU0UsIEZBTFNFKTsKKwkJcFR4SW5mby0+UVNFTCA9IEZJRk9fRURDQTsKKwkJcFR4V0kgPSAoc3RydWN0IHJ0X3R4d2kgKikgJiBwV2lyZWxlc3NQa3RbVFhJTkZPX1NJWkVdOworCQlSVE1QV3JpdGVUeFdJKHBBZCwgcFR4V0ksIEZBTFNFLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBUUlVFLAorCQkJICAgICAgRkFMU0UsIDAsIEJTU0lEX1dDSUQsIChzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpKSwgMCwKKwkJCSAgICAgIDAsICh1OClwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLAorCQkJICAgICAgSUZTX0hUVFhPUCwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOworCisJCVJUTVBNb3ZlTWVtb3J5KCZwV2lyZWxlc3NQa3RbVFhXSV9TSVpFICsgVFhJTkZPX1NJWkVdLAorCQkJICAgICAgICZwQWQtPk51bGxGcmFtZSwgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSk7CisJCXBBZC0+TnVsbENvbnRleHQuQnVsa091dFNpemUgPQorCQkgICAgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBzaXplb2YocEFkLT5OdWxsRnJhbWUpICsgNDsKKworCQkvKiBGaWxsIG91dCBmcmFtZSBsZW5ndGggaW5mb3JtYXRpb24gZm9yIGdsb2JhbCBCdWxrIG91dCBhcmJpdG9yICovCisJCS8qcE51bGxDb250ZXh0LT5CdWxrT3V0U2l6ZSA9IFRyYW5zZmVyQnVmZmVyTGVuZ3RoOyAqLworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlNZTkMgLSBzZW5kIE5VTEwgRnJhbWUgQCVkIE1icHMuLi5cbiIsCisJCQkgIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5UeFJhdGVdKSk7CisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OVUxMKTsKKworCQkvKiBLaWNrIGJ1bGsgb3V0ICovCisJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKwl9CisKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBHZXQgYSByZWNlaXZlZCBwYWNrZXQuCisKK0FyZ3VtZW50czoKKwlwQWQJCQkJCWRldmljZSBjb250cm9sIGJsb2NrCisJcFNhdmVSeEQJCQlyZWNlaXZlIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24KKwkqcGJSZXNjaGVkdWxlCQluZWVkIHJlc2NoZWR1bGUgZmxhZworCSpwUnhQZW5kaW5nCQkJcGVuZGluZyByZWNlaXZlZCBwYWNrZXQgZmxhZworCitSZXR1cm4gVmFsdWU6CisgICAgdGhlIHJlY2lldmVkIHBhY2tldAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCAqR2V0UGFja2V0RnJvbVJ4UmluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIE9VVCBQUlQyOFhYX1JYRF9TVFJVQyBwU2F2ZVJ4RCwKKwkJCQkgT1VUIEJPT0xFQU4gKiBwYlJlc2NoZWR1bGUsCisJCQkJIElOIHUzMiAqIHBSeFBlbmRpbmcpCit7CisJc3RydWN0IHJ0X3J4X2NvbnRleHQgKnBSeENvbnRleHQ7CisJdm9pZCAqcFNrYjsKKwl1OCAqcERhdGE7CisJdW5zaWduZWQgbG9uZyBUaGlzRnJhbWVMZW47CisJdW5zaWduZWQgbG9uZyBSeEJ1ZmZlckxlbmd0aDsKKwlzdHJ1Y3QgcnRfcnh3aSAqIHBSeFdJOworCisJcFJ4Q29udGV4dCA9ICZwQWQtPlJ4Q29udGV4dFtwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleF07CisJaWYgKChwUnhDb250ZXh0LT5SZWFkYWJsZSA9PSBGQUxTRSkgfHwgKHBSeENvbnRleHQtPkluVXNlID09IFRSVUUpKQorCQlyZXR1cm4gTlVMTDsKKworCVJ4QnVmZmVyTGVuZ3RoID0gcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0IC0gcEFkLT5SZWFkUG9zaXRpb247CisJaWYgKFJ4QnVmZmVyTGVuZ3RoIDwKKwkgICAgKFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFICsgc2l6ZW9mKHN0cnVjdCBydF9yeHdpKSArCisJICAgICBzaXplb2Yoc3RydWN0IHJ0X3J4aW5mbykpKSB7CisJCWdvdG8gbGFiZWxfbnVsbDsKKwl9CisKKwlwRGF0YSA9ICZwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlcltwQWQtPlJlYWRQb3NpdGlvbl07CS8qIDRLQiAqLworCS8qIFRoZSBSWERNQSBmaWVsZCBpcyA0IGJ5dGVzLCBub3cganVzdCB1c2UgdGhlIGZpcnN0IDIgYnl0ZXMuIFRoZSBMZW5ndGggaW5jbHVkaW5nIHRoZSAoUlhXSSArIE1TRFUgKyBQYWRkaW5nKSAqLworCVRoaXNGcmFtZUxlbiA9ICpwRGF0YSArICgqKHBEYXRhICsgMSkgPDwgOCk7CisJaWYgKFRoaXNGcmFtZUxlbiA9PSAwKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQklSSWR4KCVkKTogUlhETUFMZW4gaXMgemVyby5bJWxkXSwgQnVsa0luQnVmTGVuID0gJWxkKVxuIiwKKwkJCSAgcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsIFRoaXNGcmFtZUxlbiwKKwkJCSAgcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0KSk7CisJCWdvdG8gbGFiZWxfbnVsbDsKKwl9CisJaWYgKChUaGlzRnJhbWVMZW4gJiAweDMpICE9IDApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJCSVJJZHgoJWQpOiBSWERNQUxlbiBub3QgbXVsdGlwbGUgb2YgNC5bJWxkXSwgQnVsa0luQnVmTGVuID0gJWxkKVxuIiwKKwkJCSAgcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsIFRoaXNGcmFtZUxlbiwKKwkJCSAgcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0KSk7CisJCWdvdG8gbGFiZWxfbnVsbDsKKwl9CisKKwlpZiAoKFRoaXNGcmFtZUxlbiArIDgpID4gUnhCdWZmZXJMZW5ndGgpCS8qIDggZm9yIChSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRSArIHNpemVvZihzdHJ1Y3QgcnRfcnhpbmZvKSkgKi8KKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQklSSWR4KCVkKTpGcmFtZUxlbigweCVseCkgb3V0cmFuZ2VzLiBCdWxrSW5MZW49MHglbHgsIHJlbWFpbmluZyBSeEJ1Zkxlbj0weCVseCwgUmVhZFBvcz0weCVseFxuIiwKKwkJCSAgcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsIFRoaXNGcmFtZUxlbiwKKwkJCSAgcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0LCBSeEJ1ZmZlckxlbmd0aCwKKwkJCSAgcEFkLT5SZWFkUG9zaXRpb24pKTsKKworCQkvKiBlcnJvciBmcmFtZS4gZmluaXNoIHRoaXMgbG9vcCAqLworCQlnb3RvIGxhYmVsX251bGw7CisJfQorCS8qIHNraXAgVVNCIGZyYW1lIGxlbmd0aCBmaWVsZCAqLworCXBEYXRhICs9IFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFOworCXBSeFdJID0gKHN0cnVjdCBydF9yeHdpICopIHBEYXRhOworCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID4gVGhpc0ZyYW1lTGVuKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXMoKTpwUnhXSU1QRFV0b3RhbEJ5dGVDb3VudCglZCkgbGFyZ2UgdGhhbiBSeERNQUxlbiglbGQpXG4iLAorCQkJICBfX0ZVTkNUSU9OX18sIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsCisJCQkgIFRoaXNGcmFtZUxlbikpOworCQlnb3RvIGxhYmVsX251bGw7CisJfQorCS8qIGFsbG9jYXRlIGEgcnggcGFja2V0ICovCisJcFNrYiA9IGRldl9hbGxvY19za2IoVGhpc0ZyYW1lTGVuKTsKKwlpZiAocFNrYiA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXMoKTpDYW5ub3QgQWxsb2NhdGUgc2sgYnVmZmVyIGZvciB0aGlzIEJ1bGstSW4gYnVmZmVyIVxuIiwKKwkJCSAgX19GVU5DVElPTl9fKSk7CisJCWdvdG8gbGFiZWxfbnVsbDsKKwl9CisJLyogY29weSB0aGUgcnggcGFja2V0ICovCisJbWVtY3B5KHNrYl9wdXQocFNrYiwgVGhpc0ZyYW1lTGVuKSwgcERhdGEsIFRoaXNGcmFtZUxlbik7CisJUlRQS1RfVE9fT1NQS1QocFNrYiktPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEJTUzApOworCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocFNrYiksIFBLVFNSQ19ORElTKTsKKworCS8qIGNvcHkgUnhEICovCisJKnBTYXZlUnhEID0gKihzdHJ1Y3QgcnRfcnhpbmZvICopIChwRGF0YSArIFRoaXNGcmFtZUxlbik7CisKKwkvKiB1cGRhdGUgbmV4dCBwYWNrZXQgcmVhZCBwb3NpdGlvbi4gKi8KKwlwQWQtPlJlYWRQb3NpdGlvbiArPSAoVGhpc0ZyYW1lTGVuICsgUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkUgKyBSWElORk9fU0laRSk7CS8qIDggZm9yIChSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRSArIHNpemVvZihzdHJ1Y3QgcnRfcnhpbmZvKSkgKi8KKworCXJldHVybiBwU2tiOworCitsYWJlbF9udWxsOgorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDaGVjayBSeCBkZXNjcmlwdG9yLCByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBpZiBhbnkgZXJyb3IgZG91bmQKKworCUFyZ3VtZW50czoKKwkJcFJ4RAkJUG9pbnRlcgl0byB0aGUgUnggZGVzY3JpcHRvcgorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTCQlObyBlcnIKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQkJRXJyb3IKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgUlRNUENoZWNrUnhFcnJvcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlciwKKwkJCSAgICAgc3RydWN0IHJ0X3J4d2kgKiBwUnhXSSwgSU4gUFJUMjhYWF9SWERfU1RSVUMgcFJ4SU5GTykKK3sKKwlzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcFdwYUtleTsKKwlpbnQgZEJtOworCisJaWYgKHBBZC0+YlByb21pc2N1b3VzID09IFRSVUUpCisJCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJaWYgKHBSeElORk8gPT0gTlVMTCkKKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKworCS8qIFBoeSBlcnJvcnMgJiBDUkMgZXJyb3JzICovCisJaWYgKHBSeElORk8tPkNyYykgeworCQkvKiBDaGVjayBSU1NJIGZvciBOb2lzZSBIaXN0IHN0YXRpc3RpYyBjb2xsZWN0aW9uLiAqLworCQlkQm0gPSAoaW50KShwUnhXSS0+UlNTSTApIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKwkJaWYgKGRCbSA8PSAtODcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzBdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtODIpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzFdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNzcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzJdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNzIpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzNdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNjcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzRdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNjIpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzVdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNTcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzZdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA+IC01NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbN10gKz0gMTsKKworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKwkvKiBBZGQgUnggc2l6ZSB0byBjaGFubmVsIGxvYWQgY291bnRlciwgd2Ugc2hvdWxkIGlnbm9yZSBlcnJvciBjb3VudHMgKi8KKwlwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyArPSAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCArIDE0KTsKKworCS8qIERyb3AgVG9EcyBwcm9taXNjb3VzIGZyYW1lLCBpdCBpcyBvcGVuZWQgZHVlIHRvIENDWCAyIGNoYW5uZWwgbG9hZCBzdGF0aXN0aWNzICovCisJaWYgKHBIZWFkZXItPkZDLlRvRHMpIHsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkVycjtGQy5Ub0RzXG4iKSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKwkvKiBQYXVsIDA0LTAzIGZvciBPRkRNIFJ4IGxlbmd0aCBpc3N1ZSAqLworCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID4gTUFYX0FHR1JFR0FUSU9OX1NJWkUpIHsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoInJlY2VpdmVkIHBhY2tldCB0b28gbG9uZ1xuIikpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisJLyogRHJvcCBub3QgVTJNIGZyYW1lcywgY2FudCdzIGRyb3AgaGVyZSBiZWNhdXNlIHdlIHdpbGwgZHJvcCBiZWFjb24gaW4gdGhpcyBjYXNlICovCisJLyogSSBhbSBraW5kIG9mIGRvdWJ0aW5nIHRoZSBVMk0gYml0IG9wZXJhdGlvbiAqLworCS8qIGlmIChwUnhELT5VMk0gPT0gMCkgKi8KKwkvKiAgICAgIHJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsgKi8KKworCS8qIGRyb3AgZGVjeXB0aW9uIGZhaWwgZnJhbWUgKi8KKwlpZiAocFJ4SU5GTy0+RGVjcnlwdGVkICYmIHBSeElORk8tPkNpcGhlckVycikgeworCisJCWlmICgoKHBSeElORk8tPkNpcGhlckVyciAmIDEpID09IDEpCisJCSAgICAmJiBwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCAmJiBJTkZSQV9PTihwQWQpKQorCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfSUNWX0VSUk9SX0VWRU5UX0ZMQUcsCisJCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uCisJCQkJCSAgICAgIEFkZHIsIEJTUzAsIDApOworCisJCWlmICgoKHBSeElORk8tPkNpcGhlckVyciAmIDIpID09IDIpCisJCSAgICAmJiBwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCAmJiBJTkZSQV9PTihwQWQpKQorCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfTUlDX0VSUk9SX0VWRU5UX0ZMQUcsCisJCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uCisJCQkJCSAgICAgIEFkZHIsIEJTUzAsIDApOworCQkvKiAqLworCQkvKiBNSUMgRXJyb3IgKi8KKwkJLyogKi8KKwkJaWYgKChwUnhJTkZPLT5DaXBoZXJFcnIgPT0gMikgJiYgcFJ4SU5GTy0+TXlCc3MpIHsKKwkJCXBXcGFLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4V0ktPktleUluZGV4XTsKKwkJCVJUTVBSZXBvcnRNaWNFcnJvcihwQWQsIHBXcGFLZXkpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJ4IE1JQyBWYWx1ZSBlcnJvclxuIikpOworCQl9CisKKwkJaWYgKHBSeElORk8tPkRlY3J5cHRlZCAmJgorCQkgICAgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BSeFdJLT5LZXlJbmRleF0uQ2lwaGVyQWxnID09CisJCSAgICAgQ0lQSEVSX0FFUykKKwkJICAgICYmIChwSGVhZGVyLT5TZXF1ZW5jZSA9PSBwQWQtPkZyYWdGcmFtZS5TZXF1ZW5jZSkpIHsKKwkJCS8qICovCisJCQkvKiBBY2NlcHRhYmxlIHNpbmNlIHRoZSBGaXJzdCBGcmFnRnJhbWUgbm8gQ2lwaGVyRXJyIHByb2JsZW0uICovCisJCQkvKiAqLworCQkJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJfQorCisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCisJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKwordm9pZCBSdG1wVXNiU3RhQXNpY0ZvcmNlV2FrZXVwVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCQkJICAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkJCSAgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwKKwkJCQkgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwlpZiAocEFkICYmIHBBZC0+TWxtZS5BdXRvV2FrZXVwVGltZXJSdW5uaW5nKSB7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgMHhmZiwgMHgwMCwgMHgwMik7CisKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisJCXBBZC0+TWxtZS5BdXRvV2FrZXVwVGltZXJSdW5uaW5nID0gRkFMU0U7CisJfQorfQorCit2b2lkIFJUMjh4eFVzYlN0YUFzaWNGb3JjZVdha2V1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYkZyb21UeCkKK3sKKwlCT09MRUFOIENhbmNlbGVkOworCisJaWYgKHBBZC0+TWxtZS5BdXRvV2FrZXVwVGltZXJSdW5uaW5nKQorCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5BdXRvV2FrZXVwVGltZXIsICZDYW5jZWxlZCk7CisKKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIDB4ZmYsIDB4MDAsIDB4MDIpOworCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Cit9CisKK3ZvaWQgUlQyOHh4VXNiU3RhQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgdTE2IFRidHROdW1Ub05leHRXYWtlVXApCit7CisKKwkvKiB3ZSBoYXZlIGRlY2lkZWQgdG8gU0xFRVAsIHNvIGF0IGxlYXN0IGRvIGl0IGZvciBhIEJFQUNPTiBwZXJpb2QuICovCisJaWYgKFRidHROdW1Ub05leHRXYWtlVXAgPT0gMCkKKwkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IDE7CisKKwlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5BdXRvV2FrZXVwVGltZXIsIEFVVE9fV0FLRVVQX1RJTUVPVVQpOworCXBBZC0+TWxtZS5BdXRvV2FrZXVwVGltZXJSdW5uaW5nID0gVFJVRTsKKworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgMHhmZiwgMHhmZiwgMHgwMik7CS8qIHNlbmQgUE9XRVItU0FWRSBjb21tYW5kIHRvIE1DVS4gVGltZW91dCA0MHVzLiAqLworCisJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworCit9CisKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9pbmZvLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1faW5mby5jCmluZGV4IDAxOWNjNDQuLjI1MzAyZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9pbmZvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2luZm8uYwpAQCAtMjMsODI2ICsyMywxMSBAQAogICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KKyAqLwogCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAotSU5UCVNob3dfU1NJRF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfV2lyZWxlc3NNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19UeEJ1cnN0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19UeFByZWFtYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19UeFBvd2VyX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19DaGFubmVsX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19CR1Byb3RlY3Rpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X1JUU1RocmVzaG9sZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfRnJhZ1RocmVzaG9sZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRCd19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRNY3NfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0h0R2lfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0h0T3BNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19IdEV4dGNoYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRNcGR1RGVuc2l0eV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRCYVdpblNpemVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0h0UmRnX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19IdEFtc2R1X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19IdEF1dG9CYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfQ291bnRyeVJlZ2lvbl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19Db3VudHJ5Q29kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLUlOVAlTaG93X1BrdEFnZ3JlZ2F0ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLSNlbmRpZiAvLyBBR0dSRUdBVElPTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBXTU1fU1VQUE9SVAotSU5UCVNob3dfV21tQ2FwYWJsZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLSNlbmRpZiAvLyBXTU1fU1VQUE9SVCAvLwotCi1JTlQJU2hvd19JRUVFODAyMTFIX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19OZXR3b3JrVHlwZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfQXV0aE1vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0VuY3J5cFR5cGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0RlZmF1bHRLZXlJRF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfS2V5MV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfS2V5Ml9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfS2V5M19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfS2V5NF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfV1BBUFNLX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1zdGF0aWMgc3RydWN0IHsKLQlDSEFSICpuYW1lOwotCUlOVCAoKnNob3dfcHJvYykoUFJUTVBfQURBUFRFUiBwQWRhcHRlciwgUFVDSEFSIGFyZyk7Ci19ICpQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLCBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0NbXSA9IHsKLQl7IlNTSUQiLAkJCQkJU2hvd19TU0lEX1Byb2N9LAotCXsiV2lyZWxlc3NNb2RlIiwJCQlTaG93X1dpcmVsZXNzTW9kZV9Qcm9jfSwKLQl7IlR4QnVyc3QiLAkJCQkJU2hvd19UeEJ1cnN0X1Byb2N9LAotCXsiVHhQcmVhbWJsZSIsCQkJCVNob3dfVHhQcmVhbWJsZV9Qcm9jfSwKLQl7IlR4UG93ZXIiLAkJCQkJU2hvd19UeFBvd2VyX1Byb2N9LAotCXsiQ2hhbm5lbCIsCQkJCQlTaG93X0NoYW5uZWxfUHJvY30sCi0JeyJCR1Byb3RlY3Rpb24iLAkJCVNob3dfQkdQcm90ZWN0aW9uX1Byb2N9LAotCXsiUlRTVGhyZXNob2xkIiwJCQlTaG93X1JUU1RocmVzaG9sZF9Qcm9jfSwKLQl7IkZyYWdUaHJlc2hvbGQiLAkJCVNob3dfRnJhZ1RocmVzaG9sZF9Qcm9jfSwKLQl7Ikh0QnciLAkJCQkJU2hvd19IdEJ3X1Byb2N9LAotCXsiSHRNY3MiLAkJCQkJU2hvd19IdE1jc19Qcm9jfSwKLQl7Ikh0R2kiLAkJCQkJU2hvd19IdEdpX1Byb2N9LAotCXsiSHRPcE1vZGUiLAkJCQlTaG93X0h0T3BNb2RlX1Byb2N9LAotCXsiSHRFeHRjaGEiLAkJCQlTaG93X0h0RXh0Y2hhX1Byb2N9LAotCXsiSHRNcGR1RGVuc2l0eSIsCQkJU2hvd19IdE1wZHVEZW5zaXR5X1Byb2N9LAotCXsiSHRCYVdpblNpemUiLAkJICAgICAgICBTaG93X0h0QmFXaW5TaXplX1Byb2N9LAotCXsiSHRSZGciLAkJICAgICAgICAJU2hvd19IdFJkZ19Qcm9jfSwKLQl7Ikh0QW1zZHUiLAkJICAgICAgICAJU2hvd19IdEFtc2R1X1Byb2N9LAotCXsiSHRBdXRvQmEiLAkJICAgICAgICBTaG93X0h0QXV0b0JhX1Byb2N9LAotCXsiQ291bnRyeVJlZ2lvbiIsCQkJU2hvd19Db3VudHJ5UmVnaW9uX1Byb2N9LAotCXsiQ291bnRyeVJlZ2lvbkFCYW5kIiwJCVNob3dfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2N9LAotCXsiQ291bnRyeUNvZGUiLAkJCQlTaG93X0NvdW50cnlDb2RlX1Byb2N9LAotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLQl7IlBrdEFnZ3JlZ2F0ZSIsCQkJU2hvd19Qa3RBZ2dyZWdhdGVfUHJvY30sCi0jZW5kaWYKLQotI2lmZGVmIFdNTV9TVVBQT1JUCi0JeyJXbW1DYXBhYmxlIiwJCQkJU2hvd19XbW1DYXBhYmxlX1Byb2N9LAotI2VuZGlmCi0JeyJJRUVFODAyMTFIIiwJCQkJU2hvd19JRUVFODAyMTFIX1Byb2N9LAotICAgIHsiTmV0d29ya1R5cGUiLAkJCQlTaG93X05ldHdvcmtUeXBlX1Byb2N9LAotCXsiQXV0aE1vZGUiLAkJCQlTaG93X0F1dGhNb2RlX1Byb2N9LAotCXsiRW5jcnlwVHlwZSIsCQkJCVNob3dfRW5jcnlwVHlwZV9Qcm9jfSwKLQl7IkRlZmF1bHRLZXlJRCIsCQkJU2hvd19EZWZhdWx0S2V5SURfUHJvY30sCi0JeyJLZXkxIiwJCQkJCVNob3dfS2V5MV9Qcm9jfSwKLQl7IktleTIiLAkJCQkJU2hvd19LZXkyX1Byb2N9LAotCXsiS2V5MyIsCQkJCQlTaG93X0tleTNfUHJvY30sCi0JeyJLZXk0IiwJCQkJCVNob3dfS2V5NF9Qcm9jfSwKLQl7IldQQVBTSyIsCQkJCQlTaG93X1dQQVBTS19Qcm9jfSwKLQl7TlVMTCwgTlVMTH0KLX07Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgR2V0IERyaXZlciB2ZXJzaW9uLgotCi0gICAgUmV0dXJuOgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9Ecml2ZXJWZXJzaW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRyaXZlciB2ZXJzaW9uLSVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04pKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBDb3VudHJ5IFJlZ2lvbi4KLSAgICAgICAgVGhpcyBjb21tYW5kIHdpbGwgbm90IHdvcmssIGlmIHRoZSBmaWVsZCBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkLgotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9Db3VudHJ5UmVnaW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIHJlZ2lvbjsKLQotCXJlZ2lvbiA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQkvLyBDb3VudHJ5IGNhbiBiZSBzZXQgb25seSB3aGVuIEVFUFJPTSBub3QgcHJvZ3JhbW1lZAotCWlmIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg4MCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OnBhcmFtZXRlciBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkIFxuIikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JaWYoKHJlZ2lvbiA+PSAwKSAmJiAocmVnaW9uIDw9IFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQpKQotCXsKLQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9IChVQ0hBUikgcmVnaW9uOwotCX0KLQllbHNlIGlmIChyZWdpb24gPT0gUkVHSU9OXzMxX0JHX0JBTkQpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKSByZWdpb247Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OnBhcmFtZXRlcnMgb3V0IG9mIHJhbmdlXG4iKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQkvLyBpZiBzZXQgY291bnRyeSByZWdpb24sIGRyaXZlciBuZWVkcyB0byBiZSByZXNldAotCUJ1aWxkQ2hhbm5lbExpc3QocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OihDb3VudHJ5UmVnaW9uPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbikpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IENvdW50cnkgUmVnaW9uIGZvciBBIGJhbmQuCi0gICAgICAgIFRoaXMgY29tbWFuZCB3aWxsIG5vdCB3b3JrLCBpZiB0aGUgZmllbGQgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZC4KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIHJlZ2lvbjsKLQotCXJlZ2lvbiA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQkvLyBDb3VudHJ5IGNhbiBiZSBzZXQgb25seSB3aGVuIEVFUFJPTSBub3QgcHJvZ3JhbW1lZAotCWlmIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgJiAweDgwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jOjpwYXJhbWV0ZXIgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZCBcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCWlmKChyZWdpb24gPj0gMCkgJiYgKHJlZ2lvbiA8PSBSRUdJT05fTUFYSU1VTV9BX0JBTkQpKQotCXsKLQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kID0gKFVDSEFSKSByZWdpb247Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYzo6cGFyYW1ldGVycyBvdXQgb2YgcmFuZ2VcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCS8vIGlmIHNldCBjb3VudHJ5IHJlZ2lvbiwgZHJpdmVyIG5lZWRzIHRvIGJlIHJlc2V0Ci0JQnVpbGRDaGFubmVsTGlzdChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jOjooQ291bnRyeVJlZ2lvbj0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdpcmVsZXNzIE1vZGUKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfV2lyZWxlc3NNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HCVdpcmVsZXNzTW9kZTsKLQlJTlQJCXN1Y2Nlc3MgPSBUUlVFOwotCi0JV2lyZWxlc3NNb2RlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCXsKLQkJSU5UIE1heFBoeU1vZGUgPSBQSFlfMTFHOwotCi0JCU1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOwotCi0JCWlmIChXaXJlbGVzc01vZGUgPD0gTWF4UGh5TW9kZSkKLQkJewotCQkJUlRNUFNldFBoeU1vZGUocEFkLCBXaXJlbGVzc01vZGUpOwotCi0JCQlpZiAoV2lyZWxlc3NNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7Ci0JCQkJcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKLQkJCX0KLQotCQkJLy8gU2V0IEFkaG9jTW9kZSByYXRlcwotCQkJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQotCQkJewotCQkJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgRkFMU0UsIDApOwotCQkJCU1ha2VJYnNzQmVhY29uKHBBZCk7ICAgICAgICAgICAvLyByZS1idWlsZCBCRUFDT04gZnJhbWUKLQkJCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsgICAgICAgLy8gY29weSB0byBvbi1jaGlwIG1lbW9yeQotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3VjY2VzcyA9IEZBTFNFOwotCQl9Ci0JfQotCi0JLy8gaXQgaXMgbmVlZGVkIHRvIHNldCBTU0lEIHRvIHRha2UgZWZmZWN0Ci0JaWYgKHN1Y2Nlc3MgPT0gVFJVRSkKLQl7Ci0JCVNldENvbW1vbkhUKHBBZCk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XaXJlbGVzc01vZGVfUHJvYzo6KD0lbGQpXG4iLCBXaXJlbGVzc01vZGUpKTsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X1dpcmVsZXNzTW9kZV9Qcm9jOjpwYXJhbWV0ZXJzIG91dCBvZiByYW5nZVxuIikpOwotCX0KLQotCXJldHVybiBzdWNjZXNzOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBDaGFubmVsCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0NoYW5uZWxfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0gCUlOVAkJc3VjY2VzcyA9IFRSVUU7Ci0JVUNIQVIJQ2hhbm5lbDsKLQotCUNoYW5uZWwgPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQkvLyBjaGVjayBpZiB0aGlzIGNoYW5uZWwgaXMgdmFsaWQKLQlpZiAoQ2hhbm5lbFNhbml0eShwQWQsIENoYW5uZWwpID09IFRSVUUpCi0JewotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gQ2hhbm5lbDsKLQotCQkJaWYgKE1PTklUT1JfT04ocEFkKSkKLQkJCXsKLQkJCQlOX0NoYW5uZWxDaGVjayhwQWQpOwotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKLQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKQotCQkJCXsKLQkJCQkJTl9TZXRDZW5DaChwQWQpOwotCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfNDAsIGNvbnRyb2xfY2hhbm5lbCglZCksIENlbnRyYWxDaGFubmVsKCVkKSBcbiIsCi0JCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfMjAsIENoYW5uZWwoJWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1Y2Nlc3MgPSBUUlVFOwotCX0KLQllbHNlCi0JewotCQlzdWNjZXNzID0gRkFMU0U7Ci0JfQotCi0KLQlpZiAoc3VjY2VzcyA9PSBUUlVFKQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQ2hhbm5lbF9Qcm9jOjooQ2hhbm5lbD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKLQotCXJldHVybiBzdWNjZXNzOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBTaG9ydCBTbG90IFRpbWUgRW5hYmxlIG9yIERpc2FibGUKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfU2hvcnRTbG90X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIFNob3J0U2xvdDsKLQotCVNob3J0U2xvdCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoU2hvcnRTbG90ID09IDEpCi0JCXBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lID0gVFJVRTsKLQllbHNlIGlmIChTaG9ydFNsb3QgPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBGQUxTRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1Nob3J0U2xvdF9Qcm9jOjooU2hvcnRTbG90PSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBUeCBwb3dlcgotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9UeFBvd2VyX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIFR4UG93ZXI7Ci0JSU5UICAgc3VjY2VzcyA9IEZBTFNFOwotCi0JVHhQb3dlciA9IChVTE9ORykgc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVHhQb3dlciA8PSAxMDApCi0JewotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IFR4UG93ZXI7Ci0JCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OwotCQl9Ci0JCXN1Y2Nlc3MgPSBUUlVFOwotCX0KLQllbHNlCi0JCXN1Y2Nlc3MgPSBGQUxTRTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9UeFBvd2VyX1Byb2M6OihUeFBvd2VyUGVyY2VudGFnZT0lbGQpXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOwotCi0JcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IDExQi8xMUcgUHJvdGVjdGlvbgotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9CR1Byb3RlY3Rpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0Jc3dpdGNoIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApKQotCXsKLQkJY2FzZSAwOiAvL0FVVE8KLQkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSAxOiAvL0Fsd2F5cyBPbgotCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIDI6IC8vQWx3YXlzIE9GRgotCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OiAgLy9JbnZhbGlkIGFyZ3VtZW50Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQkdQcm90ZWN0aW9uX1Byb2M6OihCR1Byb3RlY3Rpb249JWxkKVxuIiwgcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgVHhQcmVhbWJsZQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9UeFByZWFtYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVJUXzgwMl8xMV9QUkVBTUJMRQlQcmVhbWJsZTsKLQotCVByZWFtYmxlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCi0Jc3dpdGNoIChQcmVhbWJsZSkKLQl7Ci0JCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZVNob3J0OgotCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOwotCi0JCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCk7Ci0JCQlicmVhazsKLQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKLQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlQXV0bzoKLQkJCS8vIGlmIHVzZXIgd2FudHMgQVVUTywgaW5pdGlhbGl6ZSB0byBMT05HIGhlcmUsIHRoZW4gY2hhbmdlIGFjY29yZGluZyB0byBBUCdzCi0JCQkvLyBjYXBhYmlsaXR5IHVwb24gYXNzb2NpYXRpb24uCi0JCQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7Ci0KLQkJCU1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZUxvbmcpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAotCQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9UeFByZWFtYmxlX1Byb2M6OihUeFByZWFtYmxlPSVsZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBSVFMgVGhyZXNob2xkCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X1JUU1RocmVzaG9sZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQkgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgUnRzVGhyZXNoOwotCi0JUnRzVGhyZXNoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmKChSdHNUaHJlc2ggPiAwKSAmJiAoUnRzVGhyZXNoIDw9IE1BWF9SVFNfVEhSRVNIT0xEKSkKLQkJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkICA9IChVU0hPUlQpUnRzVGhyZXNoOwotCWVsc2UgaWYgKFJ0c1RocmVzaCA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSBNQVhfUlRTX1RIUkVTSE9MRDsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfUlRTVGhyZXNob2xkX1Byb2M6OihSVFNUaHJlc2hvbGQ9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBGcmFnbWVudCBUaHJlc2hvbGQKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQkgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgICAgIEZyYWdUaHJlc2g7Ci0KLQlGcmFnVGhyZXNoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChGcmFnVGhyZXNoID4gTUFYX0ZSQUdfVEhSRVNIT0xEIHx8IEZyYWdUaHJlc2ggPCBNSU5fRlJBR19USFJFU0hPTEQpCi0JewotCQkvL0lsbGVnYWwgRnJhZ1RocmVzaCBzbyB3ZSBzZXQgaXQgdG8gZGVmYXVsdAotCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKLQl9Ci0JZWxzZSBpZiAoRnJhZ1RocmVzaCAlIDIgPT0gMSkKLQl7Ci0JCS8vIFRoZSBsZW5ndGggb2YgZWFjaCBmcmFnbWVudCBzaGFsbCBhbHdheXMgYmUgYW4gZXZlbiBudW1iZXIgb2Ygb2N0ZXRzLCBleGNlcHQgZm9yIHRoZSBsYXN0IGZyYWdtZW50Ci0JCS8vIG9mIGFuIE1TRFUgb3IgTU1QRFUsIHdoaWNoIG1heSBiZSBlaXRoZXIgYW4gZXZlbiBvciBhbiBvZGQgbnVtYmVyIG9mIG9jdGV0cy4KLQkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKShGcmFnVGhyZXNoIC0gMSk7Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVClGcmFnVGhyZXNoOwotCX0KLQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID09IE1BWF9GUkFHX1RIUkVTSE9MRCkKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOwotCQllbHNlCi0JCQlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gRkFMU0U7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0ZyYWdUaHJlc2hvbGRfUHJvYzo6KEZyYWdUaHJlc2hvbGQ9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFR4QnVyc3QKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfVHhCdXJzdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBUeEJ1cnN0OwotCi0JVHhCdXJzdCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0JaWYgKFR4QnVyc3QgPT0gMSkKLQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOwotCWVsc2UgaWYgKFR4QnVyc3QgPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBGQUxTRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1R4QnVyc3RfUHJvYzo6KFR4QnVyc3Q9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLSNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBUeEJ1cnN0Ci0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBhZ2dyZTsKLQotCWFnZ3JlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChhZ2dyZSA9PSAxKQotCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gVFJVRTsKLQllbHNlIGlmIChhZ2dyZSA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gRkFMU0U7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKLQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jOjooQUdHUkU9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZgotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBJRUVFODAyMTFILgotICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyAxIHdoZW4gbmVlZHMgcmFkYXIgZGV0ZWN0aW9uLCBvdGhlcndpc2UgMAotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9JRUVFODAyMTFIX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotICAgIFVMT05HIGllZWU4MDIxMWg7Ci0KLQlpZWVlODAyMTFoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChpZWVlODAyMTFoID09IDEpCi0JCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gVFJVRTsKLQllbHNlIGlmIChpZWVlODAyMTFoID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gRkFMU0U7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9JRUVFODAyMTFIX1Byb2M6OihJRUVFODAyMTFIPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUgpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLSNpZmRlZiBEQkcKLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgRm9yIERlYnVnIGluZm9ybWF0aW9uCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0RlYnVnX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBTZXRfRGVidWdfUHJvYyAqKioqKioqKioqKioqKioqKioqXG4iKSk7Ci0KLSAgICBpZihzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApIDw9IFJUX0RFQlVHX0xPVUQpCi0gICAgICAgIFJURGVidWdMZXZlbCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gU2V0X0RlYnVnX1Byb2MoUlREZWJ1Z0xldmVsID0gJWxkKVxuIiwgUlREZWJ1Z0xldmVsKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZgotCi1JTlQJU2hvd19EZXNjSW5mb19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLSNpZmRlZiBSVDI4NjAKLQlJTlQgaSwgUXVlSWR4PTA7Ci0JUFJUMjhYWF9SWERfU1RSVUMgcFJ4RDsKLSAgICBQVFhEX1NUUlVDIHBUeEQ7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1F1ZUlkeF07Ci0JUFJUTVBfTUdNVF9SSU5HCXBNZ210UmluZyA9ICZwQWQtPk1nbXRSaW5nOwotCVBSVE1QX1JYX1JJTkcJcFJ4UmluZyA9ICZwQWQtPlJ4UmluZzsKLQotCWZvcihpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQotCXsKLQkgICAgcFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW2ldLkFsbG9jVmE7Ci0JICAgIHByaW50aygiRGVzYyAjJWRcbiIsaSk7Ci0JICAgIGhleF9kdW1wKCJUeCBEZXNjcmlwdG9yIiwgKGNoYXIgKilwVHhELCAxNik7Ci0JICAgIHByaW50aygicFR4RC0+RE1BRE9ORSA9ICV4XG4iLCBwVHhELT5ETUFET05FKTsKLQl9Ci0JcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCWZvcihpPTA7aTxNR01UX1JJTkdfU0laRTtpKyspCi0JewotCSAgICBwVHhEID0gKFBUWERfU1RSVUMpIHBNZ210UmluZy0+Q2VsbFtpXS5BbGxvY1ZhOwotCSAgICBwcmludGsoIkRlc2MgIyVkXG4iLGkpOwotCSAgICBoZXhfZHVtcCgiTWdtdCBEZXNjcmlwdG9yIiwgKGNoYXIgKilwVHhELCAxNik7Ci0JICAgIHByaW50aygicE1nbXQtPkRNQURPTkUgPSAleFxuIiwgcFR4RC0+RE1BRE9ORSk7Ci0JfQotCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLQlmb3IoaT0wO2k8UlhfUklOR19TSVpFO2krKykKLQl7Ci0JICAgIHBSeEQgPSAoUFJUMjhYWF9SWERfU1RSVUMpIHBSeFJpbmctPkNlbGxbaV0uQWxsb2NWYTsKLQkgICAgcHJpbnRrKCJEZXNjICMlZFxuIixpKTsKLQkgICAgaGV4X2R1bXAoIlJ4IERlc2NyaXB0b3IiLCAoY2hhciAqKXBSeEQsIDE2KTsKLQkJcHJpbnRrKCJwUnhELT5ERE9ORSA9ICV4XG4iLCBwUnhELT5ERE9ORSk7Ci0JfQotI2VuZGlmIC8qIFJUMjg2MCAqLwotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFJlc2V0IHN0YXRpc3RpY3MgY291bnRlcgotCi0gICAgQXJndW1lbnRzOgotICAgICAgICBwQWRhcHRlciAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAgICAgICAgYXJnCi0KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT5TZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jXG4iKSk7Ci0KLQkvLyBhZGQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBoL3cgcmF3IGNvdW50ZXJzIGludG8gc29mdHdhcmUgY291bnRlcnMKLQlOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpOwotCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+V2xhbkNvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl84MDJfMTEpKTsKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db3VudGVyczgwMjMsIHNpemVvZihDT1VOVEVSXzgwMl8zKSk7Ci0JTmRpc1plcm9NZW1vcnkoJnBBZC0+UmFsaW5rQ291bnRlcnMsIHNpemVvZihDT1VOVEVSX1JBTElOSykpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUJPT0xFQU4gUlRNUENoZWNrU3RyUHJpbnRBYmxlKAotICAgIElOICBDSEFSICpwSW5QdXRTdHIsCi0gICAgSU4gIFVDSEFSIHN0ckxlbikKLXsKLSAgICBVQ0hBUiBpPTA7Ci0KLSAgICBmb3IgKGk9MDsgaTxzdHJMZW47IGkrKykKLSAgICB7Ci0gICAgICAgIGlmICgocEluUHV0U3RyW2ldIDwgMHgyMSkgfHwKLSAgICAgICAgICAgIChwSW5QdXRTdHJbaV0gPiAweDdFKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtODYyLDIxNyArNDcsMTc0IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgTE9ORyAgICAgICAgICAgIFJhdGVzKQordm9pZCBSVE1QU2V0RGVzaXJlZFJhdGVzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyLCBsb25nIFJhdGVzKQogewotICAgIE5ESVNfODAyXzExX1JBVEVTIGFyeVJhdGVzOworCU5ESVNfODAyXzExX1JBVEVTIGFyeVJhdGVzOwogCi0gICAgbWVtc2V0KCZhcnlSYXRlcywgMHgwMCwgc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSk7Ci0gICAgc3dpdGNoIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUpCi0gICAgewotICAgICAgICBjYXNlIFBIWV8xMUE6IC8vIEEgb25seQotICAgICAgICAgICAgc3dpdGNoIChSYXRlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDYwMDAwMDA6IC8vNk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBjOyAvLyA2TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgOTAwMDAwMDogLy85TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTI7IC8vIDlNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjAwMDAwMDogLy8xMk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE4OyAvLyAxMk0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE4MDAwMDAwOiAvLzE4TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MjQ7IC8vIDE4TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjQwMDAwMDA6IC8vMjRNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgzMDsgLy8gMjRNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNjAwMDAwMDogLy8zNk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDQ4OyAvLyAzNk0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU181OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwMDAwOiAvLzQ4TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NjA7IC8vIDQ4TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzY7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNTQwMDAwMDA6IC8vNTRNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAtMTogLy9BdXRvCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE1icHMKLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDYwOyAvLyA0OE1icHMKLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMl0gPSAweDQ4OyAvLyAzNk1icHMKLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbM10gPSAweDMwOyAvLyAyNE1icHMKLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNF0gPSAweDI0OyAvLyAxOE0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNV0gPSAweDE4OyAvLyAxMk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNl0gPSAweDEyOyAvLyA5TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s3XSA9IDB4MGM7IC8vIDZNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQSFlfMTFCR19NSVhFRDogLy8gQi9HIE1peGVkCi0gICAgICAgIGNhc2UgUEhZXzExQjogLy8gQiBvbmx5Ci0gICAgICAgIGNhc2UgUEhZXzExQUJHX01JWEVEOiAvLyBBL0IvRyBNaXhlZAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgc3dpdGNoIChSYXRlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEwMDAwMDA6IC8vMU0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDAyOwotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjAwMDAwMDogLy8yTQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MDQ7Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA1MDAwMDAwOiAvLzUuNU0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBiOyAvLyA1LjVNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTAwMDAwMDogLy8xMU0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE2OyAvLyAxMU0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18zOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDYwMDAwMDA6IC8vNk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBjOyAvLyA2TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgOTAwMDAwMDogLy85TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTI7IC8vIDlNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjAwMDAwMDogLy8xMk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE4OyAvLyAxMk0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE4MDAwMDAwOiAvLzE4TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MjQ7IC8vIDE4TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjQwMDAwMDA6IC8vMjRNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgzMDsgLy8gMjRNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNjAwMDAwMDogLy8zNk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDQ4OyAvLyAzNk0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU181OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwMDAwOiAvLzQ4TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NjA7IC8vIDQ4TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzY7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNTQwMDAwMDA6IC8vNTRNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAtMTogLy9BdXRvCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQotICAgICAgICAgICAgICAgICAgICB7IC8vQiBPbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTY7IC8vIDExTWJwcwotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDBiOyAvLyA1LjVNYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4MDQ7IC8vIDJNYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1szXSA9IDB4MDI7IC8vIDFNYnBzCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7IC8vKEIvRykgTWl4ZWQgb3IgKEEvQi9HKSBNaXhlZAotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzFdID0gMHg2MDsgLy8gNDhNYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4NDg7IC8vIDM2TWJwcwotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbM10gPSAweDMwOyAvLyAyNE1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzRdID0gMHgxNjsgLy8gMTFNYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s1XSA9IDB4MGI7IC8vIDUuNU1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzZdID0gMHgwNDsgLy8gMk1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzddID0gMHgwMjsgLy8gMU1icHMKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7Ci0gICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCAmYXJ5UmF0ZXMsIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOwotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBSVE1QU2V0RGVzaXJlZFJhdGVzICglMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngpXG4iLAotICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdLAotICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdLAotICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdLAotICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICkpOwotICAgIC8vIENoYW5naW5nIERlc2lyZWRSYXRlIG1heSBhZmZlY3QgdGhlIE1BWCBUWCByYXRlIHdlIHVzZWQgdG8gVFggZnJhbWVzIG91dAotICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7Ci19Ci0KLU5ESVNfU1RBVFVTIFJUTVBXUEFSZW1vdmVLZXlQcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBWT0lECQkJcEJ1ZikKLXsKLQlQTkRJU184MDJfMTFfUkVNT1ZFX0tFWSBwS2V5OwotCVVMT05HCQkJCQlLZXlJZHg7Ci0JTkRJU19TVEFUVVMgCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQlCT09MRUFOIAliVHhLZXk7IAkJLy8gU2V0IHRoZSBrZXkgYXMgdHJhbnNtaXQga2V5Ci0JQk9PTEVBTiAJYlBhaXJ3aXNlOwkJLy8gSW5kaWNhdGUgdGhlIGtleSBpcyBwYWlyd2lzZSBrZXkKLQlCT09MRUFOIAliS2V5UlNDOwkJLy8gaW5kaWNhdGUgdGhlIHJlY2VpdmUgIFNDIHNldCBieSBLZXlSU0MgdmFsdWUuCi0JCQkJCQkJCS8vIE90aGVyd2lzZSwgaXQgd2lsbCBzZXQgYnkgdGhlIE5JQy4KLQlCT09MRUFOIAliQXV0aGVudGljYXRvcjsgLy8gaW5kaWNhdGUga2V5IGlzIHNldCBieSBhdXRoZW50aWNhdG9yLgotCUlOVCAJCWk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tLT4gUlRNUFdQQVJlbW92ZUtleVByb2NcbiIpKTsKLQotCXBLZXkgPSAoUE5ESVNfODAyXzExX1JFTU9WRV9LRVkpIHBCdWY7Ci0JS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweGZmOwotCS8vIEJpdCAzMSBvZiBBZGQta2V5LCBUeCBLZXkKLQliVHhLZXkJCSAgID0gKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7Ci0JLy8gQml0IDMwIG9mIEFkZC1rZXkgUGFpcndpc2VLZXkKLQliUGFpcndpc2UJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDQwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKLQkvLyBCaXQgMjkgb2YgQWRkLWtleSBLZXlSU0MKLQliS2V5UlNDIAkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4MjAwMDAwMDApID8gVFJVRSA6IEZBTFNFOwotCS8vIEJpdCAyOCBvZiBBZGQta2V5IEF1dGhlbnRpY2F0b3IKLQliQXV0aGVudGljYXRvciA9IChwS2V5LT5LZXlJbmRleCAmIDB4MTAwMDAwMDApID8gVFJVRSA6IEZBTFNFOwotCi0JLy8gMS4gSWYgYlR4IGlzIFRSVUUsIHJldHVybiBmYWlsdXJlIGluZm9ybWF0aW9uCi0JaWYgKGJUeEtleSA9PSBUUlVFKQotCQlyZXR1cm4oTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBKTsKLQotCS8vIDIuIENoZWNrIFBhaXJ3aXNlIEtleQotCWlmIChiUGFpcndpc2UpCi0JewotCQkvLyBhLiBJZiBCU1NJRCBpcyBicm9hZGNhc3QsIHJlbW92ZSBhbGwgcGFpcndpc2Uga2V5cy4KLQkJLy8gYi4gSWYgbm90IGJyb2FkY2FzdCwgcmVtb3ZlIHRoZSBwYWlyd2lzZSBzcGVjaWZpZWQgYnkgQlNTSUQKLQkJZm9yIChpID0gMDsgaSA8IFNIQVJFX0tFWV9OVU07IGkrKykKLQkJewotCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkJzc0lkLCBwS2V5LT5CU1NJRCkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QV1BBUmVtb3ZlS2V5UHJvYyhLZXlJZHg9JWQpXG4iLCBpKSk7Ci0JCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uS2V5TGVuID0gMDsKLQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQkJCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCAoVUNIQVIpaSk7Ci0JCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQkJCQlicmVhazsKLQkJCX0KKwltZW1zZXQoJmFyeVJhdGVzLCAweDAwLCBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKTsKKwlzd2l0Y2ggKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSkgeworCWNhc2UgUEhZXzExQToJCS8qIEEgb25seSAqLworCQlzd2l0Y2ggKFJhdGVzKSB7CisJCWNhc2UgNjAwMDAwMDoJLyo2TSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDBjOwkvKiA2TSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzA7CisJCQlicmVhazsKKwkJY2FzZSA5MDAwMDAwOgkvKjlNICovCisJCQlhcnlSYXRlc1swXSA9IDB4MTI7CS8qIDlNICovCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfMTsKKwkJCWJyZWFrOworCQljYXNlIDEyMDAwMDAwOgkvKjEyTSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDE4OwkvKiAxMk0gKi8KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU18yOworCQkJYnJlYWs7CisJCWNhc2UgMTgwMDAwMDA6CS8qMThNICovCisJCQlhcnlSYXRlc1swXSA9IDB4MjQ7CS8qIDE4TSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzM7CisJCQlicmVhazsKKwkJY2FzZSAyNDAwMDAwMDoJLyoyNE0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHgzMDsJLyogMjRNICovCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfNDsKKwkJCWJyZWFrOworCQljYXNlIDM2MDAwMDAwOgkvKjM2TSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDQ4OwkvKiAzNk0gKi8KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU181OworCQkJYnJlYWs7CisJCWNhc2UgNDgwMDAwMDA6CS8qNDhNICovCisJCQlhcnlSYXRlc1swXSA9IDB4NjA7CS8qIDQ4TSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzY7CisJCQlicmVhazsKKwkJY2FzZSA1NDAwMDAwMDoJLyo1NE0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHg2YzsJLyogNTRNICovCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfNzsKKwkJCWJyZWFrOworCQljYXNlIC0xOgkvKkF1dG8gKi8KKwkJZGVmYXVsdDoKKwkJCWFyeVJhdGVzWzBdID0gMHg2YzsJLyogNTRNYnBzICovCisJCQlhcnlSYXRlc1sxXSA9IDB4NjA7CS8qIDQ4TWJwcyAqLworCQkJYXJ5UmF0ZXNbMl0gPSAweDQ4OwkvKiAzNk1icHMgKi8KKwkJCWFyeVJhdGVzWzNdID0gMHgzMDsJLyogMjRNYnBzICovCisJCQlhcnlSYXRlc1s0XSA9IDB4MjQ7CS8qIDE4TSAqLworCQkJYXJ5UmF0ZXNbNV0gPSAweDE4OwkvKiAxMk0gKi8KKwkJCWFyeVJhdGVzWzZdID0gMHgxMjsJLyogOU0gKi8KKwkJCWFyeVJhdGVzWzddID0gMHgwYzsJLyogNk0gKi8KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU19BVVRPOworCQkJYnJlYWs7CiAJCX0KLQl9Ci0JLy8gMy4gR3JvdXAgS2V5Ci0JZWxzZQotCXsKLQkJLy8gYS4gSWYgQlNTSUQgaXMgYnJvYWRjYXN0LCByZW1vdmUgYWxsIGdyb3VwIGtleXMgaW5kZXhlZAotCQkvLyBiLiBJZiBCU1NJRCBtYXRjaGVkLCBkZWxldGUgdGhlIGdyb3VwIGtleSBpbmRleGVkLgotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBXUEFSZW1vdmVLZXlQcm9jKEtleUlkeD0lbGQpXG4iLCBLZXlJZHgpKTsKLQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAwOwotCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCAoVUNIQVIpS2V5SWR4KTsKLQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJYnJlYWs7CisJY2FzZSBQSFlfMTFCR19NSVhFRDoJLyogQi9HIE1peGVkICovCisJY2FzZSBQSFlfMTFCOgkJLyogQiBvbmx5ICovCisJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6CS8qIEEvQi9HIE1peGVkICovCisJZGVmYXVsdDoKKwkJc3dpdGNoIChSYXRlcykgeworCQljYXNlIDEwMDAwMDA6CS8qMU0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHgwMjsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU18wOworCQkJYnJlYWs7CisJCWNhc2UgMjAwMDAwMDoJLyoyTSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDA0OworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzE7CisJCQlicmVhazsKKwkJY2FzZSA1MDAwMDAwOgkvKjUuNU0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHgwYjsJLyogNS41TSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzI7CisJCQlicmVhazsKKwkJY2FzZSAxMTAwMDAwMDoJLyoxMU0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHgxNjsJLyogMTFNICovCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfMzsKKwkJCWJyZWFrOworCQljYXNlIDYwMDAwMDA6CS8qNk0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHgwYzsJLyogNk0gKi8KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU18wOworCQkJYnJlYWs7CisJCWNhc2UgOTAwMDAwMDoJLyo5TSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDEyOwkvKiA5TSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzE7CisJCQlicmVhazsKKwkJY2FzZSAxMjAwMDAwMDoJLyoxMk0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHgxODsJLyogMTJNICovCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfMjsKKwkJCWJyZWFrOworCQljYXNlIDE4MDAwMDAwOgkvKjE4TSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDI0OwkvKiAxOE0gKi8KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU18zOworCQkJYnJlYWs7CisJCWNhc2UgMjQwMDAwMDA6CS8qMjRNICovCisJCQlhcnlSYXRlc1swXSA9IDB4MzA7CS8qIDI0TSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzQ7CisJCQlicmVhazsKKwkJY2FzZSAzNjAwMDAwMDoJLyozNk0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHg0ODsJLyogMzZNICovCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfNTsKKwkJCWJyZWFrOworCQljYXNlIDQ4MDAwMDAwOgkvKjQ4TSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDYwOwkvKiA0OE0gKi8KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU182OworCQkJYnJlYWs7CisJCWNhc2UgNTQwMDAwMDA6CS8qNTRNICovCisJCQlhcnlSYXRlc1swXSA9IDB4NmM7CS8qIDU0TSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzc7CisJCQlicmVhazsKKwkJY2FzZSAtMToJLypBdXRvICovCisJCWRlZmF1bHQ6CisJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpIHsJLypCIE9ubHkgKi8KKwkJCQlhcnlSYXRlc1swXSA9IDB4MTY7CS8qIDExTWJwcyAqLworCQkJCWFyeVJhdGVzWzFdID0gMHgwYjsJLyogNS41TWJwcyAqLworCQkJCWFyeVJhdGVzWzJdID0gMHgwNDsJLyogMk1icHMgKi8KKwkJCQlhcnlSYXRlc1szXSA9IDB4MDI7CS8qIDFNYnBzICovCisJCQl9IGVsc2UgewkvKihCL0cpIE1peGVkIG9yIChBL0IvRykgTWl4ZWQgKi8KKwkJCQlhcnlSYXRlc1swXSA9IDB4NmM7CS8qIDU0TWJwcyAqLworCQkJCWFyeVJhdGVzWzFdID0gMHg2MDsJLyogNDhNYnBzICovCisJCQkJYXJ5UmF0ZXNbMl0gPSAweDQ4OwkvKiAzNk1icHMgKi8KKwkJCQlhcnlSYXRlc1szXSA9IDB4MzA7CS8qIDI0TWJwcyAqLworCQkJCWFyeVJhdGVzWzRdID0gMHgxNjsJLyogMTFNYnBzICovCisJCQkJYXJ5UmF0ZXNbNV0gPSAweDBiOwkvKiA1LjVNYnBzICovCisJCQkJYXJ5UmF0ZXNbNl0gPSAweDA0OwkvKiAyTWJwcyAqLworCQkJCWFyeVJhdGVzWzddID0gMHgwMjsJLyogMU1icHMgKi8KKwkJCX0KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU19BVVRPOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CiAJfQogCi0JcmV0dXJuIChTdGF0dXMpOworCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwKKwkJICAgICAgIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwlOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsICZhcnlSYXRlcywKKwkJICAgICAgIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCIgUlRNUFNldERlc2lyZWRSYXRlcyAoJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4KVxuIiwKKwkJICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0sCisJCSAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdLAorCQkgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSwKKwkJICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10sCisJCSAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdLAorCQkgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSwKKwkJICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0sCisJCSAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddKSk7CisJLyogQ2hhbmdpbmcgRGVzaXJlZFJhdGUgbWF5IGFmZmVjdCB0aGUgTUFYIFRYIHJhdGUgd2UgdXNlZCB0byBUWCBmcmFtZXMgb3V0ICovCisJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkYXB0ZXIsIEZBTFNFLCAwKTsKIH0KIAogLyoKQEAgLTEwOTMsNDAgKzIzNSw2NSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVE1QV1BBUmVtb3ZlQWxsS2V5cygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgUlRNUFdQQVJlbW92ZUFsbEtleXMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewogCi0JVUNIQVIgCWk7CisJdTggaTsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQVJlbW92ZUFsbEtleXMoQXV0aE1vZGU9JWQsIFdlcFN0YXR1cz0lZClcbiIsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKLQotCS8vIEZvciBXRVAvQ0tJUCwgdGhlcmUgaXMgbm8gbmVlZCB0byByZW1vdmUgaXQsIHNpbmNlIFdpblhQIHdvbid0IHNldCBpdCBhZ2FpbiBhZnRlcgotCS8vIExpbmsgdXAuIEFuZCBpdCB3aWxsIGJlIHJlcGxhY2VkIGlmIHVzZXIgY2hhbmdlZCBpdC4KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRNUFdQQVJlbW92ZUFsbEtleXMoQXV0aE1vZGU9JWQsIFdlcFN0YXR1cz0lZClcbiIsCisJCSAgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykpOworCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKKwkvKiBGb3IgV0VQL0NLSVAsIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVtb3ZlIGl0LCBzaW5jZSBXaW5YUCB3b24ndCBzZXQgaXQgYWdhaW4gYWZ0ZXIgKi8KKwkvKiBMaW5rIHVwLiBBbmQgaXQgd2lsbCBiZSByZXBsYWNlZCBpZiB1c2VyIGNoYW5nZWQgaXQuICovCiAJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQogCQlyZXR1cm47CiAKLQkvLyBGb3IgV1BBLU5vbmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVtb3ZlIGl0LCBzaW5jZSBXaW5YUCB3b24ndCBzZXQgaXQgYWdhaW4gYWZ0ZXIKLQkvLyBMaW5rIHVwLiBBbmQgaXQgd2lsbCBiZSByZXBsYWNlZCBpZiB1c2VyIGNoYW5nZWQgaXQuCisJLyogRm9yIFdQQS1Ob25lLCB0aGVyZSBpcyBubyBuZWVkIHRvIHJlbW92ZSBpdCwgc2luY2UgV2luWFAgd29uJ3Qgc2V0IGl0IGFnYWluIGFmdGVyICovCisJLyogTGluayB1cC4gQW5kIGl0IHdpbGwgYmUgcmVwbGFjZWQgaWYgdXNlciBjaGFuZ2VkIGl0LiAqLwogCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQogCQlyZXR1cm47CiAKLQkvLyBzZXQgQlNTSUQgd2NpZCBlbnRyeSBvZiB0aGUgUGFpci13aXNlIEtleSB0YWJsZSBhcyBuby1zZWN1cml0eSBtb2RlCisJLyogc2V0IEJTU0lEIHdjaWQgZW50cnkgb2YgdGhlIFBhaXItd2lzZSBLZXkgdGFibGUgYXMgbm8tc2VjdXJpdHkgbW9kZSAqLwogCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgQlNTMCwgQlNTSURfV0NJRCk7CiAKLQkvLyBzZXQgYWxsIHNoYXJlZCBrZXkgbW9kZSBhcyBuby1zZWN1cml0eS4KLQlmb3IgKGkgPSAwOyBpIDwgU0hBUkVfS0VZX05VTTsgaSsrKQotICAgIHsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJyZW1vdmUgJXMga2V5ICMlZFxuIiwgQ2lwaGVyTmFtZVtwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGddLCBpKSk7Ci0JCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtpXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwkvKiBzZXQgYWxsIHNoYXJlZCBrZXkgbW9kZSBhcyBuby1zZWN1cml0eS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0hBUkVfS0VZX05VTTsgaSsrKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgicmVtb3ZlICVzIGtleSAjJWRcbiIsCisJCQkgIENpcGhlck5hbWVbcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnXSwgaSkpOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0sIHNpemVvZihzdHJ1Y3QgcnRfY2lwaGVyX2tleSkpOwogCiAJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGkpOwogCX0KLQorCVJUTVBfU0VUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7CiB9CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBcyBTVEEncyBCU1NJRCBpcyBhIFdDIHRvbywgaXQgdXNlcyBzaGFyZWQga2V5IHRhYmxlLgorCQlUaGlzIGZ1bmN0aW9uIHdyaXRlIGNvcnJlY3QgdW5pY2FzdCBUWCBrZXkgdG8gQVNJQyBXQ0lELgorCQlBbmQgd2Ugc3RpbGwgbWFrZSBhIGNvcHkgaW4gb3VyIE1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LgorCQlDYWxsZXIgZ3VhcmFudGVlIFRLSVAvQUVTIGFsd2F5cyBoYXMga2V5aWR4ID0gMC4gKHBhaXJ3aXNlIGtleSkKKwkJQ2FsbGVyIGd1YXJhbnRlZSBXRVAgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGVuIHNldCBUeGtleSwgIGRlZmF1bHQga2V5IGluZGV4PTB+My4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBLZXkJCQkJCQkJUG9pbnRlciB0byB0aGUgd2hlcmUgdGhlIGtleSBzdG9yZWQKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVUNDRVNTCQkJCQlBZGQga2V5IHN1Y2Nlc3NmdWxseQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAlSb3V0aW5lIERlc2NyaXB0aW9uOgogCQlDaGFuZ2UgTklDIFBIWSBtb2RlLiBSZS1hc3NvY2lhdGlvbiBtYXkgYmUgbmVjZXNzYXJ5LiBwb3NzaWJsZSBzZXR0aW5ncwogCQlpbmNsdWRlIC0gUEhZXzExQiwgUEhZXzExQkdfTUlYRUQsIFBIWV8xMUEsIGFuZCBQSFlfMTFBQkdfTUlYRUQKQEAgLTExNDAsMTE1ICszMDcsMTE5IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBTZXRQaHlNb2RlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVMT05HIHBoeW1vZGUpCit2b2lkIFJUTVBTZXRQaHlNb2RlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdW5zaWduZWQgbG9uZyBwaHltb2RlKQogewotCUlOVCBpOwotCS8vIHRoZSBzZWxlY3RlZCBwaHltb2RlIG11c3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBSRiBJQyBlbmNvZGVkIGluIEUyUFJPTQorCWludCBpOworCS8qIHRoZSBzZWxlY3RlZCBwaHltb2RlIG11c3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBSRiBJQyBlbmNvZGVkIGluIEUyUFJPTSAqLwogCi0JcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IChVQ0hBUilwaHltb2RlOworCS8qIGlmIG5vIGNoYW5nZSwgZG8gbm90aGluZyAqLworCS8qIGJ1ZyBmaXgKKwkgICBpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBwaHltb2RlKQorCSAgIHJldHVybjsKKwkgKi8KKwlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gKHU4KXBoeW1vZGU7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBTZXRQaHlNb2RlIDogUGh5TW9kZT0lZCwgY2hhbm5lbD0lZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRNUFNldFBoeU1vZGUgOiBQaHlNb2RlPSVkLCBjaGFubmVsPSVkIFxuIiwKKwkJICBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CiAKIAlCdWlsZENoYW5uZWxMaXN0KHBBZCk7CiAKLQkvLyBzYW5pdHkgY2hlY2sgdXNlciBzZXR0aW5nCi0JZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykKLQl7CisJLyogc2FuaXR5IGNoZWNrIHVzZXIgc2V0dGluZyAqLworCWZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspIHsKIAkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQogCQkJYnJlYWs7CiAJfQogCi0JaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKLQl7CisJaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkgewogCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gRmlyc3RDaGFubmVsKHBBZCk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTZXRQaHlNb2RlOiBjaGFubmVsIGlzIG91dCBvZiByYW5nZSwgdXNlIGZpcnN0IGNoYW5uZWw9JWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiUlRNUFNldFBoeU1vZGU6IGNoYW5uZWwgaXMgb3V0IG9mIHJhbmdlLCB1c2UgZmlyc3QgY2hhbm5lbD0lZCBcbiIsCisJCQkgIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKIAl9CiAKIAlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5TdXBSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CiAJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuRXh0UmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwogCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKIAlzd2l0Y2ggKHBoeW1vZGUpIHsKLQkJY2FzZSBQSFlfMTFCOgotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVswXSAgPSAweDgyOwkgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMV0gID0gMHg4NDsJICAvLyAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzJdICA9IDB4OEI7CSAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdICA9IDB4OTY7CSAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4gID0gNDsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4gID0gMDsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0gID0gMjsJICAgLy8gMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSAgPSA0OwkgICAvLyAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdICA9IDExOyAgICAvLyA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gID0gMjI7ICAgIC8vIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7IC8vIFRoaXMgTU9ERSBpcyBvbmx5IEZZSS4gbm90IHVzZQotCQkJYnJlYWs7CisJY2FzZSBQSFlfMTFCOgorCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzBdID0gMHg4MjsJLyogMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZSAqLworCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdID0gMHg4NDsJLyogMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZSAqLworCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzJdID0gMHg4QjsJLyogNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbM10gPSAweDk2OwkvKiAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZSAqLworCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuID0gNDsKKwkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0gPSAyOwkvKiAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0gPSA0OwkvKiAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0gPSAxMTsJLyogNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gPSAyMjsJLyogMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJLypwQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOyAvLyBUaGlzIE1PREUgaXMgb25seSBGWUkuIG5vdCB1c2UgKi8KKwkJYnJlYWs7CiAKLQkJY2FzZSBQSFlfMTFHOgotCQljYXNlIFBIWV8xMUJHX01JWEVEOgotCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKLQkJY2FzZSBQSFlfMTFOXzJfNEc6Ci0JCWNhc2UgUEhZXzExQUJHTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6Ci0JCWNhc2UgUEhZXzExR05fTUlYRUQ6Ci0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzBdICA9IDB4ODI7CSAgLy8gMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsxXSAgPSAweDg0OwkgIC8vIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMl0gID0gMHg4QjsJICAvLyA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbM10gID0gMHg5NjsJICAvLyAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs0XSAgPSAweDEyOwkgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNV0gID0gMHgyNDsJICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs2XSAgPSAweDQ4OwkgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzddICA9IDB4NmM7CSAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4gID0gODsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbMF0gID0gMHgwQzsJICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzFdICA9IDB4MTg7CSAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbMl0gID0gMHgzMDsJICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVszXSAgPSAweDYwOwkgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuICA9IDQ7Ci0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdICA9IDI7CSAgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0gID0gNDsJICAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSAgPSAxMTsgICAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdICA9IDIyOyAgICAvLyAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs0XSAgPSAxMjsgICAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSAgPSAxODsgICAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs2XSAgPSAyNDsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbN10gID0gMzY7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzhdICA9IDQ4OyAgICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs5XSAgPSA3MjsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMTBdID0gOTY7ICAgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzExXSA9IDEwODsgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJYnJlYWs7CisJY2FzZSBQSFlfMTFHOgorCWNhc2UgUEhZXzExQkdfTUlYRUQ6CisJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6CisJY2FzZSBQSFlfMTFOXzJfNEc6CisJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorCWNhc2UgUEhZXzExQkdOX01JWEVEOgorCWNhc2UgUEhZXzExR05fTUlYRUQ6CisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gPSAweDgyOwkvKiAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMV0gPSAweDg0OwkvKiAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMl0gPSAweDhCOwkvKiA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUgKi8KKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVszXSA9IDB4OTY7CS8qIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNF0gPSAweDEyOwkvKiA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNV0gPSAweDI0OwkvKiAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzZdID0gMHg0ODsJLyogMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs3XSA9IDB4NmM7CS8qIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4gPSA4OworCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzBdID0gMHgwQzsJLyogNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzFdID0gMHgxODsJLyogMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVsyXSA9IDB4MzA7CS8qIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbM10gPSAweDYwOwkvKiA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuID0gNDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSA9IDI7CS8qIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSA9IDQ7CS8qIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSA9IDExOwkvKiA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSA9IDIyOwkvKiAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdID0gMTI7CS8qIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSA9IDE4OwkvKiA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gPSAyNDsJLyogMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs3XSA9IDM2OwkvKiAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzhdID0gNDg7CS8qIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbOV0gPSA3MjsJLyogMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxMF0gPSA5NjsJLyogNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxMV0gPSAxMDg7CS8qIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCWJyZWFrOwogCi0JCWNhc2UgUEhZXzExQToKLQkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6Ci0JCWNhc2UgUEhZXzExTl81RzoKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4QzsJICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4MTI7CSAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDk4OwkgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdICA9IDB4MjQ7CSAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNF0gID0gMHhiMDsJICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs1XSAgPSAweDQ4OwkgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzZdICA9IDB4NjA7CSAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbN10gID0gMHg2YzsJICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiAgPSA4OwotCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSAwOwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAxMjsgICAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSAgPSAxODsgICAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSAgPSAyNDsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gID0gMzY7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdICA9IDQ4OyAgICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSAgPSA3MjsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gID0gOTY7ICAgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICA9IDEwODsgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsgLy8gVGhpcyBNT0RFIGlzIG9ubHkgRllJLiBub3QgdXNlCi0JCQlicmVhazsKKwljYXNlIFBIWV8xMUE6CisJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKwljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwljYXNlIFBIWV8xMU5fNUc6CisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gPSAweDhDOwkvKiA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMV0gPSAweDEyOwkvKiA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMl0gPSAweDk4OwkvKiAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZSAqLworCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdID0gMHgyNDsJLyogMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs0XSA9IDB4YjA7CS8qIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNV0gPSAweDQ4OwkvKiAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzZdID0gMHg2MDsJLyogNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs3XSA9IDB4NmM7CS8qIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4gPSA4OworCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSA9IDEyOwkvKiA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0gPSAxODsJLyogOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdID0gMjQ7CS8qIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gPSAzNjsJLyogMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs0XSA9IDQ4OwkvKiAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdID0gNzI7CS8qIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gPSA5NjsJLyogNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs3XSA9IDEwODsJLyogNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJLypwQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsgLy8gVGhpcyBNT0RFIGlzIG9ubHkgRllJLiBub3QgdXNlICovCisJCWJyZWFrOwogCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKIAl9CiAKLQogCXBBZC0+Q29tbW9uQ2ZnLkJhbmRTdGF0ZSA9IFVOS05PV05fQkFORDsKIH0KIApAQCAtMTI2NCwzNCArNDM1LDMzIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBTZXRIVCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglPSURfU0VUX0hUX1BIWU1PREUgKnBIVFBoeU1vZGUpCit2b2lkIFJUTVBTZXRIVChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9vaWRfc2V0X2h0X3BoeW1vZGUgKnBIVFBoeU1vZGUpCiB7Ci0JLy9VTE9ORwkqcG1jczsKLQlVSU5UMzIJVmFsdWUgPSAwOwotCVVDSEFSCUJCUFZhbHVlID0gMDsKLQlVQ0hBUglCQlAzVmFsdWUgPSAwOwotCVVDSEFSCVJ4U3RyZWFtID0gcEFkLT5Db21tb25DZmcuUnhTdHJlYW07CisJLyp1bnNpZ25lZCBsb25nICpwbWNzOyAqLworCXUzMiBWYWx1ZSA9IDA7CisJdTggQkJQVmFsdWUgPSAwOworCXU4IEJCUDNWYWx1ZSA9IDA7CisJdTggUnhTdHJlYW0gPSBwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbTsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZXRIVCA6IEhUX21vZGUoJWQpLCBFeHRPZmZzZXQoJWQpLCBNQ1MoJWQpLCBCVyglZCksIFNUQkMoJWQpLCBTSE9SVEdJKCVkKVxuIiwKLQkJCQkJCQkJCQlwSFRQaHlNb2RlLT5IdE1vZGUsIHBIVFBoeU1vZGUtPkV4dE9mZnNldCwKLQkJCQkJCQkJCQlwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLAotCQkJCQkJCQkJCXBIVFBoeU1vZGUtPlNUQkMsIHBIVFBoeU1vZGUtPlNIT1JUR0kpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRNUFNldEhUIDogSFRfbW9kZSglZCksIEV4dE9mZnNldCglZCksIE1DUyglZCksIEJXKCVkKSwgU1RCQyglZCksIFNIT1JUR0koJWQpXG4iLAorCQkgIHBIVFBoeU1vZGUtPkh0TW9kZSwgcEhUUGh5TW9kZS0+RXh0T2Zmc2V0LCBwSFRQaHlNb2RlLT5NQ1MsCisJCSAgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsIHBIVFBoeU1vZGUtPlNIT1JUR0kpKTsKIAotCS8vIERvbid0IHplcm8gc3VwcG9ydGVkSHlQaHkgc3RydWN0dXJlLgotCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpKTsKLQlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLCBzaXplb2YocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKSk7Ci0JUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLk5ld0V4dENoYW5PZmZzZXQsIHNpemVvZihwQWQtPkNvbW1vbkNmZy5OZXdFeHRDaGFuT2Zmc2V0KSk7Ci0JUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeSwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeSkpOworCS8qIERvbid0IHplcm8gc3VwcG9ydGVkSHlQaHkgc3RydWN0dXJlLiAqLworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCisJCSAgICAgICBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KSk7CisJUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywKKwkJICAgICAgIHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pKTsKKwlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCwKKwkJICAgICAgIHNpemVvZihwQWQtPkNvbW1vbkNmZy5OZXdFeHRDaGFuT2Zmc2V0KSk7CisJUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeSwKKwkJICAgICAgIHNpemVvZihwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkpKTsKIAotICAgCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnKQotCXsKKwlpZiAocEFkLT5Db21tb25DZmcuYlJkZykgewogCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPSAxOwogCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQgPSAxOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IDA7CiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCA9IDA7CiAJfQpAQCAtMTI5OSw4OSArNDY5LDkyIEBACiAJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IgPSAzOwogCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NYXhSQW1wZHVGYWN0b3IgPSAzOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldEhUIDogUnhCQVdpbkxpbWl0ID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRNUFNldEhUIDogUnhCQVdpbkxpbWl0ID0gJWRcbiIsCisJCSAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCkpOwogCi0JLy8gTWltbyBwb3dlciBzYXZlLCBBLU1TRFUgc2l6ZSwKLQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZTsKLQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdVNpemU7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKKwkvKiBNaW1vIHBvd2VyIHNhdmUsIEEtTVNEVSBzaXplLCAqLworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9CisJICAgICh1MTYpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlOworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUgPQorCSAgICAodTgpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzID0KKwkgICAgKHU4KXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkgPQorCSAgICAodTgpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OwogCi0JcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdVNpemU7Ci0JcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9CisJICAgICh1MTYpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9CisJICAgICh1MTYpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPQorCSAgICAodTgpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldEhUIDogQU1zZHVTaXplID0gJWQsIE1pbW9QcyA9ICVkLCBNcGR1RGVuc2l0eSA9ICVkLCBNYXhSQW1wZHVGYWN0b3IgPSAlZFxuIiwKLQkJCQkJCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplLAotCQkJCQkJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMsCi0JCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5LAotCQkJCQkJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NYXhSQW1wZHVGYWN0b3IpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRNUFNldEhUIDogQU1zZHVTaXplID0gJWQsIE1pbW9QcyA9ICVkLCBNcGR1RGVuc2l0eSA9ICVkLCBNYXhSQW1wZHVGYWN0b3IgPSAlZFxuIiwKKwkJICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMsCisJCSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5LAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NYXhSQW1wZHVGYWN0b3IpKTsKIAotCWlmKHBIVFBoeU1vZGUtPkh0TW9kZSA9PSBIVE1PREVfR0YpCi0JeworCWlmIChwSFRQaHlNb2RlLT5IdE1vZGUgPT0gSFRNT0RFX0dGKSB7CiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YgPSAxOwogCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YgPSAxOwotCX0KLQllbHNlCisJfSBlbHNlCiAJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRiA9IDA7CiAKLQkvLyBEZWNpZGUgUnggTUNTU2V0Ci0Jc3dpdGNoIChSeFN0cmVhbSkKLQl7Ci0JCWNhc2UgMToKLQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAgMHhmZjsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAgMHgwMDsKLQkJCWJyZWFrOworCS8qIERlY2lkZSBSeCBNQ1NTZXQgKi8KKwlzd2l0Y2ggKFJ4U3RyZWFtKSB7CisJY2FzZSAxOgorCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4MDA7CisJCWJyZWFrOwogCi0JCWNhc2UgMjoKLQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAgMHhmZjsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAgMHhmZjsKLQkJCWJyZWFrOworCWNhc2UgMjoKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweGZmOworCQlicmVhazsKIAotCQljYXNlIDM6IC8vIDMqMwotCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9ICAweGZmOwotCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9ICAweGZmOwotCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9ICAweGZmOwotCQkJYnJlYWs7CisJY2FzZSAzOgkJLyogMyozICovCisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHhmZjsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9IDB4ZmY7CisJCWJyZWFrOwogCX0KIAotCWlmIChwQWQtPkNvbW1vbkNmZy5iRm9ydHlfTWh6X0ludG9sZXJhbnQgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpICYmIChwSFRQaHlNb2RlLT5CVyA9PSBCV180MCkgKQotCXsKKwlpZiAocEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50CisJICAgICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSAmJiAocEhUUGh5TW9kZS0+QlcgPT0gQldfNDApKSB7CiAJCXBIVFBoeU1vZGUtPkJXID0gQldfMjA7CiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uRm9ydHlfTWh6X0ludG9sZXJhbnQgPSAxOwogCX0KIAotCWlmKHBIVFBoeU1vZGUtPkJXID09IEJXXzQwKQotCXsKLQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFs0XSA9IDB4MTsgLy8gTUNTIDMyCisJaWYgKHBIVFBoeU1vZGUtPkJXID09IEJXXzQwKSB7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0gPSAweDE7CS8qIE1DUyAzMiAqLwogCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IDE7CiAJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQogCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DQ0ttb2RlaW40MCA9IDE7CiAKIAkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9IDE7CiAJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9IDE7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9IChwSFRQaHlNb2RlLT5FeHRPZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKT8gKEVYVENIQV9CRUxPVyk6IEVYVENIQV9BQk9WRTsKLQkJLy8gU2V0IFJlZ3NpdGVyIGZvciBleHRlbnNpb24gY2hhbm5lbCBwb3NpdGlvbi4KKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID0KKwkJICAgIChwSFRQaHlNb2RlLT5FeHRPZmZzZXQgPT0KKwkJICAgICBFWFRDSEFfQkVMT1cpID8gKEVYVENIQV9CRUxPVykgOiBFWFRDSEFfQUJPVkU7CisJCS8qIFNldCBSZWdzaXRlciBmb3IgZXh0ZW5zaW9uIGNoYW5uZWwgcG9zaXRpb24uICovCiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CiAJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUDNWYWx1ZSk7Ci0JCWlmICgocEhUUGh5TW9kZS0+RXh0T2Zmc2V0ID09IEVYVENIQV9CRUxPVykpCi0JCXsKKwkJaWYgKChwSFRQaHlNb2RlLT5FeHRPZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSkgewogCQkJVmFsdWUgfD0gMHgxOwogCQkJQkJQM1ZhbHVlIHw9ICgweDIwKTsKIAkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQUJPVkUpKQotCQl7CisJCX0gZWxzZSBpZiAoKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQUJPVkUpKSB7CiAJCQlWYWx1ZSAmPSAweGZlOwogCQkJQkJQM1ZhbHVlICY9ICh+MHgyMCk7CiAJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOwogCQl9Ci0KLQkJLy8gVHVybiBvbiBCQlAgNDBNSHogbW9kZSBub3cgb25seSBhcyBBUCAuCi0JCS8vIFN0YSBjYW4gdHVybiBvbiBCQlAgNDBNSHogYWZ0ZXIgY29ubmVjdGlvbiB3aXRoIDQwTUh6IEFQLiBTdGEgb25seSBicm9hZGNhc3QgNDBNSHogY2FwYWJpbGl0eSBiZWZvcmUgY29ubmVjdGlvbi4KKwkJLyogVHVybiBvbiBCQlAgNDBNSHogbW9kZSBub3cgb25seSBhcyBBUCAuICovCisJCS8qIFN0YSBjYW4gdHVybiBvbiBCQlAgNDBNSHogYWZ0ZXIgY29ubmVjdGlvbiB3aXRoIDQwTUh6IEFQLiBTdGEgb25seSBicm9hZGNhc3QgNDBNSHogY2FwYWJpbGl0eSBiZWZvcmUgY29ubmVjdGlvbi4gKi8KIAkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApIHx8IElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKQotCQkJKQotCQl7CisJCSAgICApIHsKIAkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKIAkJCUJCUFZhbHVlICY9ICh+MHgxOCk7CiAJCQlCQlBWYWx1ZSB8PSAweDEwOwpAQCAtMTM5MCwxNSArNTYzLDEzIEBACiAJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlAzVmFsdWUpOwogCQkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CiAJCX0KLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IDA7CiAJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGggPSAwOwogCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGggPSAwOwogCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPSBFWFRDSEFfTk9ORTsKIAkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCQkvLyBUdXJuIG9uIEJCUCAyME1IeiBtb2RlIGJ5IHJlcXVlc3QgaGVyZS4KKwkJLyogVHVybiBvbiBCQlAgMjBNSHogbW9kZSBieSByZXF1ZXN0IGhlcmUuICovCiAJCXsKIAkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKIAkJCUJCUFZhbHVlICY9ICh+MHgxOCk7CkBAIC0xNDA3LDQyICs1NzgsMzUgQEAKIAkJfQogCX0KIAotCWlmKHBIVFBoeU1vZGUtPlNUQkMgPT0gU1RCQ19VU0UpCi0JeworCWlmIChwSFRQaHlNb2RlLT5TVEJDID09IFNUQkNfVVNFKSB7CiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDID0gMTsKIAkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQyA9IDE7CiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDID0gMTsKIAkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlJ4U1RCQyA9IDE7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQyA9IDA7CiAJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5SeFNUQkMgPSAwOwogCX0KIAotCWlmKHBIVFBoeU1vZGUtPlNIT1JUR0kgPT0gR0lfNDAwKQotCXsKKwlpZiAocEhUUGh5TW9kZS0+U0hPUlRHSSA9PSBHSV80MDApIHsKIAkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjAgPSAxOwogCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9IDE7CiAJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjAgPSAxOwogCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwID0gMTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IDA7CiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gMDsKIAkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCA9IDA7CiAJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSAwOwogCX0KIAotCS8vIFdlIHN1cHBvcnQgbGluayBhZGFwdGF0aW9uIGZvciB1bnNvbGljaXQgTUNTIGZlZWRiYWNrLCBzZXQgdG8gMi4KLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID0gTUNTRkJLX05PTkU7IC8vTUNTRkJLX1VOU09MSUNJVDsKKwkvKiBXZSBzdXBwb3J0IGxpbmsgYWRhcHRhdGlvbiBmb3IgdW5zb2xpY2l0IE1DUyBmZWVkYmFjaywgc2V0IHRvIDIuICovCisJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9IE1DU0ZCS19OT05FOwkvKk1DU0ZCS19VTlNPTElDSVQ7ICovCiAJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkNvbnRyb2xDaGFuID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQkvLyAxLCB0aGUgZXh0ZW5zaW9uIGNoYW5uZWwgYWJvdmUgdGhlIGNvbnRyb2wgY2hhbm5lbC4KKwkvKiAxLCB0aGUgZXh0ZW5zaW9uIGNoYW5uZWwgYWJvdmUgdGhlIGNvbnRyb2wgY2hhbm5lbC4gKi8KIAotCS8vIEVEQ0EgcGFyYW1ldGVycyB1c2VkIGZvciBBUCdzIG93biB0cmFuc21pc3Npb24KLQlpZiAocEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPT0gRkFMU0UpCi0JeworCS8qIEVEQ0EgcGFyYW1ldGVycyB1c2VkIGZvciBBUCdzIG93biB0cmFuc21pc3Npb24gKi8KKwlpZiAocEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPT0gRkFMU0UpIHsKIAkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPSBUUlVFOwogCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzBdID0gMzsKIAkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblsxXSA9IDc7CkBAIC0xNDU5LDE0ICs2MjMsMTcgQEAKIAkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsyXSA9IDQ7CiAJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbM10gPSAzOwogCi0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFswXSAgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMV0gID0gMDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdICA9IDk0OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbM10gID0gNDc7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFswXSA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFsxXSA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFsyXSA9IDk0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbM10gPSA0NzsKIAl9CiAJQXNpY1NldEVkY2FQYXJtKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0pOwogCi0JUlRNUFNldEluZGl2aWR1YWxIVChwQWQsIDApOworCXsKKwkJUlRNUFNldEluZGl2aWR1YWxIVChwQWQsIDApOworCX0KKwogfQogCiAvKgpAQCAtMTQ4MSwxMTIgKzY0OCwxMDMgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRNUFNldEluZGl2aWR1YWxIVCgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JVUNIQVIJCQkJYXBpZHgpCit2b2lkIFJUTVBTZXRJbmRpdmlkdWFsSFQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBhcGlkeCkKIHsKLQlQUlRfSFRfUEhZX0lORk8JCXBEZXNpcmVkX2h0X3BoeSA9IE5VTEw7Ci0JVUNIQVIJVHhTdHJlYW0gPSBwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbTsKLQlVQ0hBUglEZXNpcmVkTWNzCT0gTUNTX0FVVE87CisJc3RydWN0IHJ0X2h0X3BoeV9pbmZvICpwRGVzaXJlZF9odF9waHkgPSBOVUxMOworCXU4IFR4U3RyZWFtID0gcEFkLT5Db21tb25DZmcuVHhTdHJlYW07CisJdTggRGVzaXJlZE1jcyA9IE1DU19BVVRPOwogCi0JZG8KLQl7CisJZG8gewogCQl7CiAJCQlwRGVzaXJlZF9odF9waHkgPSAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mbzsKLQkJCURlc2lyZWRNY3MgPSBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKLQkJCS8vcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykgPyBUUlVFIDogRkFMU0U7Ci0JCQkJYnJlYWs7CisJCQlEZXNpcmVkTWNzID0KKwkJCSAgICBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKKwkJCS8qcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykgPyBUUlVFIDogRkFMU0U7ICovCisJCQlicmVhazsKIAkJfQogCX0gd2hpbGUgKEZBTFNFKTsKIAotCWlmIChwRGVzaXJlZF9odF9waHkgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IGludmFsaWQgYXBpZHgoJWQpXG4iLCBhcGlkeCkpOworCWlmIChwRGVzaXJlZF9odF9waHkgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IGludmFsaWQgYXBpZHgoJWQpXG4iLCBhcGlkeCkpOwogCQlyZXR1cm47CiAJfQotCVJUTVBaZXJvTWVtb3J5KHBEZXNpcmVkX2h0X3BoeSwgc2l6ZW9mKFJUX0hUX1BIWV9JTkZPKSk7CisJUlRNUFplcm9NZW1vcnkocERlc2lyZWRfaHRfcGh5LCBzaXplb2Yoc3RydWN0IHJ0X2h0X3BoeV9pbmZvKSk7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SW5kaXZpZHVhbEhUIDogRGVzaXJlZCBNQ1MgPSAlZFxuIiwgRGVzaXJlZE1jcykpOwotCS8vIENoZWNrIHRoZSB2YWxpZGl0eSBvZiBNQ1MKLQlpZiAoKFR4U3RyZWFtID09IDEpICYmICgoRGVzaXJlZE1jcyA+PSBNQ1NfOCkgJiYgKERlc2lyZWRNY3MgPD0gTUNTXzE1KSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IE1DUyglZCkgaXMgaW52YWxpZCBpbiAxUywgcmVzZXQgaXQgYXMgTUNTXzdcbiIsIERlc2lyZWRNY3MpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRNUFNldEluZGl2aWR1YWxIVCA6IERlc2lyZWQgTUNTID0gJWRcbiIsIERlc2lyZWRNY3MpKTsKKwkvKiBDaGVjayB0aGUgdmFsaWRpdHkgb2YgTUNTICovCisJaWYgKChUeFN0cmVhbSA9PSAxKQorCSAgICAmJiAoKERlc2lyZWRNY3MgPj0gTUNTXzgpICYmIChEZXNpcmVkTWNzIDw9IE1DU18xNSkpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkgKCJSVE1QU2V0SW5kaXZpZHVhbEhUOiBNQ1MoJWQpIGlzIGludmFsaWQgaW4gMVMsIHJlc2V0IGl0IGFzIE1DU183XG4iLAorCQkJICBEZXNpcmVkTWNzKSk7CiAJCURlc2lyZWRNY3MgPSBNQ1NfNzsKIAl9CiAKLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGggPT0gQldfMjApICYmIChEZXNpcmVkTWNzID09IE1DU18zMikpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IE1DU18zMiBpcyBvbmx5IHN1cHBvcnRlZCBpbiA0MC1NSHosIHJlc2V0IGl0IGFzIE1DU18wXG4iKSk7CisJaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID09IEJXXzIwKQorCSAgICAmJiAoRGVzaXJlZE1jcyA9PSBNQ1NfMzIpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkgKCJSVE1QU2V0SW5kaXZpZHVhbEhUOiBNQ1NfMzIgaXMgb25seSBzdXBwb3J0ZWQgaW4gNDAtTUh6LCByZXNldCBpdCBhcyBNQ1NfMFxuIikpOwogCQlEZXNpcmVkTWNzID0gTUNTXzA7CiAJfQogCiAJcERlc2lyZWRfaHRfcGh5LT5iSHRFbmFibGUgPSBUUlVFOwogCi0JLy8gRGVjaWRlIGRlc2lyZWQgVHggTUNTCi0Jc3dpdGNoIChUeFN0cmVhbSkKLQl7Ci0JCWNhc2UgMToKLQkJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKQotCQkJewotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdPSAweGZmOwotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdPSAweDAwOwotCQkJfQotCQkJZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfNykKLQkJCXsKLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMTw8RGVzaXJlZE1jczsKLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHgwMDsKLQkJCX0KLQkJCWJyZWFrOworCS8qIERlY2lkZSBkZXNpcmVkIFR4IE1DUyAqLworCXN3aXRjaCAoVHhTdHJlYW0pIHsKKwljYXNlIDE6CisJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKSB7CisJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXSA9IDB4ZmY7CisJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXSA9IDB4MDA7CisJCX0gZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfNykgeworCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMF0gPSAxIDw8IERlc2lyZWRNY3M7CisJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXSA9IDB4MDA7CisJCX0KKwkJYnJlYWs7CiAKLQkJY2FzZSAyOgotCQkJaWYgKERlc2lyZWRNY3MgPT0gTUNTX0FVVE8pCi0JCQl7Ci0JCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMF09IDB4ZmY7Ci0JCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMV09IDB4ZmY7Ci0JCQl9Ci0JCQllbHNlIGlmIChEZXNpcmVkTWNzIDw9IE1DU18xNSkKLQkJCXsKLQkJCQlVTE9ORyBtb2RlOworCWNhc2UgMjoKKwkJaWYgKERlc2lyZWRNY3MgPT0gTUNTX0FVVE8pIHsKKwkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdID0gMHhmZjsKKwkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdID0gMHhmZjsKKwkJfSBlbHNlIGlmIChEZXNpcmVkTWNzIDw9IE1DU18xNSkgeworCQkJdW5zaWduZWQgbG9uZyBtb2RlOwogCi0JCQkJbW9kZSA9IERlc2lyZWRNY3MgLyA4OwotCQkJCWlmIChtb2RlIDwgMikKLQkJCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbbW9kZV0gPSAoMSA8PCAoRGVzaXJlZE1jcyAtIG1vZGUgKiA4KSk7Ci0JCQl9Ci0JCQlicmVhazsKKwkJCW1vZGUgPSBEZXNpcmVkTWNzIC8gODsKKwkJCWlmIChtb2RlIDwgMikKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFttb2RlXSA9CisJCQkJICAgICgxIDw8IChEZXNpcmVkTWNzIC0gbW9kZSAqIDgpKTsKKwkJfQorCQlicmVhazsKIAotCQljYXNlIDM6IC8vIDMqMwotCQkJaWYgKERlc2lyZWRNY3MgPT0gTUNTX0FVVE8pCi0JCQl7Ci0JCQkJLyogTUNTMCB+IE1DUzIzLCAzIGJ5dGVzICovCi0JCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMF09IDB4ZmY7Ci0JCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMV09IDB4ZmY7Ci0JCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMl09IDB4ZmY7Ci0JCQl9Ci0JCQllbHNlIGlmIChEZXNpcmVkTWNzIDw9IE1DU18yMykKLQkJCXsKLQkJCQlVTE9ORyBtb2RlOworCWNhc2UgMzoJCS8qIDMqMyAqLworCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykgeworCQkJLyogTUNTMCB+IE1DUzIzLCAzIGJ5dGVzICovCisJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXSA9IDB4ZmY7CisJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXSA9IDB4ZmY7CisJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsyXSA9IDB4ZmY7CisJCX0gZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfMjMpIHsKKwkJCXVuc2lnbmVkIGxvbmcgbW9kZTsKIAotCQkJCW1vZGUgPSBEZXNpcmVkTWNzIC8gODsKLQkJCQlpZiAobW9kZSA8IDMpCi0JCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0W21vZGVdID0gKDEgPDwgKERlc2lyZWRNY3MgLSBtb2RlICogOCkpOwotCQkJfQotCQkJYnJlYWs7CisJCQltb2RlID0gRGVzaXJlZE1jcyAvIDg7CisJCQlpZiAobW9kZSA8IDMpCisJCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbbW9kZV0gPQorCQkJCSAgICAoMSA8PCAoRGVzaXJlZE1jcyAtIG1vZGUgKiA4KSk7CisJCX0KKwkJYnJlYWs7CiAJfQogCi0JaWYocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9PSBCV180MCkKLQl7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGggPT0gQldfNDApIHsKIAkJaWYgKERlc2lyZWRNY3MgPT0gTUNTX0FVVE8gfHwgRGVzaXJlZE1jcyA9PSBNQ1NfMzIpCiAJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFs0XSA9IDB4MTsKIAl9Ci0KLQkvLyB1cGRhdGUgSFQgUmF0ZSBzZXR0aW5nCi0gICAgaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0gICAgICAgIE1sbWVVcGRhdGVIdFR4UmF0ZXMocEFkLCBCU1MwKTsKLSAgICBlbHNlCi0JICAgIE1sbWVVcGRhdGVIdFR4UmF0ZXMocEFkLCBhcGlkeCk7CisJLyogdXBkYXRlIEhUIFJhdGUgc2V0dGluZyAqLworCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQlNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgQlNTMCk7CisJZWxzZQorCQlNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgYXBpZHgpOwogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJUm91dGluZSBEZXNjcmlwdGlvbjoKQEAgLTE1OTUsMzYgKzc1MywzNCBAQAogCUFyZ3VtZW50czoKIAkJU2VuZCBhbGwgSFQgSUUgaW4gYmVhY29uL3Byb2JlIHJzcC9hc3NvYyByc3AvYWN0aW9uIGZyYW1lLgogCi0KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBVcGRhdGVIVElFKAotCUlOCVJUX0hUX0NBUEFCSUxJVFkJKnBSdEh0LAotCUlOCQlVQ0hBUgkJCQkqcE1jc1NldCwKLQlPVVQJCUhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JT1VUCQlBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pCit2b2lkIFJUTVBVcGRhdGVIVElFKHN0cnVjdCBydF9odF9jYXBhYmlsaXR5ICpwUnRIdCwKKwkJICAgIHU4ICogcE1jc1NldCwKKwkJICAgIHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llICogcEh0Q2FwYWJpbGl0eSwKKwkJICAgIHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSAqIHBBZGRIdEluZm8pCiB7Ci0JUlRNUFplcm9NZW1vcnkocEh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLQlSVE1QWmVyb01lbW9yeShwQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKwlSVE1QWmVyb01lbW9yeShwSHRDYXBhYmlsaXR5LCBzaXplb2Yoc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUpKTsKKwlSVE1QWmVyb01lbW9yeShwQWRkSHRJbmZvLCBzaXplb2Yoc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llKSk7CiAKLQkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IHBSdEh0LT5DaGFubmVsV2lkdGg7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHMgPSBwUnRIdC0+TWltb1BzOwotCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YgPSBwUnRIdC0+R0Y7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjAgPSBwUnRIdC0+U2hvcnRHSWZvcjIwOwotCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gcFJ0SHQtPlNob3J0R0lmb3I0MDsKLQkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQyA9IHBSdEh0LT5UeFNUQkM7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5SeFNUQkMgPSBwUnRIdC0+UnhTVEJDOwotCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQU1zZHVTaXplID0gcFJ0SHQtPkFtc2R1U2l6ZTsKLQkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvciA9IHBSdEh0LT5NYXhSQW1wZHVGYWN0b3I7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IHBSdEh0LT5NcGR1RGVuc2l0eTsKKwlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gcFJ0SHQtPkNoYW5uZWxXaWR0aDsKKwlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uTWltb1BzID0gcFJ0SHQtPk1pbW9QczsKKwlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YgPSBwUnRIdC0+R0Y7CisJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IHBSdEh0LT5TaG9ydEdJZm9yMjA7CisJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9IHBSdEh0LT5TaG9ydEdJZm9yNDA7CisJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQyA9IHBSdEh0LT5UeFNUQkM7CisJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlJ4U1RCQyA9IHBSdEh0LT5SeFNUQkM7CisJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkFNc2R1U2l6ZSA9IHBSdEh0LT5BbXNkdVNpemU7CisJcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvciA9IHBSdEh0LT5NYXhSQW1wZHVGYWN0b3I7CisJcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gcFJ0SHQtPk1wZHVEZW5zaXR5OwogCi0JCXBBZGRIdEluZm8tPkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID0gcFJ0SHQtPkV4dENoYW5PZmZzZXQgOwotCQlwQWRkSHRJbmZvLT5BZGRIdEluZm8uUmVjb21XaWR0aCA9IHBSdEh0LT5SZWNvbVdpZHRoOwotCQlwQWRkSHRJbmZvLT5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSA9IHBSdEh0LT5PcGVyYWlvbk1vZGU7Ci0JCXBBZGRIdEluZm8tPkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gcFJ0SHQtPk5vbkdmUHJlc2VudDsKLQkJUlRNUE1vdmVNZW1vcnkocEFkZEh0SW5mby0+TUNTU2V0LCAvKnBSdEh0LT5NQ1NTZXQqL3BNY3NTZXQsIDQpOyAvLyBydDI4NjAgb25seSBzdXBwb3J0IE1DUyBtYXg9MzIsIG5vIG5lZWQgdG8gY29weSBhbGwgMTYgdWNoYXIuCisJcEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPSBwUnRIdC0+RXh0Q2hhbk9mZnNldDsKKwlwQWRkSHRJbmZvLT5BZGRIdEluZm8uUmVjb21XaWR0aCA9IHBSdEh0LT5SZWNvbVdpZHRoOworCXBBZGRIdEluZm8tPkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlID0gcFJ0SHQtPk9wZXJhaW9uTW9kZTsKKwlwQWRkSHRJbmZvLT5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IHBSdEh0LT5Ob25HZlByZXNlbnQ7CisJUlRNUE1vdmVNZW1vcnkocEFkZEh0SW5mby0+TUNTU2V0LCAvKnBSdEh0LT5NQ1NTZXQgKi8gcE1jc1NldCwgNCk7CS8qIHJ0Mjg2MCBvbmx5IHN1cHBvcnQgTUNTIG1heD0zMiwgbm8gbmVlZCB0byBjb3B5IGFsbCAxNiB1Y2hhci4gKi8KIAotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBVcGRhdGVIVElFIDw9PSBcbiIpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QVXBkYXRlSFRJRSA8PT0gXG4iKSk7CiB9CiAKIC8qCkBAIC0xNjM0LDc4ICs3OTAsNzEgQEAKICAgICBSZXR1cm46CiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJQnNzSWR4LAotCUlOIAlVQ0hBUgkJIAlLZXlJZHgsCi0JSU4gCVVDSEFSCQkgCUNpcGhlckFsZywKLQlJTiAJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpCit2b2lkIFJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIHU4IEJzc0lkeCwKKwkJCSAgICAgICB1OCBLZXlJZHgsCisJCQkgICAgICAgdTggQ2lwaGVyQWxnLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpCiB7Ci0JVUlOVDMyCQlXQ0lEQXR0cmkgPSAwOwotCVVTSE9SVAkJb2Zmc2V0OwotCVVDSEFSCQlJVkVJViA9IDA7Ci0JVVNIT1JUCQlXY2lkID0gMDsKKwl1MzIgV0NJREF0dHJpID0gMDsKKwl1MTYgb2Zmc2V0OworCXU4IElWRUlWID0gMDsKKwl1MTYgV2NpZCA9IDA7CiAKIAl7CiAJCXsKLQkJCWlmIChCc3NJZHggPiBCU1MwKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnk6IFRoZSBCU1MtaW5kZXgoJWQpIGlzIG91dCBvZiByYW5nZSBmb3IgSW5mcmEgbGluay4gXG4iLCBCc3NJZHgpKTsKKwkJCWlmIChCc3NJZHggPiBCU1MwKSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCSAoIlJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnk6IFRoZSBCU1MtaW5kZXgoJWQpIGlzIG91dCBvZiByYW5nZSBmb3IgSW5mcmEgbGluay4gXG4iLAorCQkJCQkgIEJzc0lkeCkpOwogCQkJCXJldHVybjsKIAkJCX0KLQotCQkJLy8gMS4JSW4gQURIT0MgbW9kZSwgdGhlIEFJRCBpcyB3Y2lkIG51bWJlci4gQW5kIE5PIG1lc2ggbGluayBleGlzdHMuCi0JCQkvLyAyLglJbiBJbmZyYSBtb2RlLCB0aGUgQUlEOjEgTVVTVCBiZSB3Y2lkIG9mIGluZnJhIFNUQS4KLQkJCS8vCQkJCQkgICB0aGUgQUlEOjJ+IGFzc2lnbiB0byBtZXNoIGxpbmsgZW50cnkuCi0JCQlpZiAocEVudHJ5ICYmIEFESE9DX09OKHBBZCkpCisJCQkvKiAxLiAgIEluIEFESE9DIG1vZGUsIHRoZSBBSUQgaXMgd2NpZCBudW1iZXIuIEFuZCBOTyBtZXNoIGxpbmsgZXhpc3RzLiAqLworCQkJLyogMi4gICBJbiBJbmZyYSBtb2RlLCB0aGUgQUlEOjEgTVVTVCBiZSB3Y2lkIG9mIGluZnJhIFNUQS4gKi8KKwkJCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQUlEOjJ+IGFzc2lnbiB0byBtZXNoIGxpbmsgZW50cnkuICovCisJCQlpZiAocEVudHJ5KQogCQkJCVdjaWQgPSBwRW50cnktPkFpZDsKLQkJCWVsc2UgaWYgKHBFbnRyeSAmJiBJTkZSQV9PTihwQWQpKQotCQkJewotCQkJCVdjaWQgPSBCU1NJRF9XQ0lEOwotCQkJfQogCQkJZWxzZQogCQkJCVdjaWQgPSBNQ0FTVF9XQ0lEOwogCQl9CiAJfQogCi0JLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlCisJLyogVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlICovCiAJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoV2NpZCAqIEhXX1dDSURfQVRUUklfU0laRSk7CiAKIAl7CiAJCWlmIChwRW50cnkgJiYgcEVudHJ5LT5WYWxpZEFzTWVzaCkKLQkJCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpIHwgUEFJUldJU0VLRVlUQUJMRTsKKwkJCVdDSURBdHRyaSA9IChDaXBoZXJBbGcgPDwgMSkgfCBQQUlSV0lTRUtFWVRBQkxFOwogCQllbHNlCi0JCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKSB8IFNIQVJFREtFWVRBQkxFOworCQkJV0NJREF0dHJpID0gKENpcGhlckFsZyA8PCAxKSB8IFNIQVJFREtFWVRBQkxFOwogCX0KIAogCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKIAotCi0JLy8gVXBkYXRlIElWL0VJViB0YWJsZQorCS8qIFVwZGF0ZSBJVi9FSVYgdGFibGUgKi8KIAlvZmZzZXQgPSBNQUNfSVZFSVZfVEFCTEVfQkFTRSArIChXY2lkICogSFdfSVZFSVZfRU5UUllfU0laRSk7CiAKLQkvLyBXUEEgbW9kZQotCWlmICgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKSB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSkKLQl7Ci0JCS8vIEVpdiBiaXQgb24uIGtleWlkIGFsd2F5cyBpcyAwIGZvciBwYWlyd2lzZSBrZXkKLQkJSVZFSVYgPSAoS2V5SWR4IDw8NikgfCAweDIwOwotCX0KLQllbHNlCi0JewotCQkvLyBXRVAgS2V5SWR4IGlzIGRlZmF1bHQgdHgga2V5LgorCS8qIFdQQSBtb2RlICovCisJaWYgKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8IChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKQorCSAgICB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKSB7CisJCS8qIEVpdiBiaXQgb24uIGtleWlkIGFsd2F5cyBpcyAwIGZvciBwYWlyd2lzZSBrZXkgKi8KKwkJSVZFSVYgPSAoS2V5SWR4IDw8IDYpIHwgMHgyMDsKKwl9IGVsc2UgeworCQkvKiBXRVAgS2V5SWR4IGlzIGRlZmF1bHQgdHgga2V5LiAqLwogCQlJVkVJViA9IChLZXlJZHggPDwgNik7CiAJfQogCi0JLy8gRm9yIGtleSBpbmRleCBhbmQgZXh0IElWIGJpdCwgc28gb25seSBuZWVkIHRvIHVwZGF0ZSB0aGUgcG9zaXRpb24ob2Zmc2V0KzMpLgotI2lmZGVmIFJUMjg2MAotCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0KzMsIElWRUlWKTsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCVJUVVNCTXVsdGlXcml0ZV9PbmVCeXRlKHBBZCwgb2Zmc2V0KzMsICZJVkVJVik7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisJLyogRm9yIGtleSBpbmRleCBhbmQgZXh0IElWIGJpdCwgc28gb25seSBuZWVkIHRvIHVwZGF0ZSB0aGUgcG9zaXRpb24ob2Zmc2V0KzMpLiAqLworI2lmZGVmIFJUTVBfTUFDX1BDSQorCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgMywgSVZFSVYpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCVJUVVNCTXVsdGlXcml0ZV9PbmVCeXRlKHBBZCwgb2Zmc2V0ICsgMywgJklWRUlWKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeTogV0NJRCAjJWQsIEtleUluZGV4ICMlZCwgQWxnPSVzXG4iLFdjaWQsIEtleUlkeCwgQ2lwaGVyTmFtZVtDaXBoZXJBbGddKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIJV0NJREF0dHJpID0gMHgleCBcbiIsICBXQ0lEQXR0cmkpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeTogV0NJRCAjJWQsIEtleUluZGV4ICMlZCwgQWxnPSVzXG4iLAorCQkgIFdjaWQsIEtleUlkeCwgQ2lwaGVyTmFtZVtDaXBoZXJBbGddKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCVdDSURBdHRyaSA9IDB4JXggXG4iLCBXQ0lEQXR0cmkpKTsKIAogfQogCkBAIC0xNzIzLDE1MjQgKzg3Miw4NCBAQAogICAgIE5vdGU6CiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1DSEFSICpHZXRFbmNyeXB0VHlwZShDSEFSIGVuYykKK2NoYXIgKkdldEVuY3J5cHRUeXBlKGNoYXIgZW5jKQogewotICAgIGlmKGVuYyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0gICAgICAgIHJldHVybiAiTk9ORSI7Ci0gICAgaWYoZW5jID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQotICAgIAlyZXR1cm4gIldFUCI7Ci0gICAgaWYoZW5jID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0gICAgCXJldHVybiAiVEtJUCI7Ci0gICAgaWYoZW5jID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0gICAgCXJldHVybiAiQUVTIjsKLQlpZihlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZCkKLSAgICAJcmV0dXJuICJUS0lQQUVTIjsKLSAgICBlbHNlCi0gICAgCXJldHVybiAiVU5LTk9XIjsKLX0KLQotQ0hBUiAqR2V0QXV0aE1vZGUoQ0hBUiBhdXRoKQotewotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLSAgICAJcmV0dXJuICJPUEVOIjsKLSAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKLSAgICAJcmV0dXJuICJTSEFSRUQiOwotCWlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkKLSAgICAJcmV0dXJuICJBVVRPV0VQIjsKLSAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAJcmV0dXJuICJXUEEiOwotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQotICAgIAlyZXR1cm4gIldQQVBTSyI7Ci0gICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotICAgIAlyZXR1cm4gIldQQU5PTkUiOwotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKLSAgICAJcmV0dXJuICJXUEEyIjsKLSAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0gICAgCXJldHVybiAiV1BBMlBTSyI7Ci0JaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMikKLSAgICAJcmV0dXJuICJXUEExV1BBMiI7Ci0JaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykKLSAgICAJcmV0dXJuICJXUEExUFNLV1BBMlBTSyI7Ci0KLSAgICAJcmV0dXJuICJVTktOT1ciOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIEdldCBzaXRlIHN1cnZleSByZXN1bHRzCi0JQXJndW1lbnRzOgotCSAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCSAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgTm9uZQotCi0gICAgTm90ZToKLSAgICAgICAgVXNhZ2U6Ci0gICAgICAgIAkJMS4pIFVJIG5lZWRzIHRvIHdhaXQgNCBzZWNvbmRzIGFmdGVyIGlzc3VlIGEgc2l0ZSBzdXJ2ZXkgY29tbWFuZAotICAgICAgICAJCTIuKSBpd3ByaXYgcmEwIGdldF9zaXRlX3N1cnZleQotICAgICAgICAJCTMuKSBVSSBuZWVkcyB0byBwcmVwYXJlIGF0IGxlYXN0IDQwOTZieXRlcyB0byBnZXQgdGhlIHJlc3VsdHMKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLSNkZWZpbmUJTElORV9MRU4JKDQrMzMrMjArOCsxMCs5KzcrMykJLy8gQ2hhbm5lbCtTU0lEK0Jzc2lkK1dlcFN0YXR1cytBdXRoTW9kZStTaWduYWwrV2lyZXNzTW9kZStOZXR3b3JrVHlwZQotVk9JRCBSVE1QSW9jdGxHZXRTaXRlU3VydmV5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEpCi17Ci0JQ0hBUgkJKm1zZzsKLQlJTlQgCQlpPTA7Ci0JSU5UCQkJV2FpdENudDsKLQlJTlQgCQlTdGF0dXM9MDsKLQlDSEFSCQlTc2lkW01BWF9MRU5fT0ZfU1NJRCArMV07Ci0gICAgSU5UICAgICAgICAgUnNzaSA9IDAsIG1heF9sZW4gPSBMSU5FX0xFTjsKLQlVSU5UICAgICAgICBSc3NpX1F1YWxpdHkgPSAwOwotCU5ESVNfODAyXzExX05FVFdPUktfVFlQRSAgICB3aXJlbGVzc19tb2RlOwotCi0Jb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmbXNnLCBzaXplb2YoQ0hBUikqKChNQVhfTEVOX09GX0JTU19UQUJMRSkqbWF4X2xlbikpOwotCi0JaWYgKG1zZyA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUElvY3RsR2V0U2l0ZVN1cnZleSAtIG1zZyBtZW1vcnkgYWxsb2MgZmFpbC5cbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCW1lbXNldChtc2csIDAgLChNQVhfTEVOX09GX0JTU19UQUJMRSkqbWF4X2xlbiApOwotCW1lbXNldChTc2lkLCAwICwoTUFYX0xFTl9PRl9TU0lEICsxKSk7Ci0Jc3ByaW50Zihtc2csIiVzIiwiXG4iKTsKLQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS00cyUtMzNzJS0yMHMlLThzJS0xMHMlLTlzJS03cyUtM3NcbiIsCi0JICAgICJDaCIsICJTU0lEIiwgIkJTU0lEIiwgIkVuYyIsICJBdXRoIiwgIlNpZ2FubCglKSIsICJXLU1vZGUiLCAiIE5UIik7Ci0KLQlXYWl0Q250ID0gMDsKLQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOwotCi0Jd2hpbGUgKChTY2FuUnVubmluZyhwQWRhcHRlcikgPT0gVFJVRSkgJiYgKFdhaXRDbnQrKyA8IDIwMCkpCi0JCU9TX1dBSVQoNTAwKTsKLQotCWZvcihpPTA7IGk8cEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIgO2krKykKLQl7Ci0JCWlmKCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsPT0wKQotCQkJYnJlYWs7Ci0KLQkJaWYoKHN0cmxlbihtc2cpK21heF9sZW4gKSA+PSBJV19TQ0FOX01BWF9EQVRBKQotCQkJYnJlYWs7Ci0KLQkJLy9DaGFubmVsCi0JCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRkIiwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbCk7Ci0JCS8vU1NJRAotCQltZW1jcHkoU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbik7Ci0JCVNzaWRbcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbl0gPSAnXDAnOwotCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0zM3MiLCBTc2lkKTsKLQkJLy9CU1NJRAotCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggICAiLAotCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbMF0sCi0JCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFsxXSwKLQkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzJdLAotCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbM10sCi0JCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFs0XSwKLQkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzVdKTsKLQkJLy9FbmNyeXB0aW9uIFR5cGUKLQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtOHMiLEdldEVuY3J5cHRUeXBlKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldlcFN0YXR1cykpOwotCQkvL0F1dGhlbnRpY2F0aW9uIE1vZGUKLQkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTEwcyIsICJVTktOT1ciKTsKLQkJZWxzZQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBzIixHZXRBdXRoTW9kZShwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5BdXRoTW9kZSkpOwotCQkvLyBSc3NpCi0JCVJzc2kgPSAoSU5UKXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2k7Ci0JCWlmIChSc3NpID49IC01MCkKLQkJCVJzc2lfUXVhbGl0eSA9IDEwMDsKLQkJZWxzZSBpZiAoUnNzaSA+PSAtODApICAgIC8vIGJldHdlZW4gLTUwIH4gLTgwZGJtCi0JCQlSc3NpX1F1YWxpdHkgPSAoVUlOVCkoMjQgKyAoKFJzc2kgKyA4MCkgKiAyNikvMTApOwotCQllbHNlIGlmIChSc3NpID49IC05MCkgICAvLyBiZXR3ZWVuIC04MCB+IC05MGRibQotCQkJUnNzaV9RdWFsaXR5ID0gKFVJTlQpKCgoUnNzaSArIDkwKSAqIDI2KS8xMCk7Ci0JCWVsc2UgICAgLy8gPCAtODQgZGJtCi0JCQlSc3NpX1F1YWxpdHkgPSAwOwotCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS05ZCIsIFJzc2lfUXVhbGl0eSk7Ci0JCS8vIFdpcmVsZXNzIE1vZGUKLQkJd2lyZWxlc3NfbW9kZSA9IE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldKTsKLQkJaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMUZIIHx8Ci0JCQl3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFEUykKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYiIpOwotCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNNSkKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYSIpOwotCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNNV9OKQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFhL24iKTsKLQkJZWxzZSBpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExT0ZETTI0KQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFiL2ciKTsKLQkJZWxzZSBpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExT0ZETTI0X04pCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWIvZy9uIik7Ci0JCWVsc2UKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgInVua25vdyIpOwotCQkvL05ldHdvcmsgVHlwZQotCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0zcyIsICIgQWQiKTsKLQkJZWxzZQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtM3MiLCAiIEluIik7Ci0KLSAgICAgICAgc3ByaW50Zihtc2crc3RybGVuKG1zZyksIlxuIik7Ci0JfQotCi0JcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7Ci0Jd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7Ci0JU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkgLSB3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7Ci0Jb3NfZnJlZV9tZW0oTlVMTCwgKFBVQ0hBUiltc2cpOwotfQotCi0KLSNkZWZpbmUJTUFDX0xJTkVfTEVOCSgxNCs0KzQrMTArMTArMTArNis2KQkvLyBBZGRyK2FpZCtwc20rZGF0YXRpbWUrcnhieXRlK3R4Ynl0ZStjdXJyZW50IHR4IHJhdGUrbGFzdCB0eCByYXRlCi1WT0lEIFJUTVBJb2N0bEdldE1hY1RhYmxlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIHN0cnVjdCBpd3JlcSAqd3JxKQotewotCUlOVCBpOwotCVJUXzgwMl8xMV9NQUNfVEFCTEUgTWFjVGFiOwotCWNoYXIgKm1zZzsKLQotCU1hY1RhYi5OdW0gPSAwOwotCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCi0JewotCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJICYmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlNzdCA9PSBTU1RfQVNTT0MpKQotCQl7Ci0JCQlDT1BZX01BQ19BRERSKE1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5BZGRyLCAmcEFkLT5NYWNUYWIuQ29udGVudFtpXS5BZGRyKTsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5BaWQgPSAoVUNIQVIpcEFkLT5NYWNUYWIuQ29udGVudFtpXS5BaWQ7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uUHNtID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5Qc01vZGU7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uTWltb1BzID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5NbXBzTW9kZTsKLQotCQkJLy8gRmlsbCBpbiBSU1NJIHBlciBlbnRyeQotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkF2Z1Jzc2kwID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5Sc3NpU2FtcGxlLkF2Z1Jzc2kwOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkF2Z1Jzc2kxID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5Sc3NpU2FtcGxlLkF2Z1Jzc2kxOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkF2Z1Jzc2kyID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5Sc3NpU2FtcGxlLkF2Z1Jzc2kyOwotCi0JCQkvLyB0aGUgY29ubmVjdGVkIHRpbWUgcGVyIGVudHJ5Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQ29ubmVjdGVkVGltZSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uU3RhQ29ubmVjdFRpbWU7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLk1DUyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuQlcgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS5maWVsZC5CVzsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuU2hvcnRHSSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLlNUQkMgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS5maWVsZC5TVEJDOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5yc3YgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS5maWVsZC5yc3Y7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLk1PREUgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS5maWVsZC5NT0RFOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS53b3JkID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUud29yZDsKLQotCQkJTWFjVGFiLk51bSArPSAxOwotCQl9Ci0JfQotCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfTUFDX1RBQkxFKTsKLQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZNYWNUYWIsIHdycS0+dS5kYXRhLmxlbmd0aCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczogY29weV90b191c2VyKCkgZmFpbFxuIiwgX19mdW5jX18pKTsKLQl9Ci0KLQltc2cgPSAoQ0hBUiAqKSBrbWFsbG9jKHNpemVvZihDSEFSKSooTUFYX0xFTl9PRl9NQUNfVEFCTEUqTUFDX0xJTkVfTEVOKSwgTUVNX0FMTE9DX0ZMQUcpOwotCW1lbXNldChtc2csIDAgLE1BWF9MRU5fT0ZfTUFDX1RBQkxFKk1BQ19MSU5FX0xFTiApOwotCXNwcmludGYobXNnLCIlcyIsIlxuIik7Ci0Jc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTRzJS00cyUtNHMlLTEwcyUtMTBzJS0xMHMlLTZzJS02c1xuIiwKLQkJIk1BQyIsICJBSUQiLCAiUFNNIiwgIkxEVCIsICJSeEIiLCAiVHhCIiwiQ1R4UiIsICJMVHhSIik7Ci0KLQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCXsKLQkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKLQkJaWYgKHBFbnRyeS0+VmFsaWRBc0NMSSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKLQkJewotCQkJaWYoKHN0cmxlbihtc2cpK01BQ19MSU5FX0xFTiApID49IChNQVhfTEVOX09GX01BQ19UQUJMRSpNQUNfTElORV9MRU4pICkKLQkJCQlicmVhazsKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggICIsCi0JCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKLQkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdKTsKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRkIiwgKGludClwRW50cnktPkFpZCk7Ci0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS00ZCIsIChpbnQpcEVudHJ5LT5Qc01vZGUpOwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBkIiwwLypwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5MYXN0RGF0YVBhY2tldFRpbWUqLyk7IC8vIFRvRG8KLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTEwZCIsMC8qcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IU0NvdW50ZXIuVG90YWxSeEJ5dGVDb3VudCovKTsgLy8gVG9EbwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBkIiwwLypwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5Ub3RhbFR4Qnl0ZUNvdW50Ki8pOyAvLyBUb0RvCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS02ZCIsUmF0ZUlkVG9NYnBzW3BBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQ3VyclR4UmF0ZV0pOwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNmRcbiIsMC8qUmF0ZUlkVG9NYnBzW3BBZC0+TWFjVGFiLkNvbnRlbnRbaV0uTGFzdFR4UmF0ZV0qLyk7IC8vIFRvRG8KLQkJfQotCX0KLQkvLyBmb3IgY29tcGF0aWJsZSB3aXRoIG9sZCBBUEkganVzdCBkbyB0aGUgcHJpbnRrIHRvIGNvbnNvbGUKLQkvL3dycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOwotCS8vaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyIsIG1zZykpOwotCX0KLQotCWtmcmVlKG1zZyk7Ci19Ci0KLUlOVAlTZXRfQkFTZXR1cF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLSAgICBVQ0hBUiBtYWNbNl0sIHRpZDsKLQljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKLQlJTlQgaTsKLSAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQotLyoKLQlUaGUgQkFTZXR1cCBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAotCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKLQkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgdGlkIHZhbHVlLgotKi8KLQotCWlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIHRpZCB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KLQkJcmV0dXJuIEZBTFNFOwotCi0JdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKLQlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQotCXsKLQkJdGlkID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKLQkJaWYgKHRpZCA+IDE1KQotCQkJcmV0dXJuIEZBTFNFOwotCi0JCSp0b2tlbiA9ICdcMCc7Ci0JCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQotCQl7Ci0JCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQotCQkJCXJldHVybiBGQUxTRTsKLQkJCUF0b0godG9rZW4sIChQVUNIQVIpKCZtYWNbaV0pLCAxKTsKLQkJfQotCQlpZihpICE9IDYpCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkJcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSUwMnhcbiIsIG1hY1swXSwgbWFjWzFdLAotCQkJCW1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgdGlkKTsKLQotCSAgICBwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7Ci0KLSAgICAJaWYgKHBFbnRyeSkgewotICAgICAgICAJcHJpbnRrKCJcblNldHVwIEJBIFNlc3Npb246IFRpZCA9ICVkXG4iLCB0aWQpOwotCSAgICAgICAgQkFPcmlTZXNzaW9uU2V0VXAocEFkLCBwRW50cnksIHRpZCwgMCwgMTAwLCBUUlVFKTsKLSAgICAJfQotCi0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKLQotfQotCi1JTlQJU2V0X0JBRGVjbGluZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBiQkFEZWNsaW5lOwotCi0JYkJBRGVjbGluZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoYkJBRGVjbGluZSA9PSAwKQotCXsKLQkJcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IEZBTFNFOwotCX0KLQllbHNlIGlmIChiQkFEZWNsaW5lID09IDEpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gVFJVRTsKLQl9CisJaWYgKGVuYyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCXJldHVybiAiTk9ORSI7CisJaWYgKGVuYyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkKKwkJcmV0dXJuICJXRVAiOworCWlmIChlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJcmV0dXJuICJUS0lQIjsKKwlpZiAoZW5jID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXJldHVybiAiQUVTIjsKKwlpZiAoZW5jID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQpCisJCXJldHVybiAiVEtJUEFFUyI7CiAJZWxzZQotCXsKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQkFEZWNsaW5lX1Byb2M6OihCQURlY2xpbmU9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lKSk7Ci0KLQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuICJVTktOT1ciOwogfQogCi1JTlQJU2V0X0JBT3JpVGVhckRvd25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCitjaGFyICpHZXRBdXRoTW9kZShjaGFyIGF1dGgpCiB7Ci0gICAgVUNIQVIgbWFjWzZdLCB0aWQ7Ci0JY2hhciAqdG9rZW4sIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7Ci0JSU5UIGk7Ci0gICAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisJaWYgKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJcmV0dXJuICJPUEVOIjsKKwlpZiAoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCXJldHVybiAiU0hBUkVEIjsKKwlpZiAoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKQorCQlyZXR1cm4gIkFVVE9XRVAiOworCWlmIChhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJcmV0dXJuICJXUEEiOworCWlmIChhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKKwkJcmV0dXJuICJXUEFQU0siOworCWlmIChhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCXJldHVybiAiV1BBTk9ORSI7CisJaWYgKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKwkJcmV0dXJuICJXUEEyIjsKKwlpZiAoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorCQlyZXR1cm4gIldQQTJQU0siOworCWlmIChhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyKQorCQlyZXR1cm4gIldQQTFXUEEyIjsKKwlpZiAoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykKKwkJcmV0dXJuICJXUEExUFNLV1BBMlBTSyI7CiAKLS8qCi0JVGhlIEJBT3JpVGVhckRvd24gaW51cHQgc3RyaW5nIGZvcm1hdCBzaG91bGQgYmUgeHg6eHg6eHg6eHg6eHg6eHgtZCwKLQkJPT5UaGUgc2l4IDIgZGlnaXQgaGV4LWRlY2ltYWwgbnVtYmVyIHByZXZpb3VzIGFyZSB0aGUgTWFjIGFkZHJlc3MsCi0JCT0+VGhlIHNldmVudGggZGVjaW1hbCBudW1iZXIgaXMgdGhlIHRpZCB2YWx1ZS4KLSovCi0gICAgaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgdGlkIHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgotCQlyZXR1cm4gRkFMU0U7Ci0KLQl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOwotCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCi0JewotCQl0aWQgPSBzaW1wbGVfc3RydG9sKCh0b2tlbisxKSwgMCwgMTApOwotCQlpZiAodGlkID4gTlVNX09GX1RJRCkKLQkJCXJldHVybiBGQUxTRTsKLQotCQkqdG9rZW4gPSAnXDAnOwotCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKLQkJewotCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQlBdG9IKHRva2VuLCAoUFVDSEFSKSgmbWFjW2ldKSwgMSk7Ci0JCX0KLQkJaWYoaSAhPSA2KQotCQkJcmV0dXJuIEZBTFNFOwotCi0JICAgIHByaW50aygiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lMDJ4IiwgbWFjWzBdLCBtYWNbMV0sCi0JICAgICAgICAgICBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0sIHRpZCk7Ci0KLQkgICAgcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBtYWMpOwotCi0JICAgIGlmIChwRW50cnkpIHsKLQkgICAgICAgIHByaW50aygiXG5UZWFyIGRvd24gT3JpIEJBIFNlc3Npb246IFRpZCA9ICVkXG4iLCB0aWQpOwotICAgICAgICBCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIHBFbnRyeS0+QWlkLCB0aWQsIEZBTFNFLCBUUlVFKTsKLQkgICAgfQotCi0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKLQorCXJldHVybiAiVU5LTk9XIjsKIH0KIAotSU5UCVNldF9CQVJlY1RlYXJEb3duX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQoraW50IFNldENvbW1vbkhUKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLSAgICBVQ0hBUiBtYWNbNl0sIHRpZDsKLQljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKLQlJTlQgaTsKLSAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQotICAgIC8vcHJpbnRrKCJcbiVzXG4iLCBhcmcpOwotLyoKLQlUaGUgQkFSZWNUZWFyRG93biBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAotCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKLQkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgdGlkIHZhbHVlLgotKi8KLSAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aWQgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCi0JCXJldHVybiBGQUxTRTsKLQotCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7Ci0JaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKLQl7Ci0JCXRpZCA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7Ci0JCWlmICh0aWQgPiBOVU1fT0ZfVElEKQotCQkJcmV0dXJuIEZBTFNFOwotCi0JCSp0b2tlbiA9ICdcMCc7Ci0JCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQotCQl7Ci0JCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQotCQkJCXJldHVybiBGQUxTRTsKLQkJCUF0b0godG9rZW4sIChQVUNIQVIpKCZtYWNbaV0pLCAxKTsKLQkJfQotCQlpZihpICE9IDYpCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkJcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSUwMngiLCBtYWNbMF0sIG1hY1sxXSwKLQkJICAgICAgIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgdGlkKTsKLQotCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7Ci0KLQkJaWYgKHBFbnRyeSkgewotCQkgICAgcHJpbnRrKCJcblRlYXIgZG93biBSZWMgQkEgU2Vzc2lvbjogVGlkID0gJWRcbiIsIHRpZCk7Ci0JCSAgICBCQVJlY1Nlc3Npb25UZWFyRG93bihwQWQsIHBFbnRyeS0+QWlkLCB0aWQsIEZBTFNFKTsKLQkJfQotCi0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKLQotfQotCi1JTlQJU2V0X0h0QndfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgSHRCdzsKLQotCUh0QncgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChIdEJ3ID09IEJXXzQwKQotCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfNDA7Ci0JZWxzZSBpZiAoSHRCdyA9PSBCV18yMCkKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QndfUHJvYzo6KEh0Qnc9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0TWNzX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIEh0TWNzLCBNY3NfdG1wOwotICAgIEJPT0xFQU4gYkF1dG9SYXRlID0gRkFMU0U7Ci0KLQlNY3NfdG1wID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChNY3NfdG1wIDw9IDE1IHx8IE1jc190bXAgPT0gMzIpCi0JCUh0TWNzID0gTWNzX3RtcDsKLQllbHNlCi0JCUh0TWNzID0gTUNTX0FVVE87Ci0KLQl7Ci0JCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gSHRNY3M7Ci0JCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gKEh0TWNzID09IE1DU19BVVRPKSA/IFRSVUU6RkFMU0U7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1jc19Qcm9jOjooSHRNY3M9JWQsIGJBdXRvVHhSYXRlU3dpdGNoID0gJWQpXG4iLAotCQkJCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MsIHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoKSk7Ci0KLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDwgUEhZXzExQUJHTl9NSVhFRCkgfHwKLQkJCShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDwgTU9ERV9IVE1JWCkpCi0JCXsKLQkgICAgICAgIGlmICgocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pICYmCi0JCQkJKEh0TWNzID49IDAgJiYgSHRNY3MgPD0gMykgJiYKLQkgICAgICAgICAgICAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9PSBGSVhFRF9UWE1PREVfQ0NLKSkKLQkJCXsKLQkJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgKExPTkcpIChSYXRlSWRUb01icHNbSHRNY3NdICogMTAwMDAwMCkpOwotCQkJfQotCSAgICAgICAgZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKSAmJgotCQkJCQkoSHRNY3MgPj0gMCAmJiBIdE1jcyA8PSA3KSAmJgotCSAgICAgICAgICAgIAkocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9PSBGSVhFRF9UWE1PREVfT0ZETSkpCi0JCQl7Ci0JCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIChMT05HKSAoUmF0ZUlkVG9NYnBzW0h0TWNzKzRdICogMTAwMDAwMCkpOwotCQkJfQotCQkJZWxzZQotCQkJCWJBdXRvUmF0ZSA9IFRSVUU7Ci0KLQkJCWlmIChiQXV0b1JhdGUpCi0JCQl7Ci0JICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKLQkJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgLTEpOwotCQkJfQotCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TWNzX1Byb2M6OihGaXhlZFR4TW9kZT0lZClcbiIscEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSkpOwotCQl9Ci0gICAgICAgIGlmIChBREhPQ19PTihwQWQpKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0JfQotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0R2lfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgSHRHaTsKLQotCUh0R2kgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKCBIdEdpID09IEdJXzQwMCkKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV80MDA7Ci0JZWxzZSBpZiAoIEh0R2kgPT0gR0lfODAwICkKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEdpX1Byb2M6OihTaG9ydEdJPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UCVNldF9IdFR4QkFTaXplX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVDSEFSIFNpemU7Ci0KLQlTaXplID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChTaXplIDw9MCB8fCBTaXplID49NjQpCi0JewotCQlTaXplID0gODsKLQl9Ci0JcEFkLT5Db21tb25DZmcuVHhCQVNpemUgPSBTaXplLTE7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0h0VHhCQVNpemUgOjooVHhCQVNpemU9ICVkKVxuIiwgU2l6ZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UCVNldF9IdE9wTW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKFZhbHVlID09IEhUTU9ERV9HRikKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfR0Y7Ci0JZWxzZSBpZiAoIFZhbHVlID09IEhUTU9ERV9NTSApCi0JCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUgID0gSFRNT0RFX01NOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRPcE1vZGVfUHJvYzo6KEh0T3BNb2RlPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLQotfQotCi1JTlQJU2V0X0h0U3RiY19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKFZhbHVlID09IFNUQkNfVVNFKQotCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQyA9IFNUQkNfVVNFOwotCWVsc2UgaWYgKCBWYWx1ZSA9PSBTVEJDX05PTkUgKQotCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1N0YmNfUHJvYzo6KEh0U3RiYz0lZClcbiIscEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0SHRjX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCi0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0JaWYgKFZhbHVlID09IDApCi0JCXBBZC0+SFRDRW5hYmxlID0gRkFMU0U7Ci0JZWxzZSBpZiAoIFZhbHVlID09MSApCi0gICAgICAgIAlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0SHRjX1Byb2M6OihIdEh0Yz0lZClcbiIscEFkLT5IVENFbmFibGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0RXh0Y2hhX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCi0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSAgPSBFWFRDSEFfQkVMT1c7Ci0JZWxzZSBpZiAoIFZhbHVlID09MSApCi0gICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQUJPVkU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEV4dGNoYV9Qcm9jOjooSHRFeHRjaGE9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0TXBkdURlbnNpdHlfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoVmFsdWUgPD03ICYmIFZhbHVlID49IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IFZhbHVlOwotCWVsc2UKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gNDsKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jOjooSHRNcGR1RGVuc2l0eT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5KSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldF9IdEJhV2luU2l6ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCi0JaWYgKFZhbHVlID49MSAmJiBWYWx1ZSA8PSA2NCkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBWYWx1ZTsKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOwotCX0KLQllbHNlCi0JewotICAgICAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKLQl9Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QmFXaW5TaXplX1Byb2M6OihIdEJhV2luU2l6ZT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRSZGdfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuYlJkZyA9IEZBTFNFOwotCWVsc2UgaWYgKCBWYWx1ZSA9PTEgKQotCXsKLQkJcEFkLT5IVENFbmFibGUgPSBUUlVFOwotICAgICAgICAJcEFkLT5Db21tb25DZmcuYlJkZyA9IFRSVUU7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRSZGdfUHJvYzo6KEh0UmRnPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5iUmRnKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldF9IdExpbmtBZGFwdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5iTGlua0FkYXB0ID0gRkFMU0U7Ci0JZWxzZSBpZiAoIFZhbHVlID09MSApCi0JewotCQkJcEFkLT5IVENFbmFibGUgPSBUUlVFOwotCQkJcEFkLT5iTGlua0FkYXB0ID0gVFJVRTsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TGlua0FkYXB0X1Byb2M6OihIdExpbmtBZGFwdD0lZClcbiIscEFkLT5iTGlua0FkYXB0KSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldF9IdEFtc2R1X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChWYWx1ZSA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPSBGQUxTRTsKLQllbHNlIGlmICggVmFsdWUgPT0gMSApCi0gICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IFRSVUU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEFtc2R1X1Byb2M6OihIdEFtc2R1PSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0QXV0b0JhX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChWYWx1ZSA9PSAwKQotCXsKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOwotCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gQkFfTk9UVVNFOwotCX0KLSAgICBlbHNlIGlmIChWYWx1ZSA9PSAxKQotCXsKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBJTU1FRF9CQTsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0gICAgcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkE7Ci0gICAgcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3k7Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QXV0b0JhX1Byb2M6OihIdEF1dG9CYT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSkpOwotCi0JcmV0dXJuIFRSVUU7Ci0KLX0KLQotSU5UCVNldF9IdFByb3RlY3RfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0JaWYgKFZhbHVlID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBGQUxTRTsKLSAgICBlbHNlIGlmIChWYWx1ZSA9PSAxKQotCQlwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gVFJVRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRQcm90ZWN0X1Byb2M6OihIdFByb3RlY3Q9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X1NlbmRQU01QQWN0aW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotICAgIFVDSEFSIG1hY1s2XSwgbW9kZTsKLQljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKLQlJTlQgaTsKLSAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQotICAgIC8vcHJpbnRrKCJcbiVzXG4iLCBhcmcpOwotLyoKLQlUaGUgQkFSZWNUZWFyRG93biBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAotCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKLQkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgbW9kZSB2YWx1ZS4KLSovCi0gICAgaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgbW9kZSB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KLQkJcmV0dXJuIEZBTFNFOwotCi0gICAJdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKLQlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQotCXsKLQkJbW9kZSA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7Ci0JCWlmIChtb2RlID4gTU1QU19FTkFCTEUpCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkJKnRva2VuID0gJ1wwJzsKLQkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCi0JCXsKLQkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCi0JCQkJcmV0dXJuIEZBTFNFOwotCQkJQXRvSCh0b2tlbiwgKFBVQ0hBUikoJm1hY1tpXSksIDEpOwotCQl9Ci0JCWlmKGkgIT0gNikKLQkJCXJldHVybiBGQUxTRTsKLQotCQlwcmludGsoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJTAyeCIsIG1hY1swXSwgbWFjWzFdLAotCQkgICAgICAgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCBtb2RlKTsKLQotCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7Ci0KLQkJaWYgKHBFbnRyeSkgewotCQkgICAgcHJpbnRrKCJcblNlbmRQU01QQWN0aW9uIE1JUFMgbW9kZSA9ICVkXG4iLCBtb2RlKTsKLQkJICAgIFNlbmRQU01QQWN0aW9uKHBBZCwgcEVudHJ5LT5BaWQsIG1vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIFRSVUU7Ci0JfQotCi0JcmV0dXJuIEZBTFNFOwotCi0KLX0KLQotSU5UCVNldF9IdE1JTU9QU21vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoVmFsdWUgPD0zICYmIFZhbHVlID49IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IFZhbHVlOwotCWVsc2UKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gMzsKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNSU1PUFNtb2RlX1Byb2M6OihNSU1PUFMgbW9kZT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1JTlQJU2V0X0ZvcmNlU2hvcnRHSV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5XSUZJdGVzdGJlZC5iU2hvcnRHSSA9IEZBTFNFOwotCWVsc2UgaWYgKFZhbHVlID09IDEpCi0JCXBBZC0+V0lGSXRlc3RiZWQuYlNob3J0R0kgPSBUUlVFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRm9yY2VTaG9ydEdJX1Byb2M6OihGb3JjZVNob3J0R0k9JWQpXG4iLCBwQWQtPldJRkl0ZXN0YmVkLmJTaG9ydEdJKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0KLUlOVAlTZXRfRm9yY2VHRl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5XSUZJdGVzdGJlZC5iR3JlZW5GaWVsZCA9IEZBTFNFOwotCWVsc2UgaWYgKFZhbHVlID09IDEpCi0JCXBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQgPSBUUlVFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRm9yY2VHRl9Qcm9jOjooRm9yY2VHRj0lZClcbiIsIHBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0TWltb1BzX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChWYWx1ZSA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gRkFMU0U7Ci0JZWxzZSBpZiAoVmFsdWUgPT0gMSkKLQkJcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IFRSVUU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TWltb1BzX1Byb2M6OihIdE1pbW9Qcz0lZClcbiIscEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRDb21tb25IVCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlPSURfU0VUX0hUX1BIWU1PREUJCVNldEhUOworCXN0cnVjdCBydF9vaWRfc2V0X2h0X3BoeW1vZGUgU2V0SFQ7CiAKIAlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8IFBIWV8xMUFCR05fTUlYRUQpCiAJCXJldHVybiBGQUxTRTsKIAogCVNldEhULlBoeU1vZGUgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOwotCVNldEhULlRyYW5zbWl0Tm8gPSAoKFVDSEFSKXBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgpOwotCVNldEhULkh0TW9kZSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFOwotCVNldEhULkV4dE9mZnNldCA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBOworCVNldEhULlRyYW5zbWl0Tm8gPSAoKHU4KXBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgpOworCVNldEhULkh0TW9kZSA9ICh1OClwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFOworCVNldEhULkV4dE9mZnNldCA9CisJICAgICh1OClwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBOwogCVNldEhULk1DUyA9IE1DU19BVVRPOwotCVNldEhULkJXID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVzsKLQlTZXRIVC5TVEJDID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDOwotCVNldEhULlNIT1JUR0kgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0k7CisJU2V0SFQuQlcgPSAodTgpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXOworCVNldEhULlNUQkMgPSAodTgpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkM7CisJU2V0SFQuU0hPUlRHSSA9ICh1OClwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSTsKIAogCVJUTVBTZXRIVChwQWQsICZTZXRIVCk7CiAKIAlyZXR1cm4gVFJVRTsKIH0KIAotSU5UCVNldF9GaXhlZFR4TW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKK2NoYXIgKlJUTVBHZXRSYWxpbmtFbmNyeU1vZGVTdHIodTE2IGVuY3J5TW9kZSkKIHsKLQlVQ0hBUglmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKLQotCWlmIChzdHJjbXAoYXJnLCAiT0ZETSIpID09IDAgfHwgc3RyY21wKGFyZywgIm9mZG0iKSA9PSAwKQotCXsKLQkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfT0ZETTsKLQl9Ci0JZWxzZSBpZiAoc3RyY21wKGFyZywgIkNDSyIpID09IDAgfHwgc3RyY21wKGFyZywgImNjayIpID09IDApCi0JewotICAgICAgICBmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9DQ0s7Ci0JfQotCi0JcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9IGZpeF90eF9tb2RlOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0ZpeGVkVHhNb2RlX1Byb2M6OihGaXhlZFR4TW9kZT0lZClcbiIsIGZpeF90eF9tb2RlKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotUENIQVIgICBSVE1QR2V0UmFsaW5rQXV0aE1vZGVTdHIoCi0gICAgSU4gIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgYXV0aE1vZGUpCi17Ci0Jc3dpdGNoKGF1dGhNb2RlKQotCXsKLQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOgotCQkJcmV0dXJuICJPUEVOIjsKLQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s6Ci0JCQlyZXR1cm4gIldQQVBTSyI7Ci0JCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOgotCQkJcmV0dXJuICJTSEFSRUQiOwotCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQToKLQkJCXJldHVybiAiV1BBIjsKLQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOgotCQkJcmV0dXJuICJXUEEyIjsKLQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOgotCQkJcmV0dXJuICJXUEEyUFNLIjsKLSAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSzoKLQkJCXJldHVybiAiV1BBUFNLV1BBMlBTSyI7Ci0gICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTI6Ci0JCQlyZXR1cm4gIldQQTFXUEEyIjsKLQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOgotCQkJcmV0dXJuICJXUEFOT05FIjsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAiVU5LTk9XIjsKKwlzd2l0Y2ggKGVuY3J5TW9kZSkgeworCWNhc2UgTmRpczgwMl8xMVdFUERpc2FibGVkOgorCQlyZXR1cm4gIk5PTkUiOworCWNhc2UgTmRpczgwMl8xMVdFUEVuYWJsZWQ6CisJCXJldHVybiAiV0VQIjsKKwljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6CisJCXJldHVybiAiVEtJUCI7CisJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgorCQlyZXR1cm4gIkFFUyI7CisJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOgorCQlyZXR1cm4gIlRLSVBBRVMiOworCWRlZmF1bHQ6CisJCXJldHVybiAiVU5LTk9XIjsKIAl9CiB9Ci0KLVBDSEFSICAgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cigKLSAgICBJTiAgVVNIT1JUIGVuY3J5TW9kZSkKLXsKLQlzd2l0Y2goZW5jcnlNb2RlKQotCXsKLSNpZiBkZWZpbmVkKFJUMjg2MCkgfHwgZGVmaW5lZChSVDMweHgpCi0JICAgIGRlZmF1bHQ6Ci0jZW5kaWYKLQkJY2FzZSBOZGlzODAyXzExV0VQRGlzYWJsZWQ6Ci0JCQlyZXR1cm4gIk5PTkUiOwotCQljYXNlIE5kaXM4MDJfMTFXRVBFbmFibGVkOgotCQkJcmV0dXJuICJXRVAiOwotCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6Ci0JCQlyZXR1cm4gIlRLSVAiOwotCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6Ci0JCQlyZXR1cm4gIkFFUyI7Ci0gICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDoKLQkJCXJldHVybiAiVEtJUEFFUyI7Ci0jaWYgIWRlZmluZWQoUlQyODYwKSAmJiAhZGVmaW5lZChSVDMweHgpCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gIlVOS05PVyI7Ci0jZW5kaWYKLQl9Ci19Ci0KLUlOVCBSVE1QU2hvd0NmZ1ZhbHVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBOYW1lLAotCUlOCVBVQ0hBUgkJCXBCdWYpCi17Ci0JSU5UCVN0YXR1cyA9IDA7Ci0KLQlmb3IgKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MgPSBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0M7IFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWU7IFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MrKykKLQl7Ci0JCWlmICghc3RyY21wKHBOYW1lLCBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5uYW1lKSkKLQkJewotCQkJaWYoUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+c2hvd19wcm9jKHBBZCwgcEJ1ZikpCi0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWJyZWFrOyAgLy9FeGl0IGZvciBsb29wLgotCQl9Ci0JfQotCi0JaWYoUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZSA9PSBOVUxMKQotCXsKLQkJc3ByaW50ZihwQnVmLCAiXG4iKTsKLQkJZm9yIChQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DID0gUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DOyBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5uYW1lOyBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DKyspCi0JCQlzcHJpbnRmKHBCdWYgKyBzdHJsZW4ocEJ1ZiksICIlc1xuIiwgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZSk7Ci0JfQotCi0JcmV0dXJuIFN0YXR1czsKLX0KLQotSU5UCVNob3dfU1NJRF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5Tc2lkKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfV2lyZWxlc3NNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpCi0JewotCQljYXNlIFBIWV8xMUJHX01JWEVEOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUIvRyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQjoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFCIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFBOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEiKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFBL0IvRyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExRzoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFHIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEvQi9HL04iKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMU5fMl80RzoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFOIG9ubHkgd2l0aCAyLjRHIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFHTl9NSVhFRDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFHL04iKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUFOX01JWEVEOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEvTiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQkdOX01JWEVEOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUIvRy9OIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExQS9HL04iKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMU5fNUc6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExTiBvbmx5IHdpdGggNUciKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWQpIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSk7Ci0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQotSU5UCVNob3dfVHhCdXJzdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA/ICJUUlVFIjoiRkFMU0UiKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfVHhQcmVhbWJsZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlKQotCXsKLQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlU2hvcnQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFNob3J0Iik7Ci0JCQlicmVhazsKLQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKLQkJCXNwcmludGYocEJ1ZiwgIlx0TG9uZyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUF1dG86Ci0JCQlzcHJpbnRmKHBCdWYsICJcdEF1dG8iKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWx1KSIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X1R4UG93ZXJfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCVsdSIsIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfQ2hhbm5lbF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfQkdQcm90ZWN0aW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikKLQl7Ci0JCWNhc2UgMTogLy9BbHdheXMgT24KLQkJCXNwcmludGYocEJ1ZiwgIlx0T04iKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6IC8vQWx3YXlzIE9GRgotCQkJc3ByaW50ZihwQnVmLCAiXHRPRkYiKTsKLQkJCWJyZWFrOwotCQljYXNlIDA6IC8vQVVUTwotCQkJc3ByaW50ZihwQnVmLCAiXHRBdXRvIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVsdSkiLCBwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24pOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19SVFNUaHJlc2hvbGRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfRnJhZ1RocmVzaG9sZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0h0QndfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlpZiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKQotCXsKLQkJc3ByaW50ZihwQnVmLCAiXHQ0MCBNSHoiKTsKLQl9Ci0JZWxzZQotCXsKLSAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQyMCBNSHoiKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0h0TWNzX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQldSIsIHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfSHRHaV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSkKLQl7Ci0JCWNhc2UgR0lfNDAwOgotCQkJc3ByaW50ZihwQnVmLCAiXHRHSV80MDAiKTsKLQkJCWJyZWFrOwotCQljYXNlIEdJXzgwMDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0R0lfODAwIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCV1KSIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJKTsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfSHRPcE1vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSkKLQl7Ci0JCWNhc2UgSFRNT0RFX0dGOgotCQkJc3ByaW50ZihwQnVmLCAiXHRHRiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSFRNT0RFX01NOgotCQkJc3ByaW50ZihwQnVmLCAiXHRNTSIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSgldSkiLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFKTsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfSHRFeHRjaGFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSkKLQl7Ci0JCWNhc2UgRVhUQ0hBX0JFTE9XOgotCQkJc3ByaW50ZihwQnVmLCAiXHRCZWxvdyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRVhUQ0hBX0FCT1ZFOgotCQkJc3ByaW50ZihwQnVmLCAiXHRBYm92ZSIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSgldSkiLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBKTsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi1JTlQJU2hvd19IdE1wZHVEZW5zaXR5X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQldSIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0h0QmFXaW5TaXplX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQldSIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19IdFJkZ19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iUmRnID8gIlRSVUUiOiJGQUxTRSIpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19IdEFtc2R1X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA/ICJUUlVFIjoiRkFMU0UiKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfSHRBdXRvQmFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA/ICJUUlVFIjoiRkFMU0UiKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfQ291bnRyeVJlZ2lvbl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlZCIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0NvdW50cnlDb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlKTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLUlOVAlTaG93X1BrdEFnZ3JlZ2F0ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID8gIlRSVUUiOiJGQUxTRSIpOwotCXJldHVybiAwOwotfQotI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIFdNTV9TVVBQT1JUCi1JTlQJU2hvd19XbW1DYXBhYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID8gIlRSVUUiOiJGQUxTRSIpOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KLQotSU5UCVNob3dfSUVFRTgwMjExSF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA/ICJUUlVFIjoiRkFMU0UiKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfTmV0d29ya1R5cGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzd2l0Y2gocEFkLT5TdGFDZmcuQnNzVHlwZSkKLQl7Ci0JCWNhc2UgQlNTX0FESE9DOgotCQkJc3ByaW50ZihwQnVmLCAiXHRBZGhvYyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQlNTX0lORlJBOgotCQkJc3ByaW50ZihwQnVmLCAiXHRJbmZyYSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQlNTX0FOWToKLQkJCXNwcmludGYocEJ1ZiwgIlx0QW55Iik7Ci0JCQlicmVhazsKLQkJY2FzZSBCU1NfTU9OSVRPUjoKLQkJCXNwcmludGYocEJ1ZiwgIlx0TW9uaXRvciIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBwQWQtPlN0YUNmZy5Cc3NUeXBlKTsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfQXV0aE1vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCUF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQotCUF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7Ci0KLQlpZiAoKEF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pICYmCi0JCShBdXRoTW9kZSA8PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykpCi0JCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBSVE1QR2V0UmFsaW5rQXV0aE1vZGVTdHIoQXV0aE1vZGUpKTsKLQllbHNlCi0JCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIEF1dGhNb2RlKTsKLQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19FbmNyeXBUeXBlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0JTkRJU184MDJfMTFfV0VQX1NUQVRVUwlXZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0KLQlXZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7Ci0KLQlpZiAoKFdlcFN0YXR1cyA+PSBOZGlzODAyXzExV0VQRW5hYmxlZCkgJiYKLQkJKFdlcFN0YXR1cyA8PSBOZGlzODAyXzExRW5jcnlwdGlvbjRLZXlBYnNlbnQpKQotCQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cihXZXBTdGF0dXMpKTsKLQllbHNlCi0JCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIFdlcFN0YXR1cyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfRGVmYXVsdEtleUlEX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0JVUNIQVIgRGVmYXVsdEtleUlkID0gMDsKLQotCURlZmF1bHRLZXlJZCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKLQotCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBEZWZhdWx0S2V5SWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X1dlcEtleV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICBJTlQJCQkJS2V5SWR4LAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCVVDSEFSICAgS2V5WzE2XSA9IHswfSwgS2V5TGVuZ3RoID0gMDsKLQlJTlQJCWluZGV4ID0gQlNTMDsKLQotCUtleUxlbmd0aCA9IHBBZC0+U2hhcmVkS2V5W2luZGV4XVtLZXlJZHhdLktleUxlbjsKLQlOZGlzTW92ZU1lbW9yeShLZXksIHBBZC0+U2hhcmVkS2V5W2luZGV4XVtLZXlJZHhdLktleSwgS2V5TGVuZ3RoKTsKLQotCS8vY2hlY2sga2V5IHN0cmluZyBpcyBBU0NJSSBvciBub3QKLSAgICBpZiAoUlRNUENoZWNrU3RyUHJpbnRBYmxlKEtleSwgS2V5TGVuZ3RoKSkKLSAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQlcyIsIEtleSk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaW50IGlkeDsKLSAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQiKTsKLSAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBLZXlMZW5ndGg7IGlkeCsrKQotICAgICAgICAgICAgc3ByaW50ZihwQnVmK3N0cmxlbihwQnVmKSwgIiUwMlgiLCBLZXlbaWR4XSk7Ci0gICAgfQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19LZXkxX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0JU2hvd19XZXBLZXlfUHJvYyhwQWQsIDAsIHBCdWYpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19LZXkyX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0JU2hvd19XZXBLZXlfUHJvYyhwQWQsIDEsIHBCdWYpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19LZXkzX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0JU2hvd19XZXBLZXlfUHJvYyhwQWQsIDIsIHBCdWYpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19LZXk0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0JU2hvd19XZXBLZXlfUHJvYyhwQWQsIDMsIHBCdWYpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19XUEFQU0tfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlJTlQgCWlkeDsKLQlVQ0hBUglQTUtbMzJdID0gezB9OwotCi0JTmRpc01vdmVNZW1vcnkoUE1LLCBwQWQtPlN0YUNmZy5QTUssIDMyKTsKLQotICAgIHNwcmludGYocEJ1ZiwgIlx0UE1LID0gIik7Ci0gICAgZm9yIChpZHggPSAwOyBpZHggPCAzMjsgaWR4KyspCi0gICAgICAgIHNwcmludGYocEJ1ZitzdHJsZW4ocEJ1ZiksICIlMDJYIiwgUE1LW2lkeF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9tYWNfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fbWFjX3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MGViZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fbWFjX3BjaS5jCkBAIC0wLDAgKzEsMTY2MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZkZWYgUlRNUF9NQUNfUENJCisjaW5jbHVkZQkiLi4vcnRfY29uZmlnLmgiCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBbGxvY2F0ZSBETUEgbWVtb3J5IGJsb2NrcyBmb3Igc2VuZCwgcmVjZWl2ZQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCQlORElTX1NUQVRVU19SRVNPVVJDRVMKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIFJpbmdCYXNlUGFIaWdoOworCXVuc2lnbmVkIGxvbmcgUmluZ0Jhc2VQYUxvdzsKKwl2b2lkICpSaW5nQmFzZVZhOworCWludCBpbmRleCwgbnVtOworCXN0cnVjdCBydF90eGQgKiBwVHhEOworCXN0cnVjdCBydF9yeGQgKiBwUnhEOworCXVuc2lnbmVkIGxvbmcgRXJyb3JWYWx1ZSA9IDA7CisJc3RydWN0IHJ0X3J0bXBfdHhfcmluZyAqcFR4UmluZzsKKwlzdHJ1Y3QgcnRfcnRtcF9kbWFidWYgKnBEbWFCdWY7CisJdm9pZCAqcFBhY2tldDsKKy8qICAgICAgUFJUTVBfUkVPUkRFUkJVRiAgICAgICAgcFJlb3JkZXJCdWY7ICovCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnlcbiIpKTsKKwlkbyB7CisJCS8qICovCisJCS8qIEFsbG9jYXRlIGFsbCByaW5nIGRlc2NyaXB0b3JzLCBpbmNsdWRlIFR4RCwgUnhELCBNZ210RC4gKi8KKwkJLyogQWx0aG91Z2ggZWFjaCBzaXplIGlzIGRpZmZlcmVudCwgdG8gcHJldmVudCBjYWNoZWxpbmUgYW5kIGFsaWdubWVudCAqLworCQkvKiBpc3N1ZSwgSSBpbnRlbnRpb25hbCBzZXQgdGhlbSBhbGwgdG8gNjQgYnl0ZXMuICovCisJCS8qICovCisJCWZvciAobnVtID0gMDsgbnVtIDwgTlVNX09GX1RYX1JJTkc7IG51bSsrKSB7CisJCQl1bnNpZ25lZCBsb25nIEJ1ZkJhc2VQYUhpZ2g7CisJCQl1bnNpZ25lZCBsb25nIEJ1ZkJhc2VQYUxvdzsKKwkJCXZvaWQgKkJ1ZkJhc2VWYTsKKworCQkJLyogKi8KKwkJCS8qIEFsbG9jYXRlIFR4IHJpbmcgZGVzY3JpcHRvcidzIG1lbW9yeSAoNSBUWCByaW5ncyA9IDQgQUNzICsgMSBIQ0NBKSAqLworCQkJLyogKi8KKwkJCXBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jU2l6ZSA9CisJCQkgICAgVFhfUklOR19TSVpFICogVFhEX1NJWkU7CisJCQlSVE1QX0FsbG9jYXRlVHhEZXNjTWVtb3J5KHBBZCwgbnVtLAorCQkJCQkJICBwQWQtPlR4RGVzY1JpbmdbbnVtXS4KKwkJCQkJCSAgQWxsb2NTaXplLCBGQUxTRSwKKwkJCQkJCSAgJnBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEsCisJCQkJCQkgICZwQWQtPlR4RGVzY1JpbmdbbnVtXS4KKwkJCQkJCSAgQWxsb2NQYSk7CisKKwkJCWlmIChwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhID09IE5VTEwpIHsKKwkJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOworCQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBaZXJvIGluaXQgdGhpcyBtZW1vcnkgYmxvY2sgKi8KKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEsCisJCQkJICAgICAgIHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jU2l6ZSk7CisKKwkJCS8qIFNhdmUgUEEgJiBWQSBmb3IgZnVydGhlciBvcGVyYXRpb24gKi8KKwkJCVJpbmdCYXNlUGFIaWdoID0KKwkJCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5UeERlc2NSaW5nW251bV0uCisJCQkJCQkJQWxsb2NQYSk7CisJCQlSaW5nQmFzZVBhTG93ID0KKwkJCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4RGVzY1JpbmdbbnVtXS4KKwkJCQkJCSAgICAgICBBbGxvY1BhKTsKKwkJCVJpbmdCYXNlVmEgPSBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhOworCisJCQkvKiAqLworCQkJLyogQWxsb2NhdGUgYWxsIDFzdCBUWEJ1ZidzIG1lbW9yeSBmb3IgdGhpcyBUeFJpbmcgKi8KKwkJCS8qICovCisJCQlwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUgPQorCQkJICAgIFRYX1JJTkdfU0laRSAqIFRYX0RNQV8xU1RfQlVGRkVSX1NJWkU7CisJCQlSVE1QX0FsbG9jYXRlRmlyc3RUeEJ1ZmZlcihwQWQsIG51bSwKKwkJCQkJCSAgIHBBZC0+VHhCdWZTcGFjZVtudW1dLgorCQkJCQkJICAgQWxsb2NTaXplLCBGQUxTRSwKKwkJCQkJCSAgICZwQWQtPlR4QnVmU3BhY2VbbnVtXS4KKwkJCQkJCSAgIEFsbG9jVmEsCisJCQkJCQkgICAmcEFkLT5UeEJ1ZlNwYWNlW251bV0uCisJCQkJCQkgICBBbGxvY1BhKTsKKworCQkJaWYgKHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEgPT0gTlVMTCkgeworCQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7CisJCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIFplcm8gaW5pdCB0aGlzIG1lbW9yeSBibG9jayAqLworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSwKKwkJCQkgICAgICAgcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NTaXplKTsKKworCQkJLyogU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbiAqLworCQkJQnVmQmFzZVBhSGlnaCA9CisJCQkgICAgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+VHhCdWZTcGFjZVtudW1dLgorCQkJCQkJCUFsbG9jUGEpOworCQkJQnVmQmFzZVBhTG93ID0KKwkJCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4QnVmU3BhY2VbbnVtXS4KKwkJCQkJCSAgICAgICBBbGxvY1BhKTsKKwkJCUJ1ZkJhc2VWYSA9IHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmE7CisKKwkJCS8qICovCisJCQkvKiBJbml0aWFsaXplIFR4IFJpbmcgRGVzY3JpcHRvciBhbmQgYXNzb2NpYXRlZCBidWZmZXIgbWVtb3J5ICovCisJCQkvKiAqLworCQkJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tudW1dOworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgVFhfUklOR19TSVpFOyBpbmRleCsrKSB7CisJCQkJcFR4UmluZy0+Q2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBOVUxMOworCQkJCXBUeFJpbmctPkNlbGxbaW5kZXhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisJCQkJLyogSW5pdCBUeCBSaW5nIFNpemUsIFZhLCBQYSB2YXJpYWJsZXMgKi8KKwkJCQlwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1NpemUgPSBUWERfU0laRTsKKwkJCQlwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1ZhID0gUmluZ0Jhc2VWYTsKKwkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2gocFR4UmluZy0+CisJCQkJCQkJICAgIENlbGxbaW5kZXhdLkFsbG9jUGEsCisJCQkJCQkJICAgIFJpbmdCYXNlUGFIaWdoKTsKKwkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW2luZGV4XS4KKwkJCQkJCQkgICBBbGxvY1BhLAorCQkJCQkJCSAgIFJpbmdCYXNlUGFMb3cpOworCisJCQkJLyogU2V0dXAgVHggQnVmZmVyIHNpemUgJiBhZGRyZXNzLiBvbmx5IDgwMi4xMSBoZWFkZXIgd2lsbCBzdG9yZSBpbiB0aGlzIHNwYWNlICovCisJCQkJcERtYUJ1ZiA9ICZwVHhSaW5nLT5DZWxsW2luZGV4XS5EbWFCdWY7CisJCQkJcERtYUJ1Zi0+QWxsb2NTaXplID0gVFhfRE1BXzFTVF9CVUZGRVJfU0laRTsKKwkJCQlwRG1hQnVmLT5BbGxvY1ZhID0gQnVmQmFzZVZhOworCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwRG1hQnVmLT5BbGxvY1BhLAorCQkJCQkJCSAgICBCdWZCYXNlUGFIaWdoKTsKKwkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhwRG1hQnVmLT5BbGxvY1BhLAorCQkJCQkJCSAgIEJ1ZkJhc2VQYUxvdyk7CisKKwkJCQkvKiBsaW5rIHRoZSBwcmUtYWxsb2NhdGVkIFR4QnVmIHRvIFRYRCAqLworCQkJCXBUeEQgPQorCQkJCSAgICAoc3RydWN0IHJ0X3R4ZCAqKSBwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1ZhOworCQkJCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKKwkJCQkvKiBhZHZhbmNlIHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MgKi8KKwkJCQlwVHhELT5ETUFET05FID0gMTsKKwkJCQlSaW5nQmFzZVBhTG93ICs9IFRYRF9TSVpFOworCQkJCVJpbmdCYXNlVmEgPSAodTggKilSaW5nQmFzZVZhICsgVFhEX1NJWkU7CisKKwkJCQkvKiBhZHZhbmNlIHRvIG5leHQgVHhCdWYgYWRkcmVzcyAqLworCQkJCUJ1ZkJhc2VQYUxvdyArPSBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFOworCQkJCUJ1ZkJhc2VWYSA9CisJCQkJICAgICh1OCAqKUJ1ZkJhc2VWYSArIFRYX0RNQV8xU1RfQlVGRkVSX1NJWkU7CisJCQl9CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJUeFJpbmdbJWRdOiB0b3RhbCAlZCBlbnRyeSBhbGxvY2F0ZWRcbiIsIG51bSwKKwkJCQkgIGluZGV4KSk7CisJCX0KKwkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19SRVNPVVJDRVMpCisJCQlicmVhazsKKworCQkvKiAqLworCQkvKiBBbGxvY2F0ZSBNR01UIHJpbmcgZGVzY3JpcHRvcidzIG1lbW9yeSBleGNlcHQgVHggcmluZyB3aGljaCBhbGxvY2F0ZWQgZWFyaWxlciAqLworCQkvKiAqLworCQlwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUgPSBNR01UX1JJTkdfU0laRSAqIFRYRF9TSVpFOworCQlSVE1QX0FsbG9jYXRlTWdtdERlc2NNZW1vcnkocEFkLAorCQkJCQkgICAgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplLAorCQkJCQkgICAgRkFMU0UsCisJCQkJCSAgICAmcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwKKwkJCQkJICAgICZwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKKworCQlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSA9PSBOVUxMKSB7CisJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJYnJlYWs7CisJCX0KKwkJLyogWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrICovCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsCisJCQkgICAgICAgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplKTsKKworCQkvKiBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uICovCisJCVJpbmdCYXNlUGFIaWdoID0KKwkJICAgIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKKwkJUmluZ0Jhc2VQYUxvdyA9CisJCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKKwkJUmluZ0Jhc2VWYSA9IHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmE7CisKKwkJLyogKi8KKwkJLyogSW5pdGlhbGl6ZSBNR01UIFJpbmcgYW5kIGFzc29jaWF0ZWQgYnVmZmVyIG1lbW9yeSAqLworCQkvKiAqLworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNR01UX1JJTkdfU0laRTsgaW5kZXgrKykgeworCQkJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisJCQlwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisJCQkvKiBJbml0IE1HTVQgUmluZyBTaXplLCBWYSwgUGEgdmFyaWFibGVzICovCisJCQlwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLkFsbG9jU2l6ZSA9IFRYRF9TSVpFOworCQkJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1ZhID0gUmluZ0Jhc2VWYTsKKwkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLgorCQkJCQkJICAgIEFsbG9jUGEsIFJpbmdCYXNlUGFIaWdoKTsKKwkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uCisJCQkJCQkgICBBbGxvY1BhLCBSaW5nQmFzZVBhTG93KTsKKworCQkJLyogT2Zmc2V0IHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MgKi8KKwkJCVJpbmdCYXNlUGFMb3cgKz0gVFhEX1NJWkU7CisJCQlSaW5nQmFzZVZhID0gKHU4ICopUmluZ0Jhc2VWYSArIFRYRF9TSVpFOworCisJCQkvKiBsaW5rIHRoZSBwcmUtYWxsb2NhdGVkIFR4QnVmIHRvIFRYRCAqLworCQkJcFR4RCA9IChzdHJ1Y3QgcnRfdHhkICopIHBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NWYTsKKwkJCXBUeEQtPkRNQURPTkUgPSAxOworCisJCQkvKiBubyBwcmUtYWxsb2NhdGVkIGJ1ZmZlciByZXF1aXJlZCBpbiBNZ210UmluZyBmb3Igc2NhdHRlci1nYXRoZXIgY2FzZSAqLworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiTUdNVCBSaW5nOiB0b3RhbCAlZCBlbnRyeSBhbGxvY2F0ZWRcbiIsIGluZGV4KSk7CisKKwkJLyogKi8KKwkJLyogQWxsb2NhdGUgUlggcmluZyBkZXNjcmlwdG9yJ3MgbWVtb3J5IGV4Y2VwdCBUeCByaW5nIHdoaWNoIGFsbG9jYXRlZCBlYXJpbGVyICovCisJCS8qICovCisJCXBBZC0+UnhEZXNjUmluZy5BbGxvY1NpemUgPSBSWF9SSU5HX1NJWkUgKiBSWERfU0laRTsKKwkJUlRNUF9BbGxvY2F0ZVJ4RGVzY01lbW9yeShwQWQsCisJCQkJCSAgcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSwKKwkJCQkJICBGQUxTRSwKKwkJCQkJICAmcEFkLT5SeERlc2NSaW5nLkFsbG9jVmEsCisJCQkJCSAgJnBBZC0+UnhEZXNjUmluZy5BbGxvY1BhKTsKKworCQlpZiAocEFkLT5SeERlc2NSaW5nLkFsbG9jVmEgPT0gTlVMTCkgeworCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKKwkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCWJyZWFrOworCQl9CisJCS8qIFplcm8gaW5pdCB0aGlzIG1lbW9yeSBibG9jayAqLworCQlOZGlzWmVyb01lbW9yeShwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwKKwkJCSAgICAgICBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19PRkYsCisJCQkgKCJSWCBERVNDICVwICBzaXplID0gJWxkXG4iLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwKKwkJCSAgcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSkpOworCisJCS8qIFNhdmUgUEEgJiBWQSBmb3IgZnVydGhlciBvcGVyYXRpb24gKi8KKwkJUmluZ0Jhc2VQYUhpZ2ggPQorCQkgICAgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+UnhEZXNjUmluZy5BbGxvY1BhKTsKKwkJUmluZ0Jhc2VQYUxvdyA9CisJCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlJ4RGVzY1JpbmcuQWxsb2NQYSk7CisJCVJpbmdCYXNlVmEgPSBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYTsKKworCQkvKiAqLworCQkvKiBJbml0aWFsaXplIFJ4IFJpbmcgYW5kIGFzc29jaWF0ZWQgYnVmZmVyIG1lbW9yeSAqLworCQkvKiAqLworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBSWF9SSU5HX1NJWkU7IGluZGV4KyspIHsKKwkJCS8qIEluaXQgUlggUmluZyBTaXplLCBWYSwgUGEgdmFyaWFibGVzICovCisJCQlwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1NpemUgPSBSWERfU0laRTsKKwkJCXBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmEgPSBSaW5nQmFzZVZhOworCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLgorCQkJCQkJICAgIEFsbG9jUGEsIFJpbmdCYXNlUGFIaWdoKTsKKwkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLgorCQkJCQkJICAgQWxsb2NQYSwgUmluZ0Jhc2VQYUxvdyk7CisKKwkJCS8qTmRpc1plcm9NZW1vcnkoUmluZ0Jhc2VWYSwgUlhEX1NJWkUpOyAqLworCisJCQkvKiBPZmZzZXQgdG8gbmV4dCByaW5nIGRlc2NyaXB0b3IgYWRkcmVzcyAqLworCQkJUmluZ0Jhc2VQYUxvdyArPSBSWERfU0laRTsKKwkJCVJpbmdCYXNlVmEgPSAodTggKilSaW5nQmFzZVZhICsgUlhEX1NJWkU7CisKKwkJCS8qIFNldHVwIFJ4IGFzc29jaWF0ZWQgQnVmZmVyIHNpemUgJiBhbGxvY2F0ZSBzaGFyZSBtZW1vcnkgKi8KKwkJCXBEbWFCdWYgPSAmcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uRG1hQnVmOworCQkJcERtYUJ1Zi0+QWxsb2NTaXplID0gUlhfQlVGRkVSX0FHR1JFU0laRTsKKwkJCXBQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIocEFkLAorCQkJCQkJCSAgICAgIHBEbWFCdWYtPgorCQkJCQkJCSAgICAgIEFsbG9jU2l6ZSwgRkFMU0UsCisJCQkJCQkJICAgICAgJnBEbWFCdWYtPkFsbG9jVmEsCisJCQkJCQkJICAgICAgJnBEbWFCdWYtPgorCQkJCQkJCSAgICAgIEFsbG9jUGEpOworCisJCQkvKiBrZWVwIGFsbG9jYXRlZCByeCBwYWNrZXQgKi8KKwkJCXBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKKworCQkJLyogRXJyb3IgaGFuZGxpbmcgKi8KKwkJCWlmIChwRG1hQnVmLT5BbGxvY1ZhID09IE5VTEwpIHsKKwkJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOworCQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBSeFJpbmcncyAxc3QgYnVmZmVyXG4iKSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrICovCisJCQlOZGlzWmVyb01lbW9yeShwRG1hQnVmLT5BbGxvY1ZhLCBwRG1hQnVmLT5BbGxvY1NpemUpOworCisJCQkvKiBXcml0ZSBSeEQgYnVmZmVyIGFkZHJlc3MgJiBhbGxvY2F0ZWQgYnVmZmVyIGxlbmd0aCAqLworCQkJcFJ4RCA9IChzdHJ1Y3QgcnRfcnhkICopIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmE7CisJCQlwUnhELT5TRFAwID0KKwkJCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwRG1hQnVmLT5BbGxvY1BhKTsKKwkJCXBSeEQtPkRET05FID0gMDsKKworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSeCBSaW5nOiB0b3RhbCAlZCBlbnRyeSBhbGxvY2F0ZWRcbiIsIGluZGV4KSk7CisKKwl9IHdoaWxlIChGQUxTRSk7CisKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5GcmFnRnJhbWUsIHNpemVvZihzdHJ1Y3QgcnRfZnJhZ21lbnRfZnJhbWUpKTsKKwlwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9CisJICAgIFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKHBBZCwgUlhfQlVGRkVSX05PUk1TSVpFKTsKKworCWlmIChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9PSBOVUxMKSB7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwl9CisKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJLyogTG9nIGVycm9yIGluZm9yYW10aW9uICovCisJCU5kaXNXcml0ZUVycm9yTG9nRW50cnkocEFkLT5BZGFwdGVySGFuZGxlLAorCQkJCSAgICAgICBORElTX0VSUk9SX0NPREVfT1VUX09GX1JFU09VUkNFUywKKwkJCQkgICAgICAgMSwgRXJyb3JWYWx1ZSk7CisJfQorCS8qIEZvbGxvd2luZyBjb2RlIHNlZ21lbnQgZ2V0IGZyb20gb3JpZ2luYWwgZnVuYzpOSUNJbml0VHhSeFJpbmdBbmRCYWNrbG9nUXVldWUoKSwgbm93IHNob3VsZCBpbnRlZ3JhdGUgaXQgdG8gaGVyZS4gKi8KKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiLS0+IE5JQ0luaXRUeFJ4UmluZ0FuZEJhY2tsb2dRdWV1ZVxuIikpOworCisvKgorCQkvLyBEaXNhYmxlIERNQS4KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCQlHbG9DZmcud29yZCAmPSAweGZmMDsKKwkJR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9MTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOworKi8KKworCQkvKiBJbml0aWFsaXplIGFsbCB0cmFuc21pdCByZWxhdGVkIHNvZnR3YXJlIHF1ZXVlcyAqLworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykgeworCQkJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPlR4U3dRdWV1ZVtpbmRleF0pOworCQkJLyogSW5pdCBUWCByaW5ncyBpbmRleCBwb2ludGVyICovCisJCQlwQWQtPlR4UmluZ1tpbmRleF0uVHhTd0ZyZWVJZHggPSAwOworCQkJcEFkLT5UeFJpbmdbaW5kZXhdLlR4Q3B1SWR4ID0gMDsKKwkJCS8qUlRNUF9JT19XUklURTMyKHBBZCwgKFRYX0NUWF9JRFgwICsgaSAqIDB4MTApICwgIHBBZC0+VHhSaW5nW2ldLlRYX0NUWF9JRFgpOyAqLworCQl9CisKKwkJLyogSW5pdCBSWCBSaW5nIGluZGV4IHBvaW50ZXIgKi8KKwkJcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPSAwOworCQlwQWQtPlJ4UmluZy5SeENwdUlkeCA9IFJYX1JJTkdfU0laRSAtIDE7CisJCS8qUlRNUF9JT19XUklURTMyKHBBZCwgUlhfQ1JYX0lEWCwgcEFkLT5SeFJpbmcuUlhfQ1JYX0lEWDApOyAqLworCisJCS8qIGluaXQgTUdNVCByaW5nIGluZGV4IHBvaW50ZXIgKi8KKwkJcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA9IDA7CisJCXBBZC0+TWdtdFJpbmcuVHhDcHVJZHggPSAwOworCisJCXBBZC0+UHJpdmF0ZUluZm8uVHhSaW5nRnVsbENudCA9IDA7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI8LS0gTklDSW5pdFR4UnhSaW5nQW5kQmFja2xvZ1F1ZXVlXG4iKSk7CisJfQorCisJREJHUFJJTlRfUyhTdGF0dXMsCisJCSAgICgiPC0tIFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5LCBTdGF0dXM9JXhcbiIsIFN0YXR1cykpOworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZXNldCBOSUMgQXNpY3MuIENhbGwgYWZ0ZXIgcmVzdCBETUEuIFNvIHJlc2V0IFRYX0NUWF9JRFggdG8gemVyby4KKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisJCVJlc2V0IE5JQyB0byBpbml0aWFsIHN0YXRlIEFTIElTIHN5c3RlbSBib290IHVwIHRpbWUuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUTVBSaW5nQ2xlYW5VcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IFJpbmdUeXBlKQoreworCXN0cnVjdCBydF90eGQgKiBwVHhEOworCXN0cnVjdCBydF9yeGQgKiBwUnhEOworCXN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqcEVudHJ5OworCXZvaWQgKnBQYWNrZXQ7CisJaW50IGk7CisJc3RydWN0IHJ0X3J0bXBfdHhfcmluZyAqcFR4UmluZzsKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzOworCS8qdTMyICAgICAgICAgICAgICAgICAgICAgICAgUnhTd1JlYWRJZHg7ICovCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRNUFJpbmdDbGVhblVwKFJpbmdJZHg9JWQsIFBlbmRpbmctTkRJUz0lbGQpXG4iLCBSaW5nVHlwZSwKKwkJICBwQWQtPlJhbGlua0NvdW50ZXJzLlBlbmRpbmdOZGlzUGFja2V0Q291bnQpKTsKKwlzd2l0Y2ggKFJpbmdUeXBlKSB7CisJY2FzZSBRSURfQUNfQks6CisJY2FzZSBRSURfQUNfQkU6CisJY2FzZSBRSURfQUNfVkk6CisJY2FzZSBRSURfQUNfVk86CisKKwkJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tSaW5nVHlwZV07CisKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCQkvKiBXZSBoYXZlIHRvIGNsZWFuIGFsbCBkZXNjcmlwdG9ycyBpbiBjYXNlIHNvbWUgZXJyb3IgaGFwcGVuZWQgd2l0aCByZXNldCAqLworCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCS8qIFdlIGhhdmUgdG8gc2NhbiBhbGwgVFggcmluZyAqLworCQl7CisJCQlwVHhEID0gKHN0cnVjdCBydF90eGQgKikgcFR4UmluZy0+Q2VsbFtpXS5BbGxvY1ZhOworCisJCQlwUGFja2V0ID0gKHZvaWQgKilwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0OworCQkJLyogcmVsZWFzZSBzY2F0dGVyLWFuZC1nYXRoZXIgY2hhciAqLworCQkJaWYgKHBQYWNrZXQpIHsKKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwKKwkJCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKKwkJCX0KKworCQkJcFBhY2tldCA9CisJCQkgICAgKHZvaWQgKilwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldDsKKwkJCS8qIHJlbGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIGNoYXIgKi8KKwkJCWlmIChwUGFja2V0KSB7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsCisJCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCQkJfQorCQl9CisKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFJpbmdUeXBlICogMHgxMCwKKwkJCSAgICAgICAmcFR4UmluZy0+VHhEbWFJZHgpOworCQlwVHhSaW5nLT5UeFN3RnJlZUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OworCQlwVHhSaW5nLT5UeENwdUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFJpbmdUeXBlICogMHgxMCwKKwkJCQlwVHhSaW5nLT5UeENwdUlkeCk7CisKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7CisKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCQl3aGlsZSAocEFkLT5UeFN3UXVldWVbUmluZ1R5cGVdLkhlYWQgIT0gTlVMTCkgeworCQkJcEVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwQWQtPlR4U3dRdWV1ZVtSaW5nVHlwZV0pOworCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpOworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiUmVsZWFzZSAxIE5ESVMgcGFja2V0IGZyb20gcy93IGJhY2tsb2cgcXVldWVcbiIpKTsKKwkJfQorCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIFFJRF9NR01UOgorCQkvKiBXZSBoYXZlIHRvIGNsZWFuIGFsbCBkZXNjcmlwdG9ycyBpbiBjYXNlIHNvbWUgZXJyb3IgaGFwcGVuZWQgd2l0aCByZXNldCAqLworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7CisKKwkJZm9yIChpID0gMDsgaSA8IE1HTVRfUklOR19TSVpFOyBpKyspIHsKKwkJCXBUeEQgPSAoc3RydWN0IHJ0X3R4ZCAqKSBwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKKworCQkJcFBhY2tldCA9CisJCQkgICAgKHZvaWQgKilwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5kaXNQYWNrZXQ7CisJCQkvKiBybGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIGNoYXIgKi8KKwkJCWlmIChwUGFja2V0KSB7CisJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMCwKKwkJCQkJCSBwVHhELT5TRExlbjAsCisJCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsCisJCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQl9CisJCQlwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJCQlwUGFja2V0ID0KKwkJCSAgICAodm9pZCAqKXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS4KKwkJCSAgICBwTmV4dE5kaXNQYWNrZXQ7CisJCQkvKiByZWxlYXNlIHNjYXR0ZXItYW5kLWdhdGhlciBjaGFyICovCisJCQlpZiAocFBhY2tldCkgeworCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsCisJCQkJCQkgcFR4RC0+U0RMZW4xLAorCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LAorCQkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJfQorCQkJcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisKKwkJfQorCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTUdNVERUWF9JRFgsICZwQWQtPk1nbXRSaW5nLlR4RG1hSWR4KTsKKwkJcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA9IHBBZC0+TWdtdFJpbmcuVHhEbWFJZHg7CisJCXBBZC0+TWdtdFJpbmcuVHhDcHVJZHggPSBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4OworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgcEFkLT5NZ210UmluZy5UeENwdUlkeCk7CisKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFFJRF9SWDoKKwkJLyogV2UgaGF2ZSB0byBjbGVhbiBhbGwgZGVzY3JpcHRvcnMgaW4gY2FzZSBzb21lIGVycm9yIGhhcHBlbmVkIHdpdGggcmVzZXQgKi8KKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJCXBSeEQgPSAoc3RydWN0IHJ0X3J4ZCAqKSBwQWQtPlJ4UmluZy5DZWxsW2ldLkFsbG9jVmE7CisJCQlwUnhELT5ERE9ORSA9IDA7CisJCX0KKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0RSWF9JRFgsICZwQWQtPlJ4UmluZy5SeERtYUlkeCk7CisJCXBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID0gcEFkLT5SeFJpbmcuUnhEbWFJZHg7CisJCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0KKwkJICAgICgocEFkLT5SeFJpbmcuUnhEbWFJZHggPT0KKwkJICAgICAgMCkgPyAoUlhfUklOR19TSVpFIC0gMSkgOiAocEFkLT5SeFJpbmcuUnhEbWFJZHggLSAxKSk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKKworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPlJ4UmluZ0xvY2spOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKwordm9pZCBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlpbnQgaW5kZXgsIG51bSwgajsKKwlzdHJ1Y3QgcnRfcnRtcF90eF9yaW5nICpwVHhSaW5nOworCXN0cnVjdCBydF90eGQgKiBwVHhEOworCXZvaWQgKnBQYWNrZXQ7CisJdW5zaWduZWQgaW50IElycUZsYWdzOworCisJLypzdHJ1Y3Qgb3NfY29va2llICpwT2JqID0oc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOyAqLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBGcmVlVHhSeFJpbmdNZW1vcnlcbiIpKTsKKworCS8qIEZyZWUgVHhTd1F1ZXVlIFBhY2tldCAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKSB7CisJCXN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqcEVudHJ5OworCQl2b2lkICpwUGFja2V0OworCQlzdHJ1Y3QgcnRfcXVldWVfaGVhZGVyICpwUXVldWU7CisKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCQlwUXVldWUgPSAmcEFkLT5UeFN3UXVldWVbaW5kZXhdOworCQl3aGlsZSAocFF1ZXVlLT5IZWFkKSB7CisJCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUocFF1ZXVlKTsKKwkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KTsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJfQorCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwl9CisKKwkvKiBGcmVlIFR4IFJpbmcgUGFja2V0ICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GX1RYX1JJTkc7IGluZGV4KyspIHsKKwkJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tpbmRleF07CisKKwkJZm9yIChqID0gMDsgaiA8IFRYX1JJTkdfU0laRTsgaisrKSB7CisJCQlwVHhEID0gKHN0cnVjdCBydF90eGQgKikgKHBUeFJpbmctPkNlbGxbal0uQWxsb2NWYSk7CisJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtqXS5wTmRpc1BhY2tldDsKKworCQkJaWYgKHBQYWNrZXQpIHsKKwkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLAorCQkJCQkJIHBUeEQtPlNETGVuMCwKKwkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwKKwkJCQkJCSAgICBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8qQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyICovCisJCQlwVHhSaW5nLT5DZWxsW2pdLnBOZGlzUGFja2V0ID0gTlVMTDsKKworCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbal0ucE5leHROZGlzUGFja2V0OworCisJCQlpZiAocFBhY2tldCkgeworCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsCisJCQkJCQkgcFR4RC0+U0RMZW4xLAorCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LAorCQkJCQkJICAgIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLypBbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyICovCisJCQlwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQgPQorCQkJICAgIE5VTEw7CisKKwkJfQorCX0KKworCWZvciAoaW5kZXggPSBSWF9SSU5HX1NJWkUgLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7CisJCWlmICgocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uRG1hQnVmLkFsbG9jVmEpCisJCSAgICAmJiAocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQpKSB7CisJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwKKwkJCQkJIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkRtYUJ1Zi5BbGxvY1BhLAorCQkJCQkgcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uRG1hQnVmLgorCQkJCQkgQWxsb2NTaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsCisJCQkJCSAgICBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCwKKwkJCQkJICAgIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQl9CisJfQorCU5kaXNaZXJvTWVtb3J5KHBBZC0+UnhSaW5nLkNlbGwsIFJYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgcnRfcnRtcF9kbWFjYikpOworCisJaWYgKHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhKSB7CisJCVJUTVBfRnJlZURlc2NNZW1vcnkocEFkLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplLAorCQkJCSAgICBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwKKwkJCQkgICAgcEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOworCX0KKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5SeERlc2NSaW5nLCBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfZG1hYnVmKSk7CisKKwlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSkgeworCQlSVE1QX0ZyZWVEZXNjTWVtb3J5KHBBZCwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplLAorCQkJCSAgICBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhLAorCQkJCSAgICBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKKwl9CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWdtdERlc2NSaW5nLCBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfZG1hYnVmKSk7CisKKwlmb3IgKG51bSA9IDA7IG51bSA8IE5VTV9PRl9UWF9SSU5HOyBudW0rKykgeworCQlpZiAocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSkgeworCQkJUlRNUF9GcmVlRmlyc3RUeEJ1ZmZlcihwQWQsCisJCQkJCSAgICAgICBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUsCisJCQkJCSAgICAgICBGQUxTRSwKKwkJCQkJICAgICAgIHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEsCisJCQkJCSAgICAgICBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1BhKTsKKwkJfQorCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5UeEJ1ZlNwYWNlW251bV0sIHNpemVvZihzdHJ1Y3QgcnRfcnRtcF9kbWFidWYpKTsKKworCQlpZiAocEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYSkgeworCQkJUlRNUF9GcmVlRGVzY01lbW9yeShwQWQsIHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jU2l6ZSwKKwkJCQkJICAgIHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEsCisJCQkJCSAgICBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKKwkJfQorCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5UeERlc2NSaW5nW251bV0sIHNpemVvZihzdHJ1Y3QgcnRfcnRtcF9kbWFidWYpKTsKKwl9CisKKwlpZiAocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQpCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCwKKwkJCQkgICAgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gUlRNUEZyZWVUeFJ4UmluZ01lbW9yeVxuIikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKglyZWdpc3RlciByZWxhdGVkIHByb2NlZHVyZXMuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIERpc2FibGUgRE1BLgorCitBcmd1bWVudHM6CisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKwlOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUMjhYWERNQURpc2FibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCVdQRE1BX0dMT19DRkdfU1RSVUMgR2xvQ2ZnOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCUdsb0NmZy53b3JkICY9IDB4ZmYwOworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAxOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBFbmFibGUgRE1BLgorCitBcmd1bWVudHM6CisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKwlOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUMjhYWERNQUVuYWJsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJV1BETUFfR0xPX0NGR19TVFJVQyBHbG9DZmc7CisJaW50IGkgPSAwOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDQpOworCWRvIHsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkKKwkJICAgICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQorCQkJYnJlYWs7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+ICBETUFCdXN5XG4iKSk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCWkrKzsKKwl9IHdoaWxlIChpIDwgMjAwKTsKKworCVJUTVB1c2VjRGVsYXkoNTApOworCisJR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9IDE7CisJR2xvQ2ZnLmZpZWxkLldQRE1BQnVyc3RTSVpFID0gMjsKKwlHbG9DZmcuZmllbGQuRW5hYmxlUnhETUEgPSAxOworCUdsb0NmZy5maWVsZC5FbmFibGVUeERNQSA9IDE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPD09IFdSSVRFIERNQSBvZmZzZXQgMHgyMDggPSAweCV4XG4iLCBHbG9DZmcud29yZCkpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKKworfQorCitCT09MRUFOIEFzaWNDaGVja0NvbW1hbk9rKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQ29tbWFuZCkKK3sKKwl1MzIgQ21kU3RhdHVzID0gMCwgQ0lEID0gMCwgaTsKKwl1MzIgVGhpc0NJRE1hc2sgPSAwOworCisJaSA9IDA7CisJZG8geworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgJkNJRCk7CisJCS8qIEZpbmQgd2hlcmUgdGhlIGNvbW1hbmQgaXMuIEJlY2F1c2UgdGhpcyBpcyByYW5kb21seSBzcGVjaWZpZWQgYnkgZmlybXdhcmUuICovCisJCWlmICgoQ0lEICYgQ0lEME1BU0spID09IENvbW1hbmQpIHsKKwkJCVRoaXNDSURNYXNrID0gQ0lEME1BU0s7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICgoKChDSUQgJiBDSUQxTUFTSykgPj4gOCkgJiAweGZmKSA9PSBDb21tYW5kKSB7CisJCQlUaGlzQ0lETWFzayA9IENJRDFNQVNLOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoKCgoQ0lEICYgQ0lEMk1BU0spID4+IDE2KSAmIDB4ZmYpID09IENvbW1hbmQpIHsKKwkJCVRoaXNDSURNYXNrID0gQ0lEMk1BU0s7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICgoKChDSUQgJiBDSUQzTUFTSykgPj4gMjQpICYgMHhmZikgPT0gQ29tbWFuZCkgeworCQkJVGhpc0NJRE1hc2sgPSBDSUQzTUFTSzsKKwkJCWJyZWFrOworCQl9CisKKwkJUlRNUHVzZWNEZWxheSgxMDApOworCQlpKys7CisJfSB3aGlsZSAoaSA8IDIwMCk7CisKKwkvKiBHZXQgQ29tbWFuZFN0YXR1cyBWYWx1ZSAqLworCVJUTVBfSU9fUkVBRDMyKHBBZCwgSDJNX01BSUxCT1hfU1RBVFVTLCAmQ21kU3RhdHVzKTsKKworCS8qIFRoaXMgY29tbWFuZCdzIHN0YXR1cyBpcyBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyBjb21tYW5kLiBTbyBBTkQgY29tbWFuZCBwb3NpdGlvbidzIGJpdG1hc2sgdG8gcmVhZCBzdGF0dXMuICovCisJaWYgKGkgPCAyMDApIHsKKwkJLyogSWYgU3RhdHVzIGlzIDEsIHRoZSBjb21hbW5kIGlzIHN1Y2Nlc3MuICovCisJCWlmICgoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEpCisJCSAgICB8fCAoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEwMCkKKwkJICAgIHx8ICgoQ21kU3RhdHVzICYgVGhpc0NJRE1hc2spID09IDB4MTAwMDApCisJCSAgICB8fCAoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEwMDAwMDApKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCItLT4gQXNpY0NoZWNrQ29tbWFuT2sgQ0lEID0gMHgleCwgQ21kU3RhdHVzPSAweCV4IFxuIiwKKwkJCQkgIENJRCwgQ21kU3RhdHVzKSk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9TVEFUVVMsIDB4ZmZmZmZmZmYpOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ0lELCAweGZmZmZmZmZmKTsKKwkJCXJldHVybiBUUlVFOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiLS0+IEFzaWNDaGVja0NvbW1hbkZhaWwxIENJRCA9IDB4JXgsIENtZFN0YXR1cz0gMHgleCBcbiIsCisJCQkgIENJRCwgQ21kU3RhdHVzKSk7CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCItLT4gQXNpY0NoZWNrQ29tbWFuRmFpbDIgVGltZW91dCBDb21tYW5kID0gJWQsIENtZFN0YXR1cz0gMHgleCBcbiIsCisJCQkgIENvbW1hbmQsIENtZFN0YXR1cykpOworCX0KKwkvKiBDbGVhciBDb21tYW5kIGFuZCBTdGF0dXMuICovCisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfU1RBVFVTLCAweGZmZmZmZmZmKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DSUQsIDB4ZmZmZmZmZmYpOworCisJcmV0dXJuIEZBTFNFOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFdyaXRlIEJlYWNvbiBidWZmZXIgdG8gQXNpYy4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVDI4eHhfVXBkYXRlQmVhY29uVG9Bc2ljKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICBpbnQgYXBpZHgsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBGcmFtZUxlbiwgdW5zaWduZWQgbG9uZyBVcGRhdGVQb3MpCit7CisJdW5zaWduZWQgbG9uZyBDYXBJbmZvUG9zID0gMDsKKwl1OCAqcHRyLCAqcHRyX3VwZGF0ZSwgKnB0cl9jYXBpbmZvOworCXUzMiBpOworCUJPT0xFQU4gYkJjblJlcSA9IEZBTFNFOworCXU4IGJjbl9pZHggPSAwOworCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzKCkgOiBObyB2YWxpZCBJbnRlcmZhY2UgYmUgZm91bmQuXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm47CisJfQorCisJLyppZiAoKHBBZC0+V2RzVGFiLk1vZGUgPT0gV0RTX0JSSURHRV9NT0RFKSAqLworCS8qICAgICAgfHwgKChwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uTVNTSUREZXYgPT0gTlVMTCkgKi8KKwkvKiAgICAgICAgICAgICAgfHwgIShwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uTVNTSUREZXYtPmZsYWdzICYgSUZGX1VQKSkgKi8KKwkvKiAgICAgICkgKi8KKwlpZiAoYkJjblJlcSA9PSBGQUxTRSkgeworCQkvKiB3aGVuIHRoZSByYSBpbnRlcmZhY2UgaXMgZG93biwgZG8gbm90IHNlbmQgaXRzIGJlYWNvbiBmcmFtZSAqLworCQkvKiBjbGVhciBhbGwgemVybyAqLworCQlmb3IgKGkgPSAwOyBpIDwgVFhXSV9TSVpFOyBpICs9IDQpCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksCisJCQkJCTB4MDApOworCX0gZWxzZSB7CisJCXB0ciA9ICh1OCAqKSYgcEFkLT5CZWFjb25UeFdJOworCQlmb3IgKGkgPSAwOyBpIDwgVFhXSV9TSVpFOyBpICs9IDQpCS8qIDE2LWJ5dGUgVFhXSSBmaWVsZCAqLworCQl7CisJCQl1MzIgbG9uZ3B0ciA9CisJCQkgICAgKnB0ciArICgqKHB0ciArIDEpIDw8IDgpICsgKCoocHRyICsgMikgPDwgMTYpICsKKwkJCSAgICAoKihwdHIgKyAzKSA8PCAyNCk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksCisJCQkJCWxvbmdwdHIpOworCQkJcHRyICs9IDQ7CisJCX0KKworCQkvKiBVcGRhdGUgQ2FwYWJpbGl0eUluZm8gaW4gQmVhY29uICovCisJCWZvciAoaSA9IENhcEluZm9Qb3M7IGkgPCAoQ2FwSW5mb1BvcyArIDIpOyBpKyspIHsKKwkJCVJUTVBfSU9fV1JJVEU4KHBBZCwKKwkJCQkgICAgICAgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBUWFdJX1NJWkUgKworCQkJCSAgICAgICBpLCAqcHRyX2NhcGluZm8pOworCQkJcHRyX2NhcGluZm8rKzsKKwkJfQorCisJCWlmIChGcmFtZUxlbiA+IFVwZGF0ZVBvcykgeworCQkJZm9yIChpID0gVXBkYXRlUG9zOyBpIDwgKEZyYW1lTGVuKTsgaSsrKSB7CisJCQkJUlRNUF9JT19XUklURTgocEFkLAorCQkJCQkgICAgICAgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKworCQkJCQkgICAgICAgVFhXSV9TSVpFICsgaSwgKnB0cl91cGRhdGUpOworCQkJCXB0cl91cGRhdGUrKzsKKwkJCX0KKwkJfQorCisJfQorCit9CisKK3ZvaWQgUlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gQk9PTEVBTiBiRnJvbVR4KQoreworCUFVVE9fV0FLRVVQX1NUUlVDIEF1dG9XYWtldXBDZmc7CisKKwlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCXJldHVybjsKKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dBS0VVUF9OT1cpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndha2luZyB1cCBub3chXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVyk7CisKKwlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0dPX1RPX1NMRUVQX05PVyk7CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkKKwkgICAgJiYgcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpIHsKKwkJLyogU3VwcG9ydCBQQ0llIEFkdmFuY2UgUG93ZXIgU2F2ZSAqLworCQlpZiAoYkZyb21UeCA9PSBUUlVFICYmIChwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9PSBUUlVFKSkgeworCQkJcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKwkJCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7CisJCQlSVE1QdXNlY0RlbGF5KDMwMDApOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiPT09PT09PUFzaWNGb3JjZVdha2V1cD09PWJGcm9tVHhcbiIpKTsKKwkJfQorCisJCUF1dG9XYWtldXBDZmcud29yZCA9IDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKworCQlpZiAoUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBET1QxMVBPV0VSU0FWRSkpIHsKKyNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKKwkJCS8qIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwLCBsb2FkIFJGIG5vcm1hbCBvcGVyYXRpb24tbW9kZSBzZXR1cCAqLworCQkJaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkKKwkJCSAgICAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKSkgeworCQkJCXN0cnVjdCBydF9ydG1wX2NoaXBfb3AgKnBDaGlwT3BzID0gJnBBZC0+Y2hpcE9wczsKKworCQkJCWlmIChwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUpCisJCQkJCXBDaGlwT3BzLT4KKwkJCQkJICAgIEFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKHBBZCk7CisJCQl9IGVsc2UKKyNlbmRpZiAvKiBQQ0lFX1BTX1NVUFBPUlQgLy8gKi8KKwkJCXsKKwkJCQkvKiBlbmQgam9obmxpICovCisJCQkJLyogSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uICovCisJCQkJaWYgKElORlJBX09OKHBBZCkKKwkJCQkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkJICAgICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby4KKwkJCQkJQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkgeworCQkJCQkvKiBNdXN0IHVzaW5nIDQwTUh6LiAqLworCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsCisJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy4KKwkJCQkJCQkgIENlbnRyYWxDaGFubmVsLAorCQkJCQkJCSAgRkFMU0UpOworCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLAorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLgorCQkJCQkJCUNlbnRyYWxDaGFubmVsKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBNdXN0IHVzaW5nIDIwTUh6LiAqLworCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsCisJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy4KKwkJCQkJCQkgIENoYW5uZWwsIEZBTFNFKTsKKwkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCQl9CisJCQl9CisJCX0KKyNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKKwkJLyogMzA5MCBNQ1UgV2FrZXVwIGNvbW1hbmQgbmVlZHMgbW9yZSB0aW1lIHRvIGJlIHN0YWJsZS4gKi8KKwkJLyogQmVmb3JlIHN0YWJsZSwgZG9uJ3QgaXNzdWUgb3RoZXIgTUNVIGNvbW1hbmQgdG8gcHJldmVudCBmcm9tIGZpcm13YXJlIGVycm9yLiAqLworCQlpZiAoKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkKKwkJICAgICAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKKwkJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCisJCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCI8PT1SVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXA6OlJlbGVhc2UgdGhlIE1DVSBMb2NrKDMwOTApXG4iKSk7CisJCQlSVE1QX1NFTV9MT0NLKCZwQWQtPk1jdUNtZExvY2spOworCQkJcEFkLT5icnQzMHh4QmFuTWN1Q21kID0gRkFMU0U7CisJCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWN1Q21kTG9jayk7CisJCX0KKyNlbmRpZiAvKiBQQ0lFX1BTX1NVUFBPUlQgLy8gKi8KKwl9IGVsc2UgeworCQkvKiBQQ0ksIDI4NjAtUENJZSAqLworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIjw9PVJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cDo6T3JpZ2luYWwgUENJIFBvd2VyIFNhdmluZ1xuIikpOworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIDB4ZmYsIDB4MDAsIDB4MDIpOworCQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7CisJfQorCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVyk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PT09PT1SVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXBcbiIpKTsKK30KKwordm9pZCBSVDI4eHhQY2lTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSB1MTYgVGJ0dE51bVRvTmV4dFdha2VVcCkKK3sKKwlCT09MRUFOIGJyYzsKKworCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpIHsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisJCXJldHVybjsKKwl9CisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCisJICAgICYmIHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSB7CisJCXVuc2lnbmVkIGxvbmcgTm93ID0gMDsKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVykpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndha2luZyB1cCBub3chXG4iKSk7CisJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKwkJCXJldHVybjsKKwkJfQorCisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJCS8qIElmIGxhc3Qgc2VuZCBOVUxMIGZyYW0gdGltZSBpcyB0b28gY2xvc2UgdG8gdGhpcyByZWNlaXZpbmcgYmVhY29uICh3aXRoaW4gOG1zKSwgZG9uJ3QgZ28gdG8gc2xlZXAgZm9yIHRoaXMgRFRNLiAqLworCQkvKiBCZWNhdXNlIFNvbWUgQVAgY2FuJ3QgcXVldWluZyBvdXRnb2luZyBmcmFtZXMgaW1tZWRpYXRlbHkuICovCisJCWlmICgoKHBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lICsgOCkgPj0gTm93KQorCQkgICAgJiYgKHBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lIDw9IE5vdykpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk5vdyA9ICVsdSwgTGFzdFNlbmROVUxMcHNtVGltZT0lbHUgOiAgUnhDb3VudFNpbmNlTGFzdE5VTEwgPSAlbHUuIFxuIiwKKwkJCQkgIE5vdywgcEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUsCisJCQkJICBwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMKSk7CisJCQlyZXR1cm47CisJCX0gZWxzZSBpZiAoKHBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwgPiAwKQorCQkJICAgJiYKKwkJCSAgICgocEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUgKworCQkJICAgICBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QpID49IE5vdykpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk5vdyA9ICVsdSwgTGFzdFNlbmROVUxMcHNtVGltZT0lbHU6IFJ4Q291bnRTaW5jZUxhc3ROVUxMID0gJWx1ID4gMCBcbiIsCisJCQkJICBOb3csIHBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lLAorCQkJCSAgcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCkpOworCQkJcmV0dXJuOworCQl9CisKKwkJYnJjID0KKwkJICAgIFJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIERPVDExUE9XRVJTQVZFLAorCQkJCQkgIFRidHROdW1Ub05leHRXYWtlVXApOworCQlpZiAoYnJjID09IFRSVUUpCisJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisJfSBlbHNlIHsKKwkJQVVUT19XQUtFVVBfU1RSVUMgQXV0b1dha2V1cENmZzsKKwkJLyogd2UgaGF2ZSBkZWNpZGVkIHRvIFNMRUVQLCBzbyBhdCBsZWFzdCBkbyBpdCBmb3IgYSBCRUFDT04gcGVyaW9kLiAqLworCQlpZiAoVGJ0dE51bVRvTmV4dFdha2VVcCA9PSAwKQorCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IDE7CisKKwkJLypSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIEF1dG9XYWtldXBJbnQpOyAqLworCisJCUF1dG9XYWtldXBDZmcud29yZCA9IDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKwkJQXV0b1dha2V1cENmZy5maWVsZC5OdW1vZlNsZWVwaW5nVGJ0dCA9IFRidHROdW1Ub05leHRXYWtlVXAgLSAxOworCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkVuYWJsZUF1dG9XYWtldXAgPSAxOworCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkF1dG9MZWFkVGltZSA9IDU7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCAweGZmLCAweGZmLCAweDAwKTsJLyogc2VuZCBQT1dFUi1TQVZFIGNvbW1hbmQgdG8gTUNVLiBUaW1lb3V0IDQwdXMuICovCisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI8LS0gJXMsIFRidHROdW1Ub05leHRXYWtlVXA9JWQgXG4iLCBfX2Z1bmNfXywKKwkJCSAgVGJ0dE51bVRvTmV4dFdha2VVcCkpOworCX0KKworfQorCit2b2lkIFBzUG9sbFdha2VFeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQoreworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT5Qc1BvbGxXYWtlRXhlYyBcbiIpKTsKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJaWYgKHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nKSB7CisJCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7CisJfQorCXBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisjaWZkZWYgUENJRV9QU19TVVBQT1JUCisJLyogRm9yIHJ0MzB4eCBwb3dlciBzb2x1dGlvbiAzLCBVc2Ugc29mdHdhcmUgdGltZXIgdG8gd2FrZSB1cCBpbiBwc20uIFNvIGNhbGwgKi8KKwkvKiBBc2ljRm9yY2VXYWtldXAgaGVyZSBpbnN0ZWFkIG9mIGhhbmRsaW5nIHR3YWtldXAgaW50ZXJydXB0LiAqLworCWlmICgoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCSAgICAgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpCisJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCisJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI8LS1Qc1BvbGxXYWtlRXhlYzo6MzA5MCBjYWxscyBBc2ljRm9yY2VXYWtldXAocEFkLCBET1QxMVBPV0VSU0FWRSkgaW4gYWR2YW5jZSBcbiIpKTsKKwkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgRE9UMTFQT1dFUlNBVkUpOworCX0KKyNlbmRpZiAvKiBQQ0lFX1BTX1NVUFBPUlQgLy8gKi8KK30KKwordm9pZCBSYWRpb09uRXhlYyh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMykKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKKwlzdHJ1Y3QgcnRfcnRtcF9jaGlwX29wICpwQ2hpcE9wcyA9ICZwQWQtPmNoaXBPcHM7CisJV1BETUFfR0xPX0NGR19TVFJVQyBEbWFDZmc7CisJQk9PTEVBTiBDYW5jZWxsZWQ7CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIi0tPlJhZGlvT25FeGVjKCkgcmV0dXJuIG9uIGZPUF9TVEFUVVNfRE9aRSA9PSBUUlVFOyBcbiIpKTsKKy8qS0ggRGVidWc6IEFkZCB0aGUgY29tcGlsZSBmbGFnICJSVDI4NjAgYW5kIGNvbmRpdGlvbiAqLworI2lmZGVmIFJUTVBfUENJX1NVUFBPUlQKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCisJCSAgICAmJiBwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkKKwkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwgMTApOworI2VuZGlmIC8qIFJUTVBfUENJX1NVUFBPUlQgLy8gKi8KKwkJcmV0dXJuOworCX0KKworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiLS0+UmFkaW9PbkV4ZWMoKSByZXR1cm4gb24gU0NBTl9JTl9QUk9HUkVTUzsgXG4iKSk7CisjaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAorCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkKKwkJICAgICYmIHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKQorCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAxMCk7CisjZW5kaWYgLyogUlRNUF9QQ0lfU1VQUE9SVCAvLyAqLworCQlyZXR1cm47CisJfQorLypLSCBEZWJ1ZzogbmVlZCB0byBjaGVjay4gSSBhZGQgdGhlIGNvbXBpbGUgZmxhZyAiQ09ORklHX1NUQV9TVVBQT1JUIiB0byBlbmNsb3NlIHRoZSBmb2xsb3dpbmcgY29kZXMuICovCisjaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAorCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKQorCSAgICAmJiBwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkgeworCQlwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgJkNhbmNlbGxlZCk7CisJfQorI2VuZGlmIC8qIFJUTVBfUENJX1NVUFBPUlQgLy8gKi8KKwlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpIHsKKwkJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CSyk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CRSk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WSSk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WTyk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKKworCQkvKiAyLiBTZW5kIHdha2UgdXAgY29tbWFuZC4gKi8KKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCBQb3dlcldha2VDSUQsIDB4MDAsIDB4MDIpOworCQkvKiAyLTEuIHdhaXQgY29tbWFuZCBvay4gKi8KKwkJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlcldha2VDSUQpOworCisJCS8qIFdoZW4gUENJIGNsb2NrIGlzIG9mZiwgZG9uJ3Qgd2FudCB0byBzZXJ2aWNlIGludGVycnVwdC4gU28gd2hlbiBiYWNrIHRvIGNsb2NrIG9uLCBlbmFibGUgaW50ZXJydXB0LiAqLworCQkvKlJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgKERFTEFZSU5UTUFTS3xSeElOVCkpOyAqLworCQlSVE1QX0FTSUNfSU5URVJSVVBUX0VOQUJMRShwQWQpOworCisJCS8qIDMuIEVuYWJsZSBUeCBETUEuICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkRtYUNmZy53b3JkKTsKKwkJRG1hQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgRG1hQ2ZnLndvcmQpOworCisJCS8qIEluIFJhZGlvIE9mZiwgd2UgdHVybiBvZmYgUkYgY2xrLCBTbyBub3cgbmVlZCB0byBjYWxsIEFTSUNTd2l0Y2hDaGFubmVsIGFnYWluLiAqLworCQlpZiAoSU5GUkFfT04ocEFkKQorCQkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCSAgICAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09CisJCQlCV180MCkpIHsKKwkJCS8qIE11c3QgdXNpbmcgNDBNSHouICovCisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLAorCQkJCQkgIEZBTFNFKTsKKwkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE11c3QgdXNpbmcgMjBNSHouICovCisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQl9CisKKy8qS0ggRGVidWc6VGhlIGZvbGxvd2luZyBjb2RlcyBzaG91bGQgYmUgZW5jbG9zZWQgYnkgUlQzMDkwIGNvbXBpbGUgZmxhZyAqLworCQlpZiAocENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKQorCQkJcENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKHBBZCk7CisKKyNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKKy8qIDMwOTAgTUNVIFdha2V1cCBjb21tYW5kIG5lZWRzIG1vcmUgdGltZSB0byBiZSBzdGFibGUuICovCisvKiBCZWZvcmUgc3RhYmxlLCBkb24ndCBpc3N1ZSBvdGhlciBNQ1UgY29tbWFuZCB0byBwcmV2ZW50IGZyb20gZmlybXdhcmUgZXJyb3IuICovCisJCWlmICgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCisJCSAgICAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQorCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykKKwkJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkpIHsKKwkJCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWN1Q21kTG9jayk7CisJCQlwQWQtPmJydDMweHhCYW5NY3VDbWQgPSBGQUxTRTsKKwkJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKKwkJfQorI2VuZGlmIC8qIFBDSUVfUFNfU1VQUE9SVCAvLyAqLworCisJCS8qIENsZWFyIFJhZGlvIG9mZiBmbGFnICovCisJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKKworCQkvKiBTZXQgTEVEICovCisJCVJUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT04pOworCisJCWlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX0FDVElWRSkgeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywKKwkJCQkJCSAgICAgcEFkLT5TdGFDZmcuQkJQUjMpOworCQl9CisJfSBlbHNlIHsKKwkJUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHBBZCwgR1VJUkFESU9fT0ZGLCAwKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHNlbmRzIGNvbW1hbmQgdG8gZmlybXdhcmUgYW5kIHR1cm4gb3VyIGNoaXAgdG8gd2FrZSB1cCBtb2RlIGZyb20gcG93ZXIgc2F2ZSBtb2RlLgorCQlCb3RoIFJhZGlvT24gYW5kIC4xMSBwb3dlciBzYXZlIGZ1bmN0aW9uIG5lZWRzIHRvIGNhbGwgdGhpcyByb3V0aW5lLgorCUlucHV0OgorCQlMZXZlbCA9IEdVSVJBRElPX09GRiA6IGNhbGwgdGhpcyBmdW5jdGlvbiBpcyBmcm9tIFJhZGlvIE9mZiB0byBSYWRpbyBPbi4gIE5lZWQgdG8gcmVzdG9yZSBQQ0kgaG9zdCB2YWx1ZS4KKwkJTGV2ZWwgPSBvdGhlciB2YWx1ZSA6IG5vcm1hbCB3YWtlIHVwIGZ1bmN0aW9uLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBSVDI4eHhQY2lBc2ljUmFkaW9PbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IExldmVsKQoreworCS8qV1BETUFfR0xPX0NGR19TVFJVQyAgICAgICBEbWFDZmc7ICovCisJQk9PTEVBTiBDYW5jZWxsZWQ7CisJLyp1MzIgICAgICAgICAgICAgICAgICAgICAgICBNQUNWYWx1ZTsgKi8KKworCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVAgJiYgTGV2ZWwgPT0gRE9UMTFQT1dFUlNBVkUpCisJCXJldHVybiBGQUxTRTsKKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkgeworCQlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpIHsKKwkJCXBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgJkNhbmNlbGxlZCk7CisJCX0KKwkJaWYgKChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSAmJgorCQkgICAgIChMZXZlbCA9PSBHVUlSQURJT19PRkYgfHwgTGV2ZWwgPT0gR1VJX0lETEVfUE9XRVJfU0FWRSkpIHx8CisJCSAgICBSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQpKSB7CisJCQkvKiBTb21lIGNoaXBzIGRvbid0IG5lZWQgdG8gZGVsYXkgNm1zLCBzbyBjb3B5IFJUTVBQQ0llUG93ZXJMaW5rQ3RybFJlc3RvcmUgKi8KKwkJCS8qIHJldHVybiBjb25kaXRpb24gaGVyZS4gKi8KKwkJCS8qCisJCQkgICBpZiAoKChwQWQtPk1BQ1ZlcnNpb24mMHhmZmZmMDAwMCkgIT0gMHgyODYwMDAwMCkKKwkJCSAgICYmICgocEFkLT5EZXZpY2VJRCA9PSBOSUMyODYwX1BDSWVfREVWSUNFX0lEKQorCQkJICAgfHwocEFkLT5EZXZpY2VJRCA9PSBOSUMyNzkwX1BDSWVfREVWSUNFX0lEKSkpCisJCQkgKi8KKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiUlQyOHh4UGNpQXNpY1JhZGlvT24gKClcbiIpKTsKKwkJCQkvKiAxLiBTZXQgUENJIExpbmsgQ29udHJvbCBpbiBDb25maWd1cmF0aW9uIFNwYWNlLiAqLworCQkJCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLAorCQkJCQkJCSAgICAgUkVTVE9SRV9XQUtFVVApOworCQkJCVJUTVB1c2VjRGVsYXkoNjAwMCk7CisJCQl9CisJCX0KKwl9CisjaWZkZWYgUENJRV9QU19TVVBQT1JUCisJaWYgKCEKKwkgICAgKCgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCisJICAgICAgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKKwkgICAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQorCSAgICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkpKSkKKyNlbmRpZiAvKiBQQ0lFX1BTX1NVUFBPUlQgLy8gKi8KKwl7CisJCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlBTTSA6MzA5eGJQQ0ljbGtPZmYgPT0gJWRcbiIsIHBBZC0+YlBDSWNsa09mZikpOworCX0KKwkvKiAyLiBTZW5kIHdha2UgdXAgY29tbWFuZC4gKi8KKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIFBvd2VyV2FrZUNJRCwgMHgwMCwgMHgwMik7CisJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7CisJLyogMi0xLiB3YWl0IGNvbW1hbmQgb2suICovCisJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlcldha2VDSUQpOworCVJUTVBfQVNJQ19JTlRFUlJVUFRfRU5BQkxFKHBBZCk7CisKKwlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKTsKKwlpZiAoTGV2ZWwgPT0gR1VJX0lETEVfUE9XRVJfU0FWRSkgeworI2lmZGVmICBQQ0lFX1BTX1NVUFBPUlQKKworCQkvKiBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cCwgbG9hZCBSRiBub3JtYWwgb3BlcmF0aW9uLW1vZGUgc2V0dXAgKi8KKwkJaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkpIHsKKwkJCXN0cnVjdCBydF9ydG1wX2NoaXBfb3AgKnBDaGlwT3BzID0gJnBBZC0+Y2hpcE9wczsKKworCQkJaWYgKHBDaGlwT3BzLT5Bc2ljUmV2ZXJzZVJmRnJvbVNsZWVwTW9kZSkKKwkJCQlwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUocEFkKTsKKwkJCS8qIDMwOTAgTUNVIFdha2V1cCBjb21tYW5kIG5lZWRzIG1vcmUgdGltZSB0byBiZSBzdGFibGUuICovCisJCQkvKiBCZWZvcmUgc3RhYmxlLCBkb24ndCBpc3N1ZSBvdGhlciBNQ1UgY29tbWFuZCB0byBwcmV2ZW50IGZyb20gZmlybXdhcmUgZXJyb3IuICovCisJCQlpZiAoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCQkJICAgICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpCisJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0KKwkJCQkzKQorCQkJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0KKwkJCQlUUlVFKSkgeworCQkJCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWN1Q21kTG9jayk7CisJCQkJcEFkLT5icnQzMHh4QmFuTWN1Q21kID0gRkFMU0U7CisJCQkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1jdUNtZExvY2spOworCQkJfQorCQl9IGVsc2UKKwkJCS8qIGVuZCBqb2hubGkgKi8KKyNlbmRpZiAvKiBQQ0lFX1BTX1NVUFBPUlQgLy8gKi8KKwkJeworCQkJLyogSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uICovCisJCQl7CisJCQkJaWYgKElORlJBX09OKHBBZCkKKwkJCQkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkJICAgICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby4KKwkJCQkJQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkgeworCQkJCQkvKiBNdXN0IHVzaW5nIDQwTUh6LiAqLworCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsCisJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy4KKwkJCQkJCQkgIENlbnRyYWxDaGFubmVsLAorCQkJCQkJCSAgRkFMU0UpOworCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLAorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLgorCQkJCQkJCUNlbnRyYWxDaGFubmVsKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBNdXN0IHVzaW5nIDIwTUh6LiAqLworCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsCisJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy4KKwkJCQkJCQkgIENoYW5uZWwsIEZBTFNFKTsKKwkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCQl9CisJCQl9CisKKwkJfQorCX0KKwlyZXR1cm4gVFJVRTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBzZW5kcyBjb21tYW5kIHRvIGZpcm13YXJlIGFuZCB0dXJuIG91ciBjaGlwIHRvIHBvd2VyIHNhdmUgbW9kZS4KKwkJQm90aCBSYWRpb09mZiBhbmQgLjExIHBvd2VyIHNhdmUgZnVuY3Rpb24gbmVlZHMgdG8gY2FsbCB0aGlzIHJvdXRpbmUuCisJSW5wdXQ6CisJCUxldmVsID0gR1VJUkFESU9fT0ZGICA6IEdVSSBSYWRpbyBPZmYgbW9kZQorCQlMZXZlbCA9IERPVDExUE9XRVJTQVZFICA6IDgwMi4xMSBwb3dlciBzYXZlIG1vZGUKKwkJTGV2ZWwgPSBSVE1QX0hBTFQgIDogV2hlbiBEaXNhYmxlIGRldmljZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHU4IExldmVsLCB1MTYgVGJ0dE51bVRvTmV4dFdha2VVcCkKK3sKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDIERtYUNmZzsKKwl1OCBpLCB0ZW1wQkJQX1IzID0gMDsKKwlCT09MRUFOIGJyYyA9IEZBTFNFLCBDYW5jZWxsZWQ7CisJdTMyIFRiVFRUaW1lID0gMDsKKwl1MzIgUHNQb2xsVGltZSA9IDAgLyosIE1BQ1ZhbHVlICovIDsKKwl1bnNpZ25lZCBsb25nIEJlYWNvblBlcmlvZFRpbWU7CisJdTMyIFJ4RG1hSWR4LCBSeENwdUlkeDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQXNpY1JhZGlvT2ZmID09PT4gTHY9ICVkLCBUeENwdUlkeCA9ICVkLCBUeERtYUlkeCA9ICVkLiBSeENwdUlkeCA9ICVkLCBSeERtYUlkeCA9ICVkLlxuIiwKKwkJICBMZXZlbCwgcEFkLT5UeFJpbmdbMF0uVHhDcHVJZHgsIHBBZC0+VHhSaW5nWzBdLlR4RG1hSWR4LAorCQkgIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4LCBwQWQtPlJ4UmluZy5SeERtYUlkeCkpOworCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCAmJiBMZXZlbCA9PSBET1QxMVBPV0VSU0FWRSkKKwkJcmV0dXJuIEZBTFNFOworCisJLyogQ2hlY2sgUnggRE1BIGJ1c3kgc3RhdHVzLCBpZiBtb3JlIHRoYW4gaGFsZiBpcyBvY2N1cGllZCwgZ2l2ZSB1cCB0aGlzIHJhZGlvIG9mZi4gKi8KKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0RSWF9JRFgsICZSeERtYUlkeCk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9DUlhfSURYLCAmUnhDcHVJZHgpOworCWlmICgoUnhEbWFJZHggPiBSeENwdUlkeCkgJiYgKChSeERtYUlkeCAtIFJ4Q3B1SWR4KSA+IFJYX1JJTkdfU0laRSAvIDMpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQXNpY1JhZGlvT2ZmID09PT4gcmV0dXJuMS4gUnhEbWFJZHggPSAlZCAsICBSeENwdUlkeCA9ICVkLiBcbiIsCisJCQkgIFJ4RG1hSWR4LCBSeENwdUlkeCkpOworCQlyZXR1cm4gRkFMU0U7CisJfSBlbHNlIGlmICgoUnhDcHVJZHggPj0gUnhEbWFJZHgpCisJCSAgICYmICgoUnhDcHVJZHggLSBSeERtYUlkeCkgPCBSWF9SSU5HX1NJWkUgLyAzKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFzaWNSYWRpb09mZiA9PT0+IHJldHVybjIuICBSeENwdUlkeCA9ICVkLiBSeERtYUlkeCA9ICVkICwgIFxuIiwKKwkJCSAgUnhDcHVJZHgsIFJ4RG1hSWR4KSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyogT25jZSBnbyBpbnRvIHRoaXMgZnVuY3Rpb24sIGRpc2FibGUgdHggYmVjYXVzZSBkb24ndCB3YW50IHRvbyBtYW55IHBhY2tldHMgaW4gcXVldWUgdG8gcHJldmVudCBIVyBzdG9wcy4gKi8KKwkvKnBBZC0+YlBDSWNsa09mZkRpc2FibGVUeCA9IFRSVUU7ICovCisJUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCk7CisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCisJICAgICYmIHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEKKwkgICAgJiYgcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpIHsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsICZDYW5jZWxsZWQpOworCisJCWlmIChMZXZlbCA9PSBET1QxMVBPV0VSU0FWRSkgeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUQlRUX1RJTUVSLCAmVGJUVFRpbWUpOworCQkJVGJUVFRpbWUgJj0gMHgxZmZmZjsKKwkJCS8qIDAwLiBjaGVjayBpZiBuZWVkIHRvIGRvIHNsZWVwIGluIHRoaXMgRFRJTSBwZXJpb2QuICAgSWYgbmV4dCBiZWFjb24gd2lsbCBhcnJpdmUgd2l0aGluIDMwbXMgLCAuLi5kb2Vzbid0IG5lY2Vzc2FyaWx5IHNsZWVwLiAqLworCQkJLyogVGJUVFRpbWUgdWludCA9IDY0dXMsIExFQURfVElNRSB1bml0ID0gMTAyNHVzLCBQc1BvbGxUaW1lIHVuaXQgPSAxbXMgKi8KKwkJCWlmICgoKDY0ICogVGJUVFRpbWUpIDwgKChMRUFEX1RJTUUgKiAxMDI0KSArIDQwMDAwKSkKKwkJCSAgICAmJiAoVGJ0dE51bVRvTmV4dFdha2VVcCA9PSAwKSkgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJUYlRUVGltZSA9IDB4JXggLCBnaXZlIHVwIHRoaXMgc2xlZXAuIFxuIiwKKwkJCQkJICBUYlRUVGltZSkpOworCQkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworCQkJCS8qcEFkLT5iUENJY2xrT2ZmRGlzYWJsZVR4ID0gRkFMU0U7ICovCisJCQkJUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19ESVNBQkxFX1RYKTsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9IGVsc2UgeworCQkJCVBzUG9sbFRpbWUgPQorCQkJCSAgICAoNjQgKiBUYlRUVGltZSAtIExFQURfVElNRSAqIDEwMjQpIC8gMTAwMDsKKyNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKKwkJCQlpZiAoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpCisJCQkJICAgICB8fCBJU19SVDMzOTAocEFkKSkKKwkJCQkgICAgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKKwkJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC4KKwkJCQkJcnQzMHh4UG93ZXJNb2RlID09IDMpCisJCQkJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuCisJCQkJCUVuYWJsZU5ld1BTID09IFRSVUUpKSB7CisJCQkJCVBzUG9sbFRpbWUgLT0gNTsKKwkJCQl9IGVsc2UKKyNlbmRpZiAvKiBQQ0lFX1BTX1NVUFBPUlQgLy8gKi8KKwkJCQkJUHNQb2xsVGltZSAtPSAzOworCisJCQkJQmVhY29uUGVyaW9kVGltZSA9CisJCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCAqIDEwMiAvIDEwMDsKKwkJCQlpZiAoVGJ0dE51bVRvTmV4dFdha2VVcCA+IDApCisJCQkJCVBzUG9sbFRpbWUgKz0KKwkJCQkJICAgICgoVGJ0dE51bVRvTmV4dFdha2VVcCAtCisJCQkJCSAgICAgIDEpICogQmVhY29uUGVyaW9kVGltZSk7CisKKwkJCQlwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IFRSVUU7CisJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCisJCQkJCSAgICAgUHNQb2xsVGltZSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJUMjh4eFBjaUFzaWNSYWRpb09mZjo6TGV2ZWwhPURPVDExUE9XRVJTQVZFIFxuIikpOworCX0KKworCXBBZC0+YlBDSWNsa09mZkRpc2FibGVUeCA9IEZBTFNFOworCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpOworCisJLyogU2V0IHRvIDFSLiAqLworCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID4gMSAmJiBwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSB7CisJCXRlbXBCQlBfUjMgPSAocEFkLT5TdGFDZmcuQkJQUjMgJiAweEU3KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgdGVtcEJCUF9SMyk7CisJfQorCS8qIEluIFJhZGlvIE9mZiwgd2UgdHVybiBvZmYgUkYgY2xrLCBTbyBub3cgbmVlZCB0byBjYWxsIEFTSUNTd2l0Y2hDaGFubmVsIGFnYWluLiAqLworCWlmICgoSU5GUkFfT04ocEFkKSB8fCBwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCisJICAgICYmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCSAgICAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkgeworCQkvKiBNdXN0IHVzaW5nIDQwTUh6LiAqLworCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCX0gZWxzZSB7CisJCS8qIE11c3QgdXNpbmcgMjBNSHouICovCisJCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwl9CisKKwlpZiAoTGV2ZWwgIT0gUlRNUF9IQUxUKSB7CisJCS8qIENoYW5nZSBJbnRlcnJ1cHQgYml0bWFzay4gKi8KKwkJLyogV2hlbiBQQ0kgY2xvY2sgaXMgb2ZmLCBkb24ndCB3YW50IHRvIHNlcnZpY2UgaW50ZXJydXB0LiAqLworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIEF1dG9XYWtldXBJbnQpOworCX0gZWxzZSB7CisJCVJUTVBfQVNJQ19JTlRFUlJVUFRfRElTQUJMRShwQWQpOworCX0KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKKwkvKiAgMi4gU2VuZCBTbGVlcCBjb21tYW5kICovCisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfU1RBVFVTLCAweGZmZmZmZmZmKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DSUQsIDB4ZmZmZmZmZmYpOworCS8qIHNlbmQgUE9XRVItU0FWRSBjb21tYW5kIHRvIE1DVS4gaGlnaC1ieXRlID0gMSBzYXZlIHBvd2VyIGFzIG11Y2ggYXMgcG9zc2libGUuIGhpZ2ggYnl0ZSA9IDAgc2F2ZSBsZXNzIHBvd2VyICovCisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCBQb3dlclNhZmVDSUQsIDB4ZmYsIDB4MSk7CisJLyogIDItMS4gV2FpdCBjb21tYW5kIHN1Y2Nlc3MgKi8KKwkvKiBTdGF0dXMgPSAxIDogc3VjY2VzcywgU3RhdHVzID0gMiwgYWxyZWFkeSBzbGVlcCwgU3RhdHVzID0gMywgTWF5YmUgTUFDIGlzIGJ1c3kgc28gY2FuJ3QgZmluaXNoIHRoaXMgdGFzay4gKi8KKwlicmMgPSBBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyU2FmZUNJRCk7CisKKwkvKiAgMy4gQWZ0ZXIgMHgzMCBjb21tYW5kIGlzIG9rLCBzZW5kIHJhZGlvIG9mZiBjb21tYW5kLiBsb3dieXRlID0gMCBmb3IgcG93ZXIgc2FmZS4gKi8KKwkvKiBJZiAweDMwIGNvbW1hbmQgaXMgbm90IG9rIHRoaXMgdGltZSwgd2UgY2FuIGlnbm9yZSAweDM1IGNvbW1hbmQuIEl0IHdpbGwgbWFrZSBzdXJlIG5vdCBjYXVzZSBmaXJtd2FyZSdyIHByb2JsZW0uICovCisJaWYgKChMZXZlbCA9PSBET1QxMVBPV0VSU0FWRSkgJiYgKGJyYyA9PSBUUlVFKSkgeworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzUsIFBvd2VyUmFkaW9PZmZDSUQsIDAsIDB4MDApOwkvKiBsb3dieXRlID0gMCBtZWFucyB0byBkbyBwb3dlciBzYWZlLCBOT1QgdHVybiBvZmYgcmFkaW8uICovCisJCS8qICAzLTEuIFdhaXQgY29tbWFuZCBzdWNjZXNzICovCisJCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJSYWRpb09mZkNJRCk7CisJfSBlbHNlIGlmIChicmMgPT0gVFJVRSkgeworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzUsIFBvd2VyUmFkaW9PZmZDSUQsIDEsIDB4MDApOwkvKiBsb3dieXRlID0gMCBtZWFucyB0byBkbyBwb3dlciBzYWZlLCBOT1QgdHVybiBvZmYgcmFkaW8uICovCisJCS8qICAzLTEuIFdhaXQgY29tbWFuZCBzdWNjZXNzICovCisJCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJSYWRpb09mZkNJRCk7CisJfQorCS8qIDEuIFdhaXQgRE1BIG5vdCBidXN5ICovCisJaSA9IDA7CisJZG8geworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7CisJCWlmICgoRG1hQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKQorCQkgICAgJiYgKERtYUNmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkpCisJCQlicmVhazsKKwkJUlRNUHVzZWNEZWxheSgyMCk7CisJCWkrKzsKKwl9IHdoaWxlIChpIDwgNTApOworCisJLyoKKwkgICBpZiAoaSA+PSA1MCkKKwkgICB7CisJICAgcEFkLT5DaGVja0RtYUJ1c3lDb3VudCsrOworCSAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRNQSBSeCBrZWVwcyBidXN5LiAgcmV0dXJuIG9uIEFzaWNSYWRpb09mZiAoKSBDaGVja0RtYUJ1c3lDb3VudCA9ICVkIFxuIiwgcEFkLT5DaGVja0RtYUJ1c3lDb3VudCkpOworCSAgIH0KKwkgICBlbHNlCisJICAgeworCSAgIHBBZC0+Q2hlY2tEbWFCdXN5Q291bnQgPSAwOworCSAgIH0KKwkgKi8KKy8qS0ggRGVidWc6TXkgb3JpZ2luYWwgY29kZXMgaGF2ZSB0aGUgZm9sbHdvaW5nIGNvZGVzLCBidXQgY3VycmVjbnQgY29kZXMgZG8gbm90IGhhdmUgaXQuICovCisvKiBEaXNhYmxlIGZvciBzdGFiaWxpdHkuIElmIFBDSUUgTGluayBDb250cm9sIGlzIG1vZGlmaWVkIGZvciBhZHZhbmNlIHBvd2VyIHNhdmUsIHJlLWNvdmVyeSB0aGlzIGNvZGUgc2VnbWVudC4gKi8KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4MTI4MCk7CisvKk9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19DTEtTRUxFQ1RfNDBNSFopOyAqLworCisjaWZkZWYgUENJRV9QU19TVVBQT1JUCisJaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkKKwkgICAgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKKwkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykKKwkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJUMjh4eFBjaUFzaWNSYWRpb09mZjo6MzA5MCByZXR1cm4gdG8gc2tpcCB0aGUgZm9sbG93aW5nIFRidHROdW1Ub05leHRXYWtlVXAgc2V0dGluZyBmb3IgMjc5eFxuIikpOworCQlwQWQtPmJQQ0ljbGtPZmYgPSBUUlVFOworCQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpOworCQkvKiBGb3IgdGhpcyBjYXNlLCBkb2Vzbid0IG5lZWQgdG8gYmVsb3cgYWN0aW9ucywgc28gcmV0dXJuIGhlcmUuICovCisJCXJldHVybiBicmM7CisJfQorI2VuZGlmIC8qIFBDSUVfUFNfU1VQUE9SVCAvLyAqLworCisJaWYgKExldmVsID09IERPVDExUE9XRVJTQVZFKSB7CisJCUFVVE9fV0FLRVVQX1NUUlVDIEF1dG9XYWtldXBDZmc7CisJCS8qUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsIDkwKTsgKi8KKworCQkvKiB3ZSBoYXZlIGRlY2lkZWQgdG8gU0xFRVAsIHNvIGF0IGxlYXN0IGRvIGl0IGZvciBhIEJFQUNPTiBwZXJpb2QuICovCisJCWlmIChUYnR0TnVtVG9OZXh0V2FrZVVwID09IDApCisJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gMTsKKworCQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7CisKKwkJLyogMS4gU2V0IGF1dG8gd2FrZSB1cCB0aW1lci4gKi8KKwkJQXV0b1dha2V1cENmZy5maWVsZC5OdW1vZlNsZWVwaW5nVGJ0dCA9IFRidHROdW1Ub05leHRXYWtlVXAgLSAxOworCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkVuYWJsZUF1dG9XYWtldXAgPSAxOworCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkF1dG9MZWFkVGltZSA9IExFQURfVElNRTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworCX0KKwkvKiAgNC0xLiBJZiBpdCdzIHRvIGRpc2FibGUgb3VyIGRldmljZS4gTmVlZCB0byByZXN0b3JlIFBDSSBDb25maWd1cmF0aW9uIFNwYWNlIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZS4gKi8KKwlpZiAoTGV2ZWwgPT0gUlRNUF9IQUxUICYmIHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpIHsKKwkJaWYgKChicmMgPT0gVFJVRSkgJiYgKGkgPCA1MCkpCisJCQlSVE1QUENJZUxpbmtDdHJsU2V0dGluZyhwQWQsIDEpOworCX0KKwkvKiAgNC4gU2V0IFBDSSBjb25maWd1cmF0aW9uIFNwYWNlIExpbmsgQ29tdHJvbCBmaWVsZHMuICBPbmx5IFJhZGlvIE9mZiBuZWVkcyB0byBjYWxsIHRoaXMgZnVuY3Rpb24gKi8KKwllbHNlIGlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSB7CisJCWlmICgoYnJjID09IFRSVUUpICYmIChpIDwgNTApKQorCQkJUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcocEFkLCAzKTsKKwl9CisJLypwQWQtPmJQQ0ljbGtPZmZEaXNhYmxlVHggPSBGQUxTRTsgKi8KKwlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpOworCXJldHVybiBUUlVFOworfQorCit2b2lkIFJUMjh4eFBjaU1sbWVSYWRpb09uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcz09PT5cbiIsIF9fZnVuY19fKSk7CisKKwlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgfHwgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQkJCQkgICAmJgorCQkJCQkgICAoIU9QU1RBVFVTX1RFU1RfRkxBRworCQkJCQkgICAgKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkKKwkJCQkJICAgIHx8IHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC4KKwkJCQkJICAgIEVuYWJsZU5ld1BTID09IEZBTFNFKSkpIHsKKwkJUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFKTsKKwkJLypOSUNSZXNldEZyb21FcnJvcihwQWQpOyAqLworCisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CSyk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CRSk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WSSk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WTyk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKKworCQkvKiBFbmFibGUgVHgvUnggKi8KKwkJUlRNUEVuYWJsZVJ4VHgocEFkKTsKKworCQkvKiBDbGVhciBSYWRpbyBvZmYgZmxhZyAqLworCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKwkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRik7CisKKwkJLyogU2V0IExFRCAqLworCQlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09OKTsKKwl9CisKKwlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmCisJICAgIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKKwkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkgeworCQlCT09MRUFOIENhbmNlbGxlZDsKKworCQlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9XQUtFVVApOworCisJCXBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCA0MCk7CisJfQorfQorCit2b2lkIFJUMjh4eFBjaU1sbWVSYWRpb09GRihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJQk9PTEVBTiBicmMgPSBUUlVFOworCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorCQlyZXR1cm47CisKKwkvKiBMaW5rIGRvd24gZmlyc3QgaWYgYW55IGFzc29jaWF0aW9uIGV4aXN0cyAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSB7CisJCWlmIChJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkpIHsKKwkJCXN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSBEaXNSZXE7CisJCQlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpwTXNnRWxlbSA9CisJCQkgICAgKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKKwkJCQkJCQlNRU1fQUxMT0NfRkxBRyk7CisKKwkJCWlmIChwTXNnRWxlbSkgeworCQkJCUNPUFlfTUFDX0FERFIoJkRpc1JlcS5BZGRyLAorCQkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkJRGlzUmVxLlJlYXNvbiA9IFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORzsKKworCQkJCXBNc2dFbGVtLT5NYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJCQlwTXNnRWxlbS0+TXNnVHlwZSA9IE1UMl9NTE1FX0RJU0FTU09DX1JFUTsKKwkJCQlwTXNnRWxlbS0+TXNnTGVuID0KKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSk7CisJCQkJTmRpc01vdmVNZW1vcnkocE1zZ0VsZW0tPk1zZywgJkRpc1JlcSwKKwkJCQkJICAgICAgIHNpemVvZgorCQkJCQkgICAgICAgKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSkpOworCisJCQkJTWxtZURpc2Fzc29jUmVxQWN0aW9uKHBBZCwgcE1zZ0VsZW0pOworCQkJCWtmcmVlKHBNc2dFbGVtKTsKKworCQkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCQl9CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcz09PT5cbiIsIF9fZnVuY19fKSk7CisKKwkvKiBTZXQgUmFkaW8gb2ZmIGZsYWcgKi8KKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCisJeworCQlCT09MRUFOIENhbmNlbGxlZDsKKwkJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSB7CisJCQlpZiAoUlRNUF9URVNUX0ZMQUcKKwkJCSAgICAocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgeworCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwKKwkJCQkJCSZDYW5jZWxsZWQpOworCQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsCisJCQkJCQlmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKwkJCX0KKwkJCS8qIElmIGR1cmluZyBwb3dlciBzYWZlIG1vZGUuICovCisJCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiLS0+TWxtZVJhZGlvT2ZmKCkgcmV0dXJuIG9uIGJSYWRpbyA9PSBUUlVFOyBcbiIpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkvKiBBbHdheXMgcmFkaW8gb24gc2luY2UgdGhlIE5JQyBuZWVkcyB0byBzZXQgdGhlIE1DVSBjb21tYW5kIChMRURfUkFESU9fT0ZGKS4gKi8KKwkJCWlmIChJRExFX09OKHBBZCkgJiYKKwkJCSAgICAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkpCisJCQl7CisJCQkJUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFKTsKKwkJCX0KKwkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkgeworCQkJCUJPT0xFQU4gQ2FuY2VsbGVkOworCQkJCXBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7CisJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCisJCQkJCQkmQ2FuY2VsbGVkKTsKKwkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCisJCQkJCQkmQ2FuY2VsbGVkKTsKKwkJCX0KKwkJfQorCQkvKiBMaW5rIGRvd24gZmlyc3QgaWYgYW55IGFzc29jaWF0aW9uIGV4aXN0cyAqLworCQlpZiAoSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpKQorCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMDApOworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCQkvKiBDbGVhbiB1cCBvbGQgYnNzIHRhYmxlICovCisJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKKworCQkvKgorCQkgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpCisJCSAgIHsKKwkJICAgUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAxMCk7CisJCSAgIHJldHVybjsKKwkJICAgfQorCQkgKi8KKwl9CisKKwkvKiBTZXQgTEVELk1vdmUgdG8gaGVyZSBmb3IgZml4aW5nIExFRCBidWcuIFRoaXMgZmxhZyBtdXN0IGJlIGNhbGxlZCBhZnRlciBMaW5rRG93biAqLworCVJUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT0ZGKTsKKworLypLSCBEZWJ1ZzpBbGwgUENJZSBkZXZpY2VzIG5lZWQgdG8gdXNlIHRpbWVyIHRvIGV4ZWN1dGUgcmFkaW8gb2ZmIGZ1bmN0aW9uLCBvciB0aGUgUENJZSYmRW5hYmxlTmV3UFMgbmVlZHMuICovCisvKktIIEFuczpJdCBpcyByaWdodCwgYmVjYXVzZSBvbmx5IHdoZW4gdGhlIFBDSWUgYW5kIEVuYWJsZU5ld1BzIGlzIHRydWUsIHdlIG5lZWQgdG8gZGVsYXkgdGhlIFJhZGlvT2ZmVGltZXIgKi8KKy8qdG8gYXZvaWQgdGhlIGRlYWRsb2NrIHdpdGggUENJZSBQb3dlciBzYXZpbmcgZnVuY3Rpb24uICovCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEgJiYKKwkgICAgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkgJiYKKwkgICAgcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpIHsKKwkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAxMCk7CisJfSBlbHNlIHsKKwkJYnJjID0gUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHBBZCwgR1VJUkFESU9fT0ZGLCAwKTsKKworCQlpZiAoYnJjID09IEZBTFNFKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCIlcyBjYWxsIFJUMjh4eFBjaUFzaWNSYWRpb09mZiBmYWlsIVxuIiwKKwkJCQkgIF9fZnVuY19fKSk7CisJCX0KKwl9CisvKgorKi8KK30KKworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX21hY191c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9tYWNfdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkNjk1OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9tYWNfdXNiLmMKQEAgLTAsMCArMSwxMTY1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZmRlZiBSVE1QX01BQ19VU0IKKworI2luY2x1ZGUJIi4uL3J0X2NvbmZpZy5oIgorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEluaXRpYWxpemUgcmVjZWl2ZSBkYXRhIHN0cnVjdHVyZXMuCisKK0FyZ3VtZW50czoKKyAgICBwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworUmV0dXJuIFZhbHVlOgorCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwlORElTX1NUQVRVU19SRVNPVVJDRVMKKworTm90ZToKKwlJbml0aWFsaXplIGFsbCByZWNlaXZlIHJlbGVhdGVkIHByaXZhdGUgYnVmZmVyLCBpbmNsdWRlIHRob3NlIGRlZmluZQorCWluIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgc3RydWN0dXJlIGFuZCBhbGwgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZXMuIFRoZSBtYWhvcgorCXdvcmsgaXMgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciBlYWNoIHBhY2tldCBhbmQgY2hhaW4gYnVmZmVyIHRvCisJTkRJUyBwYWNrZXQgZGVzY3JpcHRvci4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBOSUNJbml0UmVjdihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJdTggaTsKKwlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0UmVjdlxuIikpOworCXBPYmogPSBwT2JqOworCisJLypJbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPlBlbmRpbmdSeCwgMCk7ICovCisJcEFkLT5QZW5kaW5nUnggPSAwOworCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4ID0gMDsJLyogTmV4dCBSeCBSZWFkIGluZGV4ICovCisJcEFkLT5OZXh0UnhCdWxrSW5JbmRleCA9IDA7CS8qUlhfUklOR19TSVpFIC0xOyAvLyBSeCBCdWxrIHBvaW50ZXIgKi8KKwlwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKSB7CisJCXN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CisKKwkJLypBbGxvY2F0ZSBVUkIgKi8KKwkJcFJ4Q29udGV4dC0+cFVyYiA9IFJUVVNCX0FMTE9DX1VSQigwKTsKKwkJaWYgKHBSeENvbnRleHQtPnBVcmIgPT0gTlVMTCkgeworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJZ290byBvdXQxOworCQl9CisJCS8qIEFsbG9jYXRlIHRyYW5zZmVyIGJ1ZmZlciAqLworCQlwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9CisJCSAgICBSVFVTQl9VUkJfQUxMT0NfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBNQVhfUlhCVUxLX1NJWkUsCisJCQkJCSAgICZwUnhDb250ZXh0LT5kYXRhX2RtYSk7CisJCWlmIChwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9PSBOVUxMKSB7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQlnb3RvIG91dDE7CisJCX0KKworCQlOZGlzWmVyb01lbW9yeShwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgTUFYX1JYQlVMS19TSVpFKTsKKworCQlwUnhDb250ZXh0LT5wQWQgPSBwQWQ7CisJCXBSeENvbnRleHQtPnBJcnAgPSBOVUxMOworCQlwUnhDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCQlwUnhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJCXBSeENvbnRleHQtPlJlYWRhYmxlID0gRkFMU0U7CisJCS8qcFJ4Q29udGV4dC0+UmVvcmRlckluVXNlID0gRkFMU0U7ICovCisJCXBSeENvbnRleHQtPmJSeEhhbmRsaW5nID0gRkFMU0U7CisJCXBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCA9IDA7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ0luaXRSZWN2KFN0YXR1cz0lZClcbiIsIFN0YXR1cykpOworCXJldHVybiBTdGF0dXM7CisKK291dDE6CisJZm9yIChpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspIHsKKwkJc3RydWN0IHJ0X3J4X2NvbnRleHQgKnBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKworCQlpZiAoTlVMTCAhPSBwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlcikgeworCQkJUlRVU0JfVVJCX0ZSRUVfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBNQVhfUlhCVUxLX1NJWkUsCisJCQkJCSAgICAgIHBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLAorCQkJCQkgICAgICBwUnhDb250ZXh0LT5kYXRhX2RtYSk7CisJCQlwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IE5VTEw7CisJCX0KKworCQlpZiAoTlVMTCAhPSBwUnhDb250ZXh0LT5wVXJiKSB7CisJCQlSVFVTQl9VTkxJTktfVVJCKHBSeENvbnRleHQtPnBVcmIpOworCQkJUlRVU0JfRlJFRV9VUkIocFJ4Q29udGV4dC0+cFVyYik7CisJCQlwUnhDb250ZXh0LT5wVXJiID0gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgSW5pdGlhbGl6ZSB0cmFuc21pdCBkYXRhIHN0cnVjdHVyZXMuCisKK0FyZ3VtZW50czoKKyAgICBwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworUmV0dXJuIFZhbHVlOgorCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwlORElTX1NUQVRVU19SRVNPVVJDRVMKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBOSUNJbml0VHJhbnNtaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworI2RlZmluZSBMTV9VU0JfQUxMT0MocE9iaiwgQ29udGV4dCwgVEJfVHlwZSwgQnVmZmVyU2l6ZSwgU3RhdHVzLCBtc2cxLCBlcnIxLCBtc2cyLCBlcnIyKQlcCisJQ29udGV4dC0+cFVyYiA9IFJUVVNCX0FMTE9DX1VSQigwKTsJCVwKKwlpZiAoQ29udGV4dC0+cFVyYiA9PSBOVUxMKSB7CQkJXAorCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgbXNnMSk7CQlcCisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsJCVwKKwkJZ290byBlcnIxOyB9CQkJCQkJXAorCQkJCQkJCQkJCQlcCisJQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPQkJCQlcCisJCShUQl9UeXBlKVJUVVNCX1VSQl9BTExPQ19CVUZGRVIocE9iai0+cFVzYl9EZXYsIEJ1ZmZlclNpemUsICZDb250ZXh0LT5kYXRhX2RtYSk7CVwKKwlpZiAoQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPT0gTlVMTCkgewlcCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCBtc2cyKTsJCVwKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwkJXAorCQlnb3RvIGVycjI7IH0KKworI2RlZmluZSBMTV9VUkJfRlJFRShwT2JqLCBDb250ZXh0LCBCdWZmZXJTaXplKQkJCQlcCisJaWYgKE5VTEwgIT0gQ29udGV4dC0+cFVyYikgewkJCQkJCQlcCisJCVJUVVNCX1VOTElOS19VUkIoQ29udGV4dC0+cFVyYik7CQkJCQlcCisJCVJUVVNCX0ZSRUVfVVJCKENvbnRleHQtPnBVcmIpOwkJCQkJCVwKKwkJQ29udGV4dC0+cFVyYiA9IE5VTEw7IH0JCQkJCQkJCVwKKwlpZiAoTlVMTCAhPSBDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlcikgewkJCQlcCisJCVJUVVNCX1VSQl9GUkVFX0JVRkZFUihwT2JqLT5wVXNiX0RldiwgQnVmZmVyU2l6ZSwJXAorCQkJCQkJCQlDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwJXAorCQkJCQkJCQlDb250ZXh0LT5kYXRhX2RtYSk7CQkJXAorCQlDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IE5VTEw7IH0KKworCXU4IGksIGFjaWR4OworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwTnVsbENvbnRleHQgPSAmKHBBZC0+TnVsbENvbnRleHQpOworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwUHNQb2xsQ29udGV4dCA9ICYocEFkLT5Qc1BvbGxDb250ZXh0KTsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcFJUU0NvbnRleHQgPSAmKHBBZC0+UlRTQ29udGV4dCk7CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBNTE1FQ29udGV4dCA9IE5VTEw7CisvKiAgICAgIHN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQgPSBOVUxMOyAqLworCXN0cnVjdCBvc19jb29raWUgKnBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCXZvaWQgKlJpbmdCYXNlVmE7CisvKiAgICAgIHN0cnVjdCBydF9ydG1wX3R4X3JpbmcgKnBUeFJpbmc7ICovCisJc3RydWN0IHJ0X3J0bXBfbWdtdF9yaW5nICpwTWdtdFJpbmc7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdFRyYW5zbWl0XG4iKSk7CisJcE9iaiA9IHBPYmo7CisKKwkvKiBJbml0IDQgc2V0IG9mIFR4IHBhcmFtZXRlcnMgKi8KKwlmb3IgKGFjaWR4ID0gMDsgYWNpZHggPCBOVU1fT0ZfVFhfUklORzsgYWNpZHgrKykgeworCQkvKiBJbml0aWFsaXplIGFsbCBUcmFuc21pdCByZWxlYXRlZCBxdWV1ZXMgKi8KKwkJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPlR4U3dRdWV1ZVthY2lkeF0pOworCisJCS8qIE5leHQgTG9jYWwgdHggcmluZyBwb2ludGVyIHdhaXRpbmcgZm9yIGJ1Y2sgb3V0ICovCisJCXBBZC0+TmV4dEJ1bGtPdXRJbmRleFthY2lkeF0gPSBhY2lkeDsKKwkJcEFkLT5CdWxrT3V0UGVuZGluZ1thY2lkeF0gPSBGQUxTRTsJLyogQnVjayBPdXQgY29udHJvbCBmbGFnICovCisJCS8qcEFkLT5EYXRhQnVsa0RvbmVJZHhbYWNpZHhdID0gMDsgKi8KKwl9CisKKwkvKnBBZC0+TmV4dE1MTUVJbmRleCAgICA9IDA7ICovCisJLypwQWQtPlB1c2hNZ210SW5kZXggICAgPSAwOyAqLworCS8qcEFkLT5Qb3BNZ210SW5kZXggICAgID0gMDsgKi8KKwkvKkludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+TWdtdFF1ZXVlU2l6ZSwgMCk7ICovCisJLypJbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPlR4Q291bnQsIDApOyAqLworCisJLypwQWQtPlByaW9SaW5nRmlyc3RJbmRleCAgICAgICA9IDA7ICovCisJLypwQWQtPlByaW9SaW5nVHhDbnQgICAgICAgICAgICA9IDA7ICovCisKKwlkbyB7CisJCS8qICovCisJCS8qIFRYX1JJTkdfU0laRSwgNCBBQ3MgKi8KKwkJLyogKi8KKwkJZm9yIChhY2lkeCA9IDA7IGFjaWR4IDwgNDsgYWNpZHgrKykgeworCQkJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbYWNpZHhdKTsKKworCQkJTmRpc1plcm9NZW1vcnkocEhUVFhDb250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQpKTsKKwkJCS8qQWxsb2NhdGUgVVJCICovCisJCQlMTV9VU0JfQUxMT0MocE9iaiwgcEhUVFhDb250ZXh0LCBzdHJ1Y3QgcnRfaHR0eF9idWZmZXIgKiwKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgcnRfaHR0eF9idWZmZXIpLCBTdGF0dXMsCisJCQkJICAgICAoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBUeENvbnRleHRbJWRdIHVyYiFcbiIsCisJCQkJICAgICAgYWNpZHgpLCBkb25lLAorCQkJCSAgICAgKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggVHhDb250ZXh0WyVkXSBzdHJ1Y3QgcnRfaHR0eF9idWZmZXIhXG4iLAorCQkJCSAgICAgIGFjaWR4KSwgb3V0MSk7CisKKwkJCU5kaXNaZXJvTWVtb3J5KHBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPgorCQkJCSAgICAgICBBZ2dyZWdhdGlvbiwgNCk7CisJCQlwSFRUWENvbnRleHQtPnBBZCA9IHBBZDsKKwkJCXBIVFRYQ29udGV4dC0+cElycCA9IE5VTEw7CisJCQlwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJCXBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA9IDA7CisJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0gMDsKKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9IDA7CisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IDA7CisJCQlwSFRUWENvbnRleHQtPkJ1bGtPdXRTaXplID0gMDsKKwkJCXBIVFRYQ29udGV4dC0+QnVsa091dFBpcGVJZCA9IGFjaWR4OworCQkJcEhUVFhDb250ZXh0LT5iUmluZ0VtcHR5ID0gVFJVRTsKKwkJCXBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkID0gRkFMU0U7CisJCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW2FjaWR4XSA9IEZBTFNFOworCQl9CisKKwkJLyogKi8KKwkJLyogTUdNVF9SSU5HX1NJWkUgKi8KKwkJLyogKi8KKworCQkvKiBBbGxvY2F0ZSBNR01UIHJpbmcgZGVzY3JpcHRvcidzIG1lbW9yeSAqLworCQlwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUgPQorCQkgICAgTUdNVF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IHJ0X3R4X2NvbnRleHQpOworCQlvc19hbGxvY19tZW0ocEFkLCAodTggKiopICgmcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSksCisJCQkgICAgIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSk7CisJCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhID09IE5VTEwpIHsKKwkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXIgZm9yIE1nbXREZXNjUmluZyFcbiIpKTsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCWdvdG8gb3V0MTsKKwkJfQorCQlOZGlzWmVyb01lbW9yeShwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhLAorCQkJICAgICAgIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSk7CisJCVJpbmdCYXNlVmEgPSBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhOworCisJCS8qIEluaXRpYWxpemUgTUdNVCBSaW5nIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlciBtZW1vcnkgKi8KKwkJcE1nbXRSaW5nID0gJnBBZC0+TWdtdFJpbmc7CisJCWZvciAoaSA9IDA7IGkgPCBNR01UX1JJTkdfU0laRTsgaSsrKSB7CisJCQkvKiBsaW5rIHRoZSBwcmUtYWxsb2NhdGVkIE1nbXQgYnVmZmVyIHRvIE1nbXRSaW5nLkNlbGwgKi8KKwkJCXBNZ210UmluZy0+Q2VsbFtpXS5BbGxvY1NpemUgPSBzaXplb2Yoc3RydWN0IHJ0X3R4X2NvbnRleHQpOworCQkJcE1nbXRSaW5nLT5DZWxsW2ldLkFsbG9jVmEgPSBSaW5nQmFzZVZhOworCQkJcE1nbXRSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKKwkJCXBNZ210UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisJCQkvKkFsbG9jYXRlIFVSQiBmb3IgTUxNRUNvbnRleHQgKi8KKwkJCXBNTE1FQ29udGV4dCA9CisJCQkgICAgKHN0cnVjdCBydF90eF9jb250ZXh0ICopcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7CisJCQlwTUxNRUNvbnRleHQtPnBVcmIgPSBSVFVTQl9BTExPQ19VUkIoMCk7CisJCQlpZiAocE1MTUVDb250ZXh0LT5wVXJiID09IE5VTEwpIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJICgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIE1MTUVDb250ZXh0WyVkXSB1cmIhXG4iLAorCQkJCQkgIGkpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQkJZ290byBvdXQyOworCQkJfQorCQkJcE1MTUVDb250ZXh0LT5wQWQgPSBwQWQ7CisJCQlwTUxNRUNvbnRleHQtPnBJcnAgPSBOVUxMOworCQkJcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IE5VTEw7CisJCQlwTUxNRUNvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCQlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJCXBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID0gRkFMU0U7CisJCQlwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplID0gMDsKKwkJCXBNTE1FQ29udGV4dC0+U2VsZklkeCA9IGk7CisKKwkJCS8qIE9mZnNldCB0byBuZXh0IHJpbmcgZGVzY3JpcHRvciBhZGRyZXNzICovCisJCQlSaW5nQmFzZVZhID0gKHU4ICopUmluZ0Jhc2VWYSArIHNpemVvZihzdHJ1Y3QgcnRfdHhfY29udGV4dCk7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNR01UIFJpbmc6IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgaSkpOworCisJCS8qcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA9IChNR01UX1JJTkdfU0laRSAtIDEpOyAqLworCQlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gTUdNVF9SSU5HX1NJWkU7CisJCXBBZC0+TWdtdFJpbmcuVHhDcHVJZHggPSAwOworCQlwQWQtPk1nbXRSaW5nLlR4RG1hSWR4ID0gMDsKKworCQkvKiAqLworCQkvKiBCRUFDT05fUklOR19TSVpFICovCisJCS8qICovCisJCWZvciAoaSA9IDA7IGkgPCBCRUFDT05fUklOR19TSVpFOyBpKyspCS8qIDIgKi8KKwkJeworCQkJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBCZWFjb25Db250ZXh0ID0gJihwQWQtPkJlYWNvbkNvbnRleHRbaV0pOworCisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uQ29udGV4dCwgc2l6ZW9mKHN0cnVjdCBydF90eF9jb250ZXh0KSk7CisKKwkJCS8qQWxsb2NhdGUgVVJCICovCisJCQlMTV9VU0JfQUxMT0MocE9iaiwgcEJlYWNvbkNvbnRleHQsIHN0cnVjdCBydF90eF9idWZmZXIgKiwKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgcnRfdHhfYnVmZmVyKSwgU3RhdHVzLAorCQkJCSAgICAgKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggQmVhY29uQ29udGV4dFslZF0gdXJiIVxuIiwKKwkJCQkgICAgICBpKSwgb3V0MiwKKwkJCQkgICAgICgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIEJlYWNvbkNvbnRleHRbJWRdIHN0cnVjdCBydF90eF9idWZmZXIhXG4iLAorCQkJCSAgICAgIGkpLCBvdXQzKTsKKworCQkJcEJlYWNvbkNvbnRleHQtPnBBZCA9IHBBZDsKKwkJCXBCZWFjb25Db250ZXh0LT5wSXJwID0gTlVMTDsKKwkJCXBCZWFjb25Db250ZXh0LT5JblVzZSA9IEZBTFNFOworCQkJcEJlYWNvbkNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJfQorCisJCS8qICovCisJCS8qIE51bGxDb250ZXh0ICovCisJCS8qICovCisJCU5kaXNaZXJvTWVtb3J5KHBOdWxsQ29udGV4dCwgc2l6ZW9mKHN0cnVjdCBydF90eF9jb250ZXh0KSk7CisKKwkJLypBbGxvY2F0ZSBVUkIgKi8KKwkJTE1fVVNCX0FMTE9DKHBPYmosIHBOdWxsQ29udGV4dCwgc3RydWN0IHJ0X3R4X2J1ZmZlciAqLCBzaXplb2Yoc3RydWN0IHJ0X3R4X2J1ZmZlciksCisJCQkgICAgIFN0YXR1cywKKwkJCSAgICAgKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggTnVsbENvbnRleHQgdXJiIVxuIiksCisJCQkgICAgIG91dDMsCisJCQkgICAgICgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIE51bGxDb250ZXh0IHN0cnVjdCBydF90eF9idWZmZXIhXG4iKSwKKwkJCSAgICAgb3V0NCk7CisKKwkJcE51bGxDb250ZXh0LT5wQWQgPSBwQWQ7CisJCXBOdWxsQ29udGV4dC0+cElycCA9IE5VTEw7CisJCXBOdWxsQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJcE51bGxDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisKKwkJLyogKi8KKwkJLyogUlRTQ29udGV4dCAqLworCQkvKiAqLworCQlOZGlzWmVyb01lbW9yeShwUlRTQ29udGV4dCwgc2l6ZW9mKHN0cnVjdCBydF90eF9jb250ZXh0KSk7CisKKwkJLypBbGxvY2F0ZSBVUkIgKi8KKwkJTE1fVVNCX0FMTE9DKHBPYmosIHBSVFNDb250ZXh0LCBzdHJ1Y3QgcnRfdHhfYnVmZmVyICosIHNpemVvZihzdHJ1Y3QgcnRfdHhfYnVmZmVyKSwKKwkJCSAgICAgU3RhdHVzLAorCQkJICAgICAoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBSVFNDb250ZXh0IHVyYiFcbiIpLAorCQkJICAgICBvdXQ0LAorCQkJICAgICAoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBSVFNDb250ZXh0IHN0cnVjdCBydF90eF9idWZmZXIhXG4iKSwKKwkJCSAgICAgb3V0NSk7CisKKwkJcFJUU0NvbnRleHQtPnBBZCA9IHBBZDsKKwkJcFJUU0NvbnRleHQtPnBJcnAgPSBOVUxMOworCQlwUlRTQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJcFJUU0NvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKworCQkvKiAqLworCQkvKiBQc1BvbGxDb250ZXh0ICovCisJCS8qICovCisJCS8qTmRpc1plcm9NZW1vcnkocFBzUG9sbENvbnRleHQsIHNpemVvZihzdHJ1Y3QgcnRfdHhfY29udGV4dCkpOyAqLworCQkvKkFsbG9jYXRlIFVSQiAqLworCQlMTV9VU0JfQUxMT0MocE9iaiwgcFBzUG9sbENvbnRleHQsIHN0cnVjdCBydF90eF9idWZmZXIgKiwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBydF90eF9idWZmZXIpLCBTdGF0dXMsCisJCQkgICAgICgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIFBzUG9sbENvbnRleHQgdXJiIVxuIiksCisJCQkgICAgIG91dDUsCisJCQkgICAgICgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIFBzUG9sbENvbnRleHQgc3RydWN0IHJ0X3R4X2J1ZmZlciFcbiIpLAorCQkJICAgICBvdXQ2KTsKKworCQlwUHNQb2xsQ29udGV4dC0+cEFkID0gcEFkOworCQlwUHNQb2xsQ29udGV4dC0+cElycCA9IE5VTEw7CisJCXBQc1BvbGxDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCQlwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQlwUHNQb2xsQ29udGV4dC0+YkFnZ3JlZ2F0aWJsZSA9IEZBTFNFOworCQlwUHNQb2xsQ29udGV4dC0+TGFzdE9uZSA9IFRSVUU7CisKKwl9IHdoaWxlIChGQUxTRSk7CisKK2RvbmU6CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ0luaXRUcmFuc21pdChTdGF0dXM9JWQpXG4iLCBTdGF0dXMpKTsKKworCXJldHVybiBTdGF0dXM7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVJST1IgSEFORExFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworb3V0NjoKKwlMTV9VUkJfRlJFRShwT2JqLCBwUHNQb2xsQ29udGV4dCwgc2l6ZW9mKHN0cnVjdCBydF90eF9idWZmZXIpKTsKKworb3V0NToKKwlMTV9VUkJfRlJFRShwT2JqLCBwUlRTQ29udGV4dCwgc2l6ZW9mKHN0cnVjdCBydF90eF9idWZmZXIpKTsKKworb3V0NDoKKwlMTV9VUkJfRlJFRShwT2JqLCBwTnVsbENvbnRleHQsIHNpemVvZihzdHJ1Y3QgcnRfdHhfYnVmZmVyKSk7CisKK291dDM6CisJZm9yIChpID0gMDsgaSA8IEJFQUNPTl9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcEJlYWNvbkNvbnRleHQgPSAmKHBBZC0+QmVhY29uQ29udGV4dFtpXSk7CisJCWlmIChwQmVhY29uQ29udGV4dCkKKwkJCUxNX1VSQl9GUkVFKHBPYmosIHBCZWFjb25Db250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X3R4X2J1ZmZlcikpOworCX0KKworb3V0MjoKKwlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSkgeworCQlwTWdtdFJpbmcgPSAmcEFkLT5NZ210UmluZzsKKwkJZm9yIChpID0gMDsgaSA8IE1HTVRfUklOR19TSVpFOyBpKyspIHsKKwkJCXBNTE1FQ29udGV4dCA9CisJCQkgICAgKHN0cnVjdCBydF90eF9jb250ZXh0ICopcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7CisJCQlpZiAocE1MTUVDb250ZXh0KQorCQkJCUxNX1VSQl9GUkVFKHBPYmosIHBNTE1FQ29udGV4dCwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfdHhfYnVmZmVyKSk7CisJCX0KKwkJb3NfZnJlZV9tZW0ocEFkLCBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKTsKKwkJcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSA9IE5VTEw7CisJfQorCitvdXQxOgorCWZvciAoYWNpZHggPSAwOyBhY2lkeCA8IDQ7IGFjaWR4KyspIHsKKwkJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBUeENvbnRleHQgPSAmKHBBZC0+VHhDb250ZXh0W2FjaWR4XSk7CisJCWlmIChwVHhDb250ZXh0KQorCQkJTE1fVVJCX0ZSRUUocE9iaiwgcFR4Q29udGV4dCwgc2l6ZW9mKHN0cnVjdCBydF9odHR4X2J1ZmZlcikpOworCX0KKworCS8qIEhlcmUgd2UgZGlkbid0IGhhdmUgYW55IHByZS1hbGxvY2F0ZWQgbWVtb3J5IG5lZWQgdG8gZnJlZS4gKi8KKworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQWxsb2NhdGUgRE1BIG1lbW9yeSBibG9ja3MgZm9yIHNlbmQsIHJlY2VpdmUuCisKK0FyZ3VtZW50czoKKyAgICBwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworUmV0dXJuIFZhbHVlOgorCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwlORElTX1NUQVRVU19GQUlMVVJFCisJTkRJU19TVEFUVVNfUkVTT1VSQ0VTCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworLyogICAgICBzdHJ1Y3QgcnRfY291bnRlcl84MDJfMTEgIHBDb3VudGVyID0gJnBBZC0+V2xhbkNvdW50ZXJzOyAqLworCWludCBTdGF0dXM7CisJaW50IG51bTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeVxuIikpOworCisJZG8geworCQkvKiBJbml0IHRoZSBzdHJ1Y3QgcnRfY21kcSBhbmQgQ21kUUxvY2sgKi8KKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwkJUlRVU0JJbml0aWFsaXplQ21kUSgmcEFkLT5DbWRRKTsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrKTsKKwkJLypOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NTE1FV2FpdFF1ZXVlTG9jayk7ICovCisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzBdKTsKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbMV0pOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1syXSk7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzNdKTsKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbNF0pOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1s1XSk7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtJbkxvY2spOworCisJCWZvciAobnVtID0gMDsgbnVtIDwgTlVNX09GX1RYX1JJTkc7IG51bSsrKSB7CisJCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbbnVtXSk7CisJCX0KKworLyogICAgICAgICAgICAgIE5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1lbUxvY2spOyAgICAvLyBOb3QgdXNlZCBpbiBSVDI4WFggKi8KKworLyogICAgICAgICAgICAgIE5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOyAvLyBpbml0IGl0IGluIFVzZXJDZmdJbml0KCkgKi8KKy8qICAgICAgICAgICAgICBOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOyAvLyBpbml0IGl0IGluIEJBVGFibGVJbml0KCkgKi8KKworLyogICAgICAgICAgICAgIGZvcihudW09MDsgbnVtPE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBudW0rKykgKi8KKy8qICAgICAgICAgICAgICB7ICovCisvKiAgICAgICAgICAgICAgICAgICAgICBOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbbnVtXS5SeFJlUmluZ0xvY2spOyAqLworLyogICAgICAgICAgICAgIH0gKi8KKworCQkvKiAqLworCQkvKiBJbml0IE1hYyBUYWJsZSAqLworCQkvKiAqLworLyogICAgICAgICAgICAgIE1hY1RhYmxlSW5pdGlhbGl6ZShwQWQpOyAqLworCisJCS8qICovCisJCS8qIEluaXQgc2VuZCBkYXRhIHN0cnVjdHVyZXMgYW5kIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworCQkvKiAqLworCQlTdGF0dXMgPSBOSUNJbml0VHJhbnNtaXQocEFkKTsKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJLyogKi8KKwkJLyogSW5pdCByZWNlaXZlIGRhdGEgc3RydWN0dXJlcyBhbmQgcmVsYXRlZCBwYXJhbWV0ZXJzICovCisJCS8qICovCisJCVN0YXR1cyA9IE5JQ0luaXRSZWN2KHBBZCk7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCXBBZC0+UGVuZGluZ0lvQ291bnQgPSAxOworCisJfSB3aGlsZSAoRkFMU0UpOworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+RnJhZ0ZyYW1lLCBzaXplb2Yoc3RydWN0IHJ0X2ZyYWdtZW50X2ZyYW1lKSk7CisJcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPQorCSAgICBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9OT1JNU0laRSk7CisKKwlpZiAocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPT0gTlVMTCkgeworCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJfQorCisJREJHUFJJTlRfUyhTdGF0dXMsCisJCSAgICgiPC0tIFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5LCBTdGF0dXM9JXhcbiIsIFN0YXR1cykpOworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisJQ2FsbHMgVVNCX0ludGVyZmFjZVN0b3AgYW5kIGZyZWVzIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBVUkJzCisgICAgY2FsbHMgTmRpc01EZXJlZ2lzdGVyRGV2aWNlIGFuZCBmcmVlcyB0aGUgbWVtb3J5CisgICAgYWxsb2NhdGVkIGluIFZOZXRJbml0aWFsaXplIGZvciB0aGUgQWRhcHRlciBPYmplY3QKKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKyNkZWZpbmUgTE1fVVJCX0ZSRUUocE9iaiwgQ29udGV4dCwgQnVmZmVyU2l6ZSkJCQkJXAorCWlmIChOVUxMICE9IENvbnRleHQtPnBVcmIpIHsJCQkJCQkJXAorCQlSVFVTQl9VTkxJTktfVVJCKENvbnRleHQtPnBVcmIpOwkJCQkJXAorCQlSVFVTQl9GUkVFX1VSQihDb250ZXh0LT5wVXJiKTsJCQkJCQlcCisJCUNvbnRleHQtPnBVcmIgPSBOVUxMOyB9CQkJCQkJCQlcCisJaWYgKE5VTEwgIT0gQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIpIHsJCQkJCVwKKwkJUlRVU0JfVVJCX0ZSRUVfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBCdWZmZXJTaXplLAlcCisJCQkJCQkJCUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyLAlcCisJCQkJCQkJCUNvbnRleHQtPmRhdGFfZG1hKTsJCQlcCisJCUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gTlVMTDsgfQorCisJdTMyIGksIGFjaWR4OworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwTnVsbENvbnRleHQgPSAmcEFkLT5OdWxsQ29udGV4dDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcFBzUG9sbENvbnRleHQgPSAmcEFkLT5Qc1BvbGxDb250ZXh0OworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwUlRTQ29udGV4dCA9ICZwQWQtPlJUU0NvbnRleHQ7CisvKiAgICAgIHN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7ICovCisJLypQUlRNUF9SRU9SREVSQlVGICAgICAgcFJlb3JkZXJCdWY7ICovCisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisvKiAgICAgIHN0cnVjdCBydF9ydG1wX3R4X3JpbmcgKnBUeFJpbmc7ICovCisKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLS0+IFJUTVBGcmVlVHhSeFJpbmdNZW1vcnlcbiIpKTsKKwlwT2JqID0gcE9iajsKKworCS8qIEZyZWUgYWxsIHJlc291cmNlcyBmb3IgdGhlIFJFQ0VJVkUgYnVmZmVyIHF1ZXVlLiAqLworCWZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKSB7CisJCXN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CisJCWlmIChwUnhDb250ZXh0KQorCQkJTE1fVVJCX0ZSRUUocE9iaiwgcFJ4Q29udGV4dCwgTUFYX1JYQlVMS19TSVpFKTsKKwl9CisKKwkvKiBGcmVlIFBzUG9sbCBmcmFtZSByZXNvdXJjZSAqLworCUxNX1VSQl9GUkVFKHBPYmosIHBQc1BvbGxDb250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X3R4X2J1ZmZlcikpOworCisJLyogRnJlZSBOVUxMIGZyYW1lIHJlc291cmNlICovCisJTE1fVVJCX0ZSRUUocE9iaiwgcE51bGxDb250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X3R4X2J1ZmZlcikpOworCisJLyogRnJlZSBSVFMgZnJhbWUgcmVzb3VyY2UgKi8KKwlMTV9VUkJfRlJFRShwT2JqLCBwUlRTQ29udGV4dCwgc2l6ZW9mKHN0cnVjdCBydF90eF9idWZmZXIpKTsKKworCS8qIEZyZWUgYmVhY29uIGZyYW1lIHJlc291cmNlICovCisJZm9yIChpID0gMDsgaSA8IEJFQUNPTl9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcEJlYWNvbkNvbnRleHQgPSAmKHBBZC0+QmVhY29uQ29udGV4dFtpXSk7CisJCWlmIChwQmVhY29uQ29udGV4dCkKKwkJCUxNX1VSQl9GUkVFKHBPYmosIHBCZWFjb25Db250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X3R4X2J1ZmZlcikpOworCX0KKworCS8qIEZyZWUgbWdtdCBmcmFtZSByZXNvdXJjZSAqLworCWZvciAoaSA9IDA7IGkgPCBNR01UX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBydF90eF9jb250ZXh0ICpwTUxNRUNvbnRleHQgPQorCQkgICAgKHN0cnVjdCBydF90eF9jb250ZXh0ICopcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7CisJCS8qTE1fVVJCX0ZSRUUocE9iaiwgcE1MTUVDb250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X3R4X2J1ZmZlcikpOyAqLworCQlpZiAoTlVMTCAhPSBwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5kaXNQYWNrZXQpIHsKKwkJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsCisJCQkJCSAgIHBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmRpc1BhY2tldCk7CisJCQlwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5kaXNQYWNrZXQgPSBOVUxMOworCQkJcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IE5VTEw7CisJCX0KKworCQlpZiAocE1MTUVDb250ZXh0KSB7CisJCQlpZiAoTlVMTCAhPSBwTUxNRUNvbnRleHQtPnBVcmIpIHsKKwkJCQlSVFVTQl9VTkxJTktfVVJCKHBNTE1FQ29udGV4dC0+cFVyYik7CisJCQkJUlRVU0JfRlJFRV9VUkIocE1MTUVDb250ZXh0LT5wVXJiKTsKKwkJCQlwTUxNRUNvbnRleHQtPnBVcmIgPSBOVUxMOworCQkJfQorCQl9CisJfQorCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKQorCQlvc19mcmVlX21lbShwQWQsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEpOworCisJLyogRnJlZSBUeCBmcmFtZSByZXNvdXJjZSAqLworCWZvciAoYWNpZHggPSAwOyBhY2lkeCA8IDQ7IGFjaWR4KyspIHsKKwkJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbYWNpZHhdKTsKKwkJaWYgKHBIVFRYQ29udGV4dCkKKwkJCUxNX1VSQl9GUkVFKHBPYmosIHBIVFRYQ29udGV4dCwgc2l6ZW9mKHN0cnVjdCBydF9odHR4X2J1ZmZlcikpOworCX0KKworCWlmIChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCkKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0LAorCQkJCSAgICBORElTX1NUQVRVU19TVUNDRVNTKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1tpXSk7CisJfQorCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5CdWxrSW5Mb2NrKTsKKwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPk1MTUVCdWxrT3V0TG9jayk7CisKKwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwkvKiBDbGVhciBhbGwgcGVuZGluZyBidWxrLW91dCByZXF1ZXN0IGZsYWdzLiAqLworCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIDB4ZmZmZmZmZmYpOworCisvKiAgICAgIE5kaXNGcmVlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7ICovCisKKy8qICAgICAgZm9yKGk9MDsgaTxNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKSAqLworLyogICAgICB7ICovCisvKiAgICAgICAgICAgICAgTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbaV0uUnhSZVJpbmdMb2NrKTsgKi8KKy8qICAgICAgfSAqLworCisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPC0tLSBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5XG4iKSk7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgV3JpdGUgV0xBTiBNQUMgYWRkcmVzcyB0byBVU0IgMjg3MC4KKworQXJndW1lbnRzOgorICAgIHBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCitSZXR1cm4gVmFsdWU6CisJTkRJU19TVEFUVVNfU1VDQ0VTUworCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJUVVNCV3JpdGVIV01BQ0FkZHJlc3Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCU1BQ19EVzBfU1RSVUMgU3RhTWFjUmVnMDsKKwlNQUNfRFcxX1NUUlVDIFN0YU1hY1JlZzE7CisJaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJTEFSR0VfSU5URUdFUiBOT1c7CisKKwkvKiBpbml0aWFsaXplIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciAqLworCVJUTVBfR2V0Q3VycmVudFN5c3RlbVRpbWUoJk5PVyk7CisKKwlpZiAocEFkLT5iTG9jYWxBZG1pbk1BQyAhPSBUUlVFKSB7CisJCXBBZC0+Q3VycmVudEFkZHJlc3NbMF0gPSBwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF07CisJCXBBZC0+Q3VycmVudEFkZHJlc3NbMV0gPSBwQWQtPlBlcm1hbmVudEFkZHJlc3NbMV07CisJCXBBZC0+Q3VycmVudEFkZHJlc3NbMl0gPSBwQWQtPlBlcm1hbmVudEFkZHJlc3NbMl07CisJCXBBZC0+Q3VycmVudEFkZHJlc3NbM10gPSBwQWQtPlBlcm1hbmVudEFkZHJlc3NbM107CisJCXBBZC0+Q3VycmVudEFkZHJlc3NbNF0gPSBwQWQtPlBlcm1hbmVudEFkZHJlc3NbNF07CisJCXBBZC0+Q3VycmVudEFkZHJlc3NbNV0gPSBwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV07CisJfQorCS8qIFdyaXRlIE5ldyBNQUMgYWRkcmVzcyB0byBNQUNfQ1NSMiAmIE1BQ19DU1IzICYgbGV0IEFTSUMga25vdyBvdXIgbmV3IE1BQyAqLworCVN0YU1hY1JlZzAuZmllbGQuQnl0ZTAgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzBdOworCVN0YU1hY1JlZzAuZmllbGQuQnl0ZTEgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzFdOworCVN0YU1hY1JlZzAuZmllbGQuQnl0ZTIgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzJdOworCVN0YU1hY1JlZzAuZmllbGQuQnl0ZTMgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzNdOworCVN0YU1hY1JlZzEuZmllbGQuQnl0ZTQgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzRdOworCVN0YU1hY1JlZzEuZmllbGQuQnl0ZTUgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzVdOworCVN0YU1hY1JlZzEuZmllbGQuVTJNZU1hc2sgPSAweGZmOworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJICAgICAoIkxvY2FsIE1BQyA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkgICAgICBwQWQtPkN1cnJlbnRBZGRyZXNzWzBdLCBwQWQtPkN1cnJlbnRBZGRyZXNzWzFdLAorCQkgICAgICBwQWQtPkN1cnJlbnRBZGRyZXNzWzJdLCBwQWQtPkN1cnJlbnRBZGRyZXNzWzNdLAorCQkgICAgICBwQWQtPkN1cnJlbnRBZGRyZXNzWzRdLCBwQWQtPkN1cnJlbnRBZGRyZXNzWzVdKSk7CisKKwlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBNQUNfQUREUl9EVzAsIFN0YU1hY1JlZzAud29yZCk7CisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgTUFDX0FERFJfRFcxLCBTdGFNYWNSZWcxLndvcmQpOworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgRGlzYWJsZSBETUEuCisKK0FyZ3VtZW50czoKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorCU5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlQyOFhYRE1BRGlzYWJsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJLyogbm8gdXNlICovCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgRW5hYmxlIERNQS4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVDI4WFhETUFFbmFibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCVdQRE1BX0dMT19DRkdfU1RSVUMgR2xvQ2ZnOworCVVTQl9ETUFfQ0ZHX1NUUlVDIFVzYkNmZzsKKwlpbnQgaSA9IDA7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4NCk7CisJZG8geworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CisJCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKQorCQkgICAgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCisJCQlicmVhazsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gIERNQUJ1c3lcbiIpKTsKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJaSsrOworCX0gd2hpbGUgKGkgPCAyMDApOworCisJUlRNUHVzZWNEZWxheSg1MCk7CisJR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9IDE7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gMTsKKwlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCI8PT0gV1JJVEUgRE1BIG9mZnNldCAweDIwOCA9IDB4JXhcbiIsIEdsb0NmZy53b3JkKSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOworCisJVXNiQ2ZnLndvcmQgPSAwOworCVVzYkNmZy5maWVsZC5waHljbGVhciA9IDA7CisJLyogdXNiIHZlcnNpb24gaXMgMS4xLGRvIG5vdCB1c2UgYnVsayBpbiBhZ2dyZWdhdGlvbiAqLworCWlmIChwQWQtPkJ1bGtJbk1heFBhY2tldFNpemUgPT0gNTEyKQorCQlVc2JDZmcuZmllbGQuUnhCdWxrQWdnRW4gPSAxOworCS8qIGZvciBsYXN0IHBhY2tldCwgUEJGIG1pZ2h0IHVzZSBtb3JlIHRoYW4gbGltaXRlZCwgc28gbWludXMgMiB0byBwcmV2ZW50IGZyb20gZXJyb3IgKi8KKwlVc2JDZmcuZmllbGQuUnhCdWxrQWdnTG10ID0gKE1BWF9SWEJVTEtfU0laRSAvIDEwMjQpIC0gMzsKKwlVc2JDZmcuZmllbGQuUnhCdWxrQWdnVE91dCA9IDB4ODA7CS8qIDIwMDYtMTAtMTggKi8KKwlVc2JDZmcuZmllbGQuUnhCdWxrRW4gPSAxOworCVVzYkNmZy5maWVsZC5UeEJ1bGtFbiA9IDE7CisKKwlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBVU0JfRE1BX0NGRywgVXNiQ2ZnLndvcmQpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICoJMjg3MCBCZWFjb24gVXBkYXRlIFJlbGF0ZWQgZnVuY3Rpb25zLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFdyaXRlIEJlYWNvbiBidWZmZXIgdG8gQXNpYy4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVDI4eHhfVXBkYXRlQmVhY29uVG9Bc2ljKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICBpbnQgYXBpZHgsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBGcmFtZUxlbiwgdW5zaWduZWQgbG9uZyBVcGRhdGVQb3MpCit7CisJdTggKnBCZWFjb25GcmFtZSA9IE5VTEw7CisJdTggKnB0cjsKKwl1MzIgaSwgcGFkZGluZzsKKwlzdHJ1Y3QgcnRfYmVhY29uX3N5bmMgKnBCZWFjb25TeW5jID0gcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmM7CisJdTMyIGxvbmdWYWx1ZTsKKy8qICAgICAgdTE2ICAgICAgICAgICAgICAgICAgc2hvcnRWYWx1ZTsgKi8KKwlCT09MRUFOIGJCY25SZXEgPSBGQUxTRTsKKwl1OCBiY25faWR4ID0gMDsKKworCWlmIChwQmVhY29uRnJhbWUgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJwQmVhY29uRnJhbWUgaXMgTlVMTCFcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwQmVhY29uU3luYyA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBCZWFjb25TeW5jIGlzIE5VTEwhXG4iKSk7CisJCXJldHVybjsKKwl9CisJLyppZiAoKHBBZC0+V2RzVGFiLk1vZGUgPT0gV0RTX0JSSURHRV9NT0RFKSB8fCAqLworCS8qICAgICAgKChwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uTVNTSUREZXYgPT0gTlVMTCkgfHwgIShwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uTVNTSUREZXYtPmZsYWdzICYgSUZGX1VQKSkgKi8KKwkvKiAgICAgICkgKi8KKwlpZiAoYkJjblJlcSA9PSBGQUxTRSkgeworCQkvKiB3aGVuIHRoZSByYSBpbnRlcmZhY2UgaXMgZG93biwgZG8gbm90IHNlbmQgaXRzIGJlYWNvbiBmcmFtZSAqLworCQkvKiBjbGVhciBhbGwgemVybyAqLworCQlmb3IgKGkgPSAwOyBpIDwgVFhXSV9TSVpFOyBpICs9IDQpIHsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgaSwKKwkJCQkJMHgwMCk7CisJCX0KKwkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCAmPQorCQkgICAgKH4oQkVBQ09OX0JJVE1BUF9NQVNLICYgKDEgPDwgYmNuX2lkeCkpKTsKKwkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbYmNuX2lkeF0sIFRYV0lfU0laRSk7CisJfSBlbHNlIHsKKwkJcHRyID0gKHU4ICopJiBwQWQtPkJlYWNvblR4V0k7CisJCWlmIChOZGlzRXF1YWxNZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbYmNuX2lkeF0sICZwQWQtPkJlYWNvblR4V0ksIFRYV0lfU0laRSkgPT0gRkFMU0UpIHsJLyogSWYgQmVhY29uVHhXSSBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHJld3JpdGUgdGhlIFR4V0kgZm9yIHRoZSBCZWFjb24gZnJhbWVzLiAqLworCQkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCAmPQorCQkJICAgICh+KEJFQUNPTl9CSVRNQVBfTUFTSyAmICgxIDw8IGJjbl9pZHgpKSk7CisJCQlOZGlzTW92ZU1lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtiY25faWR4XSwKKwkJCQkgICAgICAgJnBBZC0+QmVhY29uVHhXSSwgVFhXSV9TSVpFKTsKKwkJfQorCisJCWlmICgocEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCAmICgxIDw8IGJjbl9pZHgpKSAhPQorCQkgICAgKDEgPDwgYmNuX2lkeCkpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBUWFdJX1NJWkU7IGkgKz0gNCkJLyogMTYtYnl0ZSBUWFdJIGZpZWxkICovCisJCQl7CisJCQkJbG9uZ1ZhbHVlID0KKwkJCQkgICAgKnB0ciArICgqKHB0ciArIDEpIDw8IDgpICsKKwkJCQkgICAgKCoocHRyICsgMikgPDwgMTYpICsgKCoocHRyICsgMykgPDwgMjQpOworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsCisJCQkJCQlwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksCisJCQkJCQlsb25nVmFsdWUpOworCQkJCXB0ciArPSA0OworCQkJfQorCQl9CisKKwkJcHRyID0gcEJlYWNvblN5bmMtPkJlYWNvbkJ1ZltiY25faWR4XTsKKwkJcGFkZGluZyA9IChGcmFtZUxlbiAmIDB4MDEpOworCQlOZGlzWmVyb01lbW9yeSgodTggKikocEJlYWNvbkZyYW1lICsgRnJhbWVMZW4pLCBwYWRkaW5nKTsKKwkJRnJhbWVMZW4gKz0gcGFkZGluZzsKKwkJZm9yIChpID0gMDsgaSA8IEZyYW1lTGVuIC8qSFdfQkVBQ09OX09GRlNFVCAqLyA7IGkgKz0gMikgeworCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShwdHIsIHBCZWFjb25GcmFtZSwgMikgPT0gRkFMU0UpIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShwdHIsIHBCZWFjb25GcmFtZSwgMik7CisJCQkJLypzaG9ydFZhbHVlID0gKnB0ciArICgqKHB0cisxKTw8OCk7ICovCisJCQkJLypSVE1QX0lPX1dSSVRFOChwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgVFhXSV9TSVpFICsgaSwgc2hvcnRWYWx1ZSk7ICovCisJCQkJUlRVU0JNdWx0aVdyaXRlKHBBZCwKKwkJCQkJCXBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsKKwkJCQkJCVRYV0lfU0laRSArIGksIHB0ciwgMik7CisJCQl9CisJCQlwdHIgKz0gMjsKKwkJCXBCZWFjb25GcmFtZSArPSAyOworCQl9CisKKwkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCB8PSAoMSA8PCBiY25faWR4KTsKKworCQkvKiBGb3IgQVAgaW50ZXJmYWNlLCBzZXQgdGhlIER0aW1CaXRPbiBzbyB0aGF0IHdlIGNhbiBzZW5kIEJjYXN0L01jYXN0IGZyYW1lIG91dCBhZnRlciB0aGlzIGJlYWNvbiBmcmFtZS4gKi8KKwl9CisKK30KKwordm9pZCBSVFVTQkJzc0JlYWNvblN0b3Aoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBydF9iZWFjb25fc3luYyAqcEJlYWNvblN5bmM7CisJaW50IGksIG9mZnNldDsKKwlCT09MRUFOIENhbmNlbGxlZCA9IFRSVUU7CisKKwlwQmVhY29uU3luYyA9IHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jOworCWlmIChwQmVhY29uU3luYyAmJiBwQmVhY29uU3luYy0+RW5hYmxlQmVhY29uKSB7CisJCWludCBOdW1PZkJjbjsKKworCQl7CisJCQlOdW1PZkJjbiA9IE1BWF9NRVNIX05VTTsKKwkJfQorCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIsICZDYW5jZWxsZWQpOworCisJCWZvciAoaSA9IDA7IGkgPCBOdW1PZkJjbjsgaSsrKSB7CisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uQnVmW2ldLAorCQkJCSAgICAgICBIV19CRUFDT05fT0ZGU0VUKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2ldLCBUWFdJX1NJWkUpOworCisJCQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IEhXX0JFQUNPTl9PRkZTRVQ7IG9mZnNldCArPSA0KQorCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsCisJCQkJCQlwQWQtPkJlYWNvbk9mZnNldFtpXSArIG9mZnNldCwKKwkJCQkJCTB4MDApOworCisJCQlwQmVhY29uU3luYy0+Q2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW2ldID0gMDsKKwkJCXBCZWFjb25TeW5jLT5UaW1JRUxvY2F0aW9uSW5CZWFjb25baV0gPSAwOworCQl9CisJCXBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgPSAwOworCQlwQmVhY29uU3luYy0+RHRpbUJpdE9uID0gMDsKKwl9Cit9CisKK3ZvaWQgUlRVU0JCc3NCZWFjb25TdGFydChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJaW50IGFwaWR4OworCXN0cnVjdCBydF9iZWFjb25fc3luYyAqcEJlYWNvblN5bmM7CisvKiAgICAgIExBUkdFX0lOVEVHRVIgICB0c2ZUaW1lLCBkZWx0YVRpbWU7ICovCisKKwlwQmVhY29uU3luYyA9IHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jOworCWlmIChwQmVhY29uU3luYyAmJiBwQmVhY29uU3luYy0+RW5hYmxlQmVhY29uKSB7CisJCWludCBOdW1PZkJjbjsKKworCQl7CisJCQlOdW1PZkJjbiA9IE1BWF9NRVNIX05VTTsKKwkJfQorCisJCWZvciAoYXBpZHggPSAwOyBhcGlkeCA8IE51bU9mQmNuOyBhcGlkeCsrKSB7CisJCQl1OCBDYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb24gPSAwOworCQkJdTggVGltSUVMb2NhdGlvbkluQmVhY29uID0gMDsKKworCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvbkJ1ZlthcGlkeF0sCisJCQkJICAgICAgIEhXX0JFQUNPTl9PRkZTRVQpOworCQkJcEJlYWNvblN5bmMtPkNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvblthcGlkeF0gPQorCQkJICAgIENhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbjsKKwkJCXBCZWFjb25TeW5jLT5UaW1JRUxvY2F0aW9uSW5CZWFjb25bYXBpZHhdID0KKwkJCSAgICBUaW1JRUxvY2F0aW9uSW5CZWFjb247CisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVthcGlkeF0sCisJCQkJICAgICAgIFRYV0lfU0laRSk7CisJCX0KKwkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCA9IDA7CisJCXBCZWFjb25TeW5jLT5EdGltQml0T24gPSAwOworCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lci5SZXBlYXQgPSBUUlVFOworCisJCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvbkFkanVzdCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvbkZhY3RvciA9CisJCSAgICAweGZmZmZmZmZmIC8gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCAxMCk7CisJCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblJlbWFpbiA9CisJCSAgICAoMHhmZmZmZmZmZiAlIChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApKSArIDE7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUlRVU0JCc3NCZWFjb25TdGFydDpCZWFjb25GYWN0b3I9JWQsIEJlYWNvblJlbWFpbj0lZCFcbiIsCisJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJlYWNvbkZhY3RvciwKKwkJCSAgcEFkLT5Db21tb25DZmcuQmVhY29uUmVtYWluKSk7CisJCVJUTVBTZXRUaW1lcigmcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIsCisJCQkgICAgIDEwIC8qcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kICovICk7CisKKwl9Cit9CisKK3ZvaWQgUlRVU0JCc3NCZWFjb25Jbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlzdHJ1Y3QgcnRfYmVhY29uX3N5bmMgKnBCZWFjb25TeW5jOworCWludCBpOworCisJb3NfYWxsb2NfbWVtKHBBZCwgKHU4ICoqKSAoJnBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jKSwKKwkJICAgICBzaXplb2Yoc3RydWN0IHJ0X2JlYWNvbl9zeW5jKSk7CisJLypOZGlzQWxsb2NNZW1vcnkocEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMsIHNpemVvZihzdHJ1Y3QgcnRfYmVhY29uX3N5bmMpLCBNRU1fQUxMT0NfRkxBRyk7ICovCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jKSB7CisJCXBCZWFjb25TeW5jID0gcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmM7CisJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLCBzaXplb2Yoc3RydWN0IHJ0X2JlYWNvbl9zeW5jKSk7CisJCWZvciAoaSA9IDA7IGkgPCBIV19CRUFDT05fTUFYX0NPVU5UOyBpKyspIHsKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25CdWZbaV0sCisJCQkJICAgICAgIEhXX0JFQUNPTl9PRkZTRVQpOworCQkJcEJlYWNvblN5bmMtPkNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbltpXSA9IDA7CisJCQlwQmVhY29uU3luYy0+VGltSUVMb2NhdGlvbkluQmVhY29uW2ldID0gMDsKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2ldLCBUWFdJX1NJWkUpOworCQl9CisJCXBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgPSAwOworCisJCS8qUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblVwZGF0ZUV4ZWMpLCBwQWQsIFRSVUUpOyAqLworCQlwQmVhY29uU3luYy0+RW5hYmxlQmVhY29uID0gVFJVRTsKKwl9Cit9CisKK3ZvaWQgUlRVU0JCc3NCZWFjb25FeGl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlzdHJ1Y3QgcnRfYmVhY29uX3N5bmMgKnBCZWFjb25TeW5jOworCUJPT0xFQU4gQ2FuY2VsbGVkID0gVFJVRTsKKwlpbnQgaTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYykgeworCQlwQmVhY29uU3luYyA9IHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jOworCQlwQmVhY29uU3luYy0+RW5hYmxlQmVhY29uID0gRkFMU0U7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIsICZDYW5jZWxsZWQpOworCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgSFdfQkVBQ09OX01BWF9DT1VOVDsgaSsrKSB7CisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uQnVmW2ldLAorCQkJCSAgICAgICBIV19CRUFDT05fT0ZGU0VUKTsKKwkJCXBCZWFjb25TeW5jLT5DYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb25baV0gPSAwOworCQkJcEJlYWNvblN5bmMtPlRpbUlFTG9jYXRpb25JbkJlYWNvbltpXSA9IDA7CisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtpXSwgVFhXSV9TSVpFKTsKKwkJfQorCisJCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMpOworCQlwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYyA9IE5VTEw7CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIEZvciBkZXZpY2Ugd29yayBhcyBBUCBtb2RlIGJ1dCBkaWRuJ3QgaGF2ZSBUQlRUIGludGVycnVwdCBldmVudCwgd2UgbmVlZCBhIG1lY2hhbmlzbQorICAgICAgICB0byB1cGRhdGUgdGhlIGJlYWNvbiBjb250ZXh0IGluIGVhY2ggQmVhY29uIGludGVydmFsLiBIZXJlIHdlIHVzZSBhIHBlcmlvZGljYWwgdGltZXIKKyAgICAgICAgdG8gc2ltdWxhdGUgdGhlIFRCVFQgaW50ZXJydXB0IHRvIGhhbmRsZSB0aGUgYmVhY29uIGNvbnRleHQgdXBkYXRlLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBTeXN0ZW1TcGVjaWZpYzEgICAgICAgICAtIE5vdCB1c2VkLgorICAgICAgICBGdW5jdGlvbkNvbnRleHQgICAgICAgICAtIFBvaW50ZXIgdG8gb3VyIEFkYXB0ZXIgY29udGV4dC4KKyAgICAgICAgU3lzdGVtU3BlY2lmaWMyICAgICAgICAgLSBOb3QgdXNlZC4KKyAgICAgICAgU3lzdGVtU3BlY2lmaWMzICAgICAgICAgLSBOb3QgdXNlZC4KKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBCZWFjb25VcGRhdGVFeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMykKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKKwlMQVJHRV9JTlRFR0VSIHRzZlRpbWVfYTsJLyosIHRzZlRpbWVfYiwgZGVsdGFUaW1lX2V4cCwgZGVsdGFUaW1lX2FiOyAqLworCXUzMiBkZWx0YSwgZGVsdGEyTVMsIHBlcmlvZDJVUywgcmVtYWluLCByZW1haW5fbG93LCByZW1haW5faGlnaDsKKy8qICAgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgcG9zaXRpdmU7ICovCisKKwlpZiAocEFkLT5Db21tb25DZmcuSXNVcGRhdGVCZWFjb24gPT0gVFJVRSkgeworCQlSZVN5bmNCZWFjb25UaW1lKHBBZCk7CisKKwl9CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRTRl9USU1FUl9EVzAsICZ0c2ZUaW1lX2EudS5Mb3dQYXJ0KTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRTRl9USU1FUl9EVzEsICZ0c2ZUaW1lX2EudS5IaWdoUGFydCk7CisKKwkvKnBvc2l0aXZlPWdldERlbHRhVGltZSh0c2ZUaW1lX2EsIGV4cGVjdGVkVGltZSwgJmRlbHRhVGltZV9leHApOyAqLworCXBlcmlvZDJVUyA9IChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApOworCXJlbWFpbl9oaWdoID0gcEFkLT5Db21tb25DZmcuQmVhY29uUmVtYWluICogdHNmVGltZV9hLnUuSGlnaFBhcnQ7CisJcmVtYWluX2xvdyA9IHRzZlRpbWVfYS51Lkxvd1BhcnQgJSAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDEwKTsKKwlyZW1haW4gPQorCSAgICAocmVtYWluX2hpZ2ggKyByZW1haW5fbG93KSAlIChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApOworCWRlbHRhID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCAxMCkgLSByZW1haW47CisKKwlkZWx0YTJNUyA9IChkZWx0YSA+PiAxMCk7CisJaWYgKGRlbHRhMk1TID4gMTUwKSB7CisJCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblVwZGF0ZVRpbWVyLlRpbWVyVmFsdWUgPSAxMDA7CisJCXBBZC0+Q29tbW9uQ2ZnLklzVXBkYXRlQmVhY29uID0gRkFMU0U7CisJfSBlbHNlIHsKKwkJcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIuVGltZXJWYWx1ZSA9IGRlbHRhMk1TICsgMTA7CisJCXBBZC0+Q29tbW9uQ2ZnLklzVXBkYXRlQmVhY29uID0gVFJVRTsKKwl9CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKgkyODcwIFJhZGlvIG9uL29mZiBSZWxhdGVkIGZ1bmN0aW9ucy4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUlQyOHh4VXNiTWxtZVJhZGlvT24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBydF9ydG1wX2NoaXBfb3AgKnBDaGlwT3BzID0gJnBBZC0+Y2hpcE9wczsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUMjh4eFVzYk1sbWVSYWRpb09uKClcbiIpKTsKKworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCisJCXJldHVybjsKKworCXsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCAweGZmLCAweDAwLCAweDAyKTsKKwkJUlRNUHVzZWNEZWxheSgxMDAwMCk7CisJfQorCS8qTklDUmVzZXRGcm9tRXJyb3IocEFkKTsgKi8KKworCS8qIEVuYWJsZSBUeC9SeCAqLworCVJUTVBFbmFibGVSeFR4KHBBZCk7CisKKwlpZiAocENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKQorCQlwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUocEFkKTsKKworCS8qIENsZWFyIFJhZGlvIG9mZiBmbGFnICovCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCisJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCisJLyogU2V0IExFRCAqLworCVJUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT04pOworfQorCit2b2lkIFJUMjh4eFVzYk1sbWVSYWRpb09GRihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJV1BETUFfR0xPX0NGR19TVFJVQyBHbG9DZmc7CisJdTMyIFZhbHVlLCBpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlQyOHh4VXNiTWxtZVJhZGlvT0ZGKClcbiIpKTsKKworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKwkJcmV0dXJuOworCisJLyogQ2xlYXIgUE1LSUQgY2FjaGUuICovCisJcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0gPSAwOworCVJUTVBaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlNhdmVkUE1LLCAoUE1LSURfTk8gKiBzaXplb2Yoc3RydWN0IHJ0X2Jzc2lkX2luZm8pKSk7CisKKwkvKiBMaW5rIGRvd24gZmlyc3QgaWYgYW55IGFzc29jaWF0aW9uIGV4aXN0cyAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSB7CisJCWlmIChJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkpIHsKKwkJCXN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSBEaXNSZXE7CisJCQlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpwTXNnRWxlbSA9CisJCQkgICAgKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKKwkJCQkJCQlNRU1fQUxMT0NfRkxBRyk7CisKKwkJCWlmIChwTXNnRWxlbSkgeworCQkJCUNPUFlfTUFDX0FERFIoJkRpc1JlcS5BZGRyLAorCQkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkJRGlzUmVxLlJlYXNvbiA9IFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORzsKKworCQkJCXBNc2dFbGVtLT5NYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJCQlwTXNnRWxlbS0+TXNnVHlwZSA9IE1UMl9NTE1FX0RJU0FTU09DX1JFUTsKKwkJCQlwTXNnRWxlbS0+TXNnTGVuID0KKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSk7CisJCQkJTmRpc01vdmVNZW1vcnkocE1zZ0VsZW0tPk1zZywgJkRpc1JlcSwKKwkJCQkJICAgICAgIHNpemVvZgorCQkJCQkgICAgICAgKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSkpOworCisJCQkJTWxtZURpc2Fzc29jUmVxQWN0aW9uKHBBZCwgcE1zZ0VsZW0pOworCQkJCWtmcmVlKHBNc2dFbGVtKTsKKworCQkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCQl9CisJCX0KKwl9CisJLyogU2V0IFJhZGlvIG9mZiBmbGFnICovCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKKworCXsKKwkJLyogTGluayBkb3duIGZpcnN0IGlmIGFueSBhc3NvY2lhdGlvbiBleGlzdHMgKi8KKwkJaWYgKElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKSkKKwkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOworCQlSVE1QdXNlY0RlbGF5KDEwMDAwKTsKKworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCQkvKiBDbGVhbiB1cCBvbGQgYnNzIHRhYmxlICovCisJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKKwl9CisKKwkvKiBTZXQgTEVEICovCisJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkgeworCQkvKiBNdXN0IHVzaW5nIDQwTUh6LiAqLworCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCX0gZWxzZSB7CisJCS8qIE11c3QgdXNpbmcgMjBNSHouICovCisJCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwl9CisKKwkvKiBEaXNhYmxlIFR4L1J4IERNQSAqLworCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsJLyogZGlzYWJsZSBETUEgKi8KKwlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSAwOworCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDA7CisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOwkvKiBhYm9ydCBhbGwgVFggcmluZ3MgKi8KKworCS8qIFdhaXRpbmcgZm9yIERNQSBpZGxlICovCisJaSA9IDA7CisJZG8geworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CisJCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKQorCQkgICAgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCX0gd2hpbGUgKGkrKyA8IDEwMCk7CisKKwkvKiBEaXNhYmxlIE1BQyBUeC9SeCAqLworCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCVZhbHVlICY9ICgweGZmZmZmZmYzKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCXsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCAweGZmLCAweGZmLCAweDAyKTsKKwl9Cit9CisKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9zYW5pdHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9zYW5pdHkuYwppbmRleCA4NTg1NWY3Zi4uNmIwMDNjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3Nhbml0eS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9zYW5pdHkuYwpAQCAtMzYsMTcgKzM2LDE2IEBACiAqLwogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogCitleHRlcm4gdTggQ0lTQ09fT1VJW107CiAKLWV4dGVybiBVQ0hBUglDSVNDT19PVUlbXTsKLQotZXh0ZXJuIFVDSEFSCVdQQV9PVUlbXTsKLWV4dGVybiBVQ0hBUglSU05fT1VJW107Ci1leHRlcm4gVUNIQVIJV01FX0lORk9fRUxFTVtdOwotZXh0ZXJuIFVDSEFSCVdNRV9QQVJNX0VMRU1bXTsKLWV4dGVybiBVQ0hBUglDY3gyUW9zSW5mb1tdOwotZXh0ZXJuIFVDSEFSCVJBTElOS19PVUlbXTsKLWV4dGVybiBVQ0hBUglCUk9BRENPTV9PVUlbXTsKLWV4dGVybiBVQ0hBUiAgICBXUFNfT1VJW107CitleHRlcm4gdTggV1BBX09VSVtdOworZXh0ZXJuIHU4IFJTTl9PVUlbXTsKK2V4dGVybiB1OCBXTUVfSU5GT19FTEVNW107CitleHRlcm4gdTggV01FX1BBUk1fRUxFTVtdOworZXh0ZXJuIHU4IENjeDJRb3NJbmZvW107CitleHRlcm4gdTggUkFMSU5LX09VSVtdOworZXh0ZXJuIHU4IEJST0FEQ09NX09VSVtdOworZXh0ZXJuIHU4IFdQU19PVUlbXTsKIAogLyoKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNTksMTczICs1OCwxNzIgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLUJPT0xFQU4gTWxtZUFkZEJBUmVxU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwQWRkcjIpCitCT09MRUFOIE1sbWVBZGRCQVJlcVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB2b2lkICogTXNnLCB1bnNpZ25lZCBsb25nIE1zZ0xlbiwgdTggKnBBZGRyMikKIHsKLSAgICBQTUxNRV9BRERCQV9SRVFfU1RSVUNUICAgcEluZm87CisJc3RydWN0IHJ0X21sbWVfYWRkYmFfcmVxICpwSW5mbzsKIAotICAgIHBJbmZvID0gKE1MTUVfQUREQkFfUkVRX1NUUlVDVCAqKU1zZzsKKwlwSW5mbyA9IChzdHJ1Y3QgcnRfbWxtZV9hZGRiYV9yZXEgKilNc2c7CiAKLSAgICBpZiAoKE1zZ0xlbiAhPSBzaXplb2YoTUxNRV9BRERCQV9SRVFfU1RSVUNUKSkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIG1lc3NhZ2UgbGVuZ2h0IG5vdCBjb3JyZWN0LlxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKChwSW5mby0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIE1hYyBpcyBub3QgYXNzb2NpYXRlZCB5ZXQuXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoKHBJbmZvLT5wQWRkclswXSYweDAxKSA9PSAweDAxKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBicm9hZGNhc3QgYWRkcmVzcyBub3Qgc3VwcG9ydCBCQVxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjawotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIE1sbWVEZWxCQVJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuKQotewotCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAqcEluZm87Ci0JcEluZm8gPSAoTUxNRV9ERUxCQV9SRVFfU1RSVUNUICopTXNnOwotCi0gICAgaWYgKChNc2dMZW4gIT0gc2l6ZW9mKE1MTUVfREVMQkFfUkVRX1NUUlVDVCkpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBtZXNzYWdlIGxlbmdodCBub3QgY29ycmVjdC5cbiIpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIGlmICgocEluZm8tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBUaGUgcGVlciBNYWMgaXMgbm90IGFzc29jaWF0ZWQgeWV0LlxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKChwSW5mby0+VElEICYgMHhmMCkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIFRJRCBpcyBpbmNvcnJlY3QuXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLQlpZiAoTmRpc0VxdWFsTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBJbmZvLT5BZGRyLCBNQUNfQUREUl9MRU4pID09IDApCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIHRoZSBwZWVyIGFkZHIgZG9zZW4ndCBleGlzdC5cbiIpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi1CT09MRUFOIFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpwTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBZGRyMikKLXsKLQlQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0JUEZSQU1FX0FEREJBX1JFUSBwQWRkRnJhbWU7Ci0JcEFkZEZyYW1lID0gKFBGUkFNRV9BRERCQV9SRVEpKHBNc2cpOwotCWlmIChNc2dMZW4gPCAoc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSkpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwlpZiAoKE1zZ0xlbiAhPSBzaXplb2Yoc3RydWN0IHJ0X21sbWVfYWRkYmFfcmVxKSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIG1lc3NhZ2UgbGVuZ2h0IG5vdCBjb3JyZWN0LlxuIikpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQotCS8vIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLgotCSooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEFkZEZyYW1lLT5CYVBhcm0pKTsKKworCWlmICgocEluZm8tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBUaGUgcGVlciBNYWMgaXMgbm90IGFzc29jaWF0ZWQgeWV0LlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKChwSW5mby0+cEFkZHJbMF0gJiAweDAxKSA9PSAweDAxKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBicm9hZGNhc3QgYWRkcmVzcyBub3Qgc3VwcG9ydCBCQVxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVEZWxCQVJlcVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHZvaWQgKiBNc2csIHVuc2lnbmVkIGxvbmcgTXNnTGVuKQoreworCXN0cnVjdCBydF9tbG1lX2RlbGJhX3JlcSAqcEluZm87CisJcEluZm8gPSAoc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxICopTXNnOworCisJaWYgKChNc2dMZW4gIT0gc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2RlbGJhX3JlcSkpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBtZXNzYWdlIGxlbmdodCBub3QgY29ycmVjdC5cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmICgocEluZm8tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBUaGUgcGVlciBNYWMgaXMgbm90IGFzc29jaWF0ZWQgeWV0LlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKChwSW5mby0+VElEICYgMHhmMCkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIFRJRCBpcyBpbmNvcnJlY3QuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoTmRpc0VxdWFsTWVtb3J5CisJICAgIChwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyLCBwSW5mby0+QWRkciwKKwkgICAgIE1BQ19BRERSX0xFTikgPT0gMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIk1sbWVEZWxCQVJlcVNhbml0eSBmYWlsIC0gdGhlIHBlZXIgYWRkciBkb3Nlbid0IGV4aXN0LlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKK0JPT0xFQU4gUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgdm9pZCAqIHBNc2csCisJCQkJIHVuc2lnbmVkIGxvbmcgTXNnTGVuLCB1OCAqcEFkZHIyKQoreworCXN0cnVjdCBydF9mcmFtZV84MDJfMTEgKiBwRnJhbWUgPSAoc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqKSBwTXNnOworCXN0cnVjdCBydF9mcmFtZV9hZGRiYV9yZXEgKiBwQWRkRnJhbWU7CisJcEFkZEZyYW1lID0gKHN0cnVjdCBydF9mcmFtZV9hZGRiYV9yZXEgKikgKHBNc2cpOworCWlmIChNc2dMZW4gPCAoc2l6ZW9mKHN0cnVjdCBydF9mcmFtZV9hZGRiYV9yZXEpKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsCisJCQkgIE1zZ0xlbikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLiAqLworCSoodTE2ICopICgmcEFkZEZyYW1lLT5CYVBhcm0pID0KKwkgICAgY3B1MmxlMTYoKih1MTYgKikgKCZwQWRkRnJhbWUtPkJhUGFybSkpOwogCXBBZGRGcmFtZS0+VGltZU91dFZhbHVlID0gY3B1MmxlMTYocEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUpOwogCXBBZGRGcmFtZS0+QmFTdGFydFNlcS53b3JkID0gY3B1MmxlMTYocEFkZEZyYW1lLT5CYVN0YXJ0U2VxLndvcmQpOwogCi0JaWYgKHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5ICE9IElNTUVEX0JBKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgQmEgUG9saWN5WyVkXSBub3Qgc3VwcG9ydFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kpKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJBRERCQSBSZXF1ZXN0LiB0aWQ9JXgsIEJ1ZnNpemU9JXgsIEFNU0RVU3VwcG9ydGVkPSV4IFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uVElELCBwQWRkRnJhbWUtPkJhUGFybS5CdWZTaXplLCBwQWRkRnJhbWUtPkJhUGFybS5BTVNEVVN1cHBvcnRlZCkpOworCWlmIChwQWRkRnJhbWUtPkJhUGFybS5CQVBvbGljeSAhPSBJTU1FRF9CQSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBCYSBQb2xpY3lbJWRdIG5vdCBzdXBwb3J0XG4iLAorCQkJICBwQWRkRnJhbWUtPkJhUGFybS5CQVBvbGljeSkpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIkFEREJBIFJlcXVlc3QuIHRpZD0leCwgQnVmc2l6ZT0leCwgQU1TRFVTdXBwb3J0ZWQ9JXggXG4iLAorCQkJICBwQWRkRnJhbWUtPkJhUGFybS5USUQsIHBBZGRGcmFtZS0+QmFQYXJtLkJ1ZlNpemUsCisJCQkgIHBBZGRGcmFtZS0+QmFQYXJtLkFNU0RVU3VwcG9ydGVkKSk7CiAJCXJldHVybiBGQUxTRTsKIAl9Ci0KLQkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KLQlpZiAocEFkZEZyYW1lLT5CYVBhcm0uVElEICYweGZmZjApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBpbmNvcnJlY3QgVElEID0gJWRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLlRJRCkpOworCS8qIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLiAqLworCWlmIChwQWRkRnJhbWUtPkJhUGFybS5USUQgJiAweGZmZjApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgaW5jb3JyZWN0IFRJRCA9ICVkXG4iLAorCQkJICBwQWRkRnJhbWUtPkJhUGFybS5USUQpKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAlDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOwogCXJldHVybiBUUlVFOwogfQogCi1CT09MRUFOIFBlZXJBZGRCQVJzcEFjdGlvblNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpwTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbikKK0JPT0xFQU4gUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgdm9pZCAqIHBNc2csIHVuc2lnbmVkIGxvbmcgTXNnTGVuKQogewotCVBGUkFNRV9BRERCQV9SU1AgcEFkZEZyYW1lOworCXN0cnVjdCBydF9mcmFtZV9hZGRiYV9yc3AgKiBwQWRkRnJhbWU7CiAKLQlwQWRkRnJhbWUgPSAoUEZSQU1FX0FEREJBX1JTUCkocE1zZyk7Ci0JaWYgKE1zZ0xlbiA8IChzaXplb2YoRlJBTUVfQUREQkFfUlNQKSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJzcEFjdGlvblNhbml0eTogQUREQkEgUmVzcG9uc2UgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwlwQWRkRnJhbWUgPSAoc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JzcCAqKSAocE1zZyk7CisJaWYgKE1zZ0xlbiA8IChzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JzcCkpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5OiBBRERCQSBSZXNwb25zZSBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsCisJCQkgIE1zZ0xlbikpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQotCS8vIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLgotCSooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEFkZEZyYW1lLT5CYVBhcm0pKTsKKwkvKiB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4gKi8KKwkqKHUxNiAqKSAoJnBBZGRGcmFtZS0+QmFQYXJtKSA9CisJICAgIGNwdTJsZTE2KCoodTE2ICopICgmcEFkZEZyYW1lLT5CYVBhcm0pKTsKIAlwQWRkRnJhbWUtPlN0YXR1c0NvZGUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlN0YXR1c0NvZGUpOwogCXBBZGRGcmFtZS0+VGltZU91dFZhbHVlID0gY3B1MmxlMTYocEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUpOwogCi0JaWYgKHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5ICE9IElNTUVEX0JBKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlc3BvbnNlIEJhIFBvbGljeVslZF0gbm90IHN1cHBvcnRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5KSk7CisJaWYgKHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5ICE9IElNTUVEX0JBKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5OiBBRERCQSBSZXNwb25zZSBCYSBQb2xpY3lbJWRdIG5vdCBzdXBwb3J0XG4iLAorCQkJICBwQWRkRnJhbWUtPkJhUGFybS5CQVBvbGljeSkpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQotCi0JLy8gd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuCi0JaWYgKHBBZGRGcmFtZS0+QmFQYXJtLlRJRCAmMHhmZmYwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHk6IEFEREJBIFJlc3BvbnNlIGluY29ycmVjdCBUSUQgPSAlZFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uVElEKSk7CisJLyogd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuICovCisJaWYgKHBBZGRGcmFtZS0+QmFQYXJtLlRJRCAmIDB4ZmZmMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIlBlZXJBZGRCQVJzcEFjdGlvblNhbml0eTogQUREQkEgUmVzcG9uc2UgaW5jb3JyZWN0IFRJRCA9ICVkXG4iLAorCQkJICBwQWRkRnJhbWUtPkJhUGFybS5USUQpKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAlyZXR1cm4gVFJVRTsKIAogfQogCi1CT09MRUFOIFBlZXJEZWxCQUFjdGlvblNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBVQ0hBUiBXY2lkLAotICAgIElOIFZPSUQgKnBNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuICkKK0JPT0xFQU4gUGVlckRlbEJBQWN0aW9uU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHU4IFdjaWQsIHZvaWQgKiBwTXNnLCB1bnNpZ25lZCBsb25nIE1zZ0xlbikKIHsKLQkvL1BGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKLQlQRlJBTUVfREVMQkFfUkVRICBwRGVsRnJhbWU7Ci0JaWYgKE1zZ0xlbiAhPSAoc2l6ZW9mKEZSQU1FX0RFTEJBX1JFUSkpKQorCS8qc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopcE1zZzsgKi8KKwlzdHJ1Y3QgcnRfZnJhbWVfZGVsYmFfcmVxICogcERlbEZyYW1lOworCWlmIChNc2dMZW4gIT0gKHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfZGVsYmFfcmVxKSkpCiAJCXJldHVybiBGQUxTRTsKIAogCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQogCQlyZXR1cm4gRkFMU0U7CiAKLQlwRGVsRnJhbWUgPSAoUEZSQU1FX0RFTEJBX1JFUSkocE1zZyk7CisJcERlbEZyYW1lID0gKHN0cnVjdCBydF9mcmFtZV9kZWxiYV9yZXEgKikgKHBNc2cpOwogCi0JKihVU0hPUlQgKikoJnBEZWxGcmFtZS0+RGVsYmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwRGVsRnJhbWUtPkRlbGJhUGFybSkpOworCSoodTE2ICopICgmcERlbEZyYW1lLT5EZWxiYVBhcm0pID0KKwkgICAgY3B1MmxlMTYoKih1MTYgKikgKCZwRGVsRnJhbWUtPkRlbGJhUGFybSkpOwogCXBEZWxGcmFtZS0+UmVhc29uQ29kZSA9IGNwdTJsZTE2KHBEZWxGcmFtZS0+UmVhc29uQ29kZSk7CiAKLQlpZiAocERlbEZyYW1lLT5EZWxiYVBhcm0uVElEICYweGZmZjApCisJaWYgKHBEZWxGcmFtZS0+RGVsYmFQYXJtLlRJRCAmIDB4ZmZmMCkKIAkJcmV0dXJuIEZBTFNFOwogCiAJcmV0dXJuIFRSVUU7CkBAIC0yNDIsNDcyICsyNDAsNDY5IEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1CT09MRUFOIFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIElOIFVDSEFSICBNc2dDaGFubmVsLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBQVUNIQVIgcEJzc2lkLAotICAgIE9VVCBDSEFSIFNzaWRbXSwKLSAgICBPVVQgVUNIQVIgKnBTc2lkTGVuLAotICAgIE9VVCBVQ0hBUiAqcEJzc1R5cGUsCi0gICAgT1VUIFVTSE9SVCAqcEJlYWNvblBlcmlvZCwKLSAgICBPVVQgVUNIQVIgKnBDaGFubmVsLAotICAgIE9VVCBVQ0hBUiAqcE5ld0NoYW5uZWwsCi0gICAgT1VUIExBUkdFX0lOVEVHRVIgKnBUaW1lc3RhbXAsCi0gICAgT1VUIENGX1BBUk0gKnBDZlBhcm0sCi0gICAgT1VUIFVTSE9SVCAqcEF0aW1XaW4sCi0gICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAotICAgIE9VVCBVQ0hBUiAqcEVycCwKLSAgICBPVVQgVUNIQVIgKnBEdGltQ291bnQsCi0gICAgT1VUIFVDSEFSICpwRHRpbVBlcmlvZCwKLSAgICBPVVQgVUNIQVIgKnBCY2FzdEZsYWcsCi0gICAgT1VUIFVDSEFSICpwTWVzc2FnZVRvTWUsCi0gICAgT1VUIFVDSEFSIFN1cFJhdGVbXSwKLSAgICBPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAotICAgIE9VVCBVQ0hBUiBFeHRSYXRlW10sCi0gICAgT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKLSAgICBPVVQJVUNIQVIgKnBDa2lwRmxhZywKLSAgICBPVVQJVUNIQVIgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCi0gICAgT1VUIFBFRENBX1BBUk0gICAgICAgcEVkY2FQYXJtLAotICAgIE9VVCBQUUJTU19MT0FEX1BBUk0gIHBRYnNzTG9hZCwKLSAgICBPVVQgUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCi0gICAgT1VUIFVMT05HICpwUmFsaW5rSWUsCi0gICAgT1VUIFVDSEFSCQkgKnBIdENhcGFiaWxpdHlMZW4sCi0gICAgT1VUIFVDSEFSCQkgKnBQcmVOSHRDYXBhYmlsaXR5TGVuLAotICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAotCU9VVCBVQ0hBUgkJICpBZGRIdEluZm9MZW4sCi0JT1VUIEFERF9IVF9JTkZPX0lFICpBZGRIdEluZm8sCi0JT1VUIFVDSEFSICpOZXdFeHRDaGFubmVsT2Zmc2V0LAkJLy8gSHQgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0KGFib3ZlIG9yIGJlbG93KQotICAgIE9VVCBVU0hPUlQgKkxlbmd0aFZJRSwKLSAgICBPVVQJUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKQorQk9PTEVBTiBQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICogTXNnLCB1bnNpZ25lZCBsb25nIE1zZ0xlbiwgdTggTXNnQ2hhbm5lbCwgdTggKnBBZGRyMiwgdTggKnBCc3NpZCwgY2hhciBTc2lkW10sIHU4ICogcFNzaWRMZW4sIHU4ICogcEJzc1R5cGUsIHUxNiAqIHBCZWFjb25QZXJpb2QsIHU4ICogcENoYW5uZWwsIHU4ICogcE5ld0NoYW5uZWwsIE9VVCBMQVJHRV9JTlRFR0VSICogcFRpbWVzdGFtcCwgc3RydWN0IHJ0X2NmX3Bhcm0gKiBwQ2ZQYXJtLCB1MTYgKiBwQXRpbVdpbiwgdTE2ICogcENhcGFiaWxpdHlJbmZvLCB1OCAqIHBFcnAsIHU4ICogcER0aW1Db3VudCwgdTggKiBwRHRpbVBlcmlvZCwgdTggKiBwQmNhc3RGbGFnLCB1OCAqIHBNZXNzYWdlVG9NZSwgdTggU3VwUmF0ZVtdLCB1OCAqIHBTdXBSYXRlTGVuLCB1OCBFeHRSYXRlW10sIHU4ICogcEV4dFJhdGVMZW4sIHU4ICogcENraXBGbGFnLCB1OCAqIHBBaXJvbmV0Q2VsbFBvd2VyTGltaXQsIHN0cnVjdCBydF9lZGNhX3Bhcm0gKnBFZGNhUGFybSwgc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtICpwUWJzc0xvYWQsIHN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtICpwUW9zQ2FwYWJpbGl0eSwgdW5zaWduZWQgbG9uZyAqIHBSYWxpbmtJZSwgdTggKiBwSHRDYXBhYmlsaXR5TGVuLCB1OCAqIHBQcmVOSHRDYXBhYmlsaXR5TGVuLCBzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSAqIHBIdENhcGFiaWxpdHksIHU4ICogQWRkSHRJbmZvTGVuLCBzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgKiBBZGRIdEluZm8sIHU4ICogTmV3RXh0Q2hhbm5lbE9mZnNldCwJLyogSHQgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0KGFib3ZlIG9yIGJlbG93KSAqLworCQkJCSAgICB1MTYgKiBMZW5ndGhWSUUsCisJCQkJICAgIHN0cnVjdCBydF9uZGlzXzgwMl8xMV92YXJpYWJsZV9pZXMgKnBWSUUpCiB7Ci0gICAgQ0hBUgkJCQkqUHRyOwotCUNIQVIgCQkJCVRpbUxlbjsKLSAgICBQRlJBTUVfODAyXzExCQlwRnJhbWU7Ci0gICAgUEVJRF9TVFJVQ1QgICAgICAgICBwRWlkOwotICAgIFVDSEFSCQkJCVN1YlR5cGU7Ci0gICAgVUNIQVIJCQkJU2FuaXR5OwotICAgIC8vVUNIQVIJCQkJRUNXTWluLCBFQ1dNYXg7Ci0gICAgLy9NQUNfQ1NSOV9TVFJVQwkJQ3NyOTsKLSAgICBVTE9ORwkJCQlMZW5ndGggPSAwOworCXU4ICpQdHI7CisJdTggVGltTGVuOworCXN0cnVjdCBydF9mcmFtZV84MDJfMTEgKiBwRnJhbWU7CisJc3RydWN0IHJ0X2VpZCAqIHBFaWQ7CisJdTggU3ViVHlwZTsKKwl1OCBTYW5pdHk7CisJLyp1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNXTWluLCBFQ1dNYXg7ICovCisJLypNQUNfQ1NSOV9TVFJVQyAgICAgICAgICAgIENzcjk7ICovCisJdW5zaWduZWQgbG9uZyBMZW5ndGggPSAwOwogCi0JLy8gRm9yIHNvbWUgMTFhIEFQIHdoaWNoIGRpZG4ndCBoYXZlIERTX0lFLCB3ZSB1c2UgdHdvIGNvbmRpdGlvbnMgdG8gZGVjaWRlIHRoZSBjaGFubmVsCi0JLy8JMS4gSWYgdGhlIEFQIGlzIDExbiBlbmFibGVkLCB0aGVuIGNoZWNrIHRoZSBjb250cm9sIGNoYW5uZWwuCi0JLy8JMi4gSWYgdGhlIEFQIGRpZG4ndCBoYXZlIGFueSBpbmZvIGFib3V0IGNoYW5uZWwsIHVzZSB0aGUgY2hhbm5lbCB3ZSByZWNlaXZlZCB0aGlzIGZyYW1lIGFzIHRoZSBjaGFubmVsLiAoTWF5IGluYWNjdXJhY3khISkKLQlVQ0hBUgkJCUN0cmxDaGFubmVsID0gMDsKKwkvKiBGb3Igc29tZSAxMWEgQVAgd2hpY2ggZGlkbid0IGhhdmUgRFNfSUUsIHdlIHVzZSB0d28gY29uZGl0aW9ucyB0byBkZWNpZGUgdGhlIGNoYW5uZWwgKi8KKwkvKiAgICAgIDEuIElmIHRoZSBBUCBpcyAxMW4gZW5hYmxlZCwgdGhlbiBjaGVjayB0aGUgY29udHJvbCBjaGFubmVsLiAqLworCS8qICAgICAgMi4gSWYgdGhlIEFQIGRpZG4ndCBoYXZlIGFueSBpbmZvIGFib3V0IGNoYW5uZWwsIHVzZSB0aGUgY2hhbm5lbCB3ZSByZWNlaXZlZCB0aGlzIGZyYW1lIGFzIHRoZSBjaGFubmVsLiAoTWF5IGluYWNjdXJhY3khKSAqLworCXU4IEN0cmxDaGFubmVsID0gMDsKIAotICAgIC8vIEFkZCBmb3IgMyBuZWNlc3NhcnkgRUlEIGZpZWxkIGNoZWNrCi0gICAgU2FuaXR5ID0gMDsKKwkvKiBBZGQgZm9yIDMgbmVjZXNzYXJ5IEVJRCBmaWVsZCBjaGVjayAqLworCVNhbml0eSA9IDA7CiAKLSAgICAqcEF0aW1XaW4gPSAwOwotICAgICpwRXJwID0gMDsKLSAgICAqcER0aW1Db3VudCA9IDA7Ci0gICAgKnBEdGltUGVyaW9kID0gMDsKLSAgICAqcEJjYXN0RmxhZyA9IDA7Ci0gICAgKnBNZXNzYWdlVG9NZSA9IDA7Ci0gICAgKnBFeHRSYXRlTGVuID0gMDsKLSAgICAqcENraXBGbGFnID0gMDsJCQkgICAgICAgIC8vIERlZmF1bHQgb2YgQ2tpcEZsYWcgaXMgMAotICAgICpwQWlyb25ldENlbGxQb3dlckxpbWl0ID0gMHhGRjsgIC8vIERlZmF1bHQgb2YgQWlyb25ldENlbGxQb3dlckxpbWl0IGlzIDB4RkYKLSAgICAqTGVuZ3RoVklFID0gMDsJCQkJCS8vIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAKLSAgICAqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisJKnBBdGltV2luID0gMDsKKwkqcEVycCA9IDA7CisJKnBEdGltQ291bnQgPSAwOworCSpwRHRpbVBlcmlvZCA9IDA7CisJKnBCY2FzdEZsYWcgPSAwOworCSpwTWVzc2FnZVRvTWUgPSAwOworCSpwRXh0UmF0ZUxlbiA9IDA7CisJKnBDa2lwRmxhZyA9IDA7CQkvKiBEZWZhdWx0IG9mIENraXBGbGFnIGlzIDAgKi8KKwkqcEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA9IDB4RkY7CS8qIERlZmF1bHQgb2YgQWlyb25ldENlbGxQb3dlckxpbWl0IGlzIDB4RkYgKi8KKwkqTGVuZ3RoVklFID0gMDsJCS8qIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAgKi8KKwkqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7CS8qIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAgKi8KIAlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQkJKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsJCQkJCS8vIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAKLSAgICAqQWRkSHRJbmZvTGVuID0gMDsJCQkJCS8vIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAKLSAgICAqcFJhbGlua0llID0gMDsKLSAgICAqcE5ld0NoYW5uZWwgPSAwOwotICAgICpOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsJLy9EZWZhdWx0IDB4ZmYgbWVhbnMgbm8gc3VjaCBJRQotICAgIHBDZlBhcm0tPmJWYWxpZCA9IEZBTFNFOyAgICAgICAgLy8gZGVmYXVsdDogbm8gSUVfQ0YgZm91bmQKLSAgICBwUWJzc0xvYWQtPmJWYWxpZCA9IEZBTFNFOyAgICAgIC8vIGRlZmF1bHQ6IG5vIElFX1FCU1NfTE9BRCBmb3VuZAotICAgIHBFZGNhUGFybS0+YlZhbGlkID0gRkFMU0U7ICAgICAgLy8gZGVmYXVsdDogbm8gSUVfRURDQV9QQVJBTUVURVIgZm91bmQKLSAgICBwUW9zQ2FwYWJpbGl0eS0+YlZhbGlkID0gRkFMU0U7IC8vIGRlZmF1bHQ6IG5vIElFX1FPU19DQVBBQklMSVRZIGZvdW5kCisJCSpwUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CS8qIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAgKi8KKwkqQWRkSHRJbmZvTGVuID0gMDsJLyogU2V0IHRoZSBsZW5ndGggb2YgVklFIHRvIGluaXQgdmFsdWUgMCAqLworCSpwUmFsaW5rSWUgPSAwOworCSpwTmV3Q2hhbm5lbCA9IDA7CisJKk5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOwkvKkRlZmF1bHQgMHhmZiBtZWFucyBubyBzdWNoIElFICovCisJcENmUGFybS0+YlZhbGlkID0gRkFMU0U7CS8qIGRlZmF1bHQ6IG5vIElFX0NGIGZvdW5kICovCisJcFFic3NMb2FkLT5iVmFsaWQgPSBGQUxTRTsJLyogZGVmYXVsdDogbm8gSUVfUUJTU19MT0FEIGZvdW5kICovCisJcEVkY2FQYXJtLT5iVmFsaWQgPSBGQUxTRTsJLyogZGVmYXVsdDogbm8gSUVfRURDQV9QQVJBTUVURVIgZm91bmQgKi8KKwlwUW9zQ2FwYWJpbGl0eS0+YlZhbGlkID0gRkFMU0U7CS8qIGRlZmF1bHQ6IG5vIElFX1FPU19DQVBBQklMSVRZIGZvdW5kICovCiAKLSAgICBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisJcEZyYW1lID0gKHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKikgTXNnOwogCi0gICAgLy8gZ2V0IHN1YnR5cGUgZnJvbSBoZWFkZXIKLSAgICBTdWJUeXBlID0gKFVDSEFSKXBGcmFtZS0+SGRyLkZDLlN1YlR5cGU7CisJLyogZ2V0IHN1YnR5cGUgZnJvbSBoZWFkZXIgKi8KKwlTdWJUeXBlID0gKHU4KXBGcmFtZS0+SGRyLkZDLlN1YlR5cGU7CiAKLSAgICAvLyBnZXQgQWRkcjIgYW5kIEJTU0lEIGZyb20gaGVhZGVyCi0gICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKLSAgICBDT1BZX01BQ19BRERSKHBCc3NpZCwgcEZyYW1lLT5IZHIuQWRkcjMpOworCS8qIGdldCBBZGRyMiBhbmQgQlNTSUQgZnJvbSBoZWFkZXIgKi8KKwlDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOworCUNPUFlfTUFDX0FERFIocEJzc2lkLCBwRnJhbWUtPkhkci5BZGRyMyk7CiAKLSAgICBQdHIgPSBwRnJhbWUtPk9jdGV0OwotICAgIExlbmd0aCArPSBMRU5HVEhfODAyXzExOworCVB0ciA9IHBGcmFtZS0+T2N0ZXQ7CisJTGVuZ3RoICs9IExFTkdUSF84MDJfMTE7CiAKLSAgICAvLyBnZXQgdGltZXN0YW1wIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIE5kaXNNb3ZlTWVtb3J5KHBUaW1lc3RhbXAsIFB0ciwgVElNRVNUQU1QX0xFTik7CisJLyogZ2V0IHRpbWVzdGFtcCBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIgKi8KKwlOZGlzTW92ZU1lbW9yeShwVGltZXN0YW1wLCBQdHIsIFRJTUVTVEFNUF9MRU4pOwogCiAJcFRpbWVzdGFtcC0+dS5Mb3dQYXJ0ID0gY3B1MmxlMzIocFRpbWVzdGFtcC0+dS5Mb3dQYXJ0KTsKIAlwVGltZXN0YW1wLT51LkhpZ2hQYXJ0ID0gY3B1MmxlMzIocFRpbWVzdGFtcC0+dS5IaWdoUGFydCk7CiAKLSAgICBQdHIgKz0gVElNRVNUQU1QX0xFTjsKLSAgICBMZW5ndGggKz0gVElNRVNUQU1QX0xFTjsKKwlQdHIgKz0gVElNRVNUQU1QX0xFTjsKKwlMZW5ndGggKz0gVElNRVNUQU1QX0xFTjsKIAotICAgIC8vIGdldCBiZWFjb24gaW50ZXJ2YWwgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocEJlYWNvblBlcmlvZCwgUHRyLCAyKTsKLSAgICBQdHIgKz0gMjsKLSAgICBMZW5ndGggKz0gMjsKKwkvKiBnZXQgYmVhY29uIGludGVydmFsIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlciAqLworCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25QZXJpb2QsIFB0ciwgMik7CisJUHRyICs9IDI7CisJTGVuZ3RoICs9IDI7CiAKLSAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKLSAgICBQdHIgKz0gMjsKLSAgICBMZW5ndGggKz0gMjsKKwkvKiBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlciAqLworCU5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKKwlQdHIgKz0gMjsKKwlMZW5ndGggKz0gMjsKIAotICAgIGlmIChDQVBfSVNfRVNTX09OKCpwQ2FwYWJpbGl0eUluZm8pKQotICAgICAgICAqcEJzc1R5cGUgPSBCU1NfSU5GUkE7Ci0gICAgZWxzZQotICAgICAgICAqcEJzc1R5cGUgPSBCU1NfQURIT0M7CisJaWYgKENBUF9JU19FU1NfT04oKnBDYXBhYmlsaXR5SW5mbykpCisJCSpwQnNzVHlwZSA9IEJTU19JTkZSQTsKKwllbHNlCisJCSpwQnNzVHlwZSA9IEJTU19BREhPQzsKIAotICAgIHBFaWQgPSAoUEVJRF9TVFJVQ1QpIFB0cjsKKwlwRWlkID0gKHN0cnVjdCBydF9laWQgKikgUHRyOwogCi0gICAgLy8gZ2V0IHZhcmlhYmxlIGZpZWxkcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLSAgICB3aGlsZSAoKExlbmd0aCArIDIgKyBwRWlkLT5MZW4pIDw9IE1zZ0xlbikKLSAgICB7Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIFNlY3VyZSBjb3B5IFZJRSB0byBWYXJJRVtNQVhfVklFX0xFTl0gZGlkbid0IG92ZXJmbG93LgotICAgICAgICAvLwotICAgICAgICBpZiAoKCpMZW5ndGhWSUUgKyBwRWlkLT5MZW4gKyAyKSA+PSBNQVhfVklFX0xFTikKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSBWYXJpYWJsZSBJRXMgb3V0IG9mIHJlc291cmNlIFtsZW4oPSVkKSA+IE1BWF9WSUVfTEVOKD0lZCldXG4iLAotICAgICAgICAgICAgICAgICAgICAoKkxlbmd0aFZJRSArIHBFaWQtPkxlbiArIDIpLCBNQVhfVklFX0xFTikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKwkvKiBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlciAqLworCXdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKSB7CisJCS8qICovCisJCS8qIFNlY3VyZSBjb3B5IFZJRSB0byBWYXJJRVtNQVhfVklFX0xFTl0gZGlkbid0IG92ZXJmbG93LiAqLworCQkvKiAqLworCQlpZiAoKCpMZW5ndGhWSUUgKyBwRWlkLT5MZW4gKyAyKSA+PSBNQVhfVklFX0xFTikgeworCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwKKwkJCQkgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSBWYXJpYWJsZSBJRXMgb3V0IG9mIHJlc291cmNlIFtsZW4oPSVkKSA+IE1BWF9WSUVfTEVOKD0lZCldXG4iLAorCQkJCSAgKCpMZW5ndGhWSUUgKyBwRWlkLT5MZW4gKyAyKSwgTUFYX1ZJRV9MRU4pKTsKKwkJCWJyZWFrOworCQl9CiAKLSAgICAgICAgc3dpdGNoKHBFaWQtPkVpZCkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBJRV9TU0lEOgotICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgaGFzIG9uZSBTU0lEIEVJRCBpbiB0aGlzIGJlYWNvbiwgaWdub3JlIHRoZSBzZWNvbmQgb25lCi0gICAgICAgICAgICAgICAgaWYgKFNhbml0eSAmIDB4MSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1NJRCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOwotICAgICAgICAgICAgICAgICAgICAqcFNzaWRMZW4gPSBwRWlkLT5MZW47Ci0gICAgICAgICAgICAgICAgICAgIFNhbml0eSB8PSAweDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NTSUQgKGxlbj0lZClcbiIscEVpZC0+TGVuKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCXN3aXRjaCAocEVpZC0+RWlkKSB7CisJCWNhc2UgSUVfU1NJRDoKKwkJCS8qIEFscmVhZHkgaGFzIG9uZSBTU0lEIEVJRCBpbiB0aGlzIGJlYWNvbiwgaWdub3JlIHRoZSBzZWNvbmQgb25lICovCisJCQlpZiAoU2FuaXR5ICYgMHgxKQorCQkJCWJyZWFrOworCQkJaWYgKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NTSUQpIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShTc2lkLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKwkJCQkqcFNzaWRMZW4gPSBwRWlkLT5MZW47CisJCQkJU2FuaXR5IHw9IDB4MTsKKwkJCX0gZWxzZSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NTSUQgKGxlbj0lZClcbiIsCisJCQkJCSAgcEVpZC0+TGVuKSk7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJYnJlYWs7CiAKLSAgICAgICAgICAgIGNhc2UgSUVfU1VQUF9SQVRFUzoKLSAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTYW5pdHkgfD0gMHgyOwotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShTdXBSYXRlLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKLSAgICAgICAgICAgICAgICAgICAgKnBTdXBSYXRlTGVuID0gcEVpZC0+TGVuOworCQljYXNlIElFX1NVUFBfUkFURVM6CisJCQlpZiAocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSB7CisJCQkJU2FuaXR5IHw9IDB4MjsKKwkJCQlOZGlzTW92ZU1lbW9yeShTdXBSYXRlLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKwkJCQkqcFN1cFJhdGVMZW4gPSBwRWlkLT5MZW47CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogMjAwNC0wOS0xNCBub3QgYSBnb29kIGRlc2lnbiBoZXJlLCBjYXVzZSBpdCBleGNsdWRlIGV4dHJhIHJhdGVzCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyb20gU2NhblRhYi4gV2Ugc2hvdWxkIHJlcG9ydCBhcyBpcy4gQW5kIGZpbHRlciBvdXQgdW5zdXBwb3J0ZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gcmF0ZXMgaW4gTWxtZUF1eC4KLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgYWdhaW5zdCB0aGUgc3VwcG9ydGVkIHJhdGVzCi0gICAgICAgICAgICAgICAgICAgIC8vIFJUTVBDaGVja1JhdGVzKHBBZCwgU3VwUmF0ZSwgcFN1cFJhdGVMZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TVVBQX1JBVEVTIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCS8qIFRPRE86IDIwMDQtMDktMTQgbm90IGEgZ29vZCBkZXNpZ24gaGVyZSwgY2F1c2UgaXQgZXhjbHVkZSBleHRyYSByYXRlcyAqLworCQkJCS8qIGZyb20gU2NhblRhYi4gV2Ugc2hvdWxkIHJlcG9ydCBhcyBpcy4gQW5kIGZpbHRlciBvdXQgdW5zdXBwb3J0ZWQgKi8KKwkJCQkvKiByYXRlcyBpbiBNbG1lQXV4LiAqLworCQkJCS8qIENoZWNrIGFnYWluc3QgdGhlIHN1cHBvcnRlZCByYXRlcyAqLworCQkJCS8qIFJUTVBDaGVja1JhdGVzKHBBZCwgU3VwUmF0ZSwgcFN1cFJhdGVMZW4pOyAqLworCQkJfSBlbHNlIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfU1VQUF9SQVRFUyAobGVuPSVkKVxuIiwKKwkJCQkJICBwRWlkLT5MZW4pKTsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQlicmVhazsKIAotICAgICAgICAgICAgY2FzZSBJRV9IVF9DQVA6Ci0JCQlpZiAocEVpZC0+TGVuID49IFNJWkVfSFRfQ0FQX0lFKSAgLy9Ob3RlOiBhbGxvdyBleHRlbnNpb24uISEKKwkJY2FzZSBJRV9IVF9DQVA6CisJCQlpZiAocEVpZC0+TGVuID49IFNJWkVfSFRfQ0FQX0lFKQkvKk5vdGU6IGFsbG93IGV4dGVuc2lvbiEgKi8KIAkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBwRWlkLT5PY3RldCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLQkJCQkqcEh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOwkvLyBObm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KKwkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBwRWlkLT5PY3RldCwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSkpOworCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CS8qIE5ub3cgd2Ugb25seSBzdXBwb3J0IDI2IGJ5dGVzLiAqLwogCi0JCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSk7Ci0JCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7CisJCQkJKih1MTYgKikgKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pID0KKwkJCQkgICAgY3B1MmxlMTYoKih1MTYgKikKKwkJCQkJICAgICAoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykpOworCQkJCSoodTE2ICopICgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9CisJCQkJICAgIGNwdTJsZTE2KCoodTE2ICopCisJCQkJCSAgICAgKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKIAogCQkJCXsKLQkJCQkJKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsJLy8gTm5vdyB3ZSBvbmx5IHN1cHBvcnQgMjYgYnl0ZXMuCisJCQkJCSpwUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CS8qIE5ub3cgd2Ugb25seSBzdXBwb3J0IDI2IGJ5dGVzLiAqLwogCi0JCQkJCVB0ciA9IChQVUNIQVIpIHBWSUU7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOworCQkJCQlQdHIgPSAodTggKilwVklFOworCQkJCQlOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLAorCQkJCQkJICAgICAgICZwRWlkLT5FaWQsCisJCQkJCQkgICAgICAgcEVpZC0+TGVuICsgMik7CiAJCQkJCSpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOwogCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0hUX0NBUC4gcEVpZC0+TGVuID0gJWRcbiIsIHBFaWQtPkxlbikpOworCQkJfSBlbHNlIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLAorCQkJCQkgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9IVF9DQVAuIHBFaWQtPkxlbiA9ICVkXG4iLAorCQkJCQkgIHBFaWQtPkxlbikpOwogCQkJfQogCi0JCWJyZWFrOwotICAgICAgICAgICAgY2FzZSBJRV9BRERfSFQ6Ci0JCQlpZiAocEVpZC0+TGVuID49IHNpemVvZihBRERfSFRfSU5GT19JRSkpCi0JCQl7Ci0JCQkJLy8gVGhpcyBJRSBhbGxvd3MgZXh0ZW5zaW9uLCBidXQgd2UgY2FuIGlnbm9yZSBleHRyYSBieXRlcyBiZXlvbmQgb3VyIGtub3dsZWRnZSAsIHNvIG9ubHkKLQkJCQkvLyBjb3B5IGZpcnN0IHNpemVvZihBRERfSFRfSU5GT19JRSkKLQkJCQlOZGlzTW92ZU1lbW9yeShBZGRIdEluZm8sIHBFaWQtPk9jdGV0LCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKwkJCWJyZWFrOworCQljYXNlIElFX0FERF9IVDoKKwkJCWlmIChwRWlkLT5MZW4gPj0gc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkpIHsKKwkJCQkvKiBUaGlzIElFIGFsbG93cyBleHRlbnNpb24sIGJ1dCB3ZSBjYW4gaWdub3JlIGV4dHJhIGJ5dGVzIGJleW9uZCBvdXIga25vd2xlZGdlICwgc28gb25seSAqLworCQkJCS8qIGNvcHkgZmlyc3Qgc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkgKi8KKwkJCQlOZGlzTW92ZU1lbW9yeShBZGRIdEluZm8sIHBFaWQtPk9jdGV0LAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkpOwogCQkJCSpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOwogCiAJCQkJQ3RybENoYW5uZWwgPSBBZGRIdEluZm8tPkNvbnRyb2xDaGFuOwogCi0JCQkJKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMikgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8yKSk7Ci0JCQkJKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8zKSk7CisJCQkJKih1MTYgKikgKCZBZGRIdEluZm8tPkFkZEh0SW5mbzIpID0KKwkJCQkgICAgY3B1MmxlMTYoKih1MTYgKikKKwkJCQkJICAgICAoJkFkZEh0SW5mby0+QWRkSHRJbmZvMikpOworCQkJCSoodTE2ICopICgmQWRkSHRJbmZvLT5BZGRIdEluZm8zKSA9CisJCQkJICAgIGNwdTJsZTE2KCoodTE2ICopCisJCQkJCSAgICAgKCZBZGRIdEluZm8tPkFkZEh0SW5mbzMpKTsKIAogCQkJCXsKLQkJCSAgICAgICAgICAgICAgICBQdHIgPSAoUFVDSEFSKSBwVklFOwotCQkJICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOwotCQkJICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCQlQdHIgPSAodTggKilwVklFOworCQkJCQlOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLAorCQkJCQkJICAgICAgICZwRWlkLT5FaWQsCisJCQkJCQkgICAgICAgcEVpZC0+TGVuICsgMik7CisJCQkJCSpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOwogCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0FERF9IVC4gXG4iKSk7CisJCQl9IGVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkJCSAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0FERF9IVC4gXG4iKSk7CiAJCQl9CiAKLQkJYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElFX1NFQ09OREFSWV9DSF9PRkZTRVQ6Ci0JCQlpZiAocEVpZC0+TGVuID09IDEpCi0JCQl7CisJCQlicmVhazsKKwkJY2FzZSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUOgorCQkJaWYgKHBFaWQtPkxlbiA9PSAxKSB7CiAJCQkJKk5ld0V4dENoYW5uZWxPZmZzZXQgPSBwRWlkLT5PY3RldFswXTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NFQ09OREFSWV9DSF9PRkZTRVQuIFxuIikpOworCQkJfSBlbHNlIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLAorCQkJCQkgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VULiBcbiIpKTsKIAkJCX0KIAotCQlicmVhazsKLSAgICAgICAgICAgIGNhc2UgSUVfRkhfUEFSTToKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoSUVfRkhfUEFSTSkgXG4iKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCQlicmVhazsKKwkJY2FzZSBJRV9GSF9QQVJNOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KElFX0ZIX1BBUk0pIFxuIikpOworCQkJYnJlYWs7CiAKLSAgICAgICAgICAgIGNhc2UgSUVfRFNfUEFSTToKLSAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpwQ2hhbm5lbCA9ICpwRWlkLT5PY3RldDsKKwkJY2FzZSBJRV9EU19QQVJNOgorCQkJaWYgKHBFaWQtPkxlbiA9PSAxKSB7CisJCQkJKnBDaGFubmVsID0gKnBFaWQtPk9jdGV0OwogCi0JCQkJCXsKLQkJCQkJCWlmIChDaGFubmVsU2FuaXR5KHBBZCwgKnBDaGFubmVsKSA9PSAwKQotCQkJCQkJeworCQkJCXsKKwkJCQkJaWYgKENoYW5uZWxTYW5pdHkocEFkLCAqcENoYW5uZWwpID09IDApIHsKIAotCQkJCQkJCXJldHVybiBGQUxTRTsKLQkJCQkJCX0KKwkJCQkJCXJldHVybiBGQUxTRTsKIAkJCQkJfQorCQkJCX0KIAotICAgICAgICAgICAgICAgICAgICBTYW5pdHkgfD0gMHg0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9EU19QQVJNIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCVNhbml0eSB8PSAweDQ7CisJCQl9IGVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9EU19QQVJNIChsZW49JWQpXG4iLAorCQkJCQkgIHBFaWQtPkxlbikpOworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIElFX0NGX1BBUk06Ci0gICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuID09IDYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5iVmFsaWQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBDb3VudCA9IHBFaWQtPk9jdGV0WzBdOwotICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBQZXJpb2QgPSBwRWlkLT5PY3RldFsxXTsKLSAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwTWF4RHVyYXRpb24gPSBwRWlkLT5PY3RldFsyXSArIDI1NiAqIHBFaWQtPk9jdGV0WzNdOwotICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBEdXJSZW1haW5pbmcgPSBwRWlkLT5PY3RldFs0XSArIDI1NiAqIHBFaWQtPk9jdGV0WzVdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9DRl9QQVJNXG4iKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgSUVfQ0ZfUEFSTToKKwkJCWlmIChwRWlkLT5MZW4gPT0gNikgeworCQkJCXBDZlBhcm0tPmJWYWxpZCA9IFRSVUU7CisJCQkJcENmUGFybS0+Q2ZwQ291bnQgPSBwRWlkLT5PY3RldFswXTsKKwkJCQlwQ2ZQYXJtLT5DZnBQZXJpb2QgPSBwRWlkLT5PY3RldFsxXTsKKwkJCQlwQ2ZQYXJtLT5DZnBNYXhEdXJhdGlvbiA9CisJCQkJICAgIHBFaWQtPk9jdGV0WzJdICsgMjU2ICogcEVpZC0+T2N0ZXRbM107CisJCQkJcENmUGFybS0+Q2ZwRHVyUmVtYWluaW5nID0KKwkJCQkgICAgcEVpZC0+T2N0ZXRbNF0gKyAyNTYgKiBwRWlkLT5PY3RldFs1XTsKKwkJCX0gZWxzZSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0NGX1BBUk1cbiIpKTsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQlicmVhazsKIAotICAgICAgICAgICAgY2FzZSBJRV9JQlNTX1BBUk06Ci0gICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuID09IDIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQXRpbVdpbiwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0lCU1NfUEFSTVxuIikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOworCQljYXNlIElFX0lCU1NfUEFSTToKKwkJCWlmIChwRWlkLT5MZW4gPT0gMikgeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBdGltV2luLCBwRWlkLT5PY3RldCwKKwkJCQkJICAgICAgIHBFaWQtPkxlbik7CisJCQl9IGVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9JQlNTX1BBUk1cbiIpKTsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQlicmVhazsKIAotICAgICAgICAgICAgY2FzZSBJRV9USU06Ci0gICAgICAgICAgICAgICAgaWYoSU5GUkFfT04ocEFkKSAmJiBTdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgR2V0VGltQml0KChQVUNIQVIpcEVpZCwgcEFkLT5TdGFBY3RpdmUuQWlkLCAmVGltTGVuLCBwQmNhc3RGbGFnLCBwRHRpbUNvdW50LCBwRHRpbVBlcmlvZCwgcE1lc3NhZ2VUb01lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgSUVfVElNOgorCQkJaWYgKElORlJBX09OKHBBZCkgJiYgU3ViVHlwZSA9PSBTVUJUWVBFX0JFQUNPTikgeworCQkJCUdldFRpbUJpdCgoY2hhciAqKXBFaWQsIHBBZC0+U3RhQWN0aXZlLkFpZCwKKwkJCQkJICAmVGltTGVuLCBwQmNhc3RGbGFnLCBwRHRpbUNvdW50LAorCQkJCQkgIHBEdGltUGVyaW9kLCBwTWVzc2FnZVRvTWUpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UOgorCQkJaWYgKHBFaWQtPkxlbiA9PSAzKSB7CisJCQkJKnBOZXdDaGFubmVsID0gcEVpZC0+T2N0ZXRbMV07CS8qZXh0cmFjdCBuZXcgY2hhbm5lbCBudW1iZXIgKi8KKwkJCX0KKwkJCWJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVDoKLSAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gMykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgCSpwTmV3Q2hhbm5lbCA9IHBFaWQtPk9jdGV0WzFdOwkvL2V4dHJhY3QgbmV3IGNoYW5uZWwgbnVtYmVyCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJLyogTmV3IGZvciBXUEEgKi8KKwkJCS8qIENDWCB2MiBoYXMgdGhlIHNhbWUgSUUsIHdlIG5lZWQgdG8gcGFyc2UgdGhhdCB0b28gKi8KKwkJCS8qIFdpZmkgV01NIHVzZSB0aGUgc2FtZSBJRSB2YWxlLCBuZWVkIHRvIHBhcnNlIHRoYXQgdG9vICovCisJCQkvKiBjYXNlIElFX1dQQTogKi8KKwkJY2FzZSBJRV9WRU5ET1JfU1BFQ0lGSUM6CisJCQkvKiBDaGVjayBCcm9hZGNvbS9BdGhlcm9zIDgwMi4xMW4gT1VJIHZlcnNpb24sIGZvciBIVCBDYXBhYmlsaXR5IElFLiAqLworCQkJLyogVGhpcyBIVCBJRSBpcyBiZWZvcmUgSUVFRSBkcmFmdCBzZXQgSFQgSUUgdmFsdWUuMjAwNi0wOS0yOCBieSBKYW4uICovCisJCQkvKmlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIEJST0FEQ09NX09VSSwgMykgJiYgKHBFaWQtPkxlbiA+PSA0KSkKKwkJCSAgIHsKKwkJCSAgIGlmICgocEVpZC0+T2N0ZXRbM10gPT0gT1VJX0JST0FEQ09NX0hUKSAmJiAocEVpZC0+TGVuID49IDMwKSkKKwkJCSAgIHsKKwkJCSAgIHsKKwkJCSAgIE5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksICZwRWlkLT5PY3RldFs0XSwgc2l6ZW9mKHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llKSk7CisJCQkgICAqcEh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOyAgLy8gTm5vdyB3ZSBvbmx5IHN1cHBvcnQgMjYgYnl0ZXMuCisJCQkgICB9CisJCQkgICB9CisJCQkgICBpZiAoKHBFaWQtPk9jdGV0WzNdID09IE9VSV9CUk9BRENPTV9IVCkgJiYgKHBFaWQtPkxlbiA+PSAyNikpCisJCQkgICB7CisJCQkgICB7CisJCQkgICBOZGlzTW92ZU1lbW9yeShBZGRIdEluZm8sICZwRWlkLT5PY3RldFs0XSwgc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkpOworCQkJICAgKkFkZEh0SW5mb0xlbiA9IFNJWkVfQUREX0hUX0lORk9fSUU7IC8vIE5ub3cgd2Ugb25seSBzdXBwb3J0IDI2IGJ5dGVzLgorCQkJICAgfQorCQkJICAgfQorCQkJICAgfQorCQkJICovCisJCQkvKiBDaGVjayB0aGUgT1VJIHZlcnNpb24sIGZpbHRlciBvdXQgbm9uLXN0YW5kYXJkIHVzYWdlICovCisJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBSQUxJTktfT1VJLCAzKQorCQkJICAgICYmIChwRWlkLT5MZW4gPT0gNykpIHsKKwkJCQkvKipwUmFsaW5rSWUgPSBwRWlkLT5PY3RldFszXTsgKi8KKwkJCQlpZiAocEVpZC0+T2N0ZXRbM10gIT0gMCkKKwkJCQkJKnBSYWxpbmtJZSA9IHBFaWQtPk9jdGV0WzNdOworCQkJCWVsc2UKKwkJCQkJKnBSYWxpbmtJZSA9IDB4ZjAwMDAwMDA7CS8qIFNldCB0byBub24temVybyB2YWx1ZSAoY2FuJ3Qgc2V0IGJpdDAtMikgdG8gcmVwcmVzZW50IHRoaXMgaXMgUmFsaW5rIENoaXAuIFNvIGF0IGxpbmt1cCwgd2Ugd2lsbCBzZXQgcmFsaW5rY2hpcCBmbGFnLiAqLworCQkJfQorCQkJLyogVGhpcyBIVCBJRSBpcyBiZWZvcmUgSUVFRSBkcmFmdCBzZXQgSFQgSUUgdmFsdWUuMjAwNi0wOS0yOCBieSBKYW4uICovCiAKLSAgICAgICAgICAgIC8vIE5ldyBmb3IgV1BBCi0gICAgICAgICAgICAvLyBDQ1ggdjIgaGFzIHRoZSBzYW1lIElFLCB3ZSBuZWVkIHRvIHBhcnNlIHRoYXQgdG9vCi0gICAgICAgICAgICAvLyBXaWZpIFdNTSB1c2UgdGhlIHNhbWUgSUUgdmFsZSwgbmVlZCB0byBwYXJzZSB0aGF0IHRvbwotICAgICAgICAgICAgLy8gY2FzZSBJRV9XUEE6Ci0gICAgICAgICAgICBjYXNlIElFX1ZFTkRPUl9TUEVDSUZJQzoKLSAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgT1VJIHZlcnNpb24sIGZpbHRlciBvdXQgbm9uLXN0YW5kYXJkIHVzYWdlCi0gICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgUkFMSU5LX09VSSwgMykgJiYgKHBFaWQtPkxlbiA9PSA3KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vKnBSYWxpbmtJZSA9IHBFaWQtPk9jdGV0WzNdOwotICAgICAgICAgICAgICAgICAgICBpZiAocEVpZC0+T2N0ZXRbM10gIT0gMCkKLSAgICAgICAgCQkJCSpwUmFsaW5rSWUgPSBwRWlkLT5PY3RldFszXTsKLSAgICAgICAgCQkJZWxzZQotICAgICAgICAJCQkJKnBSYWxpbmtJZSA9IDB4ZjAwMDAwMDA7IC8vIFNldCB0byBub24temVybyB2YWx1ZSAoY2FuJ3Qgc2V0IGJpdDAtMikgdG8gcmVwcmVzZW50IHRoaXMgaXMgUmFsaW5rIENoaXAuIFNvIGF0IGxpbmt1cCwgd2Ugd2lsbCBzZXQgcmFsaW5rY2hpcCBmbGFnLgotICAgICAgICAgICAgICAgIH0KLQkJLy8gVGhpcyBIVCBJRSBpcyBiZWZvcmUgSUVFRSBkcmFmdCBzZXQgSFQgSUUgdmFsdWUuMjAwNi0wOS0yOCBieSBKYW4uCisJCQkvKiBPdGhlciB2ZW5kb3JzIGhhZCBwcm9kdWN0aW9uIGJlZm9yZSBJRV9IVF9DQVAgdmFsdWUgaXMgYXNzaWduZWQuIFRvIGJhY2t3YXJkIHN1cHBvcnQgdGhvc2Ugb2xkLWZpcm13YXJlIEFQLCAqLworCQkJLyogQ2hlY2sgYnJvYWRjb20tZGVmaWVuZCBwcmUtODAyLjExbkQxLjAgT1VJIGZvciBIVCByZWxhdGVkIElFLCBpbmNsdWRpbmcgSFQgQ2FwYXRpbGl0aWVzIElFIGFuZCBIVCBJbmZvcm1hdGlvbiBJRSAqLworCQkJZWxzZSBpZiAoKCpwSHRDYXBhYmlsaXR5TGVuID09IDApCisJCQkJICYmIE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgUFJFX05fSFRfT1VJLAorCQkJCQkJICAgIDMpICYmIChwRWlkLT5MZW4gPj0gNCkKKwkJCQkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKSB7CisJCQkJaWYgKChwRWlkLT5PY3RldFszXSA9PSBPVUlfUFJFTl9IVF9DQVApCisJCQkJICAgICYmIChwRWlkLT5MZW4gPj0gMzApCisJCQkJICAgICYmICgqcEh0Q2FwYWJpbGl0eUxlbiA9PSAwKSkgeworCQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LAorCQkJCQkJICAgICAgICZwRWlkLT5PY3RldFs0XSwKKwkJCQkJCSAgICAgICBzaXplb2YKKwkJCQkJCSAgICAgICAoc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUpKTsKKwkJCQkJKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CisJCQkJfQogCi0gICAgICAgICAgICAgICAgLy8gT3RoZXIgdmVuZG9ycyBoYWQgcHJvZHVjdGlvbiBiZWZvcmUgSUVfSFRfQ0FQIHZhbHVlIGlzIGFzc2lnbmVkLiBUbyBiYWNrd2FyZCBzdXBwb3J0IHRob3NlIG9sZC1maXJtd2FyZSBBUCwKLSAgICAgICAgICAgICAgICAvLyBDaGVjayBicm9hZGNvbS1kZWZpZW5kIHByZS04MDIuMTFuRDEuMCBPVUkgZm9yIEhUIHJlbGF0ZWQgSUUsIGluY2x1ZGluZyBIVCBDYXBhdGlsaXRpZXMgSUUgYW5kIEhUIEluZm9ybWF0aW9uIElFCi0gICAgICAgICAgICAgICAgZWxzZSBpZiAoKCpwSHRDYXBhYmlsaXR5TGVuID09IDApICYmIE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgUFJFX05fSFRfT1VJLCAzKSAmJiAocEVpZC0+TGVuID49IDQpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgocEVpZC0+T2N0ZXRbM10gPT0gT1VJX1BSRU5fSFRfQ0FQKSAmJiAocEVpZC0+TGVuID49IDMwKSAmJiAoKnBIdENhcGFiaWxpdHlMZW4gPT0gMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksICZwRWlkLT5PY3RldFs0XSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOwotICAgICAgICAgICAgICAgICAgICB9CisJCQkJaWYgKChwRWlkLT5PY3RldFszXSA9PSBPVUlfUFJFTl9BRERfSFQpCisJCQkJICAgICYmIChwRWlkLT5MZW4gPj0gMjYpKSB7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywKKwkJCQkJCSAgICAgICAmcEVpZC0+T2N0ZXRbNF0sCisJCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkpOworCQkJCQkqQWRkSHRJbmZvTGVuID0gU0laRV9BRERfSFRfSU5GT19JRTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpIHsKKwkJCQkvKiBDb3B5IHRvIHBWSUUgd2hpY2ggd2lsbCByZXBvcnQgdG8gbWljcm9zb2Z0IGJzc2lkIGxpc3QuICovCisJCQkJUHRyID0gKHU4ICopcFZJRTsKKwkJCQlOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLAorCQkJCQkgICAgICAgcEVpZC0+TGVuICsgMik7CisJCQkJKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7CisJCQl9IGVsc2UKKwkJCSAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfUEFSTV9FTEVNLCA2KQorCQkJCSYmIChwRWlkLT5MZW4gPT0gMjQpKSB7CisJCQkJdTggKnB0cjsKKwkJCQlpbnQgaTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoKHBFaWQtPk9jdGV0WzNdID09IE9VSV9QUkVOX0FERF9IVCkgJiYgKHBFaWQtPkxlbiA+PSAyNikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRvIHBWSUUgd2hpY2ggd2lsbCByZXBvcnQgdG8gbWljcm9zb2Z0IGJzc2lkIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgIFB0ciA9IChQVUNIQVIpIHBWSUU7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOwotICAgICAgICAgICAgICAgICAgICAqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfUEFSTV9FTEVNLCA2KSAmJiAocEVpZC0+TGVuID09IDI0KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBVQ0hBUiBwdHI7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpOworCQkJCS8qIHBhcnNpbmcgRURDQSBwYXJhbWV0ZXJzICovCisJCQkJcEVkY2FQYXJtLT5iVmFsaWQgPSBUUlVFOworCQkJCXBFZGNhUGFybS0+YlFBY2sgPSBGQUxTRTsJLyogcEVpZC0+T2N0ZXRbMF0gJiAweDEwOyAqLworCQkJCXBFZGNhUGFybS0+YlF1ZXVlUmVxdWVzdCA9IEZBTFNFOwkvKiBwRWlkLT5PY3RldFswXSAmIDB4MjA7ICovCisJCQkJcEVkY2FQYXJtLT5iVHhvcFJlcXVlc3QgPSBGQUxTRTsJLyogcEVpZC0+T2N0ZXRbMF0gJiAweDQwOyAqLworCQkJCXBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50ID0KKwkJCQkgICAgcEVpZC0+T2N0ZXRbNl0gJiAweDBmOworCQkJCXBFZGNhUGFybS0+YkFQU0RDYXBhYmxlID0KKwkJCQkgICAgKHBFaWQtPk9jdGV0WzZdICYgMHg4MCkgPyAxIDogMDsKKwkJCQlwdHIgPSAmcEVpZC0+T2N0ZXRbOF07CisJCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJCQl1OCBhY2kgPSAoKnB0ciAmIDB4NjApID4+IDU7CS8qIGI1fjYgaXMgQUMgSU5ERVggKi8KKwkJCQkJcEVkY2FQYXJtLT5iQUNNW2FjaV0gPSAoKCgqcHRyKSAmIDB4MTApID09IDB4MTApOwkvKiBiNSBpcyBBQ00gKi8KKwkJCQkJcEVkY2FQYXJtLT5BaWZzblthY2ldID0gKCpwdHIpICYgMHgwZjsJLyogYjB+MyBpcyBBSUZTTiAqLworCQkJCQlwRWRjYVBhcm0tPkN3bWluW2FjaV0gPSAqKHB0ciArIDEpICYgMHgwZjsJLyogYjB+NCBpcyBDd21pbiAqLworCQkJCQlwRWRjYVBhcm0tPkN3bWF4W2FjaV0gPSAqKHB0ciArIDEpID4+IDQ7CS8qIGI1fjggaXMgQ3dtYXggKi8KKwkJCQkJcEVkY2FQYXJtLT5UeG9wW2FjaV0gPSAqKHB0ciArIDIpICsgMjU2ICogKCoocHRyICsgMykpOwkvKiBpbiB1bml0IG9mIDMyLXVzICovCisJCQkJCXB0ciArPSA0OwkvKiBwb2ludCB0byBuZXh0IEFDICovCisJCQkJfQorCQkJfSBlbHNlCisJCQkgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV01FX0lORk9fRUxFTSwgNikKKwkJCQkmJiAocEVpZC0+TGVuID09IDcpKSB7CisJCQkJLyogcGFyc2luZyBFRENBIHBhcmFtZXRlcnMgKi8KKwkJCQlwRWRjYVBhcm0tPmJWYWxpZCA9IFRSVUU7CisJCQkJcEVkY2FQYXJtLT5iUUFjayA9IEZBTFNFOwkvKiBwRWlkLT5PY3RldFswXSAmIDB4MTA7ICovCisJCQkJcEVkY2FQYXJtLT5iUXVldWVSZXF1ZXN0ID0gRkFMU0U7CS8qIHBFaWQtPk9jdGV0WzBdICYgMHgyMDsgKi8KKwkJCQlwRWRjYVBhcm0tPmJUeG9wUmVxdWVzdCA9IEZBTFNFOwkvKiBwRWlkLT5PY3RldFswXSAmIDB4NDA7ICovCisJCQkJcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQgPQorCQkJCSAgICBwRWlkLT5PY3RldFs2XSAmIDB4MGY7CisJCQkJcEVkY2FQYXJtLT5iQVBTRENhcGFibGUgPQorCQkJCSAgICAocEVpZC0+T2N0ZXRbNl0gJiAweDgwKSA/IDEgOiAwOwogCi0gICAgICAgICAgICAgICAgICAgIC8vIHBhcnNpbmcgRURDQSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlZhbGlkICAgICAgICAgID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUUFjayAgICAgICAgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDEwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRdWV1ZVJlcXVlc3QgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MjA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlR4b3BSZXF1ZXN0ICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg0MDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQgPSBwRWlkLT5PY3RldFs2XSAmIDB4MGY7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFQU0RDYXBhYmxlICAgID0gKHBFaWQtPk9jdGV0WzZdICYgMHg4MCkgPyAxIDogMDsKLSAgICAgICAgICAgICAgICAgICAgcHRyID0gJnBFaWQtPk9jdGV0WzhdOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFjaSA9ICgqcHRyICYgMHg2MCkgPj4gNTsgLy8gYjV+NiBpcyBBQyBJTkRFWAotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW2FjaV0gID0gKCgoKnB0cikgJiAweDEwKSA9PSAweDEwKTsgICAvLyBiNSBpcyBBQ00KLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bYWNpXSA9ICgqcHRyKSAmIDB4MGY7ICAgICAgICAgICAgICAgLy8gYjB+MyBpcyBBSUZTTgotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pblthY2ldID0gKihwdHIrMSkgJiAweDBmOyAgICAgICAgICAgICAvLyBiMH40IGlzIEN3bWluCi0gICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W2FjaV0gPSAqKHB0cisxKSA+PiA0OyAgICAgICAgICAgICAgIC8vIGI1fjggaXMgQ3dtYXgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFthY2ldICA9ICoocHRyKzIpICsgMjU2ICogKCoocHRyKzMpKTsgLy8gaW4gdW5pdCBvZiAzMi11cwotICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IDQ7IC8vIHBvaW50IHRvIG5leHQgQUMKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdNRV9JTkZPX0VMRU0sIDYpICYmIChwRWlkLT5MZW4gPT0gNykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBwYXJzaW5nIEVEQ0EgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJWYWxpZCAgICAgICAgICA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlFBY2sgICAgICAgICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgxMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUXVldWVSZXF1ZXN0ICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDIwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJUeG9wUmVxdWVzdCAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4NDA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50ID0gcEVpZC0+T2N0ZXRbNl0gJiAweDBmOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBUFNEQ2FwYWJsZSAgICA9IChwRWlkLT5PY3RldFs2XSAmIDB4ODApID8gMSA6IDA7CisJCQkJLyogdXNlIGRlZmF1bHQgRURDQSBwYXJhbWV0ZXIgKi8KKwkJCQlwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX0JFXSA9IDA7CisJCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdID0gMzsKKwkJCQlwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV0gPSBDV19NSU5fSU5fQklUUzsKKwkJCQlwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CRV0gPSBDV19NQVhfSU5fQklUUzsKKwkJCQlwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JFXSA9IDA7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGRlZmF1bHQgRURDQSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19CRV0gID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdID0gMzsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQkVdID0gQ1dfTUlOX0lOX0JJVFM7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JFXSA9IENXX01BWF9JTl9CSVRTOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JFXSAgPSAwOworCQkJCXBFZGNhUGFybS0+YkFDTVtRSURfQUNfQktdID0gMDsKKwkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS10gPSA3OworCQkJCXBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXSA9IENXX01JTl9JTl9CSVRTOworCQkJCXBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JLXSA9IENXX01BWF9JTl9CSVRTOworCQkJCXBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdID0gMDsKIAotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX0JLXSAgPSAwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS10gPSA3OwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CS10gPSBDV19NSU5fSU5fQklUUzsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQktdID0gQ1dfTUFYX0lOX0JJVFM7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdICA9IDA7CisJCQkJcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19WSV0gPSAwOworCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9IDI7CisJCQkJcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldID0KKwkJCQkgICAgQ1dfTUlOX0lOX0JJVFMgLSAxOworCQkJCXBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXSA9IENXX01BWF9JTl9CSVRTOworCQkJCXBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldID0gOTY7CS8qIEFDX1ZJOiA5NiozMnVzIH49IDNtcyAqLwogCi0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVtRSURfQUNfVkldICA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZJXSA9IENXX01JTl9JTl9CSVRTLTE7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXSA9IENXX01BWF9JTl9CSVRTOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXSAgPSA5NjsgICAvLyBBQ19WSTogOTYqMzJ1cyB+PSAzbXMKKwkJCQlwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX1ZPXSA9IDA7CisJCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dID0gMjsKKwkJCQlwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WT10gPQorCQkJCSAgICBDV19NSU5fSU5fQklUUyAtIDI7CisJCQkJcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dID0KKwkJCQkgICAgQ1dfTUFYX0lOX0JJVFMgLSAxOworCQkJCXBFZGNhUGFybS0+VHhvcFtRSURfQUNfVk9dID0gNDg7CS8qIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zICovCisJCQl9CiAKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19WT10gID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dID0gMjsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dID0gQ1dfTUlOX0lOX0JJVFMtMjsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dID0gQ1dfTUFYX0lOX0JJVFMtMTsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WT10gID0gNDg7ICAgLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCQlicmVhazsKIAotICAgICAgICAgICAgY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKLSAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoRXh0UmF0ZSwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7Ci0gICAgICAgICAgICAgICAgICAgICpwRXh0UmF0ZUxlbiA9IHBFaWQtPkxlbjsKKwkJY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKKwkJCWlmIChwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShFeHRSYXRlLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKwkJCQkqcEV4dFJhdGVMZW4gPSBwRWlkLT5MZW47CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogMjAwNC0wOS0xNCBub3QgYSBnb29kIGRlc2lnbiBoZXJlLCBjYXVzZSBpdCBleGNsdWRlIGV4dHJhIHJhdGVzCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyb20gU2NhblRhYi4gV2Ugc2hvdWxkIHJlcG9ydCBhcyBpcy4gQW5kIGZpbHRlciBvdXQgdW5zdXBwb3J0ZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gcmF0ZXMgaW4gTWxtZUF1eC4KLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgYWdhaW5zdCB0aGUgc3VwcG9ydGVkIHJhdGVzCi0gICAgICAgICAgICAgICAgICAgIC8vIFJUTVBDaGVja1JhdGVzKHBBZCwgRXh0UmF0ZSwgcEV4dFJhdGVMZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKKwkJCQkvKiBUT0RPOiAyMDA0LTA5LTE0IG5vdCBhIGdvb2QgZGVzaWduIGhlcmUsIGNhdXNlIGl0IGV4Y2x1ZGUgZXh0cmEgcmF0ZXMgKi8KKwkJCQkvKiBmcm9tIFNjYW5UYWIuIFdlIHNob3VsZCByZXBvcnQgYXMgaXMuIEFuZCBmaWx0ZXIgb3V0IHVuc3VwcG9ydGVkICovCisJCQkJLyogcmF0ZXMgaW4gTWxtZUF1eC4gKi8KKwkJCQkvKiBDaGVjayBhZ2FpbnN0IHRoZSBzdXBwb3J0ZWQgcmF0ZXMgKi8KKwkJCQkvKiBSVE1QQ2hlY2tSYXRlcyhwQWQsIEV4dFJhdGUsIHBFeHRSYXRlTGVuKTsgKi8KKwkJCX0KKwkJCWJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIElFX0VSUDoKLSAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuID09IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqcEVycCA9IChVQ0hBUilwRWlkLT5PY3RldFswXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgSUVfRVJQOgorCQkJaWYgKHBFaWQtPkxlbiA9PSAxKSB7CisJCQkJKnBFcnAgPSAodTgpcEVpZC0+T2N0ZXRbMF07CisJCQl9CisJCQlicmVhazsKIAotICAgICAgICAgICAgY2FzZSBJRV9BSVJPTkVUX0NLSVA6Ci0gICAgICAgICAgICAgICAgLy8gMC4gQ2hlY2sgQWlyb25ldCBJRSBsZW5ndGgsIGl0IG11c3QgYmUgbGFyZ2VyIG9yIGVxdWFsIHRvIDI4Ci0gICAgICAgICAgICAgICAgLy8gQ2lzY28gQVAzNTAgdXNlZCBsZW5ndGggYXMgMjgKLSAgICAgICAgICAgICAgICAvLyBDaXNjbyBBUDEyWFggdXNlZCBsZW5ndGggYXMgMzAKLSAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDwgKENLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMikpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQljYXNlIElFX0FJUk9ORVRfQ0tJUDoKKwkJCS8qIDAuIENoZWNrIEFpcm9uZXQgSUUgbGVuZ3RoLCBpdCBtdXN0IGJlIGxhcmdlciBvciBlcXVhbCB0byAyOCAqLworCQkJLyogQ2lzY28gQVAzNTAgdXNlZCBsZW5ndGggYXMgMjggKi8KKwkJCS8qIENpc2NvIEFQMTJYWCB1c2VkIGxlbmd0aCBhcyAzMCAqLworCQkJaWYgKHBFaWQtPkxlbiA8IChDS0lQX05FR09USUFUSU9OX0xFTkdUSCAtIDIpKQorCQkJCWJyZWFrOwogCi0gICAgICAgICAgICAgICAgLy8gMS4gQ29weSBDS0lQIGZsYWcgYnl0ZSB0byBidWZmZXIgZm9yIHByb2Nlc3MKLSAgICAgICAgICAgICAgICAqcENraXBGbGFnID0gKihwRWlkLT5PY3RldCArIDgpOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJLyogMS4gQ29weSBDS0lQIGZsYWcgYnl0ZSB0byBidWZmZXIgZm9yIHByb2Nlc3MgKi8KKwkJCSpwQ2tpcEZsYWcgPSAqKHBFaWQtPk9jdGV0ICsgOCk7CisJCQlicmVhazsKIAotICAgICAgICAgICAgY2FzZSBJRV9BUF9UWF9QT1dFUjoKLSAgICAgICAgICAgICAgICAvLyBBUCBDb250cm9sIG9mIENsaWVudCBUcmFuc21pdCBQb3dlcgotICAgICAgICAgICAgICAgIC8vMC4gQ2hlY2sgQWlyb25ldCBJRSBsZW5ndGgsIGl0IG11c3QgYmUgNgotICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gIT0gMHgwNikKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgSUVfQVBfVFhfUE9XRVI6CisJCQkvKiBBUCBDb250cm9sIG9mIENsaWVudCBUcmFuc21pdCBQb3dlciAqLworCQkJLyowLiBDaGVjayBBaXJvbmV0IElFIGxlbmd0aCwgaXQgbXVzdCBiZSA2ICovCisJCQlpZiAocEVpZC0+TGVuICE9IDB4MDYpCisJCQkJYnJlYWs7CiAKLSAgICAgICAgICAgICAgICAvLyBHZXQgY2VsbCBwb3dlciBsaW1pdCBpbiBkQm0KLSAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBDSVNDT19PVUksIDMpID09IDEpCi0gICAgICAgICAgICAgICAgICAgICpwQWlyb25ldENlbGxQb3dlckxpbWl0ID0gKihwRWlkLT5PY3RldCArIDQpOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJLyogR2V0IGNlbGwgcG93ZXIgbGltaXQgaW4gZEJtICovCisJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBDSVNDT19PVUksIDMpID09IDEpCisJCQkJKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPSAqKHBFaWQtPk9jdGV0ICsgNCk7CisJCQlicmVhazsKIAotICAgICAgICAgICAgLy8gV1BBMiAmIDgwMi4xMWkgUlNOCi0gICAgICAgICAgICBjYXNlIElFX1JTTjoKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBPVUkgZm9yIHZlcnNpb24gYW55bW9yZSwgY2hlY2sgdGhlIGdyb3VwIGNpcGhlciBPVUkgYmVmb3JlIGNvcHlpbmcKLSAgICAgICAgICAgICAgICBpZiAoUlRNUEVxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRvIHBWSUUgd2hpY2ggd2lsbCByZXBvcnQgdG8gbWljcm9zb2Z0IGJzc2lkIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgIFB0ciA9IChQVUNIQVIpIHBWSUU7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOwotICAgICAgICAgICAgICAgICAgICAqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCQkvKiBXUEEyICYgODAyLjExaSBSU04gKi8KKwkJY2FzZSBJRV9SU046CisJCQkvKiBUaGVyZSBpcyBubyBPVUkgZm9yIHZlcnNpb24gYW55bW9yZSwgY2hlY2sgdGhlIGdyb3VwIGNpcGhlciBPVUkgYmVmb3JlIGNvcHlpbmcgKi8KKwkJCWlmIChSVE1QRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkgeworCQkJCS8qIENvcHkgdG8gcFZJRSB3aGljaCB3aWxsIHJlcG9ydCB0byBtaWNyb3NvZnQgYnNzaWQgbGlzdC4gKi8KKwkJCQlQdHIgPSAodTggKilwVklFOworCQkJCU5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsCisJCQkJCSAgICAgICBwRWlkLT5MZW4gKyAyKTsKKwkJCQkqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCX0KKwkJCWJyZWFrOwogCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQogCi0gICAgICAgIExlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47ICAvLyBFaWRbMV0gKyBMZW5bMV0rIGNvbnRlbnRbTGVuXQotICAgICAgICBwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKLSAgICB9CisJCUxlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47CS8qIEVpZFsxXSArIExlblsxXSsgY29udGVudFtMZW5dICovCisJCXBFaWQgPSAoc3RydWN0IHJ0X2VpZCAqKSAoKHU4ICopIHBFaWQgKyAyICsgcEVpZC0+TGVuKTsKKwl9CiAKLSAgICAvLyBGb3Igc29tZSAxMWEgQVAuIGl0IGRpZCBub3QgaGF2ZSB0aGUgY2hhbm5lbCBFSUQsIHBhdGNoIGhlcmUKKwkvKiBGb3Igc29tZSAxMWEgQVAuIGl0IGRpZCBub3QgaGF2ZSB0aGUgY2hhbm5lbCBFSUQsIHBhdGNoIGhlcmUgKi8KIAl7Ci0JCVVDSEFSIExhdGNoUmZDaGFubmVsID0gTXNnQ2hhbm5lbDsKLQkJaWYgKChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkgJiYgKChTYW5pdHkgJiAweDQpID09IDApKQotCQl7CisJCXU4IExhdGNoUmZDaGFubmVsID0gTXNnQ2hhbm5lbDsKKwkJaWYgKChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkgJiYgKChTYW5pdHkgJiAweDQpID09IDApKSB7CiAJCQlpZiAoQ3RybENoYW5uZWwgIT0gMCkKIAkJCQkqcENoYW5uZWwgPSBDdHJsQ2hhbm5lbDsKIAkJCWVsc2UKQEAgLTcxNiwxMyArNzExLDEyIEBACiAJCX0KIAl9CiAKLQlpZiAoU2FuaXR5ICE9IDB4NykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gbWlzc2luZyBmaWVsZCwgU2FuaXR5PTB4JTAyeFxuIiwgU2FuaXR5KSk7CisJaWYgKFNhbml0eSAhPSAweDcpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfTE9VRCwKKwkJCSAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIG1pc3NpbmcgZmllbGQsIFNhbml0eT0weCUwMnhcbiIsCisJCQkgIFNhbml0eSkpOwogCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJcmV0dXJuIFRSVUU7CiAJfQogCkBAIC03MzYsNTEgKzczMCw0MiBAQAogICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotQk9PTEVBTiBNbG1lU2NhblJlcVNhbml0eSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBWT0lEICpNc2csCi0JSU4gVUxPTkcgTXNnTGVuLAotCU9VVCBVQ0hBUiAqcEJzc1R5cGUsCi0JT1VUIENIQVIgU3NpZFtdLAotCU9VVCBVQ0hBUiAqcFNzaWRMZW4sCi0JT1VUIFVDSEFSICpwU2NhblR5cGUpCitCT09MRUFOIE1sbWVTY2FuUmVxU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgdm9pZCAqIE1zZywKKwkJCSAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkgIHU4ICogcEJzc1R5cGUsCisJCQkgIGNoYXIgU3NpZFtdLAorCQkJICB1OCAqIHBTc2lkTGVuLCB1OCAqIHBTY2FuVHlwZSkKIHsKLQlNTE1FX1NDQU5fUkVRX1NUUlVDVCAqSW5mbzsKKwlzdHJ1Y3QgcnRfbWxtZV9zY2FuX3JlcSAqSW5mbzsKIAotCUluZm8gPSAoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKikoTXNnKTsKKwlJbmZvID0gKHN0cnVjdCBydF9tbG1lX3NjYW5fcmVxICopKE1zZyk7CiAJKnBCc3NUeXBlID0gSW5mby0+QnNzVHlwZTsKIAkqcFNzaWRMZW4gPSBJbmZvLT5Tc2lkTGVuOwogCU5kaXNNb3ZlTWVtb3J5KFNzaWQsIEluZm8tPlNzaWQsICpwU3NpZExlbik7CiAJKnBTY2FuVHlwZSA9IEluZm8tPlNjYW5UeXBlOwogCi0JaWYgKCgqcEJzc1R5cGUgPT0gQlNTX0lORlJBIHx8ICpwQnNzVHlwZSA9PSBCU1NfQURIT0MgfHwgKnBCc3NUeXBlID09IEJTU19BTlkpCi0JCSYmICgqcFNjYW5UeXBlID09IFNDQU5fQUNUSVZFIHx8ICpwU2NhblR5cGUgPT0gU0NBTl9QQVNTSVZFCi0JCXx8ICpwU2NhblR5cGUgPT0gU0NBTl9DSVNDT19QQVNTSVZFIHx8ICpwU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUKLQkJfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCB8fCAqcFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UKLQkJKSkKLQl7CisJaWYgKCgqcEJzc1R5cGUgPT0gQlNTX0lORlJBIHx8ICpwQnNzVHlwZSA9PSBCU1NfQURIT0MKKwkgICAgIHx8ICpwQnNzVHlwZSA9PSBCU1NfQU5ZKQorCSAgICAmJiAoKnBTY2FuVHlwZSA9PSBTQ0FOX0FDVElWRSB8fCAqcFNjYW5UeXBlID09IFNDQU5fUEFTU0lWRSkpIHsKIAkJcmV0dXJuIFRSVUU7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTY2FuUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBCc3NUeXBlIG9yIFNjYW5UeXBlXG4iKSk7CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNbG1lU2NhblJlcVNhbml0eSBmYWlsIC0gd3JvbmcgQnNzVHlwZSBvciBTY2FuVHlwZVxuIikpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogfQogCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVVDSEFSIENoYW5uZWxTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVUNIQVIgY2hhbm5lbCkKKy8qIElSUUwgPSBESVNQQVRDSF9MRVZFTCAqLwordTggQ2hhbm5lbFNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IGNoYW5uZWwpCiB7Ci0gICAgaW50IGk7CisJaW50IGk7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSArKykKLSAgICB7Ci0gICAgICAgIGlmIChjaGFubmVsID09IHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCkKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKSB7CisJCWlmIChjaGFubmVsID09IHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTc5NCwxOSArNzc5LDE3IEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1CT09MRUFOIFBlZXJEZWF1dGhTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMiwKLSAgICBPVVQgVVNIT1JUICpwUmVhc29uKQorQk9PTEVBTiBQZWVyRGVhdXRoU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSB2b2lkICogTXNnLAorCQkJIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJIHU4ICpwQWRkcjIsIHUxNiAqIHBSZWFzb24pCiB7Ci0gICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIE1zZzsKIAotICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7Ci0gICAgTmRpc01vdmVNZW1vcnkocFJlYXNvbiwgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOworCUNPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisJTmRpc01vdmVNZW1vcnkocFJlYXNvbiwgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOwogCi0gICAgcmV0dXJuIFRSVUU7CisJcmV0dXJuIFRSVUU7CiB9CiAKIC8qCkBAIC04MjAsNTggKzgwMyw0NiBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotQk9PTEVBTiBQZWVyQXV0aFNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIsCi0gICAgT1VUIFVTSE9SVCAqcEFsZywKLSAgICBPVVQgVVNIT1JUICpwU2VxLAotICAgIE9VVCBVU0hPUlQgKnBTdGF0dXMsCi0gICAgQ0hBUiAqcENobGdUZXh0KQorQk9PTEVBTiBQZWVyQXV0aFNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB2b2lkICogTXNnLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCSAgICAgICB1OCAqcEFkZHIsCisJCSAgICAgICB1MTYgKiBwQWxnLAorCQkgICAgICAgdTE2ICogcFNlcSwKKwkJICAgICAgIHUxNiAqIHBTdGF0dXMsIGNoYXIgKiBwQ2hsZ1RleHQpCiB7Ci0gICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIE1zZzsKIAotICAgIENPUFlfTUFDX0FERFIocEFkZHIsICAgcEZyYW1lLT5IZHIuQWRkcjIpOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBBbGcsICAgICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKLSAgICBOZGlzTW92ZU1lbW9yeShwU2VxLCAgICAmcEZyYW1lLT5PY3RldFsyXSwgMik7Ci0gICAgTmRpc01vdmVNZW1vcnkocFN0YXR1cywgJnBGcmFtZS0+T2N0ZXRbNF0sIDIpOworCUNPUFlfTUFDX0FERFIocEFkZHIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKwlOZGlzTW92ZU1lbW9yeShwQWxnLCAmcEZyYW1lLT5PY3RldFswXSwgMik7CisJTmRpc01vdmVNZW1vcnkocFNlcSwgJnBGcmFtZS0+T2N0ZXRbMl0sIDIpOworCU5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsICZwRnJhbWUtPk9jdGV0WzRdLCAyKTsKIAotICAgIGlmICgoKnBBbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLSAgICAgICkKLSAgICB7Ci0gICAgICAgIGlmICgqcFNlcSA9PSAxIHx8ICpwU2VxID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckF1dGhTYW5pdHkgZmFpbCAtIHdyb25nIFNlZyNcbiIpKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCi0gICAgewotICAgICAgICBpZiAoKnBTZXEgPT0gMSB8fCAqcFNlcSA9PSA0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgqcFNlcSA9PSAyIHx8ICpwU2VxID09IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDaGxnVGV4dCwgJnBGcmFtZS0+T2N0ZXRbOF0sIENJUEhFUl9URVhUX0xFTik7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBTZWcjXG4iKSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckF1dGhTYW5pdHkgZmFpbCAtIHdyb25nIGFsZ29yaXRobVxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorCWlmICgqcEFsZyA9PSBBVVRIX01PREVfT1BFTikgeworCQlpZiAoKnBTZXEgPT0gMSB8fCAqcFNlcSA9PSAyKSB7CisJCQlyZXR1cm4gVFJVRTsKKwkJfSBlbHNlIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBTZWcjXG4iKSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9IGVsc2UgaWYgKCpwQWxnID09IEFVVEhfTU9ERV9LRVkpIHsKKwkJaWYgKCpwU2VxID09IDEgfHwgKnBTZXEgPT0gNCkgeworCQkJcmV0dXJuIFRSVUU7CisJCX0gZWxzZSBpZiAoKnBTZXEgPT0gMiB8fCAqcFNlcSA9PSAzKSB7CisJCQlOZGlzTW92ZU1lbW9yeShwQ2hsZ1RleHQsICZwRnJhbWUtPk9jdGV0WzhdLAorCQkJCSAgICAgICBDSVBIRVJfVEVYVF9MRU4pOworCQkJcmV0dXJuIFRSVUU7CisJCX0gZWxzZSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJQZWVyQXV0aFNhbml0eSBmYWlsIC0gd3JvbmcgU2VnI1xuIikpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJQZWVyQXV0aFNhbml0eSBmYWlsIC0gd3JvbmcgYWxnb3JpdGhtXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CiB9CiAKIC8qCkBAIC04ODIsMzIgKzg1MywyNyBAQAogICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotQk9PTEVBTiBNbG1lQXV0aFJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIsCi0gICAgT1VUIFVMT05HICpwVGltZW91dCwKLSAgICBPVVQgVVNIT1JUICpwQWxnKQorQk9PTEVBTiBNbG1lQXV0aFJlcVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHZvaWQgKiBNc2csCisJCQkgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJICB1OCAqcEFkZHIsCisJCQkgIHVuc2lnbmVkIGxvbmcgKiBwVGltZW91dCwgdTE2ICogcEFsZykKIHsKLSAgICBNTE1FX0FVVEhfUkVRX1NUUlVDVCAqcEluZm87CisJc3RydWN0IHJ0X21sbWVfYXV0aF9yZXEgKnBJbmZvOwogCi0gICAgcEluZm8gID0gKE1MTUVfQVVUSF9SRVFfU1RSVUNUICopTXNnOwotICAgIENPUFlfTUFDX0FERFIocEFkZHIsIHBJbmZvLT5BZGRyKTsKLSAgICAqcFRpbWVvdXQgPSBwSW5mby0+VGltZW91dDsKLSAgICAqcEFsZyA9IHBJbmZvLT5BbGc7CisJcEluZm8gPSAoc3RydWN0IHJ0X21sbWVfYXV0aF9yZXEgKilNc2c7CisJQ09QWV9NQUNfQUREUihwQWRkciwgcEluZm8tPkFkZHIpOworCSpwVGltZW91dCA9IHBJbmZvLT5UaW1lb3V0OworCSpwQWxnID0gcEluZm8tPkFsZzsKIAotICAgIGlmICgoKCpwQWxnID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgfHwoKnBBbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLSAgICAgCSkgJiYKLSAgICAgICAgKCgqcEFkZHIgJiAweDAxKSA9PSAwKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQXV0aFJlcVNhbml0eSBmYWlsIC0gd3JvbmcgYWxnb3JpdGhtXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisJaWYgKCgoKnBBbGcgPT0gQVVUSF9NT0RFX0tFWSkgfHwgKCpwQWxnID09IEFVVEhfTU9ERV9PUEVOKQorCSAgICApICYmICgoKnBBZGRyICYgMHgwMSkgPT0gMCkpIHsKKwkJcmV0dXJuIFRSVUU7CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNbG1lQXV0aFJlcVNhbml0eSBmYWlsIC0gd3JvbmcgYWxnb3JpdGhtXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CiB9CiAKIC8qCkBAIC05MjEsMjQgKzg4NywyMiBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotQk9PTEVBTiBNbG1lQXNzb2NSZXFTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBcEFkZHIsCi0gICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAotICAgIE9VVCBVTE9ORyAqcFRpbWVvdXQsCi0gICAgT1VUIFVTSE9SVCAqcExpc3RlbkludHYpCitCT09MRUFOIE1sbWVBc3NvY1JlcVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB2b2lkICogTXNnLAorCQkJICAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkgICB1OCAqcEFwQWRkciwKKwkJCSAgIHUxNiAqIHBDYXBhYmlsaXR5SW5mbywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgKiBwVGltZW91dCwgdTE2ICogcExpc3RlbkludHYpCiB7Ci0gICAgTUxNRV9BU1NPQ19SRVFfU1RSVUNUICpwSW5mbzsKKwlzdHJ1Y3QgcnRfbWxtZV9hc3NvY19yZXEgKnBJbmZvOwogCi0gICAgcEluZm8gPSAoTUxNRV9BU1NPQ19SRVFfU1RSVUNUICopTXNnOwotICAgICpwVGltZW91dCA9IHBJbmZvLT5UaW1lb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGltZW91dAotICAgIENPUFlfTUFDX0FERFIocEFwQWRkciwgcEluZm8tPkFkZHIpOyAgICAgICAgICAgICAgICAgICAvLyBBUCBhZGRyZXNzCi0gICAgKnBDYXBhYmlsaXR5SW5mbyA9IHBJbmZvLT5DYXBhYmlsaXR5SW5mbzsgICAgICAgICAgICAgICAvLyBjYXBhYmlsaXR5IGluZm8KLSAgICAqcExpc3RlbkludHYgPSBwSW5mby0+TGlzdGVuSW50djsKKwlwSW5mbyA9IChzdHJ1Y3QgcnRfbWxtZV9hc3NvY19yZXEgKilNc2c7CisJKnBUaW1lb3V0ID0gcEluZm8tPlRpbWVvdXQ7CS8qIHRpbWVvdXQgKi8KKwlDT1BZX01BQ19BRERSKHBBcEFkZHIsIHBJbmZvLT5BZGRyKTsJLyogQVAgYWRkcmVzcyAqLworCSpwQ2FwYWJpbGl0eUluZm8gPSBwSW5mby0+Q2FwYWJpbGl0eUluZm87CS8qIGNhcGFiaWxpdHkgaW5mbyAqLworCSpwTGlzdGVuSW50diA9IHBJbmZvLT5MaXN0ZW5JbnR2OwogCi0gICAgcmV0dXJuIFRSVUU7CisJcmV0dXJuIFRSVUU7CiB9CiAKIC8qCkBAIC05NTIsMTkgKzkxNiwxNyBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotQk9PTEVBTiBQZWVyRGlzYXNzb2NTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMiwKLSAgICBPVVQgVVNIT1JUICpwUmVhc29uKQorQk9PTEVBTiBQZWVyRGlzYXNzb2NTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdm9pZCAqIE1zZywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJICAgdTggKnBBZGRyMiwgdTE2ICogcFJlYXNvbikKIHsKLSAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogcEZyYW1lID0gKHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKikgTXNnOwogCi0gICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKLSAgICBOZGlzTW92ZU1lbW9yeShwUmVhc29uLCAmcEZyYW1lLT5PY3RldFswXSwgMik7CisJQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKwlOZGlzTW92ZU1lbW9yeShwUmVhc29uLCAmcEZyYW1lLT5PY3RldFswXSwgMik7CiAKLSAgICByZXR1cm4gVFJVRTsKKwlyZXR1cm4gVFJVRTsKIH0KIAogLyoKQEAgLTk4NCw3MSArOTQ2LDI2MCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoCi0gICAgSU4gUEJTU19FTlRSWSBwQnNzKQorTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoc3RydWN0IHJ0X2Jzc19lbnRyeSAqcEJzcykKIHsKLQlORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUJTmV0V29ya1R5cGU7Ci0JVUNIQVIJCQkJCQlyYXRlLCBpOworCU5ESVNfODAyXzExX05FVFdPUktfVFlQRSBOZXRXb3JrVHlwZTsKKwl1OCByYXRlLCBpOwogCiAJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExRFM7CiAKLQlpZiAocEJzcy0+Q2hhbm5lbCA8PSAxNCkKLQl7Ci0JCS8vCi0JCS8vIEZpcnN0IGNoZWNrIHN1cHBvcnQgUmF0ZS4KLQkJLy8KLQkJZm9yIChpID0gMDsgaSA8IHBCc3MtPlN1cFJhdGVMZW47IGkrKykKLQkJewotCQkJcmF0ZSA9IHBCc3MtPlN1cFJhdGVbaV0gJiAweDdmOyAvLyBNYXNrIG91dCBiYXNpYyByYXRlIHNldCBiaXQKLQkJCWlmICgocmF0ZSA9PSAyKSB8fCAocmF0ZSA9PSA0KSB8fCAocmF0ZSA9PSAxMSkgfHwgKHJhdGUgPT0gMjIpKQotCQkJeworCWlmIChwQnNzLT5DaGFubmVsIDw9IDE0KSB7CisJCS8qICovCisJCS8qIEZpcnN0IGNoZWNrIHN1cHBvcnQgUmF0ZS4gKi8KKwkJLyogKi8KKwkJZm9yIChpID0gMDsgaSA8IHBCc3MtPlN1cFJhdGVMZW47IGkrKykgeworCQkJcmF0ZSA9IHBCc3MtPlN1cFJhdGVbaV0gJiAweDdmOwkvKiBNYXNrIG91dCBiYXNpYyByYXRlIHNldCBiaXQgKi8KKwkJCWlmICgocmF0ZSA9PSAyKSB8fCAocmF0ZSA9PSA0KSB8fCAocmF0ZSA9PSAxMSkKKwkJCSAgICB8fCAocmF0ZSA9PSAyMikpIHsKIAkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLwotCQkJCS8vIE90aGVyd2lzZSAoZXZlbiByYXRlID4gMTA4KSBtZWFucyBOZGlzODAyXzExT0ZETTI0Ci0JCQkJLy8KKwkJCX0gZWxzZSB7CisJCQkJLyogKi8KKwkJCQkvKiBPdGhlcndpc2UgKGV2ZW4gcmF0ZSA+IDEwOCkgbWVhbnMgTmRpczgwMl8xMU9GRE0yNCAqLworCQkJCS8qICovCiAJCQkJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTI0OwogCQkJCWJyZWFrOwogCQkJfQogCQl9CiAKLQkJLy8KLQkJLy8gU2Vjb25kIGNoZWNrIEV4dGVuZCBSYXRlLgotCQkvLwotCQlpZiAoTmV0V29ya1R5cGUgIT0gTmRpczgwMl8xMU9GRE0yNCkKLQkJewotCQkJZm9yIChpID0gMDsgaSA8IHBCc3MtPkV4dFJhdGVMZW47IGkrKykKLQkJCXsKLQkJCQlyYXRlID0gcEJzcy0+U3VwUmF0ZVtpXSAmIDB4N2Y7IC8vIE1hc2sgb3V0IGJhc2ljIHJhdGUgc2V0IGJpdAotCQkJCWlmICgocmF0ZSA9PSAyKSB8fCAocmF0ZSA9PSA0KSB8fCAocmF0ZSA9PSAxMSkgfHwgKHJhdGUgPT0gMjIpKQotCQkJCXsKKwkJLyogKi8KKwkJLyogU2Vjb25kIGNoZWNrIEV4dGVuZCBSYXRlLiAqLworCQkvKiAqLworCQlpZiAoTmV0V29ya1R5cGUgIT0gTmRpczgwMl8xMU9GRE0yNCkgeworCQkJZm9yIChpID0gMDsgaSA8IHBCc3MtPkV4dFJhdGVMZW47IGkrKykgeworCQkJCXJhdGUgPSBwQnNzLT5TdXBSYXRlW2ldICYgMHg3ZjsJLyogTWFzayBvdXQgYmFzaWMgcmF0ZSBzZXQgYml0ICovCisJCQkJaWYgKChyYXRlID09IDIpIHx8IChyYXRlID09IDQpIHx8IChyYXRlID09IDExKQorCQkJCSAgICB8fCAocmF0ZSA9PSAyMikpIHsKIAkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vCi0JCQkJCS8vIE90aGVyd2lzZSAoZXZlbiByYXRlID4gMTA4KSBtZWFucyBOZGlzODAyXzExT0ZETTI0Ci0JCQkJCS8vCisJCQkJfSBlbHNlIHsKKwkJCQkJLyogKi8KKwkJCQkJLyogT3RoZXJ3aXNlIChldmVuIHJhdGUgPiAxMDgpIG1lYW5zIE5kaXM4MDJfMTFPRkRNMjQgKi8KKwkJCQkJLyogKi8KIAkJCQkJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTI0OwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CiAJCX0KLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNNTsKIAl9CiAKLSAgICBpZiAocEJzcy0+SHRDYXBhYmlsaXR5TGVuICE9IDApCi0gICAgewotICAgICAgICBpZiAoTmV0V29ya1R5cGUgPT0gTmRpczgwMl8xMU9GRE01KQotICAgICAgICAgICAgTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTVfTjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTI0X047Ci0gICAgfQorCWlmIChwQnNzLT5IdENhcGFiaWxpdHlMZW4gIT0gMCkgeworCQlpZiAoTmV0V29ya1R5cGUgPT0gTmRpczgwMl8xMU9GRE01KQorCQkJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTVfTjsKKwkJZWxzZQorCQkJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTI0X047CisJfQogCiAJcmV0dXJuIE5ldFdvcmtUeXBlOwogfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIENoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgcmVjZWl2ZWQgRUFQb0wgZnJhbWUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLAorICAgICAgICBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJXcGFNZXNzYWdlU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqIHBNc2csCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJICAgICB1OCBNc2dUeXBlLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpCit7CisJdTggbWljW0xFTl9LRVlfREVTQ19NSUNdLCBkaWdlc3RbODBdLCBLRVlEQVRBW01BWF9MRU5fT0ZfUlNOSUVdOworCUJPT0xFQU4gYlJlcGxheURpZmYgPSBGQUxTRTsKKwlCT09MRUFOIGJXUEEyID0gRkFMU0U7CisJc3RydWN0IHJ0X2tleV9pbmZvIEVhcG9sS2V5SW5mbzsKKwl1OCBHcm91cEtleUluZGV4ID0gMDsKKworCU5kaXNaZXJvTWVtb3J5KG1pYywgc2l6ZW9mKG1pYykpOworCU5kaXNaZXJvTWVtb3J5KGRpZ2VzdCwgc2l6ZW9mKGRpZ2VzdCkpOworCU5kaXNaZXJvTWVtb3J5KEtFWURBVEEsIHNpemVvZihLRVlEQVRBKSk7CisJTmRpc1plcm9NZW1vcnkoKHU4ICopJiBFYXBvbEtleUluZm8sIHNpemVvZihFYXBvbEtleUluZm8pKTsKKworCU5kaXNNb3ZlTWVtb3J5KCh1OCAqKSYgRWFwb2xLZXlJbmZvLAorCQkgICAgICAgKHU4ICopJiBwTXNnLT5LZXlEZXNjLktleUluZm8sIHNpemVvZihzdHJ1Y3QgcnRfa2V5X2luZm8pKTsKKworCSooKHUxNiAqKSAmIEVhcG9sS2V5SW5mbykgPSBjcHUybGUxNigqKCh1MTYgKikgJiBFYXBvbEtleUluZm8pKTsKKworCS8qIENob29zZSBXUEEyIG9yIG5vdCAqLworCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorCSAgICB8fCAocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJYldQQTIgPSBUUlVFOworCisJLyogMC4gQ2hlY2sgTXNnVHlwZSAqLworCWlmICgoTXNnVHlwZSA+IEVBUE9MX0dST1VQX01TR18yKSB8fCAoTXNnVHlwZSA8IEVBUE9MX1BBSVJfTVNHXzEpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiVGhlIG1lc3NhZ2UgdHlwZSBpcyBpbnZhbGlkKCVkKSEgXG4iLCBNc2dUeXBlKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyogMS4gUmVwbGF5IGNvdW50ZXIgY2hlY2sgKi8KKwlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xIHx8IE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyB8fCBNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKQkvKiBGb3Igc3VwcGxpY2FudCAqLworCXsKKwkJLyogRmlyc3QgdmFsaWRhdGUgcmVwbGF5IGNvdW50ZXIsIG9ubHkgYWNjZXB0IG1lc3NhZ2Ugd2l0aCBsYXJnZXIgcmVwbGF5IGNvdW50ZXIuICovCisJCS8qIExldCBlcXVhbCBwYXNzLCBzb21lIEFQIHN0YXJ0IHdpdGggYWxsIHplcm8gcmVwbGF5IGNvdW50ZXIgKi8KKwkJdTggWmVyb1JlcGxheVtMRU5fS0VZX0RFU0NfUkVQTEFZXTsKKworCQlOZGlzWmVyb01lbW9yeShaZXJvUmVwbGF5LCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKwkJaWYgKChSVE1QQ29tcGFyZU1lbW9yeQorCQkgICAgIChwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBFbnRyeS0+Ul9Db3VudGVyLAorCQkgICAgICBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKQorCQkgICAgJiYKKwkJICAgIChSVE1QQ29tcGFyZU1lbW9yeQorCQkgICAgIChwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIFplcm9SZXBsYXksCisJCSAgICAgIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDApKSB7CisJCQliUmVwbGF5RGlmZiA9IFRSVUU7CisJCX0KKwl9IGVsc2UgaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMiB8fCBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzQgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMikJLyogRm9yIGF1dGhlbnRpY2F0b3IgKi8KKwl7CisJCS8qIGNoZWNrIFJlcGxheSBDb3VudGVyIGNvcmVzcG9uZHMgdG8gTVNHIGZyb20gYXV0aGVudGljYXRvciwgb3RoZXJ3aXNlIGRpc2NhcmQgKi8KKwkJaWYgKCFOZGlzRXF1YWxNZW1vcnkKKwkJICAgIChwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBFbnRyeS0+Ul9Db3VudGVyLAorCQkgICAgIExFTl9LRVlfREVTQ19SRVBMQVkpKSB7CisJCQliUmVwbGF5RGlmZiA9IFRSVUU7CisJCX0KKwl9CisJLyogUmVwbGF5IENvdW50ZXIgZGlmZmVyZW50IGNvbmRpdGlvbiAqLworCWlmIChiUmVwbGF5RGlmZikgeworCQkvKiBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHJlcGxheSBjb3VudGVyIGRpZmZlcmVudCAqLworCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLAorCQkJCQkgICAgICBJV19SRVBMQVlfQ09VTlRFUl9ESUZGX0VWRU5UX0ZMQUcsCisJCQkJCSAgICAgIHBFbnRyeS0+QWRkciwgcEVudHJ5LT5hcGlkeCwgMCk7CisKKwkJaWYgKE1zZ1R5cGUgPCBFQVBPTF9HUk9VUF9NU0dfMSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiUmVwbGF5IENvdW50ZXIgRGlmZmVyZW50IGluIHBhaXJ3aXNlIG1zZyAlZCBvZiA0LXdheSBoYW5kc2hha2UhXG4iLAorCQkJCSAgTXNnVHlwZSkpOworCQl9IGVsc2UgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiUmVwbGF5IENvdW50ZXIgRGlmZmVyZW50IGluIGdyb3VwIG1zZyAlZCBvZiAyLXdheSBoYW5kc2hha2UhXG4iLAorCQkJCSAgKE1zZ1R5cGUgLSBFQVBPTF9QQUlSX01TR180KSkpOworCQl9CisKKwkJaGV4X2R1bXAoIlJlY2VpdmUgcmVwbGF5IGNvdW50ZXIgIiwgcE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLAorCQkJIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQloZXhfZHVtcCgiQ3VycmVudCByZXBsYXkgY291bnRlciAiLCBwRW50cnktPlJfQ291bnRlciwKKwkJCSBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKiAyLiBWZXJpZnkgTUlDIGV4Y2VwdCBQYWlyd2lzZSBNc2cxICovCisJaWYgKE1zZ1R5cGUgIT0gRUFQT0xfUEFJUl9NU0dfMSkgeworCQl1OCByY3ZkX21pY1tMRU5fS0VZX0RFU0NfTUlDXTsKKworCQkvKiBSZWNvcmQgdGhlIHJlY2VpdmVkIE1JQyBmb3IgY2hlY2sgbGF0ZXIgKi8KKwkJTmRpc01vdmVNZW1vcnkocmN2ZF9taWMsIHBNc2ctPktleURlc2MuS2V5TWljLAorCQkJICAgICAgIExFTl9LRVlfREVTQ19NSUMpOworCQlOZGlzWmVyb01lbW9yeShwTXNnLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwkJaWYgKEVhcG9sS2V5SW5mby5LZXlEZXNjVmVyID09IERFU0NfVFlQRV9US0lQKQkvKiBUS0lQICovCisJCXsKKwkJCUhNQUNfTUQ1KHBFbnRyeS0+UFRLLCBMRU5fRUFQX01JQ0ssICh1OCAqKXBNc2csCisJCQkJIE1zZ0xlbiwgbWljLCBNRDVfRElHRVNUX1NJWkUpOworCQl9IGVsc2UgaWYgKEVhcG9sS2V5SW5mby5LZXlEZXNjVmVyID09IERFU0NfVFlQRV9BRVMpCS8qIEFFUyAqLworCQl7CisJCQlITUFDX1NIQTEocEVudHJ5LT5QVEssIExFTl9FQVBfTUlDSywgKHU4ICopcE1zZywKKwkJCQkgIE1zZ0xlbiwgZGlnZXN0LCBTSEExX0RJR0VTVF9TSVpFKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KG1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwkJfQorCisJCWlmICghTmRpc0VxdWFsTWVtb3J5KHJjdmRfbWljLCBtaWMsIExFTl9LRVlfREVTQ19NSUMpKSB7CisJCQkvKiBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIE1JQyBkaWZmZXJlbnQgKi8KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLAorCQkJCQkJICAgICAgSVdfTUlDX0RJRkZfRVZFTlRfRkxBRywKKwkJCQkJCSAgICAgIHBFbnRyeS0+QWRkciwKKwkJCQkJCSAgICAgIHBFbnRyeS0+YXBpZHgsIDApOworCisJCQlpZiAoTXNnVHlwZSA8IEVBUE9MX0dST1VQX01TR18xKSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCSAoIk1JQyBEaWZmZXJlbnQgaW4gcGFpcndpc2UgbXNnICVkIG9mIDQtd2F5IGhhbmRzaGFrZSFcbiIsCisJCQkJCSAgTXNnVHlwZSkpOworCQkJfSBlbHNlIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJICgiTUlDIERpZmZlcmVudCBpbiBncm91cCBtc2cgJWQgb2YgMi13YXkgaGFuZHNoYWtlIVxuIiwKKwkJCQkJICAoTXNnVHlwZSAtIEVBUE9MX1BBSVJfTVNHXzQpKSk7CisJCQl9CisKKwkJCWhleF9kdW1wKCJSZWNlaXZlZCBNSUMiLCByY3ZkX21pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJCQloZXhfZHVtcCgiRGVzaXJlZCAgTUlDIiwgbWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCS8qIDEuIERlY3J5cHQgdGhlIEtleSBEYXRhIGZpZWxkIGlmIEdUSyBpcyBpbmNsdWRlZC4gKi8KKwkvKiAyLiBFeHRyYWN0IHRoZSBjb250ZXh0IG9mIHRoZSBLZXkgRGF0YSBmaWVsZCBpZiBpdCBleGlzdC4gKi8KKwkvKiBUaGUgZmllbGQgaW4gcGFpcndpc2VfbXNnXzJfV1BBMShXUEEyKSAmIHBhaXJ3aXNlX21zZ18zX1dQQTEgaXMgY2xlYXIuICovCisJLyogVGhlIGZpZWxkIGluIGdyb3VwX21zZ18xX1dQQTEoV1BBMikgJiBwYWlyd2lzZV9tc2dfM19XUEEyIGlzIGVuY3J5cHRlZC4gKi8KKwlpZiAoQ09OVl9BUlJBUllfVE9fdTE2KHBNc2ctPktleURlc2MuS2V5RGF0YUxlbikgPiAwKSB7CisJCS8qIERlY3J5cHQgdGhpcyBmaWVsZCAqLworCQlpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiBiV1BBMikKKwkJICAgIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkgeworCQkJaWYgKChFYXBvbEtleUluZm8uS2V5RGVzY1ZlciA9PSBERVNDX1RZUEVfQUVTKSkgeworCQkJCS8qIEFFUyAqLworCQkJCUFFU19HVEtfS0VZX1VOV1JBUCgmcEVudHJ5LT5QVEtbMTZdLCBLRVlEQVRBLAorCQkJCQkJICAgQ09OVl9BUlJBUllfVE9fdTE2KHBNc2ctPgorCQkJCQkJCQkJIEtleURlc2MuCisJCQkJCQkJCQkgS2V5RGF0YUxlbiksCisJCQkJCQkgICBwTXNnLT5LZXlEZXNjLktleURhdGEpOworCQkJfSBlbHNlIHsKKwkJCQlpbnQgaTsKKwkJCQl1OCBLZXlbMzJdOworCQkJCS8qIERlY3J5cHQgVEtJUCBHVEsgKi8KKwkJCQkvKiBDb25zdHJ1Y3QgMzIgYnl0ZXMgUkM0IEtleSAqLworCQkJCU5kaXNNb3ZlTWVtb3J5KEtleSwgcE1zZy0+S2V5RGVzYy5LZXlJdiwgMTYpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlbMTZdLCAmcEVudHJ5LT5QVEtbMTZdLCAxNik7CisJCQkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtleSwKKwkJCQkJICAgICAzMik7CisJCQkJLypkaXNjYXJkIGZpcnN0IDI1NiBieXRlcyAqLworCQkJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCQkJQVJDRk9VUl9CWVRFKCZwQWQtPlByaXZhdGVJbmZvLgorCQkJCQkJICAgICBXRVBDT05URVhUKTsKKwkJCQkvKiBEZWNyeXB0IEdUSy4gQmVjYXJlZnVsLCB0aGVyZSBpcyBubyBJQ1YgdG8gY2hlY2sgdGhlIHJlc3VsdCBpcyBjb3JyZWN0IG9yIG5vdCAqLworCQkJCUFSQ0ZPVVJfREVDUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULAorCQkJCQkJS0VZREFUQSwgcE1zZy0+S2V5RGVzYy5LZXlEYXRhLAorCQkJCQkJQ09OVl9BUlJBUllfVE9fdTE2KHBNc2ctPgorCQkJCQkJCQkgICAgICBLZXlEZXNjLgorCQkJCQkJCQkgICAgICBLZXlEYXRhTGVuKSk7CisJCQl9CisKKwkJCWlmICghYldQQTIgJiYgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCQkJCUdyb3VwS2V5SW5kZXggPSBFYXBvbEtleUluZm8uS2V5SW5kZXg7CisKKwkJfSBlbHNlIGlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18yKQorCQkJICAgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiAhYldQQTIpKSB7CisJCQlOZGlzTW92ZU1lbW9yeShLRVlEQVRBLCBwTXNnLT5LZXlEZXNjLktleURhdGEsCisJCQkJICAgICAgIENPTlZfQVJSQVJZX1RPX3UxNihwTXNnLT5LZXlEZXNjLgorCQkJCQkJCSAgICAgS2V5RGF0YUxlbikpOworCQl9IGVsc2UgeworCisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCisJCS8qIFBhcnNlIEtleSBEYXRhIGZpZWxkIHRvICovCisJCS8qIDEuIHZlcmlmeSBSU04gSUUgZm9yIHBhaXJ3aXNlX21zZ18yX1dQQTEoV1BBMikgLHBhaXJ3aXNlX21zZ18zX1dQQTEoV1BBMikgKi8KKwkJLyogMi4gdmVyaWZ5IEtERSBmb3JtYXQgZm9yIHBhaXJ3aXNlX21zZ18zX1dQQTIsIGdyb3VwX21zZ18xX1dQQTIgKi8KKwkJLyogMy4gdXBkYXRlIHNoYXJlZCBrZXkgZm9yIHBhaXJ3aXNlX21zZ18zX1dQQTIsIGdyb3VwX21zZ18xX1dQQTEoV1BBMikgKi8KKwkJaWYgKCFSVE1QUGFyc2VFYXBvbEtleURhdGEocEFkLCBLRVlEQVRBLAorCQkJCQkgICBDT05WX0FSUkFSWV9UT191MTYocE1zZy0+S2V5RGVzYy4KKwkJCQkJCQkJIEtleURhdGFMZW4pLAorCQkJCQkgICBHcm91cEtleUluZGV4LCBNc2dUeXBlLCBiV1BBMiwKKwkJCQkJICAgcEVudHJ5KSkgeworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCisJcmV0dXJuIFRSVUU7CisKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9zeW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fc3luYy5jCmluZGV4IGE2ZTFiNmQuLmY4NDE5NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9zeW5jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3N5bmMuYwpAQCAtMjUsNyArMjUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogCU1vZHVsZSBOYW1lOgotCXN5bmMuYworCWNtbV9zeW5jLmMKIAogCUFic3RyYWN0OgogCkBAIC0zNiw0MiArMzYsNjIgQEAKICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKLS8vIDIuNCBHaHogY2hhbm5lbCBwbGFuIGluZGV4IGluIHRoZSBUeFBvd2VyIGFycmF5cy4KLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fMF9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEKKy8qIDIuNCBHaHogY2hhbm5lbCBwbGFuIGluZGV4IGluIHRoZSBUeFBvd2VyIGFycmF5cy4gKi8KKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMF9TVEFSVAkwCS8qIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExICovCiAjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzBfU0laRQkxMQotI2RlZmluZQlCR19CQU5EX1JFR0lPTl8xX1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMworI2RlZmluZQlCR19CQU5EX1JFR0lPTl8xX1NUQVJUCTAJLyogMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMgKi8KICNkZWZpbmUJQkdfQkFORF9SRUdJT05fMV9TSVpFCTEzCi0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzJfU1RBUlQJOQkJCS8vIDEwLDExCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzJfU1RBUlQJOQkvKiAxMCwxMSAqLwogI2RlZmluZQlCR19CQU5EX1JFR0lPTl8yX1NJWkUJMgotI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zX1NUQVJUCTkJCQkvLyAxMCwxMSwxMiwxMworI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zX1NUQVJUCTkJLyogMTAsMTEsMTIsMTMgKi8KICNkZWZpbmUJQkdfQkFORF9SRUdJT05fM19TSVpFCTQKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fNF9TVEFSVAkxMwkJCS8vIDE0CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzRfU1RBUlQJMTMJLyogMTQgKi8KICNkZWZpbmUJQkdfQkFORF9SRUdJT05fNF9TSVpFCTEKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fNV9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNV9TVEFSVAkwCS8qIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0ICovCiAjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzVfU0laRQkxNAotI2RlZmluZQlCR19CQU5EX1JFR0lPTl82X1NUQVJUCTIJCQkvLyAzLDQsNSw2LDcsOCw5CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzZfU1RBUlQJMgkvKiAzLDQsNSw2LDcsOCw5ICovCiAjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzZfU0laRQk3Ci0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzdfU1RBUlQJNAkJCS8vIDUsNiw3LDgsOSwxMCwxMSwxMiwxMworI2RlZmluZQlCR19CQU5EX1JFR0lPTl83X1NUQVJUCTQJLyogNSw2LDcsOCw5LDEwLDExLDEyLDEzICovCiAjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzdfU0laRQk5Ci0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzMxX1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNAorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zMV9TVEFSVAkwCS8qIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0ICovCiAjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzMxX1NJWkUJMTQKIAotLy8gNSBHaHogY2hhbm5lbCBwbGFuIGluZGV4IGluIHRoZSBUeFBvd2VyIGFycmF5cy4KLVVDSEFSIEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjR9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl8zX0NIQU5ORUxfTElTVFtdPXs1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxfTsKLVVDSEFSIEFfQkFORF9SRUdJT05fNF9DSEFOTkVMX0xJU1RbXT17MTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVFtdPXsxNDksIDE1MywgMTU3LCAxNjF9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl82X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OH07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKLVVDSEFSIEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1RbXT17NTIsIDU2LCA2MCwgNjR9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl85X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzEwX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxNDksIDE1MywgMTU3LCAxNjF9OworLyogNSBHaHogY2hhbm5lbCBwbGFuIGluZGV4IGluIHRoZSBUeFBvd2VyIGFycmF5cy4gKi8KK3U4IEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1RbXSA9CisgICAgeyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1IH07Cit1OCBBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUW10gPQorICAgIHsgMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwKKzEzMiwgMTM2LCAxNDAgfTsKK3U4IEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1RbXSA9IHsgMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0IH07Cit1OCBBX0JBTkRfUkVHSU9OXzNfQ0hBTk5FTF9MSVNUW10gPSB7IDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEgfTsKK3U4IEFfQkFORF9SRUdJT05fNF9DSEFOTkVMX0xJU1RbXSA9IHsgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUgfTsKK3U4IEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1RbXSA9IHsgMTQ5LCAxNTMsIDE1NywgMTYxIH07Cit1OCBBX0JBTkRfUkVHSU9OXzZfQ0hBTk5FTF9MSVNUW10gPSB7IDM2LCA0MCwgNDQsIDQ4IH07Cit1OCBBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUW10gPQorICAgIHsgMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwKKzEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1LCAxNjksIDE3MyB9OwordTggQV9CQU5EX1JFR0lPTl84X0NIQU5ORUxfTElTVFtdID0geyA1MiwgNTYsIDYwLCA2NCB9OwordTggQV9CQU5EX1JFR0lPTl85X0NIQU5ORUxfTElTVFtdID0KKyAgICB7IDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEzMiwgMTM2LCAxNDAsCisxNDksIDE1MywgMTU3LCAxNjEsIDE2NSB9OwordTggQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1RbXSA9CisgICAgeyAzNiwgNDAsIDQ0LCA0OCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUgfTsKK3U4IEFfQkFORF9SRUdJT05fMTFfQ0hBTk5FTF9MSVNUW10gPQorICAgIHsgMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxNDksIDE1MywKKzE1NywgMTYxIH07Cit1OCBBX0JBTkRfUkVHSU9OXzEyX0NIQU5ORUxfTElTVFtdID0KKyAgICB7IDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsCisxMzIsIDEzNiwgMTQwIH07Cit1OCBBX0JBTkRfUkVHSU9OXzEzX0NIQU5ORUxfTElTVFtdID0KKyAgICB7IDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCwKKzE0OSwgMTUzLCAxNTcsIDE2MSB9OwordTggQV9CQU5EX1JFR0lPTl8xNF9DSEFOTkVMX0xJU1RbXSA9CisgICAgeyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzYsIDE0MCwgMTQ5LAorMTUzLCAxNTcsIDE2MSwgMTY1IH07Cit1OCBBX0JBTkRfUkVHSU9OXzE1X0NIQU5ORUxfTElTVFtdID0geyAxNDksIDE1MywgMTU3LCAxNjEsIDE2NSwgMTY5LCAxNzMgfTsKIAotLy9CYVNpemVBcnJheSBmb2xsb3dzIHRoZSA4MDIuMTFuIGRlZmluaXRpb24gYXMgTWF4UnhGYWN0b3IuICAyXigxMytmYWN0b3IpIGJ5dGVzLiBXaGVuIGZhY3RvciA9MCwgaXQncyBhYm91dCBCYSBidWZmZXIgc2l6ZSA9OC4KLVVDSEFSIEJhU2l6ZUFycmF5WzRdID0gezgsMTYsMzIsNjR9OworLypCYVNpemVBcnJheSBmb2xsb3dzIHRoZSA4MDIuMTFuIGRlZmluaXRpb24gYXMgTWF4UnhGYWN0b3IuICAyXigxMytmYWN0b3IpIGJ5dGVzLiBXaGVuIGZhY3RvciA9MCwgaXQncyBhYm91dCBCYSBidWZmZXIgc2l6ZSA9OC4gKi8KK3U4IEJhU2l6ZUFycmF5WzRdID0geyA4LCAxNiwgMzIsIDY0IH07CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTg1LDE1NSArMTA1LDI0MyBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBCdWlsZENoYW5uZWxMaXN0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBCdWlsZENoYW5uZWxMaXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlVQ0hBUiBpLCBqLCBpbmRleD0wLCBudW09MDsKLQlQVUNIQVIJcENoYW5uZWxMaXN0ID0gTlVMTDsKKwl1OCBpLCBqLCBpbmRleCA9IDAsIG51bSA9IDA7CisJdTggKnBDaGFubmVsTGlzdCA9IE5VTEw7CiAKLQlOZGlzWmVyb01lbW9yeShwQWQtPkNoYW5uZWxMaXN0LCBNQVhfTlVNX09GX0NIQU5ORUxTICogc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpKTsKKwlOZGlzWmVyb01lbW9yeShwQWQtPkNoYW5uZWxMaXN0LAorCQkgICAgICAgTUFYX05VTV9PRl9DSEFOTkVMUyAqIHNpemVvZihzdHJ1Y3QgcnRfY2hhbm5lbF90eF9wb3dlcikpOwogCi0JLy8gaWYgbm90IDExYS1vbmx5IG1vZGUsIGNoYW5uZWwgbGlzdCBzdGFydHMgZnJvbSAyLjRHaHogYmFuZAorCS8qIGlmIG5vdCAxMWEtb25seSBtb2RlLCBjaGFubmVsIGxpc3Qgc3RhcnRzIGZyb20gMi40R2h6IGJhbmQgKi8KIAlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgIT0gUEhZXzExQSkKLQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgIT0gUEhZXzExQU5fTUlYRUQpICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFBIWV8xMU5fNUcpCi0JKQotCXsKLQkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICAmIDB4N2YpCi0JCXsKLQkJCWNhc2UgUkVHSU9OXzBfQkdfQkFORDoJLy8gMSAtMTEKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMF9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzBfU0laRSk7Ci0JCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMF9TSVpFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fMV9CR19CQU5EOgkvLyAxIC0gMTMKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMV9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzFfU0laRSk7Ci0JCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMV9TSVpFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fMl9CR19CQU5EOgkvLyAxMCAtIDExCi0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzJfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8yX1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzJfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzNfQkdfQkFORDoJLy8gMTAgLSAxMwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8zX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fM19TSVpFKTsKLQkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8zX1NJWkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl80X0JHX0JBTkQ6CS8vIDE0Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzRfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl80X1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzRfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzVfQkdfQkFORDoJLy8gMSAtIDE0Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzVfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl81X1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzVfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzZfQkdfQkFORDoJLy8gMyAtIDkKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fNl9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzZfU0laRSk7Ci0JCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fNl9TSVpFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fN19CR19CQU5EOiAgLy8gNSAtIDEzCi0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzdfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl83X1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzdfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzMxX0JHX0JBTkQ6CS8vIDEgLSAxNAotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8zMV9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzMxX1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzMxX1NJWkU7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OiAgICAgICAgICAgIC8vIEVycm9yLiBzaG91bGQgbmV2ZXIgaGFwcGVuCi0JCQkJYnJlYWs7CisJICAgICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFBIWV8xMUFOX01JWEVEKQorCSAgICAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSAhPSBQSFlfMTFOXzVHKQorCSAgICApIHsKKwkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg3ZikgeworCQljYXNlIFJFR0lPTl8wX0JHX0JBTkQ6CS8qIDEgLTExICovCisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sCisJCQkJICAgICAgICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMF9TVEFSVF0sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfY2hhbm5lbF90eF9wb3dlcikgKgorCQkJCSAgICAgICBCR19CQU5EX1JFR0lPTl8wX1NJWkUpOworCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMF9TSVpFOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzFfQkdfQkFORDoJLyogMSAtIDEzICovCisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sCisJCQkJICAgICAgICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMV9TVEFSVF0sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfY2hhbm5lbF90eF9wb3dlcikgKgorCQkJCSAgICAgICBCR19CQU5EX1JFR0lPTl8xX1NJWkUpOworCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMV9TSVpFOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzJfQkdfQkFORDoJLyogMTAgLSAxMSAqLworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLAorCQkJCSAgICAgICAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzJfU1RBUlRdLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2NoYW5uZWxfdHhfcG93ZXIpICoKKwkJCQkgICAgICAgQkdfQkFORF9SRUdJT05fMl9TSVpFKTsKKwkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzJfU0laRTsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl8zX0JHX0JBTkQ6CS8qIDEwIC0gMTMgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwKKwkJCQkgICAgICAgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8zX1NUQVJUXSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9jaGFubmVsX3R4X3Bvd2VyKSAqCisJCQkJICAgICAgIEJHX0JBTkRfUkVHSU9OXzNfU0laRSk7CisJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8zX1NJWkU7CisJCQlicmVhazsKKwkJY2FzZSBSRUdJT05fNF9CR19CQU5EOgkvKiAxNCAqLworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLAorCQkJCSAgICAgICAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzRfU1RBUlRdLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2NoYW5uZWxfdHhfcG93ZXIpICoKKwkJCQkgICAgICAgQkdfQkFORF9SRUdJT05fNF9TSVpFKTsKKwkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzRfU0laRTsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl81X0JHX0JBTkQ6CS8qIDEgLSAxNCAqLworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLAorCQkJCSAgICAgICAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzVfU1RBUlRdLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2NoYW5uZWxfdHhfcG93ZXIpICoKKwkJCQkgICAgICAgQkdfQkFORF9SRUdJT05fNV9TSVpFKTsKKwkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzVfU0laRTsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl82X0JHX0JBTkQ6CS8qIDMgLSA5ICovCisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sCisJCQkJICAgICAgICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fNl9TVEFSVF0sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfY2hhbm5lbF90eF9wb3dlcikgKgorCQkJCSAgICAgICBCR19CQU5EX1JFR0lPTl82X1NJWkUpOworCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fNl9TSVpFOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzdfQkdfQkFORDoJLyogNSAtIDEzICovCisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sCisJCQkJICAgICAgICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fN19TVEFSVF0sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfY2hhbm5lbF90eF9wb3dlcikgKgorCQkJCSAgICAgICBCR19CQU5EX1JFR0lPTl83X1NJWkUpOworCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fN19TSVpFOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzMxX0JHX0JBTkQ6CS8qIDEgLSAxNCAqLworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLAorCQkJCSAgICAgICAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzMxX1NUQVJUXSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9jaGFubmVsX3R4X3Bvd2VyKSAqCisJCQkJICAgICAgIEJHX0JBTkRfUkVHSU9OXzMxX1NJWkUpOworCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMzFfU0laRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgkvKiBFcnJvci4gc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQkJYnJlYWs7CiAJCX0KLQkJZm9yIChpPTA7IGk8aW5kZXg7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IGluZGV4OyBpKyspCiAJCQlwQWQtPkNoYW5uZWxMaXN0W2ldLk1heFR4UHdyID0gMjA7CiAJfQogCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkKLQkJfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCi0JCXx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykKLQkpCi0JewotCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4N2YpCi0JCXsKLQkJCWNhc2UgUkVHSU9OXzBfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzBfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl8xX0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fMl9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzNfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzNfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fM19DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl80X0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl80X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzRfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fNV9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzZfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzZfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fNl9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl83X0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl83X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fOF9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl84X0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzlfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzlfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fOV9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7CisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpCisJICAgIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkKKwkgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkKKwkgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCisJICAgIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkKKwkgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykKKwkgICAgKSB7CisJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kICYgMHg3ZikgeworCQljYXNlIFJFR0lPTl8wX0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8wX0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl8xX0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fMV9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xX0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl8yX0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl8zX0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fM19DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8zX0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl80X0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fNF9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl80X0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl81X0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl82X0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fNl9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl82X0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl83X0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fN19DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl83X0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl84X0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl84X0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl85X0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fOV9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl85X0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOwogCi0JCQljYXNlIFJFR0lPTl8xMF9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMTBfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMTBfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOworCQljYXNlIFJFR0lPTl8xMF9BX0JBTkQ6CisJCQludW0gPQorCQkJICAgIHNpemVvZihBX0JBTkRfUkVHSU9OXzEwX0NIQU5ORUxfTElTVCkgLworCQkJICAgIHNpemVvZih1OCk7CisJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzEwX0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOwogCi0JCQljYXNlIFJFR0lPTl8xMV9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMTFfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMTFfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OiAgICAgICAgICAgIC8vIEVycm9yLiBzaG91bGQgbmV2ZXIgaGFwcGVuCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwoImNvdW50cnlyZWdpb249JWQgbm90IHN1cHBvcnQiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpKTsKLQkJCQlicmVhazsKKwkJY2FzZSBSRUdJT05fMTFfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1Q7CisJCQlicmVhazsKKwkJY2FzZSBSRUdJT05fMTJfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl8xMl9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xMl9DSEFOTkVMX0xJU1Q7CisJCQlicmVhazsKKwkJY2FzZSBSRUdJT05fMTNfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl8xM19DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xM19DSEFOTkVMX0xJU1Q7CisJCQlicmVhazsKKwkJY2FzZSBSRUdJT05fMTRfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl8xNF9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xNF9DSEFOTkVMX0xJU1Q7CisJCQlicmVhazsKKwkJY2FzZSBSRUdJT05fMTVfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl8xNV9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xNV9DSEFOTkVMX0xJU1Q7CisJCQlicmVhazsKKwkJZGVmYXVsdDoJLyogRXJyb3IuIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkJICgiY291bnRyeXJlZ2lvbj0lZCBub3Qgc3VwcG9ydCIsCisJCQkJICBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpKTsKKwkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKG51bSAhPSAwKQotCQl7Ci0JCQlVQ0hBUiBSYWRhckNoWzE1XT17NTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKLQkJCWZvciAoaT0wOyBpPG51bTsgaSsrKQotCQkJewotCQkJCWZvciAoaj0wOyBqPE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGorKykKLQkJCQl7Ci0JCQkJCWlmIChwQ2hhbm5lbExpc3RbaV0gPT0gcEFkLT5UeFBvd2VyW2pdLkNoYW5uZWwpCi0JCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleCtpXSwgJnBBZC0+VHhQb3dlcltqXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpKTsKLQkJCQkJfQotCQkJCWZvciAoaj0wOyBqPDE1OyBqKyspCi0JCQkJewotCQkJCQlpZiAocENoYW5uZWxMaXN0W2ldID09IFJhZGFyQ2hbal0pCi0JCQkJCQlwQWQtPkNoYW5uZWxMaXN0W2luZGV4K2ldLkRmc1JlcSA9IFRSVUU7CisJCWlmIChudW0gIT0gMCkgeworCQkJdTggUmFkYXJDaFsxNV0gPQorCQkJICAgIHsgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwKKwkJICAgIDEyOCwgMTMyLCAxMzYsIDE0MCB9OworCQkJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCQkJZm9yIChqID0gMDsgaiA8IE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGorKykgeworCQkJCQlpZiAocENoYW5uZWxMaXN0W2ldID09CisJCQkJCSAgICBwQWQtPlR4UG93ZXJbal0uQ2hhbm5lbCkKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPgorCQkJCQkJCSAgICAgICBDaGFubmVsTGlzdFtpbmRleAorCQkJCQkJCQkJICAgKyBpXSwKKwkJCQkJCQkgICAgICAgJnBBZC0+VHhQb3dlcltqXSwKKwkJCQkJCQkgICAgICAgc2l6ZW9mCisJCQkJCQkJICAgICAgIChzdHJ1Y3QgcnRfY2hhbm5lbF90eF9wb3dlcikpOwogCQkJCX0KLQkJCQlwQWQtPkNoYW5uZWxMaXN0W2luZGV4K2ldLk1heFR4UHdyID0gMjA7CisJCQkJZm9yIChqID0gMDsgaiA8IDE1OyBqKyspIHsKKwkJCQkJaWYgKHBDaGFubmVsTGlzdFtpXSA9PSBSYWRhckNoW2pdKQorCQkJCQkJcEFkLT5DaGFubmVsTGlzdFtpbmRleCArCisJCQkJCQkJCSBpXS5EZnNSZXEgPQorCQkJCQkJICAgIFRSVUU7CisJCQkJfQorCQkJCXBBZC0+Q2hhbm5lbExpc3RbaW5kZXggKyBpXS5NYXhUeFB3ciA9IDIwOwogCQkJfQogCQkJaW5kZXggKz0gbnVtOwogCQl9CiAJfQogCiAJcEFkLT5DaGFubmVsTGlzdE51bSA9IGluZGV4OwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiY291bnRyeSBjb2RlPSVkLyVkLCBSRklDPSVkLCBQSFkgbW9kZT0lZCwgc3VwcG9ydCAlZCBjaGFubmVsc1xuIiwKLQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kLCBwQWQtPlJmSWNUeXBlLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlLCBwQWQtPkNoYW5uZWxMaXN0TnVtKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoImNvdW50cnkgY29kZT0lZC8lZCwgUkZJQz0lZCwgUEhZIG1vZGU9JWQsIHN1cHBvcnQgJWQgY2hhbm5lbHNcbiIsCisJCSAgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiwKKwkJICBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQsIHBBZC0+UmZJY1R5cGUsCisJCSAgcEFkLT5Db21tb25DZmcuUGh5TW9kZSwgcEFkLT5DaGFubmVsTGlzdE51bSkpOwogI2lmZGVmIERCRwotCWZvciAoaT0wO2k8cEFkLT5DaGFubmVsTGlzdE51bTtpKyspCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJCdWlsZENoYW5uZWwgIyAlZCA6OiBQd3IwID0gJWQsIFB3cjEgPSVkLCBcbiAiLCBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIyKSk7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykgeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkgICAgICgiQnVpbGRDaGFubmVsICMgJWQgOjogUHdyMCA9ICVkLCBQd3IxID0lZCwgXG4gIiwKKwkJCSAgICAgIHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCwKKwkJCSAgICAgIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIsCisJCQkgICAgICBwQWQtPkNoYW5uZWxMaXN0W2ldLlBvd2VyMikpOwogCX0KICNlbmRpZgogfQpAQCAtMjUxLDggKzM1OSw3IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1VQ0hBUiBGaXJzdENoYW5uZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit1OCBGaXJzdENoYW5uZWwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewogCXJldHVybiBwQWQtPkNoYW5uZWxMaXN0WzBdLkNoYW5uZWw7CiB9CkBAIC0yNjgsMTkgKzM3NSwxNiBAQAogCQlyZXR1cm4gMCBpZiBubyBtb3JlIG5leHQgY2hhbm5lbAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVVDSEFSIE5leHRDaGFubmVsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSIGNoYW5uZWwpCit1OCBOZXh0Q2hhbm5lbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IGNoYW5uZWwpCiB7CiAJaW50IGk7Ci0JVUNIQVIgbmV4dF9jaGFubmVsID0gMDsKKwl1OCBuZXh0X2NoYW5uZWwgPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IChwQWQtPkNoYW5uZWxMaXN0TnVtIC0gMSk7IGkrKykKLQkJaWYgKGNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQotCQl7Ci0JCQluZXh0X2NoYW5uZWwgPSBwQWQtPkNoYW5uZWxMaXN0W2krMV0uQ2hhbm5lbDsKKwkJaWYgKGNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKSB7CisJCQluZXh0X2NoYW5uZWwgPSBwQWQtPkNoYW5uZWxMaXN0W2kgKyAxXS5DaGFubmVsOwogCQkJYnJlYWs7Ci0JfQorCQl9CiAJcmV0dXJuIG5leHRfY2hhbm5lbDsKIH0KIApAQCAtMzA0LDE2ICs0MDgsMTUgQEAKIAkJdGhlIG1pbmltdW0gdmFsdWUgb3IgbmV4dCBsb3dlciB2YWx1ZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIENoYW5nZVRvQ2VsbFBvd2VyTGltaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgICAgICAgICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpCit2b2lkIENoYW5nZVRvQ2VsbFBvd2VyTGltaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHU4IEFpcm9uZXRDZWxsUG93ZXJMaW1pdCkKIHsKLQkvL3ZhbHVkIDB4RkYgbWVhbnMgdGhhdCBoYXNuJ3QgZm91bmQgcG93ZXIgbGltaXQgaW5mb3JtYXRpb24KLQkvL2Zyb20gdGhlIEFQJ3MgQmVhY29uL1Byb2JlIHJlc3BvbnNlLgorCS8qdmFsdWQgMHhGRiBtZWFucyB0aGF0IGhhc24ndCBmb3VuZCBwb3dlciBsaW1pdCBpbmZvcm1hdGlvbiAqLworCS8qZnJvbSB0aGUgQVAncyBCZWFjb24vUHJvYmUgcmVzcG9uc2UuICovCiAJaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA9PSAweEZGKQogCQlyZXR1cm47CiAKLQlpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgNikgLy9Vc2VkIExvd2VzdCBQb3dlciBQZXJjZW50YWdlLgorCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPCA2KQkvKlVzZWQgTG93ZXN0IFBvd2VyIFBlcmNlbnRhZ2UuICovCiAJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNjsKIAllbHNlIGlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPCA5KQogCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDEwOwpAQCAtMzI0LDQ1ICs0MjcsNDAgQEAKIAllbHNlIGlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPCAxNSkKIAkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSA3NTsKIAllbHNlCi0JCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMTAwOyAvL2Vsc2UgdXNlZCBtYXhpbXVtCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMTAwOwkvKmVsc2UgdXNlZCBtYXhpbXVtICovCiAKIAlpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCkKLQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKKwkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPQorCQkgICAgcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CiAKIH0KIAotQ0hBUglDb252ZXJ0VG9Sc3NpKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOCUNIQVIJCQlSc3NpLAotCUlOICBVQ0hBUiAgIFJzc2lOdW1iZXIpCitjaGFyIENvbnZlcnRUb1Jzc2koc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyIFJzc2ksIHU4IFJzc2lOdW1iZXIpCiB7Ci0JVUNIQVIJUnNzaU9mZnNldCwgTE5BR2FpbjsKKwl1OCBSc3NpT2Zmc2V0LCBMTkFHYWluOwogCi0JLy8gUnNzaSBlcXVhbHMgdG8gemVybyBzaG91bGQgYmUgYW4gaW52YWxpZCB2YWx1ZQorCS8qIFJzc2kgZXF1YWxzIHRvIHplcm8gc2hvdWxkIGJlIGFuIGludmFsaWQgdmFsdWUgKi8KIAlpZiAoUnNzaSA9PSAwKQogCQlyZXR1cm4gLTk5OwogCiAJTE5BR2FpbiA9IEdFVF9MTkFfR0FJTihwQWQpOwotICAgIGlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKLSAgICB7Ci0gICAgICAgIGlmIChSc3NpTnVtYmVyID09IDApCisJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSB7CisJCWlmIChSc3NpTnVtYmVyID09IDApCiAJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDA7CiAJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKIAkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MTsKIAkJZWxzZQogCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoUnNzaU51bWJlciA9PSAwKQorCX0gZWxzZSB7CisJCWlmIChSc3NpTnVtYmVyID09IDApCiAJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQwOwogCQllbHNlIGlmIChSc3NpTnVtYmVyID09IDEpCiAJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQxOwogCQllbHNlCiAJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQyOwotICAgIH0KKwl9CiAKLSAgICByZXR1cm4gKC0xMiAtIFJzc2lPZmZzZXQgLSBMTkFHYWluIC0gUnNzaSk7CisJcmV0dXJuICgtMTIgLSBSc3NpT2Zmc2V0IC0gTE5BR2FpbiAtIFJzc2kpOwogfQogCiAvKgpAQCAtMzcxLDYzICs0NjksNzUgQEAKIAkJU2NhbiBuZXh0IGNoYW5uZWwKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIFNjYW5OZXh0Q2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3ZvaWQgU2Nhbk5leHRDaGFubmVsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlIRUFERVJfODAyXzExICAgSGRyODAyMTE7Ci0JUFVDSEFSICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOwotCVVMT05HICAgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JVUNIQVIgICAgICAgICAgIFNzaWRMZW4gPSAwLCBTY2FuVHlwZSA9IHBBZC0+TWxtZUF1eC5TY2FuVHlwZSwgQkJQVmFsdWUgPSAwOwotCVVTSE9SVCAgICAgICAgICBTdGF0dXM7Ci0JUEhFQURFUl84MDJfMTEgIHBIZHI4MDIxMTsKLQlVSU5UCQkJU2NhblRpbWVJbjVnQ2hhbm5lbCA9IFNIT1JUX0NIQU5ORUxfVElNRTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBIZHI4MDIxMTsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbiA9IDA7CisJdTggU3NpZExlbiA9IDAsIFNjYW5UeXBlID0gcEFkLT5NbG1lQXV4LlNjYW5UeXBlLCBCQlBWYWx1ZSA9IDA7CisJdTE2IFN0YXR1czsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZHI4MDIxMTsKKwl1MzIgU2NhblRpbWVJbjVnQ2hhbm5lbCA9IFNIT1JUX0NIQU5ORUxfVElNRTsKIAotCWlmIChNT05JVE9SX09OKHBBZCkpCi0JCXJldHVybjsKLQotCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA9PSAwKQogCXsKKwkJaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJCXJldHVybjsKKwl9CisKKwlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPT0gMCkgewogCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKLQkJCSYmIChJTkZSQV9PTihwQWQpCi0JCQkJfHwgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkpCi0JCQkpCi0JCXsKLQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJICAgICYmIChJTkZSQV9PTihwQWQpCisJCQl8fCAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKSkKKwkJICAgICkgeworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwKKwkJCQkJICBGQUxTRSk7CiAJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CiAJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CiAJCQlCQlBWYWx1ZSAmPSAofjB4MTgpOwogCQkJQkJQVmFsdWUgfD0gMHgxMDsKIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byA0ME1IeiBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOwotCQl9Ci0JCWVsc2UKLQkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiU1lOQyAtIEVuZCBvZiBTQ0FOLCByZXN0b3JlIHRvIDQwTUh6IGNoYW5uZWwgJWQsIFRvdGFsIEJTU1slMDJkXVxuIiwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLAorCQkJCSAgcEFkLT5TY2FuVGFiLkJzc05yKSk7CisJCX0gZWxzZSB7CiAJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKIAkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEVuZCBvZiBTQ0FOLCByZXN0b3JlIHRvIGNoYW5uZWwgJWQsIFRvdGFsIEJTU1slMDJkXVxuIixwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIsCisJCQkJICBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKIAkJfQogCiAJCXsKLQkJCS8vCi0JCQkvLyBUbyBwcmV2ZW50IGRhdGEgbG9zdC4KLQkJCS8vIFNlbmQgYW4gTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb24gdG8gY3VycmVudCBhc3NvY2lhdGVkIEFQIGJlZm9yZSBTQ0FOIHByb2dyZXNzLgotCQkJLy8gTm93LCB3ZSBuZWVkIHRvIHNlbmQgYW4gTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb2ZmIHRvIEFQLCB3aGVuIHNjYW4gcHJvZ3Jlc3MgZG9uZQotCQkJLy8KLQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkgJiYgKElORlJBX09OKHBBZCkpKQotCQkJewotCQkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOwotCQkJCWlmIChOU3RhdHVzCT09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQkJewotCQkJCQlwSGRyODAyMTEgPSAoUEhFQURFUl84MDJfMTEpIHBPdXRCdWZmZXI7Ci0JCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwSGRyODAyMTEsIFNVQlRZUEVfTlVMTF9GVU5DLCAxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJLyogKi8KKwkJCS8qIFRvIHByZXZlbnQgZGF0YSBsb3N0LiAqLworCQkJLyogU2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvbiB0byBjdXJyZW50IGFzc29jaWF0ZWQgQVAgYmVmb3JlIFNDQU4gcHJvZ3Jlc3MuICovCisJCQkvKiBOb3csIHdlIG5lZWQgdG8gc2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvZmYgdG8gQVAsIHdoZW4gc2NhbiBwcm9ncmVzcyBkb25lICovCisJCQkvKiAqLworCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRworCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQorCQkJICAgICYmIChJTkZSQV9PTihwQWQpKSkgeworCQkJCU5TdGF0dXMgPQorCQkJCSAgICBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLAorCQkJCQkJICAgICAgICh2b2lkICopJiBwT3V0QnVmZmVyKTsKKwkJCQlpZiAoTlN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJCXBIZHI4MDIxMSA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSBwT3V0QnVmZmVyOworCQkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcEhkcjgwMjExLAorCQkJCQkJCSBTVUJUWVBFX05VTExfRlVOQywgMSwKKwkJCQkJCQkgcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkJCQkJIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAkJCQkJcEhkcjgwMjExLT5EdXJhdGlvbiA9IDA7CiAJCQkJCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7Ci0JCQkJCXBIZHI4MDIxMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworCQkJCQlwSGRyODAyMTEtPkZDLlB3ck1nbXQgPQorCQkJCQkgICAgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSk7CiAKLQkJCQkJLy8gU2VuZCB1c2luZyBwcmlvcml0eSBxdWV1ZQotCQkJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTY2FuUmVxQWN0aW9uIC0tIFNlbmQgUFNNIERhdGEgZnJhbWVcbiIpKTsKKwkJCQkJLyogU2VuZCB1c2luZyBwcmlvcml0eSBxdWV1ZSAqLworCQkJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsCisJCQkJCQkJICBzaXplb2YKKwkJCQkJCQkgIChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIk1sbWVTY2FuUmVxQWN0aW9uIC0tIFNlbmQgUFNNIERhdGEgZnJhbWVcbiIpKTsKIAkJCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKIAkJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKIAkJCQl9CkBAIC00MzUsMTU1ICs1NDUsMTQ4IEBACiAKIAkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CiAJCQlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9DT05GLCAyLCAmU3RhdHVzKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX0NPTkYsCisJCQkJICAgIDIsICZTdGF0dXMpOwogCQl9CiAKIAkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CiAJfQotI2lmZGVmIFJUMjg3MAotCWVsc2UgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCi0JeworI2lmZGVmIFJUTVBfTUFDX1VTQgorCWVsc2UgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKQorCQkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKSB7CiAJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CiAJCU1sbWVDbnRsQ29uZmlybShwQWQsIE1UMl9TQ0FOX0NPTkYsIE1MTUVfRkFJTF9OT19SRVNPVVJDRSk7CiAJfQotI2VuZGlmIC8vIFJUMjg3MCAvLwotCWVsc2UKLQl7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisJZWxzZSB7CiAJCXsKLQkJLy8gQkJQIGFuZCBSRiBhcmUgbm90IGFjY2Vzc2libGUgaW4gUFMgbW9kZSwgd2UgaGFzIHRvIHdha2UgdGhlbSB1cCBmaXJzdAotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLSNpZmRlZiBSVDI4NjAKLQkJCQlBc2ljRm9yY2VXYWtldXAocEFkLCBGUk9NX1RYKTsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7Ci0jZW5kaWYKLQkJCS8vIGxlYXZlIFBTTSBkdXJpbmcgc2Nhbm5pbmcuIG90aGVyd2lzZSB3ZSBtYXkgbG9zdCBQcm9iZVJzcCAmIEJFQUNPTgorCQkJLyogQkJQIGFuZCBSRiBhcmUgbm90IGFjY2Vzc2libGUgaW4gUFMgbW9kZSwgd2UgaGFzIHRvIHdha2UgdGhlbSB1cCBmaXJzdCAqLworCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisKKwkJCS8qIGxlYXZlIFBTTSBkdXJpbmcgc2Nhbm5pbmcuIG90aGVyd2lzZSB3ZSBtYXkgbG9zdCBQcm9iZVJzcCAmIEJFQUNPTiAqLwogCQkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKLQkJCQlNbG1lU2V0UHNtQml0KHBBZCwgUFdSX0FDVElWRSk7CisJCQkJUlRNUF9TRVRfUFNNX0JJVChwQWQsIFBXUl9BQ1RJVkUpOwogCQl9CiAKIAkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCwgVFJVRSk7CiAJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKIAogCQl7Ci0JCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkKLQkJCXsKLQkJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpKQotCQkJCXsKKwkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KSB7CisJCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCQkJCSAgICAmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsCisJCQkJCQkJIHBBZC0+TWxtZUF1eC4KKwkJCQkJCQkgQ2hhbm5lbCkpIHsKIAkJCQkJU2NhblR5cGUgPSBTQ0FOX1BBU1NJVkU7CiAJCQkJCVNjYW5UaW1lSW41Z0NoYW5uZWwgPSBNSU5fQ0hBTk5FTF9USU1FOwogCQkJCX0KIAkJCX0KIAkJfQogCi0JCS8vR2xvYmFsIGNvdW50cnkgZG9tYWluKGNoMS0xMTphY3RpdmUgc2NhbiwgY2gxMi0xNCBwYXNzaXZlIHNjYW4pCi0JCWlmICgocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpICYmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+PSAxMikgJiYgKChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg3ZikgPT0gUkVHSU9OXzMxX0JHX0JBTkQpKQotCQl7CisJCS8qR2xvYmFsIGNvdW50cnkgZG9tYWluKGNoMS0xMTphY3RpdmUgc2NhbiwgY2gxMi0xNCBwYXNzaXZlIHNjYW4pICovCisJCWlmICgocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpICYmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+PSAxMikKKwkJICAgICYmICgocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiAmIDB4N2YpID09CisJCQlSRUdJT05fMzFfQkdfQkFORCkpIHsKIAkJCVNjYW5UeXBlID0gU0NBTl9QQVNTSVZFOwogCQl9Ci0KLQkJLy8gV2UgbmVlZCB0byBzaG9ydGVuIGFjdGl2ZSBzY2FuIHRpbWUgaW4gb3JkZXIgZm9yIFdaQyBjb25uZWN0IGlzc3VlCi0JCS8vIENobmFnZSB0aGUgY2hhbm5lbCBzY2FuIHRpbWUgZm9yIENJU0NPIHN0dWZmIGJhc2VkIG9uIGl0cyBJQVBQIGFubm91bmNlbWVudAorCQkvKiBXZSBuZWVkIHRvIHNob3J0ZW4gYWN0aXZlIHNjYW4gdGltZSBpbiBvcmRlciBmb3IgV1pDIGNvbm5lY3QgaXNzdWUgKi8KKwkJLyogQ2huYWdlIHRoZSBjaGFubmVsIHNjYW4gdGltZSBmb3IgQ0lTQ08gc3R1ZmYgYmFzZWQgb24gaXRzIElBUFAgYW5ub3VuY2VtZW50ICovCiAJCWlmIChTY2FuVHlwZSA9PSBGQVNUX1NDQU5fQUNUSVZFKQotCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBGQVNUX0FDVElWRV9TQ0FOX1RJTUUpOwotCQllbHNlIGlmICgoKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQUNUSVZFKSB8fAotCQkJCShTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX1BBU1NJVkUpIHx8Ci0JCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKSB8fAotCQkJCShTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX05PSVNFKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQotCQl7Ci0JCQlpZiAocEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgPCAyNSkKLQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lICogMik7Ci0JCQllbHNlCi0JCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSk7Ci0JCX0KLQkJZWxzZSAvLyBtdXN0IGJlIFNDQU5fUEFTU0lWRSBvciBTQ0FOX0FDVElWRQorCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAorCQkJCSAgICAgRkFTVF9BQ1RJVkVfU0NBTl9USU1FKTsKKwkJZWxzZQkJLyogbXVzdCBiZSBTQ0FOX1BBU1NJVkUgb3IgU0NBTl9BQ1RJVkUgKi8KIAkJewogCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkKLQkJCQl8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBR05fTUlYRUQpCi0JCQkpCi0JCQl7CisJCQkgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkKKwkJCSAgICB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBR05fTUlYRUQpCisJCQkgICAgKSB7CiAJCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsID4gMTQpCi0JCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgU2NhblRpbWVJbjVnQ2hhbm5lbCk7CisJCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwKKwkJCQkJCSAgICAgU2NhblRpbWVJbjVnQ2hhbm5lbCk7CiAJCQkJZWxzZQotCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgTUlOX0NIQU5ORUxfVElNRSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBNQVhfQ0hBTk5FTF9USU1FKTsKKwkJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAorCQkJCQkJICAgICBNSU5fQ0hBTk5FTF9USU1FKTsKKwkJCX0gZWxzZQorCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwKKwkJCQkJICAgICBNQVhfQ0hBTk5FTF9USU1FKTsKIAkJfQogCi0JCWlmICgoU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUpIHx8IChTY2FuVHlwZSA9PSBGQVNUX1NDQU5fQUNUSVZFKSB8fAotCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQUNUSVZFKSkKLQkJewotCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIFNjYW5OZXh0Q2hhbm5lbCgpIGFsbG9jYXRlIG1lbW9yeSBmYWlsXG4iKSk7CisJCWlmICgoU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUpCisJCSAgICB8fCAoU2NhblR5cGUgPT0gRkFTVF9TQ0FOX0FDVElWRSkKKwkJICAgICkgeworCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCQkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJTWU5DIC0gU2Nhbk5leHRDaGFubmVsKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKIAogCQkJCXsKLQkJCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwkJCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9CisJCQkJCSAgICBTWU5DX0lETEU7CiAJCQkJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKLQkJCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7CisJCQkJCU1sbWVFbnF1ZXVlKHBBZCwKKwkJCQkJCSAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJCSAgICBNVDJfU0NBTl9DT05GLCAyLCAmU3RhdHVzKTsKIAkJCQl9CiAKIAkJCQlyZXR1cm47CiAJCQl9Ci0KLQkJCS8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2VuZCBicm9hZGNhc3QgcHJvYmUgcmVxdWVzdCBpZiBhY3RpdmUgc2NhbiBpcyBpbiBlZmZlY3QuCi0JCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQUNUSVZFKSB8fCAoU2NhblR5cGUgPT0gRkFTVF9TQ0FOX0FDVElWRSkKLQkJCQkpCisJCQkvKiBUaGVyZSBpcyBubyBuZWVkIHRvIHNlbmQgYnJvYWRjYXN0IHByb2JlIHJlcXVlc3QgaWYgYWN0aXZlIHNjYW4gaXMgaW4gZWZmZWN0LiAqLworCQkJaWYgKChTY2FuVHlwZSA9PSBTQ0FOX0FDVElWRSkKKwkJCSAgICB8fCAoU2NhblR5cGUgPT0gRkFTVF9TQ0FOX0FDVElWRSkKKwkJCSAgICApCiAJCQkJU3NpZExlbiA9IHBBZC0+TWxtZUF1eC5Tc2lkTGVuOwogCQkJZWxzZQogCQkJCVNzaWRMZW4gPSAwOwogCi0JCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgQlJPQURDQVNUX0FERFIsIEJST0FEQ0FTVF9BRERSKTsKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmSGRyODAyMTEsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkTGVuLAotCQkJCQkJCSAgU3NpZExlbiwJCQkgICAgICAgIHBBZC0+TWxtZUF1eC5Tc2lkLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiwKLQkJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4sICBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZIZHI4MDIxMSwgU1VCVFlQRV9QUk9CRV9SRVEsIDAsCisJCQkJCSBCUk9BRENBU1RfQUREUiwgQlJPQURDQVNUX0FERFIpOworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgJkZyYW1lTGVuLAorCQkJCQkgIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSksICZIZHI4MDIxMSwgMSwKKwkJCQkJICAmU3NpZEllLCAxLCAmU3NpZExlbiwgU3NpZExlbiwKKwkJCQkJICBwQWQtPk1sbWVBdXguU3NpZCwgMSwgJlN1cFJhdGVJZSwgMSwKKwkJCQkJICAmcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiwKKwkJCQkJICBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuLAorCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsIEVORF9PRl9BUkdTKTsKIAotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4pCi0JCQl7Ci0JCQkJVUxPTkcgVG1wOwotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiwKLQkJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuLCAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlLAotCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuKSB7CisJCQkJdW5zaWduZWQgbG9uZyBUbXA7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmVG1wLAorCQkJCQkJICAxLCAmRXh0UmF0ZUllLAorCQkJCQkJICAxLCAmcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiwKKwkJCQkJCSAgcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiwKKwkJCQkJCSAgcEFkLT5Db21tb25DZmcuRXh0UmF0ZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOwogCQkJCUZyYW1lTGVuICs9IFRtcDsKIAkJCX0KIAotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKLQkJCXsKLQkJCQlVTE9ORwlUbXA7Ci0JCQkJVUNIQVIJSHRMZW47Ci0JCQkJVUNIQVIJQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpIHsKKwkJCQl1bnNpZ25lZCBsb25nIFRtcDsKKwkJCQl1OCBIdExlbjsKKwkJCQl1OCBCUk9BRENPTVs0XSA9IHsgMHgwLCAweDkwLCAweDRjLCAweDMzIH07CiAKLQkJCQlpZiAocEFkLT5iQnJvYWRDb21IVCA9PSBUUlVFKQotCQkJCXsKLQkJCQkJSHRMZW4gPSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuICsgNDsKKwkJCQlpZiAocEFkLT5iQnJvYWRDb21IVCA9PSBUUlVFKSB7CisJCQkJCUh0TGVuID0KKwkJCQkJICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gKyA0OwogCi0JCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgJlRtcCwKLQkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCi0JCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAotCQkJCQkJCQkJNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKLQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJCUVORF9PRl9BUkdTKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAorCQkJCQkJCSAgJlRtcCwgMSwgJldwYUllLCAxLAorCQkJCQkJCSAgJkh0TGVuLCA0LAorCQkJCQkJCSAgJkJST0FEQ09NWzBdLAorCQkJCQkJCSAgcEFkLT5NbG1lQXV4LgorCQkJCQkJCSAgSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCSAgJnBBZC0+TWxtZUF1eC4KKwkJCQkJCQkgIEh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQl9IGVsc2UgewogCQkJCQlIdExlbiA9IHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW47CiAKLQkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAotCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAotCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKLQkJCQkJCQkJCUh0TGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAotCQkJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCisJCQkJCQkJICAmVG1wLCAxLCAmSHRDYXBJZSwgMSwKKwkJCQkJCQkgICZIdExlbiwgSHRMZW4sCisJCQkJCQkJICAmcEFkLT5Db21tb25DZmcuCisJCQkJCQkJICBIdENhcGFiaWxpdHksCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CiAJCQkJfQogCQkJCUZyYW1lTGVuICs9IFRtcDsKIAkJCX0KQEAgLTU5MSwyMiArNjk0LDE4IEBACiAJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CiAJCX0KLQotCQkvLyBGb3IgU0NBTl9DSVNDT19QQVNTSVZFLCBkbyBub3RoaW5nIGFuZCBzaWxlbnRseSB3YWl0IGZvciBiZWFjb24gb3Igb3RoZXIgcHJvYmUgcmVwb25zZQorCQkvKiBGb3IgU0NBTl9DSVNDT19QQVNTSVZFLCBkbyBub3RoaW5nIGFuZCBzaWxlbnRseSB3YWl0IGZvciBiZWFjb24gb3Igb3RoZXIgcHJvYmUgcmVwb25zZSAqLwogCiAJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTQ0FOX0xJU1RFTjsKIAl9CiB9CiAKLVZPSUQgTWd0UHJvYlJlcU1hY0hlYWRlckluaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKLQlJTiBVQ0hBUiBTdWJUeXBlLAotCUlOIFVDSEFSIFRvRHMsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBQVUNIQVIgcEJzc2lkKQordm9pZCBNZ3RQcm9iUmVxTWFjSGVhZGVySW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhkcjgwMjExLAorCQkJICAgICB1OCBTdWJUeXBlLAorCQkJICAgICB1OCBUb0RzLCB1OCAqcERBLCB1OCAqcEJzc2lkKQogewotCU5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlOZGlzWmVyb01lbW9yeShwSGRyODAyMTEsIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOwogCiAJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfTUdNVDsKIAlwSGRyODAyMTEtPkZDLlN1YlR5cGUgPSBTdWJUeXBlOwpAQCAtNjE3LDUgKzcxNiwzIEBACiAJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKIAlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIHBCc3NpZCk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3RraXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV90a2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg4MWVmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV90a2lwLmMKQEAgLTAsMCArMSw4MzMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJY21tX3RraXAuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgV3UJCTAyLTI1LTAyCQlJbml0aWFsCisqLworCisjaW5jbHVkZQkiLi4vcnRfY29uZmlnLmgiCisKKy8qIFJvdGF0aW9uIGZ1bmN0aW9ucyBvbiAzMiBiaXQgdmFsdWVzICovCisjZGVmaW5lIFJPTDMyKCBBLCBuICkgXAorCSggKChBKSA8PCAobikpIHwgKCAoKEEpPj4oMzItKG4pKSkgJiAoICgxVUwgPDwgKG4pKSAtIDEgKSApICkKKyNkZWZpbmUgUk9SMzIoIEEsIG4gKSBST0wzMiggKEEpLCAzMi0obikgKQorCit1MzIgVGtpcF9TYm94X0xvd2VyWzI1Nl0gPSB7CisJMHhBNSwgMHg4NCwgMHg5OSwgMHg4RCwgMHgwRCwgMHhCRCwgMHhCMSwgMHg1NCwKKwkweDUwLCAweDAzLCAweEE5LCAweDdELCAweDE5LCAweDYyLCAweEU2LCAweDlBLAorCTB4NDUsIDB4OUQsIDB4NDAsIDB4ODcsIDB4MTUsIDB4RUIsIDB4QzksIDB4MEIsCisJMHhFQywgMHg2NywgMHhGRCwgMHhFQSwgMHhCRiwgMHhGNywgMHg5NiwgMHg1QiwKKwkweEMyLCAweDFDLCAweEFFLCAweDZBLCAweDVBLCAweDQxLCAweDAyLCAweDRGLAorCTB4NUMsIDB4RjQsIDB4MzQsIDB4MDgsIDB4OTMsIDB4NzMsIDB4NTMsIDB4M0YsCisJMHgwQywgMHg1MiwgMHg2NSwgMHg1RSwgMHgyOCwgMHhBMSwgMHgwRiwgMHhCNSwKKwkweDA5LCAweDM2LCAweDlCLCAweDNELCAweDI2LCAweDY5LCAweENELCAweDlGLAorCTB4MUIsIDB4OUUsIDB4NzQsIDB4MkUsIDB4MkQsIDB4QjIsIDB4RUUsIDB4RkIsCisJMHhGNiwgMHg0RCwgMHg2MSwgMHhDRSwgMHg3QiwgMHgzRSwgMHg3MSwgMHg5NywKKwkweEY1LCAweDY4LCAweDAwLCAweDJDLCAweDYwLCAweDFGLCAweEM4LCAweEVELAorCTB4QkUsIDB4NDYsIDB4RDksIDB4NEIsIDB4REUsIDB4RDQsIDB4RTgsIDB4NEEsCisJMHg2QiwgMHgyQSwgMHhFNSwgMHgxNiwgMHhDNSwgMHhENywgMHg1NSwgMHg5NCwKKwkweENGLCAweDEwLCAweDA2LCAweDgxLCAweEYwLCAweDQ0LCAweEJBLCAweEUzLAorCTB4RjMsIDB4RkUsIDB4QzAsIDB4OEEsIDB4QUQsIDB4QkMsIDB4NDgsIDB4MDQsCisJMHhERiwgMHhDMSwgMHg3NSwgMHg2MywgMHgzMCwgMHgxQSwgMHgwRSwgMHg2RCwKKwkweDRDLCAweDE0LCAweDM1LCAweDJGLCAweEUxLCAweEEyLCAweENDLCAweDM5LAorCTB4NTcsIDB4RjIsIDB4ODIsIDB4NDcsIDB4QUMsIDB4RTcsIDB4MkIsIDB4OTUsCisJMHhBMCwgMHg5OCwgMHhEMSwgMHg3RiwgMHg2NiwgMHg3RSwgMHhBQiwgMHg4MywKKwkweENBLCAweDI5LCAweEQzLCAweDNDLCAweDc5LCAweEUyLCAweDFELCAweDc2LAorCTB4M0IsIDB4NTYsIDB4NEUsIDB4MUUsIDB4REIsIDB4MEEsIDB4NkMsIDB4RTQsCisJMHg1RCwgMHg2RSwgMHhFRiwgMHhBNiwgMHhBOCwgMHhBNCwgMHgzNywgMHg4QiwKKwkweDMyLCAweDQzLCAweDU5LCAweEI3LCAweDhDLCAweDY0LCAweEQyLCAweEUwLAorCTB4QjQsIDB4RkEsIDB4MDcsIDB4MjUsIDB4QUYsIDB4OEUsIDB4RTksIDB4MTgsCisJMHhENSwgMHg4OCwgMHg2RiwgMHg3MiwgMHgyNCwgMHhGMSwgMHhDNywgMHg1MSwKKwkweDIzLCAweDdDLCAweDlDLCAweDIxLCAweERELCAweERDLCAweDg2LCAweDg1LAorCTB4OTAsIDB4NDIsIDB4QzQsIDB4QUEsIDB4RDgsIDB4MDUsIDB4MDEsIDB4MTIsCisJMHhBMywgMHg1RiwgMHhGOSwgMHhEMCwgMHg5MSwgMHg1OCwgMHgyNywgMHhCOSwKKwkweDM4LCAweDEzLCAweEIzLCAweDMzLCAweEJCLCAweDcwLCAweDg5LCAweEE3LAorCTB4QjYsIDB4MjIsIDB4OTIsIDB4MjAsIDB4NDksIDB4RkYsIDB4NzgsIDB4N0EsCisJMHg4RiwgMHhGOCwgMHg4MCwgMHgxNywgMHhEQSwgMHgzMSwgMHhDNiwgMHhCOCwKKwkweEMzLCAweEIwLCAweDc3LCAweDExLCAweENCLCAweEZDLCAweEQ2LCAweDNBCit9OworCit1MzIgVGtpcF9TYm94X1VwcGVyWzI1Nl0gPSB7CisJMHhDNiwgMHhGOCwgMHhFRSwgMHhGNiwgMHhGRiwgMHhENiwgMHhERSwgMHg5MSwKKwkweDYwLCAweDAyLCAweENFLCAweDU2LCAweEU3LCAweEI1LCAweDRELCAweEVDLAorCTB4OEYsIDB4MUYsIDB4ODksIDB4RkEsIDB4RUYsIDB4QjIsIDB4OEUsIDB4RkIsCisJMHg0MSwgMHhCMywgMHg1RiwgMHg0NSwgMHgyMywgMHg1MywgMHhFNCwgMHg5QiwKKwkweDc1LCAweEUxLCAweDNELCAweDRDLCAweDZDLCAweDdFLCAweEY1LCAweDgzLAorCTB4NjgsIDB4NTEsIDB4RDEsIDB4RjksIDB4RTIsIDB4QUIsIDB4NjIsIDB4MkEsCisJMHgwOCwgMHg5NSwgMHg0NiwgMHg5RCwgMHgzMCwgMHgzNywgMHgwQSwgMHgyRiwKKwkweDBFLCAweDI0LCAweDFCLCAweERGLCAweENELCAweDRFLCAweDdGLCAweEVBLAorCTB4MTIsIDB4MUQsIDB4NTgsIDB4MzQsIDB4MzYsIDB4REMsIDB4QjQsIDB4NUIsCisJMHhBNCwgMHg3NiwgMHhCNywgMHg3RCwgMHg1MiwgMHhERCwgMHg1RSwgMHgxMywKKwkweEE2LCAweEI5LCAweDAwLCAweEMxLCAweDQwLCAweEUzLCAweDc5LCAweEI2LAorCTB4RDQsIDB4OEQsIDB4NjcsIDB4NzIsIDB4OTQsIDB4OTgsIDB4QjAsIDB4ODUsCisJMHhCQiwgMHhDNSwgMHg0RiwgMHhFRCwgMHg4NiwgMHg5QSwgMHg2NiwgMHgxMSwKKwkweDhBLCAweEU5LCAweDA0LCAweEZFLCAweEEwLCAweDc4LCAweDI1LCAweDRCLAorCTB4QTIsIDB4NUQsIDB4ODAsIDB4MDUsIDB4M0YsIDB4MjEsIDB4NzAsIDB4RjEsCisJMHg2MywgMHg3NywgMHhBRiwgMHg0MiwgMHgyMCwgMHhFNSwgMHhGRCwgMHhCRiwKKwkweDgxLCAweDE4LCAweDI2LCAweEMzLCAweEJFLCAweDM1LCAweDg4LCAweDJFLAorCTB4OTMsIDB4NTUsIDB4RkMsIDB4N0EsIDB4QzgsIDB4QkEsIDB4MzIsIDB4RTYsCisJMHhDMCwgMHgxOSwgMHg5RSwgMHhBMywgMHg0NCwgMHg1NCwgMHgzQiwgMHgwQiwKKwkweDhDLCAweEM3LCAweDZCLCAweDI4LCAweEE3LCAweEJDLCAweDE2LCAweEFELAorCTB4REIsIDB4NjQsIDB4NzQsIDB4MTQsIDB4OTIsIDB4MEMsIDB4NDgsIDB4QjgsCisJMHg5RiwgMHhCRCwgMHg0MywgMHhDNCwgMHgzOSwgMHgzMSwgMHhEMywgMHhGMiwKKwkweEQ1LCAweDhCLCAweDZFLCAweERBLCAweDAxLCAweEIxLCAweDlDLCAweDQ5LAorCTB4RDgsIDB4QUMsIDB4RjMsIDB4Q0YsIDB4Q0EsIDB4RjQsIDB4NDcsIDB4MTAsCisJMHg2RiwgMHhGMCwgMHg0QSwgMHg1QywgMHgzOCwgMHg1NywgMHg3MywgMHg5NywKKwkweENCLCAweEExLCAweEU4LCAweDNFLCAweDk2LCAweDYxLCAweDBELCAweDBGLAorCTB4RTAsIDB4N0MsIDB4NzEsIDB4Q0MsIDB4OTAsIDB4MDYsIDB4RjcsIDB4MUMsCisJMHhDMiwgMHg2QSwgMHhBRSwgMHg2OSwgMHgxNywgMHg5OSwgMHgzQSwgMHgyNywKKwkweEQ5LCAweEVCLCAweDJCLCAweDIyLCAweEQyLCAweEE5LCAweDA3LCAweDMzLAorCTB4MkQsIDB4M0MsIDB4MTUsIDB4QzksIDB4ODcsIDB4QUEsIDB4NTAsIDB4QTUsCisJMHgwMywgMHg1OSwgMHgwOSwgMHgxQSwgMHg2NSwgMHhENywgMHg4NCwgMHhEMCwKKwkweDgyLCAweDI5LCAweDVBLCAweDFFLCAweDdCLCAweEE4LCAweDZELCAweDJDCit9OworCisvKiAqLworLyogRXhwYW5kZWQgSVYgZm9yIFRLSVAgZnVuY3Rpb24uICovCisvKiAqLworc3RydWN0IFBBQ0tFRCBydF90a2lwX2l2IHsKKwl1bmlvbiBQQUNLRUQgeworCQlzdHJ1Y3QgUEFDS0VEIHsKKwkJCXU4IHJjMDsKKwkJCXU4IHJjMTsKKwkJCXU4IHJjMjsKKworCQkJdW5pb24gUEFDS0VEIHsKKwkJCQlzdHJ1Y3QgUEFDS0VEIHsKKwkJCQkJdTggUnN2ZDo1OworCQkJCQl1OCBFeHRJVjoxOworCQkJCQl1OCBLZXlJRDoyOworCQkJCX0gZmllbGQ7CisJCQkJdTggQnl0ZTsKKwkJCX0gQ09OVFJPTDsKKwkJfSBmaWVsZDsKKworCQl1bnNpZ25lZCBsb25nIHdvcmQ7CisJfSBJVjE2OworCisJdW5zaWduZWQgbG9uZyBJVjMyOworfTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvbnZlcnQgZnJvbSB1OFtdIHRvIHVuc2lnbmVkIGxvbmcgaW4gYSBwb3J0YWJsZSB3YXkKKworCUFyZ3VtZW50czoKKyAgICAgIHBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordW5zaWduZWQgbG9uZyBSVE1QVGtpcEdldFVJbnQzMih1OCAqcE1JQ0tleSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlcyA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXJlcyB8PSAoKnBNSUNLZXkrKykgPDwgKDggKiBpKTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ29udmVydCBmcm9tIHVuc2lnbmVkIGxvbmcgdG8gdThbXSBpbiBhIHBvcnRhYmxlIHdheQorCisJQXJndW1lbnRzOgorICAgICAgcERzdAkJCXBvaW50ZXIgdG8gZGVzdGluYXRpb24gZm9yIGNvbnZlcnQgdW5zaWduZWQgbG9uZyB0byB1OFtdCisgICAgICB2YWwJCQl0aGUgdmFsdWUgZm9yIGNvbnZlcnQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QVGtpcFB1dFVJbnQzMihJTiB1OCAqcERzdCwgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCSpwRHN0KysgPSAodTgpKHZhbCAmIDB4ZmYpOworCQl2YWwgPj49IDg7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJU2V0IHRoZSBNSUMgS2V5LgorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICBwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QVGtpcFNldE1JQ0tleShzdHJ1Y3QgcnRfdGtpcF9rZXlfaW5mbyAqcFRraXAsIHU4ICpwTUlDS2V5KQoreworCS8qIFNldCB0aGUga2V5ICovCisJcFRraXAtPkswID0gUlRNUFRraXBHZXRVSW50MzIocE1JQ0tleSk7CisJcFRraXAtPksxID0gUlRNUFRraXBHZXRVSW50MzIocE1JQ0tleSArIDQpOworCS8qIGFuZCByZXNldCB0aGUgbWVzc2FnZSAqLworCXBUa2lwLT5MID0gcFRraXAtPkswOworCXBUa2lwLT5SID0gcFRraXAtPksxOworCXBUa2lwLT5uQnl0ZXNJbk0gPSAwOworCXBUa2lwLT5NID0gMDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZSB0aGUgTUlDIFZhbHVlLgorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICB1Q2hhcgkJCUFwcGVuZCB0aGlzIHVDaGFyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUFRraXBBcHBlbmRCeXRlKHN0cnVjdCBydF90a2lwX2tleV9pbmZvICpwVGtpcCwgdTggdUNoYXIpCit7CisJLyogQXBwZW5kIHRoZSBieXRlIHRvIG91ciB3b3JkLXNpemVkIGJ1ZmZlciAqLworCXBUa2lwLT5NIHw9ICh1Q2hhciA8PCAoOCAqIHBUa2lwLT5uQnl0ZXNJbk0pKTsKKwlwVGtpcC0+bkJ5dGVzSW5NKys7CisJLyogUHJvY2VzcyB0aGUgd29yZCBpZiBpdCBpcyBmdWxsLiAqLworCWlmIChwVGtpcC0+bkJ5dGVzSW5NID49IDQpIHsKKwkJcFRraXAtPkwgXj0gcFRraXAtPk07CisJCXBUa2lwLT5SIF49IFJPTDMyKHBUa2lwLT5MLCAxNyk7CisJCXBUa2lwLT5MICs9IHBUa2lwLT5SOworCQlwVGtpcC0+UiBePQorCQkgICAgKChwVGtpcC0+TCAmIDB4ZmYwMGZmMDApID4+IDgpIHwgKChwVGtpcC0+CisJCQkJCQkgICAgICAgTCAmIDB4MDBmZjAwZmYpIDw8IDgpOworCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKKwkJcFRraXAtPlIgXj0gUk9MMzIocFRraXAtPkwsIDMpOworCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKKwkJcFRraXAtPlIgXj0gUk9SMzIocFRraXAtPkwsIDIpOworCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKKwkJLyogQ2xlYXIgdGhlIGJ1ZmZlciAqLworCQlwVGtpcC0+TSA9IDA7CisJCXBUa2lwLT5uQnl0ZXNJbk0gPSAwOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZSB0aGUgTUlDIFZhbHVlLgorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICBwU3JjCQkJUG9pbnRlciB0byBzb3VyY2UgZGF0YSBmb3IgQ2FsY3VsYXRlIE1JQyBWYWx1ZQorICAgICAgTGVuCQkJSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QVGtpcEFwcGVuZChzdHJ1Y3QgcnRfdGtpcF9rZXlfaW5mbyAqcFRraXAsIHU4ICpwU3JjLCB1MzIgbkJ5dGVzKQoreworCS8qIFRoaXMgaXMgc2ltcGxlICovCisJd2hpbGUgKG5CeXRlcyA+IDApIHsKKwkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAqcFNyYysrKTsKKwkJbkJ5dGVzLS07CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJR2V0IHRoZSBNSUMgVmFsdWUuCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQl0aGUgTUlDIFZhbHVlIGlzIHN0b3JlIGluIHBBZC0+UHJpdmF0ZUluZm8uTUlDCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QVGtpcEdldE1JQyhzdHJ1Y3QgcnRfdGtpcF9rZXlfaW5mbyAqcFRraXApCit7CisJLyogQXBwZW5kIHRoZSBtaW5pbXVtIHBhZGRpbmcgKi8KKwlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDB4NWEpOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCk7CisJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwKTsKKwlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCk7CisJLyogYW5kIHRoZW4gemVyb2VzIHVudGlsIHRoZSBsZW5ndGggaXMgYSBtdWx0aXBsZSBvZiA0ICovCisJd2hpbGUgKHBUa2lwLT5uQnl0ZXNJbk0gIT0gMCkgeworCQlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDApOworCX0KKwkvKiBUaGUgYXBwZW5kQnl0ZSBmdW5jdGlvbiBoYXMgYWxyZWFkeSBjb21wdXRlZCB0aGUgcmVzdWx0LiAqLworCVJUTVBUa2lwUHV0VUludDMyKHBUa2lwLT5NSUMsIHBUa2lwLT5MKTsKKwlSVE1QVGtpcFB1dFVJbnQzMihwVGtpcC0+TUlDICsgNCwgcFRraXAtPlIpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJSW5pdCBUa2lwIGZ1bmN0aW9uLgorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBUS2V5ICAgICAgIFBvaW50ZXIgdG8gdGhlIFRlbXBvcmFsIEtleSAoVEspLCBUSyBzaGFsbCBiZSAxMjhiaXRzLgorCQlLZXlJZAkJVEsgS2V5IElECisJCXBUQQkJCVBvaW50ZXIgdG8gdHJhbnNtaXR0ZXIgYWRkcmVzcworCQlwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QSW5pdFRraXBFbmdpbmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJdTggKnBLZXksCisJCQl1OCBLZXlJZCwKKwkJCXU4ICpwVEEsCisJCQl1OCAqcE1JQ0tleSwKKwkJCXU4ICpwVFNDLCB1bnNpZ25lZCBsb25nICpwSVYxNiwgdW5zaWduZWQgbG9uZyAqcElWMzIpCit7CisJc3RydWN0IHJ0X3RraXBfaXYgdGtpcEl2OworCisJLyogUHJlcGFyZSA4IGJ5dGVzIFRLSVAgZW5jYXBzdWxhdGlvbiBmb3IgTVBEVSAqLworCU5kaXNaZXJvTWVtb3J5KCZ0a2lwSXYsIHNpemVvZihzdHJ1Y3QgcnRfdGtpcF9pdikpOworCXRraXBJdi5JVjE2LmZpZWxkLnJjMCA9ICoocFRTQyArIDEpOworCXRraXBJdi5JVjE2LmZpZWxkLnJjMSA9ICh0a2lwSXYuSVYxNi5maWVsZC5yYzAgfCAweDIwKSAmIDB4N2Y7CisJdGtpcEl2LklWMTYuZmllbGQucmMyID0gKnBUU0M7CisJdGtpcEl2LklWMTYuZmllbGQuQ09OVFJPTC5maWVsZC5FeHRJViA9IDE7CS8qIDA6IG5vbi1leHRlbmRlZCBJViwgMTogYW4gZXh0ZW5kZWQgSVYgKi8KKwl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLktleUlEID0gS2V5SWQ7CisvKiAgICAgIHRraXBJdi5JVjMyID0gKih1bnNpZ25lZCBsb25nICopKHBUU0MgKyAyKTsgKi8KKwlOZGlzTW92ZU1lbW9yeSgmdGtpcEl2LklWMzIsIChwVFNDICsgMiksIDQpOwkvKiBDb3B5IElWICovCisKKwkqcElWMTYgPSB0a2lwSXYuSVYxNi53b3JkOworCSpwSVYzMiA9IHRraXBJdi5JVjMyOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJSW5pdCBNSUMgVmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24gd2hpY2ggaW5jbHVkZSBzZXQgTUlDIGtleSAmCisJCWNhbGN1bGF0ZSBmaXJzdCAxNiBieXRlcyAoREEgKyBTQSArIHByaW9yaXR5ICsgIDApCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCisJCXBEQQkJCVBvaW50ZXIgdG8gREEgYWRkcmVzcworCQlwU0EJCQlQb2ludGVyIHRvIFNBIGFkZHJlc3MKKwkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUTVBJbml0TUlDRW5naW5lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHU4ICpwS2V5LAorCQkgICAgICAgdTggKnBEQSwKKwkJICAgICAgIHU4ICpwU0EsIHU4IFVzZXJQcmlvcml0eSwgdTggKnBNSUNLZXkpCit7CisJdW5zaWduZWQgbG9uZyBQcmlvcml0eSA9IFVzZXJQcmlvcml0eTsKKworCS8qIEluaXQgTUlDIHZhbHVlIGNhbGN1bGF0aW9uICovCisJUlRNUFRraXBTZXRNSUNLZXkoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBNSUNLZXkpOworCS8qIERBICovCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBEQSwgTUFDX0FERFJfTEVOKTsKKwkvKiBTQSAqLworCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwU0EsIE1BQ19BRERSX0xFTik7CisJLyogUHJpb3JpdHkgKyAzIGJ5dGVzIG9mIDAgKi8KKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgKHU4ICopJiBQcmlvcml0eSwgNCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb21wYXJlIE1JQyB2YWx1ZSBvZiByZWNlaXZlZCBNU0RVCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIFBsYWluIHRleHQgZGF0YQorCQlwREEJCQlQb2ludGVyIHRvIERBIGFkZHJlc3MKKwkJcFNBCQkJUG9pbnRlciB0byBTQSBhZGRyZXNzCisJCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBwbGFpbiB0ZXh0IGRhdGEgZXhjbHVkZSBNSUMgdmFsdWUKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRSAgICAgICAgTUlDIHZhbHVlIG1hdGNoZWQKKwkJRkFMU0UgICAgICAgTUlDIHZhbHVlIG1pc21hdGNoZWQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCXU4ICpwU3JjLAorCQkJCXU4ICpwREEsCisJCQkJdTggKnBTQSwKKwkJCQl1OCAqcE1JQ0tleSwKKwkJCQl1OCBVc2VyUHJpb3JpdHksIHUzMiBMZW4pCit7CisJdTggT2xkTWljWzhdOworCXVuc2lnbmVkIGxvbmcgUHJpb3JpdHkgPSBVc2VyUHJpb3JpdHk7CisKKwkvKiBJbml0IE1JQyB2YWx1ZSBjYWxjdWxhdGlvbiAqLworCVJUTVBUa2lwU2V0TUlDS2V5KCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwTUlDS2V5KTsKKwkvKiBEQSAqLworCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwREEsIE1BQ19BRERSX0xFTik7CisJLyogU0EgKi8KKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNBLCBNQUNfQUREUl9MRU4pOworCS8qIFByaW9yaXR5ICsgMyBieXRlcyBvZiAwICovCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsICh1OCAqKSYgUHJpb3JpdHksIDQpOworCisJLyogQ2FsY3VsYXRlIE1JQyB2YWx1ZSBmcm9tIHBsYWluIHRleHQgZGF0YSAqLworCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU3JjLCBMZW4pOworCisJLyogR2V0IE1JQyB2YWx1ZGUgZnJvbSByZWNlaXZlZCBmcmFtZSAqLworCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcFNyYyArIExlbiwgOCk7CisKKwkvKiBHZXQgTUlDIHZhbHVlIGZyb20gZGVjcnlwdGVkIHBsYWluIGRhdGEgKi8KKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5SeCk7CisKKwkvKiBNb3ZlIE1JQyB2YWx1ZSBmcm9tIE1TRFUsIHRoaXMgc3RlcHMgc2hvdWxkIG1vdmUgdG8gZGF0YSBwYXRoLiAqLworCS8qIFNpbmNlIHRoZSBNSUMgdmFsdWUgbWlnaHQgY3Jvc3MgTVBEVXMuICovCisJaWYgKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5Qcml2YXRlSW5mby5SeC5NSUMsIE9sZE1pYywgOCkpIHsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlKCk6IFRLSVAgTUlDIEVycm9yICFcbiIpKTsJLypNSUMgZXJyb3IuICovCisKKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCXJldHVybiAoVFJVRSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKKwlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgdHJhbnNtaXQgZnVuY3Rpb24KKworCUFyZ3VtZW50czoKKwkJcEFkCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXZvaWQgKglQb2ludGVyIHRvIE5kaXMgUGFja2V0IGZvciBNSUMgY2FsY3VsYXRpb24KKwkJcEVuY2FwCQkJUG9pbnRlciB0byBMTEMgZW5jYXAgZGF0YQorCQlMZW5FbmNhcAkJVG90YWwgZW5jYXAgbGVuZ3RoLCBtaWdodCBiZSAwIHdoaWNoIGluZGljYXRlcyBubyBlbmNhcAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUTVBDYWxjdWxhdGVNSUNWYWx1ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB2b2lkICpwUGFja2V0LAorCQkJICAgdTggKnBFbmNhcCwKKwkJCSAgIHN0cnVjdCBydF9jaXBoZXJfa2V5ICpwS2V5LCB1OCBhcGlkeCkKK3sKKwlzdHJ1Y3QgcnRfcGFja2V0X2luZm8gUGFja2V0SW5mbzsKKwl1OCAqcFNyY0J1ZlZBOworCXUzMiBTcmNCdWZMZW47CisJdTggKnBTcmM7CisJdTggVXNlclByaW9yaXR5OworCXU4IHZsYW5fb2Zmc2V0ID0gMDsKKworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKKworCVVzZXJQcmlvcml0eSA9IFJUTVBfR0VUX1BBQ0tFVF9VUChwUGFja2V0KTsKKwlwU3JjID0gcFNyY0J1ZlZBOworCisJLyogZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSB2bGFuIHBhY2tldCAqLworCWlmICgoKCoocFNyYyArIDEyKSA8PCA4KSArICoocFNyYyArIDEzKSkgPT0gMHg4MTAwKQorCQl2bGFuX29mZnNldCA9IDQ7CisKKwl7CisJCVJUTVBJbml0TUlDRW5naW5lKHBBZCwKKwkJCQkgIHBLZXktPktleSwKKwkJCQkgIHBTcmMsIHBTcmMgKyA2LCBVc2VyUHJpb3JpdHksIHBLZXktPlR4TWljKTsKKwl9CisKKwlpZiAocEVuY2FwICE9IE5VTEwpIHsKKwkJLyogTExDIGVuY2Fwc3VsYXRpb24gKi8KKwkJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBFbmNhcCwgNik7CisJCS8qIFByb3RvY29sIFR5cGUgKi8KKwkJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBTcmMgKyAxMiArIHZsYW5fb2Zmc2V0LAorCQkJICAgICAgIDIpOworCX0KKwlTcmNCdWZMZW4gLT0gKDE0ICsgdmxhbl9vZmZzZXQpOworCXBTcmMgKz0gKDE0ICsgdmxhbl9vZmZzZXQpOworCWRvIHsKKwkJaWYgKFNyY0J1ZkxlbiA+IDApIHsKKwkJCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwU3JjLCBTcmNCdWZMZW4pOworCQl9CisKKwkJYnJlYWs7CQkvKiBObyBuZWVkIGhhbmRsZSBuZXh0IHBhY2tldCAqLworCisJfSB3aGlsZSAoVFJVRSk7CQkvKiBFbmQgb2YgY29weWluZyBwYXlsb2FkICovCisKKwkvKiBDb21wdXRlIHRoZSBmaW5hbCBNSUMgVmFsdWUgKi8KKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB0a2lwX3Nib3goKQkJCQkJCQkJCQkJCQkJCQkqLworLyogUmV0dXJucyBhIDE2IGJpdCB2YWx1ZSBmcm9tIGEgNjRLIGVudHJ5IHRhYmxlLiBUaGUgVGFibGUgKi8KKy8qIGlzIHN5bnRoZXNpemVkIGZyb20gdHdvIDI1NiBlbnRyeSBieXRlIHdpZGUgdGFibGVzLgkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3UzMiB0a2lwX3Nib3godTMyIGluZGV4KQoreworCXUzMiBpbmRleF9sb3c7CisJdTMyIGluZGV4X2hpZ2g7CisJdTMyIGxlZnQsIHJpZ2h0OworCisJaW5kZXhfbG93ID0gKGluZGV4ICUgMjU2KTsKKwlpbmRleF9oaWdoID0gKChpbmRleCA+PiA4KSAlIDI1Nik7CisKKwlsZWZ0ID0gVGtpcF9TYm94X0xvd2VyW2luZGV4X2xvd10gKyAoVGtpcF9TYm94X1VwcGVyW2luZGV4X2xvd10gKiAyNTYpOworCXJpZ2h0ID0KKwkgICAgVGtpcF9TYm94X1VwcGVyW2luZGV4X2hpZ2hdICsgKFRraXBfU2JveF9Mb3dlcltpbmRleF9oaWdoXSAqIDI1Nik7CisKKwlyZXR1cm4gKGxlZnQgXiByaWdodCk7Cit9CisKK3UzMiByb3RyMSh1MzIgYSkKK3sKKwl1bnNpZ25lZCBpbnQgYjsKKworCWlmICgoYSAmIDB4MDEpID09IDB4MDEpIHsKKwkJYiA9IChhID4+IDEpIHwgMHg4MDAwOworCX0gZWxzZSB7CisJCWIgPSAoYSA+PiAxKSAmIDB4N2ZmZjsKKwl9CisJYiA9IGIgJSA2NTUzNjsKKwlyZXR1cm4gYjsKK30KKwordm9pZCBSVE1QVGtpcE1peEtleSh1OCAqIGtleSwgdTggKiB0YSwgdW5zaWduZWQgbG9uZyBwbmwsCS8qIExlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgb2YgUE4gKi8KKwkJICAgIHVuc2lnbmVkIGxvbmcgcG5oLAkvKiBNb3N0IHNpZ25pZmljYW50IDMyIGJpdHMgb2YgUE4gKi8KKwkJICAgIHU4ICogcmM0a2V5LCB1MzIgKiBwMWspCit7CisKKwl1MzIgdHNjMDsKKwl1MzIgdHNjMTsKKwl1MzIgdHNjMjsKKworCXUzMiBwcGswOworCXUzMiBwcGsxOworCXUzMiBwcGsyOworCXUzMiBwcGszOworCXUzMiBwcGs0OworCXUzMiBwcGs1OworCisJaW50IGk7CisJaW50IGo7CisKKwl0c2MwID0gKHVuc2lnbmVkIGludCkoKHBuaCA+PiAxNikgJSA2NTUzNik7CS8qIG1zYiAqLworCXRzYzEgPSAodW5zaWduZWQgaW50KShwbmggJSA2NTUzNik7CisJdHNjMiA9ICh1bnNpZ25lZCBpbnQpKHBubCAlIDY1NTM2KTsJLyogbHNiICovCisKKwkvKiBQaGFzZSAxLCBzdGVwIDEgKi8KKwlwMWtbMF0gPSB0c2MxOworCXAxa1sxXSA9IHRzYzA7CisJcDFrWzJdID0gKHUzMikodGFbMF0gKyAodGFbMV0gKiAyNTYpKTsKKwlwMWtbM10gPSAodTMyKSh0YVsyXSArICh0YVszXSAqIDI1NikpOworCXAxa1s0XSA9ICh1MzIpKHRhWzRdICsgKHRhWzVdICogMjU2KSk7CisKKwkvKiBQaGFzZSAxLCBzdGVwIDIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWogPSAyICogKGkgJiAxKTsKKwkJcDFrWzBdID0KKwkJICAgIChwMWtbMF0gKworCQkgICAgIHRraXBfc2JveCgocDFrWzRdIF4gKCgyNTYgKiBrZXlbMSArIGpdKSArIGtleVtqXSkpICUKKwkJCSAgICAgICA2NTUzNikpICUgNjU1MzY7CisJCXAxa1sxXSA9CisJCSAgICAocDFrWzFdICsKKwkJICAgICB0a2lwX3Nib3goKHAxa1swXSBeICgoMjU2ICoga2V5WzUgKyBqXSkgKyBrZXlbNCArIGpdKSkgJQorCQkJICAgICAgIDY1NTM2KSkgJSA2NTUzNjsKKwkJcDFrWzJdID0KKwkJICAgIChwMWtbMl0gKworCQkgICAgIHRraXBfc2JveCgocDFrWzFdIF4gKCgyNTYgKiBrZXlbOSArIGpdKSArIGtleVs4ICsgal0pKSAlCisJCQkgICAgICAgNjU1MzYpKSAlIDY1NTM2OworCQlwMWtbM10gPQorCQkgICAgKHAxa1szXSArCisJCSAgICAgdGtpcF9zYm94KChwMWtbMl0gXiAoKDI1NiAqIGtleVsxMyArIGpdKSArIGtleVsxMiArIGpdKSkgJQorCQkJICAgICAgIDY1NTM2KSkgJSA2NTUzNjsKKwkJcDFrWzRdID0KKwkJICAgIChwMWtbNF0gKworCQkgICAgIHRraXBfc2JveCgocDFrWzNdIF4gKCgoMjU2ICoga2V5WzEgKyBqXSkgKyBrZXlbal0pKSkgJQorCQkJICAgICAgIDY1NTM2KSkgJSA2NTUzNjsKKwkJcDFrWzRdID0gKHAxa1s0XSArIGkpICUgNjU1MzY7CisJfQorCisJLyogUGhhc2UgMiwgU3RlcCAxICovCisJcHBrMCA9IHAxa1swXTsKKwlwcGsxID0gcDFrWzFdOworCXBwazIgPSBwMWtbMl07CisJcHBrMyA9IHAxa1szXTsKKwlwcGs0ID0gcDFrWzRdOworCXBwazUgPSAocDFrWzRdICsgdHNjMikgJSA2NTUzNjsKKworCS8qIFBoYXNlMiwgU3RlcCAyICovCisJcHBrMCA9IHBwazAgKyB0a2lwX3Nib3goKHBwazUgXiAoKDI1NiAqIGtleVsxXSkgKyBrZXlbMF0pKSAlIDY1NTM2KTsKKwlwcGsxID0gcHBrMSArIHRraXBfc2JveCgocHBrMCBeICgoMjU2ICoga2V5WzNdKSArIGtleVsyXSkpICUgNjU1MzYpOworCXBwazIgPSBwcGsyICsgdGtpcF9zYm94KChwcGsxIF4gKCgyNTYgKiBrZXlbNV0pICsga2V5WzRdKSkgJSA2NTUzNik7CisJcHBrMyA9IHBwazMgKyB0a2lwX3Nib3goKHBwazIgXiAoKDI1NiAqIGtleVs3XSkgKyBrZXlbNl0pKSAlIDY1NTM2KTsKKwlwcGs0ID0gcHBrNCArIHRraXBfc2JveCgocHBrMyBeICgoMjU2ICoga2V5WzldKSArIGtleVs4XSkpICUgNjU1MzYpOworCXBwazUgPSBwcGs1ICsgdGtpcF9zYm94KChwcGs0IF4gKCgyNTYgKiBrZXlbMTFdKSArIGtleVsxMF0pKSAlIDY1NTM2KTsKKworCXBwazAgPSBwcGswICsgcm90cjEocHBrNSBeICgoMjU2ICoga2V5WzEzXSkgKyBrZXlbMTJdKSk7CisJcHBrMSA9IHBwazEgKyByb3RyMShwcGswIF4gKCgyNTYgKiBrZXlbMTVdKSArIGtleVsxNF0pKTsKKwlwcGsyID0gcHBrMiArIHJvdHIxKHBwazEpOworCXBwazMgPSBwcGszICsgcm90cjEocHBrMik7CisJcHBrNCA9IHBwazQgKyByb3RyMShwcGszKTsKKwlwcGs1ID0gcHBrNSArIHJvdHIxKHBwazQpOworCisJLyogUGhhc2UgMiwgU3RlcCAzICovCisJLyogUGhhc2UgMiwgU3RlcCAzICovCisKKwl0c2MwID0gKHVuc2lnbmVkIGludCkoKHBuaCA+PiAxNikgJSA2NTUzNik7CS8qIG1zYiAqLworCXRzYzEgPSAodW5zaWduZWQgaW50KShwbmggJSA2NTUzNik7CisJdHNjMiA9ICh1bnNpZ25lZCBpbnQpKHBubCAlIDY1NTM2KTsJLyogbHNiICovCisKKwlyYzRrZXlbMF0gPSAodHNjMiA+PiA4KSAlIDI1NjsKKwlyYzRrZXlbMV0gPSAoKCh0c2MyID4+IDgpICUgMjU2KSB8IDB4MjApICYgMHg3ZjsKKwlyYzRrZXlbMl0gPSB0c2MyICUgMjU2OworCXJjNGtleVszXSA9ICgocHBrNSBeICgoMjU2ICoga2V5WzFdKSArIGtleVswXSkpID4+IDEpICUgMjU2OworCisJcmM0a2V5WzRdID0gcHBrMCAlIDI1NjsKKwlyYzRrZXlbNV0gPSAocHBrMCA+PiA4KSAlIDI1NjsKKworCXJjNGtleVs2XSA9IHBwazEgJSAyNTY7CisJcmM0a2V5WzddID0gKHBwazEgPj4gOCkgJSAyNTY7CisKKwlyYzRrZXlbOF0gPSBwcGsyICUgMjU2OworCXJjNGtleVs5XSA9IChwcGsyID4+IDgpICUgMjU2OworCisJcmM0a2V5WzEwXSA9IHBwazMgJSAyNTY7CisJcmM0a2V5WzExXSA9IChwcGszID4+IDgpICUgMjU2OworCisJcmM0a2V5WzEyXSA9IHBwazQgJSAyNTY7CisJcmM0a2V5WzEzXSA9IChwcGs0ID4+IDgpICUgMjU2OworCisJcmM0a2V5WzE0XSA9IHBwazUgJSAyNTY7CisJcmM0a2V5WzE1XSA9IChwcGs1ID4+IDgpICUgMjU2OworfQorCisvKiAqLworLyogVFJVRTogU3VjY2VzcyEgKi8KKy8qIEZBTFNFOiBEZWNyeXB0IEVycm9yISAqLworLyogKi8KK0JPT0xFQU4gUlRNUFNvZnREZWNyeXB0VEtJUChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgdTggKnBEYXRhLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgRGF0YUJ5dGVDbnQsCisJCQkgICAgdTggVXNlclByaW9yaXR5LCBzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcFdwYUtleSkKK3sKKwl1OCBLZXlJRDsKKwl1MzIgSGVhZGVyTGVuOworCXU4IGZjMDsKKwl1OCBmYzE7CisJdTE2IGZjOworCXUzMiBmcmFtZV90eXBlOworCXUzMiBmcmFtZV9zdWJ0eXBlOworCXUzMiBmcm9tX2RzOworCXUzMiB0b19kczsKKwlpbnQgYTRfZXhpc3RzOworCWludCBxY19leGlzdHM7CisJdTE2IGR1cmF0aW9uOworCXUxNiBzZXFfY29udHJvbDsKKwl1MTYgcW9zX2NvbnRyb2w7CisJdTggVEFbTUFDX0FERFJfTEVOXTsKKwl1OCBEQVtNQUNfQUREUl9MRU5dOworCXU4IFNBW01BQ19BRERSX0xFTl07CisJdTggUkM0S2V5WzE2XTsKKwl1MzIgcDFrWzVdOwkJLypmb3IgbWl4X2tleTsgKi8KKwl1bnNpZ25lZCBsb25nIHBubDsJCS8qIExlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgb2YgUE4gKi8KKwl1bnNpZ25lZCBsb25nIHBuaDsJCS8qIE1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBQTiAqLworCXUzMiBudW1fYmxvY2tzOworCXUzMiBwYXlsb2FkX3JlbWFpbmRlcjsKKwlzdHJ1Y3QgcnRfYXJjZm91cmNvbnRleHQgQXJjRm91ckNvbnRleHQ7CisJdTMyIGNyYzMyID0gMDsKKwl1MzIgdHJhaWxmY3MgPSAwOworCXU4IE1JQ1s4XTsKKwl1OCBUcmFpbE1JQ1s4XTsKKworCWZjMCA9ICpwRGF0YTsKKwlmYzEgPSAqKHBEYXRhICsgMSk7CisKKwlmYyA9ICooKHUxNiAqKXBEYXRhKTsKKworCWZyYW1lX3R5cGUgPSAoKGZjMCA+PiAyKSAmIDB4MDMpOworCWZyYW1lX3N1YnR5cGUgPSAoKGZjMCA+PiA0KSAmIDB4MGYpOworCisJZnJvbV9kcyA9IChmYzEgJiAweDIpID4+IDE7CisJdG9fZHMgPSAoZmMxICYgMHgxKTsKKworCWE0X2V4aXN0cyA9IChmcm9tX2RzICYgdG9fZHMpOworCXFjX2V4aXN0cyA9ICgoZnJhbWVfc3VidHlwZSA9PSAweDA4KSB8fAkvKiBBc3N1bWVkIFFvUyBzdWJ0eXBlcyAqLworCQkgICAgIChmcmFtZV9zdWJ0eXBlID09IDB4MDkpIHx8CS8qIExpa2VseSB0byBjaGFuZ2UuICAgICovCisJCSAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYSkgfHwgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYikKKwkgICAgKTsKKworCUhlYWRlckxlbiA9IDI0OworCWlmIChhNF9leGlzdHMpCisJCUhlYWRlckxlbiArPSA2OworCisJS2V5SUQgPSAqKCh1OCAqKShwRGF0YSArIEhlYWRlckxlbiArIDMpKTsKKwlLZXlJRCA9IEtleUlEID4+IDY7CisKKwlpZiAocFdwYUtleVtLZXlJRF0uS2V5TGVuID09IDApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSVE1QU29mdERlY3J5cHRUS0lQIGZhaWxlZCEoS2V5SURbJWRdIExlbmd0aCBjYW4gbm90IGJlIDApXG4iLAorCQkJICBLZXlJRCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJZHVyYXRpb24gPSAqKCh1MTYgKikocERhdGEgKyAyKSk7CisKKwlzZXFfY29udHJvbCA9ICooKHUxNiAqKShwRGF0YSArIDIyKSk7CisKKwlpZiAocWNfZXhpc3RzKSB7CisJCWlmIChhNF9leGlzdHMpIHsKKwkJCXFvc19jb250cm9sID0gKigodTE2ICopKHBEYXRhICsgMzApKTsKKwkJfSBlbHNlIHsKKwkJCXFvc19jb250cm9sID0gKigodTE2ICopKHBEYXRhICsgMjQpKTsKKwkJfQorCX0KKworCWlmICh0b19kcyA9PSAwICYmIGZyb21fZHMgPT0gMSkgeworCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGEgKyA0LCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGEgKyAxNiwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoVEEsIHBEYXRhICsgMTAsIE1BQ19BRERSX0xFTik7CS8qQlNTSUQgKi8KKwl9IGVsc2UgaWYgKHRvX2RzID09IDAgJiYgZnJvbV9kcyA9PSAwKSB7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSArIDEwLCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGEgKyA0LCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGEgKyAxMCwgTUFDX0FERFJfTEVOKTsKKwl9IGVsc2UgaWYgKHRvX2RzID09IDEgJiYgZnJvbV9kcyA9PSAwKSB7CisJCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSArIDEwLCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGEgKyAxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhICsgMTYsIE1BQ19BRERSX0xFTik7CisJfSBlbHNlIGlmICh0b19kcyA9PSAxICYmIGZyb21fZHMgPT0gMSkgeworCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGEgKyAxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhICsgMTYsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSArIDIyLCBNQUNfQUREUl9MRU4pOworCX0KKworCW51bV9ibG9ja3MgPSAoRGF0YUJ5dGVDbnQgLSAxNikgLyAxNjsKKwlwYXlsb2FkX3JlbWFpbmRlciA9IChEYXRhQnl0ZUNudCAtIDE2KSAlIDE2OworCisJcG5sID0gKCoocERhdGEgKyBIZWFkZXJMZW4pKSAqIDI1NiArICoocERhdGEgKyBIZWFkZXJMZW4gKyAyKTsKKwlwbmggPSAqKCh1bnNpZ25lZCBsb25nICopKHBEYXRhICsgSGVhZGVyTGVuICsgNCkpOworCXBuaCA9IGNwdTJsZTMyKHBuaCk7CisJUlRNUFRraXBNaXhLZXkocFdwYUtleVtLZXlJRF0uS2V5LCBUQSwgcG5sLCBwbmgsIFJDNEtleSwgcDFrKTsKKworCUFSQ0ZPVVJfSU5JVCgmQXJjRm91ckNvbnRleHQsIFJDNEtleSwgMTYpOworCisJQVJDRk9VUl9ERUNSWVBUKCZBcmNGb3VyQ29udGV4dCwgcERhdGEgKyBIZWFkZXJMZW4sCisJCQlwRGF0YSArIEhlYWRlckxlbiArIDgsIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCk7CisJTmRpc01vdmVNZW1vcnkoJnRyYWlsZmNzLCBwRGF0YSArIERhdGFCeXRlQ250IC0gOCAtIDQsIDQpOworCWNyYzMyID0gUlRNUF9DQUxDX0ZDUzMyKFBQUElOSVRGQ1MzMiwgcERhdGEgKyBIZWFkZXJMZW4sIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCAtIDQpOwkvKlNraXAgSVYrRUlWIDggYnl0ZXMgJiBTa2lwIGxhc3QgNCBieXRlcyhGQ1MpLiAqLworCWNyYzMyIF49IDB4ZmZmZmZmZmY7CS8qIGNvbXBsZW1lbnQgKi8KKworCWlmIChjcmMzMiAhPSBjcHUybGUzMih0cmFpbGZjcykpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNvZnREZWNyeXB0VEtJUCwgV0VQIERhdGEgSUNWIEVycm9yICFcbiIpKTsJLypJQ1YgZXJyb3IuICovCisKKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCisJTmRpc01vdmVNZW1vcnkoVHJhaWxNSUMsIHBEYXRhICsgRGF0YUJ5dGVDbnQgLSA4IC0gOCAtIDQsIDgpOworCVJUTVBJbml0TUlDRW5naW5lKHBBZCwgcFdwYUtleVtLZXlJRF0uS2V5LCBEQSwgU0EsIFVzZXJQcmlvcml0eSwKKwkJCSAgcFdwYUtleVtLZXlJRF0uUnhNaWMpOworCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwRGF0YSArIEhlYWRlckxlbiwKKwkJICAgICAgIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCAtIDEyKTsKKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7CisJTmRpc01vdmVNZW1vcnkoTUlDLCBwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQywgOCk7CisKKwlpZiAoIU5kaXNFcXVhbE1lbW9yeShNSUMsIFRyYWlsTUlDLCA4KSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVE1QU29mdERlY3J5cHRUS0lQLCBXRVAgRGF0YSBNSUMgRXJyb3IgIVxuIikpOwkvKk1JQyBlcnJvci4gKi8KKwkJLypSVE1QUmVwb3J0TWljRXJyb3IocEFkLCAmcFdwYUtleVtLZXlJRF0pOyAgICAgLy8gbWFya2VkIGJ5IEFsYmVydFkgQCAyMDA2MDYzMCAqLworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisJLypEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgIlJUTVBTb2Z0RGVjcnlwdFRLSVAgRGVjcmlwdCBkb25lIVxuIik7ICovCisJcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fd2VwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fd2VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZmODgwYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV93ZXAuYwpAQCAtMCwwICsxLDQ3MyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX3dlcC5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUGF1bCBXdQkJMTAtMjgtMDIJCUluaXRpYWwKKyovCisKKyNpbmNsdWRlCSIuLi9ydF9jb25maWcuaCIKKwordTMyIEZDU1RBQl8zMlsyNTZdID0geworCTB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4ZWUwZTYxMmMsIDB4OTkwOTUxYmEsCisJMHgwNzZkYzQxOSwgMHg3MDZhZjQ4ZiwgMHhlOTYzYTUzNSwgMHg5ZTY0OTVhMywKKwkweDBlZGI4ODMyLCAweDc5ZGNiOGE0LCAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LAorCTB4MDliNjRjMmIsIDB4N2ViMTdjYmQsIDB4ZTdiODJkMDcsIDB4OTBiZjFkOTEsCisJMHgxZGI3MTA2NCwgMHg2YWIwMjBmMiwgMHhmM2I5NzE0OCwgMHg4NGJlNDFkZSwKKwkweDFhZGFkNDdkLCAweDZkZGRlNGViLCAweGY0ZDRiNTUxLCAweDgzZDM4NWM3LAorCTB4MTM2Yzk4NTYsIDB4NjQ2YmE4YzAsIDB4ZmQ2MmY5N2EsIDB4OGE2NWM5ZWMsCisJMHgxNDAxNWM0ZiwgMHg2MzA2NmNkOSwgMHhmYTBmM2Q2MywgMHg4ZDA4MGRmNSwKKwkweDNiNmUyMGM4LCAweDRjNjkxMDVlLCAweGQ1NjA0MWU0LCAweGEyNjc3MTcyLAorCTB4M2MwM2U0ZDEsIDB4NGIwNGQ0NDcsIDB4ZDIwZDg1ZmQsIDB4YTUwYWI1NmIsCisJMHgzNWI1YThmYSwgMHg0MmIyOTg2YywgMHhkYmJiYzlkNiwgMHhhY2JjZjk0MCwKKwkweDMyZDg2Y2UzLCAweDQ1ZGY1Yzc1LCAweGRjZDYwZGNmLCAweGFiZDEzZDU5LAorCTB4MjZkOTMwYWMsIDB4NTFkZTAwM2EsIDB4YzhkNzUxODAsIDB4YmZkMDYxMTYsCisJMHgyMWI0ZjRiNSwgMHg1NmIzYzQyMywgMHhjZmJhOTU5OSwgMHhiOGJkYTUwZiwKKwkweDI4MDJiODllLCAweDVmMDU4ODA4LCAweGM2MGNkOWIyLCAweGIxMGJlOTI0LAorCTB4MmY2ZjdjODcsIDB4NTg2ODRjMTEsIDB4YzE2MTFkYWIsIDB4YjY2NjJkM2QsCisJMHg3NmRjNDE5MCwgMHgwMWRiNzEwNiwgMHg5OGQyMjBiYywgMHhlZmQ1MTAyYSwKKwkweDcxYjE4NTg5LCAweDA2YjZiNTFmLCAweDlmYmZlNGE1LCAweGU4YjhkNDMzLAorCTB4NzgwN2M5YTIsIDB4MGYwMGY5MzQsIDB4OTYwOWE4OGUsIDB4ZTEwZTk4MTgsCisJMHg3ZjZhMGRiYiwgMHgwODZkM2QyZCwgMHg5MTY0NmM5NywgMHhlNjYzNWMwMSwKKwkweDZiNmI1MWY0LCAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLAorCTB4NmMwNjk1ZWQsIDB4MWIwMWE1N2IsIDB4ODIwOGY0YzEsIDB4ZjUwZmM0NTcsCisJMHg2NWIwZDljNiwgMHgxMmI3ZTk1MCwgMHg4YmJlYjhlYSwgMHhmY2I5ODg3YywKKwkweDYyZGQxZGRmLCAweDE1ZGEyZDQ5LCAweDhjZDM3Y2YzLCAweGZiZDQ0YzY1LAorCTB4NGRiMjYxNTgsIDB4M2FiNTUxY2UsIDB4YTNiYzAwNzQsIDB4ZDRiYjMwZTIsCisJMHg0YWRmYTU0MSwgMHgzZGQ4OTVkNywgMHhhNGQxYzQ2ZCwgMHhkM2Q2ZjRmYiwKKwkweDQzNjllOTZhLCAweDM0NmVkOWZjLCAweGFkNjc4ODQ2LCAweGRhNjBiOGQwLAorCTB4NDQwNDJkNzMsIDB4MzMwMzFkZTUsIDB4YWEwYTRjNWYsIDB4ZGQwZDdjYzksCisJMHg1MDA1NzEzYywgMHgyNzAyNDFhYSwgMHhiZTBiMTAxMCwgMHhjOTBjMjA4NiwKKwkweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmLAorCTB4NWVkZWY5MGUsIDB4MjlkOWM5OTgsIDB4YjBkMDk4MjIsIDB4YzdkN2E4YjQsCisJMHg1OWIzM2QxNywgMHgyZWI0MGQ4MSwgMHhiN2JkNWMzYiwgMHhjMGJhNmNhZCwKKwkweGVkYjg4MzIwLCAweDlhYmZiM2I2LCAweDAzYjZlMjBjLCAweDc0YjFkMjlhLAorCTB4ZWFkNTQ3MzksIDB4OWRkMjc3YWYsIDB4MDRkYjI2MTUsIDB4NzNkYzE2ODMsCisJMHhlMzYzMGIxMiwgMHg5NDY0M2I4NCwgMHgwZDZkNmEzZSwgMHg3YTZhNWFhOCwKKwkweGU0MGVjZjBiLCAweDkzMDlmZjlkLCAweDBhMDBhZTI3LCAweDdkMDc5ZWIxLAorCTB4ZjAwZjkzNDQsIDB4ODcwOGEzZDIsIDB4MWUwMWYyNjgsIDB4NjkwNmMyZmUsCisJMHhmNzYyNTc1ZCwgMHg4MDY1NjdjYiwgMHgxOTZjMzY3MSwgMHg2ZTZiMDZlNywKKwkweGZlZDQxYjc2LCAweDg5ZDMyYmUwLCAweDEwZGE3YTVhLCAweDY3ZGQ0YWNjLAorCTB4ZjliOWRmNmYsIDB4OGViZWVmZjksIDB4MTdiN2JlNDMsIDB4NjBiMDhlZDUsCisJMHhkNmQ2YTNlOCwgMHhhMWQxOTM3ZSwgMHgzOGQ4YzJjNCwgMHg0ZmRmZjI1MiwKKwkweGQxYmI2N2YxLCAweGE2YmM1NzY3LCAweDNmYjUwNmRkLCAweDQ4YjIzNjRiLAorCTB4ZDgwZDJiZGEsIDB4YWYwYTFiNGMsIDB4MzYwMzRhZjYsIDB4NDEwNDdhNjAsCisJMHhkZjYwZWZjMywgMHhhODY3ZGY1NSwgMHgzMTZlOGVlZiwgMHg0NjY5YmU3OSwKKwkweGNiNjFiMzhjLCAweGJjNjY4MzFhLCAweDI1NmZkMmEwLCAweDUyNjhlMjM2LAorCTB4Y2MwYzc3OTUsIDB4YmIwYjQ3MDMsIDB4MjIwMjE2YjksIDB4NTUwNTI2MmYsCisJMHhjNWJhM2JiZSwgMHhiMmJkMGIyOCwgMHgyYmI0NWE5MiwgMHg1Y2IzNmEwNCwKKwkweGMyZDdmZmE3LCAweGI1ZDBjZjMxLCAweDJjZDk5ZThiLCAweDViZGVhZTFkLAorCTB4OWI2NGMyYjAsIDB4ZWM2M2YyMjYsIDB4NzU2YWEzOWMsIDB4MDI2ZDkzMGEsCisJMHg5YzA5MDZhOSwgMHhlYjBlMzYzZiwgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMywKKwkweDk1YmY0YTgyLCAweGUyYjg3YTE0LCAweDdiYjEyYmFlLCAweDBjYjYxYjM4LAorCTB4OTJkMjhlOWIsIDB4ZTVkNWJlMGQsIDB4N2NkY2VmYjcsIDB4MGJkYmRmMjEsCisJMHg4NmQzZDJkNCwgMHhmMWQ0ZTI0MiwgMHg2OGRkYjNmOCwgMHgxZmRhODM2ZSwKKwkweDgxYmUxNmNkLCAweGY2YjkyNjViLCAweDZmYjA3N2UxLCAweDE4Yjc0Nzc3LAorCTB4ODgwODVhZTYsIDB4ZmYwZjZhNzAsIDB4NjYwNjNiY2EsIDB4MTEwMTBiNWMsCisJMHg4ZjY1OWVmZiwgMHhmODYyYWU2OSwgMHg2MTZiZmZkMywgMHgxNjZjY2Y0NSwKKwkweGEwMGFlMjc4LCAweGQ3MGRkMmVlLCAweDRlMDQ4MzU0LCAweDM5MDNiM2MyLAorCTB4YTc2NzI2NjEsIDB4ZDA2MDE2ZjcsIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsCisJMHhhZWQxNmE0YSwgMHhkOWQ2NWFkYywgMHg0MGRmMGI2NiwgMHgzN2Q4M2JmMCwKKwkweGE5YmNhZTUzLCAweGRlYmI5ZWM1LCAweDQ3YjJjZjdmLCAweDMwYjVmZmU5LAorCTB4YmRiZGYyMWMsIDB4Y2FiYWMyOGEsIDB4NTNiMzkzMzAsIDB4MjRiNGEzYTYsCisJMHhiYWQwMzYwNSwgMHhjZGQ3MDY5MywgMHg1NGRlNTcyOSwgMHgyM2Q5NjdiZiwKKwkweGIzNjY3YTJlLCAweGM0NjE0YWI4LCAweDVkNjgxYjAyLCAweDJhNmYyYjk0LAorCTB4YjQwYmJlMzcsIDB4YzMwYzhlYTEsIDB4NWEwNWRmMWIsIDB4MmQwMmVmOGQKK307CisKKy8qCit1OCAgIFdFUEtFWVtdID0geworCQkvL0lWCisJCTB4MDAsIDB4MTEsIDB4MjIsCisJCS8vV0VQIEtFWQorCQkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweENDCisJfTsKKyAqLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJSW5pdCBXRVAgZnVuY3Rpb24uCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEtleSAgICAgICAgUG9pbnRlciB0byB0aGUgV0VQIEtFWQorCQlLZXlJZAkJICAgV0VQIEtleSBJRAorCQlLZXlMZW4gICAgICB0aGUgbGVuZ3RoIG9mIFdFUCBLRVkKKwkJcERlc3QgICAgICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gd2hpY2ggRW5jcnlwdGlvbiBkYXRhIHdpbGwgc3RvcmUgaW4uCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUEluaXRXZXBFbmdpbmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgdTggKnBLZXksCisJCSAgICAgICB1OCBLZXlJZCwgdTggS2V5TGVuLCBJTiB1OCAqcERlc3QpCit7CisJdTMyIGk7CisJdTggV0VQS0VZW10gPSB7CisJCS8qSVYgKi8KKwkJMHgwMCwgMHgxMSwgMHgyMiwKKwkJLypXRVAgS0VZICovCisJCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksCisJCSAgICAweEFBLCAweEJCLCAweENDCisJfTsKKworCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPSBQUFBJTklURkNTMzI7CS8qSW5pdCBjcmMzMi4gKi8KKworCXsKKwkJTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEtleSwgS2V5TGVuKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJV0VQS0VZW2ldID0gUmFuZG9tQnl0ZShwQWQpOwkvKkNhbGwgbWxtZSBSYW5kb21CeXRlKCkgZnVuY3Rpb24uICovCisJCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBXRVBLRVksIEtleUxlbiArIDMpOwkvKklOSVQgU0JPWCwgS0VZTEVOKzMoSVYpICovCisKKwkJTmRpc01vdmVNZW1vcnkocERlc3QsIFdFUEtFWSwgMyk7CS8qQXBwZW5kIEluaXQgVmVjdG9yICovCisJfQorCSoocERlc3QgKyAzKSA9IChLZXlJZCA8PCA2KTsJLypBcHBlbmQgS0VZSUQgKi8KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJRW5jcnlwdCB0cmFuc2ltaXR0ZWQgZGF0YQorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSB0cmFuc2ltaXR0ZWQgc291cmNlIGRhdGEgdGhhdCB3aWxsIGJlIGVuY3J5cHQKKyAgICAgIHBEZXN0ICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHdoZXJlIGVudHJ5cHRpb24gZGF0YSB3aWxsIGJlIHN0b3JlIGluLgorICAgICAgTGVuCQkJSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlIGRhdGEKKworCVJldHVybiBWYWx1ZToKKyAgICAgIE5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUEVuY3J5cHREYXRhKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICB1OCAqcFNyYywgdTggKnBEZXN0LCB1MzIgTGVuKQoreworCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPQorCSAgICBSVE1QX0NBTENfRkNTMzIocEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiwgcFNyYywgTGVuKTsKKwlBUkNGT1VSX0VOQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcERlc3QsIHBTcmMsIExlbik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlEZWNyeXB0IHJlY2VpdmVkIFdFUCBkYXRhCisKKwlBcmd1bWVudHM6CisJCXBBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIGRhdGEKKwkJTGVuICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgZGF0YQorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFICAgICAgICBEZWNyeXB0IFdFUCBkYXRhIHN1Y2Nlc3MKKwkJRkFMU0UgICAgICAgRGVjcnlwdCBXRVAgZGF0YSBmYWlsZWQKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUTVBTb2Z0RGVjcnlwdFdFUChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1OCAqcERhdGEsCisJCQkgICB1bnNpZ25lZCBsb25nIERhdGFCeXRlQ250LCBzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcEdyb3VwS2V5KQoreworCXUzMiB0cmFpbGZjczsKKwl1MzIgY3JjMzI7CisJdTggS2V5SWR4OworCXU4IFdFUEtFWVtdID0geworCQkvKklWICovCisJCTB4MDAsIDB4MTEsIDB4MjIsCisJCS8qV0VQIEtFWSAqLworCQkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LAorCQkgICAgMHhBQSwgMHhCQiwgMHhDQworCX07CisJdTggKnBQYXlsb2FkID0gKHU4ICopIHBEYXRhICsgTEVOR1RIXzgwMl8xMTsKKwl1bnNpZ25lZCBsb25nIHBheWxvYWRfbGVuID0gRGF0YUJ5dGVDbnQgLSBMRU5HVEhfODAyXzExOworCisJTmRpc01vdmVNZW1vcnkoV0VQS0VZLCBwUGF5bG9hZCwgMyk7CS8qR2V0IFdFUCBJViAqLworCisJS2V5SWR4ID0gKCoocFBheWxvYWQgKyAzKSAmIDB4YzApID4+IDY7CisJaWYgKHBHcm91cEtleVtLZXlJZHhdLktleUxlbiA9PSAwKQorCQlyZXR1cm4gKEZBTFNFKTsKKworCU5kaXNNb3ZlTWVtb3J5KFdFUEtFWSArIDMsIHBHcm91cEtleVtLZXlJZHhdLktleSwKKwkJICAgICAgIHBHcm91cEtleVtLZXlJZHhdLktleUxlbik7CisJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIFdFUEtFWSwKKwkJICAgICBwR3JvdXBLZXlbS2V5SWR4XS5LZXlMZW4gKyAzKTsKKwlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcFBheWxvYWQsIHBQYXlsb2FkICsgNCwKKwkJCXBheWxvYWRfbGVuIC0gNCk7CisJTmRpc01vdmVNZW1vcnkoJnRyYWlsZmNzLCBwUGF5bG9hZCArIHBheWxvYWRfbGVuIC0gOCwgNCk7CisJY3JjMzIgPSBSVE1QX0NBTENfRkNTMzIoUFBQSU5JVEZDUzMyLCBwUGF5bG9hZCwgcGF5bG9hZF9sZW4gLSA4KTsJLypTa2lwIGxhc3QgNCBieXRlcyhGQ1MpLiAqLworCWNyYzMyIF49IDB4ZmZmZmZmZmY7CS8qIGNvbXBsZW1lbnQgKi8KKworCWlmIChjcmMzMiAhPSBjcHUybGUzMih0cmFpbGZjcykpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV0VQIERhdGEgQ1JDIEVycm9yIVxuIikpOwkvKkNSQyBlcnJvci4gKi8KKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCXJldHVybiAoVFJVRSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobSAic3RydWN0IHJ0X2FyY2ZvdXIiIGluaXRpYWxpemUKKworCUFyZ3VtZW50czoKKwkgICBDdHggICAgICAgICBQb2ludGVyIHRvIHN0cnVjdCBydF9hcmNmb3VyIENPTlRFWFQgKFNCT1gpCisJCXBLZXkgICAgICAgIFBvaW50ZXIgdG8gdGhlIFdFUCBLRVkKKwkJS2V5TGVuICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBmbyB0aGUgV0VQIEtFWQorCisJUmV0dXJuIFZhbHVlOgorCSAgIE5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgQVJDRk9VUl9JTklUKHN0cnVjdCBydF9hcmNmb3VyY29udGV4dCAqQ3R4LCB1OCAqcEtleSwgdTMyIEtleUxlbikKK3sKKwl1OCB0LCB1OworCXUzMiBrZXlpbmRleDsKKwl1MzIgc3RhdGVpbmRleDsKKwl1OCAqc3RhdGU7CisJdTMyIGNvdW50ZXI7CisKKwlzdGF0ZSA9IEN0eC0+U1RBVEU7CisJQ3R4LT5YID0gMDsKKwlDdHgtPlkgPSAwOworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCAyNTY7IGNvdW50ZXIrKykKKwkJc3RhdGVbY291bnRlcl0gPSAodTgpY291bnRlcjsKKwlrZXlpbmRleCA9IDA7CisJc3RhdGVpbmRleCA9IDA7CisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IDI1NjsgY291bnRlcisrKSB7CisJCXQgPSBzdGF0ZVtjb3VudGVyXTsKKwkJc3RhdGVpbmRleCA9IChzdGF0ZWluZGV4ICsgcEtleVtrZXlpbmRleF0gKyB0KSAmIDB4ZmY7CisJCXUgPSBzdGF0ZVtzdGF0ZWluZGV4XTsKKwkJc3RhdGVbc3RhdGVpbmRleF0gPSB0OworCQlzdGF0ZVtjb3VudGVyXSA9IHU7CisJCWlmICgrK2tleWluZGV4ID49IEtleUxlbikKKwkJCWtleWluZGV4ID0gMDsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlHZXQgYnl0ZXMgZnJvbSBzdHJ1Y3QgcnRfYXJjZm91ciBDT05URVhUIChTLUJPWCkKKworCUFyZ3VtZW50czoKKwkgICBDdHggICAgICAgICBQb2ludGVyIHRvIHN0cnVjdCBydF9hcmNmb3VyIENPTlRFWFQgKFNCT1gpCisKKwlSZXR1cm4gVmFsdWU6CisJICAgdTggIC0gdGhlIHZhbHVlIG9mIHRoZSBzdHJ1Y3QgcnRfYXJjZm91ciBDT05URVhUIChTLUJPWCkKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit1OCBBUkNGT1VSX0JZVEUoc3RydWN0IHJ0X2FyY2ZvdXJjb250ZXh0ICpDdHgpCit7CisJdTMyIHg7CisJdTMyIHk7CisJdTggc3gsIHN5OworCXU4ICpzdGF0ZTsKKworCXN0YXRlID0gQ3R4LT5TVEFURTsKKwl4ID0gKEN0eC0+WCArIDEpICYgMHhmZjsKKwlzeCA9IHN0YXRlW3hdOworCXkgPSAoc3ggKyBDdHgtPlkpICYgMHhmZjsKKwlzeSA9IHN0YXRlW3ldOworCUN0eC0+WCA9IHg7CisJQ3R4LT5ZID0geTsKKwlzdGF0ZVt5XSA9IHN4OworCXN0YXRlW3hdID0gc3k7CisKKwlyZXR1cm4gKHN0YXRlWyhzeCArIHN5KSAmIDB4ZmZdKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRGVjcnlwdGlvbiBBbGdvcml0aG0KKworCUFyZ3VtZW50czoKKwkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3QgcnRfYXJjZm91ciBDT05URVhUIChTQk9YKQorCQlwRGVzdAkJCVBvaW50ZXIgdG8gdGhlIERlc3RpbmF0aW9uCisJCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIFNvdXJjZSBkYXRhCisJCUxlbiAgICAgICAgIEluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIFNvdXJjZSBkYXRhCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIEFSQ0ZPVVJfREVDUllQVChzdHJ1Y3QgcnRfYXJjZm91cmNvbnRleHQgKkN0eCwKKwkJICAgICB1OCAqcERlc3QsIHU4ICpwU3JjLCB1MzIgTGVuKQoreworCXUzMiBpOworCisJZm9yIChpID0gMDsgaSA8IExlbjsgaSsrKQorCQlwRGVzdFtpXSA9IHBTcmNbaV0gXiBBUkNGT1VSX0JZVEUoQ3R4KTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCVRoZSBTdHJlYW0gQ2lwaGVyIEVuY3J5cHRpb24gQWxnb3JpdGhtCisKKwlBcmd1bWVudHM6CisJCUN0eCAgICAgICAgIFBvaW50ZXIgdG8gc3RydWN0IHJ0X2FyY2ZvdXIgQ09OVEVYVCAoU0JPWCkKKwkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSBTb3VyY2UgZGF0YQorCQlMZW4gICAgICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBTb3VyY2UgZHRhCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgQVJDRk9VUl9FTkNSWVBUKHN0cnVjdCBydF9hcmNmb3VyY29udGV4dCAqQ3R4LAorCQkgICAgIHU4ICpwRGVzdCwgdTggKnBTcmMsIHUzMiBMZW4pCit7CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTGVuOyBpKyspCisJCXBEZXN0W2ldID0gcFNyY1tpXSBeIEFSQ0ZPVVJfQllURShDdHgpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0gd2hpY2ggY29uZm9ybSB0byB0aGUgc3BlY2lhbCByZXF1aXJlbWVudCB0byBlbmNyeXB0ICBHVEsuCisKKwlBcmd1bWVudHM6CisJCUN0eCAgICAgICAgIFBvaW50ZXIgdG8gc3RydWN0IHJ0X2FyY2ZvdXIgQ09OVEVYVCAoU0JPWCkKKwkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSBTb3VyY2UgZGF0YQorCQlMZW4gICAgICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBTb3VyY2UgZHRhCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK3ZvaWQgV1BBQVJDRk9VUl9FTkNSWVBUKHN0cnVjdCBydF9hcmNmb3VyY29udGV4dCAqQ3R4LAorCQkJdTggKnBEZXN0LCB1OCAqcFNyYywgdTMyIExlbikKK3sKKwl1MzIgaTsKKwkvKmRpc2NhcmQgZmlyc3QgMjU2IGJ5dGVzICovCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlBUkNGT1VSX0JZVEUoQ3R4KTsKKworCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKKwkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDYWxjdWxhdGUgYSBuZXcgRkNTIGdpdmVuIHRoZSBjdXJyZW50IEZDUyBhbmQgdGhlIG5ldyBkYXRhLgorCisJQXJndW1lbnRzOgorCQlGY3MJICAgICAgdGhlIG9yaWdpbmFsIEZDUyB2YWx1ZQorCQlDcCAgICAgICAgICBwb2ludGVyIHRvIHRoZSBkYXRhIHdoaWNoIHdpbGwgYmUgY2FsY3VsYXRlIHRoZSBGQ1MKKwkJTGVuICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YQorCisJUmV0dXJuIFZhbHVlOgorCQl1MzIgLSBGQ1MgMzIgYml0cworCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordTMyIFJUTVBfQ0FMQ19GQ1MzMih1MzIgRmNzLCB1OCAqQ3AsIGludCBMZW4pCit7CisJd2hpbGUgKExlbi0tKQorCQlGY3MgPSAoKChGY3MpID4+IDgpIF4gRkNTVEFCXzMyWygoRmNzKSBeICgqQ3ArKykpICYgMHhmZl0pOworCisJcmV0dXJuIChGY3MpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJR2V0IGxhc3QgRkNTIGFuZCBlbmNyeXB0IGl0IHRvIHRoZSBkZXN0aW5hdGlvbgorCisJQXJndW1lbnRzOgorCQlwRGVzdAkJCVBvaW50ZXIgdG8gdGhlIERlc3RpbmF0aW9uCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUTVBTZXRJQ1Yoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqcERlc3QpCit7CisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiBePSAweGZmZmZmZmZmOwkvKiBjb21wbGVtZW50ICovCisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IGNwdTJsZTMyKHBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIpOworCisJQVJDRk9VUl9FTkNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIHBEZXN0LAorCQkJKHU4ICopJiBwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCA0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV93cGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV93cGEuYwppbmRleCAyZGUyOWZkLi45NGUxMTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fd3BhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3dwYS5jCkBAIC0zNiwyNSArMzYsMTIxOSBAQAogCVBhdWwgTGluCTAzLTExLTI4CQlNb2RpZnkgZm9yIHN1cHBsaWNhbnQKICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0vLyBXUEEgT1VJCi1VQ0hBUgkJT1VJX1dQQV9OT05FX0FLTVs0XQkJPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMH07Ci1VQ0hBUiAgICAgICBPVUlfV1BBX1ZFUlNJT05bNF0gICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDAxfTsKLVVDSEFSICAgICAgIE9VSV9XUEFfV0VQNDBbNF0gICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDAxfTsKLVVDSEFSICAgICAgIE9VSV9XUEFfVEtJUFs0XSAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMn07Ci1VQ0hBUiAgICAgICBPVUlfV1BBX0NDTVBbNF0gICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDR9OwotVUNIQVIgICAgICAgT1VJX1dQQV9XRVAxMDRbNF0gICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDA1fTsKLVVDSEFSICAgICAgIE9VSV9XUEFfODAyMVhfQUtNWzRdCT0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDF9OwotVUNIQVIgICAgICAgT1VJX1dQQV9QU0tfQUtNWzRdICAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMn07Ci0vLyBXUEEyIE9VSQotVUNIQVIgICAgICAgT1VJX1dQQTJfV0VQNDBbNF0gICA9IHsweDAwLCAweDBGLCAweEFDLCAweDAxfTsKLVVDSEFSICAgICAgIE9VSV9XUEEyX1RLSVBbNF0gICAgICAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDJ9OwotVUNIQVIgICAgICAgT1VJX1dQQTJfQ0NNUFs0XSAgICAgICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNH07Ci1VQ0hBUiAgICAgICBPVUlfV1BBMl84MDIxWF9BS01bNF0gICA9IHsweDAwLCAweDBGLCAweEFDLCAweDAxfTsKLVVDSEFSICAgICAgIE9VSV9XUEEyX1BTS19BS01bNF0gICAJPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwMn07Ci1VQ0hBUiAgICAgICBPVUlfV1BBMl9XRVAxMDRbNF0gICA9IHsweDAwLCAweDBGLCAweEFDLCAweDA1fTsKLS8vIE1TQSBPVUkKLVVDSEFSICAgCU9VSV9NU0FfODAyMVhfQUtNWzRdICAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDV9OwkJLy8gTm90IHlldCBmaW5hbCAtIElFRUUgODAyLjExcy1EMS4wNgotVUNIQVIgICAJT1VJX01TQV9QU0tfQUtNWzRdICAgCT0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDZ9OwkJLy8gTm90IHlldCBmaW5hbCAtIElFRUUgODAyLjExcy1EMS4wNgorLyogV1BBIE9VSSAqLwordTggT1VJX1dQQV9OT05FX0FLTVs0XSA9IHsgMHgwMCwgMHg1MCwgMHhGMiwgMHgwMCB9OwordTggT1VJX1dQQV9WRVJTSU9OWzRdID0geyAweDAwLCAweDUwLCAweEYyLCAweDAxIH07Cit1OCBPVUlfV1BBX1dFUDQwWzRdID0geyAweDAwLCAweDUwLCAweEYyLCAweDAxIH07Cit1OCBPVUlfV1BBX1RLSVBbNF0gPSB7IDB4MDAsIDB4NTAsIDB4RjIsIDB4MDIgfTsKK3U4IE9VSV9XUEFfQ0NNUFs0XSA9IHsgMHgwMCwgMHg1MCwgMHhGMiwgMHgwNCB9OwordTggT1VJX1dQQV9XRVAxMDRbNF0gPSB7IDB4MDAsIDB4NTAsIDB4RjIsIDB4MDUgfTsKK3U4IE9VSV9XUEFfODAyMVhfQUtNWzRdID0geyAweDAwLCAweDUwLCAweEYyLCAweDAxIH07Cit1OCBPVUlfV1BBX1BTS19BS01bNF0gPSB7IDB4MDAsIDB4NTAsIDB4RjIsIDB4MDIgfTsKKworLyogV1BBMiBPVUkgKi8KK3U4IE9VSV9XUEEyX1dFUDQwWzRdID0geyAweDAwLCAweDBGLCAweEFDLCAweDAxIH07Cit1OCBPVUlfV1BBMl9US0lQWzRdID0geyAweDAwLCAweDBGLCAweEFDLCAweDAyIH07Cit1OCBPVUlfV1BBMl9DQ01QWzRdID0geyAweDAwLCAweDBGLCAweEFDLCAweDA0IH07Cit1OCBPVUlfV1BBMl84MDIxWF9BS01bNF0gPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDEgfTsKK3U4IE9VSV9XUEEyX1BTS19BS01bNF0gPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDIgfTsKK3U4IE9VSV9XUEEyX1dFUDEwNFs0XSA9IHsgMHgwMCwgMHgwRiwgMHhBQywgMHgwNSB9OworCitzdGF0aWMgdm9pZCBDb25zdHJ1Y3RFYXBvbEtleURhdGEoc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkJCSAgdTggR3JvdXBLZXlXZXBTdGF0dXMsCisJCQkJICB1OCBrZXlEZXNjVmVyLAorCQkJCSAgdTggTXNnVHlwZSwKKwkJCQkgIHU4IERlZmF1bHRLZXlJZHgsCisJCQkJICB1OCAqIEdUSywKKwkJCQkgIHU4ICogUlNOSUUsCisJCQkJICB1OCBSU05JRV9MRU4sIHN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKiBwTXNnKTsKKworc3RhdGljIHZvaWQgQ2FsY3VsYXRlTUlDKHU4IEtleURlc2NWZXIsCisJCQkgdTggKiBQVEssIHN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKiBwTXNnKTsKKworc3RhdGljIHZvaWQgV3BhRUFQUGFja2V0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CisKK3N0YXRpYyB2b2lkIFdwYUVBUE9MQVNGQWxlcnRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOworCitzdGF0aWMgdm9pZCBXcGFFQVBPTExvZ29mZkFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOworCitzdGF0aWMgdm9pZCBXcGFFQVBPTFN0YXJ0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKKworc3RhdGljIHZvaWQgV3BhRUFQT0xLZXlBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0CisgICAgUGFyYW1ldGVyczoKKyAgICAgICAgUyAtIHBvaW50ZXIgdG8gdGhlIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIFdwYVN0YXRlTWFjaGluZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTLCBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJU3RhdGVNYWNoaW5lSW5pdChTLCAoU1RBVEVfTUFDSElORV9GVU5DICopIFRyYW5zLCBNQVhfV1BBX1BUS19TVEFURSwKKwkJCSBNQVhfV1BBX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQykgRHJvcCwgV1BBX1BUSywKKwkJCSBXUEFfTUFDSElORV9CQVNFKTsKKworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBXUEFfUFRLLCBNVDJfRUFQUGFja2V0LAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgV3BhRUFQUGFja2V0QWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgV1BBX1BUSywgTVQyX0VBUE9MU3RhcnQsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBXcGFFQVBPTFN0YXJ0QWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgV1BBX1BUSywgTVQyX0VBUE9MTG9nb2ZmLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgV3BhRUFQT0xMb2dvZmZBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBXUEFfUFRLLCBNVDJfRUFQT0xLZXksCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBXcGFFQVBPTEtleUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFdQQV9QVEssIE1UMl9FQVBPTEFTRkFsZXJ0LAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgV3BhRUFQT0xBU0ZBbGVydEFjdGlvbik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgdGhpcyBpcyBzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9uLgorICAgICAgICBXaGVuIHJlY2VpdmluZyBFQVAgcGFja2V0cyB3aGljaCBpcyAgZm9yIDgwMi4xeCBhdXRoZW50aWNhdGlvbiB1c2UuCisgICAgICAgIE5vdCB1c2UgaW4gUFNLIGNhc2UKKyAgICBSZXR1cm46CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFdwYUVBUFBhY2tldEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7Cit9CisKK3ZvaWQgV3BhRUFQT0xBU0ZBbGVydEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7Cit9CisKK3ZvaWQgV3BhRUFQT0xMb2dvZmZBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQoreworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgU3RhcnQgNC13YXkgSFMgd2hlbiByY3YgRUFQT0xfU1RBUlQgd2hpY2ggbWF5IGNyZWF0ZSBieSBvdXIgZHJpdmVyIGluIGFzc29jLmMKKyAgICBSZXR1cm46CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFdwYUVBUE9MU3RhcnRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQoreworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZWFkZXI7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFFQVBPTFN0YXJ0QWN0aW9uID09PT4gXG4iKSk7CisKKwlwSGVhZGVyID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIEVsZW0tPk1zZzsKKworCS8qRm9yIG5vcm1hb2wgUFNLLCB3ZSBlbnF1ZXVlIGFuIEVBUE9MLVN0YXJ0IGNvbW1hbmQgdG8gdHJpZ2dlciB0aGUgcHJvY2Vzcy4gKi8KKwlpZiAoRWxlbS0+TXNnTGVuID09IDYpCisJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgRWxlbS0+TXNnKTsKKwllbHNlIHsKKwkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyLT5BZGRyMik7CisJfQorCisJaWYgKHBFbnRyeSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiBQb3J0U2VjdXJlZCglZCksIFdwYVN0YXRlKCVkKSwgQXV0aE1vZGUoJWQpLCBQTUtJRF9DYWNoZUlkeCglZCkgXG4iLAorCQkJICBwRW50cnktPlBvcnRTZWN1cmVkLCBwRW50cnktPldwYVN0YXRlLAorCQkJICBwRW50cnktPkF1dGhNb2RlLCBwRW50cnktPlBNS0lEX0NhY2hlSWR4KSk7CisKKwkJaWYgKChwRW50cnktPlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkKKwkJICAgICYmIChwRW50cnktPldwYVN0YXRlIDwgQVNfUFRLU1RBUlQpCisJCSAgICAmJiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQorCQkJfHwgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKwkJCXx8ICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorCQkJICAgICYmIChwRW50cnktPlBNS0lEX0NhY2hlSWR4ICE9IEVOVFJZX05PVF9GT1VORCkpKSkgeworCQkJcEVudHJ5LT5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKKwkJCXBFbnRyeS0+V3BhU3RhdGUgPSBBU19JTklUUFNLOworCQkJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLAorCQkJCSAgICAgICBzaXplb2YocEVudHJ5LT5SX0NvdW50ZXIpKTsKKwkJCXBFbnRyeS0+UmVUcnlDb3VudGVyID0gUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUjsKKworCQkJV1BBU3RhcnQ0V2F5SFMocEFkLCBwRW50cnksIFBFRVJfTVNHMV9SRVRSWV9FWEVDX0lOVFYpOworCQl9CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFRoaXMgaXMgc3RhdGUgbWFjaGluZSBmdW5jdGlvbi4KKyAgICAgICAgV2hlbiByZWNlaXZpbmcgRUFQT0wgcGFja2V0cyB3aGljaCBpcyAgZm9yIDgwMi4xeCBrZXkgbWFuYWdlbWVudC4KKyAgICAgICAgVXNlIGJvdGggaW4gV1BBLCBhbmQgV1BBUFNLIGNhc2UuCisgICAgICAgIEluIHRoaXMgZnVuY3Rpb24sIGZ1cnRoZXIgZGlzcGF0Y2ggdG8gZGlmZmVyZW50IGZ1bmN0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIHJlY2VpdmVkIHBhY2tldC4gIDMgY2F0ZWdvcmllcyBhcmUgOgorICAgICAgICAgIDEuICBub3JtYWwgNC13YXkgcGFpcndpc2VrZXkgYW5kIDItd2F5IGdyb3Vwa2V5IGhhbmRzaGFrZQorICAgICAgICAgIDIuICBNSUMgZXJyb3IgKENvdW50ZXJtZWFzdXJlcyBhdHRhY2spICByZXBvcnQgcGFja2V0IGZyb20gU1RBLgorICAgICAgICAgIDMuICBSZXF1ZXN0IGZvciBwYWlyd2lzZS9ncm91cCBrZXkgdXBkYXRlIGZyb20gU1RBCisgICAgUmV0dXJuOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBXcGFFQVBPTEtleUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5OworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlcjsKKwlzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICogcEVhcG9sX3BhY2tldDsKKwlzdHJ1Y3QgcnRfa2V5X2luZm8gcGVlcktleUluZm87CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFFQVBPTEtleUFjdGlvbiA9PT0+XG4iKSk7CisKKwlwSGVhZGVyID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIEVsZW0tPk1zZzsKKwlwRWFwb2xfcGFja2V0ID0KKwkgICAgKHN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKikgJiBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKworCU5kaXNaZXJvTWVtb3J5KCh1OCAqKSYgcGVlcktleUluZm8sIHNpemVvZihwZWVyS2V5SW5mbykpOworCU5kaXNNb3ZlTWVtb3J5KCh1OCAqKSYgcGVlcktleUluZm8sCisJCSAgICAgICAodTggKikmIHBFYXBvbF9wYWNrZXQtPktleURlc2MuS2V5SW5mbywKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfa2V5X2luZm8pKTsKKworCWhleF9kdW1wKCJSZWNlaXZlZCBFYXBvbCBmcmFtZSIsICh1bnNpZ25lZCBjaGFyICopcEVhcG9sX3BhY2tldCwKKwkJIChFbGVtLT5Nc2dMZW4gLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIXzgwMl8xX0gpKTsKKworCSooKHUxNiAqKSAmIHBlZXJLZXlJbmZvKSA9IGNwdTJsZTE2KCooKHUxNiAqKSAmIHBlZXJLZXlJbmZvKSk7CisKKwlkbyB7CisJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEhlYWRlci0+QWRkcjIpOworCisJCWlmICghcEVudHJ5CisJCSAgICB8fCAoKCFwRW50cnktPlZhbGlkQXNDTEkpICYmICghcEVudHJ5LT5WYWxpZEFzQXBDbGkpKSkKKwkJCWJyZWFrOworCisJCWlmIChwRW50cnktPkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJYnJlYWs7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSZWNlaXZlIEVBUG9MLUtleSBmcmFtZSBmcm9tIFNUQSAlMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWFxuIiwKKwkJCSAgUFJJTlRfTUFDKHBFbnRyeS0+QWRkcikpKTsKKworCQlpZiAoKChwRWFwb2xfcGFja2V0LT5Qcm9WZXIgIT0gRUFQT0xfVkVSKQorCQkgICAgICYmIChwRWFwb2xfcGFja2V0LT5Qcm9WZXIgIT0gRUFQT0xfVkVSMikpCisJCSAgICB8fCAoKHBFYXBvbF9wYWNrZXQtPktleURlc2MuVHlwZSAhPSBXUEExX0tFWV9ERVNDKQorCQkJJiYgKHBFYXBvbF9wYWNrZXQtPktleURlc2MuVHlwZSAhPSBXUEEyX0tFWV9ERVNDKSkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIktleSBkZXNjcmlwdGVyIGRvZXMgbm90IG1hdGNoIHdpdGggV1BBIHJ1bGVcbiIpKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIFRoZSB2YWx1ZSAxIHNoYWxsIGJlIHVzZWQgZm9yIGFsbCBFQVBPTC1LZXkgZnJhbWVzIHRvIGFuZCBmcm9tIGEgU1RBIHdoZW4gKi8KKwkJLyogbmVpdGhlciB0aGUgZ3JvdXAgbm9yIHBhaXJ3aXNlIGNpcGhlcnMgYXJlIENDTVAgZm9yIEtleSBEZXNjcmlwdG9yIDEuICovCisJCWlmICgocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJICAgICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyICE9IERFU0NfVFlQRV9US0lQKSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiS2V5IGRlc2NyaXB0ZXIgdmVyc2lvbiBub3QgbWF0Y2goVEtJUCkgXG4iKSk7CisJCQlicmVhazsKKwkJfQorCQkvKiBUaGUgdmFsdWUgMiBzaGFsbCBiZSB1c2VkIGZvciBhbGwgRUFQT0wtS2V5IGZyYW1lcyB0byBhbmQgZnJvbSBhIFNUQSB3aGVuICovCisJCS8qIGVpdGhlciB0aGUgcGFpcndpc2Ugb3IgdGhlIGdyb3VwIGNpcGhlciBpcyBBRVMtQ0NNUCBmb3IgS2V5IERlc2NyaXB0b3IgMi4gKi8KKwkJZWxzZSBpZiAoKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQkgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gREVTQ19UWVBFX0FFUykpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIktleSBkZXNjcmlwdGVyIHZlcnNpb24gbm90IG1hdGNoKEFFUykgXG4iKSk7CisJCQlicmVhazsKKwkJfQorCQkvKiBDaGVjayBpZiB0aGlzIFNUQSBpcyBpbiBjbGFzcyAzIHN0YXRlIGFuZCB0aGUgV1BBIHN0YXRlIGlzIHN0YXJ0ZWQgKi8KKwkJaWYgKChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpCisJCSAgICAmJiAocEVudHJ5LT5XcGFTdGF0ZSA+PSBBU19JTklUUFNLKSkgeworCQkJLyogQ2hlY2sgdGhlIEtleSBBY2sgKGJpdCA3KSBvZiB0aGUgS2V5IEluZm9ybWF0aW9uIHRvIGRldGVybWluZSB0aGUgQXV0aGVudGljYXRvciAqLworCQkJLyogb3Igbm90LiAqLworCQkJLyogQW4gRUFQT0wtS2V5IGZyYW1lIHRoYXQgaXMgc2VudCBieSB0aGUgU3VwcGxpY2FudCBpbiByZXNwb25zZSB0byBhbiBFQVBPTC0gKi8KKwkJCS8qIEtleSBmcmFtZSBmcm9tIHRoZSBBdXRoZW50aWNhdG9yIG11c3Qgbm90IGhhdmUgdGhlIEFjayBiaXQgc2V0LiAqLworCQkJaWYgKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSB7CisJCQkJLyogVGhlIGZyYW1lIGlzIHNuZXQgYnkgQXV0aGVudGljYXRvci4gKi8KKwkJCQkvKiBTbyB0aGUgU3VwcGxpY2FudCBzaWRlIHNoYWxsIGhhbmRsZSB0aGlzLiAqLworCisJCQkJaWYgKChwZWVyS2V5SW5mby5TZWN1cmUgPT0gMCkKKwkJCQkgICAgJiYgKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkKKwkJCQkgICAgJiYgKHBlZXJLZXlJbmZvLkVycm9yID09IDApCisJCQkJICAgICYmIChwZWVyS2V5SW5mby5LZXlUeXBlID09IFBBSVJXSVNFS0VZKSkgeworCQkJCQkvKiBQcm9jZXNzIDEuIHRoZSBtZXNzYWdlIDEgb2YgNC13YXkgSFMgaW4gV1BBIG9yIFdQQTIgKi8KKwkJCQkJLyogICAgICAgICAgICAgICAgICAgICAgICBFQVBPTC1LZXkoMCwwLDEsMCxQLDAsMCxBTm9uY2UsMCxEYXRhS0RfTTEpICovCisJCQkJCS8qICAgICAgICAgICAgICAgICAyLiB0aGUgbWVzc2FnZSAzIG9mIDQtd2F5IEhTIGluIFdQQSAqLworCQkJCQkvKiAgICAgICAgICAgICAgICAgICAgICAgIEVBUE9MLUtleSgwLDEsMSwxLFAsMCxLZXlSU0MsQU5vbmNlLE1JQyxEYXRhS0RfTTMpICovCisJCQkJCWlmIChwZWVyS2V5SW5mby5LZXlNaWMgPT0gMCkKKwkJCQkJCVBlZXJQYWlyTXNnMUFjdGlvbihwQWQsIHBFbnRyeSwKKwkJCQkJCQkJICAgRWxlbSk7CisJCQkJCWVsc2UKKwkJCQkJCVBlZXJQYWlyTXNnM0FjdGlvbihwQWQsIHBFbnRyeSwKKwkJCQkJCQkJICAgRWxlbSk7CisJCQkJfSBlbHNlIGlmICgocGVlcktleUluZm8uU2VjdXJlID09IDEpCisJCQkJCSAgICYmIChwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkKKwkJCQkJICAgJiYgKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkKKwkJCQkJICAgJiYgKHBlZXJLZXlJbmZvLkVycm9yID09IDApKSB7CisJCQkJCS8qIFByb2Nlc3MgMS4gdGhlIG1lc3NhZ2UgMyBvZiA0LXdheSBIUyBpbiBXUEEyICovCisJCQkJCS8qICAgICAgICAgICAgICAgICAgICAgICAgRUFQT0wtS2V5KDEsMSwxLDEsUCwwLEtleVJTQyxBTm9uY2UsTUlDLERhdGFLRF9NMykgKi8KKwkJCQkJLyogICAgICAgICAgICAgICAgIDIuIHRoZSBtZXNzYWdlIDEgb2YgZ3JvdXAgS1MgaW4gV1BBIG9yIFdQQTIgKi8KKwkJCQkJLyogICAgICAgICAgICAgICAgICAgICAgICBFQVBPTC1LZXkoMSwxLDEsMCxHLDAsS2V5IFJTQywwLCBNSUMsR1RLW05dKSAqLworCQkJCQlpZiAocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkKKwkJCQkJCVBlZXJQYWlyTXNnM0FjdGlvbihwQWQsIHBFbnRyeSwKKwkJCQkJCQkJICAgRWxlbSk7CisJCQkJCWVsc2UKKwkJCQkJCVBlZXJHcm91cE1zZzFBY3Rpb24ocEFkLCBwRW50cnksCisJCQkJCQkJCSAgICBFbGVtKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIFRoZSBmcmFtZSBpcyBzbmV0IGJ5IFN1cHBsaWNhbnQuICovCisJCQkJLyogU28gdGhlIEF1dGhlbnRpY2F0b3Igc2lkZSBzaGFsbCBoYW5kbGUgdGhpcy4gKi8KKwkJCQlpZiAoKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkgJiYKKwkJCQkgICAgKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCisJCQkJICAgIChwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkpIHsKKwkJCQkJaWYgKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAwCisJCQkJCSAgICAmJiBwZWVyS2V5SW5mby5LZXlUeXBlID09CisJCQkJCSAgICBQQUlSV0lTRUtFWSkgeworCQkJCQkJLyogRUFQT0wtS2V5KDAsMSwwLDAsUCwwLDAsU05vbmNlLE1JQyxEYXRhKSAqLworCQkJCQkJLyogUHJvY2VzcyAxLiBtZXNzYWdlIDIgb2YgNC13YXkgSFMgaW4gV1BBIG9yIFdQQTIgKi8KKwkJCQkJCS8qICAgICAgICAgICAgICAgICAyLiBtZXNzYWdlIDQgb2YgNC13YXkgSFMgaW4gV1BBICovCisJCQkJCQlpZiAoQ09OVl9BUlJBUllfVE9fdTE2CisJCQkJCQkgICAgKHBFYXBvbF9wYWNrZXQtPktleURlc2MuCisJCQkJCQkgICAgIEtleURhdGFMZW4pID09IDApIHsKKwkJCQkJCQlQZWVyUGFpck1zZzRBY3Rpb24ocEFkLAorCQkJCQkJCQkJICAgcEVudHJ5LAorCQkJCQkJCQkJICAgRWxlbSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCVBlZXJQYWlyTXNnMkFjdGlvbihwQWQsCisJCQkJCQkJCQkgICBwRW50cnksCisJCQkJCQkJCQkgICBFbGVtKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmIChwZWVyS2V5SW5mby5TZWN1cmUgPT0gMQorCQkJCQkJICAgJiYgcGVlcktleUluZm8uS2V5VHlwZSA9PQorCQkJCQkJICAgUEFJUldJU0VLRVkpIHsKKwkJCQkJCS8qIEVBUE9MLUtleSgxLDEsMCwwLFAsMCwwLDAsTUlDLDApICovCisJCQkJCQkvKiBQcm9jZXNzIG1lc3NhZ2UgNCBvZiA0LXdheSBIUyBpbiBXUEEyICovCisJCQkJCQlQZWVyUGFpck1zZzRBY3Rpb24ocEFkLCBwRW50cnksCisJCQkJCQkJCSAgIEVsZW0pOworCQkJCQl9IGVsc2UgaWYgKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAxCisJCQkJCQkgICAmJiBwZWVyS2V5SW5mby5LZXlUeXBlID09CisJCQkJCQkgICBHUk9VUEtFWSkgeworCQkJCQkJLyogRUFQT0wtS2V5KDEsMSwwLDAsRywwLDAsMCxNSUMsMCkgKi8KKwkJCQkJCS8qIFByb2Nlc3MgbWVzc2FnZSAyIG9mIEdyb3VwIGtleSBIUyBpbiBXUEEgb3IgV1BBMiAqLworCQkJCQkJUGVlckdyb3VwTXNnMkFjdGlvbihwQWQsIHBFbnRyeSwKKwkJCQkJCQkJICAgICZFbGVtLT4KKwkJCQkJCQkJICAgIE1zZworCQkJCQkJCQkgICAgW0xFTkdUSF84MDJfMTFdLAorCQkJCQkJCQkgICAgKEVsZW0tPgorCQkJCQkJCQkgICAgIE1zZ0xlbiAtCisJCQkJCQkJCSAgICAgTEVOR1RIXzgwMl8xMSkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfSB3aGlsZSAoRkFMU0UpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ29weSBmcmFtZSBmcm9tIHdhaXRpbmcgcXVldWUgaW50byByZWxhdGl2ZSByaW5nIGJ1ZmZlciBhbmQgc2V0CisJYXBwcm9wcmlhdGUgQVNJQyByZWdpc3RlciB0byBraWNrIGhhcmR3YXJlIGVuY3J5cHRpb24gYmVmb3JlIHJlYWxseQorCXNlbnQgb3V0IHRvIGFpci4KKworCUFyZ3VtZW50czoKKwkJcEFkCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXZvaWQgKglQb2ludGVyIHRvIG91dGdvaW5nIE5kaXMgZnJhbWUKKwkJTnVtYmVyT2ZGcmFnCU51bWJlciBvZiBmcmFnbWVudCByZXF1aXJlZAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QVG9XaXJlbGVzc1N0YShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksCisJCSAgICAgICB1OCAqcEhlYWRlcjgwMl8zLAorCQkgICAgICAgdTMyIEhkckxlbiwKKwkJICAgICAgIHU4ICpwRGF0YSwgdTMyIERhdGFMZW4sIElOIEJPT0xFQU4gYkNsZWFyRnJhbWUpCit7CisJdm9pZCAqcFBhY2tldDsKKwlpbnQgU3RhdHVzOworCisJaWYgKCghcEVudHJ5KSB8fCAoKCFwRW50cnktPlZhbGlkQXNDTEkpICYmICghcEVudHJ5LT5WYWxpZEFzQXBDbGkpKSkKKwkJcmV0dXJuOworCisJZG8geworCQkvKiBidWlsZCBhIE5ESVMgcGFja2V0ICovCisJCVN0YXR1cyA9CisJCSAgICBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBQYWNrZXQsIHBIZWFkZXI4MDJfMywgSGRyTGVuLAorCQkJCQkgICBwRGF0YSwgRGF0YUxlbik7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCWlmIChiQ2xlYXJGcmFtZSkKKwkJCVJUTVBfU0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUocFBhY2tldCwgMSk7CisJCWVsc2UKKwkJCVJUTVBfU0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUocFBhY2tldCwgMCk7CisJCXsKKwkJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFBhY2tldCwgUEtUU1JDX05ESVMpOworCisJCQlSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQocFBhY2tldCwgTUFJTl9NQlNTSUQpOwkvKiBzZXQgYSBkZWZhdWx0IHZhbHVlICovCisJCQlpZiAocEVudHJ5LT5hcGlkeCAhPSAwKQorCQkJCVJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX01CU1NJRChwUGFja2V0LAorCQkJCQkJCQkgIHBFbnRyeS0+CisJCQkJCQkJCSAgYXBpZHgpOworCisJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCAodTgpcEVudHJ5LT5BaWQpOworCQkJUlRNUF9TRVRfUEFDS0VUX01PUkVEQVRBKHBQYWNrZXQsIEZBTFNFKTsKKwkJfQorCisJCXsKKwkJCS8qIHNlbmQgb3V0IHRoZSBwYWNrZXQgKi8KKwkJCVN0YXR1cyA9IFNUQVNlbmRQYWNrZXQocEFkLCBwUGFja2V0KTsKKwkJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkJCXU4IEluZGV4OworCisJCQkJLyogRGVxdWV1ZSBvbmUgZnJhbWUgZnJvbSBUeFN3UXVldWUwLi4zIHF1ZXVlIGFuZCBwcm9jZXNzIGl0ICovCisJCQkJLyogVGhlcmUgYXJlIHRocmVlIHBsYWNlIGNhbGxpbmcgZGVxdWV1ZSBmb3IgVFggcmluZy4gKi8KKwkJCQkvKiAxLiBIZXJlLCByaWdodCBhZnRlciBxdWV1ZWluZyB0aGUgZnJhbWUuICovCisJCQkJLyogMi4gQXQgdGhlIGVuZCBvZiBUeFJpbmdUeERvbmUgc2VydmljZSByb3V0aW5lLiAqLworCQkJCS8qIDMuIFVwb24gTkRJUyBjYWxsIFJUTVBTZW5kUGFja2V0cyAqLworCQkJCWlmICgoIVJUTVBfVEVTVF9GTEFHCisJCQkJICAgICAocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJCQkgICAgJiYKKwkJCQkgICAgKCFSVE1QX1RFU1RfRkxBRworCQkJCSAgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpKSB7CisJCQkJCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IDU7IEluZGV4KyspCisJCQkJCQlpZiAocEFkLT5UeFN3UXVldWVbSW5kZXhdLgorCQkJCQkJICAgIE51bWJlciA+IDApCisJCQkJCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLAorCQkJCQkJCQkJICBGQUxTRSwKKwkJCQkJCQkJCSAgSW5kZXgsCisJCQkJCQkJCQkgIE1BWF9UWF9QUk9DRVNTKTsKKwkJCQl9CisJCQl9CisJCX0KKworCX0gd2hpbGUgKEZBTFNFKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBUaGlzIGlzIGEgZnVuY3Rpb24gdG8gaW5pdGlsaXplIDQtd2F5IGhhbmRzaGFrZQorCisgICAgUmV0dXJuOgorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFdQQVN0YXJ0NFdheUhTKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwgdW5zaWduZWQgbG9uZyBUaW1lSW50ZXJ2YWwpCit7CisJdTggSGVhZGVyODAyXzNbMTRdOworCXN0cnVjdCBydF9lYXBvbF9wYWNrZXQgRUFQT0xQS1Q7CisJdTggKnBCc3NpZCA9IE5VTEw7CisJdTggZ3JvdXBfY2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBXUEFTdGFydDRXYXlIU1xuIikpOworCisJaWYgKFJUTVBfVEVTVF9GTEFHCisJICAgIChwQWQsCisJICAgICBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiW0VSUk9SXVdQQVN0YXJ0NFdheUhTIDogVGhlIGludGVyZmFjZSBpcyBjbG9zZWQuLi5cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwQnNzaWQgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIltFUlJPUl1XUEFTdGFydDRXYXlIUyA6IE5vIGNvcnJlc3BvbmRpbmcgQXV0aGVudGljYXRvci5cbiIpKTsKKwkJcmV0dXJuOworCX0KKwkvKiBDaGVjayB0aGUgc3RhdHVzICovCisJaWYgKChwRW50cnktPldwYVN0YXRlID4gQVNfUFRLU1RBUlQpIHx8IChwRW50cnktPldwYVN0YXRlIDwgQVNfSU5JVFBNSykpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJbRVJST1JdV1BBU3RhcnQ0V2F5SFMgOiBOb3QgZXhwZWN0IGNhbGxpbmdcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEluY3JlbWVudCByZXBsYXkgY291bnRlciBieSAxICovCisJQUREX09ORV9Ub182NEJJVF9WQVIocEVudHJ5LT5SX0NvdW50ZXIpOworCisJLyogUmFuZG9tbHkgZ2VuZXJhdGUgQU5vbmNlICovCisJR2VuUmFuZG9tKHBBZCwgKHU4ICopIHBCc3NpZCwgcEVudHJ5LT5BTm9uY2UpOworCisJLyogQ29uc3RydWN0IEVBUG9MIG1lc3NhZ2UgLSBQYWlyd2lzZSBNc2cgMSAqLworCS8qIEVBUE9MLUtleSgwLDAsMSwwLFAsMCwwLEFOb25jZSwwLERhdGFLRF9NMSkgKi8KKwlOZGlzWmVyb01lbW9yeSgmRUFQT0xQS1QsIHNpemVvZihzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0KSk7CisJQ29uc3RydWN0RWFwb2xNc2cocEVudHJ5LCBncm91cF9jaXBoZXIsIEVBUE9MX1BBSVJfTVNHXzEsIDAsCS8qIERlZmF1bHQga2V5IGluZGV4ICovCisJCQkgIHBFbnRyeS0+QU5vbmNlLCBOVUxMLAkvKiBUeFJTQyAqLworCQkJICBOVUxMLAkvKiBHVEsgKi8KKwkJCSAgTlVMTCwJLyogUlNOSUUgKi8KKwkJCSAgMCwJLyogUlNOSUUgbGVuZ3RoICovCisJCQkgICZFQVBPTFBLVCk7CisKKwkvKiBNYWtlIG91dGdvaW5nIGZyYW1lICovCisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBFbnRyeS0+QWRkciwgcEJzc2lkLCBFQVBPTCk7CisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBwRW50cnksIEhlYWRlcjgwMl8zLAorCQkJICBMRU5HVEhfODAyXzMsICh1OCAqKSYgRUFQT0xQS1QsCisJCQkgIENPTlZfQVJSQVJZX1RPX3UxNihFQVBPTFBLVC5Cb2R5X0xlbikgKyA0LAorCQkJICAocEVudHJ5LT5Qb3J0U2VjdXJlZCA9PQorCQkJICAgV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpID8gRkFMU0UgOiBUUlVFKTsKKworCS8qIFRyaWdnZXIgUmV0cnkgVGltZXIgKi8KKwlSVE1QTW9kVGltZXIoJnBFbnRyeS0+UmV0cnlUaW1lciwgVGltZUludGVydmFsKTsKKworCS8qIFVwZGF0ZSBTdGF0ZSAqLworCXBFbnRyeS0+V3BhU3RhdGUgPSBBU19QVEtTVEFSVDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCI8PT09IFdQQVN0YXJ0NFdheUhTOiBzZW5kIE1zZzEgb2YgNC13YXkgXG4iKSk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgUGFpcndpc2Uga2V5IE1zZy0xIG9mIDQtd2F5IGhhbmRzaGFraW5nIGFuZCBzZW5kIE1zZy0yCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFBlZXJQYWlyTXNnMUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7CisJdTggUFRLWzgwXTsKKwl1OCBIZWFkZXI4MDJfM1sxNF07CisJc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqIHBNc2cxOworCXUzMiBNc2dMZW47CisJc3RydWN0IHJ0X2VhcG9sX3BhY2tldCBFQVBPTFBLVDsKKwl1OCAqcEN1cnJlbnRBZGRyID0gTlVMTDsKKwl1OCAqcG1rX3B0ciA9IE5VTEw7CisJdTggZ3JvdXBfY2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXU4ICpyc25pZV9wdHIgPSBOVUxMOworCXU4IHJzbmllX2xlbiA9IDA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IFBlZXJQYWlyTXNnMUFjdGlvbiBcbiIpKTsKKworCWlmICgoIXBFbnRyeSkgfHwgKCghcEVudHJ5LT5WYWxpZEFzQ0xJKSAmJiAoIXBFbnRyeS0+VmFsaWRBc0FwQ2xpKSkpCisJCXJldHVybjsKKworCWlmIChFbGVtLT5Nc2dMZW4gPAorCSAgICAoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0ggKworCSAgICAgc2l6ZW9mKHN0cnVjdCBydF9rZXlfZGVzY3JpcHRlcikgLSBNQVhfTEVOX09GX1JTTklFIC0gMikpCisJCXJldHVybjsKKworCXsKKwkJcEN1cnJlbnRBZGRyID0gcEFkLT5DdXJyZW50QWRkcmVzczsKKwkJcG1rX3B0ciA9IHBBZC0+U3RhQ2ZnLlBNSzsKKwkJZ3JvdXBfY2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7CisJCXJzbmllX3B0ciA9IHBBZC0+U3RhQ2ZnLlJTTl9JRTsKKwkJcnNuaWVfbGVuID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOworCX0KKworCS8qIFN0b3JlIHRoZSByZWNlaXZlZCBmcmFtZSAqLworCXBNc2cxID0gKHN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKikgJiBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKwlNc2dMZW4gPSBFbGVtLT5Nc2dMZW4gLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIXzgwMl8xX0g7CisKKwkvKiBTYW5pdHkgQ2hlY2sgcGVlciBQYWlyd2lzZSBtZXNzYWdlIDEgLSBSZXBsYXkgQ291bnRlciAqLworCWlmIChQZWVyV3BhTWVzc2FnZVNhbml0eShwQWQsIHBNc2cxLCBNc2dMZW4sIEVBUE9MX1BBSVJfTVNHXzEsIHBFbnRyeSkKKwkgICAgPT0gRkFMU0UpCisJCXJldHVybjsKKworCS8qIFN0b3JlIFJlcGxheSBjb3VudGVyLCBpdCB3aWxsIHVzZSB0byB2ZXJpZnkgbWVzc2FnZSAzIGFuZCBjb25zdHJ1Y3QgbWVzc2FnZSAyICovCisJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5SX0NvdW50ZXIsIHBNc2cxLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsCisJCSAgICAgICBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8qIFN0b3JlIEFOb25jZSAqLworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+QU5vbmNlLCBwTXNnMS0+S2V5RGVzYy5LZXlOb25jZSwKKwkJICAgICAgIExFTl9LRVlfREVTQ19OT05DRSk7CisKKwkvKiBHZW5lcmF0ZSByYW5kb20gU05vbmNlICovCisJR2VuUmFuZG9tKHBBZCwgKHU4ICopIHBDdXJyZW50QWRkciwgcEVudHJ5LT5TTm9uY2UpOworCisJeworCQkvKiBDYWxjdWxhdGUgUFRLKEFOb25jZSwgU05vbmNlKSAqLworCQlXcGFEZXJpdmVQVEsocEFkLAorCQkJICAgICBwbWtfcHRyLAorCQkJICAgICBwRW50cnktPkFOb25jZSwKKwkJCSAgICAgcEVudHJ5LT5BZGRyLAorCQkJICAgICBwRW50cnktPlNOb25jZSwgcEN1cnJlbnRBZGRyLCBQVEssIExFTl9QVEspOworCisJCS8qIFNhdmUga2V5IHRvIFBUSyBlbnRyeSAqLworCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBUSywgUFRLLCBMRU5fUFRLKTsKKwl9CisKKwkvKiBVcGRhdGUgV3BhU3RhdGUgKi8KKwlwRW50cnktPldwYVN0YXRlID0gQVNfUFRLSU5JVF9ORUdPVElBVElORzsKKworCS8qIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gUGFpcndpc2UgTXNnIDIgKi8KKwkvKiAgRUFQT0wtS2V5KDAsMSwwLDAsUCwwLDAsU05vbmNlLE1JQyxEYXRhS0RfTTIpICovCisJTmRpc1plcm9NZW1vcnkoJkVBUE9MUEtULCBzaXplb2Yoc3RydWN0IHJ0X2VhcG9sX3BhY2tldCkpOworCUNvbnN0cnVjdEVhcG9sTXNnKHBFbnRyeSwgZ3JvdXBfY2lwaGVyLCBFQVBPTF9QQUlSX01TR18yLCAwLAkvKiBEZWZhdWx0S2V5SWR4ICovCisJCQkgIHBFbnRyeS0+U05vbmNlLCBOVUxMLAkvKiBUeFJzYyAqLworCQkJICBOVUxMLAkvKiBHVEsgKi8KKwkJCSAgKHU4ICopIHJzbmllX3B0ciwgcnNuaWVfbGVuLCAmRUFQT0xQS1QpOworCisJLyogTWFrZSBvdXRnb2luZyBmcmFtZSAqLworCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwRW50cnktPkFkZHIsIHBDdXJyZW50QWRkciwgRUFQT0wpOworCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBwRW50cnksCisJCQkgIEhlYWRlcjgwMl8zLCBzaXplb2YoSGVhZGVyODAyXzMpLCAodTggKikmIEVBUE9MUEtULAorCQkJICBDT05WX0FSUkFSWV9UT191MTYoRUFQT0xQS1QuQm9keV9MZW4pICsgNCwgVFJVRSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPD09PSBQZWVyUGFpck1zZzFBY3Rpb246IHNlbmQgTXNnMiBvZiA0LXdheSBcbiIpKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBXaGVuIHJlY2VpdmluZyB0aGUgc2Vjb25kIHBhY2tldCBvZiA0LXdheSBwYWlyd2lzZWtleSBoYW5kc2hha2UuCisgICAgUmV0dXJuOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBQZWVyUGFpck1zZzJBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQoreworCXU4IFBUS1s4MF07CisJQk9PTEVBTiBDYW5jZWxsZWQ7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyOworCXN0cnVjdCBydF9lYXBvbF9wYWNrZXQgRUFQT0xQS1Q7CisJc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqIHBNc2cyOworCXUzMiBNc2dMZW47CisJdTggSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKKwl1OCBUeFRzY1s2XTsKKwl1OCAqcEJzc2lkID0gTlVMTDsKKwl1OCAqcG1rX3B0ciA9IE5VTEw7CisJdTggKmd0a19wdHIgPSBOVUxMOworCXU4IGRlZmF1bHRfa2V5ID0gMDsKKwl1OCBncm91cF9jaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJdTggKnJzbmllX3B0ciA9IE5VTEw7CisJdTggcnNuaWVfbGVuID0gMDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlclBhaXJNc2cyQWN0aW9uIFxuIikpOworCisJaWYgKCghcEVudHJ5KSB8fCAoIXBFbnRyeS0+VmFsaWRBc0NMSSkpCisJCXJldHVybjsKKworCWlmIChFbGVtLT5Nc2dMZW4gPAorCSAgICAoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0ggKworCSAgICAgc2l6ZW9mKHN0cnVjdCBydF9rZXlfZGVzY3JpcHRlcikgLSBNQVhfTEVOX09GX1JTTklFIC0gMikpCisJCXJldHVybjsKKworCS8qIGNoZWNrIEVudHJ5IGluIHZhbGlkIFN0YXRlICovCisJaWYgKHBFbnRyeS0+V3BhU3RhdGUgPCBBU19QVEtTVEFSVCkKKwkJcmV0dXJuOworCisJLyogcG9pbnRlciB0byA4MDIuMTEgaGVhZGVyICovCisJcEhlYWRlciA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSBFbGVtLT5Nc2c7CisKKwkvKiBza2lwIDgwMi4xMV9oZWFkZXIoMjQtYnl0ZSkgYW5kIExMQ19oZWFkZXIoOCkgKi8KKwlwTXNnMiA9IChzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICopICYgRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07CisJTXNnTGVuID0gRWxlbS0+TXNnTGVuIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF84MDJfMV9IOworCisJLyogU3RvcmUgU05vbmNlICovCisJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5TTm9uY2UsIHBNc2cyLT5LZXlEZXNjLktleU5vbmNlLAorCQkgICAgICAgTEVOX0tFWV9ERVNDX05PTkNFKTsKKworCXsKKwkJLyogRGVyaXZlIFBUSyAqLworCQlXcGFEZXJpdmVQVEsocEFkLCAodTggKikgcG1rX3B0ciwgcEVudHJ5LT5BTm9uY2UsCS8qIEFOT05DRSAqLworCQkJICAgICAodTggKikgcEJzc2lkLCBwRW50cnktPlNOb25jZSwJLyogU05PTkNFICovCisJCQkgICAgIHBFbnRyeS0+QWRkciwgUFRLLCBMRU5fUFRLKTsKKworCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBUSywgUFRLLCBMRU5fUFRLKTsKKwl9CisKKwkvKiBTYW5pdHkgQ2hlY2sgcGVlciBQYWlyd2lzZSBtZXNzYWdlIDIgLSBSZXBsYXkgQ291bnRlciwgTUlDLCBSU05JRSAqLworCWlmIChQZWVyV3BhTWVzc2FnZVNhbml0eShwQWQsIHBNc2cyLCBNc2dMZW4sIEVBUE9MX1BBSVJfTVNHXzIsIHBFbnRyeSkKKwkgICAgPT0gRkFMU0UpCisJCXJldHVybjsKKworCWRvIHsKKwkJLyogZGVsZXRlIHJldHJ5IHRpbWVyICovCisJCVJUTVBDYW5jZWxUaW1lcigmcEVudHJ5LT5SZXRyeVRpbWVyLCAmQ2FuY2VsbGVkKTsKKworCQkvKiBDaGFuZ2Ugc3RhdGUgKi8KKwkJcEVudHJ5LT5XcGFTdGF0ZSA9IEFTX1BUS0lOSVRfTkVHT1RJQVRJTkc7CisKKwkJLyogSW5jcmVtZW50IHJlcGxheSBjb3VudGVyIGJ5IDEgKi8KKwkJQUREX09ORV9Ub182NEJJVF9WQVIocEVudHJ5LT5SX0NvdW50ZXIpOworCisJCS8qIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gUGFpcndpc2UgTXNnIDMgKi8KKwkJTmRpc1plcm9NZW1vcnkoJkVBUE9MUEtULCBzaXplb2Yoc3RydWN0IHJ0X2VhcG9sX3BhY2tldCkpOworCQlDb25zdHJ1Y3RFYXBvbE1zZyhwRW50cnksCisJCQkJICBncm91cF9jaXBoZXIsCisJCQkJICBFQVBPTF9QQUlSX01TR18zLAorCQkJCSAgZGVmYXVsdF9rZXksCisJCQkJICBwRW50cnktPkFOb25jZSwKKwkJCQkgIFR4VHNjLAorCQkJCSAgKHU4ICopIGd0a19wdHIsCisJCQkJICAodTggKikgcnNuaWVfcHRyLCByc25pZV9sZW4sICZFQVBPTFBLVCk7CisKKwkJLyogTWFrZSBvdXRnb2luZyBmcmFtZSAqLworCQlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEVudHJ5LT5BZGRyLCBwQnNzaWQsIEVBUE9MKTsKKwkJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBwRW50cnksIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsCisJCQkJICAodTggKikmIEVBUE9MUEtULAorCQkJCSAgQ09OVl9BUlJBUllfVE9fdTE2KEVBUE9MUEtULkJvZHlfTGVuKSArIDQsCisJCQkJICAocEVudHJ5LT5Qb3J0U2VjdXJlZCA9PQorCQkJCSAgIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSA/IEZBTFNFIDogVFJVRSk7CisKKwkJcEVudHJ5LT5SZVRyeUNvdW50ZXIgPSBQRUVSX01TRzNfUkVUUllfVElNRVJfQ1RSOworCQlSVE1QU2V0VGltZXIoJnBFbnRyeS0+UmV0cnlUaW1lciwgUEVFUl9NU0czX1JFVFJZX0VYRUNfSU5UVik7CisKKwkJLyogVXBkYXRlIFN0YXRlICovCisJCXBFbnRyeS0+V3BhU3RhdGUgPSBBU19QVEtJTklUX05FR09USUFUSU5HOworCX0gd2hpbGUgKEZBTFNFKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCI8PT09IFBlZXJQYWlyTXNnMkFjdGlvbjogc2VuZCBNc2czIG9mIDQtd2F5IFxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBQYWlyd2lzZSBrZXkgTXNnIDMgb2YgNC13YXkgaGFuZHNoYWtpbmcgYW5kIHNlbmQgTXNnIDQKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFBlZXJQYWlyTXNnM0FjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyOworCXU4IEhlYWRlcjgwMl8zWzE0XTsKKwlzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0IEVBUE9MUEtUOworCXN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKiBwTXNnMzsKKwl1MzIgTXNnTGVuOworCXU4ICpwQ3VycmVudEFkZHIgPSBOVUxMOworCXU4IGdyb3VwX2NpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlclBhaXJNc2czQWN0aW9uIFxuIikpOworCisJaWYgKCghcEVudHJ5KSB8fCAoKCFwRW50cnktPlZhbGlkQXNDTEkpICYmICghcEVudHJ5LT5WYWxpZEFzQXBDbGkpKSkKKwkJcmV0dXJuOworCisJaWYgKEVsZW0tPk1zZ0xlbiA8CisJICAgIChMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyBMRU5HVEhfRUFQT0xfSCArCisJICAgICBzaXplb2Yoc3RydWN0IHJ0X2tleV9kZXNjcmlwdGVyKSAtIE1BWF9MRU5fT0ZfUlNOSUUgLSAyKSkKKwkJcmV0dXJuOworCisJeworCQlwQ3VycmVudEFkZHIgPSBwQWQtPkN1cnJlbnRBZGRyZXNzOworCQlncm91cF9jaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKKworCX0KKworCS8qIFJlY29yZCA4MDIuMTEgaGVhZGVyICYgdGhlIHJlY2VpdmVkIEVBUE9MIHBhY2tldCBNc2czICovCisJcEhlYWRlciA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSBFbGVtLT5Nc2c7CisJcE1zZzMgPSAoc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqKSAmIEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCU1zZ0xlbiA9IEVsZW0tPk1zZ0xlbiAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfODAyXzFfSDsKKworCS8qIFNhbml0eSBDaGVjayBwZWVyIFBhaXJ3aXNlIG1lc3NhZ2UgMyAtIFJlcGxheSBDb3VudGVyLCBNSUMsIFJTTklFICovCisJaWYgKFBlZXJXcGFNZXNzYWdlU2FuaXR5KHBBZCwgcE1zZzMsIE1zZ0xlbiwgRUFQT0xfUEFJUl9NU0dfMywgcEVudHJ5KQorCSAgICA9PSBGQUxTRSkKKwkJcmV0dXJuOworCisJLyogU2F2ZSBSZXBsYXkgY291bnRlciwgaXQgd2lsbCB1c2UgY29uc3RydWN0IG1lc3NhZ2UgNCAqLworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLCBwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLAorCQkgICAgICAgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvKiBEb3VibGUgY2hlY2sgQU5vbmNlICovCisJaWYgKCFOZGlzRXF1YWxNZW1vcnkKKwkgICAgKHBFbnRyeS0+QU5vbmNlLCBwTXNnMy0+S2V5RGVzYy5LZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKSkgeworCQlyZXR1cm47CisJfQorCS8qIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gUGFpcndpc2UgTXNnIDQgKi8KKwlOZGlzWmVyb01lbW9yeSgmRUFQT0xQS1QsIHNpemVvZihzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0KSk7CisJQ29uc3RydWN0RWFwb2xNc2cocEVudHJ5LCBncm91cF9jaXBoZXIsIEVBUE9MX1BBSVJfTVNHXzQsIDAsCS8qIGdyb3VwIGtleSBpbmRleCBub3QgdXNlZCBpbiBtZXNzYWdlIDQgKi8KKwkJCSAgTlVMTCwJLyogTm9uY2Ugbm90IHVzZWQgaW4gbWVzc2FnZSA0ICovCisJCQkgIE5VTEwsCS8qIFR4UlNDIG5vdCB1c2VkIGluIG1lc3NhZ2UgNCAqLworCQkJICBOVUxMLAkvKiBHVEsgbm90IHVzZWQgaW4gbWVzc2FnZSA0ICovCisJCQkgIE5VTEwsCS8qIFJTTiBJRSBub3QgdXNlZCBpbiBtZXNzYWdlIDQgKi8KKwkJCSAgMCwgJkVBUE9MUEtUKTsKKworCS8qIFVwZGF0ZSBXcGFTdGF0ZSAqLworCXBFbnRyeS0+V3BhU3RhdGUgPSBBU19QVEtJTklURE9ORTsKKworCS8qIFVwZGF0ZSBwYWlyd2lzZSBrZXkgKi8KKwl7CisJCXN0cnVjdCBydF9jaXBoZXJfa2V5ICpwU2hhcmVkS2V5OworCisJCXBTaGFyZWRLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF07CisKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUFRLLCBwRW50cnktPlBUSywgTEVOX1BUSyk7CisKKwkJLyogUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZSAqLworCQlOZGlzWmVyb01lbW9yeShwU2hhcmVkS2V5LCBzaXplb2Yoc3RydWN0IHJ0X2NpcGhlcl9rZXkpKTsKKwkJcFNoYXJlZEtleS0+S2V5TGVuID0gTEVOX1RLSVBfRUs7CisJCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sCisJCQkgICAgICAgTEVOX1RLSVBfRUspOworCQlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sCisJCQkgICAgICAgTEVOX1RLSVBfUlhNSUNLKTsKKwkJTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+VHhNaWMsCisJCQkgICAgICAgJnBBZC0+U3RhQ2ZnLlBUS1s0OCArIExFTl9US0lQX1JYTUlDS10sCisJCQkgICAgICAgTEVOX1RLSVBfVFhNSUNLKTsKKworCQkvKiBEZWNpZGUgaXRzIENoaXBlckFsZyAqLworCQlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJCWVsc2UKKwkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCisJCS8qIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKi8KKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwKKwkJCSAgICAgICBMRU5fVEtJUF9FSyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLAorCQkJICAgICAgIExFTl9US0lQX1JYTUlDSyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsCisJCQkgICAgICAgJnBBZC0+U3RhQ2ZnLlBUS1s0OCArIExFTl9US0lQX1JYTUlDS10sCisJCQkgICAgICAgTEVOX1RLSVBfVFhNSUNLKTsKKwkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwU2hhcmVkS2V5LT5DaXBoZXJBbGc7CisKKwkJLyogVXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUgKi8KKwkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCQkgICAgICBCU1MwLAorCQkJCSAgICAgIDAsCisJCQkJICAgICAgcFNoYXJlZEtleS0+Q2lwaGVyQWxnLAorCQkJCSAgICAgIHBTaGFyZWRLZXktPktleSwKKwkJCQkgICAgICBwU2hhcmVkS2V5LT5UeE1pYywgcFNoYXJlZEtleS0+UnhNaWMpOworCisJCS8qIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSAqLworCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJICBCU1MwLAorCQkJCQkgIDAsIHBTaGFyZWRLZXktPkNpcGhlckFsZywgcEVudHJ5KTsKKworCX0KKworCS8qIG9wZW4gODAyLjF4IHBvcnQgY29udHJvbCBhbmQgcHJpdmFjeSBmaWx0ZXIgKi8KKwlpZiAocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLIHx8CisJICAgIHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgeworCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCXBFbnRyeS0+UHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsOworCisJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKwkJLyogSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkgKi8KKwkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJQZWVyUGFpck1zZzNBY3Rpb246IEF1dGhNb2RlKCVzKSBQYWlyd2lzZUNpcGhlciglcykgR3JvdXBDaXBoZXIoJXMpIFxuIiwKKwkJCSAgR2V0QXV0aE1vZGUocEVudHJ5LT5BdXRoTW9kZSksCisJCQkgIEdldEVuY3J5cHRUeXBlKHBFbnRyeS0+V2VwU3RhdHVzKSwKKwkJCSAgR2V0RW5jcnlwdFR5cGUoZ3JvdXBfY2lwaGVyKSkpOworCX0gZWxzZSB7CisJfQorCisJLyogSW5pdCA4MDIuMyBoZWFkZXIgYW5kIHNlbmQgb3V0ICovCisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBFbnRyeS0+QWRkciwgcEN1cnJlbnRBZGRyLCBFQVBPTCk7CisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBwRW50cnksCisJCQkgIEhlYWRlcjgwMl8zLCBzaXplb2YoSGVhZGVyODAyXzMpLAorCQkJICAodTggKikmIEVBUE9MUEtULAorCQkJICBDT05WX0FSUkFSWV9UT191MTYoRUFQT0xQS1QuQm9keV9MZW4pICsgNCwgVFJVRSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPD09PSBQZWVyUGFpck1zZzNBY3Rpb246IHNlbmQgTXNnNCBvZiA0LXdheSBcbiIpKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBXaGVuIHJlY2VpdmluZyB0aGUgbGFzdCBwYWNrZXQgb2YgNC13YXkgcGFpcndpc2VrZXkgaGFuZHNoYWtlLgorICAgICAgICBJbml0aWxpemUgMi13YXkgZ3JvdXBrZXkgaGFuZHNoYWtlIGZvbGxvd2luZy4KKyAgICBSZXR1cm46CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFBlZXJQYWlyTXNnNEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7CisJc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqIHBNc2c0OworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlcjsKKwl1MzIgTXNnTGVuOworCUJPT0xFQU4gQ2FuY2VsbGVkOworCXU4IGdyb3VwX2NpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlclBhaXJNc2c0QWN0aW9uXG4iKSk7CisKKwlkbyB7CisJCWlmICgoIXBFbnRyeSkgfHwgKCFwRW50cnktPlZhbGlkQXNDTEkpKQorCQkJYnJlYWs7CisKKwkJaWYgKEVsZW0tPk1zZ0xlbiA8CisJCSAgICAoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0ggKworCQkgICAgIHNpemVvZihzdHJ1Y3QgcnRfa2V5X2Rlc2NyaXB0ZXIpIC0gTUFYX0xFTl9PRl9SU05JRSAtIDIpKQorCQkJYnJlYWs7CisKKwkJaWYgKHBFbnRyeS0+V3BhU3RhdGUgPCBBU19QVEtJTklUX05FR09USUFUSU5HKQorCQkJYnJlYWs7CisKKwkJLyogcG9pbnRlciB0byA4MDIuMTEgaGVhZGVyICovCisJCXBIZWFkZXIgPSAoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKikgRWxlbS0+TXNnOworCisJCS8qIHNraXAgODAyLjExX2hlYWRlcigyNC1ieXRlKSBhbmQgTExDX2hlYWRlcig4KSAqLworCQlwTXNnNCA9CisJCSAgICAoc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqKSAmIEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCQlNc2dMZW4gPSBFbGVtLT5Nc2dMZW4gLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIXzgwMl8xX0g7CisKKwkJLyogU2FuaXR5IENoZWNrIHBlZXIgUGFpcndpc2UgbWVzc2FnZSA0IC0gUmVwbGF5IENvdW50ZXIsIE1JQyAqLworCQlpZiAoUGVlcldwYU1lc3NhZ2VTYW5pdHkKKwkJICAgIChwQWQsIHBNc2c0LCBNc2dMZW4sIEVBUE9MX1BBSVJfTVNHXzQsIHBFbnRyeSkgPT0gRkFMU0UpCisJCQlicmVhazsKKworCQkvKiAzLiB1c2VzIHRoZSBNTE1FLlNFVEtFWVMucmVxdWVzdCB0byBjb25maWd1cmUgUFRLIGludG8gTUFDICovCisJCU5kaXNaZXJvTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LCBzaXplb2Yoc3RydWN0IHJ0X2NpcGhlcl9rZXkpKTsKKworCQkvKiByZXNldCBJVkVJViBpbiBBc2ljICovCisJCUFzaWNVcGRhdGVXQ0lESVZFSVYocEFkLCBwRW50cnktPkFpZCwgMSwgMCk7CisKKwkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKwkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwRW50cnktPlBUS1szMl0sCisJCQkgICAgICAgTEVOX1RLSVBfRUspOworCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLAorCQkJICAgICAgICZwRW50cnktPlBUS1tUS0lQX0FQX1JYTUlDS19PRkZTRVRdLAorCQkJICAgICAgIExFTl9US0lQX1JYTUlDSyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsCisJCQkgICAgICAgJnBFbnRyeS0+UFRLW1RLSVBfQVBfVFhNSUNLX09GRlNFVF0sCisJCQkgICAgICAgTEVOX1RLSVBfVFhNSUNLKTsKKworCQkvKiBTZXQgcGFpcndpc2Uga2V5IHRvIEFzaWMgKi8KKwkJeworCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCWlmIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJCQllbHNlIGlmIChwRW50cnktPldlcFN0YXR1cyA9PQorCQkJCSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKworCQkJLyogQWRkIFBhaXItd2lzZSBrZXkgdG8gQXNpYyAqLworCQkJQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkocEFkLAorCQkJCQkJcEVudHJ5LT5BZGRyLAorCQkJCQkJKHU4KXBFbnRyeS0+QWlkLAorCQkJCQkJJnBFbnRyeS0+UGFpcndpc2VLZXkpOworCisJCQkvKiB1cGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGVudHJ5ICovCisJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCSAgcEVudHJ5LT5hcGlkeCwKKwkJCQkJCSAgMCwKKwkJCQkJCSAgcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcsCisJCQkJCQkgIHBFbnRyeSk7CisJCX0KKworCQkvKiA0LiB1cGdyYWRlIHN0YXRlICovCisJCXBFbnRyeS0+UHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsOworCQlwRW50cnktPldwYVN0YXRlID0gQVNfUFRLSU5JVERPTkU7CisJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKworCQlpZiAocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIHx8CisJCSAgICBwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHsKKwkJCXBFbnRyeS0+R1RLU3RhdGUgPSBSRUtFWV9FU1RBQkxJU0hFRDsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEVudHJ5LT5SZXRyeVRpbWVyLCAmQ2FuY2VsbGVkKTsKKworCQkJLyogc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBzZXQga2V5IGRvbmUgV1BBMiAqLworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsCisJCQkJCQkgICAgICBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHLAorCQkJCQkJICAgICAgcEVudHJ5LT5BZGRyLAorCQkJCQkJICAgICAgcEVudHJ5LT5hcGlkeCwgMCk7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwKKwkJCQkgKCJBUCBTRVRLRVlTIERPTkUgLSBXUEEyLCBBdXRoTW9kZSglZCk9JXMsIFdlcFN0YXR1cyglZCk9JXMsIEdyb3VwV2VwU3RhdHVzKCVkKT0lc1xuXG4iLAorCQkJCSAgcEVudHJ5LT5BdXRoTW9kZSwKKwkJCQkgIEdldEF1dGhNb2RlKHBFbnRyeS0+QXV0aE1vZGUpLAorCQkJCSAgcEVudHJ5LT5XZXBTdGF0dXMsCisJCQkJICBHZXRFbmNyeXB0VHlwZShwRW50cnktPldlcFN0YXR1cyksCisJCQkJICBncm91cF9jaXBoZXIsIEdldEVuY3J5cHRUeXBlKGdyb3VwX2NpcGhlcikpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIDUuIGluaXQgR3JvdXAgMi13YXkgaGFuZHNoYWtlIGlmIG5lY2Vzc2FyeS4gKi8KKwkJCVdQQVN0YXJ0MldheUdyb3VwSFMocEFkLCBwRW50cnkpOworCisJCQlwRW50cnktPlJlVHJ5Q291bnRlciA9IEdST1VQX01TRzFfUkVUUllfVElNRVJfQ1RSOworCQkJUlRNUE1vZFRpbWVyKCZwRW50cnktPlJldHJ5VGltZXIsCisJCQkJICAgICBQRUVSX01TRzNfUkVUUllfRVhFQ19JTlRWKTsKKwkJfQorCX0gd2hpbGUgKEZBTFNFKTsKKworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFRoaXMgaXMgYSBmdW5jdGlvbiB0byBzZW5kIHRoZSBmaXJzdCBwYWNrZXQgb2YgMi13YXkgZ3JvdXBrZXkgaGFuZHNoYWtlCisgICAgUmV0dXJuOgorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFdQQVN0YXJ0MldheUdyb3VwSFMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpCit7CisJdTggSGVhZGVyODAyXzNbMTRdOworCXU4IFR4VHNjWzZdOworCXN0cnVjdCBydF9lYXBvbF9wYWNrZXQgRUFQT0xQS1Q7CisJdTggZ3JvdXBfY2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXU4IGRlZmF1bHRfa2V5ID0gMDsKKwl1OCAqZ25vbmNlX3B0ciA9IE5VTEw7CisJdTggKmd0a19wdHIgPSBOVUxMOworCXU4ICpwQnNzaWQgPSBOVUxMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBXUEFTdGFydDJXYXlHcm91cEhTXG4iKSk7CisKKwlpZiAoKCFwRW50cnkpIHx8ICghcEVudHJ5LT5WYWxpZEFzQ0xJKSkKKwkJcmV0dXJuOworCisJZG8geworCQkvKiBJbmNyZW1lbnQgcmVwbGF5IGNvdW50ZXIgYnkgMSAqLworCQlBRERfT05FX1RvXzY0QklUX1ZBUihwRW50cnktPlJfQ291bnRlcik7CisKKwkJLyogQ29uc3RydWN0IEVBUG9MIG1lc3NhZ2UgLSBHcm91cCBNc2cgMSAqLworCQlOZGlzWmVyb01lbW9yeSgmRUFQT0xQS1QsIHNpemVvZihzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0KSk7CisJCUNvbnN0cnVjdEVhcG9sTXNnKHBFbnRyeSwKKwkJCQkgIGdyb3VwX2NpcGhlciwKKwkJCQkgIEVBUE9MX0dST1VQX01TR18xLAorCQkJCSAgZGVmYXVsdF9rZXksCisJCQkJICAodTggKikgZ25vbmNlX3B0ciwKKwkJCQkgIFR4VHNjLCAodTggKikgZ3RrX3B0ciwgTlVMTCwgMCwgJkVBUE9MUEtUKTsKKworCQkvKiBNYWtlIG91dGdvaW5nIGZyYW1lICovCisJCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwRW50cnktPkFkZHIsIHBCc3NpZCwgRUFQT0wpOworCQlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIHBFbnRyeSwKKwkJCQkgIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsCisJCQkJICAodTggKikmIEVBUE9MUEtULAorCQkJCSAgQ09OVl9BUlJBUllfVE9fdTE2KEVBUE9MUEtULkJvZHlfTGVuKSArIDQsCisJCQkJICBGQUxTRSk7CisKKwl9IHdoaWxlIChGQUxTRSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPD09PSBXUEFTdGFydDJXYXlHcm91cEhTIDogc2VuZCBvdXQgR3JvdXAgTWVzc2FnZSAxIFxuIikpOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBHcm91cCBrZXkgMi13YXkgaGFuZHNoYWtpbmcKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFBlZXJHcm91cE1zZzFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKK3sKKwl1OCBIZWFkZXI4MDJfM1sxNF07CisJc3RydWN0IHJ0X2VhcG9sX3BhY2tldCBFQVBPTFBLVDsKKwlzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICogcEdyb3VwOworCXUzMiBNc2dMZW47CisJQk9PTEVBTiBDYW5jZWxsZWQ7CisJdTggZGVmYXVsdF9rZXkgPSAwOworCXU4IGdyb3VwX2NpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwl1OCAqcEN1cnJlbnRBZGRyID0gTlVMTDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlckdyb3VwTXNnMUFjdGlvbiBcbiIpKTsKKworCWlmICgoIXBFbnRyeSkgfHwgKCghcEVudHJ5LT5WYWxpZEFzQ0xJKSAmJiAoIXBFbnRyeS0+VmFsaWRBc0FwQ2xpKSkpCisJCXJldHVybjsKKworCXsKKwkJcEN1cnJlbnRBZGRyID0gcEFkLT5DdXJyZW50QWRkcmVzczsKKwkJZ3JvdXBfY2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7CisJCWRlZmF1bHRfa2V5ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCX0KKworCS8qIFByb2Nlc3MgR3JvdXAgTWVzc2FnZSAxIGZyYW1lLiBza2lwIDgwMi4xMSBoZWFkZXIoMjQpICYgTExDX1NOQVAgaGVhZGVyKDgpICovCisJcEdyb3VwID0gKHN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKikgJiBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKwlNc2dMZW4gPSBFbGVtLT5Nc2dMZW4gLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIXzgwMl8xX0g7CisKKwkvKiBTYW5pdHkgQ2hlY2sgcGVlciBncm91cCBtZXNzYWdlIDEgLSBSZXBsYXkgQ291bnRlciwgTUlDLCBSU05JRSAqLworCWlmIChQZWVyV3BhTWVzc2FnZVNhbml0eShwQWQsIHBHcm91cCwgTXNnTGVuLCBFQVBPTF9HUk9VUF9NU0dfMSwgcEVudHJ5KQorCSAgICA9PSBGQUxTRSkKKwkJcmV0dXJuOworCisJLyogZGVsZXRlIHJldHJ5IHRpbWVyICovCisJUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPlJldHJ5VGltZXIsICZDYW5jZWxsZWQpOworCisJLyogU2F2ZSBSZXBsYXkgY291bnRlciwgaXQgd2lsbCB1c2UgdG8gY29uc3RydWN0IG1lc3NhZ2UgMiAqLworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLCBwR3JvdXAtPktleURlc2MuUmVwbGF5Q291bnRlciwKKwkJICAgICAgIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLyogQ29uc3RydWN0IEVBUG9MIG1lc3NhZ2UgLSBHcm91cCBNc2cgMiAqLworCU5kaXNaZXJvTWVtb3J5KCZFQVBPTFBLVCwgc2l6ZW9mKHN0cnVjdCBydF9lYXBvbF9wYWNrZXQpKTsKKwlDb25zdHJ1Y3RFYXBvbE1zZyhwRW50cnksIGdyb3VwX2NpcGhlciwgRUFQT0xfR1JPVVBfTVNHXzIsIGRlZmF1bHRfa2V5LCBOVUxMLAkvKiBOb25jZSBub3QgdXNlZCAqLworCQkJICBOVUxMLAkvKiBUeFJTQyBub3QgdXNlZCAqLworCQkJICBOVUxMLAkvKiBHVEsgbm90IHVzZWQgKi8KKwkJCSAgTlVMTCwJLyogUlNOIElFIG5vdCB1c2VkICovCisJCQkgIDAsICZFQVBPTFBLVCk7CisKKwkvKiBvcGVuIDgwMi4xeCBwb3J0IGNvbnRyb2wgYW5kIHByaXZhY3kgZmlsdGVyICovCisJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCXBFbnRyeS0+UHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsOworCisJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCS8qIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJICovCisJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJQZWVyR3JvdXBNc2cxQWN0aW9uOiBBdXRoTW9kZSglcykgUGFpcndpc2VDaXBoZXIoJXMpIEdyb3VwQ2lwaGVyKCVzKSBcbiIsCisJCSAgR2V0QXV0aE1vZGUocEVudHJ5LT5BdXRoTW9kZSksCisJCSAgR2V0RW5jcnlwdFR5cGUocEVudHJ5LT5XZXBTdGF0dXMpLAorCQkgIEdldEVuY3J5cHRUeXBlKGdyb3VwX2NpcGhlcikpKTsKKworCS8qIGluaXQgaGVhZGVyIGFuZCBGaWxsIFBhY2tldCBhbmQgc2VuZCBNc2cgMiB0byBhdXRoZW50aWNhdG9yICovCisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBFbnRyeS0+QWRkciwgcEN1cnJlbnRBZGRyLCBFQVBPTCk7CisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBwRW50cnksCisJCQkgIEhlYWRlcjgwMl8zLCBzaXplb2YoSGVhZGVyODAyXzMpLAorCQkJICAodTggKikmIEVBUE9MUEtULAorCQkJICBDT05WX0FSUkFSWV9UT191MTYoRUFQT0xQS1QuQm9keV9MZW4pICsgNCwgRkFMU0UpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIjw9PT0gUGVlckdyb3VwTXNnMUFjdGlvbjogc25lZCBncm91cCBtZXNzYWdlIDJcbiIpKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBXaGVuIHJlY2VpdmluZyB0aGUgbGFzdCBwYWNrZXQgb2YgMi13YXkgZ3JvdXBrZXkgaGFuZHNoYWtlLgorICAgIFJldHVybjoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUGVlckdyb3VwTXNnMkFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkJIHZvaWQgKiBNc2csIHUzMiBNc2dMZW4pCit7CisJdTMyIExlbjsKKwl1OCAqcERhdGE7CisJQk9PTEVBTiBDYW5jZWxsZWQ7CisJc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqIHBNc2cyOworCXU4IGdyb3VwX2NpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlckdyb3VwTXNnMkFjdGlvbiBcbiIpKTsKKworCWRvIHsKKwkJaWYgKCghcEVudHJ5KSB8fCAoIXBFbnRyeS0+VmFsaWRBc0NMSSkpCisJCQlicmVhazsKKworCQlpZiAoTXNnTGVuIDwKKwkJICAgIChMRU5HVEhfODAyXzFfSCArIExFTkdUSF9FQVBPTF9IICsgc2l6ZW9mKHN0cnVjdCBydF9rZXlfZGVzY3JpcHRlcikgLQorCQkgICAgIE1BWF9MRU5fT0ZfUlNOSUUgLSAyKSkKKwkJCWJyZWFrOworCisJCWlmIChwRW50cnktPldwYVN0YXRlICE9IEFTX1BUS0lOSVRET05FKQorCQkJYnJlYWs7CisKKwkJcERhdGEgPSAodTggKilNc2c7CisJCXBNc2cyID0gKHN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKikgKHBEYXRhICsgTEVOR1RIXzgwMl8xX0gpOworCQlMZW4gPSBNc2dMZW4gLSBMRU5HVEhfODAyXzFfSDsKKworCQkvKiBTYW5pdHkgQ2hlY2sgcGVlciBncm91cCBtZXNzYWdlIDIgLSBSZXBsYXkgQ291bnRlciwgTUlDICovCisJCWlmIChQZWVyV3BhTWVzc2FnZVNhbml0eQorCQkgICAgKHBBZCwgcE1zZzIsIExlbiwgRUFQT0xfR1JPVVBfTVNHXzIsIHBFbnRyeSkgPT0gRkFMU0UpCisJCQlicmVhazsKKworCQkvKiAzLiAgdXBncmFkZSBzdGF0ZSAqLworCisJCVJUTVBDYW5jZWxUaW1lcigmcEVudHJ5LT5SZXRyeVRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJcEVudHJ5LT5HVEtTdGF0ZSA9IFJFS0VZX0VTVEFCTElTSEVEOworCisJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorCQkgICAgfHwgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpIHsKKwkJCS8qIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3Igc2V0IGtleSBkb25lIFdQQTIgKi8KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLAorCQkJCQkJICAgICAgSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRywKKwkJCQkJCSAgICAgIHBFbnRyeS0+QWRkciwKKwkJCQkJCSAgICAgIHBFbnRyeS0+YXBpZHgsIDApOworCisJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsCisJCQkJICgiQVAgU0VUS0VZUyBET05FIC0gV1BBMiwgQXV0aE1vZGUoJWQpPSVzLCBXZXBTdGF0dXMoJWQpPSVzLCBHcm91cFdlcFN0YXR1cyglZCk9JXNcblxuIiwKKwkJCQkgIHBFbnRyeS0+QXV0aE1vZGUsCisJCQkJICBHZXRBdXRoTW9kZShwRW50cnktPkF1dGhNb2RlKSwKKwkJCQkgIHBFbnRyeS0+V2VwU3RhdHVzLAorCQkJCSAgR2V0RW5jcnlwdFR5cGUocEVudHJ5LT5XZXBTdGF0dXMpLAorCQkJCSAgZ3JvdXBfY2lwaGVyLCBHZXRFbmNyeXB0VHlwZShncm91cF9jaXBoZXIpKSk7CisJCX0gZWxzZSB7CisJCQkvKiBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHNldCBrZXkgZG9uZSBXUEEgKi8KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLAorCQkJCQkJICAgICAgSVdfU0VUX0tFWV9ET05FX1dQQTFfRVZFTlRfRkxBRywKKwkJCQkJCSAgICAgIHBFbnRyeS0+QWRkciwKKwkJCQkJCSAgICAgIHBFbnRyeS0+YXBpZHgsIDApOworCisJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsCisJCQkJICgiQVAgU0VUS0VZUyBET05FIC0gV1BBMSwgQXV0aE1vZGUoJWQpPSVzLCBXZXBTdGF0dXMoJWQpPSVzLCBHcm91cFdlcFN0YXR1cyglZCk9JXNcblxuIiwKKwkJCQkgIHBFbnRyeS0+QXV0aE1vZGUsCisJCQkJICBHZXRBdXRoTW9kZShwRW50cnktPkF1dGhNb2RlKSwKKwkJCQkgIHBFbnRyeS0+V2VwU3RhdHVzLAorCQkJCSAgR2V0RW5jcnlwdFR5cGUocEVudHJ5LT5XZXBTdGF0dXMpLAorCQkJCSAgZ3JvdXBfY2lwaGVyLCBHZXRFbmNyeXB0VHlwZShncm91cF9jaXBoZXIpKSk7CisJCX0KKwl9IHdoaWxlIChGQUxTRSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDbGFzc2lmeSBXUEEgRUFQIG1lc3NhZ2UgdHlwZQorCisJQXJndW1lbnRzOgorCQlFQVBUeXBlCQlWYWx1ZSBvZiBFQVAgbWVzc2FnZSB0eXBlCisJCU1zZ1R5cGUJCUludGVybmFsIE1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgTUxNRSBzdGF0ZSBtYWNoaW5lCisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUJCUZvdW5kIGFwcHJvcHJpYXRlIG1lc3NhZ2UgdHlwZQorCQlGQUxTRQkJTm8gYXBwcm9wcmlhdGUgbWVzc2FnZSB0eXBlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisJCUFsbCB0aGVzZSBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gd3BhLmgKKwkJRm9yIHN1cHBsaWNhbnQsIHRoZXJlIGlzIG9ubHkgRUFQT0wgS2V5IG1lc3NhZ2UgYXZhbGlhYmxlCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFdwYU1zZ1R5cGVTdWJzdCh1OCBFQVBUeXBlLCBpbnQgKiBNc2dUeXBlKQoreworCXN3aXRjaCAoRUFQVHlwZSkgeworCWNhc2UgRUFQUGFja2V0OgorCQkqTXNnVHlwZSA9IE1UMl9FQVBQYWNrZXQ7CisJCWJyZWFrOworCWNhc2UgRUFQT0xTdGFydDoKKwkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xTdGFydDsKKwkJYnJlYWs7CisJY2FzZSBFQVBPTExvZ29mZjoKKwkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xMb2dvZmY7CisJCWJyZWFrOworCWNhc2UgRUFQT0xLZXk6CisJCSpNc2dUeXBlID0gTVQyX0VBUE9MS2V5OworCQlicmVhazsKKwljYXNlIEVBUE9MQVNGQWxlcnQ6CisJCSpNc2dUeXBlID0gTVQyX0VBUE9MQVNGQWxlcnQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBGQUxTRTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC02Nyw3MiArMTI2MSwxMTggQEAKIAkJSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBQVEssIEdUSyBvciBzb21lIHNwZWNpZmljIHJhbmRvbSB2YWx1ZS4KIAogCUFyZ3VtZW50czoKLQkJVUNIQVIJKmtleSwJCS0JdGhlIGtleSBtYXRlcmlhbCBmb3IgSE1BQ19TSEExIHVzZQotCQlJTlQJCWtleV9sZW4JCS0JdGhlIGxlbmd0aCBvZiBrZXkKLQkJVUNIQVIJKnByZWZpeAkJLQlhIHByZWZpeCBsYWJlbAotCQlJTlQJCXByZWZpeF9sZW4JLQl0aGUgbGVuZ3RoIG9mIHRoZSBsYWJlbAotCQlVQ0hBUgkqZGF0YQkJLQlhIHNwZWNpZmljIGRhdGEgd2l0aCB2YXJpYWJsZSBsZW5ndGgKLQkJSU5UCQlkYXRhX2xlbgktCXRoZSBsZW5ndGggb2YgYSBzcGVjaWZpYyBkYXRhCi0JCUlOVAkJbGVuCQkJLQl0aGUgb3V0cHV0IGxlbmdodAorCQl1OAkqa2V5LAkJLQl0aGUga2V5IG1hdGVyaWFsIGZvciBITUFDX1NIQTEgdXNlCisJCWludAkJa2V5X2xlbgkJLQl0aGUgbGVuZ3RoIG9mIGtleQorCQl1OAkqcHJlZml4CQktCWEgcHJlZml4IGxhYmVsCisJCWludAkJcHJlZml4X2xlbgktCXRoZSBsZW5ndGggb2YgdGhlIGxhYmVsCisJCXU4CSpkYXRhCQktCWEgc3BlY2lmaWMgZGF0YSB3aXRoIHZhcmlhYmxlIGxlbmd0aAorCQlpbnQJCWRhdGFfbGVuCS0JdGhlIGxlbmd0aCBvZiBhIHNwZWNpZmljIGRhdGEKKwkJaW50CQlsZW4JCQktCXRoZSBvdXRwdXQgbGVuZ2h0CiAKIAlSZXR1cm4gVmFsdWU6Ci0JCVVDSEFSCSpvdXRwdXQJCS0JdGhlIGNhbGN1bGF0ZWQgcmVzdWx0CisJCXU4CSpvdXRwdXQJCS0JdGhlIGNhbGN1bGF0ZWQgcmVzdWx0CiAKIAlOb3RlOgogCQk4MDIuMTFpLTIwMDQJQW5uZXggSC4zCiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVBSRigKLQlJTglVQ0hBUgkqa2V5LAotCUlOCUlOVAkJa2V5X2xlbiwKLQlJTglVQ0hBUgkqcHJlZml4LAotCUlOCUlOVAkJcHJlZml4X2xlbiwKLQlJTglVQ0hBUgkqZGF0YSwKLQlJTglJTlQJCWRhdGFfbGVuLAotCU9VVAlVQ0hBUgkqb3V0cHV0LAotCUlOCUlOVAkJbGVuKQordm9pZCBQUkYodTggKiBrZXksCisJIGludCBrZXlfbGVuLAorCSB1OCAqIHByZWZpeCwKKwkgaW50IHByZWZpeF9sZW4sCisJIHU4ICogZGF0YSwgaW50IGRhdGFfbGVuLCB1OCAqIG91dHB1dCwgaW50IGxlbikKIHsKLQlJTlQJCWk7Ci0gICAgVUNIQVIgICAqaW5wdXQ7Ci0JSU5UCQljdXJyZW50aW5kZXggPSAwOwotCUlOVAkJdG90YWxfbGVuOworCWludCBpOworCXU4ICppbnB1dDsKKwlpbnQgY3VycmVudGluZGV4ID0gMDsKKwlpbnQgdG90YWxfbGVuOwogCi0JLy8gQWxsb2NhdGUgbWVtb3J5IGZvciBpbnB1dAotCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJmlucHV0LCAxMDI0KTsKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGlucHV0ICovCisJb3NfYWxsb2NfbWVtKE5VTEwsICh1OCAqKikgJiBpbnB1dCwgMTAyNCk7CiAKLSAgICBpZiAoaW5wdXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiEhIVBSRjogbm8gbWVtb3J5ISEhXG4iKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLQkvLyBHZW5lcmF0ZSBjb25jYXRlbmF0aW9uIGlucHV0CisJaWYgKGlucHV0ID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUFJGOiBubyBtZW1vcnkhXG4iKSk7CisJCXJldHVybjsKKwl9CisJLyogR2VuZXJhdGUgY29uY2F0ZW5hdGlvbiBpbnB1dCAqLwogCU5kaXNNb3ZlTWVtb3J5KGlucHV0LCBwcmVmaXgsIHByZWZpeF9sZW4pOwogCi0JLy8gQ29uY2F0ZW5hdGUgYSBzaW5nbGUgb2N0ZXQgY29udGFpbmluZyAwCi0JaW5wdXRbcHJlZml4X2xlbl0gPQkwOworCS8qIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMCAqLworCWlucHV0W3ByZWZpeF9sZW5dID0gMDsKIAotCS8vIENvbmNhdGVuYXRlIHNwZWNpZmljIGRhdGEKKwkvKiBDb25jYXRlbmF0ZSBzcGVjaWZpYyBkYXRhICovCiAJTmRpc01vdmVNZW1vcnkoJmlucHV0W3ByZWZpeF9sZW4gKyAxXSwgZGF0YSwgZGF0YV9sZW4pOwotCXRvdGFsX2xlbiA9CXByZWZpeF9sZW4gKyAxICsgZGF0YV9sZW47CisJdG90YWxfbGVuID0gcHJlZml4X2xlbiArIDEgKyBkYXRhX2xlbjsKIAotCS8vIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMAotCS8vIFRoaXMgb2N0ZXQgc2hhbGwgYmUgdXBkYXRlIGxhdGVyCisJLyogQ29uY2F0ZW5hdGUgYSBzaW5nbGUgb2N0ZXQgY29udGFpbmluZyAwICovCisJLyogVGhpcyBvY3RldCBzaGFsbCBiZSB1cGRhdGUgbGF0ZXIgKi8KIAlpbnB1dFt0b3RhbF9sZW5dID0gMDsKIAl0b3RhbF9sZW4rKzsKIAotCS8vIEl0ZXJhdGUgdG8gY2FsY3VsYXRlIHRoZSByZXN1bHQgYnkgaG1hYy1zaGEtMQotCS8vIFRoZW4gY29uY2F0ZW5hdGUgdG8gbGFzdCByZXN1bHQKLQlmb3IJKGkgPSAwOwlpIDwJKGxlbiArIDE5KSAvIDIwOyBpKyspCi0JewotCQlITUFDX1NIQTEoaW5wdXQsIHRvdGFsX2xlbiwJa2V5LCBrZXlfbGVuLCAmb3V0cHV0W2N1cnJlbnRpbmRleF0pOwotCQljdXJyZW50aW5kZXggKz0JMjA7CisJLyogSXRlcmF0ZSB0byBjYWxjdWxhdGUgdGhlIHJlc3VsdCBieSBobWFjLXNoYS0xICovCisJLyogVGhlbiBjb25jYXRlbmF0ZSB0byBsYXN0IHJlc3VsdCAqLworCWZvciAoaSA9IDA7IGkgPCAobGVuICsgMTkpIC8gMjA7IGkrKykgeworCQlITUFDX1NIQTEoa2V5LCBrZXlfbGVuLCBpbnB1dCwgdG90YWxfbGVuLCAmb3V0cHV0W2N1cnJlbnRpbmRleF0sCisJCQkgIFNIQTFfRElHRVNUX1NJWkUpOworCQljdXJyZW50aW5kZXggKz0gMjA7CiAKLQkJLy8gdXBkYXRlIHRoZSBsYXN0IG9jdGV0CisJCS8qIHVwZGF0ZSB0aGUgbGFzdCBvY3RldCAqLwogCQlpbnB1dFt0b3RhbF9sZW4gLSAxXSsrOwogCX0KLSAgICBvc19mcmVlX21lbShOVUxMLCBpbnB1dCk7CisJb3NfZnJlZV9tZW0oTlVMTCwgaW5wdXQpOworfQorCisvKgorKiBGKFAsIFMsIGMsIGkpID0gVTEgeG9yIFUyIHhvciAuLi4gVWMKKyogVTEgPSBQUkYoUCwgUyB8fCBJbnQoaSkpCisqIFUyID0gUFJGKFAsIFUxKQorKiBVYyA9IFBSRihQLCBVYy0xKQorKi8KKworc3RhdGljIHZvaWQgRihjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsCisJICAgICAgaW50IGl0ZXJhdGlvbnMsIGludCBjb3VudCwgdW5zaWduZWQgY2hhciAqb3V0cHV0KQoreworCXVuc2lnbmVkIGNoYXIgZGlnZXN0WzM2XSwgZGlnZXN0MVtTSEExX0RJR0VTVF9TSVpFXTsKKwlpbnQgaSwgajsKKworCS8qIFUxID0gUFJGKFAsIFMgfHwgaW50KGkpKSAqLworCW1lbWNweShkaWdlc3QsIHNzaWQsIHNzaWRsZW5ndGgpOworCWRpZ2VzdFtzc2lkbGVuZ3RoXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQgPj4gMjQpICYgMHhmZik7CisJZGlnZXN0W3NzaWRsZW5ndGggKyAxXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQgPj4gMTYpICYgMHhmZik7CisJZGlnZXN0W3NzaWRsZW5ndGggKyAyXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQgPj4gOCkgJiAweGZmKTsKKwlkaWdlc3Rbc3NpZGxlbmd0aCArIDNdID0gKHVuc2lnbmVkIGNoYXIpKGNvdW50ICYgMHhmZik7CisJSE1BQ19TSEExKCh1bnNpZ25lZCBjaGFyICopcGFzc3dvcmQsIChpbnQpc3RybGVuKHBhc3N3b3JkKSwgZGlnZXN0LCBzc2lkbGVuZ3RoICsgNCwgZGlnZXN0MSwgU0hBMV9ESUdFU1RfU0laRSk7CS8qIGZvciBXUEEgdXBkYXRlICovCisKKwkvKiBvdXRwdXQgPSBVMSAqLworCW1lbWNweShvdXRwdXQsIGRpZ2VzdDEsIFNIQTFfRElHRVNUX1NJWkUpOworCisJZm9yIChpID0gMTsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgeworCQkvKiBVbiA9IFBSRihQLCBVbi0xKSAqLworCQlITUFDX1NIQTEoKHVuc2lnbmVkIGNoYXIgKilwYXNzd29yZCwgKGludClzdHJsZW4ocGFzc3dvcmQpLCBkaWdlc3QxLCBTSEExX0RJR0VTVF9TSVpFLCBkaWdlc3QsIFNIQTFfRElHRVNUX1NJWkUpOwkvKiBmb3IgV1BBIHVwZGF0ZSAqLworCQltZW1jcHkoZGlnZXN0MSwgZGlnZXN0LCBTSEExX0RJR0VTVF9TSVpFKTsKKworCQkvKiBvdXRwdXQgPSBvdXRwdXQgeG9yIFVuICovCisJCWZvciAoaiA9IDA7IGogPCBTSEExX0RJR0VTVF9TSVpFOyBqKyspIHsKKwkJCW91dHB1dFtqXSBePSBkaWdlc3Rbal07CisJCX0KKwl9Cit9CisKKy8qCisqIHBhc3N3b3JkIC0gYXNjaWkgc3RyaW5nIHVwIHRvIDYzIGNoYXJhY3RlcnMgaW4gbGVuZ3RoCisqIHNzaWQgLSBvY3RldCBzdHJpbmcgdXAgdG8gMzIgb2N0ZXRzCisqIHNzaWRsZW5ndGggLSBsZW5ndGggb2Ygc3NpZCBpbiBvY3RldHMKKyogb3V0cHV0IG11c3QgYmUgNDAgb2N0ZXRzIGluIGxlbmd0aCBhbmQgb3V0cHV0cyAyNTYgYml0cyBvZiBrZXkKKyovCitpbnQgUGFzc3dvcmRIYXNoKGNoYXIgKnBhc3N3b3JkLCB1OCAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIHU4ICpvdXRwdXQpCit7CisJaWYgKChzdHJsZW4ocGFzc3dvcmQpID4gNjMpIHx8IChzc2lkbGVuZ3RoID4gMzIpKQorCQlyZXR1cm4gMDsKKworCUYocGFzc3dvcmQsIHNzaWQsIHNzaWRsZW5ndGgsIDQwOTYsIDEsIG91dHB1dCk7CisJRihwYXNzd29yZCwgc3NpZCwgc3NpZGxlbmd0aCwgNDA5NiwgMiwgJm91dHB1dFtTSEExX0RJR0VTVF9TSVpFXSk7CisJcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC0xNDMsNyArMTM4Myw3IEBACiAJCUl0IHNoYWxsIGJlIGNhbGxlZCBieSA0LXdheSBoYW5kc2hha2UgcHJvY2Vzc2luZy4KIAogCUFyZ3VtZW50czoKLQkJcEFkIAktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKwkJcEFkCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAogCQlQTUsJCS0JcG9pbnRlciB0byBQTUsKIAkJQU5vbmNlCS0JcG9pbnRlciB0byBBTm9uY2UKIAkJQUEJCS0JcG9pbnRlciB0byBBdXRoZW50aWNhdG9yIEFkZHJlc3MKQEAgLTE1OSw1NiArMTM5OSw1NSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBXcGFDb3VudFBUSygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkqUE1LLAotCUlOCVVDSEFSCSpBTm9uY2UsCi0JSU4JVUNIQVIJKkFBLAotCUlOCVVDSEFSCSpTTm9uY2UsCi0JSU4JVUNIQVIJKlNBLAotCU9VVAlVQ0hBUgkqb3V0cHV0LAotCUlOCVVJTlQJbGVuKQordm9pZCBXcGFEZXJpdmVQVEsoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgIHU4ICogUE1LLAorCQkgIHU4ICogQU5vbmNlLAorCQkgIHU4ICogQUEsCisJCSAgdTggKiBTTm9uY2UsCisJCSAgdTggKiBTQSwgdTggKiBvdXRwdXQsIHUzMiBsZW4pCiB7Ci0JVUNIQVIJY29uY2F0ZW5hdGlvbls3Nl07Ci0JVUlOVAlDdXJyUG9zID0gMDsKLQlVQ0hBUgl0ZW1wWzMyXTsKLQlVQ0hBUglQcmVmaXhbXSA9IHsnUCcsICdhJywgJ2knLCAncicsICd3JywgJ2knLCAncycsICdlJywgJyAnLCAnaycsICdlJywgJ3knLCAnICcsCi0JCQkJCQknZScsICd4JywgJ3AnLCAnYScsICduJywgJ3MnLCAnaScsICdvJywgJ24nfTsKKwl1OCBjb25jYXRlbmF0aW9uWzc2XTsKKwl1MzIgQ3VyclBvcyA9IDA7CisJdTggdGVtcFszMl07CisJdTggUHJlZml4W10gPQorCSAgICB7ICdQJywgJ2EnLCAnaScsICdyJywgJ3cnLCAnaScsICdzJywgJ2UnLCAnICcsICdrJywgJ2UnLCAneScsICcgJywKKwkJJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdzJywgJ2knLCAnbycsICduJworCX07CiAKLQkvLyBpbml0aWF0ZSB0aGUgY29uY2F0ZW5hdGlvbiBpbnB1dAorCS8qIGluaXRpYXRlIHRoZSBjb25jYXRlbmF0aW9uIGlucHV0ICovCiAJTmRpc1plcm9NZW1vcnkodGVtcCwgc2l6ZW9mKHRlbXApKTsKIAlOZGlzWmVyb01lbW9yeShjb25jYXRlbmF0aW9uLCA3Nik7CiAKLQkvLyBHZXQgc21hbGxlciBhZGRyZXNzCisJLyogR2V0IHNtYWxsZXIgYWRkcmVzcyAqLwogCWlmIChSVE1QQ29tcGFyZU1lbW9yeShTQSwgQUEsIDYpID09IDEpCiAJCU5kaXNNb3ZlTWVtb3J5KGNvbmNhdGVuYXRpb24sIEFBLCA2KTsKIAllbHNlCiAJCU5kaXNNb3ZlTWVtb3J5KGNvbmNhdGVuYXRpb24sIFNBLCA2KTsKIAlDdXJyUG9zICs9IDY7CiAKLQkvLyBHZXQgbGFyZ2VyIGFkZHJlc3MKKwkvKiBHZXQgbGFyZ2VyIGFkZHJlc3MgKi8KIAlpZiAoUlRNUENvbXBhcmVNZW1vcnkoU0EsIEFBLCA2KSA9PSAxKQogCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgU0EsIDYpOwogCWVsc2UKIAkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIEFBLCA2KTsKIAotCS8vIHN0b3JlIHRoZSBsYXJnZXIgbWFjIGFkZHJlc3MgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgb2YKLQkvLyByYWxpbmsgcHJvcHJpZXRhcnkgU1RBLWtleSBpc3N1ZQorCS8qIHN0b3JlIHRoZSBsYXJnZXIgbWFjIGFkZHJlc3MgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgb2YgKi8KKwkvKiByYWxpbmsgcHJvcHJpZXRhcnkgU1RBLWtleSBpc3N1ZSAqLwogCU5kaXNNb3ZlTWVtb3J5KHRlbXAsICZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBNQUNfQUREUl9MRU4pOwogCUN1cnJQb3MgKz0gNjsKIAotCS8vIEdldCBzbWFsbGVyIE5vbmNlCisJLyogR2V0IHNtYWxsZXIgTm9uY2UgKi8KIAlpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAwKQotCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgdGVtcCwgMzIpOwkvLyBwYXRjaCBmb3IgcmFsaW5rIHByb3ByaWV0YXJ5IFNUQS1rZXkgaXNzdWUKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIHRlbXAsIDMyKTsJLyogcGF0Y2ggZm9yIHJhbGluayBwcm9wcmlldGFyeSBTVEEta2V5IGlzc3VlICovCiAJZWxzZSBpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAxKQogCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgU05vbmNlLCAzMik7CiAJZWxzZQogCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgQU5vbmNlLCAzMik7CiAJQ3VyclBvcyArPSAzMjsKIAotCS8vIEdldCBsYXJnZXIgTm9uY2UKKwkvKiBHZXQgbGFyZ2VyIE5vbmNlICovCiAJaWYgKFJUTVBDb21wYXJlTWVtb3J5KEFOb25jZSwgU05vbmNlLCAzMikgPT0gMCkKLQkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIHRlbXAsIDMyKTsJLy8gcGF0Y2ggZm9yIHJhbGluayBwcm9wcmlldGFyeSBTVEEta2V5IGlzc3VlCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCB0ZW1wLCAzMik7CS8qIHBhdGNoIGZvciByYWxpbmsgcHJvcHJpZXRhcnkgU1RBLWtleSBpc3N1ZSAqLwogCWVsc2UgaWYgKFJUTVBDb21wYXJlTWVtb3J5KEFOb25jZSwgU05vbmNlLCAzMikgPT0gMSkKIAkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIEFOb25jZSwgMzIpOwogCWVsc2UKQEAgLTIxNyw3ICsxNDU2LDcgQEAKIAogCWhleF9kdW1wKCJjb25jYXRlbmF0aW9uPSIsIGNvbmNhdGVuYXRpb24sIDc2KTsKIAotCS8vIFVzZSBQUkYgdG8gZ2VuZXJhdGUgUFRLCisJLyogVXNlIFBSRiB0byBnZW5lcmF0ZSBQVEsgKi8KIAlQUkYoUE1LLCBMRU5fTUFTVEVSX0tFWSwgUHJlZml4LCAyMiwgY29uY2F0ZW5hdGlvbiwgNzYsIG91dHB1dCwgbGVuKTsKIAogfQpAQCAtMjM5LDQ2ICsxNDc4LDQzIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECUdlblJhbmRvbSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCSptYWNBZGRyLAotCU9VVAlVQ0hBUgkJCSpyYW5kb20pCit2b2lkIEdlblJhbmRvbShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICogbWFjQWRkciwgdTggKiByYW5kb20pCiB7Ci0JSU5UCQlpLCBjdXJyOwotCVVDSEFSCWxvY2FsWzgwXSwgS2V5Q291bnRlclszMl07Ci0JVUNIQVIJcmVzdWx0WzgwXTsKLQlVTE9ORwlDdXJyZW50VGltZTsKLQlVQ0hBUglwcmVmaXhbXSA9IHsnSScsICduJywgJ2knLCAndCcsICcgJywgJ0MnLCAnbycsICd1JywgJ24nLCAndCcsICdlJywgJ3InfTsKKwlpbnQgaSwgY3VycjsKKwl1OCBsb2NhbFs4MF0sIEtleUNvdW50ZXJbMzJdOworCXU4IHJlc3VsdFs4MF07CisJdW5zaWduZWQgbG9uZyBDdXJyZW50VGltZTsKKwl1OCBwcmVmaXhbXSA9CisJICAgIHsgJ0knLCAnbicsICdpJywgJ3QnLCAnICcsICdDJywgJ28nLCAndScsICduJywgJ3QnLCAnZScsICdyJyB9OwogCi0JLy8gWmVybyB0aGUgcmVsYXRlZCBpbmZvcm1hdGlvbgorCS8qIFplcm8gdGhlIHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KIAlOZGlzWmVyb01lbW9yeShyZXN1bHQsIDgwKTsKIAlOZGlzWmVyb01lbW9yeShsb2NhbCwgODApOwogCU5kaXNaZXJvTWVtb3J5KEtleUNvdW50ZXIsIDMyKTsKIAotCWZvcgkoaSA9IDA7CWkgPAkzMjsJaSsrKQotCXsKLQkJLy8gY29weSB0aGUgbG9jYWwgTUFDIGFkZHJlc3MKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQkvKiBjb3B5IHRoZSBsb2NhbCBNQUMgYWRkcmVzcyAqLwogCQlDT1BZX01BQ19BRERSKGxvY2FsLCBtYWNBZGRyKTsKLQkJY3VyciA9CU1BQ19BRERSX0xFTjsKKwkJY3VyciA9IE1BQ19BRERSX0xFTjsKIAotCQkvLyBjb25jYXRlbmF0ZSB0aGUgY3VycmVudCB0aW1lCisJCS8qIGNvbmNhdGVuYXRlIHRoZSBjdXJyZW50IHRpbWUgKi8KIAkJTmRpc0dldFN5c3RlbVVwVGltZSgmQ3VycmVudFRpbWUpOwotCQlOZGlzTW92ZU1lbW9yeSgmbG9jYWxbY3Vycl0sICAmQ3VycmVudFRpbWUsCXNpemVvZihDdXJyZW50VGltZSkpOwotCQljdXJyICs9CXNpemVvZihDdXJyZW50VGltZSk7CisJCU5kaXNNb3ZlTWVtb3J5KCZsb2NhbFtjdXJyXSwgJkN1cnJlbnRUaW1lLCBzaXplb2YoQ3VycmVudFRpbWUpKTsKKwkJY3VyciArPSBzaXplb2YoQ3VycmVudFRpbWUpOwogCi0JCS8vIGNvbmNhdGVuYXRlIHRoZSBsYXN0IHJlc3VsdAotCQlOZGlzTW92ZU1lbW9yeSgmbG9jYWxbY3Vycl0sICByZXN1bHQsIDMyKTsKLQkJY3VyciArPQkzMjsKKwkJLyogY29uY2F0ZW5hdGUgdGhlIGxhc3QgcmVzdWx0ICovCisJCU5kaXNNb3ZlTWVtb3J5KCZsb2NhbFtjdXJyXSwgcmVzdWx0LCAzMik7CisJCWN1cnIgKz0gMzI7CiAKLQkJLy8gY29uY2F0ZW5hdGUgYSB2YXJpYWJsZQotCQlOZGlzTW92ZU1lbW9yeSgmbG9jYWxbY3Vycl0sICAmaSwgIDIpOwotCQljdXJyICs9CTI7CisJCS8qIGNvbmNhdGVuYXRlIGEgdmFyaWFibGUgKi8KKwkJTmRpc01vdmVNZW1vcnkoJmxvY2FsW2N1cnJdLCAmaSwgMik7CisJCWN1cnIgKz0gMjsKIAotCQkvLyBjYWxjdWxhdGUgdGhlIHJlc3VsdAotCQlQUkYoS2V5Q291bnRlciwgMzIsIHByZWZpeCwxMiwgbG9jYWwsIGN1cnIsIHJlc3VsdCwgMzIpOworCQkvKiBjYWxjdWxhdGUgdGhlIHJlc3VsdCAqLworCQlQUkYoS2V5Q291bnRlciwgMzIsIHByZWZpeCwgMTIsIGxvY2FsLCBjdXJyLCByZXN1bHQsIDMyKTsKIAl9CiAKLQlOZGlzTW92ZU1lbW9yeShyYW5kb20sIHJlc3VsdCwJMzIpOworCU5kaXNNb3ZlTWVtb3J5KHJhbmRvbSwgcmVzdWx0LCAzMik7CiB9CiAKIC8qCkBAIC0yOTAsOCArMTUyNiw4IEBACiAKIAlBcmd1bWVudHM6CiAJCXBBZAkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAotICAgIAlFbGVtZW50SUQJLQlpbmRpY2F0ZSB0aGUgV1BBMSBvciBXUEEyCi0gICAgCVdlcFN0YXR1cwktCWluZGljYXRlIHRoZSBlbmNyeXB0aW9uIHR5cGUKKwlFbGVtZW50SUQJLQlpbmRpY2F0ZSB0aGUgV1BBMSBvciBXUEEyCisJV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQogCQliTWl4Q2lwaGVyCS0JYSBib29sZWFuIHRvIGluZGljYXRlIHRoZSBwYWlyd2lzZSBjaXBoZXIgYW5kIGdyb3VwCiAJCQkJCQljaXBoZXIgYXJlIHRoZSBzYW1lIG9yIG5vdAogCkBAIC0zMDEsMTcwICsxNTM3LDE2OSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotc3RhdGljIFZPSUQgUlRNUEluc2VydFJzbkllQ2lwaGVyKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJRWxlbWVudElELAotCUlOCVVJTlQJCQlXZXBTdGF0dXMsCi0JSU4JQk9PTEVBTgkJCWJNaXhDaXBoZXIsCi0JSU4JVUNIQVIJCQlGbGV4aWJsZUNpcGhlciwKLQlPVVQJUFVDSEFSCQkJcFJzbkllLAotCU9VVAlVQ0hBUgkJCSpyc25fbGVuKQorc3RhdGljIHZvaWQgUlRNUE1ha2VSc25JZUNpcGhlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJdTggRWxlbWVudElELAorCQkJCXUzMiBXZXBTdGF0dXMsCisJCQkJSU4gQk9PTEVBTiBiTWl4Q2lwaGVyLAorCQkJCXU4IEZsZXhpYmxlQ2lwaGVyLAorCQkJCXU4ICpwUnNuSWUsIHU4ICogcnNuX2xlbikKIHsKLQlVQ0hBUglQYWlyd2lzZUNudDsKKwl1OCBQYWlyd2lzZUNudDsKIAogCSpyc25fbGVuID0gMDsKIAotCS8vIGRlY2lkZSBXUEEyIG9yIFdQQTEKLQlpZiAoRWxlbWVudElEID09IFdwYTJJZSkKLQl7Ci0JCVJTTklFMgkqcFJzbmllX2NpcGhlciA9IChSU05JRTIqKXBSc25JZTsKKwkvKiBkZWNpZGUgV1BBMiBvciBXUEExICovCisJaWYgKEVsZW1lbnRJRCA9PSBXcGEySWUpIHsKKwkJc3RydWN0IHJ0X3JzbmllMiAqcFJzbmllX2NpcGhlciA9IChzdHJ1Y3QgcnRfcnNuaWUyICopcFJzbkllOwogCi0JCS8vIEFzc2lnbiB0aGUgdmVyc29uIGFzIDEKKwkJLyogQXNzaWduIHRoZSB2ZXJzb24gYXMgMSAqLwogCQlwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gMTsKIAotICAgICAgICBzd2l0Y2ggKFdlcFN0YXR1cykKLSAgICAgICAgewotICAgICAgICAJLy8gVEtJUCBtb2RlCi0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX1RLSVAsIDQpOwotICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBMl9US0lQLCA0KTsKLSAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRTIpOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQlzd2l0Y2ggKFdlcFN0YXR1cykgeworCQkJLyogVEtJUCBtb2RlICovCisJCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKwkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9US0lQLCA0KTsKKwkJCXBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7CisJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksCisJCQkJICAgICAgIE9VSV9XUEEyX1RLSVAsIDQpOworCQkJKnJzbl9sZW4gPSBzaXplb2Yoc3RydWN0IHJ0X3JzbmllMik7CisJCQlicmVhazsKIAotCQkJLy8gQUVTIG1vZGUKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKLQkJCQlpZiAoYk1peENpcGhlcikKLQkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX1RLSVAsIDQpOwotCQkJCWVsc2UKLQkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX0NDTVAsIDQpOwotICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBMl9DQ01QLCA0KTsKLSAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRTIpOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJLyogQUVTIG1vZGUgKi8KKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgorCQkJaWYgKGJNaXhDaXBoZXIpCisJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsCisJCQkJCSAgICAgICBPVUlfV1BBMl9US0lQLCA0KTsKKwkJCWVsc2UKKwkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwKKwkJCQkJICAgICAgIE9VSV9XUEEyX0NDTVAsIDQpOworCQkJcFJzbmllX2NpcGhlci0+dWNvdW50ID0gMTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwKKwkJCQkgICAgICAgT1VJX1dQQTJfQ0NNUCwgNCk7CisJCQkqcnNuX2xlbiA9IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWUyKTsKKwkJCWJyZWFrOwogCi0JCQkvLyBUS0lQLUFFUyBtaXggbW9kZQotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOgotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9US0lQLCA0KTsKKwkJCS8qIFRLSVAtQUVTIG1peCBtb2RlICovCisJCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDoKKwkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9US0lQLCA0KTsKIAotCQkJCVBhaXJ3aXNlQ250ID0gMTsKLQkJCQkvLyBJbnNlcnQgV1BBMiBUS0lQIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKLQkJCQlpZiAoTUlYX0NJUEhFUl9XUEEyX1RLSVBfT04oRmxleGlibGVDaXBoZXIpKQotCQkJCXsKLSAgICAgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBMl9US0lQLCA0KTsKLQkJCQkJLy8gSW5zZXJ0IFdQQTIgQUVTIGFzIHRoZSBzZWNvbmRhcnkgcGFpcndpc2UgY2lwaGVyCi0JCQkJCWlmIChNSVhfQ0lQSEVSX1dQQTJfQUVTX09OKEZsZXhpYmxlQ2lwaGVyKSkKLQkJCQkJewotICAgICAgICAgICAgICAgIAkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpICsgNCwgT1VJX1dQQTJfQ0NNUCwgNCk7Ci0JCQkJCQlQYWlyd2lzZUNudCA9IDI7Ci0JCQkJCX0KKwkJCVBhaXJ3aXNlQ250ID0gMTsKKwkJCS8qIEluc2VydCBXUEEyIFRLSVAgYXMgdGhlIGZpcnN0IHBhaXJ3aXNlIGNpcGhlciAqLworCQkJaWYgKE1JWF9DSVBIRVJfV1BBMl9US0lQX09OKEZsZXhpYmxlQ2lwaGVyKSkgeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwKKwkJCQkJICAgICAgIE9VSV9XUEEyX1RLSVAsIDQpOworCQkJCS8qIEluc2VydCBXUEEyIEFFUyBhcyB0aGUgc2Vjb25kYXJ5IHBhaXJ3aXNlIGNpcGhlciAqLworCQkJCWlmIChNSVhfQ0lQSEVSX1dQQTJfQUVTX09OKEZsZXhpYmxlQ2lwaGVyKSkgeworCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS4KKwkJCQkJCSAgICAgICBvdWkgKyA0LCBPVUlfV1BBMl9DQ01QLAorCQkJCQkJICAgICAgIDQpOworCQkJCQlQYWlyd2lzZUNudCA9IDI7CiAJCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vIEluc2VydCBXUEEyIEFFUyBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfQ0NNUCwgNCk7Ci0JCQkJfQotCi0gICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gUGFpcndpc2VDbnQ7Ci0gICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUyKSArICg0ICogKFBhaXJ3aXNlQ250IC0gMSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLQkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgotCQkJKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCi0JCQkocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCi0JCXsKLQkJCVVJTlQgR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKLQkJCXN3aXRjaChHcm91cENpcGhlcikKLQkJCXsKLQkJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDoKLQkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX1dFUDQwLCA0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkOgotCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfV0VQMTA0LCA0KTsKLQkJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCS8qIEluc2VydCBXUEEyIEFFUyBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyICovCisJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLAorCQkJCQkgICAgICAgT1VJX1dQQTJfQ0NNUCwgNCk7CiAJCQl9CisKKwkJCXBSc25pZV9jaXBoZXItPnVjb3VudCA9IFBhaXJ3aXNlQ250OworCQkJKnJzbl9sZW4gPSBzaXplb2Yoc3RydWN0IHJ0X3JzbmllMikgKyAoNCAqIChQYWlyd2lzZUNudCAtIDEpKTsKKwkJCWJyZWFrOwogCQl9CiAKLQkJLy8gc3dhcCBmb3IgYmlnLWVuZGlhbiBwbGF0Zm9ybQorCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmCisJCSAgICAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgJiYKKwkJICAgIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgeworCQkJdTMyIEdyb3VwQ2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7CisJCQlzd2l0Y2ggKEdyb3VwQ2lwaGVyKSB7CisJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDoKKwkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwKKwkJCQkJICAgICAgIE9VSV9XUEEyX1dFUDQwLCA0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZDoKKwkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwKKwkJCQkJICAgICAgIE9VSV9XUEEyX1dFUDEwNCwgNCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogc3dhcCBmb3IgYmlnLWVuZGlhbiBwbGF0Zm9ybSAqLwogCQlwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dmVyc2lvbik7Ci0JICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnVjb3VudCk7Ci0JfQotCWVsc2UKLQl7Ci0JCVJTTklFCSpwUnNuaWVfY2lwaGVyID0gKFJTTklFKilwUnNuSWU7CisJCXBSc25pZV9jaXBoZXItPnVjb3VudCA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnVjb3VudCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IHJ0X3JzbmllICpwUnNuaWVfY2lwaGVyID0gKHN0cnVjdCBydF9yc25pZSAqKXBSc25JZTsKIAotCQkvLyBBc3NpZ24gT1VJIGFuZCB2ZXJzaW9uCisJCS8qIEFzc2lnbiBPVUkgYW5kIHZlcnNpb24gKi8KIAkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+b3VpLCBPVUlfV1BBX1ZFUlNJT04sIDQpOwotICAgICAgICBwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gMTsKKwkJcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IDE7CiAKLQkJc3dpdGNoIChXZXBTdGF0dXMpCi0JCXsKLQkJCS8vIFRLSVAgbW9kZQotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1RLSVAsIDQpOwotICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX1RLSVAsIDQpOwotICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFKTsKLSAgICAgICAgICAgICAgICBicmVhazsKKwkJc3dpdGNoIChXZXBTdGF0dXMpIHsKKwkJCS8qIFRLSVAgbW9kZSAqLworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6CisJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9US0lQLCA0KTsKKwkJCXBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7CisJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksCisJCQkJICAgICAgIE9VSV9XUEFfVEtJUCwgNCk7CisJCQkqcnNuX2xlbiA9IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWUpOworCQkJYnJlYWs7CiAKLQkJCS8vIEFFUyBtb2RlCi0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6Ci0JCQkJaWYgKGJNaXhDaXBoZXIpCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1RLSVAsIDQpOwotCQkJCWVsc2UKLQkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfQ0NNUCwgNCk7Ci0gICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gMTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEFfQ0NNUCwgNCk7Ci0gICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUpOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJLyogQUVTIG1vZGUgKi8KKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgorCQkJaWYgKGJNaXhDaXBoZXIpCisJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsCisJCQkJCSAgICAgICBPVUlfV1BBX1RLSVAsIDQpOworCQkJZWxzZQorCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LAorCQkJCQkgICAgICAgT1VJX1dQQV9DQ01QLCA0KTsKKwkJCXBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7CisJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksCisJCQkJICAgICAgIE9VSV9XUEFfQ0NNUCwgNCk7CisJCQkqcnNuX2xlbiA9IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWUpOworCQkJYnJlYWs7CiAKLQkJCS8vIFRLSVAtQUVTIG1peCBtb2RlCi0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ6Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfVEtJUCwgNCk7CisJCQkvKiBUS0lQLUFFUyBtaXggbW9kZSAqLworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ6CisJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9US0lQLCA0KTsKIAotCQkJCVBhaXJ3aXNlQ250ID0gMTsKLQkJCQkvLyBJbnNlcnQgV1BBIFRLSVAgYXMgdGhlIGZpcnN0IHBhaXJ3aXNlIGNpcGhlcgotCQkJCWlmIChNSVhfQ0lQSEVSX1dQQV9US0lQX09OKEZsZXhpYmxlQ2lwaGVyKSkKLQkJCQl7Ci0gICAgICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQV9US0lQLCA0KTsKLQkJCQkJLy8gSW5zZXJ0IFdQQSBBRVMgYXMgdGhlIHNlY29uZGFyeSBwYWlyd2lzZSBjaXBoZXIKLQkJCQkJaWYgKE1JWF9DSVBIRVJfV1BBX0FFU19PTihGbGV4aWJsZUNpcGhlcikpCi0JCQkJCXsKLSAgICAgICAgICAgICAgICAJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSArIDQsIE9VSV9XUEFfQ0NNUCwgNCk7Ci0JCQkJCQlQYWlyd2lzZUNudCA9IDI7Ci0JCQkJCX0KKwkJCVBhaXJ3aXNlQ250ID0gMTsKKwkJCS8qIEluc2VydCBXUEEgVEtJUCBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyICovCisJCQlpZiAoTUlYX0NJUEhFUl9XUEFfVEtJUF9PTihGbGV4aWJsZUNpcGhlcikpIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksCisJCQkJCSAgICAgICBPVUlfV1BBX1RLSVAsIDQpOworCQkJCS8qIEluc2VydCBXUEEgQUVTIGFzIHRoZSBzZWNvbmRhcnkgcGFpcndpc2UgY2lwaGVyICovCisJCQkJaWYgKE1JWF9DSVBIRVJfV1BBX0FFU19PTihGbGV4aWJsZUNpcGhlcikpIHsKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0uCisJCQkJCQkgICAgICAgb3VpICsgNCwgT1VJX1dQQV9DQ01QLAorCQkJCQkJICAgICAgIDQpOworCQkJCQlQYWlyd2lzZUNudCA9IDI7CiAJCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vIEluc2VydCBXUEEgQUVTIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKLQkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX0NDTVAsIDQpOwotCQkJCX0KLQotICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IFBhaXJ3aXNlQ250OwotICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFKSArICg0ICogKFBhaXJ3aXNlQ250IC0gMSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLQkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgotCQkJKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCi0JCQkocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCi0JCXsKLQkJCVVJTlQgR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKLQkJCXN3aXRjaChHcm91cENpcGhlcikKLQkJCXsKLQkJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDoKLQkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfV0VQNDAsIDQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQ6Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1dFUDEwNCwgNCk7Ci0JCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQkvKiBJbnNlcnQgV1BBIEFFUyBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyICovCisJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLAorCQkJCQkgICAgICAgT1VJX1dQQV9DQ01QLCA0KTsKIAkJCX0KKworCQkJcFJzbmllX2NpcGhlci0+dWNvdW50ID0gUGFpcndpc2VDbnQ7CisJCQkqcnNuX2xlbiA9IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWUpICsgKDQgKiAoUGFpcndpc2VDbnQgLSAxKSk7CisJCQlicmVhazsKIAkJfQogCi0JCS8vIHN3YXAgZm9yIGJpZy1lbmRpYW4gcGxhdGZvcm0KKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgorCQkgICAgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCSAgICAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpIHsKKwkJCXUzMiBHcm91cENpcGhlciA9IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyOworCQkJc3dpdGNoIChHcm91cENpcGhlcikgeworCQkJY2FzZSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQ6CisJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsCisJCQkJCSAgICAgICBPVUlfV1BBX1dFUDQwLCA0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZDoKKwkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwKKwkJCQkJICAgICAgIE9VSV9XUEFfV0VQMTA0LCA0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiBzd2FwIGZvciBiaWctZW5kaWFuIHBsYXRmb3JtICovCiAJCXBSc25pZV9jaXBoZXItPnZlcnNpb24gPSBjcHUybGUxNihwUnNuaWVfY2lwaGVyLT52ZXJzaW9uKTsKLQkgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dWNvdW50KTsKKwkJcFJzbmllX2NpcGhlci0+dWNvdW50ID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dWNvdW50KTsKIAl9CiB9CiAKQEAgLTQ3Nyw4ICsxNzEyLDggQEAKIAogCUFyZ3VtZW50czoKIAkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0Ci0gICAgCUVsZW1lbnRJRAktCWluZGljYXRlIHRoZSBXUEExIG9yIFdQQTIKLSAgICAJQXV0aE1vZGUJLQlpbmRpY2F0ZSB0aGUgYXV0aGVudGljYXRpb24gbW9kZQorCUVsZW1lbnRJRAktCWluZGljYXRlIHRoZSBXUEExIG9yIFdQQTIKKwlBdXRoTW9kZQktCWluZGljYXRlIHRoZSBhdXRoZW50aWNhdGlvbiBtb2RlCiAJCWFwaWR4CQktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKIAogCVJldHVybiBWYWx1ZToKQEAgLTQ4Nyw2MiArMTcyMiw2NiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotc3RhdGljIFZPSUQgUlRNUEluc2VydFJzbkllQUtNKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJRWxlbWVudElELAotCUlOCVVJTlQJCQlBdXRoTW9kZSwKLQlJTglVQ0hBUgkJCWFwaWR4LAotCU9VVAlQVUNIQVIJCQlwUnNuSWUsCi0JT1VUCVVDSEFSCQkJKnJzbl9sZW4pCitzdGF0aWMgdm9pZCBSVE1QTWFrZVJzbkllQUtNKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTggRWxlbWVudElELAorCQkJICAgICB1MzIgQXV0aE1vZGUsCisJCQkgICAgIHU4IGFwaWR4LAorCQkJICAgICB1OCAqcFJzbkllLCB1OCAqIHJzbl9sZW4pCiB7Ci0JUlNOSUVfQVVUSAkJKnBSc25pZV9hdXRoOworCXN0cnVjdCBydF9yc25pZV9hdXRoICpwUnNuaWVfYXV0aDsKKwl1OCBBa21DbnQgPSAxOwkvKiBkZWZhdWx0IGFzIDEgKi8KIAotCXBSc25pZV9hdXRoID0gKFJTTklFX0FVVEgqKShwUnNuSWUgKyAoKnJzbl9sZW4pKTsKKwlwUnNuaWVfYXV0aCA9IChzdHJ1Y3QgcnRfcnNuaWVfYXV0aCAqKSAocFJzbkllICsgKCpyc25fbGVuKSk7CiAKLQkvLyBkZWNpZGUgV1BBMiBvciBXUEExCi0JaWYgKEVsZW1lbnRJRCA9PSBXcGEySWUpCi0JewotCQlzd2l0Y2ggKEF1dGhNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI6Ci0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyOgotICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOwotICAgICAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEEyXzgwMjFYX0FLTSwgNCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJLyogZGVjaWRlIFdQQTIgb3IgV1BBMSAqLworCWlmIChFbGVtZW50SUQgPT0gV3BhMkllKSB7CiAKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzoKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0s6Ci0gICAgICAgICAgICAgICAgcFJzbmllX2F1dGgtPmFjb3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQTJfUFNLX0FLTSwgNCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQl9Ci0JZWxzZQotCXsKLQkJc3dpdGNoIChBdXRoTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEE6Ci0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyOgotICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQV84MDIxWF9BS00sIDQpOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQlzd2l0Y2ggKEF1dGhNb2RlKSB7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMjoKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKKwkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwKKwkJCQkgICAgICAgT1VJX1dQQTJfODAyMVhfQUtNLCA0KTsKKwkJCWJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzoKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0s6Ci0gICAgICAgICAgICAgICAgcFJzbmllX2F1dGgtPmFjb3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBX1BTS19BS00sIDQpOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s6CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0s6CisJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksCisJCQkJICAgICAgIE9VSV9XUEEyX1BTS19BS00sIDQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBa21DbnQgPSAwOworCQkJYnJlYWs7CiAKLQkJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZToKLSAgICAgICAgICAgICAgICBwUnNuaWVfYXV0aC0+YWNvdW50ID0gMTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEFfTk9ORV9BS00sIDQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKEF1dGhNb2RlKSB7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBOgorCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyOgorCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLAorCQkJCSAgICAgICBPVUlfV1BBXzgwMjFYX0FLTSwgNCk7CisJCQlicmVhazsKKworCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzoKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSzoKKwkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwKKwkJCQkgICAgICAgT1VJX1dQQV9QU0tfQUtNLCA0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZToKKwkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwKKwkJCQkgICAgICAgT1VJX1dQQV9OT05FX0FLTSwgNCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFrbUNudCA9IDA7CisJCQlicmVhazsKKwkJfQogCX0KIAorCXBSc25pZV9hdXRoLT5hY291bnQgPSBBa21DbnQ7CiAJcFJzbmllX2F1dGgtPmFjb3VudCA9IGNwdTJsZTE2KHBSc25pZV9hdXRoLT5hY291bnQpOwogCi0JKCpyc25fbGVuKSArPSBzaXplb2YoUlNOSUVfQVVUSCk7CS8vIHVwZGF0ZSBjdXJyZW50IFJTTklFIGxlbmd0aAorCS8qIHVwZGF0ZSBjdXJyZW50IFJTTklFIGxlbmd0aCAqLworCSgqcnNuX2xlbikgKz0gKHNpemVvZihzdHJ1Y3QgcnRfcnNuaWVfYXV0aCkgKyAoNCAqIChBa21DbnQgLSAxKSkpOwogCiB9CiAKQEAgLTU1NSw3ICsxNzk0LDcgQEAKIAogCUFyZ3VtZW50czoKIAkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0Ci0gICAgCUVsZW1lbnRJRAktCWluZGljYXRlIHRoZSBXUEExIG9yIFdQQTIKKwlFbGVtZW50SUQJLQlpbmRpY2F0ZSB0aGUgV1BBMSBvciBXUEEyCiAJCWFwaWR4CQktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKIAogCVJldHVybiBWYWx1ZToKQEAgLTU2NCwyOSArMTgwMywyNSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotc3RhdGljIFZPSUQgUlRNUEluc2VydFJzbkllQ2FwKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJRWxlbWVudElELAotCUlOCVVDSEFSCQkJYXBpZHgsCi0JT1VUCVBVQ0hBUgkJCXBSc25JZSwKLQlPVVQJVUNIQVIJCQkqcnNuX2xlbikKK3N0YXRpYyB2b2lkIFJUTVBNYWtlUnNuSWVDYXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1OCBFbGVtZW50SUQsCisJCQkgICAgIHU4IGFwaWR4LAorCQkJICAgICB1OCAqcFJzbkllLCB1OCAqIHJzbl9sZW4pCiB7Ci0JUlNOX0NBUEFCSUxJVElFUyAgICAqcFJTTl9DYXA7CisJUlNOX0NBUEFCSUxJVElFUyAqcFJTTl9DYXA7CiAKLQkvLyBpdCBjb3VsZCBiZSBpZ25vcmVkIGluIFdQQTEgbW9kZQorCS8qIGl0IGNvdWxkIGJlIGlnbm9yZWQgaW4gV1BBMSBtb2RlICovCiAJaWYgKEVsZW1lbnRJRCA9PSBXcGFJZSkKIAkJcmV0dXJuOwogCi0JcFJTTl9DYXAgPSAoUlNOX0NBUEFCSUxJVElFUyopKHBSc25JZSArICgqcnNuX2xlbikpOwotCisJcFJTTl9DYXAgPSAoUlNOX0NBUEFCSUxJVElFUyAqKSAocFJzbkllICsgKCpyc25fbGVuKSk7CiAKIAlwUlNOX0NhcC0+d29yZCA9IGNwdTJsZTE2KHBSU05fQ2FwLT53b3JkKTsKIAotCSgqcnNuX2xlbikgKz0gc2l6ZW9mKFJTTl9DQVBBQklMSVRJRVMpOwkvLyB1cGRhdGUgY3VycmVudCBSU05JRSBsZW5ndGgKKwkoKnJzbl9sZW4pICs9IHNpemVvZihSU05fQ0FQQUJJTElUSUVTKTsJLyogdXBkYXRlIGN1cnJlbnQgUlNOSUUgbGVuZ3RoICovCiAKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC01OTUsOCArMTgzMCw4IEBACiAKIAlBcmd1bWVudHM6CiAJCXBBZAkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAotICAgIAlBdXRoTW9kZQktCWluZGljYXRlIHRoZSBhdXRoZW50aWNhdGlvbiBtb2RlCi0gICAgCVdlcFN0YXR1cwktCWluZGljYXRlIHRoZSBlbmNyeXB0aW9uIHR5cGUKKwlBdXRoTW9kZQktCWluZGljYXRlIHRoZSBhdXRoZW50aWNhdGlvbiBtb2RlCisJV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQogCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CiAKIAlSZXR1cm4gVmFsdWU6CkBAIC02MDUsNDggKzE4NDAsNDMgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgUlRNUE1ha2VSU05JRSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgVUlOVCAgICAgICAgICAgIEF1dGhNb2RlLAotICAgIElOICBVSU5UICAgICAgICAgICAgV2VwU3RhdHVzLAotCUlOCVVDSEFSCQkJYXBpZHgpCit2b2lkIFJUTVBNYWtlUlNOSUUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICB1MzIgQXV0aE1vZGUsIHUzMiBXZXBTdGF0dXMsIHU4IGFwaWR4KQogewotCVBVQ0hBUgkJcFJzbkllID0gTlVMTDsJCQkvLyBwcmltYXJ5IFJTTklFCi0JVUNIQVIgCQkqcnNuaWVsZW5fY3VyX3AgPSAwOwkvLyB0aGUgbGVuZ3RoIG9mIHRoZSBwcmltYXJ5IFJTTklFCi0JVUNIQVIJCSpyc25pZWxlbl9leF9jdXJfcCA9IDA7CS8vIHRoZSBsZW5ndGggb2YgdGhlIHNlY29uZGFyeSBSU05JRQotCVVDSEFSCQlQcmltYXJ5UnNuaWU7Ci0JQk9PTEVBTgkJYk1peENpcGhlciA9IEZBTFNFOwkvLyBpbmRpY2F0ZSB0aGUgcGFpcndpc2UgYW5kIGdyb3VwIGNpcGhlciBhcmUgZGlmZmVyZW50Ci0JVUNIQVIJCXBfb2Zmc2V0OwotCVdQQV9NSVhfUEFJUl9DSVBIRVIJCUZsZXhpYmxlQ2lwaGVyID0gV1BBX1RLSVBBRVNfV1BBMl9US0lQQUVTOwkvLyBpdCBwcm92aWRlIHRoZSBtb3JlIGZsZXhpYmxlIGNpcGhlciBjb21iaW5hdGlvbiBpbiBXUEEtV1BBMiBhbmQgVEtJUEFFUyBtb2RlCisJdTggKnBSc25JZSA9IE5VTEw7CS8qIHByaW1hcnkgUlNOSUUgKi8KKwl1OCAqcnNuaWVsZW5fY3VyX3AgPSAwOwkvKiB0aGUgbGVuZ3RoIG9mIHRoZSBwcmltYXJ5IFJTTklFICovCisJdTggKnJzbmllbGVuX2V4X2N1cl9wID0gMDsJLyogdGhlIGxlbmd0aCBvZiB0aGUgc2Vjb25kYXJ5IFJTTklFICovCisJdTggUHJpbWFyeVJzbmllOworCUJPT0xFQU4gYk1peENpcGhlciA9IEZBTFNFOwkvKiBpbmRpY2F0ZSB0aGUgcGFpcndpc2UgYW5kIGdyb3VwIGNpcGhlciBhcmUgZGlmZmVyZW50ICovCisJdTggcF9vZmZzZXQ7CisJV1BBX01JWF9QQUlSX0NJUEhFUiBGbGV4aWJsZUNpcGhlciA9IFdQQV9US0lQQUVTX1dQQTJfVEtJUEFFUzsJLyogaXQgcHJvdmlkZSB0aGUgbW9yZSBmbGV4aWJsZSBjaXBoZXIgY29tYmluYXRpb24gaW4gV1BBLVdQQTIgYW5kIFRLSVBBRVMgbW9kZSAqLwogCiAJcnNuaWVsZW5fY3VyX3AgPSBOVUxMOwogCXJzbmllbGVuX2V4X2N1cl9wID0gTlVMTDsKIAogCXsKIAkJewotCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQotCQkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPQorCQkJICAgIFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpIHsKIAkJCQlpZiAoQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCiAJCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBTdXBwb3J0IFdQQVBTSyBvciBXUEEyUFNLIGluIFNUQS1JbmZyYSBtb2RlCi0JCQkJLy8gU3VwcG9ydCBXUEFOb25lIGluIFNUQS1BZGhvYyBtb2RlCisJCQl9IGVsc2UgeworCQkJCS8qIFN1cHBvcnQgV1BBUFNLIG9yIFdQQTJQU0sgaW4gU1RBLUluZnJhIG1vZGUgKi8KKwkJCQkvKiBTdXBwb3J0IFdQQU5vbmUgaW4gU1RBLUFkaG9jIG1vZGUgKi8KIAkJCQlpZiAoKEF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKLQkJCQkJKEF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCi0JCQkJCShBdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQkJCQkpCisJCQkJICAgIChBdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCQkJCSAgICAoQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJCQkgICAgKQogCQkJCQlyZXR1cm47CiAJCQl9CiAKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiPT0+IFJUTVBNYWtlUlNOSUUoU1RBKVxuIikpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBNYWtlUlNOSUUoU1RBKVxuIikpOwogCi0JCQkvLyBaZXJvIFJTTklFIGNvbnRleHQKKwkJCS8qIFplcm8gUlNOSUUgY29udGV4dCAqLwogCQkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gMDsKIAkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJTTl9JRSwgTUFYX0xFTl9PRl9SU05JRSk7CiAKLQkJCS8vIFBvaW50ZXIgdG8gUlNOSUUKKwkJCS8qIFBvaW50ZXIgdG8gUlNOSUUgKi8KIAkJCXJzbmllbGVuX2N1cl9wID0gJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKIAkJCXBSc25JZSA9IHBBZC0+U3RhQ2ZnLlJTTl9JRTsKIApAQCAtNjU0LDM0ICsxODg0LDM1IEBACiAJCX0KIAl9CiAKLQkvLyBpbmRpY2F0ZSBwcmltYXJ5IFJTTklFIGFzIFdQQSBvciBXUEEyCisJLyogaW5kaWNhdGUgcHJpbWFyeSBSU05JRSBhcyBXUEEgb3IgV1BBMiAqLwogCWlmICgoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAotCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAotCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgfHwKLQkJKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyKSB8fAotCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQorCSAgICAoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCSAgICAoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgfHwKKwkgICAgKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyKSB8fAorCSAgICAoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQogCQlQcmltYXJ5UnNuaWUgPSBXcGFJZTsKIAllbHNlCiAJCVByaW1hcnlSc25pZSA9IFdwYTJJZTsKIAogCXsKLQkJLy8gQnVpbGQgdGhlIHByaW1hcnkgUlNOSUUKLQkJLy8gMS4gaW5zZXJ0IGNpcGhlciBzdWl0ZQotCQlSVE1QSW5zZXJ0UnNuSWVDaXBoZXIocEFkLCBQcmltYXJ5UnNuaWUsIFdlcFN0YXR1cywgYk1peENpcGhlciwgRmxleGlibGVDaXBoZXIsIHBSc25JZSwgJnBfb2Zmc2V0KTsKKwkJLyogQnVpbGQgdGhlIHByaW1hcnkgUlNOSUUgKi8KKwkJLyogMS4gaW5zZXJ0IGNpcGhlciBzdWl0ZSAqLworCQlSVE1QTWFrZVJzbkllQ2lwaGVyKHBBZCwgUHJpbWFyeVJzbmllLCBXZXBTdGF0dXMsIGJNaXhDaXBoZXIsCisJCQkJICAgIEZsZXhpYmxlQ2lwaGVyLCBwUnNuSWUsICZwX29mZnNldCk7CiAKLQkJLy8gMi4gaW5zZXJ0IEFLTQotCQlSVE1QSW5zZXJ0UnNuSWVBS00ocEFkLCBQcmltYXJ5UnNuaWUsIEF1dGhNb2RlLCBhcGlkeCwgcFJzbkllLCAmcF9vZmZzZXQpOworCQkvKiAyLiBpbnNlcnQgQUtNICovCisJCVJUTVBNYWtlUnNuSWVBS00ocEFkLCBQcmltYXJ5UnNuaWUsIEF1dGhNb2RlLCBhcGlkeCwgcFJzbkllLAorCQkJCSAmcF9vZmZzZXQpOwogCi0JCS8vIDMuIGluc2VydCBjYXBhYmlsaXR5Ci0JCVJUTVBJbnNlcnRSc25JZUNhcChwQWQsIFByaW1hcnlSc25pZSwgYXBpZHgsIHBSc25JZSwgJnBfb2Zmc2V0KTsKKwkJLyogMy4gaW5zZXJ0IGNhcGFiaWxpdHkgKi8KKwkJUlRNUE1ha2VSc25JZUNhcChwQWQsIFByaW1hcnlSc25pZSwgYXBpZHgsIHBSc25JZSwgJnBfb2Zmc2V0KTsKIAl9CiAKLQkvLyA0LiB1cGRhdGUgdGhlIFJTTklFIGxlbmd0aAorCS8qIDQuIHVwZGF0ZSB0aGUgUlNOSUUgbGVuZ3RoICovCiAJKnJzbmllbGVuX2N1cl9wID0gcF9vZmZzZXQ7CiAKIAloZXhfZHVtcCgiVGhlIHByaW1hcnkgUlNOSUUiLCBwUnNuSWUsICgqcnNuaWVsZW5fY3VyX3ApKTsKIAotCiB9CiAKIC8qCkBAIC02OTMsMTQ0ICsxOTI0LDEwOTMgQEAKIAkJcEFkCQkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAogCQlwRW50cnkJCQktCXBvaW50ZXIgdG8gYWN0aXZlIGVudHJ5CiAJCXBEYXRhCQkJLQl0aGUgcmVjZWl2ZWQgZnJhbWUKLQkJRGF0YUJ5dGVDb3VudCAJLQl0aGUgcmVjZWl2ZWQgZnJhbWUncyBsZW5ndGgKKwkJRGF0YUJ5dGVDb3VudAktCXRoZSByZWNlaXZlZCBmcmFtZSdzIGxlbmd0aAogCQlGcm9tV2hpY2hCU1NJRAktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKIAogICAgIFJldHVybjoKLSAgICAgICAgIFRSVUUgCQkJLQlUaGlzIGZyYW1lIGlzIEVBUCBmcmFtZQotICAgICAgICAgRkFMU0UgCQkJLQlvdGhlcndpc2UKKyAgICAgICAgIFRSVUUJCQktCVRoaXMgZnJhbWUgaXMgRUFQIGZyYW1lCisgICAgICAgICBGQUxTRQkJCS0Jb3RoZXJ3aXNlCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1CT09MRUFOIFJUTVBDaGVja1dQQWZyYW1lKAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAotICAgIElOIFBVQ0hBUiAgICAgICAgICAgcERhdGEsCi0gICAgSU4gVUxPTkcgICAgICAgICAgICBEYXRhQnl0ZUNvdW50LAotCUlOIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCitCT09MRUFOIFJUTVBDaGVja1dQQWZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkJICB1OCAqcERhdGEsCisJCQkgIHVuc2lnbmVkIGxvbmcgRGF0YUJ5dGVDb3VudCwgdTggRnJvbVdoaWNoQlNTSUQpCiB7Ci0JVUxPTkcJQm9keV9sZW47CisJdW5zaWduZWQgbG9uZyBCb2R5X2xlbjsKIAlCT09MRUFOIENhbmNlbGxlZDsKIAorCWlmIChEYXRhQnl0ZUNvdW50IDwgKExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0gpKQorCQlyZXR1cm4gRkFMU0U7CiAKLSAgICBpZihEYXRhQnl0ZUNvdW50IDwgKExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0gpKQotICAgICAgICByZXR1cm4gRkFMU0U7CisJLyogU2tpcCBMTEMgaGVhZGVyICovCisJaWYgKE5kaXNFcXVhbE1lbW9yeShTTkFQXzgwMl8xSCwgcERhdGEsIDYpIHx8CisJICAgIC8qIENpc2NvIDEyMDAgQVAgbWF5IHNlbmQgcGFja2V0IHdpdGggU05BUF9CUklER0VfVFVOTkVMICovCisJICAgIE5kaXNFcXVhbE1lbW9yeShTTkFQX0JSSURHRV9UVU5ORUwsIHBEYXRhLCA2KSkgeworCQlwRGF0YSArPSA2OworCX0KKwkvKiBTa2lwIDItYnl0ZXMgRUFQb0wgdHlwZSAqLworCWlmIChOZGlzRXF1YWxNZW1vcnkoRUFQT0wsIHBEYXRhLCAyKSkgeworCQlwRGF0YSArPSAyOworCX0gZWxzZQorCQlyZXR1cm4gRkFMU0U7CiAKKwlzd2l0Y2ggKCoocERhdGEgKyAxKSkgeworCWNhc2UgRUFQUGFja2V0OgorCQlCb2R5X2xlbiA9ICgqKHBEYXRhICsgMikgPDwgOCkgfCAoKihwRGF0YSArIDMpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSZWNlaXZlIEVBUC1QYWNrZXQgZnJhbWUsIFRZUEUgPSAwLCBMZW5ndGggPSAlbGRcbiIsCisJCQkgIEJvZHlfbGVuKSk7CisJCWJyZWFrOworCWNhc2UgRUFQT0xTdGFydDoKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSZWNlaXZlIEVBUE9MLVN0YXJ0IGZyYW1lLCBUWVBFID0gMSBcbiIpKTsKKwkJaWYgKHBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgIT0KKwkJICAgIEVBUE9MX1NUQVJUX0RJU0FCTEUpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNhbmNlbCB0aGUgRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgXG4iKSk7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBFbnRyeS0+RW5xdWV1ZVN0YXJ0Rm9yUFNLVGltZXIsCisJCQkJCSZDYW5jZWxsZWQpOworCQkJcEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyA9CisJCQkgICAgRUFQT0xfU1RBUlRfRElTQUJMRTsKKwkJfQorCQlicmVhazsKKwljYXNlIEVBUE9MTG9nb2ZmOgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJlY2VpdmUgRUFQT0xMb2dvZmYgZnJhbWUsIFRZUEUgPSAyIFxuIikpOworCQlicmVhazsKKwljYXNlIEVBUE9MS2V5OgorCQlCb2R5X2xlbiA9ICgqKHBEYXRhICsgMikgPDwgOCkgfCAoKihwRGF0YSArIDMpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSZWNlaXZlIEVBUE9MLUtleSBmcmFtZSwgVFlQRSA9IDMsIExlbmd0aCA9ICVsZFxuIiwKKwkJCSAgQm9keV9sZW4pKTsKKwkJYnJlYWs7CisJY2FzZSBFQVBPTEFTRkFsZXJ0OgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJlY2VpdmUgRUFQT0xBU0ZBbGVydCBmcmFtZSwgVFlQRSA9IDQgXG4iKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBGQUxTRTsKIAotCS8vIFNraXAgTExDIGhlYWRlcgotICAgIGlmIChOZGlzRXF1YWxNZW1vcnkoU05BUF84MDJfMUgsIHBEYXRhLCA2KSB8fAotICAgICAgICAvLyBDaXNjbyAxMjAwIEFQIG1heSBzZW5kIHBhY2tldCB3aXRoIFNOQVBfQlJJREdFX1RVTk5FTAotICAgICAgICBOZGlzRXF1YWxNZW1vcnkoU05BUF9CUklER0VfVFVOTkVMLCBwRGF0YSwgNikpCi0gICAgewotICAgICAgICBwRGF0YSArPSA2OwotICAgIH0KLQkvLyBTa2lwIDItYnl0ZXMgRUFQb0wgdHlwZQotICAgIGlmIChOZGlzRXF1YWxNZW1vcnkoRUFQT0wsIHBEYXRhLCAyKSkKLSAgICB7Ci0gICAgICAgIHBEYXRhICs9IDI7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIEZBTFNFOworCX0KKwlyZXR1cm4gVFJVRTsKK30KIAotICAgIHN3aXRjaCAoKihwRGF0YSsxKSkKLSAgICB7Ci0gICAgICAgIGNhc2UgRUFQUGFja2V0OgotCQkJQm9keV9sZW4gPSAoKihwRGF0YSsyKTw8OCkgfCAoKihwRGF0YSszKSk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUC1QYWNrZXQgZnJhbWUsIFRZUEUgPSAwLCBMZW5ndGggPSAlbGRcbiIsIEJvZHlfbGVuKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFQVBPTFN0YXJ0OgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTC1TdGFydCBmcmFtZSwgVFlQRSA9IDEgXG4iKSk7Ci0JCQlpZiAocEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyAhPSBFQVBPTF9TVEFSVF9ESVNBQkxFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNhbmNlbCB0aGUgRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgXG4iKSk7Ci0gICAgICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPkVucXVldWVTdGFydEZvclBTS1RpbWVyLCAmQ2FuY2VsbGVkKTsKLSAgICAgICAgICAgICAgICBwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVBUE9MTG9nb2ZmOgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTExvZ29mZiBmcmFtZSwgVFlQRSA9IDIgXG4iKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFQVBPTEtleToKLQkJCUJvZHlfbGVuID0gKCoocERhdGErMik8PDgpIHwgKCoocERhdGErMykpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTC1LZXkgZnJhbWUsIFRZUEUgPSAzLCBMZW5ndGggPSAlbGRcbiIsIEJvZHlfbGVuKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFQVBPTEFTRkFsZXJ0OgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTEFTRkFsZXJ0IGZyYW1lLCBUWVBFID0gNCBcbiIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCQlSZXBvcnQgdGhlIEVBUCBtZXNzYWdlIHR5cGUKIAotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKwlBcmd1bWVudHM6CisJCW1zZwkJLQlFQVBPTF9QQUlSX01TR18xCisJCQkJCUVBUE9MX1BBSVJfTVNHXzIKKwkJCQkJRUFQT0xfUEFJUl9NU0dfMworCQkJCQlFQVBPTF9QQUlSX01TR180CisJCQkJCUVBUE9MX0dST1VQX01TR18xCisJCQkJCUVBUE9MX0dST1VQX01TR18yCisKKyAgICBSZXR1cm46CisgICAgICAgICBtZXNzYWdlIHR5cGUgc3RyaW5nCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2NoYXIgKkdldEVhcG9sTXNnVHlwZShjaGFyIG1zZykKK3sKKwlpZiAobXNnID09IEVBUE9MX1BBSVJfTVNHXzEpCisJCXJldHVybiAiUGFpcndpc2UgTWVzc2FnZSAxIjsKKwllbHNlIGlmIChtc2cgPT0gRUFQT0xfUEFJUl9NU0dfMikKKwkJcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDIiOworCWVsc2UgaWYgKG1zZyA9PSBFQVBPTF9QQUlSX01TR18zKQorCQlyZXR1cm4gIlBhaXJ3aXNlIE1lc3NhZ2UgMyI7CisJZWxzZSBpZiAobXNnID09IEVBUE9MX1BBSVJfTVNHXzQpCisJCXJldHVybiAiUGFpcndpc2UgTWVzc2FnZSA0IjsKKwllbHNlIGlmIChtc2cgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCisJCXJldHVybiAiR3JvdXAgTWVzc2FnZSAxIjsKKwllbHNlIGlmIChtc2cgPT0gRUFQT0xfR1JPVVBfTVNHXzIpCisJCXJldHVybiAiR3JvdXAgTWVzc2FnZSAyIjsKKwllbHNlCisJCXJldHVybiAiSW52YWxpZCBNZXNzYWdlIjsKIH0KIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCU1pc2MgZnVuY3Rpb24gdG8gZGVjcnlwdCBBRVMgYm9keQorICAgIENoZWNrIFNhbml0eSBSU04gSUUgb2YgRUFQb0wgbWVzc2FnZQorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVE1QQ2hlY2tSU05JRShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCAqcERhdGEsCisJCSAgICAgICB1OCBEYXRhTGVuLAorCQkgICAgICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCB1OCAqIE9mZnNldCkKK3sKKwl1OCAqcFZJRTsKKwl1OCBsZW47CisJc3RydWN0IHJ0X2VpZCAqIHBFaWQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKworCXBWSUUgPSBwRGF0YTsKKwlsZW4gPSBEYXRhTGVuOworCSpPZmZzZXQgPSAwOworCisJd2hpbGUgKGxlbiA+IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWUyKSkgeworCQlwRWlkID0gKHN0cnVjdCBydF9laWQgKikgcFZJRTsKKwkJLyogV1BBIFJTTiBJRSAqLworCQlpZiAoKHBFaWQtPkVpZCA9PSBJRV9XUEEpCisJCSAgICAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkpIHsKKwkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEKKwkJCSAgICAgfHwgcEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCisJCQkgICAgJiYKKwkJCSAgICAoTmRpc0VxdWFsTWVtb3J5CisJCQkgICAgIChwVklFLCBwRW50cnktPlJTTl9JRSwgcEVudHJ5LT5SU05JRV9MZW4pKQorCQkJICAgICYmIChwRW50cnktPlJTTklFX0xlbiA9PSAocEVpZC0+TGVuICsgMikpKSB7CisJCQkJcmVzdWx0ID0gVFJVRTsKKwkJCX0KKworCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7CisJCX0KKwkJLyogV1BBMiBSU04gSUUgKi8KKwkJZWxzZSBpZiAoKHBFaWQtPkVpZCA9PSBJRV9SU04pCisJCQkgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKSkgeworCQkJaWYgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIKKwkJCSAgICAgfHwgcEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorCQkJICAgICYmIChwRWlkLT5FaWQgPT0gcEVudHJ5LT5SU05fSUVbMF0pCisJCQkgICAgJiYgKChwRWlkLT5MZW4gKyAyKSA+PSBwRW50cnktPlJTTklFX0xlbikKKwkJCSAgICAmJgorCQkJICAgIChOZGlzRXF1YWxNZW1vcnkKKwkJCSAgICAgKHBFaWQtPk9jdGV0LCAmcEVudHJ5LT5SU05fSUVbMl0sCisJCQkgICAgICBwRW50cnktPlJTTklFX0xlbiAtIDIpKSkgeworCisJCQkJcmVzdWx0ID0gVFJVRTsKKwkJCX0KKworCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCisJCXBWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQlsZW4gLT0gKHBFaWQtPkxlbiArIDIpOworCX0KKworCXJldHVybiByZXN1bHQ7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgUGFyc2UgS0VZREFUQSBmaWVsZC4gIEtFWURBVEFbXSBNYXkgY29udGFpbiAyIFJTTiBJRSBhbmQgb3B0aW9uYWxseSBHVEsuCisgICAgR1RLICBpcyBlbmNhcHR1bGF0ZWQgaW4gS0RFIGZvcm1hdCBhdCAgcC44MyA4MDIuMTFpIEQxMAogCiAJQXJndW1lbnRzOgogCiAJUmV0dXJuIFZhbHVlOgogCiAJTm90ZToKLQkJVGhpcyBmdW5jdGlvbiByZWZlcmVuY2VzIHRvCVJGQwkzMzk0IGZvciBhZXMga2V5IHVud3JhcCBhbGdvcml0aG0uCisgICAgICAgIDgwMi4xMWkgRDEwCiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECUFFU19HVEtfS0VZX1VOV1JBUCgKLQlJTglVQ0hBUgkqa2V5LAotCU9VVAlVQ0hBUgkqcGxhaW50ZXh0LAotCUlOCVVDSEFSICAgIGNfbGVuLAotCUlOCVVDSEFSCSpjaXBoZXJ0ZXh0KQotCitCT09MRUFOIFJUTVBQYXJzZUVhcG9sS2V5RGF0YShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICB1OCAqcEtleURhdGEsCisJCQkgICAgICB1OCBLZXlEYXRhTGVuLAorCQkJICAgICAgdTggR3JvdXBLZXlJbmRleCwKKwkJCSAgICAgIHU4IE1zZ1R5cGUsCisJCQkgICAgICBJTiBCT09MRUFOIGJXUEEyLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpCiB7Ci0JVUNIQVIgICAgICAgQVs4XSwgQklOWzE2XSwgQk9VVFsxNl07Ci0JVUNIQVIgICAgICAgeG9yOwotCUlOVCAgICAgICAgIGksIGo7Ci0JYWVzX2NvbnRleHQgYWVzY3R4OwotCVVDSEFSICAgICAgICpSOwotCUlOVCAgICAgICAgIG51bV9ibG9ja3MgPSBjX2xlbi84OwkvLyB1bml0OjY0Yml0cworCXN0cnVjdCBydF9rZGVfZW5jYXAgKiBwS0RFID0gTlVMTDsKKwl1OCAqcE15S2V5RGF0YSA9IHBLZXlEYXRhOworCXU4IEtleURhdGFMZW5ndGggPSBLZXlEYXRhTGVuOworCXU4IEdUS0xFTiA9IDA7CisJdTggRGVmYXVsdElkeCA9IDA7CisJdTggc2tpcF9vZmZzZXQ7CiAKKwkvKiBWZXJpZnkgVGhlIFJTTiBJRSBjb250YWluZWQgaW4gcGFpcmV3aXNlX21zZ18yICYmIHBhaXJld2lzZV9tc2dfMyBhbmQgc2tpcCBpdCAqLworCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSB7CisJCS8qIENoZWNrIFJTTiBJRSB3aGV0aGVyIGl0IGlzIFdQQTIvV1BBMlBTSyAqLworCQlpZiAoIVJUTVBDaGVja1JTTklFCisJCSAgICAocEFkLCBwS2V5RGF0YSwgS2V5RGF0YUxlbiwgcEVudHJ5LCAmc2tpcF9vZmZzZXQpKSB7CisJCQkvKiBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIFJTTiBJRSBkaWZmZXJlbnQgKi8KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLAorCQkJCQkJICAgICAgSVdfUlNOSUVfRElGRl9FVkVOVF9GTEFHLAorCQkJCQkJICAgICAgcEVudHJ5LT5BZGRyLAorCQkJCQkJICAgICAgcEVudHJ5LT5hcGlkeCwgMCk7CiAKLQlvc19hbGxvY19tZW0oTlVMTCwgKFBVQ0hBUiAqKSZSLCA1MTIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiUlNOX0lFIERpZmZlcmVudCBpbiBtc2cgJWQgb2YgNC13YXkgaGFuZHNoYWtlIVxuIiwKKwkJCQkgIE1zZ1R5cGUpKTsKKwkJCWhleF9kdW1wKCJSZWNlaXZlIFJTTl9JRSAiLCBwS2V5RGF0YSwgS2V5RGF0YUxlbik7CisJCQloZXhfZHVtcCgiRGVzaXJlZCBSU05fSUUgIiwgcEVudHJ5LT5SU05fSUUsCisJCQkJIHBFbnRyeS0+UlNOSUVfTGVuKTsKIAotCWlmIChSID09IE5VTEwpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIhISFBRVNfR1RLX0tFWV9VTldSQVA6IG5vIG1lbW9yeSEhIVxuIikpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KKwkJCXJldHVybiBGQUxTRTsKKwkJfSBlbHNlIHsKKwkJCWlmIChiV1BBMiAmJiBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpIHsKKwkJCQlXcGFTaG93QWxsc3VpdGUocE15S2V5RGF0YSwgc2tpcF9vZmZzZXQpOwogCi0JLy8gSW5pdGlhbGl6ZQotCU5kaXNNb3ZlTWVtb3J5KEEsIGNpcGhlcnRleHQsIDgpOwotCS8vSW5wdXQgcGxhaW50ZXh0Ci0JZm9yKGkgPSAwOyBpIDwgKGNfbGVuLTgpOyBpKyspCi0JewotCQlSWyBpXSA9IGNpcGhlcnRleHRbaSArIDhdOwotCX0KLQotCXJ0bXBfYWVzX3NldF9rZXkoJmFlc2N0eCwga2V5LCAxMjgpOwotCi0JZm9yKGogPSA1OyBqID49IDA7IGotLSkKLQl7Ci0JCWZvcihpID0gKG51bV9ibG9ja3MtMSk7IGkgPiAwOyBpLS0pCi0JCXsKLQkJCXhvciA9IChudW1fYmxvY2tzIC0xICkqIGogKyBpOwotCQkJTmRpc01vdmVNZW1vcnkoQklOLCBBLCA4KTsKLQkJCUJJTls3XSA9IEFbN10gXiB4b3I7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmQklOWzhdLCAmUlsoaS0xKSo4XSwgOCk7Ci0JCQlydG1wX2Flc19kZWNyeXB0KCZhZXNjdHgsIEJJTiwgQk9VVCk7Ci0JCQlOZGlzTW92ZU1lbW9yeShBLCAmQk9VVFswXSwgOCk7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmUlsoaS0xKSo4XSwgJkJPVVRbOF0sIDgpOworCQkJCS8qIHNraXAgUlNOIElFICovCisJCQkJcE15S2V5RGF0YSArPSBza2lwX29mZnNldDsKKwkJCQlLZXlEYXRhTGVuZ3RoIC09IHNraXBfb2Zmc2V0OworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJSVE1QUGFyc2VFYXBvbEtleURhdGEgPT0+IFdQQTIvV1BBMlBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsCisJCQkJCSAgc2tpcF9vZmZzZXQpKTsKKwkJCX0gZWxzZQorCQkJCXJldHVybiBUUlVFOwogCQl9CiAJfQogCi0JLy8gT1VUUFVUCi0JZm9yKGkgPSAwOyBpIDwgY19sZW47IGkrKykKLQl7Ci0JCXBsYWludGV4dFtpXSA9IFJbaV07CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlJUTVBQYXJzZUVhcG9sS2V5RGF0YSA9PT4gS2V5RGF0YUxlbmd0aCAlZCB3aXRob3V0IFJTTl9JRSBcbiIsCisJCSAgS2V5RGF0YUxlbmd0aCkpOworCS8qaGV4X2R1bXAoInJlbWFpbiBkYXRhIiwgcE15S2V5RGF0YSwgS2V5RGF0YUxlbmd0aCk7ICovCisKKwkvKiBQYXJzZSBFS0QgZm9ybWF0IGluIHBhaXJ3aXNlX21zZ18zX1dQQTIgJiYgZ3JvdXBfbXNnXzFfV1BBMiAqLworCWlmIChiV1BBMgorCSAgICAmJiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zIHx8IE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKSB7CisJCWlmIChLZXlEYXRhTGVuZ3RoID49IDgpCS8qIEtERSBmb3JtYXQgZXhjbHVkZSBHVEsgbGVuZ3RoICovCisJCXsKKwkJCXBLREUgPSAoc3RydWN0IHJ0X2tkZV9lbmNhcCAqKSBwTXlLZXlEYXRhOworCisJCQlEZWZhdWx0SWR4ID0gcEtERS0+R1RLRW5jYXAuS2lkOworCisJCQkvKiBTYW5pdHkgY2hlY2sgLSBLRUQgbGVuZ3RoICovCisJCQlpZiAoS2V5RGF0YUxlbmd0aCA8IChwS0RFLT5MZW4gKyAyKSkgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgKCJFUlJPUjogVGhlIGxlbiBmcm9tIEtERSBpcyB0b28gc2hvcnQgXG4iKSk7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJLyogR2V0IEdUSyBsZW5ndGggLSByZWZlciB0byBJRUVFIDgwMi4xMWktMjAwNCBwLjgyICovCisJCQlHVEtMRU4gPSBwS0RFLT5MZW4gLSA2OworCQkJaWYgKEdUS0xFTiA8IExFTl9BRVNfS0VZKSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCSAoIkVSUk9SOiBHVEsgS2V5IGxlbmd0aCBpcyB0b28gc2hvcnQgKCVkKSBcbiIsCisJCQkJCSAgR1RLTEVOKSk7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCJFUlJPUjogS0RFIGZvcm1hdCBsZW5ndGggaXMgdG9vIHNob3J0IFxuIikpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJHVEsgaW4gS0RFIGZvcm1hdCAsRGVmYXVsdEtleUlEPSVkLCBLZXlMZW49JWQgXG4iLAorCQkJICBEZWZhdWx0SWR4LCBHVEtMRU4pKTsKKwkJLyogc2tpcCBpdCAqLworCQlwTXlLZXlEYXRhICs9IDg7CisJCUtleURhdGFMZW5ndGggLT0gODsKKworCX0gZWxzZSBpZiAoIWJXUEEyICYmIE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpIHsKKwkJRGVmYXVsdElkeCA9IEdyb3VwS2V5SW5kZXg7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiR1RLIERlZmF1bHRLZXlJRD0lZCBcbiIsIERlZmF1bHRJZHgpKTsKKwl9CisJLyogU2FuaXR5IGNoZWNrIC0gc2hhcmVkIGtleSBpbmRleCBtdXN0IGJlIDEgfiAzICovCisJaWYgKERlZmF1bHRJZHggPCAxIHx8IERlZmF1bHRJZHggPiAzKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiRVJST1I6IEdUSyBLZXkgaW5kZXgoJWQpIGlzIGludmFsaWQgaW4gJXMgJXMgXG4iLAorCQkJICBEZWZhdWx0SWR4LCAoKGJXUEEyKSA/ICJXUEEyIiA6ICJXUEEiKSwKKwkJCSAgR2V0RWFwb2xNc2dUeXBlKE1zZ1R5cGUpKSk7CisJCXJldHVybiBGQUxTRTsKIAl9CiAKKwl7CisJCXN0cnVjdCBydF9jaXBoZXJfa2V5ICpwU2hhcmVkS2V5OwogCi0Jb3NfZnJlZV9tZW0oTlVMTCwgUik7CisJCS8qIHNldCBrZXkgbWF0ZXJpYWwsIFR4TWljIGFuZCBSeE1pYyAqLworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5HVEssIHBNeUtleURhdGEsIDMyKTsKKwkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gRGVmYXVsdElkeDsKKworCQlwU2hhcmVkS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF07CisKKwkJLyogUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZSAqLworCQlOZGlzWmVyb01lbW9yeShwU2hhcmVkS2V5LCBzaXplb2Yoc3RydWN0IHJ0X2NpcGhlcl9rZXkpKTsKKwkJcFNoYXJlZEtleS0+S2V5TGVuID0gTEVOX1RLSVBfRUs7CisJCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPktleSwgcEFkLT5TdGFDZmcuR1RLLCBMRU5fVEtJUF9FSyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPlJ4TWljLCAmcEFkLT5TdGFDZmcuR1RLWzE2XSwKKwkJCSAgICAgICBMRU5fVEtJUF9SWE1JQ0spOworCQlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5UeE1pYywgJnBBZC0+U3RhQ2ZnLkdUS1syNF0sCisJCQkgICAgICAgTEVOX1RLSVBfVFhNSUNLKTsKKworCQkvKiBVcGRhdGUgU2hhcmVkIEtleSBDaXBoZXJBbGcgKi8KKwkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCWlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09CisJCQkgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkKKwkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0KKwkJCSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkKQorCQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworCQkvKiBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZSAqLworCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCSAgICAgIEJTUzAsCisJCQkJICAgICAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorCQkJCSAgICAgIHBTaGFyZWRLZXktPkNpcGhlckFsZywKKwkJCQkgICAgICBwU2hhcmVkS2V5LT5LZXksCisJCQkJICAgICAgcFNoYXJlZEtleS0+VHhNaWMsIHBTaGFyZWRLZXktPlJ4TWljKTsKKworCQkvKiBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgKi8KKwkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCSAgQlNTMCwKKwkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCSAgcFNoYXJlZEtleS0+Q2lwaGVyQWxnLCBOVUxMKTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29uc3RydWN0IEVBUG9MIG1lc3NhZ2UgZm9yIFdQQSBoYW5kc2hha2luZworCQlJdHMgZm9ybWF0IGlzIGJlbG93LAorCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBQcm90b2NvbCBWZXJzaW9uCSB8ICAxIG9jdGV0CisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBQcm90b2NvbCBUeXBlCQkgfAkxIG9jdGV0CisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBCb2R5IExlbmd0aAkJIHwgIDIgb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBEZXNjcmlwdG9yIFR5cGUJIHwJMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IEluZm9ybWF0aW9uICAgIHwJMiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBMZW5ndGgJICAgICB8ICAxIG9jdGV0CisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgUmVwYWx5IENvdW50ZXIgfAk4IG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IE5vbmNlCQkgICAgIHwgIDMyIG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IElWCQkJIHwgIDE2IG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IFJTQwkJCSB8ICA4IG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IElEIG9yIFJlc2VydmVkIHwJOCBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBNSUMJCQkgfAkxNiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBEYXRhIExlbmd0aAkgfAkyIG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IERhdGEJCQkgfAluIG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgQ29uc3RydWN0RWFwb2xNc2coc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkgICAgICAgdTggR3JvdXBLZXlXZXBTdGF0dXMsCisJCSAgICAgICB1OCBNc2dUeXBlLAorCQkgICAgICAgdTggRGVmYXVsdEtleUlkeCwKKwkJICAgICAgIHU4ICogS2V5Tm9uY2UsCisJCSAgICAgICB1OCAqIFR4UlNDLAorCQkgICAgICAgdTggKiBHVEssCisJCSAgICAgICB1OCAqIFJTTklFLAorCQkgICAgICAgdTggUlNOSUVfTGVuLCBzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICogcE1zZykKK3sKKwlCT09MRUFOIGJXUEEyID0gRkFMU0U7CisJdTggS2V5RGVzY1ZlcjsKKworCS8qIENob29zZSBXUEEyIG9yIG5vdCAqLworCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorCSAgICAocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJYldQQTIgPSBUUlVFOworCisJLyogSW5pdCBQYWNrZXQgYW5kIEZpbGwgaGVhZGVyICovCisJcE1zZy0+UHJvVmVyID0gRUFQT0xfVkVSOworCXBNc2ctPlByb1R5cGUgPSBFQVBPTEtleTsKKworCS8qIERlZmF1bHQgOTUgYnl0ZXMsIHRoZSBFQVBvTC1LZXkgZGVzY3JpcHRvciBleGNsdWRlIEtleS1kYXRhIGZpZWxkICovCisJU0VUX3UxNl9UT19BUlJBUlkocE1zZy0+Qm9keV9MZW4sIExFTl9FQVBPTF9LRVlfTVNHKTsKKworCS8qIEZpbGwgaW4gRUFQb0wgZGVzY3JpcHRvciAqLworCWlmIChiV1BBMikKKwkJcE1zZy0+S2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKwllbHNlCisJCXBNc2ctPktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisKKwkvKiBLZXkgRGVzY3JpcHRvciBWZXJzaW9uIChiaXRzIDAtMikgc3BlY2lmaWVzIHRoZSBrZXkgZGVzY3JpcHRvciB2ZXJzaW9uIHR5cGUgKi8KKwl7CisJCS8qIEZpbGwgaW4gS2V5IGluZm9ybWF0aW9uLCByZWZlciB0byBJRUVFIFN0ZCA4MDIuMTFpLTIwMDQgcGFnZSA3OCAqLworCQkvKiBXaGVuIGVpdGhlciB0aGUgcGFpcndpc2Ugb3IgdGhlIGdyb3VwIGNpcGhlciBpcyBBRVMsIHRoZSBERVNDX1RZUEVfQUVTKDIpIHNoYWxsIGJlIHVzZWQuICovCisJCUtleURlc2NWZXIgPQorCQkgICAgKCgocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJICAgICAgfHwgKEdyb3VwS2V5V2VwU3RhdHVzID09CisJCQkgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKSA/IChERVNDX1RZUEVfQUVTKQorCQkgICAgIDogKERFU0NfVFlQRV9US0lQKSk7CisJfQorCisJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSBLZXlEZXNjVmVyOworCisJLyogU3BlY2lmeSBLZXkgVHlwZSBhcyBHcm91cCgwKSBvciBQYWlyd2lzZSgxKSAqLworCWlmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKQorCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IEdST1VQS0VZOworCWVsc2UKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBQQUlSV0lTRUtFWTsKKworCS8qIFNwZWNpZnkgS2V5IEluZGV4LCBvbmx5IGdyb3VwX21zZzFfV1BBMSAqLworCWlmICghYldQQTIgJiYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5SW5kZXggPSBEZWZhdWx0S2V5SWR4OworCisJaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLkluc3RhbGwgPSAxOworCisJaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpIHx8IChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJICAgIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleUFjayA9IDE7CisKKwlpZiAoTXNnVHlwZSAhPSBFQVBPTF9QQUlSX01TR18xKQorCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5TWljID0gMTsKKworCWlmICgoYldQQTIgJiYgKE1zZ1R5cGUgPj0gRUFQT0xfUEFJUl9NU0dfMykpIHx8CisJICAgICghYldQQTIgJiYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpKSkgeworCQlwTXNnLT5LZXlEZXNjLktleUluZm8uU2VjdXJlID0gMTsKKwl9CisKKwlpZiAoYldQQTIgJiYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpIHx8CisJCSAgICAgIChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkpIHsKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLkVLRF9ETCA9IDE7CisJfQorCS8qIGtleSBJbmZvcm1hdGlvbiBlbGVtZW50IGhhcyBkb25lLiAqLworCSoodTE2ICopICgmcE1zZy0+S2V5RGVzYy5LZXlJbmZvKSA9CisJICAgIGNwdTJsZTE2KCoodTE2ICopICgmcE1zZy0+S2V5RGVzYy5LZXlJbmZvKSk7CisKKwkvKiBGaWxsIGluIEtleSBMZW5ndGggKi8KKwl7CisJCWlmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKSB7CisJCQkvKiB0aGUgbGVuZ3RoIG9mIGdyb3VwIGtleSBjaXBoZXIgKi8KKwkJCXBNc2ctPktleURlc2MuS2V5TGVuZ3RoWzFdID0KKwkJCSAgICAoKEdyb3VwS2V5V2VwU3RhdHVzID09CisJCQkgICAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSA/IFRLSVBfR1RLX0xFTkdUSCA6CisJCQkgICAgIExFTl9BRVNfS0VZKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHRoZSBsZW5ndGggb2YgcGFpcndpc2Uga2V5IGNpcGhlciAqLworCQkJcE1zZy0+S2V5RGVzYy5LZXlMZW5ndGhbMV0gPQorCQkJICAgICgocEVudHJ5LT5XZXBTdGF0dXMgPT0KKwkJCSAgICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpID8gTEVOX1RLSVBfS0VZIDoKKwkJCSAgICAgTEVOX0FFU19LRVkpOworCQl9CisJfQorCisJLyogRmlsbCBpbiByZXBsYXkgY291bnRlciAqLworCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgcEVudHJ5LT5SX0NvdW50ZXIsCisJCSAgICAgICBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8qIEZpbGwgS2V5IE5vbmNlIGZpZWxkICovCisJLyogQU5vbmNlIDogcGFpcndpc2VfbXNnMSAmIHBhaXJ3aXNlX21zZzMgKi8KKwkvKiBTTm9uY2UgOiBwYWlyd2lzZV9tc2cyICovCisJLyogR05vbmNlIDogZ3JvdXBfbXNnMV93cGExICovCisJaWYgKChNc2dUeXBlIDw9IEVBUE9MX1BBSVJfTVNHXzMpCisJICAgIHx8ICgoIWJXUEEyICYmIChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkpKQorCQlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleU5vbmNlLCBLZXlOb25jZSwKKwkJCSAgICAgICBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLyogRmlsbCBrZXkgSVYgLSBXUEEyIGFzIDAsIFdQQTEgYXMgcmFuZG9tICovCisJaWYgKCFiV1BBMiAmJiAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpIHsKKwkJLyogU3VnZ2VzdCBJViBiZSByYW5kb20gbnVtYmVyIHBsdXMgc29tZSBudW1iZXIsICovCisJCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5SXYsICZLZXlOb25jZVsxNl0sCisJCQkgICAgICAgTEVOX0tFWV9ERVNDX0lWKTsKKwkJcE1zZy0+S2V5RGVzYy5LZXlJdlsxNV0gKz0gMjsKKwl9CisJLyogRmlsbCBLZXkgUlNDIGZpZWxkICovCisJLyogSXQgY29udGFpbnMgdGhlIFJTQyBmb3IgdGhlIEdUSyBiZWluZyBpbnN0YWxsZWQuICovCisJaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgJiYgYldQQTIpCisJICAgIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkgeworCQlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleVJzYywgVHhSU0MsIDYpOworCX0KKwkvKiBDbGVhciBLZXkgTUlDIGZpZWxkIGZvciBNSUMgY2FsY3VsYXRpb24gbGF0ZXIgKi8KKwlOZGlzWmVyb01lbW9yeShwTXNnLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwlDb25zdHJ1Y3RFYXBvbEtleURhdGEocEVudHJ5LAorCQkJICAgICAgR3JvdXBLZXlXZXBTdGF0dXMsCisJCQkgICAgICBLZXlEZXNjVmVyLAorCQkJICAgICAgTXNnVHlwZSwKKwkJCSAgICAgIERlZmF1bHRLZXlJZHgsIEdUSywgUlNOSUUsIFJTTklFX0xlbiwgcE1zZyk7CisKKwkvKiBDYWxjdWxhdGUgTUlDIGFuZCBmaWxsIGluIEtleU1pYyBGaWVsZCBleGNlcHQgUGFpcndpc2UgTXNnIDEuICovCisJaWYgKE1zZ1R5cGUgIT0gRUFQT0xfUEFJUl9NU0dfMSkgeworCQlDYWxjdWxhdGVNSUMoS2V5RGVzY1ZlciwgcEVudHJ5LT5QVEssIHBNc2cpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCI9PT0+IENvbnN0cnVjdEVhcG9sTXNnIGZvciAlcyAlc1xuIiwKKwkJICAoKGJXUEEyKSA/ICJXUEEyIiA6ICJXUEEiKSwgR2V0RWFwb2xNc2dUeXBlKE1zZ1R5cGUpKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIgkgICAgIEJvZHkgbGVuZ3RoID0gJWQgXG4iLAorCQkgIENPTlZfQVJSQVJZX1RPX3UxNihwTXNnLT5Cb2R5X0xlbikpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiCSAgICAgS2V5IGxlbmd0aCAgPSAlZCBcbiIsCisJCSAgQ09OVl9BUlJBUllfVE9fdTE2KHBNc2ctPktleURlc2MuS2V5TGVuZ3RoKSkpOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDb25zdHJ1Y3QgdGhlIEtleSBEYXRhIGZpZWxkIG9mIEVBUG9MIG1lc3NhZ2UKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCQlFbGVtCQlNZXNzYWdlIGJvZHkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgQ29uc3RydWN0RWFwb2xLZXlEYXRhKHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJCSAgIHU4IEdyb3VwS2V5V2VwU3RhdHVzLAorCQkJICAgdTgga2V5RGVzY1ZlciwKKwkJCSAgIHU4IE1zZ1R5cGUsCisJCQkgICB1OCBEZWZhdWx0S2V5SWR4LAorCQkJICAgdTggKiBHVEssCisJCQkgICB1OCAqIFJTTklFLAorCQkJICAgdTggUlNOSUVfTEVOLCBzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICogcE1zZykKK3sKKwl1OCAqbXBvb2wsICpLZXlfRGF0YSwgKlJjNEdUSzsKKwl1OCBla2V5WyhMRU5fS0VZX0RFU0NfSVYgKyBMRU5fRUFQX0VLKV07CisJdW5zaWduZWQgbG9uZyBkYXRhX29mZnNldDsKKwlCT09MRUFOIGJXUEEyQ2FwYWJsZSA9IEZBTFNFOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IHBFbnRyeS0+cEFkOworCUJPT0xFQU4gR1RLX0luY2x1ZGVkID0gRkFMU0U7CisKKwkvKiBDaG9vc2UgV1BBMiBvciBub3QgKi8KKwlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkgICAgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCWJXUEEyQ2FwYWJsZSA9IFRSVUU7CisKKwlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xIHx8CisJICAgIE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfNCB8fCBNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18yKQorCQlyZXR1cm47CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgcG9vbCAqLworCW9zX2FsbG9jX21lbShOVUxMLCAodTggKiopICYgbXBvb2wsIDE1MDApOworCisJaWYgKG1wb29sID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIFJjNEdUSyBMZW4gPSA1MTIgKi8KKwlSYzRHVEsgPSAodTggKikgUk9VTkRfVVAobXBvb2wsIDQpOworCS8qIEtleV9EYXRhIExlbiA9IDUxMiAqLworCUtleV9EYXRhID0gKHU4ICopIFJPVU5EX1VQKFJjNEdUSyArIDUxMiwgNCk7CisKKwlOZGlzWmVyb01lbW9yeShLZXlfRGF0YSwgNTEyKTsKKwlTRVRfdTE2X1RPX0FSUkFSWShwTXNnLT5LZXlEZXNjLktleURhdGFMZW4sIDApOworCWRhdGFfb2Zmc2V0ID0gMDsKKworCS8qIEVuY2Fwc3VsYXRlIFJTTklFIGluIHBhaXJ3aXNlX21zZzIgJiBwYWlyd2lzZV9tc2czICovCisJaWYgKFJTTklFX0xFTgorCSAgICAmJiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMikKKwkJfHwgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykpKSB7CisJCXU4ICpwbWtpZF9wdHIgPSBOVUxMOworCQl1OCBwbWtpZF9sZW4gPSAwOworCisJCVJUTVBJbnNlcnRSU05JRSgmS2V5X0RhdGFbZGF0YV9vZmZzZXRdLAorCQkJCSZkYXRhX29mZnNldCwKKwkJCQlSU05JRSwgUlNOSUVfTEVOLCBwbWtpZF9wdHIsIHBta2lkX2xlbik7CisJfQorCisJLyogRW5jYXBzdWxhdGUgS0RFIGZvcm1hdCBpbiBwYWlyd2lzZV9tc2czX1dQQTIgJiBncm91cF9tc2cxX1dQQTIgKi8KKwlpZiAoYldQQTJDYXBhYmxlCisJICAgICYmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorCQl8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpKSB7CisJCS8qIEtleSBEYXRhIEVuY2Fwc3VsYXRpb24gKEtERSkgZm9ybWF0IC0gODAyLjExaS0yMDA0ICBGaWd1cmUtNDN3IGFuZCBUYWJsZS0yMGggKi8KKwkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAwXSA9IDB4REQ7CisKKwkJaWYgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHsKKwkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMV0gPSAweDE2OwkvKiA0KzIrMTYoT1VJK0RhdGFUeXBlK0RhdGFGaWVsZCkgKi8KKwkJfSBlbHNlIHsKKwkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMV0gPSAweDI2OwkvKiA0KzIrMzIoT1VJK0RhdGFUeXBlK0RhdGFGaWVsZCkgKi8KKwkJfQorCisJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMl0gPSAweDAwOworCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDNdID0gMHgwRjsKKwkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyA0XSA9IDB4QUM7CisJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNV0gPSAweDAxOworCisJCS8qIEdUSyBLREUgZm9ybWF0IC0gODAyLjExaS0yMDA0ICBGaWd1cmUtNDN4ICovCisJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNl0gPSAoRGVmYXVsdEtleUlkeCAmIDB4MDMpOworCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDddID0gMHgwMDsJLyogUmVzZXJ2ZWQgQnl0ZSAqLworCisJCWRhdGFfb2Zmc2V0ICs9IDg7CisJfQorCisJLyogRW5jYXBzdWxhdGUgR1RLICovCisJLyogT25seSBmb3IgcGFpcndpc2VfbXNnM19XUEEyIGFuZCBncm91cF9tc2cxICovCisJaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgJiYgYldQQTJDYXBhYmxlKQorCSAgICB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpIHsKKwkJLyogRmlsbCBpbiBHVEsgKi8KKwkJaWYgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlfRGF0YVtkYXRhX29mZnNldF0sIEdUSywKKwkJCQkgICAgICAgTEVOX0FFU19LRVkpOworCQkJZGF0YV9vZmZzZXQgKz0gTEVOX0FFU19LRVk7CisJCX0gZWxzZSB7CisJCQlOZGlzTW92ZU1lbW9yeSgmS2V5X0RhdGFbZGF0YV9vZmZzZXRdLCBHVEssCisJCQkJICAgICAgIFRLSVBfR1RLX0xFTkdUSCk7CisJCQlkYXRhX29mZnNldCArPSBUS0lQX0dUS19MRU5HVEg7CisJCX0KKworCQlHVEtfSW5jbHVkZWQgPSBUUlVFOworCX0KKworCS8qIFRoaXMgd2hvbGUga2V5LWRhdGEgZmllbGQgc2hhbGwgYmUgZW5jcnlwdGVkIGlmIGEgR1RLIGlzIGluY2x1ZGVkLiAqLworCS8qIEVuY3J5cHQgdGhlIGRhdGEgbWF0ZXJpYWwgaW4ga2V5IGRhdGEgZmllbGQgd2l0aCBLRUsgKi8KKwlpZiAoR1RLX0luY2x1ZGVkKSB7CisJCS8qaGV4X2R1bXAoIkdUS19JbmNsdWRlZCIsIEtleV9EYXRhLCBkYXRhX29mZnNldCk7ICovCisKKwkJaWYgKChrZXlEZXNjVmVyID09IERFU0NfVFlQRV9BRVMpKSB7CisJCQl1OCByZW1haW5kZXIgPSAwOworCQkJdTggcGFkX2xlbiA9IDA7CisKKwkJCS8qIEtleSBEZXNjcmlwdG9yIFZlcnNpb24gMiBvciAzOiBBRVMga2V5IHdyYXAsIGRlZmluZWQgaW4gSUVURiBSRkMgMzM5NCwgKi8KKwkJCS8qIHNoYWxsIGJlIHVzZWQgdG8gZW5jcnlwdCB0aGUgS2V5IERhdGEgZmllbGQgdXNpbmcgdGhlIEtFSyBmaWVsZCBmcm9tICovCisJCQkvKiB0aGUgZGVyaXZlZCBQVEsuICovCisKKwkJCS8qIElmIHRoZSBLZXkgRGF0YSBmaWVsZCB1c2VzIHRoZSBOSVNUIEFFUyBrZXkgd3JhcCwgdGhlbiB0aGUgS2V5IERhdGEgZmllbGQgKi8KKwkJCS8qIHNoYWxsIGJlIHBhZGRlZCBiZWZvcmUgZW5jcnlwdGluZyBpZiB0aGUga2V5IGRhdGEgbGVuZ3RoIGlzIGxlc3MgdGhhbiAxNiAqLworCQkJLyogb2N0ZXRzIG9yIGlmIGl0IGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIFRoZSBwYWRkaW5nIGNvbnNpc3RzIG9mIGFwcGVuZGluZyAqLworCQkJLyogYSBzaW5nbGUgb2N0ZXQgMHhkZCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgMHgwMCBvY3RldHMuICovCisJCQlpZiAoKHJlbWFpbmRlciA9IGRhdGFfb2Zmc2V0ICYgMHgwNykgIT0gMCkgeworCQkJCWludCBpOworCisJCQkJcGFkX2xlbiA9ICg4IC0gcmVtYWluZGVyKTsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldF0gPSAweEREOworCQkJCWZvciAoaSA9IDE7IGkgPCBwYWRfbGVuOyBpKyspCisJCQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgaV0gPSAwOworCisJCQkJZGF0YV9vZmZzZXQgKz0gcGFkX2xlbjsKKwkJCX0KKworCQkJQUVTX0dUS19LRVlfV1JBUCgmcEVudHJ5LT5QVEtbMTZdLCBLZXlfRGF0YSwKKwkJCQkJIGRhdGFfb2Zmc2V0LCBSYzRHVEspOworCQkJLyogQUVTIHdyYXAgZnVuY3Rpb24gd2lsbCBncm93IDggYnl0ZXMgaW4gbGVuZ3RoICovCisJCQlkYXRhX29mZnNldCArPSA4OworCQl9IGVsc2UgeworCQkJLyogICAgICBLZXkgRGVzY3JpcHRvciBWZXJzaW9uIDE6IEFSQzQgaXMgdXNlZCB0byBlbmNyeXB0IHRoZSBLZXkgRGF0YSBmaWVsZAorCQkJICAgdXNpbmcgdGhlIEtFSyBmaWVsZCBmcm9tIHRoZSBkZXJpdmVkIFBUSy4gKi8KKworCQkJLyogUFJFUEFSRSBFbmNyeXB0ZWQgICJLZXkgREFUQSIgZmllbGQuICAoRW5jcnlwdCBHVEsgd2l0aCBSQzQsIHVzaW5mIFBUS1sxNl0tPlszMV0gYXMgS2V5LCBJVi1maWVsZCBhcyBJVikgKi8KKwkJCS8qIHB1dCBUeFRzYyBpbiBLZXkgUlNDIGZpZWxkICovCisJCQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gUFBQSU5JVEZDUzMyOwkvKkluaXQgY3JjMzIuICovCisKKwkJCS8qIGVrZXkgaXMgdGhlIGNvbnRhbmV0aW9uIG9mIElWLWZpZWxkLCBhbmQgUFRLWzE2XS0+UFRLWzMxXSAqLworCQkJTmRpc01vdmVNZW1vcnkoZWtleSwgcE1zZy0+S2V5RGVzYy5LZXlJdiwKKwkJCQkgICAgICAgTEVOX0tFWV9ERVNDX0lWKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZla2V5W0xFTl9LRVlfREVTQ19JVl0sICZwRW50cnktPlBUS1sxNl0sCisJCQkJICAgICAgIExFTl9FQVBfRUspOworCQkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIGVrZXksIHNpemVvZihla2V5KSk7CS8qSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikgKi8KKwkJCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPQorCQkJICAgIFJUTVBfQ0FMQ19GQ1MzMihwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCBLZXlfRGF0YSwKKwkJCQkJICAgIGRhdGFfb2Zmc2V0KTsKKwkJCVdQQUFSQ0ZPVVJfRU5DUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBSYzRHVEssCisJCQkJCSAgIEtleV9EYXRhLCBkYXRhX29mZnNldCk7CisJCX0KKworCQlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleURhdGEsIFJjNEdUSywgZGF0YV9vZmZzZXQpOworCX0gZWxzZSB7CisJCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5RGF0YSwgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0KTsKKwl9CisKKwkvKiBVcGRhdGUga2V5IGRhdGEgbGVuZ3RoIGZpZWxkIGFuZCB0b3RhbCBib2R5IGxlbmd0aCAqLworCVNFVF91MTZfVE9fQVJSQVJZKHBNc2ctPktleURlc2MuS2V5RGF0YUxlbiwgZGF0YV9vZmZzZXQpOworCUlOQ191MTZfVE9fQVJSQVJZKHBNc2ctPkJvZHlfTGVuLCBkYXRhX29mZnNldCk7CisKKwlvc19mcmVlX21lbShOVUxMLCBtcG9vbCk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbGNhdWxhdGUgTUlDLiBJdCBpcyB1c2VkIGR1cmluZyA0LXdheXMgaGFuZHNoYXJraW5nLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKwlQZWVyV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyB2b2lkIENhbGN1bGF0ZU1JQyh1OCBLZXlEZXNjVmVyLAorCQkJIHU4ICogUFRLLCBzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICogcE1zZykKK3sKKwl1OCAqT3V0QnVmZmVyOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW4gPSAwOworCXU4IG1pY1tMRU5fS0VZX0RFU0NfTUlDXTsKKwl1OCBkaWdlc3RbODBdOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBNSUMgY2FsY3VsYXRpb24gKi8KKwlvc19hbGxvY19tZW0oTlVMTCwgKHU4ICoqKSAmIE91dEJ1ZmZlciwgNTEyKTsKKworCWlmIChPdXRCdWZmZXIgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJDYWxjdWxhdGVNSUM6IG5vIG1lbW9yeSFcbiIpKTsKKwkJcmV0dXJuOworCX0KKwkvKiBtYWtlIGEgZnJhbWUgZm9yIGNhbGN1bGF0aW5nIE1JQy4gKi8KKwlNYWtlT3V0Z29pbmdGcmFtZShPdXRCdWZmZXIsICZGcmFtZUxlbiwKKwkJCSAgQ09OVl9BUlJBUllfVE9fdTE2KHBNc2ctPkJvZHlfTGVuKSArIDQsIHBNc2csCisJCQkgIEVORF9PRl9BUkdTKTsKKworCU5kaXNaZXJvTWVtb3J5KG1pYywgc2l6ZW9mKG1pYykpOworCisJLyogQ2FsY3VsYXRlIE1JQyAqLworCWlmIChLZXlEZXNjVmVyID09IERFU0NfVFlQRV9BRVMpIHsKKwkJSE1BQ19TSEExKFBUSywgTEVOX0VBUF9NSUNLLCBPdXRCdWZmZXIsIEZyYW1lTGVuLCBkaWdlc3QsCisJCQkgIFNIQTFfRElHRVNUX1NJWkUpOworCQlOZGlzTW92ZU1lbW9yeShtaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfSBlbHNlIHsKKwkJSE1BQ19NRDUoUFRLLCBMRU5fRUFQX01JQ0ssIE91dEJ1ZmZlciwgRnJhbWVMZW4sIG1pYywKKwkJCSBNRDVfRElHRVNUX1NJWkUpOworCX0KKworCS8qIHN0b3JlIHRoZSBjYWxjdWxhdGVkIE1JQyAqLworCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5TWljLCBtaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJb3NfZnJlZV9tZW0oTlVMTCwgT3V0QnVmZmVyKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNvbWUgcmVjZWl2ZWQgZnJhbWVzIGNhbid0IGRlY3J5cHQgYnkgQXNpYywgc28gZGVjcnlwdCB0aGVtIGJ5IHNvZnR3YXJlLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKwlQZWVyV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTCQktCWRlY3J5cHRpb24gc3VjY2Vzc2Z1bAorCQlORElTX1NUQVRVU19GQUlMVVJFCQktCWRlY3J5cHRpb24gZmFpbHVyZQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJUTVBTb2Z0RGVjcnlwdEJyb2FkQ2FzdERhdGEoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLAorCQkJCQkgSU4gTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMKKwkJCQkJIEdyb3VwQ2lwaGVyLCBzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcFNoYXJkX2tleSkKK3sKKwlzdHJ1Y3QgcnRfcnh3aSAqIHBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKKworCS8qIGhhbmRsZSBXRVAgZGVjcnlwdGlvbiAqLworCWlmIChHcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB7CisJCWlmIChSVE1QU29mdERlY3J5cHRXRVAKKwkJICAgIChwQWQsIHBSeEJsay0+cERhdGEsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsCisJCSAgICAgcFNoYXJkX2tleSkpIHsKKworCQkJLypNaW51cyBJVls0XSAmIElDVls0XSAqLworCQkJcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAtPSA4OworCQl9IGVsc2UgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiRVJST1IgOiBTb2Z0d2FyZSBkZWNyeXB0IFdFUCBkYXRhIGZhaWxzLlxuIikpOworCQkJLyogZ2l2ZSB1cCB0aGlzIGZyYW1lICovCisJCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJfQorCX0KKwkvKiBoYW5kbGUgVEtJUCBkZWNyeXB0aW9uICovCisJZWxzZSBpZiAoR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgeworCQlpZiAoUlRNUFNvZnREZWNyeXB0VEtJUAorCQkgICAgKHBBZCwgcFJ4QmxrLT5wRGF0YSwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCwgMCwKKwkJICAgICBwU2hhcmRfa2V5KSkgeworCisJCQkvKk1pbnVzIDggYnl0ZXMgTUlDLCA4IGJ5dGVzIElWL0VJViwgNCBieXRlcyBJQ1YgKi8KKwkJCXBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgLT0gMjA7CisJCX0gZWxzZSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCJFUlJPUiA6IFJUTVBTb2Z0RGVjcnlwdFRLSVAgRmFpbGVkXG4iKSk7CisJCQkvKiBnaXZlIHVwIHRoaXMgZnJhbWUgKi8KKwkJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCQl9CisJfQorCS8qIGhhbmRsZSBBRVMgZGVjcnlwdGlvbiAqLworCWVsc2UgaWYgKEdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHsKKwkJaWYgKFJUTVBTb2Z0RGVjcnlwdEFFUworCQkgICAgKHBBZCwgcFJ4QmxrLT5wRGF0YSwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCwKKwkJICAgICBwU2hhcmRfa2V5KSkgeworCisJCQkvKjggYnl0ZXMgTUlDLCA4IGJ5dGVzIElWL0VJViAoQ0NNUCBIZWFkZXIpICovCisJCQlwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IC09IDE2OworCQl9IGVsc2UgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiRVJST1IgOiBSVE1QU29mdERlY3J5cHRBRVMgRmFpbGVkXG4iKSk7CisJCQkvKiBnaXZlIHVwIHRoaXMgZnJhbWUgKi8KKwkJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCQl9CisJfSBlbHNlIHsKKwkJLyogZ2l2ZSB1cCB0aGlzIGZyYW1lICovCisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworCit9CisKK3U4ICpHZXRTdWl0ZUZyb21SU05JRSh1OCAqcnNuaWUsCisJCQkgdTMyIHJzbmllX2xlbiwgdTggdHlwZSwgdTggKiBjb3VudCkKK3sKKwlzdHJ1Y3QgcnRfZWlkICogcEVpZDsKKwlpbnQgbGVuOworCXU4ICpwQnVmOworCWludCBvZmZzZXQgPSAwOworCXN0cnVjdCBydF9yc25pZV9hdXRoICpwQWttOworCXUxNiBhY291bnQ7CisJQk9PTEVBTiBpc1dQQTIgPSBGQUxTRTsKKworCXBFaWQgPSAoc3RydWN0IHJ0X2VpZCAqKSByc25pZTsKKwlsZW4gPSByc25pZV9sZW4gLSAyOwkvKiBleGNsdWRlIElFIGFuZCBsZW5ndGggKi8KKwlwQnVmID0gKHU4ICopJiBwRWlkLT5PY3RldFswXTsKKworCS8qIHNldCBkZWZhdWx0IHZhbHVlICovCisJKmNvdW50ID0gMDsKKworCS8qIENoZWNrIGxlbmd0aCAqLworCWlmICgobGVuIDw9IDApIHx8IChwRWlkLT5MZW4gIT0gbGVuKSkgeworCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBsZW5ndGggaXMgaW52YWxpZFxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qIENoZWNrIFdQQSBvciBXUEEyICovCisJaWYgKHBFaWQtPkVpZCA9PSBJRV9XUEEpIHsKKwkJc3RydWN0IHJ0X3JzbmllICpwUnNuaWUgPSAoc3RydWN0IHJ0X3JzbmllICopcEJ1ZjsKKwkJdTE2IHVjb3VudDsKKworCQlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBydF9yc25pZSkpIHsKKwkJCURCR1BSSU5UX0VSUigoIiVzIDogVGhlIGxlbmd0aCBpcyB0b28gc2hvcnQgZm9yIFdQQVxuIiwKKwkJCQkgICAgICBfX2Z1bmNfXykpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJLyogR2V0IHRoZSBjb3VudCBvZiBwYWlyd2lzZSBjaXBoZXIgKi8KKwkJdWNvdW50ID0gY3B1MmxlMTYocFJzbmllLT51Y291bnQpOworCQlpZiAodWNvdW50ID4gMikgeworCQkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgY291bnQoJWQpIG9mIHBhaXJ3aXNlIGNpcGhlciBpcyBpbnZsYWlkXG4iLCBfX2Z1bmNfXywgdWNvdW50KSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQkvKiBHZXQgdGhlIGdyb3VwIGNpcGhlciAqLworCQlpZiAodHlwZSA9PSBHUk9VUF9TVUlURSkgeworCQkJKmNvdW50ID0gMTsKKwkJCXJldHVybiBwUnNuaWUtPm1jYXN0OworCQl9CisJCS8qIEdldCB0aGUgcGFpcndpc2UgY2lwaGVyIHN1aXRlICovCisJCWVsc2UgaWYgKHR5cGUgPT0gUEFJUldJU0VfU1VJVEUpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIiVzIDogVGhlIGNvdW50IG9mIHBhaXJ3aXNlIGNpcGhlciBpcyAlZFxuIiwKKwkJCQkgIF9fZnVuY19fLCB1Y291bnQpKTsKKwkJCSpjb3VudCA9IHVjb3VudDsKKwkJCXJldHVybiBwUnNuaWUtPnVjYXN0WzBdLm91aTsKKwkJfQorCisJCW9mZnNldCA9IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWUpICsgKDQgKiAodWNvdW50IC0gMSkpOworCisJfSBlbHNlIGlmIChwRWlkLT5FaWQgPT0gSUVfUlNOKSB7CisJCXN0cnVjdCBydF9yc25pZTIgKnBSc25pZSA9IChzdHJ1Y3QgcnRfcnNuaWUyICopcEJ1ZjsKKwkJdTE2IHVjb3VudDsKKworCQlpc1dQQTIgPSBUUlVFOworCisJCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IHJ0X3JzbmllMikpIHsKKwkJCURCR1BSSU5UX0VSUigoIiVzIDogVGhlIGxlbmd0aCBpcyB0b28gc2hvcnQgZm9yIFdQQTJcbiIsCisJCQkJICAgICAgX19mdW5jX18pKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCS8qIEdldCB0aGUgY291bnQgb2YgcGFpcndpc2UgY2lwaGVyICovCisJCXVjb3VudCA9IGNwdTJsZTE2KHBSc25pZS0+dWNvdW50KTsKKwkJaWYgKHVjb3VudCA+IDIpIHsKKwkJCURCR1BSSU5UX0VSUigoIiVzIDogVGhlIGNvdW50KCVkKSBvZiBwYWlyd2lzZSBjaXBoZXIgaXMgaW52bGFpZFxuIiwgX19mdW5jX18sIHVjb3VudCkpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJLyogR2V0IHRoZSBncm91cCBjaXBoZXIgKi8KKwkJaWYgKHR5cGUgPT0gR1JPVVBfU1VJVEUpIHsKKwkJCSpjb3VudCA9IDE7CisJCQlyZXR1cm4gcFJzbmllLT5tY2FzdDsKKwkJfQorCQkvKiBHZXQgdGhlIHBhaXJ3aXNlIGNpcGhlciBzdWl0ZSAqLworCQllbHNlIGlmICh0eXBlID09IFBBSVJXSVNFX1NVSVRFKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCIlcyA6IFRoZSBjb3VudCBvZiBwYWlyd2lzZSBjaXBoZXIgaXMgJWRcbiIsCisJCQkJICBfX2Z1bmNfXywgdWNvdW50KSk7CisJCQkqY291bnQgPSB1Y291bnQ7CisJCQlyZXR1cm4gcFJzbmllLT51Y2FzdFswXS5vdWk7CisJCX0KKworCQlvZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJ0X3JzbmllMikgKyAoNCAqICh1Y291bnQgLSAxKSk7CisKKwl9IGVsc2UgeworCQlEQkdQUklOVF9FUlIoKCIlcyA6IFVua25vd24gSUUgKCVkKVxuIiwgX19mdW5jX18sIHBFaWQtPkVpZCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBza2lwIGdyb3VwIGNpcGhlciBhbmQgcGFpcndpc2UgY2lwaGVyIHN1aXRlICovCisJcEJ1ZiArPSBvZmZzZXQ7CisJbGVuIC09IG9mZnNldDsKKworCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IHJ0X3JzbmllX2F1dGgpKSB7CisJCURCR1BSSU5UX0VSUigoIiVzIDogVGhlIGxlbmd0aCBvZiBSU05JRSBpcyB0b28gc2hvcnRcbiIsCisJCQkgICAgICBfX2Z1bmNfXykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLyogcG9pbnRlciB0byBBS00gY291bnQgKi8KKwlwQWttID0gKHN0cnVjdCBydF9yc25pZV9hdXRoICopcEJ1ZjsKKworCS8qIEdldCB0aGUgY291bnQgb2YgcGFpcndpc2UgY2lwaGVyICovCisJYWNvdW50ID0gY3B1MmxlMTYocEFrbS0+YWNvdW50KTsKKwlpZiAoYWNvdW50ID4gMikgeworCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBjb3VudCglZCkgb2YgQUtNIGlzIGludmxhaWRcbiIsCisJCQkgICAgICBfX2Z1bmNfXywgYWNvdW50KSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvKiBHZXQgdGhlIEFLTSBzdWl0ZSAqLworCWlmICh0eXBlID09IEFLTV9TVUlURSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA6IFRoZSBjb3VudCBvZiBBS00gaXMgJWRcbiIsCisJCQkJCSAgX19mdW5jX18sIGFjb3VudCkpOworCQkqY291bnQgPSBhY291bnQ7CisJCXJldHVybiBwQWttLT5hdXRoWzBdLm91aTsKKwl9CisJb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBydF9yc25pZV9hdXRoKSArICg0ICogKGFjb3VudCAtIDEpKTsKKworCXBCdWYgKz0gb2Zmc2V0OworCWxlbiAtPSBvZmZzZXQ7CisKKwkvKiBUaGUgcmVtYWluaW5nIGxlbmd0aCBtdXN0IGxhcmdlciB0aGFuIChSU04tQ2FwYWJpbGl0eSgyKSArIFBNS0lELUNvdW50KDIpICsgUE1LSUQoMTZ+KSkgKi8KKwlpZiAobGVuID49IChzaXplb2YoUlNOX0NBUEFCSUxJVElFUykgKyAyICsgTEVOX1BNS0lEKSkgeworCQkvKiBTa2lwIFJTTiBjYXBhYmlsaXR5IGFuZCBQTUtJRC1Db3VudCAqLworCQlwQnVmICs9IChzaXplb2YoUlNOX0NBUEFCSUxJVElFUykgKyAyKTsKKwkJbGVuIC09IChzaXplb2YoUlNOX0NBUEFCSUxJVElFUykgKyAyKTsKKworCQkvKiBHZXQgUE1LSUQgKi8KKwkJaWYgKHR5cGUgPT0gUE1LSURfTElTVCkgeworCQkJKmNvdW50ID0gMTsKKwkJCXJldHVybiBwQnVmOworCQl9CisJfSBlbHNlIHsKKwkJREJHUFJJTlRfRVJSKCgiJXMgOiBpdCBjYW4ndCBnZXQgYW55IG1vcmUgaW5mb3JtYXRpb24gYmV5b25kIEFLTSBcbiIsIF9fZnVuY19fKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCSpjb3VudCA9IDA7CisJLypEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSB0eXBlKCVkKSBkb2Vzbid0IHN1cHBvcnQgXG4iLCBfX2Z1bmNfXywgdHlwZSkpOyAqLworCXJldHVybiBOVUxMOworCit9CisKK3ZvaWQgV3BhU2hvd0FsbHN1aXRlKHU4ICpyc25pZSwgdTMyIHJzbmllX2xlbikKK3sKKwl1OCAqcFN1aXRlID0gTlVMTDsKKwl1OCBjb3VudDsKKworCWhleF9kdW1wKCJSU05JRSIsIHJzbmllLCByc25pZV9sZW4pOworCisJLyogZ3JvdXAgY2lwaGVyICovCisJaWYgKChwU3VpdGUgPQorCSAgICAgR2V0U3VpdGVGcm9tUlNOSUUocnNuaWUsIHJzbmllX2xlbiwgR1JPVVBfU1VJVEUsCisJCQkgICAgICAgJmNvdW50KSkgIT0gTlVMTCkgeworCQloZXhfZHVtcCgiZ3JvdXAgY2lwaGVyIiwgcFN1aXRlLCA0ICogY291bnQpOworCX0KKwkvKiBwYWlyd2lzZSBjaXBoZXIgKi8KKwlpZiAoKHBTdWl0ZSA9CisJICAgICBHZXRTdWl0ZUZyb21SU05JRShyc25pZSwgcnNuaWVfbGVuLCBQQUlSV0lTRV9TVUlURSwKKwkJCSAgICAgICAmY291bnQpKSAhPSBOVUxMKSB7CisJCWhleF9kdW1wKCJwYWlyd2lzZSBjaXBoZXIiLCBwU3VpdGUsIDQgKiBjb3VudCk7CisJfQorCS8qIEFLTSAqLworCWlmICgocFN1aXRlID0KKwkgICAgIEdldFN1aXRlRnJvbVJTTklFKHJzbmllLCByc25pZV9sZW4sIEFLTV9TVUlURSwgJmNvdW50KSkgIT0gTlVMTCkgeworCQloZXhfZHVtcCgiQUtNIHN1aXRlIiwgcFN1aXRlLCA0ICogY291bnQpOworCX0KKwkvKiBQTUtJRCAqLworCWlmICgocFN1aXRlID0KKwkgICAgIEdldFN1aXRlRnJvbVJTTklFKHJzbmllLCByc25pZV9sZW4sIFBNS0lEX0xJU1QsICZjb3VudCkpICE9IE5VTEwpIHsKKwkJaGV4X2R1bXAoIlBNS0lEIiwgcFN1aXRlLCBMRU5fUE1LSUQpOworCX0KKworfQorCit2b2lkIFJUTVBJbnNlcnRSU05JRSh1OCAqcEZyYW1lQnVmLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgKnBGcmFtZUxlbiwKKwkJICAgICB1OCAqcnNuaWVfcHRyLAorCQkgICAgIHU4IHJzbmllX2xlbiwKKwkJICAgICB1OCAqcG1raWRfcHRyLCB1OCBwbWtpZF9sZW4pCit7CisJdTggKnBUbXBCdWY7CisJdW5zaWduZWQgbG9uZyBUZW1wTGVuID0gMDsKKwl1OCBleHRyYV9sZW4gPSAwOworCXUxNiBwbWtfY291bnQgPSAwOworCXU4IGllX251bTsKKwl1OCB0b3RhbF9sZW4gPSAwOworCXU4IFdQQTJfT1VJWzNdID0geyAweDAwLCAweDBGLCAweEFDIH07CisKKwlwVG1wQnVmID0gcEZyYW1lQnVmOworCisJLyogUE1LSUQtTGlzdCBNdXN0IGxhcmdlciB0aGFuIDAgYW5kIHRoZSBtdWx0aXBsZSBvZiAxNi4gKi8KKwlpZiAocG1raWRfbGVuID4gMCAmJiAoKHBta2lkX2xlbiAmIDB4MGYpID09IDApKSB7CisJCWV4dHJhX2xlbiA9IHNpemVvZih1MTYpKyBwbWtpZF9sZW47CisKKwkJcG1rX2NvdW50ID0gKHBta2lkX2xlbiA+PiA0KTsKKwkJcG1rX2NvdW50ID0gY3B1MmxlMTYocG1rX2NvdW50KTsKKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLAorCQkJICgiJXMgOiBUaGUgbGVuZ3RoIGlzIFBNS0lELUxpc3QgaXMgaW52YWxpZCAoJWQpLCBzbyBkb24ndCBpbnNlcnQgaXQuXG4iLAorCQkJICBfX2Z1bmNfXywgcG1raWRfbGVuKSk7CisJfQorCisJaWYgKHJzbmllX2xlbiAhPSAwKSB7CisJCWllX251bSA9IElFX1dQQTsKKwkJdG90YWxfbGVuID0gcnNuaWVfbGVuOworCisJCWlmIChOZGlzRXF1YWxNZW1vcnkocnNuaWVfcHRyICsgMiwgV1BBMl9PVUksIHNpemVvZihXUEEyX09VSSkpKSB7CisJCQlpZV9udW0gPSBJRV9SU047CisJCQl0b3RhbF9sZW4gKz0gZXh0cmFfbGVuOworCQl9CisKKwkJLyogY29uc3RydWN0IFJTTklFIGJvZHkgKi8KKwkJTWFrZU91dGdvaW5nRnJhbWUocFRtcEJ1ZiwgJlRlbXBMZW4sCisJCQkJICAxLCAmaWVfbnVtLAorCQkJCSAgMSwgJnRvdGFsX2xlbiwKKwkJCQkgIHJzbmllX2xlbiwgcnNuaWVfcHRyLCBFTkRfT0ZfQVJHUyk7CisKKwkJcFRtcEJ1ZiArPSBUZW1wTGVuOworCQkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisKKwkJaWYgKGllX251bSA9PSBJRV9SU04pIHsKKwkJCS8qIEluc2VydCBQTUtJRC1MaXN0IGZpZWxkICovCisJCQlpZiAoZXh0cmFfbGVuID4gMCkgeworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBUbXBCdWYsICZUZW1wTGVuLAorCQkJCQkJICAyLCAmcG1rX2NvdW50LAorCQkJCQkJICBwbWtpZF9sZW4sIHBta2lkX3B0ciwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCQkJcFRtcEJ1ZiArPSBUZW1wTGVuOworCQkJCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NyeXB0X2htYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NyeXB0X2htYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2FiMDhlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY3J5cHRfaG1hYy5jCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9jcnlwdF9obWFjLmgiCisKKyNpZmRlZiBITUFDX1NIQTFfU1VQUE9SVAorLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBITUFDIHVzaW5nIFNIQTEgaGFzaCBmdW5jdGlvbgorCitBcmd1bWVudHM6CisgICAga2V5ICAgICAgICAgICAgIFNlY3JldCBrZXkKKyAgICBrZXlfbGVuICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUga2V5IGluIGJ5dGVzCisgICAgbWVzc2FnZSAgICAgICAgIE1lc3NhZ2UgY29udGV4dAorICAgIG1lc3NhZ2VfbGVuICAgICBUaGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gYnl0ZXMKKyAgICBtYWNMZW4gICAgICAgICAgUmVxdWVzdCB0aGUgbGVuZ3RoIG9mIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZQorCitSZXR1cm4gVmFsdWU6CisgICAgbWFjICAgICAgICAgICAgIE1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZQorCitOb3RlOgorICAgIE5vbmUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgSE1BQ19TSEExKElOIGNvbnN0IHU4IEtleVtdLAorCSAgICAgICB1MzIgS2V5TGVuLAorCSAgICAgICBJTiBjb25zdCB1OCBNZXNzYWdlW10sCisJICAgICAgIHUzMiBNZXNzYWdlTGVuLCB1OCBNQUNbXSwgdTMyIE1BQ0xlbikKK3sKKwlzdHJ1Y3QgcnRfc2hhMV9jdHggc2hhX2N0eDE7CisJc3RydWN0IHJ0X3NoYTFfY3R4IHNoYV9jdHgyOworCXU4IEswW1NIQTFfQkxPQ0tfU0laRV07CisJdTggRGlnZXN0W1NIQTFfRElHRVNUX1NJWkVdOworCXUzMiBpbmRleDsKKworCU5kaXNaZXJvTWVtb3J5KCZzaGFfY3R4MSwgc2l6ZW9mKHN0cnVjdCBydF9zaGExX2N0eCkpOworCU5kaXNaZXJvTWVtb3J5KCZzaGFfY3R4Miwgc2l6ZW9mKHN0cnVjdCBydF9zaGExX2N0eCkpOworCS8qCisJICogSWYgdGhlIGxlbmd0aCBvZiBLID0gQihCbG9jayBzaXplKTogSzAgPSBLLgorCSAqIElmIHRoZSBsZW5ndGggb2YgSyA+IEI6IGhhc2ggSyB0byBvYnRhaW4gYW4gTCBieXRlIHN0cmluZywKKwkgKiB0aGVuIGFwcGVuZCAoQi1MKSB6ZXJvcyB0byBjcmVhdGUgYSBCLWJ5dGUgc3RyaW5nIEswIChpLmUuLCBLMCA9IEgoSykgfHwgMDAuLi4wMCkuCisJICogSWYgdGhlIGxlbmd0aCBvZiBLIDwgQjogYXBwZW5kIHplcm9zIHRvIHRoZSBlbmQgb2YgSyB0byBjcmVhdGUgYSBCLWJ5dGUgc3RyaW5nIEswCisJICovCisJTmRpc1plcm9NZW1vcnkoSzAsIFNIQTFfQkxPQ0tfU0laRSk7CisJaWYgKEtleUxlbiA8PSBTSEExX0JMT0NLX1NJWkUpCisJCU5kaXNNb3ZlTWVtb3J5KEswLCBLZXksIEtleUxlbik7CisJZWxzZQorCQlSVF9TSEExKEtleSwgS2V5TGVuLCBLMCk7CisJLyogRW5kIG9mIGlmICovCisKKwkvKiBFeGNsdXNpdmUtT3IgSzAgd2l0aCBpcGFkICovCisJLyogaXBhZDogSW5uZXIgcGFkOyB0aGUgYnl0ZSB4wqHCpjM2wqHCpiByZXBlYXRlZCBCIHRpbWVzLiAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNIQTFfQkxPQ0tfU0laRTsgaW5kZXgrKykKKwkJSzBbaW5kZXhdIF49IDB4MzY7CisJLyogRW5kIG9mIGZvciAqLworCisJUlRfU0hBMV9Jbml0KCZzaGFfY3R4MSk7CisJLyogSChLMF5pcGFkKSAqLworCVNIQTFfQXBwZW5kKCZzaGFfY3R4MSwgSzAsIHNpemVvZihLMCkpOworCS8qIEgoKEswXmlwYWQpfHx0ZXh0KSAqLworCVNIQTFfQXBwZW5kKCZzaGFfY3R4MSwgTWVzc2FnZSwgTWVzc2FnZUxlbik7CisJU0hBMV9FbmQoJnNoYV9jdHgxLCBEaWdlc3QpOworCisJLyogRXhjbHVzaXZlLU9yIEswIHdpdGggb3BhZCBhbmQgcmVtb3ZlIGlwYWQgKi8KKwkvKiBvcGFkOiBPdXRlciBwYWQ7IHRoZSBieXRlIHjCocKmNWPCocKmIHJlcGVhdGVkIEIgdGltZXMuICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0hBMV9CTE9DS19TSVpFOyBpbmRleCsrKQorCQlLMFtpbmRleF0gXj0gMHgzNiBeIDB4NWM7CisJLyogRW5kIG9mIGZvciAqLworCisJUlRfU0hBMV9Jbml0KCZzaGFfY3R4Mik7CisJLyogSChLMF5vcGFkKSAqLworCVNIQTFfQXBwZW5kKCZzaGFfY3R4MiwgSzAsIHNpemVvZihLMCkpOworCS8qIEgoIChLMF5vcGFkKSB8fCBIKChLMF5pcGFkKXx8dGV4dCkgKSAqLworCVNIQTFfQXBwZW5kKCZzaGFfY3R4MiwgRGlnZXN0LCBTSEExX0RJR0VTVF9TSVpFKTsKKwlTSEExX0VuZCgmc2hhX2N0eDIsIERpZ2VzdCk7CisKKwlpZiAoTUFDTGVuID4gU0hBMV9ESUdFU1RfU0laRSkKKwkJTmRpc01vdmVNZW1vcnkoTUFDLCBEaWdlc3QsIFNIQTFfRElHRVNUX1NJWkUpOworCWVsc2UKKwkJTmRpc01vdmVNZW1vcnkoTUFDLCBEaWdlc3QsIE1BQ0xlbik7Cit9CQkJCS8qIEVuZCBvZiBITUFDX1NIQTEgKi8KKyNlbmRpZiAvKiBITUFDX1NIQTFfU1VQUE9SVCAqLworCisjaWZkZWYgSE1BQ19NRDVfU1VQUE9SVAorLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBITUFDIHVzaW5nIE1ENSBoYXNoIGZ1bmN0aW9uCisKK0FyZ3VtZW50czoKKyAgICBrZXkgICAgICAgICAgICAgU2VjcmV0IGtleQorICAgIGtleV9sZW4gICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBrZXkgaW4gYnl0ZXMKKyAgICBtZXNzYWdlICAgICAgICAgTWVzc2FnZSBjb250ZXh0CisgICAgbWVzc2FnZV9sZW4gICAgIFRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiBieXRlcworICAgIG1hY0xlbiAgICAgICAgICBSZXF1ZXN0IHRoZSBsZW5ndGggb2YgbWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlCisKK1JldHVybiBWYWx1ZToKKyAgICBtYWMgICAgICAgICAgICAgTWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlCisKK05vdGU6CisgICAgTm9uZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBITUFDX01ENShJTiBjb25zdCB1OCBLZXlbXSwKKwkgICAgICB1MzIgS2V5TGVuLAorCSAgICAgIElOIGNvbnN0IHU4IE1lc3NhZ2VbXSwKKwkgICAgICB1MzIgTWVzc2FnZUxlbiwgdTggTUFDW10sIHUzMiBNQUNMZW4pCit7CisJc3RydWN0IHJ0X21kNV9jdHhfc3RydWMgbWQ1X2N0eDE7CisJc3RydWN0IHJ0X21kNV9jdHhfc3RydWMgbWQ1X2N0eDI7CisJdTggSzBbTUQ1X0JMT0NLX1NJWkVdOworCXU4IERpZ2VzdFtNRDVfRElHRVNUX1NJWkVdOworCXUzMiBpbmRleDsKKworCU5kaXNaZXJvTWVtb3J5KCZtZDVfY3R4MSwgc2l6ZW9mKHN0cnVjdCBydF9tZDVfY3R4X3N0cnVjKSk7CisJTmRpc1plcm9NZW1vcnkoJm1kNV9jdHgyLCBzaXplb2Yoc3RydWN0IHJ0X21kNV9jdHhfc3RydWMpKTsKKwkvKgorCSAqIElmIHRoZSBsZW5ndGggb2YgSyA9IEIoQmxvY2sgc2l6ZSk6IEswID0gSy4KKwkgKiBJZiB0aGUgbGVuZ3RoIG9mIEsgPiBCOiBoYXNoIEsgdG8gb2J0YWluIGFuIEwgYnl0ZSBzdHJpbmcsCisJICogdGhlbiBhcHBlbmQgKEItTCkgemVyb3MgdG8gY3JlYXRlIGEgQi1ieXRlIHN0cmluZyBLMCAoaS5lLiwgSzAgPSBIKEspIHx8IDAwLi4uMDApLgorCSAqIElmIHRoZSBsZW5ndGggb2YgSyA8IEI6IGFwcGVuZCB6ZXJvcyB0byB0aGUgZW5kIG9mIEsgdG8gY3JlYXRlIGEgQi1ieXRlIHN0cmluZyBLMAorCSAqLworCU5kaXNaZXJvTWVtb3J5KEswLCBNRDVfQkxPQ0tfU0laRSk7CisJaWYgKEtleUxlbiA8PSBNRDVfQkxPQ0tfU0laRSkgeworCQlOZGlzTW92ZU1lbW9yeShLMCwgS2V5LCBLZXlMZW4pOworCX0gZWxzZSB7CisJCVJUX01ENShLZXksIEtleUxlbiwgSzApOworCX0KKworCS8qIEV4Y2x1c2l2ZS1PciBLMCB3aXRoIGlwYWQgKi8KKwkvKiBpcGFkOiBJbm5lciBwYWQ7IHRoZSBieXRlIHjCocKmMzbCocKmIHJlcGVhdGVkIEIgdGltZXMuICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUQ1X0JMT0NLX1NJWkU7IGluZGV4KyspCisJCUswW2luZGV4XSBePSAweDM2OworCS8qIEVuZCBvZiBmb3IgKi8KKworCU1ENV9Jbml0KCZtZDVfY3R4MSk7CisJLyogSChLMF5pcGFkKSAqLworCU1ENV9BcHBlbmQoJm1kNV9jdHgxLCBLMCwgc2l6ZW9mKEswKSk7CisJLyogSCgoSzBeaXBhZCl8fHRleHQpICovCisJTUQ1X0FwcGVuZCgmbWQ1X2N0eDEsIE1lc3NhZ2UsIE1lc3NhZ2VMZW4pOworCU1ENV9FbmQoJm1kNV9jdHgxLCBEaWdlc3QpOworCisJLyogRXhjbHVzaXZlLU9yIEswIHdpdGggb3BhZCBhbmQgcmVtb3ZlIGlwYWQgKi8KKwkvKiBvcGFkOiBPdXRlciBwYWQ7IHRoZSBieXRlIHjCocKmNWPCocKmIHJlcGVhdGVkIEIgdGltZXMuICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUQ1X0JMT0NLX1NJWkU7IGluZGV4KyspCisJCUswW2luZGV4XSBePSAweDM2IF4gMHg1YzsKKwkvKiBFbmQgb2YgZm9yICovCisKKwlNRDVfSW5pdCgmbWQ1X2N0eDIpOworCS8qIEgoSzBeb3BhZCkgKi8KKwlNRDVfQXBwZW5kKCZtZDVfY3R4MiwgSzAsIHNpemVvZihLMCkpOworCS8qIEgoIChLMF5vcGFkKSB8fCBIKChLMF5pcGFkKXx8dGV4dCkgKSAqLworCU1ENV9BcHBlbmQoJm1kNV9jdHgyLCBEaWdlc3QsIE1ENV9ESUdFU1RfU0laRSk7CisJTUQ1X0VuZCgmbWQ1X2N0eDIsIERpZ2VzdCk7CisKKwlpZiAoTUFDTGVuID4gTUQ1X0RJR0VTVF9TSVpFKQorCQlOZGlzTW92ZU1lbW9yeShNQUMsIERpZ2VzdCwgTUQ1X0RJR0VTVF9TSVpFKTsKKwllbHNlCisJCU5kaXNNb3ZlTWVtb3J5KE1BQywgRGlnZXN0LCBNQUNMZW4pOworfQkJCQkvKiBFbmQgb2YgSE1BQ19TSEEyNTYgKi8KKyNlbmRpZiAvKiBITUFDX01ENV9TVVBQT1JUICovCisKKy8qIEVuZCBvZiBjcnlwdF9obWFjLmMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NyeXB0X21kNS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY3J5cHRfbWQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRlYWI2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NyeXB0X21kNS5jCkBAIC0wLDAgKzEsMzM5IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9jcnlwdF9tZDUuaCIKKworI2lmZGVmIE1ENV9TVVBQT1JUCisvKgorICogRiwgRywgSCBhbmQgSSBhcmUgYmFzaWMgTUQ1IGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZSBGKHgsIHksIHopICgoKHgpICYgKHkpKSB8ICgofngpICYgKHopKSkKKyNkZWZpbmUgRyh4LCB5LCB6KSAoKCh4KSAmICh6KSkgfCAoKHkpICYgKH56KSkpCisjZGVmaW5lIEgoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKKyNkZWZpbmUgSSh4LCB5LCB6KSAoKHkpIF4gKCh4KSB8ICh+eikpKQorCisjZGVmaW5lIFJPVEwoeCxuLHcpICgoeCA8PCBuKSB8ICh4ID4+ICh3IC0gbikpKQorI2RlZmluZSBST1RMMzIoeCxuKSBST1RMKHgsbiwzMikJLyogMzIgYml0cyB3b3JkICovCisKKyNkZWZpbmUgUk9VTkQxKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7ICAgICAgICAgIFwKKyAgICAoYSkgKz0gRigoYiksKGMpLChkKSkgKyAoeCkgKyAodTMyKShhYyk7IFwKKyAgICAoYSkgID0gUk9UTDMyKChhKSwocykpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYSkgKz0gKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgUk9VTkQyKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7ICAgICAgICAgIFwKKyAgICAoYSkgKz0gRygoYiksKGMpLChkKSkgKyAoeCkgKyAodTMyKShhYyk7IFwKKyAgICAoYSkgID0gUk9UTDMyKChhKSwocykpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYSkgKz0gKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgUk9VTkQzKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7ICAgICAgICAgIFwKKyAgICAoYSkgKz0gSCgoYiksKGMpLChkKSkgKyAoeCkgKyAodTMyKShhYyk7IFwKKyAgICAoYSkgID0gUk9UTDMyKChhKSwocykpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYSkgKz0gKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgUk9VTkQ0KGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7ICAgICAgICAgIFwKKyAgICAoYSkgKz0gSSgoYiksKGMpLChkKSkgKyAoeCkgKyAodTMyKShhYyk7IFwKKyAgICAoYSkgID0gUk9UTDMyKChhKSwocykpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYSkgKz0gKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KK3N0YXRpYyBjb25zdCB1MzIgTUQ1X0RlZmF1bHRIYXNoVmFsdWVbNF0gPSB7CisJMHg2NzQ1MjMwMVVMLCAweGVmY2RhYjg5VUwsIDB4OThiYWRjZmVVTCwgMHgxMDMyNTQ3NlVMCit9OworI2VuZGlmIC8qIE1ENV9TVVBQT1JUICovCisKKyNpZmRlZiBNRDVfU1VQUE9SVAorLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBJbml0aWFsIE1kNV9DVFhfU1RSVUMKKworQXJndW1lbnRzOgorICAgIHBNRDVfQ1RYICAgICAgICBQb2ludGVyIHRvIE1kNV9DVFhfU1RSVUMKKworUmV0dXJuIFZhbHVlOgorICAgIE5vbmUKKworTm90ZToKKyAgICBOb25lCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIE1ENV9Jbml0KHN0cnVjdCBydF9tZDVfY3R4X3N0cnVjICpwTUQ1X0NUWCkKK3sKKwlOZGlzTW92ZU1lbW9yeShwTUQ1X0NUWC0+SGFzaFZhbHVlLCBNRDVfRGVmYXVsdEhhc2hWYWx1ZSwKKwkJICAgICAgIHNpemVvZihNRDVfRGVmYXVsdEhhc2hWYWx1ZSkpOworCU5kaXNaZXJvTWVtb3J5KHBNRDVfQ1RYLT5CbG9jaywgTUQ1X0JMT0NLX1NJWkUpOworCXBNRDVfQ1RYLT5CbG9ja0xlbiA9IDA7CisJcE1ENV9DVFgtPk1lc3NhZ2VMZW4gPSAwOworfQkJCQkvKiBFbmQgb2YgTUQ1X0luaXQgKi8KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBNRDUgY29tcHV0YXRpb24gZm9yIG9uZSBibG9jayAoNTEyIGJpdHMpCisKK0FyZ3VtZW50czoKKyAgICBwTUQ1X0NUWCAgICAgICAgUG9pbnRlciB0byBNZDVfQ1RYX1NUUlVDCisKK1JldHVybiBWYWx1ZToKKyAgICBOb25lCisKK05vdGU6CisgICAgVFtpXSA6PSBmbG9vcihhYnMoc2luKGkgKyAxKSkgKiAoMiBwb3cgMzIpKSwgaSBpcyBudW1iZXIgb2Ygcm91bmQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgTUQ1X0hhc2goc3RydWN0IHJ0X21kNV9jdHhfc3RydWMgKnBNRDVfQ1RYKQoreworCXUzMiBYX2k7CisJdTMyIFhbMTZdOworCXUzMiBhLCBiLCBjLCBkOworCisJLyogUHJlcGFyZSB0aGUgbWVzc2FnZSBzY2hlZHVsZSwge1hfaX0gKi8KKwlOZGlzTW92ZU1lbW9yeShYLCBwTUQ1X0NUWC0+QmxvY2ssIE1ENV9CTE9DS19TSVpFKTsKKwlmb3IgKFhfaSA9IDA7IFhfaSA8IDE2OyBYX2krKykKKwkJWFtYX2ldID0gY3B1MmxlMzIoWFtYX2ldKTsJLyogRW5kaWFuIFN3YXAgKi8KKwkvKiBFbmQgb2YgZm9yICovCisKKwkvKiBNRDUgaGFzaCBjb21wdXRhdGlvbiAqLworCS8qIEluaXRpYWxpemUgdGhlIHdvcmtpbmcgdmFyaWFibGVzICovCisJYSA9IHBNRDVfQ1RYLT5IYXNoVmFsdWVbMF07CisJYiA9IHBNRDVfQ1RYLT5IYXNoVmFsdWVbMV07CisJYyA9IHBNRDVfQ1RYLT5IYXNoVmFsdWVbMl07CisJZCA9IHBNRDVfQ1RYLT5IYXNoVmFsdWVbM107CisKKwkvKgorCSAqICBSb3VuZCAxCisJICogIExldCBbYWJjZCBrIHMgaV0gZGVub3RlIHRoZSBvcGVyYXRpb24KKwkgKiAgYSA9IGIgKyAoKGEgKyBGKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykKKwkgKi8KKwlST1VORDEoYSwgYiwgYywgZCwgWFswXSwgNywgMHhkNzZhYTQ3OCk7CS8qIDEgKi8KKwlST1VORDEoZCwgYSwgYiwgYywgWFsxXSwgMTIsIDB4ZThjN2I3NTYpOwkvKiAyICovCisJUk9VTkQxKGMsIGQsIGEsIGIsIFhbMl0sIDE3LCAweDI0MjA3MGRiKTsJLyogMyAqLworCVJPVU5EMShiLCBjLCBkLCBhLCBYWzNdLCAyMiwgMHhjMWJkY2VlZSk7CS8qIDQgKi8KKwlST1VORDEoYSwgYiwgYywgZCwgWFs0XSwgNywgMHhmNTdjMGZhZik7CS8qIDUgKi8KKwlST1VORDEoZCwgYSwgYiwgYywgWFs1XSwgMTIsIDB4NDc4N2M2MmEpOwkvKiA2ICovCisJUk9VTkQxKGMsIGQsIGEsIGIsIFhbNl0sIDE3LCAweGE4MzA0NjEzKTsJLyogNyAqLworCVJPVU5EMShiLCBjLCBkLCBhLCBYWzddLCAyMiwgMHhmZDQ2OTUwMSk7CS8qIDggKi8KKwlST1VORDEoYSwgYiwgYywgZCwgWFs4XSwgNywgMHg2OTgwOThkOCk7CS8qIDkgKi8KKwlST1VORDEoZCwgYSwgYiwgYywgWFs5XSwgMTIsIDB4OGI0NGY3YWYpOwkvKiAxMCAqLworCVJPVU5EMShjLCBkLCBhLCBiLCBYWzEwXSwgMTcsIDB4ZmZmZjViYjEpOwkvKiAxMSAqLworCVJPVU5EMShiLCBjLCBkLCBhLCBYWzExXSwgMjIsIDB4ODk1Y2Q3YmUpOwkvKiAxMiAqLworCVJPVU5EMShhLCBiLCBjLCBkLCBYWzEyXSwgNywgMHg2YjkwMTEyMik7CS8qIDEzICovCisJUk9VTkQxKGQsIGEsIGIsIGMsIFhbMTNdLCAxMiwgMHhmZDk4NzE5Myk7CS8qIDE0ICovCisJUk9VTkQxKGMsIGQsIGEsIGIsIFhbMTRdLCAxNywgMHhhNjc5NDM4ZSk7CS8qIDE1ICovCisJUk9VTkQxKGIsIGMsIGQsIGEsIFhbMTVdLCAyMiwgMHg0OWI0MDgyMSk7CS8qIDE2ICovCisKKwkvKgorCSAqICBSb3VuZCAyCisJICogIExldCBbYWJjZCBrIHMgaV0gZGVub3RlIHRoZSBvcGVyYXRpb24KKwkgKiAgYSA9IGIgKyAoKGEgKyBHKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykKKwkgKi8KKwlST1VORDIoYSwgYiwgYywgZCwgWFsxXSwgNSwgMHhmNjFlMjU2Mik7CS8qIDE3ICovCisJUk9VTkQyKGQsIGEsIGIsIGMsIFhbNl0sIDksIDB4YzA0MGIzNDApOwkvKiAxOCAqLworCVJPVU5EMihjLCBkLCBhLCBiLCBYWzExXSwgMTQsIDB4MjY1ZTVhNTEpOwkvKiAxOSAqLworCVJPVU5EMihiLCBjLCBkLCBhLCBYWzBdLCAyMCwgMHhlOWI2YzdhYSk7CS8qIDIwICovCisJUk9VTkQyKGEsIGIsIGMsIGQsIFhbNV0sIDUsIDB4ZDYyZjEwNWQpOwkvKiAyMSAqLworCVJPVU5EMihkLCBhLCBiLCBjLCBYWzEwXSwgOSwgMHgyNDQxNDUzKTsJLyogMjIgKi8KKwlST1VORDIoYywgZCwgYSwgYiwgWFsxNV0sIDE0LCAweGQ4YTFlNjgxKTsJLyogMjMgKi8KKwlST1VORDIoYiwgYywgZCwgYSwgWFs0XSwgMjAsIDB4ZTdkM2ZiYzgpOwkvKiAyNCAqLworCVJPVU5EMihhLCBiLCBjLCBkLCBYWzldLCA1LCAweDIxZTFjZGU2KTsJLyogMjUgKi8KKwlST1VORDIoZCwgYSwgYiwgYywgWFsxNF0sIDksIDB4YzMzNzA3ZDYpOwkvKiAyNiAqLworCVJPVU5EMihjLCBkLCBhLCBiLCBYWzNdLCAxNCwgMHhmNGQ1MGQ4Nyk7CS8qIDI3ICovCisJUk9VTkQyKGIsIGMsIGQsIGEsIFhbOF0sIDIwLCAweDQ1NWExNGVkKTsJLyogMjggKi8KKwlST1VORDIoYSwgYiwgYywgZCwgWFsxM10sIDUsIDB4YTllM2U5MDUpOwkvKiAyOSAqLworCVJPVU5EMihkLCBhLCBiLCBjLCBYWzJdLCA5LCAweGZjZWZhM2Y4KTsJLyogMzAgKi8KKwlST1VORDIoYywgZCwgYSwgYiwgWFs3XSwgMTQsIDB4Njc2ZjAyZDkpOwkvKiAzMSAqLworCVJPVU5EMihiLCBjLCBkLCBhLCBYWzEyXSwgMjAsIDB4OGQyYTRjOGEpOwkvKiAzMiAqLworCisJLyoKKwkgKiAgUm91bmQgMworCSAqICBMZXQgW2FiY2QgayBzIHRdIGRlbm90ZSB0aGUgb3BlcmF0aW9uCisJICogIGEgPSBiICsgKChhICsgSChiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpCisJICovCisJUk9VTkQzKGEsIGIsIGMsIGQsIFhbNV0sIDQsIDB4ZmZmYTM5NDIpOwkvKiAzMyAqLworCVJPVU5EMyhkLCBhLCBiLCBjLCBYWzhdLCAxMSwgMHg4NzcxZjY4MSk7CS8qIDM0ICovCisJUk9VTkQzKGMsIGQsIGEsIGIsIFhbMTFdLCAxNiwgMHg2ZDlkNjEyMik7CS8qIDM1ICovCisJUk9VTkQzKGIsIGMsIGQsIGEsIFhbMTRdLCAyMywgMHhmZGU1MzgwYyk7CS8qIDM2ICovCisJUk9VTkQzKGEsIGIsIGMsIGQsIFhbMV0sIDQsIDB4YTRiZWVhNDQpOwkvKiAzNyAqLworCVJPVU5EMyhkLCBhLCBiLCBjLCBYWzRdLCAxMSwgMHg0YmRlY2ZhOSk7CS8qIDM4ICovCisJUk9VTkQzKGMsIGQsIGEsIGIsIFhbN10sIDE2LCAweGY2YmI0YjYwKTsJLyogMzkgKi8KKwlST1VORDMoYiwgYywgZCwgYSwgWFsxMF0sIDIzLCAweGJlYmZiYzcwKTsJLyogNDAgKi8KKwlST1VORDMoYSwgYiwgYywgZCwgWFsxM10sIDQsIDB4Mjg5YjdlYzYpOwkvKiA0MSAqLworCVJPVU5EMyhkLCBhLCBiLCBjLCBYWzBdLCAxMSwgMHhlYWExMjdmYSk7CS8qIDQyICovCisJUk9VTkQzKGMsIGQsIGEsIGIsIFhbM10sIDE2LCAweGQ0ZWYzMDg1KTsJLyogNDMgKi8KKwlST1VORDMoYiwgYywgZCwgYSwgWFs2XSwgMjMsIDB4NDg4MWQwNSk7CS8qIDQ0ICovCisJUk9VTkQzKGEsIGIsIGMsIGQsIFhbOV0sIDQsIDB4ZDlkNGQwMzkpOwkvKiA0NSAqLworCVJPVU5EMyhkLCBhLCBiLCBjLCBYWzEyXSwgMTEsIDB4ZTZkYjk5ZTUpOwkvKiA0NiAqLworCVJPVU5EMyhjLCBkLCBhLCBiLCBYWzE1XSwgMTYsIDB4MWZhMjdjZjgpOwkvKiA0NyAqLworCVJPVU5EMyhiLCBjLCBkLCBhLCBYWzJdLCAyMywgMHhjNGFjNTY2NSk7CS8qIDQ4ICovCisKKwkvKgorCSAqICBSb3VuZCA0CisJICogIExldCBbYWJjZCBrIHMgdF0gZGVub3RlIHRoZSBvcGVyYXRpb24KKwkgKiAgYSA9IGIgKyAoKGEgKyBJKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykKKwkgKi8KKwlST1VORDQoYSwgYiwgYywgZCwgWFswXSwgNiwgMHhmNDI5MjI0NCk7CS8qIDQ5ICovCisJUk9VTkQ0KGQsIGEsIGIsIGMsIFhbN10sIDEwLCAweDQzMmFmZjk3KTsJLyogNTAgKi8KKwlST1VORDQoYywgZCwgYSwgYiwgWFsxNF0sIDE1LCAweGFiOTQyM2E3KTsJLyogNTEgKi8KKwlST1VORDQoYiwgYywgZCwgYSwgWFs1XSwgMjEsIDB4ZmM5M2EwMzkpOwkvKiA1MiAqLworCVJPVU5ENChhLCBiLCBjLCBkLCBYWzEyXSwgNiwgMHg2NTViNTljMyk7CS8qIDUzICovCisJUk9VTkQ0KGQsIGEsIGIsIGMsIFhbM10sIDEwLCAweDhmMGNjYzkyKTsJLyogNTQgKi8KKwlST1VORDQoYywgZCwgYSwgYiwgWFsxMF0sIDE1LCAweGZmZWZmNDdkKTsJLyogNTUgKi8KKwlST1VORDQoYiwgYywgZCwgYSwgWFsxXSwgMjEsIDB4ODU4NDVkZDEpOwkvKiA1NiAqLworCVJPVU5ENChhLCBiLCBjLCBkLCBYWzhdLCA2LCAweDZmYTg3ZTRmKTsJLyogNTcgKi8KKwlST1VORDQoZCwgYSwgYiwgYywgWFsxNV0sIDEwLCAweGZlMmNlNmUwKTsJLyogNTggKi8KKwlST1VORDQoYywgZCwgYSwgYiwgWFs2XSwgMTUsIDB4YTMwMTQzMTQpOwkvKiA1OSAqLworCVJPVU5ENChiLCBjLCBkLCBhLCBYWzEzXSwgMjEsIDB4NGUwODExYTEpOwkvKiA2MCAqLworCVJPVU5ENChhLCBiLCBjLCBkLCBYWzRdLCA2LCAweGY3NTM3ZTgyKTsJLyogNjEgKi8KKwlST1VORDQoZCwgYSwgYiwgYywgWFsxMV0sIDEwLCAweGJkM2FmMjM1KTsJLyogNjIgKi8KKwlST1VORDQoYywgZCwgYSwgYiwgWFsyXSwgMTUsIDB4MmFkN2QyYmIpOwkvKiA2MyAqLworCVJPVU5ENChiLCBjLCBkLCBhLCBYWzldLCAyMSwgMHhlYjg2ZDM5MSk7CS8qIDY0ICovCisKKwkvKiBDb21wdXRlIHRoZSBpXnRoIGludGVybWVkaWF0ZSBoYXNoIHZhbHVlIEheKGkpICovCisJcE1ENV9DVFgtPkhhc2hWYWx1ZVswXSArPSBhOworCXBNRDVfQ1RYLT5IYXNoVmFsdWVbMV0gKz0gYjsKKwlwTUQ1X0NUWC0+SGFzaFZhbHVlWzJdICs9IGM7CisJcE1ENV9DVFgtPkhhc2hWYWx1ZVszXSArPSBkOworCisJTmRpc1plcm9NZW1vcnkocE1ENV9DVFgtPkJsb2NrLCBNRDVfQkxPQ0tfU0laRSk7CisJcE1ENV9DVFgtPkJsb2NrTGVuID0gMDsKK30JCQkJLyogRW5kIG9mIE1ENV9IYXNoICovCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgVGhlIG1lc3NhZ2UgaXMgYXBwZW5kZWQgdG8gYmxvY2suIElmIGJsb2NrIHNpemUgPiA2NCBieXRlcywgdGhlIE1ENV9IYXNoCit3aWxsIGJlIGNhbGxlZC4KKworQXJndW1lbnRzOgorICAgIHBNRDVfQ1RYICAgICAgICBQb2ludGVyIHRvIHN0cnVjdCBydF9tZDVfY3R4X3N0cnVjCisgICAgbWVzc2FnZSAgICAgICAgIE1lc3NhZ2UgY29udGV4dAorICAgIG1lc3NhZ2VMZW4gICAgICBUaGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gYnl0ZXMKKworUmV0dXJuIFZhbHVlOgorICAgIE5vbmUKKworTm90ZToKKyAgICBOb25lCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIE1ENV9BcHBlbmQoc3RydWN0IHJ0X21kNV9jdHhfc3RydWMgKnBNRDVfQ1RYLAorCQlJTiBjb25zdCB1OCBNZXNzYWdlW10sIHUzMiBNZXNzYWdlTGVuKQoreworCXUzMiBhcHBlbmRMZW4gPSAwOworCXUzMiBkaWZmTGVuID0gMDsKKworCXdoaWxlIChhcHBlbmRMZW4gIT0gTWVzc2FnZUxlbikgeworCQlkaWZmTGVuID0gTWVzc2FnZUxlbiAtIGFwcGVuZExlbjsKKwkJaWYgKChwTUQ1X0NUWC0+QmxvY2tMZW4gKyBkaWZmTGVuKSA8IE1ENV9CTE9DS19TSVpFKSB7CisJCQlOZGlzTW92ZU1lbW9yeShwTUQ1X0NUWC0+QmxvY2sgKyBwTUQ1X0NUWC0+QmxvY2tMZW4sCisJCQkJICAgICAgIE1lc3NhZ2UgKyBhcHBlbmRMZW4sIGRpZmZMZW4pOworCQkJcE1ENV9DVFgtPkJsb2NrTGVuICs9IGRpZmZMZW47CisJCQlhcHBlbmRMZW4gKz0gZGlmZkxlbjsKKwkJfSBlbHNlIHsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBNRDVfQ1RYLT5CbG9jayArIHBNRDVfQ1RYLT5CbG9ja0xlbiwKKwkJCQkgICAgICAgTWVzc2FnZSArIGFwcGVuZExlbiwKKwkJCQkgICAgICAgTUQ1X0JMT0NLX1NJWkUgLSBwTUQ1X0NUWC0+QmxvY2tMZW4pOworCQkJYXBwZW5kTGVuICs9IChNRDVfQkxPQ0tfU0laRSAtIHBNRDVfQ1RYLT5CbG9ja0xlbik7CisJCQlwTUQ1X0NUWC0+QmxvY2tMZW4gPSBNRDVfQkxPQ0tfU0laRTsKKwkJCU1ENV9IYXNoKHBNRDVfQ1RYKTsKKwkJfQkJLyogRW5kIG9mIGlmICovCisJfQkJCS8qIEVuZCBvZiB3aGlsZSAqLworCXBNRDVfQ1RYLT5NZXNzYWdlTGVuICs9IE1lc3NhZ2VMZW47Cit9CQkJCS8qIEVuZCBvZiBNRDVfQXBwZW5kICovCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgMS4gQXBwZW5kIGJpdCAxIHRvIGVuZCBvZiB0aGUgbWVzc2FnZQorICAgIDIuIEFwcGVuZCB0aGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gcmlnaHRtb3N0IDY0IGJpdHMKKyAgICAzLiBUcmFuc2Zvcm0gdGhlIEhhc2ggVmFsdWUgdG8gZGlnZXN0IG1lc3NhZ2UKKworQXJndW1lbnRzOgorICAgIHBNRDVfQ1RYICAgICAgICBQb2ludGVyIHRvIHN0cnVjdCBydF9tZDVfY3R4X3N0cnVjCisKK1JldHVybiBWYWx1ZToKKyAgICBkaWdlc3RNZXNzYWdlICAgRGlnZXN0IG1lc3NhZ2UKKworTm90ZToKKyAgICBOb25lCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIE1ENV9FbmQoc3RydWN0IHJ0X21kNV9jdHhfc3RydWMgKnBNRDVfQ1RYLCB1OCBEaWdlc3RNZXNzYWdlW10pCit7CisJdTMyIGluZGV4OworCXU2NCBtZXNzYWdlX2xlbmd0aF9iaXRzOworCisJLyogYXBwZW5kIDEgYml0cyB0byBlbmQgb2YgdGhlIG1lc3NhZ2UgKi8KKwlOZGlzRmlsbE1lbW9yeShwTUQ1X0NUWC0+QmxvY2sgKyBwTUQ1X0NUWC0+QmxvY2tMZW4sIDEsIDB4ODApOworCisJLyogNTUgPSA2NCAtIDggLSAxOiBhcHBlbmQgMSBiaXQoMSBieXRlKSBhbmQgbWVzc2FnZSBsZW5ndGggKDggYnl0ZXMpICovCisJaWYgKHBNRDVfQ1RYLT5CbG9ja0xlbiA+IDU1KQorCQlNRDVfSGFzaChwTUQ1X0NUWCk7CisJLyogRW5kIG9mIGlmICovCisKKwkvKiBBcHBlbmQgdGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIHJpZ2h0bW9zdCA2NCBiaXRzICovCisJbWVzc2FnZV9sZW5ndGhfYml0cyA9IHBNRDVfQ1RYLT5NZXNzYWdlTGVuICogODsKKwltZXNzYWdlX2xlbmd0aF9iaXRzID0gY3B1MmxlNjQobWVzc2FnZV9sZW5ndGhfYml0cyk7CisJTmRpc01vdmVNZW1vcnkoJnBNRDVfQ1RYLT5CbG9ja1s1Nl0sICZtZXNzYWdlX2xlbmd0aF9iaXRzLCA4KTsKKwlNRDVfSGFzaChwTUQ1X0NUWCk7CisKKwkvKiBSZXR1cm4gbWVzc2FnZSBkaWdlc3QsIHRyYW5zZm9ybSB0aGUgdTMyIGhhc2ggdmFsdWUgdG8gYnl0ZXMgKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA0OyBpbmRleCsrKQorCQlwTUQ1X0NUWC0+SGFzaFZhbHVlW2luZGV4XSA9CisJCSAgICBjcHUybGUzMihwTUQ1X0NUWC0+SGFzaFZhbHVlW2luZGV4XSk7CisJLyogRW5kIG9mIGZvciAqLworCU5kaXNNb3ZlTWVtb3J5KERpZ2VzdE1lc3NhZ2UsIHBNRDVfQ1RYLT5IYXNoVmFsdWUsIE1ENV9ESUdFU1RfU0laRSk7Cit9CQkJCS8qIEVuZCBvZiBNRDVfRW5kICovCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgTUQ1IGFsZ29yaXRobQorCitBcmd1bWVudHM6CisgICAgbWVzc2FnZSAgICAgICAgIE1lc3NhZ2UgY29udGV4dAorICAgIG1lc3NhZ2VMZW4gICAgICBUaGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gYnl0ZXMKKworUmV0dXJuIFZhbHVlOgorICAgIGRpZ2VzdE1lc3NhZ2UgICBEaWdlc3QgbWVzc2FnZQorCitOb3RlOgorICAgIE5vbmUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRfTUQ1KElOIGNvbnN0IHU4IE1lc3NhZ2VbXSwKKwkgICAgdTMyIE1lc3NhZ2VMZW4sIHU4IERpZ2VzdE1lc3NhZ2VbXSkKK3sKKwlzdHJ1Y3QgcnRfbWQ1X2N0eF9zdHJ1YyBtZDVfY3R4OworCisJTmRpc1plcm9NZW1vcnkoJm1kNV9jdHgsIHNpemVvZihzdHJ1Y3QgcnRfbWQ1X2N0eF9zdHJ1YykpOworCU1ENV9Jbml0KCZtZDVfY3R4KTsKKwlNRDVfQXBwZW5kKCZtZDVfY3R4LCBNZXNzYWdlLCBNZXNzYWdlTGVuKTsKKwlNRDVfRW5kKCZtZDVfY3R4LCBEaWdlc3RNZXNzYWdlKTsKK30JCQkJLyogRW5kIG9mIFJUX01ENSAqLworCisjZW5kaWYgLyogTUQ1X1NVUFBPUlQgKi8KKworLyogRW5kIG9mIGNyeXB0X21kNS5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jcnlwdF9zaGEyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jcnlwdF9zaGEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4M2ZiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NyeXB0X3NoYTIuYwpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vY3J5cHRfc2hhMi5oIgorCisvKiBCYXNpYyBvcGVyYXRpb25zICovCisjZGVmaW5lIFNIUih4LG4pICh4ID4+IG4pCS8qIFNIUih4KV5uLCByaWdodCBzaGlmdCBuIGJpdHMgLCB4IGlzIHctYml0IHdvcmQsIDAgPD0gbiA8PSB3ICovCisjZGVmaW5lIFJPVFIoeCxuLHcpICgoeCA+PiBuKSB8ICh4IDw8ICh3IC0gbikpKQkvKiBST1RSKHgpXm4sIGNpcmN1bGFyIHJpZ2h0IHNoaWZ0IG4gYml0cyAsIHggaXMgdy1iaXQgd29yZCwgMCA8PSBuIDw9IHcgKi8KKyNkZWZpbmUgUk9UTCh4LG4sdykgKCh4IDw8IG4pIHwgKHggPj4gKHcgLSBuKSkpCS8qIFJPVEwoeClebiwgY2lyY3VsYXIgbGVmdCBzaGlmdCBuIGJpdHMgLCB4IGlzIHctYml0IHdvcmQsIDAgPD0gbiA8PSB3ICovCisjZGVmaW5lIFJPVFIzMih4LG4pIFJPVFIoeCxuLDMyKQkvKiAzMiBiaXRzIHdvcmQgKi8KKyNkZWZpbmUgUk9UTDMyKHgsbikgUk9UTCh4LG4sMzIpCS8qIDMyIGJpdHMgd29yZCAqLworCisvKiBCYXNpYyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgQ2goeCx5LHopICgoeCAmIHkpIF4gKCh+eCkgJiB6KSkKKyNkZWZpbmUgTWFqKHgseSx6KSAoKHggJiB5KSBeICh4ICYgeikgXiAoeSAmIHopKQorI2RlZmluZSBQYXJpdHkoeCx5LHopICh4IF4geSBeIHopCisKKyNpZmRlZiBTSEExX1NVUFBPUlQKKy8qIFNIQTEgY29uc3RhbnRzICovCisjZGVmaW5lIFNIQTFfTUFTSyAweDAwMDAwMDBmCitzdGF0aWMgY29uc3QgdTMyIFNIQTFfS1s0XSA9IHsKKwkweDVhODI3OTk5VUwsIDB4NmVkOWViYTFVTCwgMHg4ZjFiYmNkY1VMLCAweGNhNjJjMWQ2VUwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgU0hBMV9EZWZhdWx0SGFzaFZhbHVlWzVdID0geworCTB4Njc0NTIzMDFVTCwgMHhlZmNkYWI4OVVMLCAweDk4YmFkY2ZlVUwsIDB4MTAzMjU0NzZVTCwgMHhjM2QyZTFmMFVMCit9OworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEluaXRpYWwgc3RydWN0IHJ0X3NoYTFfY3R4CisKK0FyZ3VtZW50czoKKyAgICBwU0hBX0NUWCAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3QgcnRfc2hhMV9jdHgKKworUmV0dXJuIFZhbHVlOgorICAgIE5vbmUKKworTm90ZToKKyAgICBOb25lCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUX1NIQTFfSW5pdChzdHJ1Y3QgcnRfc2hhMV9jdHggKnBTSEFfQ1RYKQoreworCU5kaXNNb3ZlTWVtb3J5KHBTSEFfQ1RYLT5IYXNoVmFsdWUsIFNIQTFfRGVmYXVsdEhhc2hWYWx1ZSwKKwkJICAgICAgIHNpemVvZihTSEExX0RlZmF1bHRIYXNoVmFsdWUpKTsKKwlOZGlzWmVyb01lbW9yeShwU0hBX0NUWC0+QmxvY2ssIFNIQTFfQkxPQ0tfU0laRSk7CisJcFNIQV9DVFgtPk1lc3NhZ2VMZW4gPSAwOworCXBTSEFfQ1RYLT5CbG9ja0xlbiA9IDA7Cit9CQkJCS8qIEVuZCBvZiBSVF9TSEExX0luaXQgKi8KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBTSEExIGNvbXB1dGF0aW9uIGZvciBvbmUgYmxvY2sgKDUxMiBiaXRzKQorCitBcmd1bWVudHM6CisgICAgcFNIQV9DVFggICAgICAgIFBvaW50ZXIgdG8gc3RydWN0IHJ0X3NoYTFfY3R4CisKK1JldHVybiBWYWx1ZToKKyAgICBOb25lCisKK05vdGU6CisgICAgTm9uZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBTSEExX0hhc2goc3RydWN0IHJ0X3NoYTFfY3R4ICpwU0hBX0NUWCkKK3sKKwl1MzIgV19pLCB0LCBzOworCXUzMiBXWzE2XTsKKwl1MzIgYSwgYiwgYywgZCwgZSwgVCwgZl90ID0gMDsKKworCS8qIFByZXBhcmUgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUsIHtXX2l9LCAwIDwgdCA8IDE1ICovCisJTmRpc01vdmVNZW1vcnkoVywgcFNIQV9DVFgtPkJsb2NrLCBTSEExX0JMT0NLX1NJWkUpOworCWZvciAoV19pID0gMDsgV19pIDwgMTY7IFdfaSsrKQorCQlXW1dfaV0gPSBjcHUyYmUzMihXW1dfaV0pOwkvKiBFbmRpYW4gU3dhcCAqLworCS8qIEVuZCBvZiBmb3IgKi8KKworCS8qIFNIQTI1NiBoYXNoIGNvbXB1dGF0aW9uICovCisJLyogSW5pdGlhbGl6ZSB0aGUgd29ya2luZyB2YXJpYWJsZXMgKi8KKwlhID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVswXTsKKwliID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVsxXTsKKwljID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVsyXTsKKwlkID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVszXTsKKwllID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVs0XTsKKworCS8qIDgwIHJvdW5kcyAqLworCWZvciAodCA9IDA7IHQgPCA4MDsgdCsrKSB7CisJCXMgPSB0ICYgU0hBMV9NQVNLOworCQlpZiAodCA+IDE1KSB7CS8qIFByZXBhcmUgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUsIHtXX2l9LCAxNiA8IHQgPCA3OSAqLworCQkJV1tzXSA9CisJCQkgICAgKFdbKHMgKyAxMykgJiBTSEExX01BU0tdKSBeIChXWyhzICsgOCkgJiBTSEExX01BU0tdKQorCQkJICAgIF4gKFdbKHMgKyAyKSAmIFNIQTFfTUFTS10pIF4gV1tzXTsKKwkJCVdbc10gPSBST1RMMzIoV1tzXSwgMSk7CisJCX0JCS8qIEVuZCBvZiBpZiAqLworCQlzd2l0Y2ggKHQgLyAyMCkgeworCQljYXNlIDA6CisJCQlmX3QgPSBDaChiLCBjLCBkKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlmX3QgPSBQYXJpdHkoYiwgYywgZCk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZl90ID0gTWFqKGIsIGMsIGQpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWZfdCA9IFBhcml0eShiLCBjLCBkKTsKKwkJCWJyZWFrOworCQl9CQkvKiBFbmQgb2Ygc3dpdGNoICovCisJCVQgPSBST1RMMzIoYSwgNSkgKyBmX3QgKyBlICsgU0hBMV9LW3QgLyAyMF0gKyBXW3NdOworCQllID0gZDsKKwkJZCA9IGM7CisJCWMgPSBST1RMMzIoYiwgMzApOworCQliID0gYTsKKwkJYSA9IFQ7CisJfQkJCS8qIEVuZCBvZiBmb3IgKi8KKworCS8qIENvbXB1dGUgdGhlIGledGggaW50ZXJtZWRpYXRlIGhhc2ggdmFsdWUgSF4oaSkgKi8KKwlwU0hBX0NUWC0+SGFzaFZhbHVlWzBdICs9IGE7CisJcFNIQV9DVFgtPkhhc2hWYWx1ZVsxXSArPSBiOworCXBTSEFfQ1RYLT5IYXNoVmFsdWVbMl0gKz0gYzsKKwlwU0hBX0NUWC0+SGFzaFZhbHVlWzNdICs9IGQ7CisJcFNIQV9DVFgtPkhhc2hWYWx1ZVs0XSArPSBlOworCisJTmRpc1plcm9NZW1vcnkocFNIQV9DVFgtPkJsb2NrLCBTSEExX0JMT0NLX1NJWkUpOworCXBTSEFfQ1RYLT5CbG9ja0xlbiA9IDA7Cit9CQkJCS8qIEVuZCBvZiBTSEExX0hhc2ggKi8KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBUaGUgbWVzc2FnZSBpcyBhcHBlbmRlZCB0byBibG9jay4gSWYgYmxvY2sgc2l6ZSA+IDY0IGJ5dGVzLCB0aGUgU0hBMV9IYXNoCit3aWxsIGJlIGNhbGxlZC4KKworQXJndW1lbnRzOgorICAgIHBTSEFfQ1RYICAgICAgICBQb2ludGVyIHRvIHN0cnVjdCBydF9zaGExX2N0eAorICAgIG1lc3NhZ2UgICAgICAgICBNZXNzYWdlIGNvbnRleHQKKyAgICBtZXNzYWdlTGVuICAgICAgVGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIGJ5dGVzCisKK1JldHVybiBWYWx1ZToKKyAgICBOb25lCisKK05vdGU6CisgICAgTm9uZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBTSEExX0FwcGVuZChzdHJ1Y3QgcnRfc2hhMV9jdHggKnBTSEFfQ1RYLAorCQkgSU4gY29uc3QgdTggTWVzc2FnZVtdLCB1MzIgTWVzc2FnZUxlbikKK3sKKwl1MzIgYXBwZW5kTGVuID0gMDsKKwl1MzIgZGlmZkxlbiA9IDA7CisKKwl3aGlsZSAoYXBwZW5kTGVuICE9IE1lc3NhZ2VMZW4pIHsKKwkJZGlmZkxlbiA9IE1lc3NhZ2VMZW4gLSBhcHBlbmRMZW47CisJCWlmICgocFNIQV9DVFgtPkJsb2NrTGVuICsgZGlmZkxlbikgPCBTSEExX0JMT0NLX1NJWkUpIHsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBTSEFfQ1RYLT5CbG9jayArIHBTSEFfQ1RYLT5CbG9ja0xlbiwKKwkJCQkgICAgICAgTWVzc2FnZSArIGFwcGVuZExlbiwgZGlmZkxlbik7CisJCQlwU0hBX0NUWC0+QmxvY2tMZW4gKz0gZGlmZkxlbjsKKwkJCWFwcGVuZExlbiArPSBkaWZmTGVuOworCQl9IGVsc2UgeworCQkJTmRpc01vdmVNZW1vcnkocFNIQV9DVFgtPkJsb2NrICsgcFNIQV9DVFgtPkJsb2NrTGVuLAorCQkJCSAgICAgICBNZXNzYWdlICsgYXBwZW5kTGVuLAorCQkJCSAgICAgICBTSEExX0JMT0NLX1NJWkUgLSBwU0hBX0NUWC0+QmxvY2tMZW4pOworCQkJYXBwZW5kTGVuICs9IChTSEExX0JMT0NLX1NJWkUgLSBwU0hBX0NUWC0+QmxvY2tMZW4pOworCQkJcFNIQV9DVFgtPkJsb2NrTGVuID0gU0hBMV9CTE9DS19TSVpFOworCQkJU0hBMV9IYXNoKHBTSEFfQ1RYKTsKKwkJfQkJLyogRW5kIG9mIGlmICovCisJfQkJCS8qIEVuZCBvZiB3aGlsZSAqLworCXBTSEFfQ1RYLT5NZXNzYWdlTGVuICs9IE1lc3NhZ2VMZW47Cit9CQkJCS8qIEVuZCBvZiBTSEExX0FwcGVuZCAqLworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIDEuIEFwcGVuZCBiaXQgMSB0byBlbmQgb2YgdGhlIG1lc3NhZ2UKKyAgICAyLiBBcHBlbmQgdGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIHJpZ2h0bW9zdCA2NCBiaXRzCisgICAgMy4gVHJhbnNmb3JtIHRoZSBIYXNoIFZhbHVlIHRvIGRpZ2VzdCBtZXNzYWdlCisKK0FyZ3VtZW50czoKKyAgICBwU0hBX0NUWCAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3QgcnRfc2hhMV9jdHgKKworUmV0dXJuIFZhbHVlOgorICAgIGRpZ2VzdE1lc3NhZ2UgICBEaWdlc3QgbWVzc2FnZQorCitOb3RlOgorICAgIE5vbmUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgU0hBMV9FbmQoc3RydWN0IHJ0X3NoYTFfY3R4ICpwU0hBX0NUWCwgdTggRGlnZXN0TWVzc2FnZVtdKQoreworCXUzMiBpbmRleDsKKwl1NjQgbWVzc2FnZV9sZW5ndGhfYml0czsKKworCS8qIEFwcGVuZCBiaXQgMSB0byBlbmQgb2YgdGhlIG1lc3NhZ2UgKi8KKwlOZGlzRmlsbE1lbW9yeShwU0hBX0NUWC0+QmxvY2sgKyBwU0hBX0NUWC0+QmxvY2tMZW4sIDEsIDB4ODApOworCisJLyogNTUgPSA2NCAtIDggLSAxOiBhcHBlbmQgMSBiaXQoMSBieXRlKSBhbmQgbWVzc2FnZSBsZW5ndGggKDggYnl0ZXMpICovCisJaWYgKHBTSEFfQ1RYLT5CbG9ja0xlbiA+IDU1KQorCQlTSEExX0hhc2gocFNIQV9DVFgpOworCS8qIEVuZCBvZiBpZiAqLworCisJLyogQXBwZW5kIHRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiByaWdodG1vc3QgNjQgYml0cyAqLworCW1lc3NhZ2VfbGVuZ3RoX2JpdHMgPSBwU0hBX0NUWC0+TWVzc2FnZUxlbiAqIDg7CisJbWVzc2FnZV9sZW5ndGhfYml0cyA9IGNwdTJiZTY0KG1lc3NhZ2VfbGVuZ3RoX2JpdHMpOworCU5kaXNNb3ZlTWVtb3J5KCZwU0hBX0NUWC0+QmxvY2tbNTZdLCAmbWVzc2FnZV9sZW5ndGhfYml0cywgOCk7CisJU0hBMV9IYXNoKHBTSEFfQ1RYKTsKKworCS8qIFJldHVybiBtZXNzYWdlIGRpZ2VzdCwgdHJhbnNmb3JtIHRoZSB1MzIgaGFzaCB2YWx1ZSB0byBieXRlcyAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IDU7IGluZGV4KyspCisJCXBTSEFfQ1RYLT5IYXNoVmFsdWVbaW5kZXhdID0KKwkJICAgIGNwdTJiZTMyKHBTSEFfQ1RYLT5IYXNoVmFsdWVbaW5kZXhdKTsKKwkvKiBFbmQgb2YgZm9yICovCisJTmRpc01vdmVNZW1vcnkoRGlnZXN0TWVzc2FnZSwgcFNIQV9DVFgtPkhhc2hWYWx1ZSwgU0hBMV9ESUdFU1RfU0laRSk7Cit9CQkJCS8qIEVuZCBvZiBTSEExX0VuZCAqLworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFNIQTEgYWxnb3JpdGhtCisKK0FyZ3VtZW50czoKKyAgICBtZXNzYWdlICAgICAgICAgTWVzc2FnZSBjb250ZXh0CisgICAgbWVzc2FnZUxlbiAgICAgIFRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiBieXRlcworCitSZXR1cm4gVmFsdWU6CisgICAgZGlnZXN0TWVzc2FnZSAgIERpZ2VzdCBtZXNzYWdlCisKK05vdGU6CisgICAgTm9uZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVF9TSEExKElOIGNvbnN0IHU4IE1lc3NhZ2VbXSwKKwkgICAgIHUzMiBNZXNzYWdlTGVuLCB1OCBEaWdlc3RNZXNzYWdlW10pCit7CisKKwlzdHJ1Y3QgcnRfc2hhMV9jdHggc2hhX2N0eDsKKworCU5kaXNaZXJvTWVtb3J5KCZzaGFfY3R4LCBzaXplb2Yoc3RydWN0IHJ0X3NoYTFfY3R4KSk7CisJUlRfU0hBMV9Jbml0KCZzaGFfY3R4KTsKKwlTSEExX0FwcGVuZCgmc2hhX2N0eCwgTWVzc2FnZSwgTWVzc2FnZUxlbik7CisJU0hBMV9FbmQoJnNoYV9jdHgsIERpZ2VzdE1lc3NhZ2UpOworfQkJCQkvKiBFbmQgb2YgUlRfU0hBMSAqLworI2VuZGlmIC8qIFNIQTFfU1VQUE9SVCAqLworCisvKiBFbmQgb2YgY3J5cHRfc2hhMi5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9kZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Rmcy5jCmluZGV4IDIzMzMwZjIuLjcxY2JiMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Rmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Rmcy5jCkBAIC0zMywxNjQgKzMzLDEwIEBACiAgICAgUmV2aXNpb24gSGlzdG9yeToKICAgICBXaG8gICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKICAgICAtLS0tLS0tLSAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBGb25jaGkgICAgMDMtMTItMjAwNyAgICAgIGNyZWF0ZWQKICovCiAKICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAotdHlwZWRlZiBzdHJ1Y3QgX1JBREFSX0RVUkFUSU9OX1RBQkxFCi17Ci0JVUxPTkcgUkREdXJSZWdpb247Ci0JVUxPTkcgUmFkYXJTaWduYWxEdXJhdGlvbjsKLQlVTE9ORyBUb2xlcmFuY2U7Ci19IFJBREFSX0RVUkFUSU9OX1RBQkxFLCAqUFJBREFSX0RVUkFUSU9OX1RBQkxFOwotCi0KLXN0YXRpYyBVQ0hBUiBSZElkbGVUaW1lVGFibGVbTUFYX1JEX1JFR0lPTl1bNF0gPQotewotCXs5LCAyNTAsIDI1MCwgMjUwfSwJCS8vIENFCi0JezQsIDI1MCwgMjUwLCAyNTB9LAkJLy8gRkNDCi0JezQsIDI1MCwgMjUwLCAyNTB9LAkJLy8gSkFQCi0JezE1LCAyNTAsIDI1MCwgMjUwfSwJLy8gSkFQX1c1MwotCXs0LCAyNTAsIDI1MCwgMjUwfQkJLy8gSkFQX1c1NgotfTsKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUJicCBSYWRhciBkZXRlY3Rpb24gcm91dGluZQotCi0JQXJndW1lbnRzOgotCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQmJwUmFkYXJEZXRlY3Rpb25TdGFydCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVSU5UOCBSYWRhclBlcmlvZDsKLQotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMTQsIDB4MDIpOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjEsIDB4MjApOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjIsIDB4MDApOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjMsIDB4MDgvKjB4ODAqLyk7Ci0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyNCwgMHgyOCk7Ci0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyNSwgMHhmZik7Ci0KLQlSYWRhclBlcmlvZCA9ICgoVUlOVClSZElkbGVUaW1lVGFibGVbcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb25dWzBdICsgKFVJTlQpcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUpIDwgMjUwID8KLQkJCShSZElkbGVUaW1lVGFibGVbcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb25dWzBdICsgcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUpIDogMjUwOwotCi0JUlRNUF9JT19XUklURTgocEFkLCAweDcwMjAsIDB4MWQpOwotCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIxLCAweDQwKTsKLQotCVJhZGFyRGV0ZWN0aW9uU3RhcnQocEFkLCAwLCBSYWRhclBlcmlvZCk7Ci0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQmJwIFJhZGFyIGRldGVjdGlvbiByb3V0aW5lCi0KLQlBcmd1bWVudHM6Ci0JCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBCYnBSYWRhckRldGVjdGlvblN0b3AoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JUlRNUF9JT19XUklURTgocEFkLCAweDcwMjAsIDB4MWQpOwotCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIxLCAweDYwKTsKLQotCVJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOwotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJhZGFyIGRldGVjdGlvbiByb3V0aW5lCi0KLQlBcmd1bWVudHM6Ci0JCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSYWRhckRldGVjdGlvblN0YXJ0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIEJPT0xFQU4gQ1RTUHJvdGVjdCwKLQlJTiBVSU5UOCBDVFNQZXJpb2QpCi17Ci0JVUlOVDggRGZzQWN0aXZlVGltZSA9IChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSAmIDB4MWYpOwotCVVJTlQ4IEN0c1Byb3RlY3QgPSAoQ1RTUHJvdGVjdCA9PSAxKSA/IDB4MDIgOiAweDAxOyAvLyBDVFMgcHJvdGVjdC4KLQotCWlmIChDVFNQcm90ZWN0ICE9IDApCi0JewotCQlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24pCi0JCXsKLQkJY2FzZSBGQ0M6Ci0JCWNhc2UgSkFQX1c1NjoKLQkJCUN0c1Byb3RlY3QgPSAweDAzOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRToKLQkJY2FzZSBKQVBfVzUzOgotCQlkZWZhdWx0OgotCQkJQ3RzUHJvdGVjdCA9IDB4MDI7Ci0JCQlicmVhazsKLQkJfQotCX0KLQllbHNlCi0JCUN0c1Byb3RlY3QgPSAweDAxOwotCi0KLQkvLyBzZW5kIHN0YXJ0LVJEIHdpdGggQ1RTIHByb3RlY3Rpb24gY29tbWFuZCB0byBNQ1UKLQkvLyBoaWdoYnl0ZSBbN10JCXJlc2VydmUKLQkvLyBoaWdoYnl0ZSBbNjo1XQkweDogc3RvcCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbgotCS8vIGhpZ2hieXRlIFsxMF06CVN0YXJ0IENhcnJpZXIvUmFkYXIgZGV0ZWN0aW9uIHdpdGhvdXQgQ1RTIHByb3RlY3Rpb24sIDExOiBTdGFydCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbiB3aXRoIENUUyBwcm90ZWN0aW9uCi0JLy8gaGlnaGJ5dGUgWzQ6MF0JUmFkYXIvY2FycmllciBkZXRlY3Rpb24gZHVyYXRpb24uIEluIDFtcy4KLQotCS8vIGxvd2J5dGUgWzc6MF0JUmFkYXIvY2FycmllciBkZXRlY3Rpb24gcGVyaW9kLCBpbiAxbXMuCi0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDYwLCAweGZmLCBDVFNQZXJpb2QsIERmc0FjdGl2ZVRpbWUgfCAoQ3RzUHJvdGVjdCA8PCA1KSk7Ci0JLy9Bc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NjMsIDB4ZmYsIDEwLCAwKTsKLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJhZGFyIGRldGVjdGlvbiByb3V0aW5lCi0KLQlBcmd1bWVudHM6Ci0JCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlUUlVFCUZvdW5kIHJhZGFyIHNpZ25hbAotCQlGQUxTRQlOb3QgZm91bmQgcmFkYXIgc2lnbmFsCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJhZGFyRGV0ZWN0aW9uU3RvcCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJhZGFyRGV0ZWN0aW9uU3RvcC5cbiIpKTsKLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NjAsIDB4ZmYsIDB4MDAsIDB4MDApOwkvLyBzZW5kIHN0YXJ0LVJEIHdpdGggQ1RTIHByb3RlY3Rpb24gY29tbWFuZCB0byBNQ1UKLQotCXJldHVybjsKLX0KLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMjA2LDIyNyArNTIsMTcgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLUJPT0xFQU4gUmFkYXJDaGFubmVsQ2hlY2soCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlDaCkKK0JPT0xFQU4gUmFkYXJDaGFubmVsQ2hlY2soc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBDaCkKIHsKLSNpZiAxCi0JSU5UCQlpOworCWludCBpOwogCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7CiAKLQlmb3IgKGk9MDsgaTxwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCi0JewotCQlpZiAoQ2ggPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQotCQl7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykgeworCQlpZiAoQ2ggPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKSB7CiAJCQlyZXN1bHQgPSBwQWQtPkNoYW5uZWxMaXN0W2ldLkRmc1JlcTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0JSU5UCQlpOwotCVVDSEFSCUNoYW5uZWxbMTVdPXs1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9OwotCi0JZm9yIChpPTA7IGk8MTU7IGkrKykKLQl7Ci0JCWlmIChDaCA9PSBDaGFubmVsW2ldKQotCQl7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChpICE9IDE1KQotCQlyZXR1cm4gVFJVRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsKLSNlbmRpZgogfQotCi1VTE9ORyBKYXBSYWRhclR5cGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUxPTkcJCWk7Ci0JY29uc3QgVUNIQVIJQ2hhbm5lbFsxNV09ezUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH07Ci0KLQlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gIT0gSkFQKQotCXsKLQkJcmV0dXJuIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uOwotCX0KLQotCWZvciAoaT0wOyBpPDE1OyBpKyspCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9PSBDaGFubmVsW2ldKQotCQl7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChpIDwgNCkKLQkJcmV0dXJuIEpBUF9XNTM7Ci0JZWxzZSBpZiAoaSA8IDE1KQotCQlyZXR1cm4gSkFQX1c1NjsKLQllbHNlCi0JCXJldHVybiBKQVA7IC8vIFc1MgotCi19Ci0KLVVMT05HIFJUTVBCYnBSZWFkUmFkYXJEdXJhdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVSU5UOCBieXRlVmFsdWUgPSAwOwotCVVMT05HIHJlc3VsdDsKLQotCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExNSwgJmJ5dGVWYWx1ZSk7Ci0KLQlyZXN1bHQgPSAwOwotCXN3aXRjaCAoYnl0ZVZhbHVlKQotCXsKLQljYXNlIDE6IC8vIHJhZGFyIHNpZ25hbCBkZXRlY3RlZCBieSBwdWxzZSBtb2RlLgotCWNhc2UgMjogLy8gcmFkYXIgc2lnbmFsIGRldGVjdGVkIGJ5IHdpZHRoIG1vZGUuCi0JCXJlc3VsdCA9IFJUTVBSZWFkUmFkYXJEdXJhdGlvbihwQWQpOwotCQlicmVhazsKLQotCWNhc2UgMDogLy8gTm8gcmFkYXIgc2lnbmFsLgotCWRlZmF1bHQ6Ci0KLQkJcmVzdWx0ID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotVUxPTkcgUlRNUFJlYWRSYWRhckR1cmF0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVMT05HIHJlc3VsdCA9IDA7Ci0KLQlyZXR1cm4gcmVzdWx0OwotCi19Ci0KLVZPSUQgUlRNUENsZWFuUmFkYXJEdXJhdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlyZXR1cm47Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICAgICAgUmFkYXIgd2F2ZSBkZXRlY3Rpb24uIFRoZSBBUEkgc2hvdWxkIGJlIGludm9rZSBlYWNoIHNlY29uZC4KLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgcEFkICAgICAgICAgLSBBZGFwdGVyIHBvaW50ZXIKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgTm9uZQotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBcFJhZGFyRGV0ZWN0UGVyaW9kaWMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JSU5UCWk7Ci0KLQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5JblNlcnZpY2VNb25pdG9yQ291bnQrKzsKLQotCWZvciAoaT0wOyBpPHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykKLQl7Ci0JCWlmIChwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgPiAwKQotCQl7Ci0JCQlwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgLS07Ci0JCQlpZiAoKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kJTUpID09IDApCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFkYXJEZXRlY3RQZXJpb2RpYyAtIGNoPSVkLCBSZW1haW5pbmdUaW1lRm9yVXNlPSVkXG4iLCBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLy9yYWRhciBkZXRlY3QKLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCi0JCSYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCi0JewotCQlSYWRhckRldGVjdFBlcmlvZGljKHBBZCk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vLyBQZXJpb2RpYyBSYWRhciBkZXRlY3Rpb24sIHN3aXRjaCBjaGFubmVsIHdpbGwgb2NjdXIgaW4gUlRNUEhhbmRsZVRCVFRJbnRlcnJ1cHQoKQotLy8gQmVmb3JlIHN3aXRjaCBjaGFubmVsLCBkcml2ZXIgbmVlZHMgZG9pbmcgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50LgotVk9JRCBSYWRhckRldGVjdFBlcmlvZGljKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCS8vIG5lZWQgdG8gY2hlY2sgY2hhbm5lbCBhdmFpbGFiaWxpdHksIGFmdGVyIHN3aXRjaCBjaGFubmVsCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9TSUxFTkNFX01PREUpCi0JCQlyZXR1cm47Ci0KLQkvLyBjaGFubmVsIGF2YWlsYWJpbGl0eSBjaGVjayB0aW1lIGlzIDYwc2VjLCB1c2UgNjUgZm9yIGFzc3VyYW5jZQotCWlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRENvdW50KysgPiBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DaE1vdmluZ1RpbWUpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb3QgZm91bmQgcmFkYXIgc2lnbmFsLCBzdGFydCBzZW5kIGJlYWNvbiBhbmQgcmFkYXIgZGV0ZWN0aW9uIGluIHNlcnZpY2UgbW9uaXRvclxuXG4iKSk7Ci0JCQlCYnBSYWRhckRldGVjdGlvblN0b3AocEFkKTsKLQkJQXNpY0VuYWJsZUJzc1N5bmMocEFkKTsKLQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfTk9STUFMX01PREU7Ci0KLQotCQlyZXR1cm47Ci0JfQotCi0JcmV0dXJuOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQkJY2hhbmdlIGNoYW5uZWwgbW92aW5nIHRpbWUgZm9yIERGUyB0ZXN0aW5nLgotCi0JQXJndW1lbnRzOgotCSAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCSAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgTm9uZQotCi0gICAgTm90ZToKLSAgICAgICAgVXNhZ2U6Ci0gICAgICAgICAgICAgICAxLikgaXdwcml2IHJhMCBzZXQgQ2hNb3ZUaW1lPVt2YWx1ZV0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfQ2hNb3ZpbmdUaW1lX1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIGFyZykKLXsKLQlVSU5UOCBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNoTW92aW5nVGltZSA9IFZhbHVlOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiAlZFxuIiwgX19mdW5jX18sCi0JCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNoTW92aW5nVGltZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVCBTZXRfTG9uZ1B1bHNlUmFkYXJUaF9Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBhcmcpCi17Ci0JVUlOVDggVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPiAxMCA/IDEwIDogc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGggPSBWYWx1ZTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjogJWRcbiIsIF9fZnVuY19fLAotCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5Mb25nUHVsc2VSYWRhclRoKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9lZV9lZnVzZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZWVfZWZ1c2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzQxMmY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZWVfZWZ1c2UuYwpAQCAtMCwwICsxLDM0NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwllZV9lZnVzZS5jCisKKwlBYnN0cmFjdDoKKwlNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisJLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZQkiLi4vcnRfY29uZmlnLmgiCisKKyNkZWZpbmUgRUZVU0VfVVNBR0VfTUFQX1NUQVJUCTB4MmQwCisjZGVmaW5lIEVGVVNFX1VTQUdFX01BUF9FTkQJCTB4MmZjCisjZGVmaW5lIEVGVVNFX1VTQUdFX01BUF9TSVpFCTQ1CisKKyNkZWZpbmUgRUZVU0VfRUVQUk9NX0RFRlVMVF9GSUxFCSJSVDMweHhFRVBST00uYmluIgorI2RlZmluZSBNQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUJMTAyNAorCisjZGVmaW5lIEVGVVNFX1RBRwkJCQkweDJmZQorCit0eXBlZGVmIHVuaW9uIF9FRlVTRV9DVFJMX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgRUZTUk9NX0FPVVQ6NjsKKwkJdTMyIEVGU1JPTV9NT0RFOjI7CisJCXUzMiBFRlNST01fTERPX09GRl9USU1FOjY7CisJCXUzMiBFRlNST01fTERPX09OX1RJTUU6MjsKKwkJdTMyIEVGU1JPTV9BSU46MTA7CisJCXUzMiBSRVNFUlZFRDo0OworCQl1MzIgRUZTUk9NX0tJQ0s6MTsKKwkJdTMyIFNFTF9FRlVTRToxOworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IEVGVVNFX0NUUkxfU1RSVUMsICpQRUZVU0VfQ1RSTF9TVFJVQzsKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3U4IGVGdXNlUmVhZFJlZ2lzdGVycyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgdTE2IE9mZnNldCwgdTE2IExlbmd0aCwgdTE2ICogcERhdGEpCit7CisJRUZVU0VfQ1RSTF9TVFJVQyBlRnVzZUN0cmxTdHJ1YzsKKwlpbnQgaTsKKwl1MTYgZWZ1c2VEYXRhT2Zmc2V0OworCXUzMiBkYXRhOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsU3RydWMud29yZCk7CisKKwkvKlN0ZXAwLiBXcml0ZSAxMC1iaXQgb2YgYWRkcmVzcyB0byBFRlNST01fQUlOICgweDU4MCwgYml0MjU6Yml0MTYpLiBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25tZW50LiAqLworCS8qVXNlIHRoZSBlZXByb20gbG9naWNhbCBhZGRyZXNzIGFuZCBjb3ZlcnQgdG8gYWRkcmVzcyB0byBibG9jayBudW1iZXIgKi8KKwllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fQUlOID0gT2Zmc2V0ICYgMHhmZmYwOworCisJLypTdGVwMS4gV3JpdGUgRUZTUk9NX01PREUgKDB4NTgwLCBiaXQ3OmJpdDYpIHRvIDAuICovCisJZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX01PREUgPSAwOworCisJLypTdGVwMi4gV3JpdGUgRUZTUk9NX0tJQ0sgKDB4NTgwLCBiaXQzMCkgdG8gMSB0byBraWNrLW9mZiBwaHlzaWNhbCByZWFkIHByb2NlZHVyZS4gKi8KKwllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9IDE7CisKKwlOZGlzTW92ZU1lbW9yeSgmZGF0YSwgJmVGdXNlQ3RybFN0cnVjLCA0KTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRlVTRV9DVFJMLCBkYXRhKTsKKworCS8qU3RlcDMuIFBvbGxpbmcgRUZTUk9NX0tJQ0soMHg1ODAsIGJpdDMwKSB1bnRpbCBpdCBiZWNvbWUgMCBhZ2Fpbi4gKi8KKwlpID0gMDsKKwl3aGlsZSAoaSA8IDUwMCkgeworCQkvKnJ0bXAuSHdNZW1vcnlSZWFkRHdvcmQoRUZVU0VfQ1RSTCwgKERXT1JEICopICZlRnVzZUN0cmxTdHJ1YywgNCk7ICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgJmVGdXNlQ3RybFN0cnVjLndvcmQpOworCQlpZiAoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwkJUlRNUHVzZWNEZWxheSgyKTsKKwkJaSsrOworCX0KKworCS8qaWYgRUZTUk9NX0FPVVQgaXMgbm90IGZvdW5kIGluIHBoeXNpY2FsIGFkZHJlc3MsIHdyaXRlIDB4ZmZmZiAqLworCWlmIChlRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fQU9VVCA9PSAweDNmKSB7CisJCWZvciAoaSA9IDA7IGkgPCBMZW5ndGggLyAyOyBpKyspCisJCQkqKHBEYXRhICsgMiAqIGkpID0gMHhmZmZmOworCX0gZWxzZSB7CisJCS8qU3RlcDQuIFJlYWQgMTYtYnl0ZSBvZiBkYXRhIGZyb20gRUZVU0VfREFUQTAtMyAoMHg1OTAtMHg1OUMpICovCisJCWVmdXNlRGF0YU9mZnNldCA9IEVGVVNFX0RBVEEzIC0gKE9mZnNldCAmIDB4Qyk7CisJCS8qZGF0YSBob2xkIDQgYnl0ZXMgZGF0YS4gKi8KKwkJLypJbiBSVE1QX0lPX1JFQUQzMiB3aWxsIGF1dG9tYXRpY2FsbHkgZXhlY3V0ZSAzMi1ieXRlcyBzd2FwcGluZyAqLworCQlSVE1QX0lPX1JFQUQzMihwQWQsIGVmdXNlRGF0YU9mZnNldCwgJmRhdGEpOworCQkvKkRlY2lkZSB0aGUgdXBwZXIgMiBieXRlcyBvciB0aGUgYm90dG9tIDIgYnl0ZXMuICovCisJCS8qIExpdHRsZS1lbmRpYW4gICAgICAgICAgICAgICAgUyAgICAgICB8ICAgICAgIFMgICAgICAgQmlnLWVuZGlhbiAqLworCQkvKiBhZGRyIDMgICAgICAgMiAgICAgICAxICAgICAgIDAgICAgICAgfCAgICAgICAwICAgICAgIDEgICAgICAgMiAgICAgICAzICovCisJCS8qIE9yaS1WICAgICAgICBEICAgICAgIEMgICAgICAgQiAgICAgICBBICAgICAgIHwgICAgICAgQSAgICAgICBCICAgICAgIEMgICAgICAgRCAqLworCQkvKkFmdGVyIHN3YXBwaW5nICovCisJCS8qICAgICAgICAgICAgICBEICAgICAgIEMgICAgICAgQiAgICAgICBBICAgICAgIHwgICAgICAgRCAgICAgICBDICAgICAgIEIgICAgICAgQSAqLworCQkvKlJldHVybiAyLWJ5dGVzICovCisJCS8qVGhlIHJldHVybiBieXRlIHN0YXRycyBmcm9tIFMuIFRoZXJlZm9yZSwgdGhlIGxpdHRsZS1lbmRpYW4gd2lsbCByZXR1cm4gQkEsIHRoZSBCaWctZW5kaWFuIHdpbGwgcmV0dXJuIERDLiAqLworCQkvKkZvciByZXR1cm5pbmcgdGhlIGJvdHRvbSAyIGJ5dGVzLCB0aGUgQmlnLWVuZGlhbiBzaG91bGQgc2hpZnQgcmlnaHQgMi1ieXRlcy4gKi8KKwkJZGF0YSA9IGRhdGEgPj4gKDggKiAoT2Zmc2V0ICYgMHgzKSk7CisKKwkJTmRpc01vdmVNZW1vcnkocERhdGEsICZkYXRhLCBMZW5ndGgpOworCX0KKworCXJldHVybiAodTgpZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FPVVQ7CisKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCXUxNiBPZmZzZXQsCisJCQkJdTE2IExlbmd0aCwgdTE2ICogcERhdGEpCit7CisJRUZVU0VfQ1RSTF9TVFJVQyBlRnVzZUN0cmxTdHJ1YzsKKwlpbnQgaTsKKwl1MTYgZWZ1c2VEYXRhT2Zmc2V0OworCXUzMiBkYXRhOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsU3RydWMud29yZCk7CisKKwkvKlN0ZXAwLiBXcml0ZSAxMC1iaXQgb2YgYWRkcmVzcyB0byBFRlNST01fQUlOICgweDU4MCwgYml0MjU6Yml0MTYpLiBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25tZW50LiAqLworCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9BSU4gPSBPZmZzZXQgJiAweGZmZjA7CisKKwkvKlN0ZXAxLiBXcml0ZSBFRlNST01fTU9ERSAoMHg1ODAsIGJpdDc6Yml0NikgdG8gMS4gKi8KKwkvKlJlYWQgaW4gcGh5c2ljYWwgdmlldyAqLworCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9NT0RFID0gMTsKKworCS8qU3RlcDIuIFdyaXRlIEVGU1JPTV9LSUNLICgweDU4MCwgYml0MzApIHRvIDEgdG8ga2ljay1vZmYgcGh5c2ljYWwgcmVhZCBwcm9jZWR1cmUuICovCisJZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPSAxOworCisJTmRpc01vdmVNZW1vcnkoJmRhdGEsICZlRnVzZUN0cmxTdHJ1YywgNCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgRUZVU0VfQ1RSTCwgZGF0YSk7CisKKwkvKlN0ZXAzLiBQb2xsaW5nIEVGU1JPTV9LSUNLKDB4NTgwLCBiaXQzMCkgdW50aWwgaXQgYmVjb21lIDAgYWdhaW4uICovCisJaSA9IDA7CisJd2hpbGUgKGkgPCA1MDApIHsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsU3RydWMud29yZCk7CisJCWlmIChlRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9PSAwKQorCQkJYnJlYWs7CisJCVJUTVB1c2VjRGVsYXkoMik7CisJCWkrKzsKKwl9CisKKwkvKlN0ZXA0LiBSZWFkIDE2LWJ5dGUgb2YgZGF0YSBmcm9tIEVGVVNFX0RBVEEwLTMgKDB4NTlDLTB4NTkwKSAqLworCS8qQmVjYXVzZSB0aGUgc2l6ZSBvZiBlYWNoIEVGVVNFX0RBVEEgaXMgNCBCeXRlcywgdGhlIHNpemUgb2YgYWRkcmVzcyBvZiBlYWNoIGlzIDIgYml0cy4gKi8KKwkvKlRoZSBwcmV2aW91cyAyIGJpdHMgaXMgdGhlIEVGVVNFX0RBVEEgbnVtYmVyLCB0aGUgbGFzdCAyIGJpdHMgaXMgdXNlZCB0byBkZWNpZGUgd2hpY2ggYnl0ZXMgKi8KKwkvKkRlY2lkZSB3aGljaCBFRlVTRV9EQVRBIHRvIHJlYWQgKi8KKwkvKjU5MDpGIEUgRCBDICovCisJLyo1OTQ6QiBBIDkgOCAqLworCS8qNTk4OjcgNiA1IDQgKi8KKwkvKjU5QzozIDIgMSAwICovCisJZWZ1c2VEYXRhT2Zmc2V0ID0gRUZVU0VfREFUQTMgLSAoT2Zmc2V0ICYgMHhDKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgZWZ1c2VEYXRhT2Zmc2V0LCAmZGF0YSk7CisKKwlkYXRhID0gZGF0YSA+PiAoOCAqIChPZmZzZXQgJiAweDMpKTsKKworCU5kaXNNb3ZlTWVtb3J5KHBEYXRhLCAmZGF0YSwgTGVuZ3RoKTsKKworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIHZvaWQgZUZ1c2VSZWFkUGh5c2ljYWwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTE2ICpscEluQnVmZmVyLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBuSW5CdWZmZXJTaXplLAorCQkJICAgICAgdTE2ICpscE91dEJ1ZmZlciwgdW5zaWduZWQgbG9uZyBuT3V0QnVmZmVyU2l6ZSkKK3sKKwl1MTYgKnBJbkJ1ZiA9ICh1MTYgKikgbHBJbkJ1ZmZlcjsKKwl1MTYgKnBPdXRCdWYgPSAodTE2ICopIGxwT3V0QnVmZmVyOworCisJdTE2IE9mZnNldCA9IHBJbkJ1ZlswXTsJLyphZGRyICovCisJdTE2IExlbmd0aCA9IHBJbkJ1ZlsxXTsJLypsZW5ndGggKi8KKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBMZW5ndGg7IGkgKz0gMikgeworCQllRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycyhwQWQsIE9mZnNldCArIGksIDIsICZwT3V0QnVmW2kgLyAyXSk7CisJfQorfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IHNldF9lRnVzZUdldEZyZWVCbG9ja0NvdW50X1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyICphcmcpCit7CisJdTE2IGk7CisJdTE2IExvZ2ljYWxBZGRyZXNzOworCXUxNiBlZnVzZWZyZWVudW0gPSAwOworCWlmICghcEFkLT5iVXNlRWZ1c2UpCisJCXJldHVybiBGQUxTRTsKKwlmb3IgKGkgPSBFRlVTRV9VU0FHRV9NQVBfU1RBUlQ7IGkgPD0gRUZVU0VfVVNBR0VfTUFQX0VORDsgaSArPSAyKSB7CisJCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCwgaSwgMiwgJkxvZ2ljYWxBZGRyZXNzKTsKKwkJaWYgKChMb2dpY2FsQWRkcmVzcyAmIDB4ZmYpID09IDApIHsKKwkJCWVmdXNlZnJlZW51bSA9ICh1OCkoRUZVU0VfVVNBR0VfTUFQX0VORCAtIGkgKyAxKTsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKCgoTG9naWNhbEFkZHJlc3MgPj4gOCkgJiAweGZmKSA9PSAwKSB7CisJCQllZnVzZWZyZWVudW0gPSAodTgpKEVGVVNFX1VTQUdFX01BUF9FTkQgLSBpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPT0gRUZVU0VfVVNBR0VfTUFQX0VORCkKKwkJCWVmdXNlZnJlZW51bSA9IDA7CisJfQorCXByaW50aygiZWZ1c2VGcmVlTnVtYmVyIGlzICVkXG4iLCBlZnVzZWZyZWVudW0pOworCXJldHVybiBUUlVFOworfQorCitpbnQgc2V0X2VGdXNlZHVtcF9Qcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgY2hhciAqYXJnKQoreworCXUxNiBJbkJ1ZlszXTsKKwlpbnQgaSA9IDA7CisJaWYgKCFwQWQtPmJVc2VFZnVzZSkKKwkJcmV0dXJuIEZBTFNFOworCWZvciAoaSA9IDA7IGkgPCBFRlVTRV9VU0FHRV9NQVBfRU5EIC8gMjsgaSsrKSB7CisJCUluQnVmWzBdID0gMiAqIGk7CisJCUluQnVmWzFdID0gMjsKKwkJSW5CdWZbMl0gPSAweDA7CisKKwkJZUZ1c2VSZWFkUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDQsICZJbkJ1ZlsyXSwgMik7CisJCWlmIChpICUgNCA9PSAwKQorCQkJcHJpbnRrKCJcbkJsb2NrICV4OiIsIGkgLyA4KTsKKwkJcHJpbnRrKCIlMDR4ICIsIEluQnVmWzJdKTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK2ludCBydG1wX2VlX2VmdXNlX3JlYWQxNihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgdTE2IE9mZnNldCwgdTE2ICogcFZhbHVlKQoreworCWVGdXNlUmVhZFJlZ2lzdGVycyhwQWQsIE9mZnNldCwgMiwgcFZhbHVlKTsKKwlyZXR1cm4gKCpwVmFsdWUpOworfQorCitpbnQgUnRtcEVmdXNlU3VwcG9ydENoZWNrKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwl1MTYgdmFsdWU7CisKKwlpZiAoSVNfUlQzMHh4KHBBZCkpIHsKKwkJZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMocEFkLCBFRlVTRV9UQUcsIDIsICZ2YWx1ZSk7CisJCXBBZC0+RUZ1c2VUYWcgPSAodmFsdWUgJiAweGZmKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZUZ1c2VHZXRGcmVlQmxvY2tDb3VudChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHUzMiAqRWZ1c2VGcmVlQmxvY2spCit7CisJdTE2IGk7CisJdTE2IExvZ2ljYWxBZGRyZXNzOworCWlmICghcEFkLT5iVXNlRWZ1c2UpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJlRnVzZUdldEZyZWVCbG9ja0NvdW50IE9ubHkgc3VwcG9ydHMgZWZ1c2UgTW9kZVxuIikpOworCQlyZXR1cm47CisJfQorCWZvciAoaSA9IEVGVVNFX1VTQUdFX01BUF9TVEFSVDsgaSA8PSBFRlVTRV9VU0FHRV9NQVBfRU5EOyBpICs9IDIpIHsKKwkJZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMocEFkLCBpLCAyLCAmTG9naWNhbEFkZHJlc3MpOworCQlpZiAoKExvZ2ljYWxBZGRyZXNzICYgMHhmZikgPT0gMCkgeworCQkJKkVmdXNlRnJlZUJsb2NrID0gKHU4KShFRlVTRV9VU0FHRV9NQVBfRU5EIC0gaSArIDEpOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoKChMb2dpY2FsQWRkcmVzcyA+PiA4KSAmIDB4ZmYpID09IDApIHsKKwkJCSpFZnVzZUZyZWVCbG9jayA9ICh1OCkoRUZVU0VfVVNBR0VfTUFQX0VORCAtIGkpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA9PSBFRlVTRV9VU0FHRV9NQVBfRU5EKQorCQkJKkVmdXNlRnJlZUJsb2NrID0gMDsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoImVGdXNlR2V0RnJlZUJsb2NrQ291bnQgaXMgMHgleFxuIiwgKkVmdXNlRnJlZUJsb2NrKSk7Cit9CisKK2ludCBlRnVzZV9pbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwl1MzIgRWZ1c2VGcmVlQmxvY2sgPSAwOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkgKCJOVk0gaXMgRWZ1c2UgYW5kIGl0cyBzaXplID0leFsleC0leF0gXG4iLAorCQkgIEVGVVNFX1VTQUdFX01BUF9TSVpFLCBFRlVTRV9VU0FHRV9NQVBfU1RBUlQsCisJCSAgRUZVU0VfVVNBR0VfTUFQX0VORCkpOworCWVGdXNlR2V0RnJlZUJsb2NrQ291bnQocEFkLCAmRWZ1c2VGcmVlQmxvY2spOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9lZV9wcm9tLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9lZV9wcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA4Mzc0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2VlX3Byb20uYwpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwllZV9wcm9tLmMKKworCUFic3RyYWN0OgorCU1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlCSIuLi9ydF9jb25maWcuaCIKKworLyogSVJRTCA9IFBBU1NJVkVfTEVWRUwgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBSYWlzZUNsb2NrKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTMyICogeCkKK3sKKwkqeCA9ICp4IHwgRUVTSzsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCAqeCk7CisJUlRNUHVzZWNEZWxheSgxKTsJLyogTWF4IGZyZXF1ZW5jeSA9IDFNSHogaW4gU3BlYy4gZGVmaW5pdGlvbiAqLworfQorCisvKiBJUlFMID0gUEFTU0lWRV9MRVZFTCAqLworc3RhdGljIGlubGluZSB2b2lkIExvd2VyQ2xvY2soc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MzIgKiB4KQoreworCSp4ID0gKnggJiB+RUVTSzsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCAqeCk7CisJUlRNUHVzZWNEZWxheSgxKTsKK30KKworLyogSVJRTCA9IFBBU1NJVkVfTEVWRUwgKi8KK3N0YXRpYyBpbmxpbmUgdTE2IFNoaWZ0SW5CaXRzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwl1MzIgeCwgaTsKKwl1MTYgZGF0YSA9IDA7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworCXggJj0gfihFRURPIHwgRUVESSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlkYXRhID0gZGF0YSA8PCAxOworCQlSYWlzZUNsb2NrKHBBZCwgJngpOworCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworCQlMb3dlckNsb2NrKHBBZCwgJngpOwkvKnByZXZlbnQgcmVhZCBmYWlsZWQgKi8KKworCQl4ICY9IH4oRUVESSk7CisJCWlmICh4ICYgRUVETykKKwkJCWRhdGEgfD0gMTsKKwl9CisKKwlyZXR1cm4gZGF0YTsKK30KKworLyogSVJRTCA9IFBBU1NJVkVfTEVWRUwgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBTaGlmdE91dEJpdHMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCXUxNiBkYXRhLCB1MTYgY291bnQpCit7CisJdTMyIHgsIG1hc2s7CisKKwltYXNrID0gMHgwMSA8PCAoY291bnQgLSAxKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworCXggJj0gfihFRURPIHwgRUVESSk7CisKKwlkbyB7CisJCXggJj0gfkVFREk7CisJCWlmIChkYXRhICYgbWFzaykKKwkJCXggfD0gRUVESTsKKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworCQlSYWlzZUNsb2NrKHBBZCwgJngpOworCQlMb3dlckNsb2NrKHBBZCwgJngpOworCisJCW1hc2sgPSBtYXNrID4+IDE7CisJfSB3aGlsZSAobWFzayk7CisKKwl4ICY9IH5FRURJOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworfQorCisvKiBJUlFMID0gUEFTU0lWRV9MRVZFTCAqLworc3RhdGljIGlubGluZSB2b2lkIEVFcHJvbUNsZWFudXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXUzMiB4OworCisJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisKKwl4ICY9IH4oRUVDUyB8IEVFREkpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwlMb3dlckNsb2NrKHBBZCwgJngpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgRVdFTihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJdTMyIHg7CisKKwkvKiByZXNldCBiaXRzIGFuZCBzZXQgRUVDUyAqLworCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworCXggJj0gfihFRURJIHwgRUVETyB8IEVFU0spOworCXggfD0gRUVDUzsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworCS8qIGtpY2sgYSBwdWxzZSAqLworCVJhaXNlQ2xvY2socEFkLCAmeCk7CisJTG93ZXJDbG9jayhwQWQsICZ4KTsKKworCS8qIG91dHB1dCB0aGUgcmVhZF9vcGNvZGUgYW5kIHNpeCBwdWxzZSBpbiB0aGF0IG9yZGVyICovCisJU2hpZnRPdXRCaXRzKHBBZCwgRUVQUk9NX0VXRU5fT1BDT0RFLCA1KTsKKwlTaGlmdE91dEJpdHMocEFkLCAwLCA2KTsKKworCUVFcHJvbUNsZWFudXAocEFkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIEVXRFMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXUzMiB4OworCisJLyogcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MgKi8KKwlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKwl4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKKwl4IHw9IEVFQ1M7CisJUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKwkvKiBraWNrIGEgcHVsc2UgKi8KKwlSYWlzZUNsb2NrKHBBZCwgJngpOworCUxvd2VyQ2xvY2socEFkLCAmeCk7CisKKwkvKiBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCBzaXggcHVsc2UgaW4gdGhhdCBvcmRlciAqLworCVNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9FV0RTX09QQ09ERSwgNSk7CisJU2hpZnRPdXRCaXRzKHBBZCwgMCwgNik7CisKKwlFRXByb21DbGVhbnVwKHBBZCk7Cit9CisKKy8qIElSUUwgPSBQQVNTSVZFX0xFVkVMICovCitpbnQgcnRtcF9lZV9wcm9tX3JlYWQxNihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQl1MTYgT2Zmc2V0LCB1MTYgKiBwVmFsdWUpCit7CisJdTMyIHg7CisJdTE2IGRhdGE7CisKKwlPZmZzZXQgLz0gMjsKKwkvKiByZXNldCBiaXRzIGFuZCBzZXQgRUVDUyAqLworCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworCXggJj0gfihFRURJIHwgRUVETyB8IEVFU0spOworCXggfD0gRUVDUzsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworCS8qIHBhdGNoIGNhbiBub3QgYWNjZXNzIGUtRnVzZSBpc3N1ZSAqLworCWlmICghKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSkgeworCQkvKiBraWNrIGEgcHVsc2UgKi8KKwkJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwkJTG93ZXJDbG9jayhwQWQsICZ4KTsKKwl9CisJLyogb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgcmVnaXN0ZXIgbnVtYmVyIGluIHRoYXQgb3JkZXIgKi8KKwlTaGlmdE91dEJpdHMocEFkLCBFRVBST01fUkVBRF9PUENPREUsIDMpOworCVNoaWZ0T3V0Qml0cyhwQWQsIE9mZnNldCwgcEFkLT5FRVBST01BZGRyZXNzTnVtKTsKKworCS8qIE5vdyByZWFkIHRoZSBkYXRhICgxNiBiaXRzKSBpbiBmcm9tIHRoZSBzZWxlY3RlZCBFRVBST00gd29yZCAqLworCWRhdGEgPSBTaGlmdEluQml0cyhwQWQpOworCisJRUVwcm9tQ2xlYW51cChwQWQpOworCisJKnBWYWx1ZSA9IGRhdGE7CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2VlcHJvbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZWVwcm9tLmMKaW5kZXggZmZjYjRjZS4uOTQ2NzAwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZWVwcm9tLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZWVwcm9tLmMKQEAgLTM2LDE0NDQgKzM2LDU2IEBACiAqLwogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotVk9JRCBSYWlzZUNsb2NrKAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOICBVSU5UMzIgKngpCitpbnQgUnRtcENoaXBPcHNFZXByb21Ib29rKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgaW50IGluZlR5cGUpCiB7Ci0gICAgKnggPSAqeCB8IEVFU0s7Ci0gICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgKngpOwotICAgIFJUTVB1c2VjRGVsYXkoMSk7CQkJCS8vIE1heCBmcmVxdWVuY3kgPSAxTUh6IGluIFNwZWMuIGRlZmluaXRpb24KLX0KKwlzdHJ1Y3QgcnRfcnRtcF9jaGlwX29wICpwQ2hpcE9wcyA9ICZwQWQtPmNoaXBPcHM7CisjaWZkZWYgUlQzMHh4CisjaWZkZWYgUlRNUF9FRlVTRV9TVVBQT1JUCisJdTMyIGVGdXNlQ3RybCwgTWFjQ3NyMDsKKwlpbnQgaW5kZXg7CiAKLS8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCi1WT0lEIExvd2VyQ2xvY2soCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gICAgSU4gIFVJTlQzMiAqeCkKLXsKLSAgICAqeCA9ICp4ICYgfkVFU0s7Ci0gICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgKngpOwotICAgIFJUTVB1c2VjRGVsYXkoMSk7Ci19CisJaW5kZXggPSAwOworCWRvIHsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfQ1NSMCwgJk1hY0NzcjApOworCQlwQWQtPk1BQ1ZlcnNpb24gPSBNYWNDc3IwOwogCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotVVNIT1JUIFNoaWZ0SW5CaXRzKAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkKQotewotICAgIFVJTlQzMgkJeCxpOwotCVVTSE9SVCAgICAgIGRhdGE9MDsKLQotICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCi0gICAgeCAmPSB+KCBFRURPIHwgRUVESSk7Ci0KLSAgICBmb3IoaT0wOyBpPDE2OyBpKyspCi0gICAgewotICAgICAgICBkYXRhID0gZGF0YSA8PCAxOwotICAgICAgICBSYWlzZUNsb2NrKHBBZCwgJngpOwotCi0gICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCi0JTG93ZXJDbG9jayhwQWQsICZ4KTsgLyogcHJldmVudCByZWFkIGZhaWxlZCAqLwotCi0gICAgICAgIHggJj0gfihFRURJKTsKLSAgICAgICAgaWYoeCAmIEVFRE8pCi0gICAgICAgICAgICBkYXRhIHw9IDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIGRhdGE7Ci19Ci0KLS8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCi1WT0lEIFNoaWZ0T3V0Qml0cygKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLSAgICBJTiAgVVNIT1JUIGRhdGEsCi0gICAgSU4gIFVTSE9SVCBjb3VudCkKLXsKLSAgICBVSU5UMzIgICAgICAgeCxtYXNrOwotCi0gICAgbWFzayA9IDB4MDEgPDwgKGNvdW50IC0gMSk7Ci0gICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0KLSAgICB4ICY9IH4oRUVETyB8IEVFREkpOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIHggJj0gfkVFREk7Ci0gICAgICAgIGlmKGRhdGEgJiBtYXNrKQkJeCB8PSBFRURJOwotCi0gICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotCi0gICAgICAgIFJhaXNlQ2xvY2socEFkLCAmeCk7Ci0gICAgICAgIExvd2VyQ2xvY2socEFkLCAmeCk7Ci0KLSAgICAgICAgbWFzayA9IG1hc2sgPj4gMTsKLSAgICB9IHdoaWxlKG1hc2spOwotCi0gICAgeCAmPSB+RUVESTsKLSAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLX0KLQotLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLVZPSUQgRUVwcm9tQ2xlYW51cCgKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLSAgICBVSU5UMzIgeDsKLQotICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCi0gICAgeCAmPSB+KEVFQ1MgfCBFRURJKTsKLSAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLQotICAgIFJhaXNlQ2xvY2socEFkLCAmeCk7Ci0gICAgTG93ZXJDbG9jayhwQWQsICZ4KTsKLX0KLQotVk9JRCBFV0VOKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotICAgIFVJTlQzMgl4OwotCi0gICAgLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKLSAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLSAgICB4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKLSAgICB4IHw9IEVFQ1M7Ci0gICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Ci0KLQkvLyBraWNrIGEgcHVsc2UKLQlSYWlzZUNsb2NrKHBBZCwgJngpOwotCUxvd2VyQ2xvY2socEFkLCAmeCk7Ci0KLSAgICAvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCBzaXggcHVsc2UgaW4gdGhhdCBvcmRlcgotICAgIFNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9FV0VOX09QQ09ERSwgNSk7Ci0gICAgU2hpZnRPdXRCaXRzKHBBZCwgMCwgNik7Ci0KLSAgICBFRXByb21DbGVhbnVwKHBBZCk7Ci19Ci0KLVZPSUQgRVdEUygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLSAgICBVSU5UMzIJeDsKLQotICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCi0gICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0gICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7Ci0gICAgeCB8PSBFRUNTOwotICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotCi0JLy8ga2ljayBhIHB1bHNlCi0JUmFpc2VDbG9jayhwQWQsICZ4KTsKLQlMb3dlckNsb2NrKHBBZCwgJngpOwotCi0gICAgLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgc2l4IHB1bHNlIGluIHRoYXQgb3JkZXIKLSAgICBTaGlmdE91dEJpdHMocEFkLCBFRVBST01fRVdEU19PUENPREUsIDUpOwotICAgIFNoaWZ0T3V0Qml0cyhwQWQsIDAsIDYpOwotCi0gICAgRUVwcm9tQ2xlYW51cChwQWQpOwotfQotCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotVVNIT1JUIFJUTVBfRUVQUk9NX1JFQUQxNigKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLSAgICBJTiAgVVNIT1JUIE9mZnNldCkKLXsKLSAgICBVSU5UMzIJCXg7Ci0gICAgVVNIT1JUCQlkYXRhOwotCi0jaWZkZWYgUlQyODcwCi0JaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpCi0gICAgewotICAgIAlwQWQtPkVlcHJvbUFjY2VzcyA9IFRSVUU7Ci0gICAgfQotI2VuZGlmCi0gICAgT2Zmc2V0IC89IDI7Ci0gICAgLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKLSAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLSAgICB4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKLSAgICB4IHw9IEVFQ1M7Ci0gICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Ci0KLQkvLyBwYXRjaCBjYW4gbm90IGFjY2VzcyBlLUZ1c2UgaXNzdWUKLSAgICBpZiAoIUlTX1JUMzA5MChwQWQpKQotICAgIHsKLQkvLyBraWNrIGEgcHVsc2UKLQlSYWlzZUNsb2NrKHBBZCwgJngpOwotCUxvd2VyQ2xvY2socEFkLCAmeCk7Ci0gICAgfQotCi0gICAgLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgcmVnaXN0ZXIgbnVtYmVyIGluIHRoYXQgb3JkZXIKLSAgICBTaGlmdE91dEJpdHMocEFkLCBFRVBST01fUkVBRF9PUENPREUsIDMpOwotICAgIFNoaWZ0T3V0Qml0cyhwQWQsIE9mZnNldCwgcEFkLT5FRVBST01BZGRyZXNzTnVtKTsKLQotICAgIC8vIE5vdyByZWFkIHRoZSBkYXRhICgxNiBiaXRzKSBpbiBmcm9tIHRoZSBzZWxlY3RlZCBFRVBST00gd29yZAotICAgIGRhdGEgPSBTaGlmdEluQml0cyhwQWQpOwotCi0gICAgRUVwcm9tQ2xlYW51cChwQWQpOwotCi0jaWZkZWYgUlQyODcwCi0JLy8gQW50ZW5uYSBhbmQgRUVQUk9NIGFjY2VzcyBhcmUgYm90aCB1c2luZyBFRVNLIHBpbiwKLSAgICAvLyBUaGVyZWZvciB3ZSBzaG91bGQgYXZvaWQgYWNjZXNzaW5nIEVFU0sgYXQgdGhlIHNhbWUgdGltZQotICAgIC8vIFRoZW4gcmVzdG9yZSBhbnRlbm5hIGFmdGVyIEVFUFJPTSBhY2Nlc3MKLQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpIHx8IChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCkpCi0gICAgewotCSAgICBwQWQtPkVlcHJvbUFjY2VzcyA9IEZBTFNFOwotCSAgICBBc2ljU2V0UnhBbnQocEFkLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50KTsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gZGF0YTsKLX0JLy9SZWFkRUVwcm9tCi0KLVZPSUQgUlRNUF9FRVBST01fV1JJVEUxNigKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLSAgICBJTiAgVVNIT1JUIE9mZnNldCwKLSAgICBJTiAgVVNIT1JUIERhdGEpCi17Ci0gICAgVUlOVDMyIHg7Ci0KLSNpZmRlZiBSVDI4NzAKLQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkFudERpdmVyc2l0eSkKLSAgICB7Ci0gICAgCXBBZC0+RWVwcm9tQWNjZXNzID0gVFJVRTsKLSAgICB9Ci0jZW5kaWYKLQlPZmZzZXQgLz0gMjsKLQotCUVXRU4ocEFkKTsKLQotICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCi0gICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0gICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7Ci0gICAgeCB8PSBFRUNTOwotICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotCi0JLy8gcGF0Y2ggY2FuIG5vdCBhY2Nlc3MgZS1GdXNlIGlzc3VlCi0gICAgaWYgKCFJU19SVDMwOTAocEFkKSkKLSAgICB7Ci0JLy8ga2ljayBhIHB1bHNlCi0JUmFpc2VDbG9jayhwQWQsICZ4KTsKLQlMb3dlckNsb2NrKHBBZCwgJngpOwotICAgIH0KLQotICAgIC8vIG91dHB1dCB0aGUgcmVhZF9vcGNvZGUgLHJlZ2lzdGVyIG51bWJlciBhbmQgZGF0YSBpbiB0aGF0IG9yZGVyCi0gICAgU2hpZnRPdXRCaXRzKHBBZCwgRUVQUk9NX1dSSVRFX09QQ09ERSwgMyk7Ci0gICAgU2hpZnRPdXRCaXRzKHBBZCwgT2Zmc2V0LCBwQWQtPkVFUFJPTUFkZHJlc3NOdW0pOwotCVNoaWZ0T3V0Qml0cyhwQWQsIERhdGEsIDE2KTsJCS8vIDE2LWJpdCBhY2Nlc3MKLQotICAgIC8vIHJlYWQgRE8gc3RhdHVzCi0gICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0KLQlFRXByb21DbGVhbnVwKHBBZCk7Ci0KLQlSVE1QdXNlY0RlbGF5KDEwMDAwKTsJLy9kZWxheSBmb3IgdHdwKE1BWCk9MTBtcwotCi0JRVdEUyhwQWQpOwotCi0gICAgRUVwcm9tQ2xlYW51cChwQWQpOwotCi0jaWZkZWYgUlQyODcwCi0JLy8gQW50ZW5uYSBhbmQgRUVQUk9NIGFjY2VzcyBhcmUgYm90aCB1c2luZyBFRVNLIHBpbiwKLSAgICAvLyBUaGVyZWZvciB3ZSBzaG91bGQgYXZvaWQgYWNjZXNzaW5nIEVFU0sgYXQgdGhlIHNhbWUgdGltZQotICAgIC8vIFRoZW4gcmVzdG9yZSBhbnRlbm5hIGFmdGVyIEVFUFJPTSBhY2Nlc3MKLQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpIHx8IChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCkpCi0gICAgewotCSAgICBwQWQtPkVlcHJvbUFjY2VzcyA9IEZBTFNFOwotCSAgICBBc2ljU2V0UnhBbnQocEFkLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50KTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotI2lmZGVmIFJUMjg3MAotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlJUlFMID0KLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQ0hBUiBlRnVzZVJlYWRSZWdpc3RlcnMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUIE9mZnNldCwKLQlJTglVU0hPUlQgTGVuZ3RoLAotCU9VVAlVU0hPUlQqIHBEYXRhKQotewotCUVGVVNFX0NUUkxfU1RSVUMJCWVGdXNlQ3RybFN0cnVjOwotCWludAlpOwotCVVTSE9SVAllZnVzZURhdGFPZmZzZXQ7Ci0JVUlOVDMyCWRhdGE7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsIChQVUlOVDMyKSAmZUZ1c2VDdHJsU3RydWMpOwotCi0JLy9TdGVwMC4gV3JpdGUgMTAtYml0IG9mIGFkZHJlc3MgdG8gRUZTUk9NX0FJTiAoMHg1ODAsIGJpdDI1OmJpdDE2KS4gVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWdubWVudC4KLQkvL1VzZSB0aGUgZWVwcm9tIGxvZ2ljYWwgYWRkcmVzcyBhbmQgY292ZXJ0IHRvIGFkZHJlc3MgdG8gYmxvY2sgbnVtYmVyCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FJTiA9IE9mZnNldCAmIDB4ZmZmMDsKLQotCS8vU3RlcDEuIFdyaXRlIEVGU1JPTV9NT0RFICgweDU4MCwgYml0NzpiaXQ2KSB0byAwLgotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9NT0RFID0gMDsKLQotCS8vU3RlcDIuIFdyaXRlIEVGU1JPTV9LSUNLICgweDU4MCwgYml0MzApIHRvIDEgdG8ga2ljay1vZmYgcGh5c2ljYWwgcmVhZCBwcm9jZWR1cmUuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPSAxOwotCi0JTmRpc01vdmVNZW1vcnkoJmRhdGEsICZlRnVzZUN0cmxTdHJ1YywgNCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRUZVU0VfQ1RSTCwgZGF0YSk7Ci0KLQkvL1N0ZXAzLiBQb2xsaW5nIEVGU1JPTV9LSUNLKDB4NTgwLCBiaXQzMCkgdW50aWwgaXQgYmVjb21lIDAgYWdhaW4uCi0JaSA9IDA7Ci0Jd2hpbGUoaSA8IDEwMCkKLQl7Ci0JCS8vcnRtcC5Id01lbW9yeVJlYWREd29yZChFRlVTRV9DVFJMLCAoRFdPUkQgKikgJmVGdXNlQ3RybFN0cnVjLCA0KTsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAoUFVJTlQzMikgJmVGdXNlQ3RybFN0cnVjKTsKLQkJaWYoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPT0gMCkKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQkJUlRNUHVzZWNEZWxheSgyKTsKLQkJaSsrOwotCX0KLQotCS8vaWYgRUZTUk9NX0FPVVQgaXMgbm90IGZvdW5kIGluIHBoeXNpY2FsIGFkZHJlc3MsIHdyaXRlIDB4ZmZmZgotCWlmIChlRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fQU9VVCA9PSAweDNmKQotCXsKLQkJZm9yKGk9MDsgaTxMZW5ndGgvMjsgaSsrKQotCQkJKihwRGF0YSsyKmkpID0gMHhmZmZmOwotCX0KLQllbHNlCi0JewotCQkvL1N0ZXA0LiBSZWFkIDE2LWJ5dGUgb2YgZGF0YSBmcm9tIEVGVVNFX0RBVEEwLTMgKDB4NTkwLTB4NTlDKQotCQllZnVzZURhdGFPZmZzZXQgPSAgRUZVU0VfREFUQTMgLSAoT2Zmc2V0ICYgMHhDKSAgOwotCQkvL2RhdGEgaG9sZCA0IGJ5dGVzIGRhdGEuCi0JCS8vSW4gUlRNUF9JT19SRUFEMzIgd2lsbCBhdXRvbWF0aWNhbGx5IGV4ZWN1dGUgMzItYnl0ZXMgc3dhcHBpbmcKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBlZnVzZURhdGFPZmZzZXQsICZkYXRhKTsKLQkJLy9EZWNpZGUgdGhlIHVwcGVyIDIgYnl0ZXMgb3IgdGhlIGJvdHRvbSAyIGJ5dGVzLgotCQkvLyBMaXR0bGUtZW5kaWFuCQlTCXwJUwlCaWctZW5kaWFuCi0JCS8vIGFkZHIJMwkyCTEJMAl8CTAJMQkyCTMKLQkJLy8gT3JpLVYJRAlDCUIJQQl8CUEJQglDCUQKLQkJLy9BZnRlciBzd2FwcGluZwotCQkvLwkJRAlDCUIJQQl8CUQJQwlCCUEKLQkJLy9SZXR1cm4gMi1ieXRlcwotCQkvL1RoZSByZXR1cm4gYnl0ZSBzdGF0cnMgZnJvbSBTLiBUaGVyZWZvcmUsIHRoZSBsaXR0bGUtZW5kaWFuIHdpbGwgcmV0dXJuIEJBLCB0aGUgQmlnLWVuZGlhbiB3aWxsIHJldHVybiBEQy4KLQkJLy9Gb3IgcmV0dXJuaW5nIHRoZSBib3R0b20gMiBieXRlcywgdGhlIEJpZy1lbmRpYW4gc2hvdWxkIHNoaWZ0IHJpZ2h0IDItYnl0ZXMuCi0JCWRhdGEgPSBkYXRhID4+ICg4KihPZmZzZXQgJiAweDMpKTsKLQotCQlOZGlzTW92ZU1lbW9yeShwRGF0YSwgJmRhdGEsIExlbmd0aCk7Ci0JfQotCi0JcmV0dXJuIChVQ0hBUikgZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FPVVQ7Ci0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlJUlFMID0KLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIGVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlPVVQJVVNIT1JUKiBwRGF0YSkKLXsKLQlFRlVTRV9DVFJMX1NUUlVDCQllRnVzZUN0cmxTdHJ1YzsKLQlpbnQJaTsKLQlVU0hPUlQJZWZ1c2VEYXRhT2Zmc2V0OwotCVVJTlQzMglkYXRhOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAoUFVJTlQzMikgJmVGdXNlQ3RybFN0cnVjKTsKLQotCS8vU3RlcDAuIFdyaXRlIDEwLWJpdCBvZiBhZGRyZXNzIHRvIEVGU1JPTV9BSU4gKDB4NTgwLCBiaXQyNTpiaXQxNikuIFRoZSBhZGRyZXNzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbm1lbnQuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FJTiA9IE9mZnNldCAmIDB4ZmZmMDsKLQotCS8vU3RlcDEuIFdyaXRlIEVGU1JPTV9NT0RFICgweDU4MCwgYml0NzpiaXQ2KSB0byAxLgotCS8vUmVhZCBpbiBwaHlzaWNhbCB2aWV3Ci0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX01PREUgPSAxOwotCi0JLy9TdGVwMi4gV3JpdGUgRUZTUk9NX0tJQ0sgKDB4NTgwLCBiaXQzMCkgdG8gMSB0byBraWNrLW9mZiBwaHlzaWNhbCByZWFkIHByb2NlZHVyZS4KLQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9IDE7Ci0KLQlOZGlzTW92ZU1lbW9yeSgmZGF0YSwgJmVGdXNlQ3RybFN0cnVjLCA0KTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRlVTRV9DVFJMLCBkYXRhKTsKLQotCS8vU3RlcDMuIFBvbGxpbmcgRUZTUk9NX0tJQ0soMHg1ODAsIGJpdDMwKSB1bnRpbCBpdCBiZWNvbWUgMCBhZ2Fpbi4KLQlpID0gMDsKLQl3aGlsZShpIDwgMTAwKQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAoUFVJTlQzMikgJmVGdXNlQ3RybFN0cnVjKTsKLQkJaWYoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPT0gMCkKLQkJCWJyZWFrOwotCQlSVE1QdXNlY0RlbGF5KDIpOwotCQlpKys7Ci0JfQotCi0JLy9TdGVwNC4gUmVhZCAxNi1ieXRlIG9mIGRhdGEgZnJvbSBFRlVTRV9EQVRBMC0zICgweDU5Qy0weDU5MCkKLQkvL0JlY2F1c2UgdGhlIHNpemUgb2YgZWFjaCBFRlVTRV9EQVRBIGlzIDQgQnl0ZXMsIHRoZSBzaXplIG9mIGFkZHJlc3Mgb2YgZWFjaCBpcyAyIGJpdHMuCi0JLy9UaGUgcHJldmlvdXMgMiBiaXRzIGlzIHRoZSBFRlVTRV9EQVRBIG51bWJlciwgdGhlIGxhc3QgMiBiaXRzIGlzIHVzZWQgdG8gZGVjaWRlIHdoaWNoIGJ5dGVzCi0JLy9EZWNpZGUgd2hpY2ggRUZVU0VfREFUQSB0byByZWFkCi0JLy81OTA6RiBFIEQgQwotCS8vNTk0OkIgQSA5IDgKLQkvLzU5ODo3IDYgNSA0Ci0JLy81OUM6MyAyIDEgMAotCWVmdXNlRGF0YU9mZnNldCA9ICBFRlVTRV9EQVRBMyAtIChPZmZzZXQgJiAweEMpICA7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIGVmdXNlRGF0YU9mZnNldCwgJmRhdGEpOwotCi0JZGF0YSA9IGRhdGEgPj4gKDgqKE9mZnNldCAmIDB4MykpOwotCi0JTmRpc01vdmVNZW1vcnkocERhdGEsICZkYXRhLCBMZW5ndGgpOwotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBlRnVzZVJlYWRQaHlzaWNhbCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLSAgCUlOCVBVU0hPUlQgbHBJbkJ1ZmZlciwKLSAgCUlOCVVMT05HIG5JbkJ1ZmZlclNpemUsCi0gIAlPVVQJUFVTSE9SVCBscE91dEJ1ZmZlciwKLSAgCUlOCVVMT05HIG5PdXRCdWZmZXJTaXplCi0pCi17Ci0JVVNIT1JUKiBwSW5CdWYgPSAoVVNIT1JUKilscEluQnVmZmVyOwotCVVTSE9SVCogcE91dEJ1ZiA9IChVU0hPUlQqKWxwT3V0QnVmZmVyOwotCi0JVVNIT1JUIE9mZnNldCA9IHBJbkJ1ZlswXTsJCQkJCS8vYWRkcgotCVVTSE9SVCBMZW5ndGggPSBwSW5CdWZbMV07CQkJCQkvL2xlbmd0aAotCWludCAJCWk7Ci0KLQlmb3IoaT0wOyBpPExlbmd0aDsgaSs9MikKLQl7Ci0JCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCxPZmZzZXQraSwgMiwgJnBPdXRCdWZbaS8yXSk7Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCUlSUUwgPQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5UU1RBVFVTIGVGdXNlUmVhZCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JT1VUCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVTSE9SVAkJCUxlbmd0aCkKLXsKLQlVU0hPUlQqIHBPdXRCdWYgPSAoVVNIT1JUKilwRGF0YTsKLQlOVFNUQVRVUwlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLQlVQ0hBUglFRlNST01fQU9VVDsKLQlpbnQJaTsKLQotCWZvcihpPTA7IGk8TGVuZ3RoOyBpKz0yKQotCXsKLQkJRUZTUk9NX0FPVVQgPSBlRnVzZVJlYWRSZWdpc3RlcnMocEFkLCBPZmZzZXQraSwgMiwgJnBPdXRCdWZbaS8yXSk7Ci0JfQotCXJldHVybiBTdGF0dXM7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBlRnVzZVBoeXNpY2FsV3JpdGVSZWdpc3RlcnMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUIE9mZnNldCwKLQlJTglVU0hPUlQgTGVuZ3RoLAotCU9VVAlVU0hPUlQqIHBEYXRhKQotewotCUVGVVNFX0NUUkxfU1RSVUMJCWVGdXNlQ3RybFN0cnVjOwotCWludAlpOwotCVVTSE9SVAllZnVzZURhdGFPZmZzZXQ7Ci0JVUlOVDMyCWRhdGEsIGVGdXNlRGF0YUJ1ZmZlcls0XTsKLQotCS8vU3RlcDAuIFdyaXRlIDE2LWJ5dGUgb2YgZGF0YSB0byBFRlVTRV9EQVRBMC0zICgweDU5MC0weDU5QyksIHdoZXJlIEVGVVNFX0RBVEEwIGlzIHRoZSBMU0IgRFcsIEVGVVNFX0RBVEEzIGlzIHRoZSBNU0IgRFcuCi0KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vcmVhZCBjdXJyZW50IHZhbHVlcyBvZiAxNi1ieXRlIGJsb2NrCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAoUFVJTlQzMikgJmVGdXNlQ3RybFN0cnVjKTsKLQotCS8vU3RlcDAuIFdyaXRlIDEwLWJpdCBvZiBhZGRyZXNzIHRvIEVGU1JPTV9BSU4gKDB4NTgwLCBiaXQyNTpiaXQxNikuIFRoZSBhZGRyZXNzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbm1lbnQuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FJTiA9IE9mZnNldCAmIDB4ZmZmMDsKLQotCS8vU3RlcDEuIFdyaXRlIEVGU1JPTV9NT0RFICgweDU4MCwgYml0NzpiaXQ2KSB0byAxLgotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9NT0RFID0gMTsKLQotCS8vU3RlcDIuIFdyaXRlIEVGU1JPTV9LSUNLICgweDU4MCwgYml0MzApIHRvIDEgdG8ga2ljay1vZmYgcGh5c2ljYWwgcmVhZCBwcm9jZWR1cmUuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPSAxOwotCi0JTmRpc01vdmVNZW1vcnkoJmRhdGEsICZlRnVzZUN0cmxTdHJ1YywgNCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRUZVU0VfQ1RSTCwgZGF0YSk7Ci0KLQkvL1N0ZXAzLiBQb2xsaW5nIEVGU1JPTV9LSUNLKDB4NTgwLCBiaXQzMCkgdW50aWwgaXQgYmVjb21lIDAgYWdhaW4uCi0JaSA9IDA7Ci0Jd2hpbGUoaSA8IDEwMCkKLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgKFBVSU5UMzIpICZlRnVzZUN0cmxTdHJ1Yyk7Ci0KLQkJaWYoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPT0gMCkKLQkJCWJyZWFrOwotCQlSVE1QdXNlY0RlbGF5KDIpOwotCQlpKys7Ci0JfQotCi0JLy9TdGVwNC4gUmVhZCAxNi1ieXRlIG9mIGRhdGEgZnJvbSBFRlVTRV9EQVRBMC0zICgweDU5Qy0weDU5MCkKLQllZnVzZURhdGFPZmZzZXQgPSAgRUZVU0VfREFUQTM7Ci0JZm9yKGk9MDsgaTwgNDsgaSsrKQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBlZnVzZURhdGFPZmZzZXQsIChQVUlOVDMyKSAmZUZ1c2VEYXRhQnVmZmVyW2ldKTsKLQkJZWZ1c2VEYXRhT2Zmc2V0IC09ICA0OwotCX0KLQotCS8vVXBkYXRlIHRoZSB2YWx1ZSwgdGhlIG9mZnNldCBpcyBtdWx0aXBsZSBvZiAyLCBsZW5ndGggaXMgMgotCWVmdXNlRGF0YU9mZnNldCA9IChPZmZzZXQgJiAweGMpID4+IDI7Ci0JZGF0YSA9IHBEYXRhWzBdICYgMHhmZmZmOwotCS8vVGhlIG9mZnNldCBzaG91bGQgYmUgMHgqKioxMCBvciAweCoqKjAwCi0JaWYoKE9mZnNldCAlIDQpICE9IDApCi0JewotCQllRnVzZURhdGFCdWZmZXJbZWZ1c2VEYXRhT2Zmc2V0XSA9IChlRnVzZURhdGFCdWZmZXJbZWZ1c2VEYXRhT2Zmc2V0XSAmIDB4ZmZmZikgfCAoZGF0YSA8PCAxNik7Ci0JfQotCWVsc2UKLQl7Ci0JCWVGdXNlRGF0YUJ1ZmZlcltlZnVzZURhdGFPZmZzZXRdID0gKGVGdXNlRGF0YUJ1ZmZlcltlZnVzZURhdGFPZmZzZXRdICYgMHhmZmZmMDAwMCkgfCBkYXRhOwotCX0KLQotCWVmdXNlRGF0YU9mZnNldCA9ICBFRlVTRV9EQVRBMzsKLQlmb3IoaT0wOyBpPCA0OyBpKyspCi0JewotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBlZnVzZURhdGFPZmZzZXQsIGVGdXNlRGF0YUJ1ZmZlcltpXSk7Ci0JCWVmdXNlRGF0YU9mZnNldCAtPSA0OwotCX0KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0JLy9TdGVwMS4gV3JpdGUgMTAtYml0IG9mIGFkZHJlc3MgdG8gRUZTUk9NX0FJTiAoMHg1ODAsIGJpdDI1OmJpdDE2KS4gVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWdubWVudC4KLQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fQUlOID0gT2Zmc2V0ICYgMHhmZmYwOwotCi0JLy9TdGVwMi4gV3JpdGUgRUZTUk9NX01PREUgKDB4NTgwLCBiaXQ3OmJpdDYpIHRvIDMuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX01PREUgPSAzOwotCi0JLy9TdGVwMy4gV3JpdGUgRUZTUk9NX0tJQ0sgKDB4NTgwLCBiaXQzMCkgdG8gMSB0byBraWNrLW9mZiBwaHlzaWNhbCB3cml0ZSBwcm9jZWR1cmUuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPSAxOwotCi0JTmRpc01vdmVNZW1vcnkoJmRhdGEsICZlRnVzZUN0cmxTdHJ1YywgNCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRUZVU0VfQ1RSTCwgZGF0YSk7Ci0KLQkvL1N0ZXA0LiBQb2xsaW5nIEVGU1JPTV9LSUNLKDB4NTgwLCBiaXQzMCkgdW50aWwgaXQgYmVjb21lIDAgYWdhaW4uIEl077+977+9cyBkb25lLgotCWkgPSAwOwotCXdoaWxlKGkgPCAxMDApCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsIChQVUlOVDMyKSAmZUZ1c2VDdHJsU3RydWMpOwotCi0JCWlmKGVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID09IDApCisJCWlmICgocEFkLT5NQUNWZXJzaW9uICE9IDB4MDApCisJCSAgICAmJiAocEFkLT5NQUNWZXJzaW9uICE9IDB4RkZGRkZGRkYpKQogCQkJYnJlYWs7CiAKLQkJUlRNUHVzZWNEZWxheSgyKTsKLQkJaSsrOworCQlSVE1QdXNlY0RlbGF5KDEwKTsKKwl9IHdoaWxlIChpbmRleCsrIDwgMTAwKTsKKworCXBBZC0+YlVzZUVmdXNlID0gRkFMU0U7CisJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsKTsKKwlwQWQtPmJVc2VFZnVzZSA9ICgoZUZ1c2VDdHJsICYgMHg4MDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkgPyAxIDogMDsKKwlpZiAocEFkLT5iVXNlRWZ1c2UpIHsKKwkJcENoaXBPcHMtPmVlaW5pdCA9IGVGdXNlX2luaXQ7CisJCXBDaGlwT3BzLT5lZXJlYWQgPSBydG1wX2VlX2VmdXNlX3JlYWQxNjsKKwkJcmV0dXJuIDA7CisJfSBlbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5WTSBpcyBFRVBST01cbiIpKTsKKyNlbmRpZiAvKiBSVE1QX0VGVVNFX1NVUFBPUlQgLy8gKi8KKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKworCXN3aXRjaCAoaW5mVHlwZSkgeworI2lmZGVmIFJUTVBfUENJX1NVUFBPUlQKKwljYXNlIFJUTVBfREVWX0lORl9QQ0k6CisJCXBDaGlwT3BzLT5lZWluaXQgPSBOVUxMOworCQlwQ2hpcE9wcy0+ZWVyZWFkID0gcnRtcF9lZV9wcm9tX3JlYWQxNjsKKwkJYnJlYWs7CisjZW5kaWYgLyogUlRNUF9QQ0lfU1VQUE9SVCAvLyAqLworI2lmZGVmIFJUTVBfVVNCX1NVUFBPUlQKKwljYXNlIFJUTVBfREVWX0lORl9VU0I6CisJCXBDaGlwT3BzLT5lZWluaXQgPSBOVUxMOworCQlwQ2hpcE9wcy0+ZWVyZWFkID0gUlRVU0JSZWFkRUVQUk9NMTY7CisJCWJyZWFrOworI2VuZGlmIC8qIFJUTVBfVVNCX1NVUFBPUlQgLy8gKi8KKworCWRlZmF1bHQ6CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJ0bXBDaGlwT3BzRWVwcm9tSG9vaygpIGZhaWxlZCFcbiIpKTsKKwkJYnJlYWs7CiAJfQorCisJcmV0dXJuIDA7CiB9Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTlRTVEFUVVMgZUZ1c2VXcml0ZVJlZ2lzdGVycygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQgT2Zmc2V0LAotCUlOCVVTSE9SVCBMZW5ndGgsCi0JSU4JVVNIT1JUKiBwRGF0YSkKLXsKLQlVU0hPUlQJaTsKLQlVU0hPUlQJZUZ1c2VEYXRhOwotCVVTSE9SVAlMb2dpY2FsQWRkcmVzcywgQmxrTnVtID0gMHhmZmZmOwotCVVDSEFSCUVGU1JPTV9BT1VUOwotCi0JVVNIT1JUIGFkZHIsdG1wYWRkciwgSW5CdWZbM10sIHRtcE9mZnNldDsKLQlVU0hPUlQgYnVmZmVyWzhdOwotCUJPT0xFQU4JCWJXcml0ZVN1Y2Nlc3MgPSBUUlVFOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZUZ1c2VXcml0ZVJlZ2lzdGVycyBPZmZzZXQ9JXgsIHBEYXRhPSV4XG4iLCBPZmZzZXQsICpwRGF0YSkpOwotCi0JLy9TdGVwIDAuIGZpbmQgdGhlIGVudHJ5IGluIHRoZSBtYXBwaW5nIHRhYmxlCi0JLy9UaGUgYWRkcmVzcyBvZiBFRVBST00gaXMgMi1ieXRlcyBhbGlnbm1lbnQuCi0JLy9UaGUgbGFzdCBiaXQgaXMgdXNlZCBmb3IgYWxpZ25tZW50LCBzbyBpdCBtdXN0IGJlIDAuCi0JdG1wT2Zmc2V0ID0gT2Zmc2V0ICYgMHhmZmZlOwotCUVGU1JPTV9BT1VUID0gZUZ1c2VSZWFkUmVnaXN0ZXJzKHBBZCwgdG1wT2Zmc2V0LCAyLCAmZUZ1c2VEYXRhKTsKLQotCWlmKCBFRlNST01fQU9VVCA9PSAweDNmKQotCXsJLy9maW5kIGF2YWlsYWJsZSBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkvL3RoZSBsb2dpY2FsIGFkZHJlc3MgZG9lcyBub3QgZXhpc3QsIGZpbmQgYW4gZW1wdHkgb25lCi0JCS8vZnJvbSB0aGUgZmlyc3QgYWRkcmVzcyBvZiBibG9jayA0NT0xNio0NT0weDJkMCB0byB0aGUgbGFzdCBhZGRyZXNzIG9mIGJsb2NrIDQ3Ci0JCS8vPT0+NDgqMTYtMyhyZXNlcnZlZCk9MkZDCi0JCWZvciAoaT1FRlVTRV9VU0FHRV9NQVBfU1RBUlQ7IGk8PUVGVVNFX1VTQUdFX01BUF9FTkQ7IGkrPTIpCi0JCXsKLQkJCS8vUmV0cml2ZSB0aGUgbG9naWNhbCBibG9jayBudWJtZXIgZm9ybSBlYWNoIGxvZ2ljYWwgYWRkcmVzcyBwb2ludGVyCi0JCQkvL0l0IHdpbGwgYWNjZXNzIHR3byBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlciBlYWNoIHRpbWUuCi0JCQllRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycyhwQWQsIGksIDIsICZMb2dpY2FsQWRkcmVzcyk7Ci0JCQlpZiggKExvZ2ljYWxBZGRyZXNzICYgMHhmZikgPT0gMCkKLQkJCXsvL05vdCB1c2VkIGxvZ2ljYWwgYWRkcmVzcyBwb2ludGVyCi0JCQkJQmxrTnVtID0gaS1FRlVTRV9VU0FHRV9NQVBfU1RBUlQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmKCggKExvZ2ljYWxBZGRyZXNzID4+IDgpICYgMHhmZikgPT0gMCkKLQkJCXsvL05vdCB1c2VkIGxvZ2ljYWwgYWRkcmVzcyBwb2ludGVyCi0JCQkJaWYgKGkgIT0gRUZVU0VfVVNBR0VfTUFQX0VORCkKLQkJCQl7Ci0JCQkJCUJsa051bSA9IGktRUZVU0VfVVNBR0VfTUFQX1NUQVJUKzE7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCUJsa051bSA9IEVGU1JPTV9BT1VUOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnMgQmxrTnVtID0gJWQgXG4iLCBCbGtOdW0pKTsKLQotCWlmKEJsa051bSA9PSAweGZmZmYpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzOiBvdXQgb2YgZnJlZSBFLWZ1c2Ugc3BhY2UhISFcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCS8vU3RlcCAxLiBTYXZlIGRhdGEgb2YgdGhpcyBibG9jawl3aGljaCBpcyBwb2ludGVkIGJ5IHRoZSBhdmFpYmxlIGxvZ2ljYWwgYWRkcmVzcyBwb2ludGVyCi0JLy8gcmVhZCBhbmQgc2F2ZSB0aGUgb3JpZ2luYWwgYmxvY2sgZGF0YQotCWZvcihpID0wOyBpPDg7IGkrKykKLQl7Ci0JCWFkZHIgPSBCbGtOdW0gKiAweDEwIDsKLQotCQlJbkJ1ZlswXSA9IGFkZHIrMippOwotCQlJbkJ1ZlsxXSA9IDI7Ci0JCUluQnVmWzJdID0gMHgwOwotCi0JCWVGdXNlUmVhZFBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA0LCAmSW5CdWZbMl0sIDIpOwotCi0JCWJ1ZmZlcltpXSA9IEluQnVmWzJdOwotCX0KLQotCS8vU3RlcCAyLiBVcGRhdGUgdGhlIGRhdGEgaW4gYnVmZmVyLCBhbmQgd3JpdGUgdGhlIGRhdGEgdG8gRWZ1c2UKLQlidWZmZXJbIChPZmZzZXQgPj4gMSkgJSA4XSA9IHBEYXRhWzBdOwotCi0JZG8KLQl7Ci0JCS8vU3RlcCAzLiBXcml0ZSB0aGUgZGF0YSB0byBFZnVzZQotCQlpZighYldyaXRlU3VjY2VzcykKLQkJewotCQkJZm9yKGkgPTA7IGk8ODsgaSsrKQotCQkJewotCQkJCWFkZHIgPSBCbGtOdW0gKiAweDEwIDsKLQotCQkJCUluQnVmWzBdID0gYWRkcisyKmk7Ci0JCQkJSW5CdWZbMV0gPSAyOwotCQkJCUluQnVmWzJdID0gYnVmZmVyW2ldOwotCi0JCQkJZUZ1c2VXcml0ZVBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA2LCBOVUxMLCAyKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCQlhZGRyID0gQmxrTnVtICogMHgxMCA7Ci0KLQkJCQlJbkJ1ZlswXSA9IGFkZHIrKE9mZnNldCAlIDE2KTsKLQkJCQlJbkJ1ZlsxXSA9IDI7Ci0JCQkJSW5CdWZbMl0gPSBwRGF0YVswXTsKLQotCQkJCWVGdXNlV3JpdGVQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNiwgTlVMTCwgMik7Ci0JCX0KLQotCQkvL1N0ZXAgNC4gV3JpdGUgbWFwcGluZyB0YWJsZQotCQlhZGRyID0gRUZVU0VfVVNBR0VfTUFQX1NUQVJUK0Jsa051bTsKLQotCQl0bXBhZGRyID0gYWRkcjsKLQotCQlpZihhZGRyICUgMiAhPSAwKQotCQkJYWRkciA9IGFkZHIgLTE7Ci0JCUluQnVmWzBdID0gYWRkcjsKLQkJSW5CdWZbMV0gPSAyOwotCi0JCS8vY29udmVydCB0aGUgYWRkcmVzcyBmcm9tIDEwIHRvIDggYml0ICggYml0NywgNiA9IHBhcml0eSBhbmQgYml0NSB+IDAgPSBiaXQ5fjQpLCBhbmQgd3JpdGUgdG8gbG9naWNhbCBtYXAgZW50cnkKLQkJdG1wT2Zmc2V0ID0gT2Zmc2V0OwotCQl0bXBPZmZzZXQgPj49IDQ7Ci0JCXRtcE9mZnNldCB8PSAoKH4oKHRtcE9mZnNldCAmIDB4MDEpIF4gKCB0bXBPZmZzZXQgPj4gMSAmIDB4MDEpIF4gICh0bXBPZmZzZXQgPj4gMiAmIDB4MDEpIF4gICh0bXBPZmZzZXQgPj4gMyAmIDB4MDEpKSkgPDwgNikgJiAweDQwOwotCQl0bXBPZmZzZXQgfD0gKCh+KCAodG1wT2Zmc2V0ID4+IDIgJiAweDAxKSBeICh0bXBPZmZzZXQgPj4gMyAmIDB4MDEpIF4gKHRtcE9mZnNldCA+PiA0ICYgMHgwMSkgXiAoIHRtcE9mZnNldCA+PiA1ICYgMHgwMSkpKSA8PCA3KSAmIDB4ODA7Ci0KLQkJLy8gd3JpdGUgdGhlIGxvZ2ljYWwgYWRkcmVzcwotCQlpZih0bXBhZGRyJTIgIT0gMCkKLQkJCUluQnVmWzJdID0gdG1wT2Zmc2V0PDw4OwotCQllbHNlCi0JCQlJbkJ1ZlsyXSA9IHRtcE9mZnNldDsKLQotCQllRnVzZVdyaXRlUGh5c2ljYWwocEFkLCZJbkJ1ZlswXSwgNiwgTlVMTCwgMCk7Ci0KLQkJLy9TdGVwIDUuIENvbXBhcmUgZGF0YSBpZiBub3QgdGhlIHNhbWUsIGludmFsaWRhdGUgdGhlIG1hcHBpbmcgZW50cnksIHRoZW4gcmUtd3JpdGUgdGhlIGRhdGEgdW50aWwgRS1mdXNlIGlzIGV4aGF1c3RlZAotCQliV3JpdGVTdWNjZXNzID0gVFJVRTsKLQkJZm9yKGkgPTA7IGk8ODsgaSsrKQotCQl7Ci0JCQlhZGRyID0gQmxrTnVtICogMHgxMCA7Ci0KLQkJCUluQnVmWzBdID0gYWRkcisyKmk7Ci0JCQlJbkJ1ZlsxXSA9IDI7Ci0JCQlJbkJ1ZlsyXSA9IDB4MDsKLQotCQkJZUZ1c2VSZWFkUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDQsICZJbkJ1ZlsyXSwgMik7Ci0KLQkJCWlmKGJ1ZmZlcltpXSAhPSBJbkJ1ZlsyXSkKLQkJCXsKLQkJCQliV3JpdGVTdWNjZXNzID0gRkFMU0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvL1N0ZXAgNi4gaW52bGlkYXRlIG1hcHBpbmcgZW50cnkgYW5kIGZpbmQgYSBmcmVlIG1hcHBpbmcgZW50cnkgaWYgbm90IHN1Y2NlZWQKLQkJaWYgKCFiV3JpdGVTdWNjZXNzKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb3QgYldyaXRlU3VjY2VzcyBCbGtOdW0gPSAlZFxuIiwgQmxrTnVtKSk7Ci0KLQkJCS8vIHRoZSBvZmZzZXQgb2YgY3VycmVudCBtYXBwaW5nIGVudHJ5Ci0JCQlhZGRyID0gRUZVU0VfVVNBR0VfTUFQX1NUQVJUK0Jsa051bTsKLQotCQkJLy9maW5kIGEgbmV3IG1hcHBpbmcgZW50cnkKLQkJCUJsa051bSA9IDB4ZmZmZjsKLQkJCWZvciAoaT1FRlVTRV9VU0FHRV9NQVBfU1RBUlQ7IGk8PUVGVVNFX1VTQUdFX01BUF9FTkQ7IGkrPTIpCi0JCQl7Ci0JCQkJZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMocEFkLCBpLCAyLCAmTG9naWNhbEFkZHJlc3MpOwotCQkJCWlmKCAoTG9naWNhbEFkZHJlc3MgJiAweGZmKSA9PSAwKQotCQkJCXsKLQkJCQkJQmxrTnVtID0gaS1FRlVTRV9VU0FHRV9NQVBfU1RBUlQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQllbHNlIGlmKCggKExvZ2ljYWxBZGRyZXNzID4+IDgpICYgMHhmZikgPT0gMCkKLQkJCQl7Ci0JCQkJCWlmIChpICE9IEVGVVNFX1VTQUdFX01BUF9FTkQpCi0JCQkJCXsKLQkJCQkJCUJsa051bSA9IGkrMS1FRlVTRV9VU0FHRV9NQVBfU1RBUlQ7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm90IGJXcml0ZVN1Y2Nlc3MgbmV3IEJsa051bSA9ICVkXG4iLCBCbGtOdW0pKTsKLQkJCWlmKEJsa051bSA9PSAweGZmZmYpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZUZ1c2VXcml0ZVJlZ2lzdGVyczogb3V0IG9mIGZyZWUgRS1mdXNlIHNwYWNlISEhXG4iKSk7Ci0JCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotCi0JCQkvL2ludmFsaWRhdGUgdGhlIG9yaWdpbmFsIG1hcHBpbmcgZW50cnkgaWYgbmV3IGVudHJ5IGlzIG5vdCBmb3VuZAotCQkJdG1wYWRkciA9IGFkZHI7Ci0KLQkJCWlmKGFkZHIgJSAyICE9IDApCi0JCQkJYWRkciA9IGFkZHIgLTE7Ci0JCQlJbkJ1ZlswXSA9IGFkZHI7Ci0JCQlJbkJ1ZlsxXSA9IDI7Ci0KLQkJCWVGdXNlUmVhZFBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA0LCAmSW5CdWZbMl0sIDIpOwotCi0JCQkvLyB3cml0ZSB0aGUgbG9naWNhbCBhZGRyZXNzCi0JCQlpZih0bXBhZGRyJTIgIT0gMCkKLQkJCXsKLQkJCQkvLyBJbnZhbGlkYXRlIHRoZSBoaWdoIGJ5dGUKLQkJCQlmb3IgKGk9ODsgaTwxNTsgaSsrKQotCQkJCXsKLQkJCQkJaWYoICggKEluQnVmWzJdID4+IGkpICYgMHgwMSkgPT0gMCkKLQkJCQkJewotCQkJCQkJSW5CdWZbMl0gfD0gKDB4MSA8PGkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gaW52YWxpZGF0ZSB0aGUgbG93IGJ5dGUKLQkJCQlmb3IgKGk9MDsgaTw4OyBpKyspCi0JCQkJewotCQkJCQlpZiggKCAoSW5CdWZbMl0gPj4gaSkgJiAweDAxKSA9PSAwKQotCQkJCQl7Ci0JCQkJCQlJbkJ1ZlsyXSB8PSAoMHgxIDw8aSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVGdXNlV3JpdGVQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNiwgTlVMTCwgMCk7Ci0JCX0KLQl9Ci0Jd2hpbGUoIWJXcml0ZVN1Y2Nlc3MpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBlRnVzZVdyaXRlUGh5c2ljYWwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gIAlQVVNIT1JUIGxwSW5CdWZmZXIsCi0JVUxPTkcgbkluQnVmZmVyU2l6ZSwKLSAgCVBVQ0hBUiBscE91dEJ1ZmZlciwKLSAgCVVMT05HIG5PdXRCdWZmZXJTaXplCi0pCi17Ci0JVVNIT1JUKiBwSW5CdWYgPSAoVVNIT1JUKilscEluQnVmZmVyOwotCWludCAJCWk7Ci0JLy9VU0hPUlQqIHBPdXRCdWYgPSAoVVNIT1JUKilpb0J1ZmZlcjsKLQotCVVTSE9SVCBPZmZzZXQgPSBwSW5CdWZbMF07CQkJCQkvL2FkZHIKLQlVU0hPUlQgTGVuZ3RoID0gcEluQnVmWzFdOwkJCQkJLy9sZW5ndGgKLQlVU0hPUlQqIHBWYWx1ZVggPSAmcEluQnVmWzJdOwkJCQkvL3ZhbHVlIC4uLgotCQkvLyBMaXR0bGUtZW5kaWFuCQlTCXwJUwlCaWctZW5kaWFuCi0JCS8vIGFkZHIJMwkyCTEJMAl8CTAJMQkyCTMKLQkJLy8gT3JpLVYJRAlDCUIJQQl8CUEJQglDCUQKLQkJLy9BZnRlciBzd2FwcGluZwotCQkvLwkJRAlDCUIJQQl8CUQJQwlCCUEKLQkJLy9Cb3RoIHRoZSBsaXR0bGUgYW5kIGJpZy1lbmRpYW4gdXNlIHRoZSBzYW1lIHNlcXVlbmNlIHRvIHdyaXRlICBkYXRhLgotCQkvL1RoZXJlZm9yZSwgd2Ugb25seSBuZWVkIHN3YXAgZGF0YSB3aGVuIHJlYWQgdGhlIGRhdGEuCi0JZm9yKGk9MDsgaTxMZW5ndGg7IGkrPTIpCi0JewotCQllRnVzZVBoeXNpY2FsV3JpdGVSZWdpc3RlcnMocEFkLCBPZmZzZXQraSwgMiwgJnBWYWx1ZVhbaS8yXSk7Ci0JfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTlRTVEFUVVMgZUZ1c2VXcml0ZSgKLSAgIAlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVVNIT1JUCQkJbGVuZ3RoKQotewotCWludCBpOwotCi0JVVNIT1JUKiBwVmFsdWVYID0gKFBVU0hPUlQpIHBEYXRhOwkJCQkvL3ZhbHVlIC4uLgotCQkvL1RoZSBpbnB1dCB2YWx1ZT0zMDcwIHdpbGwgYmUgc3RvcmVkIGFzIGZvbGxvd2luZwotIAkJLy8gTGl0dGxlLWVuZGlhbgkJUwl8CVMJQmlnLWVuZGlhbgotCQkvLyBhZGRyCQkJMQkwCXwJMAkxCi0JCS8vIE9yaS1WCQkJMzAJNzAJfAkzMAk3MAotCQkvL0FmdGVyIHN3YXBwaW5nCi0JCS8vCQkJCTMwCTcwCXwJNzAJMzAKLQkJLy9DYXN0aW5nCi0JCS8vCQkJCTMwNzAJfAk3MDMwICh4KQotCQkvL1RoZSBzd2FwcGluZyBzaG91bGQgYmUgcmVtb3ZlZCBmb3IgYmlnLWVuZGlhbgotCWZvcihpPTA7IGk8bGVuZ3RoOyBpKz0yKQotCXsKLQkJZUZ1c2VXcml0ZVJlZ2lzdGVycyhwQWQsIE9mZnNldCtpLCAyLCAmcFZhbHVlWFtpLzJdKTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlJUlFMID0KLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgc2V0X2VGdXNlR2V0RnJlZUJsb2NrQ291bnRfUHJvYygKLSAgIAlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVVNIT1JUIGk7Ci0JVVNIT1JUCUxvZ2ljYWxBZGRyZXNzOwotCVVTSE9SVCBlZnVzZWZyZWVudW09MDsKLQlpZighcEFkLT5iVXNlRWZ1c2UpCi0JCXJldHVybiBGQUxTRTsKLQlmb3IgKGkgPSBFRlVTRV9VU0FHRV9NQVBfU1RBUlQ7IGkgPD0gRUZVU0VfVVNBR0VfTUFQX0VORDsgaSs9MikKLQl7Ci0JCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCwgaSwgMiwgJkxvZ2ljYWxBZGRyZXNzKTsKLQkJaWYoIChMb2dpY2FsQWRkcmVzcyAmIDB4ZmYpID09IDApCi0JCXsKLQkJCWVmdXNlZnJlZW51bT0gKFVDSEFSKSAoRUZVU0VfVVNBR0VfTUFQX0VORC1pKzEpOwotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZSBpZigoIChMb2dpY2FsQWRkcmVzcyA+PiA4KSAmIDB4ZmYpID09IDApCi0JCXsKLQkJCWVmdXNlZnJlZW51bSA9IChVQ0hBUikgKEVGVVNFX1VTQUdFX01BUF9FTkQtaSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmKGkgPT0gRUZVU0VfVVNBR0VfTUFQX0VORCkKLQkJCWVmdXNlZnJlZW51bSA9IDA7Ci0JfQotCXByaW50aygiZWZ1c2VGcmVlTnVtYmVyIGlzICVkXG4iLGVmdXNlZnJlZW51bSk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci1JTlQgc2V0X2VGdXNlZHVtcF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLVVTSE9SVCBJbkJ1ZlszXTsKLQlJTlQgaT0wOwotCWlmKCFwQWQtPmJVc2VFZnVzZSkKLQkJcmV0dXJuIEZBTFNFOwotCWZvcihpID0wOyBpPEVGVVNFX1VTQUdFX01BUF9FTkQvMjsgaSsrKQotCXsKLQkJSW5CdWZbMF0gPSAyKmk7Ci0JCUluQnVmWzFdID0gMjsKLQkJSW5CdWZbMl0gPSAweDA7Ci0KLQkJZUZ1c2VSZWFkUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDQsICZJbkJ1ZlsyXSwgMik7Ci0JCWlmKGklND09MCkKLQkJcHJpbnRrKCJcbkJsb2NrICV4OiIsaS84KTsKLQkJcHJpbnRrKCIlMDR4ICIsSW5CdWZbMl0pOwotCX0KLQlyZXR1cm4gVFJVRTsKLX0KLUlOVAlzZXRfZUZ1c2VMb2FkRnJvbUJpbl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlDSEFSCQkJCQkqc3JjOwotCXN0cnVjdCBmaWxlCQkJCSpzcmNmOwotCUlOVCAJCQkJCXJldHZhbDsKLSAgIAltbV9zZWdtZW50X3QJCQlvcmdmczsKLQlVQ0hBUgkJCQkJKmJ1ZmZlcjsKLQlVQ0hBUgkJCQkJQmluRmlsZVNpemU9MDsKLQlJTlQJCQkJCQlpID0gMCxqPTAsaz0xOwotCVVTSE9SVAkJCQkJKlBEQVRBOwotCVVTSE9SVAkJCQkJREFUQTsKLQlCaW5GaWxlU2l6ZT1zdHJsZW4oIlJUMzB4eEVFUFJPTS5iaW4iKTsKLQlzcmMgPSBrbWFsbG9jKDEyOCwgTUVNX0FMTE9DX0ZMQUcpOwotCU5kaXNaZXJvTWVtb3J5KHNyYywgMTI4KTsKLQotIAlpZihzdHJsZW4oYXJnKT4wKQotCXsKLQotCQlOZGlzTW92ZU1lbW9yeShzcmMsIGFyZywgc3RybGVuKGFyZykpOwotIAl9Ci0KLQllbHNlCi0JewotCi0JCU5kaXNNb3ZlTWVtb3J5KHNyYywgIlJUMzB4eEVFUFJPTS5iaW4iLCBCaW5GaWxlU2l6ZSk7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRmlsZU5hbWU9JXNcbiIsc3JjKSk7Ci0JYnVmZmVyID0ga21hbGxvYyhNQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKLQotCWlmKGJ1ZmZlciA9PSBOVUxMKQotCXsKLQkJa2ZyZWUoc3JjKTsKLQkJIHJldHVybiBGQUxTRTsKLX0KLQlQREFUQT1rbWFsbG9jKHNpemVvZihVU0hPUlQpKjgsTUVNX0FMTE9DX0ZMQUcpOwotCi0JaWYoUERBVEE9PU5VTEwpCi0JewotCQlrZnJlZShzcmMpOwotCi0JCWtmcmVlKGJ1ZmZlcik7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLSAgICAJb3JnZnMgPSBnZXRfZnMoKTsKLSAgIAkgc2V0X2ZzKEtFUk5FTF9EUyk7Ci0KLQlpZiAoc3JjICYmICpzcmMpCi0JewotCQlzcmNmID0gZmlscF9vcGVuKHNyYywgT19SRE9OTFksIDApOwotCQlpZiAoSVNfRVJSKHNyY2YpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIC1QVFJfRVJSKHNyY2YpLHNyYykpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gVGhlIG9iamVjdCBtdXN0IGhhdmUgYSByZWFkIG1ldGhvZAotCQkJaWYgKHNyY2YtPmZfb3AgJiYgc3JjZi0+Zl9vcC0+cmVhZCkKLQkJCXsKLQkJCQltZW1zZXQoYnVmZmVyLCAweDAwLCBNQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUpOwotCQkJCXdoaWxlKHNyY2YtPmZfb3AtPnJlYWQoc3JjZiwgJmJ1ZmZlcltpXSwgMSwgJnNyY2YtPmZfcG9zKT09MSkKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiUwMlggIixidWZmZXJbaV0pKTsKLQkJCQkJaWYoKGkrMSklOD09MCkKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlxuIikpOwotICAgICAgICAgICAgICAJCQlpKys7Ci0JCQkJCQlpZihpPj1NQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUpCi0JCQkJCQkJewotCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IgJWxkIHJlYWRpbmcgJXMsIFRoZSBmaWxlIGlzIHRvbyBsYXJnZVsxMDI0XVxuIiwgLVBUUl9FUlIoc3JjZiksc3JjKSk7Ci0JCQkJCQkJCWtmcmVlKFBEQVRBKTsKLQkJCQkJCQkJa2ZyZWUoYnVmZmVyKTsKLQkJCQkJCQkJa2ZyZWUoc3JjKTsKLQkJCQkJCQkJcmV0dXJuIEZBTFNFOwotCQkJCQkJCX0KLQkJCSAgICAgICB9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IhISBTeXN0ZW0gZG9lc3Qgbm90IHN1cHBvcnQgcmVhZCBmdW5jdGlvblxuIikpOwotCQkJCQkJa2ZyZWUoUERBVEEpOwotCQkJCQkJa2ZyZWUoYnVmZmVyKTsKLQkJCQkJCWtmcmVlKHNyYyk7Ci0JCQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQl9Ci0gICAgICAJCX0KLQotCi0JfQotCWVsc2UKLQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3Igc3JjICBvciBzcmNmIGlzIG51bGxcbiIpKTsKLQkJCQkJa2ZyZWUoUERBVEEpOwotCQkJCQlrZnJlZShidWZmZXIpOwotCQkJCQlyZXR1cm4gRkFMU0U7Ci0KLQkJfQotCi0KLQlyZXR2YWw9ZmlscF9jbG9zZShzcmNmLE5VTEwpOwotCi0JaWYgKHJldHZhbCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBFcnJvciAlZCBjbG9zaW5nICVzXG4iLCAtcmV0dmFsLCBzcmMpKTsKLQl9Ci0Jc2V0X2ZzKG9yZ2ZzKTsKLQotCWZvcihqPTA7ajxpO2orKykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiUwMlggIixidWZmZXJbal0pKTsKLQkJaWYoKGorMSklMj09MCkKLQkJCVBEQVRBW2ovMiU4XT0oKGJ1ZmZlcltqXTw8OCkmMHhmZjAwKXwoYnVmZmVyW2otMV0mMHhmZik7Ci0JCWlmKGolMTY9PTApCi0JCXsKLQkJCWs9YnVmZmVyW2pdOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJayY9YnVmZmVyW2pdOwotCQkJaWYoKGorMSklMTY9PTApCi0JCQl7Ci0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcmVzdWx0PSUwMlgsYmxrPSUwMnhcbiIsayxqLzE2KSk7Ci0KLQkJCQlpZihrIT0weGZmKQotCQkJCQllRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbihwQWQsKFVTSE9SVClqLTE1LCAxNiwgUERBVEEpOwotCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJaWYoZUZ1c2VSZWFkUmVnaXN0ZXJzKHBBZCxqLCAyLChQVVNIT1JUKSZEQVRBKSE9MHgzZikKLQkJCQkJCQllRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbihwQWQsKFVTSE9SVClqLTE1LCAxNiwgUERBVEEpOwotCQkJCQl9Ci0JCQkJLyoKLQkJCQlmb3IobD0wO2w8ODtsKyspCi0JCQkJCXByaW50aygiJTA0eCAiLFBEQVRBW2xdKTsKLQkJCQlwcmludGsoIlxuIik7Ci0JCQkJKi8KLQkJCQlOZGlzWmVyb01lbW9yeShQREFUQSwxNik7Ci0KLQotCQkJfQotCQl9Ci0KLQotCX0KLQotCi0Ja2ZyZWUoUERBVEEpOwotCWtmcmVlKGJ1ZmZlcik7Ci0Ja2ZyZWUoc3JjKTsKLQlyZXR1cm4gVFJVRTsKLX0KLU5UU1RBVFVTIGVGdXNlV3JpdGVSZWdpc3RlcnNGcm9tQmluKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlJTglVU0hPUlQqIHBEYXRhKQotewotCVVTSE9SVAlpOwotCVVTSE9SVAllRnVzZURhdGE7Ci0JVVNIT1JUCUxvZ2ljYWxBZGRyZXNzLCBCbGtOdW0gPSAweGZmZmY7Ci0JVUNIQVIJRUZTUk9NX0FPVVQsTG9vcD0wOwotCUVGVVNFX0NUUkxfU1RSVUMJCWVGdXNlQ3RybFN0cnVjOwotCVVTSE9SVAllZnVzZURhdGFPZmZzZXQ7Ci0JVUlOVDMyCWRhdGEsdGVtcGJ1ZmZlcjsKLQlVU0hPUlQgYWRkcix0bXBhZGRyLCBJbkJ1ZlszXSwgdG1wT2Zmc2V0OwotCVVJTlQzMiBidWZmZXJbNF07Ci0JQk9PTEVBTgkJYldyaXRlU3VjY2VzcyA9IFRSVUU7Ci0JQk9PTEVBTgkJYk5vdFdyaXRlPVRSVUU7Ci0JQk9PTEVBTgkJYkFsbG9jYXRlTmV3QmxrPVRSVUU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbiBPZmZzZXQ9JXgsIHBEYXRhPSUwNHg6JTA0eDolMDR4OiUwNHhcbiIsIE9mZnNldCwgKnBEYXRhLCoocERhdGErMSksKihwRGF0YSsyKSwqKHBEYXRhKzMpKSk7Ci0KLQlkbwotCXsKLQkvL1N0ZXAgMC4gZmluZCB0aGUgZW50cnkgaW4gdGhlIG1hcHBpbmcgdGFibGUKLQkvL1RoZSBhZGRyZXNzIG9mIEVFUFJPTSBpcyAyLWJ5dGVzIGFsaWdubWVudC4KLQkvL1RoZSBsYXN0IGJpdCBpcyB1c2VkIGZvciBhbGlnbm1lbnQsIHNvIGl0IG11c3QgYmUgMC4KLQlMb29wKys7Ci0JdG1wT2Zmc2V0ID0gT2Zmc2V0ICYgMHhmZmZlOwotCUVGU1JPTV9BT1VUID0gZUZ1c2VSZWFkUmVnaXN0ZXJzKHBBZCwgdG1wT2Zmc2V0LCAyLCAmZUZ1c2VEYXRhKTsKLQotCWlmKCBFRlNST01fQU9VVCA9PSAweDNmKQotCXsJLy9maW5kIGF2YWlsYWJsZSBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkvL3RoZSBsb2dpY2FsIGFkZHJlc3MgZG9lcyBub3QgZXhpc3QsIGZpbmQgYW4gZW1wdHkgb25lCi0JCS8vZnJvbSB0aGUgZmlyc3QgYWRkcmVzcyBvZiBibG9jayA0NT0xNio0NT0weDJkMCB0byB0aGUgbGFzdCBhZGRyZXNzIG9mIGJsb2NrIDQ3Ci0JCS8vPT0+NDgqMTYtMyhyZXNlcnZlZCk9MkZDCi0JCWJBbGxvY2F0ZU5ld0Jsaz1UUlVFOwotCQlmb3IgKGk9RUZVU0VfVVNBR0VfTUFQX1NUQVJUOyBpPD1FRlVTRV9VU0FHRV9NQVBfRU5EOyBpKz0yKQotCQl7Ci0JCQkvL1JldHJpdmUgdGhlIGxvZ2ljYWwgYmxvY2sgbnVibWVyIGZvcm0gZWFjaCBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkJLy9JdCB3aWxsIGFjY2VzcyB0d28gbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIgZWFjaCB0aW1lLgotCQkJZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMocEFkLCBpLCAyLCAmTG9naWNhbEFkZHJlc3MpOwotCQkJaWYoIChMb2dpY2FsQWRkcmVzcyAmIDB4ZmYpID09IDApCi0JCQl7Ly9Ob3QgdXNlZCBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkJCUJsa051bSA9IGktRUZVU0VfVVNBR0VfTUFQX1NUQVJUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZigoIChMb2dpY2FsQWRkcmVzcyA+PiA4KSAmIDB4ZmYpID09IDApCi0JCQl7Ly9Ob3QgdXNlZCBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkJCWlmIChpICE9IEVGVVNFX1VTQUdFX01BUF9FTkQpCi0JCQkJewotCQkJCQlCbGtOdW0gPSBpLUVGVVNFX1VTQUdFX01BUF9TVEFSVCsxOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQliQWxsb2NhdGVOZXdCbGs9RkFMU0U7Ci0JCUJsa051bSA9IEVGU1JPTV9BT1VUOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnMgQmxrTnVtID0gJWQgXG4iLCBCbGtOdW0pKTsKLQotCWlmKEJsa051bSA9PSAweGZmZmYpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzOiBvdXQgb2YgZnJlZSBFLWZ1c2Ugc3BhY2UhISFcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQkvL1N0ZXAgMS4xLjAKLQkvL0lmIHRoZSBibG9jayBpcyBub3QgZXhpc3RpbmcgaW4gbWFwcGluZyB0YWJsZSwgY3JlYXRlIG9uZQotCS8vYW5kIHdyaXRlIGRvd24gdGhlIDE2LWJ5dGVzIGRhdGEgdG8gdGhlIG5ldyBibG9jawotCWlmKGJBbGxvY2F0ZU5ld0JsaykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFsbG9jYXRlIE5ldyBCbGtcbiIpKTsKLQkJZWZ1c2VEYXRhT2Zmc2V0ID0gIEVGVVNFX0RBVEEzOwotCQlmb3IoaT0wOyBpPCA0OyBpKyspCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFsbG9jYXRlIE5ldyBCbGssIERhdGElZD0lMDR4JTA0eFxuIiwzLWkscERhdGFbMippKzFdLHBEYXRhWzIqaV0pKTsKLQkJCXRlbXBidWZmZXI9KChwRGF0YVsyKmkrMV08PDE2KSYweGZmZmYwMDAwKXxwRGF0YVsyKmldOwotCi0KLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIGVmdXNlRGF0YU9mZnNldCx0ZW1wYnVmZmVyKTsKLQkJCWVmdXNlRGF0YU9mZnNldCAtPSA0OwotCi0JCX0KLQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCQkvL1N0ZXAxLjEuMS4gV3JpdGUgMTAtYml0IG9mIGFkZHJlc3MgdG8gRUZTUk9NX0FJTiAoMHg1ODAsIGJpdDI1OmJpdDE2KS4gVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWdubWVudC4KLQkJZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FJTiA9IEJsa051bSogMHgxMCA7Ci0KLQkJLy9TdGVwMS4xLjIuIFdyaXRlIEVGU1JPTV9NT0RFICgweDU4MCwgYml0NzpiaXQ2KSB0byAzLgotCQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fTU9ERSA9IDM7Ci0KLQkJLy9TdGVwMS4xLjMuIFdyaXRlIEVGU1JPTV9LSUNLICgweDU4MCwgYml0MzApIHRvIDEgdG8ga2ljay1vZmYgcGh5c2ljYWwgd3JpdGUgcHJvY2VkdXJlLgotCQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9IDE7Ci0KLQkJTmRpc01vdmVNZW1vcnkoJmRhdGEsICZlRnVzZUN0cmxTdHJ1YywgNCk7Ci0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRUZVU0VfQ1RSTCwgZGF0YSk7Ci0KLQkJLy9TdGVwMS4xLjQuIFBvbGxpbmcgRUZTUk9NX0tJQ0soMHg1ODAsIGJpdDMwKSB1bnRpbCBpdCBiZWNvbWUgMCBhZ2Fpbi4gSXTvv73vv71zIGRvbmUuCi0JCWkgPSAwOwotCQl3aGlsZShpIDwgMTAwKQotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsIChQVUlOVDMyKSAmZUZ1c2VDdHJsU3RydWMpOwotCi0JCQlpZihlRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9PSAwKQotCQkJCWJyZWFrOwotCi0JCQlSVE1QdXNlY0RlbGF5KDIpOwotCQkJaSsrOwotCQl9Ci0KLQl9Ci0JZWxzZQotCXsJLy9TdGVwMS4yLgotCQkvL0lmIHRoZSBzYW1lIGxvZ2ljYWwgbnVtYmVyIGlzIGV4aXN0aW5nLCBjaGVjayBpZiB0aGUgd3JpdHRpbmcgZGF0YSBhbmQgdGhlIGRhdGEKLQkJLy9zYXZpbmcgaW4gdGhpcyBibG9jayBhcmUgdGhlIHNhbWUuCi0JCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCS8vcmVhZCBjdXJyZW50IHZhbHVlcyBvZiAxNi1ieXRlIGJsb2NrCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgKFBVSU5UMzIpICZlRnVzZUN0cmxTdHJ1Yyk7Ci0KLQkJLy9TdGVwMS4yLjAuIFdyaXRlIDEwLWJpdCBvZiBhZGRyZXNzIHRvIEVGU1JPTV9BSU4gKDB4NTgwLCBiaXQyNTpiaXQxNikuIFRoZSBhZGRyZXNzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbm1lbnQuCi0JCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9BSU4gPSBPZmZzZXQgJiAweGZmZjA7Ci0KLQkJLy9TdGVwMS4yLjEuIFdyaXRlIEVGU1JPTV9NT0RFICgweDU4MCwgYml0NzpiaXQ2KSB0byAxLgotCQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fTU9ERSA9IDA7Ci0KLQkJLy9TdGVwMS4yLjIuIFdyaXRlIEVGU1JPTV9LSUNLICgweDU4MCwgYml0MzApIHRvIDEgdG8ga2ljay1vZmYgcGh5c2ljYWwgcmVhZCBwcm9jZWR1cmUuCi0JCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID0gMTsKLQotCQlOZGlzTW92ZU1lbW9yeSgmZGF0YSwgJmVGdXNlQ3RybFN0cnVjLCA0KTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRUZVU0VfQ1RSTCwgZGF0YSk7Ci0KLQkJLy9TdGVwMS4yLjMuIFBvbGxpbmcgRUZTUk9NX0tJQ0soMHg1ODAsIGJpdDMwKSB1bnRpbCBpdCBiZWNvbWUgMCBhZ2Fpbi4KLQkJaSA9IDA7Ci0JCXdoaWxlKGkgPCAxMDApCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgKFBVSU5UMzIpICZlRnVzZUN0cmxTdHJ1Yyk7Ci0KLQkJCWlmKGVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID09IDApCi0JCQkJYnJlYWs7Ci0JCQlSVE1QdXNlY0RlbGF5KDIpOwotCQkJaSsrOwotCQl9Ci0KLQkJLy9TdGVwMS4yLjQuIFJlYWQgMTYtYnl0ZSBvZiBkYXRhIGZyb20gRUZVU0VfREFUQTAtMyAoMHg1OUMtMHg1OTApCi0JCWVmdXNlRGF0YU9mZnNldCA9ICBFRlVTRV9EQVRBMzsKLQkJZm9yKGk9MDsgaTwgNDsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIGVmdXNlRGF0YU9mZnNldCwgKFBVSU5UMzIpICZidWZmZXJbaV0pOwotCQkJZWZ1c2VEYXRhT2Zmc2V0IC09ICA0OwotCQl9Ci0JCS8vU3RlcDEuMi41LiBDaGVjayBpZiB0aGUgZGF0YSBvZiBlZnVzZSBhbmQgdGhlIHdyaXRpbmcgZGF0YSBhcmUgdGhlIHNhbWUuCi0JCWZvcihpID0wOyBpPDQ7IGkrKykKLQkJewotCQkJdGVtcGJ1ZmZlcj0oKHBEYXRhWzIqaSsxXTw8MTYpJjB4ZmZmZjAwMDApfHBEYXRhWzIqaV07Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJidWZmZXJbJWRdPSV4LHBEYXRhWyVkXT0leCxwRGF0YVslZF09JXgsdGVtcGJ1ZmZlcj0leFxuIixpLGJ1ZmZlcltpXSwyKmkscERhdGFbMippXSwyKmkrMSxwRGF0YVsyKmkrMV0sdGVtcGJ1ZmZlcikpOwotCi0JCQlpZigoKGJ1ZmZlcltpXSYweGZmZmYwMDAwKT09KHBEYXRhWzIqaSsxXTw8MTYpKSYmKChidWZmZXJbaV0mMHhmZmZmKT09cERhdGFbMippXSkpCi0JCQkJYk5vdFdyaXRlJj1UUlVFOwotCQkJZWxzZQotCQkJewotCQkJCWJOb3RXcml0ZSY9RkFMU0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYoIWJOb3RXcml0ZSkKLQkJewotCQlwcmludGsoIlRoZSBkYXRhIGlzIG5vdCB0aGUgc2FtZVxuIik7Ci0KLQkJCWZvcihpID0wOyBpPDg7IGkrKykKLQkJCXsKLQkJCQlhZGRyID0gQmxrTnVtICogMHgxMCA7Ci0KLQkJCQlJbkJ1ZlswXSA9IGFkZHIrMippOwotCQkJCUluQnVmWzFdID0gMjsKLQkJCQlJbkJ1ZlsyXSA9IHBEYXRhW2ldOwotCi0JCQkJZUZ1c2VXcml0ZVBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA2LCBOVUxMLCAyKTsKLQkJCX0KLQotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBUUlVFOwotCSAgICAgfQotCi0KLQotCQkvL1N0ZXAgMi4gV3JpdGUgbWFwcGluZyB0YWJsZQotCQlhZGRyID0gRUZVU0VfVVNBR0VfTUFQX1NUQVJUK0Jsa051bTsKLQotCQl0bXBhZGRyID0gYWRkcjsKLQotCQlpZihhZGRyICUgMiAhPSAwKQotCQkJYWRkciA9IGFkZHIgLTE7Ci0JCUluQnVmWzBdID0gYWRkcjsKLQkJSW5CdWZbMV0gPSAyOwotCi0JCS8vY29udmVydCB0aGUgYWRkcmVzcyBmcm9tIDEwIHRvIDggYml0ICggYml0NywgNiA9IHBhcml0eSBhbmQgYml0NSB+IDAgPSBiaXQ5fjQpLCBhbmQgd3JpdGUgdG8gbG9naWNhbCBtYXAgZW50cnkKLQkJdG1wT2Zmc2V0ID0gT2Zmc2V0OwotCQl0bXBPZmZzZXQgPj49IDQ7Ci0JCXRtcE9mZnNldCB8PSAoKH4oKHRtcE9mZnNldCAmIDB4MDEpIF4gKCB0bXBPZmZzZXQgPj4gMSAmIDB4MDEpIF4gICh0bXBPZmZzZXQgPj4gMiAmIDB4MDEpIF4gICh0bXBPZmZzZXQgPj4gMyAmIDB4MDEpKSkgPDwgNikgJiAweDQwOwotCQl0bXBPZmZzZXQgfD0gKCh+KCAodG1wT2Zmc2V0ID4+IDIgJiAweDAxKSBeICh0bXBPZmZzZXQgPj4gMyAmIDB4MDEpIF4gKHRtcE9mZnNldCA+PiA0ICYgMHgwMSkgXiAoIHRtcE9mZnNldCA+PiA1ICYgMHgwMSkpKSA8PCA3KSAmIDB4ODA7Ci0KLQkJLy8gd3JpdGUgdGhlIGxvZ2ljYWwgYWRkcmVzcwotCQlpZih0bXBhZGRyJTIgIT0gMCkKLQkJCUluQnVmWzJdID0gdG1wT2Zmc2V0PDw4OwotCQllbHNlCi0JCQlJbkJ1ZlsyXSA9IHRtcE9mZnNldDsKLQotCQllRnVzZVdyaXRlUGh5c2ljYWwocEFkLCZJbkJ1ZlswXSwgNiwgTlVMTCwgMCk7Ci0KLQkJLy9TdGVwIDMuIENvbXBhcmUgZGF0YSBpZiBub3QgdGhlIHNhbWUsIGludmFsaWRhdGUgdGhlIG1hcHBpbmcgZW50cnksIHRoZW4gcmUtd3JpdGUgdGhlIGRhdGEgdW50aWwgRS1mdXNlIGlzIGV4aGF1c3RlZAotCQliV3JpdGVTdWNjZXNzID0gVFJVRTsKLQkJZm9yKGkgPTA7IGk8ODsgaSsrKQotCQl7Ci0JCQlhZGRyID0gQmxrTnVtICogMHgxMCA7Ci0KLQkJCUluQnVmWzBdID0gYWRkcisyKmk7Ci0JCQlJbkJ1ZlsxXSA9IDI7Ci0JCQlJbkJ1ZlsyXSA9IDB4MDsKLQotCQkJZUZ1c2VSZWFkUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDQsICZJbkJ1ZlsyXSwgMik7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJhZGRyPSV4LCBidWZmZXJbaV09JXgsSW5CdWZbMl09JXhcbiIsSW5CdWZbMF0scERhdGFbaV0sSW5CdWZbMl0pKTsKLQkJCWlmKHBEYXRhW2ldICE9IEluQnVmWzJdKQotCQkJewotCQkJCWJXcml0ZVN1Y2Nlc3MgPSBGQUxTRTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vU3RlcCA0LiBpbnZsaWRhdGUgbWFwcGluZyBlbnRyeSBhbmQgZmluZCBhIGZyZWUgbWFwcGluZyBlbnRyeSBpZiBub3Qgc3VjY2VlZAotCi0JCWlmICghYldyaXRlU3VjY2VzcyYmTG9vcDwyKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbjo6Tm90IGJXcml0ZVN1Y2Nlc3MgQmxrTnVtID0gJWRcbiIsIEJsa051bSkpOwotCi0JCQkvLyB0aGUgb2Zmc2V0IG9mIGN1cnJlbnQgbWFwcGluZyBlbnRyeQotCQkJYWRkciA9IEVGVVNFX1VTQUdFX01BUF9TVEFSVCtCbGtOdW07Ci0KLQkJCS8vZmluZCBhIG5ldyBtYXBwaW5nIGVudHJ5Ci0JCQlCbGtOdW0gPSAweGZmZmY7Ci0JCQlmb3IgKGk9RUZVU0VfVVNBR0VfTUFQX1NUQVJUOyBpPD1FRlVTRV9VU0FHRV9NQVBfRU5EOyBpKz0yKQotCQkJewotCQkJCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCwgaSwgMiwgJkxvZ2ljYWxBZGRyZXNzKTsKLQkJCQlpZiggKExvZ2ljYWxBZGRyZXNzICYgMHhmZikgPT0gMCkKLQkJCQl7Ci0JCQkJCUJsa051bSA9IGktRUZVU0VfVVNBR0VfTUFQX1NUQVJUOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZSBpZigoIChMb2dpY2FsQWRkcmVzcyA+PiA4KSAmIDB4ZmYpID09IDApCi0JCQkJewotCQkJCQlpZiAoaSAhPSBFRlVTRV9VU0FHRV9NQVBfRU5EKQotCQkJCQl7Ci0JCQkJCQlCbGtOdW0gPSBpKzEtRUZVU0VfVVNBR0VfTUFQX1NUQVJUOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnNGcm9tQmluOjpOb3QgYldyaXRlU3VjY2VzcyBuZXcgQmxrTnVtID0gJWRcbiIsIEJsa051bSkpOwotCQkJaWYoQmxrTnVtID09IDB4ZmZmZikKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbjogb3V0IG9mIGZyZWUgRS1mdXNlIHNwYWNlISEhXG4iKSk7Ci0JCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotCi0JCQkvL2ludmFsaWRhdGUgdGhlIG9yaWdpbmFsIG1hcHBpbmcgZW50cnkgaWYgbmV3IGVudHJ5IGlzIG5vdCBmb3VuZAotCQkJdG1wYWRkciA9IGFkZHI7Ci0KLQkJCWlmKGFkZHIgJSAyICE9IDApCi0JCQkJYWRkciA9IGFkZHIgLTE7Ci0JCQlJbkJ1ZlswXSA9IGFkZHI7Ci0JCQlJbkJ1ZlsxXSA9IDI7Ci0KLQkJCWVGdXNlUmVhZFBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA0LCAmSW5CdWZbMl0sIDIpOwotCi0JCQkvLyB3cml0ZSB0aGUgbG9naWNhbCBhZGRyZXNzCi0JCQlpZih0bXBhZGRyJTIgIT0gMCkKLQkJCXsKLQkJCQkvLyBJbnZhbGlkYXRlIHRoZSBoaWdoIGJ5dGUKLQkJCQlmb3IgKGk9ODsgaTwxNTsgaSsrKQotCQkJCXsKLQkJCQkJaWYoICggKEluQnVmWzJdID4+IGkpICYgMHgwMSkgPT0gMCkKLQkJCQkJewotCQkJCQkJSW5CdWZbMl0gfD0gKDB4MSA8PGkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gaW52YWxpZGF0ZSB0aGUgbG93IGJ5dGUKLQkJCQlmb3IgKGk9MDsgaTw4OyBpKyspCi0JCQkJewotCQkJCQlpZiggKCAoSW5CdWZbMl0gPj4gaSkgJiAweDAxKSA9PSAwKQotCQkJCQl7Ci0JCQkJCQlJbkJ1ZlsyXSB8PSAoMHgxIDw8aSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVGdXNlV3JpdGVQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNiwgTlVMTCwgMCk7Ci0JCX0KLQotCX0KLQl3aGlsZSghYldyaXRlU3VjY2VzcyYmTG9vcDwyKTsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9maXJtd2FyZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZmlybXdhcmUuaAppbmRleCBlNzI5OTZmLi4yZmVjZDMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9maXJtd2FyZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Zpcm13YXJlLmgKQEAgLTQzLDcgKzQzLDcgQEAKIC8qIEFVVE8gR0VOIFBMRUFTRSBETyBOT1QgTU9ESUZZIElUICovCiAKIAotVUNIQVIgRmlybXdhcmVJbWFnZSBbXSA9IHsKK3U4IEZpcm13YXJlSW1hZ2VfMjg2MCBbXSA9IHsKIDB4MDIsIDB4MDMsIDB4NWUsIDB4MDIsIDB4MDIsIDB4YjEsIDB4MjIsIDB4MjIsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDIsIDB4MDEsIDB4ODIsIDB4ZmYsIDB4ZmYsCiAweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDAwLCAweDFlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDAxLCAweDMzLCAweGMwLCAweGUwLAogMHhjMCwgMHhmMCwgMHhjMCwgMHg4MywgMHhjMCwgMHg4MiwgMHhjMCwgMHhkMCwgMHg3NSwgMHhkMCwgMHgxOCwgMHhjMiwgMHhhZiwgMHgzMCwgMHg0NSwgMHgwMywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Zpcm13YXJlXzMwNzAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Zpcm13YXJlXzMwNzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzEwZDQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZmlybXdhcmVfMzA3MC5oCkBAIC0wLDAgKzEsNTE3IEBACisvKiBBVVRPIEdFTiBQTEVBU0UgRE8gTk9UIE1PRElGWSBJVCAqLworLyogQVVUTyBHRU4gUExFQVNFIERPIE5PVCBNT0RJRlkgSVQgKi8KKworCit1OCBGaXJtd2FyZUltYWdlXzMwNzAgW10gPSB7CisweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDEwLCAweDI4LCAweDAyLCAweDEwLCAweDMyLCAweDAyLCAweDEwLCAweDc4LCAweDAyLCAweDEzLCAweDFmLCAweDAyLAorMHgxMywgMHgyMCwgMHgwMiwgMHgxMywgMHgzZiwgMHgwMiwgMHgxMywgMHg0NCwgMHgxMiwgMHgxMywgMHg0MCwgMHgyMiwgMHgwMiwgMHgxNywgMHhhZSwgMHgwMiwKKzB4MTgsIDB4ZDIsIDB4MDIsIDB4MTQsIDB4M2QsIDB4MDIsIDB4MTMsIDB4NzgsIDB4MzAsIDB4MDUsIDB4MDYsIDB4MjAsIDB4MGQsIDB4MDMsIDB4MTIsIDB4MTksCisweDk1LCAweDIyLCAweDkwLCAweDAxLCAweDhjLCAweGUwLCAweDMwLCAweGUzLCAweDFiLCAweGU1LCAweDRjLCAweDMwLCAweGUwLCAweDA0LCAweDdmLCAweDQwLAorMHg4MCwgMHgwMiwgMHg3ZiwgMHgwMCwgMHg5MCwgMHgxMCwgMHgyZiwgMHhlZiwgMHhmMCwgMHg5MCwgMHgwMSwgMHg4YywgMHg3NCwgMHgwOCwgMHhmMCwgMHhlNCwKKzB4OTAsIDB4MDEsIDB4YTcsIDB4ZjAsIDB4OTAsIDB4MDEsIDB4OGMsIDB4ZTAsIDB4MzAsIDB4ZTAsIDB4MWMsIDB4OTAsIDB4MDEsIDB4ODAsIDB4ZTAsIDB4YjQsCisweDAyLCAweDE1LCAweGEzLCAweGUwLCAweGI0LCAweDAxLCAweDEwLCAweDkwLCAweDAxLCAweDg0LCAweGUwLCAweGI0LCAweDgxLCAweDA5LCAweDkwLCAweDAxLAorMHg4YywgMHg3NCwgMHgwMSwgMHhmMCwgMHgxMiwgMHgwZCwgMHhjOCwgMHgyMiwgMHg5MCwgMHgwNCwgMHgxNCwgMHhlMCwgMHgyMCwgMHhlNywgMHgwMywgMHgwMiwKKzB4MTMsIDB4MWUsIDB4OTAsIDB4NzAsIDB4MTIsIDB4ZTAsIDB4ZjUsIDB4NTYsIDB4OTAsIDB4MDQsIDB4MDQsIDB4ZTAsIDB4MTIsIDB4MGEsIDB4OWQsIDB4MTAsCisweGQ5LCAweDMxLCAweDEwLCAweGJkLCAweDM2LCAweDExLCAweDAyLCAweDUwLCAweDExLCAweDM5LCAweDUxLCAweDExLCAweDQyLCAweDUyLCAweDExLCAweDQyLAorMHg1MywgMHgxMSwgMHg0MiwgMHg1NCwgMHgxMSwgMHg4MywgMHg1NSwgMHgxMSwgMHhkMiwgMHg1NiwgMHgxMiwgMHgyNSwgMHg3MCwgMHgxMiwgMHg1MCwgMHg3MSwKKzB4MTIsIDB4N2UsIDB4NzIsIDB4MTIsIDB4ZDUsIDB4NzMsIDB4MTIsIDB4ZjYsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MWUsIDB4OTAsIDB4NzAsIDB4MTEsCisweGUwLCAweGY1LCAweDNjLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU1LCAweDU2LAorMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMywgMHgxZSwgMHgwMiwgMHgxMywgMHgxNywgMHgyMCwgMHgwMiwgMHgwMywgMHgzMCwgMHgwMywgMHgxZCwgMHg3ZCwKKzB4MDIsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsCisweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEzLCAweDFlLCAweDAyLCAweDEzLCAweDE3LCAweDg1LCAweDU2LCAweDQxLCAweGQyLAorMHgwMiwgMHgyMiwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHg1NCwgMHg3ZiwgMHhmZiwgMHhiZiwgMHgwYSwgMHgwZCwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwKKzB4YjQsIDB4MDgsIDB4MDYsIDB4NzUsIDB4NGUsIDB4MDEsIDB4NzUsIDB4NGYsIDB4ODQsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4NTQsIDB4N2YsIDB4ZmYsCisweGJmLCAweDAyLCAweDEyLCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweDY0LCAweDA4LCAweDYwLCAweDA0LCAweGUwLCAweGI0LCAweDIwLCAweDA2LCAweDc1LAorMHg0ZSwgMHgwMywgMHg3NSwgMHg0ZiwgMHgyMCwgMHhlNCwgMHhmNSwgMHgyNywgMHgyMiwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHgyNCwgMHhmZiwgMHg5MiwKKzB4NDcsIDB4MjIsIDB4OTAsIDB4MDQsIDB4MDQsIDB4ZTAsIDB4MjUsIDB4ZTAsIDB4MjQsIDB4NWQsIDB4ZjUsIDB4NTcsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsCisweGZmLCAweDc0LCAweDQ3LCAweDI1LCAweDU3LCAweGY4LCAweGM2LCAweGVmLCAweGM2LCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweGZmLCAweDc0LCAweDQ4LAorMHgyNSwgMHg1NywgMHhmOCwgMHhjNiwgMHhlZiwgMHhjNiwgMHhlNCwgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHg5MCwgMHgwNCwgMHgxNCwKKzB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MTMsIDB4MWUsCisweDAyLCAweDEzLCAweDE3LCAweGU1LCAweDQ3LCAweDY0LCAweDA3LCAweDYwLCAweDFkLCAweGU1LCAweDQ3LCAweDY0LCAweDA4LCAweDYwLCAweDE3LCAweGU1LAorMHg0NywgMHg2NCwgMHgwOSwgMHg2MCwgMHgxMSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwYSwgMHg2MCwgMHgwYiwgMHhlNSwgMHg0NywgMHg2NCwgMHgwYiwgMHg2MCwKKzB4MDUsIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MGMsIDB4MDgsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4M2EsIDB4ZTUsIDB4NDcsCisweGI0LCAweDA5LCAweDA4LCAweGU1LCAweDNhLCAweGI0LCAweDAzLCAweDAzLCAweGU0LCAweGY1LCAweDQ2LCAweGU1LCAweDQ3LCAweGI0LCAweDBhLCAweDA4LAorMHhlNSwgMHgzYSwgMHhiNCwgMHgwMSwgMHgwMywgMHhlNCwgMHhmNSwgMHg0NiwgMHhlNCwgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHhkMiwKKzB4MDQsIDB4MjIsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4ZjQsIDB4ZmYsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4NWYsIDB4ZmYsIDB4OTAsIDB4NzAsCisweDExLCAweGUwLCAweDU1LCAweDI3LCAweDRmLCAweDkwLCAweDcwLCAweDE4LCAweGYwLCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweDkwLCAweDcwLCAweDE5LAorMHhmMCwgMHhlNCwgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHgzMCwgMHgxNSwgMHgwMywgMHhkMiwgMHgxNCwgMHgyMiwgMHg5MCwgMHg3MCwKKzB4MTgsIDB4ZTAsIDB4ZjUsIDB4MjcsIDB4OTAsIDB4MDIsIDB4MjksIDB4ZTAsIDB4ZmYsIDB4OTAsIDB4NzAsIDB4MTksIDB4ZTAsIDB4ZmUsIDB4ZWYsIDB4NWUsCisweDkwLCAweDAyLCAweDI5LCAweGYwLCAweDMwLCAweDQ3LCAweDA0LCAweGFmLCAweDI3LCAweDgwLCAweDA0LCAweGU1LCAweDI3LCAweGY0LCAweGZmLCAweDkwLAorMHgwMiwgMHgyOCwgMHhlZiwgMHhmMCwgMHgyMiwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmZSwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHhmZCwgMHhlZCwKKzB4ZjgsIDB4ZTYsIDB4ZjUsIDB4NTcsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsCisweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEzLCAweDFlLCAweDAyLCAweDEzLCAweDE3LAorMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmZSwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHhmZCwgMHhlZCwgMHhmNSwgMHg4MiwgMHg4ZSwgMHg4MywgMHhlMCwKKzB4ZjUsIDB4NTcsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsCisweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEzLCAweDFlLCAweDAyLCAweDEzLCAweDE3LCAweDkwLCAweDEwLAorMHgwMCwgMHhlMCwgMHhmNSwgMHg1NywgMHg5MCwgMHgxMCwgMHgwMiwgMHhlMCwgMHhmNSwgMHg1OCwgMHhhMywgMHhlMCwgMHhmNSwgMHg1OSwgMHhlNSwgMHg1OCwKKzB4YjQsIDB4NzAsIDB4MWUsIDB4ZTUsIDB4NTksIDB4YjQsIDB4MzAsIDB4MTksIDB4OTAsIDB4MDUsIDB4MDgsIDB4ZTAsIDB4NDQsIDB4MDEsIDB4ZjAsIDB4ZmQsCisweDkwLCAweDA1LCAweDA1LCAweGUwLCAweDU0LCAweGZiLCAweGYwLCAweDQ0LCAweDA0LCAweGYwLCAweGVkLCAweDU0LCAweGZlLCAweDkwLCAweDA1LCAweDA4LAorMHhmMCwgMHhlNCwgMHhmNSwgMHg0ZSwgMHhmNSwgMHg0ZiwgMHg3NSwgMHgzYSwgMHhmZiwgMHg3NSwgMHgzYywgMHhmZiwgMHhhZCwgMHg1NywgMHhhZiwgMHg1NiwKKzB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsCisweGY0LCAweDYwLCAweDRiLCAweDgwLCAweDQyLCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDI0LCAweGZmLCAweDkyLCAweDkzLCAweGU0LCAweGZkLCAweGFmLAorMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwKKzB4NTYsIDB4ZjQsIDB4NjAsIDB4MmEsIDB4ODAsIDB4MjEsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4NGEsIDB4ZDIsIDB4MDUsCisweGFkLCAweDU3LCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweDkxLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLAorMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg2MCwgMHgwNywgMHg5MCwgMHg3MCwgMHgyNSwgMHhlMCwgMHg0NCwgMHgwMSwgMHhmMCwgMHgyMiwgMHgyMiwKKzB4ZTUsIDB4NTMsIDB4NzAsIDB4MWEsIDB4MzAsIDB4NjAsIDB4MDksIDB4YjIsIDB4NGQsIDB4MzAsIDB4NGQsIDB4MDQsIDB4MDUsIDB4NDYsIDB4YzIsIDB4MDQsCisweGU1LCAweDRmLCAweDQ1LCAweDRlLCAweDYwLCAweDA4LCAweGU1LCAweDRmLCAweDE1LCAweDRmLCAweDcwLCAweDAyLCAweDE1LCAweDRlLCAweDIyLCAweDIyLAorMHhjMiwgMHg0MiwgMHhkMywgMHgyMiwgMHgzMCwgMHgxNCwgMHgzMCwgMHg5MCwgMHg3MCwgMHgxOSwgMHhlMCwgMHg1NSwgMHgyNywgMHhmZiwgMHg5MCwgMHg3MCwKKzB4MTgsIDB4ZTAsIDB4NGYsIDB4ZjUsIDB4MjcsIDB4OTAsIDB4MDIsIDB4MjksIDB4ZTAsIDB4ZmYsIDB4OTAsIDB4NzAsIDB4MTksIDB4ZTAsIDB4ZmUsIDB4ZWYsCisweDVlLCAweDkwLCAweDAyLCAweDI5LCAweGYwLCAweDMwLCAweDQ3LCAweDA0LCAweGFmLCAweDI3LCAweDgwLCAweDA0LCAweGU1LCAweDI3LCAweGY0LCAweGZmLAorMHg5MCwgMHgwMiwgMHgyOCwgMHhlZiwgMHhmMCwgMHhjMiwgMHgxNCwgMHgyMiwgMHhjMiwgMHg0YiwgMHhjMiwgMHg0YywgMHhlNSwgMHg0NCwgMHgxMiwgMHgwYSwKKzB4OWQsIDB4MTMsIDB4OWEsIDB4MDAsIDB4MTQsIDB4MjgsIDB4MDQsIDB4MTQsIDB4MjQsIDB4MDgsIDB4MTQsIDB4MDQsIDB4MTAsIDB4MTMsIDB4YWUsIDB4MjAsCisweDEzLCAweGNlLCAweDYwLCAweDEzLCAweGRmLCAweGEwLCAweDAwLCAweDAwLCAweDE0LCAweDJhLCAweDg1LCAweDQ4LCAweDQzLCAweDg1LCAweDRhLCAweDQyLAorMHg4NSwgMHg0YywgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg2MCwgMHgwMywgMHgwMiwgMHgxNCwgMHgyYSwgMHg4MCwgMHgxYiwgMHhlNSwgMHg0OCwKKzB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDMsIDB4ZTUsIDB4NGEsIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDIsIDB4ZTUsIDB4NGMsIDB4YzQsIDB4NTQsCisweDBmLCAweGY1LCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDcwLCAweDYxLCAweDUzLCAweDQzLCAweDBmLCAweDgwLCAweDVjLCAweDg1LCAweDQ5LAorMHg0MywgMHg4NSwgMHg0YiwgMHg0MiwgMHg4NSwgMHg0ZCwgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwgMHg0ZCwgMHg4MCwgMHgxYiwgMHhlNSwKKzB4NDksIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDMsIDB4ZTUsIDB4NGIsIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDIsIDB4ZTUsIDB4NGQsIDB4YzQsCisweDU0LCAweDBmLCAweGY1LCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDcwLCAweDMwLCAweGU1LCAweDQzLCAweDU0LCAweDBmLCAweDQ0LCAweDEwLAorMHhmNSwgMHg0MywgMHg4MCwgMHgyNiwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNCwgMHg2MCwgMHgwNSwgMHhlNSwgMHg0NywgMHhiNCwgMHgwNSwgMHgwNiwgMHg0MywKKzB4NWUsIDB4MDQsIDB4NzUsIDB4NDIsIDB4MDksIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDYsIDB4MTAsIDB4ZTUsIDB4NDMsIDB4NTQsIDB4MGYsIDB4NDQsIDB4MzAsCisweGY1LCAweDQzLCAweDgwLCAweDA2LCAweGQyLCAweDRiLCAweDgwLCAweDAyLCAweGQyLCAweDRjLCAweGU0LCAweGY1LCAweDI1LCAweGU1LCAweDQyLCAweGM0LAorMHg1NCwgMHhmMCwgMHhmZiwgMHhlNSwgMHg0MywgMHg1NCwgMHgwZiwgMHg0ZiwgMHhmNSwgMHg1ZiwgMHhkMiwgMHg2MCwgMHgyMiwgMHhkMiwgMHgxNSwgMHhlNSwKKzB4NDcsIDB4MjQsIDB4ZjUsIDB4NjAsIDB4MGIsIDB4MjQsIDB4Y2IsIDB4NjAsIDB4MDcsIDB4MjQsIDB4NDAsIDB4NzAsIDB4MDYsIDB4YzIsIDB4MTUsIDB4MjIsCisweDEyLCAweDE3LCAweDc5LCAweDEyLCAweDE0LCAweDVmLCAweGMyLCAweDE1LCAweGMyLCAweGFmLCAweGMyLCAweDA0LCAweGQyLCAweGFmLCAweDIyLCAweGMyLAorMHhhZiwgMHg5MCwgMHgwNCwgMHgxNCwgMHhlMCwgMHg1NCwgMHgwZSwgMHg2MCwgMHgwNCwgMHhkMiwgMHgxOCwgMHg4MCwgMHgwOCwgMHhlNSwgMHg0ZSwgMHg0NSwKKzB4NGYsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4MTgsIDB4ZDIsIDB4YWYsIDB4OTAsIDB4MDQsIDB4MTQsIDB4ZTAsIDB4YTIsIDB4ZTQsIDB4OTIsIDB4MTksIDB4NzQsCisweDFlLCAweGYwLCAweGU1LCAweDVmLCAweDU0LCAweDBmLCAweGY1LCAweDJkLCAweGU1LCAweDI1LCAweDcwLCAweDEzLCAweDMwLCAweDE4LCAweDA1LCAweGU1LAorMHg1ZiwgMHgyMCwgMHhlNSwgMHgwYiwgMHgzMCwgMHgxOSwgMHgxOSwgMHhlNSwgMHg1ZiwgMHg1NCwgMHgzMCwgMHhmZiwgMHhiZiwgMHgzMCwgMHgxMSwgMHhlNSwKKzB4MjUsIDB4NzAsIDB4MDUsIDB4NzUsIDB4MjUsIDB4MGMsIDB4ODAsIDB4MDIsIDB4MTUsIDB4MjUsIDB4ZDIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MGYsCisweGU1LCAweDVmLCAweDMwLCAweGU2LCAweDA2LCAweGMyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDA0LCAweGQyLCAweDZjLCAweGMyLCAweDZkLCAweGU1LAorMHg0NywgMHg2NCwgMHgwMywgMHg3MCwgMHgyMSwgMHgzMCwgMHg0YiwgMHgwNiwgMHhjMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg4MCwgMHgxOCwgMHhlNSwgMHgyNSwKKzB4NzAsIDB4MDMsIDB4MzAsIDB4NGMsIDB4MTEsIDB4YzIsIDB4NGMsIDB4ZTUsIDB4MjUsIDB4NzAsIDB4MDUsIDB4NzUsIDB4MjUsIDB4MDcsIDB4ODAsIDB4MDIsCisweDE1LCAweDI1LCAweGQyLCAweDZjLCAweGQyLCAweDZkLCAweGU1LCAweDQ3LCAweGI0LCAweDA5LCAweDE0LCAweGU1LCAweDQ0LCAweDIwLCAweGUzLCAweDBiLAorMHhlNSwgMHgzYSwgMHg2NCwgMHgwMiwgMHg2MCwgMHgwNSwgMHhlNSwgMHgzYSwgMHhiNCwgMHgwMywgMHgwNCwgMHhjMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHhlNSwKKzB4NDcsIDB4YjQsIDB4MGEsIDB4MTMsIDB4ZTUsIDB4M2EsIDB4YjQsIDB4MDEsIDB4MDYsIDB4YzIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MDgsIDB4ZTUsCisweDNhLCAweDcwLCAweDA0LCAweGQyLCAweDZjLCAweGMyLCAweDZkLCAweDIwLCAweDY5LCAweDA3LCAweGU1LCAweDVlLCAweDIwLCAweGUwLCAweDAyLCAweGIyLAorMHg2OCwgMHgyMCwgMHg2YiwgMHgwNywgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMSwgMHgwMiwgMHhiMiwgMHg2YSwgMHgyMCwgMHg2ZCwgMHgwNywgMHhlNSwgMHg1ZSwKKzB4MjAsIDB4ZTIsIDB4MDIsIDB4YjIsIDB4NmMsIDB4NzUsIDB4MmUsIDB4NDAsIDB4MjAsIDB4NjksIDB4MDQsIDB4YTIsIDB4NjgsIDB4ODAsIDB4MjYsIDB4MzAsCisweDY4LCAweDA2LCAweGU1LCAweDQ2LCAweGEyLCAweGUyLCAweDgwLCAweDFkLCAweGU1LCAweDVlLCAweDIwLCAweGUyLCAweDA0LCAweDdmLCAweDAxLCAweDgwLAorMHgwMiwgMHg3ZiwgMHgwMCwgMHhlNSwgMHg0NiwgMHg1NCwgMHhmMCwgMHhmZSwgMHhiZSwgMHhmMCwgMHgwNCwgMHg3ZSwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZSwKKzB4MDAsIDB4ZWUsIDB4NmYsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4NzMsIDB4OTIsIDB4NzIsIDB4MjAsIDB4NmIsIDB4MDQsIDB4YTIsIDB4NmEsIDB4ODAsIDB4MjYsCisweDMwLCAweDZhLCAweDA2LCAweGU1LCAweDQ2LCAweGEyLCAweGUyLCAweDgwLCAweDFkLCAweGU1LCAweDVlLCAweDIwLCAweGUwLCAweDA0LCAweDdmLCAweDAxLAorMHg4MCwgMHgwMiwgMHg3ZiwgMHgwMCwgMHhlNSwgMHg0NiwgMHg1NCwgMHhmMCwgMHhmZSwgMHhiZSwgMHhmMCwgMHgwNCwgMHg3ZSwgMHgwMSwgMHg4MCwgMHgwMiwKKzB4N2UsIDB4MDAsIDB4ZWUsIDB4NmYsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4NzUsIDB4OTIsIDB4NzQsIDB4MjAsIDB4NmQsIDB4MDQsIDB4YTIsIDB4NmMsIDB4ODAsCisweDI2LCAweGU1LCAweDQ3LCAweDY0LCAweDBhLCAweDcwLCAweDIyLCAweDMwLCAweDZjLCAweDA2LCAweGU1LCAweDQ2LCAweGEyLCAweGUzLCAweDgwLCAweDE3LAorMHhlNSwgMHgzYSwgMHhiNCwgMHgwMSwgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMywgMHg4MCwgMHgzNCwgMHhlNSwgMHg0NiwgMHgyMCwgMHhlNCwgMHgwMywKKzB4MzAsIDB4ZTUsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4ODAsIDB4MjYsIDB4MzAsIDB4NmMsIDB4MDYsIDB4ZTUsIDB4NDYsIDB4YTIsIDB4ZTIsCisweDgwLCAweDFkLCAweGU1LCAweDVlLCAweDIwLCAweGUxLCAweDA0LCAweDdmLCAweDAxLCAweDgwLCAweDAyLCAweDdmLCAweDAwLCAweGU1LCAweDQ2LCAweDU0LAorMHhmMCwgMHhmZSwgMHhiZSwgMHhmMCwgMHgwNCwgMHg3ZSwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZSwgMHgwMCwgMHhlZSwgMHg2ZiwgMHgyNCwgMHhmZiwgMHg5MiwKKzB4NzEsIDB4OTIsIDB4NzAsIDB4OTAsIDB4MTAsIDB4MDAsIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MmMsIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MDMsIDB4ZTAsIDB4YzMsCisweDk0LCAweDMwLCAweDQwLCAweDE0LCAweGEyLCAweDcxLCAweDkyLCAweDc3LCAweGEyLCAweDcwLCAweDkyLCAweDc2LCAweGU1LCAweDJlLCAweDEzLCAweDEzLAorMHg1NCwgMHgzZiwgMHhmNSwgMHgyZSwgMHhjMiwgMHg3NywgMHhkMiwgMHg3NiwgMHg5MCwgMHgxMCwgMHgyZiwgMHhlNSwgMHgyZSwgMHhmMCwgMHhlNSwgMHg0NywKKzB4NjQsIDB4MDYsIDB4NzAsIDB4MzksIDB4OTAsIDB4MDIsIDB4MjksIDB4ZTAsIDB4NTQsIDB4ZmUsIDB4ZjAsIDB4ZTUsIDB4NDMsIDB4YzQsIDB4NTQsIDB4MGYsCisweDE0LCAweDYwLCAweDBjLCAweDI0LCAweGZlLCAweDYwLCAweDBjLCAweDI0LCAweDAzLCAweDcwLCAweDEzLCAweGMyLCAweDM4LCAweDgwLCAweDBmLCAweGQyLAorMHgzOCwgMHg4MCwgMHgwYiwgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMiwgMHgwMywgMHhkMywgMHg4MCwgMHgwMSwgMHhjMywgMHg5MiwgMHgzOCwgMHgzMCwgMHg0NywKKzB4MDUsIDB4YWYsIDB4MjcsIDB4MDIsIDB4MTcsIDB4NzMsIDB4ZTUsIDB4MjcsIDB4ZjQsIDB4ZmYsIDB4MDIsIDB4MTcsIDB4NzMsIDB4ZTUsIDB4NDcsIDB4NjQsCisweDA3LCAweDYwLCAweDBmLCAweGU1LCAweDQ3LCAweDY0LCAweDA4LCAweDYwLCAweDA5LCAweGU1LCAweDQ3LCAweDY0LCAweDA5LCAweDYwLCAweDAzLCAweDAyLAorMHgxNiwgMHhmMiwgMHg5MCwgMHgwMiwgMHgyOSwgMHhlMCwgMHg1NCwgMHhmYywgMHhmMCwgMHhlNSwgMHgzYSwgMHgxNCwgMHg2MCwgMHgyMiwgMHgxNCwgMHg2MCwKKzB4MjUsIDB4MTQsIDB4NjAsIDB4MmQsIDB4MjQsIDB4ZmMsIDB4NjAsIDB4NDksIDB4MjQsIDB4ZjksIDB4NjAsIDB4MTQsIDB4MjQsIDB4MGUsIDB4NzAsIDB4NTAsCisweGU1LCAweDQ2LCAweDEzLCAweDEzLCAweDU0LCAweDNmLCAweDc1LCAweGYwLCAweDAzLCAweDg0LCAweGU1LCAweGYwLCAweDI0LCAweGZmLCAweDgwLCAweDNhLAorMHhkMiwgMHgzOSwgMHhjMiwgMHgzOCwgMHg4MCwgMHgzZSwgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMiwgMHgwMywgMHhkMywgMHg4MCwgMHgxZCwgMHhjMywgMHg4MCwKKzB4MWEsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MGQsIDB4NTQsIDB4MzgsIDB4YzMsIDB4OTQsIDB4MzAsIDB4NTAsIDB4MDYsIDB4N2UsIDB4MDAsIDB4N2YsCisweDAxLCAweDgwLCAweDA0LCAweDdlLCAweDAwLCAweDdmLCAweDAwLCAweGVlLCAweDRmLCAweDI0LCAweGZmLCAweDkyLCAweDM4LCAweGMyLCAweDM5LCAweDgwLAorMHgxMywgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMiwgMHgwMywgMHhkMywgMHg4MCwgMHgwMSwgMHhjMywgMHg5MiwgMHgzOSwgMHhjMiwgMHgzOCwgMHg4MCwgMHgwNCwKKzB4YzIsIDB4MzgsIDB4YzIsIDB4MzksIDB4MzAsIDB4NDcsIDB4MDQsIDB4YWYsIDB4MjcsIDB4ODAsIDB4MDQsIDB4ZTUsIDB4MjcsIDB4ZjQsIDB4ZmYsIDB4MDIsCisweDE3LCAweDczLCAweGU1LCAweDQ3LCAweDY0LCAweDBjLCAweDYwLCAweDA2LCAweGU1LCAweDQ3LCAweDY0LCAweDBiLCAweDcwLCAweDdhLCAweDkwLCAweDAyLAorMHgyOSwgMHhlMCwgMHg1NCwgMHhmZCwgMHhmMCwgMHhlNSwgMHgzYSwgMHgxNCwgMHg2MCwgMHgyMCwgMHgxNCwgMHg2MCwgMHgyMSwgMHgxNCwgMHg2MCwgMHgyYiwKKzB4MjQsIDB4ZmMsIDB4NjAsIDB4NDUsIDB4MjQsIDB4ZjksIDB4NjAsIDB4MTIsIDB4MjQsIDB4MGUsIDB4NzAsIDB4NGEsIDB4ZTUsIDB4NDYsIDB4MTMsIDB4MTMsCisweDU0LCAweDNmLCAweDc1LCAweGYwLCAweDAzLCAweDg0LCAweGU1LCAweGYwLCAweDgwLCAweDI5LCAweGQyLCAweDM5LCAweDgwLCAweDNhLCAweGU1LCAweDQ2LAorMHgzMCwgMHhlMiwgMHgwMywgMHhkMywgMHg4MCwgMHgwMSwgMHhjMywgMHg5MiwgMHgzOSwgMHg4MCwgMHgyZCwgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMiwgMHgwZCwKKzB4NTQsIDB4MzgsIDB4YzMsIDB4OTQsIDB4MzAsIDB4NTAsIDB4MDYsIDB4N2UsIDB4MDAsIDB4N2YsIDB4MDEsIDB4ODAsIDB4MDQsIDB4N2UsIDB4MDAsIDB4N2YsCisweDAwLCAweGVlLCAweDRmLCAweDI0LCAweGZmLCAweDkyLCAweDM5LCAweDgwLCAweDBmLCAweGU1LCAweDQ2LCAweDMwLCAweGUyLCAweDAzLCAweGQzLCAweDgwLAorMHgwMSwgMHhjMywgMHg5MiwgMHgzOSwgMHg4MCwgMHgwMiwgMHhjMiwgMHgzOSwgMHgzMCwgMHg0NywgMHgwNCwgMHhhZiwgMHgyNywgMHg4MCwgMHgwNCwgMHhlNSwKKzB4MjcsIDB4ZjQsIDB4ZmYsIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZWYsIDB4ZjAsIDB4MjIsIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MGIsIDB4MTAsIDB4OTAsIDB4MDIsCisweDI5LCAweGUwLCAweDU0LCAweGViLCAweGYwLCAweGU1LCAweDI3LCAweDU0LCAweGViLCAweDQ1LCAweDQ1LCAweGY1LCAweDI3LCAweDIyLCAweGU0LCAweDkwLAorMHgwMiwgMHgyOSwgMHhmMCwgMHgzMCwgMHg0NywgMHgwNCwgMHhhZiwgMHg0NSwgMHg4MCwgMHgwNCwgMHhlNSwgMHg0NSwgMHhmNCwgMHhmZiwgMHg5MCwgMHgwMiwKKzB4MjgsIDB4ZWYsIDB4ZjAsIDB4MjIsIDB4OGYsIDB4NTAsIDB4ZDIsIDB4NTksIDB4MjIsIDB4OGYsIDB4NTQsIDB4ZDIsIDB4NTgsIDB4MjIsIDB4ZTQsIDB4ZjUsCisweDYyLCAweGMyLCAweGFmLCAweGU1LCAweDUxLCAweDE0LCAweDYwLCAweDQ4LCAweDE0LCAweDYwLCAweDY2LCAweDI0LCAweDAyLCAweDYwLCAweDAzLCAweDAyLAorMHgxOCwgMHhiNiwgMHhkMiwgMHg1OSwgMHg3NSwgMHg1NSwgMHgwMSwgMHg5MCwgMHgwMiwgMHhhMiwgMHhlMCwgMHg1NCwgMHg3ZiwgMHhmMCwgMHhhMywgMHhlMCwKKzB4MjAsIDB4ZTcsIDB4MjMsIDB4OTAsIDB4MDQsIDB4MzQsIDB4ZTAsIDB4YjQsIDB4MDIsIDB4MWMsIDB4YTMsIDB4ZTAsIDB4YjQsIDB4MDIsIDB4MTcsIDB4YTMsCisweGUwLCAweGI0LCAweDAyLCAweDEyLCAweDdmLCAweDIwLCAweDEyLCAweDE3LCAweGE0LCAweDkwLCAweDEwLCAweDA0LCAweGUwLCAweDU0LCAweGYzLCAweGYwLAorMHg3NSwgMHg1MSwgMHgwMSwgMHgwMiwgMHgxOCwgMHhiNiwgMHhlNSwgMHg1MCwgMHg3MCwgMHgwNiwgMHg3NSwgMHg2MiwgMHgwMywgMHgwMiwgMHgxOCwgMHhiNiwKKzB4OTAsIDB4MTIsIDB4MDAsIDB4ZTAsIDB4NTQsIDB4MDMsIDB4NzAsIDB4MTIsIDB4N2YsIDB4MjAsIDB4MTIsIDB4MTcsIDB4YTQsIDB4OTAsIDB4MDIsIDB4YTIsCisweGUwLCAweDU0LCAweGJmLCAweGYwLCAweDc1LCAweDUxLCAweDAyLCAweDAyLCAweDE4LCAweGI2LCAweGU1LCAweDUwLCAweDcwLCAweDAzLCAweDAyLCAweDE4LAorMHhiMSwgMHg5MCwgMHgwMiwgMHhhMywgMHhlMCwgMHgzMCwgMHhlNiwgMHgwMywgMHgwMiwgMHgxOCwgMHhhZCwgMHg5MCwgMHgwNCwgMHgzNywgMHhlMCwgMHg2NCwKKzB4MjIsIDB4NzAsIDB4N2EsIDB4OTAsIDB4MDEsIDB4OGEsIDB4NzQsIDB4N2UsIDB4ZjAsIDB4OTAsIDB4MDEsIDB4OTYsIDB4ZjAsIDB4OTAsIDB4MTIsIDB4MDQsCisweDc0LCAweDBhLCAweGYwLCAweGU1LCAweDU4LCAweGI0LCAweDcyLCAweDE1LCAweGU1LCAweDU5LCAweGI0LCAweDM1LCAweDEwLCAweGU0LCAweDkwLCAweDA1LAorMHgwMCwgMHhmMCwgMHhhMywgMHg3NCwgMHgwOCwgMHhmMCwgMHhhMywgMHg3NCwgMHgwMSwgMHhmMCwgMHg3NCwgMHgwMywgMHhmMCwgMHg3ZiwgMHgwMSwgMHgxMiwKKzB4MGQsIDB4MmEsIDB4OTAsIDB4MTMsIDB4MjgsIDB4ZTAsIDB4NTQsIDB4ZjAsIDB4ZjAsIDB4YTMsIDB4ZTAsIDB4NTQsIDB4ZjAsIDB4ZjAsIDB4ZTUsIDB4NTksCisweGI0LCAweDM1LCAweDE0LCAweGU1LCAweDNjLCAweGY0LCAweDYwLCAweDA2LCAweGEzLCAweGUwLCAweDU0LCAweGYzLCAweDgwLCAweDE0LCAweDkwLCAweDEzLAorMHgyYSwgMHhlMCwgMHg1NCwgMHhmYiwgMHhmMCwgMHg4MCwgMHgxNCwgMHhlNSwgMHgzYywgMHhmNCwgMHg5MCwgMHgxMywgMHgyYSwgMHg2MCwgMHgwOCwgMHhlMCwKKzB4NTQsIDB4ZjIsIDB4NDUsIDB4M2MsIDB4ZjAsIDB4ODAsIDB4MDQsIDB4ZTAsIDB4NTQsIDB4ZmEsIDB4ZjAsIDB4OTAsIDB4MDQsIDB4MDEsIDB4ZTAsIDB4NTQsCisweGZkLCAweGYwLCAweDc1LCAweDYyLCAweDAxLCAweDc1LCAweDU1LCAweDAyLCAweGU0LCAweGY1LCAweDUxLCAweDgwLCAweDA5LCAweGU1LCAweDUwLCAweDcwLAorMHgwNSwgMHg3NSwgMHg2MiwgMHgwMywgMHhmNSwgMHg1MSwgMHhlNSwgMHg2MiwgMHg2MCwgMHgxNSwgMHhjMiwgMHgwMSwgMHhlNCwgMHhmNSwgMHg1MSwgMHhjMiwKKzB4NTksIDB4YWQsIDB4NjIsIDB4YWYsIDB4NDAsIDB4MTIsIDB4MTksIDB4NjEsIDB4ZTUsIDB4NjIsIDB4YjQsIDB4MDMsIDB4MDIsIDB4ZDIsIDB4MDMsIDB4ZDIsCisweGFmLCAweDIyLCAweGMyLCAweGFmLCAweDMwLCAweDAxLCAweDEyLCAweGU0LCAweDkwLCAweDAxLCAweDk2LCAweGYwLCAweGY1LCAweDUxLCAweGMyLCAweDU5LAorMHhjMiwgMHgwMSwgMHg3ZCwgMHgwMiwgMHhhZiwgMHg0MCwgMHgxMiwgMHgxOSwgMHg2MSwgMHhlNSwgMHg1MiwgMHgxNCwgMHg2MCwgMHgwOSwgMHgwNCwgMHg3MCwKKzB4NmQsIDB4NzUsIDB4NTIsIDB4MDEsIDB4NzUsIDB4NTUsIDB4MDMsIDB4OTAsIDB4MDQsIDB4MDEsIDB4ZTAsIDB4NDQsIDB4MGUsIDB4ZjAsIDB4OTAsIDB4MTMsCisweDI4LCAweGUwLCAweDQ0LCAweDBmLCAweGYwLCAweGEzLCAweGUwLCAweDQ0LCAweDBmLCAweGYwLCAweGEzLCAweGUwLCAweDQ0LCAweDA1LCAweGYwLCAweDkwLAorMHgxMiwgMHgwNCwgMHg3NCwgMHgwMywgMHhmMCwgMHhlNSwgMHg1OCwgMHhiNCwgMHg3MiwgMHgxNiwgMHhlNSwgMHg1OSwgMHhiNCwgMHgzNSwgMHgxMSwgMHg5MCwKKzB4MDUsIDB4MDAsIDB4NzQsIDB4ZTIsIDB4ZjAsIDB4YTMsIDB4NzQsIDB4MDgsIDB4ZjAsIDB4YTMsIDB4NzQsIDB4MDEsIDB4ZjAsIDB4NzQsIDB4MDMsIDB4ZjAsCisweDdmLCAweDAxLCAweDEyLCAweDBkLCAweDJhLCAweDkwLCAweDAyLCAweGEyLCAweGUwLCAweDQ0LCAweGMwLCAweGYwLCAweDkwLCAweDEwLCAweDA0LCAweGUwLAorMHg0NCwgMHgwYywgMHhmMCwgMHhlNCwgMHhmNSwgMHg1MiwgMHhmNSwgMHg1NSwgMHgzMCwgMHgwMiwgMHgwOSwgMHhjMiwgMHgwMiwgMHg3ZCwgMHgwMSwgMHhhZiwKKzB4NDEsIDB4MTIsIDB4MTksIDB4NjEsIDB4MzAsIDB4MDMsIDB4MDIsIDB4YzIsIDB4MDMsIDB4ZTQsIDB4OTAsIDB4MDEsIDB4OTYsIDB4ZjAsIDB4ZDIsIDB4YWYsCisweDIyLCAweGVmLCAweGY0LCAweDYwLCAweDJkLCAweGU0LCAweGZlLCAweDc0LCAweDE0LCAweDJlLCAweGY1LCAweDgyLCAweGU0LCAweDM0LCAweDcwLCAweGY1LAorMHg4MywgMHhlMCwgMHhiNCwgMHhmZiwgMHgxOSwgMHg3NCwgMHgxNCwgMHgyZSwgMHhmNSwgMHg4MiwgMHhlNCwgMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywgMHhlZiwKKzB4ZjAsIDB4NzQsIDB4MWMsIDB4MmUsIDB4ZjUsIDB4ODIsIDB4ZTQsIDB4MzQsIDB4NzAsIDB4ZjUsIDB4ODMsIDB4ZWQsIDB4ZjAsIDB4MjIsIDB4MGUsIDB4YmUsCisweDA0LCAweGQ1LCAweDIyLCAweDIyLCAweDIyLCAweDkwLCAweDcwLCAweDJhLCAweGUwLCAweDMwLCAweGUxLCAweDRkLCAweGMyLCAweGFmLCAweDkwLCAweDcwLAorMHgyOCwgMHhlMCwgMHg5MCwgMHgxMCwgMHgxYywgMHhmMCwgMHg5MCwgMHg3MCwgMHgyOSwgMHhlMCwgMHg5MCwgMHgxMCwgMHgxZCwgMHhmMCwgMHg5MCwgMHg3MCwKKzB4MmEsIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWUsIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MWMsIDB4ZTAsIDB4ZjUsIDB4NjIsIDB4OTAsIDB4MTAsIDB4MWUsIDB4ZTAsCisweDIwLCAweGUxLCAweGYzLCAweDkwLCAweDEwLCAweDFjLCAweGUwLCAweDkwLCAweDcwLCAweDI4LCAweGYwLCAweDkwLCAweDEwLCAweDFkLCAweGUwLCAweDkwLAorMHg3MCwgMHgyOSwgMHhmMCwgMHg5MCwgMHgxMCwgMHgxZSwgMHhlMCwgMHg5MCwgMHg3MCwgMHgyYSwgMHhmMCwgMHgzMCwgMHg0YSwgMHgwNywgMHg5MCwgMHg3MCwKKzB4MjQsIDB4ZTAsIDB4NDQsIDB4MDEsIDB4ZjAsIDB4YzIsIDB4MDUsIDB4ZDIsIDB4YWYsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDExLCAweDdiLCAweGM0LAorMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgxMCwgMHgyOCwgMHgwMiwgMHgxMCwgMHgzMiwgMHgwMiwgMHgxMCwgMHg3OCwgMHgwMiwgMHgxMywgMHgxZiwgMHgwMiwKKzB4MTMsIDB4MjAsIDB4MDIsIDB4MTMsIDB4M2YsIDB4MDIsIDB4MTMsIDB4NDQsIDB4MTIsIDB4MTMsIDB4NDAsIDB4MjIsIDB4MDIsIDB4MTcsIDB4YWUsIDB4MDIsCisweDE4LCAweGQyLCAweDAyLCAweDE0LCAweDNkLCAweDAyLCAweDEzLCAweDc4LCAweDMwLCAweDA1LCAweDA2LCAweDIwLCAweDBkLCAweDAzLCAweDEyLCAweDE5LAorMHg5NSwgMHgyMiwgMHg5MCwgMHgwMSwgMHg4YywgMHhlMCwgMHgzMCwgMHhlMywgMHgxYiwgMHhlNSwgMHg0YywgMHgzMCwgMHhlMCwgMHgwNCwgMHg3ZiwgMHg0MCwKKzB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4OTAsIDB4MTAsIDB4MmYsIDB4ZWYsIDB4ZjAsIDB4OTAsIDB4MDEsIDB4OGMsIDB4NzQsIDB4MDgsIDB4ZjAsIDB4ZTQsCisweDkwLCAweDAxLCAweGE3LCAweGYwLCAweDkwLCAweDAxLCAweDhjLCAweGUwLCAweDMwLCAweGUwLCAweDFjLCAweDkwLCAweDAxLCAweDgwLCAweGUwLCAweGI0LAorMHgwMiwgMHgxNSwgMHhhMywgMHhlMCwgMHhiNCwgMHgwMSwgMHgxMCwgMHg5MCwgMHgwMSwgMHg4NCwgMHhlMCwgMHhiNCwgMHg4MSwgMHgwOSwgMHg5MCwgMHgwMSwKKzB4OGMsIDB4NzQsIDB4MDEsIDB4ZjAsIDB4MTIsIDB4MGQsIDB4ZGQsIDB4MjIsIDB4OTAsIDB4MDQsIDB4MTQsIDB4ZTAsIDB4MjAsIDB4ZTcsIDB4MDMsIDB4MDIsCisweDEzLCAweDFlLCAweDkwLCAweDcwLCAweDEyLCAweGUwLCAweGY1LCAweDU2LCAweDkwLCAweDA0LCAweDA0LCAweGUwLCAweDEyLCAweDBhLCAweGI2LCAweDEwLAorMHhkOSwgMHgzMSwgMHgxMCwgMHhiZCwgMHgzNiwgMHgxMSwgMHgwMiwgMHg1MCwgMHgxMSwgMHgzOSwgMHg1MSwgMHgxMSwgMHg0MiwgMHg1MiwgMHgxMSwgMHg0MiwKKzB4NTMsIDB4MTEsIDB4NDIsIDB4NTQsIDB4MTEsIDB4ODMsIDB4NTUsIDB4MTEsIDB4ZDIsIDB4NTYsIDB4MTIsIDB4MjUsIDB4NzAsIDB4MTIsIDB4NTAsIDB4NzEsCisweDEyLCAweDdlLCAweDcyLCAweDEyLCAweGQ1LCAweDczLCAweDEyLCAweGY2LCAweDgwLCAweDAwLCAweDAwLCAweDEzLCAweDFlLCAweDkwLCAweDcwLCAweDExLAorMHhlMCwgMHhmNSwgMHgzYywgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNSwgMHg1NiwKKzB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MTMsIDB4MWUsIDB4MDIsIDB4MTMsIDB4MTcsIDB4MjAsIDB4MDIsIDB4MDMsIDB4MzAsIDB4MDMsIDB4MWQsIDB4N2QsCisweDAyLCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweGFhLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLAorMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMywgMHgxZSwgMHgwMiwgMHgxMywgMHgxNywgMHg4NSwgMHg1NiwgMHg0MSwgMHhkMiwKKzB4MDIsIDB4MjIsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4NTQsIDB4N2YsIDB4ZmYsIDB4YmYsIDB4MGEsIDB4MGQsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsCisweGI0LCAweDA4LCAweDA2LCAweDc1LCAweDRlLCAweDAxLCAweDc1LCAweDRmLCAweDg0LCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDU0LCAweDdmLCAweGZmLAorMHhiZiwgMHgwMiwgMHgxMiwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwNCwgMHhlMCwgMHhiNCwgMHgyMCwgMHgwNiwgMHg3NSwKKzB4NGUsIDB4MDMsIDB4NzUsIDB4NGYsIDB4MjAsIDB4ZTQsIDB4ZjUsIDB4MjcsIDB4MjIsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4MjQsIDB4ZmYsIDB4OTIsCisweDQ3LCAweDIyLCAweDkwLCAweDA0LCAweDA0LCAweGUwLCAweDI1LCAweGUwLCAweDI0LCAweDVkLCAweGY1LCAweDU3LCAweDkwLCAweDcwLCAweDEwLCAweGUwLAorMHhmZiwgMHg3NCwgMHg0NywgMHgyNSwgMHg1NywgMHhmOCwgMHhjNiwgMHhlZiwgMHhjNiwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHhmZiwgMHg3NCwgMHg0OCwKKzB4MjUsIDB4NTcsIDB4ZjgsIDB4YzYsIDB4ZWYsIDB4YzYsIDB4ZTQsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4YWEsIDB4OTAsIDB4MDQsIDB4MTQsCisweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEzLCAweDFlLAorMHgwMiwgMHgxMywgMHgxNywgMHhlNSwgMHg0NywgMHg2NCwgMHgwNywgMHg2MCwgMHgxZCwgMHhlNSwgMHg0NywgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNywgMHhlNSwKKzB4NDcsIDB4NjQsIDB4MDksIDB4NjAsIDB4MTEsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MGEsIDB4NjAsIDB4MGIsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MGIsIDB4NjAsCisweDA1LCAweGU1LCAweDQ3LCAweGI0LCAweDBjLCAweDA4LCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweDU0LCAweDBmLCAweGY1LCAweDNhLCAweGU1LCAweDQ3LAorMHhiNCwgMHgwOSwgMHgwOCwgMHhlNSwgMHgzYSwgMHhiNCwgMHgwMywgMHgwMywgMHhlNCwgMHhmNSwgMHg0NiwgMHhlNSwgMHg0NywgMHhiNCwgMHgwYSwgMHgwOCwKKzB4ZTUsIDB4M2EsIDB4YjQsIDB4MDEsIDB4MDMsIDB4ZTQsIDB4ZjUsIDB4NDYsIDB4ZTQsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4YWEsIDB4ZDIsCisweDA0LCAweDIyLCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweGY0LCAweGZmLCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDVmLCAweGZmLCAweDkwLCAweDcwLAorMHgxMSwgMHhlMCwgMHg1NSwgMHgyNywgMHg0ZiwgMHg5MCwgMHg3MCwgMHgxOCwgMHhmMCwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHg5MCwgMHg3MCwgMHgxOSwKKzB4ZjAsIDB4ZTQsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4YWEsIDB4MzAsIDB4MTUsIDB4MDMsIDB4ZDIsIDB4MTQsIDB4MjIsIDB4OTAsIDB4NzAsCisweDE4LCAweGUwLCAweGY1LCAweDI3LCAweDkwLCAweDAyLCAweDI5LCAweGUwLCAweGZmLCAweDkwLCAweDcwLCAweDE5LCAweGUwLCAweGZlLCAweGVmLCAweDVlLAorMHg5MCwgMHgwMiwgMHgyOSwgMHhmMCwgMHgzMCwgMHg0NywgMHgwNCwgMHhhZiwgMHgyNywgMHg4MCwgMHgwNCwgMHhlNSwgMHgyNywgMHhmNCwgMHhmZiwgMHg5MCwKKzB4MDIsIDB4MjgsIDB4ZWYsIDB4ZjAsIDB4MjIsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4ZmUsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4ZmQsIDB4ZWQsCisweGY4LCAweGU2LCAweGY1LCAweDU3LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweGFhLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLAorMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMywgMHgxZSwgMHgwMiwgMHgxMywgMHgxNywKKzB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4ZmUsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4ZmQsIDB4ZWQsIDB4ZjUsIDB4ODIsIDB4OGUsIDB4ODMsIDB4ZTAsCisweGY1LCAweDU3LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweGFhLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLAorMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMywgMHgxZSwgMHgwMiwgMHgxMywgMHgxNywgMHg5MCwgMHgxMCwKKzB4MDAsIDB4ZTAsIDB4ZjUsIDB4NTcsIDB4OTAsIDB4MTAsIDB4MDIsIDB4ZTAsIDB4ZjUsIDB4NTgsIDB4YTMsIDB4ZTAsIDB4ZjUsIDB4NTksIDB4ZTUsIDB4NTgsCisweGI0LCAweDcwLCAweDFlLCAweGU1LCAweDU5LCAweGI0LCAweDMwLCAweDE5LCAweDkwLCAweDA1LCAweDA4LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweGZkLAorMHg5MCwgMHgwNSwgMHgwNSwgMHhlMCwgMHg1NCwgMHhmYiwgMHhmMCwgMHg0NCwgMHgwNCwgMHhmMCwgMHhlZCwgMHg1NCwgMHhmZSwgMHg5MCwgMHgwNSwgMHgwOCwKKzB4ZjAsIDB4ZTQsIDB4ZjUsIDB4NGUsIDB4ZjUsIDB4NGYsIDB4NzUsIDB4M2EsIDB4ZmYsIDB4NzUsIDB4M2MsIDB4ZmYsIDB4YWQsIDB4NTcsIDB4YWYsIDB4NTYsCisweDEyLCAweDBiLCAweGFhLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LAorMHhmNCwgMHg2MCwgMHg0YiwgMHg4MCwgMHg0MiwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHgyNCwgMHhmZiwgMHg5MiwgMHg5MywgMHhlNCwgMHhmZCwgMHhhZiwKKzB4NTYsIDB4MTIsIDB4MGIsIDB4YWEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsCisweDU2LCAweGY0LCAweDYwLCAweDJhLCAweDgwLCAweDIxLCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDI0LCAweGZmLCAweDkyLCAweDRhLCAweGQyLCAweDA1LAorMHhhZCwgMHg1NywgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHhhYSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwKKzB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NjAsIDB4MDcsIDB4OTAsIDB4NzAsIDB4MjUsIDB4ZTAsIDB4NDQsIDB4MDEsIDB4ZjAsIDB4MjIsIDB4MjIsCisweGU1LCAweDUzLCAweDcwLCAweDFhLCAweDMwLCAweDYwLCAweDA5LCAweGIyLCAweDRkLCAweDMwLCAweDRkLCAweDA0LCAweDA1LCAweDQ2LCAweGMyLCAweDA0LAorMHhlNSwgMHg0ZiwgMHg0NSwgMHg0ZSwgMHg2MCwgMHgwOCwgMHhlNSwgMHg0ZiwgMHgxNSwgMHg0ZiwgMHg3MCwgMHgwMiwgMHgxNSwgMHg0ZSwgMHgyMiwgMHgyMiwKKzB4YzIsIDB4NDIsIDB4ZDMsIDB4MjIsIDB4MzAsIDB4MTQsIDB4MzAsIDB4OTAsIDB4NzAsIDB4MTksIDB4ZTAsIDB4NTUsIDB4MjcsIDB4ZmYsIDB4OTAsIDB4NzAsCisweDE4LCAweGUwLCAweDRmLCAweGY1LCAweDI3LCAweDkwLCAweDAyLCAweDI5LCAweGUwLCAweGZmLCAweDkwLCAweDcwLCAweDE5LCAweGUwLCAweGZlLCAweGVmLAorMHg1ZSwgMHg5MCwgMHgwMiwgMHgyOSwgMHhmMCwgMHgzMCwgMHg0NywgMHgwNCwgMHhhZiwgMHgyNywgMHg4MCwgMHgwNCwgMHhlNSwgMHgyNywgMHhmNCwgMHhmZiwKKzB4OTAsIDB4MDIsIDB4MjgsIDB4ZWYsIDB4ZjAsIDB4YzIsIDB4MTQsIDB4MjIsIDB4YzIsIDB4NGIsIDB4YzIsIDB4NGMsIDB4ZTUsIDB4NDQsIDB4MTIsIDB4MGEsCisweGI2LCAweDEzLCAweDlhLCAweDAwLCAweDE0LCAweDI4LCAweDA0LCAweDE0LCAweDI0LCAweDA4LCAweDE0LCAweDA0LCAweDEwLCAweDEzLCAweGFlLCAweDIwLAorMHgxMywgMHhjZSwgMHg2MCwgMHgxMywgMHhkZiwgMHhhMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgyYSwgMHg4NSwgMHg0OCwgMHg0MywgMHg4NSwgMHg0YSwgMHg0MiwKKzB4ODUsIDB4NGMsIDB4NWUsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsIDB4NjAsIDB4MDMsIDB4MDIsIDB4MTQsIDB4MmEsIDB4ODAsIDB4MWIsIDB4ZTUsIDB4NDgsCisweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQzLCAweGU1LCAweDRhLCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQyLCAweGU1LCAweDRjLCAweGM0LCAweDU0LAorMHgwZiwgMHhmNSwgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwgMHg2MSwgMHg1MywgMHg0MywgMHgwZiwgMHg4MCwgMHg1YywgMHg4NSwgMHg0OSwKKzB4NDMsIDB4ODUsIDB4NGIsIDB4NDIsIDB4ODUsIDB4NGQsIDB4NWUsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsIDB4NzAsIDB4NGQsIDB4ODAsIDB4MWIsIDB4ZTUsCisweDQ5LCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQzLCAweGU1LCAweDRiLCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQyLCAweGU1LCAweDRkLCAweGM0LAorMHg1NCwgMHgwZiwgMHhmNSwgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwgMHgzMCwgMHhlNSwgMHg0MywgMHg1NCwgMHgwZiwgMHg0NCwgMHgxMCwKKzB4ZjUsIDB4NDMsIDB4ODAsIDB4MjYsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDQsIDB4NjAsIDB4MDUsIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDUsIDB4MDYsIDB4NDMsCisweDVlLCAweDA0LCAweDc1LCAweDQyLCAweDA5LCAweGU1LCAweDQ3LCAweGI0LCAweDA2LCAweDEwLCAweGU1LCAweDQzLCAweDU0LCAweDBmLCAweDQ0LCAweDMwLAorMHhmNSwgMHg0MywgMHg4MCwgMHgwNiwgMHhkMiwgMHg0YiwgMHg4MCwgMHgwMiwgMHhkMiwgMHg0YywgMHhlNCwgMHhmNSwgMHgyNSwgMHhlNSwgMHg0MiwgMHhjNCwKKzB4NTQsIDB4ZjAsIDB4ZmYsIDB4ZTUsIDB4NDMsIDB4NTQsIDB4MGYsIDB4NGYsIDB4ZjUsIDB4NWYsIDB4ZDIsIDB4NjAsIDB4MjIsIDB4ZDIsIDB4MTUsIDB4ZTUsCisweDQ3LCAweDI0LCAweGY1LCAweDYwLCAweDBiLCAweDI0LCAweGNiLCAweDYwLCAweDA3LCAweDI0LCAweDQwLCAweDcwLCAweDA2LCAweGMyLCAweDE1LCAweDIyLAorMHgxMiwgMHgxNywgMHg3OSwgMHgxMiwgMHgxNCwgMHg1ZiwgMHhjMiwgMHgxNSwgMHhjMiwgMHhhZiwgMHhjMiwgMHgwNCwgMHhkMiwgMHhhZiwgMHgyMiwgMHhjMiwKKzB4YWYsIDB4OTAsIDB4MDQsIDB4MTQsIDB4ZTAsIDB4NTQsIDB4MGUsIDB4NjAsIDB4MDQsIDB4ZDIsIDB4MTgsIDB4ODAsIDB4MDgsIDB4ZTUsIDB4NGUsIDB4NDUsCisweDRmLCAweDI0LCAweGZmLCAweDkyLCAweDE4LCAweGQyLCAweGFmLCAweDkwLCAweDA0LCAweDE0LCAweGUwLCAweGEyLCAweGU0LCAweDkyLCAweDE5LCAweDc0LAorMHgxZSwgMHhmMCwgMHhlNSwgMHg1ZiwgMHg1NCwgMHgwZiwgMHhmNSwgMHgyZCwgMHhlNSwgMHgyNSwgMHg3MCwgMHgxMywgMHgzMCwgMHgxOCwgMHgwNSwgMHhlNSwKKzB4NWYsIDB4MjAsIDB4ZTUsIDB4MGIsIDB4MzAsIDB4MTksIDB4MTksIDB4ZTUsIDB4NWYsIDB4NTQsIDB4MzAsIDB4ZmYsIDB4YmYsIDB4MzAsIDB4MTEsIDB4ZTUsCisweDI1LCAweDcwLCAweDA1LCAweDc1LCAweDI1LCAweDBjLCAweDgwLCAweDAyLCAweDE1LCAweDI1LCAweGQyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDBmLAorMHhlNSwgMHg1ZiwgMHgzMCwgMHhlNiwgMHgwNiwgMHhjMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg4MCwgMHgwNCwgMHhkMiwgMHg2YywgMHhjMiwgMHg2ZCwgMHhlNSwKKzB4NDcsIDB4NjQsIDB4MDMsIDB4NzAsIDB4MjEsIDB4MzAsIDB4NGIsIDB4MDYsIDB4YzIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MTgsIDB4ZTUsIDB4MjUsCisweDcwLCAweDAzLCAweDMwLCAweDRjLCAweDExLCAweGMyLCAweDRjLCAweGU1LCAweDI1LCAweDcwLCAweDA1LCAweDc1LCAweDI1LCAweDA3LCAweDgwLCAweDAyLAorMHgxNSwgMHgyNSwgMHhkMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHhlNSwgMHg0NywgMHhiNCwgMHgwOSwgMHgxNCwgMHhlNSwgMHg0NCwgMHgyMCwgMHhlMywgMHgwYiwKKzB4ZTUsIDB4M2EsIDB4NjQsIDB4MDIsIDB4NjAsIDB4MDUsIDB4ZTUsIDB4M2EsIDB4YjQsIDB4MDMsIDB4MDQsIDB4YzIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ZTUsCisweDQ3LCAweGI0LCAweDBhLCAweDEzLCAweGU1LCAweDNhLCAweGI0LCAweDAxLCAweDA2LCAweGMyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDA4LCAweGU1LAorMHgzYSwgMHg3MCwgMHgwNCwgMHhkMiwgMHg2YywgMHhjMiwgMHg2ZCwgMHgyMCwgMHg2OSwgMHgwNywgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMCwgMHgwMiwgMHhiMiwKKzB4NjgsIDB4MjAsIDB4NmIsIDB4MDcsIDB4ZTUsIDB4NWUsIDB4MjAsIDB4ZTEsIDB4MDIsIDB4YjIsIDB4NmEsIDB4MjAsIDB4NmQsIDB4MDcsIDB4ZTUsIDB4NWUsCisweDIwLCAweGUyLCAweDAyLCAweGIyLCAweDZjLCAweDc1LCAweDJlLCAweDQwLCAweDIwLCAweDY5LCAweDA0LCAweGEyLCAweDY4LCAweDgwLCAweDI2LCAweDMwLAorMHg2OCwgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMiwgMHg4MCwgMHgxZCwgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMiwgMHgwNCwgMHg3ZiwgMHgwMSwgMHg4MCwKKzB4MDIsIDB4N2YsIDB4MDAsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmUsIDB4YmUsIDB4ZjAsIDB4MDQsIDB4N2UsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2UsCisweDAwLCAweGVlLCAweDZmLCAweDI0LCAweGZmLCAweDkyLCAweDczLCAweDkyLCAweDcyLCAweDIwLCAweDZiLCAweDA0LCAweGEyLCAweDZhLCAweDgwLCAweDI2LAorMHgzMCwgMHg2YSwgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMiwgMHg4MCwgMHgxZCwgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMCwgMHgwNCwgMHg3ZiwgMHgwMSwKKzB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmUsIDB4YmUsIDB4ZjAsIDB4MDQsIDB4N2UsIDB4MDEsIDB4ODAsIDB4MDIsCisweDdlLCAweDAwLCAweGVlLCAweDZmLCAweDI0LCAweGZmLCAweDkyLCAweDc1LCAweDkyLCAweDc0LCAweDIwLCAweDZkLCAweDA0LCAweGEyLCAweDZjLCAweDgwLAorMHgyNiwgMHhlNSwgMHg0NywgMHg2NCwgMHgwYSwgMHg3MCwgMHgyMiwgMHgzMCwgMHg2YywgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMywgMHg4MCwgMHgxNywKKzB4ZTUsIDB4M2EsIDB4YjQsIDB4MDEsIDB4MDYsIDB4ZTUsIDB4NDYsIDB4YTIsIDB4ZTMsIDB4ODAsIDB4MzQsIDB4ZTUsIDB4NDYsIDB4MjAsIDB4ZTQsIDB4MDMsCisweDMwLCAweGU1LCAweDAzLCAweGQzLCAweDgwLCAweDAxLCAweGMzLCAweDgwLCAweDI2LCAweDMwLCAweDZjLCAweDA2LCAweGU1LCAweDQ2LCAweGEyLCAweGUyLAorMHg4MCwgMHgxZCwgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMSwgMHgwNCwgMHg3ZiwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZiwgMHgwMCwgMHhlNSwgMHg0NiwgMHg1NCwKKzB4ZjAsIDB4ZmUsIDB4YmUsIDB4ZjAsIDB4MDQsIDB4N2UsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2UsIDB4MDAsIDB4ZWUsIDB4NmYsIDB4MjQsIDB4ZmYsIDB4OTIsCisweDcxLCAweDkyLCAweDcwLCAweDkwLCAweDEwLCAweDAwLCAweGUwLCAweDkwLCAweDEwLCAweDJjLCAweGYwLCAweDkwLCAweDEwLCAweDAzLCAweGUwLCAweGMzLAorMHg5NCwgMHgzMCwgMHg0MCwgMHgxNCwgMHhhMiwgMHg3MSwgMHg5MiwgMHg3NywgMHhhMiwgMHg3MCwgMHg5MiwgMHg3NiwgMHhlNSwgMHgyZSwgMHgxMywgMHgxMywKKzB4NTQsIDB4M2YsIDB4ZjUsIDB4MmUsIDB4YzIsIDB4NzcsIDB4ZDIsIDB4NzYsIDB4OTAsIDB4MTAsIDB4MmYsIDB4ZTUsIDB4MmUsIDB4ZjAsIDB4ZTUsIDB4NDcsCisweDY0LCAweDA2LCAweDcwLCAweDM5LCAweDkwLCAweDAyLCAweDI5LCAweGUwLCAweDU0LCAweGZlLCAweGYwLCAweGU1LCAweDQzLCAweGM0LCAweDU0LCAweDBmLAorMHgxNCwgMHg2MCwgMHgwYywgMHgyNCwgMHhmZSwgMHg2MCwgMHgwYywgMHgyNCwgMHgwMywgMHg3MCwgMHgxMywgMHhjMiwgMHgzOCwgMHg4MCwgMHgwZiwgMHhkMiwKKzB4MzgsIDB4ODAsIDB4MGIsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsIDB4MzgsIDB4MzAsIDB4NDcsCisweDA1LCAweGFmLCAweDI3LCAweDAyLCAweDE3LCAweDczLCAweGU1LCAweDI3LCAweGY0LCAweGZmLCAweDAyLCAweDE3LCAweDczLCAweGU1LCAweDQ3LCAweDY0LAorMHgwNywgMHg2MCwgMHgwZiwgMHhlNSwgMHg0NywgMHg2NCwgMHgwOCwgMHg2MCwgMHgwOSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwOSwgMHg2MCwgMHgwMywgMHgwMiwKKzB4MTYsIDB4ZjIsIDB4OTAsIDB4MDIsIDB4MjksIDB4ZTAsIDB4NTQsIDB4ZmMsIDB4ZjAsIDB4ZTUsIDB4M2EsIDB4MTQsIDB4NjAsIDB4MjIsIDB4MTQsIDB4NjAsCisweDI1LCAweDE0LCAweDYwLCAweDJkLCAweDI0LCAweGZjLCAweDYwLCAweDQ5LCAweDI0LCAweGY5LCAweDYwLCAweDE0LCAweDI0LCAweDBlLCAweDcwLCAweDUwLAorMHhlNSwgMHg0NiwgMHgxMywgMHgxMywgMHg1NCwgMHgzZiwgMHg3NSwgMHhmMCwgMHgwMywgMHg4NCwgMHhlNSwgMHhmMCwgMHgyNCwgMHhmZiwgMHg4MCwgMHgzYSwKKzB4ZDIsIDB4MzksIDB4YzIsIDB4MzgsIDB4ODAsIDB4M2UsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MWQsIDB4YzMsIDB4ODAsCisweDFhLCAweGU1LCAweDQ2LCAweDMwLCAweGUyLCAweDBkLCAweDU0LCAweDM4LCAweGMzLCAweDk0LCAweDMwLCAweDUwLCAweDA2LCAweDdlLCAweDAwLCAweDdmLAorMHgwMSwgMHg4MCwgMHgwNCwgMHg3ZSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHhlZSwgMHg0ZiwgMHgyNCwgMHhmZiwgMHg5MiwgMHgzOCwgMHhjMiwgMHgzOSwgMHg4MCwKKzB4MTMsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsIDB4MzksIDB4YzIsIDB4MzgsIDB4ODAsIDB4MDQsCisweGMyLCAweDM4LCAweGMyLCAweDM5LCAweDMwLCAweDQ3LCAweDA0LCAweGFmLCAweDI3LCAweDgwLCAweDA0LCAweGU1LCAweDI3LCAweGY0LCAweGZmLCAweDAyLAorMHgxNywgMHg3MywgMHhlNSwgMHg0NywgMHg2NCwgMHgwYywgMHg2MCwgMHgwNiwgMHhlNSwgMHg0NywgMHg2NCwgMHgwYiwgMHg3MCwgMHg3YSwgMHg5MCwgMHgwMiwKKzB4MjksIDB4ZTAsIDB4NTQsIDB4ZmQsIDB4ZjAsIDB4ZTUsIDB4M2EsIDB4MTQsIDB4NjAsIDB4MjAsIDB4MTQsIDB4NjAsIDB4MjEsIDB4MTQsIDB4NjAsIDB4MmIsCisweDI0LCAweGZjLCAweDYwLCAweDQ1LCAweDI0LCAweGY5LCAweDYwLCAweDEyLCAweDI0LCAweDBlLCAweDcwLCAweDRhLCAweGU1LCAweDQ2LCAweDEzLCAweDEzLAorMHg1NCwgMHgzZiwgMHg3NSwgMHhmMCwgMHgwMywgMHg4NCwgMHhlNSwgMHhmMCwgMHg4MCwgMHgyOSwgMHhkMiwgMHgzOSwgMHg4MCwgMHgzYSwgMHhlNSwgMHg0NiwKKzB4MzAsIDB4ZTIsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsIDB4MzksIDB4ODAsIDB4MmQsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MGQsCisweDU0LCAweDM4LCAweGMzLCAweDk0LCAweDMwLCAweDUwLCAweDA2LCAweDdlLCAweDAwLCAweDdmLCAweDAxLCAweDgwLCAweDA0LCAweDdlLCAweDAwLCAweDdmLAorMHgwMCwgMHhlZSwgMHg0ZiwgMHgyNCwgMHhmZiwgMHg5MiwgMHgzOSwgMHg4MCwgMHgwZiwgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMiwgMHgwMywgMHhkMywgMHg4MCwKKzB4MDEsIDB4YzMsIDB4OTIsIDB4MzksIDB4ODAsIDB4MDIsIDB4YzIsIDB4MzksIDB4MzAsIDB4NDcsIDB4MDQsIDB4YWYsIDB4MjcsIDB4ODAsIDB4MDQsIDB4ZTUsCisweDI3LCAweGY0LCAweGZmLCAweDkwLCAweDAyLCAweDI4LCAweGVmLCAweGYwLCAweDIyLCAweGU1LCAweDQ3LCAweGI0LCAweDBiLCAweDEwLCAweDkwLCAweDAyLAorMHgyOSwgMHhlMCwgMHg1NCwgMHhlYiwgMHhmMCwgMHhlNSwgMHgyNywgMHg1NCwgMHhlYiwgMHg0NSwgMHg0NSwgMHhmNSwgMHgyNywgMHgyMiwgMHhlNCwgMHg5MCwKKzB4MDIsIDB4MjksIDB4ZjAsIDB4MzAsIDB4NDcsIDB4MDQsIDB4YWYsIDB4NDUsIDB4ODAsIDB4MDQsIDB4ZTUsIDB4NDUsIDB4ZjQsIDB4ZmYsIDB4OTAsIDB4MDIsCisweDI4LCAweGVmLCAweGYwLCAweDIyLCAweDhmLCAweDUwLCAweGQyLCAweDU5LCAweDIyLCAweDhmLCAweDU0LCAweGQyLCAweDU4LCAweDIyLCAweGU0LCAweGY1LAorMHg2MiwgMHhjMiwgMHhhZiwgMHhlNSwgMHg1MSwgMHgxNCwgMHg2MCwgMHg0OCwgMHgxNCwgMHg2MCwgMHg2NiwgMHgyNCwgMHgwMiwgMHg2MCwgMHgwMywgMHgwMiwKKzB4MTgsIDB4YjYsIDB4ZDIsIDB4NTksIDB4NzUsIDB4NTUsIDB4MDEsIDB4OTAsIDB4MDIsIDB4YTIsIDB4ZTAsIDB4NTQsIDB4N2YsIDB4ZjAsIDB4YTMsIDB4ZTAsCisweDIwLCAweGU3LCAweDIzLCAweDkwLCAweDA0LCAweDM0LCAweGUwLCAweGI0LCAweDAyLCAweDFjLCAweGEzLCAweGUwLCAweGI0LCAweDAyLCAweDE3LCAweGEzLAorMHhlMCwgMHhiNCwgMHgwMiwgMHgxMiwgMHg3ZiwgMHgyMCwgMHgxMiwgMHgxNywgMHhhNCwgMHg5MCwgMHgxMCwgMHgwNCwgMHhlMCwgMHg1NCwgMHhmMywgMHhmMCwKKzB4NzUsIDB4NTEsIDB4MDEsIDB4MDIsIDB4MTgsIDB4YjYsIDB4ZTUsIDB4NTAsIDB4NzAsIDB4MDYsIDB4NzUsIDB4NjIsIDB4MDMsIDB4MDIsIDB4MTgsIDB4YjYsCisweDkwLCAweDEyLCAweDAwLCAweGUwLCAweDU0LCAweDAzLCAweDcwLCAweDEyLCAweDdmLCAweDIwLCAweDEyLCAweDE3LCAweGE0LCAweDkwLCAweDAyLCAweGEyLAorMHhlMCwgMHg1NCwgMHhiZiwgMHhmMCwgMHg3NSwgMHg1MSwgMHgwMiwgMHgwMiwgMHgxOCwgMHhiNiwgMHhlNSwgMHg1MCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxOCwKKzB4YjEsIDB4OTAsIDB4MDIsIDB4YTMsIDB4ZTAsIDB4MzAsIDB4ZTYsIDB4MDMsIDB4MDIsIDB4MTgsIDB4YWQsIDB4OTAsIDB4MDQsIDB4MzcsIDB4ZTAsIDB4NjQsCisweDIyLCAweDcwLCAweDdhLCAweDkwLCAweDAxLCAweDhhLCAweDc0LCAweDdlLCAweGYwLCAweDkwLCAweDAxLCAweDk2LCAweGYwLCAweDkwLCAweDEyLCAweDA0LAorMHg3NCwgMHgwYSwgMHhmMCwgMHhlNSwgMHg1OCwgMHhiNCwgMHg3MiwgMHgxNSwgMHhlNSwgMHg1OSwgMHhiNCwgMHgzNSwgMHgxMCwgMHhlNCwgMHg5MCwgMHgwNSwKKzB4MDAsIDB4ZjAsIDB4YTMsIDB4NzQsIDB4MDgsIDB4ZjAsIDB4YTMsIDB4NzQsIDB4MDEsIDB4ZjAsIDB4NzQsIDB4MDMsIDB4ZjAsIDB4N2YsIDB4MDEsIDB4MTIsCisweDBkLCAweDQ4LCAweDkwLCAweDEzLCAweDI4LCAweGUwLCAweDU0LCAweGYwLCAweGYwLCAweGEzLCAweGUwLCAweDU0LCAweGYwLCAweGYwLCAweGU1LCAweDU5LAorMHhiNCwgMHgzNSwgMHgxNCwgMHhlNSwgMHgzYywgMHhmNCwgMHg2MCwgMHgwNiwgMHhhMywgMHhlMCwgMHg1NCwgMHhmMywgMHg4MCwgMHgxNCwgMHg5MCwgMHgxMywKKzB4MmEsIDB4ZTAsIDB4NTQsIDB4ZmIsIDB4ZjAsIDB4ODAsIDB4MTQsIDB4ZTUsIDB4M2MsIDB4ZjQsIDB4OTAsIDB4MTMsIDB4MmEsIDB4NjAsIDB4MDgsIDB4ZTAsCisweDU0LCAweGYyLCAweDQ1LCAweDNjLCAweGYwLCAweDgwLCAweDA0LCAweGUwLCAweDU0LCAweGZhLCAweGYwLCAweDkwLCAweDA0LCAweDAxLCAweGUwLCAweDU0LAorMHhmZCwgMHhmMCwgMHg3NSwgMHg2MiwgMHgwMSwgMHg3NSwgMHg1NSwgMHgwMiwgMHhlNCwgMHhmNSwgMHg1MSwgMHg4MCwgMHgwOSwgMHhlNSwgMHg1MCwgMHg3MCwKKzB4MDUsIDB4NzUsIDB4NjIsIDB4MDMsIDB4ZjUsIDB4NTEsIDB4ZTUsIDB4NjIsIDB4NjAsIDB4MTUsIDB4YzIsIDB4MDEsIDB4ZTQsIDB4ZjUsIDB4NTEsIDB4YzIsCisweDU5LCAweGFkLCAweDYyLCAweGFmLCAweDQwLCAweDEyLCAweDE5LCAweDYxLCAweGU1LCAweDYyLCAweGI0LCAweDAzLCAweDAyLCAweGQyLCAweDAzLCAweGQyLAorMHhhZiwgMHgyMiwgMHhjMiwgMHhhZiwgMHgzMCwgMHgwMSwgMHgxMiwgMHhlNCwgMHg5MCwgMHgwMSwgMHg5NiwgMHhmMCwgMHhmNSwgMHg1MSwgMHhjMiwgMHg1OSwKKzB4YzIsIDB4MDEsIDB4N2QsIDB4MDIsIDB4YWYsIDB4NDAsIDB4MTIsIDB4MTksIDB4NjEsIDB4ZTUsIDB4NTIsIDB4MTQsIDB4NjAsIDB4MDksIDB4MDQsIDB4NzAsCisweDZkLCAweDc1LCAweDUyLCAweDAxLCAweDc1LCAweDU1LCAweDAzLCAweDkwLCAweDA0LCAweDAxLCAweGUwLCAweDQ0LCAweDBlLCAweGYwLCAweDkwLCAweDEzLAorMHgyOCwgMHhlMCwgMHg0NCwgMHgwZiwgMHhmMCwgMHhhMywgMHhlMCwgMHg0NCwgMHgwZiwgMHhmMCwgMHhhMywgMHhlMCwgMHg0NCwgMHgwNSwgMHhmMCwgMHg5MCwKKzB4MTIsIDB4MDQsIDB4NzQsIDB4MDMsIDB4ZjAsIDB4ZTUsIDB4NTgsIDB4YjQsIDB4NzIsIDB4MTYsIDB4ZTUsIDB4NTksIDB4YjQsIDB4MzUsIDB4MTEsIDB4OTAsCisweDA1LCAweDAwLCAweDc0LCAweGUyLCAweGYwLCAweGEzLCAweDc0LCAweDA4LCAweGYwLCAweGEzLCAweDc0LCAweDAxLCAweGYwLCAweDc0LCAweDAzLCAweGYwLAorMHg3ZiwgMHgwMSwgMHgxMiwgMHgwZCwgMHg0OCwgMHg5MCwgMHgwMiwgMHhhMiwgMHhlMCwgMHg0NCwgMHhjMCwgMHhmMCwgMHg5MCwgMHgxMCwgMHgwNCwgMHhlMCwKKzB4NDQsIDB4MGMsIDB4ZjAsIDB4ZTQsIDB4ZjUsIDB4NTIsIDB4ZjUsIDB4NTUsIDB4MzAsIDB4MDIsIDB4MDksIDB4YzIsIDB4MDIsIDB4N2QsIDB4MDEsIDB4YWYsCisweDQxLCAweDEyLCAweDE5LCAweDYxLCAweDMwLCAweDAzLCAweDAyLCAweGMyLCAweDAzLCAweGU0LCAweDkwLCAweDAxLCAweDk2LCAweGYwLCAweGQyLCAweGFmLAorMHgyMiwgMHhlZiwgMHhmNCwgMHg2MCwgMHgyZCwgMHhlNCwgMHhmZSwgMHg3NCwgMHgxNCwgMHgyZSwgMHhmNSwgMHg4MiwgMHhlNCwgMHgzNCwgMHg3MCwgMHhmNSwKKzB4ODMsIDB4ZTAsIDB4YjQsIDB4ZmYsIDB4MTksIDB4NzQsIDB4MTQsIDB4MmUsIDB4ZjUsIDB4ODIsIDB4ZTQsIDB4MzQsIDB4NzAsIDB4ZjUsIDB4ODMsIDB4ZWYsCisweGYwLCAweDc0LCAweDFjLCAweDJlLCAweGY1LCAweDgyLCAweGU0LCAweDM0LCAweDcwLCAweGY1LCAweDgzLCAweGVkLCAweGYwLCAweDIyLCAweDBlLCAweGJlLAorMHgwNCwgMHhkNSwgMHgyMiwgMHgyMiwgMHgyMiwgMHg5MCwgMHg3MCwgMHgyYSwgMHhlMCwgMHgzMCwgMHhlMSwgMHg0ZCwgMHhjMiwgMHhhZiwgMHg5MCwgMHg3MCwKKzB4MjgsIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWMsIDB4ZjAsIDB4OTAsIDB4NzAsIDB4MjksIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWQsIDB4ZjAsIDB4OTAsIDB4NzAsCisweDJhLCAweGUwLCAweDkwLCAweDEwLCAweDFlLCAweGYwLCAweDkwLCAweDEwLCAweDFjLCAweGUwLCAweGY1LCAweDYyLCAweDkwLCAweDEwLCAweDFlLCAweGUwLAorMHgyMCwgMHhlMSwgMHhmMywgMHg5MCwgMHgxMCwgMHgxYywgMHhlMCwgMHg5MCwgMHg3MCwgMHgyOCwgMHhmMCwgMHg5MCwgMHgxMCwgMHgxZCwgMHhlMCwgMHg5MCwKKzB4NzAsIDB4MjksIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MWUsIDB4ZTAsIDB4OTAsIDB4NzAsIDB4MmEsIDB4ZjAsIDB4MzAsIDB4NGEsIDB4MDcsIDB4OTAsIDB4NzAsCisweDI0LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweGMyLCAweDA1LCAweGQyLCAweGFmLCAweDIyLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMSwgMHg2NSwgMHhkMywgfSA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tZDUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21kNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDg4M2NhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21kNS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQxNSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIG1kNS5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCi0JamFuCQkJMTAtMjgtMDMJCUluaXRpYWwKLQlSaXRhICAgIAkxMS0yMy0wNAkJTW9kaWZ5IE1ENSBhbmQgU0hBLTEKLQlSaXRhCQkxMC0xNC0wNQkJTW9kaWZ5IFNIQS0xIGluIGJpZy1lbmRpYW4gcGxhdGZvcm0KLSAqLwotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0vKioKLSAqIG1kNV9tYWM6Ci0gKiBAa2V5OiBwb2ludGVyIHRvCXRoZQlrZXkJdXNlZCBmb3IgTUFDIGdlbmVyYXRpb24KLSAqIEBrZXlfbGVuOiBsZW5ndGgJb2YgdGhlIGtleSBpbiBieXRlcwotICogQGRhdGE6IHBvaW50ZXIgdG8gdGhlIGRhdGEgYXJlYSBmb3Igd2hpY2ggdGhlIE1BQyBpcwlnZW5lcmF0ZWQKLSAqIEBkYXRhX2xlbjogbGVuZ3RoIG9mCXRoZQlkYXRhIGluCWJ5dGVzCi0gKiBAbWFjOiBwb2ludGVyIHRvCXRoZQlidWZmZXIgaG9sZGluZyBzcGFjZSBmb3IgdGhlIE1BQzsgdGhlIGJ1ZmZlciBzaG91bGQKLSAqIGhhdmUJc3BhY2UgZm9yIDEyOC1iaXQgKDE2IGJ5dGVzKSBNRDUgaGFzaCB2YWx1ZQotICoKLSAqIG1kNV9tYWMoKSBkZXRlcm1pbmVzCXRoZQltZXNzYWdlCWF1dGhlbnRpY2F0aW9uIGNvZGUJYnkgdXNpbmcgc2VjdXJlCWhhc2gKLSAqIE1ENShrZXkgfCBkYXRhIHwJa2V5KS4KLSAqLwotdm9pZCBtZDVfbWFjKHU4ICprZXksIHNpemVfdCBrZXlfbGVuLCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqbWFjKQotewotCU1ENV9DVFgJY29udGV4dDsKLQotCU1ENUluaXQoJmNvbnRleHQpOwotCU1ENVVwZGF0ZSgmY29udGV4dCwJa2V5LCBrZXlfbGVuKTsKLQlNRDVVcGRhdGUoJmNvbnRleHQsCWRhdGEsIGRhdGFfbGVuKTsKLQlNRDVVcGRhdGUoJmNvbnRleHQsCWtleSwga2V5X2xlbik7Ci0JTUQ1RmluYWwobWFjLCAmY29udGV4dCk7Ci19Ci0KLS8qKgotICogaG1hY19tZDU6Ci0gKiBAa2V5OiBwb2ludGVyIHRvCXRoZQlrZXkJdXNlZCBmb3IgTUFDIGdlbmVyYXRpb24KLSAqIEBrZXlfbGVuOiBsZW5ndGgJb2YgdGhlIGtleSBpbiBieXRlcwotICogQGRhdGE6IHBvaW50ZXIgdG8gdGhlIGRhdGEgYXJlYSBmb3Igd2hpY2ggdGhlIE1BQyBpcwlnZW5lcmF0ZWQKLSAqIEBkYXRhX2xlbjogbGVuZ3RoIG9mCXRoZQlkYXRhIGluCWJ5dGVzCi0gKiBAbWFjOiBwb2ludGVyIHRvCXRoZQlidWZmZXIgaG9sZGluZyBzcGFjZSBmb3IgdGhlIE1BQzsgdGhlIGJ1ZmZlciBzaG91bGQKLSAqIGhhdmUJc3BhY2UgZm9yIDEyOC1iaXQgKDE2IGJ5dGVzKSBNRDUgaGFzaCB2YWx1ZQotICoKLSAqIGhtYWNfbWQ1KCkgZGV0ZXJtaW5lcyB0aGUgbWVzc2FnZSBhdXRoZW50aWNhdGlvbgljb2RlIHVzaW5nIEhNQUMtTUQ1LgotICogVGhpcwlpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZAlvbiB0aGUgc2FtcGxlIGNvZGUgcHJlc2VudGVkIGluCVJGQwkyMTA0LgotICovCi12b2lkIGhtYWNfbWQ1KHU4ICprZXksIHNpemVfdCBrZXlfbGVuLCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqbWFjKQotewotCU1ENV9DVFgJY29udGV4dDsKLSAgICB1OCBrX2lwYWRbNjVdOyAvKiBpbm5lciBwYWRkaW5nIC0ga2V5IFhPUmQgd2l0aCBpcGFkICovCi0gICAgdTgga19vcGFkWzY1XTsgLyogb3V0ZXIgcGFkZGluZyAtIGtleSBYT1JkIHdpdGggb3BhZCAqLwotICAgIHU4IHRrWzE2XTsKLQlpbnQJaTsKLQotCS8vYXNzZXJ0KGtleSAhPSBOVUxMICYmIGRhdGEgIT0gTlVMTCAmJiBtYWMgIT0gTlVMTCk7Ci0KLQkvKiBpZiBrZXkgaXMgbG9uZ2VyCXRoYW4gNjQJYnl0ZXMgcmVzZXQJaXQgdG8ga2V5ID0JTUQ1KGtleSkgKi8KLQlpZiAoa2V5X2xlbgk+IDY0KSB7Ci0JCU1ENV9DVFgJdHRjb250ZXh0OwotCi0JCU1ENUluaXQoJnR0Y29udGV4dCk7Ci0JCU1ENVVwZGF0ZSgmdHRjb250ZXh0LCBrZXksIGtleV9sZW4pOwotCQlNRDVGaW5hbCh0aywgJnR0Y29udGV4dCk7Ci0JCS8va2V5PShQVUNIQVIpdHRjb250ZXh0LmJ1ZjsKLQkJa2V5CT0gdGs7Ci0JCWtleV9sZW4JPSAxNjsKLQl9Ci0KLQkvKiB0aGUgSE1BQ19NRDUJdHJhbnNmb3JtIGxvb2tzCWxpa2U6Ci0JICoKLQkgKiBNRDUoSyBYT1Igb3BhZCwgTUQ1KEsgWE9SIGlwYWQsIHRleHQpKQotCSAqCi0JICogd2hlcmUgSyBpcyBhbiBuIGJ5dGUJa2V5Ci0JICogaXBhZAlpcyB0aGUgYnl0ZQkweDM2IHJlcGVhdGVkIDY0IHRpbWVzCi0JICogb3BhZAlpcyB0aGUgYnl0ZQkweDVjIHJlcGVhdGVkIDY0IHRpbWVzCi0JICogYW5kIHRleHQJaXMgdGhlIGRhdGEJYmVpbmcgcHJvdGVjdGVkCSovCi0KLQkvKiBzdGFydCBvdXQgYnkJc3RvcmluZwlrZXkJaW4gcGFkcwkqLwotCU5kaXNaZXJvTWVtb3J5KGtfaXBhZCwgc2l6ZW9mKGtfaXBhZCkpOwotCU5kaXNaZXJvTWVtb3J5KGtfb3BhZCwJc2l6ZW9mKGtfb3BhZCkpOwotCS8vYXNzZXJ0KGtleV9sZW4gPCBzaXplb2Yoa19pcGFkKSk7Ci0JTmRpc01vdmVNZW1vcnkoa19pcGFkLCBrZXksCWtleV9sZW4pOwotCU5kaXNNb3ZlTWVtb3J5KGtfb3BhZCwga2V5LAlrZXlfbGVuKTsKLQotCS8qIFhPUiBrZXkgd2l0aAlpcGFkIGFuZCBvcGFkIHZhbHVlcyAqLwotCWZvcgkoaSA9IDA7CWkgPAk2NDsJaSsrKSB7Ci0JCWtfaXBhZFtpXSBePSAweDM2OwotCQlrX29wYWRbaV0gXj0gMHg1YzsKLQl9Ci0KLQkvKiBwZXJmb3JtIGlubmVyIE1ENSAqLwotCU1ENUluaXQoJmNvbnRleHQpOwkJCQkJIC8qCWluaXQgY29udGV4dCBmb3IgMXN0IHBhc3MgKi8KLQlNRDVVcGRhdGUoJmNvbnRleHQsCWtfaXBhZCwJNjQpOwkgLyoJc3RhcnQgd2l0aCBpbm5lciBwYWQgKi8KLQlNRDVVcGRhdGUoJmNvbnRleHQsCWRhdGEsIGRhdGFfbGVuKTsgLyoJdGhlbiB0ZXh0IG9mIGRhdGFncmFtICovCi0JTUQ1RmluYWwobWFjLCAmY29udGV4dCk7CQkJIC8qCWZpbmlzaCB1cCAxc3QgcGFzcyAqLwotCi0JLyogcGVyZm9ybSBvdXRlciBNRDUgKi8KLQlNRDVJbml0KCZjb250ZXh0KTsJCQkJCSAvKglpbml0IGNvbnRleHQgZm9yIDJuZCBwYXNzICovCi0JTUQ1VXBkYXRlKCZjb250ZXh0LAlrX29wYWQsCTY0KTsJIC8qCXN0YXJ0IHdpdGggb3V0ZXIgcGFkICovCi0JTUQ1VXBkYXRlKCZjb250ZXh0LAltYWMsIDE2KTsJCSAvKgl0aGVuIHJlc3VsdHMgb2YJMXN0CWhhc2ggKi8KLQlNRDVGaW5hbChtYWMsICZjb250ZXh0KTsJCQkgLyoJZmluaXNoIHVwIDJuZCBwYXNzICovCi19Ci0KLSNkZWZpbmUgYnl0ZVJldmVyc2UoYnVmLCBsZW4pICAgLyogTm90aGluZyAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PSAgTUQ1IGltcGxlbWVudGF0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLy8gZm91ciBiYXNlIGZ1bmN0aW9ucyBmb3IgTUQ1Ci0jZGVmaW5lIE1ENV9GMSh4LCB5LCB6KSAoKCh4KSAmICh5KSkgfCAoKH54KSAmICh6KSkpCi0jZGVmaW5lIE1ENV9GMih4LCB5LCB6KSAoKCh4KSAmICh6KSkgfCAoKHkpICYgKH56KSkpCi0jZGVmaW5lIE1ENV9GMyh4LCB5LCB6KSAoKHgpIF4gKHkpIF4gKHopKQotI2RlZmluZSBNRDVfRjQoeCwgeSwgeikgKCh5KSBeICgoeCkgfCAofnopKSkKLSNkZWZpbmUgQ1lDTElDX0xFRlRfU0hJRlQodywgcykgKCgodykgPDwgKHMpKSB8ICgodykgPj4gKDMyLShzKSkpKQotCi0jZGVmaW5lCU1ENVN0ZXAoZiwgdywgeCwgeSwJeiwgZGF0YSwgdCwgcykJXAotCSggdwkrPSBmKHgsCXksIHopICsJZGF0YSArIHQsICB3ID0gKENZQ0xJQ19MRUZUX1NISUZUKHcsIHMpKSAmIDB4ZmZmZmZmZmYsIHcgKz0JeCApCi0KLQotLyoKLSAqICBGdW5jdGlvbiBEZXNjcmlwdGlvbjoKLSAqICAgICAgSW5pdGlhdGUgTUQ1IENvbnRleHQgc2F0aXNmaWVkIGluIFJGQyAxMzIxCi0gKgotICogIEFyZ3VtZW50czoKLSAqICAgICAgcEN0eCAgICAgICAgUG9pbnRlcgl0byBNRDUgY29udGV4dAotICoKLSAqICBSZXR1cm4gVmFsdWU6Ci0gKiAgICAgIE5vbmUKLSAqLwotVk9JRCBNRDVJbml0KE1ENV9DVFggKnBDdHgpCi17Ci0gICAgcEN0eC0+QnVmWzBdPTB4Njc0NTIzMDE7Ci0gICAgcEN0eC0+QnVmWzFdPTB4ZWZjZGFiODk7Ci0gICAgcEN0eC0+QnVmWzJdPTB4OThiYWRjZmU7Ci0gICAgcEN0eC0+QnVmWzNdPTB4MTAzMjU0NzY7Ci0KLSAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzBdPTA7Ci0gICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXT0wOwotfQotCi0KLS8qCi0gKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246Ci0gKiAgICAgIFVwZGF0ZSBNRDUgQ29udGV4dCwgYWxsb3cgb2YgYW4gYXJyYXJ5IG9mIG9jdGV0cyBhcyB0aGUgbmV4dCBwb3J0aW9uCi0gKiAgICAgIG9mIHRoZSBtZXNzYWdlCi0gKgotICogIEFyZ3VtZW50czoKLSAqICAgICAgcEN0eAkJUG9pbnRlcgl0byBNRDUgY29udGV4dAotICogCSAgICBwRGF0YSAgICAgICBQb2ludGVyIHRvIGlucHV0IGRhdGEKLSAqICAgICAgTGVuSW5CeXRlcyAgVGhlIGxlbmd0aCBvZiBpbnB1dCBkYXRhICh1bml0OiBieXRlKQotICoKLSAqICBSZXR1cm4gVmFsdWU6Ci0gKiAgICAgIE5vbmUKLSAqCi0gKiAgTm90ZToKLSAqICAgICAgQ2FsbGVkIGFmdGVyIE1ENUluaXQgb3IgTUQ1VXBkYXRlKGl0c2VsZikKLSAqLwotVk9JRCBNRDVVcGRhdGUoTUQ1X0NUWCAqcEN0eCwgVUNIQVIgKnBEYXRhLCBVSU5UMzIgTGVuSW5CeXRlcykKLXsKLQotICAgIFVJTlQzMiBUZlRpbWVzOwotICAgIFVJTlQzMiB0ZW1wOwotCXVuc2lnbmVkIGludCBpOwotCi0gICAgdGVtcCA9IHBDdHgtPkxlbkluQml0Q291bnRbMF07Ci0KLSAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzBdID0gKFVJTlQzMikgKHBDdHgtPkxlbkluQml0Q291bnRbMF0gKyAoTGVuSW5CeXRlcyA8PCAzKSk7Ci0KLSAgICBpZiAocEN0eC0+TGVuSW5CaXRDb3VudFswXSA8IHRlbXApCi0gICAgICAgIHBDdHgtPkxlbkluQml0Q291bnRbMV0rKzsgICAvL2NhcnJ5IGluCi0KLSAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdICs9IExlbkluQnl0ZXMgPj4gMjk7Ci0KLSAgICAvLyBtb2QgNjQgYnl0ZXMKLSAgICB0ZW1wID0gKHRlbXAgPj4gMykgJiAweDNmOwotCi0gICAgLy8gcHJvY2VzcyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKLSAgICBpZiAodGVtcCkKLSAgICB7Ci0gICAgICAgIFVDSEFSICpwQWRzID0gKFVDSEFSICopIHBDdHgtPklucHV0ICsgdGVtcDsKLQotICAgICAgICBpZiAoKHRlbXArTGVuSW5CeXRlcykgPCA2NCkKLSAgICAgICAgewotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkcywgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkcywgKFVDSEFSICopcERhdGEsIDY0LXRlbXApOwotICAgICAgICBieXRlUmV2ZXJzZShwQ3R4LT5JbnB1dCwgMTYpOwotICAgICAgICBNRDVUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOwotCi0gICAgICAgIHBEYXRhICs9IDY0LXRlbXA7Ci0gICAgICAgIExlbkluQnl0ZXMgLT0gNjQtdGVtcDsKLSAgICB9IC8vIGVuZCBvZiBpZiAodGVtcCkKLQotCi0gICAgVGZUaW1lcyA9IChMZW5JbkJ5dGVzID4+IDYpOwotCi0gICAgZm9yIChpPVRmVGltZXM7IGk+MDsgaS0tKQotICAgIHsKLSAgICAgICAgTmRpc01vdmVNZW1vcnkocEN0eC0+SW5wdXQsIChVQ0hBUiAqKXBEYXRhLCA2NCk7Ci0gICAgICAgIGJ5dGVSZXZlcnNlKHBDdHgtPklucHV0LCAxNik7Ci0gICAgICAgIE1ENVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7Ci0gICAgICAgIHBEYXRhICs9IDY0OwotICAgICAgICBMZW5JbkJ5dGVzIC09IDY0OwotICAgIH0gLy8gZW5kIG9mIGZvcgotCi0gICAgLy8gYnVmZmVyaW5nIGxhY2tzIG9mIDY0LWJ5dGUgZGF0YQotICAgIGlmKExlbkluQnl0ZXMpCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDdHgtPklucHV0LCAoVUNIQVIgKilwRGF0YSwgTGVuSW5CeXRlcyk7Ci0KLX0KLQotCi0vKgotICogIEZ1bmN0aW9uIERlc2NyaXB0aW9uOgotICogICAgICBBcHBlbmQgcGFkZGluZyBiaXRzIGFuZCBsZW5ndGggb2Ygb3JpZ2luYWwgbWVzc2FnZSBpbiB0aGUgdGFpbAotICogICAgICBUaGUgbWVzc2FnZSBkaWdlc3QgaGFzIHRvIGJlIGNvbXBsZXRlZCBpbiB0aGUgZW5kCi0gKgotICogIEFyZ3VtZW50czoKLSAqICAgICAgRGlnZXN0CQlPdXRwdXQgb2YgRGlnZXN0LU1lc3NhZ2UgZm9yIE1ENQotICogIAlwQ3R4ICAgICAgICBQb2ludGVyCXRvIE1ENSBjb250ZXh0Ci0gKgotICogIFJldHVybiBWYWx1ZToKLSAqICAgICAgTm9uZQotICoKLSAqICBOb3RlOgotICogICAgICBDYWxsZWQgYWZ0ZXIgTUQ1VXBkYXRlCi0gKi8KLVZPSUQgTUQ1RmluYWwoVUNIQVIgRGlnZXN0WzE2XSwgTUQ1X0NUWCAqcEN0eCkKLXsKLSAgICBVQ0hBUiBSZW1haW5kZXI7Ci0gICAgVUNIQVIgUGFkTGVuSW5CeXRlczsKLSAgICBVQ0hBUiAqcEFwcGVuZD0wOwotICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgUmVtYWluZGVyID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAzKSAmIDB4M2YpOwotCi0gICAgUGFkTGVuSW5CeXRlcyA9IChSZW1haW5kZXIgPCA1NikgPyAoNTYtUmVtYWluZGVyKSA6ICgxMjAtUmVtYWluZGVyKTsKLQotICAgIHBBcHBlbmQgPSAoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcjsKLQotICAgIC8vIHBhZGRpbmcgYml0cyB3aXRob3V0IGNyb3NzaW5nIGJsb2NrKDY0LWJ5dGUgYmFzZWQpIGJvdW5kYXJ5Ci0gICAgaWYgKFJlbWFpbmRlciA8IDU2KQotICAgIHsKLSAgICAgICAgKnBBcHBlbmQgPSAweDgwOwotICAgICAgICBQYWRMZW5JbkJ5dGVzIC0tOwotCi0gICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgUmVtYWluZGVyKzEsIFBhZExlbkluQnl0ZXMpOwotCi0JCS8vIGFkZCBkYXRhLWxlbmd0aCBmaWVsZCwgZnJvbSBsb3cgdG8gaGlnaAotICAgICAgIAlmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgCXBDdHgtPklucHV0WzU2K2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAoaSA8PCAzKSkgJiAweGZmKTsKLSAgICAgICAgCXBDdHgtPklucHV0WzYwK2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFsxXSA+PiAoaSA8PCAzKSkgJiAweGZmKTsKLSAgICAgIAl9Ci0KLSAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKLSAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKLSAgICB9IC8vIGVuZCBvZiBpZgotCi0gICAgLy8gcGFkZGluZyBiaXRzIHdpdGggY3Jvc3NpbmcgYmxvY2soNjQtYnl0ZSBiYXNlZCkgYm91bmRhcnkKLSAgICBlbHNlCi0gICAgewotICAgICAgICAvLyB0aGUgZmlyc3QgYmxvY2sgPT09Ci0gICAgICAgICpwQXBwZW5kID0gMHg4MDsKLSAgICAgICAgUGFkTGVuSW5CeXRlcyAtLTsKLQotICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcisxLCAoNjQtUmVtYWluZGVyLTEpKTsKLSAgICAgICAgUGFkTGVuSW5CeXRlcyAtPSAoNjQgLSBSZW1haW5kZXIgLSAxKTsKLQotICAgICAgICBieXRlUmV2ZXJzZShwQ3R4LT5JbnB1dCwgMTYpOwotICAgICAgICBNRDVUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOwotCi0KLSAgICAgICAgLy8gdGhlIHNlY29uZCBibG9jayA9PT0KLSAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQsIFBhZExlbkluQnl0ZXMpOwotCi0gICAgICAgIC8vIGFkZCBkYXRhLWxlbmd0aCBmaWVsZAotICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgCXBDdHgtPklucHV0WzU2K2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAoaSA8PCAzKSkgJiAweGZmKTsKLSAgICAgICAgCXBDdHgtPklucHV0WzYwK2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFsxXSA+PiAoaSA8PCAzKSkgJiAweGZmKTsKLSAgICAgIAl9Ci0KLSAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKLSAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKLSAgICB9IC8vIGVuZCBvZiBlbHNlCi0KLQotICAgIE5kaXNNb3ZlTWVtb3J5KChVQ0hBUiAqKURpZ2VzdCwgKFVJTlQzMiAqKXBDdHgtPkJ1ZiwgMTYpOyAvLyBvdXRwdXQKLSAgICBieXRlUmV2ZXJzZSgoVUNIQVIgKilEaWdlc3QsIDQpOwotICAgIE5kaXNaZXJvTWVtb3J5KHBDdHgsIHNpemVvZihwQ3R4KSk7IC8vIG1lbW9yeSBmcmVlCi19Ci0KLQotLyoKLSAqICBGdW5jdGlvbiBEZXNjcmlwdGlvbjoKLSAqICAgICAgVGhlIGNlbnRyYWwgYWxnb3JpdGhtIG9mIE1ENSwgY29uc2lzdHMgb2YgZm91ciByb3VuZHMgYW5kIHNpeHRlZW4KLSAqICAJc3RlcHMgcGVyIHJvdW5kCi0gKgotICogIEFyZ3VtZW50czoKLSAqICAgICAgQnVmICAgICBCdWZmZXJzIG9mIGZvdXIgc3RhdGVzIChvdXRwdXQ6IDE2IGJ5dGVzKQotICogCSAgICBNZXMgICAgIElucHV0IGRhdGEgKGlucHV0OiA2NCBieXRlcykKLSAqCi0gKiAgUmV0dXJuIFZhbHVlOgotICogICAgICBOb25lCi0gKgotICogIE5vdGU6Ci0gKiAgICAgIENhbGxlZCBieSBNRDVVcGRhdGUgb3IgTUQ1RmluYWwKLSAqLwotVk9JRCBNRDVUcmFuc2Zvcm0oVUlOVDMyIEJ1Zls0XSwgVUlOVDMyIE1lc1sxNl0pCi17Ci0gICAgVUlOVDMyIFJlZ1s0XSwgVGVtcDsKLQl1bnNpZ25lZCBpbnQgaTsKLQotICAgIHN0YXRpYyBVQ0hBUiBMU2hpZnRWYWxbMTZdID0KLSAgICB7Ci0gICAgICAgIDcsIDEyLCAxNywgMjIsCi0JCTUsIDkgLCAxNCwgMjAsCi0JCTQsIDExLCAxNiwgMjMsCi0gCQk2LCAxMCwgMTUsIDIxLAotIAl9OwotCi0KLQkvLyBbZXF1YWwgdG8gNDI5NDk2NzI5NiphYnMoc2luKGluZGV4KSldCi0gICAgc3RhdGljIFVJTlQzMiBNRDVUYWJsZVs2NF0gPQotCXsKLQkJMHhkNzZhYTQ3OCwJMHhlOGM3Yjc1NiwJMHgyNDIwNzBkYiwJMHhjMWJkY2VlZSwKLQkJMHhmNTdjMGZhZiwJMHg0Nzg3YzYyYSwJMHhhODMwNDYxMywgMHhmZDQ2OTUwMSwKLQkJMHg2OTgwOThkOCwJMHg4YjQ0ZjdhZiwJMHhmZmZmNWJiMSwJMHg4OTVjZDdiZSwKLSAgICAJMHg2YjkwMTEyMiwJMHhmZDk4NzE5MywJMHhhNjc5NDM4ZSwJMHg0OWI0MDgyMSwKLQotICAgIAkweGY2MWUyNTYyLAkweGMwNDBiMzQwLAkweDI2NWU1YTUxLAkweGU5YjZjN2FhLAotICAgIAkweGQ2MmYxMDVkLAkweDAyNDQxNDUzLAkweGQ4YTFlNjgxLAkweGU3ZDNmYmM4LAotICAgIAkweDIxZTFjZGU2LAkweGMzMzcwN2Q2LAkweGY0ZDUwZDg3LAkweDQ1NWExNGVkLAotICAgIAkweGE5ZTNlOTA1LAkweGZjZWZhM2Y4LAkweDY3NmYwMmQ5LAkweDhkMmE0YzhhLAotCi0gICAgCTB4ZmZmYTM5NDIsCTB4ODc3MWY2ODEsCTB4NmQ5ZDYxMjIsCTB4ZmRlNTM4MGMsCi0gICAgCTB4YTRiZWVhNDQsCTB4NGJkZWNmYTksCTB4ZjZiYjRiNjAsCTB4YmViZmJjNzAsCi0gICAgCTB4Mjg5YjdlYzYsCTB4ZWFhMTI3ZmEsCTB4ZDRlZjMwODUsCTB4MDQ4ODFkMDUsCi0gICAgCTB4ZDlkNGQwMzksCTB4ZTZkYjk5ZTUsCTB4MWZhMjdjZjgsCTB4YzRhYzU2NjUsCi0KLSAgICAJMHhmNDI5MjI0NCwJMHg0MzJhZmY5NywJMHhhYjk0MjNhNywJMHhmYzkzYTAzOSwKLSAgIAkJMHg2NTViNTljMywJMHg4ZjBjY2M5MiwJMHhmZmVmZjQ3ZCwJMHg4NTg0NWRkMSwKLSAgICAJMHg2ZmE4N2U0ZiwJMHhmZTJjZTZlMCwJMHhhMzAxNDMxNCwJMHg0ZTA4MTFhMSwKLSAgICAJMHhmNzUzN2U4MiwJMHhiZDNhZjIzNSwJMHgyYWQ3ZDJiYiwJMHhlYjg2ZDM5MQotCX07Ci0KLQotICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKLSAgICAgICAgUmVnW2ldPUJ1ZltpXTsKLQotCi0gICAgLy8gNjQgc3RlcHMgaW4gTUQ1IGFsZ29yaXRobQotICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCi0gICAgewotICAgICAgICBNRDVTdGVwKE1ENV9GMSwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBNZXNbaV0sCi0gICAgICAgICAgICAgICAgTUQ1VGFibGVbaV0sIExTaGlmdFZhbFtpICYgMHgzXSk7Ci0KLSAgICAgICAgLy8gb25lLXdvcmQgcmlnaHQgc2hpZnQKLSAgICAgICAgVGVtcCAgID0gUmVnWzNdOwotICAgICAgICBSZWdbM10gPSBSZWdbMl07Ci0gICAgICAgIFJlZ1syXSA9IFJlZ1sxXTsKLSAgICAgICAgUmVnWzFdID0gUmVnWzBdOwotICAgICAgICBSZWdbMF0gPSBUZW1wOwotICAgIH0KLSAgICBmb3IgKGk9MTY7IGk8MzI7IGkrKykKLSAgICB7Ci0gICAgICAgIE1ENVN0ZXAoTUQ1X0YyLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIE1lc1soNSooaSAmIDB4ZikrMSkgJiAweGZdLAotICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbKDB4MSA8PCAyKSsoaSAmIDB4MyldKTsKLQotICAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAotICAgICAgICBUZW1wICAgPSBSZWdbM107Ci0gICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKLSAgICAgICAgUmVnWzJdID0gUmVnWzFdOwotICAgICAgICBSZWdbMV0gPSBSZWdbMF07Ci0gICAgICAgIFJlZ1swXSA9IFRlbXA7Ci0gICAgfQotICAgIGZvciAoaT0zMjsgaTw0ODsgaSsrKQotICAgIHsKLSAgICAgICAgTUQ1U3RlcChNRDVfRjMsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgTWVzWygzKihpICYgMHhmKSs1KSAmIDB4Zl0sCi0gICAgICAgICAgICAgICAgTUQ1VGFibGVbaV0sIExTaGlmdFZhbFsoMHgxIDw8IDMpKyhpICYgMHgzKV0pOwotCi0gICAgICAgIC8vIG9uZS13b3JkIHJpZ2h0IHNoaWZ0Ci0gICAgICAgIFRlbXAgICA9IFJlZ1szXTsKLSAgICAgICAgUmVnWzNdID0gUmVnWzJdOwotICAgICAgICBSZWdbMl0gPSBSZWdbMV07Ci0gICAgICAgIFJlZ1sxXSA9IFJlZ1swXTsKLSAgICAgICAgUmVnWzBdID0gVGVtcDsKLSAgICB9Ci0gICAgZm9yIChpPTQ4OyBpPDY0OyBpKyspCi0gICAgewotICAgICAgICBNRDVTdGVwKE1ENV9GNCwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBNZXNbKDcqKGkgJiAweGYpKSAmIDB4Zl0sCi0gICAgICAgICAgICAgICAgTUQ1VGFibGVbaV0sIExTaGlmdFZhbFsoMHgzIDw8IDIpKyhpICYgMHgzKV0pOwotCi0gICAgICAgIC8vIG9uZS13b3JkIHJpZ2h0IHNoaWZ0Ci0gICAgICAgIFRlbXAgICA9IFJlZ1szXTsKLSAgICAgICAgUmVnWzNdID0gUmVnWzJdOwotICAgICAgICBSZWdbMl0gPSBSZWdbMV07Ci0gICAgICAgIFJlZ1sxXSA9IFJlZ1swXTsKLSAgICAgICAgUmVnWzBdID0gVGVtcDsKLSAgICB9Ci0KLQotICAgIC8vICh0ZW1wb3Jhcnkpb3V0cHV0Ci0gICAgZm9yIChpPTA7IGk8NDsgaSsrKQotICAgICAgICBCdWZbaV0gKz0gUmVnW2ldOwotCi19Ci0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09ICBTSEEtMSBpbXBsZW1lbnRhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLy8gZm91ciBiYXNlIGZ1bmN0aW9ucyBmb3IgU0hBLTEKLSNkZWZpbmUgU0hBMV9GMShiLCBjLCBkKSAgICAoKChiKSAmIChjKSkgfCAoKH5iKSAmIChkKSkpCi0jZGVmaW5lIFNIQTFfRjIoYiwgYywgZCkgICAgKChiKSBeIChjKSBeIChkKSkKLSNkZWZpbmUgU0hBMV9GMyhiLCBjLCBkKSAgICAoKChiKSAmIChjKSkgfCAoKGIpICYgKGQpKSB8ICgoYykgJiAoZCkpKQotCi0KLSNkZWZpbmUgU0hBMVN0ZXAoZiwgYSwgYiwgYywgZCwgZSwgdywgaykgICAgXAotICAgICggZQkrPSAoIGYoYiwgYywgZCkgKyB3ICsgayArIENZQ0xJQ19MRUZUX1NISUZUKGEsIDUpKSAmIDB4ZmZmZmZmZmYsIFwKLSAgICAgIGIgPSBDWUNMSUNfTEVGVF9TSElGVChiLCAzMCkgKQotCi0vL0luaXRpYXRlIFNIQS0xIENvbnRleHQgc2F0aXNmaWVkIGluIFJGQyAzMTc0Ci1WT0lEIFNIQUluaXQoU0hBX0NUWCAqcEN0eCkKLXsKLSAgICBwQ3R4LT5CdWZbMF09MHg2NzQ1MjMwMTsKLSAgICBwQ3R4LT5CdWZbMV09MHhlZmNkYWI4OTsKLSAgICBwQ3R4LT5CdWZbMl09MHg5OGJhZGNmZTsKLSAgICBwQ3R4LT5CdWZbM109MHgxMDMyNTQ3NjsKLSAgICBwQ3R4LT5CdWZbNF09MHhjM2QyZTFmMDsKLQotICAgIHBDdHgtPkxlbkluQml0Q291bnRbMF09MDsKLSAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdPTA7Ci19Ci0KLS8qCi0gKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246Ci0gKiAgICAgIFVwZGF0ZSBTSEEtMSBDb250ZXh0LCBhbGxvdyBvZiBhbiBhcnJhcnkgb2Ygb2N0ZXRzIGFzIHRoZSBuZXh0Ci0gKiAgICAgIHBvcnRpb24gb2YgdGhlIG1lc3NhZ2UKLSAqCi0gKiAgQXJndW1lbnRzOgotICogICAgICBwQ3R4CQlQb2ludGVyCXRvIFNIQS0xIGNvbnRleHQKLSAqIAkgICAgcERhdGEgICAgICAgUG9pbnRlciB0byBpbnB1dCBkYXRhCi0gKiAgICAgIExlbkluQnl0ZXMgIFRoZSBsZW5ndGggb2YgaW5wdXQgZGF0YSAodW5pdDogYnl0ZSkKLSAqCi0gKiAgUmV0dXJuIFZhbHVlOgotICogICAgICBlcnJvciAgICAgICBpbmRpY2F0ZSBtb3JlIHRoYW4gcG93KDIsNjQpIGJpdHMgb2YgZGF0YQotICoKLSAqICBOb3RlOgotICogICAgICBDYWxsZWQgYWZ0ZXIgU0hBSW5pdCBvciBTSEFVcGRhdGUoaXRzZWxmKQotICovCi1VQ0hBUiBTSEFVcGRhdGUoU0hBX0NUWCAqcEN0eCwgVUNIQVIgKnBEYXRhLCBVSU5UMzIgTGVuSW5CeXRlcykKLXsKLSAgICBVSU5UMzIgVGZUaW1lczsKLSAgICBVSU5UMzIgdGVtcDEsdGVtcDI7Ci0JdW5zaWduZWQgaW50IGk7Ci0JVUNIQVIgZXJyPTE7Ci0KLSAgICB0ZW1wMSA9IHBDdHgtPkxlbkluQml0Q291bnRbMF07Ci0gICAgdGVtcDIgPSBwQ3R4LT5MZW5JbkJpdENvdW50WzFdOwotCi0gICAgcEN0eC0+TGVuSW5CaXRDb3VudFswXSA9IChVSU5UMzIpIChwQ3R4LT5MZW5JbkJpdENvdW50WzBdICsgKExlbkluQnl0ZXMgPDwgMykpOwotICAgIGlmIChwQ3R4LT5MZW5JbkJpdENvdW50WzBdIDwgdGVtcDEpCi0gICAgICAgIHBDdHgtPkxlbkluQml0Q291bnRbMV0rKzsgICAvL2NhcnJ5IGluCi0KLQotICAgIHBDdHgtPkxlbkluQml0Q291bnRbMV0gPSAoVUlOVDMyKSAocEN0eC0+TGVuSW5CaXRDb3VudFsxXSArKExlbkluQnl0ZXMgPj4gMjkpKTsKLSAgICBpZiAocEN0eC0+TGVuSW5CaXRDb3VudFsxXSA8IHRlbXAyKQotICAgICAgICByZXR1cm4gKGVycik7ICAgLy9jaGVjayB0b3RhbCBsZW5ndGggb2Ygb3JpZ2luYWwgZGF0YQotCi0KLSAgICAvLyBtb2QgNjQgYnl0ZXMKLSAgICB0ZW1wMSA9ICh0ZW1wMSA+PiAzKSAmIDB4M2Y7Ci0KLSAgICAvLyBwcm9jZXNzIGxhY2tzIG9mIDY0LWJ5dGUgZGF0YQotICAgIGlmICh0ZW1wMSkKLSAgICB7Ci0gICAgICAgIFVDSEFSICpwQWRzID0gKFVDSEFSICopIHBDdHgtPklucHV0ICsgdGVtcDE7Ci0KLSAgICAgICAgaWYgKCh0ZW1wMStMZW5JbkJ5dGVzKSA8IDY0KQotICAgICAgICB7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRzLCAoVUNIQVIgKilwRGF0YSwgTGVuSW5CeXRlcyk7Ci0gICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICB9Ci0KLSAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkcywgKFVDSEFSICopcERhdGEsIDY0LXRlbXAxKTsKLSAgICAgICAgYnl0ZVJldmVyc2UoKFVDSEFSICopcEN0eC0+SW5wdXQsIDE2KTsKLQotICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIDY0LCAxNik7Ci0gICAgICAgIFNIQVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7Ci0KLSAgICAgICAgcERhdGEgKz0gNjQtdGVtcDE7Ci0gICAgICAgIExlbkluQnl0ZXMgLT0gNjQtdGVtcDE7Ci0gICAgfSAvLyBlbmQgb2YgaWYgKHRlbXAxKQotCi0KLSAgICBUZlRpbWVzID0gKExlbkluQnl0ZXMgPj4gNik7Ci0KLSAgICBmb3IgKGk9VGZUaW1lczsgaT4wOyBpLS0pCi0gICAgewotICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ3R4LT5JbnB1dCwgKFVDSEFSICopcERhdGEsIDY0KTsKLSAgICAgICAgYnl0ZVJldmVyc2UoKFVDSEFSICopcEN0eC0+SW5wdXQsIDE2KTsKLQotICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIDY0LCAxNik7Ci0gICAgICAgIFNIQVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7Ci0gICAgICAgIHBEYXRhICs9IDY0OwotICAgICAgICBMZW5JbkJ5dGVzIC09IDY0OwotICAgIH0gLy8gZW5kIG9mIGZvcgotCi0gICAgLy8gYnVmZmVyaW5nIGxhY2tzIG9mIDY0LWJ5dGUgZGF0YQotICAgIGlmKExlbkluQnl0ZXMpCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDdHgtPklucHV0LCAoVUNIQVIgKilwRGF0YSwgTGVuSW5CeXRlcyk7Ci0KLQlyZXR1cm4gKDApOwotCi19Ci0KLS8vIEFwcGVuZCBwYWRkaW5nIGJpdHMgYW5kIGxlbmd0aCBvZiBvcmlnaW5hbCBtZXNzYWdlIGluIHRoZSB0YWlsCi0vLyBUaGUgbWVzc2FnZSBkaWdlc3QgaGFzIHRvIGJlIGNvbXBsZXRlZCBpbiB0aGUgZW5kCi1WT0lEIFNIQUZpbmFsKFNIQV9DVFggKnBDdHgsIFVDSEFSIERpZ2VzdFsyMF0pCi17Ci0gICAgVUNIQVIgUmVtYWluZGVyOwotICAgIFVDSEFSIFBhZExlbkluQnl0ZXM7Ci0gICAgVUNIQVIgKnBBcHBlbmQ9MDsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgIFJlbWFpbmRlciA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gMykgJiAweDNmKTsKLQotICAgIHBBcHBlbmQgPSAoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcjsKLQotICAgIFBhZExlbkluQnl0ZXMgPSAoUmVtYWluZGVyIDwgNTYpID8gKDU2LVJlbWFpbmRlcikgOiAoMTIwLVJlbWFpbmRlcik7Ci0KLSAgICAvLyBwYWRkaW5nIGJpdHMgd2l0aG91dCBjcm9zc2luZyBibG9jayg2NC1ieXRlIGJhc2VkKSBib3VuZGFyeQotICAgIGlmIChSZW1haW5kZXIgPCA1NikKLSAgICB7Ci0gICAgICAgICpwQXBwZW5kID0gMHg4MDsKLSAgICAgICAgUGFkTGVuSW5CeXRlcyAtLTsKLQotICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcisxLCBQYWRMZW5JbkJ5dGVzKTsKLQotCQkvLyBhZGQgZGF0YS1sZW5ndGggZmllbGQsIGZyb20gaGlnaCB0byBsb3cKLSAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgIAlwQ3R4LT5JbnB1dFs1NitpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPj4gKCgzLWkpIDw8IDMpKSAmIDB4ZmYpOwotICAgICAgICAJcEN0eC0+SW5wdXRbNjAraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzBdID4+ICgoMy1pKSA8PCAzKSkgJiAweGZmKTsKLSAgICAgIAl9Ci0KLSAgICAgICAgYnl0ZVJldmVyc2UoKFVDSEFSICopcEN0eC0+SW5wdXQsIDE2KTsKLSAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTQpOwotICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOwotICAgIH0gLy8gZW5kIG9mIGlmCi0KLSAgICAvLyBwYWRkaW5nIGJpdHMgd2l0aCBjcm9zc2luZyBibG9jayg2NC1ieXRlIGJhc2VkKSBib3VuZGFyeQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8vIHRoZSBmaXJzdCBibG9jayA9PT0KLSAgICAgICAgKnBBcHBlbmQgPSAweDgwOwotICAgICAgICBQYWRMZW5JbkJ5dGVzIC0tOwotCi0gICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgUmVtYWluZGVyKzEsICg2NC1SZW1haW5kZXItMSkpOwotICAgICAgICBQYWRMZW5JbkJ5dGVzIC09ICg2NCAtIFJlbWFpbmRlciAtIDEpOwotCi0gICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7Ci0gICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgNjQsIDE2KTsKLSAgICAgICAgU0hBVHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKLQotCi0gICAgICAgIC8vIHRoZSBzZWNvbmQgYmxvY2sgPT09Ci0gICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0LCBQYWRMZW5JbkJ5dGVzKTsKLQotCQkvLyBhZGQgZGF0YS1sZW5ndGggZmllbGQKLQkJZm9yIChpPTA7IGk8NDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgIAlwQ3R4LT5JbnB1dFs1NitpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPj4gKCgzLWkpIDw8IDMpKSAmIDB4ZmYpOwotICAgICAgICAJcEN0eC0+SW5wdXRbNjAraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzBdID4+ICgoMy1pKSA8PCAzKSkgJiAweGZmKTsKLSAgICAgIAl9Ci0KLSAgICAgICAgYnl0ZVJldmVyc2UoKFVDSEFSICopcEN0eC0+SW5wdXQsIDE2KTsKLSAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTYpOwotICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOwotICAgIH0gLy8gZW5kIG9mIGVsc2UKLQotCi0gICAgLy9PdXRwdXQsIGJ5dGVyZXZlcnNlCi0gICAgZm9yIChpPTA7IGk8MjA7IGkrKykKLSAgICB7Ci0gICAgICAgIERpZ2VzdCBbaV0gPSAoVUNIQVIpKHBDdHgtPkJ1ZltpPj4yXSA+PiA4KigzLShpICYgMHgzKSkpOwotICAgIH0KLQotICAgIE5kaXNaZXJvTWVtb3J5KHBDdHgsIHNpemVvZihwQ3R4KSk7IC8vIG1lbW9yeSBmcmVlCi19Ci0KLQotLy8gVGhlIGNlbnRyYWwgYWxnb3JpdGhtIG9mIFNIQS0xLCBjb25zaXN0cyBvZiBmb3VyIHJvdW5kcyBhbmQKLS8vIHR3ZW50eSBzdGVwcyBwZXIgcm91bmQKLVZPSUQgU0hBVHJhbnNmb3JtKFVJTlQzMiBCdWZbNV0sIFVJTlQzMiBNZXNbMjBdKQotewotICAgIFVJTlQzMiBSZWdbNV0sVGVtcDsKLQl1bnNpZ25lZCBpbnQgaTsKLSAgICBVSU5UMzIgV1s4MF07Ci0KLSAgICBzdGF0aWMgVUlOVDMyIFNIQTFUYWJsZVs0XSA9IHsgMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhmMWJiY2RjLCAweGNhNjJjMWQ2IH07Ci0KLSAgICBSZWdbMF09QnVmWzBdOwotCVJlZ1sxXT1CdWZbMV07Ci0JUmVnWzJdPUJ1ZlsyXTsKLQlSZWdbM109QnVmWzNdOwotCVJlZ1s0XT1CdWZbNF07Ci0KLSAgICAvL3RoZSBmaXJzdCBvY3RldCBvZiBhIHdvcmQgaXMgc3RvcmVkIGluIHRoZSAwdGggZWxlbWVudCwgYnl0ZXJldmVyc2UKLQlmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAJV1tpXSAgPSAoTWVzW2ldID4+IDI0KSAmIDB4ZmY7Ci0gICAgICAgIFdbaV0gfD0gKE1lc1tpXSA+PiA4ICkgJiAweGZmMDA7Ci0gICAgICAgIFdbaV0gfD0gKE1lc1tpXSA8PCA4ICkgJiAweGZmMDAwMDsKLSAgICAgICAgV1tpXSB8PSAoTWVzW2ldIDw8IDI0KSAmIDB4ZmYwMDAwMDA7Ci0gICAgfQotCi0KLSAgICBmb3IJKGkgPSAwOyBpIDwgNjQ7IGkrKykKLQkgICAgV1sxNitpXSA9IENZQ0xJQ19MRUZUX1NISUZUKFdbaV0gXiBXWzIraV0gXiBXWzgraV0gXiBXWzEzK2ldLCAxKTsKLQotCi0gICAgLy8gODAgc3RlcHMgaW4gU0hBLTEgYWxnb3JpdGhtCi0gICAgZm9yIChpPTA7IGk8ODA7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChpPDIwKQotICAgICAgICAgICAgU0hBMVN0ZXAoU0hBMV9GMSwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBSZWdbNF0sCi0gICAgICAgICAgICAgICAgICAgICBXW2ldLCBTSEExVGFibGVbMF0pOwotCi0gICAgICAgIGVsc2UgaWYgKGk+PTIwICYmIGk8NDApCi0gICAgICAgICAgICBTSEExU3RlcChTSEExX0YyLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIFJlZ1s0XSwKLSAgICAgICAgICAgICAgICAgICAgIFdbaV0sIFNIQTFUYWJsZVsxXSk7Ci0KLQkJZWxzZSBpZiAoaT49NDAgJiYgaTw2MCkKLSAgICAgICAgICAgIFNIQTFTdGVwKFNIQTFfRjMsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgUmVnWzRdLAotICAgICAgICAgICAgICAgICAgICAgIFdbaV0sIFNIQTFUYWJsZVsyXSk7Ci0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgU0hBMVN0ZXAoU0hBMV9GMiwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBSZWdbNF0sCi0gICAgICAgICAgICAgICAgICAgICBXW2ldLCBTSEExVGFibGVbM10pOwotCi0KLSAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAotCQlUZW1wICAgPSBSZWdbNF07Ci0gICAgICAgIFJlZ1s0XSA9IFJlZ1szXTsKLSAgICAgICAgUmVnWzNdID0gUmVnWzJdOwotICAgICAgICBSZWdbMl0gPSBSZWdbMV07Ci0gICAgICAgIFJlZ1sxXSA9IFJlZ1swXTsKLSAgICAgICAgUmVnWzBdID0gVGVtcDsKLQotICAgIH0gLy8gZW5kIG9mIGZvci1sb29wCi0KLQotICAgIC8vICh0ZW1wb3Jhcnkpb3V0cHV0Ci0gICAgZm9yIChpPTA7IGk8NTsgaSsrKQotICAgICAgICBCdWZbaV0gKz0gUmVnW2ldOwotCi19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PSAgQUVTIEVuL0RlY3J5cHRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotLyogZm9yd2FyZCBTLWJveCAqLwotc3RhdGljIHVpbnQzMiBGU2JbMjU2XSA9Ci17Ci0JMHg2MywgMHg3QywJMHg3NywgMHg3QiwJMHhGMiwgMHg2QiwJMHg2RiwgMHhDNSwKLQkweDMwLCAweDAxLAkweDY3LCAweDJCLAkweEZFLCAweEQ3LAkweEFCLCAweDc2LAotCTB4Q0EsIDB4ODIsCTB4QzksIDB4N0QsCTB4RkEsIDB4NTksCTB4NDcsIDB4RjAsCi0JMHhBRCwgMHhENCwJMHhBMiwgMHhBRiwJMHg5QywgMHhBNCwJMHg3MiwgMHhDMCwKLQkweEI3LCAweEZELAkweDkzLCAweDI2LAkweDM2LCAweDNGLAkweEY3LCAweENDLAotCTB4MzQsIDB4QTUsCTB4RTUsIDB4RjEsCTB4NzEsIDB4RDgsCTB4MzEsIDB4MTUsCi0JMHgwNCwgMHhDNywJMHgyMywgMHhDMywJMHgxOCwgMHg5NiwJMHgwNSwgMHg5QSwKLQkweDA3LCAweDEyLAkweDgwLCAweEUyLAkweEVCLCAweDI3LAkweEIyLCAweDc1LAotCTB4MDksIDB4ODMsCTB4MkMsIDB4MUEsCTB4MUIsIDB4NkUsCTB4NUEsIDB4QTAsCi0JMHg1MiwgMHgzQiwJMHhENiwgMHhCMywJMHgyOSwgMHhFMywJMHgyRiwgMHg4NCwKLQkweDUzLCAweEQxLAkweDAwLCAweEVELAkweDIwLCAweEZDLAkweEIxLCAweDVCLAotCTB4NkEsIDB4Q0IsCTB4QkUsIDB4MzksCTB4NEEsIDB4NEMsCTB4NTgsIDB4Q0YsCi0JMHhEMCwgMHhFRiwJMHhBQSwgMHhGQiwJMHg0MywgMHg0RCwJMHgzMywgMHg4NSwKLQkweDQ1LCAweEY5LAkweDAyLCAweDdGLAkweDUwLCAweDNDLAkweDlGLCAweEE4LAotCTB4NTEsIDB4QTMsCTB4NDAsIDB4OEYsCTB4OTIsIDB4OUQsCTB4MzgsIDB4RjUsCi0JMHhCQywgMHhCNiwJMHhEQSwgMHgyMSwJMHgxMCwgMHhGRiwJMHhGMywgMHhEMiwKLQkweENELCAweDBDLAkweDEzLCAweEVDLAkweDVGLCAweDk3LAkweDQ0LCAweDE3LAotCTB4QzQsIDB4QTcsCTB4N0UsIDB4M0QsCTB4NjQsIDB4NUQsCTB4MTksIDB4NzMsCi0JMHg2MCwgMHg4MSwJMHg0RiwgMHhEQywJMHgyMiwgMHgyQSwJMHg5MCwgMHg4OCwKLQkweDQ2LCAweEVFLAkweEI4LCAweDE0LAkweERFLCAweDVFLAkweDBCLCAweERCLAotCTB4RTAsIDB4MzIsCTB4M0EsIDB4MEEsCTB4NDksIDB4MDYsCTB4MjQsIDB4NUMsCi0JMHhDMiwgMHhEMywJMHhBQywgMHg2MiwJMHg5MSwgMHg5NSwJMHhFNCwgMHg3OSwKLQkweEU3LCAweEM4LAkweDM3LCAweDZELAkweDhELCAweEQ1LAkweDRFLCAweEE5LAotCTB4NkMsIDB4NTYsCTB4RjQsIDB4RUEsCTB4NjUsIDB4N0EsCTB4QUUsIDB4MDgsCi0JMHhCQSwgMHg3OCwJMHgyNSwgMHgyRSwJMHgxQywgMHhBNiwJMHhCNCwgMHhDNiwKLQkweEU4LCAweERELAkweDc0LCAweDFGLAkweDRCLCAweEJELAkweDhCLCAweDhBLAotCTB4NzAsIDB4M0UsCTB4QjUsIDB4NjYsCTB4NDgsIDB4MDMsCTB4RjYsIDB4MEUsCi0JMHg2MSwgMHgzNSwJMHg1NywgMHhCOSwJMHg4NiwgMHhDMSwJMHgxRCwgMHg5RSwKLQkweEUxLCAweEY4LAkweDk4LCAweDExLAkweDY5LCAweEQ5LAkweDhFLCAweDk0LAotCTB4OUIsIDB4MUUsCTB4ODcsIDB4RTksCTB4Q0UsIDB4NTUsCTB4MjgsIDB4REYsCi0JMHg4QywgMHhBMSwJMHg4OSwgMHgwRCwJMHhCRiwgMHhFNiwJMHg0MiwgMHg2OCwKLQkweDQxLCAweDk5LAkweDJELCAweDBGLAkweEIwLCAweDU0LAkweEJCLCAweDE2Ci19OwotCi0vKiBmb3J3YXJkIHRhYmxlICovCi0jZGVmaW5lCUZUIFwKLVwKLQlWKEM2LDYzLDYzLEE1KSwJVihGOCw3Qyw3Qyw4NCksCVYoRUUsNzcsNzcsOTkpLAlWKEY2LDdCLDdCLDhEKSwJXAotCVYoRkYsRjIsRjIsMEQpLAlWKEQ2LDZCLDZCLEJEKSwJVihERSw2Riw2RixCMSksCVYoOTEsQzUsQzUsNTQpLAlcCi0JVig2MCwzMCwzMCw1MCksCVYoMDIsMDEsMDEsMDMpLAlWKENFLDY3LDY3LEE5KSwJVig1NiwyQiwyQiw3RCksCVwKLQlWKEU3LEZFLEZFLDE5KSwJVihCNSxENyxENyw2MiksCVYoNEQsQUIsQUIsRTYpLAlWKEVDLDc2LDc2LDlBKSwJXAotCVYoOEYsQ0EsQ0EsNDUpLAlWKDFGLDgyLDgyLDlEKSwJVig4OSxDOSxDOSw0MCksCVYoRkEsN0QsN0QsODcpLAlcCi0JVihFRixGQSxGQSwxNSksCVYoQjIsNTksNTksRUIpLAlWKDhFLDQ3LDQ3LEM5KSwJVihGQixGMCxGMCwwQiksCVwKLQlWKDQxLEFELEFELEVDKSwJVihCMyxENCxENCw2NyksCVYoNUYsQTIsQTIsRkQpLAlWKDQ1LEFGLEFGLEVBKSwJXAotCVYoMjMsOUMsOUMsQkYpLAlWKDUzLEE0LEE0LEY3KSwJVihFNCw3Miw3Miw5NiksCVYoOUIsQzAsQzAsNUIpLAlcCi0JVig3NSxCNyxCNyxDMiksCVYoRTEsRkQsRkQsMUMpLAlWKDNELDkzLDkzLEFFKSwJVig0QywyNiwyNiw2QSksCVwKLQlWKDZDLDM2LDM2LDVBKSwJVig3RSwzRiwzRiw0MSksCVYoRjUsRjcsRjcsMDIpLAlWKDgzLENDLENDLDRGKSwJXAotCVYoNjgsMzQsMzQsNUMpLAlWKDUxLEE1LEE1LEY0KSwJVihEMSxFNSxFNSwzNCksCVYoRjksRjEsRjEsMDgpLAlcCi0JVihFMiw3MSw3MSw5MyksCVYoQUIsRDgsRDgsNzMpLAlWKDYyLDMxLDMxLDUzKSwJVigyQSwxNSwxNSwzRiksCVwKLQlWKDA4LDA0LDA0LDBDKSwJVig5NSxDNyxDNyw1MiksCVYoNDYsMjMsMjMsNjUpLAlWKDlELEMzLEMzLDVFKSwJXAotCVYoMzAsMTgsMTgsMjgpLAlWKDM3LDk2LDk2LEExKSwJVigwQSwwNSwwNSwwRiksCVYoMkYsOUEsOUEsQjUpLAlcCi0JVigwRSwwNywwNywwOSksCVYoMjQsMTIsMTIsMzYpLAlWKDFCLDgwLDgwLDlCKSwJVihERixFMixFMiwzRCksCVwKLQlWKENELEVCLEVCLDI2KSwJVig0RSwyNywyNyw2OSksCVYoN0YsQjIsQjIsQ0QpLAlWKEVBLDc1LDc1LDlGKSwJXAotCVYoMTIsMDksMDksMUIpLAlWKDFELDgzLDgzLDlFKSwJVig1OCwyQywyQyw3NCksCVYoMzQsMUEsMUEsMkUpLAlcCi0JVigzNiwxQiwxQiwyRCksCVYoREMsNkUsNkUsQjIpLAlWKEI0LDVBLDVBLEVFKSwJVig1QixBMCxBMCxGQiksCVwKLQlWKEE0LDUyLDUyLEY2KSwJVig3NiwzQiwzQiw0RCksCVYoQjcsRDYsRDYsNjEpLAlWKDdELEIzLEIzLENFKSwJXAotCVYoNTIsMjksMjksN0IpLAlWKERELEUzLEUzLDNFKSwJVig1RSwyRiwyRiw3MSksCVYoMTMsODQsODQsOTcpLAlcCi0JVihBNiw1Myw1MyxGNSksCVYoQjksRDEsRDEsNjgpLAlWKDAwLDAwLDAwLDAwKSwJVihDMSxFRCxFRCwyQyksCVwKLQlWKDQwLDIwLDIwLDYwKSwJVihFMyxGQyxGQywxRiksCVYoNzksQjEsQjEsQzgpLAlWKEI2LDVCLDVCLEVEKSwJXAotCVYoRDQsNkEsNkEsQkUpLAlWKDhELENCLENCLDQ2KSwJVig2NyxCRSxCRSxEOSksCVYoNzIsMzksMzksNEIpLAlcCi0JVig5NCw0QSw0QSxERSksCVYoOTgsNEMsNEMsRDQpLAlWKEIwLDU4LDU4LEU4KSwJVig4NSxDRixDRiw0QSksCVwKLQlWKEJCLEQwLEQwLDZCKSwJVihDNSxFRixFRiwyQSksCVYoNEYsQUEsQUEsRTUpLAlWKEVELEZCLEZCLDE2KSwJXAotCVYoODYsNDMsNDMsQzUpLAlWKDlBLDRELDRELEQ3KSwJVig2NiwzMywzMyw1NSksCVYoMTEsODUsODUsOTQpLAlcCi0JVig4QSw0NSw0NSxDRiksCVYoRTksRjksRjksMTApLAlWKDA0LDAyLDAyLDA2KSwJVihGRSw3Riw3Riw4MSksCVwKLQlWKEEwLDUwLDUwLEYwKSwJVig3OCwzQywzQyw0NCksCVYoMjUsOUYsOUYsQkEpLAlWKDRCLEE4LEE4LEUzKSwJXAotCVYoQTIsNTEsNTEsRjMpLAlWKDVELEEzLEEzLEZFKSwJVig4MCw0MCw0MCxDMCksCVYoMDUsOEYsOEYsOEEpLAlcCi0JVigzRiw5Miw5MixBRCksCVYoMjEsOUQsOUQsQkMpLAlWKDcwLDM4LDM4LDQ4KSwJVihGMSxGNSxGNSwwNCksCVwKLQlWKDYzLEJDLEJDLERGKSwJVig3NyxCNixCNixDMSksCVYoQUYsREEsREEsNzUpLAlWKDQyLDIxLDIxLDYzKSwJXAotCVYoMjAsMTAsMTAsMzApLAlWKEU1LEZGLEZGLDFBKSwJVihGRCxGMyxGMywwRSksCVYoQkYsRDIsRDIsNkQpLAlcCi0JVig4MSxDRCxDRCw0QyksCVYoMTgsMEMsMEMsMTQpLAlWKDI2LDEzLDEzLDM1KSwJVihDMyxFQyxFQywyRiksCVwKLQlWKEJFLDVGLDVGLEUxKSwJVigzNSw5Nyw5NyxBMiksCVYoODgsNDQsNDQsQ0MpLAlWKDJFLDE3LDE3LDM5KSwJXAotCVYoOTMsQzQsQzQsNTcpLAlWKDU1LEE3LEE3LEYyKSwJVihGQyw3RSw3RSw4MiksCVYoN0EsM0QsM0QsNDcpLAlcCi0JVihDOCw2NCw2NCxBQyksCVYoQkEsNUQsNUQsRTcpLAlWKDMyLDE5LDE5LDJCKSwJVihFNiw3Myw3Myw5NSksCVwKLQlWKEMwLDYwLDYwLEEwKSwJVigxOSw4MSw4MSw5OCksCVYoOUUsNEYsNEYsRDEpLAlWKEEzLERDLERDLDdGKSwJXAotCVYoNDQsMjIsMjIsNjYpLAlWKDU0LDJBLDJBLDdFKSwJVigzQiw5MCw5MCxBQiksCVYoMEIsODgsODgsODMpLAlcCi0JVig4Qyw0Niw0NixDQSksCVYoQzcsRUUsRUUsMjkpLAlWKDZCLEI4LEI4LEQzKSwJVigyOCwxNCwxNCwzQyksCVwKLQlWKEE3LERFLERFLDc5KSwJVihCQyw1RSw1RSxFMiksCVYoMTYsMEIsMEIsMUQpLAlWKEFELERCLERCLDc2KSwJXAotCVYoREIsRTAsRTAsM0IpLAlWKDY0LDMyLDMyLDU2KSwJVig3NCwzQSwzQSw0RSksCVYoMTQsMEEsMEEsMUUpLAlcCi0JVig5Miw0OSw0OSxEQiksCVYoMEMsMDYsMDYsMEEpLAlWKDQ4LDI0LDI0LDZDKSwJVihCOCw1Qyw1QyxFNCksCVwKLQlWKDlGLEMyLEMyLDVEKSwJVihCRCxEMyxEMyw2RSksCVYoNDMsQUMsQUMsRUYpLAlWKEM0LDYyLDYyLEE2KSwJXAotCVYoMzksOTEsOTEsQTgpLAlWKDMxLDk1LDk1LEE0KSwJVihEMyxFNCxFNCwzNyksCVYoRjIsNzksNzksOEIpLAlcCi0JVihENSxFNyxFNywzMiksCVYoOEIsQzgsQzgsNDMpLAlWKDZFLDM3LDM3LDU5KSwJVihEQSw2RCw2RCxCNyksCVwKLQlWKDAxLDhELDhELDhDKSwJVihCMSxENSxENSw2NCksCVYoOUMsNEUsNEUsRDIpLAlWKDQ5LEE5LEE5LEUwKSwJXAotCVYoRDgsNkMsNkMsQjQpLAlWKEFDLDU2LDU2LEZBKSwJVihGMyxGNCxGNCwwNyksCVYoQ0YsRUEsRUEsMjUpLAlcCi0JVihDQSw2NSw2NSxBRiksCVYoRjQsN0EsN0EsOEUpLAlWKDQ3LEFFLEFFLEU5KSwJVigxMCwwOCwwOCwxOCksCVwKLQlWKDZGLEJBLEJBLEQ1KSwJVihGMCw3OCw3OCw4OCksCVYoNEEsMjUsMjUsNkYpLAlWKDVDLDJFLDJFLDcyKSwJXAotCVYoMzgsMUMsMUMsMjQpLAlWKDU3LEE2LEE2LEYxKSwJVig3MyxCNCxCNCxDNyksCVYoOTcsQzYsQzYsNTEpLAlcCi0JVihDQixFOCxFOCwyMyksCVYoQTEsREQsREQsN0MpLAlWKEU4LDc0LDc0LDlDKSwJVigzRSwxRiwxRiwyMSksCVwKLQlWKDk2LDRCLDRCLEREKSwJVig2MSxCRCxCRCxEQyksCVYoMEQsOEIsOEIsODYpLAlWKDBGLDhBLDhBLDg1KSwJXAotCVYoRTAsNzAsNzAsOTApLAlWKDdDLDNFLDNFLDQyKSwJVig3MSxCNSxCNSxDNCksCVYoQ0MsNjYsNjYsQUEpLAlcCi0JVig5MCw0OCw0OCxEOCksCVYoMDYsMDMsMDMsMDUpLAlWKEY3LEY2LEY2LDAxKSwJVigxQywwRSwwRSwxMiksCVwKLQlWKEMyLDYxLDYxLEEzKSwJVig2QSwzNSwzNSw1RiksCVYoQUUsNTcsNTcsRjkpLAlWKDY5LEI5LEI5LEQwKSwJXAotCVYoMTcsODYsODYsOTEpLAlWKDk5LEMxLEMxLDU4KSwJVigzQSwxRCwxRCwyNyksCVYoMjcsOUUsOUUsQjkpLAlcCi0JVihEOSxFMSxFMSwzOCksCVYoRUIsRjgsRjgsMTMpLAlWKDJCLDk4LDk4LEIzKSwJVigyMiwxMSwxMSwzMyksCVwKLQlWKEQyLDY5LDY5LEJCKSwJVihBOSxEOSxEOSw3MCksCVYoMDcsOEUsOEUsODkpLAlWKDMzLDk0LDk0LEE3KSwJXAotCVYoMkQsOUIsOUIsQjYpLAlWKDNDLDFFLDFFLDIyKSwJVigxNSw4Nyw4Nyw5MiksCVYoQzksRTksRTksMjApLAlcCi0JVig4NyxDRSxDRSw0OSksCVYoQUEsNTUsNTUsRkYpLAlWKDUwLDI4LDI4LDc4KSwJVihBNSxERixERiw3QSksCVwKLQlWKDAzLDhDLDhDLDhGKSwJVig1OSxBMSxBMSxGOCksCVYoMDksODksODksODApLAlWKDFBLDBELDBELDE3KSwJXAotCVYoNjUsQkYsQkYsREEpLAlWKEQ3LEU2LEU2LDMxKSwJVig4NCw0Miw0MixDNiksCVYoRDAsNjgsNjgsQjgpLAlcCi0JVig4Miw0MSw0MSxDMyksCVYoMjksOTksOTksQjApLAlWKDVBLDJELDJELDc3KSwJVigxRSwwRiwwRiwxMSksCVwKLQlWKDdCLEIwLEIwLENCKSwJVihBOCw1NCw1NCxGQyksCVYoNkQsQkIsQkIsRDYpLAlWKDJDLDE2LDE2LDNBKQotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2EjI2IjI2MjI2QKLXN0YXRpYyB1aW50MzIgRlQwWzI1Nl0gPSB7IEZUIH07Ci0jdW5kZWYgVgotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2QjI2EjI2IjI2MKLXN0YXRpYyB1aW50MzIgRlQxWzI1Nl0gPSB7IEZUIH07Ci0jdW5kZWYgVgotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2MjI2QjI2EjI2IKLXN0YXRpYyB1aW50MzIgRlQyWzI1Nl0gPSB7IEZUIH07Ci0jdW5kZWYgVgotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2IjI2MjI2QjI2EKLXN0YXRpYyB1aW50MzIgRlQzWzI1Nl0gPSB7IEZUIH07Ci0jdW5kZWYgVgotCi0jdW5kZWYgRlQKLQotLyogcmV2ZXJzZSBTLWJveCAqLwotCi1zdGF0aWMgdWludDMyIFJTYlsyNTZdID0KLXsKLQkweDUyLCAweDA5LAkweDZBLCAweEQ1LAkweDMwLCAweDM2LAkweEE1LCAweDM4LAotCTB4QkYsIDB4NDAsCTB4QTMsIDB4OUUsCTB4ODEsIDB4RjMsCTB4RDcsIDB4RkIsCi0JMHg3QywgMHhFMywJMHgzOSwgMHg4MiwJMHg5QiwgMHgyRiwJMHhGRiwgMHg4NywKLQkweDM0LCAweDhFLAkweDQzLCAweDQ0LAkweEM0LCAweERFLAkweEU5LCAweENCLAotCTB4NTQsIDB4N0IsCTB4OTQsIDB4MzIsCTB4QTYsIDB4QzIsCTB4MjMsIDB4M0QsCi0JMHhFRSwgMHg0QywJMHg5NSwgMHgwQiwJMHg0MiwgMHhGQSwJMHhDMywgMHg0RSwKLQkweDA4LCAweDJFLAkweEExLCAweDY2LAkweDI4LCAweEQ5LAkweDI0LCAweEIyLAotCTB4NzYsIDB4NUIsCTB4QTIsIDB4NDksCTB4NkQsIDB4OEIsCTB4RDEsIDB4MjUsCi0JMHg3MiwgMHhGOCwJMHhGNiwgMHg2NCwJMHg4NiwgMHg2OCwJMHg5OCwgMHgxNiwKLQkweEQ0LCAweEE0LAkweDVDLCAweENDLAkweDVELCAweDY1LAkweEI2LCAweDkyLAotCTB4NkMsIDB4NzAsCTB4NDgsIDB4NTAsCTB4RkQsIDB4RUQsCTB4QjksIDB4REEsCi0JMHg1RSwgMHgxNSwJMHg0NiwgMHg1NywJMHhBNywgMHg4RCwJMHg5RCwgMHg4NCwKLQkweDkwLCAweEQ4LAkweEFCLCAweDAwLAkweDhDLCAweEJDLAkweEQzLCAweDBBLAotCTB4RjcsIDB4RTQsCTB4NTgsIDB4MDUsCTB4QjgsIDB4QjMsCTB4NDUsIDB4MDYsCi0JMHhEMCwgMHgyQywJMHgxRSwgMHg4RiwJMHhDQSwgMHgzRiwJMHgwRiwgMHgwMiwKLQkweEMxLCAweEFGLAkweEJELCAweDAzLAkweDAxLCAweDEzLAkweDhBLCAweDZCLAotCTB4M0EsIDB4OTEsCTB4MTEsIDB4NDEsCTB4NEYsIDB4NjcsCTB4REMsIDB4RUEsCi0JMHg5NywgMHhGMiwJMHhDRiwgMHhDRSwJMHhGMCwgMHhCNCwJMHhFNiwgMHg3MywKLQkweDk2LCAweEFDLAkweDc0LCAweDIyLAkweEU3LCAweEFELAkweDM1LCAweDg1LAotCTB4RTIsIDB4RjksCTB4MzcsIDB4RTgsCTB4MUMsIDB4NzUsCTB4REYsIDB4NkUsCi0JMHg0NywgMHhGMSwJMHgxQSwgMHg3MSwJMHgxRCwgMHgyOSwJMHhDNSwgMHg4OSwKLQkweDZGLCAweEI3LAkweDYyLCAweDBFLAkweEFBLCAweDE4LAkweEJFLCAweDFCLAotCTB4RkMsIDB4NTYsCTB4M0UsIDB4NEIsCTB4QzYsIDB4RDIsCTB4NzksIDB4MjAsCi0JMHg5QSwgMHhEQiwJMHhDMCwgMHhGRSwJMHg3OCwgMHhDRCwJMHg1QSwgMHhGNCwKLQkweDFGLCAweERELAkweEE4LCAweDMzLAkweDg4LCAweDA3LAkweEM3LCAweDMxLAotCTB4QjEsIDB4MTIsCTB4MTAsIDB4NTksCTB4MjcsIDB4ODAsCTB4RUMsIDB4NUYsCi0JMHg2MCwgMHg1MSwJMHg3RiwgMHhBOSwJMHgxOSwgMHhCNSwJMHg0QSwgMHgwRCwKLQkweDJELCAweEU1LAkweDdBLCAweDlGLAkweDkzLCAweEM5LAkweDlDLCAweEVGLAotCTB4QTAsIDB4RTAsCTB4M0IsIDB4NEQsCTB4QUUsIDB4MkEsCTB4RjUsIDB4QjAsCi0JMHhDOCwgMHhFQiwJMHhCQiwgMHgzQywJMHg4MywgMHg1MywJMHg5OSwgMHg2MSwKLQkweDE3LCAweDJCLAkweDA0LCAweDdFLAkweEJBLCAweDc3LAkweEQ2LCAweDI2LAotCTB4RTEsIDB4NjksCTB4MTQsIDB4NjMsCTB4NTUsIDB4MjEsCTB4MEMsIDB4N0QKLX07Ci0KLS8qIHJldmVyc2UgdGFibGUgKi8KLQotI2RlZmluZQlSVCBcCi1cCi0JVig1MSxGNCxBNyw1MCksCVYoN0UsNDEsNjUsNTMpLAlWKDFBLDE3LEE0LEMzKSwJVigzQSwyNyw1RSw5NiksCVwKLQlWKDNCLEFCLDZCLENCKSwJVigxRiw5RCw0NSxGMSksCVYoQUMsRkEsNTgsQUIpLAlWKDRCLEUzLDAzLDkzKSwJXAotCVYoMjAsMzAsRkEsNTUpLAlWKEFELDc2LDZELEY2KSwJVig4OCxDQyw3Niw5MSksCVYoRjUsMDIsNEMsMjUpLAlcCi0JVig0RixFNSxENyxGQyksCVYoQzUsMkEsQ0IsRDcpLAlWKDI2LDM1LDQ0LDgwKSwJVihCNSw2MixBMyw4RiksCVwKLQlWKERFLEIxLDVBLDQ5KSwJVigyNSxCQSwxQiw2NyksCVYoNDUsRUEsMEUsOTgpLAlWKDVELEZFLEMwLEUxKSwJXAotCVYoQzMsMkYsNzUsMDIpLAlWKDgxLDRDLEYwLDEyKSwJVig4RCw0Niw5NyxBMyksCVYoNkIsRDMsRjksQzYpLAlcCi0JVigwMyw4Riw1RixFNyksCVYoMTUsOTIsOUMsOTUpLAlWKEJGLDZELDdBLEVCKSwJVig5NSw1Miw1OSxEQSksCVwKLQlWKEQ0LEJFLDgzLDJEKSwJVig1OCw3NCwyMSxEMyksCVYoNDksRTAsNjksMjkpLAlWKDhFLEM5LEM4LDQ0KSwJXAotCVYoNzUsQzIsODksNkEpLAlWKEY0LDhFLDc5LDc4KSwJVig5OSw1OCwzRSw2QiksCVYoMjcsQjksNzEsREQpLAlcCi0JVihCRSxFMSw0RixCNiksCVYoRjAsODgsQUQsMTcpLAlWKEM5LDIwLEFDLDY2KSwJVig3RCxDRSwzQSxCNCksCVwKLQlWKDYzLERGLDRBLDE4KSwJVihFNSwxQSwzMSw4MiksCVYoOTcsNTEsMzMsNjApLAlWKDYyLDUzLDdGLDQ1KSwJXAotCVYoQjEsNjQsNzcsRTApLAlWKEJCLDZCLEFFLDg0KSwJVihGRSw4MSxBMCwxQyksCVYoRjksMDgsMkIsOTQpLAlcCi0JVig3MCw0OCw2OCw1OCksCVYoOEYsNDUsRkQsMTkpLAlWKDk0LERFLDZDLDg3KSwJVig1Miw3QixGOCxCNyksCVwKLQlWKEFCLDczLEQzLDIzKSwJVig3Miw0QiwwMixFMiksCVYoRTMsMUYsOEYsNTcpLAlWKDY2LDU1LEFCLDJBKSwJXAotCVYoQjIsRUIsMjgsMDcpLAlWKDJGLEI1LEMyLDAzKSwJVig4NixDNSw3Qiw5QSksCVYoRDMsMzcsMDgsQTUpLAlcCi0JVigzMCwyOCw4NyxGMiksCVYoMjMsQkYsQTUsQjIpLAlWKDAyLDAzLDZBLEJBKSwJVihFRCwxNiw4Miw1QyksCVwKLQlWKDhBLENGLDFDLDJCKSwJVihBNyw3OSxCNCw5MiksCVYoRjMsMDcsRjIsRjApLAlWKDRFLDY5LEUyLEExKSwJXAotCVYoNjUsREEsRjQsQ0QpLAlWKDA2LDA1LEJFLEQ1KSwJVihEMSwzNCw2MiwxRiksCVYoQzQsQTYsRkUsOEEpLAlcCi0JVigzNCwyRSw1Myw5RCksCVYoQTIsRjMsNTUsQTApLAlWKDA1LDhBLEUxLDMyKSwJVihBNCxGNixFQiw3NSksCVwKLQlWKDBCLDgzLEVDLDM5KSwJVig0MCw2MCxFRixBQSksCVYoNUUsNzEsOUYsMDYpLAlWKEJELDZFLDEwLDUxKSwJXAotCVYoM0UsMjEsOEEsRjkpLAlWKDk2LERELDA2LDNEKSwJVihERCwzRSwwNSxBRSksCVYoNEQsRTYsQkQsNDYpLAlcCi0JVig5MSw1NCw4RCxCNSksCVYoNzEsQzQsNUQsMDUpLAlWKDA0LDA2LEQ0LDZGKSwJVig2MCw1MCwxNSxGRiksCVwKLQlWKDE5LDk4LEZCLDI0KSwJVihENixCRCxFOSw5NyksCVYoODksNDAsNDMsQ0MpLAlWKDY3LEQ5LDlFLDc3KSwJXAotCVYoQjAsRTgsNDIsQkQpLAlWKDA3LDg5LDhCLDg4KSwJVihFNywxOSw1QiwzOCksCVYoNzksQzgsRUUsREIpLAlcCi0JVihBMSw3QywwQSw0NyksCVYoN0MsNDIsMEYsRTkpLAlWKEY4LDg0LDFFLEM5KSwJVigwMCwwMCwwMCwwMCksCVwKLQlWKDA5LDgwLDg2LDgzKSwJVigzMiwyQixFRCw0OCksCVYoMUUsMTEsNzAsQUMpLAlWKDZDLDVBLDcyLDRFKSwJXAotCVYoRkQsMEUsRkYsRkIpLAlWKDBGLDg1LDM4LDU2KSwJVigzRCxBRSxENSwxRSksCVYoMzYsMkQsMzksMjcpLAlcCi0JVigwQSwwRixEOSw2NCksCVYoNjgsNUMsQTYsMjEpLAlWKDlCLDVCLDU0LEQxKSwJVigyNCwzNiwyRSwzQSksCVwKLQlWKDBDLDBBLDY3LEIxKSwJVig5Myw1NyxFNywwRiksCVYoQjQsRUUsOTYsRDIpLAlWKDFCLDlCLDkxLDlFKSwJXAotCVYoODAsQzAsQzUsNEYpLAlWKDYxLERDLDIwLEEyKSwJVig1QSw3Nyw0Qiw2OSksCVYoMUMsMTIsMUEsMTYpLAlcCi0JVihFMiw5MyxCQSwwQSksCVYoQzAsQTAsMkEsRTUpLAlWKDNDLDIyLEUwLDQzKSwJVigxMiwxQiwxNywxRCksCVwKLQlWKDBFLDA5LDBELDBCKSwJVihGMiw4QixDNyxBRCksCVYoMkQsQjYsQTgsQjkpLAlWKDE0LDFFLEE5LEM4KSwJXAotCVYoNTcsRjEsMTksODUpLAlWKEFGLDc1LDA3LDRDKSwJVihFRSw5OSxERCxCQiksCVYoQTMsN0YsNjAsRkQpLAlcCi0JVihGNywwMSwyNiw5RiksCVYoNUMsNzIsRjUsQkMpLAlWKDQ0LDY2LDNCLEM1KSwJVig1QixGQiw3RSwzNCksCVwKLQlWKDhCLDQzLDI5LDc2KSwJVihDQiwyMyxDNixEQyksCVYoQjYsRUQsRkMsNjgpLAlWKEI4LEU0LEYxLDYzKSwJXAotCVYoRDcsMzEsREMsQ0EpLAlWKDQyLDYzLDg1LDEwKSwJVigxMyw5NywyMiw0MCksCVYoODQsQzYsMTEsMjApLAlcCi0JVig4NSw0QSwyNCw3RCksCVYoRDIsQkIsM0QsRjgpLAlWKEFFLEY5LDMyLDExKSwJVihDNywyOSxBMSw2RCksCVwKLQlWKDFELDlFLDJGLDRCKSwJVihEQyxCMiwzMCxGMyksCVYoMEQsODYsNTIsRUMpLAlWKDc3LEMxLEUzLEQwKSwJXAotCVYoMkIsQjMsMTYsNkMpLAlWKEE5LDcwLEI5LDk5KSwJVigxMSw5NCw0OCxGQSksCVYoNDcsRTksNjQsMjIpLAlcCi0JVihBOCxGQyw4QyxDNCksCVYoQTAsRjAsM0YsMUEpLAlWKDU2LDdELDJDLEQ4KSwJVigyMiwzMyw5MCxFRiksCVwKLQlWKDg3LDQ5LDRFLEM3KSwJVihEOSwzOCxEMSxDMSksCVYoOEMsQ0EsQTIsRkUpLAlWKDk4LEQ0LDBCLDM2KSwJXAotCVYoQTYsRjUsODEsQ0YpLAlWKEE1LDdBLERFLDI4KSwJVihEQSxCNyw4RSwyNiksCVYoM0YsQUQsQkYsQTQpLAlcCi0JVigyQywzQSw5RCxFNCksCVYoNTAsNzgsOTIsMEQpLAlWKDZBLDVGLENDLDlCKSwJVig1NCw3RSw0Niw2MiksCVwKLQlWKEY2LDhELDEzLEMyKSwJVig5MCxEOCxCOCxFOCksCVYoMkUsMzksRjcsNUUpLAlWKDgyLEMzLEFGLEY1KSwJXAotCVYoOUYsNUQsODAsQkUpLAlWKDY5LEQwLDkzLDdDKSwJVig2RixENSwyRCxBOSksCVYoQ0YsMjUsMTIsQjMpLAlcCi0JVihDOCxBQyw5OSwzQiksCVYoMTAsMTgsN0QsQTcpLAlWKEU4LDlDLDYzLDZFKSwJVihEQiwzQixCQiw3QiksCVwKLQlWKENELDI2LDc4LDA5KSwJVig2RSw1OSwxOCxGNCksCVYoRUMsOUEsQjcsMDEpLAlWKDgzLDRGLDlBLEE4KSwJXAotCVYoRTYsOTUsNkUsNjUpLAlWKEFBLEZGLEU2LDdFKSwJVigyMSxCQyxDRiwwOCksCVYoRUYsMTUsRTgsRTYpLAlcCi0JVihCQSxFNyw5QixEOSksCVYoNEEsNkYsMzYsQ0UpLAlWKEVBLDlGLDA5LEQ0KSwJVigyOSxCMCw3QyxENiksCVwKLQlWKDMxLEE0LEIyLEFGKSwJVigyQSwzRiwyMywzMSksCVYoQzYsQTUsOTQsMzApLAlWKDM1LEEyLDY2LEMwKSwJXAotCVYoNzQsNEUsQkMsMzcpLAlWKEZDLDgyLENBLEE2KSwJVihFMCw5MCxEMCxCMCksCVYoMzMsQTcsRDgsMTUpLAlcCi0JVihGMSwwNCw5OCw0QSksCVYoNDEsRUMsREEsRjcpLAlWKDdGLENELDUwLDBFKSwJVigxNyw5MSxGNiwyRiksCVwKLQlWKDc2LDRELEQ2LDhEKSwJVig0MyxFRixCMCw0RCksCVYoQ0MsQUEsNEQsNTQpLAlWKEU0LDk2LDA0LERGKSwJXAotCVYoOUUsRDEsQjUsRTMpLAlWKDRDLDZBLDg4LDFCKSwJVihDMSwyQywxRixCOCksCVYoNDYsNjUsNTEsN0YpLAlcCi0JVig5RCw1RSxFQSwwNCksCVYoMDEsOEMsMzUsNUQpLAlWKEZBLDg3LDc0LDczKSwJVihGQiwwQiw0MSwyRSksCVwKLQlWKEIzLDY3LDFELDVBKSwJVig5MixEQixEMiw1MiksCVYoRTksMTAsNTYsMzMpLAlWKDZELEQ2LDQ3LDEzKSwJXAotCVYoOUEsRDcsNjEsOEMpLAlWKDM3LEExLDBDLDdBKSwJVig1OSxGOCwxNCw4RSksCVYoRUIsMTMsM0MsODkpLAlcCi0JVihDRSxBOSwyNyxFRSksCVYoQjcsNjEsQzksMzUpLAlWKEUxLDFDLEU1LEVEKSwJVig3QSw0NyxCMSwzQyksCVwKLQlWKDlDLEQyLERGLDU5KSwJVig1NSxGMiw3MywzRiksCVYoMTgsMTQsQ0UsNzkpLAlWKDczLEM3LDM3LEJGKSwJXAotCVYoNTMsRjcsQ0QsRUEpLAlWKDVGLEZELEFBLDVCKSwJVihERiwzRCw2RiwxNCksCVYoNzgsNDQsREIsODYpLAlcCi0JVihDQSxBRixGMyw4MSksCVYoQjksNjgsQzQsM0UpLAlWKDM4LDI0LDM0LDJDKSwJVihDMixBMyw0MCw1RiksCVwKLQlWKDE2LDFELEMzLDcyKSwJVihCQyxFMiwyNSwwQyksCVYoMjgsM0MsNDksOEIpLAlWKEZGLDBELDk1LDQxKSwJXAotCVYoMzksQTgsMDEsNzEpLAlWKDA4LDBDLEIzLERFKSwJVihEOCxCNCxFNCw5QyksCVYoNjQsNTYsQzEsOTApLAlcCi0JVig3QixDQiw4NCw2MSksCVYoRDUsMzIsQjYsNzApLAlWKDQ4LDZDLDVDLDc0KSwJVihEMCxCOCw1Nyw0MikKLQotI2RlZmluZQlWKGEsYixjLGQpIDB4IyNhIyNiIyNjIyNkCi1zdGF0aWMgdWludDMyIFJUMFsyNTZdID0geyBSVCB9OwotI3VuZGVmIFYKLQotI2RlZmluZQlWKGEsYixjLGQpIDB4IyNkIyNhIyNiIyNjCi1zdGF0aWMgdWludDMyIFJUMVsyNTZdID0geyBSVCB9OwotI3VuZGVmIFYKLQotI2RlZmluZQlWKGEsYixjLGQpIDB4IyNjIyNkIyNhIyNiCi1zdGF0aWMgdWludDMyIFJUMlsyNTZdID0geyBSVCB9OwotI3VuZGVmIFYKLQotI2RlZmluZQlWKGEsYixjLGQpIDB4IyNiIyNjIyNkIyNhCi1zdGF0aWMgdWludDMyIFJUM1syNTZdID0geyBSVCB9OwotI3VuZGVmIFYKLQotI3VuZGVmIFJUCi0KLS8qIHJvdW5kIGNvbnN0YW50cyAqLwotCi1zdGF0aWMgdWludDMyIFJDT05bMTBdID0KLXsKLQkweDAxMDAwMDAwLAkweDAyMDAwMDAwLAkweDA0MDAwMDAwLAkweDA4MDAwMDAwLAotCTB4MTAwMDAwMDAsCTB4MjAwMDAwMDAsCTB4NDAwMDAwMDAsCTB4ODAwMDAwMDAsCi0JMHgxQjAwMDAwMCwJMHgzNjAwMDAwMAotfTsKLQotLyoga2V5IHNjaGVkdWxlCXRhYmxlcyAqLwotCi1zdGF0aWMgaW50IEtUX2luaXQgPSAxOwotCi1zdGF0aWMgdWludDMyIEtUMFsyNTZdOwotc3RhdGljIHVpbnQzMiBLVDFbMjU2XTsKLXN0YXRpYyB1aW50MzIgS1QyWzI1Nl07Ci1zdGF0aWMgdWludDMyIEtUM1syNTZdOwotCi0vKiBwbGF0Zm9ybS1pbmRlcGVuZGFudAkzMi1iaXQgaW50ZWdlciBtYW5pcHVsYXRpb24JbWFjcm9zICovCi0KLSNkZWZpbmUJR0VUX1VJTlQzMihuLGIsaSkJCQkJCQlcCi17CQkJCQkJCQkJCQkJXAotCShuKQk9ICgJKHVpbnQzMikgKGIpWyhpKQldIDw8IDI0CSkJCVwKLQkJfCAoCSh1aW50MzIpIChiKVsoaSkgKyAxXSA8PCAxNgkpCQlcCi0JCXwgKAkodWludDMyKSAoYilbKGkpICsgMl0gPDwgIDgJKQkJXAotCQl8ICgJKHVpbnQzMikgKGIpWyhpKSArIDNdCQkpOwkJXAotfQotCi0jZGVmaW5lCVBVVF9VSU5UMzIobixiLGkpCQkJCQkJXAotewkJCQkJCQkJCQkJCVwKLQkoYilbKGkpCSAgIF0gPSAodWludDgpICggKG4pID4+CTI0ICk7CQlcCi0JKGIpWyhpKQkrIDFdID0gKHVpbnQ4KSAoIChuKSA+PgkxNiApOwkJXAotCShiKVsoaSkJKyAyXSA9ICh1aW50OCkgKCAobikgPj4JIDggKTsJCVwKLQkoYilbKGkpCSsgM10gPSAodWludDgpICggKG4pCSAgICk7CQlcCi19Ci0KLS8qIEFFUyBrZXkgc2NoZWR1bGluZyByb3V0aW5lICovCi0KLWludAlydG1wX2Flc19zZXRfa2V5KCBhZXNfY29udGV4dCAqY3R4LCB1aW50OCAqa2V5LCBpbnQgbmJpdHMgKQotewotCWludAlpOwotCXVpbnQzMiAqUkssCSpTSzsKLQotCXN3aXRjaCgJbmJpdHMgKQotCXsKLQkJY2FzZSAxMjg6IGN0eC0+bnIgPQkxMDsJYnJlYWs7Ci0JCWNhc2UgMTkyOiBjdHgtPm5yID0JMTI7CWJyZWFrOwotCQljYXNlIDI1NjogY3R4LT5uciA9CTE0OwlicmVhazsKLQkJZGVmYXVsdAk6IHJldHVybiggMQkpOwotCX0KLQotCVJLID0gY3R4LT5lcms7Ci0KLQlmb3IoIGkgPSAwOwlpIDwJKG5iaXRzID4+IDUpOyBpKysgKQotCXsKLQkJR0VUX1VJTlQzMigJUktbaV0sIGtleSwJaSAqCTQgKTsKLQl9Ci0KLQkvKiBzZXR1cCBlbmNyeXB0aW9uCXJvdW5kIGtleXMgKi8KLQotCXN3aXRjaCgJbmJpdHMgKQotCXsKLQljYXNlIDEyODoKLQotCQlmb3IoIGkgPSAwOwlpIDwJMTA7CWkrKywgUksJKz0gNCApCi0JCXsKLQkJCVJLWzRdICA9IFJLWzBdIF4gUkNPTltpXSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+IDE2ICkgXSA8PAkyNCApIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbM10gPj4gIDggKSBdIDw8CTE2ICkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1szXQkJICkgXSA8PAkgOCApIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbM10gPj4gMjQgKSBdCSAgICk7Ci0KLQkJCVJLWzVdICA9IFJLWzFdIF4gUktbNF07Ci0JCQlSS1s2XSAgPSBSS1syXSBeIFJLWzVdOwotCQkJUktbN10gID0gUktbM10gXiBSS1s2XTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgMTkyOgotCi0JCWZvciggaSA9IDA7CWkgPAk4OyBpKyssCVJLICs9IDYJKQotCQl7Ci0JCQlSS1s2XSAgPSBSS1swXSBeIFJDT05baV0gXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAxNiApIF0gPDwJMjQgKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzVdID4+ICA4ICkgXSA8PAkxNiApIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbNV0JCSApIF0gPDwJIDggKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzVdID4+IDI0ICkgXQkgICApOwotCi0JCQlSS1s3XSAgPSBSS1sxXSBeIFJLWzZdOwotCQkJUktbOF0gID0gUktbMl0gXiBSS1s3XTsKLQkJCVJLWzldICA9IFJLWzNdIF4gUktbOF07Ci0JCQlSS1sxMF0gPSBSS1s0XSBeIFJLWzldOwotCQkJUktbMTFdID0gUktbNV0gXiBSS1sxMF07Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIDI1NjoKLQotCQlmb3IoIGkgPSAwOwlpIDwJNzsgaSsrLAlSSyArPSA4CSkKLQkJewotCQkJUktbOF0gID0gUktbMF0gXiBSQ09OW2ldIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbN10gPj4gMTYgKSBdIDw8CTI0ICkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s3XSA+PiAgOCApIF0gPDwJMTYgKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzddCQkgKSBdIDw8CSA4ICkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s3XSA+PiAyNCApIF0JICAgKTsKLQotCQkJUktbOV0gID0gUktbMV0gXiBSS1s4XTsKLQkJCVJLWzEwXSA9IFJLWzJdIF4gUktbOV07Ci0JCQlSS1sxMV0gPSBSS1szXSBeIFJLWzEwXTsKLQotCQkJUktbMTJdID0gUktbNF0gXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1sxMV0JPj4gMjQgKQldIDw8IDI0CSkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1sxMV0JPj4gMTYgKQldIDw8IDE2CSkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1sxMV0JPj4JOCApCV0gPDwgIDgJKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzExXQkJICApCV0JCSk7Ci0KLQkJCVJLWzEzXSA9IFJLWzVdIF4gUktbMTJdOwotCQkJUktbMTRdID0gUktbNl0gXiBSS1sxM107Ci0JCQlSS1sxNV0gPSBSS1s3XSBeIFJLWzE0XTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQkvKiBzZXR1cCBkZWNyeXB0aW9uCXJvdW5kIGtleXMgKi8KLQotCWlmKAlLVF9pbml0CSkKLQl7Ci0JCWZvciggaSA9IDA7CWkgPAkyNTY7IGkrKyApCi0JCXsKLQkJCUtUMFtpXSA9IFJUMFsgRlNiW2ldIF07Ci0JCQlLVDFbaV0gPSBSVDFbIEZTYltpXSBdOwotCQkJS1QyW2ldID0gUlQyWyBGU2JbaV0gXTsKLQkJCUtUM1tpXSA9IFJUM1sgRlNiW2ldIF07Ci0JCX0KLQotCQlLVF9pbml0CT0gMDsKLQl9Ci0KLQlTSyA9IGN0eC0+ZHJrOwotCi0JKlNLKysgPQkqUksrKzsKLQkqU0srKyA9CSpSSysrOwotCSpTSysrID0JKlJLKys7Ci0JKlNLKysgPQkqUksrKzsKLQotCWZvciggaSA9IDE7CWkgPAljdHgtPm5yOyBpKysgKQotCXsKLQkJUksgLT0gODsKLQotCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgotCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgotCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgotCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKLQotCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgotCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgotCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgotCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKLQotCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgotCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgotCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgotCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKLQotCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgotCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgotCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgotCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKLQl9Ci0KLQlSSyAtPSA4OwotCi0JKlNLKysgPQkqUksrKzsKLQkqU0srKyA9CSpSSysrOwotCSpTSysrID0JKlJLKys7Ci0JKlNLKysgPQkqUksrKzsKLQotCXJldHVybigJMCApOwotfQotCi0vKiBBRVMgMTI4LWJpdCBibG9jayBlbmNyeXB0aW9uCXJvdXRpbmUJKi8KLQotdm9pZCBydG1wX2Flc19lbmNyeXB0KGFlc19jb250ZXh0ICpjdHgsIHVpbnQ4IGlucHV0WzE2XSwJdWludDggb3V0cHV0WzE2XSApCi17Ci0JdWludDMyICpSSywJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzOwotCi0JUksgPSBjdHgtPmVyazsKLQlHRVRfVUlOVDMyKAlYMCwJaW5wdXQsCTAgKTsgWDAJXj0gUktbMF07Ci0JR0VUX1VJTlQzMigJWDEsCWlucHV0LAk0ICk7IFgxCV49IFJLWzFdOwotCUdFVF9VSU5UMzIoCVgyLAlpbnB1dCwJOCApOyBYMglePSBSS1syXTsKLQlHRVRfVUlOVDMyKAlYMywJaW5wdXQsIDEyICk7IFgzCV49IFJLWzNdOwotCi0jZGVmaW5lCUFFU19GUk9VTkQoWDAsWDEsWDIsWDMsWTAsWTEsWTIsWTMpCQlcCi17CQkJCQkJCQkJCQkJXAotCVJLICs9IDQ7CQkJCQkJCQkJXAotCQkJCQkJCQkJCQkJXAotCVgwID0gUktbMF0gXiBGVDBbICh1aW50OCkgKAlZMCA+PiAyNCApIF0gXglcCi0JCQkJIEZUMVsgKHVpbnQ4KSAoCVkxID4+IDE2ICkgXSBeCVwKLQkJCQkgRlQyWyAodWludDgpICgJWTIgPj4gIDggKSBdIF4JXAotCQkJCSBGVDNbICh1aW50OCkgKAlZMwkJICkgXTsJXAotCQkJCQkJCQkJCQkJXAotCVgxID0gUktbMV0gXiBGVDBbICh1aW50OCkgKAlZMSA+PiAyNCApIF0gXglcCi0JCQkJIEZUMVsgKHVpbnQ4KSAoCVkyID4+IDE2ICkgXSBeCVwKLQkJCQkgRlQyWyAodWludDgpICgJWTMgPj4gIDggKSBdIF4JXAotCQkJCSBGVDNbICh1aW50OCkgKAlZMAkJICkgXTsJXAotCQkJCQkJCQkJCQkJXAotCVgyID0gUktbMl0gXiBGVDBbICh1aW50OCkgKAlZMiA+PiAyNCApIF0gXglcCi0JCQkJIEZUMVsgKHVpbnQ4KSAoCVkzID4+IDE2ICkgXSBeCVwKLQkJCQkgRlQyWyAodWludDgpICgJWTAgPj4gIDggKSBdIF4JXAotCQkJCSBGVDNbICh1aW50OCkgKAlZMQkJICkgXTsJXAotCQkJCQkJCQkJCQkJXAotCVgzID0gUktbM10gXiBGVDBbICh1aW50OCkgKAlZMyA+PiAyNCApIF0gXglcCi0JCQkJIEZUMVsgKHVpbnQ4KSAoCVkwID4+IDE2ICkgXSBeCVwKLQkJCQkgRlQyWyAodWludDgpICgJWTEgPj4gIDggKSBdIF4JXAotCQkJCSBGVDNbICh1aW50OCkgKAlZMgkJICkgXTsJXAotfQotCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAxICovCi0JQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCAyICovCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAzICovCi0JQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA0ICovCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA1ICovCi0JQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA2ICovCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA3ICovCi0JQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA4ICovCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA5ICovCi0KLQlpZigJY3R4LT5ucgk+IDEwICkKLQl7Ci0JCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMAkqLwotCQlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTEJKi8KLQl9Ci0KLQlpZigJY3R4LT5ucgk+IDEyICkKLQl7Ci0JCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMgkqLwotCQlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTMJKi8KLQl9Ci0KLQkvKiBsYXN0CXJvdW5kICovCi0KLQlSSyArPSA0OwotCi0JWDAgPSBSS1swXSBeICggRlNiWwkodWludDgpCSggWTAgPj4JMjQgKSBdIDw8IDI0ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkxID4+CTE2ICkgXSA8PCAxNiApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMiA+PgkgOCApIF0gPDwgIDggKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTMJICAgKSBdCQkgKTsKLQotCVgxID0gUktbMV0gXiAoIEZTYlsJKHVpbnQ4KQkoIFkxID4+CTI0ICkgXSA8PCAyNCApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMiA+PgkxNiApIF0gPDwgMTYgKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTMgPj4JIDggKSBdIDw8ICA4ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkwCSAgICkgXQkJICk7Ci0KLQlYMiA9IFJLWzJdIF4gKCBGU2JbCSh1aW50OCkJKCBZMiA+PgkyNCApIF0gPDwgMjQgKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTMgPj4JMTYgKSBdIDw8IDE2ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkwID4+CSA4ICkgXSA8PCAgOCApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMQkgICApIF0JCSApOwotCi0JWDMgPSBSS1szXSBeICggRlNiWwkodWludDgpCSggWTMgPj4JMjQgKSBdIDw8IDI0ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkwID4+CTE2ICkgXSA8PCAxNiApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMSA+PgkgOCApIF0gPDwgIDggKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTIJICAgKSBdCQkgKTsKLQotCVBVVF9VSU5UMzIoCVgwLAlvdXRwdXQsCSAwICk7Ci0JUFVUX1VJTlQzMigJWDEsCW91dHB1dCwJIDQgKTsKLQlQVVRfVUlOVDMyKAlYMiwJb3V0cHV0LAkgOCApOwotCVBVVF9VSU5UMzIoCVgzLAlvdXRwdXQsCTEyICk7Ci19Ci0KLS8qIEFFUyAxMjgtYml0IGJsb2NrIGRlY3J5cHRpb24Jcm91dGluZQkqLwotCi12b2lkIHJ0bXBfYWVzX2RlY3J5cHQoIGFlc19jb250ZXh0ICpjdHgsCXVpbnQ4IGlucHV0WzE2XSwgdWludDggb3V0cHV0WzE2XSApCi17Ci0JdWludDMyICpSSywJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzOwotCi0JUksgPSBjdHgtPmRyazsKLQotCUdFVF9VSU5UMzIoCVgwLAlpbnB1dCwJMCApOyBYMAlePSBSS1swXTsKLQlHRVRfVUlOVDMyKAlYMSwJaW5wdXQsCTQgKTsgWDEJXj0gUktbMV07Ci0JR0VUX1VJTlQzMigJWDIsCWlucHV0LAk4ICk7IFgyCV49IFJLWzJdOwotCUdFVF9VSU5UMzIoCVgzLAlpbnB1dCwgMTIgKTsgWDMJXj0gUktbM107Ci0KLSNkZWZpbmUJQUVTX1JST1VORChYMCxYMSxYMixYMyxZMCxZMSxZMixZMykJCVwKLXsJCQkJCQkJCQkJCQlcCi0JUksgKz0gNDsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JWDAgPSBSS1swXSBeIFJUMFsgKHVpbnQ4KSAoCVkwID4+IDI0ICkgXSBeCVwKLQkJCQkgUlQxWyAodWludDgpICgJWTMgPj4gMTYgKSBdIF4JXAotCQkJCSBSVDJbICh1aW50OCkgKAlZMiA+PiAgOCApIF0gXglcCi0JCQkJIFJUM1sgKHVpbnQ4KSAoCVkxCQkgKSBdOwlcCi0JCQkJCQkJCQkJCQlcCi0JWDEgPSBSS1sxXSBeIFJUMFsgKHVpbnQ4KSAoCVkxID4+IDI0ICkgXSBeCVwKLQkJCQkgUlQxWyAodWludDgpICgJWTAgPj4gMTYgKSBdIF4JXAotCQkJCSBSVDJbICh1aW50OCkgKAlZMyA+PiAgOCApIF0gXglcCi0JCQkJIFJUM1sgKHVpbnQ4KSAoCVkyCQkgKSBdOwlcCi0JCQkJCQkJCQkJCQlcCi0JWDIgPSBSS1syXSBeIFJUMFsgKHVpbnQ4KSAoCVkyID4+IDI0ICkgXSBeCVwKLQkJCQkgUlQxWyAodWludDgpICgJWTEgPj4gMTYgKSBdIF4JXAotCQkJCSBSVDJbICh1aW50OCkgKAlZMCA+PiAgOCApIF0gXglcCi0JCQkJIFJUM1sgKHVpbnQ4KSAoCVkzCQkgKSBdOwlcCi0JCQkJCQkJCQkJCQlcCi0JWDMgPSBSS1szXSBeIFJUMFsgKHVpbnQ4KSAoCVkzID4+IDI0ICkgXSBeCVwKLQkJCQkgUlQxWyAodWludDgpICgJWTIgPj4gMTYgKSBdIF4JXAotCQkJCSBSVDJbICh1aW50OCkgKAlZMSA+PiAgOCApIF0gXglcCi0JCQkJIFJUM1sgKHVpbnQ4KSAoCVkwCQkgKSBdOwlcCi19Ci0KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDEgKi8KLQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDIgKi8KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDMgKi8KLQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDQgKi8KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDUgKi8KLQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDYgKi8KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDcgKi8KLQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDggKi8KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDkgKi8KLQotCWlmKAljdHgtPm5yCT4gMTAgKQotCXsKLQkJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CS8qIHJvdW5kIDEwCSovCi0JCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkvKiByb3VuZCAxMQkqLwotCX0KLQotCWlmKAljdHgtPm5yCT4gMTIgKQotCXsKLQkJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CS8qIHJvdW5kIDEyCSovCi0JCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkvKiByb3VuZCAxMwkqLwotCX0KLQotCS8qIGxhc3QJcm91bmQgKi8KLQotCVJLICs9IDQ7Ci0KLQlYMCA9IFJLWzBdIF4gKCBSU2JbCSh1aW50OCkJKCBZMCA+PgkyNCApIF0gPDwgMjQgKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTMgPj4JMTYgKSBdIDw8IDE2ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkyID4+CSA4ICkgXSA8PCAgOCApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMQkgICApIF0JCSApOwotCi0JWDEgPSBSS1sxXSBeICggUlNiWwkodWludDgpCSggWTEgPj4JMjQgKSBdIDw8IDI0ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkwID4+CTE2ICkgXSA8PCAxNiApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMyA+PgkgOCApIF0gPDwgIDggKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTIJICAgKSBdCQkgKTsKLQotCVgyID0gUktbMl0gXiAoIFJTYlsJKHVpbnQ4KQkoIFkyID4+CTI0ICkgXSA8PCAyNCApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMSA+PgkxNiApIF0gPDwgMTYgKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTAgPj4JIDggKSBdIDw8ICA4ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkzCSAgICkgXQkJICk7Ci0KLQlYMyA9IFJLWzNdIF4gKCBSU2JbCSh1aW50OCkJKCBZMyA+PgkyNCApIF0gPDwgMjQgKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTIgPj4JMTYgKSBdIDw8IDE2ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkxID4+CSA4ICkgXSA8PCAgOCApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMAkgICApIF0JCSApOwotCi0JUFVUX1VJTlQzMigJWDAsCW91dHB1dCwJIDAgKTsKLQlQVVRfVUlOVDMyKAlYMSwJb3V0cHV0LAkgNCApOwotCVBVVF9VSU5UMzIoCVgyLAlvdXRwdXQsCSA4ICk7Ci0JUFVUX1VJTlQzMigJWDMsCW91dHB1dCwJMTIgKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVNIQTEgZnVuY3Rpb24KLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUhNQUNfU0hBMSgKLQlJTglVQ0hBUgkqdGV4dCwKLQlJTglVSU5UCXRleHRfbGVuLAotCUlOCVVDSEFSCSprZXksCi0JSU4JVUlOVAlrZXlfbGVuLAotCUlOCVVDSEFSCSpkaWdlc3QpCi17Ci0JU0hBX0NUWAljb250ZXh0OwotCVVDSEFSCWtfaXBhZFs2NV07IC8qIGlubmVyIHBhZGRpbmcgLSBrZXkgWE9SZCB3aXRoIGlwYWQJKi8KLQlVQ0hBUglrX29wYWRbNjVdOyAvKiBvdXRlciBwYWRkaW5nIC0ga2V5IFhPUmQgd2l0aCBvcGFkCSovCi0JSU5UCQlpOwotCi0JLy8gaWYga2V5IGlzIGxvbmdlcgl0aGFuIDY0CWJ5dGVzIHJlc2V0CWl0IHRvIGtleT1TSEExKGtleSkKLQlpZiAoa2V5X2xlbgk+IDY0KQotCXsKLQkJU0hBX0NUWAkJIHRjdHg7Ci0JCVNIQUluaXQoJnRjdHgpOwotCQlTSEFVcGRhdGUoJnRjdHgsIGtleSwga2V5X2xlbik7Ci0JCVNIQUZpbmFsKCZ0Y3R4LAlrZXkpOwotCQlrZXlfbGVuCT0gMjA7Ci0JfQotCU5kaXNaZXJvTWVtb3J5KGtfaXBhZCwgc2l6ZW9mKGtfaXBhZCkpOwotCU5kaXNaZXJvTWVtb3J5KGtfb3BhZCwgc2l6ZW9mKGtfb3BhZCkpOwotCU5kaXNNb3ZlTWVtb3J5KGtfaXBhZCwga2V5LAlrZXlfbGVuKTsKLQlOZGlzTW92ZU1lbW9yeShrX29wYWQsIGtleSwJa2V5X2xlbik7Ci0KLQkvLyBYT1Iga2V5IHdpdGgJaXBhZCBhbmQgb3BhZCB2YWx1ZXMKLQlmb3IJKGkgPSAwOwlpIDwJNjQ7CWkrKykKLQl7Ci0JCWtfaXBhZFtpXSBePSAweDM2OwotCQlrX29wYWRbaV0gXj0gMHg1YzsKLQl9Ci0KLQkvLyBwZXJmb3JtIGlubmVyIFNIQTEKLQlTSEFJbml0KCZjb250ZXh0KTsgCQkJCQkJLyogaW5pdCBjb250ZXh0IGZvciAxc3QgcGFzcyAqLwotCVNIQVVwZGF0ZSgmY29udGV4dCwJa19pcGFkLAk2NCk7CQkvKglzdGFydCB3aXRoIGlubmVyIHBhZCAqLwotCVNIQVVwZGF0ZSgmY29udGV4dCwJdGV4dCwgdGV4dF9sZW4pOwkvKgl0aGVuIHRleHQgb2YgZGF0YWdyYW0gKi8KLQlTSEFGaW5hbCgmY29udGV4dCwgZGlnZXN0KTsJCQkJLyogZmluaXNoIHVwIDFzdCBwYXNzICovCi0KLQkvL3BlcmZvcm0gb3V0ZXIJU0hBMQotCVNIQUluaXQoJmNvbnRleHQpOwkJCQkJLyogaW5pdCBjb250ZXh0IGZvciAybmQgcGFzcyAqLwotCVNIQVVwZGF0ZSgmY29udGV4dCwJa19vcGFkLAk2NCk7CS8qCXN0YXJ0IHdpdGggb3V0ZXIgcGFkICovCi0JU0hBVXBkYXRlKCZjb250ZXh0LAlkaWdlc3QsCTIwKTsJLyoJdGhlbiByZXN1bHRzIG9mCTFzdAloYXNoICovCi0JU0hBRmluYWwoJmNvbnRleHQsIGRpZ2VzdCk7CQkJLyogZmluaXNoIHVwIDJuZCBwYXNzICovCi0KLX0KLQotLyoKLSogRihQLCBTLCBjLCBpKSA9IFUxIHhvciBVMiB4b3IgLi4uIFVjCi0qIFUxID0gUFJGKFAsIFMgfHwgSW50KGkpKQotKiBVMiA9IFBSRihQLCBVMSkKLSogVWMgPSBQUkYoUCwgVWMtMSkKLSovCi0KLXZvaWQgRihjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIGludCBpdGVyYXRpb25zLCBpbnQgY291bnQsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyIGRpZ2VzdFszNl0sIGRpZ2VzdDFbU0hBX0RJR0VTVF9MRU5dOwotICAgIGludCBpLCBqOwotCi0gICAgLyogVTEgPSBQUkYoUCwgUyB8fCBpbnQoaSkpICovCi0gICAgbWVtY3B5KGRpZ2VzdCwgc3NpZCwgc3NpZGxlbmd0aCk7Ci0gICAgZGlnZXN0W3NzaWRsZW5ndGhdID0gKHVuc2lnbmVkIGNoYXIpKChjb3VudD4+MjQpICYgMHhmZik7Ci0gICAgZGlnZXN0W3NzaWRsZW5ndGgrMV0gPSAodW5zaWduZWQgY2hhcikoKGNvdW50Pj4xNikgJiAweGZmKTsKLSAgICBkaWdlc3Rbc3NpZGxlbmd0aCsyXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQ+PjgpICYgMHhmZik7Ci0gICAgZGlnZXN0W3NzaWRsZW5ndGgrM10gPSAodW5zaWduZWQgY2hhcikoY291bnQgJiAweGZmKTsKLSAgICBITUFDX1NIQTEoZGlnZXN0LCBzc2lkbGVuZ3RoKzQsICh1bnNpZ25lZCBjaGFyKikgcGFzc3dvcmQsIChpbnQpIHN0cmxlbihwYXNzd29yZCksIGRpZ2VzdDEpOyAvLyBmb3IgV1BBIHVwZGF0ZQotCi0gICAgLyogb3V0cHV0ID0gVTEgKi8KLSAgICBtZW1jcHkob3V0cHV0LCBkaWdlc3QxLCBTSEFfRElHRVNUX0xFTik7Ci0KLSAgICBmb3IgKGkgPSAxOyBpIDwgaXRlcmF0aW9uczsgaSsrKQotICAgIHsKLSAgICAgICAgLyogVW4gPSBQUkYoUCwgVW4tMSkgKi8KLSAgICAgICAgSE1BQ19TSEExKGRpZ2VzdDEsIFNIQV9ESUdFU1RfTEVOLCAodW5zaWduZWQgY2hhciopIHBhc3N3b3JkLCAoaW50KSBzdHJsZW4ocGFzc3dvcmQpLCBkaWdlc3QpOyAvLyBmb3IgV1BBIHVwZGF0ZQotICAgICAgICBtZW1jcHkoZGlnZXN0MSwgZGlnZXN0LCBTSEFfRElHRVNUX0xFTik7Ci0KLSAgICAgICAgLyogb3V0cHV0ID0gb3V0cHV0IHhvciBVbiAqLwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgU0hBX0RJR0VTVF9MRU47IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0W2pdIF49IGRpZ2VzdFtqXTsKLSAgICAgICAgfQotICAgIH0KLX0KLS8qCi0qIHBhc3N3b3JkIC0gYXNjaWkgc3RyaW5nIHVwIHRvIDYzIGNoYXJhY3RlcnMgaW4gbGVuZ3RoCi0qIHNzaWQgLSBvY3RldCBzdHJpbmcgdXAgdG8gMzIgb2N0ZXRzCi0qIHNzaWRsZW5ndGggLSBsZW5ndGggb2Ygc3NpZCBpbiBvY3RldHMKLSogb3V0cHV0IG11c3QgYmUgNDAgb2N0ZXRzIGluIGxlbmd0aCBhbmQgb3V0cHV0cyAyNTYgYml0cyBvZiBrZXkKLSovCi1pbnQgUGFzc3dvcmRIYXNoKGNoYXIgKnBhc3N3b3JkLCB1bnNpZ25lZCBjaGFyICpzc2lkLCBpbnQgc3NpZGxlbmd0aCwgdW5zaWduZWQgY2hhciAqb3V0cHV0KQotewotICAgIGlmICgoc3RybGVuKHBhc3N3b3JkKSA+IDYzKSB8fCAoc3NpZGxlbmd0aCA+IDMyKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBGKHBhc3N3b3JkLCBzc2lkLCBzc2lkbGVuZ3RoLCA0MDk2LCAxLCBvdXRwdXQpOwotICAgIEYocGFzc3dvcmQsIHNzaWQsIHNzaWRsZW5ndGgsIDQwOTYsIDIsICZvdXRwdXRbU0hBX0RJR0VTVF9MRU5dKTsKLSAgICByZXR1cm4gMTsKLX0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tbG1lLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tbG1lLmMKaW5kZXggNjFhMmE0ZS4uOWZjMzRhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbWxtZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21sbWUuYwpAQCAtMzksNDEzICszOSwzMDkgQEAKICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKICNpbmNsdWRlIDxzdGRhcmcuaD4KIAotVUNIQVIJQ0lTQ09fT1VJW10gPSB7MHgwMCwgMHg0MCwgMHg5Nn07Cit1OCBDSVNDT19PVUlbXSA9IHsgMHgwMCwgMHg0MCwgMHg5NiB9OwogCi1VQ0hBUglXUEFfT1VJW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMX07Ci1VQ0hBUglSU05fT1VJW10gPSB7MHgwMCwgMHgwZiwgMHhhY307Ci1VQ0hBUiAgIFdNRV9JTkZPX0VMRU1bXSAgPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMCwgMHgwMX07Ci1VQ0hBUiAgIFdNRV9QQVJNX0VMRU1bXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAxLCAweDAxfTsKLVVDSEFSCUNjeDJRb3NJbmZvW10gPSB7MHgwMCwgMHg0MCwgMHg5NiwgMHgwNH07Ci1VQ0hBUiAgIFJBTElOS19PVUlbXSAgPSB7MHgwMCwgMHgwYywgMHg0M307Ci1VQ0hBUiAgIEJST0FEQ09NX09VSVtdICA9IHsweDAwLCAweDkwLCAweDRjfTsKLVVDSEFSICAgV1BTX09VSVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDR9OwotVUNIQVIJUFJFX05fSFRfT1VJW10JPSB7MHgwMCwgMHg5MCwgMHg0Y307Cit1OCBXUEFfT1VJW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEgfTsKK3U4IFJTTl9PVUlbXSA9IHsgMHgwMCwgMHgwZiwgMHhhYyB9OwordTggV01FX0lORk9fRUxFTVtdID0geyAweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxIH07Cit1OCBXTUVfUEFSTV9FTEVNW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDEsIDB4MDEgfTsKK3U4IENjeDJRb3NJbmZvW10gPSB7IDB4MDAsIDB4NDAsIDB4OTYsIDB4MDQgfTsKK3U4IFJBTElOS19PVUlbXSA9IHsgMHgwMCwgMHgwYywgMHg0MyB9OwordTggQlJPQURDT01fT1VJW10gPSB7IDB4MDAsIDB4OTAsIDB4NGMgfTsKK3U4IFdQU19PVUlbXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCB9OwordTggUFJFX05fSFRfT1VJW10gPSB7IDB4MDAsIDB4OTAsIDB4NGMgfTsKIAotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgxMSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAotICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCi0gICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKLSAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAotICAgIDB4MDQsIDB4MjEsICAwLCAzMCwgNTAsCi0gICAgMHgwNSwgMHgyMSwgIDEsIDIwLCA1MCwKLSAgICAweDA2LCAweDIxLCAgMiwgMjAsIDUwLAotICAgIDB4MDcsIDB4MjEsICAzLCAxNSwgNTAsCi0gICAgMHgwOCwgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA5LCAweDIxLCAgNSwgMTAsIDI1LAotICAgIDB4MGEsIDB4MjEsICA2LCAgOCwgMjUsCi0gICAgMHgwYiwgMHgyMSwgIDcsICA4LCAyNSwKLSAgICAweDBjLCAweDIwLCAxMiwgIDE1LCAzMCwKLSAgICAweDBkLCAweDIwLCAxMywgIDgsIDIwLAotICAgIDB4MGUsIDB4MjAsIDE0LCAgOCwgMjAsCi0gICAgMHgwZiwgMHgyMCwgMTUsICA4LCAyNSwKLSAgICAweDEwLCAweDIyLCAxNSwgIDgsIDI1LAotICAgIDB4MTEsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxMiwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDEzLCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MTQsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxNSwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDE2LCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MTcsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxOCwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDE5LCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MWEsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxYiwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDFjLCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MWQsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxZSwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDFmLCAweDAwLCAgMCwgIDAsICAwLAordTggUmF0ZVN3aXRjaFRhYmxlW10gPSB7CisvKiBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24gICAgICAgICAgICAgLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikgKi8KKwkweDExLCAweDAwLCAwLCAwLCAwLAkvKiBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MDAsIDAsIDQwLCAxMDEsCisJMHgwMSwgMHgwMCwgMSwgNDAsIDUwLAorCTB4MDIsIDB4MDAsIDIsIDM1LCA0NSwKKwkweDAzLCAweDAwLCAzLCAyMCwgNDUsCisJMHgwNCwgMHgyMSwgMCwgMzAsIDUwLAorCTB4MDUsIDB4MjEsIDEsIDIwLCA1MCwKKwkweDA2LCAweDIxLCAyLCAyMCwgNTAsCisJMHgwNywgMHgyMSwgMywgMTUsIDUwLAorCTB4MDgsIDB4MjEsIDQsIDE1LCAzMCwKKwkweDA5LCAweDIxLCA1LCAxMCwgMjUsCisJMHgwYSwgMHgyMSwgNiwgOCwgMjUsCisJMHgwYiwgMHgyMSwgNywgOCwgMjUsCisJMHgwYywgMHgyMCwgMTIsIDE1LCAzMCwKKwkweDBkLCAweDIwLCAxMywgOCwgMjAsCisJMHgwZSwgMHgyMCwgMTQsIDgsIDIwLAorCTB4MGYsIDB4MjAsIDE1LCA4LCAyNSwKKwkweDEwLCAweDIyLCAxNSwgOCwgMjUsCisJMHgxMSwgMHgwMCwgMCwgMCwgMCwKKwkweDEyLCAweDAwLCAwLCAwLCAwLAorCTB4MTMsIDB4MDAsIDAsIDAsIDAsCisJMHgxNCwgMHgwMCwgMCwgMCwgMCwKKwkweDE1LCAweDAwLCAwLCAwLCAwLAorCTB4MTYsIDB4MDAsIDAsIDAsIDAsCisJMHgxNywgMHgwMCwgMCwgMCwgMCwKKwkweDE4LCAweDAwLCAwLCAwLCAwLAorCTB4MTksIDB4MDAsIDAsIDAsIDAsCisJMHgxYSwgMHgwMCwgMCwgMCwgMCwKKwkweDFiLCAweDAwLCAwLCAwLCAwLAorCTB4MWMsIDB4MDAsIDAsIDAsIDAsCisJMHgxZCwgMHgwMCwgMCwgMCwgMCwKKwkweDFlLCAweDAwLCAwLCAwLCAwLAorCTB4MWYsIDB4MDAsIDAsIDAsIDAsCiB9OwogCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDA0LCAweDAzLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgwMCwgIDAsIDQwLCAxMDEsCi0gICAgMHgwMSwgMHgwMCwgIDEsIDQwLCA1MCwKLSAgICAweDAyLCAweDAwLCAgMiwgMzUsIDQ1LAotICAgIDB4MDMsIDB4MDAsICAzLCAyMCwgNDUsCit1OCBSYXRlU3dpdGNoVGFibGUxMUJbXSA9IHsKKy8qIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93biAgICAgICAgICAgICAvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKSAqLworCTB4MDQsIDB4MDMsIDAsIDAsIDAsCS8qIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uICovCisJMHgwMCwgMHgwMCwgMCwgNDAsIDEwMSwKKwkweDAxLCAweDAwLCAxLCA0MCwgNTAsCisJMHgwMiwgMHgwMCwgMiwgMzUsIDQ1LAorCTB4MDMsIDB4MDAsIDMsIDIwLCA0NSwKIH07CiAKLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQkdbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgwMCwgIDAsIDQwLCAxMDEsCi0gICAgMHgwMSwgMHgwMCwgIDEsIDQwLCA1MCwKLSAgICAweDAyLCAweDAwLCAgMiwgMzUsIDQ1LAotICAgIDB4MDMsIDB4MDAsICAzLCAyMCwgNDUsCi0gICAgMHgwNCwgMHgxMCwgIDIsIDIwLCAzNSwKLSAgICAweDA1LCAweDEwLCAgMywgMTYsIDM1LAotICAgIDB4MDYsIDB4MTAsICA0LCAxMCwgMjUsCi0gICAgMHgwNywgMHgxMCwgIDUsIDE2LCAyNSwKLSAgICAweDA4LCAweDEwLCAgNiwgMTAsIDI1LAotICAgIDB4MDksIDB4MTAsICA3LCAxMCwgMTMsCit1OCBSYXRlU3dpdGNoVGFibGUxMUJHW10gPSB7CisvKiBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24gICAgICAgICAgICAgLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikgKi8KKwkweDBhLCAweDAwLCAwLCAwLCAwLAkvKiBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MDAsIDAsIDQwLCAxMDEsCisJMHgwMSwgMHgwMCwgMSwgNDAsIDUwLAorCTB4MDIsIDB4MDAsIDIsIDM1LCA0NSwKKwkweDAzLCAweDAwLCAzLCAyMCwgNDUsCisJMHgwNCwgMHgxMCwgMiwgMjAsIDM1LAorCTB4MDUsIDB4MTAsIDMsIDE2LCAzNSwKKwkweDA2LCAweDEwLCA0LCAxMCwgMjUsCisJMHgwNywgMHgxMCwgNSwgMTYsIDI1LAorCTB4MDgsIDB4MTAsIDYsIDEwLCAyNSwKKwkweDA5LCAweDEwLCA3LCAxMCwgMTMsCiB9OwogCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUdbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDA4LCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgxMCwgIDAsIDIwLCAxMDEsCi0gICAgMHgwMSwgMHgxMCwgIDEsIDIwLCAzNSwKLSAgICAweDAyLCAweDEwLCAgMiwgMjAsIDM1LAotICAgIDB4MDMsIDB4MTAsICAzLCAxNiwgMzUsCi0gICAgMHgwNCwgMHgxMCwgIDQsIDEwLCAyNSwKLSAgICAweDA1LCAweDEwLCAgNSwgMTYsIDI1LAotICAgIDB4MDYsIDB4MTAsICA2LCAxMCwgMjUsCi0gICAgMHgwNywgMHgxMCwgIDcsIDEwLCAxMywKK3U4IFJhdGVTd2l0Y2hUYWJsZTExR1tdID0geworLyogSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duICAgICAgICAgICAgIC8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpICovCisJMHgwOCwgMHgwMCwgMCwgMCwgMCwJLyogSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24gKi8KKwkweDAwLCAweDEwLCAwLCAyMCwgMTAxLAorCTB4MDEsIDB4MTAsIDEsIDIwLCAzNSwKKwkweDAyLCAweDEwLCAyLCAyMCwgMzUsCisJMHgwMywgMHgxMCwgMywgMTYsIDM1LAorCTB4MDQsIDB4MTAsIDQsIDEwLCAyNSwKKwkweDA1LCAweDEwLCA1LCAxNiwgMjUsCisJMHgwNiwgMHgxMCwgNiwgMTAsIDI1LAorCTB4MDcsIDB4MTAsIDcsIDEwLCAxMywKIH07CiAKLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjFTW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwOSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAotICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCi0gICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKLSAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAotICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCi0gICAgMHgwNSwgMHgyMSwgIDUsIDEwLCAyNSwKLSAgICAweDA2LCAweDIxLCAgNiwgIDgsIDE0LAotICAgIDB4MDcsIDB4MjEsICA3LCAgOCwgMTQsCi0gICAgMHgwOCwgMHgyMywgIDcsICA4LCAxNCwKK3U4IFJhdGVTd2l0Y2hUYWJsZTExTjFTW10gPSB7CisvKiBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24gICAgICAgICAgICAgLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikgKi8KKwkweDBjLCAweDBhLCAwLCAwLCAwLAkvKiBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MDAsIDAsIDQwLCAxMDEsCisJMHgwMSwgMHgwMCwgMSwgNDAsIDUwLAorCTB4MDIsIDB4MDAsIDIsIDI1LCA0NSwKKwkweDAzLCAweDIxLCAwLCAyMCwgMzUsCisJMHgwNCwgMHgyMSwgMSwgMjAsIDM1LAorCTB4MDUsIDB4MjEsIDIsIDIwLCAzNSwKKwkweDA2LCAweDIxLCAzLCAxNSwgMzUsCisJMHgwNywgMHgyMSwgNCwgMTUsIDMwLAorCTB4MDgsIDB4MjEsIDUsIDEwLCAyNSwKKwkweDA5LCAweDIxLCA2LCA4LCAxNCwKKwkweDBhLCAweDIxLCA3LCA4LCAxNCwKKwkweDBiLCAweDIzLCA3LCA4LCAxNCwKIH07CiAKLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjJTW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYSwgMHgwMCwgIDAsICAwLCAgMCwgICAgICAvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAotICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCi0gICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKLSAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAotICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCi0gICAgMHgwNSwgMHgyMCwgMTIsICAxNSwgMzAsCi0gICAgMHgwNiwgMHgyMCwgMTMsICA4LCAyMCwKLSAgICAweDA3LCAweDIwLCAxNCwgIDgsIDIwLAotICAgIDB4MDgsIDB4MjAsIDE1LCAgOCwgMjUsCi0gICAgMHgwOSwgMHgyMiwgMTUsICA4LCAyNSwKK3U4IFJhdGVTd2l0Y2hUYWJsZTExTjJTW10gPSB7CisvKiBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24gICAgICAgICAgICAgLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikgKi8KKwkweDBlLCAweDBjLCAwLCAwLCAwLAkvKiBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MDAsIDAsIDQwLCAxMDEsCisJMHgwMSwgMHgwMCwgMSwgNDAsIDUwLAorCTB4MDIsIDB4MDAsIDIsIDI1LCA0NSwKKwkweDAzLCAweDIxLCAwLCAyMCwgMzUsCisJMHgwNCwgMHgyMSwgMSwgMjAsIDM1LAorCTB4MDUsIDB4MjEsIDIsIDIwLCAzNSwKKwkweDA2LCAweDIxLCAzLCAxNSwgMzUsCisJMHgwNywgMHgyMSwgNCwgMTUsIDMwLAorCTB4MDgsIDB4MjAsIDExLCAxNSwgMzAsCisJMHgwOSwgMHgyMCwgMTIsIDE1LCAzMCwKKwkweDBhLCAweDIwLCAxMywgOCwgMjAsCisJMHgwYiwgMHgyMCwgMTQsIDgsIDIwLAorCTB4MGMsIDB4MjAsIDE1LCA4LCAyNSwKKwkweDBkLCAweDIyLCAxNSwgOCwgMTUsCiB9OwogCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMU4zU1tdID0gewotLy8gSXRlbSBOby4JTW9kZQlDdXJyLU1DUwlUcmFpblVwCVRyYWluRG93bgkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsICAgICAgLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDIxLCAgMCwgMzAsIDEwMSwKLSAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAotICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCi0gICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKLSAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAotICAgIDB4MDUsIDB4MjAsIDEyLCAgMTUsIDMwLAotICAgIDB4MDYsIDB4MjAsIDEzLCAgOCwgMjAsCi0gICAgMHgwNywgMHgyMCwgMTQsICA4LCAyMCwKLSAgICAweDA4LCAweDIwLCAxNSwgIDgsIDI1LAotICAgIDB4MDksIDB4MjIsIDE1LCAgOCwgMjUsCit1OCBSYXRlU3dpdGNoVGFibGUxMU4zU1tdID0geworLyogSXRlbSBOby4gICAgIE1vZGUgICAgQ3Vyci1NQ1MgICAgICAgIFRyYWluVXAgVHJhaW5Eb3duICAgICAgIC8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpICovCisJMHgwYiwgMHgwMCwgMCwgMCwgMCwJLyogMHgwYSwgMHgwMCwgIDAsICAwLCAgMCwgICAgICAvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MjEsIDAsIDMwLCAxMDEsCisJMHgwMSwgMHgyMSwgMSwgMjAsIDUwLAorCTB4MDIsIDB4MjEsIDIsIDIwLCA1MCwKKwkweDAzLCAweDIxLCAzLCAxNSwgNTAsCisJMHgwNCwgMHgyMSwgNCwgMTUsIDMwLAorCTB4MDUsIDB4MjAsIDExLCAxNSwgMzAsCS8qIFJlcXVpcmVkIGJ5IFN5c3RlbS1BbGFuIEAgMjAwODA4MTIgKi8KKwkweDA2LCAweDIwLCAxMiwgMTUsIDMwLAkvKiAweDA1LCAweDIwLCAxMiwgMTUsIDMwLCAqLworCTB4MDcsIDB4MjAsIDEzLCA4LCAyMCwJLyogMHgwNiwgMHgyMCwgMTMsICA4LCAyMCwgKi8KKwkweDA4LCAweDIwLCAxNCwgOCwgMjAsCS8qIDB4MDcsIDB4MjAsIDE0LCAgOCwgMjAsICovCisJMHgwOSwgMHgyMCwgMTUsIDgsIDI1LAkvKiAweDA4LCAweDIwLCAxNSwgIDgsIDI1LCAqLworCTB4MGEsIDB4MjIsIDE1LCA4LCAyNSwJLyogMHgwOSwgMHgyMiwgMTUsICA4LCAyNSwgKi8KIH07CiAKLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBiLCAweDA5LCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCi0gICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKLSAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAotICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCi0gICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA1LCAweDIxLCAgNSwgMTUsIDMwLAotICAgIDB4MDYsIDB4MjAsIDEyLCAgMTUsIDMwLAotICAgIDB4MDcsIDB4MjAsIDEzLCAgOCwgMjAsCi0gICAgMHgwOCwgMHgyMCwgMTQsICA4LCAyMCwKLSAgICAweDA5LCAweDIwLCAxNSwgIDgsIDI1LAotICAgIDB4MGEsIDB4MjIsIDE1LCAgOCwgMjUsCit1OCBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kW10gPSB7CisvKiBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24gICAgICAgICAgICAgLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikgKi8KKwkweDBiLCAweDA5LCAwLCAwLCAwLAkvKiBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MjEsIDAsIDMwLCAxMDEsCisJMHgwMSwgMHgyMSwgMSwgMjAsIDUwLAorCTB4MDIsIDB4MjEsIDIsIDIwLCA1MCwKKwkweDAzLCAweDIxLCAzLCAxNSwgNTAsCisJMHgwNCwgMHgyMSwgNCwgMTUsIDMwLAorCTB4MDUsIDB4MjEsIDUsIDE1LCAzMCwKKwkweDA2LCAweDIwLCAxMiwgMTUsIDMwLAorCTB4MDcsIDB4MjAsIDEzLCA4LCAyMCwKKwkweDA4LCAweDIwLCAxNCwgOCwgMjAsCisJMHgwOSwgMHgyMCwgMTUsIDgsIDI1LAorCTB4MGEsIDB4MjIsIDE1LCA4LCAyNSwKIH07CiAKLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjNTRm9yQUJhbmRbXSA9IHsgLy8gMyozCi0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYiwgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAotICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCi0gICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKLSAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAotICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCi0gICAgMHgwNSwgMHgyMSwgIDUsIDE1LCAzMCwKLSAgICAweDA2LCAweDIwLCAxMiwgIDE1LCAzMCwKLSAgICAweDA3LCAweDIwLCAxMywgIDgsIDIwLAotICAgIDB4MDgsIDB4MjAsIDE0LCAgOCwgMjAsCi0gICAgMHgwOSwgMHgyMCwgMTUsICA4LCAyNSwKLSAgICAweDBhLCAweDIyLCAxNSwgIDgsIDI1LAordTggUmF0ZVN3aXRjaFRhYmxlMTFOM1NGb3JBQmFuZFtdID0gewkvKiAzKjMgKi8KKy8qIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93biAgICAgICAgICAgICAvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKSAqLworCTB4MGIsIDB4MDksIDAsIDAsIDAsCS8qIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uICovCisJMHgwMCwgMHgyMSwgMCwgMzAsIDEwMSwKKwkweDAxLCAweDIxLCAxLCAyMCwgNTAsCisJMHgwMiwgMHgyMSwgMiwgMjAsIDUwLAorCTB4MDMsIDB4MjEsIDMsIDE1LCA1MCwKKwkweDA0LCAweDIxLCA0LCAxNSwgMzAsCisJMHgwNSwgMHgyMSwgNSwgMTUsIDMwLAorCTB4MDYsIDB4MjAsIDEyLCAxNSwgMzAsCisJMHgwNywgMHgyMCwgMTMsIDgsIDIwLAorCTB4MDgsIDB4MjAsIDE0LCA4LCAyMCwKKwkweDA5LCAweDIwLCAxNSwgOCwgMjUsCisJMHgwYSwgMHgyMiwgMTUsIDgsIDI1LAogfTsKIAotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04xU1tdID0gewotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MGQsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKLSAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAotICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCi0gICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKLSAgICAweDA0LCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCi0gICAgMHgwNSwgMHgyMSwgIDEsIDIwLCA1MCwKLSAgICAweDA2LCAweDIxLCAgMiwgMjAsIDUwLAotICAgIDB4MDcsIDB4MjEsICAzLCAxNSwgNTAsCi0gICAgMHgwOCwgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA5LCAweDIxLCAgNSwgMTAsIDI1LAotICAgIDB4MGEsIDB4MjEsICA2LCAgOCwgMTQsCi0gICAgMHgwYiwgMHgyMSwgIDcsICA4LCAxNCwKLQkweDBjLCAweDIzLCAgNywgIDgsIDE0LAordTggUmF0ZVN3aXRjaFRhYmxlMTFCR04xU1tdID0geworLyogSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duICAgICAgICAgICAgIC8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpICovCisJMHgwYywgMHgwYSwgMCwgMCwgMCwJLyogSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24gKi8KKwkweDAwLCAweDAwLCAwLCA0MCwgMTAxLAorCTB4MDEsIDB4MDAsIDEsIDQwLCA1MCwKKwkweDAyLCAweDAwLCAyLCAyNSwgNDUsCisJMHgwMywgMHgyMSwgMCwgMjAsIDM1LAorCTB4MDQsIDB4MjEsIDEsIDIwLCAzNSwKKwkweDA1LCAweDIxLCAyLCAyMCwgMzUsCisJMHgwNiwgMHgyMSwgMywgMTUsIDM1LAorCTB4MDcsIDB4MjEsIDQsIDE1LCAzMCwKKwkweDA4LCAweDIxLCA1LCAxMCwgMjUsCisJMHgwOSwgMHgyMSwgNiwgOCwgMTQsCisJMHgwYSwgMHgyMSwgNywgOCwgMTQsCisJMHgwYiwgMHgyMywgNywgOCwgMTQsCiB9OwogCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjJTW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKLSAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAotICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCi0gICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKLSAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAotICAgIDB4MDUsIDB4MjAsIDEyLCAxNSwgMzAsCi0gICAgMHgwNiwgMHgyMCwgMTMsICA4LCAyMCwKLSAgICAweDA3LCAweDIwLCAxNCwgIDgsIDIwLAotICAgIDB4MDgsIDB4MjAsIDE1LCAgOCwgMjUsCi0gICAgMHgwOSwgMHgyMiwgMTUsICA4LCAyNSwKK3U4IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbXSA9IHsKKy8qIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93biAgICAgICAgICAgICAvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKSAqLworCTB4MGUsIDB4MGMsIDAsIDAsIDAsCS8qIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uICovCisJMHgwMCwgMHgwMCwgMCwgNDAsIDEwMSwKKwkweDAxLCAweDAwLCAxLCA0MCwgNTAsCisJMHgwMiwgMHgwMCwgMiwgMjUsIDQ1LAorCTB4MDMsIDB4MjEsIDAsIDIwLCAzNSwKKwkweDA0LCAweDIxLCAxLCAyMCwgMzUsCisJMHgwNSwgMHgyMSwgMiwgMjAsIDM1LAorCTB4MDYsIDB4MjEsIDMsIDE1LCAzNSwKKwkweDA3LCAweDIxLCA0LCAxNSwgMzAsCisJMHgwOCwgMHgyMCwgMTEsIDE1LCAzMCwKKwkweDA5LCAweDIwLCAxMiwgMTUsIDMwLAorCTB4MGEsIDB4MjAsIDEzLCA4LCAyMCwKKwkweDBiLCAweDIwLCAxNCwgOCwgMjAsCisJMHgwYywgMHgyMCwgMTUsIDgsIDI1LAorCTB4MGQsIDB4MjIsIDE1LCA4LCAxNSwKIH07CiAKLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQkdOM1NbXSA9IHsgLy8gMyozCi0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKLSAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAotICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCi0gICAgMHgwMywgMHgyMSwgIDMsIDIwLCA1MCwKLSAgICAweDA0LCAweDIxLCAgNCwgMTUsIDUwLAotICAgIDB4MDUsIDB4MjAsIDIwLCAxNSwgMzAsCi0gICAgMHgwNiwgMHgyMCwgMjEsICA4LCAyMCwKLSAgICAweDA3LCAweDIwLCAyMiwgIDgsIDIwLAotICAgIDB4MDgsIDB4MjAsIDIzLCAgOCwgMjUsCi0gICAgMHgwOSwgMHgyMiwgMjMsICA4LCAyNSwKK3U4IFJhdGVTd2l0Y2hUYWJsZTExQkdOM1NbXSA9IHsJLyogMyozICovCisvKiBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24gICAgICAgICAgICAgLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikgKi8KKwkweDBhLCAweDAwLCAwLCAwLCAwLAkvKiBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MjEsIDAsIDMwLCAxMDEsCS8qNTAgKi8KKwkweDAxLCAweDIxLCAxLCAyMCwgNTAsCisJMHgwMiwgMHgyMSwgMiwgMjAsIDUwLAorCTB4MDMsIDB4MjEsIDMsIDIwLCA1MCwKKwkweDA0LCAweDIxLCA0LCAxNSwgNTAsCisJMHgwNSwgMHgyMCwgMjAsIDE1LCAzMCwKKwkweDA2LCAweDIwLCAyMSwgOCwgMjAsCisJMHgwNywgMHgyMCwgMjIsIDgsIDIwLAorCTB4MDgsIDB4MjAsIDIzLCA4LCAyNSwKKwkweDA5LCAweDIyLCAyMywgOCwgMjUsCiB9OwogCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBiLCAweDA5LCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgyMSwgIDAsIDMwLDEwMSwJLy81MAotICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCi0gICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKLSAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAotICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCi0gICAgMHgwNSwgMHgyMSwgIDUsIDE1LCAzMCwKLSAgICAweDA2LCAweDIwLCAxMiwgMTUsIDMwLAotICAgIDB4MDcsIDB4MjAsIDEzLCAgOCwgMjAsCi0gICAgMHgwOCwgMHgyMCwgMTQsICA4LCAyMCwKLSAgICAweDA5LCAweDIwLCAxNSwgIDgsIDI1LAotICAgIDB4MGEsIDB4MjIsIDE1LCAgOCwgMjUsCit1OCBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbXSA9IHsKKy8qIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93biAgICAgICAgICAgICAvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKSAqLworCTB4MGIsIDB4MDksIDAsIDAsIDAsCS8qIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uICovCisJMHgwMCwgMHgyMSwgMCwgMzAsIDEwMSwJLyo1MCAqLworCTB4MDEsIDB4MjEsIDEsIDIwLCA1MCwKKwkweDAyLCAweDIxLCAyLCAyMCwgNTAsCisJMHgwMywgMHgyMSwgMywgMTUsIDUwLAorCTB4MDQsIDB4MjEsIDQsIDE1LCAzMCwKKwkweDA1LCAweDIxLCA1LCAxNSwgMzAsCisJMHgwNiwgMHgyMCwgMTIsIDE1LCAzMCwKKwkweDA3LCAweDIwLCAxMywgOCwgMjAsCisJMHgwOCwgMHgyMCwgMTQsIDgsIDIwLAorCTB4MDksIDB4MjAsIDE1LCA4LCAyNSwKKwkweDBhLCAweDIyLCAxNSwgOCwgMjUsCiB9OwogCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjNTRm9yQUJhbmRbXSA9IHsgLy8gMyozCi0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYywgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKLSAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAotICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCi0gICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKLSAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAotICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCi0gICAgMHgwNiwgMHgyMSwgMTIsIDE1LCAzMCwKLSAgICAweDA3LCAweDIwLCAyMCwgMTUsIDMwLAotICAgIDB4MDgsIDB4MjAsIDIxLCAgOCwgMjAsCi0gICAgMHgwOSwgMHgyMCwgMjIsICA4LCAyMCwKLSAgICAweDBhLCAweDIwLCAyMywgIDgsIDI1LAotICAgIDB4MGIsIDB4MjIsIDIzLCAgOCwgMjUsCit1OCBSYXRlU3dpdGNoVGFibGUxMUJHTjNTRm9yQUJhbmRbXSA9IHsJLyogMyozICovCisvKiBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24gICAgICAgICAgICAgLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikgKi8KKwkweDBjLCAweDA5LCAwLCAwLCAwLAkvKiBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MjEsIDAsIDMwLCAxMDEsCS8qNTAgKi8KKwkweDAxLCAweDIxLCAxLCAyMCwgNTAsCisJMHgwMiwgMHgyMSwgMiwgMjAsIDUwLAorCTB4MDMsIDB4MjEsIDMsIDE1LCA1MCwKKwkweDA0LCAweDIxLCA0LCAxNSwgMzAsCisJMHgwNSwgMHgyMSwgNSwgMTUsIDMwLAorCTB4MDYsIDB4MjEsIDEyLCAxNSwgMzAsCisJMHgwNywgMHgyMCwgMjAsIDE1LCAzMCwKKwkweDA4LCAweDIwLCAyMSwgOCwgMjAsCisJMHgwOSwgMHgyMCwgMjIsIDgsIDIwLAorCTB4MGEsIDB4MjAsIDIzLCA4LCAyNSwKKwkweDBiLCAweDIyLCAyMywgOCwgMjUsCiB9OwogCi1QVUNIQVIgUmVhc29uU3RyaW5nW10gPSB7Ci0JLyogMCAgKi8JICJSZXNlcnZlZCIsCi0JLyogMSAgKi8JICJVbnNwZWNpZmllZCBSZWFzb24iLAotCS8qIDIgICovCSAiUHJldmlvdXMgQXV0aCBubyBsb25nZXIgdmFsaWQiLAotCS8qIDMgICovCSAiU1RBIGlzIGxlYXZpbmcgLyBoYXMgbGVmdCIsCi0JLyogNCAgKi8JICJESVMtQVNTT0MgZHVlIHRvIGluYWN0aXZpdHkiLAotCS8qIDUgICovCSAiQVAgdW5hYmxlIHRvIGhhbmxlIGFsbCBhc3NvY2lhdGlvbnMiLAotCS8qIDYgICovCSAiY2xhc3MgMiBlcnJvciIsCi0JLyogNyAgKi8JICJjbGFzcyAzIGVycm9yIiwKLQkvKiA4ICAqLwkgIlNUQSBpcyBsZWF2aW5nIC8gaGFzIGxlZnQiLAotCS8qIDkgICovCSAicmVxdWlyZSBhdXRoIGJlZm9yZSBhc3NvYy9yZS1hc3NvYyIsCi0JLyogMTAgKi8JICJSZXNlcnZlZCIsCi0JLyogMTEgKi8JICJSZXNlcnZlZCIsCi0JLyogMTIgKi8JICJSZXNlcnZlZCIsCi0JLyogMTMgKi8JICJpbnZhbGlkIElFIiwKLQkvKiAxNCAqLwkgIk1JQyBlcnJvciIsCi0JLyogMTUgKi8JICI0LXdheSBoYW5kc2hha2UgdGltZW91dCIsCi0JLyogMTYgKi8JICIyLXdheSAoZ3JvdXAga2V5KSBoYW5kc2hha2UgdGltZW91dCIsCi0JLyogMTcgKi8JICI0LXdheSBoYW5kc2hha2UgSUUgZGlmZiBhbW9uZyBBc3Nvc1JlcS9Sc3AvQmVhY29uIiwKLQkvKiAxOCAqLworZXh0ZXJuIHU4IE9mZG1SYXRlVG9SeHdpTUNTW107CisvKiBzaW5jZSBSVDYxIGhhcyBiZXR0ZXIgUlggc2Vuc2liaWxpdHksIHdlIGhhdmUgdG8gbGltaXQgVFggQUNLIHJhdGUgbm90IHRvIGV4Y2VlZCBvdXIgbm9ybWFsIGRhdGEgVFggcmF0ZS4gKi8KKy8qIG90aGVyd2lzZSB0aGUgV0xBTiBwZWVyIG1heSBub3QgYmUgYWJsZSB0byByZWNlaXZlIHRoZSBBQ0sgdGh1cyBkb3duZ3JhZGUgaXRzIGRhdGEgVFggcmF0ZSAqLwordW5zaWduZWQgbG9uZyBCYXNpY1JhdGVNYXNrWzEyXSA9CisgICAgeyAweGZmZmZmMDAxIC8qIDEtTWJwcyAqLyAsIDB4ZmZmZmYwMDMgLyogMiBNYnBzICovICwgMHhmZmZmZjAwNyAvKiA1LjUgKi8gLAorMHhmZmZmZjAwZiAvKiAxMSAqLyAsCisJMHhmZmZmZjAxZiAvKiA2ICovICwgMHhmZmZmZjAzZiAvKiA5ICovICwgMHhmZmZmZjA3ZiAvKiAxMiAqLyAsCisJICAgIDB4ZmZmZmYwZmYgLyogMTggKi8gLAorCTB4ZmZmZmYxZmYgLyogMjQgKi8gLCAweGZmZmZmM2ZmIC8qIDM2ICovICwgMHhmZmZmZjdmZiAvKiA0OCAqLyAsCisJICAgIDB4ZmZmZmZmZmYgLyogNTQgKi8KIH07CiAKLWV4dGVybiBVQ0hBUgkgT2ZkbVJhdGVUb1J4d2lNQ1NbXTsKLS8vIHNpbmNlIFJUNjEgaGFzIGJldHRlciBSWCBzZW5zaWJpbGl0eSwgd2UgaGF2ZSB0byBsaW1pdCBUWCBBQ0sgcmF0ZSBub3QgdG8gZXhjZWVkIG91ciBub3JtYWwgZGF0YSBUWCByYXRlLgotLy8gb3RoZXJ3aXNlIHRoZSBXTEFOIHBlZXIgbWF5IG5vdCBiZSBhYmxlIHRvIHJlY2VpdmUgdGhlIEFDSyB0aHVzIGRvd25ncmFkZSBpdHMgZGF0YSBUWCByYXRlCi1VTE9ORyBCYXNpY1JhdGVNYXNrWzEyXQkJCQk9IHsweGZmZmZmMDAxIC8qIDEtTWJwcyAqLywgMHhmZmZmZjAwMyAvKiAyIE1icHMgKi8sIDB4ZmZmZmYwMDcgLyogNS41ICovLCAweGZmZmZmMDBmIC8qIDExICovLAotCQkJCQkJCQkJICAweGZmZmZmMDFmIC8qIDYgKi8JICwgMHhmZmZmZjAzZiAvKiA5ICovCSAgLCAweGZmZmZmMDdmIC8qIDEyICovICwgMHhmZmZmZjBmZiAvKiAxOCAqLywKLQkJCQkJCQkJCSAgMHhmZmZmZjFmZiAvKiAyNCAqLwkgLCAweGZmZmZmM2ZmIC8qIDM2ICovCSAgLCAweGZmZmZmN2ZmIC8qIDQ4ICovICwgMHhmZmZmZmZmZiAvKiA1NCAqL307Cit1OCBCUk9BRENBU1RfQUREUltNQUNfQUREUl9MRU5dID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07Cit1OCBaRVJPX01BQ19BRERSW01BQ19BRERSX0xFTl0gPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKIAotVUNIQVIgTVVMVElDQVNUX0FERFJbTUFDX0FERFJfTEVOXSA9IHsweDEsICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLVVDSEFSIEJST0FEQ0FTVF9BRERSW01BQ19BRERSX0xFTl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07Ci1VQ0hBUiBaRVJPX01BQ19BRERSW01BQ19BRERSX0xFTl0gID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworLyogZS5nLiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW1JBVEVfMzZdIiBtZWFucyBpZiB0aGUgY3VycmVudCBSU1NJIGlzIGdyZWF0ZXIgdGhhbiAqLworLyogICAgICAgICAgICAgIHRoaXMgdmFsdWUsIHRoZW4gaXQncyBxdWFyYW50ZWVkIGNhcGFibGUgb2Ygb3BlcmF0aW5nIGluIDM2IG1icHMgVFggcmF0ZSBpbiAqLworLyogICAgICAgICAgICAgIGNsZWFuIGVudmlyb25tZW50LiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHhSYXRlOiAxICAgMiAgIDUuNSAgIDExICAgICAgIDYgICAgICAgIDkgICAgMTIgICAgICAgMTggICAgICAgMjQgICAzNiAgIDQ4ICAgNTQgICAgICAgNzIgIDEwMCAqLworY2hhciBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW10gPQorICAgIHsgLTkyLCAtOTEsIC05MCwgLTg3LCAtODgsIC04NiwgLTg1LCAtODMsIC04MSwgLTc4LCAtNzIsIC03MSwgLTQwLCAtNDAgfTsKIAotLy8gZS5nLiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW1JBVEVfMzZdIiBtZWFucyBpZiB0aGUgY3VycmVudCBSU1NJIGlzIGdyZWF0ZXIgdGhhbgotLy8JCXRoaXMgdmFsdWUsIHRoZW4gaXQncyBxdWFyYW50ZWVkIGNhcGFibGUgb2Ygb3BlcmF0aW5nIGluIDM2IG1icHMgVFggcmF0ZSBpbgotLy8JCWNsZWFuIGVudmlyb25tZW50LgotLy8JCQkJCQkJCSAgVHhSYXRlOiAxICAgMiAgIDUuNQkxMQkgNgkgIDkgICAgMTIJMTgJIDI0ICAgMzYgICA0OAk1NAkgNzIgIDEwMAotQ0hBUiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW10gPXsgIC05MiwgLTkxLCAtOTAsIC04NywgLTg4LCAtODYsIC04NSwgLTgzLCAtODEsIC03OCwgLTcyLCAtNzEsIC00MCwgLTQwIH07Cit1OCBSYXRlSWRUb01icHNbXSA9IHsgMSwgMiwgNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQsIDcyLCAxMDAgfTsKK3UxNiBSYXRlSWRUbzUwMEticHNbXSA9CisgICAgeyAyLCA0LCAxMSwgMjIsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDgsIDE0NCwgMjAwIH07CiAKLVVDSEFSICBSYXRlSWRUb01icHNbXQkgPSB7IDEsIDIsIDUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0LCA3MiwgMTAwfTsKLVVTSE9SVCBSYXRlSWRUbzUwMEticHNbXSA9IHsgMiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4LCAxNDQsIDIwMH07Cit1OCBTc2lkSWUgPSBJRV9TU0lEOwordTggU3VwUmF0ZUllID0gSUVfU1VQUF9SQVRFUzsKK3U4IEV4dFJhdGVJZSA9IElFX0VYVF9TVVBQX1JBVEVTOwordTggSHRDYXBJZSA9IElFX0hUX0NBUDsKK3U4IEFkZEh0SW5mb0llID0gSUVfQUREX0hUOwordTggTmV3RXh0Q2hhbkllID0gSUVfU0VDT05EQVJZX0NIX09GRlNFVDsKK3U4IEVycEllID0gSUVfRVJQOwordTggRHNJZSA9IElFX0RTX1BBUk07Cit1OCBUaW1JZSA9IElFX1RJTTsKK3U4IFdwYUllID0gSUVfV1BBOwordTggV3BhMkllID0gSUVfV1BBMjsKK3U4IElic3NJZSA9IElFX0lCU1NfUEFSTTsKIAotVUNIQVIgIFNzaWRJZQkgPSBJRV9TU0lEOwotVUNIQVIgIFN1cFJhdGVJZSA9IElFX1NVUFBfUkFURVM7Ci1VQ0hBUiAgRXh0UmF0ZUllID0gSUVfRVhUX1NVUFBfUkFURVM7Ci1VQ0hBUiAgSHRDYXBJZSA9IElFX0hUX0NBUDsKLVVDSEFSICBBZGRIdEluZm9JZSA9IElFX0FERF9IVDsKLVVDSEFSICBOZXdFeHRDaGFuSWUgPSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUOwotVUNIQVIgIEVycEllCSA9IElFX0VSUDsKLVVDSEFSICBEc0llIAkgPSBJRV9EU19QQVJNOwotVUNIQVIgIFRpbUllCSA9IElFX1RJTTsKLVVDSEFSICBXcGFJZQkgPSBJRV9XUEE7Ci1VQ0hBUiAgV3BhMkllCSA9IElFX1dQQTI7Ci1VQ0hBUiAgSWJzc0llCSA9IElFX0lCU1NfUEFSTTsKLVVDSEFSICBDY3gySWUJID0gSUVfQ0NYX1YyOworZXh0ZXJuIHU4IFdQQV9PVUlbXTsKIAotZXh0ZXJuIFVDSEFSCVdQQV9PVUlbXTsKK3U4IFNFU19PVUlbXSA9IHsgMHgwMCwgMHg5MCwgMHg0YyB9OwogCi1VQ0hBUglTRVNfT1VJW10gPSB7MHgwMCwgMHg5MCwgMHg0Y307Ci0KLVVDSEFSCVplcm9Tc2lkWzMyXSA9IHsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9OwotCi0vLyBSZXNldCB0aGUgUkZJQyBzZXR0aW5nIHRvIG5ldyBzZXJpZXMKLVJUTVBfUkZfUkVHUyBSRjI4NTBSZWdUYWJsZVtdID0gewotLy8JCWNoCSBSMSAJCSBSMiAJCSBSMyhUWDB+ND0wKSBSNAotCQl7MSwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3ODYsIDB4OTgxNmI0NTUsIDB4OTgwMDUxMGJ9LAotCQl7MiwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3ODYsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAotCQl7MywgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAotCQl7NCwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAotCQl7NSwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGUsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAotCQl7NiwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGUsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAotCQl7NywgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTIsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAotCQl7OCwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTIsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAotCQl7OSwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTYsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAotCQl7MTAsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTYsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAotCQl7MTEsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OWEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAotCQl7MTIsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OWEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAotCQl7MTMsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OWUsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAotCQl7MTQsIDB4OTg0MDJlY2MsIDB4OTg0YzA3YTIsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOTN9LAotCi0JCS8vIDgwMi4xMSBVTkkgLyBIeXBlckxhbiAyCi0JCXszNiwgMHg5ODQwMmVjYywgMHg5ODRjMDk5YSwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sCi0JCXszOCwgMHg5ODQwMmVjYywgMHg5ODRjMDk5ZSwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5M30sCi0JCXs0MCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4M30sCi0JCXs0NCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sCi0JCXs0NiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4NiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4Yn0sCi0JCXs0OCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4NiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5Yn0sCi0JCXs1MiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4YSwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5M30sCi0JCXs1NCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4YSwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sCi0JCXs1NiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4ZSwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4Yn0sCi0JCXs2MCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY5MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4M30sCi0JCXs2MiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY5MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5M30sCi0JCXs2NCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY5MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sIC8vIFBsdWdmZXN0IzQsIERheTQsIGNoYW5nZSBSRlIzIGxlZnQ0dGggOS0+NS4KLQotCQkvLyA4MDIuMTEgSHlwZXJMYW4gMgotCQl7MTAwLCAweDk4NDAyZWM4LCAweDk4NGMwNmIyLCAweDk4MTc4YTU1LCAweDk4MGVkNzgzfSwKLQotCQkvLyAyMDA4LjA0LjMwIG1vZGlmaWVkCi0JCS8vIFRoZSBzeXN0ZW0gdGVhbSBoYXMgQU4gdG8gaW1wcm92ZSB0aGUgRVZNIHZhbHVlCi0JCS8vIGZvciBjaGFubmVsIDEwMiB0byAxMDggZm9yIHRoZSBSVDI4NTAvUlQyNzUwIGR1YWwgYmFuZCBzb2x1dGlvbi4KLQkJezEwMiwgMHg5ODQwMmVjOCwgMHg5ODVjMDZiMiwgMHg5ODU3OGE1NSwgMHg5ODBlZDc5M30sCi0JCXsxMDQsIDB4OTg0MDJlYzgsIDB4OTg1YzA2YjIsIDB4OTg1NzhhNTUsIDB4OTgwZWQxYTN9LAotCQl7MTA4LCAweDk4NDAyZWNjLCAweDk4NWMwYTMyLCAweDk4NTc4YTU1LCAweDk4MGVkMTkzfSwKLQotCQl7MTEwLCAweDk4NDAyZWNjLCAweDk4NGMwYTM2LCAweDk4MTc4YTU1LCAweDk4MGVkMTgzfSwKLQkJezExMiwgMHg5ODQwMmVjYywgMHg5ODRjMGEzNiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5Yn0sCi0JCXsxMTYsIDB4OTg0MDJlY2MsIDB4OTg0YzBhM2EsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTN9LAotCQl7MTE4LCAweDk4NDAyZWNjLCAweDk4NGMwYTNlLCAweDk4MTc4YTU1LCAweDk4MGVkMTkzfSwKLQkJezEyMCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCi0JCXsxMjQsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9LAotCQl7MTI2LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMTVifSwgLy8gMHg5ODBlZDFiYi0+MHg5ODBlZDE1YiByZXF1aXJlZCBieSBSb3J5IDIwMDcwOTI3Ci0JCXsxMjgsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTN9LAotCQl7MTMyLCAweDk4NDAyZWM0LCAweDk4NGMwMzg2LCAweDk4MTc4YTU1LCAweDk4MGVkMThifSwKLQkJezEzNCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4NiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5M30sCi0JCXsxMzYsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOWJ9LAotCQl7MTQwLCAweDk4NDAyZWM0LCAweDk4NGMwMzhhLCAweDk4MTc4YTU1LCAweDk4MGVkMTgzfSwKLQotCQkvLyA4MDIuMTEgVU5JSQotCQl7MTQ5LCAweDk4NDAyZWM0LCAweDk4NGMwMzhhLCAweDk4MTc4YTU1LCAweDk4MGVkMWE3fSwKLQkJezE1MSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4ZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4N30sCi0JCXsxNTMsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOGZ9LAotCQl7MTU3LCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMTlmfSwKLQkJezE1OSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4ZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDFhN30sCi0JCXsxNjEsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOTIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODd9LAotCQl7MTY1LCAweDk4NDAyZWM0LCAweDk4NGMwMzkyLCAweDk4MTc4YTU1LCAweDk4MGVkMTk3fSwKLQotCQkvLyBKYXBhbgotCQl7MTg0LCAweDk1MDAyY2NjLCAweDk1MDA0OTFlLCAweDk1MDliZTU1LCAweDk1MGMwYTBifSwKLQkJezE4OCwgMHg5NTAwMmNjYywgMHg5NTAwNDkyMiwgMHg5NTA5YmU1NSwgMHg5NTBjMGExM30sCi0JCXsxOTIsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5MjYsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMWJ9LAotCQl7MTk2LCAweDk1MDAyY2NjLCAweDk1MDA0OTJhLCAweDk1MDliZTU1LCAweDk1MGMwYTIzfSwKLQkJezIwOCwgMHg5NTAwMmNjYywgMHg5NTAwNDkzYSwgMHg5NTA5YmU1NSwgMHg5NTBjMGExM30sCi0JCXsyMTIsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5M2UsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMWJ9LAotCQl7MjE2LCAweDk1MDAyY2NjLCAweDk1MDA0OTgyLCAweDk1MDliZTU1LCAweDk1MGMwYTIzfSwKLQotCQkvLyBzdGlsbCBsYWNrIG9mIE1NQUMoSmFwYW4pIGNoIDM0LDM4LDQyLDQ2Cit1OCBaZXJvU3NpZFszMl0gPQorICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAogfTsKLVVDSEFSCU5VTV9PRl8yODUwX0NITkwgPSAoc2l6ZW9mKFJGMjg1MFJlZ1RhYmxlKSAvIHNpemVvZihSVE1QX1JGX1JFR1MpKTsKLQotRlJFUVVFTkNZX0lURU0gRnJlcUl0ZW1zMzAyMFtdID0KLXsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLy8gSVNNIDogMi40IHRvIDIuNDgzIEdIeiAgICAgICAgICAgICAgICAgICAgICAgICAvLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvLyAxMWcKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLy8tQ0gtLS1OLS0tLS0tLVItLS1LLS0tLS0tLS0tLS0KLQl7MSwgICAgMjQxLCAgMiwgIDJ9LAotCXsyLCAgICAyNDEsCSAyLCAgN30sCi0JezMsICAgIDI0MiwJIDIsICAyfSwKLQl7NCwgICAgMjQyLAkgMiwgIDd9LAotCXs1LCAgICAyNDMsCSAyLCAgMn0sCi0JezYsICAgIDI0MywJIDIsICA3fSwKLQl7NywgICAgMjQ0LAkgMiwgIDJ9LAotCXs4LCAgICAyNDQsCSAyLCAgN30sCi0JezksICAgIDI0NSwJIDIsICAyfSwKLQl7MTAsICAgMjQ1LAkgMiwgIDd9LAotCXsxMSwgICAyNDYsCSAyLCAgMn0sCi0JezEyLCAgIDI0NiwJIDIsICA3fSwKLQl7MTMsICAgMjQ3LAkgMiwgIDJ9LAotCXsxNCwgICAyNDgsCSAyLCAgNH0sCi19OwotVUNIQVIJTlVNX09GXzMwMjBfQ0hOTD0oc2l6ZW9mKEZyZXFJdGVtczMwMjApIC8gc2l6ZW9mKEZSRVFVRU5DWV9JVEVNKSk7CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTQ2MCwxNyArMzU2LDE1IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5ESVNfU1RBVFVTIE1sbWVJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoraW50IE1sbWVJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlORElTX1NUQVRVUyBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE1MTUUgSW5pdGlhbGl6ZVxuIikpOwogCi0JZG8KLQl7CisJZG8gewogCQlTdGF0dXMgPSBNbG1lUXVldWVJbml0KCZwQWQtPk1sbWUuUXVldWUpOwotCQlpZihTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQogCQkJYnJlYWs7CiAKIAkJcEFkLT5NbG1lLmJSdW5uaW5nID0gRkFMU0U7CkBAIC00NzksNDAgKzM3Myw2NSBAQAogCQl7CiAJCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CiAKLQkJCS8vIGluaXQgU1RBIHN0YXRlIG1hY2hpbmVzCi0JCQlBc3NvY1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkFzc29jTWFjaGluZSwgcEFkLT5NbG1lLkFzc29jRnVuYyk7Ci0JCQlBdXRoU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXV0aE1hY2hpbmUsIHBBZC0+TWxtZS5BdXRoRnVuYyk7Ci0JCQlBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUsIHBBZC0+TWxtZS5BdXRoUnNwRnVuYyk7Ci0JCQlTeW5jU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuU3luY01hY2hpbmUsIHBBZC0+TWxtZS5TeW5jRnVuYyk7Ci0JCQlXcGFQc2tTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5XcGFQc2tNYWNoaW5lLCBwQWQtPk1sbWUuV3BhUHNrRnVuYyk7Ci0JCQlBaXJvbmV0U3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUsIHBBZC0+TWxtZS5BaXJvbmV0RnVuYyk7CisJCQkvKiBpbml0IFNUQSBzdGF0ZSBtYWNoaW5lcyAqLworCQkJQXNzb2NTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5Bc3NvY01hY2hpbmUsCisJCQkJCSAgICAgIHBBZC0+TWxtZS5Bc3NvY0Z1bmMpOworCQkJQXV0aFN0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkF1dGhNYWNoaW5lLAorCQkJCQkgICAgIHBBZC0+TWxtZS5BdXRoRnVuYyk7CisJCQlBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUsCisJCQkJCQlwQWQtPk1sbWUuQXV0aFJzcEZ1bmMpOworCQkJU3luY1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLlN5bmNNYWNoaW5lLAorCQkJCQkgICAgIHBBZC0+TWxtZS5TeW5jRnVuYyk7CiAKLQkJCS8vIFNpbmNlIHdlIGFyZSB1c2luZyBzd2l0Y2gvY2FzZSB0byBpbXBsZW1lbnQgaXQsIHRoZSBpbml0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBhYm92ZQotCQkJLy8gc3RhdGUgbWFjaGluZSBpbml0CisJCQkvKiBTaW5jZSB3ZSBhcmUgdXNpbmcgc3dpdGNoL2Nhc2UgdG8gaW1wbGVtZW50IGl0LCB0aGUgaW5pdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYWJvdmUgKi8KKwkJCS8qIHN0YXRlIG1hY2hpbmUgaW5pdCAqLwogCQkJTWxtZUNudGxJbml0KHBBZCwgJnBBZC0+TWxtZS5DbnRsTWFjaGluZSwgTlVMTCk7CiAJCX0KIAotCQlBY3Rpb25TdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BY3RNYWNoaW5lLCBwQWQtPk1sbWUuQWN0RnVuYyk7CisJCVdwYVN0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLldwYU1hY2hpbmUsCisJCQkJICAgIHBBZC0+TWxtZS5XcGFGdW5jKTsKIAotCQkvLyBJbml0IG1sbWUgcGVyaW9kaWMgdGltZXIKLQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKE1sbWVQZXJpb2RpY0V4ZWMpLCBwQWQsIFRSVUUpOworCQlBY3Rpb25TdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BY3RNYWNoaW5lLAorCQkJCSAgICAgICBwQWQtPk1sbWUuQWN0RnVuYyk7CiAKLQkJLy8gU2V0IG1sbWUgcGVyaW9kaWMgdGltZXIKKwkJLyogSW5pdCBtbG1lIHBlcmlvZGljIHRpbWVyICovCisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsCisJCQkgICAgICBHRVRfVElNRVJfRlVOQ1RJT04oTWxtZVBlcmlvZGljRXhlYyksIHBBZCwgVFJVRSk7CisKKwkJLyogU2V0IG1sbWUgcGVyaW9kaWMgdGltZXIgKi8KIAkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgTUxNRV9UQVNLX0VYRUNfSU5UVik7CiAKLQkJLy8gc29mdHdhcmUtYmFzZWQgUlggQW50ZW5uYSBkaXZlcnNpdHkKLQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCksIHBBZCwgRkFMU0UpOworCQkvKiBzb2Z0d2FyZS1iYXNlZCBSWCBBbnRlbm5hIGRpdmVyc2l0eSAqLworCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwKKwkJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCksIHBBZCwKKwkJCSAgICAgIEZBTFNFKTsKIAotI2lmZGVmIFJUMjg2MAogCQl7Ci0JICAgICAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQotCSAgICAgICAgewotCSAgICAgICAgICAgIC8vIG9ubHkgUENJZSBjYXJkcyBuZWVkIHRoZXNlIHR3byB0aW1lcnMKLQkgICAgCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFBzUG9sbFdha2VFeGVjKSwgcEFkLCBGQUxTRSk7Ci0JICAgIAkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oUmFkaW9PbkV4ZWMpLCBwQWQsIEZBTFNFKTsKLQkgICAgICAgIH0KKyNpZmRlZiBSVE1QX1BDSV9TVVBQT1JUCisJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpIHsKKwkJCQkvKiBvbmx5IFBDSWUgY2FyZHMgbmVlZCB0aGVzZSB0d28gdGltZXJzICovCisJCQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCisJCQkJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTgorCQkJCQkgICAgICAoUHNQb2xsV2FrZUV4ZWMpLCBwQWQsIEZBTFNFKTsKKwkJCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCisJCQkJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTihSYWRpb09uRXhlYyksCisJCQkJCSAgICAgIHBBZCwgRkFMU0UpOworCQkJfQorI2VuZGlmIC8qIFJUTVBfUENJX1NVUFBPUlQgLy8gKi8KKworCQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuTGlua0Rvd25UaW1lciwKKwkJCQkgICAgICBHRVRfVElNRVJfRlVOQ1RJT04oTGlua0Rvd25FeGVjKSwgcEFkLAorCQkJCSAgICAgIEZBTFNFKTsKKworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuQXV0b1dha2V1cFRpbWVyLAorCQkJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTgorCQkJCSAgICAgIChSdG1wVXNiU3RhQXNpY0ZvcmNlV2FrZXVwVGltZW91dCksIHBBZCwKKwkJCQkgICAgICBGQUxTRSk7CisJCQlwQWQtPk1sbWUuQXV0b1dha2V1cFRpbWVyUnVubmluZyA9IEZBTFNFOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCQl9Ci0jZW5kaWYKKwogCX0gd2hpbGUgKEZBTFNFKTsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBNTE1FIEluaXRpYWxpemVcbiIpKTsKQEAgLTUzNCw5MyArNDUzLDEwMiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBNbG1lSGFuZGxlcigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3ZvaWQgTWxtZUhhbmRsZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCU1MTUVfUVVFVUVfRUxFTSAJICAgKkVsZW0gPSBOVUxMOworCXN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0gPSBOVUxMOwogCi0JLy8gT25seSBhY2NlcHQgTUxNRSBhbmQgRnJhbWUgZnJvbSBwZWVyIHNpZGUsIG5vIG90aGVyIChjb250cm9sL2RhdGEpIGZyYW1lIHNob3VsZAotCS8vIGdldCBpbnRvIHRoaXMgc3RhdGUgbWFjaGluZQorCS8qIE9ubHkgYWNjZXB0IE1MTUUgYW5kIEZyYW1lIGZyb20gcGVlciBzaWRlLCBubyBvdGhlciAoY29udHJvbC9kYXRhKSBmcmFtZSBzaG91bGQgKi8KKwkvKiBnZXQgaW50byB0aGlzIHN0YXRlIG1hY2hpbmUgKi8KIAogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7Ci0JaWYocEFkLT5NbG1lLmJSdW5uaW5nKQotCXsKKwlpZiAocEFkLT5NbG1lLmJSdW5uaW5nKSB7CiAJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CiAJCXJldHVybjsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBUUlVFOwogCX0KIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwogCi0Jd2hpbGUgKCFNbG1lUXVldWVFbXB0eSgmcEFkLT5NbG1lLlF1ZXVlKSkKLQl7CisJd2hpbGUgKCFNbG1lUXVldWVFbXB0eSgmcEFkLT5NbG1lLlF1ZXVlKSkgewogCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01MTUVfUkVTRVRfSU5fUFJPR1JFU1MpIHx8Ci0JCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykgfHwKLQkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGV2aWNlIEhhbHRlZCBvciBSZW1vdmVkIG9yIE1sbWVSZXN0LCBleGl0IE1sbWVIYW5kbGVyISAocXVldWUgbnVtID0gJWxkKVxuIiwgcEFkLT5NbG1lLlF1ZXVlLk51bSkpOworCQkgICAgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpIHx8CisJCSAgICBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkRldmljZSBIYWx0ZWQgb3IgUmVtb3ZlZCBvciBNbG1lUmVzdCwgZXhpdCBNbG1lSGFuZGxlciEgKHF1ZXVlIG51bSA9ICVsZClcbiIsCisJCQkJICBwQWQtPk1sbWUuUXVldWUuTnVtKSk7CiAJCQlicmVhazsKIAkJfQotCi0JCS8vRnJvbSBtZXNzYWdlIHR5cGUsIGRldGVybWluZSB3aGljaCBzdGF0ZSBtYWNoaW5lIEkgc2hvdWxkIGRyaXZlCi0JCWlmIChNbG1lRGVxdWV1ZSgmcEFkLT5NbG1lLlF1ZXVlLCAmRWxlbSkpCi0JCXsKLSNpZmRlZiBSVDI4NzAKLQkJCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9SRVNFVF9DT05GKQotCQkJewotCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIhISEgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworCQkvKkZyb20gbWVzc2FnZSB0eXBlLCBkZXRlcm1pbmUgd2hpY2ggc3RhdGUgbWFjaGluZSBJIHNob3VsZCBkcml2ZSAqLworCQlpZiAoTWxtZURlcXVldWUoJnBBZC0+TWxtZS5RdWV1ZSwgJkVsZW0pKSB7CisjaWZkZWYgUlRNUF9NQUNfVVNCCisJCQlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfUkVTRVRfQ09ORikgeworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJICAgICAoInJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSFcbiIpKTsKIAkJCQlNbG1lUmVzdGFydFN0YXRlTWFjaGluZShwQWQpOwogCQkJCUVsZW0tPk9jY3VwaWVkID0gRkFMU0U7CiAJCQkJRWxlbS0+TXNnTGVuID0gMDsKIAkJCQljb250aW51ZTsKIAkJCX0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCQkJLy8gaWYgZGVxdWV1ZSBzdWNjZXNzCi0JCQlzd2l0Y2ggKEVsZW0tPk1hY2hpbmUpCi0JCQl7Ci0JCQkJLy8gU1RBIHN0YXRlIG1hY2hpbmVzCi0JCQkJY2FzZSBBU1NPQ19TVEFURV9NQUNISU5FOgotCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5Bc3NvY01hY2hpbmUsIEVsZW0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFVVEhfU1RBVEVfTUFDSElORToKLQkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQXV0aE1hY2hpbmUsIEVsZW0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFVVEhfUlNQX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkF1dGhSc3BNYWNoaW5lLCBFbGVtKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTWU5DX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLlN5bmNNYWNoaW5lLCBFbGVtKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBNTE1FX0NOVExfU1RBVEVfTUFDSElORToKLQkJCQkJTWxtZUNudGxNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQ250bE1hY2hpbmUsIEVsZW0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFdQQV9QU0tfU1RBVEVfTUFDSElORToKLQkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuV3BhUHNrTWFjaGluZSwgRWxlbSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQUlST05FVF9TVEFURV9NQUNISU5FOgotCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZSwgRWxlbSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQUNUSU9OX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkFjdE1hY2hpbmUsIEVsZW0pOwotCQkJCQlicmVhazsKKwkJCS8qIGlmIGRlcXVldWUgc3VjY2VzcyAqLworCQkJc3dpdGNoIChFbGVtLT5NYWNoaW5lKSB7CisJCQkJLyogU1RBIHN0YXRlIG1hY2hpbmVzICovCisJCQljYXNlIEFTU09DX1NUQVRFX01BQ0hJTkU6CisJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsCisJCQkJCQkJICAmcEFkLT5NbG1lLgorCQkJCQkJCSAgQXNzb2NNYWNoaW5lLCBFbGVtKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQVVUSF9TVEFURV9NQUNISU5FOgorCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLAorCQkJCQkJCSAgJnBBZC0+TWxtZS4KKwkJCQkJCQkgIEF1dGhNYWNoaW5lLCBFbGVtKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQVVUSF9SU1BfU1RBVEVfTUFDSElORToKKwkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwKKwkJCQkJCQkgICZwQWQtPk1sbWUuCisJCQkJCQkJICBBdXRoUnNwTWFjaGluZSwgRWxlbSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNZTkNfU1RBVEVfTUFDSElORToKKwkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwKKwkJCQkJCQkgICZwQWQtPk1sbWUuCisJCQkJCQkJICBTeW5jTWFjaGluZSwgRWxlbSk7CisJCQkJYnJlYWs7CisJCQljYXNlIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FOgorCQkJCU1sbWVDbnRsTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLAorCQkJCQkJCSAgICAgJnBBZC0+TWxtZS4KKwkJCQkJCQkgICAgIENudGxNYWNoaW5lLCBFbGVtKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgV1BBX1BTS19TVEFURV9NQUNISU5FOgorCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLAorCQkJCQkJCSAgJnBBZC0+TWxtZS4KKwkJCQkJCQkgIFdwYVBza01hY2hpbmUsIEVsZW0pOworCQkJCWJyZWFrOwogCisJCQljYXNlIEFDVElPTl9TVEFURV9NQUNISU5FOgorCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLAorCQkJCQkJCSAgJnBBZC0+TWxtZS5BY3RNYWNoaW5lLAorCQkJCQkJCSAgRWxlbSk7CisJCQkJYnJlYWs7CiAKKwkJCWNhc2UgV1BBX1NUQVRFX01BQ0hJTkU6CisJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsCisJCQkJCQkJICAmcEFkLT5NbG1lLldwYU1hY2hpbmUsCisJCQkJCQkJICBFbGVtKTsKKwkJCQlicmVhazsKIAorCQkJZGVmYXVsdDoKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiRVJST1I6IElsbGVnYWwgbWFjaGluZSAlbGQgaW4gTWxtZUhhbmRsZXIoKVxuIiwKKwkJCQkJICBFbGVtLT5NYWNoaW5lKSk7CisJCQkJYnJlYWs7CisJCQl9CS8qIGVuZCBvZiBzd2l0Y2ggKi8KIAotCQkJCWRlZmF1bHQ6Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkVSUk9SOiBJbGxlZ2FsIG1hY2hpbmUgJWxkIGluIE1sbWVIYW5kbGVyKClcbiIsIEVsZW0tPk1hY2hpbmUpKTsKLQkJCQkJYnJlYWs7Ci0JCQl9IC8vIGVuZCBvZiBzd2l0Y2gKLQotCQkJLy8gZnJlZSBNTE1FIGVsZW1lbnQKKwkJCS8qIGZyZWUgTUxNRSBlbGVtZW50ICovCiAJCQlFbGVtLT5PY2N1cGllZCA9IEZBTFNFOwogCQkJRWxlbS0+TXNnTGVuID0gMDsKIAotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJREJHUFJJTlRfRVJSKCgiTWxtZUhhbmRsZXI6IE1sbWVRdWV1ZSBlbXB0eVxuIikpOwogCQl9CiAJfQpAQCAtNjQzLDczICs1NzEsNjcgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZUhhbHQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIE1sbWVIYWx0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlCT09MRUFOIAkgIENhbmNlbGxlZDsKLSNpZmRlZiBSVDMwNzAKLQlVSU5UMzIJCVR4UGluQ2ZnID0gMHgwMDA1MEYwRjsKLSNlbmRpZiAvLyBSVDMwNzAgLy8KKwlCT09MRUFOIENhbmNlbGxlZDsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lSGFsdFxuIikpOwogCi0JaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JewotCQkvLyBkaXNhYmxlIEJFQUNPTiBnZW5lcmF0aW9uIGFuZCBvdGhlciBCRUFDT04gcmVsYXRlZCBoYXJkd2FyZSB0aW1lcnMKKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgeworCQkvKiBkaXNhYmxlIEJFQUNPTiBnZW5lcmF0aW9uIGFuZCBvdGhlciBCRUFDT04gcmVsYXRlZCBoYXJkd2FyZSB0aW1lcnMgKi8KIAkJQXNpY0Rpc2FibGVTeW5jKHBBZCk7CiAJfQogCiAJewotCQkvLyBDYW5jZWwgcGVuZGluZyB0aW1lcnMKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwJCSZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwJJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwJCSZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwJCSZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsCQkmQ2FuY2VsbGVkKTsKLSNpZmRlZiBSVDI4NjAKLQkgICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKLQkgICAgewotCSAgIAkgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQkJICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwJCSZDYW5jZWxsZWQpOworCQkvKiBDYW5jZWwgcGVuZGluZyB0aW1lcnMgKi8KKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJkNhbmNlbGxlZCk7CisKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCisJCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKSB7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgJkNhbmNlbGxlZCk7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsICZDYW5jZWxsZWQpOwogCQl9Ci0jZW5kaWYKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5MaW5rRG93blRpbWVyLCAmQ2FuY2VsbGVkKTsKKworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5BdXRvV2FrZXVwVGltZXIsICZDYW5jZWxsZWQpOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCX0KIAotCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwJCSZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsICZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLCAmQ2FuY2VsbGVkKTsKIAorCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSB7CisJCXN0cnVjdCBydF9ydG1wX2NoaXBfb3AgKnBDaGlwT3BzID0gJnBBZC0+Y2hpcE9wczsKIAotCi0JaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JewotCQkvLyBTZXQgTEVECisJCS8qIFNldCBMRUQgKi8KIAkJUlRNUFNldExFRChwQWQsIExFRF9IQUxUKTsKLSAgICAgICAgUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvLyBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGZpcm13YXJlIGlzIG5vdCBkb25lIGl0LgotI2lmZGVmIFJUMjg3MAotICAgICAgICB7Ci0gICAgICAgICAgICBMRURfQ0ZHX1NUUlVDIExlZENmZzsKLSAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgTEVEX0NGRywgJkxlZENmZy53b3JkKTsKLSAgICAgICAgICAgIExlZENmZy5maWVsZC5MZWRQb2xhciA9IDA7Ci0gICAgICAgICAgICBMZWRDZmcuZmllbGQuUkxlZE1vZGUgPSAwOwotICAgICAgICAgICAgTGVkQ2ZnLmZpZWxkLkdMZWRNb2RlID0gMDsKLSAgICAgICAgICAgIExlZENmZy5maWVsZC5ZTGVkTW9kZSA9IDA7Ci0gICAgICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBMRURfQ0ZHLCBMZWRDZmcud29yZCk7Ci0gICAgICAgIH0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KLSNpZmRlZiBSVDMwNzAKLQkJLy8KLQkJLy8gVHVybiBvZmYgTE5BX1BFCi0JCS8vCi0JCWlmIChJU19SVDMwNzAocEFkKSB8fCBJU19SVDMwNzEocEFkKSkKKwkJUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvKiBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGZpcm13YXJlIGlzIG5vdCBkb25lIGl0LiAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgogCQl7Ci0JCQlUeFBpbkNmZyAmPSAweEZGRkZGMEYwOwotCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOworCQkJTEVEX0NGR19TVFJVQyBMZWRDZmc7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIExFRF9DRkcsICZMZWRDZmcud29yZCk7CisJCQlMZWRDZmcuZmllbGQuTGVkUG9sYXIgPSAwOworCQkJTGVkQ2ZnLmZpZWxkLlJMZWRNb2RlID0gMDsKKwkJCUxlZENmZy5maWVsZC5HTGVkTW9kZSA9IDA7CisJCQlMZWRDZmcuZmllbGQuWUxlZE1vZGUgPSAwOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTEVEX0NGRywgTGVkQ2ZnLndvcmQpOwogCQl9Ci0jZW5kaWYgLy8gUlQzMDcwIC8vCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisKKwkJaWYgKHBDaGlwT3BzLT5Bc2ljSGFsdEFjdGlvbikKKwkJCXBDaGlwT3BzLT5Bc2ljSGFsdEFjdGlvbihwQWQpOwogCX0KIAotCVJUTVB1c2VjRGVsYXkoNTAwMCk7ICAgIC8vICA1IG1zZWMgdG8gZ3VyYW50ZWUgQW50IERpdmVyc2l0eSB0aW1lciBjYW5jZWxlZAorCVJUTVB1c2VjRGVsYXkoNTAwMCk7CS8qICA1IG1zZWMgdG8gZ3VyYW50ZWUgQW50IERpdmVyc2l0eSB0aW1lciBjYW5jZWxlZCAqLwogCiAJTWxtZVF1ZXVlRGVzdHJveSgmcEFkLT5NbG1lLlF1ZXVlKTsKIAlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwpAQCAtNzE3LDExICs2MzksMTEgQEAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUhhbHRcbiIpKTsKIH0KIAotVk9JRCBNbG1lUmVzZXRSYWxpbmtDb3VudGVycygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKK3ZvaWQgTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCXBBZC0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1J4T2tEYXRhQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudDsKLQkvLyBjbGVhciBhbGwgT25lU2VjeHh4IGNvdW50ZXJzLgorCXBBZC0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1J4T2tEYXRhQ250ID0KKwkgICAgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudDsKKwkvKiBjbGVhciBhbGwgT25lU2VjeHh4IGNvdW50ZXJzLiAqLwogCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjQmVhY29uU2VudENudCA9IDA7CiAJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNGYWxzZUNDQUNudCA9IDA7CiAJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudCA9IDA7CkBAIC03MzAsOCArNjUyLDEwIEBACiAJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID0gMDsKIAlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ID0gMDsKIAlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tEYXRhQ250ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1JlY2VpdmVkQnl0ZUNvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50ID0gMDsKIAotCS8vIFRPRE86IGZvciBkZWJ1ZyBvbmx5LiB0byBiZSByZW1vdmVkCisJLyogVE9ETzogZm9yIGRlYnVnIG9ubHkuIHRvIGJlIHJlbW92ZWQgKi8KIAlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRSURfQUNfQkVdID0gMDsKIAlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRSURfQUNfQktdID0gMDsKIAlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRSURfQUNfVkldID0gMDsKQEAgLTc0OCw5ICs2NzIsNiBAQAogCXJldHVybjsKIH0KIAotdW5zaWduZWQgbG9uZyByeF9BTVNEVTsKLXVuc2lnbmVkIGxvbmcgcnhfVG90YWw7Ci0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAlEZXNjcmlwdGlvbjoKQEAgLTc2NywyMjkgKzY4OCwxODggQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLSNkZWZpbmUgQURIT0NfQkVBQ09OX0xPU1RfVElNRQkJKDgqT1NfSFopICAvLyA4IHNlYwotVk9JRCBNbG1lUGVyaW9kaWNFeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKKyNkZWZpbmUgQURIT0NfQkVBQ09OX0xPU1RfVElNRQkJKDgqT1NfSFopCS8qIDggc2VjICovCit2b2lkIE1sbWVQZXJpb2RpY0V4ZWModm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgICAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQogewotCVVMT05HCQkJVHhUb3RhbENudDsKLQlQUlRNUF9BREFQVEVSCXBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisJdW5zaWduZWQgbG9uZyBUeFRvdGFsQ250OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OwogCi0jaWZkZWYgUlQyODYwCi0JLy9CYXJvbiAyMDA4LzA3LzEwCi0JLy9wcmludGsoIkJhcm9uX1Rlc3Q6XHQlcyIsIFJUTVBHZXRSYWxpbmtFbmNyeU1vZGVTdHIocEFkLT5TdGFDZmcuV2VwU3RhdHVzKSk7Ci0JLy9JZiB0aGUgU1RBIHNlY3VyaXR5IHNldHRpbmcgaXMgT1BFTiBvciBXRVAsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IDAuCi0JLy9JZiB0aGUgU1RBIHNlY3VyaXR5IHNldHRpbmcgaXMgV1BBUFNLIG9yIFdQQTJQU0ssIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IDEuCi0JaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzPDIpCisjaWZkZWYgUlRNUF9NQUNfUENJCiAJewotCQlwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSAwOwotCX0KLQllbHNlCi0JewotCQlwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSAxOwotCX0KKwkJLyogSWYgSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkLCB3ZSBoYXZlIHRvIGNoZWNrIEdQSU8gcGluMiBldmVyeSAyIHNlY29uZC4gKi8KKwkJLyogTW92ZSBjb2RlIHRvIGhlcmUsIGJlY2F1c2UgZm9sbG93aW5nIGNvZGUgd2lsbCByZXR1cm4gd2hlbiByYWRpbyBpcyBvZmYgKi8KKwkJaWYgKChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlIChNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAqIDIpID09CisJCSAgICAgMCkgJiYgKHBBZC0+U3RhQ2ZnLmJIYXJkd2FyZVJhZGlvID09IFRSVUUpCisJCSAgICAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJICAgICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQorCQkgICAgLyomJihwQWQtPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICovCisJCSAgICApIHsKKwkJCXUzMiBkYXRhID0gMDsKIAotCXsKLQkgICAgLy8gSWYgSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkLCB3ZSBoYXZlIHRvIGNoZWNrIEdQSU8gcGluMiBldmVyeSAyIHNlY29uZC4KLQkJLy8gTW92ZSBjb2RlIHRvIGhlcmUsIGJlY2F1c2UgZm9sbG93aW5nIGNvZGUgd2lsbCByZXR1cm4gd2hlbiByYWRpbyBpcyBvZmYKLQkJaWYgKChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlIChNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAqIDIpID09IDApICYmCi0JCQkocEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPT0gVFJVRSkgJiYKLQkJCShSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSkKLQkJewotCQkJVUlOVDMyCQkJCWRhdGEgPSAwOworCQkJLyogUmVhZCBHUElPIHBpbjIgYXMgSGFyZHdhcmUgY29udHJvbGxlZCByYWRpbyBzdGF0ZSAqLworI2lmbmRlZiBSVDMwOTAKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJmRhdGEpOworI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworLypLSChQQ0lFIFBTKTpBZGRlZCBiYXNlZCBvbiBKYW5lPC0tICovCisjaWZkZWYgUlQzMDkwCisvKiBSZWFkIEdQSU8gcGluMiBhcyBIYXJkd2FyZSBjb250cm9sbGVkIHJhZGlvIHN0YXRlICovCisvKiBXZSBuZWVkIHRvIFJlYWQgR1BJTyBpZiBIVyBzYWlkIHNvIG5vIG1hdGVyIHdoYXQgYWR2YW5jZSBwb3dlciBzYXZpbmcgKi8KKwkJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgKElETEVfT04ocEFkKSkKKwkJCSAgICAmJgorCQkJICAgIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKQorCQkJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlUFNpbklkbGUgPT0KKwkJCQlUUlVFKSkgeworCQkJCS8qIFdhbnQgdG8gbWFrZSBzdXJlIGRldmljZSBnb2VzIHRvIEwwIHN0YXRlIGJlZm9yZSByZWFkaW5nIHJlZ2lzdGVyLiAqLworCQkJCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCAwKTsKKwkJCQlSVE1QX0lPX0ZPUkNFX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZkYXRhKTsKKwkJCQlSVE1QUENJZUxpbmtDdHJsU2V0dGluZyhwQWQsIDMpOworCQkJfSBlbHNlCisJCQkJUlRNUF9JT19GT1JDRV9SRUFEMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCAmZGF0YSk7CisjZW5kaWYgLyogUlQzMDkwIC8vICovCisvKktIKFBDSUUgUFMpOkFkZGVkIGJhc2VkIG9uIEphbmUtLT4gKi8KIAotCQkJLy8gUmVhZCBHUElPIHBpbjIgYXMgSGFyZHdhcmUgY29udHJvbGxlZCByYWRpbyBzdGF0ZQotCQkJUlRNUF9JT19GT1JDRV9SRUFEMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCAmZGF0YSk7Ci0JCQlpZiAoZGF0YSAmIDB4MDQpCi0JCQl7CisJCQlpZiAoZGF0YSAmIDB4MDQpIHsKIAkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IFRSVUU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7CisJCQl9IGVsc2UgewogCQkJCXBBZC0+U3RhQ2ZnLmJId1JhZGlvID0gRkFMU0U7CiAJCQl9Ci0JCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCi0JCQl7Ci0JCQkJcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKLQkJCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCi0JCQkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPQorCQkJICAgIChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpIHsKKwkJCQlwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8KKwkJCQkJCSAgICAgICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKKwkJCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpIHsKIAkJCQkJTWxtZVJhZGlvT24ocEFkKTsKLQkJCQkJLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCS8qIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiAqLwogCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7CisJCQkJfSBlbHNlIHsKIAkJCQkJTWxtZVJhZGlvT2ZmKHBBZCk7Ci0JCQkJCS8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQkvKiBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gKi8KIAkJCQkJcEFkLT5FeHRyYUluZm8gPSBIV19SQURJT19PRkY7CiAJCQkJfQogCQkJfQogCQl9CiAJfQotI2VuZGlmIC8qIFJUMjg2MCAqLworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJLyogRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuICovCisJLyogVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0ICovCiAJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8Ci0JCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkpKQorCQkJCSAgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJCSAgZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVCB8CisJCQkJICBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkpKQogCQlyZXR1cm47CiAKLSNpZmRlZiBSVDI4NjAKLQl7Ci0JCWlmICgocEFkLT5SYWxpbmtDb3VudGVycy5MYXN0UmVjZWl2ZWRCeXRlQ291bnQgPT0gcEFkLT5SYWxpbmtDb3VudGVycy5SZWNlaXZlZEJ5dGVDb3VudCkgJiYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKSkKLQkJewotCQkJLy8gSWYgUmVjZWl2ZUJ5dGVDb3VudCBkb2Vzbid0IGNoYW5nZSwgIGluY3JlYXNlIFNhbWVSeEJ5dGVDb3VudCBieSAxLgotCQkJcEFkLT5TYW1lUnhCeXRlQ291bnQrKzsKLQkJfQotCQllbHNlCi0JCQlwQWQtPlNhbWVSeEJ5dGVDb3VudCA9IDA7Ci0KLQkJLy8gSWYgYWZ0ZXIgQkJQLCBzdGlsbCBub3Qgd29yay4uLm5lZWQgdG8gY2hlY2sgdG8gcmVzZXQgUEJGJk1BQy4KLQkJaWYgKHBBZC0+U2FtZVJ4Qnl0ZUNvdW50ID09IDcwMikKLQkJewotCQkJcEFkLT5TYW1lUnhCeXRlQ291bnQgPSAwOwotCQkJQXNpY1Jlc2V0UEJGKHBBZCk7Ci0JCQlBc2ljUmVzZXRNQUMocEFkKTsKLQkJfQotCi0JCS8vIElmIFNhbWVSeEJ5dGVDb3VudCBrZWVwcyBoYXBwZW5zIGZvciAyIHNlY29uZCBpbiBpbmZyYSBtb2RlLCBvciBmb3IgNjAgc2Vjb25kcyBpbiBpZGxlIG1vZGUuCi0JCWlmICgoKElORlJBX09OKHBBZCkpICYmIChwQWQtPlNhbWVSeEJ5dGVDb3VudCA+IDIwKSkgfHwgKChJRExFX09OKHBBZCkpICYmIChwQWQtPlNhbWVSeEJ5dGVDb3VudCA+IDYwMCkpKQotCQl7Ci0JCQlpZiAoKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKSAmJiAocEFkLT5TYW1lUnhCeXRlQ291bnQgPCA3MDApKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT4gIFNhbWVSeEJ5dGVDb3VudCA9ICVsdSAhISEhISEhISEhISEhISEgXG4iLCBwQWQtPlNhbWVSeEJ5dGVDb3VudCkpOwotCQkJCXBBZC0+U2FtZVJ4Qnl0ZUNvdW50ID0gNzAwOwotCQkJCUFzaWNSZXNldEJCUChwQWQpOwotCQkJfQotCQl9Ci0KLQkJLy8gVXBkYXRlIGxhc3RSZWNlaXZlQnl0ZUNvdW50LgotCQlwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RSZWNlaXZlZEJ5dGVDb3VudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQ7Ci0KLQkJaWYgKChwQWQtPkNoZWNrRG1hQnVzeUNvdW50ID4gMykgJiYgKElETEVfT04ocEFkKSkpCi0JCXsKLQkJCXBBZC0+Q2hlY2tEbWFCdXN5Q291bnQgPSAwOwotCQkJQXNpY1Jlc2V0RnJvbURNQUJ1c3kocEFkKTsKLQkJfQotCX0KLSNlbmRpZiAvKiBSVDI4NjAgKi8KLQlSVDI4WFhfTUxNRV9QUkVfU0FOSVRZX0NIRUNLKHBBZCk7CisJUlRNUF9NTE1FX1BSRV9TQU5JVFlfQ0hFQ0socEFkKTsKIAogCXsKLQkJLy8gRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24KKwkJLyogRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24gKi8KIAkJaWYgKE1PTklUT1JfT04ocEFkKSkKIAkJCXJldHVybjsKIAotCQlpZiAocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJiAweDEpCi0JCXsKLQkJCS8vIFRoaXMgaXMgdGhlIGZpeCBmb3Igd2lmaSAxMW4gZXh0ZW5zaW9uIGNoYW5uZWwgb3ZlcmxhcHBpbmcgdGVzdCBjYXNlLiAgZm9yIDI4NjBECisJCWlmIChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAmIDB4MSkgeworCQkJLyogVGhpcyBpcyB0aGUgZml4IGZvciB3aWZpIDExbiBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyB0ZXN0IGNhc2UuICBmb3IgMjg2MEQgKi8KIAkJCWlmICgoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPT0gMHgwMTAxKSAmJgotCQkJCShTVEFfVEdOX1dJRklfT04ocEFkKSkgJiYKLQkJCQkocEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iVG9nZ2xlID09IEZBTFNFKSkKLQotCQkJCXsKLQkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhPUF9DVFJMX0NGRywgMHgyNEJmKTsKLQkJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iVG9nZ2xlID0gVFJVRTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKFNUQV9UR05fV0lGSV9PTihwQWQpKSAmJgotCQkJCQkJKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpID09IDB4MDEwMSkpCi0JCQkJewotCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWE9QX0NUUkxfQ0ZHLCAweDI0M2YpOwotCQkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJUb2dnbGUgPSBGQUxTRTsKLQkJCQl9CisJCQkgICAgKFNUQV9UR05fV0lGSV9PTihwQWQpKSAmJgorCQkJICAgIChwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJUb2dnbGUgPT0gRkFMU0UpKQorCQkJeworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYT1BfQ1RSTF9DRkcsIDB4MjRCZik7CisJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iVG9nZ2xlID0gVFJVRTsKKwkJCX0gZWxzZSBpZiAoKFNUQV9UR05fV0lGSV9PTihwQWQpKSAmJgorCQkJCSAgICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA9PSAweDAxMDEpKSB7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhPUF9DVFJMX0NGRywgMHgyNDNmKTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJUb2dnbGUgPSBGQUxTRTsKKwkJCX0KIAkJfQogCX0KIAogCXBBZC0+YlVwZGF0ZUJjbkNudERvbmUgPSBGQUxTRTsKIAotLy8JUkVDQkFUaW1lclRpbWVvdXQoU3lzdGVtU3BlY2lmaWMxLEZ1bmN0aW9uQ29udGV4dCxTeXN0ZW1TcGVjaWZpYzIsU3lzdGVtU3BlY2lmaWMzKTsKLQlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCArKzsKKy8qICAgICAgUkVDQkFUaW1lclRpbWVvdXQoU3lzdGVtU3BlY2lmaWMxLEZ1bmN0aW9uQ29udGV4dCxTeXN0ZW1TcGVjaWZpYzIsU3lzdGVtU3BlY2lmaWMzKTsgKi8KKwlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCsrOwogCi0jaWZkZWYgUlQzMDcwCi0JLy8gZXhlY3V0ZSBldmVyeSAxMDBtcywgdXBkYXRlIHRoZSBUeCBGSUZPIENudCBmb3IgdXBkYXRlIFR4IFJhdGUuCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJLyogZXhlY3V0ZSBldmVyeSAxMDBtcywgdXBkYXRlIHRoZSBUeCBGSUZPIENudCBmb3IgdXBkYXRlIFR4IFJhdGUuICovCiAJTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKHBBZCk7Ci0jZW5kaWYgLy8gUlQzMDcwIC8vCi0JLy8gZXhlY3V0ZSBldmVyeSA1MDBtcwotCWlmICgocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJSA1ID09IDApICYmIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKHBBZCkvKihPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpKSovKQorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisJLyogZXhlY3V0ZSBldmVyeSA1MDBtcyAqLworCWlmICgocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJSA1ID09IDApCisJICAgICYmIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKHBBZCkKKwkgICAgLyooT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkgKi8gKQogCXsKLQkJLy8gcGVyZm9ybSBkeW5hbWljIHR4IHJhdGUgc3dpdGNoaW5nIGJhc2VkIG9uIHBhc3QgVFggaGlzdG9yeQorCQkvKiBwZXJmb3JtIGR5bmFtaWMgdHggcmF0ZSBzd2l0Y2hpbmcgYmFzZWQgb24gcGFzdCBUWCBoaXN0b3J5ICovCiAJCXsKLQkJCWlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCi0JCQkJCSkKLQkJCQkmJiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpKQorCQkJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcKKwkJCSAgICAgKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCisJCQkgICAgKQorCQkJICAgICYmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkpCiAJCQkJTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcocEFkKTsKIAkJfQogCX0KKwkvKiBOb3JtYWwgMSBzZWNvbmQgTWxtZSBQZXJpb2RpY0V4ZWMuICovCisJaWYgKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICUgTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgPT0gMCkgeworCQlwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCsrOwogCi0JLy8gTm9ybWFsIDEgc2Vjb25kIE1sbWUgUGVyaW9kaWNFeGVjLgotCWlmIChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgPT0gMCkKLQl7Ci0gICAgICAgICAgICAgICAgcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgKys7CisJCS8qT1JJQkFUaW1lclRpbWVvdXQocEFkKTsgKi8KIAotCQlpZiAocnhfVG90YWwpCi0JCXsKLQotCQkJLy8gcmVzZXQgY291bnRlcnMKLQkJCXJ4X0FNU0RVID0gMDsKLQkJCXJ4X1RvdGFsID0gMDsKLQkJfQotCi0JCS8vIE1lZGlhIHN0YXR1cyBjaGFuZ2VkLCByZXBvcnQgdG8gTkRJUwotCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX0NIQU5HRSkpCi0JCXsKKwkJLyogTWVkaWEgc3RhdHVzIGNoYW5nZWQsIHJlcG9ydCB0byBORElTICovCisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFKSkgewogCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UpOwotCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCXsKLQkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRworCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgeworCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0KKwkJCQkgICAgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CiAJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKIAotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCQl9IGVsc2UgeworCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0KKwkJCQkgICAgTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CiAJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKIAkJCX0KIAkJfQogCiAJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+TWxtZS5Ob3czMik7CiAKLQkJLy8gYWRkIHRoZSBtb3N0IHVwLXRvLWRhdGUgaC93IHJhdyBjb3VudGVycyBpbnRvIHNvZnR3YXJlIHZhcmlhYmxlLCBzbyB0aGF0Ci0JCS8vIHRoZSBkeW5hbWljIHR1bmluZyBtZWNoYW5pc20gYmVsb3cgYXJlIGJhc2VkIG9uIG1vc3QgdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbgorCQkvKiBhZGQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBoL3cgcmF3IGNvdW50ZXJzIGludG8gc29mdHdhcmUgdmFyaWFibGUsIHNvIHRoYXQgKi8KKwkJLyogdGhlIGR5bmFtaWMgdHVuaW5nIG1lY2hhbmlzbSBiZWxvdyBhcmUgYmFzZWQgb24gbW9zdCB1cC10by1kYXRlIGluZm9ybWF0aW9uICovCiAJCU5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCk7CiAKLSNpZmRlZiBSVDI4NzAKLQkJUlQyODcwX1dhdGNoRG9nKHBBZCk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJCVJUVVNCV2F0Y2hEb2cocEFkKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotICAgCQkvLyBOZWVkIHN0YXRpc3RpY3MgYWZ0ZXIgcmVhZCBjb3VudGVyLiBTbyBwdXQgYWZ0ZXIgTklDVXBkYXRlUmF3Q291bnRlcnMKKwkJLyogTmVlZCBzdGF0aXN0aWNzIGFmdGVyIHJlYWQgY291bnRlci4gU28gcHV0IGFmdGVyIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzICovCiAJCU9SSUJBVGltZXJUaW1lb3V0KHBBZCk7CiAKLQkJLy8gVGhlIHRpbWUgcGVyaW9kIGZvciBjaGVja2luZyBhbnRlbm5hIGlzIGFjY29yZGluZyB0byB0cmFmZmljCi0JCWlmIChwQWQtPk1sbWUuYkVuYWJsZUF1dG9BbnRlbm5hQ2hlY2spCi0JCXsKLQkJCVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKwotCQkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKLQkJCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKwkJLyogaWYgTUdNVCBSSU5HIGlzIGZ1bGwgbW9yZSB0aGFuIHR3aWNlIHdpdGhpbiAxIHNlY29uZCwgd2UgY29uc2lkZXIgdGhlcmUncyAqLworCQkvKiBhIGhhcmR3YXJlIHByb2JsZW0gc3R1Y2tpbmcgdGhlIFRYIHBhdGguIEluIHRoaXMgY2FzZSwgdHJ5IGEgaGFyZHdhcmUgcmVzZXQgKi8KKwkJLyogdG8gcmVjb3ZlciB0aGUgc3lzdGVtICovCisJCS8qICAgICAgaWYgKHBBZC0+UmFsaW5rQ291bnRlcnMuTWdtdFJpbmdGdWxsQ291bnQgPj0gMikgKi8KKwkJLyogICAgICAgICAgICAgIFJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBUkRXQVJFX0VSUk9SKTsgKi8KKwkJLyogICAgICBlbHNlICovCisJCS8qICAgICAgICAgICAgICBwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50ID0gMDsgKi8KIAotCQkJLy8gZHluYW1pYyBhZGp1c3QgYW50ZW5uYSBldmFsdWF0aW9uIHBlcmlvZCBhY2NvcmRpbmcgdG8gdGhlIHRyYWZmaWMKLQkJCWlmIChUeFRvdGFsQ250ID4gNTApCi0JCQl7Ci0JCQkJaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMTAgPT0gMCkKLQkJCQl7Ci0JCQkJCUFzaWNFdmFsdWF0ZVJ4QW50KHBBZCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDMgPT0gMCkKLQkJCQl7Ci0JCQkJCUFzaWNFdmFsdWF0ZVJ4QW50KHBBZCk7CisJCS8qIFRoZSB0aW1lIHBlcmlvZCBmb3IgY2hlY2tpbmcgYW50ZW5uYSBpcyBhY2NvcmRpbmcgdG8gdHJhZmZpYyAqLworCQl7CisJCQlpZiAocEFkLT5NbG1lLmJFbmFibGVBdXRvQW50ZW5uYUNoZWNrKSB7CisJCQkJVHhUb3RhbENudCA9CisJCQkJICAgIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJICAgIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCSAgICBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OworCisJCQkJLyogZHluYW1pYyBhZGp1c3QgYW50ZW5uYSBldmFsdWF0aW9uIHBlcmlvZCBhY2NvcmRpbmcgdG8gdGhlIHRyYWZmaWMgKi8KKwkJCQlpZiAoVHhUb3RhbENudCA+IDUwKSB7CisJCQkJCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlCisJCQkJCSAgICAxMCA9PSAwKSB7CisJCQkJCQlBc2ljRXZhbHVhdGVSeEFudChwQWQpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMyA9PQorCQkJCQkgICAgMCkgeworCQkJCQkJQXNpY0V2YWx1YXRlUnhBbnQocEFkKTsKKwkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfQpAQCAtOTk5LDM4MiArODc5LDQwIEBACiAJCU1sbWVSZXNldFJhbGlua0NvdW50ZXJzKHBBZCk7CiAKIAkJewotI2lmZGVmIFJUMjg2MAotCQkJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkgJiYgKHBBZC0+YlBDSWNsa09mZiA9PSBGQUxTRSkpCi0jZW5kaWYKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpCisJCQkgICAgJiYgKHBBZC0+YlBDSWNsa09mZiA9PSBGQUxTRSkpCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAJCQl7Ci0JCQkJLy8gV2hlbiBBZGhvYyBiZWFjb24gaXMgZW5hYmxlZCBhbmQgUlRTL0NUUyBpcyBlbmFibGVkLCB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IGhhcmR3YXJlIE1BQyBGU00gd2lsbCBydW4gaW50byBhIGRlYWRsb2NrCi0JCQkJLy8gYW5kIHNlbmRpbmcgQ1RTLXRvLXNlbGYgb3ZlciBhbmQgb3Zlci4KLQkJCQkvLyBTb2Z0d2FyZSBQYXRjaCBTb2x1dGlvbjoKLQkJCQkvLyAxLiBQb2xsaW5nIGRlYnVnIHN0YXRlIHJlZ2lzdGVyIDB4MTBGNCBldmVyeSBvbmUgc2Vjb25kLgotCQkJCS8vIDIuIElmIGluIDB4MTBGNCB0aGUgKChiaXQyOT09MSkgJiYgKGJpdDc9PTEpKSBPUiAoKGJpdDI5PT0xKSAmJiAoYml0NT09MSkpLCBpdCBtZWFucyB0aGUgZGVhZGxvY2sgaGFzIG9jY3VycmVkLgotCQkJCS8vIDMuIElmIHRoZSBkZWFkbG9jayBvY2N1cnJlZCwgcmVzZXQgTUFDL0JCUCBieSBzZXR0aW5nIDB4MTAwNCB0byAweDAwMDEgZm9yIGEgd2hpbGUgdGhlbiBzZXR0aW5nIGl0IGJhY2sgdG8gMHgwMDBDIGFnYWluLgorCQkJCS8qIFdoZW4gQWRob2MgYmVhY29uIGlzIGVuYWJsZWQgYW5kIFJUUy9DVFMgaXMgZW5hYmxlZCwgdGhlcmUgaXMgYSBjaGFuY2UgdGhhdCBoYXJkd2FyZSBNQUMgRlNNIHdpbGwgcnVuIGludG8gYSBkZWFkbG9jayAqLworCQkJCS8qIGFuZCBzZW5kaW5nIENUUy10by1zZWxmIG92ZXIgYW5kIG92ZXIuICovCisJCQkJLyogU29mdHdhcmUgUGF0Y2ggU29sdXRpb246ICovCisJCQkJLyogMS4gUG9sbGluZyBkZWJ1ZyBzdGF0ZSByZWdpc3RlciAweDEwRjQgZXZlcnkgb25lIHNlY29uZC4gKi8KKwkJCQkvKiAyLiBJZiBpbiAweDEwRjQgdGhlICgoYml0Mjk9PTEpICYmIChiaXQ3PT0xKSkgT1IgKChiaXQyOT09MSkgJiYgKGJpdDU9PTEpKSwgaXQgbWVhbnMgdGhlIGRlYWRsb2NrIGhhcyBvY2N1cnJlZC4gKi8KKwkJCQkvKiAzLiBJZiB0aGUgZGVhZGxvY2sgb2NjdXJyZWQsIHJlc2V0IE1BQy9CQlAgYnkgc2V0dGluZyAweDEwMDQgdG8gMHgwMDAxIGZvciBhIHdoaWxlIHRoZW4gc2V0dGluZyBpdCBiYWNrIHRvIDB4MDAwQyBhZ2Fpbi4gKi8KIAotCQkJCVVJTlQzMglNYWNSZWcgPSAwOworCQkJCXUzMiBNYWNSZWcgPSAwOwogCiAJCQkJUlRNUF9JT19SRUFEMzIocEFkLCAweDEwRjQsICZNYWNSZWcpOwotCQkJCWlmICgoKE1hY1JlZyAmIDB4MjAwMDAwMDApICYmIChNYWNSZWcgJiAweDgwKSkgfHwgKChNYWNSZWcgJiAweDIwMDAwMDAwKSAmJiAoTWFjUmVnICYgMHgyMCkpKQotCQkJCXsKKwkJCQlpZiAoKChNYWNSZWcgJiAweDIwMDAwMDAwKSAmJiAoTWFjUmVnICYgMHg4MCkpCisJCQkJICAgIHx8ICgoTWFjUmVnICYgMHgyMDAwMDAwMCkKKwkJCQkJJiYgKE1hY1JlZyAmIDB4MjApKSkgewogCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MSk7CiAJCQkJCVJUTVB1c2VjRGVsYXkoMSk7CiAJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHhDKTsKIAotCQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiV2FybmluZywgTUFDIHNwZWNpZmljIGNvbmRpdGlvbiBvY2N1cnMgXG4iKSk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkJCQkgKCJXYXJuaW5nLCBNQUMgc3BlY2lmaWMgY29uZGl0aW9uIG9jY3VycyBcbiIpKTsKIAkJCQl9CiAJCQl9CiAJCX0KIAotCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7CiAJfQogCiAJcEFkLT5iVXBkYXRlQmNuQ250RG9uZSA9IEZBTFNFOwogfQogCi1WT0lEIFNUQU1sbWVQZXJpb2RpY0V4ZWMoCi0JUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0jaWZkZWYgUlQyODYwCi0JVUxPTkcJCQkgICAgVHhUb3RhbENudDsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCVVMT05HCVR4VG90YWxDbnQ7Ci0JaW50IAlpOwotI2VuZGlmCi0KLSAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCi0gICAgewotICAgIAkvLyBXUEEgTUlDIGVycm9yIHNob3VsZCBibG9jayBhc3NvY2lhdGlvbiBhdHRlbXB0IGZvciA2MCBzZWNvbmRzCi0gICAgCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyAmJiAocEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSArICg2MCAqIE9TX0haKSA8IHBBZC0+TWxtZS5Ob3czMikpCi0gICAgCQlwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9IEZBTFNFOwotICAgIH0KLQotI2lmZGVmIFJUMjg2MAotCS8vQmFyb24gMjAwOC8wNy8xMAotCS8vcHJpbnRrKCJCYXJvbl9UZXN0Olx0JXMiLCBSVE1QR2V0UmFsaW5rRW5jcnlNb2RlU3RyKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykpOwotCS8vSWYgdGhlIFNUQSBzZWN1cml0eSBzZXR0aW5nIGlzIE9QRU4gb3IgV0VQLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSAwLgotCS8vSWYgdGhlIFNUQSBzZWN1cml0eSBzZXR0aW5nIGlzIFdQQVBTSyBvciBXUEEyUFNLLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSAxLgotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1czwyKQotCXsKLQkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gMDsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gMTsKLQl9Ci0jZW5kaWYKLQotICAgIGlmICgocEFkLT5QcmVNZWRpYVN0YXRlICE9IHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlKSAmJiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpKQotCXsKLQkJaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQotCQl7Ci0JCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7Ci0JCX0KLQkJcEFkLT5QcmVNZWRpYVN0YXRlID0gcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGU7Ci0JfQotCi0jaWZkZWYgUlQyODYwCi0JaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAoSURMRV9PTihwQWQpKSAmJgotICAgICAgICAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKSAmJgotCQkocEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9PSBTWU5DX0lETEUpICYmCi0JCShwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkgJiYKLQkJKFJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKSkgJiYKLQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkKLQl7Ci0JCVJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIEdVSV9JRExFX1BPV0VSX1NBVkUsIDApOwotCX0KLSNlbmRpZgotCi0KLQotICAgCUFzaWNTdGFCYnBUdW5pbmcocEFkKTsKLQotCVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKwotCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCi0JCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OwotCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQl7Ci0JCS8vIHVwZGF0ZSBjaGFubmVsIHF1YWxpdHkgZm9yIFJvYW1pbmcgYW5kIFVJIExpbmtRdWFsaXR5IGRpc3BsYXkKLQkJTWxtZUNhbGN1bGF0ZUNoYW5uZWxRdWFsaXR5KHBBZCwgcEFkLT5NbG1lLk5vdzMyKTsKLQl9Ci0KLQkvLyBtdXN0IGJlIEFGVEVSIE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKCkgYmVjYXVzZSBpdCBuZWVkcyB0byBrbm93IGlmCi0JLy8gUmFkaW8gaXMgY3VycmVudGx5IGluIG5vaXN5IGVudmlyb25tZW50Ci0JaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotCQlBc2ljQWRqdXN0VHhQb3dlcihwQWQpOwotCi0JaWYgKElORlJBX09OKHBBZCkpCi0JewotCQkvLyBJcyBQU00gYml0IGNvbnNpc3RlbnQgd2l0aCB1c2VyIHBvd2VyIG1hbmFnZW1lbnQgcG9saWN5PwotCQkvLyBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIHRoYXQgd2lsbCBzZXQgUFNNIGJpdCBPTi4KLQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotCQlNbG1lQ2hlY2tQc21DaGFuZ2UocEFkLCBwQWQtPk1sbWUuTm93MzIpOwotCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1RvdGFsVHhDb3VudCA9IFR4VG90YWxDbnQ7Ci0KLQkJaWYgKChwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lICsgMSpPU19IWiA8IHBBZC0+TWxtZS5Ob3czMikgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgJiYKLQkJCSgoVHhUb3RhbENudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudCA8IDYwMCkpKQotCQl7Ci0JCQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgQldfMjApOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBObyBCRUFDT04uIHJlc3RvcmUgUjY2IHRvIHRoZSBsb3cgYm91bmQoJWQpIFxuIiwgKDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKSkpKTsKLQkJfQotCi0gICAgICAgIHsKLSAgICAJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUpCi0gICAgCQl7Ci0gICAgCQkgICAgLy8gV2hlbiBBUFNEIGlzIGVuYWJsZWQsIHRoZSBwZXJpb2QgY2hhbmdlcyBhcyAyMCBzZWMKLSAgICAJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMjApID09IDgpCi0gICAgCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBUUlVFKTsKLSAgICAJCX0KLSAgICAJCWVsc2UKLSAgICAJCXsKLSAgICAJCSAgICAvLyBTZW5kIG91dCBhIE5VTEwgZnJhbWUgZXZlcnkgMTAgc2VjIHRvIGluZm9ybSBBUCB0aGF0IFNUQSBpcyBzdGlsbCBhbGl2ZSAoQXZvaWQgYmVpbmcgYWdlIG91dCkKLSAgICAJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMTApID09IDgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpCi0gICAgCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLQkJCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBGQUxTRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgIAkJfQotICAgICAgICB9Ci0KLQkJaWYgKENRSV9JU19ERUFEKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSkpCi0JCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIE5vIEJFQUNPTi4gRGVhZCBDUUkuIEF1dG8gUmVjb3ZlcnkgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50KSk7Ci0JCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQUmVwb3J0RmxhZyA9IFRSVUU7Ci0JCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQTGlua0Rvd25UaW1lID0gcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZTsKLQotCQkJLy8gTG9zdCBBUCwgc2VuZCBkaXNjb25uZWN0ICYgbGluayBkb3duIGV2ZW50Ci0JCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKLQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKLSAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwotICAgICAgICAgICAgfQotCi0JCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7Ci0JCX0KLQkJZWxzZSBpZiAoQ1FJX0lTX0JBRChwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkpKQotCQl7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50ICsrOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBCYWQgQ1FJLiBBdXRvIFJlY292ZXJ5IGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCkpOwotCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOwotCQl9Ci0KLQkJLy8gQWRkIGF1dG8gc2VhbWxlc3Mgcm9hbWluZwotCQlpZiAocEFkLT5TdGFDZmcuYkZhc3RSb2FtaW5nKQotCQl7Ci0JCQlTSE9SVAlkQm1Ub1JvYW0gPSAoU0hPUlQpcEFkLT5TdGFDZmcuZEJtVG9Sb2FtOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSc3NpPSVkLCBkQm1Ub1JvYW09JWRcbiIsIFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiksIChDSEFSKWRCbVRvUm9hbSkpOwotCi0JCQlpZiAoUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSA8PSAoQ0hBUilkQm1Ub1JvYW0pCi0JCQl7Ci0JCQkJTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcocEFkLCBwQWQtPk1sbWUuTm93MzIpOwotCQkJfQotCQl9Ci0JfQotCWVsc2UgaWYgKEFESE9DX09OKHBBZCkpCi0JewotI2lmZGVmIFJUMjg2MAotCQkvLyAyMDAzLTA0LTE3IGpvaG4uIHRoaXMgaXMgYSBwYXRjaCB0aGF0IGRyaXZlciBmb3JjZXMgYSBCRUFDT04gb3V0IGlmIEFTSUMgZmFpbHMKLQkJLy8gdGhlICJUWCBCRUFDT04gY29tcGV0aXRpb24iIGZvciB0aGUgZW50aXJlIHBhc3QgMSBzZWMuCi0JCS8vIFNvIHRoYXQgZXZlbiB3aGVuIEFTSUMncyBCRUFDT05nZW4gZW5naW5lIGJlZW4gYmxvY2tlZAotCQkvLyBieSBwZWVyJ3MgQkVBQ09OIGR1ZSB0byBzbG93ZXIgc3lzdGVtIGNsb2NrLCB0aGlzIFNUQSBzdGlsbCBjYW4gc2VuZCBvdXQKLQkJLy8gbWluaW11bSBCRUFDT04gdG8gdGVsbCB0aGUgcGVlciBJJ20gYWxpdmUuCi0JCS8vIGRyYXdiYWNrIGlzIHRoYXQgdGhpcyBCRUFDT04gd29uJ3QgYmUgd2VsbCBhbGlnbmVkIGF0IFRCVFQgYm91bmRhcnkuCi0JCS8vIEVucXVldWVCZWFjb25GcmFtZShwQWQpOwkJCSAgLy8gc29mdHdhcmUgc2VuZCBCRUFDT04KLQotCQkvLyBpZiBhbGwgMTFiIHBlZXJzIGxlYXZlIHRoaXMgQlNTIG1vcmUgdGhhbiA1IHNlY29uZHMsIHVwZGF0ZSBUeCByYXRlLAotCQkvLyByZXN0b3JlIG91dGdvaW5nIEJFQUNPTiB0byBzdXBwb3J0IEIvRy1taXhlZCBtb2RlCi0JCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkJCQkgICAmJgotCQkJKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA8PSBSQVRFXzExKQkgICAmJgotCQkJKHBBZC0+Q29tbW9uQ2ZnLk1heERlc2lyZWRSYXRlID4gUkFURV8xMSkgICYmCi0JCQkoKHBBZC0+U3RhQ2ZnLkxhc3QxMWJCZWFjb25SeFRpbWUgKyA1Kk9TX0haKSA8IHBBZC0+TWxtZS5Ob3czMikpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gbGFzdCAxMUIgcGVlciBsZWZ0LCB1cGRhdGUgVHggcmF0ZXNcbiIpKTsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLQkJCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOwotCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7Ci0JCQlNYWtlSWJzc0JlYWNvbihwQWQpOwkJLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCi0JCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsJLy8gY29weSB0byBvbi1jaGlwIG1lbW9yeQotCQkJcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCA9IEZBTFNFOwotCQl9Ci0KLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKLQkJewotCQkJaWYgKChwQWQtPlN0YUNmZy5BZGhvY0JHSm9pbmVkKSAmJgotCQkJCSgocEFkLT5TdGFDZmcuTGFzdDExZ0JlYWNvblJ4VGltZSArIDUgKiBPU19IWikgPCBwQWQtPk1sbWUuTm93MzIpKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gbGFzdCAxMUcgcGVlciBsZWZ0XG4iKSk7Ci0JCQkJcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCA9IEZBTFNFOwotCQkJfQotCi0JCQlpZiAoKHBBZC0+U3RhQ2ZnLkFkaG9jMjBOSm9pbmVkKSAmJgotCQkJCSgocEFkLT5TdGFDZmcuTGFzdDIwTkJlYWNvblJ4VGltZSArIDUgKiBPU19IWikgPCBwQWQtPk1sbWUuTm93MzIpKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gbGFzdCAyME1IeiBOIHBlZXIgbGVmdFxuIikpOwotCQkJCXBBZC0+U3RhQ2ZnLkFkaG9jMjBOSm9pbmVkID0gRkFMU0U7Ci0JCQl9Ci0JCX0KLSNlbmRpZiAvKiBSVDI4NjAgKi8KLQotCQkvL3JhZGFyIGRldGVjdAotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLQkJCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQotCQkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKLQkJewotCQkJUmFkYXJEZXRlY3RQZXJpb2RpYyhwQWQpOwotCQl9Ci0KLQkJLy8gSWYgYWxsIHBlZXJzIGxlYXZlLCBhbmQgdGhpcyBTVEEgYmVjb21lcyB0aGUgbGFzdCBvbmUgaW4gdGhpcyBJQlNTLCB0aGVuIGNoYW5nZSBNZWRpYVN0YXRlCi0JCS8vIHRvIERJU0NPTk5FQ1RFRC4gQnV0IHN0aWxsIGhvbGRpbmcgdGhpcyBJQlNTIChpLmUuIHNlbmRpbmcgQkVBQ09OKSBzbyB0aGF0IG90aGVyIFNUQXMgY2FuCi0JCS8vIGpvaW4gbGF0ZXIuCi0JCWlmICgocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIEFESE9DX0JFQUNPTl9MT1NUX1RJTUUgPCBwQWQtPk1sbWUuTm93MzIpICYmCi0JCQlPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JCXsKLQkJCU1MTUVfU1RBUlRfUkVRX1NUUlVDVCAgICAgU3RhcnRSZXE7Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gZXhjZXNzaXZlIEJFQUNPTiBsb3N0LCBsYXN0IFNUQSBpbiB0aGlzIElCU1MsIE1lZGlhU3RhdGU9RGlzY29ubmVjdGVkXG4iKSk7Ci0JCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKLQotCQkJU3RhcnRQYXJtRmlsbChwQWQsICZTdGFydFJlcSwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOwotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9TVEFSVDsKLQkJfQotCi0jaWZkZWYgUlQyODcwCi0JCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCQl7Ci0JCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOwotCi0JCQlpZiAocEVudHJ5LT5WYWxpZEFzQ0xJID09IEZBTFNFKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAocEVudHJ5LT5MYXN0QmVhY29uUnhUaW1lICsgQURIT0NfQkVBQ09OX0xPU1RfVElNRSA8IHBBZC0+TWxtZS5Ob3czMikKLQkJCQlNYWNUYWJsZURlbGV0ZUVudHJ5KHBBZCwgcEVudHJ5LT5BaWQsIHBFbnRyeS0+QWRkcik7Ci0JCX0KLSNlbmRpZgotCX0KLQllbHNlIC8vIG5vIElORlJBIG5vciBBREhPQyBjb25uZWN0aW9uCi0JewotCi0JCWlmIChwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJICYmCi0gICAgICAgICAgICAoKHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArIDMwICogT1NfSFopID4gcEFkLT5NbG1lLk5vdzMyKSkKLQkJCWdvdG8gU0tJUF9BVVRPX1NDQU5fQ09OTjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOwotCi0JCWlmICgocEFkLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPT0gVFJVRSkKLQkJCSYmIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkKLQkJCSYmIChNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSA9PSBUUlVFKSkKLQkJewotCQkJaWYgKChwQWQtPlNjYW5UYWIuQnNzTnI9PTApICYmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkpCi0JCQl7Ci0JCQkJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJICAgU2NhblJlcTsKLQotCQkJCWlmICgocEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lICsgMTAgKiBPU19IWikgPCBwQWQtPk1sbWUuTm93MzIpCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTVEFNbG1lUGVyaW9kaWNFeGVjKCk6Q05UTCAtIFNjYW5UYWIuQnNzTnI9PTAsIHN0YXJ0IGEgbmV3IEFDVElWRSBzY2FuIFNTSURbJXNdXG4iLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQpKTsKLQkJCQkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuLCBCU1NfQU5ZLCBTQ0FOX0FDVElWRSk7Ci0JCQkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOwotCQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47Ci0JCQkJCS8vIFJlc2V0IE1pc3NlZCBzY2FuIG51bWJlcgotCQkJCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBwQWQtPk1sbWUuTm93MzI7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQkvLyBRdWl0IHRoZSBmb3JldmVyIHNjYW4gd2hlbiBpbiBhIHZlcnkgY2xlYW4gcm9vbQotCQkJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKLQkJCXsKLQkJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNykgPT0gMCkKLQkJCQl7Ci0JCQkJCU1sbWVBdXRvU2NhbihwQWQpOwotCQkJCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBwQWQtPk1sbWUuTm93MzI7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi1TS0lQX0FVVE9fU0NBTl9DT05OOgotCi0gICAgaWYgKChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlRYQkFiaXRtYXAgIT0wKSAmJiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9PSBGQUxTRSkpCi0JewotCQlwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID0gVFJVRTsKLQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9GT1JDRVJUU0NUUywgIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKLQl9Ci0JZWxzZSBpZiAoKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uVFhCQWJpdG1hcCA9PTApICYmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID09IFRSVUUpKQotCXsKLQkJcEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9IEZBTFNFOwotCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsICBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBGQUxTRSk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vLyBMaW5rIGRvd24gcmVwb3J0Ci1WT0lEIExpbmtEb3duRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0KLQlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7Ci0KLQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOwotCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0gICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKLX0KLQotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIE1sbWVBdXRvU2NhbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAotCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gRHJpdmVyIGF1dG8gc2NhblxuIikpOwotCQlNbG1lRW5xdWV1ZShwQWQsCi0JCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotCQkJCQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKLQkJCQkJMCwKLQkJCQkJTlVMTCk7Ci0JCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKLQl9Ci19Ci0KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCi0KLQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAotCWlmICgocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpICYmCi0JCShNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSA9PSBUUlVFKSkKLQl7Ci0JCU5ESVNfODAyXzExX1NTSUQgT2lkU3NpZDsKLQkJT2lkU3NpZC5Tc2lkTGVuZ3RoID0gcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuOwotCQlOZGlzTW92ZU1lbW9yeShPaWRTc2lkLlNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEcml2ZXIgYXV0byByZWNvbm5lY3QgdG8gbGFzdCBPSURfODAyXzExX1NTSUQgc2V0dGluZyAtICVzLCBsZW4gLSAlZFxuIiwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pKTsKLQkJTWxtZUVucXVldWUocEFkLAotCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLQkJCQkJT0lEXzgwMl8xMV9TU0lELAotCQkJCQlzaXplb2YoTkRJU184MDJfMTFfU1NJRCksCi0JCQkJCSZPaWRTc2lkKTsKLQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOwotCX0KLX0KLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCVZhbGlkYXRlIFNTSUQgZm9yIGNvbm5lY3Rpb24gdHJ5IGFuZCByZXNjYW4gcHVycG9zZQpAQCAtMTM4MywzOCArOTIxLDMxIEBACiAJSVJRTCA9IERJU1BBVENIX0xFVkVMCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotQk9PTEVBTiBNbG1lVmFsaWRhdGVTU0lEKAotCUlOIFBVQ0hBUglwU3NpZCwKLQlJTiBVQ0hBUglTc2lkTGVuKQorQk9PTEVBTiBNbG1lVmFsaWRhdGVTU0lEKHU4ICpwU3NpZCwgdTggU3NpZExlbikKIHsKLQlpbnQJaW5kZXg7CisJaW50IGluZGV4OwogCiAJaWYgKFNzaWRMZW4gPiBNQVhfTEVOX09GX1NTSUQpCiAJCXJldHVybiAoRkFMU0UpOwogCi0JLy8gQ2hlY2sgZWFjaCBjaGFyYWN0ZXIgdmFsdWUKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTc2lkTGVuOyBpbmRleCsrKQotCXsKKwkvKiBDaGVjayBlYWNoIGNoYXJhY3RlciB2YWx1ZSAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNzaWRMZW47IGluZGV4KyspIHsKIAkJaWYgKHBTc2lkW2luZGV4XSA8IDB4MjApCiAJCQlyZXR1cm4gKEZBTFNFKTsKIAl9CiAKLQkvLyBBbGwgY2hlY2tlZAorCS8qIEFsbCBjaGVja2VkICovCiAJcmV0dXJuIChUUlVFKTsKIH0KIAotVk9JRCBNbG1lU2VsZWN0VHhSYXRlVGFibGUoCi0JSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKLQlJTiBQVUNIQVIJCQkJKnBwVGFibGUsCi0JSU4gUFVDSEFSCQkJCXBUYWJsZVNpemUsCi0JSU4gUFVDSEFSCQkJCXBJbml0VHhSYXRlSWR4KQordm9pZCBNbG1lU2VsZWN0VHhSYXRlVGFibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkJICAgdTggKiogcHBUYWJsZSwKKwkJCSAgIHU4ICpwVGFibGVTaXplLCB1OCAqcEluaXRUeFJhdGVJZHgpCiB7Ci0JZG8KLQl7Ci0JCS8vIGRlY2lkZSB0aGUgcmF0ZSB0YWJsZSBmb3IgdHVuaW5nCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGVUYWJsZVNpemUgPiAwKQotCQl7CisJZG8geworCQkvKiBkZWNpZGUgdGhlIHJhdGUgdGFibGUgZm9yIHR1bmluZyAqLworCQlpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlVGFibGVTaXplID4gMCkgewogCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGU7CiAJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZVswXTsKIAkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZVsxXTsKQEAgLTE0MjIsODQgKzk1Myw0MCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIEFESE9DX09OKHBBZCkpCi0JCXsKLQkJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSAmJgotI2lmZGVmIFJUMjg2MAotCQkJCSFwQWQtPlN0YUNmZy5BZGhvY0JPbmx5Sm9pbmVkICYmCi0JCQkJIXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgJiYKLQkJCQkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKLQkJCQkoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpKSkKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkJCShwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKLQkJCQkoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSkpCi0jZW5kaWYKLQkJCXsvLyAxMU4gMVMgQWRob2MKKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiBBREhPQ19PTihwQWQpKSB7CisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSkpIHsJLyogMTFOIDFTIEFkaG9jICovCiAJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4xUzsKIAkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOwogCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzFdOwogCi0JCQl9Ci0JCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSAmJgotI2lmZGVmIFJUMjg2MAotCQkJCQkhcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCAmJgotCQkJCQkhcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCAmJgotCQkJCQkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKLQkJCQkJKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4ZmYpICYmCi0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgotCQkJCQkocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmCi0jZW5kaWYKLQkJCQkJKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCi0JCQl7Ly8gMTFOIDJTIEFkaG9jCi0JCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKLQkJCQl7CisJCQl9IGVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweGZmKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkgewkvKiAxMU4gMlMgQWRob2MgKi8KKwkJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KSB7CiAJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlM7CiAJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMF07Ci0JCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzFdOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJeworCQkJCQkqcEluaXRUeFJhdGVJZHggPQorCQkJCQkgICAgUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07CisJCQkJfSBlbHNlIHsKIAkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kOwotCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMF07Ci0JCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMV07CisJCQkJCSpwVGFibGVTaXplID0KKwkJCQkJICAgIFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9CisJCQkJCSAgICBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOwogCQkJCX0KIAotCQkJfQotCQkJZWxzZQotI2lmZGVmIFJUMjg2MAotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCi0JCQl7CisJCQl9IGVsc2UgaWYgKChwRW50cnktPlJhdGVMZW4gPT0gNCkKKwkJCQkgICAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApCisJCQkJICAgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKQorCQkJICAgICkgewogCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCOwogCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzBdOwogCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQlsxXTsKIAotCQkJfQotCSAgICAgICAgZWxzZSBpZigocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KSAmJiAocEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCA9PSBUUlVFKSkKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkJCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDQpCi0JCQkJCSYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKQotCQkJCQkpCi0jZW5kaWYKLQkJCXsKLQkJCQkvLyBVU2UgQiBUYWJsZSB3aGVuIE9ubHkgYi1vbmx5IFN0YXRpb24gaW4gbXkgSUJTUyAuCi0JCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUI7Ci0JCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJbMF07Ci0JCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzFdOwotCi0JCQl9Ci0JCQllbHNlIGlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCi0JCQl7CisJCQl9IGVsc2UgaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkgewogCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCRzsKIAkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMF07CiAJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1sxXTsKIAotCQkJfQotCQkJZWxzZQotCQkJeworCQkJfSBlbHNlIHsKIAkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExRzsKIAkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExR1swXTsKIAkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUdbMV07CkBAIC0xNTA3LDkxICs5OTQsODIgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQl9Ci0KLQkJaWYgKChwRW50cnktPlJhdGVMZW4gPT0gMTIpICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKLQkJCSgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKSkpCi0JCXsvLyAxMUJHTiAxUyBBUAorCQkvKmlmICgocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiArIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPT0gMTIpICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAweGZmKSAmJiAqLworCQkvKiAgICAgICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkpKSAqLworCQlpZiAoKChwRW50cnktPlJhdGVMZW4gPT0gMTIpIHx8IChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkpKSB7CS8qIDExQkdOIDFTIEFQICovCiAJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVM7CiAJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbMF07CiAJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHTjFTWzFdOwogCiAJCQlicmVhazsKIAkJfQotCi0JCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDEyKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmCi0JCQkocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSkKLQkJey8vIDExQkdOIDJTIEFQCi0JCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQotCQkJeworCQkvKmVsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9PSAxMikgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDB4ZmYpICYmICovCisJCS8qICAgICAgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKSAqLworCQlpZiAoKChwRW50cnktPlJhdGVMZW4gPT0gMTIpIHx8IChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSkgewkvKiAxMUJHTiAyUyBBUCAqLworCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkgewogCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yUzsKIAkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbMF07CiAJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1sxXTsKIAotCQkJfQotCQkJZWxzZQotCQkJeworCQkJfSBlbHNlIHsKIAkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZDsKIAkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZFswXTsKLQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbMV07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0KKwkJCQkgICAgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kWzFdOwogCiAJCQl9CiAJCQlicmVhazsKIAkJfQotCi0JCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKSkpCi0JCXsvLyAxMU4gMVMgQVAKKwkJLyplbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSkpICovCisJCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKSkpIHsJLyogMTFOIDFTIEFQICovCiAJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOwogCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4xU1swXTsKIAkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzFdOwogCiAJCQlicmVhazsKIAkJfQotCi0JCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHhmZikgJiYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDIpKQotCQl7Ly8gMTFOIDJTIEFQCi0JCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQotCQkJewotCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yUzsKLQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMF07Ci0JCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU1sxXTsKLSAgICAgICAgICAgIH0KLQkJCWVsc2UKLQkJCXsKKwkJLyplbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKSAqLworCQlpZiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSkgewkvKiAxMU4gMlMgQVAgKi8KKwkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpIHsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMF07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07CisJCQl9IGVsc2UgewogCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZDsKIAkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMF07Ci0JCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFsxXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPQorCQkJCSAgICBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOwogCQkJfQogCiAJCQlicmVhazsKIAkJfQotCi0JCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPT0gNCkgJiYgKHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKLQkJaWYgKHBFbnRyeS0+UmF0ZUxlbiA9PSA0KQotCQl7Ly8gQiBvbmx5IEFQCisJCS8qZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPT0gNCkgJiYgKHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkgKi8KKwkJaWYgKChwRW50cnktPlJhdGVMZW4gPT0gNCB8fCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCisJCSAgICAvKkl2ZXJzb24gbWFyayBmb3IgQWRob2MgYiBtb2RlLHN0YSB3aWxsIHVzZSByYXRlIDU0ICBNYnBzIHdoZW4gY29ubmVjdCB3aXRoIHN0YSBiL2cvbiBtb2RlICovCisJCSAgICAvKiAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkgKi8KKwkJICAgICkgewkJLyogQiBvbmx5IEFQICovCiAJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQjsKIAkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzBdOwogCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzFdOwogCiAJCQlicmVhazsKIAkJfQotCi0JCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID4gOCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKKwkJLyplbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiArIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPiA4KSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDApKSAqLwogCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA+IDgpCi0JCQkmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkKLQkJCSkKLQkJey8vIEIvRyAgbWl4ZWQgQVAKKwkJICAgICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkKKwkJICAgICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkKKwkJICAgICkgewkJLyogQi9HICBtaXhlZCBBUCAqLwogCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHOwogCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHWzBdOwogCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1sxXTsKIAogCQkJYnJlYWs7CiAJCX0KLQotCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9PSA4KSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDApKQorCQkvKmVsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9PSA4KSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDApKSAqLwogCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA9PSA4KQotCQkJJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApCi0JCQkpCi0JCXsvLyBHIG9ubHkgQVAKKwkJICAgICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkKKwkJICAgICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkKKwkJICAgICkgewkJLyogRyBvbmx5IEFQICovCiAJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExRzsKIAkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzBdOwogCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzFdOwpAQCAtMTYwMCw3MCArMTA3OCw0OTYgQEAKIAkJfQogCiAJCXsKLQkJCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKLQkJCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkpCi0JCQl7CS8vIExlZ2FjeSBtb2RlCi0JCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA8PSBSQVRFXzExKQotCQkJCXsKKwkJCS8qZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkgKi8KKwkJCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkpIHsJLyogTGVnYWN5IG1vZGUgKi8KKwkJCQlpZiAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlIDw9IFJBVEVfMTEpIHsKIAkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUI7CiAJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzBdOwogCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJbMV07Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPiBSQVRFXzExKSAmJiAocEFkLT5Db21tb25DZmcuTWluVHhSYXRlID4gUkFURV8xMSkpCi0JCQkJeworCQkJCX0gZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IFJBVEVfMTEpCisJCQkJCSAgICYmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPgorCQkJCQkgICAgICAgUkFURV8xMSkpIHsKIAkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUc7CiAJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzBdOwogCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUdbMV07CiAKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKKwkJCQl9IGVsc2UgewogCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkc7CiAJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1swXTsKLQkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1sxXTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0KKwkJCQkJICAgIFJhdGVTd2l0Y2hUYWJsZTExQkdbMV07CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJfQotCi0JCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQotCQkJewotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKQotCQkJCXsKKwkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpIHsKKwkJCQlpZiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkgewogCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOwogCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOwotCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKLQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMVMgQVAgXG4iKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9CisJCQkJCSAgICBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJICAgICAoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDFTIEFQIFxuIikpOworCQkJCX0gZWxzZSB7CiAJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlM7CiAJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMF07Ci0JCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzFdOwotCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAyUyBBUCBcbiIpKTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0KKwkJCQkJICAgIFJhdGVTd2l0Y2hUYWJsZTExTjJTWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkJCQkgICAgICgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMlMgQVAgXG4iKSk7CiAJCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKQotCQkJCXsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpIHsKIAkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4xUzsKIAkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4xU1swXTsKLQkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMV07Ci0JCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDFTIEFQIFxuIikpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJeworCQkJCQkqcEluaXRUeFJhdGVJZHggPQorCQkJCQkgICAgUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMV07CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCQkJCSAgICAgKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAxUyBBUCBcbiIpKTsKKwkJCQl9IGVsc2UgewogCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQ7Ci0JCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFswXTsKLQkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFsxXTsKLQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMlMgQVAgXG4iKSk7CisJCQkJCSpwVGFibGVTaXplID0KKwkJCQkJICAgIFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9CisJCQkJCSAgICBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkJCQkgICAgICgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMlMgQVAgXG4iKSk7CiAJCQkJfQogCQkJfQotCi0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlIChTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkLCBNQ1NTZXRbMF09MHgleCwgTUNTU2V0WzFdPTB4JXgpXG4iLAotCQkJCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4sIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdLCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSkpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAgICAgKCJEUlM6IHVua293biBtb2RlIChTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkLCBNQ1NTZXRbMF09MHgleCwgTUNTU2V0WzFdPTB4JXgpXG4iLAorCQkJCSAgICAgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sCisJCQkJICAgICAgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiwKKwkJCQkgICAgICBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSwKKwkJCQkgICAgICBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLgorCQkJCSAgICAgIE1DU1NldFsxXSkpOwogCQl9Ci0JfSB3aGlsZShGQUxTRSk7CisJfSB3aGlsZSAoRkFMU0UpOworfQorCit2b2lkIFNUQU1sbWVQZXJpb2RpY0V4ZWMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXVuc2lnbmVkIGxvbmcgVHhUb3RhbENudDsKKwlpbnQgaTsKKworCS8qCisJICAgV2UgcmV0dXJuIGhlcmUgaW4gQVRFIG1vZGUsIGJlY2F1c2UgdGhlIHN0YXRpc3RpY3MKKwkgICB0aGF0IEFURSBuZWVkIGFyZSBub3QgY29sbGVjdGVkIHZpYSB0aGlzIHJvdXRpbmUuCisJICovCisjaWYgZGVmaW5lZChSVDMwNXgpfHxkZWZpbmVkKFJUMzA3MCkKKwkvKiByZXF1ZXN0IGJ5IEdhcnksIGlmIFJzc2kwID4gLTQyLCBCQlAgODIgbmVlZCB0byBiZSBjaGFuZ2VkIGZyb20gMHg2MiB0byAweDQyLCAsIGJicCA2NyBuZWVkIHRvIGJlIGNoYW5nZWQgZnJvbSAweDIwIHRvIDB4MTggKi8KKwlpZiAoIXBBZC0+Q29tbW9uQ2ZnLkhpZ2hQb3dlclBhdGNoRGlzYWJsZWQpIHsKKyNpZmRlZiBSVDMwNzAKKwkJaWYgKChJU19SVDMwNzAocEFkKSAmJiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMDEpKSkKKyNlbmRpZiAvKiBSVDMwNzAgLy8gKi8KKwkJeworCQkJaWYgKChwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwICE9IDApCisJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgPgorCQkJCShwQWQtPkJicFJzc2lUb0RibURlbHRhIC0gMzUpKSkgeworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgMHgyMCk7CisJCQl9IGVsc2UgeworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgMHgyMyk7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKyNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKKy8qIGRvbid0IHBlcmZvcm0gaWRsZS1wb3dlci1zYXZlIG1lY2hhbmlzbSB3aXRoaW4gMyBtaW4gYWZ0ZXIgZHJpdmVyIGluaXRpYWxpemF0aW9uLiAqLworLyogVGhpcyBjYW4gbWFrZSByZWJvb3RlciB0ZXN0IG1vcmUgcm9idXN0ICovCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKSB7CisJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgKElETEVfT04ocEFkKSkKKwkJICAgICYmIChwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID09IFNZTkNfSURMRSkKKwkJICAgICYmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKKwkJICAgICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkpIHsKKwkJCWlmIChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgeworCQkJCWlmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0KKwkJCQkgICAgVFJVRSkgeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIiVzXG4iLCBfX2Z1bmNfXykpOworCQkJCQlSVDI4eHhQY2lBc2ljUmFkaW9PZmYocEFkLAorCQkJCQkJCSAgICAgIEdVSV9JRExFX1BPV0VSX1NBVkUsCisJCQkJCQkJICAgICAgMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLAorCQkJCQkJCSAgICAgUG93ZXJTYWZlQ0lELCAweGZmLAorCQkJCQkJCSAgICAgMHgyKTsKKwkJCQkJLyogV2FpdCBjb21tYW5kIHN1Y2Nlc3MgKi8KKwkJCQkJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclNhZmVDSUQpOworCQkJCQlSVE1QX1NFVF9GTEFHKHBBZCwKKwkJCQkJCSAgICAgIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIlBTTSAtIHJ0MzB4eCBJc3N1ZSBTbGVlcCBjb21tYW5kKVxuIikpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgPiAxODApIHsKKwkJCQlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09CisJCQkJICAgIFRSVUUpIHsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCIlc1xuIiwgX19mdW5jX18pKTsKKwkJCQkJUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHBBZCwKKwkJCQkJCQkgICAgICBHVUlfSURMRV9QT1dFUl9TQVZFLAorCQkJCQkJCSAgICAgIDApOworCQkJCX0gZWxzZSB7CisJCQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwKKwkJCQkJCQkgICAgIFBvd2VyU2FmZUNJRCwgMHhmZiwKKwkJCQkJCQkgICAgIDB4MDIpOworCQkJCQkvKiBXYWl0IGNvbW1hbmQgc3VjY2VzcyAqLworCQkJCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyU2FmZUNJRCk7CisJCQkJCVJUTVBfU0VUX0ZMQUcocEFkLAorCQkJCQkJICAgICAgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiUFNNIC0gIHJ0Mjh4eCBJc3N1ZSBTbGVlcCBjb21tYW5kKVxuIikpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlNUQU1sbWVQZXJpb2RpY0V4ZWMgTU1DSEsgLSBDb21tb25DZmcuU3NpZFslZF09JWMlYyVjJWMuLi4gTWxtZUF1eC5Tc2lkWyVkXT0lYyVjJWMlYy4uLlxuIiwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCisJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkWzBdLAorCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZFsxXSwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRbMl0sCisJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkWzNdLCBwQWQtPk1sbWVBdXguU3NpZExlbiwKKwkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkWzBdLCBwQWQtPk1sbWVBdXguU3NpZFsxXSwKKwkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkWzJdLCBwQWQtPk1sbWVBdXguU3NpZFszXSkpOworCQl9CisJfQorI2VuZGlmIC8qIFBDSUVfUFNfU1VQUE9SVCAvLyAqLworCisJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKSB7CisJCS8qIFdQQSBNSUMgZXJyb3Igc2hvdWxkIGJsb2NrIGFzc29jaWF0aW9uIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMgKi8KKwkJaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jICYmCisJCSAgICBSVE1QX1RJTUVfQUZURVIocEFkLT5NbG1lLk5vdzMyLAorCQkJCSAgICBwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lICsKKwkJCQkgICAgKDYwICogT1NfSFopKSkKKwkJCXBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gRkFMU0U7CisJfQorCisJaWYgKChwQWQtPlByZU1lZGlhU3RhdGUgIT0gcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUpCisJICAgICYmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkpIHsKKwkJaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKSB7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcsCisJCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uCisJCQkJCSAgICAgIEFkZHIsIEJTUzAsIDApOworCQl9CisJCXBBZC0+UHJlTWVkaWFTdGF0ZSA9IHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlOworCX0KKworCWlmIChwQWQtPkNvbW1vbkNmZy5QU1BYbGluayAmJiBBREhPQ19PTihwQWQpKSB7CisJfSBlbHNlIHsKKwkJQXNpY1N0YUJicFR1bmluZyhwQWQpOworCX0KKworCVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCSAgICBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkgICAgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpIHsKKwkJLyogdXBkYXRlIGNoYW5uZWwgcXVhbGl0eSBmb3IgUm9hbWluZyBhbmQgVUkgTGlua1F1YWxpdHkgZGlzcGxheSAqLworCQlNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkocEFkLCBOVUxMLCBwQWQtPk1sbWUuTm93MzIpOworCX0KKwkvKiBtdXN0IGJlIEFGVEVSIE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKCkgYmVjYXVzZSBpdCBuZWVkcyB0byBrbm93IGlmICovCisJLyogUmFkaW8gaXMgY3VycmVudGx5IGluIG5vaXN5IGVudmlyb25tZW50ICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQlBc2ljQWRqdXN0VHhQb3dlcihwQWQpOworCisJaWYgKElORlJBX09OKHBBZCkpIHsKKworCQkvKiBJcyBQU00gYml0IGNvbnNpc3RlbnQgd2l0aCB1c2VyIHBvd2VyIG1hbmFnZW1lbnQgcG9saWN5PyAqLworCQkvKiBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIHRoYXQgd2lsbCBzZXQgUFNNIGJpdCBPTi4gKi8KKwkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkJTWxtZUNoZWNrUHNtQ2hhbmdlKHBBZCwgcEFkLT5NbG1lLk5vdzMyKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQgPSBUeFRvdGFsQ250OworCisJCWlmICgoUlRNUF9USU1FX0FGVEVSCisJCSAgICAgKHBBZC0+TWxtZS5Ob3czMiwKKwkJICAgICAgcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArICgxICogT1NfSFopKSkKKwkJICAgICYmCisJCSAgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCSAgICAmJgorCQkgICAgKCgoVHhUb3RhbENudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudCkgPAorCQkgICAgICA2MDApKSkgeworCQkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIEJXXzIwKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk1NQ0hLIC0gTm8gQkVBQ09OLiByZXN0b3JlIFI2NiB0byB0aGUgbG93IGJvdW5kKCVkKSBcbiIsCisJCQkJICAoMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpKSkpOworCQl9CisJCS8qaWYgKChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPT0gMCkgJiYgKi8KKwkJLyogICAgKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgPT0gMCkpICovCisJCXsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUKKwkJCSAgICAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkgeworCQkJCS8qIFdoZW4gQVBTRCBpcyBlbmFibGVkLCB0aGUgcGVyaW9kIGNoYW5nZXMgYXMgMjAgc2VjICovCisJCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDIwKSA9PSA4KQorCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsCisJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsCisJCQkJCQkJICBUUlVFKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogU2VuZCBvdXQgYSBOVUxMIGZyYW1lIGV2ZXJ5IDEwIHNlYyB0byBpbmZvcm0gQVAgdGhhdCBTVEEgaXMgc3RpbGwgYWxpdmUgKEF2b2lkIGJlaW5nIGFnZSBvdXQpICovCisJCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDEwKSA9PSA4KSB7CisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkKKwkJCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwKKwkJCQkJCQkJICBwQWQtPgorCQkJCQkJCQkgIENvbW1vbkNmZy4KKwkJCQkJCQkJICBUeFJhdGUsIFRSVUUpOworCQkJCQllbHNlCisJCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsCisJCQkJCQkJCSAgcEFkLT4KKwkJCQkJCQkJICBDb21tb25DZmcuCisJCQkJCQkJCSAgVHhSYXRlLAorCQkJCQkJCQkgIEZBTFNFKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoQ1FJX0lTX0RFQUQocEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5KSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTU1DSEsgLSBObyBCRUFDT04uIERlYWQgQ1FJLiBBdXRvIFJlY292ZXJ5IGF0dGVtcHQgIyVsZFxuIiwKKwkJCQkgIHBBZC0+UmFsaW5rQ291bnRlcnMuQmFkQ1FJQXV0b1JlY292ZXJ5Q291bnQpKTsKKworCQkJLyogTG9zdCBBUCwgc2VuZCBkaXNjb25uZWN0ICYgbGluayBkb3duIGV2ZW50ICovCisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKworCQkJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBTSU9DR0lXQVAsIC0xLCBOVUxMLCBOVUxMLAorCQkJCQkJMCk7CisKKwkJCS8qIFJUTVBQYXRjaE1hY0JicEJ1ZyhwQWQpOyAqLworCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQl9IGVsc2UgaWYgKENRSV9JU19CQUQocEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5KSkgeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCsrOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTU1DSEsgLSBCYWQgQ1FJLiBBdXRvIFJlY292ZXJ5IGF0dGVtcHQgIyVsZFxuIiwKKwkJCQkgIHBBZC0+UmFsaW5rQ291bnRlcnMuQmFkQ1FJQXV0b1JlY292ZXJ5Q291bnQpKTsKKwkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKKwkJfQorCisJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1JvYW1pbmcpIHsKKwkJCUJPT0xFQU4gcnYgPSBGQUxTRTsKKwkJCWNoYXIgZEJtVG9Sb2FtID0gcEFkLT5TdGFDZmcuZEJtVG9Sb2FtOworCQkJY2hhciBNYXhSc3NpID0gUlRNUE1heFJzc2kocEFkLAorCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS4KKwkJCQkJCSAgIExhc3RSc3NpMCwKKwkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuCisJCQkJCQkgICBMYXN0UnNzaTEsCisJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLgorCQkJCQkJICAgTGFzdFJzc2kyKTsKKworCQkJLyogU2Nhbm5pbmcsIGlnbm9yZSBSb2FtaW5nICovCisJCQlpZiAoIVJUTVBfVEVTVF9GTEFHCisJCQkgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykKKwkJCSAgICAmJiAocEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9PSBTWU5DX0lETEUpCisJCQkgICAgJiYgKE1heFJzc2kgPD0gZEJtVG9Sb2FtKSkgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJSc3NpPSVkLCBkQm1Ub1JvYW09JWRcbiIsIE1heFJzc2ksCisJCQkJCSAgKGNoYXIpZEJtVG9Sb2FtKSk7CisKKwkJCQkvKiBBZGQgYXV0byBzZWFtbGVzcyByb2FtaW5nICovCisJCQkJaWYgKHJ2ID09IEZBTFNFKQorCQkJCQlydiA9IE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKHBBZCk7CisKKwkJCQlpZiAocnYgPT0gRkFMU0UpIHsKKwkJCQkJaWYgKChwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgKworCQkJCQkgICAgIDEwICogT1NfSFopIDwgcEFkLT5NbG1lLk5vdzMyKSB7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkgKCJNTUNISyAtIFJvYW1pbmcsIE5vIGVsaWdhYmxlIGVudHJ5LCB0cnkgbmV3IHNjYW4hXG4iKSk7CisJCQkJCQlwQWQtPlN0YUNmZy5TY2FuQ250ID0gMjsKKwkJCQkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9CisJCQkJCQkgICAgcEFkLT5NbG1lLk5vdzMyOworCQkJCQkJTWxtZUF1dG9TY2FuKHBBZCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKEFESE9DX09OKHBBZCkpIHsKKwkJLyogSWYgYWxsIHBlZXJzIGxlYXZlLCBhbmQgdGhpcyBTVEEgYmVjb21lcyB0aGUgbGFzdCBvbmUgaW4gdGhpcyBJQlNTLCB0aGVuIGNoYW5nZSBNZWRpYVN0YXRlICovCisJCS8qIHRvIERJU0NPTk5FQ1RFRC4gQnV0IHN0aWxsIGhvbGRpbmcgdGhpcyBJQlNTIChpLmUuIHNlbmRpbmcgQkVBQ09OKSBzbyB0aGF0IG90aGVyIFNUQXMgY2FuICovCisJCS8qIGpvaW4gbGF0ZXIuICovCisJCWlmIChSVE1QX1RJTUVfQUZURVIKKwkJICAgIChwQWQtPk1sbWUuTm93MzIsCisJCSAgICAgcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIEFESE9DX0JFQUNPTl9MT1NUX1RJTUUpCisJCSAgICAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLAorCQkJCQkgIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgeworCQkJc3RydWN0IHJ0X21sbWVfc3RhcnRfcmVxIFN0YXJ0UmVxOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJNTUNISyAtIGV4Y2Vzc2l2ZSBCRUFDT04gbG9zdCwgbGFzdCBTVEEgaW4gdGhpcyBJQlNTLCBNZWRpYVN0YXRlPURpc2Nvbm5lY3RlZFxuIikpOworCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisKKwkJCVN0YXJ0UGFybUZpbGwocEFkLCAmU3RhcnRSZXEsCisJCQkJICAgICAgKGNoYXIgKikgcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJICAgICAgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NUQVJUX1JFUSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3N0YXJ0X3JlcSksICZTdGFydFJlcSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1NUQVJUOworCQl9CisKKwkJZm9yIChpID0gMTsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspIHsKKwkJCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCisJCQlpZiAocEVudHJ5LT5WYWxpZEFzQ0xJID09IEZBTFNFKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoUlRNUF9USU1FX0FGVEVSCisJCQkgICAgKHBBZC0+TWxtZS5Ob3czMiwKKwkJCSAgICAgcEVudHJ5LT5MYXN0QmVhY29uUnhUaW1lICsgQURIT0NfQkVBQ09OX0xPU1RfVElNRSkpCisJCQkJTWFjVGFibGVEZWxldGVFbnRyeShwQWQsIHBFbnRyeS0+QWlkLAorCQkJCQkJICAgIHBFbnRyeS0+QWRkcik7CisJCX0KKwl9IGVsc2UJCQkvKiBubyBJTkZSQSBub3IgQURIT0MgY29ubmVjdGlvbiAqLworCXsKKworCQlpZiAocEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSAmJgorCQkgICAgUlRNUF9USU1FX0JFRk9SRShwQWQtPk1sbWUuTm93MzIsCisJCQkJICAgICBwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgKyAoMzAgKiBPU19IWikpKQorCQkJZ290byBTS0lQX0FVVE9fU0NBTl9DT05OOworCQllbHNlCisJCQlwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisKKwkJaWYgKChwQWQtPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9PSBUUlVFKQorCQkgICAgJiYgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKQorCQkgICAgJiYKKwkJICAgIChNbG1lVmFsaWRhdGVTU0lECisJCSAgICAgKHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwKKwkJICAgICAgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSA9PSBUUlVFKSkgeworCQkJaWYgKChwQWQtPlNjYW5UYWIuQnNzTnIgPT0gMCkKKwkJCSAgICAmJiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpKSB7CisJCQkJc3RydWN0IHJ0X21sbWVfc2Nhbl9yZXEgU2NhblJlcTsKKworCQkJCWlmIChSVE1QX1RJTUVfQUZURVIKKwkJCQkgICAgKHBBZC0+TWxtZS5Ob3czMiwKKwkJCQkgICAgIHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArICgxMCAqIE9TX0haKSkpIHsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJTVEFNbG1lUGVyaW9kaWNFeGVjKCk6Q05UTCAtIFNjYW5UYWIuQnNzTnI9PTAsIHN0YXJ0IGEgbmV3IEFDVElWRSBzY2FuIFNTSURbJXNdXG4iLAorCQkJCQkJICBwQWQtPk1sbWVBdXguCisJCQkJCQkgIEF1dG9SZWNvbm5lY3RTc2lkKSk7CisJCQkJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLAorCQkJCQkJICAgICAoY2hhciAqKXBBZC0+TWxtZUF1eC4KKwkJCQkJCSAgICAgQXV0b1JlY29ubmVjdFNzaWQsCisJCQkJCQkgICAgIHBBZC0+TWxtZUF1eC4KKwkJCQkJCSAgICAgQXV0b1JlY29ubmVjdFNzaWRMZW4sCisJCQkJCQkgICAgIEJTU19BTlksIFNDQU5fQUNUSVZFKTsKKwkJCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsCisJCQkJCQkgICAgTVQyX01MTUVfU0NBTl9SRVEsCisJCQkJCQkgICAgc2l6ZW9mCisJCQkJCQkgICAgKHN0cnVjdCBydF9tbG1lX3NjYW5fcmVxKSwKKwkJCQkJCSAgICAmU2NhblJlcSk7CisJCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPQorCQkJCQkgICAgQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisJCQkJCS8qIFJlc2V0IE1pc3NlZCBzY2FuIG51bWJlciAqLworCQkJCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPQorCQkJCQkgICAgcEFkLT5NbG1lLk5vdzMyOworCQkJCX0gZWxzZSBpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCS8qIFF1aXQgdGhlIGZvcmV2ZXIgc2NhbiB3aGVuIGluIGEgdmVyeSBjbGVhbiByb29tICovCisJCQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKKwkJCX0gZWxzZSBpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpIHsKKwkJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNykgPT0gMCkgeworCQkJCQlNbG1lQXV0b1NjYW4ocEFkKTsKKwkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0KKwkJCQkJICAgIHBBZC0+TWxtZS5Ob3czMjsKKwkJCQl9IGVsc2UgeworCQkJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCitTS0lQX0FVVE9fU0NBTl9DT05OOgorCisJaWYgKChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlRYQkFiaXRtYXAgIT0gMCkKKwkgICAgJiYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPT0gRkFMU0UpKSB7CisJCXBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPSBUUlVFOworCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX0ZPUkNFUlRTQ1RTLCBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLAorCQkJCSAgRkFMU0UpOworCX0gZWxzZSBpZiAoKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uVFhCQWJpdG1hcCA9PSAwKQorCQkgICAmJiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9PSBUUlVFKSkgeworCQlwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID0gRkFMU0U7CisJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwKKwkJCQkgIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi4KKwkJCQkgIE9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOworCX0KKworCXJldHVybjsKK30KKworLyogTGluayBkb3duIHJlcG9ydCAqLwordm9pZCBMaW5rRG93bkV4ZWModm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMykKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKKworCWlmIChwQWQgIT0gTlVMTCkgeworCQlzdHJ1Y3QgcnRfbWxtZV9kaXNhc3NvY19yZXEgRGlzYXNzb2NSZXE7CisKKwkJaWYgKChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpICYmCisJCSAgICAoSU5GUkFfT04ocEFkKSkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkxpbmtEb3duRXhlYygpOiBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQLi4uXG4iKSk7CisJCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLAorCQkJCQkgcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkJCSBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLAorCQkJCSAgICBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9kaXNhc3NvY19yZXEpLAorCQkJCSAgICAmRGlzYXNzb2NSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKKworCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisJCQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQl9CisJfQorfQorCisvKiBJUlFMID0gRElTUEFUQ0hfTEVWRUwgKi8KK3ZvaWQgTWxtZUF1dG9TY2FuKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwkvKiBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdCAqLworCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIERyaXZlciBhdXRvIHNjYW5cbiIpKTsKKwkJTWxtZUVucXVldWUocEFkLAorCQkJICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJICAgIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAorCQkJICAgIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiwKKwkJCSAgICBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQpOworCQlSVE1QX01MTUVfSEFORExFUihwQWQpOworCX0KK30KKworLyogSVJRTCA9IERJU1BBVENIX0xFVkVMICovCit2b2lkIE1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCWlmIChwQWQtPlN0YUNmZy5iQXV0b0Nvbm5lY3RCeUJzc2lkKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiRHJpdmVyIGF1dG8gcmVjb25uZWN0IHRvIGxhc3QgT0lEXzgwMl8xMV9CU1NJRCBzZXR0aW5nIC0gJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJCQkgIHBBZC0+TWxtZUF1eC5Cc3NpZFswXSwgcEFkLT5NbG1lQXV4LkJzc2lkWzFdLAorCQkJICBwQWQtPk1sbWVBdXguQnNzaWRbMl0sIHBBZC0+TWxtZUF1eC5Cc3NpZFszXSwKKwkJCSAgcEFkLT5NbG1lQXV4LkJzc2lkWzRdLCBwQWQtPk1sbWVBdXguQnNzaWRbNV0pKTsKKworCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCU1sbWVFbnF1ZXVlKHBBZCwKKwkJCSAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCSAgICBPSURfODAyXzExX0JTU0lELCBNQUNfQUREUl9MRU4sIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKworCQlSVE1QX01MTUVfSEFORExFUihwQWQpOworCX0KKwkvKiBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdCAqLworCWVsc2UgaWYgKChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkgJiYKKwkJIChNbG1lVmFsaWRhdGVTU0lECisJCSAgKHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwKKwkJICAgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSA9PSBUUlVFKSkgeworCQlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfc3NpZCBPaWRTc2lkOworCQlPaWRTc2lkLlNzaWRMZW5ndGggPSBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW47CisJCU5kaXNNb3ZlTWVtb3J5KE9pZFNzaWQuU3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLAorCQkJICAgICAgIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJEcml2ZXIgYXV0byByZWNvbm5lY3QgdG8gbGFzdCBPSURfODAyXzExX1NTSUQgc2V0dGluZyAtICVzLCBsZW4gLSAlZFxuIiwKKwkJCSAgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLAorCQkJICBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pKTsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgT0lEXzgwMl8xMV9TU0lELAorCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbmRpc184MDJfMTFfc3NpZCksICZPaWRTc2lkKTsKKwkJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9CiB9CiAKIC8qCkBAIC0xNjc4LDQ3ICsxNTgyLDUwIEBACiAJT3V0cHV0OgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZUNoZWNrRm9yUm9hbWluZygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVTE9ORwlOb3czMikKK3ZvaWQgTWxtZUNoZWNrRm9yUm9hbWluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHVuc2lnbmVkIGxvbmcgTm93MzIpCiB7Ci0JVVNIT1JUCSAgIGk7Ci0JQlNTX1RBQkxFICAqcFJvYW1UYWIgPSAmcEFkLT5NbG1lQXV4LlJvYW1UYWI7Ci0JQlNTX0VOVFJZICAqcEJzczsKKwl1MTYgaTsKKwlzdHJ1Y3QgcnRfYnNzX3RhYmxlICpwUm9hbVRhYiA9ICZwQWQtPk1sbWVBdXguUm9hbVRhYjsKKwlzdHJ1Y3QgcnRfYnNzX2VudHJ5ICpwQnNzOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IE1sbWVDaGVja0ZvclJvYW1pbmdcbiIpKTsKLQkvLyBwdXQgYWxsIHJvYW1pbmcgY2FuZGlkYXRlcyBpbnRvIFJvYW1UYWIsIGFuZCBzb3J0IGluIFJTU0kgb3JkZXIKKwkvKiBwdXQgYWxsIHJvYW1pbmcgY2FuZGlkYXRlcyBpbnRvIFJvYW1UYWIsIGFuZCBzb3J0IGluIFJTU0kgb3JkZXIgKi8KIAlCc3NUYWJsZUluaXQocFJvYW1UYWIpOwotCWZvciAoaSA9IDA7IGkgPCBwQWQtPlNjYW5UYWIuQnNzTnI7IGkrKykKLQl7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKSB7CiAJCXBCc3MgPSAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldOwogCi0JCWlmICgocEJzcy0+TGFzdEJlYWNvblJ4VGltZSArIEJFQUNPTl9MT1NUX1RJTUUpIDwgTm93MzIpCi0JCQljb250aW51ZTsJIC8vIEFQIGRpc2FwcGVhcgorCQlpZiAoKHBCc3MtPkxhc3RCZWFjb25SeFRpbWUgKyBwQWQtPlN0YUNmZy5CZWFjb25Mb3N0VGltZSkgPAorCQkgICAgTm93MzIpCisJCQljb250aW51ZTsJLyogQVAgZGlzYXBwZWFyICovCiAJCWlmIChwQnNzLT5Sc3NpIDw9IFJTU0lfVEhSRVNIT0xEX0ZPUl9ST0FNSU5HKQotCQkJY29udGludWU7CSAvLyBSU1NJIHRvbyB3ZWFrLiBmb3JnZXQgaXQuCisJCQljb250aW51ZTsJLyogUlNTSSB0b28gd2Vhay4gZm9yZ2V0IGl0LiAqLwogCQlpZiAoTUFDX0FERFJfRVFVQUwocEJzcy0+QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKSkKLQkJCWNvbnRpbnVlOwkgLy8gc2tpcCBjdXJyZW50IEFQCi0JCWlmIChwQnNzLT5Sc3NpIDwgKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwICsgUlNTSV9ERUxUQSkpCi0JCQljb250aW51ZTsJIC8vIG9ubHkgQVAgd2l0aCBzdHJvbmdlciBSU1NJIGlzIGVsaWdpYmxlIGZvciByb2FtaW5nCisJCQljb250aW51ZTsJLyogc2tpcCBjdXJyZW50IEFQICovCisJCWlmIChwQnNzLT5Sc3NpIDwKKwkJICAgIChwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCArIFJTU0lfREVMVEEpKQorCQkJY29udGludWU7CS8qIG9ubHkgQVAgd2l0aCBzdHJvbmdlciBSU1NJIGlzIGVsaWdpYmxlIGZvciByb2FtaW5nICovCiAKLQkJLy8gQVAgcGFzc2luZyBhbGwgYWJvdmUgcnVsZXMgaXMgcHV0IGludG8gcm9hbWluZyBjYW5kaWRhdGUgdGFibGUKLQkJTmRpc01vdmVNZW1vcnkoJnBSb2FtVGFiLT5Cc3NFbnRyeVtwUm9hbVRhYi0+QnNzTnJdLCBwQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCS8qIEFQIHBhc3NpbmcgYWxsIGFib3ZlIHJ1bGVzIGlzIHB1dCBpbnRvIHJvYW1pbmcgY2FuZGlkYXRlIHRhYmxlICovCisJCU5kaXNNb3ZlTWVtb3J5KCZwUm9hbVRhYi0+QnNzRW50cnlbcFJvYW1UYWItPkJzc05yXSwgcEJzcywKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2Jzc19lbnRyeSkpOwogCQlwUm9hbVRhYi0+QnNzTnIgKz0gMTsKIAl9CiAKLQlpZiAocFJvYW1UYWItPkJzc05yID4gMCkKLQl7Ci0JCS8vIGNoZWNrIENudGxNYWNoaW5lLkN1cnJTdGF0ZSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBORElTIFNldE9JRCByZXF1ZXN0Ci0JCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKLQkJewotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50ICsrOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBSb2FtaW5nIGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50KSk7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ST0FNSU5HX1JFUSwgMCwgTlVMTCk7Ci0JCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJaWYgKHBSb2FtVGFiLT5Cc3NOciA+IDApIHsKKwkJLyogY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QgKi8KKwkJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSB7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQrKzsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk1NQ0hLIC0gUm9hbWluZyBhdHRlbXB0ICMlbGRcbiIsCisJCQkJICBwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQpKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJICAgIE1UMl9NTE1FX1JPQU1JTkdfUkVRLCAwLCBOVUxMKTsKKwkJCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7CiAJCX0KIAl9Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IE1sbWVDaGVja0ZvclJvYW1pbmcoIyBvZiBjYW5kaWRhdGU9ICVkKVxuIixwUm9hbVRhYi0+QnNzTnIpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPD09IE1sbWVDaGVja0ZvclJvYW1pbmcoIyBvZiBjYW5kaWRhdGU9ICVkKVxuIiwKKwkJICBwUm9hbVRhYi0+QnNzTnIpKTsKIH0KIAogLyoKQEAgLTE3MzMsMTU5ICsxNjQwLDc0IEBACiAJT3V0cHV0OgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUxPTkcJCQlOb3cpCitCT09MRUFOIE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlVU0hPUlQJCWk7Ci0JQlNTX1RBQkxFCSpwUm9hbVRhYiA9ICZwQWQtPk1sbWVBdXguUm9hbVRhYjsKLQlCU1NfRU5UUlkJKnBCc3M7CisJdTE2IGk7CisJc3RydWN0IHJ0X2Jzc190YWJsZSAqcFJvYW1UYWIgPSAmcEFkLT5NbG1lQXV4LlJvYW1UYWI7CisJc3RydWN0IHJ0X2Jzc19lbnRyeSAqcEJzczsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZ1xuIikpOwotCS8vIHB1dCBhbGwgcm9hbWluZyBjYW5kaWRhdGVzIGludG8gUm9hbVRhYiwgYW5kIHNvcnQgaW4gUlNTSSBvcmRlcgorCS8qIHB1dCBhbGwgcm9hbWluZyBjYW5kaWRhdGVzIGludG8gUm9hbVRhYiwgYW5kIHNvcnQgaW4gUlNTSSBvcmRlciAqLwogCUJzc1RhYmxlSW5pdChwUm9hbVRhYik7Ci0JZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5TY2FuVGFiLkJzc05yOyBpKyspIHsKIAkJcEJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07CiAKLSAgICAgICAgaWYgKChwQnNzLT5Sc3NpIDw9IC01MCkgJiYgKHBCc3MtPkNoYW5uZWwgPT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCi0JCQljb250aW51ZTsJIC8vIFJTU0kgdG9vIHdlYWsuIGZvcmdldCBpdC4KKwkJaWYgKChwQnNzLT5Sc3NpIDw9IC01MCkKKwkJICAgICYmIChwQnNzLT5DaGFubmVsID09IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKQorCQkJY29udGludWU7CS8qIFJTU0kgdG9vIHdlYWsuIGZvcmdldCBpdC4gKi8KIAkJaWYgKE1BQ19BRERSX0VRVUFMKHBCc3MtPkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCkpCi0JCQljb250aW51ZTsJIC8vIHNraXAgY3VycmVudCBBUAotCQlpZiAoIVNTSURfRVFVQUwocEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpCi0JCQljb250aW51ZTsJIC8vIHNraXAgZGlmZmVyZW50IFNTSUQKLSAgICAgICAgaWYgKHBCc3MtPlJzc2kgPCAoUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSArIFJTU0lfREVMVEEpKQotCQkJY29udGludWU7CSAvLyBza2lwIEFQIHdpdGhvdXQgYmV0dGVyIFJTU0kKKwkJCWNvbnRpbnVlOwkvKiBza2lwIGN1cnJlbnQgQVAgKi8KKwkJaWYgKCFTU0lEX0VRVUFMCisJCSAgICAocEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwKKwkJICAgICBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSkKKwkJCWNvbnRpbnVlOwkvKiBza2lwIGRpZmZlcmVudCBTU0lEICovCisJCWlmIChwQnNzLT5Sc3NpIDwKKwkJICAgIChSVE1QTWF4UnNzaQorCQkgICAgIChwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLAorCQkgICAgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwKKwkJICAgICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpICsgUlNTSV9ERUxUQSkpCisJCQljb250aW51ZTsJLyogc2tpcCBBUCB3aXRob3V0IGJldHRlciBSU1NJICovCiAKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTGFzdFJzc2kwID0gJWQsIHBCc3MtPlJzc2kgPSAlZFxuIiwgUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSwgcEJzcy0+UnNzaSkpOwotCQkvLyBBUCBwYXNzaW5nIGFsbCBhYm92ZSBydWxlcyBpcyBwdXQgaW50byByb2FtaW5nIGNhbmRpZGF0ZSB0YWJsZQotCQlOZGlzTW92ZU1lbW9yeSgmcFJvYW1UYWItPkJzc0VudHJ5W3BSb2FtVGFiLT5Cc3NOcl0sIHBCc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJMYXN0UnNzaTAgPSAlZCwgcEJzcy0+UnNzaSA9ICVkXG4iLAorCQkJICBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLAorCQkJCSAgICAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLAorCQkJCSAgICAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSwKKwkJCSAgcEJzcy0+UnNzaSkpOworCQkvKiBBUCBwYXNzaW5nIGFsbCBhYm92ZSBydWxlcyBpcyBwdXQgaW50byByb2FtaW5nIGNhbmRpZGF0ZSB0YWJsZSAqLworCQlOZGlzTW92ZU1lbW9yeSgmcFJvYW1UYWItPkJzc0VudHJ5W3BSb2FtVGFiLT5Cc3NOcl0sIHBCc3MsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9ic3NfZW50cnkpKTsKIAkJcFJvYW1UYWItPkJzc05yICs9IDE7CiAJfQogCi0JaWYgKHBSb2FtVGFiLT5Cc3NOciA+IDApCi0JewotCQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAotCQlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCi0JCXsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCArKzsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gUm9hbWluZyBhdHRlbXB0ICMlbGRcbiIsIHBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCkpOwotCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfUk9BTUlOR19SRVEsIDAsIE5VTEwpOwotCQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOwotCQl9Ci0JfQotCS8vIE1heWJlIHNpdGUgc3VydmV5IHJlcXVpcmVkCi0JZWxzZQotCXsKLQkJaWYgKChwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgKyAxMCAqIDEwMDApIDwgTm93KQotCQl7Ci0JCQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBSb2FtaW5nLCBObyBlbGlnYWJsZSBlbnRyeSwgdHJ5IG5ldyBzY2FuIVxuIikpOwotCQkJcEFkLT5TdGFDZmcuU2NhbkNudCA9IDI7Ci0JCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7Ci0JCQlNbG1lQXV0b1NjYW4ocEFkKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPD09IE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nIChCc3NOcj0lZClcbiIsIHBSb2FtVGFiLT5Cc3NOcikpOworCWlmIChwUm9hbVRhYi0+QnNzTnIgPiAwKSB7CisJCS8qIGNoZWNrIENudGxNYWNoaW5lLkN1cnJTdGF0ZSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBORElTIFNldE9JRCByZXF1ZXN0ICovCisJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkgeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50Kys7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJNTUNISyAtIFJvYW1pbmcgYXR0ZW1wdCAjJWxkXG4iLAorCQkJCSAgcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50KSk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCSAgICBNVDJfTUxNRV9ST0FNSU5HX1JFUSwgMCwgTlVMTCk7CisJCQlSVE1QX01MTUVfSEFORExFUihwQWQpOworCQkJcmV0dXJuIFRSVUU7CiAJCX0KIAl9CiAKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcgKEJzc05yPSVkKVxuIiwgcFJvYW1UYWItPkJzc05yKSk7CisJcmV0dXJuIEZBTFNFOwogfQogCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgcm91dGluZSBjYWxjdWxhdGVzIFR4UEVSLCBSeFBFUiBvZiB0aGUgcGFzdCBOLXNlYyBwZXJpb2QuIEFuZAotCQlhY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9uIHJlc3VsdCwgQ2hhbm5lbFF1YWxpdHkgaXMgY2FsY3VsYXRlZCBoZXJlCi0JCXRvIGRlY2lkZSBpZiBjdXJyZW50IEFQIGlzIHN0aWxsIGRvaW5nIHRoZSBqb2IuCi0KLQkJSWYgQ2hhbm5lbFF1YWxpdHkgaXMgbm90IGdvb2QsIGEgUk9BTWluZyBhdHRlbXB0IG1heSBiZSB0cmllZCBsYXRlci4KLQlPdXRwdXQ6Ci0JCVN0YUNmZy5DaGFubmVsUXVhbGl0eSAtIDAuLjEwMAotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOT1RFOiBUaGlzIHJvdXRpbmUgZGVjaWRlIGNoYW5ubGUgcXVhbGl0eSBiYXNlZCBvbiBSWCBDUkMgZXJyb3IgcmF0aW8uCi0JCUNhbGxlciBzaG91bGQgbWFrZSBzdXJlIGEgZnVuY3Rpb24gY2FsbCB0byBOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpCi0JCWlzIHBlcmZvcm1lZCByaWdodCBiZWZvcmUgdGhpcyByb3V0aW5lLCBzbyB0aGF0IHRoaXMgcm91dGluZSBjYW4gZGVjaWRlCi0JCWNoYW5uZWwgcXVhbGl0eSBiYXNlZCBvbiB0aGUgbW9zdCB1cC10by1kYXRlIGluZm9ybWF0aW9uCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUxPTkcgTm93MzIpCit2b2lkIE1sbWVTZXRUeFJhdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHN0cnVjdCBydF9ydG1wX3R4X3JhdGVfc3dpdGNoICogcFR4UmF0ZSkKIHsKLQlVTE9ORyBUeE9rQ250LCBUeENudCwgVHhQRVIsIFR4UFJSOwotCVVMT05HIFJ4Q250LCBSeFBFUjsKLQlVQ0hBUiBOb3JSc3NpOwotCUNIQVIgIE1heFJzc2k7Ci0JVUxPTkcgQmVhY29uTG9zdFRpbWUgPSBCRUFDT05fTE9TVF9USU1FOwotCi0JTWF4UnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMik7Ci0KLQkvLwotCS8vIGNhbGN1bGF0ZSBUWCBwYWNrZXQgZXJyb3IgcmF0aW8gYW5kIFRYIHJldHJ5IHJhdGlvIC0gaWYgdG9vIGZldyBUWCBzYW1wbGVzLCBza2lwIFRYIHJlbGF0ZWQgc3RhdGlzdGljcwotCS8vCi0JVHhPa0NudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQ7Ci0JVHhDbnQgPSBUeE9rQ250ICsgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKLQlpZiAoVHhDbnQgPCA1KQotCXsKLQkJVHhQRVIgPSAwOwotCQlUeFBSUiA9IDA7Ci0JfQotCWVsc2UKLQl7Ci0JCVR4UEVSID0gKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQgKiAxMDApIC8gVHhDbnQ7Ci0JCVR4UFJSID0gKChUeENudCAtIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCkgKiAxMDApIC8gVHhDbnQ7Ci0JfQotCi0JLy8KLQkvLyBjYWxjdWxhdGUgUlggUEVSIC0gZG9uJ3QgdGFrZSBSeFBFUiBpbnRvIGNvbnNpZGVyYXRpb24gaWYgdG9vIGZldyBzYW1wbGUKLQkvLwotCVJ4Q250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rQ250ICsgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudDsKLQlpZiAoUnhDbnQgPCA1KQotCQlSeFBFUiA9IDA7Ci0JZWxzZQotCQlSeFBFUiA9IChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4RmNzRXJyQ250ICogMTAwKSAvIFJ4Q250OwotCi0JLy8KLQkvLyBkZWNpZGUgQ2hhbm5lbFF1YWxpdHkgYmFzZWQgb246IDEpbGFzdCBCRUFDT04gcmVjZWl2ZWQgdGltZSwgMilsYXN0IFJTU0ksIDMpVHhQRVIsIGFuZCA0KVJ4UEVSCi0JLy8KLQlpZiAoSU5GUkFfT04ocEFkKSAmJgotCQkocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50IDwgMikgJiYgLy8gbm8gaGVhdnkgdHJhZmZpYwotCQkocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIEJlYWNvbkxvc3RUaW1lIDwgTm93MzIpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkVBQ09OIGxvc3QgPiAlbGQgbXNlYyB3aXRoIFR4T2tDbnQ9JWxkIC0+IENRST0wXG4iLCBCZWFjb25Mb3N0VGltZSwgVHhPa0NudCkpOwotCQlwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkgPSAwOwotCX0KLQllbHNlCi0JewotCQkvLyBOb3JtYWxpemUgUnNzaQotCQlpZiAoTWF4UnNzaSA+IC00MCkKLQkJCU5vclJzc2kgPSAxMDA7Ci0JCWVsc2UgaWYgKE1heFJzc2kgPCAtOTApCi0JCQlOb3JSc3NpID0gMDsKLQkJZWxzZQotCQkJTm9yUnNzaSA9IChNYXhSc3NpICsgOTApICogMjsKLQotCQkvLyBDaGFubmVsUXVhbGl0eSA9IFcxKlJTU0kgKyBXMipUeFBSUiArIFczKlJ4UEVSCSAoUlNTSSAwLi4xMDApLCAoVHhQRVIgMTAwLi4wKSwgKFJ4UEVSIDEwMC4uMCkKLQkJcEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID0gKFJTU0lfV0VJR0hUSU5HICogTm9yUnNzaSArCi0JCQkJCQkJCSAgIFRYX1dFSUdIVElORyAqICgxMDAgLSBUeFBSUikgKwotCQkJCQkJCQkgICBSWF9XRUlHSFRJTkcqICgxMDAgLSBSeFBFUikpIC8gMTAwOwotCQlpZiAocEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID49IDEwMCkKLQkJCXBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA9IDEwMDsKLQl9Ci0KLX0KLQotVk9JRCBNbG1lU2V0VHhSYXRlKAotCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCi0JSU4gUFJUTVBfVFhfUkFURV9TV0lUQ0gJcFR4UmF0ZSkKLXsKLQlVQ0hBUglNYXhNb2RlID0gTU9ERV9PRkRNOworCXU4IE1heE1vZGUgPSBNT0RFX09GRE07CiAKIAlNYXhNb2RlID0gTU9ERV9IVEdSRUVORklFTEQ7CiAKLQlpZiAocFR4UmF0ZS0+U1RCQyAmJiAocEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQorCWlmIChwVHhSYXRlLT5TVEJDICYmIChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQykKKwkgICAgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCiAJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19VU0U7CiAJZWxzZQogCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKQEAgLTE4OTYsODcgKzE3MTgsMTA5IEBACiAJaWYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPiA3KQogCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKIAotICAgCWlmIChBREhPQ19PTihwQWQpKQotCXsKLQkJLy8gSWYgcGVlciBhZGhvYyBpcyBiLW9ubHkgbW9kZSwgd2UgY2FuJ3Qgc2VuZCAxMWcgcmF0ZS4KKwlpZiAoQURIT0NfT04ocEFkKSkgeworCQkvKiBJZiBwZWVyIGFkaG9jIGlzIGItb25seSBtb2RlLCB3ZSBjYW4ndCBzZW5kIDExZyByYXRlLiAqLwogCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQwk9IFNUQkNfTk9ORTsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKIAotCQkvLwotCQkvLyBGb3IgQWRob2MgTU9ERV9DQ0ssIGRyaXZlciB3aWxsIHVzZSBBZGhvY0JPbmx5Sm9pbmVkIGZsYWcgdG8gcm9sbCBiYWNrIHRvIEIgb25seSBpZiBuZWNlc3NhcnkKLQkJLy8KLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBUeFJhdGUtPk1vZGU7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCS8qICovCisJCS8qIEZvciBBZGhvYyBNT0RFX0NDSywgZHJpdmVyIHdpbGwgdXNlIEFkaG9jQk9ubHlKb2luZWQgZmxhZyB0byByb2xsIGJhY2sgdG8gQiBvbmx5IGlmIG5lY2Vzc2FyeSAqLworCQkvKiAqLworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gcFR4UmF0ZS0+TW9kZTsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9CisJCSAgICBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKIAotCQkvLyBQYXRjaCBzcGVlZCBlcnJvciBpbiBzdGF0dXMgcGFnZQorCQkvKiBQYXRjaCBzcGVlZCBlcnJvciBpbiBzdGF0dXMgcGFnZSAqLwogCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREU7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJaWYgKHBUeFJhdGUtPk1vZGUgPD0gTWF4TW9kZSkKIAkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gcFR4UmF0ZS0+TW9kZTsKIAotCQlpZiAocFR4UmF0ZS0+U2hvcnRHSSAmJiAocEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kpKQorCQlpZiAocFR4UmF0ZS0+U2hvcnRHSQorCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJKSkKIAkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfNDAwOwogCQllbHNlCiAJCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKIAotCQkvLyBSZWV4YW0gZWFjaCBiYW5kd2lkdGgncyBTR0kgc3VwcG9ydC4KLQkJaWYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID09IEdJXzQwMCkKLQkJewotCQkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVyA9PSBCV18yMCkgJiYgKCFDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpKSkKKwkJLyogUmVleGFtIGVhY2ggYmFuZHdpZHRoJ3MgU0dJIHN1cHBvcnQuICovCisJCWlmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9PSBHSV80MDApIHsKKwkJCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcgPT0gQldfMjApCisJCQkgICAgJiYKKwkJCSAgICAoIUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHCisJCQkgICAgIChwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpKSkKIAkJCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKLQkJCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcgPT0gQldfNDApICYmICghQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKSkpCisJCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXID09IEJXXzQwKQorCQkJICAgICYmCisJCQkgICAgKCFDTElFTlRfU1RBVFVTX1RFU1RfRkxBRworCQkJICAgICAocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKSkpCiAJCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CiAJCX0KKwkJLyogVHVybiBSVFMvQ1RTIHJhdGUgdG8gNk1icHMuICovCisJCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDApCisJCSAgICAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyAhPSAwKSkgeworCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0KKwkJCSAgICBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJaWYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24pIHsKKwkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX0ZPUkNFUlRTQ1RTLAorCQkJCQkJICBBTExOX1NFVFBST1RFQ1QsIFRSVUUsCisJCQkJCQkgIChCT09MRUFOKSBwQWQtPk1sbWVBdXguCisJCQkJCQkgIEFkZEh0SW5mby5BZGRIdEluZm8yLgorCQkJCQkJICBOb25HZlByZXNlbnQpOworCQkJfSBlbHNlIHsKKwkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uCisJCQkJCQkgIEFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLAorCQkJCQkJICBBTExOX1NFVFBST1RFQ1QsIFRSVUUsCisJCQkJCQkgIChCT09MRUFOKSBwQWQtPk1sbWVBdXguCisJCQkJCQkgIEFkZEh0SW5mby5BZGRIdEluZm8yLgorCQkJCQkJICBOb25HZlByZXNlbnQpOworCQkJfQorCQl9IGVsc2UgaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gOCkKKwkJCSAgICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDgpKSB7CisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPQorCQkJICAgIHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQlpZiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbikgeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsCisJCQkJCQkgIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwKKwkJCQkJCSAgKEJPT0xFQU4pIHBBZC0+TWxtZUF1eC4KKwkJCQkJCSAgQWRkSHRJbmZvLkFkZEh0SW5mbzIuCisJCQkJCQkgIE5vbkdmUHJlc2VudCk7CisJCQl9IGVsc2UgeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby4KKwkJCQkJCSAgQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsCisJCQkJCQkgIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwKKwkJCQkJCSAgKEJPT0xFQU4pIHBBZC0+TWxtZUF1eC4KKwkJCQkJCSAgQWRkSHRJbmZvLkFkZEh0SW5mbzIuCisJCQkJCQkgIE5vbkdmUHJlc2VudCk7CisJCQl9CisJCX0gZWxzZSBpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyAhPSAwKQorCQkJICAgJiYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gMCkpIHsKKwkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfUlRTQ1RTXzZNLCBBTExOX1NFVFBST1RFQ1QsCisJCQkJCSAgVFJVRSwKKwkJCQkJICAoQk9PTEVBTikgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby4KKwkJCQkJICBBZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CiAKLQkJLy8gVHVybiBSVFMvQ1RTIHJhdGUgdG8gNk1icHMuCi0JCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDApICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDApKQotCQl7Ci0JCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJCWlmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uKQotCQkJewotCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gOCkgJiYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gOCkpCi0JCXsKLQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwkJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOwotCQkJaWYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24pCi0JCQl7Ci0JCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9GT1JDRVJUU0NUUywgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyAhPSAwKSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAwKSkKLQkJewotCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9SVFNDVFNfNk0sIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7Ci0KLQkJfQotCQllbHNlIGlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDgpICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTID09IDgpKQotCQl7Ci0JCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX1JUU0NUU182TSwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKKwkJfSBlbHNlIGlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDgpCisJCQkgICAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9PSA4KSkgeworCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9SVFNDVFNfNk0sIEFMTE5fU0VUUFJPVEVDVCwKKwkJCQkJICBUUlVFLAorCQkJCQkgIChCT09MRUFOKSBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLgorCQkJCQkgIEFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKIAkJfQogCi0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQzsKLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJOwotCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOwotCi0JCWlmICgocEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9IVEdSRUVORklFTEQpICYmCi0JCSAgICBwQWQtPldJRkl0ZXN0YmVkLmJHcmVlbkZpZWxkKQotCQkgICAgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRHUkVFTkZJRUxEOworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkM7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPQorCQkgICAgcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwkJaWYgKChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUR1JFRU5GSUVMRCkKKwkJICAgICYmIHBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQpCisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CiAJfQogCi0JcEFkLT5MYXN0VHhSYXRlID0gKFVTSE9SVCkocEVudHJ5LT5IVFBoeU1vZGUud29yZCk7CisJcEFkLT5MYXN0VHhSYXRlID0gKHUxNikocEVudHJ5LT5IVFBoeU1vZGUud29yZCk7CiB9CiAKIC8qCkBAIC0xOTk2LDQ3ICsxODQwLDM5IEBACiAJCWNhbGwgdGhpcyByb3V0aW5lIGV2ZXJ5IHNlY29uZAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlVQ0hBUgkJCQkJVXBSYXRlSWR4ID0gMCwgRG93blJhdGVJZHggPSAwLCBDdXJyUmF0ZUlkeDsKLQlVTE9ORwkJCQkJaSwgQWNjdVR4VG90YWxDbnQgPSAwLCBUeFRvdGFsQ250OwotCVVMT05HCQkJCQlUeEVycm9yUmF0aW8gPSAwOwotCUJPT0xFQU4JCQkJCWJUeFJhdGVDaGFuZ2VkLCBiVXBncmFkZVF1YWxpdHkgPSBGQUxTRTsKLQlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGUgPSBOVUxMOwotCVBVQ0hBUgkJCQkJcFRhYmxlOwotCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOwotCVVDSEFSCQkJCQlJbml0VHhSYXRlSWR4ID0gMCwgVHJhaW5VcCwgVHJhaW5Eb3duOwotCUNIQVIJCQkJCVJzc2ksIFJzc2lPZmZzZXQgPSAwOwotCVRYX1NUQV9DTlQxX1NUUlVDCQlTdGFUeDE7Ci0JVFhfU1RBX0NOVDBfU1RSVUMJCVR4U3RhQ250MDsKLQlVTE9ORwkJCQkJVHhSZXRyYW5zbWl0ID0gMCwgVHhTdWNjZXNzID0gMCwgVHhGYWlsQ291bnQgPSAwOwotCU1BQ19UQUJMRV9FTlRSWQkJCSpwRW50cnk7CisJdTggVXBSYXRlSWR4ID0gMCwgRG93blJhdGVJZHggPSAwLCBDdXJyUmF0ZUlkeDsKKwl1bnNpZ25lZCBsb25nIGksIEFjY3VUeFRvdGFsQ250ID0gMCwgVHhUb3RhbENudDsKKwl1bnNpZ25lZCBsb25nIFR4RXJyb3JSYXRpbyA9IDA7CisJQk9PTEVBTiBiVHhSYXRlQ2hhbmdlZCA9IEZBTFNFLCBiVXBncmFkZVF1YWxpdHkgPSBGQUxTRTsKKwlzdHJ1Y3QgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCAqcEN1cnJUeFJhdGUsICpwTmV4dFR4UmF0ZSA9IE5VTEw7CisJdTggKnBUYWJsZTsKKwl1OCBUYWJsZVNpemUgPSAwOworCXU4IEluaXRUeFJhdGVJZHggPSAwLCBUcmFpblVwLCBUcmFpbkRvd247CisJY2hhciBSc3NpLCBSc3NpT2Zmc2V0ID0gMDsKKwlUWF9TVEFfQ05UMV9TVFJVQyBTdGFUeDE7CisJVFhfU1RBX0NOVDBfU1RSVUMgVHhTdGFDbnQwOworCXVuc2lnbmVkIGxvbmcgVHhSZXRyYW5zbWl0ID0gMCwgVHhTdWNjZXNzID0gMCwgVHhGYWlsQ291bnQgPSAwOworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeTsKKwlzdHJ1Y3QgcnRfcnNzaV9zYW1wbGUgKnBSc3NpID0gJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGU7CiAKLQkvLwotCS8vIHdhbGsgdGhyb3VnaCBNQUMgdGFibGUsIHNlZSBpZiBuZWVkIHRvIGNoYW5nZSBBUCdzIFRYIHJhdGUgdG93YXJkIGVhY2ggZW50cnkKLQkvLwotICAgCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCXsKKwkvKiAqLworCS8qIHdhbGsgdGhyb3VnaCBNQUMgdGFibGUsIHNlZSBpZiBuZWVkIHRvIGNoYW5nZSBBUCdzIFRYIHJhdGUgdG93YXJkIGVhY2ggZW50cnkgKi8KKwkvKiAqLworCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKSB7CiAJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOwogCi0JCS8vIGNoZWNrIGlmIHRoaXMgZW50cnkgbmVlZCB0byBzd2l0Y2ggcmF0ZSBhdXRvbWF0aWNhbGx5CisJCS8qIGNoZWNrIGlmIHRoaXMgZW50cnkgbmVlZCB0byBzd2l0Y2ggcmF0ZSBhdXRvbWF0aWNhbGx5ICovCiAJCWlmIChSVE1QQ2hlY2tFbnRyeUVuYWJsZUF1dG9SYXRlU3dpdGNoKHBBZCwgcEVudHJ5KSA9PSBGQUxTRSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmICgocEFkLT5NYWNUYWIuU2l6ZSA9PSAxKSB8fCAocEVudHJ5LT5WYWxpZEFzRGxzKSkKLQkJewotI2lmZGVmIFJUMjg2MAotCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgKENIQVIpcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCwgKENIQVIpcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSwgKENIQVIpcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMik7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKKwkJaWYgKChwQWQtPk1hY1RhYi5TaXplID09IDEpIHx8IChwRW50cnktPlZhbGlkQXNEbHMpKSB7CiAJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAotCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAsCi0JCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSwKLQkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKLSNlbmRpZgorCQkJCQkgICBwUnNzaS0+QXZnUnNzaTAsCisJCQkJCSAgIHBSc3NpLT5BdmdSc3NpMSwgcFJzc2ktPkF2Z1Jzc2kyKTsKIAotCQkJLy8gVXBkYXRlIHN0YXRpc3RpYyBjb3VudGVyCisJCQkvKiBVcGRhdGUgc3RhdGlzdGljIGNvdW50ZXIgKi8KIAkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDAsICZUeFN0YUNudDAud29yZCk7CiAJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmU3RhVHgxLndvcmQpOwogCQkJcEFkLT5iVXBkYXRlQmNuQ250RG9uZSA9IFRSVUU7CkBAIC0yMDQ1LDI5MSArMTg4MSwyOTMgQEAKIAkJCVR4RmFpbENvdW50ID0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwogCQkJVHhUb3RhbENudCA9IFR4UmV0cmFuc21pdCArIFR4U3VjY2VzcyArIFR4RmFpbENvdW50OwogCi0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwotCQkJcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOwotCQkJcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKLQkJCXBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LnUuTG93UGFydCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICs9CisJCQkgICAgU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArPQorCQkJICAgIFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICs9CisJCQkgICAgVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCQkJcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydCArPQorCQkJICAgIFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPQorCQkJICAgIFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0KKwkJCSAgICBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CiAKLQkJCS8vIGlmIG5vIHRyYWZmaWMgaW4gdGhlIHBhc3QgMS1zZWMgcGVyaW9kLCBkb24ndCBjaGFuZ2UgVFggcmF0ZSwKLQkJCS8vIGJ1dCBjbGVhciBhbGwgYmFkIGhpc3RvcnkuIGJlY2F1c2UgdGhlIGJhZCBoaXN0b3J5IG1heSBhZmZlY3QgdGhlIG5leHQKLQkJCS8vIENoYXJpb3QgdGhyb3VnaHB1dCB0ZXN0Ci0JCQlBY2N1VHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCi0JCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCi0JCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKwkJCS8qIGlmIG5vIHRyYWZmaWMgaW4gdGhlIHBhc3QgMS1zZWMgcGVyaW9kLCBkb24ndCBjaGFuZ2UgVFggcmF0ZSwgKi8KKwkJCS8qIGJ1dCBjbGVhciBhbGwgYmFkIGhpc3RvcnkuIGJlY2F1c2UgdGhlIGJhZCBoaXN0b3J5IG1heSBhZmZlY3QgdGhlIG5leHQgKi8KKwkJCS8qIENoYXJpb3QgdGhyb3VnaHB1dCB0ZXN0ICovCisJCQlBY2N1VHhUb3RhbENudCA9CisJCQkgICAgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkJCSAgICBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCSAgICBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OwogCiAJCQlpZiAoVHhUb3RhbENudCkKLQkJCQlUeEVycm9yUmF0aW8gPSAoKFR4UmV0cmFuc21pdCArIFR4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OwotCQl9Ci0JCWVsc2UKLQkJewotI2lmZGVmIFJUMjg2MAotCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgKENIQVIpcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLCAoQ0hBUilwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEsIChDSEFSKXBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKKwkJCQlUeEVycm9yUmF0aW8gPQorCQkJCSAgICAoKFR4UmV0cmFuc21pdCArCisJCQkJICAgICAgVHhGYWlsQ291bnQpICogMTAwKSAvIFR4VG90YWxDbnQ7CisJCX0gZWxzZSB7CiAJCQlpZiAoSU5GUkFfT04ocEFkKSAmJiAoaSA9PSAxKSkKIAkJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAotCQkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLAotCQkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLAotCQkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKwkJCQkJCSAgIHBSc3NpLT5BdmdSc3NpMCwKKwkJCQkJCSAgIHBSc3NpLT5BdmdSc3NpMSwKKwkJCQkJCSAgIHBSc3NpLT5BdmdSc3NpMik7CiAJCQllbHNlCiAJCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKLQkJCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLAotCQkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEsCi0JCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7Ci0jZW5kaWYKKwkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCwKKwkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMSwKKwkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7CiAKIAkJCVR4VG90YWxDbnQgPSBwRW50cnktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKwotCQkJCSBwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKLQkJCQkgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudDsKKwkJCSAgICBwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCSAgICBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50OwogCiAJCQlpZiAoVHhUb3RhbENudCkKLQkJCQlUeEVycm9yUmF0aW8gPSAoKHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKyBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OworCQkJCVR4RXJyb3JSYXRpbyA9CisJCQkJICAgICgocEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArCisJCQkJICAgICAgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudCkgKiAxMDApIC8KKwkJCQkgICAgVHhUb3RhbENudDsKKwkJfQorCisJCWlmIChUeFRvdGFsQ250KSB7CisJCQkvKgorCQkJICAgVGhyZWUgQWRIb2MgY29ubmVjdGlvbnMgY2FuIG5vdCB3b3JrIG5vcm1hbGx5IGlmIG9uZSBBZEhvYyBjb25uZWN0aW9uIGlzIGRpc2FwcGVhcmVkIGZyb20gYSBoZWF2eSB0cmFmZmljIGVudmlyb25tZW50IGdlbmVyYXRlZCBieSBwaW5nIHRvb2wKKwkJCSAgIFdlIGZvcmNlIHRvIHNldCBMb25nUnR5TGltaXQgYW5kIFNob3J0UnR5TGltaXQgdG8gMCB0byBzdG9wIHJldHJhbnNtaXR0aW5nIHBhY2tldCwgYWZ0ZXIgYSB3aGlsZSwgcmVzb3Jpbmcgb3JpZ2luYWwgc2V0dGluZ3MKKwkJCSAqLworCQkJaWYgKFR4RXJyb3JSYXRpbyA9PSAxMDApIHsKKwkJCQlUWF9SVFlfQ0ZHX1NUUlVDIFR4UnR5Q2ZnLCBUeFJ0eUNmZ3RtcDsKKwkJCQl1bnNpZ25lZCBsb25nIEluZGV4OworCQkJCXVuc2lnbmVkIGxvbmcgTUFDVmFsdWU7CisKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUWV9DRkcsICZUeFJ0eUNmZy53b3JkKTsKKwkJCQlUeFJ0eUNmZ3RtcC53b3JkID0gVHhSdHlDZmcud29yZDsKKwkJCQlUeFJ0eUNmZy5maWVsZC5Mb25nUnR5TGltaXQgPSAweDA7CisJCQkJVHhSdHlDZmcuZmllbGQuU2hvcnRSdHlMaW1pdCA9IDB4MDsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFlfQ0ZHLCBUeFJ0eUNmZy53b3JkKTsKKworCQkJCVJUTVB1c2VjRGVsYXkoMSk7CisKKwkJCQlJbmRleCA9IDA7CisJCQkJTUFDVmFsdWUgPSAwOworCQkJCWRvIHsKKwkJCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWFJYUV9QQ05ULAorCQkJCQkJICAgICAgICZNQUNWYWx1ZSk7CisJCQkJCWlmICgoTUFDVmFsdWUgJiAweGZmZmZmZikgPT0gMCkKKwkJCQkJCWJyZWFrOworCQkJCQlJbmRleCsrOworCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQkJCX0gd2hpbGUgKChJbmRleCA8IDMzMCkKKwkJCQkJICYmCisJCQkJCSAoIVJUTVBfVEVTVF9GTEFHCisJCQkJCSAgKHBBZCwKKwkJCQkJICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkpOworCisJCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9SVFlfQ0ZHLCAmVHhSdHlDZmcud29yZCk7CisJCQkJVHhSdHlDZmcuZmllbGQuTG9uZ1J0eUxpbWl0ID0KKwkJCQkgICAgVHhSdHlDZmd0bXAuZmllbGQuTG9uZ1J0eUxpbWl0OworCQkJCVR4UnR5Q2ZnLmZpZWxkLlNob3J0UnR5TGltaXQgPQorCQkJCSAgICBUeFJ0eUNmZ3RtcC5maWVsZC5TaG9ydFJ0eUxpbWl0OworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1JUWV9DRkcsIFR4UnR5Q2ZnLndvcmQpOworCQkJfQogCQl9CiAKIAkJQ3VyclJhdGVJZHggPSBwRW50cnktPkN1cnJUeFJhdGVJbmRleDsKIAotCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZJbml0VHhSYXRlSWR4KTsKKwkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLAorCQkJCSAgICAgICZJbml0VHhSYXRlSWR4KTsKIAotCQlpZiAoQ3VyclJhdGVJZHggPj0gVGFibGVTaXplKQotCQl7CisJCWlmIChDdXJyUmF0ZUlkeCA+PSBUYWJsZVNpemUpIHsKIAkJCUN1cnJSYXRlSWR4ID0gVGFibGVTaXplIC0gMTsKIAkJfQotCi0JCS8vIFdoZW4gc3dpdGNoIGZyb20gRml4ZWQgcmF0ZSAtPiBhdXRvIHJhdGUsIHRoZSBSRUFMIFRYIHJhdGUgbWlnaHQgYmUgZGlmZmVyZW50IGZyb20gcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXguCi0JCS8vIFNvIG5lZWQgdG8gc3luYyBoZXJlLgotCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoQ3VyclJhdGVJZHgrMSkqNV07CisJCS8qIFdoZW4gc3dpdGNoIGZyb20gRml4ZWQgcmF0ZSAtPiBhdXRvIHJhdGUsIHRoZSBSRUFMIFRYIHJhdGUgbWlnaHQgYmUgZGlmZmVyZW50IGZyb20gcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXguICovCisJCS8qIFNvIG5lZWQgdG8gc3luYyBoZXJlLiAqLworCQlwQ3VyclR4UmF0ZSA9CisJCSAgICAoc3RydWN0IHJ0X3J0bXBfdHhfcmF0ZV9zd2l0Y2ggKikgJiBwVGFibGVbKEN1cnJSYXRlSWR4ICsgMSkgKiA1XTsKIAkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gcEN1cnJUeFJhdGUtPkN1cnJNQ1MpCi0JCQkvLyYmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQotCQkJKQotCQl7CisJCSAgICAvKiYmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKSAqLworCQkgICAgKSB7CiAKLQkJCS8vIE5lZWQgdG8gc3luYyBSZWFsIFR4IHJhdGUgYW5kIG91ciByZWNvcmQuCi0JCQkvLyBUaGVuIHJldHVybiBmb3IgbmV4dCBEUlMuCi0JCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoSW5pdFR4UmF0ZUlkeCsxKSo1XTsKKwkJCS8qIE5lZWQgdG8gc3luYyBSZWFsIFR4IHJhdGUgYW5kIG91ciByZWNvcmQuICovCisJCQkvKiBUaGVuIHJldHVybiBmb3IgbmV4dCBEUlMuICovCisJCQlwQ3VyclR4UmF0ZSA9CisJCQkgICAgKHN0cnVjdCBydF9ydG1wX3R4X3JhdGVfc3dpdGNoICopICYgcFRhYmxlWyhJbml0VHhSYXRlSWR4ICsgMSkKKwkJCQkJCQkgICAgKiA1XTsKIAkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gSW5pdFR4UmF0ZUlkeDsKIAkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBDdXJyVHhSYXRlKTsKIAotCQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisJCQkvKiByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMgKi8KIAkJCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7CiAJCQljb250aW51ZTsKIAkJfQotCi0JCS8vIGRlY2lkZSB0aGUgbmV4dCB1cGdyYWRlIHJhdGUgYW5kIGRvd25ncmFkZSByYXRlLCBpZiBhbnkKLQkJaWYgKChDdXJyUmF0ZUlkeCA+IDApICYmIChDdXJyUmF0ZUlkeCA8IChUYWJsZVNpemUgLSAxKSkpCi0JCXsKKwkJLyogZGVjaWRlIHRoZSBuZXh0IHVwZ3JhZGUgcmF0ZSBhbmQgZG93bmdyYWRlIHJhdGUsIGlmIGFueSAqLworCQlpZiAoKEN1cnJSYXRlSWR4ID4gMCkgJiYgKEN1cnJSYXRlSWR4IDwgKFRhYmxlU2l6ZSAtIDEpKSkgewogCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHggKyAxOwotCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtMTsKLQkJfQotCQllbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAwKQotCQl7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0gMTsKKwkJfSBlbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAwKSB7CiAJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7CiAJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4OwotCQl9Ci0JCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IChUYWJsZVNpemUgLSAxKSkKLQkJeworCQl9IGVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IChUYWJsZVNpemUgLSAxKSkgewogCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHg7CiAJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0gMTsKIAkJfQogCi0JCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhDdXJyUmF0ZUlkeCsxKSo1XTsKKwkJcEN1cnJUeFJhdGUgPQorCQkgICAgKHN0cnVjdCBydF9ydG1wX3R4X3JhdGVfc3dpdGNoICopICYgcFRhYmxlWyhDdXJyUmF0ZUlkeCArIDEpICogNV07CiAKLQkJaWYgKChSc3NpID4gLTY1KSAmJiAocEN1cnJUeFJhdGUtPk1vZGUgPj0gTU9ERV9IVE1JWCkpCi0JCXsKLQkJCVRyYWluVXAJCT0gKHBDdXJyVHhSYXRlLT5UcmFpblVwICsgKHBDdXJyVHhSYXRlLT5UcmFpblVwID4+IDEpKTsKLQkJCVRyYWluRG93bgk9IChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duICsgKHBDdXJyVHhSYXRlLT5UcmFpbkRvd24gPj4gMSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJVHJhaW5VcAkJPSBwQ3VyclR4UmF0ZS0+VHJhaW5VcDsKLQkJCVRyYWluRG93bgk9IHBDdXJyVHhSYXRlLT5UcmFpbkRvd247CisJCWlmICgoUnNzaSA+IC02NSkgJiYgKHBDdXJyVHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpKSB7CisJCQlUcmFpblVwID0KKwkJCSAgICAocEN1cnJUeFJhdGUtPlRyYWluVXAgKworCQkJICAgICAocEN1cnJUeFJhdGUtPlRyYWluVXAgPj4gMSkpOworCQkJVHJhaW5Eb3duID0KKwkJCSAgICAocEN1cnJUeFJhdGUtPlRyYWluRG93biArCisJCQkgICAgIChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duID4+IDEpKTsKKwkJfSBlbHNlIHsKKwkJCVRyYWluVXAgPSBwQ3VyclR4UmF0ZS0+VHJhaW5VcDsKKwkJCVRyYWluRG93biA9IHBDdXJyVHhSYXRlLT5UcmFpbkRvd247CiAJCX0KIAotCQkvL3BBZC0+RHJzQ291bnRlcnMuTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb24gPSBwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247CisJCS8qcEFkLT5EcnNDb3VudGVycy5MYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbiA9IHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbjsgKi8KIAotCQkvLwotCQkvLyBLZWVwIHRoZSBsYXN0IHRpbWUgVHhSYXRlQ2hhbmdlQWN0aW9uIHN0YXR1cy4KLQkJLy8KLQkJcEVudHJ5LT5MYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbiA9IHBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbjsKKwkJLyogKi8KKwkJLyogS2VlcCB0aGUgbGFzdCB0aW1lIFR4UmF0ZUNoYW5nZUFjdGlvbiBzdGF0dXMuICovCisJCS8qICovCisJCXBFbnRyeS0+TGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb24gPQorCQkgICAgcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOwogCisJCS8qICovCisJCS8qIENBU0UgMS4gd2hlbiBUWCBzYW1wbGVzIGFyZSBmZXdlciB0aGFuIDE1LCB0aGVuIGRlY2lkZSBUWCByYXRlIHNvbGVseSBvbiBSU1NJICovCisJCS8qICAgICAgICAgKGNyaXRlcmlhIGNvcGllZCBmcm9tIFJUMjUwMCBmb3IgTmV0b3BpYSBjYXNlKSAqLworCQkvKiAqLworCQlpZiAoVHhUb3RhbENudCA8PSAxNSkgeworCQkJY2hhciBpZHggPSAwOworCQkJdTggVHhSYXRlSWR4OworCQkJdTggTUNTMCA9IDAsIE1DUzEgPSAwLCBNQ1MyID0gMCwgTUNTMyA9IDAsIE1DUzQgPQorCQkJICAgIDAsIE1DUzUgPSAwLCBNQ1M2ID0gMCwgTUNTNyA9IDA7CisJCQl1OCBNQ1MxMiA9IDAsIE1DUzEzID0gMCwgTUNTMTQgPSAwLCBNQ1MxNSA9IDA7CisJCQl1OCBNQ1MyMCA9IDAsIE1DUzIxID0gMCwgTUNTMjIgPSAwLCBNQ1MyMyA9IDA7CS8qIDMqMyAqLwogCisJCQkvKiBjaGVjayB0aGUgZXhpc3RlbmNlIGFuZCBpbmRleCBvZiBlYWNoIG5lZWRlZCBNQ1MgKi8KKwkJCXdoaWxlIChpZHggPCBwVGFibGVbMF0pIHsKKwkJCQlwQ3VyclR4UmF0ZSA9CisJCQkJICAgIChzdHJ1Y3QgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCAqKSAmIHBUYWJsZVsoaWR4ICsgMSkgKgorCQkJCQkJCQkgICAgNV07CiAKLQkJLy8KLQkJLy8gQ0FTRSAxLiB3aGVuIFRYIHNhbXBsZXMgYXJlIGZld2VyIHRoYW4gMTUsIHRoZW4gZGVjaWRlIFRYIHJhdGUgc29sZWx5IG9uIFJTU0kKLQkJLy8gICAgICAgICAoY3JpdGVyaWEgY29waWVkIGZyb20gUlQyNTAwIGZvciBOZXRvcGlhIGNhc2UpCi0JCS8vCi0JCWlmIChUeFRvdGFsQ250IDw9IDE1KQotCQl7Ci0JCQlDSEFSCWlkeCA9IDA7Ci0JCQlVQ0hBUglUeFJhdGVJZHg7Ci0JCQkvL1VDSEFSCU1DUzAgPSAwLCBNQ1MxID0gMCwgTUNTMiA9IDAsIE1DUzMgPSAwLCBNQ1M0ID0gMCwgTUNTNyA9IDAsIE1DUzEyID0gMCwgTUNTMTMgPSAwLCBNQ1MxNCA9IDAsIE1DUzE1ID0gMDsKLQkJCVVDSEFSCU1DUzAgPSAwLCBNQ1MxID0gMCwgTUNTMiA9IDAsIE1DUzMgPSAwLCBNQ1M0ID0gMCwgIE1DUzUgPTAsIE1DUzYgPSAwLCBNQ1M3ID0gMDsKLQkgICAgICAgIFVDSEFSCU1DUzEyID0gMCwgTUNTMTMgPSAwLCBNQ1MxNCA9IDAsIE1DUzE1ID0gMDsKLQkJCVVDSEFSCU1DUzIwID0gMCwgTUNTMjEgPSAwLCBNQ1MyMiA9IDAsIE1DUzIzID0gMDsgLy8gMyozCi0KLQkJCS8vIGNoZWNrIHRoZSBleGlzdGVuY2UgYW5kIGluZGV4IG9mIGVhY2ggbmVlZGVkIE1DUwotCQkJd2hpbGUgKGlkeCA8IHBUYWJsZVswXSkKLQkJCXsKLQkJCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoaWR4KzEpKjVdOwotCi0JCQkJaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18wKQotCQkJCXsKKwkJCQlpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzApIHsKIAkJCQkJTUNTMCA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzEpCi0JCQkJeworCQkJCX0gZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzEpIHsKIAkJCQkJTUNTMSA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIpCi0JCQkJeworCQkJCX0gZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIpIHsKIAkJCQkJTUNTMiA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzMpCi0JCQkJeworCQkJCX0gZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzMpIHsKIAkJCQkJTUNTMyA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzQpCi0JCQkJeworCQkJCX0gZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzQpIHsKIAkJCQkJTUNTNCA9IGlkeDsKKwkJCQl9IGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU181KSB7CisJCQkJCU1DUzUgPSBpZHg7CisJCQkJfSBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNikgeworCQkJCQlNQ1M2ID0gaWR4OwogCQkJCX0KLQkgICAgICAgICAgICBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNSkKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgIE1DUzUgPSBpZHg7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU182KQotCSAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgTUNTNiA9IGlkeDsKLQkgICAgICAgICAgICB9Ci0JCQkJLy9lbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNykKLQkJCQllbHNlIGlmICgocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzcpICYmIChwQ3VyclR4UmF0ZS0+U2hvcnRHSSA9PSBHSV84MDApKQkvLyBwcmV2ZW50IHRoZSBoaWdoZXN0IE1DUyB1c2luZyBzaG9ydCBHSSB3aGVuIDFUIGFuZCBsb3cgdGhyb3VnaHB1dAorCQkJCS8qZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzcpICovCisJCQkJZWxzZSBpZiAoKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU183KSAmJiAocEN1cnJUeFJhdGUtPlNob3J0R0kgPT0gR0lfODAwKSkJLyogcHJldmVudCB0aGUgaGlnaGVzdCBNQ1MgdXNpbmcgc2hvcnQgR0kgd2hlbiAxVCBhbmQgbG93IHRocm91Z2hwdXQgKi8KIAkJCQl7CiAJCQkJCU1DUzcgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xMikKLQkJCQl7CisJCQkJfSBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTIpIHsKIAkJCQkJTUNTMTIgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xMykKLQkJCQl7CisJCQkJfSBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTMpIHsKIAkJCQkJTUNTMTMgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xNCkKLQkJCQl7CisJCQkJfSBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTQpIHsKIAkJCQkJTUNTMTQgPSBpZHg7CiAJCQkJfQotCQkJCWVsc2UgaWYgKChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTUpICYmIChwQ3VyclR4UmF0ZS0+U2hvcnRHSSA9PSBHSV84MDApKQkvL3dlIGhvcGUgdG8gdXNlIFNob3J0R0kgYXMgaW5pdGlhbCByYXRlLCBob3dldmVyIEF0aGVyb3MncyBjaGlwIGhhcyBidWdzIHdoZW4gc2hvcnQgR0kKKwkJCQllbHNlIGlmICgocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzE1KSAmJiAocEN1cnJUeFJhdGUtPlNob3J0R0kgPT0gR0lfODAwKSkJLyp3ZSBob3BlIHRvIHVzZSBTaG9ydEdJIGFzIGluaXRpYWwgcmF0ZSwgaG93ZXZlciBBdGhlcm9zJ3MgY2hpcCBoYXMgYnVncyB3aGVuIHNob3J0IEdJICovCiAJCQkJewogCQkJCQlNQ1MxNSA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIwKSAvLyAzKjMKKwkJCQl9IGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMCkJLyogMyozICovCiAJCQkJewogCQkJCQlNQ1MyMCA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIxKQotCQkJCXsKKwkJCQl9IGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMSkgewogCQkJCQlNQ1MyMSA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIyKQotCQkJCXsKKwkJCQl9IGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMikgewogCQkJCQlNQ1MyMiA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIzKQotCQkJCXsKKwkJCQl9IGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMykgewogCQkJCQlNQ1MyMyA9IGlkeDsKIAkJCQl9Ci0JCQkJaWR4ICsrOworCQkJCWlkeCsrOwogCQkJfQogCi0JCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQotCQkJewotCQkJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHKQotCQkJCXsKKwkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpIHsKKwkJCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRykgewogCQkJCQlSc3NpT2Zmc2V0ID0gMjsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKKwkJCQl9IGVsc2UgewogCQkJCQlSc3NpT2Zmc2V0ID0gNTsKIAkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckEpCi0JCQkJeworCQkJfSBlbHNlIHsKKwkJCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yQSkgewogCQkJCQlSc3NpT2Zmc2V0ID0gNTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKKwkJCQl9IGVsc2UgewogCQkJCQlSc3NpT2Zmc2V0ID0gODsKIAkJCQl9CiAJCQl9CiAKLQkJCS8qaWYgKE1DUzE1KSovCi0JCQlpZiAoKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjNTKSB8fAotCQkJCShwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOM1MpIHx8Ci0JCQkJKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUpKQotCQkJey8vIE4gbW9kZSB3aXRoIDMgc3RyZWFtIC8vIDMqMworCQkJLyppZiAoTUNTMTUpICovCisJCQlpZiAoKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjNTKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjNTKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZSkpIHsJLyogTiBtb2RlIHdpdGggMyBzdHJlYW0gLy8gMyozICovCiAJCQkJaWYgKE1DUzIzICYmIChSc3NpID49IC03MCkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzE1OworCQkJCQlUeFJhdGVJZHggPSBNQ1MyMzsKIAkJCQllbHNlIGlmIChNQ1MyMiAmJiAoUnNzaSA+PSAtNzIpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MxNDsKLSAgICAgICAgCSAgICBlbHNlIGlmIChNQ1MyMSAmJiAoUnNzaSA+PSAtNzYpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MxMzsKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMjI7CisJCQkJZWxzZSBpZiAoTUNTMjEgJiYgKFJzc2kgPj0gLTc2KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMjE7CiAJCQkJZWxzZSBpZiAoTUNTMjAgJiYgKFJzc2kgPj0gLTc4KSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMTI7Ci0JCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID49IC04MikpCi0JCQkJVHhSYXRlSWR4ID0gTUNTNDsKLQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPj0gLTg0KSkKLQkJCQlUeFJhdGVJZHggPSBNQ1MzOwotCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+PSAtODYpKQotCQkJCVR4UmF0ZUlkeCA9IE1DUzI7Ci0JCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID49IC04OCkpCi0JCQkJVHhSYXRlSWR4ID0gTUNTMTsKLQkJCWVsc2UKLQkJCQlUeFJhdGVJZHggPSBNQ1MwOwotCQl9Ci0JCWVsc2UgaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmQpIHx8KHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4yUykgfHwocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQpKSAvLyAzKjMKLQkJCXsvLyBOIG1vZGUgd2l0aCAyIHN0cmVhbQotCQkJCWlmIChNQ1MxNSAmJiAoUnNzaSA+PSAoLTcwK1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMjA7CisJCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+PSAtODIpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M0OworCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPj0gLTg0KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMzsKKwkJCQllbHNlIGlmIChNQ1MyICYmIChSc3NpID49IC04NikpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzI7CisJCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+PSAtODgpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxOworCQkJCWVsc2UKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMDsKKwkJCX0KKy8qICAgICAgICAgICAgICBlbHNlIGlmICgocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlMpIHx8IChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kKSB8fChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOMlMpIHx8KHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZSkpICovCisJCQllbHNlIGlmICgocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlMpIHx8IChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQpKQkvKiAzKjMgKi8KKwkJCXsJLyogTiBtb2RlIHdpdGggMiBzdHJlYW0gKi8KKwkJCQlpZiAoTUNTMTUgJiYgKFJzc2kgPj0gKC03MCArIFJzc2lPZmZzZXQpKSkKIAkJCQkJVHhSYXRlSWR4ID0gTUNTMTU7Ci0JCQkJZWxzZSBpZiAoTUNTMTQgJiYgKFJzc2kgPj0gKC03MitSc3NpT2Zmc2V0KSkpCisJCQkJZWxzZSBpZiAoTUNTMTQgJiYgKFJzc2kgPj0gKC03MiArIFJzc2lPZmZzZXQpKSkKIAkJCQkJVHhSYXRlSWR4ID0gTUNTMTQ7Ci0JCQkJZWxzZSBpZiAoTUNTMTMgJiYgKFJzc2kgPj0gKC03NitSc3NpT2Zmc2V0KSkpCisJCQkJZWxzZSBpZiAoTUNTMTMgJiYgKFJzc2kgPj0gKC03NiArIFJzc2lPZmZzZXQpKSkKIAkJCQkJVHhSYXRlSWR4ID0gTUNTMTM7Ci0JCQkJZWxzZSBpZiAoTUNTMTIgJiYgKFJzc2kgPj0gKC03OCtSc3NpT2Zmc2V0KSkpCisJCQkJZWxzZSBpZiAoTUNTMTIgJiYgKFJzc2kgPj0gKC03OCArIFJzc2lPZmZzZXQpKSkKIAkJCQkJVHhSYXRlSWR4ID0gTUNTMTI7Ci0JCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+PSAoLTgyK1Jzc2lPZmZzZXQpKSkKKwkJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID49ICgtODIgKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7Ci0JCQkJZWxzZSBpZiAoTUNTMyAmJiAoUnNzaSA+PSAoLTg0K1Jzc2lPZmZzZXQpKSkKKwkJCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID49ICgtODQgKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzM7Ci0JCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+PSAoLTg2K1Jzc2lPZmZzZXQpKSkKKwkJCQllbHNlIGlmIChNQ1MyICYmIChSc3NpID49ICgtODYgKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzI7Ci0JCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+PSAoLTg4K1Jzc2lPZmZzZXQpKSkKKwkJCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID49ICgtODggKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzE7CiAJCQkJZWxzZQogCQkJCQlUeFJhdGVJZHggPSBNQ1MwOwotCQkJfQotCQkJZWxzZSBpZiAoKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjFTKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjFTKSkKLQkJCXsvLyBOIG1vZGUgd2l0aCAxIHN0cmVhbQotCQkJCWlmIChNQ1M3ICYmIChSc3NpID4gKC03MitSc3NpT2Zmc2V0KSkpCisJCQl9IGVsc2UgaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04xUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4xUykpIHsJLyogTiBtb2RlIHdpdGggMSBzdHJlYW0gKi8KKwkJCQlpZiAoTUNTNyAmJiAoUnNzaSA+ICgtNzIgKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzc7Ci0JCQkJZWxzZSBpZiAoTUNTNiAmJiAoUnNzaSA+ICgtNzQrUnNzaU9mZnNldCkpKQorCQkJCWVsc2UgaWYgKE1DUzYgJiYgKFJzc2kgPiAoLTc0ICsgUnNzaU9mZnNldCkpKQogCQkJCQlUeFJhdGVJZHggPSBNQ1M2OwotCQkJCWVsc2UgaWYgKE1DUzUgJiYgKFJzc2kgPiAoLTc3K1Jzc2lPZmZzZXQpKSkKKwkJCQllbHNlIGlmIChNQ1M1ICYmIChSc3NpID4gKC03NyArIFJzc2lPZmZzZXQpKSkKIAkJCQkJVHhSYXRlSWR4ID0gTUNTNTsKLQkJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID4gKC03OStSc3NpT2Zmc2V0KSkpCisJCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+ICgtNzkgKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7Ci0JCQkJZWxzZSBpZiAoTUNTMyAmJiAoUnNzaSA+ICgtODErUnNzaU9mZnNldCkpKQorCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPiAoLTgxICsgUnNzaU9mZnNldCkpKQogCQkJCQlUeFJhdGVJZHggPSBNQ1MzOwotCQkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPiAoLTgzK1Jzc2lPZmZzZXQpKSkKKwkJCQllbHNlIGlmIChNQ1MyICYmIChSc3NpID4gKC04MyArIFJzc2lPZmZzZXQpKSkKIAkJCQkJVHhSYXRlSWR4ID0gTUNTMjsKLQkJCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID4gKC04NitSc3NpT2Zmc2V0KSkpCisJCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+ICgtODYgKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzE7CiAJCQkJZWxzZQogCQkJCQlUeFJhdGVJZHggPSBNQ1MwOwotCQkJfQotCQkJZWxzZQotCQkJey8vIExlZ2FjeSBtb2RlCisJCQl9IGVsc2UgewkvKiBMZWdhY3kgbW9kZSAqLwogCQkJCWlmIChNQ1M3ICYmIChSc3NpID4gLTcwKSkKIAkJCQkJVHhSYXRlSWR4ID0gTUNTNzsKIAkJCQllbHNlIGlmIChNQ1M2ICYmIChSc3NpID4gLTc0KSkKQEAgLTIzMzgsNyArMjE3Niw3IEBACiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzU7CiAJCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+IC04MikpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7Ci0JCQkJZWxzZSBpZiAoTUNTNCA9PSAwKQkvLyBmb3IgQi1vbmx5IG1vZGUKKwkJCQllbHNlIGlmIChNQ1M0ID09IDApCS8qIGZvciBCLW9ubHkgbW9kZSAqLwogCQkJCQlUeFJhdGVJZHggPSBNQ1MzOwogCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPiAtODUpKQogCQkJCQlUeFJhdGVJZHggPSBNQ1MzOwpAQCAtMjM1MCwxMjkgKzIxODgsMTU4IEBACiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzA7CiAJCQl9CiAKKwkJCS8qICAgICAgICAgICAgICBpZiAoVHhSYXRlSWR4ICE9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KSAqLwogCQkJewogCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gVHhSYXRlSWR4OwotCQkJCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhwRW50cnktPkN1cnJUeFJhdGVJbmRleCsxKSo1XTsKKwkJCQlwTmV4dFR4UmF0ZSA9CisJCQkJICAgIChzdHJ1Y3QgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCAqKSAmCisJCQkJICAgIHBUYWJsZVsocEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggKyAxKSAqIDVdOwogCQkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBOZXh0VHhSYXRlKTsKIAkJCX0KIAotCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5UeFF1YWxpdHksIHNpemVvZihVU0hPUlQpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwotCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5QRVIsIHNpemVvZihVQ0hBUikgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlR4UXVhbGl0eSwKKwkJCQkgICAgICAgc2l6ZW9mKHUxNikqCisJCQkJICAgICAgIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+UEVSLAorCQkJCSAgICAgICBzaXplb2YodTgpKgorCQkJCSAgICAgICBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CiAJCQlwRW50cnktPmZMYXN0U2VjQWNjb3JkaW5nUlNTSSA9IFRSVUU7Ci0JCQkvLyByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMKKwkJCS8qIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycyAqLwogCQkJUkVTRVRfT05FX1NFQ19UWF9DTlQocEVudHJ5KTsKIAogCQkJY29udGludWU7CiAJCX0KIAotCQlpZiAocEVudHJ5LT5mTGFzdFNlY0FjY29yZGluZ1JTU0kgPT0gVFJVRSkKLQkJeworCQlpZiAocEVudHJ5LT5mTGFzdFNlY0FjY29yZGluZ1JTU0kgPT0gVFJVRSkgewogCQkJcEVudHJ5LT5mTGFzdFNlY0FjY29yZGluZ1JTU0kgPSBGQUxTRTsKIAkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDA7Ci0JCQkvLyByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMKKwkJCS8qIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycyAqLwogCQkJUkVTRVRfT05FX1NFQ19UWF9DTlQocEVudHJ5KTsKIAogCQkJY29udGludWU7CiAJCX0KIAotCQlkbwotCQl7Ci0JCQlCT09MRUFOCWJUcmFpblVwRG93biA9IEZBTFNFOworCQlkbyB7CisJCQlCT09MRUFOIGJUcmFpblVwRG93biA9IEZBTFNFOwogCi0JCQlwRW50cnktPkN1cnJUeFJhdGVTdGFibGVUaW1lICsrOworCQkJcEVudHJ5LT5DdXJyVHhSYXRlU3RhYmxlVGltZSsrOwogCi0JCQkvLyBkb3duZ3JhZGUgVFggcXVhbGl0eSBpZiBQRVIgPj0gUmF0ZS1Eb3duIHRocmVzaG9sZAotCQkJaWYgKFR4RXJyb3JSYXRpbyA+PSBUcmFpbkRvd24pCi0JCQl7CisJCQkvKiBkb3duZ3JhZGUgVFggcXVhbGl0eSBpZiBQRVIgPj0gUmF0ZS1Eb3duIHRocmVzaG9sZCAqLworCQkJaWYgKFR4RXJyb3JSYXRpbyA+PSBUcmFpbkRvd24pIHsKIAkJCQliVHJhaW5VcERvd24gPSBUUlVFOwotCQkJCXBFbnRyeS0+VHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOworCQkJCXBFbnRyeS0+VHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9CisJCQkJICAgIERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOwogCQkJfQotCQkJLy8gdXBncmFkZSBUWCBxdWFsaXR5IGlmIFBFUiA8PSBSYXRlLVVwIHRocmVzaG9sZAotCQkJZWxzZSBpZiAoVHhFcnJvclJhdGlvIDw9IFRyYWluVXApCi0JCQl7CisJCQkvKiB1cGdyYWRlIFRYIHF1YWxpdHkgaWYgUEVSIDw9IFJhdGUtVXAgdGhyZXNob2xkICovCisJCQllbHNlIGlmIChUeEVycm9yUmF0aW8gPD0gVHJhaW5VcCkgewogCQkJCWJUcmFpblVwRG93biA9IFRSVUU7CiAJCQkJYlVwZ3JhZGVRdWFsaXR5ID0gVFJVRTsKIAkJCQlpZiAocEVudHJ5LT5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdKQotCQkJCQlwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gLS07ICAvLyBxdWFsaXR5IHZlcnkgZ29vZCBpbiBDdXJyUmF0ZQorCQkJCQlwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0tLTsJLyogcXVhbGl0eSB2ZXJ5IGdvb2QgaW4gQ3VyclJhdGUgKi8KIAogCQkJCWlmIChwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSkKLQkJCQkJcEVudHJ5LT5UeFJhdGVVcFBlbmFsdHkgLS07CisJCQkJCXBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5LS07CiAJCQkJZWxzZSBpZiAocEVudHJ5LT5UeFF1YWxpdHlbVXBSYXRlSWR4XSkKLQkJCQkJcEVudHJ5LT5UeFF1YWxpdHlbVXBSYXRlSWR4XSAtLTsgICAgLy8gbWF5IGltcHJvdmUgbmV4dCBVUCByYXRlJ3MgcXVhbGl0eQorCQkJCQlwRW50cnktPlR4UXVhbGl0eVtVcFJhdGVJZHhdLS07CS8qIG1heSBpbXByb3ZlIG5leHQgVVAgcmF0ZSdzIHF1YWxpdHkgKi8KIAkJCX0KIAotCQkJcEVudHJ5LT5QRVJbQ3VyclJhdGVJZHhdID0gKFVDSEFSKVR4RXJyb3JSYXRpbzsKKwkJCXBFbnRyeS0+UEVSW0N1cnJSYXRlSWR4XSA9ICh1OClUeEVycm9yUmF0aW87CiAKLQkJCWlmIChiVHJhaW5VcERvd24pCi0JCQl7Ci0JCQkJLy8gcGVyZm9ybSBEUlMgLSBjb25zaWRlciBUeFJhdGUgRG93biBmaXJzdCwgdGhlbiByYXRlIHVwLgotCQkJCWlmICgoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpICYmIChwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPj0gRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQpKQotCQkJCXsKKwkJCWlmIChiVHJhaW5VcERvd24pIHsKKwkJCQkvKiBwZXJmb3JtIERSUyAtIGNvbnNpZGVyIFR4UmF0ZSBEb3duIGZpcnN0LCB0aGVuIHJhdGUgdXAuICovCisJCQkJaWYgKChDdXJyUmF0ZUlkeCAhPSBEb3duUmF0ZUlkeCkKKwkJCQkgICAgJiYgKHBFbnRyeS0+VHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA+PQorCQkJCQlEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORCkpIHsKIAkJCQkJcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPSBEb3duUmF0ZUlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKEN1cnJSYXRlSWR4ICE9IFVwUmF0ZUlkeCkgJiYgKHBFbnRyeS0+VHhRdWFsaXR5W1VwUmF0ZUlkeF0gPD0gMCkpCi0JCQkJeworCQkJCX0gZWxzZSBpZiAoKEN1cnJSYXRlSWR4ICE9IFVwUmF0ZUlkeCkKKwkJCQkJICAgJiYgKHBFbnRyeS0+VHhRdWFsaXR5W1VwUmF0ZUlkeF0gPD0KKwkJCQkJICAgICAgIDApKSB7CiAJCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gVXBSYXRlSWR4OwogCQkJCX0KIAkJCX0KIAkJfSB3aGlsZSAoRkFMU0UpOwogCi0JCS8vIGlmIHJhdGUtdXAgaGFwcGVuLCBjbGVhciBhbGwgYmFkIGhpc3Rvcnkgb2YgYWxsIFRYIHJhdGVzCi0JCWlmIChwRW50cnktPkN1cnJUeFJhdGVJbmRleCA+IEN1cnJSYXRlSWR4KQotCQl7CisJCS8qIGlmIHJhdGUtdXAgaGFwcGVuLCBjbGVhciBhbGwgYmFkIGhpc3Rvcnkgb2YgYWxsIFRYIHJhdGVzICovCisJCWlmIChwRW50cnktPkN1cnJUeFJhdGVJbmRleCA+IEN1cnJSYXRlSWR4KSB7CiAJCQlwRW50cnktPkN1cnJUeFJhdGVTdGFibGVUaW1lID0gMDsKIAkJCXBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5ID0gMDsKLQkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDE7IC8vIHJhdGUgVVAKLQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+VHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKLQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+UEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMTsJLyogcmF0ZSBVUCAqLworCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5UeFF1YWxpdHksCisJCQkJICAgICAgIHNpemVvZih1MTYpKgorCQkJCSAgICAgICBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlBFUiwKKwkJCQkgICAgICAgc2l6ZW9mKHU4KSoKKwkJCQkgICAgICAgTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwogCi0JCQkvLwotCQkJLy8gRm9yIFR4UmF0ZSBmYXN0IHRyYWluIHVwCi0JCQkvLwotCQkJaWYgKCFwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcpCi0JCQl7Ci0JCQkJUlRNUFNldFRpbWVyKCZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgMTAwKTsKKwkJCS8qICovCisJCQkvKiBGb3IgVHhSYXRlIGZhc3QgdHJhaW4gdXAgKi8KKwkJCS8qICovCisJCQlpZiAoIXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZykgeworCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuCisJCQkJCSAgICAgU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsCisJCQkJCSAgICAgMTAwKTsKIAotCQkJCXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IFRSVUU7CisJCQkJcEFkLT5TdGFDZmcuCisJCQkJICAgIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IFRSVUU7CiAJCQl9CiAJCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7CiAJCX0KLQkJLy8gaWYgcmF0ZS1kb3duIGhhcHBlbiwgb25seSBjbGVhciBEb3duUmF0ZSdzIGJhZCBoaXN0b3J5Ci0JCWVsc2UgaWYgKHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4IDwgQ3VyclJhdGVJZHgpCi0JCXsKKwkJLyogaWYgcmF0ZS1kb3duIGhhcHBlbiwgb25seSBjbGVhciBEb3duUmF0ZSdzIGJhZCBoaXN0b3J5ICovCisJCWVsc2UgaWYgKHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4IDwgQ3VyclJhdGVJZHgpIHsKIAkJCXBFbnRyeS0+Q3VyclR4UmF0ZVN0YWJsZVRpbWUgPSAwOwotCQkJcEVudHJ5LT5UeFJhdGVVcFBlbmFsdHkgPSAwOyAgICAgICAgICAgLy8gbm8gcGVuYWx0eQotCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMjsgLy8gcmF0ZSBET1dOCisJCQlwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSA9IDA7CS8qIG5vIHBlbmFsdHkgKi8KKwkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDI7CS8qIHJhdGUgRE9XTiAqLwogCQkJcEVudHJ5LT5UeFF1YWxpdHlbcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXhdID0gMDsKIAkJCXBFbnRyeS0+UEVSW3BFbnRyeS0+Q3VyclR4UmF0ZUluZGV4XSA9IDA7CiAKLQkJCS8vCi0JCQkvLyBGb3IgVHhSYXRlIGZhc3QgdHJhaW4gZG93bgotCQkJLy8KLQkJCWlmICghcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nKQotCQkJewotCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIDEwMCk7CisJCQkvKiAqLworCQkJLyogRm9yIFR4UmF0ZSBmYXN0IHRyYWluIGRvd24gKi8KKwkJCS8qICovCisJCQlpZiAoIXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZykgeworCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuCisJCQkJCSAgICAgU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsCisJCQkJCSAgICAgMTAwKTsKIAotCQkJCXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IFRSVUU7CisJCQkJcEFkLT5TdGFDZmcuCisJCQkJICAgIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IFRSVUU7CiAJCQl9CiAJCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPSAwOyAvLyByYXRlIG5vIGNoYW5nZQorCQl9IGVsc2UgeworCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMDsJLyogcmF0ZSBubyBjaGFuZ2UgKi8KIAkJCWJUeFJhdGVDaGFuZ2VkID0gRkFMU0U7CiAJCX0KIAogCQlwRW50cnktPkxhc3RUeE9rQ291bnQgPSBUeFN1Y2Nlc3M7Ci0KLQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCi0JCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7Ci0KLQkJcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KzEpKjVdOwotCQlpZiAoYlR4UmF0ZUNoYW5nZWQgJiYgcE5leHRUeFJhdGUpCiAJCXsKKwkJCXU4IHRtcFR4UmF0ZTsKKworCQkJLyogdG8gZml4IHRjcCBhY2sgaXNzdWUgKi8KKwkJCWlmICghYlR4UmF0ZUNoYW5nZWQKKwkJCSAgICAmJiAocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSZWNlaXZlZEJ5dGVDb3VudCA+CisJCQkJKHBBZC0+UmFsaW5rQ291bnRlcnMuCisJCQkJIE9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50ICogNSkpKSB7CisJCQkJdG1wVHhSYXRlID0gRG93blJhdGVJZHg7CisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgICAgICgiRFJTOiBSeCglZCkgaXMgNSB0aW1lcyBsYXJnZXIgdGhhbiBUeCglZCksIHVzZSBsb3cgcmF0ZSAoY3Vycj0lZCwgdG1wPSVkKVxuIiwKKwkJCQkJICAgICAgcEFkLT5SYWxpbmtDb3VudGVycy4KKwkJCQkJICAgICAgT25lU2VjUmVjZWl2ZWRCeXRlQ291bnQsCisJCQkJCSAgICAgIHBBZC0+UmFsaW5rQ291bnRlcnMuCisJCQkJCSAgICAgIE9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50LAorCQkJCQkgICAgICBwRW50cnktPkN1cnJUeFJhdGVJbmRleCwKKwkJCQkJICAgICAgdG1wVHhSYXRlKSk7CisJCQl9IGVsc2UgeworCQkJCXRtcFR4UmF0ZSA9IHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4OworCQkJfQorCisJCQlwTmV4dFR4UmF0ZSA9CisJCQkgICAgKHN0cnVjdCBydF9ydG1wX3R4X3JhdGVfc3dpdGNoICopICYgcFRhYmxlWyh0bXBUeFJhdGUgKyAxKSAqCisJCQkJCQkJICAgIDVdOworCQl9CisJCWlmIChiVHhSYXRlQ2hhbmdlZCAmJiBwTmV4dFR4UmF0ZSkgewogCQkJTWxtZVNldFR4UmF0ZShwQWQsIHBFbnRyeSwgcE5leHRUeFJhdGUpOwogCQl9CisJCS8qIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycyAqLworCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOwogCX0KIH0KIApAQCAtMjQ5MiwxMDMgKzIzNTksODQgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit2b2lkIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWModm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkJCSAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkJCSAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLAorCQkJCSAgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQogewotCVBSVE1QX0FEQVBURVIJCQlwQWQgPSAoUFJUTVBfQURBUFRFUilGdW5jdGlvbkNvbnRleHQ7Ci0JVUNIQVIJCQkJCVVwUmF0ZUlkeCA9IDAsIERvd25SYXRlSWR4ID0gMCwgQ3VyclJhdGVJZHggPSAwOwotCVVMT05HCQkJCQlUeFRvdGFsQ250OwotCVVMT05HCQkJCQlUeEVycm9yUmF0aW8gPSAwOwotI2lmZGVmIFJUMjg2MAotCUJPT0xFQU4JCQkJCWJUeFJhdGVDaGFuZ2VkID0gVFJVRTsgLy8sIGJVcGdyYWRlUXVhbGl0eSA9IEZBTFNFOwotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JQk9PTEVBTgkJCQkJYlR4UmF0ZUNoYW5nZWQ7IC8vLCBiVXBncmFkZVF1YWxpdHkgPSBGQUxTRTsKLSNlbmRpZgotCVBSVE1QX1RYX1JBVEVfU1dJVENICXBDdXJyVHhSYXRlLCBwTmV4dFR4UmF0ZSA9IE5VTEw7Ci0JUFVDSEFSCQkJCQlwVGFibGU7Ci0JVUNIQVIJCQkJCVRhYmxlU2l6ZSA9IDA7Ci0JVUNIQVIJCQkJCUluaXRUeFJhdGVJZHggPSAwLCBUcmFpblVwLCBUcmFpbkRvd247Ci0JVFhfU1RBX0NOVDFfU1RSVUMJCVN0YVR4MTsKLQlUWF9TVEFfQ05UMF9TVFJVQwkJVHhTdGFDbnQwOwotCUNIQVIJCQkJCVJzc2ksIHJhdGlvOwotCVVMT05HCQkJCQlUeFJldHJhbnNtaXQgPSAwLCBUeFN1Y2Nlc3MgPSAwLCBUeEZhaWxDb3VudCA9IDA7Ci0JTUFDX1RBQkxFX0VOVFJZCQkJKnBFbnRyeTsKLQlVTE9ORwkJCQkJaTsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKKwl1OCBVcFJhdGVJZHggPSAwLCBEb3duUmF0ZUlkeCA9IDAsIEN1cnJSYXRlSWR4ID0gMDsKKwl1bnNpZ25lZCBsb25nIFR4VG90YWxDbnQ7CisJdW5zaWduZWQgbG9uZyBUeEVycm9yUmF0aW8gPSAwOworCUJPT0xFQU4gYlR4UmF0ZUNoYW5nZWQ7CS8qLCBiVXBncmFkZVF1YWxpdHkgPSBGQUxTRTsgKi8KKwlzdHJ1Y3QgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCAqcEN1cnJUeFJhdGUsICpwTmV4dFR4UmF0ZSA9IE5VTEw7CisJdTggKnBUYWJsZTsKKwl1OCBUYWJsZVNpemUgPSAwOworCXU4IEluaXRUeFJhdGVJZHggPSAwLCBUcmFpblVwLCBUcmFpbkRvd247CisJVFhfU1RBX0NOVDFfU1RSVUMgU3RhVHgxOworCVRYX1NUQV9DTlQwX1NUUlVDIFR4U3RhQ250MDsKKwljaGFyIFJzc2ksIHJhdGlvOworCXVuc2lnbmVkIGxvbmcgVHhSZXRyYW5zbWl0ID0gMCwgVHhTdWNjZXNzID0gMCwgVHhGYWlsQ291bnQgPSAwOworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeTsKKwl1bnNpZ25lZCBsb25nIGk7CiAKIAlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBGQUxTRTsKIAotICAgIC8vCi0gICAgLy8gd2FsayB0aHJvdWdoIE1BQyB0YWJsZSwgc2VlIGlmIG5lZWQgdG8gY2hhbmdlIEFQJ3MgVFggcmF0ZSB0b3dhcmQgZWFjaCBlbnRyeQotICAgIC8vCi0JZm9yIChpID0gMTsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCi0JeworCS8qICovCisJLyogd2FsayB0aHJvdWdoIE1BQyB0YWJsZSwgc2VlIGlmIG5lZWQgdG8gY2hhbmdlIEFQJ3MgVFggcmF0ZSB0b3dhcmQgZWFjaCBlbnRyeSAqLworCS8qICovCisJZm9yIChpID0gMTsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspIHsKIAkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CiAKLQkJLy8gY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkKKwkJLyogY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkgKi8KIAkJaWYgKFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2gocEFkLCBwRW50cnkpID09IEZBTFNFKQogCQkJY29udGludWU7CiAKLSNpZmRlZiBSVDI4NjAKLQkJLy9Sc3NpID0gUlRNUE1heFJzc2kocEFkLCAoQ0hBUilwQWQtPlN0YUNmZy5BdmdSc3NpMCwgKENIQVIpcEFkLT5TdGFDZmcuQXZnUnNzaTEsIChDSEFSKXBBZC0+U3RhQ2ZnLkF2Z1Jzc2kyKTsKLQkgICAgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPiAxKQotCQkJUnNzaSA9IChwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwICsgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSkgPj4gMTsKLQkJZWxzZQotCQkJUnNzaSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTA7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKIAkJaWYgKElORlJBX09OKHBBZCkgJiYgKGkgPT0gMSkpCiAJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAotCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAsCi0JCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSwKLQkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKwkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCwKKwkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSwKKwkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMik7CiAJCWVsc2UKIAkJCVJzc2kgPSBSVE1QTWF4UnNzaShwQWQsCi0JCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLAotCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMSwKLQkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTIpOwotI2VuZGlmCisJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCwKKwkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLAorCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTIpOwogCiAJCUN1cnJSYXRlSWR4ID0gcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXg7CiAKLQkJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJkluaXRUeFJhdGVJZHgpOworCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsCisJCQkJICAgICAgJkluaXRUeFJhdGVJZHgpOwogCi0JCS8vIGRlY2lkZSB0aGUgbmV4dCB1cGdyYWRlIHJhdGUgYW5kIGRvd25ncmFkZSByYXRlLCBpZiBhbnkKLQkJaWYgKChDdXJyUmF0ZUlkeCA+IDApICYmIChDdXJyUmF0ZUlkeCA8IChUYWJsZVNpemUgLSAxKSkpCi0JCXsKKwkJLyogZGVjaWRlIHRoZSBuZXh0IHVwZ3JhZGUgcmF0ZSBhbmQgZG93bmdyYWRlIHJhdGUsIGlmIGFueSAqLworCQlpZiAoKEN1cnJSYXRlSWR4ID4gMCkgJiYgKEN1cnJSYXRlSWR4IDwgKFRhYmxlU2l6ZSAtIDEpKSkgewogCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHggKyAxOwotCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtMTsKLQkJfQotCQllbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAwKQotCQl7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0gMTsKKwkJfSBlbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAwKSB7CiAJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7CiAJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4OwotCQl9Ci0JCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IChUYWJsZVNpemUgLSAxKSkKLQkJeworCQl9IGVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IChUYWJsZVNpemUgLSAxKSkgewogCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHg7CiAJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0gMTsKIAkJfQogCi0JCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhDdXJyUmF0ZUlkeCsxKSo1XTsKKwkJcEN1cnJUeFJhdGUgPQorCQkgICAgKHN0cnVjdCBydF9ydG1wX3R4X3JhdGVfc3dpdGNoICopICYgcFRhYmxlWyhDdXJyUmF0ZUlkeCArIDEpICogNV07CiAKLQkJaWYgKChSc3NpID4gLTY1KSAmJiAocEN1cnJUeFJhdGUtPk1vZGUgPj0gTU9ERV9IVE1JWCkpCi0JCXsKLQkJCVRyYWluVXAJCT0gKHBDdXJyVHhSYXRlLT5UcmFpblVwICsgKHBDdXJyVHhSYXRlLT5UcmFpblVwID4+IDEpKTsKLQkJCVRyYWluRG93bgk9IChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duICsgKHBDdXJyVHhSYXRlLT5UcmFpbkRvd24gPj4gMSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJVHJhaW5VcAkJPSBwQ3VyclR4UmF0ZS0+VHJhaW5VcDsKLQkJCVRyYWluRG93bgk9IHBDdXJyVHhSYXRlLT5UcmFpbkRvd247CisJCWlmICgoUnNzaSA+IC02NSkgJiYgKHBDdXJyVHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpKSB7CisJCQlUcmFpblVwID0KKwkJCSAgICAocEN1cnJUeFJhdGUtPlRyYWluVXAgKworCQkJICAgICAocEN1cnJUeFJhdGUtPlRyYWluVXAgPj4gMSkpOworCQkJVHJhaW5Eb3duID0KKwkJCSAgICAocEN1cnJUeFJhdGUtPlRyYWluRG93biArCisJCQkgICAgIChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duID4+IDEpKTsKKwkJfSBlbHNlIHsKKwkJCVRyYWluVXAgPSBwQ3VyclR4UmF0ZS0+VHJhaW5VcDsKKwkJCVRyYWluRG93biA9IHBDdXJyVHhSYXRlLT5UcmFpbkRvd247CiAJCX0KIAotCQlpZiAocEFkLT5NYWNUYWIuU2l6ZSA9PSAxKQotCQl7Ci0JCQkvLyBVcGRhdGUgc3RhdGlzdGljIGNvdW50ZXIKKwkJaWYgKHBBZC0+TWFjVGFiLlNpemUgPT0gMSkgeworCQkJLyogVXBkYXRlIHN0YXRpc3RpYyBjb3VudGVyICovCiAJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmVHhTdGFDbnQwLndvcmQpOwogCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMSwgJlN0YVR4MS53b3JkKTsKIApAQCAtMjU5NywxMjMgKzI0NDUsMTM4IEBACiAJCQlUeEZhaWxDb3VudCA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKIAkJCVR4VG90YWxDbnQgPSBUeFJldHJhbnNtaXQgKyBUeFN1Y2Nlc3MgKyBUeEZhaWxDb3VudDsKIAotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OwotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKLQkJCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQkJCXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7Ci0JCQlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArPQorCQkJICAgIFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKz0KKwkJCSAgICBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCArPQorCQkJICAgIFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0KKwkJCSAgICBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC51Lkxvd1BhcnQgKz0KKwkJCSAgICBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0ICs9CisJCQkgICAgVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwogCiAJCQlpZiAoVHhUb3RhbENudCkKLQkJCQlUeEVycm9yUmF0aW8gPSAoKFR4UmV0cmFuc21pdCArIFR4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OwotCQl9Ci0JCWVsc2UKLQkJeworCQkJCVR4RXJyb3JSYXRpbyA9CisJCQkJICAgICgoVHhSZXRyYW5zbWl0ICsKKwkJCQkgICAgICBUeEZhaWxDb3VudCkgKiAxMDApIC8gVHhUb3RhbENudDsKKwkJfSBlbHNlIHsKIAkJCVR4VG90YWxDbnQgPSBwRW50cnktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKwotCQkJCSBwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKLQkJCQkgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudDsKKwkJCSAgICBwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCSAgICBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50OwogCiAJCQlpZiAoVHhUb3RhbENudCkKLQkJCQlUeEVycm9yUmF0aW8gPSAoKHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKyBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OworCQkJCVR4RXJyb3JSYXRpbyA9CisJCQkJICAgICgocEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArCisJCQkJICAgICAgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudCkgKiAxMDApIC8KKwkJCQkgICAgVHhUb3RhbENudDsKIAkJfQogCisJCS8qICovCisJCS8qIENBU0UgMS4gd2hlbiBUWCBzYW1wbGVzIGFyZSBmZXdlciB0aGFuIDE1LCB0aGVuIGRlY2lkZSBUWCByYXRlIHNvbGVseSBvbiBSU1NJICovCisJCS8qICAgICAgICAgKGNyaXRlcmlhIGNvcGllZCBmcm9tIFJUMjUwMCBmb3IgTmV0b3BpYSBjYXNlKSAqLworCQkvKiAqLworCQlpZiAoVHhUb3RhbENudCA8PSAxMikgeworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHksCisJCQkJICAgICAgIHNpemVvZih1MTYpKgorCQkJCSAgICAgICBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlBFUiwKKwkJCQkgICAgICAgc2l6ZW9mKHU4KSoKKwkJCQkgICAgICAgTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwogCi0JCS8vCi0JCS8vIENBU0UgMS4gd2hlbiBUWCBzYW1wbGVzIGFyZSBmZXdlciB0aGFuIDE1LCB0aGVuIGRlY2lkZSBUWCByYXRlIHNvbGVseSBvbiBSU1NJCi0JCS8vICAgICAgICAgKGNyaXRlcmlhIGNvcGllZCBmcm9tIFJUMjUwMCBmb3IgTmV0b3BpYSBjYXNlKQotCQkvLwotCQlpZiAoVHhUb3RhbENudCA8PSAxMikKLQkJewotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHksIHNpemVvZihVU0hPUlQpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5QRVIsIHNpemVvZihVQ0hBUikgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7Ci0KLQkJCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09IDEpICYmIChDdXJyUmF0ZUlkeCAhPSBEb3duUmF0ZUlkeCkpCi0JCQl7CisJCQlpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAxKQorCQkJICAgICYmIChDdXJyUmF0ZUlkeCAhPSBEb3duUmF0ZUlkeCkpIHsKIAkJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IERvd25SYXRlSWR4OwotCQkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOwotCQkJfQotCQkJZWxzZSBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAyKSAmJiAoQ3VyclJhdGVJZHggIT0gVXBSYXRlSWR4KSkKLQkJCXsKKwkJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPQorCQkJCSAgICBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKKwkJCX0gZWxzZQorCQkJICAgIGlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09CisJCQkJIDIpICYmIChDdXJyUmF0ZUlkeCAhPSBVcFJhdGVJZHgpKSB7CiAJCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSBVcFJhdGVJZHg7CiAJCQl9CiAKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIlF1aWNrRFJTOiBUeFRvdGFsQ250IDw9IDE1LCB0cmFpbiBiYWNrIHRvIG9yaWdpbmFsIHJhdGUgXG4iKSk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJICAgICAoIlF1aWNrRFJTOiBUeFRvdGFsQ250IDw9IDE1LCB0cmFpbiBiYWNrIHRvIG9yaWdpbmFsIHJhdGUgXG4iKSk7CiAJCQlyZXR1cm47CiAJCX0KIAotCQlkbwotCQl7Ci0JCQlVTE9ORyBPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50OworCQlkbyB7CisJCQl1bnNpZ25lZCBsb25nIE9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQ7CiAKIAkJCWlmIChwQWQtPkRyc0NvdW50ZXJzLkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID09IDApCiAJCQkJcmF0aW8gPSA1OwogCQkJZWxzZQogCQkJCXJhdGlvID0gNDsKIAotCQkJLy8gZG93bmdyYWRlIFRYIHF1YWxpdHkgaWYgUEVSID49IFJhdGUtRG93biB0aHJlc2hvbGQKLQkJCWlmIChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKQotCQkJewotCQkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOworCQkJLyogZG93bmdyYWRlIFRYIHF1YWxpdHkgaWYgUEVSID49IFJhdGUtRG93biB0aHJlc2hvbGQgKi8KKwkJCWlmIChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKSB7CisJCQkJcEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdID0KKwkJCQkgICAgRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQ7CiAJCQl9CiAKLQkJCXBBZC0+RHJzQ291bnRlcnMuUEVSW0N1cnJSYXRlSWR4XSA9IChVQ0hBUilUeEVycm9yUmF0aW87CisJCQlwQWQtPkRyc0NvdW50ZXJzLlBFUltDdXJyUmF0ZUlkeF0gPQorCQkJICAgICh1OClUeEVycm9yUmF0aW87CiAKIAkJCU9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQgPSAoVHhTdWNjZXNzICogcmF0aW8pOwogCi0JCQkvLyBwZXJmb3JtIERSUyAtIGNvbnNpZGVyIFR4UmF0ZSBEb3duIGZpcnN0LCB0aGVuIHJhdGUgdXAuCi0JCQlpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAxKSAmJiAoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpKQotCQkJewotCQkJCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0VHhPa0NvdW50ICsgMikgPj0gT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudCkKLQkJCQl7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gRG93blJhdGVJZHg7Ci0JCQkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOworCQkJLyogcGVyZm9ybSBEUlMgLSBjb25zaWRlciBUeFJhdGUgRG93biBmaXJzdCwgdGhlbiByYXRlIHVwLiAqLworCQkJaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMSkKKwkJCSAgICAmJiAoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpKSB7CisJCQkJaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RUeE9rQ291bnQgKyAyKSA+PQorCQkJCSAgICBPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50KSB7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0KKwkJCQkJICAgIERvd25SYXRlSWR4OworCQkJCQlwQWQtPkRyc0NvdW50ZXJzLgorCQkJCQkgICAgVHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9CisJCQkJCSAgICBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKIAogCQkJCX0KIAotCQkJfQotCQkJZWxzZSBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAyKSAmJiAoQ3VyclJhdGVJZHggIT0gVXBSYXRlSWR4KSkKLQkJCXsKLQkJCQlpZiAoKFR4RXJyb3JSYXRpbyA+PSA1MCkgfHwgKFR4RXJyb3JSYXRpbyA+PSBUcmFpbkRvd24pKQotCQkJCXsKKwkJCX0gZWxzZQorCQkJICAgIGlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09CisJCQkJIDIpICYmIChDdXJyUmF0ZUlkeCAhPSBVcFJhdGVJZHgpKSB7CisJCQkJaWYgKChUeEVycm9yUmF0aW8gPj0gNTApCisJCQkJICAgIHx8IChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKSkgewogCi0JCQkJfQotCQkJCWVsc2UgaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RUeE9rQ291bnQgKyAyKSA+PSBPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50KQotCQkJCXsKKwkJCQl9IGVsc2UgaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RUeE9rQ291bnQgKyAyKQorCQkJCQkgICA+PSBPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50KSB7CiAJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gVXBSYXRlSWR4OwogCQkJCX0KIAkJCX0KLQkJfXdoaWxlIChGQUxTRSk7CisJCX0gd2hpbGUgKEZBTFNFKTsKIAotCQkvLyBpZiByYXRlLXVwIGhhcHBlbiwgY2xlYXIgYWxsIGJhZCBoaXN0b3J5IG9mIGFsbCBUWCByYXRlcwotCQlpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPiBDdXJyUmF0ZUlkeCkKLQkJeworCQkvKiBpZiByYXRlLXVwIGhhcHBlbiwgY2xlYXIgYWxsIGJhZCBoaXN0b3J5IG9mIGFsbCBUWCByYXRlcyAqLworCQlpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPiBDdXJyUmF0ZUlkeCkgewogCQkJcEFkLT5EcnNDb3VudGVycy5UeFJhdGVVcFBlbmFsdHkgPSAwOwotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHksIHNpemVvZihVU0hPUlQpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5QRVIsIHNpemVvZihVQ0hBUikgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7Ci0jaWZkZWYgUlQyODcwCisJCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eSwKKwkJCQkgICAgICAgc2l6ZW9mKHUxNikqCisJCQkJICAgICAgIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuUEVSLAorCQkJCSAgICAgICBzaXplb2YodTgpKgorCQkJCSAgICAgICBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CiAJCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7Ci0jZW5kaWYKIAkJfQotCQkvLyBpZiByYXRlLWRvd24gaGFwcGVuLCBvbmx5IGNsZWFyIERvd25SYXRlJ3MgYmFkIGhpc3RvcnkKLQkJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPCBDdXJyUmF0ZUlkeCkKLQkJewotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiUXVpY2tEUlM6IC0tVFggcmF0ZSBmcm9tICVkIHRvICVkIFxuIiwgQ3VyclJhdGVJZHgsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KSk7CisJCS8qIGlmIHJhdGUtZG93biBoYXBwZW4sIG9ubHkgY2xlYXIgRG93blJhdGUncyBiYWQgaGlzdG9yeSAqLworCQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA8IEN1cnJSYXRlSWR4KSB7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJICAgICAoIlF1aWNrRFJTOiAtLVRYIHJhdGUgZnJvbSAlZCB0byAlZCBcbiIsCisJCQkJICAgICAgQ3VyclJhdGVJZHgsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KSk7CiAKLQkJCXBBZC0+RHJzQ291bnRlcnMuVHhSYXRlVXBQZW5hbHR5ID0gMDsgICAgICAgICAgIC8vIG5vIHBlbmFsdHkKLQkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4XSA9IDA7CisJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UmF0ZVVwUGVuYWx0eSA9IDA7CS8qIG5vIHBlbmFsdHkgKi8KKwkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4XSA9CisJCQkgICAgMDsKIAkJCXBBZC0+RHJzQ291bnRlcnMuUEVSW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4XSA9IDA7Ci0jaWZkZWYgUlQyODcwCiAJCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7Ci0jZW5kaWYKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCWJUeFJhdGVDaGFuZ2VkID0gRkFMU0U7CiAJCX0KIAotCQlwTmV4dFR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsocEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXgrMSkqNV07Ci0JCWlmIChiVHhSYXRlQ2hhbmdlZCAmJiBwTmV4dFR4UmF0ZSkKLQkJeworCQlwTmV4dFR4UmF0ZSA9CisJCSAgICAoc3RydWN0IHJ0X3J0bXBfdHhfcmF0ZV9zd2l0Y2ggKikgJgorCQkgICAgcFRhYmxlWyhwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCArIDEpICogNV07CisJCWlmIChiVHhSYXRlQ2hhbmdlZCAmJiBwTmV4dFR4UmF0ZSkgewogCQkJTWxtZVNldFR4UmF0ZShwQWQsIHBFbnRyeSwgcE5leHRUeFJhdGUpOwogCQl9CiAJfQpAQCAtMjczOCw5OCArMjYwMSwxNzYgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZUNoZWNrUHNtQ2hhbmdlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVMT05HCU5vdzMyKQordm9pZCBNbG1lQ2hlY2tQc21DaGFuZ2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1bnNpZ25lZCBsb25nIE5vdzMyKQogewotCVVMT05HCVBvd2VyTW9kZTsKKwl1bnNpZ25lZCBsb25nIFBvd2VyTW9kZTsKIAotCS8vIGNvbmRpdGlvbiAtCi0JLy8gMS4gUHNtIG1heWJlIE9OIG9ubHkgaGFwcGVuIGluIElORlJBU1RSVUNUVVJFIG1vZGUKLQkvLyAyLiB1c2VyIHdhbnRzIGVpdGhlciBNQVhfUFNQIG9yIEZBU1RfUFNQCi0JLy8gMy4gYnV0IGN1cnJlbnQgcHNtIGlzIG5vdCBpbiBQV1JfU0FWRQotCS8vIDQuIENOVEwgc3RhdGUgbWFjaGluZSBpcyBub3QgZG9pbmcgU0NBTm5pbmcKLQkvLyA1LiBubyBUWCBTVUNDRVNTIGV2ZW50IGZvciB0aGUgcGFzdCAxLXNlYyBwZXJpb2QKLSNpZmRlZiBORElTNTFfTUlOSVBPUlQKLQlpZiAocEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyUHJvZmlsZSA9PSBOZGlzUG93ZXJQcm9maWxlQmF0dGVyeSkKLQkJUG93ZXJNb2RlID0gcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGU7Ci0JZWxzZQotI2VuZGlmCi0JCVBvd2VyTW9kZSA9IHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGU7CisJLyogY29uZGl0aW9uIC0gKi8KKwkvKiAxLiBQc20gbWF5YmUgT04gb25seSBoYXBwZW4gaW4gSU5GUkFTVFJVQ1RVUkUgbW9kZSAqLworCS8qIDIuIHVzZXIgd2FudHMgZWl0aGVyIE1BWF9QU1Agb3IgRkFTVF9QU1AgKi8KKwkvKiAzLiBidXQgY3VycmVudCBwc20gaXMgbm90IGluIFBXUl9TQVZFICovCisJLyogNC4gQ05UTCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBkb2luZyBTQ0FObmluZyAqLworCS8qIDUuIG5vIFRYIFNVQ0NFU1MgZXZlbnQgZm9yIHRoZSBwYXN0IDEtc2VjIHBlcmlvZCAqLworCVBvd2VyTW9kZSA9IHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGU7CiAKIAlpZiAoSU5GUkFfT04ocEFkKSAmJgotCQkoUG93ZXJNb2RlICE9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0pICYmCi0JCShwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX0FDVElWRSkgJiYKLSNpZmRlZiBSVDI4NjAKLQkJUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCkpCi0jZWxzZQotCQkocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpKQotI2VuZGlmCi0JewotCQkvLyBhZGQgYnkgam9obmxpLCB1c2UgUnggT0sgZGF0YSBjb3VudCBwZXIgc2Vjb25kIHRvIGNhbGN1bGF0ZSB0aHJvdWdocHV0Ci0JCS8vIElmIFR0cmFmZmljIGlzIHRvbyBoaWdoICggPiA0MDAgUnggcGVyIHNlY29uZCksIGRvbid0IGdvIHRvIHNsZWVwIG1vZGUuIElmIHR4IHJhdGUgaXMgbG93LCB1c2UgbG93IGNyaXRlcmlhCi0JCS8vIE1vZGU9Q0NLL01DUz0zID0+IDExIE1icHMsIE1vZGU9T0ZETS9NQ1M9MyA9PiAxOCBNYnBzCi0JCWlmICgoKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPD0gMykgJiYKLQkJCQkocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudCA8IChVTE9ORykxMDApKSB8fAotCQkJKChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTID4gMykgJiYKLQkJCShwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tEYXRhQ250IDwgKFVMT05HKTQwMCkpKQotCQl7Ci0JCQkJLy8gR2V0IHRoaXMgdGltZQotCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmcEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUpOwotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCA9IDA7Ci0JCQlNbG1lU2V0UHNtQml0KHBBZCwgUFdSX1NBVkUpOwotCQkJaWYgKCEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSkKLQkJCXsKLQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgRkFMU0UpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBUUlVFKTsKLQkJCX0KKwkgICAgKFBvd2VyTW9kZSAhPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNKSAmJgorCSAgICAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9BQ1RJVkUpICYmCisvKiAgICAgICAgICAgICAgKCEgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgKi8KKwkgICAgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSAmJgorCSAgICBSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKQorCSAgICAvKiYmCisJICAgICAgIChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPT0gMCkgJiYKKwkgICAgICAgKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgPT0gMCkgKi8KKwkgICAgKSB7CisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCA9IDA7CisJCVJUTVBfU0VUX1BTTV9CSVQocEFkLCBQV1JfU0FWRSk7CisJCWlmICghCisJCSAgICAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlCisJCSAgICAgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUpKSB7CisJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgRkFMU0UpOworCQl9IGVsc2UgeworCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOwogCQl9CiAJfQogfQogCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIE1sbWVTZXRQc21CaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIHBzbSkKKy8qIElSUUwgPSBQQVNTSVZFX0xFVkVMICovCisvKiBJUlFMID0gRElTUEFUQ0hfTEVWRUwgKi8KK3ZvaWQgTWxtZVNldFBzbUJpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHUxNiBwc20pCiB7CiAJQVVUT19SU1BfQ0ZHX1NUUlVDIGNzcjQ7CiAKIAlwQWQtPlN0YUNmZy5Qc20gPSBwc207CiAJUlRNUF9JT19SRUFEMzIocEFkLCBBVVRPX1JTUF9DRkcsICZjc3I0LndvcmQpOwotCWNzcjQuZmllbGQuQWNrQ3RzUHNtQml0ID0gKHBzbSA9PSBQV1JfU0FWRSk/IDE6MDsKKwljc3I0LmZpZWxkLkFja0N0c1BzbUJpdCA9IChwc20gPT0gUFdSX1NBVkUpID8gMSA6IDA7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19SU1BfQ0ZHLCBjc3I0LndvcmQpOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNldFBzbUJpdCA9ICVkXG4iLCBwc20pKTsKIH0KIAotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIE1sbWVTZXRUeFByZWFtYmxlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVCBUeFByZWFtYmxlKQorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgY2FsY3VsYXRlcyBUeFBFUiwgUnhQRVIgb2YgdGhlIHBhc3QgTi1zZWMgcGVyaW9kLiBBbmQKKwkJYWNjb3JkaW5nIHRvIHRoZSBjYWxjdWxhdGlvbiByZXN1bHQsIENoYW5uZWxRdWFsaXR5IGlzIGNhbGN1bGF0ZWQgaGVyZQorCQl0byBkZWNpZGUgaWYgY3VycmVudCBBUCBpcyBzdGlsbCBkb2luZyB0aGUgam9iLgorCisJCUlmIENoYW5uZWxRdWFsaXR5IGlzIG5vdCBnb29kLCBhIFJPQU1pbmcgYXR0ZW1wdCBtYXkgYmUgdHJpZWQgbGF0ZXIuCisJT3V0cHV0OgorCQlTdGFDZmcuQ2hhbm5lbFF1YWxpdHkgLSAwLi4xMDAKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTk9URTogVGhpcyByb3V0aW5lIGRlY2lkZSBjaGFubmxlIHF1YWxpdHkgYmFzZWQgb24gUlggQ1JDIGVycm9yIHJhdGlvLgorCQlDYWxsZXIgc2hvdWxkIG1ha2Ugc3VyZSBhIGZ1bmN0aW9uIGNhbGwgdG8gTklDVXBkYXRlUmF3Q291bnRlcnMocEFkKQorCQlpcyBwZXJmb3JtZWQgcmlnaHQgYmVmb3JlIHRoaXMgcm91dGluZSwgc28gdGhhdCB0aGlzIHJvdXRpbmUgY2FuIGRlY2lkZQorCQljaGFubmVsIHF1YWxpdHkgYmFzZWQgb24gdGhlIG1vc3QgdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgTWxtZUNhbGN1bGF0ZUNoYW5uZWxRdWFsaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5LCB1bnNpZ25lZCBsb25nIE5vdzMyKQoreworCXVuc2lnbmVkIGxvbmcgVHhPa0NudCwgVHhDbnQsIFR4UEVSLCBUeFBSUjsKKwl1bnNpZ25lZCBsb25nIFJ4Q250LCBSeFBFUjsKKwl1OCBOb3JSc3NpOworCWNoYXIgTWF4UnNzaTsKKwlzdHJ1Y3QgcnRfcnNzaV9zYW1wbGUgKnBSc3NpU2FtcGxlID0gTlVMTDsKKwl1MzIgT25lU2VjVHhOb1JldHJ5T2tDb3VudCA9IDA7CisJdTMyIE9uZVNlY1R4UmV0cnlPa0NvdW50ID0gMDsKKwl1MzIgT25lU2VjVHhGYWlsQ291bnQgPSAwOworCXUzMiBPbmVTZWNSeE9rQ250ID0gMDsKKwl1MzIgT25lU2VjUnhGY3NFcnJDbnQgPSAwOworCXVuc2lnbmVkIGxvbmcgQ2hhbm5lbFF1YWxpdHkgPSAwOwkvKiAwLi4xMDAsIENoYW5uZWwgUXVhbGl0eSBJbmRpY2F0aW9uIGZvciBSb2FtaW5nICovCisJdW5zaWduZWQgbG9uZyBCZWFjb25Mb3N0VGltZSA9IHBBZC0+U3RhQ2ZnLkJlYWNvbkxvc3RUaW1lOworCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpIHsKKwkJcFJzc2lTYW1wbGUgPSAmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZTsKKwkJT25lU2VjVHhOb1JldHJ5T2tDb3VudCA9CisJCSAgICBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQ7CisJCU9uZVNlY1R4UmV0cnlPa0NvdW50ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudDsKKwkJT25lU2VjVHhGYWlsQ291bnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OworCQlPbmVTZWNSeE9rQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rQ250OworCQlPbmVTZWNSeEZjc0VyckNudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQ7CisJfQorCisJTWF4UnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgcFJzc2lTYW1wbGUtPkxhc3RSc3NpMCwKKwkJCSAgICAgIHBSc3NpU2FtcGxlLT5MYXN0UnNzaTEsIHBSc3NpU2FtcGxlLT5MYXN0UnNzaTIpOworCisJLyogKi8KKwkvKiBjYWxjdWxhdGUgVFggcGFja2V0IGVycm9yIHJhdGlvIGFuZCBUWCByZXRyeSByYXRpbyAtIGlmIHRvbyBmZXcgVFggc2FtcGxlcywgc2tpcCBUWCByZWxhdGVkIHN0YXRpc3RpY3MgKi8KKwkvKiAqLworCVR4T2tDbnQgPSBPbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsgT25lU2VjVHhSZXRyeU9rQ291bnQ7CisJVHhDbnQgPSBUeE9rQ250ICsgT25lU2VjVHhGYWlsQ291bnQ7CisJaWYgKFR4Q250IDwgNSkgeworCQlUeFBFUiA9IDA7CisJCVR4UFJSID0gMDsKKwl9IGVsc2UgeworCQlUeFBFUiA9IChPbmVTZWNUeEZhaWxDb3VudCAqIDEwMCkgLyBUeENudDsKKwkJVHhQUlIgPSAoKFR4Q250IC0gT25lU2VjVHhOb1JldHJ5T2tDb3VudCkgKiAxMDApIC8gVHhDbnQ7CisJfQorCisJLyogKi8KKwkvKiBjYWxjdWxhdGUgUlggUEVSIC0gZG9uJ3QgdGFrZSBSeFBFUiBpbnRvIGNvbnNpZGVyYXRpb24gaWYgdG9vIGZldyBzYW1wbGUgKi8KKwkvKiAqLworCVJ4Q250ID0gT25lU2VjUnhPa0NudCArIE9uZVNlY1J4RmNzRXJyQ250OworCWlmIChSeENudCA8IDUpCisJCVJ4UEVSID0gMDsKKwllbHNlCisJCVJ4UEVSID0gKE9uZVNlY1J4RmNzRXJyQ250ICogMTAwKSAvIFJ4Q250OworCisJLyogKi8KKwkvKiBkZWNpZGUgQ2hhbm5lbFF1YWxpdHkgYmFzZWQgb246IDEpbGFzdCBCRUFDT04gcmVjZWl2ZWQgdGltZSwgMilsYXN0IFJTU0ksIDMpVHhQRVIsIGFuZCA0KVJ4UEVSICovCisJLyogKi8KKwlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIElORlJBX09OKHBBZCkgJiYgKE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPCAyKSAmJgkvKiBubyBoZWF2eSB0cmFmZmljICovCisJICAgICgocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIEJlYWNvbkxvc3RUaW1lKSA8IE5vdzMyKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkJFQUNPTiBsb3N0ID4gJWxkIG1zZWMgd2l0aCBUeE9rQ250PSVsZCAtPiBDUUk9MFxuIiwKKwkJCSAgQmVhY29uTG9zdFRpbWUsIFR4T2tDbnQpKTsKKwkJQ2hhbm5lbFF1YWxpdHkgPSAwOworCX0gZWxzZSB7CisJCS8qIE5vcm1hbGl6ZSBSc3NpICovCisJCWlmIChNYXhSc3NpID4gLTQwKQorCQkJTm9yUnNzaSA9IDEwMDsKKwkJZWxzZSBpZiAoTWF4UnNzaSA8IC05MCkKKwkJCU5vclJzc2kgPSAwOworCQllbHNlCisJCQlOb3JSc3NpID0gKE1heFJzc2kgKyA5MCkgKiAyOworCisJCS8qIENoYW5uZWxRdWFsaXR5ID0gVzEqUlNTSSArIFcyKlR4UFJSICsgVzMqUnhQRVIgICAgICAgIChSU1NJIDAuLjEwMCksIChUeFBFUiAxMDAuLjApLCAoUnhQRVIgMTAwLi4wKSAqLworCQlDaGFubmVsUXVhbGl0eSA9IChSU1NJX1dFSUdIVElORyAqIE5vclJzc2kgKworCQkJCSAgVFhfV0VJR0hUSU5HICogKDEwMCAtIFR4UFJSKSArCisJCQkJICBSWF9XRUlHSFRJTkcgKiAoMTAwIC0gUnhQRVIpKSAvIDEwMDsKKwl9CisKKwlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKwkJcEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID0KKwkJICAgIChDaGFubmVsUXVhbGl0eSA+IDEwMCkgPyAxMDAgOiBDaGFubmVsUXVhbGl0eTsKKworfQorCisvKiBJUlFMID0gRElTUEFUQ0hfTEVWRUwgKi8KK3ZvaWQgTWxtZVNldFR4UHJlYW1ibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MTYgVHhQcmVhbWJsZSkKIHsKIAlBVVRPX1JTUF9DRkdfU1RSVUMgY3NyNDsKIAotCS8vCi0JLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCi0JLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCi0JLy8KLQkvL1R4UHJlYW1ibGUgPSBSdDgwMl8xMVByZWFtYmxlTG9uZzsKKwkvKiAqLworCS8qIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLiAqLworCS8qIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyAqLworCS8qICovCisJLypUeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUxvbmc7ICovCiAKIAlSVE1QX0lPX1JFQUQzMihwQWQsIEFVVE9fUlNQX0NGRywgJmNzcjQud29yZCk7Ci0JaWYgKFR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUxvbmcpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2V0VHhQcmVhbWJsZSAoPSBMT05HIFBSRUFNQkxFKVxuIikpOworCWlmIChUeFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVMb25nKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiTWxtZVNldFR4UHJlYW1ibGUgKD0gbG9uZyBQUkVBTUJMRSlcbiIpKTsKIAkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKIAkJY3NyNC5maWVsZC5BdXRvUmVzcG9uZGVyUHJlYW1ibGUgPSAwOwotCX0KLQllbHNlCi0JewotCQkvLyBOT1RFOiAxTWJwcyBzaG91bGQgYWx3YXlzIHVzZSBsb25nIHByZWFtYmxlCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTZXRUeFByZWFtYmxlICg9IFNIT1JUIFBSRUFNQkxFKVxuIikpOworCX0gZWxzZSB7CisJCS8qIE5PVEU6IDFNYnBzIHNob3VsZCBhbHdheXMgdXNlIGxvbmcgcHJlYW1ibGUgKi8KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNbG1lU2V0VHhQcmVhbWJsZSAoPSBzaG9ydCBQUkVBTUJMRSlcbiIpKTsKIAkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7CiAJCWNzcjQuZmllbGQuQXV0b1Jlc3BvbmRlclByZWFtYmxlID0gMTsKIAl9CkBAIC0yODQ0LDExNyArMjc4NSwxNDAgQEAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCiAKLVZPSUQgVXBkYXRlQmFzaWNSYXRlQml0bWFwKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIpCit2b2lkIFVwZGF0ZUJhc2ljUmF0ZUJpdG1hcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlcikKIHsKLSAgICBJTlQgIGksIGo7Ci0gICAgICAgICAgICAgICAgICAvKiAxICAyICA1LjUsIDExLCAgNiwgIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgIDU0ICovCi0gICAgVUNIQVIgcmF0ZVtdID0geyAyLCA0LCAgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4IH07Ci0gICAgVUNIQVIgKnN1cF9wID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5TdXBSYXRlOwotICAgIFVDSEFSICpleHRfcCA9IHBBZGFwdGVyLT5Db21tb25DZmcuRXh0UmF0ZTsKLSAgICBVTE9ORyBiaXRtYXAgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcDsKKwlpbnQgaSwgajsKKwkvKiAxICAyICA1LjUsIDExLCAgNiwgIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgIDU0ICovCisJdTggcmF0ZVtdID0geyAyLCA0LCAxMSwgMjIsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDggfTsKKwl1OCAqc3VwX3AgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlN1cFJhdGU7CisJdTggKmV4dF9wID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5FeHRSYXRlOworCXVuc2lnbmVkIGxvbmcgYml0bWFwID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXA7CiAKLQotICAgIC8qIGlmIEEgbW9kZSwgYWx3YXlzIHVzZSBmaXggQmFzaWNSYXRlQml0TWFwICovCi0gICAgLy9pZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID09IFBIWV8xMUEpCisJLyogaWYgQSBtb2RlLCBhbHdheXMgdXNlIGZpeCBCYXNpY1JhdGVCaXRNYXAgKi8KKwkvKmlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gUEhZXzExQSkgKi8KIAlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0gICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwID0gMHgxNTA7IC8qIDYsIDEyLCAyNE0gKi8KLSAgICAvKiBFbmQgb2YgaWYgKi8KKwkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPSAweDE1MDsJLyogNiwgMTIsIDI0TSAqLworCS8qIEVuZCBvZiBpZiAqLwogCi0gICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwID4gNDA5NSkKLSAgICB7Ci0gICAgICAgIC8qICgyIF4gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpIC0xICovCi0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLworCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCA+IDQwOTUpIHsKKwkJLyogKDIgXiBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykgLTEgKi8KKwkJcmV0dXJuOworCX0KKwkvKiBFbmQgb2YgaWYgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykgeworCQlzdXBfcFtpXSAmPSAweDdmOworCQlleHRfcFtpXSAmPSAweDdmOworCX0JCQkvKiBFbmQgb2YgZm9yICovCiAKLSAgICBmb3IoaT0wOyBpPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspCi0gICAgewotICAgICAgICBzdXBfcFtpXSAmPSAweDdmOwotICAgICAgICBleHRfcFtpXSAmPSAweDdmOwotICAgIH0gLyogRW5kIG9mIGZvciAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKSB7CisJCWlmIChiaXRtYXAgJiAoMSA8PCBpKSkgeworCQkJZm9yIChqID0gMDsgaiA8IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBqKyspIHsKKwkJCQlpZiAoc3VwX3Bbal0gPT0gcmF0ZVtpXSkKKwkJCQkJc3VwX3Bbal0gfD0gMHg4MDsKKwkJCQkvKiBFbmQgb2YgaWYgKi8KKwkJCX0JLyogRW5kIG9mIGZvciAqLwogCi0gICAgZm9yKGk9MDsgaTxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGJpdG1hcCAmICgxIDw8IGkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3Ioaj0wOyBqPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHN1cF9wW2pdID09IHJhdGVbaV0pCi0gICAgICAgICAgICAgICAgICAgIHN1cF9wW2pdIHw9IDB4ODA7Ci0gICAgICAgICAgICAgICAgLyogRW5kIG9mIGlmICovCi0gICAgICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KKwkJCWZvciAoaiA9IDA7IGogPCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaisrKSB7CisJCQkJaWYgKGV4dF9wW2pdID09IHJhdGVbaV0pCisJCQkJCWV4dF9wW2pdIHw9IDB4ODA7CisJCQkJLyogRW5kIG9mIGlmICovCisJCQl9CS8qIEVuZCBvZiBmb3IgKi8KKwkJfQkJLyogRW5kIG9mIGlmICovCisJfQkJCS8qIEVuZCBvZiBmb3IgKi8KK30JCQkJLyogRW5kIG9mIFVwZGF0ZUJhc2ljUmF0ZUJpdG1hcCAqLwogCi0gICAgICAgICAgICBmb3Ioaj0wOyBqPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dF9wW2pdID09IHJhdGVbaV0pCi0gICAgICAgICAgICAgICAgICAgIGV4dF9wW2pdIHw9IDB4ODA7Ci0gICAgICAgICAgICAgICAgLyogRW5kIG9mIGlmICovCi0gICAgICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLSAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLX0gLyogRW5kIG9mIFVwZGF0ZUJhc2ljUmF0ZUJpdG1hcCAqLwotCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi0vLyBiTGlua1VwIGlzIHRvIGlkZW50aWZ5IHRoZSBpbml0YWwgbGluayBzcGVlZC4KLS8vIFRSVUUgaW5kaWNhdGVzIHRoZSByYXRlIHVwZGF0ZSBhdCBsaW5rdXAsIHdlIHNob3VsZCBub3QgdHJ5IHRvIHNldCB0aGUgcmF0ZSBhdCA1NE1icHMuCi1WT0lEIE1sbWVVcGRhdGVUeFJhdGVzKAotCUlOIFBSVE1QX0FEQVBURVIgCQlwQWQsCi0JSU4gCUJPT0xFQU4JCSAJCWJMaW5rVXAsCi0JSU4JVUNIQVIJCQkJYXBpZHgpCisvKiBJUlFMID0gUEFTU0lWRV9MRVZFTCAqLworLyogSVJRTCA9IERJU1BBVENIX0xFVkVMICovCisvKiBiTGlua1VwIGlzIHRvIGlkZW50aWZ5IHRoZSBpbml0YWwgbGluayBzcGVlZC4gKi8KKy8qIFRSVUUgaW5kaWNhdGVzIHRoZSByYXRlIHVwZGF0ZSBhdCBsaW5rdXAsIHdlIHNob3VsZCBub3QgdHJ5IHRvIHNldCB0aGUgcmF0ZSBhdCA1NE1icHMuICovCit2b2lkIE1sbWVVcGRhdGVUeFJhdGVzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gQk9PTEVBTiBiTGlua1VwLCB1OCBhcGlkeCkKIHsKIAlpbnQgaSwgbnVtOwotCVVDSEFSIFJhdGUgPSBSQVRFXzYsIE1heERlc2lyZSA9IFJBVEVfMSwgTWF4U3VwcG9ydCA9IFJBVEVfMTsKLQlVQ0hBUiBNaW5TdXBwb3J0ID0gUkFURV81NDsKLQlVTE9ORyBCYXNpY1JhdGVCaXRtYXAgPSAwOwotCVVDSEFSIEN1cnJCYXNpY1JhdGUgPSBSQVRFXzE7Ci0JVUNIQVIgKnBTdXBSYXRlLCBTdXBSYXRlTGVuLCAqcEV4dFJhdGUsIEV4dFJhdGVMZW47Ci0JUEhUVFJBTlNNSVRfU0VUVElORwkJcEh0UGh5ID0gTlVMTDsKLQlQSFRUUkFOU01JVF9TRVRUSU5HCQlwTWF4SHRQaHkgPSBOVUxMOwotCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBNaW5IdFBoeSA9IE5VTEw7Ci0JQk9PTEVBTiAJCQkJKmF1dG9fcmF0ZV9jdXJfcDsKLQlVQ0hBUgkJCQkJSHRNY3MgPSBNQ1NfQVVUTzsKKwl1OCBSYXRlID0gUkFURV82LCBNYXhEZXNpcmUgPSBSQVRFXzEsIE1heFN1cHBvcnQgPSBSQVRFXzE7CisJdTggTWluU3VwcG9ydCA9IFJBVEVfNTQ7CisJdW5zaWduZWQgbG9uZyBCYXNpY1JhdGVCaXRtYXAgPSAwOworCXU4IEN1cnJCYXNpY1JhdGUgPSBSQVRFXzE7CisJdTggKnBTdXBSYXRlLCBTdXBSYXRlTGVuLCAqcEV4dFJhdGUsIEV4dFJhdGVMZW47CisJUEhUVFJBTlNNSVRfU0VUVElORyBwSHRQaHkgPSBOVUxMOworCVBIVFRSQU5TTUlUX1NFVFRJTkcgcE1heEh0UGh5ID0gTlVMTDsKKwlQSFRUUkFOU01JVF9TRVRUSU5HIHBNaW5IdFBoeSA9IE5VTEw7CisJQk9PTEVBTiAqYXV0b19yYXRlX2N1cl9wOworCXU4IEh0TWNzID0gTUNTX0FVVE87CiAKLQkvLyBmaW5kIG1heCBkZXNpcmVkIHJhdGUKKwkvKiBmaW5kIG1heCBkZXNpcmVkIHJhdGUgKi8KIAlVcGRhdGVCYXNpY1JhdGVCaXRtYXAocEFkKTsKIAogCW51bSA9IDA7CiAJYXV0b19yYXRlX2N1cl9wID0gTlVMTDsKLQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKQotCXsKLQkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlW2ldICYgMHg3ZikKLQkJewotCQkJY2FzZSAyOiAgUmF0ZSA9IFJBVEVfMTsgICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgNDogIFJhdGUgPSBSQVRFXzI7ICAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDExOiBSYXRlID0gUkFURV81XzU7IG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSAyMjogUmF0ZSA9IFJBVEVfMTE7ICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgMTI6IFJhdGUgPSBSQVRFXzY7ICAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDE4OiBSYXRlID0gUkFURV85OyAgIG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSAyNDogUmF0ZSA9IFJBVEVfMTI7ICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgMzY6IFJhdGUgPSBSQVRFXzE4OyAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDQ4OiBSYXRlID0gUkFURV8yNDsgIG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSA3MjogUmF0ZSA9IFJBVEVfMzY7ICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgOTY6IFJhdGUgPSBSQVRFXzQ4OyAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDEwODogUmF0ZSA9IFJBVEVfNTQ7IG51bSsrOyAgIGJyZWFrOwotCQkJLy9kZWZhdWx0OiBSYXRlID0gUkFURV8xOyAgIGJyZWFrOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKSB7CisJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVtpXSAmIDB4N2YpIHsKKwkJY2FzZSAyOgorCQkJUmF0ZSA9IFJBVEVfMTsKKwkJCW51bSsrOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCVJhdGUgPSBSQVRFXzI7CisJCQludW0rKzsKKwkJCWJyZWFrOworCQljYXNlIDExOgorCQkJUmF0ZSA9IFJBVEVfNV81OworCQkJbnVtKys7CisJCQlicmVhazsKKwkJY2FzZSAyMjoKKwkJCVJhdGUgPSBSQVRFXzExOworCQkJbnVtKys7CisJCQlicmVhazsKKwkJY2FzZSAxMjoKKwkJCVJhdGUgPSBSQVRFXzY7CisJCQludW0rKzsKKwkJCWJyZWFrOworCQljYXNlIDE4OgorCQkJUmF0ZSA9IFJBVEVfOTsKKwkJCW51bSsrOworCQkJYnJlYWs7CisJCWNhc2UgMjQ6CisJCQlSYXRlID0gUkFURV8xMjsKKwkJCW51bSsrOworCQkJYnJlYWs7CisJCWNhc2UgMzY6CisJCQlSYXRlID0gUkFURV8xODsKKwkJCW51bSsrOworCQkJYnJlYWs7CisJCWNhc2UgNDg6CisJCQlSYXRlID0gUkFURV8yNDsKKwkJCW51bSsrOworCQkJYnJlYWs7CisJCWNhc2UgNzI6CisJCQlSYXRlID0gUkFURV8zNjsKKwkJCW51bSsrOworCQkJYnJlYWs7CisJCWNhc2UgOTY6CisJCQlSYXRlID0gUkFURV80ODsKKwkJCW51bSsrOworCQkJYnJlYWs7CisJCWNhc2UgMTA4OgorCQkJUmF0ZSA9IFJBVEVfNTQ7CisJCQludW0rKzsKKwkJCWJyZWFrOworCQkJLypkZWZhdWx0OiBSYXRlID0gUkFURV8xOyAgIGJyZWFrOyAqLwogCQl9Ci0JCWlmIChNYXhEZXNpcmUgPCBSYXRlKSAgTWF4RGVzaXJlID0gUmF0ZTsKKwkJaWYgKE1heERlc2lyZSA8IFJhdGUpCisJCQlNYXhEZXNpcmUgPSBSYXRlOwogCX0KIAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAl7Ci0JCXBIdFBoeSAJCT0gJnBBZC0+U3RhQ2ZnLkhUUGh5TW9kZTsKLQkJcE1heEh0UGh5CT0gJnBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZTsKLQkJcE1pbkh0UGh5CT0gJnBBZC0+U3RhQ2ZnLk1pbkhUUGh5TW9kZTsKKwkJcEh0UGh5ID0gJnBBZC0+U3RhQ2ZnLkhUUGh5TW9kZTsKKwkJcE1heEh0UGh5ID0gJnBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZTsKKwkJcE1pbkh0UGh5ID0gJnBBZC0+U3RhQ2ZnLk1pbkhUUGh5TW9kZTsKIAogCQlhdXRvX3JhdGVfY3VyX3AgPSAmcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2g7Ci0JCUh0TWNzIAkJPSBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKKwkJSHRNY3MgPSBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKIAogCQlpZiAoKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKSAmJgotCQkJKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikgJiYKLQkJCShNYXhEZXNpcmUgPiBSQVRFXzExKSkKLQkJeworCQkgICAgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikgJiYKKwkJICAgIChNYXhEZXNpcmUgPiBSQVRFXzExKSkgewogCQkJTWF4RGVzaXJlID0gUkFURV8xMTsKIAkJfQogCX0KQEAgLTI5NjQsMTExICsyOTI4LDIxMSBAQAogCXBNYXhIdFBoeS0+d29yZCA9IDA7CiAJcEh0UGh5LT53b3JkID0gMDsKIAotCS8vIEF1dG8gcmF0ZSBzd2l0Y2hpbmcgaXMgZW5hYmxlZCBvbmx5IGlmIG1vcmUgdGhhbiBvbmUgREVTSVJFRCBSQVRFUyBhcmUKLQkvLyBzcGVjaWZpZWQ7IG90aGVyd2lzZSBkaXNhYmxlZAotCWlmIChudW0gPD0gMSkKLQl7CisJLyogQXV0byByYXRlIHN3aXRjaGluZyBpcyBlbmFibGVkIG9ubHkgaWYgbW9yZSB0aGFuIG9uZSBERVNJUkVEIFJBVEVTIGFyZSAqLworCS8qIHNwZWNpZmllZDsgb3RoZXJ3aXNlIGRpc2FibGVkICovCisJaWYgKG51bSA8PSAxKSB7CisJCS8qT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCk7ICovCisJCS8qcEFkLT5Db21tb25DZmcuYkF1dG9UeFJhdGVTd2l0Y2ggICAgICA9IEZBTFNFOyAqLwogCQkqYXV0b19yYXRlX2N1cl9wID0gRkFMU0U7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKKwkJLypPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCk7ICovCisJCS8qcEFkLT5Db21tb25DZmcuYkF1dG9UeFJhdGVTd2l0Y2ggICAgICA9IFRSVUU7ICovCiAJCSphdXRvX3JhdGVfY3VyX3AgPSBUUlVFOwogCX0KIAotI2lmIDEKLQlpZiAoSHRNY3MgIT0gTUNTX0FVVE8pCi0JeworCWlmIChIdE1jcyAhPSBNQ1NfQVVUTykgeworCQkvKk9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpOyAqLworCQkvKnBBZC0+Q29tbW9uQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoICAgICAgPSBGQUxTRTsgKi8KIAkJKmF1dG9fcmF0ZV9jdXJfcCA9IEZBTFNFOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CisJCS8qT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpOyAqLworCQkvKnBBZC0+Q29tbW9uQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoICAgICAgPSBUUlVFOyAqLwogCQkqYXV0b19yYXRlX2N1cl9wID0gVFJVRTsKIAl9Ci0jZW5kaWYKIAotCWlmICgoQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCi0JeworCWlmICgoQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpIHsKIAkJcFN1cFJhdGUgPSAmcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZVswXTsKIAkJcEV4dFJhdGUgPSAmcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZVswXTsKIAkJU3VwUmF0ZUxlbiA9IHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW47CiAJCUV4dFJhdGVMZW4gPSBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXBTdXBSYXRlID0gJnBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF07CiAJCXBFeHRSYXRlID0gJnBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbMF07CiAJCVN1cFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOwogCQlFeHRSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbjsKIAl9CiAKLQkvLyBmaW5kIG1heCBzdXBwb3J0ZWQgcmF0ZQotCWZvciAoaT0wOyBpPFN1cFJhdGVMZW47IGkrKykKLQl7Ci0JCXN3aXRjaCAocFN1cFJhdGVbaV0gJiAweDdmKQotCQl7Ci0JCQljYXNlIDI6ICAgUmF0ZSA9IFJBVEVfMTsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMTsJIGJyZWFrOwotCQkJY2FzZSA0OiAgIFJhdGUgPSBSQVRFXzI7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDI7CSBicmVhazsKLQkJCWNhc2UgMTE6ICBSYXRlID0gUkFURV81XzU7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDQ7CSBicmVhazsKLQkJCWNhc2UgMjI6ICBSYXRlID0gUkFURV8xMTsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwODsJIGJyZWFrOwotCQkJY2FzZSAxMjogIFJhdGUgPSBSQVRFXzY7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAxMDsgIGJyZWFrOwotCQkJY2FzZSAxODogIFJhdGUgPSBSQVRFXzk7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMjA7CSBicmVhazsKLQkJCWNhc2UgMjQ6ICBSYXRlID0gUkFURV8xMjsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDQwOyAgYnJlYWs7Ci0JCQljYXNlIDM2OiAgUmF0ZSA9IFJBVEVfMTg7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwODA7CSBicmVhazsKLQkJCWNhc2UgNDg6ICBSYXRlID0gUkFURV8yNDsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMTAwOyAgYnJlYWs7Ci0JCQljYXNlIDcyOiAgUmF0ZSA9IFJBVEVfMzY7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAyMDA7CSBicmVhazsKLQkJCWNhc2UgOTY6ICBSYXRlID0gUkFURV80ODsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDQwMDsJIGJyZWFrOwotCQkJY2FzZSAxMDg6IFJhdGUgPSBSQVRFXzU0OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwODAwOwkgYnJlYWs7Ci0JCQlkZWZhdWx0OiAgUmF0ZSA9IFJBVEVfMTsJYnJlYWs7CisJLyogZmluZCBtYXggc3VwcG9ydGVkIHJhdGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU3VwUmF0ZUxlbjsgaSsrKSB7CisJCXN3aXRjaCAocFN1cFJhdGVbaV0gJiAweDdmKSB7CisJCWNhc2UgMjoKKwkJCVJhdGUgPSBSQVRFXzE7CisJCQlpZiAocFN1cFJhdGVbaV0gJiAweDgwKQorCQkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDE7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJUmF0ZSA9IFJBVEVfMjsKKwkJCWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApCisJCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMjsKKwkJCWJyZWFrOworCQljYXNlIDExOgorCQkJUmF0ZSA9IFJBVEVfNV81OworCQkJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkKKwkJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA0OworCQkJYnJlYWs7CisJCWNhc2UgMjI6CisJCQlSYXRlID0gUkFURV8xMTsKKwkJCWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApCisJCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwODsKKwkJCWJyZWFrOworCQljYXNlIDEyOgorCQkJUmF0ZSA9IFJBVEVfNjsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSAqLworCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAxMDsKKwkJCWJyZWFrOworCQljYXNlIDE4OgorCQkJUmF0ZSA9IFJBVEVfOTsKKwkJCWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApCisJCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAyMDsKKwkJCWJyZWFrOworCQljYXNlIDI0OgorCQkJUmF0ZSA9IFJBVEVfMTI7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgKi8KKwkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwNDA7CisJCQlicmVhazsKKwkJY2FzZSAzNjoKKwkJCVJhdGUgPSBSQVRFXzE4OworCQkJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkKKwkJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDgwOworCQkJYnJlYWs7CisJCWNhc2UgNDg6CisJCQlSYXRlID0gUkFURV8yNDsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSAqLworCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDEwMDsKKwkJCWJyZWFrOworCQljYXNlIDcyOgorCQkJUmF0ZSA9IFJBVEVfMzY7CisJCQlpZiAocFN1cFJhdGVbaV0gJiAweDgwKQorCQkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDAyMDA7CisJCQlicmVhazsKKwkJY2FzZSA5NjoKKwkJCVJhdGUgPSBSQVRFXzQ4OworCQkJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkKKwkJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwNDAwOworCQkJYnJlYWs7CisJCWNhc2UgMTA4OgorCQkJUmF0ZSA9IFJBVEVfNTQ7CisJCQlpZiAocFN1cFJhdGVbaV0gJiAweDgwKQorCQkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDA4MDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVJhdGUgPSBSQVRFXzE7CisJCQlicmVhazsKIAkJfQotCQlpZiAoTWF4U3VwcG9ydCA8IFJhdGUpCU1heFN1cHBvcnQgPSBSYXRlOworCQlpZiAoTWF4U3VwcG9ydCA8IFJhdGUpCisJCQlNYXhTdXBwb3J0ID0gUmF0ZTsKIAotCQlpZiAoTWluU3VwcG9ydCA+IFJhdGUpIE1pblN1cHBvcnQgPSBSYXRlOworCQlpZiAoTWluU3VwcG9ydCA+IFJhdGUpCisJCQlNaW5TdXBwb3J0ID0gUmF0ZTsKIAl9CiAKLQlmb3IgKGk9MDsgaTxFeHRSYXRlTGVuOyBpKyspCi0JewotCQlzd2l0Y2ggKHBFeHRSYXRlW2ldICYgMHg3ZikKLQkJewotCQkJY2FzZSAyOiAgIFJhdGUgPSBSQVRFXzE7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDE7CSBicmVhazsKLQkJCWNhc2UgNDogICBSYXRlID0gUkFURV8yOwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDAyOwkgYnJlYWs7Ci0JCQljYXNlIDExOiAgUmF0ZSA9IFJBVEVfNV81OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA0OwkgYnJlYWs7Ci0JCQljYXNlIDIyOiAgUmF0ZSA9IFJBVEVfMTE7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDg7CSBicmVhazsKLQkJCWNhc2UgMTI6ICBSYXRlID0gUkFURV82OwkvKmlmIChwRXh0UmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMTA7ICBicmVhazsKLQkJCWNhc2UgMTg6ICBSYXRlID0gUkFURV85OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDIwOwkgYnJlYWs7Ci0JCQljYXNlIDI0OiAgUmF0ZSA9IFJBVEVfMTI7CS8qaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDA0MDsgIGJyZWFrOwotCQkJY2FzZSAzNjogIFJhdGUgPSBSQVRFXzE4OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDgwOwkgYnJlYWs7Ci0JCQljYXNlIDQ4OiAgUmF0ZSA9IFJBVEVfMjQ7CS8qaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDEwMDsgIGJyZWFrOwotCQkJY2FzZSA3MjogIFJhdGUgPSBSQVRFXzM2OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMjAwOwkgYnJlYWs7Ci0JCQljYXNlIDk2OiAgUmF0ZSA9IFJBVEVfNDg7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDA0MDA7CSBicmVhazsKLQkJCWNhc2UgMTA4OiBSYXRlID0gUkFURV81NDsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDgwMDsJIGJyZWFrOwotCQkJZGVmYXVsdDogIFJhdGUgPSBSQVRFXzE7CWJyZWFrOworCWZvciAoaSA9IDA7IGkgPCBFeHRSYXRlTGVuOyBpKyspIHsKKwkJc3dpdGNoIChwRXh0UmF0ZVtpXSAmIDB4N2YpIHsKKwkJY2FzZSAyOgorCQkJUmF0ZSA9IFJBVEVfMTsKKwkJCWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApCisJCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlSYXRlID0gUkFURV8yOworCQkJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkKKwkJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDAyOworCQkJYnJlYWs7CisJCWNhc2UgMTE6CisJCQlSYXRlID0gUkFURV81XzU7CisJCQlpZiAocEV4dFJhdGVbaV0gJiAweDgwKQorCQkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDQ7CisJCQlicmVhazsKKwkJY2FzZSAyMjoKKwkJCVJhdGUgPSBSQVRFXzExOworCQkJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkKKwkJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA4OworCQkJYnJlYWs7CisJCWNhc2UgMTI6CisJCQlSYXRlID0gUkFURV82OwkvKmlmIChwRXh0UmF0ZVtpXSAmIDB4ODApICovCisJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDEwOworCQkJYnJlYWs7CisJCWNhc2UgMTg6CisJCQlSYXRlID0gUkFURV85OworCQkJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkKKwkJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDIwOworCQkJYnJlYWs7CisJCWNhc2UgMjQ6CisJCQlSYXRlID0gUkFURV8xMjsJLyppZiAocEV4dFJhdGVbaV0gJiAweDgwKSAqLworCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDA0MDsKKwkJCWJyZWFrOworCQljYXNlIDM2OgorCQkJUmF0ZSA9IFJBVEVfMTg7CisJCQlpZiAocEV4dFJhdGVbaV0gJiAweDgwKQorCQkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwODA7CisJCQlicmVhazsKKwkJY2FzZSA0ODoKKwkJCVJhdGUgPSBSQVRFXzI0OwkvKmlmIChwRXh0UmF0ZVtpXSAmIDB4ODApICovCisJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMTAwOworCQkJYnJlYWs7CisJCWNhc2UgNzI6CisJCQlSYXRlID0gUkFURV8zNjsKKwkJCWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApCisJCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDIwMDsKKwkJCWJyZWFrOworCQljYXNlIDk2OgorCQkJUmF0ZSA9IFJBVEVfNDg7CisJCQlpZiAocEV4dFJhdGVbaV0gJiAweDgwKQorCQkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDA0MDA7CisJCQlicmVhazsKKwkJY2FzZSAxMDg6CisJCQlSYXRlID0gUkFURV81NDsKKwkJCWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApCisJCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDgwMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJUmF0ZSA9IFJBVEVfMTsKKwkJCWJyZWFrOwogCQl9Ci0JCWlmIChNYXhTdXBwb3J0IDwgUmF0ZSkJTWF4U3VwcG9ydCA9IFJhdGU7CisJCWlmIChNYXhTdXBwb3J0IDwgUmF0ZSkKKwkJCU1heFN1cHBvcnQgPSBSYXRlOwogCi0JCWlmIChNaW5TdXBwb3J0ID4gUmF0ZSkgTWluU3VwcG9ydCA9IFJhdGU7CisJCWlmIChNaW5TdXBwb3J0ID4gUmF0ZSkKKwkJCU1pblN1cHBvcnQgPSBSYXRlOwogCX0KIAogCVJUTVBfSU9fV1JJVEUzMihwQWQsIExFR0FDWV9CQVNJQ19SQVRFLCBCYXNpY1JhdGVCaXRtYXApOwogCi0JLy8gY2FsY3VsYXRlIHRoZSBleHB0ZWN0ZWQgQUNLIHJhdGUgZm9yIGVhY2ggVFggcmF0ZS4gVGhpcyBpbmZvIGlzIHVzZWQgdG8gY2FjdWxhdGUKLQkvLyB0aGUgRFVSQVRJT04gZmllbGQgb2Ygb3V0Z29pbmcgdW5paWNhc3QgREFUQS9NR01UIGZyYW1lCi0JZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykKLQl7CisJLyogYnVnIGZpeCAqLworCS8qIHBBZC0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCA9IEJhc2ljUmF0ZUJpdG1hcDsgKi8KKworCS8qIGNhbGN1bGF0ZSB0aGUgZXhwdGVjdGVkIEFDSyByYXRlIGZvciBlYWNoIFRYIHJhdGUuIFRoaXMgaW5mbyBpcyB1c2VkIHRvIGNhY3VsYXRlICovCisJLyogdGhlIERVUkFUSU9OIGZpZWxkIG9mIG91dGdvaW5nIHVuaWljYXN0IERBVEEvTUdNVCBmcmFtZSAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKSB7CiAJCWlmIChCYXNpY1JhdGVCaXRtYXAgJiAoMHgwMSA8PCBpKSkKLQkJCUN1cnJCYXNpY1JhdGUgPSAoVUNIQVIpaTsKKwkJCUN1cnJCYXNpY1JhdGUgPSAodTgpaTsKIAkJcEFkLT5Db21tb25DZmcuRXhwZWN0ZWRBQ0tSYXRlW2ldID0gQ3VyckJhc2ljUmF0ZTsKIAl9CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVUeFJhdGVzW01heFN1cHBvcnQgPSAlZF0gPSBNYXhEZXNpcmUgJWQgTWJwc1xuIiwgUmF0ZUlkVG9NYnBzW01heFN1cHBvcnRdLCBSYXRlSWRUb01icHNbTWF4RGVzaXJlXSkpOwotCS8vIG1heCB0eCByYXRlID0gbWluIHttYXggZGVzaXJlIHJhdGUsIG1heCBzdXBwb3J0ZWQgcmF0ZX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiTWxtZVVwZGF0ZVR4UmF0ZXNbTWF4U3VwcG9ydCA9ICVkXSA9IE1heERlc2lyZSAlZCBNYnBzXG4iLAorCQkgIFJhdGVJZFRvTWJwc1tNYXhTdXBwb3J0XSwgUmF0ZUlkVG9NYnBzW01heERlc2lyZV0pKTsKKwkvKiBtYXggdHggcmF0ZSA9IG1pbiB7bWF4IGRlc2lyZSByYXRlLCBtYXggc3VwcG9ydGVkIHJhdGV9ICovCiAJaWYgKE1heFN1cHBvcnQgPCBNYXhEZXNpcmUpCiAJCXBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA9IE1heFN1cHBvcnQ7CiAJZWxzZQogCQlwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPSBNYXhEZXNpcmU7CiAKIAlwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPSBNaW5TdXBwb3J0OwotCWlmICgqYXV0b19yYXRlX2N1cl9wKQotCXsKKwkvKiAyMDAzLTA3LTMxIGpvaG4gLSAyNTAwIGRvZXNuJ3QgaGF2ZSBnb29kIHNlbnNpdGl2aXR5IGF0IGhpZ2ggT0ZETSByYXRlcy4gdG8gaW5jcmVhc2UgdGhlIHN1Y2Nlc3MgKi8KKwkvKiByYXRpbyBvZiBpbml0aWFsIERIQ1AgcGFja2V0IGV4Y2hhbmdlLCBUWCByYXRlIHN0YXJ0cyBmcm9tIGEgbG93ZXIgcmF0ZSBkZXBlbmRpbmcgKi8KKwkvKiBvbiBhdmVyYWdlIFJTU0kgKi8KKwkvKiAgICAgICAxLiBSU1NJID49IC03MGRiLCBzdGFydCBhdCA1NCBNYnBzIChzaG9ydCBkaXN0YW5jZSkgKi8KKwkvKiAgICAgICAyLiAtNzAgPiBSU1NJID49IC03NSwgc3RhcnQgYXQgMjQgTWJwcyAobWlkIGRpc3RhbmNlKSAqLworCS8qICAgICAgIDMuIC03NSA+IFJTU0ksIHN0YXJ0IGF0IDExIE1icHMgKGxvbmcgZGlzdGFuY2UpICovCisJaWYgKCphdXRvX3JhdGVfY3VyX3ApIHsKIAkJc2hvcnQgZGJtID0gMDsKIAogCQlkYm0gPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKQEAgLTMwODMsMTEzICszMTQ3LDEzNyBAQAogCQllbHNlIGlmIChkYm0gPCAtNzApCiAJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzI0OwogCi0JCS8vIHNob3VsZCBuZXZlciBleGNlZWQgTWF4VHhSYXRlIChjb25zaWRlciAxMUItb25seSBtb2RlKQorCQkvKiBzaG91bGQgbmV2ZXIgZXhjZWVkIE1heFR4UmF0ZSAoY29uc2lkZXIgMTFCLW9ubHkgbW9kZSkgKi8KIAkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA+IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSkKIAkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKIAogCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IDA7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlOwotCQlwSHRQaHktPmZpZWxkLk1DUwk9IChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPiAzKSA/IChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgLSA0KSA6IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKLQkJcEh0UGh5LT5maWVsZC5NT0RFCT0gKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IDMpID8gTU9ERV9PRkRNIDogTU9ERV9DQ0s7CisJCXBIdFBoeS0+ZmllbGQuTUNTID0KKwkJICAgIChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPgorCQkgICAgIDMpID8gKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSAtCisJCQkgICA0KSA6IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKKwkJcEh0UGh5LT5maWVsZC5NT0RFID0KKwkJICAgIChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPiAzKSA/IE1PREVfT0ZETSA6IE1PREVfQ0NLOwogCi0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNUQkMJPSBwSHRQaHktPmZpZWxkLlNUQkM7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kJPSBwSHRQaHktPmZpZWxkLlNob3J0R0k7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUwkJPSBwSHRQaHktPmZpZWxkLk1DUzsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBIdFBoeS0+ZmllbGQuTU9ERTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU1RCQyA9CisJCSAgICBwSHRQaHktPmZpZWxkLlNUQkM7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPQorCQkgICAgcEh0UGh5LT5maWVsZC5TaG9ydEdJOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPQorCQkgICAgcEh0UGh5LT5maWVsZC5NQ1M7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPQorCQkgICAgcEh0UGh5LT5maWVsZC5NT0RFOwogCX0KIAotCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPD0gUkFURV8xMSkKLQl7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA8PSBSQVRFXzExKSB7CiAJCXBNYXhIdFBoeS0+ZmllbGQuTU9ERSA9IE1PREVfQ0NLOwogCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZTsKIAkJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGU7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwogCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZV07Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPj0gUkFURV82ICYmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPD0gUkFURV81NCkpCi0JCQl7cE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGVdO30KLQkJZWxzZQotCQkJe3BNaW5IdFBoeS0+ZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWluVHhSYXRlO30KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSA+PSBSQVRFXzYKKwkJICAgICYmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPD0gUkFURV81NCkpIHsKKwkJCXBNaW5IdFBoeS0+ZmllbGQuTUNTID0KKwkJCSAgICBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGVdOworCQl9IGVsc2UgeworCQkJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGU7CisJCX0KIAl9CiAKIAlwSHRQaHktPndvcmQgPSAocE1heEh0UGh5LT53b3JkKTsKLQlpZiAoYkxpbmtVcCAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCi0JewotCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCA9IHBIdFBoeS0+d29yZDsKLQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWF4SFRQaHlNb2RlLndvcmQgPSBwTWF4SHRQaHktPndvcmQ7Ci0JCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1pbkhUUGh5TW9kZS53b3JkID0gcE1pbkh0UGh5LT53b3JkOwotCX0KLQllbHNlCi0JewotCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpCi0JCXsKLQkJCWNhc2UgUEhZXzExQkdfTUlYRUQ6Ci0JCQljYXNlIFBIWV8xMUI6Ci0JCQljYXNlIFBIWV8xMUJHTl9NSVhFRDoKKwlpZiAoYkxpbmtVcCAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpIHsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCA9IHBIdFBoeS0+d29yZDsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NYXhIVFBoeU1vZGUud29yZCA9CisJCSAgICBwTWF4SHRQaHktPndvcmQ7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWluSFRQaHlNb2RlLndvcmQgPQorCQkgICAgcE1pbkh0UGh5LT53b3JkOworCX0gZWxzZSB7CisJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSkgeworCQljYXNlIFBIWV8xMUJHX01JWEVEOgorCQljYXNlIFBIWV8xMUI6CisJCWNhc2UgUEhZXzExQkdOX01JWEVEOgorCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzE7CisJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IFJBVEVfMTsKKworLyojaWZkZWYgICAgICAgIFdJRklfVEVTVCAqLworCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTE7CisvKiNlbHNlICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzE7ICovCisvKiNlbmRpZiAqLworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExRzoKKwkJY2FzZSBQSFlfMTFBOgorCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFOXzJfNEc6CisJCWNhc2UgUEhZXzExQU5fTUlYRUQ6CisJCWNhc2UgUEhZXzExTl81RzoKKwkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OworCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfNjsKKwkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9CisJCQkgICAgT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQUJHX01JWEVEOgorCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisJCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkgewogCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8xOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9CisJCQkJICAgIE1PREVfQ0NLOwogCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBSQVRFXzE7Ci0JCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBIWV8xMUc6Ci0JCQljYXNlIFBIWV8xMUE6Ci0JCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKLQkJCWNhc2UgUEhZXzExR05fTUlYRUQ6Ci0JCQljYXNlIFBIWV8xMU5fMl80RzoKLQkJCWNhc2UgUEhZXzExQU5fTUlYRUQ6Ci0JCQljYXNlIFBIWV8xMU5fNUc6CisJCQl9IGVsc2UgewogCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OwogCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzY7Ci0JCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUEhZXzExQUJHX01JWEVEOgotCQkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQotCQkJCXsKLQkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzE7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzE7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBSQVRFXzE7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OwotCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV82OwotCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OiAvLyBlcnJvcgotCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OwotICAgICAgICAgICAgICAgICAgICAgICAgCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07Ci0JCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTsKLQkJCQlicmVhazsKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9CisJCQkJICAgIE1PREVfT0ZETTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0KKwkJCQkgICAgT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CS8qIGVycm9yICovCisJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKKwkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9CisJCQkgICAgT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTsKKwkJCWJyZWFrOwogCQl9Ci0JCS8vCi0JCS8vIEtlZXAgQmFzaWMgTWxtZSBSYXRlLgotCQkvLwotCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS53b3JkID0gcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQ7CisJCS8qICovCisJCS8qIEtlZXAgQmFzaWMgTWxtZSBSYXRlLiAqLworCQkvKiAqLworCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS53b3JkID0KKwkJICAgIHBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC53b3JkOwogCQlpZiAocEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPT0gTU9ERV9PRkRNKQotCQkJcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbUkFURV8yNF07CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPQorCQkJICAgIE9mZG1SYXRlVG9SeHdpTUNTW1JBVEVfMjRdOwogCQllbHNlCi0JCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBSQVRFXzE7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPQorCQkJICAgIFJBVEVfMTsKIAkJcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOwogCX0KIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoTWF4RGVzaXJlPSVkLCBNYXhTdXBwb3J0PSVkLCBNYXhUeFJhdGU9JWQsIE1pblJhdGU9JWQsIFJhdGUgU3dpdGNoaW5nID0lZClcbiIsCi0JCQkgUmF0ZUlkVG9NYnBzW01heERlc2lyZV0sIFJhdGVJZFRvTWJwc1tNYXhTdXBwb3J0XSwgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZV0sIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGVdLAotCQkJIC8qT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSovKmF1dG9fcmF0ZV9jdXJfcCkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoVHhSYXRlPSVkLCBSdHNSYXRlPSVkLCBCYXNpY1JhdGVCaXRtYXA9MHglMDRseClcbiIsCi0JCQkgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZV0sIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5SdHNSYXRlXSwgQmFzaWNSYXRlQml0bWFwKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVVwZGF0ZVR4UmF0ZXMgKE1sbWVUcmFuc21pdD0weCV4LCBNaW5IVFBoeU1vZGU9JXgsIE1heEhUUGh5TW9kZT0weCV4LCBIVFBoeU1vZGU9MHgleClcbiIsCi0JCQkgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWluSFRQaHlNb2RlLndvcmQgLHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWF4SFRQaHlNb2RlLndvcmQgLHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQgKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoTWF4RGVzaXJlPSVkLCBNYXhTdXBwb3J0PSVkLCBNYXhUeFJhdGU9JWQsIE1pblJhdGU9JWQsIFJhdGUgU3dpdGNoaW5nID0lZClcbiIsCisJCSAgUmF0ZUlkVG9NYnBzW01heERlc2lyZV0sIFJhdGVJZFRvTWJwc1tNYXhTdXBwb3J0XSwKKwkJICBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlXSwKKwkJICBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuTWluVHhSYXRlXSwKKwkJICAvKk9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkgKi8KKwkJICAqYXV0b19yYXRlX2N1cl9wKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoVHhSYXRlPSVkLCBSdHNSYXRlPSVkLCBCYXNpY1JhdGVCaXRtYXA9MHglMDRseClcbiIsCisJCSAgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZV0sCisJCSAgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGVdLCBCYXNpY1JhdGVCaXRtYXApKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiTWxtZVVwZGF0ZVR4UmF0ZXMgKE1sbWVUcmFuc21pdD0weCV4LCBNaW5IVFBoeU1vZGU9JXgsIE1heEhUUGh5TW9kZT0weCV4LCBIVFBoeU1vZGU9MHgleClcbiIsCisJCSAgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQsCisJCSAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NaW5IVFBoeU1vZGUud29yZCwKKwkJICBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1heEhUUGh5TW9kZS53b3JkLAorCQkgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQpKTsKIH0KIAogLyoKQEAgLTMxOTgsMTY4ICszMjg2LDE5NiBAQAogCQlUaGlzIGZ1bmN0aW9uIHVwZGF0ZSBIVCBSYXRlIHNldHRpbmcuCiAJCUlucHV0IFdjaWQgdmFsdWUgaXMgdmFsaWQgZm9yIDIgY2FzZSA6CiAJCTEuIGl0J3MgdXNlZCBmb3IgU3RhdGlvbiBpbiBpbmZyYSBtb2RlIHRoYXQgY29weSBBUCByYXRlIHRvIE1hY3RhYmxlLgotCQkyLiBPUiBTdGF0aW9uIAlpbiBhZGhvYyBtb2RlIHRvIGNvcHkgcGVlcidzIEhUIHJhdGUgdG8gTWFjdGFibGUuCisJCTIuIE9SIFN0YXRpb24JaW4gYWRob2MgbW9kZSB0byBjb3B5IHBlZXIncyBIVCByYXRlIHRvIE1hY3RhYmxlLgogCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIE1sbWVVcGRhdGVIdFR4UmF0ZXMoCi0JSU4gUFJUTVBfQURBUFRFUiAJCXBBZCwKLQlJTglVQ0hBUgkJCQlhcGlkeCkKK3ZvaWQgTWxtZVVwZGF0ZUh0VHhSYXRlcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IGFwaWR4KQogewotCVVDSEFSCVN0YmNNY3M7IC8vaiwgU3RiY01jcywgYml0bWFzazsKLQlDSEFSIAlpOyAvLyAzKjMKLQlSVF9IVF9DQVBBQklMSVRZIAkqcFJ0SHRDYXAgPSBOVUxMOwotCVJUX0hUX1BIWV9JTkZPCQkqcEFjdGl2ZUh0UGh5ID0gTlVMTDsKLQlVTE9ORwkJQmFzaWNNQ1M7Ci0JVUNIQVIgaiwgYml0bWFzazsKLQlQUlRfSFRfUEhZX0lORk8JCQlwRGVzaXJlSHRQaHkgPSBOVUxMOwotCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBIdFBoeSA9IE5VTEw7Ci0JUEhUVFJBTlNNSVRfU0VUVElORwkJcE1heEh0UGh5ID0gTlVMTDsKLQlQSFRUUkFOU01JVF9TRVRUSU5HCQlwTWluSHRQaHkgPSBOVUxMOwotCUJPT0xFQU4gCQkJCSphdXRvX3JhdGVfY3VyX3A7CisJdTggU3RiY01jczsJCS8qaiwgU3RiY01jcywgYml0bWFzazsgKi8KKwljaGFyIGk7CQkJLyogMyozICovCisJc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHkgKnBSdEh0Q2FwID0gTlVMTDsKKwlzdHJ1Y3QgcnRfaHRfcGh5X2luZm8gKnBBY3RpdmVIdFBoeSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBCYXNpY01DUzsKKwl1OCBqLCBiaXRtYXNrOworCXN0cnVjdCBydF9odF9waHlfaW5mbyAqcERlc2lyZUh0UGh5ID0gTlVMTDsKKwlQSFRUUkFOU01JVF9TRVRUSU5HIHBIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORyBwTWF4SHRQaHkgPSBOVUxMOworCVBIVFRSQU5TTUlUX1NFVFRJTkcgcE1pbkh0UGh5ID0gTlVMTDsKKwlCT09MRUFOICphdXRvX3JhdGVfY3VyX3A7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVIdFR4UmF0ZXM9PT0+IFxuIikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVVcGRhdGVIdFR4UmF0ZXM9PT0+IFxuIikpOwogCiAJYXV0b19yYXRlX2N1cl9wID0gTlVMTDsKIAogCXsKLQkJcERlc2lyZUh0UGh5CT0gJnBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm87Ci0JCXBBY3RpdmVIdFBoeQk9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOwotCQlwSHRQaHkgCQk9ICZwQWQtPlN0YUNmZy5IVFBoeU1vZGU7Ci0JCXBNYXhIdFBoeQk9ICZwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGU7Ci0JCXBNaW5IdFBoeQk9ICZwQWQtPlN0YUNmZy5NaW5IVFBoeU1vZGU7CisJCXBEZXNpcmVIdFBoeSA9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOworCQlwQWN0aXZlSHRQaHkgPSAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mbzsKKwkJcEh0UGh5ID0gJnBBZC0+U3RhQ2ZnLkhUUGh5TW9kZTsKKwkJcE1heEh0UGh5ID0gJnBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZTsKKwkJcE1pbkh0UGh5ID0gJnBBZC0+U3RhQ2ZnLk1pbkhUUGh5TW9kZTsKIAogCQlhdXRvX3JhdGVfY3VyX3AgPSAmcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2g7CiAJfQogCi0JaWYgKChBREhPQ19PTihwQWQpIHx8IElORlJBX09OKHBBZCkpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkKLQl7CisJaWYgKChBREhPQ19PTihwQWQpIHx8IElORlJBX09OKHBBZCkpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkgewogCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpCiAJCQlyZXR1cm47CiAKIAkJcFJ0SHRDYXAgPSAmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHk7CiAJCXBBY3RpdmVIdFBoeSA9ICZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvOwotCQlTdGJjTWNzID0gKFVDSEFSKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMy5TdGJjTWNzOwotCQlCYXNpY01DUyA9cEFkLT5NbG1lQXV4LkFkZEh0SW5mby5NQ1NTZXRbMF0rKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uTUNTU2V0WzFdPDw4KSsoU3RiY01jczw8MTYpOwotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpICYmIChwUnRIdENhcC0+UnhTVEJDKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKKwkJU3RiY01jcyA9ICh1OClwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzMuU3RiY01jczsKKwkJQmFzaWNNQ1MgPQorCQkgICAgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5NQ1NTZXRbMF0gKworCQkgICAgKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uTUNTU2V0WzFdIDw8IDgpICsgKFN0YmNNY3MgPDwgMTYpOworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpICYmIChwUnRIdENhcC0+UnhTVEJDKQorCQkgICAgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCiAJCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKIAkJZWxzZQogCQkJcE1heEh0UGh5LT5maWVsZC5TVEJDID0gU1RCQ19OT05FOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCWlmIChwRGVzaXJlSHRQaHktPmJIdEVuYWJsZSA9PSBGQUxTRSkKIAkJCXJldHVybjsKIAogCQlwUnRIdENhcCA9ICZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHk7Ci0JCVN0YmNNY3MgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzMuU3RiY01jczsKLQkJQmFzaWNNQ1MgPSBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uTUNTU2V0WzBdKyhwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uTUNTU2V0WzFdPDw4KSsoU3RiY01jczw8MTYpOwotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpICYmIChwUnRIdENhcC0+UnhTVEJDKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKKwkJU3RiY01jcyA9ICh1OClwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMy5TdGJjTWNzOworCQlCYXNpY01DUyA9CisJCSAgICBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uTUNTU2V0WzBdICsKKwkJICAgIChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uTUNTU2V0WzFdIDw8IDgpICsgKFN0YmNNY3MgPDwgMTYpOworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpICYmIChwUnRIdENhcC0+UnhTVEJDKQorCQkgICAgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCiAJCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKIAkJZWxzZQogCQkJcE1heEh0UGh5LT5maWVsZC5TVEJDID0gU1RCQ19OT05FOwogCX0KIAotCS8vIERlY2lkZSBNQVggaHQgcmF0ZS4KKwkvKiBEZWNpZGUgTUFYIGh0IHJhdGUuICovCiAJaWYgKChwUnRIdENhcC0+R0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQogCQlwTWF4SHRQaHktPmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKIAllbHNlCiAJCXBNYXhIdFBoeS0+ZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CiAKLSAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpICYmIChwUnRIdENhcC0+Q2hhbm5lbFdpZHRoKSkKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpCisJICAgICYmIChwUnRIdENhcC0+Q2hhbm5lbFdpZHRoKSkKIAkJcE1heEh0UGh5LT5maWVsZC5CVyA9IEJXXzQwOwogCWVsc2UKIAkJcE1heEh0UGh5LT5maWVsZC5CVyA9IEJXXzIwOwogCi0gICAgaWYgKHBNYXhIdFBoeS0+ZmllbGQuQlcgPT0gQldfMjApCi0JCXBNYXhIdFBoeS0+ZmllbGQuU2hvcnRHSSA9IChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwICYgcFJ0SHRDYXAtPlNob3J0R0lmb3IyMCk7CisJaWYgKHBNYXhIdFBoeS0+ZmllbGQuQlcgPT0gQldfMjApCisJCXBNYXhIdFBoeS0+ZmllbGQuU2hvcnRHSSA9CisJCSAgICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCAmIHBSdEh0Q2FwLT4KKwkJICAgICBTaG9ydEdJZm9yMjApOwogCWVsc2UKLQkJcE1heEh0UGh5LT5maWVsZC5TaG9ydEdJID0gKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgJiBwUnRIdENhcC0+U2hvcnRHSWZvcjQwKTsKKwkJcE1heEh0UGh5LT5maWVsZC5TaG9ydEdJID0KKwkJICAgIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwICYgcFJ0SHRDYXAtPgorCQkgICAgIFNob3J0R0lmb3I0MCk7CiAKLQlmb3IgKGk9MjM7IGk+PTA7IGktLSkgLy8gMyozCisJaWYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzRdICE9IDApIHsKKwkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSAzMjsKKwl9CisKKwlmb3IgKGkgPSAyMzsgaSA+PSAwOyBpLS0pCS8qIDMqMyAqLwogCXsKLQkJaiA9IGkvODsKLQkJYml0bWFzayA9ICgxPDwoaS0oaio4KSkpOworCQlqID0gaSAvIDg7CisJCWJpdG1hc2sgPSAoMSA8PCAoaSAtIChqICogOCkpKTsKIAotCQlpZiAoKHBBY3RpdmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykgJiYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykpCi0JCXsKKwkJaWYgKChwQWN0aXZlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spCisJCSAgICAmJiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSkgewogCQkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSBpOwogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoaT09MCkKKwkJaWYgKGkgPT0gMCkKIAkJCWJyZWFrOwogCX0KIAotCS8vIENvcHkgTUlOIGh0IHJhdGUuICBydDI4NjA/Pz8KKwkvKiBDb3B5IE1JTiBodCByYXRlLiAgcnQyODYwPz8/ICovCiAJcE1pbkh0UGh5LT5maWVsZC5CVyA9IEJXXzIwOwogCXBNaW5IdFBoeS0+ZmllbGQuTUNTID0gMDsKIAlwTWluSHRQaHktPmZpZWxkLlNUQkMgPSAwOwogCXBNaW5IdFBoeS0+ZmllbGQuU2hvcnRHSSA9IDA7Ci0JLy9JZiBTVEEgYXNzaWducyBmaXhlZCByYXRlLiB1cGRhdGUgdG8gZml4ZWQgaGVyZS4KLQlpZiAoIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbMF0gIT0gMHhmZikpCi0JewotCQlpZiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbNF0gIT0gMCkKLQkJeworCS8qSWYgU1RBIGFzc2lnbnMgZml4ZWQgcmF0ZS4gdXBkYXRlIHRvIGZpeGVkIGhlcmUuICovCisJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbMF0gIT0gMHhmZikpIHsKKwkJaWYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzRdICE9IDApIHsKIAkJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gMzI7CiAJCQlwTWluSHRQaHktPmZpZWxkLk1DUyA9IDMyOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlSHRUeFJhdGVzPD09PSBVc2UgRml4ZWQgTUNTID0gJWRcbiIscE1pbkh0UGh5LT5maWVsZC5NQ1MpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk1sbWVVcGRhdGVIdFR4UmF0ZXM8PT09IFVzZSBGaXhlZCBNQ1MgPSAlZFxuIiwKKwkJCQkgIHBNaW5IdFBoeS0+ZmllbGQuTUNTKSk7CiAJCX0KIAotCQlmb3IgKGk9MjM7IChDSEFSKWkgPj0gMDsgaS0tKSAvLyAzKjMKKwkJZm9yIChpID0gMjM7IChjaGFyKWkgPj0gMDsgaS0tKQkvKiAzKjMgKi8KIAkJewotCQkJaiA9IGkvODsKLQkJCWJpdG1hc2sgPSAoMTw8KGktKGoqOCkpKTsKLQkJCWlmICggKHBEZXNpcmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykgJiYgKHBBY3RpdmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykpCi0JCQl7CisJCQlqID0gaSAvIDg7CisJCQliaXRtYXNrID0gKDEgPDwgKGkgLSAoaiAqIDgpKSk7CisJCQlpZiAoKHBEZXNpcmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykKKwkJCSAgICAmJiAocEFjdGl2ZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSkgewogCQkJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gaTsKIAkJCQlwTWluSHRQaHktPmZpZWxkLk1DUyA9IGk7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlpZiAoaT09MCkKKwkJCWlmIChpID09IDApCiAJCQkJYnJlYWs7CiAJCX0KIAl9CiAKLQkvLyBEZWNpZGUgaHQgcmF0ZQorCS8qIERlY2lkZSBodCByYXRlICovCiAJcEh0UGh5LT5maWVsZC5TVEJDID0gcE1heEh0UGh5LT5maWVsZC5TVEJDOwogCXBIdFBoeS0+ZmllbGQuQlcgPSBwTWF4SHRQaHktPmZpZWxkLkJXOwogCXBIdFBoeS0+ZmllbGQuTU9ERSA9IHBNYXhIdFBoeS0+ZmllbGQuTU9ERTsKIAlwSHRQaHktPmZpZWxkLk1DUyA9IHBNYXhIdFBoeS0+ZmllbGQuTUNTOwogCXBIdFBoeS0+ZmllbGQuU2hvcnRHSSA9IHBNYXhIdFBoeS0+ZmllbGQuU2hvcnRHSTsKIAotCS8vIHVzZSBkZWZhdWx0IG5vdy4gcnQyODYwCisJLyogdXNlIGRlZmF1bHQgbm93LiBydDI4NjAgKi8KIAlpZiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbMF0gIT0gMHhmZikKIAkJKmF1dG9fcmF0ZV9jdXJfcCA9IEZBTFNFOwogCWVsc2UKIAkJKmF1dG9fcmF0ZV9jdXJfcCA9IFRSVUU7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZUh0VHhSYXRlczwtLS0uQU1zZHVTaXplID0gJWQgIFxuIiwgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSApKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlRYOiBNQ1NbMF0gPSAleCAoY2hvb3NlICVkKSwgQlcgPSAlZCwgU2hvcnRHSSA9ICVkLCBNT0RFID0gJWQsICBcbiIsIHBBY3RpdmVIdFBoeS0+TUNTU2V0WzBdLHBIdFBoeS0+ZmllbGQuTUNTLAotCQlwSHRQaHktPmZpZWxkLkJXLCBwSHRQaHktPmZpZWxkLlNob3J0R0ksIHBIdFBoeS0+ZmllbGQuTU9ERSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiTWxtZVVwZGF0ZUh0VHhSYXRlczw9PT0gXG4iKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiBNbG1lVXBkYXRlSHRUeFJhdGVzPC0tLS5BTXNkdVNpemUgPSAlZCAgXG4iLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiVFg6IE1DU1swXSA9ICV4IChjaG9vc2UgJWQpLCBCVyA9ICVkLCBTaG9ydEdJID0gJWQsIE1PREUgPSAlZCwgIFxuIiwKKwkJICBwQWN0aXZlSHRQaHktPk1DU1NldFswXSwgcEh0UGh5LT5maWVsZC5NQ1MsIHBIdFBoeS0+ZmllbGQuQlcsCisJCSAgcEh0UGh5LT5maWVsZC5TaG9ydEdJLCBwSHRQaHktPmZpZWxkLk1PREUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lVXBkYXRlSHRUeFJhdGVzPD09PSBcbiIpKTsKIH0KIAotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIE1sbWVSYWRpb09mZigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3ZvaWQgQkFUYWJsZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfYmFfdGFibGUgKlRhYikKIHsKLQlSVDI4WFhfTUxNRV9SQURJT19PRkYocEFkKTsKKwlpbnQgaTsKKworCVRhYi0+bnVtQXNPcmlnaW5hdG9yID0gMDsKKwlUYWItPm51bUFzUmVjaXBpZW50ID0gMDsKKwlUYWItPm51bURvbmVPcmlnaW5hdG9yID0gMDsKKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKSB7CisJCVRhYi0+QkFSZWNFbnRyeVtpXS5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X05PTkU7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCYoVGFiLT5CQVJlY0VudHJ5W2ldLlJ4UmVSaW5nTG9jaykpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CQV9PUklfVEFCTEU7IGkrKykgeworCQlUYWItPkJBT3JpRW50cnlbaV0uT1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKKwl9CiB9CiAKLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBNbG1lUmFkaW9PbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKKy8qIElSUUwgPSBESVNQQVRDSF9MRVZFTCAqLwordm9pZCBNbG1lUmFkaW9PZmYoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVJUMjhYWF9NTE1FX1JBRElPX09OKHBBZCk7CisJUlRNUF9NTE1FX1JBRElPX09GRihwQWQpOwogfQogCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBic3NfdGFibGUuYwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyogSVJRTCA9IERJU1BBVENIX0xFVkVMICovCit2b2lkIE1sbWVSYWRpb09uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlSVE1QX01MTUVfUkFESU9fT04ocEFkKTsKK30KIAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogYnNzX3RhYmxlLmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAogLyohIFxicmllZiBpbml0aWFsaXplIEJTUyB0YWJsZQogICoJXHBhcmFtIHBfdGFiIHBvaW50ZXIgdG8gdGhlIHRhYmxlCkBAIC0zMzcxLDM3ICszNDg3LDE1IEBACiAgSVJRTCA9IERJU1BBVENIX0xFVkVMCiAKICAqLwotVk9JRCBCc3NUYWJsZUluaXQoCi0JSU4gQlNTX1RBQkxFICpUYWIpCit2b2lkIEJzc1RhYmxlSW5pdChzdHJ1Y3QgcnRfYnNzX3RhYmxlICpUYWIpCiB7CiAJaW50IGk7CiAKIAlUYWItPkJzc05yID0gMDsKLSAgICBUYWItPkJzc092ZXJsYXBOciA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQlNTX1RBQkxFOyBpKyspCi0JewotCQlOZGlzWmVyb01lbW9yeSgmVGFiLT5Cc3NFbnRyeVtpXSwgc2l6ZW9mKEJTU19FTlRSWSkpOwotCQlUYWItPkJzc0VudHJ5W2ldLlJzc2kgPSAtMTI3OwkvLyBpbml0aWFsIHRoZSByc3NpIGFzIGEgbWluaW11bSB2YWx1ZQotCX0KLX0KLQotVk9JRCBCQVRhYmxlSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBCQV9UQUJMRSAqVGFiKQotewotCWludCBpOwotCi0JVGFiLT5udW1Bc09yaWdpbmF0b3IgPSAwOwotCVRhYi0+bnVtQXNSZWNpcGllbnQgPSAwOwotCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBpKyspCi0JewotCQlUYWItPkJBUmVjRW50cnlbaV0uUkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9OT05FOwotCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmKFRhYi0+QkFSZWNFbnRyeVtpXS5SeFJlUmluZ0xvY2spKTsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFOyBpKyspCi0JewotCQlUYWItPkJBT3JpRW50cnlbaV0uT1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKKwlUYWItPkJzc092ZXJsYXBOciA9IDA7CisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQlNTX1RBQkxFOyBpKyspIHsKKwkJTmRpc1plcm9NZW1vcnkoJlRhYi0+QnNzRW50cnlbaV0sIHNpemVvZihzdHJ1Y3QgcnRfYnNzX2VudHJ5KSk7CisJCVRhYi0+QnNzRW50cnlbaV0uUnNzaSA9IC0xMjc7CS8qIGluaXRpYWwgdGhlIHJzc2kgYXMgYSBtaW5pbXVtIHZhbHVlICovCiAJfQogfQogCkBAIC0zNDE2LDk3ICszNTEwLDEwMiBAQAogIElSUUwgPSBESVNQQVRDSF9MRVZFTAogCiAgKi8KLVVMT05HIEJzc1RhYmxlU2VhcmNoKAotCUlOIEJTU19UQUJMRSAqVGFiLAotCUlOIFBVQ0hBUgkgcEJzc2lkLAotCUlOIFVDSEFSCSBDaGFubmVsKQordW5zaWduZWQgbG9uZyBCc3NUYWJsZVNlYXJjaChzdHJ1Y3QgcnRfYnNzX3RhYmxlICpUYWIsIHU4ICpwQnNzaWQsIHU4IENoYW5uZWwpCiB7Ci0JVUNIQVIgaTsKKwl1OCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKLQl7Ci0JCS8vCi0JCS8vIFNvbWUgQVAgdGhhdCBzdXBwb3J0IEEvQi9HIG1vZGUgdGhhdCBtYXkgdXNlZCB0aGUgc2FtZSBCU1NJRCBvbiAxMUEgYW5kIDExQi9HLgotCQkvLyBXZSBzaG91bGQgZGlzdGluZ3Vpc2ggdGhpcyBjYXNlLgotCQkvLworCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspIHsKKwkJLyogKi8KKwkJLyogU29tZSBBUCB0aGF0IHN1cHBvcnQgQS9CL0cgbW9kZSB0aGF0IG1heSB1c2VkIHRoZSBzYW1lIEJTU0lEIG9uIDExQSBhbmQgMTFCL0cuICovCisJCS8qIFdlIHNob3VsZCBkaXN0aW5ndWlzaCB0aGlzIGNhc2UuICovCisJCS8qICovCiAJCWlmICgoKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPD0gMTQpICYmIChDaGFubmVsIDw9IDE0KSkgfHwKLQkJCSAoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCi0JCQlNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpKQotCQl7CisJCSAgICAgKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPiAxNCkgJiYgKENoYW5uZWwgPiAxNCkpKSAmJgorCQkgICAgTUFDX0FERFJfRVFVQUwoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCwgcEJzc2lkKSkgewogCQkJcmV0dXJuIGk7CiAJCX0KIAl9Ci0JcmV0dXJuIChVTE9ORylCU1NfTk9UX0ZPVU5EOworCXJldHVybiAodW5zaWduZWQgbG9uZylCU1NfTk9UX0ZPVU5EOwogfQogCi1VTE9ORyBCc3NTc2lkVGFibGVTZWFyY2goCi0JSU4gQlNTX1RBQkxFICpUYWIsCi0JSU4gUFVDSEFSCSBwQnNzaWQsCi0JSU4gUFVDSEFSCSBwU3NpZCwKLQlJTiBVQ0hBUgkgU3NpZExlbiwKLQlJTiBVQ0hBUgkgQ2hhbm5lbCkKK3Vuc2lnbmVkIGxvbmcgQnNzU3NpZFRhYmxlU2VhcmNoKHN0cnVjdCBydF9ic3NfdGFibGUgKlRhYiwKKwkJCSB1OCAqcEJzc2lkLAorCQkJIHU4ICpwU3NpZCwgdTggU3NpZExlbiwgdTggQ2hhbm5lbCkKIHsKLQlVQ0hBUiBpOworCXU4IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQotCXsKLQkJLy8KLQkJLy8gU29tZSBBUCB0aGF0IHN1cHBvcnQgQS9CL0cgbW9kZSB0aGF0IG1heSB1c2VkIHRoZSBzYW1lIEJTU0lEIG9uIDExQSBhbmQgMTFCL0cuCi0JCS8vIFdlIHNob3VsZCBkaXN0aW5ndWlzaCB0aGlzIGNhc2UuCi0JCS8vCisJZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykgeworCQkvKiAqLworCQkvKiBTb21lIEFQIHRoYXQgc3VwcG9ydCBBL0IvRyBtb2RlIHRoYXQgbWF5IHVzZWQgdGhlIHNhbWUgQlNTSUQgb24gMTFBIGFuZCAxMUIvRy4gKi8KKwkJLyogV2Ugc2hvdWxkIGRpc3Rpbmd1aXNoIHRoaXMgY2FzZS4gKi8KKwkJLyogKi8KIAkJaWYgKCgoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA8PSAxNCkgJiYgKENoYW5uZWwgPD0gMTQpKSB8fAotCQkJICgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID4gMTQpICYmIChDaGFubmVsID4gMTQpKSkgJiYKLQkJCU1BQ19BRERSX0VRVUFMKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQsIHBCc3NpZCkgJiYKLQkJCVNTSURfRVFVQUwocFNzaWQsIFNzaWRMZW4sIFRhYi0+QnNzRW50cnlbaV0uU3NpZCwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkTGVuKSkKLQkJeworCQkgICAgICgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID4gMTQpICYmIChDaGFubmVsID4gMTQpKSkgJiYKKwkJICAgIE1BQ19BRERSX0VRVUFMKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQsIHBCc3NpZCkgJiYKKwkJICAgIFNTSURfRVFVQUwocFNzaWQsIFNzaWRMZW4sIFRhYi0+QnNzRW50cnlbaV0uU3NpZCwKKwkJCSAgICAgICBUYWItPkJzc0VudHJ5W2ldLlNzaWRMZW4pKSB7CiAJCQlyZXR1cm4gaTsKIAkJfQogCX0KLQlyZXR1cm4gKFVMT05HKUJTU19OT1RfRk9VTkQ7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKUJTU19OT1RfRk9VTkQ7CiB9CiAKLVVMT05HIEJzc1RhYmxlU2VhcmNoV2l0aFNTSUQoCi0JSU4gQlNTX1RBQkxFICpUYWIsCi0JSU4gUFVDSEFSCSBCc3NpZCwKLQlJTiBQVUNIQVIJIHBTc2lkLAotCUlOIFVDSEFSCSBTc2lkTGVuLAotCUlOIFVDSEFSCSBDaGFubmVsKQordW5zaWduZWQgbG9uZyBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKHN0cnVjdCBydF9ic3NfdGFibGUgKlRhYiwKKwkJCSAgICAgdTggKkJzc2lkLAorCQkJICAgICB1OCAqcFNzaWQsCisJCQkgICAgIHU4IFNzaWRMZW4sIHU4IENoYW5uZWwpCiB7Ci0JVUNIQVIgaTsKKwl1OCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKLQl7CisJZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykgewogCQlpZiAoKCgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsIDw9IDE0KSAmJiAoQ2hhbm5lbCA8PSAxNCkpIHx8Ci0JCQkoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCi0JCQlNQUNfQUREUl9FUVVBTCgmKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQpLCBCc3NpZCkgJiYKLQkJCShTU0lEX0VRVUFMKHBTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W2ldLlNzaWQsIFRhYi0+QnNzRW50cnlbaV0uU3NpZExlbikgfHwKLQkJCShOZGlzRXF1YWxNZW1vcnkocFNzaWQsIFplcm9Tc2lkLCBTc2lkTGVuKSkgfHwKLQkJCShOZGlzRXF1YWxNZW1vcnkoVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLCBaZXJvU3NpZCwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkTGVuKSkpKQotCQl7CisJCSAgICAgKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPiAxNCkgJiYgKENoYW5uZWwgPiAxNCkpKSAmJgorCQkgICAgTUFDX0FERFJfRVFVQUwoJihUYWItPkJzc0VudHJ5W2ldLkJzc2lkKSwgQnNzaWQpICYmCisJCSAgICAoU1NJRF9FUVVBTAorCQkgICAgIChwU3NpZCwgU3NpZExlbiwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLAorCQkgICAgICBUYWItPkJzc0VudHJ5W2ldLlNzaWRMZW4pCisJCSAgICAgfHwgKE5kaXNFcXVhbE1lbW9yeShwU3NpZCwgWmVyb1NzaWQsIFNzaWRMZW4pKQorCQkgICAgIHx8CisJCSAgICAgKE5kaXNFcXVhbE1lbW9yeQorCQkgICAgICAoVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLCBaZXJvU3NpZCwKKwkJICAgICAgIFRhYi0+QnNzRW50cnlbaV0uU3NpZExlbikpKSkgewogCQkJcmV0dXJuIGk7CiAJCX0KIAl9Ci0JcmV0dXJuIChVTE9ORylCU1NfTk9UX0ZPVU5EOworCXJldHVybiAodW5zaWduZWQgbG9uZylCU1NfTk9UX0ZPVU5EOwogfQogCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgQnNzVGFibGVEZWxldGVFbnRyeSgKLQlJTiBPVVQJQlNTX1RBQkxFICpUYWIsCi0JSU4JCVBVQ0hBUgkgIHBCc3NpZCwKLQlJTgkJVUNIQVIJICBDaGFubmVsKQordW5zaWduZWQgbG9uZyBCc3NTc2lkVGFibGVTZWFyY2hCeVNTSUQoc3RydWN0IHJ0X2Jzc190YWJsZSAqVGFiLAorCQkJICAgICAgIHU4ICpwU3NpZCwgdTggU3NpZExlbikKIHsKLQlVQ0hBUiBpLCBqOworCXU4IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKSB7CisJCWlmIChTU0lEX0VRVUFMCisJCSAgICAocFNzaWQsIFNzaWRMZW4sIFRhYi0+QnNzRW50cnlbaV0uU3NpZCwKKwkJICAgICBUYWItPkJzc0VudHJ5W2ldLlNzaWRMZW4pKSB7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpQlNTX05PVF9GT1VORDsKK30KKworLyogSVJRTCA9IERJU1BBVENIX0xFVkVMICovCit2b2lkIEJzc1RhYmxlRGVsZXRlRW50cnkoc3RydWN0IHJ0X2Jzc190YWJsZSAqVGFiLAorCQkJIHU4ICpwQnNzaWQsIHU4IENoYW5uZWwpCit7CisJdTggaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspIHsKIAkJaWYgKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPT0gQ2hhbm5lbCkgJiYKLQkJCShNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpKSkKLQkJewotCQkJZm9yIChqID0gaTsgaiA8IFRhYi0+QnNzTnIgLSAxOyBqKyspCi0JCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJihUYWItPkJzc0VudHJ5W2pdKSwgJihUYWItPkJzc0VudHJ5W2ogKyAxXSksIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJICAgIChNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpKSkgeworCQkJZm9yIChqID0gaTsgaiA8IFRhYi0+QnNzTnIgLSAxOyBqKyspIHsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmKFRhYi0+QnNzRW50cnlbal0pLAorCQkJCQkgICAgICAgJihUYWItPkJzc0VudHJ5W2ogKyAxXSksCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2Jzc19lbnRyeSkpOwogCQkJfQotCQkJTmRpc1plcm9NZW1vcnkoJihUYWItPkJzc0VudHJ5W1RhYi0+QnNzTnIgLSAxXSksIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJCU5kaXNaZXJvTWVtb3J5KCYoVGFiLT5Cc3NFbnRyeVtUYWItPkJzc05yIC0gMV0pLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2Jzc19lbnRyeSkpOwogCQkJVGFiLT5Cc3NOciAtPSAxOwogCQkJcmV0dXJuOwogCQl9CkBAIC0zNTIyLDI1ICszNjIxLDI0IEBACiAJLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBCQVRhYmxlRGVsZXRlT1JJRW50cnkoCi0JSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCQlCQV9PUklfRU5UUlkJKnBCQU9SSUVudHJ5KQordm9pZCBCQVRhYmxlRGVsZXRlT1JJRW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X2JhX29yaV9lbnRyeSAqcEJBT1JJRW50cnkpCiB7CiAKLQlpZiAocEJBT1JJRW50cnktPk9SSV9CQV9TdGF0dXMgIT0gT3JpZ2luYXRvcl9OT05FKQotCXsKKwlpZiAocEJBT1JJRW50cnktPk9SSV9CQV9TdGF0dXMgIT0gT3JpZ2luYXRvcl9OT05FKSB7CiAJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKLQkJaWYgKHBCQU9SSUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkKLQkJeworCQlpZiAocEJBT1JJRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKSB7CiAJCQlwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yIC09IDE7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQVRhYmxlRGVsZXRlT1JJRW50cnkgbnVtQXNPcmlnaW5hdG9yPSAlbGRcbiIsIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCkpOwotCQkJLy8gRXJhc2UgQml0bWFwIGZsYWcuCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJCQVRhYmxlRGVsZXRlT1JJRW50cnkgbnVtQXNPcmlnaW5hdG9yPSAlbGRcbiIsCisJCQkJICBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQpKTsKKwkJCS8qIEVyYXNlIEJpdG1hcCBmbGFnLiAqLwogCQl9Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBT1JJRW50cnktPldjaWRdLlRYQkFiaXRtYXAgJj0gKH4oMTw8KHBCQU9SSUVudHJ5LT5USUQpICkpOwkvLyBJZiBTVEEgbW9kZSwgIGVyYXNlIGZsYWcgaGVyZQotCQlwQWQtPk1hY1RhYi5Db250ZW50W3BCQU9SSUVudHJ5LT5XY2lkXS5CQU9yaVdjaWRBcnJheVtwQkFPUklFbnRyeS0+VElEXSA9IDA7CS8vIElmIFNUQSBtb2RlLCAgZXJhc2UgZmxhZyBoZXJlCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBT1JJRW50cnktPldjaWRdLlRYQkFiaXRtYXAgJj0gKH4oMSA8PCAocEJBT1JJRW50cnktPlRJRCkpKTsJLyogSWYgU1RBIG1vZGUsICBlcmFzZSBmbGFnIGhlcmUgKi8KKwkJcEFkLT5NYWNUYWIuQ29udGVudFtwQkFPUklFbnRyeS0+V2NpZF0uQkFPcmlXY2lkQXJyYXlbcEJBT1JJRW50cnktPlRJRF0gPSAwOwkvKiBJZiBTVEEgbW9kZSwgIGVyYXNlIGZsYWcgaGVyZSAqLwogCQlwQkFPUklFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKIAkJcEJBT1JJRW50cnktPlRva2VuID0gMTsKLQkJLy8gTm90IGNsZWFyIFNlcXVlbmNlIGhlcmUuCisJCS8qIE5vdCBjbGVhciBTZXF1ZW5jZSBoZXJlLiAqLwogCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CiAJfQogfQpAQCAtMzU1NCwxOTAgKzM2NTIsMTY0IEBACiAgSVJRTCA9IERJU1BBVENIX0xFVkVMCiAKICAqLwotVk9JRCBCc3NFbnRyeVNldCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQgQlNTX0VOVFJZICpwQnNzLAotCUlOIFBVQ0hBUiBwQnNzaWQsCi0JSU4gQ0hBUiBTc2lkW10sCi0JSU4gVUNIQVIgU3NpZExlbiwKLQlJTiBVQ0hBUiBCc3NUeXBlLAotCUlOIFVTSE9SVCBCZWFjb25QZXJpb2QsCi0JSU4gUENGX1BBUk0gcENmUGFybSwKLQlJTiBVU0hPUlQgQXRpbVdpbiwKLQlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCi0JSU4gVUNIQVIgU3VwUmF0ZVtdLAotCUlOIFVDSEFSIFN1cFJhdGVMZW4sCi0JSU4gVUNIQVIgRXh0UmF0ZVtdLAotCUlOIFVDSEFSIEV4dFJhdGVMZW4sCi0JSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKLQlJTiBBRERfSFRfSU5GT19JRSAqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCi0JSU4gVUNIQVIJCQlBZGRIdEluZm9MZW4sCi0JSU4gVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0LAotCUlOIFVDSEFSIENoYW5uZWwsCi0JSU4gQ0hBUiBSc3NpLAotCUlOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAotCUlOIFVDSEFSIENraXBGbGFnLAotCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotCUlOIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAotCUlOIFBRQlNTX0xPQURfUEFSTSBwUWJzc0xvYWQsCi0JSU4gVVNIT1JUIExlbmd0aFZJRSwKLQlJTiBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpCit2b2lkIEJzc0VudHJ5U2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X2Jzc19lbnRyeSAqcEJzcywgdTggKnBCc3NpZCwgY2hhciBTc2lkW10sIHU4IFNzaWRMZW4sIHU4IEJzc1R5cGUsIHUxNiBCZWFjb25QZXJpb2QsIHN0cnVjdCBydF9jZl9wYXJtICogcENmUGFybSwgdTE2IEF0aW1XaW4sIHUxNiBDYXBhYmlsaXR5SW5mbywgdTggU3VwUmF0ZVtdLCB1OCBTdXBSYXRlTGVuLCB1OCBFeHRSYXRlW10sIHU4IEV4dFJhdGVMZW4sIHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llICogcEh0Q2FwYWJpbGl0eSwgc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llICogcEFkZEh0SW5mbywJLyogQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFICovCisJCSB1OCBIdENhcGFiaWxpdHlMZW4sCisJCSB1OCBBZGRIdEluZm9MZW4sCisJCSB1OCBOZXdFeHRDaGFuT2Zmc2V0LAorCQkgdTggQ2hhbm5lbCwKKwkJIGNoYXIgUnNzaSwKKwkJIElOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAorCQkgdTggQ2tpcEZsYWcsCisJCSBzdHJ1Y3QgcnRfZWRjYV9wYXJtICpwRWRjYVBhcm0sCisJCSBzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSAqcFFvc0NhcGFiaWxpdHksCisJCSBzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0gKnBRYnNzTG9hZCwKKwkJIHUxNiBMZW5ndGhWSUUsIHN0cnVjdCBydF9uZGlzXzgwMl8xMV92YXJpYWJsZV9pZXMgKnBWSUUpCiB7CiAJQ09QWV9NQUNfQUREUihwQnNzLT5Cc3NpZCwgcEJzc2lkKTsKLQkvLyBEZWZhdWx0IEhpZGRlbiBTU0lEIHRvIGJlIFRSVUUsIGl0IHdpbGwgYmUgdHVybmVkIHRvIEZBTFNFIGFmdGVyIGNvcGluZyBTU0lECisJLyogRGVmYXVsdCBIaWRkZW4gU1NJRCB0byBiZSBUUlVFLCBpdCB3aWxsIGJlIHR1cm5lZCB0byBGQUxTRSBhZnRlciBjb3BpbmcgU1NJRCAqLwogCXBCc3MtPkhpZGRlbiA9IDE7Ci0JaWYgKFNzaWRMZW4gPiAwKQotCXsKLQkJLy8gRm9yIGhpZGRlbiBTU0lEIEFQLCBpdCBtaWdodCBzZW5kIGJlYWNvbiB3aXRoIFNTSUQgbGVuIGVxdWFsIHRvIDAKLQkJLy8gT3Igc2VuZCBiZWFjb24gL3Byb2JlIHJlc3BvbnNlIHdpdGggU1NJRCBsZW4gbWF0Y2hpbmcgcmVhbCBTU0lEIGxlbmd0aCwKLQkJLy8gYnV0IFNTSUQgaXMgYWxsIHplcm8uIHN1Y2ggYXMgIjAwLTAwLTAwLTAwIiB3aXRoIGxlbmd0aCA0LgotCQkvLyBXZSBoYXZlIHRvIHByZXZlbnQgdGhpcyBjYXNlIG92ZXJ3cml0ZSBjb3JyZWN0IHRhYmxlCi0JCWlmIChOZGlzRXF1YWxNZW1vcnkoU3NpZCwgWmVyb1NzaWQsIFNzaWRMZW4pID09IDApCi0JCXsKLQkJICAgIE5kaXNaZXJvTWVtb3J5KHBCc3MtPlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJaWYgKFNzaWRMZW4gPiAwKSB7CisJCS8qIEZvciBoaWRkZW4gU1NJRCBBUCwgaXQgbWlnaHQgc2VuZCBiZWFjb24gd2l0aCBTU0lEIGxlbiBlcXVhbCB0byAwICovCisJCS8qIE9yIHNlbmQgYmVhY29uIC9wcm9iZSByZXNwb25zZSB3aXRoIFNTSUQgbGVuIG1hdGNoaW5nIHJlYWwgU1NJRCBsZW5ndGgsICovCisJCS8qIGJ1dCBTU0lEIGlzIGFsbCB6ZXJvLiBzdWNoIGFzICIwMC0wMC0wMC0wMCIgd2l0aCBsZW5ndGggNC4gKi8KKwkJLyogV2UgaGF2ZSB0byBwcmV2ZW50IHRoaXMgY2FzZSBvdmVyd3JpdGUgY29ycmVjdCB0YWJsZSAqLworCQlpZiAoTmRpc0VxdWFsTWVtb3J5KFNzaWQsIFplcm9Tc2lkLCBTc2lkTGVuKSA9PSAwKSB7CisJCQlOZGlzWmVyb01lbW9yeShwQnNzLT5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOwogCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZCwgU3NpZCwgU3NpZExlbik7CiAJCQlwQnNzLT5Tc2lkTGVuID0gU3NpZExlbjsKIAkJCXBCc3MtPkhpZGRlbiA9IDA7CiAJCX0KLQl9Ci0JZWxzZQorCX0gZWxzZQogCQlwQnNzLT5Tc2lkTGVuID0gMDsKIAlwQnNzLT5Cc3NUeXBlID0gQnNzVHlwZTsKIAlwQnNzLT5CZWFjb25QZXJpb2QgPSBCZWFjb25QZXJpb2Q7Ci0JaWYgKEJzc1R5cGUgPT0gQlNTX0lORlJBKQotCXsKLQkJaWYgKHBDZlBhcm0tPmJWYWxpZCkKLQkJeworCWlmIChCc3NUeXBlID09IEJTU19JTkZSQSkgeworCQlpZiAocENmUGFybS0+YlZhbGlkKSB7CiAJCQlwQnNzLT5DZnBDb3VudCA9IHBDZlBhcm0tPkNmcENvdW50OwogCQkJcEJzcy0+Q2ZwUGVyaW9kID0gcENmUGFybS0+Q2ZwUGVyaW9kOwogCQkJcEJzcy0+Q2ZwTWF4RHVyYXRpb24gPSBwQ2ZQYXJtLT5DZnBNYXhEdXJhdGlvbjsKIAkJCXBCc3MtPkNmcER1clJlbWFpbmluZyA9IHBDZlBhcm0tPkNmcER1clJlbWFpbmluZzsKIAkJfQotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXBCc3MtPkF0aW1XaW4gPSBBdGltV2luOwogCX0KIAogCXBCc3MtPkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm87Ci0JLy8gVGhlIHByaXZhY3kgYml0IGluZGljYXRlIHNlY3VyaXR5IGlzIE9OLCBpdCBtYWlnaHQgYmUgV0VQLCBUS0lQIG9yIEFFUwotCS8vIENvbWJpbmUgd2l0aCBBdXRoTW9kZSwgdGhleSB3aWxsIGRlY2lkZSB0aGUgY29ubmVjdGlvbiBtZXRob2RzLgorCS8qIFRoZSBwcml2YWN5IGJpdCBpbmRpY2F0ZSBzZWN1cml0eSBpcyBPTiwgaXQgbWFpZ2h0IGJlIFdFUCwgVEtJUCBvciBBRVMgKi8KKwkvKiBDb21iaW5lIHdpdGggQXV0aE1vZGUsIHRoZXkgd2lsbCBkZWNpZGUgdGhlIGNvbm5lY3Rpb24gbWV0aG9kcy4gKi8KIAlwQnNzLT5Qcml2YWN5ID0gQ0FQX0lTX1BSSVZBQ1lfT04ocEJzcy0+Q2FwYWJpbGl0eUluZm8pOwogCUFTU0VSVChTdXBSYXRlTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKIAlpZiAoU3VwUmF0ZUxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKIAkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7CiAJZWxzZQotCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBSYXRlLCBTdXBSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cFJhdGUsIFN1cFJhdGUsCisJCQkgICAgICAgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwogCXBCc3MtPlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOwogCUFTU0VSVChFeHRSYXRlTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKIAlOZGlzTW92ZU1lbW9yeShwQnNzLT5FeHRSYXRlLCBFeHRSYXRlLCBFeHRSYXRlTGVuKTsKLQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+SHRDYXBhYmlsaXR5LCBwSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4pOwotCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5BZGRIdEluZm8sIHBBZGRIdEluZm8sIEFkZEh0SW5mb0xlbik7CiAJcEJzcy0+TmV3RXh0Q2hhbk9mZnNldCA9IE5ld0V4dENoYW5PZmZzZXQ7CiAJcEJzcy0+RXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47CiAJcEJzcy0+Q2hhbm5lbCA9IENoYW5uZWw7CiAJcEJzcy0+Q2VudHJhbENoYW5uZWwgPSBDaGFubmVsOwogCXBCc3MtPlJzc2kgPSBSc3NpOwotCS8vIFVwZGF0ZSBDa2lwRmxhZy4gaWYgbm90IGV4aXN0cywgdGhlIHZhbHVlIGlzIDB4MAorCS8qIFVwZGF0ZSBDa2lwRmxhZy4gaWYgbm90IGV4aXN0cywgdGhlIHZhbHVlIGlzIDB4MCAqLwogCXBCc3MtPkNraXBGbGFnID0gQ2tpcEZsYWc7CiAKLQkvLyBOZXcgZm9yIG1pY3Jvc29mdCBGaXhlZCBJRXMKKwkvKiBOZXcgZm9yIG1pY3Jvc29mdCBGaXhlZCBJRXMgKi8KIAlOZGlzTW92ZU1lbW9yeShwQnNzLT5GaXhJRXMuVGltZXN0YW1wLCAmVGltZVN0YW1wLCA4KTsKIAlwQnNzLT5GaXhJRXMuQmVhY29uSW50ZXJ2YWwgPSBCZWFjb25QZXJpb2Q7CiAJcEJzcy0+Rml4SUVzLkNhcGFiaWxpdGllcyA9IENhcGFiaWxpdHlJbmZvOwogCi0JLy8gTmV3IGZvciBtaWNyb3NvZnQgVmFyaWFibGUgSUVzCi0JaWYgKExlbmd0aFZJRSAhPSAwKQotCXsKKwkvKiBOZXcgZm9yIG1pY3Jvc29mdCBWYXJpYWJsZSBJRXMgKi8KKwlpZiAoTGVuZ3RoVklFICE9IDApIHsKIAkJcEJzcy0+VmFySUVMZW4gPSBMZW5ndGhWSUU7CiAJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlZhcklFcywgcFZJRSwgcEJzcy0+VmFySUVMZW4pOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXBCc3MtPlZhcklFTGVuID0gMDsKIAl9CiAKIAlwQnNzLT5BZGRIdEluZm9MZW4gPSAwOwogCXBCc3MtPkh0Q2FwYWJpbGl0eUxlbiA9IDA7Ci0KLQlpZiAoSHRDYXBhYmlsaXR5TGVuPiAwKQotCXsKKwlpZiAoSHRDYXBhYmlsaXR5TGVuID4gMCkgewogCQlwQnNzLT5IdENhcGFiaWxpdHlMZW4gPSBIdENhcGFiaWxpdHlMZW47Ci0JCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5IdENhcGFiaWxpdHksIHBIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbik7Ci0JCWlmIChBZGRIdEluZm9MZW4gPiAwKQotCQl7CisJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5IdENhcGFiaWxpdHksIHBIdENhcGFiaWxpdHksCisJCQkgICAgICAgSHRDYXBhYmlsaXR5TGVuKTsKKwkJaWYgKEFkZEh0SW5mb0xlbiA+IDApIHsKIAkJCXBCc3MtPkFkZEh0SW5mb0xlbiA9IEFkZEh0SW5mb0xlbjsKLQkJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5BZGRIdEluZm8sIHBBZGRIdEluZm8sIEFkZEh0SW5mb0xlbik7CisJCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+QWRkSHRJbmZvLCBwQWRkSHRJbmZvLAorCQkJCSAgICAgICBBZGRIdEluZm9MZW4pOwogCi0JIAkJCWlmICgocEFkZEh0SW5mby0+Q29udHJvbENoYW4gPiAyKSYmIChwQWRkSHRJbmZvLT5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQkVMT1cpICYmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLQkgCQkJewotCSAJCQkJcEJzcy0+Q2VudHJhbENoYW5uZWwgPSBwQWRkSHRJbmZvLT5Db250cm9sQ2hhbiAtIDI7Ci0JIAkJCX0KLQkgCQkJZWxzZSBpZiAoKHBBZGRIdEluZm8tPkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkgJiYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotCQkJCXsKLQkJIAkJCQlwQnNzLT5DZW50cmFsQ2hhbm5lbCA9IHBBZGRIdEluZm8tPkNvbnRyb2xDaGFuICsgMjsKLQkJCQl9CisJCQlpZiAoKHBBZGRIdEluZm8tPkNvbnRyb2xDaGFuID4gMikKKwkJCSAgICAmJiAocEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0KKwkJCQlFWFRDSEFfQkVMT1cpCisJCQkgICAgJiYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0KKwkJCQlCV180MCkpIHsKKwkJCQlwQnNzLT5DZW50cmFsQ2hhbm5lbCA9CisJCQkJICAgIHBBZGRIdEluZm8tPkNvbnRyb2xDaGFuIC0gMjsKKwkJCX0gZWxzZQorCQkJICAgIGlmICgocEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0KKwkJCQkgRVhUQ0hBX0FCT1ZFKQorCQkJCSYmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09CisJCQkJICAgIEJXXzQwKSkgeworCQkJCXBCc3MtPkNlbnRyYWxDaGFubmVsID0KKwkJCQkgICAgcEFkZEh0SW5mby0+Q29udHJvbENoYW4gKyAyOworCQkJfQogCQl9CiAJfQogCiAJQnNzQ2lwaGVyUGFyc2UocEJzcyk7CiAKLQkvLyBuZXcgZm9yIFFPUworCS8qIG5ldyBmb3IgUU9TICovCiAJaWYgKHBFZGNhUGFybSkKLQkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkVkY2FQYXJtLCBwRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKKwkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkVkY2FQYXJtLCBwRWRjYVBhcm0sIHNpemVvZihzdHJ1Y3QgcnRfZWRjYV9wYXJtKSk7CiAJZWxzZQogCQlwQnNzLT5FZGNhUGFybS5iVmFsaWQgPSBGQUxTRTsKIAlpZiAocFFvc0NhcGFiaWxpdHkpCi0JCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5Rb3NDYXBhYmlsaXR5LCBwUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKKwkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPlFvc0NhcGFiaWxpdHksIHBRb3NDYXBhYmlsaXR5LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSkpOwogCWVsc2UKIAkJcEJzcy0+UW9zQ2FwYWJpbGl0eS5iVmFsaWQgPSBGQUxTRTsKIAlpZiAocFFic3NMb2FkKQotCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+UWJzc0xvYWQsIHBRYnNzTG9hZCwgc2l6ZW9mKFFCU1NfTE9BRF9QQVJNKSk7CisJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5RYnNzTG9hZCwgcFFic3NMb2FkLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0pKTsKIAllbHNlCiAJCXBCc3MtPlFic3NMb2FkLmJWYWxpZCA9IEZBTFNFOwogCiAJewotCQlQRUlEX1NUUlVDVCAgICAgcEVpZDsKLQkJVVNIT1JUICAgICAgICAgIExlbmd0aCA9IDA7Ci0KKwkJc3RydWN0IHJ0X2VpZCAqIHBFaWQ7CisJCXUxNiBMZW5ndGggPSAwOwogCiAJCU5kaXNaZXJvTWVtb3J5KCZwQnNzLT5XcGFJRS5JRVswXSwgTUFYX0NVU1RPTV9MRU4pOwogCQlOZGlzWmVyb01lbW9yeSgmcEJzcy0+UnNuSUUuSUVbMF0sIE1BWF9DVVNUT01fTEVOKTsKLQotCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOwotCi0JCXdoaWxlICgoTGVuZ3RoICsgMiArIChVU0hPUlQpcEVpZC0+TGVuKSA8PSBMZW5ndGhWSUUpCi0JCXsKLQkJCXN3aXRjaChwRWlkLT5FaWQpCi0JCQl7Ci0JCQkJY2FzZSBJRV9XUEE6Ci0JCQkJCWlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKQotCQkJCQl7Ci0JCQkJCQlpZiAoKHBFaWQtPkxlbiArIDIpID4gTUFYX0NVU1RPTV9MRU4pCi0JCQkJCQl7Ci0JCQkJCQkJcEJzcy0+V3BhSUUuSUVMZW4gPSAwOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJcEJzcy0+V3BhSUUuSUVMZW4gPSBwRWlkLT5MZW4gKyAyOwotCQkJCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+V3BhSUUuSUUsIHBFaWQsIHBCc3MtPldwYUlFLklFTGVuKTsKKwkJcEVpZCA9IChzdHJ1Y3QgcnRfZWlkICopIHBWSUU7CisJCXdoaWxlICgoTGVuZ3RoICsgMiArICh1MTYpcEVpZC0+TGVuKSA8PSBMZW5ndGhWSUUpIHsKKwkJCXN3aXRjaCAocEVpZC0+RWlkKSB7CisJCQljYXNlIElFX1dQQToKKwkJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkgeworCQkJCQlpZiAoKHBFaWQtPkxlbiArIDIpID4gTUFYX0NVU1RPTV9MRU4pIHsKKwkJCQkJCXBCc3MtPldwYUlFLklFTGVuID0gMDsKKwkJCQkJCWJyZWFrOwogCQkJCQl9Ci0JCQkJCWJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSUVfUlNOOgotICAgICAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpCi0JCQkJCXsKLQkJCQkJCWlmICgocEVpZC0+TGVuICsgMikgPiBNQVhfQ1VTVE9NX0xFTikKLQkJCQkJCXsKLQkJCQkJCQlwQnNzLT5Sc25JRS5JRUxlbiA9IDA7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlwQnNzLT5Sc25JRS5JRUxlbiA9IHBFaWQtPkxlbiArIDI7Ci0JCQkJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5Sc25JRS5JRSwgcEVpZCwgcEJzcy0+UnNuSUUuSUVMZW4pOwotCQkJfQorCQkJCQlwQnNzLT5XcGFJRS5JRUxlbiA9IHBFaWQtPkxlbiArIDI7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPldwYUlFLklFLCBwRWlkLAorCQkJCQkJICAgICAgIHBCc3MtPldwYUlFLklFTGVuKTsKKwkJCQl9CiAJCQkJYnJlYWs7Ci0gICAgICAgICAgICB9Ci0JCQlMZW5ndGggPSBMZW5ndGggKyAyICsgKFVTSE9SVClwRWlkLT5MZW47ICAvLyBFaWRbMV0gKyBMZW5bMV0rIGNvbnRlbnRbTGVuXQotCQkJcEVpZCA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKilwRWlkICsgMiArIHBFaWQtPkxlbik7CisJCQljYXNlIElFX1JTTjoKKwkJCQlpZiAoTmRpc0VxdWFsTWVtb3J5CisJCQkJICAgIChwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKSB7CisJCQkJCWlmICgocEVpZC0+TGVuICsgMikgPiBNQVhfQ1VTVE9NX0xFTikgeworCQkJCQkJcEJzcy0+UnNuSUUuSUVMZW4gPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJcEJzcy0+UnNuSUUuSUVMZW4gPSBwRWlkLT5MZW4gKyAyOworCQkJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5Sc25JRS5JRSwgcEVpZCwKKwkJCQkJCSAgICAgICBwQnNzLT5Sc25JRS5JRUxlbik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJTGVuZ3RoID0gTGVuZ3RoICsgMiArICh1MTYpcEVpZC0+TGVuOwkvKiBFaWRbMV0gKyBMZW5bMV0rIGNvbnRlbnRbTGVuXSAqLworCQkJcEVpZCA9IChzdHJ1Y3QgcnRfZWlkICopICgodTggKikgcEVpZCArIDIgKyBwRWlkLT5MZW4pOwogCQl9CiAJfQogfQpAQCAtMzc2NSwzMDEgKzM4MzcsMzM3IEBACiAgSVJRTCA9IERJU1BBVENIX0xFVkVMCiAKICAqLwotVUxPTkcgQnNzVGFibGVTZXRFbnRyeSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQgQlNTX1RBQkxFICpUYWIsCi0JSU4gUFVDSEFSIHBCc3NpZCwKLQlJTiBDSEFSIFNzaWRbXSwKLQlJTiBVQ0hBUiBTc2lkTGVuLAotCUlOIFVDSEFSIEJzc1R5cGUsCi0JSU4gVVNIT1JUIEJlYWNvblBlcmlvZCwKLQlJTiBDRl9QQVJNICpDZlBhcm0sCi0JSU4gVVNIT1JUIEF0aW1XaW4sCi0JSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAotCUlOIFVDSEFSIFN1cFJhdGVbXSwKLQlJTiBVQ0hBUiBTdXBSYXRlTGVuLAotCUlOIFVDSEFSIEV4dFJhdGVbXSwKLQlJTiBVQ0hBUiBFeHRSYXRlTGVuLAotCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAotCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAotCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKLQlJTiBVQ0hBUiBDaGFubmVsTm8sCi0JSU4gQ0hBUiBSc3NpLAotCUlOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAotCUlOIFVDSEFSIENraXBGbGFnLAotCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotCUlOIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAotCUlOIFBRQlNTX0xPQURfUEFSTSBwUWJzc0xvYWQsCi0JSU4gVVNIT1JUIExlbmd0aFZJRSwKLQlJTiBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpCit1bnNpZ25lZCBsb25nIEJzc1RhYmxlU2V0RW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfYnNzX3RhYmxlICpUYWIsIHU4ICpwQnNzaWQsIGNoYXIgU3NpZFtdLCB1OCBTc2lkTGVuLCB1OCBCc3NUeXBlLCB1MTYgQmVhY29uUGVyaW9kLCBzdHJ1Y3QgcnRfY2ZfcGFybSAqIENmUGFybSwgdTE2IEF0aW1XaW4sIHUxNiBDYXBhYmlsaXR5SW5mbywgdTggU3VwUmF0ZVtdLCB1OCBTdXBSYXRlTGVuLCB1OCBFeHRSYXRlW10sIHU4IEV4dFJhdGVMZW4sIHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llICogcEh0Q2FwYWJpbGl0eSwgc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llICogcEFkZEh0SW5mbywJLyogQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFICovCisJCSAgICAgICB1OCBIdENhcGFiaWxpdHlMZW4sCisJCSAgICAgICB1OCBBZGRIdEluZm9MZW4sCisJCSAgICAgICB1OCBOZXdFeHRDaGFuT2Zmc2V0LAorCQkgICAgICAgdTggQ2hhbm5lbE5vLAorCQkgICAgICAgY2hhciBSc3NpLAorCQkgICAgICAgSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCisJCSAgICAgICB1OCBDa2lwRmxhZywKKwkJICAgICAgIHN0cnVjdCBydF9lZGNhX3Bhcm0gKnBFZGNhUGFybSwKKwkJICAgICAgIHN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtICpwUW9zQ2FwYWJpbGl0eSwKKwkJICAgICAgIHN0cnVjdCBydF9xYnNzX2xvYWRfcGFybSAqcFFic3NMb2FkLAorCQkgICAgICAgdTE2IExlbmd0aFZJRSwgc3RydWN0IHJ0X25kaXNfODAyXzExX3ZhcmlhYmxlX2llcyAqcFZJRSkKIHsKLQlVTE9ORwlJZHg7CisJdW5zaWduZWQgbG9uZyBJZHg7CiAKLQlJZHggPSBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKFRhYiwgcEJzc2lkLCAgU3NpZCwgU3NpZExlbiwgQ2hhbm5lbE5vKTsKLQlpZiAoSWR4ID09IEJTU19OT1RfRk9VTkQpCi0JewotCQlpZiAoVGFiLT5Cc3NOciA+PSBNQVhfTEVOX09GX0JTU19UQUJMRSkKLQkgICAgewotCQkJLy8KLQkJCS8vIEl0IG1heSBoYXBwZW4gd2hlbiBCU1MgVGFibGUgd2FzIGZ1bGwuCi0JCQkvLyBUaGUgZGVzaXJlZCBBUCB3aWxsIG5vdCBiZSBhZGRlZCBpbnRvIEJTUyBUYWJsZQotCQkJLy8gSW4gdGhpcyBjYXNlLCBpZiB3ZSBmb3VuZCB0aGUgZGVzaXJlZCBBUCB0aGVuIG92ZXJ3cml0ZSBCU1MgVGFibGUuCi0JCQkvLwotCQkJaWYoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCXsKLQkJCQlpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBwQnNzaWQpIHx8Ci0JCQkJCVNTSURfRVFVQUwocEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBTc2lkLCBTc2lkTGVuKSkKLQkJCQl7CisJSWR4ID0KKwkgICAgQnNzVGFibGVTZWFyY2hXaXRoU1NJRChUYWIsIHBCc3NpZCwgKHU4ICopIFNzaWQsIFNzaWRMZW4sCisJCQkJICAgQ2hhbm5lbE5vKTsKKwlpZiAoSWR4ID09IEJTU19OT1RfRk9VTkQpIHsKKwkJaWYgKFRhYi0+QnNzTnIgPj0gTUFYX0xFTl9PRl9CU1NfVEFCTEUpIHsKKwkJCS8qICovCisJCQkvKiBJdCBtYXkgaGFwcGVuIHdoZW4gQlNTIFRhYmxlIHdhcyBmdWxsLiAqLworCQkJLyogVGhlIGRlc2lyZWQgQVAgd2lsbCBub3QgYmUgYWRkZWQgaW50byBCU1MgVGFibGUgKi8KKwkJCS8qIEluIHRoaXMgY2FzZSwgaWYgd2UgZm91bmQgdGhlIGRlc2lyZWQgQVAgdGhlbiBvdmVyd3JpdGUgQlNTIFRhYmxlLiAqLworCQkJLyogKi8KKwkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkgICAgKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKSB7CisJCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEJzc2lkKQorCQkJCSAgICB8fCBTU0lEX0VRVUFMKHBBZC0+TWxtZUF1eC5Tc2lkLAorCQkJCQkJICBwQWQtPk1sbWVBdXguU3NpZExlbiwgU3NpZCwKKwkJCQkJCSAgU3NpZExlbikpIHsKIAkJCQkJSWR4ID0gVGFiLT5Cc3NPdmVybGFwTnI7Ci0JCQkJCUJzc0VudHJ5U2V0KHBBZCwgJlRhYi0+QnNzRW50cnlbSWR4XSwgcEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsIENmUGFybSwgQXRpbVdpbiwKLQkJCQkJCUNhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8sSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sCi0JCQkJCQlOZXdFeHRDaGFuT2Zmc2V0LCBDaGFubmVsTm8sIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsIHBFZGNhUGFybSwgcFFvc0NhcGFiaWxpdHksIHBRYnNzTG9hZCwgTGVuZ3RoVklFLCBwVklFKTsKLSAgICAgICAgICAgICAgICAgICAgVGFiLT5Cc3NPdmVybGFwTnIgPSAoVGFiLT5Cc3NPdmVybGFwTnIrKykgJSBNQVhfTEVOX09GX0JTU19UQUJMRTsKKwkJCQkJQnNzRW50cnlTZXQocEFkLCAmVGFiLT5Cc3NFbnRyeVtJZHhdLAorCQkJCQkJICAgIHBCc3NpZCwgU3NpZCwgU3NpZExlbiwKKwkJCQkJCSAgICBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCisJCQkJCQkgICAgQ2ZQYXJtLCBBdGltV2luLAorCQkJCQkJICAgIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLAorCQkJCQkJICAgIFN1cFJhdGVMZW4sIEV4dFJhdGUsCisJCQkJCQkgICAgRXh0UmF0ZUxlbiwgcEh0Q2FwYWJpbGl0eSwKKwkJCQkJCSAgICBwQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sCisJCQkJCQkgICAgQWRkSHRJbmZvTGVuLAorCQkJCQkJICAgIE5ld0V4dENoYW5PZmZzZXQsIENoYW5uZWxObywKKwkJCQkJCSAgICBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLAorCQkJCQkJICAgIHBFZGNhUGFybSwgcFFvc0NhcGFiaWxpdHksCisJCQkJCQkgICAgcFFic3NMb2FkLCBMZW5ndGhWSUUsIHBWSUUpOworCQkJCQlUYWItPkJzc092ZXJsYXBOciA9CisJCQkJCSAgICAoVGFiLT5Cc3NPdmVybGFwTnIrKykgJQorCQkJCQkgICAgTUFYX0xFTl9PRl9CU1NfVEFCTEU7CiAJCQkJfQogCQkJCXJldHVybiBJZHg7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQlyZXR1cm4gQlNTX05PVF9GT1VORDsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIEJTU19OT1RfRk9VTkQ7CiAJCQl9CiAJCX0KIAkJSWR4ID0gVGFiLT5Cc3NOcjsKLQkJQnNzRW50cnlTZXQocEFkLCAmVGFiLT5Cc3NFbnRyeVtJZHhdLCBwQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwgQ2ZQYXJtLCBBdGltV2luLAotCQkJCQlDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbixwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLAotCQkJCQlOZXdFeHRDaGFuT2Zmc2V0LCBDaGFubmVsTm8sIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsIHBFZGNhUGFybSwgcFFvc0NhcGFiaWxpdHksIHBRYnNzTG9hZCwgTGVuZ3RoVklFLCBwVklFKTsKKwkJQnNzRW50cnlTZXQocEFkLCAmVGFiLT5Cc3NFbnRyeVtJZHhdLCBwQnNzaWQsIFNzaWQsIFNzaWRMZW4sCisJCQkgICAgQnNzVHlwZSwgQmVhY29uUGVyaW9kLCBDZlBhcm0sIEF0aW1XaW4sCisJCQkgICAgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsCisJCQkgICAgRXh0UmF0ZUxlbiwgcEh0Q2FwYWJpbGl0eSwgcEFkZEh0SW5mbywKKwkJCSAgICBIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwgTmV3RXh0Q2hhbk9mZnNldCwKKwkJCSAgICBDaGFubmVsTm8sIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsIHBFZGNhUGFybSwKKwkJCSAgICBwUW9zQ2FwYWJpbGl0eSwgcFFic3NMb2FkLCBMZW5ndGhWSUUsIHBWSUUpOwogCQlUYWItPkJzc05yKys7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJLyogYXZvaWQgIEhpZGRlbiBTU0lEIGZvcm0gYmVhY29uIHRvIG92ZXJ3aXJpdGUgY29ycmVjdCBTU0lEIGZyb20gcHJvYmUgcmVzcG9uc2UgKi8KLQkJaWYgKChTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIFRhYi0+QnNzRW50cnlbSWR4XS5Tc2lkLCBUYWItPkJzc0VudHJ5W0lkeF0uU3NpZExlbikpIHx8Ci0JCQkoTmRpc0VxdWFsTWVtb3J5KFRhYi0+QnNzRW50cnlbSWR4XS5Tc2lkLCBaZXJvU3NpZCwgVGFiLT5Cc3NFbnRyeVtJZHhdLlNzaWRMZW4pKSkKLQkJewotCQlCc3NFbnRyeVNldChwQWQsICZUYWItPkJzc0VudHJ5W0lkeF0sIHBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLENmUGFybSwgQXRpbVdpbiwKLQkJCQkJQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4scEh0Q2FwYWJpbGl0eSwgcEFkZEh0SW5mbyxIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwKLQkJCQkJTmV3RXh0Q2hhbk9mZnNldCwgQ2hhbm5lbE5vLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCBwRWRjYVBhcm0sIHBRb3NDYXBhYmlsaXR5LCBwUWJzc0xvYWQsIExlbmd0aFZJRSwgcFZJRSk7CisJCWlmICgoU1NJRF9FUVVBTAorCQkgICAgIChTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W0lkeF0uU3NpZCwKKwkJICAgICAgVGFiLT5Cc3NFbnRyeVtJZHhdLlNzaWRMZW4pKQorCQkgICAgfHwKKwkJICAgIChOZGlzRXF1YWxNZW1vcnkKKwkJICAgICAoVGFiLT5Cc3NFbnRyeVtJZHhdLlNzaWQsIFplcm9Tc2lkLAorCQkgICAgICBUYWItPkJzc0VudHJ5W0lkeF0uU3NpZExlbikpKSB7CisJCQlCc3NFbnRyeVNldChwQWQsICZUYWItPkJzc0VudHJ5W0lkeF0sIHBCc3NpZCwgU3NpZCwKKwkJCQkgICAgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLCBDZlBhcm0sCisJCQkJICAgIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLAorCQkJCSAgICBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLAorCQkJCSAgICBwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sCisJCQkJICAgIEFkZEh0SW5mb0xlbiwgTmV3RXh0Q2hhbk9mZnNldCwgQ2hhbm5lbE5vLAorCQkJCSAgICBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCBwRWRjYVBhcm0sCisJCQkJICAgIHBRb3NDYXBhYmlsaXR5LCBwUWJzc0xvYWQsIExlbmd0aFZJRSwgcFZJRSk7CiAJCX0KIAl9CiAKIAlyZXR1cm4gSWR4OwogfQogCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgQnNzVGFibGVTc2lkU29ydCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQgQlNTX1RBQkxFICpPdXRUYWIsCi0JSU4JQ0hBUiBTc2lkW10sCi0JSU4JVUNIQVIgU3NpZExlbikKKy8qIElSUUwgPSBESVNQQVRDSF9MRVZFTCAqLwordm9pZCBCc3NUYWJsZVNzaWRTb3J0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgc3RydWN0IHJ0X2Jzc190YWJsZSAqT3V0VGFiLCBjaGFyIFNzaWRbXSwgdTggU3NpZExlbikKIHsKLQlJTlQgaTsKKwlpbnQgaTsKIAlCc3NUYWJsZUluaXQoT3V0VGFiKTsKIAotCWZvciAoaSA9IDA7IGkgPCBwQWQtPlNjYW5UYWIuQnNzTnI7IGkrKykKLQl7Ci0JCUJTU19FTlRSWSAqcEluQnNzID0gJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXTsKLQkJQk9PTEVBTgliSXNIaWRkZW5BcEluY2x1ZGVkID0gRkFMU0U7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKSB7CisJCXN0cnVjdCBydF9ic3NfZW50cnkgKnBJbkJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07CisJCUJPT0xFQU4gYklzSGlkZGVuQXBJbmNsdWRlZCA9IEZBTFNFOwogCiAJCWlmICgoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCi0gICAgICAgICAgICAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkgJiYKLSAgICAgICAgICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBJbkJzcy0+Q2hhbm5lbCkpCi0gICAgICAgICAgICApCi0JCXsKKwkJICAgICAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkgJiYKKwkJICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBJbkJzcy0+Q2hhbm5lbCkpCisJCSAgICApIHsKIAkJCWlmIChwSW5Cc3MtPkhpZGRlbikKIAkJCQliSXNIaWRkZW5BcEluY2x1ZGVkID0gVFJVRTsKIAkJfQogCiAJCWlmICgocEluQnNzLT5Cc3NUeXBlID09IHBBZC0+U3RhQ2ZnLkJzc1R5cGUpICYmCi0JCQkoU1NJRF9FUVVBTChTc2lkLCBTc2lkTGVuLCBwSW5Cc3MtPlNzaWQsIHBJbkJzcy0+U3NpZExlbikgfHwgYklzSGlkZGVuQXBJbmNsdWRlZCkpCi0JCXsKLQkJCUJTU19FTlRSWSAqcE91dEJzcyA9ICZPdXRUYWItPkJzc0VudHJ5W091dFRhYi0+QnNzTnJdOworCQkgICAgKFNTSURfRVFVQUwoU3NpZCwgU3NpZExlbiwgcEluQnNzLT5Tc2lkLCBwSW5Cc3MtPlNzaWRMZW4pCisJCSAgICAgfHwgYklzSGlkZGVuQXBJbmNsdWRlZCkpIHsKKwkJCXN0cnVjdCBydF9ic3NfZW50cnkgKnBPdXRCc3MgPSAmT3V0VGFiLT5Cc3NFbnRyeVtPdXRUYWItPkJzc05yXTsKIAotCQkJLy8gMi40Ry81RyBOIG9ubHkgbW9kZQorCQkJLyogMi40Ry81RyBOIG9ubHkgbW9kZSAqLwogCQkJaWYgKChwSW5Cc3MtPkh0Q2FwYWJpbGl0eUxlbiA9PSAwKSAmJgotCQkJCSgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQSBpcyBpbiBOLW9ubHkgTW9kZSwgdGhpcyBBUCBkb24ndCBoYXZlIEh0IGNhcGFiaWxpdHkgaW4gQmVhY29uLlxuIikpOworCQkJICAgICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpCisJCQkgICAgIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSkgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJTVEEgaXMgaW4gTi1vbmx5IE1vZGUsIHRoaXMgQVAgZG9uJ3QgaGF2ZSBIdCBjYXBhYmlsaXR5IGluIEJlYWNvbi5cbiIpKTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQotCQkJLy8gTmV3IGZvciBXUEEyCi0JCQkvLyBDaGVjayB0aGUgQXV0aG1vZGUgZmlyc3QKLQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JCQl7Ci0JCQkJLy8gQ2hlY2sgQXV0aE1vZGUgYW5kIEF1dGhNb2RlQXV4IGZvciBtYXRjaGluZywgaW4gY2FzZSBBUCBzdXBwb3J0IGR1YWwtbW9kZQotCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZSkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGVBdXgpKQotCQkJCQkvLyBOb25lIG1hdGNoZWQKKwkJCS8qIE5ldyBmb3IgV1BBMiAqLworCQkJLyogQ2hlY2sgdGhlIEF1dGhtb2RlIGZpcnN0ICovCisJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB7CisJCQkJLyogQ2hlY2sgQXV0aE1vZGUgYW5kIEF1dGhNb2RlQXV4IGZvciBtYXRjaGluZywgaW4gY2FzZSBBUCBzdXBwb3J0IGR1YWwtbW9kZSAqLworCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZSkKKwkJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9CisJCQkJCXBJbkJzcy0+QXV0aE1vZGVBdXgpKQorCQkJCQkvKiBOb25lIG1hdGNoZWQgKi8KIAkJCQkJY29udGludWU7CiAKLQkJCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCi0JCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQotCQkJCXsKLQkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCS8qIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcgKi8KKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkJICAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQkJICAgIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCQlOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKSB7CisJCQkJCS8qIElmIGl0J3Mgbm90IG1peGVkIG1vZGUsIHdlIHNob3VsZCBvbmx5IGxldCBCU1MgcGFzcyB3aXRoIHRoZSBzYW1lIGVuY3J5cHRpb24gKi8KIAkJCQkJaWYgKHBJbkJzcy0+V1BBLmJNaXhNb2RlID09IEZBTFNFKQotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0KKwkJCQkJCSAgICBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKIAkJCQkJCQljb250aW51ZTsKIAotCQkJCQkvLyBjaGVjayBncm91cCBjaXBoZXIKLQkJCQkJaWYgKHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCAmJgotCQkJCQkgICAgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCAmJgotCQkJCQkgICAgcEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCisJCQkJCS8qIGNoZWNrIGdyb3VwIGNpcGhlciAqLworCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8CisJCQkJCSAgICAgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCisJCQkJCSAgICAmJiAocEluQnNzLT5XUEEuR3JvdXBDaXBoZXIgIT0KKwkJCQkJCU5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkKKwkJCQkJICAgICYmIChwSW5Cc3MtPldQQS5Hcm91cENpcGhlciAhPQorCQkJCQkJTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkpCiAJCQkJCQljb250aW51ZTsKIAotCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCi0JCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KLQkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAotCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyQXV4KSkKKwkJCQkJLyogY2hlY2sgcGFpcndpc2UgY2lwaGVyLCBza2lwIGlmIG5vbmUgbWF0Y2hlZCAqLworCQkJCQkvKiBJZiBwcm9maWxlIHNldCB0byBBRVMsIGxldCBpdCBwYXNzIHdpdGhvdXQgcXVlc3Rpb24uICovCisJCQkJCS8qIElmIHByb2ZpbGUgc2V0IHRvIFRLSVAsIHdlIG11c3QgZmluZCBvbmUgbWF0ZWNoZWQgKi8KKwkJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0KKwkJCQkJICAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPQorCQkJCQkJcEluQnNzLT5XUEEuUGFpckNpcGhlcikKKwkJCQkJICAgICYmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0KKwkJCQkJCXBJbkJzcy0+V1BBLlBhaXJDaXBoZXJBdXgpKQogCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0JCQkJewotCQkJCQkvLyBJZiBpdCdzIG5vdCBtaXhlZCBtb2RlLCB3ZSBzaG91bGQgb25seSBsZXQgQlNTIHBhc3Mgd2l0aCB0aGUgc2FtZSBlbmNyeXB0aW9uCisJCQkJfSBlbHNlCisJCQkJICAgIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCQkJIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisJCQkJCXx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpIHsKKwkJCQkJLyogSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbiAqLwogCQkJCQlpZiAocEluQnNzLT5XUEEyLmJNaXhNb2RlID09IEZBTFNFKQotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9CisJCQkJCQkgICAgcEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyKQogCQkJCQkJCWNvbnRpbnVlOwogCi0JCQkJCS8vIGNoZWNrIGdyb3VwIGNpcGhlcgotCQkJCQlpZiAocEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCAmJgotCQkJCQkgICAgcEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQgJiYKLQkJCQkJICAgIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8IHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlcikKKwkJCQkJLyogY2hlY2sgZ3JvdXAgY2lwaGVyICovCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwKKwkJCQkJICAgICBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKKwkJCQkJICAgICYmIChwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIgIT0KKwkJCQkJCU5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkKKwkJCQkJICAgICYmIChwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIgIT0KKwkJCQkJCU5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQpKQogCQkJCQkJY29udGludWU7CiAKLQkJCQkJLy8gY2hlY2sgcGFpcndpc2UgY2lwaGVyLCBza2lwIGlmIG5vbmUgbWF0Y2hlZAotCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBBRVMsIGxldCBpdCBwYXNzIHdpdGhvdXQgcXVlc3Rpb24uCi0JCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIFRLSVAsIHdlIG11c3QgZmluZCBvbmUgbWF0ZWNoZWQKLQkJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgJiYKLQkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLlBhaXJDaXBoZXIpICYmCi0JCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4KSkKKwkJCQkJLyogY2hlY2sgcGFpcndpc2UgY2lwaGVyLCBza2lwIGlmIG5vbmUgbWF0Y2hlZCAqLworCQkJCQkvKiBJZiBwcm9maWxlIHNldCB0byBBRVMsIGxldCBpdCBwYXNzIHdpdGhvdXQgcXVlc3Rpb24uICovCisJCQkJCS8qIElmIHByb2ZpbGUgc2V0IHRvIFRLSVAsIHdlIG11c3QgZmluZCBvbmUgbWF0ZWNoZWQgKi8KKwkJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0KKwkJCQkJICAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPQorCQkJCQkJcEluQnNzLT5XUEEyLlBhaXJDaXBoZXIpCisJCQkJCSAgICAmJiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9CisJCQkJCQlwSW5Cc3MtPldQQTIuUGFpckNpcGhlckF1eCkpCiAJCQkJCQljb250aW51ZTsKIAkJCQl9CiAJCQl9Ci0JCQkvLyBCc3MgVHlwZSBtYXRjaGVkLCBTU0lEIG1hdGNoZWQuCi0JCQkvLyBXZSB3aWxsIGNoZWNrIHdlcHN0YXR1cyBmb3IgcXVhbGlmaWNhdGlvbiBCc3MKLQkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldlcFN0YXR1cykKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlN0YUNmZy5XZXBTdGF0dXM9JWQsIHdoaWxlIHBJbkJzcy0+V2VwU3RhdHVzPSVkXG4iLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIHBJbkJzcy0+V2VwU3RhdHVzKSk7Ci0JCQkJLy8KLQkJCQkvLyBGb3IgdGhlIFNFU3YyIGNhc2UsIHdlIHdpbGwgbm90IHF1YWxpZnkgV2VwU3RhdHVzLgotCQkJCS8vCisJCQkvKiBCc3MgVHlwZSBtYXRjaGVkLCBTU0lEIG1hdGNoZWQuICovCisJCQkvKiBXZSB3aWxsIGNoZWNrIHdlcHN0YXR1cyBmb3IgcXVhbGlmaWNhdGlvbiBCc3MgKi8KKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldlcFN0YXR1cykgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJTdGFDZmcuV2VwU3RhdHVzPSVkLCB3aGlsZSBwSW5Cc3MtPldlcFN0YXR1cz0lZFxuIiwKKwkJCQkJICBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsCisJCQkJCSAgcEluQnNzLT5XZXBTdGF0dXMpKTsKKwkJCQkvKiAqLworCQkJCS8qIEZvciB0aGUgU0VTdjIgY2FzZSwgd2Ugd2lsbCBub3QgcXVhbGlmeSBXZXBTdGF0dXMuICovCisJCQkJLyogKi8KIAkJCQlpZiAoIXBJbkJzcy0+YlNFUykKIAkJCQkJY29udGludWU7CiAJCQl9Ci0KLQkJCS8vIFNpbmNlIHRoZSBBUCBpcyB1c2luZyBoaWRkZW4gU1NJRCwgYW5kIHdlIGFyZSB0cnlpbmcgdG8gY29ubmVjdCB0byBBTlkKLQkJCS8vIEl0IGRlZmluaXRlbHkgd2lsbCBmYWlsLiBTbywgc2tpcCBpdC4KLQkJCS8vIENDWCBhbHNvIHJlcXVpcmUgbm90IGV2ZW4gdHJ5IHRvIGNvbm5lY3QgaXQhIQorCQkJLyogU2luY2UgdGhlIEFQIGlzIHVzaW5nIGhpZGRlbiBTU0lELCBhbmQgd2UgYXJlIHRyeWluZyB0byBjb25uZWN0IHRvIEFOWSAqLworCQkJLyogSXQgZGVmaW5pdGVseSB3aWxsIGZhaWwuIFNvLCBza2lwIGl0LiAqLworCQkJLyogQ0NYIGFsc28gcmVxdWlyZSBub3QgZXZlbiB0cnkgdG8gY29ubmVjdCBpdCEgKi8KIAkJCWlmIChTc2lkTGVuID09IDApCiAJCQkJY29udGludWU7CiAKLQkJCS8vIElmIGJvdGggc3RhdGlvbiBhbmQgQVAgdXNlIDQwTUh6LCBzdGlsbCBuZWVkIHRvIGNoZWNrIGlmIHRoZSA0ME1IWiBiYW5kJ3MgbGVnYWxpdHkgaW4gbXkgY291bnRyeSByZWdpb24KLQkJCS8vIElmIHRoaXMgNDBNSHogd2lkZWJhbmQgaXMgbm90IGFsbG93ZWQgaW4gbXkgY291bnRyeSBsaXN0LCB1c2UgYmFuZHdpZHRoIDIwTUhaIGluc3RlYWQsCisJCQkvKiBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uICovCisJCQkvKiBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLCAqLwogCQkJaWYgKChwSW5Cc3MtPkNlbnRyYWxDaGFubmVsICE9IHBJbkJzcy0+Q2hhbm5lbCkgJiYKLQkJCQkocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkKLQkJCXsKLQkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsIHBJbkJzcy0+Q2hhbm5lbCkgPT0gRkFMU0UpCi0JCQkJewotCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV18yMDsKKwkJCSAgICAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09CisJCQkgICAgIEJXXzQwKSkgeworCQkJCWlmIChSVE1QQ2hlY2tDaGFubmVsCisJCQkJICAgIChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsCisJCQkJICAgICBwSW5Cc3MtPkNoYW5uZWwpID09IEZBTFNFKSB7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC4KKwkJCQkJICAgIEJXID0gQldfMjA7CiAJCQkJCVNldENvbW1vbkhUKHBBZCk7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9IEJXXzQwOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlpZiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9PSBCQU5EX1dJRFRIXzIwKQotCQkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC4KKwkJCQkJICAgIEJXID0gQldfNDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS4KKwkJCQkJICAgIENoYW5uZWxXaWR0aCA9PSBCQU5EX1dJRFRIXzIwKSB7CiAJCQkJCQlTZXRDb21tb25IVChwQWQpOwogCQkJCQl9CiAJCQkJfQogCQkJfQotCi0JCQkvLyBjb3B5IG1hdGNoaW5nIEJTUyBmcm9tIEluVGFiIHRvIE91dFRhYgotCQkJTmRpc01vdmVNZW1vcnkocE91dEJzcywgcEluQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCQkvKiBjb3B5IG1hdGNoaW5nIEJTUyBmcm9tIEluVGFiIHRvIE91dFRhYiAqLworCQkJTmRpc01vdmVNZW1vcnkocE91dEJzcywgcEluQnNzLCBzaXplb2Yoc3RydWN0IHJ0X2Jzc19lbnRyeSkpOwogCiAJCQlPdXRUYWItPkJzc05yKys7Ci0JCX0KLQkJZWxzZSBpZiAoKHBJbkJzcy0+QnNzVHlwZSA9PSBwQWQtPlN0YUNmZy5Cc3NUeXBlKSAmJiAoU3NpZExlbiA9PSAwKSkKLQkJewotCQkJQlNTX0VOVFJZICpwT3V0QnNzID0gJk91dFRhYi0+QnNzRW50cnlbT3V0VGFiLT5Cc3NOcl07CisJCX0gZWxzZSBpZiAoKHBJbkJzcy0+QnNzVHlwZSA9PSBwQWQtPlN0YUNmZy5Cc3NUeXBlKQorCQkJICAgJiYgKFNzaWRMZW4gPT0gMCkpIHsKKwkJCXN0cnVjdCBydF9ic3NfZW50cnkgKnBPdXRCc3MgPSAmT3V0VGFiLT5Cc3NFbnRyeVtPdXRUYWItPkJzc05yXTsKIAotCQkJLy8gMi40Ry81RyBOIG9ubHkgbW9kZQorCQkJLyogMi40Ry81RyBOIG9ubHkgbW9kZSAqLwogCQkJaWYgKChwSW5Cc3MtPkh0Q2FwYWJpbGl0eUxlbiA9PSAwKSAmJgotCQkJCSgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQSBpcyBpbiBOLW9ubHkgTW9kZSwgdGhpcyBBUCBkb24ndCBoYXZlIEh0IGNhcGFiaWxpdHkgaW4gQmVhY29uLlxuIikpOworCQkJICAgICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpCisJCQkgICAgIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSkgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJTVEEgaXMgaW4gTi1vbmx5IE1vZGUsIHRoaXMgQVAgZG9uJ3QgaGF2ZSBIdCBjYXBhYmlsaXR5IGluIEJlYWNvbi5cbiIpKTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQotCQkJLy8gTmV3IGZvciBXUEEyCi0JCQkvLyBDaGVjayB0aGUgQXV0aG1vZGUgZmlyc3QKLQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JCQl7Ci0JCQkJLy8gQ2hlY2sgQXV0aE1vZGUgYW5kIEF1dGhNb2RlQXV4IGZvciBtYXRjaGluZywgaW4gY2FzZSBBUCBzdXBwb3J0IGR1YWwtbW9kZQotCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZSkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGVBdXgpKQotCQkJCQkvLyBOb25lIG1hdGNoZWQKKwkJCS8qIE5ldyBmb3IgV1BBMiAqLworCQkJLyogQ2hlY2sgdGhlIEF1dGhtb2RlIGZpcnN0ICovCisJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB7CisJCQkJLyogQ2hlY2sgQXV0aE1vZGUgYW5kIEF1dGhNb2RlQXV4IGZvciBtYXRjaGluZywgaW4gY2FzZSBBUCBzdXBwb3J0IGR1YWwtbW9kZSAqLworCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZSkKKwkJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9CisJCQkJCXBJbkJzcy0+QXV0aE1vZGVBdXgpKQorCQkJCQkvKiBOb25lIG1hdGNoZWQgKi8KIAkJCQkJY29udGludWU7CiAKLQkJCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCi0JCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQotCQkJCXsKLQkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCS8qIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcgKi8KKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkJICAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQkJICAgIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCQlOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKSB7CisJCQkJCS8qIElmIGl0J3Mgbm90IG1peGVkIG1vZGUsIHdlIHNob3VsZCBvbmx5IGxldCBCU1MgcGFzcyB3aXRoIHRoZSBzYW1lIGVuY3J5cHRpb24gKi8KIAkJCQkJaWYgKHBJbkJzcy0+V1BBLmJNaXhNb2RlID09IEZBTFNFKQotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0KKwkJCQkJCSAgICBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKIAkJCQkJCQljb250aW51ZTsKIAotCQkJCQkvLyBjaGVjayBncm91cCBjaXBoZXIKLQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8IHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyKQorCQkJCQkvKiBjaGVjayBncm91cCBjaXBoZXIgKi8KKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8CisJCQkJCSAgICBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKIAkJCQkJCWNvbnRpbnVlOwogCi0JCQkJCS8vIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQKLQkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLgotCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkCi0JCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCi0JCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLlBhaXJDaXBoZXIpICYmCi0JCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLlBhaXJDaXBoZXJBdXgpKQorCQkJCQkvKiBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkICovCisJCQkJCS8qIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4gKi8KKwkJCQkJLyogSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZCAqLworCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PQorCQkJCQkgICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQkJCSAgICAmJiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9CisJCQkJCQlwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyKQorCQkJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPQorCQkJCQkJcEluQnNzLT5XUEEuUGFpckNpcGhlckF1eCkpCiAJCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJCQl7Ci0JCQkJCS8vIElmIGl0J3Mgbm90IG1peGVkIG1vZGUsIHdlIHNob3VsZCBvbmx5IGxldCBCU1MgcGFzcyB3aXRoIHRoZSBzYW1lIGVuY3J5cHRpb24KKwkJCQl9IGVsc2UKKwkJCQkgICAgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCQkgTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKwkJCQkJfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkgeworCQkJCQkvKiBJZiBpdCdzIG5vdCBtaXhlZCBtb2RlLCB3ZSBzaG91bGQgb25seSBsZXQgQlNTIHBhc3Mgd2l0aCB0aGUgc2FtZSBlbmNyeXB0aW9uICovCiAJCQkJCWlmIChwSW5Cc3MtPldQQTIuYk1peE1vZGUgPT0gRkFMU0UpCi0JCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlcikKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0KKwkJCQkJCSAgICBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCiAJCQkJCQkJY29udGludWU7CiAKLQkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCi0JCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCS8qIGNoZWNrIGdyb3VwIGNpcGhlciAqLworCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwKKwkJCQkJICAgIHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlcikKIAkJCQkJCWNvbnRpbnVlOwogCi0JCQkJCS8vIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQKLQkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLgotCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkCi0JCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCi0JCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5QYWlyQ2lwaGVyKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlckF1eCkpCisJCQkJCS8qIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQgKi8KKwkJCQkJLyogSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLiAqLworCQkJCQkvKiBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkICovCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09CisJCQkJCSAgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCQkJICAgICYmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0KKwkJCQkJCXBJbkJzcy0+V1BBMi5QYWlyQ2lwaGVyKQorCQkJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPQorCQkJCQkJcEluQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQogCQkJCQkJY29udGludWU7CiAJCQkJfQogCQkJfQotCQkJLy8gQnNzIFR5cGUgbWF0Y2hlZCwgU1NJRCBtYXRjaGVkLgotCQkJLy8gV2Ugd2lsbCBjaGVjayB3ZXBzdGF0dXMgZm9yIHF1YWxpZmljYXRpb24gQnNzCisJCQkvKiBCc3MgVHlwZSBtYXRjaGVkLCBTU0lEIG1hdGNoZWQuICovCisJCQkvKiBXZSB3aWxsIGNoZWNrIHdlcHN0YXR1cyBmb3IgcXVhbGlmaWNhdGlvbiBCc3MgKi8KIAkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldlcFN0YXR1cykKLQkJCQkJY29udGludWU7CisJCQkJY29udGludWU7CiAKLQkJCS8vIElmIGJvdGggc3RhdGlvbiBhbmQgQVAgdXNlIDQwTUh6LCBzdGlsbCBuZWVkIHRvIGNoZWNrIGlmIHRoZSA0ME1IWiBiYW5kJ3MgbGVnYWxpdHkgaW4gbXkgY291bnRyeSByZWdpb24KLQkJCS8vIElmIHRoaXMgNDBNSHogd2lkZWJhbmQgaXMgbm90IGFsbG93ZWQgaW4gbXkgY291bnRyeSBsaXN0LCB1c2UgYmFuZHdpZHRoIDIwTUhaIGluc3RlYWQsCisJCQkvKiBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uICovCisJCQkvKiBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLCAqLwogCQkJaWYgKChwSW5Cc3MtPkNlbnRyYWxDaGFubmVsICE9IHBJbkJzcy0+Q2hhbm5lbCkgJiYKLQkJCQkocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkKLQkJCXsKLQkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsIHBJbkJzcy0+Q2hhbm5lbCkgPT0gRkFMU0UpCi0JCQkJewotCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV18yMDsKKwkJCSAgICAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09CisJCQkgICAgIEJXXzQwKSkgeworCQkJCWlmIChSVE1QQ2hlY2tDaGFubmVsCisJCQkJICAgIChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsCisJCQkJICAgICBwSW5Cc3MtPkNoYW5uZWwpID09IEZBTFNFKSB7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC4KKwkJCQkJICAgIEJXID0gQldfMjA7CiAJCQkJCVNldENvbW1vbkhUKHBBZCk7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9IEJXXzQwOworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuCisJCQkJCSAgICBCVyA9IEJXXzQwOwogCQkJCX0KIAkJCX0KLQotCQkJLy8gY29weSBtYXRjaGluZyBCU1MgZnJvbSBJblRhYiB0byBPdXRUYWIKLQkJCU5kaXNNb3ZlTWVtb3J5KHBPdXRCc3MsIHBJbkJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOworCQkJLyogY29weSBtYXRjaGluZyBCU1MgZnJvbSBJblRhYiB0byBPdXRUYWIgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KHBPdXRCc3MsIHBJbkJzcywgc2l6ZW9mKHN0cnVjdCBydF9ic3NfZW50cnkpKTsKIAogCQkJT3V0VGFiLT5Cc3NOcisrOwogCQl9CkBAIC00MDcxLDM3OCArNDE3OSwzNjYgQEAKIAlCc3NUYWJsZVNvcnRCeVJzc2koT3V0VGFiKTsKIH0KIAotCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgQnNzVGFibGVTb3J0QnlSc3NpKAotCUlOIE9VVCBCU1NfVEFCTEUgKk91dFRhYikKKy8qIElSUUwgPSBESVNQQVRDSF9MRVZFTCAqLwordm9pZCBCc3NUYWJsZVNvcnRCeVJzc2koc3RydWN0IHJ0X2Jzc190YWJsZSAqT3V0VGFiKQogewotCUlOVCAJICBpLCBqOwotCUJTU19FTlRSWSBUbXBCc3M7CisJaW50IGksIGo7CisJc3RydWN0IHJ0X2Jzc19lbnRyeSBUbXBCc3M7CiAKLQlmb3IgKGkgPSAwOyBpIDwgT3V0VGFiLT5Cc3NOciAtIDE7IGkrKykKLQl7Ci0JCWZvciAoaiA9IGkrMTsgaiA8IE91dFRhYi0+QnNzTnI7IGorKykKLQkJewotCQkJaWYgKE91dFRhYi0+QnNzRW50cnlbal0uUnNzaSA+IE91dFRhYi0+QnNzRW50cnlbaV0uUnNzaSkKLQkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmVG1wQnNzLCAmT3V0VGFiLT5Cc3NFbnRyeVtqXSwgc2l6ZW9mKEJTU19FTlRSWSkpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZPdXRUYWItPkJzc0VudHJ5W2pdLCAmT3V0VGFiLT5Cc3NFbnRyeVtpXSwgc2l6ZW9mKEJTU19FTlRSWSkpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZPdXRUYWItPkJzc0VudHJ5W2ldLCAmVG1wQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJZm9yIChpID0gMDsgaSA8IE91dFRhYi0+QnNzTnIgLSAxOyBpKyspIHsKKwkJZm9yIChqID0gaSArIDE7IGogPCBPdXRUYWItPkJzc05yOyBqKyspIHsKKwkJCWlmIChPdXRUYWItPkJzc0VudHJ5W2pdLlJzc2kgPiBPdXRUYWItPkJzc0VudHJ5W2ldLlJzc2kpIHsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmVG1wQnNzLCAmT3V0VGFiLT5Cc3NFbnRyeVtqXSwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfYnNzX2VudHJ5KSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJk91dFRhYi0+QnNzRW50cnlbal0sCisJCQkJCSAgICAgICAmT3V0VGFiLT5Cc3NFbnRyeVtpXSwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfYnNzX2VudHJ5KSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJk91dFRhYi0+QnNzRW50cnlbaV0sICZUbXBCc3MsCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2Jzc19lbnRyeSkpOwogCQkJfQogCQl9CiAJfQogfQogCi1WT0lEIEJzc0NpcGhlclBhcnNlKAotCUlOIE9VVAlQQlNTX0VOVFJZCXBCc3MpCit2b2lkIEJzc0NpcGhlclBhcnNlKHN0cnVjdCBydF9ic3NfZW50cnkgKnBCc3MpCiB7Ci0JUEVJRF9TVFJVQ1QgCQkgcEVpZDsKLQlQVUNIQVIJCQkJcFRtcDsKLQlQUlNOX0lFX0hFQURFUl9TVFJVQ1QJCQlwUnNuSGVhZGVyOwotCVBDSVBIRVJfU1VJVEVfU1RSVUNUCQkJcENpcGhlcjsKLQlQQUtNX1NVSVRFX1NUUlVDVAkJCQlwQUtNOwotCVVTSE9SVAkJCQkJCQlDb3VudDsKLQlJTlQJCQkJCQkJCUxlbmd0aDsKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlUbXBDaXBoZXI7CisJc3RydWN0IHJ0X2VpZCAqIHBFaWQ7CisJdTggKnBUbXA7CisJc3RydWN0IHJ0X3Jzbl9pZV9oZWFkZXIgKiBwUnNuSGVhZGVyOworCXN0cnVjdCBydF9jaXBoZXJfc3VpdGVfc3RydWN0ICogcENpcGhlcjsKKwlzdHJ1Y3QgcnRfYWttX3N1aXRlICogcEFLTTsKKwl1MTYgQ291bnQ7CisJaW50IExlbmd0aDsKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUyBUbXBDaXBoZXI7CiAKLQkvLwotCS8vIFdlcFN0YXR1cyB3aWxsIGJlIHJlc2V0IGxhdGVyLCBpZiBBUCBhbm5vdW5jZSBUS0lQIG9yIEFFUyBvbiB0aGUgYmVhY29uIGZyYW1lLgotCS8vCi0JaWYgKHBCc3MtPlByaXZhY3kpCi0JewotCQlwQnNzLT5XZXBTdGF0dXMgCT0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJLyogKi8KKwkvKiBXZXBTdGF0dXMgd2lsbCBiZSByZXNldCBsYXRlciwgaWYgQVAgYW5ub3VuY2UgVEtJUCBvciBBRVMgb24gdGhlIGJlYWNvbiBmcmFtZS4gKi8KKwkvKiAqLworCWlmIChwQnNzLT5Qcml2YWN5KSB7CisJCXBCc3MtPldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCX0gZWxzZSB7CisJCXBCc3MtPldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKIAl9Ci0JZWxzZQotCXsKLQkJcEJzcy0+V2VwU3RhdHVzIAk9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQl9Ci0JLy8gU2V0IGRlZmF1bHQgdG8gZGlzYWJsZSAmIG9wZW4gYXV0aGVudGljYXRpb24gYmVmb3JlIHBhcnNpbmcgdmFyaWFibGUgSUUKLQlwQnNzLT5BdXRoTW9kZQkJPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotCXBCc3MtPkF1dGhNb2RlQXV4CT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwkvKiBTZXQgZGVmYXVsdCB0byBkaXNhYmxlICYgb3BlbiBhdXRoZW50aWNhdGlvbiBiZWZvcmUgcGFyc2luZyB2YXJpYWJsZSBJRSAqLworCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CiAKLQkvLyBJbml0IFdQQSBzZXR0aW5nCi0JcEJzcy0+V1BBLlBhaXJDaXBoZXIJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJLyogSW5pdCBXUEEgc2V0dGluZyAqLworCXBCc3MtPldQQS5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwogCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCXBCc3MtPldQQS5Hcm91cENpcGhlcgk9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CiAJcEJzcy0+V1BBLlJzbkNhcGFiaWxpdHkgPSAwOwotCXBCc3MtPldQQS5iTWl4TW9kZQkJPSBGQUxTRTsKKwlwQnNzLT5XUEEuYk1peE1vZGUgPSBGQUxTRTsKIAotCS8vIEluaXQgV1BBMiBzZXR0aW5nCi0JcEJzcy0+V1BBMi5QYWlyQ2lwaGVyCSA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkvKiBJbml0IFdQQTIgc2V0dGluZyAqLworCXBCc3MtPldQQTIuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKIAlwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXggPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0JcEJzcy0+V1BBMi5Hcm91cENpcGhlcgkgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKIAlwQnNzLT5XUEEyLlJzbkNhcGFiaWxpdHkgPSAwOwotCXBCc3MtPldQQTIuYk1peE1vZGUgCSA9IEZBTFNFOworCXBCc3MtPldQQTIuYk1peE1vZGUgPSBGQUxTRTsKIAorCUxlbmd0aCA9IChpbnQpcEJzcy0+VmFySUVMZW47CiAKLQlMZW5ndGggPSAoSU5UKSBwQnNzLT5WYXJJRUxlbjsKLQotCXdoaWxlIChMZW5ndGggPiAwKQotCXsKLQkJLy8gUGFyc2UgY2lwaGVyIHN1aXRlIGJhc2Ugb24gV1BBMSAmIFdQQTIsIHRoZXkgc2hvdWxkIGJlIHBhcnNlZCBkaWZmZXJlbnRseQotCQlwVG1wID0gKChQVUNIQVIpIHBCc3MtPlZhcklFcykgKyBwQnNzLT5WYXJJRUxlbiAtIExlbmd0aDsKLQkJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFRtcDsKLQkJc3dpdGNoIChwRWlkLT5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfV1BBOgotCQkJCS8vUGFyc2UgQ2lzY28gSUVfV1BBIChMRUFQLCBDQ0tNLCBldGMuKQotCQkJCWlmICggTmRpc0VxdWFsTWVtb3J5KChwVG1wKzgpLCBDSVNDT19PVUksIDMpKQotCQkJCXsKLQkJCQkJcFRtcCAgICs9IDExOwotCQkJCQlzd2l0Y2ggKCpwVG1wKQotCQkJCQl7Ci0JCQkJCQljYXNlIDE6Ci0JCQkJCQljYXNlIDU6CS8vIEFsdGhvdWdoIFdFUCBpcyBub3QgYWxsb3dlZCBpbiBXUEEgcmVsYXRlZCBhdXRoIG1vZGUsIHdlIHBhcnNlIGl0IGFueXdheQotCQkJCQkJCXBCc3MtPldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDI6Ci0JCQkJCQkJcEJzcy0+V2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLQkJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgNDoKLQkJCQkJCQlwQnNzLT5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotCQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQkJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCi0JCQkJCS8vIGlmIENpc2NvIElFX1dQQSwgYnJlYWsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgU0VTX09VSSwgMykgJiYgKHBFaWQtPkxlbiA9PSA3KSkKLQkJCQl7Ci0JCQkJCXBCc3MtPmJTRVMgPSBUUlVFOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSAhPSAxKQotCQkJCXsKLQkJCQkJLy8gaWYgdW5zdXBwb3J0ZWQgdmVuZG9yIHNwZWNpZmljIElFCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvLyBTa2lwIE9VSSwgdmVyc2lvbiwgYW5kIG11bHRpY2FzdCBzdWl0ZQotCQkJCS8vIFRoaXMgcGFydCBzaG91bGQgYmUgaW1wcm92ZWQgaW4gdGhlIGZ1dHVyZSB3aGVuIEFQIHN1cHBvcnRlZCBtdWx0aXBsZSBjaXBoZXIgc3VpdGUuCi0JCQkJLy8gRm9yIG5vdywgaXQncyBPSyBzaW5jZSBhbG1vc3QgYWxsIEFQcyBoYXZlIGZpeGVkIGNpcGhlciBzdWl0ZSBzdXBwb3J0ZWQuCi0JCQkJLy8gcFRtcCA9IChQVUNIQVIpIHBFaWQtPk9jdGV0OwotCQkJCXBUbXAgICArPSAxMTsKLQotCQkJCS8vIENpcGhlciBTdWl0ZSBTZWxlY3RvcnMgZnJvbSBTcGVjIFA4MDIuMTFpL0QzLjIgUDI2LgotCQkJCS8vCVZhbHVlCSAgIE1lYW5pbmcKLQkJCQkvLwkwCQkJTm9uZQotCQkJCS8vCTEJCQlXRVAtNDAKLQkJCQkvLwkyCQkJVGtpcAotCQkJCS8vCTMJCQlXUkFQCi0JCQkJLy8JNAkJCUFFUwotCQkJCS8vCTUJCQlXRVAtMTA0Ci0JCQkJLy8gUGFyc2UgZ3JvdXAgY2lwaGVyCi0JCQkJc3dpdGNoICgqcFRtcCkKLQkJCQl7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDU6Ci0JCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMjoKLQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSA0OgotCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8vIG51bWJlciBvZiB1bmljYXN0IHN1aXRlCi0JCQkJcFRtcCAgICs9IDE7Ci0KLQkJCQkvLyBza2lwIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZXMKLQkJCQkvL0NvdW50ID0gKihQVVNIT1JUKSBwVG1wOwotCQkJCUNvdW50ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKLQkJCQlwVG1wICAgKz0gc2l6ZW9mKFVTSE9SVCk7Ci0KLQkJCQkvLyBQYXJzaW5nIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZQotCQkJCXdoaWxlIChDb3VudCA+IDApCi0JCQkJewotCQkJCQkvLyBTa2lwIE9VSQotCQkJCQlwVG1wICs9IDM7Ci0JCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQkJCQkJc3dpdGNoICgqcFRtcCkKLQkJCQkJewotCQkJCQkJY2FzZSAxOgotCQkJCQkJY2FzZSA1OiAvLyBBbHRob3VnaCBXRVAgaXMgbm90IGFsbG93ZWQgaW4gV1BBIHJlbGF0ZWQgYXV0aCBtb2RlLCB3ZSBwYXJzZSBpdCBhbnl3YXkKLQkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAyOgotCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDQ6Ci0JCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKFRtcENpcGhlciA+IHBCc3MtPldQQS5QYWlyQ2lwaGVyKQotCQkJCQl7Ci0JCQkJCQkvLyBNb3ZlIHRoZSBsb3dlciBjaXBoZXIgc3VpdGUgdG8gUGFpckNpcGhlckF1eAotCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEuUGFpckNpcGhlcjsKLQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyCT0gVG1wQ2lwaGVyOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBUbXBDaXBoZXI7Ci0JCQkJCX0KLQkJCQkJcFRtcCsrOwotCQkJCQlDb3VudC0tOwotCQkJCX0KLQotCQkJCS8vIDQuIGdldCBBS00gc3VpdGUgY291bnRzCi0JCQkJLy9Db3VudAk9ICooUFVTSE9SVCkgcFRtcDsKLQkJCQlDb3VudCA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07Ci0JCQkJcFRtcCAgICs9IHNpemVvZihVU0hPUlQpOwotCQkJCXBUbXAgICArPSAzOwotCi0JCQkJc3dpdGNoICgqcFRtcCkKLQkJCQl7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQSBtb2RlCi0JCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLQkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDI6Ci0JCQkJCQkvLyBTZXQgQVAgc3VwcG9ydCBXUEEgbW9kZQotCQkJCQkJaWYgKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCi0JCQkJCQkJcEJzcy0+QXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlwVG1wICAgKz0gMTsKLQotCQkJCS8vIEZpeGVkIGZvciBXUEEtTm9uZQotCQkJCWlmIChwQnNzLT5Cc3NUeXBlID09IEJTU19BREhPQykKLQkJCQl7Ci0JCQkJCXBCc3MtPkF1dGhNb2RlCSAgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOwotCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7Ci0JCQkJCXBCc3MtPldlcFN0YXR1cyAgID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOwotCQkJCQlpZiAocEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQotCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEuR3JvdXBDaXBoZXI7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJcEJzcy0+V2VwU3RhdHVzICAgPSBwQnNzLT5XUEEuUGFpckNpcGhlcjsKLQotCQkJCS8vIENoZWNrIHRoZSBQYWlyICYgR3JvdXAsIGlmIGRpZmZlcmVudCwgdHVybiBvbiBtaXhlZCBtb2RlIGZsYWcKLQkJCQlpZiAocEJzcy0+V1BBLkdyb3VwQ2lwaGVyICE9IHBCc3MtPldQQS5QYWlyQ2lwaGVyKQotCQkJCQlwQnNzLT5XUEEuYk1peE1vZGUgPSBUUlVFOwotCisJd2hpbGUgKExlbmd0aCA+IDApIHsKKwkJLyogUGFyc2UgY2lwaGVyIHN1aXRlIGJhc2Ugb24gV1BBMSAmIFdQQTIsIHRoZXkgc2hvdWxkIGJlIHBhcnNlZCBkaWZmZXJlbnRseSAqLworCQlwVG1wID0gKCh1OCAqKXBCc3MtPlZhcklFcykgKyBwQnNzLT5WYXJJRUxlbiAtIExlbmd0aDsKKwkJcEVpZCA9IChzdHJ1Y3QgcnRfZWlkICopIHBUbXA7CisJCXN3aXRjaCAocEVpZC0+RWlkKSB7CisJCWNhc2UgSUVfV1BBOgorCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgU0VTX09VSSwgMykKKwkJCSAgICAmJiAocEVpZC0+TGVuID09IDcpKSB7CisJCQkJcEJzcy0+YlNFUyA9IFRSVUU7CiAJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkgIT0KKwkJCQkgICAxKSB7CisJCQkJLyogaWYgdW5zdXBwb3J0ZWQgdmVuZG9yIHNwZWNpZmljIElFICovCisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBTa2lwIE9VSSwgdmVyc2lvbiwgYW5kIG11bHRpY2FzdCBzdWl0ZSAqLworCQkJLyogVGhpcyBwYXJ0IHNob3VsZCBiZSBpbXByb3ZlZCBpbiB0aGUgZnV0dXJlIHdoZW4gQVAgc3VwcG9ydGVkIG11bHRpcGxlIGNpcGhlciBzdWl0ZS4gKi8KKwkJCS8qIEZvciBub3csIGl0J3MgT0sgc2luY2UgYWxtb3N0IGFsbCBBUHMgaGF2ZSBmaXhlZCBjaXBoZXIgc3VpdGUgc3VwcG9ydGVkLiAqLworCQkJLyogcFRtcCA9ICh1OCAqKXBFaWQtPk9jdGV0OyAqLworCQkJcFRtcCArPSAxMTsKIAotCQkJY2FzZSBJRV9SU046Ci0JCQkJcFJzbkhlYWRlciA9IChQUlNOX0lFX0hFQURFUl9TVFJVQ1QpIHBUbXA7Ci0KLQkJCQkvLyAwLiBWZXJzaW9uIG11c3QgYmUgMQotCQkJCWlmIChsZTJjcHUxNihwUnNuSGVhZGVyLT5WZXJzaW9uKSAhPSAxKQotCQkJCQlicmVhazsKLQkJCQlwVG1wICAgKz0gc2l6ZW9mKFJTTl9JRV9IRUFERVJfU1RSVUNUKTsKLQotCQkJCS8vIDEuIENoZWNrIGdyb3VwIGNpcGhlcgotCQkJCXBDaXBoZXIgPSAoUENJUEhFUl9TVUlURV9TVFJVQ1QpIHBUbXA7Ci0JCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkocFRtcCwgUlNOX09VSSwgMykpCi0JCQkJCWJyZWFrOwotCi0JCQkJLy8gUGFyc2UgZ3JvdXAgY2lwaGVyCi0JCQkJc3dpdGNoIChwQ2lwaGVyLT5UeXBlKQotCQkJCXsKLQkJCQkJY2FzZSAxOgotCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDU6Ci0JCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDI6Ci0JCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDQ6Ci0JCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8vIHNldCB0byBjb3JyZWN0IG9mZnNldCBmb3IgbmV4dCBwYXJzaW5nCi0JCQkJcFRtcCAgICs9IHNpemVvZihDSVBIRVJfU1VJVEVfU1RSVUNUKTsKLQotCQkJCS8vIDIuIEdldCBwYWlyd2lzZSBjaXBoZXIgY291bnRzCi0JCQkJLy9Db3VudCA9ICooUFVTSE9SVCkgcFRtcDsKLQkJCQlDb3VudCA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07Ci0JCQkJcFRtcCAgICs9IHNpemVvZihVU0hPUlQpOwotCi0JCQkJLy8gMy4gR2V0IHBhaXJ3aXNlIGNpcGhlcgotCQkJCS8vIFBhcnNpbmcgYWxsIHVuaWNhc3QgY2lwaGVyIHN1aXRlCi0JCQkJd2hpbGUgKENvdW50ID4gMCkKLQkJCQl7Ci0JCQkJCS8vIFNraXAgT1VJCi0JCQkJCXBDaXBoZXIgPSAoUENJUEhFUl9TVUlURV9TVFJVQ1QpIHBUbXA7Ci0JCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQkJCQkJc3dpdGNoIChwQ2lwaGVyLT5UeXBlKQotCQkJCQl7Ci0JCQkJCQljYXNlIDE6Ci0JCQkJCQljYXNlIDU6IC8vIEFsdGhvdWdoIFdFUCBpcyBub3QgYWxsb3dlZCBpbiBXUEEgcmVsYXRlZCBhdXRoIG1vZGUsIHdlIHBhcnNlIGl0IGFueXdheQotCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDI6Ci0JCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgNDoKLQkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAoVG1wQ2lwaGVyID4gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyKQotCQkJCQl7Ci0JCQkJCQkvLyBNb3ZlIHRoZSBsb3dlciBjaXBoZXIgc3VpdGUgdG8gUGFpckNpcGhlckF1eAotCQkJCQkJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyOwotCQkJCQkJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyCSA9IFRtcENpcGhlcjsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXBCc3MtPldQQTIuUGFpckNpcGhlckF1eCA9IFRtcENpcGhlcjsKLQkJCQkJfQotCQkJCQlwVG1wICs9IHNpemVvZihDSVBIRVJfU1VJVEVfU1RSVUNUKTsKLQkJCQkJQ291bnQtLTsKLQkJCQl9Ci0KLQkJCQkvLyA0LiBnZXQgQUtNIHN1aXRlIGNvdW50cwotCQkJCS8vQ291bnQJPSAqKFBVU0hPUlQpIHBUbXA7Ci0JCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOwotCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKLQotCQkJCS8vIDUuIEdldCBBS00gY2lwaGVycwotCQkJCXBBS00gPSAoUEFLTV9TVUlURV9TVFJVQ1QpIHBUbXA7Ci0JCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkocFRtcCwgUlNOX09VSSwgMykpCi0JCQkJCWJyZWFrOwotCi0JCQkJc3dpdGNoIChwQUtNLT5UeXBlKQotCQkJCXsKLQkJCQkJY2FzZSAxOgotCQkJCQkJLy8gU2V0IEFQIHN1cHBvcnQgV1BBIG1vZGUKLQkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQotCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKLQkJCQkJCWVsc2UKLQkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAyOgotCQkJCQkJLy8gU2V0IEFQIHN1cHBvcnQgV1BBIG1vZGUKLQkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQotCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKLQkJCQkJCWVsc2UKLQkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlwVG1wICAgKz0gKENvdW50ICogc2l6ZW9mKEFLTV9TVUlURV9TVFJVQ1QpKTsKLQotCQkJCS8vIEZpeGVkIGZvciBXUEEtTm9uZQotCQkJCWlmIChwQnNzLT5Cc3NUeXBlID09IEJTU19BREhPQykKLQkJCQl7Ci0JCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKLQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOwotCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQTIuUGFpckNpcGhlckF1eDsKLQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyCT0gcEJzcy0+V1BBMi5Hcm91cENpcGhlcjsKLQkJCQkJcEJzcy0+V2VwU3RhdHVzIAkJPSBwQnNzLT5XUEEuR3JvdXBDaXBoZXI7Ci0JCQkJCWlmIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQS5Hcm91cENpcGhlcjsKLQkJCQl9Ci0JCQkJcEJzcy0+V2VwU3RhdHVzICAgPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXI7Ci0KLQkJCQkvLyA2LiBHZXQgUlNOIGNhcGFiaWxpdHkKLQkJCQkvL3BCc3MtPldQQTIuUnNuQ2FwYWJpbGl0eSA9ICooUFVTSE9SVCkgcFRtcDsKLQkJCQlwQnNzLT5XUEEyLlJzbkNhcGFiaWxpdHkgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOwotCQkJCXBUbXAgKz0gc2l6ZW9mKFVTSE9SVCk7Ci0KLQkJCQkvLyBDaGVjayB0aGUgUGFpciAmIEdyb3VwLCBpZiBkaWZmZXJlbnQsIHR1cm4gb24gbWl4ZWQgbW9kZSBmbGFnCi0JCQkJaWYgKHBCc3MtPldQQTIuR3JvdXBDaXBoZXIgIT0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyKQotCQkJCQlwQnNzLT5XUEEyLmJNaXhNb2RlID0gVFJVRTsKLQorCQkJLyogQ2lwaGVyIFN1aXRlIFNlbGVjdG9ycyBmcm9tIFNwZWMgUDgwMi4xMWkvRDMuMiBQMjYuICovCisJCQkvKiAgICAgIFZhbHVlICAgICAgTWVhbmluZyAqLworCQkJLyogICAgICAwICAgICAgICAgICAgICAgICAgICAgICBOb25lICovCisJCQkvKiAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgIFdFUC00MCAqLworCQkJLyogICAgICAyICAgICAgICAgICAgICAgICAgICAgICBUa2lwICovCisJCQkvKiAgICAgIDMgICAgICAgICAgICAgICAgICAgICAgIFdSQVAgKi8KKwkJCS8qICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgQUVTICovCisJCQkvKiAgICAgIDUgICAgICAgICAgICAgICAgICAgICAgIFdFUC0xMDQgKi8KKwkJCS8qIFBhcnNlIGdyb3VwIGNpcGhlciAqLworCQkJc3dpdGNoICgqcFRtcCkgeworCQkJY2FzZSAxOgorCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9CisJCQkJICAgIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPQorCQkJCSAgICBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9CisJCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0KKwkJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBudW1iZXIgb2YgdW5pY2FzdCBzdWl0ZSAqLworCQkJcFRtcCArPSAxOworCisJCQkvKiBza2lwIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZXMgKi8KKwkJCS8qQ291bnQgPSAqKHUxNiAqKXBUbXA7ICovCisJCQlDb3VudCA9IChwVG1wWzFdIDw8IDgpICsgcFRtcFswXTsKKwkJCXBUbXAgKz0gc2l6ZW9mKHUxNik7CisKKwkJCS8qIFBhcnNpbmcgYWxsIHVuaWNhc3QgY2lwaGVyIHN1aXRlICovCisJCQl3aGlsZSAoQ291bnQgPiAwKSB7CisJCQkJLyogU2tpcCBPVUkgKi8KKwkJCQlwVG1wICs9IDM7CisJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQkJCXN3aXRjaCAoKnBUbXApIHsKKwkJCQljYXNlIDE6CisJCQkJY2FzZSA1OgkvKiBBbHRob3VnaCBXRVAgaXMgbm90IGFsbG93ZWQgaW4gV1BBIHJlbGF0ZWQgYXV0aCBtb2RlLCB3ZSBwYXJzZSBpdCBhbnl3YXkgKi8KKwkJCQkJVG1wQ2lwaGVyID0KKwkJCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjoKKwkJCQkJVG1wQ2lwaGVyID0KKwkJCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNDoKKwkJCQkJVG1wQ2lwaGVyID0KKwkJCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoVG1wQ2lwaGVyID4gcEJzcy0+V1BBLlBhaXJDaXBoZXIpIHsKKwkJCQkJLyogTW92ZSB0aGUgbG93ZXIgY2lwaGVyIHN1aXRlIHRvIFBhaXJDaXBoZXJBdXggKi8KKwkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPQorCQkJCQkgICAgcEJzcy0+V1BBLlBhaXJDaXBoZXI7CisJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyID0gVG1wQ2lwaGVyOworCQkJCX0gZWxzZSB7CisJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gVG1wQ2lwaGVyOworCQkJCX0KKwkJCQlwVG1wKys7CisJCQkJQ291bnQtLTsKKwkJCX0KKworCQkJLyogNC4gZ2V0IEFLTSBzdWl0ZSBjb3VudHMgKi8KKwkJCS8qQ291bnQgPSAqKHUxNiAqKXBUbXA7ICovCisJCQlDb3VudCA9IChwVG1wWzFdIDw8IDgpICsgcFRtcFswXTsKKwkJCXBUbXAgKz0gc2l6ZW9mKHUxNik7CisJCQlwVG1wICs9IDM7CisKKwkJCXN3aXRjaCAoKnBUbXApIHsKKwkJCWNhc2UgMToKKwkJCQkvKiBTZXQgQVAgc3VwcG9ydCBXUEEtZW50ZXJwcmlzZSBtb2RlICovCisJCQkJaWYgKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOworCQkJCWVsc2UKKwkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPQorCQkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCS8qIFNldCBBUCBzdXBwb3J0IFdQQS1QU0sgbW9kZSAqLworCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorCQkJCQlwQnNzLT5BdXRoTW9kZSA9CisJCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisJCQkJZWxzZQorCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9CisJCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJcFRtcCArPSAxOworCisJCQkvKiBGaXhlZCBmb3IgV1BBLU5vbmUgKi8KKwkJCWlmIChwQnNzLT5Cc3NUeXBlID09IEJTU19BREhPQykgeworCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisJCQkJcEJzcy0+V2VwU3RhdHVzID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOworCQkJCS8qIFBhdGNoZWQgYnVncyBmb3Igb2xkIGRyaXZlciAqLworCQkJCWlmIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9PQorCQkJCSAgICBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0KKwkJCQkJICAgIHBCc3MtPldQQS5Hcm91cENpcGhlcjsKKwkJCX0gZWxzZQorCQkJCXBCc3MtPldlcFN0YXR1cyA9IHBCc3MtPldQQS5QYWlyQ2lwaGVyOworCisJCQkvKiBDaGVjayB0aGUgUGFpciAmIEdyb3VwLCBpZiBkaWZmZXJlbnQsIHR1cm4gb24gbWl4ZWQgbW9kZSBmbGFnICovCisJCQlpZiAocEJzcy0+V1BBLkdyb3VwQ2lwaGVyICE9IHBCc3MtPldQQS5QYWlyQ2lwaGVyKQorCQkJCXBCc3MtPldQQS5iTWl4TW9kZSA9IFRSVUU7CisKKwkJCWJyZWFrOworCisJCWNhc2UgSUVfUlNOOgorCQkJcFJzbkhlYWRlciA9IChzdHJ1Y3QgcnRfcnNuX2llX2hlYWRlciAqKSBwVG1wOworCisJCQkvKiAwLiBWZXJzaW9uIG11c3QgYmUgMSAqLworCQkJaWYgKGxlMmNwdTE2KHBSc25IZWFkZXItPlZlcnNpb24pICE9IDEpCisJCQkJYnJlYWs7CisJCQlwVG1wICs9IHNpemVvZihzdHJ1Y3QgcnRfcnNuX2llX2hlYWRlcik7CisKKwkJCS8qIDEuIENoZWNrIGdyb3VwIGNpcGhlciAqLworCQkJcENpcGhlciA9IChzdHJ1Y3QgcnRfY2lwaGVyX3N1aXRlX3N0cnVjdCAqKSBwVG1wOworCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkocFRtcCwgUlNOX09VSSwgMykpCisJCQkJYnJlYWs7CisKKwkJCS8qIFBhcnNlIGdyb3VwIGNpcGhlciAqLworCQkJc3dpdGNoIChwQ2lwaGVyLT5UeXBlKSB7CisJCQljYXNlIDE6CisJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9CisJCQkJICAgIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0KKwkJCQkgICAgTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0KKwkJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0KKwkJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBzZXQgdG8gY29ycmVjdCBvZmZzZXQgZm9yIG5leHQgcGFyc2luZyAqLworCQkJcFRtcCArPSBzaXplb2Yoc3RydWN0IHJ0X2NpcGhlcl9zdWl0ZV9zdHJ1Y3QpOworCisJCQkvKiAyLiBHZXQgcGFpcndpc2UgY2lwaGVyIGNvdW50cyAqLworCQkJLypDb3VudCA9ICoodTE2ICopcFRtcDsgKi8KKwkJCUNvdW50ID0gKHBUbXBbMV0gPDwgOCkgKyBwVG1wWzBdOworCQkJcFRtcCArPSBzaXplb2YodTE2KTsKKworCQkJLyogMy4gR2V0IHBhaXJ3aXNlIGNpcGhlciAqLworCQkJLyogUGFyc2luZyBhbGwgdW5pY2FzdCBjaXBoZXIgc3VpdGUgKi8KKwkJCXdoaWxlIChDb3VudCA+IDApIHsKKwkJCQkvKiBTa2lwIE9VSSAqLworCQkJCXBDaXBoZXIgPSAoc3RydWN0IHJ0X2NpcGhlcl9zdWl0ZV9zdHJ1Y3QgKikgcFRtcDsKKwkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCQkJc3dpdGNoIChwQ2lwaGVyLT5UeXBlKSB7CisJCQkJY2FzZSAxOgorCQkJCWNhc2UgNToJLyogQWx0aG91Z2ggV0VQIGlzIG5vdCBhbGxvd2VkIGluIFdQQSByZWxhdGVkIGF1dGggbW9kZSwgd2UgcGFyc2UgaXQgYW55d2F5ICovCisJCQkJCVRtcENpcGhlciA9CisJCQkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI6CisJCQkJCVRtcENpcGhlciA9CisJCQkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJCQlicmVhazsKKwkJCQljYXNlIDQ6CisJCQkJCVRtcENpcGhlciA9CisJCQkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKFRtcENpcGhlciA+IHBCc3MtPldQQTIuUGFpckNpcGhlcikgeworCQkJCQkvKiBNb3ZlIHRoZSBsb3dlciBjaXBoZXIgc3VpdGUgdG8gUGFpckNpcGhlckF1eCAqLworCQkJCQlwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXggPQorCQkJCQkgICAgcEJzcy0+V1BBMi5QYWlyQ2lwaGVyOworCQkJCQlwQnNzLT5XUEEyLlBhaXJDaXBoZXIgPSBUbXBDaXBoZXI7CisJCQkJfSBlbHNlIHsKKwkJCQkJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4ID0gVG1wQ2lwaGVyOworCQkJCX0KKwkJCQlwVG1wICs9IHNpemVvZihzdHJ1Y3QgcnRfY2lwaGVyX3N1aXRlX3N0cnVjdCk7CisJCQkJQ291bnQtLTsKKwkJCX0KKworCQkJLyogNC4gZ2V0IEFLTSBzdWl0ZSBjb3VudHMgKi8KKwkJCS8qQ291bnQgPSAqKHUxNiAqKXBUbXA7ICovCisJCQlDb3VudCA9IChwVG1wWzFdIDw8IDgpICsgcFRtcFswXTsKKwkJCXBUbXAgKz0gc2l6ZW9mKHUxNik7CisKKwkJCS8qIDUuIEdldCBBS00gY2lwaGVycyAqLworCQkJLyogUGFyc2luZyBhbGwgQUtNIGNpcGhlcnMgKi8KKwkJCXdoaWxlIChDb3VudCA+IDApIHsKKwkJCQlwQUtNID0gKHN0cnVjdCBydF9ha21fc3VpdGUgKikgcFRtcDsKKwkJCQlpZiAoIVJUTVBFcXVhbE1lbW9yeShwVG1wLCBSU05fT1VJLCAzKSkKKwkJCQkJYnJlYWs7CisKKwkJCQlzd2l0Y2ggKHBBS00tPlR5cGUpIHsKKwkJCQljYXNlIDE6CisJCQkJCS8qIFNldCBBUCBzdXBwb3J0IFdQQS1lbnRlcnByaXNlIG1vZGUgKi8KKwkJCQkJaWYgKHBCc3MtPkF1dGhNb2RlID09CisJCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorCQkJCQkJcEJzcy0+QXV0aE1vZGUgPQorCQkJCQkJICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisJCQkJCWVsc2UKKwkJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0KKwkJCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI6CisJCQkJCS8qIFNldCBBUCBzdXBwb3J0IFdQQS1QU0sgbW9kZSAqLworCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0KKwkJCQkJICAgIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisJCQkJCQlwQnNzLT5BdXRoTW9kZSA9CisJCQkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKKwkJCQkJZWxzZQorCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPQorCQkJCQkJICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PQorCQkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJCQkJCXBCc3MtPkF1dGhNb2RlID0KKwkJCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVNYXg7CisJCQkJCWVsc2UKKwkJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0KKwkJCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVNYXg7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwVG1wICs9IChDb3VudCAqIHNpemVvZihzdHJ1Y3QgcnRfYWttX3N1aXRlKSk7CisJCQkJQ291bnQtLTsKKwkJCX0KKworCQkJLyogRml4ZWQgZm9yIFdQQS1Ob25lICovCisJCQlpZiAocEJzcy0+QnNzVHlwZSA9PSBCU1NfQURIT0MpIHsKKwkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0KKwkJCQkgICAgcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4OworCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IHBCc3MtPldQQTIuR3JvdXBDaXBoZXI7CisJCQkJcEJzcy0+V2VwU3RhdHVzID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOworCQkJCS8qIFBhdGNoZWQgYnVncyBmb3Igb2xkIGRyaXZlciAqLworCQkJCWlmIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9PQorCQkJCSAgICBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0KKwkJCQkJICAgIHBCc3MtPldQQS5Hcm91cENpcGhlcjsKKwkJCX0KKwkJCXBCc3MtPldlcFN0YXR1cyA9IHBCc3MtPldQQTIuUGFpckNpcGhlcjsKKworCQkJLyogNi4gR2V0IFJTTiBjYXBhYmlsaXR5ICovCisJCQkvKnBCc3MtPldQQTIuUnNuQ2FwYWJpbGl0eSA9ICoodTE2ICopcFRtcDsgKi8KKwkJCXBCc3MtPldQQTIuUnNuQ2FwYWJpbGl0eSA9IChwVG1wWzFdIDw8IDgpICsgcFRtcFswXTsKKwkJCXBUbXAgKz0gc2l6ZW9mKHUxNik7CisKKwkJCS8qIENoZWNrIHRoZSBQYWlyICYgR3JvdXAsIGlmIGRpZmZlcmVudCwgdHVybiBvbiBtaXhlZCBtb2RlIGZsYWcgKi8KKwkJCWlmIChwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyICE9IHBCc3MtPldQQTIuUGFpckNpcGhlcikKKwkJCQlwQnNzLT5XUEEyLmJNaXhNb2RlID0gVFJVRTsKKworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKIAkJfQogCQlMZW5ndGggLT0gKHBFaWQtPkxlbiArIDIpOwogCX0KIH0KIAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gbWFjX3RhYmxlLmMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIG1hY190YWJsZS5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKIC8qISBcYnJpZWYgZ2VuZXJhdGVzIGEgcmFuZG9tIG1hYyBhZGRyZXNzIHZhbHVlIGZvciBJQlNTIEJTU0lECiAgKglccGFyYW0gQWRkciB0aGUgYnNzaWQgbG9jYXRpb24KQEAgLTQ0NTAsMTggKzQ1NDYsMTUgQEAKICAqCVxwcmUKICAqCVxwb3N0CiAgKi8KLVZPSUQgTWFjQWRkclJhbmRvbUJzc2lkKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEFkZHIpCit2b2lkIE1hY0FkZHJSYW5kb21Cc3NpZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICpwQWRkcikKIHsKLQlJTlQgaTsKKwlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBNQUNfQUREUl9MRU47IGkrKykKLQl7CisJZm9yIChpID0gMDsgaSA8IE1BQ19BRERSX0xFTjsgaSsrKSB7CiAJCXBBZGRyW2ldID0gUmFuZG9tQnl0ZShwQWQpOwogCX0KIAotCXBBZGRyWzBdID0gKHBBZGRyWzBdICYgMHhmZSkgfCAweDAyOyAgLy8gdGhlIGZpcnN0IDIgYml0cyBtdXN0IGJlIDAxeHh4eHh4eHgKKwlwQWRkclswXSA9IChwQWRkclswXSAmIDB4ZmUpIHwgMHgwMjsJLyogdGhlIGZpcnN0IDIgYml0cyBtdXN0IGJlIDAxeHh4eHh4eHggKi8KIH0KIAogLyohIFxicmllZiBpbml0IHRoZSBtYW5hZ2VtZW50IG1hYyBmcmFtZSBoZWFkZXIKQEAgLTQ0NzUsMzMgKzQ1NjgsMzAgQEAKICAqCVxwb3N0CiAgKglcbm90ZSB0aGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBmb2xsb3dpbmcgZmllbGQKIAotIElSUUwgPSBQQVNTSVZFX0xFVkVMCi0gSVJRTCA9IERJU1BBVENIX0xFVkVMCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKIAogICovCi1WT0lEIE1ndE1hY0hlYWRlckluaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKLQlJTiBVQ0hBUiBTdWJUeXBlLAotCUlOIFVDSEFSIFRvRHMsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBQVUNIQVIgcEJzc2lkKQordm9pZCBNZ3RNYWNIZWFkZXJJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGRyODAyMTEsCisJCSAgICAgIHU4IFN1YlR5cGUsCisJCSAgICAgIHU4IFRvRHMsIHU4ICpwREEsIHU4ICpwQnNzaWQpCiB7Ci0JTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCU5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSk7CiAKIAlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9NR01UOwogCXBIZHI4MDIxMS0+RkMuU3ViVHlwZSA9IFN1YlR5cGU7CisvKiAgICAgIGlmIChTdWJUeXBlID09IFNVQlRZUEVfQUNLKSAgICAgLy8gc2FtcGxlLCBubyB1c2UsIGl0IHdpbGwgY29uZmxpY3Qgd2l0aCBBQ1RJT04gZnJhbWUgc3ViIHR5cGUgKi8KKy8qICAgICAgICAgICAgICBwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9DTlRMOyAqLwogCXBIZHI4MDIxMS0+RkMuVG9EcyA9IFRvRHM7CiAJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIxLCBwREEpOwotCiAJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLQogCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMywgcEJzc2lkKTsKIH0KIAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gbWVtX21nbXQuYwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogbWVtX21nbXQuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCiAvKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFRoaXMgcm91dGluZSBidWlsZCBhbiBvdXRnb2luZyBmcmFtZSwgYW5kIGZpbGwgYWxsIGluZm9ybWF0aW9uIHNwZWNpZmllZApAQCAtNDUxMCw0OSArNDYwMCw0NSBAQAogICogaW5wdXQgcGFyYW1zOgogICoJCUJ1ZmZlciAtIHBvaW50ZXIgdG8gYSBwcmUtYWxsb2NhdGVkIG1lbW9yeSBzZWdtZW50CiAgKgkJYXJncyAtIGEgbGlzdCBvZiA8aW50IGFyZ19zaXplLCBhcmc+IHBhaXJzLgotICoJCU5PVEUgTk9URSBOT1RFISEhISB0aGUgbGFzdCBhcmd1bWVudCBtdXN0IGJlIE5VTEwsIG90aGVyd2lzZSB0aGlzCi0gKgkJCQkJCSAgIGZ1bmN0aW9uIHdpbGwgRkFJTCEhIQorICoJCU5PVEUgTk9URSBOT1RFISB0aGUgbGFzdCBhcmd1bWVudCBtdXN0IGJlIE5VTEwsIG90aGVyd2lzZSB0aGlzCisgKgkJCQkJCSAgIGZ1bmN0aW9uIHdpbGwgRkFJTCEKICAqIHJldHVybjoKICAqCQlTaXplIG9mIHRoZSBidWZmZXIKICAqIHVzYWdlOgogICoJCU1ha2VPdXRnb2luZ0ZyYW1lKEJ1ZmZlciwgb3V0cHV0X2xlbmd0aCwgMiwgJmZjLCAyLCAmZHVyLCA2LCBwX2FkZHIxLCA2LHBfYWRkcjIsIEVORF9PRl9BUkdTKTsKIAogIElSUUwgPSBQQVNTSVZFX0xFVkVMCi0gSVJRTCA9IERJU1BBVENIX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCiAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVUxPTkcgTWFrZU91dGdvaW5nRnJhbWUoCi0JT1VUIENIQVIgKkJ1ZmZlciwKLQlPVVQgVUxPTkcgKkZyYW1lTGVuLCAuLi4pCit1bnNpZ25lZCBsb25nIE1ha2VPdXRnb2luZ0ZyYW1lKHU4ICogQnVmZmVyLCB1bnNpZ25lZCBsb25nICogRnJhbWVMZW4sIC4uLikKIHsKLQlDSEFSICAgKnA7Ci0JaW50IAlsZW5nOwotCVVMT05HCVRvdExlbmc7CisJdTggKnA7CisJaW50IGxlbmc7CisJdW5zaWduZWQgbG9uZyBUb3RMZW5nOwogCXZhX2xpc3QgQXJnczsKIAotCS8vIGNhbGN1bGF0ZXMgdGhlIHRvdGFsIGxlbmd0aAorCS8qIGNhbGN1bGF0ZXMgdGhlIHRvdGFsIGxlbmd0aCAqLwogCVRvdExlbmcgPSAwOwogCXZhX3N0YXJ0KEFyZ3MsIEZyYW1lTGVuKTsKLQlkbwotCXsKKwlkbyB7CiAJCWxlbmcgPSB2YV9hcmcoQXJncywgaW50KTsKLQkJaWYgKGxlbmcgPT0gRU5EX09GX0FSR1MpCi0JCXsKKwkJaWYgKGxlbmcgPT0gRU5EX09GX0FSR1MpIHsKIAkJCWJyZWFrOwogCQl9Ci0JCXAgPSB2YV9hcmcoQXJncywgUFZPSUQpOworCQlwID0gdmFfYXJnKEFyZ3MsIHZvaWQgKik7CiAJCU5kaXNNb3ZlTWVtb3J5KCZCdWZmZXJbVG90TGVuZ10sIHAsIGxlbmcpOwogCQlUb3RMZW5nID0gVG90TGVuZyArIGxlbmc7Ci0JfSB3aGlsZShUUlVFKTsKKwl9IHdoaWxlIChUUlVFKTsKIAotCXZhX2VuZChBcmdzKTsgLyogY2xlYW4gdXAgKi8KKwl2YV9lbmQoQXJncyk7CQkvKiBjbGVhbiB1cCAqLwogCSpGcmFtZUxlbiA9IFRvdExlbmc7CiAJcmV0dXJuIFRvdExlbmc7CiB9CiAKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIG1sbWVfcXVldWUuYwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogbWxtZV9xdWV1ZS5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKIC8qISBcYnJpZWYJSW5pdGlhbGl6ZSBUaGUgTUxNRSBRdWV1ZSwgdXNlZCBieSBNTE1FIEZ1bmN0aW9ucwogICoJXHBhcmFtCSpRdWV1ZQkgICBUaGUgTUxNRSBRdWV1ZQpAQCAtNDU2NCwxOSArNDY1MCwxNyBAQAogIElSUUwgPSBQQVNTSVZFX0xFVkVMCiAKICAqLwotTkRJU19TVEFUVVMgTWxtZVF1ZXVlSW5pdCgKLQlJTiBNTE1FX1FVRVVFICpRdWV1ZSkKK2ludCBNbG1lUXVldWVJbml0KHN0cnVjdCBydF9tbG1lX3F1ZXVlICpRdWV1ZSkKIHsKLQlJTlQgaTsKKwlpbnQgaTsKIAogCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZRdWV1ZS0+TG9jayk7CiAKLQlRdWV1ZS0+TnVtCT0gMDsKKwlRdWV1ZS0+TnVtID0gMDsKIAlRdWV1ZS0+SGVhZCA9IDA7CiAJUXVldWUtPlRhaWwgPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRTsgaSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9NTE1FX1FVRVVFOyBpKyspIHsKIAkJUXVldWUtPkVudHJ5W2ldLk9jY3VwaWVkID0gRkFMU0U7CiAJCVF1ZXVlLT5FbnRyeVtpXS5Nc2dMZW4gPSAwOwogCQlOZGlzWmVyb01lbW9yeShRdWV1ZS0+RW50cnlbaV0uTXNnLCBNR01UX0RNQV9CVUZGRVJfU0laRSk7CkBAIC00NTk2LDM0ICs0NjgwLDMxIEBACiAgKglccG9zdAogICoJXG5vdGUJIFRoZSBtZXNzYWdlIGhhcyB0byBiZSBpbml0aWFsaXplZAogCi0gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAogCiAgKi8KLUJPT0xFQU4gTWxtZUVucXVldWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUxPTkcgTWFjaGluZSwKLQlJTiBVTE9ORyBNc2dUeXBlLAotCUlOIFVMT05HIE1zZ0xlbiwKLQlJTiBWT0lEICpNc2cpCitCT09MRUFOIE1sbWVFbnF1ZXVlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgIHVuc2lnbmVkIGxvbmcgTWFjaGluZSwKKwkJICAgIHVuc2lnbmVkIGxvbmcgTXNnVHlwZSwgdW5zaWduZWQgbG9uZyBNc2dMZW4sIHZvaWQgKiBNc2cpCiB7Ci0JSU5UIFRhaWw7Ci0JTUxNRV9RVUVVRQkqUXVldWUgPSAoTUxNRV9RVUVVRSAqKSZwQWQtPk1sbWUuUXVldWU7CisJaW50IFRhaWw7CisJc3RydWN0IHJ0X21sbWVfcXVldWUgKlF1ZXVlID0gKHN0cnVjdCBydF9tbG1lX3F1ZXVlICopJiBwQWQtPk1sbWUuUXVldWU7CiAKLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCS8qIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLiAqLworCS8qIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdCAqLworCWlmIChSVE1QX1RFU1RfRkxBRworCSAgICAocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQogCQlyZXR1cm4gRkFMU0U7CiAKLQkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKLQlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCi0JewotCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZTogbXNnIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbikpOworCS8qIEZpcnN0IGNoZWNrIHRoZSBzaXplLCBpdCBNVVNUIG5vdCBleGNlZWQgdGhlIG1sbWUgcXVldWUgc2l6ZSAqLworCWlmIChNc2dMZW4gPiBNR01UX0RNQV9CVUZGRVJfU0laRSkgeworCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZTogbXNnIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsCisJCQkgICAgICBNc2dMZW4pKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAotCWlmIChNbG1lUXVldWVGdWxsKFF1ZXVlKSkKLQl7CisJaWYgKE1sbWVRdWV1ZUZ1bGwoUXVldWUpKSB7CiAJCXJldHVybiBGQUxTRTsKIAl9CiAKQEAgLTQ2MzEsOCArNDcxMiw3IEBACiAJVGFpbCA9IFF1ZXVlLT5UYWlsOwogCVF1ZXVlLT5UYWlsKys7CiAJUXVldWUtPk51bSsrOwotCWlmIChRdWV1ZS0+VGFpbCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpCi0JeworCWlmIChRdWV1ZS0+VGFpbCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpIHsKIAkJUXVldWUtPlRhaWwgPSAwOwogCX0KIApAQCAtNDY0MCwxMCArNDcyMCw5IEBACiAJUXVldWUtPkVudHJ5W1RhaWxdLk9jY3VwaWVkID0gVFJVRTsKIAlRdWV1ZS0+RW50cnlbVGFpbF0uTWFjaGluZSA9IE1hY2hpbmU7CiAJUXVldWUtPkVudHJ5W1RhaWxdLk1zZ1R5cGUgPSBNc2dUeXBlOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dMZW4gID0gTXNnTGVuOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dMZW4gPSBNc2dMZW47CiAKLQlpZiAoTXNnICE9IE5VTEwpCi0JeworCWlmIChNc2cgIT0gTlVMTCkgewogCQlOZGlzTW92ZU1lbW9yeShRdWV1ZS0+RW50cnlbVGFpbF0uTXNnLCBNc2csIE1zZ0xlbik7CiAJfQogCkBAIC00NjU2LDcgKzQ3MzUsNyBAQAogICoJXHBhcmFtCSBUaW1lU3RhbXBIaWdoCSBUaGUgdXBwZXIgMzIgYml0IG9mIHRpbWVzdGFtcAogICoJXHBhcmFtCSBUaW1lU3RhbXBMb3cJIFRoZSBsb3dlciAzMiBiaXQgb2YgdGltZXN0YW1wCiAgKglccGFyYW0JIFJzc2kJCQkgVGhlIHJlY2VpdmluZyBSU1NJIHN0cmVuZ3RoCi0gKglccGFyYW0JIE1zZ0xlbiAJCSBUaGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlCisgKglccGFyYW0JIE1zZ0xlbgkJCSBUaGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlCiAgKglccGFyYW0JKk1zZwkJCSBUaGUgbWVzc2FnZSBwb2ludGVyCiAgKglccmV0dXJuICBUUlVFIGlmIGV2ZXJ5dGhpbmcgb2ssIEZBTFNFIG90aGVyd2lzZSAobGlrZSBRdWV1ZSBGdWxsKQogICoJXHByZQpAQCAtNDY2NSw4NyArNDc0NCw3OCBAQAogIElSUUwgPSBESVNQQVRDSF9MRVZFTAogCiAgKi8KLUJPT0xFQU4gTWxtZUVucXVldWVGb3JSZWN2KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVMT05HIFdjaWQsCi0JSU4gVUxPTkcgVGltZVN0YW1wSGlnaCwKLQlJTiBVTE9ORyBUaW1lU3RhbXBMb3csCi0JSU4gVUNIQVIgUnNzaTAsCi0JSU4gVUNIQVIgUnNzaTEsCi0JSU4gVUNIQVIgUnNzaTIsCi0JSU4gVUxPTkcgTXNnTGVuLAotCUlOIFZPSUQgKk1zZywKLQlJTiBVQ0hBUiBTaWduYWwpCitCT09MRUFOIE1sbWVFbnF1ZXVlRm9yUmVjdihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1bnNpZ25lZCBsb25nIFdjaWQsCisJCQkgICB1bnNpZ25lZCBsb25nIFRpbWVTdGFtcEhpZ2gsCisJCQkgICB1bnNpZ25lZCBsb25nIFRpbWVTdGFtcExvdywKKwkJCSAgIHU4IFJzc2kwLAorCQkJICAgdTggUnNzaTEsCisJCQkgICB1OCBSc3NpMiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLCB2b2lkICogTXNnLCB1OCBTaWduYWwpCiB7Ci0JSU5UIAkJIFRhaWwsIE1hY2hpbmU7Ci0JUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7Ci0JSU5UCQkgTXNnVHlwZTsKLQlNTE1FX1FVRVVFCSpRdWV1ZSA9IChNTE1FX1FVRVVFICopJnBBZC0+TWxtZS5RdWV1ZTsKKwlpbnQgVGFpbCwgTWFjaGluZTsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogcEZyYW1lID0gKHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKikgTXNnOworCWludCBNc2dUeXBlOworCXN0cnVjdCBydF9tbG1lX3F1ZXVlICpRdWV1ZSA9IChzdHJ1Y3QgcnRfbWxtZV9xdWV1ZSAqKSYgcEFkLT5NbG1lLlF1ZXVlOwogCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQl7CisJLyogRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuICovCisJLyogVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0ICovCisJaWYgKFJUTVBfVEVTVF9GTEFHCisJICAgIChwQWQsCisJICAgICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSB7CiAJCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlRm9yUmVjdjogZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTXG4iKSk7CiAJCXJldHVybiBGQUxTRTsKIAl9Ci0KLQkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKLQlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCi0JeworCS8qIEZpcnN0IGNoZWNrIHRoZSBzaXplLCBpdCBNVVNUIG5vdCBleGNlZWQgdGhlIG1sbWUgcXVldWUgc2l6ZSAqLworCWlmIChNc2dMZW4gPiBNR01UX0RNQV9CVUZGRVJfU0laRSkgewogCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbikpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCi0JaWYgKE1sbWVRdWV1ZUZ1bGwoUXVldWUpKQotCXsKKwlpZiAoTWxtZVF1ZXVlRnVsbChRdWV1ZSkpIHsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAogCXsKLQkJaWYgKCFNc2dUeXBlU3Vic3QocEFkLCBwRnJhbWUsICZNYWNoaW5lLCAmTXNnVHlwZSkpCi0JCXsKLQkJCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlRm9yUmVjdjogdW4tcmVjb25nbml6ZWQgbWdtdC0+c3VidHlwZT0lZFxuIixwRnJhbWUtPkhkci5GQy5TdWJUeXBlKSk7CisJCWlmICghTXNnVHlwZVN1YnN0KHBBZCwgcEZyYW1lLCAmTWFjaGluZSwgJk1zZ1R5cGUpKSB7CisJCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IHVuLXJlY29uZ25pemVkIG1nbXQtPnN1YnR5cGU9JWRcbiIsIHBGcmFtZS0+SGRyLkZDLlN1YlR5cGUpKTsKIAkJCXJldHVybiBGQUxTRTsKIAkJfQogCX0KIAotCS8vIE9LLCB3ZSBnb3QgYWxsIHRoZSBpbmZvcm1hdGlvbnMsIGl0IGlzIHRpbWUgdG8gcHV0IHRoaW5ncyBpbnRvIHF1ZXVlCisJLyogT0ssIHdlIGdvdCBhbGwgdGhlIGluZm9ybWF0aW9ucywgaXQgaXMgdGltZSB0byBwdXQgdGhpbmdzIGludG8gcXVldWUgKi8KIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKIAlUYWlsID0gUXVldWUtPlRhaWw7CiAJUXVldWUtPlRhaWwrKzsKIAlRdWV1ZS0+TnVtKys7Ci0JaWYgKFF1ZXVlLT5UYWlsID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkKLQl7CisJaWYgKFF1ZXVlLT5UYWlsID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkgewogCQlRdWV1ZS0+VGFpbCA9IDA7CiAJfQogCVF1ZXVlLT5FbnRyeVtUYWlsXS5PY2N1cGllZCA9IFRSVUU7CiAJUXVldWUtPkVudHJ5W1RhaWxdLk1hY2hpbmUgPSBNYWNoaW5lOwogCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dUeXBlID0gTXNnVHlwZTsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnTGVuICA9IE1zZ0xlbjsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnTGVuID0gTXNnTGVuOwogCVF1ZXVlLT5FbnRyeVtUYWlsXS5UaW1lU3RhbXAudS5Mb3dQYXJ0ID0gVGltZVN0YW1wTG93OwogCVF1ZXVlLT5FbnRyeVtUYWlsXS5UaW1lU3RhbXAudS5IaWdoUGFydCA9IFRpbWVTdGFtcEhpZ2g7CiAJUXVldWUtPkVudHJ5W1RhaWxdLlJzc2kwID0gUnNzaTA7CiAJUXVldWUtPkVudHJ5W1RhaWxdLlJzc2kxID0gUnNzaTE7CiAJUXVldWUtPkVudHJ5W1RhaWxdLlJzc2kyID0gUnNzaTI7CiAJUXVldWUtPkVudHJ5W1RhaWxdLlNpZ25hbCA9IFNpZ25hbDsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uV2NpZCA9IChVQ0hBUilXY2lkOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5XY2lkID0gKHU4KVdjaWQ7CiAKIAlRdWV1ZS0+RW50cnlbVGFpbF0uQ2hhbm5lbCA9IHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbDsKIAotCWlmIChNc2cgIT0gTlVMTCkKLQl7CisJaWYgKE1zZyAhPSBOVUxMKSB7CiAJCU5kaXNNb3ZlTWVtb3J5KFF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2csIE1zZywgTXNnTGVuKTsKIAl9CiAKIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKIAotCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwlSVE1QX01MTUVfSEFORExFUihwQWQpOwogCiAJcmV0dXJuIFRSVUU7CiB9CiAKLQogLyohIFxicmllZgkgRGVxdWV1ZSBhIG1lc3NhZ2UgZnJvbSB0aGUgTUxNRSBRdWV1ZQogICoJXHBhcmFtCSpRdWV1ZQkgIFRoZSBNTE1FIFF1ZXVlCiAgKglccGFyYW0JKkVsZW0JICBUaGUgbWVzc2FnZSBkZXF1ZXVlZCBmcm9tIE1MTUUgUXVldWUKQEAgLTQ3NTYsOTcgKzQ4MjYsODggQEAKICBJUlFMID0gRElTUEFUQ0hfTEVWRUwKIAogICovCi1CT09MRUFOIE1sbWVEZXF1ZXVlKAotCUlOIE1MTUVfUVVFVUUgKlF1ZXVlLAotCU9VVCBNTE1FX1FVRVVFX0VMRU0gKipFbGVtKQorQk9PTEVBTiBNbG1lRGVxdWV1ZShzdHJ1Y3QgcnRfbWxtZV9xdWV1ZSAqUXVldWUsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKiogRWxlbSkKIHsKIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKIAkqRWxlbSA9ICYoUXVldWUtPkVudHJ5W1F1ZXVlLT5IZWFkXSk7CiAJUXVldWUtPk51bS0tOwogCVF1ZXVlLT5IZWFkKys7Ci0JaWYgKFF1ZXVlLT5IZWFkID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkKLQl7CisJaWYgKFF1ZXVlLT5IZWFkID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkgewogCQlRdWV1ZS0+SGVhZCA9IDA7CiAJfQogCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOwogCXJldHVybiBUUlVFOwogfQogCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQJTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCisvKiBJUlFMID0gRElTUEFUQ0hfTEVWRUwgKi8KK3ZvaWQgTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotI2lmZGVmIFJUMjg2MAotCU1MTUVfUVVFVUVfRUxFTQkJKkVsZW0gPSBOVUxMOwotI2VuZGlmCi0JQk9PTEVBTgkJCQlDYW5jZWxsZWQ7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSA9IE5VTEw7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisJQk9PTEVBTiBDYW5jZWxsZWQ7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lUmVzdGFydFN0YXRlTWFjaGluZSBcbiIpKTsKIAotI2lmZGVmIFJUMjg2MAorI2lmZGVmIFJUTVBfTUFDX1BDSQogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7Ci0JaWYocEFkLT5NbG1lLmJSdW5uaW5nKQotCXsKKwlpZiAocEFkLT5NbG1lLmJSdW5uaW5nKSB7CiAJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CiAJCXJldHVybjsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBUUlVFOwogCX0KIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwogCi0JLy8gUmVtb3ZlIGFsbCBNbG1lIHF1ZXVlcyBlbGVtZW50cwotCXdoaWxlICghTWxtZVF1ZXVlRW1wdHkoJnBBZC0+TWxtZS5RdWV1ZSkpCi0JewotCQkvL0Zyb20gbWVzc2FnZSB0eXBlLCBkZXRlcm1pbmUgd2hpY2ggc3RhdGUgbWFjaGluZSBJIHNob3VsZCBkcml2ZQotCQlpZiAoTWxtZURlcXVldWUoJnBBZC0+TWxtZS5RdWV1ZSwgJkVsZW0pKQotCQl7Ci0JCQkvLyBmcmVlIE1MTUUgZWxlbWVudAorCS8qIFJlbW92ZSBhbGwgTWxtZSBxdWV1ZXMgZWxlbWVudHMgKi8KKwl3aGlsZSAoIU1sbWVRdWV1ZUVtcHR5KCZwQWQtPk1sbWUuUXVldWUpKSB7CisJCS8qRnJvbSBtZXNzYWdlIHR5cGUsIGRldGVybWluZSB3aGljaCBzdGF0ZSBtYWNoaW5lIEkgc2hvdWxkIGRyaXZlICovCisJCWlmIChNbG1lRGVxdWV1ZSgmcEFkLT5NbG1lLlF1ZXVlLCAmRWxlbSkpIHsKKwkJCS8qIGZyZWUgTUxNRSBlbGVtZW50ICovCiAJCQlFbGVtLT5PY2N1cGllZCA9IEZBTFNFOwogCQkJRWxlbS0+TXNnTGVuID0gMDsKIAotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJREJHUFJJTlRfRVJSKCgiTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmU6IE1sbWVRdWV1ZSBlbXB0eVxuIikpOwogCQl9CiAJfQotI2VuZGlmIC8qIFJUMjg2MCAqLworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCiAJewotCQkvLyBDYW5jZWwgYWxsIHRpbWVyIGV2ZW50cwotCQkvLyBCZSBjYXJlZnVsIHRvIGNhbmNlbCBuZXcgYWRkZWQgdGltZXIKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwJICAmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAgICZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAgJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwJICAgJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKKwkJLyogQ2FuY2VsIGFsbCB0aW1lciBldmVudHMgKi8KKwkJLyogQmUgY2FyZWZ1bCB0byBjYW5jZWwgbmV3IGFkZGVkIHRpbWVyICovCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZDYW5jZWxsZWQpOworCiAJfQogCi0JLy8gQ2hhbmdlIGJhY2sgdG8gb3JpZ2luYWwgY2hhbm5lbCBpbiBjYXNlIG9mIGRvaW5nIHNjYW4KKwkvKiBDaGFuZ2UgYmFjayB0byBvcmlnaW5hbCBjaGFubmVsIGluIGNhc2Ugb2YgZG9pbmcgc2NhbiAqLwogCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwogCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwogCi0JLy8gUmVzdW1lIE1TRFUgd2hpY2ggaXMgdHVybmVkIG9mZiBkdXJuaW5nIHNjYW4KKwkvKiBSZXN1bWUgTVNEVSB3aGljaCBpcyB0dXJuZWQgb2ZmIGR1cm5pbmcgc2NhbiAqLwogCVJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CiAKIAl7Ci0JCS8vIFNldCBhbGwgc3RhdGUgbWFjaGluZXMgYmFjayBJRExFCi0JCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgICAgPSBDTlRMX0lETEU7Ci0JCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlICAgPSBBU1NPQ19JRExFOwotCQlwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlICAgID0gQVVUSF9SRVFfSURMRTsKKwkJLyogU2V0IGFsbCBzdGF0ZSBtYWNoaW5lcyBiYWNrIElETEUgKi8KKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQlwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKIAkJcEFkLT5NbG1lLkF1dGhSc3BNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUlNQX0lETEU7Ci0JCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgICAgPSBTWU5DX0lETEU7Ci0JCXBBZC0+TWxtZS5BY3RNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IEFDVF9JRExFOworCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQlwQWQtPk1sbWUuQWN0TWFjaGluZS5DdXJyU3RhdGUgPSBBQ1RfSURMRTsKIAl9CiAKLSNpZmRlZiBSVDI4NjAKLQkvLyBSZW1vdmUgcnVubmluZyBzdGF0ZQorI2lmZGVmIFJUTVBfTUFDX1BDSQorCS8qIFJlbW92ZSBydW5uaW5nIHN0YXRlICovCiAJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKIAlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBGQUxTRTsKIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwotI2VuZGlmCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiB9CiAKIC8qISBcYnJpZWYJdGVzdCBpZiB0aGUgTUxNRSBRdWV1ZSBpcyBlbXB0eQpAQCAtNDg1OCw4ICs0OTE5LDcgQEAKICBJUlFMID0gRElTUEFUQ0hfTEVWRUwKIAogICovCi1CT09MRUFOIE1sbWVRdWV1ZUVtcHR5KAotCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKQorQk9PTEVBTiBNbG1lUXVldWVFbXB0eShzdHJ1Y3QgcnRfbWxtZV9xdWV1ZSAqUXVldWUpCiB7CiAJQk9PTEVBTiBBbnM7CiAKQEAgLTQ4NzEsNyArNDkzMSw3IEBACiB9CiAKIC8qISBcYnJpZWYJIHRlc3QgaWYgdGhlIE1MTUUgUXVldWUgaXMgZnVsbAotICoJXHBhcmFtCSAqUXVldWUgCSBUaGUgTUxNRSBRdWV1ZQorICoJXHBhcmFtCSAqUXVldWUJCSBUaGUgTUxNRSBRdWV1ZQogICoJXHJldHVybiAgVFJVRSBpZiB0aGUgUXVldWUgaXMgZW1wdHksIEZBTFNFIG90aGVyd2lzZQogICoJXHByZQogICoJXHBvc3QKQEAgLTQ4ODAsMTMgKzQ5NDAsMTMgQEAKICBJUlFMID0gRElTUEFUQ0hfTEVWRUwKIAogICovCi1CT09MRUFOIE1sbWVRdWV1ZUZ1bGwoCi0JSU4gTUxNRV9RVUVVRSAqUXVldWUpCitCT09MRUFOIE1sbWVRdWV1ZUZ1bGwoc3RydWN0IHJ0X21sbWVfcXVldWUgKlF1ZXVlKQogewogCUJPT0xFQU4gQW5zOwogCiAJTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7Ci0JQW5zID0gKFF1ZXVlLT5OdW0gPT0gTUFYX0xFTl9PRl9NTE1FX1FVRVVFIHx8IFF1ZXVlLT5FbnRyeVtRdWV1ZS0+VGFpbF0uT2NjdXBpZWQpOworCUFucyA9IChRdWV1ZS0+TnVtID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRQorCSAgICAgICB8fCBRdWV1ZS0+RW50cnlbUXVldWUtPlRhaWxdLk9jY3VwaWVkKTsKIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKIAogCXJldHVybiBBbnM7CkBAIC00OTAyLDExICs0OTYyLDEwIEBACiAgSVJRTCA9IFBBU1NJVkVfTEVWRUwKIAogICovCi1WT0lEIE1sbWVRdWV1ZURlc3Ryb3koCi0JSU4gTUxNRV9RVUVVRSAqcFF1ZXVlKQordm9pZCBNbG1lUXVldWVEZXN0cm95KHN0cnVjdCBydF9tbG1lX3F1ZXVlICpwUXVldWUpCiB7CiAJTmRpc0FjcXVpcmVTcGluTG9jaygmKHBRdWV1ZS0+TG9jaykpOwotCXBRdWV1ZS0+TnVtICA9IDA7CisJcFF1ZXVlLT5OdW0gPSAwOwogCXBRdWV1ZS0+SGVhZCA9IDA7CiAJcFF1ZXVlLT5UYWlsID0gMDsKIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYocFF1ZXVlLT5Mb2NrKSk7CkBAIC00OTI0LDEyNiArNDk4MywxMTIgQEAKICBJUlFMID0gRElTUEFUQ0hfTEVWRUwKIAogICovCi1CT09MRUFOIE1zZ1R5cGVTdWJzdCgKLQlJTiBQUlRNUF9BREFQVEVSICBwQWQsCi0JSU4gUEZSQU1FXzgwMl8xMSBwRnJhbWUsCi0JT1VUIElOVCAqTWFjaGluZSwKLQlPVVQgSU5UICpNc2dUeXBlKQorQk9PTEVBTiBNc2dUeXBlU3Vic3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgIHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKiBwRnJhbWUsCisJCSAgICAgaW50ICogTWFjaGluZSwgaW50ICogTXNnVHlwZSkKIHsKLQlVU0hPUlQJU2VxOwotCVVDSEFSCUVBUFR5cGU7Ci0JUFVDSEFSCXBEYXRhOworCXUxNiBTZXEsIEFsZzsKKwl1OCBFQVBUeXBlOworCXU4ICpwRGF0YTsKIAotCS8vIFBvaW50ZXIgdG8gc3RhcnQgb2YgZGF0YSBmcmFtZXMgaW5jbHVkaW5nIFNOQVAgaGVhZGVyCi0JcERhdGEgPSAoUFVDSEFSKSBwRnJhbWUgKyBMRU5HVEhfODAyXzExOworCS8qIFBvaW50ZXIgdG8gc3RhcnQgb2YgZGF0YSBmcmFtZXMgaW5jbHVkaW5nIFNOQVAgaGVhZGVyICovCisJcERhdGEgPSAodTggKilwRnJhbWUgKyBMRU5HVEhfODAyXzExOwogCi0JLy8gVGhlIG9ubHkgZGF0YSB0eXBlIHdpbGwgcGFzcyB0byB0aGlzIGZ1bmN0aW9uIGlzIEVBUE9MIGZyYW1lCi0JaWYgKHBGcmFtZS0+SGRyLkZDLlR5cGUgPT0gQlRZUEVfREFUQSkKLQl7Ci0JCWlmIChOZGlzRXF1YWxNZW1vcnkoU05BUF9BSVJPTkVULCBwRGF0YSwgTEVOR1RIXzgwMl8xX0gpKQorCS8qIFRoZSBvbmx5IGRhdGEgdHlwZSB3aWxsIHBhc3MgdG8gdGhpcyBmdW5jdGlvbiBpcyBFQVBPTCBmcmFtZSAqLworCWlmIChwRnJhbWUtPkhkci5GQy5UeXBlID09IEJUWVBFX0RBVEEpIHsKIAkJewotCQkJLy8gQ2lzY28gQWlyb25ldCBTTkFQIGhlYWRlcgotCQkJKk1hY2hpbmUgPSBBSVJPTkVUX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9BSVJPTkVUX01TRzsKLQkJCXJldHVybiAoVFJVRSk7Ci0JCX0KLQkJewotCQkJKk1hY2hpbmUgPSBXUEFfUFNLX1NUQVRFX01BQ0hJTkU7Ci0JCQlFQVBUeXBlID0gKigoVUNIQVIqKXBGcmFtZSArIExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCArIDEpOwotCQkJcmV0dXJuKFdwYU1zZ1R5cGVTdWJzdChFQVBUeXBlLCBNc2dUeXBlKSk7CisJCQkqTWFjaGluZSA9IFdQQV9TVEFURV9NQUNISU5FOworCQkJRUFQVHlwZSA9CisJCQkgICAgKigodTggKikgcEZyYW1lICsgTEVOR1RIXzgwMl8xMSArCisJCQkgICAgICBMRU5HVEhfODAyXzFfSCArIDEpOworCQkJcmV0dXJuIChXcGFNc2dUeXBlU3Vic3QoRUFQVHlwZSwgKGludCAqKSBNc2dUeXBlKSk7CiAJCX0KIAl9CiAKLQlzd2l0Y2ggKHBGcmFtZS0+SGRyLkZDLlN1YlR5cGUpCi0JewotCQljYXNlIFNVQlRZUEVfQVNTT0NfUkVROgotCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BU1NPQ19SRVE7Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX0FTU09DX1JTUDoKLQkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVNTT0NfUlNQOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9SRUFTU09DX1JFUToKLQkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfUkVBU1NPQ19SRVE7Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX1JFQVNTT0NfUlNQOgotCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9SRUFTU09DX1JTUDsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfUFJPQkVfUkVROgotCQkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1BST0JFX1JFUTsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfUFJPQkVfUlNQOgotCQkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1BST0JFX1JTUDsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfQkVBQ09OOgotCQkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0JFQUNPTjsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfQVRJTToKLQkJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BVElNOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9ESVNBU1NPQzoKLQkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfRElTQVNTT0NfUkVROwotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9BVVRIOgotCQkJLy8gZ2V0IHRoZSBzZXF1ZW5jZSBudW1iZXIgZnJvbSBwYXlsb2FkIDI0IE1hYyBIZWFkZXIgKyAyIGJ5dGVzIGFsZ29yaXRobQotCQkJTmRpc01vdmVNZW1vcnkoJlNlcSwgJnBGcmFtZS0+T2N0ZXRbMl0sIHNpemVvZihVU0hPUlQpKTsKLQkJCWlmIChTZXEgPT0gMSB8fCBTZXEgPT0gMykKLQkJCXsKLQkJCQkqTWFjaGluZSA9IEFVVEhfUlNQX1NUQVRFX01BQ0hJTkU7Ci0JCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BVVRIX09ERDsKLQkJCX0KLQkJCWVsc2UgaWYgKFNlcSA9PSAyIHx8IFNlcSA9PSA0KQotCQkJeworCXN3aXRjaCAocEZyYW1lLT5IZHIuRkMuU3ViVHlwZSkgeworCWNhc2UgU1VCVFlQRV9BU1NPQ19SRVE6CisJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BU1NPQ19SRVE7CisJCWJyZWFrOworCWNhc2UgU1VCVFlQRV9BU1NPQ19SU1A6CisJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BU1NPQ19SU1A7CisJCWJyZWFrOworCWNhc2UgU1VCVFlQRV9SRUFTU09DX1JFUToKKwkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1JFQVNTT0NfUkVROworCQlicmVhazsKKwljYXNlIFNVQlRZUEVfUkVBU1NPQ19SU1A6CisJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9SRUFTU09DX1JTUDsKKwkJYnJlYWs7CisJY2FzZSBTVUJUWVBFX1BST0JFX1JFUToKKwkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7CisJCSpNc2dUeXBlID0gTVQyX1BFRVJfUFJPQkVfUkVROworCQlicmVhazsKKwljYXNlIFNVQlRZUEVfUFJPQkVfUlNQOgorCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9QUk9CRV9SU1A7CisJCWJyZWFrOworCWNhc2UgU1VCVFlQRV9CRUFDT046CisJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOworCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0JFQUNPTjsKKwkJYnJlYWs7CisJY2FzZSBTVUJUWVBFX0FUSU06CisJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOworCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FUSU07CisJCWJyZWFrOworCWNhc2UgU1VCVFlQRV9ESVNBU1NPQzoKKwkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0RJU0FTU09DX1JFUTsKKwkJYnJlYWs7CisJY2FzZSBTVUJUWVBFX0FVVEg6CisJCS8qIGdldCB0aGUgc2VxdWVuY2UgbnVtYmVyIGZyb20gcGF5bG9hZCAyNCBNYWMgSGVhZGVyICsgMiBieXRlcyBhbGdvcml0aG0gKi8KKwkJTmRpc01vdmVNZW1vcnkoJlNlcSwgJnBGcmFtZS0+T2N0ZXRbMl0sIHNpemVvZih1MTYpKTsKKwkJTmRpc01vdmVNZW1vcnkoJkFsZywgJnBGcmFtZS0+T2N0ZXRbMF0sIHNpemVvZih1MTYpKTsKKwkJaWYgKFNlcSA9PSAxIHx8IFNlcSA9PSAzKSB7CisJCQkqTWFjaGluZSA9IEFVVEhfUlNQX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FVVEhfT0REOworCQl9IGVsc2UgaWYgKFNlcSA9PSAyIHx8IFNlcSA9PSA0KSB7CisJCQlpZiAoQWxnID09IEFVVEhfTU9ERV9PUEVOIHx8IEFsZyA9PSBBVVRIX01PREVfS0VZKSB7CiAJCQkJKk1hY2hpbmUgPSBBVVRIX1NUQVRFX01BQ0hJTkU7CiAJCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BVVRIX0VWRU47CiAJCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9ERUFVVEg6Ci0JCQkqTWFjaGluZSA9IEFVVEhfUlNQX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0RFQVVUSDsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfQUNUSU9OOgotCQkJKk1hY2hpbmUgPSBBQ1RJT05fU1RBVEVfTUFDSElORTsKLQkJCS8vICBTb21ldGltZXMgU3RhIHdpbGwgcmV0dXJuIHdpdGggY2F0ZWdvcnkgYnl0ZXMgd2l0aCBNU0IgPSAxLCBpZiB0aGV5IHJlY2VpdmUgY2F0b2dvcnkgb3V0IG9mIHRoZWlyIHN1cHBvcnQKLQkJCWlmICgocEZyYW1lLT5PY3RldFswXSYweDdGKSA+IE1BWF9QRUVSX0NBVEVfTVNHKQotCQkJewotCQkJCSpNc2dUeXBlID0gTVQyX0FDVF9JTlZBTElEOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCSpNc2dUeXBlID0gKHBGcmFtZS0+T2N0ZXRbMF0mMHg3Rik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKKwkJfSBlbHNlIHsKIAkJCXJldHVybiBGQUxTRTsKLQkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgU1VCVFlQRV9ERUFVVEg6CisJCSpNYWNoaW5lID0gQVVUSF9SU1BfU1RBVEVfTUFDSElORTsKKwkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9ERUFVVEg7CisJCWJyZWFrOworCWNhc2UgU1VCVFlQRV9BQ1RJT046CisJCSpNYWNoaW5lID0gQUNUSU9OX1NUQVRFX01BQ0hJTkU7CisJCS8qICBTb21ldGltZXMgU3RhIHdpbGwgcmV0dXJuIHdpdGggY2F0ZWdvcnkgYnl0ZXMgd2l0aCBNU0IgPSAxLCBpZiB0aGV5IHJlY2VpdmUgY2F0b2dvcnkgb3V0IG9mIHRoZWlyIHN1cHBvcnQgKi8KKwkJaWYgKChwRnJhbWUtPk9jdGV0WzBdICYgMHg3RikgPiBNQVhfUEVFUl9DQVRFX01TRykgeworCQkJKk1zZ1R5cGUgPSBNVDJfQUNUX0lOVkFMSUQ7CisJCX0gZWxzZSB7CisJCQkqTXNnVHlwZSA9IChwRnJhbWUtPk9jdGV0WzBdICYgMHg3Rik7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEZBTFNFOworCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gVFJVRTsKIH0KIAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gc3RhdGVfbWFjaGluZS5jCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBzdGF0ZV9tYWNoaW5lLmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAogLyohIFxicmllZiBJbml0aWFsaXplIHRoZSBzdGF0ZSBtYWNoaW5lLgogICoJXHBhcmFtICpTCQkJcG9pbnRlciB0byB0aGUgc3RhdGUgbWFjaGluZQogICoJXHBhcmFtCVRyYW5zCQlTdGF0ZSBtYWNoaW5lIHRyYW5zaXRpb24gZnVuY3Rpb24KICAqCVxwYXJhbQlTdE5yCQludW1iZXIgb2Ygc3RhdGVzCiAgKglccGFyYW0JTXNnTnIJCW51bWJlciBvZiBtZXNzYWdlcwotICoJXHBhcmFtCURlZkZ1bmMgCWRlZmF1bHQgZnVuY3Rpb24sIHdoZW4gdGhlcmUgaXMgaW52YWxpZCBzdGF0ZS9tZXNzYWdlIGNvbWJpbmF0aW9uCisgKglccGFyYW0JRGVmRnVuYwkJZGVmYXVsdCBmdW5jdGlvbiwgd2hlbiB0aGVyZSBpcyBpbnZhbGlkIHN0YXRlL21lc3NhZ2UgY29tYmluYXRpb24KICAqCVxwYXJhbQlJbml0U3RhdGUJaW5pdGlhbCBzdGF0ZSBvZiB0aGUgc3RhdGUgbWFjaGluZQogICoJXHBhcmFtCUJhc2UJCVN0YXRlTWFjaGluZSBiYXNlLCBpbnRlcm5hbCB1c2Ugb25seQogICoJXHByZSBwX3NtIHNob3VsZCBiZSBhIGxlZ2FsIHBvaW50ZXIKQEAgLTUwNTIsMzQgKzUwOTcsMzAgQEAKICBJUlFMID0gUEFTU0lWRV9MRVZFTAogCiAgKi8KLVZPSUQgU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiBTVEFURV9NQUNISU5FICpTLAotCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdLAotCUlOIFVMT05HIFN0TnIsCi0JSU4gVUxPTkcgTXNnTnIsCi0JSU4gU1RBVEVfTUFDSElORV9GVU5DIERlZkZ1bmMsCi0JSU4gVUxPTkcgSW5pdFN0YXRlLAotCUlOIFVMT05HIEJhc2UpCit2b2lkIFN0YXRlTWFjaGluZUluaXQoc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlMsCisJCSAgICAgIElOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdLAorCQkgICAgICB1bnNpZ25lZCBsb25nIFN0TnIsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgTXNnTnIsCisJCSAgICAgIElOIFNUQVRFX01BQ0hJTkVfRlVOQyBEZWZGdW5jLAorCQkgICAgICB1bnNpZ25lZCBsb25nIEluaXRTdGF0ZSwgdW5zaWduZWQgbG9uZyBCYXNlKQogewotCVVMT05HIGksIGo7CisJdW5zaWduZWQgbG9uZyBpLCBqOwogCi0JLy8gc2V0IG51bWJlciBvZiBzdGF0ZXMgYW5kIG1lc3NhZ2VzCisJLyogc2V0IG51bWJlciBvZiBzdGF0ZXMgYW5kIG1lc3NhZ2VzICovCiAJUy0+TnJTdGF0ZSA9IFN0TnI7Ci0JUy0+TnJNc2cgICA9IE1zZ05yOwotCVMtPkJhc2UgICAgPSBCYXNlOworCVMtPk5yTXNnID0gTXNnTnI7CisJUy0+QmFzZSA9IEJhc2U7CiAKLQlTLT5UcmFuc0Z1bmMgID0gVHJhbnM7CisJUy0+VHJhbnNGdW5jID0gVHJhbnM7CiAKLQkvLyBpbml0IGFsbCBzdGF0ZSB0cmFuc2l0aW9uIHRvIGRlZmF1bHQgZnVuY3Rpb24KLQlmb3IgKGkgPSAwOyBpIDwgU3ROcjsgaSsrKQotCXsKLQkJZm9yIChqID0gMDsgaiA8IE1zZ05yOyBqKyspCi0JCXsKKwkvKiBpbml0IGFsbCBzdGF0ZSB0cmFuc2l0aW9uIHRvIGRlZmF1bHQgZnVuY3Rpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgU3ROcjsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBNc2dOcjsgaisrKSB7CiAJCQlTLT5UcmFuc0Z1bmNbaSAqIE1zZ05yICsgal0gPSBEZWZGdW5jOwogCQl9CiAJfQogCi0JLy8gc2V0IHRoZSBzdGFydGluZyBzdGF0ZQorCS8qIHNldCB0aGUgc3RhcnRpbmcgc3RhdGUgKi8KIAlTLT5DdXJyU3RhdGUgPSBJbml0U3RhdGU7CiB9CiAKQEAgLTUwOTQsMzggKzUxMzUsMzQgQEAKICBJUlFMID0gUEFTU0lWRV9MRVZFTAogCiAgKi8KLVZPSUQgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKAotCUlOIFNUQVRFX01BQ0hJTkUgKlMsCi0JSU4gVUxPTkcgU3QsCi0JSU4gVUxPTkcgTXNnLAotCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBGdW5jKQordm9pZCBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlMsCisJCQkgICB1bnNpZ25lZCBsb25nIFN0LAorCQkJICAgdW5zaWduZWQgbG9uZyBNc2csIElOIFNUQVRFX01BQ0hJTkVfRlVOQyBGdW5jKQogewotCVVMT05HIE1zZ0lkeDsKKwl1bnNpZ25lZCBsb25nIE1zZ0lkeDsKIAogCU1zZ0lkeCA9IE1zZyAtIFMtPkJhc2U7CiAKLQlpZiAoU3QgPCBTLT5OclN0YXRlICYmIE1zZ0lkeCA8IFMtPk5yTXNnKQotCXsKLQkJLy8gYm91bmRhcnkgY2hlY2tpbmcgYmVmb3JlIHNldHRpbmcgdGhlIGFjdGlvbgorCWlmIChTdCA8IFMtPk5yU3RhdGUgJiYgTXNnSWR4IDwgUy0+TnJNc2cpIHsKKwkJLyogYm91bmRhcnkgY2hlY2tpbmcgYmVmb3JlIHNldHRpbmcgdGhlIGFjdGlvbiAqLwogCQlTLT5UcmFuc0Z1bmNbU3QgKiBTLT5Ock1zZyArIE1zZ0lkeF0gPSBGdW5jOwogCX0KIH0KIAogLyohIFxicmllZgkgVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBzdGF0ZSB0cmFuc2l0aW9uCiAgKglccGFyYW0JICpBZGFwdGVyIHRoZSBOSUMgYWRhcHRlciBwb2ludGVyCi0gKglccGFyYW0JICpTIAkgIHRoZSBzdGF0ZSBtYWNoaW5lCisgKglccGFyYW0JICpTCSAgdGhlIHN0YXRlIG1hY2hpbmUKICAqCVxwYXJhbQkgKkVsZW0JICB0aGUgbWVzc2FnZSB0byBiZSBleGVjdXRlZAogICoJXHJldHVybiAgIE5vbmUKIAogIElSUUwgPSBESVNQQVRDSF9MRVZFTAogCiAgKi8KLVZPSUQgU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBTVEFURV9NQUNISU5FICpTLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlMsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JKCooUy0+VHJhbnNGdW5jW1MtPkN1cnJTdGF0ZSAqIFMtPk5yTXNnICsgRWxlbS0+TXNnVHlwZSAtIFMtPkJhc2VdKSkocEFkLCBFbGVtKTsKKwkoKihTLT5UcmFuc0Z1bmNbUy0+Q3VyclN0YXRlICogUy0+TnJNc2cgKyBFbGVtLT5Nc2dUeXBlIC0gUy0+QmFzZV0pKQorCSAgICAocEFkLCBFbGVtKTsKIH0KIAogLyoKQEAgLTUxMzYsMTUgKzUxNzMsMTMgQEAKIAkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbigpCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBEcm9wKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgRHJvcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7CiB9CiAKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGxmc3IuYwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogbGZzci5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTUxNTQsOSArNTE4OSw3IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIExmc3JJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVMT05HIFNlZWQpCit2b2lkIExmc3JJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdW5zaWduZWQgbG9uZyBTZWVkKQogewogCWlmIChTZWVkID09IDApCiAJCXBBZC0+TWxtZS5TaGlmdFJlZyA9IDE7CkBAIC01MTY5LDI2ICs1MjAyLDIzIEBACiAJRGVzY3JpcHRpb246CiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVUNIQVIgUmFuZG9tQnl0ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3U4IFJhbmRvbUJ5dGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVVMT05HIGk7Ci0JVUNIQVIgUiwgUmVzdWx0OworCXVuc2lnbmVkIGxvbmcgaTsKKwl1OCBSLCBSZXN1bHQ7CiAKIAlSID0gMDsKIAogCWlmIChwQWQtPk1sbWUuU2hpZnRSZWcgPT0gMCkKLQlOZGlzR2V0U3lzdGVtVXBUaW1lKChVTE9ORyAqKSZwQWQtPk1sbWUuU2hpZnRSZWcpOworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCh1bnNpZ25lZCBsb25nICopICYgcEFkLT5NbG1lLlNoaWZ0UmVnKTsKIAotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JewotCQlpZiAocEFkLT5NbG1lLlNoaWZ0UmVnICYgMHgwMDAwMDAwMSkKLQkJewotCQkJcEFkLT5NbG1lLlNoaWZ0UmVnID0gKChwQWQtPk1sbWUuU2hpZnRSZWcgXiBMRlNSX01BU0spID4+IDEpIHwgMHg4MDAwMDAwMDsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmIChwQWQtPk1sbWUuU2hpZnRSZWcgJiAweDAwMDAwMDAxKSB7CisJCQlwQWQtPk1sbWUuU2hpZnRSZWcgPQorCQkJICAgICgocEFkLT5NbG1lLgorCQkJICAgICAgU2hpZnRSZWcgXiBMRlNSX01BU0spID4+IDEpIHwgMHg4MDAwMDAwMDsKIAkJCVJlc3VsdCA9IDE7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlwQWQtPk1sbWUuU2hpZnRSZWcgPSBwQWQtPk1sbWUuU2hpZnRSZWcgPj4gMTsKIAkJCVJlc3VsdCA9IDA7CiAJCX0KQEAgLTUxOTgsMjQ1NCArNTIyOCw2IEBACiAJcmV0dXJuIFI7CiB9CiAKLVZPSUQgQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBSYXRlVGFibGUpCi17Ci0JVUNIQVIJCQkJCWk7Ci0JSFRfRkJLX0NGRzBfU1RSVUMJCUh0Q2ZnMDsKLQlIVF9GQktfQ0ZHMV9TVFJVQwkJSHRDZmcxOwotCUxHX0ZCS19DRkcwX1NUUlVDCQlMZ0NmZzA7Ci0JTEdfRkJLX0NGRzFfU1RSVUMJCUxnQ2ZnMTsKLQlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGU7Ci0KLQkvLyBzZXQgdG8gaW5pdGlhbCB2YWx1ZQotCUh0Q2ZnMC53b3JkID0gMHg2NTQzMjEwMDsKLQlIdENmZzEud29yZCA9IDB4ZWRjYmE5ODg7Ci0JTGdDZmcwLndvcmQgPSAweGVkY2JhOTg4OwotCUxnQ2ZnMS53b3JkID0gMHgwMDAwMjEwMDsKLQotCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKXBSYXRlVGFibGUrMTsKLQlmb3IgKGkgPSAxOyBpIDwgKigoUFVDSEFSKSBwUmF0ZVRhYmxlKTsgaSsrKQotCXsKLQkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpcFJhdGVUYWJsZSsxK2k7Ci0JCXN3aXRjaCAocEN1cnJUeFJhdGUtPk1vZGUpCi0JCXsKLQkJCWNhc2UgMDoJCS8vQ0NLCi0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6CQkvL09GRE0KLQkJCQl7Ci0JCQkJCXN3aXRjaChwQ3VyclR4UmF0ZS0+Q3Vyck1DUykKLQkJCQkJewotCQkJCQkJY2FzZSAwOgotCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTMEZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMToKLQkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzFGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDI6Ci0JCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MyRkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAzOgotCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTM0ZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgNDoKLQkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzRGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDU6Ci0JCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1M1RkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA2OgotCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTNkZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgNzoKLQkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzdGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6CQkvL0hULU1JWAotCQkJY2FzZSAzOgkJLy9IVC1HRgotCQkJCXsKLQkJCQkJaWYgKChwTmV4dFR4UmF0ZS0+TW9kZSA+PSBNT0RFX0hUTUlYKSAmJiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgIT0gcE5leHRUeFJhdGUtPkN1cnJNQ1MpKQotCQkJCQl7Ci0JCQkJCQlzd2l0Y2gocEN1cnJUeFJhdGUtPkN1cnJNQ1MpCi0JCQkJCQl7Ci0JCQkJCQkJY2FzZSAwOgotCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MwRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMToKLQkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTMUZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDI6Ci0JCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzJGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAzOgotCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MzRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgNDoKLQkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTNEZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDU6Ci0JCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzVGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSA2OgotCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M2RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgNzoKLQkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTN0ZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDg6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzhGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSA5OgotCQkJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1M5RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMTA6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEwRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMTE6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzExRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMTI6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEyRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMTM6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEzRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMTQ6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzE0RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMTU6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzE1RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZTogbm90IHN1cHBvcnQgQ3Vyck1DUz0lZFxuIiwgcEN1cnJUeFJhdGUtPkN1cnJNQ1MpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJfQotCi0JCXBOZXh0VHhSYXRlID0gcEN1cnJUeFJhdGU7Ci0JfQotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgSFRfRkJLX0NGRzAsIEh0Q2ZnMC53b3JkKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIVF9GQktfQ0ZHMSwgSHRDZmcxLndvcmQpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIExHX0ZCS19DRkcwLCBMZ0NmZzAud29yZCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgTEdfRkJLX0NGRzEsIExnQ2ZnMS53b3JkKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVNldCBNQUMgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIG9wZXJhdGlvbiBtb2RlLgotCQlPcGVyYXRpb25Nb2RlIEFORCBiTm9uR0ZFeGlzdCBhcmUgZm9yIE1NIGFuZCBHRiBQcm90ZWNpdG9uLgotCQlJZiBNTSBvciBHRiBtYXNrIGlzIG5vdCBzZXQsIHRob3NlIHBhc3NpbmcgYXJndW1lbnQgZG9lc24ndCBub3QgdGFrZSBlZmZlY3QuCi0KLQkJT3BlcmF0aW9uIG1vZGUgbWVhbmluZzoKLQkJPSAwIDogUHVyZSBIVCwgbm8gcHJlb3RlY3Rpb24uCi0JCT0gMHgwMTsgdGhlcmUgbWF5IGJlIG5vbi1IVCBkZXZpY2VzIGluIGJvdGggdGhlIGNvbnRyb2wgYW5kIGV4dGVuc2lvbiBjaGFubmVsLCBwcm90ZWN0aW9uIGlzIG9wdGlvbmFsIGluIEJTUy4KLQkJPSAweDEwOiBObyBUcmFuc21pc3Npb24gaW4gNDBNIGlzIHByb3RlY3RlZC4KLQkJPSAweDExOiBUcmFuc21pc3Npb24gaW4gYm90aCA0ME0gYW5kIDIwTSBzaGFsbCBiZSBwcm90ZWN0ZWQKLQkJaWYgKGJOb25HRkV4aXN0KQotCQkJd2Ugc2hvdWxkIGNob29zZSBub3QgdG8gdXNlIEdGLiBCdXQgc3RpbGwgc2V0IGNvcnJlY3QgQVNJQyByZWdpc3RlcnMuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCAJQXNpY1VwZGF0ZVByb3RlY3QoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIAkJVVNIT1JUCQkJT3BlcmF0aW9uTW9kZSwKLQlJTiAJCVVDSEFSCQkJU2V0TWFzaywKLQlJTgkJQk9PTEVBTgkJCWJEaXNhYmxlQkdQcm90ZWN0LAotCUlOCQlCT09MRUFOCQkJYk5vbkdGRXhpc3QpCi17Ci0JUFJPVF9DRkdfU1RSVUMJUHJvdENmZywgUHJvdENmZzQ7Ci0JVUlOVDMyIFByb3RlY3RbNl07Ci0JVVNIT1JUCQkJb2Zmc2V0OwotCVVDSEFSCQkJaTsKLQlVSU5UMzIgTWFjUmVnID0gMDsKLQotCWlmICghKHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QpICYmIChPcGVyYXRpb25Nb2RlICE9IDgpKQotCXsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yKQotCXsKLQkJLy8KLQkJLy8gZW5hYmxlIHRoZSBSVFMvQ1RTIHRvIGF2b2lkIGNoYW5uZWwgY29sbGlzaW9uCi0JCS8vCi0JCVNldE1hc2sgPSBBTExOX1NFVFBST1RFQ1Q7Ci0JCU9wZXJhdGlvbk1vZGUgPSA4OwotCX0KLQotCS8vIENvbmZpZyBBU0lDIFJUUyB0aHJlc2hvbGQgcmVnaXN0ZXIKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUU19DRkcsICZNYWNSZWcpOwotCU1hY1JlZyAmPSAweEZGMDAwMEZGOwotCi0JLy8gSWYgdGhlIHVzZXIgd2FudCBkaXNhYmxlIFJ0c1RocmVzaG9sZCBhbmQgZW5hYmxlIEFtc2R1L1JhbGluay1BZ2dyZWdhdGlvbiwgc2V0IHRoZSBSdHNUaHJlc2hvbGQgYXMgNDA5NgotICAgICAgICBpZiAoKAotCQkJKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSkgfHwKLQkJCShwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID09IFRSVUUpKQotICAgICAgICAgICAgJiYgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID09IE1BWF9SVFNfVEhSRVNIT0xEKQotICAgICAgICB7Ci0JCQlNYWNSZWcgfD0gKDB4MTAwMCA8PCA4KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQkJCU1hY1JlZyB8PSAocEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkIDw8IDgpOwotICAgICAgICB9Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFNfQ0ZHLCBNYWNSZWcpOwotCi0JLy8gSW5pdGlhbCBjb21tb24gcHJvdGVjdGlvbiBzZXR0aW5ncwotCVJUTVBaZXJvTWVtb3J5KFByb3RlY3QsIHNpemVvZihQcm90ZWN0KSk7Ci0JUHJvdENmZzQud29yZCA9IDA7Ci0JUHJvdENmZy53b3JkID0gMDsKLQlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0dGNDAgPSAxOwotCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0YyMCA9IDE7Ci0JUHJvdENmZy5maWVsZC5UeG9wQWxsb3dNTTQwID0gMTsKLQlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NMjAgPSAxOwotCVByb3RDZmcuZmllbGQuVHhvcEFsbG93T2ZkbSA9IDE7Ci0JUHJvdENmZy5maWVsZC5UeG9wQWxsb3dDY2sgPSAxOwotCVByb3RDZmcuZmllbGQuUlRTVGhFbiA9IDE7Ci0JUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKLQotCS8vIHVwZGF0ZSBQSFkgbW9kZSBhbmQgcmF0ZQotCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JCVByb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSAweDQwMDA7Ci0JUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSB8PSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOwotCi0JLy8gSGFuZGxlIGxlZ2FjeShCL0cpIHByb3RlY3Rpb24KLQlpZiAoYkRpc2FibGVCR1Byb3RlY3QpCi0JewotCQkvL1Byb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOwotCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsKLQkJUHJvdGVjdFswXSA9IFByb3RDZmcud29yZDsKLQkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKLQl9Ci0JZWxzZQotCXsKLQkJLy9Qcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKLQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IDA7CQkJLy8gQ0NLIGRvIG5vdCBuZWVkIHRvIGJlIHByb3RlY3RlZAotCQlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOwotCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19DVFM7CS8vIE9GRE0gbmVlZHMgdXNpbmcgQ0NLIHRvIHByb3RlY3QKLQkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKLQl9Ci0KLQkvLyBEZWNpZGUgSFQgZnJhbWUgcHJvdGVjdGlvbi4KLQlpZiAoKFNldE1hc2sgJiBBTExOX1NFVFBST1RFQ1QpICE9IDApCi0JewotCQlzd2l0Y2goT3BlcmF0aW9uTW9kZSkKLQkJewotCQkJY2FzZSAweDA6Ci0JCQkJLy8gTk8gUFJPVEVDVAotCQkJCS8vIDEuQWxsIFNUQXMgaW4gdGhlIEJTUyBhcmUgMjAvNDAgTUh6IEhUCi0JCQkJLy8gMi4gaW4gYWkgMjAvNDBNSHogQlNTCi0JCQkJLy8gMy4gYWxsIFNUQXMgYXJlIDIwTUh6IGluIGEgMjBNSHogQlNTCi0JCQkJLy8gUHVyZSBIVC4gbm8gcHJvdGVjdGlvbi4KLQotCQkJCS8vIE1NMjBfUFJPVF9DRkcKLQkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCi0JCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExCi0JCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCi0JCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCi0JCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKLQkJCQlQcm90ZWN0WzJdID0gMHgwMTc0NDAwNDsKLQotCQkJCS8vIE1NNDBfUFJPVF9DRkcKLQkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCi0JCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExCi0JCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCi0JCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCi0JCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pCi0JCQkJUHJvdGVjdFszXSA9IDB4MDNmNDQwODQ7Ci0KLQkJCQkvLyBDRjIwX1BST1RfQ0ZHCi0JCQkJLy8JUmVzZXJ2ZWQgKDMxOjI3KQotCQkJCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQotCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQotCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQotCQkJCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDAwNCAoT0ZETSAyNE0pCi0JCQkJUHJvdGVjdFs0XSA9IDB4MDE3NDQwMDQ7Ci0KLQkJCQkvLyBDRjQwX1BST1RfQ0ZHCi0JCQkJLy8JUmVzZXJ2ZWQgKDMxOjI3KQotCQkJCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDExMTExMQotCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQotCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQotCQkJCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQotCQkJCVByb3RlY3RbNV0gPSAweDAzZjQ0MDg0OwotCi0JCQkJaWYgKGJOb25HRkV4aXN0KQotCQkJCXsKLQkJCQkJLy8gUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3RpaW9uKQotCQkJCQkvLyBQUk9UX0NUUkwoMTc6MTYpIC0tIDAxIChSVFMvQ1RTKQotCQkJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKLQkJCQkJUHJvdGVjdFs1XSA9IDB4MDNmNTQwODQ7Ci0JCQkJfQotCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKLQkJCQlicmVhazsKLQotIAkJCWNhc2UgMToKLQkJCQkvLyBUaGlzIGlzICJIVCBub24tbWVtYmVyIHByb3RlY3Rpb24gbW9kZS4iCi0JCQkJLy8gSWYgdGhlcmUgbWF5IGJlIG5vbi1IVCBTVEFzIG15IEJTUwotCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8vIFBST1RfQ1RSTCgxNzoxNikgOiAwIChOb25lKQotCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQ0MDg0OyAvLyBkdXBsaWNhZXQgbGVnYWN5IDI0TS4gQlcgc2V0IDEuCi0JCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKQotCQkJCXsKLQkJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0MDAwMzsJLy9FUlAgdXNlIFByb3RlY3Rpb24gYml0IGlzIHNldCwgdXNlIHByb3RlY3Rpb24gcmF0ZSBhdCBDbGF1c2UgMTguLgotCQkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0MDAwMzsgLy8gRG9uJ3QgZHVwbGljYXRlIFJUUy9DVFMgaW4gQ0NLIG1vZGUuIDB4MDNmNDAwODM7Ci0JCQkJfQotCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciAyMCY0MCBNSHogcGFja2V0cwotCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKLQkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOwotCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7Ci0JCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7Ci0JCQkJUHJvdGVjdFsyXSA9IFByb3RDZmcud29yZDsKLQkJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKLQkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOwotCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIDI6Ci0JCQkJLy8gSWYgb25seSBIVCBTVEFzIGFyZSBpbiBCU1MuIGF0IGxlYXN0IG9uZSBpcyAyME1Iei4gT25seSBwcm90ZWN0IDQwTUh6IHBhY2tldHMKLQkJCQlQcm90Q2ZnLndvcmQgPSAweDAxNzQ0MDA0OyAgLy8gUFJPVF9DVFJMKDE3OjE2KSA6IDAgKE5vbmUpCi0JCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7IC8vIGR1cGxpY2FldCBsZWdhY3kgMjRNLiBCVyBzZXQgMS4KLQotCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciA0ME1IeiBwYWNrZXRzCi0JCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKLQkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKLQkJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOwotCQkJCVByb3RlY3RbM10gPSBQcm90Q2ZnNC53b3JkOwotCQkJCWlmIChiTm9uR0ZFeGlzdCkKLQkJCQl7Ci0JCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKLQkJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKLQkJCQl9Ci0JCQkJUHJvdGVjdFs0XSA9IFByb3RDZmcud29yZDsKLQkJCQlQcm90ZWN0WzVdID0gUHJvdENmZzQud29yZDsKLQotCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAzOgotCQkJCS8vIEhUIG1peGVkIG1vZGUuCSBQUk9URUNUIEFMTCEKLQkJCQkvLyBBc3NpZ24gUmF0ZQotCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8vZHVwbGljYWV0IGxlZ2FjeSAyNE0uIEJXIHNldCAxLgotCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQ0MDg0OwotCQkJCS8vIGJvdGggMjBNSHogYW5kIDQwTUh6IGFyZSBwcm90ZWN0ZWQuIFdoZXRoZXIgdXNlIFJUUyBvciBDVFMtdG8tc2VsZiBkZXBlbmRzIG9uIHRoZQotCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKSkKLQkJCQl7Ci0JCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDAwMDM7CS8vRVJQIHVzZSBQcm90ZWN0aW9uIGJpdCBpcyBzZXQsIHVzZSBwcm90ZWN0aW9uIHJhdGUgYXQgQ2xhdXNlIDE4Li4KLQkJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDAwMDM7IC8vIERvbid0IGR1cGxpY2F0ZSBSVFMvQ1RTIGluIENDSyBtb2RlLiAweDAzZjQwMDgzCi0JCQkJfQotCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciAyMCY0MCBNSHogcGFja2V0cwotCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKLQkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOwotCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7Ci0JCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7Ci0JCQkJUHJvdGVjdFsyXSA9IFByb3RDZmcud29yZDsKLQkJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKLQkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOwotCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIDg6Ci0JCQkJLy8gU3BlY2lhbCBvbiBmb3IgQXRoZXJvcyBwcm9ibGVtIG4gY2hpcC4KLQkJCQlQcm90ZWN0WzJdID0gMHgwMTc1NDAwNDsKLQkJCQlQcm90ZWN0WzNdID0gMHgwM2Y1NDA4NDsKLQkJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKLQkJCQlQcm90ZWN0WzVdID0gMHgwM2Y1NDA4NDsKLQkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gVFJVRTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCW9mZnNldCA9IENDS19QUk9UX0NGRzsKLQlmb3IgKGkgPSAwO2kgPCA2O2krKykKLQl7Ci0JCWlmICgoU2V0TWFzayAmICgxPDwgaSkpKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyBpKjQsIFByb3RlY3RbaV0pOwotCQl9Ci0JfQotfQotCi0jaWZkZWYgUlQyODcwCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlMb2FkIFJGIG5vcm1hbCBvcGVyYXRpb24tbW9kZSBzZXR1cAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBSVDMweHhMb2FkUkZOb3JtYWxNb2RlU2V0dXAoCi0JSU4gUFJUTVBfQURBUFRFUiAJcEFkKQotewotCVVDSEFSIFJGVmFsdWU7Ci0KLQkvLyBSWDBfUEQgJiBUWDBfUEQsIFJGIFIxIHJlZ2lzdGVyIEJpdCAyICYgQml0IDMgdG8gMCBhbmQgUkZfQkxPQ0tfZW4sUlgxX1BEICYgVFgxX1BELCBCaXQwLCBCaXQgNCAmIEJpdDUgdG8gMQotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDBDKSkgfCAweDMxOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgUkZWYWx1ZSk7Ci0KLQkvLyBUWF9MTzJfZW4sIFJGIFIxNSByZWdpc3RlciBCaXQgMyB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMTUsICZSRlZhbHVlKTsKLQlSRlZhbHVlICY9ICh+MHgwOCk7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjE1LCBSRlZhbHVlKTsKLQotCS8vIFRYX0xPMV9lbiwgUkYgUjE3IHJlZ2lzdGVyIEJpdCAzIHRvIDAKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IxNywgJlJGVmFsdWUpOwotCVJGVmFsdWUgJj0gKH4weDA4KTsKLQkvLyB0byBmaXggcnggbG9uZyByYW5nZSBpc3N1ZQotCWlmICgoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPj0gMHgwMjExKSAmJiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRyA9PSAwKSkKLQl7Ci0JCVJGVmFsdWUgfD0gMHgyMDsKLQl9Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjE3LCBSRlZhbHVlKTsKLQotCS8vIFJYX0xPMV9lbiwgUkYgUjIwIHJlZ2lzdGVyIEJpdCAzIHRvIDAKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMCwgJlJGVmFsdWUpOwotCVJGVmFsdWUgJj0gKH4weDA4KTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjAsIFJGVmFsdWUpOwotCi0JLy8gUlhfTE8yX2VuLCBSRiBSMjEgcmVnaXN0ZXIgQml0IDMgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSAmPSAofjB4MDgpOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgUkZWYWx1ZSk7Ci0KLQkvLyBMRE9SRl9WQywgUkYgUjI3IHJlZ2lzdGVyIEJpdCAyIHRvIDAKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgJlJGVmFsdWUpOwotCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkKLQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSkgfCAweDM7Ci0JZWxzZQotCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAofjB4NzcpKTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIFJGVmFsdWUpOwotCS8qIGVuZCBqb2hubGkgKi8KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JTG9hZCBSRiBzbGVlcC1tb2RlIHNldHVwCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFJUMzB4eExvYWRSRlNsZWVwTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIgCXBBZCkKLXsKLQlVQ0hBUiBSRlZhbHVlOwotCVVJTlQzMiBNQUNWYWx1ZTsKLQotCS8vIFJGX0JMT0NLX2VuLiBSRiBSMSByZWdpc3RlciBCaXQgMCB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsICZSRlZhbHVlKTsKLQlSRlZhbHVlICY9ICh+MHgwMSk7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCBSRlZhbHVlKTsKLQotCS8vIFZDT19JQywgUkYgUjcgcmVnaXN0ZXIgQml0IDQgJiBCaXQgNSB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsICZSRlZhbHVlKTsKLQlSRlZhbHVlICY9ICh+MHgzMCk7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCBSRlZhbHVlKTsKLQotCS8vIElkb2gsIFJGIFI5IHJlZ2lzdGVyIEJpdCAxLCBCaXQgMiAmIEJpdCAzIHRvIDAKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwOSwgJlJGVmFsdWUpOwotCVJGVmFsdWUgJj0gKH4weDBFKTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDksIFJGVmFsdWUpOwotCi0JLy8gUlhfQ1RCX2VuLCBSRiBSMjEgcmVnaXN0ZXIgQml0IDcgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSAmPSAofjB4ODApOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgUkZWYWx1ZSk7Ci0KLQkvLyBMRE9SRl9WQywgUkYgUjI3IHJlZ2lzdGVyIEJpdCAwLCBCaXQgMSAmIEJpdCAyIHRvIDEKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgJlJGVmFsdWUpOwotCVJGVmFsdWUgfD0gMHg3NzsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIFJGVmFsdWUpOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJk1BQ1ZhbHVlKTsKLQlNQUNWYWx1ZSB8PSAweDFEMDAwMDAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIExET19DRkcwLCBNQUNWYWx1ZSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCVJldmVyc2UgUkYgc2xlZXAtbW9kZSBzZXR1cAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBSVDMweHhSZXZlcnNlUkZTbGVlcE1vZGVTZXR1cCgKLQlJTiBQUlRNUF9BREFQVEVSIAlwQWQpCi17Ci0JVUNIQVIgUkZWYWx1ZTsKLQlVSU5UMzIgTUFDVmFsdWU7Ci0KLQkvLyBSRl9CTE9DS19lbiwgUkYgUjEgcmVnaXN0ZXIgQml0IDAgdG8gMQotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSB8PSAweDAxOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgUkZWYWx1ZSk7Ci0KLQkvLyBWQ09fSUMsIFJGIFI3IHJlZ2lzdGVyIEJpdCA0ICYgQml0IDUgdG8gMQotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSB8PSAweDMwOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgUkZWYWx1ZSk7Ci0KLQkvLyBJZG9oLCBSRiBSOSByZWdpc3RlciBCaXQgMSwgQml0IDIgJiBCaXQgMyB0byAxCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDksICZSRlZhbHVlKTsKLQlSRlZhbHVlIHw9IDB4MEU7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA5LCBSRlZhbHVlKTsKLQotCS8vIFJYX0NUQl9lbiwgUkYgUjIxIHJlZ2lzdGVyIEJpdCA3IHRvIDEKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgJlJGVmFsdWUpOwotCVJGVmFsdWUgfD0gMHg4MDsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsIFJGVmFsdWUpOwotCi0JLy8gTERPUkZfVkMsIFJGIFIyNyByZWdpc3RlciBCaXQgMiB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsICZSRlZhbHVlKTsKLQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpCi0JCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHg3NykpIHwgMHgzOwotCWVsc2UKLQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSk7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCBSRlZhbHVlKTsKLQotCS8vIFJUMzA3MSB2ZXJzaW9uIEUgaGFzIGZpeGVkIHRoaXMgaXNzdWUKLQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5EQUNUZXN0Qml0ID09IDEpICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkpCi0JewotCQkvLyBwYXRjaCB0eCBFVk0gaXNzdWUgdGVtcG9yYXJpbHkKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJk1BQ1ZhbHVlKTsKLQkJTUFDVmFsdWUgPSAoKE1BQ1ZhbHVlICYgMHhFMEZGRkZGRikgfCAweDBEMDAwMDAwKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTERPX0NGRzAsIE1BQ1ZhbHVlKTsKLQl9Ci0JZWxzZQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJk1BQ1ZhbHVlKTsKLQkJTUFDVmFsdWUgPSAoKE1BQ1ZhbHVlICYgMHhFMEZGRkZGRikgfCAweDAxMDAwMDAwKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTERPX0NGRzAsIE1BQ1ZhbHVlKTsKLQl9Ci19Ci0jZW5kaWYKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY1N3aXRjaENoYW5uZWwoCi0JCQkJCSAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUNIQVIJCQlDaGFubmVsLAotCUlOCUJPT0xFQU4JCQliU2NhbikKLXsKLQlVTE9ORwkJCVIyID0gMCwgUjMgPSBERUZBVUxUX1JGX1RYX1BPV0VSLCBSNCA9IDA7Ci0JQ0hBUiAgICBUeFB3ZXIgPSAwLCBUeFB3ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsgLy9CYnA5NCA9IEJCUFI5NF9ERUZBVUxULCBUeFB3ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQlVQ0hBUglpbmRleDsKLQlVSU5UMzIgCVZhbHVlID0gMDsgLy9CYnBSZWcsIFZhbHVlOwotCVJUTVBfUkZfUkVHUyAqUkZSZWdUYWJsZTsKLQotCS8vIFNlYXJjaCBUeCBwb3dlciB2YWx1ZQotCS8vIFdlIGNhbid0IHVzZSBDaGFubmVsTGlzdCB0byBzZWFyY2ggY2hhbm5lbCwgc2luY2Ugc29tZSBjZW50cmFsIGNoYW5ubCdzIHR4cG93ciBkb2Vzbid0IGxpc3QKLQkvLyBpbiBDaGFubmVsTGlzdCwgc28gdXNlIFR4UG93ZXIgYXJyYXkgaW5zdGVhZC4KLQkvLwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGluZGV4KyspCi0JewotCQlpZiAoQ2hhbm5lbCA9PSBwQWQtPlR4UG93ZXJbaW5kZXhdLkNoYW5uZWwpCi0JewotCQkJVHhQd2VyID0gcEFkLT5UeFBvd2VyW2luZGV4XS5Qb3dlcjsKLQkJCVR4UHdlcjIgPSBwQWQtPlR4UG93ZXJbaW5kZXhdLlBvd2VyMjsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGluZGV4ID09IE1BWF9OVU1fT0ZfQ0hBTk5FTFMpCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzaWNTd2l0Y2hDaGFubmVsOiBDYW4ndCBmaW5kIHRoZSBDaGFubmVsIyVkIFxuIiwgQ2hhbm5lbCkpOwotCi0jaWZkZWYgUlQyODcwCi0JLy8gVGhlIFJGIHByb2dyYW1taW5nIHNlcXVlbmNlIGlzIGRpZmZlcmVuY2UgYmV0d2VlbiAzeHh4IGFuZCAyeHh4Ci0JaWYgKChJU19SVDMwNzAocEFkKSB8fCBJU19SVDMwOTAocEFkKSkgJiYgKAotCSAgICAgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIyKSB8fCAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjEpIHx8Ci0JICAgICAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApIHx8IChwQWQtPlJmSWNUeXBlID09IFJGSUNfMjAyMCkpKQotCXsKLQkJLyogbW9kaWZ5IGJ5IFdZIGZvciBSZWFkIFJGIFJlZy4gZXJyb3IgKi8KLQkJVUNIQVIgUkZWYWx1ZTsKLQotCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMzAyMF9DSE5MOyBpbmRleCsrKQotCQl7Ci0JCQlpZiAoQ2hhbm5lbCA9PSBGcmVxSXRlbXMzMDIwW2luZGV4XS5DaGFubmVsKQotCQkJewotCQkJCS8vIFByb2dyYW1taW5nIGNoYW5uZWwgcGFyYW1ldGVycwotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMiwgRnJlcUl0ZW1zMzAyMFtpbmRleF0uTik7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAzLCBGcmVxSXRlbXMzMDIwW2luZGV4XS5LKTsKLQotCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA2LCAmUkZWYWx1ZSk7Ci0JCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgMHhGQykgfCBGcmVxSXRlbXMzMDIwW2luZGV4XS5SOwotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgUkZWYWx1ZSk7Ci0KLQkJCQkvLyBTZXQgVHgwIFBvd2VyCi0JCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMTIsICZSRlZhbHVlKTsKLQkJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAweEUwKSB8IFR4UHdlcjsKLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMTIsIFJGVmFsdWUpOwotCi0JCQkJLy8gU2V0IFR4MSBQb3dlcgotCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjEzLCAmUkZWYWx1ZSk7Ci0JCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgMHhFMCkgfCBUeFB3ZXIyOwotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxMywgUkZWYWx1ZSk7Ci0KLQkJCQkvLyBUeC9SeCBTdHJlYW0gc2V0dGluZwotCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCAmUkZWYWx1ZSk7Ci0JCQkJLy9pZiAoSVNfUlQzMDkwKHBBZCkpCi0JCQkJLy8JUkZWYWx1ZSB8PSAweDAxOyAvLyBFbmFibGUgUkYgYmxvY2suCi0JCQkJUkZWYWx1ZSAmPSAweDAzOwkvL2NsZWFyIGJpdFs3fjJdCi0JCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKLQkJCQkJUkZWYWx1ZSB8PSAweEEwOwotCQkJCWVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikKLQkJCQkJUkZWYWx1ZSB8PSAweDgwOwotCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCi0JCQkJCVJGVmFsdWUgfD0gMHg1MDsKLQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCi0JCQkJCVJGVmFsdWUgfD0gMHg0MDsKLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsIFJGVmFsdWUpOwotCi0JCQkJLy8gU2V0IFJGIG9mZnNldAotCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIzLCAmUkZWYWx1ZSk7Ci0JCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgMHg4MCkgfCBwQWQtPlJmRnJlcU9mZnNldDsKLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjMsIFJGVmFsdWUpOwotCi0JCQkJLy8gU2V0IEJXCi0JCQkJaWYgKCFiU2NhbiAmJiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKSkKLQkJCQl7Ci0JCQkJCVJGVmFsdWUgPSBwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNDsKLQkJCQkJLy9ESVNBQkxFXzExTl9DSEVDSyhwQWQpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlSRlZhbHVlID0gcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQ7Ci0JCQkJfQotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZWYWx1ZSk7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCBSRlZhbHVlKTsKLQotCQkJCS8vIEVuYWJsZSBSRiB0dW5pbmcKLQkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgJlJGVmFsdWUpOwotCQkJCVJGVmFsdWUgPSBSRlZhbHVlIHwgMHgxOwotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgUkZWYWx1ZSk7Ci0KLQkJCQkvLyBsYXRjaCBjaGFubmVsIGZvciBmdXR1cmUgdXNhZ2UuCi0JCQkJcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID0gQ2hhbm5lbDsKLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsIFB3cjA9JWQsIFB3cjE9JWQsICVkVCksIE49MHglMDJYLCBLPTB4JTAyWCwgUj0weCUwMlhcbiIsCi0JCQkJCUNoYW5uZWwsCi0JCQkJCXBBZC0+UmZJY1R5cGUsCi0JCQkJCVR4UHdlciwKLQkJCQkJVHhQd2VyMiwKLQkJCQkJcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKLQkJCQkJRnJlcUl0ZW1zMzAyMFtpbmRleF0uTiwKLQkJCQkJRnJlcUl0ZW1zMzAyMFtpbmRleF0uSywKLQkJCQkJRnJlcUl0ZW1zMzAyMFtpbmRleF0uUikpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3dpdGNoQ2hhbm5lbCMlZChSRj0lZCwgUHdyMD0lZCwgUHdyMT0lZCwgJWRUKSwgTj0weCUwMlgsIEs9MHglMDJYLCBSPTB4JTAyWFxuIiwKLQkJCUNoYW5uZWwsCi0JCQlwQWQtPlJmSWNUeXBlLAotCQkJVHhQd2VyLAotCQkJVHhQd2VyMiwKLQkJCXBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgsCi0JCQlGcmVxSXRlbXMzMDIwW2luZGV4XS5OLAotCQkJRnJlcUl0ZW1zMzAyMFtpbmRleF0uSywKLQkJCUZyZXFJdGVtczMwMjBbaW5kZXhdLlIpKTsKLQl9Ci0JZWxzZQotI2VuZGlmIC8vIFJUMjg3MCAvLwotCXsKLQkJUkZSZWdUYWJsZSA9IFJGMjg1MFJlZ1RhYmxlOwotCi0JCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKLQkJewotCQkJY2FzZSBSRklDXzI4MjA6Ci0JCQljYXNlIFJGSUNfMjg1MDoKLQkJCWNhc2UgUkZJQ18yNzIwOgotCQkJY2FzZSBSRklDXzI3NTA6Ci0KLQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspCi0JCQl7Ci0JCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkKLQkJCQl7Ci0JCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjI7Ci0JCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCQkJCXsKLQkJCQkJCVIyIHw9IDB4NDAwMDsJLy8gSWYgVFhwYXRoIGlzIDEsIGJpdCAxNCA9IDE7Ci0JCQkJCX0KLQotCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQotCQkJCQl7Ci0JCQkJCQlSMiB8PSAweDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeHBhdGguCi0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCQkJCQl7Ci0JCQkJCQlSMiB8PSAweDIwMDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeFBhdGgKLQkJCQkJfQotCi0JCQkJCWlmIChDaGFubmVsID4gMTQpCi0JCQkJCXsKLQkJCQkJCS8vIGluaXRpYWxpemUgUjMsIFI0Ci0JCQkJCQlSMyA9IChSRlJlZ1RhYmxlW2luZGV4XS5SMyAmIDB4ZmZmZmMxZmYpOwotCQkJCQkJUjQgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjQgJiAofjB4MDAxZjg3YzApKSB8IChwQWQtPlJmRnJlcU9mZnNldCA8PCAxNSk7Ci0KLQkJCQkJCS8vIDVHIGJhbmQgcG93ZXIgcmFuZ2U6IDB4Rjl+MFgwRiwgVFgwIFJlZzMgYml0OS9UWDEgUmVnNCBiaXQ2PSIwIiBtZWFucyB0aGUgVFggcG93ZXIgcmVkdWNlIDdkQgotCQkJCQkJLy8gUjMKLQkJCQkJCWlmICgoVHhQd2VyID49IC03KSAmJiAoVHhQd2VyIDwgMCkpCi0JCQkJCQl7Ci0JCQkJCQkJVHhQd2VyID0gKDcrVHhQd2VyKTsKLQkJCQkJCQlUeFB3ZXIgPSAoVHhQd2VyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcik7Ci0JCQkJCQkJUjMgfD0gKFR4UHdlciA8PCAxMCk7Ci0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQXNpY1N3aXRjaENoYW5uZWw6IFR4UHdlcj0lZCBcbiIsIFR4UHdlcikpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCVR4UHdlciA9IChUeFB3ZXIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyKTsKLQkJCQkJCQlSMyB8PSAoVHhQd2VyIDw8IDEwKSB8ICgxIDw8IDkpOwotCQkJCQkJfQotCi0JCQkJCQkvLyBSNAotCQkJCQkJaWYgKChUeFB3ZXIyID49IC03KSAmJiAoVHhQd2VyMiA8IDApKQotCQkJCQkJewotCQkJCQkJCVR4UHdlcjIgPSAoNytUeFB3ZXIyKTsKLQkJCQkJCQlUeFB3ZXIyID0gKFR4UHdlcjIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyMik7Ci0JCQkJCQkJUjQgfD0gKFR4UHdlcjIgPDwgNyk7Ci0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQXNpY1N3aXRjaENoYW5uZWw6IFR4UHdlcjI9JWQgXG4iLCBUeFB3ZXIyKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJVHhQd2VyMiA9IChUeFB3ZXIyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcjIpOwotCQkJCQkJCVI0IHw9IChUeFB3ZXIyIDw8IDcpIHwgKDEgPDwgNik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlSMyA9IChSRlJlZ1RhYmxlW2luZGV4XS5SMyAmIDB4ZmZmZmMxZmYpIHwgKFR4UHdlciA8PCA5KTsgLy8gc2V0IFRYIHBvd2VyMAotCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+UmZGcmVxT2Zmc2V0IDw8IDE1KSB8IChUeFB3ZXIyIDw8Nik7Ly8gU2V0IGZyZXEgT2Zmc2V0ICYgVHhQd3IxCi0JCQkJCX0KLQotCQkJCQkvLyBCYXNlZCBvbiBCQlAgY3VycmVudCBtb2RlIGJlZm9yZSBjaGFuZ2luZyBSRiBjaGFubmVsLgotCQkJCQlpZiAoIWJTY2FuICYmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApKQotCQkJCQl7Ci0JCQkJCQlSNCB8PTB4MjAwMDAwOwotCQkJCQl9Ci0KLQkJCQkJLy8gVXBkYXRlIHZhcmlhYmxlcwotCQkJCQlwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPSBDaGFubmVsOwotCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIxID0gUkZSZWdUYWJsZVtpbmRleF0uUjE7Ci0JCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjIgPSBSMjsKLQkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IFIzOwotCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjQ7Ci0KLQkJCQkJLy8gU2V0IFJGIHZhbHVlIDEncyBzZXQgUjNbYml0Ml0gPSBbMF0KLQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7Ci0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOwotCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyAmICh+MHgwNCkpKTsKLQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7Ci0KLQkJCQkJUlRNUHVzZWNEZWxheSgyMDApOwotCi0JCQkJCS8vIFNldCBSRiB2YWx1ZSAyJ3Mgc2V0IFIzW2JpdDJdID0gWzFdCi0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOwotCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKLQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgfCAweDA0KSk7Ci0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOwotCi0JCQkJCVJUTVB1c2VjRGVsYXkoMjAwKTsKLQotCQkJCQkvLyBTZXQgUkYgdmFsdWUgMydzIHNldCBSM1tiaXQyXSA9IFswXQotCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKLQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7Ci0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOwotCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKLQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLy8gQ2hhbmdlIEJCUCBzZXR0aW5nIGR1cmluZyBzaXd0Y2ggZnJvbSBhLT5nLCBnLT5hCi0JaWYgKENoYW5uZWwgPD0gMTQpCi0JewotCSAgICBVTE9ORwlUeFBpbkNmZyA9IDB4MDAwNTBGMEE7Ly9HYXJ5IDIwMDcvMDgvMDkgMHgwNTBBMEEKLQotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MiwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MywgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgMCk7Ly8oMHg0NCAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CS8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KLQkJLy9SVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg2Mik7Ci0KLQkJLy8gUnggSGlnaCBwb3dlciBWR0Egb2Zmc2V0IGZvciBMTkEgc2VsZWN0Ci0JICAgIGlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHKQotCSAgICB7Ci0JICAgICAgICBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg2Mik7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg0Nik7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JICAgICAgICBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg4NCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg1MCk7Ci0JICAgIH0KLQotCQkvLyA1RyBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKLQkJVmFsdWUgJj0gKH4weDYpOwotCQlWYWx1ZSB8PSAoMHgwNCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7Ci0KLSAgICAgICAgLy8gVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIKLQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKLQkJewotCQkJVHhQaW5DZmcgJj0gMHhGRkZGRkZGMzsKLQkJfQotCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCQl7Ci0JCQlUeFBpbkNmZyAmPSAweEZGRkZGM0ZGOwotCQl9Ci0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOwotCX0KLQllbHNlCi0JewotCSAgICBVTE9ORwlUeFBpbkNmZyA9IDB4MDAwNTBGMDU7Ly9HYXJ5IDIwMDcvOC85IDB4MDUwNTA1Ci0KLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjIsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjQsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDApOy8vKDB4NDQgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOyAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4RjIpOwotCi0JCS8vIFJ4IEhpZ2ggcG93ZXIgVkdBIG9mZnNldCBmb3IgTE5BIHNlbGVjdAotCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yQSkKLQkJewotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NDYpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NTApOwotCQl9Ci0KLQkJLy8gNUcgYmFuZCBzZWxlY3Rpb24gUElOLCBiaXQxIGFuZCBiaXQyIGFyZSBjb21wbGVtZW50Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7Ci0JCVZhbHVlICY9ICh+MHg2KTsKLQkJVmFsdWUgfD0gKDB4MDIpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOwotCi0gICAgICAgIC8vIFR1cm4gb2ZmIHVudXNlZCBQQSBvciBMTkEgd2hlbiBvbmx5IDFUIG9yIDFSCi0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjM7Ci0JfQotCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCQl7Ci0JCQlUeFBpbkNmZyAmPSAweEZGRkZGM0ZGOwotCX0KLQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7Ci0JfQotCi0gICAgLy8gUjY2IHNob3VsZCBiZSBzZXQgYWNjb3JkaW5nIHRvIENoYW5uZWwgYW5kIHVzZSAyME1IeiB3aGVuIHNjYW5uaW5nCi0JLy9SVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgKDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKSkpOwotCWlmIChiU2NhbikKLQkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIEJXXzIwKTsKLQllbHNlCi0JCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcpOwotCi0JLy8KLQkvLyBPbiAxMUEsIFdlIHNob3VsZCBkZWxheSBhbmQgd2FpdCBSRi9CQlAgdG8gYmUgc3RhYmxlCi0JLy8gYW5kIHRoZSBhcHByb3ByaWF0ZSB0aW1lIHNob3VsZCBiZSAxMDAwIG1pY3JvIHNlY29uZHMKLQkvLyAyMDA1LzA2LzA1IC0gT24gMTFHLCBXZSBhbHNvIG5lZWQgdGhpcyBkZWxheSB0aW1lLiBPdGhlcndpc2UgaXQncyBkaWZmaWN1bHQgdG8gcGFzcyB0aGUgV0hRTC4KLQkvLwotCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hDaGFubmVsIyVkKFJGPSVkLCBQd3IwPSVsdSwgUHdyMT0lbHUsICVkVCkgdG8gLCBSMT0weCUwOGx4LCBSMj0weCUwOGx4LCBSMz0weCUwOGx4LCBSND0weCUwOGx4XG4iLAotCQkJCQkJCSAgQ2hhbm5lbCwKLQkJCQkJCQkgIHBBZC0+UmZJY1R5cGUsCi0JCQkJCQkJICAoUjMgJiAweDAwMDAzZTAwKSA+PiA5LAotCQkJCQkJCSAgKFI0ICYgMHgwMDAwMDdjMCkgPj4gNiwKLQkJCQkJCQkgIHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgsCi0JCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIxLAotCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMiwKLQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjMsCi0JCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlI0KSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgMjQyMSBvbmx5LCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGR1cmluZwotCQlzaXRlIHN1cnZleS4gSXQncyBvbmx5IHJlcXVpcmVkIGFmdGVyIE5JQyBkZWNpZGVkIHRvIHN0YXkgYXQgYSBjaGFubmVsCi0JCWZvciBhIGxvbmdlciBwZXJpb2QuCi0JCVdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIGl0J3MgYWx3YXlzIGFmdGVyIEFzaWNTd2l0Y2hDaGFubmVsKCkuCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljTG9ja0NoYW5uZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgQ2hhbm5lbCkKLXsKLX0KLQotVk9JRCBBc2ljUmZUdW5pbmdFeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlHaXZlcyBDQ0sgVFggcmF0ZSAyIG1vcmUgZEIgVFggcG93ZXIuCi0JCVRoaXMgcm91dGluZSB3b3JrcyBvbmx5IGluIExJTksgVVAgaW4gSU5GUkFTVFJVQ1RVUkUgbW9kZS4KLQotCQljYWxjdWxhdGUgZGVzaXJlZCBUeCBwb3dlciBpbiBSRiBSMy5UeDB+NSwJc2hvdWxkIGNvbnNpZGVyIC0KLQkJMC4gaWYgY3VycmVudCByYWRpbyBpcyBhIG5vaXN5IGVudmlyb25tZW50IChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KQotCQkxLiBUeFBvd2VyUGVyY2VudGFnZQotCQkyLiBhdXRvIGNhbGlicmF0aW9uIGJhc2VkIG9uIFRTU0kgZmVlZGJhY2sKLQkJMy4gZXh0cmEgMiBkYiBmb3IgQ0NLCi0JCTQuIC0xMCBkYiB1cG9uIHZlcnktc2hvcnQgZGlzdGFuY2UgKEF2Z1JTU0kgPj0gLTQwZGIpIHRvIEFQCi0KLQlOT1RFOiBTaW5jZSB0aGlzIHJvdXRpbmUgcmVxdWlyZXMgdGhlIHZhbHVlIG9mIChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KSwKLQkJaXQgc2hvdWxkIGJlIGNhbGxlZCBBRlRFUiBNbG1lRHluYW1pY1R4UmF0U3dpdGNoaW5nKCkKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNBZGp1c3RUeFBvd2VyKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCUlOVAkJCWksIGo7Ci0JQ0hBUgkJRGVsdGFQd3IgPSAwOwotCUJPT0xFQU4JCWJBdXRvVHhBZ2MgPSBGQUxTRTsKLQlVQ0hBUgkJVHNzaVJlZiwgKnBUc3NpTWludXNCb3VuZGFyeSwgKnBUc3NpUGx1c0JvdW5kYXJ5LCBUeEFnY1N0ZXA7Ci0JVUNIQVIJCUJicFIxID0gMCwgQmJwUjQ5ID0gMCwgaWR4OwotCVBDSEFSCQlwVHhBZ2NDb21wZW5zYXRlOwotCVVMT05HCQlUeFB3cls1XTsKLQlDSEFSCQlWYWx1ZTsKLQotI2lmZGVmIFJUMjg2MAotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpCi0JCXx8IChwQWQtPmJQQ0ljbGtPZmYgPT0gVFJVRSkKLQkJfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKQotCQl8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotCQlyZXR1cm47Ci0jZW5kaWYKLQotCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiAxNCkKLQkJewotCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMF07Ci0JCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsxXTsKLQkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzJdOwotCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbM107Ci0JCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFs0XTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbNF07Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLQkJewotCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMF07Ci0JCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsxXTsKLQkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzJdOwotCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbM107Ci0JCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFs0XTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbNF07Ci0JCX0KLQl9Ci0KLQkvLyBUWCBwb3dlciBjb21wZW5zYXRpb24gZm9yIHRlbXBlcmF0dXJlIHZhcmlhdGlvbiBiYXNlZCBvbiBUU1NJLiB0cnkgZXZlcnkgNCBzZWNvbmQKLQlpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSA0ID09IDApCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkKLQkJewotCQkJLyogYmcgY2hhbm5lbCAqLwotCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjRzsKLQkJCVRzc2lSZWYgICAgICAgICAgICA9IHBBZC0+VHNzaVJlZkc7Ci0JCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMF07Ci0JCQlwVHNzaVBsdXNCb3VuZGFyeSAgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1swXTsKLQkJCVR4QWdjU3RlcCAgICAgICAgICA9IHBBZC0+VHhBZ2NTdGVwRzsKLQkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUc7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvKiBhIGNoYW5uZWwgKi8KLQkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0E7Ci0JCQlUc3NpUmVmICAgICAgICAgICAgPSBwQWQtPlRzc2lSZWZBOwotCQkJcFRzc2lNaW51c0JvdW5kYXJ5ID0gJnBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzBdOwotCQkJcFRzc2lQbHVzQm91bmRhcnkgID0gJnBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMF07Ci0JCQlUeEFnY1N0ZXAgICAgICAgICAgPSBwQWQtPlR4QWdjU3RlcEE7Ci0JCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOwotCQl9Ci0KLQkJaWYgKGJBdXRvVHhBZ2MpCi0JCXsKLQkJCS8qIEJicFIxIGlzIHVuc2lnbmVkIGNoYXIgKi8KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNDksICZCYnBSNDkpOwotCi0JCQkvKiAocCkgVHNzaVBsdXNCb3VuZGFyeUdbMF0gPSAwID0gKG0pIFRzc2lNaW51c0JvdW5kYXJ5R1swXSAqLwotCQkJLyogY29tcGVuc2F0ZTogKzQgICAgICszICAgKzIgICArMSAgICAwICAgLTEgICAtMiAgIC0zICAgLTQgKiBzdGVwcyAqLwotCQkJLyogc3RlcCB2YWx1ZSBpcyBkZWZpbmVkIGluIHBBZC0+VHhBZ2NTdGVwRyBmb3IgdHggcG93ZXIgdmFsdWUgKi8KLQotCQkJLyogWzRdKzErWzRdICAgcDQgICAgIHAzICAgcDIgICBwMSAgIG8xICAgbTEgICBtMiAgIG0zICAgbTQgKi8KLQkJCS8qIGV4OiAgICAgICAgIDB4MDAgMHgxNSAweDI1IDB4NDUgMHg4OCAweEEwIDB4QjUgMHhEMCAweEYwCi0JCQkgICBhYm92ZSB2YWx1ZSBhcmUgZXhhbWluZWQgaW4gbWFzcyBmYWN0b3J5IHByb2R1Y3Rpb24gKi8KLQkJCS8qICAgICAgICAgICAgIFs0XSAgICBbM10gIFsyXSAgWzFdICBbMF0gIFsxXSAgWzJdICBbM10gIFs0XSAqLwotCi0JCQkvKiBwbHVzICgrKSBpcyAweDAwIH4gMHg0NSwgbWludXMgKC0pIGlzIDB4YTAgfiAweGYwICovCi0JCQkvKiBpZiB2YWx1ZSBpcyBiZXR3ZWVuIHAxIH4gbzEgb3IgbzEgfiBzMSwgbm8gbmVlZCB0byBhZGp1c3QgdHggcG93ZXIgKi8KLQkJCS8qIGlmIHZhbHVlIGlzIDB4YTUsIHR4IHBvd2VyIHdpbGwgYmUgLT0gVHhBZ2NTdGVwKigyLTEpICovCi0KLQkJCWlmIChCYnBSNDkgPiBwVHNzaU1pbnVzQm91bmRhcnlbMV0pCi0JCQl7Ci0JCQkJLy8gUmVhZGluZyBpcyBsYXJnZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlCi0JCQkJLy8gY2hlY2sgZm9yIGhvdyBsYXJnZSB3ZSBuZWVkIHRvIGRlY3JlYXNlIHRoZSBUeCBwb3dlcgotCQkJCWZvciAoaWR4ID0gMTsgaWR4IDwgNTsgaWR4KyspCi0JCQkJewotCQkJCQlpZiAoQmJwUjQ5IDw9IHBUc3NpTWludXNCb3VuZGFyeVtpZHhdKSAgLy8gRm91bmQgdGhlIHJhbmdlCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy8gVGhlIGluZGV4IGlzIHRoZSBzdGVwIHdlIHNob3VsZCBkZWNyZWFzZSwgaWR4ID0gMCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbXBlbnNhdGUKLQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oVHhBZ2NTdGVwICogKGlkeC0xKSk7Ci0KLQkJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9IC0lZFxuIiwKLQkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIGlkeC0xKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChCYnBSNDkgPCBwVHNzaVBsdXNCb3VuZGFyeVsxXSkKLQkJCXsKLQkJCQkvLyBSZWFkaW5nIGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlCi0JCQkJLy8gY2hlY2sgZm9yIGhvdyBsYXJnZSB3ZSBuZWVkIHRvIGluY3JlYXNlIHRoZSBUeCBwb3dlcgotCQkJCWZvciAoaWR4ID0gMTsgaWR4IDwgNTsgaWR4KyspCi0JCQkJewotCQkJCQlpZiAoQmJwUjQ5ID49IHBUc3NpUGx1c0JvdW5kYXJ5W2lkeF0pICAgLy8gRm91bmQgdGhlIHJhbmdlCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy8gVGhlIGluZGV4IGlzIHRoZSBzdGVwIHdlIHNob3VsZCBpbmNyZWFzZSwgaWR4ID0gMCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbXBlbnNhdGUKLQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IFR4QWdjU3RlcCAqIChpZHgtMSk7Ci0JCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIrKyBUeCBQb3dlciwgQkJQIFIxPSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSArJWRcbiIsCi0JCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCBpZHgtMSkpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gMDsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgICBUeCBQb3dlciwgQkJQIFI0OT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAotCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgMCkpOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQotCQl7Ci0JCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOwotCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0E7Ci0JCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOwotCQl9Ci0KLQkJaWYgKGJBdXRvVHhBZ2MpCi0JCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOwotCX0KLQotCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJicFIxKTsKLQlCYnBSMSAmPSAweEZDOwotCi0JLyogY2FsY3VsYXRlIGRlbHRhIHBvd2VyIGJhc2VkIG9uIHRoZSBwZXJjZW50YWdlIHNwZWNpZmllZCBmcm9tIFVJICovCi0JLy8gRTJQUk9NIHNldHRpbmcgaXMgY2FsaWJyYXRlZCBmb3IgbWF4aW11bSBUWCBwb3dlciAoaS5lLiAxMDAlKQotCS8vIFdlIGxvd2VyIFRYIHBvd2VyIGhlcmUgYWNjb3JkaW5nIHRvIHRoZSBwZXJjZW50YWdlIHNwZWNpZmllZCBmcm9tIFVJCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID09IDB4ZmZmZmZmZmYpICAgICAgIC8vIEFVVE8gVFggUE9XRVIgY29udHJvbAotCQk7Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5MCkgIC8vIDkxIH4gMTAwJSAmIEFVVE8sIHRyZWF0IGFzIDEwMCUgaW4gdGVybXMgb2YgbVcKLQkJOwotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gNjApICAvLyA2MSB+IDkwJSwgdHJlYXQgYXMgNzUlIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSAxOwotCXsKLQkJRGVsdGFQd3IgLT0gMTsKLQl9Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiAzMCkgIC8vIDMxIH4gNjAlLCB0cmVhdCBhcyA1MCUgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDM7Ci0JewotCQlEZWx0YVB3ciAtPSAzOwotCX0KLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDE1KSAgLy8gMTYgfiAzMCUsIHRyZWF0IGFzIDI1JSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gNjsKLQl7Ci0JCUJicFIxIHw9IDB4MDE7Ci0JfQotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOSkgICAvLyAxMCB+IDE1JSwgdHJlYXQgYXMgMTIuNSUgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDk7Ci0JewotCQlCYnBSMSB8PSAweDAxOwotCQlEZWx0YVB3ciAtPSAzOwotCX0KLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgfiA5ICUsIHRyZWF0IGFzIE1JTih+MyUpIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSAxMjsKLQl7Ci0JCUJicFIxIHw9IDB4MDI7Ci0JfQotCi0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQmJwUjEpOwotCi0JLyogcmVzZXQgZGlmZmVyZW50IG5ldyB0eCBwb3dlciBmb3IgZGlmZmVyZW50IFRYIHJhdGUgKi8KLQlmb3IoaT0wOyBpPDU7IGkrKykKLQl7Ci0JCWlmIChUeFB3cltpXSAhPSAweGZmZmZmZmZmKQotCQl7Ci0JCQlmb3IgKGo9MDsgajw4OyBqKyspCi0JCQl7Ci0JCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsgLyogMCB+IDE1ICovCi0KLQkJCQlpZiAoKFZhbHVlICsgRGVsdGFQd3IpIDwgMCkKLQkJCQl7Ci0JCQkJCVZhbHVlID0gMDsgLyogbWluICovCi0JCQkJfQotCQkJCWVsc2UgaWYgKChWYWx1ZSArIERlbHRhUHdyKSA+IDB4RikKLQkJCQl7Ci0JCQkJCVZhbHVlID0gMHhGOyAvKiBtYXggKi8KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJVmFsdWUgKz0gRGVsdGFQd3I7IC8qIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbiAqLwotCQkJCX0KLQotCQkJCS8qIGZpbGwgbmV3IHZhbHVlIHRvIENTUiBvZmZzZXQgKi8KLQkJCQlUeFB3cltpXSA9IChUeFB3cltpXSAmIH4oMHgwMDAwMDAwRiA8PCBqKjQpKSB8IChWYWx1ZSA8PCBqKjQpOwotCQkJfQotCi0JCQkvKiB3cml0ZSB0eCBwb3dlciB2YWx1ZSB0byBDU1IgKi8KLQkJCS8qIFRYX1BXUl9DRkdfMCAoOCB0eCByYXRlKSBmb3IJVFggcG93ZXIgZm9yIE9GRE0gMTJNLzE4TQotCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgT0ZETSA2TS85TQotCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLNS41TS8xMU0KLQkJCQkJCQkJCQkJVFggcG93ZXIgZm9yIENDSzFNLzJNICovCi0JCQkvKiBUWF9QV1JfQ0ZHXzEgfiBUWF9QV1JfQ0ZHXzQgKi8KLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgVHhQd3JbaV0pOwotCQl9Ci0JfQotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJcHV0IFBIWSB0byBzbGVlcCBoZXJlLCBhbmQgc2V0IG5leHQgd2FrZXVwIHRpbWVyLiBQSFkgZG9lc24ndCBub3Qgd2FrZXVwCi0JCWF1dG9tYXRpY2FsbHkuIEluc3RlYWQsIE1DVSB3aWxsIGlzc3VlIGEgVHdha2VVcEludGVycnVwdCB0byBob3N0IGFmdGVyCi0JCXRoZSB3YWtldXAgdGltZXIgdGltZW91dC4gRHJpdmVyIGhhcyB0byBpc3N1ZSBhIHNlcGFyYXRlIGNvbW1hbmQgdG8gd2FrZQotCQlQSFkgdXAuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApCi17Ci0gICAgUlQyOFhYX1NUQV9TTEVFUF9USEVOX0FVVE9fV0FLRVVQKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJQXNpY0ZvcmNlV2FrZXVwKCkgaXMgdXNlZCB3aGVuZXZlciBtYW51YWwgd2FrZXVwIGlzIHJlcXVpcmVkCi0JCUFzaWNGb3JjZVNsZWVwKCkgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIG5vdCBpbiBJTkZSQSBCU1MuIFdoZW4KLQkJaW4gSU5GUkEgQlNTLCB3ZSBzaG91bGQgdXNlIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKCkgaW5zdGVhZC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNGb3JjZVNsZWVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJQXNpY0ZvcmNlV2FrZXVwKCkgaXMgdXNlZCB3aGVuZXZlciBUd2FrZXVwIHRpbWVyIChzZXQgdmlhIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKQotCQlleHBpcmVkLgotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNGb3JjZVdha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSNpZmRlZiBSVDI4NjAKLQlJTiBVQ0hBUiAgICAJIExldmVsKQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JSU4gQk9PTEVBTiAgICBiRnJvbVR4KQotI2VuZGlmCi17Ci0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEFzaWNGb3JjZVdha2V1cCBcbiIpKTsKLSNpZmRlZiBSVDI4NjAKLSAgICBSVDI4WFhfU1RBX0ZPUkNFX1dBS0VVUChwQWQsIExldmVsKTsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotICAgIFJUMjhYWF9TVEFfRk9SQ0VfV0FLRVVQKHBBZCwgYkZyb21UeCk7Ci0jZW5kaWYKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlTZXQgTXkgQlNTSUQKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljU2V0QnNzaWQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBCc3NpZCkKLXsKLQlVTE9ORwkJICBBZGRyNDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PT09PT09PT09PT4gQXNpY1NldEJzc2lkICV4OiV4OiV4OiV4OiV4OiV4XG4iLAotCQlwQnNzaWRbMF0scEJzc2lkWzFdLHBCc3NpZFsyXSxwQnNzaWRbM10sIHBCc3NpZFs0XSxwQnNzaWRbNV0pKTsKLQotCUFkZHI0ID0gKFVMT05HKShwQnNzaWRbMF0pCQkgfAotCQkJKFVMT05HKShwQnNzaWRbMV0gPDwgOCkgIHwKLQkJCShVTE9ORykocEJzc2lkWzJdIDw8IDE2KSB8Ci0JCQkoVUxPTkcpKHBCc3NpZFszXSA8PCAyNCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0JTU0lEX0RXMCwgQWRkcjQpOwotCi0JQWRkcjQgPSAwOwotCS8vIGFsd2F5cyBvbmUgQlNTSUQgaW4gU1RBIG1vZGUKLQlBZGRyNCA9IChVTE9ORykocEJzc2lkWzRdKSB8IChVTE9ORykocEJzc2lkWzVdIDw8IDgpOwotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0JTU0lEX0RXMSwgQWRkcjQpOwotfQotCi1WT0lEIEFzaWNTZXRNY2FzdFdDKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF07Ci0JVVNIT1JUCQlvZmZzZXQ7Ci0KLQlwRW50cnktPlNzdCAgICAgICAgPSBTU1RfQVNTT0M7Ci0JcEVudHJ5LT5BaWQgICAgICAgID0gTUNBU1RfV0NJRDsJLy8gU29mdGFwIHN1cHBvcnRzIDEgQlNTSUQgYW5kIHVzZSBXQ0lEPTAgYXMgbXVsdGljYXN0IFdjaWQgaW5kZXgKLQlwRW50cnktPlBzTW9kZSAgICAgPSBQV1JfQUNUSVZFOwotCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOwotCW9mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyBCU1MwTWNhc3RfV0NJRCAqIEhXX1dDSURfRU5UUllfU0laRTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNEZWxXY2lkVGFiKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCVdjaWQpCi17Ci0JVUxPTkcJCSAgQWRkcjAgPSAweDAsIEFkZHIxID0gMHgwOwotCVVMT05HIAkJb2Zmc2V0OwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0RlbFdjaWRUYWI9PT5XY2lkID0gMHgleFxuIixXY2lkKSk7Ci0Jb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIFdjaWQgKiBIV19XQ0lEX0VOVFJZX1NJWkU7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyMCk7Ci0Jb2Zmc2V0ICs9IDQ7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyMSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljRW5hYmxlUkRHKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVRYX0xJTktfQ0ZHX1NUUlVDCVR4TGlua0NmZzsKLQlVSU5UMzIJCQkJRGF0YSA9IDA7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0xJTktfQ0ZHLCAmVHhMaW5rQ2ZnLndvcmQpOwotCVR4TGlua0NmZy5maWVsZC5UeFJER0VuID0gMTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9MSU5LX0NGRywgVHhMaW5rQ2ZnLndvcmQpOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKLQlEYXRhICAmPSAweEZGRkZGRjAwOwotCURhdGEgIHw9IDB4ODA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKLQotCS8vT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNEaXNhYmxlUkRHKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVRYX0xJTktfQ0ZHX1NUUlVDCVR4TGlua0NmZzsKLQlVSU5UMzIJCQkJRGF0YSA9IDA7Ci0KLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTElOS19DRkcsICZUeExpbmtDZmcud29yZCk7Ci0JVHhMaW5rQ2ZnLmZpZWxkLlR4UkRHRW4gPSAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOwotCi0JRGF0YSAgJj0gMHhGRkZGRkYwMDsKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0RZTkFNSUNfQkVfVFhPUF9BQ1RJVkUpCi0JCSYmIChwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk1JTU9QU0R5bmFtaWMgPT0gRkFMU0UpCi0JKQotCXsKLQkJLy8gRm9yIENXQyB0ZXN0LCBjaGFuZ2UgdHhvcCBmcm9tIDB4MzAgdG8gMHgyMCBpbiBUeEJ1cnN0IG1vZGUKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQotCQkJRGF0YSB8PSAweDIwOwotCX0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljRGlzYWJsZVN5bmMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5EaXNhYmxlIFRTRiBzeW5jaHJvbml6YXRpb25cbiIpKTsKLQotCS8vIDIwMDMtMTItMjAgZGlzYWJsZSBUU0YgYW5kIFRCVFQgd2hpbGUgTklDIGluIHBvd2VyLXNhdmluZyBoYXZlIHNpZGUgZWZmZWN0Ci0JLy8JCQkgIHRoYXQgTklDIHdpbGwgbmV2ZXIgd2FrZXMgdXAgYmVjYXVzZSBUU0Ygc3RvcHMgYW5kIG5vIG1vcmUKLQkvLwkJCSAgVEJUVCBpbnRlcnJ1cHRzCi0JcEFkLT5UYnR0VGlja0NvdW50ID0gMDsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKLQljc3IuZmllbGQuYkJlYWNvbkdlbiA9IDA7Ci0JY3NyLmZpZWxkLmJUQlRURW5hYmxlID0gMDsKLQljc3IuZmllbGQuVHNmU3luY01vZGUgPSAwOwotCWNzci5maWVsZC5iVHNmVGlja2luZyA9IDA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3Iud29yZCk7Ci0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNFbmFibGVCc3NTeW5jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+QXNpY0VuYWJsZUJzc1N5bmMoSU5GUkEgbW9kZSlcbiIpKTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOwotCi0JewotCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCi0JCWNzci5maWVsZC5iVHNmVGlja2luZyA9IDE7Ci0JCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDE7IC8vIHN5bmMgVFNGIGluIElORlJBU1RSVUNUVVJFIG1vZGUKLQkJY3NyLmZpZWxkLmJCZWFjb25HZW4gID0gMDsgLy8gZG8gTk9UIGdlbmVyYXRlIEJFQUNPTgotCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAxOwotCX0KLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JTm90ZToKLQkJQkVBQ09OIGZyYW1lIGluIHNoYXJlZCBtZW1vcnkgc2hvdWxkIGJlIGJ1aWx0IG9rIGJlZm9yZSB0aGlzIHJvdXRpbmUKLQkJY2FuIGJlIGNhbGxlZC4gT3RoZXJ3aXNlLCBhIGdhcmJhZ2UgZnJhbWUgbWF5YmUgdHJhbnNtaXR0ZWQgb3V0IGV2ZXJ5Ci0JCUJlYWNvbiBwZXJpb2QuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY0VuYWJsZUlic3NTeW5jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCUJDTl9USU1FX0NGR19TVFJVQyBjc3I5OwotCVBVQ0hBUgkJCXB0cjsKLQlVSU5UIGk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+QXNpY0VuYWJsZUlic3NTeW5jKEFESE9DIG1vZGUuIE1QRFV0b3RhbEJ5dGVDb3VudCA9ICVkKVxuIiwgcEFkLT5CZWFjb25UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudCkpOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3I5LndvcmQpOwotCWNzcjkuZmllbGQuYkJlYWNvbkdlbiA9IDA7Ci0JY3NyOS5maWVsZC5iVEJUVEVuYWJsZSA9IDA7Ci0JY3NyOS5maWVsZC5iVHNmVGlja2luZyA9IDA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3I5LndvcmQpOwotCi0jaWZkZWYgUlQyODYwCi0JLy8gbW92ZSBCRUFDT04gVFhEIGFuZCBmcmFtZSBjb250ZW50IHRvIG9uLWNoaXAgbWVtb3J5Ci0JcHRyID0gKFBVQ0hBUikmcEFkLT5CZWFjb25UeFdJOwotCWZvciAoaT0wOyBpPFRYV0lfU0laRTsgaSs9NCkgIC8vIDE2LWJ5dGUgVFhXSSBmaWVsZAotCXsKLQkJVUlOVDMyIGxvbmdwdHIgPSAgKnB0ciArICgqKHB0cisxKTw8OCkgKyAoKihwdHIrMik8PDE2KSArICgqKHB0ciszKTw8MjQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIV19CRUFDT05fQkFTRTAgKyBpLCBsb25ncHRyKTsKLQkJcHRyICs9IDQ7Ci0JfQotCi0JLy8gc3RhcnQgcmlnaHQgYWZ0ZXIgdGhlIDE2LWJ5dGUgVFhXSSBmaWVsZAotCXB0ciA9IHBBZC0+QmVhY29uQnVmOwotCWZvciAoaT0wOyBpPCBwQWQtPkJlYWNvblR4V0kuTVBEVXRvdGFsQnl0ZUNvdW50OyBpKz00KQotCXsKLQkJVUlOVDMyIGxvbmdwdHIgPSAgKnB0ciArICgqKHB0cisxKTw8OCkgKyAoKihwdHIrMik8PDE2KSArICgqKHB0ciszKTw8MjQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIV19CRUFDT05fQkFTRTAgKyBUWFdJX1NJWkUgKyBpLCBsb25ncHRyKTsKLQkJcHRyICs9NDsKLQl9Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkvLyBtb3ZlIEJFQUNPTiBUWEQgYW5kIGZyYW1lIGNvbnRlbnQgdG8gb24tY2hpcCBtZW1vcnkKLQlwdHIgPSAoUFVDSEFSKSZwQWQtPkJlYWNvblR4V0k7Ci0JZm9yIChpPTA7IGk8VFhXSV9TSVpFOyBpKz0yKSAgLy8gMTYtYnl0ZSBUWFdJIGZpZWxkCi0JewotCQlSVFVTQk11bHRpV3JpdGUocEFkLCBIV19CRUFDT05fQkFTRTAgKyBpLCBwdHIsIDIpOwotCQlwdHIgKz0gMjsKLQl9Ci0KLQkvLyBzdGFydCByaWdodCBhZnRlciB0aGUgMTYtYnl0ZSBUWFdJIGZpZWxkCi0JcHRyID0gcEFkLT5CZWFjb25CdWY7Ci0JZm9yIChpPTA7IGk8IHBBZC0+QmVhY29uVHhXSS5NUERVdG90YWxCeXRlQ291bnQ7IGkrPTIpCi0JewotCQlSVFVTQk11bHRpV3JpdGUocEFkLCBIV19CRUFDT05fQkFTRTAgKyBUWFdJX1NJWkUgKyBpLCBwdHIsIDIpOwotCQlwdHIgKz0yOwotCX0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotCS8vIHN0YXJ0IHNlbmRpbmcgQkVBQ09OCi0JY3NyOS5maWVsZC5CZWFjb25JbnRlcnZhbCA9IHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCA0OyAvLyBBU0lDIHJlZ2lzdGVyIGluIHVuaXRzIG9mIDEvMTYgVFUKLQljc3I5LmZpZWxkLmJUc2ZUaWNraW5nID0gMTsKLQljc3I5LmZpZWxkLlRzZlN5bmNNb2RlID0gMjsgLy8gc3luYyBUU0YgaW4gSUJTUyBtb2RlCi0JY3NyOS5maWVsZC5iVEJUVEVuYWJsZSA9IDE7Ci0JY3NyOS5maWVsZC5iQmVhY29uR2VuID0gMTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzcjkud29yZCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNTZXRFZGNhUGFybSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQRURDQV9QQVJNCSBwRWRjYVBhcm0pCi17Ci0JRURDQV9BQ19DRkdfU1RSVUMgICBBYzBDZmcsIEFjMUNmZywgQWMyQ2ZnLCBBYzNDZmc7Ci0JQUNfVFhPUF9DU1IwX1NUUlVDIGNzcjA7Ci0JQUNfVFhPUF9DU1IxX1NUUlVDIGNzcjE7Ci0JQUlGU05fQ1NSX1NUUlVDICAgIEFpZnNuQ3NyOwotCUNXTUlOX0NTUl9TVFJVQyAgICBDd21pbkNzcjsKLQlDV01BWF9DU1JfU1RSVUMgICAgQ3dtYXhDc3I7Ci0JaW50IGk7Ci0KLQlBYzBDZmcud29yZCA9IDA7Ci0JQWMxQ2ZnLndvcmQgPSAwOwotCUFjMkNmZy53b3JkID0gMDsKLQlBYzNDZmcud29yZCA9IDA7Ci0JaWYgKChwRWRjYVBhcm0gPT0gTlVMTCkgfHwgKHBFZGNhUGFybS0+YlZhbGlkID09IEZBTFNFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY1NldEVkY2FQYXJtXG4iKSk7Ci0JCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpOwotCQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCQl7Ci0JCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJIHx8IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0FwQ2xpKQotCQkJCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtpXSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOwotCQl9Ci0KLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkvLyAgICAgIE1BQyBSZWdpc3RlciBoYXMgYSBjb3B5IC4KLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQlpZiggcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgKQotCQl7Ci0JCQkvLyBGb3IgQ1dDIHRlc3QsIGNoYW5nZSB0eG9wIGZyb20gMHgzMCB0byAweDIwIGluIFR4QnVyc3QgbW9kZQotCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IDB4MjA7IC8vIFN1Z2dlc3QgYnkgSm9obiBmb3IgVHhCdXJzdCBpbiBIVCBNb2RlCi0JCX0KLQkJZWxzZQotCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IDA7CS8vIFFJRF9BQ19CRQotCQlBYzBDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKLQkJQWMwQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7Ci0JCUFjMENmZy5maWVsZC5BaWZzbiA9IDI7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgQWMwQ2ZnLndvcmQpOwotCi0JCUFjMUNmZy5maWVsZC5BY1R4b3AgPSAwOwkvLyBRSURfQUNfQksKLQkJQWMxQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7Ci0JCUFjMUNmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOwotCQlBYzFDZmcuZmllbGQuQWlmc24gPSAyOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMV9DRkcsIEFjMUNmZy53b3JkKTsKLQotCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQotCQl7Ci0JCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gMTkyOwkvLyBBQ19WSTogMTkyKjMydXMgfj0gNm1zCi0JCQlBYzNDZmcuZmllbGQuQWNUeG9wID0gOTY7CS8vIEFDX1ZPOiA5NiozMnVzICB+PSAzbXMKLQkJfQotCQllbHNlCi0JCXsKLQkJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSA5NjsJLy8gQUNfVkk6IDk2KjMydXMgfj0gM21zCi0JCQlBYzNDZmcuZmllbGQuQWNUeG9wID0gNDg7CS8vIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zCi0JCX0KLQkJQWMyQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7Ci0JCUFjMkNmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOwotCQlBYzJDZmcuZmllbGQuQWlmc24gPSAyOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMl9DRkcsIEFjMkNmZy53b3JkKTsKLQkJQWMzQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7Ci0JCUFjM0NmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOwotCQlBYzNDZmcuZmllbGQuQWlmc24gPSAyOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDM19DRkcsIEFjM0NmZy53b3JkKTsKLQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCS8vICAgICAgRE1BIFJlZ2lzdGVyIGhhcyBhIGNvcHkgdG9vLgotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCWNzcjAuZmllbGQuQWMwVHhvcCA9IDA7CQkvLyBRSURfQUNfQkUKLQkJY3NyMC5maWVsZC5BYzFUeG9wID0gMDsJCS8vIFFJRF9BQ19CSwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDBfQ0ZHLCBjc3IwLndvcmQpOwotCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQotCQl7Ci0JCQljc3IxLmZpZWxkLkFjMlR4b3AgPSAxOTI7CQkvLyBBQ19WSTogMTkyKjMydXMgfj0gNm1zCi0JCQljc3IxLmZpZWxkLkFjM1R4b3AgPSA5NjsJCS8vIEFDX1ZPOiA5NiozMnVzICB+PSAzbXMKLQkJfQotCQllbHNlCi0JCXsKLQkJCWNzcjEuZmllbGQuQWMyVHhvcCA9IDk2OwkJLy8gQUNfVkk6IDk2KjMydXMgfj0gM21zCi0JCQljc3IxLmZpZWxkLkFjM1R4b3AgPSA0ODsJCS8vIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zCi0JCX0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AxX0NGRywgY3NyMS53b3JkKTsKLQotCQlDd21pbkNzci53b3JkID0gMDsKLQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4wID0gQ1dfTUlOX0lOX0JJVFM7Ci0JCUN3bWluQ3NyLmZpZWxkLkN3bWluMSA9IENXX01JTl9JTl9CSVRTOwotCQlDd21pbkNzci5maWVsZC5Dd21pbjIgPSBDV19NSU5fSU5fQklUUzsKLQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4zID0gQ1dfTUlOX0lOX0JJVFM7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9DV01JTl9DRkcsIEN3bWluQ3NyLndvcmQpOwotCi0JCUN3bWF4Q3NyLndvcmQgPSAwOwotCQlDd21heENzci5maWVsZC5Dd21heDAgPSBDV19NQVhfSU5fQklUUzsKLQkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgxID0gQ1dfTUFYX0lOX0JJVFM7Ci0JCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MiA9IENXX01BWF9JTl9CSVRTOwotCQlDd21heENzci5maWVsZC5Dd21heDMgPSBDV19NQVhfSU5fQklUUzsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0NXTUFYX0NGRywgQ3dtYXhDc3Iud29yZCk7Ci0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0FJRlNOX0NGRywgMHgwMDAwMjIyMik7Ci0KLQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKLQl9Ci0JZWxzZQotCXsKLQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpOwotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCS8vICAgICAgTUFDIFJlZ2lzdGVyIGhhcyBhIGNvcHkuCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJLy8KLQkJLy8gTW9kaWZ5IEN3bWluL0N3bWF4L1R4b3Agb24gcXVldWVbUUlEX0FDX1ZJXSwgUmVjb21tZW5kIGJ5IEplcnJ5IDIwMDUvMDcvMjcKLQkJLy8gVG8gZGVncmFkZSBvdXIgVklETyBRdWV1ZSdzIHRocm91Z2hwdXQgZm9yIFdpRmkgV01NIFMzVDA3IElzc3VlLgotCQkvLwotCQkvL3BFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gKiA3IC8gMTA7IC8vIHJ0Mjg2MGMgbmVlZCB0aGlzCi0KLQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9ICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JFXTsKLQkJQWMwQ2ZnLmZpZWxkLkN3bWluPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV07Ci0JCUFjMENmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JFXTsKLQkJQWMwQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdOyAvLysxOwotCi0JCUFjMUNmZy5maWVsZC5BY1R4b3AgPSAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CS107Ci0JCUFjMUNmZy5maWVsZC5Dd21pbiA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXTsgLy8rMjsKLQkJQWMxQ2ZnLmZpZWxkLkN3bWF4ID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQktdOwotCQlBYzFDZmcuZmllbGQuQWlmc24gPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS107IC8vKzE7Ci0KLQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IChwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXSAqIDYpIC8gMTA7Ci0JCUFjMkNmZy5maWVsZC5Dd21pbiA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZJXTsKLQkJQWMyQ2ZnLmZpZWxkLkN3bWF4ID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVkldOwotCQlBYzJDZmcuZmllbGQuQWlmc24gPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV07Ci0KLQkJewotCQkJLy8gVHVuaW5nIGZvciBXaS1GaSBXTU0gUzA2Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpRmlUZXN0ICYmCi0JCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKQotCQkJCUFjMkNmZy5maWVsZC5BaWZzbiAtPSAxOwotCi0JCQkvLyBUdW5pbmcgZm9yIFRHbiBXaS1GaSA1LjIuMzIKLQkJCS8vIFNUQSBUZXN0QmVkIGNoYW5nZXMgaW4gdGhpcyBpdGVtOiBjb25uZXhhbnQgbGVnYWN5IHN0YSA9PT4gYnJvYWRjb20gMTFuIHN0YQotCQkJaWYgKFNUQV9UR05fV0lGSV9PTihwQWQpICYmCi0JCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKQotCQkJewotCQkJCUFjMENmZy5maWVsZC5BaWZzbiA9IDM7Ci0JCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IDU7Ci0JCQl9Ci0KLSNpZmRlZiBSVDI4NzAKLQkJCWlmIChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCB8fCBwQWQtPlJmSWNUeXBlID09IFJGSUNfMjAyMCkKLQkJCXsKLQkJCQkvLyBUdW5pbmcgZm9yIFdpRmkgV01NIFMzLVQwNzogY29ubmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEuCi0JCQkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gNTsKLQkJCX0KLSNlbmRpZgotCQl9Ci0KLQkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVk9dOwotCQlBYzNDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WT107Ci0JCUFjM0NmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZPXTsKLQkJQWMzQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dOwotCi0vLyNpZmRlZiBXSUZJX1RFU1QKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCkKLQkJewotCQkJaWYgKEFjM0NmZy5maWVsZC5BY1R4b3AgPT0gMTAyKQotCQkJewotCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdID8gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV0gOiAxMDsKLQkJCQlBYzBDZmcuZmllbGQuQWlmc24gID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdLTE7IC8qIEFJRlNOIG11c3QgPj0gMSAqLwotCQkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdOwotCQkJCUFjMUNmZy5maWVsZC5BaWZzbiAgPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS107Ci0JCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV07Ci0JCQl9IC8qIEVuZCBvZiBpZiAqLwotCQl9Ci0vLyNlbmRpZiAvLyBXSUZJX1RFU1QgLy8KLQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIEFjMENmZy53b3JkKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzFfQ0ZHLCBBYzFDZmcud29yZCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMyX0NGRywgQWMyQ2ZnLndvcmQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDM19DRkcsIEFjM0NmZy53b3JkKTsKLQotCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJLy8gICAgICBETUEgUmVnaXN0ZXIgaGFzIGEgY29weSB0b28uCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJY3NyMC5maWVsZC5BYzBUeG9wID0gQWMwQ2ZnLmZpZWxkLkFjVHhvcDsKLQkJY3NyMC5maWVsZC5BYzFUeG9wID0gQWMxQ2ZnLmZpZWxkLkFjVHhvcDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKLQotCQljc3IxLmZpZWxkLkFjMlR4b3AgPSBBYzJDZmcuZmllbGQuQWNUeG9wOwotCQljc3IxLmZpZWxkLkFjM1R4b3AgPSBBYzNDZmcuZmllbGQuQWNUeG9wOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IxLndvcmQpOwotCi0JCUN3bWluQ3NyLndvcmQgPSAwOwotCQlDd21pbkNzci5maWVsZC5Dd21pbjAgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV07Ci0JCUN3bWluQ3NyLmZpZWxkLkN3bWluMSA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXTsKLQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4yID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldOwotCi0JCUN3bWluQ3NyLmZpZWxkLkN3bWluMyA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZPXSAtIDE7IC8vZm9yIFRHbiB3aWZpIHRlc3QKLQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNSU5fQ0ZHLCBDd21pbkNzci53b3JkKTsKLQotCQlDd21heENzci53b3JkID0gMDsKLQkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgwID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQkVdOwotCQlDd21heENzci5maWVsZC5Dd21heDEgPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS107Ci0JCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MiA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXTsKLQkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgzID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNQVhfQ0ZHLCBDd21heENzci53b3JkKTsKLQotCQlBaWZzbkNzci53b3JkID0gMDsKLQkJQWlmc25Dc3IuZmllbGQuQWlmc24wID0gQWMwQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXTsKLQkJQWlmc25Dc3IuZmllbGQuQWlmc24xID0gQWMxQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsKLQkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gQWMyQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXTsKLQotCQl7Ci0JCQkvLyBUdW5pbmcgZm9yIFdpLUZpIFdNTSBTMDYKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QgJiYKLQkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCi0JCQkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gQWMyQ2ZnLmZpZWxkLkFpZnNuIC0gNDsKLQotCQkJLy8gVHVuaW5nIGZvciBUR24gV2ktRmkgNS4yLjMyCi0JCQkvLyBTVEEgVGVzdEJlZCBjaGFuZ2VzIGluIHRoaXMgaXRlbTogY29ubmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEKLQkJCWlmIChTVEFfVEdOX1dJRklfT04ocEFkKSAmJgotCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKLQkJCXsKLQkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjAgPSAzOwotCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IDc7Ci0JCQl9Ci0jaWZkZWYgUlQyODcwCi0JCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7Ci0jZW5kaWYKLQkJfQotCi0JCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMyA9IEFjM0NmZy5maWVsZC5BaWZzbiAtIDE7IC8vcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dOyAvL2ZvciBUR24gd2lmaSB0ZXN0Ci0jaWZkZWYgUlQyODcwCi0JCWlmIChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCB8fCBwQWQtPlJmSWNUeXBlID09IFJGSUNfMjAyMCkKLQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IDB4MjsgLy9wRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV07IC8vZm9yIFdpRmkgV01NIFM0LVQwNC4KLSNlbmRpZgotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQUlGU05fQ0ZHLCBBaWZzbkNzci53b3JkKTsKLQotCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSwgcEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7Ci0JCWlmICghQURIT0NfT04ocEFkKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJFRENBIFsjJWRdOiBBSUZTTiBDV21pbiBDV21heCAgVFhPUCh1cykgIEFDTVxuIiwgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19CRSAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bMF0sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblswXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzBdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFswXTw8NSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bMF0pKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19CSyAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bMV0sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblsxXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzFdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFsxXTw8NSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bMV0pKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19WSSAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bMl0sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblsyXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzJdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFsyXTw8NSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bMl0pKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19WTyAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bM10sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblszXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzNdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFszXTw8NSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bM10pKTsKLQkJfQotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgCUFzaWNTZXRTbG90VGltZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOIGJVc2VTaG9ydFNsb3RUaW1lKQotewotCVVMT05HCVNsb3RUaW1lOwotCVVJTlQzMglSZWdWYWx1ZSA9IDA7Ci0KLQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQotCQliVXNlU2hvcnRTbG90VGltZSA9IFRSVUU7Ci0KLQlpZiAoYlVzZVNob3J0U2xvdFRpbWUpCi0JCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7Ci0JZWxzZQotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7Ci0KLQlTbG90VGltZSA9IChiVXNlU2hvcnRTbG90VGltZSk/IDkgOiAyMDsKLQotCXsKLQkJLy8gZm9yY2UgdXNpbmcgc2hvcnQgU0xPVCB0aW1lIGZvciBGQUUgdG8gZGVtbyBwZXJmb3JtYW5jZSB3aGVuIFR4QnVyc3QgaXMgT04KLQkJaWYgKCgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpKSkKLQkJCXx8ICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPT0gQkFfTk9UVVNFKSkKLQkJCSkKLQkJewotCQkJLy8gSW4gdGhpcyBjYXNlLCB3ZSB3aWxsIHRoaW5rIGl0IGlzIGRvaW5nIFdpLUZpIHRlc3QKLQkJCS8vIEFuZCB3ZSB3aWxsIG5vdCBzZXQgdG8gc2hvcnQgc2xvdCB3aGVuIGJFbmFibGVUeEJ1cnN0IGlzIFRSVUUuCi0JCX0KLQkJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCi0JCQlTbG90VGltZSA9IDk7Ci0JfQotCi0JLy8KLQkvLyBGb3Igc29tZSByZWFzb25zLCBhbHdheXMgc2V0IGl0IHRvIHNob3J0IHNsb3QgdGltZS4KLQkvLwotCS8vIFRvRG86IFNob3VsZCBjb25zaWRlciBjYXBhYmlsaXR5IHdpdGggMTFCCi0JLy8KLQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCVNsb3RUaW1lID0gMjA7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIEJLT0ZGX1NMT1RfQ0ZHLCAmUmVnVmFsdWUpOwotCVJlZ1ZhbHVlID0gUmVnVmFsdWUgJiAweEZGRkZGRjAwOwotCi0JUmVnVmFsdWUgfD0gU2xvdFRpbWU7Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCS09GRl9TTE9UX0NGRywgUmVnVmFsdWUpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlBZGQgU2hhcmVkIGtleSBpbmZvcm1hdGlvbiBpbnRvIEFTSUMuCi0JCVVwZGF0ZSBzaGFyZWQga2V5LCBUeE1pYyBhbmQgUnhNaWMgdG8gQXNpYyBTaGFyZWQga2V5IHRhYmxlCi0JCVVwZGF0ZSBpdHMgY2lwaGVyQWxnIHRvIEFzaWMgU2hhcmVkIGtleSBNb2RlLgotCi0gICAgUmV0dXJuOgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQXNpY0FkZFNoYXJlZEtleUVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCQkgQnNzSW5kZXgsCi0JSU4gVUNIQVIJCSBLZXlJZHgsCi0JSU4gVUNIQVIJCSBDaXBoZXJBbGcsCi0JSU4gUFVDSEFSCQkgcEtleSwKLQlJTiBQVUNIQVIJCSBwVHhNaWMsCi0JSU4gUFVDSEFSCQkgcFJ4TWljKQotewotCVVMT05HIG9mZnNldDsgLy8sIGNzcjA7Ci0JU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKLSNpZmRlZiBSVDI4NjAKLQlJTlQgICBpOwotI2VuZGlmCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljQWRkU2hhcmVkS2V5RW50cnkgQnNzSW5kZXg9JWQsIEtleUlkeD0lZFxuIiwgQnNzSW5kZXgsS2V5SWR4KSk7Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGRTaGFyZWRLZXlFbnRyeTogJXMga2V5ICMlZFxuIiwgQ2lwaGVyTmFtZVtDaXBoZXJBbGddLCBCc3NJbmRleCo0ICsgS2V5SWR4KSk7Ci0JREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAJS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJcEtleVswXSxwS2V5WzFdLHBLZXlbMl0scEtleVszXSxwS2V5WzRdLHBLZXlbNV0scEtleVs2XSxwS2V5WzddLHBLZXlbOF0scEtleVs5XSxwS2V5WzEwXSxwS2V5WzExXSxwS2V5WzEyXSxwS2V5WzEzXSxwS2V5WzE0XSxwS2V5WzE1XSkpOwotCWlmIChwUnhNaWMpCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiIAlSeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJcFJ4TWljWzBdLHBSeE1pY1sxXSxwUnhNaWNbMl0scFJ4TWljWzNdLHBSeE1pY1s0XSxwUnhNaWNbNV0scFJ4TWljWzZdLHBSeE1pY1s3XSkpOwotCX0KLQlpZiAocFR4TWljKQotCXsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAJVHggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCXBUeE1pY1swXSxwVHhNaWNbMV0scFR4TWljWzJdLHBUeE1pY1szXSxwVHhNaWNbNF0scFR4TWljWzVdLHBUeE1pY1s2XSxwVHhNaWNbN10pKTsKLQl9Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JLy8KLQkvLyBmaWxsIGtleSBtYXRlcmlhbCAtIGtleSArIFRYIE1JQyArIFJYIE1JQwotCS8vCi0KLQlvZmZzZXQgPSBTSEFSRURfS0VZX1RBQkxFX0JBU0UgKyAoNCpCc3NJbmRleCArIEtleUlkeCkqSFdfS0VZX0VOVFJZX1NJWkU7Ci0jaWZkZWYgUlQyODYwCi0JZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9TSEFSRV9LRVk7IGkrKykKLQl7Ci0JCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcEtleVtpXSk7Ci0JfQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCBwS2V5LCBNQVhfTEVOX09GX1NIQVJFX0tFWSk7Ci0jZW5kaWYKLQlvZmZzZXQgKz0gTUFYX0xFTl9PRl9TSEFSRV9LRVk7Ci0JaWYgKHBUeE1pYykKLQl7Ci0jaWZkZWYgUlQyODYwCi0JCWZvciAoaT0wOyBpPDg7IGkrKykKLQkJewotCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwVHhNaWNbaV0pOwotCQl9Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCBwVHhNaWMsIDgpOwotI2VuZGlmCi0JfQotCi0Jb2Zmc2V0ICs9IDg7Ci0JaWYgKHBSeE1pYykKLQl7Ci0jaWZkZWYgUlQyODYwCi0JCWZvciAoaT0wOyBpPDg7IGkrKykKLQkJewotCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwUnhNaWNbaV0pOwotCQl9Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCBwUnhNaWMsIDgpOwotI2VuZGlmCi0JfQotCi0KLQkvLwotCS8vIFVwZGF0ZSBjaXBoZXIgYWxnb3JpdGhtLiBXU1RBIGFsd2F5cyB1c2UgQlNTMAotCS8vCi0JUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgJmNzcjEud29yZCk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSZWFkOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gS2V5SWR4WyVkXT0gMHgleCBcbiIsIEJzc0luZGV4LEtleUlkeCwgY3NyMS53b3JkKSk7Ci0JaWYgKChCc3NJbmRleCUyKSA9PSAwKQotCXsKLQkJaWYgKEtleUlkeCA9PSAwKQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQllbHNlIGlmIChLZXlJZHggPT0gMikKLQkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCWVsc2UKLQkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChLZXlJZHggPT0gMCkKLQkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCWVsc2UgaWYgKEtleUlkeCA9PSAxKQotCQkJY3NyMS5maWVsZC5Cc3MxS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCi0JCQljc3IxLmZpZWxkLkJzczFLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQllbHNlCi0JCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCX0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIldyaXRlOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gPSAweCV4IFxuIiwgQnNzSW5kZXgsIGNzcjEud29yZCkpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCBjc3IxLndvcmQpOwotCi19Ci0KLS8vCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCSBCc3NJbmRleCwKLQlJTiBVQ0hBUgkJIEtleUlkeCkKLXsKLQkvL1VMT05HIFNlY0NzcjA7Ci0JU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5OiAjJWQgXG4iLCBCc3NJbmRleCo0ICsgS2V5SWR4KSk7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCAmY3NyMS53b3JkKTsKLQlpZiAoKEJzc0luZGV4JTIpID09IDApCi0JewotCQlpZiAoS2V5SWR4ID09IDApCi0JCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gMDsKLQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gMDsKLQkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gMDsKLQkJZWxzZQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IDA7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChLZXlJZHggPT0gMCkKLQkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSAwOwotCQllbHNlIGlmIChLZXlJZHggPT0gMSkKLQkJCWNzcjEuZmllbGQuQnNzMUtleTFDaXBoZXJBbGcgPSAwOwotCQllbHNlIGlmIChLZXlJZHggPT0gMikKLQkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSAwOwotCQllbHNlCi0JCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gMDsKLQl9Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJXcml0ZTogU0hBUkVEX0tFWV9NT0RFX0JBU0UgYXQgdGhpcyBCc3NbJWRdID0gMHgleCBcbiIsIEJzc0luZGV4LCBjc3IxLndvcmQpKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgY3NyMS53b3JkKTsKLQlBU1NFUlQoQnNzSW5kZXggPCA0KTsKLQlBU1NFUlQoS2V5SWR4IDwgNCk7Ci0KLX0KLQotCi1WT0lEIEFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVAkJV0NJRCwKLQlJTiBVQ0hBUgkJQnNzSW5kZXgsCi0JSU4gVUNIQVIgICAgICAgIENpcGhlckFsZywKLQlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUpCi17Ci0JVUxPTkcgICBXQ0lEQXR0cmkgPSAwLCBvZmZzZXQ7Ci0KLQkvLwotCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZS4KLQkvLyBPbmx5IFR4S2V5IGNvdWxkIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZS4KLQkvLwotCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKFdDSUQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOwotCVdDSURBdHRyaSA9IChCc3NJbmRleCA8PCA0KSB8IChDaXBoZXJBbGcgPDwgMSkgfCAoYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Ci19Ci0KLVZPSUQgQXNpY1VwZGF0ZVdDSURJVkVJVigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQJCVdDSUQsCi0JSU4gVUxPTkcgICAgICAgIHVJViwKLQlJTiBVTE9ORyAgICAgICAgdUVJVikKLXsKLQlVTE9ORwlvZmZzZXQ7Ci0KLQlvZmZzZXQgPSBNQUNfSVZFSVZfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfSVZFSVZfRU5UUllfU0laRSk7Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIHVJVik7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgNCwgdUVJVik7Ci19Ci0KLVZPSUQgQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVAkJV0NJRCwKLQlJTiBQVUNIQVIgICAgICAgIHBBZGRyKQotewotCVVMT05HIG9mZnNldDsKLQlVTE9ORyBBZGRyOwotCi0Jb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChXQ0lEICogSFdfV0NJRF9FTlRSWV9TSVpFKTsKLQlBZGRyID0gcEFkZHJbMF0gKyAocEFkZHJbMV0gPDwgOCkgKyhwQWRkclsyXSA8PCAxNikgKyhwQWRkclszXSA8PCAyNCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyKTsKLQlBZGRyID0gcEFkZHJbNF0gKyAocEFkZHJbNV0gPDwgOCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgNCwgQWRkcik7Ci19Ci0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBDaXBoZXIgS2V5LCBDaXBoZXIgYWxnb3JpdGhtLCBJVi9FSVYgdG8gQXNpYwotCi0gICAgQXJndW1lbnRzOgotICAgICAgICBwQWQgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgICAgIFdDSUQgICAgICAgICAgICAgICAgICAgIFdDSUQgRW50cnkgbnVtYmVyLgotICAgICAgICBCc3NJbmRleCAgICAgICAgICAgICAgICBCU1NJRCBpbmRleCwgc3RhdGlvbiBvciBub25lIG11bHRpcGxlIEJTU0lEIHN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB2YWx1ZSBzaG91bGQgYmUgMC4KLSAgICAgICAgS2V5SWR4ICAgICAgICAgICAgICAgICAgVGhpcyBLZXlJZHggd2lsbCBzZXQgdG8gSVYncyBLZXlJRCBpZiBiVHhLZXkgZW5hYmxlZAotICAgICAgICBwQ2lwaGVyS2V5ICAgICAgICAgICAgICBQb2ludGVyIHRvIENpcGhlciBLZXkuCi0gICAgICAgIGJVc2VQYWlyZXdpc2VLZXlUYWJsZSAgIFRSVUUgbWVhbnMgc2F2ZWQgdGhlIGtleSBpbiBTaGFyZWRLZXkgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBQYWlyZXdpc2VLZXkgdGFibGUKLSAgICAgICAgYlR4S2V5ICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgdHJhbnNtaXQga2V5IGlmIGVuYWJsZWQuCi0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5vbmUKLQotICAgIE5vdGU6Ci0gICAgICAgIFRoaXMgcm91dGluZSB3aWxsIHNldCB0aGUgcmVsYXRpdmUga2V5IHN0dWZmIHRvIEFzaWMgaW5jbHVkaW5nIFdDSUQgYXR0cmlidXRlLAotICAgICAgICBDaXBoZXIgS2V5LCBDaXBoZXIgYWxnb3JpdGhtIGFuZCBJVi9FSVYuCi0KLSAgICAgICAgSVYvRUlWIHdpbGwgYmUgdXBkYXRlIGlmIHRoaXMgQ2lwaGVyS2V5IGlzIHRoZSB0cmFuc21pc3Npb24ga2V5IGJlY2F1c2UKLSAgICAgICAgQVNJQyB3aWxsIGJhc2Ugb24gSVYncyBLZXlJRCB2YWx1ZSB0byBzZWxlY3QgQ2lwaGVyIEtleS4KLQotICAgICAgICBJZiBiVHhLZXkgc2V0cyB0byBGQUxTRSwgdGhpcyBpcyBub3QgdGhlIFRYIGtleSwgYnV0IGl0IGNvdWxkIGJlCi0gICAgICAgIFJYIGtleQotCi0gICAgCUZvciBBUCBtb2RlIGJUeEtleSBtdXN0IGJlIGFsd2F5cyBzZXQgdG8gVFJVRS4KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFzaWNBZGRLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQJCVdDSUQsCi0JSU4gVUNIQVIJCUJzc0luZGV4LAotCUlOIFVDSEFSCQlLZXlJZHgsCi0JSU4gUENJUEhFUl9LRVkJcENpcGhlcktleSwKLQlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUsCi0JSU4gQk9PTEVBTgkJYlR4S2V5KQotewotCVVMT05HCW9mZnNldDsKLQlVQ0hBUglJVjQgPSAwOwotCVBVQ0hBUgkJcEtleSA9IHBDaXBoZXJLZXktPktleTsKLQlQVUNIQVIJCXBUeE1pYyA9IHBDaXBoZXJLZXktPlR4TWljOwotCVBVQ0hBUgkJcFJ4TWljID0gcENpcGhlcktleS0+UnhNaWM7Ci0JUFVDSEFSCQlwVHh0c2MgPSBwQ2lwaGVyS2V5LT5UeFRzYzsKLQlVQ0hBUgkJQ2lwaGVyQWxnID0gcENpcGhlcktleS0+Q2lwaGVyQWxnOwotCVNIQVJFREtFWV9NT0RFX1NUUlVDIGNzcjE7Ci0jaWZkZWYgUlQyODYwCi0JVUNIQVIJCWk7Ci0jZW5kaWYKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBBc2ljQWRkS2V5RW50cnlcbiIpKTsKLQkvLwotCS8vIDEuKSBkZWNpZGUga2V5IHRhYmxlIG9mZnNldAotCS8vCi0JaWYgKGJVc2VQYWlyZXdpc2VLZXlUYWJsZSkKLQkJb2Zmc2V0ID0gUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0tFWV9FTlRSWV9TSVpFKTsKLQllbHNlCi0JCW9mZnNldCA9IFNIQVJFRF9LRVlfVEFCTEVfQkFTRSArICg0ICogQnNzSW5kZXggKyBLZXlJZHgpICogSFdfS0VZX0VOVFJZX1NJWkU7Ci0KLQkvLwotCS8vIDIuKSBTZXQgS2V5IHRvIEFzaWMKLQkvLwotCS8vZm9yIChpID0gMDsgaSA8IEtleUxlbjsgaSsrKQotI2lmZGVmIFJUMjg2MAotCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX1BFRVJfS0VZOyBpKyspCi0JewotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBLZXlbaV0pOwotCX0KLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcEtleSwgTUFYX0xFTl9PRl9QRUVSX0tFWSk7Ci0jZW5kaWYKLQlvZmZzZXQgKz0gTUFYX0xFTl9PRl9QRUVSX0tFWTsKLQotCS8vCi0JLy8gMy4pIFNldCBNSUMga2V5IGlmIGF2YWlsYWJsZQotCS8vCi0JaWYgKHBUeE1pYykKLQl7Ci0jaWZkZWYgUlQyODYwCi0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFR4TWljW2ldKTsKLQkJfQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcFR4TWljLCA4KTsKLSNlbmRpZgotCX0KLQlvZmZzZXQgKz0gTEVOX1RLSVBfVFhNSUNLOwotCi0JaWYgKHBSeE1pYykKLQl7Ci0jaWZkZWYgUlQyODYwCi0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFJ4TWljW2ldKTsKLQkJfQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcFJ4TWljLCA4KTsKLSNlbmRpZgotCX0KLQotCi0JLy8KLQkvLyA0LikgTW9kaWZ5IElWL0VJViBpZiBuZWVkcwotCS8vICAgICBUaGlzIHdpbGwgZm9yY2UgQXNpYyB0byB1c2UgdGhpcyBrZXkgSUQgYnkgc2V0dGluZyBJVi4KLQkvLwotCWlmIChiVHhLZXkpCi0JewotI2lmZGVmIFJUMjg2MAotCQlvZmZzZXQgPSBNQUNfSVZFSVZfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfSVZFSVZfRU5UUllfU0laRSk7Ci0JCS8vCi0JCS8vIFdyaXRlIElWCi0JCS8vCi0JCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0LCBwVHh0c2NbMV0pOwotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIDEsICgocFR4dHNjWzFdIHwgMHgyMCkgJiAweDdmKSk7Ci0JCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgMiwgcFR4dHNjWzBdKTsKLQotCQlJVjQgPSAoS2V5SWR4IDw8IDYpOwotCQlpZiAoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpIHx8KENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSkKLQkJCUlWNCB8PSAweDIwOyAgLy8gdHVybiBvbiBleHRlbnNpb24gYml0IG1lYW5zIEVJViBleGlzdGVuY2UKLQotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIDMsIElWNCk7Ci0KLQkJLy8KLQkJLy8gV3JpdGUgRUlWCi0JCS8vCi0JCW9mZnNldCArPSA0OwotCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBUeHRzY1tpICsgMl0pOwotCQl9Ci0KLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQlVSU5UMzIgdG1wVmFsOwotCi0JCS8vCi0JCS8vIFdyaXRlIElWCi0JCS8vCi0JCUlWNCA9IChLZXlJZHggPDwgNik7Ci0JCWlmICgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKSB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKQotCQkJSVY0IHw9IDB4MjA7ICAvLyB0dXJuIG9uIGV4dGVuc2lvbiBiaXQgbWVhbnMgRUlWIGV4aXN0ZW5jZQotCi0JCXRtcFZhbCA9IHBUeHRzY1sxXSArICgoKHBUeHRzY1sxXSB8IDB4MjApICYgMHg3ZikgPDwgOCkgKyAocFR4dHNjWzBdIDw8IDE2KSArIChJVjQgPDwgMjQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIHRtcFZhbCk7Ci0KLQkJLy8KLQkJLy8gV3JpdGUgRUlWCi0JCS8vCi0JCW9mZnNldCArPSA0OwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsICooUFVJTlQzMikmcENpcGhlcktleS0+VHhUc2NbMl0pOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCQlBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZShwQWQsIFdDSUQsIEJzc0luZGV4LCBDaXBoZXJBbGcsIGJVc2VQYWlyZXdpc2VLZXlUYWJsZSk7Ci0JfQotCi0JaWYgKCFiVXNlUGFpcmV3aXNlS2V5VGFibGUpCi0JewotCQkvLwotCQkvLyBPbmx5IHVwZGF0ZSB0aGUgc2hhcmVkIGtleSBzZWN1cml0eSBtb2RlCi0JCS8vCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UgKyA0ICogKEJzc0luZGV4IC8gMiksICZjc3IxLndvcmQpOwotCQlpZiAoKEJzc0luZGV4ICUgMikgPT0gMCkKLQkJewotCQkJaWYgKEtleUlkeCA9PSAwKQotCQkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCQllbHNlIGlmIChLZXlJZHggPT0gMSkKLQkJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCi0JCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJCWVsc2UKLQkJCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKEtleUlkeCA9PSAwKQotCQkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCQllbHNlIGlmIChLZXlJZHggPT0gMSkKLQkJCQljc3IxLmZpZWxkLkJzczFLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCi0JCQkJY3NyMS5maWVsZC5Cc3MxS2V5MkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJCWVsc2UKLQkJCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQl9Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCAqIChCc3NJbmRleCAvIDIpLCBjc3IxLndvcmQpOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBBc2ljQWRkS2V5RW50cnlcbiIpKTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlBZGQgUGFpci13aXNlIGtleSBtYXRlcmlhbCBpbnRvIEFTSUMuCi0JCVVwZGF0ZSBwYWlyd2lzZSBrZXksIFR4TWljIGFuZCBSeE1pYyB0byBBc2ljIFBhaXItd2lzZSBrZXkgdGFibGUKLQotICAgIFJldHVybjoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIsCi0JSU4gVUNIQVIJCVdDSUQsCi0JSU4gQ0lQSEVSX0tFWQkJICpwQ2lwaGVyS2V5KQotewotCUlOVCBpOwotCVVMT05HIAkJb2Zmc2V0OwotCVBVQ0hBUgkJIHBLZXkgPSBwQ2lwaGVyS2V5LT5LZXk7Ci0JUFVDSEFSCQkgcFR4TWljID0gcENpcGhlcktleS0+VHhNaWM7Ci0JUFVDSEFSCQkgcFJ4TWljID0gcENpcGhlcktleS0+UnhNaWM7Ci0jaWZkZWYgREJHCi0JVUNIQVIJCUNpcGhlckFsZyA9IHBDaXBoZXJLZXktPkNpcGhlckFsZzsKLSNlbmRpZiAvLyBEQkcgLy8KLQotCS8vIEVLRVkKLQlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfS0VZX0VOVFJZX1NJWkUpOwotI2lmZGVmIFJUMjg2MAotCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfUEVFUl9LRVk7IGkrKykKLQl7Ci0JCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcEtleVtpXSk7Ci0JfQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCAmcENpcGhlcktleS0+S2V5WzBdLCBNQVhfTEVOX09GX1BFRVJfS0VZKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX1BFRVJfS0VZOyBpKz00KQotCXsKLQkJVUlOVDMyIFZhbHVlOwotCQlSVE1QX0lPX1JFQUQzMihwQWQsIG9mZnNldCArIGksICZWYWx1ZSk7Ci0JfQotCi0Jb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfUEVFUl9LRVk7Ci0KLQkvLyAgTUlDIEtFWQotCWlmIChwVHhNaWMpCi0JewotI2lmZGVmIFJUMjg2MAotCQlmb3IgKGk9MDsgaTw4OyBpKyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0K2ksIHBUeE1pY1tpXSk7Ci0JCX0KLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsICZwQ2lwaGVyS2V5LT5UeE1pY1swXSwgOCk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0JfQotCW9mZnNldCArPSA4OwotCWlmIChwUnhNaWMpCi0JewotI2lmZGVmIFJUMjg2MAotCQlmb3IgKGk9MDsgaTw4OyBpKyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0K2ksIHBSeE1pY1tpXSk7Ci0JCX0KLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsICZwQ2lwaGVyS2V5LT5SeE1pY1swXSwgOCk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRkUGFpcndpc2VLZXlFbnRyeTogV0NJRCAjJWQgQWxnPSVzXG4iLFdDSUQsIENpcGhlck5hbWVbQ2lwaGVyQWxnXSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiCUtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCXBLZXlbMF0scEtleVsxXSxwS2V5WzJdLHBLZXlbM10scEtleVs0XSxwS2V5WzVdLHBLZXlbNl0scEtleVs3XSxwS2V5WzhdLHBLZXlbOV0scEtleVsxMF0scEtleVsxMV0scEtleVsxMl0scEtleVsxM10scEtleVsxNF0scEtleVsxNV0pKTsKLQlpZiAocFJ4TWljKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCVJ4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQlwUnhNaWNbMF0scFJ4TWljWzFdLHBSeE1pY1syXSxwUnhNaWNbM10scFJ4TWljWzRdLHBSeE1pY1s1XSxwUnhNaWNbNl0scFJ4TWljWzddKSk7Ci0JfQotCWlmIChwVHhNaWMpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIJVHggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCXBUeE1pY1swXSxwVHhNaWNbMV0scFR4TWljWzJdLHBUeE1pY1szXSxwVHhNaWNbNF0scFR4TWljWzVdLHBUeE1pY1s2XSxwVHhNaWNbN10pKTsKLQl9Ci19Ci0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlSZW1vdmUgUGFpci13aXNlIGtleSBtYXRlcmlhbCBmcm9tIEFTSUMuCi0KLSAgICBSZXR1cm46Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJIEJzc0lkeCwKLQlJTiBVQ0hBUgkJIFdjaWQpCi17Ci0JVUxPTkcJCVdDSURBdHRyaTsKLQlVU0hPUlQJCW9mZnNldDsKLQotCS8vIHJlLXNldCB0aGUgZW50cnkncyBXQ0lEIGF0dHJpYnV0ZSBhcyBPUEVOLU5PTkUuCi0Jb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoV2NpZCAqIEhXX1dDSURfQVRUUklfU0laRSk7Ci0JV0NJREF0dHJpID0gKEJzc0lkeDw8NCkgfCBQQUlSV0lTRUtFWVRBQkxFOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKLX0KLQotQk9PTEVBTiBBc2ljU2VuZENvbW1hbmRUb01jdSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJIENvbW1hbmQsCi0JSU4gVUNIQVIJCSBUb2tlbiwKLQlJTiBVQ0hBUgkJIEFyZzAsCi0JSU4gVUNIQVIJCSBBcmcxKQotewotCUhPU1RfQ01EX0NTUl9TVFJVQwlIMk1DbWQ7Ci0JSDJNX01BSUxCT1hfU1RSVUMJSDJNTWFpbGJveDsKLQlVTE9ORwkJCQlpID0gMDsKLQotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgJkgyTU1haWxib3gud29yZCk7Ci0JCWlmIChIMk1NYWlsYm94LmZpZWxkLk93bmVyID09IDApCi0JCQlicmVhazsKLQotCQlSVE1QdXNlY0RlbGF5KDIpOwotCX0gd2hpbGUoaSsrIDwgMTAwKTsKLQotCWlmIChpID4gMTAwKQotCXsKLQkJewotI2lmZGVmIFJUMjg2MAotCQkJVUlOVDMyIERhdGE7Ci0KLQkJCS8vIFJlc2V0IERNQQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBQQkZfU1lTX0NUUkwsICZEYXRhKTsKLQkJCURhdGEgfD0gMHgyOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCBEYXRhKTsKLQotCQkJLy8gQWZ0ZXIgUmVzZXQgRE1BLCBETUEgaW5kZXggd2lsbCBiZWNvbWUgWmVyby4gU28gRHJpdmVyIG5lZWQgdG8gcmVzZXQgYWxsIHJpbmcgaW5kZXhzIHRvby4KLQkJCS8vIFJlc2V0IERNQS9DUFUgcmluZyBpbmRleAotCQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKLQkJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CRSk7Ci0JCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOwotCQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKLQkJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9IQ0NBKTsKLQkJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKLQkJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9SWCk7Ci0KLQkJCS8vIENsZWFyIFJlc2V0Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFBCRl9TWVNfQ1RSTCwgJkRhdGEpOwotCQkJRGF0YSAmPSAweGZmZmZmZmZkOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCBEYXRhKTsKLSNlbmRpZiAvKiBSVDI4NjAgKi8KLQkJREJHUFJJTlRfRVJSKCgiSDJNX01BSUxCT1ggc3RpbGwgaG9sZCBieSBNQ1UuIGNvbW1hbmQgZmFpbFxuIikpOwotCQl9Ci0JCS8vcmV0dXJuIEZBTFNFOwotI2lmZGVmIFJUMjg3MAotCQlyZXR1cm4gRkFMU0U7Ci0jZW5kaWYKLQl9Ci0KLQlIMk1NYWlsYm94LmZpZWxkLk93bmVyCSAgPSAxOwkgICAvLyBwYXNzIG93bmVyc2hpcCB0byBNQ1UKLQlIMk1NYWlsYm94LmZpZWxkLkNtZFRva2VuID0gVG9rZW47Ci0JSDJNTWFpbGJveC5maWVsZC5IaWdoQnl0ZSA9IEFyZzE7Ci0JSDJNTWFpbGJveC5maWVsZC5Mb3dCeXRlICA9IEFyZzA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCBIMk1NYWlsYm94LndvcmQpOwotCi0JSDJNQ21kLndvcmQgCQkJICA9IDA7Ci0JSDJNQ21kLmZpZWxkLkhvc3RDb21tYW5kICA9IENvbW1hbmQ7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSE9TVF9DTURfQ1NSLCBIMk1DbWQud29yZCk7Ci0KLQlpZiAoQ29tbWFuZCAhPSAweDgwKQotCXsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotI2lmZGVmIFJUMjg2MAotQk9PTEVBTiBBc2ljQ2hlY2tDb21tYW5PaygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJIENvbW1hbmQpCi17Ci0JVUlOVDMyCUNtZFN0YXR1cyA9IDAsIENJRCA9IDAsIGk7Ci0JVUlOVDMyCVRoaXNDSURNYXNrID0gMDsKLQotCWkgPSAwOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgJkNJRCk7Ci0JCS8vIEZpbmQgd2hlcmUgdGhlIGNvbW1hbmQgaXMuIEJlY2F1c2UgdGhpcyBpcyByYW5kb21seSBzcGVjaWZpZWQgYnkgZmlybXdhcmUuCi0JCWlmICgoQ0lEICYgQ0lEME1BU0spID09IENvbW1hbmQpCi0JCXsKLQkJCVRoaXNDSURNYXNrID0gQ0lEME1BU0s7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlIGlmICgoKChDSUQgJiBDSUQxTUFTSyk+PjgpICYgMHhmZikgPT0gQ29tbWFuZCkKLQkJewotCQkJVGhpc0NJRE1hc2sgPSBDSUQxTUFTSzsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UgaWYgKCgoKENJRCAmIENJRDJNQVNLKT4+MTYpICYgMHhmZikgPT0gQ29tbWFuZCkKLQkJewotCQkJVGhpc0NJRE1hc2sgPSBDSUQyTUFTSzsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UgaWYgKCgoKENJRCAmIENJRDNNQVNLKT4+MjQpICYgMHhmZikgPT0gQ29tbWFuZCkKLQkJewotCQkJVGhpc0NJRE1hc2sgPSBDSUQzTUFTSzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJUlRNUHVzZWNEZWxheSgxMDApOwotCQlpKys7Ci0JfXdoaWxlIChpIDwgMjAwKTsKLQotCS8vIEdldCBDb21tYW5kU3RhdHVzIFZhbHVlCi0JUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fTUFJTEJPWF9TVEFUVVMsICZDbWRTdGF0dXMpOwotCi0JLy8gVGhpcyBjb21tYW5kJ3Mgc3RhdHVzIGlzIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGFzIGNvbW1hbmQuIFNvIEFORCBjb21tYW5kIHBvc2l0aW9uJ3MgYml0bWFzayB0byByZWFkIHN0YXR1cy4KLQlpZiAoaSA8IDIwMCkKLQl7Ci0JCS8vIElmIFN0YXR1cyBpcyAxLCB0aGUgY29tYW1uZCBpcyBzdWNjZXNzLgotCQlpZiAoKChDbWRTdGF0dXMgJiBUaGlzQ0lETWFzaykgPT0gMHgxKSB8fCAoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEwMCkKLQkJCXx8ICgoQ21kU3RhdHVzICYgVGhpc0NJRE1hc2spID09IDB4MTAwMDApIHx8ICgoQ21kU3RhdHVzICYgVGhpc0NJRE1hc2spID09IDB4MTAwMDAwMCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBBc2ljQ2hlY2tDb21tYW5PayBDSUQgPSAweCV4LCBDbWRTdGF0dXM9IDB4JXggXG4iLCBDSUQsIENtZFN0YXR1cykpOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfU1RBVFVTLCAweGZmZmZmZmZmKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgMHhmZmZmZmZmZik7Ci0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gQXNpY0NoZWNrQ29tbWFuRmFpbDEgQ0lEID0gMHgleCwgQ21kU3RhdHVzPSAweCV4IFxuIiwgQ0lELCBDbWRTdGF0dXMpKTsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEFzaWNDaGVja0NvbW1hbkZhaWwyIFRpbWVvdXQgQ29tbWFuZCA9ICVkLCBDbWRTdGF0dXM9IDB4JXggXG4iLCBDb21tYW5kLCBDbWRTdGF0dXMpKTsKLQl9Ci0JLy8gQ2xlYXIgQ29tbWFuZCBhbmQgU3RhdHVzLgotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX1NUQVRVUywgMHhmZmZmZmZmZik7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ0lELCAweGZmZmZmZmZmKTsKLQotCXJldHVybiBGQUxTRTsKLX0KLSNlbmRpZiAvKiBSVDgyNjAgKi8KLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtNzY2MiwxMyArNTI0NCwxMSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVE1QQ2hlY2tSYXRlcygKLQlJTgkJUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gT1VUCVVDSEFSCQkJU3VwUmF0ZVtdLAotCUlOIE9VVAlVQ0hBUgkJCSpTdXBSYXRlTGVuKQordm9pZCBSVE1QQ2hlY2tSYXRlcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICBJTiB1OCBTdXBSYXRlW10sIElOIHU4ICogU3VwUmF0ZUxlbikKIHsKLQlVQ0hBUglSYXRlSWR4LCBpLCBqOwotCVVDSEFSCU5ld1JhdGVbMTJdLCBOZXdSYXRlTGVuOworCXU4IFJhdGVJZHgsIGksIGo7CisJdTggTmV3UmF0ZVsxMl0sIE5ld1JhdGVMZW47CiAKIAlOZXdSYXRlTGVuID0gMDsKIApAQCAtNzY3Nyw3ICs1MjU3LDcgQEAKIAllbHNlCiAJCVJhdGVJZHggPSAxMjsKIAotCS8vIENoZWNrIGZvciBzdXBwb3J0IHJhdGVzIGV4Y2x1ZGUgYmFzaWMgcmF0ZSBiaXQKKwkvKiBDaGVjayBmb3Igc3VwcG9ydCByYXRlcyBleGNsdWRlIGJhc2ljIHJhdGUgYml0ICovCiAJZm9yIChpID0gMDsgaSA8ICpTdXBSYXRlTGVuOyBpKyspCiAJCWZvciAoaiA9IDA7IGogPCBSYXRlSWR4OyBqKyspCiAJCQlpZiAoKFN1cFJhdGVbaV0gJiAweDdmKSA9PSBSYXRlSWRUbzUwMEticHNbal0pCkBAIC03Njg3LDQzICs1MjY3LDM3IEBACiAJTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgTmV3UmF0ZSwgTmV3UmF0ZUxlbik7CiB9CiAKLUJPT0xFQU4gUlRNUENoZWNrQ2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJQ2VudHJhbENoYW5uZWwsCi0JSU4gVUNIQVIJCUNoYW5uZWwpCitCT09MRUFOIFJUTVBDaGVja0NoYW5uZWwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHU4IENlbnRyYWxDaGFubmVsLCB1OCBDaGFubmVsKQogewotCVVDSEFSCQlrOwotCVVDSEFSCQlVcHBlckNoYW5uZWwgPSAwLCBMb3dlckNoYW5uZWwgPSAwOwotCVVDSEFSCQlOb0VmZmVjdENoYW5uZWxpbkxpc3QgPSAwOworCXU4IGs7CisJdTggVXBwZXJDaGFubmVsID0gMCwgTG93ZXJDaGFubmVsID0gMDsKKwl1OCBOb0VmZmVjdENoYW5uZWxpbkxpc3QgPSAwOwogCi0JLy8gRmluZCB1cHBlciBhbmQgbG93ZXIgY2hhbm5lbCBhY2NvcmRpbmcgdG8gNDBNSHogY3VycmVudCBvcGVyYXRpb24uCi0JaWYgKENlbnRyYWxDaGFubmVsIDwgQ2hhbm5lbCkKLQl7CisJLyogRmluZCB1cHBlciBhbmQgbG93ZXIgY2hhbm5lbCBhY2NvcmRpbmcgdG8gNDBNSHogY3VycmVudCBvcGVyYXRpb24uICovCisJaWYgKENlbnRyYWxDaGFubmVsIDwgQ2hhbm5lbCkgewogCQlVcHBlckNoYW5uZWwgPSBDaGFubmVsOwogCQlpZiAoQ2VudHJhbENoYW5uZWwgPiAyKQogCQkJTG93ZXJDaGFubmVsID0gQ2VudHJhbENoYW5uZWwgLSAyOwogCQllbHNlCiAJCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWVsc2UgaWYgKENlbnRyYWxDaGFubmVsID4gQ2hhbm5lbCkKLQl7CisJfSBlbHNlIGlmIChDZW50cmFsQ2hhbm5lbCA+IENoYW5uZWwpIHsKIAkJVXBwZXJDaGFubmVsID0gQ2VudHJhbENoYW5uZWwgKyAyOwogCQlMb3dlckNoYW5uZWwgPSBDaGFubmVsOwogCX0KIAotCWZvciAoayA9IDA7ayA8IHBBZC0+Q2hhbm5lbExpc3ROdW07aysrKQotCXsKLQkJaWYgKHBBZC0+Q2hhbm5lbExpc3Rba10uQ2hhbm5lbCA9PSBVcHBlckNoYW5uZWwpCi0JCXsKLQkJCU5vRWZmZWN0Q2hhbm5lbGluTGlzdCArKzsKKwlmb3IgKGsgPSAwOyBrIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaysrKSB7CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2tdLkNoYW5uZWwgPT0gVXBwZXJDaGFubmVsKSB7CisJCQlOb0VmZmVjdENoYW5uZWxpbkxpc3QrKzsKIAkJfQotCQlpZiAocEFkLT5DaGFubmVsTGlzdFtrXS5DaGFubmVsID09IExvd2VyQ2hhbm5lbCkKLQkJewotCQkJTm9FZmZlY3RDaGFubmVsaW5MaXN0ICsrOworCQlpZiAocEFkLT5DaGFubmVsTGlzdFtrXS5DaGFubmVsID09IExvd2VyQ2hhbm5lbCkgeworCQkJTm9FZmZlY3RDaGFubmVsaW5MaXN0Kys7CiAJCX0KIAl9CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlRvdGFsIENoYW5uZWwgaW4gQ2hhbm5lbCBMaXN0ID0gWyVkXVxuIiwgTm9FZmZlY3RDaGFubmVsaW5MaXN0KSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlRvdGFsIENoYW5uZWwgaW4gQ2hhbm5lbCBMaXN0ID0gWyVkXVxuIiwKKwkJICBOb0VmZmVjdENoYW5uZWxpbkxpc3QpKTsKIAlpZiAoTm9FZmZlY3RDaGFubmVsaW5MaXN0ID09IDIpCiAJCXJldHVybiBUUlVFOwogCWVsc2UKQEAgLTc3NDYsODggKzUzMjAsMTE0IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1CT09MRUFOIAlSVE1QQ2hlY2tIdCgKLQlJTglQUlRNUF9BREFQVEVSCQkJcEFkLAotCUlOCVVDSEFSCQkJCQlXY2lkLAotCUlOIAlIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKLQlJTiAJQUREX0hUX0lORk9fSUUJCQkqcEFkZEh0SW5mbykKK0JPT0xFQU4gUlRNUENoZWNrSHQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgdTggV2NpZCwKKwkJICAgIHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llICogcEh0Q2FwYWJpbGl0eSwKKwkJICAgIHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSAqIHBBZGRIdEluZm8pCiB7CiAJaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCiAJCXJldHVybiBGQUxTRTsKIAotCS8vIElmIHVzZSBBTVNEVSwgc2V0IGZsYWcuCisJLyogSWYgdXNlIEFNU0RVLCBzZXQgZmxhZy4gKi8KIAlpZiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlKQotCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpOwotCS8vIFNhdmUgUGVlciBDYXBhYmlsaXR5CisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sCisJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCk7CisJLyogU2F2ZSBQZWVyIENhcGFiaWxpdHkgKi8KIAlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKLQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7CisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sCisJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOwogCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQotCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKKwkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwKKwkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7CiAJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5UeFNUQkMpCi0JCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFKTsKKwkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwKKwkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOwogCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDKQotCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7Ci0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCi0JewotCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sCisJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKKwlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkgeworCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLAorCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CiAJfQogCi0JaWYgKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQl7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uTXBkdURlbnNpdHkgPSBwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJaWYgKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkgeworCQlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLk1wZHVEZW5zaXR5ID0KKwkJICAgIHBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKIAl9Ci0KLQkvLyBXaWxsIGNoZWNrIENoYW5uZWxXaWR0aCBmb3IgTUNTU2V0WzRdIGJlbG93CisJLyogV2lsbCBjaGVjayBDaGFubmVsV2lkdGggZm9yIE1DU1NldFs0XSBiZWxvdyAqLwogCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzRdID0gMHgxOwotICAgIHN3aXRjaCAocEFkLT5Db21tb25DZmcuUnhTdHJlYW0pCi0JewotCQljYXNlIDE6Ci0JCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7Ci0JCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4MDA7Ci0gICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9IDB4MDA7Ci0gICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFszXSA9IDB4MDA7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOwotCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweGZmOwotICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0gPSAweDAwOwotICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10gPSAweDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKLQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHhmZjsKLSAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gMHhmZjsKLSAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzNdID0gMHgwMDsKLQkJCWJyZWFrOworCXN3aXRjaCAocEFkLT5Db21tb25DZmcuUnhTdHJlYW0pIHsKKwljYXNlIDE6CisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweDAwOworCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9IDB4MDA7CisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzNdID0gMHgwMDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7CisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHhmZjsKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0gPSAweDAwOworCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFszXSA9IDB4MDA7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOworCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4ZmY7CisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gMHhmZjsKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10gPSAweDAwOworCQlicmVhazsKIAl9CiAKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPSBwQWRkSHRJbmZvLT5BZGRIdEluZm8uUmVjb21XaWR0aCAmIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGg7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0KKwkgICAgcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGggJiBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuCisJICAgIENoYW5uZWxXaWR0aDsKIAotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBDaGVja0h0OjogSHRDYXBJbmZvLkNoYW5uZWxXaWR0aD0lZCwgUmVjb21XaWR0aD0lZCwgRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aD0lZCwgQlc0ME1BdmFpbEZvckEvRz0lZC8lZCwgUGh5TW9kZT0lZCBcbiIsCi0JCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCwgcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGgsIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgsCi0JCXBBZC0+TmljQ29uZmlnMi5maWVsZC5CVzQwTUF2YWlsRm9yQSwgcEFkLT5OaWNDb25maWcyLmZpZWxkLkJXNDBNQXZhaWxGb3JHLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlJUTVBDaGVja0h0OjogSHRDYXBJbmZvLkNoYW5uZWxXaWR0aD0lZCwgUmVjb21XaWR0aD0lZCwgRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aD0lZCwgQlc0ME1BdmFpbEZvckEvRz0lZC8lZCwgUGh5TW9kZT0lZCBcbiIsCisJCSAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoLAorCQkgIHBBZGRIdEluZm8tPkFkZEh0SW5mby5SZWNvbVdpZHRoLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgsCisJCSAgcEFkLT5OaWNDb25maWcyLmZpZWxkLkJXNDBNQXZhaWxGb3JBLAorCQkgIHBBZC0+TmljQ29uZmlnMi5maWVsZC5CVzQwTUF2YWlsRm9yRywKKwkJICBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7CiAKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRiA9ICBwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YgJnBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRjsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRiA9CisJICAgIHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5HRiAmIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRjsKIAotCS8vIFNlbmQgQXNzb2MgUmVxIHdpdGggbXkgSFQgY2FwYWJpbGl0eS4KLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZTsKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QczsKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjAgPSAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApICYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApOwotCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9ICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkgJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCk7Ci0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlJ4U1RCQyk7Ci0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuUnhTVEJDKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQyk7Ci0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yID0gcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvcjsKLSAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7Ci0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5QbHVzSFRDOwotCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlBsdXNIVEM7Ci0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcpCi0JewotCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQ7Ci0gICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPSAxOworCS8qIFNlbmQgQXNzb2MgUmVxIHdpdGggbXkgSFQgY2FwYWJpbGl0eS4gKi8KKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPQorCSAgICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9CisJICAgIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHM7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwID0KKwkgICAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApICYgKHBIdENhcGFiaWxpdHktPgorCQkJCQkJCSAgSHRDYXBJbmZvLgorCQkJCQkJCSAgU2hvcnRHSWZvcjIwKTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDAgPQorCSAgICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkgJiAocEh0Q2FwYWJpbGl0eS0+CisJCQkJCQkJICBIdENhcEluZm8uCisJCQkJCQkJICBTaG9ydEdJZm9yNDApOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQyA9CisJICAgIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSAmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uCisJCQkJCQkgICAgUnhTVEJDKTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgPQorCSAgICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlJ4U1RCQykgJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLgorCQkJCQkJICAgIFR4U1RCQyk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yID0KKwkgICAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvcjsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9CisJICAgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9CisJICAgIHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5QbHVzSFRDOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0KKwkgICAgcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlBsdXNIVEM7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcpIHsKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCA9CisJCSAgICBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUkRHU3VwcG9ydDsKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IDE7CiAJfQogCi0gICAgaWYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV18yMCkKLSAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0gPSAweDA7ICAvLyBCVzIwIGNhbid0IHRyYW5zbWl0IE1DUzMyCisJaWYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV18yMCkKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0gPSAweDA7CS8qIEJXMjAgY2FuJ3QgdHJhbnNtaXQgTUNTMzIgKi8KIAogCUNPUFlfQVBfSFRTRVRUSU5HU19GUk9NX0JFQUNPTihwQWQsIHBIdENhcGFiaWxpdHkpOwogCXJldHVybiBUUlVFOwpAQCAtNzg0OSw2NSArNTQ0OSw2MCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBSVE1QVXBkYXRlTWxtZVJhdGUoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUTVBVcGRhdGVNbG1lUmF0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JVUNIQVIJTWluaW11bVJhdGU7Ci0JVUNIQVIJUHJvcGVyTWxtZVJhdGU7IC8vPSBSQVRFXzU0OwotCVVDSEFSCWksIGosIFJhdGVJZHggPSAxMjsgLy8xLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0Ci0JQk9PTEVBTgliTWF0Y2ggPSBGQUxTRTsKKwl1OCBNaW5pbXVtUmF0ZTsKKwl1OCBQcm9wZXJNbG1lUmF0ZTsJLyo9IFJBVEVfNTQ7ICovCisJdTggaSwgaiwgUmF0ZUlkeCA9IDEyOwkvKjEsIDIsIDUuNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQgKi8KKwlCT09MRUFOIGJNYXRjaCA9IEZBTFNFOwogCi0Jc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKQotCXsKLQkJY2FzZSBQSFlfMTFCOgorCXN3aXRjaCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSkgeworCWNhc2UgUEhZXzExQjoKKwkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzExOworCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJYnJlYWs7CisJY2FzZSBQSFlfMTFCR19NSVhFRDoKKwljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisJY2FzZSBQSFlfMTFCR05fTUlYRUQ6CisJCWlmICgocEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4gPT0gNCkgJiYKKwkJICAgIChwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiA9PSAwKSkKKwkJCS8qIEIgb25seSBBUCAqLwogCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzExOwotCQkJTWluaW11bVJhdGUgPSBSQVRFXzE7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFCR19NSVhFRDoKLQkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgotCQljYXNlIFBIWV8xMUJHTl9NSVhFRDoKLQkJCWlmICgocEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4gPT0gNCkgJiYKLQkJCQkocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPT0gMCkpCi0JCQkJLy8gQiBvbmx5IEFQCi0JCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzExOwotCQkJZWxzZQotCQkJCVByb3Blck1sbWVSYXRlID0gUkFURV8yNDsKKwkJZWxzZQorCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzI0OwogCi0JCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpCi0JCQkJTWluaW11bVJhdGUgPSBSQVRFXzE7Ci0JCQllbHNlCi0JCQkJTWluaW11bVJhdGUgPSBSQVRFXzY7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFBOgotCQljYXNlIFBIWV8xMU5fMl80RzoJLy8gcnQyODYwIG5lZWQgdG8gY2hlY2sgbWxtZXJhdGUgZm9yIDgwMi4xMW4KLQkJY2FzZSBQSFlfMTFHTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6Ci0JCWNhc2UgUEhZXzExQU5fTUlYRUQ6Ci0JCWNhc2UgUEhZXzExTl81RzoKLQkJCVByb3Blck1sbWVSYXRlID0gUkFURV8yNDsKLQkJCU1pbmltdW1SYXRlID0gUkFURV82OwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQUJHX01JWEVEOgotCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzI0OwotCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsIDw9IDE0KQotCQkJICAgTWluaW11bVJhdGUgPSBSQVRFXzE7Ci0JCQllbHNlCi0JCQkJTWluaW11bVJhdGUgPSBSQVRFXzY7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDogLy8gZXJyb3IKLQkJCVByb3Blck1sbWVSYXRlID0gUkFURV8xOworCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpCiAJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKLQkJCWJyZWFrOworCQllbHNlCisJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKKwkJYnJlYWs7CisJY2FzZSBQSFlfMTFBOgorCWNhc2UgUEhZXzExTl8yXzRHOgkvKiBydDI4NjAgbmVlZCB0byBjaGVjayBtbG1lcmF0ZSBmb3IgODAyLjExbiAqLworCWNhc2UgUEhZXzExR05fTUlYRUQ6CisJY2FzZSBQSFlfMTFBR05fTUlYRUQ6CisJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKwljYXNlIFBIWV8xMU5fNUc6CisJCVByb3Blck1sbWVSYXRlID0gUkFURV8yNDsKKwkJTWluaW11bVJhdGUgPSBSQVRFXzY7CisJCWJyZWFrOworCWNhc2UgUEhZXzExQUJHX01JWEVEOgorCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7CisJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkKKwkJCU1pbmltdW1SYXRlID0gUkFURV8xOworCQllbHNlCisJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKKwkJYnJlYWs7CisJZGVmYXVsdDoJCS8qIGVycm9yICovCisJCVByb3Blck1sbWVSYXRlID0gUkFURV8xOworCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJYnJlYWs7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuOyBpKyspCi0JewotCQlmb3IgKGogPSAwOyBqIDwgUmF0ZUlkeDsgaisrKQotCQl7Ci0JCQlpZiAoKHBBZC0+TWxtZUF1eC5TdXBSYXRlW2ldICYgMHg3ZikgPT0gUmF0ZUlkVG81MDBLYnBzW2pdKQotCQkJewotCQkJCWlmIChqID09IFByb3Blck1sbWVSYXRlKQotCQkJCXsKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW47IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgUmF0ZUlkeDsgaisrKSB7CisJCQlpZiAoKHBBZC0+TWxtZUF1eC5TdXBSYXRlW2ldICYgMHg3ZikgPT0KKwkJCSAgICBSYXRlSWRUbzUwMEticHNbal0pIHsKKwkJCQlpZiAoaiA9PSBQcm9wZXJNbG1lUmF0ZSkgewogCQkJCQliTWF0Y2ggPSBUUlVFOwogCQkJCQlicmVhazsKIAkJCQl9CkBAIC03OTE4LDE2ICs1NTEzLDEyIEBACiAJCQlicmVhazsKIAl9CiAKLQlpZiAoYk1hdGNoID09IEZBTFNFKQotCXsKLQkJZm9yIChpID0gMDsgaSA8IHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuOyBpKyspCi0JCXsKLQkJCWZvciAoaiA9IDA7IGogPCBSYXRlSWR4OyBqKyspCi0JCQl7Ci0JCQkJaWYgKChwQWQtPk1sbWVBdXguRXh0UmF0ZVtpXSAmIDB4N2YpID09IFJhdGVJZFRvNTAwS2Jwc1tqXSkKLQkJCQl7Ci0JCQkJCWlmIChqID09IFByb3Blck1sbWVSYXRlKQotCQkJCQl7CisJaWYgKGJNYXRjaCA9PSBGQUxTRSkgeworCQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW47IGkrKykgeworCQkJZm9yIChqID0gMDsgaiA8IFJhdGVJZHg7IGorKykgeworCQkJCWlmICgocEFkLT5NbG1lQXV4LkV4dFJhdGVbaV0gJiAweDdmKSA9PQorCQkJCSAgICBSYXRlSWRUbzUwMEticHNbal0pIHsKKwkJCQkJaWYgKGogPT0gUHJvcGVyTWxtZVJhdGUpIHsKIAkJCQkJCWJNYXRjaCA9IFRSVUU7CiAJCQkJCQlicmVhazsKIAkJCQkJfQpAQCAtNzkzOSw1MSArNTUzMCw0OCBAQAogCQl9CiAJfQogCi0JaWYgKGJNYXRjaCA9PSBGQUxTRSkKLQl7CisJaWYgKGJNYXRjaCA9PSBGQUxTRSkgewogCQlQcm9wZXJNbG1lUmF0ZSA9IE1pbmltdW1SYXRlOwogCX0KIAogCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gTWluaW11bVJhdGU7CiAJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFByb3Blck1sbWVSYXRlOwotCWlmIChwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA+PSBSQVRFXzYpCi0JeworCWlmIChwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA+PSBSQVRFXzYpIHsKIAkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOwotCX0KLQllbHNlCi0JeworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0KKwkJICAgIE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPQorCQkgICAgTU9ERV9PRkRNOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0KKwkJICAgIE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwl9IGVsc2UgewogCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwogCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPQorCQkgICAgTU9ERV9DQ0s7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPQorCQkgICAgcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CiAJfQogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFVwZGF0ZU1sbWVSYXRlID09PiAgIE1sbWVUcmFuc21pdCA9IDB4JXggIFxuIiAsIHBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC53b3JkKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlJUTVBVcGRhdGVNbG1lUmF0ZSA9PT4gICBNbG1lVHJhbnNtaXQgPSAweCV4ICBcbiIsCisJCSAgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQpKTsKIH0KIAotQ0hBUiBSVE1QTWF4UnNzaSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBDSEFSCQkJCVJzc2kwLAotCUlOIENIQVIJCQkJUnNzaTEsCi0JSU4gQ0hBUgkJCQlSc3NpMikKK2NoYXIgUlRNUE1heFJzc2koc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgY2hhciBSc3NpMCwgY2hhciBSc3NpMSwgY2hhciBSc3NpMikKIHsKLQlDSEFSCWxhcmdlciA9IC0xMjc7CisJY2hhciBsYXJnZXIgPSAtMTI3OwogCi0JaWYgKChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpICYmIChSc3NpMCAhPSAwKSkKLQl7CisJaWYgKChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpICYmIChSc3NpMCAhPSAwKSkgewogCQlsYXJnZXIgPSBSc3NpMDsKIAl9CiAKLQlpZiAoKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMikgJiYgKFJzc2kxICE9IDApKQotCXsKKwlpZiAoKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMikgJiYgKFJzc2kxICE9IDApKSB7CiAJCWxhcmdlciA9IG1heChSc3NpMCwgUnNzaTEpOwogCX0KIAotCWlmICgocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKSAmJiAoUnNzaTIgIT0gMCkpCi0JeworCWlmICgocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKSAmJiAoUnNzaTIgIT0gMCkpIHsKIAkJbGFyZ2VyID0gbWF4KGxhcmdlciwgUnNzaTIpOwogCX0KIApAQCAtNzk5Myw1NiArNTU4MSw2IEBACiAJcmV0dXJuIGxhcmdlcjsKIH0KIAotI2lmZGVmIFJUMjg3MAotLy8gQW50ZW5uYSBkaXZlc2l0eSB1c2UgR1BJTzMgYW5kIEVFU0sgcGluIGZvciBjb250cm9sCi0vLyBBbnRlbm5hIGFuZCBFRVBST00gYWNjZXNzIGFyZSBib3RoIHVzaW5nIEVFU0sgcGluLAotLy8gVGhlcmVmb3Igd2Ugc2hvdWxkIGF2b2lkIGFjY2Vzc2luZyBFRVNLIGF0IHRoZSBzYW1lIHRpbWUKLS8vIFRoZW4gcmVzdG9yZSBhbnRlbm5hIGFmdGVyIEVFUFJPTSBhY2Nlc3MKLVZPSUQgQXNpY1NldFJ4QW50KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJQW50KQotewotCVVJTlQzMglWYWx1ZTsKLQlVSU5UMzIJeDsKLQotCWlmICgocEFkLT5FZXByb21BY2Nlc3MpCQkJCQkJCQkJCXx8Ci0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKQl8fAotCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQl8fAotCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCQkJfHwKLQkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JewotCQlyZXR1cm47Ci0JfQotCi0JLy8gdGhlIGFudGVubmEgc2VsZWN0aW9uIGlzIHRocm91Z2ggZmlybXdhcmUgYW5kIE1BQyByZWdpc3RlcihHUElPMykKLQlpZiAoQW50ID09IDApCi0JewotCQkvLyBNYWluIGFudGVubmEKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0JCXggfD0gKEVFU0spOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZWYWx1ZSk7Ci0JCVZhbHVlICY9IH4oMHgwODA4KTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgR1BJT19DVFJMX0NGRywgVmFsdWUpOwotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1NldFJ4QW50LCBzd2l0Y2ggdG8gbWFpbiBhbnRlbm5hXG4iKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIEF1eCBhbnRlbm5hCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCQl4ICY9IH4oRUVTSyk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJlZhbHVlKTsKLQkJVmFsdWUgJj0gfigweDA4MDgpOwotCQlWYWx1ZSB8PSAweDA4OwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCBWYWx1ZSk7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBc2ljU2V0UnhBbnQsIHN3aXRjaCB0byBhdXggYW50ZW5uYVxuIikpOwotCX0KLX0KLSNlbmRpZgotCiAvKgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CkBAIC04MDU2LDkxICs1NTk0LDcwIEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIEFzaWNFdmFsdWF0ZVJ4QW50KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBBc2ljRXZhbHVhdGVSeEFudChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JVUNIQVIJQkJQUjMgPSAwOworCXU4IEJCUFIzID0gMDsKIAogCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAotCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8Ci0JCQkJZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAotCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCB8Ci0JCQkJZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykKLQkJCQl8fCBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpCi0jaWZkZWYgUlQyODcwCi0JCQkJfHwgKHBBZC0+RWVwcm9tQWNjZXNzKQotI2VuZGlmCi0JCQkJKQotCQkJcmV0dXJuOwotCisJCQkgICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJICAgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJICAgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwKKwkJCSAgIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpIHx8CisJICAgIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkKICNpZmRlZiBSVDMweHgKLQkvLyB0d28gYW50ZW5uYSBzZWxlY3Rpb24gbWVjaGFuaXNtLSBvbmUgaXMgYW50ZW5uYSBkaXZlcnNpdHksIHRoZSBvdGhlciBpcyBmYWlsZWQgYW50ZW5uYSByZW1vdmUKLQkvLyBvbmUgaXMgYW50ZW5uYSBkaXZlcnNpdHk6dGhlcmUgaXMgb25seSBvbmUgYW50ZW5uYSBjYW4gcnggYW5kIHR4Ci0JLy8gdGhlIG90aGVyIGlzIGZhaWxlZCBhbnRlbm5hIHJlbW92ZTp0d28gcGh5c2ljYWwgYW50ZW5uYSBjYW4gcnggYW5kIHR4Ci0JaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpCisJICAgIHx8IChwQWQtPkVlcHJvbUFjY2VzcykKKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKyNpZmRlZiBSVDMwOTAKKwkgICAgfHwgKHBBZC0+YlBDSWNsa09mZiA9PSBUUlVFKQorI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworCSAgICApCisJCXJldHVybjsKKwogCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBbnREaXYgLSBiZWZvcmUgZXZhbHVhdGUgUGFpcjEtQW50ICglZCwlZClcbiIsCi0JCQlwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50LCBwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQpKTsKKwkJLyppZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAqLworCQkvKiAgICAgIHJldHVybjsgKi8KIAotCQlBc2ljU2V0UnhBbnQocEFkLCBwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQpOwotCi0JCXBBZC0+UnhBbnQuRXZhbHVhdGVQZXJpb2QgPSAxOyAvLyAxOk1lYW5zIHN3aXRjaCB0byBTZWNvbmRhcnlSeEFudCwgMDpNZWFucyBzd2l0Y2ggdG8gUGFpcjFQcmltYXJ5UnhBbnQKLQkJcEFkLT5SeEFudC5GaXJzdFBrdEFycml2ZWRXaGVuRXZhbHVhdGUgPSBGQUxTRTsKLQkJcEFkLT5SeEFudC5SY3ZQa3ROdW1XaGVuRXZhbHVhdGUgPSAwOwotCi0JCS8vIGEgb25lLXNob3QgdGltZXIgdG8gZW5kIHRoZSBldmFsdXRpb24KLQkJLy8gZHluYW1pYyBhZGp1c3QgYW50ZW5uYSBldmFsdWF0aW9uIHBlcmlvZCBhY2NvcmRpbmcgdG8gdGhlIHRyYWZmaWMKLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLCAxMDApOwotCQllbHNlCi0JCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwgMzAwKTsKLQl9Ci0JZWxzZQotI2VuZGlmCi0JewotCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQotCQkJcmV0dXJuOwotCi0JCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUFIzKTsKLQkJQkJQUjMgJj0gKH4weDE4KTsKLQkJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQogCQl7Ci0JCQlCQlBSMyB8PSAoMHgxMCk7Ci0JCX0KLQkJZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCi0JCXsKLQkJCUJCUFIzIHw9ICgweDgpOwotCQl9Ci0JCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCQl7Ci0JCQlCQlBSMyB8PSAoMHgwKTsKLQkJfQotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBSMyk7CiAKLSNpZmRlZiBSVDI4NjAKLQkJcEFkLT5TdGFDZmcuQkJQUjMgPSBCQlBSMzsKLSNlbmRpZgorCQkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKKwkJCQlyZXR1cm47CisKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUFIzKTsKKwkJCUJCUFIzICY9ICh+MHgxOCk7CisJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKSB7CisJCQkJQkJQUjMgfD0gKDB4MTApOworCQkJfSBlbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpIHsKKwkJCQlCQlBSMyB8PSAoMHg4KTsKKwkJCX0gZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKSB7CisJCQkJQkJQUjMgfD0gKDB4MCk7CisJCQl9CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBSMyk7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJCQlwQWQtPlN0YUNmZy5CQlBSMyA9IEJCUFIzOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRworCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQorCQkJICAgICkgeworCQkJCXVuc2lnbmVkIGxvbmcgVHhUb3RhbENudCA9CisJCQkJICAgIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJICAgIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCSAgICBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OworCisJCQkJLyogZHluYW1pYyBhZGp1c3QgYW50ZW5uYSBldmFsdWF0aW9uIHBlcmlvZCBhY2NvcmRpbmcgdG8gdGhlIHRyYWZmaWMgKi8KKwkJCQlpZiAoVHhUb3RhbENudCA+IDUwKSB7CisJCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLAorCQkJCQkJICAgICAyMCk7CisJCQkJCXBBZC0+TWxtZS5iTG93VGhyb3VnaHB1dCA9IEZBTFNFOworCQkJCX0gZWxzZSB7CisJCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLAorCQkJCQkJICAgICAzMDApOworCQkJCQlwQWQtPk1sbWUuYkxvd1Rocm91Z2hwdXQgPSBUUlVFOworCQkJCX0KKwkJCX0KKwkJfQorCiAJfQogCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQotCQkpCi0JewotCQlVTE9ORwlUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKLQkJCQkJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCi0JCQkJCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7Ci0KLQkJCS8vIGR5bmFtaWMgYWRqdXN0IGFudGVubmEgZXZhbHVhdGlvbiBwZXJpb2QgYWNjb3JkaW5nIHRvIHRoZSB0cmFmZmljCi0JCWlmIChUeFRvdGFsQ250ID4gNTApCi0JCXsKLQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLCAyMCk7Ci0JCQlwQWQtPk1sbWUuYkxvd1Rocm91Z2hwdXQgPSBGQUxTRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLCAzMDApOwotCQkJcEFkLT5NbG1lLmJMb3dUaHJvdWdocHV0ID0gVFJVRTsKLQkJfQotCX0KIH0KIAogLyoKQEAgLTgxNTYsOTAgKzU2NzMsNTQgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgQXNpY1J4QW50RXZhbFRpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQordm9pZCBBc2ljUnhBbnRFdmFsVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCQkgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJCSAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpCiB7Ci0JUlRNUF9BREFQVEVSCSpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OwotCVVDSEFSCQkJQkJQUjMgPSAwOwotCUNIQVIJCQlsYXJnZXIgPSAtMTI3LCByc3NpMCwgcnNzaTEsIHJzc2kyOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OworCXU4IEJCUFIzID0gMDsKKwljaGFyIGxhcmdlciA9IC0xMjcsIHJzc2kwLCByc3NpMSwgcnNzaTI7CiAKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTCXwKLQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MJfAotCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGCQkJfAotCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkKLQkJCQkJCQl8fCBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpCi0jaWZkZWYgUlQyODcwCi0JCQkJCQkJfHwgKHBBZC0+RWVwcm9tQWNjZXNzKQotI2VuZGlmCi0JCQkJCQkJKQorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCSAgIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKKwkJCSAgIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkgfHwKKwkgICAgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKQorI2lmZGVmIFJUMzB4eAorCSAgICB8fCAocEFkLT5FZXByb21BY2Nlc3MpCisjZW5kaWYgLyogUlQzMHh4IC8vICovCisjaWZkZWYgUlQzMDkwCisJICAgIHx8IChwQWQtPmJQQ0ljbGtPZmYgPT0gVFJVRSkKKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KKwkgICAgKQogCQlyZXR1cm47CiAKIAl7Ci0jaWZkZWYgUlQzMHh4Ci0JCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuQW50RGl2ZXJzaXR5KQotCQl7Ci0JCQlpZiAoKHBBZC0+UnhBbnQuUmN2UGt0TnVtV2hlbkV2YWx1YXRlICE9IDApICYmIChwQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnRdID49IHBBZC0+UnhBbnQuUGFpcjFBdmdSc3NpW3BBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnRdKSkKLQkJCXsKLQkJCQlVQ0hBUgkJCXRlbXA7Ci0KLQkJCQkvLwotCQkJCS8vIHNlbGVjdCBQcmltYXJ5UnhBbnRQYWlyCi0JCQkJLy8gICAgUm9sZSBjaGFuZ2UsIFVzZWQgUGFpcjFTZWNvbmRhcnlSeEFudCBhcyBQcmltYXJ5UnhBbnRQYWlyLgotCQkJCS8vICAgIFNpbmNlIFBhaXIxU2Vjb25kYXJ5UnhBbnQgUXVhbGl0eSBnb29kIHRoYW4gUGFpcjFQcmltYXJ5UnhBbnQKLQkJCQkvLwotCQkJCXRlbXAgPSBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50OwotCQkJCXBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQgPSBwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQ7Ci0JCQkJcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50ID0gdGVtcDsKLQotCQkJCXBBZC0+UnhBbnQuUGFpcjFMYXN0QXZnUnNzaSA9IChwQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnRdID4+IDMpOwotCQkJCXBBZC0+UnhBbnQuRXZhbHVhdGVTdGFibGVDbnQgPSAwOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIGlmIHRoZSBldmFsdWF0ZWQgYW50ZW5uYSBpcyBub3QgYmV0dGVyIHRoYW4gb3JpZ2luYWwsIHN3aXRjaCBiYWNrIHRvIG9yaWdpbmFsIGFudGVubmEKLQkJCQlBc2ljU2V0UnhBbnQocEFkLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50KTsKLQkJCQlwQWQtPlJ4QW50LkV2YWx1YXRlU3RhYmxlQ250ICsrOwotCQkJfQotCi0JCQlwQWQtPlJ4QW50LkV2YWx1YXRlUGVyaW9kID0gMDsgLy8gMTpNZWFucyBzd2l0Y2ggdG8gU2Vjb25kYXJ5UnhBbnQsIDA6TWVhbnMgc3dpdGNoIHRvIFBhaXIxUHJpbWFyeVJ4QW50Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY1J4QW50RXZhbEFjdGlvbjo6QWZ0ZXIgRXZhbChmaXggaW4gIyVkKSwgPCVkLCAlZD4sIFJjdlBrdE51bVdoZW5FdmFsdWF0ZT0lbGRcbiIsCi0JCQkJCXBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQsIChwQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVswXSA+PiAzKSwgKHBBZC0+UnhBbnQuUGFpcjFBdmdSc3NpWzFdID4+IDMpLCBwQWQtPlJ4QW50LlJjdlBrdE51bVdoZW5FdmFsdWF0ZSkpOwotCQl9Ci0JCWVsc2UKLSNlbmRpZgorCQkvKmlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpICovCisJCS8qICAgICAgcmV0dXJuOyAqLwogCQl7CiAJCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQogCQkJCXJldHVybjsKIAotCQkJLy8gaWYgdGhlIHRyYWZmaWMgaXMgbG93LCB1c2UgYXZlcmFnZSByc3NpIGFzIHRoZSBjcml0ZXJpYQotCQkJaWYgKHBBZC0+TWxtZS5iTG93VGhyb3VnaHB1dCA9PSBUUlVFKQotCQkJeworCQkJLyogaWYgdGhlIHRyYWZmaWMgaXMgbG93LCB1c2UgYXZlcmFnZSByc3NpIGFzIHRoZSBjcml0ZXJpYSAqLworCQkJaWYgKHBBZC0+TWxtZS5iTG93VGhyb3VnaHB1dCA9PSBUUlVFKSB7CiAJCQkJcnNzaTAgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMDsKIAkJCQlyc3NpMSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxOwogCQkJCXJzc2kyID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTI7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7CisJCQl9IGVsc2UgewogCQkJCXJzc2kwID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMDsKIAkJCQlyc3NpMSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTE7CiAJCQkJcnNzaTIgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyOwogCQkJfQogCi0JCQlpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCi0JCQl7CisJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKSB7CiAJCQkJbGFyZ2VyID0gbWF4KHJzc2kwLCByc3NpMSk7CiAKIAkJCQlpZiAobGFyZ2VyID4gKHJzc2kyICsgMjApKQogCQkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDI7CiAJCQkJZWxzZQogCQkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDM7Ci0JCQl9Ci0JCQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKLQkJCXsKKwkJCX0gZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKSB7CiAJCQkJaWYgKHJzc2kwID4gKHJzc2kxICsgMjApKQogCQkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDE7CiAJCQkJZWxzZQpAQCAtODI0OCwzOSArNTcyOSw0NSBAQAogCiAJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBSMyk7CiAJCQlCQlBSMyAmPSAofjB4MTgpOwotCQkJaWYocEFkLT5NbG1lLlJlYWxSeFBhdGggPT0gMykKLQkJCXsKKwkJCWlmIChwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9PSAzKSB7CiAJCQkJQkJQUjMgfD0gKDB4MTApOwotCQkJfQotCQkJZWxzZSBpZihwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9PSAyKQotCQkJeworCQkJfSBlbHNlIGlmIChwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9PSAyKSB7CiAJCQkJQkJQUjMgfD0gKDB4OCk7Ci0JCQl9Ci0JCQllbHNlIGlmKHBBZC0+TWxtZS5SZWFsUnhQYXRoID09IDEpCi0JCQl7CisJCQl9IGVsc2UgaWYgKHBBZC0+TWxtZS5SZWFsUnhQYXRoID09IDEpIHsKIAkJCQlCQlBSMyB8PSAoMHgwKTsKIAkJCX0KIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJCUFIzKTsKLSNpZmRlZiBSVDI4NjAKKyNpZmRlZiBSVE1QX01BQ19QQ0kKIAkJCXBBZC0+U3RhQ2ZnLkJCUFIzID0gQkJQUjM7Ci0jZW5kaWYKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAkJfQogCX0KKwogfQogCi1WT0lEIEFQU0RQZXJpb2RpY0V4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQordm9pZCBBUFNEUGVyaW9kaWNFeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMykKIHsKLQlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CiAKIAlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKIAkJcmV0dXJuOwogCiAJcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQrKzsKIAorLyogRHJpdmVyIHNob3VsZCBub3Qgc2VuZCB0cmlnZ2VyIGZyYW1lLCBpdCBzaG91bGQgYmUgc2VuZCBieSBhcHBsaWNhdGlvbiBsYXllciAqLworLyoKKwlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlCisJCSYmIChwQWQtPkNvbW1vbkNmZy5iTmVlZFNlbmRUcmlnZ2VyRnJhbWUgfHwKKwkJKCgocEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQlMjApID09IDE5KSAmJiAoIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8pKSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNlbmRpbmcgdHJpZ2dlciBmcmFtZSBhbmQgZW50ZXIgc2VydmljZSBwZXJpb2Qgd2hlbiBzdXBwb3J0IEFQU0RcbiIpKTsKKwkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOworCQlwQWQtPkNvbW1vbkNmZy5iTmVlZFNlbmRUcmlnZ2VyRnJhbWUgPSBGQUxTRTsKKwkJcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5iSW5TZXJ2aWNlUGVyaW9kID0gVFJVRTsKKwl9Ki8KIH0KIAogLyoKQEAgLTgyOTcsMTEgKzU3ODQsOSBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBSVE1QU2V0UGlnZ3lCYWNrKAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIEJPT0xFQU4gICAgICAgICAgYlBpZ2d5QmFjaykKK3ZvaWQgUlRNUFNldFBpZ2d5QmFjayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYlBpZ2d5QmFjaykKIHsKLQlUWF9MSU5LX0NGR19TVFJVQyAgVHhMaW5rQ2ZnOworCVRYX0xJTktfQ0ZHX1NUUlVDIFR4TGlua0NmZzsKIAogCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTElOS19DRkcsICZUeExpbmtDZmcud29yZCk7CiAKQEAgLTgzMjQsMzYgKzU4MDksMzIgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLUJPT0xFQU4gUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaCgKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSkKK0JPT0xFQU4gUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSkKIHsKLQlCT09MRUFOCQlyZXN1bHQgPSBUUlVFOworCUJPT0xFQU4gcmVzdWx0ID0gVFJVRTsKIAogCXsKLQkJLy8gb25seSBhc3NvY2lhdGVkIFNUQSBjb3VudHMKLQkJaWYgKHBFbnRyeSAmJiAocEVudHJ5LT5WYWxpZEFzQ0xJKSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKLQkJeworCQkvKiBvbmx5IGFzc29jaWF0ZWQgU1RBIGNvdW50cyAqLworCQlpZiAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNDTEkpCisJCSAgICAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkgewogCQkJcmVzdWx0ID0gcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2g7Ci0JCX0KLQkJZWxzZQorCQl9IGVsc2UKIAkJCXJlc3VsdCA9IEZBTFNFOwogCX0KIAogCXJldHVybiByZXN1bHQ7CiB9CiAKLQotQk9PTEVBTiBSVE1QQXV0b1JhdGVTd2l0Y2hDaGVjaygKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCkKK0JPT0xFQU4gUlRNUEF1dG9SYXRlU3dpdGNoQ2hlY2soc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCkKLQkJcmV0dXJuIFRSVUU7Ci0KKwl7CisJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCkKKwkJCXJldHVybiBUUlVFOworCX0KIAlyZXR1cm4gRkFMU0U7CiB9CiAKLQogLyoKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgpAQCAtODM2OSwxMyArNTg1MCwxNSBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVUNIQVIgUlRNUFN0YUZpeGVkVHhNb2RlKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KQordTggUlRNUFN0YUZpeGVkVHhNb2RlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5KQogewotCVVDSEFSCXR4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7CisJdTggdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKIAotCXR4X21vZGUgPSAoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZTsKKwl7CisJCXR4X21vZGUgPQorCQkgICAgKHU4KXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuCisJCSAgICBGaXhlZFR4TW9kZTsKKwl9CiAKIAlyZXR1cm4gdHhfbW9kZTsKIH0KQEAgLTgzOTUsOSArNTg3OCw3IEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIFJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoCi0JCVVDSEFSCQkJCWZpeGVkX3R4X21vZGUsCi0JCVBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KQordm9pZCBSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKHU4IGZpeGVkX3R4X21vZGUsIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSkKIHsKIAlIVFRSQU5TTUlUX1NFVFRJTkcgVHJhbnNtaXRTZXR0aW5nOwogCkBAIC04NDA5LDI2ICs1ODkwLDI0IEBACiAJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1PREUgPSBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFOwogCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1M7CiAKLQlpZiAoZml4ZWRfdHhfbW9kZSA9PSBGSVhFRF9UWE1PREVfQ0NLKQotCXsKKwlpZiAoZml4ZWRfdHhfbW9kZSA9PSBGSVhFRF9UWE1PREVfQ0NLKSB7CiAJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCS8vIENDSyBtb2RlIGFsbG93IE1DUyAwfjMKKwkJLyogQ0NLIG1vZGUgYWxsb3cgTUNTIDB+MyAqLwogCQlpZiAoVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA+IE1DU18zKQogCQkJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18zOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkvLyBPRkRNIG1vZGUgYWxsb3cgTUNTIDB+NworCQkvKiBPRkRNIG1vZGUgYWxsb3cgTUNTIDB+NyAqLwogCQlpZiAoVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA+IE1DU183KQogCQkJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU183OwogCX0KIAotCWlmIChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IFRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFKQotCXsKKwlpZiAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBUcmFuc21pdFNldHRpbmcuZmllbGQuTU9ERSkgewogCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gVHJhbnNtaXRTZXR0aW5nLndvcmQ7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcgOiB3Y2lkLSVkLCBNT0RFPSVzLCBNQ1M9JWQgXG4iLAotCQkJCXBFbnRyeS0+QWlkLCBHZXRQaHlNb2RlKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUpLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nIDogd2NpZC0lZCwgTU9ERT0lcywgTUNTPSVkIFxuIiwKKwkJCSAgcEVudHJ5LT5BaWQsIEdldFBoeU1vZGUocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSksCisJCQkgIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUykpOwogCX0KIH0KIApAQCAtODQ0MiwzODEgKzU5MjEsMTUwIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEFzaWNTdGFCYnBUdW5pbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIEFzaWNTdGFCYnBUdW5pbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVVDSEFSCU9yaWdSNjZWYWx1ZSA9IDAsIFI2NjsvLywgUjY2VXBwZXJCb3VuZCA9IDB4MzAsIFI2Nkxvd2VyQm91bmQgPSAweDMwOwotCUNIQVIJUnNzaTsKKwl1OCBPcmlnUjY2VmFsdWUgPSAwLCBSNjY7CS8qLCBSNjZVcHBlckJvdW5kID0gMHgzMCwgUjY2TG93ZXJCb3VuZCA9IDB4MzA7ICovCisJY2hhciBSc3NpOwogCi0JLy8gMjg2MEMgZGlkIG5vdCBzdXBwb3J0IEZhc2UgQ0NBLCB0aGVyZWZvcmUgY2FuJ3QgdHVuZQorCS8qIDI4NjBDIGRpZCBub3Qgc3VwcG9ydCBGYXNlIENDQSwgdGhlcmVmb3JlIGNhbid0IHR1bmUgKi8KIAlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCiAJCXJldHVybjsKIAotCS8vCi0JLy8gd29yayBhcyBhIFNUQQotCS8vCi0JaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKSAgLy8gbm8gUjY2IHR1bmluZyB3aGVuIFNDQU5OSU5HCisJLyogKi8KKwkvKiB3b3JrIGFzIGEgU1RBICovCisJLyogKi8KKwlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCS8qIG5vIFI2NiB0dW5pbmcgd2hlbiBTQ0FOTklORyAqLwogCQlyZXR1cm47CiAKIAlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0JCSYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkKLQkJCSkKLQkJJiYgIShPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotI2lmZGVmIFJUMjg2MAotCQkmJiAocEFkLT5iUENJY2xrT2ZmID09IEZBTFNFKSkKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkpCi0jZW5kaWYKLQl7CisJICAgICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkKKwkgICAgKQorCSAgICAmJiAhKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisjaWZkZWYgUlRNUF9NQUNfUENJCisJICAgICYmIChwQWQtPmJQQ0ljbGtPZmYgPT0gRkFMU0UpCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisJICAgICkgewogCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmT3JpZ1I2NlZhbHVlKTsKIAkJUjY2ID0gT3JpZ1I2NlZhbHVlOwogCiAJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID4gMSkKLQkJCVJzc2kgPSAocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCArIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEpID4+IDE7CisJCQlSc3NpID0KKwkJCSAgICAocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCArCisJCQkgICAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEpID4+IDE7CiAJCWVsc2UKIAkJCVJzc2kgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwOwogCi0JCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCi0JCXsJLy9CRyBiYW5kCi0jaWZkZWYgUlQyODcwCi0JCQkvLyBSVDMwNzAgaXMgYSBubyBMTkEgc29sdXRpb24sIGl0IHNob3VsZCBoYXZlIGRpZmZlcmVudCBjb250cm9sIHJlZ2FyZGluZyB0byBBR0MgZ2FpbiBjb250cm9sCi0JCQkvLyBPdGhlcndpc2UsIGl0IHdpbGwgaGF2ZSBzb21lIHRocm91Z2hwdXQgc2lkZSBlZmZlY3Qgd2hlbiBsb3cgUlNTSQotCQkJaWYgKElTX1JUMzB4eChwQWQpKQotCQkJewotCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkKLQkJCQl7Ci0JCQkJCVI2NiA9IDB4MUMgKyAyKkdFVF9MTkFfR0FJTihwQWQpICsgMHgyMDsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkgewkvKkJHIGJhbmQgKi8KKyNpZmRlZiBSVDMweHgKKwkJCS8qIFJUMzA3MCBpcyBhIG5vIExOQSBzb2x1dGlvbiwgaXQgc2hvdWxkIGhhdmUgZGlmZmVyZW50IGNvbnRyb2wgcmVnYXJkaW5nIHRvIEFHQyBnYWluIGNvbnRyb2wgKi8KKwkJCS8qIE90aGVyd2lzZSwgaXQgd2lsbCBoYXZlIHNvbWUgdGhyb3VnaHB1dCBzaWRlIGVmZmVjdCB3aGVuIGxvdyBSU1NJICovCisKKwkJCWlmIChJU19SVDMwNzAocEFkKSB8fCBJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKQorCQkJICAgIHx8IElTX1JUMzM5MChwQWQpKSB7CisJCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKSB7CisJCQkJCVI2NiA9CisJCQkJCSAgICAweDFDICsgMiAqIEdFVF9MTkFfR0FJTihwQWQpICsgMHgyMDsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpIHsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQKKwkJCQkJCSAgICAocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJUjY2ID0gMHgxQyArIDIgKiBHRVRfTE5BX0dBSU4ocEFkKTsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpIHsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQKKwkJCQkJCSAgICAocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CiAJCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVI2NiA9IDB4MUMgKyAyKkdFVF9MTkFfR0FJTihwQWQpOwotCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJCX0gZWxzZQorI2VuZGlmIC8qIFJUMzB4eCAvLyAqLwogCQkJewotCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkKLQkJCQl7CisJCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKSB7CiAJCQkJCVI2NiA9ICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpICsgMHgxMDsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikgeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRAorCQkJCQkJICAgIChwQWQsIEJCUF9SNjYsIFI2Nik7CiAJCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKKwkJCQl9IGVsc2UgewogCQkJCQlSNjYgPSAweDJFICsgR0VUX0xOQV9HQUlOKHBBZCk7Ci0JCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQotCQkJCQl7Ci0JCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpIHsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQKKwkJCQkJCSAgICAocEFkLCBCQlBfUjY2LCBSNjYpOwogCQkJCQl9CiAJCQkJfQogCQkJfQotCQl9Ci0JCWVsc2UKLQkJewkvL0EgYmFuZAotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV18yMCkKLQkJCXsKLQkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCi0JCQkJewotCQkJCQlSNjYgPSAweDMyICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMgKyAweDEwOwotCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKLQkJCQkJewotCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCX0gZWxzZSB7CS8qQSBiYW5kICovCisJCQlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzIwKSB7CisJCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKSB7CisJCQkJCVI2NiA9CisJCQkJCSAgICAweDMyICsgKEdFVF9MTkFfR0FJTihwQWQpICogNSkgLyAzICsKKwkJCQkJICAgIDB4MTA7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KSB7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lECisJCQkJCQkgICAgKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCVI2NiA9CisJCQkJCSAgICAweDMyICsgKEdFVF9MTkFfR0FJTihwQWQpICogNSkgLyAzOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikgeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRAorCQkJCQkJICAgIChwQWQsIEJCUF9SNjYsIFI2Nik7CiAJCQkJCX0KIAkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJUjY2ID0gMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zOwotCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKLQkJCQkJewotCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQl9IGVsc2UgeworCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkgeworCQkJCQlSNjYgPQorCQkJCQkgICAgMHgzQSArIChHRVRfTE5BX0dBSU4ocEFkKSAqIDUpIC8gMyArCisJCQkJCSAgICAweDEwOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikgeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRAorCQkJCQkJICAgIChwQWQsIEJCUF9SNjYsIFI2Nik7CiAJCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKQotCQkJCXsKLQkJCQkJUjY2ID0gMHgzQSArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zICsgMHgxMDsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVI2NiA9IDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMzsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCX0gZWxzZSB7CisJCQkJCVI2NiA9CisJCQkJCSAgICAweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpICogNSkgLyAzOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikgeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRAorCQkJCQkJICAgIChwQWQsIEJCUF9SNjYsIFI2Nik7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KIAotCiAJfQogfQogCi0jaWZkZWYgUlQyODYwCi1WT0lEIEFzaWNSZXNldEZyb21ETUFCdXN5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBSVE1QU2V0QUdDSW5pdFZhbHVlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQmFuZFdpZHRoKQogewotCVVJTlQzMgkJRGF0YTsKLQlCT09MRUFOCQliQ3RybCA9IEZBTFNFOworCXU4IFI2NiA9IDB4MzA7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+ICBBc2ljUmVzZXRGcm9tRE1BQnVzeSAgISEhISEhISEhISEhISEhISEhISEhISEgXG4iKSk7CisJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkgewkvKiBCRyBiYW5kICovCisjaWZkZWYgUlQzMHh4CisJCS8qIEdhcnkgd2FzIHZlcmlmaWVkIEFtYXpvbiBBUCBhbmQgZmluZCB0aGF0IFJUMzA3eCBoYXMgQkJQX1I2NiBpbnZhbGlkIGRlZmF1bHQgdmFsdWUgKi8KIAotCS8vIEJlIHN1cmUgcmVzdG9yZSBsaW5rIGNvbnRyb2wgdmFsdWUgc28gd2UgY2FuIHdyaXRlIHJlZ2lzdGVyLgotCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLQlpZiAoUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX1NFVF9QQ0lfQ0xLX09GRl9DT01NQU5EKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY1Jlc2V0RnJvbURNQUJ1c3k9PT5cbiIpKTsKLQkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfSEFMVCk7Ci0JCVJUTVB1c2VjRGVsYXkoNjAwMCk7Ci0JCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOwotCQliQ3RybCA9IFRSVUU7Ci0JfQotCS8vIFJlc2V0IERNQQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgUEJGX1NZU19DVFJMLCAmRGF0YSk7Ci0JRGF0YSB8PSAweDI7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCBEYXRhKTsKLQotCS8vIEFmdGVyIFJlc2V0IERNQSwgRE1BIGluZGV4IHdpbGwgYmVjb21lIFplcm8uIFNvIERyaXZlciBuZWVkIHRvIHJlc2V0IGFsbCByaW5nIGluZGV4cyB0b28uCi0JLy8gUmVzZXQgRE1BL0NQVSByaW5nIGluZGV4Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WSSk7Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfSENDQSk7Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX01HTVQpOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9SWCk7Ci0KLQkvLyBDbGVhciBSZXNldAotCVJUTVBfSU9fUkVBRDMyKHBBZCwgUEJGX1NZU19DVFJMLCAmRGF0YSk7Ci0JRGF0YSAmPSAweGZmZmZmZmZkOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgRGF0YSk7Ci0KLQkvLyBJZiBpbiBSYWRpbyBvZmYsIHNob3VsZCBjYWxsIFJUTVBQQ0llUG93ZXJMaW5rQ3RybCBhZ2Fpbi4KLQlpZiAoKGJDdHJsID09IFRSVUUpICYmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpKQotCQlSVE1QUENJZUxpbmtDdHJsU2V0dGluZyhwQWQsIDMpOwotCi0JUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0gIEFzaWNSZXNldEZyb21ETUFCdXN5ICEhISEhISEhISEhISEhISEhISEhISEhICBcbiIpKTsKLX0KLQotVk9JRCBBc2ljUmVzZXRCQlAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPiAgQXNpYyBIYXJkUmVzZXQgQkJQICAhISEhISEhISEhISEhISEhISEhISEhISBcbiIpKTsKLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgwKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4Mik7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweGMpOwotCi0JLy8gQWZ0ZXIgaGFyZC1yZXNldCBCQlAsIGluaXRpYWxpemUgYWxsIEJCUCB2YWx1ZXMuCi0JTklDUmVzdG9yZUJCUFZhbHVlKHBBZCk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLSAgQXNpYyBIYXJkUmVzZXQgQkJQICEhISEhISEhISEhISEhISEhISEhISEhICBcbiIpKTsKLX0KLQotVk9JRCBBc2ljUmVzZXRNQUMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUxPTkcJCURhdGE7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+ICBBc2ljUmVzZXRNQUMgICAhISEhIFxuIikpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgUEJGX1NZU19DVFJMLCAmRGF0YSk7Ci0JRGF0YSB8PSAweDQ7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCBEYXRhKTsKLQlEYXRhICY9IDB4ZmZmZmZmZmI7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCBEYXRhKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0gIEFzaWNSZXNldE1BQyAgICEhISEgXG4iKSk7Ci19Ci0KLVZPSUQgQXNpY1Jlc2V0UEJGKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVVMT05HCQlWYWx1ZTEsIFZhbHVlMjsKLQlVTE9ORwkJRGF0YTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhSWFFfUENOVCwgJlZhbHVlMSk7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBQQkZfREJHLCAmVmFsdWUyKTsKLQotCVZhbHVlMiAmPSAweGZmOwotCS8vIHN1bSBzaG91bGQgYmUgZXF1YWxzIHRvIDB4ZmYsIHdoaWNoIGlzIHRoZSB0b3RhbCBidWZmZXIgc2l6ZS4KLQlpZiAoKFZhbHVlMSArIFZhbHVlMikgPCAweGZmKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPiAgQXNpYyBIYXJkUmVzZXQgUEJGICEhISEgXG4iKSk7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgUEJGX1NZU19DVFJMLCAmRGF0YSk7Ci0JCURhdGEgfD0gMHg4OwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIERhdGEpOwotCQlEYXRhICY9IDB4ZmZmZmZmZjc7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgRGF0YSk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLSAgQXNpYyBIYXJkUmVzZXQgUEJGICEhISEgXG4iKSk7Ci0JfQotfQotI2VuZGlmIC8qIFJUMjg2MCAqLwotCi1WT0lEIFJUTVBTZXRBR0NJbml0VmFsdWUoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlCYW5kV2lkdGgpCi17Ci0JVUNIQVIJUjY2ID0gMHgzMDsKLQotCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCi0JewkvLyBCRyBiYW5kCi0JCVI2NiA9IDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7Ci0JfQotCWVsc2UKLQl7CS8vQSBiYW5kCi0JCWlmIChCYW5kV2lkdGggPT0gQldfMjApCisJCWlmIChJU19SVDMwNzAocEFkKSB8fCBJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKQorCQkgICAgfHwgSVNfUlQzMzkwKHBBZCkpIHsKKwkJCVI2NiA9IDB4MUMgKyAyICogR0VUX0xOQV9HQUlOKHBBZCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJfSBlbHNlCisjZW5kaWYgLyogUlQzMHh4IC8vICovCiAJCXsKLQkJCVI2NiA9IChVQ0hBUikoMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zKTsKKwkJCVI2NiA9IDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKTsKIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwogCQl9Ci0JCWVsc2UKKwl9IGVsc2UgewkJLypBIGJhbmQgKi8KIAkJewotCQkJUjY2ID0gKFVDSEFSKSgweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQlpZiAoQmFuZFdpZHRoID09IEJXXzIwKSB7CisJCQkJUjY2ID0KKwkJCQkgICAgKHU4KSgweDMyICsKKwkJCQkJICAgICAoR0VUX0xOQV9HQUlOKHBBZCkgKiA1KSAvIDMpOworCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJfSBlbHNlIHsKKwkJCQlSNjYgPQorCQkJCSAgICAodTgpKDB4M0EgKworCQkJCQkgICAgIChHRVRfTE5BX0dBSU4ocEFkKSAqIDUpIC8gMyk7CisJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQl9CiAJCX0KIAl9CiAKIH0KLQotVk9JRCBBc2ljVHVybk9mZlJGQ2xrKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVDSEFSCQlDaGFubmVsKQotewotCi0JLy8gUkYgUjIgYml0IDE4ID0gMAotCVVJTlQzMgkJCVIxID0gMCwgUjIgPSAwLCBSMyA9IDA7Ci0JVUNIQVIJCQlpbmRleDsKLQlSVE1QX1JGX1JFR1MJKlJGUmVnVGFibGU7Ci0KLQkvLyBUaGUgUkYgcHJvZ3JhbW1pbmcgc2VxdWVuY2UgaXMgZGlmZmVyZW5jZSBiZXR3ZWVuIDN4eHggYW5kIDJ4eHgKLQlpZiAoSVNfUlQzMDkwKHBBZCkpCi0JewotCQlSVDMweHhMb2FkUkZTbGVlcE1vZGVTZXR1cChwQWQpOyAgLy8gYWRkIGJ5IGpvaG5saSwgIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwLCBsb2FkIFJGIHNsZWVwLW1vZGUgc2V0dXAKLQkJcmV0dXJuOwotCX0KLQotCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKLQotCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKLQl7Ci0JCWNhc2UgUkZJQ18yODIwOgotCQljYXNlIFJGSUNfMjg1MDoKLQkJY2FzZSBSRklDXzI3MjA6Ci0JCWNhc2UgUkZJQ18yNzUwOgotCi0JCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKQotCQkJewotCQkJCWlmIChDaGFubmVsID09IFJGUmVnVGFibGVbaW5kZXhdLkNoYW5uZWwpCi0JCQkJewotCQkJCQlSMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxICYgMHhmZmZmZGZmZjsKLQkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMiAmIDB4ZmZmYmZmZmY7Ci0JCQkJCVIzID0gUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZjNmZmZmOwotCi0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKLQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjIpOwotCi0JCQkJCS8vIFByb2dyYW0gUjFiMTMgdG8gMSwgUjMvYjE4LDE5IHRvIDAsIFIyYjE4IHRvIDAuCi0JCQkJCS8vIFNldCBSRiBSMiBiaXQxOD0wLCBSMyBiaXRbMTg6MTldPTAKLQkJCQkJLy9pZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQotCQkJCQlpZiAoMSkKLQkJCQkJewotCQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjMpOwotCi0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljVHVybk9mZlJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4LCAgUjMgPSAweCUwOHggXG4iLAotCQkJCQkJCUNoYW5uZWwsIHBBZC0+UmZJY1R5cGUsIFIyLCBSMykpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNUdXJuT2ZmUkZDbGsjJWQoUkY9JWQsICkgLCBSMj0weCUwOHggXG4iLAotCQkJCQkJCUNoYW5uZWwsIHBBZC0+UmZJY1R5cGUsIFIyKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci19Ci0KLQotVk9JRCBBc2ljVHVybk9uUkZDbGsoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUNIQVIJCQlDaGFubmVsKQotewotCi0JLy8gUkYgUjIgYml0IDE4ID0gMAotCVVJTlQzMgkJCVIxID0gMCwgUjIgPSAwLCBSMyA9IDA7Ci0JVUNIQVIJCQlpbmRleDsKLQlSVE1QX1JGX1JFR1MJKlJGUmVnVGFibGU7Ci0KLQkvLyBUaGUgUkYgcHJvZ3JhbW1pbmcgc2VxdWVuY2UgaXMgZGlmZmVyZW5jZSBiZXR3ZWVuIDN4eHggYW5kIDJ4eHgKLQlpZiAoSVNfUlQzMDkwKHBBZCkpCi0JCXJldHVybjsKLQotCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKLQotCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKLQl7Ci0JCWNhc2UgUkZJQ18yODIwOgotCQljYXNlIFJGSUNfMjg1MDoKLQkJY2FzZSBSRklDXzI3MjA6Ci0JCWNhc2UgUkZJQ18yNzUwOgotCi0JCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKQotCQkJewotCQkJCWlmIChDaGFubmVsID09IFJGUmVnVGFibGVbaW5kZXhdLkNoYW5uZWwpCi0JCQkJewotCQkJCQlSMyA9IHBBZC0+TGF0Y2hSZlJlZ3MuUjM7Ci0JCQkJCVIzICY9IDB4ZmZmM2ZmZmY7Ci0JCQkJCVIzIHw9IDB4MDAwODAwMDA7Ci0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIzKTsKLQotCQkJCQlSMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxOwotCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMSk7Ci0KLQkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMjsKLQkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKLQkJCQkJewotCQkJCQkJUjIgfD0gMHg0MDAwOwkvLyBJZiBUWHBhdGggaXMgMSwgYml0IDE0ID0gMTsKLQkJCQkJfQotCi0JCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCi0JCQkJCXsKLQkJCQkJCVIyIHw9IDB4NDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4cGF0aC4KLQkJCQkJfQotCQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCi0JCQkJCXsKLQkJCQkJCVIyIHw9IDB4MjAwNDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4UGF0aAotCQkJCQl9Ci0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIyKTsKLQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1R1cm5PblJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4XG4iLAotCQlDaGFubmVsLAotCQlwQWQtPlJmSWNUeXBlLAotCQlSMikpOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydF9jaGFubmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydF9jaGFubmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM4Nzk4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0X2NoYW5uZWwuYwpAQCAtMCwwICsxLDE3MDUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworc3RydWN0IHJ0X2NoX2ZyZXFfbWFwIENIX0haX0lEX01BUFtdID0geworCXsxLCAyNDEyfQorCSwKKwl7MiwgMjQxN30KKwksCisJezMsIDI0MjJ9CisJLAorCXs0LCAyNDI3fQorCSwKKwl7NSwgMjQzMn0KKwksCisJezYsIDI0Mzd9CisJLAorCXs3LCAyNDQyfQorCSwKKwl7OCwgMjQ0N30KKwksCisJezksIDI0NTJ9CisJLAorCXsxMCwgMjQ1N30KKwksCisJezExLCAyNDYyfQorCSwKKwl7MTIsIDI0Njd9CisJLAorCXsxMywgMjQ3Mn0KKwksCisJezE0LCAyNDg0fQorCSwKKworCS8qICBVTklJICovCisJezM2LCA1MTgwfQorCSwKKwl7NDAsIDUyMDB9CisJLAorCXs0NCwgNTIyMH0KKwksCisJezQ4LCA1MjQwfQorCSwKKwl7NTIsIDUyNjB9CisJLAorCXs1NiwgNTI4MH0KKwksCisJezYwLCA1MzAwfQorCSwKKwl7NjQsIDUzMjB9CisJLAorCXsxNDksIDU3NDV9CisJLAorCXsxNTMsIDU3NjV9CisJLAorCXsxNTcsIDU3ODV9CisJLAorCXsxNjEsIDU4MDV9CisJLAorCXsxNjUsIDU4MjV9CisJLAorCXsxNjcsIDU4MzV9CisJLAorCXsxNjksIDU4NDV9CisJLAorCXsxNzEsIDU4NTV9CisJLAorCXsxNzMsIDU4NjV9CisJLAorCisJLyogSGlwZXJMQU4yICovCisJezEwMCwgNTUwMH0KKwksCisJezEwNCwgNTUyMH0KKwksCisJezEwOCwgNTU0MH0KKwksCisJezExMiwgNTU2MH0KKwksCisJezExNiwgNTU4MH0KKwksCisJezEyMCwgNTYwMH0KKwksCisJezEyNCwgNTYyMH0KKwksCisJezEyOCwgNTY0MH0KKwksCisJezEzMiwgNTY2MH0KKwksCisJezEzNiwgNTY4MH0KKwksCisJezE0MCwgNTcwMH0KKwksCisKKwkvKiBKYXBhbiBNTUFDICovCisJezM0LCA1MTcwfQorCSwKKwl7MzgsIDUxOTB9CisJLAorCXs0MiwgNTIxMH0KKwksCisJezQ2LCA1MjMwfQorCSwKKworCS8qICBKYXBhbiAqLworCXsxODQsIDQ5MjB9CisJLAorCXsxODgsIDQ5NDB9CisJLAorCXsxOTIsIDQ5NjB9CisJLAorCXsxOTYsIDQ5ODB9CisJLAorCisJezIwOCwgNTA0MH0KKwksCQkJLyogSmFwYW4sIG1lYW5zIEowOCAqLworCXsyMTIsIDUwNjB9CisJLAkJCS8qIEphcGFuLCBtZWFucyBKMTIgKi8KKwl7MjE2LCA1MDgwfQorCSwJCQkvKiBKYXBhbiwgbWVhbnMgSjE2ICovCit9OworCitpbnQgQ0hfSFpfSURfTUFQX05VTSA9IChzaXplb2YoQ0hfSFpfSURfTUFQKSAvIHNpemVvZihzdHJ1Y3QgcnRfY2hfZnJlcV9tYXApKTsKKworc3RydWN0IHJ0X2NoX3JlZ2lvbiBDaFJlZ2lvbltdID0geworCXsJCQkvKiBBbnRpZ3VhIGFuZCBCZXJidWRhICovCisJICJBRyIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEFyZ2VudGluYSAqLworCSAiQVIiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHs1MiwgNCwgMjQsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezE0OSwgNCwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTYxICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBBcnViYSAqLworCSAiQVciLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBBdXN0cmFsaWEgKi8KKwkgIkFVIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjQsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezE0OSwgNSwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTY1ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBBdXN0cmlhICovCisJICJBVCIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEJhaGFtYXMgKi8KKwkgIkJTIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjQsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezE0OSwgNSwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTY1ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBCYXJiYWRvcyAqLworCSAiQkIiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyNCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBCZXJtdWRhICovCisJICJCTSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDI0LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEJyYXppbCAqLworCSAiQlIiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyNCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMjQsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MTQ5LCA1LCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEJlbGdpdW0gKi8KKwkgIkJFIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDE4LCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMTgsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogQnVsZ2FyaWEgKi8KKwkgIkJHIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIE9ET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIENhbmFkYSAqLworCSAiQ0EiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTQ5LCA1LCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjUgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIENheW1hbiBJc0xhbmRzICovCisJICJLWSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDI0LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIENoaWxlICovCisJICJDTCIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxNDksIDUsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2NSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogQ2hpbmEgKi8KKwkgIkNOIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MTQ5LCA0LCAyNywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIENvbG9tYmlhICovCisJICJDTyIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAxNywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDI0LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHsxNDksIDUsIDMwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2NSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogQ29zdGEgUmljYSAqLworCSAiQ1IiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMTcsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyNCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTQ5LCA0LCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEN5cHJ1cyAqLworCSAiQ1kiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyNCwgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogQ3plY2hfUmVwdWJsaWMgKi8KKwkgIkNaIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBEZW5tYXJrICovCisJICJESyIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBEb21pbmljYW4gUmVwdWJsaWMgKi8KKwkgIkRPIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAwLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDAgKi8KKwkgIHsxNDksIDQsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogRXF1YWRvciAqLworCSAiRUMiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHsxMDAsIDExLCAyNywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEVsIFNhbHZhZG9yICovCisJICJTViIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezE0OSwgNCwgMzYsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjUgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEZpbmxhbmQgKi8KKwkgIkZJIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEZyYW5jZSAqLworCSAiRlIiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEdlcm1hbnkgKi8KKwkgIkRFIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEdyZWVjZSAqLworCSAiR1IiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgT0RPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogR3VhbSAqLworCSAiR1UiLAorCSBDRSwKKwkgeworCSAgezEsIDExLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTEgKi8KKwkgIHszNiwgNCwgMTcsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyNCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MTQ5LCA1LCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjUgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEd1YXRlbWFsYSAqLworCSAiR1QiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMTcsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyNCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTQ5LCA0LCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEhhaXRpICovCisJICJIVCIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAxNywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDI0LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxNDksIDQsIDMwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogSG9uZHVyYXMgKi8KKwkgIkhOIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MTQ5LCA0LCAyNywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEhvbmcgS29uZyAqLworCSAiSEsiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTQ5LCA0LCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEh1bmdhcnkgKi8KKwkgIkhVIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBJY2VsYW5kICovCisJICJJUyIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBJbmRpYSAqLworCSAiSU4iLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHsxNDksIDQsIDI0LCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogSW5kb25lc2lhICovCisJICJJRCIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezE0OSwgNCwgMjcsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTYxICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBJcmVsYW5kICovCisJICJJRSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBPRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBJc3JhZWwgKi8KKwkgIklMIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAzLCAyMCwgSURPUiwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MyAqLworCSAgezQsIDYsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggNH45ICovCisJICB7MTAsIDQsIDIwLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMTB+MTMgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEl0YWx5ICovCisJICJJVCIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBPRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBKYXBhbiAqLworCSAiSlAiLAorCSBKQVAsCisJIHsKKwkgIHsxLCAxNCwgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjE0ICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEpvcmRhbiAqLworCSAiSk8iLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgSURPUiwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezE0OSwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTYxICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBMYXR2aWEgKi8KKwkgIkxWIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIExpZWNodGVuc3RlaW4gKi8KKwkgIkxJIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBMaXRodWFuaWEgKi8KKwkgIkxUIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEx1eGVtYnVyZyAqLworCSAiTFUiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogTWFsYXlzaWEgKi8KKwkgIk1ZIiwKKwkgQ0UsCisJIHsKKwkgIHszNiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTQ5LCA1LCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjUgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIE1hbHRhICovCisJICJNVCIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBNYXJvY2NvICovCisJICJNQSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyNCwgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBNZXhpY28gKi8KKwkgIk1YIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjQsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezE0OSwgNSwgMzAsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTY1ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBOZXRoZXJsYW5kcyAqLworCSAiTkwiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyNCwgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogTmV3IFplYWxhbmQgKi8KKwkgIk5aIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDI0LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjQsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezE0OSwgNCwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTYxICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBOb3J3YXkgKi8KKwkgIk5PIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDI0LCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjQsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFBlcnUgKi8KKwkgIlBFIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MTQ5LCA0LCAyNywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFBvcnR1Z2FsICovCisJICJQVCIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBQb2xhbmQgKi8KKwkgIlBMIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFJvbWFuaWEgKi8KKwkgIlJPIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFJ1c3NpYSAqLworCSAiUlUiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHsxNDksIDQsIDIwLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogU2F1ZGkgQXJhYmlhICovCisJICJTQSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxNDksIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogU2VyYmlhX2FuZF9Nb250ZW5lZ3JvICovCisJICJDUyIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogU2luZ2Fwb3JlICovCisJICJTRyIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxNDksIDQsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogU2xvdmFraWEgKi8KKwkgIlNLIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFNsb3ZlbmlhICovCisJICJTSSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogU291dGggQWZyaWNhICovCisJICJaQSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezE0OSwgNCwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTYxICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBTb3V0aCBLb3JlYSAqLworCSAiS1IiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCA4LCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xMjggKi8KKwkgIHsxNDksIDQsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogU3BhaW4gKi8KKwkgIkVTIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDE3LCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFN3ZWRlbiAqLworCSAiU0UiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogU3dpdHplcmxhbmQgKi8KKwkgIkNIIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFRhaXdhbiAqLworCSAiVFciLAorCSBDRSwKKwkgeworCSAgezEsIDExLCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTEgKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogVHVya2V5ICovCisJICJUUiIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMSAqLworCSAgezM2LCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFVLICovCisJICJHQiIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMSAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBVa3JhaW5lICovCisJICJVQSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogVW5pdGVkX0FyYWJfRW1pcmF0ZXMgKi8KKwkgIkFFIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjExICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBVbml0ZWRfU3RhdGVzICovCisJICJVUyIsCisJIENFLAorCSB7CisJICB7MSwgMTEsIDMwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMSAqLworCSAgezM2LCA0LCAxNywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7NTIsIDQsIDI0LCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MTQ5LCA1LCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjUgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFZlbmV6dWVsYSAqLworCSAiVkUiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTEgKi8KKwkgIHsxNDksIDQsIDI3LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogRGVmYXVsdCAqLworCSAiIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMSwgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjExICovCisJICB7MzYsIDQsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHs1MiwgNCwgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezE0OSwgNSwgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTY1ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcnRfY2hfcmVnaW9uICpHZXRDaFJlZ2lvbih1OCAqQ250cnlDb2RlKQoreworCWludCBsb29wID0gMDsKKwlzdHJ1Y3QgcnRfY2hfcmVnaW9uICpwQ2hSZWdpb24gPSBOVUxMOworCisJd2hpbGUgKHN0cmNtcCgoY2hhciAqKUNoUmVnaW9uW2xvb3BdLkNvdW50UmVnLCAiIikgIT0gMCkgeworCQlpZiAoc3RybmNtcAorCQkgICAgKChjaGFyICopQ2hSZWdpb25bbG9vcF0uQ291bnRSZWcsIChjaGFyICopQ250cnlDb2RlLAorCQkgICAgIDIpID09IDApIHsKKwkJCXBDaFJlZ2lvbiA9ICZDaFJlZ2lvbltsb29wXTsKKwkJCWJyZWFrOworCQl9CisJCWxvb3ArKzsKKwl9CisKKwlpZiAocENoUmVnaW9uID09IE5VTEwpCisJCXBDaFJlZ2lvbiA9ICZDaFJlZ2lvbltsb29wXTsKKwlyZXR1cm4gcENoUmVnaW9uOworfQorCitzdGF0aWMgdm9pZCBDaEJhbmRDaGVjayh1OCBQaHlNb2RlLCB1OCAqcENoVHlwZSkKK3sKKwlzd2l0Y2ggKFBoeU1vZGUpIHsKKwljYXNlIFBIWV8xMUE6CisJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKwkJKnBDaFR5cGUgPSBCQU5EXzVHOworCQlicmVhazsKKwljYXNlIFBIWV8xMUFCR19NSVhFRDoKKwljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisJCSpwQ2hUeXBlID0gQkFORF9CT1RIOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCSpwQ2hUeXBlID0gQkFORF8yNEc7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHU4IEZpbGxDaExpc3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X2NoX2Rlc3AgKnBDaERlc3AsCisJCQl1OCBPZmZzZXQsIHU4IGluY3JlbWVudCkKK3sKKwlpbnQgaSwgaiwgbDsKKwl1OCBjaGFubmVsOworCisJaiA9IE9mZnNldDsKKwlmb3IgKGkgPSAwOyBpIDwgcENoRGVzcC0+TnVtT2ZDaDsgaSsrKSB7CisJCWNoYW5uZWwgPSBwQ2hEZXNwLT5GaXJzdENoYW5uZWwgKyBpICogaW5jcmVtZW50OworCQlmb3IgKGwgPSAwOyBsIDwgTUFYX05VTV9PRl9DSEFOTkVMUzsgbCsrKSB7CisJCQlpZiAoY2hhbm5lbCA9PSBwQWQtPlR4UG93ZXJbbF0uQ2hhbm5lbCkgeworCQkJCXBBZC0+Q2hhbm5lbExpc3Rbal0uUG93ZXIgPQorCQkJCSAgICBwQWQtPlR4UG93ZXJbbF0uUG93ZXI7CisJCQkJcEFkLT5DaGFubmVsTGlzdFtqXS5Qb3dlcjIgPQorCQkJCSAgICBwQWQtPlR4UG93ZXJbbF0uUG93ZXIyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChsID09IE1BWF9OVU1fT0ZfQ0hBTk5FTFMpCisJCQljb250aW51ZTsKKworCQlwQWQtPkNoYW5uZWxMaXN0W2pdLkNoYW5uZWwgPQorCQkgICAgcENoRGVzcC0+Rmlyc3RDaGFubmVsICsgaSAqIGluY3JlbWVudDsKKwkJcEFkLT5DaGFubmVsTGlzdFtqXS5NYXhUeFB3ciA9IHBDaERlc3AtPk1heFR4UHdyOworCQlwQWQtPkNoYW5uZWxMaXN0W2pdLkRmc1JlcSA9IHBDaERlc3AtPkRmc1JlcTsKKwkJaisrOworCX0KKwlwQWQtPkNoYW5uZWxMaXN0TnVtID0gajsKKworCXJldHVybiBqOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgQ3JlYXRlQ2hMaXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQlzdHJ1Y3QgcnRfY2hfcmVnaW9uICpwQ2hSZWdpb24sIHU4IEdlb2dyYXBoeSkKK3sKKwlpbnQgaTsKKwl1OCBvZmZzZXQgPSAwOworCXN0cnVjdCBydF9jaF9kZXNwICpwQ2hEZXNwOworCXU4IENoVHlwZTsKKwl1OCBpbmNyZW1lbnQ7CisKKwlpZiAocENoUmVnaW9uID09IE5VTEwpCisJCXJldHVybjsKKworCUNoQmFuZENoZWNrKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsICZDaFR5cGUpOworCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJcENoRGVzcCA9ICZwQ2hSZWdpb24tPkNoRGVzcFtpXTsKKwkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA9PSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKENoVHlwZSA9PSBCQU5EXzVHKSB7CisJCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsIDw9IDE0KQorCQkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKENoVHlwZSA9PSBCQU5EXzI0RykgeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA+IDE0KQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gQk9USCkKKwkJICAgIHx8IChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gR2VvZ3JhcGh5KSkgeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA+IDE0KQorCQkJCWluY3JlbWVudCA9IDQ7CisJCQllbHNlCisJCQkJaW5jcmVtZW50ID0gMTsKKwkJCW9mZnNldCA9IEZpbGxDaExpc3QocEFkLCBwQ2hEZXNwLCBvZmZzZXQsIGluY3JlbWVudCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgQnVpbGRDaGFubmVsTGlzdEV4KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlzdHJ1Y3QgcnRfY2hfcmVnaW9uICpwQ2hSZWc7CisKKwlwQ2hSZWcgPSBHZXRDaFJlZ2lvbihwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSk7CisJQ3JlYXRlQ2hMaXN0KHBBZCwgcENoUmVnLCBwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkpOworfQorCit2b2lkIEJ1aWxkQmVhY29uQ2hMaXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHU4ICpwQnVmLCB1bnNpZ25lZCBsb25nICpwQnVmTGVuKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgVG1wTGVuOworCXN0cnVjdCBydF9jaF9yZWdpb24gKnBDaFJlZ2lvbjsKKwlzdHJ1Y3QgcnRfY2hfZGVzcCAqcENoRGVzcDsKKwl1OCBDaFR5cGU7CisKKwlwQ2hSZWdpb24gPSBHZXRDaFJlZ2lvbihwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSk7CisKKwlpZiAocENoUmVnaW9uID09IE5VTEwpCisJCXJldHVybjsKKworCUNoQmFuZENoZWNrKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsICZDaFR5cGUpOworCSpwQnVmTGVuID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCXBDaERlc3AgPSAmcENoUmVnaW9uLT5DaERlc3BbaV07CisJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPT0gMCkKKwkJCWJyZWFrOworCisJCWlmIChDaFR5cGUgPT0gQkFORF81RykgeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA8PSAxNCkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChDaFR5cGUgPT0gQkFORF8yNEcpIHsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgocENoRGVzcC0+R2VvZ3JhcGh5ID09IEJPVEgpCisJCSAgICB8fCAocENoRGVzcC0+R2VvZ3JhcGh5ID09IHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSkpIHsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCdWYgKyAqcEJ1ZkxlbiwgJlRtcExlbiwKKwkJCQkJICAxLCAmcENoRGVzcC0+Rmlyc3RDaGFubmVsLAorCQkJCQkgIDEsICZwQ2hEZXNwLT5OdW1PZkNoLAorCQkJCQkgIDEsICZwQ2hEZXNwLT5NYXhUeFB3ciwgRU5EX09GX0FSR1MpOworCQkJKnBCdWZMZW4gKz0gVG1wTGVuOworCQl9CisJfQorfQorCitzdGF0aWMgQk9PTEVBTiBJc1ZhbGlkQ2hhbm5lbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IGNoYW5uZWwpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKSB7CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwgPT0gY2hhbm5lbCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJCXJldHVybiBGQUxTRTsKKwllbHNlCisJCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgdTggR2V0RXh0Q2godTggQ2hhbm5lbCwgdTggRGlyZWN0aW9uKQoreworCWNoYXIgRXh0Q2g7CisKKwlpZiAoRGlyZWN0aW9uID09IEVYVENIQV9BQk9WRSkKKwkJRXh0Q2ggPSBDaGFubmVsICsgNDsKKwllbHNlCisJCUV4dENoID0gKENoYW5uZWwgLSA0KSA+IDAgPyAoQ2hhbm5lbCAtIDQpIDogMDsKKworCXJldHVybiBFeHRDaDsKK30KKwordm9pZCBOX0NoYW5uZWxDaGVjayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJLyp1OCBDaGFubmVsTnVtID0gcEFkLT5DaGFubmVsTGlzdE51bTsgKi8KKwl1OCBDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKworCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCSAgICAmJiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkgeworCQlpZiAoQ2hhbm5lbCA+IDE0KSB7CisJCQlpZiAoKENoYW5uZWwgPT0gMzYpIHx8IChDaGFubmVsID09IDQ0KQorCQkJICAgIHx8IChDaGFubmVsID09IDUyKSB8fCAoQ2hhbm5lbCA9PSA2MCkKKwkJCSAgICB8fCAoQ2hhbm5lbCA9PSAxMDApIHx8IChDaGFubmVsID09IDEwOCkKKwkJCSAgICB8fCAoQ2hhbm5lbCA9PSAxMTYpIHx8IChDaGFubmVsID09IDEyNCkKKwkJCSAgICB8fCAoQ2hhbm5lbCA9PSAxMzIpIHx8IChDaGFubmVsID09IDE0OSkKKwkJCSAgICB8fCAoQ2hhbm5lbCA9PSAxNTcpKSB7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9CisJCQkJICAgIEVYVENIQV9BQk9WRTsKKwkJCX0gZWxzZSBpZiAoKENoYW5uZWwgPT0gNDApIHx8IChDaGFubmVsID09IDQ4KQorCQkJCSAgIHx8IChDaGFubmVsID09IDU2KSB8fCAoQ2hhbm5lbCA9PSA2NCkKKwkJCQkgICB8fCAoQ2hhbm5lbCA9PSAxMDQpIHx8IChDaGFubmVsID09IDExMikKKwkJCQkgICB8fCAoQ2hhbm5lbCA9PSAxMjApIHx8IChDaGFubmVsID09IDEyOCkKKwkJCQkgICB8fCAoQ2hhbm5lbCA9PSAxMzYpIHx8IChDaGFubmVsID09IDE1MykKKwkJCQkgICB8fCAoQ2hhbm5lbCA9PSAxNjEpKSB7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9CisJCQkJICAgIEVYVENIQV9CRUxPVzsKKwkJCX0gZWxzZSB7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0KKwkJCQkgICAgQldfMjA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlkbyB7CisJCQkJdTggRXh0Q2g7CisJCQkJdTggRGlyID0KKwkJCQkgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLgorCQkJCSAgICBFWFRDSEE7CisJCQkJRXh0Q2ggPSBHZXRFeHRDaChDaGFubmVsLCBEaXIpOworCQkJCWlmIChJc1ZhbGlkQ2hhbm5lbChwQWQsIEV4dENoKSkKKwkJCQkJYnJlYWs7CisKKwkJCQlEaXIgPQorCQkJCSAgICAoRGlyID09CisJCQkJICAgICBFWFRDSEFfQUJPVkUpID8gRVhUQ0hBX0JFTE9XIDoKKwkJCQkgICAgRVhUQ0hBX0FCT1ZFOworCQkJCUV4dENoID0gR2V0RXh0Q2goQ2hhbm5lbCwgRGlyKTsKKwkJCQlpZiAoSXNWYWxpZENoYW5uZWwocEFkLCBFeHRDaCkpIHsKKwkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLgorCQkJCQkgICAgRVhUQ0hBID0gRGlyOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0KKwkJCQkgICAgQldfMjA7CisJCQl9IHdoaWxlIChGQUxTRSk7CisKKwkJCWlmIChDaGFubmVsID09IDE0KSB7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0KKwkJCQkgICAgQldfMjA7CisJCQkJLypwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX05PTkU7IC8vIFdlIGRpZG4ndCBzZXQgdGhlIEV4dENoIGFzIE5PTkUgZHVlIHRvIGl0J2xsIHNldCBpbiBSVE1QU2V0SFQoKSAqLworCQkJfQorCQl9CisJfQorCit9CisKK3ZvaWQgTl9TZXRDZW5DaChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkgeworCQlpZiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PQorCQkgICAgRVhUQ0hBX0FCT1ZFKSB7CisJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9CisJCQkgICAgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7CisJCX0gZWxzZSB7CisJCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9PSAxNCkKKwkJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9CisJCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAxOworCQkJZWxzZQorCQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0KKwkJCQkgICAgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7CisJCX0KKwl9IGVsc2UgeworCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJfQorfQorCit1OCBHZXRDdW50cnlNYXhUeFB3cihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IGNoYW5uZWwpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykgeworCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsID09IGNoYW5uZWwpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQorCQlyZXR1cm4gMHhmZjsKKwllbHNlCisJCXJldHVybiBwQWQtPkNoYW5uZWxMaXN0W2ldLk1heFR4UHdyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRfcmYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0X3JmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5MTIxZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0X3JmLmMKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRfcmYuYworCisJQWJzdHJhY3Q6CisJUmFsaW5rIFdpcmVsZXNzIGRyaXZlciBSRiByZWxhdGVkIGZ1bmN0aW9ucworCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246IFdyaXRlIFJUMzB4eCBSRiByZWdpc3RlciB0aHJvdWdoIE1BQworCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJUMzB4eFdyaXRlUkZSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICB1OCByZWdJRCwgdTggdmFsdWUpCit7CisJUkZfQ1NSX0NGR19TVFJVQyByZmNzcjsKKwl1MzIgaSA9IDA7CisKKwlkbyB7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUkZfQ1NSX0NGRywgJnJmY3NyLndvcmQpOworCisJCWlmICghcmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0spCisJCQlicmVhazsKKwkJaSsrOworCX0KKwl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkKKwkgICAgICAgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkKKwkgICAgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpIHsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJICAgICAoIlJldHJ5IGNvdW50IGV4aGF1c3RlZCBvciBkZXZpY2UgcmVtb3ZlZCFcbiIpKTsKKwkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7CisJfQorCisJcmZjc3IuZmllbGQuUkZfQ1NSX1dSID0gMTsKKwlyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9IDE7CisJcmZjc3IuZmllbGQuVEVTVENTUl9SRkFDQ19SRUdOVU0gPSByZWdJRDsKKwlyZmNzci5maWVsZC5SRl9DU1JfREFUQSA9IHZhbHVlOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgUkZfQ1NSX0NGRywgcmZjc3Iud29yZCk7CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246IFJlYWQgUlQzMHh4IFJGIHJlZ2lzdGVyIHRocm91Z2ggTUFDCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgUlQzMHh4UmVhZFJGUmVnaXN0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSB1OCByZWdJRCwgdTggKnBWYWx1ZSkKK3sKKwlSRl9DU1JfQ0ZHX1NUUlVDIHJmY3NyOworCXUzMiBpID0gMCwgayA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JVU1lfQ09VTlQ7IGkrKykgeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFJGX0NTUl9DRkcsICZyZmNzci53b3JkKTsKKworCQlpZiAocmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPT0gQlVTWSkgeworCQkJY29udGludWU7CisJCX0KKwkJcmZjc3Iud29yZCA9IDA7CisJCXJmY3NyLmZpZWxkLlJGX0NTUl9XUiA9IDA7CisJCXJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID0gMTsKKwkJcmZjc3IuZmllbGQuVEVTVENTUl9SRkFDQ19SRUdOVU0gPSByZWdJRDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUkZfQ1NSX0NGRywgcmZjc3Iud29yZCk7CisJCWZvciAoayA9IDA7IGsgPCBNQVhfQlVTWV9DT1VOVDsgaysrKSB7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFJGX0NTUl9DRkcsICZyZmNzci53b3JkKTsKKworCQkJaWYgKHJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID09IElETEUpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBJRExFKSAmJgorCQkgICAgKHJmY3NyLmZpZWxkLlRFU1RDU1JfUkZBQ0NfUkVHTlVNID09IHJlZ0lEKSkgeworCQkJKnBWYWx1ZSA9ICh1OClyZmNzci5maWVsZC5SRl9DU1JfREFUQTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBCVVNZKSB7CisJCURCR1BSSU5UX0VSUigoIlJGIHJlYWQgUiVkPTB4JXggZmFpbCwgaVslZF0sIGtbJWRdXG4iLCByZWdJRCwKKwkJCSAgICAgIHJmY3NyLndvcmQsIGksIGspKTsKKwkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCit2b2lkIE5JQ0luaXRSRlJlZ2lzdGVycyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJaWYgKHBBZC0+Y2hpcE9wcy5Bc2ljUmZJbml0KQorCQlwQWQtPmNoaXBPcHMuQXNpY1JmSW5pdChwQWQpOworfQorCit2b2lkIFJ0bXBDaGlwT3BzUkZIb29rKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9jaGlwX29wICpwQ2hpcE9wcyA9ICZwQWQtPmNoaXBPcHM7CisKKwlwQ2hpcE9wcy0+cFJGUmVnVGFibGUgPSBOVUxMOworCXBDaGlwT3BzLT5Bc2ljUmZJbml0ID0gTlVMTDsKKwlwQ2hpcE9wcy0+QXNpY1JmVHVybk9uID0gTlVMTDsKKwlwQ2hpcE9wcy0+QXNpY1JmVHVybk9mZiA9IE5VTEw7CisJcENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlID0gTlVMTDsKKwlwQ2hpcE9wcy0+QXNpY0hhbHRBY3Rpb24gPSBOVUxMOworCS8qIFdlIGRlcGVuZHMgb24gUmZJQ1R5cGUgYW5kIE1BQ1ZlcnNpb24gdG8gYXNzaWduIHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBjYWxsYmFja3MuICovCisKKyNpZmRlZiBSVDMweHgKKwlpZiAoSVNfUlQzMHh4KHBBZCkpIHsKKwkJcENoaXBPcHMtPnBSRlJlZ1RhYmxlID0gUlQzMHh4X1JGUmVnVGFibGU7CisJCXBDaGlwT3BzLT5Bc2ljSGFsdEFjdGlvbiA9IFJUMzB4eEhhbHRBY3Rpb247CisjaWZkZWYgUlQzMDcwCisJCWlmICgoSVNfUlQzMDcwKHBBZCkgfHwgSVNfUlQzMDcxKHBBZCkpCisJCSAgICAmJiAocEFkLT5pbmZUeXBlID09IFJUTVBfREVWX0lORl9VU0IpKSB7CisJCQlwQ2hpcE9wcy0+QXNpY1JmSW5pdCA9IE5JQ0luaXRSVDMwNzBSRlJlZ2lzdGVyczsKKwkJCWlmIChJU19SVDMwNzEocEFkKSkgeworCQkJCXBDaGlwT3BzLT5Bc2ljUmZUdXJuT2ZmID0KKwkJCQkgICAgUlQzMHh4TG9hZFJGU2xlZXBNb2RlU2V0dXA7CisJCQkJcENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlID0KKwkJCQkgICAgUlQzMHh4UmV2ZXJzZVJGU2xlZXBNb2RlU2V0dXA7CisJCQl9CisJCX0KKyNlbmRpZiAvKiBSVDMwNzAgLy8gKi8KKyNpZmRlZiBSVDMwOTAKKwkJaWYgKElTX1JUMzA5MChwQWQpICYmIChwQWQtPmluZlR5cGUgPT0gUlRNUF9ERVZfSU5GX1BDSSkpIHsKKwkJCXBDaGlwT3BzLT5Bc2ljUmZUdXJuT2ZmID0gUlQzMHh4TG9hZFJGU2xlZXBNb2RlU2V0dXA7CisJCQlwQ2hpcE9wcy0+QXNpY1JmSW5pdCA9IE5JQ0luaXRSVDMwOTBSRlJlZ2lzdGVyczsKKwkJCXBDaGlwT3BzLT5Bc2ljUmV2ZXJzZVJmRnJvbVNsZWVwTW9kZSA9CisJCQkgICAgUlQzMHh4UmV2ZXJzZVJGU2xlZXBNb2RlU2V0dXA7CisJCX0KKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KKwl9CisjZW5kaWYgLyogUlQzMHh4IC8vICovCit9CisKKyNlbmRpZiAvKiBSVE1QX1JGX1JXX1NVUFBPUlQgLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF9pbml0LmMKaW5kZXggMjBjMmNlMi4uMjFhOTVmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF9pbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF9pbml0LmMKQEAgLTMzLDE3MiArMzMsMTExIEBACiAJUmV2aXNpb24gSGlzdG9yeToKIAlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKIAktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlQYXVsIExpbiAgICAyMDAyLTA4LTAxICAgIGNyZWF0ZWQKLSAgICBKb2huIENoYW5nICAyMDA0LTA4LTIwICAgIFJUMjU2MS8yNjYxIHVzZSBzY2F0dGVyLWdhdGhlciBzY2hlbWUKLSAgICBKYW4gTGVlICAyMDA2LTA5LTE1ICAgIFJUMjg2MC4gQ2hhbmdlIGZvciA4MDIuMTFuICwgRUVQUk9NLCBMZWQsIEJBLCBIVC4KICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0jaWZkZWYgUlQyODYwCi0jaW5jbHVkZSAiZmlybXdhcmUuaCIKLSNpbmNsdWRlIDxsaW51eC9iaXRyZXYuaD4KLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotLyogTmV3IGZpcm13YXJlIGhhbmRsZXMgYm90aCBSVDI4NzAgYW5kIFJUMzA3MC4gKi8KLSNpbmNsdWRlICIuLi8uLi9ydDMwNzAvZmlybXdhcmUuaCIKLSNlbmRpZgogCi1VQ0hBUiAgICBCSVQ4W10gPSB7MHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MH07Ci1VTE9ORyAgICBCSVQzMltdID0gezB4MDAwMDAwMDEsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDgsCi0JCQkJCTB4MDAwMDAwMTAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwNDAsIDB4MDAwMDAwODAsCi0JCQkJCTB4MDAwMDAxMDAsIDB4MDAwMDAyMDAsIDB4MDAwMDA0MDAsIDB4MDAwMDA4MDAsCi0JCQkJCTB4MDAwMDEwMDAsIDB4MDAwMDIwMDAsIDB4MDAwMDQwMDAsIDB4MDAwMDgwMDAsCi0JCQkJCTB4MDAwMTAwMDAsIDB4MDAwMjAwMDAsIDB4MDAwNDAwMDAsIDB4MDAwODAwMDAsCi0JCQkJCTB4MDAxMDAwMDAsIDB4MDAyMDAwMDAsIDB4MDA0MDAwMDAsIDB4MDA4MDAwMDAsCi0JCQkJCTB4MDEwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDQwMDAwMDAsIDB4MDgwMDAwMDAsCi0JCQkJCTB4MTAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4ODAwMDAwMDB9OwordTggQklUOFtdID0geyAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwIH07CitjaGFyICpDaXBoZXJOYW1lW10gPQorICAgIHsgIm5vbmUiLCAid2VwNjQiLCAid2VwMTI4IiwgIlRLSVAiLCAiQUVTIiwgIkNLSVA2NCIsICJDS0lQMTI4IiB9OwogCi1jaGFyKiAgIENpcGhlck5hbWVbXSA9IHsibm9uZSIsIndlcDY0Iiwid2VwMTI4IiwiVEtJUCIsIkFFUyIsIkNLSVA2NCIsIkNLSVAxMjgifTsKLQotLy8KLS8vIEJCUCByZWdpc3RlciBpbml0aWFsaXphdGlvbiBzZXQKLS8vCi1SRUdfUEFJUiAgIEJCUFJlZ1RhYmxlW10gPSB7Ci0Je0JCUF9SNjUsCQkweDJDfSwJCS8vIGZpeCByc3NpIGlzc3VlCi0Je0JCUF9SNjYsCQkweDM4fSwJLy8gQWxzbyBzZXQgdGhpcyBkZWZhdWx0IHZhbHVlIHRvIHBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSBhdCBpbml0aWFsCi0Je0JCUF9SNjksCQkweDEyfSwKLQl7QkJQX1I3MCwJCTB4YX0sCS8vIEJCUF9SNzAgd2lsbCBjaGFuZ2UgdG8gMHg4IGluIEFwU3RhcnRVcCBhbmQgTGlua1VwIGZvciBydDI4NjBDLCBvdGhlcndpc2UgdmFsdWUgaXMgMHhhCi0Je0JCUF9SNzMsCQkweDEwfSwKLQl7QkJQX1I4MSwJCTB4Mzd9LAotCXtCQlBfUjgyLAkJMHg2Mn0sCi0Je0JCUF9SODMsCQkweDZBfSwKLQl7QkJQX1I4NCwJCTB4OTl9LAkvLyAweDE5IGlzIGZvciBydDI4NjBFIGFuZCBhZnRlci4gVGhpcyBpcyBmb3IgZXh0ZW5zaW9uIGNoYW5uZWwgb3ZlcmxhcHBpbmcgSU9ULiAweDk5IGlzIGZvciBydDI4NjBEIGFuZCBiZWZvcmUKLQl7QkJQX1I4NiwJCTB4MDB9LAkvLyBtaWRkbGUgcmFuZ2UgaXNzdWUsIFJvcnkgQDIwMDgtMDEtMjgKLQl7QkJQX1I5MSwJCTB4MDR9LAkvLyBtaWRkbGUgcmFuZ2UgaXNzdWUsIFJvcnkgQDIwMDgtMDEtMjgKLQl7QkJQX1I5MiwJCTB4MDB9LAkvLyBtaWRkbGUgcmFuZ2UgaXNzdWUsIFJvcnkgQDIwMDgtMDEtMjgKLQl7QkJQX1IxMDMsICAJMHgwMH0sIAkvLyBuZWFyIHJhbmdlIGhpZ2gtcG93ZXIgaXNzdWUsIHJlcXVlc3RlZCBmcm9tIEdhcnkgQDIwMDgtMDUyOAotCXtCQlBfUjEwNSwJCTB4MDV9LAkvLyAweDA1IGlzIGZvciBydDI4NjBFIHRvIHR1cm4gb24gRkVRIGNvbnRyb2wuIEl0IGlzIHNhZmUgZm9yIHJ0Mjg2MEQgYW5kIGJlZm9yZSwgYmVjYXVzZSBCaXQgNzoyIGFyZSByZXNlcnZlZCBpbiBydDI4NjBEIGFuZCBiZWZvcmUuCisvKiAqLworLyogQkJQIHJlZ2lzdGVyIGluaXRpYWxpemF0aW9uIHNldCAqLworLyogKi8KK3N0cnVjdCBydF9yZWdfcGFpciBCQlBSZWdUYWJsZVtdID0geworCXtCQlBfUjY1LCAweDJDfSwJLyogZml4IHJzc2kgaXNzdWUgKi8KKwl7QkJQX1I2NiwgMHgzOH0sCS8qIEFsc28gc2V0IHRoaXMgZGVmYXVsdCB2YWx1ZSB0byBwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgYXQgaW5pdGlhbCAqLworCXtCQlBfUjY5LCAweDEyfSwKKwl7QkJQX1I3MCwgMHhhfSwJCS8qIEJCUF9SNzAgd2lsbCBjaGFuZ2UgdG8gMHg4IGluIEFwU3RhcnRVcCBhbmQgTGlua1VwIGZvciBydDI4NjBDLCBvdGhlcndpc2UgdmFsdWUgaXMgMHhhICovCisJe0JCUF9SNzMsIDB4MTB9LAorCXtCQlBfUjgxLCAweDM3fSwKKwl7QkJQX1I4MiwgMHg2Mn0sCisJe0JCUF9SODMsIDB4NkF9LAorCXtCQlBfUjg0LCAweDk5fSwJLyogMHgxOSBpcyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4gMHg5OSBpcyBmb3IgcnQyODYwRCBhbmQgYmVmb3JlICovCisJe0JCUF9SODYsIDB4MDB9LAkvKiBtaWRkbGUgcmFuZ2UgaXNzdWUsIFJvcnkgQDIwMDgtMDEtMjggKi8KKwl7QkJQX1I5MSwgMHgwNH0sCS8qIG1pZGRsZSByYW5nZSBpc3N1ZSwgUm9yeSBAMjAwOC0wMS0yOCAqLworCXtCQlBfUjkyLCAweDAwfSwJLyogbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4ICovCisJe0JCUF9SMTAzLCAweDAwfSwJLyogbmVhciByYW5nZSBoaWdoLXBvd2VyIGlzc3VlLCByZXF1ZXN0ZWQgZnJvbSBHYXJ5IEAyMDA4LTA1MjggKi8KKwl7QkJQX1IxMDUsIDB4MDV9LAkvKiAweDA1IGlzIGZvciBydDI4NjBFIHRvIHR1cm4gb24gRkVRIGNvbnRyb2wuIEl0IGlzIHNhZmUgZm9yIHJ0Mjg2MEQgYW5kIGJlZm9yZSwgYmVjYXVzZSBCaXQgNzoyIGFyZSByZXNlcnZlZCBpbiBydDI4NjBEIGFuZCBiZWZvcmUuICovCisJe0JCUF9SMTA2LCAweDM1fSwJLyogZm9yIFNob3J0R0kgdGhyb3VnaHB1dCAqLwogfTsKLSNkZWZpbmUJTlVNX0JCUF9SRUdfUEFSTVMJKHNpemVvZihCQlBSZWdUYWJsZSkgLyBzaXplb2YoUkVHX1BBSVIpKQogCi0vLwotLy8gUkYgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0Ci0vLwotI2lmZGVmIFJUMjg3MAotUkVHX1BBSVIgICBSVDMweHhfUkZSZWdUYWJsZVtdID0gewotICAgICAgICB7UkZfUjA0LCAgICAgICAgICAweDQwfSwKLSAgICAgICAge1JGX1IwNSwgICAgICAgICAgMHgwM30sCi0gICAgICAgIHtSRl9SMDYsICAgICAgICAgIDB4MDJ9LAotICAgICAgICB7UkZfUjA3LCAgICAgICAgICAweDcwfSwKLSAgICAgICAge1JGX1IwOSwgICAgICAgICAgMHgwRn0sCi0gICAgICAgIHtSRl9SMTAsICAgICAgICAgIDB4NDF9LAotICAgICAgICB7UkZfUjExLCAgICAgICAgICAweDIxfSwKLSAgICAgICAge1JGX1IxMiwgICAgICAgICAgMHg3Qn0sCi0gICAgICAgIHtSRl9SMTQsICAgICAgICAgIDB4OTB9LAotICAgICAgICB7UkZfUjE1LCAgICAgICAgICAweDU4fSwKLSAgICAgICAge1JGX1IxNiwgICAgICAgICAgMHhCM30sCi0gICAgICAgIHtSRl9SMTcsICAgICAgICAgIDB4OTJ9LAotICAgICAgICB7UkZfUjE4LCAgICAgICAgICAweDJDfSwKLSAgICAgICAge1JGX1IxOSwgICAgICAgICAgMHgwMn0sCi0gICAgICAgIHtSRl9SMjAsICAgICAgICAgIDB4QkF9LAotICAgICAgICB7UkZfUjIxLCAgICAgICAgICAweERCfSwKLSAgICAgICAge1JGX1IyNCwgICAgICAgICAgMHgxNn0sCi0gICAgICAgIHtSRl9SMjUsICAgICAgICAgIDB4MDF9LAotICAgICAgICB7UkZfUjI5LCAgICAgICAgICAweDFGfSwKLX07Ci0jZGVmaW5lCU5VTV9SRl9SRUdfUEFSTVMJKHNpemVvZihSVDMweHhfUkZSZWdUYWJsZSkgLyBzaXplb2YoUkVHX1BBSVIpKQotI2VuZGlmIC8vIFJUMjg3MCAvLworI2RlZmluZQlOVU1fQkJQX1JFR19QQVJNUwkoc2l6ZW9mKEJCUFJlZ1RhYmxlKSAvIHNpemVvZihzdHJ1Y3QgcnRfcmVnX3BhaXIpKQogCi0vLwotLy8gQVNJQyByZWdpc3RlciBpbml0aWFsaXphdGlvbiBzZXRzCi0vLworLyogKi8KKy8qIEFTSUMgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0cyAqLworLyogKi8KIAotUlRNUF9SRUdfUEFJUglNQUNSZWdUYWJsZVtdID0Jeworc3RydWN0IHJ0X3J0bXBfcmVnX3BhaXIgTUFDUmVnVGFibGVbXSA9IHsKICNpZiBkZWZpbmVkKEhXX0JFQUNPTl9PRkZTRVQpICYmIChIV19CRUFDT05fT0ZGU0VUID09IDB4MjAwKQotCXtCQ05fT0ZGU0VUMCwJCQkweGY4ZjBlOGUwfSwgLyogMHgzODAwKGUwKSwgMHgzQTAwKGU4KSwgMHgzQzAwKGYwKSwgMHgzRTAwKGY4KSwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KLQl7QkNOX09GRlNFVDEsCQkJMHg2Zjc3ZDBjOH0sIC8qIDB4MzIwMChjOCksIDB4MzQwMChkMCksIDB4MURDMCg3NyksIDB4MUJDMCg2ZiksIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCisJe0JDTl9PRkZTRVQwLCAweGY4ZjBlOGUwfSwJLyogMHgzODAwKGUwKSwgMHgzQTAwKGU4KSwgMHgzQzAwKGYwKSwgMHgzRTAwKGY4KSwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KKwl7QkNOX09GRlNFVDEsIDB4NmY3N2QwYzh9LAkvKiAweDMyMDAoYzgpLCAweDM0MDAoZDApLCAweDFEQzAoNzcpLCAweDFCQzAoNmYpLCA1MTJCIGZvciBlYWNoIGJlYWNvbiAqLwogI2VsaWYgZGVmaW5lZChIV19CRUFDT05fT0ZGU0VUKSAmJiAoSFdfQkVBQ09OX09GRlNFVCA9PSAweDEwMCkKLQl7QkNOX09GRlNFVDAsCQkJMHhlY2U4ZTRlMH0sIC8qIDB4MzgwMCwgMHgzQTAwLCAweDNDMDAsIDB4M0UwMCwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KLQl7QkNOX09GRlNFVDEsCQkJMHhmY2Y4ZjRmMH0sIC8qIDB4MzgwMCwgMHgzQTAwLCAweDNDMDAsIDB4M0UwMCwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KKwl7QkNOX09GRlNFVDAsIDB4ZWNlOGU0ZTB9LAkvKiAweDM4MDAsIDB4M0EwMCwgMHgzQzAwLCAweDNFMDAsIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCisJe0JDTl9PRkZTRVQxLCAweGZjZjhmNGYwfSwJLyogMHgzODAwLCAweDNBMDAsIDB4M0MwMCwgMHgzRTAwLCA1MTJCIGZvciBlYWNoIGJlYWNvbiAqLwogI2Vsc2UKLSAgICAjZXJyb3IgWW91IG11c3QgcmUtY2FsY3VsYXRlIG5ldyB2YWx1ZSBmb3IgQkNOX09GRlNFVDAgJiBCQ05fT0ZGU0VUMSBpbiBNQUNSZWdUYWJsZVtdISEhCi0jZW5kaWYgLy8gSFdfQkVBQ09OX09GRlNFVCAvLworI2Vycm9yIFlvdSBtdXN0IHJlLWNhbGN1bGF0ZSBuZXcgdmFsdWUgZm9yIEJDTl9PRkZTRVQwICYgQkNOX09GRlNFVDEgaW4gTUFDUmVnVGFibGVbXSEKKyNlbmRpZiAvKiBIV19CRUFDT05fT0ZGU0VUIC8vICovCiAKLQl7TEVHQUNZX0JBU0lDX1JBVEUsCQkweDAwMDAwMTNmfSwgLy8gIEJhc2ljIHJhdGUgc2V0IGJpdG1hcAotCXtIVF9CQVNJQ19SQVRFLAkJMHgwMDAwODAwM30sIC8vIEJhc2ljIEhUIHJhdGUgc2V0ICwgMjBNLCBNQ1M9MywgTU0uIEZvcm1hdCBpcyB0aGUgc2FtZSBhcyBpbiBUWFdJLgotCXtNQUNfU1lTX0NUUkwsCQkweDAwfSwgLy8gMHgxMDA0LCAsIGRlZmF1bHQgRGlzYWJsZSBSWAotCXtSWF9GSUxUUl9DRkcsCQkweDE3Zjk3fSwgLy8weDE0MDAgICwgUlggZmlsdGVyIGNvbnRyb2wsCi0Je0JLT0ZGX1NMT1RfQ0ZHLAkweDIwOX0sIC8vIGRlZmF1bHQgc2V0IHNob3J0IHNsb3QgdGltZSwgQ0NfREVMQVlfVElNRSBzaG91bGQgYmUgMgotCXtUWF9TV19DRkcwLAkJMHgwfSwgCQkvLyBHYXJ5LDIwMDgtMDUtMjEgZm9yIENXQyB0ZXN0Ci0Je1RYX1NXX0NGRzEsCQkweDgwNjA2fSwgLy8gR2FyeSwyMDA2LTA4LTIzCi0Je1RYX0xJTktfQ0ZHLAkJMHgxMDIwfSwJCS8vIEdhcnksMjAwNi0wOC0yMwotCXtUWF9USU1FT1VUX0NGRywJMHgwMDBhMjA5MH0sCS8vIENDSyBoYXMgc29tZSBwcm9ibGVtLiBTbyBpbmNyZWFzZSB0aW1pZW91dCB2YWx1ZS4gMjAwNi0xMC0wOS8vIE1BcnZlayBSVCAsIE1vZGlmeSBmb3IgMjg2MEUgLDIwMDctMDgtMDEKLQl7TUFYX0xFTl9DRkcsCQlNQVhfQUdHUkVHQVRJT05fU0laRSB8IDB4MDAwMDEwMDB9LAkvLyAweDMwMTgsIE1BWCBmcmFtZSBsZW5ndGguIE1heCBQU0RVID0gMTZrYnl0ZXMuCi0Je0xFRF9DRkcsCQkweDdmMDMxZTQ2fSwgLy8gR2FyeSwgMjAwNi0wOC0yMwotCXtQQkZfTUFYX1BDTlQsCQkJMHgxRjNGQkY5Rn0sIAkvLzB4MUYzZjdmOWZ9LAkJLy9KYW4sIDIwMDYvMDQvMjAKLQl7VFhfUlRZX0NGRywJCQkweDQ3ZDAxZjBmfSwJLy8gSmFuLCAyMDA2LzExLzE2LCBTZXQgVHhXSS0+QUNLID0wIGluIFByb2JlIFJzcCBNb2RpZnkgZm9yIDI4NjBFICwyMDA3LTA4LTAzCi0Je0FVVE9fUlNQX0NGRywJCQkweDAwMDAwMDEzfSwJLy8gSW5pdGlhbCBBdXRvX1Jlc3BvbmRlciwgYmVjYXVzZSBRQSB3aWxsIHR1cm4gb2ZmIEF1dG8tUmVzcG9uZGVyCi0Je0NDS19QUk9UX0NGRywJCQkweDA1NzQwMDAzIC8qMHgwMTc0MDAwMyovfSwJLy8gSW5pdGlhbCBBdXRvX1Jlc3BvbmRlciwgYmVjYXVzZSBRQSB3aWxsIHR1cm4gb2ZmIEF1dG8tUmVzcG9uZGVyLiBBbmQgUlRTIHRocmVzaG9sZCBpcyBlbmFibGVkLgotCXtPRkRNX1BST1RfQ0ZHLAkJCTB4MDU3NDAwMDMgLyoweDAxNzQwMDAzKi99LAkvLyBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIuIEFuZCBSVFMgdGhyZXNob2xkIGlzIGVuYWJsZWQuCi0vL1BTIHBhY2tldHMgdXNlIFR4MVEgKGZvciBIQ0NBKSB3aGVuIGRlcXVldWUgZnJvbSBQUyB1bmljYXN0IHF1ZXVlIChXaUZpIFdQQTIgTUE5X0RUMSBmb3IgTWFydmVsbCBCIFNUQSkKLSNpZmRlZiBSVDI4NzAKLQl7UEJGX0NGRywgCQkJCTB4ZjQwMDA2fSwgCQkvLyBPbmx5IGVuYWJsZSBRdWV1ZSAyCi0Je01NNDBfUFJPVF9DRkcsCQkJMHgzRjQ0MDg0fSwJCS8vIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlcgotCXtXUERNQV9HTE9fQ0ZHLAkJCTB4MDAwMDAwMzB9LAotI2VuZGlmIC8vIFJUMjg3MCAvLwotCXtHRjIwX1BST1RfQ0ZHLAkJCTB4MDE3NDQwMDR9LCAgICAvLyBzZXQgMTk6MTggLS0+IFNob3J0IE5BViBmb3IgTUlNTyBQUwotCXtHRjQwX1BST1RfQ0ZHLAkJCTB4MDNGNDQwODR9LAotCXtNTTIwX1BST1RfQ0ZHLAkJCTB4MDE3NDQwMDR9LAotI2lmZGVmIFJUMjg2MAotCXtNTTQwX1BST1RfQ0ZHLAkJCTB4MDNGNTQwODR9LAotI2VuZGlmCi0Je1RYT1BfQ1RSTF9DRkcsCQkJMHgwMDAwNTgzZiwgLyoweDAwMDAyNDNmKi8gLyoweDAwMDAyNGJmKi99LAkvL0V4dGVuc2lvbiBjaGFubmVsIGJhY2tvZmYuCi0Je1RYX1JUU19DRkcsCQkJMHgwMDA5MmIyMH0sCi0Je0VYUF9BQ0tfVElNRSwJCQkweDAwMjQwMGNhfSwJLy8gZGVmYXVsdCB2YWx1ZQotCXtUWE9QX0hMRFJfRVQsIAkJCTB4MDAwMDAwMDJ9LAorCXtMRUdBQ1lfQkFTSUNfUkFURSwgMHgwMDAwMDEzZn0sCS8qICBCYXNpYyByYXRlIHNldCBiaXRtYXAgKi8KKwl7SFRfQkFTSUNfUkFURSwgMHgwMDAwODAwM30sCS8qIEJhc2ljIEhUIHJhdGUgc2V0ICwgMjBNLCBNQ1M9MywgTU0uIEZvcm1hdCBpcyB0aGUgc2FtZSBhcyBpbiBUWFdJLiAqLworCXtNQUNfU1lTX0NUUkwsIDB4MDB9LAkvKiAweDEwMDQsICwgZGVmYXVsdCBEaXNhYmxlIFJYICovCisJe1JYX0ZJTFRSX0NGRywgMHgxN2Y5N30sCS8qMHgxNDAwICAsIFJYIGZpbHRlciBjb250cm9sLCAqLworCXtCS09GRl9TTE9UX0NGRywgMHgyMDl9LAkvKiBkZWZhdWx0IHNldCBzaG9ydCBzbG90IHRpbWUsIENDX0RFTEFZX1RJTUUgc2hvdWxkIGJlIDIgKi8KKwkvKntUWF9TV19DRkcwLCAgICAgICAgICAweDQwYTA2fSwgLy8gR2FyeSwyMDA2LTA4LTIzICovCisJe1RYX1NXX0NGRzAsIDB4MH0sCS8qIEdhcnksMjAwOC0wNS0yMSBmb3IgQ1dDIHRlc3QgKi8KKwl7VFhfU1dfQ0ZHMSwgMHg4MDYwNn0sCS8qIEdhcnksMjAwNi0wOC0yMyAqLworCXtUWF9MSU5LX0NGRywgMHgxMDIwfSwJLyogR2FyeSwyMDA2LTA4LTIzICovCisJLyp7VFhfVElNRU9VVF9DRkcsICAgICAgMHgwMDE4MjA5MH0sICAgIC8vIENDSyBoYXMgc29tZSBwcm9ibGVtLiBTbyBpbmNyZWFzZSB0aW1pZW91dCB2YWx1ZS4gMjAwNi0xMC0wOS8vIE1BcnZlayBSVCAqLworCXtUWF9USU1FT1VUX0NGRywgMHgwMDBhMjA5MH0sCS8qIENDSyBoYXMgc29tZSBwcm9ibGVtLiBTbyBpbmNyZWFzZSB0aW1pZW91dCB2YWx1ZS4gMjAwNi0xMC0wOS8vIE1BcnZlayBSVCAsIE1vZGlmeSBmb3IgMjg2MEUgLDIwMDctMDgtMDEgKi8KKwl7TUFYX0xFTl9DRkcsIE1BWF9BR0dSRUdBVElPTl9TSVpFIHwgMHgwMDAwMTAwMH0sCS8qIDB4MzAxOCwgTUFYIGZyYW1lIGxlbmd0aC4gTWF4IFBTRFUgPSAxNmtieXRlcy4gKi8KKwl7TEVEX0NGRywgMHg3ZjAzMWU0Nn0sCS8qIEdhcnksIDIwMDYtMDgtMjMgKi8KKworCXtQQkZfTUFYX1BDTlQsIDB4MUYzRkJGOUZ9LAkvKjB4MUYzZjdmOWZ9LCAgICAgICAgICAvL0phbiwgMjAwNi8wNC8yMCAqLworCisJe1RYX1JUWV9DRkcsIDB4NDdkMDFmMGZ9LAkvKiBKYW4sIDIwMDYvMTEvMTYsIFNldCBUeFdJLT5BQ0sgPTAgaW4gUHJvYmUgUnNwIE1vZGlmeSBmb3IgMjg2MEUgLDIwMDctMDgtMDMgKi8KKworCXtBVVRPX1JTUF9DRkcsIDB4MDAwMDAwMTN9LAkvKiBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIgKi8KKwl7Q0NLX1BST1RfQ0ZHLCAweDA1NzQwMDAzIC8qMHgwMTc0MDAwMyAqLyB9LAkvKiBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIuIEFuZCBSVFMgdGhyZXNob2xkIGlzIGVuYWJsZWQuICovCisJe09GRE1fUFJPVF9DRkcsIDB4MDU3NDAwMDMgLyoweDAxNzQwMDAzICovIH0sCS8qIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlci4gQW5kIFJUUyB0aHJlc2hvbGQgaXMgZW5hYmxlZC4gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKwl7UEJGX0NGRywgMHhmNDAwMDZ9LAkvKiBPbmx5IGVuYWJsZSBRdWV1ZSAyICovCisJe01NNDBfUFJPVF9DRkcsIDB4M0Y0NDA4NH0sCS8qIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlciAqLworCXtXUERNQV9HTE9fQ0ZHLCAweDAwMDAwMDMwfSwKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKwl7R0YyMF9QUk9UX0NGRywgMHgwMTc0NDAwNH0sCS8qIHNldCAxOToxOCAtLT4gU2hvcnQgTkFWIGZvciBNSU1PIFBTICovCisJe0dGNDBfUFJPVF9DRkcsIDB4MDNGNDQwODR9LAorCXtNTTIwX1BST1RfQ0ZHLCAweDAxNzQ0MDA0fSwKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwl7TU00MF9QUk9UX0NGRywgMHgwM0Y1NDA4NH0sCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisJe1RYT1BfQ1RSTF9DRkcsIDB4MDAwMDU4M2YsIC8qMHgwMDAwMjQzZiAqLy8qMHgwMDAwMjRiZiAqLyB9LAkvKkV4dGVuc2lvbiBjaGFubmVsIGJhY2tvZmYuICovCisJe1RYX1JUU19DRkcsIDB4MDAwOTJiMjB9LAorCXtFWFBfQUNLX1RJTUUsIDB4MDAyNDAwY2F9LAkvKiBkZWZhdWx0IHZhbHVlICovCisKKwl7VFhPUF9ITERSX0VULCAweDAwMDAwMDAyfSwKIAogCS8qIEplcnJ5IGNvbW1lbnRzIDIwMDgvMDEvMTY6IHdlIHVzZSBTSUZTID0gMTB1cyBpbiBDQ0sgZGVmYXVsdGx5LCBidXQgaXQgc2VlbXMgdGhhdCAxMHVzCi0JCWlzIHRvbyBzbWFsbCBmb3IgSU5URUwgMjIwMGJnIGNhcmQsIHNvIGluIE1CU1MgbW9kZSwgdGhlIGRlbHRhIHRpbWUgYmV0d2VlbiBiZWFjb24wCi0JCWFuZCBiZWFjb24xIGlzIFNJRlMgKDEwdXMpLCBzbyBpZiBJTlRFTCAyMjAwYmcgY2FyZCBjb25uZWN0cyB0byBCU1MwLCB0aGUgcGluZwotCQl3aWxsIGFsd2F5cyBsb3N0LiBTbyB3ZSBjaGFuZ2UgdGhlIFNJRlMgb2YgQ0NLIGZyb20gMTB1cyB0byAxNnVzLiAqLwotCXtYSUZTX1RJTUVfQ0ZHLAkJCTB4MzNhNDEwMTB9LAotCXtQV1JfUElOX0NGRywJCQkweDAwMDAwMDAzfSwJLy8gcGF0Y2ggZm9yIDI4ODAtRQorCSAgIGlzIHRvbyBzbWFsbCBmb3IgSU5URUwgMjIwMGJnIGNhcmQsIHNvIGluIE1CU1MgbW9kZSwgdGhlIGRlbHRhIHRpbWUgYmV0d2VlbiBiZWFjb24wCisJICAgYW5kIGJlYWNvbjEgaXMgU0lGUyAoMTB1cyksIHNvIGlmIElOVEVMIDIyMDBiZyBjYXJkIGNvbm5lY3RzIHRvIEJTUzAsIHRoZSBwaW5nCisJICAgd2lsbCBhbHdheXMgbG9zdC4gU28gd2UgY2hhbmdlIHRoZSBTSUZTIG9mIENDSyBmcm9tIDEwdXMgdG8gMTZ1cy4gKi8KKwl7WElGU19USU1FX0NGRywgMHgzM2E0MTAxMH0sCisJe1BXUl9QSU5fQ0ZHLCAweDAwMDAwMDAzfSwJLyogcGF0Y2ggZm9yIDI4ODAtRSAqLwogfTsKIAotUlRNUF9SRUdfUEFJUglTVEFNQUNSZWdUYWJsZVtdID0JewotCXtXTU1fQUlGU05fQ0ZHLAkJMHgwMDAwMjI3M30sCi0Je1dNTV9DV01JTl9DRkcsCTB4MDAwMDIzNDR9LAotCXtXTU1fQ1dNQVhfQ0ZHLAkweDAwMDAzNGFhfSwKK3N0cnVjdCBydF9ydG1wX3JlZ19wYWlyIFNUQU1BQ1JlZ1RhYmxlW10gPSB7CisJe1dNTV9BSUZTTl9DRkcsIDB4MDAwMDIyNzN9LAorCXtXTU1fQ1dNSU5fQ0ZHLCAweDAwMDAyMzQ0fSwKKwl7V01NX0NXTUFYX0NGRywgMHgwMDAwMzRhYX0sCiB9OwogCi0jZGVmaW5lCU5VTV9NQUNfUkVHX1BBUk1TCQkoc2l6ZW9mKE1BQ1JlZ1RhYmxlKSAvIHNpemVvZihSVE1QX1JFR19QQUlSKSkKLSNkZWZpbmUJTlVNX1NUQV9NQUNfUkVHX1BBUk1TCShzaXplb2YoU1RBTUFDUmVnVGFibGUpIC8gc2l6ZW9mKFJUTVBfUkVHX1BBSVIpKQotCi0jaWZkZWYgUlQyODcwCi0vLwotLy8gUlQyODcwIEZpcm13YXJlIFNwZWMgb25seSB1c2VkIDEgb2N0IGZvciB2ZXJzaW9uIGV4cHJlc3Npb24KLS8vCi0jZGVmaW5lIEZJUk1XQVJFX01JTk9SX1ZFUlNJT04JNwotCi0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLS8vIE5ldyA4ayBieXRlIGZpcm13YXJlIHNpemUgZm9yIFJUMzA3MS9SVDMwNzIKLSNkZWZpbmUgRklSTVdBUkVJTUFHRV9NQVhfTEVOR1RICTB4MjAwMAotI2RlZmluZSBGSVJNV0FSRUlNQUdFX0xFTkdUSAkJKHNpemVvZiAoRmlybXdhcmVJbWFnZSkgLyBzaXplb2YoVUNIQVIpKQotI2RlZmluZSBGSVJNV0FSRV9NQUpPUl9WRVJTSU9OCTAKLQotI2RlZmluZSBGSVJNV0FSRUlNQUdFVjFfTEVOR1RICTB4MTAwMAotI2RlZmluZSBGSVJNV0FSRUlNQUdFVjJfTEVOR1RICTB4MTAwMAotCi0jaWZkZWYgUlQyODYwCi0jZGVmaW5lIEZJUk1XQVJFX01JTk9SX1ZFUlNJT04JMgotI2VuZGlmCi0KKyNkZWZpbmUJTlVNX01BQ19SRUdfUEFSTVMJCShzaXplb2YoTUFDUmVnVGFibGUpIC8gc2l6ZW9mKHN0cnVjdCBydF9ydG1wX3JlZ19wYWlyKSkKKyNkZWZpbmUJTlVNX1NUQV9NQUNfUkVHX1BBUk1TCShzaXplb2YoU1RBTUFDUmVnVGFibGUpIC8gc2l6ZW9mKHN0cnVjdCBydF9ydG1wX3JlZ19wYWlyKSkKIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUFsbG9jYXRlIFJUTVBfQURBUFRFUiBkYXRhIGJsb2NrIGFuZCBkbyBzb21lIGluaXRpYWxpemF0aW9uCisJCUFsbG9jYXRlIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgZGF0YSBibG9jayBhbmQgZG8gc29tZSBpbml0aWFsaXphdGlvbgogCiAJQXJndW1lbnRzOgogCQlBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCkBAIC0yMTMsNDggKzE1Miw0OCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTkRJU19TVEFUVVMJUlRNUEFsbG9jQWRhcHRlckJsb2NrKAotCUlOICBQVk9JRAloYW5kbGUsCi0JT1VUCVBSVE1QX0FEQVBURVIJKnBwQWRhcHRlcikKK2ludCBSVE1QQWxsb2NBZGFwdGVyQmxvY2sodm9pZCAqaGFuZGxlLAorCQkJCSAgc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqICogcHBBZGFwdGVyKQogewotCVBSVE1QX0FEQVBURVIJcEFkOwotCU5ESVNfU1RBVFVTCQlTdGF0dXM7Ci0JSU5UIAkJCWluZGV4OwotCVVDSEFSCQkJKnBCZWFjb25CdWYgPSBOVUxMOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlpbnQgU3RhdHVzOworCWludCBpbmRleDsKKwl1OCAqcEJlYWNvbkJ1ZiA9IE5VTEw7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gUlRNUEFsbG9jQWRhcHRlckJsb2NrXG4iKSk7CiAKIAkqcHBBZGFwdGVyID0gTlVMTDsKIAotCWRvCi0JewotCQkvLyBBbGxvY2F0ZSBSVE1QX0FEQVBURVIgbWVtb3J5IGJsb2NrCisJZG8geworCQkvKiBBbGxvY2F0ZSBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyIG1lbW9yeSBibG9jayAqLwogCQlwQmVhY29uQnVmID0ga21hbGxvYyhNQVhfQkVBQ09OX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKLQkJaWYgKHBCZWFjb25CdWYgPT0gTlVMTCkKLQkJeworCQlpZiAocEJlYWNvbkJ1ZiA9PSBOVUxMKSB7CiAJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwogCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAtIEJlYWNvbkJ1ZiFcbiIpKTsKIAkJCWJyZWFrOwogCQl9CisJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25CdWYsIE1BWF9CRUFDT05fU0laRSk7CiAKLQkJU3RhdHVzID0gQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoaGFuZGxlLCAoUFZPSUQgKikmcEFkKTsKLQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7CisJCVN0YXR1cyA9IEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KGhhbmRsZSwgKHZvaWQgKiopICYgcEFkKTsKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CiAJCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IC0gQURBUFRFUlxuIikpOwogCQkJYnJlYWs7CiAJCX0KIAkJcEFkLT5CZWFjb25CdWYgPSBwQmVhY29uQnVmOwotCQlwcmludGsoIlxuXG49PT0gcEFkID0gJXAsIHNpemUgPSAlZCA9PT1cblxuIiwgcEFkLCAoVUlOVDMyKXNpemVvZihSVE1QX0FEQVBURVIpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLAorCQkJICgiPT09IHBBZCA9ICVwLCBzaXplID0gJWQgPT09XG4iLCBwQWQsCisJCQkgICh1MzIpc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIpKSk7CiAKLQotCQkvLyBJbml0IHNwaW4gbG9ja3MKKwkJLyogSW5pdCBzcGluIGxvY2tzICovCiAJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7Ci0jaWZkZWYgUlQyODYwCisjaWZkZWYgUlRNUF9NQUNfUENJCiAJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPlJ4UmluZ0xvY2spOwotI2VuZGlmCisjaWZkZWYgUlQzMDkwCisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1jdUNtZExvY2spOworI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0JCWZvciAoaW5kZXggPTAgOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKQotCQl7CisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKSB7CiAJCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5UeFN3UXVldWVMb2NrW2luZGV4XSk7CiAJCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5EZVF1ZXVlTG9ja1tpbmRleF0pOwogCQkJcEFkLT5EZVF1ZXVlUnVubmluZ1tpbmRleF0gPSBGQUxTRTsKQEAgLTI5MSw1MTggKzIzMCwxOTkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRNUFJlYWRUeFB3clBlclJhdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUTVBSZWFkVHhQd3JQZXJSYXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlVTE9ORwkJZGF0YSwgQWRhdGEsIEdkYXRhOwotCVVTSE9SVAkJaSwgdmFsdWUsIHZhbHVlMjsKLQlJTlQJCQlBcHdyZGVsdGEsIEdwd3JkZWx0YTsKLQlVQ0hBUgkJdDEsdDIsdDMsdDQ7Ci0JQk9PTEVBTgkJYlZhbGlkLCBiQXB3cmRlbHRhTWludXMgPSBUUlVFLCBiR3B3cmRlbHRhTWludXMgPSBUUlVFOworCXVuc2lnbmVkIGxvbmcgZGF0YSwgQWRhdGEsIEdkYXRhOworCXUxNiBpLCB2YWx1ZSwgdmFsdWUyOworCWludCBBcHdyZGVsdGEsIEdwd3JkZWx0YTsKKwl1OCB0MSwgdDIsIHQzLCB0NDsKKwlCT09MRUFOIGJBcHdyZGVsdGFNaW51cyA9IFRSVUUsIGJHcHdyZGVsdGFNaW51cyA9IFRSVUU7CiAKLQkvLwotCS8vIEdldCBwb3dlciBkZWx0YSBmb3IgMjBNSHogYW5kIDQwTUh6LgotCS8vCisJLyogKi8KKwkvKiBHZXQgcG93ZXIgZGVsdGEgZm9yIDIwTUh6IGFuZCA0ME1Iei4gKi8KKwkvKiAqLwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4cG93ZXIgcGVyIFJhdGVcbiIpKTsKIAlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0RFTFRBLCB2YWx1ZTIpOwogCUFwd3JkZWx0YSA9IDA7CiAJR3B3cmRlbHRhID0gMDsKIAotCWlmICgodmFsdWUyICYgMHhmZikgIT0gMHhmZikKLQl7CisJaWYgKCh2YWx1ZTIgJiAweGZmKSAhPSAweGZmKSB7CiAJCWlmICgodmFsdWUyICYgMHg4MCkpCi0JCQlHcHdyZGVsdGEgPSAodmFsdWUyJjB4Zik7CisJCQlHcHdyZGVsdGEgPSAodmFsdWUyICYgMHhmKTsKIAogCQlpZiAoKHZhbHVlMiAmIDB4NDApKQogCQkJYkdwd3JkZWx0YU1pbnVzID0gRkFMU0U7CiAJCWVsc2UKIAkJCWJHcHdyZGVsdGFNaW51cyA9IFRSVUU7CiAJfQotCWlmICgodmFsdWUyICYgMHhmZjAwKSAhPSAweGZmMDApCi0JeworCWlmICgodmFsdWUyICYgMHhmZjAwKSAhPSAweGZmMDApIHsKIAkJaWYgKCh2YWx1ZTIgJiAweDgwMDApKQotCQkJQXB3cmRlbHRhID0gKCh2YWx1ZTImMHhmMDApPj44KTsKKwkJCUFwd3JkZWx0YSA9ICgodmFsdWUyICYgMHhmMDApID4+IDgpOwogCiAJCWlmICgodmFsdWUyICYgMHg0MDAwKSkKIAkJCWJBcHdyZGVsdGFNaW51cyA9IEZBTFNFOwogCQllbHNlCiAJCQliQXB3cmRlbHRhTWludXMgPSBUUlVFOwogCX0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHcHdyZGVsdGEgPSAleCwgQXB3cmRlbHRhID0gJXggLlxuIiwgR3B3cmRlbHRhLCBBcHdyZGVsdGEpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiR3B3cmRlbHRhID0gJXgsIEFwd3JkZWx0YSA9ICV4IC5cbiIsIEdwd3JkZWx0YSwgQXB3cmRlbHRhKSk7CiAKLQkvLwotCS8vIEdldCBUeHBvd2VyIHBlciBNQ1MgZm9yIDIwTUh6IGluIDIuNEcuCi0JLy8KLQlmb3IgKGk9MDsgaTw1OyBpKyspCi0JewotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl8yXzRHICsgaSo0LCB2YWx1ZSk7CisJLyogKi8KKwkvKiBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciAyME1IeiBpbiAyLjRHLiAqLworCS8qICovCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsCisJCQkJICAgICBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RyArIGkgKiA0LAorCQkJCSAgICAgdmFsdWUpOwogCQlkYXRhID0gdmFsdWU7Ci0JCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCi0JCXsKLQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpIHsKKwkJCXQxID0gKHZhbHVlICYgMHhmKSArIChBcHdyZGVsdGEpOwogCQkJaWYgKHQxID4gMHhmKQogCQkJCXQxID0gMHhmOwotCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCXQyID0gKCh2YWx1ZSAmIDB4ZjApID4+IDQpICsgKEFwd3JkZWx0YSk7CiAJCQlpZiAodDIgPiAweGYpCiAJCQkJdDIgPSAweGY7Ci0JCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKKwkJCXQzID0gKCh2YWx1ZSAmIDB4ZjAwKSA+PiA4KSArIChBcHdyZGVsdGEpOwogCQkJaWYgKHQzID4gMHhmKQogCQkJCXQzID0gMHhmOwotCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCXQ0ID0gKCh2YWx1ZSAmIDB4ZjAwMCkgPj4gMTIpICsgKEFwd3JkZWx0YSk7CiAJCQlpZiAodDQgPiAweGYpCiAJCQkJdDQgPSAweGY7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCi0JCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJfSBlbHNlIHsKKwkJCWlmICgodmFsdWUgJiAweGYpID4gQXB3cmRlbHRhKQorCQkJCXQxID0gKHZhbHVlICYgMHhmKSAtIChBcHdyZGVsdGEpOwogCQkJZWxzZQogCQkJCXQxID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKLQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShBcHdyZGVsdGEpOworCQkJaWYgKCgodmFsdWUgJiAweGYwKSA+PiA0KSA+IEFwd3JkZWx0YSkKKwkJCQl0MiA9ICgodmFsdWUgJiAweGYwKSA+PiA0KSAtIChBcHdyZGVsdGEpOwogCQkJZWxzZQogCQkJCXQyID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBBcHdyZGVsdGEpCi0JCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQlpZiAoKCh2YWx1ZSAmIDB4ZjAwKSA+PiA4KSA+IEFwd3JkZWx0YSkKKwkJCQl0MyA9ICgodmFsdWUgJiAweGYwMCkgPj4gOCkgLSAoQXB3cmRlbHRhKTsKIAkJCWVsc2UKIAkJCQl0MyA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCi0JCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKKwkJCWlmICgoKHZhbHVlICYgMHhmMDAwKSA+PiAxMikgPiBBcHdyZGVsdGEpCisJCQkJdDQgPSAoKHZhbHVlICYgMHhmMDAwKSA+PiAxMikgLSAoQXB3cmRlbHRhKTsKIAkJCWVsc2UKIAkJCQl0NCA9IDA7CiAJCX0KLQkJQWRhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7Ci0JCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpCi0JCXsKLQkJCXQxID0gKHZhbHVlJjB4ZikrKEdwd3JkZWx0YSk7CisJCUFkYXRhID0gdDEgKyAodDIgPDwgNCkgKyAodDMgPDwgOCkgKyAodDQgPDwgMTIpOworCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKSB7CisJCQl0MSA9ICh2YWx1ZSAmIDB4ZikgKyAoR3B3cmRlbHRhKTsKIAkJCWlmICh0MSA+IDB4ZikKIAkJCQl0MSA9IDB4ZjsKLQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEdwd3JkZWx0YSk7CisJCQl0MiA9ICgodmFsdWUgJiAweGYwKSA+PiA0KSArIChHcHdyZGVsdGEpOwogCQkJaWYgKHQyID4gMHhmKQogCQkJCXQyID0gMHhmOwotCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEdwd3JkZWx0YSk7CisJCQl0MyA9ICgodmFsdWUgJiAweGYwMCkgPj4gOCkgKyAoR3B3cmRlbHRhKTsKIAkJCWlmICh0MyA+IDB4ZikKIAkJCQl0MyA9IDB4ZjsKLQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEdwd3JkZWx0YSk7CisJCQl0NCA9ICgodmFsdWUgJiAweGYwMDApID4+IDEyKSArIChHcHdyZGVsdGEpOwogCQkJaWYgKHQ0ID4gMHhmKQogCQkJCXQ0ID0gMHhmOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKCh2YWx1ZSYweGYpID4gR3B3cmRlbHRhKQotCQkJCXQxID0gKHZhbHVlJjB4ZiktKEdwd3JkZWx0YSk7CisJCX0gZWxzZSB7CisJCQlpZiAoKHZhbHVlICYgMHhmKSA+IEdwd3JkZWx0YSkKKwkJCQl0MSA9ICh2YWx1ZSAmIDB4ZikgLSAoR3B3cmRlbHRhKTsKIAkJCWVsc2UKIAkJCQl0MSA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBHcHdyZGVsdGEpCi0JCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oR3B3cmRlbHRhKTsKKwkJCWlmICgoKHZhbHVlICYgMHhmMCkgPj4gNCkgPiBHcHdyZGVsdGEpCisJCQkJdDIgPSAoKHZhbHVlICYgMHhmMCkgPj4gNCkgLSAoR3B3cmRlbHRhKTsKIAkJCWVsc2UKIAkJCQl0MiA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gR3B3cmRlbHRhKQotCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShHcHdyZGVsdGEpOworCQkJaWYgKCgodmFsdWUgJiAweGYwMCkgPj4gOCkgPiBHcHdyZGVsdGEpCisJCQkJdDMgPSAoKHZhbHVlICYgMHhmMDApID4+IDgpIC0gKEdwd3JkZWx0YSk7CiAJCQllbHNlCiAJCQkJdDMgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gR3B3cmRlbHRhKQotCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7CisJCQlpZiAoKCh2YWx1ZSAmIDB4ZjAwMCkgPj4gMTIpID4gR3B3cmRlbHRhKQorCQkJCXQ0ID0gKCh2YWx1ZSAmIDB4ZjAwMCkgPj4gMTIpIC0gKEdwd3JkZWx0YSk7CiAJCQllbHNlCiAJCQkJdDQgPSAwOwogCQl9Ci0JCUdkYXRhID0gdDEgKyAodDI8PDQpICsgKHQzPDw4KSArICh0NDw8MTIpOworCQlHZGF0YSA9IHQxICsgKHQyIDw8IDQpICsgKHQzIDw8IDgpICsgKHQ0IDw8IDEyKTsKIAotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl8yXzRHICsgaSo0ICsgMiwgdmFsdWUpOwotCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQotCQl7Ci0JCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsCisJCQkJICAgICBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RyArIGkgKiA0ICsKKwkJCQkgICAgIDIsIHZhbHVlKTsKKwkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkgeworCQkJdDEgPSAodmFsdWUgJiAweGYpICsgKEFwd3JkZWx0YSk7CiAJCQlpZiAodDEgPiAweGYpCiAJCQkJdDEgPSAweGY7Ci0JCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJdDIgPSAoKHZhbHVlICYgMHhmMCkgPj4gNCkgKyAoQXB3cmRlbHRhKTsKIAkJCWlmICh0MiA+IDB4ZikKIAkJCQl0MiA9IDB4ZjsKLQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOworCQkJdDMgPSAoKHZhbHVlICYgMHhmMDApID4+IDgpICsgKEFwd3JkZWx0YSk7CiAJCQlpZiAodDMgPiAweGYpCiAJCQkJdDMgPSAweGY7Ci0JCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJdDQgPSAoKHZhbHVlICYgMHhmMDAwKSA+PiAxMikgKyAoQXB3cmRlbHRhKTsKIAkJCWlmICh0NCA+IDB4ZikKIAkJCQl0NCA9IDB4ZjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKLQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOworCQl9IGVsc2UgeworCQkJaWYgKCh2YWx1ZSAmIDB4ZikgPiBBcHdyZGVsdGEpCisJCQkJdDEgPSAodmFsdWUgJiAweGYpIC0gKEFwd3JkZWx0YSk7CiAJCQllbHNlCiAJCQkJdDEgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQotCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQlpZiAoKCh2YWx1ZSAmIDB4ZjApID4+IDQpID4gQXB3cmRlbHRhKQorCQkJCXQyID0gKCh2YWx1ZSAmIDB4ZjApID4+IDQpIC0gKEFwd3JkZWx0YSk7CiAJCQllbHNlCiAJCQkJdDIgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKLQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCWlmICgoKHZhbHVlICYgMHhmMDApID4+IDgpID4gQXB3cmRlbHRhKQorCQkJCXQzID0gKCh2YWx1ZSAmIDB4ZjAwKSA+PiA4KSAtIChBcHdyZGVsdGEpOwogCQkJZWxzZQogCQkJCXQzID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEFwd3JkZWx0YSkKLQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJaWYgKCgodmFsdWUgJiAweGYwMDApID4+IDEyKSA+IEFwd3JkZWx0YSkKKwkJCQl0NCA9ICgodmFsdWUgJiAweGYwMDApID4+IDEyKSAtIChBcHdyZGVsdGEpOwogCQkJZWxzZQogCQkJCXQ0ID0gMDsKIAkJfQotCQlBZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOwotCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQotCQl7Ci0JCQl0MSA9ICh2YWx1ZSYweGYpKyhHcHdyZGVsdGEpOworCQlBZGF0YSB8PSAoKHQxIDw8IDE2KSArICh0MiA8PCAyMCkgKyAodDMgPDwgMjQpICsgKHQ0IDw8IDI4KSk7CisJCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpIHsKKwkJCXQxID0gKHZhbHVlICYgMHhmKSArIChHcHdyZGVsdGEpOwogCQkJaWYgKHQxID4gMHhmKQogCQkJCXQxID0gMHhmOwotCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoR3B3cmRlbHRhKTsKKwkJCXQyID0gKCh2YWx1ZSAmIDB4ZjApID4+IDQpICsgKEdwd3JkZWx0YSk7CiAJCQlpZiAodDIgPiAweGYpCiAJCQkJdDIgPSAweGY7Ci0JCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoR3B3cmRlbHRhKTsKKwkJCXQzID0gKCh2YWx1ZSAmIDB4ZjAwKSA+PiA4KSArIChHcHdyZGVsdGEpOwogCQkJaWYgKHQzID4gMHhmKQogCQkJCXQzID0gMHhmOwotCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoR3B3cmRlbHRhKTsKKwkJCXQ0ID0gKCh2YWx1ZSAmIDB4ZjAwMCkgPj4gMTIpICsgKEdwd3JkZWx0YSk7CiAJCQlpZiAodDQgPiAweGYpCiAJCQkJdDQgPSAweGY7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoKHZhbHVlJjB4ZikgPiBHcHdyZGVsdGEpCi0JCQkJdDEgPSAodmFsdWUmMHhmKS0oR3B3cmRlbHRhKTsKKwkJfSBlbHNlIHsKKwkJCWlmICgodmFsdWUgJiAweGYpID4gR3B3cmRlbHRhKQorCQkJCXQxID0gKHZhbHVlICYgMHhmKSAtIChHcHdyZGVsdGEpOwogCQkJZWxzZQogCQkJCXQxID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKLQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOworCQkJaWYgKCgodmFsdWUgJiAweGYwKSA+PiA0KSA+IEdwd3JkZWx0YSkKKwkJCQl0MiA9ICgodmFsdWUgJiAweGYwKSA+PiA0KSAtIChHcHdyZGVsdGEpOwogCQkJZWxzZQogCQkJCXQyID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCi0JCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEdwd3JkZWx0YSk7CisJCQlpZiAoKCh2YWx1ZSAmIDB4ZjAwKSA+PiA4KSA+IEdwd3JkZWx0YSkKKwkJCQl0MyA9ICgodmFsdWUgJiAweGYwMCkgPj4gOCkgLSAoR3B3cmRlbHRhKTsKIAkJCWVsc2UKIAkJCQl0MyA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBHcHdyZGVsdGEpCi0JCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oR3B3cmRlbHRhKTsKKwkJCWlmICgoKHZhbHVlICYgMHhmMDAwKSA+PiAxMikgPiBHcHdyZGVsdGEpCisJCQkJdDQgPSAoKHZhbHVlICYgMHhmMDAwKSA+PiAxMikgLSAoR3B3cmRlbHRhKTsKIAkJCWVsc2UKIAkJCQl0NCA9IDA7CiAJCX0KLQkJR2RhdGEgfD0gKCh0MTw8MTYpICsgKHQyPDwyMCkgKyAodDM8PDI0KSArICh0NDw8MjgpKTsKLQkJZGF0YSB8PSAodmFsdWU8PDE2KTsKKwkJR2RhdGEgfD0gKCh0MSA8PCAxNikgKyAodDIgPDwgMjApICsgKHQzIDw8IDI0KSArICh0NCA8PCAyOCkpOworCQlkYXRhIHw9ICh2YWx1ZSA8PCAxNik7CiAKLQkJcEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2ldID0gQWRhdGE7Ci0JCXBBZC0+VHgyME1Qd3JDZmdHQmFuZFtpXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpXSA9IEdkYXRhOworCQkvKiBGb3IgMjBNLzQwTSBQb3dlciBEZWx0YSBpc3N1ZSAqLworCQlwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0gPSBkYXRhOworCQlwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbaV0gPSBkYXRhOworCQlwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaV0gPSBBZGF0YTsKKwkJcEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2ldID0gR2RhdGE7CiAKIAkJaWYgKGRhdGEgIT0gMHhmZmZmZmZmZikKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgZGF0YSk7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIyME1IeiBCVywgMi40RyBiYW5kLSVseCwgIEFkYXRhID0gJWx4LCAgR2RhdGEgPSAlbHggXG4iLCBkYXRhLCBBZGF0YSwgR2RhdGEpKTsKLQl9Ci0KLQkvLwotCS8vIENoZWNrIHRoaXMgYmxvY2sgaXMgdmFsaWQgZm9yIDQwTUh6IGluIDIuNEcuIElmIGludmFsaWQsIHVzZSBwYXJhbWV0ZXIgZm9yIDIwTUh6IGluIDIuNEcKLQkvLwotCWJWYWxpZCA9IFRSVUU7Ci0JZm9yIChpPTA7IGk8NjsgaSsrKQotCXsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfMl80RyArIDIgKyBpKjIsIHZhbHVlKTsKLQkJaWYgKCgodmFsdWUgJiAweDAwRkYpID09IDB4MDBGRikgfHwgKCh2YWx1ZSAmIDB4RkYwMCkgPT0gMHhGRjAwKSkKLQkJewotCQkJYlZhbGlkID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8vCi0JLy8gR2V0IFR4cG93ZXIgcGVyIE1DUyBmb3IgNDBNSHogaW4gMi40Ry4KLQkvLwotCWlmIChiVmFsaWQpCi0JewotCQlmb3IgKGk9MDsgaTw0OyBpKyspCi0JCXsKLQkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzJfNEcgKyBpKjQsIHZhbHVlKTsKLQkJCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpCi0JCQl7Ci0JCQkJdDEgPSAodmFsdWUmMHhmKSsoR3B3cmRlbHRhKTsKLQkJCQlpZiAodDEgPiAweGYpCi0JCQkJCXQxID0gMHhmOwotCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEdwd3JkZWx0YSk7Ci0JCQkJaWYgKHQyID4gMHhmKQotCQkJCQl0MiA9IDB4ZjsKLQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoR3B3cmRlbHRhKTsKLQkJCQlpZiAodDMgPiAweGYpCi0JCQkJCXQzID0gMHhmOwotCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEdwd3JkZWx0YSk7Ci0JCQkJaWYgKHQ0ID4gMHhmKQotCQkJCQl0NCA9IDB4ZjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoKHZhbHVlJjB4ZikgPiBHcHdyZGVsdGEpCi0JCQkJCXQxID0gKHZhbHVlJjB4ZiktKEdwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0MSA9IDA7Ci0JCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gR3B3cmRlbHRhKQotCQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDIgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCi0JCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShHcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDMgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEdwd3JkZWx0YSkKLQkJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oR3B3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQ0ID0gMDsKLQkJCX0KLQkJCUdkYXRhID0gdDEgKyAodDI8PDQpICsgKHQzPDw4KSArICh0NDw8MTIpOwotCi0JCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl8yXzRHICsgaSo0ICsgMiwgdmFsdWUpOwotCQkJaWYgKGJHcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKLQkJCXsKLQkJCQl0MSA9ICh2YWx1ZSYweGYpKyhHcHdyZGVsdGEpOwotCQkJCWlmICh0MSA+IDB4ZikKLQkJCQkJdDEgPSAweGY7Ci0JCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoR3B3cmRlbHRhKTsKLQkJCQlpZiAodDIgPiAweGYpCi0JCQkJCXQyID0gMHhmOwotCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhHcHdyZGVsdGEpOwotCQkJCWlmICh0MyA+IDB4ZikKLQkJCQkJdDMgPSAweGY7Ci0JCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoR3B3cmRlbHRhKTsKLQkJCQlpZiAodDQgPiAweGYpCi0JCQkJCXQ0ID0gMHhmOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmICgodmFsdWUmMHhmKSA+IEdwd3JkZWx0YSkKLQkJCQkJdDEgPSAodmFsdWUmMHhmKS0oR3B3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQxID0gMDsKLQkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBHcHdyZGVsdGEpCi0JCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEdwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0MiA9IDA7Ci0JCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEdwd3JkZWx0YSkKLQkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEdwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0MyA9IDA7Ci0JCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gR3B3cmRlbHRhKQotCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShHcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDQgPSAwOwotCQkJfQotCQkJR2RhdGEgfD0gKCh0MTw8MTYpICsgKHQyPDwyMCkgKyAodDM8PDI0KSArICh0NDw8MjgpKTsKLQotCQkJaWYgKGkgPT0gMCkKLQkJCQlwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbaSsxXSA9IChwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbaSsxXSAmIDB4MDAwMEZGRkYpIHwgKEdkYXRhICYgMHhGRkZGMDAwMCk7Ci0JCQllbHNlCi0JCQkJcEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2krMV0gPSBHZGF0YTsKLQotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjQwTUh6IEJXLCAyLjRHIGJhbmQsIEdkYXRhID0gJWx4IFxuIiwgR2RhdGEpKTsKLQkJfQotCX0KLQotCS8vCi0JLy8gQ2hlY2sgdGhpcyBibG9jayBpcyB2YWxpZCBmb3IgMjBNSHogaW4gNUcuIElmIGludmFsaWQsIHVzZSBwYXJhbWV0ZXIgZm9yIDIwTUh6IGluIDIuNEcKLQkvLwotCWJWYWxpZCA9IFRSVUU7Ci0JZm9yIChpPTA7IGk8ODsgaSsrKQotCXsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcgKyAyICsgaSoyLCB2YWx1ZSk7Ci0JCWlmICgoKHZhbHVlICYgMHgwMEZGKSA9PSAweDAwRkYpIHx8ICgodmFsdWUgJiAweEZGMDApID09IDB4RkYwMCkpCi0JCXsKLQkJCWJWYWxpZCA9IEZBTFNFOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvLwotCS8vIEdldCBUeHBvd2VyIHBlciBNQ1MgZm9yIDIwTUh6IGluIDVHLgotCS8vCi0JaWYgKGJWYWxpZCkKLQl7Ci0JCWZvciAoaT0wOyBpPDU7IGkrKykKLQkJewotCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcgKyBpKjQsIHZhbHVlKTsKLQkJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCi0JCQl7Ci0JCQkJdDEgPSAodmFsdWUmMHhmKSsoQXB3cmRlbHRhKTsKLQkJCQlpZiAodDEgPiAweGYpCi0JCQkJCXQxID0gMHhmOwotCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQyID4gMHhmKQotCQkJCQl0MiA9IDB4ZjsKLQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKLQkJCQlpZiAodDMgPiAweGYpCi0JCQkJCXQzID0gMHhmOwotCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQ0ID4gMHhmKQotCQkJCQl0NCA9IDB4ZjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCi0JCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0MSA9IDA7Ci0JCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQotCQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShBcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDIgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBBcHdyZGVsdGEpCi0JCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShBcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDMgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEFwd3JkZWx0YSkKLQkJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQ0ID0gMDsKLQkJCX0KLQkJCUFkYXRhID0gdDEgKyAodDI8PDQpICsgKHQzPDw4KSArICh0NDw8MTIpOwotCi0JCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl81RyArIGkqNCArIDIsIHZhbHVlKTsKLQkJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCi0JCQl7Ci0JCQkJdDEgPSAodmFsdWUmMHhmKSsoQXB3cmRlbHRhKTsKLQkJCQlpZiAodDEgPiAweGYpCi0JCQkJCXQxID0gMHhmOwotCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQyID4gMHhmKQotCQkJCQl0MiA9IDB4ZjsKLQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKLQkJCQlpZiAodDMgPiAweGYpCi0JCQkJCXQzID0gMHhmOwotCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQ0ID4gMHhmKQotCQkJCQl0NCA9IDB4ZjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCi0JCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0MSA9IDA7Ci0JCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQotCQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShBcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDIgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBBcHdyZGVsdGEpCi0JCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShBcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDMgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEFwd3JkZWx0YSkKLQkJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQ0ID0gMDsKLQkJCX0KLQkJCUFkYXRhIHw9ICgodDE8PDE2KSArICh0Mjw8MjApICsgKHQzPDwyNCkgKyAodDQ8PDI4KSk7Ci0KLQkJCWlmIChpID09IDApCi0JCQkJcEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldID0gKHBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSAmIDB4MDAwMEZGRkYpIHwgKEFkYXRhICYgMHhGRkZGMDAwMCk7Ci0JCQllbHNlCi0JCQkJcEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldID0gQWRhdGE7Ci0KLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIyME1IeiBCVywgNUdIeiBiYW5kLCBBZGF0YSA9ICVseCBcbiIsIEFkYXRhKSk7Ci0JCX0KLQl9Ci0KLQkvLwotCS8vIENoZWNrIHRoaXMgYmxvY2sgaXMgdmFsaWQgZm9yIDQwTUh6IGluIDVHLiBJZiBpbnZhbGlkLCB1c2UgcGFyYW1ldGVyIGZvciAyME1IeiBpbiAyLjRHCi0JLy8KLQliVmFsaWQgPSBUUlVFOwotCWZvciAoaT0wOyBpPDY7IGkrKykKLQl7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzVHICsgMiArIGkqMiwgdmFsdWUpOwotCQlpZiAoKCh2YWx1ZSAmIDB4MDBGRikgPT0gMHgwMEZGKSB8fCAoKHZhbHVlICYgMHhGRjAwKSA9PSAweEZGMDApKQotCQl7Ci0JCQliVmFsaWQgPSBGQUxTRTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLy8KLQkvLyBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciA0ME1IeiBpbiA1Ry4KLQkvLwotCWlmIChiVmFsaWQpCi0JewotCQlmb3IgKGk9MDsgaTw0OyBpKyspCi0JCXsKLQkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzVHICsgaSo0LCB2YWx1ZSk7Ci0JCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQotCQkJewotCQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQxID4gMHhmKQotCQkJCQl0MSA9IDB4ZjsKLQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOwotCQkJCWlmICh0MiA+IDB4ZikKLQkJCQkJdDIgPSAweGY7Ci0JCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQzID4gMHhmKQotCQkJCQl0MyA9IDB4ZjsKLQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOwotCQkJCWlmICh0NCA+IDB4ZikKLQkJCQkJdDQgPSAweGY7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQotCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDEgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKLQkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQyID0gMDsKLQkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQotCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQzID0gMDsKLQkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCi0JCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0NCA9IDA7Ci0JCQl9Ci0JCQlBZGF0YSA9IHQxICsgKHQyPDw0KSArICh0Mzw8OCkgKyAodDQ8PDEyKTsKLQotCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfNUcgKyBpKjQgKyAyLCB2YWx1ZSk7Ci0JCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQotCQkJewotCQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQxID4gMHhmKQotCQkJCQl0MSA9IDB4ZjsKLQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOwotCQkJCWlmICh0MiA+IDB4ZikKLQkJCQkJdDIgPSAweGY7Ci0JCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQzID4gMHhmKQotCQkJCQl0MyA9IDB4ZjsKLQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOwotCQkJCWlmICh0NCA+IDB4ZikKLQkJCQkJdDQgPSAweGY7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQotCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDEgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKLQkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQyID0gMDsKLQkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQotCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQzID0gMDsKLQkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCi0JCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0NCA9IDA7Ci0JCQl9Ci0JCQlBZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOwotCi0JCQlpZiAoaSA9PSAwKQotCQkJCXBBZC0+VHg0ME1Qd3JDZmdBQmFuZFtpKzFdID0gKHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFtpKzFdICYgMHgwMDAwRkZGRikgfCAoQWRhdGEgJiAweEZGRkYwMDAwKTsKLQkJCWVsc2UKLQkJCQlwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaSsxXSA9IEFkYXRhOwotCi0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiNDBNSHogQlcsIDVHSHogYmFuZCwgQWRhdGEgPSAlbHggXG4iLCBBZGF0YSkpOwotCQl9CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpICogNCwgZGF0YSk7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCSAgICAgKCIyME1IeiBCVywgMi40RyBiYW5kLSVseCwgIEFkYXRhID0gJWx4LCAgR2RhdGEgPSAlbHggXG4iLAorCQkJICAgICAgZGF0YSwgQWRhdGEsIEdkYXRhKSk7CiAJfQogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTgyMSwyMyArNDQxLDIzIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBSZWFkQ2hhbm5lbFB3cigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgUlRNUFJlYWRDaGFubmVsUHdyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlVQ0hBUgkJCQlpLCBjaG9mZnNldDsKLQlFRVBST01fVFhfUFdSX1NUUlVDCSAgICBQb3dlcjsKLQlFRVBST01fVFhfUFdSX1NUUlVDCSAgICBQb3dlcjI7CisJdTggaSwgY2hvZmZzZXQ7CisJRUVQUk9NX1RYX1BXUl9TVFJVQyBQb3dlcjsKKwlFRVBST01fVFhfUFdSX1NUUlVDIFBvd2VyMjsKIAotCS8vIFJlYWQgVHggcG93ZXIgdmFsdWUgZm9yIGFsbCBjaGFubmVscwotCS8vIFZhbHVlIGZyb20gMSAtIDB4N2YuIERlZmF1bHQgdmFsdWUgaXMgMjQuCi0JLy8gUG93ZXIgdmFsdWUgOiAyLjRHIDB4MDAgKDApIH4gMHgxRiAoMzEpCi0JLy8gICAgICAgICAgICAgOiA1LjVHIDB4RjkgKC03KSB+IDB4MEYgKDE1KQorCS8qIFJlYWQgVHggcG93ZXIgdmFsdWUgZm9yIGFsbCBjaGFubmVscyAqLworCS8qIFZhbHVlIGZyb20gMSAtIDB4N2YuIERlZmF1bHQgdmFsdWUgaXMgMjQuICovCisJLyogUG93ZXIgdmFsdWUgOiAyLjRHIDB4MDAgKDApIH4gMHgxRiAoMzEpICovCisJLyogICAgICAgICAgICAgOiA1LjVHIDB4RjkgKC03KSB+IDB4MEYgKDE1KSAqLwogCi0JLy8gMC4gMTFiL2csIGNoMSAtIGNoIDE0Ci0JZm9yIChpID0gMDsgaSA8IDc7IGkrKykKLQl7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0dfVFhfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlci53b3JkKTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fR19UWDJfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlcjIud29yZCk7CisJLyogMC4gMTFiL2csIGNoMSAtIGNoIDE0ICovCisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9HX1RYX1BXUl9PRkZTRVQgKyBpICogMiwKKwkJCQkgICAgIFBvd2VyLndvcmQpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9HX1RYMl9QV1JfT0ZGU0VUICsgaSAqIDIsCisJCQkJICAgICBQb3dlcjIud29yZCk7CiAJCXBBZC0+VHhQb3dlcltpICogMl0uQ2hhbm5lbCA9IGkgKiAyICsgMTsKIAkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uQ2hhbm5lbCA9IGkgKiAyICsgMjsKIApAQCAtODYyLDEyNSArNDgyLDE0OSBAQAogCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOwogCX0KIAotCS8vIDEuIFUtTklJIGxvd2VyL21pZGRsZSBiYW5kOiAzNiwgMzgsIDQwOyA0NCwgNDYsIDQ4OyA1MiwgNTQsIDU2OyA2MCwgNjIsIDY0IChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopCi0JLy8gMS4xIEZpbGwgdXAgY2hhbm5lbAorCS8qIDEuIFUtTklJIGxvd2VyL21pZGRsZSBiYW5kOiAzNiwgMzgsIDQwOyA0NCwgNDYsIDQ4OyA1MiwgNTQsIDU2OyA2MCwgNjIsIDY0IChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopICovCisJLyogMS4xIEZpbGwgdXAgY2hhbm5lbCAqLwogCWNob2Zmc2V0ID0gMTQ7Ci0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQl7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAk9IDM2ICsgaSAqIDggKyAwOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsID0gMzYgKyBpICogOCArIDA7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CiAKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5DaGFubmVsCT0gMzYgKyBpICogOCArIDI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbCA9IDM2ICsgaSAqIDggKyAyOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwogCi0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uQ2hhbm5lbAk9IDM2ICsgaSAqIDggKyA0OwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwgPSAzNiArIGkgKiA4ICsgNDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKIAl9CiAKLQkvLyAxLjIgRmlsbCB1cCBwb3dlcgotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JewotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIud29yZCk7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIyLndvcmQpOworCS8qIDEuMiBGaWxsIHVwIHBvd2VyICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyBpICogMiwKKwkJCQkgICAgIFBvd2VyLndvcmQpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgaSAqIDIsCisJCQkJICAgICBQb3dlcjIud29yZCk7CiAKIAkJaWYgKChQb3dlci5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTAgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9CisJCQkgICAgUG93ZXIuZmllbGQuQnl0ZTA7CiAKIAkJaWYgKChQb3dlci5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTEgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlciA9CisJCQkgICAgUG93ZXIuZmllbGQuQnl0ZTE7CiAKIAkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0KKwkJCSAgICBQb3dlcjIuZmllbGQuQnl0ZTA7CiAKIAkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMSA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMTsKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0KKwkJCSAgICBQb3dlcjIuZmllbGQuQnl0ZTE7CiAJfQogCi0JLy8gMi4gSGlwcGVyTEFOIDIgMTAwLCAxMDIgLDEwNDsgMTA4LCAxMTAsIDExMjsgMTE2LCAxMTgsIDEyMDsgMTI0LCAxMjYsIDEyODsgMTMyLCAxMzQsIDEzNjsgMTQwIChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopCi0JLy8gMi4xIEZpbGwgdXAgY2hhbm5lbAorCS8qIDIuIEhpcHBlckxBTiAyIDEwMCwgMTAyICwxMDQ7IDEwOCwgMTEwLCAxMTI7IDExNiwgMTE4LCAxMjA7IDEyNCwgMTI2LCAxMjg7IDEzMiwgMTM0LCAxMzY7IDE0MCAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KSAqLworCS8qIDIuMSBGaWxsIHVwIGNoYW5uZWwgKi8KIAljaG9mZnNldCA9IDE0ICsgMTI7Ci0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLQl7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAk9IDEwMCArIGkgKiA4ICsgMDsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbCA9IDEwMCArIGkgKiA4ICsgMDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKIAotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLkNoYW5uZWwJPSAxMDAgKyBpICogOCArIDI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbCA9IDEwMCArIGkgKiA4ICsgMjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKIAotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwJPSAxMDAgKyBpICogOCArIDQ7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uQ2hhbm5lbCA9IDEwMCArIGkgKiA4ICsgNDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKIAl9Ci0JcEFkLT5UeFBvd2VyWzMgKiA1ICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCQk9IDE0MDsKLQlwQWQtPlR4UG93ZXJbMyAqIDUgKyBjaG9mZnNldCArIDBdLlBvd2VyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JcEFkLT5UeFBvd2VyWzMgKiA1ICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwlwQWQtPlR4UG93ZXJbMyAqIDUgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwgPSAxNDA7CisJcEFkLT5UeFBvd2VyWzMgKiA1ICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJcEFkLT5UeFBvd2VyWzMgKiA1ICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwogCi0JLy8gMi4yIEZpbGwgdXAgcG93ZXIKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCXsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIsIFBvd2VyLndvcmQpOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIsIFBvd2VyMi53b3JkKTsKKwkvKiAyLjIgRmlsbCB1cCBwb3dlciAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLAorCQkJCSAgICAgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArCisJCQkJICAgICBpICogMiwgUG93ZXIud29yZCk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwKKwkJCQkgICAgIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsKKwkJCQkgICAgIGkgKiAyLCBQb3dlcjIud29yZCk7CiAKIAkJaWYgKChQb3dlci5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTAgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9CisJCQkgICAgUG93ZXIuZmllbGQuQnl0ZTA7CiAKIAkJaWYgKChQb3dlci5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTEgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlciA9CisJCQkgICAgUG93ZXIuZmllbGQuQnl0ZTE7CiAKIAkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0KKwkJCSAgICBQb3dlcjIuZmllbGQuQnl0ZTA7CiAKIAkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMSA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMTsKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0KKwkJCSAgICBQb3dlcjIuZmllbGQuQnl0ZTE7CiAJfQogCi0JLy8gMy4gVS1OSUkgdXBwZXIgYmFuZDogMTQ5LCAxNTEsIDE1MzsgMTU3LCAxNTksIDE2MTsgMTY1IChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopCi0JLy8gMy4xIEZpbGwgdXAgY2hhbm5lbAorCS8qIDMuIFUtTklJIHVwcGVyIGJhbmQ6IDE0OSwgMTUxLCAxNTM7IDE1NywgMTU5LCAxNjE7IDE2NSwgMTY3LCAxNjk7IDE3MSwgMTczIChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopICovCisJLyogMy4xIEZpbGwgdXAgY2hhbm5lbCAqLwogCWNob2Zmc2V0ID0gMTQgKyAxMiArIDE2OwotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0JewotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJPSAxNDkgKyBpICogOCArIDA7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJLypmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsID0gMTQ5ICsgaSAqIDggKyAwOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwogCi0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbAk9IDE0OSArIGkgKiA4ICsgMjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5DaGFubmVsID0gMTQ5ICsgaSAqIDggKyAyOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwogCi0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uQ2hhbm5lbAk9IDE0OSArIGkgKiA4ICsgNDsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5DaGFubmVsID0gMTQ5ICsgaSAqIDggKyA0OworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwogCX0KLQlwQWQtPlR4UG93ZXJbMyAqIDIgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJCT0gMTY1OwotCXBBZC0+VHhQb3dlclszICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIJCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQlwQWQtPlR4UG93ZXJbMyAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCXBBZC0+VHhQb3dlclszICogMyArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbCA9IDE3MTsKKwlwQWQtPlR4UG93ZXJbMyAqIDMgKyBjaG9mZnNldCArIDBdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwlwQWQtPlR4UG93ZXJbMyAqIDMgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CiAKLQkvLyAzLjIgRmlsbCB1cCBwb3dlcgotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JewotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIud29yZCk7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIyLndvcmQpOworCXBBZC0+VHhQb3dlclszICogMyArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbCA9IDE3MzsKKwlwQWQtPlR4UG93ZXJbMyAqIDMgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwlwQWQtPlR4UG93ZXJbMyAqIDMgKyBjaG9mZnNldCArIDFdLlBvd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkvKiAzLjIgRmlsbCB1cCBwb3dlciAqLworCS8qZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwKKwkJCQkgICAgIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKworCQkJCSAgICAgaSAqIDIsIFBvd2VyLndvcmQpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsCisJCQkJICAgICBFRVBST01fQV9UWDJfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArCisJCQkJICAgICBpICogMiwgUG93ZXIyLndvcmQpOwogCiAJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPQorCQkJICAgIFBvd2VyLmZpZWxkLkJ5dGUwOwogCiAJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUxID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPQorCQkJICAgIFBvd2VyLmZpZWxkLkJ5dGUxOwogCiAJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUwIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTAgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTA7CisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9CisJCQkgICAgUG93ZXIyLmZpZWxkLkJ5dGUwOwogCiAJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTEgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7CisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyMiA9CisJCQkgICAgUG93ZXIyLmZpZWxkLkJ5dGUxOwogCX0KIAotCS8vIDQuIFByaW50IGFuZCBEZWJ1ZwotCWNob2Zmc2V0ID0gMTQgKyAxMiArIDE2ICsgNzsKKwkvKiA0LiBQcmludCBhbmQgRGVidWcgKi8KKwkvKmNob2Zmc2V0ID0gMTQgKyAxMiArIDE2ICsgNzsgKi8KKwljaG9mZnNldCA9IDE0ICsgMTIgKyAxNiArIDExOworCiB9CiAKIC8qCkBAIC0xMDA2LDI3OCArNjUwLDE0IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1ORElTX1NUQVRVUwlOSUNSZWFkUmVnUGFyYW1ldGVycygKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JTkRJU19IQU5ETEUJCQlXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQKLQkpCitpbnQgTklDUmVhZFJlZ1BhcmFtZXRlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSB2b2lkICpXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQpCiB7Ci0JTkRJU19TVEFUVVMJCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCURCR1BSSU5UX1MoU3RhdHVzLCAoIjwtLSBOSUNSZWFkUmVnUGFyYW1ldGVycywgU3RhdHVzPSV4XG4iLCBTdGF0dXMpKTsKIAlyZXR1cm4gU3RhdHVzOwogfQogCi0KLSNpZmRlZiBSVDI4NzAKLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlGb3IgUkYgZmlsdGVyIGNhbGlicmF0aW9uIHB1cnBvc2UKLQotCUFyZ3VtZW50czoKLQkJcEFkICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBGaWx0ZXJDYWxpYnJhdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVQ0hBUglSNTV4ID0gMCwgdmFsdWUsIEZpbHRlclRhcmdldCA9IDB4MUUsIEJCUFZhbHVlPTA7Ci0JVUlOVAlsb29wID0gMCwgY291bnQgPSAwLCBsb29wY250ID0gMCwgUmVUcnkgPSAwOwotCVVDSEFSCVJGX1IyNF9WYWx1ZSA9IDA7Ci0KLQkvLyBHaXZlIGJicCBmaWx0ZXIgaW5pdGlhbCB2YWx1ZQotI2lmbmRlZiBSVDI4NzAKLQlwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNCA9IDB4MTY7Ci0JcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQgPSAweDM2OyAgLy9CaXRbNV0gbXVzdCBiZSAxIGZvciBCVyA0MAotI2Vsc2UKLQlwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNCA9IDB4MUY7Ci0JcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQgPSAweDJGOyAvL0JpdFs1XSBtdXN0IGJlIDEgZm9yIEJXIDQwCi0jZW5kaWYKLQlkbwotCXsKLQkJaWYgKGxvb3AgPT0gMSkJLy9CYW5kV2lkdGggPSA0MCBNSHoKLQkJewotCQkJLy8gV3JpdGUgMHgyNyB0byBSRl9SMjQgdG8gcHJvZ3JhbSBmaWx0ZXIKLQkJCVJGX1IyNF9WYWx1ZSA9IDB4Mjc7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7Ci0JCQlpZiAoSVNfUlQzMDkwKHBBZCkpCi0JCQkJRmlsdGVyVGFyZ2V0ID0gMHgxNTsKLQkJCWVsc2UKLQkJCQlGaWx0ZXJUYXJnZXQgPSAweDE5OwotCi0JCQkvLyB3aGVuIGNhbGlicmF0ZSBCVzQwLCBCQlAgbWFzayBtdXN0IHNldCB0byBCVzQwLgotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwotCQkJQkJQVmFsdWUmPSAofjB4MTgpOwotCQkJQkJQVmFsdWV8PSAoMHgxMCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7Ci0jaWZkZWYgUlQyODcwCi0JCQkvLyBzZXQgdG8gQlc0MAotCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsICZ2YWx1ZSk7Ci0JCQl2YWx1ZSB8PSAweDIwOwotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCB2YWx1ZSk7Ci0jZW5kaWYKLQkJfQotCQllbHNlCQkJLy9CYW5kV2lkdGggPSAyMCBNSHoKLQkJewotCQkJLy8gV3JpdGUgMHgwNyB0byBSRl9SMjQgdG8gcHJvZ3JhbSBmaWx0ZXIKLQkJCVJGX1IyNF9WYWx1ZSA9IDB4MDc7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7Ci0JCQlpZiAoSVNfUlQzMDkwKHBBZCkpCi0JCQkJRmlsdGVyVGFyZ2V0ID0gMHgxMzsKLQkJCWVsc2UKLQkJCQlGaWx0ZXJUYXJnZXQgPSAweDE2OwotI2lmZGVmIFJUMjg3MAotCQkJLy8gc2V0IHRvIEJXMjAKLQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCAmdmFsdWUpOwotCQkJdmFsdWUgJj0gKH4weDIwKTsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgdmFsdWUpOwotI2VuZGlmCi0JCX0KLQotCQkvLyBXcml0ZSAweDAxIHRvIFJGX1IyMiB0byBlbmFibGUgYmFzZWJhbmQgbG9vcGJhY2sgbW9kZQotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgJnZhbHVlKTsKLQkJdmFsdWUgfD0gMHgwMTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIyLCB2YWx1ZSk7Ci0KLQkJLy8gV3JpdGUgMHgwMCB0byBCQlBfUjI0IHRvIHNldCBwb3dlciAmIGZyZXF1ZW5jeSBvZiBwYXNzYmFuZCB0ZXN0IHRvbmUKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIDApOwotCi0JCWRvCi0JCXsKLQkJCS8vIFdyaXRlIDB4OTAgdG8gQkJQX1IyNSB0byB0cmFuc21pdCB0ZXN0IHRvbmUKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI1LCAweDkwKTsKLQotCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJCS8vIFJlYWQgQkJQX1I1NVs2OjBdIGZvciByZWNlaXZlZCBwb3dlciwgc2V0IFI1NXggPSBCQlBfUjU1WzY6MF0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNTUsICZ2YWx1ZSk7Ci0JCQlSNTV4ID0gdmFsdWUgJiAweEZGOwotCi0JCX0gd2hpbGUgKChSZVRyeSsrIDwgMTAwKSAmJiAoUjU1eCA9PSAwKSk7Ci0KLQkJLy8gV3JpdGUgMHgwNiB0byBCQlBfUjI0IHRvIHNldCBwb3dlciAmIGZyZXF1ZW5jeSBvZiBzdG9wYmFuZCB0ZXN0IHRvbmUKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIDB4MDYpOwotCi0JCXdoaWxlKFRSVUUpCi0JCXsKLQkJCS8vIFdyaXRlIDB4OTAgdG8gQkJQX1IyNSB0byB0cmFuc21pdCB0ZXN0IHRvbmUKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI1LCAweDkwKTsKLQotCQkJLy9XZSBuZWVkIHRvIHdhaXQgZm9yIGNhbGlicmF0aW9uCi0JCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1NSwgJnZhbHVlKTsKLQkJCXZhbHVlICY9IDB4RkY7Ci0JCQlpZiAoKFI1NXggLSB2YWx1ZSkgPCBGaWx0ZXJUYXJnZXQpCi0JCQl7Ci0JCQkJUkZfUjI0X1ZhbHVlICsrOwotCQkJfQotCQkJZWxzZSBpZiAoKFI1NXggLSB2YWx1ZSkgPT0gRmlsdGVyVGFyZ2V0KQotCQkJewotCQkJCVJGX1IyNF9WYWx1ZSArKzsKLQkJCQljb3VudCArKzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLy8gcHJldmVudCBpbmZpbml0ZSBsb29wIGNhdXNlIGRyaXZlciBoYW5nLgotCQkJaWYgKGxvb3BjbnQrKyA+IDEwMCkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVE1QRmlsdGVyQ2FsaWJyYXRpb24gLSBjYW4ndCBmaW5kIGEgdmFsaWQgdmFsdWUsIGxvb3BjbnQ9JWQgc3RvcCBjYWxpYnJhdGluZyIsIGxvb3BjbnQpKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLy8gV3JpdGUgUkZfUjI0IHRvIHByb2dyYW0gZmlsdGVyCi0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7Ci0JCX0KLQotCQlpZiAoY291bnQgPiAwKQotCQl7Ci0JCQlSRl9SMjRfVmFsdWUgPSBSRl9SMjRfVmFsdWUgLSAoKGNvdW50KSA/ICgxKSA6ICgwKSk7Ci0JCX0KLQotCQkvLyBTdG9yZSBmb3IgZnV0dXJlIHVzYWdlCi0JCWlmIChsb29wY250IDwgMTAwKQotCQl7Ci0JCQlpZiAobG9vcCsrID09IDApCi0JCQl7Ci0JCQkJLy9CYW5kV2lkdGggPSAyMCBNSHoKLQkJCQlwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNCA9IChVQ0hBUilSRl9SMjRfVmFsdWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy9CYW5kV2lkdGggPSA0MCBNSHoKLQkJCQlwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNCA9IChVQ0hBUilSRl9SMjRfVmFsdWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJYnJlYWs7Ci0KLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOwotCi0JCS8vIHJlc2V0IGNvdW50Ci0JCWNvdW50ID0gMDsKLQl9IHdoaWxlKFRSVUUpOwotCi0JLy8KLQkvLyBTZXQgYmFjayB0byBpbml0aWFsIHN0YXRlCi0JLy8KLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgMCk7Ci0KLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgJnZhbHVlKTsKLQl2YWx1ZSAmPSB+KDB4MDEpOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgdmFsdWUpOwotCi0JLy8gc2V0IEJCUCBiYWNrIHRvIEJXMjAKLQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7Ci0JQkJQVmFsdWUmPSAofjB4MTgpOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBGaWx0ZXJDYWxpYnJhdGlvbiAtIENhbGlCVzIwUmZSMjQ9MHgleCwgQ2FsaUJXNDBSZlIyND0weCV4XG4iLCBwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNCwgcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQpKTsKLX0KLQotVk9JRCBOSUNJbml0UlQzMHh4UkZSZWdpc3RlcnMoSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JSU5UIGk7Ci0JLy8gRHJpdmVyIG11c3QgcmVhZCBFRVBST00gdG8gZ2V0IFJmSWNUeXBlIGJlZm9yZSBpbml0aWFsIFJGIHJlZ2lzdGVycwotCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotCWlmIChJU19SVDMwNzAocEFkKSB8fCBJU19SVDMwNzEocEFkKSkKLQl7Ci0JCS8vIEluaXQgUkYgY2FsaWJyYXRpb24KLQkJLy8gRHJpdmVyIHNob3VsZCB0b2dnbGUgUkYgUjMwIGJpdDcgYmVmb3JlIGluaXQgUkYgcmVnaXN0ZXJzCi0JCVVJTlQzMiBSZlJlZyA9IDA7Ci0JCVVJTlQzMiBkYXRhOwotCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoUFVDSEFSKSZSZlJlZyk7Ci0JCVJmUmVnIHw9IDB4ODA7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKFVDSEFSKVJmUmVnKTsKLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJUmZSZWcgJj0gMHg3RjsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoVUNIQVIpUmZSZWcpOwotCi0JCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JGX1JFR19QQVJNUzsgaSsrKQotCQl7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSVDMweHhfUkZSZWdUYWJsZVtpXS5SZWdpc3RlciwgUlQzMHh4X1JGUmVnVGFibGVbaV0uVmFsdWUpOwotCQl9Ci0KLQkJaWYgKElTX1JUMzA3MChwQWQpKQotCQl7Ci0JCQkvLyAgVXBkYXRlIE1BQyAweDA1RDQgZnJvbSAwMXh4eHh4eCB0byAwRHh4eHh4eCAodm9sdGFnZSAxLjJWIHRvIDEuMzVWKSBmb3IgUlQzMDcwIHRvIGltcHJvdmUgeWllbGQgcmF0ZQotCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBMRE9fQ0ZHMCwgJmRhdGEpOwotCQkJZGF0YSA9ICgoZGF0YSAmIDB4RjBGRkZGRkYpIHwgMHgwRDAwMDAwMCk7Ci0JCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBMRE9fQ0ZHMCwgZGF0YSk7Ci0JCX0KLQkJZWxzZSBpZiAoSVNfUlQzMDcxKHBBZCkpCi0JCXsKLQkJCS8vIERyaXZlciBzaG91bGQgc2V0IFJGIFI2IGJpdDYgb24gYmVmb3JlIGluaXQgUkYgcmVnaXN0ZXJzCi0JCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKFBVQ0hBUikmUmZSZWcpOwotCQkJUmZSZWcgfD0gMHg0MDsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKFVDSEFSKVJmUmVnKTsKLQotCQkJLy8gaW5pdCBSMzEKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgMHgxNCk7Ci0KLQkJCS8vIFJUMzA3MSB2ZXJzaW9uIEUgaGFzIGZpeGVkIHRoaXMgaXNzdWUKLQkJCWlmICgocEFkLT5OaWNDb25maWcyLmZpZWxkLkRBQ1Rlc3RCaXQgPT0gMSkgJiYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKSkKLQkJCXsKLQkJCQkvLyBwYXRjaCB0eCBFVk0gaXNzdWUgdGVtcG9yYXJpbHkKLQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIExET19DRkcwLCAmZGF0YSk7Ci0JCQkJZGF0YSA9ICgoZGF0YSAmIDB4RTBGRkZGRkYpIHwgMHgwRDAwMDAwMCk7Ci0JCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgTERPX0NGRzAsIGRhdGEpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTERPX0NGRzAsICZkYXRhKTsKLQkJCQlkYXRhID0gKChkYXRhICYgMHhFMEZGRkZGRikgfCAweDAxMDAwMDAwKTsKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgZGF0YSk7Ci0JCQl9Ci0KLQkJCS8vIHBhdGNoIExOQV9QRV9HMSBmYWlsZWQgaXNzdWUKLQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgR1BJT19TV0lUQ0gsICZkYXRhKTsKLQkJCWRhdGEgJj0gfigweDIwKTsKLQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIEdQSU9fU1dJVENILCBkYXRhKTsKLQkJfQotCi0JCS8vRm9yIFJGIGZpbHRlciBDYWxpYnJhdGlvbgotCQlSVE1QRmlsdGVyQ2FsaWJyYXRpb24ocEFkKTsKLQotCQkvLyBJbml0aWFsaXplIFJGIFIyNyByZWdpc3Rlciwgc2V0IFJGIFIyNyBtdXN0IGJlIGJlaGluZCBSVE1QRmlsdGVyQ2FsaWJyYXRpb24oKQotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpCi0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIDB4Myk7Ci0KLQkJLy8gc2V0IGxlZCBvcGVuIGRyYWluIGVuYWJsZQotCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIE9QVF8xNCwgJmRhdGEpOwotCQlkYXRhIHw9IDB4MDE7Ci0JCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIE9QVF8xNCwgZGF0YSk7Ci0KLQkJaWYgKElTX1JUMzA3MShwQWQpKQotCQl7Ci0JCQkvLyBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cCwgbG9hZCBSRiBub3JtYWwgb3BlcmF0aW9uLW1vZGUgc2V0dXAKLQkJCVJUMzB4eExvYWRSRk5vcm1hbE1vZGVTZXR1cChwQWQpOwotCQl9Ci0JfQotfQotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTEyOTYsODggKzY3Niw5MSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlOSUNSZWFkRUVQUk9NUGFyYW1ldGVycygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQltYWNfYWRkcikKK3ZvaWQgTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqbWFjX2FkZHIpCiB7Ci0JVUlOVDMyCQkJZGF0YSA9IDA7Ci0JVVNIT1JUCQkJaSwgdmFsdWUsIHZhbHVlMjsKLQlVQ0hBUgkJCVRtcFBoeTsKLQlFRVBST01fVFhfUFdSX1NUUlVDCSAgICBQb3dlcjsKLQlFRVBST01fVkVSU0lPTl9TVFJVQyAgICBWZXJzaW9uOwotCUVFUFJPTV9BTlRFTk5BX1NUUlVDCUFudGVubmE7Ci0JRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDICAgIE5pY0NvbmZpZzI7CisJdTMyIGRhdGEgPSAwOworCXUxNiBpLCB2YWx1ZSwgdmFsdWUyOworCXU4IFRtcFBoeTsKKwlFRVBST01fVFhfUFdSX1NUUlVDIFBvd2VyOworCUVFUFJPTV9WRVJTSU9OX1NUUlVDIFZlcnNpb247CisJRUVQUk9NX0FOVEVOTkFfU1RSVUMgQW50ZW5uYTsKKwlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgTmljQ29uZmlnMjsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNSZWFkRUVQUk9NUGFyYW1ldGVyc1xuIikpOwogCi0JLy8gSW5pdCBFRVBST00gQWRkcmVzcyBOdW1iZXIsIGJlZm9yZSBhY2Nlc3MgRUVQUk9NOyBpZiA5M2M0NiwgRUVQUk9NQWRkcmVzc051bT02LCBlbHNlIGlmIDkzYzY2LCBFRVBST01BZGRyZXNzTnVtPTgKKwlpZiAocEFkLT5jaGlwT3BzLmVlaW5pdCkKKwkJcEFkLT5jaGlwT3BzLmVlaW5pdChwQWQpOworCisJLyogSW5pdCBFRVBST00gQWRkcmVzcyBOdW1iZXIsIGJlZm9yZSBhY2Nlc3MgRUVQUk9NOyBpZiA5M2M0NiwgRUVQUk9NQWRkcmVzc051bT02LCBlbHNlIGlmIDkzYzY2LCBFRVBST01BZGRyZXNzTnVtPTggKi8KIAlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZkYXRhKTsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gRTJQUk9NX0NTUiA9IDB4JXhcbiIsIGRhdGEpKTsKIAotCWlmKChkYXRhICYgMHgzMCkgPT0gMCkKLQkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gNjsJCS8vIDkzQzQ2Ci0JZWxzZSBpZigoZGF0YSAmIDB4MzApID09IDB4MTApCi0JCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7ICAgICAvLyA5M0M2NgorCWlmICgoZGF0YSAmIDB4MzApID09IDApCisJCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDY7CS8qIDkzQzQ2ICovCisJZWxzZSBpZiAoKGRhdGEgJiAweDMwKSA9PSAweDEwKQorCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA4OwkvKiA5M0M2NiAqLwogCWVsc2UKLQkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gODsgICAgIC8vIDkzQzg2Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEVFUFJPTUFkZHJlc3NOdW0gPSAlZFxuIiwgcEFkLT5FRVBST01BZGRyZXNzTnVtICkpOworCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA4OwkvKiA5M0M4NiAqLworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCItLT4gRUVQUk9NQWRkcmVzc051bSA9ICVkXG4iLCBwQWQtPkVFUFJPTUFkZHJlc3NOdW0pKTsKIAotCS8vIFJUMjg2MCBNQUMgbm8gbG9uZ2VyIGF1dG8gbG9hZCBNQUMgYWRkcmVzcyBmcm9tIEUyUFJPTS4gRHJpdmVyIGhhcyB0byBpbnRpYWxpemUKLQkvLyBNQUMgYWRkcmVzcyByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIEUyUFJPTSBzZXR0aW5nCisJLyogUlQyODYwIE1BQyBubyBsb25nZXIgYXV0byBsb2FkIE1BQyBhZGRyZXNzIGZyb20gRTJQUk9NLiBEcml2ZXIgaGFzIHRvIGludGlhbGl6ZSAqLworCS8qIE1BQyBhZGRyZXNzIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gRTJQUk9NIHNldHRpbmcgKi8KIAlpZiAobWFjX2FkZHIgPT0gTlVMTCB8fAotCQlzdHJsZW4obWFjX2FkZHIpICE9IDE3IHx8Ci0JCW1hY19hZGRyWzJdICE9ICc6JyAgfHwgbWFjX2FkZHJbNV0gIT0gJzonICB8fCBtYWNfYWRkcls4XSAhPSAnOicgfHwKLQkJbWFjX2FkZHJbMTFdICE9ICc6JyB8fCBtYWNfYWRkclsxNF0gIT0gJzonKQotCXsKLQkJVVNIT1JUICBBZGRyMDEsQWRkcjIzLEFkZHI0NSA7CisJICAgIHN0cmxlbigoY2hhciAqKW1hY19hZGRyKSAhPSAxNyB8fAorCSAgICBtYWNfYWRkclsyXSAhPSAnOicgfHwgbWFjX2FkZHJbNV0gIT0gJzonIHx8IG1hY19hZGRyWzhdICE9ICc6JyB8fAorCSAgICBtYWNfYWRkclsxMV0gIT0gJzonIHx8IG1hY19hZGRyWzE0XSAhPSAnOicpIHsKKwkJdTE2IEFkZHIwMSwgQWRkcjIzLCBBZGRyNDU7CiAKIAkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA0LCBBZGRyMDEpOwogCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDYsIEFkZHIyMyk7CiAJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwOCwgQWRkcjQ1KTsKIAotCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPSAoVUNIQVIpKEFkZHIwMSAmIDB4ZmYpOwotCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMV0gPSAoVUNIQVIpKEFkZHIwMSA+PiA4KTsKLQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzJdID0gKFVDSEFSKShBZGRyMjMgJiAweGZmKTsKLQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdID0gKFVDSEFSKShBZGRyMjMgPj4gOCk7Ci0JCXBBZC0+UGVybWFuZW50QWRkcmVzc1s0XSA9IChVQ0hBUikoQWRkcjQ1ICYgMHhmZik7Ci0JCXBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9IChVQ0hBUikoQWRkcjQ1ID4+IDgpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPSAodTgpKEFkZHIwMSAmIDB4ZmYpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMV0gPSAodTgpKEFkZHIwMSA+PiA4KTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzJdID0gKHU4KShBZGRyMjMgJiAweGZmKTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdID0gKHU4KShBZGRyMjMgPj4gOCk7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s0XSA9ICh1OCkoQWRkcjQ1ICYgMHhmZik7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9ICh1OCkoQWRkcjQ1ID4+IDgpOwogCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkluaXRpYWxpemUgTUFDIEFkZHJlc3MgZnJvbSBFMlBST00gXG4iKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCUlOVAkJajsKLQkJUFVDSEFSCW1hY3B0cjsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJJbml0aWFsaXplIE1BQyBBZGRyZXNzIGZyb20gRTJQUk9NIFxuIikpOworCX0gZWxzZSB7CisJCWludCBqOworCQljaGFyICptYWNwdHI7CiAKLQkJbWFjcHRyID0gbWFjX2FkZHI7CisJCW1hY3B0ciA9IChjaGFyICopbWFjX2FkZHI7CiAKLQkJZm9yIChqPTA7IGo8TUFDX0FERFJfTEVOOyBqKyspCi0JCXsKKwkJZm9yIChqID0gMDsgaiA8IE1BQ19BRERSX0xFTjsgaisrKSB7CiAJCQlBdG9IKG1hY3B0ciwgJnBBZC0+UGVybWFuZW50QWRkcmVzc1tqXSwgMSk7Ci0JCQltYWNwdHI9bWFjcHRyKzM7CisJCQltYWNwdHIgPSBtYWNwdHIgKyAzOwogCQl9CiAKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW5pdGlhbGl6ZSBNQUMgQWRkcmVzcyBmcm9tIG1vZHVsZSBwYXJhbWV0ZXIgXG4iKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiSW5pdGlhbGl6ZSBNQUMgQWRkcmVzcyBmcm9tIG1vZHVsZSBwYXJhbWV0ZXIgXG4iKSk7CiAJfQogCi0KIAl7Ci0JCS8vbW9yZSBjb252ZW5pbmV0IHRvIHRlc3QgbWJzc2lkLCBzbyBhcCdzIGJzc2lkICYweGYxCisJCS8qbW9yZSBjb252ZW5pbmV0IHRvIHRlc3QgbWJzc2lkLCBzbyBhcCdzIGJzc2lkICYweGYxICovCiAJCWlmIChwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPT0gMHhmZikKLQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSA9IFJhbmRvbUJ5dGUocEFkKSYweGY4OworCQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzBdID0gUmFuZG9tQnl0ZShwQWQpICYgMHhmODsKIAotCQkvL2lmIChwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0gPT0gMHhmZikKLQkJLy8JcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdID0gUmFuZG9tQnl0ZShwQWQpJjB4Zjg7CisJCS8qaWYgKHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9PSAweGZmKSAqLworCQkvKiAgICAgIHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9IFJhbmRvbUJ5dGUocEFkKSYweGY4OyAqLwogCi0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkUyUFJPTSBNQUM6ID0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzFdLAotCQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzJdLCBwQWQtPlBlcm1hbmVudEFkZHJlc3NbM10sCi0JCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSkpOwotCQlpZiAocEFkLT5iTG9jYWxBZG1pbk1BQyA9PSBGQUxTRSkKLQkJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkgICAgICgiRTJQUk9NIE1BQzogPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJICAgICAgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzBdLAorCQkJICAgICAgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzFdLAorCQkJICAgICAgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzJdLAorCQkJICAgICAgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdLAorCQkJICAgICAgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzRdLAorCQkJICAgICAgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdKSk7CisJCWlmIChwQWQtPmJMb2NhbEFkbWluTUFDID09IEZBTFNFKSB7CiAJCQlNQUNfRFcwX1NUUlVDIGNzcjI7CiAJCQlNQUNfRFcxX1NUUlVDIGNzcjM7Ci0JCQlDT1BZX01BQ19BRERSKHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+UGVybWFuZW50QWRkcmVzcyk7CisJCQlDT1BZX01BQ19BRERSKHBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJICAgICAgcEFkLT5QZXJtYW5lbnRBZGRyZXNzKTsKIAkJCWNzcjIuZmllbGQuQnl0ZTAgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzBdOwogCQkJY3NyMi5maWVsZC5CeXRlMSA9IHBBZC0+Q3VycmVudEFkZHJlc3NbMV07CiAJCQljc3IyLmZpZWxkLkJ5dGUyID0gcEFkLT5DdXJyZW50QWRkcmVzc1syXTsKQEAgLTEzODgsMTE4ICs3NzEsMTE2IEBACiAJCQljc3IzLmZpZWxkLkJ5dGU1ID0gcEFkLT5DdXJyZW50QWRkcmVzc1s1XTsKIAkJCWNzcjMuZmllbGQuVTJNZU1hc2sgPSAweGZmOwogCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0FERFJfRFcxLCBjc3IzLndvcmQpOwotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiRTJQUk9NIE1BQzogPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzFdLAotCQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1syXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdLAotCQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s0XSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdKSk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJICAgICAoIkUyUFJPTSBNQUM6ID0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkgICAgICBQUklOVF9NQUMocEFkLT5QZXJtYW5lbnRBZGRyZXNzKSkpOwogCQl9CiAJfQogCi0JLy8gaWYgbm90IHJldHVybiBlYXJseS4gY2F1c2UgZmFpbCBhdCBlbXVsYXRpb24uCi0JLy8gSW5pdCB0aGUgY2hhbm5lbCBudW1iZXIgZm9yIFRYIGNoYW5uZWwgcG93ZXIKKwkvKiBpZiBub3QgcmV0dXJuIGVhcmx5LiBjYXVzZSBmYWlsIGF0IGVtdWxhdGlvbi4gKi8KKwkvKiBJbml0IHRoZSBjaGFubmVsIG51bWJlciBmb3IgVFggY2hhbm5lbCBwb3dlciAqLwogCVJUTVBSZWFkQ2hhbm5lbFB3cihwQWQpOwogCi0JLy8gaWYgRTJQUk9NIHZlcnNpb24gbWlzbWF0Y2ggd2l0aCBkcml2ZXIncyBleHBlY3RhdGlvbiwgdGhlbiBza2lwCi0JLy8gYWxsIHN1YnNlcXVlbnQgRTJSUE9NIHJldGlldmFsIGFuZCBzZXQgYSBzeXN0ZW0gZXJyb3IgYml0IHRvIG5vdGlmeSBHVUkKKwkvKiBpZiBFMlBST00gdmVyc2lvbiBtaXNtYXRjaCB3aXRoIGRyaXZlcidzIGV4cGVjdGF0aW9uLCB0aGVuIHNraXAgKi8KKwkvKiBhbGwgc3Vic2VxdWVudCBFMlJQT00gcmV0aWV2YWwgYW5kIHNldCBhIHN5c3RlbSBlcnJvciBiaXQgdG8gbm90aWZ5IEdVSSAqLwogCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1ZFUlNJT05fT0ZGU0VULCBWZXJzaW9uLndvcmQpOwotCXBBZC0+RWVwcm9tVmVyc2lvbiA9IFZlcnNpb24uZmllbGQuVmVyc2lvbiArIFZlcnNpb24uZmllbGQuRmFlUmVsZWFzZU51bWJlciAqIDI1NjsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFMlBST006IFZlcnNpb24gPSAlZCwgRkFFIHJlbGVhc2UgIyVkXG4iLCBWZXJzaW9uLmZpZWxkLlZlcnNpb24sIFZlcnNpb24uZmllbGQuRmFlUmVsZWFzZU51bWJlcikpOworCXBBZC0+RWVwcm9tVmVyc2lvbiA9CisJICAgIFZlcnNpb24uZmllbGQuVmVyc2lvbiArIFZlcnNpb24uZmllbGQuRmFlUmVsZWFzZU51bWJlciAqIDI1NjsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiRTJQUk9NOiBWZXJzaW9uID0gJWQsIEZBRSByZWxlYXNlICMlZFxuIiwKKwkJICBWZXJzaW9uLmZpZWxkLlZlcnNpb24sIFZlcnNpb24uZmllbGQuRmFlUmVsZWFzZU51bWJlcikpOwogCi0JaWYgKFZlcnNpb24uZmllbGQuVmVyc2lvbiA+IFZBTElEX0VFUFJPTV9WRVJTSU9OKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiRTJQUk9NOiBXUk9ORyBWRVJTSU9OIDB4JXgsIHNob3VsZCBiZSAlZFxuIixWZXJzaW9uLmZpZWxkLlZlcnNpb24sIFZBTElEX0VFUFJPTV9WRVJTSU9OKSk7CisJaWYgKFZlcnNpb24uZmllbGQuVmVyc2lvbiA+IFZBTElEX0VFUFJPTV9WRVJTSU9OKSB7CisJCURCR1BSSU5UX0VSUigoIkUyUFJPTTogV1JPTkcgVkVSU0lPTiAweCV4LCBzaG91bGQgYmUgJWRcbiIsCisJCQkgICAgICBWZXJzaW9uLmZpZWxkLlZlcnNpb24sIFZBTElEX0VFUFJPTV9WRVJTSU9OKSk7CiAJCS8qcEFkLT5TeXN0ZW1FcnJvckJpdG1hcCB8PSAweDAwMDAwMDAxOwogCi0JCS8vIGhhcmQtY29kZSBkZWZhdWx0IHZhbHVlIHdoZW4gbm8gcHJvcGVyIEUyUFJPTSBpbnN0YWxsZWQKLQkJcEFkLT5iQXV0b1R4QWdjQSA9IEZBTFNFOwotCQlwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CisJCSAgIC8vIGhhcmQtY29kZSBkZWZhdWx0IHZhbHVlIHdoZW4gbm8gcHJvcGVyIEUyUFJPTSBpbnN0YWxsZWQKKwkJICAgcEFkLT5iQXV0b1R4QWdjQSA9IEZBTFNFOworCQkgICBwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CiAKLQkJLy8gRGVmYXVsdCB0aGUgY2hhbm5lbCBwb3dlcgotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9DSEFOTkVMUzsgaSsrKQotCQkJcEFkLT5UeFBvd2VyW2ldLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJICAgLy8gRGVmYXVsdCB0aGUgY2hhbm5lbCBwb3dlcgorCQkgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9DSEFOTkVMUzsgaSsrKQorCQkgICBwQWQtPlR4UG93ZXJbaV0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwogCi0JCS8vIERlZmF1bHQgdGhlIGNoYW5uZWwgcG93ZXIKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFM7IGkrKykKLQkJCXBBZC0+VHhQb3dlcjExSltpXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCSAgIC8vIERlZmF1bHQgdGhlIGNoYW5uZWwgcG93ZXIKKwkJICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFM7IGkrKykKKwkJICAgcEFkLT5UeFBvd2VyMTFKW2ldLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKIAotCQlmb3IoaSA9IDA7IGkgPCBOVU1fRUVQUk9NX0JCUF9QQVJNUzsgaSsrKQotCQkJcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gPSAweGZmZmY7Ci0JCXJldHVybjsgICovCisJCSAgIGZvcihpID0gMDsgaSA8IE5VTV9FRVBST01fQkJQX1BBUk1TOyBpKyspCisJCSAgIHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldID0gMHhmZmZmOworCQkgICByZXR1cm47ICAqLwogCX0KLQotCS8vIFJlYWQgQkJQIGRlZmF1bHQgdmFsdWUgZnJvbSBFRVBST00gYW5kIHN0b3JlIHRvIGFycmF5KEVFUFJPTURlZmF1bHRWYWx1ZSkgaW4gcEFkCisJLyogUmVhZCBCQlAgZGVmYXVsdCB2YWx1ZSBmcm9tIEVFUFJPTSBhbmQgc3RvcmUgdG8gYXJyYXkoRUVQUk9NRGVmYXVsdFZhbHVlKSBpbiBwQWQgKi8KIAlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9OSUMxX09GRlNFVCwgdmFsdWUpOwogCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzBdID0gdmFsdWU7CiAKIAlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9OSUMyX09GRlNFVCwgdmFsdWUpOwogCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzFdID0gdmFsdWU7CiAKLQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MzgsIHZhbHVlKTsJLy8gQ291bnRyeSBSZWdpb24KKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MzgsIHZhbHVlKTsJLyogQ291bnRyeSBSZWdpb24gKi8KIAlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsyXSA9IHZhbHVlOwogCi0JZm9yKGkgPSAwOyBpIDwgODsgaSsrKQotCXsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQkJQX0JBU0VfT0ZGU0VUICsgaSoyLCB2YWx1ZSk7Ci0JCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2krM10gPSB2YWx1ZTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0JCUF9CQVNFX09GRlNFVCArIGkgKiAyLAorCQkJCSAgICAgdmFsdWUpOworCQlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpICsgM10gPSB2YWx1ZTsKIAl9CiAKLQkvLyBXZSBoYXZlIHRvIHBhcnNlIE5JQyBjb25maWd1cmF0aW9uIDAgYXQgaGVyZS4KLQkvLyBJZiBUU1NJIGRpZCBub3QgaGF2ZSBwcmVsb2FkZWQgdmFsdWUsIGl0IHNob3VsZCByZXNldCB0aGUgVHhBdXRvQWdjIHRvIGZhbHNlCi0JLy8gVGhlcmVmb3JlLCB3ZSBoYXZlIHRvIHJlYWQgVHhBdXRvQWdjIGNvbnRyb2wgYmVmb3JlaGFuZC4KLQkvLyBSZWFkIFR4IEFHQyBjb250cm9sIGJpdAorCS8qIFdlIGhhdmUgdG8gcGFyc2UgTklDIGNvbmZpZ3VyYXRpb24gMCBhdCBoZXJlLiAqLworCS8qIElmIFRTU0kgZGlkIG5vdCBoYXZlIHByZWxvYWRlZCB2YWx1ZSwgaXQgc2hvdWxkIHJlc2V0IHRoZSBUeEF1dG9BZ2MgdG8gZmFsc2UgKi8KKwkvKiBUaGVyZWZvcmUsIHdlIGhhdmUgdG8gcmVhZCBUeEF1dG9BZ2MgY29udHJvbCBiZWZvcmVoYW5kLiAqLworCS8qIFJlYWQgVHggQUdDIGNvbnRyb2wgYml0ICovCiAJQW50ZW5uYS53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMF07Ci0JaWYgKEFudGVubmEud29yZCA9PSAweEZGRkYpCi0JewotCQlpZihJU19SVDMwOTAocEFkKSkKLQkJeworCWlmIChBbnRlbm5hLndvcmQgPT0gMHhGRkZGKSB7CisjaWZkZWYgUlQzMHh4CisJCWlmIChJU19SVDMwOTAocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgewogCQkJQW50ZW5uYS53b3JkID0gMDsKIAkJCUFudGVubmEuZmllbGQuUmZJY1R5cGUgPSBSRklDXzMwMjA7CiAJCQlBbnRlbm5hLmZpZWxkLlR4UGF0aCA9IDE7CiAJCQlBbnRlbm5hLmZpZWxkLlJ4UGF0aCA9IDE7Ci0JCX0KLQkJZWxzZQorCQl9IGVsc2UKKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KIAkJewotCQlBbnRlbm5hLndvcmQgPSAwOwotCQlBbnRlbm5hLmZpZWxkLlJmSWNUeXBlID0gUkZJQ18yODIwOwotCQlBbnRlbm5hLmZpZWxkLlR4UGF0aCA9IDE7Ci0JCUFudGVubmEuZmllbGQuUnhQYXRoID0gMjsKLQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJFMlBST00gZXJyb3IsIGhhcmQgY29kZSBhcyAweCUwNHhcbiIsIEFudGVubmEud29yZCkpOworCisJCQlBbnRlbm5hLndvcmQgPSAwOworCQkJQW50ZW5uYS5maWVsZC5SZkljVHlwZSA9IFJGSUNfMjgyMDsKKwkJCUFudGVubmEuZmllbGQuVHhQYXRoID0gMTsKKwkJCUFudGVubmEuZmllbGQuUnhQYXRoID0gMjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkJICgiRTJQUk9NIGVycm9yLCBoYXJkIGNvZGUgYXMgMHglMDR4XG4iLAorCQkJCSAgQW50ZW5uYS53b3JkKSk7CiAJCX0KIAl9Ci0KLQkvLyBDaG9vc2UgdGhlIGRlc2lyZWQgVHgmUnggc3RyZWFtLgotCWlmICgocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID4gQW50ZW5uYS5maWVsZC5UeFBhdGgpKQorCS8qIENob29zZSB0aGUgZGVzaXJlZCBUeCZSeCBzdHJlYW0uICovCisJaWYgKChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAwKQorCSAgICB8fCAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPiBBbnRlbm5hLmZpZWxkLlR4UGF0aCkpCiAJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gQW50ZW5uYS5maWVsZC5UeFBhdGg7CiAKLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID09IDApIHx8IChwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA+IEFudGVubmEuZmllbGQuUnhQYXRoKSkKLQl7CisJaWYgKChwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9PSAwKQorCSAgICB8fCAocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPiBBbnRlbm5hLmZpZWxkLlJ4UGF0aCkpIHsKIAkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSBBbnRlbm5hLmZpZWxkLlJ4UGF0aDsKIAogCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18yODgzX1ZFUlNJT04pICYmCi0JCQkocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPiAyKSkKLQkJewotCQkJLy8gb25seSAyIFJ4IHN0cmVhbXMgZm9yIFJUMjg2MCBzZXJpZXMKKwkJICAgIChwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA+IDIpKSB7CisJCQkvKiBvbmx5IDIgUnggc3RyZWFtcyBmb3IgUlQyODYwIHNlcmllcyAqLwogCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOwogCQl9CiAJfQotCi0JLy8gMyozCi0JLy8gcmVhZCB2YWx1ZSBmcm9tIEVFUFJPTSBhbmQgc2V0IHRoZW0gdG8gQ1NSMTc0IH4gMTc3IGluIGNoYWluMCB+IGNoYWluMgotCS8vIHlldCBpbXBsZW1lbnQKLQlmb3IoaT0wOyBpPDM7IGkrKykKLQl7CisJLyogMyozICovCisJLyogcmVhZCB2YWx1ZSBmcm9tIEVFUFJPTSBhbmQgc2V0IHRoZW0gdG8gQ1NSMTc0IH4gMTc3IGluIGNoYWluMCB+IGNoYWluMiAqLworCS8qIHlldCBpbXBsZW1lbnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAJfQogCiAJTmljQ29uZmlnMi53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMV07CiAKIAl7Ci0JCWlmICgoTmljQ29uZmlnMi53b3JkICYgMHgwMGZmKSA9PSAweGZmKQotCQl7CisJCWlmICgoTmljQ29uZmlnMi53b3JkICYgMHgwMGZmKSA9PSAweGZmKSB7CiAJCQlOaWNDb25maWcyLndvcmQgJj0gMHhmZjAwOwogCQl9CiAKLQkJaWYgKChOaWNDb25maWcyLndvcmQgPj4gOCkgPT0gMHhmZikKLQkJeworCQlpZiAoKE5pY0NvbmZpZzIud29yZCA+PiA4KSA9PSAweGZmKSB7CiAJCQlOaWNDb25maWcyLndvcmQgJj0gMHgwMGZmOwogCQl9CiAJfQpAQCAtMTUwOSwyOSArODkwLDQzIEBACiAJZWxzZQogCQlwQWQtPmJBdXRvVHhBZ2NBID0gcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOwogCi0JREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIk5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzOiBSeFBhdGggPSAlZCwgVHhQYXRoID0gJWRcbiIsIEFudGVubmEuZmllbGQuUnhQYXRoLCBBbnRlbm5hLmZpZWxkLlR4UGF0aCkpOworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJICAgICAoIk5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzOiBSeFBhdGggPSAlZCwgVHhQYXRoID0gJWRcbiIsCisJCSAgICAgIEFudGVubmEuZmllbGQuUnhQYXRoLCBBbnRlbm5hLmZpZWxkLlR4UGF0aCkpOwogCi0JLy8gU2F2ZSB0aGUgYW50ZW5uYSBmb3IgZnV0dXJlIHVzZQorCS8qIFNhdmUgdGhlIGFudGVubmEgZm9yIGZ1dHVyZSB1c2UgKi8KIAlwQWQtPkFudGVubmEud29yZCA9IEFudGVubmEud29yZDsKIAotCS8vCi0JLy8gUmVzZXQgUGh5TW9kZSBpZiB3ZSBkb24ndCBzdXBwb3J0IDgwMi4xMWEKLQkvLyBPbmx5IFJGSUNfMjg1MCAmIFJGSUNfMjc1MCBzdXBwb3J0IDgwMi4xMWEKLQkvLwotCWlmICgoQW50ZW5uYS5maWVsZC5SZkljVHlwZSAhPSBSRklDXzI4NTApICYmIChBbnRlbm5hLmZpZWxkLlJmSWNUeXBlICE9IFJGSUNfMjc1MCkpCi0JeworCS8qIFNldCB0aGUgUmZJQ1R5cGUgaGVyZSwgdGhlbiB3ZSBjYW4gaW5pdGlhbGl6ZSBSRklDIHJlbGF0ZWQgb3BlcmF0aW9uIGNhbGxiYWNrcyAqLworCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gKHU4KUFudGVubmEuZmllbGQuUnhQYXRoOworCXBBZC0+UmZJY1R5cGUgPSAodTgpQW50ZW5uYS5maWVsZC5SZkljVHlwZTsKKworI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAorCVJ0bXBDaGlwT3BzUkZIb29rKHBBZCk7CisjZW5kaWYgLyogUlRNUF9SRl9SV19TVVBQT1JUIC8vICovCisKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlzcHJpbnRmKChjaGFyICopcEFkLT5uaWNrbmFtZSwgIlJUMjg2MFNUQSIpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCisJLyogKi8KKwkvKiBSZXNldCBQaHlNb2RlIGlmIHdlIGRvbid0IHN1cHBvcnQgODAyLjExYSAqLworCS8qIE9ubHkgUkZJQ18yODUwICYgUkZJQ18yNzUwIHN1cHBvcnQgODAyLjExYSAqLworCS8qICovCisJaWYgKChBbnRlbm5hLmZpZWxkLlJmSWNUeXBlICE9IFJGSUNfMjg1MCkKKwkgICAgJiYgKEFudGVubmEuZmllbGQuUmZJY1R5cGUgIT0gUkZJQ18yNzUwKQorCSAgICAmJiAoQW50ZW5uYS5maWVsZC5SZkljVHlwZSAhPSBSRklDXzMwNTIpKSB7CiAJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQpIHx8Ci0JCQkocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBKSkKKwkJICAgIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpKQogCQkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHX01JWEVEOwotCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKQl8fAotCQkJCSAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkgCXx8Ci0JCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkgCXx8Ci0JCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKQorCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKSB8fAorCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFOX01JWEVEKSB8fAorCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkgfHwKKwkJCSAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkKIAkJCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSBQSFlfMTFCR05fTUlYRUQ7CiAJfQotCi0JLy8gUmVhZCBUU1NJIHJlZmVyZW5jZSBhbmQgVFNTSSBib3VuZGFyeSBmb3IgdGVtcGVyYXR1cmUgY29tcGVuc2F0aW9uLiBUaGlzIGlzIHVnbHkKLQkvLyAwLiAxMWIvZworCS8qIFJlYWQgVFNTSSByZWZlcmVuY2UgYW5kIFRTU0kgYm91bmRhcnkgZm9yIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbi4gVGhpcyBpcyB1Z2x5ICovCisJLyogMC4gMTFiL2cgKi8KIAl7CiAJCS8qIHRoZXNlIGFyZSB0ZW1wYXR1cmUgcmVmZXJlbmNlIHZhbHVlICgweDAwIH4gMHhGRSkKIAkJICAgZXg6IDB4MDAgMHgxNSAweDI1IDB4NDUgMHg4OCAweEEwIDB4QjUgMHhEMCAweEYwCkBAIC0xNTQ0LDcgKzkzOSw3IEBACiAJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzJdID0gUG93ZXIuZmllbGQuQnl0ZTA7CiAJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CiAJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHg3MiwgUG93ZXIud29yZCk7Ci0JCXBBZC0+VHNzaVJlZkcgICA9IFBvd2VyLmZpZWxkLkJ5dGUwOyAvKiByZWZlcmVuY2UgdmFsdWUgWzBdICovCisJCXBBZC0+VHNzaVJlZkcgPSBQb3dlci5maWVsZC5CeXRlMDsJLyogcmVmZXJlbmNlIHZhbHVlIFswXSAqLwogCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CiAJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHg3NCwgUG93ZXIud29yZCk7CiAJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKQEAgLTE1NTQsMTkgKzk0OSwyMyBAQAogCQlwQWQtPlR4QWdjU3RlcEcgPSBQb3dlci5maWVsZC5CeXRlMTsKIAkJcEFkLT5UeEFnY0NvbXBlbnNhdGVHID0gMDsKIAkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMF0gPSBwQWQtPlRzc2lSZWZHOwotCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdICA9IHBBZC0+VHNzaVJlZkc7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMF0gPSBwQWQtPlRzc2lSZWZHOwogCi0JCS8vIERpc2FibGUgVHhBZ2MgaWYgdGhlIGJhc2VkIHZhbHVlIGlzIG5vdCByaWdodAorCQkvKiBEaXNhYmxlIFR4QWdjIGlmIHRoZSBiYXNlZCB2YWx1ZSBpcyBub3QgcmlnaHQgKi8KIAkJaWYgKHBBZC0+VHNzaVJlZkcgPT0gMHhmZikKIAkJCXBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKIAotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkUyUFJPTTogRyBUc3NpWy00IC4uICs0XSA9ICVkICVkICVkICVkIC0gJWQgLSVkICVkICVkICVkLCBzdGVwPSVkLCB0dW5pbmc9JWRcbiIsCi0JCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1s0XSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbM10sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzJdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1sxXSwKLQkJCXBBZC0+VHNzaVJlZkcsCi0JCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzFdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzJdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzNdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzRdLAotCQkJcEFkLT5UeEFnY1N0ZXBHLCBwQWQtPmJBdXRvVHhBZ2NHKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiRTJQUk9NOiBHIFRzc2lbLTQgLi4gKzRdID0gJWQgJWQgJWQgJWQgLSAlZCAtJWQgJWQgJWQgJWQsIHN0ZXA9JWQsIHR1bmluZz0lZFxuIiwKKwkJCSAgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbNF0sCisJCQkgIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzNdLAorCQkJICBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1syXSwKKwkJCSAgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMV0sIHBBZC0+VHNzaVJlZkcsCisJCQkgIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMV0sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMl0sCisJCQkgIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbM10sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbNF0sCisJCQkgIHBBZC0+VHhBZ2NTdGVwRywgcEFkLT5iQXV0b1R4QWdjRykpOwogCX0KLQkvLyAxLiAxMWEKKwkvKiAxLiAxMWEgKi8KIAl7CiAJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhENCwgUG93ZXIud29yZCk7CiAJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzRdID0gUG93ZXIuZmllbGQuQnl0ZTA7CkBAIC0xNTc1LDcgKzk3NCw3IEBACiAJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzJdID0gUG93ZXIuZmllbGQuQnl0ZTA7CiAJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CiAJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhEOCwgUG93ZXIud29yZCk7Ci0JCXBBZC0+VHNzaVJlZkEgICA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlRzc2lSZWZBID0gUG93ZXIuZmllbGQuQnl0ZTA7CiAJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMV0gPSBQb3dlci5maWVsZC5CeXRlMTsKIAkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweERBLCBQb3dlci53b3JkKTsKIAkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVsyXSA9IFBvd2VyLmZpZWxkLkJ5dGUwOwpAQCAtMTU4NSw5NyArOTg0LDExOSBAQAogCQlwQWQtPlR4QWdjU3RlcEEgPSBQb3dlci5maWVsZC5CeXRlMTsKIAkJcEFkLT5UeEFnY0NvbXBlbnNhdGVBID0gMDsKIAkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMF0gPSBwQWQtPlRzc2lSZWZBOwotCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzBdICA9IHBBZC0+VHNzaVJlZkE7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMF0gPSBwQWQtPlRzc2lSZWZBOwogCi0JCS8vIERpc2FibGUgVHhBZ2MgaWYgdGhlIGJhc2VkIHZhbHVlIGlzIG5vdCByaWdodAorCQkvKiBEaXNhYmxlIFR4QWdjIGlmIHRoZSBiYXNlZCB2YWx1ZSBpcyBub3QgcmlnaHQgKi8KIAkJaWYgKHBBZC0+VHNzaVJlZkEgPT0gMHhmZikKIAkJCXBBZC0+YkF1dG9UeEFnY0EgPSBGQUxTRTsKIAotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkUyUFJPTTogQSBUc3NpWy00IC4uICs0XSA9ICVkICVkICVkICVkIC0gJWQgLSVkICVkICVkICVkLCBzdGVwPSVkLCB0dW5pbmc9JWRcbiIsCi0JCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVs0XSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbM10sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzJdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVsxXSwKLQkJCXBBZC0+VHNzaVJlZkEsCi0JCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzFdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzJdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzNdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzRdLAotCQkJcEFkLT5UeEFnY1N0ZXBBLCBwQWQtPmJBdXRvVHhBZ2NBKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiRTJQUk9NOiBBIFRzc2lbLTQgLi4gKzRdID0gJWQgJWQgJWQgJWQgLSAlZCAtJWQgJWQgJWQgJWQsIHN0ZXA9JWQsIHR1bmluZz0lZFxuIiwKKwkJCSAgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbNF0sCisJCQkgIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzNdLAorCQkJICBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVsyXSwKKwkJCSAgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMV0sIHBBZC0+VHNzaVJlZkEsCisJCQkgIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMV0sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMl0sCisJCQkgIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbM10sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbNF0sCisJCQkgIHBBZC0+VHhBZ2NTdGVwQSwgcEFkLT5iQXV0b1R4QWdjQSkpOwogCX0KIAlwQWQtPkJicFJzc2lUb0RibURlbHRhID0gMHgwOwogCi0JLy8gUmVhZCBmcmVxdWVuY3kgb2Zmc2V0IHNldHRpbmcgZm9yIFJGCisJLyogUmVhZCBmcmVxdWVuY3kgb2Zmc2V0IHNldHRpbmcgZm9yIFJGICovCiAJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fRlJFUV9PRkZTRVQsIHZhbHVlKTsKIAlpZiAoKHZhbHVlICYgMHgwMEZGKSAhPSAweDAwRkYpCi0JCXBBZC0+UmZGcmVxT2Zmc2V0ID0gKFVMT05HKSAodmFsdWUgJiAweDAwRkYpOworCQlwQWQtPlJmRnJlcU9mZnNldCA9ICh1bnNpZ25lZCBsb25nKSh2YWx1ZSAmIDB4MDBGRik7CiAJZWxzZQogCQlwQWQtPlJmRnJlcU9mZnNldCA9IDA7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRTJQUk9NOiBSRiBGcmVxT2Zmc2V0PTB4JWx4IFxuIiwgcEFkLT5SZkZyZXFPZmZzZXQpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiRTJQUk9NOiBSRiBGcmVxT2Zmc2V0PTB4JWx4IFxuIiwgcEFkLT5SZkZyZXFPZmZzZXQpKTsKIAotCS8vQ291bnRyeVJlZ2lvbiBieXRlIG9mZnNldCAoMzhoKQotCXZhbHVlID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gPj4gODsJCS8vIDIuNEcgYmFuZAotCXZhbHVlMiA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzJdICYgMHgwMEZGOwkvLyA1RyBiYW5kCisJLypDb3VudHJ5UmVnaW9uIGJ5dGUgb2Zmc2V0ICgzOGgpICovCisJdmFsdWUgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsyXSA+PiA4OwkvKiAyLjRHIGJhbmQgKi8KKwl2YWx1ZTIgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsyXSAmIDB4MDBGRjsJLyogNUcgYmFuZCAqLwogCi0JaWYgKCh2YWx1ZSA8PSBSRUdJT05fTUFYSU1VTV9CR19CQU5EKSAmJiAodmFsdWUyIDw9IFJFR0lPTl9NQVhJTVVNX0FfQkFORCkpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKChVQ0hBUikgdmFsdWUpIHwgMHg4MDsKLQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kID0gKChVQ0hBUikgdmFsdWUyKSB8IDB4ODA7CisJaWYgKCh2YWx1ZSA8PSBSRUdJT05fTUFYSU1VTV9CR19CQU5EKQorCSAgICAmJiAodmFsdWUyIDw9IFJFR0lPTl9NQVhJTVVNX0FfQkFORCkpIHsKKwkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9ICgodTgpdmFsdWUpIHwgMHg4MDsKKwkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kID0gKCh1OCl2YWx1ZTIpIHwgMHg4MDsKIAkJVG1wUGh5ID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKIAkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7CiAJCVJUTVBTZXRQaHlNb2RlKHBBZCwgVG1wUGh5KTsKIAkJU2V0Q29tbW9uSFQocEFkKTsKIAl9Ci0KLQkvLwotCS8vIEdldCBSU1NJIE9mZnNldCBvbiBFRVBST00gMHg5QWggJiAweDlDaC4KLQkvLyBUaGUgdmFsaWQgdmFsdWUgYXJlICgtMTAgfiAxMCkKLQkvLworCS8qICovCisJLyogR2V0IFJTU0kgT2Zmc2V0IG9uIEVFUFJPTSAweDlBaCAmIDB4OUNoLiAqLworCS8qIFRoZSB2YWxpZCB2YWx1ZSBhcmUgKC0xMCB+IDEwKSAqLworCS8qICovCiAJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQsIHZhbHVlKTsKIAlwQWQtPkJHUnNzaU9mZnNldDAgPSB2YWx1ZSAmIDB4MDBmZjsKIAlwQWQtPkJHUnNzaU9mZnNldDEgPSAodmFsdWUgPj4gOCk7Ci0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQrMiwgdmFsdWUpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1JTU0lfQkdfT0ZGU0VUICsgMiwgdmFsdWUpOwogCXBBZC0+QkdSc3NpT2Zmc2V0MiA9IHZhbHVlICYgMHgwMGZmOwogCXBBZC0+QUxOQUdhaW4xID0gKHZhbHVlID4+IDgpOwogCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xOQV9PRkZTRVQsIHZhbHVlKTsKIAlwQWQtPkJMTkFHYWluID0gdmFsdWUgJiAweDAwZmY7CiAJcEFkLT5BTE5BR2FpbjAgPSAodmFsdWUgPj4gOCk7CiAKLQkvLyBWYWxpZGF0ZSAxMWIvZyBSU1NJXzAgb2Zmc2V0LgorCS8qIFZhbGlkYXRlIDExYi9nIFJTU0lfMCBvZmZzZXQuICovCiAJaWYgKChwQWQtPkJHUnNzaU9mZnNldDAgPCAtMTApIHx8IChwQWQtPkJHUnNzaU9mZnNldDAgPiAxMCkpCiAJCXBBZC0+QkdSc3NpT2Zmc2V0MCA9IDA7CiAKLQkvLyBWYWxpZGF0ZSAxMWIvZyBSU1NJXzEgb2Zmc2V0LgorCS8qIFZhbGlkYXRlIDExYi9nIFJTU0lfMSBvZmZzZXQuICovCiAJaWYgKChwQWQtPkJHUnNzaU9mZnNldDEgPCAtMTApIHx8IChwQWQtPkJHUnNzaU9mZnNldDEgPiAxMCkpCiAJCXBBZC0+QkdSc3NpT2Zmc2V0MSA9IDA7CiAKLQkvLyBWYWxpZGF0ZSAxMWIvZyBSU1NJXzIgb2Zmc2V0LgorCS8qIFZhbGlkYXRlIDExYi9nIFJTU0lfMiBvZmZzZXQuICovCiAJaWYgKChwQWQtPkJHUnNzaU9mZnNldDIgPCAtMTApIHx8IChwQWQtPkJHUnNzaU9mZnNldDIgPiAxMCkpCiAJCXBBZC0+QkdSc3NpT2Zmc2V0MiA9IDA7CiAKIAlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9SU1NJX0FfT0ZGU0VULCB2YWx1ZSk7CiAJcEFkLT5BUnNzaU9mZnNldDAgPSB2YWx1ZSAmIDB4MDBmZjsKIAlwQWQtPkFSc3NpT2Zmc2V0MSA9ICh2YWx1ZSA+PiA4KTsKLQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIChFRVBST01fUlNTSV9BX09GRlNFVCsyKSwgdmFsdWUpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgKEVFUFJPTV9SU1NJX0FfT0ZGU0VUICsgMiksIHZhbHVlKTsKIAlwQWQtPkFSc3NpT2Zmc2V0MiA9IHZhbHVlICYgMHgwMGZmOwogCXBBZC0+QUxOQUdhaW4yID0gKHZhbHVlID4+IDgpOwogCi0JaWYgKCgoVUNIQVIpcEFkLT5BTE5BR2FpbjEgPT0gMHhGRikgfHwgKHBBZC0+QUxOQUdhaW4xID09IDB4MDApKQorCWlmICgoKHU4KXBBZC0+QUxOQUdhaW4xID09IDB4RkYpIHx8IChwQWQtPkFMTkFHYWluMSA9PSAweDAwKSkKIAkJcEFkLT5BTE5BR2FpbjEgPSBwQWQtPkFMTkFHYWluMDsKLQlpZiAoKChVQ0hBUilwQWQtPkFMTkFHYWluMiA9PSAweEZGKSB8fCAocEFkLT5BTE5BR2FpbjIgPT0gMHgwMCkpCisJaWYgKCgodTgpcEFkLT5BTE5BR2FpbjIgPT0gMHhGRikgfHwgKHBBZC0+QUxOQUdhaW4yID09IDB4MDApKQogCQlwQWQtPkFMTkFHYWluMiA9IHBBZC0+QUxOQUdhaW4wOwogCi0JLy8gVmFsaWRhdGUgMTFhIFJTU0lfMCBvZmZzZXQuCisJLyogVmFsaWRhdGUgMTFhIFJTU0lfMCBvZmZzZXQuICovCiAJaWYgKChwQWQtPkFSc3NpT2Zmc2V0MCA8IC0xMCkgfHwgKHBBZC0+QVJzc2lPZmZzZXQwID4gMTApKQogCQlwQWQtPkFSc3NpT2Zmc2V0MCA9IDA7CiAKLQkvLyBWYWxpZGF0ZSAxMWEgUlNTSV8xIG9mZnNldC4KKwkvKiBWYWxpZGF0ZSAxMWEgUlNTSV8xIG9mZnNldC4gKi8KIAlpZiAoKHBBZC0+QVJzc2lPZmZzZXQxIDwgLTEwKSB8fCAocEFkLT5BUnNzaU9mZnNldDEgPiAxMCkpCiAJCXBBZC0+QVJzc2lPZmZzZXQxID0gMDsKIAotCS8vVmFsaWRhdGUgMTFhIFJTU0lfMiBvZmZzZXQuCisJLypWYWxpZGF0ZSAxMWEgUlNTSV8yIG9mZnNldC4gKi8KIAlpZiAoKHBBZC0+QVJzc2lPZmZzZXQyIDwgLTEwKSB8fCAocEFkLT5BUnNzaU9mZnNldDIgPiAxMCkpCiAJCXBBZC0+QVJzc2lPZmZzZXQyID0gMDsKIAotCS8vCi0JLy8gR2V0IExFRCBTZXR0aW5nLgotCS8vCisjaWZkZWYgUlQzMHh4CisJLyogKi8KKwkvKiBHZXQgVFggbWl4ZXIgZ2FpbiBzZXR0aW5nICovCisJLyogMHhmZiBhcmUgaW52YWxpZCB2YWx1ZSAqLworCS8qIE5vdGU6IFJUMzB4WCBkZWZhdWx0IHZhbHVlIGlzIDB4MDAgYW5kIHdpbGwgcHJvZ3JhbSB0byBSRl9SMTcgb25seSB3aGVuIHRoaXMgdmFsdWUgaXMgbm90IHplcm8uICovCisJLyogICAgICAgUlQzNTlYIGRlZmF1bHQgdmFsdWUgaXMgMHgwMiAqLworCS8qICovCisJaWYgKElTX1JUMzB4eChwQWQpIHx8IElTX1JUMzU3MihwQWQpKSB7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYTUlYRVJfR0FJTl8yXzRHLCB2YWx1ZSk7CisJCXBBZC0+VHhNaXhlckdhaW4yNEcgPSAwOworCQl2YWx1ZSAmPSAweDAwZmY7CisJCWlmICh2YWx1ZSAhPSAweGZmKSB7CisJCQl2YWx1ZSAmPSAweDA3OworCQkJcEFkLT5UeE1peGVyR2FpbjI0RyA9ICh1OCl2YWx1ZTsKKwkJfQorCX0KKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKworCS8qICovCisJLyogR2V0IExFRCBTZXR0aW5nLiAqLworCS8qICovCiAJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDNhLCB2YWx1ZSk7Ci0JcEFkLT5MZWRDbnRsLndvcmQgPSAodmFsdWUmMHhmZjAwKSA+PiA4OworCXBBZC0+TGVkQ250bC53b3JkID0gKHZhbHVlID4+IDgpOwogCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xFRDFfT0ZGU0VULCB2YWx1ZSk7CiAJcEFkLT5MZWQxID0gdmFsdWU7CiAJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTEVEMl9PRkZTRVQsIHZhbHVlKTsKQEAgLTE2ODUsNiArMTEwNiwxMiBAQAogCiAJUlRNUFJlYWRUeFB3clBlclJhdGUocEFkKTsKIAorI2lmZGVmIFJUMzB4eAorI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAorCVJ0bXBFZnVzZVN1cHBvcnRDaGVjayhwQWQpOworI2VuZGlmIC8qIFJUTVBfRUZVU0VfU1VQUE9SVCAvLyAqLworI2VuZGlmIC8qIFJUMzB4eCAvLyAqLworCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzXG4iKSk7CiB9CiAKQEAgLTE3MDYsMTcwICsxMTMzLDIxOCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlOSUNJbml0QXNpY0Zyb21FRVBST00oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIE5JQ0luaXRBc2ljRnJvbUVFUFJPTShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JVUlOVDMyCQkJCQlkYXRhID0gMDsKLQlVQ0hBUglCQlBSMSA9IDA7Ci0JVVNIT1JUCQkJCQlpOwotCUVFUFJPTV9BTlRFTk5BX1NUUlVDCUFudGVubmE7Ci0JRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDICAgIE5pY0NvbmZpZzI7Ci0JVUNIQVIJQkJQUjMgPSAwOworCXUzMiBkYXRhID0gMDsKKwl1OCBCQlBSMSA9IDA7CisJdTE2IGk7CisvKiAgICAgIEVFUFJPTV9BTlRFTk5BX1NUUlVDICAgIEFudGVubmE7ICovCisJRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDIE5pY0NvbmZpZzI7CisJdTggQkJQUjMgPSAwOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0luaXRBc2ljRnJvbUVFUFJPTVxuIikpOwotCWZvcihpID0gMzsgaSA8IE5VTV9FRVBST01fQkJQX1BBUk1TOyBpKyspCi0JewotCQlVQ0hBUiBCYnBSZWdJZHgsIEJicFZhbHVlOworCWZvciAoaSA9IDM7IGkgPCBOVU1fRUVQUk9NX0JCUF9QQVJNUzsgaSsrKSB7CisJCXU4IEJicFJlZ0lkeCwgQmJwVmFsdWU7CiAKLQkJaWYgKChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAweEZGRkYpICYmIChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAwKSkKLQkJewotCQkJQmJwUmVnSWR4ID0gKFVDSEFSKShwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSA+PiA4KTsKLQkJCUJicFZhbHVlICA9IChVQ0hBUikocEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gJiAweGZmKTsKKwkJaWYgKChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAweEZGRkYpCisJCSAgICAmJiAocEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gIT0gMCkpIHsKKwkJCUJicFJlZ0lkeCA9ICh1OCkocEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gPj4gOCk7CisJCQlCYnBWYWx1ZSA9ICh1OCkocEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gJiAweGZmKTsKIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCYnBSZWdJZHgsIEJicFZhbHVlKTsKIAkJfQogCX0KIAotI2lmbmRlZiBSVDI4NzAKLQlBbnRlbm5hLndvcmQgPSBwQWQtPkFudGVubmEud29yZDsKLSNlbHNlCi0JQW50ZW5uYS53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMF07Ci0JaWYgKEFudGVubmEud29yZCA9PSAweEZGRkYpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFMlBST00gZXJyb3IsIGhhcmQgY29kZSBhcyAweCUwNHhcbiIsIEFudGVubmEud29yZCkpOwotCQlCVUdfT04oQW50ZW5uYS53b3JkID09IDB4RkZGRik7Ci0JfQotI2VuZGlmCi0JcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAoVUNIQVIpIEFudGVubmEuZmllbGQuUnhQYXRoOwotCXBBZC0+UmZJY1R5cGUgPSAoVUNIQVIpIEFudGVubmEuZmllbGQuUmZJY1R5cGU7Ci0KLSNpZmRlZiBSVDI4NzAKLQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoInBBZC0+UmZJY1R5cGUgPSAlZCwgUmVhbFJ4UGF0aD0lZCwgVHhQYXRoID0gJWRcbiIsIHBBZC0+UmZJY1R5cGUsIHBBZC0+TWxtZS5SZWFsUnhQYXRoLEFudGVubmEuZmllbGQuVHhQYXRoKSk7Ci0KLQkvLyBTYXZlIHRoZSBhbnRlbm5hIGZvciBmdXR1cmUgdXNlCi0JcEFkLT5BbnRlbm5hLndvcmQgPSBBbnRlbm5hLndvcmQ7Ci0jZW5kaWYKIAlOaWNDb25maWcyLndvcmQgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsxXTsKIAotI2lmZGVmIFJUMjg3MAogCXsKLQkJaWYgKChOaWNDb25maWcyLndvcmQgJiAweDAwZmYpID09IDB4ZmYpCi0JCXsKKwkJaWYgKChOaWNDb25maWcyLndvcmQgJiAweDAwZmYpID09IDB4ZmYpIHsKIAkJCU5pY0NvbmZpZzIud29yZCAmPSAweGZmMDA7CiAJCX0KIAotCQlpZiAoKE5pY0NvbmZpZzIud29yZCA+PiA4KSA9PSAweGZmKQotCQl7CisJCWlmICgoTmljQ29uZmlnMi53b3JkID4+IDgpID09IDB4ZmYpIHsKIAkJCU5pY0NvbmZpZzIud29yZCAmPSAweDAwZmY7CiAJCX0KIAl9Ci0jZW5kaWYKLQkvLyBTYXZlIHRoZSBhbnRlbm5hIGZvciBmdXR1cmUgdXNlCisKKwkvKiBTYXZlIHRoZSBhbnRlbm5hIGZvciBmdXR1cmUgdXNlICovCiAJcEFkLT5OaWNDb25maWcyLndvcmQgPSBOaWNDb25maWcyLndvcmQ7CiAKLSNpZmRlZiBSVDI4NzAKLQkvLyBzZXQgZGVmYXVsdCBhbnRlbm5hIGFzIG1haW4KKyNpZmRlZiBSVDMweHgKKwkvKiBzZXQgZGVmYXVsdCBhbnRlbm5hIGFzIG1haW4gKi8KIAlpZiAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApCiAJCUFzaWNTZXRSeEFudChwQWQsIHBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQpOwotI2VuZGlmCi0JLy8KLQkvLyBTZW5kIExFRCBTZXR0aW5nIHRvIE1DVS4KLQkvLwotCWlmIChwQWQtPkxlZENudGwud29yZCA9PSAweEZGKQotCXsKKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKworCS8qICovCisJLyogU2VuZCBMRUQgU2V0dGluZyB0byBNQ1UuICovCisJLyogKi8KKwlpZiAocEFkLT5MZWRDbnRsLndvcmQgPT0gMHhGRikgewogCQlwQWQtPkxlZENudGwud29yZCA9IDB4MDE7CiAJCXBBZC0+TGVkMSA9IDB4NTU1NTsKIAkJcEFkLT5MZWQyID0gMHgyMjIxOwotI2lmZGVmIFJUMjg2MAotCQlwQWQtPkxlZDMgPSAweEE5Rjg7Ci0jZW5kaWYKIAotI2lmZGVmIFJUMjg3MAorI2lmZGVmIFJUTVBfTUFDX1BDSQorCQlwQWQtPkxlZDMgPSAweEE5Rjg7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCiAJCXBBZC0+TGVkMyA9IDB4NTYyNzsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAl9CiAKLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTIsIDB4ZmYsIChVQ0hBUilwQWQtPkxlZDEsIChVQ0hBUikocEFkLT5MZWQxID4+IDgpKTsKLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTMsIDB4ZmYsIChVQ0hBUilwQWQtPkxlZDIsIChVQ0hBUikocEFkLT5MZWQyID4+IDgpKTsKLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTQsIDB4ZmYsIChVQ0hBUilwQWQtPkxlZDMsIChVQ0hBUikocEFkLT5MZWQzID4+IDgpKTsKLSAgICBwQWQtPkxlZEluZGljYXRvclN0cmVndGggPSAweEZGOwotICAgIFJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLy8gRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBiZWZvcmUgbGluayB1cAorCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MiwgMHhmZiwgKHU4KXBBZC0+TGVkMSwKKwkJCSAgICAgKHU4KShwQWQtPkxlZDEgPj4gOCkpOworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MywgMHhmZiwgKHU4KXBBZC0+TGVkMiwKKwkJCSAgICAgKHU4KShwQWQtPkxlZDIgPj4gOCkpOworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1NCwgMHhmZiwgKHU4KXBBZC0+TGVkMywKKwkJCSAgICAgKHU4KShwQWQtPkxlZDMgPj4gOCkpOworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MSwgMHhmZiwgMCwgcEFkLT5MZWRDbnRsLmZpZWxkLlBvbGFyaXR5KTsKKworCXBBZC0+TGVkSW5kaWNhdG9yU3RyZW5ndGggPSAweEZGOworCVJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLyogRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBiZWZvcmUgbGluayB1cCAqLwogCiAJewotCQkvLyBSZWFkIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gc3RhdGUgZW5hYmxlIGJpdAotCQlpZiAoTmljQ29uZmlnMi5maWVsZC5IYXJkd2FyZVJhZGlvQ29udHJvbCA9PSAxKQotCQl7CisJCS8qIFJlYWQgSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBzdGF0ZSBlbmFibGUgYml0ICovCisJCWlmIChOaWNDb25maWcyLmZpZWxkLkhhcmR3YXJlUmFkaW9Db250cm9sID09IDEpIHsKIAkJCXBBZC0+U3RhQ2ZnLmJIYXJkd2FyZVJhZGlvID0gVFJVRTsKIAotCQkJLy8gUmVhZCBHUElPIHBpbjIgYXMgSGFyZHdhcmUgY29udHJvbGxlZCByYWRpbyBzdGF0ZQorCQkJLyogUmVhZCBHUElPIHBpbjIgYXMgSGFyZHdhcmUgY29udHJvbGxlZCByYWRpbyBzdGF0ZSAqLwogCQkJUlRNUF9JT19SRUFEMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCAmZGF0YSk7Ci0JCQlpZiAoKGRhdGEgJiAweDA0KSA9PSAwKQotCQkJeworCQkJaWYgKChkYXRhICYgMHgwNCkgPT0gMCkgewogCQkJCXBBZC0+U3RhQ2ZnLmJId1JhZGlvID0gRkFMU0U7CiAJCQkJcEFkLT5TdGFDZmcuYlJhZGlvID0gRkFMU0U7CisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIFBXUl9QSU5fQ0ZHLCAweDAwMDAxODE4KTsgKi8KIAkJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOwogCQkJfQotCQl9Ci0JCWVsc2UKKwkJfSBlbHNlCiAJCQlwQWQtPlN0YUNmZy5iSGFyZHdhcmVSYWRpbyA9IEZBTFNFOwogCi0JCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpCi0JCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkgewogCQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7Ci0jaWZkZWYgUlQyODYwCisjaWZkZWYgUlRNUF9NQUNfUENJCisjaWZkZWYgUlQzMDkwCisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIFBvd2VyUmFkaW9PZmZDSUQsIDB4ZmYsCisJCQkJCSAgICAgMHgwMik7CisJCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyUmFkaW9PZmZDSUQpOworI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworI2lmbmRlZiBSVDMwOTAKIAkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgMHhmZiwgMHhmZiwgMHgwMik7Ci0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIFBvd2VyV2FrZUNJRCwgMHgwMCwgMHgwMCk7Ci0JCQkvLyAyLTEuIHdhaXQgY29tbWFuZCBvay4KKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgUG93ZXJXYWtlQ0lELCAweDAwLAorCQkJCQkgICAgIDB4MDApOworCQkJLyogMi0xLiB3YWl0IGNvbW1hbmQgb2suICovCiAJCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyV2FrZUNJRCk7Ci0jZW5kaWYKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAkJfQogCX0KIAotCS8vIFR1cm4gb2ZmIHBhdGNoaW5nIGZvciBjYXJkYnVzIGNvbnRyb2xsZXIKLQlpZiAoTmljQ29uZmlnMi5maWVsZC5DYXJkYnVzQWNjZWxlcmF0aW9uID09IDEpCi0JeworI2lmZGVmIFJUTVBfTUFDX1BDSQorI2lmZGVmIFJUMzB4eAorCWlmIChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgeworCQlzdHJ1Y3QgcnRfcnRtcF9jaGlwX29wICpwQ2hpcE9wcyA9ICZwQWQtPmNoaXBPcHM7CisJCWlmIChwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUpCisJCQlwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUocEFkKTsKKwl9CisJLyogMzA5MCBNQ1UgV2FrZXVwIGNvbW1hbmQgbmVlZHMgbW9yZSB0aW1lIHRvIGJlIHN0YWJsZS4gKi8KKwkvKiBCZWZvcmUgc3RhYmxlLCBkb24ndCBpc3N1ZSBvdGhlciBNQ1UgY29tbWFuZCB0byBwcmV2ZW50IGZyb20gZmlybXdhcmUgZXJyb3IuICovCisKKwlpZiAoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCSAgICAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQorCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQorCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzLCByZWxlYXNlIE1jdSBMb2NrXG4iLCBfX2Z1bmNfXykpOworCQlSVE1QX1NFTV9MT0NLKCZwQWQtPk1jdUNtZExvY2spOworCQlwQWQtPmJydDMweHhCYW5NY3VDbWQgPSBGQUxTRTsKKwkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1jdUNtZExvY2spOworCX0KKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKworCS8qIFR1cm4gb2ZmIHBhdGNoaW5nIGZvciBjYXJkYnVzIGNvbnRyb2xsZXIgKi8KKwlpZiAoTmljQ29uZmlnMi5maWVsZC5DYXJkYnVzQWNjZWxlcmF0aW9uID09IDEpIHsKKy8qICAgICAgICAgICAgICBwQWQtPmJUZXN0MSA9IFRSVUU7ICovCiAJfQogCiAJaWYgKE5pY0NvbmZpZzIuZmllbGQuRHluYW1pY1R4QWdjQ29udHJvbCA9PSAxKQogCQlwQWQtPmJBdXRvVHhBZ2NBID0gcEFkLT5iQXV0b1R4QWdjRyA9IFRSVUU7CiAJZWxzZQogCQlwQWQtPmJBdXRvVHhBZ2NBID0gcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOwotCi0JLyogQkJQIGhhcyBiZWVuIHByb2dyYW1tZWQgc28gcmVzZXQgdG8gVU5LTk9XTl9CQU5EICovCisJLyogKi8KKwkvKiBTaW5jZSBCQlAgaGFzIGJlZW4gcHJvZ2FtZWQsIHRvIG1ha2Ugc3VyZSBCQlAgc2V0dGluZyB3aWxsIGJlICovCisJLyogdXBhdGUgaW5zaWRlIG9mIEFzaWNBbnRlbm5hU2VsZWN0LCBzbyByZXNldCB0byBVTktOT1dOX0JBTkQhICovCisJLyogKi8KIAlwQWQtPkNvbW1vbkNmZy5CYW5kU3RhdGUgPSBVTktOT1dOX0JBTkQ7CiAKIAlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBSMyk7CiAJQkJQUjMgJj0gKH4weDE4KTsKLQlpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCi0JeworCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpIHsKIAkJQkJQUjMgfD0gKDB4MTApOwotCX0KLQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKLQl7CisJfSBlbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpIHsKIAkJQkJQUjMgfD0gKDB4OCk7Ci0JfQotCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCXsKKwl9IGVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkgewogCQlCQlBSMyB8PSAoMHgwKTsKIAl9CiAJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQUjMpOwogCiAJewotCQkvLyBIYW5kbGUgdGhlIGRpZmZlcmVuY2Ugd2hlbiAxVAorCQkvKiBIYW5kbGUgdGhlIGRpZmZlcmVuY2Ugd2hlbiAxVCAqLwogCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCQlBSMSk7Ci0JCWlmKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKLQkJewotCQlCQlBSMSAmPSAofjB4MTgpOworCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSB7CisJCQlCQlBSMSAmPSAofjB4MTgpOwogCQl9CiAJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJCUFIxKTsKIAotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJVc2UgSHcgUmFkaW8gQ29udHJvbCBQaW49JWQ7IGlmIHVzZWQgUGluPSVkO1xuIiwgcEFkLT5Db21tb25DZmcuYkhhcmR3YXJlUmFkaW8sIHBBZC0+Q29tbW9uQ2ZnLmJIYXJkd2FyZVJhZGlvKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiVXNlIEh3IFJhZGlvIENvbnRyb2wgUGluPSVkOyBpZiB1c2VkIFBpbj0lZDtcbiIsCisJCQkgIHBBZC0+Q29tbW9uQ2ZnLmJIYXJkd2FyZVJhZGlvLAorCQkJICBwQWQtPkNvbW1vbkNmZy5iSGFyZHdhcmVSYWRpbykpOwogCX0KIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4UGF0aCA9ICVkLCBSeFBhdGggPSAlZCwgUkZJQz0lZCwgUG9sYXIrTEVEIG1vZGU9JXhcbiIsIHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgsIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGgsIHBBZC0+UmZJY1R5cGUsIHBBZC0+TGVkQ250bC53b3JkKSk7CisjaWZkZWYgUlRNUF9NQUNfVVNCCisjaWZkZWYgUlQzMHh4CisJLyogdXBkYXRlIHJlZ2lzdGVycyBmcm9tIEVFUFJPTSBmb3IgUlQzMDcxIG9yIGxhdGVyKDM1NzIvMzU5MikuICovCisKKwlpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpIHsKKwkJdTggUmVnSWR4LCBSZWdWYWx1ZTsKKwkJdTE2IHZhbHVlOworCisJCS8qIGFmdGVyIFJUMzA3MSwgd3JpdGUgQkJQIGZyb20gRUVQUk9NIDB4RjAgdG8gMHgxMDIgKi8KKwkJZm9yIChpID0gMHhGMDsgaSA8PSAweDEwMjsgaSA9IGkgKyAyKSB7CisJCQl2YWx1ZSA9IDB4RkZGRjsKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgaSwgdmFsdWUpOworCQkJaWYgKCh2YWx1ZSAhPSAweEZGRkYpICYmICh2YWx1ZSAhPSAwKSkgeworCQkJCVJlZ0lkeCA9ICh1OCkodmFsdWUgPj4gOCk7CisJCQkJUmVnVmFsdWUgPSAodTgpKHZhbHVlICYgMHhmZik7CisJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIFJlZ0lkeCwKKwkJCQkJCQkgICAgIFJlZ1ZhbHVlKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiVXBkYXRlIEJCUCBSZWdpc3RlcnMgZnJvbSBFRVBST00oMHglMHgpLCBCQlAoMHgleCkgPSAweCV4XG4iLAorCQkJCQkgIGksIFJlZ0lkeCwgUmVnVmFsdWUpKTsKKwkJCX0KKwkJfQorCisJCS8qIGFmdGVyIFJUMzA3MSwgd3JpdGUgUkYgZnJvbSBFRVBST00gMHgxMDQgdG8gMHgxMTYgKi8KKwkJZm9yIChpID0gMHgxMDQ7IGkgPD0gMHgxMTY7IGkgPSBpICsgMikgeworCQkJdmFsdWUgPSAweEZGRkY7CisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIGksIHZhbHVlKTsKKwkJCWlmICgodmFsdWUgIT0gMHhGRkZGKSAmJiAodmFsdWUgIT0gMCkpIHsKKwkJCQlSZWdJZHggPSAodTgpKHZhbHVlID4+IDgpOworCQkJCVJlZ1ZhbHVlID0gKHU4KSh2YWx1ZSAmIDB4ZmYpOworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJlZ0lkeCwgUmVnVmFsdWUpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJVcGRhdGUgUkYgUmVnaXN0ZXJzIGZyb20gRUVQUk9NMHgleCksIEJCUCgweCV4KSA9IDB4JXhcbiIsCisJCQkJCSAgaSwgUmVnSWR4LCBSZWdWYWx1ZSkpOworCQkJfQorCQl9CisJfQorI2VuZGlmIC8qIFJUMzB4eCAvLyAqLworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlR4UGF0aCA9ICVkLCBSeFBhdGggPSAlZCwgUkZJQz0lZCwgUG9sYXIrTEVEIG1vZGU9JXhcbiIsCisJCSAgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwgcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCwKKwkJICBwQWQtPlJmSWNUeXBlLCBwQWQtPkxlZENudGwud29yZCkpOwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0QXNpY0Zyb21FRVBST01cbiIpKTsKIH0KIApAQCAtMTg5MSwzOSArMTM2NiwzOSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTkRJU19TVEFUVVMJTklDSW5pdGlhbGl6ZUFkYXB0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gICBCT09MRUFOICAgIGJIYXJkUmVzZXQpCitpbnQgTklDSW5pdGlhbGl6ZUFkYXB0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJIYXJkUmVzZXQpCiB7Ci0JTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7Ci0jaWZkZWYgUlQyODYwCi0JVUlOVDMyCQkJVmFsdWU7Ci0JREVMQVlfSU5UX0NGR19TVFJVQwlJbnRDZmc7Ci0jZW5kaWYKLQlVTE9ORwlpID0wLCBqPTA7Ci0JQUNfVFhPUF9DU1IwX1NUUlVDCWNzcjA7CisJaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJV1BETUFfR0xPX0NGR19TVFJVQyBHbG9DZmc7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJdTMyIFZhbHVlOworCURFTEFZX0lOVF9DRkdfU1RSVUMgSW50Q2ZnOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworLyogICAgICBJTlRfTUFTS19DU1JfU1RSVUMgICAgICAgICAgICAgIEludE1hc2s7ICovCisJdW5zaWduZWQgbG9uZyBpID0gMCwgaiA9IDA7CisJQUNfVFhPUF9DU1IwX1NUUlVDIGNzcjA7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdGlhbGl6ZUFkYXB0ZXJcbiIpKTsKIAotCS8vIDMuIFNldCBETUEgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZXhjZXB0IFRYX0RNQV9FTiBhbmQgUlhfRE1BX0VOIGJpdHM6CisJLyogMy4gU2V0IERNQSBnbG9iYWwgY29uZmlndXJhdGlvbiBleGNlcHQgVFhfRE1BX0VOIGFuZCBSWF9ETUFfRU4gYml0czogKi8KIHJldHJ5OgogCWkgPSAwOwotCWRvCi0JeworCWRvIHsKIAkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwotCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQorCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkKKwkJICAgICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQogCQkJYnJlYWs7CiAKIAkJUlRNUHVzZWNEZWxheSgxMDAwKTsKIAkJaSsrOwotCX13aGlsZSAoIGk8MTAwKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gRE1BIG9mZnNldCAweDIwOCA9IDB4JXhcbiIsIEdsb0NmZy53b3JkKSk7CisJfSB3aGlsZSAoaSA8IDEwMCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIjw9PSBETUEgb2Zmc2V0IDB4MjA4ID0gMHgleFxuIiwgR2xvQ2ZnLndvcmQpKTsKIAlHbG9DZmcud29yZCAmPSAweGZmMDsKLQlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0xOworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAxOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKIAotCS8vIFJlY29yZCBIVyBCZWFjb24gb2Zmc2V0CisJLyogUmVjb3JkIEhXIEJlYWNvbiBvZmZzZXQgKi8KIAlwQWQtPkJlYWNvbk9mZnNldFswXSA9IEhXX0JFQUNPTl9CQVNFMDsKIAlwQWQtPkJlYWNvbk9mZnNldFsxXSA9IEhXX0JFQUNPTl9CQVNFMTsKIAlwQWQtPkJlYWNvbk9mZnNldFsyXSA9IEhXX0JFQUNPTl9CQVNFMjsKQEAgLTE5MzMsOTEgKzE0MDgsODcgQEAKIAlwQWQtPkJlYWNvbk9mZnNldFs2XSA9IEhXX0JFQUNPTl9CQVNFNjsKIAlwQWQtPkJlYWNvbk9mZnNldFs3XSA9IEhXX0JFQUNPTl9CQVNFNzsKIAotCS8vCi0JLy8gd3JpdGUgYWxsIHNoYXJlZCBSaW5nJ3MgYmFzZSBhZGRyZXNzIGludG8gQVNJQwotCS8vCisJLyogKi8KKwkvKiB3cml0ZSBhbGwgc2hhcmVkIFJpbmcncyBiYXNlIGFkZHJlc3MgaW50byBBU0lDICovCisJLyogKi8KIAotCS8vIGFzaWMgc2ltdWxhdGlvbiBzZXF1ZW5jZSBwdXQgdGhpcyBhaGVhZCBiZWZvcmUgbG9hZGluZyBmaXJtd2FyZS4KLQkvLyBwYmYgaGFyZHdhcmUgcmVzZXQKLSNpZmRlZiBSVDI4NjAKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9SU1RfSURYLCAweDEwMDNmKTsJLy8gMHgxMDAwMCBmb3IgcmVzZXQgcngsIDB4M2YgcmVzZXRzIGFsbCA2IHR4IHJpbmdzLgorCS8qIGFzaWMgc2ltdWxhdGlvbiBzZXF1ZW5jZSBwdXQgdGhpcyBhaGVhZCBiZWZvcmUgbG9hZGluZyBmaXJtd2FyZS4gKi8KKwkvKiBwYmYgaGFyZHdhcmUgcmVzZXQgKi8KKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9SU1RfSURYLCAweDEwMDNmKTsJLyogMHgxMDAwMCBmb3IgcmVzZXQgcngsIDB4M2YgcmVzZXRzIGFsbCA2IHR4IHJpbmdzLiAqLwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHhlMWYpOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHhlMDApOwotI2VuZGlmCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKLQkvLyBJbml0aWFsemUgQVNJQyBmb3IgVFggJiBSeCBvcGVyYXRpb24KLQlpZiAoTklDSW5pdGlhbGl6ZUFzaWMocEFkICwgYkhhcmRSZXNldCkgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCWlmIChqKysgPT0gMCkKLQkJeworCS8qIEluaXRpYWx6ZSBBU0lDIGZvciBUWCAmIFJ4IG9wZXJhdGlvbiAqLworCWlmIChOSUNJbml0aWFsaXplQXNpYyhwQWQsIGJIYXJkUmVzZXQpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaWYgKGorKyA9PSAwKSB7CiAJCQlOSUNMb2FkRmlybXdhcmUocEFkKTsKIAkJCWdvdG8gcmV0cnk7CiAJCX0KIAkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CiAJfQogCi0KLSNpZmRlZiBSVDI4NjAKLQkvLyBXcml0ZSBBQ19CSyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIKLQlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19CS10uQ2VsbFswXS5BbGxvY1BhKTsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkvKiBXcml0ZSBBQ19CSyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKwlWYWx1ZSA9CisJICAgIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19CS10uQ2VsbFswXS5BbGxvY1BhKTsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjEsIFZhbHVlKTsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFIxIDogMHgleFxuIiwgVmFsdWUpKTsKIAotCS8vIFdyaXRlIEFDX0JFIGJhc2UgYWRkcmVzcyByZWdpc3RlcgotCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsWzBdLkFsbG9jUGEpOworCS8qIFdyaXRlIEFDX0JFIGJhc2UgYWRkcmVzcyByZWdpc3RlciAqLworCVZhbHVlID0KKwkgICAgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsWzBdLkFsbG9jUGEpOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBU0VfUFRSMCwgVmFsdWUpOwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBUWF9CQVNFX1BUUjAgOiAweCV4XG4iLCBWYWx1ZSkpOwogCi0JLy8gV3JpdGUgQUNfVkkgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyCi0JVmFsdWUgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4UmluZ1tRSURfQUNfVkldLkNlbGxbMF0uQWxsb2NQYSk7CisJLyogV3JpdGUgQUNfVkkgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyICovCisJVmFsdWUgPQorCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4UmluZ1tRSURfQUNfVkldLkNlbGxbMF0uQWxsb2NQYSk7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFIyLCBWYWx1ZSk7CiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSMiA6IDB4JXhcbiIsIFZhbHVlKSk7CiAKLQkvLyBXcml0ZSBBQ19WTyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIKLQlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19WT10uQ2VsbFswXS5BbGxvY1BhKTsKKwkvKiBXcml0ZSBBQ19WTyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKwlWYWx1ZSA9CisJICAgIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19WT10uQ2VsbFswXS5BbGxvY1BhKTsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjMsIFZhbHVlKTsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFIzIDogMHgleFxuIiwgVmFsdWUpKTsKIAotCS8vIFdyaXRlIEhDQ0EgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyCi0JICBWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9IQ0NBXS5DZWxsWzBdLkFsbG9jUGEpOwotCSAgUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFI0LCBWYWx1ZSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSNCA6IDB4JXhcbiIsIFZhbHVlKSk7Ci0KLQkvLyBXcml0ZSBNR01UX0JBU0VfQ1NSIHJlZ2lzdGVyCisJLyogV3JpdGUgTUdNVF9CQVNFX0NTUiByZWdpc3RlciAqLwogCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5NZ210UmluZy5DZWxsWzBdLkFsbG9jUGEpOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBU0VfUFRSNSwgVmFsdWUpOwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBUWF9CQVNFX1BUUjUgOiAweCV4XG4iLCBWYWx1ZSkpOwogCi0JLy8gV3JpdGUgUlhfQkFTRV9DU1IgcmVnaXN0ZXIKKwkvKiBXcml0ZSBSWF9CQVNFX0NTUiByZWdpc3RlciAqLwogCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5SeFJpbmcuQ2VsbFswXS5BbGxvY1BhKTsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9CQVNFX1BUUiwgVmFsdWUpOwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSWF9CQVNFX1BUUiA6IDB4JXhcbiIsIFZhbHVlKSk7CiAKLQkvLyBJbml0IFJYIFJpbmcgaW5kZXggcG9pbnRlcgorCS8qIEluaXQgUlggUmluZyBpbmRleCBwb2ludGVyICovCiAJcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPSAwOwotCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gUlhfUklOR19TSVpFLTE7CisJcEFkLT5SeFJpbmcuUnhDcHVJZHggPSBSWF9SSU5HX1NJWkUgLSAxOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKIAotCS8vIEluaXQgVFggcmluZ3MgaW5kZXggcG9pbnRlcgorCS8qIEluaXQgVFggcmluZ3MgaW5kZXggcG9pbnRlciAqLwogCXsKLQkJZm9yIChpPTA7IGk8TlVNX09GX1RYX1JJTkc7IGkrKykKLQkJeworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX09GX1RYX1JJTkc7IGkrKykgewogCQkJcEFkLT5UeFJpbmdbaV0uVHhTd0ZyZWVJZHggPSAwOwogCQkJcEFkLT5UeFJpbmdbaV0uVHhDcHVJZHggPSAwOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgKFRYX0NUWF9JRFgwICsgaSAqIDB4MTApICwgIHBBZC0+VHhSaW5nW2ldLlR4Q3B1SWR4KTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIChUWF9DVFhfSURYMCArIGkgKiAweDEwKSwKKwkJCQkJcEFkLT5UeFJpbmdbaV0uVHhDcHVJZHgpOwogCQl9CiAJfQogCi0JLy8gaW5pdCBNR01UIHJpbmcgaW5kZXggcG9pbnRlcgorCS8qIGluaXQgTUdNVCByaW5nIGluZGV4IHBvaW50ZXIgKi8KIAlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gMDsKIAlwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4ID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01HTVRDVFhfSURYLCBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KTsKIAotCS8vCi0JLy8gc2V0IGVhY2ggUmluZydzIFNJWkUgIGludG8gQVNJQy4gRGVzY3JpcHRvciBTaXplIGlzIGZpeGVkIGJ5IGRlc2lnbi4KLQkvLworCS8qICovCisJLyogc2V0IGVhY2ggUmluZydzIFNJWkUgIGludG8gQVNJQy4gRGVzY3JpcHRvciBTaXplIGlzIGZpeGVkIGJ5IGRlc2lnbi4gKi8KKwkvKiAqLwogCi0JLy8gV3JpdGUgVFhfUklOR19DU1IwIHJlZ2lzdGVyCisJLyogV3JpdGUgVFhfUklOR19DU1IwIHJlZ2lzdGVyICovCiAJVmFsdWUgPSBUWF9SSU5HX1NJWkU7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUFYX0NOVDAsIFZhbHVlKTsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NQVhfQ05UMSwgVmFsdWUpOwpAQCAtMjAyNyw1MyArMTQ5OCw0NyBAQAogCVZhbHVlID0gTUdNVF9SSU5HX1NJWkU7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUdNVE1BWF9DTlQsIFZhbHVlKTsKIAotCS8vIFdyaXRlIFJYX1JJTkdfQ1NSIHJlZ2lzdGVyCisJLyogV3JpdGUgUlhfUklOR19DU1IgcmVnaXN0ZXIgKi8KIAlWYWx1ZSA9IFJYX1JJTkdfU0laRTsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9NQVhfQ05ULCBWYWx1ZSk7Ci0jZW5kaWYgLyogUlQyODYwICovCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKLQotCS8vIFdNTSBwYXJhbWV0ZXIKKwkvKiBXTU0gcGFyYW1ldGVyICovCiAJY3NyMC53b3JkID0gMDsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDBfQ0ZHLCBjc3IwLndvcmQpOwotCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCi0JewotCQljc3IwLmZpZWxkLkFjMFR4b3AgPSAxOTI7CS8vIEFDX1ZJOiAxOTIqMzJ1cyB+PSA2bXMKLQkJY3NyMC5maWVsZC5BYzFUeG9wID0gOTY7CS8vIEFDX1ZPOiA5NiozMnVzICB+PSAzbXMKLQl9Ci0JZWxzZQotCXsKLQkJY3NyMC5maWVsZC5BYzBUeG9wID0gOTY7CS8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcwotCQljc3IwLmZpZWxkLkFjMVR4b3AgPSA0ODsJLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKKwlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKSB7CisJCWNzcjAuZmllbGQuQWMwVHhvcCA9IDE5MjsJLyogQUNfVkk6IDE5MiozMnVzIH49IDZtcyAqLworCQljc3IwLmZpZWxkLkFjMVR4b3AgPSA5NjsJLyogQUNfVk86IDk2KjMydXMgIH49IDNtcyAqLworCX0gZWxzZSB7CisJCWNzcjAuZmllbGQuQWMwVHhvcCA9IDk2OwkvKiBBQ19WSTogOTYqMzJ1cyB+PSAzbXMgKi8KKwkJY3NyMC5maWVsZC5BYzFUeG9wID0gNDg7CS8qIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zICovCiAJfQogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMV9DRkcsIGNzcjAud29yZCk7CiAKLQotI2lmZGVmIFJUMjg2MAotCS8vIDMuIFNldCBETUEgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZXhjZXB0IFRYX0RNQV9FTiBhbmQgUlhfRE1BX0VOIGJpdHM6CisjaWZkZWYgUlRNUF9NQUNfUENJCisJLyogMy4gU2V0IERNQSBnbG9iYWwgY29uZmlndXJhdGlvbiBleGNlcHQgVFhfRE1BX0VOIGFuZCBSWF9ETUFfRU4gYml0czogKi8KIAlpID0gMDsKLQlkbwotCXsKKwlkbyB7CiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKLQkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKKwkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApCisJCSAgICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKIAkJCWJyZWFrOwogCiAJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CiAJCWkrKzsKLQl9d2hpbGUgKCBpIDwgMTAwKTsKKwl9IHdoaWxlIChpIDwgMTAwKTsKIAogCUdsb0NmZy53b3JkICY9IDB4ZmYwOwotCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPTE7CisJR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9IDE7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOwogCiAJSW50Q2ZnLndvcmQgPSAwOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIERFTEFZX0lOVF9DRkcsIEludENmZy53b3JkKTsKLSNlbmRpZgorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0KLQkvLyByZXNldCBhY3Rpb24KLQkvLyBMb2FkIGZpcm13YXJlCi0JLy8gIFN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOworCS8qIHJlc2V0IGFjdGlvbiAqLworCS8qIExvYWQgZmlybXdhcmUgKi8KKwkvKiAgU3RhdHVzID0gTklDTG9hZEZpcm13YXJlKHBBZCk7ICovCiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdGlhbGl6ZUFkYXB0ZXJcbiIpKTsKIAlyZXR1cm4gU3RhdHVzOwpAQCAtMjA5Nyw0MiArMTU2Miw1NSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTkRJU19TVEFUVVMJTklDSW5pdGlhbGl6ZUFzaWMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gIEJPT0xFQU4JCWJIYXJkUmVzZXQpCitpbnQgTklDSW5pdGlhbGl6ZUFzaWMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJIYXJkUmVzZXQpCiB7Ci0JVUxPTkcJCQlJbmRleCA9IDA7Ci0JVUNIQVIJCQlSMCA9IDB4ZmY7Ci0JVUlOVDMyCQkJTWFjQ3NyMTIgPSAwLCBDb3VudGVyID0gMDsKLSNpZmRlZiBSVDI4NzAKLQlVSU5UMzIJCQlNYWNDc3IwID0gMDsKLQlOVFNUQVRVUwkJU3RhdHVzOwotCVVDSEFSCQkJVmFsdWUgPSAweGZmOwotCVVJTlQzMgkJCWVGdXNlQ3RybDsKLSNlbmRpZgotCVVTSE9SVAkJCUtleUlkeDsKLQlJTlQJCQkJaSxhcGlkeDsKKwl1bnNpZ25lZCBsb25nIEluZGV4ID0gMDsKKwl1OCBSMCA9IDB4ZmY7CisJdTMyIE1hY0NzcjEyID0gMCwgQ291bnRlciA9IDA7CisjaWZkZWYgUlRNUF9NQUNfVVNCCisJdTMyIE1hY0NzcjAgPSAwOworCWludCBTdGF0dXM7CisJdTggVmFsdWUgPSAweGZmOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworI2lmZGVmIFJUMzB4eAorCXU4IGJicHJlZyA9IDA7CisJdTggUkZWYWx1ZSA9IDA7CisjZW5kaWYgLyogUlQzMHh4IC8vICovCisJdTE2IEtleUlkeDsKKwlpbnQgaSwgYXBpZHg7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdGlhbGl6ZUFzaWNcbiIpKTsKIAotI2lmZGVmIFJUMjg2MAotCWlmIChiSGFyZFJlc2V0ID09IFRSVUUpCi0JeworI2lmZGVmIFJUTVBfTUFDX1BDSQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBXUl9QSU5fQ0ZHLCAweDMpOwkvKiBUbyBmaXggZHJpdmVyIGRpc2FibGUvZW5hYmxlIGhhbmcgaXNzdWUgd2hlbiByYWRpbyBvZmYgKi8KKwlpZiAoYkhhcmRSZXNldCA9PSBUUlVFKSB7CiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgzKTsKLQl9Ci0JZWxzZQorCX0gZWxzZQogCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MSk7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkvLwotCS8vIE1ha2Ugc3VyZSBNQUMgZ2V0cyByZWFkeSBhZnRlciBOSUNMb2FkRmlybXdhcmUoKS4KLQkvLworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDApOworCS8qIEluaXRpYWxpemUgTUFDIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUgKi8KKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fTUFDX1JFR19QQVJNUzsgSW5kZXgrKykgeworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsCisJCQkJTUFDUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKKwl9CisKKwl7CisJCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9TVEFfTUFDX1JFR19QQVJNUzsgSW5kZXgrKykgeworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgU1RBTUFDUmVnVGFibGVbSW5kZXhdLlJlZ2lzdGVyLAorCQkJCQlTVEFNQUNSZWdUYWJsZVtJbmRleF0uVmFsdWUpOworCQl9CisJfQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCS8qICovCisJLyogTWFrZSBzdXJlIE1BQyBnZXRzIHJlYWR5IGFmdGVyIE5JQ0xvYWRGaXJtd2FyZSgpLiAqLworCS8qICovCiAJSW5kZXggPSAwOwogCi0JLy9UbyBhdm9pZCBoYW5nLW9uIGlzc3VlIHdoZW4gaW50ZXJmYWNlIHVwIGluIGtlcm5lbCAyLjQsCi0JLy93ZSB1c2UgYSBsb2NhbCB2YXJpYWJsZSAiTWFjQ3NyMCIgaW5zdGVhZCBvZiB1c2luZyAicEFkLT5NQUNWZXJzaW9uIiBkaXJlY3RseS4KLQlkbwotCXsKKwkvKlRvIGF2b2lkIGhhbmctb24gaXNzdWUgd2hlbiBpbnRlcmZhY2UgdXAgaW4ga2VybmVsIDIuNCwgKi8KKwkvKndlIHVzZSBhIGxvY2FsIHZhcmlhYmxlICJNYWNDc3IwIiBpbnN0ZWFkIG9mIHVzaW5nICJwQWQtPk1BQ1ZlcnNpb24iIGRpcmVjdGx5LiAqLworCWRvIHsKIAkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfQ1NSMCwgJk1hY0NzcjApOwogCiAJCWlmICgoTWFjQ3NyMCAhPSAweDAwKSAmJiAoTWFjQ3NyMCAhPSAweEZGRkZGRkZGKSkKQEAgLTIxNDIsOCArMTYyMCw5IEBACiAJfSB3aGlsZSAoSW5kZXgrKyA8IDEwMCk7CiAKIAlwQWQtPk1BQ1ZlcnNpb24gPSBNYWNDc3IwOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1BQ19DU1IwICBbIFZlcjpSZXY9MHglMDh4XVxuIiwgcEFkLT5NQUNWZXJzaW9uKSk7Ci0JLy8gdHVybiBvbiBiaXQxMyAoc2V0IHRvIHplcm8pIGFmdGVyIHJ0Mjg2MEQuIFRoaXMgaXMgdG8gc29sdmUgaGlnaC1jdXJyZW50IGlzc3VlLgorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJNQUNfQ1NSMCAgWyBWZXI6UmV2PTB4JTA4eF1cbiIsIHBBZC0+TUFDVmVyc2lvbikpOworCS8qIHR1cm4gb24gYml0MTMgKHNldCB0byB6ZXJvKSBhZnRlciBydDI4NjBELiBUaGlzIGlzIHRvIHNvbHZlIGhpZ2gtY3VycmVudCBpc3N1ZS4gKi8KIAlSVE1QX0lPX1JFQUQzMihwQWQsIFBCRl9TWVNfQ1RSTCwgJk1hY0NzcjEyKTsKIAlNYWNDc3IxMiAmPSAofjB4MjAwMCk7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCBNYWNDc3IxMik7CkBAIC0yMTUxLDIwMyArMTYzMCwyMjMgQEAKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4Myk7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgVVNCX0RNQV9DRkcsIDB4MCk7CiAJU3RhdHVzID0gUlRVU0JWZW5kZXJSZXNldChwQWQpOwotI2VuZGlmCiAKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MCk7CiAKLQkvLyBJbml0aWFsaXplIE1BQyByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCi0jaWZkZWYgUlQyODYwCi0JZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTlVNX01BQ19SRUdfUEFSTVM7IEluZGV4KyspCi0JewotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIE1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7Ci0JfQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JZm9yKEluZGV4PTA7IEluZGV4PE5VTV9NQUNfUkVHX1BBUk1TOyBJbmRleCsrKQotCXsKLSNpZmRlZiBSVDMwNzAKLQkJaWYgKChNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIgPT0gVFhfU1dfQ0ZHMCkgJiYgKElTX1JUMzA3MChwQWQpIHx8IElTX1JUMzA3MShwQWQpKSkKLQkJeworCS8qIEluaXRpYWxpemUgTUFDIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUgKi8KKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fTUFDX1JFR19QQVJNUzsgSW5kZXgrKykgeworI2lmZGVmIFJUMzB4eAorCQlpZiAoKE1BQ1JlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciA9PSBUWF9TV19DRkcwKQorCQkgICAgJiYgKElTX1JUMzA3MChwQWQpIHx8IElTX1JUMzA3MShwQWQpIHx8IElTX1JUMzU3MihwQWQpCisJCQl8fCBJU19SVDMwOTAocEFkKSB8fCBJU19SVDMzOTAocEFkKSkpIHsKIAkJCU1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSA9IDB4MDAwMDA0MDA7CiAJCX0KLSNlbmRpZiAvLyBSVDMwNzAgLy8KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgKFVTSE9SVClNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIE1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7CisjZW5kaWYgLyogUlQzMHh4IC8vICovCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsICh1MTYpTUFDUmVnVGFibGVbSW5kZXhdLlJlZ2lzdGVyLAorCQkJCU1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7CiAJfQotI2VuZGlmIC8vIFJUMjg3MCAvLwogCiAJewotCQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fU1RBX01BQ19SRUdfUEFSTVM7IEluZGV4KyspCi0JCXsKLSNpZmRlZiBSVDI4NjAKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNUQU1BQ1JlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgU1RBTUFDUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgKFVTSE9SVClTVEFNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIFNUQU1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7Ci0jZW5kaWYKKwkJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTlVNX1NUQV9NQUNfUkVHX1BBUk1TOyBJbmRleCsrKSB7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLAorCQkJCQkodTE2KVNUQU1BQ1JlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwKKwkJCQkJU1RBTUFDUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKIAkJfQogCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCS8vIEluaXRpYWxpemUgUlQzMDcwIHNlcmlhbCBNQWMgcmVnaXN0ZXJzIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIFJUMjg3MCBzZXJpYWwKLQlpZiAoSVNfUlQzMDkwKHBBZCkpCi0JeworI2lmZGVmIFJUMzB4eAorCS8qIEluaXRpYWxpemUgUlQzMDcwIHNlcmlhbCBNQUMgcmVnaXN0ZXJzIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIFJUMjg3MCBzZXJpYWwgKi8KKwlpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpIHsKIAkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfU1dfQ0ZHMSwgMCk7CiAKLQkJLy8gUlQzMDcxIHZlcnNpb24gRSBoYXMgZml4ZWQgdGhpcyBpc3N1ZQotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpCi0JCXsKLQkJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuREFDVGVzdEJpdCA9PSAxKQotCQkJewotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1NXX0NGRzIsIDB4MUYpOwkvLyBUbyBmaXggdGhyb3VnaHB1dCBkcm9wIGRyYXN0aWNhbGx5CisJCS8qIFJUMzA3MSB2ZXJzaW9uIEUgaGFzIGZpeGVkIHRoaXMgaXNzdWUgKi8KKwkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKSB7CisJCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkRBQ1Rlc3RCaXQgPT0gMSkgeworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1NXX0NGRzIsIDB4MkMpOwkvKiBUbyBmaXggdGhyb3VnaHB1dCBkcm9wIGRyYXN0aWNhbGx5ICovCisJCQl9IGVsc2UgeworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1NXX0NGRzIsIDB4MEYpOwkvKiBUbyBmaXggdGhyb3VnaHB1dCBkcm9wIGRyYXN0aWNhbGx5ICovCiAJCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfU1dfQ0ZHMiwgMHgwRik7CS8vIFRvIGZpeCB0aHJvdWdocHV0IGRyb3AgZHJhc3RpY2FsbHkKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1NXX0NGRzIsIDB4MCk7CiAJCX0KKwl9IGVsc2UgaWYgKElTX1JUMzA3MChwQWQpKSB7CisJCWlmICgoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMDEpKSB7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9TV19DRkcxLCAwKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1NXX0NGRzIsIDB4MkMpOwkvKiBUbyBmaXggdGhyb3VnaHB1dCBkcm9wIGRyYXN0aWNhbGx5ICovCisJCX0gZWxzZSB7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9TV19DRkcyLCAwKTsKKwkJfQogCX0KLSNpZmRlZiBSVDI4NzAKLQllbHNlIGlmIChJU19SVDMwNzAocEFkKSkKLQl7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1NXX0NGRzEsIDApOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9TV19DRkcyLCAweDFGKTsJLy8gVG8gZml4IHRocm91Z2hwdXQgZHJvcCBkcmFzdGljYWxseQotCX0KLSNlbmRpZiAvLyBSVDMweHggLy8KKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KIAotCS8vCi0JLy8gQmVmb3JlIHByb2dyYW0gQkJQLCB3ZSBuZWVkIHRvIHdhaXQgQkJQL1JGIGdldCB3YWtlIHVwLgotCS8vCisJLyogKi8KKwkvKiBCZWZvcmUgcHJvZ3JhbSBCQlAsIHdlIG5lZWQgdG8gd2FpdCBCQlAvUkYgZ2V0IHdha2UgdXAuICovCisJLyogKi8KIAlJbmRleCA9IDA7Ci0JZG8KLQl7CisJZG8gewogCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TVEFUVVNfQ0ZHLCAmTWFjQ3NyMTIpOwogCi0JCWlmICgoTWFjQ3NyMTIgJiAweDAzKSA9PSAwKQkvLyBpZiBCQi5SRiBpcyBzdGFibGUKKwkJaWYgKChNYWNDc3IxMiAmIDB4MDMpID09IDApCS8qIGlmIEJCLlJGIGlzIHN0YWJsZSAqLwogCQkJYnJlYWs7CiAKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hlY2sgTUFDX1NUQVRVU19DRkcgID0gQnVzeSA9ICV4XG4iLCBNYWNDc3IxMikpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkNoZWNrIE1BQ19TVEFUVVNfQ0ZHICA9IEJ1c3kgPSAleFxuIiwgTWFjQ3NyMTIpKTsKIAkJUlRNUHVzZWNEZWxheSgxMDAwKTsKIAl9IHdoaWxlIChJbmRleCsrIDwgMTAwKTsKIAotICAgIC8vIFRoZSBjb21tYW5kcyB0byBmaXJtd2FyZSBzaG91bGQgYmUgYWZ0ZXIgdGhlc2UgY29tbWFuZHMsIHRoZXNlIGNvbW1hbmRzIHdpbGwgaW5pdCBmaXJtd2FyZQotCS8vIFBDSSBhbmQgVVNCIGFyZSBub3QgdGhlIHNhbWUgYmVjYXVzZSBQQ0kgZHJpdmVyIG5lZWRzIHRvIHdhaXQgZm9yIFBDSSBidXMgcmVhZHkKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fQkJQX0FHRU5ULCAwKTsJLy8gaW5pdGlhbGl6ZSBCQlAgUi9XIGFjY2VzcyBhZ2VudAorCS8qIFRoZSBjb21tYW5kcyB0byBmaXJtd2FyZSBzaG91bGQgYmUgYWZ0ZXIgdGhlc2UgY29tbWFuZHMsIHRoZXNlIGNvbW1hbmRzIHdpbGwgaW5pdCBmaXJtd2FyZSAqLworCS8qIFBDSSBhbmQgVVNCIGFyZSBub3QgdGhlIHNhbWUgYmVjYXVzZSBQQ0kgZHJpdmVyIG5lZWRzIHRvIHdhaXQgZm9yIFBDSSBidXMgcmVhZHkgKi8KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fQkJQX0FHRU5ULCAwKTsJLyogaW5pdGlhbGl6ZSBCQlAgUi9XIGFjY2VzcyBhZ2VudCAqLwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgMCk7CisjaWZkZWYgUlQzMDkwCisJLyoyMDA4LzExLzI4OktIIGFkZCB0byBmaXggdGhlIGRlYWQgcmYgZnJlcXVlbmN5IG9mZnNldCBidWc8LS0gKi8KKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NzIsIDAsIDAsIDApOworCS8qMjAwOC8xMS8yODpLSCBhZGQgdG8gZml4IHRoZSBkZWFkIHJmIGZyZXF1ZW5jeSBvZmZzZXQgYnVnLS0+ICovCisjZW5kaWYgLyogUlQzMDkwIC8vICovCiAJUlRNUHVzZWNEZWxheSgxMDAwKTsKIAotCS8vIFJlYWQgQkJQIHJlZ2lzdGVyLCBtYWtlIHN1cmUgQkJQIGlzIHVwIGFuZCBydW5uaW5nIGJlZm9yZSB3cml0ZSBuZXcgZGF0YQorCS8qIFJlYWQgQkJQIHJlZ2lzdGVyLCBtYWtlIHN1cmUgQkJQIGlzIHVwIGFuZCBydW5uaW5nIGJlZm9yZSB3cml0ZSBuZXcgZGF0YSAqLwogCUluZGV4ID0gMDsKLQlkbwotCXsKKwlkbyB7CiAJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMCwgJlIwKTsKIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkJQIHZlcnNpb24gPSAleFxuIiwgUjApKTsKIAl9IHdoaWxlICgoKytJbmRleCA8IDIwKSAmJiAoKFIwID09IDB4ZmYpIHx8IChSMCA9PSAweDAwKSkpOwotCS8vQVNTRVJUKEluZGV4IDwgMjApOyAvL3RoaXMgd2lsbCBjYXVzZSBCU09EIG9uIENoZWNrLWJ1aWxkIGRyaXZlcgorCS8qQVNTRVJUKEluZGV4IDwgMjApOyAvL3RoaXMgd2lsbCBjYXVzZSBCU09EIG9uIENoZWNrLWJ1aWxkIGRyaXZlciAqLwogCiAJaWYgKChSMCA9PSAweGZmKSB8fCAoUjAgPT0gMHgwMCkpCiAJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwogCi0JLy8gSW5pdGlhbGl6ZSBCQlAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9CQlBfUkVHX1BBUk1TOyBJbmRleCsrKQotCXsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUFJlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgQkJQUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKKwkvKiBJbml0aWFsaXplIEJCUCByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlICovCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTlVNX0JCUF9SRUdfUEFSTVM7IEluZGV4KyspIHsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUFJlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwKKwkJCQkJICAgICBCQlBSZWdUYWJsZVtJbmRleF0uVmFsdWUpOwogCX0KIAotI2lmbmRlZiBSVDI4NzAKLQkvLyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIsIGluaXQgQkJQX1I4NCB3aXRoIDB4MTkuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4KLQlpZiAoKHBBZC0+TUFDVmVyc2lvbiYweGZmZmYpICE9IDB4MDEwMSkKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODQsIDB4MTkpOwotI2Vsc2UKLQkvLyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIsIGluaXQgQkJQX1I4NCB3aXRoIDB4MTkuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4KLQkvLyBSVDMwOTAgc2hvdWxkIG5vdCBwcm9ncmFtIEJCUCBSODQgdG8gMHgxOSwgb3RoZXJ3aXNlIFRYIHdpbGwgYmxvY2suCi0JaWYgKCgocEFkLT5NQUNWZXJzaW9uJjB4ZmZmZikgIT0gMHgwMTAxKSAmJiAoIUlTX1JUMzB4eChwQWQpKSkKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkvKiBUT0RPOiBzaGlhbmcsIGNoZWNrIE1BQ1ZlcnNpb24sIGN1cnJlbnRseSwgcmJ1cy1iYXNlZCBjaGlwIHVzZSB0aGlzLiAqLworCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODcyMDIwMCkgeworCQkvKnU4IHZhbHVlOyAqLworCQl1bnNpZ25lZCBsb25nIHZhbHVlMjsKKworCQkvKmRpc2FibGUgTUxEIGJ5IEJydWNlIDIwMDgwNzA0ICovCisJCS8qQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMTA1LCAmdmFsdWUpOyAqLworCQkvKkJCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxMDUsIHZhbHVlIHwgNCk7ICovCisKKwkJLypNYXhpbXVtIFBTRFUgbGVuZ3RoIGZyb20gMTZLIHRvIDMySyBieXRlcyAqLworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BWF9MRU5fQ0ZHLCAmdmFsdWUyKTsKKwkJdmFsdWUyICY9IH4oMHgzIDw8IDEyKTsKKwkJdmFsdWUyIHw9ICgweDIgPDwgMTIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQVhfTEVOX0NGRywgdmFsdWUyKTsKKwl9CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisKKwkvKiBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIsIGluaXQgQkJQX1I4NCB3aXRoIDB4MTkuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4gKi8KKwkvKiBSVDMwOTAgc2hvdWxkIG5vdCBwcm9ncmFtIEJCUCBSODQgdG8gMHgxOSwgb3RoZXJ3aXNlIFRYIHdpbGwgYmxvY2suICovCisJLyozMDcwLzcxLzcyLDMwOTAsMzA5MEEoIGFyZSBpbmNsdWRlZCBpbiBSVDMweHgpLDM1NzIsMzM5MCAqLworCWlmICgoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgIT0gMHgwMTAxKQorCSAgICAmJiAhKElTX1JUMzB4eChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSkKIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODQsIDB4MTkpOwogCi0vLyBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cAotCWlmIChJU19SVDMweHgocEFkKSkKLQl7CS8vdXBkYXRlIGZvciBSVDMwNzAvNzEvNzIvOTAvOTEvOTIuCisjaWZkZWYgUlQzMHh4CisvKiBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cCAqLworCWlmIChJU19SVDMweHgocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgewkvKnVwZGF0ZSBmb3IgUlQzMDcwLzcxLzcyLzkwLzkxLzkyLDM1NzIsMzM5MC4gKi8KIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzksIDB4MTMpOwogCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MCwgMHgwNSk7CiAJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgxLCAweDMzKTsKIAl9CiAKLQlpZiAoSVNfUlQzMDkwKHBBZCkpCisJaWYgKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzM5MChwQWQpKQkvKiBSVDMwOXgsIFJUMzA3MS83MiAqLwogCXsKLQkJVUNIQVIJCWJicHJlZz0wOwotCi0JCS8vIGVuYWJsZSBEQyBmaWx0ZXIKLQkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpID49IDB4MDIxMSkKLQkJeworCQkvKiBlbmFibGUgREMgZmlsdGVyICovCisJCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA+PSAweDAyMTEpIHsKIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEwMywgMHhjMCk7CiAJCX0KLQotCQkvLyBpbXByb3ZlIHBvd2VyIGNvbnN1bXB0aW9uCisJCS8qIGltcHJvdmUgcG93ZXIgY29uc3VtcHRpb24gKi8KIAkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxMzgsICZiYnByZWcpOwotCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQotCQl7Ci0JCQkvLyB0dXJuIG9mZiB0eCBEQUNfMQorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSB7CisJCQkvKiB0dXJuIG9mZiB0eCBEQUNfMSAqLwogCQkJYmJwcmVnID0gKGJicHJlZyB8IDB4MjApOwogCQl9CiAKLQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQkJewotCQkJLy8gdHVybiBvZmYgdHggQURDXzEKKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkgeworCQkJLyogdHVybiBvZmYgdHggQURDXzEgKi8KIAkJCWJicHJlZyAmPSAofjB4Mik7CiAJCX0KIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMTM4LCBiYnByZWcpOwogCi0JCS8vIGltcHJvdmUgcG93ZXIgY29uc3VtcHRpb24gaW4gUlQzMDcxIFZlci5FCi0JCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA+PSAweDAyMTEpCi0JCXsKKwkJLyogaW1wcm92ZSBwb3dlciBjb25zdW1wdGlvbiBpbiBSVDMwNzEgVmVyLkUgKi8KKwkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpID49IDB4MDIxMSkgewogCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzMSwgJmJicHJlZyk7CiAJCQliYnByZWcgJj0gKH4weDMpOwogCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMzEsIGJicHJlZyk7CiAJCX0KKwl9IGVsc2UgaWYgKElTX1JUMzA3MChwQWQpKSB7CisJCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA+PSAweDAyMDEpIHsKKwkJCS8qIGVuYWJsZSBEQyBmaWx0ZXIgKi8KKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEwMywgMHhjMCk7CisKKwkJCS8qIGltcHJvdmUgcG93ZXIgY29uc3VtcHRpb24gaW4gUlQzMDcwIFZlci5GICovCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMxLCAmYmJwcmVnKTsKKwkJCWJicHJlZyAmPSAofjB4Myk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzMSwgYmJwcmVnKTsKKwkJfQorCQkvKiBUWF9MTzFfZW4sIFJGIFIxNyByZWdpc3RlciBCaXQgMyB0byAwICovCisJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjE3LCAmUkZWYWx1ZSk7CisJCVJGVmFsdWUgJj0gKH4weDA4KTsKKwkJLyogdG8gZml4IHJ4IGxvbmcgcmFuZ2UgaXNzdWUgKi8KKwkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcgPT0gMCkgeworCQkJUkZWYWx1ZSB8PSAweDIwOworCQl9CisJCS8qIHNldCBSRl9SMTdfYml0WzI6MF0gZXF1YWwgdG8gRUVQUk9NIHNldHRpbmcgYXQgMHg0OGggKi8KKwkJaWYgKHBBZC0+VHhNaXhlckdhaW4yNEcgPj0gMSkgeworCQkJUkZWYWx1ZSAmPSAofjB4Nyk7CS8qIGNsZWFuIGJpdCBbMjowXSAqLworCQkJUkZWYWx1ZSB8PSBwQWQtPlR4TWl4ZXJHYWluMjRHOworCQl9CisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxNywgUkZWYWx1ZSk7CiAJfQotI2VuZGlmCi0JaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQotCXsKKy8qIGVuZCBqb2hubGkgKi8KKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKworCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkgewogCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxNik7CiAJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDEyKTsKLSAgICB9CisJfQogCi0JaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4MEVfVkVSU0lPTiAmJiBwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMzA3MF9WRVJTSU9OKSAvLyAzKjMKKwlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgwRV9WRVJTSU9OICYmIHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18zMDcwX1ZFUlNJT04pCS8qIDMqMyAqLwogCXsKLQkJLy8gZW5sYXJnZSBNQVhfTEVOX0NGRwotCQlVSU5UMzIgY3NyOworCQkvKiBlbmxhcmdlIE1BWF9MRU5fQ0ZHICovCisJCXUzMiBjc3I7CiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFYX0xFTl9DRkcsICZjc3IpOwogCQljc3IgJj0gMHhGRkY7CiAJCWNzciB8PSAweDIwMDA7CiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BWF9MRU5fQ0ZHLCBjc3IpOwogCX0KLQotI2lmZGVmIFJUMjg3MAotewotCVVDSEFSCU1BQ19WYWx1ZVtdPXsweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDAsMH07Ci0KLQkvL0luaXRpYWxpemUgV0NJRCB0YWJsZQotCVZhbHVlID0gMHhmZjsKLQlmb3IoSW5kZXggPTAgO0luZGV4IDwgMjU0O0luZGV4KyspCisjaWZkZWYgUlRNUF9NQUNfVVNCCiAJewotCQlSVFVTQk11bHRpV3JpdGUocEFkLCAoVVNIT1JUKShNQUNfV0NJRF9CQVNFICsgSW5kZXggKiA4KSwgTUFDX1ZhbHVlLCA4KTsKKwkJdTggTUFDX1ZhbHVlW10gPQorCQkgICAgeyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAwLCAwIH07CisKKwkJLypJbml0aWFsaXplIFdDSUQgdGFibGUgKi8KKwkJVmFsdWUgPSAweGZmOworCQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCAyNTQ7IEluZGV4KyspIHsKKwkJCVJUVVNCTXVsdGlXcml0ZShwQWQsCisJCQkJCSh1MTYpKE1BQ19XQ0lEX0JBU0UgKyBJbmRleCAqIDgpLAorCQkJCQlNQUNfVmFsdWUsIDgpOworCQl9CiAJfQotfQotI2VuZGlmIC8vIFJUMjg3MCAvLworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCi0JLy8gQWRkIHJhZGlvIG9mZiBjb250cm9sCisJLyogQWRkIHJhZGlvIG9mZiBjb250cm9sICovCiAJewotCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQotCQl7Ci0vLwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBXUl9QSU5fQ0ZHLCAweDAwMDAxODE4KTsKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkgeworLyogICAgICAgICAgICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDB4MDAwMDE4MTgpOyAqLwogCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCBSYWRpbyBPZmZcbiIpKTsKIAkJfQogCX0KIAotCS8vIENsZWFyIHJhdyBjb3VudGVycworCS8qIENsZWFyIHJhdyBjb3VudGVycyAqLwogCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDAsICZDb3VudGVyKTsKIAlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQxLCAmQ291bnRlcik7CiAJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMiwgJkNvdW50ZXIpOwpAQCAtMjM1NSw2NSArMTg1NCw1NSBAQAogCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZDb3VudGVyKTsKIAlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQyLCAmQ291bnRlcik7CiAKLQkvLyBBU0lDIHdpbGwga2VlcCBnYXJiYWdlIHZhbHVlIGFmdGVyIGJvb3QKLQkvLyBDbGVhciBhbGwgc2VhcmVkIGtleSB0YWJsZSB3aGVuIGluaXRpYWwKLQkvLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGlnbm9yZWQgaW4gcmFkaW8tT04vT0ZGIG9wZXJhdGlvbi4KLQlpZiAoYkhhcmRSZXNldCkKLQl7Ci0JCWZvciAoS2V5SWR4ID0gMDsgS2V5SWR4IDwgNDsgS2V5SWR4KyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCpLZXlJZHgsIDApOworCS8qIEFTSUMgd2lsbCBrZWVwIGdhcmJhZ2UgdmFsdWUgYWZ0ZXIgYm9vdCAqLworCS8qIENsZWFyIGFsbCBzaGFyZWQga2V5IHRhYmxlIHdoZW4gaW5pdGlhbCAqLworCS8qIFRoaXMgcm91dGluZSBjYW4gYmUgaWdub3JlZCBpbiByYWRpby1PTi9PRkYgb3BlcmF0aW9uLiAqLworCWlmIChiSGFyZFJlc2V0KSB7CisJCWZvciAoS2V5SWR4ID0gMDsgS2V5SWR4IDwgNDsgS2V5SWR4KyspIHsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCAqIEtleUlkeCwKKwkJCQkJMCk7CiAJCX0KIAotCQkvLyBDbGVhciBhbGwgcGFpcndpc2Uga2V5IHRhYmxlIHdoZW4gaW5pdGlhbAotCQlmb3IgKEtleUlkeCA9IDA7IEtleUlkeCA8IDI1NjsgS2V5SWR4KyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKEtleUlkeCAqIEhXX1dDSURfQVRUUklfU0laRSksIDEpOworCQkvKiBDbGVhciBhbGwgcGFpcndpc2Uga2V5IHRhYmxlIHdoZW4gaW5pdGlhbCAqLworCQlmb3IgKEtleUlkeCA9IDA7IEtleUlkeCA8IDI1NjsgS2V5SWR4KyspIHsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsCisJCQkJCU1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsKKwkJCQkJKEtleUlkeCAqIEhXX1dDSURfQVRUUklfU0laRSksIDEpOwogCQl9CiAJfQorCS8qIGFzc2VydCBIT1NUIHJlYWR5IGJpdCAqLworLyogIFJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19DU1IxLCAweDApOyAvLyAyMDA0LTA5LTE0IGFza2VkIGJ5IE1hcmsgKi8KKy8qICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMSwgMHg0KTsgKi8KIAotCi0JLy8gSXQgaXNuJ3QgbmVjZXNzYXJ5IHRvIGNsZWFyIHRoaXMgc3BhY2Ugd2hlbiBub3QgaGFyZCByZXNldC4KLQlpZiAoYkhhcmRSZXNldCA9PSBUUlVFKQotCXsKLQkJLy8gY2xlYXIgYWxsIG9uLWNoaXAgQkVBQ09OIGZyYW1lIHNwYWNlCi0JCWZvciAoYXBpZHggPSAwOyBhcGlkeCA8IEhXX0JFQUNPTl9NQVhfQ09VTlQ7IGFwaWR4KyspCi0JCXsKLQkJCWZvciAoaSA9IDA7IGkgPCBIV19CRUFDT05fT0ZGU0VUPj4yOyBpKz00KQotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2FwaWR4XSArIGksIDB4MDApOworCS8qIEl0IGlzbid0IG5lY2Vzc2FyeSB0byBjbGVhciB0aGlzIHNwYWNlIHdoZW4gbm90IGhhcmQgcmVzZXQuICovCisJaWYgKGJIYXJkUmVzZXQgPT0gVFJVRSkgeworCQkvKiBjbGVhciBhbGwgb24tY2hpcCBCRUFDT04gZnJhbWUgc3BhY2UgKi8KKwkJZm9yIChhcGlkeCA9IDA7IGFwaWR4IDwgSFdfQkVBQ09OX01BWF9DT1VOVDsgYXBpZHgrKykgeworCQkJZm9yIChpID0gMDsgaSA8IEhXX0JFQUNPTl9PRkZTRVQgPj4gMjsgaSArPSA0KQorCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsCisJCQkJCQlwQWQtPkJlYWNvbk9mZnNldFthcGlkeF0gKyBpLAorCQkJCQkJMHgwMCk7CiAJCX0KIAl9Ci0jaWZkZWYgUlQyODcwCisjaWZkZWYgUlRNUF9NQUNfVVNCCiAJQXNpY0Rpc2FibGVTeW5jKHBBZCk7Ci0JLy8gQ2xlYXIgcmF3IGNvdW50ZXJzCisJLyogQ2xlYXIgcmF3IGNvdW50ZXJzICovCiAJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMCwgJkNvdW50ZXIpOwogCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDEsICZDb3VudGVyKTsKIAlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQyLCAmQ291bnRlcik7CiAJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJkNvdW50ZXIpOwogCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZDb3VudGVyKTsKIAlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQyLCAmQ291bnRlcik7Ci0JLy8gRGVmYXVsdCBQQ0kgY2xvY2sgY3ljbGUgcGVyIG1zIGlzIGRpZmZlcmVudCBhcyBkZWZhdWx0IHNldHRpbmcsIHdoaWNoIGlzIGJhc2VkIG9uIFBDSS4KKwkvKiBEZWZhdWx0IFBDSSBjbG9jayBjeWNsZSBwZXIgbXMgaXMgZGlmZmVyZW50IGFzIGRlZmF1bHQgc2V0dGluZywgd2hpY2ggaXMgYmFzZWQgb24gUENJLiAqLwogCVJUTVBfSU9fUkVBRDMyKHBBZCwgVVNCX0NZQ19DRkcsICZDb3VudGVyKTsKLQlDb3VudGVyJj0weGZmZmZmZjAwOwotCUNvdW50ZXJ8PTB4MDAwMDAxZTsKKwlDb3VudGVyICY9IDB4ZmZmZmZmMDA7CisJQ291bnRlciB8PSAweDAwMDAwMWU7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgVVNCX0NZQ19DRkcsIENvdW50ZXIpOwotCi0JcEFkLT5iVXNlRWZ1c2U9RkFMU0U7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsKTsKLQlwQWQtPmJVc2VFZnVzZSA9ICggKGVGdXNlQ3RybCAmIDB4ODAwMDAwMDApID09IDB4ODAwMDAwMDApID8gMSA6IDA7Ci0JaWYocEFkLT5iVXNlRWZ1c2UpCi0JewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTlZNIGlzIEVmdXNlXG4iKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOVk0gaXMgRUVQUk9NXG4iKSk7Ci0JfQotI2VuZGlmCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKIAl7Ci0JCS8vIGZvciBydDI4NjBFIGFuZCBhZnRlciwgaW5pdCBUWE9QX0NUUkxfQ0ZHIHdpdGggMHg1ODNmLiBUaGlzIGlzIGZvciBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyBJT1QuCi0JCWlmICgocEFkLT5NQUNWZXJzaW9uJjB4ZmZmZikgIT0gMHgwMTAxKQorCQkvKiBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIsIGluaXQgVFhPUF9DVFJMX0NGRyB3aXRoIDB4NTgzZi4gVGhpcyBpcyBmb3IgZXh0ZW5zaW9uIGNoYW5uZWwgb3ZlcmxhcHBpbmcgSU9ULiAqLworCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgIT0gMHgwMTAxKQogCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhPUF9DVFJMX0NGRywgMHg1ODNmKTsKIAl9CiAKQEAgLTI0MjEsMTMzICsxOTEwLDYgQEAKIAlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIH0KIAotCi0jaWZkZWYgUlQyODYwCi1WT0lEIE5JQ1Jlc3RvcmVCQlBWYWx1ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVQ0hBUgkJaW5kZXg7Ci0JVUNIQVIJCVZhbHVlID0gMDsKLQlVTE9ORwkJRGF0YTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT4gIE5JQ1Jlc3RvcmVCQlBWYWx1ZSAhISEhISEhISEhISEhISEhISEhISEhISAgXG4iKSk7Ci0JLy8gSW5pdGlhbGl6ZSBCQlAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZSAocnRtcF9pbml0LmMpCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX0JCUF9SRUdfUEFSTVM7IGluZGV4KyspCi0JewotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQUmVnVGFibGVbaW5kZXhdLlJlZ2lzdGVyLCBCQlBSZWdUYWJsZVtpbmRleF0uVmFsdWUpOwotCX0KLQkvLyBjb3B5IGZyb20gKHJ0bXBfaW5pdC5jKQotCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKLQl7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDE2KTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTIpOwotCX0KLQotCS8vIGNvcHkgZnJvbSAoY29ubmVjdC5jIExpbmtVcCBmdW5jdGlvbikKLQlpZiAoSU5GUkFfT04ocEFkKSkKLQl7Ci0JCS8vIENoYW5nZSB0byBBUCBjaGFubmVsCi0JCWlmICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLQkJewotCQkJLy8gTXVzdCB1c2luZyA0ME1Iei4KLQkJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOwotCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwotCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7Ci0JCQlWYWx1ZSAmPSAofjB4MTgpOwotCQkJVmFsdWUgfD0gMHgxMDsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKLQotCQkJLy8gIFJYIDogY29udHJvbCBjaGFubmVsIGF0IGxvd2VyCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZWYWx1ZSk7Ci0JCQlWYWx1ZSAmPSAofjB4MjApOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgVmFsdWUpOwotCQkJLy8gUmVjb3JkIEJCUFIzIHNldHRpbmcsIEJ1dCBkb24ndCBrZWVwIFIgQW50ZW5uYSAjIGluZm9ybWF0aW9uLgotCQkJcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKLQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJkRhdGEpOwotCQkJRGF0YSAmPSAweGZmZmZmZmZlOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIERhdGEpOwotCi0JCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCi0JCQl7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MUEpOwotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDBBKTsKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxNik7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOwotCQkJfQotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBMb3dlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgQmVsb3cuIENlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOwotCQl9Ci0JCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotCQl7Ci0JCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgotCQkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7Ci0JCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKLQkJCVZhbHVlICY9ICh+MHgxOCk7Ci0JCQlWYWx1ZSB8PSAweDEwOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgVmFsdWUpOwotCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmRGF0YSk7Ci0JCQlEYXRhIHw9IDB4MTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBEYXRhKTsKLQotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOwotCQkJVmFsdWUgfD0gKDB4MjApOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgVmFsdWUpOwotCQkJLy8gUmVjb3JkIEJCUFIzIHNldHRpbmcsIEJ1dCBkb24ndCBrZWVwIFIgQW50ZW5uYSAjIGluZm9ybWF0aW9uLgotCQkJcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKLQotCQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQotCQkJewotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDFBKTsKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwQSk7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTYpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXJ0Mjg2MEMgISEhIFxuIiApKTsKLQkJCX0KLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhNDBNSHogVXBwZXIgTElOSyBVUCAhISEgQ29udHJvbCBDaGFubmVsIGF0IFVwcGVyQ2VudHJhbCA9ICVkIFxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKLQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKLQkJCVZhbHVlICY9ICh+MHgxOCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBWYWx1ZSk7Ci0KLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZEYXRhKTsKLQkJCURhdGEgJj0gMHhmZmZmZmZmZTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBEYXRhKTsKLQotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOwotCQkJVmFsdWUgJj0gKH4weDIwKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKLQkJCS8vIFJlY29yZCBCQlBSMyBzZXR0aW5nLCBCdXQgZG9uJ3Qga2VlcCBSIEFudGVubmEgIyBpbmZvcm1hdGlvbi4KLQkJCXBBZC0+U3RhQ2ZnLkJCUFIzID0gVmFsdWU7Ci0KLQkJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKLQkJCXsKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxNik7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MDgpOwotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDExKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7Ci0JCQl9Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhITIwTUh6IExJTksgVVAgISEhIFxuIiApKTsKLQkJfQotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0gIE5JQ1Jlc3RvcmVCQlBWYWx1ZSAhISEhISEhISEhISEhISEhISEhISEhISAgXG4iKSk7Ci19Ci0jZW5kaWYgLyogUlQyODYwICovCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTI1NjcsMTkgKzE5MjksMjEgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJTklDSXNzdWVSZXNldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgTklDSXNzdWVSZXNldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JVUlOVDMyCVZhbHVlID0gMDsKKwl1MzIgVmFsdWUgPSAwOwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJc3N1ZVJlc2V0XG4iKSk7CiAKLQkvLyBEaXNhYmxlIFJ4LCByZWdpc3RlciB2YWx1ZSBzdXBwb3NlZCB3aWxsIHJlbWFpbiBhZnRlciByZXNldAorCS8qIEFib3J0IFR4LCBwcmV2ZW50IEFTSUMgZnJvbSB3cml0aW5nIHRvIEhvc3QgbWVtb3J5ICovCisJLypSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DTlRMX0NTUiwgMHgwMDFmMDAwMCk7ICovCisKKwkvKiBEaXNhYmxlIFJ4LCByZWdpc3RlciB2YWx1ZSBzdXBwb3NlZCB3aWxsIHJlbWFpbiBhZnRlciByZXNldCAqLwogCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwogCVZhbHVlICY9ICgweGZmZmZmZmYzKTsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKIAotCS8vIElzc3VlIHJlc2V0IGFuZCBjbGVhciBmcm9tIHJlc2V0IHN0YXRlCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDAzKTsgLy8gMjAwNC0wOS0xNyBjaGFuZ2UgZnJvbSAweDAxCisJLyogSXNzdWUgcmVzZXQgYW5kIGNsZWFyIGZyb20gcmVzZXQgc3RhdGUgKi8KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MDMpOwkvKiAyMDA0LTA5LTE3IGNoYW5nZSBmcm9tIDB4MDEgKi8KIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MDApOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ0lzc3VlUmVzZXRcbiIpKTsKQEAgLTI2MDEsMTM0ICsxOTY1LDExNSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotQk9PTEVBTglOSUNDaGVja0ZvckhhbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCitCT09MRUFOIE5JQ0NoZWNrRm9ySGFuZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7CiAJcmV0dXJuIChGQUxTRSk7CiB9CiAKLVZPSUQgTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVRYX1NUQV9GSUZPX1NUUlVDCVN0YUZpZm87Ci0JTUFDX1RBQkxFX0VOVFJZCQkqcEVudHJ5OwotCVVDSEFSCQkJCWkgPSAwOwotCVVDSEFSCQkJcGlkID0gMCwgd2NpZCA9IDA7Ci0JQ0hBUgkJCQlyZVRyeTsKLQlVQ0hBUgkJCQlzdWNjTUNTOworCVRYX1NUQV9GSUZPX1NUUlVDIFN0YUZpZm87CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5OworCXU4IGkgPSAwOworCXU4IHBpZCA9IDAsIHdjaWQgPSAwOworCWNoYXIgcmVUcnk7CisJdTggc3VjY01DUzsKIAotCQlkbwotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9GSUZPLCAmU3RhRmlmby53b3JkKTsKKwlkbyB7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0ZJRk8sICZTdGFGaWZvLndvcmQpOwogCi0JCQlpZiAoU3RhRmlmby5maWVsZC5iVmFsaWQgPT0gMCkKLQkJCQlicmVhazsKKwkJaWYgKFN0YUZpZm8uZmllbGQuYlZhbGlkID09IDApCisJCQlicmVhazsKIAotCQkJd2NpZCA9IChVQ0hBUilTdGFGaWZvLmZpZWxkLndjaWQ7Ci0KKwkJd2NpZCA9ICh1OClTdGFGaWZvLmZpZWxkLndjaWQ7CiAKIAkJLyogaWdub3JlIE5vQUNLIGFuZCBNR01UIGZyYW1lIHVzZSAweEZGIGFzIFdDSUQgKi8KLQkJCWlmICgoU3RhRmlmby5maWVsZC5UeEFja1JlcXVpcmVkID09IDApIHx8ICh3Y2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSkKLQkJCXsKLQkJCQlpKys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qIFBJRCBzdG9yZSBUeCBNQ1MgUmF0ZSAqLwotCQkJcGlkID0gKFVDSEFSKVN0YUZpZm8uZmllbGQuUGlkVHlwZTsKLQotCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbd2NpZF07Ci0KLQkJCXBFbnRyeS0+RGVidWdGSUZPQ291bnQrKzsKLQotCQkJaWYgKFN0YUZpZm8uZmllbGQuVHhCRikgLy8gMyozCi0JCQkJcEVudHJ5LT5UeEJGQ291bnQrKzsKLQotI2lmZGVmIFVBUFNEX0FQX1NVUFBPUlQKLQkJCVVBUFNEX1NQX0FVRV9IYW5kbGUocEFkLCBwRW50cnksIFN0YUZpZm8uZmllbGQuVHhTdWNjZXNzKTsKLSNlbmRpZiAvLyBVQVBTRF9BUF9TVVBQT1JUIC8vCi0KLQkJCWlmICghU3RhRmlmby5maWVsZC5UeFN1Y2Nlc3MpCi0JCQl7Ci0JCQkJcEVudHJ5LT5GSUZPQ291bnQrKzsKLQkJCQlwRW50cnktPk9uZVNlY1R4RmFpbENvdW50Kys7Ci0KLQkJCQlpZiAocEVudHJ5LT5GSUZPQ291bnQgPj0gMSkKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiMiKSk7Ci0JCQkJCXBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPSA2NDsKLQotCQkJCQlpZihwRW50cnktPlBzTW9kZSA9PSBQV1JfQUNUSVZFKQotCQkJCQl7Ci0JCQkJCQlpbnQgdGlkOwotCQkJCQkJZm9yICh0aWQ9MDsgdGlkPE5VTV9PRl9USUQ7IHRpZCsrKQotCQkJCQkJewotCQkJCQkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgcEVudHJ5LT5BaWQsICB0aWQsIEZBTFNFLCBGQUxTRSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIFVwZGF0ZSB0aGUgY29udGludW91cyB0cmFuc21pc3Npb24gY291bnRlciBleGNlcHQgUFMgbW9kZQotCQkJCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCsrOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJLy8gQ2xlYXIgdGhlIEZJRk9Db3VudCB3aGVuIHN0YSBpbiBQb3dlciBTYXZlIG1vZGUuIEJhc2ljYWxseSB3ZSBhc3N1bWUKLQkJCQkJCS8vICAgICB0aGlzIHR4IGVycm9yIGhhcHBlbmVkIGR1ZSB0byBzdGEganVzdCBnbyB0byBzbGVlcC4KLQkJCQkJCXBFbnRyeS0+RklGT0NvdW50ID0gMDsKLQkJCQkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQgPSAwOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmICgocEVudHJ5LT5Qc01vZGUgIT0gUFdSX1NBVkUpICYmIChwRW50cnktPk5vQkFEYXRhQ291bnREb3duID4gMCkpCi0JCQkJewotCQkJCQlwRW50cnktPk5vQkFEYXRhQ291bnREb3duLS07Ci0JCQkJCWlmIChwRW50cnktPk5vQkFEYXRhQ291bnREb3duPT0wKQotCQkJCQl7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJAXG4iKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlwRW50cnktPkZJRk9Db3VudCA9IDA7Ci0JCQkJcEVudHJ5LT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50Kys7Ci0JCQkJLy8gdXBkYXRlIE5vRGF0YUlkbGVDb3VudCB3aGVuIHN1Y2Vzc2Z1bCBzZW5kIHBhY2tldCB0byBTVEEuCi0JCQkJcEVudHJ5LT5Ob0RhdGFJZGxlQ291bnQgPSAwOwotCQkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQgPSAwOwotCQkJfQotCi0JCQlzdWNjTUNTID0gU3RhRmlmby5maWVsZC5TdWNjZXNzUmF0ZSAmIDB4N0Y7Ci0KLQkJCXJlVHJ5ID0gcGlkIC0gc3VjY01DUzsKLQotCQkJaWYgKFN0YUZpZm8uZmllbGQuVHhTdWNjZXNzKQotCQkJewotCQkJCXBFbnRyeS0+VFhNQ1NFeHBlY3RlZFtwaWRdKys7Ci0JCQkJaWYgKHBpZCA9PSBzdWNjTUNTKQotCQkJCXsKLQkJCQkJcEVudHJ5LT5UWE1DU1N1Y2Nlc3NmdWxbcGlkXSsrOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlwRW50cnktPlRYTUNTQXV0b0ZhbGxCYWNrW3BpZF1bc3VjY01DU10rKzsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEVudHJ5LT5UWE1DU0ZhaWxlZFtwaWRdKys7Ci0JCQl9Ci0KLQkJCWlmIChyZVRyeSA+IDApCi0JCQl7Ci0JCQkJaWYgKChwaWQgPj0gMTIpICYmIHN1Y2NNQ1MgPD03KQotCQkJCXsKLQkJCQkJcmVUcnkgLT0gNDsKLQkJCQl9Ci0JCQkJcEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSByZVRyeTsKLQkJCX0KLQorCQlpZiAoKFN0YUZpZm8uZmllbGQuVHhBY2tSZXF1aXJlZCA9PSAwKQorCQkgICAgfHwgKHdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKSB7CiAJCQlpKys7Ci0JCQkvLyBBU0lDIHN0b3JlIDE2IHN0YWNrCi0JCX0gd2hpbGUgKCBpIDwgKDIqVFhfUklOR19TSVpFKSApOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBQSUQgc3RvcmUgVHggTUNTIFJhdGUgKi8KKwkJcGlkID0gKHU4KVN0YUZpZm8uZmllbGQuUGlkVHlwZTsKKworCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFt3Y2lkXTsKKworCQlwRW50cnktPkRlYnVnRklGT0NvdW50Kys7CisKKwkJaWYgKFN0YUZpZm8uZmllbGQuVHhCRikJLyogMyozICovCisJCQlwRW50cnktPlR4QkZDb3VudCsrOworCisJCWlmICghU3RhRmlmby5maWVsZC5UeFN1Y2Nlc3MpIHsKKwkJCXBFbnRyeS0+RklGT0NvdW50Kys7CisJCQlwRW50cnktPk9uZVNlY1R4RmFpbENvdW50Kys7CisKKwkJCWlmIChwRW50cnktPkZJRk9Db3VudCA+PSAxKSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIyIpKTsKKwkJCQlwRW50cnktPk5vQkFEYXRhQ291bnREb3duID0gNjQ7CisKKwkJCQlpZiAocEVudHJ5LT5Qc01vZGUgPT0gUFdSX0FDVElWRSkgeworCQkJCQlpbnQgdGlkOworCQkJCQlmb3IgKHRpZCA9IDA7IHRpZCA8IE5VTV9PRl9USUQ7IHRpZCsrKSB7CisJCQkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsCisJCQkJCQkJCSAgICAgcEVudHJ5LT4KKwkJCQkJCQkJICAgICBBaWQsIHRpZCwKKwkJCQkJCQkJICAgICBGQUxTRSwKKwkJCQkJCQkJICAgICBGQUxTRSk7CisJCQkJCX0KKworCQkJCQkvKiBVcGRhdGUgdGhlIGNvbnRpbnVvdXMgdHJhbnNtaXNzaW9uIGNvdW50ZXIgZXhjZXB0IFBTIG1vZGUgKi8KKwkJCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCsrOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIENsZWFyIHRoZSBGSUZPQ291bnQgd2hlbiBzdGEgaW4gUG93ZXIgU2F2ZSBtb2RlLiBCYXNpY2FsbHkgd2UgYXNzdW1lICovCisJCQkJCS8qICAgICB0aGlzIHR4IGVycm9yIGhhcHBlbmVkIGR1ZSB0byBzdGEganVzdCBnbyB0byBzbGVlcC4gKi8KKwkJCQkJcEVudHJ5LT5GSUZPQ291bnQgPSAwOworCQkJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250ID0gMDsKKwkJCQl9CisJCQkJLypwRW50cnktPkZJRk9Db3VudCA9IDA7ICovCisJCQl9CisJCQkvKnBFbnRyeS0+YlNlbmRCQVIgPSBUUlVFOyAqLworCQl9IGVsc2UgeworCQkJaWYgKChwRW50cnktPlBzTW9kZSAhPSBQV1JfU0FWRSkKKwkJCSAgICAmJiAocEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA+IDApKSB7CisJCQkJcEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93bi0tOworCQkJCWlmIChwRW50cnktPk5vQkFEYXRhQ291bnREb3duID09IDApIHsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQFxuIikpOworCQkJCX0KKwkJCX0KKworCQkJcEVudHJ5LT5GSUZPQ291bnQgPSAwOworCQkJcEVudHJ5LT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50Kys7CisJCQkvKiB1cGRhdGUgTm9EYXRhSWRsZUNvdW50IHdoZW4gc3VjZXNzZnVsIHNlbmQgcGFja2V0IHRvIFNUQS4gKi8KKwkJCXBFbnRyeS0+Tm9EYXRhSWRsZUNvdW50ID0gMDsKKwkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQgPSAwOworCQl9CisKKwkJc3VjY01DUyA9IFN0YUZpZm8uZmllbGQuU3VjY2Vzc1JhdGUgJiAweDdGOworCisJCXJlVHJ5ID0gcGlkIC0gc3VjY01DUzsKKworCQlpZiAoU3RhRmlmby5maWVsZC5UeFN1Y2Nlc3MpIHsKKwkJCXBFbnRyeS0+VFhNQ1NFeHBlY3RlZFtwaWRdKys7CisJCQlpZiAocGlkID09IHN1Y2NNQ1MpIHsKKwkJCQlwRW50cnktPlRYTUNTU3VjY2Vzc2Z1bFtwaWRdKys7CisJCQl9IGVsc2UgeworCQkJCXBFbnRyeS0+VFhNQ1NBdXRvRmFsbEJhY2tbcGlkXVtzdWNjTUNTXSsrOworCQkJfQorCQl9IGVsc2UgeworCQkJcEVudHJ5LT5UWE1DU0ZhaWxlZFtwaWRdKys7CisJCX0KKworCQlpZiAocmVUcnkgPiAwKSB7CisJCQlpZiAoKHBpZCA+PSAxMikgJiYgc3VjY01DUyA8PSA3KSB7CisJCQkJcmVUcnkgLT0gNDsKKwkJCX0KKwkJCXBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKz0gcmVUcnk7CisJCX0KKworCQlpKys7CisJCS8qIEFTSUMgc3RvcmUgMTYgc3RhY2sgKi8KKwl9IHdoaWxlIChpIDwgKDIgKiBUWF9SSU5HX1NJWkUpKTsKIAogfQogCkBAIC0yNzQ5LDg3ICsyMDk0LDk5IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBOSUNVcGRhdGVSYXdDb3VudGVycyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JVUlOVDMyCU9sZFZhbHVlOwotCVJYX1NUQV9DTlQwX1NUUlVDCSBSeFN0YUNudDA7Ci0JUlhfU1RBX0NOVDFfU1RSVUMgICBSeFN0YUNudDE7Ci0JUlhfU1RBX0NOVDJfU1RSVUMgICBSeFN0YUNudDI7Ci0JVFhfU1RBX0NOVDBfU1RSVUMgCSBUeFN0YUNudDA7Ci0JVFhfU1RBX0NOVDFfU1RSVUMJIFN0YVR4MTsKLQlUWF9TVEFfQ05UMl9TVFJVQwkgU3RhVHgyOwotCVRYX0FHR19DTlRfU1RSVUMJVHhBZ2dDbnQ7Ci0JVFhfQUdHX0NOVDBfU1RSVUMJVHhBZ2dDbnQwOwotCVRYX0FHR19DTlQxX1NUUlVDCVR4QWdnQ250MTsKLQlUWF9BR0dfQ05UMl9TVFJVQwlUeEFnZ0NudDI7Ci0JVFhfQUdHX0NOVDNfU1RSVUMJVHhBZ2dDbnQzOwotCVRYX0FHR19DTlQ0X1NUUlVDCVR4QWdnQ250NDsKLQlUWF9BR0dfQ05UNV9TVFJVQwlUeEFnZ0NudDU7Ci0JVFhfQUdHX0NOVDZfU1RSVUMJVHhBZ2dDbnQ2OwotCVRYX0FHR19DTlQ3X1NUUlVDCVR4QWdnQ250NzsKKwl1MzIgT2xkVmFsdWU7CS8qLCBWYWx1ZTI7ICovCisJLyp1bnNpZ25lZCBsb25nIFBhZ2VTdW0sIE9uZVNlY1RyYW5zbWl0Q291bnQ7ICovCisJLyp1bnNpZ25lZCBsb25nIFR4RXJyb3JSYXRpbywgUmV0cnksIEZhaWw7ICovCisJUlhfU1RBX0NOVDBfU1RSVUMgUnhTdGFDbnQwOworCVJYX1NUQV9DTlQxX1NUUlVDIFJ4U3RhQ250MTsKKwlSWF9TVEFfQ05UMl9TVFJVQyBSeFN0YUNudDI7CisJVFhfU1RBX0NOVDBfU1RSVUMgVHhTdGFDbnQwOworCVRYX1NUQV9DTlQxX1NUUlVDIFN0YVR4MTsKKwlUWF9TVEFfQ05UMl9TVFJVQyBTdGFUeDI7CisJVFhfQUdHX0NOVF9TVFJVQyBUeEFnZ0NudDsKKwlUWF9BR0dfQ05UMF9TVFJVQyBUeEFnZ0NudDA7CisJVFhfQUdHX0NOVDFfU1RSVUMgVHhBZ2dDbnQxOworCVRYX0FHR19DTlQyX1NUUlVDIFR4QWdnQ250MjsKKwlUWF9BR0dfQ05UM19TVFJVQyBUeEFnZ0NudDM7CisJVFhfQUdHX0NOVDRfU1RSVUMgVHhBZ2dDbnQ0OworCVRYX0FHR19DTlQ1X1NUUlVDIFR4QWdnQ250NTsKKwlUWF9BR0dfQ05UNl9TVFJVQyBUeEFnZ0NudDY7CisJVFhfQUdHX0NOVDdfU1RSVUMgVHhBZ2dDbnQ3OworCXN0cnVjdCBydF9jb3VudGVyX3JhbGluayAqcFJhbGlua0NvdW50ZXJzOworCisJcFJhbGlua0NvdW50ZXJzID0gJnBBZC0+UmFsaW5rQ291bnRlcnM7CiAKIAlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQwLCAmUnhTdGFDbnQwLndvcmQpOwogCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDIsICZSeFN0YUNudDIud29yZCk7CiAKIAl7CiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDEsICZSeFN0YUNudDEud29yZCk7Ci0JICAgIC8vIFVwZGF0ZSBSWCBQTENQIGVycm9yIGNvdW50ZXIKLQkgICAgcEFkLT5Qcml2YXRlSW5mby5QaHlSeEVyckNudCArPSBSeFN0YUNudDEuZmllbGQuUGxjcEVycjsKLQkJLy8gVXBkYXRlIEZhbHNlIENDQSBjb3VudGVyCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRmFsc2VDQ0FDbnQgKz0gUnhTdGFDbnQxLmZpZWxkLkZhbHNlQ2NhOworCQkvKiBVcGRhdGUgUlggUExDUCBlcnJvciBjb3VudGVyICovCisJCXBBZC0+UHJpdmF0ZUluZm8uUGh5UnhFcnJDbnQgKz0gUnhTdGFDbnQxLmZpZWxkLlBsY3BFcnI7CisJCS8qIFVwZGF0ZSBGYWxzZSBDQ0EgY291bnRlciAqLworCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250ICs9CisJCSAgICBSeFN0YUNudDEuZmllbGQuRmFsc2VDY2E7CiAJfQogCi0JLy8gVXBkYXRlIEZDUyBjb3VudGVycwotCU9sZFZhbHVlPSBwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydDsKLQlwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydCArPSAoUnhTdGFDbnQwLmZpZWxkLkNyY0Vycik7IC8vID4+IDcpOworCS8qIFVwZGF0ZSBGQ1MgY291bnRlcnMgKi8KKwlPbGRWYWx1ZSA9IHBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0OworCXBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0ICs9IChSeFN0YUNudDAuZmllbGQuQ3JjRXJyKTsJLyogPj4gNyk7ICovCiAJaWYgKHBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0IDwgT2xkVmFsdWUpCiAJCXBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5IaWdoUGFydCsrOwogCi0JLy8gQWRkIEZDUyBlcnJvciBjb3VudCB0byBwcml2YXRlIGNvdW50ZXJzCi0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudCArPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOwotCU9sZFZhbHVlID0gcEFkLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQudS5Mb3dQYXJ0OwotCXBBZC0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50LnUuTG93UGFydCArPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOwotCWlmIChwQWQtPlJhbGlua0NvdW50ZXJzLlJlYWxGY3NFcnJDb3VudC51Lkxvd1BhcnQgPCBPbGRWYWx1ZSkKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQudS5IaWdoUGFydCsrOworCS8qIEFkZCBGQ1MgZXJyb3IgY291bnQgdG8gcHJpdmF0ZSBjb3VudGVycyAqLworCXBSYWxpbmtDb3VudGVycy0+T25lU2VjUnhGY3NFcnJDbnQgKz0gUnhTdGFDbnQwLmZpZWxkLkNyY0VycjsKKwlPbGRWYWx1ZSA9IHBSYWxpbmtDb3VudGVycy0+UmVhbEZjc0VyckNvdW50LnUuTG93UGFydDsKKwlwUmFsaW5rQ291bnRlcnMtPlJlYWxGY3NFcnJDb3VudC51Lkxvd1BhcnQgKz0gUnhTdGFDbnQwLmZpZWxkLkNyY0VycjsKKwlpZiAocFJhbGlua0NvdW50ZXJzLT5SZWFsRmNzRXJyQ291bnQudS5Mb3dQYXJ0IDwgT2xkVmFsdWUpCisJCXBSYWxpbmtDb3VudGVycy0+UmVhbEZjc0VyckNvdW50LnUuSGlnaFBhcnQrKzsKIAotCS8vIFVwZGF0ZSBEdXBsaWNhdGUgUmN2IGNoZWNrCi0JcEFkLT5SYWxpbmtDb3VudGVycy5EdXBsaWNhdGVSY3YgKz0gUnhTdGFDbnQyLmZpZWxkLlJ4RHVwbGlDb3VudDsKLQlwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCArPSBSeFN0YUNudDIuZmllbGQuUnhEdXBsaUNvdW50OwotCS8vIFVwZGF0ZSBSWCBPdmVyZmxvdyBjb3VudGVyCisJLyogVXBkYXRlIER1cGxpY2F0ZSBSY3YgY2hlY2sgKi8KKwlwUmFsaW5rQ291bnRlcnMtPkR1cGxpY2F0ZVJjdiArPSBSeFN0YUNudDIuZmllbGQuUnhEdXBsaUNvdW50OworCXBBZC0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0ICs9CisJICAgIFJ4U3RhQ250Mi5maWVsZC5SeER1cGxpQ291bnQ7CisJLyogVXBkYXRlIFJYIE92ZXJmbG93IGNvdW50ZXIgKi8KIAlwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyICs9IChSeFN0YUNudDIuZmllbGQuUnhGaWZvT3ZlcmZsb3dDb3VudCk7CiAKLSNpZmRlZiBSVDI4NzAKLQlpZiAocEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50ICE9IHBBZC0+d2F0Y2hEb2dSeENudCkKLQl7Ci0JCXBBZC0+d2F0Y2hEb2dSeENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudDsKKwkvKnBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudCA9IDA7ICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJaWYgKHBSYWxpbmtDb3VudGVycy0+UnhDb3VudCAhPSBwQWQtPndhdGNoRG9nUnhDbnQpIHsKKwkJcEFkLT53YXRjaERvZ1J4Q250ID0gcFJhbGlua0NvdW50ZXJzLT5SeENvdW50OwogCQlwQWQtPndhdGNoRG9nUnhPdmVyRmxvd0NudCA9IDA7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJaWYgKFJ4U3RhQ250Mi5maWVsZC5SeEZpZm9PdmVyZmxvd0NvdW50KQogCQkJcEFkLT53YXRjaERvZ1J4T3ZlckZsb3dDbnQrKzsKIAkJZWxzZQogCQkJcEFkLT53YXRjaERvZ1J4T3ZlckZsb3dDbnQgPSAwOwogCX0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCi0JaWYgKCFwQWQtPmJVcGRhdGVCY25DbnREb25lKQotCXsKLQkvLyBVcGRhdGUgQkVBQ09OIHNlbnQgY291bnQKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmVHhTdGFDbnQwLndvcmQpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZTdGFUeDEud29yZCk7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMiwgJlN0YVR4Mi53b3JkKTsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0JlYWNvblNlbnRDbnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4QmVhY29uQ291bnQ7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwotCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OwotCXBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LnUuTG93UGFydCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJLyppZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkgfHwgKi8KKwkvKiAgICAgIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpICYmIChwQWQtPk1hY1RhYi5TaXplICE9IDEpKSkgKi8KKwlpZiAoIXBBZC0+YlVwZGF0ZUJjbkNudERvbmUpIHsKKwkJLyogVXBkYXRlIEJFQUNPTiBzZW50IGNvdW50ICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDAsICZUeFN0YUNudDAud29yZCk7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZTdGFUeDEud29yZCk7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDIsICZTdGFUeDIud29yZCk7CisJCXBSYWxpbmtDb3VudGVycy0+T25lU2VjQmVhY29uU2VudENudCArPQorCQkgICAgVHhTdGFDbnQwLmZpZWxkLlR4QmVhY29uQ291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+T25lU2VjVHhSZXRyeU9rQ291bnQgKz0KKwkJICAgIFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCXBSYWxpbmtDb3VudGVycy0+T25lU2VjVHhOb1JldHJ5T2tDb3VudCArPQorCQkgICAgU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKKwkJcFJhbGlua0NvdW50ZXJzLT5PbmVTZWNUeEZhaWxDb3VudCArPQorCQkgICAgVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCQlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPQorCQkgICAgU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CiAJfQogCisJLyppZiAocEFkLT5iU3RhRmlmb1Rlc3QgPT0gVFJVRSkgKi8KIAl7CiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVCwgJlR4QWdnQ250LndvcmQpOwogCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQwLCAmVHhBZ2dDbnQwLndvcmQpOwpAQCAtMjg0MCw2MCArMjE5Nyw4OSBAQAogCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQ1LCAmVHhBZ2dDbnQ1LndvcmQpOwogCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQ2LCAmVHhBZ2dDbnQ2LndvcmQpOwogCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQ3LCAmVHhBZ2dDbnQ3LndvcmQpOwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnQ291bnQgKz0gVHhBZ2dDbnQuZmllbGQuQWdnVHhDb3VudDsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UeE5vbkFnZ0NvdW50ICs9IFR4QWdnQ250LmZpZWxkLk5vbkFnZ1R4Q291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxTVBEVUNvdW50ICs9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMUNvdW50OwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMk1QRFVDb3VudCArPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTJDb3VudDsKKwkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZ0NvdW50ICs9IFR4QWdnQ250LmZpZWxkLkFnZ1R4Q291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhOb25BZ2dDb3VudCArPSBUeEFnZ0NudC5maWVsZC5Ob25BZ2dUeENvdW50OworCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMU1QRFVDb3VudCArPQorCQkgICAgVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUxQ291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhBZ2cyTVBEVUNvdW50ICs9CisJCSAgICBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTJDb3VudDsKIAotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnM01QRFVDb3VudCArPSBUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTNDb3VudDsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzRNUERVQ291bnQgKz0gVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemU0Q291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c1TVBEVUNvdW50ICs9IFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNUNvdW50OwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnNk1QRFVDb3VudCArPSBUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTZDb3VudDsKKwkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzNNUERVQ291bnQgKz0KKwkJICAgIFR4QWdnQ250MS5maWVsZC5BZ2dTaXplM0NvdW50OworCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnNE1QRFVDb3VudCArPQorCQkgICAgVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemU0Q291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhBZ2c1TVBEVUNvdW50ICs9CisJCSAgICBUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTVDb3VudDsKKwkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzZNUERVQ291bnQgKz0KKwkJICAgIFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNkNvdW50OwogCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c3TVBEVUNvdW50ICs9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplN0NvdW50OwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnOE1QRFVDb3VudCArPSBUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZThDb3VudDsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzlNUERVQ291bnQgKz0gVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemU5Q291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxME1QRFVDb3VudCArPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTEwQ291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhBZ2c3TVBEVUNvdW50ICs9CisJCSAgICBUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudDsKKwkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzhNUERVQ291bnQgKz0KKwkJICAgIFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50OworCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnOU1QRFVDb3VudCArPQorCQkgICAgVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemU5Q291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhBZ2cxME1QRFVDb3VudCArPQorCQkgICAgVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemUxMENvdW50OwogCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxMU1QRFVDb3VudCArPSBUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTExQ291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxMk1QRFVDb3VudCArPSBUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTEyQ291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxM01QRFVDb3VudCArPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxNE1QRFVDb3VudCArPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTE0Q291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhBZ2cxMU1QRFVDb3VudCArPQorCQkgICAgVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50OworCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMTJNUERVQ291bnQgKz0KKwkJICAgIFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTJDb3VudDsKKwkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzEzTVBEVUNvdW50ICs9CisJCSAgICBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhBZ2cxNE1QRFVDb3VudCArPQorCQkgICAgVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50OwogCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxNU1QRFVDb3VudCArPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE1Q291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxNk1QRFVDb3VudCArPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhBZ2cxNU1QRFVDb3VudCArPQorCQkgICAgVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNUNvdW50OworCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMTZNUERVQ291bnQgKz0KKwkJICAgIFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTZDb3VudDsKIAotCQkvLyBDYWxjdWxhdGUgdGhlIHRyYW5zbWl0dGVkIEEtTVBEVSBjb3VudAotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUxQ291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUyQ291bnQgLyAyKTsKKwkJLyogQ2FsY3VsYXRlIHRoZSB0cmFuc21pdHRlZCBBLU1QRFUgY291bnQgKi8KKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTFDb3VudDsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUyQ291bnQgLyAyKTsKIAotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250MS5maWVsZC5BZ2dTaXplM0NvdW50IC8gMyk7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemU0Q291bnQgLyA0KTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemUzQ291bnQgLyAzKTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemU0Q291bnQgLyA0KTsKIAotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNUNvdW50IC8gNSk7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQgLyA2KTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU1Q291bnQgLyA1KTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQgLyA2KTsKIAotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250My5maWVsZC5BZ2dTaXplN0NvdW50IC8gNyk7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU4Q291bnQgLyA4KTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU3Q291bnQgLyA3KTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU4Q291bnQgLyA4KTsKIAotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NC5maWVsZC5BZ2dTaXplOUNvdW50IC8gOSk7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemUxMENvdW50IC8gMTApOworCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0KKwkJICAgIChUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTlDb3VudCAvIDkpOworCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0KKwkJICAgIChUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTEwQ291bnQgLyAxMCk7CiAKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTExQ291bnQgLyAxMSk7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMkNvdW50IC8gMTIpOworCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0KKwkJICAgIChUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTExQ291bnQgLyAxMSk7CisJCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPQorCQkgICAgKFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTJDb3VudCAvIDEyKTsKIAotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Ni5maWVsZC5BZ2dTaXplMTNDb3VudCAvIDEzKTsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTE0Q291bnQgLyAxNCk7CisJCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPQorCQkgICAgKFR4QWdnQ250Ni5maWVsZC5BZ2dTaXplMTNDb3VudCAvIDEzKTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50IC8gMTQpOwogCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNUNvdW50IC8gMTUpOwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTZDb3VudCAvIDE2KTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNUNvdW50IC8gMTUpOworCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0KKwkJICAgIChUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQgLyAxNik7CiAJfQogCi0KLQogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTI5MTMsMjUgKzIyOTksMzMgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJTklDUmVzZXRGcm9tRXJyb3IoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIE5JQ1Jlc2V0RnJvbUVycm9yKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQkvLyBSZXNldCBCQlAgKGFjY29yZGluZyB0byBhbGV4LCByZXNldCBBU0lDIHdpbGwgZm9yY2UgcmVzZXQgQkJQCi0JLy8gVGhlcmVmb3JlLCBza2lwIHRoZSByZXNldCBCQlAKLQkvLyBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMSwgMHgyKTsKKwkvKiBSZXNldCBCQlAgKGFjY29yZGluZyB0byBhbGV4LCByZXNldCBBU0lDIHdpbGwgZm9yY2UgcmVzZXQgQkJQICovCisJLyogVGhlcmVmb3JlLCBza2lwIHRoZSByZXNldCBCQlAgKi8KKwkvKiBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMSwgMHgyKTsgKi8KIAogCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgxKTsKLQkvLyBSZW1vdmUgQVNJQyBmcm9tIHJlc2V0IHN0YXRlCisJLyogUmVtb3ZlIEFTSUMgZnJvbSByZXNldCBzdGF0ZSAqLwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgwKTsKIAogCU5JQ0luaXRpYWxpemVBZGFwdGVyKHBBZCwgRkFMU0UpOwogCU5JQ0luaXRBc2ljRnJvbUVFUFJPTShwQWQpOwogCi0JLy8gU3dpdGNoIHRvIGN1cnJlbnQgY2hhbm5lbCwgc2luY2UgZHVyaW5nIHJlc2V0IHByb2Nlc3MsIHRoZSBjb25uZWN0aW9uIHNob3VsZCByZW1haW5zIG9uLgorCS8qIFN3aXRjaCB0byBjdXJyZW50IGNoYW5uZWwsIHNpbmNlIGR1cmluZyByZXNldCBwcm9jZXNzLCB0aGUgY29ubmVjdGlvbiBzaG91bGQgcmVtYWlucyBvbi4gKi8KIAlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CiAJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwogfQogCitpbnQgTklDTG9hZEZpcm13YXJlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlpZiAocEFkLT5jaGlwT3BzLmxvYWRGaXJtd2FyZSkKKwkJc3RhdHVzID0gcEFkLT5jaGlwT3BzLmxvYWRGaXJtd2FyZShwQWQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKwogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMjk0NSwxMDAgKzIzMzksMTIgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgTklDRXJhc2VGaXJtd2FyZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3ZvaWQgTklDRXJhc2VGaXJtd2FyZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JVUxPTkcgaTsKKwlpZiAocEFkLT5jaGlwT3BzLmVyYXNlRmlybXdhcmUpCisJCXBBZC0+Y2hpcE9wcy5lcmFzZUZpcm13YXJlKHBBZCk7CiAKLQlmb3IoaT0wOyBpPE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFOyBpKz00KQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBGSVJNV0FSRV9JTUFHRV9CQVNFICsgaSwgMCk7Ci0KLX0vKiBFbmQgb2YgTklDRXJhc2VGaXJtd2FyZSAqLwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJTG9hZCA4MDUxIGZpcm13YXJlIFJUMjU2MS5CSU4gZmlsZSBpbnRvIE1BQyBBU0lDCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX1NVQ0NFU1MgICAgICAgICBmaXJtd2FyZSBpbWFnZSBsb2FkIG9rCi0JCU5ESVNfU1RBVFVTX0ZBSUxVUkUgICAgICAgICBpbWFnZSBub3QgZm91bmQKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUyBOSUNMb2FkRmlybXdhcmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JTkRJU19TVEFUVVMJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JUFVDSEFSCQkJcEZpcm13YXJlSW1hZ2U7Ci0JVUxPTkcJCQlGaWxlTGVuZ3RoLCBJbmRleDsKLQkvL1VMT05HCQkJZmlybTsKLQlVSU5UMzIJCQlNYWNSZWcgPSAwOwotI2lmZGVmIFJUMjg3MAotCVVJTlQzMgkJCVZlcnNpb24gPSAocEFkLT5NQUNWZXJzaW9uID4+IDE2KTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotCXBGaXJtd2FyZUltYWdlID0gRmlybXdhcmVJbWFnZTsKLQlGaWxlTGVuZ3RoID0gc2l6ZW9mKEZpcm13YXJlSW1hZ2UpOwotI2lmZGVmIFJUMjg3MAotCS8vIE5ldyA4ayBieXRlIGZpcm13YXJlIHNpemUgZm9yIFJUMzA3MS9SVDMwNzIKLQkvL3ByaW50aygiVXNiIENoaXBcbiIpOwotCWlmIChGSVJNV0FSRUlNQUdFX0xFTkdUSCA9PSBGSVJNV0FSRUlNQUdFX01BWF9MRU5HVEgpCi0JLy9UaGUgZmlybXdhcmUgaW1hZ2UgY29uc2lzdHMgb2YgdHdvIHBhcnRzLiBPbmUgaXMgdGhlIG9yaWdpYW5sIGFuZCB0aGUgb3RoZXIgaXMgdGhlIG5ldy4KLQkvL1VzZSBTZWNvbmQgUGFydAotCXsKLQkJaWYgKChWZXJzaW9uICE9IDB4Mjg2MCkgJiYgKFZlcnNpb24gIT0gMHgyODcyKSAmJiAoVmVyc2lvbiAhPSAweDMwNzApKQotCQl7CS8vIFVzZSBGaXJtd2FyZSBWMi4KLQkJCS8vcHJpbnRrKCJLSDpVc2UgTmV3IFZlcnNpb24scGFydDJcbiIpOwotCQkJcEZpcm13YXJlSW1hZ2UgPSAoUFVDSEFSKSZGaXJtd2FyZUltYWdlW0ZJUk1XQVJFSU1BR0VWMV9MRU5HVEhdOwotCQkJRmlsZUxlbmd0aCA9IEZJUk1XQVJFSU1BR0VWMl9MRU5HVEg7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvL3ByaW50aygiS0g6VXNlIE5ldyBWZXJzaW9uLHBhcnQxXG4iKTsKLQkJCXBGaXJtd2FyZUltYWdlID0gRmlybXdhcmVJbWFnZTsKLQkJCUZpbGVMZW5ndGggPSBGSVJNV0FSRUlNQUdFVjFfTEVOR1RIOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIktIOiBiaW4gZmlsZSBzaG91bGQgYmUgOEtCLlxuIikpOwotCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0JUlQyOFhYX1dSSVRFX0ZJUk1XQVJFKHBBZCwgcEZpcm13YXJlSW1hZ2UsIEZpbGVMZW5ndGgpOwotCi0JLyogY2hlY2sgaWYgTUNVIGlzIHJlYWR5ICovCi0JSW5kZXggPSAwOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFBCRl9TWVNfQ1RSTCwgJk1hY1JlZyk7Ci0KLQkJaWYgKE1hY1JlZyAmIDB4ODApCi0JCQlicmVhazsKLQotCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCX0gd2hpbGUgKEluZGV4KysgPCAxMDAwKTsKLQotICAgIGlmIChJbmRleCA+IDEwMDApCi0JewotCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJOSUNMb2FkRmlybXdhcmU6IE1DVSBpcyBub3QgcmVhZHlcblxuXG4iKSk7Ci0JfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAotCQkJICgiPD09PSAlcyAoc3RhdHVzPSVkKVxuIiwgX19mdW5jX18sIFN0YXR1cykpOwotICAgIHJldHVybiBTdGF0dXM7Ci19IC8qIEVuZCBvZiBOSUNMb2FkRmlybXdhcmUgKi8KLQorfQkJCQkvKiBFbmQgb2YgTklDRXJhc2VGaXJtd2FyZSAqLwogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMzA2MSw4ICsyMzY3LDcgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5ESVNfU1RBVFVTIE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoraW50IE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKIAlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTMwNzEsNTMgKzIzNzYsNiBAQAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAJUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJaWYgIHBTcmMxIGFsbCB6ZXJvIHdpdGggbGVuZ3RoIExlbmd0aCwgcmV0dXJuIDAuCi0JCUlmIG5vdCBhbGwgemVybywgcmV0dXJuIDEKLQotCUFyZ3VtZW50czoKLQkJcFNyYzEKLQotCVJldHVybiBWYWx1ZToKLQkJMToJCQlub3QgYWxsIHplcm8KLQkJMDoJCQlhbGwgemVybwotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUxPTkcJUlRNUE5vdEFsbFplcm8oCi0JSU4JUFZPSUQJcFNyYzEsCi0JSU4JVUxPTkcJTGVuZ3RoKQotewotCVBVQ0hBUglwTWVtMTsKLQlVTE9ORwlJbmRleCA9IDA7Ci0KLQlwTWVtMSA9IChQVUNIQVIpIHBTcmMxOwotCi0JZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQotCXsKLQkJaWYgKHBNZW0xW0luZGV4XSAhPSAweDApCi0JCXsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKEluZGV4ID09IExlbmd0aCkKLQl7Ci0JCXJldHVybiAoMCk7Ci0JfQotCWVsc2UKLQl7Ci0JCXJldHVybiAoMSk7Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKIAkJQ29tcGFyZSB0d28gbWVtb3J5IGJsb2NrCiAKIAlBcmd1bWVudHM6CkBAIC0zMTM1LDI3ICsyMzkzLDIzIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1VTE9ORwlSVE1QQ29tcGFyZU1lbW9yeSgKLQlJTglQVk9JRAlwU3JjMSwKLQlJTglQVk9JRAlwU3JjMiwKLQlJTglVTE9ORwlMZW5ndGgpCit1bnNpZ25lZCBsb25nIFJUTVBDb21wYXJlTWVtb3J5KHZvaWQgKnBTcmMxLCB2b2lkICpwU3JjMiwgdW5zaWduZWQgbG9uZyBMZW5ndGgpCiB7Ci0JUFVDSEFSCXBNZW0xOwotCVBVQ0hBUglwTWVtMjsKLQlVTE9ORwlJbmRleCA9IDA7CisJdTggKnBNZW0xOworCXU4ICpwTWVtMjsKKwl1bnNpZ25lZCBsb25nIEluZGV4ID0gMDsKIAotCXBNZW0xID0gKFBVQ0hBUikgcFNyYzE7Ci0JcE1lbTIgPSAoUFVDSEFSKSBwU3JjMjsKKwlwTWVtMSA9ICh1OCAqKXBTcmMxOworCXBNZW0yID0gKHU4ICopcFNyYzI7CiAKLQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCi0JeworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykgewogCQlpZiAocE1lbTFbSW5kZXhdID4gcE1lbTJbSW5kZXhdKQogCQkJcmV0dXJuICgxKTsKIAkJZWxzZSBpZiAocE1lbTFbSW5kZXhdIDwgcE1lbTJbSW5kZXhdKQogCQkJcmV0dXJuICgyKTsKIAl9CiAKLQkvLyBFcXVhbAorCS8qIEVxdWFsICovCiAJcmV0dXJuICgwKTsKIH0KIApAQCAtMzE3OSwzNyArMjQzMywxOCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVE1QWmVyb01lbW9yeSgKLQlJTglQVk9JRAlwU3JjLAotCUlOCVVMT05HCUxlbmd0aCkKK3ZvaWQgUlRNUFplcm9NZW1vcnkodm9pZCAqcFNyYywgdW5zaWduZWQgbG9uZyBMZW5ndGgpCiB7Ci0JUFVDSEFSCXBNZW07Ci0JVUxPTkcJSW5kZXggPSAwOworCXU4ICpwTWVtOworCXVuc2lnbmVkIGxvbmcgSW5kZXggPSAwOwogCi0JcE1lbSA9IChQVUNIQVIpIHBTcmM7CisJcE1lbSA9ICh1OCAqKXBTcmM7CiAKLQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCi0JeworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykgewogCQlwTWVtW0luZGV4XSA9IDB4MDA7CiAJfQogfQogCi1WT0lECVJUTVBGaWxsTWVtb3J5KAotCUlOCVBWT0lECXBTcmMsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCVVDSEFSCUZpbGwpCi17Ci0JUFVDSEFSCXBNZW07Ci0JVUxPTkcJSW5kZXggPSAwOwotCi0JcE1lbSA9IChQVUNIQVIpIHBTcmM7Ci0KLQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCi0JewotCQlwTWVtW0luZGV4XSA9IEZpbGw7Ci0JfQotfQotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0zMjMxLDIyICsyNDY2LDE4IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBNb3ZlTWVtb3J5KAotCU9VVAlQVk9JRAlwRGVzdCwKLQlJTglQVk9JRAlwU3JjLAotCUlOCVVMT05HCUxlbmd0aCkKK3ZvaWQgUlRNUE1vdmVNZW1vcnkodm9pZCAqcERlc3QsIHZvaWQgKnBTcmMsIHVuc2lnbmVkIGxvbmcgTGVuZ3RoKQogewotCVBVQ0hBUglwTWVtMTsKLQlQVUNIQVIJcE1lbTI7Ci0JVUlOVAlJbmRleDsKKwl1OCAqcE1lbTE7CisJdTggKnBNZW0yOworCXUzMiBJbmRleDsKIAotCUFTU0VSVCgoTGVuZ3RoPT0wKSB8fCAocERlc3QgJiYgcFNyYykpOworCUFTU0VSVCgoTGVuZ3RoID09IDApIHx8IChwRGVzdCAmJiBwU3JjKSk7CiAKLQlwTWVtMSA9IChQVUNIQVIpIHBEZXN0OwotCXBNZW0yID0gKFBVQ0hBUikgcFNyYzsKKwlwTWVtMSA9ICh1OCAqKXBEZXN0OworCXBNZW0yID0gKHU4ICopcFNyYzsKIAotCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykKLQl7CisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKSB7CiAJCXBNZW0xW0luZGV4XSA9IHBNZW0yW0luZGV4XTsKIAl9CiB9CkBAIC0zMjY5LDE3ICsyNTAwLDE2IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVVzZXJDZmdJbml0KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBVc2VyQ2ZnSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0gICAgVUlOVCBrZXlfaW5kZXgsIGJzc19pbmRleDsKKwl1MzIga2V5X2luZGV4LCBic3NfaW5kZXg7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVXNlckNmZ0luaXRcbiIpKTsKIAotCS8vCi0JLy8gIHBhcnQgSS4gaW50aWFsaXplIGNvbW1vbiBjb25maWd1cmF0aW9uCi0JLy8KLSNpZmRlZiBSVDI4NzAKKwkvKiAqLworCS8qICBwYXJ0IEkuIGludGlhbGl6ZSBjb21tb24gY29uZmlndXJhdGlvbiAqLworCS8qICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCiAJcEFkLT5CdWxrT3V0UmVxID0gMDsKIAogCXBBZC0+QnVsa091dENvbXBsZXRlID0gMDsKQEAgLTMyODksNzIgKzI1MTksNzEgQEAKIAlwQWQtPkJ1bGtJbkNvbXBsZXRlID0gMDsKIAlwQWQtPkJ1bGtJbkNvbXBsZXRlRmFpbCA9IDA7CiAKLQkvL3BBZC0+UXVpY2tUaW1lclAgPSAxMDA7Ci0JLy9wQWQtPlR1cm5BZ2dyQnVsa0luQ291bnQgPSAwOworCS8qcEFkLT5RdWlja1RpbWVyUCA9IDEwMDsgKi8KKwkvKnBBZC0+VHVybkFnZ3JCdWxrSW5Db3VudCA9IDA7ICovCiAJcEFkLT5iVXNiVHhCdWxrQWdncmUgPSAwOwogCi0JLy8gaW5pdCBhcyB1bnNlZCB2YWx1ZSB0byBlbnN1cmUgZHJpdmVyIHdpbGwgc2V0IHRvIE1DVSBvbmNlLgotCXBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCA9IDB4RkY7CisJLyogaW5pdCBhcyB1bnNlZCB2YWx1ZSB0byBlbnN1cmUgZHJpdmVyIHdpbGwgc2V0IHRvIE1DVSBvbmNlLiAqLworCXBBZC0+TGVkSW5kaWNhdG9yU3RyZW5ndGggPSAweEZGOwogCiAJcEFkLT5Db21tb25DZmcuTWF4UGt0T25lVHhCdWxrID0gMjsKIAlwQWQtPkNvbW1vbkNmZy5UeEJ1bGtGYWN0b3IgPSAxOwotCXBBZC0+Q29tbW9uQ2ZnLlJ4QnVsa0ZhY3RvciA9MTsKKwlwQWQtPkNvbW1vbkNmZy5SeEJ1bGtGYWN0b3IgPSAxOwogCi0JcEFkLT5Db21tb25DZmcuVHhQb3dlciA9IDEwMDsgLy9tVworCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXIgPSAxMDA7CS8qbVcgKi8KIAotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLCBzaXplb2YocEFkLT5Db21tb25DZmcuSU9UZXN0UGFybSkpOwotI2VuZGlmIC8vIFJUMjg3MCAvLworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLAorCQkgICAgICAgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0pKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCWZvcihrZXlfaW5kZXg9MDsga2V5X2luZGV4PFNIQVJFX0tFWV9OVU07IGtleV9pbmRleCsrKQotCXsKLQkJZm9yKGJzc19pbmRleCA9IDA7IGJzc19pbmRleCA8IE1BWF9NQlNTSURfTlVNOyBic3NfaW5kZXgrKykKLQkJeworCWZvciAoa2V5X2luZGV4ID0gMDsga2V5X2luZGV4IDwgU0hBUkVfS0VZX05VTTsga2V5X2luZGV4KyspIHsKKwkJZm9yIChic3NfaW5kZXggPSAwOyBic3NfaW5kZXggPCBNQVhfTUJTU0lEX05VTTsgYnNzX2luZGV4KyspIHsKIAkJCXBBZC0+U2hhcmVkS2V5W2Jzc19pbmRleF1ba2V5X2luZGV4XS5LZXlMZW4gPSAwOwotCQkJcEFkLT5TaGFyZWRLZXlbYnNzX2luZGV4XVtrZXlfaW5kZXhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQkJcEFkLT5TaGFyZWRLZXlbYnNzX2luZGV4XVtrZXlfaW5kZXhdLkNpcGhlckFsZyA9CisJCQkgICAgQ0lQSEVSX05PTkU7CiAJCX0KIAl9CiAKLSNpZmRlZiBSVDI4NzAKIAlwQWQtPkVlcHJvbUFjY2VzcyA9IEZBTFNFOwotI2VuZGlmCisKIAlwQWQtPkFudGVubmEud29yZCA9IDA7CiAJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CiAKIAlwQWQtPkxlZENudGwud29yZCA9IDA7Ci0jaWZkZWYgUlQyODYwCi0JcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gMDsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlwQWQtPkxlZEluZGljYXRvclN0cmVuZ3RoID0gMDsKIAlwQWQtPlJMbmtDdHJsT2Zmc2V0ID0gMDsKIAlwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0ID0gMDsKKwlwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPSBUUlVFOwogCXBBZC0+Q2hlY2tEbWFCdXN5Q291bnQgPSAwOwotI2VuZGlmCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKLQlwQWQtPmJBdXRvVHhBZ2NBID0gRkFMU0U7CQkJLy8gRGVmYXVsdCBpcyBPRkYKLQlwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CQkJLy8gRGVmYXVsdCBpcyBPRkYKKwlwQWQtPmJBdXRvVHhBZ2NBID0gRkFMU0U7CS8qIERlZmF1bHQgaXMgT0ZGICovCisJcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOwkvKiBEZWZhdWx0IGlzIE9GRiAqLwogCXBBZC0+UmZJY1R5cGUgPSBSRklDXzI4MjA7CiAKLQkvLyBJbml0IHRpbWVyIGZvciByZXNldCBjb21wbGV0ZSBldmVudAorCS8qIEluaXQgdGltZXIgZm9yIHJlc2V0IGNvbXBsZXRlIGV2ZW50ICovCiAJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSAxOwogCXBBZC0+YkZvcmNlUHJpbnRUWCA9IEZBTFNFOwogCXBBZC0+YkZvcmNlUHJpbnRSWCA9IEZBTFNFOwogCXBBZC0+YlN0YUZpZm9UZXN0ID0gRkFMU0U7CiAJcEFkLT5iUHJvdGVjdGlvblRlc3QgPSBGQUxTRTsKLQlwQWQtPmJIQ0NBVGVzdCA9IEZBTFNFOwotCXBBZC0+Ykdlbk9uZUhDQ0EgPSBGQUxTRTsKLQlwQWQtPkNvbW1vbkNmZy5Ec2lmcyA9IDEwOyAgICAgIC8vIGluIHVuaXRzIG9mIHVzZWMKLQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyID0gMTAwOyAvL21XCi0JcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSAweGZmZmZmZmZmOyAvLyBBVVRPCi0JcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSAweGZmZmZmZmZmOyAvLyBBVVRPCi0JcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVBdXRvOyAvLyB1c2UgTG9uZyBwcmVhbWJsZSBvbiBUWCBieSBkZWZhdXQKKwlwQWQtPkNvbW1vbkNmZy5Ec2lmcyA9IDEwOwkvKiBpbiB1bml0cyBvZiB1c2VjICovCisJcEFkLT5Db21tb25DZmcuVHhQb3dlciA9IDEwMDsJLyptVyAqLworCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMHhmZmZmZmZmZjsJLyogQVVUTyAqLworCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0ID0gMHhmZmZmZmZmZjsJLyogQVVUTyAqLworCXBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBSdDgwMl8xMVByZWFtYmxlQXV0bzsJLyogdXNlIExvbmcgcHJlYW1ibGUgb24gVFggYnkgZGVmYXV0ICovCiAJcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOwogCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9IDIzNDc7CiAJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAyMzQ2OwotCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDA7ICAgIC8vIDA6IEFVVE8KLQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IFRSVUU7IC8vMDsKLQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsgICAgIC8vIHVua25vd24KKwlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOwkvKiAwOiBBVVRPICovCisJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOwkvKjA7ICovCisJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7CS8qIHVua25vd24gKi8KIAlwQWQtPkNvbW1vbkNmZy5CYW5kU3RhdGUgPSBVTktOT1dOX0JBTkQ7CiAJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NQZXJpb2QgPSAxMDsKIAlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU0NvdW50ID0gMDsKIAlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9OT1JNQUxfTU9ERTsKKwogCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNoTW92aW5nVGltZSA9IDY1OwogCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGggPSAzOwogCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSA9IEZBTFNFOwpAQCAtMzM2NywxOCArMjU5NiwyMiBAQAogCiAJTmRpc1plcm9NZW1vcnkoJnBBZC0+QmVhY29uVHhXSSwgc2l6ZW9mKHBBZC0+QmVhY29uVHhXSSkpOwogCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSkpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCisJCSAgICAgICBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KSk7CiAJcEFkLT5IVENFbmFibGUgPSBGQUxTRTsKIAlwQWQtPmJCcm9hZENvbUhUID0gRkFMU0U7CiAJcEFkLT5Db21tb25DZmcuYlJkZyA9IEZBTFNFOwogCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbykpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sCisJCSAgICAgICBzaXplb2YocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKSk7CiAJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gTU1QU19FTkFCTEU7CiAJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gMDsKIAlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gSU1NRURfQkE7Ci0JcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OyAvLzMyOwotCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5UeEJBV2luTGltaXQgPSA2NDsgLy8zMjsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVXNlckNmZ0luaXQuIEJBQ2FwYWJpbGl0eSA9IDB4JXhcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkKSk7CisJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OwkvKjMyOyAqLworCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5UeEJBV2luTGltaXQgPSA2NDsJLyozMjsgKi8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiLS0+IFVzZXJDZmdJbml0LiBCQUNhcGFiaWxpdHkgPSAweCV4XG4iLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkKSk7CiAKIAlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7CiAJQkFUYWJsZUluaXQocEFkLCAmcEFkLT5CQVRhYmxlKTsKQEAgLTMzODYsMjggKzI2MTksMzUgQEAKIAlwQWQtPkNvbW1vbkNmZy5iRXh0Q2hhbm5lbFN3aXRjaEFubm91bmNlbWVudCA9IDE7CiAJcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IDE7CiAJcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IFRSVUU7CisJLyoyMDA4LzExLzA1OktIIGFkZCB0byBzdXBwb3J0IEFudGVubmEgcG93ZXItc2F2aW5nIG9mIEFQPC0tICovCisJcEFkLT5Db21tb25DZmcuYkdyZWVuQVBFbmFibGUgPSBGQUxTRTsKKwkvKjIwMDgvMTEvMDU6S0ggYWRkIHRvIHN1cHBvcnQgQW50ZW5uYSBwb3dlci1zYXZpbmcgb2YgQVAtLT4gKi8KIAlwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gRkFMU0U7CiAJcEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID0gRkFMU0U7CiAKLQlwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZSA9IDc7CisJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NzIwMjAwKSB7CisJCXBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplID0gMTM7CS8qYnkgSmVycnkgcmVjb21tZW5kICovCisJfSBlbHNlIHsKKwkJcEFkLT5Db21tb25DZmcuVHhCQVNpemUgPSA3OworCX0KIAogCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS53b3JkID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQ7CiAKLQkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOwotCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE1DU19BVVRPOwotCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7Ci0JLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKwkvKnBBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOyAqLworCS8qcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE1DU19BVVRPOyAqLworCS8qcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7ICovCisJLypwQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsgKi8KIAlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzY7CiAKIAlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gTUNTX1JBVEVfNjsKIAlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuQlcgPSBCV18yMDsKIAlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKIAotCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA9IDEwMDsgICAgIC8vIGluIG1TZWMKKwlwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAxMDA7CS8qIGluIG1TZWMgKi8KIAotCS8vCi0JLy8gcGFydCBJSS4gaW50aWFsaXplIFNUQSBzcGVjaWZpYyBjb25maWd1cmF0aW9uCi0JLy8KKwkvKiAqLworCS8qIHBhcnQgSUkuIGludGlhbGl6ZSBTVEEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiAqLworCS8qICovCiAJewogCQlSWF9GSUxURVJfU0VUX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9ESVJFQ1QpOwogCQlSWF9GSUxURVJfQ0xFQVJfRkxBRyhwQWQsIGZSWF9GSUxURVJfQUNDRVBUX01VTFRJQ0FTVCk7CkBAIC0zNDIyLDIyICsyNjYyLDIzIEBACiAJCXBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPSBGQUxTRTsKIAkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gMDsKIAotCQkvLyA4MDIuMXggcG9ydCBjb250cm9sCisJCS8qIDgwMi4xeCBwb3J0IGNvbnRyb2wgKi8KIAkJcEFkLT5TdGFDZmcuUHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVA7CiAJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOwogCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gMDsKLQkJcEFkLT5TdGFDZmcuTWljRXJyQ250ICAgICAgICA9IDA7Ci0JCXBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jICAgICAgPSBGQUxTRTsKLQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgICAgICAgICA9IFNTX05PVFVTRTsKKwkJcEFkLT5TdGFDZmcuTWljRXJyQ250ID0gMDsKKwkJcEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CiAKLQkJcEFkLT5Db21tb25DZmcuTmRpc1JhZGlvU3RhdGVPZmYgPSBGQUxTRTsJCS8vIE5ldyB0byBzdXBwb3J0IG1pY3Jvc29mdCBkaXNhYmxlIHJhZGlvIHdpdGggT0lEIGNvbW1hbmQKKwkJcEFkLT5Db21tb25DZmcuTmRpc1JhZGlvU3RhdGVPZmYgPSBGQUxTRTsJLyogTmV3IHRvIHN1cHBvcnQgbWljcm9zb2Z0IGRpc2FibGUgcmFkaW8gd2l0aCBPSUQgY29tbWFuZCAqLwogCiAJCXBBZC0+U3RhQ2ZnLlJzc2lUcmlnZ2VyID0gMDsKLQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHNpemVvZihSU1NJX1NBTVBMRSkpOwotCQlwQWQtPlN0YUNmZy5Sc3NpVHJpZ2dlck1vZGUgPSBSU1NJX1RSSUdHRVJFRF9VUE9OX0JFTE9XX1RIUkVTSE9MRDsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHNpemVvZihzdHJ1Y3QgcnRfcnNzaV9zYW1wbGUpKTsKKwkJcEFkLT5TdGFDZmcuUnNzaVRyaWdnZXJNb2RlID0KKwkJICAgIFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEOwogCQlwQWQtPlN0YUNmZy5BdGltV2luID0gMDsKLQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsvL2RlZmF1bHQgbGlzdGVuIGNvdW50OwotCQlwQWQtPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOyAgLy8gQlNTX0lORlJBIG9yIEJTU19BREhPQyBvciBCU1NfTU9OSVRPUgorCQlwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOwkvKmRlZmF1bHQgbGlzdGVuIGNvdW50OyAqLworCQlwQWQtPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOwkvKiBCU1NfSU5GUkEgb3IgQlNTX0FESE9DIG9yIEJTU19NT05JVE9SICovCiAJCXBBZC0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKIAkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CiAJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dBS0VVUF9OT1cpOwpAQCAtMzQ0NiwxNTggKzI2ODcsMTc0IEBACiAJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CiAJfQogCi0JLy8gZ2xvYmFsIHZhcmlhYmxlcyBtWFhYWCB1c2VkIGluIE1BQyBwcm90b2NvbCBzdGF0ZSBtYWNoaW5lcworI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAorCXBBZC0+YnJ0MzB4eEJhbk1jdUNtZCA9IEZBTFNFOworCXBBZC0+YjMwOTBFU3BlY2lhbENoaXAgPSBGQUxTRTsKKy8qS0ggRGVidWc6dGhlIGZvbGxvd2luZyBtdXN0IGJlIHJlbW92ZWQgKi8KKwlwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID0gMzsKKwlwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4Rm9yY2VBU1BNVGVzdCA9IDA7CisJcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvbGxvd0hvc3RBU1BNID0gMTsKKyNlbmRpZiAvKiBQQ0lFX1BTX1NVUFBPUlQgLy8gKi8KKworCS8qIGdsb2JhbCB2YXJpYWJsZXMgbVhYWFggdXNlZCBpbiBNQUMgcHJvdG9jb2wgc3RhdGUgbWFjaGluZXMgKi8KIAlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKIAlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7CiAJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOwogCi0JLy8gUEhZIHNwZWNpZmljYXRpb24KLQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gUEhZXzExQkdfTUlYRUQ7CQkvLyBkZWZhdWx0IFBIWSBtb2RlCi0JT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsgIC8vIENDSyB1c2UgTE9ORyBwcmVhbWJsZQorCS8qIFBIWSBzcGVjaWZpY2F0aW9uICovCisJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHX01JWEVEOwkvKiBkZWZhdWx0IFBIWSBtb2RlICovCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsJLyogQ0NLIHVzZSBsb25nIHByZWFtYmxlICovCiAKIAl7Ci0JCS8vIHVzZXIgZGVzaXJlZCBwb3dlciBtb2RlCisJCS8qIHVzZXIgZGVzaXJlZCBwb3dlciBtb2RlICovCiAJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOwogCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CiAJCXBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPSBGQUxTRTsKIAotCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYyksIHBBZCwgRkFMU0UpOworCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLAorCQkJICAgICAgR0VUX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpLAorCQkJICAgICAgcEFkLCBGQUxTRSk7CiAJCXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IEZBTFNFOwogCi0JCS8vIFBhdGNoIGZvciBOZHRlc3QKKwkJLyogUGF0Y2ggZm9yIE5kdGVzdCAqLwogCQlwQWQtPlN0YUNmZy5TY2FuQ250ID0gMDsKIAotCQkvLyBDQ1ggMi4wIGNvbnRyb2wgZmxhZyBpbml0Ci0JCXBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IEZBTFNFOwotCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlID0gTVNSTl9UWVBFX1VOVVNFRDsKLQkJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWluCT0gNDsKLQkJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWF4CT0gMTA7CisJCXBBZC0+U3RhQ2ZnLmJId1JhZGlvID0gVFJVRTsJLyogRGVmYXVsdCBIYXJkd2FyZSBSYWRpbyBzdGF0dXMgaXMgT24gKi8KKwkJcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBUUlVFOwkvKiBEZWZhdWx0IFNvZnR3YXJlIFJhZGlvIHN0YXR1cyBpcyBPbiAqLworCQlwQWQtPlN0YUNmZy5iUmFkaW8gPSBUUlVFOwkvKiBiSHdSYWRpbyAmJiBiU3dSYWRpbyAqLworCQlwQWQtPlN0YUNmZy5iSGFyZHdhcmVSYWRpbyA9IEZBTFNFOwkvKiBEZWZhdWx0IGlzIE9GRiAqLworCQlwQWQtPlN0YUNmZy5iU2hvd0hpZGRlblNTSUQgPSBGQUxTRTsJLyogRGVmYXVsdCBubyBzaG93ICovCiAKLQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gID0gVFJVRTsgLy8gRGVmYXVsdCBIYXJkd2FyZSBSYWRpbyBzdGF0dXMgaXMgT24KLQkJcEFkLT5TdGFDZmcuYlN3UmFkaW8gID0gVFJVRTsgLy8gRGVmYXVsdCBTb2Z0d2FyZSBSYWRpbyBzdGF0dXMgaXMgT24KLQkJcEFkLT5TdGFDZmcuYlJhZGlvICAgID0gVFJVRTsgLy8gYkh3UmFkaW8gJiYgYlN3UmFkaW8KLQkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBGQUxTRTsJCS8vIERlZmF1bHQgaXMgT0ZGCi0JCXBBZC0+U3RhQ2ZnLmJTaG93SGlkZGVuU1NJRCA9IEZBTFNFOwkJLy8gRGVmYXVsdCBubyBzaG93Ci0KLQkJLy8gTml0cm8gbW9kZSBjb250cm9sCisJCS8qIE5pdHJvIG1vZGUgY29udHJvbCAqLwogCQlwQWQtPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CiAKLQkJLy8gU2F2ZSB0aGUgaW5pdCB0aW1lIGFzIGxhc3Qgc2NhbiB0aW1lLCB0aGUgc3lzdGVtIHNob3VsZCBkbyBzY2FuIGFmdGVyIDIgc2Vjb25kcy4KLQkJLy8gVGhpcyBwYXRjaCBpcyBmb3IgZHJpdmVyIHdha2UgdXAgZnJvbSBzdGFuZGJ5IG1vZGUsIHN5c3RlbSB3aWxsIGRvIHNjYW4gcmlnaHQgYXdheS4KLQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gMDsKLQkJTmRpc1plcm9NZW1vcnkocEFkLT5uaWNrbmFtZSwgSVdfRVNTSURfTUFYX1NJWkUrMSk7Ci0JCXNwcmludGYocEFkLT5uaWNrbmFtZSwgIiVzIiwgU1RBX05JQ19ERVZJQ0VfTkFNRSk7Ci0JCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5TdGFDZmcuV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYyksIHBBZCwgRkFMU0UpOworCQkvKiBTYXZlIHRoZSBpbml0IHRpbWUgYXMgbGFzdCBzY2FuIHRpbWUsIHRoZSBzeXN0ZW0gc2hvdWxkIGRvIHNjYW4gYWZ0ZXIgMiBzZWNvbmRzLiAqLworCQkvKiBUaGlzIHBhdGNoIGlzIGZvciBkcml2ZXIgd2FrZSB1cCBmcm9tIHN0YW5kYnkgbW9kZSwgc3lzdGVtIHdpbGwgZG8gc2NhbiByaWdodCBhd2F5LiAqLworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUpOworCQlpZiAocEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID4gMTAgKiBPU19IWikKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSAtPSAoMTAgKiBPU19IWik7CisKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5uaWNrbmFtZSwgSVdfRVNTSURfTUFYX1NJWkUgKyAxKTsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJc3ByaW50ZigoY2hhciAqKXBBZC0+bmlja25hbWUsICJSVDI4NjBTVEEiKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkJc3ByaW50ZigoY2hhciAqKXBBZC0+bmlja25hbWUsICJSVDI4NzBTVEEiKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5XcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lciwKKwkJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTihXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYyksCisJCQkgICAgICBwQWQsIEZBTFNFKTsKIAkJcEFkLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CiAJCXBBZC0+U3RhQ2ZnLklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID0gRkFMU0U7CiAJCXBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEU7CisJCXBBZC0+U3RhQ2ZnLmJSU05fSUVfRnJvbVdwYVN1cHBsaWNhbnQgPSBGQUxTRTsKIAkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFOworCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIDgpOworCisJCXBBZC0+U3RhQ2ZnLmJBdXRvQ29ubmVjdEJ5QnNzaWQgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuQmVhY29uTG9zdFRpbWUgPSBCRUFDT05fTE9TVF9USU1FOworCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5XcGFQYXNzUGhyYXNlLCA2NCk7CisJCXBBZC0+U3RhQ2ZnLldwYVBhc3NQaHJhc2VMZW4gPSAwOworCQlwQWQtPlN0YUNmZy5iQXV0b1JvYW1pbmcgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuYkZvcmNlVHhCdXJzdCA9IEZBTFNFOwogCX0KIAotCS8vIERlZmF1bHQgZm9yIGV4dHJhIGluZm9ybWF0aW9uIGlzIG5vdCB2YWxpZAorCS8qIERlZmF1bHQgZm9yIGV4dHJhIGluZm9ybWF0aW9uIGlzIG5vdCB2YWxpZCAqLwogCXBBZC0+RXh0cmFJbmZvID0gRVhUUkFfSU5GT19DTEVBUjsKIAotCS8vIERlZmF1bHQgQ29uZmlnIGNoYW5nZSBmbGFnCisJLyogRGVmYXVsdCBDb25maWcgY2hhbmdlIGZsYWcgKi8KIAlwQWQtPmJDb25maWdDaGFuZ2VkID0gRkFMU0U7CiAKLQkvLwotCS8vIHBhcnQgSUlJLiBBUCBjb25maWd1cmF0aW9ucwotCS8vCisJLyogKi8KKwkvKiBwYXJ0IElJSS4gQVAgY29uZmlndXJhdGlvbnMgKi8KKwkvKiAqLwogCi0KLQkvLwotCS8vIHBhcnQgSVYuIG90aGVycwotCS8vCi0JLy8gZHluYW1pYyBCQlAgUjY2OnNlbnNpYml0eSB0dW5pbmcgdG8gb3ZlcmNvbWUgYmFja2dyb3VuZCBub2lzZQotCXBBZC0+QmJwVHVuaW5nLmJFbmFibGUgICAgICAgICAgICAgICAgPSBUUlVFOworCS8qICovCisJLyogcGFydCBJVi4gb3RoZXJzICovCisJLyogKi8KKwkvKiBkeW5hbWljIEJCUCBSNjY6c2Vuc2liaXR5IHR1bmluZyB0byBvdmVyY29tZSBiYWNrZ3JvdW5kIG5vaXNlICovCisJcEFkLT5CYnBUdW5pbmcuYkVuYWJsZSA9IFRSVUU7CiAJcEFkLT5CYnBUdW5pbmcuRmFsc2VDY2FMb3dlclRocmVzaG9sZCA9IDEwMDsKIAlwQWQtPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkID0gNTEyOwotCXBBZC0+QmJwVHVuaW5nLlI2NkRlbHRhICAgICAgICAgICAgICAgPSA0OworCXBBZC0+QmJwVHVuaW5nLlI2NkRlbHRhID0gNDsKIAlwQWQtPk1sbWUuYkVuYWJsZUF1dG9BbnRlbm5hQ2hlY2sgPSBUUlVFOwogCi0JLy8KLQkvLyBBbHNvIGluaXRpYWwgUjY2Q3VycmVudFZhbHVlLCBSVFVTQlJlc3VtZU1zZHVUcmFuc21pc3Npb24gbWlnaHQgdXNlIHRoaXMgdmFsdWUuCi0JLy8gaWYgbm90IGluaXRpYWwgdGhpcyB2YWx1ZSwgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSAwLgotCS8vCisJLyogKi8KKwkvKiBBbHNvIGluaXRpYWwgUjY2Q3VycmVudFZhbHVlLCBSVFVTQlJlc3VtZU1zZHVUcmFuc21pc3Npb24gbWlnaHQgdXNlIHRoaXMgdmFsdWUuICovCisJLyogaWYgbm90IGluaXRpYWwgdGhpcyB2YWx1ZSwgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSAwLiAqLworCS8qICovCiAJcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlID0gMHgzODsKIAogCXBBZC0+QmJwOTQgPSBCQlBSOTRfREVGQVVMVDsKIAlwQWQtPkJicEZvckNDSyA9IEZBTFNFOwogCi0JLy8gaW5pdGlhbGl6ZSBNQUMgdGFibGUgYW5kIGFsbG9jYXRlIHNwaW4gbG9jawotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1hY1RhYiwgc2l6ZW9mKE1BQ19UQUJMRSkpOworCS8qIERlZmF1bHQgaXMgRkFMU0UgZm9yIHRlc3QgYml0IDEgKi8KKwkvKnBBZC0+YlRlc3QxID0gRkFMU0U7ICovCisKKwkvKiBpbml0aWFsaXplIE1BQyB0YWJsZSBhbmQgYWxsb2NhdGUgc3BpbiBsb2NrICovCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWFjVGFiLCBzaXplb2Yoc3RydWN0IHJ0X21hY190YWJsZSkpOwogCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEFkLT5NYWNUYWIuTWNhc3RQc1F1ZXVlKTsKIAlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKIAorCS8qUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlJFQ0JBVGltZXIsIFJFQ0JBVGltZXJUaW1lb3V0LCBwQWQsIFRSVUUpOyAqLworCS8qUlRNUFNldFRpbWVyKCZwQWQtPlJFQ0JBVGltZXIsIFJFT1JERVJfRVhFQ19JTlRWKTsgKi8KKwogCXBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCA9IEZBTFNFOwotI2lmZGVmIFJUMjg2MAorI2lmZGVmIFJUTVBfTUFDX1BDSQogCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCiAJUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLSNlbmRpZgogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBVc2VyQ2ZnSW5pdFxuIikpOwogfQogCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotVUNIQVIgQnRvSChjaGFyIGNoKQorLyogSVJRTCA9IFBBU1NJVkVfTEVWRUwgKi8KK3U4IEJ0b0goY2hhciBjaCkKIHsKLQlpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgcmV0dXJuIChjaCAtICcwJyk7ICAgICAgICAvLyBIYW5kbGUgbnVtZXJhbHMKLQlpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgcmV0dXJuIChjaCAtICdBJyArIDB4QSk7ICAvLyBIYW5kbGUgY2FwaXRvbCBoZXggZGlnaXRzCi0JaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpIHJldHVybiAoY2ggLSAnYScgKyAweEEpOyAgLy8gSGFuZGxlIHNtYWxsIGhleCBkaWdpdHMKLQlyZXR1cm4oMjU1KTsKKwlpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykKKwkJcmV0dXJuIChjaCAtICcwJyk7CS8qIEhhbmRsZSBudW1lcmFscyAqLworCWlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKQorCQlyZXR1cm4gKGNoIC0gJ0EnICsgMHhBKTsJLyogSGFuZGxlIGNhcGl0b2wgaGV4IGRpZ2l0cyAqLworCWlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKQorCQlyZXR1cm4gKGNoIC0gJ2EnICsgMHhBKTsJLyogSGFuZGxlIHNtYWxsIGhleCBkaWdpdHMgKi8KKwlyZXR1cm4gKDI1NSk7CiB9CiAKLS8vCi0vLyAgRlVOQ1RJT046IEF0b0goY2hhciAqLCBVQ0hBUiAqLCBpbnQpCi0vLwotLy8gIFBVUlBPU0U6ICBDb252ZXJ0cyBhc2NpaSBzdHJpbmcgdG8gbmV0d29yayBvcmRlciBoZXgKLS8vCi0vLyAgUEFSQU1FVEVSUzoKLS8vICAgIHNyYyAgICAtIHBvaW50ZXIgdG8gaW5wdXQgYXNjaWkgc3RyaW5nCi0vLyAgICBkZXN0ICAgLSBwb2ludGVyIHRvIG91dHB1dCBoZXgKLS8vICAgIGRlc3RsZW4gLSBzaXplIG9mIGRlc3QKLS8vCi0vLyAgQ09NTUVOVFM6Ci0vLwotLy8gICAgMiBhc2NpaSBieXRlcyBtYWtlIGEgaGV4IGJ5dGUgc28gbXVzdCBwdXQgMXN0IGFzY2lpIGJ5dGUgb2YgcGFpcgotLy8gICAgaW50byB1cHBlciBuaWJibGUgYW5kIDJuZCBhc2NpaSBieXRlIG9mIHBhaXIgaW50byBsb3dlciBuaWJibGUuCi0vLwotLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKKy8qICovCisvKiAgRlVOQ1RJT046IEF0b0goY2hhciAqLCB1OCAqLCBpbnQpICovCisvKiAqLworLyogIFBVUlBPU0U6ICBDb252ZXJ0cyBhc2NpaSBzdHJpbmcgdG8gbmV0d29yayBvcmRlciBoZXggKi8KKy8qICovCisvKiAgUEFSQU1FVEVSUzogKi8KKy8qICAgIHNyYyAgICAtIHBvaW50ZXIgdG8gaW5wdXQgYXNjaWkgc3RyaW5nICovCisvKiAgICBkZXN0ICAgLSBwb2ludGVyIHRvIG91dHB1dCBoZXggKi8KKy8qICAgIGRlc3RsZW4gLSBzaXplIG9mIGRlc3QgKi8KKy8qICovCisvKiAgQ09NTUVOVFM6ICovCisvKiAqLworLyogICAgMiBhc2NpaSBieXRlcyBtYWtlIGEgaGV4IGJ5dGUgc28gbXVzdCBwdXQgMXN0IGFzY2lpIGJ5dGUgb2YgcGFpciAqLworLyogICAgaW50byB1cHBlciBuaWJibGUgYW5kIDJuZCBhc2NpaSBieXRlIG9mIHBhaXIgaW50byBsb3dlciBuaWJibGUuICovCisvKiAqLworLyogSVJRTCA9IFBBU1NJVkVfTEVWRUwgKi8KIAotdm9pZCBBdG9IKGNoYXIgKiBzcmMsIFVDSEFSICogZGVzdCwgaW50IGRlc3RsZW4pCit2b2lkIEF0b0goY2hhciAqc3JjLCB1OCAqZGVzdCwgaW50IGRlc3RsZW4pCiB7Ci0JY2hhciAqIHNyY3B0cjsKLQlQVUNIQVIgZGVzdFRlbXA7CisJY2hhciAqc3JjcHRyOworCXU4ICpkZXN0VGVtcDsKIAogCXNyY3B0ciA9IHNyYzsKLQlkZXN0VGVtcCA9IChQVUNIQVIpIGRlc3Q7CisJZGVzdFRlbXAgPSAodTggKilkZXN0OwogCi0Jd2hpbGUoZGVzdGxlbi0tKQotCXsKLQkJKmRlc3RUZW1wID0gQnRvSCgqc3JjcHRyKyspIDw8IDQ7ICAgIC8vIFB1dCAxc3QgYXNjaWkgYnl0ZSBpbiB1cHBlciBuaWJibGUuCi0JCSpkZXN0VGVtcCArPSBCdG9IKCpzcmNwdHIrKyk7ICAgICAgLy8gQWRkIDJuZCBhc2NpaSBieXRlIHRvIGFib3ZlLgorCXdoaWxlIChkZXN0bGVuLS0pIHsKKwkJKmRlc3RUZW1wID0gQnRvSCgqc3JjcHRyKyspIDw8IDQ7CS8qIFB1dCAxc3QgYXNjaWkgYnl0ZSBpbiB1cHBlciBuaWJibGUuICovCisJCSpkZXN0VGVtcCArPSBCdG9IKCpzcmNwdHIrKyk7CS8qIEFkZCAybmQgYXNjaWkgYnl0ZSB0byBhYm92ZS4gKi8KIAkJZGVzdFRlbXArKzsKIAl9CiB9CiAKLVZPSUQJUlRNUFBhdGNoTWFjQmJwQnVnKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCVVMT05HCUluZGV4OwotCi0JLy8gSW5pdGlhbGl6ZSBCQlAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9CQlBfUkVHX1BBUk1TOyBJbmRleCsrKQotCXsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUFJlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgKFVDSEFSKUJCUFJlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7Ci0JfQotCi0JLy8gSW5pdGlhbGl6ZSBSRiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCi0JQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0KLQkvLyBSZS1pbml0IEJCUCByZWdpc3RlciBmcm9tIEVFUFJPTSB2YWx1ZQotCU5JQ0luaXRBc2ljRnJvbUVFUFJPTShwQWQpOwotfQorLyorKytNYXJrIGJ5IHNoaWFuZywgbm90IHVzZSBub3csIG5lZWQgdG8gcmVtb3ZlIGFmdGVyIGNvbmZpcm0gKi8KKy8qLS0tTWFyayBieSBzaGlhbmcsIG5vdCB1c2Ugbm93LCBuZWVkIHRvIHJlbW92ZSBhZnRlciBjb25maXJtICovCiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0zNjE4LDI5ICsyODc1LDI2IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBJbml0VGltZXIoCi0JSU4JUFJUTVBfQURBUFRFUgkJCXBBZCwKLQlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCi0JSU4JUFZPSUQJCQkJCXBUaW1lckZ1bmMsCi0JSU4JUFZPSUQJCQkJCXBEYXRhLAotCUlOCUJPT0xFQU4JCQkJCVJlcGVhdCkKK3ZvaWQgUlRNUEluaXRUaW1lcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgIHN0cnVjdCBydF9yYWxpbmtfdGltZXIgKnBUaW1lciwKKwkJICAgdm9pZCAqcFRpbWVyRnVuYywgdm9pZCAqcERhdGEsIElOIEJPT0xFQU4gUmVwZWF0KQogewotCS8vCi0JLy8gU2V0IFZhbGlkIHRvIFRSVUUgZm9yIGxhdGVyIHVzZWQuCi0JLy8gSXQgd2lsbCBjcmFzaCBpZiB3ZSBjYW5jZWwgYSB0aW1lciBvciBzZXQgYSB0aW1lcgotCS8vIHRoYXQgd2UgaGF2ZW4ndCBpbml0aWFsaXplIGJlZm9yZS4KLQkvLwotCXBUaW1lci0+VmFsaWQgICAgICA9IFRSVUU7CisJLyogKi8KKwkvKiBTZXQgVmFsaWQgdG8gVFJVRSBmb3IgbGF0ZXIgdXNlZC4gKi8KKwkvKiBJdCB3aWxsIGNyYXNoIGlmIHdlIGNhbmNlbCBhIHRpbWVyIG9yIHNldCBhIHRpbWVyICovCisJLyogdGhhdCB3ZSBoYXZlbid0IGluaXRpYWxpemUgYmVmb3JlLiAqLworCS8qICovCisJcFRpbWVyLT5WYWxpZCA9IFRSVUU7CiAKIAlwVGltZXItPlBlcmlvZGljVHlwZSA9IFJlcGVhdDsKLQlwVGltZXItPlN0YXRlICAgICAgPSBGQUxTRTsKLQlwVGltZXItPmNvb2tpZSA9IChVTE9ORykgcERhdGE7CisJcFRpbWVyLT5TdGF0ZSA9IEZBTFNFOworCXBUaW1lci0+Y29va2llID0gKHVuc2lnbmVkIGxvbmcpcERhdGE7CiAKLSNpZmRlZiBSVDI4NzAKKyNpZmRlZiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVAogCXBUaW1lci0+cEFkID0gcEFkOwotI2VuZGlmIC8vIFJUMjg3MCAvLworI2VuZGlmIC8qIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vICovCiAKLQlSVE1QX09TX0luaXRfVGltZXIocEFkLAkmcFRpbWVyLT5UaW1lck9iaiwJcFRpbWVyRnVuYywgKFBWT0lEKSBwVGltZXIpOworCVJUTVBfT1NfSW5pdF9UaW1lcihwQWQsICZwVGltZXItPlRpbWVyT2JqLCBwVGltZXJGdW5jLCAodm9pZCAqKXBUaW1lcik7CiB9CiAKIC8qCkBAIC0zNjYxLDMyICsyOTE1LDIzIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBTZXRUaW1lcigKLQlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCi0JSU4JVUxPTkcJCQkJCVZhbHVlKQordm9pZCBSVE1QU2V0VGltZXIoc3RydWN0IHJ0X3JhbGlua190aW1lciAqcFRpbWVyLCB1bnNpZ25lZCBsb25nIFZhbHVlKQogewotCWlmIChwVGltZXItPlZhbGlkKQotCXsKKwlpZiAocFRpbWVyLT5WYWxpZCkgewogCQlwVGltZXItPlRpbWVyVmFsdWUgPSBWYWx1ZTsKLQkJcFRpbWVyLT5TdGF0ZSAgICAgID0gRkFMU0U7Ci0JCWlmIChwVGltZXItPlBlcmlvZGljVHlwZSA9PSBUUlVFKQotCQl7CisJCXBUaW1lci0+U3RhdGUgPSBGQUxTRTsKKwkJaWYgKHBUaW1lci0+UGVyaW9kaWNUeXBlID09IFRSVUUpIHsKIAkJCXBUaW1lci0+UmVwZWF0ID0gVFJVRTsKIAkJCVJUTVBfU2V0UGVyaW9kaWNUaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgVmFsdWUpOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJcFRpbWVyLT5SZXBlYXQgPSBGQUxTRTsKIAkJCVJUTVBfT1NfQWRkX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBWYWx1ZSk7CiAJCX0KLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlEQkdQUklOVF9FUlIoKCJSVE1QU2V0VGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIikpOwogCX0KIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0zNzA1LDI4ICsyOTUwLDIwIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBNb2RUaW1lcigKLQlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCi0JSU4JVUxPTkcJCQkJCVZhbHVlKQordm9pZCBSVE1QTW9kVGltZXIoc3RydWN0IHJ0X3JhbGlua190aW1lciAqcFRpbWVyLCB1bnNpZ25lZCBsb25nIFZhbHVlKQogewotCUJPT0xFQU4JQ2FuY2VsOworCUJPT0xFQU4gQ2FuY2VsOwogCi0JaWYgKHBUaW1lci0+VmFsaWQpCi0JeworCWlmIChwVGltZXItPlZhbGlkKSB7CiAJCXBUaW1lci0+VGltZXJWYWx1ZSA9IFZhbHVlOwotCQlwVGltZXItPlN0YXRlICAgICAgPSBGQUxTRTsKLQkJaWYgKHBUaW1lci0+UGVyaW9kaWNUeXBlID09IFRSVUUpCi0JCXsKKwkJcFRpbWVyLT5TdGF0ZSA9IEZBTFNFOworCQlpZiAocFRpbWVyLT5QZXJpb2RpY1R5cGUgPT0gVFJVRSkgewogCQkJUlRNUENhbmNlbFRpbWVyKHBUaW1lciwgJkNhbmNlbCk7CiAJCQlSVE1QU2V0VGltZXIocFRpbWVyLCBWYWx1ZSk7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlSVE1QX09TX01vZF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgVmFsdWUpOwogCQl9Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJREJHUFJJTlRfRVJSKCgiUlRNUE1vZFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKIAl9CiB9CkBAIC0zNzUyLDMyICsyOTg5LDIzIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBDYW5jZWxUaW1lcigKLQlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCi0JT1VUCUJPT0xFQU4JCQkJCSpwQ2FuY2VsbGVkKQordm9pZCBSVE1QQ2FuY2VsVGltZXIoc3RydWN0IHJ0X3JhbGlua190aW1lciAqcFRpbWVyLCBPVVQgQk9PTEVBTiAqIHBDYW5jZWxsZWQpCiB7Ci0JaWYgKHBUaW1lci0+VmFsaWQpCi0JeworCWlmIChwVGltZXItPlZhbGlkKSB7CiAJCWlmIChwVGltZXItPlN0YXRlID09IEZBTFNFKQogCQkJcFRpbWVyLT5SZXBlYXQgPSBGQUxTRTsKLQkJCVJUTVBfT1NfRGVsX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBwQ2FuY2VsbGVkKTsKKworCQlSVE1QX09TX0RlbF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgcENhbmNlbGxlZCk7CiAKIAkJaWYgKCpwQ2FuY2VsbGVkID09IFRSVUUpCiAJCQlwVGltZXItPlN0YXRlID0gVFJVRTsKIAotI2lmZGVmIFJUMjg3MAotCQkvLyBXZSBuZWVkIHRvIGdvLXRocm91Z2ggdGhlIFRpbWVyUSB0byBmaW5kb3V0IHRoaXMgdGltZXIgaGFuZGxlciBhbmQgcmVtb3ZlIGl0IGlmCi0JCS8vCQlpdCdzIHN0aWxsIHdhaXRpbmcgZm9yIGV4ZWN1dGlvbi4KLQotCQlSVDI4NzBfVGltZXJRX1JlbW92ZShwVGltZXItPnBBZCwgcFRpbWVyKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQl9Ci0JZWxzZQotCXsKLQkJLy8KLQkJLy8gTmRpc01DYW5jZWxUaW1lciBqdXN0IGNhbmNlZCB0aGUgdGltZXIgYW5kIG5vdCBtZWFuIHJlbGVhc2UgdGhlIHRpbWVyLgotCQkvLyBBbmQgZG9uJ3Qgc2V0IHRoZSAiVmFsaWQiIHRvIEZhbHNlLiBTbyB0aGF0IHdlIGNhbiB1c2UgdGhpcyB0aW1lciBhZ2Fpbi4KLQkJLy8KKyNpZmRlZiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVAorCQkvKiBXZSBuZWVkIHRvIGdvLXRocm91Z2ggdGhlIFRpbWVyUSB0byBmaW5kb3V0IHRoaXMgdGltZXIgaGFuZGxlciBhbmQgcmVtb3ZlIGl0IGlmICovCisJCS8qICAgICAgICAgICAgICBpdCdzIHN0aWxsIHdhaXRpbmcgZm9yIGV4ZWN1dGlvbi4gKi8KKwkJUnRtcFRpbWVyUVJlbW92ZShwVGltZXItPnBBZCwgcFRpbWVyKTsKKyNlbmRpZiAvKiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLyAqLworCX0gZWxzZSB7CiAJCURCR1BSSU5UX0VSUigoIlJUTVBDYW5jZWxUaW1lciBmYWlsZWQsIFRpbWVyIGhhc24ndCBiZWVuIGluaXRpYWxpemUhXG4iKSk7CiAJfQogfQpAQCAtMzgwMiw2NCArMzAzMCw2NCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBSVE1QU2V0TEVEKAotCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKLQlJTiBVQ0hBUgkJCVN0YXR1cykKK3ZvaWQgUlRNUFNldExFRChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IFN0YXR1cykKIHsKLQkvL1VMT05HCQkJZGF0YTsKLQlVQ0hBUgkJCUhpZ2hCeXRlID0gMDsKLQlVQ0hBUgkJCUxvd0J5dGU7CisJLyp1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICBkYXRhOyAqLworCXU4IEhpZ2hCeXRlID0gMDsKKwl1OCBMb3dCeXRlOwogCi0JTG93Qnl0ZSA9IHBBZC0+TGVkQ250bC5maWVsZC5MZWRNb2RlJjB4N2Y7Ci0Jc3dpdGNoIChTdGF0dXMpCi0JewotCQljYXNlIExFRF9MSU5LX0RPV046Ci0JCQlIaWdoQnl0ZSA9IDB4MjA7Ci0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKLQkJCXBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBMRURfTElOS19VUDoKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JCQkJSGlnaEJ5dGUgPSAweGEwOwotCQkJZWxzZQotCQkJCUhpZ2hCeXRlID0gMHg2MDsKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTEVEX1JBRElPX09OOgotCQkJSGlnaEJ5dGUgPSAweDIwOwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBMRURfSEFMVDoKLQkJCUxvd0J5dGUgPSAwOyAvLyBEcml2ZXIgc2V0cyBNQUMgcmVnaXN0ZXIgYW5kIE1BQyBjb250cm9scyBMRUQKLQkJY2FzZSBMRURfUkFESU9fT0ZGOgotCQkJSGlnaEJ5dGUgPSAwOwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7Ci0JCQlicmVhazsKLSAgICAgICAgY2FzZSBMRURfV1BTOgotCQkJSGlnaEJ5dGUgPSAweDEwOwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBMRURfT05fU0lURV9TVVJWRVk6Ci0JCQlIaWdoQnl0ZSA9IDB4MDg7Ci0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIExFRF9QT1dFUl9VUDoKLQkJCUhpZ2hCeXRlID0gMHgwNDsKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlJUTVBTZXRMRUQ6OlVua25vd24gU3RhdHVzICVkXG4iLCBTdGF0dXMpKTsKLQkJCWJyZWFrOworCUxvd0J5dGUgPSBwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSAmIDB4N2Y7CisJc3dpdGNoIChTdGF0dXMpIHsKKwljYXNlIExFRF9MSU5LX0RPV046CisJCUhpZ2hCeXRlID0gMHgyMDsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCXBBZC0+TGVkSW5kaWNhdG9yU3RyZW5ndGggPSAwOworCQlicmVhazsKKwljYXNlIExFRF9MSU5LX1VQOgorCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQkJSGlnaEJ5dGUgPSAweGEwOworCQllbHNlCisJCQlIaWdoQnl0ZSA9IDB4NjA7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQlicmVhazsKKwljYXNlIExFRF9SQURJT19PTjoKKwkJSGlnaEJ5dGUgPSAweDIwOworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJYnJlYWs7CisJY2FzZSBMRURfSEFMVDoKKwkJTG93Qnl0ZSA9IDA7CS8qIERyaXZlciBzZXRzIE1BQyByZWdpc3RlciBhbmQgTUFDIGNvbnRyb2xzIExFRCAqLworCWNhc2UgTEVEX1JBRElPX09GRjoKKwkJSGlnaEJ5dGUgPSAwOworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJYnJlYWs7CisJY2FzZSBMRURfV1BTOgorCQlIaWdoQnl0ZSA9IDB4MTA7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQlicmVhazsKKwljYXNlIExFRF9PTl9TSVRFX1NVUlZFWToKKwkJSGlnaEJ5dGUgPSAweDA4OworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJYnJlYWs7CisJY2FzZSBMRURfUE9XRVJfVVA6CisJCUhpZ2hCeXRlID0gMHgwNDsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkgKCJSVE1QU2V0TEVEOjpVbmtub3duIFN0YXR1cyAlZFxuIiwgU3RhdHVzKSk7CisJCWJyZWFrOwogCX0KIAotICAgIC8vCi0JLy8gS2VlcCBMRUQgc3RhdHVzIGZvciBMRUQgU2l0ZVN1cnZleSBtb2RlLgotCS8vIEFmdGVyIFNpdGVTdXJ2ZXksIHdlIHdpbGwgc2V0IHRoZSBMRUQgbW9kZSB0byBwcmV2aW91cyBzdGF0dXMuCi0JLy8KKwkvKiAqLworCS8qIEtlZXAgTEVEIHN0YXR1cyBmb3IgTEVEIFNpdGVTdXJ2ZXkgbW9kZS4gKi8KKwkvKiBBZnRlciBTaXRlU3VydmV5LCB3ZSB3aWxsIHNldCB0aGUgTEVEIG1vZGUgdG8gcHJldmlvdXMgc3RhdHVzLiAqLworCS8qICovCiAJaWYgKChTdGF0dXMgIT0gTEVEX09OX1NJVEVfU1VSVkVZKSAmJiAoU3RhdHVzICE9IExFRF9QT1dFUl9VUCkpCiAJCXBBZC0+TGVkU3RhdHVzID0gU3RhdHVzOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldExFRDo6TW9kZT0lZCxIaWdoQnl0ZT0weCUwMngsTG93Qnl0ZT0weCUwMnhcbiIsIHBBZC0+TGVkQ250bC5maWVsZC5MZWRNb2RlLCBIaWdoQnl0ZSwgTG93Qnl0ZSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJSVE1QU2V0TEVEOjpNb2RlPSVkLEhpZ2hCeXRlPTB4JTAyeCxMb3dCeXRlPTB4JTAyeFxuIiwKKwkJICBwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSwgSGlnaEJ5dGUsIExvd0J5dGUpKTsKIH0KIAogLyoKQEAgLTM4ODksNDAgKzMxMTcsMzIgQEAKIAkJID4gLTU3ICBFeGNlbGxlbnQKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIFJUTVBTZXRTaWduYWxMRUQoCi0JSU4gUFJUTVBfQURBUFRFUiAJcEFkLAotCUlOIE5ESVNfODAyXzExX1JTU0kgRGJtKQordm9pZCBSVE1QU2V0U2lnbmFsTEVEKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gTkRJU184MDJfMTFfUlNTSSBEYm0pCiB7Ci0JVUNIQVIJCW5MZWQgPSAwOworCXU4IG5MZWQgPSAwOwogCi0JLy8KLQkvLyBpZiBub3QgU2lnbmFsIFN0cmVndGgsIHRoZW4gZG8gbm90aGluZy4KLQkvLwotCWlmIChwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSAhPSBMRURfTU9ERV9TSUdOQUxfU1RSRUdUSCkKLQl7Ci0JCXJldHVybjsKLQl9CisJaWYgKHBBZC0+TGVkQ250bC5maWVsZC5MZWRNb2RlID09IExFRF9NT0RFX1NJR05BTF9TVFJFR1RIKSB7CisJCWlmIChEYm0gPD0gLTkwKQorCQkJbkxlZCA9IDA7CisJCWVsc2UgaWYgKERibSA8PSAtODEpCisJCQluTGVkID0gMTsKKwkJZWxzZSBpZiAoRGJtIDw9IC03MSkKKwkJCW5MZWQgPSAzOworCQllbHNlIGlmIChEYm0gPD0gLTY3KQorCQkJbkxlZCA9IDc7CisJCWVsc2UgaWYgKERibSA8PSAtNTcpCisJCQluTGVkID0gMTU7CisJCWVsc2UKKwkJCW5MZWQgPSAzMTsKIAotCWlmIChEYm0gPD0gLTkwKQotCQluTGVkID0gMDsKLQllbHNlIGlmIChEYm0gPD0gLTgxKQotCQluTGVkID0gMTsKLQllbHNlIGlmIChEYm0gPD0gLTcxKQotCQluTGVkID0gMzsKLQllbHNlIGlmIChEYm0gPD0gLTY3KQotCQluTGVkID0gNzsKLQllbHNlIGlmIChEYm0gPD0gLTU3KQotCQluTGVkID0gMTU7Ci0JZWxzZQotCQluTGVkID0gMzE7Ci0KLQkvLwotCS8vIFVwZGF0ZSBTaWduYWwgU3RyZWd0aCB0byBmaXJtd2FyZSBpZiBjaGFuZ2VkLgotCS8vCi0JaWYgKHBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCAhPSBuTGVkKQotCXsKLQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUxLCAweGZmLCBuTGVkLCBwQWQtPkxlZENudGwuZmllbGQuUG9sYXJpdHkpOwotCQlwQWQtPkxlZEluZGljYXRvclN0cmVndGggPSBuTGVkOworCQkvKiAqLworCQkvKiBVcGRhdGUgU2lnbmFsIFN0cmVndGggdG8gZmlybXdhcmUgaWYgY2hhbmdlZC4gKi8KKwkJLyogKi8KKwkJaWYgKHBBZC0+TGVkSW5kaWNhdG9yU3RyZW5ndGggIT0gbkxlZCkgeworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUxLCAweGZmLCBuTGVkLAorCQkJCQkgICAgIHBBZC0+TGVkQ250bC5maWVsZC5Qb2xhcml0eSk7CisJCQlwQWQtPkxlZEluZGljYXRvclN0cmVuZ3RoID0gbkxlZDsKKwkJfQogCX0KIH0KIApAQCAtMzk0NCwyOSArMzE2NCwzOTQgQEAKIAkJQmVmb3JlIEVuYWJsZSBSWCwgbWFrZSBzdXJlIHlvdSBoYXZlIGVuYWJsZWQgSW50ZXJydXB0LgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgUlRNUEVuYWJsZVJ4VHgoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUTVBFbmFibGVSeFR4KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKKy8qICAgICAgV1BETUFfR0xPX0NGR19TVFJVQyAgICAgR2xvQ2ZnOyAqLworLyogICAgICB1bnNpZ25lZCBsb25nICAgaSA9IDA7ICovCisJdTMyIHJ4X2ZpbHRlcl9mbGFnOworCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBFbmFibGVSeFR4XG4iKSk7CiAKLQkvLyBFbmFibGUgUnggRE1BLgorCS8qIEVuYWJsZSBSeCBETUEuICovCiAJUlQyOFhYRE1BRW5hYmxlKHBBZCk7CiAKLQkvLyBlbmFibGUgUlggb2YgTUFDIGJsb2NrCi0JaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKLQl7Ci0JCVVJTlQzMiByeF9maWx0ZXJfZmxhZyA9IEFQTk9STUFMOworCS8qIGVuYWJsZSBSWCBvZiBNQUMgYmxvY2sgKi8KKwlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKSB7CisJCXJ4X2ZpbHRlcl9mbGFnID0gQVBOT1JNQUw7CiAKLQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIHJ4X2ZpbHRlcl9mbGFnKTsgICAgIC8vIGVuYWJsZSBSWCBvZiBETUEgYmxvY2sKLQl9Ci0JZWxzZQotCXsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOyAgICAgLy8gU3RhaW9uIG5vdCBkcm9wIGNvbnRyb2wgZnJhbWUgd2lsbCBmYWlsIFdpRmkgQ2VydGlmaWNhdGlvbi4KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCByeF9maWx0ZXJfZmxhZyk7CS8qIGVuYWJsZSBSWCBvZiBETUEgYmxvY2sgKi8KKwl9IGVsc2UgeworCQlpZiAocEFkLT5Db21tb25DZmcuUFNQWGxpbmspCisJCQlyeF9maWx0ZXJfZmxhZyA9IFBTUFhMSU5LOworCQllbHNlCisJCQlyeF9maWx0ZXJfZmxhZyA9IFNUQU5PUk1BTDsJLyogU3RhaW9uIG5vdCBkcm9wIGNvbnRyb2wgZnJhbWUgd2lsbCBmYWlsIFdpRmkgQ2VydGlmaWNhdGlvbi4gKi8KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCByeF9maWx0ZXJfZmxhZyk7CiAJfQogCiAJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweGMpOwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QRW5hYmxlUnhUeFxuIikpOwogfQogCisvKisrK0FkZCBieSBzaGlhbmcsIG1vdmUgZnJvbSBvcy9saW51eC9ydF9tYWluX2Rldi5jICovCit2b2lkIENmZ0luaXRIb29rKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlwQWQtPmJCcm9hZENvbUhUID0gVFJVRTsKK30KIAoraW50IHJ0Mjh4eF9pbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJY2hhciAqcERlZmF1bHRNYWMsIGNoYXIgKnBIb3N0TmFtZSkKK3sKKwl1MzIgaW5kZXg7CisJdTggVG1wUGh5OworCWludCBTdGF0dXM7CisJdTMyIE1hY0NzcjAgPSAwOworCisjaWZkZWYgUlRNUF9NQUNfUENJCisJeworCQkvKiBJZiBkaXJ2ZXIgZG9lc24ndCB3YWtlIHVwIGZpcm13YXJlIGhlcmUsICovCisJCS8qIE5JQ0xvYWRGaXJtd2FyZSB3aWxsIGhhbmcgZm9yZXZlciB3aGVuIGludGVyZmFjZSBpcyB1cCBhZ2Fpbi4gKi8KKwkJLyogUlQyODYwIFBDSSAqLworCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSAmJgorCQkgICAgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpIHsKKwkJCUFVVE9fV0FLRVVQX1NUUlVDIEF1dG9XYWtldXBDZmc7CisJCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKwkJCUF1dG9XYWtldXBDZmcud29yZCA9IDA7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsCisJCQkJCUF1dG9XYWtldXBDZmcud29yZCk7CisJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKworCS8qIHJlc2V0IEFkYXB0ZXIgZmxhZ3MgKi8KKwlSVE1QX0NMRUFSX0ZMQUdTKHBBZCk7CisKKwkvKiBJbml0IEJzc1RhYiAmIENoYW5uZWxJbmZvIHRhYmJsZXMgZm9yIGF1dG8gY2hhbm5lbCBzZWxlY3QuICovCisKKwkvKiBBbGxvY2F0ZSBCQSBSZW9yZGVyaW5nIG1lbW9yeSAqLworCWJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfaW5pdChwQWQsIE1BWF9SRU9SREVSSU5HX01QRFVfTlVNKTsKKworCS8qIE1ha2Ugc3VyZSBNQUMgZ2V0cyByZWFkeS4gKi8KKwlpbmRleCA9IDA7CisJZG8geworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19DU1IwLCAmTWFjQ3NyMCk7CisJCXBBZC0+TUFDVmVyc2lvbiA9IE1hY0NzcjA7CisKKwkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gIT0gMHgwMCkKKwkJICAgICYmIChwQWQtPk1BQ1ZlcnNpb24gIT0gMHhGRkZGRkZGRikpCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDEwKTsKKwl9IHdoaWxlIChpbmRleCsrIDwgMTAwKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiTUFDX0NTUjAgIFsgVmVyOlJldj0weCUwOHhdXG4iLCBwQWQtPk1BQ1ZlcnNpb24pKTsKKworI2lmZGVmIFJUTVBfTUFDX1BDSQorI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAorCS8qSXZlcnNvbiBwYXRjaCBQQ0lFIEwxIGlzc3VlIHRvIG1ha2Ugc3VyZSB0aGF0IGRyaXZlciBjYW4gYmUgcmVhZCx3cml0ZSAsQkJQIGFuZCBSRiByZWdpc3RlciAgYXQgcGNpZSBMLjEgbGV2ZWwgKi8KKwlpZiAoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCSAgICAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkgeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEFVWF9DVFJMLCAmTWFjQ3NyMCk7CisJCU1hY0NzcjAgfD0gMHg0MDI7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVWF9DVFJMLCBNYWNDc3IwKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVYX0NUUkwgPSAweCV4XG4iLCBNYWNDc3IwKSk7CisJfQorI2VuZGlmIC8qIFBDSUVfUFNfU1VQUE9SVCAvLyAqLworCisJLyogVG8gZml4IGRyaXZlciBkaXNhYmxlL2VuYWJsZSBoYW5nIGlzc3VlIHdoZW4gcmFkaW8gb2ZmICovCisJUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDB4Mik7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisKKwkvKiBEaXNhYmxlIERNQSAqLworCVJUMjhYWERNQURpc2FibGUocEFkKTsKKworCS8qIExvYWQgODA1MSBmaXJtd2FyZSAqLworCVN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQlEQkdQUklOVF9FUlIoKCJOSUNMb2FkRmlybXdhcmUgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsCisJCQkgICAgICBTdGF0dXMpKTsKKwkJZ290byBlcnIxOworCX0KKworCU5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKHBBZCk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgaGVyZSB3aGljaCBpcyBhcyBzb29uIGFzIHBvc3NpYmxlICovCisJLyogVGhpcyBzdGF0ZW1lbnQgc2hvdWxkIG5ldmVyIGJlIHRydWUuIFdlIG1pZ2h0IGNvbnNpZGVyIHRvIHJlbW92ZSBpdCBsYXRlciAqLworI2lmZGVmIFJUTVBfTUFDX1BDSQorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSkpIHsKKwkJUlRNUF9BU0lDX0lOVEVSUlVQVF9ESVNBQkxFKHBBZCk7CisJfQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCisJU3RhdHVzID0gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkocEFkKTsKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJREJHUFJJTlRfRVJSKCgiUlRNUEFsbG9jRE1BTWVtb3J5IGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLAorCQkJICAgICAgU3RhdHVzKSk7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKTsKKworCS8qIGluaXRpYWxpemUgTUxNRSAqLworCS8qICovCisKKwlTdGF0dXMgPSBSdG1wTWdtdFRhc2tJbml0KHBBZCk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlnb3RvIGVycjI7CisKKwlTdGF0dXMgPSBNbG1lSW5pdChwQWQpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQlEQkdQUklOVF9FUlIoKCJNbG1lSW5pdCBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7CisJCWdvdG8gZXJyMjsKKwl9CisJLyogSW5pdGlhbGl6ZSBwQWQtPlN0YUNmZywgcEFkLT5BcENmZywgcEFkLT5Db21tb25DZmcgdG8gbWFudWZhY3R1cmUgZGVmYXVsdCAqLworCS8qICovCisJVXNlckNmZ0luaXQocEFkKTsKKwlTdGF0dXMgPSBSdG1wTmV0VGFza0luaXQocEFkKTsKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gZXJyMzsKKworLyogICAgICBDT1BZX01BQ19BRERSKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5Cc3NpZCwgbmV0aWYtPmh3YWRkcik7ICovCisvKiAgICAgIHBBZC0+YkZvcmNlUHJpbnRUWCA9IFRSVUU7ICovCisKKwlDZmdJbml0SG9vayhwQWQpOworCisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKwlNZWFzdXJlUmVxVGFiSW5pdChwQWQpOworCVRwY1JlcVRhYkluaXQocEFkKTsKKworCS8qICovCisJLyogSW5pdCB0aGUgaGFyZHdhcmUsIHdlIG5lZWQgdG8gaW5pdCBhc2ljIGJlZm9yZSByZWFkIHJlZ2lzdHJ5LCBvdGhlcndpc2UgbWFjIHJlZ2lzdGVyIHdpbGwgYmUgcmVzZXQgKi8KKwkvKiAqLworCVN0YXR1cyA9IE5JQ0luaXRpYWxpemVBZGFwdGVyKHBBZCwgVFJVRSk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCURCR1BSSU5UX0VSUigoIk5JQ0luaXRpYWxpemVBZGFwdGVyIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLAorCQkJICAgICAgU3RhdHVzKSk7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCWdvdG8gZXJyMzsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiMS4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOworCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJcEFkLT5Db21tb25DZmcuYk11bHRpcGxlSVJQID0gRkFMU0U7CisKKwlpZiAocEFkLT5Db21tb25DZmcuYk11bHRpcGxlSVJQKQorCQlwQWQtPkNvbW1vbkNmZy5OdW1PZkJ1bGtJbklSUCA9IFJYX1JJTkdfU0laRTsKKwllbHNlCisJCXBBZC0+Q29tbW9uQ2ZnLk51bU9mQnVsa0luSVJQID0gMTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworCS8qSW5pdCBCYSBDYXBhYmlsaXR5IHBhcmFtZXRlcnMuICovCisvKiAgICAgIFJUMjhYWF9CQV9JTklUKHBBZCk7ICovCisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0KKwkgICAgKHU4KXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPQorCSAgICAodTE2KXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplID0KKwkgICAgKHUxNilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMgPQorCSAgICAodTE2KXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKKwkvKiBVUGRhdGEgdG8gSFQgSUUgKi8KKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9CisJICAgICh1MTYpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0KKwkgICAgKHUxNilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPQorCSAgICAodTgpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OworCisJLyogYWZ0ZXIgcmVhZGluZyBSZWdpc3RyeSwgd2Ugbm93IGtub3cgaWYgaW4gQVAgbW9kZSBvciBTVEEgbW9kZSAqLworCisJLyogTG9hZCA4MDUxIGZpcm13YXJlOyBjcmFzaCB3aGVuIEZXIGltYWdlIG5vdCBleGlzdGVudCAqLworCS8qIFN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOyAqLworCS8qIGlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgKi8KKwkvKiAgICBicmVhazsgKi8KKworCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIyLiBQaHkgTW9kZSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7CisKKwkvKiBXZSBzaG91bGQgcmVhZCBFRVBST00gZm9yIGFsbCBjYXNlcy4gIHJ0Mjg2MGIgKi8KKwlOSUNSZWFkRUVQUk9NUGFyYW1ldGVycyhwQWQsICh1OCAqKXBEZWZhdWx0TWFjKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIzLiBQaHkgTW9kZSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7CisKKwlOSUNJbml0QXNpY0Zyb21FRVBST00ocEFkKTsJLypydDI4NjBiICovCisKKwkvKiBTZXQgUEhZIHRvIGFwcHJvcHJpYXRlIG1vZGUgKi8KKwlUbXBQaHkgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOworCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAweGZmOworCVJUTVBTZXRQaHlNb2RlKHBBZCwgVG1wUGh5KTsKKwlTZXRDb21tb25IVChwQWQpOworCisJLyogTm8gdmFsaWQgY2hhbm5lbHMuICovCisJaWYgKHBBZC0+Q2hhbm5lbExpc3ROdW0gPT0gMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIldyb25nIGNvbmZpZ3VyYXRpb24uIE5vIHZhbGlkIGNoYW5uZWwgZm91bmQuIENoZWNrIFwiQ29udHJ5Q29kZVwiIGFuZCBcIkNoYW5uZWxHZW9ncmFwaHlcIiBzZXR0aW5nLlxuIikpOworCQlnb3RvIGVycjQ7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfT0ZGLAorCQkgKCJNQ1MgU2V0ID0gJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0sCisJCSAgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSwKKwkJICBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzJdLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10sCisJCSAgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFs0XSkpOworCisjaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCisJLypJbml0IFJUMzB4eCBSRlJlZ2lzdGVycyBhZnRlciByZWFkIFJGSUMgdHlwZSBmcm9tIEVFUFJPTSAqLworCU5JQ0luaXRSRlJlZ2lzdGVycyhwQWQpOworI2VuZGlmIC8qIFJUTVBfUkZfUldfU1VQUE9SVCAvLyAqLworCisvKiAgICAgICAgICAgICAgQVBJbml0aWFsaXplKHBBZCk7ICovCisKKwkvKiAqLworCS8qIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZSAqLworCS8qICovCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkvKiA4MDUxIGZpcm13YXJlIHJlcXVpcmUgdGhlIHNpZ25hbCBkdXJpbmcgYm9vdGluZyB0aW1lLiAqLworCS8qMjAwOC8xMS8yODpLSCBtYXJrZWQgdGhlIGZvbGxvd2luZyBjb2RlcyB0byBwYXRjaCBGcmVxdWVuY3kgb2Zmc2V0IGJ1ZyAqLworCS8qQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDcyLCAweEZGLCAweDAwLCAweDAwKTsgKi8KKworCWlmIChwQWQgJiYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSkgeworCQkvKiAqLworCQkvKiBVbmRvIGV2ZXJ5dGhpbmcgaWYgaXQgZmFpbGVkICovCisJCS8qICovCisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKy8qICAgICAgICAgICAgICAgICAgICAgIE5kaXNNRGVyZWdpc3RlckludGVycnVwdCgmcEFkLT5JbnRlcnJ1cHQpOyAqLworCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKTsKKwkJfQorLyogICAgICAgICAgICAgIFJUTVBGcmVlQWRhcHRlcihwQWQpOyAvLyB3ZSB3aWxsIGZyZWUgaXQgaW4gZGlzY29ubmVjdCgpICovCisJfSBlbHNlIGlmIChwQWQpIHsKKwkJLyogTWljcm9zb2Z0IEhDVCByZXF1aXJlIGRyaXZlciBzZW5kIGEgZGlzY29ubmVjdCBldmVudCBhZnRlciBkcml2ZXIgaW5pdGlhbGl6YXRpb24uICovCisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisvKiAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsgKi8KKwkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQiFcbiIpKTsKKworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKTsKKwkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpOworCisJCS8qICovCisJCS8qIFN1cHBvcnQgbXVsdGlwbGUgQnVsa0luIElSUCwgKi8KKwkJLyogdGhlIHZhbHVlIG9uIHBBZC0+Q29tbW9uQ2ZnLk51bU9mQnVsa0luSVJQIG1heSBiZSBsYXJnZSB0aGFuIDEuICovCisJCS8qICovCisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBBZC0+Q29tbW9uQ2ZnLk51bU9mQnVsa0luSVJQOyBpbmRleCsrKSB7CisJCQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVFVTQkJ1bGtSZWNlaXZlIVxuIikpOworCQl9CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisJfQkJCS8qIGVuZCBvZiBlbHNlICovCisKKwkvKiBTZXQgdXAgdGhlIE1hYyBhZGRyZXNzICovCisJUnRtcE9TTmV0RGV2QWRkclNldChwQWQtPm5ldF9kZXYsICZwQWQtPkN1cnJlbnRBZGRyZXNzWzBdKTsKKworCURCR1BSSU5UX1MoU3RhdHVzLCAoIjw9PT09IHJ0Mjh4eF9pbml0LCBTdGF0dXM9JXhcbiIsIFN0YXR1cykpOworCisJcmV0dXJuIFRSVUU7CisKK2VycjQ6CitlcnIzOgorCU1sbWVIYWx0KHBBZCk7CitlcnIyOgorCVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkocEFkKTsKK2VycjE6CisKKwlvc19mcmVlX21lbShwQWQsIHBBZC0+bXBkdV9ibGtfcG9vbC5tZW0pOwkvKiBmcmVlIEJBIHBvb2wgKi8KKworCS8qIHNoYWxsIG5vdCBzZXQgcHJpdiB0byBOVUxMIGhlcmUgYmVjYXVzZSB0aGUgcHJpdiBkaWRuJ3QgYmVlbiBmcmVlIHlldC4gKi8KKwkvKm5ldF9kZXYtPm1sX3ByaXYgPSAwOyAqLworI2lmZGVmIFNUCitlcnIwOgorI2VuZGlmIC8qIFNUIC8vICovCisKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJydDI4eHggSW5pdGlhbGl6ZWQgZmFpbCFcbiIpKTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qLS0tQWRkIGJ5IHNoaWFuZywgbW92ZSBmcm9tIG9zL2xpbnV4L3J0X21haW5fZGV2LmMgKi8KKworc3RhdGljIGludCBSdG1wQ2hpcE9wc1JlZ2lzdGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgaW50IGluZlR5cGUpCit7CisJc3RydWN0IHJ0X3J0bXBfY2hpcF9vcCAqcENoaXBPcHMgPSAmcEFkLT5jaGlwT3BzOworCWludCBzdGF0dXM7CisKKwltZW1zZXQocENoaXBPcHMsIDAsIHNpemVvZihzdHJ1Y3QgcnRfcnRtcF9jaGlwX29wKSk7CisKKwkvKiBzZXQgZWVwcm9tIHJlbGF0ZWQgaG9vayBmdW5jdGlvbnMgKi8KKwlzdGF0dXMgPSBSdG1wQ2hpcE9wc0VlcHJvbUhvb2socEFkLCBpbmZUeXBlKTsKKworCS8qIHNldCBtY3UgcmVsYXRlZCBob29rIGZ1bmN0aW9ucyAqLworCXN3aXRjaCAoaW5mVHlwZSkgeworI2lmZGVmIFJUTVBfUENJX1NVUFBPUlQKKwljYXNlIFJUTVBfREVWX0lORl9QQ0k6CisJCXBDaGlwT3BzLT5sb2FkRmlybXdhcmUgPSBSdG1wQXNpY0xvYWRGaXJtd2FyZTsKKwkJcENoaXBPcHMtPmVyYXNlRmlybXdhcmUgPSBSdG1wQXNpY0VyYXNlRmlybXdhcmU7CisJCXBDaGlwT3BzLT5zZW5kQ29tbWFuZFRvTWN1ID0gUnRtcEFzaWNTZW5kQ29tbWFuZFRvTWN1OworCQlicmVhazsKKyNlbmRpZiAvKiBSVE1QX1BDSV9TVVBQT1JUIC8vICovCisjaWZkZWYgUlRNUF9VU0JfU1VQUE9SVAorCWNhc2UgUlRNUF9ERVZfSU5GX1VTQjoKKwkJcENoaXBPcHMtPmxvYWRGaXJtd2FyZSA9IFJ0bXBBc2ljTG9hZEZpcm13YXJlOworCQlwQ2hpcE9wcy0+c2VuZENvbW1hbmRUb01jdSA9IFJ0bXBBc2ljU2VuZENvbW1hbmRUb01jdTsKKwkJYnJlYWs7CisjZW5kaWYgLyogUlRNUF9VU0JfU1VQUE9SVCAvLyAqLworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBSdG1wUmFEZXZDdHJsSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIFJUTVBfSU5GX1RZUEUgaW5mVHlwZSkKK3sKKwkvKnZvaWQgICpoYW5kbGU7ICovCisKKwkvKiBBc3NpZ24gdGhlIGludGVyZmFjZSB0eXBlLiBXZSBuZWVkIHVzZSBpdCB3aGVuIGRvIHJlZ2lzdGVyL0VFUFJPTSBhY2Nlc3MuICovCisJcEFkLT5pbmZUeXBlID0gaW5mVHlwZTsKKworCXBBZC0+T3BNb2RlID0gT1BNT0RFX1NUQTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiU1RBIERyaXZlciB2ZXJzaW9uLSVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04pKTsKKworI2lmZGVmIFJUTVBfTUFDX1VTQgorCWluaXRfTVVURVgoJihwQWQtPlVzYlZlbmRvclJlcV9zZW1hcGhvcmUpKTsKKwlvc19hbGxvY19tZW0ocEFkLCAodTggKiopICYgcEFkLT5Vc2JWZW5kb3JSZXFCdWYsCisJCSAgICAgTUFYX1BBUkFNX0JVRkZFUl9TSVpFIC0gMSk7CisJaWYgKHBBZC0+VXNiVmVuZG9yUmVxQnVmID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJBbGxvY2F0ZSB2ZW5kb3IgcmVxdWVzdCB0ZW1wIGJ1ZmZlciBmYWlsZWQhXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisKKwlSdG1wQ2hpcE9wc1JlZ2lzdGVyKHBBZCwgaW5mVHlwZSk7CisKKwlyZXR1cm4gMDsKK30KKworQk9PTEVBTiBSdG1wUmFEZXZDdHJsRXhpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisKKwlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKKworCXJldHVybiBUUlVFOworfQorCisvKiBub3QgeWV0IHN1cHBvcnQgTUJTUyAqLworc3RydWN0IG5ldF9kZXZpY2UgKmdldF9uZXRkZXZfZnJvbV9ic3NpZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IEZyb21XaGljaEJTU0lEKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXZfcCA9IE5VTEw7CisKKwl7CisJCWRldl9wID0gcEFkLT5uZXRfZGV2OworCX0KKworCUFTU0VSVChkZXZfcCk7CisJcmV0dXJuIGRldl9wOwkJLyogcmV0dXJuIG9uZSBvZiBNQlNTICovCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX21jdS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF9tY3UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjAzOTAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF9tY3UuYwpAQCAtMCwwICsxLDI5MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX21jdS5jCisKKwlBYnN0cmFjdDoKKwlNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisJLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZQkiLi4vcnRfY29uZmlnLmgiCisKKyNpZiBkZWZpbmVkKFJUMjg2MCkgfHwgZGVmaW5lZChSVDMwOTApCisjaW5jbHVkZSAiZmlybXdhcmUuaCIKKyNpbmNsdWRlICIuLi8uLi9ydDMwOTAvZmlybXdhcmUuaCIKKyNlbmRpZgorI2lmZGVmIFJUMjg3MAorI2luY2x1ZGUgIi4uLy4uL3J0MzA3MC9maXJtd2FyZS5oIgorI2luY2x1ZGUgImZpcm13YXJlXzMwNzAuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvYml0cmV2Lmg+CisKKyNpZmRlZiBSVE1QX01BQ19VU0IKKy8qICovCisvKiBSVDI4NzAgRmlybXdhcmUgU3BlYyBvbmx5IHVzZWQgMSBvY3QgZm9yIHZlcnNpb24gZXhwcmVzc2lvbiAqLworLyogKi8KKyNkZWZpbmUgRklSTVdBUkVfTUlOT1JfVkVSU0lPTgk3CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisKKy8qIE5ldyA4ayBieXRlIGZpcm13YXJlIHNpemUgZm9yIFJUMzA3MS9SVDMwNzIgKi8KKyNkZWZpbmUgRklSTVdBUkVJTUFHRV9NQVhfTEVOR1RICTB4MjAwMAorI2RlZmluZSBGSVJNV0FSRUlNQUdFX0xFTkdUSAkJCShzaXplb2YgKEZpcm13YXJlSW1hZ2UpIC8gc2l6ZW9mKHU4KSkKKyNkZWZpbmUgRklSTVdBUkVfTUFKT1JfVkVSU0lPTgkJMAorCisjZGVmaW5lIEZJUk1XQVJFSU1BR0VWMV9MRU5HVEgJCTB4MTAwMAorI2RlZmluZSBGSVJNV0FSRUlNQUdFVjJfTEVOR1RICQkweDEwMDAKKworI2lmZGVmIFJUTVBfTUFDX1BDSQorI2RlZmluZSBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OCQkyCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQllcmFzZSA4MDUxIGZpcm13YXJlIGltYWdlIGluIE1BQyBBU0lDCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJ0bXBBc2ljRXJhc2VGaXJtd2FyZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJdW5zaWduZWQgbG9uZyBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFOyBpICs9IDQpCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBpLCAwKTsKKworCXJldHVybiAwOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJTG9hZCA4MDUxIGZpcm13YXJlIGZpbGUgaW50byBNQUMgQVNJQworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgZmlybXdhcmUgaW1hZ2UgbG9hZCBvaworCQlORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgaW1hZ2Ugbm90IGZvdW5kCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJ0bXBBc2ljTG9hZEZpcm13YXJlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCXU4ICpwRmlybXdhcmVJbWFnZSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBGaWxlTGVuZ3RoLCBJbmRleDsKKwl1MzIgTWFjUmVnID0gMDsKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwl1MzIgVmVyc2lvbiA9IChwQWQtPk1BQ1ZlcnNpb24gPj4gMTYpOworI2VuZGlmCisKKwkvKiBOZXcgOGsgYnl0ZSBmaXJtd2FyZSBzaXplIGZvciBSVDMwNzEvUlQzMDcyICovCisJeworI2lmZGVmIFJUTVBfTUFDX1BDSQorCQlpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpIHsKKwkJCXBGaXJtd2FyZUltYWdlID0gRmlybXdhcmVJbWFnZV8zMDkwOworCQkJRmlsZUxlbmd0aCA9IEZJUk1XQVJFSU1BR0VfTUFYX0xFTkdUSDsKKwkJfSBlbHNlIHsKKwkJCXBGaXJtd2FyZUltYWdlID0gRmlybXdhcmVJbWFnZV8yODYwOworCQkJRmlsZUxlbmd0aCA9IEZJUk1XQVJFSU1BR0VfTUFYX0xFTkdUSDsKKwkJfQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQkvKiB0aGUgZmlybXdhcmUgaW1hZ2UgY29uc2lzdHMgb2YgdHdvIHBhcnRzICovCisJCWlmICgoVmVyc2lvbiAhPSAweDI4NjApICYmIChWZXJzaW9uICE9IDB4Mjg3MikgJiYgKFZlcnNpb24gIT0gMHgzMDcwKSkgewkvKiB1c2UgdGhlIHNlY29uZCBwYXJ0ICovCisJCQkvKnByaW50aygiS0g6VXNlIE5ldyBWZXJzaW9uLHBhcnQyXG4iKTsgKi8KKwkJCXBGaXJtd2FyZUltYWdlID0KKwkJCSAgICAodTggKikmCisJCQkgICAgRmlybXdhcmVJbWFnZV8zMDcwW0ZJUk1XQVJFSU1BR0VWMV9MRU5HVEhdOworCQkJRmlsZUxlbmd0aCA9IEZJUk1XQVJFSU1BR0VWMl9MRU5HVEg7CisJCX0gZWxzZSB7CisJCQkvKnByaW50aygiS0g6VXNlIE5ldyBWZXJzaW9uLHBhcnQxXG4iKTsgKi8KKwkJCWlmIChWZXJzaW9uID09IDB4MzA3MCkKKwkJCQlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2VfMzA3MDsKKwkJCWVsc2UKKwkJCQlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2VfMjg3MDsKKwkJCUZpbGVMZW5ndGggPSBGSVJNV0FSRUlNQUdFVjFfTEVOR1RIOworCQl9CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisJfQorCisJUlRNUF9XUklURV9GSVJNV0FSRShwQWQsIHBGaXJtd2FyZUltYWdlLCBGaWxlTGVuZ3RoKTsKKworCS8qIGNoZWNrIGlmIE1DVSBpcyByZWFkeSAqLworCUluZGV4ID0gMDsKKwlkbyB7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUEJGX1NZU19DVFJMLCAmTWFjUmVnKTsKKworCQlpZiAoTWFjUmVnICYgMHg4MCkKKwkJCWJyZWFrOworCisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJfSB3aGlsZSAoSW5kZXgrKyA8IDEwMDApOworCisJaWYgKEluZGV4ID4gMTAwMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIk5JQ0xvYWRGaXJtd2FyZTogTUNVIGlzIG5vdCByZWFkeVxuIikpOworCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gJXMgKHN0YXR1cz0lZClcbiIsIF9fZnVuY19fLCBTdGF0dXMpKTsKKworCXJldHVybiBTdGF0dXM7Cit9CisKK2ludCBSdG1wQXNpY1NlbmRDb21tYW5kVG9NY3Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1OCBDb21tYW5kLAorCQkJICAgICB1OCBUb2tlbiwgdTggQXJnMCwgdTggQXJnMSkKK3sKKwlIT1NUX0NNRF9DU1JfU1RSVUMgSDJNQ21kOworCUgyTV9NQUlMQk9YX1NUUlVDIEgyTU1haWxib3g7CisJdW5zaWduZWQgbG9uZyBpID0gMDsKKworI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAorCS8qIDMwOTBGIHBvd2VyIHNvbHV0aW9uIDMgaGFzIGh3IGxpbWl0YXRpb24gdGhhdCBuZWVkcyB0byBiYW4gYWxsIG1jdSBjb21tYW5kICovCisJLyogd2hlbiBmaXJtd2FyZSBpcyBpbiByYWRpbyBzdGF0ZS4gIEZvciBvdGhlciBjaGlwIGRvZXNuJ3QgaGF2ZSB0aGlzIGxpbWl0YXRpb24uICovCisJaWYgKCgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCisJICAgICAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKKwkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykKKwkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkgeworCQlSVE1QX1NFTV9MT0NLKCZwQWQtPk1jdUNtZExvY2spOworCQlpZiAoKHBBZC0+YnJ0MzB4eEJhbk1jdUNtZCA9PSBUUlVFKQorCQkgICAgJiYgKENvbW1hbmQgIT0gV0FLRV9NQ1VfQ01EKSAmJiAoQ29tbWFuZCAhPSBSRk9GRl9NQ1VfQ01EKSkgeworCQkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1jdUNtZExvY2spOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiIEJhbiBNY3UgQ21kICV4IGluIHNsZWVwIG1vZGVcbiIsIENvbW1hbmQpKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfSBlbHNlIGlmICgoQ29tbWFuZCA9PSBTTEVFUF9NQ1VfQ01EKQorCQkJICAgfHwgKENvbW1hbmQgPT0gUkZPRkZfTUNVX0NNRCkpIHsKKwkJCXBBZC0+YnJ0MzB4eEJhbk1jdUNtZCA9IFRSVUU7CisJCX0gZWxzZSBpZiAoQ29tbWFuZCAhPSBXQUtFX01DVV9DTUQpIHsKKwkJCXBBZC0+YnJ0MzB4eEJhbk1jdUNtZCA9IEZBTFNFOworCQl9CisKKwkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1jdUNtZExvY2spOworCisJfQorCWlmICgoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCSAgICAgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpCisJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCisJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkKKwkgICAgJiYgKENvbW1hbmQgPT0gV0FLRV9NQ1VfQ01EKSkgeworCisJCWRvIHsKKwkJCVJUTVBfSU9fRk9SQ0VfUkVBRDMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLAorCQkJCQkgICAgICZIMk1NYWlsYm94LndvcmQpOworCQkJaWYgKEgyTU1haWxib3guZmllbGQuT3duZXIgPT0gMCkKKwkJCQlicmVhazsKKworCQkJUlRNUHVzZWNEZWxheSgyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0lORk8sCisJCQkJICgiQXNpY1NlbmRDb21tYW5Ub01jdTo6TWFpbCBib3ggaXMgYnVzeVxuIikpOworCQl9IHdoaWxlIChpKysgPCAxMDApOworCisJCWlmIChpID49IDEwMCkgeworCQkJREJHUFJJTlRfRVJSKCgiSDJNX01BSUxCT1ggc3RpbGwgaG9sZCBieSBNQ1UuIGNvbW1hbmQgZmFpbFxuIikpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisKKwkJSDJNTWFpbGJveC5maWVsZC5Pd25lciA9IDE7CS8qIHBhc3Mgb3duZXJzaGlwIHRvIE1DVSAqLworCQlIMk1NYWlsYm94LmZpZWxkLkNtZFRva2VuID0gVG9rZW47CisJCUgyTU1haWxib3guZmllbGQuSGlnaEJ5dGUgPSBBcmcxOworCQlIMk1NYWlsYm94LmZpZWxkLkxvd0J5dGUgPSBBcmcwOworCQlSVE1QX0lPX0ZPUkNFX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIEgyTU1haWxib3gud29yZCk7CisKKwkJSDJNQ21kLndvcmQgPSAwOworCQlIMk1DbWQuZmllbGQuSG9zdENvbW1hbmQgPSBDb21tYW5kOworCQlSVE1QX0lPX0ZPUkNFX1dSSVRFMzIocEFkLCBIT1NUX0NNRF9DU1IsIEgyTUNtZC53b3JkKTsKKworCX0gZWxzZQorI2VuZGlmIC8qIFBDSUVfUFNfU1VQUE9SVCAvLyAqLworCXsKKwkJZG8geworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsICZIMk1NYWlsYm94LndvcmQpOworCQkJaWYgKEgyTU1haWxib3guZmllbGQuT3duZXIgPT0gMCkKKwkJCQlicmVhazsKKworCQkJUlRNUHVzZWNEZWxheSgyKTsKKwkJfSB3aGlsZSAoaSsrIDwgMTAwKTsKKworCQlpZiAoaSA+IDEwMCkgeworI2lmZGVmIFJUTVBfTUFDX1BDSQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCQkJeworCQkJCURCR1BSSU5UX0VSUigoIkgyTV9NQUlMQk9YIHN0aWxsIGhvbGQgYnkgTUNVLiBjb21tYW5kIGZhaWxcbiIpKTsKKwkJCX0KKwkJCXJldHVybiBGQUxTRTsKKwkJfQorI2lmZGVmIFJUTVBfTUFDX1BDSQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCisJCUgyTU1haWxib3guZmllbGQuT3duZXIgPSAxOwkvKiBwYXNzIG93bmVyc2hpcCB0byBNQ1UgKi8KKwkJSDJNTWFpbGJveC5maWVsZC5DbWRUb2tlbiA9IFRva2VuOworCQlIMk1NYWlsYm94LmZpZWxkLkhpZ2hCeXRlID0gQXJnMTsKKwkJSDJNTWFpbGJveC5maWVsZC5Mb3dCeXRlID0gQXJnMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCBIMk1NYWlsYm94LndvcmQpOworCisJCUgyTUNtZC53b3JkID0gMDsKKwkJSDJNQ21kLmZpZWxkLkhvc3RDb21tYW5kID0gQ29tbWFuZDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSE9TVF9DTURfQ1NSLCBIMk1DbWQud29yZCk7CisKKwkJaWYgKENvbW1hbmQgIT0gMHg4MCkgeworCQl9CisJfQorI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAorCS8qIDMwOTAgTUNVIFdha2V1cCBjb21tYW5kIG5lZWRzIG1vcmUgdGltZSB0byBiZSBzdGFibGUuICovCisJLyogQmVmb3JlIHN0YWJsZSwgZG9uJ3QgaXNzdWUgb3RoZXIgTUNVIGNvbW1hbmQgdG8gcHJldmVudCBmcm9tIGZpcm13YXJlIGVycm9yLiAqLworCWlmICgoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCSAgICAgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpCisJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCisJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkKKwkgICAgJiYgKENvbW1hbmQgPT0gV0FLRV9NQ1VfQ01EKSkgeworCQlSVE1QdXNlY0RlbGF5KDIwMDApOworCQkvKlB1dCB0aGlzIGlzIGFmdGVyIFJGIHByb2dyYW1taW5nLiAqLworCQkvKk5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWN1Q21kTG9jayk7ICovCisJCS8qcEFkLT5icnQzMHh4QmFuTWN1Q21kID0gRkFMU0U7ICovCisJCS8qTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NY3VDbWRMb2NrKTsgKi8KKwl9CisjZW5kaWYgLyogUENJRV9QU19TVVBQT1JUIC8vICovCisKKwlyZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfdGltZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmU0N2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF90aW1lci5jCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIHJ0bXBfdGltZXIuYworCisgICAgQWJzdHJhY3Q6CisgICAgdGFzayBmb3IgdGltZXIgaGFuZGxpbmcKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE5hbWUgICAgICAgICAgRGF0ZSAgICAgICAgICAgIE1vZGlmaWNhdGlvbiBsb2dzCisgICAgU2hpYW5nIFR1CTA4LTI4LTIwMDggICBpbml0IHZlcnNpb24KKworKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitCVUlMRF9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKTsKKy8qQlVJTERfVElNRVJfRlVOQ1RJT04oTWxtZVJzc2lSZXBvcnRFeGVjKTsgKi8KK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEFzaWNSeEFudEV2YWxUaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEFQU0RQZXJpb2RpY0V4ZWMpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQXNpY1JmVHVuaW5nRXhlYyk7CisjaWZkZWYgUlRNUF9NQUNfVVNCCitCVUlMRF9USU1FUl9GVU5DVElPTihCZWFjb25VcGRhdGVFeGVjKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworQlVJTERfVElNRVJfRlVOQ1RJT04oQmVhY29uVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihTY2FuVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihBdXRoVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oUmVhc3NvY1RpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oRGlzYXNzb2NUaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKExpbmtEb3duRXhlYyk7CitCVUlMRF9USU1FUl9GVU5DVElPTihTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKTsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFBzUG9sbFdha2VFeGVjKTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFJhZGlvT25FeGVjKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFJ0bXBVc2JTdGFBc2ljRm9yY2VXYWtldXBUaW1lb3V0KTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworI2lmIGRlZmluZWQoQVBfTEVEKSB8fCBkZWZpbmVkKFNUQV9MRUQpCitleHRlcm4gdm9pZCBMZWRDdHJsTWFpbih2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCQl2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCQl2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CitCVUlMRF9USU1FUl9GVU5DVElPTihMZWRDdHJsTWFpbik7CisjZW5kaWYKKworI2lmZGVmIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUCitzdGF0aWMgdm9pZCBSdG1wVGltZXJRSGFuZGxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKyNpZm5kZWYgS1RIUkVBRF9TVVBQT1JUCisJaW50IHN0YXR1czsKKyNlbmRpZgorCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgKnBUaW1lcjsKKwlzdHJ1Y3QgcnRfcnRtcF90aW1lcl90YXNrX2VudHJ5ICpwRW50cnk7CisJdW5zaWduZWQgbG9uZyBpcnFGbGFnOworCXN0cnVjdCBydF9ydG1wX29zX3Rhc2sgKnBUYXNrOworCisJcFRhc2sgPSAmcEFkLT50aW1lclRhc2s7CisJd2hpbGUgKCFwVGFzay0+dGFza19raWxsZWQpIHsKKwkJcFRpbWVyID0gTlVMTDsKKworI2lmZGVmIEtUSFJFQURfU1VQUE9SVAorCQlSVE1QX1dBSVRfRVZFTlRfSU5URVJSVVBUSUJMRShwQWQsIHBUYXNrKTsKKyNlbHNlCisJCVJUTVBfU0VNX0VWRU5UX1dBSVQoJihwVGFzay0+dGFza1NlbWEpLCBzdGF0dXMpOworI2VuZGlmCisKKwkJaWYgKHBBZC0+VGltZXJRLnN0YXR1cyA9PSBSVE1QX1RBU0tfU1RBVF9TVE9QRUQpCisJCQlicmVhazsKKworCQkvKiBldmVudCBoYXBwZW5lZC4gKi8KKwkJd2hpbGUgKHBBZC0+VGltZXJRLnBRSGVhZCkgeworCQkJUlRNUF9JTlRfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFnKTsKKwkJCXBFbnRyeSA9IHBBZC0+VGltZXJRLnBRSGVhZDsKKwkJCWlmIChwRW50cnkpIHsKKwkJCQlwVGltZXIgPSBwRW50cnktPnBSYVRpbWVyOworCisJCQkJLyogdXBkYXRlIHBRSGVhZCAqLworCQkJCXBBZC0+VGltZXJRLnBRSGVhZCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJaWYgKHBFbnRyeSA9PSBwQWQtPlRpbWVyUS5wUVRhaWwpCisJCQkJCXBBZC0+VGltZXJRLnBRVGFpbCA9IE5VTEw7CisKKwkJCQkvKiByZXR1cm4gdGhpcyBxdWV1ZSBlbnRyeSB0byB0aW1lclFGcmVlTGlzdC4gKi8KKwkJCQlwRW50cnktPnBOZXh0ID0gcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3Q7CisJCQkJcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBwRW50cnk7CisJCQl9CisJCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZyk7CisKKwkJCWlmIChwVGltZXIpIHsKKwkJCQlpZiAoKHBUaW1lci0+aGFuZGxlICE9IE5VTEwpCisJCQkJICAgICYmICghcEFkLT5QTV9GbGdTdXNwZW5kKSkKKwkJCQkJcFRpbWVyLT5oYW5kbGUoTlVMTCwKKwkJCQkJCSAgICAgICAodm9pZCAqKXBUaW1lci0+Y29va2llLAorCQkJCQkJICAgICAgIE5VTEwsIHBUaW1lcik7CisJCQkJaWYgKChwVGltZXItPlJlcGVhdCkKKwkJCQkgICAgJiYgKHBUaW1lci0+U3RhdGUgPT0gRkFMU0UpKQorCQkJCQlSVE1QX09TX0FkZF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwKKwkJCQkJCQkgIHBUaW1lci0+VGltZXJWYWx1ZSk7CisJCQl9CisJCX0KKworI2lmbmRlZiBLVEhSRUFEX1NVUFBPUlQKKwkJaWYgKHN0YXR1cyAhPSAwKSB7CisJCQlwQWQtPlRpbWVyUS5zdGF0dXMgPSBSVE1QX1RBU0tfU1RBVF9TVE9QRUQ7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwl9Cit9CisKK2ludCBSdG1wVGltZXJRVGhyZWFkKElOIHZvaWQgKkNvbnRleHQpCit7CisJc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqcFRhc2s7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCisJcFRhc2sgPSAoc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqKUNvbnRleHQ7CisJcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilwVGFzay0+cHJpdjsKKworCVJ0bXBPU1Rhc2tDdXN0b21pemUocFRhc2spOworCisJUnRtcFRpbWVyUUhhbmRsZShwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLSVzXG4iLCBfX2Z1bmNfXykpOworI2lmbmRlZiBLVEhSRUFEX1NVUFBPUlQKKwlwVGFzay0+dGFza1BJRCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKyNlbmRpZgorCS8qIG5vdGlmeSB0aGUgZXhpdCByb3V0aW5lIHRoYXQgd2UncmUgYWN0dWFsbHkgZXhpdGluZyBub3cKKwkgKgorCSAqIGNvbXBsZXRlKCkvd2FpdF9mb3JfY29tcGxldGlvbigpIGlzIHNpbWlsYXIgdG8gdXAoKS9kb3duKCksCisJICogZXhjZXB0IHRoYXQgY29tcGxldGUoKSBpcyBzYWZlIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBzdHJ1Y3R1cmUKKwkgKiBpcyBnZXR0aW5nIGRlbGV0ZWQgaW4gYSBwYXJhbGxlbCBtb2RlIG9mIGV4ZWN1dGlvbiAoaS5lLiBqdXN0CisJICogYWZ0ZXIgdGhlIGRvd24oKSAtLSB0aGF0J3MgbmVjZXNzYXJ5IGZvciB0aGUgdGhyZWFkLXNodXRkb3duCisJICogY2FzZS4KKwkgKgorCSAqIGNvbXBsZXRlX2FuZF9leGl0KCkgZ29lcyBldmVuIGZ1cnRoZXIgdGhhbiB0aGlzIC0tIGl0IGlzIHNhZmUgaW4KKwkgKiB0aGUgY2FzZSB0aGF0IHRoZSB0aHJlYWQgb2YgdGhlIGNhbGxlciBpcyBnb2luZyBhd2F5IChub3QganVzdAorCSAqIHRoZSBzdHJ1Y3R1cmUpIC0tIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciB0aGUgbW9kdWxlLXJlbW92ZSBjYXNlLgorCSAqIFRoaXMgaXMgaW1wb3J0YW50IGluIHByZWVtcHRpb24ga2VybmVscywgd2hpY2ggdHJhbnNmZXIgdGhlIGZsb3cKKwkgKiBvZiBleGVjdXRpb24gaW1tZWRpYXRlbHkgdXBvbiBhIGNvbXBsZXRlKCkuCisJICovCisJUnRtcE9TVGFza05vdGlmeVRvRXhpdChwVGFzayk7CisKKwlyZXR1cm4gMDsKKworfQorCitzdHJ1Y3QgcnRfcnRtcF90aW1lcl90YXNrX2VudHJ5ICpSdG1wVGltZXJRSW5zZXJ0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJc3RydWN0IHJ0X3JhbGlua190aW1lciAqcFRpbWVyKQoreworCXN0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfZW50cnkgKnBRTm9kZSA9IE5VTEwsICpwUVRhaWw7CisJdW5zaWduZWQgbG9uZyBpcnFGbGFnczsKKwlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzayA9ICZwQWQtPnRpbWVyVGFzazsKKworCVJUTVBfSU5UX0xPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOworCWlmIChwQWQtPlRpbWVyUS5zdGF0dXMgJiBSVE1QX1RBU0tfQ0FOX0RPX0lOU0VSVCkgeworCQlpZiAocEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QpIHsKKwkJCXBRTm9kZSA9IHBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0OworCQkJcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBwUU5vZGUtPnBOZXh0OworCisJCQlwUU5vZGUtPnBSYVRpbWVyID0gcFRpbWVyOworCQkJcFFOb2RlLT5wTmV4dCA9IE5VTEw7CisKKwkJCXBRVGFpbCA9IHBBZC0+VGltZXJRLnBRVGFpbDsKKwkJCWlmIChwQWQtPlRpbWVyUS5wUVRhaWwgIT0gTlVMTCkKKwkJCQlwUVRhaWwtPnBOZXh0ID0gcFFOb2RlOworCQkJcEFkLT5UaW1lclEucFFUYWlsID0gcFFOb2RlOworCQkJaWYgKHBBZC0+VGltZXJRLnBRSGVhZCA9PSBOVUxMKQorCQkJCXBBZC0+VGltZXJRLnBRSGVhZCA9IHBRTm9kZTsKKwkJfQorCX0KKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOworCisJaWYgKHBRTm9kZSkgeworI2lmZGVmIEtUSFJFQURfU1VQUE9SVAorCQlXQUtFX1VQKHBUYXNrKTsKKyNlbHNlCisJCVJUTVBfU0VNX0VWRU5UX1VQKCZwVGFzay0+dGFza1NlbWEpOworI2VuZGlmCisJfQorCisJcmV0dXJuIHBRTm9kZTsKK30KKworQk9PTEVBTiBSdG1wVGltZXJRUmVtb3ZlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3JhbGlua190aW1lciAqcFRpbWVyKQoreworCXN0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfZW50cnkgKnBOb2RlLCAqcFByZXYgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKKwlpZiAocEFkLT5UaW1lclEuc3RhdHVzID49IFJUTVBfVEFTS19TVEFUX0lOSVRFRCkgeworCQlwTm9kZSA9IHBBZC0+VGltZXJRLnBRSGVhZDsKKwkJd2hpbGUgKHBOb2RlKSB7CisJCQlpZiAocE5vZGUtPnBSYVRpbWVyID09IHBUaW1lcikKKwkJCQlicmVhazsKKwkJCXBQcmV2ID0gcE5vZGU7CisJCQlwTm9kZSA9IHBOb2RlLT5wTmV4dDsKKwkJfQorCisJCS8qIE5vdyBtb3ZlIGl0IHRvIGZyZWVMaXN0IHF1ZXVlLiAqLworCQlpZiAocE5vZGUpIHsKKwkJCWlmIChwTm9kZSA9PSBwQWQtPlRpbWVyUS5wUUhlYWQpCisJCQkJcEFkLT5UaW1lclEucFFIZWFkID0gcE5vZGUtPnBOZXh0OworCQkJaWYgKHBOb2RlID09IHBBZC0+VGltZXJRLnBRVGFpbCkKKwkJCQlwQWQtPlRpbWVyUS5wUVRhaWwgPSBwUHJldjsKKwkJCWlmIChwUHJldiAhPSBOVUxMKQorCQkJCXBQcmV2LT5wTmV4dCA9IHBOb2RlLT5wTmV4dDsKKworCQkJLyogcmV0dXJuIHRoaXMgcXVldWUgZW50cnkgdG8gdGltZXJRRnJlZUxpc3QuICovCisJCQlwTm9kZS0+cE5leHQgPSBwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdDsKKwkJCXBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0ID0gcE5vZGU7CisJCX0KKwl9CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKKworCXJldHVybiBUUlVFOworfQorCit2b2lkIFJ0bXBUaW1lclFFeGl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF90aW1lcl90YXNrX2VudHJ5ICpwVGltZXJROworCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKKwl3aGlsZSAocEFkLT5UaW1lclEucFFIZWFkKSB7CisJCXBUaW1lclEgPSBwQWQtPlRpbWVyUS5wUUhlYWQ7CisJCXBBZC0+VGltZXJRLnBRSGVhZCA9IHBUaW1lclEtPnBOZXh0OworCQkvKiByZW1vdmUgdGhlIHRpbWVRICovCisJfQorCXBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0ID0gTlVMTDsKKwlvc19mcmVlX21lbShwQWQsIHBBZC0+VGltZXJRLnBUaW1lclFQb2xsKTsKKwlwQWQtPlRpbWVyUS5wUVRhaWwgPSBOVUxMOworCXBBZC0+VGltZXJRLnBRSGVhZCA9IE5VTEw7CisjaWZuZGVmIEtUSFJFQURfU1VQUE9SVAorCXBBZC0+VGltZXJRLnN0YXR1cyA9IFJUTVBfVEFTS19TVEFUX1NUT1BFRDsKKyNlbmRpZgorCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7CisKK30KKwordm9pZCBSdG1wVGltZXJRSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJaW50IGk7CisJc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19lbnRyeSAqcFFOb2RlLCAqcEVudHJ5OworCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7CisKKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5UaW1lclFMb2NrKTsKKworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlRpbWVyUSwgc2l6ZW9mKHBBZC0+VGltZXJRKSk7CisKKwlvc19hbGxvY19tZW0ocEFkLCAmcEFkLT5UaW1lclEucFRpbWVyUVBvbGwsCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfZW50cnkpICogVElNRVJfUVVFVUVfU0laRV9NQVgpOworCWlmIChwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCkgeworCQlwRW50cnkgPSBOVUxMOworCQlwUU5vZGUgPSAoc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19lbnRyeSAqKXBBZC0+VGltZXJRLnBUaW1lclFQb2xsOworCQlOZGlzWmVyb01lbW9yeShwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19lbnRyeSkgKgorCQkJICAgICAgIFRJTUVSX1FVRVVFX1NJWkVfTUFYKTsKKworCQlSVE1QX0lOVF9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKKwkJZm9yIChpID0gMDsgaSA8IFRJTUVSX1FVRVVFX1NJWkVfTUFYOyBpKyspIHsKKwkJCXBRTm9kZS0+cE5leHQgPSBwRW50cnk7CisJCQlwRW50cnkgPSBwUU5vZGU7CisJCQlwUU5vZGUrKzsKKwkJfQorCQlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IHBFbnRyeTsKKwkJcEFkLT5UaW1lclEucFFIZWFkID0gTlVMTDsKKwkJcEFkLT5UaW1lclEucFFUYWlsID0gTlVMTDsKKwkJcEFkLT5UaW1lclEuc3RhdHVzID0gUlRNUF9UQVNLX1NUQVRfSU5JVEVEOworCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOworCX0KK30KKyNlbmRpZiAvKiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF90a2lwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX3RraXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE3ZmRhNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX3RraXAuYworKysgL2Rldi9udWxsCkBAIC0xLDE1ODYgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlydG1wX3RraXAuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVBhdWwgV3UJCTAyLTI1LTAyCQlJbml0aWFsCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLS8vIFJvdGF0aW9uIGZ1bmN0aW9ucyBvbiAzMiBiaXQgdmFsdWVzCi0jZGVmaW5lIFJPTDMyKCBBLCBuICkgXAotCSggKChBKSA8PCAobikpIHwgKCAoKEEpPj4oMzItKG4pKSkgJiAoICgxVUwgPDwgKG4pKSAtIDEgKSApICkKLSNkZWZpbmUgUk9SMzIoIEEsIG4gKSBST0wzMiggKEEpLCAzMi0obikgKQotCi1VSU5UIFRraXBfU2JveF9Mb3dlclsyNTZdID0KLXsKLQkweEE1LDB4ODQsMHg5OSwweDhELDB4MEQsMHhCRCwweEIxLDB4NTQsCi0JMHg1MCwweDAzLDB4QTksMHg3RCwweDE5LDB4NjIsMHhFNiwweDlBLAotCTB4NDUsMHg5RCwweDQwLDB4ODcsMHgxNSwweEVCLDB4QzksMHgwQiwKLQkweEVDLDB4NjcsMHhGRCwweEVBLDB4QkYsMHhGNywweDk2LDB4NUIsCi0JMHhDMiwweDFDLDB4QUUsMHg2QSwweDVBLDB4NDEsMHgwMiwweDRGLAotCTB4NUMsMHhGNCwweDM0LDB4MDgsMHg5MywweDczLDB4NTMsMHgzRiwKLQkweDBDLDB4NTIsMHg2NSwweDVFLDB4MjgsMHhBMSwweDBGLDB4QjUsCi0JMHgwOSwweDM2LDB4OUIsMHgzRCwweDI2LDB4NjksMHhDRCwweDlGLAotCTB4MUIsMHg5RSwweDc0LDB4MkUsMHgyRCwweEIyLDB4RUUsMHhGQiwKLQkweEY2LDB4NEQsMHg2MSwweENFLDB4N0IsMHgzRSwweDcxLDB4OTcsCi0JMHhGNSwweDY4LDB4MDAsMHgyQywweDYwLDB4MUYsMHhDOCwweEVELAotCTB4QkUsMHg0NiwweEQ5LDB4NEIsMHhERSwweEQ0LDB4RTgsMHg0QSwKLQkweDZCLDB4MkEsMHhFNSwweDE2LDB4QzUsMHhENywweDU1LDB4OTQsCi0JMHhDRiwweDEwLDB4MDYsMHg4MSwweEYwLDB4NDQsMHhCQSwweEUzLAotCTB4RjMsMHhGRSwweEMwLDB4OEEsMHhBRCwweEJDLDB4NDgsMHgwNCwKLQkweERGLDB4QzEsMHg3NSwweDYzLDB4MzAsMHgxQSwweDBFLDB4NkQsCi0JMHg0QywweDE0LDB4MzUsMHgyRiwweEUxLDB4QTIsMHhDQywweDM5LAotCTB4NTcsMHhGMiwweDgyLDB4NDcsMHhBQywweEU3LDB4MkIsMHg5NSwKLQkweEEwLDB4OTgsMHhEMSwweDdGLDB4NjYsMHg3RSwweEFCLDB4ODMsCi0JMHhDQSwweDI5LDB4RDMsMHgzQywweDc5LDB4RTIsMHgxRCwweDc2LAotCTB4M0IsMHg1NiwweDRFLDB4MUUsMHhEQiwweDBBLDB4NkMsMHhFNCwKLQkweDVELDB4NkUsMHhFRiwweEE2LDB4QTgsMHhBNCwweDM3LDB4OEIsCi0JMHgzMiwweDQzLDB4NTksMHhCNywweDhDLDB4NjQsMHhEMiwweEUwLAotCTB4QjQsMHhGQSwweDA3LDB4MjUsMHhBRiwweDhFLDB4RTksMHgxOCwKLQkweEQ1LDB4ODgsMHg2RiwweDcyLDB4MjQsMHhGMSwweEM3LDB4NTEsCi0JMHgyMywweDdDLDB4OUMsMHgyMSwweERELDB4REMsMHg4NiwweDg1LAotCTB4OTAsMHg0MiwweEM0LDB4QUEsMHhEOCwweDA1LDB4MDEsMHgxMiwKLQkweEEzLDB4NUYsMHhGOSwweEQwLDB4OTEsMHg1OCwweDI3LDB4QjksCi0JMHgzOCwweDEzLDB4QjMsMHgzMywweEJCLDB4NzAsMHg4OSwweEE3LAotCTB4QjYsMHgyMiwweDkyLDB4MjAsMHg0OSwweEZGLDB4NzgsMHg3QSwKLQkweDhGLDB4RjgsMHg4MCwweDE3LDB4REEsMHgzMSwweEM2LDB4QjgsCi0JMHhDMywweEIwLDB4NzcsMHgxMSwweENCLDB4RkMsMHhENiwweDNBCi19OwotCi1VSU5UIFRraXBfU2JveF9VcHBlclsyNTZdID0KLXsKLQkweEM2LDB4RjgsMHhFRSwweEY2LDB4RkYsMHhENiwweERFLDB4OTEsCi0JMHg2MCwweDAyLDB4Q0UsMHg1NiwweEU3LDB4QjUsMHg0RCwweEVDLAotCTB4OEYsMHgxRiwweDg5LDB4RkEsMHhFRiwweEIyLDB4OEUsMHhGQiwKLQkweDQxLDB4QjMsMHg1RiwweDQ1LDB4MjMsMHg1MywweEU0LDB4OUIsCi0JMHg3NSwweEUxLDB4M0QsMHg0QywweDZDLDB4N0UsMHhGNSwweDgzLAotCTB4NjgsMHg1MSwweEQxLDB4RjksMHhFMiwweEFCLDB4NjIsMHgyQSwKLQkweDA4LDB4OTUsMHg0NiwweDlELDB4MzAsMHgzNywweDBBLDB4MkYsCi0JMHgwRSwweDI0LDB4MUIsMHhERiwweENELDB4NEUsMHg3RiwweEVBLAotCTB4MTIsMHgxRCwweDU4LDB4MzQsMHgzNiwweERDLDB4QjQsMHg1QiwKLQkweEE0LDB4NzYsMHhCNywweDdELDB4NTIsMHhERCwweDVFLDB4MTMsCi0JMHhBNiwweEI5LDB4MDAsMHhDMSwweDQwLDB4RTMsMHg3OSwweEI2LAotCTB4RDQsMHg4RCwweDY3LDB4NzIsMHg5NCwweDk4LDB4QjAsMHg4NSwKLQkweEJCLDB4QzUsMHg0RiwweEVELDB4ODYsMHg5QSwweDY2LDB4MTEsCi0JMHg4QSwweEU5LDB4MDQsMHhGRSwweEEwLDB4NzgsMHgyNSwweDRCLAotCTB4QTIsMHg1RCwweDgwLDB4MDUsMHgzRiwweDIxLDB4NzAsMHhGMSwKLQkweDYzLDB4NzcsMHhBRiwweDQyLDB4MjAsMHhFNSwweEZELDB4QkYsCi0JMHg4MSwweDE4LDB4MjYsMHhDMywweEJFLDB4MzUsMHg4OCwweDJFLAotCTB4OTMsMHg1NSwweEZDLDB4N0EsMHhDOCwweEJBLDB4MzIsMHhFNiwKLQkweEMwLDB4MTksMHg5RSwweEEzLDB4NDQsMHg1NCwweDNCLDB4MEIsCi0JMHg4QywweEM3LDB4NkIsMHgyOCwweEE3LDB4QkMsMHgxNiwweEFELAotCTB4REIsMHg2NCwweDc0LDB4MTQsMHg5MiwweDBDLDB4NDgsMHhCOCwKLQkweDlGLDB4QkQsMHg0MywweEM0LDB4MzksMHgzMSwweEQzLDB4RjIsCi0JMHhENSwweDhCLDB4NkUsMHhEQSwweDAxLDB4QjEsMHg5QywweDQ5LAotCTB4RDgsMHhBQywweEYzLDB4Q0YsMHhDQSwweEY0LDB4NDcsMHgxMCwKLQkweDZGLDB4RjAsMHg0QSwweDVDLDB4MzgsMHg1NywweDczLDB4OTcsCi0JMHhDQiwweEExLDB4RTgsMHgzRSwweDk2LDB4NjEsMHgwRCwweDBGLAotCTB4RTAsMHg3QywweDcxLDB4Q0MsMHg5MCwweDA2LDB4RjcsMHgxQywKLQkweEMyLDB4NkEsMHhBRSwweDY5LDB4MTcsMHg5OSwweDNBLDB4MjcsCi0JMHhEOSwweEVCLDB4MkIsMHgyMiwweEQyLDB4QTksMHgwNywweDMzLAotCTB4MkQsMHgzQywweDE1LDB4QzksMHg4NywweEFBLDB4NTAsMHhBNSwKLQkweDAzLDB4NTksMHgwOSwweDFBLDB4NjUsMHhENywweDg0LDB4RDAsCi0JMHg4MiwweDI5LDB4NUEsMHgxRSwweDdCLDB4QTgsMHg2RCwweDJDCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKiogU0JPWCBUYWJsZSAqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVVDSEFSIFNib3hUYWJsZVsyNTZdID0KLXsKLQkweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1LAotCTB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsCi0JMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwKLQkweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwLAotCTB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MsCi0JMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSwKLQkweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhLAotCTB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUsCi0JMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCwKLQkweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0LAotCTB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIsCi0JMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZiwKLQkweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1LAotCTB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgsCi0JMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSwKLQkweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyLAotCTB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcsCi0JMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MywKLQkweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4LAotCTB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIsCi0JMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YywKLQkweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5LAotCTB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTksCi0JMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCwKLQkweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2LAotCTB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEsCi0JMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSwKLQkweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllLAotCTB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQsCi0JMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZiwKLQkweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4LAotCTB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYKLX07Ci0KLVZPSUQgeG9yXzMyKAotCUlOICBQVUNIQVIgICAgICAgICAgICAgIGEsCi0JSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYiwKLQlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOwotCi1WT0lEIHhvcl8xMjgoCi0JSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYSwKLQlJTiAgUFVDSEFSICAgICAgICAgICAgICBiLAotCU9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7Ci0KLVZPSUQgbmV4dF9rZXkoCi0JSU4gIFBVQ0hBUiAgICAgICAgICAgICAga2V5LAotCUlOICBJTlQgICAgICAgICAgICAgICAgIHJvdW5kKTsKLQotVk9JRCBieXRlX3N1YigKLQlJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKLQlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOwotCi1WT0lEIHNoaWZ0X3JvdygKLQlJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKLQlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOwotCi1WT0lEIG1peF9jb2x1bW4oCi0JSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCi0JT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKLQotVUNIQVIgUlRNUENraXBTYm94KAotCUlOICBVQ0hBUiAgICAgICAgICAgICAgIGEpOwotLy8KLS8vIEV4cGFuZGVkIElWIGZvciBUS0lQIGZ1bmN0aW9uLgotLy8KLXR5cGVkZWYJc3RydWN0CVBBQ0tFRCBfSVZfQ09OVFJPTF8KLXsKLQl1bmlvbiBQQUNLRUQKLQl7Ci0JCXN0cnVjdCBQQUNLRUQKLQkJewotCQkJVUNIQVIJCXJjMDsKLQkJCVVDSEFSCQlyYzE7Ci0JCQlVQ0hBUgkJcmMyOwotCi0JCQl1bmlvbiBQQUNLRUQKLQkJCXsKLQkJCQlzdHJ1Y3QgUEFDS0VECi0JCQkJewotCQkJCQlVQ0hBUglSc3ZkOjU7Ci0JCQkJCVVDSEFSCUV4dElWOjE7Ci0JCQkJCVVDSEFSCUtleUlEOjI7Ci0JCQkJfQlmaWVsZDsKLQkJCQlVQ0hBUgkJQnl0ZTsKLQkJCX0JQ09OVFJPTDsKLQkJfQlmaWVsZDsKLQotCQlVTE9ORwl3b3JkOwotCX0JSVYxNjsKLQotCVVMT05HCUlWMzI7Ci19CVRLSVBfSVYsICpQVEtJUF9JVjsKLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJQ29udmVydCBmcm9tIFVDSEFSW10gdG8gVUxPTkcgaW4gYSBwb3J0YWJsZSB3YXkKLQotCUFyZ3VtZW50czoKLSAgICAgIHBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUxPTkcJUlRNUFRraXBHZXRVSW50MzIoCi0JSU4JUFVDSEFSCXBNSUNLZXkpCi17Ci0JVUxPTkcJcmVzID0gMDsKLQlJTlQJCWk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCXsKLQkJcmVzIHw9ICgqcE1JQ0tleSsrKSA8PCAoOCAqIGkpOwotCX0KLQotCXJldHVybiByZXM7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDb252ZXJ0IGZyb20gVUxPTkcgdG8gVUNIQVJbXSBpbiBhIHBvcnRhYmxlIHdheQotCi0JQXJndW1lbnRzOgotICAgICAgcERzdAkJCXBvaW50ZXIgdG8gZGVzdGluYXRpb24gZm9yIGNvbnZlcnQgVUxPTkcgdG8gVUNIQVJbXQotICAgICAgdmFsCQkJdGhlIHZhbHVlIGZvciBjb252ZXJ0Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFRraXBQdXRVSW50MzIoCi0JSU4gT1VUCVBVQ0hBUgkJcERzdCwKLQlJTgkJVUxPTkcJCXZhbCkKLXsKLQlJTlQgaTsKLQotCWZvcihpID0gMDsgaSA8IDQ7IGkrKykKLQl7Ci0JCSpwRHN0KysgPSAoVUNIQVIpICh2YWwgJiAweGZmKTsKLQkJdmFsID4+PSA4OwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCVNldCB0aGUgTUlDIEtleS4KLQotCUFyZ3VtZW50czoKLSAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotICAgICAgcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUFRraXBTZXRNSUNLZXkoCi0JSU4JUFRLSVBfS0VZX0lORk8JcFRraXAsCi0JSU4JUFVDSEFSCQkJcE1JQ0tleSkKLXsKLQkvLyBTZXQgdGhlIGtleQotCXBUa2lwLT5LMCA9IFJUTVBUa2lwR2V0VUludDMyKHBNSUNLZXkpOwotCXBUa2lwLT5LMSA9IFJUTVBUa2lwR2V0VUludDMyKHBNSUNLZXkgKyA0KTsKLQkvLyBhbmQgcmVzZXQgdGhlIG1lc3NhZ2UKLQlwVGtpcC0+TCA9IHBUa2lwLT5LMDsKLQlwVGtpcC0+UiA9IHBUa2lwLT5LMTsKLQlwVGtpcC0+bkJ5dGVzSW5NID0gMDsKLQlwVGtpcC0+TSA9IDA7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDYWxjdWxhdGUgdGhlIE1JQyBWYWx1ZS4KLQotCUFyZ3VtZW50czoKLSAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotICAgICAgdUNoYXIJCQlBcHBlbmQgdGhpcyB1Q2hhcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBUa2lwQXBwZW5kQnl0ZSgKLQlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKLQlJTglVQ0hBUiAJCQl1Q2hhcikKLXsKLQkvLyBBcHBlbmQgdGhlIGJ5dGUgdG8gb3VyIHdvcmQtc2l6ZWQgYnVmZmVyCi0JcFRraXAtPk0gfD0gKHVDaGFyIDw8ICg4KiBwVGtpcC0+bkJ5dGVzSW5NKSk7Ci0JcFRraXAtPm5CeXRlc0luTSsrOwotCS8vIFByb2Nlc3MgdGhlIHdvcmQgaWYgaXQgaXMgZnVsbC4KLQlpZiggcFRraXAtPm5CeXRlc0luTSA+PSA0ICkKLQl7Ci0JCXBUa2lwLT5MIF49IHBUa2lwLT5NOwotCQlwVGtpcC0+UiBePSBST0wzMiggcFRraXAtPkwsIDE3ICk7Ci0JCXBUa2lwLT5MICs9IHBUa2lwLT5SOwotCQlwVGtpcC0+UiBePSAoKHBUa2lwLT5MICYgMHhmZjAwZmYwMCkgPj4gOCkgfCAoKHBUa2lwLT5MICYgMHgwMGZmMDBmZikgPDwgOCk7Ci0JCXBUa2lwLT5MICs9IHBUa2lwLT5SOwotCQlwVGtpcC0+UiBePSBST0wzMiggcFRraXAtPkwsIDMgKTsKLQkJcFRraXAtPkwgKz0gcFRraXAtPlI7Ci0JCXBUa2lwLT5SIF49IFJPUjMyKCBwVGtpcC0+TCwgMiApOwotCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKLQkJLy8gQ2xlYXIgdGhlIGJ1ZmZlcgotCQlwVGtpcC0+TSA9IDA7Ci0JCXBUa2lwLT5uQnl0ZXNJbk0gPSAwOwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUNhbGN1bGF0ZSB0aGUgTUlDIFZhbHVlLgotCi0JQXJndW1lbnRzOgotICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgICBwU3JjCQkJUG9pbnRlciB0byBzb3VyY2UgZGF0YSBmb3IgQ2FsY3VsYXRlIE1JQyBWYWx1ZQotICAgICAgTGVuCQkJSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlIGRhdGEKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QVGtpcEFwcGVuZCgKLQlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKLQlJTglQVUNIQVIJCQlwU3JjLAotCUlOCVVJTlQJCQluQnl0ZXMpCi17Ci0JLy8gVGhpcyBpcyBzaW1wbGUKLQl3aGlsZShuQnl0ZXMgPiAwKQotCXsKLQkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAqcFNyYysrKTsKLQkJbkJ5dGVzLS07Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJR2V0IHRoZSBNSUMgVmFsdWUuCi0KLQlBcmd1bWVudHM6Ci0gICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCQl0aGUgTUlDIFZhbHVlIGlzIHN0b3JlIGluIHBBZC0+UHJpdmF0ZUluZm8uTUlDCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QVGtpcEdldE1JQygKLQlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCkKLXsKLQkvLyBBcHBlbmQgdGhlIG1pbmltdW0gcGFkZGluZwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMHg1YSApOwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOwotCS8vIGFuZCB0aGVuIHplcm9lcyB1bnRpbCB0aGUgbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgNAotCXdoaWxlKCBwVGtpcC0+bkJ5dGVzSW5NICE9IDAgKQotCXsKLQkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7Ci0JfQotCS8vIFRoZSBhcHBlbmRCeXRlIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGNvbXB1dGVkIHRoZSByZXN1bHQuCi0JUlRNUFRraXBQdXRVSW50MzIocFRraXAtPk1JQywgcFRraXAtPkwpOwotCVJUTVBUa2lwUHV0VUludDMyKHBUa2lwLT5NSUMgKyA0LCBwVGtpcC0+Uik7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlJbml0IFRraXAgZnVuY3Rpb24uCi0KLQlBcmd1bWVudHM6Ci0gICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCi0JCUtleUlkCQlUSyBLZXkgSUQKLQkJcFRBCQkJUG9pbnRlciB0byB0cmFuc21pdHRlciBhZGRyZXNzCi0JCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBJbml0VGtpcEVuZ2luZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwS2V5LAotCUlOCVVDSEFSCQkJS2V5SWQsCi0JSU4JUFVDSEFSCQkJcFRBLAotCUlOCVBVQ0hBUgkJCXBNSUNLZXksCi0JSU4JUFVDSEFSCQkJcFRTQywKLQlPVVQJUFVMT05HCQkJcElWMTYsCi0JT1VUCVBVTE9ORwkJCXBJVjMyKQotewotCVRLSVBfSVYJdGtpcEl2OwotCi0JLy8gUHJlcGFyZSA4IGJ5dGVzIFRLSVAgZW5jYXBzdWxhdGlvbiBmb3IgTVBEVQotCU5kaXNaZXJvTWVtb3J5KCZ0a2lwSXYsIHNpemVvZihUS0lQX0lWKSk7Ci0JdGtpcEl2LklWMTYuZmllbGQucmMwID0gKihwVFNDICsgMSk7Ci0JdGtpcEl2LklWMTYuZmllbGQucmMxID0gKHRraXBJdi5JVjE2LmZpZWxkLnJjMCB8IDB4MjApICYgMHg3ZjsKLQl0a2lwSXYuSVYxNi5maWVsZC5yYzIgPSAqcFRTQzsKLQl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLkV4dElWID0gMTsgIC8vIDA6IG5vbi1leHRlbmRlZCBJViwgMTogYW4gZXh0ZW5kZWQgSVYKLQl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLktleUlEID0gS2V5SWQ7Ci0JTmRpc01vdmVNZW1vcnkoJnRraXBJdi5JVjMyLCAocFRTQyArIDIpLCA0KTsgICAvLyBDb3B5IElWCi0KLQkqcElWMTYgPSB0a2lwSXYuSVYxNi53b3JkOwotCSpwSVYzMiA9IHRraXBJdi5JVjMyOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJSW5pdCBNSUMgVmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24gd2hpY2ggaW5jbHVkZSBzZXQgTUlDIGtleSAmCi0JCWNhbGN1bGF0ZSBmaXJzdCAxNiBieXRlcyAoREEgKyBTQSArIHByaW9yaXR5ICsgIDApCi0KLQlBcmd1bWVudHM6Ci0gICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCi0JCXBEQQkJCVBvaW50ZXIgdG8gREEgYWRkcmVzcwotCQlwU0EJCQlQb2ludGVyIHRvIFNBIGFkZHJlc3MKLQkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBJbml0TUlDRW5naW5lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBLZXksCi0JSU4JUFVDSEFSCQkJcERBLAotCUlOCVBVQ0hBUgkJCXBTQSwKLQlJTiAgVUNIQVIgICAgICAgICAgIFVzZXJQcmlvcml0eSwKLQlJTglQVUNIQVIJCQlwTUlDS2V5KQotewotCVVMT05HIFByaW9yaXR5ID0gVXNlclByaW9yaXR5OwotCi0JLy8gSW5pdCBNSUMgdmFsdWUgY2FsY3VsYXRpb24KLQlSVE1QVGtpcFNldE1JQ0tleSgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcE1JQ0tleSk7Ci0JLy8gREEKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcERBLCBNQUNfQUREUl9MRU4pOwotCS8vIFNBCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBTQSwgTUFDX0FERFJfTEVOKTsKLQkvLyBQcmlvcml0eSArIDMgYnl0ZXMgb2YgMAotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCAoUFVDSEFSKSZQcmlvcml0eSwgNCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDb21wYXJlIE1JQyB2YWx1ZSBvZiByZWNlaXZlZCBNU0RVCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIFBsYWluIHRleHQgZGF0YQotCQlwREEJCQlQb2ludGVyIHRvIERBIGFkZHJlc3MKLQkJcFNBCQkJUG9pbnRlciB0byBTQSBhZGRyZXNzCi0JCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQotCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBwbGFpbiB0ZXh0IGRhdGEgZXhjbHVkZSBNSUMgdmFsdWUKLQotCVJldHVybiBWYWx1ZToKLQkJVFJVRSAgICAgICAgTUlDIHZhbHVlIG1hdGNoZWQKLQkJRkFMU0UgICAgICAgTUlDIHZhbHVlIG1pc21hdGNoZWQKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4JUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglQVUNIQVIJCQlwREEsCi0JSU4JUFVDSEFSCQkJcFNBLAotCUlOCVBVQ0hBUgkJCXBNSUNLZXksCi0JSU4JVUNIQVIJCQlVc2VyUHJpb3JpdHksCi0JSU4JVUlOVAkJCUxlbikKLXsKLQlVQ0hBUglPbGRNaWNbOF07Ci0JVUxPTkcJUHJpb3JpdHkgPSBVc2VyUHJpb3JpdHk7Ci0KLQkvLyBJbml0IE1JQyB2YWx1ZSBjYWxjdWxhdGlvbgotCVJUTVBUa2lwU2V0TUlDS2V5KCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwTUlDS2V5KTsKLQkvLyBEQQotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwREEsIE1BQ19BRERSX0xFTik7Ci0JLy8gU0EKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNBLCBNQUNfQUREUl9MRU4pOwotCS8vIFByaW9yaXR5ICsgMyBieXRlcyBvZiAwCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIChQVUNIQVIpJlByaW9yaXR5LCA0KTsKLQotCS8vIENhbGN1bGF0ZSBNSUMgdmFsdWUgZnJvbSBwbGFpbiB0ZXh0IGRhdGEKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNyYywgTGVuKTsKLQotCS8vIEdldCBNSUMgdmFsdWRlIGZyb20gcmVjZWl2ZWQgZnJhbWUKLQlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBTcmMgKyBMZW4sIDgpOwotCi0JLy8gR2V0IE1JQyB2YWx1ZSBmcm9tIGRlY3J5cHRlZCBwbGFpbiBkYXRhCi0JUlRNUFRraXBHZXRNSUMoJnBBZC0+UHJpdmF0ZUluZm8uUngpOwotCi0JLy8gTW92ZSBNSUMgdmFsdWUgZnJvbSBNU0RVLCB0aGlzIHN0ZXBzIHNob3VsZCBtb3ZlIHRvIGRhdGEgcGF0aC4KLQkvLyBTaW5jZSB0aGUgTUlDIHZhbHVlIG1pZ2h0IGNyb3NzIE1QRFVzLgotCWlmKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5Qcml2YXRlSW5mby5SeC5NSUMsIE9sZE1pYywgOCkpCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoKTogVEtJUCBNSUMgRXJyb3IgIVxuIikpOyAgLy9NSUMgZXJyb3IuCi0KLQotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0JcmV0dXJuIChUUlVFKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUNvbXBhcmUgTUlDIHZhbHVlIG9mIHJlY2VpdmVkIE1TRFUKLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcExMQwkJTExDIGhlYWRlcgotCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBQbGFpbiB0ZXh0IGRhdGEKLQkJcERBCQkJUG9pbnRlciB0byBEQSBhZGRyZXNzCi0JCXBTQQkJCVBvaW50ZXIgdG8gU0EgYWRkcmVzcwotCQlwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKLQkJTGVuICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgcGxhaW4gdGV4dCBkYXRhIGV4Y2x1ZGUgTUlDIHZhbHVlCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCVRSVUUgICAgICAgIE1JQyB2YWx1ZSBtYXRjaGVkCi0JCUZBTFNFICAgICAgIE1JQyB2YWx1ZSBtaXNtYXRjaGVkCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOCVJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlV2l0aExMQygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwTExDLAotCUlOCVBVQ0hBUgkJCXBTcmMsCi0JSU4JUFVDSEFSCQkJcERBLAotCUlOCVBVQ0hBUgkJCXBTQSwKLQlJTglQVUNIQVIJCQlwTUlDS2V5LAotCUlOCVVJTlQJCQlMZW4pCi17Ci0JVUNIQVIJT2xkTWljWzhdOwotCVVMT05HCVByaW9yaXR5ID0gMDsKLQotCS8vIEluaXQgTUlDIHZhbHVlIGNhbGN1bGF0aW9uCi0JUlRNUFRraXBTZXRNSUNLZXkoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBNSUNLZXkpOwotCS8vIERBCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBEQSwgTUFDX0FERFJfTEVOKTsKLQkvLyBTQQotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU0EsIE1BQ19BRERSX0xFTik7Ci0JLy8gUHJpb3JpdHkgKyAzIGJ5dGVzIG9mIDAKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgKFBVQ0hBUikmUHJpb3JpdHksIDQpOwotCi0JLy8gU3RhcnQgd2l0aCBMTEMgaGVhZGVyCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBMTEMsIDgpOwotCi0JLy8gQ2FsY3VsYXRlIE1JQyB2YWx1ZSBmcm9tIHBsYWluIHRleHQgZGF0YQotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU3JjLCBMZW4pOwotCi0JLy8gR2V0IE1JQyB2YWx1ZGUgZnJvbSByZWNlaXZlZCBmcmFtZQotCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcFNyYyArIExlbiwgOCk7Ci0KLQkvLyBHZXQgTUlDIHZhbHVlIGZyb20gZGVjcnlwdGVkIHBsYWluIGRhdGEKLQlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5SeCk7Ci0KLQkvLyBNb3ZlIE1JQyB2YWx1ZSBmcm9tIE1TRFUsIHRoaXMgc3RlcHMgc2hvdWxkIG1vdmUgdG8gZGF0YSBwYXRoLgotCS8vIFNpbmNlIHRoZSBNSUMgdmFsdWUgbWlnaHQgY3Jvc3MgTVBEVXMuCi0JaWYoIU5kaXNFcXVhbE1lbW9yeShwQWQtPlByaXZhdGVJbmZvLlJ4Lk1JQywgT2xkTWljLCA4KSkKLQl7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZVdpdGhMTEMoKTogVEtJUCBNSUMgRXJyb3IgIVxuIikpOyAgLy9NSUMgZXJyb3IuCi0KLQotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0JcmV0dXJuIChUUlVFKTsKLX0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKLQlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgdHJhbnNtaXQgZnVuY3Rpb24KLQotCUFyZ3VtZW50czoKLQkJcEFkCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0JCVBORElTX1BBQ0tFVAlQb2ludGVyIHRvIE5kaXMgUGFja2V0IGZvciBNSUMgY2FsY3VsYXRpb24KLQkJcEVuY2FwCQkJUG9pbnRlciB0byBMTEMgZW5jYXAgZGF0YQotCQlMZW5FbmNhcAkJVG90YWwgZW5jYXAgbGVuZ3RoLCBtaWdodCBiZSAwIHdoaWNoIGluZGljYXRlcyBubyBlbmNhcAotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBDYWxjdWxhdGVNSUNWYWx1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglQVUNIQVIJCQlwRW5jYXAsCi0JSU4JUENJUEhFUl9LRVkJCXBLZXksCi0JSU4JVUNIQVIJCQlhcGlkeCkKLXsKLQlQQUNLRVRfSU5GTwkJUGFja2V0SW5mbzsKLQlQVUNIQVIJCQlwU3JjQnVmVkE7Ci0JVUlOVAkJCVNyY0J1ZkxlbjsKLQlQVUNIQVIJCQlwU3JjOwotICAgIFVDSEFSICAgICAgICAgICBVc2VyUHJpb3JpdHk7Ci0JVUNIQVIJCQl2bGFuX29mZnNldCA9IDA7Ci0KLQlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7Ci0KLQlVc2VyUHJpb3JpdHkgPSBSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCk7Ci0JcFNyYyA9IHBTcmNCdWZWQTsKLQotCS8vIGRldGVybWluZSBpZiB0aGlzIGlzIGEgdmxhbiBwYWNrZXQKLQlpZiAoKCgqKHBTcmMgKyAxMikgPDwgOCkgKyAqKHBTcmMgKyAxMykpID09IDB4ODEwMCkKLQkJdmxhbl9vZmZzZXQgPSA0OwotCi0JewotCQlSVE1QSW5pdE1JQ0VuZ2luZSgKLQkJCXBBZCwKLQkJCXBLZXktPktleSwKLQkJCXBTcmMsCi0JCQlwU3JjICsgNiwKLQkJCVVzZXJQcmlvcml0eSwKLQkJCXBLZXktPlR4TWljKTsKLQl9Ci0KLQotCWlmIChwRW5jYXAgIT0gTlVMTCkKLQl7Ci0JCS8vIExMQyBlbmNhcHN1bGF0aW9uCi0JCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwRW5jYXAsIDYpOwotCQkvLyBQcm90b2NvbCBUeXBlCi0JCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwU3JjICsgMTIgKyB2bGFuX29mZnNldCwgMik7Ci0JfQotCVNyY0J1ZkxlbiAtPSAoMTQgKyB2bGFuX29mZnNldCk7Ci0JcFNyYyArPSAoMTQgKyB2bGFuX29mZnNldCk7Ci0JZG8KLQl7Ci0JCWlmIChTcmNCdWZMZW4gPiAwKQotCQl7Ci0JCQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcFNyYywgU3JjQnVmTGVuKTsKLQkJfQotCi0JCWJyZWFrOwkvLyBObyBuZWVkIGhhbmRsZSBuZXh0IHBhY2tldAotCi0JfQl3aGlsZSAoVFJVRSk7CQkvLyBFbmQgb2YgY29weWluZyBwYXlsb2FkCi0KLQkvLyBDb21wdXRlIHRoZSBmaW5hbCBNSUMgVmFsdWUKLQlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIHRraXBfc2JveCgpCQkJCQkJCQkJCQkJCQkJCSovCi0vKiBSZXR1cm5zIGEgMTYgYml0IHZhbHVlIGZyb20gYSA2NEsgZW50cnkgdGFibGUuIFRoZSBUYWJsZSAqLwotLyogaXMgc3ludGhlc2l6ZWQgZnJvbSB0d28gMjU2IGVudHJ5IGJ5dGUgd2lkZSB0YWJsZXMuCQkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotVUlOVCB0a2lwX3Nib3goVUlOVCBpbmRleCkKLXsKLQlVSU5UIGluZGV4X2xvdzsKLQlVSU5UIGluZGV4X2hpZ2g7Ci0JVUlOVCBsZWZ0LCByaWdodDsKLQotCWluZGV4X2xvdyA9IChpbmRleCAlIDI1Nik7Ci0JaW5kZXhfaGlnaCA9ICgoaW5kZXggPj4gOCkgJSAyNTYpOwotCi0JbGVmdCA9IFRraXBfU2JveF9Mb3dlcltpbmRleF9sb3ddICsgKFRraXBfU2JveF9VcHBlcltpbmRleF9sb3ddICogMjU2KTsKLQlyaWdodCA9IFRraXBfU2JveF9VcHBlcltpbmRleF9oaWdoXSArIChUa2lwX1Nib3hfTG93ZXJbaW5kZXhfaGlnaF0gKiAyNTYpOwotCi0JcmV0dXJuIChsZWZ0IF4gcmlnaHQpOwotfQotCi1VSU5UIHJvdHIxKFVJTlQgYSkKLXsKLQl1bnNpZ25lZCBpbnQgYjsKLQotCWlmICgoYSAmIDB4MDEpID09IDB4MDEpCi0JewotCQliID0gKGEgPj4gMSkgfCAweDgwMDA7Ci0JfQotCWVsc2UKLQl7Ci0JCWIgPSAoYSA+PiAxKSAmIDB4N2ZmZjsKLQl9Ci0JYiA9IGIgJSA2NTUzNjsKLQlyZXR1cm4gYjsKLX0KLQotVk9JRCBSVE1QVGtpcE1peEtleSgKLQlVQ0hBUiAqa2V5LAotCVVDSEFSICp0YSwKLQlVTE9ORyBwbmwsIC8qIExlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgb2YgUE4gKi8KLQlVTE9ORyBwbmgsIC8qIE1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBQTiAqLwotCVVDSEFSICpyYzRrZXksCi0JVUlOVCAqcDFrKQotewotCi0JVUlOVCB0c2MwOwotCVVJTlQgdHNjMTsKLQlVSU5UIHRzYzI7Ci0KLQlVSU5UIHBwazA7Ci0JVUlOVCBwcGsxOwotCVVJTlQgcHBrMjsKLQlVSU5UIHBwazM7Ci0JVUlOVCBwcGs0OwotCVVJTlQgcHBrNTsKLQotCUlOVCBpOwotCUlOVCBqOwotCi0JdHNjMCA9ICh1bnNpZ25lZCBpbnQpKChwbmggPj4gMTYpICUgNjU1MzYpOyAvKiBtc2IgKi8KLQl0c2MxID0gKHVuc2lnbmVkIGludCkocG5oICUgNjU1MzYpOwotCXRzYzIgPSAodW5zaWduZWQgaW50KShwbmwgJSA2NTUzNik7IC8qIGxzYiAqLwotCi0JLyogUGhhc2UgMSwgc3RlcCAxICovCi0JcDFrWzBdID0gdHNjMTsKLQlwMWtbMV0gPSB0c2MwOwotCXAxa1syXSA9IChVSU5UKSh0YVswXSArICh0YVsxXSoyNTYpKTsKLQlwMWtbM10gPSAoVUlOVCkodGFbMl0gKyAodGFbM10qMjU2KSk7Ci0JcDFrWzRdID0gKFVJTlQpKHRhWzRdICsgKHRhWzVdKjI1NikpOwotCi0JLyogUGhhc2UgMSwgc3RlcCAyICovCi0JZm9yIChpPTA7IGk8ODsgaSsrKQotCXsKLQkJaiA9IDIqKGkgJiAxKTsKLQkJcDFrWzBdID0gKHAxa1swXSArIHRraXBfc2JveCggKHAxa1s0XSBeICgoMjU2KmtleVsxK2pdKSArIGtleVtqXSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKLQkJcDFrWzFdID0gKHAxa1sxXSArIHRraXBfc2JveCggKHAxa1swXSBeICgoMjU2KmtleVs1K2pdKSArIGtleVs0K2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OwotCQlwMWtbMl0gPSAocDFrWzJdICsgdGtpcF9zYm94KCAocDFrWzFdIF4gKCgyNTYqa2V5Wzkral0pICsga2V5Wzgral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7Ci0JCXAxa1szXSA9IChwMWtbM10gKyB0a2lwX3Nib3goIChwMWtbMl0gXiAoKDI1NiprZXlbMTMral0pICsga2V5WzEyK2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OwotCQlwMWtbNF0gPSAocDFrWzRdICsgdGtpcF9zYm94KCAocDFrWzNdIF4gKCgoMjU2KmtleVsxK2pdKSArIGtleVtqXSkpKSAlIDY1NTM2ICkpICUgNjU1MzY7Ci0JCXAxa1s0XSA9IChwMWtbNF0gKyBpKSAlIDY1NTM2OwotCX0KLQotCS8qIFBoYXNlIDIsIFN0ZXAgMSAqLwotCXBwazAgPSBwMWtbMF07Ci0JcHBrMSA9IHAxa1sxXTsKLQlwcGsyID0gcDFrWzJdOwotCXBwazMgPSBwMWtbM107Ci0JcHBrNCA9IHAxa1s0XTsKLQlwcGs1ID0gKHAxa1s0XSArIHRzYzIpICUgNjU1MzY7Ci0KLQkvKiBQaGFzZTIsIFN0ZXAgMiAqLwotCXBwazAgPSBwcGswICsgdGtpcF9zYm94KCAocHBrNSBeICgoMjU2KmtleVsxXSkgKyBrZXlbMF0pKSAlIDY1NTM2KTsKLQlwcGsxID0gcHBrMSArIHRraXBfc2JveCggKHBwazAgXiAoKDI1NiprZXlbM10pICsga2V5WzJdKSkgJSA2NTUzNik7Ci0JcHBrMiA9IHBwazIgKyB0a2lwX3Nib3goIChwcGsxIF4gKCgyNTYqa2V5WzVdKSArIGtleVs0XSkpICUgNjU1MzYpOwotCXBwazMgPSBwcGszICsgdGtpcF9zYm94KCAocHBrMiBeICgoMjU2KmtleVs3XSkgKyBrZXlbNl0pKSAlIDY1NTM2KTsKLQlwcGs0ID0gcHBrNCArIHRraXBfc2JveCggKHBwazMgXiAoKDI1NiprZXlbOV0pICsga2V5WzhdKSkgJSA2NTUzNik7Ci0JcHBrNSA9IHBwazUgKyB0a2lwX3Nib3goIChwcGs0IF4gKCgyNTYqa2V5WzExXSkgKyBrZXlbMTBdKSkgJSA2NTUzNik7Ci0KLQlwcGswID0gcHBrMCArIHJvdHIxKHBwazUgXiAoKDI1NiprZXlbMTNdKSArIGtleVsxMl0pKTsKLQlwcGsxID0gcHBrMSArIHJvdHIxKHBwazAgXiAoKDI1NiprZXlbMTVdKSArIGtleVsxNF0pKTsKLQlwcGsyID0gcHBrMiArIHJvdHIxKHBwazEpOwotCXBwazMgPSBwcGszICsgcm90cjEocHBrMik7Ci0JcHBrNCA9IHBwazQgKyByb3RyMShwcGszKTsKLQlwcGs1ID0gcHBrNSArIHJvdHIxKHBwazQpOwotCi0JLyogUGhhc2UgMiwgU3RlcCAzICovCi0gICAgLyogUGhhc2UgMiwgU3RlcCAzICovCi0KLQl0c2MwID0gKHVuc2lnbmVkIGludCkoKHBuaCA+PiAxNikgJSA2NTUzNik7IC8qIG1zYiAqLwotCXRzYzEgPSAodW5zaWduZWQgaW50KShwbmggJSA2NTUzNik7Ci0JdHNjMiA9ICh1bnNpZ25lZCBpbnQpKHBubCAlIDY1NTM2KTsgLyogbHNiICovCi0KLQlyYzRrZXlbMF0gPSAodHNjMiA+PiA4KSAlIDI1NjsKLQlyYzRrZXlbMV0gPSAoKCh0c2MyID4+IDgpICUgMjU2KSB8IDB4MjApICYgMHg3ZjsKLQlyYzRrZXlbMl0gPSB0c2MyICUgMjU2OwotCXJjNGtleVszXSA9ICgocHBrNSBeICgoMjU2KmtleVsxXSkgKyBrZXlbMF0pKSA+PiAxKSAlIDI1NjsKLQotCXJjNGtleVs0XSA9IHBwazAgJSAyNTY7Ci0JcmM0a2V5WzVdID0gKHBwazAgPj4gOCkgJSAyNTY7Ci0KLQlyYzRrZXlbNl0gPSBwcGsxICUgMjU2OwotCXJjNGtleVs3XSA9IChwcGsxID4+IDgpICUgMjU2OwotCi0JcmM0a2V5WzhdID0gcHBrMiAlIDI1NjsKLQlyYzRrZXlbOV0gPSAocHBrMiA+PiA4KSAlIDI1NjsKLQotCXJjNGtleVsxMF0gPSBwcGszICUgMjU2OwotCXJjNGtleVsxMV0gPSAocHBrMyA+PiA4KSAlIDI1NjsKLQotCXJjNGtleVsxMl0gPSBwcGs0ICUgMjU2OwotCXJjNGtleVsxM10gPSAocHBrNCA+PiA4KSAlIDI1NjsKLQotCXJjNGtleVsxNF0gPSBwcGs1ICUgMjU2OwotCXJjNGtleVsxNV0gPSAocHBrNSA+PiA4KSAlIDI1NjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogY29uc3RydWN0X21pY19oZWFkZXIxKCkgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEJ1aWxkcyB0aGUgZmlyc3QgTUlDIGhlYWRlciBibG9jayBmcm9tICAgICAgICovCi0vKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjEoCi0JdW5zaWduZWQgY2hhciAqbWljX2hlYWRlcjEsCi0JaW50IGhlYWRlcl9sZW5ndGgsCi0JdW5zaWduZWQgY2hhciAqbXBkdSkKLXsKLQltaWNfaGVhZGVyMVswXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpIC8gMjU2KTsKLQltaWNfaGVhZGVyMVsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpICUgMjU2KTsKLQltaWNfaGVhZGVyMVsyXSA9IG1wZHVbMF0gJiAweGNmOyAgICAvKiBNdXRlIENGIHBvbGwgJiBDRiBhY2sgYml0cyAqLwotCW1pY19oZWFkZXIxWzNdID0gbXBkdVsxXSAmIDB4Yzc7ICAgIC8qIE11dGUgcmV0cnksIG1vcmUgZGF0YSBhbmQgcHdyIG1ndCBiaXRzICovCi0JbWljX2hlYWRlcjFbNF0gPSBtcGR1WzRdOyAgICAgICAvKiBBMSAqLwotCW1pY19oZWFkZXIxWzVdID0gbXBkdVs1XTsKLQltaWNfaGVhZGVyMVs2XSA9IG1wZHVbNl07Ci0JbWljX2hlYWRlcjFbN10gPSBtcGR1WzddOwotCW1pY19oZWFkZXIxWzhdID0gbXBkdVs4XTsKLQltaWNfaGVhZGVyMVs5XSA9IG1wZHVbOV07Ci0JbWljX2hlYWRlcjFbMTBdID0gbXBkdVsxMF07ICAgICAvKiBBMiAqLwotCW1pY19oZWFkZXIxWzExXSA9IG1wZHVbMTFdOwotCW1pY19oZWFkZXIxWzEyXSA9IG1wZHVbMTJdOwotCW1pY19oZWFkZXIxWzEzXSA9IG1wZHVbMTNdOwotCW1pY19oZWFkZXIxWzE0XSA9IG1wZHVbMTRdOwotCW1pY19oZWFkZXIxWzE1XSA9IG1wZHVbMTVdOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogY29uc3RydWN0X21pY19oZWFkZXIyKCkgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEJ1aWxkcyB0aGUgbGFzdCBNSUMgaGVhZGVyIGJsb2NrIGZyb20gICAgICAgICovCi0vKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoCi0JdW5zaWduZWQgY2hhciAqbWljX2hlYWRlcjIsCi0JdW5zaWduZWQgY2hhciAqbXBkdSwKLQlpbnQgYTRfZXhpc3RzLAotCWludCBxY19leGlzdHMpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpPDE2OyBpKyspIG1pY19oZWFkZXIyW2ldPTB4MDA7Ci0KLQltaWNfaGVhZGVyMlswXSA9IG1wZHVbMTZdOyAgICAvKiBBMyAqLwotCW1pY19oZWFkZXIyWzFdID0gbXBkdVsxN107Ci0JbWljX2hlYWRlcjJbMl0gPSBtcGR1WzE4XTsKLQltaWNfaGVhZGVyMlszXSA9IG1wZHVbMTldOwotCW1pY19oZWFkZXIyWzRdID0gbXBkdVsyMF07Ci0JbWljX2hlYWRlcjJbNV0gPSBtcGR1WzIxXTsKLQotCS8vIEluIFNlcXVlbmNlIENvbnRyb2wgZmllbGQsIG11dGUgc2VxdWVuY2UgbnVtZXIgYml0cyAoMTItYml0KQotCW1pY19oZWFkZXIyWzZdID0gbXBkdVsyMl0gJiAweDBmOyAgIC8qIFNDICovCi0JbWljX2hlYWRlcjJbN10gPSAweDAwOyAvKiBtcGR1WzIzXTsgKi8KLQotCWlmICgoIXFjX2V4aXN0cykgJiBhNF9leGlzdHMpCi0JewotCQlmb3IgKGk9MDtpPDY7aSsrKSBtaWNfaGVhZGVyMls4K2ldID0gbXBkdVsyNCtpXTsgICAvKiBBNCAqLwotCi0JfQotCi0JaWYgKHFjX2V4aXN0cyAmJiAoIWE0X2V4aXN0cykpCi0JewotCQltaWNfaGVhZGVyMls4XSA9IG1wZHVbMjRdICYgMHgwZjsgLyogbXV0ZSBiaXRzIDE1IC0gNCAqLwotCQltaWNfaGVhZGVyMls5XSA9IG1wZHVbMjVdICYgMHgwMDsKLQl9Ci0KLQlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKLQl7Ci0JCWZvciAoaT0wO2k8NjtpKyspIG1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAgIC8qIEE0ICovCi0KLQkJbWljX2hlYWRlcjJbMTRdID0gbXBkdVszMF0gJiAweDBmOwotCQltaWNfaGVhZGVyMlsxNV0gPSBtcGR1WzMxXSAmIDB4MDA7Ci0JfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBjb25zdHJ1Y3RfbWljX2l2KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQnVpbGRzIHRoZSBNSUMgSVYgZnJvbSBoZWFkZXIgZmllbGRzIGFuZCBQTiAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgY29uc3RydWN0X21pY19pdigKLQl1bnNpZ25lZCBjaGFyICptaWNfaXYsCi0JaW50IHFjX2V4aXN0cywKLQlpbnQgYTRfZXhpc3RzLAotCXVuc2lnbmVkIGNoYXIgKm1wZHUsCi0JdW5zaWduZWQgaW50IHBheWxvYWRfbGVuZ3RoLAotCXVuc2lnbmVkIGNoYXIgKnBuX3ZlY3RvcikKLXsKLQlpbnQgaTsKLQotCW1pY19pdlswXSA9IDB4NTk7Ci0JaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpCi0JCW1pY19pdlsxXSA9IG1wZHVbMzBdICYgMHgwZjsgICAgLyogUW9TX1RDICAgICAgICAgICAqLwotCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykKLQkJbWljX2l2WzFdID0gbXBkdVsyNF0gJiAweDBmOyAgIC8qIG11dGUgYml0cyA3LTQgICAgKi8KLQlpZiAoIXFjX2V4aXN0cykKLQkJbWljX2l2WzFdID0gMHgwMDsKLQlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQotCQltaWNfaXZbaV0gPSBtcGR1W2kgKyA4XTsgICAgICAgICAgICAgICAgICAgIC8qIG1pY19pdlsyOjddID0gQTJbMDo1XSA9IG1wZHVbMTA6MTVdICovCi0jaWZkZWYgQ09OU0lTVEVOVF9QTl9PUkRFUgotCQlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKLQkJCW1pY19pdltpXSA9IHBuX3ZlY3RvcltpIC0gOF07ICAgICAgICAgICAvKiBtaWNfaXZbODoxM10gPSBQTlswOjVdICovCi0jZWxzZQotCQlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKLQkJCW1pY19pdltpXSA9IHBuX3ZlY3RvclsxMyAtIGldOyAgICAgICAgICAvKiBtaWNfaXZbODoxM10gPSBQTls1OjBdICovCi0jZW5kaWYKLQlpID0gKHBheWxvYWRfbGVuZ3RoIC8gMjU2KTsKLQlpID0gKHBheWxvYWRfbGVuZ3RoICUgMjU2KTsKLQltaWNfaXZbMTRdID0gKHVuc2lnbmVkIGNoYXIpIChwYXlsb2FkX2xlbmd0aCAvIDI1Nik7Ci0JbWljX2l2WzE1XSA9ICh1bnNpZ25lZCBjaGFyKSAocGF5bG9hZF9sZW5ndGggJSAyNTYpOwotCi19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogYml0d2lzZV94b3IoKSAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEEgMTI4IGJpdCwgYml0d2lzZSBleGNsdXNpdmUgb3IgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGJpdHdpc2VfeG9yKHVuc2lnbmVkIGNoYXIgKmluYSwgdW5zaWduZWQgY2hhciAqaW5iLCB1bnNpZ25lZCBjaGFyICpvdXQpCi17Ci0JaW50IGk7Ci0JZm9yIChpPTA7IGk8MTY7IGkrKykKLQl7Ci0JCW91dFtpXSA9IGluYVtpXSBeIGluYltpXTsKLQl9Ci19Ci0KLQotdm9pZCBhZXMxMjhrMTI4ZCh1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGNoYXIgKmNpcGhlcnRleHQpCi17Ci0JaW50IHJvdW5kOwotCWludCBpOwotCXVuc2lnbmVkIGNoYXIgaW50ZXJtZWRpYXRlYVsxNl07Ci0JdW5zaWduZWQgY2hhciBpbnRlcm1lZGlhdGViWzE2XTsKLQl1bnNpZ25lZCBjaGFyIHJvdW5kX2tleVsxNl07Ci0KLQlmb3IoaT0wOyBpPDE2OyBpKyspIHJvdW5kX2tleVtpXSA9IGtleVtpXTsKLQotCWZvciAocm91bmQgPSAwOyByb3VuZCA8IDExOyByb3VuZCsrKQotCXsKLQkJaWYgKHJvdW5kID09IDApCi0JCXsKLQkJCXhvcl8xMjgocm91bmRfa2V5LCBkYXRhLCBjaXBoZXJ0ZXh0KTsKLQkJCW5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOwotCQl9Ci0JCWVsc2UgaWYgKHJvdW5kID09IDEwKQotCQl7Ci0JCQlieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKLQkJCXNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKLQkJCXhvcl8xMjgoaW50ZXJtZWRpYXRlYiwgcm91bmRfa2V5LCBjaXBoZXJ0ZXh0KTsKLQkJfQotCQllbHNlICAgIC8qIDEgLSA5ICovCi0JCXsKLQkJCWJ5dGVfc3ViKGNpcGhlcnRleHQsIGludGVybWVkaWF0ZWEpOwotCQkJc2hpZnRfcm93KGludGVybWVkaWF0ZWEsIGludGVybWVkaWF0ZWIpOwotCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlswXSwgJmludGVybWVkaWF0ZWFbMF0pOwotCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls0XSwgJmludGVybWVkaWF0ZWFbNF0pOwotCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls4XSwgJmludGVybWVkaWF0ZWFbOF0pOwotCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlsxMl0sICZpbnRlcm1lZGlhdGVhWzEyXSk7Ci0JCQl4b3JfMTI4KGludGVybWVkaWF0ZWEsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7Ci0JCQluZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKLQkJfQotCX0KLQotfQotCi12b2lkIGNvbnN0cnVjdF9jdHJfcHJlbG9hZCgKLQl1bnNpZ25lZCBjaGFyICpjdHJfcHJlbG9hZCwKLQlpbnQgYTRfZXhpc3RzLAotCWludCBxY19leGlzdHMsCi0JdW5zaWduZWQgY2hhciAqbXBkdSwKLQl1bnNpZ25lZCBjaGFyICpwbl92ZWN0b3IsCi0JaW50IGMpCi17Ci0KLQlpbnQgaSA9IDA7Ci0JZm9yIChpPTA7IGk8MTY7IGkrKykgY3RyX3ByZWxvYWRbaV0gPSAweDAwOwotCWkgPSAwOwotCi0JY3RyX3ByZWxvYWRbMF0gPSAweDAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFnICovCi0JaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpIGN0cl9wcmVsb2FkWzFdID0gbXBkdVszMF0gJiAweDBmOyAgIC8qIFFvQ19Db250cm9sICAqLwotCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykgY3RyX3ByZWxvYWRbMV0gPSBtcGR1WzI0XSAmIDB4MGY7Ci0KLQlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQotCQljdHJfcHJlbG9hZFtpXSA9IG1wZHVbaSArIDhdOyAgICAgICAgICAgICAgICAgICAgICAgLyogY3RyX3ByZWxvYWRbMjo3XSA9IEEyWzA6NV0gPSBtcGR1WzEwOjE1XSAqLwotI2lmZGVmIENPTlNJU1RFTlRfUE5fT1JERVIKLQkgIGZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQotCQkJY3RyX3ByZWxvYWRbaV0gPSAgICBwbl92ZWN0b3JbaSAtIDhdOyAgICAgICAgICAgLyogY3RyX3ByZWxvYWRbODoxM10gPSBQTlswOjVdICovCi0jZWxzZQotCSAgZm9yIChpID0gODsgaSA8IDE0OyBpKyspCi0JCQljdHJfcHJlbG9hZFtpXSA9ICAgIHBuX3ZlY3RvclsxMyAtIGldOyAgICAgICAgICAvKiBjdHJfcHJlbG9hZFs4OjEzXSA9IFBOWzU6MF0gKi8KLSNlbmRpZgotCWN0cl9wcmVsb2FkWzE0XSA9ICAodW5zaWduZWQgY2hhcikgKGMgLyAyNTYpOyAvLyBDdHIKLQljdHJfcHJlbG9hZFsxNV0gPSAgKHVuc2lnbmVkIGNoYXIpIChjICUgMjU2KTsKLQotfQotCi0KLS8vCi0vLyBUUlVFOiBTdWNjZXNzIQotLy8gRkFMU0U6IERlY3J5cHQgRXJyb3IhCi0vLwotQk9PTEVBTiBSVE1QU29mdERlY3J5cHRUS0lQKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUglwRGF0YSwKLQlJTiBVTE9ORwlEYXRhQnl0ZUNudCwKLQlJTiBVQ0hBUiAgICBVc2VyUHJpb3JpdHksCi0JSU4gUENJUEhFUl9LRVkJcFdwYUtleSkKLXsKLQlVQ0hBUgkJCUtleUlEOwotCVVJTlQJCQlIZWFkZXJMZW47Ci0gICAgVUNIQVIJCQlmYzA7Ci0JVUNIQVIJCQlmYzE7Ci0JVVNIT1JUCQkJZmM7Ci0JVUlOVAkJCWZyYW1lX3R5cGU7Ci0JVUlOVAkJCWZyYW1lX3N1YnR5cGU7Ci0gICAgVUlOVAkJCWZyb21fZHM7Ci0gICAgVUlOVAkJCXRvX2RzOwotCUlOVAkJCQlhNF9leGlzdHM7Ci0JSU5UCQkJCXFjX2V4aXN0czsKLQlVU0hPUlQJCQlkdXJhdGlvbjsKLQlVU0hPUlQJCQlzZXFfY29udHJvbDsKLQlVU0hPUlQJCQlxb3NfY29udHJvbDsKLQlVQ0hBUgkJCVRBW01BQ19BRERSX0xFTl07Ci0JVUNIQVIJCQlEQVtNQUNfQUREUl9MRU5dOwotCVVDSEFSCQkJU0FbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUgkJCVJDNEtleVsxNl07Ci0JVUlOVAkJCXAxa1s1XTsgLy9mb3IgbWl4X2tleTsKLQlVTE9ORwkJCXBubDsvKiBMZWFzdCBzaWduaWZpY2FudCAxNiBiaXRzIG9mIFBOICovCi0JVUxPTkcJCQlwbmg7LyogTW9zdCBzaWduaWZpY2FudCAzMiBiaXRzIG9mIFBOICovCi0JVUlOVAkJCW51bV9ibG9ja3M7Ci0JVUlOVAkJCXBheWxvYWRfcmVtYWluZGVyOwotCUFSQ0ZPVVJDT05URVhUIAlBcmNGb3VyQ29udGV4dDsKLQlVSU5UCQkJY3JjMzIgPSAwOwotCVVJTlQJCQl0cmFpbGZjcyA9IDA7Ci0JVUNIQVIJCQlNSUNbOF07Ci0JVUNIQVIJCQlUcmFpbE1JQ1s4XTsKLQotCWZjMCA9ICpwRGF0YTsKLQlmYzEgPSAqKHBEYXRhICsgMSk7Ci0KLQlmYyA9ICooKFBVU0hPUlQpcERhdGEpOwotCi0JZnJhbWVfdHlwZSA9ICgoZmMwID4+IDIpICYgMHgwMyk7Ci0JZnJhbWVfc3VidHlwZSA9ICgoZmMwID4+IDQpICYgMHgwZik7Ci0KLSAgICBmcm9tX2RzID0gKGZjMSAmIDB4MikgPj4gMTsKLSAgICB0b19kcyA9IChmYzEgJiAweDEpOwotCi0gICAgYTRfZXhpc3RzID0gKGZyb21fZHMgJiB0b19kcyk7Ci0gICAgcWNfZXhpc3RzID0gKChmcmFtZV9zdWJ0eXBlID09IDB4MDgpIHx8ICAgIC8qIEFzc3VtZWQgUW9TIHN1YnR5cGVzICovCi0gICAgICAgICAgICAgICAgICAoZnJhbWVfc3VidHlwZSA9PSAweDA5KSB8fCAgIC8qIExpa2VseSB0byBjaGFuZ2UuICAgICovCi0gICAgICAgICAgICAgICAgICAoZnJhbWVfc3VidHlwZSA9PSAweDBhKSB8fAotICAgICAgICAgICAgICAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYikKLSAgICAgICAgICAgICAgICAgKTsKLQotCUhlYWRlckxlbiA9IDI0OwotCWlmIChhNF9leGlzdHMpCi0JCUhlYWRlckxlbiArPSA2OwotCi0JS2V5SUQgPSAqKChQVUNIQVIpKHBEYXRhKyBIZWFkZXJMZW4gKyAzKSk7Ci0JS2V5SUQgPSBLZXlJRCA+PiA2OwotCi0JaWYgKHBXcGFLZXlbS2V5SURdLktleUxlbiA9PSAwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNvZnREZWNyeXB0VEtJUCBmYWlsZWQhKEtleUlEWyVkXSBMZW5ndGggY2FuIG5vdCBiZSAwKVxuIiwgS2V5SUQpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCWR1cmF0aW9uID0gKigoUFVTSE9SVCkocERhdGErMikpOwotCi0Jc2VxX2NvbnRyb2wgPSAqKChQVVNIT1JUKShwRGF0YSsyMikpOwotCi0JaWYgKHFjX2V4aXN0cykKLQl7Ci0JCWlmIChhNF9leGlzdHMpCi0JCXsKLQkJCXFvc19jb250cm9sID0gKigoUFVTSE9SVCkocERhdGErMzApKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXFvc19jb250cm9sID0gKigoUFVTSE9SVCkocERhdGErMjQpKTsKLQkJfQotCX0KLQotCWlmICh0b19kcyA9PSAwICYmIGZyb21fZHMgPT0gMSkKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KERBLCBwRGF0YSs0LCBNQUNfQUREUl9MRU4pOwotCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMTYsIE1BQ19BRERSX0xFTik7Ci0JCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsgIC8vQlNTSUQKLQl9Ci0JZWxzZSBpZiAodG9fZHMgPT0gMCAmJiBmcm9tX2RzID09IDAgKQotCXsKLQkJTmRpc01vdmVNZW1vcnkoVEEsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOwotCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGErNCwgTUFDX0FERFJfTEVOKTsKLQkJTmRpc01vdmVNZW1vcnkoU0EsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOwotCX0KLQllbHNlIGlmICh0b19kcyA9PSAxICYmIGZyb21fZHMgPT0gMCkKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKLQkJTmRpc01vdmVNZW1vcnkoVEEsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOwotCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGErMTYsIE1BQ19BRERSX0xFTik7Ci0JfQotCWVsc2UgaWYgKHRvX2RzID09IDEgJiYgZnJvbV9kcyA9PSAxKQotCXsKLQkJTmRpc01vdmVNZW1vcnkoVEEsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOwotCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGErMTYsIE1BQ19BRERSX0xFTik7Ci0JCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSsyMiwgTUFDX0FERFJfTEVOKTsKLQl9Ci0KLQludW1fYmxvY2tzID0gKERhdGFCeXRlQ250IC0gMTYpIC8gMTY7Ci0JcGF5bG9hZF9yZW1haW5kZXIgPSAoRGF0YUJ5dGVDbnQgLSAxNikgJSAxNjsKLQotCXBubCA9ICgqKHBEYXRhICsgSGVhZGVyTGVuKSkgKiAyNTYgKyAqKHBEYXRhICsgSGVhZGVyTGVuICsgMik7Ci0JcG5oID0gKigoUFVMT05HKShwRGF0YSArIEhlYWRlckxlbiArIDQpKTsKLQlwbmggPSBjcHUybGUzMihwbmgpOwotCVJUTVBUa2lwTWl4S2V5KHBXcGFLZXlbS2V5SURdLktleSwgVEEsIHBubCwgcG5oLCBSQzRLZXksIHAxayk7Ci0KLQlBUkNGT1VSX0lOSVQoJkFyY0ZvdXJDb250ZXh0LCBSQzRLZXksIDE2KTsKLQotCUFSQ0ZPVVJfREVDUllQVCgmQXJjRm91ckNvbnRleHQsIHBEYXRhICsgSGVhZGVyTGVuLCBwRGF0YSArIEhlYWRlckxlbiArIDgsIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCk7Ci0JTmRpc01vdmVNZW1vcnkoJnRyYWlsZmNzLCBwRGF0YSArIERhdGFCeXRlQ250IC0gOCAtIDQsIDQpOwotCWNyYzMyID0gUlRNUF9DQUxDX0ZDUzMyKFBQUElOSVRGQ1MzMiwgcERhdGEgKyBIZWFkZXJMZW4sIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCAtIDQpOyAgLy9Ta2lwIElWK0VJViA4IGJ5dGVzICYgU2tpcCBsYXN0IDQgYnl0ZXMoRkNTKS4KLQljcmMzMiBePSAweGZmZmZmZmZmOyAgICAgICAgICAgICAvKiBjb21wbGVtZW50ICovCi0KLSAgICBpZihjcmMzMiAhPSBjcHUybGUzMih0cmFpbGZjcykpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU29mdERlY3J5cHRUS0lQLCBXRVAgRGF0YSBJQ1YgRXJyb3IgIVxuIikpOwkgLy9JQ1YgZXJyb3IuCi0KLQkJcmV0dXJuIChGQUxTRSk7Ci0JfQotCi0JTmRpc01vdmVNZW1vcnkoVHJhaWxNSUMsIHBEYXRhICsgRGF0YUJ5dGVDbnQgLSA4IC0gOCAtIDQsIDgpOwotCVJUTVBJbml0TUlDRW5naW5lKHBBZCwgcFdwYUtleVtLZXlJRF0uS2V5LCBEQSwgU0EsIFVzZXJQcmlvcml0eSwgcFdwYUtleVtLZXlJRF0uUnhNaWMpOwotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwRGF0YSArIEhlYWRlckxlbiwgRGF0YUJ5dGVDbnQgLSBIZWFkZXJMZW4gLSA4IC0gMTIpOwotCVJUTVBUa2lwR2V0TUlDKCZwQWQtPlByaXZhdGVJbmZvLlR4KTsKLQlOZGlzTW92ZU1lbW9yeShNSUMsIHBBZC0+UHJpdmF0ZUluZm8uVHguTUlDLCA4KTsKLQotCWlmICghTmRpc0VxdWFsTWVtb3J5KE1JQywgVHJhaWxNSUMsIDgpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUFNvZnREZWNyeXB0VEtJUCwgV0VQIERhdGEgTUlDIEVycm9yICFcbiIpKTsJIC8vTUlDIGVycm9yLgotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0KLQotQk9PTEVBTiBSVE1QU29mdERlY3J5cHRBRVMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSCXBEYXRhLAotCUlOIFVMT05HCURhdGFCeXRlQ250LAotCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpCi17Ci0JVUNIQVIJCQlLZXlJRDsKLQlVSU5UCQkJSGVhZGVyTGVuOwotCVVDSEFSCQkJUE5bNl07Ci0JVUlOVAkJCXBheWxvYWRfbGVuOwotCVVJTlQJCQludW1fYmxvY2tzOwotCVVJTlQJCQlwYXlsb2FkX3JlbWFpbmRlcjsKLQlVU0hPUlQJCQlmYzsKLQlVQ0hBUgkJCWZjMDsKLQlVQ0hBUgkJCWZjMTsKLQlVSU5UCQkJZnJhbWVfdHlwZTsKLQlVSU5UCQkJZnJhbWVfc3VidHlwZTsKLQlVSU5UCQkJZnJvbV9kczsKLQlVSU5UCQkJdG9fZHM7Ci0JSU5UCQkJCWE0X2V4aXN0czsKLQlJTlQJCQkJcWNfZXhpc3RzOwotCVVDSEFSCQkJYWVzX291dFsxNl07Ci0JaW50IAkJCXBheWxvYWRfaW5kZXg7Ci0JVUlOVCAJCQlpOwotCVVDSEFSIAkJCWN0cl9wcmVsb2FkWzE2XTsKLQlVQ0hBUiAJCQljaGFpbl9idWZmZXJbMTZdOwotCVVDSEFSIAkJCXBhZGRlZF9idWZmZXJbMTZdOwotCVVDSEFSIAkJCW1pY19pdlsxNl07Ci0JVUNIQVIgCQkJbWljX2hlYWRlcjFbMTZdOwotCVVDSEFSIAkJCW1pY19oZWFkZXIyWzE2XTsKLQlVQ0hBUgkJCU1JQ1s4XTsKLQlVQ0hBUgkJCVRyYWlsTUlDWzhdOwotCi0JZmMwID0gKnBEYXRhOwotCWZjMSA9ICoocERhdGEgKyAxKTsKLQotCWZjID0gKigoUFVTSE9SVClwRGF0YSk7Ci0KLQlmcmFtZV90eXBlID0gKChmYzAgPj4gMikgJiAweDAzKTsKLQlmcmFtZV9zdWJ0eXBlID0gKChmYzAgPj4gNCkgJiAweDBmKTsKLQotCWZyb21fZHMgPSAoZmMxICYgMHgyKSA+PiAxOwotCXRvX2RzID0gKGZjMSAmIDB4MSk7Ci0KLQlhNF9leGlzdHMgPSAoZnJvbV9kcyAmIHRvX2RzKTsKLQlxY19leGlzdHMgPSAoKGZyYW1lX3N1YnR5cGUgPT0gMHgwOCkgfHwgICAgLyogQXNzdW1lZCBRb1Mgc3VidHlwZXMgKi8KLQkJCQkgIChmcmFtZV9zdWJ0eXBlID09IDB4MDkpIHx8ICAgLyogTGlrZWx5IHRvIGNoYW5nZS4gICAgKi8KLQkJCQkgIChmcmFtZV9zdWJ0eXBlID09IDB4MGEpIHx8Ci0JCQkJICAoZnJhbWVfc3VidHlwZSA9PSAweDBiKQotCQkJCSApOwotCi0JSGVhZGVyTGVuID0gMjQ7Ci0JaWYgKGE0X2V4aXN0cykKLQkJSGVhZGVyTGVuICs9IDY7Ci0KLQlLZXlJRCA9ICooKFBVQ0hBUikocERhdGErIEhlYWRlckxlbiArIDMpKTsKLQlLZXlJRCA9IEtleUlEID4+IDY7Ci0KLQlpZiAocFdwYUtleVtLZXlJRF0uS2V5TGVuID09IDApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU29mdERlY3J5cHRBRVMgZmFpbGVkIShLZXlJRFslZF0gTGVuZ3RoIGNhbiBub3QgYmUgMClcbiIsIEtleUlEKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlQTlswXSA9ICoocERhdGErIEhlYWRlckxlbik7Ci0JUE5bMV0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyAxKTsKLQlQTlsyXSA9ICoocERhdGErIEhlYWRlckxlbiArIDQpOwotCVBOWzNdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgNSk7Ci0JUE5bNF0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyA2KTsKLQlQTls1XSA9ICoocERhdGErIEhlYWRlckxlbiArIDcpOwotCi0JcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSA4OwkvLyA4IGJ5dGVzIGZvciBDQ01QIGhlYWRlciAsIDggYnl0ZXMgZm9yIE1JQwotCXBheWxvYWRfcmVtYWluZGVyID0gKHBheWxvYWRfbGVuKSAlIDE2OwotCW51bV9ibG9ja3MgPSAocGF5bG9hZF9sZW4pIC8gMTY7Ci0KLQotCi0JLy8gRmluZCBzdGFydCBvZiBwYXlsb2FkCi0JcGF5bG9hZF9pbmRleCA9IEhlYWRlckxlbiArIDg7IC8vSVYrRUlWCi0KLQlmb3IgKGk9MDsgaTwgbnVtX2Jsb2NrczsgaSsrKQotCXsKLQkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAotCQkJCQkJCQlhNF9leGlzdHMsCi0JCQkJCQkJCXFjX2V4aXN0cywKLQkJCQkJCQkJcERhdGEsCi0JCQkJCQkJCVBOLAotCQkJCQkJCQlpKzEgKTsKLQotCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKLQotCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIGNoYWluX2J1ZmZlcik7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBEYXRhICsgcGF5bG9hZF9pbmRleCAtIDgsIGNoYWluX2J1ZmZlciwgMTYpOwotCQlwYXlsb2FkX2luZGV4ICs9IDE2OwotCX0KLQotCS8vCi0JLy8gSWYgdGhlcmUgaXMgYSBzaG9ydCBmaW5hbCBibG9jaywgdGhlbiBwYWQgaXQKLQkvLyBlbmNyeXB0IGl0IGFuZCBjb3B5IHRoZSB1bnBhZGRlZCBwYXJ0IGJhY2sKLQkvLwotCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApCi0JewotCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsCi0JCQkJCQkJCWE0X2V4aXN0cywKLQkJCQkJCQkJcWNfZXhpc3RzLAotCQkJCQkJCQlwRGF0YSwKLQkJCQkJCQkJUE4sCi0JCQkJCQkJCW51bV9ibG9ja3MgKyAxKTsKLQotCQlOZGlzWmVyb01lbW9yeShwYWRkZWRfYnVmZmVyLCAxNik7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgcGF5bG9hZF9yZW1haW5kZXIpOwotCi0JCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwotCi0JCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBEYXRhICsgcGF5bG9hZF9pbmRleCAtIDgsIGNoYWluX2J1ZmZlciwgcGF5bG9hZF9yZW1haW5kZXIpOwotCQlwYXlsb2FkX2luZGV4ICs9IHBheWxvYWRfcmVtYWluZGVyOwotCX0KLQotCS8vCi0JLy8gRGVzY3J5cHQgdGhlIE1JQwotCS8vCi0JY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAotCQkJCQkJCWE0X2V4aXN0cywKLQkJCQkJCQlxY19leGlzdHMsCi0JCQkJCQkJcERhdGEsCi0JCQkJCQkJUE4sCi0JCQkJCQkJMCk7Ci0JTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOwotCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgOCk7Ci0KLQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKLQotCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7Ci0KLQlOZGlzTW92ZU1lbW9yeShUcmFpbE1JQywgY2hhaW5fYnVmZmVyLCA4KTsKLQotCS8vCi0JLy8gQ2FsY3VsYXRlIE1JQwotCS8vCi0KLQkvL0ZvcmNlIHRoZSBwcm90ZWN0ZWQgZnJhbWUgYml0IG9uCi0JKihwRGF0YSArIDEpID0gKihwRGF0YSArIDEpIHwgMHg0MDsKLQotCS8vIEZpbmQgc3RhcnQgb2YgcGF5bG9hZAotCS8vIEJlY2F1c2UgdGhlIENDTVAgaGVhZGVyIGhhcyBiZWVuIHJlbW92ZWQKLQlwYXlsb2FkX2luZGV4ID0gSGVhZGVyTGVuOwotCi0JY29uc3RydWN0X21pY19pdigKLQkJCQkJbWljX2l2LAotCQkJCQlxY19leGlzdHMsCi0JCQkJCWE0X2V4aXN0cywKLQkJCQkJcERhdGEsCi0JCQkJCXBheWxvYWRfbGVuLAotCQkJCQlQTik7Ci0KLQljb25zdHJ1Y3RfbWljX2hlYWRlcjEoCi0JCQkJCQltaWNfaGVhZGVyMSwKLQkJCQkJCUhlYWRlckxlbiwKLQkJCQkJCXBEYXRhKTsKLQotCWNvbnN0cnVjdF9taWNfaGVhZGVyMigKLQkJCQkJCW1pY19oZWFkZXIyLAotCQkJCQkJcERhdGEsCi0JCQkJCQlhNF9leGlzdHMsCi0JCQkJCQlxY19leGlzdHMpOwotCi0JYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBtaWNfaXYsIGFlc19vdXQpOwotCWJpdHdpc2VfeG9yKGFlc19vdXQsIG1pY19oZWFkZXIxLCBjaGFpbl9idWZmZXIpOwotCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKLQliaXR3aXNlX3hvcihhZXNfb3V0LCBtaWNfaGVhZGVyMiwgY2hhaW5fYnVmZmVyKTsKLQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7Ci0KLQkvLyBpdGVyYXRlIHRocm91Z2ggZWFjaCAxNiBieXRlIHBheWxvYWQgYmxvY2sKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKQotCXsKLQkJYml0d2lzZV94b3IoYWVzX291dCwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBjaGFpbl9idWZmZXIpOwotCQlwYXlsb2FkX2luZGV4ICs9IDE2OwotCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7Ci0JfQotCi0JLy8gQWRkIG9uIHRoZSBmaW5hbCBwYXlsb2FkIGJsb2NrIGlmIGl0IG5lZWRzIHBhZGRpbmcKLQlpZiAocGF5bG9hZF9yZW1haW5kZXIgPiAwKQotCXsKLQkJTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOwotCQlOZGlzTW92ZU1lbW9yeShwYWRkZWRfYnVmZmVyLCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIHBheWxvYWRfcmVtYWluZGVyKTsKLQotCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOwotCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7Ci0JfQotCS8vIGFlc19vdXQgY29udGFpbnMgcGFkZGVkIG1pYywgZGlzY2FyZCBtb3N0IHNpZ25pZmljYW50Ci0JLy8gOCBieXRlcyB0byBnZW5lcmF0ZSA2NCBiaXQgTUlDCi0JZm9yIChpID0gMCA7IGkgPCA4OyBpKyspIE1JQ1tpXSA9IGFlc19vdXRbaV07Ci0KLQlpZiAoIU5kaXNFcXVhbE1lbW9yeShNSUMsIFRyYWlsTUlDLCA4KSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTb2Z0RGVjcnlwdEFFUywgTUlDIEVycm9yICFcbiIpKTsJIC8vTUlDIGVycm9yLgotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogYWVzMTI4azEyOGQoKSAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQZXJmb3JtcyBhIDEyOCBiaXQgQUVTIGVuY3J5cHQgd2l0aCAgKi8KLS8qIDEyOCBiaXQgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1WT0lEIHhvcl8xMjgoCi0JSU4gIFBVQ0hBUiAgYSwKLQlJTiAgUFVDSEFSICBiLAotCU9VVCBQVUNIQVIgIG91dCkKLXsKLQlJTlQgaTsKLQotCWZvciAoaT0wO2k8MTY7IGkrKykKLQl7Ci0JCW91dFtpXSA9IGFbaV0gXiBiW2ldOwotCX0KLX0KLQotVk9JRCBuZXh0X2tleSgKLQlJTiAgUFVDSEFSICBrZXksCi0JSU4gIElOVCAgICAgcm91bmQpCi17Ci0JVUNIQVIgICAgICAgcmNvbjsKLQlVQ0hBUiAgICAgICBzYm94X2tleVs0XTsKLQlVQ0hBUiAgICAgICByY29uX3RhYmxlWzEyXSA9Ci0JewotCQkweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLAotCQkweDFiLCAweDM2LCAweDM2LCAweDM2Ci0JfTsKLQotCXNib3hfa2V5WzBdID0gUlRNUENraXBTYm94KGtleVsxM10pOwotCXNib3hfa2V5WzFdID0gUlRNUENraXBTYm94KGtleVsxNF0pOwotCXNib3hfa2V5WzJdID0gUlRNUENraXBTYm94KGtleVsxNV0pOwotCXNib3hfa2V5WzNdID0gUlRNUENraXBTYm94KGtleVsxMl0pOwotCi0JcmNvbiA9IHJjb25fdGFibGVbcm91bmRdOwotCi0JeG9yXzMyKCZrZXlbMF0sIHNib3hfa2V5LCAma2V5WzBdKTsKLQlrZXlbMF0gPSBrZXlbMF0gXiByY29uOwotCi0JeG9yXzMyKCZrZXlbNF0sICZrZXlbMF0sICZrZXlbNF0pOwotCXhvcl8zMigma2V5WzhdLCAma2V5WzRdLCAma2V5WzhdKTsKLQl4b3JfMzIoJmtleVsxMl0sICZrZXlbOF0sICZrZXlbMTJdKTsKLX0KLQotVk9JRCB4b3JfMzIoCi0JSU4gIFBVQ0hBUiAgYSwKLQlJTiAgUFVDSEFSICBiLAotCU9VVCBQVUNIQVIgIG91dCkKLXsKLQlJTlQgaTsKLQotCWZvciAoaT0wO2k8NDsgaSsrKQotCXsKLQkJb3V0W2ldID0gYVtpXSBeIGJbaV07Ci0JfQotfQotCi1WT0lEIGJ5dGVfc3ViKAotCUlOICBQVUNIQVIgIGluLAotCU9VVCBQVUNIQVIgIG91dCkKLXsKLQlJTlQgaTsKLQotCWZvciAoaT0wOyBpPCAxNjsgaSsrKQotCXsKLQkJb3V0W2ldID0gUlRNUENraXBTYm94KGluW2ldKTsKLQl9Ci19Ci0KLVVDSEFSIFJUTVBDa2lwU2JveCgKLQlJTiAgVUNIQVIgICBhKQotewotCXJldHVybiBTYm94VGFibGVbKGludClhXTsKLX0KLQotVk9JRCBzaGlmdF9yb3coCi0JSU4gIFBVQ0hBUiAgaW4sCi0JT1VUIFBVQ0hBUiAgb3V0KQotewotCW91dFswXSA9ICBpblswXTsKLQlvdXRbMV0gPSAgaW5bNV07Ci0Jb3V0WzJdID0gIGluWzEwXTsKLQlvdXRbM10gPSAgaW5bMTVdOwotCW91dFs0XSA9ICBpbls0XTsKLQlvdXRbNV0gPSAgaW5bOV07Ci0Jb3V0WzZdID0gIGluWzE0XTsKLQlvdXRbN10gPSAgaW5bM107Ci0Jb3V0WzhdID0gIGluWzhdOwotCW91dFs5XSA9ICBpblsxM107Ci0Jb3V0WzEwXSA9IGluWzJdOwotCW91dFsxMV0gPSBpbls3XTsKLQlvdXRbMTJdID0gaW5bMTJdOwotCW91dFsxM10gPSBpblsxXTsKLQlvdXRbMTRdID0gaW5bNl07Ci0Jb3V0WzE1XSA9IGluWzExXTsKLX0KLQotVk9JRCBtaXhfY29sdW1uKAotCUlOICBQVUNIQVIgIGluLAotCU9VVCBQVUNIQVIgIG91dCkKLXsKLQlJTlQgICAgICAgICBpOwotCVVDSEFSICAgICAgIGFkZDFiWzRdOwotCVVDSEFSICAgICAgIGFkZDFiZjdbNF07Ci0JVUNIQVIgICAgICAgcm90bFs0XTsKLQlVQ0hBUiAgICAgICBzd2FwX2hhbGZzWzRdOwotCVVDSEFSICAgICAgIGFuZGY3WzRdOwotCVVDSEFSICAgICAgIHJvdHJbNF07Ci0JVUNIQVIgICAgICAgdGVtcFs0XTsKLQlVQ0hBUiAgICAgICB0ZW1wYls0XTsKLQotCWZvciAoaT0wIDsgaTw0OyBpKyspCi0JewotCQlpZiAoKGluW2ldICYgMHg4MCk9PSAweDgwKQotCQkJYWRkMWJbaV0gPSAweDFiOwotCQllbHNlCi0JCQlhZGQxYltpXSA9IDB4MDA7Ci0JfQotCi0Jc3dhcF9oYWxmc1swXSA9IGluWzJdOyAgICAvKiBTd2FwIGhhbGZzICovCi0Jc3dhcF9oYWxmc1sxXSA9IGluWzNdOwotCXN3YXBfaGFsZnNbMl0gPSBpblswXTsKLQlzd2FwX2hhbGZzWzNdID0gaW5bMV07Ci0KLQlyb3RsWzBdID0gaW5bM107ICAgICAgICAvKiBSb3RhdGUgbGVmdCA4IGJpdHMgKi8KLQlyb3RsWzFdID0gaW5bMF07Ci0Jcm90bFsyXSA9IGluWzFdOwotCXJvdGxbM10gPSBpblsyXTsKLQotCWFuZGY3WzBdID0gaW5bMF0gJiAweDdmOwotCWFuZGY3WzFdID0gaW5bMV0gJiAweDdmOwotCWFuZGY3WzJdID0gaW5bMl0gJiAweDdmOwotCWFuZGY3WzNdID0gaW5bM10gJiAweDdmOwotCi0JZm9yIChpID0gMzsgaT4wOyBpLS0pICAgIC8qIGxvZ2ljYWwgc2hpZnQgbGVmdCAxIGJpdCAqLwotCXsKLQkJYW5kZjdbaV0gPSBhbmRmN1tpXSA8PCAxOwotCQlpZiAoKGFuZGY3W2ktMV0gJiAweDgwKSA9PSAweDgwKQotCQl7Ci0JCQlhbmRmN1tpXSA9IChhbmRmN1tpXSB8IDB4MDEpOwotCQl9Ci0JfQotCWFuZGY3WzBdID0gYW5kZjdbMF0gPDwgMTsKLQlhbmRmN1swXSA9IGFuZGY3WzBdICYgMHhmZTsKLQotCXhvcl8zMihhZGQxYiwgYW5kZjcsIGFkZDFiZjcpOwotCi0JeG9yXzMyKGluLCBhZGQxYmY3LCByb3RyKTsKLQotCXRlbXBbMF0gPSByb3RyWzBdOyAgICAgICAgIC8qIFJvdGF0ZSByaWdodCA4IGJpdHMgKi8KLQlyb3RyWzBdID0gcm90clsxXTsKLQlyb3RyWzFdID0gcm90clsyXTsKLQlyb3RyWzJdID0gcm90clszXTsKLQlyb3RyWzNdID0gdGVtcFswXTsKLQotCXhvcl8zMihhZGQxYmY3LCByb3RyLCB0ZW1wKTsKLQl4b3JfMzIoc3dhcF9oYWxmcywgcm90bCx0ZW1wYik7Ci0JeG9yXzMyKHRlbXAsIHRlbXBiLCBvdXQpOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX3dlcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF93ZXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU4MzNlNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX3dlcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDk3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JcnRtcF93ZXAuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVBhdWwgV3UJCTEwLTI4LTAyCQlJbml0aWFsCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLVVJTlQgRkNTVEFCXzMyWzI1Nl0gPQotewotCTB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4ZWUwZTYxMmMsIDB4OTkwOTUxYmEsCi0JMHgwNzZkYzQxOSwgMHg3MDZhZjQ4ZiwgMHhlOTYzYTUzNSwgMHg5ZTY0OTVhMywKLQkweDBlZGI4ODMyLCAweDc5ZGNiOGE0LCAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LAotCTB4MDliNjRjMmIsIDB4N2ViMTdjYmQsIDB4ZTdiODJkMDcsIDB4OTBiZjFkOTEsCi0JMHgxZGI3MTA2NCwgMHg2YWIwMjBmMiwgMHhmM2I5NzE0OCwgMHg4NGJlNDFkZSwKLQkweDFhZGFkNDdkLCAweDZkZGRlNGViLCAweGY0ZDRiNTUxLCAweDgzZDM4NWM3LAotCTB4MTM2Yzk4NTYsIDB4NjQ2YmE4YzAsIDB4ZmQ2MmY5N2EsIDB4OGE2NWM5ZWMsCi0JMHgxNDAxNWM0ZiwgMHg2MzA2NmNkOSwgMHhmYTBmM2Q2MywgMHg4ZDA4MGRmNSwKLQkweDNiNmUyMGM4LCAweDRjNjkxMDVlLCAweGQ1NjA0MWU0LCAweGEyNjc3MTcyLAotCTB4M2MwM2U0ZDEsIDB4NGIwNGQ0NDcsIDB4ZDIwZDg1ZmQsIDB4YTUwYWI1NmIsCi0JMHgzNWI1YThmYSwgMHg0MmIyOTg2YywgMHhkYmJiYzlkNiwgMHhhY2JjZjk0MCwKLQkweDMyZDg2Y2UzLCAweDQ1ZGY1Yzc1LCAweGRjZDYwZGNmLCAweGFiZDEzZDU5LAotCTB4MjZkOTMwYWMsIDB4NTFkZTAwM2EsIDB4YzhkNzUxODAsIDB4YmZkMDYxMTYsCi0JMHgyMWI0ZjRiNSwgMHg1NmIzYzQyMywgMHhjZmJhOTU5OSwgMHhiOGJkYTUwZiwKLQkweDI4MDJiODllLCAweDVmMDU4ODA4LCAweGM2MGNkOWIyLCAweGIxMGJlOTI0LAotCTB4MmY2ZjdjODcsIDB4NTg2ODRjMTEsIDB4YzE2MTFkYWIsIDB4YjY2NjJkM2QsCi0JMHg3NmRjNDE5MCwgMHgwMWRiNzEwNiwgMHg5OGQyMjBiYywgMHhlZmQ1MTAyYSwKLQkweDcxYjE4NTg5LCAweDA2YjZiNTFmLCAweDlmYmZlNGE1LCAweGU4YjhkNDMzLAotCTB4NzgwN2M5YTIsIDB4MGYwMGY5MzQsIDB4OTYwOWE4OGUsIDB4ZTEwZTk4MTgsCi0JMHg3ZjZhMGRiYiwgMHgwODZkM2QyZCwgMHg5MTY0NmM5NywgMHhlNjYzNWMwMSwKLQkweDZiNmI1MWY0LCAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLAotCTB4NmMwNjk1ZWQsIDB4MWIwMWE1N2IsIDB4ODIwOGY0YzEsIDB4ZjUwZmM0NTcsCi0JMHg2NWIwZDljNiwgMHgxMmI3ZTk1MCwgMHg4YmJlYjhlYSwgMHhmY2I5ODg3YywKLQkweDYyZGQxZGRmLCAweDE1ZGEyZDQ5LCAweDhjZDM3Y2YzLCAweGZiZDQ0YzY1LAotCTB4NGRiMjYxNTgsIDB4M2FiNTUxY2UsIDB4YTNiYzAwNzQsIDB4ZDRiYjMwZTIsCi0JMHg0YWRmYTU0MSwgMHgzZGQ4OTVkNywgMHhhNGQxYzQ2ZCwgMHhkM2Q2ZjRmYiwKLQkweDQzNjllOTZhLCAweDM0NmVkOWZjLCAweGFkNjc4ODQ2LCAweGRhNjBiOGQwLAotCTB4NDQwNDJkNzMsIDB4MzMwMzFkZTUsIDB4YWEwYTRjNWYsIDB4ZGQwZDdjYzksCi0JMHg1MDA1NzEzYywgMHgyNzAyNDFhYSwgMHhiZTBiMTAxMCwgMHhjOTBjMjA4NiwKLQkweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmLAotCTB4NWVkZWY5MGUsIDB4MjlkOWM5OTgsIDB4YjBkMDk4MjIsIDB4YzdkN2E4YjQsCi0JMHg1OWIzM2QxNywgMHgyZWI0MGQ4MSwgMHhiN2JkNWMzYiwgMHhjMGJhNmNhZCwKLQkweGVkYjg4MzIwLCAweDlhYmZiM2I2LCAweDAzYjZlMjBjLCAweDc0YjFkMjlhLAotCTB4ZWFkNTQ3MzksIDB4OWRkMjc3YWYsIDB4MDRkYjI2MTUsIDB4NzNkYzE2ODMsCi0JMHhlMzYzMGIxMiwgMHg5NDY0M2I4NCwgMHgwZDZkNmEzZSwgMHg3YTZhNWFhOCwKLQkweGU0MGVjZjBiLCAweDkzMDlmZjlkLCAweDBhMDBhZTI3LCAweDdkMDc5ZWIxLAotCTB4ZjAwZjkzNDQsIDB4ODcwOGEzZDIsIDB4MWUwMWYyNjgsIDB4NjkwNmMyZmUsCi0JMHhmNzYyNTc1ZCwgMHg4MDY1NjdjYiwgMHgxOTZjMzY3MSwgMHg2ZTZiMDZlNywKLQkweGZlZDQxYjc2LCAweDg5ZDMyYmUwLCAweDEwZGE3YTVhLCAweDY3ZGQ0YWNjLAotCTB4ZjliOWRmNmYsIDB4OGViZWVmZjksIDB4MTdiN2JlNDMsIDB4NjBiMDhlZDUsCi0JMHhkNmQ2YTNlOCwgMHhhMWQxOTM3ZSwgMHgzOGQ4YzJjNCwgMHg0ZmRmZjI1MiwKLQkweGQxYmI2N2YxLCAweGE2YmM1NzY3LCAweDNmYjUwNmRkLCAweDQ4YjIzNjRiLAotCTB4ZDgwZDJiZGEsIDB4YWYwYTFiNGMsIDB4MzYwMzRhZjYsIDB4NDEwNDdhNjAsCi0JMHhkZjYwZWZjMywgMHhhODY3ZGY1NSwgMHgzMTZlOGVlZiwgMHg0NjY5YmU3OSwKLQkweGNiNjFiMzhjLCAweGJjNjY4MzFhLCAweDI1NmZkMmEwLCAweDUyNjhlMjM2LAotCTB4Y2MwYzc3OTUsIDB4YmIwYjQ3MDMsIDB4MjIwMjE2YjksIDB4NTUwNTI2MmYsCi0JMHhjNWJhM2JiZSwgMHhiMmJkMGIyOCwgMHgyYmI0NWE5MiwgMHg1Y2IzNmEwNCwKLQkweGMyZDdmZmE3LCAweGI1ZDBjZjMxLCAweDJjZDk5ZThiLCAweDViZGVhZTFkLAotCTB4OWI2NGMyYjAsIDB4ZWM2M2YyMjYsIDB4NzU2YWEzOWMsIDB4MDI2ZDkzMGEsCi0JMHg5YzA5MDZhOSwgMHhlYjBlMzYzZiwgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMywKLQkweDk1YmY0YTgyLCAweGUyYjg3YTE0LCAweDdiYjEyYmFlLCAweDBjYjYxYjM4LAotCTB4OTJkMjhlOWIsIDB4ZTVkNWJlMGQsIDB4N2NkY2VmYjcsIDB4MGJkYmRmMjEsCi0JMHg4NmQzZDJkNCwgMHhmMWQ0ZTI0MiwgMHg2OGRkYjNmOCwgMHgxZmRhODM2ZSwKLQkweDgxYmUxNmNkLCAweGY2YjkyNjViLCAweDZmYjA3N2UxLCAweDE4Yjc0Nzc3LAotCTB4ODgwODVhZTYsIDB4ZmYwZjZhNzAsIDB4NjYwNjNiY2EsIDB4MTEwMTBiNWMsCi0JMHg4ZjY1OWVmZiwgMHhmODYyYWU2OSwgMHg2MTZiZmZkMywgMHgxNjZjY2Y0NSwKLQkweGEwMGFlMjc4LCAweGQ3MGRkMmVlLCAweDRlMDQ4MzU0LCAweDM5MDNiM2MyLAotCTB4YTc2NzI2NjEsIDB4ZDA2MDE2ZjcsIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsCi0JMHhhZWQxNmE0YSwgMHhkOWQ2NWFkYywgMHg0MGRmMGI2NiwgMHgzN2Q4M2JmMCwKLQkweGE5YmNhZTUzLCAweGRlYmI5ZWM1LCAweDQ3YjJjZjdmLCAweDMwYjVmZmU5LAotCTB4YmRiZGYyMWMsIDB4Y2FiYWMyOGEsIDB4NTNiMzkzMzAsIDB4MjRiNGEzYTYsCi0JMHhiYWQwMzYwNSwgMHhjZGQ3MDY5MywgMHg1NGRlNTcyOSwgMHgyM2Q5NjdiZiwKLQkweGIzNjY3YTJlLCAweGM0NjE0YWI4LCAweDVkNjgxYjAyLCAweDJhNmYyYjk0LAotCTB4YjQwYmJlMzcsIDB4YzMwYzhlYTEsIDB4NWEwNWRmMWIsIDB4MmQwMmVmOGQKLX07Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlJbml0IFdFUCBmdW5jdGlvbi4KLQotCUFyZ3VtZW50czoKLSAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwS2V5ICAgICAgICBQb2ludGVyIHRvIHRoZSBXRVAgS0VZCi0JCUtleUlkCQkgICBXRVAgS2V5IElECi0JCUtleUxlbiAgICAgIHRoZSBsZW5ndGggb2YgV0VQIEtFWQotCQlwRGVzdCAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB3aGljaCBFbmNyeXB0aW9uIGRhdGEgd2lsbCBzdG9yZSBpbi4KLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QSW5pdFdlcEVuZ2luZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwS2V5LAotCUlOCVVDSEFSCQkJS2V5SWQsCi0JSU4JVUNIQVIJCQlLZXlMZW4sCi0JSU4gT1VUCVBVQ0hBUgkJcERlc3QpCi17Ci0JVUlOVCBpOwotCVVDSEFSICAgV0VQS0VZW10gPSB7Ci0JCS8vSVYKLQkJMHgwMCwgMHgxMSwgMHgyMiwKLQkJLy9XRVAgS0VZCi0JCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MKLQl9OwotCi0JcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFBQUElOSVRGQ1MzMjsgICAvL0luaXQgY3JjMzIuCi0KLSAgICBpZiAocEFkLT5TdGFDZmcuYkNraXBPbiAmJiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDEwKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCi0gICAgewotICAgICAgICBBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcEtleSwgS2V5TGVuKTsgIC8vSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikKLSAgICAgICAgTmRpc01vdmVNZW1vcnkocERlc3QsIHBLZXksIDMpOyAgLy9BcHBlbmQgSW5pdCBWZWN0b3IKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkJTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEtleSwgS2V5TGVuKTsKLQotICAgICAgICBmb3IoaSA9IDA7IGkgPCAzOyBpKyspCi0JCQlXRVBLRVlbaV0gPSBSYW5kb21CeXRlKHBBZCk7ICAgLy9DYWxsIG1sbWUgUmFuZG9tQnl0ZSgpIGZ1bmN0aW9uLgotCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgV0VQS0VZLCBLZXlMZW4gKyAzKTsgIC8vSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikKLQotCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgV0VQS0VZLCAzKTsgIC8vQXBwZW5kIEluaXQgVmVjdG9yCi0gICAgfQotCSoocERlc3QrMykgPSAoS2V5SWQgPDwgNik7ICAgICAgIC8vQXBwZW5kIEtFWUlECi0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUVuY3J5cHQgdHJhbnNpbWl0dGVkIGRhdGEKLQotCUFyZ3VtZW50czoKLSAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotICAgICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgdHJhbnNpbWl0dGVkIHNvdXJjZSBkYXRhIHRoYXQgd2lsbCBiZSBlbmNyeXB0Ci0gICAgICBwRGVzdCAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB3aGVyZSBlbnRyeXB0aW9uIGRhdGEgd2lsbCBiZSBzdG9yZSBpbi4KLSAgICAgIExlbgkJCUluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBkYXRhCi0KLQlSZXR1cm4gVmFsdWU6Ci0gICAgICBOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBFbmNyeXB0RGF0YSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwU3JjLAotCUlOCVBVQ0hBUgkJCXBEZXN0LAotCUlOCVVJTlQJCQlMZW4pCi17Ci0JcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCBwU3JjLCBMZW4pOwotCUFSQ0ZPVVJfRU5DUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBwRGVzdCwgcFNyYywgTGVuKTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJRGVjcnlwdCByZWNlaXZlZCBXRVAgZGF0YQotCi0JQXJndW1lbnRzOgotCQlwQWRhcHRlcgkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBkYXRhCi0JCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJlY2VpdmVkIGRhdGEKLQotCVJldHVybiBWYWx1ZToKLQkJVFJVRSAgICAgICAgRGVjcnlwdCBXRVAgZGF0YSBzdWNjZXNzCi0JCUZBTFNFICAgICAgIERlY3J5cHQgV0VQIGRhdGEgZmFpbGVkCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTglSVE1QU29mdERlY3J5cHRXRVAoCi0JSU4gUFJUTVBfQURBUFRFUiAJcEFkLAotCUlOIFBVQ0hBUgkJCXBEYXRhLAotCUlOIFVMT05HCQkJRGF0YUJ5dGVDbnQsCi0JSU4gUENJUEhFUl9LRVkJCXBHcm91cEtleSkKLXsKLQlVSU5UCXRyYWlsZmNzOwotCVVJTlQgICAgY3JjMzI7Ci0JVUNIQVIJS2V5SWR4OwotCVVDSEFSICAgV0VQS0VZW10gPSB7Ci0JCS8vSVYKLQkJMHgwMCwgMHgxMSwgMHgyMiwKLQkJLy9XRVAgS0VZCi0JCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MKLQl9OwotCVVDSEFSIAkqcFBheWxvYWQgPSAoVUNIQVIgKilwRGF0YSArIExFTkdUSF84MDJfMTE7Ci0JVUxPTkcJcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIExFTkdUSF84MDJfMTE7Ci0KLQlOZGlzTW92ZU1lbW9yeShXRVBLRVksIHBQYXlsb2FkLCAzKTsgICAgLy9HZXQgV0VQIElWCi0KLQlLZXlJZHggPSAoKihwUGF5bG9hZCArIDMpICYgMHhjMCkgPj4gNjsKLQlpZiAocEdyb3VwS2V5W0tleUlkeF0uS2V5TGVuID09IDApCi0JCXJldHVybiAoRkFMU0UpOwotCi0JTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEdyb3VwS2V5W0tleUlkeF0uS2V5LCBwR3JvdXBLZXlbS2V5SWR4XS5LZXlMZW4pOwotCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBXRVBLRVksIHBHcm91cEtleVtLZXlJZHhdLktleUxlbiArIDMpOwotCUFSQ0ZPVVJfREVDUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBwUGF5bG9hZCwgcFBheWxvYWQgKyA0LCBwYXlsb2FkX2xlbiAtIDQpOwotCU5kaXNNb3ZlTWVtb3J5KCZ0cmFpbGZjcywgcFBheWxvYWQgKyBwYXlsb2FkX2xlbiAtIDgsIDQpOwotCWNyYzMyID0gUlRNUF9DQUxDX0ZDUzMyKFBQUElOSVRGQ1MzMiwgcFBheWxvYWQsIHBheWxvYWRfbGVuIC0gOCk7ICAvL1NraXAgbGFzdCA0IGJ5dGVzKEZDUykuCi0JY3JjMzIgXj0gMHhmZmZmZmZmZjsgICAgICAgICAgICAgLyogY29tcGxlbWVudCAqLwotCi0gICAgaWYoY3JjMzIgIT0gY3B1MmxlMzIodHJhaWxmY3MpKQotICAgIHsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISBXRVAgRGF0YSBDUkMgRXJyb3IgIVxuIikpOwkgLy9DUkMgZXJyb3IuCi0JCXJldHVybiAoRkFMU0UpOwotCX0KLQlyZXR1cm4gKFRSVUUpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0gIkFSQ0ZPVVIiIGluaXRpYWxpemUKLQotCUFyZ3VtZW50czoKLQkgICBDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKLQkJcEtleSAgICAgICAgUG9pbnRlciB0byB0aGUgV0VQIEtFWQotCQlLZXlMZW4gICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIGZvIHRoZSBXRVAgS0VZCi0KLQlSZXR1cm4gVmFsdWU6Ci0JICAgTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlBUkNGT1VSX0lOSVQoCi0JSU4JUEFSQ0ZPVVJDT05URVhUCUN0eCwKLQlJTglQVUNIQVIJCQlwS2V5LAotCUlOCVVJTlQJCQlLZXlMZW4pCi17Ci0JVUNIQVIJdCwgdTsKLQlVSU5UCWtleWluZGV4OwotCVVJTlQJc3RhdGVpbmRleDsKLQlQVUNIQVIJc3RhdGU7Ci0JVUlOVAljb3VudGVyOwotCi0Jc3RhdGUgPSBDdHgtPlNUQVRFOwotCUN0eC0+WCA9IDA7Ci0JQ3R4LT5ZID0gMDsKLQlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMjU2OyBjb3VudGVyKyspCi0JCXN0YXRlW2NvdW50ZXJdID0gKFVDSEFSKWNvdW50ZXI7Ci0Ja2V5aW5kZXggPSAwOwotCXN0YXRlaW5kZXggPSAwOwotCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCAyNTY7IGNvdW50ZXIrKykKLQl7Ci0JCXQgPSBzdGF0ZVtjb3VudGVyXTsKLQkJc3RhdGVpbmRleCA9IChzdGF0ZWluZGV4ICsgcEtleVtrZXlpbmRleF0gKyB0KSAmIDB4ZmY7Ci0JCXUgPSBzdGF0ZVtzdGF0ZWluZGV4XTsKLQkJc3RhdGVbc3RhdGVpbmRleF0gPSB0OwotCQlzdGF0ZVtjb3VudGVyXSA9IHU7Ci0JCWlmICgrK2tleWluZGV4ID49IEtleUxlbikKLQkJCWtleWluZGV4ID0gMDsKLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlHZXQgYnl0ZXMgZnJvbSBBUkNGT1VSIENPTlRFWFQgKFMtQk9YKQotCi0JQXJndW1lbnRzOgotCSAgIEN0eCAgICAgICAgIFBvaW50ZXIgdG8gQVJDRk9VUiBDT05URVhUIChTQk9YKQotCi0JUmV0dXJuIFZhbHVlOgotCSAgIFVDSEFSICAtIHRoZSB2YWx1ZSBvZiB0aGUgQVJDRk9VUiBDT05URVhUIChTLUJPWCkKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQ0hBUglBUkNGT1VSX0JZVEUoCi0JSU4JUEFSQ0ZPVVJDT05URVhUCQlDdHgpCi17Ci0gIFVJTlQgeDsKLSAgVUlOVCB5OwotICBVQ0hBUiBzeCwgc3k7Ci0gIFBVQ0hBUiBzdGF0ZTsKLQotICBzdGF0ZSA9IEN0eC0+U1RBVEU7Ci0gIHggPSAoQ3R4LT5YICsgMSkgJiAweGZmOwotICBzeCA9IHN0YXRlW3hdOwotICB5ID0gKHN4ICsgQ3R4LT5ZKSAmIDB4ZmY7Ci0gIHN5ID0gc3RhdGVbeV07Ci0gIEN0eC0+WCA9IHg7Ci0gIEN0eC0+WSA9IHk7Ci0gIHN0YXRlW3ldID0gc3g7Ci0gIHN0YXRlW3hdID0gc3k7Ci0KLSAgcmV0dXJuKHN0YXRlWyhzeCArIHN5KSAmIDB4ZmZdKTsKLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJVGhlIFN0cmVhbSBDaXBoZXIgRGVjcnlwdGlvbiBBbGdvcml0aG0KLQotCUFyZ3VtZW50czoKLQkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCi0JCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KLQkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKLQkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGRhdGEKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJQVJDRk9VUl9ERUNSWVBUKAotCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCi0JSU4JUFVDSEFSCQkJcERlc3QsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglVSU5UCQkJTGVuKQotewotCVVJTlQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKLQkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobQotCi0JQXJndW1lbnRzOgotCQlDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKLQkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgotCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSBTb3VyY2UgZGF0YQotCQlMZW4gICAgICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBTb3VyY2UgZHRhCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJQVJDRk9VUl9FTkNSWVBUKAotCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCi0JSU4JUFVDSEFSCQkJcERlc3QsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglVSU5UCQkJTGVuKQotewotCVVJTlQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKLQkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobSB3aGljaCBjb25mb3JtIHRvIHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50IHRvIGVuY3J5cHQgIEdUSy4KLQotCUFyZ3VtZW50czoKLQkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCi0JCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KLQkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKLQkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGR0YQotCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0KLVZPSUQJV1BBQVJDRk9VUl9FTkNSWVBUKAotCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCi0JSU4JUFVDSEFSCQkJcERlc3QsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglVSU5UCQkJTGVuKQotewotCVVJTlQgaTsKLSAgICAgICAgLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcwotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICAgICAgICAgIEFSQ0ZPVVJfQllURShDdHgpOwotCi0JZm9yIChpID0gMDsgaSA8IExlbjsgaSsrKQotCQlwRGVzdFtpXSA9IHBTcmNbaV0gXiBBUkNGT1VSX0JZVEUoQ3R4KTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJQ2FsY3VsYXRlIGEgbmV3IEZDUyBnaXZlbiB0aGUgY3VycmVudCBGQ1MgYW5kIHRoZSBuZXcgZGF0YS4KLQotCUFyZ3VtZW50czoKLQkJRmNzCSAgICAgIHRoZSBvcmlnaW5hbCBGQ1MgdmFsdWUKLQkJQ3AgICAgICAgICAgcG9pbnRlciB0byB0aGUgZGF0YSB3aGljaCB3aWxsIGJlIGNhbGN1bGF0ZSB0aGUgRkNTCi0JCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEKLQotCVJldHVybiBWYWx1ZToKLQkJVUlOVCAtIEZDUyAzMiBiaXRzCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VSU5UCVJUTVBfQ0FMQ19GQ1MzMigKLQlJTglVSU5UCUZjcywKLQlJTglQVUNIQVIJQ3AsCi0JSU4JSU5UCQlMZW4pCi17Ci0Jd2hpbGUgKExlbi0tKQotCSAgIEZjcyA9ICgoKEZjcykgPj4gOCkgXiBGQ1NUQUJfMzJbKChGY3MpIF4gKCpDcCsrKSkgJiAweGZmXSk7Ci0KLQlyZXR1cm4gKEZjcyk7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUdldCBsYXN0IEZDUyBhbmQgZW5jcnlwdCBpdCB0byB0aGUgZGVzdGluYXRpb24KLQotCUFyZ3VtZW50czoKLQkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QU2V0SUNWKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUglwRGVzdCkKLXsKLQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyIF49IDB4ZmZmZmZmZmY7ICAgICAgICAgICAgIC8qIGNvbXBsZW1lbnQgKi8KLQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gY3B1MmxlMzIocEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMik7Ci0KLQlBUkNGT1VSX0VOQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcERlc3QsIChQVUNIQVIpICZwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCA0KTsKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vc3BlY3RydW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3NwZWN0cnVtLmMKaW5kZXggYzY1OGJmMy4uNTFlMzhkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vc3BlY3RydW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9zcGVjdHJ1bS5jCkBAIC0yNCw3ICsyNCw2IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotCiAgICAgTW9kdWxlIE5hbWU6CiAJYWN0aW9uLmMKIApAQCAtNDAsMjQgKzM5LDM4MiBAQAogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogI2luY2x1ZGUgImFjdGlvbi5oIgogCi1WT0lEIE1lYXN1cmVSZXFUYWJJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQorLyogVGhlIHJlZ3VsYXRvcnkgaW5mb3JtYXRpb24gaW4gdGhlIFVTQSAoVVMpICovCitzdHJ1Y3QgcnRfZG90MTFfcmVndWxhdG9yeV9pbmZvcm1hdGlvbiBVU0FSZWd1bGF0b3J5SW5mb1tdID0geworLyogICJyZWd1bGF0b3J5IGNsYXNzIiAgIm51bWJlciBvZiBjaGFubmVscyIgICJNYXggVHggUHdyIiAgImNoYW5uZWwgbGlzdCIgKi8KKwl7MCwgezAsIDAsIHswfQorCSAgICAgfQorCSB9CisJLAkJCS8qIEludmxpZCBlbnRyeSAqLworCXsxLCB7NCwgMTYsIHszNiwgNDAsIDQ0LCA0OH0KKwkgICAgIH0KKwkgfQorCSwKKwl7MiwgezQsIDIzLCB7NTIsIDU2LCA2MCwgNjR9CisJICAgICB9CisJIH0KKwksCisJezMsIHs0LCAyOSwgezE0OSwgMTUzLCAxNTcsIDE2MX0KKwkgICAgIH0KKwkgfQorCSwKKwl7NCwgezExLCAyMywgezEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfQorCSAgICAgfQorCSB9CisJLAorCXs1LCB7NSwgMzAsIHsxNDksIDE1MywgMTU3LCAxNjEsIDE2NX0KKwkgICAgIH0KKwkgfQorCSwKKwl7NiwgezEwLCAxNCwgezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfQorCSAgICAgfQorCSB9CisJLAorCXs3LCB7MTAsIDI3LCB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTB9CisJICAgICB9CisJIH0KKwksCisJezgsIHs1LCAxNywgezExLCAxMywgMTUsIDE3LCAxOX0KKwkgICAgIH0KKwkgfQorCSwKKwl7OSwgezUsIDMwLCB7MTEsIDEzLCAxNSwgMTcsIDE5fQorCSAgICAgfQorCSB9CisJLAorCXsxMCwgezIsIDIwLCB7MjEsIDI1fQorCSAgICAgIH0KKwkgfQorCSwKKwl7MTEsIHsyLCAzMywgezIxLCAyNX0KKwkgICAgICB9CisJIH0KKwksCisJezEyLCB7MTEsIDMwLCB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExfQorCSAgICAgIH0KKwkgfQorfTsKKworI2RlZmluZSBVU0FfUkVHVUxBVE9SWV9JTkZPX1NJWkUgKHNpemVvZihVU0FSZWd1bGF0b3J5SW5mbykgLyBzaXplb2Yoc3RydWN0IHJ0X2RvdDExX3JlZ3VsYXRvcnlfaW5mb3JtYXRpb24pKQorCisvKiBUaGUgcmVndWxhdG9yeSBpbmZvcm1hdGlvbiBpbiBFdXJvcGUgKi8KK3N0cnVjdCBydF9kb3QxMV9yZWd1bGF0b3J5X2luZm9ybWF0aW9uIEV1cm9wZVJlZ3VsYXRvcnlJbmZvW10gPSB7CisvKiAgInJlZ3VsYXRvcnkgY2xhc3MiICAibnVtYmVyIG9mIGNoYW5uZWxzIiAgIk1heCBUeCBQd3IiICAiY2hhbm5lbCBsaXN0IiAqLworCXswLCB7MCwgMCwgezB9CisJICAgICB9CisJIH0KKwksCQkJLyogSW52YWxpZCBlbnRyeSAqLworCXsxLCB7NCwgMjAsIHszNiwgNDAsIDQ0LCA0OH0KKwkgICAgIH0KKwkgfQorCSwKKwl7MiwgezQsIDIwLCB7NTIsIDU2LCA2MCwgNjR9CisJICAgICB9CisJIH0KKwksCisJezMsIHsxMSwgMzAsIHsxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH0KKwkgICAgIH0KKwkgfQorCSwKKwl7NCwgezEzLCAyMCwgezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzfQorCSAgICAgfQorCSB9Cit9OworCisjZGVmaW5lIEVVX1JFR1VMQVRPUllfSU5GT19TSVpFIChzaXplb2YoRXVyb3BlUmVndWxhdG9yeUluZm8pIC8gc2l6ZW9mKHN0cnVjdCBydF9kb3QxMV9yZWd1bGF0b3J5X2luZm9ybWF0aW9uKSkKKworLyogVGhlIHJlZ3VsYXRvcnkgaW5mb3JtYXRpb24gaW4gSmFwYW4gKi8KK3N0cnVjdCBydF9kb3QxMV9yZWd1bGF0b3J5X2luZm9ybWF0aW9uIEphcGFuUmVndWxhdG9yeUluZm9bXSA9IHsKKy8qICAicmVndWxhdG9yeSBjbGFzcyIgICJudW1iZXIgb2YgY2hhbm5lbHMiICAiTWF4IFR4IFB3ciIgICJjaGFubmVsIGxpc3QiICovCisJezAsIHswLCAwLCB7MH0KKwkgICAgIH0KKwkgfQorCSwJCQkvKiBJbnZhbGlkIGVudHJ5ICovCisJezEsIHs0LCAyMiwgezM0LCAzOCwgNDIsIDQ2fQorCSAgICAgfQorCSB9CisJLAorCXsyLCB7MywgMjQsIHs4LCAxMiwgMTZ9CisJICAgICB9CisJIH0KKwksCisJezMsIHszLCAyNCwgezgsIDEyLCAxNn0KKwkgICAgIH0KKwkgfQorCSwKKwl7NCwgezMsIDI0LCB7OCwgMTIsIDE2fQorCSAgICAgfQorCSB9CisJLAorCXs1LCB7MywgMjQsIHs4LCAxMiwgMTZ9CisJICAgICB9CisJIH0KKwksCisJezYsIHszLCAyMiwgezgsIDEyLCAxNn0KKwkgICAgIH0KKwkgfQorCSwKKwl7NywgezQsIDI0LCB7MTg0LCAxODgsIDE5MiwgMTk2fQorCSAgICAgfQorCSB9CisJLAorCXs4LCB7NCwgMjQsIHsxODQsIDE4OCwgMTkyLCAxOTZ9CisJICAgICB9CisJIH0KKwksCisJezksIHs0LCAyNCwgezE4NCwgMTg4LCAxOTIsIDE5Nn0KKwkgICAgIH0KKwkgfQorCSwKKwl7MTAsIHs0LCAyNCwgezE4NCwgMTg4LCAxOTIsIDE5Nn0KKwkgICAgICB9CisJIH0KKwksCisJezExLCB7NCwgMjIsIHsxODQsIDE4OCwgMTkyLCAxOTZ9CisJICAgICAgfQorCSB9CisJLAorCXsxMiwgezQsIDI0LCB7NywgOCwgOSwgMTF9CisJICAgICAgfQorCSB9CisJLAorCXsxMywgezQsIDI0LCB7NywgOCwgOSwgMTF9CisJICAgICAgfQorCSB9CisJLAorCXsxNCwgezQsIDI0LCB7NywgOCwgOSwgMTF9CisJICAgICAgfQorCSB9CisJLAorCXsxNSwgezQsIDI0LCB7NywgOCwgOSwgMTF9CisJICAgICAgfQorCSB9CisJLAorCXsxNiwgezYsIDI0LCB7MTgzLCAxODQsIDE4NSwgMTg3LCAxODgsIDE4OX0KKwkgICAgICB9CisJIH0KKwksCisJezE3LCB7NiwgMjQsIHsxODMsIDE4NCwgMTg1LCAxODcsIDE4OCwgMTg5fQorCSAgICAgIH0KKwkgfQorCSwKKwl7MTgsIHs2LCAyNCwgezE4MywgMTg0LCAxODUsIDE4NywgMTg4LCAxODl9CisJICAgICAgfQorCSB9CisJLAorCXsxOSwgezYsIDI0LCB7MTgzLCAxODQsIDE4NSwgMTg3LCAxODgsIDE4OX0KKwkgICAgICB9CisJIH0KKwksCisJezIwLCB7NiwgMTcsIHsxODMsIDE4NCwgMTg1LCAxODcsIDE4OCwgMTg5fQorCSAgICAgIH0KKwkgfQorCSwKKwl7MjEsIHs2LCAyNCwgezYsIDcsIDgsIDksIDEwLCAxMX0KKwkgICAgICB9CisJIH0KKwksCisJezIyLCB7NiwgMjQsIHs2LCA3LCA4LCA5LCAxMCwgMTF9CisJICAgICAgfQorCSB9CisJLAorCXsyMywgezYsIDI0LCB7NiwgNywgOCwgOSwgMTAsIDExfQorCSAgICAgIH0KKwkgfQorCSwKKwl7MjQsIHs2LCAyNCwgezYsIDcsIDgsIDksIDEwLCAxMX0KKwkgICAgICB9CisJIH0KKwksCisJezI1LCB7OCwgMjQsIHsxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OX0KKwkgICAgICB9CisJIH0KKwksCisJezI2LCB7OCwgMjQsIHsxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OX0KKwkgICAgICB9CisJIH0KKwksCisJezI3LCB7OCwgMjQsIHsxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OX0KKwkgICAgICB9CisJIH0KKwksCisJezI4LCB7OCwgMjQsIHsxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OX0KKwkgICAgICB9CisJIH0KKwksCisJezI5LCB7OCwgMTcsIHsxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OX0KKwkgICAgICB9CisJIH0KKwksCisJezMwLCB7MTMsIDIzLCB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTN9CisJICAgICAgfQorCSB9CisJLAorCXszMSwgezEsIDIzLCB7MTR9CisJICAgICAgfQorCSB9CisJLAorCXszMiwgezQsIDIyLCB7NTIsIDU2LCA2MCwgNjR9CisJICAgICAgfQorCSB9Cit9OworCisjZGVmaW5lIEpQX1JFR1VMQVRPUllfSU5GT19TSVpFIChzaXplb2YoSmFwYW5SZWd1bGF0b3J5SW5mbykgLyBzaXplb2Yoc3RydWN0IHJ0X2RvdDExX3JlZ3VsYXRvcnlfaW5mb3JtYXRpb24pKQorCitjaGFyIFJUTVBfR2V0VHhQd3Ioc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBIVFRSQU5TTUlUX1NFVFRJTkcgSFRUeE1vZGUpCit7CisJc3RydWN0IHR4X3B3cl9jZmcgeworCQl1OCBNb2RlOworCQl1OCBNQ1M7CisJCXUxNiByZXE7CisJCXU4IHNoaWZ0OworCQl1MzIgQml0TWFzazsKKwl9OworCisJdTMyIFZhbHVlOworCWludCBJZHg7CisJdTggUGh5TW9kZTsKKwljaGFyIEN1clR4UHdyOworCXU4IFR4UHdyUmVmID0gMDsKKwljaGFyIERhbHRhUHdyOworCXVuc2lnbmVkIGxvbmcgVHhQd3JbNV07CisKKwlzdHJ1Y3QgdHhfcHdyX2NmZyBUeFB3ckNmZ1tdID0geworCQl7TU9ERV9DQ0ssIDAsIDAsIDQsIDB4MDAwMDAwZjB9LAorCQl7TU9ERV9DQ0ssIDEsIDAsIDAsIDB4MDAwMDAwMGZ9LAorCQl7TU9ERV9DQ0ssIDIsIDAsIDEyLCAweDAwMDBmMDAwfSwKKwkJe01PREVfQ0NLLCAzLCAwLCA4LCAweDAwMDAwZjAwfSwKKworCQl7TU9ERV9PRkRNLCAwLCAwLCAyMCwgMHgwMGYwMDAwMH0sCisJCXtNT0RFX09GRE0sIDEsIDAsIDE2LCAweDAwMGYwMDAwfSwKKwkJe01PREVfT0ZETSwgMiwgMCwgMjgsIDB4ZjAwMDAwMDB9LAorCQl7TU9ERV9PRkRNLCAzLCAwLCAyNCwgMHgwZjAwMDAwMH0sCisJCXtNT0RFX09GRE0sIDQsIDEsIDQsIDB4MDAwMDAwZjB9LAorCQl7TU9ERV9PRkRNLCA1LCAxLCAwLCAweDAwMDAwMDBmfSwKKwkJe01PREVfT0ZETSwgNiwgMSwgMTIsIDB4MDAwMGYwMDB9LAorCQl7TU9ERV9PRkRNLCA3LCAxLCA4LCAweDAwMDAwZjAwfQorCQksIHtNT0RFX0hUTUlYLCAwLCAxLCAyMCwgMHgwMGYwMDAwMH0sCisJCXtNT0RFX0hUTUlYLCAxLCAxLCAxNiwgMHgwMDBmMDAwMH0sCisJCXtNT0RFX0hUTUlYLCAyLCAxLCAyOCwgMHhmMDAwMDAwMH0sCisJCXtNT0RFX0hUTUlYLCAzLCAxLCAyNCwgMHgwZjAwMDAwMH0sCisJCXtNT0RFX0hUTUlYLCA0LCAyLCA0LCAweDAwMDAwMGYwfSwKKwkJe01PREVfSFRNSVgsIDUsIDIsIDAsIDB4MDAwMDAwMGZ9LAorCQl7TU9ERV9IVE1JWCwgNiwgMiwgMTIsIDB4MDAwMGYwMDB9LAorCQl7TU9ERV9IVE1JWCwgNywgMiwgOCwgMHgwMDAwMGYwMH0sCisJCXtNT0RFX0hUTUlYLCA4LCAyLCAyMCwgMHgwMGYwMDAwMH0sCisJCXtNT0RFX0hUTUlYLCA5LCAyLCAxNiwgMHgwMDBmMDAwMH0sCisJCXtNT0RFX0hUTUlYLCAxMCwgMiwgMjgsIDB4ZjAwMDAwMDB9LAorCQl7TU9ERV9IVE1JWCwgMTEsIDIsIDI0LCAweDBmMDAwMDAwfSwKKwkJe01PREVfSFRNSVgsIDEyLCAzLCA0LCAweDAwMDAwMGYwfSwKKwkJe01PREVfSFRNSVgsIDEzLCAzLCAwLCAweDAwMDAwMDBmfSwKKwkJe01PREVfSFRNSVgsIDE0LCAzLCAxMiwgMHgwMDAwZjAwMH0sCisJCXtNT0RFX0hUTUlYLCAxNSwgMywgOCwgMHgwMDAwMGYwMH0KKwl9OworI2RlZmluZSBNQVhfVFhQV1JfVEFCX1NJWkUgKHNpemVvZihUeFB3ckNmZykgLyBzaXplb2Yoc3RydWN0IHR4X3B3cl9jZmcpKQorCisJQ3VyVHhQd3IgPSAxOTsKKworCS8qIGNoZWNrIFR4IFBvd2VyIHNldHRpbmcgZnJvbSBVSS4gKi8KKwlpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5MCkgOworCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gNjApCS8qIHJlZHVjZSBQd3IgZm9yIDEgZEIuICovCisJCUN1clR4UHdyIC09IDE7CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiAzMCkJLyogcmVkdWNlIFB3ciBmb3IgMyBkQi4gKi8KKwkJQ3VyVHhQd3IgLT0gMzsKKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDE1KQkvKiByZWR1Y2UgUHdyIGZvciA2IGRCLiAqLworCQlDdXJUeFB3ciAtPSA2OworCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOSkJLyogcmVkdWNlIFB3ciBmb3IgOSBkQi4gKi8KKwkJQ3VyVHhQd3IgLT0gOTsKKwllbHNlCQkJLyogcmVkdWNlIFB3ciBmb3IgMTIgZEIuICovCisJCUN1clR4UHdyIC09IDEyOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkgeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiAxNCkgeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFs0XTsKKwkJfSBlbHNlIHsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbNF07CisJCX0KKwl9IGVsc2UgeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KSB7CisJCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzRdOworCQl9IGVsc2UgeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFs0XTsKKwkJfQorCX0KKworCXN3aXRjaCAoSFRUeE1vZGUuZmllbGQuTU9ERSkgeworCWNhc2UgTU9ERV9DQ0s6CisJY2FzZSBNT0RFX09GRE06CisJCVZhbHVlID0gVHhQd3JbMV07CisJCVR4UHdyUmVmID0gKFZhbHVlICYgMHgwMDAwMGYwMCkgPj4gODsKKworCQlicmVhazsKKworCWNhc2UgTU9ERV9IVE1JWDoKKwljYXNlIE1PREVfSFRHUkVFTkZJRUxEOgorCQlpZiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkgeworCQkJVmFsdWUgPSBUeFB3clsyXTsKKwkJCVR4UHdyUmVmID0gKFZhbHVlICYgMHgwMDAwMGYwMCkgPj4gODsKKwkJfSBlbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSB7CisJCQlWYWx1ZSA9IFR4UHdyWzNdOworCQkJVHhQd3JSZWYgPSAoVmFsdWUgJiAweDAwMDAwZjAwKSA+PiA4OworCQl9CisJCWJyZWFrOworCX0KKworCVBoeU1vZGUgPSAoSFRUeE1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUR1JFRU5GSUVMRCkKKwkgICAgPyBNT0RFX0hUTUlYIDogSFRUeE1vZGUuZmllbGQuTU9ERTsKKworCWZvciAoSWR4ID0gMDsgSWR4IDwgTUFYX1RYUFdSX1RBQl9TSVpFOyBJZHgrKykgeworCQlpZiAoKFR4UHdyQ2ZnW0lkeF0uTW9kZSA9PSBQaHlNb2RlKQorCQkgICAgJiYgKFR4UHdyQ2ZnW0lkeF0uTUNTID09IEhUVHhNb2RlLmZpZWxkLk1DUykpIHsKKwkJCVZhbHVlID0gVHhQd3JbVHhQd3JDZmdbSWR4XS5yZXFdOworCQkJRGFsdGFQd3IgPQorCQkJICAgIFR4UHdyUmVmIC0gKGNoYXIpKChWYWx1ZSAmIFR4UHdyQ2ZnW0lkeF0uQml0TWFzaykKKwkJCQkJICAgICAgID4+IFR4UHdyQ2ZnW0lkeF0uc2hpZnQpOworCQkJQ3VyVHhQd3IgLT0gRGFsdGFQd3I7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBDdXJUeFB3cjsKK30KKwordm9pZCBNZWFzdXJlUmVxVGFiSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7CiAJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKIAotCXBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiID0ga21hbGxvYyhzaXplb2YoTUVBU1VSRV9SRVFfVEFCKSwgR0ZQX0FUT01JQyk7CisJcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIgPQorCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfdGFiKSwgR0ZQX0FUT01JQyk7CiAJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKQotCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYiwgc2l6ZW9mKE1FQVNVUkVfUkVRX1RBQikpOworCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYiwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X21lYXN1cmVfcmVxX3RhYikpOwogCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiLlxuIiwgX19mdW5jX18pKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIlcyBGYWlsIHRvIGFsbG9jIG1lbW9yeSBmb3IgcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIuXG4iLAorCQkJICBfX2Z1bmNfXykpOwogCiAJcmV0dXJuOwogfQogCi1WT0lEIE1lYXN1cmVSZXFUYWJFeGl0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBNZWFzdXJlUmVxVGFiRXhpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JTmRpc0ZyZWVTcGluTG9jayhwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOwogCiAJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKQogCQlrZnJlZShwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYik7CkBAIC02NiwxOCArNDIzLDE2IEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgUE1FQVNVUkVfUkVRX0VOVFJZIE1lYXN1cmVSZXFMb29rVXAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3N0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeSAqTWVhc3VyZVJlcUxvb2tVcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IERpYWxvZ1Rva2VuKQogewotCVVJTlQgSGFzaElkeDsKLQlQTUVBU1VSRV9SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKLQlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKLQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJdTMyIEhhc2hJZHg7CisJc3RydWN0IHJ0X21lYXN1cmVfcmVxX3RhYiAqcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiOworCXN0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeSAqcEVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKnBQcmV2RW50cnkgPSBOVUxMOwogCi0JaWYgKHBUYWIgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKKwlpZiAocFRhYiA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTg2LDEyICs0NDEsMTAgQEAKIAlIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChEaWFsb2dUb2tlbik7CiAJcEVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKIAotCXdoaWxlIChwRW50cnkpCi0JeworCXdoaWxlIChwRW50cnkpIHsKIAkJaWYgKHBFbnRyeS0+RGlhbG9nVG9rZW4gPT0gRGlhbG9nVG9rZW4pCiAJCQlicmVhazsKLQkJZWxzZQotCQl7CisJCWVsc2UgewogCQkJcFByZXZFbnRyeSA9IHBFbnRyeTsKIAkJCXBFbnRyeSA9IHBFbnRyeS0+cE5leHQ7CiAJCX0KQEAgLTEwMiw1MCArNDU1LDQ5IEBACiAJcmV0dXJuIHBFbnRyeTsKIH0KIAotc3RhdGljIFBNRUFTVVJFX1JFUV9FTlRSWSBNZWFzdXJlUmVxSW5zZXJ0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCitzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKk1lYXN1cmVSZXFJbnNlcnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBEaWFsb2dUb2tlbikKIHsKLQlJTlQgaTsKLQlVTE9ORyBIYXNoSWR4OwotCVBNRUFTVVJFX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiOwotCVBNRUFTVVJFX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMLCBwQ3VyckVudHJ5OwotCVVMT05HIE5vdzsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIEhhc2hJZHg7CisJc3RydWN0IHJ0X21lYXN1cmVfcmVxX3RhYiAqcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiOworCXN0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeSAqcEVudHJ5ID0gTlVMTCwgKnBDdXJyRW50cnk7CisJdW5zaWduZWQgbG9uZyBOb3c7CiAKLQlpZihwVGFiID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CisJaWYgKHBUYWIgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJcEVudHJ5ID0gTWVhc3VyZVJlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKTsKLQlpZiAocEVudHJ5ID09IE5VTEwpCi0JeworCWlmIChwRW50cnkgPT0gTlVMTCkgewogCQlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkU7IGkrKykKLQkJeworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFOyBpKyspIHsKIAkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CiAJCQlwRW50cnkgPSAmcFRhYi0+Q29udGVudFtpXTsKIAogCQkJaWYgKChwRW50cnktPlZhbGlkID09IFRSVUUpCi0JCQkJJiYgUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdywgKHVuc2lnbmVkIGxvbmcpKHBFbnRyeS0+bGFzdFRpbWUgKyBNUV9SRVFfQUdFX09VVCkpKQorCQkJICAgICYmIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3csCisJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZykocEVudHJ5LT4KKwkJCQkJCQkgICAgICAgbGFzdFRpbWUgKworCQkJCQkJCSAgICAgICBNUV9SRVFfQUdFX09VVCkpKQogCQkJewotCQkJCVBNRUFTVVJFX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKLQkJCQlVTE9ORyBIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKLQkJCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCQkJCXN0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeSAqcFByZXZFbnRyeSA9IE5VTEw7CisJCQkJdW5zaWduZWQgbG9uZyBIYXNoSWR4ID0KKwkJCQkgICAgTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPgorCQkJCQkJCSAgICAgIERpYWxvZ1Rva2VuKTsKKwkJCQlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKnBQcm9iZUVudHJ5ID0KKwkJCQkgICAgcFRhYi0+SGFzaFtIYXNoSWR4XTsKIAotCQkJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKLQkJCQlkbwotCQkJCXsKLQkJCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKLQkJCQkJewotCQkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKLQkJCQkJCXsKLQkJCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJLyogdXBkYXRlIEhhc2ggbGlzdCAqLworCQkJCWRvIHsKKwkJCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkgeworCQkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkgeworCQkJCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPQorCQkJCQkJCSAgICBwRW50cnktPnBOZXh0OworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9CisJCQkJCQkJICAgIHBFbnRyeS0+cE5leHQ7CiAJCQkJCQl9CiAJCQkJCQlicmVhazsKIAkJCQkJfQpAQCAtMTU0LDcgKzUwNiw4IEBACiAJCQkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OwogCQkJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKIAotCQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKE1FQVNVUkVfUkVRX0VOVFJZKSk7CisJCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeSkpOwogCQkJCXBUYWItPlNpemUtLTsKIAogCQkJCWJyZWFrOwpAQCAtMTY0LDMwICs1MTcsMjQgQEAKIAkJCQlicmVhazsKIAkJfQogCi0JCWlmIChpIDwgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFKQotCQl7CisJCWlmIChpIDwgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFKSB7CiAJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwogCQkJcEVudHJ5LT5sYXN0VGltZSA9IE5vdzsKIAkJCXBFbnRyeS0+VmFsaWQgPSBUUlVFOwogCQkJcEVudHJ5LT5EaWFsb2dUb2tlbiA9IERpYWxvZ1Rva2VuOwogCQkJcFRhYi0+U2l6ZSsrOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJcEVudHJ5ID0gTlVMTDsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiB0YWIgZnVsbC5cbiIsIF9fZnVuY19fKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCIlczogcE1lYXN1cmVSZXFUYWIgdGFiIGZ1bGwuXG4iLCBfX2Z1bmNfXykpOwogCQl9CiAKLQkJLy8gYWRkIHRoaXMgTmVpZ2hib3IgZW50cnkgaW50byBIQVNIIHRhYmxlCi0JCWlmIChwRW50cnkpCi0JCXsKKwkJLyogYWRkIHRoaXMgTmVpZ2hib3IgZW50cnkgaW50byBIQVNIIHRhYmxlICovCisJCWlmIChwRW50cnkpIHsKIAkJCUhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKERpYWxvZ1Rva2VuKTsKLQkJCWlmIChwVGFiLT5IYXNoW0hhc2hJZHhdID09IE5VTEwpCi0JCQl7CisJCQlpZiAocFRhYi0+SGFzaFtIYXNoSWR4XSA9PSBOVUxMKSB7CiAJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKKwkJCX0gZWxzZSB7CiAJCQkJcEN1cnJFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CiAJCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCiAJCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKQEAgLTIwMSw0NSArNTQ4LDM1IEBACiAJcmV0dXJuIHBFbnRyeTsKIH0KIAotc3RhdGljIFZPSUQgTWVhc3VyZVJlcURlbGV0ZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQordm9pZCBNZWFzdXJlUmVxRGVsZXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggRGlhbG9nVG9rZW4pCiB7Ci0JUE1FQVNVUkVfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWI7Ci0JUE1FQVNVUkVfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisJc3RydWN0IHJ0X21lYXN1cmVfcmVxX3RhYiAqcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiOworCXN0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeSAqcEVudHJ5ID0gTlVMTDsKIAotCWlmKHBUYWIgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKKwlpZiAocFRhYiA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm47CiAJfQotCi0JLy8gaWYgZW1wdHksIHJldHVybgotCWlmIChwVGFiLT5TaXplID09IDApCi0JeworCS8qIGlmIGVtcHR5LCByZXR1cm4gKi8KKwlpZiAocFRhYi0+U2l6ZSA9PSAwKSB7CiAJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBNZWFzdXJlUmVxVGFiIGVtcHR5LlxuIikpOwogCQlyZXR1cm47CiAJfQogCiAJcEVudHJ5ID0gTWVhc3VyZVJlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKTsKLQlpZiAocEVudHJ5ICE9IE5VTEwpCi0JewotCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7Ci0JCVVMT05HIEhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOwotCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCWlmIChwRW50cnkgIT0gTlVMTCkgeworCQlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKnBQcmV2RW50cnkgPSBOVUxMOworCQl1bnNpZ25lZCBsb25nIEhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCQlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKnBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKIAogCQlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7Ci0JCS8vIHVwZGF0ZSBIYXNoIGxpc3QKLQkJZG8KLQkJewotCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKLQkJCXsKLQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQotCQkJCXsKKwkJLyogdXBkYXRlIEhhc2ggbGlzdCAqLworCQlkbyB7CisJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KSB7CisJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkgewogCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKKwkJCQl9IGVsc2UgewogCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMjQ5LDcgKzU4Niw3IEBACiAJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKIAkJfSB3aGlsZSAocFByb2JlRW50cnkpOwogCi0JCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKE1FQVNVUkVfUkVRX0VOVFJZKSk7CisJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKHN0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeSkpOwogCQlwVGFiLT5TaXplLS07CiAKIAkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CkBAIC0yNTgsMjQgKzU5NSwyNCBAQAogCXJldHVybjsKIH0KIAotVk9JRCBUcGNSZXFUYWJJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBUcGNSZXFUYWJJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKIAlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CiAKLQlwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiID0ga21hbGxvYyhzaXplb2YoVFBDX1JFUV9UQUIpLCBHRlBfQVRPTUlDKTsKKwlwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X3RwY19yZXFfdGFiKSwgR0ZQX0FUT01JQyk7CiAJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIpCi0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIsIHNpemVvZihUUENfUkVRX1RBQikpOworCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiLCBzaXplb2Yoc3RydWN0IHJ0X3RwY19yZXFfdGFiKSk7CiAJZWxzZQotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyBGYWlsIHRvIGFsbG9jIG1lbW9yeSBmb3IgcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYi5cbiIsIF9fZnVuY19fKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIuXG4iLAorCQkJICBfX2Z1bmNfXykpOwogCiAJcmV0dXJuOwogfQogCi1WT0lEIFRwY1JlcVRhYkV4aXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIFRwY1JlcVRhYkV4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCU5kaXNGcmVlU3BpbkxvY2socEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CiAKIAlpZiAocEFkLT5Db21tb25DZmcucFRwY1JlcVRhYikKIAkJa2ZyZWUocEFkLT5Db21tb25DZmcucFRwY1JlcVRhYik7CkBAIC0yODQsMTggKzYyMSwxNiBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIFBUUENfUkVRX0VOVFJZIFRwY1JlcUxvb2tVcCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQorc3RhdGljIHN0cnVjdCBydF90cGNfcmVxX2VudHJ5ICpUcGNSZXFMb29rVXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBEaWFsb2dUb2tlbikKIHsKLQlVSU5UIEhhc2hJZHg7Ci0JUFRQQ19SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiOwotCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7Ci0JUFRQQ19SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJdTMyIEhhc2hJZHg7CisJc3RydWN0IHJ0X3RwY19yZXFfdGFiICpwVGFiID0gcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYjsKKwlzdHJ1Y3QgcnRfdHBjX3JlcV9lbnRyeSAqcEVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcnRfdHBjX3JlcV9lbnRyeSAqcFByZXZFbnRyeSA9IE5VTEw7CiAKLQlpZiAocFRhYiA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CisJaWYgKHBUYWIgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzOiBwVHBjUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTMwNCwxMiArNjM5LDEwIEBACiAJSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKERpYWxvZ1Rva2VuKTsKIAlwRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOwogCi0Jd2hpbGUgKHBFbnRyeSkKLQl7CisJd2hpbGUgKHBFbnRyeSkgewogCQlpZiAocEVudHJ5LT5EaWFsb2dUb2tlbiA9PSBEaWFsb2dUb2tlbikKIAkJCWJyZWFrOwotCQllbHNlCi0JCXsKKwkJZWxzZSB7CiAJCQlwUHJldkVudHJ5ID0gcEVudHJ5OwogCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKIAkJfQpAQCAtMzIwLDUxICs2NTMsNDkgQEAKIAlyZXR1cm4gcEVudHJ5OwogfQogCi0KLXN0YXRpYyBQVFBDX1JFUV9FTlRSWSBUcGNSZXFJbnNlcnQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3N0YXRpYyBzdHJ1Y3QgcnRfdHBjX3JlcV9lbnRyeSAqVHBjUmVxSW5zZXJ0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggRGlhbG9nVG9rZW4pCiB7Ci0JSU5UIGk7Ci0JVUxPTkcgSGFzaElkeDsKLQlQVFBDX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWI7Ci0JUFRQQ19SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTCwgcEN1cnJFbnRyeTsKLQlVTE9ORyBOb3c7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBIYXNoSWR4OworCXN0cnVjdCBydF90cGNfcmVxX3RhYiAqcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWI7CisJc3RydWN0IHJ0X3RwY19yZXFfZW50cnkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5OworCXVuc2lnbmVkIGxvbmcgTm93OwogCi0JaWYocFRhYiA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CisJaWYgKHBUYWIgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzOiBwVHBjUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7Ci0JaWYgKHBFbnRyeSA9PSBOVUxMKQotCXsKKwlpZiAocEVudHJ5ID09IE5VTEwpIHsKIAkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfVFBDX1JFUV9UQUJfU0laRTsgaSsrKQotCQl7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfVFBDX1JFUV9UQUJfU0laRTsgaSsrKSB7CiAJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwogCQkJcEVudHJ5ID0gJnBUYWItPkNvbnRlbnRbaV07CiAKIAkJCWlmICgocEVudHJ5LT5WYWxpZCA9PSBUUlVFKQotCQkJCSYmIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3csICh1bnNpZ25lZCBsb25nKShwRW50cnktPmxhc3RUaW1lICsgVFBDX1JFUV9BR0VfT1VUKSkpCisJCQkgICAgJiYgUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdywKKwkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKShwRW50cnktPgorCQkJCQkJCSAgICAgICBsYXN0VGltZSArCisJCQkJCQkJICAgICAgIFRQQ19SRVFfQUdFX09VVCkpKQogCQkJewotCQkJCVBUUENfUkVRX0VOVFJZIHBQcmV2RW50cnkgPSBOVUxMOwotCQkJCVVMT05HIEhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKLQkJCQlQVFBDX1JFUV9FTlRSWSBwUHJvYmVFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisJCQkJc3RydWN0IHJ0X3RwY19yZXFfZW50cnkgKnBQcmV2RW50cnkgPSBOVUxMOworCQkJCXVuc2lnbmVkIGxvbmcgSGFzaElkeCA9CisJCQkJICAgIFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+CisJCQkJCQkJICAgICAgIERpYWxvZ1Rva2VuKTsKKwkJCQlzdHJ1Y3QgcnRfdHBjX3JlcV9lbnRyeSAqcFByb2JlRW50cnkgPQorCQkJCSAgICBwVGFiLT5IYXNoW0hhc2hJZHhdOwogCi0JCQkJLy8gdXBkYXRlIEhhc2ggbGlzdAotCQkJCWRvCi0JCQkJewotCQkJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQotCQkJCQl7Ci0JCQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQotCQkJCQkJewotCQkJCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkvKiB1cGRhdGUgSGFzaCBsaXN0ICovCisJCQkJZG8geworCQkJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KSB7CisJCQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKSB7CisJCQkJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9CisJCQkJCQkJICAgIHBFbnRyeS0+cE5leHQ7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0KKwkJCQkJCQkgICAgcEVudHJ5LT5wTmV4dDsKIAkJCQkJCX0KIAkJCQkJCWJyZWFrOwogCQkJCQl9CkBAIC0zNzMsNyArNzA0LDcgQEAKIAkJCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CiAJCQkJfSB3aGlsZSAocFByb2JlRW50cnkpOwogCi0JCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoVFBDX1JFUV9FTlRSWSkpOworCQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKHN0cnVjdCBydF90cGNfcmVxX2VudHJ5KSk7CiAJCQkJcFRhYi0+U2l6ZS0tOwogCiAJCQkJYnJlYWs7CkBAIC0zODMsMzAgKzcxNCwyNCBAQAogCQkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKGkgPCBNQVhfVFBDX1JFUV9UQUJfU0laRSkKLQkJeworCQlpZiAoaSA8IE1BWF9UUENfUkVRX1RBQl9TSVpFKSB7CiAJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwogCQkJcEVudHJ5LT5sYXN0VGltZSA9IE5vdzsKIAkJCXBFbnRyeS0+VmFsaWQgPSBUUlVFOwogCQkJcEVudHJ5LT5EaWFsb2dUb2tlbiA9IERpYWxvZ1Rva2VuOwogCQkJcFRhYi0+U2l6ZSsrOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJcEVudHJ5ID0gTlVMTDsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwVHBjUmVxVGFiIHRhYiBmdWxsLlxuIiwgX19mdW5jX18pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIiVzOiBwVHBjUmVxVGFiIHRhYiBmdWxsLlxuIiwgX19mdW5jX18pKTsKIAkJfQogCi0JCS8vIGFkZCB0aGlzIE5laWdoYm9yIGVudHJ5IGludG8gSEFTSCB0YWJsZQotCQlpZiAocEVudHJ5KQotCQl7CisJCS8qIGFkZCB0aGlzIE5laWdoYm9yIGVudHJ5IGludG8gSEFTSCB0YWJsZSAqLworCQlpZiAocEVudHJ5KSB7CiAJCQlIYXNoSWR4ID0gVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOwotCQkJaWYgKHBUYWItPkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKLQkJCXsKKwkJCWlmIChwVGFiLT5IYXNoW0hhc2hJZHhdID09IE5VTEwpIHsKIAkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5OwotCQkJfQotCQkJZWxzZQotCQkJeworCQkJfSBlbHNlIHsKIAkJCQlwQ3VyckVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKIAkJCQl3aGlsZSAocEN1cnJFbnRyeS0+cE5leHQgIT0gTlVMTCkKIAkJCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OwpAQCAtNDIwLDQ1ICs3NDUsMzUgQEAKIAlyZXR1cm4gcEVudHJ5OwogfQogCi1zdGF0aWMgVk9JRCBUcGNSZXFEZWxldGUoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3N0YXRpYyB2b2lkIFRwY1JlcURlbGV0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IERpYWxvZ1Rva2VuKQogewotCVBUUENfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYjsKLQlQVFBDX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCXN0cnVjdCBydF90cGNfcmVxX3RhYiAqcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWI7CisJc3RydWN0IHJ0X3RwY19yZXFfZW50cnkgKnBFbnRyeSA9IE5VTEw7CiAKLQlpZihwVGFiID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKKwlpZiAocFRhYiA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CiAJCXJldHVybjsKIAl9Ci0KLQkvLyBpZiBlbXB0eSwgcmV0dXJuCi0JaWYgKHBUYWItPlNpemUgPT0gMCkKLQl7CisJLyogaWYgZW1wdHksIHJldHVybiAqLworCWlmIChwVGFiLT5TaXplID09IDApIHsKIAkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgicFRwY1JlcVRhYiBlbXB0eS5cbiIpKTsKIAkJcmV0dXJuOwogCX0KIAogCXBFbnRyeSA9IFRwY1JlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKTsKLQlpZiAocEVudHJ5ICE9IE5VTEwpCi0JewotCQlQVFBDX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKLQkJVUxPTkcgSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOwotCQlQVFBDX1JFUV9FTlRSWSBwUHJvYmVFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisJaWYgKHBFbnRyeSAhPSBOVUxMKSB7CisJCXN0cnVjdCBydF90cGNfcmVxX2VudHJ5ICpwUHJldkVudHJ5ID0gTlVMTDsKKwkJdW5zaWduZWQgbG9uZyBIYXNoSWR4ID0gVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgocEVudHJ5LT5EaWFsb2dUb2tlbik7CisJCXN0cnVjdCBydF90cGNfcmVxX2VudHJ5ICpwUHJvYmVFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CiAKIAkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7Ci0JCS8vIHVwZGF0ZSBIYXNoIGxpc3QKLQkJZG8KLQkJewotCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKLQkJCXsKLQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQotCQkJCXsKKwkJLyogdXBkYXRlIEhhc2ggbGlzdCAqLworCQlkbyB7CisJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KSB7CisJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkgewogCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKKwkJCQl9IGVsc2UgewogCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtNDY4LDcgKzc4Myw3IEBACiAJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKIAkJfSB3aGlsZSAocFByb2JlRW50cnkpOwogCi0JCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKFRQQ19SRVFfRU5UUlkpKTsKKwkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2Yoc3RydWN0IHJ0X3RwY19yZXFfZW50cnkpKTsKIAkJcFRhYi0+U2l6ZS0tOwogCiAJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CkBAIC00ODcsMTAgKzgwMiw5IEBACiAJUmV0dXJuCTogQ3VycmVudCBUaW1lIFN0YW1wLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLXN0YXRpYyBVSU5UNjQgR2V0Q3VycmVudFRpbWVTdGFtcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3N0YXRpYyB1NjQgR2V0Q3VycmVudFRpbWVTdGFtcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JLy8gZ2V0IGN1cnJlbnQgdGltZSBzdGFtcC4KKwkvKiBnZXQgY3VycmVudCB0aW1lIHN0YW1wLiAqLwogCXJldHVybiAwOwogfQogCkBAIC01MDQsMTEgKzgxOCw3MyBAQAogCVJldHVybgk6IEN1cnJlbnQgVGltZSBTdGFtcC4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1zdGF0aWMgVUlOVDggR2V0Q3VyVHhQd3IoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUlOVDggV2NpZCkKK3N0YXRpYyB1OCBHZXRDdXJUeFB3cihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IFdjaWQpCiB7Ci0JcmV0dXJuIDE2OyAvKiAxNiBkQm0gKi8KKwlyZXR1cm4gMTY7CQkvKiAxNiBkQm0gKi8KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlHZXQgQ3VycmVudCBUcmFuc21pdCBQb3dlci4KKworCVBhcmFtZXRyczoKKworCVJldHVybgk6IEN1cnJlbnQgVGltZSBTdGFtcC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIEluc2VydENoYW5uZWxSZXBJRShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQl1OCAqcEZyYW1lQnVmLAorCQkJdW5zaWduZWQgbG9uZyAqcEZyYW1lTGVuLAorCQkJY2hhciAqcENvdW50cnksIHU4IFJlZ3VsYXRvcnlDbGFzcykKK3sKKwl1bnNpZ25lZCBsb25nIFRlbXBMZW47CisJdTggTGVuOworCXU4IElFSWQgPSBJRV9BUF9DSEFOTkVMX1JFUE9SVDsKKwl1OCAqcENoTGlzdFB0ciA9IE5VTEw7CisKKwlMZW4gPSAxOworCWlmIChzdHJuY21wKHBDb3VudHJ5LCAiVVMiLCAyKSA9PSAwKSB7CisJCWlmIChSZWd1bGF0b3J5Q2xhc3MgPj0gVVNBX1JFR1VMQVRPUllfSU5GT19TSVpFKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCIlczogVVNBIFVua25vdyBSZXF1bGF0b3J5IGNsYXNzICglZClcbiIsCisJCQkJICBfX2Z1bmNfXywgUmVndWxhdG9yeUNsYXNzKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlMZW4gKz0KKwkJICAgIFVTQVJlZ3VsYXRvcnlJbmZvW1JlZ3VsYXRvcnlDbGFzc10uQ2hhbm5lbFNldC4KKwkJICAgIE51bWJlck9mQ2hhbm5lbHM7CisJCXBDaExpc3RQdHIgPQorCQkgICAgVVNBUmVndWxhdG9yeUluZm9bUmVndWxhdG9yeUNsYXNzXS5DaGFubmVsU2V0LkNoYW5uZWxMaXN0OworCX0gZWxzZSBpZiAoc3RybmNtcChwQ291bnRyeSwgIkpQIiwgMikgPT0gMCkgeworCQlpZiAoUmVndWxhdG9yeUNsYXNzID49IEpQX1JFR1VMQVRPUllfSU5GT19TSVpFKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCIlczogSlAgVW5rbm93IFJlcXVsYXRvcnkgY2xhc3MgKCVkKVxuIiwKKwkJCQkgIF9fZnVuY19fLCBSZWd1bGF0b3J5Q2xhc3MpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCUxlbiArPQorCQkgICAgSmFwYW5SZWd1bGF0b3J5SW5mb1tSZWd1bGF0b3J5Q2xhc3NdLkNoYW5uZWxTZXQuCisJCSAgICBOdW1iZXJPZkNoYW5uZWxzOworCQlwQ2hMaXN0UHRyID0KKwkJICAgIEphcGFuUmVndWxhdG9yeUluZm9bUmVndWxhdG9yeUNsYXNzXS5DaGFubmVsU2V0LkNoYW5uZWxMaXN0OworCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBVbmtub3cgQ291bnRyeSAoJXMpXG4iLAorCQkJCQkgIF9fZnVuY19fLCBwQ291bnRyeSkpOworCQlyZXR1cm47CisJfQorCisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLCAmVGVtcExlbiwKKwkJCSAgMSwgJklFSWQsCisJCQkgIDEsICZMZW4sCisJCQkgIDEsICZSZWd1bGF0b3J5Q2xhc3MsCisJCQkgIExlbiAtIDEsIHBDaExpc3RQdHIsIEVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCXJldHVybjsKIH0KIAogLyoKQEAgLTUyNCwxNiArOTAwLDEyIEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1zdGF0aWMgVk9JRCBJbnNlcnREaWFsb2dUb2tlbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBEaWFsb2dUb2tlbikKK3ZvaWQgSW5zZXJ0RGlhbG9nVG9rZW4oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgdTggKnBGcmFtZUJ1ZiwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnBGcmFtZUxlbiwgdTggRGlhbG9nVG9rZW4pCiB7Ci0JVUxPTkcgVGVtcExlbjsKLQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCSZUZW1wTGVuLAotCQkJCQkxLAkJCQkmRGlhbG9nVG9rZW4sCi0JCQkJCUVORF9PRl9BUkdTKTsKKwl1bnNpZ25lZCBsb25nIFRlbXBMZW47CisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLCAmVGVtcExlbiwgMSwgJkRpYWxvZ1Rva2VuLCBFTkRfT0ZfQVJHUyk7CiAKIAkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CiAKQEAgLTU1MiwxOSArOTI0LDE1IEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi0gc3RhdGljIFZPSUQgSW5zZXJ0VHBjUmVxSUUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4pCitzdGF0aWMgdm9pZCBJbnNlcnRUcGNSZXFJRShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1OCAqcEZyYW1lQnVmLCB1bnNpZ25lZCBsb25nICpwRnJhbWVMZW4pCiB7Ci0JVUxPTkcgVGVtcExlbjsKLQlVTE9ORyBMZW4gPSAwOwotCVVJTlQ4IEVsZW1lbnRJRCA9IElFX1RQQ19SRVFVRVNUOworCXVuc2lnbmVkIGxvbmcgVGVtcExlbjsKKwl1bnNpZ25lZCBsb25nIExlbiA9IDA7CisJdTggRWxlbWVudElEID0gSUVfVFBDX1JFUVVFU1Q7CiAKLQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKLQkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCi0JCQkJCQkxLAkJCQkJCQkmTGVuLAotCQkJCQkJRU5EX09GX0FSR1MpOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwgJlRlbXBMZW4sCisJCQkgIDEsICZFbGVtZW50SUQsIDEsICZMZW4sIEVORF9PRl9BUkdTKTsKIAogCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKIApAQCAtNTg1LDMwICs5NTMsMjUgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLSBzdGF0aWMgVk9JRCBJbnNlcnRUcGNSZXBvcnRJRSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBUeFB3ciwKLQlJTiBVSU5UOCBMaW5rTWFyZ2luKQordm9pZCBJbnNlcnRUcGNSZXBvcnRJRShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCAqcEZyYW1lQnVmLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqcEZyYW1lTGVuLAorCQkgICAgICAgdTggVHhQd3IsIHU4IExpbmtNYXJnaW4pCiB7Ci0JVUxPTkcgVGVtcExlbjsKLQlVTE9ORyBMZW4gPSBzaXplb2YoVFBDX1JFUE9SVF9JTkZPKTsKLQlVSU5UOCBFbGVtZW50SUQgPSBJRV9UUENfUkVQT1JUOwotCVRQQ19SRVBPUlRfSU5GTyBUcGNSZXBvcnRJRTsKKwl1bnNpZ25lZCBsb25nIFRlbXBMZW47CisJdW5zaWduZWQgbG9uZyBMZW4gPSBzaXplb2Yoc3RydWN0IHJ0X3RwY19yZXBvcnRfaW5mbyk7CisJdTggRWxlbWVudElEID0gSUVfVFBDX1JFUE9SVDsKKwlzdHJ1Y3QgcnRfdHBjX3JlcG9ydF9pbmZvIFRwY1JlcG9ydElFOwogCiAJVHBjUmVwb3J0SUUuVHhQd3IgPSBUeFB3cjsKIAlUcGNSZXBvcnRJRS5MaW5rTWFyZ2luID0gTGlua01hcmdpbjsKIAotCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAotCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKLQkJCQkJCTEsCQkJCQkJCSZMZW4sCi0JCQkJCQlMZW4sCQkJCQkJJlRwY1JlcG9ydElFLAotCQkJCQkJRU5EX09GX0FSR1MpOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwgJlRlbXBMZW4sCisJCQkgIDEsICZFbGVtZW50SUQsCisJCQkgIDEsICZMZW4sIExlbiwgJlRwY1JlcG9ydElFLCBFTkRfT0ZfQVJHUyk7CiAKIAkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CiAKLQogCXJldHVybjsKIH0KIApAQCAtNjI3LDMyICs5OTAsMjYgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLXN0YXRpYyBWT0lEIEluc2VydENoU3dBbm5JRSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBDaFN3TW9kZSwKLQlJTiBVSU5UOCBOZXdDaGFubmVsLAotCUlOIFVJTlQ4IENoU3dDbnQpCitzdGF0aWMgdm9pZCBJbnNlcnRDaFN3QW5uSUUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHU4ICpwRnJhbWVCdWYsCisJCQkgICAgdW5zaWduZWQgbG9uZyAqcEZyYW1lTGVuLAorCQkJICAgIHU4IENoU3dNb2RlLAorCQkJICAgIHU4IE5ld0NoYW5uZWwsIHU4IENoU3dDbnQpCiB7Ci0JVUxPTkcgVGVtcExlbjsKLQlVTE9ORyBMZW4gPSBzaXplb2YoQ0hfU1dfQU5OX0lORk8pOwotCVVJTlQ4IEVsZW1lbnRJRCA9IElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVDsKLQlDSF9TV19BTk5fSU5GTyBDaFN3QW5uSUU7CisJdW5zaWduZWQgbG9uZyBUZW1wTGVuOworCXVuc2lnbmVkIGxvbmcgTGVuID0gc2l6ZW9mKHN0cnVjdCBydF9jaF9zd19hbm5faW5mbyk7CisJdTggRWxlbWVudElEID0gSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UOworCXN0cnVjdCBydF9jaF9zd19hbm5faW5mbyBDaFN3QW5uSUU7CiAKIAlDaFN3QW5uSUUuQ2hTd01vZGUgPSBDaFN3TW9kZTsKIAlDaFN3QW5uSUUuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CiAJQ2hTd0FubklFLkNoU3dDbnQgPSBDaFN3Q250OwogCi0JTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkmVGVtcExlbiwKLQkJCQkJCTEsCQkJCQkJJkVsZW1lbnRJRCwKLQkJCQkJCTEsCQkJCQkJJkxlbiwKLQkJCQkJCUxlbiwJCQkJCSZDaFN3QW5uSUUsCi0JCQkJCQlFTkRfT0ZfQVJHUyk7CisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLCAmVGVtcExlbiwKKwkJCSAgMSwgJkVsZW1lbnRJRCwgMSwgJkxlbiwgTGVuLCAmQ2hTd0FubklFLCBFTkRfT0ZfQVJHUyk7CiAKIAkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CiAKLQogCXJldHVybjsKIH0KIApAQCAtNjcxLDI1ICsxMDI4LDIxIEBACiAJCTcuIE1lYXN1cmUgU3RhcnQgdGltZS4KIAkJOC4gTWVhc3VyZSBEdXJhdGlvbi4KIAotCiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1zdGF0aWMgVk9JRCBJbnNlcnRNZWFzdXJlUmVxSUUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4sCi0JSU4gUE1FQVNVUkVfUkVRX0lORk8gcE1lYXN1cmVSZXFJRSkKK3N0YXRpYyB2b2lkIEluc2VydE1lYXN1cmVSZXFJRShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdTggKnBGcmFtZUJ1ZiwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nICpwRnJhbWVMZW4sCisJCQkgICAgICAgdTggTGVuLCBzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfaW5mbyAqIHBNZWFzdXJlUmVxSUUpCiB7Ci0JVUxPTkcgVGVtcExlbjsKLQlVSU5UOCBMZW4gPSBzaXplb2YoTUVBU1VSRV9SRVFfSU5GTyk7Ci0JVUlOVDggRWxlbWVudElEID0gSUVfTUVBU1VSRU1FTlRfUkVRVUVTVDsKKwl1bnNpZ25lZCBsb25nIFRlbXBMZW47CisJdTggRWxlbWVudElEID0gSUVfTUVBU1VSRU1FTlRfUkVRVUVTVDsKIAotCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAotCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKLQkJCQkJCTEsCQkJCQkJCSZMZW4sCi0JCQkJCQlMZW4sCQkJCQkJcE1lYXN1cmVSZXFJRSwKLQkJCQkJCUVORF9PRl9BUkdTKTsKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsICZUZW1wTGVuLAorCQkJICAxLCAmRWxlbWVudElELAorCQkJICAxLCAmTGVuLAorCQkJICBzaXplb2Yoc3RydWN0IHJ0X21lYXN1cmVfcmVxX2luZm8pLCBwTWVhc3VyZVJlcUlFLCBFTkRfT0ZfQVJHUyk7CiAKIAkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CiAKQEAgLTcxMywzMyArMTA2NiwyNyBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotc3RhdGljIFZPSUQgSW5zZXJ0TWVhc3VyZVJlcG9ydElFKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFBNRUFTVVJFX1JFUE9SVF9JTkZPIHBNZWFzdXJlUmVwb3J0SUUsCi0JSU4gVUlOVDggUmVwb3J0TG5mb0xlbiwKLQlJTiBQVUlOVDggcFJlcG9ydEluZm8pCitzdGF0aWMgdm9pZCBJbnNlcnRNZWFzdXJlUmVwb3J0SUUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgdTggKnBGcmFtZUJ1ZiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgKnBGcmFtZUxlbiwKKwkJCQkgIHN0cnVjdCBydF9tZWFzdXJlX3JlcG9ydF9pbmZvICogcE1lYXN1cmVSZXBvcnRJRSwKKwkJCQkgIHU4IFJlcG9ydExuZm9MZW4sIHU4ICpwUmVwb3J0SW5mbykKIHsKLQlVTE9ORyBUZW1wTGVuOwotCVVMT05HIExlbjsKLQlVSU5UOCBFbGVtZW50SUQgPSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQ7CisJdW5zaWduZWQgbG9uZyBUZW1wTGVuOworCXVuc2lnbmVkIGxvbmcgTGVuOworCXU4IEVsZW1lbnRJRCA9IElFX01FQVNVUkVNRU5UX1JFUE9SVDsKIAotCUxlbiA9IHNpemVvZihNRUFTVVJFX1JFUE9SVF9JTkZPKSArIFJlcG9ydExuZm9MZW47CisJTGVuID0gc2l6ZW9mKHN0cnVjdCBydF9tZWFzdXJlX3JlcG9ydF9pbmZvKSArIFJlcG9ydExuZm9MZW47CiAKLQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKLQkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCi0JCQkJCQkxLAkJCQkJCQkmTGVuLAotCQkJCQkJTGVuLAkJCQkJCXBNZWFzdXJlUmVwb3J0SUUsCi0JCQkJCQlFTkRfT0ZfQVJHUyk7CisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLCAmVGVtcExlbiwKKwkJCSAgMSwgJkVsZW1lbnRJRCwKKwkJCSAgMSwgJkxlbiwgTGVuLCBwTWVhc3VyZVJlcG9ydElFLCBFTkRfT0ZfQVJHUyk7CiAKIAkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CiAKLQlpZiAoKFJlcG9ydExuZm9MZW4gPiAwKSAmJiAocFJlcG9ydEluZm8gIT0gTlVMTCkpCi0JewotCQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYgKyAqcEZyYW1lTGVuLAkJJlRlbXBMZW4sCi0JCQkJCQkJUmVwb3J0TG5mb0xlbiwJCQkJcFJlcG9ydEluZm8sCi0JCQkJCQkJRU5EX09GX0FSR1MpOworCWlmICgoUmVwb3J0TG5mb0xlbiA+IDApICYmIChwUmVwb3J0SW5mbyAhPSBOVUxMKSkgeworCQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYgKyAqcEZyYW1lTGVuLCAmVGVtcExlbiwKKwkJCQkgIFJlcG9ydExuZm9MZW4sIHBSZXBvcnRJbmZvLCBFTkRfT0ZfQVJHUyk7CiAKIAkJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwogCX0KQEAgLTc1OCw1MyArMTEwNSw0MCBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBFbnF1ZXVlTWVhc3VyZW1lbnRSZXEoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVSU5UOCBNZWFzdXJlVG9rZW4sCi0JSU4gVUlOVDggTWVhc3VyZVJlcU1vZGUsCi0JSU4gVUlOVDggTWVhc3VyZVJlcVR5cGUsCi0JSU4gVUlOVDggTWVhc3VyZUNoLAotCUlOIFVJTlQxNiBNZWFzdXJlRHVyYXRpb24pCit2b2lkIE1ha2VNZWFzdXJlbWVudFJlcUZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTggKnBPdXRCdWZmZXIsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgKnBGcmFtZUxlbiwKKwkJCSAgICAgdTggVG90YWxMZW4sCisJCQkgICAgIHU4IENhdGVnb3J5LAorCQkJICAgICB1OCBBY3Rpb24sCisJCQkgICAgIHU4IE1lYXN1cmVUb2tlbiwKKwkJCSAgICAgdTggTWVhc3VyZVJlcU1vZGUsCisJCQkgICAgIHU4IE1lYXN1cmVSZXFUeXBlLCB1OCBOdW1PZlJlcGV0aXRpb25zKQogewotCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyBOU3RhdHVzOwotCVVMT05HIEZyYW1lTGVuOwotCUhFQURFUl84MDJfMTEgQWN0SGRyOwotCU1FQVNVUkVfUkVRX0lORk8gTWVhc3VyZVJlcUlFOwotCVVJTlQ4IFJtUmVxRGFpbG9nVG9rZW4gPSBSYW5kb21CeXRlKHBBZCk7Ci0JVUlOVDY0IE1lYXN1cmVTdGFydFRpbWUgPSBHZXRDdXJyZW50VGltZVN0YW1wKHBBZCk7CisJdW5zaWduZWQgbG9uZyBUZW1wTGVuOworCXN0cnVjdCBydF9tZWFzdXJlX3JlcV9pbmZvIE1lYXN1cmVSZXFJRTsKIAotCS8vIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuCi0JTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCi0JCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgKnBGcmFtZUxlbiksIHBGcmFtZUxlbiwgQ2F0ZWdvcnksCisJCSAgICAgICBBY3Rpb24pOwogCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19mdW5jX18pKTsKLQkJcmV0dXJuOworCS8qIGZpbGwgRGlhbG9nIFRva2VuICovCisJSW5zZXJ0RGlhbG9nVG9rZW4ocEFkLCAocE91dEJ1ZmZlciArICpwRnJhbWVMZW4pLCBwRnJhbWVMZW4sCisJCQkgIE1lYXN1cmVUb2tlbik7CisKKwkvKiBmaWxsIE51bWJlciBvZiByZXBldGl0aW9ucy4gKi8KKwlpZiAoQ2F0ZWdvcnkgPT0gQ0FURUdPUllfUk0pIHsKKwkJTWFrZU91dGdvaW5nRnJhbWUoKHBPdXRCdWZmZXIgKyAqcEZyYW1lTGVuKSwgJlRlbXBMZW4sCisJCQkJICAyLCAmTnVtT2ZSZXBldGl0aW9ucywgRU5EX09GX0FSR1MpOworCisJCSpwRnJhbWVMZW4gKz0gVGVtcExlbjsKIAl9Ci0JTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0KLQlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX01SUSk7Ci0KLQkvLyBmaWxsIERpYWxvZyBUb2tlbgotCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgTWVhc3VyZVRva2VuKTsKLQotCS8vIHByZXBhcmUgTWVhc3VyZW1lbnQgSUUuCi0JTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXFJRSwgc2l6ZW9mKE1FQVNVUkVfUkVRX0lORk8pKTsKLQlNZWFzdXJlUmVxSUUuVG9rZW4gPSBSbVJlcURhaWxvZ1Rva2VuOworCS8qIHByZXBhcmUgTWVhc3VyZW1lbnQgSUUuICovCisJTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXFJRSwgc2l6ZW9mKHN0cnVjdCBydF9tZWFzdXJlX3JlcV9pbmZvKSk7CisJTWVhc3VyZVJlcUlFLlRva2VuID0gTWVhc3VyZVRva2VuOwogCU1lYXN1cmVSZXFJRS5SZXFNb2RlLndvcmQgPSBNZWFzdXJlUmVxTW9kZTsKIAlNZWFzdXJlUmVxSUUuUmVxVHlwZSA9IE1lYXN1cmVSZXFUeXBlOwotCU1lYXN1cmVSZXFJRS5NZWFzdXJlUmVxLkNoTnVtID0gTWVhc3VyZUNoOwotCU1lYXN1cmVSZXFJRS5NZWFzdXJlUmVxLk1lYXN1cmVTdGFydFRpbWUgPSBjcHUybGU2NChNZWFzdXJlU3RhcnRUaW1lKTsKLQlNZWFzdXJlUmVxSUUuTWVhc3VyZVJlcS5NZWFzdXJlRHVyYXRpb24gPSBjcHUybGUxNihNZWFzdXJlRHVyYXRpb24pOwotCUluc2VydE1lYXN1cmVSZXFJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sICZNZWFzdXJlUmVxSUUpOwotCi0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCUluc2VydE1lYXN1cmVSZXFJRShwQWQsIChwT3V0QnVmZmVyICsgKnBGcmFtZUxlbiksIHBGcmFtZUxlbiwKKwkJCSAgIFRvdGFsTGVuLCAmTWVhc3VyZVJlcUlFKTsKIAogCXJldHVybjsKIH0KQEAgLTgyMSw0NiArMTE1NSw0NiBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBFbnF1ZXVlTWVhc3VyZW1lbnRSZXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKLQlJTiBVSU5UOCBNZWFzdXJlVG9rZW4sCi0JSU4gVUlOVDggTWVhc3VyZVJlcU1vZGUsCi0JSU4gVUlOVDggTWVhc3VyZVJlcVR5cGUsCi0JSU4gVUlOVDggUmVwb3J0SW5mb0xlbiwKLQlJTiBQVUlOVDggcFJlcG9ydEluZm8pCit2b2lkIEVucXVldWVNZWFzdXJlbWVudFJlcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1OCAqcERBLAorCQkJICAgdTggRGlhbG9nVG9rZW4sCisJCQkgICB1OCBNZWFzdXJlVG9rZW4sCisJCQkgICB1OCBNZWFzdXJlUmVxTW9kZSwKKwkJCSAgIHU4IE1lYXN1cmVSZXFUeXBlLAorCQkJICAgdTggUmVwb3J0SW5mb0xlbiwgdTggKnBSZXBvcnRJbmZvKQogewotCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyBOU3RhdHVzOwotCVVMT05HIEZyYW1lTGVuOwotCUhFQURFUl84MDJfMTEgQWN0SGRyOwotCU1FQVNVUkVfUkVQT1JUX0lORk8gTWVhc3VyZVJlcElFOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwlpbnQgTlN0YXR1czsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIEFjdEhkcjsKKwlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXBvcnRfaW5mbyBNZWFzdXJlUmVwSUU7CiAKLQkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgorCS8qIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuICovCiAJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCi0JCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwkJCSBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKIAotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICh2b2lkICopJiBwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm47CiAJfQotCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCUZyYW1lTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChjaGFyICopJiBBY3RIZHIsIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOworCUZyYW1lTGVuID0gc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKTsKIAotCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfTVJQKTsKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sCisJCSAgICAgICBDQVRFR09SWV9TUEVDVFJVTSwgU1BFQ19NUlApOwogCi0JLy8gZmlsbCBEaWFsb2cgVG9rZW4KKwkvKiBmaWxsIERpYWxvZyBUb2tlbiAqLwogCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgRGlhbG9nVG9rZW4pOwogCi0JLy8gcHJlcGFyZSBNZWFzdXJlbWVudCBJRS4KLQlOZGlzWmVyb01lbW9yeSgmTWVhc3VyZVJlcElFLCBzaXplb2YoTUVBU1VSRV9SRVBPUlRfSU5GTykpOworCS8qIHByZXBhcmUgTWVhc3VyZW1lbnQgSUUuICovCisJTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXBJRSwgc2l6ZW9mKHN0cnVjdCBydF9tZWFzdXJlX3JlcG9ydF9pbmZvKSk7CiAJTWVhc3VyZVJlcElFLlRva2VuID0gTWVhc3VyZVRva2VuOwotCU1lYXN1cmVSZXBJRS5SZXBvcnRNb2RlLndvcmQgPSBNZWFzdXJlUmVxTW9kZTsKKwlNZWFzdXJlUmVwSUUuUmVwb3J0TW9kZSA9IE1lYXN1cmVSZXFNb2RlOwogCU1lYXN1cmVSZXBJRS5SZXBvcnRUeXBlID0gTWVhc3VyZVJlcVR5cGU7Ci0JSW5zZXJ0TWVhc3VyZVJlcG9ydElFKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgJk1lYXN1cmVSZXBJRSwgUmVwb3J0SW5mb0xlbiwgcFJlcG9ydEluZm8pOworCUluc2VydE1lYXN1cmVSZXBvcnRJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sCisJCQkgICAgICAmTWVhc3VyZVJlcElFLCBSZXBvcnRJbmZvTGVuLCBwUmVwb3J0SW5mbyk7CiAKIAlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwogCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CkBAIC04ODAsMzYgKzEyMTQsMzQgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgRW5xdWV1ZVRQQ1JlcSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVDSEFSIERpYWxvZ1Rva2VuKQordm9pZCBFbnF1ZXVlVFBDUmVxKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKnBEQSwgdTggRGlhbG9nVG9rZW4pCiB7Ci0JUFVDSEFSIHBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTIE5TdGF0dXM7Ci0JVUxPTkcgRnJhbWVMZW47CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCWludCBOU3RhdHVzOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW47CiAKLQlIRUFERVJfODAyXzExIEFjdEhkcjsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBBY3RIZHI7CiAKLQkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgorCS8qIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuICovCiAJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCi0JCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwkJCSBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKIAotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICh2b2lkICopJiBwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm47CiAJfQotCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCUZyYW1lTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChjaGFyICopJiBBY3RIZHIsIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOworCUZyYW1lTGVuID0gc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKTsKIAotCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfVFBDUlEpOworCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwKKwkJICAgICAgIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX1RQQ1JRKTsKIAotCS8vIGZpbGwgRGlhbG9nIFRva2VuCisJLyogZmlsbCBEaWFsb2cgVG9rZW4gKi8KIAlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIERpYWxvZ1Rva2VuKTsKIAotCS8vIEluc2VydCBUUEMgUmVxdWVzdCBJRS4KKwkvKiBJbnNlcnQgVFBDIFJlcXVlc3QgSUUuICovCiAJSW5zZXJ0VHBjUmVxSUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuKTsKIAogCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CkBAIC05MzAsMzkgKzEyNjIsMzggQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgRW5xdWV1ZVRQQ1JlcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVJTlQ4IERpYWxvZ1Rva2VuLAotCUlOIFVJTlQ4IFR4UHdyLAotCUlOIFVJTlQ4IExpbmtNYXJnaW4pCit2b2lkIEVucXVldWVUUENSZXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICB1OCAqcERBLAorCQkgICB1OCBEaWFsb2dUb2tlbiwgdTggVHhQd3IsIHU4IExpbmtNYXJnaW4pCiB7Ci0JUFVDSEFSIHBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTIE5TdGF0dXM7Ci0JVUxPTkcgRnJhbWVMZW47CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCWludCBOU3RhdHVzOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW47CiAKLQlIRUFERVJfODAyXzExIEFjdEhkcjsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBBY3RIZHI7CiAKLQkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgorCS8qIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuICovCiAJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCi0JCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwkJCSBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKIAotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICh2b2lkICopJiBwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm47CiAJfQotCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCUZyYW1lTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChjaGFyICopJiBBY3RIZHIsIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOworCUZyYW1lTGVuID0gc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKTsKIAotCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfVFBDUlApOworCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwKKwkJICAgICAgIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX1RQQ1JQKTsKIAotCS8vIGZpbGwgRGlhbG9nIFRva2VuCisJLyogZmlsbCBEaWFsb2cgVG9rZW4gKi8KIAlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIERpYWxvZ1Rva2VuKTsKIAotCS8vIEluc2VydCBUUEMgUmVxdWVzdCBJRS4KLQlJbnNlcnRUcGNSZXBvcnRJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIFR4UHdyLCBMaW5rTWFyZ2luKTsKKwkvKiBJbnNlcnQgVFBDIFJlcXVlc3QgSUUuICovCisJSW5zZXJ0VHBjUmVwb3J0SUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBUeFB3ciwKKwkJCSAgTGlua01hcmdpbik7CiAKIAlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwogCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CkBAIC05ODQsMzQgKzEzMTUsMzMgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgRW5xdWV1ZUNoU3dBbm4oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVSU5UOCBDaFN3TW9kZSwKLQlJTiBVSU5UOCBOZXdDaCkKK3ZvaWQgRW5xdWV1ZUNoU3dBbm4oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgdTggKnBEQSwgdTggQ2hTd01vZGUsIHU4IE5ld0NoKQogewotCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyBOU3RhdHVzOwotCVVMT05HIEZyYW1lTGVuOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwlpbnQgTlN0YXR1czsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuOwogCi0JSEVBREVSXzgwMl8xMSBBY3RIZHI7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgQWN0SGRyOwogCi0JLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwkvKiBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLiAqLwogCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAotCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQkgcEFkLT5DdXJyZW50QWRkcmVzcyk7CiAKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAodm9pZCAqKSYgcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuOwogCX0KLQlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKwlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoY2hhciAqKSYgQWN0SGRyLCBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpKTsKKwlGcmFtZUxlbiA9IHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSk7CiAKLQlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX0NIQU5ORUxfU1dJVENIKTsKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sCisJCSAgICAgICBDQVRFR09SWV9TUEVDVFJVTSwgU1BFQ19DSEFOTkVMX1NXSVRDSCk7CiAKLQlJbnNlcnRDaFN3QW5uSUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBDaFN3TW9kZSwgTmV3Q2gsIDApOworCUluc2VydENoU3dBbm5JRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENoU3dNb2RlLAorCQkJTmV3Q2gsIDApOwogCiAJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwpAQCAtMTAxOSw1NSArMTM0OSw0MyBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIEJPT0xFQU4gRGZzUmVxdWlyZW1lbnRDaGVjaygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVSU5UOCBDaGFubmVsKQorc3RhdGljIEJPT0xFQU4gRGZzUmVxdWlyZW1lbnRDaGVjayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IENoYW5uZWwpCiB7CiAJQk9PTEVBTiBSZXN1bHQgPSBGQUxTRTsKLQlJTlQgaTsKKwlpbnQgaTsKIAotCWRvCi0JewotCQkvLyBjaGVjayBERlMgcHJvY2VkdXJlIGlzIHJ1bm5pbmcuCi0JCS8vIG1ha2Ugc3VyZSBERlMgcHJvY2VkdXJlIHdvbid0IHN0YXJ0IHR3aWNlLgotCQlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKQotCQl7CisJZG8geworCQkvKiBjaGVjayBERlMgcHJvY2VkdXJlIGlzIHJ1bm5pbmcuICovCisJCS8qIG1ha2Ugc3VyZSBERlMgcHJvY2VkdXJlIHdvbid0IHN0YXJ0IHR3aWNlLiAqLworCQlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKSB7CiAJCQlSZXN1bHQgPSBGQUxTRTsKIAkJCWJyZWFrOwogCQl9Ci0KLQkJLy8gY2hlY2sgdGhlIG5ldyBjaGFubmVsIGNhcnJpZWQgZnJvbSBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1uZXQgaXMgdmFsaWQuCi0JCWZvciAoaT0wOyBpPHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykKLQkJeworCQkvKiBjaGVjayB0aGUgbmV3IGNoYW5uZWwgY2FycmllZCBmcm9tIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbW5ldCBpcyB2YWxpZC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykgewogCQkJaWYgKChDaGFubmVsID09IHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCkKLQkJCQkmJihwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgPT0gMCkpCi0JCQl7Ci0JCQkJLy8gZm91bmQgcmFkYXIgc2lnbmFsIGluIHRoZSBjaGFubmVsLiB0aGUgY2hhbm5lbCBjYW4ndCB1c2UgYXQgbGVhc3QgZm9yIDMwIG1pbnV0ZXMuCi0JCQkJcEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlID0gMTgwMDsvLzMwIG1pbiA9IDE4MDAgc2VjCisJCQkgICAgJiYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA9PSAwKSkgeworCQkJCS8qIGZvdW5kIHJhZGFyIHNpZ25hbCBpbiB0aGUgY2hhbm5lbC4gdGhlIGNoYW5uZWwgY2FuJ3QgdXNlIGF0IGxlYXN0IGZvciAzMCBtaW51dGVzLiAqLworCQkJCXBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA9IDE4MDA7CS8qMzAgbWluID0gMTgwMCBzZWMgKi8KIAkJCQlSZXN1bHQgPSBUUlVFOwogCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JfSB3aGlsZShGQUxTRSk7CisJfSB3aGlsZSAoRkFMU0UpOwogCiAJcmV0dXJuIFJlc3VsdDsKIH0KIAotVk9JRCBOb3RpZnlDaFN3QW5uVG9QZWVyQVBzKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwUkEsCi0JSU4gUFVDSEFSIHBUQSwKLQlJTiBVSU5UOCBDaFN3TW9kZSwKLQlJTiBVSU5UOCBDaGFubmVsKQordm9pZCBOb3RpZnlDaFN3QW5uVG9QZWVyQVBzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1OCAqcFJBLAorCQkJICAgIHU4ICpwVEEsIHU4IENoU3dNb2RlLCB1OCBDaGFubmVsKQogewogfQogCi1zdGF0aWMgVk9JRCBTdGFydERGU1Byb2NlZHVyZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBDaGFubmVsLAotCUlOIFVJTlQ4IENoU3dNb2RlKQorc3RhdGljIHZvaWQgU3RhcnRERlNQcm9jZWR1cmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTggQ2hhbm5lbCwgdTggQ2hTd01vZGUpCiB7Ci0JLy8gc3RhcnQgREZTIHByb2NlZHVyZQorCS8qIHN0YXJ0IERGUyBwcm9jZWR1cmUgKi8KIAlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gQ2hhbm5lbDsKIAogCU5fQ2hhbm5lbENoZWNrKHBBZCk7CkBAIC0xMDg2LDcgKzE0MDQsNiBAQAogCQkyLiBtZXNzYWdlIGxlbmd0aC4KIAkJMy4gQ2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGluZm9tYXRpb24gYnVmZmVyLgogCi0KIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KQEAgLTEwOTgsNDQgKzE0MTUsNDUgQEAKICAgKy0tLS0rLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwogICAgIDEgICAgMSAgICAgICAgMSAgICAgICAgICAgMSAgICAgICAgICAgIDEKICovCi1zdGF0aWMgQk9PTEVBTiBQZWVyQ2hTd0FublNhbml0eSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBWT0lEICpwTXNnLAotCUlOIFVMT05HIE1zZ0xlbiwKLQlPVVQgUENIX1NXX0FOTl9JTkZPIHBDaFN3QW5uSW5mbykKK3N0YXRpYyBCT09MRUFOIFBlZXJDaFN3QW5uU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgdm9pZCAqIHBNc2csCisJCQkJIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJCSBzdHJ1Y3QgcnRfY2hfc3dfYW5uX2luZm8gKiBwQ2hTd0FubkluZm8pCiB7Ci0JUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0JUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogRnIgPSAoc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqKSBwTXNnOworCXU4ICpwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CiAJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKLQlQRUlEX1NUUlVDVCBlaWRfcHRyOworCXN0cnVjdCBydF9laWQgKiBlaWRfcHRyOwogCi0JLy8gc2tpcCA4MDIuMTEgaGVhZGVyLgotCU1zZ0xlbiAtPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisJLyogc2tpcCA4MDIuMTEgaGVhZGVyLiAqLworCU1zZ0xlbiAtPSBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpOwogCi0JLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJLyogc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuICovCiAJcEZyYW1lUHRyICs9IDI7CiAJTXNnTGVuIC09IDI7CiAKIAlpZiAocENoU3dBbm5JbmZvID09IE5VTEwpCiAJCXJldHVybiByZXN1bHQ7CiAKLQllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKLQl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKLQl7Ci0JCXN3aXRjaChlaWRfcHRyLT5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UOgotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQ2hTd0FubkluZm8tPkNoU3dNb2RlLCBlaWRfcHRyLT5PY3RldCwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBDaFN3QW5uSW5mby0+Q2hhbm5lbCwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcENoU3dBbm5JbmZvLT5DaFN3Q250LCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOworCWVpZF9wdHIgPSAoc3RydWN0IHJ0X2VpZCAqKSBwRnJhbWVQdHI7CisJd2hpbGUgKCgodTggKikgZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwKKwkgICAgICAgKCh1OCAqKXBGcmFtZVB0ciArIE1zZ0xlbikpIHsKKwkJc3dpdGNoIChlaWRfcHRyLT5FaWQpIHsKKwkJY2FzZSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQ6CisJCQlOZGlzTW92ZU1lbW9yeSgmcENoU3dBbm5JbmZvLT5DaFN3TW9kZSwgZWlkX3B0ci0+T2N0ZXQsCisJCQkJICAgICAgIDEpOworCQkJTmRpc01vdmVNZW1vcnkoJnBDaFN3QW5uSW5mby0+Q2hhbm5lbCwKKwkJCQkgICAgICAgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQ2hTd0FubkluZm8tPkNoU3dDbnQsCisJCQkJICAgICAgIGVpZF9wdHItPk9jdGV0ICsgMiwgMSk7CiAKLQkJCQlyZXN1bHQgPSBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJcmVzdWx0ID0gVFJVRTsKKwkJCWJyZWFrOwogCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CiAJCX0KLQkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJCWVpZF9wdHIgPSAoc3RydWN0IHJ0X2VpZCAqKSAoKHU4ICopIGVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMTE1NCwyNSArMTQ3MiwyNSBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotc3RhdGljIEJPT0xFQU4gUGVlck1lYXN1cmVSZXFTYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVk9JRCAqcE1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4sCi0JT1VUIFBNRUFTVVJFX1JFUV9JTkZPIHBNZWFzdXJlUmVxSW5mbykKK3N0YXRpYyBCT09MRUFOIFBlZXJNZWFzdXJlUmVxU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgdm9pZCAqIHBNc2csCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJCSAgICB1OCAqcERpYWxvZ1Rva2VuLAorCQkJCSAgICBzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfaW5mbyAqIHBNZWFzdXJlUmVxSW5mbywKKwkJCQkgICAgc3RydWN0IHJ0X21lYXN1cmVfcmVxICogcE1lYXN1cmVSZXEpCiB7Ci0JUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0JUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogRnIgPSAoc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqKSBwTXNnOworCXU4ICpwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CiAJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKLQlQRUlEX1NUUlVDVCBlaWRfcHRyOwotCVBVQ0hBUiBwdHI7Ci0JVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7Ci0JVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKKwlzdHJ1Y3QgcnRfZWlkICogZWlkX3B0cjsKKwl1OCAqcHRyOworCXU2NCBNZWFzdXJlU3RhcnRUaW1lOworCXUxNiBNZWFzdXJlRHVyYXRpb247CiAKLQkvLyBza2lwIDgwMi4xMSBoZWFkZXIuCi0JTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKwkvKiBza2lwIDgwMi4xMSBoZWFkZXIuICovCisJTXNnTGVuIC09IHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSk7CiAKLQkvLyBza2lwIGNhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4KKwkvKiBza2lwIGNhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4gKi8KIAlwRnJhbWVQdHIgKz0gMjsKIAlNc2dMZW4gLT0gMjsKIApAQCAtMTE4MywyOSArMTUwMSwzMiBAQAogCXBGcmFtZVB0ciArPSAxOwogCU1zZ0xlbiAtPSAxOwogCi0JZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7Ci0Jd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCi0JewotCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQotCQl7Ci0JCQljYXNlIElFX01FQVNVUkVNRU5UX1JFUVVFU1Q6Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVxSW5mby0+VG9rZW4sIGVpZF9wdHItPk9jdGV0LCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5SZXFNb2RlLndvcmQsIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVxSW5mby0+UmVxVHlwZSwgZWlkX3B0ci0+T2N0ZXQgKyAyLCAxKTsKLQkJCQlwdHIgPSBlaWRfcHRyLT5PY3RldCArIDM7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVxSW5mby0+TWVhc3VyZVJlcS5DaE51bSwgcHRyLCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmTWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7Ci0JCQkJcE1lYXN1cmVSZXFJbmZvLT5NZWFzdXJlUmVxLk1lYXN1cmVTdGFydFRpbWUgPSBTV0FQNjQoTWVhc3VyZVN0YXJ0VGltZSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7Ci0JCQkJcE1lYXN1cmVSZXFJbmZvLT5NZWFzdXJlUmVxLk1lYXN1cmVEdXJhdGlvbiA9IFNXQVAxNihNZWFzdXJlRHVyYXRpb24pOworCWVpZF9wdHIgPSAoc3RydWN0IHJ0X2VpZCAqKSBwRnJhbWVQdHI7CisJd2hpbGUgKCgodTggKikgZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwKKwkgICAgICAgKCh1OCAqKXBGcmFtZVB0ciArIE1zZ0xlbikpIHsKKwkJc3dpdGNoIChlaWRfcHRyLT5FaWQpIHsKKwkJY2FzZSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUOgorCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVxSW5mby0+VG9rZW4sIGVpZF9wdHItPk9jdGV0LAorCQkJCSAgICAgICAxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPlJlcU1vZGUud29yZCwKKwkJCQkgICAgICAgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPlJlcVR5cGUsCisJCQkJICAgICAgIGVpZF9wdHItPk9jdGV0ICsgMiwgMSk7CisJCQlwdHIgPSAodTggKikoZWlkX3B0ci0+T2N0ZXQgKyAzKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcS0+Q2hOdW0sIHB0ciwgMSk7CisJCQlOZGlzTW92ZU1lbW9yeSgmTWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7CisJCQlwTWVhc3VyZVJlcS0+TWVhc3VyZVN0YXJ0VGltZSA9CisJCQkgICAgU1dBUDY0KE1lYXN1cmVTdGFydFRpbWUpOworCQkJTmRpc01vdmVNZW1vcnkoJk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7CisJCQlwTWVhc3VyZVJlcS0+TWVhc3VyZUR1cmF0aW9uID0gU1dBUDE2KE1lYXN1cmVEdXJhdGlvbik7CiAKLQkJCQlyZXN1bHQgPSBUUlVFOwotCQkJCWJyZWFrOworCQkJcmVzdWx0ID0gVFJVRTsKKwkJCWJyZWFrOwogCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CiAJCX0KLQkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJCWVpZF9wdHIgPSAoc3RydWN0IHJ0X2VpZCAqKSAoKHU4ICopIGVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMTI0NSwyNCArMTU2NiwyNCBAQAogICArLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKwogICAgICAwICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAzICAgICAgICAgNCAgICAgICAgICA1LTcKICovCi1zdGF0aWMgQk9PTEVBTiBQZWVyTWVhc3VyZVJlcG9ydFNhbml0eSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBWT0lEICpwTXNnLAotCUlOIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVJTlQ4IHBEaWFsb2dUb2tlbiwKLQlPVVQgUE1FQVNVUkVfUkVQT1JUX0lORk8gcE1lYXN1cmVSZXBvcnRJbmZvLAotCU9VVCBQVUlOVDggcFJlcG9ydEJ1ZikKK3N0YXRpYyBCT09MRUFOIFBlZXJNZWFzdXJlUmVwb3J0U2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgICAgdm9pZCAqIHBNc2csCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJCSAgICAgICB1OCAqcERpYWxvZ1Rva2VuLAorCQkJCSAgICAgICBzdHJ1Y3QgcnRfbWVhc3VyZV9yZXBvcnRfaW5mbyAqCisJCQkJICAgICAgIHBNZWFzdXJlUmVwb3J0SW5mbywKKwkJCQkgICAgICAgdTggKnBSZXBvcnRCdWYpCiB7Ci0JUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0JUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogRnIgPSAoc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqKSBwTXNnOworCXU4ICpwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CiAJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKLQlQRUlEX1NUUlVDVCBlaWRfcHRyOwotCVBVQ0hBUiBwdHI7CisJc3RydWN0IHJ0X2VpZCAqIGVpZF9wdHI7CisJdTggKnB0cjsKIAotCS8vIHNraXAgODAyLjExIGhlYWRlci4KLQlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCS8qIHNraXAgODAyLjExIGhlYWRlci4gKi8KKwlNc2dMZW4gLT0gc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKTsKIAotCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCS8qIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLiAqLwogCXBGcmFtZVB0ciArPSAyOwogCU1zZ0xlbiAtPSAyOwogCkBAIC0xMjczLDUxICsxNTk0LDYwIEBACiAJcEZyYW1lUHRyICs9IDE7CiAJTXNnTGVuIC09IDE7CiAKLQllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKLQl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKLQl7Ci0JCXN3aXRjaChlaWRfcHRyLT5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVQT1JUOgotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcG9ydEluZm8tPlRva2VuLCBlaWRfcHRyLT5PY3RldCwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0TW9kZSwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlLCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOwotCQkJCWlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fQkFTSUMpCi0JCQkJewotCQkJCQlQTUVBU1VSRV9CQVNJQ19SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9CQVNJQ19SRVBPUlQpcFJlcG9ydEJ1ZjsKLQkJCQkJcHRyID0gZWlkX3B0ci0+T2N0ZXQgKyAzOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q2hOdW0sIHB0ciwgMSk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NYXAsIHB0ciArIDExLCAxKTsKKwllaWRfcHRyID0gKHN0cnVjdCBydF9laWQgKikgcEZyYW1lUHRyOworCXdoaWxlICgoKHU4ICopIGVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8CisJICAgICAgICgodTggKilwRnJhbWVQdHIgKyBNc2dMZW4pKSB7CisJCXN3aXRjaCAoZWlkX3B0ci0+RWlkKSB7CisJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVQT1JUOgorCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVwb3J0SW5mby0+VG9rZW4sCisJCQkJICAgICAgIGVpZF9wdHItPk9jdGV0LCAxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydE1vZGUsCisJCQkJICAgICAgIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7CisJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlLAorCQkJCSAgICAgICBlaWRfcHRyLT5PY3RldCArIDIsIDEpOworCQkJaWYgKHBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0VHlwZSA9PSBSTV9CQVNJQykgeworCQkJCXN0cnVjdCBydF9tZWFzdXJlX2Jhc2ljX3JlcG9ydCAqIHBSZXBvcnQgPQorCQkJCSAgICAoc3RydWN0IHJ0X21lYXN1cmVfYmFzaWNfcmVwb3J0ICopIHBSZXBvcnRCdWY7CisJCQkJcHRyID0gKHU4ICopKGVpZF9wdHItPk9jdGV0ICsgMyk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLAorCQkJCQkgICAgICAgcHRyICsgMSwgOCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwKKwkJCQkJICAgICAgIHB0ciArIDksIDIpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NYXAsIHB0ciArIDExLCAxKTsKIAotCQkJCX0KLQkJCQllbHNlIGlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fQ0NBKQotCQkJCXsKLQkJCQkJUE1FQVNVUkVfQ0NBX1JFUE9SVCBwUmVwb3J0ID0gKFBNRUFTVVJFX0NDQV9SRVBPUlQpcFJlcG9ydEJ1ZjsKLQkJCQkJcHRyID0gZWlkX3B0ci0+T2N0ZXQgKyAzOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q2hOdW0sIHB0ciwgMSk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5DQ0FfQnVzeV9GcmFjdGlvbiwgcHRyICsgMTEsIDEpOworCQkJfSBlbHNlIGlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fQ0NBKSB7CisJCQkJc3RydWN0IHJ0X21lYXN1cmVfY2NhX3JlcG9ydCAqIHBSZXBvcnQgPQorCQkJCSAgICAoc3RydWN0IHJ0X21lYXN1cmVfY2NhX3JlcG9ydCAqKSBwUmVwb3J0QnVmOworCQkJCXB0ciA9ICh1OCAqKShlaWRfcHRyLT5PY3RldCArIDMpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5DaE51bSwgcHRyLCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwKKwkJCQkJICAgICAgIHB0ciArIDEsIDgpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sCisJCQkJCSAgICAgICBwdHIgKyA5LCAyKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q0NBX0J1c3lfRnJhY3Rpb24sCisJCQkJCSAgICAgICBwdHIgKyAxMSwgMSk7CiAKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlID09IFJNX1JQSV9ISVNUT0dSQU0pCi0JCQkJewotCQkJCQlQTUVBU1VSRV9SUElfUkVQT1JUIHBSZXBvcnQgPSAoUE1FQVNVUkVfUlBJX1JFUE9SVClwUmVwb3J0QnVmOwotCQkJCQlwdHIgPSBlaWRfcHRyLT5PY3RldCArIDM7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5DaE51bSwgcHRyLCAxKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVTdGFydFRpbWUsIHB0ciArIDEsIDgpOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZUR1cmF0aW9uLCBwdHIgKyA5LCAyKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPlJQSV9EZW5zaXR5LCBwdHIgKyAxMSwgOCk7Ci0JCQkJfQotCQkJCXJlc3VsdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCQl9IGVsc2UgaWYgKHBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0VHlwZSA9PQorCQkJCSAgIFJNX1JQSV9ISVNUT0dSQU0pIHsKKwkJCQlzdHJ1Y3QgcnRfbWVhc3VyZV9ycGlfcmVwb3J0ICogcFJlcG9ydCA9CisJCQkJICAgIChzdHJ1Y3QgcnRfbWVhc3VyZV9ycGlfcmVwb3J0ICopIHBSZXBvcnRCdWY7CisJCQkJcHRyID0gKHU4ICopKGVpZF9wdHItPk9jdGV0ICsgMyk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLAorCQkJCQkgICAgICAgcHRyICsgMSwgOCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwKKwkJCQkJICAgICAgIHB0ciArIDksIDIpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5SUElfRGVuc2l0eSwgcHRyICsgMTEsCisJCQkJCSAgICAgICA4KTsKKwkJCX0KKwkJCXJlc3VsdCA9IFRSVUU7CisJCQlicmVhazsKIAotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOwogCQl9Ci0JCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCQllaWRfcHRyID0gKHN0cnVjdCBydF9laWQgKikgKCh1OCAqKSBlaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTEzMzYsMjAgKzE2NjYsMTggQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLXN0YXRpYyBCT09MRUFOIFBlZXJUcGNSZXFTYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVk9JRCAqcE1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4pCitzdGF0aWMgQk9PTEVBTiBQZWVyVHBjUmVxU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQl2b2lkICogcE1zZywKKwkJCQl1bnNpZ25lZCBsb25nIE1zZ0xlbiwgdTggKnBEaWFsb2dUb2tlbikKIHsKLQlQRlJBTUVfODAyXzExIEZyID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKLQlQVUNIQVIgcEZyYW1lUHRyID0gRnItPk9jdGV0OworCXN0cnVjdCBydF9mcmFtZV84MDJfMTEgKiBGciA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIHBNc2c7CisJdTggKnBGcmFtZVB0ciA9IEZyLT5PY3RldDsKIAlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOwotCVBFSURfU1RSVUNUIGVpZF9wdHI7CisJc3RydWN0IHJ0X2VpZCAqIGVpZF9wdHI7CiAKLQlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCU1zZ0xlbiAtPSBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpOwogCi0JLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJLyogc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuICovCiAJcEZyYW1lUHRyICs9IDI7CiAJTXNnTGVuIC09IDI7CiAKQEAgLTEzNjAsMTkgKzE2ODgsMTggQEAKIAlwRnJhbWVQdHIgKz0gMTsKIAlNc2dMZW4gLT0gMTsKIAotCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpcEZyYW1lUHRyOwotCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFBVQ0hBUilwRnJhbWVQdHIgKyBNc2dMZW4pKQotCXsKLQkJc3dpdGNoKGVpZF9wdHItPkVpZCkKLQkJewotCQkJY2FzZSBJRV9UUENfUkVRVUVTVDoKLQkJCQlyZXN1bHQgPSBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOworCWVpZF9wdHIgPSAoc3RydWN0IHJ0X2VpZCAqKSBwRnJhbWVQdHI7CisJd2hpbGUgKCgodTggKikgZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwKKwkgICAgICAgKCh1OCAqKXBGcmFtZVB0ciArIE1zZ0xlbikpIHsKKwkJc3dpdGNoIChlaWRfcHRyLT5FaWQpIHsKKwkJY2FzZSBJRV9UUENfUkVRVUVTVDoKKwkJCXJlc3VsdCA9IFRSVUU7CisJCQlicmVhazsKIAotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOwogCQl9Ci0JCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCQllaWRfcHRyID0gKHN0cnVjdCBydF9laWQgKikgKCh1OCAqKSBlaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTEzOTIsMjEgKzE3MTksMjAgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLXN0YXRpYyBCT09MRUFOIFBlZXJUcGNSZXBTYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVk9JRCAqcE1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4sCi0JT1VUIFBUUENfUkVQT1JUX0lORk8gcFRwY1JlcEluZm8pCitzdGF0aWMgQk9PTEVBTiBQZWVyVHBjUmVwU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQl2b2lkICogcE1zZywKKwkJCQl1bnNpZ25lZCBsb25nIE1zZ0xlbiwKKwkJCQl1OCAqcERpYWxvZ1Rva2VuLAorCQkJCXN0cnVjdCBydF90cGNfcmVwb3J0X2luZm8gKiBwVHBjUmVwSW5mbykKIHsKLQlQRlJBTUVfODAyXzExIEZyID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKLQlQVUNIQVIgcEZyYW1lUHRyID0gRnItPk9jdGV0OworCXN0cnVjdCBydF9mcmFtZV84MDJfMTEgKiBGciA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIHBNc2c7CisJdTggKnBGcmFtZVB0ciA9IEZyLT5PY3RldDsKIAlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOwotCVBFSURfU1RSVUNUIGVpZF9wdHI7CisJc3RydWN0IHJ0X2VpZCAqIGVpZF9wdHI7CiAKLQlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCU1zZ0xlbiAtPSBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpOwogCi0JLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJLyogc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuICovCiAJcEZyYW1lUHRyICs9IDI7CiAJTXNnTGVuIC09IDI7CiAKQEAgLTE0MTcsMjEgKzE3NDMsMjEgQEAKIAlwRnJhbWVQdHIgKz0gMTsKIAlNc2dMZW4gLT0gMTsKIAotCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpcEZyYW1lUHRyOwotCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFBVQ0hBUilwRnJhbWVQdHIgKyBNc2dMZW4pKQotCXsKLQkJc3dpdGNoKGVpZF9wdHItPkVpZCkKLQkJewotCQkJY2FzZSBJRV9UUENfUkVQT1JUOgotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwVHBjUmVwSW5mby0+VHhQd3IsIGVpZF9wdHItPk9jdGV0LCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcFRwY1JlcEluZm8tPkxpbmtNYXJnaW4sIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7Ci0JCQkJcmVzdWx0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKKwllaWRfcHRyID0gKHN0cnVjdCBydF9laWQgKikgcEZyYW1lUHRyOworCXdoaWxlICgoKHU4ICopIGVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8CisJICAgICAgICgodTggKilwRnJhbWVQdHIgKyBNc2dMZW4pKSB7CisJCXN3aXRjaCAoZWlkX3B0ci0+RWlkKSB7CisJCWNhc2UgSUVfVFBDX1JFUE9SVDoKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwVHBjUmVwSW5mby0+VHhQd3IsIGVpZF9wdHItPk9jdGV0LCAxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwVHBjUmVwSW5mby0+TGlua01hcmdpbiwKKwkJCQkgICAgICAgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCXJlc3VsdCA9IFRSVUU7CisJCQlicmVhazsKIAotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOwogCQl9Ci0JCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCQllaWRfcHRyID0gKHN0cnVjdCBydF9laWQgKikgKCh1OCAqKSBlaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTE0NDgsNjQgKzE3NzQsNjkgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLXN0YXRpYyBWT0lEIFBlZXJDaFN3QW5uQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3N0YXRpYyB2b2lkIFBlZXJDaFN3QW5uQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlDSF9TV19BTk5fSU5GTyBDaFN3QW5uSW5mbzsKLQlQRlJBTUVfODAyXzExIHBGciA9IChQRlJBTUVfODAyXzExKUVsZW0tPk1zZzsKLQlVQ0hBUiBpbmRleCA9IDAsIENoYW5uZWwgPSAwLCBOZXdDaGFubmVsID0gMDsKLQlVTE9ORyBCc3NpZHggPSAwOworCXN0cnVjdCBydF9jaF9zd19hbm5faW5mbyBDaFN3QW5uSW5mbzsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogcEZyID0gKHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKikgRWxlbS0+TXNnOworCXU4IGluZGV4ID0gMCwgQ2hhbm5lbCA9IDAsIE5ld0NoYW5uZWwgPSAwOworCXVuc2lnbmVkIGxvbmcgQnNzaWR4ID0gMDsKIAotCU5kaXNaZXJvTWVtb3J5KCZDaFN3QW5uSW5mbywgc2l6ZW9mKENIX1NXX0FOTl9JTkZPKSk7Ci0JaWYgKCEgUGVlckNoU3dBbm5TYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkNoU3dBbm5JbmZvKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWQgQ2hhbm5lbCBTd2l0Y2ggQWN0aW9uIEZyYW1lLlxuIikpOworCU5kaXNaZXJvTWVtb3J5KCZDaFN3QW5uSW5mbywgc2l6ZW9mKHN0cnVjdCBydF9jaF9zd19hbm5faW5mbykpOworCWlmICghUGVlckNoU3dBbm5TYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkNoU3dBbm5JbmZvKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkludmFsaWQgQ2hhbm5lbCBTd2l0Y2ggQWN0aW9uIEZyYW1lLlxuIikpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0JewotCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwRnItPkhkci5BZGRyMywgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckNoU3dBbm5BY3Rpb24gLSBCc3NpZHggaXMgbm90IGZvdW5kXG4iKSk7CisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpIHsKKwkJQnNzaWR4ID0KKwkJICAgIEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBGci0+SGRyLkFkZHIzLAorCQkJCSAgIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlBlZXJDaFN3QW5uQWN0aW9uIC0gQnNzaWR4IGlzIG5vdCBmb3VuZFxuIikpOwogCQkJcmV0dXJuOwogCQl9CiAKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXG4qKioqQnNzaWR4IGlzICVkLCBDaGFubmVsID0gJWRcbiIsIGluZGV4LCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsKSk7Ci0JCWhleF9kdW1wKCJTU0lEIixwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5Cc3NpZCAsNik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiXG4qKioqQnNzaWR4IGlzICVkLCBDaGFubmVsID0gJWRcbiIsIGluZGV4LAorCQkJICBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsKSk7CisJCWhleF9kdW1wKCJTU0lEIiwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uQnNzaWQsIDYpOwogCiAJCUNoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwogCQlOZXdDaGFubmVsID0gQ2hTd0FubkluZm8uQ2hhbm5lbDsKIAotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmIChOZXdDaGFubmVsICE9IDApICYmIChDaGFubmVsICE9IE5ld0NoYW5uZWwpKQotCQl7Ci0JCQkvLyBTd2l0Y2hpbmcgdG8gY2hhbm5lbCAxIGNhbiBwcmV2ZW50IGZyb20gcmVzY2FubmluZyB0aGUgY3VycmVudCBjaGFubmVsIGltbWVkaWF0ZWx5IChieSBhdXRvIHJlY29ubmVjdGlvbikuCi0JCQkvLyBJbiBhZGRpdGlvbiwgY2xlYXIgdGhlIE1MTUUgcXVldWUgYW5kIHRoZSBzY2FuIHRhYmxlIHRvIGRpc2NhcmQgdGhlIFJYIHBhY2tldHMgYW5kIHByZXZpb3VzIHNjYW5uaW5nIHJlc3VsdHMuCisJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgKE5ld0NoYW5uZWwgIT0gMCkKKwkJICAgICYmIChDaGFubmVsICE9IE5ld0NoYW5uZWwpKSB7CisJCQkvKiBTd2l0Y2hpbmcgdG8gY2hhbm5lbCAxIGNhbiBwcmV2ZW50IGZyb20gcmVzY2FubmluZyB0aGUgY3VycmVudCBjaGFubmVsIGltbWVkaWF0ZWx5IChieSBhdXRvIHJlY29ubmVjdGlvbikuICovCisJCQkvKiBJbiBhZGRpdGlvbiwgY2xlYXIgdGhlIE1MTUUgcXVldWUgYW5kIHRoZSBzY2FuIHRhYmxlIHRvIGRpc2NhcmQgdGhlIFJYIHBhY2tldHMgYW5kIHByZXZpb3VzIHNjYW5uaW5nIHJlc3VsdHMuICovCiAJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIDEsIEZBTFNFKTsKIAkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIDEpOwotCQkgICAgTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKIAkJCU1sbWVRdWV1ZUluaXQoJnBBZC0+TWxtZS5RdWV1ZSk7CiAJCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7Ci0JCSAgICBSVE1QdXNlY0RlbGF5KDEwMDAwMDApOwkJLy8gdXNlIGRlbGF5IHRvIHByZXZlbnQgU1RBIGRvIHJlYXNzb2MKKwkJCVJUTVB1c2VjRGVsYXkoMTAwMDAwMCk7CS8qIHVzZSBkZWxheSB0byBwcmV2ZW50IFNUQSBkbyByZWFzc29jICovCiAKLQkJCS8vIGNoYW5uZWwgc2FuaXR5IGNoZWNrCi0JCQlmb3IgKGluZGV4ID0gMCA7IGluZGV4IDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaW5kZXgrKykKLQkJCXsKLQkJCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpbmRleF0uQ2hhbm5lbCA9PSBOZXdDaGFubmVsKQotCQkJCXsKLQkJCQkJcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisJCQkvKiBjaGFubmVsIHNhbml0eSBjaGVjayAqLworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaW5kZXgrKykgeworCQkJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2luZGV4XS5DaGFubmVsID09CisJCQkJICAgIE5ld0NoYW5uZWwpIHsKKwkJCQkJcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uQ2hhbm5lbCA9CisJCQkJCSAgICBOZXdDaGFubmVsOwogCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gTmV3Q2hhbm5lbDsKLQkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCImJiYmJiYmJiYmJiYmJiYmUGVlckNoU3dBbm5BY3Rpb24gLSBTVEEgcmVjZWl2ZSBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgSUUgKE5ldyBDaGFubmVsID0lZClcbiIsIE5ld0NoYW5uZWwpKTsKKwkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLAorCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuCisJCQkJCQkJICBDaGFubmVsLCBGQUxTRSk7CisJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsCisJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiJiYmJiYmJiYmJiYmJiYmJlBlZXJDaFN3QW5uQWN0aW9uIC0gU1RBIHJlY2VpdmUgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IElFIChOZXcgQ2hhbm5lbCA9JWQpXG4iLAorCQkJCQkJICBOZXdDaGFubmVsKSk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KIAotCQkJaWYgKGluZGV4ID49IHBBZC0+Q2hhbm5lbExpc3ROdW0pCi0JCQl7CisJCQlpZiAoaW5kZXggPj0gcEFkLT5DaGFubmVsTGlzdE51bSkgewogCQkJCURCR1BSSU5UX0VSUigoIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmUGVlckNoU3dBbm5BY3Rpb24oY2FuIG5vdCBmaW5kIE5ldyBDaGFubmVsPSVkIGluIENoYW5uZWxMaXN0WyVkXVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5DaGFubmVsTGlzdE51bSkpOwogCQkJfQogCQl9CkBAIC0xNTE0LDcgKzE4NDUsNiBAQAogCXJldHVybjsKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CkBAIC0xNTI2LDIwICsxODU2LDIzIEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1zdGF0aWMgVk9JRCBQZWVyTWVhc3VyZVJlcUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCitzdGF0aWMgdm9pZCBQZWVyTWVhc3VyZVJlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JUEZSQU1FXzgwMl8xMSBwRnIgPSAoUEZSQU1FXzgwMl8xMSlFbGVtLT5Nc2c7Ci0JVUlOVDggRGlhbG9nVG9rZW47Ci0JTUVBU1VSRV9SRVFfSU5GTyBNZWFzdXJlUmVxSW5mbzsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogcEZyID0gKHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKikgRWxlbS0+TXNnOworCXU4IERpYWxvZ1Rva2VuOworCXN0cnVjdCBydF9tZWFzdXJlX3JlcV9pbmZvIE1lYXN1cmVSZXFJbmZvOworCXN0cnVjdCBydF9tZWFzdXJlX3JlcSBNZWFzdXJlUmVxOwogCU1FQVNVUkVfUkVQT1JUX01PREUgUmVwb3J0TW9kZTsKIAotCWlmKFBlZXJNZWFzdXJlUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbiwgJk1lYXN1cmVSZXFJbmZvKSkKLQl7CisJaWYgKFBlZXJNZWFzdXJlUmVxU2FuaXR5CisJICAgIChwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4sICZNZWFzdXJlUmVxSW5mbywKKwkgICAgICZNZWFzdXJlUmVxKSkgewogCQlSZXBvcnRNb2RlLndvcmQgPSAwOwogCQlSZXBvcnRNb2RlLmZpZWxkLkluY2FwYWJsZSA9IDE7Ci0JCUVucXVldWVNZWFzdXJlbWVudFJlcChwQWQsIHBGci0+SGRyLkFkZHIyLCBEaWFsb2dUb2tlbiwgTWVhc3VyZVJlcUluZm8uVG9rZW4sIFJlcG9ydE1vZGUud29yZCwgTWVhc3VyZVJlcUluZm8uUmVxVHlwZSwgMCwgTlVMTCk7CisJCUVucXVldWVNZWFzdXJlbWVudFJlcChwQWQsIHBGci0+SGRyLkFkZHIyLCBEaWFsb2dUb2tlbiwKKwkJCQkgICAgICBNZWFzdXJlUmVxSW5mby5Ub2tlbiwgUmVwb3J0TW9kZS53b3JkLAorCQkJCSAgICAgIE1lYXN1cmVSZXFJbmZvLlJlcVR5cGUsIDAsIE5VTEwpOwogCX0KIAogCXJldHVybjsKQEAgLTE1NTYsNTQgKzE4ODksNjUgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLXN0YXRpYyBWT0lEIFBlZXJNZWFzdXJlUmVwb3J0QWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3N0YXRpYyB2b2lkIFBlZXJNZWFzdXJlUmVwb3J0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlNRUFTVVJFX1JFUE9SVF9JTkZPIE1lYXN1cmVSZXBvcnRJbmZvOwotCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOwotCVVJTlQ4IERpYWxvZ1Rva2VuOwotCVBVSU5UOCBwTWVhc3VyZVJlcG9ydEluZm87CisJc3RydWN0IHJ0X21lYXN1cmVfcmVwb3J0X2luZm8gTWVhc3VyZVJlcG9ydEluZm87CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGciA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIEVsZW0tPk1zZzsKKwl1OCBEaWFsb2dUb2tlbjsKKwl1OCAqcE1lYXN1cmVSZXBvcnRJbmZvOwogCi0vLwlpZiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggIT0gVFJVRSkKLS8vCQlyZXR1cm47CisvKiAgICAgIGlmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCAhPSBUUlVFKSAqLworLyogICAgICAgICAgICAgIHJldHVybjsgKi8KIAotCWlmICgocE1lYXN1cmVSZXBvcnRJbmZvID0ga21hbGxvYyhzaXplb2YoTUVBU1VSRV9SUElfUkVQT1JUKSwgR0ZQX0FUT01JQykpID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyB1bmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciBtZWFzdXJlIHJlcG9ydCBidWZmZXIgKHNpemU9JXp1KS5cbiIsIF9fZnVuY19fLCBzaXplb2YoTUVBU1VSRV9SUElfUkVQT1JUKSkpOworCWlmICgocE1lYXN1cmVSZXBvcnRJbmZvID0KKwkgICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9tZWFzdXJlX3JwaV9yZXBvcnQpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzIHVuYWJsZSB0byBhbGxvYyBtZW1vcnkgZm9yIG1lYXN1cmUgcmVwb3J0IGJ1ZmZlciAoc2l6ZT0lenUpLlxuIiwKKwkJCSAgX19mdW5jX18sIHNpemVvZihzdHJ1Y3QgcnRfbWVhc3VyZV9ycGlfcmVwb3J0KSkpOwogCQlyZXR1cm47CiAJfQogCi0JTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXBvcnRJbmZvLCBzaXplb2YoTUVBU1VSRV9SRVBPUlRfSU5GTykpOwotCU5kaXNaZXJvTWVtb3J5KHBNZWFzdXJlUmVwb3J0SW5mbywgc2l6ZW9mKE1FQVNVUkVfUlBJX1JFUE9SVCkpOwotCWlmIChQZWVyTWVhc3VyZVJlcG9ydFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4sICZNZWFzdXJlUmVwb3J0SW5mbywgcE1lYXN1cmVSZXBvcnRJbmZvKSkKLQl7CisJTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXBvcnRJbmZvLCBzaXplb2Yoc3RydWN0IHJ0X21lYXN1cmVfcmVwb3J0X2luZm8pKTsKKwlOZGlzWmVyb01lbW9yeShwTWVhc3VyZVJlcG9ydEluZm8sIHNpemVvZihzdHJ1Y3QgcnRfbWVhc3VyZV9ycGlfcmVwb3J0KSk7CisJaWYgKFBlZXJNZWFzdXJlUmVwb3J0U2FuaXR5CisJICAgIChwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4sICZNZWFzdXJlUmVwb3J0SW5mbywKKwkgICAgIHBNZWFzdXJlUmVwb3J0SW5mbykpIHsKIAkJZG8gewotCQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisJCQlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKnBFbnRyeSA9IE5VTEw7CiAKLQkJCS8vIE5vdCBhIGF1dG9ub21vdXMgbWVhc3VyZSByZXBvcnQuCi0JCQkvLyBjaGVjayB0aGUgZGlhbG9nIHRva2VuIGZpZWxkLiBkcm9wIGl0IGlmIHRoZSBkaWFsb2cgdG9rZW4gZG9lc24ndCBtYXRjaC4KKwkJCS8qIE5vdCBhIGF1dG9ub21vdXMgbWVhc3VyZSByZXBvcnQuICovCisJCQkvKiBjaGVjayB0aGUgZGlhbG9nIHRva2VuIGZpZWxkLiBkcm9wIGl0IGlmIHRoZSBkaWFsb2cgdG9rZW4gZG9lc24ndCBtYXRjaC4gKi8KIAkJCWlmICgoRGlhbG9nVG9rZW4gIT0gMCkKLQkJCQkmJiAoKHBFbnRyeSA9IE1lYXN1cmVSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbikpID09IE5VTEwpKQorCQkJICAgICYmICgocEVudHJ5ID0gTWVhc3VyZVJlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKSkgPT0KKwkJCQlOVUxMKSkKIAkJCQlicmVhazsKIAogCQkJaWYgKHBFbnRyeSAhPSBOVUxMKQogCQkJCU1lYXN1cmVSZXFEZWxldGUocEFkLCBwRW50cnktPkRpYWxvZ1Rva2VuKTsKIAotCQkJaWYgKE1lYXN1cmVSZXBvcnRJbmZvLlJlcG9ydFR5cGUgPT0gUk1fQkFTSUMpCi0JCQl7Ci0JCQkJUE1FQVNVUkVfQkFTSUNfUkVQT1JUIHBCYXNpY1JlcG9ydCA9IChQTUVBU1VSRV9CQVNJQ19SRVBPUlQpcE1lYXN1cmVSZXBvcnRJbmZvOworCQkJaWYgKE1lYXN1cmVSZXBvcnRJbmZvLlJlcG9ydFR5cGUgPT0gUk1fQkFTSUMpIHsKKwkJCQlzdHJ1Y3QgcnRfbWVhc3VyZV9iYXNpY19yZXBvcnQgKiBwQmFzaWNSZXBvcnQgPQorCQkJCSAgICAoc3RydWN0IHJ0X21lYXN1cmVfYmFzaWNfcmVwb3J0ICopIHBNZWFzdXJlUmVwb3J0SW5mbzsKIAkJCQlpZiAoKHBCYXNpY1JlcG9ydC0+TWFwLmZpZWxkLlJhZGFyKQotCQkJCQkmJiAoRGZzUmVxdWlyZW1lbnRDaGVjayhwQWQsIHBCYXNpY1JlcG9ydC0+Q2hOdW0pID09IFRSVUUpKQotCQkJCXsKLQkJCQkJTm90aWZ5Q2hTd0FublRvUGVlckFQcyhwQWQsIHBGci0+SGRyLkFkZHIxLCBwRnItPkhkci5BZGRyMiwgMSwgcEJhc2ljUmVwb3J0LT5DaE51bSk7Ci0JCQkJCVN0YXJ0REZTUHJvY2VkdXJlKHBBZCwgcEJhc2ljUmVwb3J0LT5DaE51bSwgMSk7CisJCQkJICAgICYmCisJCQkJICAgIChEZnNSZXF1aXJlbWVudENoZWNrCisJCQkJICAgICAocEFkLCBwQmFzaWNSZXBvcnQtPkNoTnVtKSA9PSBUUlVFKSkgeworCQkJCQlOb3RpZnlDaFN3QW5uVG9QZWVyQVBzKHBBZCwKKwkJCQkJCQkgICAgICAgcEZyLT5IZHIuQWRkcjEsCisJCQkJCQkJICAgICAgIHBGci0+SGRyLkFkZHIyLAorCQkJCQkJCSAgICAgICAxLAorCQkJCQkJCSAgICAgICBwQmFzaWNSZXBvcnQtPgorCQkJCQkJCSAgICAgICBDaE51bSk7CisJCQkJCVN0YXJ0REZTUHJvY2VkdXJlKHBBZCwKKwkJCQkJCQkgIHBCYXNpY1JlcG9ydC0+Q2hOdW0sCisJCQkJCQkJICAxKTsKIAkJCQl9CiAJCQl9CiAJCX0gd2hpbGUgKEZBTFNFKTsKLQl9Ci0JZWxzZQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbnZhbGlkIE1lYXN1cmVtZW50IFJlcG9ydCBGcmFtZS5cbiIpKTsKKwl9IGVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJJbnZhbGlkIE1lYXN1cmVtZW50IFJlcG9ydCBGcmFtZS5cbiIpKTsKIAogCWtmcmVlKHBNZWFzdXJlUmVwb3J0SW5mbyk7CiAKQEAgLTE2MjEsMzQgKzE5NjUsMzMgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLXN0YXRpYyBWT0lEIFBlZXJUcGNSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorc3RhdGljIHZvaWQgUGVlclRwY1JlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JUEZSQU1FXzgwMl8xMSBwRnIgPSAoUEZSQU1FXzgwMl8xMSlFbGVtLT5Nc2c7Ci0JUFVDSEFSIHBGcmFtZVB0ciA9IHBGci0+T2N0ZXQ7Ci0JVUlOVDggRGlhbG9nVG9rZW47Ci0JVUlOVDggVHhQd3IgPSBHZXRDdXJUeFB3cihwQWQsIEVsZW0tPldjaWQpOwotCVVJTlQ4IExpbmtNYXJnaW4gPSAwOwotCUNIQVIgUmVhbFJzc2k7CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGciA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIEVsZW0tPk1zZzsKKwl1OCAqcEZyYW1lUHRyID0gcEZyLT5PY3RldDsKKwl1OCBEaWFsb2dUb2tlbjsKKwl1OCBUeFB3ciA9IEdldEN1clR4UHdyKHBBZCwgRWxlbS0+V2NpZCk7CisJdTggTGlua01hcmdpbiA9IDA7CisJY2hhciBSZWFsUnNzaTsKIAotCS8vIGxpbmsgbWFyZ2luOiBSYXRpbyBvZiB0aGUgcmVjZWl2ZWQgc2lnbmFsIHBvd2VyIHRvIHRoZSBtaW5pbXVtIGRlc2lyZWQgYnkgdGhlIHN0YXRpb24gKFNUQSkuIFRoZQotCS8vCQkJCVNUQSBtYXkgaW5jb3Jwb3JhdGUgcmF0ZSBpbmZvcm1hdGlvbiBhbmQgY2hhbm5lbCBjb25kaXRpb25zLCBpbmNsdWRpbmcgaW50ZXJmZXJlbmNlLCBpbnRvIGl0cyBjb21wdXRhdGlvbgotCS8vCQkJCW9mIGxpbmsgbWFyZ2luLgorCS8qIGxpbmsgbWFyZ2luOiBSYXRpbyBvZiB0aGUgcmVjZWl2ZWQgc2lnbmFsIHBvd2VyIHRvIHRoZSBtaW5pbXVtIGRlc2lyZWQgYnkgdGhlIHN0YXRpb24gKFNUQSkuIFRoZSAqLworCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBIG1heSBpbmNvcnBvcmF0ZSByYXRlIGluZm9ybWF0aW9uIGFuZCBjaGFubmVsIGNvbmRpdGlvbnMsIGluY2x1ZGluZyBpbnRlcmZlcmVuY2UsIGludG8gaXRzIGNvbXB1dGF0aW9uICovCisJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBsaW5rIG1hcmdpbi4gKi8KIAogCVJlYWxSc3NpID0gUlRNUE1heFJzc2kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCksCi0JCQkJCQkJCUNvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMSwgUlNTSV8xKSwKLQkJCQkJCQkJQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpKTsKKwkJCSAgICAgICBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksCisJCQkgICAgICAgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpKTsKIAotCS8vIHNraXAgQ2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCS8qIHNraXAgQ2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLiAqLwogCXBGcmFtZVB0ciArPSAyOwogCi0JLy8gRGlhbG9nIHRva2VuLgorCS8qIERpYWxvZyB0b2tlbi4gKi8KIAlOZGlzTW92ZU1lbW9yeSgmRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7CiAKIAlMaW5rTWFyZ2luID0gKFJlYWxSc3NpIC8gTUlOX1JDVl9QV1IpOwogCWlmIChQZWVyVHBjUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbikpCi0JCUVucXVldWVUUENSZXAocEFkLCBwRnItPkhkci5BZGRyMiwgRGlhbG9nVG9rZW4sIFR4UHdyLCBMaW5rTWFyZ2luKTsKKwkJRW5xdWV1ZVRQQ1JlcChwQWQsIHBGci0+SGRyLkFkZHIyLCBEaWFsb2dUb2tlbiwgVHhQd3IsCisJCQkgICAgICBMaW5rTWFyZ2luKTsKIAogCXJldHVybjsKIH0KQEAgLTE2NjQsMjIgKzIwMDcsMjEgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLXN0YXRpYyBWT0lEIFBlZXJUcGNSZXBBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorc3RhdGljIHZvaWQgUGVlclRwY1JlcEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVUlOVDggRGlhbG9nVG9rZW47Ci0JVFBDX1JFUE9SVF9JTkZPIFRwY1JlcEluZm87Ci0JUFRQQ19SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKwl1OCBEaWFsb2dUb2tlbjsKKwlzdHJ1Y3QgcnRfdHBjX3JlcG9ydF9pbmZvIFRwY1JlcEluZm87CisJc3RydWN0IHJ0X3RwY19yZXFfZW50cnkgKnBFbnRyeSA9IE5VTEw7CiAKLQlOZGlzWmVyb01lbW9yeSgmVHBjUmVwSW5mbywgc2l6ZW9mKFRQQ19SRVBPUlRfSU5GTykpOwotCWlmIChQZWVyVHBjUmVwU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbiwgJlRwY1JlcEluZm8pKQotCXsKLQkJaWYgKChwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbikpICE9IE5VTEwpCi0JCXsKKwlOZGlzWmVyb01lbW9yeSgmVHBjUmVwSW5mbywgc2l6ZW9mKHN0cnVjdCBydF90cGNfcmVwb3J0X2luZm8pKTsKKwlpZiAoUGVlclRwY1JlcFNhbml0eQorCSAgICAocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkRpYWxvZ1Rva2VuLCAmVHBjUmVwSW5mbykpIHsKKwkJaWYgKChwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbikpICE9IE5VTEwpIHsKIAkJCVRwY1JlcURlbGV0ZShwQWQsIHBFbnRyeS0+RGlhbG9nVG9rZW4pOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6IERpYWxvZ1Rva2VuPSV4LCBUeFB3cj0lZCwgTGlua01hcmdpbj0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgRGlhbG9nVG9rZW4sIFRwY1JlcEluZm8uVHhQd3IsIFRwY1JlcEluZm8uTGlua01hcmdpbikpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiJXM6IERpYWxvZ1Rva2VuPSV4LCBUeFB3cj0lZCwgTGlua01hcmdpbj0lZFxuIiwKKwkJCQkgIF9fZnVuY19fLCBEaWFsb2dUb2tlbiwgVHBjUmVwSW5mby5UeFB3ciwKKwkJCQkgIFRwY1JlcEluZm8uTGlua01hcmdpbikpOwogCQl9CiAJfQogCkBAIC0xNjk4LDQxICsyMDQwLDM3IEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIFBlZXJTcGVjdHJ1bUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIFBlZXJTcGVjdHJ1bUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7CiAKLQlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKKwl1OCBBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIDFdOwogCiAJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIICE9IFRSVUUpCiAJCXJldHVybjsKIAotCXN3aXRjaChBY3Rpb24pCi0JewotCQljYXNlIFNQRUNfTVJROgotCQkJLy8gY3VycmVudCBydDI4NjAgdW5hYmxlIGRvIHN1Y2ggbWVhc3VyZSBzcGVjaWZpZWQgaW4gTWVhc3VyZW1lbnQgUmVxdWVzdC4KLQkJCS8vIHJlamVjdCBhbGwgbWVhc3VyZW1lbnQgcmVxdWVzdC4KLQkJCVBlZXJNZWFzdXJlUmVxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKKwlzd2l0Y2ggKEFjdGlvbikgeworCWNhc2UgU1BFQ19NUlE6CisJCS8qIGN1cnJlbnQgcnQyODYwIHVuYWJsZSBkbyBzdWNoIG1lYXN1cmUgc3BlY2lmaWVkIGluIE1lYXN1cmVtZW50IFJlcXVlc3QuICovCisJCS8qIHJlamVjdCBhbGwgbWVhc3VyZW1lbnQgcmVxdWVzdC4gKi8KKwkJUGVlck1lYXN1cmVSZXFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBTUEVDX01SUDoKLQkJCVBlZXJNZWFzdXJlUmVwb3J0QWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKKwljYXNlIFNQRUNfTVJQOgorCQlQZWVyTWVhc3VyZVJlcG9ydEFjdGlvbihwQWQsIEVsZW0pOworCQlicmVhazsKIAotCQljYXNlIFNQRUNfVFBDUlE6Ci0JCQlQZWVyVHBjUmVxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKKwljYXNlIFNQRUNfVFBDUlE6CisJCVBlZXJUcGNSZXFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBTUEVDX1RQQ1JQOgotCQkJUGVlclRwY1JlcEFjdGlvbihwQWQsIEVsZW0pOwotCQkJYnJlYWs7CisJY2FzZSBTUEVDX1RQQ1JQOgorCQlQZWVyVHBjUmVwQWN0aW9uKHBBZCwgRWxlbSk7CisJCWJyZWFrOwogCi0JCWNhc2UgU1BFQ19DSEFOTkVMX1NXSVRDSDoKLXsKLX0KLQkJCVBlZXJDaFN3QW5uQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKKwljYXNlIFNQRUNfQ0hBTk5FTF9TV0lUQ0g6CisKKwkJUGVlckNoU3dBbm5BY3Rpb24ocEFkLCBFbGVtKTsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuOwpAQCAtMTc0Nyw0OSArMjA4NSw2MyBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotSU5UIFNldF9NZWFzdXJlUmVxX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQoraW50IFNldF9NZWFzdXJlUmVxX1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyICphcmcpCiB7Ci0JVUlOVCBBaWQgPSAxOwotCVVJTlQgQXJnSWR4OwotCVBVQ0hBUiB0aGlzQ2hhcjsKKwl1MzIgQWlkID0gMTsKKwl1MzIgQXJnSWR4OworCWNoYXIgKnRoaXNDaGFyOwogCiAJTUVBU1VSRV9SRVFfTU9ERSBNZWFzdXJlUmVxTW9kZTsKLQlVSU5UOCBNZWFzdXJlUmVxVG9rZW4gPSBSYW5kb21CeXRlKHBBZCk7Ci0JVUlOVDggTWVhc3VyZVJlcVR5cGUgPSBSTV9CQVNJQzsKLQlVSU5UOCBNZWFzdXJlQ2ggPSAxOworCXU4IE1lYXN1cmVSZXFUb2tlbiA9IFJhbmRvbUJ5dGUocEFkKTsKKwl1OCBNZWFzdXJlUmVxVHlwZSA9IFJNX0JBU0lDOworCXU4IE1lYXN1cmVDaCA9IDE7CisJdTY0IE1lYXN1cmVTdGFydFRpbWUgPSBHZXRDdXJyZW50VGltZVN0YW1wKHBBZCk7CisJc3RydWN0IHJ0X21lYXN1cmVfcmVxIE1lYXN1cmVSZXE7CisJdTggVG90YWxMZW47CisKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBBY3RIZHI7CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCWludCBOU3RhdHVzOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW47CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKHZvaWQgKikmIHBPdXRCdWZmZXIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CisJCWdvdG8gRU5EX09GX01FQVNVUkVfUkVROworCX0KIAogCUFyZ0lkeCA9IDE7Ci0Jd2hpbGUgKCh0aGlzQ2hhciA9IHN0cnNlcCgoY2hhciAqKikmYXJnLCAiLSIpKSAhPSBOVUxMKQotCXsKLQkJc3dpdGNoKEFyZ0lkeCkKLQkJewotCQkJY2FzZSAxOgkvLyBBaWQuCi0JCQkJQWlkID0gc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOwotCQkJCWJyZWFrOworCXdoaWxlICgodGhpc0NoYXIgPSBzdHJzZXAoKGNoYXIgKiopJmFyZywgIi0iKSkgIT0gTlVMTCkgeworCQlzd2l0Y2ggKEFyZ0lkeCkgeworCQljYXNlIDE6CS8qIEFpZC4gKi8KKwkJCUFpZCA9ICh1OClzaW1wbGVfc3RydG9sKHRoaXNDaGFyLCAwLCAxNik7CisJCQlicmVhazsKIAotCQkJY2FzZSAyOiAvLyBNZWFzdXJlbWVudCBSZXF1ZXN0IFR5cGUuCi0JCQkJTWVhc3VyZVJlcVR5cGUgPSBzaW1wbGVfc3RydG9sKHRoaXNDaGFyLCAwLCAxNik7Ci0JCQkJaWYgKE1lYXN1cmVSZXFUeXBlID4gMykKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgTWVhc3VyZVJlcVR5cGUoJWQpXG4iLCBfX2Z1bmNfXywgTWVhc3VyZVJlcVR5cGUpKTsKLQkJCQkJcmV0dXJuIFRSVUU7Ci0JCQkJfQotCQkJCWJyZWFrOworCQljYXNlIDI6CS8qIE1lYXN1cmVtZW50IFJlcXVlc3QgVHlwZS4gKi8KKwkJCU1lYXN1cmVSZXFUeXBlID0gc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOworCQkJaWYgKE1lYXN1cmVSZXFUeXBlID4gMykgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgKCIlczogdW5rbm93IE1lYXN1cmVSZXFUeXBlKCVkKVxuIiwKKwkJCQkJICBfX2Z1bmNfXywgTWVhc3VyZVJlcVR5cGUpKTsKKwkJCQlnb3RvIEVORF9PRl9NRUFTVVJFX1JFUTsKKwkJCX0KKwkJCWJyZWFrOwogCi0JCQljYXNlIDM6IC8vIE1lYXN1cmVtZW50IGNoYW5uZWwuCi0JCQkJTWVhc3VyZUNoID0gc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOwotCQkJCWJyZWFrOworCQljYXNlIDM6CS8qIE1lYXN1cmVtZW50IGNoYW5uZWwuICovCisJCQlNZWFzdXJlQ2ggPSAodTgpc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOworCQkJYnJlYWs7CiAJCX0KIAkJQXJnSWR4Kys7CiAJfQogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OkFpZCA9ICVkLCBNZWFzdXJlUmVxVHlwZT0lZCBNZWFzdXJlQ2g9JWRcbiIsIF9fZnVuY19fLCBBaWQsIE1lYXN1cmVSZXFUeXBlLCBNZWFzdXJlQ2gpKTsKLQlpZiAoIVZBTElEX1dDSUQoQWlkKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgc3RhIG9mIEFpZCglZClcbiIsIF9fZnVuY19fLCBBaWQpKTsKLQkJcmV0dXJuIFRSVUU7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiVzOjpBaWQgPSAlZCwgTWVhc3VyZVJlcVR5cGU9JWQgTWVhc3VyZUNoPSVkXG4iLCBfX2Z1bmNfXywKKwkJICBBaWQsIE1lYXN1cmVSZXFUeXBlLCBNZWFzdXJlQ2gpKTsKKwlpZiAoIVZBTElEX1dDSUQoQWlkKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzOiB1bmtub3cgc3RhIG9mIEFpZCglZClcbiIsIF9fZnVuY19fLCBBaWQpKTsKKwkJZ290byBFTkRfT0ZfTUVBU1VSRV9SRVE7CiAJfQogCiAJTWVhc3VyZVJlcU1vZGUud29yZCA9IDA7CkBAIC0xNzk3LDI2ICsyMTQ5LDUyIEBACiAKIAlNZWFzdXJlUmVxSW5zZXJ0KHBBZCwgTWVhc3VyZVJlcVRva2VuKTsKIAotCUVucXVldWVNZWFzdXJlbWVudFJlcShwQWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5BZGRyLAotCQlNZWFzdXJlUmVxVG9rZW4sIE1lYXN1cmVSZXFNb2RlLndvcmQsIE1lYXN1cmVSZXFUeXBlLCBNZWFzdXJlQ2gsIDIwMDApOworCS8qIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuICovCisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLAorCQkJIHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKworCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChjaGFyICopJiBBY3RIZHIsIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOworCUZyYW1lTGVuID0gc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKTsKKworCVRvdGFsTGVuID0gc2l6ZW9mKHN0cnVjdCBydF9tZWFzdXJlX3JlcV9pbmZvKSArIHNpemVvZihzdHJ1Y3QgcnRfbWVhc3VyZV9yZXEpOworCisJTWFrZU1lYXN1cmVtZW50UmVxRnJhbWUocEFkLCBwT3V0QnVmZmVyLCAmRnJhbWVMZW4sCisJCQkJc2l6ZW9mKHN0cnVjdCBydF9tZWFzdXJlX3JlcV9pbmZvKSwgQ0FURUdPUllfUk0sIFJNX0JBU0lDLAorCQkJCU1lYXN1cmVSZXFUb2tlbiwgTWVhc3VyZVJlcU1vZGUud29yZCwKKwkJCQlNZWFzdXJlUmVxVHlwZSwgMCk7CisKKwlNZWFzdXJlUmVxLkNoTnVtID0gTWVhc3VyZUNoOworCU1lYXN1cmVSZXEuTWVhc3VyZVN0YXJ0VGltZSA9IGNwdTJsZTY0KE1lYXN1cmVTdGFydFRpbWUpOworCU1lYXN1cmVSZXEuTWVhc3VyZUR1cmF0aW9uID0gY3B1MmxlMTYoMjAwMCk7CisKKwl7CisJCXVuc2lnbmVkIGxvbmcgVGVtcExlbjsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmVGVtcExlbiwKKwkJCQkgIHNpemVvZihzdHJ1Y3QgcnRfbWVhc3VyZV9yZXEpLCAmTWVhc3VyZVJlcSwKKwkJCQkgIEVORF9PRl9BUkdTKTsKKwkJRnJhbWVMZW4gKz0gVGVtcExlbjsKKwl9CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgKHUzMilGcmFtZUxlbik7CisKK0VORF9PRl9NRUFTVVJFX1JFUToKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogCiAJcmV0dXJuIFRSVUU7CiB9CiAKLUlOVCBTZXRfVHBjUmVxX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQoraW50IFNldF9UcGNSZXFfUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGNoYXIgKmFyZykKIHsKLQlVSU5UIEFpZDsKKwl1MzIgQWlkOwogCi0JVUlOVDggVHBjUmVxVG9rZW4gPSBSYW5kb21CeXRlKHBBZCk7CisJdTggVHBjUmVxVG9rZW4gPSBSYW5kb21CeXRlKHBBZCk7CiAKLQlBaWQgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOworCUFpZCA9ICh1MzIpc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpBaWQgPSAlZFxuIiwgX19mdW5jX18sIEFpZCkpOwotCWlmICghVkFMSURfV0NJRChBaWQpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHVua25vdyBzdGEgb2YgQWlkKCVkKVxuIiwgX19mdW5jX18sIEFpZCkpOworCWlmICghVkFMSURfV0NJRChBaWQpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXM6IHVua25vdyBzdGEgb2YgQWlkKCVkKVxuIiwgX19mdW5jX18sIEFpZCkpOwogCQlyZXR1cm4gVFJVRTsKIAl9CiAKQEAgLTE4MjYsNCArMjIwNCwzIEBACiAKIAlyZXR1cm4gVFJVRTsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb25maWcubWsgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbmZpZy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjViZDU1YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbmZpZy5taworKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0jIFN1cHBvcnQgQVRFIGZ1bmN0aW9uCi1IQVNfQVRFPW4KLQotIyBTdXBwb3J0IDI4eHggUUEgQVRFIGZ1bmN0aW9uCi1IQVNfMjh4eF9RQT1uCi0KLSMgU3VwcG9ydCBXcGFfU3VwcGxpY2FudAotSEFTX1dQQV9TVVBQTElDQU5UPW4KLQotIyBTdXBwb3J0IE5hdGl2ZSBXcGFTdXBwbGljYW50IGZvciBOZXR3b3JrIE1hZ2FuZ2VyCi1IQVNfTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQ9bgotCi0jU3VwcG9ydCBOZXQgaW50ZXJmYWNlIGJsb2NrIHdoaWxlIFR4LVN3IHF1ZXVlIGZ1bGwKLUhBU19CTE9DS19ORVRfSUY9bgotCi0jU3VwcG9ydCBERlMgZnVuY3Rpb24KLUhBU19ERlNfU1VQUE9SVD1uCi0KLSNTdXBwb3J0IENhcnJpZXItU2Vuc2UgZnVuY3Rpb24KLUhBU19DU19TVVBQT1JUPW4KLQotI2lmZGVmIE1VTFRJX0NBUkQKLSMgU3VwcG9ydCBmb3IgTXVsdGlwbGUgQ2FyZHMKLUhBU19NQ19TVVBQT1JUPW4KLSNlbmRpZiAvLyBNVUxUSV9DQVJEIC8vCi0KLSNTdXBwb3J0IGZvciBJRUVFODAyLjExZSBETFMKLUhBU19RT1NfRExTX1NVUFBPUlQ9bgotCi0jU3VwcG9ydCBmb3IgRVhUX0NIQU5ORUwKLUhBU19FWFRfQlVJTERfQ0hBTk5FTF9MSVNUPW4KLQotI1N1cHBvcnQgZm9yIE5ldC1TTk1QCi1IQVNfU05NUF9TVVBQT1JUPW4KLQotI1N1cHBvcnQgZmVhdHVyZXMgb2YgU2luZ2xlIFNLVS4KLUhBU19TSU5HTEVfU0tVX1NVUFBPUlQ9bgotCi0jU3VwcG9ydCBmZWF0dXJlcyBvZiA4MDIuMTFuCi1IQVNfRE9UMTFfTl9TVVBQT1JUPXkKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUNDIDo9ICQoQ1JPU1NfQ09NUElMRSlnY2MKLUxEIDo9ICQoQ1JPU1NfQ09NUElMRSlsZAotCi1XRkxBR1MgOj0gLURBR0dSRUdBVElPTl9TVVBQT1JUIC1EUElHR1lCQUNLX1NVUFBPUlQgLURXTU1fU1VQUE9SVCAgLURMSU5VWCAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jIGNvbmZpZyBmb3IgU1RBIG1vZGUKLQotaWZlcSAoJChSVDI4eHhfTU9ERSksU1RBKQotV0ZMQUdTICs9IC1EQ09ORklHX1NUQV9TVVBQT1JUIC1EREJHCi0KLWlmZXEgKCQoSEFTX1dQQV9TVVBQTElDQU5UKSx5KQotV0ZMQUdTICs9IC1EV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotZW5kaWYKLQotaWZlcSAoJChIQVNfTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLUROQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotZW5kaWYKLQotaWZlcSAoJChIQVNfQVRFKSx5KQotV0ZMQUdTICs9IC1EUkFMSU5LX0FURQotaWZlcSAoJChIQVNfMjh4eF9RQSkseSkKLVdGTEFHUyArPSAtRFJBTElOS18yOHh4X1FBCi1lbmRpZgotZW5kaWYKLQotaWZlcSAoJChIQVNfU05NUF9TVVBQT1JUKSx5KQotV0ZMQUdTICs9IC1EU05NUF9TVVBQT1JUCi1lbmRpZgotCi1pZmVxICgkKEhBU19RT1NfRExTX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURRT1NfRExTX1NVUFBPUlQKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX0RPVDExX05fU1VQUE9SVCkseSkKLVdGTEFHUyArPSAtRERPVDExX05fU1VQUE9SVAotZW5kaWYKLQotaWZlcSAoJChIQVNfQ1NfU1VQUE9SVCkseSkKLVdGTEFHUyArPSAtRENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX1NJTkdMRV9TS1VfU1VQUE9SVCkseSkKLVdGTEFHUyArPSAtRFNJTkdMRV9TS1UKLWVuZGlmCi0KLWVuZGlmCi0jIGVuZGlmIG9mIGlmZXEgKCQoUlQyOHh4X01PREUpLFNUQSkKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgQ29tbW9uIGNvbXBpbGVyIGZsYWcKLSMKLQotCi1pZmVxICgkKEhBU19FWFRfQlVJTERfQ0hBTk5FTF9MSVNUKSx5KQotV0ZMQUdTICs9IC1ERVhUX0JVSUxEX0NIQU5ORUxfTElTVAotZW5kaWYKLQotaWZlcSAoJChDSElQU0VUKSwyODcwKQotV0ZMQUdTICs9LURSVDI4NzAKLWVuZGlmCi0KLWlmZXEgKCQoUExBVEZPUk0pLDVWVCkKLSNXRkxBR1MgKz0gLURDT05GSUdfNVZUX0VOSEFOQ0UKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX0JMT0NLX05FVF9JRikseSkKLVdGTEFHUyArPSAtREJMT0NLX05FVF9JRgotZW5kaWYKLQotaWZlcSAoJChIQVNfREZTX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURERlNfU1VQUE9SVAotZW5kaWYKLQotI2lmZGVmIE1VTFRJX0NBUkQKLWlmZXEgKCQoSEFTX01DX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURNVUxUSVBMRV9DQVJEX1NVUFBPUlQKLWVuZGlmCi0jZW5kaWYgLy8gTVVMVElfQ0FSRCAvLwotCi1pZmVxICgkKEhBU19MTFREKSx5KQotV0ZMQUdTICs9IC1ETExURF9TVVBQT1JUCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxJWFApCi1XRkxBR1MgKz0gLURSVF9CSUdfRU5ESUFOCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxJS0FOT1NfVjE2MCkKLVdGTEFHUyArPSAtRFJUX0JJR19FTkRJQU4gLURJS0FOT1NfVlhfMVgwCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxJS0FOT1NfVjE4MCkKLVdGTEFHUyArPSAtRFJUX0JJR19FTkRJQU4gLURJS0FOT1NfVlhfMVgwCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxJTkZfVFdJTlBBU1MpCi1XRkxBR1MgKz0gLURSVF9CSUdfRU5ESUFOIC1ESU5GX1RXSU5QQVNTCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxJTkZfREFOVUJFKQotV0ZMQUdTICs9IC1ESU5GX0RBTlVCRSAtRFJUX0JJR19FTkRJQU4KLWVuZGlmCi0KLWlmZXEgKCQoUExBVEZPUk0pLENBVk1fT0NURU9OKQotV0ZMQUdTICs9IC1EUlRfQklHX0VORElBTgotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksQlJDTV82MzU4KQotV0ZMQUdTICs9IC1EUlRfQklHX0VORElBTgotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksSU5GX0FNQVpPTl9TRSkKLSNXRkxBR1MgKz0gLURSVF9CSUdfRU5ESUFOIC1ESU5GX0FNQVpPTl9TRSAtREJHX0ZUX1NVUFBPUlQKLVdGTEFHUyArPSAtRFJUX0JJR19FTkRJQU4gLURJTkZfQU1BWk9OX1NFCi1lbmRpZgotCi0ja2VybmVsIGJ1aWxkIG9wdGlvbnMgZm9yIDIuNAotIyBtb3ZlIHRvIE1ha2VmaWxlIG91dHNpZGUgTElOVVhfU1JDIDo9IC9vcHQvc3Rhci9rZXJuZWwvbGludXgtMi40LjI3LXN0YXIKLQotaWZlcSAoJChQTEFURk9STSksU1RBUikKLUNGTEFHUyA6PSAtRF9fS0VSTkVMX18gLUkkKExJTlVYX1NSQykvaW5jbHVkZSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1PMiAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtVWFybSAtZm5vLWNvbW1vbiAtcGlwZSAtbWFwY3MtMzIgLURfX0xJTlVYX0FSTV9BUkNIX189NCAtbWFyY2g9YXJtdjQgIC1tc2hvcnQtbG9hZC1ieXRlcyAtbXNvZnQtZmxvYXQgLVVhcm0gLURNT0RVTEUgLURNT0RWRVJTSU9OUyAtaW5jbHVkZSAkKExJTlVYX1NSQykvaW5jbHVkZS9saW51eC9tb2R2ZXJzaW9ucy5oICQoV0ZMQUdTKQotCi1leHBvcnQgQ0ZMQUdTCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxTSUdNQSkKLUNGTEFHUyA6PSAtRF9fS0VSTkVMX18gLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLUkkKExJTlVYX1NSQykvaW5jbHVkZSAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS9nY2MgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXRhbmdvMiAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtdGFuZ28yIC1ERU04NlhYX0NISVA9RU04NlhYX0NISVBJRF9UQU5HTzIgLURFTTg2WFhfUkVWSVNJT049NiAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYyAtSSQoUlQyODYwX0RJUikvaW5jbHVkZSAtV2FsbCAtV3VuZGVmIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLWZmcmVlc3RhbmRpbmcgLU8yICAgICAtZm9taXQtZnJhbWUtcG9pbnRlciAtRyAwIC1tbm8tYWJpY2FsbHMgLWZuby1waWMgLXBpcGUgIC1tYWJpPTMyIC1tYXJjaD1taXBzMzJyMiAtV2EsLTMyIC1XYSwtbWFyY2g9bWlwczMycjIgLVdhLC1taXBzMzJyMiAtV2EsLS10cmFwIC1ETU9EVUxFICQoV0ZMQUdTKQotCi1leHBvcnQgQ0ZMQUdTCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxTSUdNQV84NjIyKQotQ0ZMQUdTIDo9IC1EX19LRVJORUxfXyAtSSQoQ1JPU1NfQ09NUElMRV9JTkNMVURFKS9pbmNsdWRlIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyAtTzIgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLWZuby1jb21tb24gLXBpcGUgLWZuby1idWlsdGluIC1EX19saW51eF9fIC1ETk9fTU0gLW1hcGNzLTMyIC1tYXJjaD1hcm12NCAtbXR1bmU9YXJtN3RkbWkgLW1zb2Z0LWZsb2F0IC1ETU9EVUxFIC1tc2hvcnQtbG9hZC1ieXRlcyAtbm9zdGRpbmMgLWl3aXRocHJlZml4IC1ETU9EVUxFICQoV0ZMQUdTKQotZXhwb3J0IENGTEFHUwotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksNVZUKQotQ0ZMQUdTIDo9IC1EX19LRVJORUxfXyAtSSQoTElOVVhfU1JDKS9pbmNsdWRlIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1tbGl0dGxlLWVuZGlhbiAtV2FsbCAtV3VuZGVmIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLU8zIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtbWFwY3MgLW1uby1zY2hlZC1wcm9sb2cgLW1hYmk9YXBjcy1nbnUgLW1uby10aHVtYi1pbnRlcndvcmsgLURfX0xJTlVYX0FSTV9BUkNIX189NSAtbWFyY2g9YXJtdjV0ZSAtbXR1bmU9YXJtOTI2ZWotcyAtLXBhcmFtIG1heC1pbmxpbmUtaW5zbnMtc2luZ2xlPTQwMDAwICAtVWFybSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAtV25vLXBvaW50ZXItc2lnbiAtRE1PRFVMRSAkKFdGTEFHUykKLQotZXhwb3J0IENGTEFHUwotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksSUtBTk9TX1YxNjApCi1DRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20vZ2NjIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC10YW5nbzIgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXRhbmdvMiAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYyAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtV2FsbCAtV3VuZGVmIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLWZmcmVlc3RhbmRpbmcgLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIC1HIDAgLW1uby1hYmljYWxscyAtZm5vLXBpYyAtcGlwZSAtbWFyY2g9bHg0MTg5IC1XYSwgLURNT0RVTEUgJChXRkxBR1MpCi1leHBvcnQgQ0ZMQUdTCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxJS0FOT1NfVjE4MCkKLUNGTEFHUyA6PSAtRF9fS0VSTkVMX18gLUkkKExJTlVYX1NSQykvaW5jbHVkZSAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS9nY2MgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXRhbmdvMiAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtdGFuZ28yIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1XYWxsIC1XdW5kZWYgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtZmZyZWVzdGFuZGluZyAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUcgMCAtbW5vLWFiaWNhbGxzIC1mbm8tcGljIC1waXBlIC1taXBzMzJyMiAtV2EsIC1ETU9EVUxFICQoV0ZMQUdTKQotZXhwb3J0IENGTEFHUwotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksSU5GX1RXSU5QQVNTKQotQ0ZMQUdTIDo9IC1EX19LRVJORUxfXyAtRE1PRFVMRSAtSSQoTElOVVhfU1JDKS9pbmNsdWRlIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1HIDAgLW1uby1hYmljYWxscyAtZm5vLXBpYyAtbWFyY2g9NGtjIC1taXBzMzIgLVdhLC0tdHJhcCAtcGlwZSAtbWxvbmctY2FsbHMgJChXRkxBR1MpCi1leHBvcnQgQ0ZMQUdTCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxJTkZfREFOVUJFKQotQ0ZMQUdTIDo9IC1JJChSVDI4eHhfRElSKS9pbmNsdWRlICQoV0ZMQUdTKSAtV3VuZGVmIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1mZnJlZXN0YW5kaW5nIC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlciAtRyAwIC1tbm8tYWJpY2FsbHMgLWZuby1waWMgLXBpcGUgLW1zb2Z0LWZsb2F0ICAtbWFiaT0zMiAtbWFyY2g9bWlwczMyIC1XYSwtMzIgLVdhLC1tYXJjaD1taXBzMzIgLVdhLC1taXBzMzIgLVdhLC0tdHJhcCAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYwotZXhwb3J0IENGTEFHUwotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksQlJDTV82MzU4KQotQ0ZMQUdTIDo9ICQoV0ZMQUdTKSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtbm9zdGRpbmMgLWl3aXRocHJlZml4IGluY2x1ZGUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLUkgJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtL2djYyAtRyAwIC1tbm8tYWJpY2FsbHMgLWZuby1waWMgLXBpcGUgIC1maW5saW5lLWxpbWl0PTEwMDAwMCAtbWFiaT0zMiAtbWFyY2g9bWlwczMyIC1XYSwtMzIgLVdhLC1tYXJjaD1taXBzMzIgLVdhLC1taXBzMzIgLVdhLC0tdHJhcCAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtYmNtOTYzeHggLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMgIC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlciAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLURNT0RVTEUgLW1sb25nLWNhbGxzCi1leHBvcnQgQ0ZMQUdTCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxQQykKLSAgICBpZm5lcSAoLCQoZmluZHN0cmluZyAyLjQsJChMSU5VWF9TUkMpKSkKLQkjIExpbnV4IDIuNAotCUNGTEFHUyA6PSAtRF9fS0VSTkVMX18gLUkkKExJTlVYX1NSQykvaW5jbHVkZSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLXBpcGUgLW1wcmVmZXJyZWQtc3RhY2stYm91bmRhcnk9MiAtbWFyY2g9aTY4NiAtRE1PRFVMRSAtRE1PRFZFUlNJT05TIC1pbmNsdWRlICQoTElOVVhfU1JDKS9pbmNsdWRlL2xpbnV4L21vZHZlcnNpb25zLmggJChXRkxBR1MpCi0JZXhwb3J0IENGTEFHUwotICAgIGVsc2UKLQkjIExpbnV4IDIuNgotCUVYVFJBX0NGTEFHUyA6PSAkKFdGTEFHUykgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUKLSAgICBlbmRpZgotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksSVhQKQotICAgICAgICBFWFRSQV9DRkxBR1MgOj0gLXYgJChXRkxBR1MpIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1tYmlnLWVuZGlhbgotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksQ0FWTV9PQ1RFT04pCi0JRVhUUkFfQ0ZMQUdTIDo9ICQoV0ZMQUdTKSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSBcCi0JCQkJICAgIC1tYWJpPTY0ICQoV0ZMQUdTKQotZXhwb3J0IENGTEFHUwotZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jcnlwdF9obWFjLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NyeXB0X2htYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTU2NTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jcnlwdF9obWFjLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBNb2R1bGUgTmFtZToKKyAgICBITUFDCisKKyAgICBBYnN0cmFjdDoKKyAgICBGSVBTIDE5ODogVGhlIEtleWVkLUhhc2ggTWVzc2FnZSBBdXRoZW50aWNhdGlvbiBDb2RlIChITUFDKQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFZGR5ICAgICAgICAyMDA4LzExLzI0ICAgICAgQ3JlYXRlIEhNQUMtU0hBMSwgSE1BQy1TSEEyNTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX19DUllQVF9ITUFDX0hfXworI2RlZmluZSBfX0NSWVBUX0hNQUNfSF9fCisKKyNpZmRlZiBDUllQVF9URVNUUExBTgorI2luY2x1ZGUgImNyeXB0X3Rlc3RwbGFuLmgiCisjZWxzZQorI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgorI2VuZGlmIC8qIENSWVBUX1RFU1RQTEFOICovCisKKyNpZmRlZiBTSEExX1NVUFBPUlQKKyNkZWZpbmUgSE1BQ19TSEExX1NVUFBPUlQKK3ZvaWQgSE1BQ19TSEExKElOIGNvbnN0IHU4IEtleVtdLAorCSAgICAgICB1MzIgS2V5TGVuLAorCSAgICAgICBJTiBjb25zdCB1OCBNZXNzYWdlW10sCisJICAgICAgIHUzMiBNZXNzYWdlTGVuLCB1OCBNQUNbXSwgdTMyIE1BQ0xlbik7CisjZW5kaWYgLyogU0hBMV9TVVBQT1JUICovCisKKyNpZmRlZiBNRDVfU1VQUE9SVAorI2RlZmluZSBITUFDX01ENV9TVVBQT1JUCit2b2lkIEhNQUNfTUQ1KElOIGNvbnN0IHU4IEtleVtdLAorCSAgICAgIHUzMiBLZXlMZW4sCisJICAgICAgSU4gY29uc3QgdTggTWVzc2FnZVtdLAorCSAgICAgIHUzMiBNZXNzYWdlTGVuLCB1OCBNQUNbXSwgdTMyIE1BQ0xlbik7CisjZW5kaWYgLyogTUQ1X1NVUFBPUlQgKi8KKworI2VuZGlmIC8qIF9fQ1JZUFRfSE1BQ19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY3J5cHRfbWQ1LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NyeXB0X21kNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2Zjk3NDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NyeXB0X21kNS5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgTW9kdWxlIE5hbWU6CisgICAgTUQ1CisKKyAgICBBYnN0cmFjdDoKKyAgICBSRkMxMzIxOiBUaGUgTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFZGR5ICAgICAgICAyMDA4LzExLzI0ICAgICAgQ3JlYXRlIG1kNQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQ1JZUFRfTUQ1X0hfXworI2RlZmluZSBfX0NSWVBUX01ENV9IX18KKworI2lmZGVmIENSWVBUX1RFU1RQTEFOCisjaW5jbHVkZSAiY3J5cHRfdGVzdHBsYW4uaCIKKyNlbHNlCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisjZW5kaWYgLyogQ1JZUFRfVEVTVFBMQU4gKi8KKworLyogQWxnb3JpdGhtIG9wdGlvbnMgKi8KKyNkZWZpbmUgTUQ1X1NVUFBPUlQKKworI2lmZGVmIE1ENV9TVVBQT1JUCisjZGVmaW5lIE1ENV9CTE9DS19TSVpFICAgIDY0CS8qIDUxMiBiaXRzID0gNjQgYnl0ZXMgKi8KKyNkZWZpbmUgTUQ1X0RJR0VTVF9TSVpFICAgMTYJLyogMTI4IGJpdHMgPSAxNiBieXRlcyAqLworCitzdHJ1Y3QgcnRfbWQ1X2N0eF9zdHJ1YyB7CisJdTMyIEhhc2hWYWx1ZVs0XTsKKwl1NjQgTWVzc2FnZUxlbjsKKwl1OCBCbG9ja1tNRDVfQkxPQ0tfU0laRV07CisJdTMyIEJsb2NrTGVuOworfTsKKwordm9pZCBNRDVfSW5pdChzdHJ1Y3QgcnRfbWQ1X2N0eF9zdHJ1YyAqcE1ENV9DVFgpOwordm9pZCBNRDVfSGFzaChzdHJ1Y3QgcnRfbWQ1X2N0eF9zdHJ1YyAqcE1ENV9DVFgpOwordm9pZCBNRDVfQXBwZW5kKHN0cnVjdCBydF9tZDVfY3R4X3N0cnVjICpwTUQ1X0NUWCwKKwkJSU4gY29uc3QgdTggTWVzc2FnZVtdLCB1MzIgTWVzc2FnZUxlbik7Cit2b2lkIE1ENV9FbmQoc3RydWN0IHJ0X21kNV9jdHhfc3RydWMgKnBNRDVfQ1RYLCB1OCBEaWdlc3RNZXNzYWdlW10pOwordm9pZCBSVF9NRDUoSU4gY29uc3QgdTggTWVzc2FnZVtdLAorCSAgICB1MzIgTWVzc2FnZUxlbiwgdTggRGlnZXN0TWVzc2FnZVtdKTsKKyNlbmRpZiAvKiBNRDVfU1VQUE9SVCAqLworCisjZW5kaWYgLyogX19DUllQVF9NRDVfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NyeXB0X3NoYTIuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY3J5cHRfc2hhMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZDExYWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NyeXB0X3NoYTIuaApAQCAtMCwwICsxLDczIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIE1vZHVsZSBOYW1lOgorICAgIFNIQTIKKworICAgIEFic3RyYWN0OgorICAgIEZJUFMgMTgwLTI6IFNlY3VyZSBIYXNoIFN0YW5kYXJkIChTSFMpCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEVkZHkgICAgICAgIDIwMDgvMTEvMjQgICAgICBDcmVhdGUgU0hBMQorICAgIEVkZHkgICAgICAgIDIwMDgvMDcvMjMgICAgICBDcmVhdGUgU0hBMjU2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19DUllQVF9TSEEyX0hfXworI2RlZmluZSBfX0NSWVBUX1NIQTJfSF9fCisKKyNpZmRlZiBDUllQVF9URVNUUExBTgorI2luY2x1ZGUgImNyeXB0X3Rlc3RwbGFuLmgiCisjZWxzZQorI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgorI2VuZGlmIC8qIENSWVBUX1RFU1RQTEFOICovCisKKy8qIEFsZ29yaXRobSBvcHRpb25zICovCisjZGVmaW5lIFNIQTFfU1VQUE9SVAorCisjaWZkZWYgU0hBMV9TVVBQT1JUCisjZGVmaW5lIFNIQTFfQkxPQ0tfU0laRSAgICA2NAkvKiA1MTIgYml0cyA9IDY0IGJ5dGVzICovCisjZGVmaW5lIFNIQTFfRElHRVNUX1NJWkUgICAyMAkvKiAxNjAgYml0cyA9IDIwIGJ5dGVzICovCitzdHJ1Y3QgcnRfc2hhMV9jdHggeworCXUzMiBIYXNoVmFsdWVbNV07CS8qIDUgPSAoU0hBMV9ESUdFU1RfU0laRSAvIDMyKSAqLworCXU2NCBNZXNzYWdlTGVuOwkvKiB0b3RhbCBzaXplICovCisJdTggQmxvY2tbU0hBMV9CTE9DS19TSVpFXTsKKwl1MzIgQmxvY2tMZW47Cit9OworCit2b2lkIFJUX1NIQTFfSW5pdChzdHJ1Y3QgcnRfc2hhMV9jdHggKnBTSEFfQ1RYKTsKK3ZvaWQgU0hBMV9IYXNoKHN0cnVjdCBydF9zaGExX2N0eCAqcFNIQV9DVFgpOwordm9pZCBTSEExX0FwcGVuZChzdHJ1Y3QgcnRfc2hhMV9jdHggKnBTSEFfQ1RYLAorCQkgSU4gY29uc3QgdTggTWVzc2FnZVtdLCB1MzIgTWVzc2FnZUxlbik7Cit2b2lkIFNIQTFfRW5kKHN0cnVjdCBydF9zaGExX2N0eCAqcFNIQV9DVFgsIHU4IERpZ2VzdE1lc3NhZ2VbXSk7Cit2b2lkIFJUX1NIQTEoSU4gY29uc3QgdTggTWVzc2FnZVtdLAorCSAgICAgdTMyIE1lc3NhZ2VMZW4sIHU4IERpZ2VzdE1lc3NhZ2VbXSk7CisjZW5kaWYgLyogU0hBMV9TVVBQT1JUICovCisKKyNlbmRpZiAvKiBfX0NSWVBUX1NIQTJfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Rmcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9kZnMuaAppbmRleCBmMzRmNjE4Li41ZmJhYjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Rmcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvZGZzLmgKQEAgLTM2LDUzICszNiw0IEBACiAgICAgRm9uY2hpICAgIDAzLTEyLTIwMDcgICAgICBjcmVhdGVkCiAqLwogCi0jZGVmaW5lIFJBREFSX1BVTFNFIDEKLSNkZWZpbmUgUkFEQVJfV0lEVEggMgotCi0jZGVmaW5lIFdJRFRIX1JEX0lETEUgMAotI2RlZmluZSBXSURUSF9SRF9DSEVDSyAxCi0KLQotVk9JRCBCYnBSYWRhckRldGVjdGlvblN0YXJ0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBCYnBSYWRhckRldGVjdGlvblN0b3AoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIFJhZGFyRGV0ZWN0aW9uU3RhcnQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gQk9PTEVBTiBDVFNfUHJvdGVjdCwKLQlJTiBVSU5UOCBDVFNQZXJpb2QpOwotCi1WT0lEIFJhZGFyRGV0ZWN0aW9uU3RvcCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgUmFkYXJEZXRlY3RQZXJpb2RpYygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLQotQk9PTEVBTiBSYWRhckNoYW5uZWxDaGVjaygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVQ0hBUgkJCUNoKTsKLQotVUxPTkcgSmFwUmFkYXJUeXBlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVUxPTkcgUlRNUEJicFJlYWRSYWRhckR1cmF0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotVUxPTkcgUlRNUFJlYWRSYWRhckR1cmF0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBSVE1QQ2xlYW5SYWRhckR1cmF0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotSU5UIFNldF9DaE1vdmluZ1RpbWVfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgYXJnKTsKLQotSU5UIFNldF9Mb25nUHVsc2VSYWRhclRoX1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIGFyZyk7Ci0KLQorQk9PTEVBTiBSYWRhckNoYW5uZWxDaGVjayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IENoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvZWVwcm9tLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2VlcHJvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOTgwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2VlcHJvbS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJZWVwcm9tLmgKKworCUFic3RyYWN0OgorCU1pbmlwb3J0IGhlYWRlciBmaWxlIGZvciBlZXByb20gcmVsYXRlZCBpbmZvcm1hdGlvbgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisjaWZuZGVmIF9fRUVQUk9NX0hfXworI2RlZmluZSBfX0VFUFJPTV9IX18KKworI2lmZGVmIFJUTVBfUENJX1NVUFBPUlQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoJUHVibGljIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBmb3IgcHJvbS1iYXNlZCBjaGlwc2V0CisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBydG1wX2VlX3Byb21fcmVhZDE2KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXUxNiBPZmZzZXQsIHUxNiAqIHBWYWx1ZSk7CisjZW5kaWYgLyogUlRNUF9QQ0lfU1VQUE9SVCAvLyAqLworI2lmZGVmIFJUTVBfVVNCX1NVUFBPUlQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoJUHVibGljIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBmb3IgdXNiLWJhc2VkIHByb20gY2hpcHNldAorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUlRVU0JSZWFkRUVQUk9NMTYoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdTE2IG9mZnNldCwgdTE2ICpwRGF0YSk7CisjZW5kaWYgLyogUlRNUF9VU0JfU1VQUE9SVCAvLyAqLworCisjaWZkZWYgUlQzMHh4CisjaWZkZWYgUlRNUF9FRlVTRV9TVVBQT1JUCitpbnQgcnRtcF9lZV9lZnVzZV9yZWFkMTYoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHUxNiBPZmZzZXQsIHUxNiAqIHBWYWx1ZSk7CisjZW5kaWYgLyogUlRNUF9FRlVTRV9TVVBQT1JUIC8vICovCisjZW5kaWYgLyogUlQzMHh4IC8vICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoJUHVibGljIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBmb3IgcHJvbSBvcGVyYXRpb24gY2FsbGJhY2sgZnVuY3Rpb25zIHNldHRpbmcKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFJ0bXBDaGlwT3BzRWVwcm9tSG9vayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGludCBpbmZUeXBlKTsKKworI2VuZGlmIC8qIF9fRUVQUk9NX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9pZmFjZS9ydG1wX3BjaS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9pZmFjZS9ydG1wX3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NTlkNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2lmYWNlL3J0bXBfcGNpLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIF9fUlRNUF9QQ0lfSF9fCisjZGVmaW5lIF9fUlRNUF9QQ0lfSF9fCisKKyNkZWZpbmUgUlQyOFhYX0hBTkRMRV9ERVZfQVNTSUdOKGhhbmRsZSwgZGV2X3ApCQkJCVwKKwkoKHN0cnVjdCBvc19jb29raWUgKiloYW5kbGUpLT5wY2lfZGV2ID0gZGV2X3A7CisKKyNpZmRlZiBMSU5VWAorLy8gc2V0IGRyaXZlciBkYXRhCisjZGVmaW5lIFJUMjhYWF9EUlZEQVRBX1NFVChfYSkJCQlwY2lfc2V0X2RydmRhdGEoX2EsIG5ldF9kZXYpOworCisjZGVmaW5lIFJUMjhYWF9QVVRfREVWSUNFKGRldl9wKQorCisjZGVmaW5lIFNBX1NISVJRIElSUUZfU0hBUkVECisKKyNpZmRlZiBQQ0lfTVNJX1NVUFBPUlQKKyNkZWZpbmUgUlRNUF9NU0lfRU5BQkxFKF9wQWQpIFwKKwl7ICAgICBzdHJ1Y3Qgb3NfY29va2llICpfcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopKF9wQWQtPk9TX0Nvb2tpZSk7IFwKKwkJKF9wQWQpLT5IYXZlTXNpID0gcGNpX2VuYWJsZV9tc2koX3BPYmotPnBjaV9kZXYpID09IDAgPyBUUlVFIDogRkFMU0U7IFwKKwl9CisKKyNkZWZpbmUgUlRNUF9NU0lfRElTQUJMRShfcEFkKSBcCisJeyAgICAgc3RydWN0IG9zX2Nvb2tpZSAqX3BPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKShfcEFkLT5PU19Db29raWUpOyBcCisJCWlmIChfcEFkLT5IYXZlTXNpID09IFRSVUUpIFwKKwkJCXBjaV9kaXNhYmxlX21zaShfcE9iai0+cGNpX2Rldik7IFwKKwkJX3BBZC0+SGF2ZU1zaSA9IEZBTFNFOyAgXAorCX0KKyNlbHNlCisjZGVmaW5lIFJUTVBfTVNJX0VOQUJMRShfcEFkKQkJZG97fXdoaWxlKDApCisjZGVmaW5lIFJUTVBfTVNJX0RJU0FCTEUoX3BBZCkJCWRve313aGlsZSgwKQorI2VuZGlmIC8vIFBDSV9NU0lfU1VQUE9SVCAvLworCisjZGVmaW5lIFJUTVBfUENJX0RFVl9VTk1BUCgpCQkJCQkJCQkJCVwKK3sJaWYgKG5ldF9kZXYtPmJhc2VfYWRkcikJewkJCQkJCQkJXAorCQlpb3VubWFwKCh2b2lkICopKG5ldF9kZXYtPmJhc2VfYWRkcikpOwkJCQlcCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2X3AsIDApLAlcCisJCQkJCQkJcGNpX3Jlc291cmNlX2xlbihkZXZfcCwgMCkpOyB9CVwKKwlpZiAobmV0X2Rldi0+aXJxKSBwY2lfcmVsZWFzZV9yZWdpb25zKGRldl9wKTsgfQorCisjZGVmaW5lIFBDSV9SRUdfUkVBRF9XT1JEKHBjaV9kZXYsIG9mZnNldCwgQ29uZmlndXJhdGlvbikgICBcCisgICAgaWYgKHBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaV9kZXYsIG9mZnNldCwgJnJlZzE2KSA9PSAwKSAgICAgXAorICAgICAgICBDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENvbmZpZ3VyYXRpb24gPSAwOworCisjZGVmaW5lIFBDSV9SRUdfV0lSVEVfV09SRChwY2lfZGV2LCBvZmZzZXQsIENvbmZpZ3VyYXRpb24pICBcCisgICAgcmVnMTYgPSBjcHUybGUxNihDb25maWd1cmF0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaV9kZXYsIG9mZnNldCwgcmVnMTYpOworCisjZW5kaWYgLy8gTElOVVggLy8KKworI2VuZGlmIC8vIF9fUlRNUF9QQ0lfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2lmYWNlL3J0bXBfdXNiLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2lmYWNlL3J0bXBfdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiMzg0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvaWZhY2UvcnRtcF91c2IuaApAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIF9fUlRNUF9VU0JfSF9fCisjZGVmaW5lIF9fUlRNUF9VU0JfSF9fCisKKyNpbmNsdWRlICIuLi9ydHVzYl9pby5oIgorCisjaWZkZWYgTElOVVgKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNlbmRpZiAvLyBMSU5VWCAvLworCitleHRlcm4gdTggRXBUb1F1ZXVlWzZdOworCisjZGVmaW5lIFJYQlVMS0FHR1JFX1pJU0UJCQkxMgorI2RlZmluZSBNQVhfVFhCVUxLX0xJTUlUCQkJKExPQ0FMX1RYQlVGX1NJWkUqKEJVTEtBR0dSRV9aSVNFLTEpKQorI2RlZmluZSBNQVhfVFhCVUxLX1NJWkUJCQkoTE9DQUxfVFhCVUZfU0laRSpCVUxLQUdHUkVfWklTRSkKKyNkZWZpbmUgTUFYX1JYQlVMS19TSVpFCQkJKExPQ0FMX1RYQlVGX1NJWkUqUlhCVUxLQUdHUkVfWklTRSkKKyNkZWZpbmUgTUFYX01MTUVfSEFORExFUl9NRU1PUlkgMjAKKworLy8gRmxhZ3MgZm9yIEJ1bGtmbGFncyBjb250cm9sIGZvciBidWxrIG91dCBkYXRhCisvLworI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OVUxMCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX1JUUwkJCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX01MTUUJCQkJCQkweDAwMDAwMDA0CisKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX1BTUE9MTAkJCQkJMHgwMDAwMDAxMAorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHCQkJCTB4MDAwMDAwMjAKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBR18yCQkJCTB4MDAwMDAwNDAKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBR18zCQkJCTB4MDAwMDAwODAKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBR180CQkJCTB4MDAwMDAxMDAKKworI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwJCQkJMHgwMDAxMDAwMAorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfMgkJCTB4MDAwMjAwMDAKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzMJCQkweDAwMDQwMDAwCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF80CQkJMHgwMDA4MDAwMAorCisvLyBUT0RPOm1vdmUgdG8gLi9hdGUvaW5jbHVkZS9pZmFjZS9hdGVfdXNiLmgKKworI2RlZmluZSBGUkVFX0hUVFhfUklORyhfcENvb2tpZSwgX3BpcGVJZCwgX3R4Q29udGV4dCkJCQlcCit7CQkJCQkJCQkJCVwKKwlpZiAoKF90eENvbnRleHQpLT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSAoX3R4Q29udGV4dCktPkN1cldyaXRlUG9zaXRpb24pCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQlcCisJCShfdHhDb250ZXh0KS0+YlJpbmdFbXB0eSA9IFRSVUU7CQkJXAorCX0JCQkJCQkJCQkJCQkJCQkJCVwKKwkvKk5kaXNJbnRlcmxvY2tlZERlY3JlbWVudCgmKF9wKS0+VHhDb3VudCk7ICovXAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlVU0IgQnVsayBvcGVyYXRpb24gcmVsYXRlZCBkZWZpbml0aW9ucworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBMSU5VWAorI2RlZmluZSBCVUxLQUdHUkVfWklTRSAgICAgICAgICAxMDAKKyNkZWZpbmUgUlQyOFhYX1BVVF9ERVZJQ0UJCQkJCQkJdXNiX3B1dF9kZXYKKyNkZWZpbmUgUlRVU0JfQUxMT0NfVVJCKGlzbykJCQkJCQkJdXNiX2FsbG9jX3VyYihpc28sIEdGUF9BVE9NSUMpCisjZGVmaW5lIFJUVVNCX1NVQk1JVF9VUkIocFVyYikJCQkJCQkJdXNiX3N1Ym1pdF91cmIocFVyYiwgR0ZQX0FUT01JQykKKyNkZWZpbmUgUlRVU0JfVVJCX0FMTE9DX0JVRkZFUihwVXNiX0RldiwgQnVmU2l6ZSwgcERtYV9hZGRyKQkJCXVzYl9idWZmZXJfYWxsb2MocFVzYl9EZXYsIEJ1ZlNpemUsIEdGUF9BVE9NSUMsIHBEbWFfYWRkcikKKyNkZWZpbmUgUlRVU0JfVVJCX0ZSRUVfQlVGRkVSKHBVc2JfRGV2LCBCdWZTaXplLCBwVHJhbnNmZXJCdWYsIERtYV9hZGRyKQl1c2JfYnVmZmVyX2ZyZWUocFVzYl9EZXYsIEJ1ZlNpemUsIHBUcmFuc2ZlckJ1ZiwgRG1hX2FkZHIpCisKKyNkZWZpbmUgUlRVU0JfRlJFRV9VUkIocFVyYikJdXNiX2ZyZWVfdXJiKHBVcmIpCisKKy8vIHVubGluayB1cmIKKyNkZWZpbmUgUlRVU0JfVU5MSU5LX1VSQihwVXJiKQkJdXNiX2tpbGxfdXJiKHBVcmIpCisKK2V4dGVybiB2b2lkIGR1bXBfdXJiKHN0cnVjdCB1cmIgKnB1cmIpOworCisjZGVmaW5lIEludGVybG9ja2VkSW5jcmVtZW50CQlhdG9taWNfaW5jCisjZGVmaW5lIE5kaXNJbnRlcmxvY2tlZEluY3JlbWVudAlhdG9taWNfaW5jCisjZGVmaW5lIEludGVybG9ja2VkRGVjcmVtZW50CQlhdG9taWNfZGVjCisjZGVmaW5lIE5kaXNJbnRlcmxvY2tlZERlY3JlbWVudAlhdG9taWNfZGVjCisjZGVmaW5lIEludGVybG9ja2VkRXhjaGFuZ2UJCWF0b21pY19zZXQKKworI2VuZGlmIC8vIExJTlVYIC8vCisKKyNkZWZpbmUgTlRfU1VDQ0VTUyhzdGF0dXMpCQkJKCgoc3RhdHVzKSA+PTApID8gKFRSVUUpOihGQUxTRSkpCisKKyNkZWZpbmUgVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VUCQkwCisjZGVmaW5lIFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOCQkwCisjZGVmaW5lIFVTQkRfU0hPUlRfVFJBTlNGRVJfT0sJCQkwCisjZGVmaW5lIFBVUkIJCQlzdHJ1Y3QgdXJiICoKKworI2RlZmluZSBQSVJQCQl2b2lkICoKKyNkZWZpbmUgTkRJU19PSUQJdTMyCisjaWZuZGVmIFVTQl9TVF9OT0VSUk9SCisjZGVmaW5lIFVTQl9TVF9OT0VSUk9SICAgICAwCisjZW5kaWYKKworLy8gdmVuZG9yLXNwZWNpZmljIGNvbnRyb2wgb3BlcmF0aW9ucworI2RlZmluZSBDT05UUk9MX1RJTUVPVVRfSklGRklFUyAoICgxMDAgKiBPU19IWikgLyAxMDAwKQorI2RlZmluZSBVTkxJTktfVElNRU9VVF9NUwkJMworCit2b2lkIFJUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZShzdHJ1Y3QgdXJiICpwdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7Cit2b2lkIFJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZShzdHJ1Y3QgdXJiICpwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7Cit2b2lkIFJUVVNCQnVsa091dE51bGxGcmFtZUNvbXBsZXRlKHN0cnVjdCB1cmIgKnBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKTsKK3ZvaWQgUlRVU0JCdWxrT3V0UlRTRnJhbWVDb21wbGV0ZShzdHJ1Y3QgdXJiICpwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7Cit2b2lkIFJUVVNCQnVsa091dFBzUG9sbENvbXBsZXRlKHN0cnVjdCB1cmIgKnBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKTsKK3ZvaWQgUlRVU0JCdWxrUnhDb21wbGV0ZShzdHJ1Y3QgdXJiICpwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7CisKKyNpZmRlZiBLVEhSRUFEX1NVUFBPUlQKKyNkZWZpbmUgUlRVU0JNbG1lVXAocEFkKSBcCisJZG97CQkJCQkJCQkgICAgXAorCQlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpfcFRhc2sgPSAmKChwQWQpLT5tbG1lVGFzayk7XAorCQlpZiAoX3BUYXNrLT5rdGhyZWFkX3Rhc2spIFwKKyAgICAgICAgeyBcCisJCQlfcFRhc2stPmt0aHJlYWRfcnVubmluZyA9IFRSVUU7IFwKKwkgICAgICAgIHdha2VfdXAoJl9wVGFzay0+a3RocmVhZF9xKTsgXAorCQl9IFwKKwl9d2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIFJUVVNCTWxtZVVwKHBBZCkJICAgICAgICBcCisJZG97CQkJCQkJCQkgICAgXAorCQlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpfcFRhc2sgPSAmKChwQWQpLT5tbG1lVGFzayk7XAorCQlDSEVDS19QSURfTEVHQUxJVFkoX3BUYXNrLT50YXNrUElEKQkJICAgIFwKKwkJeyBcCisJCQlSVE1QX1NFTV9FVkVOVF9VUCgmKF9wVGFzay0+dGFza1NlbWEpKTsgXAorCQl9XAorCX13aGlsZSgwKQorI2VuZGlmCisKKyNpZmRlZiBLVEhSRUFEX1NVUFBPUlQKKyNkZWZpbmUgUlRVU0JDTURVcChwQWQpIFwKKwlkb3sJXAorCQlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpfcFRhc2sgPSAmKChwQWQpLT5jbWRRVGFzayk7CVwKKwkJeyBcCisJCQlfcFRhc2stPmt0aHJlYWRfcnVubmluZyA9IFRSVUU7IFwKKwkgICAgICAgIHdha2VfdXAoJl9wVGFzay0+a3RocmVhZF9xKTsgXAorCQl9IFwKKwl9d2hpbGUoMCkKKworI2Vsc2UKKyNkZWZpbmUgUlRVU0JDTURVcChwQWQpCSAgICAgICAgICAgICAgICBcCisJZG97CQkJCQkJCQkJICAgIFwKKwkJc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqX3BUYXNrID0gJigocEFkKS0+Y21kUVRhc2spOwlcCisJCUNIRUNLX1BJRF9MRUdBTElUWShfcFRhc2stPnRhc2tQSUQpCSAgICBcCisJCXtcCisJCQlSVE1QX1NFTV9FVkVOVF9VUCgmKF9wVGFzay0+dGFza1NlbWEpKTsgXAorCQl9XAorCX13aGlsZSgwKQorI2VuZGlmCisKKyNkZWZpbmUgREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCAgICAgICAweDQwCisjZGVmaW5lIERFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiAgICAgICAgMHhjMAorLy8jZGVmaW5lIElOVEVSRkFDRV9WRU5ET1JfUkVRVUVTVF9PVVQgICAgMHg0MQorLy8jZGVmaW5lIElOVEVSRkFDRV9WRU5ET1JfUkVRVUVTVF9JTiAgICAgMHhjMQorCisjZGVmaW5lIEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHCQkweDgwCisKKyNkZWZpbmUgUlRVU0JfU0VUX0JVTEtfRkxBRyhfTSwgX0YpCSgoX00pLT5CdWxrRmxhZ3MgfD0gKF9GKSkKKyNkZWZpbmUgUlRVU0JfQ0xFQVJfQlVMS19GTEFHKF9NLCBfRikJKChfTSktPkJ1bGtGbGFncyAmPSB+KF9GKSkKKyNkZWZpbmUgUlRVU0JfVEVTVF9CVUxLX0ZMQUcoX00sIF9GKQkoKChfTSktPkJ1bGtGbGFncyAmIChfRikpICE9IDApCisKKyNkZWZpbmUgUlRNUF9JUlFfUkVRVUVTVChuZXRfZGV2KQkJZG97fXdoaWxlKDApCisjZGVmaW5lIFJUTVBfSVJRX1JFTEVBU0UobmV0X2RldikJCWRve313aGlsZSgwKQorCisjZW5kaWYgLy8gX19SVE1QX1VTQl9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWQ1LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21kNS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODVkYjEyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWQ1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQltZDUuaAotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncwotCWphbgkJCTEwLTI4LTAzCQlJbml0aWFsCi0JUml0YSAgICAJMTEtMjMtMDQJCU1vZGlmeSBNRDUgYW5kIFNIQS0xCi0qLwotCi0jaWZuZGVmCXVpbnQ4Ci0jZGVmaW5lCXVpbnQ4ICB1bnNpZ25lZAljaGFyCi0jZW5kaWYKLQotI2lmbmRlZgl1aW50MzIKLSNkZWZpbmUJdWludDMyIHVuc2lnbmVkCWxvbmcgaW50Ci0jZW5kaWYKLQotCi0jaWZuZGVmCV9fTUQ1X0hfXwotI2RlZmluZQlfX01ENV9IX18KLQotI2RlZmluZSBNRDVfTUFDX0xFTiAxNgotCi10eXBlZGVmIHN0cnVjdCBfTUQ1X0NUWCB7Ci0gICAgVUlOVDMyICAgQnVmWzRdOyAgICAgICAgICAgICAvLyBidWZmZXJzIG9mIGZvdXIgc3RhdGVzCi0JVUNIQVIgICBJbnB1dFs2NF07ICAgICAgICAgIC8vIGlucHV0IG1lc3NhZ2UKLQlVSU5UMzIgICBMZW5JbkJpdENvdW50WzJdOyAgIC8vIGxlbmd0aCBjb3VudGVyIGZvciBpbnB1dCBtZXNzYWdlLCAwIHVwIHRvIDY0IGJpdHMKLX0gICBNRDVfQ1RYOwotCi1WT0lEIE1ENUluaXQoTUQ1X0NUWCAqcEN0eCk7Ci1WT0lEIE1ENVVwZGF0ZShNRDVfQ1RYICpwQ3R4LCBVQ0hBUiAqcERhdGEsIFVJTlQzMiBMZW5JbkJ5dGVzKTsKLVZPSUQgTUQ1RmluYWwoVUNIQVIgRGlnZXN0WzE2XSwgTUQ1X0NUWCAqcEN0eCk7Ci1WT0lEIE1ENVRyYW5zZm9ybShVSU5UMzIgQnVmWzRdLCBVSU5UMzIgTWVzWzE2XSk7Ci0KLXZvaWQgbWQ1X21hYyh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYyk7Ci12b2lkIGhtYWNfbWQ1KHU4ICprZXksIHNpemVfdCBrZXlfbGVuLCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqbWFjKTsKLQotLy8KLS8vIFNIQSBjb250ZXh0Ci0vLwotdHlwZWRlZglzdHJ1Y3QgX1NIQV9DVFgKLXsKLQlVSU5UMzIgICBCdWZbNV07ICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgb2YgZml2ZSBzdGF0ZXMKLQlVQ0hBUiAgIElucHV0WzgwXTsgICAgICAgICAgLy8gaW5wdXQgbWVzc2FnZQotCVVJTlQzMiAgIExlbkluQml0Q291bnRbMl07ICAgLy8gbGVuZ3RoIGNvdW50ZXIgZm9yIGlucHV0IG1lc3NhZ2UsIDAgdXAgdG8gNjQgYml0cwotCi19CVNIQV9DVFg7Ci0KLVZPSUQgU0hBSW5pdChTSEFfQ1RYICpwQ3R4KTsKLVVDSEFSIFNIQVVwZGF0ZShTSEFfQ1RYICpwQ3R4LCBVQ0hBUiAqcERhdGEsIFVJTlQzMiBMZW5JbkJ5dGVzKTsKLVZPSUQgU0hBRmluYWwoU0hBX0NUWCAqcEN0eCwgVUNIQVIgRGlnZXN0WzIwXSk7Ci1WT0lEIFNIQVRyYW5zZm9ybShVSU5UMzIgQnVmWzVdLCBVSU5UMzIgTWVzWzIwXSk7Ci0KLSNkZWZpbmUgU0hBX0RJR0VTVF9MRU4gMjAKLSNlbmRpZiAvLyBfX01ENV9IX18KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYJX0FFU19ICi0jZGVmaW5lCV9BRVNfSAotCi10eXBlZGVmCXN0cnVjdAotewotCXVpbnQzMiBlcmtbNjRdOwkJLyogZW5jcnlwdGlvbiByb3VuZAlrZXlzICovCi0JdWludDMyIGRya1s2NF07CQkvKiBkZWNyeXB0aW9uIHJvdW5kCWtleXMgKi8KLQlpbnQJbnI7CQkJCS8qIG51bWJlciBvZiByb3VuZHMJKi8KLX0KLWFlc19jb250ZXh0OwotCi1pbnQJIHJ0bXBfYWVzX3NldF9rZXkoIGFlc19jb250ZXh0ICpjdHgsCXVpbnQ4ICprZXksCWludAluYml0cyApOwotdm9pZCBydG1wX2Flc19lbmNyeXB0KCBhZXNfY29udGV4dCAqY3R4LAl1aW50OCBpbnB1dFsxNl0sIHVpbnQ4IG91dHB1dFsxNl0gKTsKLXZvaWQgcnRtcF9hZXNfZGVjcnlwdCggYWVzX2NvbnRleHQgKmN0eCwJdWludDggaW5wdXRbMTZdLCB1aW50OCBvdXRwdXRbMTZdICk7Ci0KLXZvaWQgRihjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIGludCBpdGVyYXRpb25zLCBpbnQgY291bnQsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCk7Ci1pbnQgUGFzc3dvcmRIYXNoKGNoYXIgKnBhc3N3b3JkLCB1bnNpZ25lZCBjaGFyICpzc2lkLCBpbnQgc3NpZGxlbmd0aCwgdW5zaWduZWQgY2hhciAqb3V0cHV0KTsKLQotI2VuZGlmIC8qIGFlcy5oCSovCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWxtZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tbG1lLmgKaW5kZXggM2QxYTgyOC4uMTE0MzQxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tbG1lLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tbG1lLmgKQEAgLTM5LDE4ICszOSwyMCBAQAogI2lmbmRlZiBfX01MTUVfSF9fCiAjZGVmaW5lIF9fTUxNRV9IX18KIAotLy8gbWF4aW11bSBzdXBwb3J0ZWQgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiAtCi0vLyBFU1MsIElCU1MsIFByaXZhY3ksIFNob3J0IFByZWFtYmxlLCBTcGVjdHJ1bSBtZ210LCBTaG9ydCBTbG90CisjaW5jbHVkZSAicnRtcF9kb3QxMS5oIgorCisvKiBtYXhpbXVtIHN1cHBvcnRlZCBjYXBhYmlsaXR5IGluZm9ybWF0aW9uIC0gKi8KKy8qIEVTUywgSUJTUywgUHJpdmFjeSwgU2hvcnQgUHJlYW1ibGUsIFNwZWN0cnVtIG1nbXQsIFNob3J0IFNsb3QgKi8KICNkZWZpbmUgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTyAgIDB4MDUzMwogCiAjZGVmaW5lIEVORF9PRl9BUkdTICAgICAgICAgICAgICAgICAtMQogI2RlZmluZSBMRlNSX01BU0sgICAgICAgICAgICAgICAgICAgMHg4MDAwMDA1NwotI2RlZmluZSBNTE1FX1RBU0tfRVhFQ19JTlRWICAgICAgICAgMTAwLyoyMDAqLyAgICAgICAvLworI2RlZmluZSBNTE1FX1RBU0tfRVhFQ19JTlRWICAgICAgICAgMTAwLyoyMDAqLwkvKiAqLwogI2RlZmluZSBMRUFEX1RJTUUgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAgICAgICAxMCAgLyo1Ki8gICAgICAgLy8gTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgKiBNTE1FX1RBU0tfRVhFQ19JTlRWID0gMSBzZWMKLSNkZWZpbmUgUkVPUkRFUl9FWEVDX0lOVFYgICAgICAgICAJMTAwICAgICAgIC8vIDAuMSBzZWMKKyNkZWZpbmUgTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgICAgICAgMTAgIC8qNSovCS8qIE1MTUVfVEFTS19FWEVDX01VTFRJUExFICogTUxNRV9UQVNLX0VYRUNfSU5UViA9IDEgc2VjICovCisjZGVmaW5lIFJFT1JERVJfRVhFQ19JTlRWICAgICAgICAgCTEwMAkvKiAwLjEgc2VjICovCiAKLS8vIFRoZSBkZWZpbml0aW9uIG9mIFJhZGFyIGRldGVjdGlvbiBkdXJhdGlvbiByZWdpb24KKy8qIFRoZSBkZWZpbml0aW9uIG9mIFJhZGFyIGRldGVjdGlvbiBkdXJhdGlvbiByZWdpb24gKi8KICNkZWZpbmUgQ0UJCTAKICNkZWZpbmUgRkNDCQkxCiAjZGVmaW5lIEpBUAkJMgpAQCAtNTgsNjIgKzYwLDYxIEBACiAjZGVmaW5lIEpBUF9XNTYJNAogI2RlZmluZSBNQVhfUkRfUkVHSU9OIDUKIAotI2lmZGVmCU5ESVM1MV9NSU5JUE9SVAotI2RlZmluZSBCRUFDT05fTE9TVF9USU1FICAgICAgICAgICAgNDAwMCAgICAgICAvLyAyMDQ4IG1zZWMgPSAyIHNlYwotI2Vsc2UKLSNkZWZpbmUgQkVBQ09OX0xPU1RfVElNRSAgICAgICAgICAgIDQgKiBPU19IWiAgICAvLyAyMDQ4IG1zZWMgPSAyIHNlYwotI2VuZGlmCisjZGVmaW5lIEJFQUNPTl9MT1NUX1RJTUUgICAgICAgICAgICA0ICogT1NfSFoJLyogMjA0OCBtc2VjID0gMiBzZWMgKi8KIAotI2RlZmluZSBETFNfVElNRU9VVCAgICAgICAgICAgICAgICAgMTIwMCAgICAgIC8vIHVuaXQ6IG1zZWMKLSNkZWZpbmUgQVVUSF9USU1FT1VUICAgICAgICAgICAgICAgIDMwMCAgICAgICAvLyB1bml0OiBtc2VjCi0jZGVmaW5lIEFTU09DX1RJTUVPVVQgICAgICAgICAgICAgICAzMDAgICAgICAgLy8gdW5pdDogbXNlYwotI2RlZmluZSBKT0lOX1RJTUVPVVQgICAgICAgICAgICAgICAgMiAqIE9TX0haICAgICAgLy8gdW5pdDogbXNlYwotI2RlZmluZSBTSE9SVF9DSEFOTkVMX1RJTUUgICAgICAgICAgOTAgICAgICAgIC8vIHVuaXQ6IG1zZWMKLSNkZWZpbmUgTUlOX0NIQU5ORUxfVElNRSAgICAgICAgICAgIDExMCAgICAgICAgLy8gdW5pdDogbXNlYywgZm9yIGR1YWwgYmFuZCBzY2FuCi0jZGVmaW5lIE1BWF9DSEFOTkVMX1RJTUUgICAgICAgICAgICAxNDAgICAgICAgLy8gdW5pdDogbXNlYywgZm9yIHNpbmdsZSBiYW5kIHNjYW4KLSNkZWZpbmUJRkFTVF9BQ1RJVkVfU0NBTl9USU1FCSAgICAzMCAJCSAgLy8gQWN0aXZlIHNjYW4gd2FpdGluZyBmb3IgcHJvYmUgcmVzcG9uc2UgdGltZQotI2RlZmluZSBDV19NSU5fSU5fQklUUyAgICAgICAgICAgICAgNCAgICAgICAgIC8vIGFjdHVhbCBDd01pbiA9IDJeQ1dfTUlOX0lOX0JJVFMgLSAxCi0jZGVmaW5lIENXX01BWF9JTl9CSVRTICAgICAgICAgICAgICAxMCAgICAgICAgLy8gYWN0dWFsIEN3TWF4ID0gMl5DV19NQVhfSU5fQklUUyAtIDEKKyNkZWZpbmUgRExTX1RJTUVPVVQgICAgICAgICAgICAgICAgIDEyMDAJLyogdW5pdDogbXNlYyAqLworI2RlZmluZSBBVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgMzAwCS8qIHVuaXQ6IG1zZWMgKi8KKyNkZWZpbmUgQVNTT0NfVElNRU9VVCAgICAgICAgICAgICAgIDMwMAkvKiB1bml0OiBtc2VjICovCisjZGVmaW5lIEpPSU5fVElNRU9VVCAgICAgICAgICAgICAgICAyMDAwCS8qIHVuaXQ6IG1zZWMgKi8KKyNkZWZpbmUgU0hPUlRfQ0hBTk5FTF9USU1FICAgICAgICAgIDkwCS8qIHVuaXQ6IG1zZWMgKi8KKyNkZWZpbmUgTUlOX0NIQU5ORUxfVElNRSAgICAgICAgICAgIDExMAkvKiB1bml0OiBtc2VjLCBmb3IgZHVhbCBiYW5kIHNjYW4gKi8KKyNkZWZpbmUgTUFYX0NIQU5ORUxfVElNRSAgICAgICAgICAgIDE0MAkvKiB1bml0OiBtc2VjLCBmb3Igc2luZ2xlIGJhbmQgc2NhbiAqLworI2RlZmluZQlGQVNUX0FDVElWRV9TQ0FOX1RJTUUJICAgIDMwCS8qIEFjdGl2ZSBzY2FuIHdhaXRpbmcgZm9yIHByb2JlIHJlc3BvbnNlIHRpbWUgKi8KKyNkZWZpbmUgQ1dfTUlOX0lOX0JJVFMgICAgICAgICAgICAgIDQJLyogYWN0dWFsIEN3TWluID0gMl5DV19NSU5fSU5fQklUUyAtIDEgKi8KKyNkZWZpbmUgTElOS19ET1dOX1RJTUVPVVQgICAgICAgICAgIDIwMDAwCS8qIHVuaXQ6IG1zZWMgKi8KKyNkZWZpbmUgQVVUT19XQUtFVVBfVElNRU9VVAkJCTcwCS8qdW5pdDogbXNlYyAqLwogCi0vLyBOb3RlOiBSU1NJX1RPX0RCTV9PRkZTRVQgaGFzIGJlZW4gY2hhbmdlZCB0byB2YXJpYWJsZSBmb3IgbmV3IFJGICgyMDA0LTA3MjApLgotLy8gU0hvdWxkIG5vdCByZWZlciB0byB0aGlzIGNvbnN0YW50IGFueW1vcmUKLS8vI2RlZmluZSBSU1NJX1RPX0RCTV9PRkZTRVQgICAgICAgICAgMTIwIC8vIGZvciBSVDI1MzAgUlNTSS0xMTUgPSBkQm0KLSNkZWZpbmUgUlNTSV9GT1JfTUlEX1RYX1BPV0VSICAgICAgIC01NSAgLy8gLTU1IGRiIGlzIGNvbnNpZGVyZWQgbWlkLWRpc3RhbmNlCi0jZGVmaW5lIFJTU0lfRk9SX0xPV19UWF9QT1dFUiAgICAgICAtNDUgIC8vIC00NSBkYiBpcyBjb25zaWRlcmVkIHZlcnkgc2hvcnQgZGlzdGFuY2UgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxpZ2libGUgdG8gdXNlIGEgbG93ZXIgVFggcG93ZXIKKyNkZWZpbmUgQ1dfTUFYX0lOX0JJVFMgICAgICAgICAgICAgIDEwCS8qIGFjdHVhbCBDd01heCA9IDJeQ1dfTUFYX0lOX0JJVFMgLSAxICovCisKKy8qIE5vdGU6IFJTU0lfVE9fREJNX09GRlNFVCBoYXMgYmVlbiBjaGFuZ2VkIHRvIHZhcmlhYmxlIGZvciBuZXcgUkYgKDIwMDQtMDcyMCkuICovCisvKiBTSG91bGQgbm90IHJlZmVyIHRvIHRoaXMgY29uc3RhbnQgYW55bW9yZSAqLworLyojZGVmaW5lIFJTU0lfVE9fREJNX09GRlNFVCAgICAgICAgICAxMjAgLy8gZm9yIFJUMjUzMCBSU1NJLTExNSA9IGRCbSAqLworI2RlZmluZSBSU1NJX0ZPUl9NSURfVFhfUE9XRVIgICAgICAgLTU1CS8qIC01NSBkYiBpcyBjb25zaWRlcmVkIG1pZC1kaXN0YW5jZSAqLworI2RlZmluZSBSU1NJX0ZPUl9MT1dfVFhfUE9XRVIgICAgICAgLTQ1CS8qIC00NSBkYiBpcyBjb25zaWRlcmVkIHZlcnkgc2hvcnQgZGlzdGFuY2UgYW5kICovCisJCQkJCS8qIGVsaWdpYmxlIHRvIHVzZSBhIGxvd2VyIFRYIHBvd2VyICovCiAjZGVmaW5lIFJTU0lfRk9SX0xPV0VTVF9UWF9QT1dFUiAgICAtMzAKLS8vI2RlZmluZSBNSURfVFhfUE9XRVJfREVMVEEgICAgICAgICAgMCAgIC8vIDAgZGIgZnJvbSBmdWxsIFRYIHBvd2VyIHVwb24gbWlkLWRpc3RhbmNlIHRvIEFQCi0jZGVmaW5lIExPV19UWF9QT1dFUl9ERUxUQSAgICAgICAgICA2ICAgIC8vIC0zIGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHZlcnkgc2hvcnQgZGlzdGFuY2UuIDEgZ3JhZGUgaXMgMC41IGRiCi0jZGVmaW5lIExPV0VTVF9UWF9QT1dFUl9ERUxUQSAgICAgICAxNiAgIC8vIC04IGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHNob3J0ZXN0IGRpc3RhbmNlLiAxIGdyYWRlIGlzIDAuNSBkYgorLyojZGVmaW5lIE1JRF9UWF9QT1dFUl9ERUxUQSAgICAgICAgICAwICAgLy8gMCBkYiBmcm9tIGZ1bGwgVFggcG93ZXIgdXBvbiBtaWQtZGlzdGFuY2UgdG8gQVAgKi8KKyNkZWZpbmUgTE9XX1RYX1BPV0VSX0RFTFRBICAgICAgICAgIDYJLyogLTMgZGIgZnJvbSBmdWxsIFRYIHBvd2VyIHVwb24gdmVyeSBzaG9ydCBkaXN0YW5jZS4gMSBncmFkZSBpcyAwLjUgZGIgKi8KKyNkZWZpbmUgTE9XRVNUX1RYX1BPV0VSX0RFTFRBICAgICAgIDE2CS8qIC04IGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHNob3J0ZXN0IGRpc3RhbmNlLiAxIGdyYWRlIGlzIDAuNSBkYiAqLwogCiAjZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEICAgICAwCiAjZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fRVhDQ0VFRF9USFJFU0hPTEQgICAxCiAjZGVmaW5lIFJTU0lfVEhSRVNIT0xEX0ZPUl9ST0FNSU5HICAgICAgICAgICAgICAyNQogI2RlZmluZSBSU1NJX0RFTFRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQogCi0vLyBDaGFubmVsIFF1YWxpdHkgSW5kaWNhdGlvbgorLyogQ2hhbm5lbCBRdWFsaXR5IEluZGljYXRpb24gKi8KICNkZWZpbmUgQ1FJX0lTX0dPT0QoY3FpKSAgICAgICAgICAgICgoY3FpKSA+PSA1MCkKLS8vI2RlZmluZSBDUUlfSVNfRkFJUihjcWkpICAgICAgICAgICgoKGNxaSkgPj0gMjApICYmICgoY3FpKSA8IDUwKSkKLSNkZWZpbmUgQ1FJX0lTX1BPT1IoY3FpKSAgICAgICAgICAgIChjcWkgPCA1MCkgIC8vKCgoY3FpKSA+PSA1KSAmJiAoKGNxaSkgPCAyMCkpCisvKiNkZWZpbmUgQ1FJX0lTX0ZBSVIoY3FpKSAgICAgICAgICAoKChjcWkpID49IDIwKSAmJiAoKGNxaSkgPCA1MCkpICovCisjZGVmaW5lIENRSV9JU19QT09SKGNxaSkgICAgICAgICAgICAoY3FpIDwgNTApCS8qKCgoY3FpKSA+PSA1KSAmJiAoKGNxaSkgPCAyMCkpICovCiAjZGVmaW5lIENRSV9JU19CQUQoY3FpKSAgICAgICAgICAgICAoY3FpIDwgNSkKICNkZWZpbmUgQ1FJX0lTX0RFQUQoY3FpKSAgICAgICAgICAgIChjcWkgPT0gMCkKIAotLy8gd2VpZ2h0aW5nIGZhY3RvciB0byBjYWxjdWxhdGUgQ2hhbm5lbCBxdWFsaXR5LCB0b3RhbCBzaG91bGQgYmUgMTAwJQorLyogd2VpZ2h0aW5nIGZhY3RvciB0byBjYWxjdWxhdGUgQ2hhbm5lbCBxdWFsaXR5LCB0b3RhbCBzaG91bGQgYmUgMTAwJSAqLwogI2RlZmluZSBSU1NJX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICA1MAogI2RlZmluZSBUWF9XRUlHSFRJTkcgICAgICAgICAgICAgICAgICAgICAzMAogI2RlZmluZSBSWF9XRUlHSFRJTkcgICAgICAgICAgICAgICAgICAgICAyMAogCiAjZGVmaW5lIEJTU19OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKIAotI2RlZmluZSBNQVhfTEVOX09GX01MTUVfUVVFVUUgICAgICAgICAgICA0MCAvLzEwCisjZGVmaW5lIE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSAgICAgICAgICAgIDQwCS8qMTAgKi8KIAotI2RlZmluZSBTQ0FOX1BBU1NJVkUgICAgICAgICAgICAgICAgICAgICAxOAkJLy8gc2NhbiB3aXRoIG5vIHByb2JlIHJlcXVlc3QsIG9ubHkgd2FpdCBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlCi0jZGVmaW5lIFNDQU5fQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDE5CQkvLyBzY2FuIHdpdGggcHJvYmUgcmVxdWVzdCwgYW5kIHdhaXQgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZQotI2RlZmluZQlTQ0FOX0NJU0NPX1BBU1NJVkUJCQkJIDIwCQkvLyBTaW5nbGUgY2hhbm5lbCBwYXNzaXZlIHNjYW4KLSNkZWZpbmUJU0NBTl9DSVNDT19BQ1RJVkUJCQkJIDIxCQkvLyBTaW5nbGUgY2hhbm5lbCBhY3RpdmUgc2NhbgotI2RlZmluZQlTQ0FOX0NJU0NPX05PSVNFCQkJCSAyMgkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuIGZvciBub2lzZSBoaXN0b2dyYW0gY29sbGVjdGlvbgotI2RlZmluZQlTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRAkJCSAyMwkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuIGZvciBjaGFubmVsIGxvYWQgY29sbGVjdGlvbgotI2RlZmluZSBGQVNUX1NDQU5fQUNUSVZFICAgICAgICAgICAgICAgICAyNAkJLy8gc2NhbiB3aXRoIHByb2JlIHJlcXVlc3QsIGFuZCB3YWl0IGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UKKyNkZWZpbmUgU0NBTl9QQVNTSVZFICAgICAgICAgICAgICAgICAgICAgMTgJLyogc2NhbiB3aXRoIG5vIHByb2JlIHJlcXVlc3QsIG9ubHkgd2FpdCBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlICovCisjZGVmaW5lIFNDQU5fQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDE5CS8qIHNjYW4gd2l0aCBwcm9iZSByZXF1ZXN0LCBhbmQgd2FpdCBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlICovCisjZGVmaW5lCVNDQU5fQ0lTQ09fUEFTU0lWRQkJCQkgMjAJLyogU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuICovCisjZGVmaW5lCVNDQU5fQ0lTQ09fQUNUSVZFCQkJCSAyMQkvKiBTaW5nbGUgY2hhbm5lbCBhY3RpdmUgc2NhbiAqLworI2RlZmluZQlTQ0FOX0NJU0NPX05PSVNFCQkJCSAyMgkvKiBTaW5nbGUgY2hhbm5lbCBwYXNzaXZlIHNjYW4gZm9yIG5vaXNlIGhpc3RvZ3JhbSBjb2xsZWN0aW9uICovCisjZGVmaW5lCVNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FECQkJIDIzCS8qIFNpbmdsZSBjaGFubmVsIHBhc3NpdmUgc2NhbiBmb3IgY2hhbm5lbCBsb2FkIGNvbGxlY3Rpb24gKi8KKyNkZWZpbmUgRkFTVF9TQ0FOX0FDVElWRSAgICAgICAgICAgICAgICAgMjQJLyogc2NhbiB3aXRoIHByb2JlIHJlcXVlc3QsIGFuZCB3YWl0IGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UgKi8KIAogI2RlZmluZSBNQUNfQUREUl9JU19HUk9VUChBZGRyKSAgICAgICAoKChBZGRyWzBdKSAmIDB4MDEpKQogI2RlZmluZSBNQUNfQUREUl9IQVNIKEFkZHIpICAgICAgICAgICAgKEFkZHJbMF0gXiBBZGRyWzFdIF4gQWRkclsyXSBeIEFkZHJbM10gXiBBZGRyWzRdIF4gQWRkcls1XSkKQEAgLTEyMSwxMyArMTIyLDEzIEBACiAjZGVmaW5lIFRJRF9NQUNfSEFTSChBZGRyLFRJRCkgICAgICAgICAgICAoVElEXkFkZHJbMF0gXiBBZGRyWzFdIF4gQWRkclsyXSBeIEFkZHJbM10gXiBBZGRyWzRdIF4gQWRkcls1XSkKICNkZWZpbmUgVElEX01BQ19IQVNIX0lOREVYKEFkZHIsVElEKSAgICAgIChUSURfTUFDX0hBU0goQWRkcixUSUQpICUgSEFTSF9UQUJMRV9TSVpFKQogCi0vLyBMRUQgQ29udHJvbAotLy8gYXNzb2lhdGlvbiBPTi4gb25lIExFRCBPTi4gYW5vdGhlciBibGlua2luZyB3aGVuIFRYLCBPRkYgd2hlbiBpZGxlCi0vLyBubyBhc3NvY2lhdGlvbiwgYm90aCBMRUQgb2ZmCisvKiBMRUQgQ29udHJvbCAqLworLyogYXNzb2lhdGlvbiBPTi4gb25lIExFRCBPTi4gYW5vdGhlciBibGlua2luZyB3aGVuIFRYLCBPRkYgd2hlbiBpZGxlICovCisvKiBubyBhc3NvY2lhdGlvbiwgYm90aCBMRUQgb2ZmICovCiAjZGVmaW5lIEFTSUNfTEVEX0FDVF9PTihwQWQpICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMTQsIDB4MDAwMzFlNDYpCiAjZGVmaW5lIEFTSUNfTEVEX0FDVF9PRkYocEFkKSAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMTQsIDB4MDAwMDFlNDYpCiAKLS8vIGJpdCBkZWZpbml0aW9uIG9mIHRoZSAyLWJ5dGUgcEJFQUNPTi0+Q2FwYWJpbGl0eSBmaWVsZAorLyogYml0IGRlZmluaXRpb24gb2YgdGhlIDItYnl0ZSBwQkVBQ09OLT5DYXBhYmlsaXR5IGZpZWxkICovCiAjZGVmaW5lIENBUF9JU19FU1NfT04oeCkgICAgICAgICAgICAgICAgICgoKHgpICYgMHgwMDAxKSAhPSAwKQogI2RlZmluZSBDQVBfSVNfSUJTU19PTih4KSAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDAwMikgIT0gMCkKICNkZWZpbmUgQ0FQX0lTX0NGX1BPTExBQkxFX09OKHgpICAgICAgICAgKCgoeCkgJiAweDAwMDQpICE9IDApCkBAIC0xMzYsNDQgKzEzNyw0NCBAQAogI2RlZmluZSBDQVBfSVNfU0hPUlRfUFJFQU1CTEVfT04oeCkgICAgICAoKCh4KSAmIDB4MDAyMCkgIT0gMCkKICNkZWZpbmUgQ0FQX0lTX1BCQ0NfT04oeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwNDApICE9IDApCiAjZGVmaW5lIENBUF9JU19BR0lMSVRZX09OKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwMDgwKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfU1BFQ1RSVU1fTUdNVCh4KSAgICAgICAgICAoKCh4KSAmIDB4MDEwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgQ0FQX0lTX1FPUyh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAyMDApICE9IDApICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIENBUF9JU19TUEVDVFJVTV9NR01UKHgpICAgICAgICAgICgoKHgpICYgMHgwMTAwKSAhPSAwKQkvKiA4MDIuMTFlIGQ5ICovCisjZGVmaW5lIENBUF9JU19RT1MoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgwMjAwKSAhPSAwKQkvKiA4MDIuMTFlIGQ5ICovCiAjZGVmaW5lIENBUF9JU19TSE9SVF9TTE9UKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwNDAwKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfQVBTRCh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDgwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgQ0FQX0lTX0lNTUVEX0JBKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEwMDApICE9IDApICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIENBUF9JU19BUFNEKHgpICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgwODAwKSAhPSAwKQkvKiA4MDIuMTFlIGQ5ICovCisjZGVmaW5lIENBUF9JU19JTU1FRF9CQSh4KSAgICAgICAgICAgICAgICgoKHgpICYgMHgxMDAwKSAhPSAwKQkvKiA4MDIuMTFlIGQ5ICovCiAjZGVmaW5lIENBUF9JU19EU1NTX09GRE0oeCkgICAgICAgICAgICAgICgoKHgpICYgMHgyMDAwKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfREVMQVlfQkEoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4NDAwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgQ0FQX0lTX0RFTEFZX0JBKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDQwMDApICE9IDApCS8qIDgwMi4xMWUgZDkgKi8KIAogI2RlZmluZSBDQVBfR0VORVJBVEUoZXNzLGlic3MscHJpdixzX3ByZSxzX3Nsb3Qsc3BlY3RydW0pICAoKChlc3MpID8gMHgwMDAxIDogMHgwMDAwKSB8ICgoaWJzcykgPyAweDAwMDIgOiAweDAwMDApIHwgKChwcml2KSA/IDB4MDAxMCA6IDB4MDAwMCkgfCAoKHNfcHJlKSA/IDB4MDAyMCA6IDB4MDAwMCkgfCAoKHNfc2xvdCkgPyAweDA0MDAgOiAweDAwMDApIHwgKChzcGVjdHJ1bSkgPyAweDAxMDAgOiAweDAwMDApKQogCi0jZGVmaW5lIEVSUF9JU19OT05fRVJQX1BSRVNFTlQoeCkgICAgICAgICgoKHgpICYgMHgwMSkgIT0gMCkgICAgLy8gODAyLjExZwotI2RlZmluZSBFUlBfSVNfVVNFX1BST1RFQ1RJT04oeCkgICAgICAgICAoKCh4KSAmIDB4MDIpICE9IDApICAgIC8vIDgwMi4xMWcKLSNkZWZpbmUgRVJQX0lTX1VTRV9CQVJLRVJfUFJFQU1CTEUoeCkgICAgKCgoeCkgJiAweDA0KSAhPSAwKSAgICAvLyA4MDIuMTFnCisjZGVmaW5lIEVSUF9JU19OT05fRVJQX1BSRVNFTlQoeCkgICAgICAgICgoKHgpICYgMHgwMSkgIT0gMCkJLyogODAyLjExZyAqLworI2RlZmluZSBFUlBfSVNfVVNFX1BST1RFQ1RJT04oeCkgICAgICAgICAoKCh4KSAmIDB4MDIpICE9IDApCS8qIDgwMi4xMWcgKi8KKyNkZWZpbmUgRVJQX0lTX1VTRV9CQVJLRVJfUFJFQU1CTEUoeCkgICAgKCgoeCkgJiAweDA0KSAhPSAwKQkvKiA4MDIuMTFnICovCiAKLSNkZWZpbmUgRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQgICAgICAgOC8vIDMgIC8vIGp1c3QgdGVzdCBieSBnYXJ5CisjZGVmaW5lIERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EICAgICAgIDgJLyogMyAgLy8ganVzdCB0ZXN0IGJ5IGdhcnkgKi8KICNkZWZpbmUgRFJTX1BFTkFMVFkgICAgICAgICAgICAgICAgICAgICAgOAogCiAjZGVmaW5lIEJBX05PVFVTRSAJMgotLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUKKy8qQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lICovCiAjZGVmaW5lIElNTUVEX0JBIAkxCiAjZGVmaW5lIERFTEFZX0JBCTAKIAotLy8gQkEgSW5pdGlhdG9yIHN1YmZpZWxkIGluIERFTEJBIGZyYW1lCisvKiBCQSBJbml0aWF0b3Igc3ViZmllbGQgaW4gREVMQkEgZnJhbWUgKi8KICNkZWZpbmUgT1JJR0lOQVRPUgkxCiAjZGVmaW5lIFJFQ0lQSUVOVAkwCiAKLS8vIEFEREJBIFN0YXR1cyBDb2RlCisvKiBBRERCQSBTdGF0dXMgQ29kZSAqLwogI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX1NVQ0NFU1MJCQkJCTAKICNkZWZpbmUgQUREQkFfUkVTVUxUQ09ERV9SRUZVU0VECQkJCQkzNwogI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX0lOVkFMSURfUEFSQU1FVEVSUwkJCTM4CiAKLS8vIERFTEJBIFJlYXNvbiBDb2RlCisvKiBERUxCQSBSZWFzb24gQ29kZSAqLwogI2RlZmluZSBERUxCQV9SRUFTT05DT0RFX1FTVEFfTEVBVklORwkJCQkzNgogI2RlZmluZSBERUxCQV9SRUFTT05DT0RFX0VORF9CQQkJCQkJCTM3CiAjZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfVU5LTk9XTl9CQQkJCQkJMzgKICNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9USU1FT1VUCQkJCQkzOQogCi0vLyByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMKKy8qIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycyAqLwogI2RlZmluZSBSRVNFVF9PTkVfU0VDX1RYX0NOVChfX3BFbnRyeSkgXAogaWYgKCgoX19wRW50cnkpKSAhPSBOVUxMKSBcCiB7IFwKQEAgLTE4Miw5NTcgKzE4Myw4NjggQEAKIAkoX19wRW50cnkpLT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID0gMDsgXAogfQogCi0vLwotLy8gODAyLjExIGZyYW1lIGZvcm1hdHMKLS8vCi0vLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotCVVTSE9SVAlBZHZDb2Rpbmc6MTsKLQlVU0hPUlQJQ2hhbm5lbFdpZHRoOjE7Ci0JVVNIT1JUCU1pbW9QczoyOy8vbW9taSBwb3dlciBzYWZlCi0JVVNIT1JUCUdGOjE7CS8vZ3JlZW4gZmllbGQKLQlVU0hPUlQJU2hvcnRHSWZvcjIwOjE7Ci0JVVNIT1JUCVNob3J0R0lmb3I0MDoxOwkvL2ZvcjQwTUh6Ci0JVVNIT1JUCVR4U1RCQzoxOwotCVVTSE9SVAlSeFNUQkM6MjsKLQlVU0hPUlQJRGVsYXllZEJBOjE7CS8vcnQyODYwYyBub3Qgc3VwcG9ydAotCVVTSE9SVAlBTXNkdVNpemU6MTsJLy8gb25seSBzdXBwb3J0IGFzIHplcm8KLQlVU0hPUlQJQ0NLbW9kZWluNDA6MTsKLQlVU0hPUlQJUFNNUDoxOwotCVVTSE9SVAlGb3J0eV9NaHpfSW50b2xlcmFudDoxOwotCVVTSE9SVAlMU0lHVHhvcFByb1N1cDoxOwotfSBIVF9DQVBfSU5GTywgKlBIVF9DQVBfSU5GTzsKKy8qICovCisvKiA4MDIuMTEgZnJhbWUgZm9ybWF0cyAqLworLyogKi8KKy8qICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4gKi8KK3N0cnVjdCBQQUNLRUQgcnRfaHRfY2FwX2luZm8geworCXUxNiBBZHZDb2Rpbmc6MTsKKwl1MTYgQ2hhbm5lbFdpZHRoOjE7CisJdTE2IE1pbW9QczoyOwkvKm1vbWkgcG93ZXIgc2FmZSAqLworCXUxNiBHRjoxOwkJLypncmVlbiBmaWVsZCAqLworCXUxNiBTaG9ydEdJZm9yMjA6MTsKKwl1MTYgU2hvcnRHSWZvcjQwOjE7CS8qZm9yNDBNSHogKi8KKwl1MTYgVHhTVEJDOjE7CisJdTE2IFJ4U1RCQzoyOworCXUxNiBEZWxheWVkQkE6MTsJLypydDI4NjBjIG5vdCBzdXBwb3J0ICovCisJdTE2IEFNc2R1U2l6ZToxOwkvKiBvbmx5IHN1cHBvcnQgYXMgemVybyAqLworCXUxNiBDQ0ttb2RlaW40MDoxOworCXUxNiBQU01QOjE7CisJdTE2IEZvcnR5X01oel9JbnRvbGVyYW50OjE7CisJdTE2IExTSUdUeG9wUHJvU3VwOjE7Cit9OwogCi0vLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotCVVDSEFSCU1heFJBbXBkdUZhY3RvcjoyOwotCVVDSEFSCU1wZHVEZW5zaXR5OjM7Ci0JVUNIQVIJcnN2OjM7Ly9tb21pIHBvd2VyIHNhZmUKLX0gSFRfQ0FQX1BBUk0sICpQSFRfQ0FQX1BBUk07CisvKiAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2h0X2NhcF9wYXJtIHsKKwl1OCBNYXhSQW1wZHVGYWN0b3I6MjsKKwl1OCBNcGR1RGVuc2l0eTozOworCXU4IHJzdjozOwkJLyptb21pIHBvd2VyIHNhZmUgKi8KK307CiAKLS8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0JVUNIQVIJTUNTU2V0WzEwXTsKLQlVQ0hBUglTdXBSYXRlWzJdOyAgLy8gdW5pdCA6IDFNYnBzCi0JVUNIQVIJVHhNQ1NTZXREZWZpbmVkOjE7Ci0JVUNIQVIJVHhSeE5vdEVxdWFsOjE7Ci0JVUNIQVIJVHhTdHJlYW06MjsKLQlVQ0hBUglNcGR1RGVuc2l0eToxOwotCVVDSEFSCXJzdjozOwotCVVDSEFSCXJzdjNbM107Ci19IEhUX01DU19TRVQsICpQSFRfTUNTX1NFVDsKKy8qICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4gKi8KK3N0cnVjdCBQQUNLRUQgcnRfaHRfbWNzX3NldCB7CisJdTggTUNTU2V0WzEwXTsKKwl1OCBTdXBSYXRlWzJdOwkvKiB1bml0IDogMU1icHMgKi8KKwl1OCBUeE1DU1NldERlZmluZWQ6MTsKKwl1OCBUeFJ4Tm90RXF1YWw6MTsKKwl1OCBUeFN0cmVhbToyOworCXU4IE1wZHVEZW5zaXR5OjE7CisJdTggcnN2OjM7CisJdTggcnN2M1szXTsKK307CiAKLS8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0JVVNIT1JUCVBjbzoxOwotCVVTSE9SVAlUcmFuVGltZToyOwotCVVTSE9SVAlyc3Y6NTsvL21vbWkgcG93ZXIgc2FmZQotCVVTSE9SVAlNQ1NGZWVkYmFjazoyOwkvLzA6bm8gTUNTIGZlZWRiYWNrLCAyOnVuc29saWNpdGVkIE1DUyBmZWVkYmFjaywgMzpGdWxsIE1DUyBmZWVkYmFjaywgIDE6cnN2LgotCVVTSE9SVAlQbHVzSFRDOjE7CS8vK0hUQyBjb250cm9sIGZpZWxkIHN1cHBvcnQKLQlVU0hPUlQJUkRHU3VwcG9ydDoxOwkvL3JldmVyc2UgRGlyZWN0aW9uIEdyYW50ICBzdXBwb3J0Ci0JVVNIT1JUCXJzdjI6NDsKLX0gRVhUX0hUX0NBUF9JTkZPLCAqUEVYVF9IVF9DQVBfSU5GTzsKKy8qICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4gKi8KK3N0cnVjdCBQQUNLRUQgcnRfZXh0X2h0X2NhcF9pbmZvIHsKKwl1MTYgUGNvOjE7CisJdTE2IFRyYW5UaW1lOjI7CisJdTE2IHJzdjo1OwkJLyptb21pIHBvd2VyIHNhZmUgKi8KKwl1MTYgTUNTRmVlZGJhY2s6MjsJLyowOm5vIE1DUyBmZWVkYmFjaywgMjp1bnNvbGljaXRlZCBNQ1MgZmVlZGJhY2ssIDM6RnVsbCBNQ1MgZmVlZGJhY2ssICAxOnJzdi4gKi8KKwl1MTYgUGx1c0hUQzoxOwkvKitIVEMgY29udHJvbCBmaWVsZCBzdXBwb3J0ICovCisJdTE2IFJER1N1cHBvcnQ6MTsJLypyZXZlcnNlIERpcmVjdGlvbiBHcmFudCAgc3VwcG9ydCAqLworCXUxNiByc3YyOjQ7Cit9OwogCi0vLyAgSFQgQmVhbWZvcm1pbmcgZmllbGQgaW4gSFQgQ2FwIElFIC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfSFRfQkZfQ0FQewotCVVMT05HCVR4QkZSZWNDYXBhYmxlOjE7Ci0JVUxPTkcJUnhTb3VuZENhcGFibGU6MTsKLQlVTE9ORwlUeFNvdW5kQ2FwYWJsZToxOwotCVVMT05HCVJ4TkRQQ2FwYWJsZToxOwotCVVMT05HCVR4TkRQQ2FwYWJsZToxOwotCVVMT05HCUltcFR4QkZDYXBhYmxlOjE7Ci0JVUxPTkcJQ2FsaWJyYXRpb246MjsKLQlVTE9ORwlFeHBDU0lDYXBhYmxlOjE7Ci0JVUxPTkcJRXhwTm9Db21TdGVlckNhcGFibGU6MTsKLQlVTE9ORwlFeHBDb21TdGVlckNhcGFibGU6MTsKLQlVTE9ORwlFeHBDU0lGYms6MjsKLQlVTE9ORwlFeHBOb0NvbUJGOjI7Ci0JVUxPTkcJRXhwQ29tQkY6MjsKLQlVTE9ORwlNaW5Hcm91cGluZzoyOwotCVVMT05HCUNTSUJGQW50U3VwOjI7Ci0JVUxPTkcJTm9Db21TdGVlckJGQW50U3VwOjI7Ci0JVUxPTkcJQ29tU3RlZXJCRkFudFN1cDoyOwotCVVMT05HCUNTSVJvd0JGU3VwOjI7Ci0JVUxPTkcJQ2hhbkVzdGltYXRpb246MjsKLQlVTE9ORwlyc3Y6MzsKLX0gSFRfQkZfQ0FQLCAqUEhUX0JGX0NBUDsKKy8qICBIVCBCZWFtZm9ybWluZyBmaWVsZCBpbiBIVCBDYXAgSUUgLiAqLworc3RydWN0IFBBQ0tFRCBydF9odF9iZl9jYXAgeworCXVuc2lnbmVkIGxvbmcgVHhCRlJlY0NhcGFibGU6MTsKKwl1bnNpZ25lZCBsb25nIFJ4U291bmRDYXBhYmxlOjE7CisJdW5zaWduZWQgbG9uZyBUeFNvdW5kQ2FwYWJsZToxOworCXVuc2lnbmVkIGxvbmcgUnhORFBDYXBhYmxlOjE7CisJdW5zaWduZWQgbG9uZyBUeE5EUENhcGFibGU6MTsKKwl1bnNpZ25lZCBsb25nIEltcFR4QkZDYXBhYmxlOjE7CisJdW5zaWduZWQgbG9uZyBDYWxpYnJhdGlvbjoyOworCXVuc2lnbmVkIGxvbmcgRXhwQ1NJQ2FwYWJsZToxOworCXVuc2lnbmVkIGxvbmcgRXhwTm9Db21TdGVlckNhcGFibGU6MTsKKwl1bnNpZ25lZCBsb25nIEV4cENvbVN0ZWVyQ2FwYWJsZToxOworCXVuc2lnbmVkIGxvbmcgRXhwQ1NJRmJrOjI7CisJdW5zaWduZWQgbG9uZyBFeHBOb0NvbUJGOjI7CisJdW5zaWduZWQgbG9uZyBFeHBDb21CRjoyOworCXVuc2lnbmVkIGxvbmcgTWluR3JvdXBpbmc6MjsKKwl1bnNpZ25lZCBsb25nIENTSUJGQW50U3VwOjI7CisJdW5zaWduZWQgbG9uZyBOb0NvbVN0ZWVyQkZBbnRTdXA6MjsKKwl1bnNpZ25lZCBsb25nIENvbVN0ZWVyQkZBbnRTdXA6MjsKKwl1bnNpZ25lZCBsb25nIENTSVJvd0JGU3VwOjI7CisJdW5zaWduZWQgbG9uZyBDaGFuRXN0aW1hdGlvbjoyOworCXVuc2lnbmVkIGxvbmcgcnN2OjM7Cit9OwogCi0vLyAgSFQgYW50ZW5uYSBzZWxlY3Rpb24gZmllbGQgaW4gSFQgQ2FwIElFIC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfSFRfQVNfQ0FQewotCVVDSEFSCUFudFNlbGVjdDoxOwotCVVDSEFSCUV4cENTSUZia1R4QVNFTDoxOwotCVVDSEFSCUFudEluZEZia1R4QVNFTDoxOwotCVVDSEFSCUV4cENTSUZiazoxOwotCVVDSEFSCUFudEluZEZiazoxOwotCVVDSEFSCVJ4QVNlbDoxOwotCVVDSEFSCVR4U291bmRQUERVOjE7Ci0JVUNIQVIJcnN2OjE7Ci19IEhUX0FTX0NBUCwgKlBIVF9BU19DQVA7CisvKiAgSFQgYW50ZW5uYSBzZWxlY3Rpb24gZmllbGQgaW4gSFQgQ2FwIElFIC4gKi8KK3N0cnVjdCBQQUNLRUQgcnRfaHRfYXNfY2FwIHsKKwl1OCBBbnRTZWxlY3Q6MTsKKwl1OCBFeHBDU0lGYmtUeEFTRUw6MTsKKwl1OCBBbnRJbmRGYmtUeEFTRUw6MTsKKwl1OCBFeHBDU0lGYms6MTsKKwl1OCBBbnRJbmRGYms6MTsKKwl1OCBSeEFTZWw6MTsKKwl1OCBUeFNvdW5kUFBEVToxOworCXU4IHJzdjoxOworfTsKIAotLy8gRHJhZnQgMS4wIHNldCBJRSBsZW5ndGggMjYsIGJ1dCBpcyBleHRlbnNpYmxlLi4KKy8qIERyYWZ0IDEuMCBzZXQgSUUgbGVuZ3RoIDI2LCBidXQgaXMgZXh0ZW5zaWJsZS4uICovCiAjZGVmaW5lIFNJWkVfSFRfQ0FQX0lFCQkyNgotLy8gVGhlIHN0cnVjdHVyZSBmb3IgSFQgQ2FwYWJpbGl0eSBJRS4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfSFRfQ0FQQUJJTElUWV9JRXsKLQlIVF9DQVBfSU5GTwkJSHRDYXBJbmZvOwotCUhUX0NBUF9QQVJNCQlIdENhcFBhcm07Ci0vLwlIVF9NQ1NfU0VUCQlIdE1DU1NldDsKLQlVQ0hBUgkJCU1DU1NldFsxNl07Ci0JRVhUX0hUX0NBUF9JTkZPCUV4dEh0Q2FwSW5mbzsKLQlIVF9CRl9DQVAJCVR4QkZDYXA7CS8vIGJlYW1mb3JtaW5nIGNhcC4gcnQyODYwYyBub3Qgc3VwcG9ydCBiZWFtZm9ybWluZy4KLQlIVF9BU19DQVAJCUFTQ2FwOwkvL2FudGVubmEgc2VsZWN0aW9uLgotfSBIVF9DQVBBQklMSVRZX0lFLCAqUEhUX0NBUEFCSUxJVFlfSUU7CisvKiBUaGUgc3RydWN0dXJlIGZvciBIVCBDYXBhYmlsaXR5IElFLiAqLworc3RydWN0IFBBQ0tFRCBydF9odF9jYXBhYmlsaXR5X2llIHsKKwlzdHJ1Y3QgcnRfaHRfY2FwX2luZm8gSHRDYXBJbmZvOworCXN0cnVjdCBydF9odF9jYXBfcGFybSBIdENhcFBhcm07CisvKiAgICAgIHN0cnVjdCBydF9odF9tY3Nfc2V0ICAgICAgICAgICAgICBIdE1DU1NldDsgKi8KKwl1OCBNQ1NTZXRbMTZdOworCXN0cnVjdCBydF9leHRfaHRfY2FwX2luZm8gRXh0SHRDYXBJbmZvOworCXN0cnVjdCBydF9odF9iZl9jYXAgVHhCRkNhcDsJLyogYmVhbWZvcm1pbmcgY2FwLiBydDI4NjBjIG5vdCBzdXBwb3J0IGJlYW1mb3JtaW5nLiAqLworCXN0cnVjdCBydF9odF9hc19jYXAgQVNDYXA7CS8qYW50ZW5uYSBzZWxlY3Rpb24uICovCit9OwogCisvKiA4MDIuMTFuIGRyYWZ0MyByZWxhdGVkIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4gKi8KKy8qIDcuMy4yLjYwICovCisjZGVmaW5lIGRvdDExT0JTU1NjYW5QYXNzaXZlRHdlbGwJCQkJCQkJMjAJLyogaW4gVFUuIG1pbiBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgY29udGlub3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBhY3RpdmUgT0JTUyBzY2FuLiAqLworI2RlZmluZSBkb3QxMU9CU1NTY2FuQWN0aXZlRHdlbGwJCQkJCQkJMTAJLyogaW4gVFUubWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW5vdXNseSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGFuIHBhc3NpdmUgT0JTUyBzY2FuLiAqLworI2RlZmluZSBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbAkJCQkJMzAwCS8qIGluIHNlYy4gbWF4IGludGVydmFsIGJldHdlZW4gc2NhbiBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZCB0byBkZXRlY3QgQlNTIGNoYW5uZWwgd2lkdGggdHJpZ2dlciBldmVudHMuICovCisjZGVmaW5lIGRvdDExT0JTU1NjYW5QYXNzaXZlVG90YWxQZXJDaGFubmVsCQkJCQkyMDAJLyogaW4gVFUuIG1pbiB0b3RhbCBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhIHBhc3NpdmUgT0JTUyBzY2FuLiAqLworI2RlZmluZSBkb3QxMU9CU1NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsCQkJCQkyMAkvKmluIFRVLiBtaW4gdG90YWwgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYSBhY3RpdmUgT0JTUyBzY2FuICovCisjZGVmaW5lIGRvdDExQlNTV2lkdGhDaGFubmVsVHJhbnNhY3Rpb25EZWxheUZhY3RvcgkJCTUJLyogbWluIHJhdGlvIGJldHdlZW4gdGhlIGRlbGF5IHRpbWUgaW4gcGVyZm9ybWluZyBhIHN3aXRjaCBmcm9tIDIwTUh6IEJTUyB0byAyMC80MCBCU1Mgb3BlcmF0aW9uIGFuZCB0aGUgbWF4aW11bSAqLworCQkJCQkJCQkJCQkJCQkJCS8qICAgICAgaW50ZXJ2YWwgYmV0d2VlbiBvdmVybGFwcGluZyBCU1Mgc2NhbiBvcGVyYXRpb25zLiAqLworI2RlZmluZSBkb3QxMUJTU1NjYW5BY3Rpdml0eVRocmVzaG9sZAkJCQkJCTI1CS8qIGluICUlLCBtYXggdG90YWwgdGltZSB0aGF0IGEgU1RBIG1heSBiZSBhY3RpdmUgb24gdGhlIG1lZGl1bSBkdXJpbmcgYSBwZXJpb2Qgb2YgKi8KKwkJCQkJCQkJCQkJCQkJCQkvKiAgICAgIChkb3QxMUJTU1dpZHRoQ2hhbm5lbFRyYW5zYWN0aW9uRGVsYXlGYWN0b3IgKiBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbCkgc2Vjb25kcyB3aXRob3V0ICovCisJCQkJCQkJCQkJCQkJCQkJLyogICAgICBiZWluZyBvYmxpZ2F0ZWQgdG8gcGVyZm9ybSBPQlNTIFNjYW4gb3BlcmF0aW9ucy4gZGVmYXVsdCBpcyAyNSg9PSAwLjI1JSkgKi8KIAotLy8gODAyLjExbiBkcmFmdDMgcmVsYXRlZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuCi0vLyA3LjMuMi42MAotI2RlZmluZSBkb3QxMU9CU1NTY2FuUGFzc2l2ZUR3ZWxsCQkJCQkJCTIwCS8vIGluIFRVLiBtaW4gYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIGNvbnRpbm91c2x5IHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYW4gYWN0aXZlIE9CU1Mgc2Nhbi4KLSNkZWZpbmUgZG90MTFPQlNTU2NhbkFjdGl2ZUR3ZWxsCQkJCQkJCTEwCS8vIGluIFRVLm1pbiBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgY29udGlub3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBwYXNzaXZlIE9CU1Mgc2Nhbi4KLSNkZWZpbmUgZG90MTFCU1NXaWR0aFRyaWdnZXJTY2FuSW50ZXJ2YWwJCQkJCTMwMCAgLy8gaW4gc2VjLiBtYXggaW50ZXJ2YWwgYmV0d2VlbiBzY2FuIG9wZXJhdGlvbnMgdG8gYmUgcGVyZm9ybWVkIHRvIGRldGVjdCBCU1MgY2hhbm5lbCB3aWR0aCB0cmlnZ2VyIGV2ZW50cy4KLSNkZWZpbmUgZG90MTFPQlNTU2NhblBhc3NpdmVUb3RhbFBlckNoYW5uZWwJCQkJCTIwMAkvLyBpbiBUVS4gbWluIHRvdGFsIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGEgcGFzc2l2ZSBPQlNTIHNjYW4uCi0jZGVmaW5lIGRvdDExT0JTU1NjYW5BY3RpdmVUb3RhbFBlckNoYW5uZWwJCQkJCTIwCS8vaW4gVFUuIG1pbiB0b3RhbCBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhIGFjdGl2ZSBPQlNTIHNjYW4KLSNkZWZpbmUgZG90MTFCU1NXaWR0aENoYW5uZWxUcmFuc2FjdGlvbkRlbGF5RmFjdG9yCQkJNQkvLyBtaW4gcmF0aW8gYmV0d2VlbiB0aGUgZGVsYXkgdGltZSBpbiBwZXJmb3JtaW5nIGEgc3dpdGNoIGZyb20gMjBNSHogQlNTIHRvIDIwLzQwIEJTUyBvcGVyYXRpb24gYW5kIHRoZSBtYXhpbWEKLQkJCQkJCQkJCQkJCQkJCQkvLwlpbnRlcnZhbCBiZXR3ZWVuIG92ZXJsYXBwaW5nIEJTUyBzY2FuIG9wZXJhdGlvbnMuCi0jZGVmaW5lIGRvdDExQlNTU2NhbkFjdGl2aXR5VGhyZXNob2xkCQkJCQkJMjUJLy8gaW4gJSUsIG1heCB0b3RhbCB0aW1lIHRoYXQgYSBTVEEgbWF5IGJlIGFjdGl2ZSBvbiB0aGUgbWVkaXVtIGR1cmluZyBhIHBlcmlvZCBvZgotCQkJCQkJCQkJCQkJCQkJCS8vCShkb3QxMUJTU1dpZHRoQ2hhbm5lbFRyYW5zYWN0aW9uRGVsYXlGYWN0b3IgKiBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbCkgc2Vjb25kcyB3aXRob3V0Ci0JCQkJCQkJCQkJCQkJCQkJLy8JYmVpbmcgb2JsaWdhdGVkIHRvIHBlcmZvcm0gT0JTUyBTY2FuIG9wZXJhdGlvbnMuIGRlZmF1bHQgaXMgMjUoPT0gMC4yNSUpCitzdHJ1Y3QgUEFDS0VEIHJ0X292ZXJsYXBfYnNzX3NjYW5faWUgeworCXUxNiBTY2FuUGFzc2l2ZUR3ZWxsOworCXUxNiBTY2FuQWN0aXZlRHdlbGw7CisJdTE2IFRyaWdnZXJTY2FuSW50OwkvKiBUcmlnZ2VyIHNjYW4gaW50ZXJ2YWwgKi8KKwl1MTYgUGFzc2l2ZVRhbFBlckNoYW5uZWw7CS8qIHBhc3NpdmUgdG90YWwgcGVyIGNoYW5uZWwgKi8KKwl1MTYgQWN0aXZlVGFsUGVyQ2hhbm5lbDsJLyogYWN0aXZlIHRvdGFsIHBlciBjaGFubmVsICovCisJdTE2IERlbGF5RmFjdG9yOwkvKiBCU1Mgd2lkdGggY2hhbm5lbCB0cmFuc2l0aW9uIGRlbGF5IGZhY3RvciAqLworCXUxNiBTY2FuQWN0VGhyZTsJLyogU2NhbiBBY3Rpdml0eSB0aHJlc2hvbGQgKi8KK307CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfT1ZFUkxBUF9CU1NfU0NBTl9JRXsKLQlVU0hPUlQJCVNjYW5QYXNzaXZlRHdlbGw7Ci0JVVNIT1JUCQlTY2FuQWN0aXZlRHdlbGw7Ci0JVVNIT1JUCQlUcmlnZ2VyU2NhbkludDsJCQkJLy8gVHJpZ2dlciBzY2FuIGludGVydmFsCi0JVVNIT1JUCQlQYXNzaXZlVGFsUGVyQ2hhbm5lbDsJCS8vIHBhc3NpdmUgdG90YWwgcGVyIGNoYW5uZWwKLQlVU0hPUlQJCUFjdGl2ZVRhbFBlckNoYW5uZWw7CQkvLyBhY3RpdmUgdG90YWwgcGVyIGNoYW5uZWwKLQlVU0hPUlQJCURlbGF5RmFjdG9yOwkJCQkvLyBCU1Mgd2lkdGggY2hhbm5lbCB0cmFuc2l0aW9uIGRlbGF5IGZhY3RvcgotCVVTSE9SVAkJU2NhbkFjdFRocmU7CQkJCS8vIFNjYW4gQWN0aXZpdHkgdGhyZXNob2xkCi19T1ZFUkxBUF9CU1NfU0NBTl9JRSwgKlBPVkVSTEFQX0JTU19TQ0FOX0lFOwotCi0KLS8vICA3LjMuMi41Ni4gMjAvNDAgQ29leGlzdGVuY2UgZWxlbWVudCB1c2VkIGluICBFbGVtZW50IElEID0gNzIgPSBJRV8yMDQwX0JTU19DT0VYSVNUCi10eXBlZGVmIHVuaW9uIFBBQ0tFRCBfQlNTXzIwNDBfQ09FWElTVF9JRXsKLSBzdHJ1Y3QgUEFDS0VEIHsKLQlVQ0hBUglJbmZvUmVxOjE7Ci0JVUNIQVIJSW50b2xlcmFudDQwOjE7CQkJLy8gSW50ZXItQlNTLiBzZXQgMSB3aGVuIHByb2hpYml0cyBhIHJlY2VpdmluZyBCU1MgZnJvbSBvcGVyYXRpbmcgYXMgYSAyMC80MCBNaHogQlNTLgotCVVDSEFSCUJTUzIwV2lkdGhSZXE6MTsJCS8vIEludHJhLUJTUyBzZXQgMSB3aGVuIHByb2hpYml0cyBhIHJlY2VpdmluZyBBUCBmcm9tIG9wZXJhdGluZyBpdHMgQlNTIGFzIGEgMjAvNDBNSHogQlNTLgotCVVDSEFSCXJzdjo1OwotICAgIH0gZmllbGQ7Ci0gVUNIQVIgICB3b3JkOworLyogIDcuMy4yLjU2LiAyMC80MCBDb2V4aXN0ZW5jZSBlbGVtZW50IHVzZWQgaW4gIEVsZW1lbnQgSUQgPSA3MiA9IElFXzIwNDBfQlNTX0NPRVhJU1QgKi8KK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9CU1NfMjA0MF9DT0VYSVNUX0lFIHsKKwlzdHJ1Y3QgUEFDS0VEIHsKKwkJdTggSW5mb1JlcToxOworCQl1OCBJbnRvbGVyYW50NDA6MTsJLyogSW50ZXItQlNTLiBzZXQgMSB3aGVuIHByb2hpYml0cyBhIHJlY2VpdmluZyBCU1MgZnJvbSBvcGVyYXRpbmcgYXMgYSAyMC80MCBNaHogQlNTLiAqLworCQl1OCBCU1MyMFdpZHRoUmVxOjE7CS8qIEludHJhLUJTUyBzZXQgMSB3aGVuIHByb2hpYml0cyBhIHJlY2VpdmluZyBBUCBmcm9tIG9wZXJhdGluZyBpdHMgQlNTIGFzIGEgMjAvNDBNSHogQlNTLiAqLworCQl1OCByc3Y6NTsKKwl9IGZpZWxkOworCXU4IHdvcmQ7CiB9IEJTU18yMDQwX0NPRVhJU1RfSUUsICpQQlNTXzIwNDBfQ09FWElTVF9JRTsKIAorc3RydWN0IHJ0X3RyaWdnZXJfZXZlbnRhIHsKKwlCT09MRUFOIGJWYWxpZDsKKwl1OCBCU1NJRFs2XTsKKwl1OCBSZWdDbGFzczsJCS8qIFJlZ3VsYXRvcnkgQ2xhc3MgKi8KKwl1MTYgQ2hhbm5lbDsKKwl1bnNpZ25lZCBsb25nIENEQ291bnRlcjsJLyogTWFpbnRhaW4gYSBzZXBlcmF0ZSBjb3VudCBkb3duIGNvdW50ZXIgZm9yIGVhY2ggRXZlbnQgQS4gKi8KK307CiAKLXR5cGVkZWYgc3RydWN0ICBfVFJJR0dFUl9FVkVOVEF7Ci0JQk9PTEVBTgkJCWJWYWxpZDsKLQlVQ0hBUglCU1NJRFs2XTsKLQlVQ0hBUglSZWdDbGFzczsJLy8gUmVndWxhdG9yeSBDbGFzcwotCVVTSE9SVAlDaGFubmVsOwotCVVMT05HCUNEQ291bnRlcjsgICAvLyBNYWludGFpbiBhIHNlcGVyYXRlIGNvdW50IGRvd24gY291bnRlciBmb3IgZWFjaCBFdmVudCBBLgotfSBUUklHR0VSX0VWRU5UQSwgKlBUUklHR0VSX0VWRU5UQTsKLQotLy8gMjAvNDAgdHJpZ2dlciBldmVudCB0YWJsZQotLy8gSWYgb25lIEV2ZW50IEEgZGVsZXRlIG9yIGNyZWF0ZWQsIG9yIGlmIEV2ZW50IEIgaXMgZGV0ZWN0ZWQgb3Igbm90IGRldGVjdGVkLCBTVEEgc2hvdWxkIHNlbmQgMjA0MEJTU0NvZXhpc3RlbmNlIHRvIEFQLgorLyogMjAvNDAgdHJpZ2dlciBldmVudCB0YWJsZSAqLworLyogSWYgb25lIEV2ZW50IEEgZGVsZXRlIG9yIGNyZWF0ZWQsIG9yIGlmIEV2ZW50IEIgaXMgZGV0ZWN0ZWQgb3Igbm90IGRldGVjdGVkLCBTVEEgc2hvdWxkIHNlbmQgMjA0MEJTU0NvZXhpc3RlbmNlIHRvIEFQLiAqLwogI2RlZmluZSBNQVhfVFJJR0dFUl9FVkVOVAkJNjQKLXR5cGVkZWYgc3RydWN0ICBfVFJJR0dFUl9FVkVOVF9UQUJ7Ci0JVUNIQVIJRXZlbnRBTm87Ci0JVFJJR0dFUl9FVkVOVEEJRXZlbnRBW01BWF9UUklHR0VSX0VWRU5UXTsKLQlVTE9ORwkJCUV2ZW50QkNvdW50RG93bjsJLy8gQ291bnQgZG93biBjb3VudGVyIGZvciBFdmVudCBCLgotfSBUUklHR0VSX0VWRU5UX1RBQiwgKlBUUklHR0VSX0VWRU5UX1RBQjsKK3N0cnVjdCBydF90cmlnZ2VyX2V2ZW50X3RhYiB7CisJdTggRXZlbnRBTm87CisJc3RydWN0IHJ0X3RyaWdnZXJfZXZlbnRhIEV2ZW50QVtNQVhfVFJJR0dFUl9FVkVOVF07CisJdW5zaWduZWQgbG9uZyBFdmVudEJDb3VudERvd247CS8qIENvdW50IGRvd24gY291bnRlciBmb3IgRXZlbnQgQi4gKi8KK307CiAKLS8vIDcuMy4yNyAyMC80MCBCc3MgQ29leGlzdGVuY2UgTWdtdCBjYXBhYmlsaXR5IHVzZWQgaW4gZXh0ZW5kZWQgY2FwYWJpbGl0aWVzIGluZm9ybWF0aW9uIElFKCBJRCA9IDEyNyA9IElFX0VYVF9DQVBBQklMSVRZKS4KLS8vCVRoaXMgaXMgdGhlIGZpcnN0IG9jdGV0IGFuZCB3YXMgZGVmaW5lZCBpbiA4MDIuMTFuIEQzLjAzIGFuZCA4MDIuMTF5RDkuMAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9FWFRfQ0FQX0lORk9fRUxFTUVOVHsKLQlVQ0hBUglCc3NDb2V4aXN0TWdtdFN1cHBvcnQ6MTsKLQlVQ0hBUglyc3Y6MTsKLQlVQ0hBUglFeHRlbmRDaGFubmVsU3dpdGNoOjE7Ci0JVUNIQVIJcnN2Mjo1OwotfUVYVF9DQVBfSU5GT19FTEVNRU5ULCAqUEVYVF9DQVBfSU5GT19FTEVNRU5UOworLyogNy4zLjI3IDIwLzQwIEJzcyBDb2V4aXN0ZW5jZSBNZ210IGNhcGFiaWxpdHkgdXNlZCBpbiBleHRlbmRlZCBjYXBhYmlsaXRpZXMgaW5mb3JtYXRpb24gSUUoIElEID0gMTI3ID0gSUVfRVhUX0NBUEFCSUxJVFkpLiAqLworLyogICAgICBUaGlzIGlzIHRoZSBmaXJzdCBvY3RldCBhbmQgd2FzIGRlZmluZWQgaW4gODAyLjExbiBEMy4wMyBhbmQgODAyLjExeUQ5LjAgKi8KK3N0cnVjdCBQQUNLRUQgcnRfZXh0X2NhcF9pbmZvX2VsZW1lbnQgeworCXU4IEJzc0NvZXhpc3RNZ210U3VwcG9ydDoxOworCXU4IHJzdjoxOworCXU4IEV4dGVuZENoYW5uZWxTd2l0Y2g6MTsKKwl1OCByc3YyOjU7Cit9OwogCisvKiA4MDIuMTFuIDcuMy4yLjYxICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2Jzc18yMDQwX2NvZXhpc3RfZWxlbWVudCB7CisJdTggRWxlbWVudElEOwkvKiBJRCA9IElFXzIwNDBfQlNTX0NPRVhJU1QgPSA3MiAqLworCXU4IExlbjsKKwlCU1NfMjA0MF9DT0VYSVNUX0lFIEJzc0NvZXhpc3RJZTsKK307CiAKLS8vIDgwMi4xMW4gNy4zLjIuNjEKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UewotCVVDSEFSCQkJCQlFbGVtZW50SUQ7CQkvLyBJRCA9IElFXzIwNDBfQlNTX0NPRVhJU1QgPSA3MgotCVVDSEFSCQkJCQlMZW47Ci0JQlNTXzIwNDBfQ09FWElTVF9JRQkJQnNzQ29leGlzdEllOwotfUJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCwgKlBCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQ7CisvKjgwMi4xMW4gNy4zLjIuNTkgKi8KK3N0cnVjdCBQQUNLRUQgcnRfYnNzXzIwNDBfaW50b2xlcmFudF9jaF9yZXBvcnQgeworCXU4IEVsZW1lbnRJRDsJLyogSUQgPSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVCA9IDczICovCisJdTggTGVuOworCXU4IFJlZ3VsYXRvcnlDbGFzczsKKwl1OCBDaExpc3RbMF07Cit9OwogCisvKiBUaGUgc3RydWN0dXJlIGZvciBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCBJRS4gVGhpcyBpcyBpbiA4MDIuMTFuIEQzLjAzICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2NoYV9zd2l0Y2hfYW5ub3VuY2VfaWUgeworCXU4IFN3aXRjaE1vZGU7CS8qY2hhbm5lbCBzd2l0Y2ggbW9kZSAqLworCXU4IE5ld0NoYW5uZWw7CS8qICovCisJdTggU3dpdGNoQ291bnQ7CS8qICovCit9OwogCi0vLzgwMi4xMW4gNy4zLjIuNTkKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlR7Ci0JVUNIQVIJCQkJRWxlbWVudElEOwkJLy8gSUQgPSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVCA9IDczCi0JVUNIQVIJCQkJTGVuOwotCVVDSEFSCQkJCVJlZ3VsYXRvcnlDbGFzczsKLQlVQ0hBUgkJCQlDaExpc3RbMF07Ci19QlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQsICpQQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQ7CisvKiBUaGUgc3RydWN0dXJlIGZvciBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCBJRS4gVGhpcyBpcyBpbiA4MDIuMTFuIEQzLjAzICovCitzdHJ1Y3QgUEFDS0VEIHJ0X3NlY19jaGFfb2Zmc2V0X2llIHsKKwl1OCBTZWNvbmRhcnlDaGFubmVsT2Zmc2V0OwkvKiAxOiBTZWNvbmRhcnkgYWJvdmUsIDM6IFNlY29uZGFyeSBiZWxvdywgMDogbm8gU2Vjb25kYXJ5ICovCit9OwogCisvKiBUaGlzIHN0cnVjdHVyZSBpcyBleHRyYWN0ZWQgZnJvbSBzdHJ1Y3Qgc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHkgKi8KK3N0cnVjdCBydF9odF9waHlfaW5mbyB7CisJQk9PTEVBTiBiSHRFbmFibGU7CS8qIElmIHdlIHNob3VsZCB1c2UgaHQgcmF0ZS4gKi8KKwlCT09MRUFOIGJQcmVOSHQ7CS8qIElmIHdlIHNob3VsZCB1c2UgaHQgcmF0ZS4gKi8KKwkvKlN1YnN0cmFjdCBmcm9tIEhUIENhcGFiaWxpdHkgSUUgKi8KKwl1OCBNQ1NTZXRbMTZdOworfTsKIAotLy8gVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMwotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSEFfU1dJVENIX0FOTk9VTkNFX0lFewotCVVDSEFSCQkJU3dpdGNoTW9kZTsJLy9jaGFubmVsIHN3aXRjaCBtb2RlCi0JVUNIQVIJCQlOZXdDaGFubmVsOwkvLwotCVVDSEFSCQkJU3dpdGNoQ291bnQ7CS8vCi19IENIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUsICpQQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRTsKKy8qVGhpcyBzdHJ1Y3R1cmUgc3Vic3RyYWN0cyByYWxpbmsgc3VwcG9ydHMgZnJvbSBhbGwgODAyLjExbi1yZWxhdGVkIGZlYXR1cmVzLiAqLworLypGZWF0dXJlcyBub3QgbGlzdGVkIGhlcmUgYnV0IGNvbnRhaW5lZCBpbiA4MDIuMTFuIHNwZWMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gcnQyODYwLiAqLworc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHkgeworCXUxNiBDaGFubmVsV2lkdGg6MTsKKwl1MTYgTWltb1BzOjI7CS8qbWltbyBwb3dlciBzYWZlIE1NUFNfICovCisJdTE2IEdGOjE7CQkvKmdyZWVuIGZpZWxkICovCisJdTE2IFNob3J0R0lmb3IyMDoxOworCXUxNiBTaG9ydEdJZm9yNDA6MTsJLypmb3I0ME1IeiAqLworCXUxNiBUeFNUQkM6MTsKKwl1MTYgUnhTVEJDOjI7CS8qIDIgYml0cyAqLworCXUxNiBBbXNkdUVuYWJsZToxOwkvKiBFbmFibGUgdG8gdHJhbnNtaXQgQS1NU0RVLiBTdWdnZXN0IGRpc2FibGUuIFdlIHNob3VsZCB1c2UgQS1NUERVIHRvIGdhaW4gYmVzdCBiZW5pZml0IG9mIDgwMi4xMW4gKi8KKwl1MTYgQW1zZHVTaXplOjE7CS8qIE1heCByZWNlaXZpbmcgQS1NU0RVIHNpemUgKi8KKwl1MTYgcnN2OjU7CiAKKwkvKlN1YnN0cmFjdCBmcm9tIEFkZGlvbnQgSFQgSU5GTyBJRSAqLworCXU4IE1heFJBbXBkdUZhY3RvcjoyOworCXU4IE1wZHVEZW5zaXR5OjM7CisJdTggRXh0Q2hhbk9mZnNldDoyOwkvKiBQbGVhc2Ugbm90IHRoZSBkaWZmZXJlbmNlIHdpdGggZm9sbG93aW5nICAgICB1OCAgIE5ld0V4dENoYW5uZWxPZmZzZXQ7IGZyb20gODAyLjExbiAqLworCXU4IFJlY29tV2lkdGg6MTsKIAotLy8gVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMwotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9TRUNfQ0hBX09GRlNFVF9JRXsKLQlVQ0hBUgkJCVNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7CSAvLyAxOiBTZWNvbmRhcnkgYWJvdmUsIDM6IFNlY29uZGFyeSBiZWxvdywgMDogbm8gU2Vjb25kYXJ5Ci19IFNFQ19DSEFfT0ZGU0VUX0lFLCAqUFNFQ19DSEFfT0ZGU0VUX0lFOworCXUxNiBPcGVyYWlvbk1vZGU6MjsKKwl1MTYgTm9uR2ZQcmVzZW50OjE7CisJdTE2IHJzdjM6MTsKKwl1MTYgT0JTU19Ob25IVEV4aXN0OjE7CisJdTE2IHJzdjI6MTE7CiAKKwkvKiBOZXcgRXh0ZW5zaW9uIENoYW5uZWwgT2Zmc2V0IElFICovCisJdTggTmV3RXh0Q2hhbm5lbE9mZnNldDsKKwkvKiBFeHRlbnNpb24gQ2FwYWJpbGl0eSBJRSA9IDEyNyAqLworCXU4IEJTU0NvZXhpc3QyMDQwOworfTsKIAotLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgZXh0cmFjdGVkIGZyb20gc3RydWN0IFJUX0hUX0NBUEFCSUxJVFkKLXR5cGVkZWYgc3RydWN0IHsKLQlCT09MRUFOCQkJYkh0RW5hYmxlOwkgLy8gSWYgd2Ugc2hvdWxkIHVzZSBodCByYXRlLgotCUJPT0xFQU4JCQliUHJlTkh0OwkgLy8gSWYgd2Ugc2hvdWxkIHVzZSBodCByYXRlLgotCS8vU3Vic3RyYWN0IGZyb20gSFQgQ2FwYWJpbGl0eSBJRQotCVVDSEFSCQkJTUNTU2V0WzE2XTsJLy9vbmx5IHN1cG9vcnQgTUNTPTAtMTUsMzIgLAotfSBSVF9IVF9QSFlfSU5GTywgKlBSVF9IVF9QSFlfSU5GTzsKKy8qICAgZmllbGQgaW4gQWRkdGlvbmFsIEhUIEluZm9ybWF0aW9uIElFIC4gKi8KK3N0cnVjdCBQQUNLRUQgcnRfYWRkX2h0aW5mbyB7CisJdTggRXh0Q2hhbk9mZnNldDoyOworCXU4IFJlY29tV2lkdGg6MTsKKwl1OCBSaWZzTW9kZToxOworCXU4IFNfUFNNUFN1cDoxOwkvKkluZGljYXRlIHN1cHBvcnQgZm9yIHNjaGVkdWxlZCBQU01QICovCisJdTggU2VySW50ZXJHcmFudTozOwkvKnNlcnZpY2UgaW50ZXJ2YWwgZ3JhbnVsYXJpdHkgKi8KK307CiAKLS8vVGhpcyBzdHJ1Y3R1cmUgc3Vic3RyYWN0cyByYWxpbmsgc3VwcG9ydHMgZnJvbSBhbGwgODAyLjExbi1yZWxhdGVkIGZlYXR1cmVzLgotLy9GZWF0dXJlcyBub3QgbGlzdGVkIGhlcmUgYnV0IGNvbnRhaW5lZCBpbiA4MDIuMTFuIHNwZWMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gcnQyODYwLgotdHlwZWRlZiBzdHJ1Y3QgewotCVVTSE9SVAlDaGFubmVsV2lkdGg6MTsKLQlVU0hPUlQJTWltb1BzOjI7Ly9taW1vIHBvd2VyIHNhZmUgTU1QU18KLQlVU0hPUlQJR0Y6MTsJLy9ncmVlbiBmaWVsZAotCVVTSE9SVAlTaG9ydEdJZm9yMjA6MTsKLQlVU0hPUlQJU2hvcnRHSWZvcjQwOjE7CS8vZm9yNDBNSHoKLQlVU0hPUlQJVHhTVEJDOjE7Ci0JVVNIT1JUCVJ4U1RCQzoyOwkvLyAyIGJpdHMKLQlVU0hPUlQJQW1zZHVFbmFibGU6MTsJLy8gRW5hYmxlIHRvIHRyYW5zbWl0IEEtTVNEVS4gU3VnZ2VzdCBkaXNhYmxlLiBXZSBzaG91bGQgdXNlIEEtTVBEVSB0byBnYWluIGJlc3QgYmVuaWZpdCBvZiA4MDIuMTFuCi0JVVNIT1JUCUFtc2R1U2l6ZToxOwkvLyBNYXggcmVjZWl2aW5nIEEtTVNEVSBzaXplCi0JVVNIT1JUCXJzdjo1Oworc3RydWN0IFBBQ0tFRCBydF9hZGRfaHRpbmZvMiB7CisJdTE2IE9wZXJhaW9uTW9kZToyOworCXUxNiBOb25HZlByZXNlbnQ6MTsKKwl1MTYgcnN2OjE7CisJdTE2IE9CU1NfTm9uSFRFeGlzdDoxOworCXUxNiByc3YyOjExOworfTsKIAotCS8vU3Vic3RyYWN0IGZyb20gQWRkaW9udCBIVCBJTkZPIElFCi0JVUNIQVIJTWF4UkFtcGR1RmFjdG9yOjI7Ci0JVUNIQVIJTXBkdURlbnNpdHk6MzsKLQlVQ0hBUglFeHRDaGFuT2Zmc2V0OjI7CS8vIFBsZWFzZSBub3QgdGhlIGRpZmZlcmVuY2Ugd2l0aCBmb2xsb3dpbmcgCVVDSEFSCU5ld0V4dENoYW5uZWxPZmZzZXQ7IGZyb20gODAyLjExbgotCVVDSEFSCVJlY29tV2lkdGg6MTsKLQotCVVTSE9SVAlPcGVyYWlvbk1vZGU6MjsKLQlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7Ci0JVVNIT1JUCXJzdjM6MTsKLQlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7Ci0JVVNIT1JUCXJzdjI6MTE7Ci0KLQkvLyBOZXcgRXh0ZW5zaW9uIENoYW5uZWwgT2Zmc2V0IElFCi0JVUNIQVIJTmV3RXh0Q2hhbm5lbE9mZnNldDsKLQkvLyBFeHRlbnNpb24gQ2FwYWJpbGl0eSBJRSA9IDEyNwotCVVDSEFSCUJTU0NvZXhpc3QyMDQwOwotfSBSVF9IVF9DQVBBQklMSVRZLCAqUFJUX0hUX0NBUEFCSUxJVFk7Ci0KLS8vICAgZmllbGQgaW4gQWRkdGlvbmFsIEhUIEluZm9ybWF0aW9uIElFIC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0JVUNIQVIJRXh0Q2hhbk9mZnNldDoyOwotCVVDSEFSCVJlY29tV2lkdGg6MTsKLQlVQ0hBUglSaWZzTW9kZToxOwotCVVDSEFSCVNfUFNNUFN1cDoxOwkgLy9JbmRpY2F0ZSBzdXBwb3J0IGZvciBzY2hlZHVsZWQgUFNNUAotCVVDSEFSCVNlckludGVyR3JhbnU6MzsJIC8vc2VydmljZSBpbnRlcnZhbCBncmFudWxhcml0eQotfSBBRERfSFRJTkZPLCAqUEFERF9IVElORk87Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRHsKLQlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7Ci0JVVNIT1JUCU5vbkdmUHJlc2VudDoxOwotCVVTSE9SVAlyc3Y6MTsKLQlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7Ci0JVVNIT1JUCXJzdjI6MTE7Ci19IEFERF9IVElORk8yLCAqUEFERF9IVElORk8yOwotCi0KLS8vIFRPRE86IE5lZWQgc3luYyB3aXRoIHNwZWMgYWJvdXQgdGhlIGRlZmluaXRpb24gb2YgU3RiY01jcy4gSW4gRHJhZnQgMy4wMywgaXQncyByZXNlcnZlZC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRHsKLQlVU0hPUlQJU3RiY01jczo2OwotCVVTSE9SVAlEdWFsQmVhY29uOjE7Ci0JVVNIT1JUCUR1YWxDVFNQcm90ZWN0OjE7Ci0JVVNIT1JUCVNUQkNCZWFjb246MTsKLQlVU0hPUlQJTHNpZ1R4b3BQcm90OjE7CS8vIEwtU0lHIFRYT1AgcHJvdGVjdGlvbiBmdWxsIHN1cHBvcnQKLQlVU0hPUlQJUGNvQWN0aXZlOjE7Ci0JVVNIT1JUCVBjb1BoYXNlOjE7Ci0JVVNIT1JUCXJzdjo0OwotfSBBRERfSFRJTkZPMywgKlBBRERfSFRJTkZPMzsKKy8qIFRPRE86IE5lZWQgc3luYyB3aXRoIHNwZWMgYWJvdXQgdGhlIGRlZmluaXRpb24gb2YgU3RiY01jcy4gSW4gRHJhZnQgMy4wMywgaXQncyByZXNlcnZlZC4gKi8KK3N0cnVjdCBQQUNLRUQgcnRfYWRkX2h0aW5mbzMgeworCXUxNiBTdGJjTWNzOjY7CisJdTE2IER1YWxCZWFjb246MTsKKwl1MTYgRHVhbENUU1Byb3RlY3Q6MTsKKwl1MTYgU1RCQ0JlYWNvbjoxOworCXUxNiBMc2lnVHhvcFByb3Q6MTsJLyogTC1TSUcgVFhPUCBwcm90ZWN0aW9uIGZ1bGwgc3VwcG9ydCAqLworCXUxNiBQY29BY3RpdmU6MTsKKwl1MTYgUGNvUGhhc2U6MTsKKwl1MTYgcnN2OjQ7Cit9OwogCiAjZGVmaW5lIFNJWkVfQUREX0hUX0lORk9fSUUJCTIyCi10eXBlZGVmIHN0cnVjdCAgUEFDS0VEewotCVVDSEFSCQkJCUNvbnRyb2xDaGFuOwotCUFERF9IVElORk8JCQlBZGRIdEluZm87Ci0JQUREX0hUSU5GTzIJCQlBZGRIdEluZm8yOwotCUFERF9IVElORk8zCQkJQWRkSHRJbmZvMzsKLQlVQ0hBUgkJCQlNQ1NTZXRbMTZdOwkJLy8gQmFzaWMgTUNTIHNldAotfSBBRERfSFRfSU5GT19JRSwgKlBBRERfSFRfSU5GT19JRTsKK3N0cnVjdCBQQUNLRUQgcnRfYWRkX2h0X2luZm9faWUgeworCXU4IENvbnRyb2xDaGFuOworCXN0cnVjdCBydF9hZGRfaHRpbmZvIEFkZEh0SW5mbzsKKwlzdHJ1Y3QgcnRfYWRkX2h0aW5mbzIgQWRkSHRJbmZvMjsKKwlzdHJ1Y3QgcnRfYWRkX2h0aW5mbzMgQWRkSHRJbmZvMzsKKwl1OCBNQ1NTZXRbMTZdOwkvKiBCYXNpYyBNQ1Mgc2V0ICovCit9OwogCi10eXBlZGVmIHN0cnVjdCAgUEFDS0VEewotCVVDSEFSCQkJCU5ld0V4dENoYW5PZmZzZXQ7Ci19IE5FV19FWFRfQ0hBTl9JRSwgKlBORVdfRVhUX0NIQU5fSUU7CitzdHJ1Y3QgUEFDS0VEIHJ0X25ld19leHRfY2hhbl9pZSB7CisJdTggTmV3RXh0Q2hhbk9mZnNldDsKK307CiAKK3N0cnVjdCBQQUNLRUQgcnRfZnJhbWVfODAyXzExIHsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBIZHI7CisJdTggT2N0ZXRbMV07Cit9OwogCi0vLyA0LWJ5dGUgSFRDIGZpZWxkLiAgbWF5YmUgaW5jbHVkZWQgaW4gYW55IGZyYW1lIGV4Y2VwdCBub24tUU9TIGRhdGEgZnJhbWUuICBUaGUgT3JkZXIgYml0IG11c3Qgc2V0IDEuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotICAgIFVJTlQzMgkJTUE6MTsJLy9tYW5hZ2VtZW50IGFjdGlvbiBwYXlsb2FkIGV4aXN0IGluIChRb1MgTnVsbCtIVEMpCi0gICAgVUlOVDMyCQlUUlE6MTsJLy9zb3VuZGluZyByZXF1ZXN0Ci0gICAgVUlOVDMyCQlNUlE6MTsJLy9NQ1MgZmVlZGJhY2suIFJlcXVlc3QgZm9yIGEgTUNTIGZlZWRiYWNrCi0gICAgVUlOVDMyCQlNUlNvckFTSTozOwkvLyBNUlEgU2VxdWVuY2UgaWRlbnRpZmllci4gdW5jaGFuZ2VkIGR1cmluZyBlbnRpcmUgcHJvY2VkdXJlLiAweDAwMC0weDExMC4KLSAgICBVSU5UMzIJCU1GUzozOwkvL1NFVCB0byB0aGUgcmVjZWl2ZWQgdmFsdWUgb2YgTVJTLiAweDExMSBmb3IgdW5zb2xpY2l0ZWQgTUZCLgotICAgIFVJTlQzMgkJTUZCb3JBU0M6NzsJLy9MaW5rIGFkYXB0YXRpb24gZmVlZGJhY2sgY29udGFpbmluZyByZWNvbW1lbmRlZCBNQ1MuIDB4N2YgZm9yIG5vIGZlZWRiYWNrIG9yIG5vdCBhdmFpbGFibGUKLSAgICBVSU5UMzIJCUNhbFBvczoyOwkvLyBjYWxpYnJhdGlvbiBwb3NpdGlvbgotICAgIFVJTlQzMgkJQ2FsU2VxOjI7ICAvL2NhbGlicmF0aW9uIHNlcXVlbmNlCi0gICAgVUlOVDMyCQlGQktSZXE6MjsJLy9mZWVkYmFjayByZXF1ZXN0Ci0gICAgVUlOVDMyCQlDU0lTVEVFUklORzoyOwkvL0NTSS8gU1RFRVJJTkcKLSAgICBVSU5UMzIJCVpMRkFubm91Y2U6MTsJLy8gWkxGIGFubm91bmNlbWVudAotICAgIFVJTlQzMgkJcnN2OjU7ICAvL2NhbGlicmF0aW9uIHNlcXVlbmNlCi0gICAgVUlOVDMyCQlBQ0NvbnN0cmFpbnQ6MTsJLy9mZWVkYmFjayByZXF1ZXN0Ci0gICAgVUlOVDMyCQlSREc6MTsJLy9SREcgLyBNb3JlIFBQRFUKLX0gSFRfQ09OVFJPTCwgKlBIVF9DT05UUk9MOworLyogUW9TTnVsbCBlbWJlZGRpbmcgb2YgbWFuYWdlbWVudCBhY3Rpb24uIFdoZW4gSFQgQ29udHJvbCBNQSBmaWVsZCBzZXQgdG8gMS4gKi8KK3N0cnVjdCBQQUNLRUQgcnRfbWFfYm9keSB7CisJdTggQ2F0ZWdvcnk7CisJdTggQWN0aW9uOworCXU4IE9jdGV0WzFdOworfTsKIAotLy8gMi1ieXRlIFFPUyBDT05UUk9MIGZpZWxkCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotICAgIFVTSE9SVCAgICAgIFRJRDo0OwotICAgIFVTSE9SVCAgICAgIEVPU1A6MTsKLSAgICBVU0hPUlQgICAgICBBY2tQb2xpY3k6MjsgIC8vMDogbm9ybWFsIEFDSyAxOk5vIEFDSyAyOnNjaGVkdWxlZCB1bmRlciBNVEJBL1BTTVAgIDM6IEJBCi0gICAgVVNIT1JUICAgICAgQU1zZHVQcmVzZW50OjE7Ci0gICAgVVNIT1JUICAgICAgVHhvcF9RdWV1ZVNpemU6ODsKLX0gUU9TX0NPTlRST0wsICpQUU9TX0NPTlRST0w7CitzdHJ1Y3QgUEFDS0VEIHJ0X2hlYWRlcl84MDJfMyB7CisJdTggREFBZGRyMVtNQUNfQUREUl9MRU5dOworCXU4IFNBQWRkcjJbTUFDX0FERFJfTEVOXTsKKwl1OCBPY3RldFsyXTsKK307CisvKi8vQmxvY2sgQUNLIHJlbGF0ZWQgZm9ybWF0ICovCisvKiAyLWJ5dGUgQkEgUGFyYW1ldGVyICBmaWVsZCAgaW4gICAgICAgREVMQkEgZnJhbWVzIHRvIHRlcm1pbmF0ZSBhbiBhbHJlYWR5IHNldCB1cCBiQSAqLworc3RydWN0IFBBQ0tFRCBydF9kZWxiYV9wYXJtIHsKKwl1MTYgUnN2OjExOwkJLyogYWx3YXlzIHNldCB0byAwICovCisJdTE2IEluaXRpYXRvcjoxOwkvKiAxOiBvcmlnaW5hdG9yICAgIDA6cmVjaXBpZW50ICovCisJdTE2IFRJRDo0OwkJLyogdmFsdWUgb2YgVEMgb3MgVFMgKi8KK307CiAKLS8vIDItYnl0ZSBGcmFtZSBjb250cm9sIGZpZWxkCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgewotCVVTSE9SVAkJVmVyOjI7CQkJCS8vIFByb3RvY29sIHZlcnNpb24KLQlVU0hPUlQJCVR5cGU6MjsJCQkJLy8gTVNEVSB0eXBlCi0JVVNIT1JUCQlTdWJUeXBlOjQ7CQkJLy8gTVNEVSBzdWJ0eXBlCi0JVVNIT1JUCQlUb0RzOjE7CQkJCS8vIFRvIERTIGluZGljYXRpb24KLQlVU0hPUlQJCUZyRHM6MTsJCQkJLy8gRnJvbSBEUyBpbmRpY2F0aW9uCi0JVVNIT1JUCQlNb3JlRnJhZzoxOwkJCS8vIE1vcmUgZnJhZ21lbnQgYml0Ci0JVVNIT1JUCQlSZXRyeToxOwkJCS8vIFJldHJ5IHN0YXR1cyBiaXQKLQlVU0hPUlQJCVB3ck1nbXQ6MTsJCQkvLyBQb3dlciBtYW5hZ2VtZW50IGJpdAotCVVTSE9SVAkJTW9yZURhdGE6MTsJCQkvLyBNb3JlIGRhdGEgYml0Ci0JVVNIT1JUCQlXZXA6MTsJCQkJLy8gV2VwIGRhdGEKLQlVU0hPUlQJCU9yZGVyOjE7CQkJLy8gU3RyaWN0IG9yZGVyIGV4cGVjdGVkCi19IEZSQU1FX0NPTlRST0wsICpQRlJBTUVfQ09OVFJPTDsKKy8qIDItYnl0ZSBCQSBQYXJhbWV0ZXIgU2V0IGZpZWxkICBpbiBBRERCQSBmcmFtZXMgdG8gc2lnbmFsIHBhcm0gZm9yIHNldHRpbmcgdXAgYSBCQSAqLworc3RydWN0IFBBQ0tFRCBydF9iYV9wYXJtIHsKKwl1MTYgQU1TRFVTdXBwb3J0ZWQ6MTsJLyogMDogbm90IHBlcm1pdHRlZCAgICAgICAgICAgICAxOiBwZXJtaXR0ZWQgKi8KKwl1MTYgQkFQb2xpY3k6MTsJLyogMTogaW1tZWRpYXRlbHkgQkEgICAgMDpkZWxheWVkIEJBICovCisJdTE2IFRJRDo0OwkJLyogdmFsdWUgb2YgVEMgb3MgVFMgKi8KKwl1MTYgQnVmU2l6ZToxMDsJLyogbnVtYmVyIG9mIGJ1ZmZlIG9mIHNpemUgMjMwNCBvY3RldHNyICovCit9OwogCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX0hFQURFUl84MDJfMTEJewotICAgIEZSQU1FX0NPTlRST0wgICBGQzsKLSAgICBVU0hPUlQgICAgICAgICAgRHVyYXRpb247Ci0gICAgVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07Ci0gICAgVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIJCQlBZGRyM1tNQUNfQUREUl9MRU5dOwotCVVTSE9SVAkJCUZyYWc6NDsKLQlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKLQlVQ0hBUgkJCU9jdGV0WzBdOwotfQlIRUFERVJfODAyXzExLCAqUEhFQURFUl84MDJfMTE7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfODAyXzExIHsKLSAgICBIRUFERVJfODAyXzExICAgSGRyOwotICAgIFVDSEFSICAgICAgICAgICAgT2N0ZXRbMV07Ci19ICAgRlJBTUVfODAyXzExLCAqUEZSQU1FXzgwMl8xMTsKLQotLy8gUW9TTnVsbCBlbWJlZGRpbmcgb2YgbWFuYWdlbWVudCBhY3Rpb24uIFdoZW4gSFQgQ29udHJvbCBNQSBmaWVsZCBzZXQgdG8gMS4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUFfQk9EWSB7Ci0gICAgVUNIQVIgICAgICAgICAgICBDYXRlZ29yeTsKLSAgICBVQ0hBUiAgICAgICAgICAgIEFjdGlvbjsKLSAgICBVQ0hBUiAgICAgICAgICAgIE9jdGV0WzFdOwotfSAgIE1BX0JPRFksICpQTUFfQk9EWTsKLQotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9IRUFERVJfODAyXzMJewotICAgIFVDSEFSICAgICAgICAgICBEQUFkZHIxW01BQ19BRERSX0xFTl07Ci0gICAgVUNIQVIgICAgICAgICAgIFNBQWRkcjJbTUFDX0FERFJfTEVOXTsKLSAgICBVQ0hBUiAgICAgICAgICAgT2N0ZXRbMl07Ci19CUhFQURFUl84MDJfMywgKlBIRUFERVJfODAyXzM7Ci0vLy8vQmxvY2sgQUNLIHJlbGF0ZWQgZm9ybWF0Ci0vLyAyLWJ5dGUgQkEgUGFyYW1ldGVyICBmaWVsZCAgaW4gCURFTEJBIGZyYW1lcyB0byB0ZXJtaW5hdGUgYW4gYWxyZWFkeSBzZXQgdXAgYkEKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRHsKLSAgICBVU0hPUlQgICAgICBSc3Y6MTE7CS8vIGFsd2F5cyBzZXQgdG8gMAotICAgIFVTSE9SVCAgICAgIEluaXRpYXRvcjoxOwkvLyAxOiBvcmlnaW5hdG9yICAgIDA6cmVjaXBpZW50Ci0gICAgVVNIT1JUICAgICAgVElEOjQ7CS8vIHZhbHVlIG9mIFRDIG9zIFRTCi19IERFTEJBX1BBUk0sICpQREVMQkFfUEFSTTsKLQotLy8gMi1ieXRlIEJBIFBhcmFtZXRlciBTZXQgZmllbGQgIGluIEFEREJBIGZyYW1lcyB0byBzaWduYWwgcGFybSBmb3Igc2V0dGluZyB1cCBhIEJBCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotICAgIFVTSE9SVCAgICAgIEFNU0RVU3VwcG9ydGVkOjE7CS8vIDA6IG5vdCBwZXJtaXR0ZWQJCTE6IHBlcm1pdHRlZAotICAgIFVTSE9SVCAgICAgIEJBUG9saWN5OjE7CS8vIDE6IGltbWVkaWF0ZWx5IEJBICAgIDA6ZGVsYXllZCBCQQotICAgIFVTSE9SVCAgICAgIFRJRDo0OwkvLyB2YWx1ZSBvZiBUQyBvcyBUUwotICAgIFVTSE9SVCAgICAgIEJ1ZlNpemU6MTA7CS8vIG51bWJlciBvZiBidWZmZSBvZiBzaXplIDIzMDQgb2N0ZXRzcgotfSBCQV9QQVJNLCAqUEJBX1BBUk07Ci0KLS8vIDItYnl0ZSBCQSBTdGFydGluZyBTZXEgQ09OVFJPTCBmaWVsZAotdHlwZWRlZiB1bmlvbiBQQUNLRUQgewotICAgIHN0cnVjdCBQQUNLRUQgewotICAgIFVTSE9SVCAgICAgIEZyYWdOdW06NDsJLy8gYWx3YXlzIHNldCB0byAwCi0JVVNIT1JUICAgICAgU3RhcnRTZXE6MTI7ICAgLy8gc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSAxc3QgTVNEVSBmb3Igd2hpY2ggdGhpcyBCQVIgaXMgc2VudAotICAgIH0gICBmaWVsZDsKLSAgICBVU0hPUlQgICAgICAgICAgIHdvcmQ7CisvKiAyLWJ5dGUgQkEgU3RhcnRpbmcgU2VxIENPTlRST0wgZmllbGQgKi8KK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9CQVNFUV9DT05UUk9MIHsKKwlzdHJ1Y3QgUEFDS0VEIHsKKwkJdTE2IEZyYWdOdW06NDsJLyogYWx3YXlzIHNldCB0byAwICovCisJCXUxNiBTdGFydFNlcToxMjsJLyogc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSAxc3QgTVNEVSBmb3Igd2hpY2ggdGhpcyBCQVIgaXMgc2VudCAqLworCX0gZmllbGQ7CisJdTE2IHdvcmQ7CiB9IEJBU0VRX0NPTlRST0wsICpQQkFTRVFfQ09OVFJPTDsKIAotLy9CQUNvbnRyb2wgYW5kIEJBUkNvbnRyb2wgYXJlIHRoZSBzYW1lCi0vLyAyLWJ5dGUgQkEgQ09OVFJPTCBmaWVsZCBpbiBCQSBmcmFtZQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLSAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsgLy8gb25seSByZWxhdGVkIHRvIE4tRGVsYXllZCBCQS4gQnV0IG5vdCBzdXBwb3J0IGluIFJUMjg2MGIuIDA6Tm9ybWFsQUNLICAxOk5vIEFDSwotICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vRVdDIFYxLjI0Ci0gICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOwotICAgIFVTSE9SVCAgICAgIFJzdjo5OwotICAgIFVTSE9SVCAgICAgIFRJRDo0OwotfSBCQV9DT05UUk9MLCAqUEJBX0NPTlRST0w7CisvKkJBQ29udHJvbCBhbmQgQkFSQ29udHJvbCBhcmUgdGhlIHNhbWUgKi8KKy8qIDItYnl0ZSBCQSBDT05UUk9MIGZpZWxkIGluIEJBIGZyYW1lICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2JhX2NvbnRyb2wgeworCXUxNiBBQ0tQb2xpY3k6MTsJLyogb25seSByZWxhdGVkIHRvIE4tRGVsYXllZCBCQS4gQnV0IG5vdCBzdXBwb3J0IGluIFJUMjg2MGIuIDA6Tm9ybWFsQUNLICAxOk5vIEFDSyAqLworCXUxNiBNVElEOjE7CQkvKkVXQyBWMS4yNCAqLworCXUxNiBDb21wcmVzc2VkOjE7CisJdTE2IFJzdjo5OworCXUxNiBUSUQ6NDsKK307CiAKLS8vIDItYnl0ZSBCQVIgQ09OVFJPTCBmaWVsZCBpbiBCQVIgZnJhbWUKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0gICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7IC8vIDA6bm9ybWFsIGFjaywgIDE6bm8gYWNrLgotICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vaWYgdGhpcyBiaXQxLCB1c2UgIEZSQU1FX01UQkFfUkVRLCAgaWYgMCwgdXNlIEZSQU1FX0JBX1JFUQotICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKLSAgICBVU0hPUlQgICAgICBSc3YxOjk7Ci0gICAgVVNIT1JUICAgICAgVElEOjQ7Ci19IEJBUl9DT05UUk9MLCAqUEJBUl9DT05UUk9MOworLyogMi1ieXRlIEJBUiBDT05UUk9MIGZpZWxkIGluIEJBUiBmcmFtZSAqLworc3RydWN0IFBBQ0tFRCBydF9iYXJfY29udHJvbCB7CisJdTE2IEFDS1BvbGljeToxOwkvKiAwOm5vcm1hbCBhY2ssICAxOm5vIGFjay4gKi8KKwl1MTYgTVRJRDoxOwkJLyppZiB0aGlzIGJpdDEsIHVzZSAgc3RydWN0IHJ0X2ZyYW1lX210YmFfcmVxLCAgaWYgMCwgdXNlIHN0cnVjdCBydF9mcmFtZV9iYV9yZXEgKi8KKwl1MTYgQ29tcHJlc3NlZDoxOworCXUxNiBSc3YxOjk7CisJdTE2IFRJRDo0OworfTsKIAotLy8gQkFSQ29udHJvbCBpbiBNVEJBUiBmcmFtZQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLSAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsKLSAgICBVU0hPUlQgICAgICBNVElEOjE7Ci0gICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOwotICAgIFVTSE9SVCAgICAgIFJzdjE6OTsKLSAgICBVU0hPUlQgICAgICBOdW1USUQ6NDsKLX0gTVRCQVJfQ09OVFJPTCwgKlBNVEJBUl9DT05UUk9MOworLyogQkFSQ29udHJvbCBpbiBNVEJBUiBmcmFtZSAqLworc3RydWN0IFBBQ0tFRCBydF9tdGJhcl9jb250cm9sIHsKKwl1MTYgQUNLUG9saWN5OjE7CisJdTE2IE1USUQ6MTsKKwl1MTYgQ29tcHJlc3NlZDoxOworCXUxNiBSc3YxOjk7CisJdTE2IE51bVRJRDo0OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLSAgICBVU0hPUlQgICAgICBSc3YxOjEyOwotICAgIFVTSE9SVCAgICAgIFRJRDo0OwotfSBQRVJfVElEX0lORk8sICpQUEVSX1RJRF9JTkZPOworc3RydWN0IFBBQ0tFRCBydF9wZXJfdGlkX2luZm8geworCXUxNiBSc3YxOjEyOworCXUxNiBUSUQ6NDsKK307CiAKLXR5cGVkZWYgc3RydWN0IHsKLQlQRVJfVElEX0lORk8gICAgICBQZXJUSUQ7Ci0JQkFTRVFfQ09OVFJPTCAJIEJBU3RhcnRpbmdTZXE7Ci19IEVBQ0hfVElELCAqUEVBQ0hfVElEOworc3RydWN0IHJ0X2VhY2hfdGlkIHsKKwlzdHJ1Y3QgcnRfcGVyX3RpZF9pbmZvIFBlclRJRDsKKwlCQVNFUV9DT05UUk9MIEJBU3RhcnRpbmdTZXE7Cit9OwogCisvKiBCQVJFUSBBTkQgTVRCQVJFUSBoYXZlIHRoZSBzYW1lIHN1YnR5cGUgQkFSLCA4MDIuMTFuIEJBUiB1c2UgY29tcHJlc3NlZCBiaXRtYXAuICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX2JhX3JlcSB7CisJc3RydWN0IHJ0X2ZyYW1lX2NvbnRyb2wgRkM7CisJdTE2IER1cmF0aW9uOworCXU4IEFkZHIxW01BQ19BRERSX0xFTl07CisJdTggQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlzdHJ1Y3QgcnRfYmFyX2NvbnRyb2wgQkFSQ29udHJvbDsKKwlCQVNFUV9DT05UUk9MIEJBU3RhcnRpbmdTZXE7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1BTUE9MTF9GUkFNRSB7Ci0gICAgRlJBTUVfQ09OVFJPTCAgIEZDOwotICAgIFVTSE9SVCAgICAgICAgICBBaWQ7Ci0gICAgVUNIQVIgICAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07Ci0gICAgVUNIQVIgICAgICAgICAgIFRhW01BQ19BRERSX0xFTl07Ci19ICAgUFNQT0xMX0ZSQU1FLCAqUFBTUE9MTF9GUkFNRTsKK3N0cnVjdCBQQUNLRUQgcnRfZnJhbWVfbXRiYV9yZXEgeworCXN0cnVjdCBydF9mcmFtZV9jb250cm9sIEZDOworCXUxNiBEdXJhdGlvbjsKKwl1OCBBZGRyMVtNQUNfQUREUl9MRU5dOworCXU4IEFkZHIyW01BQ19BRERSX0xFTl07CisJc3RydWN0IHJ0X210YmFyX2NvbnRyb2wgTVRCQVJDb250cm9sOworCXN0cnVjdCBydF9wZXJfdGlkX2luZm8gUGVyVElESW5mbzsKKwlCQVNFUV9DT05UUk9MIEJBU3RhcnRpbmdTZXE7Cit9OwogCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JUU19GUkFNRQl7Ci0gICAgRlJBTUVfQ09OVFJPTCAgIEZDOwotICAgIFVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKLSAgICBVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKLSAgICBVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLX1SVFNfRlJBTUUsICpQUlRTX0ZSQU1FOworLyogQ29tcHJlc3NlZCBmb3JtYXQgaXMgbWFuZGFudG9yeSBpbiBIVCBTVEEgKi8KK3N0cnVjdCBQQUNLRUQgcnRfZnJhbWVfbXRiYSB7CisJc3RydWN0IHJ0X2ZyYW1lX2NvbnRyb2wgRkM7CisJdTE2IER1cmF0aW9uOworCXU4IEFkZHIxW01BQ19BRERSX0xFTl07CisJdTggQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlzdHJ1Y3QgcnRfYmFfY29udHJvbCBCQUNvbnRyb2w7CisJQkFTRVFfQ09OVFJPTCBCQVN0YXJ0aW5nU2VxOworCXU4IEJpdE1hcFs4XTsKK307CiAKLS8vIEJBUkVRIEFORCBNVEJBUkVRIGhhdmUgdGhlIHNhbWUgc3VidHlwZSBCQVIsIDgwMi4xMW4gQkFSIHVzZSBjb21wcmVzc2VkIGJpdG1hcC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQkFfUkVRIHsKLQlGUkFNRV9DT05UUk9MICAgRkM7Ci0JVVNIT1JUICAgICAgICAgIER1cmF0aW9uOwotCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCUJBUl9DT05UUk9MICBCQVJDb250cm9sOwotCUJBU0VRX0NPTlRST0wgCSBCQVN0YXJ0aW5nU2VxOwotfSAgIEZSQU1FX0JBX1JFUSwgKlBGUkFNRV9CQV9SRVE7CitzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX3BzbXBfYWN0aW9uIHsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBIZHI7CisJdTggQ2F0ZWdvcnk7CisJdTggQWN0aW9uOworCXU4IFBzbXA7CQkvKiA3LjMuMS4yNSAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9NVEJBX1JFUSB7Ci0JRlJBTUVfQ09OVFJPTCAgIEZDOwotCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlNVEJBUl9DT05UUk9MICBNVEJBUkNvbnRyb2w7Ci0JUEVSX1RJRF9JTkZPCVBlclRJREluZm87Ci0JQkFTRVFfQ09OVFJPTCAJIEJBU3RhcnRpbmdTZXE7Ci19ICAgRlJBTUVfTVRCQV9SRVEsICpQRlJBTUVfTVRCQV9SRVE7CitzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX2FjdGlvbl9oZHIgeworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIEhkcjsKKwl1OCBDYXRlZ29yeTsKKwl1OCBBY3Rpb247Cit9OwogCi0vLyBDb21wcmVzc2VkIGZvcm1hdCBpcyBtYW5kYW50b3J5IGluIEhUIFNUQQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9NVEJBIHsKLQlGUkFNRV9DT05UUk9MICAgRkM7Ci0JVVNIT1JUICAgICAgICAgIER1cmF0aW9uOwotCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCUJBX0NPTlRST0wgIEJBQ29udHJvbDsKLQlCQVNFUV9DT05UUk9MIAkgQkFTdGFydGluZ1NlcTsKLQlVQ0hBUgkJQml0TWFwWzhdOwotfSAgIEZSQU1FX01UQkEsICpQRlJBTUVfTVRCQTsKKy8qQWN0aW9uIEZyYW1lICovCisvKkFjdGlvbiBGcmFtZSAgQ2F0ZWdvcnk6U3BlY3RydW0sICBBY3Rpb246Q2hhbm5lbCBTd2l0Y2guIDcuMy4yLjIwICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2NoYW5fc3dpdGNoX2Fubm91bmNlIHsKKwl1OCBFbGVtZW50SUQ7CS8qIElEID0gSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UID0gMzcgKi8KKwl1OCBMZW47CisJc3RydWN0IHJ0X2NoYV9zd2l0Y2hfYW5ub3VuY2VfaWUgQ1NBbm5vdW5jZUllOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9QU01QX0FDVElPTiB7Ci0JSEVBREVSXzgwMl8xMSAgIEhkcjsKLQlVQ0hBUglDYXRlZ29yeTsKLQlVQ0hBUglBY3Rpb247Ci0JVUNIQVIJUHNtcDsJLy8gNy4zLjEuMjUKLX0gICBGUkFNRV9QU01QX0FDVElPTiwgKlBGUkFNRV9QU01QX0FDVElPTjsKKy8qODAyLjExbiA6IDcuMy4yLjIwYSAqLworc3RydWN0IFBBQ0tFRCBydF9zZWNvbmRfY2hhbl9vZmZzZXQgeworCXU4IEVsZW1lbnRJRDsJLyogSUQgPSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUID0gNjIgKi8KKwl1OCBMZW47CisJc3RydWN0IHJ0X3NlY19jaGFfb2Zmc2V0X2llIFNlY0NoT2Zmc2V0SWU7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0FDVElPTl9IRFIgewotCUhFQURFUl84MDJfMTEgICBIZHI7Ci0JVUNIQVIJQ2F0ZWdvcnk7Ci0JVUNIQVIJQWN0aW9uOwotfSAgIEZSQU1FX0FDVElPTl9IRFIsICpQRlJBTUVfQUNUSU9OX0hEUjsKK3N0cnVjdCBQQUNLRUQgcnRfZnJhbWVfc3BldHJ1bV9jcyB7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgSGRyOworCXU4IENhdGVnb3J5OworCXU4IEFjdGlvbjsKKwlzdHJ1Y3QgcnRfY2hhbl9zd2l0Y2hfYW5ub3VuY2UgQ1NBbm5vdW5jZTsKKwlzdHJ1Y3QgcnRfc2Vjb25kX2NoYW5fb2Zmc2V0IFNlY29uZENoYW5uZWw7Cit9OwogCi0vL0FjdGlvbiBGcmFtZQotLy9BY3Rpb24gRnJhbWUgIENhdGVnb3J5OlNwZWN0cnVtLCAgQWN0aW9uOkNoYW5uZWwgU3dpdGNoLiA3LjMuMi4yMAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSEFOX1NXSVRDSF9BTk5PVU5DRSB7Ci0JVUNIQVIJCQkJCUVsZW1lbnRJRDsJLy8gSUQgPSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQgPSAzNwotCVVDSEFSCQkJCQlMZW47Ci0JQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRQlDU0Fubm91bmNlSWU7Ci19ICAgQ0hBTl9TV0lUQ0hfQU5OT1VOQ0UsICpQQ0hBTl9TV0lUQ0hfQU5OT1VOQ0U7CitzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX2FkZGJhX3JlcSB7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgSGRyOworCXU4IENhdGVnb3J5OworCXU4IEFjdGlvbjsKKwl1OCBUb2tlbjsJCS8qIDEgKi8KKwlzdHJ1Y3QgcnRfYmFfcGFybSBCYVBhcm07CQkvKiAgMiAtIDEwICovCisJdTE2IFRpbWVPdXRWYWx1ZTsJLyogMCAtIDAgKi8KKwlCQVNFUV9DT05UUk9MIEJhU3RhcnRTZXE7CS8qIDAtMCAqLworfTsKIAorc3RydWN0IFBBQ0tFRCBydF9mcmFtZV9hZGRiYV9yc3AgeworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIEhkcjsKKwl1OCBDYXRlZ29yeTsKKwl1OCBBY3Rpb247CisJdTggVG9rZW47CisJdTE2IFN0YXR1c0NvZGU7CisJc3RydWN0IHJ0X2JhX3Bhcm0gQmFQYXJtOwkJLyowIC0gMiAqLworCXUxNiBUaW1lT3V0VmFsdWU7Cit9OwogCi0vLzgwMi4xMW4gOiA3LjMuMi4yMGEKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfU0VDT05EX0NIQU5fT0ZGU0VUIHsKLQlVQ0hBUgkJCQlFbGVtZW50SUQ7CQkvLyBJRCA9IElFX1NFQ09OREFSWV9DSF9PRkZTRVQgPSA2MgotCVVDSEFSCQkJCUxlbjsKLQlTRUNfQ0hBX09GRlNFVF9JRQlTZWNDaE9mZnNldEllOwotfSAgIFNFQ09ORF9DSEFOX09GRlNFVCwgKlBTRUNPTkRfQ0hBTl9PRkZTRVQ7CitzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX2RlbGJhX3JlcSB7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgSGRyOworCXU4IENhdGVnb3J5OworCXU4IEFjdGlvbjsKKwlzdHJ1Y3QgcnRfZGVsYmFfcGFybSBEZWxiYVBhcm07CisJdTE2IFJlYXNvbkNvZGU7Cit9OwogCisvKjcuMi4xLjcgKi8KK3N0cnVjdCBQQUNLRUQgcnRfZnJhbWVfYmFyIHsKKwlzdHJ1Y3QgcnRfZnJhbWVfY29udHJvbCBGQzsKKwl1MTYgRHVyYXRpb247CisJdTggQWRkcjFbTUFDX0FERFJfTEVOXTsKKwl1OCBBZGRyMltNQUNfQUREUl9MRU5dOworCXN0cnVjdCBydF9iYXJfY29udHJvbCBCYXJDb250cm9sOworCUJBU0VRX0NPTlRST0wgU3RhcnRpbmdTZXE7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX1NQRVRSVU1fQ1MgewotCUhFQURFUl84MDJfMTEgICBIZHI7Ci0JVUNIQVIJQ2F0ZWdvcnk7Ci0JVUNIQVIJQWN0aW9uOwotCUNIQU5fU1dJVENIX0FOTk9VTkNFCUNTQW5ub3VuY2U7Ci0JU0VDT05EX0NIQU5fT0ZGU0VUCQlTZWNvbmRDaGFubmVsOwotfSAgIEZSQU1FX1NQRVRSVU1fQ1MsICpQRlJBTUVfU1BFVFJVTV9DUzsKKy8qNy4yLjEuNyAqLworc3RydWN0IFBBQ0tFRCBydF9mcmFtZV9iYSB7CisJc3RydWN0IHJ0X2ZyYW1lX2NvbnRyb2wgRkM7CisJdTE2IER1cmF0aW9uOworCXU4IEFkZHIxW01BQ19BRERSX0xFTl07CisJdTggQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlzdHJ1Y3QgcnRfYmFyX2NvbnRyb2wgQmFyQ29udHJvbDsKKwlCQVNFUV9DT05UUk9MIFN0YXJ0aW5nU2VxOworCXU4IGJpdG1hc2tbOF07Cit9OwogCisvKiBSYWRpbyBNZWFzdWVtZW50IFJlcXVlc3QgRnJhbWUgRm9ybWF0ICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX3JtX3JlcV9hY3Rpb24geworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIEhkcjsKKwl1OCBDYXRlZ29yeTsKKwl1OCBBY3Rpb247CisJdTggVG9rZW47CisJdTE2IFJlcGV0aXRpb247CisJdTggZGF0YVswXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQUREQkFfUkVRIHsKLQlIRUFERVJfODAyXzExICAgSGRyOwotCVVDSEFSCUNhdGVnb3J5OwotCVVDSEFSCUFjdGlvbjsKLQlVQ0hBUglUb2tlbjsJLy8gMQotCUJBX1BBUk0JCUJhUGFybTsJICAgICAgLy8gIDIgLSAxMAotCVVTSE9SVAkJVGltZU91dFZhbHVlOwkvLyAwIC0gMAotCUJBU0VRX0NPTlRST0wJQmFTdGFydFNlcTsgLy8gMC0wCi19ICAgRlJBTUVfQUREQkFfUkVRLCAqUEZSQU1FX0FEREJBX1JFUTsKK3N0cnVjdCBQQUNLRUQgcnRfaHRfZXh0X2NoYW5uZWxfc3dpdGNoX2Fubm91bmNlbWVudF9pZSB7CisJdTggSUQ7CisJdTggTGVuZ3RoOworCXU4IENoYW5uZWxTd2l0Y2hNb2RlOworCXU4IE5ld1JlZ0NsYXNzOworCXU4IE5ld0NoYW5uZWxOdW07CisJdTggQ2hhbm5lbFN3aXRjaENvdW50OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9BRERCQV9SU1AgewotCUhFQURFUl84MDJfMTEgICBIZHI7Ci0JVUNIQVIJQ2F0ZWdvcnk7Ci0JVUNIQVIJQWN0aW9uOwotCVVDSEFSCVRva2VuOwotCVVTSE9SVAlTdGF0dXNDb2RlOwotCUJBX1BBUk0JCUJhUGFybTsgLy8wIC0gMgotCVVTSE9SVAkJVGltZU91dFZhbHVlOwotfSAgIEZSQU1FX0FEREJBX1JTUCwgKlBGUkFNRV9BRERCQV9SU1A7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfREVMQkFfUkVRIHsKLQlIRUFERVJfODAyXzExICAgSGRyOwotCVVDSEFSCUNhdGVnb3J5OwotCVVDSEFSCUFjdGlvbjsKLQlERUxCQV9QQVJNCQlEZWxiYVBhcm07Ci0JVVNIT1JUCVJlYXNvbkNvZGU7Ci19ICAgRlJBTUVfREVMQkFfUkVRLCAqUEZSQU1FX0RFTEJBX1JFUTsKLQotCi0vLzcuMi4xLjcKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQkFSIHsKLQlGUkFNRV9DT05UUk9MICAgRkM7Ci0JVVNIT1JUICAgICAgICAgIER1cmF0aW9uOwotCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCUJBUl9DT05UUk9MCQlCYXJDb250cm9sOwotCUJBU0VRX0NPTlRST0wJU3RhcnRpbmdTZXE7Ci19ICAgRlJBTUVfQkFSLCAqUEZSQU1FX0JBUjsKLQotLy83LjIuMS43Ci10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0JBIHsKLQlGUkFNRV9DT05UUk9MICAgRkM7Ci0JVVNIT1JUICAgICAgICAgIER1cmF0aW9uOwotCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCUJBUl9DT05UUk9MCQlCYXJDb250cm9sOwotCUJBU0VRX0NPTlRST0wJU3RhcnRpbmdTZXE7Ci0JVUNIQVIJCWJpdG1hc2tbOF07Ci19ICAgRlJBTUVfQkEsICpQRlJBTUVfQkE7Ci0KLQotLy8gUmFkaW8gTWVhc3VlbWVudCBSZXF1ZXN0IEZyYW1lIEZvcm1hdAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9STV9SRVFfQUNUSU9OIHsKLQlIRUFERVJfODAyXzExICAgSGRyOwotCVVDSEFSCUNhdGVnb3J5OwotCVVDSEFSCUFjdGlvbjsKLQlVQ0hBUglUb2tlbjsKLQlVU0hPUlQJUmVwZXRpdGlvbjsKLQlVQ0hBUiAgIGRhdGFbMF07Ci19ICAgRlJBTUVfUk1fUkVRX0FDVElPTiwgKlBGUkFNRV9STV9SRVFfQUNUSU9OOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotCVVDSEFSCQlJRDsKLQlVQ0hBUgkJTGVuZ3RoOwotCVVDSEFSCQlDaGFubmVsU3dpdGNoTW9kZTsKLQlVQ0hBUgkJTmV3UmVnQ2xhc3M7Ci0JVUNIQVIJCU5ld0NoYW5uZWxOdW07Ci0JVUNIQVIJCUNoYW5uZWxTd2l0Y2hDb3VudDsKLX0gSFRfRVhUX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVF9JRSwgKlBIVF9FWFRfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UX0lFOwotCi0KLS8vCi0vLyBfTGltaXQgbXVzdCBiZSB0aGUgMioqbiAtIDEKLS8vIF9TRVExICwgX1NFUTIgbXVzdCBiZSB3aXRoaW4gMCB+IF9MaW1pdAotLy8KKy8qICovCisvKiBfTGltaXQgbXVzdCBiZSB0aGUgMioqbiAtIDEgKi8KKy8qIF9TRVExICwgX1NFUTIgbXVzdCBiZSB3aXRoaW4gMCB+IF9MaW1pdCAqLworLyogKi8KICNkZWZpbmUgU0VRX1NURVBPTkUoX1NFUTEsIF9TRVEyLCBfTGltaXQpCSgoX1NFUTEgPT0gKChfU0VRMisxKSAmIF9MaW1pdCkpKQogI2RlZmluZSBTRVFfU01BTExFUihfU0VRMSwgX1NFUTIsIF9MaW1pdCkJKCgoX1NFUTEtX1NFUTIpICYgKChfTGltaXQrMSk+PjEpKSkKICNkZWZpbmUgU0VRX0xBUkdFUihfU0VRMSwgX1NFUTIsIF9MaW1pdCkJKChfU0VRMSAhPSBfU0VRMikgJiYgISgoKF9TRVExLV9TRVEyKSAmICgoX0xpbWl0KzEpPj4xKSkpKQogI2RlZmluZSBTRVFfV0lUSElOX1dJTihfU0VRMSwgX1NFUTIsIF9XSU4sIF9MaW1pdCkgKFNFUV9MQVJHRVIoX1NFUTEsIF9TRVEyLCBfTGltaXQpICYmICBcCiAJCQkJCQkJCQkJCQlTRVFfU01BTExFUihfU0VRMSwgKChfU0VRMitfV0lOKzEpJl9MaW1pdCksIF9MaW1pdCkpCiAKLS8vCi0vLyBDb250ZW50aW9uLWZyZWUgcGFyYW1ldGVyICh3aXRob3V0IElEIGFuZCBMZW5ndGgpCi0vLwotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLSAgICBCT09MRUFOICAgICBiVmFsaWQ7ICAgICAgICAgLy8gMTogdmFyaWFibGUgY29udGFpbnMgdmFsaWQgdmFsdWUKLSAgICBVQ0hBUiAgICAgICBDZnBDb3VudDsKLSAgICBVQ0hBUiAgICAgICBDZnBQZXJpb2Q7Ci0gICAgVVNIT1JUICAgICAgQ2ZwTWF4RHVyYXRpb247Ci0gICAgVVNIT1JUICAgICAgQ2ZwRHVyUmVtYWluaW5nOwotfSBDRl9QQVJNLCAqUENGX1BBUk07CisvKiAqLworLyogQ29udGVudGlvbi1mcmVlIHBhcmFtZXRlciAod2l0aG91dCBJRCBhbmQgTGVuZ3RoKSAqLworLyogKi8KK3N0cnVjdCBQQUNLRUQgcnRfY2ZfcGFybSB7CisJQk9PTEVBTiBiVmFsaWQ7CQkvKiAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZSAqLworCXU4IENmcENvdW50OworCXU4IENmcFBlcmlvZDsKKwl1MTYgQ2ZwTWF4RHVyYXRpb247CisJdTE2IENmcER1clJlbWFpbmluZzsKK307CiAKLXR5cGVkZWYJc3RydWN0CV9DSVBIRVJfU1VJVEUJewotCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCVBhaXJDaXBoZXI7CQkvLyBVbmljYXN0IGNpcGhlciAxLCB0aGlzIG9uZSBoYXMgbW9yZSBzZWN1cmVkIGNpcGhlciBzdWl0ZQotCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCVBhaXJDaXBoZXJBdXg7CS8vIFVuaWNhc3QgY2lwaGVyIDIgaWYgQVAgYW5ub3VuY2UgdHdvIHVuaWNhc3QgY2lwaGVyIHN1aXRlCi0JTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJR3JvdXBDaXBoZXI7CS8vIEdyb3VwIGNpcGhlcgotCVVTSE9SVAkJCQkJCQlSc25DYXBhYmlsaXR5OwkvLyBSU04gY2FwYWJpbGl0eSBmcm9tIGJlYWNvbgotCUJPT0xFQU4JCQkJCQkJYk1peE1vZGU7CQkvLyBJbmRpY2F0ZSBQYWlyICYgR3JvdXAgY2lwaGVyIG1pZ2h0IGJlIGRpZmZlcmVudAotfQlDSVBIRVJfU1VJVEUsICpQQ0lQSEVSX1NVSVRFOworc3RydWN0IHJ0X2NpcGhlcl9zdWl0ZSB7CisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgUGFpckNpcGhlcjsJLyogVW5pY2FzdCBjaXBoZXIgMSwgdGhpcyBvbmUgaGFzIG1vcmUgc2VjdXJlZCBjaXBoZXIgc3VpdGUgKi8KKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUyBQYWlyQ2lwaGVyQXV4OwkvKiBVbmljYXN0IGNpcGhlciAyIGlmIEFQIGFubm91bmNlIHR3byB1bmljYXN0IGNpcGhlciBzdWl0ZSAqLworCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTIEdyb3VwQ2lwaGVyOwkvKiBHcm91cCBjaXBoZXIgKi8KKwl1MTYgUnNuQ2FwYWJpbGl0eTsJLyogUlNOIGNhcGFiaWxpdHkgZnJvbSBiZWFjb24gKi8KKwlCT09MRUFOIGJNaXhNb2RlOwkvKiBJbmRpY2F0ZSBQYWlyICYgR3JvdXAgY2lwaGVyIG1pZ2h0IGJlIGRpZmZlcmVudCAqLworfTsKIAotLy8gRURDQSBjb25maWd1cmF0aW9uIGZyb20gQVAncyBCRUFDT04vUHJvYmVSc3AKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBCT09MRUFOICAgICBiVmFsaWQ7ICAgICAgICAgLy8gMTogdmFyaWFibGUgY29udGFpbnMgdmFsaWQgdmFsdWUKLSAgICBCT09MRUFOICAgICBiQWRkOyAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgQk9PTEVBTiAgICAgYlFBY2s7Ci0gICAgQk9PTEVBTiAgICAgYlF1ZXVlUmVxdWVzdDsKLSAgICBCT09MRUFOICAgICBiVHhvcFJlcXVlc3Q7Ci0gICAgQk9PTEVBTiAgICAgYkFQU0RDYXBhYmxlOwotLy8gIEJPT0xFQU4gICAgIGJNb3JlRGF0YUFjazsKLSAgICBVQ0hBUiAgICAgICBFZGNhVXBkYXRlQ291bnQ7Ci0gICAgVUNIQVIgICAgICAgQWlmc25bNF07ICAgICAgIC8vIDA6QUNfQkssIDE6QUNfQkUsIDI6QUNfVkksIDM6QUNfVk8KLSAgICBVQ0hBUiAgICAgICBDd21pbls0XTsKLSAgICBVQ0hBUiAgICAgICBDd21heFs0XTsKLSAgICBVU0hPUlQgICAgICBUeG9wWzRdOyAgICAgIC8vIGluIHVuaXQgb2YgMzItdXMKLSAgICBCT09MRUFOICAgICBiQUNNWzRdOyAgICAgIC8vIDE6IEFkbWlzc2lvbiBDb250cm9sIG9mIEFDX0JLIGlzIG1hbmRhdHRvcnkKLX0gRURDQV9QQVJNLCAqUEVEQ0FfUEFSTTsKKy8qIEVEQ0EgY29uZmlndXJhdGlvbiBmcm9tIEFQJ3MgQkVBQ09OL1Byb2JlUnNwICovCitzdHJ1Y3QgcnRfZWRjYV9wYXJtIHsKKwlCT09MRUFOIGJWYWxpZDsJCS8qIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlICovCisJQk9PTEVBTiBiQWRkOwkJLyogMTogdmFyaWFibGUgY29udGFpbnMgdmFsaWQgdmFsdWUgKi8KKwlCT09MRUFOIGJRQWNrOworCUJPT0xFQU4gYlF1ZXVlUmVxdWVzdDsKKwlCT09MRUFOIGJUeG9wUmVxdWVzdDsKKwlCT09MRUFOIGJBUFNEQ2FwYWJsZTsKKy8qICBCT09MRUFOICAgICBiTW9yZURhdGFBY2s7ICovCisJdTggRWRjYVVwZGF0ZUNvdW50OworCXU4IEFpZnNuWzRdOwkJLyogMDpBQ19CSywgMTpBQ19CRSwgMjpBQ19WSSwgMzpBQ19WTyAqLworCXU4IEN3bWluWzRdOworCXU4IEN3bWF4WzRdOworCXUxNiBUeG9wWzRdOwkJLyogaW4gdW5pdCBvZiAzMi11cyAqLworCUJPT0xFQU4gYkFDTVs0XTsJLyogMTogQWRtaXNzaW9uIENvbnRyb2wgb2YgQUNfQksgaXMgbWFuZGF0dG9yeSAqLworfTsKIAotLy8gUUJTUyBMT0FEIGluZm9ybWF0aW9uIGZyb20gUUFQJ3MgQkVBQ09OL1Byb2JlUnNwCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgVVNIT1JUICAgICAgU3RhTnVtOwotICAgIFVDSEFSICAgICAgIENoYW5uZWxVdGlsaXphdGlvbjsKLSAgICBVU0hPUlQgICAgICBSZW1haW5pbmdBZG1pc3Npb25Db250cm9sOyAgLy8gaW4gdW5pdCBvZiAzMi11cwotfSBRQlNTX0xPQURfUEFSTSwgKlBRQlNTX0xPQURfUEFSTTsKKy8qIFFCU1MgTE9BRCBpbmZvcm1hdGlvbiBmcm9tIFFBUCdzIEJFQUNPTi9Qcm9iZVJzcCAqLworc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtIHsKKwlCT09MRUFOIGJWYWxpZDsJCS8qIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlICovCisJdTE2IFN0YU51bTsKKwl1OCBDaGFubmVsVXRpbGl6YXRpb247CisJdTE2IFJlbWFpbmluZ0FkbWlzc2lvbkNvbnRyb2w7CS8qIGluIHVuaXQgb2YgMzItdXMgKi8KK307CiAKLS8vIFFCU1MgSW5mbyBmaWVsZCBpbiBRU1RBJ3MgYXNzb2MgcmVxCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotICAgIFVDSEFSCQlVQVBTRF9BQ19WTzoxOwotCVVDSEFSCQlVQVBTRF9BQ19WSToxOwotCVVDSEFSCQlVQVBTRF9BQ19CSzoxOwotCVVDSEFSCQlVQVBTRF9BQ19CRToxOwotCVVDSEFSCQlSc3YxOjE7Ci0JVUNIQVIJCU1heFNQTGVuZ3RoOjI7Ci0JVUNIQVIJCVJzdjI6MTsKLX0gUUJTU19TVEFfSU5GT19QQVJNLCAqUFFCU1NfU1RBX0lORk9fUEFSTTsKKy8qIFFCU1MgSW5mbyBmaWVsZCBpbiBRU1RBJ3MgYXNzb2MgcmVxICovCitzdHJ1Y3QgUEFDS0VEIHJ0X3Fic3Nfc3RhX2luZm9fcGFybSB7CisJdTggVUFQU0RfQUNfVk86MTsKKwl1OCBVQVBTRF9BQ19WSToxOworCXU4IFVBUFNEX0FDX0JLOjE7CisJdTggVUFQU0RfQUNfQkU6MTsKKwl1OCBSc3YxOjE7CisJdTggTWF4U1BMZW5ndGg6MjsKKwl1OCBSc3YyOjE7Cit9OwogCi0vLyBRQlNTIEluZm8gZmllbGQgaW4gUUFQJ3MgQmVhY29uL1Byb2JlUnNwCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotICAgIFVDSEFSCQlQYXJhbVNldENvdW50OjQ7Ci0JVUNIQVIJCVJzdjozOwotCVVDSEFSCQlVQVBTRDoxOwotfSBRQlNTX0FQX0lORk9fUEFSTSwgKlBRQlNTX0FQX0lORk9fUEFSTTsKKy8qIFFCU1MgSW5mbyBmaWVsZCBpbiBRQVAncyBCZWFjb24vUHJvYmVSc3AgKi8KK3N0cnVjdCBQQUNLRUQgcnRfcWJzc19hcF9pbmZvX3Bhcm0geworCXU4IFBhcmFtU2V0Q291bnQ6NDsKKwl1OCBSc3Y6MzsKKwl1OCBVQVBTRDoxOworfTsKIAotLy8gUU9TIENhcGFiaWxpdHkgcmVwb3J0ZWQgaW4gUUFQJ3MgQkVBQ09OL1Byb2JlUnNwCi0vLyBRT1MgQ2FwYWJpbGl0eSBzZW50IG91dCBpbiBRU1RBJ3MgQXNzb2NpYXRlUmVxL1JlQXNzb2NpYXRlUmVxCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgQk9PTEVBTiAgICAgYlFBY2s7Ci0gICAgQk9PTEVBTiAgICAgYlF1ZXVlUmVxdWVzdDsKLSAgICBCT09MRUFOICAgICBiVHhvcFJlcXVlc3Q7Ci0vLyAgQk9PTEVBTiAgICAgYk1vcmVEYXRhQWNrOwotICAgIFVDSEFSICAgICAgIEVkY2FVcGRhdGVDb3VudDsKLX0gUU9TX0NBUEFCSUxJVFlfUEFSTSwgKlBRT1NfQ0FQQUJJTElUWV9QQVJNOworLyogUU9TIENhcGFiaWxpdHkgcmVwb3J0ZWQgaW4gUUFQJ3MgQkVBQ09OL1Byb2JlUnNwICovCisvKiBRT1MgQ2FwYWJpbGl0eSBzZW50IG91dCBpbiBRU1RBJ3MgQXNzb2NpYXRlUmVxL1JlQXNzb2NpYXRlUmVxICovCitzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSB7CisJQk9PTEVBTiBiVmFsaWQ7CQkvKiAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZSAqLworCUJPT0xFQU4gYlFBY2s7CisJQk9PTEVBTiBiUXVldWVSZXF1ZXN0OworCUJPT0xFQU4gYlR4b3BSZXF1ZXN0OworLyogIEJPT0xFQU4gICAgIGJNb3JlRGF0YUFjazsgKi8KKwl1OCBFZGNhVXBkYXRlQ291bnQ7Cit9OwogCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVUNIQVIgICAgICAgSUVMZW47Ci0gICAgVUNIQVIgICAgICAgSUVbTUFYX0NVU1RPTV9MRU5dOwotfSBXUEFfSUVfOworc3RydWN0IHJ0X3dwYV9pZSB7CisJdTggSUVMZW47CisJdTggSUVbTUFYX0NVU1RPTV9MRU5dOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVDSEFSICAgQnNzaWRbTUFDX0FERFJfTEVOXTsKLSAgICBVQ0hBUiAgIENoYW5uZWw7Ci0JVUNIQVIgICBDZW50cmFsQ2hhbm5lbDsJLy9TdG9yZSB0aGUgd2lkZS1iYW5kIGNlbnRyYWwgY2hhbm5lbCBmb3IgNDBNSHouICAudXNlZCBpbiA0ME1IeiBBUC4gT3IgdGhpcyBpcyB0aGUgc2FtZSBhcyBDaGFubmVsLgotICAgIFVDSEFSICAgQnNzVHlwZTsKLSAgICBVU0hPUlQgIEF0aW1XaW47Ci0gICAgVVNIT1JUICBCZWFjb25QZXJpb2Q7CitzdHJ1Y3QgcnRfYnNzX2VudHJ5IHsKKwl1OCBCc3NpZFtNQUNfQUREUl9MRU5dOworCXU4IENoYW5uZWw7CisJdTggQ2VudHJhbENoYW5uZWw7CS8qU3RvcmUgdGhlIHdpZGUtYmFuZCBjZW50cmFsIGNoYW5uZWwgZm9yIDQwTUh6LiAgLnVzZWQgaW4gNDBNSHogQVAuIE9yIHRoaXMgaXMgdGhlIHNhbWUgYXMgQ2hhbm5lbC4gKi8KKwl1OCBCc3NUeXBlOworCXUxNiBBdGltV2luOworCXUxNiBCZWFjb25QZXJpb2Q7CiAKLSAgICBVQ0hBUiAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotICAgIFVDSEFSICAgU3VwUmF0ZUxlbjsKLSAgICBVQ0hBUiAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotICAgIFVDSEFSICAgRXh0UmF0ZUxlbjsKLQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eTsKLQlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKLQlBRERfSFRfSU5GT19JRSBBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCVVDSEFSCQkJQWRkSHRJbmZvTGVuOwotCVVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldDsKLQlDSEFSICAgIFJzc2k7Ci0gICAgVUNIQVIgICBQcml2YWN5OwkJCS8vIEluZGljYXRlIHNlY3VyaXR5IGZ1bmN0aW9uIE9OL09GRi4gRG9uJ3QgbWVzcyB1cCB3aXRoIGF1dGggbW9kZS4KLQlVQ0hBUglIaWRkZW47CisJdTggU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJdTggU3VwUmF0ZUxlbjsKKwl1OCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwl1OCBFeHRSYXRlTGVuOworCXN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llIEh0Q2FwYWJpbGl0eTsKKwl1OCBIdENhcGFiaWxpdHlMZW47CisJc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llIEFkZEh0SW5mbzsJLyogQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFICovCisJdTggQWRkSHRJbmZvTGVuOworCXU4IE5ld0V4dENoYW5PZmZzZXQ7CisJY2hhciBSc3NpOworCXU4IFByaXZhY3k7CQkvKiBJbmRpY2F0ZSBzZWN1cml0eSBmdW5jdGlvbiBPTi9PRkYuIERvbid0IG1lc3MgdXAgd2l0aCBhdXRoIG1vZGUuICovCisJdTggSGlkZGVuOwogCi0gICAgVVNIT1JUICBEdGltUGVyaW9kOwotICAgIFVTSE9SVCAgQ2FwYWJpbGl0eUluZm87CisJdTE2IER0aW1QZXJpb2Q7CisJdTE2IENhcGFiaWxpdHlJbmZvOwogCi0gICAgVVNIT1JUICBDZnBDb3VudDsKLSAgICBVU0hPUlQgIENmcFBlcmlvZDsKLSAgICBVU0hPUlQgIENmcE1heER1cmF0aW9uOwotICAgIFVTSE9SVCAgQ2ZwRHVyUmVtYWluaW5nOwotICAgIFVDSEFSICAgU3NpZExlbjsKLSAgICBDSEFSICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwl1MTYgQ2ZwQ291bnQ7CisJdTE2IENmcFBlcmlvZDsKKwl1MTYgQ2ZwTWF4RHVyYXRpb247CisJdTE2IENmcER1clJlbWFpbmluZzsKKwl1OCBTc2lkTGVuOworCWNoYXIgU3NpZFtNQVhfTEVOX09GX1NTSURdOwogCi0gICAgVUxPTkcgICBMYXN0QmVhY29uUnhUaW1lOyAvLyBPUydzIHRpbWVzdGFtcAorCXVuc2lnbmVkIGxvbmcgTGFzdEJlYWNvblJ4VGltZTsJLyogT1MncyB0aW1lc3RhbXAgKi8KIAotCUJPT0xFQU4JYlNFUzsKKwlCT09MRUFOIGJTRVM7CiAKLQkvLyBOZXcgZm9yIFdQQTIKLQlDSVBIRVJfU1VJVEUJCQkJCVdQQTsJCQkvLyBBUCBhbm5vdW5jZWQgV1BBIGNpcGhlciBzdWl0ZQotCUNJUEhFUl9TVUlURQkJCQkJV1BBMjsJCQkvLyBBUCBhbm5vdW5jZWQgV1BBMiBjaXBoZXIgc3VpdGUKKwkvKiBOZXcgZm9yIFdQQTIgKi8KKwlzdHJ1Y3QgcnRfY2lwaGVyX3N1aXRlIFdQQTsJLyogQVAgYW5ub3VuY2VkIFdQQSBjaXBoZXIgc3VpdGUgKi8KKwlzdHJ1Y3QgcnRfY2lwaGVyX3N1aXRlIFdQQTI7CS8qIEFQIGFubm91bmNlZCBXUEEyIGNpcGhlciBzdWl0ZSAqLwogCi0JLy8gTmV3IGZvciBtaWNyb3NvZnQgV1BBIHN1cHBvcnQKLQlORElTXzgwMl8xMV9GSVhFRF9JRXMJRml4SUVzOwotCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJQXV0aE1vZGVBdXg7CS8vIEFkZGl0aW9uIG1vZGUgZm9yIFdQQTIgLyBXUEEgY2FwYWJsZSBBUAotCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJQXV0aE1vZGU7Ci0JTkRJU184MDJfMTFfV0VQX1NUQVRVUwlXZXBTdGF0dXM7CQkJCS8vIFVuaWNhc3QgRW5jcnlwdGlvbiBBbGdvcml0aG0gZXh0cmFjdCBmcm9tIFZBUl9JRQotCVVTSE9SVAkJCQkJVmFySUVMZW47CQkJCS8vIExlbmd0aCBvZiBuZXh0IFZJRSBpbmNsdWRlIEVJRCAmIExlbmd0aAotCVVDSEFSCQkJCQlWYXJJRXNbTUFYX1ZJRV9MRU5dOworCS8qIE5ldyBmb3IgbWljcm9zb2Z0IFdQQSBzdXBwb3J0ICovCisJc3RydWN0IHJ0X25kaXNfODAyXzExX2ZpeGVkX2llcyBGaXhJRXM7CisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSBBdXRoTW9kZUF1eDsJLyogQWRkaXRpb24gbW9kZSBmb3IgV1BBMiAvIFdQQSBjYXBhYmxlIEFQICovCisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSBBdXRoTW9kZTsKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTIFdlcFN0YXR1czsJLyogVW5pY2FzdCBFbmNyeXB0aW9uIEFsZ29yaXRobSBleHRyYWN0IGZyb20gVkFSX0lFICovCisJdTE2IFZhcklFTGVuOwkvKiBMZW5ndGggb2YgbmV4dCBWSUUgaW5jbHVkZSBFSUQgJiBMZW5ndGggKi8KKwl1OCBWYXJJRXNbTUFYX1ZJRV9MRU5dOwogCi0JLy8gQ0NYIENraXAgaW5mb3JtYXRpb24KLSAgICBVQ0hBUiAgIENraXBGbGFnOworCS8qIENDWCBDa2lwIGluZm9ybWF0aW9uICovCisJdTggQ2tpcEZsYWc7CiAKLQkvLyBDQ1ggMiBUU0YKLQlVQ0hBUglQVFNGWzRdOwkJLy8gUGFyZW50IFRTRgotCVVDSEFSCVRUU0ZbOF07CQkvLyBUYXJnZXQgVFNGCisJLyogQ0NYIDIgVFNGICovCisJdTggUFRTRls0XTsJCS8qIFBhcmVudCBUU0YgKi8KKwl1OCBUVFNGWzhdOwkJLyogVGFyZ2V0IFRTRiAqLwogCi0gICAgLy8gODAyLjExZSBkOSwgYW5kIFdNTQotCUVEQ0FfUEFSTSAgICAgICAgICAgRWRjYVBhcm07Ci0JUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OwotCVFCU1NfTE9BRF9QQVJNICAgICAgUWJzc0xvYWQ7Ci0gICAgV1BBX0lFXyAgICAgV3BhSUU7Ci0gICAgV1BBX0lFXyAgICAgUnNuSUU7Ci19IEJTU19FTlRSWSwgKlBCU1NfRU5UUlk7CisJLyogODAyLjExZSBkOSwgYW5kIFdNTSAqLworCXN0cnVjdCBydF9lZGNhX3Bhcm0gRWRjYVBhcm07CisJc3RydWN0IHJ0X3Fvc19jYXBhYmlsaXR5X3Bhcm0gUW9zQ2FwYWJpbGl0eTsKKwlzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0gUWJzc0xvYWQ7CisJc3RydWN0IHJ0X3dwYV9pZSBXcGFJRTsKKwlzdHJ1Y3QgcnRfd3BhX2llIFJzbklFOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVDSEFSICAgICAgICAgICBCc3NOcjsKLSAgICBVQ0hBUiAgICAgICAgICAgQnNzT3ZlcmxhcE5yOwotICAgIEJTU19FTlRSWSAgICAgICBCc3NFbnRyeVtNQVhfTEVOX09GX0JTU19UQUJMRV07Ci19IEJTU19UQUJMRSwgKlBCU1NfVEFCTEU7CitzdHJ1Y3QgcnRfYnNzX3RhYmxlIHsKKwl1OCBCc3NOcjsKKwl1OCBCc3NPdmVybGFwTnI7CisJc3RydWN0IHJ0X2Jzc19lbnRyeSBCc3NFbnRyeVtNQVhfTEVOX09GX0JTU19UQUJMRV07Cit9OwogCitzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtIHsKKwl1bnNpZ25lZCBsb25nIE1hY2hpbmU7CisJdW5zaWduZWQgbG9uZyBNc2dUeXBlOworCXVuc2lnbmVkIGxvbmcgTXNnTGVuOworCXU4IE1zZ1tNR01UX0RNQV9CVUZGRVJfU0laRV07CisJTEFSR0VfSU5URUdFUiBUaW1lU3RhbXA7CisJdTggUnNzaTA7CisJdTggUnNzaTE7CisJdTggUnNzaTI7CisJdTggU2lnbmFsOworCXU4IENoYW5uZWw7CisJdTggV2NpZDsKKwlCT09MRUFOIE9jY3VwaWVkOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfUVVFVUVfRUxFTSB7Ci0gICAgVUxPTkcgICAgICAgICAgICAgTWFjaGluZTsKLSAgICBVTE9ORyAgICAgICAgICAgICBNc2dUeXBlOwotICAgIFVMT05HICAgICAgICAgICAgIE1zZ0xlbjsKLSAgICBVQ0hBUiAgICAgICAgICAgICBNc2dbTUdNVF9ETUFfQlVGRkVSX1NJWkVdOwotICAgIExBUkdFX0lOVEVHRVIgICAgIFRpbWVTdGFtcDsKLSAgICBVQ0hBUiAgICAgICAgICAgICBSc3NpMDsKLSAgICBVQ0hBUiAgICAgICAgICAgICBSc3NpMTsKLSAgICBVQ0hBUiAgICAgICAgICAgICBSc3NpMjsKLSAgICBVQ0hBUiAgICAgICAgICAgICBTaWduYWw7Ci0gICAgVUNIQVIgICAgICAgICAgICAgQ2hhbm5lbDsKLSAgICBVQ0hBUiAgICAgICAgICAgICBXY2lkOwotICAgIEJPT0xFQU4gICAgICAgICAgIE9jY3VwaWVkOwotfSBNTE1FX1FVRVVFX0VMRU0sICpQTUxNRV9RVUVVRV9FTEVNOworc3RydWN0IHJ0X21sbWVfcXVldWUgeworCXVuc2lnbmVkIGxvbmcgTnVtOworCXVuc2lnbmVkIGxvbmcgSGVhZDsKKwl1bnNpZ25lZCBsb25nIFRhaWw7CisJc3BpbmxvY2tfdCBMb2NrOworCXN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gRW50cnlbTUFYX0xFTl9PRl9NTE1FX1FVRVVFXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9NTE1FX1FVRVVFIHsKLSAgICBVTE9ORyAgICAgICAgICAgICBOdW07Ci0gICAgVUxPTkcgICAgICAgICAgICAgSGVhZDsKLSAgICBVTE9ORyAgICAgICAgICAgICBUYWlsOwotICAgIE5ESVNfU1BJTl9MT0NLICAgTG9jazsKLSAgICBNTE1FX1FVRVVFX0VMRU0gIEVudHJ5W01BWF9MRU5fT0ZfTUxNRV9RVUVVRV07Ci19IE1MTUVfUVVFVUUsICpQTUxNRV9RVUVVRTsKK3R5cGVkZWYgdm9pZCgqU1RBVEVfTUFDSElORV9GVU5DKSAodm9pZCAqIEFkYXB0b3IsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi10eXBlZGVmIFZPSUQgKCpTVEFURV9NQUNISU5FX0ZVTkMpKFZPSUQgKkFkYXB0b3IsIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CitzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSB7CisJdW5zaWduZWQgbG9uZyBCYXNlOworCXVuc2lnbmVkIGxvbmcgTnJTdGF0ZTsKKwl1bnNpZ25lZCBsb25nIE5yTXNnOworCXVuc2lnbmVkIGxvbmcgQ3VyclN0YXRlOworCVNUQVRFX01BQ0hJTkVfRlVOQyAqVHJhbnNGdW5jOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NUQVRFX01BQ0hJTkUgewotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZTsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yU3RhdGU7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBOck1zZzsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJTdGF0ZTsKLSAgICBTVEFURV9NQUNISU5FX0ZVTkMgICAgICAgICAgICAgKlRyYW5zRnVuYzsKLX0gU1RBVEVfTUFDSElORSwgKlBTVEFURV9NQUNISU5FOworLyogTUxNRSBBVVggZGF0YSBzdHJ1Y3R1cmUgdGhhdCBob2xkIHRlbXBvcmFybGl5IHNldHRpbmdzIGR1cmluZyBhIGNvbm5lY3Rpb24gYXR0ZW1wdC4gKi8KKy8qIE9uY2UgdGhpcyBhdHRlbXAgc3VjY2VlZHMsIGFsbCBzZXR0aW5ncyB3aWxsIGJlIGNvcHkgdG8gcEFkLT5TdGFBY3RpdmUuICovCisvKiBBIGNvbm5lY3Rpb24gYXR0ZW1wdCAodXNlciBzZXQgT0lELCByb2FtaW5nLCBDQ1ggZmFzdCByb2FtaW5nLC4uKSBjb25zaXN0cyBvZiAqLworLyogc2V2ZXJhbCBzdGVwcyAoSk9JTiwgQVVUSCwgQVNTT0Mgb3IgUkVBU1NPQykgYW5kIG1heSBmYWlsIGF0IGFueSBzdGVwLiBXZSBwdXJwb3NlbHkgKi8KKy8qIHNlcGFyYXRlIHRoaXMgdW5kZXItdHJpYWwgc2V0dGluZ3MgYXdheSBmcm9tIHBBZC0+U3RhQWN0aXZlIHNvIHRoYXQgb25jZSAqLworLyogdGhpcyBuZXcgYXR0ZW1wdCBmYWlsZWQsIGRyaXZlciBjYW4gYXV0by1yZWNvdmVyIGJhY2sgdG8gdGhlIGFjdGl2ZSBzZXR0aW5ncy4gKi8KK3N0cnVjdCBydF9tbG1lX2F1eCB7CisJdTggQnNzVHlwZTsKKwl1OCBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJdTggU3NpZExlbjsKKwl1OCBCc3NpZFtNQUNfQUREUl9MRU5dOworCXU4IEF1dG9SZWNvbm5lY3RTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJdTggQXV0b1JlY29ubmVjdFNzaWRMZW47CisJdTE2IEFsZzsKKwl1OCBTY2FuVHlwZTsKKwl1OCBDaGFubmVsOworCXU4IENlbnRyYWxDaGFubmVsOworCXUxNiBBaWQ7CisJdTE2IENhcGFiaWxpdHlJbmZvOworCXUxNiBCZWFjb25QZXJpb2Q7CisJdTE2IENmcE1heER1cmF0aW9uOworCXUxNiBDZnBQZXJpb2Q7CisJdTE2IEF0aW1XaW47CiAKKwkvKiBDb3B5IHN1cHBvcnRlZCByYXRlIGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaCAqLworCS8qIEFQJ3Mgc3VwcG9ydGVkIGFuZCBleHRlbmRlZCByYXRlIHNldHRpbmdzLiAqLworCXU4IFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCXU4IEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCXU4IFN1cFJhdGVMZW47CisJdTggRXh0UmF0ZUxlbjsKKwlzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSBIdENhcGFiaWxpdHk7CisJdTggSHRDYXBhYmlsaXR5TGVuOworCXN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSBBZGRIdEluZm87CS8qIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRSAqLworCXU4IE5ld0V4dENoYW5uZWxPZmZzZXQ7CisJLypzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eSAgICAgIFN1cHBvcnRlZEh0UGh5OyAqLwogCi0vLyBNTE1FIEFVWCBkYXRhIHN0cnVjdHVyZSB0aGF0IGhvbGQgdGVtcG9yYXJsaXkgc2V0dGluZ3MgZHVyaW5nIGEgY29ubmVjdGlvbiBhdHRlbXB0LgotLy8gT25jZSB0aGlzIGF0dGVtcCBzdWNjZWVkcywgYWxsIHNldHRpbmdzIHdpbGwgYmUgY29weSB0byBwQWQtPlN0YUFjdGl2ZS4KLS8vIEEgY29ubmVjdGlvbiBhdHRlbXB0ICh1c2VyIHNldCBPSUQsIHJvYW1pbmcsIENDWCBmYXN0IHJvYW1pbmcsLi4pIGNvbnNpc3RzIG9mCi0vLyBzZXZlcmFsIHN0ZXBzIChKT0lOLCBBVVRILCBBU1NPQyBvciBSRUFTU09DKSBhbmQgbWF5IGZhaWwgYXQgYW55IHN0ZXAuIFdlIHB1cnBvc2VseQotLy8gc2VwYXJhdGUgdGhpcyB1bmRlci10cmlhbCBzZXR0aW5ncyBhd2F5IGZyb20gcEFkLT5TdGFBY3RpdmUgc28gdGhhdCBvbmNlCi0vLyB0aGlzIG5ldyBhdHRlbXB0IGZhaWxlZCwgZHJpdmVyIGNhbiBhdXRvLXJlY292ZXIgYmFjayB0byB0aGUgYWN0aXZlIHNldHRpbmdzLgotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfQVVYIHsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIEJzc1R5cGU7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBTc2lkTGVuOwotICAgIFVDSEFSICAgICAgICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUgkJCQlBdXRvUmVjb25uZWN0U3NpZFtNQVhfTEVOX09GX1NTSURdOwotCVVDSEFSCQkJCUF1dG9SZWNvbm5lY3RTc2lkTGVuOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgQWxnOwotICAgIFVDSEFSICAgICAgICAgICAgICAgU2NhblR5cGU7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBDaGFubmVsOwotCVVDSEFSICAgICAgICAgICAgICAgQ2VudHJhbENoYW5uZWw7Ci0gICAgVVNIT1JUICAgICAgICAgICAgICBBaWQ7Ci0gICAgVVNIT1JUICAgICAgICAgICAgICBDYXBhYmlsaXR5SW5mbzsKLSAgICBVU0hPUlQgICAgICAgICAgICAgIEJlYWNvblBlcmlvZDsKLSAgICBVU0hPUlQgICAgICAgICAgICAgIENmcE1heER1cmF0aW9uOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgQ2ZwUGVyaW9kOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgQXRpbVdpbjsKKwkvKiBuZXcgZm9yIFFPUyAqLworCXN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtIEFQUW9zQ2FwYWJpbGl0eTsJLyogUU9TIGNhcGFiaWxpdHkgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCAqLworCXN0cnVjdCBydF9lZGNhX3Bhcm0gQVBFZGNhUGFybTsJLyogRURDQSBwYXJhbWV0ZXJzIG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAgKi8KKwlzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0gQVBRYnNzTG9hZDsJLyogUUJTUyBsb2FkIG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAgKi8KIAotCS8vIENvcHkgc3VwcG9ydGVkIHJhdGUgZnJvbSBkZXNpcmVkIEFQJ3MgYmVhY29uLiBXZSBhcmUgdHJ5aW5nIHRvIG1hdGNoCi0JLy8gQVAncyBzdXBwb3J0ZWQgYW5kIGV4dGVuZGVkIHJhdGUgc2V0dGluZ3MuCi0JVUNIQVIJCSAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIJCSAgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIJCSAgICAgICAgU3VwUmF0ZUxlbjsKLQlVQ0hBUgkJICAgICAgICBFeHRSYXRlTGVuOwotCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKLQlVQ0hBUgkJICAgICAgICAJSHRDYXBhYmlsaXR5TGVuOwotCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldDsKLQkvL1JUX0hUX0NBUEFCSUxJVFkJU3VwcG9ydGVkSHRQaHk7CisJLyogbmV3IHRvIGtlZXAgUmFsaW5rIHNwZWNpZmljIGZlYXR1cmUgKi8KKwl1bnNpZ25lZCBsb25nIEFQUmFsaW5rSWU7CiAKLSAgICAvLyBuZXcgZm9yIFFPUwotICAgIFFPU19DQVBBQklMSVRZX1BBUk0gQVBRb3NDYXBhYmlsaXR5OyAgICAvLyBRT1MgY2FwYWJpbGl0eSBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCi0gICAgRURDQV9QQVJNICAgICAgICAgICBBUEVkY2FQYXJtOyAgICAgICAgIC8vIEVEQ0EgcGFyYW1ldGVycyBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCi0gICAgUUJTU19MT0FEX1BBUk0gICAgICBBUFFic3NMb2FkOyAgICAgICAgIC8vIFFCU1MgbG9hZCBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCisJc3RydWN0IHJ0X2Jzc190YWJsZSBTc2lkQnNzVGFiOwkvKiBBUCBsaXN0IGZvciB0aGUgc2FtZSBTU0lEICovCisJc3RydWN0IHJ0X2Jzc190YWJsZSBSb2FtVGFiOwkvKiBBUCBsaXN0IGVsaWdpYmxlIGZvciByb2FtaW5nICovCisJdW5zaWduZWQgbG9uZyBCc3NJZHg7CisJdW5zaWduZWQgbG9uZyBSb2FtSWR4OwogCi0gICAgLy8gbmV3IHRvIGtlZXAgUmFsaW5rIHNwZWNpZmljIGZlYXR1cmUKLSAgICBVTE9ORyAgICAgICAgICAgICAgIEFQUmFsaW5rSWU7CisJQk9PTEVBTiBDdXJyUmVxSXNGcm9tTmRpczsKIAotICAgIEJTU19UQUJMRSAgICAgICAgICAgU3NpZEJzc1RhYjsgICAgIC8vIEFQIGxpc3QgZm9yIHRoZSBzYW1lIFNTSUQKLSAgICBCU1NfVEFCTEUgICAgICAgICAgIFJvYW1UYWI7ICAgICAgICAvLyBBUCBsaXN0IGVsaWdpYmxlIGZvciByb2FtaW5nCi0gICAgVUxPTkcgICAgICAgICAgICAgICBCc3NJZHg7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICBSb2FtSWR4OworCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgQmVhY29uVGltZXIsIFNjYW5UaW1lcjsKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIEF1dGhUaW1lcjsKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIEFzc29jVGltZXIsIFJlYXNzb2NUaW1lciwgRGlzYXNzb2NUaW1lcjsKK307CiAKLQlCT09MRUFOCQkJCUN1cnJSZXFJc0Zyb21OZGlzOworc3RydWN0IHJ0X21sbWVfYWRkYmFfcmVxIHsKKwl1OCBXY2lkOwkJLyogKi8KKwl1OCBwQWRkcltNQUNfQUREUl9MRU5dOworCXU4IEJhQnVmU2l6ZTsKKwl1MTYgVGltZU91dFZhbHVlOworCXU4IFRJRDsKKwl1OCBUb2tlbjsKKwl1MTYgQmFTdGFydFNlcTsKK307CiAKLSAgICBSQUxJTktfVElNRVJfU1RSVUNUIEJlYWNvblRpbWVyLCBTY2FuVGltZXI7Ci0gICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBdXRoVGltZXI7Ci0gICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBc3NvY1RpbWVyLCBSZWFzc29jVGltZXIsIERpc2Fzc29jVGltZXI7Ci19IE1MTUVfQVVYLCAqUE1MTUVfQVVYOworc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxIHsKKwl1OCBXY2lkOwkJLyogKi8KKwl1OCBBZGRyW01BQ19BRERSX0xFTl07CisJdTggVElEOworCXU4IEluaXRpYXRvcjsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9NTE1FX0FEREJBX1JFUV9TVFJVQ1R7Ci0JVUNIQVIgICBXY2lkOwkvLwotCVVDSEFSICAgcEFkZHJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgIEJhQnVmU2l6ZTsKLQlVU0hPUlQJVGltZU91dFZhbHVlOwotCVVDSEFSICAgVElEOwotCVVDSEFSICAgVG9rZW47Ci0JVVNIT1JUCUJhU3RhcnRTZXE7Ci19IE1MTUVfQUREQkFfUkVRX1NUUlVDVCwgKlBNTE1FX0FEREJBX1JFUV9TVFJVQ1Q7CisvKiBhc3NvYyBzdHJ1Y3QgaXMgZXF1YWwgdG8gcmVhc3NvYyAqLworc3RydWN0IHJ0X21sbWVfYXNzb2NfcmVxIHsKKwl1OCBBZGRyW01BQ19BRERSX0xFTl07CisJdTE2IENhcGFiaWxpdHlJbmZvOworCXUxNiBMaXN0ZW5JbnR2OworCXVuc2lnbmVkIGxvbmcgVGltZW91dDsKK307CiAKK3N0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSB7CisJdTggQWRkcltNQUNfQUREUl9MRU5dOworCXUxNiBSZWFzb247Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9ERUxCQV9SRVFfU1RSVUNUewotCVVDSEFSICAgV2NpZDsJLy8KLQlVQ0hBUiAgICAgQWRkcltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgVElEOwotCVVDSEFSCUluaXRpYXRvcjsKLX0gTUxNRV9ERUxCQV9SRVFfU1RSVUNULCAqUE1MTUVfREVMQkFfUkVRX1NUUlVDVDsKK3N0cnVjdCBydF9tbG1lX2F1dGhfcmVxIHsKKwl1OCBBZGRyW01BQ19BRERSX0xFTl07CisJdTE2IEFsZzsKKwl1bnNpZ25lZCBsb25nIFRpbWVvdXQ7Cit9OwogCi0vLyBhc3NvYyBzdHJ1Y3QgaXMgZXF1YWwgdG8gcmVhc3NvYwotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfQVNTT0NfUkVRX1NUUlVDVHsKLSAgICBVQ0hBUiAgICAgQWRkcltNQUNfQUREUl9MRU5dOwotICAgIFVTSE9SVCAgICBDYXBhYmlsaXR5SW5mbzsKLSAgICBVU0hPUlQgICAgTGlzdGVuSW50djsKLSAgICBVTE9ORyAgICAgVGltZW91dDsKLX0gTUxNRV9BU1NPQ19SRVFfU1RSVUNULCAqUE1MTUVfQVNTT0NfUkVRX1NUUlVDVCwgTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QsICpQTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1Q7CitzdHJ1Y3QgcnRfbWxtZV9kZWF1dGhfcmVxIHsKKwl1OCBBZGRyW01BQ19BRERSX0xFTl07CisJdTE2IFJlYXNvbjsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9NTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1R7Ci0gICAgVUNIQVIgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKLSAgICBVU0hPUlQgICAgUmVhc29uOwotfSBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QsICpQTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUOworc3RydWN0IHJ0X21sbWVfam9pbl9yZXEgeworCXVuc2lnbmVkIGxvbmcgQnNzSWR4OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfQVVUSF9SRVFfU1RSVUNUIHsKLSAgICBVQ0hBUiAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOwotICAgIFVTSE9SVCAgICAgICBBbGc7Ci0gICAgVUxPTkcgICAgICAgIFRpbWVvdXQ7Ci19IE1MTUVfQVVUSF9SRVFfU1RSVUNULCAqUE1MTUVfQVVUSF9SRVFfU1RSVUNUOworc3RydWN0IHJ0X21sbWVfc2Nhbl9yZXEgeworCXU4IEJzc2lkW01BQ19BRERSX0xFTl07CisJdTggQnNzVHlwZTsKKwl1OCBTY2FuVHlwZTsKKwl1OCBTc2lkTGVuOworCWNoYXIgU3NpZFtNQVhfTEVOX09GX1NTSURdOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfREVBVVRIX1JFUV9TVFJVQ1QgewotICAgIFVDSEFSICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07Ci0gICAgVVNIT1JUICAgICAgIFJlYXNvbjsKLX0gTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCwgKlBNTE1FX0RFQVVUSF9SRVFfU1RSVUNUOworc3RydWN0IHJ0X21sbWVfc3RhcnRfcmVxIHsKKwljaGFyIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwl1OCBTc2lkTGVuOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVMT05HICAgICAgQnNzSWR4OwotfSBNTE1FX0pPSU5fUkVRX1NUUlVDVDsKK3N0cnVjdCBQQUNLRUQgcnRfZWlkIHsKKwl1OCBFaWQ7CisJdTggTGVuOworCXU4IE9jdGV0WzFdOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfU0NBTl9SRVFfU1RSVUNUIHsKLSAgICBVQ0hBUiAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07Ci0gICAgVUNIQVIgICAgICBCc3NUeXBlOwotICAgIFVDSEFSICAgICAgU2NhblR5cGU7Ci0gICAgVUNIQVIgICAgICBTc2lkTGVuOwotICAgIENIQVIgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOwotfSBNTE1FX1NDQU5fUkVRX1NUUlVDVCwgKlBNTE1FX1NDQU5fUkVRX1NUUlVDVDsKK3N0cnVjdCBQQUNLRUQgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCB7CisJdTggSXRlbU5vOworCXU4IFNUQkM6MTsKKwl1OCBTaG9ydEdJOjE7CisJdTggQlc6MTsKKwl1OCBSc3YxOjE7CisJdTggTW9kZToyOworCXU4IFJzdjI6MjsKKwl1OCBDdXJyTUNTOworCXU4IFRyYWluVXA7CisJdTggVHJhaW5Eb3duOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfU1RBUlRfUkVRX1NUUlVDVCB7Ci0gICAgQ0hBUiAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOwotICAgIFVDSEFSICAgICAgIFNzaWRMZW47Ci19IE1MTUVfU1RBUlRfUkVRX1NUUlVDVCwgKlBNTE1FX1NUQVJUX1JFUV9TVFJVQ1Q7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0gICAgVUNIQVIgICBFaWQ7Ci0gICAgVUNIQVIgICBMZW47Ci0gICAgQ0hBUiAgIE9jdGV0WzFdOwotfSBFSURfU1RSVUNULCpQRUlEX1NUUlVDVCwgQkVBQ09OX0VJRF9TVFJVQ1QsICpQQkVBQ09OX0VJRF9TVFJVQ1Q7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlRNUF9UWF9SQVRFX1NXSVRDSAotewotCVVDSEFSICAgSXRlbU5vOwotCVVDSEFSCVNUQkM6MTsKLQlVQ0hBUglTaG9ydEdJOjE7Ci0JVUNIQVIJQlc6MTsKLQlVQ0hBUglSc3YxOjE7Ci0JVUNIQVIJTW9kZToyOwotCVVDSEFSCVJzdjI6MjsKLQlVQ0hBUiAgIEN1cnJNQ1M7Ci0JVUNIQVIgICBUcmFpblVwOwotCVVDSEFSICAgVHJhaW5Eb3duOwotfSBSUlRNUF9UWF9SQVRFX1NXSVRDSCwgKlBSVE1QX1RYX1JBVEVfU1dJVENIOwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBBUCBtbG1lLmggPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2RlZmluZSBUQlRUX1BSRUxPQURfVElNRSAgICAgICAzODQgICAgICAgIC8vIHVzZWMuIExvbWdQcmVhbWJsZSArIDI0LWJ5dGUgYXQgMU1icHMKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09IEFQIG1sbWUuaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjZGVmaW5lIFRCVFRfUFJFTE9BRF9USU1FICAgICAgIDM4NAkvKiB1c2VjLiBMb21nUHJlYW1ibGUgKyAyNC1ieXRlIGF0IDFNYnBzICovCiAjZGVmaW5lIERFRkFVTFRfRFRJTV9QRVJJT0QgICAgIDEKIAotI2RlZmluZSBNQUNfVEFCTEVfQUdFT1VUX1RJTUUJCQkzMDAJCQkvLyB1bml0OiBzZWMKLSNkZWZpbmUgTUFDX1RBQkxFX0FTU09DX1RJTUVPVVQJCQk1CQkJLy8gdW5pdDogc2VjCisjZGVmaW5lIE1BQ19UQUJMRV9BR0VPVVRfVElNRQkJCTMwMAkvKiB1bml0OiBzZWMgKi8KKyNkZWZpbmUgTUFDX1RBQkxFX0FTU09DX1RJTUVPVVQJCQk1CS8qIHVuaXQ6IHNlYyAqLwogI2RlZmluZSBNQUNfVEFCTEVfRlVMTChUYWIpCQkJCSgoVGFiKS5zaXplID09IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQogCi0vLyBBUCBzaGFsbCBkcm9wIHRoZSBzdGEgaWYgY29udGluZSBUeCBmYWlsIGNvdW50IHJlYWNoIGl0LgotI2RlZmluZSBNQUNfRU5UUllfTElGRV9DSEVDS19DTlQJCTIwCQkJLy8gcGFja2V0IGNudC4KKy8qIEFQIHNoYWxsIGRyb3AgdGhlIHN0YSBpZiBjb250aW5lIFR4IGZhaWwgY291bnQgcmVhY2ggaXQuICovCisjZGVmaW5lIE1BQ19FTlRSWV9MSUZFX0NIRUNLX0NOVAkJMjAJLyogcGFja2V0IGNudC4gKi8KIAotLy8gVmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+U3N0CisvKiBWYWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5Tc3QgKi8KIHR5cGVkZWYgZW51bSBfU3N0IHsKLSAgICBTU1RfTk9UX0FVVEgsICAgLy8gMDogZXF1aXZhbGVudCB0byBJRUVFIDgwMi4xMS8xOTk5IHN0YXRlIDEKLSAgICBTU1RfQVVUSCwgICAgICAgLy8gMTogZXF1aXZhbGVudCB0byBJRUVFIDgwMi4xMS8xOTk5IHN0YXRlIDIKLSAgICBTU1RfQVNTT0MgICAgICAgLy8gMjogZXF1aXZhbGVudCB0byBJRUVFIDgwMi4xMS8xOTk5IHN0YXRlIDMKKwlTU1RfTk9UX0FVVEgsCQkvKiAwOiBlcXVpdmFsZW50IHRvIElFRUUgODAyLjExLzE5OTkgc3RhdGUgMSAqLworCVNTVF9BVVRILAkJLyogMTogZXF1aXZhbGVudCB0byBJRUVFIDgwMi4xMS8xOTk5IHN0YXRlIDIgKi8KKwlTU1RfQVNTT0MJCS8qIDI6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAzICovCiB9IFNTVDsKIAotLy8gdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+QXV0aFN0YXRlCisvKiB2YWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5BdXRoU3RhdGUgKi8KIHR5cGVkZWYgZW51bSBfQXV0aFN0YXRlIHsKLSAgICBBU19OT1RfQVVUSCwKLSAgICBBU19BVVRIX09QRU4sICAgICAgIC8vIFNUQSBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIHVzaW5nIE9QRU4gU1lTVEVNCi0gICAgQVNfQVVUSF9LRVksICAgICAgICAvLyBTVEEgaGFzIGJlZW4gYXV0aGVudGljYXRlZCB1c2luZyBTSEFSRUQgS0VZCi0gICAgQVNfQVVUSEVOVElDQVRJTkcgICAvLyBTVEEgaXMgd2FpdGluZyBmb3IgQVVUSCBzZXEjMyB1c2luZyBTSEFSRUQgS0VZCisJQVNfTk9UX0FVVEgsCisJQVNfQVVUSF9PUEVOLAkJLyogU1RBIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgdXNpbmcgT1BFTiBTWVNURU0gKi8KKwlBU19BVVRIX0tFWSwJCS8qIFNUQSBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIHVzaW5nIFNIQVJFRCBLRVkgKi8KKwlBU19BVVRIRU5USUNBVElORwkvKiBTVEEgaXMgd2FpdGluZyBmb3IgQVVUSCBzZXEjMyB1c2luZyBTSEFSRUQgS0VZICovCiB9IEFVVEhfU1RBVEU7CiAKLS8vZm9yLXdwYSB2YWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5XcGFTdGF0ZSAgODAyLjFpIEQzICAgcC4xMTQKKy8qZm9yLXdwYSB2YWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5XcGFTdGF0ZSAgODAyLjFpIEQzICAgcC4xMTQgKi8KIHR5cGVkZWYgZW51bSBfQXBXcGFTdGF0ZSB7Ci0gICAgQVNfTk9UVVNFLCAgICAgICAgICAgICAgLy8gMAotICAgIEFTX0RJU0NPTk5FQ1QsICAgICAgICAgIC8vIDEKLSAgICBBU19ESVNDT05ORUNURUQsICAgICAgICAvLyAyCi0gICAgQVNfSU5JVElBTElaRSwgICAgICAgICAgLy8gMwotICAgIEFTX0FVVEhFTlRJQ0FUSU9OLCAgICAgIC8vIDQKLSAgICBBU19BVVRIRU5USUNBVElPTjIsICAgICAvLyA1Ci0gICAgQVNfSU5JVFBNSywgICAgICAgICAgICAgLy8gNgotICAgIEFTX0lOSVRQU0ssICAgICAgICAgICAgIC8vIDcKLSAgICBBU19QVEtTVEFSVCwgICAgICAgICAgICAvLyA4Ci0gICAgQVNfUFRLSU5JVF9ORUdPVElBVElORywgLy8gOQotICAgIEFTX1BUS0lOSVRET05FLCAgICAgICAgIC8vIDEwCi0gICAgQVNfVVBEQVRFS0VZUywgICAgICAgICAgLy8gMTEKLSAgICBBU19JTlRFR1JJVFlfRkFJTFVSRSwgICAvLyAxMgotICAgIEFTX0tFWVVQREFURSwgICAgICAgICAgIC8vIDEzCisJQVNfTk9UVVNFLAkJLyogMCAqLworCUFTX0RJU0NPTk5FQ1QsCQkvKiAxICovCisJQVNfRElTQ09OTkVDVEVELAkvKiAyICovCisJQVNfSU5JVElBTElaRSwJCS8qIDMgKi8KKwlBU19BVVRIRU5USUNBVElPTiwJLyogNCAqLworCUFTX0FVVEhFTlRJQ0FUSU9OMiwJLyogNSAqLworCUFTX0lOSVRQTUssCQkvKiA2ICovCisJQVNfSU5JVFBTSywJCS8qIDcgKi8KKwlBU19QVEtTVEFSVCwJCS8qIDggKi8KKwlBU19QVEtJTklUX05FR09USUFUSU5HLAkvKiA5ICovCisJQVNfUFRLSU5JVERPTkUsCQkvKiAxMCAqLworCUFTX1VQREFURUtFWVMsCQkvKiAxMSAqLworCUFTX0lOVEVHUklUWV9GQUlMVVJFLAkvKiAxMiAqLworCUFTX0tFWVVQREFURSwJCS8qIDEzICovCiB9IEFQX1dQQV9TVEFURTsKIAotLy8gZm9yLXdwYSB2YWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5XcGFTdGF0ZSAgODAyLjFpIEQzICAgcC4xMTQKKy8qIGZvci13cGEgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0ICovCiB0eXBlZGVmIGVudW0gX0dUS1N0YXRlIHsKLSAgICBSRUtFWV9ORUdPVElBVElORywKLSAgICBSRUtFWV9FU1RBQkxJU0hFRCwKLSAgICBLRVlFUlJPUiwKKwlSRUtFWV9ORUdPVElBVElORywKKwlSRUtFWV9FU1RBQkxJU0hFRCwKKwlLRVlFUlJPUiwKIH0gR1RLX1NUQVRFOwogCi0vLyAgZm9yLXdwYSAgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0CisvKiAgZm9yLXdwYSAgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0ICovCiB0eXBlZGVmIGVudW0gX1dwYUdUS1N0YXRlIHsKLSAgICBTRVRLRVlTLAotICAgIFNFVEtFWVNfRE9ORSwKKwlTRVRLRVlTLAorCVNFVEtFWVNfRE9ORSwKIH0gV1BBX0dUS19TVEFURTsKLS8vID09PT09PT09PT09PT09PT09PT09PT0gZW5kIG9mIEFQIG1sbWUuaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvKiA9PT09PT09PT09PT09PT09PT09PT09IGVuZCBvZiBBUCBtbG1lLmggPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0KLSNlbmRpZgkvLyBNTE1FX0hfXworI2VuZGlmIC8qIE1MTUVfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL29pZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9vaWQuaAppbmRleCAwMjI3YzRhLi5mZDFjMTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL29pZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvb2lkLmgKQEAgLTM3LDMyICszNywzNyBAQAogI2lmbmRlZiBfT0lEX0hfCiAjZGVmaW5lIF9PSURfSF8KIAorLyojaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4gKi8KIAorI2lmbmRlZiBUUlVFCiAjZGVmaW5lIFRSVUUJCQkJMQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCiAjZGVmaW5lIEZBTFNFCQkJCTAKLS8vCi0vLyBJRUVFIDgwMi4xMSBTdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucwotLy8KLSNkZWZpbmUgTUFYX1RYX1BPV0VSX0xFVkVMICAgICAgICAgICAgICAxMDAgICAvKiBtVyAqLwotI2RlZmluZSBNQVhfUlNTSV9UUklHR0VSICAgICAgICAgICAgICAgIC0xMCAgICAvKiBkQm0gKi8KLSNkZWZpbmUgTUlOX1JTU0lfVFJJR0dFUiAgICAgICAgICAgICAgICAtMjAwICAgLyogZEJtICovCi0jZGVmaW5lIE1BWF9GUkFHX1RIUkVTSE9MRCAgICAgICAgICAgICAgMjM0NiAgLyogYnl0ZSBjb3VudCAqLwotI2RlZmluZSBNSU5fRlJBR19USFJFU0hPTEQgICAgICAgICAgICAgIDI1NiAgIC8qIGJ5dGUgY291bnQgKi8KLSNkZWZpbmUgTUFYX1JUU19USFJFU0hPTEQgICAgICAgICAgICAgICAyMzQ3ICAvKiBieXRlIGNvdW50ICovCisjZW5kaWYKKy8qICovCisvKiBJRUVFIDgwMi4xMSBTdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucyAqLworLyogKi8KKyNkZWZpbmUgTUFYX1RYX1BPV0VSX0xFVkVMICAgICAgICAgICAgICAxMDAJLyogbVcgKi8KKyNkZWZpbmUgTUFYX1JTU0lfVFJJR0dFUiAgICAgICAgICAgICAgICAtMTAJLyogZEJtICovCisjZGVmaW5lIE1JTl9SU1NJX1RSSUdHRVIgICAgICAgICAgICAgICAgLTIwMAkvKiBkQm0gKi8KKyNkZWZpbmUgTUFYX0ZSQUdfVEhSRVNIT0xEICAgICAgICAgICAgICAyMzQ2CS8qIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgTUlOX0ZSQUdfVEhSRVNIT0xEICAgICAgICAgICAgICAyNTYJLyogYnl0ZSBjb3VudCAqLworI2RlZmluZSBNQVhfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDIzNDcJLyogYnl0ZSBjb3VudCAqLwogCi0vLyBuZXcgdHlwZXMgZm9yIE1lZGlhIFNwZWNpZmljIEluZGljYXRpb25zCi0vLyBFeHRlbnNpb24gY2hhbm5lbCBvZmZzZXQKKy8qIG5ldyB0eXBlcyBmb3IgTWVkaWEgU3BlY2lmaWMgSW5kaWNhdGlvbnMgKi8KKy8qIEV4dGVuc2lvbiBjaGFubmVsIG9mZnNldCAqLwogI2RlZmluZSBFWFRDSEFfTk9ORQkJCTAKICNkZWZpbmUgRVhUQ0hBX0FCT1ZFCQkweDEKICNkZWZpbmUgRVhUQ0hBX0JFTE9XCQkweDMKIAotLy8gQlcKKy8qIEJXICovCiAjZGVmaW5lIEJBTkRfV0lEVEhfMjAJCTAKICNkZWZpbmUgQkFORF9XSURUSF80MAkJMQogI2RlZmluZSBCQU5EX1dJRFRIX0JPVEgJCTIKLSNkZWZpbmUgQkFORF9XSURUSF8xMAkJMwkvLyA4MDIuMTFqIGhhcyAxME1Iei4gVGhpcyBkZWZpbml0aW9uIGlzIGZvciBpbnRlcm5hbCB1c2FnZS4gZG9lc24ndCBmaWxsIGluIHRoZSBJRSBvciBvdGhlciBmaWVsZC4KLS8vIFNIT1JUR0kKLSNkZWZpbmUgR0FQX0lOVEVSVkFMXzQwMAkxCS8vIG9ubHkgc3VwcG9ydCBpbiBIVCBtb2RlCisjZGVmaW5lIEJBTkRfV0lEVEhfMTAJCTMJLyogODAyLjExaiBoYXMgMTBNSHouIFRoaXMgZGVmaW5pdGlvbiBpcyBmb3IgaW50ZXJuYWwgdXNhZ2UuIGRvZXNuJ3QgZmlsbCBpbiB0aGUgSUUgb3Igb3RoZXIgZmllbGQuICovCisvKiBTSE9SVEdJICovCisjZGVmaW5lIEdBUF9JTlRFUlZBTF80MDAJMQkvKiBvbmx5IHN1cHBvcnQgaW4gSFQgbW9kZSAqLwogI2RlZmluZSBHQVBfSU5URVJWQUxfODAwCTAKICNkZWZpbmUgR0FQX0lOVEVSVkFMX0JPVEgJMgogCkBAIC03MywyNCArNzgsMjQgQEAKICNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTICAgICAgICA4CiAjZGVmaW5lIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWCAgICAgMTYKICNkZWZpbmUgTUFDX0FERFJfTEVOR1RIICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIE1BWF9OVU1fT0ZfQ0hTCQkJCQk0OSAvLyAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJICsgNCBATU1BQyArIDExIEBIaXBlckxBTjIgKyA3IEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbmMKLSNkZWZpbmUgTUFYX05VTUJFUl9PRl9FVkVOVAkJCQkxMCAgLy8gZW50cnkgIyBpbiBFVkVOVCB0YWJsZQotI2RlZmluZSBNQVhfTlVNQkVSX09GX01BQwkJCQkzMiAvLyBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGlzIHZhbHVlIGNhbid0IGJlIGxhcmdlciB0aGFuIDIxMQorLyojZGVmaW5lIE1BWF9OVU1fT0ZfQ0hTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ5IC8vIDE0IGNoYW5uZWxzIEAyLjRHICsgIDEyQFVOSUkgKyA0IEBNTUFDICsgMTEgQEhpcGVyTEFOMiArIDcgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uYyAqLworI2RlZmluZSBNQVhfTlVNX09GX0NIUwkJCQk1NAkvKiAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJKGxvd2VyL21pZGRsZSkgKyAxNkBIaXBlckxBTjIgKyAxMUBVTklJKHVwcGVyKSArIDAgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uICovCisjZGVmaW5lIE1BWF9OVU1CRVJfT0ZfRVZFTlQJCQkJMTAJLyogZW50cnkgIyBpbiBFVkVOVCB0YWJsZSAqLworI2RlZmluZSBNQVhfTlVNQkVSX09GX01BQwkJCQkzMgkvKiBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGlzIHZhbHVlIGNhbid0IGJlIGxhcmdlciB0aGFuIDIxMSAqLwogI2RlZmluZSBNQVhfTlVNQkVSX09GX0FDTAkJCQk2NAotI2RlZmluZSBNQVhfTEVOR1RIX09GX1NVUFBPUlRfUkFURVMJCTEyICAgIC8vIDEsIDIsIDUuNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQKKyNkZWZpbmUgTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTCQkxMgkvKiAxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0ICovCiAjZGVmaW5lIE1BWF9OVU1CRVJfT0ZfRExTX0VOVFJZCQkJNAogCi0jZGVmaW5lIE9JRF9HRU5fTUFDSElORV9OQU1FICAgICAgICAgICAgICAgMHgwMDAxMDIxQQotCiAjZGVmaW5lIFJUX1FVRVJZX1NJR05BTF9DT05URVhUCQkJCTB4MDQwMgogI2RlZmluZSBSVF9TRVRfSUFQUF9QSUQgICAgICAgICAgICAgICAgIAkweDA0MDQKICNkZWZpbmUgUlRfU0VUX0FQRF9QSUQJCQkJCQkweDA0MDUKICNkZWZpbmUgUlRfU0VUX0RFTF9NQUNfRU5UUlkJCQkJMHgwNDA2Ci0KLS8vCi0vLyBJRUVFIDgwMi4xMSBPSURzCi0vLworI2RlZmluZSBSVF9RVUVSWV9FVkVOVF9UQUJMRQkJCTB4MDQwNworLyogKi8KKy8qIElFRUUgODAyLjExIE9JRHMgKi8KKy8qICovCiAjZGVmaW5lCU9JRF9HRVRfU0VUX1RPR0dMRQkJCTB4ODAwMAorI2RlZmluZQlPSURfR0VUX1NFVF9GUk9NX1VJCQkJMHg0MDAwCiAKICNkZWZpbmUgT0lEXzgwMl8xMV9BRERfV0VQCQkJMHgwMTEyCiAjZGVmaW5lIE9JRF84MDJfMTFfRElTQVNTT0NJQVRFCQkJMHgwMTE0CkBAIC0xMDEsMzggKzEwNiw0MiBAQAogCiAjZGVmaW5lCVJUX09JRF9ERVZJQ0VfTkFNRQkJCQkJCQkweDA2MDcKICNkZWZpbmUJUlRfT0lEX1ZFUlNJT05fSU5GTwkJCQkJCQkweDA2MDgKKyNkZWZpbmUJT0lEXzgwMl8xMV9CU1NJRF9MSVNUCQkJCQkJMHgwNjA5CisjZGVmaW5lCU9JRF84MDJfM19DVVJSRU5UX0FERFJFU1MJCQkJCTB4MDYwQQogI2RlZmluZQlPSURfR0VOX01FRElBX0NPTk5FQ1RfU1RBVFVTCQkJCTB4MDYwQgorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTCQkJCTB4MDYwQworI2RlZmluZQlPSURfODAyXzExX1JTU0kJCQkJCQkJCTB4MDYwRAorI2RlZmluZQlPSURfODAyXzExX1NUQVRJU1RJQ1MJCQkJCQkweDA2MEUKICNkZWZpbmUJT0lEX0dFTl9SQ1ZfT0sJCQkJCQkJCTB4MDYwRgogI2RlZmluZQlPSURfR0VOX1JDVl9OT19CVUZGRVIJCQkJCQkweDA2MTAKLQorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0VFUFJPTV9WRVJTSU9OCQkJMHgwNjExCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfRklSTVdBUkVfVkVSU0lPTgkJMHgwNjEyCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9SWF9SQVRFCQkJMHgwNjEzCisjZGVmaW5lCVJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMQkJCQkweDA2MTQKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9QSURWSUQJCQkJCTB4MDYxNQorLypmb3IgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAqLwogI2RlZmluZSBPSURfU0VUX0NPVU5URVJNRUFTVVJFUyAgICAgICAgICAgICAgICAgICAgIDB4MDYxNgogI2RlZmluZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAgICAgICAgICAgICAgIDB4MDYyMQogI2RlZmluZSBSVF9PSURfV0VfVkVSU0lPTl9DT01QSUxFRCAgICAgICAgICAgICAgICAgIDB4MDYyMgogI2RlZmluZSBSVF9PSURfTkVXX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyMwogCi0vL3J0Mjg2MCAsIGthdGh5CiAjZGVmaW5lIFJUX09JRF9EUklWRVJfREVWSUNFX05BTUUgICAgICAgICAgICAgICAgICAgMHgwNjQ1CiAjZGVmaW5lIFJUX09JRF9RVUVSWV9NVUxUSVBMRV9DQVJEX1NVUFBPUlQgICAgICAgICAgMHgwNjQ3CiAKLS8vIFJhbGluayBkZWZpbmVkIE9JRHMKLS8vIERlbm5pcyBMZWUgbW92ZSB0byBwbGF0Zm9ybSBzcGVjaWZpYwotCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1NUQVRVU19UWVBFCi17Ci0gICAgTmRpczgwMl8xMVN0YXR1c1R5cGVfQXV0aGVudGljYXRpb24sCi0gICAgTmRpczgwMl8xMVN0YXR1c1R5cGVfTWVkaWFTdHJlYW1Nb2RlLAotICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlX1BNS0lEX0NhbmRpZGF0ZUxpc3QsCi0gICAgTmRpczgwMl8xMVN0YXR1c1R5cGVNYXggICAgLy8gbm90IGEgcmVhbCB0eXBlLCBkZWZpbmVkIGFzIGFuIHVwcGVyIGJvdW5kCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1NUQVRVU19UWVBFIHsKKwlOZGlzODAyXzExU3RhdHVzVHlwZV9BdXRoZW50aWNhdGlvbiwKKwlOZGlzODAyXzExU3RhdHVzVHlwZV9NZWRpYVN0cmVhbU1vZGUsCisJTmRpczgwMl8xMVN0YXR1c1R5cGVfUE1LSURfQ2FuZGlkYXRlTGlzdCwKKwlOZGlzODAyXzExU3RhdHVzVHlwZU1heAkvKiBub3QgYSByZWFsIHR5cGUsIGRlZmluZWQgYXMgYW4gdXBwZXIgYm91bmQgKi8KIH0gTkRJU184MDJfMTFfU1RBVFVTX1RZUEUsICpQTkRJU184MDJfMTFfU1RBVFVTX1RZUEU7CiAKLXR5cGVkZWYgVUNIQVIgICBORElTXzgwMl8xMV9NQUNfQUREUkVTU1s2XTsKK3R5cGVkZWYgdTggTkRJU184MDJfMTFfTUFDX0FERFJFU1NbNl07CiAKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTgotewotICAgIE5ESVNfODAyXzExX1NUQVRVU19UWVBFIFN0YXR1c1R5cGU7Ci19IE5ESVNfODAyXzExX1NUQVRVU19JTkRJQ0FUSU9OLCAqUE5ESVNfODAyXzExX1NUQVRVU19JTkRJQ0FUSU9OOworc3RydWN0IHJ0X25kaXNfODAyXzExX3N0YXR1c19pbmRpY2F0aW9uIHsKKwlORElTXzgwMl8xMV9TVEFUVVNfVFlQRSBTdGF0dXNUeXBlOworfTsKIAotLy8gbWFzayBmb3IgYXV0aGVudGljYXRpb24vaW50ZWdyaXR5IGZpZWxkcworLyogbWFzayBmb3IgYXV0aGVudGljYXRpb24vaW50ZWdyaXR5IGZpZWxkcyAqLwogI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfQVVUSF9GSUVMRFMgICAgICAgIDB4MGYKIAogI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfUkVBVVRIICAgICAgICAgICAgIDB4MDEKQEAgLTE0MCwzMDQgKzE0OSwyODMgQEAKICNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX1BBSVJXSVNFX0VSUk9SICAgICAweDA2CiAjZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9HUk9VUF9FUlJPUiAgICAgICAgMHgwRQogCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fUkVRVUVTVAotewotICAgIFVMT05HIExlbmd0aDsgICAgICAgICAgICAvLyBMZW5ndGggb2Ygc3RydWN0dXJlCi0gICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQnNzaWQ7Ci0gICAgVUxPTkcgRmxhZ3M7Ci19IE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QsICpQTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fUkVRVUVTVDsKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV9hdXRoZW50aWNhdGlvbl9yZXF1ZXN0IHsKKwl1bnNpZ25lZCBsb25nIExlbmd0aDsJCS8qIExlbmd0aCBvZiBzdHJ1Y3R1cmUgKi8KKwlORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCc3NpZDsKKwl1bnNpZ25lZCBsb25nIEZsYWdzOworfTsKIAotLy9BZGRlZCBuZXcgdHlwZXMgZm9yIFBNS0lEIENhbmRpZGF0ZSBsaXN0cy4KLXR5cGVkZWYgc3RydWN0IF9QTUtJRF9DQU5ESURBVEUgewotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOwotICAgIFVMT05HIEZsYWdzOwotfSBQTUtJRF9DQU5ESURBVEUsICpQUE1LSURfQ0FORElEQVRFOworLypBZGRlZCBuZXcgdHlwZXMgZm9yIFBNS0lEIENhbmRpZGF0ZSBsaXN0cy4gKi8KK3N0cnVjdCBydF9wbWtpZF9jYW5kaWRhdGUgeworCU5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOworCXVuc2lnbmVkIGxvbmcgRmxhZ3M7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX0xJU1QKLXsKLSAgICBVTE9ORyBWZXJzaW9uOyAgICAgICAvLyBWZXJzaW9uIG9mIHRoZSBzdHJ1Y3R1cmUKLSAgICBVTE9ORyBOdW1DYW5kaWRhdGVzOyAvLyBOby4gb2YgcG1raWQgY2FuZGlkYXRlcwotICAgIFBNS0lEX0NBTkRJREFURSBDYW5kaWRhdGVMaXN0WzFdOwotfSBORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfTElTVCwgKlBORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfTElTVDsKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV9wbWtpZF9jYW5kaWRhdGVfbGlzdCB7CisJdW5zaWduZWQgbG9uZyBWZXJzaW9uOwkJLyogVmVyc2lvbiBvZiB0aGUgc3RydWN0dXJlICovCisJdW5zaWduZWQgbG9uZyBOdW1DYW5kaWRhdGVzOwkvKiBOby4gb2YgcG1raWQgY2FuZGlkYXRlcyAqLworCXN0cnVjdCBydF9wbWtpZF9jYW5kaWRhdGUgQ2FuZGlkYXRlTGlzdFsxXTsKK307CiAKLS8vRmxhZ3MgZm9yIFBNS0lEIENhbmRpZGF0ZSBsaXN0IHN0cnVjdHVyZQorLypGbGFncyBmb3IgUE1LSUQgQ2FuZGlkYXRlIGxpc3Qgc3RydWN0dXJlICovCiAjZGVmaW5lIE5ESVNfODAyXzExX1BNS0lEX0NBTkRJREFURV9QUkVBVVRIX0VOQUJMRUQJMHgwMQogCi0vLyBBZGRlZCBuZXcgdHlwZXMgZm9yIE9GRE0gNUcgYW5kIDIuNEcKLXR5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfTkVUV09SS19UWVBFCi17Ci0gICBOZGlzODAyXzExRkgsCi0gICBOZGlzODAyXzExRFMsCi0gICAgTmRpczgwMl8xMU9GRE01LAotICAgIE5kaXM4MDJfMTFPRkRNNV9OLAotICAgIE5kaXM4MDJfMTFPRkRNMjQsCi0gICAgTmRpczgwMl8xMU9GRE0yNF9OLAotICAgTmRpczgwMl8xMUF1dG9tb2RlLAotICAgIE5kaXM4MDJfMTFOZXR3b3JrVHlwZU1heCAgICAvLyBub3QgYSByZWFsIHR5cGUsIGRlZmluZWQgYXMgYW4gdXBwZXIgYm91bmQKKy8qIEFkZGVkIG5ldyB0eXBlcyBmb3IgT0ZETSA1RyBhbmQgMi40RyAqLwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgeworCU5kaXM4MDJfMTFGSCwKKwlOZGlzODAyXzExRFMsCisJTmRpczgwMl8xMU9GRE01LAorCU5kaXM4MDJfMTFPRkRNMjQsCisJTmRpczgwMl8xMUF1dG9tb2RlLAorCU5kaXM4MDJfMTFPRkRNNV9OLAorCU5kaXM4MDJfMTFPRkRNMjRfTiwKKwlOZGlzODAyXzExTmV0d29ya1R5cGVNYXgJLyogbm90IGEgcmVhbCB0eXBlLCBkZWZpbmVkIGFzIGFuIHVwcGVyIGJvdW5kICovCiB9IE5ESVNfODAyXzExX05FVFdPUktfVFlQRSwgKlBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEU7CiAKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9ORVRXT1JLX1RZUEVfTElTVAotewotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgIE51bWJlck9mSXRlbXM7ICAvLyBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxCi0gICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgTmV0d29ya1R5cGUgWzFdOwotfSBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEVfTElTVCwgKlBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEVfTElTVDsKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV9uZXR3b3JrX3R5cGVfbGlzdCB7CisJdTMyIE51bWJlck9mSXRlbXM7CS8qIGluIGxpc3QgYmVsb3csIGF0IGxlYXN0IDEgKi8KKwlORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgTmV0d29ya1R5cGVbMV07Cit9OwogCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1BPV0VSX01PREUKLXsKLSAgICBOZGlzODAyXzExUG93ZXJNb2RlQ0FNLAotICAgIE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQLAotICAgIE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUCwKLSAgICBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUCwKLSAgICBOZGlzODAyXzExUG93ZXJNb2RlTWF4ICAgICAgLy8gbm90IGEgcmVhbCBtb2RlLCBkZWZpbmVkIGFzIGFuIHVwcGVyIGJvdW5kCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1BPV0VSX01PREUgeworCU5kaXM4MDJfMTFQb3dlck1vZGVDQU0sCisJTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1AsCisJTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQLAorCU5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQLAorCU5kaXM4MDJfMTFQb3dlck1vZGVNYXgJLyogbm90IGEgcmVhbCBtb2RlLCBkZWZpbmVkIGFzIGFuIHVwcGVyIGJvdW5kICovCiB9IE5ESVNfODAyXzExX1BPV0VSX01PREUsICpQTkRJU184MDJfMTFfUE9XRVJfTU9ERTsKIAotdHlwZWRlZiBVTE9ORyAgIE5ESVNfODAyXzExX1RYX1BPV0VSX0xFVkVMOyAvLyBpbiBtaWxsaXdhdHRzCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgTkRJU184MDJfMTFfVFhfUE9XRVJfTEVWRUw7CS8qIGluIG1pbGxpd2F0dHMgKi8KIAotLy8KLS8vIFJlY2VpdmVkIFNpZ25hbCBTdHJlbmd0aCBJbmRpY2F0aW9uCi0vLwotdHlwZWRlZiBMT05HICAgIE5ESVNfODAyXzExX1JTU0k7ICAgICAgICAgICAvLyBpbiBkQm0KKy8qICovCisvKiBSZWNlaXZlZCBTaWduYWwgU3RyZW5ndGggSW5kaWNhdGlvbiAqLworLyogKi8KK3R5cGVkZWYgbG9uZyBORElTXzgwMl8xMV9SU1NJOwkvKiBpbiBkQm0gKi8KIAotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkgKLXsKLSAgIFVMT05HICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQotICAgVUxPTkcgICAgICAgICAgIEhvcFBhdHRlcm47ICAgICAgICAvLyBBcyBkZWZpbmVkIGJ5IDgwMi4xMSwgTVNCIHNldAotICAgVUxPTkcgICAgICAgICAgIEhvcFNldDsgICAgICAgICAgICAvLyB0byBvbmUgaWYgbm9uLTgwMi4xMQotICAgVUxPTkcgICAgICAgICAgIER3ZWxsVGltZTsgICAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKLX0gTkRJU184MDJfMTFfQ09ORklHVVJBVElPTl9GSCwgKlBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OX0ZIOworc3RydWN0IHJ0X25kaXNfODAyXzExX2NvbmZpZ3VyYXRpb25fZmggeworCXVuc2lnbmVkIGxvbmcgTGVuZ3RoOwkJLyogTGVuZ3RoIG9mIHN0cnVjdHVyZSAqLworCXVuc2lnbmVkIGxvbmcgSG9wUGF0dGVybjsJLyogQXMgZGVmaW5lZCBieSA4MDIuMTEsIE1TQiBzZXQgKi8KKwl1bnNpZ25lZCBsb25nIEhvcFNldDsJCS8qIHRvIG9uZSBpZiBub24tODAyLjExICovCisJdW5zaWduZWQgbG9uZyBEd2VsbFRpbWU7CS8qIHVuaXRzIGFyZSBLdXNlYyAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0NPTkZJR1VSQVRJT04KLXsKLSAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2Ygc3RydWN0dXJlCi0gICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYWNvblBlcmlvZDsgICAgICAgLy8gdW5pdHMgYXJlIEt1c2VjCi0gICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUSU1XaW5kb3c7ICAgICAgICAgLy8gdW5pdHMgYXJlIEt1c2VjCi0gICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIERTQ29uZmlnOyAgICAgICAgICAgLy8gRnJlcXVlbmN5LCB1bml0cyBhcmUga0h6Ci0gICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OX0ZIICAgIEZIQ29uZmlnOwotfSBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OLCAqUE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT047CitzdHJ1Y3QgcnRfbmRpc184MDJfMTFfY29uZmlndXJhdGlvbiB7CisJdW5zaWduZWQgbG9uZyBMZW5ndGg7CQkvKiBMZW5ndGggb2Ygc3RydWN0dXJlICovCisJdW5zaWduZWQgbG9uZyBCZWFjb25QZXJpb2Q7CS8qIHVuaXRzIGFyZSBLdXNlYyAqLworCXVuc2lnbmVkIGxvbmcgQVRJTVdpbmRvdzsJLyogdW5pdHMgYXJlIEt1c2VjICovCisJdW5zaWduZWQgbG9uZyBEU0NvbmZpZzsJCS8qIEZyZXF1ZW5jeSwgdW5pdHMgYXJlIGtIeiAqLworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV9jb25maWd1cmF0aW9uX2ZoIEZIQ29uZmlnOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1NUQVRJU1RJQ1MKLXsKLSAgIFVMT05HICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKLSAgIExBUkdFX0lOVEVHRVIgICBUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIEZhaWxlZENvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIFJldHJ5Q291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgTXVsdGlwbGVSZXRyeUNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIFJUU1N1Y2Nlc3NDb3VudDsKLSAgIExBUkdFX0lOVEVHRVIgICBSVFNGYWlsdXJlQ291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgQUNLRmFpbHVyZUNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIEZyYW1lRHVwbGljYXRlQ291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgUmVjZWl2ZWRGcmFnbWVudENvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudDsKLSAgIExBUkdFX0lOVEVHRVIgICBGQ1NFcnJvckNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIFRLSVBMb2NhbE1JQ0ZhaWx1cmVzOwotICAgTEFSR0VfSU5URUdFUiAgIFRLSVBSZW1vdGVNSUNFcnJvcnM7Ci0gICBMQVJHRV9JTlRFR0VSICAgVEtJUElDVkVycm9yczsKLSAgIExBUkdFX0lOVEVHRVIgICBUS0lQQ291bnRlck1lYXN1cmVzSW52b2tlZDsKLSAgIExBUkdFX0lOVEVHRVIgICBUS0lQUmVwbGF5czsKLSAgIExBUkdFX0lOVEVHRVIgICBDQ01QRm9ybWF0RXJyb3JzOwotICAgTEFSR0VfSU5URUdFUiAgIENDTVBSZXBsYXlzOwotICAgTEFSR0VfSU5URUdFUiAgIENDTVBEZWNyeXB0RXJyb3JzOwotICAgTEFSR0VfSU5URUdFUiAgIEZvdXJXYXlIYW5kc2hha2VGYWlsdXJlczsKLX0gTkRJU184MDJfMTFfU1RBVElTVElDUywgKlBORElTXzgwMl8xMV9TVEFUSVNUSUNTOworc3RydWN0IHJ0X25kaXNfODAyXzExX3N0YXRpc3RpY3MgeworCXVuc2lnbmVkIGxvbmcgTGVuZ3RoOwkJLyogTGVuZ3RoIG9mIHN0cnVjdHVyZSAqLworCUxBUkdFX0lOVEVHRVIgVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50OworCUxBUkdFX0lOVEVHRVIgTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50OworCUxBUkdFX0lOVEVHRVIgRmFpbGVkQ291bnQ7CisJTEFSR0VfSU5URUdFUiBSZXRyeUNvdW50OworCUxBUkdFX0lOVEVHRVIgTXVsdGlwbGVSZXRyeUNvdW50OworCUxBUkdFX0lOVEVHRVIgUlRTU3VjY2Vzc0NvdW50OworCUxBUkdFX0lOVEVHRVIgUlRTRmFpbHVyZUNvdW50OworCUxBUkdFX0lOVEVHRVIgQUNLRmFpbHVyZUNvdW50OworCUxBUkdFX0lOVEVHRVIgRnJhbWVEdXBsaWNhdGVDb3VudDsKKwlMQVJHRV9JTlRFR0VSIFJlY2VpdmVkRnJhZ21lbnRDb3VudDsKKwlMQVJHRV9JTlRFR0VSIE11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudDsKKwlMQVJHRV9JTlRFR0VSIEZDU0Vycm9yQ291bnQ7CisJTEFSR0VfSU5URUdFUiBUS0lQTG9jYWxNSUNGYWlsdXJlczsKKwlMQVJHRV9JTlRFR0VSIFRLSVBSZW1vdGVNSUNFcnJvcnM7CisJTEFSR0VfSU5URUdFUiBUS0lQSUNWRXJyb3JzOworCUxBUkdFX0lOVEVHRVIgVEtJUENvdW50ZXJNZWFzdXJlc0ludm9rZWQ7CisJTEFSR0VfSU5URUdFUiBUS0lQUmVwbGF5czsKKwlMQVJHRV9JTlRFR0VSIENDTVBGb3JtYXRFcnJvcnM7CisJTEFSR0VfSU5URUdFUiBDQ01QUmVwbGF5czsKKwlMQVJHRV9JTlRFR0VSIENDTVBEZWNyeXB0RXJyb3JzOworCUxBUkdFX0lOVEVHRVIgRm91cldheUhhbmRzaGFrZUZhaWx1cmVzOworfTsKIAotdHlwZWRlZiAgVUxPTkcgIE5ESVNfODAyXzExX0tFWV9JTkRFWDsKLXR5cGVkZWYgVUxPTkdMT05HICAgTkRJU184MDJfMTFfS0VZX1JTQzsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBORElTXzgwMl8xMV9LRVlfSU5ERVg7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBORElTXzgwMl8xMV9LRVlfUlNDOwogCi0jZGVmaW5lIE1BWF9SQURJVVNfU1JWX05VTQkJCTIJICAvLyA4MDIuMXggZmFpbG92ZXIgbnVtYmVyCisjZGVmaW5lIE1BWF9SQURJVVNfU1JWX05VTQkJCTIJLyogODAyLjF4IGZhaWxvdmVyIG51bWJlciAqLwogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JBRElVU19TUlZfSU5GTyB7Ci0JVUlOVDMyCQkJcmFkaXVzX2lwOwotCVVJTlQzMgkJCXJhZGl1c19wb3J0OwotCVVDSEFSCQkJcmFkaXVzX2tleVs2NF07Ci0JVUNIQVIJCQlyYWRpdXNfa2V5X2xlbjsKLX0gUkFESVVTX1NSVl9JTkZPLCAqUFJBRElVU19TUlZfSU5GTzsKK3N0cnVjdCBQQUNLRUQgcnRfcmFkaXVzX3Nydl9pbmZvIHsKKwl1MzIgcmFkaXVzX2lwOworCXUzMiByYWRpdXNfcG9ydDsKKwl1OCByYWRpdXNfa2V5WzY0XTsKKwl1OCByYWRpdXNfa2V5X2xlbjsKK307CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUkFESVVTX0tFWV9JTkZPCi17Ci0JVUNIQVIJCQlyYWRpdXNfc3J2X251bTsKLQlSQURJVVNfU1JWX0lORk8JcmFkaXVzX3Nydl9pbmZvW01BWF9SQURJVVNfU1JWX05VTV07Ci0JVUNIQVIJCQlpZWVlODAyMXhXRVA7CQkgLy8gZHluYW1pYyBXRVAKLSAgICBVQ0hBUiAgICAgICAgICAga2V5X2luZGV4OwotICAgIFVDSEFSICAgICAgICAgICBrZXlfbGVuZ3RoOyAgICAgICAgICAvLyBsZW5ndGggb2Yga2V5IGluIGJ5dGVzCi0gICAgVUNIQVIgICAgICAgICAgIGtleV9tYXRlcmlhbFsxM107Ci19IFJBRElVU19LRVlfSU5GTywgKlBSQURJVVNfS0VZX0lORk87CitzdHJ1Y3QgUEFDS0VEIHJ0X3JhZGl1c19rZXlfaW5mbyB7CisJdTggcmFkaXVzX3Nydl9udW07CisJc3RydWN0IHJ0X3JhZGl1c19zcnZfaW5mbyByYWRpdXNfc3J2X2luZm9bTUFYX1JBRElVU19TUlZfTlVNXTsKKwl1OCBpZWVlODAyMXhXRVA7CS8qIGR5bmFtaWMgV0VQICovCisJdTgga2V5X2luZGV4OworCXU4IGtleV9sZW5ndGg7CS8qIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMgKi8KKwl1OCBrZXlfbWF0ZXJpYWxbMTNdOworfTsKIAotLy8gSXQncyB1c2VkIGJ5IDgwMi4xeCBkYWVtb24gdG8gcmVxdWlyZSByZWxhdGl2ZSBjb25maWd1cmF0aW9uCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JBRElVU19DT05GCi17Ci0gICAgVUlOVDMyICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCi0gICAgVUNIQVIJCQltYnNzX251bTsJCQkvLyBpbmRpY2F0ZSBtdWx0aXBsZSBCU1MgbnVtYmVyCi0JVUlOVDMyCQkJb3duX2lwX2FkZHI7Ci0JVUlOVDMyCQkJcmV0cnlfaW50ZXJ2YWw7Ci0JVUlOVDMyCQkJc2Vzc2lvbl90aW1lb3V0X2ludGVydmFsOwotCVVDSEFSCQkJRUFQaWZuYW1lW0lGTkFNU0laXTsKLQlVQ0hBUgkJCUVBUGlmbmFtZV9sZW47Ci0JVUNIQVIgCQkJUHJlQXV0aGlmbmFtZVtJRk5BTVNJWl07Ci0JVUNIQVIJCQlQcmVBdXRoaWZuYW1lX2xlbjsKLQlSQURJVVNfS0VZX0lORk8JUmFkaXVzSW5mb1s4LypNQVhfTUJTU0lEX05VTSovXTsKLX0gUkFESVVTX0NPTkYsICpQUkFESVVTX0NPTkY7CisvKiBJdCdzIHVzZWQgYnkgODAyLjF4IGRhZW1vbiB0byByZXF1aXJlIHJlbGF0aXZlIGNvbmZpZ3VyYXRpb24gKi8KK3N0cnVjdCBQQUNLRUQgcnRfcmFkaXVzX2NvbmYgeworCXUzMiBMZW5ndGg7CQkvKiBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKwl1OCBtYnNzX251bTsJCS8qIGluZGljYXRlIG11bHRpcGxlIEJTUyBudW1iZXIgKi8KKwl1MzIgb3duX2lwX2FkZHI7CisJdTMyIHJldHJ5X2ludGVydmFsOworCXUzMiBzZXNzaW9uX3RpbWVvdXRfaW50ZXJ2YWw7CisJdTggRUFQaWZuYW1lWzhdW0lGTkFNU0laXTsKKwl1OCBFQVBpZm5hbWVfbGVuWzhdOworCXU4IFByZUF1dGhpZm5hbWVbOF1bSUZOQU1TSVpdOworCXU4IFByZUF1dGhpZm5hbWVfbGVuWzhdOworCXN0cnVjdCBydF9yYWRpdXNfa2V5X2luZm8gUmFkaXVzSW5mb1s4XTsKK307CiAKLS8vIEtleSBtYXBwaW5nIGtleXMgcmVxdWlyZSBhIEJTU0lECi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfS0VZCi17Ci0gICAgVUlOVCAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKLSAgICBVSU5UICAgICAgICAgICBLZXlJbmRleDsKLSAgICBVSU5UICAgICAgICAgICBLZXlMZW5ndGg7ICAgICAgICAgIC8vIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKLSAgICBORElTXzgwMl8xMV9LRVlfUlNDIEtleVJTQzsKLSAgICBVQ0hBUiAgICAgICAgICAgS2V5TWF0ZXJpYWxbMV07ICAgICAvLyB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkCi19IE5ESVNfODAyXzExX0tFWSwgKlBORElTXzgwMl8xMV9LRVk7CisvKiBLZXkgbWFwcGluZyBrZXlzIHJlcXVpcmUgYSBCU1NJRCAqLworc3RydWN0IHJ0X25kaXNfODAyXzExX2tleSB7CisJdTMyIExlbmd0aDsJCS8qIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZSAqLworCXUzMiBLZXlJbmRleDsKKwl1MzIgS2V5TGVuZ3RoOwkJLyogbGVuZ3RoIG9mIGtleSBpbiBieXRlcyAqLworCU5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOworCU5ESVNfODAyXzExX0tFWV9SU0MgS2V5UlNDOworCXU4IEtleU1hdGVyaWFsWzFdOwkvKiB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfUkVNT1ZFX0tFWQotewotICAgIFVJTlQgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCi0gICAgVUlOVCAgICAgICAgICAgS2V5SW5kZXg7Ci0gICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQlNTSUQ7Ci19IE5ESVNfODAyXzExX1JFTU9WRV9LRVksICpQTkRJU184MDJfMTFfUkVNT1ZFX0tFWTsKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV9wYXNzcGhyYXNlIHsKKwl1MzIgS2V5TGVuZ3RoOwkJLyogbGVuZ3RoIG9mIGtleSBpbiBieXRlcyAqLworCU5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOworCXU4IEtleU1hdGVyaWFsWzFdOwkvKiB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfV0VQCi17Ci0gICBVSU5UICAgICBMZW5ndGg7ICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKLSAgIFVJTlQgICAgIEtleUluZGV4OyAgICAgICAgICAgLy8gMCBpcyB0aGUgcGVyLWNsaWVudCBrZXksIDEtTiBhcmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2xvYmFsIGtleXMKLSAgIFVJTlQgICAgIEtleUxlbmd0aDsgICAgIC8vIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMKLSAgIFVDSEFSICAgICBLZXlNYXRlcmlhbFsxXTsvLyB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkCi19IE5ESVNfODAyXzExX1dFUCwgKlBORElTXzgwMl8xMV9XRVA7CitzdHJ1Y3QgcnRfbmRpc184MDJfMTFfcmVtb3ZlX2tleSB7CisJdTMyIExlbmd0aDsJCS8qIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZSAqLworCXUzMiBLZXlJbmRleDsKKwlORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKK307CiAKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV93ZXAgeworCXUzMiBMZW5ndGg7CQkvKiBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKwl1MzIgS2V5SW5kZXg7CQkvKiAwIGlzIHRoZSBwZXItY2xpZW50IGtleSwgMS1OIGFyZSB0aGUgKi8KKwkvKiBnbG9iYWwga2V5cyAqLworCXUzMiBLZXlMZW5ndGg7CQkvKiBsZW5ndGggb2Yga2V5IGluIGJ5dGVzICovCisJdTggS2V5TWF0ZXJpYWxbMV07CS8qIHZhcmlhYmxlIGxlbmd0aCBkZXBlbmRpbmcgb24gYWJvdmUgZmllbGQgKi8KK307CiAKLXR5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRQotewotICAgTmRpczgwMl8xMUlCU1MsCi0gICBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUsCi0gICBOZGlzODAyXzExQXV0b1Vua25vd24sCi0gICBOZGlzODAyXzExTW9uaXRvciwKLSAgIE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZU1heCAgICAgLy8gTm90IGEgcmVhbCB2YWx1ZSwgZGVmaW5lZCBhcyB1cHBlciBib3VuZAordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFIHsKKwlOZGlzODAyXzExSUJTUywKKwlOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUsCisJTmRpczgwMl8xMUF1dG9Vbmtub3duLAorCU5kaXM4MDJfMTFNb25pdG9yLAorCU5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZU1heAkvKiBOb3QgYSByZWFsIHZhbHVlLCBkZWZpbmVkIGFzIHVwcGVyIGJvdW5kICovCiB9IE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUsICpQTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRTsKIAotLy8gQWRkIG5ldyBhdXRoZW50aWNhdGlvbiBtb2RlcwotdHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCi17Ci0gICBOZGlzODAyXzExQXV0aE1vZGVPcGVuLAotICAgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkLAotICAgTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCwKLSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEsCi0gICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLLAotICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUsCi0gICBOZGlzODAyXzExQXV0aE1vZGVXUEEyLAotICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSywKLSAgIAlOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMiwKKy8qIEFkZCBuZXcgYXV0aGVudGljYXRpb24gbW9kZXMgKi8KK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSB7CisJTmRpczgwMl8xMUF1dGhNb2RlT3BlbiwKKwlOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQsCisJTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCwKKwlOZGlzODAyXzExQXV0aE1vZGVXUEEsCisJTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLLAorCU5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUsCisJTmRpczgwMl8xMUF1dGhNb2RlV1BBMiwKKwlOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLLAorCU5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyLAogCU5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLLAotICAgTmRpczgwMl8xMUF1dGhNb2RlTWF4ICAgICAgICAgICAvLyBOb3QgYSByZWFsIG1vZGUsIGRlZmluZWQgYXMgdXBwZXIgYm91bmQKKwlOZGlzODAyXzExQXV0aE1vZGVNYXgJLyogTm90IGEgcmVhbCBtb2RlLCBkZWZpbmVkIGFzIHVwcGVyIGJvdW5kICovCiB9IE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUsICpQTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERTsKIAotdHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX1JBVEVTW05ESVNfODAyXzExX0xFTkdUSF9SQVRFU107ICAgICAgICAvLyBTZXQgb2YgOCBkYXRhIHJhdGVzCi10eXBlZGVmIFVDSEFSICAgTkRJU184MDJfMTFfUkFURVNfRVhbTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYXTsgIC8vIFNldCBvZiAxNiBkYXRhIHJhdGVzCit0eXBlZGVmIHU4IE5ESVNfODAyXzExX1JBVEVTW05ESVNfODAyXzExX0xFTkdUSF9SQVRFU107CS8qIFNldCBvZiA4IGRhdGEgcmF0ZXMgKi8KK3R5cGVkZWYgdTggTkRJU184MDJfMTFfUkFURVNfRVhbTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYXTsJLyogU2V0IG9mIDE2IGRhdGEgcmF0ZXMgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9TU0lECi17Ci0gICAgVUlOVCAgIFNzaWRMZW5ndGg7ICAgICAgICAgLy8gbGVuZ3RoIG9mIFNTSUQgZmllbGQgYmVsb3csIGluIGJ5dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNhbiBiZSB6ZXJvLgotICAgIFVDSEFSICAgU3NpZFtORElTXzgwMl8xMV9MRU5HVEhfU1NJRF07ICAgICAgICAgICAvLyBTU0lEIGluZm9ybWF0aW9uIGZpZWxkCi19IE5ESVNfODAyXzExX1NTSUQsICpQTkRJU184MDJfMTFfU1NJRDsKK3N0cnVjdCBQQUNLRUQgcnRfbmRpc184MDJfMTFfc3NpZCB7CisJdTMyIFNzaWRMZW5ndGg7CS8qIGxlbmd0aCBvZiBTU0lEIGZpZWxkIGJlbG93LCBpbiBieXRlczsgKi8KKwkvKiB0aGlzIGNhbiBiZSB6ZXJvLiAqLworCXU4IFNzaWRbTkRJU184MDJfMTFfTEVOR1RIX1NTSURdOwkvKiBTU0lEIGluZm9ybWF0aW9uIGZpZWxkICovCit9OwogCitzdHJ1Y3QgUEFDS0VEIHJ0X25kaXNfd2xhbl9ic3NpZCB7CisJdW5zaWduZWQgbG9uZyBMZW5ndGg7CQkvKiBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKwlORElTXzgwMl8xMV9NQUNfQUREUkVTUyBNYWNBZGRyZXNzOwkvKiBCU1NJRCAqLworCXU4IFJlc2VydmVkWzJdOworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV9zc2lkIFNzaWQ7CS8qIFNTSUQgKi8KKwl1bnNpZ25lZCBsb25nIFByaXZhY3k7CQkvKiBXRVAgZW5jcnlwdGlvbiByZXF1aXJlbWVudCAqLworCU5ESVNfODAyXzExX1JTU0kgUnNzaTsJLyogcmVjZWl2ZSBzaWduYWwgc3RyZW5ndGggaW4gZEJtICovCisJTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlSW5Vc2U7CisJc3RydWN0IHJ0X25kaXNfODAyXzExX2NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbjsKKwlORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFIEluZnJhc3RydWN0dXJlTW9kZTsKKwlORElTXzgwMl8xMV9SQVRFUyBTdXBwb3J0ZWRSYXRlczsKK307CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU19XTEFOX0JTU0lECi17Ci0gICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKLSAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICAgICAgICAgICAgIE1hY0FkZHJlc3M7IC8vIEJTU0lECi0gICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZFsyXTsKLSAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7ICAgICAgIC8vIFNTSUQKLSAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaXZhY3k7ICAgIC8vIFdFUCBlbmNyeXB0aW9uIHJlcXVpcmVtZW50Ci0gICBORElTXzgwMl8xMV9SU1NJICAgICAgICAgICAgICAgICAgICBSc3NpOyAgICAgICAvLyByZWNlaXZlIHNpZ25hbCBzdHJlbmd0aCBpbiBkQm0KLSAgIE5ESVNfODAyXzExX05FVFdPUktfVFlQRSAgICAgICAgICAgIE5ldHdvcmtUeXBlSW5Vc2U7Ci0gICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICBDb25maWd1cmF0aW9uOwotICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgSW5mcmFzdHJ1Y3R1cmVNb2RlOwotICAgTkRJU184MDJfMTFfUkFURVMgICAgICAgICAgICAgICAgICAgU3VwcG9ydGVkUmF0ZXM7Ci19IE5ESVNfV0xBTl9CU1NJRCwgKlBORElTX1dMQU5fQlNTSUQ7CitzdHJ1Y3QgUEFDS0VEIHJ0X25kaXNfODAyXzExX2Jzc2lkX2xpc3QgeworCXUzMiBOdW1iZXJPZkl0ZW1zOwkvKiBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxICovCisJc3RydWN0IHJ0X25kaXNfd2xhbl9ic3NpZCBCc3NpZFsxXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfQlNTSURfTElTVAotewotICAgVUlOVCAgICAgICAgICAgTnVtYmVyT2ZJdGVtczsgICAgICAvLyBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxCi0gICBORElTX1dMQU5fQlNTSUQgQnNzaWRbMV07Ci19IE5ESVNfODAyXzExX0JTU0lEX0xJU1QsICpQTkRJU184MDJfMTFfQlNTSURfTElTVDsKKy8qIEFkZGVkIENhcGFiaWxpdGllcywgSUVMZW5ndGggYW5kIElFcyBmb3IgZWFjaCBCU1NJRCAqLworc3RydWN0IFBBQ0tFRCBydF9uZGlzX3dsYW5fYnNzaWRfZXggeworCXVuc2lnbmVkIGxvbmcgTGVuZ3RoOwkJLyogTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlICovCisJTkRJU184MDJfMTFfTUFDX0FERFJFU1MgTWFjQWRkcmVzczsJLyogQlNTSUQgKi8KKwl1OCBSZXNlcnZlZFsyXTsKKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfc3NpZCBTc2lkOwkvKiBTU0lEICovCisJdTMyIFByaXZhY3k7CQkvKiBXRVAgZW5jcnlwdGlvbiByZXF1aXJlbWVudCAqLworCU5ESVNfODAyXzExX1JTU0kgUnNzaTsJLyogcmVjZWl2ZSBzaWduYWwgKi8KKwkvKiBzdHJlbmd0aCBpbiBkQm0gKi8KKwlORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgTmV0d29ya1R5cGVJblVzZTsKKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfY29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uOworCU5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgSW5mcmFzdHJ1Y3R1cmVNb2RlOworCU5ESVNfODAyXzExX1JBVEVTX0VYIFN1cHBvcnRlZFJhdGVzOworCXVuc2lnbmVkIGxvbmcgSUVMZW5ndGg7CisJdTggSUVzWzFdOworfTsKIAotLy8gQWRkZWQgQ2FwYWJpbGl0aWVzLCBJRUxlbmd0aCBhbmQgSUVzIGZvciBlYWNoIEJTU0lECi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfV0xBTl9CU1NJRF9FWAotewotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCi0gICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgICAgICAgICAgICAgTWFjQWRkcmVzczsgICAgICAgICAvLyBCU1NJRAotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkWzJdOwotICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7ICAgICAgICAgICAgICAgLy8gU1NJRAotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaXZhY3k7ICAgICAgICAgICAgLy8gV0VQIGVuY3J5cHRpb24gcmVxdWlyZW1lbnQKLSAgICBORElTXzgwMl8xMV9SU1NJICAgICAgICAgICAgICAgICAgICBSc3NpOyAgICAgICAgICAgICAgIC8vIHJlY2VpdmUgc2lnbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJlbmd0aCBpbiBkQm0KLSAgICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgICAgICAgICBOZXR3b3JrVHlwZUluVXNlOwotICAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gICAgICAgICAgIENvbmZpZ3VyYXRpb247Ci0gICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgSW5mcmFzdHJ1Y3R1cmVNb2RlOwotICAgIE5ESVNfODAyXzExX1JBVEVTX0VYICAgICAgICAgICAgICAgIFN1cHBvcnRlZFJhdGVzOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFTGVuZ3RoOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFc1sxXTsKLX0gTkRJU19XTEFOX0JTU0lEX0VYLCAqUE5ESVNfV0xBTl9CU1NJRF9FWDsKK3N0cnVjdCBQQUNLRUQgcnRfbmRpc184MDJfMTFfYnNzaWRfbGlzdF9leCB7CisJdTMyIE51bWJlck9mSXRlbXM7CS8qIGluIGxpc3QgYmVsb3csIGF0IGxlYXN0IDEgKi8KKwlzdHJ1Y3QgcnRfbmRpc193bGFuX2Jzc2lkX2V4IEJzc2lkWzFdOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYCi17Ci0gICAgVUlOVCAgICAgICAgICAgICAgICAgICBOdW1iZXJPZkl0ZW1zOyAgICAgIC8vIGluIGxpc3QgYmVsb3csIGF0IGxlYXN0IDEKLSAgICBORElTX1dMQU5fQlNTSURfRVggICAgICBCc3NpZFsxXTsKLX0gTkRJU184MDJfMTFfQlNTSURfTElTVF9FWCwgKlBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYOworc3RydWN0IFBBQ0tFRCBydF9uZGlzXzgwMl8xMV9maXhlZF9pZXMgeworCXU4IFRpbWVzdGFtcFs4XTsKKwl1MTYgQmVhY29uSW50ZXJ2YWw7CisJdTE2IENhcGFiaWxpdGllczsKK307CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfRklYRURfSUVzCi17Ci0gICAgVUNIQVIgVGltZXN0YW1wWzhdOwotICAgIFVTSE9SVCBCZWFjb25JbnRlcnZhbDsKLSAgICBVU0hPUlQgQ2FwYWJpbGl0aWVzOwotfSBORElTXzgwMl8xMV9GSVhFRF9JRXMsICpQTkRJU184MDJfMTFfRklYRURfSUVzOworc3RydWN0IHJ0X25kaXNfODAyXzExX3ZhcmlhYmxlX2llcyB7CisJdTggRWxlbWVudElEOworCXU4IExlbmd0aDsJCS8qIE51bWJlciBvZiBieXRlcyBpbiBkYXRhIGZpZWxkICovCisJdTggZGF0YVsxXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMKLXsKLSAgICBVQ0hBUiBFbGVtZW50SUQ7Ci0gICAgVUNIQVIgTGVuZ3RoOyAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gZGF0YSBmaWVsZAotICAgIFVDSEFSIGRhdGFbMV07Ci19IE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcywgKlBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXM7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ7CiAKLXR5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRDsKIAotdHlwZWRlZiAgVUxPTkcgICBORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIE5ESVNfODAyXzExX0FOVEVOTkE7CiAKLXR5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfQU5URU5OQTsKLQotdHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUgotewotICAgTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGwsCi0gICBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSIHsKKwlOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbCwKKwlOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQCiB9IE5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSLCAqUE5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSOwogCi0vLyBBZGRlZCBuZXcgZW5jcnlwdGlvbiB0eXBlcwotLy8gQWxzbyBhbGlhc2VkIHR5cGVkZWYgdG8gbmV3IG5hbWUKLXR5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfV0VQX1NUQVRVUwotewotICAgTmRpczgwMl8xMVdFUEVuYWJsZWQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCA9IE5kaXM4MDJfMTFXRVBFbmFibGVkLAotICAgTmRpczgwMl8xMVdFUERpc2FibGVkLAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQsCi0gICBOZGlzODAyXzExV0VQS2V5QWJzZW50LAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUtleUFic2VudCA9IE5kaXM4MDJfMTFXRVBLZXlBYnNlbnQsCi0gICBOZGlzODAyXzExV0VQTm90U3VwcG9ydGVkLAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uTm90U3VwcG9ydGVkID0gTmRpczgwMl8xMVdFUE5vdFN1cHBvcnRlZCwKLSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkLAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMktleUFic2VudCwKLSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkLAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0tleUFic2VudCwKLSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkLAkvLyBUS0lQIG9yIEFFUyBtaXgKLSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjRLZXlBYnNlbnQsCi0gICAgTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkLAorLyogQWRkZWQgbmV3IGVuY3J5cHRpb24gdHlwZXMgKi8KKy8qIEFsc28gYWxpYXNlZCB0eXBlZGVmIHRvIG5ldyBuYW1lICovCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1dFUF9TVEFUVVMgeworCU5kaXM4MDJfMTFXRVBFbmFibGVkLAorCU5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQgPSBOZGlzODAyXzExV0VQRW5hYmxlZCwKKwlOZGlzODAyXzExV0VQRGlzYWJsZWQsCisJTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCwKKwlOZGlzODAyXzExV0VQS2V5QWJzZW50LAorCU5kaXM4MDJfMTFFbmNyeXB0aW9uMUtleUFic2VudCA9IE5kaXM4MDJfMTFXRVBLZXlBYnNlbnQsCisJTmRpczgwMl8xMVdFUE5vdFN1cHBvcnRlZCwKKwlOZGlzODAyXzExRW5jcnlwdGlvbk5vdFN1cHBvcnRlZCA9IE5kaXM4MDJfMTFXRVBOb3RTdXBwb3J0ZWQsCisJTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCwKKwlOZGlzODAyXzExRW5jcnlwdGlvbjJLZXlBYnNlbnQsCisJTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCwKKwlOZGlzODAyXzExRW5jcnlwdGlvbjNLZXlBYnNlbnQsCisJTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZCwJLyogVEtJUCBvciBBRVMgbWl4ICovCisJTmRpczgwMl8xMUVuY3J5cHRpb240S2V5QWJzZW50LAorCU5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCwKIAlOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkLAogfSBORElTXzgwMl8xMV9XRVBfU1RBVFVTLCAqUE5ESVNfODAyXzExX1dFUF9TVEFUVVMsCi0gIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTLCAqUE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTOworICAgIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTLCAqUE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTOwogCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1JFTE9BRF9ERUZBVUxUUwotewotICAgTmRpczgwMl8xMVJlbG9hZFdFUEtleXMKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfUkVMT0FEX0RFRkFVTFRTIHsKKwlOZGlzODAyXzExUmVsb2FkV0VQS2V5cwogfSBORElTXzgwMl8xMV9SRUxPQURfREVGQVVMVFMsICpQTkRJU184MDJfMTFfUkVMT0FEX0RFRkFVTFRTOwogCiAjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFUUZJX0NBUEFCSUxJVElFUyAgICAgIDEKQEAgLTQ0OCwzNTEgKzQzNiwzNDMgQEAKICNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVTRklfU1RBVFVTQ09ERSAgICAgICAgMgogI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVNGSV9BU1NPQ0lBVElPTklEICAgICA0CiAKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BSV9SRVFGSQotewotICAgIFVTSE9SVCBDYXBhYmlsaXRpZXM7Ci0gICAgVVNIT1JUIExpc3RlbkludGVydmFsOwotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICBDdXJyZW50QVBBZGRyZXNzOwotfSBORElTXzgwMl8xMV9BSV9SRVFGSSwgKlBORElTXzgwMl8xMV9BSV9SRVFGSTsKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV9haV9yZXFmaSB7CisJdTE2IENhcGFiaWxpdGllczsKKwl1MTYgTGlzdGVuSW50ZXJ2YWw7CisJTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQ3VycmVudEFQQWRkcmVzczsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BSV9SRVNGSQotewotICAgIFVTSE9SVCBDYXBhYmlsaXRpZXM7Ci0gICAgVVNIT1JUIFN0YXR1c0NvZGU7Ci0gICAgVVNIT1JUIEFzc29jaWF0aW9uSWQ7Ci19IE5ESVNfODAyXzExX0FJX1JFU0ZJLCAqUE5ESVNfODAyXzExX0FJX1JFU0ZJOworc3RydWN0IHJ0X25kaXNfODAyXzExX2FpX3Jlc2ZpIHsKKwl1MTYgQ2FwYWJpbGl0aWVzOworCXUxNiBTdGF0dXNDb2RlOworCXUxNiBBc3NvY2lhdGlvbklkOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OCi17Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgTGVuZ3RoOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZVJlcXVlc3RGaXhlZElFczsKLSAgICBORElTXzgwMl8xMV9BSV9SRVFGSSAgICBSZXF1ZXN0Rml4ZWRJRXM7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgUmVxdWVzdElFTGVuZ3RoOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgIE9mZnNldFJlcXVlc3RJRXM7Ci0gICAgVVNIT1JUICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlUmVzcG9uc2VGaXhlZElFczsKLSAgICBORElTXzgwMl8xMV9BSV9SRVNGSSAgICBSZXNwb25zZUZpeGVkSUVzOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlSUVMZW5ndGg7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgT2Zmc2V0UmVzcG9uc2VJRXM7Ci19IE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OLCAqUE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OOworc3RydWN0IHJ0X25kaXNfODAyXzExX2Fzc29jaWF0aW9uX2luZm9ybWF0aW9uIHsKKwl1bnNpZ25lZCBsb25nIExlbmd0aDsKKwl1MTYgQXZhaWxhYmxlUmVxdWVzdEZpeGVkSUVzOworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV9haV9yZXFmaSBSZXF1ZXN0Rml4ZWRJRXM7CisJdW5zaWduZWQgbG9uZyBSZXF1ZXN0SUVMZW5ndGg7CisJdW5zaWduZWQgbG9uZyBPZmZzZXRSZXF1ZXN0SUVzOworCXUxNiBBdmFpbGFibGVSZXNwb25zZUZpeGVkSUVzOworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV9haV9yZXNmaSBSZXNwb25zZUZpeGVkSUVzOworCXVuc2lnbmVkIGxvbmcgUmVzcG9uc2VJRUxlbmd0aDsKKwl1bnNpZ25lZCBsb25nIE9mZnNldFJlc3BvbnNlSUVzOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VWRU5UCi17Ci0gICAgTkRJU184MDJfMTFfU1RBVFVTX0lORElDQVRJT04gICAgICAgU3RhdHVzOwotICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QgIFJlcXVlc3RbMV07Ci19IE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VWRU5ULCAqUE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VWRU5UOworc3RydWN0IHJ0X25kaXNfODAyXzExX2F1dGhlbnRpY2F0aW9uX2V2ZW50IHsKKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfc3RhdHVzX2luZGljYXRpb24gU3RhdHVzOworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV9hdXRoZW50aWNhdGlvbl9yZXF1ZXN0IFJlcXVlc3RbMV07Cit9OwogCi0vLyA4MDIuMTEgTWVkaWEgc3RyZWFtIGNvbnN0cmFpbnRzLCBhc3NvY2lhdGVkIHdpdGggT0lEXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERQotdHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERQotewotICAgIE5kaXM4MDJfMTFNZWRpYVN0cmVhbU9mZiwKLSAgICBOZGlzODAyXzExTWVkaWFTdHJlYW1PbiwKKy8qIDgwMi4xMSBNZWRpYSBzdHJlYW0gY29uc3RyYWludHMsIGFzc29jaWF0ZWQgd2l0aCBPSURfODAyXzExX01FRElBX1NUUkVBTV9NT0RFICovCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX01FRElBX1NUUkVBTV9NT0RFIHsKKwlOZGlzODAyXzExTWVkaWFTdHJlYW1PZmYsCisJTmRpczgwMl8xMU1lZGlhU3RyZWFtT24sCiB9IE5ESVNfODAyXzExX01FRElBX1NUUkVBTV9NT0RFLCAqUE5ESVNfODAyXzExX01FRElBX1NUUkVBTV9NT0RFOwogCi0vLyBQTUtJRCBTdHJ1Y3R1cmVzCi10eXBlZGVmIFVDSEFSICAgTkRJU184MDJfMTFfUE1LSURfVkFMVUVbMTZdOworLyogUE1LSUQgU3RydWN0dXJlcyAqLwordHlwZWRlZiB1OCBORElTXzgwMl8xMV9QTUtJRF9WQUxVRVsxNl07CiAKLXR5cGVkZWYgc3RydWN0IF9CU1NJRF9JTkZPCi17Ci0gICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQlNTSUQ7Ci0gICAgTkRJU184MDJfMTFfUE1LSURfVkFMVUUgUE1LSUQ7Ci19IEJTU0lEX0lORk8sICpQQlNTSURfSU5GTzsKK3N0cnVjdCBydF9ic3NpZF9pbmZvIHsKKwlORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKKwlORElTXzgwMl8xMV9QTUtJRF9WQUxVRSBQTUtJRDsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9QTUtJRAotewotICAgIFVJTlQgICAgTGVuZ3RoOwotICAgIFVJTlQgICAgQlNTSURJbmZvQ291bnQ7Ci0gICAgQlNTSURfSU5GTyBCU1NJREluZm9bMV07Ci19IE5ESVNfODAyXzExX1BNS0lELCAqUE5ESVNfODAyXzExX1BNS0lEOworc3RydWN0IHJ0X25kaXNfODAyXzExX3Bta2lkIHsKKwl1MzIgTGVuZ3RoOworCXUzMiBCU1NJREluZm9Db3VudDsKKwlzdHJ1Y3QgcnRfYnNzaWRfaW5mbyBCU1NJREluZm9bMV07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTgotewotICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgQXV0aE1vZGVTdXBwb3J0ZWQ7Ci0gICAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgRW5jcnlwdFN0YXR1c1N1cHBvcnRlZDsKLX0gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTiwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FTkNSWVBUSU9OOworc3RydWN0IHJ0X25kaXNfODAyXzExX2F1dGhlbnRpY2F0aW9uX2VuY3J5cHRpb24geworCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgQXV0aE1vZGVTdXBwb3J0ZWQ7CisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgRW5jcnlwdFN0YXR1c1N1cHBvcnRlZDsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9DQVBBQklMSVRZCi17Ci0gICAgIFVMT05HIExlbmd0aDsKLSAgICAgVUxPTkcgVmVyc2lvbjsKLSAgICAgVUxPTkcgTm9PZlBNS0lEczsKLSAgICAgVUxPTkcgTm9PZkF1dGhFbmNyeXB0UGFpcnNTdXBwb3J0ZWQ7Ci0gICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VOQ1JZUFRJT04gQXV0aGVudGljYXRpb25FbmNyeXB0aW9uU3VwcG9ydGVkWzFdOwotfSBORElTXzgwMl8xMV9DQVBBQklMSVRZLCAqUE5ESVNfODAyXzExX0NBUEFCSUxJVFk7CitzdHJ1Y3QgcnRfbmRpc184MDJfMTFfY2FwYWJpbGl0eSB7CisJdW5zaWduZWQgbG9uZyBMZW5ndGg7CisJdW5zaWduZWQgbG9uZyBWZXJzaW9uOworCXVuc2lnbmVkIGxvbmcgTm9PZlBNS0lEczsKKwl1bnNpZ25lZCBsb25nIE5vT2ZBdXRoRW5jcnlwdFBhaXJzU3VwcG9ydGVkOworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV9hdXRoZW50aWNhdGlvbl9lbmNyeXB0aW9uCisJICAgIEF1dGhlbnRpY2F0aW9uRW5jcnlwdGlvblN1cHBvcnRlZFsxXTsKK307CiAKLSNkZWZpbmUgUlRfUFJJVl9JT0NUTF9FWFQJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MDEpIC8vIFN5bmMuIHdpdGggQVAgZm9yIHdzYyB1cG5wIGRhZW1vbgorI2RlZmluZSBSVF9QUklWX0lPQ1RMCQkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDAxKQkvKiBTeW5jLiB3aXRoIEFQIGZvciB3c2MgdXBucCBkYWVtb24gKi8KICNkZWZpbmUgUlRQUklWX0lPQ1RMX1NFVAkJCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgwMikKIAogI2RlZmluZSBSVFBSSVZfSU9DVExfU1RBVElTVElDUyAgICAgICAgICAgICAgICAgICAgIChTSU9DSVdGSVJTVFBSSVYgKyAweDA5KQogI2RlZmluZSBSVFBSSVZfSU9DVExfQUREX1BNS0lEX0NBQ0hFICAgICAgICAgICAgICAgIChTSU9DSVdGSVJTVFBSSVYgKyAweDBBKQogI2RlZmluZSBSVFBSSVZfSU9DVExfUkFESVVTX0RBVEEgICAgICAgICAgICAgICAgICAgIChTSU9DSVdGSVJTVFBSSVYgKyAweDBDKQogI2RlZmluZSBSVFBSSVZfSU9DVExfR1NJVEVTVVJWRVkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDBEKQotI2RlZmluZSBSVF9QUklWX0lPQ1RMCQkJCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgwRSkgLy8gU3luYy4gd2l0aCBSVDYxIChmb3Igd3BhX3N1cHBsaWNhbnQpCisjZGVmaW5lIFJUX1BSSVZfSU9DVExfRVhUCQkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDBFKQkvKiBTeW5jLiB3aXRoIFJUNjEgKGZvciB3cGFfc3VwcGxpY2FudCkgKi8KICNkZWZpbmUgUlRQUklWX0lPQ1RMX0dFVF9NQUNfVEFCTEUJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDBGKQogCiAjZGVmaW5lIFJUUFJJVl9JT0NUTF9TSE9XCQkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDExKQogZW51bSB7Ci0gICAgU0hPV19DT05OX1NUQVRVUyA9IDQsCi0gICAgU0hPV19EUlZJRVJfVkVSSU9OID0gNSwKLSAgICBTSE9XX0JBX0lORk8gPSA2LAorCVNIT1dfQ09OTl9TVEFUVVMgPSA0LAorCVNIT1dfRFJWSUVSX1ZFUklPTiA9IDUsCisJU0hPV19CQV9JTkZPID0gNiwKIAlTSE9XX0RFU0NfSU5GTyA9IDcsCi0jaWZkZWYgUlQyODcwCisjaWZkZWYgUlRNUF9NQUNfVVNCCiAJU0hPV19SWEJVTEtfSU5GTyA9IDgsCiAJU0hPV19UWEJVTEtfSU5GTyA9IDksCi0jZW5kaWYgLy8gUlQyODcwIC8vCi0gICAgUkFJT19PRkYgPSAxMCwKLSAgICBSQUlPX09OID0gMTEsCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisJUkFJT19PRkYgPSAxMCwKKwlSQUlPX09OID0gMTEsCiAJU0hPV19DRkdfVkFMVUUgPSAyMCwKLSNpZiAhZGVmaW5lZChSVDI4NjApCiAJU0hPV19BREhPQ19FTlRSWV9JTkZPID0gMjEsCi0jZW5kaWYKIH07CiAKLSNpZmRlZiBMTFREX1NVUFBPUlQKLS8vIGZvciBjb25zaXN0ZW5jeSB3aXRoIFJUNjEKLSNkZWZpbmUgUlRfT0lEX0dFVF9QSFlfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAweDc2MQotI2VuZGlmIC8vIExMVERfU1VQUE9SVCAvLworI2RlZmluZSBPSURfODAyXzExX0JVSUxEX0NIQU5ORUxfRVgJCQkJMHgwNzE0CisjZGVmaW5lIE9JRF84MDJfMTFfR0VUX0NIX0xJU1QJCQkJCTB4MDcxNQorI2RlZmluZSBPSURfODAyXzExX0dFVF9DT1VOVFJZX0NPREUJCQkJMHgwNzE2CisjZGVmaW5lIE9JRF84MDJfMTFfR0VUX0NIQU5ORUxfR0VPR1JBUEhZCQkweDA3MTcKIAotI2lmIGRlZmluZWQoUlQyODYwKSB8fCBkZWZpbmVkKFJUMzB4eCkKLS8vIE5ldyBmb3IgTWVldGluZ0hvdXNlIEFwaSBzdXBwb3J0CisjZGVmaW5lIFJUX09JRF9XU0NfU0VUX1BBU1NQSFJBU0UgICAgICAgICAgICAgICAgICAgMHgwNzQwCS8qIHBhc3NwaHJhc2UgZm9yIHdwYSgyKS1wc2sgKi8KKyNkZWZpbmUgUlRfT0lEX1dTQ19EUklWRVJfQVVUT19DT05ORUNUICAgICAgICAgICAgICAweDA3NDEKKyNkZWZpbmUgUlRfT0lEX1dTQ19RVUVSWV9ERUZBVUxUX1BST0ZJTEUgICAgICAgICAgICAweDA3NDIKKyNkZWZpbmUgUlRfT0lEX1dTQ19TRVRfQ09OTl9CWV9QUk9GSUxFX0lOREVYICAgICAgICAweDA3NDMKKyNkZWZpbmUgUlRfT0lEX1dTQ19TRVRfQUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAweDA3NDQKKyNkZWZpbmUgUlRfT0lEX1dTQ19TRVRfU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAweDA3NDUKKyNkZWZpbmUgUlRfT0lEX1dTQ19TRVRfUElOX0NPREUgICAgICAgICAgICAgICAgICAgICAweDA3NDYKKyNkZWZpbmUgUlRfT0lEX1dTQ19TRVRfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAweDA3NDcJLyogUElOIG9yIFBCQyAqLworI2RlZmluZSBSVF9PSURfV1NDX1NFVF9DT05GX01PREUgICAgICAgICAgICAgICAgICAgIDB4MDc0OAkvKiBFbnJvbGxlZSBvciBSZWdpc3RyYXIgKi8KKyNkZWZpbmUgUlRfT0lEX1dTQ19TRVRfUFJPRklMRSAgICAgICAgICAgICAgICAgICAgICAweDA3NDkKKyNkZWZpbmUJUlRfT0lEX1dTQ19DT05GSUdfU1RBVFVTCQkJCQkweDA3NEYKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9XU0NfUVVFUllfUFJPRklMRQkJCQkweDA3NTAKKy8qIGZvciBjb25zaXN0ZW5jeSB3aXRoIFJUNjEgKi8KKyNkZWZpbmUgUlRfT0lEX1dTQ19RVUVSWV9TVEFUVVMJCQkJCQkweDA3NTEKKyNkZWZpbmUgUlRfT0lEX1dTQ19QSU5fQ09ERQkJCQkJCQkweDA3NTIKKyNkZWZpbmUgUlRfT0lEX1dTQ19VVUlECQkJCQkJCQkweDA3NTMKKyNkZWZpbmUgUlRfT0lEX1dTQ19TRVRfU0VMRUNURURfUkVHSVNUUkFSCQkJMHgwNzU0CisjZGVmaW5lIFJUX09JRF9XU0NfRUFQTVNHCQkJCQkJCTB4MDc1NQorI2RlZmluZSBSVF9PSURfV1NDX01BTlVGQUNUVVJFUgkJCQkJCTB4MDc1NgorI2RlZmluZSBSVF9PSURfV1NDX01PREVMX05BTUUJCQkJCQkweDA3NTcKKyNkZWZpbmUgUlRfT0lEX1dTQ19NT0RFTF9OTwkJCQkJCQkweDA3NTgKKyNkZWZpbmUgUlRfT0lEX1dTQ19TRVJJQUxfTk8JCQkJCQkweDA3NTkKKyNkZWZpbmUgUlRfT0lEX1dTQ19NQUNfQUREUkVTUwkJCQkJCTB4MDc2MAorCisvKiBOZXcgZm9yIE1lZXRpbmdIb3VzZSBBcGkgc3VwcG9ydCAqLwogI2RlZmluZSBPSURfTUhfODAyXzFYX1NVUFBPUlRFRCAgICAgICAgICAgICAgIDB4RkZFREMxMDAKLSNlbmRpZgogCi0vLyBNSU1PIFR4IHBhcmFtZXRlciwgU2hvcnRHSSwgTUNTLCBTVEJDLCBldGMuICB0aGVzZSBhcmUgZmllbGRzIGluIFRYV0kuIERvbid0IGNoYW5nZSB0aGlzIGRlZmluaXRpb24hISEKLXR5cGVkZWYgdW5pb24gIF9IVFRSQU5TTUlUX1NFVFRJTkcgewotCXN0cnVjdAl7Ci0JVVNIT1JUICAgCU1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTCi0JVVNIT1JUCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegotCVVTSE9SVAkJU2hvcnRHSToxOwotCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCi0JVVNIT1JUCQlyc3Y6MjsKLQlVU0hPUlQJCVR4QkY6MTsKLQlVU0hPUlQJCU1PREU6MjsJLy8gVXNlIGRlZmluaXRpb24gTU9ERV94eHguCi0JfQlmaWVsZDsKLQlVU0hPUlQJCXdvcmQ7Ci0gfSBIVFRSQU5TTUlUX1NFVFRJTkcsICpQSFRUUkFOU01JVF9TRVRUSU5HOworLyogTUlNTyBUeCBwYXJhbWV0ZXIsIFNob3J0R0ksIE1DUywgU1RCQywgZXRjLiAgdGhlc2UgYXJlIGZpZWxkcyBpbiBUWFdJLiBEb24ndCBjaGFuZ2UgdGhpcyBkZWZpbml0aW9uISAqLwordHlwZWRlZiB1bmlvbiBfSFRUUkFOU01JVF9TRVRUSU5HIHsKKwlzdHJ1Y3QgeworCQl1MTYgTUNTOjc7CS8qIE1DUyAqLworCQl1MTYgQlc6MTsJLypjaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHogKi8KKwkJdTE2IFNob3J0R0k6MTsKKwkJdTE2IFNUQkM6MjsJLypTUEFDRSAqLworLyogICAgICB1MTYgICAgICAgICAgcnN2OjM7ICovCisJCXUxNiByc3Y6MjsKKwkJdTE2IFR4QkY6MTsKKwkJdTE2IE1PREU6MjsJLyogVXNlIGRlZmluaXRpb24gTU9ERV94eHguICovCisJfSBmaWVsZDsKKwl1MTYgd29yZDsKK30gSFRUUkFOU01JVF9TRVRUSU5HLCAqUEhUVFJBTlNNSVRfU0VUVElORzsKIAogdHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfUFJFQU1CTEUgewotICAgIFJ0ODAyXzExUHJlYW1ibGVMb25nLAotICAgIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCwKLSAgICBSdDgwMl8xMVByZWFtYmxlQXV0bworCVJ0ODAyXzExUHJlYW1ibGVMb25nLAorCVJ0ODAyXzExUHJlYW1ibGVTaG9ydCwKKwlSdDgwMl8xMVByZWFtYmxlQXV0bwogfSBSVF84MDJfMTFfUFJFQU1CTEUsICpQUlRfODAyXzExX1BSRUFNQkxFOwogCi0vLyBPbmx5IGZvciBTVEEsIG5lZWQgdG8gc3luYyB3aXRoIEFQCiB0eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9QSFlfTU9ERSB7CiAJUEhZXzExQkdfTUlYRUQgPSAwLAogCVBIWV8xMUIsCiAJUEhZXzExQSwKIAlQSFlfMTFBQkdfTUlYRUQsCiAJUEhZXzExRywKLQlQSFlfMTFBQkdOX01JWEVELAkvLyBib3RoIGJhbmQgICA1Ci0JUEhZXzExTl8yXzRHLAkJLy8gMTFuLW9ubHkgd2l0aCAyLjRHIGJhbmQgICAJNgotCVBIWV8xMUdOX01JWEVELAkvLyAyLjRHIGJhbmQgICAgICA3Ci0JUEhZXzExQU5fTUlYRUQsCS8vIDVHICBiYW5kICAgICAgIDgKLQlQSFlfMTFCR05fTUlYRUQsCS8vIGlmIGNoZWNrIDgwMi4xMWIuICAgICAgOQotCVBIWV8xMUFHTl9NSVhFRCwJLy8gaWYgY2hlY2sgODAyLjExYi4gICAgICAxMAotCVBIWV8xMU5fNUcsCQkJLy8gMTFuLW9ubHkgd2l0aCA1RyBiYW5kCQkxMQorCVBIWV8xMUFCR05fTUlYRUQsCS8qIGJvdGggYmFuZCAgIDUgKi8KKwlQSFlfMTFOXzJfNEcsCQkvKiAxMW4tb25seSB3aXRoIDIuNEcgYmFuZCAgICAgIDYgKi8KKwlQSFlfMTFHTl9NSVhFRCwJCS8qIDIuNEcgYmFuZCAgICAgIDcgKi8KKwlQSFlfMTFBTl9NSVhFRCwJCS8qIDVHICBiYW5kICAgICAgIDggKi8KKwlQSFlfMTFCR05fTUlYRUQsCS8qIGlmIGNoZWNrIDgwMi4xMWIuICAgICAgOSAqLworCVBIWV8xMUFHTl9NSVhFRCwJLyogaWYgY2hlY2sgODAyLjExYi4gICAgICAxMCAqLworCVBIWV8xMU5fNUcsCQkvKiAxMW4tb25seSB3aXRoIDVHIGJhbmQgICAgICAgICAgICAgICAgMTEgKi8KIH0gUlRfODAyXzExX1BIWV9NT0RFOwogCi0vLyBwdXQgYWxsIHByb3ByaWV0ZXJ5IGZvci1xdWVyeSBvYmplY3RzIGhlcmUgdG8gcmVkdWNlICMgb2YgUXVlcnlfT0lECi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0xJTktfU1RBVFVTIHsKLSAgICBVTE9ORyAgIEN1cnJUeFJhdGU7ICAgICAgICAgLy8gaW4gdW5pdHMgb2YgMC41TWJwcwotICAgIFVMT05HICAgQ2hhbm5lbFF1YWxpdHk7ICAgICAvLyAwLi4xMDAgJQotICAgIFVMT05HICAgVHhCeXRlQ291bnQ7ICAgICAgICAvLyBib3RoIG9rIGFuZCBmYWlsCi0gICAgVUxPTkcgICBSeEJ5dGVDb3VudDsgICAgICAgIC8vIGJvdGggb2sgYW5kIGZhaWwKLSAgICBVTE9ORwlDZW50cmFsQ2hhbm5lbDsJCS8vIDQwTUh6IGNlbnRyYWwgY2hhbm5lbCBudW1iZXIKLX0gUlRfODAyXzExX0xJTktfU1RBVFVTLCAqUFJUXzgwMl8xMV9MSU5LX1NUQVRVUzsKKy8qIHB1dCBhbGwgcHJvcHJpZXRlcnkgZm9yLXF1ZXJ5IG9iamVjdHMgaGVyZSB0byByZWR1Y2UgIyBvZiBRdWVyeV9PSUQgKi8KK3N0cnVjdCBydF84MDJfMTFfbGlua19zdGF0dXMgeworCXVuc2lnbmVkIGxvbmcgQ3VyclR4UmF0ZTsJLyogaW4gdW5pdHMgb2YgMC41TWJwcyAqLworCXVuc2lnbmVkIGxvbmcgQ2hhbm5lbFF1YWxpdHk7CS8qIDAuLjEwMCAlICovCisJdW5zaWduZWQgbG9uZyBUeEJ5dGVDb3VudDsJLyogYm90aCBvayBhbmQgZmFpbCAqLworCXVuc2lnbmVkIGxvbmcgUnhCeXRlQ291bnQ7CS8qIGJvdGggb2sgYW5kIGZhaWwgKi8KKwl1bnNpZ25lZCBsb25nIENlbnRyYWxDaGFubmVsOwkvKiA0ME1IeiBjZW50cmFsIGNoYW5uZWwgbnVtYmVyICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0VWRU5UX0xPRyB7Ci0gICAgTEFSR0VfSU5URUdFUiAgIFN5c3RlbVRpbWU7ICAvLyB0aW1lc3RhbW1wIHZpYSBOZGlzR2V0Q3VycmVudFN5c3RlbVRpbWUoKQotICAgIFVDSEFSICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTkdUSF07Ci0gICAgVVNIT1JUICAgICAgICAgIEV2ZW50OyAgICAgICAvLyBFVkVOVF94eHgKLX0gUlRfODAyXzExX0VWRU5UX0xPRywgKlBSVF84MDJfMTFfRVZFTlRfTE9HOworc3RydWN0IHJ0XzgwMl8xMV9ldmVudF9sb2cgeworCUxBUkdFX0lOVEVHRVIgU3lzdGVtVGltZTsJLyogdGltZXN0YW1tcCB2aWEgTmRpc0dldEN1cnJlbnRTeXN0ZW1UaW1lKCkgKi8KKwl1OCBBZGRyW01BQ19BRERSX0xFTkdUSF07CisJdTE2IEV2ZW50OwkJLyogRVZFTlRfeHh4ICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0VWRU5UX1RBQkxFIHsKLSAgICBVTE9ORyAgICAgICBOdW07Ci0gICAgVUxPTkcgICAgICAgUnN2OyAgICAgLy8gdG8gYWxpZ24gTG9nW10gYXQgTEFSR0VfSU5FR0VSIGJvdW5kYXJ5Ci0gICAgUlRfODAyXzExX0VWRU5UX0xPRyAgIExvZ1tNQVhfTlVNQkVSX09GX0VWRU5UXTsKLX0gUlRfODAyXzExX0VWRU5UX1RBQkxFLCBQUlRfODAyXzExX0VWRU5UX1RBQkxFOworc3RydWN0IHJ0XzgwMl8xMV9ldmVudF90YWJsZSB7CisJdW5zaWduZWQgbG9uZyBOdW07CisJdW5zaWduZWQgbG9uZyBSc3Y7CQkvKiB0byBhbGlnbiBMb2dbXSBhdCBMQVJHRV9JTkVHRVIgYm91bmRhcnkgKi8KKwlzdHJ1Y3QgcnRfODAyXzExX2V2ZW50X2xvZyBMb2dbTUFYX05VTUJFUl9PRl9FVkVOVF07Cit9OwogCi0vLyBNSU1PIFR4IHBhcmFtZXRlciwgU2hvcnRHSSwgTUNTLCBTVEJDLCBldGMuICB0aGVzZSBhcmUgZmllbGRzIGluIFRYV0kuIERvbid0IGNoYW5nZSB0aGlzIGRlZmluaXRpb24hISEKLXR5cGVkZWYgdW5pb24gIF9NQUNIVFRSQU5TTUlUX1NFVFRJTkcgewotCXN0cnVjdAl7Ci0JVVNIT1JUICAgCU1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTCi0JVVNIT1JUCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegotCVVTSE9SVAkJU2hvcnRHSToxOwotCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCi0JVVNIT1JUCQlyc3Y6MzsKLQlVU0hPUlQJCU1PREU6MjsJLy8gVXNlIGRlZmluaXRpb24gTU9ERV94eHguCi0JfQlmaWVsZDsKLQlVU0hPUlQJCXdvcmQ7Ci0gfSBNQUNIVFRSQU5TTUlUX1NFVFRJTkcsICpQTUFDSFRUUkFOU01JVF9TRVRUSU5HOworLyogTUlNTyBUeCBwYXJhbWV0ZXIsIFNob3J0R0ksIE1DUywgU1RCQywgZXRjLiAgdGhlc2UgYXJlIGZpZWxkcyBpbiBUWFdJLiBEb24ndCBjaGFuZ2UgdGhpcyBkZWZpbml0aW9uISAqLwordHlwZWRlZiB1bmlvbiBfTUFDSFRUUkFOU01JVF9TRVRUSU5HIHsKKwlzdHJ1Y3QgeworCQl1MTYgTUNTOjc7CS8qIE1DUyAqLworCQl1MTYgQlc6MTsJLypjaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHogKi8KKwkJdTE2IFNob3J0R0k6MTsKKwkJdTE2IFNUQkM6MjsJLypTUEFDRSAqLworCQl1MTYgcnN2OjM7CisJCXUxNiBNT0RFOjI7CS8qIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LiAqLworCX0gZmllbGQ7CisJdTE2IHdvcmQ7Cit9IE1BQ0hUVFJBTlNNSVRfU0VUVElORywgKlBNQUNIVFRSQU5TTUlUX1NFVFRJTkc7CiAKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfTUFDX0VOVFJZIHsKLSAgICBVQ0hBUiAgICAgICBBZGRyW01BQ19BRERSX0xFTkdUSF07Ci0gICAgVUNIQVIgICAgICAgQWlkOwotICAgIFVDSEFSICAgICAgIFBzbTsgICAgIC8vIDA6UFdSX0FDVElWRSwgMTpQV1JfU0FWRQotICAgIFVDSEFSCQlNaW1vUHM7ICAvLyAwOk1NUFNfU1RBVElDLCAxOk1NUFNfRFlOQU1JQywgMzpNTVBTX0VuYWJsZWQKLSAgICBDSEFSCQlBdmdSc3NpMDsKLQlDSEFSCQlBdmdSc3NpMTsKLQlDSEFSCQlBdmdSc3NpMjsKLQlVSU5UMzIJCUNvbm5lY3RlZFRpbWU7Ci0gICAgTUFDSFRUUkFOU01JVF9TRVRUSU5HCVR4UmF0ZTsKLX0gUlRfODAyXzExX01BQ19FTlRSWSwgKlBSVF84MDJfMTFfTUFDX0VOVFJZOworc3RydWN0IHJ0XzgwMl8xMV9tYWNfZW50cnkgeworCXU4IEFkZHJbTUFDX0FERFJfTEVOR1RIXTsKKwl1OCBBaWQ7CisJdTggUHNtOwkJLyogMDpQV1JfQUNUSVZFLCAxOlBXUl9TQVZFICovCisJdTggTWltb1BzOwkJLyogMDpNTVBTX1NUQVRJQywgMTpNTVBTX0RZTkFNSUMsIDM6TU1QU19FbmFibGVkICovCisJY2hhciBBdmdSc3NpMDsKKwljaGFyIEF2Z1Jzc2kxOworCWNoYXIgQXZnUnNzaTI7CisJdTMyIENvbm5lY3RlZFRpbWU7CisJTUFDSFRUUkFOU01JVF9TRVRUSU5HIFR4UmF0ZTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfTUFDX1RBQkxFIHsKLSAgICBVTE9ORyAgICAgICBOdW07Ci0gICAgUlRfODAyXzExX01BQ19FTlRSWSBFbnRyeVtNQVhfTlVNQkVSX09GX01BQ107Ci19IFJUXzgwMl8xMV9NQUNfVEFCTEUsICpQUlRfODAyXzExX01BQ19UQUJMRTsKK3N0cnVjdCBydF84MDJfMTFfbWFjX3RhYmxlIHsKKwl1bnNpZ25lZCBsb25nIE51bTsKKwlzdHJ1Y3QgcnRfODAyXzExX21hY19lbnRyeSBFbnRyeVtNQVhfTlVNQkVSX09GX01BQ107Cit9OwogCi0vLyBzdHJ1Y3R1cmUgZm9yIHF1ZXJ5L3NldCBoYXJkd2FyZSByZWdpc3RlciAtIE1BQywgQkJQLCBSRiByZWdpc3RlcgotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9IQVJEV0FSRV9SRUdJU1RFUiB7Ci0gICAgVUxPTkcgICBIYXJkd2FyZVR5cGU7ICAgICAgIC8vIDA6TUFDLCAxOkJCUCwgMjpSRiByZWdpc3RlciwgMzpFRVBST00KLSAgICBVTE9ORyAgIE9mZnNldDsgICAgICAgICAgICAgLy8gUS9TIHJlZ2lzdGVyIG9mZnNldCBhZGRyCi0gICAgVUxPTkcgICBEYXRhOyAgICAgICAgICAgICAgIC8vIFIvVyBkYXRhIGJ1ZmZlcgotfSBSVF84MDJfMTFfSEFSRFdBUkVfUkVHSVNURVIsICpQUlRfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSOworLyogc3RydWN0dXJlIGZvciBxdWVyeS9zZXQgaGFyZHdhcmUgcmVnaXN0ZXIgLSBNQUMsIEJCUCwgUkYgcmVnaXN0ZXIgKi8KK3N0cnVjdCBydF84MDJfMTFfaGFyZHdhcmVfcmVnaXN0ZXIgeworCXVuc2lnbmVkIGxvbmcgSGFyZHdhcmVUeXBlOwkvKiAwOk1BQywgMTpCQlAsIDI6UkYgcmVnaXN0ZXIsIDM6RUVQUk9NICovCisJdW5zaWduZWQgbG9uZyBPZmZzZXQ7CQkvKiBRL1MgcmVnaXN0ZXIgb2Zmc2V0IGFkZHIgKi8KKwl1bnNpZ25lZCBsb25nIERhdGE7CQkvKiBSL1cgZGF0YSBidWZmZXIgKi8KK307CiAKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfQVBfQ09ORklHIHsKLSAgICBVTE9ORyAgIEVuYWJsZVR4QnVyc3Q7ICAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZQotICAgIFVMT05HICAgRW5hYmxlVHVyYm9SYXRlOyAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlIDcyLzEwMG1icHMgdHVyYm8gcmF0ZQotICAgIFVMT05HICAgSXNvbGF0ZUludGVyU3RhVHJhZmZpYzsgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUgaXNvbGF0aW9uCi0gICAgVUxPTkcgICBIaWRlU3NpZDsgICAgICAgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUgaGlkaW5nCi0gICAgVUxPTkcgICBVc2VCR1Byb3RlY3Rpb247ICAgIC8vIDAtQVVUTywgMS1hbHdheXMgT04sIDItYWx3YXlzIE9GRgotICAgIFVMT05HICAgVXNlU2hvcnRTbG90VGltZTsgICAvLyAwLW5vIHVzZSwgMS11c2UgOS11cyBzaG9ydCBzbG90IHRpbWUKLSAgICBVTE9ORyAgIFJzdjE7ICAgICAgICAgICAgICAgLy8gbXVzdCBiZSAwCi0gICAgVUxPTkcgICBTeXN0ZW1FcnJvckJpdG1hcDsgIC8vIGlnbm9yZSB1cG9uIFNFVCwgcmV0dXJuIHN5c3RlbSBlcnJvciB1cG9uIFFVRVJZCi19IFJUXzgwMl8xMV9BUF9DT05GSUcsICpQUlRfODAyXzExX0FQX0NPTkZJRzsKK3N0cnVjdCBydF84MDJfMTFfYXBfY29uZmlnIHsKKwl1bnNpZ25lZCBsb25nIEVuYWJsZVR4QnVyc3Q7CS8qIDAtZGlzYWJsZSwgMS1lbmFibGUgKi8KKwl1bnNpZ25lZCBsb25nIEVuYWJsZVR1cmJvUmF0ZTsJLyogMC1kaXNhYmxlLCAxLWVuYWJsZSA3Mi8xMDBtYnBzIHR1cmJvIHJhdGUgKi8KKwl1bnNpZ25lZCBsb25nIElzb2xhdGVJbnRlclN0YVRyYWZmaWM7CS8qIDAtZGlzYWJsZSwgMS1lbmFibGUgaXNvbGF0aW9uICovCisJdW5zaWduZWQgbG9uZyBIaWRlU3NpZDsJCS8qIDAtZGlzYWJsZSwgMS1lbmFibGUgaGlkaW5nICovCisJdW5zaWduZWQgbG9uZyBVc2VCR1Byb3RlY3Rpb247CS8qIDAtQVVUTywgMS1hbHdheXMgT04sIDItYWx3YXlzIE9GRiAqLworCXVuc2lnbmVkIGxvbmcgVXNlU2hvcnRTbG90VGltZTsJLyogMC1ubyB1c2UsIDEtdXNlIDktdXMgc2hvcnQgc2xvdCB0aW1lICovCisJdW5zaWduZWQgbG9uZyBSc3YxOwkJLyogbXVzdCBiZSAwICovCisJdW5zaWduZWQgbG9uZyBTeXN0ZW1FcnJvckJpdG1hcDsJLyogaWdub3JlIHVwb24gU0VULCByZXR1cm4gc3lzdGVtIGVycm9yIHVwb24gUVVFUlkgKi8KK307CiAKLS8vIHN0cnVjdHVyZSB0byBxdWVyeS9zZXQgU1RBX0NPTkZJRwotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9TVEFfQ09ORklHIHsKLSAgICBVTE9ORyAgIEVuYWJsZVR4QnVyc3Q7ICAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZQotICAgIFVMT05HICAgRW5hYmxlVHVyYm9SYXRlOyAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlIDcyLzEwMG1icHMgdHVyYm8gcmF0ZQotICAgIFVMT05HICAgVXNlQkdQcm90ZWN0aW9uOyAgICAvLyAwLUFVVE8sIDEtYWx3YXlzIE9OLCAyLWFsd2F5cyBPRkYKLSAgICBVTE9ORyAgIFVzZVNob3J0U2xvdFRpbWU7ICAgLy8gMC1ubyB1c2UsIDEtdXNlIDktdXMgc2hvcnQgc2xvdCB0aW1lIHdoZW4gYXBwbGljYWJsZQotICAgIFVMT05HICAgQWRob2NNb2RlOyAJCQkvLyAwLTExYiByYXRlcyBvbmx5IChXSUZJIHNwZWMpLCAxIC0gYi9nIG1peGVkLCAyIC0gZyBvbmx5Ci0gICAgVUxPTkcgICBId1JhZGlvU3RhdHVzOyAgICAgIC8vIDAtT0ZGLCAxLU9OLCBkZWZhdWx0IGlzIDEsIFJlYWQtT25seQotICAgIFVMT05HICAgUnN2MTsgICAgICAgICAgICAgICAvLyBtdXN0IGJlIDAKLSAgICBVTE9ORyAgIFN5c3RlbUVycm9yQml0bWFwOyAgLy8gaWdub3JlIHVwb24gU0VULCByZXR1cm4gc3lzdGVtIGVycm9yIHVwb24gUVVFUlkKLX0gUlRfODAyXzExX1NUQV9DT05GSUcsICpQUlRfODAyXzExX1NUQV9DT05GSUc7CisvKiBzdHJ1Y3R1cmUgdG8gcXVlcnkvc2V0IFNUQV9DT05GSUcgKi8KK3N0cnVjdCBydF84MDJfMTFfc3RhX2NvbmZpZyB7CisJdW5zaWduZWQgbG9uZyBFbmFibGVUeEJ1cnN0OwkvKiAwLWRpc2FibGUsIDEtZW5hYmxlICovCisJdW5zaWduZWQgbG9uZyBFbmFibGVUdXJib1JhdGU7CS8qIDAtZGlzYWJsZSwgMS1lbmFibGUgNzIvMTAwbWJwcyB0dXJibyByYXRlICovCisJdW5zaWduZWQgbG9uZyBVc2VCR1Byb3RlY3Rpb247CS8qIDAtQVVUTywgMS1hbHdheXMgT04sIDItYWx3YXlzIE9GRiAqLworCXVuc2lnbmVkIGxvbmcgVXNlU2hvcnRTbG90VGltZTsJLyogMC1ubyB1c2UsIDEtdXNlIDktdXMgc2hvcnQgc2xvdCB0aW1lIHdoZW4gYXBwbGljYWJsZSAqLworCXVuc2lnbmVkIGxvbmcgQWRob2NNb2RlOwkvKiAwLTExYiByYXRlcyBvbmx5IChXSUZJIHNwZWMpLCAxIC0gYi9nIG1peGVkLCAyIC0gZyBvbmx5ICovCisJdW5zaWduZWQgbG9uZyBId1JhZGlvU3RhdHVzOwkvKiAwLU9GRiwgMS1PTiwgZGVmYXVsdCBpcyAxLCBSZWFkLU9ubHkgKi8KKwl1bnNpZ25lZCBsb25nIFJzdjE7CQkvKiBtdXN0IGJlIDAgKi8KKwl1bnNpZ25lZCBsb25nIFN5c3RlbUVycm9yQml0bWFwOwkvKiBpZ25vcmUgdXBvbiBTRVQsIHJldHVybiBzeXN0ZW0gZXJyb3IgdXBvbiBRVUVSWSAqLworfTsKIAotLy8KLS8vICBGb3IgT0lEIFF1ZXJ5IG9yIFNldCBhYm91dCBCQSBzdHJ1Y3R1cmUKLS8vCi10eXBlZGVmCXN0cnVjdAlfT0lEX0JBQ0FQX1NUUlVDCXsKLQkJVUNIQVIJCVJ4QkFXaW5MaW1pdDsKLQkJVUNIQVIJCVR4QkFXaW5MaW1pdDsKLQkJVUNIQVIJCVBvbGljeTsJLy8gMDogREVMQVlfQkEgMTpJTU1FRF9CQSAgKC8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lKSAgIDI6QkEtbm90IHVzZS4gb3RoZXIgdmFsdWUgaW52YWxpZAotCQlVQ0hBUgkJTXBkdURlbnNpdHk7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UuIG90aGVyIHZhbHVlIGludmFsaWQKLQkJVUNIQVIgICAgICAgCUFtc2R1RW5hYmxlOwkvL0VuYWJsZSBBTVNEVSB0cmFuc21pc3N0aW9uCi0JCVVDSEFSICAgICAgIAlBbXNkdVNpemU7CS8vIDA6MzgzOSwgMTo3OTM1IGJ5dGVzLiBVSU5UICBNU0RVU2l6ZVRvQnl0ZXNbXQk9IHsgMzgzOSwgNzkzNX07Ci0JCVVDSEFSICAgICAgIAlNTVBTbW9kZTsJLy8gTUlNTyBwb3dlciBzYXZlIG1vcmUsIDA6c3RhdGljLCAxOmR5bmFtaWMsIDI6cnN2LCAzOm1pbW8gZW5hYmxlCi0JCUJPT0xFQU4JCUF1dG9CQTsJLy8gQXV0byBCQSB3aWxsIGF1dG9tYXRpY2FsbHkKLX0gT0lEX0JBQ0FQX1NUUlVDLCAqUE9JRF9CQUNBUF9TVFJVQzsKKy8qICovCisvKiAgRm9yIE9JRCBRdWVyeSBvciBTZXQgYWJvdXQgQkEgc3RydWN0dXJlICovCisvKiAqLworc3RydWN0IHJ0X29pZF9iYWNhcCB7CisJdTggUnhCQVdpbkxpbWl0OworCXU4IFR4QkFXaW5MaW1pdDsKKwl1OCBQb2xpY3k7CQkvKiAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlLiBvdGhlciB2YWx1ZSBpbnZhbGlkICovCisJdTggTXBkdURlbnNpdHk7CS8qIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UuIG90aGVyIHZhbHVlIGludmFsaWQgKi8KKwl1OCBBbXNkdUVuYWJsZTsJLypFbmFibGUgQU1TRFUgdHJhbnNtaXNzdGlvbiAqLworCXU4IEFtc2R1U2l6ZTsJLyogMDozODM5LCAxOjc5MzUgYnl0ZXMuIHUzMiAgTVNEVVNpemVUb0J5dGVzW10gICAgICAgID0geyAzODM5LCA3OTM1fTsgKi8KKwl1OCBNTVBTbW9kZTsJCS8qIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLCAwOnN0YXRpYywgMTpkeW5hbWljLCAyOnJzdiwgMzptaW1vIGVuYWJsZSAqLworCUJPT0xFQU4gQXV0b0JBOwkJLyogQXV0byBCQSB3aWxsIGF1dG9tYXRpY2FsbHkgKi8KK307CiAKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfQUNMX0VOVFJZIHsKLSAgICBVQ0hBUiAgIEFkZHJbTUFDX0FERFJfTEVOR1RIXTsKLSAgICBVU0hPUlQgIFJzdjsKLX0gUlRfODAyXzExX0FDTF9FTlRSWSwgKlBSVF84MDJfMTFfQUNMX0VOVFJZOworc3RydWN0IHJ0XzgwMl8xMV9hY2xfZW50cnkgeworCXU4IEFkZHJbTUFDX0FERFJfTEVOR1RIXTsKKwl1MTYgUnN2OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVF84MDJfMTFfQUNMIHsKLSAgICBVTE9ORyAgIFBvbGljeTsgICAgICAgICAgICAgLy8gMC1kaXNhYmxlLCAxLXBvc2l0aXZlIGxpc3QsIDItbmVnYXRpdmUgbGlzdAotICAgIFVMT05HICAgTnVtOwotICAgIFJUXzgwMl8xMV9BQ0xfRU5UUlkgRW50cnlbTUFYX05VTUJFUl9PRl9BQ0xdOwotfSBSVF84MDJfMTFfQUNMLCAqUFJUXzgwMl8xMV9BQ0w7CitzdHJ1Y3QgUEFDS0VEIHJ0X3J0XzgwMl8xMV9hY2wgeworCXVuc2lnbmVkIGxvbmcgUG9saWN5OwkJLyogMC1kaXNhYmxlLCAxLXBvc2l0aXZlIGxpc3QsIDItbmVnYXRpdmUgbGlzdCAqLworCXVuc2lnbmVkIGxvbmcgTnVtOworCXN0cnVjdCBydF84MDJfMTFfYWNsX2VudHJ5IEVudHJ5W01BWF9OVU1CRVJfT0ZfQUNMXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfV0RTIHsKLSAgICBVTE9ORwkJCQkJCU51bTsKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUwkJRW50cnlbMjQvKk1BWF9OVU1fT0ZfV0RTX0xJTksqL107Ci0JVUxPTkcJCQkJCQlLZXlMZW5ndGg7Ci0JVUNIQVIJCQkJCQlLZXlNYXRlcmlhbFszMl07Ci19IFJUXzgwMl8xMV9XRFMsICpQUlRfODAyXzExX1dEUzsKK3N0cnVjdCBydF84MDJfMTFfd2RzIHsKKwl1bnNpZ25lZCBsb25nIE51bTsKKwlORElTXzgwMl8xMV9NQUNfQUREUkVTUyBFbnRyeVsyNCAvKk1BWF9OVU1fT0ZfV0RTX0xJTksgKi8gXTsKKwl1bnNpZ25lZCBsb25nIEtleUxlbmd0aDsKKwl1OCBLZXlNYXRlcmlhbFszMl07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX1RYX1JBVEVTXyB7Ci0gICAgVUNIQVIgICAgICAgU3VwUmF0ZUxlbjsKLSAgICBVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFU107Ci0gICAgVUNIQVIgICAgICAgRXh0UmF0ZUxlbjsKLSAgICBVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFU107Ci19IFJUXzgwMl8xMV9UWF9SQVRFUywgKlBSVF84MDJfMTFfVFhfUkFURVM7CitzdHJ1Y3QgcnRfODAyXzExX3R4X3JhdGVzIHsKKwl1OCBTdXBSYXRlTGVuOworCXU4IFN1cFJhdGVbTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTXTsKKwl1OCBFeHRSYXRlTGVuOworCXU4IEV4dFJhdGVbTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTXTsKK307CiAKLQotLy8gRGVmaW5pdGlvbiBvZiBleHRyYSBpbmZvcm1hdGlvbiBjb2RlCi0jZGVmaW5lCUdFTkVSQUxfTElOS19VUAkJCTB4MAkJCS8vIExpbmsgaXMgVXAKLSNkZWZpbmUJR0VORVJBTF9MSU5LX0RPV04JCTB4MQkJCS8vIExpbmsgaXMgRG93bgotI2RlZmluZQlIV19SQURJT19PRkYJCQkweDIJCQkvLyBIYXJkd2FyZSByYWRpbyBvZmYKLSNkZWZpbmUJU1dfUkFESU9fT0ZGCQkJMHgzCQkJLy8gU29mdHdhcmUgcmFkaW8gb2ZmCi0jZGVmaW5lCUFVVEhfRkFJTAkJCQkweDQJCQkvLyBPcGVuIGF1dGhlbnRpY2F0aW9uIGZhaWwKLSNkZWZpbmUJQVVUSF9GQUlMX0tFWVMJCQkweDUJCQkvLyBTaGFyZWQgYXV0aGVudGljYXRpb24gZmFpbAotI2RlZmluZQlBU1NPQ19GQUlMCQkJCTB4NgkJCS8vIEFzc29jaWF0aW9uIGZhaWxlZAotI2RlZmluZQlFQVBfTUlDX0ZBSUxVUkUJCQkweDcJCQkvLyBEZWF1dGhlbmNhdGlvbiBiZWNhdXNlIE1JQyBmYWlsdXJlCi0jZGVmaW5lCUVBUF80V0FZX1RJTUVPVVQJCTB4OAkJCS8vIERlYXV0aGVuY2F0aW9uIG9uIDQtd2F5IGhhbmRzaGFrZSB0aW1lb3V0Ci0jZGVmaW5lCUVBUF9HUk9VUF9LRVlfVElNRU9VVAkweDkJCQkvLyBEZWF1dGhlbmNhdGlvbiBvbiBncm91cCBrZXkgaGFuZHNoYWtlIHRpbWVvdXQKLSNkZWZpbmUJRUFQX1NVQ0NFU1MJCQkJMHhhCQkJLy8gRUFQIHN1Y2NlZWQKLSNkZWZpbmUJREVURUNUX1JBREFSX1NJR05BTAkJMHhiICAgICAgICAgLy8gUmFkYXIgc2lnbmFsIG9jY3VyIGluIGN1cnJlbnQgY2hhbm5lbAotI2RlZmluZSBFWFRSQV9JTkZPX01BWAkJCTB4YgkJCS8vIEluZGljYXRlIExhc3QgT0lECisvKiBEZWZpbml0aW9uIG9mIGV4dHJhIGluZm9ybWF0aW9uIGNvZGUgKi8KKyNkZWZpbmUJR0VORVJBTF9MSU5LX1VQCQkJMHgwCS8qIExpbmsgaXMgVXAgKi8KKyNkZWZpbmUJR0VORVJBTF9MSU5LX0RPV04JCTB4MQkvKiBMaW5rIGlzIERvd24gKi8KKyNkZWZpbmUJSFdfUkFESU9fT0ZGCQkJMHgyCS8qIEhhcmR3YXJlIHJhZGlvIG9mZiAqLworI2RlZmluZQlTV19SQURJT19PRkYJCQkweDMJLyogU29mdHdhcmUgcmFkaW8gb2ZmICovCisjZGVmaW5lCUFVVEhfRkFJTAkJCQkweDQJLyogT3BlbiBhdXRoZW50aWNhdGlvbiBmYWlsICovCisjZGVmaW5lCUFVVEhfRkFJTF9LRVlTCQkJMHg1CS8qIFNoYXJlZCBhdXRoZW50aWNhdGlvbiBmYWlsICovCisjZGVmaW5lCUFTU09DX0ZBSUwJCQkJMHg2CS8qIEFzc29jaWF0aW9uIGZhaWxlZCAqLworI2RlZmluZQlFQVBfTUlDX0ZBSUxVUkUJCQkweDcJLyogRGVhdXRoZW5jYXRpb24gYmVjYXVzZSBNSUMgZmFpbHVyZSAqLworI2RlZmluZQlFQVBfNFdBWV9USU1FT1VUCQkweDgJLyogRGVhdXRoZW5jYXRpb24gb24gNC13YXkgaGFuZHNoYWtlIHRpbWVvdXQgKi8KKyNkZWZpbmUJRUFQX0dST1VQX0tFWV9USU1FT1VUCTB4OQkvKiBEZWF1dGhlbmNhdGlvbiBvbiBncm91cCBrZXkgaGFuZHNoYWtlIHRpbWVvdXQgKi8KKyNkZWZpbmUJRUFQX1NVQ0NFU1MJCQkJMHhhCS8qIEVBUCBzdWNjZWVkICovCisjZGVmaW5lCURFVEVDVF9SQURBUl9TSUdOQUwJCTB4YgkvKiBSYWRhciBzaWduYWwgb2NjdXIgaW4gY3VycmVudCBjaGFubmVsICovCisjZGVmaW5lIEVYVFJBX0lORk9fTUFYCQkJMHhiCS8qIEluZGljYXRlIExhc3QgT0lEICovCiAKICNkZWZpbmUgRVhUUkFfSU5GT19DTEVBUgkJMHhmZmZmZmZmZgogCi0vLyBUaGlzIGlzIE9JRCBzZXR0aW5nIHN0cnVjdHVyZS4gU28gb25seSBHRiBvciBNTSBhcyBNb2RlLiBUaGlzIGlzIHZhbGlkIHdoZW4gb3VyIHdpcmVsc3MgbW9kZSBoYXMgODAyLjExbiBpbiB1c2UuCi10eXBlZGVmIHN0cnVjdCB7Ci0JUlRfODAyXzExX1BIWV9NT0RFCQlQaHlNb2RlOyAJLy8KLQlVQ0hBUgkJVHJhbnNtaXRObzsKLQlVQ0hBUgkJSHRNb2RlOyAJLy9IVE1PREVfR0Ygb3IgSFRNT0RFX01NCi0JVUNIQVIJCUV4dE9mZnNldDsJLy9leHRlbnNpb24gY2hhbm5lbCBhYm92ZSBvciBiZWxvdwotCVVDSEFSCQlNQ1M7Ci0JVUNIQVIgICAJQlc7Ci0JVUNIQVIJCVNUQkM7Ci0JVUNIQVIJCVNIT1JUR0k7Ci0JVUNIQVIJCXJzdjsKLX0gT0lEX1NFVF9IVF9QSFlNT0RFLCAqUE9JRF9TRVRfSFRfUEhZTU9ERTsKLQotI2lmZGVmIExMVERfU1VQUE9SVAotdHlwZWRlZiBzdHJ1Y3QgX1JUX0xMVERfQVNTT0lDQVRJT05fRU5UUlkgewotICAgIFVDSEFSICAgICAgICAgICBBZGRyW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107Ci0gICAgdW5zaWduZWQgc2hvcnQgIE1PUjsgICAgICAgIC8vIG1heGltdW0gb3BlcmF0aW9uYWwgcmF0ZQotICAgIFVDSEFSICAgICAgICAgICBwaHlNb2RlOwotfSBSVF9MTFREX0FTU09JQ0FUSU9OX0VOVFJZLCAqUFJUX0xMVERfQVNTT0lDQVRJT05fRU5UUlk7Ci0KLXR5cGVkZWYgc3RydWN0IF9SVF9MTFREX0FTU09JQ0FUSU9OX1RBQkxFIHsKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgTnVtOwotICAgIFJUX0xMVERfQVNTT0lDQVRJT05fRU5UUlkgICBFbnRyeVtNQVhfTlVNQkVSX09GX01BQ107Ci19IFJUX0xMVERfQVNTT0lDQVRJT05fVEFCTEUsICpQUlRfTExURF9BU1NPSUNBVElPTl9UQUJMRTsKLSNlbmRpZiAvLyBMTFREX1NVUFBPUlQgLy8KKy8qIFRoaXMgaXMgT0lEIHNldHRpbmcgc3RydWN0dXJlLiBTbyBvbmx5IEdGIG9yIE1NIGFzIE1vZGUuIFRoaXMgaXMgdmFsaWQgd2hlbiBvdXIgd2lyZWxzcyBtb2RlIGhhcyA4MDIuMTFuIGluIHVzZS4gKi8KK3N0cnVjdCBydF9vaWRfc2V0X2h0X3BoeW1vZGUgeworCVJUXzgwMl8xMV9QSFlfTU9ERSBQaHlNb2RlOwkvKiAqLworCXU4IFRyYW5zbWl0Tm87CisJdTggSHRNb2RlOwkJLypIVE1PREVfR0Ygb3IgSFRNT0RFX01NICovCisJdTggRXh0T2Zmc2V0OwkvKmV4dGVuc2lvbiBjaGFubmVsIGFib3ZlIG9yIGJlbG93ICovCisJdTggTUNTOworCXU4IEJXOworCXU4IFNUQkM7CisJdTggU0hPUlRHSTsKKwl1OCByc3Y7Cit9OwogCiAjZGVmaW5lIE1BWF9DVVNUT01fTEVOIDEyOAogCi10eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9EX0NMSUVOVF9NT0RFCi17Ci0gICBSdDgwMl8xMV9EX05vbmUsCi0gICBSdDgwMl8xMV9EX0ZsZXhpYmxlLAotICAgUnQ4MDJfMTFfRF9TdHJpY3QsCit0eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9EX0NMSUVOVF9NT0RFIHsKKwlSdDgwMl8xMV9EX05vbmUsCisJUnQ4MDJfMTFfRF9GbGV4aWJsZSwKKwlSdDgwMl8xMV9EX1N0cmljdCwKIH0gUlRfODAyXzExX0RfQ0xJRU5UX01PREUsICpQUlRfODAyXzExX0RfQ0xJRU5UX01PREU7CiAKLXR5cGVkZWYgc3RydWN0IF9SVF9DSEFOTkVMX0xJU1RfSU5GTwotewotCVVDSEFSIENoYW5uZWxMaXN0W01BWF9OVU1fT0ZfQ0hTXTsgICAvLyBsaXN0IGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMgZm9yIHNpdGUgc3VydmV5Ci0JVUNIQVIgQ2hhbm5lbExpc3ROdW07IC8vIG51bWJlciBvZiBjaGFubmVsIGluIENoYW5uZWxMaXN0W10KLX0gUlRfQ0hBTk5FTF9MSVNUX0lORk8sICpQUlRfQ0hBTk5FTF9MSVNUX0lORk87CitzdHJ1Y3QgcnRfY2hhbm5lbF9saXN0X2luZm8geworCXU4IENoYW5uZWxMaXN0W01BWF9OVU1fT0ZfQ0hTXTsJLyogbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleSAqLworCXU4IENoYW5uZWxMaXN0TnVtOwkvKiBudW1iZXIgb2YgY2hhbm5lbCBpbiBDaGFubmVsTGlzdFtdICovCit9OwogCi0jaWZkZWYgUlQyODcwCi0vLyBXU0MgY29uZmlndXJlZCBjcmVkZW50aWFsCi10eXBlZGVmCXN0cnVjdAlfV1NDX0NSRURFTlRJQUwKLXsKLQlORElTXzgwMl8xMV9TU0lECVNTSUQ7CQkJCS8vIG1hbmRhdG9yeQotCVVTSE9SVAkJCQlBdXRoVHlwZTsJCQkvLyBtYW5kYXRvcnksIDE6IG9wZW4sIDI6IHdwYS1wc2ssIDQ6IHNoYXJlZCwgODp3cGEsIDB4MTA6IHdwYTIsIDB4MjA6IHdwYTItcHNrCi0JVVNIT1JUCQkJCUVuY3JUeXBlOwkJCS8vIG1hbmRhdG9yeSwgMTogbm9uZSwgMjogd2VwLCA0OiB0a2lwLCA4OiBhZXMKLQlVQ0hBUgkJCQlLZXlbNjRdOwkJCS8vIG1hbmRhdG9yeSwgTWF4aW11bSA2NCBieXRlCi0JVVNIT1JUCQkJCUtleUxlbmd0aDsKLQlVQ0hBUgkJCQlNYWNBZGRyWzZdOwkJCS8vIG1hbmRhdG9yeSwgQVAgTUFDIGFkZHJlc3MKLQlVQ0hBUgkJCQlLZXlJbmRleDsJCQkvLyBvcHRpb25hbCwgZGVmYXVsdCBpcyAxCi0JVUNIQVIJCQkJUnN2ZFszXTsJCQkvLyBNYWtlIGFsaWdubWVudAotfQlXU0NfQ1JFREVOVElBTCwgKlBXU0NfQ1JFREVOVElBTDsKKy8qIFdTQyBjb25maWd1cmVkIGNyZWRlbnRpYWwgKi8KK3N0cnVjdCBydF93c2NfY3JlZGVudGlhbCB7CisJc3RydWN0IHJ0X25kaXNfODAyXzExX3NzaWQgU1NJRDsJLyogbWFuZGF0b3J5ICovCisJdTE2IEF1dGhUeXBlOwkvKiBtYW5kYXRvcnksIDE6IG9wZW4sIDI6IHdwYS1wc2ssIDQ6IHNoYXJlZCwgODp3cGEsIDB4MTA6IHdwYTIsIDB4MjA6IHdwYTItcHNrICovCisJdTE2IEVuY3JUeXBlOwkvKiBtYW5kYXRvcnksIDE6IG5vbmUsIDI6IHdlcCwgNDogdGtpcCwgODogYWVzICovCisJdTggS2V5WzY0XTsJCS8qIG1hbmRhdG9yeSwgTWF4aW11bSA2NCBieXRlICovCisJdTE2IEtleUxlbmd0aDsKKwl1OCBNYWNBZGRyWzZdOwkvKiBtYW5kYXRvcnksIEFQIE1BQyBhZGRyZXNzICovCisJdTggS2V5SW5kZXg7CQkvKiBvcHRpb25hbCwgZGVmYXVsdCBpcyAxICovCisJdTggUnN2ZFszXTsJCS8qIE1ha2UgYWxpZ25tZW50ICovCit9OwogCi0vLyBXU0MgY29uZmlndXJlZCBwcm9maWxlcwotdHlwZWRlZglzdHJ1Y3QJX1dTQ19QUk9GSUxFCi17Ci0JVUlOVAkJCVByb2ZpbGVDbnQ7Ci0JV1NDX0NSRURFTlRJQUwJUHJvZmlsZVs4XTsJCQkJLy8gU3VwcG9ydCB1cCB0byA4IHByb2ZpbGVzCi19CVdTQ19QUk9GSUxFLCAqUFdTQ19QUk9GSUxFOwotI2VuZGlmCisvKiBXU0MgY29uZmlndXJlZCBwcm9maWxlcyAqLworc3RydWN0IHJ0X3dzY19wcm9maWxlIHsKKwl1MzIgUHJvZmlsZUNudDsKKwl1MzIgQXBwbHlQcm9maWxlSWR4OwkvKiBhZGQgYnkgam9obmxpLCBmaXggV1BTIHRlc3QgcGxhbiA1LjEuMSAqLworCXN0cnVjdCBydF93c2NfY3JlZGVudGlhbCBQcm9maWxlWzhdOwkvKiBTdXBwb3J0IHVwIHRvIDggcHJvZmlsZXMgKi8KK307CiAKLSNlbmRpZiAvLyBfT0lEX0hfCi0KKyNlbmRpZiAvKiBfT0lEX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3BjaV9tYWluX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9wY2lfbWFpbl9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWY0MzA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9wY2lfbWFpbl9kZXYuYwpAQCAtMCwwICsxLDExOTAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgcGNpX21haW5fZGV2LmMKKworICAgIEFic3RyYWN0OgorICAgIENyZWF0ZSBhbmQgcmVnaXN0ZXIgbmV0d29yayBpbnRlcmZhY2UgZm9yIFBDSSBiYXNlZCBjaGlwc2V0cyBpbiBMaW51eCBwbGF0Zm9ybS4KKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisvKiBGb2xsb3dpbmcgaW5mb3JtYXRpb24gd2lsbCBiZSBzaG93IHdoZW4geW91IHJ1biAnbW9kaW5mbycgKi8KKy8qICoqKiBJZiB5b3UgaGF2ZSBhIHNvbHV0aW9uIGZvciB0aGUgYnVnIGluIGN1cnJlbnQgdmVyc2lvbiBvZiBkcml2ZXIsIHBsZWFzZSBtYWlsIHRvIG1lLiAqLworLyogT3RoZXJ3aXNlIHBvc3QgdG8gZm9ydW0gaW4gcmFsaW5rdGVjaCdzIHdlYiBzaXRlKHd3dy5yYWxpbmt0ZWNoLmNvbSkgYW5kIGxldCBhbGwgdXNlcnMgaGVscCB5b3UuICoqKiAqLworTU9EVUxFX0FVVEhPUigiSmV0dCBDaGVuIDxqZXR0X2NoZW5AcmFsaW5rdGVjaC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJUMjg2MC9SVDMwOTAgV2lyZWxlc3MgTGFuIExpbnV4IERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJydDMwOTBzdGEiKTsKKworLyogKi8KKy8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLworLyogKi8KK2V4dGVybiBpbnQgcnQyOHh4X2Nsb3NlKElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKK2V4dGVybiBpbnQgcnQyOHh4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcnQyODYwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpOworc3RhdGljIGludCBfX2RldmluaXQgcnQyODYwX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgdm9pZCBfX2V4aXQgcnQyODYwX2NsZWFudXBfbW9kdWxlKHZvaWQpOworc3RhdGljIGludCBfX2luaXQgcnQyODYwX2luaXRfbW9kdWxlKHZvaWQpOworCitzdGF0aWMgdm9pZCBSVE1QSW5pdFBDSWVEZXZpY2UoSU4gc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCisJCQkgICAgICAgc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBydDI4NjBfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK3N0YXRpYyBpbnQgcnQyODYwX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldik7CisjZW5kaWYgLyogQ09ORklHX1BNIC8vICovCisKKy8qICovCisvKiBSYWxpbmsgUENJIGRldmljZSB0YWJsZSwgaW5jbHVkZSBhbGwgc3VwcG9ydGVkIGNoaXBzZXRzICovCisvKiAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJ0Mjg2MF9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKyNpZmRlZiBSVDI4NjAKKwl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMjg2MF9QQ0lfREVWSUNFX0lEKX0sCS8qUlQyODYwMi40RyAqLworCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMyODYwX1BDSWVfREVWSUNFX0lEKX0sCisJe1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzI3NjBfUENJX0RFVklDRV9JRCl9LAorCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMyNzkwX1BDSWVfREVWSUNFX0lEKX0sCisJe1BDSV9ERVZJQ0UoVkVOX0FXVF9QQ0lfVkVORE9SX0lELCBWRU5fQVdUX1BDSWVfREVWSUNFX0lEKX0sCisJe1BDSV9ERVZJQ0UoRURJTUFYX1BDSV9WRU5ET1JfSUQsIDB4NzcwOCl9LAorCXtQQ0lfREVWSUNFKEVESU1BWF9QQ0lfVkVORE9SX0lELCAweDc3MjgpfSwKKwl7UENJX0RFVklDRShFRElNQVhfUENJX1ZFTkRPUl9JRCwgMHg3NzU4KX0sCisJe1BDSV9ERVZJQ0UoRURJTUFYX1BDSV9WRU5ET1JfSUQsIDB4NzcyNyl9LAorCXtQQ0lfREVWSUNFKEVESU1BWF9QQ0lfVkVORE9SX0lELCAweDc3MzgpfSwKKwl7UENJX0RFVklDRShFRElNQVhfUENJX1ZFTkRPUl9JRCwgMHg3NzQ4KX0sCisJe1BDSV9ERVZJQ0UoRURJTUFYX1BDSV9WRU5ET1JfSUQsIDB4Nzc2OCl9LAorI2VuZGlmCisjaWZkZWYgUlQzMDkwCisJe1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzMwOTBfUENJZV9ERVZJQ0VfSUQpfSwKKwl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMzA5MV9QQ0llX0RFVklDRV9JRCl9LAorCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMzMDkyX1BDSWVfREVWSUNFX0lEKX0sCisjZW5kaWYgLyogUlQzMDkwIC8vICovCisjaWZkZWYgUlQzMzkwCisJe1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzMzOTBfUENJZV9ERVZJQ0VfSUQpfSwKKwl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMzM5MV9QQ0llX0RFVklDRV9JRCl9LAorCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMzMzkyX1BDSWVfREVWSUNFX0lEKX0sCisjZW5kaWYgLyogUlQzMzkwIC8vICovCisJezAsfQkJCS8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcnQyODYwX3BjaV90YmwpOworI2lmZGVmIE1PRFVMRV9WRVJTSU9OCitNT0RVTEVfVkVSU0lPTihTVEFfRFJJVkVSX1ZFUlNJT04pOworI2VuZGlmCisKKy8qICovCisvKiBPdXIgUENJIGRyaXZlciBzdHJ1Y3R1cmUgKi8KKy8qICovCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcnQyODYwX2RyaXZlciA9IHsKK25hbWU6CSJydDI4NjAiLAoraWRfdGFibGU6cnQyODYwX3BjaV90YmwsCitwcm9iZToJcnQyODYwX3Byb2JlLAorcmVtb3ZlOl9fZGV2ZXhpdF9wKHJ0Mjg2MF9yZW1vdmVfb25lKSwKKyNpZmRlZiBDT05GSUdfUE0KK3N1c3BlbmQ6cnQyODYwX3N1c3BlbmQsCityZXN1bWU6cnQyODYwX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVBDSSBkZXZpY2UgaW5pdGlhbGl6YXRpb24gcmVsYXRlZCBwcm9jZWR1cmVzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ09ORklHX1BNCisKK3ZvaWQgUlQyODYwUmVqZWN0UGVuZGluZ1BhY2tldHMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCS8qIGNsZWFyIFBTIHBhY2tldHMgKi8KKwkvKiBjbGVhciBUeFN3IHBhY2tldHMgKi8KK30KKworc3RhdGljIGludCBydDI4NjBfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopTlVMTDsKKwlpbnQgcmV0dmFsID0gMDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3N1c3BlbmQoKVxuIikpOworCisJaWYgKG5ldF9kZXYgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJuZXRfZGV2ID09IE5VTEwhXG4iKSk7CisJfSBlbHNlIHsKKwkJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBuZXRfZGV2KTsKKworCQkvKiB3ZSBjYW4gbm90IHVzZSBJRkZfVVAgYmVjYXVzZSByYTAgZG93biBidXQgcmExIHVwICovCisJCS8qIGFuZCAxIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIGZvciAxIG1vZHVsZSwgbm90IGZvciBlYWNoIGludGVyZmFjZSAqLworCQkvKiBzbyBMaW51eCB3aWxsIGNhbGwgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb24gb25jZSAqLworCQlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA+IDApIHsKKwkJCS8qIGF2b2lkIHVzZXJzIGRvIHN1c3BlbmQgYWZ0ZXIgaW50ZXJmYWNlIGlzIGRvd24gKi8KKworCQkJLyogc3RvcCBpbnRlcmZhY2UgKi8KKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldF9kZXYpOworCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKKworCQkJLyogbWFyayBkZXZpY2UgYXMgcmVtb3ZlZCBmcm9tIHN5c3RlbSBhbmQgdGhlcmVmb3JlIG5vIGxvbmdlciBhdmFpbGFibGUgKi8KKwkJCW5ldGlmX2RldmljZV9kZXRhY2gobmV0X2Rldik7CisKKwkJCS8qIG1hcmsgaGFsdCBmbGFnICovCisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKwkJCS8qIHRha2UgZG93biB0aGUgZGV2aWNlICovCisJCQlydDI4eHhfY2xvc2UoKHN0cnVjdCBuZXRfZGV2aWNlICopbmV0X2Rldik7CisKKwkJCVJUX01PRF9ERUNfVVNFX0NPVU5UKCk7CisJCX0KKwl9CisKKwkvKiByZWZlcmVuY2UgdG8gaHR0cDovL3Zvdm8yMDAwLmNvbS90eXBlLWxhYi9saW51eC9rZXJuZWwtYXBpL2xpbnV4LWtlcm5lbC1hcGkuaHRtbCAqLworCS8qIGVuYWJsZSBkZXZpY2UgdG8gZ2VuZXJhdGUgUE1FIyB3aGVuIHN1c3BlbmRlZCAqLworCS8qIHBjaV9jaG9vc2Vfc3RhdGUoKTogQ2hvb3NlIHRoZSBwb3dlciBzdGF0ZSBvZiBhIFBDSSBkZXZpY2UgdG8gYmUgc3VzcGVuZGVkICovCisJcmV0dmFsID0gcGNpX2VuYWJsZV93YWtlKHBjaV9kZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGNpX2Rldiwgc3RhdGUpLCAxKTsKKwkvKiBzYXZlIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBvZiBhIGRldmljZSBiZWZvcmUgc3VzcGVuZGluZyAqLworCXBjaV9zYXZlX3N0YXRlKHBjaV9kZXYpOworCS8qIGRpc2FibGUgUENJIGRldmljZSBhZnRlciB1c2UgKi8KKwlwY2lfZGlzYWJsZV9kZXZpY2UocGNpX2Rldik7CisKKwlyZXR2YWwgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGNpX2Rldiwgc3RhdGUpKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX3N1c3BlbmQoKVxuIikpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgcnQyODYwX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKU5VTEw7CisJaW50IHJldHZhbDsKKworCS8qIHNldCB0aGUgcG93ZXIgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlICovCisJLyogUENJIGhhcyA0IHBvd2VyIHN0YXRlcywgRE8gKG5vcm1hbCkgfiBEMyhsZXNzIHBvd2VyKSAqLworCS8qIGluIGluY2x1ZGUvbGludXgvcGNpLmgsIHlvdSBjYW4gZmluZCB0aGF0ICovCisJLyogI2RlZmluZSBQQ0lfRDAgICAgICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAwKSAqLworCS8qICNkZWZpbmUgUENJX0QxICAgICAgICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgMSkgKi8KKwkvKiAjZGVmaW5lIFBDSV9EMiAgICAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDIpICovCisJLyogI2RlZmluZSBQQ0lfRDNob3QgICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAzKSAqLworCS8qICNkZWZpbmUgUENJX0QzY29sZCAgICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgNCkgKi8KKwkvKiAjZGVmaW5lIFBDSV9VTktOT1dOICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDUpICovCisJLyogI2RlZmluZSBQQ0lfUE9XRVJfRVJST1IgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAtMSkgKi8KKwlyZXR2YWwgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIFBDSV9EMCk7CisKKwkvKiByZXN0b3JlIHRoZSBzYXZlZCBzdGF0ZSBvZiBhIFBDSSBkZXZpY2UgKi8KKwlwY2lfcmVzdG9yZV9zdGF0ZShwY2lfZGV2KTsKKworCS8qIGluaXRpYWxpemUgZGV2aWNlIGJlZm9yZSBpdCdzIHVzZWQgYnkgYSBkcml2ZXIgKi8KKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpIHsKKwkJcHJpbnRrKCJwY2kgZW5hYmxlIGZhaWwhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NjBfcmVzdW1lKClcbiIpKTsKKworCWlmIChuZXRfZGV2ID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgibmV0X2RldiA9PSBOVUxMIVxuIikpOworCX0gZWxzZQorCQlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIG5ldF9kZXYpOworCisJaWYgKHBBZCAhPSBOVUxMKSB7CisJCS8qIHdlIGNhbiBub3QgdXNlIElGRl9VUCBiZWNhdXNlIHJhMCBkb3duIGJ1dCByYTEgdXAgKi8KKwkJLyogYW5kIDEgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb24gZm9yIDEgbW9kdWxlLCBub3QgZm9yIGVhY2ggaW50ZXJmYWNlICovCisJCS8qIHNvIExpbnV4IHdpbGwgY2FsbCBzdXNwZW5kL3Jlc3VtZSBmdW5jdGlvbiBvbmNlICovCisJCWlmIChWSVJUVUFMX0lGX05VTShwQWQpID4gMCkgeworCQkJLyogbWFyayBkZXZpY2UgYXMgYXR0YWNoZWQgZnJvbSBzeXN0ZW0gYW5kIHJlc3RhcnQgaWYgbmVlZGVkICovCisJCQluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldF9kZXYpOworCisJCQlpZiAocnQyOHh4X29wZW4oKHN0cnVjdCBuZXRfZGV2aWNlICopbmV0X2RldikgIT0gMCkgeworCQkJCS8qIG9wZW4gZmFpbCAqLworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCI8PT09IHJ0Mjg2MF9yZXN1bWUoKVxuIikpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJLyogaW5jcmVhc2UgTU9EVUxFIHVzZSBjb3VudCAqLworCQkJUlRfTU9EX0lOQ19VU0VfQ09VTlQoKTsKKworCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKKwkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKKworCQkJbmV0aWZfc3RhcnRfcXVldWUobmV0X2Rldik7CisJCQluZXRpZl9jYXJyaWVyX29uKG5ldF9kZXYpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShuZXRfZGV2KTsKKwkJfQorCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX3Jlc3VtZSgpXG4iKSk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNIC8vICovCisKK3N0YXRpYyBpbnQgX19pbml0IHJ0Mjg2MF9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZydDI4NjBfZHJpdmVyKTsKK30KKworLyogKi8KKy8qIERyaXZlciBtb2R1bGUgdW5sb2FkIGZ1bmN0aW9uICovCisvKiAqLworc3RhdGljIHZvaWQgX19leGl0IHJ0Mjg2MF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcnQyODYwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHJ0Mjg2MF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChydDI4NjBfY2xlYW51cF9tb2R1bGUpOworCisvKiAqLworLyogUENJIGRldmljZSBwcm9iZSAmIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uICovCisvKiAqLworc3RhdGljIGludCBfX2RldmluaXQgcnQyODYwX3Byb2JlKElOIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAorCQkJCSAgSU4gY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKU5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisJdm9pZCAqaGFuZGxlOworCWNoYXIgKnByaW50X25hbWU7CisJdW5zaWduZWQgbG9uZyBjc3JfYWRkcjsKKwlpbnQgcnYgPSAwOworCXN0cnVjdCBydF9ydG1wX29zX25ldGRldl9vcF9ob29rIG5ldERldkhvb2s7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjg2MF9wcm9iZVxuIikpOworCisvKlBDSURldkluaXQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJLyogd2FrZSB1cCBhbmQgZW5hYmxlIGRldmljZSAqLworCWlmICgocnYgPSBwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkgIT0gMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIkVuYWJsZSBQQ0kgZGV2aWNlIGZhaWxlZCwgZXJybm89JWQhXG4iLCBydikpOworCQlyZXR1cm4gcnY7CisJfQorCisJcHJpbnRfbmFtZSA9IChjaGFyICopcGNpX25hbWUocGNpX2Rldik7CisKKwlpZiAoKHJ2ID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2lfZGV2LCBwcmludF9uYW1lKSkgIT0gMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIlJlcXVlc3QgUENJIHJlc291cmNlIGZhaWxlZCwgZXJybm89JWQhXG4iLCBydikpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIG1hcCBwaHlzaWNhbCBhZGRyZXNzIHRvIHZpcnR1YWwgYWRkcmVzcyBmb3IgYWNjZXNzaW5nIHJlZ2lzdGVyICovCisJY3NyX2FkZHIgPQorCSAgICAodW5zaWduZWQgbG9uZylpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKSwKKwkJCQkgICBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApKTsKKwlpZiAoIWNzcl9hZGRyKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiaW9yZW1hcCBmYWlsZWQgZm9yIGRldmljZSAlcywgcmVnaW9uIDB4JWxYIEAgMHglbFhcbiIsCisJCQkgIHByaW50X25hbWUsICh1bnNpZ25lZCBsb25nKXBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCksCisJCQkgICh1bnNpZ25lZCBsb25nKXBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKSkpOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIlczogYXQgMHglbHgsIFZBIDB4JWx4LCBJUlEgJWQuIFxuIiwgcHJpbnRfbmFtZSwKKwkJCSAgKHVuc2lnbmVkIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLAorCQkJICAodW5zaWduZWQgbG9uZyljc3JfYWRkciwgcGNpX2Rldi0+aXJxKSk7CisJfQorCisJLyogU2V0IERNQSBtYXN0ZXIgKi8KKwlwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKKworLypSdG1wRGV2SW5pdD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwkvKiBBbGxvY2F0ZSBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyIGFkYXB0ZXIgc3RydWN0dXJlICovCisJaGFuZGxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG9zX2Nvb2tpZSksIEdGUF9LRVJORUwpOworCWlmIChoYW5kbGUgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzKCk6IEFsbG9jYXRlIG1lbW9yeSBmb3Igb3MgaGFuZGxlIGZhaWxlZCFcbiIsCisJCQkgIF9fZnVuY19fKSk7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCSgoc3RydWN0IG9zX2Nvb2tpZSAqKWhhbmRsZSktPnBjaV9kZXYgPSBwY2lfZGV2OworCisJcnYgPSBSVE1QQWxsb2NBZGFwdGVyQmxvY2soaGFuZGxlLCAmcEFkKTsJLypzaGlhbmc6IHdlIG1heSBuZWVkIHRoZSBwY2lfZGV2IGZvciBhbGxvY2F0ZSBzdHJ1Y3R1cmUgb2YgInN0cnVjdCBydF9ydG1wX2FkYXB0ZXIiICovCisJaWYgKHJ2ICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCS8qIEhlcmUgYXJlIHRoZSBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyIHN0cnVjdHVyZSB3aXRoIHBjaS1idXMgc3BlY2lmaWMgcGFyYW1ldGVycy4gKi8KKwlwQWQtPkNTUkJhc2VBZGRyZXNzID0gKHU4ICopY3NyX2FkZHI7CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCSAoInBBZC0+Q1NSQmFzZUFkZHJlc3MgPTB4JWx4LCBjc3JfYWRkcj0weCVseCFcbiIsCisJCSAgKHVuc2lnbmVkIGxvbmcpcEFkLT5DU1JCYXNlQWRkcmVzcywgY3NyX2FkZHIpKTsKKwlSdG1wUmFEZXZDdHJsSW5pdChwQWQsIFJUTVBfREVWX0lORl9QQ0kpOworCisvKk5ldERldkluaXQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJbmV0X2RldiA9IFJ0bXBQaHlOZXREZXZJbml0KHBBZCwgJm5ldERldkhvb2spOworCWlmIChuZXRfZGV2ID09IE5VTEwpCisJCWdvdG8gZXJyX291dF9mcmVlX3JhZGV2OworCisJLyogSGVyZSBhcmUgdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHdpdGggcGNpLWJ1cyBzcGVjaWZpYyBwYXJhbWV0ZXJzLiAqLworCW5ldF9kZXYtPmlycSA9IHBjaV9kZXYtPmlycTsJLyogSW50ZXJydXB0IElSUSBudW1iZXIgKi8KKwluZXRfZGV2LT5iYXNlX2FkZHIgPSBjc3JfYWRkcjsJLyogU2F2ZSBDU1IgdmlydHVhbCBhZGRyZXNzIGFuZCBpcnEgdG8gZGV2aWNlIHN0cnVjdHVyZSAqLworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBuZXRfZGV2KTsJLyogU2V0IGRyaXZlciBkYXRhICovCisKKy8qIGZvciBzdXBwb3J0aW5nIE5ldHdvcmsgTWFuYWdlciAqLworCS8qIFNldCB0aGUgc3lzZnMgcGh5c2ljYWwgZGV2aWNlIHJlZmVyZW5jZSBmb3IgdGhlIG5ldHdvcmsgbG9naWNhbCBkZXZpY2UKKwkgKiBpZiBzZXQgcHJpb3IgdG8gcmVnaXN0cmF0aW9uIHdpbGwgY2F1c2UgYSBzeW1saW5rIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKwkgKi8KKwlTRVRfTkVUREVWX0RFVihuZXRfZGV2LCAmKHBjaV9kZXYtPmRldikpOworCisvKkFsbCBkb25lLCBpdCdzIHRpbWUgdG8gcmVnaXN0ZXIgdGhlIG5ldCBkZXZpY2UgdG8gbGludXgga2VybmVsLiAqLworCS8qIFJlZ2lzdGVyIHRoaXMgZGV2aWNlICovCisJcnYgPSBSdG1wT1NOZXREZXZBdHRhY2gobmV0X2RldiwgJm5ldERldkhvb2spOworCWlmIChydikKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCisJcEFkLT5TdGFDZmcuT3JpRGV2VHlwZSA9IG5ldF9kZXYtPnR5cGU7CisJUlRNUEluaXRQQ0llRGV2aWNlKHBjaV9kZXYsIHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg2MF9wcm9iZVxuIikpOworCisJcmV0dXJuIDA7CQkvKiBwcm9iZSBvayAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVSUk9SIEhBTkRMRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2Vycl9vdXRfZnJlZV9uZXRkZXY6CisJUnRtcE9TTmV0RGV2RnJlZShuZXRfZGV2KTsKKworZXJyX291dF9mcmVlX3JhZGV2OgorCS8qIGZyZWUgc3RydWN0IHJ0X3J0bXBfYWRhcHRlciBzdHJjdXR1cmUgYW5kIG9zX2Nvb2tpZSAqLworCVJUTVBGcmVlQWRhcHRlcihwQWQpOworCitlcnJfb3V0X2lvdW5tYXA6CisJaW91bm1hcCgodm9pZCAqKShjc3JfYWRkcikpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksCisJCQkgICBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApKTsKKworZXJyX291dF9mcmVlX3JlczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBjaV9kZXYpOworCitlcnJfb3V0OgorCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkgKCI8PT09IHJ0Mjg2MF9wcm9iZSBmYWlsZWQgd2l0aCBydiA9ICVkIVxuIiwgcnYpKTsKKworCXJldHVybiAtRU5PREVWOwkJLyogcHJvYmUgZmFpbCAqLworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcnQyODYwX3JlbW92ZV9vbmUoSU4gc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGNzcl9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOwkvKiBwQWQtPkNTUkJhc2VBZGRyZXNzOyAqLworCisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBuZXRfZGV2KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3JlbW92ZV9vbmVcbiIpKTsKKworCWlmIChwQWQgIT0gTlVMTCkgeworCQkvKiBVbnJlZ2lzdGVyL0ZyZWUgYWxsIGFsbG9jYXRlZCBuZXRfZGV2aWNlLiAqLworCQlSdG1wUGh5TmV0RGV2RXhpdChwQWQsIG5ldF9kZXYpOworCisJCS8qIFVubWFwIENTUiBiYXNlIGFkZHJlc3MgKi8KKwkJaW91bm1hcCgoY2hhciAqKShjc3JfYWRkcikpOworCisJCS8qIHJlbGVhc2UgbWVtb3J5IHJlZ2lvbiAqLworCQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLAorCQkJCSAgIHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCkpOworCisJCS8qIEZyZWUgc3RydWN0IHJ0X3J0bXBfYWRhcHRlciByZWxhdGVkIHN0cnVjdHVyZXMuICovCisJCVJ0bXBSYURldkN0cmxFeGl0KHBBZCk7CisKKwl9IGVsc2UgeworCQkvKiBVbnJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlICovCisJCVJ0bXBPU05ldERldkRldGFjaChuZXRfZGV2KTsKKworCQkvKiBVbm1hcCBDU1IgYmFzZSBhZGRyZXNzICovCisJCWlvdW5tYXAoKGNoYXIgKikobmV0X2Rldi0+YmFzZV9hZGRyKSk7CisKKwkJLyogcmVsZWFzZSBtZW1vcnkgcmVnaW9uICovCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksCisJCQkJICAgcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCAwKSk7CisJfQorCisJLyogRnJlZSB0aGUgcm9vdCBuZXRfZGV2aWNlICovCisJUnRtcE9TTmV0RGV2RnJlZShuZXRfZGV2KTsKKworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENoZWNrIHRoZSBjaGlwc2V0IHZlbmRvci9wcm9kdWN0IElELgorCitBcmd1bWVudHM6CisgICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQorCitSZXR1cm4gVmFsdWU6CisgICAgVFJVRQkJCQlDaGVjayBvaworCUZBTFNFCQkJCUNoZWNrIGZhaWwKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlQyOFhYQ2hpcHNldENoZWNrKElOIHZvaWQgKl9kZXZfcCkKK3sKKwkvKiBhbHdheXMgVFJVRSAqLworCXJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJUENJZSBkZXZpY2UgaW5pdGlhbGl6YXRpb24gcmVsYXRlZCBwcm9jZWR1cmVzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBSVE1QSW5pdFBDSWVEZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwl1MTYgZGV2aWNlX2lkOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBQQ0lfREVWSUNFX0lELCAmZGV2aWNlX2lkKTsKKwlkZXZpY2VfaWQgPSBsZTJjcHUxNihkZXZpY2VfaWQpOworCXBPYmotPkRldmljZUlEID0gZGV2aWNlX2lkOworCWlmICgKKyNpZmRlZiBSVDI4NjAKKwkJICAgKGRldmljZV9pZCA9PSBOSUMyODYwX1BDSWVfREVWSUNFX0lEKSB8fAorCQkgICAoZGV2aWNlX2lkID09IE5JQzI3OTBfUENJZV9ERVZJQ0VfSUQpIHx8CisJCSAgIChkZXZpY2VfaWQgPT0gVkVOX0FXVF9QQ0llX0RFVklDRV9JRCkgfHwKKyNlbmRpZgorI2lmZGVmIFJUMzA5MAorCQkgICAoZGV2aWNlX2lkID09IE5JQzMwOTBfUENJZV9ERVZJQ0VfSUQpIHx8CisJCSAgIChkZXZpY2VfaWQgPT0gTklDMzA5MV9QQ0llX0RFVklDRV9JRCkgfHwKKwkJICAgKGRldmljZV9pZCA9PSBOSUMzMDkyX1BDSWVfREVWSUNFX0lEKSB8fAorI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworCQkgICAwKSB7CisJCXUzMiBNYWNDc3IwID0gMCwgSW5kZXggPSAwOworCQlkbyB7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19DU1IwLCAmTWFjQ3NyMCk7CisKKwkJCWlmICgoTWFjQ3NyMCAhPSAweDAwKSAmJiAoTWFjQ3NyMCAhPSAweEZGRkZGRkZGKSkKKwkJCQlicmVhazsKKworCQkJUlRNUHVzZWNEZWxheSgxMCk7CisJCX0gd2hpbGUgKEluZGV4KysgPCAxMDApOworCisJCS8qIFN1cHBvcnQgYWR2YW5jZWQgcG93ZXIgc2F2ZSBhZnRlciAyODkyLzI3OTAuICovCisJCS8qIE1BQyB2ZXJzaW9uIGF0IG9mZnNldCAweDEwMDAgaXMgMHgyODcyWFhYWC8weDI4NzBYWFhYKFBDSWUsIFVTQiwgU0RJTykuICovCisJCWlmICgoTWFjQ3NyMCAmIDB4ZmZmZjAwMDApICE9IDB4Mjg2MDAwMDApIHsKKwkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSk7CisJCX0KKwl9Cit9CisKK3ZvaWQgUlRNUEluaXRQQ0llTGlua0N0cmxWYWx1ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJaW50IHBvczsKKwl1MTYgcmVnMTYsIGRhdGEyLCBQQ0llUG93ZXJTYXZlTGV2ZWwsIENvbmZpZ3VyYXRpb247CisJdTMyIE1hY1ZhbHVlOworCUJPT0xFQU4gYkZpbmRJbnRlbCA9IEZBTFNFOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzLj09PT5cbiIsIF9fZnVuY19fKSk7CisJLyogSW5pdCBFRVBST00sIGFuZCBzYXZlIHNldHRpbmdzICovCisJaWYgKCEoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpKSB7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgyMiwgUENJZVBvd2VyU2F2ZUxldmVsKTsKKwkJcEFkLT5QQ0llUG93ZXJTYXZlTGV2ZWwgPSBQQ0llUG93ZXJTYXZlTGV2ZWwgJiAweGZmOworCisJCXBBZC0+TG5rQ3RybEJpdE1hc2sgPSAwOworCQlpZiAoKFBDSWVQb3dlclNhdmVMZXZlbCAmIDB4ZmYpID09IDB4ZmYpIHsKKwkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIj09PT0+IFBDSWVQb3dlclNhdmVMZXZlbCA9IDB4JXguXG4iLAorCQkJCSAgUENJZVBvd2VyU2F2ZUxldmVsKSk7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlQQ0llUG93ZXJTYXZlTGV2ZWwgJj0gMHgzOworCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDI0LCBkYXRhMik7CisKKwkJCWlmICghCisJCQkgICAgKCgoZGF0YTIgJiAweGZmMDApID09IDB4OTIwMCkKKwkJCSAgICAgJiYgKChkYXRhMiAmIDB4ODApICE9IDApKSkgeworCQkJCWlmIChQQ0llUG93ZXJTYXZlTGV2ZWwgPiAxKQorCQkJCQlQQ0llUG93ZXJTYXZlTGV2ZWwgPSAxOworCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCI9PT09PiBXcml0ZSAweDgzID0gMHgleC5cbiIsCisJCQkJICBQQ0llUG93ZXJTYXZlTGV2ZWwpKTsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg4MywgMHhmZiwKKwkJCQkJICAgICAodTgpUENJZVBvd2VyU2F2ZUxldmVsLCAweDAwKTsKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgyMiwgUENJZVBvd2VyU2F2ZUxldmVsKTsKKwkJCVBDSWVQb3dlclNhdmVMZXZlbCAmPSAweGZmOworCQkJUENJZVBvd2VyU2F2ZUxldmVsID0gUENJZVBvd2VyU2F2ZUxldmVsID4+IDY7CisJCQlzd2l0Y2ggKFBDSWVQb3dlclNhdmVMZXZlbCkgeworCQkJY2FzZSAwOgkvKiBPbmx5IHN1cHBvcnQgTDAgKi8KKwkJCQlwQWQtPkxua0N0cmxCaXRNYXNrID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToJLyogT25seSBlbmFibGUgTDBzICovCisJCQkJcEFkLT5MbmtDdHJsQml0TWFzayA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CS8qIGVuYWJsZSBMMSwgTDBzICovCisJCQkJcEFkLT5MbmtDdHJsQml0TWFzayA9IDM7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CS8qIHN5bmMgd2l0aCBob3N0IGNsayBhbmQgZW5hYmxlIEwxLCBMMHMgKi8KKwkJCQlwQWQtPkxua0N0cmxCaXRNYXNrID0gMHgxMDM7CisJCQkJYnJlYWs7CisJCQl9CisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MjQsIGRhdGEyKTsKKwkJCWlmICgoUENJZVBvd2VyU2F2ZUxldmVsICYgMHhmZikgIT0gMHhmZikgeworCQkJCVBDSWVQb3dlclNhdmVMZXZlbCAmPSAweDM7CisKKwkJCQlpZiAoIQorCQkJCSAgICAoKChkYXRhMiAmIDB4ZmYwMCkgPT0gMHg5MjAwKQorCQkJCSAgICAgJiYgKChkYXRhMiAmIDB4ODApICE9IDApKSkgeworCQkJCQlpZiAoUENJZVBvd2VyU2F2ZUxldmVsID4gMSkKKwkJCQkJCVBDSWVQb3dlclNhdmVMZXZlbCA9IDE7CisJCQkJfQorCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIj09PT0+IHJ0Mjh4eCBXcml0ZSAweDgzIENvbW1hbmQgPSAweCV4LlxuIiwKKwkJCQkJICBQQ0llUG93ZXJTYXZlTGV2ZWwpKTsKKworCQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg4MywgMHhmZiwKKwkJCQkJCSAgICAgKHU4KVBDSWVQb3dlclNhdmVMZXZlbCwKKwkJCQkJCSAgICAgMHgwMCk7CisJCQl9CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCI9PT09PiBMbmtDdHJsQml0TWFzayA9IDB4JXguXG4iLAorCQkJCSAgcEFkLT5MbmtDdHJsQml0TWFzaykpOworCQl9CisJfSBlbHNlIGlmIChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgeworCQl1OCBMaW5rQ3RybFNldHRpbmcgPSAwOworCisJCS8qIENoZWNrIDMwOTBFIHNwZWNpYWwgc2V0dGluZyBjaGlwLiAqLworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MjQsIGRhdGEyKTsKKwkJaWYgKChkYXRhMiA9PSAweDkyODApICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA9PSAweDAyMTEpKSB7CisJCQlwQWQtPmIzMDkwRVNwZWNpYWxDaGlwID0gVFJVRTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJTcGVjaWFsIDMwOTBFIGNoaXAgXG4iKSk7CisJCX0KKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEFVWF9DVFJMLCAmTWFjVmFsdWUpOworCQkvKmVuYWJsZSBXQUtFX1BDSUUgZnVuY3Rpb24sIHdoaWNoIGZvcmNlcyB0byBlbmFibGUgUENJRSBjbG9jayB3aGVuIG1wdSBpbnRlcnJ1cHQgYXNzZXJ0aW5nLiAqLworCQkvKkZvcmNlIFBDSUUgMTI1TUh6IENMSyB0byB0b2dnbGUgKi8KKwkJTWFjVmFsdWUgfD0gMHg0MDI7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVWF9DVFJMLCBNYWNWYWx1ZSk7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCSAgICAgKCIgQVVYX0NUUkwgPSAweCUzMnhcbiIsIE1hY1ZhbHVlKSk7CisKKwkJLyogZm9yIFJUMzB4eCBGIGFuZCBhZnRlciwgUENJZSBpbmZ0ZXJmYWNlLCBhbmQgZm9yIHBvd2VyIHNvbHV0aW9uIDMgKi8KKwkJaWYgKChJU19WRVJTSU9OX0FGVEVSX0YocEFkKSkKKwkJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID49IDIpCisJCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA8PSAzKSkgeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBBVVhfQ1RSTCwgJk1hY1ZhbHVlKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCQkgICAgICgiIFJlYWQgQVVYX0NUUkwgPSAweCV4XG4iLCBNYWNWYWx1ZSkpOworCQkJLyogdHVybiBvbiBiaXQgMTIuICovCisJCQkvKmVuYWJsZSAzMktIeiBjbG9jayBtb2RlIGZvciBwb3dlciBzYXZpbmcgKi8KKwkJCU1hY1ZhbHVlIHw9IDB4MTAwMDsKKwkJCWlmIChNYWNWYWx1ZSAhPSAweGZmZmZmZmZmKSB7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVYX0NUUkwsIE1hY1ZhbHVlKTsKKwkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkJCSAgICAgKCIgV3JpdGUgQVVYX0NUUkwgPSAweCV4XG4iLAorCQkJCQkgICAgICBNYWNWYWx1ZSkpOworCQkJCS8qIDEuIGlmIHVzZSBQQ0llUG93ZXJTZXR0aW5nIGlzIDIgb3IgMywgbmVlZCB0byBwcm9ncmFtIE9TQ19DVFJMIHRvIDB4M2ZmMTEuICovCisJCQkJTWFjVmFsdWUgPSAweDNmZjExOworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE9TQ19DVFJMLCBNYWNWYWx1ZSk7CisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgICAgICgiIE9TQ19DVFJMID0gMHgleFxuIiwgTWFjVmFsdWUpKTsKKwkJCQkvKiAyLiBXcml0ZSBQQ0kgcmVnaXN0ZXIgQ2xrIHJlZiBiaXQgKi8KKwkJCQlSVE1QcnQzeFNldFBDSWVQb3dlckxpbmtDdHJsKHBBZCk7CisJCQl9IGVsc2UgeworCQkJCS8qIEVycm9yIHJlYWQgQXV4X0N0cmwgdmFsdWUuICBGb3JjZSB0byB1c2Ugc29sdXRpb24gMSAqLworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgKCIgRXJyb3IgVmFsdWUgaW4gQVVYX0NUUkwgPSAweCV4XG4iLAorCQkJCQkgIE1hY1ZhbHVlKSk7CisJCQkJcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9IDE7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCSAoIiBGb3JjZSB0byB1c2UgcG93ZXIgc29sdXRpb24xIFxuIikpOworCQkJfQorCQl9CisJCS8qIDEuIHJlYWQgc2V0dGluZyBmcm9tIGluZiBmaWxlLiAqLworCisJCVBDSWVQb3dlclNhdmVMZXZlbCA9CisJCSAgICAodTE2KXBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGU7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiPT09PT4gcnQzMHh4IFJlYWQgUG93ZXJMZXZlbE1vZGUgPSAgMHgleC5cbiIsCisJCQkgIFBDSWVQb3dlclNhdmVMZXZlbCkpOworCQkvKiAyLiBDaGVjayBFbmFibGVOZXdQUy4gKi8KKwkJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBGQUxTRSkKKwkJCVBDSWVQb3dlclNhdmVMZXZlbCA9IDE7CisKKwkJaWYgKElTX1ZFUlNJT05fQkVGT1JFX0YocEFkKQorCQkgICAgJiYgKHBBZC0+YjMwOTBFU3BlY2lhbENoaXAgPT0gRkFMU0UpKSB7CisJCQkvKiBDaGlwIFZlcnNpb24gRSBvbmx5IGFsbG93IDEsIFNvIGZvcmNlIHNldCAxLiAqLworCQkJUENJZVBvd2VyU2F2ZUxldmVsICY9IDB4MTsKKwkJCXBBZC0+UENJZVBvd2VyU2F2ZUxldmVsID0gKHUxNilQQ0llUG93ZXJTYXZlTGV2ZWw7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCI9PT09PiBydDMweHggRSBXcml0ZSAweDgzIENvbW1hbmQgPSAweCV4LlxuIiwKKwkJCQkgIFBDSWVQb3dlclNhdmVMZXZlbCkpOworCisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4ODMsIDB4ZmYsCisJCQkJCSAgICAgKHU4KVBDSWVQb3dlclNhdmVMZXZlbCwgMHgwMCk7CisJCX0gZWxzZSB7CisJCQkvKiBDaGlwIFZlcnNpb24gRiBhbmQgYWZ0ZXIgb25seSBhbGxvdyAxIG9yIDIgb3IgMy4gVGhpcyBtaWdodCBiZSBtb2RpZmllZCBhZnRlciBuZXcgY2hpcCB2ZXJzaW9uIGNvbWUgb3V0LiAqLworCQkJaWYgKCEKKwkJCSAgICAoKFBDSWVQb3dlclNhdmVMZXZlbCA9PSAxKQorCQkJICAgICB8fCAoUENJZVBvd2VyU2F2ZUxldmVsID09IDMpKSkKKwkJCQlQQ0llUG93ZXJTYXZlTGV2ZWwgPSAxOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiPT09PT4gcnQzMHh4IEYgV3JpdGUgMHg4MyBDb21tYW5kID0gMHgleC5cbiIsCisJCQkJICBQQ0llUG93ZXJTYXZlTGV2ZWwpKTsKKwkJCXBBZC0+UENJZVBvd2VyU2F2ZUxldmVsID0gKHUxNilQQ0llUG93ZXJTYXZlTGV2ZWw7CisJCQkvKiBmb3IgMzA5MEYgLCB3ZSBuZWVkIHRvIGFkZCBoaWdoLWJ5dGUgYXJnIGZvciAweDgzIGNvbW1hbmQgdG8gaW5kaWNhdGUgdGhlIGxpbmsgY29udHJvbCBzZXR0aW5nIGluICovCisJCQkvKiBQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZS4gQmVjYXVzZSBmaXJtd2FyZSBjYW4ndCByZWFkIFBDSSBDb25maWd1cmF0aW9uIFNwYWNlICovCisJCQlpZiAoKHBBZC0+UnQzeHhSYWxpbmtMaW5rQ3RybCAmIDB4MikKKwkJCSAgICAmJiAocEFkLT5SdDN4eEhvc3RMaW5rQ3RybCAmIDB4MikpIHsKKwkJCQlMaW5rQ3RybFNldHRpbmcgPSAxOworCQkJfQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiPT09PT4gcnQzMHh4RiBMaW5rQ3RybFNldHRpbmcgPSAweCV4LlxuIiwKKwkJCQkgIExpbmtDdHJsU2V0dGluZykpOworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDgzLCAweGZmLAorCQkJCQkgICAgICh1OClQQ0llUG93ZXJTYXZlTGV2ZWwsCisJCQkJCSAgICAgTGlua0N0cmxTZXR0aW5nKTsKKwkJfQorCX0KKwkvKiBGaW5kIFJhbGluayBQQ0llIERldmljZSdzIEV4cHJlc3MgQ2FwYWJpbGl0eSBPZmZzZXQgKi8KKwlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBPYmotPnBjaV9kZXYsIFBDSV9DQVBfSURfRVhQKTsKKworCWlmIChwb3MgIT0gMCkgeworCQkvKiBSYWxpbmsgUENJZSBEZXZpY2UncyBMaW5rIENvbnRyb2wgUmVnaXN0ZXIgT2Zmc2V0ICovCisJCXBBZC0+Ukxua0N0cmxPZmZzZXQgPSBwb3MgKyBQQ0lfRVhQX0xOS0NUTDsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocE9iai0+cGNpX2RldiwgcEFkLT5STG5rQ3RybE9mZnNldCwKKwkJCQkgICAgICZyZWcxNik7CisJCUNvbmZpZ3VyYXRpb24gPSBsZTJjcHUxNihyZWcxNik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUmVhZCAoUmFsaW5rIFBDSWUgTGluayBDb250cm9sIFJlZ2lzdGVyKSBvZmZzZXQgMHgleCA9IDB4JXhcbiIsCisJCQkgIHBBZC0+Ukxua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKKwkJcEFkLT5STG5rQ3RybENvbmZpZ3VyYXRpb24gPSAoQ29uZmlndXJhdGlvbiAmIDB4MTAzKTsKKwkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7CisJCUNvbmZpZ3VyYXRpb24gfD0gKDB4MCk7CisjaWZkZWYgUlQyODYwCisJCWlmICgocE9iai0+RGV2aWNlSUQgPT0gTklDMjg2MF9QQ0llX0RFVklDRV9JRCkKKwkJICAgIHx8IChwT2JqLT5EZXZpY2VJRCA9PSBOSUMyNzkwX1BDSWVfREVWSUNFX0lEKSkgeworCQkJcmVnMTYgPSBjcHUybGUxNihDb25maWd1cmF0aW9uKTsKKwkJCXBjaV93cml0ZV9jb25maWdfd29yZChwT2JqLT5wY2lfZGV2LAorCQkJCQkgICAgICBwQWQtPlJMbmtDdHJsT2Zmc2V0LCByZWcxNik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJXcml0ZSAoUmFsaW5rIFBDSWUgTGluayBDb250cm9sIFJlZ2lzdGVyKSAgb2Zmc2V0IDB4JXggPSAweCV4XG4iLAorCQkJCSAgcG9zICsgUENJX0VYUF9MTktDVEwsIENvbmZpZ3VyYXRpb24pKTsKKwkJfQorI2VuZGlmIC8qIFJUMjg2MCAvLyAqLworCisJCVJUTVBGaW5kSG9zdFBDSURldihwQWQpOworCQlpZiAocE9iai0+cGFyZW50X3BjaV9kZXYpIHsKKwkJCXUxNiB2ZW5kb3JfaWQ7CisKKwkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBPYmotPnBhcmVudF9wY2lfZGV2LAorCQkJCQkgICAgIFBDSV9WRU5ET1JfSUQsICZ2ZW5kb3JfaWQpOworCQkJdmVuZG9yX2lkID0gbGUyY3B1MTYodmVuZG9yX2lkKTsKKwkJCWlmICh2ZW5kb3JfaWQgPT0gUENJQlVTX0lOVEVMX1ZFTkRPUikgeworCQkJCWJGaW5kSW50ZWwgPSBUUlVFOworCQkJCVJUTVBfU0VUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX1RPR0dMRV9MMSk7CisJCQl9CisJCQkvKiBGaW5kIFBDSS10by1QQ0kgQnJpZGdlIEV4cHJlc3MgQ2FwYWJpbGl0eSBPZmZzZXQgKi8KKwkJCXBvcyA9CisJCQkgICAgcGNpX2ZpbmRfY2FwYWJpbGl0eShwT2JqLT5wYXJlbnRfcGNpX2RldiwKKwkJCQkJCVBDSV9DQVBfSURfRVhQKTsKKworCQkJaWYgKHBvcyAhPSAwKSB7CisJCQkJQk9PTEVBTiBiQ2hhbmdlID0gRkFMU0U7CisJCQkJLyogUENJLXRvLVBDSSBCcmlkZ2UgTGluayBDb250cm9sIFJlZ2lzdGVyIE9mZnNldCAqLworCQkJCXBBZC0+SG9zdExua0N0cmxPZmZzZXQgPSBwb3MgKyBQQ0lfRVhQX0xOS0NUTDsKKwkJCQlwY2lfcmVhZF9jb25maWdfd29yZChwT2JqLT5wYXJlbnRfcGNpX2RldiwKKwkJCQkJCSAgICAgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwKKwkJCQkJCSAgICAgJnJlZzE2KTsKKwkJCQlDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJSZWFkIChIb3N0IFBDSS10by1QQ0kgQnJpZGdlIExpbmsgQ29udHJvbCBSZWdpc3Rlcikgb2Zmc2V0IDB4JXggPSAweCV4XG4iLAorCQkJCQkgIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsCisJCQkJCSAgQ29uZmlndXJhdGlvbikpOworCQkJCXBBZC0+SG9zdExua0N0cmxDb25maWd1cmF0aW9uID0KKwkJCQkgICAgKENvbmZpZ3VyYXRpb24gJiAweDEwMyk7CisJCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7CisJCQkJQ29uZmlndXJhdGlvbiB8PSAoMHgwKTsKKworCQkJCXN3aXRjaCAocE9iai0+RGV2aWNlSUQpIHsKKyNpZmRlZiBSVDI4NjAKKwkJCQljYXNlIE5JQzI4NjBfUENJZV9ERVZJQ0VfSUQ6CisJCQkJY2FzZSBOSUMyNzkwX1BDSWVfREVWSUNFX0lEOgorCQkJCQliQ2hhbmdlID0gVFJVRTsKKwkJCQkJYnJlYWs7CisjZW5kaWYgLyogUlQyODYwIC8vICovCisjaWZkZWYgUlQzMDkwCisJCQkJY2FzZSBOSUMzMDkwX1BDSWVfREVWSUNFX0lEOgorCQkJCWNhc2UgTklDMzA5MV9QQ0llX0RFVklDRV9JRDoKKwkJCQljYXNlIE5JQzMwOTJfUENJZV9ERVZJQ0VfSUQ6CisJCQkJCWlmIChiRmluZEludGVsID09IEZBTFNFKQorCQkJCQkJYkNoYW5nZSA9IFRSVUU7CisJCQkJCWJyZWFrOworI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmIChiQ2hhbmdlKSB7CisJCQkJCXJlZzE2ID0gY3B1MmxlMTYoQ29uZmlndXJhdGlvbik7CisJCQkJCXBjaV93cml0ZV9jb25maWdfd29yZChwT2JqLT4KKwkJCQkJCQkgICAgICBwYXJlbnRfcGNpX2RldiwKKwkJCQkJCQkgICAgICBwQWQtPgorCQkJCQkJCSAgICAgIEhvc3RMbmtDdHJsT2Zmc2V0LAorCQkJCQkJCSAgICAgIHJlZzE2KTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJXcml0ZSAoSG9zdCBQQ0ktdG8tUENJIEJyaWRnZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpIG9mZnNldCAweCV4ID0gMHgleFxuIiwKKwkJCQkJCSAgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwKKwkJCQkJCSAgQ29uZmlndXJhdGlvbikpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCA9IDA7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCSAoIiVzOiBjYW5ub3QgZmluZCBQQ0ktdG8tUENJIEJyaWRnZSBQQ0kgRXhwcmVzcyBDYXBhYmlsaXR5IVxuIiwKKwkJCQkJICBfX2Z1bmNfXykpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcEFkLT5STG5rQ3RybE9mZnNldCA9IDA7CisJCXBBZC0+SG9zdExua0N0cmxPZmZzZXQgPSAwOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzOiBjYW5ub3QgZmluZCBSYWxpbmsgUENJZSBEZXZpY2UncyBQQ0kgRXhwcmVzcyBDYXBhYmlsaXR5IVxuIiwKKwkJCSAgX19mdW5jX18pKTsKKwl9CisKKwlpZiAoYkZpbmRJbnRlbCA9PSBGQUxTRSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkRvZXNuJ3QgZmluZCBJbnRlbCBQQ0kgaG9zdCBjb250cm9sbGVyLiBcbiIpKTsKKwkJLyogRG9lc24ndCBzd2l0Y2ggTDAsIEwxLCBTbyBzZXQgUENJZVBvd2VyU2F2ZUxldmVsIHRvIDB4ZmYgKi8KKwkJcEFkLT5QQ0llUG93ZXJTYXZlTGV2ZWwgPSAweGZmOworCQlpZiAoKHBBZC0+Ukxua0N0cmxPZmZzZXQgIT0gMCkKKyNpZmRlZiBSVDMwOTAKKwkJICAgICYmICgocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5MF9QQ0llX0RFVklDRV9JRCkKKwkJCXx8IChwT2JqLT5EZXZpY2VJRCA9PSBOSUMzMDkxX1BDSWVfREVWSUNFX0lEKQorCQkJfHwgKHBPYmotPkRldmljZUlEID09IE5JQzMwOTJfUENJZV9ERVZJQ0VfSUQpKQorI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworCQkgICAgKSB7CisJCQlwY2lfcmVhZF9jb25maWdfd29yZChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LAorCQkJCQkgICAgICZyZWcxNik7CisJCQlDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiUmVhZCAoUmFsaW5rIDMweHggUENJZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpIG9mZnNldCAweCV4ID0gMHgleFxuIiwKKwkJCQkgIHBBZC0+Ukxua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKKwkJCXBBZC0+Ukxua0N0cmxDb25maWd1cmF0aW9uID0gKENvbmZpZ3VyYXRpb24gJiAweDEwMyk7CisJCQlDb25maWd1cmF0aW9uICY9IDB4ZmVmYzsKKwkJCUNvbmZpZ3VyYXRpb24gfD0gKDB4MCk7CisJCQlyZWcxNiA9IGNwdTJsZTE2KENvbmZpZ3VyYXRpb24pOworCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBPYmotPnBjaV9kZXYsCisJCQkJCSAgICAgIHBBZC0+Ukxua0N0cmxPZmZzZXQsIHJlZzE2KTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIldyaXRlIChSYWxpbmsgUENJZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpICBvZmZzZXQgMHgleCA9IDB4JXhcbiIsCisJCQkJICBwb3MgKyBQQ0lfRVhQX0xOS0NUTCwgQ29uZmlndXJhdGlvbikpOworCQl9CisJfQorfQorCit2b2lkIFJUTVBGaW5kSG9zdFBDSURldihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJdTE2IHJlZzE2OworCXU4IHJlZzg7CisJdTMyIERldkZuOworCXN0cnVjdCBwY2lfZGV2ICpwUGNpX2RldjsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOworCisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKwlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcy49PT0+XG4iLCBfX2Z1bmNfXykpOworCisJcE9iai0+cGFyZW50X3BjaV9kZXYgPSBOVUxMOworCWlmIChwT2JqLT5wY2lfZGV2LT5idXMtPnBhcmVudCkgeworCQlmb3IgKERldkZuID0gMDsgRGV2Rm4gPCAyNTU7IERldkZuKyspIHsKKwkJCXBQY2lfZGV2ID0KKwkJCSAgICBwY2lfZ2V0X3Nsb3QocE9iai0+cGNpX2Rldi0+YnVzLT5wYXJlbnQsIERldkZuKTsKKwkJCWlmIChwUGNpX2RldikgeworCQkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBQY2lfZGV2LCBQQ0lfQ0xBU1NfREVWSUNFLAorCQkJCQkJICAgICAmcmVnMTYpOworCQkJCXJlZzE2ID0gbGUyY3B1MTYocmVnMTYpOworCQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBQY2lfZGV2LCBQQ0lfQ0JfQ0FSRF9CVVMsCisJCQkJCQkgICAgICZyZWc4KTsKKwkJCQlpZiAoKHJlZzE2ID09IFBDSV9DTEFTU19CUklER0VfUENJKQorCQkJCSAgICAmJiAocmVnOCA9PSBwT2JqLT5wY2lfZGV2LT5idXMtPm51bWJlcikpIHsKKwkJCQkJcE9iai0+cGFyZW50X3BjaV9kZXYgPSBwUGNpX2RldjsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCQlMZXZlbCA9IFJFU1RPUkVfSEFMVCA6IFJlc3RvcmUgUENJIGhvc3QgYW5kIFJhbGluayBQQ0llIExpbmsgQ29udHJvbCBmaWVsZCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KKwkJTGV2ZWwgPSBPdGhlciBWYWx1ZSA6IFJlc3RvcmUgZnJvbSBkb3QxMSBwb3dlciBzYXZlIG9yIHJhZGlvIG9mZiBzdGF0dXMuIEFuZCBmb3JjZSBQQ0kgaG9zdCBMaW5rIENvbnRyb2wgZmllbGRzIHRvIDB4MQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggTGV2ZWwpCit7CisJdTE2IFBDSWVQb3dlclNhdmVMZXZlbCwgcmVnMTY7CisJdTE2IENvbmZpZ3VyYXRpb247CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKKwkJcmV0dXJuOworCisjaWZkZWYgUlQyODYwCisJaWYgKCEoKHBPYmotPkRldmljZUlEID09IE5JQzI4NjBfUENJZV9ERVZJQ0VfSUQpCisJICAgICAgfHwgKHBPYmotPkRldmljZUlEID09IE5JQzI3OTBfUENJZV9ERVZJQ0VfSUQpKSkKKwkJcmV0dXJuOworI2VuZGlmIC8qIFJUMjg2MCAvLyAqLworCS8qIENoZWNrIFBTQ29udHJvbCBDb25maWd1cmF0aW9uICovCisJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBGQUxTRSkKKwkJcmV0dXJuOworCisJLyozMDkwIHdpbGwgbm90IGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBjb2Rlcy4gKi8KKwkvKiBDaGVjayBpbnRlcmZhY2UgOiBJZiBub3QgUENJZSBpbnRlcmZhY2UsIHJldHVybi4gKi8KKworI2lmZGVmIFJUMzA5MAorCWlmICgocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5MF9QQ0llX0RFVklDRV9JRCkKKwkgICAgfHwgKHBPYmotPkRldmljZUlEID09IE5JQzMwOTFfUENJZV9ERVZJQ0VfSUQpCisJICAgIHx8IChwT2JqLT5EZXZpY2VJRCA9PSBOSUMzMDkyX1BDSWVfREVWSUNFX0lEKSkKKwkJcmV0dXJuOworI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMuPT09PlxuIiwgX19mdW5jX18pKTsKKwlQQ0llUG93ZXJTYXZlTGV2ZWwgPSBwQWQtPlBDSWVQb3dlclNhdmVMZXZlbDsKKwlpZiAoKFBDSWVQb3dlclNhdmVMZXZlbCAmIDB4ZmYpID09IDB4ZmYpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicmV0dXJuICBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwT2JqLT5wYXJlbnRfcGNpX2RldiAmJiAocEFkLT5Ib3N0TG5rQ3RybE9mZnNldCAhPSAwKSkgeworCQlQQ0lfUkVHX1JFQURfV09SRChwT2JqLT5wYXJlbnRfcGNpX2RldiwgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwKKwkJCQkgIENvbmZpZ3VyYXRpb24pOworCQlpZiAoKENvbmZpZ3VyYXRpb24gIT0gMCkgJiYgKENvbmZpZ3VyYXRpb24gIT0gMHhGRkZGKSkgeworCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7CisJCQkvKiBJZiBjYWxsIGZyb20gaW50ZXJmYWNlIGRvd24sIHJlc3RvcmUgdG8gb3JnaW5pYWwgc2V0dGluZy4gKi8KKwkJCWlmIChMZXZlbCA9PSBSRVNUT1JFX0NMT1NFKSB7CisJCQkJQ29uZmlndXJhdGlvbiB8PSBwQWQtPkhvc3RMbmtDdHJsQ29uZmlndXJhdGlvbjsKKwkJCX0gZWxzZQorCQkJCUNvbmZpZ3VyYXRpb24gfD0gMHgwOworCQkJUENJX1JFR19XSVJURV9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LAorCQkJCQkgICBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LAorCQkJCQkgICBDb25maWd1cmF0aW9uKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlJlc3RvcmUgUENJIGhvc3QgOiBvZmZzZXQgMHgleCA9IDB4JXhcbiIsCisJCQkJICBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7CisJCX0gZWxzZQorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiUmVzdG9yZSBQQ0kgaG9zdCA6IFBDSV9SRUdfUkVBRF9XT1JEIGZhaWxlZCAoQ29uZmlndXJhdGlvbiA9IDB4JXgpXG4iLAorCQkJCSAgQ29uZmlndXJhdGlvbikpOworCX0KKworCWlmIChwT2JqLT5wY2lfZGV2ICYmIChwQWQtPlJMbmtDdHJsT2Zmc2V0ICE9IDApKSB7CisJCVBDSV9SRUdfUkVBRF9XT1JEKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsCisJCQkJICBDb25maWd1cmF0aW9uKTsKKwkJaWYgKChDb25maWd1cmF0aW9uICE9IDApICYmIChDb25maWd1cmF0aW9uICE9IDB4RkZGRikpIHsKKwkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOworCQkJLyogSWYgY2FsbCBmcm9tIGludGVyZmFjZSBkb3duLCByZXN0b3JlIHRvIG9yZ2luaWFsIHNldHRpbmcuICovCisJCQlpZiAoTGV2ZWwgPT0gUkVTVE9SRV9DTE9TRSkKKwkJCQlDb25maWd1cmF0aW9uIHw9IHBBZC0+Ukxua0N0cmxDb25maWd1cmF0aW9uOworCQkJZWxzZQorCQkJCUNvbmZpZ3VyYXRpb24gfD0gMHgwOworCQkJUENJX1JFR19XSVJURV9XT1JEKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsCisJCQkJCSAgIENvbmZpZ3VyYXRpb24pOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiUmVzdG9yZSBSYWxpbmsgOiBvZmZzZXQgMHgleCA9IDB4JXhcbiIsCisJCQkJICBwQWQtPlJMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7CisJCX0gZWxzZQorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiUmVzdG9yZSBSYWxpbmsgOiBQQ0lfUkVHX1JFQURfV09SRCBmYWlsZWQgKENvbmZpZ3VyYXRpb24gPSAweCV4KVxuIiwKKwkJCQkgIENvbmZpZ3VyYXRpb24pKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA8PT09XG4iLCBfX2Z1bmNfXykpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKwkJTWF4IDogbGltaXQgSG9zdCBQQ0kgYW5kIFJhbGluayBQQ0llIGRldmljZSdzIExJTksgQ09OVFJPTCBmaWVsZCdzIHZhbHVlLgorCQlCZWNhdXNlIG5vdyBmcmVxdWVudGx5IHNldCBvdXIgZGV2aWNlIHRvIG1vZGUgMSBvciBtb2RlIDMgd2lsbCBjYXVzZSBwcm9ibGVtLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QUENJZUxpbmtDdHJsU2V0dGluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHUxNiBNYXgpCit7CisJdTE2IFBDSWVQb3dlclNhdmVMZXZlbCwgcmVnMTY7CisJdTE2IENvbmZpZ3VyYXRpb247CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKKwkJcmV0dXJuOworCisjaWZkZWYgUlQyODYwCisJaWYgKCEoKHBPYmotPkRldmljZUlEID09IE5JQzI4NjBfUENJZV9ERVZJQ0VfSUQpCisJICAgICAgfHwgKHBPYmotPkRldmljZUlEID09IE5JQzI3OTBfUENJZV9ERVZJQ0VfSUQpKSkKKwkJcmV0dXJuOworI2VuZGlmIC8qIFJUMjg2MCAvLyAqLworCS8qIENoZWNrIFBTQ29udHJvbCBDb25maWd1cmF0aW9uICovCisJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBGQUxTRSkKKwkJcmV0dXJuOworCisJLyogQ2hlY2sgaW50ZXJmYWNlIDogSWYgbm90IFBDSWUgaW50ZXJmYWNlLCByZXR1cm4uICovCisJLypCbG9jayAzMDkwIHRvIGVudGVyIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gKi8KKworI2lmZGVmIFJUMzA5MAorCWlmICgocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5MF9QQ0llX0RFVklDRV9JRCkKKwkgICAgfHwgKHBPYmotPkRldmljZUlEID09IE5JQzMwOTFfUENJZV9ERVZJQ0VfSUQpCisJICAgIHx8IChwT2JqLT5EZXZpY2VJRCA9PSBOSUMzMDkyX1BDSWVfREVWSUNFX0lEKSkKKwkJcmV0dXJuOworI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworCWlmICghUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfSU5GTywKKwkJCSAoIlJUTVBQQ0llUG93ZXJMaW5rQ3RybCByZXR1cm4gb24gZlJUTVBfUFNfQ0FOX0dPX1NMRUVQIGZsYWdcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzPT09PlxuIiwgX19mdW5jX18pKTsKKwlQQ0llUG93ZXJTYXZlTGV2ZWwgPSBwQWQtPlBDSWVQb3dlclNhdmVMZXZlbDsKKwlpZiAoKFBDSWVQb3dlclNhdmVMZXZlbCAmIDB4ZmYpID09IDB4ZmYpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicmV0dXJuICBcbiIpKTsKKwkJcmV0dXJuOworCX0KKwlQQ0llUG93ZXJTYXZlTGV2ZWwgPSBQQ0llUG93ZXJTYXZlTGV2ZWwgPj4gNjsKKworCS8qIFNraXAgbm9uLWV4aXN0IGRlaWNlIHJpZ2h0IGF3YXkgKi8KKwlpZiAocE9iai0+cGFyZW50X3BjaV9kZXYgJiYgKHBBZC0+SG9zdExua0N0cmxPZmZzZXQgIT0gMCkpIHsKKwkJUENJX1JFR19SRUFEX1dPUkQocE9iai0+cGFyZW50X3BjaV9kZXYsIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsCisJCQkJICBDb25maWd1cmF0aW9uKTsKKwkJc3dpdGNoIChQQ0llUG93ZXJTYXZlTGV2ZWwpIHsKKwkJY2FzZSAwOgorCQkJLyogU2V0IGIwIGFuZCBiMSBvZiBMaW5rQ29udHJvbCAoYm90aCAyODkyIGFuZCBQQ0llIGJyaWRnZSkgdG8gMDAgKi8KKwkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCS8qIFNldCBiMCBhbmQgYjEgb2YgTGlua0NvbnRyb2wgKGJvdGggMjg5MiBhbmQgUENJZSBicmlkZ2UpIHRvIDAxICovCisJCQlDb25maWd1cmF0aW9uICY9IDB4ZmVmYzsKKwkJCUNvbmZpZ3VyYXRpb24gfD0gMHgxOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCS8qICBTZXQgYjAgYW5kIGIxIG9mIExpbmtDb250cm9sIChib3RoIDI4OTIgYW5kIFBDSWUgYnJpZGdlKSB0byAxMSAqLworCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7CisJCQlDb25maWd1cmF0aW9uIHw9IDB4MzsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQkvKiBTZXQgYjAgYW5kIGIxIG9mIExpbmtDb250cm9sIChib3RoIDI4OTIgYW5kIFBDSWUgYnJpZGdlKSB0byAxMSBhbmQgYml0IDggb2YgTGlua0NvbnRyb2wgb2YgMjg5MiB0byAxICovCisJCQlDb25maWd1cmF0aW9uICY9IDB4ZmVmYzsKKwkJCUNvbmZpZ3VyYXRpb24gfD0gMHgxMDM7CisJCQlicmVhazsKKwkJfQorCQlQQ0lfUkVHX1dJUlRFX1dPUkQocE9iai0+cGFyZW50X3BjaV9kZXYsIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsCisJCQkJICAgQ29uZmlndXJhdGlvbik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiV3JpdGUgUENJIGhvc3Qgb2Zmc2V0IDB4JXggPSAweCV4XG4iLAorCQkJICBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7CisJfQorCisJaWYgKHBPYmotPnBjaV9kZXYgJiYgKHBBZC0+Ukxua0N0cmxPZmZzZXQgIT0gMCkpIHsKKwkJLyogZmlyc3QgMjg5MiBjaGlwIG5vdCBhbGxvdyB0byBmcmVxdWVudGx5IHNldCBtb2RlIDMuIHdpbGwgY2F1c2UgaGFuZyBwcm9ibGVtLiAqLworCQlpZiAoUENJZVBvd2VyU2F2ZUxldmVsID4gTWF4KQorCQkJUENJZVBvd2VyU2F2ZUxldmVsID0gTWF4OworCisJCVBDSV9SRUdfUkVBRF9XT1JEKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsCisJCQkJICBDb25maWd1cmF0aW9uKTsKKwkJc3dpdGNoIChQQ0llUG93ZXJTYXZlTGV2ZWwpIHsKKwkJY2FzZSAwOgorCQkJLyogTm8gUENJIHBvd2VyIHNhZmUgKi8KKwkJCS8qIFNldCBiMCBhbmQgYjEgb2YgTGlua0NvbnRyb2wgKGJvdGggMjg5MiBhbmQgUENJZSBicmlkZ2UpIHRvIDAwIC4gKi8KKwkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCS8qICBMMCAqLworCQkJLyogU2V0IGIwIGFuZCBiMSBvZiBMaW5rQ29udHJvbCAoYm90aCAyODkyIGFuZCBQQ0llIGJyaWRnZSkgdG8gMDEgLiAqLworCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7CisJCQlDb25maWd1cmF0aW9uIHw9IDB4MTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQkvKiBMMCBhbmQgTDEgKi8KKwkJCS8qICBTZXQgYjAgYW5kIGIxIG9mIExpbmtDb250cm9sIChib3RoIDI4OTIgYW5kIFBDSWUgYnJpZGdlKSB0byAxMSAqLworCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7CisJCQlDb25maWd1cmF0aW9uIHw9IDB4MzsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQkvKiBMMCAsIEwxIGFuZCBjbG9jayBtYW5hZ2VtZW50LiAqLworCQkJLyogU2V0IGIwIGFuZCBiMSBvZiBMaW5rQ29udHJvbCAoYm90aCAyODkyIGFuZCBQQ0llIGJyaWRnZSkgdG8gMTEgYW5kIGJpdCA4IG9mIExpbmtDb250cm9sIG9mIDI4OTIgdG8gMSAqLworCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7CisJCQlDb25maWd1cmF0aW9uIHw9IDB4MTAzOworCQkJcEFkLT5iUENJY2xrT2ZmID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisJCVBDSV9SRUdfV0lSVEVfV09SRChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LAorCQkJCSAgIENvbmZpZ3VyYXRpb24pOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIldyaXRlIFJhbGluayBkZXZpY2UgOiBvZmZzZXQgMHgleCA9IDB4JXhcbiIsCisJCQkgIHBBZC0+Ukxua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QUENJZVBvd2VyTGlua0N0cmwgPD09PT09PT09PT09PT09XG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQkxLiBXcml0ZSBhIFBDSSByZWdpc3RlciBmb3IgcnQzMHh4IHBvd2VyIHNvbHV0aW9uIDMKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUHJ0M3hTZXRQQ0llUG93ZXJMaW5rQ3RybChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisKKwl1bnNpZ25lZCBsb25nIEhvc3RDb25maWd1cmF0aW9uID0gMDsKKwl1bnNpZ25lZCBsb25nIENvbmZpZ3VyYXRpb247CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKwlpbnQgcG9zOworCXUxNiByZWcxNjsKKworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJREJHUFJJTlQoUlRfREVCVUdfSU5GTywKKwkJICgiUlRNUHJ0M3hTZXRQQ0llUG93ZXJMaW5rQ3RybC49PT0+ICVseFxuIiwKKwkJICBwQWQtPlN0YUNmZy5QU0NvbnRyb2wud29yZCkpOworCisJLyogQ2hlY2sgUFNDb250cm9sIENvbmZpZ3VyYXRpb24gKi8KKwlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IEZBTFNFKQorCQlyZXR1cm47CisJUlRNUEZpbmRIb3N0UENJRGV2KHBBZCk7CisJaWYgKHBPYmotPnBhcmVudF9wY2lfZGV2KSB7CisJCS8qIEZpbmQgUENJLXRvLVBDSSBCcmlkZ2UgRXhwcmVzcyBDYXBhYmlsaXR5IE9mZnNldCAqLworCQlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBPYmotPnBhcmVudF9wY2lfZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisKKwkJaWYgKHBvcyAhPSAwKSB7CisJCQlwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0ID0gcG9zICsgUENJX0VYUF9MTktDVEw7CisJCX0KKwkJLyogSWYgY29uZmlndXJhcmVkIHRvIHR1cm4gb24gTDEuICovCisJCUhvc3RDb25maWd1cmF0aW9uID0gMDsKKwkJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb3JjZUFTUE1UZXN0ID09IDEpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkVudGVyLFBTTSA6IEZvcmNlIEFTUE0gXG4iKSk7CisKKwkJCS8qIFNraXAgbm9uLWV4aXN0IGRlaWNlIHJpZ2h0IGF3YXkgKi8KKwkJCWlmICgocEFkLT5Ib3N0TG5rQ3RybE9mZnNldCAhPSAwKSkgeworCQkJCVBDSV9SRUdfUkVBRF9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LAorCQkJCQkJICBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LAorCQkJCQkJICBIb3N0Q29uZmlndXJhdGlvbik7CisJCQkJLyogUHJlcGFyZSBDb25maWd1cmF0aW9uIHRvIHdyaXRlIHRvIEhvc3QgKi8KKwkJCQlIb3N0Q29uZmlndXJhdGlvbiB8PSAweDM7CisJCQkJUENJX1JFR19XSVJURV9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LAorCQkJCQkJICAgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwKKwkJCQkJCSAgIEhvc3RDb25maWd1cmF0aW9uKTsKKwkJCQlwQWQtPlJ0M3h4SG9zdExpbmtDdHJsID0gSG9zdENvbmZpZ3VyYXRpb247CisJCQkJLyogQmVjYXVzZSBpbiBydDMweHhGb3JjZUFTUE1UZXN0IE1vZGUsIEZvcmNlIHR1cm4gb24gTDBzLCBMMS4gKi8KKwkJCQkvKiBGaXggSG9zdENvbmZpZ3VyYXRpb24gYml0MDoxID0gMHgzIGZvciBsYXRlciB1c2UuICovCisJCQkJSG9zdENvbmZpZ3VyYXRpb24gPSAweDM7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIlBTTSA6IEZvcmNlIEFTUE0gOiAiCisJCQkJCSAgIkhvc3QgZGV2aWNlIEwxL0wwcyBWYWx1ZSA9ICAweCVseFxuIiwKKwkJCQkJICBIb3N0Q29uZmlndXJhdGlvbikpOworCQkJfQorCQl9IGVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb2xsb3dIb3N0QVNQTSA9PQorCQkJICAgMSkgeworCisJCQkvKiBTa2lwIG5vbi1leGlzdCBkZWljZSByaWdodCBhd2F5ICovCisJCQlpZiAoKHBBZC0+SG9zdExua0N0cmxPZmZzZXQgIT0gMCkpIHsKKwkJCQlQQ0lfUkVHX1JFQURfV09SRChwT2JqLT5wYXJlbnRfcGNpX2RldiwKKwkJCQkJCSAgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwKKwkJCQkJCSAgSG9zdENvbmZpZ3VyYXRpb24pOworCQkJCXBBZC0+UnQzeHhIb3N0TGlua0N0cmwgPSBIb3N0Q29uZmlndXJhdGlvbjsKKwkJCQlIb3N0Q29uZmlndXJhdGlvbiAmPSAweDM7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIlBTTSA6IEZvbGxvdyBIb3N0IEFTUE0gOiAiCisJCQkJCSAgIkhvc3QgZGV2aWNlIEwxL0wwcyBWYWx1ZSA9ICAweCVseFxuIiwKKwkJCQkJICBIb3N0Q29uZmlndXJhdGlvbikpOworCQkJfQorCQl9CisJfQorCS8qIFByZXBhcmUgdG8gd3JpdGUgUmFsaW5rIHNldHRpbmcuICovCisJLyogRmluZCBSYWxpbmsgUENJZSBEZXZpY2UncyBFeHByZXNzIENhcGFiaWxpdHkgT2Zmc2V0ICovCisJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwT2JqLT5wY2lfZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisKKwlpZiAocG9zICE9IDApIHsKKwkJLyogUmFsaW5rIFBDSWUgRGV2aWNlJ3MgTGluayBDb250cm9sIFJlZ2lzdGVyIE9mZnNldCAqLworCQlwQWQtPlJMbmtDdHJsT2Zmc2V0ID0gcG9zICsgUENJX0VYUF9MTktDVEw7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsCisJCQkJICAgICAmcmVnMTYpOworCQlDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJlYWQgKFJhbGluayBQQ0llIExpbmsgQ29udHJvbCBSZWdpc3RlcikgIgorCQkJICAib2Zmc2V0IDB4JXggPSAweCVseFxuIiwKKwkJCSAgcEFkLT5STG5rQ3RybE9mZnNldCwgQ29uZmlndXJhdGlvbikpOworCQlDb25maWd1cmF0aW9uIHw9IDB4MTAwOworCQlpZiAoKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb2xsb3dIb3N0QVNQTSA9PSAxKQorCQkgICAgfHwgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb3JjZUFTUE1UZXN0ID09IDEpKSB7CisJCQlzd2l0Y2ggKEhvc3RDb25maWd1cmF0aW9uKSB7CisJCQljYXNlIDA6CisJCQkJQ29uZmlndXJhdGlvbiAmPSAweGZmZmZmZmM7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJQ29uZmlndXJhdGlvbiAmPSAweGZmZmZmZmM7CisJCQkJQ29uZmlndXJhdGlvbiB8PSAweDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJQ29uZmlndXJhdGlvbiAmPSAweGZmZmZmZmM7CisJCQkJQ29uZmlndXJhdGlvbiB8PSAweDI7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJQ29uZmlndXJhdGlvbiB8PSAweDM7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmVnMTYgPSBjcHUybGUxNihDb25maWd1cmF0aW9uKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsCisJCQkJICAgICAgcmVnMTYpOworCQlwQWQtPlJ0M3h4UmFsaW5rTGlua0N0cmwgPSBDb25maWd1cmF0aW9uOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlBTTSA6V3JpdGUgUmFsaW5rIGRldmljZSBMMS9MMHMgVmFsdWUgPSAgMHglbHhcbiIsCisJCQkgIENvbmZpZ3VyYXRpb24pKTsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfSU5GTywKKwkJICgiUFNNIDpSVE1QcnQzeFNldFBDSWVQb3dlckxpbmtDdHJsIDw9PT09PT09PT09PT09PVxuIikpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4NjAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnQyODYwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMjhmZTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9fUlQyODYwX0hfXwotI2RlZmluZSBfX1JUMjg2MF9IX18KLQotI2RlZmluZSBSVDI4eHhfQ0hJUF9OQU1FCSJSVDI4NjAiCi0KLSNkZWZpbmUgVFhJTkZPX1NJWkUgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFRYUEFERElOR19TSVpFICAgICAgCSAgMAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBFRVBST00gUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIG9mZnNldCwgdmFyKQkJXAotCXZhciA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIG9mZnNldCkKLQotI2RlZmluZSBSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkLCBvZmZzZXQsIHZhcikJCVwKLQlSVE1QX0VFUFJPTV9XUklURTE2KHBBZCwgb2Zmc2V0LCB2YXIpCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIFRBU0svVEhSRUFEIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgUlQyOFhYX1RBU0tfVEhSRUFEX0lOSVQocEFkLCBTdGF0dXMpCQlcCi0JaW5pdF90aHJlYWRfdGFzayhwQWQpOyBOSUNJbml0VHhSeFJpbmdBbmRCYWNrbG9nUXVldWUocEFkKTsJXAotCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0KLS8qIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLwotI2RlZmluZSBJUlFfSEFORExFX1RZUEUgIGlycXJldHVybl90Ci0KLUlSUV9IQU5ETEVfVFlQRQotcnQyODYwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBGcmltd2FyZSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCi0jZGVmaW5lIFJUMjhYWF9XUklURV9GSVJNV0FSRShfcEFkLCBfcEZ3SW1hZ2UsIF9Gd0xlbikJCQkJXAotCWRvewkJCQkJCQkJCQkJCQkJCQlcCi0JCVVMT05HCV9pLCBfZmlybTsJCQkJCQkJCQkJCVwKLQkJUlRNUF9JT19XUklURTMyKF9wQWQsIFBCRl9TWVNfQ1RSTCwgMHgxMDAwMCk7CQkJCVwKLQkJCQkJCQkJCQkJCQkJCQkJXAotCQlmb3IoX2k9MDsgX2k8X0Z3TGVuOyBfaSs9NCkJCQkJCQkJCQlcCi0JCXsJCQkJCQkJCQkJCQkJCQlcCi0JCQlfZmlybSA9IF9wRndJbWFnZVtfaV0gKwkJCQkJCQkJCVwKLQkJCSAgIChfcEZ3SW1hZ2VbX2krM10gPDwgMjQpICsJCQkJCQkJXAotCQkJICAgKF9wRndJbWFnZVtfaSsyXSA8PCAxNikgKwkJCQkJCQlcCi0JCQkgICAoX3BGd0ltYWdlW19pKzFdIDw8IDgpOwkJCQkJCQkJXAotCQkJUlRNUF9JT19XUklURTMyKF9wQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBfaSwgX2Zpcm0pOwlcCi0JCX0JCQkJCQkJCQkJCQkJCQlcCi0JCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBQQkZfU1lTX0NUUkwsIDB4MDAwMDApOwkJCQlcCi0JCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBQQkZfU1lTX0NUUkwsIDB4MDAwMDEpOwkJCQlcCi0JCQkJCQkJCQkJCQkJCQkJCVwKLQkJLyogaW5pdGlhbGl6ZSBCQlAgUi9XIGFjY2VzcyBhZ2VudCAqLwkJCQkJCVwKLQkJUlRNUF9JT19XUklURTMyKF9wQWQsIEgyTV9CQlBfQUdFTlQsIDApOwkJCQkJXAotCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgSDJNX01BSUxCT1hfQ1NSLCAwKTsJCQkJCVwKLQl9d2hpbGUoMCkKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gVFggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVDI4WFhfU1RBUlRfREVRVUVVRShwQWQsIFF1ZUlkeCwgaXJxRmxhZ3MpCQlkb3t9d2hpbGUoMCkKLSNkZWZpbmUgUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgaXJxRmxhZ3MpCQlkb3t9d2hpbGUoMCkKLQotCi0jZGVmaW5lIFJUMjhYWF9IQVNfRU5PVUdIX0ZSRUVfREVTQyhwQWQsIHBUeEJsaywgZnJlZU51bSwgcFBhY2tldCkgXAotCQkoKGZyZWVOdW0pID49IChVTE9ORykocFR4QmxrLT5Ub3RhbEZyYWdOdW0gKyBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpICsgMykpIC8qIHJvdWdoIGVzdGltYXRlIHdlIHdpbGwgdXNlIDMgbW9yZSBkZXNjcmlwdG9yLiAqLwotI2RlZmluZSBSVDI4WFhfUkVMRUFTRV9ERVNDX1JFU09VUkNFKHBBZCwgUXVlSWR4KQkJCQkJXAotCQlkb3t9d2hpbGUoMCkKLQotI2RlZmluZSBORUVEX1FVRVVFX0JBQ0tfRk9SX0FHRyhwQWQsIFF1ZUlkeCwgZnJlZU51bSwgX1R4RnJhbWVUeXBlKSBcCi0JCSgoKGZyZWVOdW0gIT0gKFRYX1JJTkdfU0laRS0xKSkgJiYgKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyID09IDApKSB8fCAoZnJlZU51bTwzKSkKLQkJLy8oKChmcmVlTnVtKSAhPSAoVFhfUklOR19TSVpFLTEpKSAmJiAocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPT0gMSAvKjAqLykpCi0KLQotI2RlZmluZSBIQUxfS2lja091dE1nbXRUeChfcEFkLCBfUXVlSWR4LCBfcFBhY2tldCwgX3BTcmNCdWZWQSwgX1NyY0J1ZkxlbikJXAotCQkJUnRtcFBDSU1nbXRLaWNrT3V0KF9wQWQsIF9RdWVJZHgsIF9wUGFja2V0LCBfcFNyY0J1ZlZBLCBfU3JjQnVmTGVuKQotCi0jZGVmaW5lIFJUTVBfUEtUX1RBSUxfUEFERElORyAwCi0KLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgJMAotCi0jZGVmaW5lIEhBTF9Xcml0ZVN1YlR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKQlcCi0JCS8qIFJ0bXBQQ0lfV3JpdGVTdWJUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikqLwotCi0jZGVmaW5lIEhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKLQkJCVJ0bXBQQ0lfV3JpdGVTaW5nbGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikKLQotI2RlZmluZSBIQUxfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgcEZyZWVOdW1iZXIpIFwKLQkJCVJ0bXBQQ0lfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgcEZyZWVOdW1iZXIpCi0KLSNkZWZpbmUgSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLGZyYW1lTnVtLCBwRnJlZU51bWJlcikJXAotCQkJUnRtcFBDSV9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sIHBGcmVlTnVtYmVyKQotCi0jZGVmaW5lIEhBTF9GaW5hbFdyaXRlVHhSZXNvdXJjZShfcEFkLCBfcFR4QmxrLCBfVG90YWxNUERVU2l6ZSwgX0ZpcnN0VHhJZHgpCVwKLQkJCVJ0bXBQQ0lfRmluYWxXcml0ZVR4UmVzb3VyY2UoX3BBZCwgX3BUeEJsaywgX1RvdGFsTVBEVVNpemUsIF9GaXJzdFR4SWR4KQotCi0jZGVmaW5lIEhBTF9MYXN0VHhJZHgoX3BBZCwgX1F1ZUlkeCxfTGFzdFR4SWR4KSBcCi0JCQkvKlJ0bXBQQ0lEYXRhTGFzdFR4SWR4KF9wQWQsIF9RdWVJZHgsX0xhc3RUeElkeCkqLwotCi0jZGVmaW5lIEhBTF9LaWNrT3V0VHgoX3BBZCwgX3BUeEJsaywgX1F1ZUlkeCkJXAotCQkJUlRNUF9JT19XUklURTMyKChfcEFkKSwgVFhfQ1RYX0lEWDArKChfUXVlSWR4KSoweDEwKSwgKF9wQWQpLT5UeFJpbmdbKF9RdWVJZHgpXS5UeENwdUlkeCkKLS8qCQkJUnRtcFBDSURhdGFLaWNrT3V0KF9wQWQsIF9wVHhCbGssIF9RdWVJZHgpKi8KLQotI2RlZmluZSBIQUxfS2lja091dE51bGxGcmFtZVR4KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCVwKLQkJCU1pbmlwb3J0TU1SZXF1ZXN0KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCi0KLSNkZWZpbmUgR0VUX1RYUklOR19GUkVFTk8oX3BBZCwgX1F1ZUlkeCkgXAotCShfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHggPiBfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhDcHVJZHgpCT8gXAotCQkJKF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeFN3RnJlZUlkeCAtIF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeENwdUlkeCAtIDEpIFwKLQkJCSA6CVwKLQkJCShfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHggKyBUWF9SSU5HX1NJWkUgLSBfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhDcHVJZHggLSAxKTsKLQotCi0jZGVmaW5lIEdFVF9NR01UUklOR19GUkVFTk8oX3BBZCkgXAotCShfcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA+IF9wQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KQk/IFwKLQkJCShfcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCAtIF9wQWQtPk1nbXRSaW5nLlR4Q3B1SWR4IC0gMSkgXAotCQkJIDoJXAotCQkJKF9wQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ICsgTUdNVF9SSU5HX1NJWkUgLSBfcEFkLT5NZ210UmluZy5UeENwdUlkeCAtIDEpOwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIFJYIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLy8gbm8gdXNlCi0jZGVmaW5lIFJUMjhYWF9SQ1ZfUEtUX0dFVF9JTklUKHBBZCkKLSNkZWZpbmUgUlQyOFhYX1JWX0FfQlVGX0VORAotLy8jZGVmaW5lIFJUMjhYWF9SVl9BTExfQlVGX0VORAotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIEFTSUMgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotLy8gbm8gdXNlCi0jZGVmaW5lIFJUMjhYWF9ETUFfUE9TVF9XUklURShwQWQpCi0KLS8vIHJlc2V0IE1BQyBvZiBhIHN0YXRpb24gZW50cnkgdG8gMHgwMDAwMDAwMDAwMDAKLSNkZWZpbmUgUlQyOFhYX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCBXY2lkKQkJCQkJCVwKLQlBc2ljRGVsV2NpZFRhYihwQWQsIFdjaWQpOwotCi0vLyBhZGQgdGhpcyBlbnRyeSBpbnRvIEFTSUMgUlggV0NJRCBzZWFyY2ggdGFibGUKLSNkZWZpbmUgUlQyOFhYX1NUQV9FTlRSWV9BREQocEFkLCBwRW50cnkpCQkJCQkJCVwKLQlBc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCBwRW50cnktPkFpZCwgcEVudHJ5LT5BZGRyKTsKLQotLy8gcmVtb3ZlIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgZnJvbSBBU0lDCi0jZGVmaW5lIFJUMjhYWF9TVEFfRU5UUllfS0VZX0RFTChwQWQsIEJzc0lkeCwgV2NpZCkJCQkJCVwKLQlBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsIEJzc0lkeCwgKFVDSEFSKVdjaWQpOwotCi0vLyBhZGQgQ2xpZW50IHNlY3VyaXR5IGluZm9ybWF0aW9uIGludG8gQVNJQyBXQ0lEIHRhYmxlIGFuZCBJVkVJViB0YWJsZQotI2RlZmluZSBSVDI4WFhfU1RBX1NFQ1VSSVRZX0lORk9fQUREKHBBZCwgYXBpZHgsIEtleUlELCBwRW50cnkpCQlcCi0JUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIGFwaWR4LCBLZXlJRCwgCQkJCQlcCi0JCQkJCQkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5DaXBoZXJBbGcsIHBFbnRyeSk7Ci0KLSNkZWZpbmUgUlQyOFhYX1NFQ1VSSVRZX0tFWV9BREQocEFkLCBhcGlkeCwgS2V5SUQsIHBFbnRyeSkJCQkJXAotCXsJLyogdXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUgKi8JXAotCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBhcGlkeCwgS2V5SUQsCQkJCQkJXAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZywJCVwKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5LZXksCQkJCVwKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5UeE1pYywJCQlcCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uUnhNaWMpOwkJCVwKLQkJLyogdXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlICovCQkJXAotCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgYXBpZHgsIEtleUlELAkJCQkJXAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZywJCVwKLQkJCQkJCSAgcEVudHJ5KTsgfQotCi0KLS8vIEluc2VydCB0aGUgQkEgYml0bWFwIHRvIEFTSUMgZm9yIHRoZSBXY2lkIGVudHJ5Ci0jZGVmaW5lIFJUMjhYWF9BRERfQkFfU0VTU0lPTl9UT19BU0lDKF9wQWQsIF9BaWQsIF9USUQpCQkJCQlcCi0JCWRvewkJCQkJCQkJCQkJCQkJCQlcCi0JCQlVSU5UMzIJX1ZhbHVlID0gMCwgX09mZnNldDsJCQkJCQkJCQlcCi0JCQlfT2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChfQWlkKSAqIEhXX1dDSURfRU5UUllfU0laRSArIDQ7CVwKLQkJCVJUTVBfSU9fUkVBRDMyKChfcEFkKSwgX09mZnNldCwgJl9WYWx1ZSk7CQkJCQlcCi0JCQlfVmFsdWUgfD0gKDB4MTAwMDA8PChfVElEKSk7CQkJCQkJCQlcCi0JCQlSVE1QX0lPX1dSSVRFMzIoKF9wQWQpLCBfT2Zmc2V0LCBfVmFsdWUpOwkJCQkJXAotCQl9d2hpbGUoMCkKLQotCi0vLyBSZW1vdmUgdGhlIEJBIGJpdG1hcCBmcm9tIEFTSUMgZm9yIHRoZSBXY2lkIGVudHJ5Ci0vLwkJYml0bWFwIGZpZWxkIHN0YXJ0cyBhdCAweDEwMDAwIGluIEFTSUMgV0NJRCB0YWJsZQotI2RlZmluZSBSVDI4WFhfREVMX0JBX1NFU1NJT05fRlJPTV9BU0lDKF9wQWQsIF9XY2lkLCBfVElEKQkJCQlcCi0JCWRvewkJCQkJCQkJCQkJCQkJCQlcCi0JCQlVSU5UMzIJX1ZhbHVlID0gMCwgX09mZnNldDsJCQkJCQkJCQlcCi0JCQlfT2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChfV2NpZCkgKiBIV19XQ0lEX0VOVFJZX1NJWkUgKyA0OwlcCi0JCQlSVE1QX0lPX1JFQUQzMigoX3BBZCksIF9PZmZzZXQsICZfVmFsdWUpOwkJCQkJXAotCQkJX1ZhbHVlICY9ICh+KDB4MTAwMDAgPDwgKF9USUQpKSk7CQkJCQkJCVwKLQkJCVJUTVBfSU9fV1JJVEUzMigoX3BBZCksIF9PZmZzZXQsIF9WYWx1ZSk7CQkJXAotCQl9d2hpbGUoMCkKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBQQ0kvVVNCIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2RlZmluZSBSVDI4WFhfSEFORExFX0RFVl9BU1NJR04oaGFuZGxlLCBkZXZfcCkJCQkJXAotCSgoUE9TX0NPT0tJRSloYW5kbGUpLT5wY2lfZGV2ID0gZGV2X3A7Ci0KLS8vIHNldCBkcml2ZXIgZGF0YQotI2RlZmluZSBSVDI4WFhfRFJWREFUQV9TRVQoX2EpCQkJcGNpX3NldF9kcnZkYXRhKF9hLCBuZXRfZGV2KTsKLQotI2RlZmluZSBSVDI4WFhfVU5NQVAoKQkJCQkJCQkJCQlcCi17CWlmIChuZXRfZGV2LT5iYXNlX2FkZHIpCXsJCQkJCQkJCVwKLQkJaW91bm1hcCgodm9pZCAqKShuZXRfZGV2LT5iYXNlX2FkZHIpKTsJCQkJXAotCQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KGRldl9wLCAwKSwJXAotCQkJCQkJCXBjaV9yZXNvdXJjZV9sZW4oZGV2X3AsIDApKTsgfQlcCi0JaWYgKG5ldF9kZXYtPmlycSkgcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXZfcCk7IH0KLQotI2lmZGVmIFBDSV9NU0lfU1VQUE9SVAotI2RlZmluZSBSVE1QX01TSV9FTkFCTEUoX3BBZCkgXAoteyAJUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShfcEFkLT5PU19Db29raWUpOyBcCi0JKF9wQWQpLT5IYXZlTXNpID0JcGNpX2VuYWJsZV9tc2koX3BPYmotPnBjaV9kZXYpID09IDAgPyBUUlVFIDogRkFMU0U7IH0KLQotI2RlZmluZSBSVE1QX01TSV9ESVNBQkxFKF9wQWQpIFwKLXsgCVBPU19DT09LSUUgX3BPYmogPSAoUE9TX0NPT0tJRSkoX3BBZC0+T1NfQ29va2llKTsgXAotCWlmIChfcEFkLT5IYXZlTXNpID09IFRSVUUpIFwKLQkJcGNpX2Rpc2FibGVfbXNpKF9wT2JqLT5wY2lfZGV2KTsgXAotCV9wQWQtPkhhdmVNc2kgPSBGQUxTRTsJfQotI2Vsc2UKLSNkZWZpbmUgUlRNUF9NU0lfRU5BQkxFKF9wQWQpCi0jZGVmaW5lIFJUTVBfTVNJX0RJU0FCTEUoX3BBZCkKLSNlbmRpZiAvLyBQQ0lfTVNJX1NVUFBPUlQgLy8KLQotI2RlZmluZSBTQV9TSElSUSBJUlFGX1NIQVJFRAotCi0jZGVmaW5lIFJUMjhYWF9JUlFfUkVRVUVTVChuZXRfZGV2KQkJCQkJCQlcCi17CVBSVE1QX0FEQVBURVIgX3BBZCA9IChQUlRNUF9BREFQVEVSKSgobmV0X2RldiktPm1sX3ByaXYpOwlcCi0JUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShfcEFkLT5PU19Db29raWUpOwkJXAotCVJUTVBfTVNJX0VOQUJMRShfcEFkKTsJCQkJCQkJCQlcCi0JaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShfcE9iai0+cGNpX2Rldi0+aXJxLCAJCVwKLQkJCQkJCQlydDI4NjBfaW50ZXJydXB0LCBTQV9TSElSUSwJCVwKLQkJCQkJCQkobmV0X2RldiktPm5hbWUsIChuZXRfZGV2KSkpKSB7CVwKLQkJcHJpbnRrKCJSVDI4NjA6IHJlcXVlc3RfaXJxICBFUlJPUiglZClcbiIsIHJldHZhbCk7CVwKLQlyZXR1cm4gcmV0dmFsOyB9IH0KLQotI2RlZmluZSBSVDI4WFhfSVJRX1JFTEVBU0UobmV0X2RldikJCQkJCQkJCVwKLXsJUFJUTVBfQURBUFRFUiBfcEFkID0gKFBSVE1QX0FEQVBURVIpKChuZXRfZGV2KS0+bWxfcHJpdik7CQlcCi0JUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShfcEFkLT5PU19Db29raWUpOwkJCVwKLQlzeW5jaHJvbml6ZV9pcnEoX3BPYmotPnBjaV9kZXYtPmlycSk7CQkJCQkJXAotCWZyZWVfaXJxKF9wT2JqLT5wY2lfZGV2LT5pcnEsIChuZXRfZGV2KSk7CQkJCQlcCi0JUlRNUF9NU0lfRElTQUJMRShfcEFkKTsgfQotCi0jZGVmaW5lIFJUMjhYWF9JUlFfSU5JVChwQWQpCQkJCQkJCQkJCVwKLQl7CXBBZC0+aW50X2VuYWJsZV9yZWcgPSAoKERFTEFZSU5UTUFTSykgfAkJCQkJCVwKLQkJCQkJCQkoUnhJTlR8VHhEYXRhSW50fFR4TWdtdEludCkpICYgfigweDAzKTsJXAotCQlwQWQtPmludF9kaXNhYmxlX21hc2sgPSAwOwkJCQkJCQkJCVwKLQkJcEFkLT5pbnRfcGVuZGluZyA9IDA7IH0KLQotI2RlZmluZSBSVDI4WFhfSVJRX0VOQUJMRShwQWQpCQkJCQkJCQkJXAotCXsJLyogY2xlYXIgZ2FyYmFnZSBpbnRzICovCQkJCQkJCQlcCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAweGZmZmZmZmZmKTsJCVwKLQkJTklDRW5hYmxlSW50ZXJydXB0KHBBZCk7IH0KLQotI2RlZmluZSBSVDI4WFhfUFVUX0RFVklDRShkZXZfcCkKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBNTE1FIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgUlQyOFhYX01MTUVfSEFORExFUihwQWQpCQkJTWxtZUhhbmRsZXIocEFkKQotCi0jZGVmaW5lIFJUMjhYWF9NTE1FX1BSRV9TQU5JVFlfQ0hFQ0socEFkKQotCi0jZGVmaW5lIFJUMjhYWF9NTE1FX1NUQV9RVUlDS19SU1BfV0FLRV9VUChwQWQpCVwKLQlSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLCAxMDApOwotCi0jZGVmaW5lIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkKQlcCi0JCU1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lKHBBZCkKLQotI2RlZmluZSBSVDI4WFhfSEFORExFX0NPVU5URVJfTUVBU1VSRShfcEFkLCBfcEVudHJ5KQkJXAotCQlIYW5kbGVDb3VudGVyTWVhc3VyZShfcEFkLCBfcEVudHJ5KQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBQb3dlciBTYXZlIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgUlQyOFhYX1BTX1BPTExfRU5RVUVVRShwQWQpCQkJCUVucXVldWVQc1BvbGwocEFkKQotCi0vLwotLy8gRGV2aWNlIElEICYgVmVuZG9yIElELCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoIEVFUFJPTSB2YWx1ZQotLy8KLSNkZWZpbmUgTklDMjg2MF9QQ0lfREVWSUNFX0lEICAgMHgwNjAxCi0jZGVmaW5lIE5JQzI4NjBfUENJZV9ERVZJQ0VfSUQgIDB4MDY4MQotI2RlZmluZSBOSUMyNzYwX1BDSV9ERVZJQ0VfSUQgICAweDA3MDEJCS8vIDFULzJSIENhcmRidXMgPz8/Ci0jZGVmaW5lIE5JQzI3OTBfUENJZV9ERVZJQ0VfSUQgIDB4MDc4MQkgICAgLy8gMVQvMlIgbWluaUNhcmQKLQotI2RlZmluZSBOSUNfUENJX1ZFTkRPUl9JRCAgICAgICAweDE4MTQKLQotI2RlZmluZSBWRU5fQVdUX1BDSWVfREVWSUNFX0lECTB4MTA1OQotI2RlZmluZSBWRU5fQVdUX1BDSV9WRU5ET1JfSUQJMHgxQTNCCi0KLSNkZWZpbmUgRURJTUFYX1BDSV9WRU5ET1JfSUQJMHgxNDMyCi0KLS8vIEZvciBSVE1QUENJZVBvd2VyTGlua0N0cmxSZXN0b3JlICgpIGZ1bmN0aW9uCi0jZGVmaW5lIFJFU1RPUkVfSEFMVAkJICAgIDEKLSNkZWZpbmUgUkVTVE9SRV9XQUtFVVAJCSAgICAyCi0jZGVmaW5lIFJFU1RPUkVfQ0xPU0UgICAgICAgICAgIDMKLQotI2RlZmluZSBQb3dlclNhZmVDSUQJCTEKLSNkZWZpbmUgUG93ZXJSYWRpb09mZkNJRAkJMgotI2RlZmluZSBQb3dlcldha2VDSUQJCTMKLSNkZWZpbmUgQ0lEME1BU0sJCTB4MDAwMDAwZmYKLSNkZWZpbmUgQ0lEMU1BU0sJCTB4MDAwMGZmMDAKLSNkZWZpbmUgQ0lEMk1BU0sJCTB4MDBmZjAwMDAKLSNkZWZpbmUgQ0lEM01BU0sJCTB4ZmYwMDAwMDAKLQotI2RlZmluZSBQQ0lfUkVHX1JFQURfV09SRChwY2lfZGV2LCBvZmZzZXQsIENvbmZpZ3VyYXRpb24pICAgXAotICAgIGlmIChwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBvZmZzZXQsICZyZWcxNikgPT0gMCkgICAgIFwKLSAgICAgICAgQ29uZmlndXJhdGlvbiA9IGxlMmNwdTE2KHJlZzE2KTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBDb25maWd1cmF0aW9uID0gMDsKLQotI2RlZmluZSBQQ0lfUkVHX1dJUlRFX1dPUkQocGNpX2Rldiwgb2Zmc2V0LCBDb25maWd1cmF0aW9uKSAgXAotICAgIHJlZzE2ID0gY3B1MmxlMTYoQ29uZmlndXJhdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHBjaV93cml0ZV9jb25maWdfd29yZChwY2lfZGV2LCBvZmZzZXQsIHJlZzE2KTsgICAgICAgICAgXAotCi0jZGVmaW5lIFJUMjhYWF9TVEFfRk9SQ0VfV0FLRVVQKHBBZCwgTGV2ZWwpIFwKLSAgICBSVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXAocEFkLCBMZXZlbCk7Ci0KLSNkZWZpbmUgUlQyOFhYX1NUQV9TTEVFUF9USEVOX0FVVE9fV0FLRVVQKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCkgXAotICAgIFJUMjh4eFBjaVN0YUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7Ci0KLSNkZWZpbmUgUlQyOFhYX01MTUVfUkFESU9fT04ocEFkKSBcCi0gICAgUlQyOHh4UGNpTWxtZVJhZGlvT24ocEFkKTsKLQotI2RlZmluZSBSVDI4WFhfTUxNRV9SQURJT19PRkYocEFkKSBcCi0gICAgUlQyOHh4UGNpTWxtZVJhZGlvT0ZGKHBBZCk7Ci0KLSNlbmRpZiAvL19fUlQyODYwX0hfXwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0Mjh4eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4eHguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4NTI1MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0Mjh4eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY4OCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXJ0Mjh4eC5oCi0KLQlBYnN0cmFjdDoKLQlSVDI4eHggQVNJQyByZWxhdGVkIGRlZmluaXRpb24gJiBzdHJ1Y3R1cmVzCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCSAgV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgSmFuIExlZSAgICAgICAgICAgSmFuLTMtMjAwNiAgICAgY3JlYXRlZCBmb3IgUlQyODYwYwotKi8KLQotI2lmbmRlZglfX1JUMjhYWF9IX18KLSNkZWZpbmUJX19SVDI4WFhfSF9fCi0KLQotLy8KLS8vIFBDSSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgwMDAwCi0vLwotI2RlZmluZSBQQ0lfQ0ZHCQkJMHgwMDAwCi0jZGVmaW5lIFBDSV9FRUNUUkwJCQkweDAwMDQKLSNkZWZpbmUgUENJX01DVUNUUkwJCQkweDAwMDgKLQotdHlwZWRlZiBpbnQgTlRTVEFUVVM7Ci0KLSNkZWZpbmUJT1BUXzE0CQkJMHgxMTQKLQotLy8KLS8vIFNDSC9ETUEgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MDIwMAotLy8KLS8vIElOVF9TT1VSQ0VfQ1NSOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyLiBXcml0ZSBvbmUgdG8gY2xlYXIgY29ycmVzcG9uZGluZyBiaXQKLS8vCi0jZGVmaW5lIERNQV9DU1IwICAgICAgMHgyMDAKLSNkZWZpbmUgSU5UX1NPVVJDRV9DU1IgICAgICAweDIwMAotdHlwZWRlZgl1bmlvbglfSU5UX1NPVVJDRV9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJUnhEZWxheUlOVDoxOwotCQlVSU5UMzIJCVR4RGVsYXlJTlQ6MTsKLQkJVUlOVDMyCQlSeERvbmU6MTsKLQkJVUlOVDMyCQlBYzBEbWFEb25lOjE7Ly80Ci0JCVVJTlQzMiAgICAgICAJQWMxRG1hRG9uZToxOwotCQlVSU5UMzIgICAgICAgCUFjMkRtYURvbmU6MTsKLQkJVUlOVDMyICAgICAgIAlBYzNEbWFEb25lOjE7Ci0JCVVJTlQzMiAgICAgICAJSGNjYURtYURvbmU6MTsgLy8gYml0NwotCQlVSU5UMzIgICAgICAgCU1nbXREbWFEb25lOjE7Ci0JCVVJTlQzMiAgICAgICAJTUNVQ29tbWFuZElOVDoxOy8vYml0IDkKLQkJVUlOVDMyICAgICAgIAlSeFR4Q29oZXJlbnQ6MTsKLQkJVUlOVDMyICAgICAgIAlUQlRUSW50OjE7Ci0JCVVJTlQzMiAgICAgICAJUHJlVEJUVDoxOwotCQlVSU5UMzIgICAgICAgCVRYRmlmb1N0YXR1c0ludDoxOy8vRklGTyBTdGF0aXN0aWNzIGlzIGZ1bGwsIHN3IHNob3VsZCByZWFkIDB4MTcxYwotCQlVSU5UMzIgICAgICAgCUF1dG9XYWtldXA6MTsvL2JpdDE0Ci0JCVVJTlQzMiAgICAgICAJR1BUaW1lcjoxOwotCQlVSU5UMzIgICAgICAgCVJ4Q29oZXJlbnQ6MTsvL2JpdDE2Ci0JCVVJTlQzMiAgICAgICAJVHhDb2hlcmVudDoxOwotCQlVSU5UMzIgICAgICAgCToxNDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19IElOVF9TT1VSQ0VfQ1NSX1NUUlVDLCAqUElOVF9TT1VSQ0VfQ1NSX1NUUlVDOwotCi0vLwotLy8gSU5UX01BU0tfQ1NSOiAgIEludGVycnVwdCBNQVNLIHJlZ2lzdGVyLiAgIDE6IHRoZSBpbnRlcnJ1cHQgaXMgbWFzayBPRkYKLS8vCi0jZGVmaW5lIElOVF9NQVNLX0NTUiAgICAgICAgMHgyMDQKLXR5cGVkZWYJdW5pb24JX0lOVF9NQVNLX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSWERlbGF5X0lOVF9NU0s6MTsKLQkJVUlOVDMyCQlUeERlbGF5OjE7Ci0JCVVJTlQzMgkJUnhEb25lOjE7Ci0JCVVJTlQzMgkJQWMwRG1hRG9uZToxOwotCQlVSU5UMzIgICAgICAgCUFjMURtYURvbmU6MTsKLQkJVUlOVDMyICAgICAgIAlBYzJEbWFEb25lOjE7Ci0JCVVJTlQzMiAgICAgICAJQWMzRG1hRG9uZToxOwotCQlVSU5UMzIgICAgICAgCUhjY2FEbWFEb25lOjE7Ci0JCVVJTlQzMiAgICAgICAJTWdtdERtYURvbmU6MTsKLQkJVUlOVDMyICAgICAgIAlNQ1VDb21tYW5kSU5UOjE7Ci0JCVVJTlQzMiAgICAgICAJOjIwOwotCQlVSU5UMzIgICAgICAgCVJ4Q29oZXJlbnQ6MTsKLQkJVUlOVDMyICAgICAgIAlUeENvaGVyZW50OjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfSBJTlRfTUFTS19DU1JfU1RSVUMsICpQSU5UX01BU0tfQ1NSX1NUUlVDOwotCi0jZGVmaW5lIFdQRE1BX0dMT19DRkcgCTB4MjA4Ci10eXBlZGVmCXVuaW9uCV9XUERNQV9HTE9fQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCUVuYWJsZVR4RE1BOjE7Ci0JCVVJTlQzMgkJVHhETUFCdXN5OjE7Ci0JCVVJTlQzMgkJRW5hYmxlUnhETUE6MTsKLQkJVUlOVDMyCQlSeERNQUJ1c3k6MTsKLQkJVUlOVDMyICAgICAgIAlXUERNQUJ1cnN0U0laRToyOwotCQlVSU5UMzIgICAgICAgCUVuVFhXcml0ZUJhY2tERE9ORToxOwotCQlVSU5UMzIgICAgICAgCUJpZ0VuZGlhbjoxOwotCQlVSU5UMzIgICAgICAgCVJYSGRyU2NhdGVyOjg7Ci0JCVVJTlQzMiAgICAgICAJSERSX1NFR19MRU46MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfSBXUERNQV9HTE9fQ0ZHX1NUUlVDLCAqUFdQRE1BX0dMT19DRkdfU1RSVUM7Ci0KLSNkZWZpbmUgV1BETUFfUlNUX0lEWCAJMHgyMGMKLXR5cGVkZWYJdW5pb24JX1dQRE1BX1JTVF9JRFhfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJUlNUX0RUWF9JRFgwOjE7Ci0JCVVJTlQzMgkJUlNUX0RUWF9JRFgxOjE7Ci0JCVVJTlQzMgkJUlNUX0RUWF9JRFgyOjE7Ci0JCVVJTlQzMgkJUlNUX0RUWF9JRFgzOjE7Ci0JCVVJTlQzMiAgICAgICAJUlNUX0RUWF9JRFg0OjE7Ci0JCVVJTlQzMiAgICAgICAJUlNUX0RUWF9JRFg1OjE7Ci0JCVVJTlQzMiAgICAgICAJcnN2OjEwOwotCQlVSU5UMzIgICAgICAgCVJTVF9EUlhfSURYMDoxOwotCQlVSU5UMzIgICAgICAgCToxNTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19IFdQRE1BX1JTVF9JRFhfU1RSVUMsICpQV1BETUFfUlNUX0lEWF9TVFJVQzsKLQotI2RlZmluZSBERUxBWV9JTlRfQ0ZHICAweDAyMTAKLXR5cGVkZWYJdW5pb24JX0RFTEFZX0lOVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJUlhNQVhfUFRJTUU6ODsKLQkJVUlOVDMyICAgICAgIAlSWE1BWF9QSU5UOjc7Ci0JCVVJTlQzMiAgICAgICAJUlhETFlfSU5UX0VOOjE7Ci0JCVVJTlQzMiAgICAgICAJVFhNQVhfUFRJTUU6ODsKLQkJVUlOVDMyICAgICAgIAlUWE1BWF9QSU5UOjc7Ci0JCVVJTlQzMiAgICAgICAJVFhETFlfSU5UX0VOOjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfSBERUxBWV9JTlRfQ0ZHX1NUUlVDLCAqUERFTEFZX0lOVF9DRkdfU1RSVUM7Ci0KLSNkZWZpbmUgV01NX0FJRlNOX0NGRyAgIDB4MDIxNAotdHlwZWRlZgl1bmlvbglfQUlGU05fQ1NSX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICBBaWZzbjA6NDsgICAgICAgLy8gZm9yIEFDX0JFCi0JICAgIFVJTlQzMiAgIEFpZnNuMTo0OyAgICAgICAvLyBmb3IgQUNfQksKLQkgICAgVUlOVDMyICAgQWlmc24yOjQ7ICAgICAgIC8vIGZvciBBQ19WSQotCSAgICBVSU5UMzIgICBBaWZzbjM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCi0JICAgIFVJTlQzMiAgIFJzdjoxNjsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUFJRlNOX0NTUl9TVFJVQywgKlBBSUZTTl9DU1JfU1RSVUM7Ci0KLS8vCi0vLyBDV01JTl9DU1I6IENXbWluIGZvciBlYWNoIEVEQ0EgQUMKLS8vCi0jZGVmaW5lIFdNTV9DV01JTl9DRkcgICAweDAyMTgKLXR5cGVkZWYJdW5pb24JX0NXTUlOX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgQ3dtaW4wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQotCSAgICBVSU5UMzIgICBDd21pbjE6NDsgICAgICAgLy8gZm9yIEFDX0JLCi0JICAgIFVJTlQzMiAgIEN3bWluMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKLQkgICAgVUlOVDMyICAgQ3dtaW4zOjQ7ICAgICAgIC8vIGZvciBBQ19WTwotCSAgICBVSU5UMzIgICBSc3Y6MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlDV01JTl9DU1JfU1RSVUMsICpQQ1dNSU5fQ1NSX1NUUlVDOwotCi0vLwotLy8gQ1dNQVhfQ1NSOiBDV21pbiBmb3IgZWFjaCBFRENBIEFDCi0vLwotI2RlZmluZSBXTU1fQ1dNQVhfQ0ZHICAgMHgwMjFjCi10eXBlZGVmCXVuaW9uCV9DV01BWF9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgIEN3bWF4MDo0OyAgICAgICAvLyBmb3IgQUNfQkUKLQkgICAgVUlOVDMyICAgQ3dtYXgxOjQ7ICAgICAgIC8vIGZvciBBQ19CSwotCSAgICBVSU5UMzIgICBDd21heDI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCi0JICAgIFVJTlQzMiAgIEN3bWF4Mzo0OyAgICAgICAvLyBmb3IgQUNfVk8KLQkgICAgVUlOVDMyICAgUnN2OjE2OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQ1dNQVhfQ1NSX1NUUlVDLCAqUENXTUFYX0NTUl9TVFJVQzsKLQotLy8KLS8vIEFDX1RYT1BfQ1NSMDogQUNfQksvQUNfQkUgVFhPUCByZWdpc3RlcgotLy8KLSNkZWZpbmUgV01NX1RYT1AwX0NGRyAgICAweDAyMjAKLXR5cGVkZWYJdW5pb24JX0FDX1RYT1BfQ1NSMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBYzBUeG9wOyAgICAgICAgLy8gZm9yIEFDX0JLLCBpbiB1bml0IG9mIDMydXMKLQkgICAgVVNIT1JUICBBYzFUeG9wOyAgICAgICAgLy8gZm9yIEFDX0JFLCBpbiB1bml0IG9mIDMydXMKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUFDX1RYT1BfQ1NSMF9TVFJVQywgKlBBQ19UWE9QX0NTUjBfU1RSVUM7Ci0KLS8vCi0vLyBBQ19UWE9QX0NTUjE6IEFDX1ZPL0FDX1ZJIFRYT1AgcmVnaXN0ZXIKLS8vCi0jZGVmaW5lIFdNTV9UWE9QMV9DRkcgICAgMHgwMjI0Ci10eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjFfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWMyVHhvcDsgICAgICAgIC8vIGZvciBBQ19WSSwgaW4gdW5pdCBvZiAzMnVzCi0JICAgIFVTSE9SVCAgQWMzVHhvcDsgICAgICAgIC8vIGZvciBBQ19WTywgaW4gdW5pdCBvZiAzMnVzCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlBQ19UWE9QX0NTUjFfU1RSVUMsICpQQUNfVFhPUF9DU1IxX1NUUlVDOwotCi0jZGVmaW5lIFJJTkdSRUdfRElGRgkJCTB4MTAKLSNkZWZpbmUgR1BJT19DVFJMX0NGRyAgICAweDAyMjgJLy9NQUNfQ1NSMTMKLSNkZWZpbmUgTUNVX0NNRF9DRkcgICAgMHgwMjJjCi0jZGVmaW5lIFRYX0JBU0VfUFRSMCAgICAgMHgwMjMwCS8vQUNfQksgYmFzZSBhZGRyZXNzCi0jZGVmaW5lIFRYX01BWF9DTlQwICAgICAgMHgwMjM0Ci0jZGVmaW5lIFRYX0NUWF9JRFgwICAgICAgIDB4MDIzOAotI2RlZmluZSBUWF9EVFhfSURYMCAgICAgIDB4MDIzYwotI2RlZmluZSBUWF9CQVNFX1BUUjEgICAgIDB4MDI0MCAJLy9BQ19CRSBiYXNlIGFkZHJlc3MKLSNkZWZpbmUgVFhfTUFYX0NOVDEgICAgICAweDAyNDQKLSNkZWZpbmUgVFhfQ1RYX0lEWDEgICAgICAgMHgwMjQ4Ci0jZGVmaW5lIFRYX0RUWF9JRFgxICAgICAgMHgwMjRjCi0jZGVmaW5lIFRYX0JBU0VfUFRSMiAgICAgMHgwMjUwIAkvL0FDX1ZJIGJhc2UgYWRkcmVzcwotI2RlZmluZSBUWF9NQVhfQ05UMiAgICAgIDB4MDI1NAotI2RlZmluZSBUWF9DVFhfSURYMiAgICAgICAweDAyNTgKLSNkZWZpbmUgVFhfRFRYX0lEWDIgICAgICAweDAyNWMKLSNkZWZpbmUgVFhfQkFTRV9QVFIzICAgICAweDAyNjAgCS8vQUNfVk8gYmFzZSBhZGRyZXNzCi0jZGVmaW5lIFRYX01BWF9DTlQzICAgICAgMHgwMjY0Ci0jZGVmaW5lIFRYX0NUWF9JRFgzICAgICAgIDB4MDI2OAotI2RlZmluZSBUWF9EVFhfSURYMyAgICAgIDB4MDI2YwotI2RlZmluZSBUWF9CQVNFX1BUUjQgICAgIDB4MDI3MCAJLy9IQ0NBIGJhc2UgYWRkcmVzcwotI2RlZmluZSBUWF9NQVhfQ05UNCAgICAgIDB4MDI3NAotI2RlZmluZSBUWF9DVFhfSURYNCAgICAgICAweDAyNzgKLSNkZWZpbmUgVFhfRFRYX0lEWDQgICAgICAweDAyN2MKLSNkZWZpbmUgVFhfQkFTRV9QVFI1ICAgICAweDAyODAgCS8vTUdNVCBiYXNlIGFkZHJlc3MKLSNkZWZpbmUgIFRYX01BWF9DTlQ1ICAgICAweDAyODQKLSNkZWZpbmUgVFhfQ1RYX0lEWDUgICAgICAgMHgwMjg4Ci0jZGVmaW5lIFRYX0RUWF9JRFg1ICAgICAgMHgwMjhjCi0jZGVmaW5lIFRYX01HTVRNQVhfQ05UICAgICAgVFhfTUFYX0NOVDUKLSNkZWZpbmUgVFhfTUdNVENUWF9JRFggICAgICAgVFhfQ1RYX0lEWDUKLSNkZWZpbmUgVFhfTUdNVERUWF9JRFggICAgICBUWF9EVFhfSURYNQotI2RlZmluZSBSWF9CQVNFX1BUUiAgICAgMHgwMjkwIAkvL1JYIGJhc2UgYWRkcmVzcwotI2RlZmluZSBSWF9NQVhfQ05UICAgICAgMHgwMjk0Ci0jZGVmaW5lIFJYX0NSWF9JRFggICAgICAgMHgwMjk4Ci0jZGVmaW5lIFJYX0RSWF9JRFggICAgICAweDAyOWMKLSNkZWZpbmUgVVNCX0RNQV9DRkcgICAgICAweDAyYTAKLQotdHlwZWRlZgl1bmlvbglfVVNCX0RNQV9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgUnhCdWxrQWdnVE91dDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIFRpbWVPdXQgIGluIHVuaXQgb2YgMzNucwotCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ0xtdDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIExpbWl0ICBpbiB1bml0IG9mIDI1NiBieXRlcwotCSAgICBVSU5UMzIgIHBoeWNsZWFyOjE7ICAgICAgICAJCS8vcGh5IHdhdGNoIGRvZyBlbmFibGUuIHdyaXRlIDEKLQkgICAgVUlOVDMyICByc3Y6MjsKLQkgICAgVUlOVDMyICBUeENsZWFyOjE7ICAgICAgICAvL0NsZWFyIFVTQiBETUEgVFggcGF0aAotCSAgICBVSU5UMzIgIFR4b3BIYWx0OjE7ICAgICAgICAvL0hhbHQgVFhPUCBjb3VudCBkb3duIHdoZW4gVFggYnVmZmVyIGlzIGZ1bGwuCi0JICAgIFVJTlQzMiAgUnhCdWxrQWdnRW46MTsgICAgICAgIC8vRW5hYmxlIFJ4IEJ1bGsgQWdncmVnYXRpb24KLQkgICAgVUlOVDMyICBSeEJ1bGtFbjoxOyAgICAgICAgLy9FbmFibGUgVVNCIERNQSBSeAotCSAgICBVSU5UMzIgIFR4QnVsa0VuOjE7ICAgICAgICAvL0VuYWJsZSBVU0IgRE1BIFR4Ci0JICAgIFVJTlQzMiAgRXBvdXRWYWxpZDo2OyAgICAgICAgLy9PVVQgZW5kcG9pbnQgZGF0YSB2YWxpZAotCSAgICBVSU5UMzIgIFJ4QnVzeToxOyAgICAgICAgLy9VU0IgRE1BIFJYIEZTTSBidXN5Ci0JICAgIFVJTlQzMiAgVHhCdXN5OjE7ICAgCS8vVVNCIERNQSBUWCBGU00gYnVzeQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVVNCX0RNQV9DRkdfU1RSVUMsICpQVVNCX0RNQV9DRkdfU1RSVUM7Ci0KLS8vCi0vLyAgMyAgUEJGICByZWdpc3RlcnMKLS8vCi0vLwotLy8gTW9zdCBhcmUgZm9yIGRlYnVnLiBEcml2ZXIgZG9lc24ndCB0b3VjaCBQQkYgcmVnaXN0ZXIuCi0jZGVmaW5lIAlQQkZfU1lTX0NUUkwgCSAweDA0MDAKLSNkZWZpbmUgICAgIFBCRl9DRkcgICAgICAgICAgICAgICAgIDB4MDQwOAotI2RlZmluZSAJUEJGX01BWF9QQ05UIAkgMHgwNDBDCi0jZGVmaW5lIAlQQkZfQ1RSTAkgCTB4MDQxMAotI2RlZmluZSAJUEJGX0lOVF9TVEEJIDB4MDQxNAotI2RlZmluZSAJUEJGX0lOVF9FTkEJIDB4MDQxOAotI2RlZmluZSAJVFhSWFFfUENOVCAgCSAweDA0MzgKLSNkZWZpbmUgCVBCRl9EQkcgCSAJIDB4MDQzYwotI2RlZmluZSAgICAgUEJGX0NBUF9DVFJMICAgICAweDA0NDAKLQotLy8gZUZ1c2UgcmVnaXN0ZXJzCi0jZGVmaW5lIEVGVVNFX0NUUkwgICAgICAgICAgICAgIDB4MDU4MAotI2RlZmluZSBFRlVTRV9EQVRBMCAgICAgICAgICAgICAweDA1OTAKLSNkZWZpbmUgRUZVU0VfREFUQTEgICAgICAgICAgICAgMHgwNTk0Ci0jZGVmaW5lIEVGVVNFX0RBVEEyICAgICAgICAgICAgIDB4MDU5OAotI2RlZmluZSBFRlVTRV9EQVRBMyAgICAgICAgICAgICAweDA1OWMKLSNkZWZpbmUgRUZVU0VfVVNBR0VfTUFQX1NUQVJUICAgMHgyZDAKLSNkZWZpbmUgRUZVU0VfVVNBR0VfTUFQX0VORCAgICAgMHgyZmMKLSNkZWZpbmUgRUZVU0VfVEFHICAgICAgICAgICAgICAgMHgyZmUKLSNkZWZpbmUgRUZVU0VfVVNBR0VfTUFQX1NJWkUgICAgNDUKLQotdHlwZWRlZgl1bmlvbglfRUZVU0VfQ1RSTF9TVFJVQyB7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX0FPVVQ6NjsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX01PREU6MjsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX0xET19PRkZfVElNRTo2OwotCQlVSU5UMzIgICAgICAgICAgICBFRlNST01fTERPX09OX1RJTUU6MjsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX0FJTjoxMDsKLQkJVUlOVDMyICAgICAgICAgICAgUkVTRVJWRUQ6NDsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX0tJQ0s6MTsKLQkJVUlOVDMyICAgICAgICAgICAgU0VMX0VGVVNFOjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlFRlVTRV9DVFJMX1NUUlVDLCAqUEVGVVNFX0NUUkxfU1RSVUM7Ci0KLSNkZWZpbmUgTERPX0NGRzAgCQkJCTB4MDVkNAotI2RlZmluZSBHUElPX1NXSVRDSAkJCQkweDA1ZGMKLQotLy8KLS8vICA0ICBNQUMgIHJlZ2lzdGVycwotLy8KLS8vCi0vLyAgNC4xIE1BQyBTWVNURU0gIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMDAwKQotLy8KLSNkZWZpbmUgTUFDX0NTUjAgICAgICAgICAgICAweDEwMDAKLXR5cGVkZWYJdW5pb24JX0FTSUNfVkVSX0lEX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFTSUNSZXY7ICAgICAgICAvLyByZXZlcnNpb24gIDogMAotCSAgICBVU0hPUlQgIEFTSUNWZXI7ICAgICAgICAvLyB2ZXJzaW9uIDogMjg2MAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQVNJQ19WRVJfSURfU1RSVUMsICpQQVNJQ19WRVJfSURfU1RSVUM7Ci0KLSNkZWZpbmUgTUFDX1NZU19DVFJMICAgICAgICAgICAgMHgxMDA0CQkvL01BQ19DU1IxCi0jZGVmaW5lIE1BQ19BRERSX0RXMCAgICAgICAgICAgIAkJMHgxMDA4CQkvLyBNQUMgQUREUiBEVzAKLSNkZWZpbmUgTUFDX0FERFJfRFcxICAgICAgICAgICAJCSAweDEwMGMJCS8vIE1BQyBBRERSIERXMQotLy8KLS8vIE1BQ19DU1IyOiBTVEEgTUFDIHJlZ2lzdGVyIDAKLS8vCi10eXBlZGVmCXVuaW9uCV9NQUNfRFcwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJQnl0ZTA7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDAKLQkJVUNIQVIJCUJ5dGUxOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAxCi0JCVVDSEFSCQlCeXRlMjsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMgotCQlVQ0hBUgkJQnl0ZTM7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDMKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU1BQ19EVzBfU1RSVUMsICpQTUFDX0RXMF9TVFJVQzsKLQotLy8KLS8vIE1BQ19DU1IzOiBTVEEgTUFDIHJlZ2lzdGVyIDEKLS8vCi10eXBlZGVmCXVuaW9uCV9NQUNfRFcxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKLQkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1Ci0JCVVDSEFSCQlVMk1lTWFzazsKLQkJVUNIQVIJCVJzdmQxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTUFDX0RXMV9TVFJVQywgKlBNQUNfRFcxX1NUUlVDOwotCi0jZGVmaW5lIE1BQ19CU1NJRF9EVzAgICAgICAgICAgICAJCTB4MTAxMAkJLy8gTUFDIEJTU0lEIERXMAotI2RlZmluZSBNQUNfQlNTSURfRFcxICAgICAgICAgICAgCQkweDEwMTQJCS8vIE1BQyBCU1NJRCBEVzEKLQotLy8KLS8vIE1BQ19DU1I1OiBCU1NJRCByZWdpc3RlciAxCi0vLwotdHlwZWRlZgl1bmlvbglfTUFDX0NTUjVfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVDSEFSCQlCeXRlNDsJCSAvLyBCU1NJRCBieXRlIDQKLQkJVUNIQVIJCUJ5dGU1OwkJIC8vIEJTU0lEIGJ5dGUgNQotCQlVU0hPUlQgICAgICAJQnNzSWRNYXNrOjI7IC8vIDA6IG9uZSBCU1NJRCwgMTA6IDQgQlNTSUQsICAwMTogMiBCU1NJRCAsIDExOiA4QlNTSUQKLQkJVVNIT1JUCQlNQnNzQmNuTnVtOjM7Ci0JCVVTSE9SVAkJUnN2ZDoxMTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU1BQ19DU1I1X1NUUlVDLCAqUE1BQ19DU1I1X1NUUlVDOwotCi0jZGVmaW5lIE1BWF9MRU5fQ0ZHICAgICAgICAgICAgICAweDEwMTgJCS8vIHJ0Mjg2MGIgbWF4IDE2ayBieXRlcy4gYml0MTI6MTMgTWF4aW11bSBQU0RVIGxlbmd0aCAocG93ZXIgZmFjdG9yKSAwOjJeMTMsIDE6Ml4xNCwgMjoyXjE1LCAzOjJeMTYKLSNkZWZpbmUgQkJQX0NTUl9DRkcgICAgICAgICAgICAJCTB4MTAxYwkJLy8KLS8vCi0vLyBCQlBfQ1NSX0NGRzogQkJQIHNlcmlhbCBjb250cm9sIHJlZ2lzdGVyCi0vLwotdHlwZWRlZgl1bmlvbglfQkJQX0NTUl9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJVmFsdWU6ODsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCi0JCVVJTlQzMgkJUmVnTnVtOjg7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCi0JCVVJTlQzMgkJZlJlYWQ6MTsJCSAgICAvLyAwOiBXcml0ZQlCQlAsIDE6CVJlYWQgQkJQCi0JCVVJTlQzMgkJQnVzeToxOwkJCQkvLyAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBCQlAgcHJvZ3JhbW1pbmcuCi0JCVVJTlQzMgkJQkJQX1BBUl9EVVI6MTsJCSAgICAgLy8gMDogNCBNQUMgY2xvY2sgY3ljbGVzICAxOiA4IE1BQyBjbG9jayBjeWNsZXMKLQkJVUlOVDMyCQlCQlBfUldfTU9ERToxOwkJLy8gMDogdXNlIHNlcmlhbCBtb2RlICAxOnBhcmFsbGVsCi0JCVVJTlQzMgkJOjEyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQkJQX0NTUl9DRkdfU1RSVUMsICpQQkJQX0NTUl9DRkdfU1RSVUM7Ci0KLSNkZWZpbmUgUkZfQ1NSX0NGRzAgICAgICAgICAgICAJCTB4MTAyMAotLy8KLS8vIFJGX0NTUl9DRkc6IFJGIGNvbnRyb2wgcmVnaXN0ZXIKLS8vCi10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAotCQlVSU5UMzIJCWJpdHdpZHRoOjU7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCi0JCVVJTlQzMgkJU3RhbmRieU1vZGU6MTsJCSAgICAvLyAwOiBoaWdoIHdoZW4gc3RhbmQgYnkgMToJbG93IHdoZW4gc3RhbmRieQotCQlVSU5UMzIJCVNlbDoxOwkJCQkvLyAwOlJGX0xFMCBhY3RpdmF0ZSAgMTpSRl9MRTEgYWN0aXZhdGUKLQkJVUlOVDMyCQlCdXN5OjE7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUkZfQ1NSX0NGRzBfU1RSVUMsICpQUkZfQ1NSX0NGRzBfU1RSVUM7Ci0KLSNkZWZpbmUgUkZfQ1NSX0NGRzEgICAgICAgICAgIAkJMHgxMDI0Ci10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAotCQlVSU5UMzIJCVJGR2FwOjU7CQkJLy8gR2FwIGJldHdlZW4gQkJfQ09OVFJPTF9SRiBhbmQgUkZfTEUuIDA6IDMgc3lzdGVtIGNsb2NrIGN5Y2xlICgzNy41dXNlYykgMTogNSBzeXN0ZW0gY2xvY2sgY3ljbGUgKDYyLjV1c2VjKQotCQlVSU5UMzIJCXJzdjo3OwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJGX0NTUl9DRkcxX1NUUlVDLCAqUFJGX0NTUl9DRkcxX1NUUlVDOwotCi0jZGVmaW5lIFJGX0NTUl9DRkcyICAgICAgICAgICAJCTB4MTAyOAkJLy8KLXR5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcyX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCi0JCVVJTlQzMgkJcnN2Ojg7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUkZfQ1NSX0NGRzJfU1RSVUMsICpQUkZfQ1NSX0NGRzJfU1RSVUM7Ci0KLSNkZWZpbmUgTEVEX0NGRyAgICAgICAgICAgCQkweDEwMmMJCS8vICBNQUNfQ1NSMTQKLXR5cGVkZWYJdW5pb24JX0xFRF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJT25QZXJpb2Q6ODsJCQkvLyBibGlua2luZyBvbiBwZXJpb2QgdW5pdCAxbXMKLQkJVUlOVDMyCQlPZmZQZXJpb2Q6ODsJCQkvLyBibGlua2luZyBvZmYgcGVyaW9kIHVuaXQgMW1zCi0JCVVJTlQzMgkJU2xvd0JsaW5rUGVyaW9kOjY7CQkJLy8gc2xvdyBibGlua2luZyBwZXJpb2QuIHVuaXQ6MW1zCi0JCVVJTlQzMgkJcnN2OjI7Ci0JCVVJTlQzMgkJUkxlZE1vZGU6MjsJCQkvLyByZWQgTGVkIE1vZGUgICAgMDogb2ZmMTogYmxpbmtpbmcgdXBvbiBUWDI6IHBlcmlvZGljIHNsb3cgYmxpbmtpbmczOiBhbHdheXMgb24KLQkJVUlOVDMyCQlHTGVkTW9kZToyOwkJCS8vIGdyZWVuIExlZCBNb2RlCi0JCVVJTlQzMgkJWUxlZE1vZGU6MjsJCQkvLyB5ZWxsb3cgTGVkIE1vZGUKLQkJVUlOVDMyCQlMZWRQb2xhcjoxOwkJCS8vIExlZCBQb2xhcml0eS4gIDA6IGFjdGl2ZSBsb3cxOiBhY3RpdmUgaGlnaAotCQlVSU5UMzIJCToxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTEVEX0NGR19TVFJVQywgKlBMRURfQ0ZHX1NUUlVDOwotCi0vLwotLy8gIDQuMiBNQUMgVElNSU5HICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTEwMCkKLS8vCi0jZGVmaW5lIFhJRlNfVElNRV9DRkcgICAgICAgICAgICAgMHgxMTAwCQkgLy8gTUFDX0NTUjggIE1BQ19DU1I5Ci10eXBlZGVmCXVuaW9uCV9JRlNfU0xPVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgQ2NrbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgQ0NLIFJYL1RYCi0JICAgIFVJTlQzMiAgT2ZkbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWC9UWAotCSAgICBVSU5UMzIgIE9mZG1YaWZzVGltZTo0OyAgICAgICAgLy9PRkRNIFNJRlMuIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlggd2hlbiBNQUMgZG9lc24ndCByZWZlcmVuY2UgQkJQIHNpZ25hbCBCQlJYRU5ECi0JICAgIFVJTlQzMiAgRUlGUzo5OyAgICAgICAgLy8gIHVuaXQgMXVzCi0JICAgIFVJTlQzMiAgQkJSeGVuZEVuYWJsZToxOyAgICAgICAgLy8gIHJlZmVyZW5jZSBSWEVORCBzaWduYWwgdG8gYmVnaW4gWElGUyBkZWZlcgotCSAgICBVSU5UMzIgIHJzdjoyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JSUZTX1NMT1RfQ0ZHX1NUUlVDLCAqUElGU19TTE9UX0NGR19TVFJVQzsKLQotI2RlZmluZSBCS09GRl9TTE9UX0NGRyAgICAgICAgICAgICAweDExMDQJCSAvLyAgbWFjX2NzcjkgbGFzdCA4IGJpdHMKLSNkZWZpbmUgTkFWX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTEwOAkJIC8vIE5BViAgKE1BQ19DU1IxNSkKLSNkZWZpbmUgQ0hfVElNRV9DRkcgICAgICAgICAgICAgMHgxMTBDCQkgCS8vIENvdW50IGFzIGNoYW5uZWwgYnVzeQotI2RlZmluZSBQQkZfTElGRV9USU1FUiAgICAgICAgICAgICAweDExMTAJCSAvL1RYL1JYIE1QRFUgdGltZXN0YW1wIHRpbWVyIChmcmVlIHJ1bilVbml0OiAxdXMKLSNkZWZpbmUgQkNOX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTExNAkJIC8vIFRYUlhfQ1NSOQotCi0jZGVmaW5lIEJDTl9PRkZTRVQwCQkJCTB4MDQyQwotI2RlZmluZSBCQ05fT0ZGU0VUMQkJCQkweDA0MzAKLQotLy8KLS8vIEJDTl9USU1FX0NGRyA6IFN5bmNocm9uaXphdGlvbiBjb250cm9sIHJlZ2lzdGVyCi0vLwotdHlwZWRlZgl1bmlvbglfQkNOX1RJTUVfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIgICAgICAgQmVhY29uSW50ZXJ2YWw6MTY7ICAvLyBpbiB1bml0IG9mIDEvMTYgVFUKLQkJVUlOVDMyCQliVHNmVGlja2luZzoxOwkJLy8gRW5hYmxlIFRTRiBhdXRvIGNvdW50aW5nCi0JCVVJTlQzMgkJVHNmU3luY01vZGU6MjsJCS8vIEVuYWJsZSBUU0Ygc3luYywgMDA6IGRpc2FibGUsIDAxOiBpbmZyYSBtb2RlLCAxMDogYWQtaG9jIG1vZGUKLSAgICAgICAgVUlOVDMyICAgICAgIGJUQlRURW5hYmxlOjE7Ci0JCVVJTlQzMgkJYkJlYWNvbkdlbjoxOwkJLy8gRW5hYmxlIGJlYWNvbiBnZW5lcmF0b3IKLSAgICAgICAgVUlOVDMyICAgICAgIDozOwotCQlVSU5UMzIJCVR4VGltZXN0YW1wQ29tcGVuc2F0ZTo4OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQkNOX1RJTUVfQ0ZHX1NUUlVDLCAqUEJDTl9USU1FX0NGR19TVFJVQzsKLQotI2RlZmluZSBUQlRUX1NZTkNfQ0ZHICAgICAgICAgICAgMHgxMTE4ICAJCS8vIHR4cnhfY3NyMTAKLSNkZWZpbmUgVFNGX1RJTUVSX0RXMCAgICAgICAgICAgICAweDExMUMgIAkJLy8gTG9jYWwgVFNGIHRpbWVyIGxzYiAzMiBiaXRzLiBSZWFkLW9ubHkKLSNkZWZpbmUgVFNGX1RJTUVSX0RXMSAgICAgICAgICAgICAweDExMjAgIAkJLy8gbXNiIDMyIGJpdHMuIFJlYWQtb25seS4KLSNkZWZpbmUgVEJUVF9USU1FUiAgICAgICAgICAgICAJMHgxMTI0ICAJCS8vIFRJbWVyIHJlbWFpbnMgdGlsbCBuZXh0IFRCVFQuIFJlYWQtb25seS4gIFRYUlhfQ1NSMTQKLSNkZWZpbmUgSU5UX1RJTUVSX0NGRyAgICAgICAgICAgICAgCTB4MTEyOCAgCQkvLwotI2RlZmluZSBJTlRfVElNRVJfRU4gICAgICAgICAgICAgCTB4MTEyYyAgCQkvLyAgR1AtdGltZXIgYW5kIHByZS10YnR0IEludCBlbmFibGUKLSNkZWZpbmUgQ0hfSURMRV9TVEEgICAgICAgICAgICAgIAkweDExMzAgIAkJLy8gIGNoYW5uZWwgaWRsZSB0aW1lCi0jZGVmaW5lIENIX0JVU1lfU1RBICAgICAgICAgICAgICAJMHgxMTM0ICAJCS8vICBjaGFubmxlIGJ1c3kgdGltZQotLy8KLS8vICA0LjIgTUFDIFBPV0VSICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTIwMCkKLS8vCi0jZGVmaW5lIE1BQ19TVEFUVVNfQ0ZHICAgICAgICAgICAgIDB4MTIwMAkJIC8vIG9sZCBNQUNfQ1NSMTIKLSNkZWZpbmUgUFdSX1BJTl9DRkcgICAgICAgICAgICAgMHgxMjA0CQkgLy8gb2xkIE1BQ19DU1IxMgotI2RlZmluZSBBVVRPX1dBS0VVUF9DRkcgICAgICAgICAgICAgMHgxMjA4CQkgLy8gb2xkIE1BQ19DU1IxMAotLy8KLS8vIEFVVE9fV0FLRVVQX0NGRzogTWFudWFsIHBvd2VyIGNvbnRyb2wgLyBzdGF0dXMgcmVnaXN0ZXIKLS8vCi10eXBlZGVmCXVuaW9uCV9BVVRPX1dBS0VVUF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyICAgICAgIEF1dG9MZWFkVGltZTo4OwotCQlVSU5UMzIgICAgICAgTnVtb2ZTbGVlcGluZ1RidHQ6NzsgICAgICAgICAgLy8gRm9yY2VXYWtlIGhhcyBoaWdoIHByaXZpbGVnZSB0aGFuIFB1dFRvU2xlZXAgd2hlbiBib3RoIHNldAotCQlVSU5UMzIJCUVuYWJsZUF1dG9XYWtldXA6MTsJLy8gMDpzbGVlcCwgMTphd2FrZQotCQlVSU5UMzIJCToxNjsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUFVVE9fV0FLRVVQX1NUUlVDLCAqUEFVVE9fV0FLRVVQX1NUUlVDOwotCi0vLwotLy8gIDQuMyBNQUMgVFggIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMzAwKQotLy8KLQotI2RlZmluZSBFRENBX0FDMF9DRkcJMHgxMzAwCQkvL0FDX1RYT1BfQ1NSMCAweDM0NzQKLSNkZWZpbmUgRURDQV9BQzFfQ0ZHCTB4MTMwNAotI2RlZmluZSBFRENBX0FDMl9DRkcJMHgxMzA4Ci0jZGVmaW5lIEVEQ0FfQUMzX0NGRwkweDEzMGMKLXR5cGVkZWYJdW5pb24JX0VEQ0FfQUNfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgIEFjVHhvcDo4OyAgICAgICAgLy8gIGluIHVuaXQgb2YgMzJ1cwotCSAgICBVSU5UMzIgIEFpZnNuOjQ7ICAgICAgICAvLyAjIG9mIHNsb3QgdGltZQotCSAgICBVSU5UMzIgIEN3bWluOjQ7ICAgICAgICAvLwotCSAgICBVSU5UMzIgIEN3bWF4OjQ7ICAgICAgICAvL3VuaXQgcG93ZXIgb2YgMgotCSAgICBVSU5UMzIgIDoxMjsgICAgICAgLy8KLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUVEQ0FfQUNfQ0ZHX1NUUlVDLCAqUEVEQ0FfQUNfQ0ZHX1NUUlVDOwotCi0jZGVmaW5lIEVEQ0FfVElEX0FDX01BUAkweDEzMTAKLSNkZWZpbmUgVFhfUFdSX0NGR18wCTB4MTMxNAotI2RlZmluZSBUWF9QV1JfQ0ZHXzEJMHgxMzE4Ci0jZGVmaW5lIFRYX1BXUl9DRkdfMgkweDEzMUMKLSNkZWZpbmUgVFhfUFdSX0NGR18zCTB4MTMyMAotI2RlZmluZSBUWF9QV1JfQ0ZHXzQJMHgxMzI0Ci0jZGVmaW5lIFRYX1BJTl9DRkcJCTB4MTMyOAotI2RlZmluZSBUWF9CQU5EX0NGRwkweDEzMmMJCS8vIDB4MSB1c2UgdXBwZXIgMjBNSHouIDAganVzZSBsb3dlciAyME1IegotI2RlZmluZSBUWF9TV19DRkcwCQkweDEzMzAKLSNkZWZpbmUgVFhfU1dfQ0ZHMQkJMHgxMzM0Ci0jZGVmaW5lIFRYX1NXX0NGRzIJCTB4MTMzOAotI2RlZmluZSBUWE9QX1RIUkVTX0NGRwkJMHgxMzNjCi0jZGVmaW5lIFRYT1BfQ1RSTF9DRkcJCTB4MTM0MAotI2RlZmluZSBUWF9SVFNfQ0ZHCQkweDEzNDQKLQotdHlwZWRlZgl1bmlvbglfVFhfUlRTX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgICAgIEF1dG9SdHNSZXRyeUxpbWl0Ojg7Ci0JICAgIFVJTlQzMiAgICAgICBSdHNUaHJlczoxNjsgICAgLy8gdW5pdDpieXRlCi0JICAgIFVJTlQzMiAgICAgICBSdHNGYmtFbjoxOyAgICAvLyBlbmFibGUgcnRzIHJhdGUgZmFsbGJhY2sKLQkgICAgVUlOVDMyICAgICAgIHJzdjo3OyAgICAgLy8gMTogSFQgbm9uLVNUQkMgY29udHJvbCBmcmFtZSBlbmFibGUKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX1JUU19DRkdfU1RSVUMsICpQVFhfUlRTX0NGR19TVFJVQzsKLQotI2RlZmluZSBUWF9USU1FT1VUX0NGRwkweDEzNDgKLXR5cGVkZWYJdW5pb24JX1RYX1RJTUVPVVRfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgcnN2OjQ7Ci0JICAgIFVJTlQzMiAgICAgICBNcGR1TGlmZVRpbWU6NDsgICAgLy8gIGV4cGlyYXRpb24gdGltZSA9IDJeKDkrTVBEVSBMSUZFIFRJTUUpICB1cwotCSAgICBVSU5UMzIgICAgICAgUnhBY2tUaW1lb3V0Ojg7CS8vIHVuaXQ6c2xvdC4gVXNlZCBmb3IgVFggcHJlY2VkdXJlCi0JICAgIFVJTlQzMiAgICAgICBUeG9wVGltZW91dDo4OwkvL1RYT1AgdGltZW91dCB2YWx1ZSBmb3IgVFhPUCB0cnVuY2F0aW9uLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAoU0xPVF9USU1FKSA+IChUWF9PUF9USU1FT1VUKSA+IChSWF9BQ0tfVElNRU9VVCkKLQkgICAgVUlOVDMyICAgICAgIHJzdjI6ODsgICAgIC8vIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9USU1FT1VUX0NGR19TVFJVQywgKlBUWF9USU1FT1VUX0NGR19TVFJVQzsKLQotI2RlZmluZSBUWF9SVFlfQ0ZHCTB4MTM0YwotdHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1JUWV9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBTaG9ydFJ0eUxpbWl0Ojg7CS8vICBzaG9ydCByZXRyeSBsaW1pdAotCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eUxpbWl0Ojg7CS8vbG9uZyByZXRyeSBsaW1pdAotCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eVRocmU6MTI7CS8vIExvbmcgcmV0cnkgdGhyZXNob29sZAotCSAgICBVSU5UMzIgICAgICAgTm9uQWdnUnR5TW9kZToxOwkvLyBOb24tQWdncmVnYXRlIE1QRFUgcmV0cnkgbW9kZS4gIDA6ZXhwaXJlZCBieSByZXRyeSBsaW1pdCwgMTogZXhwaXJlZCBieSBtcGR1IGxpZmUgdGltZXIKLQkgICAgVUlOVDMyICAgICAgIEFnZ1J0eU1vZGU6MTsJLy8gQWdncmVnYXRlIE1QRFUgcmV0cnkgbW9kZS4gIDA6ZXhwaXJlZCBieSByZXRyeSBsaW1pdCwgMTogZXhwaXJlZCBieSBtcGR1IGxpZmUgdGltZXIKLQkgICAgVUlOVDMyICAgICAgIFR4YXV0b0ZCRW5hYmxlOjE7ICAgIC8vIFR4IHJldHJ5IFBIWSByYXRlIGF1dG8gZmFsbGJhY2sgZW5hYmxlCi0JICAgIFVJTlQzMiAgICAgICByc3Y6MTsgICAgIC8vIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9SVFlfQ0ZHX1NUUlVDLCAqUFRYX1JUWV9DRkdfU1RSVUM7Ci0KLSNkZWZpbmUgVFhfTElOS19DRkcJMHgxMzUwCi10eXBlZGVmCXVuaW9uCVBBQ0tFRCBfVFhfTElOS19DRkdfU1RSVUMJewotCXN0cnVjdCBQQUNLRUQgewotCSAgICBVSU5UMzIgICAgICAgUmVtb3RlTUZCTGlmZVRpbWU6ODsJLy9yZW1vdGUgTUZCIGxpZmUgdGltZS4gdW5pdCA6IDMydXMKLQkgICAgVUlOVDMyICAgICAgIE1GQkVuYWJsZToxOwkvLyAgVFggYXBwbHkgcmVtb3RlIE1GQiAxOmVuYWJsZQotCSAgICBVSU5UMzIgICAgICAgUmVtb3RlVU1GU0VuYWJsZToxOwkvLyAgcmVtb3RlIHVuc29saWNpdCAgTUZCIGVuYWJsZS4gIDA6IG5vdCBhcHBseSByZW1vdGUgcmVtb3RlIHVuc29saWNpdCAoTUZTPTcpCi0JICAgIFVJTlQzMiAgICAgICBUeE1SUUVuOjE7CS8vICBNQ1MgcmVxdWVzdCBUWCBlbmFibGUKLQkgICAgVUlOVDMyICAgICAgIFR4UkRHRW46MTsJLy8gUkRHIFRYIGVuYWJsZQotCSAgICBVSU5UMzIgICAgICAgVHhDRkFja0VuOjE7CS8vICAgUGlnZ3liYWNrIENGLUFDSyBlbmFibGUKLQkgICAgVUlOVDMyICAgICAgIHJzdjozOwkvLwotCSAgICBVSU5UMzIgICAgICAgUmVtb3RNRkI6ODsgICAgLy8gIHJlbW90ZSBNQ1MgZmVlZGJhY2sKLQkgICAgVUlOVDMyICAgICAgIFJlbW90TUZTOjg7CS8vcmVtb3RlIE1DUyBmZWVkYmFjayBzZXF1ZW5jZSBudW1iZXIKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0xJTktfQ0ZHX1NUUlVDLCAqUFRYX0xJTktfQ0ZHX1NUUlVDOwotCi0jZGVmaW5lIEhUX0ZCS19DRkcwCTB4MTM1NAotdHlwZWRlZgl1bmlvbiBQQUNLRUQgX0hUX0ZCS19DRkcwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MwRkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzFGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMkZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MzRkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzRGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTNUZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1M2RkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzdGQks6NDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUhUX0ZCS19DRkcwX1NUUlVDLCAqUEhUX0ZCS19DRkcwX1NUUlVDOwotCi0jZGVmaW5lIEhUX0ZCS19DRkcxCTB4MTM1OAotdHlwZWRlZgl1bmlvbglfSFRfRkJLX0NGRzFfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzhGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTOUZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMEZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMUZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMkZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxM0ZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNEZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNUZCSzo0OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JSFRfRkJLX0NGRzFfU1RSVUMsICpQSFRfRkJLX0NGRzFfU1RSVUM7Ci0KLSNkZWZpbmUgTEdfRkJLX0NGRzAJMHgxMzVjCi10eXBlZGVmCXVuaW9uCV9MR19GQktfQ0ZHMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCi0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzJGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDEKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCi0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMwotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzVGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDQKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M2RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA1Ci0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTN0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNgotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTEdfRkJLX0NGRzBfU1RSVUMsICpQTEdfRkJLX0NGRzBfU1RSVUM7Ci0KLSNkZWZpbmUgTEdfRkJLX0NGRzEJCTB4MTM2MAotdHlwZWRlZgl1bmlvbglfTEdfRkJLX0NGRzFfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCi0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MxRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCi0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MyRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAxCi0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCi0JICAgIFVJTlQzMiAgICAgICByc3Y6MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlMR19GQktfQ0ZHMV9TVFJVQywgKlBMR19GQktfQ0ZHMV9TVFJVQzsKLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLz09PT09PT09PT09PT09PT0gUHJvdGVjdGlvbiBQYXJhbWF0ZXI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jZGVmaW5lIENDS19QUk9UX0NGRwkweDEzNjQJCS8vQ0NLIFByb3RlY3Rpb24KLSNkZWZpbmUgQVNJQ19TSE9SVE5BVgkJMQotI2RlZmluZSBBU0lDX0xPTkdOQVYJCTIKLSNkZWZpbmUgQVNJQ19SVFMJCTEKLSNkZWZpbmUgQVNJQ19DVFMJCTIKLXR5cGVkZWYJdW5pb24JX1BST1RfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdFJhdGU6MTY7CS8vUHJvdGVjdGlvbiBjb250cm9sIGZyYW1lIHJhdGUgZm9yIENDSyBUWChSVFMvQ1RTL0NGRW5kKS4KLQkgICAgVUlOVDMyICAgICAgIFByb3RlY3RDdHJsOjI7CS8vUHJvdGVjdGlvbiBjb250cm9sIGZyYW1lIHR5cGUgZm9yIENDSyBUWC4gMTpSVFMvQ1RTLCAyOkNUUy10by1zZWxmLCAwOk5vbmUsIDM6cnN2Ci0JICAgIFVJTlQzMiAgICAgICBQcm90ZWN0TmF2OjI7CS8vVFhPUCBwcm90ZWN0aW9uIHR5cGUgZm9yIENDSyBUWC4gMDpOb25lLCAxOlNob3J0TkFWcHJvdGVjdCwgIDI6TG9uZ05BVlByb3RlY3QsIDM6cnN2Ci0JICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dDY2s6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd09mZG06MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuIDA6ZGlzYWxsb3cuCi0JICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dNTTQwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCi0JICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dHRjIwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCi0JICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dHRjQwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCi0JICAgIFVJTlQzMiAgICAgICBSVFNUaEVuOjE7CS8vUlRTIHRocmVzaG9sZCBlbmFibGUgb24gQ0NLIFRYCi0JICAgIFVJTlQzMiAgICAgICByc3Y6NTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVBST1RfQ0ZHX1NUUlVDLCAqUFBST1RfQ0ZHX1NUUlVDOwotCi0jZGVmaW5lIE9GRE1fUFJPVF9DRkcJMHgxMzY4CQkvL09GRE0gUHJvdGVjdGlvbgotI2RlZmluZSBNTTIwX1BST1RfQ0ZHCTB4MTM2QwkJLy9NTTIwIFByb3RlY3Rpb24KLSNkZWZpbmUgTU00MF9QUk9UX0NGRwkweDEzNzAJCS8vTU00MCBQcm90ZWN0aW9uCi0jZGVmaW5lIEdGMjBfUFJPVF9DRkcJMHgxMzc0CQkvL0dGMjAgUHJvdGVjdGlvbgotI2RlZmluZSBHRjQwX1BST1RfQ0ZHCTB4MTM3OAkJLy9HUjQwIFByb3RlY3Rpb24KLSNkZWZpbmUgRVhQX0NUU19USU1FCTB4MTM3QwkJLy8KLSNkZWZpbmUgRVhQX0FDS19USU1FCTB4MTM4MAkJLy8KLQotLy8KLS8vICA0LjQgTUFDIFJYIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxNDAwKQotLy8KLSNkZWZpbmUgUlhfRklMVFJfQ0ZHCTB4MTQwMAkJCS8vVFhSWF9DU1IwCi0jZGVmaW5lIEFVVE9fUlNQX0NGRwkweDE0MDQJCQkvL1RYUlhfQ1NSNAotLy8KLS8vIFRYUlhfQ1NSNDogQXV0by1SZXNwb25kZXIvCi0vLwotdHlwZWRlZiB1bmlvbiBfQVVUT19SU1BfQ0ZHX1NUUlVDIHsKLSBzdHJ1Y3QgewotICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlckVuYWJsZToxOwotICAgICBVSU5UMzIgICAgICAgQkFDQWNrUG9saWN5RW5hYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQotICAgICBVSU5UMzIgICAgICAgQ1RTNDBNTW9kZToxOyAgLy8gUmVzcG9uc2UgQ1RTIDQwTUh6IGR1cGxpY2F0ZSBtb2RlCi0gICAgIFVJTlQzMiAgICAgICBDVFM0ME1SZWY6MTsgIC8vIFJlc3BvbnNlIENUUyA0ME1IeiBkdXBsaWNhdGUgbW9kZQotICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlclByZWFtYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQotICAgICBVSU5UMzIgICAgICAgcnN2OjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCi0gICAgIFVJTlQzMiAgICAgICBEdWFsQ1RTRW46MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKLSAgICAgVUlOVDMyICAgICAgIEFja0N0c1BzbUJpdDoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQotICAgICBVSU5UMzIgICAgICAgIDoyNDsKLSB9IGZpZWxkOwotIFVJTlQzMiAgIHdvcmQ7Ci19IEFVVE9fUlNQX0NGR19TVFJVQywgKlBBVVRPX1JTUF9DRkdfU1RSVUM7Ci0KLSNkZWZpbmUgTEVHQUNZX0JBU0lDX1JBVEUJMHgxNDA4CS8vICBUWFJYX0NTUjUgICAgICAgICAgIDB4MzA1NAotI2RlZmluZSBIVF9CQVNJQ19SQVRFCQkweDE0MGMKLSNkZWZpbmUgSFRfQ1RSTF9DRkcJCTB4MTQxMAotI2RlZmluZSBTSUZTX0NPU1RfQ0ZHCQkweDE0MTQKLSNkZWZpbmUgUlhfUEFSU0VSX0NGRwkJMHgxNDE4CS8vU2V0IE5BViBmb3IgYWxsIHJlY2VpdmVkIGZyYW1lcwotCi0vLwotLy8gIDQuNSBNQUMgU2VjdXJpdHkgY29uZmlndXJhdGlvbiAob2Zmc2V0OjB4MTUwMCkKLS8vCi0jZGVmaW5lIFRYX1NFQ19DTlQwCQkweDE1MDAJCS8vCi0jZGVmaW5lIFJYX1NFQ19DTlQwCQkweDE1MDQJCS8vCi0jZGVmaW5lIENDTVBfRkNfTVVURQkJMHgxNTA4CQkvLwotLy8KLS8vICA0LjYgSENDQS9QU01QIChvZmZzZXQ6MHgxNjAwKQotLy8KLSNkZWZpbmUgVFhPUF9ITERSX0FERFIwCQkweDE2MDAKLSNkZWZpbmUgVFhPUF9ITERSX0FERFIxCQkweDE2MDQKLSNkZWZpbmUgVFhPUF9ITERSX0VUCQkweDE2MDgKLSNkZWZpbmUgUU9TX0NGUE9MTF9SQV9EVzAJCTB4MTYwYwotI2RlZmluZSBRT1NfQ0ZQT0xMX0ExX0RXMQkJMHgxNjEwCi0jZGVmaW5lIFFPU19DRlBPTExfUUMJCTB4MTYxNAotLy8KLS8vICA0LjcgTUFDIFN0YXRpc3RpcyByZWdpc3RlcnMgKG9mZnNldDoweDE3MDApCi0vLwotI2RlZmluZSBSWF9TVEFfQ05UMAkJMHgxNzAwCQkvLwotI2RlZmluZSBSWF9TVEFfQ05UMQkJMHgxNzA0CQkvLwotI2RlZmluZSBSWF9TVEFfQ05UMgkJMHgxNzA4CQkvLwotCi0vLwotLy8gUlhfU1RBX0NOVDBfU1RSVUM6IFJYIFBMQ1AgZXJyb3IgY291bnQgJiBSWCBDUkMgZXJyb3IgY291bnQKLS8vCi10eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBDcmNFcnI7Ci0JICAgIFVTSE9SVCAgUGh5RXJyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUlhfU1RBX0NOVDBfU1RSVUMsICpQUlhfU1RBX0NOVDBfU1RSVUM7Ci0KLS8vCi0vLyBSWF9TVEFfQ05UMV9TVFJVQzogUlggRmFsc2UgQ0NBIGNvdW50ICYgUlggTE9ORyBmcmFtZSBjb3VudAotLy8KLXR5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEZhbHNlQ2NhOwotCSAgICBVU0hPUlQgIFBsY3BFcnI7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlSWF9TVEFfQ05UMV9TVFJVQywgKlBSWF9TVEFfQ05UMV9TVFJVQzsKLQotLy8KLS8vIFJYX1NUQV9DTlQyX1NUUlVDOgotLy8KLXR5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQyX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFJ4RHVwbGlDb3VudDsKLQkgICAgVVNIT1JUICBSeEZpZm9PdmVyZmxvd0NvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUlhfU1RBX0NOVDJfU1RSVUMsICpQUlhfU1RBX0NOVDJfU1RSVUM7Ci0KLSNkZWZpbmUgVFhfU1RBX0NOVDAJCTB4MTcwQwkJLy8KLS8vCi0vLyBTVEFfQ1NSMzogVFggQmVhY29uIGNvdW50Ci0vLwotdHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDBfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgVHhGYWlsQ291bnQ7Ci0JICAgIFVTSE9SVCAgVHhCZWFjb25Db3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX1NUQV9DTlQwX1NUUlVDLCAqUFRYX1NUQV9DTlQwX1NUUlVDOwotCi0jZGVmaW5lIFRYX1NUQV9DTlQxCQkweDE3MTAJCS8vCi0vLwotLy8gVFhfU1RBX0NOVDE6IFRYIHR4IGNvdW50Ci0vLwotdHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDFfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgVHhTdWNjZXNzOwotCSAgICBVU0hPUlQgIFR4UmV0cmFuc21pdDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX1NUQV9DTlQxX1NUUlVDLCAqUFRYX1NUQV9DTlQxX1NUUlVDOwotCi0jZGVmaW5lIFRYX1NUQV9DTlQyCQkweDE3MTQJCS8vCi0vLwotLy8gVFhfU1RBX0NOVDI6IFRYIHR4IGNvdW50Ci0vLwotdHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDJfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgVHhaZXJvTGVuQ291bnQ7Ci0JICAgIFVTSE9SVCAgVHhVbmRlckZsb3dDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX1NUQV9DTlQyX1NUUlVDLCAqUFRYX1NUQV9DTlQyX1NUUlVDOwotCi0jZGVmaW5lIFRYX1NUQV9GSUZPCQkweDE3MTgJCS8vCi0vLwotLy8gVFhfU1RBX0ZJRk9fU1RSVUM6IFRYIFJlc3VsdCBmb3Igc3BlY2lmaWMgUElEIHN0YXR1cyBmaWZvIHJlZ2lzdGVyCi0vLwotdHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1NUQV9GSUZPX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIgICAgICAgCWJWYWxpZDoxOyAgIC8vIDE6VGhpcyByZWdpc3RlciBjb250YWlucyBhIHZhbGlkIFRYIHJlc3VsdAotCQlVSU5UMzIgICAgICAgCVBpZFR5cGU6NDsKLQkJVUlOVDMyICAgICAgIAlUeFN1Y2Nlc3M6MTsgICAvLyBUeCBObyByZXRyeSBzdWNjZXNzCi0JCVVJTlQzMiAgICAgICAJVHhBZ2dyZToxOyAgICAvLyBUeCBSZXRyeSBTdWNjZXNzCi0JCVVJTlQzMiAgICAgICAJVHhBY2tSZXF1aXJlZDoxOyAgICAvLyBUeCBmYWlsCi0JCVVJTlQzMgkJd2NpZDo4OwkJLy93aXJlbGVzcyBjbGllbnQgaW5kZXgKLS8vCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjE2OwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgotCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjEzOwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgotCQlVSU5UMzIJCVR4QkY6MTsKLQkJVUlOVDMyCQlSZXNlcnZlOjI7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9TVEFfRklGT19TVFJVQywgKlBUWF9TVEFfRklGT19TVFJVQzsKLQotLy8gRGVidWcgY291bnRlcgotI2RlZmluZSBUWF9BR0dfQ05UCTB4MTcxYwotdHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBOb25BZ2dUeENvdW50OwotCSAgICBVU0hPUlQgIEFnZ1R4Q291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UX1NUUlVDLCAqUFRYX0FHR19DTlRfU1RSVUM7Ci0KLS8vIERlYnVnIGNvdW50ZXIKLSNkZWZpbmUgVFhfQUdHX0NOVDAJMHgxNzIwCi10eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBZ2dTaXplMUNvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemUyQ291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UMF9TVFJVQywgKlBUWF9BR0dfQ05UMF9TVFJVQzsKLQotLy8gRGVidWcgY291bnRlcgotI2RlZmluZSBUWF9BR0dfQ05UMQkweDE3MjQKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUzQ291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTRDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQxX1NUUlVDLCAqUFRYX0FHR19DTlQxX1NUUlVDOwotCi0jZGVmaW5lIFRYX0FHR19DTlQyCTB4MTcyOAotdHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDJfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTVDb3VudDsKLQkgICAgVVNIT1JUICBBZ2dTaXplNkNvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVDJfU1RSVUMsICpQVFhfQUdHX0NOVDJfU1RSVUM7Ci0KLS8vIERlYnVnIGNvdW50ZXIKLSNkZWZpbmUgVFhfQUdHX0NOVDMJMHgxNzJjCi10eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UM19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBZ2dTaXplN0NvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemU4Q291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UM19TVFJVQywgKlBUWF9BR0dfQ05UM19TVFJVQzsKLQotLy8gRGVidWcgY291bnRlcgotI2RlZmluZSBUWF9BR0dfQ05UNAkweDE3MzAKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ0X1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemU5Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTEwQ291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UNF9TVFJVQywgKlBUWF9BR0dfQ05UNF9TVFJVQzsKLQotI2RlZmluZSBUWF9BR0dfQ05UNQkweDE3MzQKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ1X1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUxMUNvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemUxMkNvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVDVfU1RSVUMsICpQVFhfQUdHX0NOVDVfU1RSVUM7Ci0KLSNkZWZpbmUgVFhfQUdHX0NOVDYJCTB4MTczOAotdHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDZfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTEzQ291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTE0Q291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UNl9TVFJVQywgKlBUWF9BR0dfQ05UNl9TVFJVQzsKLQotI2RlZmluZSBUWF9BR0dfQ05UNwkJMHgxNzNjCi10eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UN19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBZ2dTaXplMTVDb3VudDsKLQkgICAgVVNIT1JUICBBZ2dTaXplMTZDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQ3X1NUUlVDLCAqUFRYX0FHR19DTlQ3X1NUUlVDOwotCi0jZGVmaW5lIE1QRFVfREVOU0lUWV9DTlQJCTB4MTc0MAotdHlwZWRlZgl1bmlvbglfTVBEVV9ERU5fQ05UX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFRYWmVyb0RlbENvdW50OwkvL1RYIHplcm8gbGVuZ3RoIGRlbGltaXRlciBjb3VudAotCSAgICBVU0hPUlQgIFJYWmVyb0RlbENvdW50OwkvL1JYIHplcm8gbGVuZ3RoIGRlbGltaXRlciBjb3VudAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTVBEVV9ERU5fQ05UX1NUUlVDLCAqUE1QRFVfREVOX0NOVF9TVFJVQzsKLQotLy8KLS8vIFRYUlggY29udHJvbCByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgzMDAwCi0vLwotLy8gcnQyODYwYiAgVU5LTk9XTiByZWcgdXNlIFIvTyBSZWcgQWRkciAweDc3ZDAgZmlyc3QuLgotI2RlZmluZSBUWFJYX0NTUjEgICAgICAgICAgIDB4NzdkMAotCi0vLwotLy8gU2VjdXJpdHkga2V5IHRhYmxlIG1lbW9yeSwgYmFzZSBhZGRyZXNzID0gMHgxMDAwCi0vLwotI2RlZmluZSBNQUNfV0NJRF9CQVNFCQkweDE4MDAgLy84LWJ5dGVzKHVzZSBvbmx5IDYtYnl0ZXMpICogMjU2IGVudHJ5ID0KLSNkZWZpbmUgSFdfV0NJRF9FTlRSWV9TSVpFICAgOAotI2RlZmluZSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSAgICAgMHg0MDAwICAgICAgLy8gMzItYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZQotI2RlZmluZSBIV19LRVlfRU5UUllfU0laRSAgICAgICAgICAgMHgyMAotI2RlZmluZSBQQUlSV0lTRV9JVkVJVl9UQUJMRV9CQVNFICAgICAweDYwMDAgICAgICAvLyA4LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKLSNkZWZpbmUgTUFDX0lWRUlWX1RBQkxFX0JBU0UgICAgIDB4NjAwMCAgICAgIC8vIDgtYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZQotI2RlZmluZSBIV19JVkVJVl9FTlRSWV9TSVpFICAgOAotI2RlZmluZSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSAgICAgMHg2ODAwICAgICAgLy8gNC1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlCi0jZGVmaW5lIEhXX1dDSURfQVRUUklfU0laRSAgIDQKLSNkZWZpbmUgV0NJRF9SRVNFUlZFRCAgICAgICAgICAJCTB4NmJmYwotI2RlZmluZSBTSEFSRURfS0VZX1RBQkxFX0JBU0UgICAgICAgMHg2YzAwICAgICAgLy8gMzItYnl0ZSAqIDE2LWVudHJ5ID0gNTEyLWJ5dGUKLSNkZWZpbmUgU0hBUkVEX0tFWV9NT0RFX0JBU0UgICAgICAgMHg3MDAwICAgICAgLy8gMzItYnl0ZSAqIDE2LWVudHJ5ID0gNTEyLWJ5dGUKLSNkZWZpbmUgSFdfU0hBUkVEX0tFWV9NT0RFX1NJWkUgICA0Ci0jZGVmaW5lIFNIQVJFREtFWVRBQkxFCQkJMAotI2RlZmluZSBQQUlSV0lTRUtFWVRBQkxFCQkJMQotCi10eXBlZGVmCXVuaW9uCV9TSEFSRURLRVlfTU9ERV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkwQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkxQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkyQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkzQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkwQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkxQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkyQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkzQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVNIQVJFREtFWV9NT0RFX1NUUlVDLCAqUFNIQVJFREtFWV9NT0RFX1NUUlVDOwotCi0vLyA2NC1lbnRyeSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCi10eXBlZGVmIHN0cnVjdCBfSFdfV0NJRF9FTlRSWSB7ICAvLyA4LWJ5dGUgcGVyIGVudHJ5Ci0gICAgVUNIQVIgICBBZGRyZXNzWzZdOwotICAgIFVDSEFSICAgUnN2WzJdOwotfSBIV19XQ0lEX0VOVFJZLCBQSFdfV0NJRF9FTlRSWTsKLQotCi0KLS8vCi0vLyBPdGhlciBvbi1jaGlwIHNoYXJlZCBtZW1vcnkgc3BhY2UsIGJhc2UgPSAweDIwMDAKLS8vCi0KLS8vIENJUyBzcGFjZSAtIGJhc2UgYWRkcmVzcyA9IDB4MjAwMAotI2RlZmluZSBIV19DSVNfQkFTRSAgICAgICAgICAgICAweDIwMDAKLQotLy8gQ2Fycmllci1zZW5zZSBDVFMgZnJhbWUgYmFzZSBhZGRyZXNzLiBJdCdzIHdoZXJlIG1hYyBzdG9yZXMgY2Fycmllci1zZW5zZSBmcmFtZSBmb3IgY2Fycmllci1zZW5zZSBmdW5jdGlvbi4KLSNkZWZpbmUgSFdfQ1NfQ1RTX0JBU0UJCQkweDc3MDAKLS8vIERGUyBDVFMgZnJhbWUgYmFzZSBhZGRyZXNzLiBJdCdzIHdoZXJlIG1hYyBzdG9yZXMgQ1RTIGZyYW1lIGZvciBERlMuCi0jZGVmaW5lIEhXX0RGU19DVFNfQkFTRQkJCTB4Nzc4MAotI2RlZmluZSBIV19DVFNfRlJBTUVfU0laRQkJMHg4MAotCi0vLyAyMDA0LTExLTA4IGpvaG4gLSBzaW5jZSBOVUxMIGZyYW1lIHdvbid0IGJlIHRoYXQgbG9uZyAoMjU2IGJ5dGUpLiBXZSBzdGVhbCAxNiB0YWlsIGJ5dGVzCi0vLyB0byBzYXZlIGRlYnVnZ2luZyBzZXR0aW5ncwotI2RlZmluZSBIV19ERUJVR19TRVRUSU5HX0JBU0UgICAweDc3ZjAgIC8vIDB4NzdmMH4weDc3ZmYgdG90YWwgMTYgYnl0ZXMKLSNkZWZpbmUgSFdfREVCVUdfU0VUVElOR19CQVNFMiAgIDB4Nzc3MCAgLy8gMHg3N2YwfjB4NzdmZiB0b3RhbCAxNiBieXRlcwotCi0vLyBJbiBvcmRlciB0byBzdXBwb3J0IG1heGltdW0gOCBNQlNTIGFuZCBpdHMgbWF4aW11bSBsZW5ndGggaXMgNTEyIGZvciBlYWNoIGJlYWNvbgotLy8gVGhyZWUgc2VjdGlvbiBkaXNjb250aW51ZSBtZW1vcnkgc2VnbWVudHMgd2lsbCBiZSB1c2VkLgotLy8gMS4gVGhlIG9yaWdpbmFsIHJlZ2lvbiBmb3IgQkNOIDB+MwotLy8gMi4gRXh0cmFjdCBtZW1vcnkgZnJvbSBGQ0UgdGFibGUgZm9yIEJDTiA0fjUKLS8vIDMuIEV4dHJhY3QgbWVtb3J5IGZyb20gUGFpci13aXNlIGtleSB0YWJsZSBmb3IgQkNOIDZ+NwotLy8JICBJdCBvY2N1cGllZCB0aG9zZSBtZW1vcnkgb2Ygd2NpZCAyMzh+MjUzIGZvciBCQ04gNgotLy8JCQkJCQkgICAgICBhbmQgd2NpZCAyMjJ+MjM3IGZvciBCQ04gNwotI2RlZmluZSBIV19CRUFDT05fTUFYX1NJWkUgICAgICAweDEwMDAgLyogdW5pdDogYnl0ZSAqLwotI2RlZmluZSBIV19CRUFDT05fQkFTRTAgICAgICAgICAweDc4MDAKLSNkZWZpbmUgSFdfQkVBQ09OX0JBU0UxICAgICAgICAgMHg3QTAwCi0jZGVmaW5lIEhXX0JFQUNPTl9CQVNFMiAgICAgICAgIDB4N0MwMAotI2RlZmluZSBIV19CRUFDT05fQkFTRTMgICAgICAgICAweDdFMDAKLSNkZWZpbmUgSFdfQkVBQ09OX0JBU0U0ICAgICAgICAgMHg3MjAwCi0jZGVmaW5lIEhXX0JFQUNPTl9CQVNFNSAgICAgICAgIDB4NzQwMAotI2RlZmluZSBIV19CRUFDT05fQkFTRTYgICAgICAgICAweDVEQzAKLSNkZWZpbmUgSFdfQkVBQ09OX0JBU0U3ICAgICAgICAgMHg1QkMwCi0KLSNkZWZpbmUgSFdfQkVBQ09OX01BWF9DT1VOVCAgICAgOAotI2RlZmluZSBIV19CRUFDT05fT0ZGU0VUCQkweDAyMDAKLSNkZWZpbmUgSFdfQkVBQ09OX0NPTlRFTlRfTEVOCShIV19CRUFDT05fT0ZGU0VUIC0gVFhXSV9TSVpFKQotCi0vLyBIT1NULU1DVSBzaGFyZWQgbWVtb3J5IC0gYmFzZSBhZGRyZXNzID0gMHgyMTAwCi0jZGVmaW5lIEhPU1RfQ01EX0NTUgkJMHg0MDQKLSNkZWZpbmUgSDJNX01BSUxCT1hfQ1NSICAgICAgICAgMHg3MDEwCi0jZGVmaW5lIEgyTV9NQUlMQk9YX0NJRCAgICAgICAgIDB4NzAxNAotI2RlZmluZSBIMk1fTUFJTEJPWF9TVEFUVVMgICAgICAweDcwMWMKLSNkZWZpbmUgSDJNX0lOVF9TUkMgICAgICAgICAgICAgMHg3MDI0Ci0jZGVmaW5lIEgyTV9CQlBfQUdFTlQgICAgICAgICAgIDB4NzAyOAotI2RlZmluZSBNMkhfQ01EX0RPTkVfQ1NSICAgICAgICAweDAwMGMKLSNkZWZpbmUgTUNVX1RYT1BfQVJSQVlfQkFTRSAgICAgMHgwMDBjICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0Ci0jZGVmaW5lIE1DVV9UWE9QX0VOVFJZX1NJWkUgICAgIDMyICAgICAgIC8vIFRPRE86IHRvIGJlIHByb3ZpZGVkIGJ5IEFsYmVydAotI2RlZmluZSBNQVhfTlVNX09GX1RYT1BfRU5UUlkgICAxNiAgICAgICAvLyBUT0RPOiBtdXN0IGJlIHNhbWUgd2l0aCA4MDUxIGZpcm13YXJlCi0jZGVmaW5lIE1DVV9NQk9YX1ZFUlNJT04gICAgICAgIDB4MDEgICAgIC8vIFRPRE86IHRvIGJlIGNvbmZpcm1lZCBieSBBbGJlcnQKLSNkZWZpbmUgTUNVX01CT1hfVkVSU0lPTl9PRkZTRVQgNSAgICAgICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0Ci0KLS8vCi0vLyBIb3N0IERNQSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgyMDAgLiAgVFgwLTM9RURDQVFpZDAtMywgVFg0PUhDQ0EsIFRYNT1NR01ULAotLy8KLS8vCi0vLyAgRE1BIFJJTkcgREVTQ1JJUFRPUgotLy8KLSNkZWZpbmUgRTJQUk9NX0NTUiAgICAgICAgICAweDAwMDQKLSNkZWZpbmUgSU9fQ05UTF9DU1IgICAgICAgICAweDc3ZDAKLQotI2lmZGVmIFJUMjg2MAotLy8gODA1MSBmaXJtd2FyZSBpbWFnZSBmb3IgUlQyODYwIC0gYmFzZSBhZGRyZXNzID0gMHg0MDAwCi0jZGVmaW5lIEZJUk1XQVJFX0lNQUdFX0JBU0UgICAgIDB4MjAwMAotI2RlZmluZSBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSAweDIwMDAgICAgLy8gOGtieXRlCi0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLS8vIDgwNTEgZmlybXdhcmUgaW1hZ2UgZm9yIHVzYiAtIHVzZSBsYXN0LWhhbGYgYmFzZSBhZGRyZXNzID0gMHgzMDAwCi0jZGVmaW5lIEZJUk1XQVJFX0lNQUdFX0JBU0UgICAgIDB4MzAwMAotI2RlZmluZSBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSAweDEwMDAgICAgLy8gNGtieXRlCi0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFR4IC8JUnggLyBNZ210IHJpbmcgZGVzY3JpcHRvciBkZWZpbml0aW9uCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIHRoZSBmb2xsb3dpbmcgUElEIHZhbHVlcyBhcmUgdXNlZCB0byBtYXJrIG91dGdvaW5nIGZyYW1lIHR5cGUgaW4gVFhELT5QSUQgc28gdGhhdAotLy8gcHJvcGVyIFRYIHN0YXRpc3RpY3MgY2FuIGJlIGNvbGxlY3RlZCBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzCi0vLyBiMy0yIG9mIFBJRCBmaWVsZCAtCi0jZGVmaW5lIFBJRF9NR01UCQkJMHgwNQotI2RlZmluZSBQSURfQkVBQ09OCQkJMHgwYwotI2RlZmluZSBQSURfREFUQV9OT1JNQUxVQ0FTVAkgCTB4MDIKLSNkZWZpbmUgUElEX0RBVEFfQU1QRFUJIAkweDA0Ci0jZGVmaW5lIFBJRF9EQVRBX05PX0FDSyAgICAJMHgwOAotI2RlZmluZSBQSURfREFUQV9OT1RfTk9STV9BQ0sJIAkweDAzCi0vLyB2YWx1ZSBkb21haW4gb2YgcFR4RC0+SG9zdFFJZCAoNC1iaXQ6IDB+MTUpCi0jZGVmaW5lIFFJRF9BQ19CSyAgICAgICAgICAgICAgIDEgICAvLyBtZWV0IEFDSSBkZWZpbml0aW9uIGluIDgwMi4xMWUKLSNkZWZpbmUgUUlEX0FDX0JFICAgICAgICAgICAgICAgMCAgIC8vIG1lZXQgQUNJIGRlZmluaXRpb24gaW4gODAyLjExZQotI2RlZmluZSBRSURfQUNfVkkgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFFJRF9BQ19WTyAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgUUlEX0hDQ0EgICAgICAgICAgICAgICAgNAotI2RlZmluZSBOVU1fT0ZfVFhfUklORyAgICAgICAgICA1Ci0jZGVmaW5lIFFJRF9NR01UICAgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIFFJRF9SWCAgICAgICAgICAgICAgICAgIDE0Ci0jZGVmaW5lIFFJRF9PVEhFUiAgICAgICAgICAgICAgIDE1Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBCQlAgJiBSRglkZWZpbml0aW9uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNkZWZpbmUJQlVTWQkJICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUJSURMRQkJICAgICAgICAgICAgICAgIDAKLQotI2RlZmluZQlSRl9SMDAJCQkJCSAgICAwCi0jZGVmaW5lCVJGX1IwMQkJCQkJICAgIDEKLSNkZWZpbmUJUkZfUjAyCQkJCQkgICAgMgotI2RlZmluZQlSRl9SMDMJCQkJCSAgICAzCi0jZGVmaW5lCVJGX1IwNAkJCQkJICAgIDQKLSNkZWZpbmUJUkZfUjA1CQkJCQkgICAgNQotI2RlZmluZQlSRl9SMDYJCQkJCSAgICA2Ci0jZGVmaW5lCVJGX1IwNwkJCQkJICAgIDcKLSNkZWZpbmUJUkZfUjA4CQkJCQkgICAgOAotI2RlZmluZQlSRl9SMDkJCQkJCSAgICA5Ci0jZGVmaW5lCVJGX1IxMAkJCQkJICAgIDEwCi0jZGVmaW5lCVJGX1IxMQkJCQkJICAgIDExCi0jZGVmaW5lCVJGX1IxMgkJCQkJICAgIDEyCi0jZGVmaW5lCVJGX1IxMwkJCQkJICAgIDEzCi0jZGVmaW5lCVJGX1IxNAkJCQkJICAgIDE0Ci0jZGVmaW5lCVJGX1IxNQkJCQkJICAgIDE1Ci0jZGVmaW5lCVJGX1IxNgkJCQkJICAgIDE2Ci0jZGVmaW5lCVJGX1IxNwkJCQkJICAgIDE3Ci0jZGVmaW5lCVJGX1IxOAkJCQkJICAgIDE4Ci0jZGVmaW5lCVJGX1IxOQkJCQkJICAgIDE5Ci0jZGVmaW5lCVJGX1IyMAkJCQkJICAgIDIwCi0jZGVmaW5lCVJGX1IyMQkJCQkJICAgIDIxCi0jZGVmaW5lCVJGX1IyMgkJCQkJICAgIDIyCi0jZGVmaW5lCVJGX1IyMwkJCQkJICAgIDIzCi0jZGVmaW5lCVJGX1IyNAkJCQkJICAgIDI0Ci0jZGVmaW5lCVJGX1IyNQkJCQkJICAgIDI1Ci0jZGVmaW5lCVJGX1IyNgkJCQkJICAgIDI2Ci0jZGVmaW5lCVJGX1IyNwkJCQkJICAgIDI3Ci0jZGVmaW5lCVJGX1IyOAkJCQkJICAgIDI4Ci0jZGVmaW5lCVJGX1IyOQkJCQkJICAgIDI5Ci0jZGVmaW5lCVJGX1IzMAkJCQkJICAgIDMwCi0jZGVmaW5lCVJGX1IzMQkJCQkJICAgIDMxCi0KLSNkZWZpbmUJQkJQX1IwCQkJCQkgICAgMCAgLy8gdmVyc2lvbgotI2RlZmluZQlCQlBfUjEJCQkJICAgICAgICAxICAvLyBUU1NJCi0jZGVmaW5lCUJCUF9SMiAgICAgICAgICAJCQkyICAvLyBUWCBjb25maWd1cmUKLSNkZWZpbmUgQkJQX1IzICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgQkJQX1I0ICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgQkJQX1I1ICAgICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgQkJQX1I2ICAgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUJQkJQX1IxNAkJCSAgICAgICAgICAgIDE0IC8vIFJYIGNvbmZpZ3VyZQotI2RlZmluZSBCQlBfUjE2ICAgICAgICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgQkJQX1IxNyAgICAgICAgICAgICAgICAgICAgIDE3IC8vIFJYIHNlbnNpYmlsaXR5Ci0jZGVmaW5lIEJCUF9SMTggICAgICAgICAgICAgICAgICAgICAxOAotI2RlZmluZSBCQlBfUjIxICAgICAgICAgICAgICAgICAgICAgMjEKLSNkZWZpbmUgQkJQX1IyMiAgICAgICAgICAgICAgICAgICAgIDIyCi0jZGVmaW5lIEJCUF9SMjQgICAgICAgICAgICAgICAgICAgICAyNAotI2RlZmluZSBCQlBfUjI1ICAgICAgICAgICAgICAgICAgICAgMjUKLSNkZWZpbmUgQkJQX1IzMSAgICAgICAgICAgICAgICAgICAgIDMxCi0jZGVmaW5lIEJCUF9SNDkgICAgICAgICAgICAgICAgICAgICA0OSAvL1RTU0kKLSNkZWZpbmUgQkJQX1I1MCAgICAgICAgICAgICAgICAgICAgIDUwCi0jZGVmaW5lIEJCUF9SNTEgICAgICAgICAgICAgICAgICAgICA1MQotI2RlZmluZSBCQlBfUjUyICAgICAgICAgICAgICAgICAgICAgNTIKLSNkZWZpbmUgQkJQX1I1NSAgICAgICAgICAgICAgICAgICAgIDU1Ci0jZGVmaW5lIEJCUF9SNjIgICAgICAgICAgICAgICAgICAgICA2MiAvLyBSeCBTUTAgVGhyZXNob2xkIEhJR0gKLSNkZWZpbmUgQkJQX1I2MyAgICAgICAgICAgICAgICAgICAgIDYzCi0jZGVmaW5lIEJCUF9SNjQgICAgICAgICAgICAgICAgICAgICA2NAotI2RlZmluZSBCQlBfUjY1ICAgICAgICAgICAgICAgICAgICAgNjUKLSNkZWZpbmUgQkJQX1I2NiAgICAgICAgICAgICAgICAgICAgIDY2Ci0jZGVmaW5lIEJCUF9SNjcgICAgICAgICAgICAgICAgICAgICA2NwotI2RlZmluZSBCQlBfUjY4ICAgICAgICAgICAgICAgICAgICAgNjgKLSNkZWZpbmUgQkJQX1I2OSAgICAgICAgICAgICAgICAgICAgIDY5Ci0jZGVmaW5lIEJCUF9SNzAgICAgICAgICAgICAgICAgICAgICA3MCAvLyBSeCBBR0MgU1EgQ0NLIFhjb3JyIHRocmVzaG9sZAotI2RlZmluZSBCQlBfUjczICAgICAgICAgICAgICAgICAgICAgNzMKLSNkZWZpbmUgQkJQX1I3NQkJCQkJCTc1Ci0jZGVmaW5lIEJCUF9SNzcgICAgICAgICAgICAgICAgICAgICA3NwotI2RlZmluZSBCQlBfUjc5ICAgICAgICAgICAgICAgICAgICAgNzkKLSNkZWZpbmUgQkJQX1I4MCAgICAgICAgICAgICAgICAgICAgIDgwCi0jZGVmaW5lIEJCUF9SODEgICAgICAgICAgICAgICAgICAgICA4MQotI2RlZmluZSBCQlBfUjgyICAgICAgICAgICAgICAgICAgICAgODIKLSNkZWZpbmUgQkJQX1I4MyAgICAgICAgICAgICAgICAgICAgIDgzCi0jZGVmaW5lIEJCUF9SODQgICAgICAgICAgICAgICAgICAgICA4NAotI2RlZmluZSBCQlBfUjg2CQkJCQkJODYKLSNkZWZpbmUgQkJQX1I5MQkJCQkJCTkxCi0jZGVmaW5lIEJCUF9SOTIJCQkJCQk5MgotI2RlZmluZSBCQlBfUjk0ICAgICAgICAgICAgICAgICAgICAgOTQgLy8gVHggR2FpbiBDb250cm9sCi0jZGVmaW5lIEJCUF9SMTAzICAgICAgICAgICAgICAgICAgICAxMDMKLSNkZWZpbmUgQkJQX1IxMDUgICAgICAgICAgICAgICAgICAgIDEwNQotI2RlZmluZSBCQlBfUjExMyAgICAgICAgICAgICAgICAgICAgMTEzCi0jZGVmaW5lIEJCUF9SMTE0ICAgICAgICAgICAgICAgICAgICAxMTQKLSNkZWZpbmUgQkJQX1IxMTUgICAgICAgICAgICAgICAgICAgIDExNQotI2RlZmluZSBCQlBfUjExNiAgICAgICAgICAgICAgICAgICAgMTE2Ci0jZGVmaW5lIEJCUF9SMTE3ICAgICAgICAgICAgICAgICAgICAxMTcKLSNkZWZpbmUgQkJQX1IxMTggICAgICAgICAgICAgICAgICAgIDExOAotI2RlZmluZSBCQlBfUjExOSAgICAgICAgICAgICAgICAgICAgMTE5Ci0jZGVmaW5lIEJCUF9SMTIwICAgICAgICAgICAgICAgICAgICAxMjAKLSNkZWZpbmUgQkJQX1IxMjEgICAgICAgICAgICAgICAgICAgIDEyMQotI2RlZmluZSBCQlBfUjEyMiAgICAgICAgICAgICAgICAgICAgMTIyCi0jZGVmaW5lIEJCUF9SMTIzICAgICAgICAgICAgICAgICAgICAxMjMKLSNkZWZpbmUgQkJQX1IxMzggICAgICAgICAgICAgICAgICAgIDEzOCAvLyBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cCwgQURDIGR5bmFtaWMgb24vb2ZmIGNvbnRyb2wKLQotCi0jZGVmaW5lIEJCUFI5NF9ERUZBVUxUICAgICAgICAgICAgICAweDA2IC8vIEFkZCAxIHZhbHVlIHdpbGwgZ2FpbiAxZGIKLQotI2RlZmluZSBSU1NJX0ZPUl9WRVJZX0xPV19TRU5TSUJJTElUWSAtMzUKLSNkZWZpbmUgUlNTSV9GT1JfTE9XX1NFTlNJQklMSVRZICAgICAgLTU4Ci0jZGVmaW5lIFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkgIC04MAotI2RlZmluZSBSU1NJX0ZPUl9NSURfU0VOU0lCSUxJVFkgICAgICAtOTAKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFRVBST00gZGVmaW5pdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jZGVmaW5lIEVFRE8gICAgICAgICAgICAgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIEVFREkgICAgICAgICAgICAgICAgICAgICAgICAweDA0Ci0jZGVmaW5lIEVFQ1MgICAgICAgICAgICAgICAgICAgICAgICAweDAyCi0jZGVmaW5lIEVFU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIEVFUkwgICAgICAgICAgICAgICAgICAgICAgICAweDgwCi0KLSNkZWZpbmUgRUVQUk9NX1dSSVRFX09QQ09ERSAgICAgICAgIDB4MDUKLSNkZWZpbmUgRUVQUk9NX1JFQURfT1BDT0RFICAgICAgICAgIDB4MDYKLSNkZWZpbmUgRUVQUk9NX0VXRFNfT1BDT0RFICAgICAgICAgIDB4MTAKLSNkZWZpbmUgRUVQUk9NX0VXRU5fT1BDT0RFICAgICAgICAgIDB4MTMKLQotI2RlZmluZQlOVU1fRUVQUk9NX0JCUF9QQVJNUwkJMTkJCQkvLyBJbmNsdWRlIE5JQyBDb25maWcgMCwgMSwgQ1IsIFRYIEFMQyBzdGVwLCBCQlBzCi0jZGVmaW5lCU5VTV9FRVBST01fVFhfR19QQVJNUwkJNwotI2RlZmluZQlFRVBST01fTklDMV9PRkZTRVQgICAgICAgICAgMHgzNAkJLy8gVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQKLSNkZWZpbmUJRUVQUk9NX05JQzJfT0ZGU0VUICAgICAgICAgIDB4MzYJCS8vIFRoZSBhZGRyZXNzIGlzIGZyb20gTklDIGNvbmZpZyAwLCBub3QgQkJQIHJlZ2lzdGVyIElECi0jZGVmaW5lCUVFUFJPTV9CQlBfQkFTRV9PRkZTRVQJCTB4ZjAJCS8vIFRoZSBhZGRyZXNzIGlzIGZyb20gTklDIGNvbmZpZyAwLCBub3QgQkJQIHJlZ2lzdGVyIElECi0jZGVmaW5lCUVFUFJPTV9HX1RYX1BXUl9PRkZTRVQJCTB4NTIKLSNkZWZpbmUJRUVQUk9NX0dfVFgyX1BXUl9PRkZTRVQJCTB4NjAKLSNkZWZpbmUgRUVQUk9NX0xFRDFfT0ZGU0VUCQkJMHgzYwotI2RlZmluZSBFRVBST01fTEVEMl9PRkZTRVQJCQkweDNlCi0jZGVmaW5lIEVFUFJPTV9MRUQzX09GRlNFVAkJCTB4NDAKLSNkZWZpbmUgRUVQUk9NX0xOQV9PRkZTRVQJCQkweDQ0Ci0jZGVmaW5lIEVFUFJPTV9SU1NJX0JHX09GRlNFVAkJMHg0NgotI2RlZmluZSBFRVBST01fUlNTSV9BX09GRlNFVAkJMHg0YQotI2RlZmluZSBFRVBST01fREVGSU5FX01BWF9UWFBXUgkJMHg0ZQotI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RwkweGRlCS8vIDIwTUhaIDIuNEcgdHggcG93ZXIuCi0jZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl8yXzRHCTB4ZWUJLy8gNDBNSFogMi40RyB0eCBwb3dlci4KLSNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzVHCQkweGZhCS8vIDIwTUhaIDVHIHR4IHBvd2VyLgotI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfNUcJCTB4MTBhCS8vIDQwTUhaIDVHIHR4IHBvd2VyLgotI2RlZmluZSBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICAgICAgMHg3OAotI2RlZmluZSBFRVBST01fQV9UWDJfUFdSX09GRlNFVCAgICAgIDB4YTYKLSNkZWZpbmUgRUVQUk9NX1ZFUlNJT05fT0ZGU0VUICAgICAgIDB4MDIKLSNkZWZpbmUJRUVQUk9NX0ZSRVFfT0ZGU0VUCQkJMHgzYQotI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEUgCTB4ZGUJLy8gMjBNSFogcG93ZXIuCi0jZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0RFTFRBCQkweDUwCS8vIDIwTUhaIEFORCA0MCBNSFogdXNlIGRpZmZlcmVudCBwb3dlci4gVGhpcyBpcyBkZWx0YSBpbiA0ME1IWi4KLSNkZWZpbmUgVkFMSURfRUVQUk9NX1ZFUlNJT04gICAgICAgIDEKLQotLy8gUGFpcktleU1vZGUgZGVmaW5pdGlvbgotI2RlZmluZSBQS01PREVfTk9ORSAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBQS01PREVfV0VQNjQgICAgICAgICAgICAgICAgMQotI2RlZmluZSBQS01PREVfV0VQMTI4ICAgICAgICAgICAgICAgMgotI2RlZmluZSBQS01PREVfVEtJUCAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBQS01PREVfQUVTICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBQS01PREVfQ0tJUDY0ICAgICAgICAgICAgICAgNQotI2RlZmluZSBQS01PREVfQ0tJUDEyOCAgICAgICAgICAgICAgNgotI2RlZmluZSBQS01PREVfVEtJUF9OT19NSUMgICAgICAgICAgNyAgICAgICAvLyBNSUMgYXBwZW5kZWQgYnkgZHJpdmVyOiBub3QgYSB2YWxpZCB2YWx1ZSBpbiBoYXJkd2FyZSBrZXkgdGFibGUKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBXQ0lEICBmb3JtYXQKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy83LjEJV0NJRCAgRU5UUlkgIGZvcm1hdCAgOiA4Ynl0ZXMKLXR5cGVkZWYJc3RydWN0CV9XQ0lEX0VOVFJZX1NUUlVDIHsKLQlVQ0hBUgkJUlhCQUJpdG1hcDc7ICAgIC8vIGJpdDAgZm9yIFRJRDgsIGJpdDcgZm9yIFRJRCAxNQotCVVDSEFSCQlSWEJBQml0bWFwMDsgICAgLy8gYml0MCBmb3IgVElEMCwgYml0NyBmb3IgVElEIDcKLQlVQ0hBUgkJTUFDWzZdOwkvLyAwIGZvciBzaGFyZWQga2V5IHRhYmxlLiAgMSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCi19CVdDSURfRU5UUllfU1RSVUMsICpQV0NJRF9FTlRSWV9TVFJVQzsKLQotLy84LjEuMQlTRUNVUklUWSAgS0VZICBmb3JtYXQgIDogOERXCi0vLyAzMi1ieXRlIHBlciBlbnRyeSwgdG90YWwgMTYtZW50cnkgZm9yIHNoYXJlZCBrZXkgdGFibGUsIDY0LWVudHJ5IGZvciBwYWlyd2lzZSBrZXkgdGFibGUKLXR5cGVkZWYgc3RydWN0IF9IV19LRVlfRU5UUlkgeyAgICAgICAgICAvLyAzMi1ieXRlIHBlciBlbnRyeQotICAgIFVDSEFSICAgS2V5WzE2XTsKLSAgICBVQ0hBUiAgIFR4TWljWzhdOwotICAgIFVDSEFSICAgUnhNaWNbOF07Ci19IEhXX0tFWV9FTlRSWSwgKlBIV19LRVlfRU5UUlk7Ci0KLS8vOC4xLjIJSVYvRUlWICBmb3JtYXQgIDogMkRXCi0KLS8vOC4xLjMJUlggYXR0cmlidXRlIGVudHJ5IGZvcm1hdCAgOiAxRFcKLXR5cGVkZWYJc3RydWN0CV9NQUNfQVRUUklCVVRFX1NUUlVDIHsKLQlVSU5UMzIJCUtleVRhYjoxOwkvLyAwIGZvciBzaGFyZWQga2V5IHRhYmxlLiAgMSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCi0JVUlOVDMyCQlQYWlyS2V5TW9kZTozOwotCVVJTlQzMgkJQlNTSURJZHg6MzsgLy9tdWx0aXBsZUJTUyBpbmRleCBmb3IgdGhlIFdDSUQKLQlVSU5UMzIJCVJYV0lVREY6MzsKLQlVSU5UMzIJCXJzdjoyMjsKLX0JTUFDX0FUVFJJQlVURV9TVFJVQywgKlBNQUNfQVRUUklCVVRFX1NUUlVDOwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFRYIC8gUlggcmluZyBkZXNjcmlwdG9yIGZvcm1hdAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIHRoZSBmaXJzdCAyNC1ieXRlIGluIFRYRCBpcyBjYWxsZWQgVFhJTkZPIGFuZCB3aWxsIGJlIERNQWVkIHRvIE1BQyBibG9jayB0aHJvdWdoIFRYRklGTy4KLS8vIE1BQyBibG9jayB1c2UgdGhpcyBUWElORk8gdG8gY29udHJvbCB0aGUgdHJhbnNtaXNzaW9uIGJlaGF2aW9yIG9mIHRoaXMgZnJhbWUuCi0jZGVmaW5lIEZJRk9fTUdNVCAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBGSUZPX0hDQ0EgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgRklGT19FRENBICAgICAgICAgICAgICAgICAyCi0KLS8vCi0vLyBUWCBkZXNjcmlwdG9yIGZvcm1hdCwgVHgJcmluZywgTWdtdCBSaW5nCi0vLwotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9UWERfU1RSVUMgewotCS8vIFdvcmQJMAotCVVJTlQzMgkJU0RQdHIwOwotCS8vIFdvcmQJMQotCVVJTlQzMgkJU0RMZW4xOjE0OwotCVVJTlQzMgkJTGFzdFNlYzE6MTsKLQlVSU5UMzIJCUJ1cnN0OjE7Ci0JVUlOVDMyCQlTRExlbjA6MTQ7Ci0JVUlOVDMyCQlMYXN0U2VjMDoxOwotCVVJTlQzMgkJRE1BRE9ORToxOwotCS8vV29yZDIKLQlVSU5UMzIJCVNEUHRyMTsKLQkvL1dvcmQzCi0JVUlOVDMyCQlyc3YyOjI0OwotCVVJTlQzMgkJV0lWOjE7CS8vIFdpcmVsZXNzIEluZm8gVmFsaWQuIDEgaWYgRHJpdmVyIGFscmVhZHkgZmlsbCBXSSwgIG8gaWYgRE1BIG5lZWRzIHRvIGNvcHkgV0kgdG8gY29ycmVjdHBvc2l0aW9uCi0JVUlOVDMyCQlRU0VMOjI7CS8vIHNlbGVjdCBvbi1jaGlwIEZJRk8gSUQgZm9yIDJuZC1zdGFnZSBvdXRwdXQgc2NoZWR1bGVyLjA6TUdNVCwgMTpIQ0NBIDI6RURDQQotCVVJTlQzMgkJcnN2OjI7Ci0JVUlOVDMyCQlUQ086MTsJLy8KLQlVSU5UMzIJCVVDTzoxOwkvLwotCVVJTlQzMgkJSUNPOjE7CS8vCi19CVRYRF9TVFJVQywgKlBUWERfU1RSVUM7Ci0KLS8vCi0vLyBUWEQgV2lyZWxlc3MgSW5mb3JtYXRpb24gZm9ybWF0IGZvciBUeCByaW5nIGFuZCBNZ210IFJpbmcKLS8vCi0vL3R4b3AgOiBmb3IgdHhvcCBtb2RlCi0vLyAwOnR4b3AgZm9yIHRoZSBNUERVIGZyYW1lIHdpbGwgYmUgaGFuZGxlcyBieSBBU0lDIGJ5IHJlZ2lzdGVyCi0vLyAxLzIvMzp0aGUgTVBEVSBmcmFtZSBpcyBzZW5kIGFmdGVyIFBJRlMvYmFja29mZi9TSUZTCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1RYV0lfU1RSVUMgewotCS8vIFdvcmQJMAotCVVJTlQzMgkJRlJBRzoxOwkJLy8gMSB0byBpbmZvcm0gVEtJUCBlbmdpbmUgdGhpcyBpcyBhIGZyYWdtZW50LgotCVVJTlQzMgkJTUlNT3BzOjE7CS8vIHRoZSByZW1vdGUgcGVlciBpcyBpbiBkeW5hbWljIE1JTU8tUFMgbW9kZQotCVVJTlQzMgkJQ0ZBQ0s6MTsKLQlVSU5UMzIJCVRTOjE7Ci0KLQlVSU5UMzIJCUFNUERVOjE7Ci0JVUlOVDMyCQlNcGR1RGVuc2l0eTozOwotCVVJTlQzMgkJdHhvcDoyOwkvL0ZPUiAiVEhJUyIgZnJhbWUuIDA6SFQgVFhPUCBydWxlICwgMTpQSUZTIFRYICwyOkJhY2tvZmYsIDM6c2lmcyBvbmx5IHdoZW4gcHJldmlvdXMgZnJhbWUgZXhjaGFuZ2UgaXMgc3VjY2Vzc2Z1bC4KLQlVSU5UMzIJCXJzdjo2OwotCi0JVUlOVDMyCQlNQ1M6NzsKLQlVSU5UMzIJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6Ci0JVUlOVDMyCQlTaG9ydEdJOjE7Ci0JVUlOVDMyCQlTVEJDOjI7CS8vIDE6IFNUQkMgc3VwcG9ydCBNQ1MgPTAtNywgICAyLDMgOiBSRVNFUlZFCi0JVUlOVDMyCQlJZnM6MTsJLy8KLQlVSU5UMzIJCXJzdjI6MTsKLQlVSU5UMzIJCVR4QkY6MTsJLy8gMyozCi0JVUlOVDMyCQlQSFlNT0RFOjI7Ci0JLy8gV29yZAkxCi0JVUlOVDMyCQlBQ0s6MTsKLQlVSU5UMzIJCU5TRVE6MTsKLQlVSU5UMzIJCUJBV2luU2l6ZTo2OwotCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OwotCVVJTlQzMgkJTVBEVXRvdGFsQnl0ZUNvdW50OjEyOwotCVVJTlQzMgkJUGFja2V0SWQ6NDsKLQkvL1dvcmQyCi0JVUlOVDMyCQlJVjsKLQkvL1dvcmQzCi0JVUlOVDMyCQlFSVY7Ci19CVRYV0lfU1RSVUMsICpQVFhXSV9TVFJVQzsKLQotLy8KLS8vIFJ4IGRlc2NyaXB0b3IgZm9ybWF0LCBSeAlSaW5nCi0vLwotI2lmZGVmIFJUMjg2MAotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWERfU1RSVUMJewotCS8vIFdvcmQJMAotCVVJTlQzMgkJU0RQMDsKLQkvLyBXb3JkCTEKLQlVSU5UMzIJCVNETDE6MTQ7Ci0JVUlOVDMyCQlSc3Y6MjsKLQlVSU5UMzIJCVNETDA6MTQ7Ci0JVUlOVDMyCQlMUzA6MTsKLQlVSU5UMzIJCURET05FOjE7Ci0JLy8gV29yZAkyCi0JVUlOVDMyCQlTRFAxOwotCS8vIFdvcmQJMwotCVVJTlQzMgkJQkE6MTsKLQlVSU5UMzIJCURBVEE6MTsKLQlVSU5UMzIJCU5VTExEQVRBOjE7Ci0JVUlOVDMyCQlGUkFHOjE7Ci0JVUlOVDMyCQlVMk06MTsgICAgICAgICAgICAgIC8vIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZQotCVVJTlQzMgkJTWNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgbXVsdGljYXN0IGZyYW1lCi0JVUlOVDMyCQlCY2FzdDoxOyAgICAgICAgICAgIC8vIDE6IHRoaXMgaXMgYSBicm9hZGNhc3QgZnJhbWUKLQlVSU5UMzIJCU15QnNzOjE7ICAJLy8gMTogdGhpcyBmcmFtZSBiZWxvbmdzIHRvIHRoZSBzYW1lIEJTU0lECi0JVUlOVDMyCQlDcmM6MTsgICAgICAgICAgICAgIC8vIDE6IENSQyBlcnJvcgotCVVJTlQzMgkJQ2lwaGVyRXJyOjI7ICAgICAgICAvLyAwOiBkZWNyeXB0aW9uIG9rYXksIDE6SUNWIGVycm9yLCAyOk1JQyBlcnJvciwgMzpLRVkgbm90IHZhbGlkCi0JVUlOVDMyCQlBTVNEVToxOwkJLy8gcnggd2l0aCA4MDIuMyBoZWFkZXIsIG5vdCA4MDIuMTEgaGVhZGVyLgotCVVJTlQzMgkJSFRDOjE7Ci0JVUlOVDMyCQlSU1NJOjE7Ci0JVUlOVDMyCQlMMlBBRDoxOwotCVVJTlQzMgkJQU1QRFU6MTsKLQlVSU5UMzIJCURlY3J5cHRlZDoxOwkvLyB0aGlzIGZyYW1lIGlzIGJlaW5nIGRlY3J5cHRlZC4KLQlVSU5UMzIJCVBsY3BTaWduYWw6MTsJCS8vIFRvIGJlIG1vdmVkCi0JVUlOVDMyCQlQbGNwUnNzaWw6MTsvLyBUbyBiZSBtb3ZlZAotCVVJTlQzMgkJUnN2MToxMzsKLX0JUlhEX1NUUlVDLCAqUFJYRF9TVFJVQywgUlQyOFhYX1JYRF9TVFJVQywgKlBSVDI4WFhfUlhEX1NUUlVDOwotI2VuZGlmIC8qIFJUMjg2MCAqLwotCi0vLwotLy8gUlhXSSB3aXJlbGVzcyBpbmZvcm1hdGlvbiBmb3JtYXQsIGluIFBCRi4gaW52aXNpYmxlIGluIGRyaXZlci4KLS8vCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JYV0lfU1RSVUMgewotCS8vIFdvcmQJMAotCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OwotCVVJTlQzMgkJS2V5SW5kZXg6MjsKLQlVSU5UMzIJCUJTU0lEOjM7Ci0JVUlOVDMyCQlVREY6MzsKLQlVSU5UMzIJCU1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKLQlVSU5UMzIJCVRJRDo0OwotCS8vIFdvcmQJMQotCVVJTlQzMgkJRlJBRzo0OwotCVVJTlQzMgkJU0VRVUVOQ0U6MTI7Ci0JVUlOVDMyCQlNQ1M6NzsKLQlVSU5UMzIJCUJXOjE7Ci0JVUlOVDMyCQlTaG9ydEdJOjE7Ci0JVUlOVDMyCQlTVEJDOjI7Ci0JVUlOVDMyCQlyc3Y6MzsKLQlVSU5UMzIJCVBIWU1PREU6MjsgICAgICAgICAgICAgIC8vIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZQotCS8vV29yZDIKLQlVSU5UMzIJCVJTU0kwOjg7Ci0JVUlOVDMyCQlSU1NJMTo4OwotCVVJTlQzMgkJUlNTSTI6ODsKLQlVSU5UMzIJCXJzdjE6ODsKLQkvL1dvcmQzCi0JVUlOVDMyCQlTTlIwOjg7Ci0JVUlOVDMyCQlTTlIxOjg7Ci0JVUlOVDMyCQlyc3YyOjE2OwotfQlSWFdJX1NUUlVDLCAqUFJYV0lfU1RSVUM7Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gSE9TVC1NQ1UgY29tbXVuaWNhdGlvbiBkYXRhIHN0cnVjdHVyZQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vCi0vLyBIMk1fTUFJTEJPWF9DU1I6IEhvc3QtdG8tTUNVIE1haWxib3gKLS8vCi10eXBlZGVmIHVuaW9uICBfSDJNX01BSUxCT1hfU1RSVUMgewotICAgIHN0cnVjdCB7Ci0gICAgICAgIFVJTlQzMiAgICAgICBMb3dCeXRlOjg7Ci0gICAgICAgIFVJTlQzMiAgICAgICBIaWdoQnl0ZTo4OwotICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW46ODsKLSAgICAgICAgVUlOVDMyICAgICAgIE93bmVyOjg7Ci0gICAgfSAgIGZpZWxkOwotICAgIFVJTlQzMiAgICAgICAgICAgd29yZDsKLX0gSDJNX01BSUxCT1hfU1RSVUMsICpQSDJNX01BSUxCT1hfU1RSVUM7Ci0KLS8vCi0vLyBNMkhfQ01EX0RPTkVfQ1NSOiBNQ1UtdG8tSG9zdCBjb21tYW5kIGNvbXBsZXRlIGluZGljYXRpb24KLS8vCi10eXBlZGVmIHVuaW9uIF9NMkhfQ01EX0RPTkVfU1RSVUMgewotICAgIHN0cnVjdCAgewotICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4wOwotICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4xOwotICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4yOwotICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4zOwotICAgIH0gZmllbGQ7Ci0gICAgVUlOVDMyICAgICAgICAgICB3b3JkOwotfSBNMkhfQ01EX0RPTkVfU1RSVUMsICpQTTJIX0NNRF9ET05FX1NUUlVDOwotCi0vLwotLy8gTUNVX0xFRENTOiBNQ1UgTEVEIENvbnRyb2wgU2V0dGluZy4KLS8vCi10eXBlZGVmIHVuaW9uICBfTUNVX0xFRENTX1NUUlVDIHsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJTGVkTW9kZTo3OwotCQlVQ0hBUgkJUG9sYXJpdHk6MTsKLQl9IGZpZWxkOwotCVVDSEFSCQkJd29yZDsKLX0gTUNVX0xFRENTX1NUUlVDLCAqUE1DVV9MRURDU19TVFJVQzsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBSZWdpc3RlciBmb3JtYXQKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQotLy9OQVZfVElNRV9DRkcgOk5BVgotdHlwZWRlZgl1bmlvbglfTkFWX1RJTUVfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJU2lmczsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKLQkJVUNIQVIgICAgICAgU2xvdFRpbWU7ICAgIC8vIGluIHVuaXQgb2YgMS11cwotCQlVU0hPUlQJCUVpZnM6OTsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKLQkJVVNIT1JUCQlaZXJvU2lmczoxOyAgICAgICAgICAgICAgIC8vIEFwcGxpZWQgemVybyBTSUZTIHRpbWVyIGFmdGVyIE9GRE0gUlggMDogZGlzYWJsZQotCQlVU0hPUlQJCXJzdjo2OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTkFWX1RJTUVfQ0ZHX1NUUlVDLCAqUE5BVl9USU1FX0NGR19TVFJVQzsKLQotLy8KLS8vIFJYX0ZJTFRSX0NGRzogIC9SWCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCi0vLwotdHlwZWRlZgl1bmlvbglfUlhfRklMVFJfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCURyb3BDUkNFcnI6MTsJCS8vIERyb3AgQ1JDIGVycm9yCi0JCVVJTlQzMgkJRHJvcFBoeUVycjoxOwkJLy8gRHJvcCBwaHlzaWNhbCBlcnJvcgotCQlVSU5UMzIJCURyb3BOb3RUb01lOjE7CQkvLyBEcm9wIG5vdCB0byBtZSB1bmljYXN0IGZyYW1lCi0JCVVJTlQzMgkJRHJvcE5vdE15QlNTSUQ6MTsJCQkvLyBEcm9wIGZyYW0gVG9EcyBiaXQgaXMgdHJ1ZQotCi0JCVVJTlQzMgkJRHJvcFZlckVycjoxOwkgICAgLy8gRHJvcCB2ZXJzaW9uIGVycm9yIGZyYW1lCi0JCVVJTlQzMgkJRHJvcE1jYXN0OjE7CQkvLyBEcm9wIG11bHRpY2FzdCBmcmFtZXMKLQkJVUlOVDMyCQlEcm9wQmNhc3Q6MTsJCS8vIERyb3AgYnJvYWRjYXN0IGZyYW1lcwotCQlVSU5UMzIJCURyb3BEdXBsaWNhdGU6MTsJCS8vIERyb3AgZHVwbGljYXRlIGZyYW1lCi0KLQkJVUlOVDMyCQlEcm9wQ0ZFbmRBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAotCQlVSU5UMzIJCURyb3BDRkVuZDoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0JCVVJTlQzMgkJRHJvcEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0JCVVJTlQzMgkJRHJvcEN0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0KLQkJVUlOVDMyCQlEcm9wUnRzOjE7CQkvLyBEcm9wIFBzLVBvbGwKLQkJVUlOVDMyCQlEcm9wUHNQb2xsOjE7CQkvLyBEcm9wIFBzLVBvbGwKLQkJVUlOVDMyCQlEcm9wQkE6MTsJCS8vCi0gICAgICAgIAlVSU5UMzIgICAgICAgCURyb3BCQVI6MTsgICAgICAgLy8KLQotCQlVSU5UMzIgICAgICAgCURyb3BSc3ZDbnRsVHlwZToxOwotCQlVSU5UMzIJCToxNTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJYX0ZJTFRSX0NGR19TVFJVQywgKlBSWF9GSUxUUl9DRkdfU1RSVUM7Ci0KLS8vCi0vLyBQSFlfQ1NSNDogUkYgc2VyaWFsIGNvbnRyb2wgcmVnaXN0ZXIKLS8vCi10eXBlZGVmCXVuaW9uCV9QSFlfQ1NSNF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSRlJlZ1ZhbHVlOjI0OwkJLy8gUmVnaXN0ZXIJdmFsdWUgKGluY2x1ZGUgcmVnaXN0ZXIJaWQpCXNlcmlhbCBvdXQgdG8gUkYvSUYJY2hpcC4KLQkJVUlOVDMyCQlOdW1iZXJPZkJpdHM6NTsJCS8vIE51bWJlciBvZiBiaXRzIHVzZWQgaW4gUkZSZWdWYWx1ZSAoSToyMCwJUkZNRDoyMikKLQkJVUlOVDMyCQlJRlNlbGVjdDoxOwkJCS8vIDE6IHNlbGVjdCBJRgl0byBwcm9ncmFtLAkwOiBzZWxlY3QgUkYgdG8JcHJvZ3JhbQotCQlVSU5UMzIJCVBMTF9MRDoxOwkJCS8vIFJGIFBMTF9MRCBzdGF0dXMKLQkJVUlOVDMyCQlCdXN5OjE7CQkJCS8vIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIFJGIHByb2dyYW1taW5nLgotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUEhZX0NTUjRfU1RSVUMsICpQUEhZX0NTUjRfU1RSVUM7Ci0KLS8vCi0vLyBTRUNfQ1NSNTogc2hhcmVkIGtleSB0YWJsZSBzZWN1cml0eSBtb2RlIHJlZ2lzdGVyCi0vLwotdHlwZWRlZgl1bmlvbglfU0VDX0NTUjVfU1RSVUMJewotCXN0cnVjdAl7Ci0gICAgICAgIFVJTlQzMiAgICAgICBCc3MyS2V5MENpcGhlckFsZzozOwotICAgICAgICBVSU5UMzIgICAgICAgOjE7Ci0gICAgICAgIFVJTlQzMiAgICAgICBCc3MyS2V5MUNpcGhlckFsZzozOwotICAgICAgICBVSU5UMzIgICAgICAgOjE7Ci0gICAgICAgIFVJTlQzMiAgICAgICBCc3MyS2V5MkNpcGhlckFsZzozOwotICAgICAgICBVSU5UMzIgICAgICAgOjE7Ci0gICAgICAgIFVJTlQzMiAgICAgICBCc3MyS2V5M0NpcGhlckFsZzozOwotICAgICAgICBVSU5UMzIgICAgICAgOjE7Ci0gICAgICAgIFVJTlQzMiAgICAgICBCc3MzS2V5MENpcGhlckFsZzozOwotICAgICAgICBVSU5UMzIgICAgICAgOjE7Ci0gICAgICAgIFVJTlQzMiAgICAgICBCc3MzS2V5MUNpcGhlckFsZzozOwotICAgICAgICBVSU5UMzIgICAgICAgOjE7Ci0gICAgICAgIFVJTlQzMiAgICAgICBCc3MzS2V5MkNpcGhlckFsZzozOwotICAgICAgICBVSU5UMzIgICAgICAgOjE7Ci0gICAgICAgIFVJTlQzMiAgICAgICBCc3MzS2V5M0NpcGhlckFsZzozOwotICAgICAgICBVSU5UMzIgICAgICAgOjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlTRUNfQ1NSNV9TVFJVQywgKlBTRUNfQ1NSNV9TVFJVQzsKLQotLy8KLS8vIEhPU1RfQ01EX0NTUjogRm9yIEhPU1QgdG8gaW50ZXJydXB0IGVtYmVkZGVkIHByb2Nlc3NvcgotLy8KLXR5cGVkZWYJdW5pb24JX0hPU1RfQ01EX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgSG9zdENvbW1hbmQ6ODsKLQkgICAgVUlOVDMyICAgUnN2OjI0OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JSE9TVF9DTURfQ1NSX1NUUlVDLCAqUEhPU1RfQ01EX0NTUl9TVFJVQzsKLQotLy8KLS8vIEFJRlNOX0NTUjogQUlGU04gZm9yIGVhY2ggRURDQSBBQwotLy8KLQotCi0KLS8vCi0vLyBFMlBST01fQ1NSOiBFRVBST00gY29udHJvbCByZWdpc3RlcgotLy8KLXR5cGVkZWYJdW5pb24JX0UyUFJPTV9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJUmVsb2FkOjE7CQkvLyBSZWxvYWQgRUVQUk9NIGNvbnRlbnQsIHdyaXRlIG9uZSB0byByZWxvYWQsIHNlbGYtY2xlYXJlZC4KLQkJVUlOVDMyCQlFZXByb21TSzoxOwotCQlVSU5UMzIJCUVlcHJvbUNTOjE7Ci0JCVVJTlQzMgkJRWVwcm9tREk6MTsKLQkJVUlOVDMyCQlFZXByb21ETzoxOwotCQlVSU5UMzIJCVR5cGU6MTsJCQkvLyAxOiA5M0M0NiwgMDo5M0M2NgotCQlVSU5UMzIgICAgICAgTG9hZFN0YXR1czoxOyAgIC8vIDE6bG9hZGluZywgMDpkb25lCi0JCVVJTlQzMgkJUnN2ZDoyNTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUUyUFJPTV9DU1JfU1RSVUMsICpQRTJQUk9NX0NTUl9TVFJVQzsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIEUyUFJPTSBkYXRhIGxheW91dAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLwotLy8gRUVQUk9NIGFudGVubmEgc2VsZWN0IGZvcm1hdAotLy8KLXR5cGVkZWYJdW5pb24JX0VFUFJPTV9BTlRFTk5BX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVU0hPUlQJCVJ4UGF0aDo0OwkvLyAxOiAxUiwgMjogMlIsIDM6IDNSCi0JCVVTSE9SVAkJVHhQYXRoOjQ7CS8vIDE6IDFULCAyOiAyVAotCQlVU0hPUlQgICAgICBSZkljVHlwZTo0OyAgICAgICAgICAgICAvLyBzZWUgRTJQUk9NIGRvY3VtZW50Ci0JCVVTSE9SVCAgICAgIFJzdjo0OwotCX0JZmllbGQ7Ci0JVVNIT1JUCQkJd29yZDsKLX0JRUVQUk9NX0FOVEVOTkFfU1RSVUMsICpQRUVQUk9NX0FOVEVOTkFfU1RSVUM7Ci0KLXR5cGVkZWYJdW5pb24gX0VFUFJPTV9OSUNfQ0lORklHMl9TVFJVQwl7Ci0Jc3RydWN0IHsKLQkJVVNIT1JUCQlIYXJkd2FyZVJhZGlvQ29udHJvbDoxOwkvLyAxOmVuYWJsZSwgMDpkaXNhYmxlCi0JCVVTSE9SVAkJRHluYW1pY1R4QWdjQ29udHJvbDoxOwkJCS8vCi0JCVVTSE9SVAkJRXh0ZXJuYWxMTkFGb3JHOjE7CQkJCS8vCi0JCVVTSE9SVAkJRXh0ZXJuYWxMTkFGb3JBOjE7CQkJLy8gZXh0ZXJuYWwgTE5BIGVuYWJsZSBmb3IgMi40RwotCQlVU0hPUlQJCUNhcmRidXNBY2NlbGVyYXRpb246MTsJLy8gISEhIE5PVEU6IDAgLSBlbmFibGUsIDEgLSBkaXNhYmxlCi0JCVVTSE9SVAkJQlc0ME1TaWRlYmFuZEZvckc6MTsKLQkJVVNIT1JUCQlCVzQwTVNpZGViYW5kRm9yQToxOwotCQlVU0hPUlQJCUVuYWJsZVdQU1BCQzoxOyAgICAgICAgICAgICAgICAgLy8gV1BTIFBCQyBDb250cm9sIGJpdAotCQlVU0hPUlQJCUJXNDBNQXZhaWxGb3JHOjE7CQkJLy8gMDplbmFibGUsIDE6ZGlzYWJsZQotCQlVU0hPUlQJCUJXNDBNQXZhaWxGb3JBOjE7CQkJLy8gMDplbmFibGUsIDE6ZGlzYWJsZQotCQlVU0hPUlQJCVJzdjE6MTsJCQkJCS8vIG11c3QgYmUgMAotCQlVU0hPUlQJCUFudERpdmVyc2l0eToxOwkJCS8vIEFudGVubmEgZGl2ZXJzaXR5Ci0JCVVTSE9SVAkJUnN2MjozOwkJCQkJLy8gbXVzdCBiZSAwCi0JCVVTSE9SVAkJREFDVGVzdEJpdDoxOwkJCS8vIGNvbnRyb2wgaWYgZHJpdmVyIHNob3VsZCBwYXRjaCB0aGUgREFDIGlzc3VlCi0JfQlmaWVsZDsKLQlVU0hPUlQJCQl3b3JkOwotfQlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMsICpQRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDOwotCi0vLwotLy8gVFhfUFdSIFZhbHVlIHZhbGlkIHJhbmdlIDB4RkEoLTYpIH4gMHgyNCgzNikKLS8vCi10eXBlZGVmCXVuaW9uCV9FRVBST01fVFhfUFdSX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlDSEFSCUJ5dGUwOwkJCQkvLyBMb3cgQnl0ZQotCQlDSEFSCUJ5dGUxOwkJCQkvLyBIaWdoIEJ5dGUKLQl9CWZpZWxkOwotCVVTSE9SVAl3b3JkOwotfQlFRVBST01fVFhfUFdSX1NUUlVDLCAqUEVFUFJPTV9UWF9QV1JfU1RSVUM7Ci0KLXR5cGVkZWYJdW5pb24JX0VFUFJPTV9WRVJTSU9OX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUglGYWVSZWxlYXNlTnVtYmVyOwkvLyBMb3cgQnl0ZQotCQlVQ0hBUglWZXJzaW9uOwkJCS8vIEhpZ2ggQnl0ZQotCX0JZmllbGQ7Ci0JVVNIT1JUCXdvcmQ7Ci19CUVFUFJPTV9WRVJTSU9OX1NUUlVDLCAqUEVFUFJPTV9WRVJTSU9OX1NUUlVDOwotCi10eXBlZGVmCXVuaW9uCV9FRVBST01fTEVEX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVU0hPUlQJUG9sYXJpdHlSRFlfRzoxOwkJLy8gUG9sYXJpdHkgUkRZX0cgc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5UkRZX0E6MTsJCS8vIFBvbGFyaXR5IFJEWV9BIHNldHRpbmcuCi0JCVVTSE9SVAlQb2xhcml0eUFDVDoxOwkJLy8gUG9sYXJpdHkgQUNUIHNldHRpbmcuCi0JCVVTSE9SVAlQb2xhcml0eUdQSU9fMDoxOwkvLyBQb2xhcml0eSBHUElPIzAgc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5R1BJT18xOjE7CS8vIFBvbGFyaXR5IEdQSU8jMSBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlHUElPXzI6MTsJLy8gUG9sYXJpdHkgR1BJTyMyIHNldHRpbmcuCi0JCVVTSE9SVAlQb2xhcml0eUdQSU9fMzoxOwkvLyBQb2xhcml0eSBHUElPIzMgc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5R1BJT180OjE7CS8vIFBvbGFyaXR5IEdQSU8jNCBzZXR0aW5nLgotCQlVU0hPUlQJTGVkTW9kZTo1OwkJCS8vIExlZCBtb2RlLgotCQlVU0hPUlQJUnN2ZDozOwkJCQkvLyBSZXNlcnZlZAotCX0JZmllbGQ7Ci0JVVNIT1JUCXdvcmQ7Ci19CUVFUFJPTV9MRURfU1RSVUMsICpQRUVQUk9NX0xFRF9TVFJVQzsKLQotdHlwZWRlZgl1bmlvbglfRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVDSEFSCURlbHRhVmFsdWU6NjsJLy8gVHggUG93ZXIgZGFsdGEgdmFsdWUgKE1BWD00KQotCQlVQ0hBUglUeXBlOjE7CQkJLy8gMTogcGx1cyB0aGUgZGVsdGEgdmFsdWUsIDA6IG1pbnVzIHRoZSBkZWx0YSB2YWx1ZQotCQlVQ0hBUglUeFBvd2VyRW5hYmxlOjE7Ly8gRW5hYmxlCi0JfQlmaWVsZDsKLQlVQ0hBUgl2YWx1ZTsKLX0JRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUMsICpQRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUM7Ci0KLS8vCi0vLyBRT1NfQ1NSMDogVFhPUCBob2xkZXIgYWRkcmVzczAgcmVnaXN0ZXIKLS8vCi10eXBlZGVmCXVuaW9uCV9RT1NfQ1NSMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJCUJ5dGUwOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAwCi0JCVVDSEFSCQlCeXRlMTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMQotCQlVQ0hBUgkJQnl0ZTI7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDIKLQkJVUNIQVIJCUJ5dGUzOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAzCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlRT1NfQ1NSMF9TVFJVQywgKlBRT1NfQ1NSMF9TVFJVQzsKLQotLy8KLS8vIFFPU19DU1IxOiBUWE9QIGhvbGRlciBhZGRyZXNzMSByZWdpc3RlcgotLy8KLXR5cGVkZWYJdW5pb24JX1FPU19DU1IxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKLQkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1Ci0JCVVDSEFSCQlSc3ZkMDsKLQkJVUNIQVIJCVJzdmQxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUU9TX0NTUjFfU1RSVUMsICpQUU9TX0NTUjFfU1RSVUM7Ci0KLSNkZWZpbmUJUkZfQ1NSX0NGRwkweDUwMAotdHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVAlSRl9DU1JfREFUQTo4OwkJCS8vIERBVEEKLQkJVUlOVAlURVNUQ1NSX1JGQUNDX1JFR05VTTo1OwkvLyBSRiByZWdpc3RlciBJRAotCQlVSU5UCVJzdmQyOjM7CQkJCS8vIFJlc2VydmVkCi0JCVVJTlQJUkZfQ1NSX1dSOjE7CQkJLy8gMDogcmVhZCAgMTogd3JpdGUKLQkJVUlOVAlSRl9DU1JfS0lDSzoxOwkJCS8vIGtpY2sgUkYgcmVnaXN0ZXIgcmVhZC93cml0ZQotCQlVSU5UCVJzdmQxOjE0OwkJCQkvLyBSZXNlcnZlZAotCX0JZmllbGQ7Ci0JVUlOVAl3b3JkOwotfQlSRl9DU1JfQ0ZHX1NUUlVDLCAqUFJGX0NTUl9DRkdfU1RSVUM7Ci0KLSNlbmRpZgkvLyBfX1JUMjhYWF9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfY29uZmlnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2NvbmZpZy5oCmluZGV4IDIwOTNhODAuLmQxYWRlZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfY29uZmlnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9jb25maWcuaApAQCAtNDEsMzIgKzQxLDMxIEBACiAjZGVmaW5lCV9fUlRfQ09ORklHX0hfXwogCiAjaW5jbHVkZSAgICAicnRtcF90eXBlLmgiCi0jaWZkZWYgTElOVVgKLSNpbmNsdWRlCSJydF9saW51eC5oIgotI2VuZGlmCi0jaW5jbHVkZSAgICAicnRtcF9kZWYuaCIKLSNpbmNsdWRlICAgICJydDI4eHguaCIKKyNpbmNsdWRlICJydG1wX29zLmgiCiAKLSNpZmRlZiBSVDI4NjAKLSNpbmNsdWRlCSJydDI4NjAuaCIKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotI2luY2x1ZGUJIi4uL3J0Mjg3MC9ydDI4NzAuaCIKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNpbmNsdWRlICJydG1wX2RlZi5oIgorI2luY2x1ZGUgInJ0bXBfY2hpcC5oIgorI2luY2x1ZGUgInJ0bXBfdGltZXIuaCIKIAogI2luY2x1ZGUgICAgIm9pZC5oIgogI2luY2x1ZGUgICAgIm1sbWUuaCIKICNpbmNsdWRlICAgICJ3cGEuaCIKLSNpbmNsdWRlICAgICJtZDUuaCIKKyNpbmNsdWRlICJjcnlwdF9tZDUuaCIKKyNpbmNsdWRlICJjcnlwdF9zaGEyLmgiCisjaW5jbHVkZSAiY3J5cHRfaG1hYy5oIgogI2luY2x1ZGUgICAgInJ0bXAuaCIKICNpbmNsdWRlCSJhcC5oIgogI2luY2x1ZGUJImRmcy5oIgogI2luY2x1ZGUJImNobGlzdC5oIgogI2luY2x1ZGUJInNwZWN0cnVtLmgiCiAKKyNpbmNsdWRlICJlZXByb20uaCIKKyNpZiBkZWZpbmVkKFJUTVBfUENJX1NVUFBPUlQpIHx8IGRlZmluZWQoUlRNUF9VU0JfU1VQUE9SVCkKKyNpbmNsdWRlICJydG1wX21jdS5oIgorI2VuZGlmCisKICNpZmRlZiBJR01QX1NOT09QX1NVUFBPUlQKICNpbmNsdWRlICJpZ21wX3Nub29wLmgiCi0jZW5kaWYgLy8gSUdNUF9TTk9PUF9TVVBQT1JUIC8vCisjZW5kaWYgLyogSUdNUF9TTk9PUF9TVVBQT1JUIC8vICovCiAKLSNlbmRpZgkvLyBfX1JUX0NPTkZJR19IX18KLQorI2VuZGlmIC8qIF9fUlRfQ09ORklHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5jCmluZGV4IGVkMjdiODUuLjkzNTdmYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmMKQEAgLTI4LDE0OSArMjgsMTE0IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlICJydF9jb25maWcuaCIKIAotVUxPTkcJUlREZWJ1Z0xldmVsID0gUlRfREVCVUdfRVJST1I7Cit1bnNpZ25lZCBsb25nIFJURGVidWdMZXZlbCA9IFJUX0RFQlVHX0VSUk9SOwogCi1CVUlMRF9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKEFzaWNSeEFudEV2YWxUaW1lb3V0KTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKEFQU0RQZXJpb2RpY0V4ZWMpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oQXNpY1JmVHVuaW5nRXhlYyk7Ci0jaWZkZWYgUlQyODcwCi1CVUlMRF9USU1FUl9GVU5DVElPTihCZWFjb25VcGRhdGVFeGVjKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotQlVJTERfVElNRVJfRlVOQ1RJT04oQmVhY29uVGltZW91dCk7Ci1CVUlMRF9USU1FUl9GVU5DVElPTihTY2FuVGltZW91dCk7Ci1CVUlMRF9USU1FUl9GVU5DVElPTihBdXRoVGltZW91dCk7Ci1CVUlMRF9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oUmVhc3NvY1RpbWVvdXQpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oRGlzYXNzb2NUaW1lb3V0KTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKExpbmtEb3duRXhlYyk7Ci1CVUlMRF9USU1FUl9GVU5DVElPTihTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKTsKLSNpZmRlZiBSVDI4NjAKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKFBzUG9sbFdha2VFeGVjKTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKFJhZGlvT25FeGVjKTsKLSNlbmRpZgotCi0vLyBmb3Igd2lyZWxlc3Mgc3lzdGVtIGV2ZW50IG1lc3NhZ2UKKy8qIGZvciB3aXJlbGVzcyBzeXN0ZW0gZXZlbnQgbWVzc2FnZSAqLwogY2hhciBjb25zdCAqcFdpcmVsZXNzU3lzRXZlbnRUZXh0W0lXX1NZU19FVkVOVF9UWVBFX05VTV0gPSB7Ci0JLy8gc3lzdGVtIHN0YXR1cyBldmVudAotICAgICJoYWQgYXNzb2NpYXRlZCBzdWNjZXNzZnVsbHkiLAkJCQkJCQkvKiBJV19BU1NPQ19FVkVOVF9GTEFHICovCi0gICAgImhhZCBkaXNhc3NvY2lhdGVkIiwJCQkJCQkJCQkvKiBJV19ESVNBU1NPQ19FVkVOVF9GTEFHICovCi0gICAgImhhZCBkZWF1dGhlbnRpY2F0ZWQiLAkJCQkJCQkJCS8qIElXX0RFQVVUSF9FVkVOVF9GTEFHICovCi0gICAgImhhZCBiZWVuIGFnZWQtb3V0IGFuZCBkaXNhc3NvY2lhdGVkIiwJCQkJCS8qIElXX0FHRU9VVF9FVkVOVF9GTEFHICovCi0gICAgIm9jY3VycmVkIENvdW50ZXJNZWFzdXJlcyBhdHRhY2siLAkJCQkJCS8qIElXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRyAqLwotICAgICJvY2N1cnJlZCByZXBsYXkgY291bnRlciBkaWZmZXJlbnQgaW4gS2V5IEhhbmRzaGFraW5nIiwJLyogSVdfUkVQTEFZX0NPVU5URVJfRElGRl9FVkVOVF9GTEFHICovCi0gICAgIm9jY3VycmVkIFJTTklFIGRpZmZlcmVudCBpbiBLZXkgSGFuZHNoYWtpbmciLAkJCS8qIElXX1JTTklFX0RJRkZfRVZFTlRfRkxBRyAqLwotICAgICJvY2N1cnJlZCBNSUMgZGlmZmVyZW50IGluIEtleSBIYW5kc2hha2luZyIsCQkJLyogSVdfTUlDX0RJRkZfRVZFTlRfRkxBRyAqLwotICAgICJvY2N1cnJlZCBJQ1YgZXJyb3IgaW4gUlgiLAkJCQkJCQkJLyogSVdfSUNWX0VSUk9SX0VWRU5UX0ZMQUcgKi8KLSAgICAib2NjdXJyZWQgTUlDIGVycm9yIGluIFJYIiwJCQkJCQkJCS8qIElXX01JQ19FUlJPUl9FVkVOVF9GTEFHICovCi0JIkdyb3VwIEtleSBIYW5kc2hha2luZyB0aW1lb3V0IiwJCQkJCQkvKiBJV19HUk9VUF9IU19USU1FT1VUX0VWRU5UX0ZMQUcgKi8KLQkiUGFpcndpc2UgS2V5IEhhbmRzaGFraW5nIHRpbWVvdXQiLAkJCQkJCS8qIElXX1BBSVJXSVNFX0hTX1RJTUVPVVRfRVZFTlRfRkxBRyAqLwotCSJSU04gSUUgc2FuaXR5IGNoZWNrIGZhaWx1cmUiLAkJCQkJCQkvKiBJV19SU05JRV9TQU5JVFlfRkFJTF9FVkVOVF9GTEFHICovCi0JInNldCBrZXkgZG9uZSBpbiBXUEEvV1BBUFNLIiwJCQkJCQkJLyogSVdfU0VUX0tFWV9ET05FX1dQQTFfRVZFTlRfRkxBRyAqLwotCSJzZXQga2V5IGRvbmUgaW4gV1BBMi9XUEEyUFNLIiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRyAqLwotCSJjb25uZWN0cyB3aXRoIG91ciB3aXJlbGVzcyBjbGllbnQiLCAgICAgICAgICAgICAgICAgICAgLyogSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHICovCi0JImRpc2Nvbm5lY3RzIHdpdGggb3VyIHdpcmVsZXNzIGNsaWVudCIsICAgICAgICAgICAgICAgICAvKiBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRyAqLwotCSJzY2FuIGNvbXBsZXRlZCIJCQkJCQkJCQkJLyogSVdfU0NBTl9DT01QTEVURURfRVZFTlRfRkxBRyAqLwotCSJzY2FuIHRlcm1pbmF0ZSEhIEJ1c3khISBFbnF1ZXVlIGZhaWwhISIJCQkJLyogSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRyAqLwotCX07CisJLyogc3lzdGVtIHN0YXR1cyBldmVudCAqLworCSJoYWQgYXNzb2NpYXRlZCBzdWNjZXNzZnVsbHkiLAkvKiBJV19BU1NPQ19FVkVOVF9GTEFHICovCisJImhhZCBkaXNhc3NvY2lhdGVkIiwJLyogSVdfRElTQVNTT0NfRVZFTlRfRkxBRyAqLworCSJoYWQgZGVhdXRoZW50aWNhdGVkIiwJLyogSVdfREVBVVRIX0VWRU5UX0ZMQUcgKi8KKwkiaGFkIGJlZW4gYWdlZC1vdXQgYW5kIGRpc2Fzc29jaWF0ZWQiLAkvKiBJV19BR0VPVVRfRVZFTlRfRkxBRyAqLworCSJvY2N1cnJlZCBDb3VudGVyTWVhc3VyZXMgYXR0YWNrIiwJLyogSVdfQ09VTlRFUl9NRUFTVVJFU19FVkVOVF9GTEFHICovCisJIm9jY3VycmVkIHJlcGxheSBjb3VudGVyIGRpZmZlcmVudCBpbiBLZXkgSGFuZHNoYWtpbmciLAkvKiBJV19SRVBMQVlfQ09VTlRFUl9ESUZGX0VWRU5UX0ZMQUcgKi8KKwkib2NjdXJyZWQgUlNOSUUgZGlmZmVyZW50IGluIEtleSBIYW5kc2hha2luZyIsCS8qIElXX1JTTklFX0RJRkZfRVZFTlRfRkxBRyAqLworCSJvY2N1cnJlZCBNSUMgZGlmZmVyZW50IGluIEtleSBIYW5kc2hha2luZyIsCS8qIElXX01JQ19ESUZGX0VWRU5UX0ZMQUcgKi8KKwkib2NjdXJyZWQgSUNWIGVycm9yIGluIFJYIiwJLyogSVdfSUNWX0VSUk9SX0VWRU5UX0ZMQUcgKi8KKwkib2NjdXJyZWQgTUlDIGVycm9yIGluIFJYIiwJLyogSVdfTUlDX0VSUk9SX0VWRU5UX0ZMQUcgKi8KKwkiR3JvdXAgS2V5IEhhbmRzaGFraW5nIHRpbWVvdXQiLAkvKiBJV19HUk9VUF9IU19USU1FT1VUX0VWRU5UX0ZMQUcgKi8KKwkiUGFpcndpc2UgS2V5IEhhbmRzaGFraW5nIHRpbWVvdXQiLAkvKiBJV19QQUlSV0lTRV9IU19USU1FT1VUX0VWRU5UX0ZMQUcgKi8KKwkiUlNOIElFIHNhbml0eSBjaGVjayBmYWlsdXJlIiwJLyogSVdfUlNOSUVfU0FOSVRZX0ZBSUxfRVZFTlRfRkxBRyAqLworCSJzZXQga2V5IGRvbmUgaW4gV1BBL1dQQVBTSyIsCS8qIElXX1NFVF9LRVlfRE9ORV9XUEExX0VWRU5UX0ZMQUcgKi8KKwkic2V0IGtleSBkb25lIGluIFdQQTIvV1BBMlBTSyIsCS8qIElXX1NFVF9LRVlfRE9ORV9XUEEyX0VWRU5UX0ZMQUcgKi8KKwkiY29ubmVjdHMgd2l0aCBvdXIgd2lyZWxlc3MgY2xpZW50IiwJLyogSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHICovCisJImRpc2Nvbm5lY3RzIHdpdGggb3VyIHdpcmVsZXNzIGNsaWVudCIsCS8qIElXX1NUQV9MSU5LRE9XTl9FVkVOVF9GTEFHICovCisJInNjYW4gY29tcGxldGVkIgkvKiBJV19TQ0FOX0NPTVBMRVRFRF9FVkVOVF9GTEFHICovCisJICAgICJzY2FuIHRlcm1pbmF0ZSEgQnVzeSEgRW5xdWV1ZSBmYWlsISIJLyogSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRyAqLworfTsKIAotLy8gZm9yIHdpcmVsZXNzIElEU19zcG9vZl9hdHRhY2sgZXZlbnQgbWVzc2FnZQorLyogZm9yIHdpcmVsZXNzIElEU19zcG9vZl9hdHRhY2sgZXZlbnQgbWVzc2FnZSAqLwogY2hhciBjb25zdCAqcFdpcmVsZXNzU3Bvb2ZFdmVudFRleHRbSVdfU1BPT0ZfRVZFTlRfVFlQRV9OVU1dID0gewotICAgICJkZXRlY3RlZCBjb25mbGljdCBTU0lEIiwJCQkJCQkJCS8qIElXX0NPTkZMSUNUX1NTSURfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBzcG9vZmVkIGFzc29jaWF0aW9uIHJlc3BvbnNlIiwJCQkJLyogSVdfU1BPT0ZfQVNTT0NfUkVTUF9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIHNwb29mZWQgcmVhc3NvY2lhdGlvbiByZXNwb25zZXMiLAkJCQkvKiBJV19TUE9PRl9SRUFTU09DX1JFU1BfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBzcG9vZmVkIHByb2JlIHJlc3BvbnNlIiwJCQkJCQkvKiBJV19TUE9PRl9QUk9CRV9SRVNQX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBiZWFjb24iLAkJCQkJCQkJLyogSVdfU1BPT0ZfQkVBQ09OX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBkaXNhc3NvY2lhdGlvbiIsCQkJCQkJLyogSVdfU1BPT0ZfRElTQVNTT0NfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBzcG9vZmVkIGF1dGhlbnRpY2F0aW9uIiwJCQkJCQkvKiBJV19TUE9PRl9BVVRIX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBkZWF1dGhlbnRpY2F0aW9uIiwJCQkJCS8qIElXX1NQT09GX0RFQVVUSF9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIHNwb29mZWQgdW5rbm93biBtYW5hZ2VtZW50IGZyYW1lIiwJCQkvKiBJV19TUE9PRl9VTktOT1dOX01HTVRfRVZFTlRfRkxBRyAqLwotCSJkZXRlY3RlZCByZXBsYXkgYXR0YWNrIgkJCQkJCQkJLyogSVdfUkVQTEFZX0FUVEFDS19FVkVOVF9GTEFHICovCi0JfTsKKwkiZGV0ZWN0ZWQgY29uZmxpY3QgU1NJRCIsCS8qIElXX0NPTkZMSUNUX1NTSURfRVZFTlRfRkxBRyAqLworCSJkZXRlY3RlZCBzcG9vZmVkIGFzc29jaWF0aW9uIHJlc3BvbnNlIiwJLyogSVdfU1BPT0ZfQVNTT0NfUkVTUF9FVkVOVF9GTEFHICovCisJImRldGVjdGVkIHNwb29mZWQgcmVhc3NvY2lhdGlvbiByZXNwb25zZXMiLAkvKiBJV19TUE9PRl9SRUFTU09DX1JFU1BfRVZFTlRfRkxBRyAqLworCSJkZXRlY3RlZCBzcG9vZmVkIHByb2JlIHJlc3BvbnNlIiwJLyogSVdfU1BPT0ZfUFJPQkVfUkVTUF9FVkVOVF9GTEFHICovCisJImRldGVjdGVkIHNwb29mZWQgYmVhY29uIiwJLyogSVdfU1BPT0ZfQkVBQ09OX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgc3Bvb2ZlZCBkaXNhc3NvY2lhdGlvbiIsCS8qIElXX1NQT09GX0RJU0FTU09DX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgc3Bvb2ZlZCBhdXRoZW50aWNhdGlvbiIsCS8qIElXX1NQT09GX0FVVEhfRVZFTlRfRkxBRyAqLworCSJkZXRlY3RlZCBzcG9vZmVkIGRlYXV0aGVudGljYXRpb24iLAkvKiBJV19TUE9PRl9ERUFVVEhfRVZFTlRfRkxBRyAqLworCSJkZXRlY3RlZCBzcG9vZmVkIHVua25vd24gbWFuYWdlbWVudCBmcmFtZSIsCS8qIElXX1NQT09GX1VOS05PV05fTUdNVF9FVkVOVF9GTEFHICovCisJImRldGVjdGVkIHJlcGxheSBhdHRhY2siCS8qIElXX1JFUExBWV9BVFRBQ0tfRVZFTlRfRkxBRyAqLworfTsKIAotLy8gZm9yIHdpcmVsZXNzIElEU19mbG9vZGluZ19hdHRhY2sgZXZlbnQgbWVzc2FnZQorLyogZm9yIHdpcmVsZXNzIElEU19mbG9vZGluZ19hdHRhY2sgZXZlbnQgbWVzc2FnZSAqLwogY2hhciBjb25zdCAqcFdpcmVsZXNzRmxvb2RFdmVudFRleHRbSVdfRkxPT0RfRVZFTlRfVFlQRV9OVU1dID0gewotCSJkZXRlY3RlZCBhdXRoZW50aWNhdGlvbiBmbG9vZGluZyIsCQkJCQkJLyogSVdfRkxPT0RfQVVUSF9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIGFzc29jaWF0aW9uIHJlcXVlc3QgZmxvb2RpbmciLAkJCQkvKiBJV19GTE9PRF9BU1NPQ19SRVFfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCByZWFzc29jaWF0aW9uIHJlcXVlc3QgZmxvb2RpbmciLAkJCQkvKiBJV19GTE9PRF9SRUFTU09DX1JFUV9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIHByb2JlIHJlcXVlc3QgZmxvb2RpbmciLAkJCQkJCS8qIElXX0ZMT09EX1BST0JFX1JFUV9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIGRpc2Fzc29jaWF0aW9uIGZsb29kaW5nIiwJCQkJCQkvKiBJV19GTE9PRF9ESVNBU1NPQ19FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIGRlYXV0aGVudGljYXRpb24gZmxvb2RpbmciLAkJCQkJLyogSVdfRkxPT0RfREVBVVRIX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgODAyLjF4IGVhcC1yZXF1ZXN0IGZsb29kaW5nIgkJCQkJLyogSVdfRkxPT0RfRUFQX1JFUV9FVkVOVF9GTEFHICovCi0JfTsKKwkiZGV0ZWN0ZWQgYXV0aGVudGljYXRpb24gZmxvb2RpbmciLAkvKiBJV19GTE9PRF9BVVRIX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgYXNzb2NpYXRpb24gcmVxdWVzdCBmbG9vZGluZyIsCS8qIElXX0ZMT09EX0FTU09DX1JFUV9FVkVOVF9GTEFHICovCisJImRldGVjdGVkIHJlYXNzb2NpYXRpb24gcmVxdWVzdCBmbG9vZGluZyIsCS8qIElXX0ZMT09EX1JFQVNTT0NfUkVRX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgcHJvYmUgcmVxdWVzdCBmbG9vZGluZyIsCS8qIElXX0ZMT09EX1BST0JFX1JFUV9FVkVOVF9GTEFHICovCisJImRldGVjdGVkIGRpc2Fzc29jaWF0aW9uIGZsb29kaW5nIiwJLyogSVdfRkxPT0RfRElTQVNTT0NfRVZFTlRfRkxBRyAqLworCSJkZXRlY3RlZCBkZWF1dGhlbnRpY2F0aW9uIGZsb29kaW5nIiwJLyogSVdfRkxPT0RfREVBVVRIX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgODAyLjF4IGVhcC1yZXF1ZXN0IGZsb29kaW5nIgkvKiBJV19GTE9PRF9FQVBfUkVRX0VWRU5UX0ZMQUcgKi8KK307CiAKIC8qIHRpbWVvdXQgLS0gbXMgKi8KLVZPSUQgUlRNUF9TZXRQZXJpb2RpY1RpbWVyKAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKLQlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit2b2lkIFJUTVBfU2V0UGVyaW9kaWNUaW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqIHBUaW1lciwKKwkJCSAgIElOIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKIHsKLQl0aW1lb3V0ID0gKCh0aW1lb3V0KkhaKSAvIDEwMDApOworCXRpbWVvdXQgPSAoKHRpbWVvdXQgKiBPU19IWikgLyAxMDAwKTsKIAlwVGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgdGltZW91dDsKIAlhZGRfdGltZXIocFRpbWVyKTsKIH0KIAogLyogY29udmVydCBOZGlzTUluaXRpYWxpemVUaW1lciAtLT4gUlRNUF9PU19Jbml0X1RpbWVyICovCi1WT0lEIFJUTVBfT1NfSW5pdF9UaW1lcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglORElTX01JTklQT1JUX1RJTUVSICpwVGltZXIsCi0JSU4JVElNRVJfRlVOQ1RJT04gZnVuY3Rpb24sCi0JSU4JUFZPSUQgZGF0YSkKK3ZvaWQgUlRNUF9PU19Jbml0X1RpbWVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXN0cnVjdCB0aW1lcl9saXN0ICogcFRpbWVyLAorCQkJSU4gVElNRVJfRlVOQ1RJT04gZnVuY3Rpb24sIHZvaWQgKmRhdGEpCiB7CiAJaW5pdF90aW1lcihwVGltZXIpOwotICAgIHBUaW1lci0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRhdGE7Ci0gICAgcFRpbWVyLT5mdW5jdGlvbiA9IGZ1bmN0aW9uOworCXBUaW1lci0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CisJcFRpbWVyLT5mdW5jdGlvbiA9IGZ1bmN0aW9uOwogfQogCi0KLVZPSUQgUlRNUF9PU19BZGRfVGltZXIoCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUgkJKnBUaW1lciwKLQlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit2b2lkIFJUTVBfT1NfQWRkX1RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICogcFRpbWVyLAorCQkgICAgICAgSU4gdW5zaWduZWQgbG9uZyB0aW1lb3V0KQogewogCWlmICh0aW1lcl9wZW5kaW5nKHBUaW1lcikpCiAJCXJldHVybjsKIAotCXRpbWVvdXQgPSAoKHRpbWVvdXQqSFopIC8gMTAwMCk7CisJdGltZW91dCA9ICgodGltZW91dCAqIE9TX0haKSAvIDEwMDApOwogCXBUaW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0OwogCWFkZF90aW1lcihwVGltZXIpOwogfQogCi1WT0lEIFJUTVBfT1NfTW9kX1RpbWVyKAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJCSpwVGltZXIsCi0JSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KQordm9pZCBSVE1QX09TX01vZF9UaW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqIHBUaW1lciwKKwkJICAgICAgIElOIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKIHsKLQl0aW1lb3V0ID0gKCh0aW1lb3V0KkhaKSAvIDEwMDApOworCXRpbWVvdXQgPSAoKHRpbWVvdXQgKiBPU19IWikgLyAxMDAwKTsKIAltb2RfdGltZXIocFRpbWVyLCBqaWZmaWVzICsgdGltZW91dCk7CiB9CiAKLVZPSUQgUlRNUF9PU19EZWxfVGltZXIoCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUgkJKnBUaW1lciwKLQlPVVQJQk9PTEVBTgkJCQkJKnBDYW5jZWxsZWQpCit2b2lkIFJUTVBfT1NfRGVsX1RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICogcFRpbWVyLAorCQkgICAgICAgT1VUIEJPT0xFQU4gKiBwQ2FuY2VsbGVkKQogewotCWlmICh0aW1lcl9wZW5kaW5nKHBUaW1lcikpCi0JeworCWlmICh0aW1lcl9wZW5kaW5nKHBUaW1lcikpIHsKIAkJKnBDYW5jZWxsZWQgPSBkZWxfdGltZXJfc3luYyhwVGltZXIpOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCSpwQ2FuY2VsbGVkID0gVFJVRTsKIAl9CiAKIH0KIAotVk9JRCBSVE1QX09TX1JlbGVhc2VfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVBRVUVVRV9FTlRSWSAgcEVudHJ5KQordm9pZCBSVE1QX09TX1JlbGVhc2VfUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICpwRW50cnkpCiB7Ci0JLy9SVE1QRnJlZU5kaXNQYWNrZXQocEFkLCAoc3RydWN0IHNrX2J1ZmYgKilwRW50cnkpOworCS8qUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgKHN0cnVjdCBza19idWZmICopcEVudHJ5KTsgKi8KIH0KIAotLy8gVW5pZnkgYWxsIGRlbGF5IHJvdXRpbmUgYnkgdXNpbmcgdWRlbGF5Ci1WT0lEIFJUTVB1c2VjRGVsYXkoCi0JSU4JVUxPTkcJdXNlYykKKy8qIFVuaWZ5IGFsbCBkZWxheSByb3V0aW5lIGJ5IHVzaW5nIHVkZWxheSAqLwordm9pZCBSVE1QdXNlY0RlbGF5KHVuc2lnbmVkIGxvbmcgdXNlYykKIHsKLQlVTE9ORwlpOworCXVuc2lnbmVkIGxvbmcgaTsKIAogCWZvciAoaSA9IDA7IGkgPCAodXNlYyAvIDUwKTsgaSsrKQogCQl1ZGVsYXkoNTApOwpAQCAtMTc5LDI4ICsxNDQsMjMgQEAKIAkJdWRlbGF5KHVzZWMgJSA1MCk7CiB9CiAKLXZvaWQgUlRNUF9HZXRDdXJyZW50U3lzdGVtVGltZShMQVJHRV9JTlRFR0VSICp0aW1lKQordm9pZCBSVE1QX0dldEN1cnJlbnRTeXN0ZW1UaW1lKExBUkdFX0lOVEVHRVIgKiB0aW1lKQogewogCXRpbWUtPnUuTG93UGFydCA9IGppZmZpZXM7CiB9CiAKLS8vIHBBZCBNVVNUIGFsbG93IHRvIGJlIE5VTEwKLU5ESVNfU1RBVFVTIG9zX2FsbG9jX21lbSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQJUFVDSEFSICptZW0sCi0JSU4JVUxPTkcgIHNpemUpCisvKiBwQWQgTVVTVCBhbGxvdyB0byBiZSBOVUxMICovCitpbnQgb3NfYWxsb2NfbWVtKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKiogbWVtLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0JKm1lbSA9IChQVUNIQVIpIGttYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CisJKm1lbSA9ICh1OCAqKWttYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CiAJaWYgKCptZW0pCiAJCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7CiAJZWxzZQogCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogfQogCi0vLyBwQWQgTVVTVCBhbGxvdyB0byBiZSBOVUxMCi1ORElTX1NUQVRVUyBvc19mcmVlX21lbSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglQVUNIQVIgbWVtKQorLyogcEFkIE1VU1QgYWxsb3cgdG8gYmUgTlVMTCAqLworaW50IG9zX2ZyZWVfbWVtKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqbWVtKQogewogCiAJQVNTRVJUKG1lbSk7CkBAIC0yMDgsNjYgKzE2OCw2NCBAQAogCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7CiB9CiAKK3ZvaWQgKlJ0bXBPU05ldFBrdEFsbG9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gaW50IHNpemUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkvKiBBZGQgMiBtb3JlIGJ5dGVzIGZvciBpcCBoZWFkZXIgYWxpZ25tZW50ICovCisJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplICsgMik7CiAKLVBORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgpCisJcmV0dXJuICgodm9pZCAqKXNrYik7Cit9CisKK3ZvaWQgKlJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBMZW5ndGgpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnBrdDsKIAogCXBrdCA9IGRldl9hbGxvY19za2IoTGVuZ3RoKTsKIAotCWlmIChwa3QgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNhbid0IGFsbG9jYXRlIGZyYWcgcnggJWxkIHNpemUgcGFja2V0XG4iLExlbmd0aCkpOworCWlmIChwa3QgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoImNhbid0IGFsbG9jYXRlIGZyYWcgcnggJWxkIHNpemUgcGFja2V0XG4iLCBMZW5ndGgpKTsKIAl9CiAKLQlpZiAocGt0KQotCXsKKwlpZiAocGt0KSB7CiAJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOwogCX0KIAotCXJldHVybiAoUE5ESVNfUEFDS0VUKSBwa3Q7CisJcmV0dXJuICh2b2lkICopcGt0OwogfQogCi0KLVBORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlVHhQYWNrZXRCdWZmZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MpCit2b2lkICpSVE1QX0FsbG9jYXRlVHhQYWNrZXRCdWZmZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkJCSBJTiBCT09MRUFOIENhY2hlZCwKKwkJCQkJIHZvaWQgKiogVmlydHVhbEFkZHJlc3MpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnBrdDsKIAogCXBrdCA9IGRldl9hbGxvY19za2IoTGVuZ3RoKTsKIAotCWlmIChwa3QgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNhbid0IGFsbG9jYXRlIHR4ICVsZCBzaXplIHBhY2tldFxuIixMZW5ndGgpKTsKKwlpZiAocGt0ID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJjYW4ndCBhbGxvY2F0ZSB0eCAlbGQgc2l6ZSBwYWNrZXRcbiIsIExlbmd0aCkpOwogCX0KIAotCWlmIChwa3QpCi0JeworCWlmIChwa3QpIHsKIAkJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShPU1BLVF9UT19SVFBLVChwa3QpLCBQS1RTUkNfTkRJUyk7Ci0JCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgcGt0LT5kYXRhOwotCX0KLQllbHNlCi0JewotCQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpIE5VTEw7CisJCSpWaXJ0dWFsQWRkcmVzcyA9ICh2b2lkICopcGt0LT5kYXRhOworCX0gZWxzZSB7CisJCSpWaXJ0dWFsQWRkcmVzcyA9ICh2b2lkICopTlVMTDsKIAl9CiAKLQlyZXR1cm4gKFBORElTX1BBQ0tFVCkgcGt0OworCXJldHVybiAodm9pZCAqKXBrdDsKIH0KIAotCi1WT0lEIGJ1aWxkX3R4X3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglQVUNIQVIJcEZyYW1lLAotCUlOCVVMT05HCUZyYW1lTGVuKQordm9pZCBidWlsZF90eF9wYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgIHZvaWQgKnBQYWNrZXQsCisJCSAgICAgdTggKnBGcmFtZSwgdW5zaWduZWQgbG9uZyBGcmFtZUxlbikKIHsKIAotCXN0cnVjdCBza19idWZmCSpwVHhQa3Q7CisJc3RydWN0IHNrX2J1ZmYgKnBUeFBrdDsKIAogCUFTU0VSVChwUGFja2V0KTsKIAlwVHhQa3QgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KTsKQEAgLTI3NSwzMiArMjMzLDM2IEBACiAJTmRpc01vdmVNZW1vcnkoc2tiX3B1dChwVHhQa3QsIEZyYW1lTGVuKSwgcEZyYW1lLCBGcmFtZUxlbik7CiB9CiAKLVZPSUQJUlRNUEZyZWVBZGFwdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVE1QRnJlZUFkYXB0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotICAgIFBPU19DT09LSUUgb3NfY29va2llOworCXN0cnVjdCBvc19jb29raWUgKm9zX2Nvb2tpZTsKIAlpbnQgaW5kZXg7CiAKLQlvc19jb29raWU9KFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7CisJb3NfY29va2llID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKIAotCWtmcmVlKHBBZC0+QmVhY29uQnVmKTsKLQorCWlmIChwQWQtPkJlYWNvbkJ1ZikKKwkJa2ZyZWUocEFkLT5CZWFjb25CdWYpOwogCiAJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOwotI2lmZGVmIFJUMjg2MAorCisjaWZkZWYgUlRNUF9NQUNfUENJCiAJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKLSNlbmRpZgotCWZvciAoaW5kZXggPTAgOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKQotCXsKLSAgICAJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5UeFN3UXVldWVMb2NrW2luZGV4XSk7CisjaWZkZWYgUlQzMDkwCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NY3VDbWRMb2NrKTsKKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKSB7CisJCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tpbmRleF0pOwogCQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkRlUXVldWVMb2NrW2luZGV4XSk7CiAJCXBBZC0+RGVRdWV1ZVJ1bm5pbmdbaW5kZXhdID0gRkFMU0U7CiAJfQogCiAJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5pcnFfbG9jayk7CiAKLQl2ZnJlZShwQWQpOyAvLyBwY2lfZnJlZV9jb25zaXN0ZW50KG9zX2Nvb2tpZS0+cGNpX2RldixzaXplb2YoUlRNUF9BREFQVEVSKSxwQWQsb3NfY29va2llLT5wQWRfcGEpOwotCWtmcmVlKG9zX2Nvb2tpZSk7CisJdmZyZWUocEFkKTsJCS8qIHBjaV9mcmVlX2NvbnNpc3RlbnQob3NfY29va2llLT5wY2lfZGV2LHNpemVvZihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyKSxwQWQsb3NfY29va2llLT5wQWRfcGEpOyAqLworCWlmIChvc19jb29raWUpCisJCWtmcmVlKG9zX2Nvb2tpZSk7CiB9CiAKIEJPT0xFQU4gT1NfTmVlZF9DbG9uZV9QYWNrZXQodm9pZCkKQEAgLTMwOCw4ICsyNzAsNiBAQAogCXJldHVybiAoRkFMU0UpOwogfQogCi0KLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMzE3LDcgKzI3Nyw3IEBACiAJCWNsb25lIGFuIGlucHV0IE5ESVMgUEFDS0VUIHRvIGFub3RoZXIgb25lLiBUaGUgbmV3IGludGVybmFsbHkgY3JlYXRlZCBORElTIFBBQ0tFVAogCQltdXN0IGhhdmUgb25seSBvbmUgTkRJUyBCVUZGRVIKIAkJcmV0dXJuIC0gYnl0ZSBjb3BpZWQuIDAgbWVhbnMgY2FuJ3QgY3JlYXRlIE5ESVMgUEFDS0VUCi0JCU5PVEU6IGludGVybmFsbHkgY3JlYXRlZCBORElTX1BBQ0tFVCBzaG91bGQgYmUgZGVzdHJveWVkIGJ5IFJUTVBGcmVlTmRpc1BhY2tldAorCQlOT1RFOiBpbnRlcm5hbGx5IGNyZWF0ZWQgY2hhciBzaG91bGQgYmUgZGVzdHJveWVkIGJ5IFJUTVBGcmVlTmRpc1BhY2tldAogCiAJQXJndW1lbnRzOgogCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKQEAgLTMzMiwxMSArMjkyLDEwIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1ORElTX1NUQVRVUyBSVE1QQ2xvbmVOZGlzUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCUJPT0xFQU4JCQlwSW5zQU1TRFVIZHIsCi0JSU4JUE5ESVNfUEFDS0VUCXBJblBhY2tldCwKLQlPVVQgUE5ESVNfUEFDS0VUICAgKnBwT3V0UGFja2V0KQoraW50IFJUTVBDbG9uZU5kaXNQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCUlOIEJPT0xFQU4gcEluc0FNU0RVSGRyLAorCQkJCXZvaWQgKnBJblBhY2tldCwKKwkJCQl2b2lkICoqIHBwT3V0UGFja2V0KQogewogCiAJc3RydWN0IHNrX2J1ZmYgKnBrdDsKQEAgLTM0NCwxOSArMzAzLDE4IEBACiAJQVNTRVJUKHBJblBhY2tldCk7CiAJQVNTRVJUKHBwT3V0UGFja2V0KTsKIAotCS8vIDEuIEFsbG9jYXRlIGEgcGFja2V0CisJLyogMS4gQWxsb2NhdGUgYSBwYWNrZXQgKi8KIAlwa3QgPSBkZXZfYWxsb2Nfc2tiKDIwNDgpOwogCi0JaWYgKHBrdCA9PSBOVUxMKQotCXsKKwlpZiAocGt0ID09IE5VTEwpIHsKIAkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CiAJfQogCi0gCXNrYl9wdXQocGt0LCBHRVRfT1NfUEtUX0xFTihwSW5QYWNrZXQpKTsKLQlOZGlzTW92ZU1lbW9yeShwa3QtPmRhdGEsIEdFVF9PU19QS1RfREFUQVBUUihwSW5QYWNrZXQpLCBHRVRfT1NfUEtUX0xFTihwSW5QYWNrZXQpKTsKKwlza2JfcHV0KHBrdCwgR0VUX09TX1BLVF9MRU4ocEluUGFja2V0KSk7CisJTmRpc01vdmVNZW1vcnkocGt0LT5kYXRhLCBHRVRfT1NfUEtUX0RBVEFQVFIocEluUGFja2V0KSwKKwkJICAgICAgIEdFVF9PU19QS1RfTEVOKHBJblBhY2tldCkpOwogCSpwcE91dFBhY2tldCA9IE9TUEtUX1RPX1JUUEtUKHBrdCk7CiAKLQogCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOwogCiAJcHJpbnRrKCIjIyNDbG9uZSMjI1xuIik7CkBAIC0zNjQsNDIgKzMyMiw0MCBAQAogCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwogfQogCi0KLS8vIHRoZSBhbGxvY2F0ZWQgTkRJUyBQQUNLRVQgbXVzdCBiZSBmcmVlZCB2aWEgUlRNUEZyZWVOZGlzUGFja2V0KCkKLU5ESVNfU1RBVFVTIFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUIFBORElTX1BBQ0tFVCAgICpwcFBhY2tldCwKLQlJTglQVUNIQVIJCQlwSGVhZGVyLAotCUlOCVVJTlQJCQlIZWFkZXJMZW4sCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVUlOVAkJCURhdGFMZW4pCisvKiB0aGUgYWxsb2NhdGVkIE5ESVMgUEFDS0VUIG11c3QgYmUgZnJlZWQgdmlhIFJUTVBGcmVlTmRpc1BhY2tldCgpICovCitpbnQgUlRNUEFsbG9jYXRlTmRpc1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgdm9pZCAqKiBwcFBhY2tldCwKKwkJCQkgICB1OCAqcEhlYWRlciwKKwkJCQkgICB1MzIgSGVhZGVyTGVuLAorCQkJCSAgIHU4ICpwRGF0YSwgdTMyIERhdGFMZW4pCiB7Ci0JUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJdm9pZCAqcFBhY2tldDsKIAlBU1NFUlQocERhdGEpOwogCUFTU0VSVChEYXRhTGVuKTsKIAotCS8vIDEuIEFsbG9jYXRlIGEgcGFja2V0Ci0JcFBhY2tldCA9IChQTkRJU19QQUNLRVQgKikgZGV2X2FsbG9jX3NrYihIZWFkZXJMZW4gKyBEYXRhTGVuICsgVFhQQURESU5HX1NJWkUpOwotCWlmIChwUGFja2V0ID09IE5VTEwpCi0gCXsKKwkvKiAxLiBBbGxvY2F0ZSBhIHBhY2tldCAqLworCXBQYWNrZXQgPQorCSAgICAodm9pZCAqKikgZGV2X2FsbG9jX3NrYihIZWFkZXJMZW4gKyBEYXRhTGVuICsKKwkJCQkJICAgUlRNUF9QS1RfVEFJTF9QQURESU5HKTsKKwlpZiAocFBhY2tldCA9PSBOVUxMKSB7CiAJCSpwcFBhY2tldCA9IE5VTEw7CiAjaWZkZWYgREVCVUcKLQkJcHJpbnRrKCJSVE1QQWxsb2NhdGVOZGlzUGFja2V0IEZhaWxcblxuIik7CisJCXByaW50aygiUlRNUEFsbG9jYXRlTmRpc1BhY2tldCBGYWlsXG4iKTsKICNlbmRpZgogCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKIAl9Ci0KLQkvLyAyLiBjbG9uZSB0aGUgZnJhbWUgY29udGVudAorCS8qIDIuIGNsb25lIHRoZSBmcmFtZSBjb250ZW50ICovCiAJaWYgKEhlYWRlckxlbiA+IDApCiAJCU5kaXNNb3ZlTWVtb3J5KEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KSwgcEhlYWRlciwgSGVhZGVyTGVuKTsKIAlpZiAoRGF0YUxlbiA+IDApCi0JCU5kaXNNb3ZlTWVtb3J5KEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KSArIEhlYWRlckxlbiwgcERhdGEsIERhdGFMZW4pOworCQlOZGlzTW92ZU1lbW9yeShHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCkgKyBIZWFkZXJMZW4sIHBEYXRhLAorCQkJICAgICAgIERhdGFMZW4pOwogCi0JLy8gMy4gdXBkYXRlIGxlbmd0aCBvZiBwYWNrZXQKLSAJc2tiX3B1dChHRVRfT1NfUEtUX1RZUEUocFBhY2tldCksIEhlYWRlckxlbitEYXRhTGVuKTsKKwkvKiAzLiB1cGRhdGUgbGVuZ3RoIG9mIHBhY2tldCAqLworCXNrYl9wdXQoR0VUX09TX1BLVF9UWVBFKHBQYWNrZXQpLCBIZWFkZXJMZW4gKyBEYXRhTGVuKTsKIAogCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFBhY2tldCwgUEtUU1JDX05ESVMpOwotLy8JcHJpbnRrKCIlcyA6IHBQYWNrZXQgPSAlcCwgbGVuID0gJWRcbiIsIF9fZnVuY19fLCBwUGFja2V0LCBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSk7CisvKiAgICAgIHByaW50aygiJXMgOiBwUGFja2V0ID0gJXAsIGxlbiA9ICVkXG4iLCBfX2Z1bmNfXywgcFBhY2tldCwgR0VUX09TX1BLVF9MRU4ocFBhY2tldCkpOyAqLwogCSpwcFBhY2tldCA9IHBQYWNrZXQ7CiAJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC00MDcsNDIgKzM2MywzNCBAQAogLyoKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIERlc2NyaXB0aW9uOgotCVRoaXMgcm91dGluZSBmcmVlcyBhIG1pbmlwb3J0IGludGVybmFsbHkgYWxsb2NhdGVkIE5ESVNfUEFDS0VUIGFuZCBpdHMKKwlUaGlzIHJvdXRpbmUgZnJlZXMgYSBtaW5pcG9ydCBpbnRlcm5hbGx5IGFsbG9jYXRlZCBjaGFyIGFuZCBpdHMKIAljb3JyZXNwb25kaW5nIE5ESVNfQlVGRkVSIGFuZCBhbGxvY2F0ZWQgbWVtb3J5LgogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIFJUTVBGcmVlTmRpc1BhY2tldCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQTkRJU19QQUNLRVQgIHBQYWNrZXQpCit2b2lkIFJUTVBGcmVlTmRpc1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHZvaWQgKnBQYWNrZXQpCiB7CiAJZGV2X2tmcmVlX3NrYl9hbnkoUlRQS1RfVE9fT1NQS1QocFBhY2tldCkpOwogfQogCi0KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotLy8gTk9URTogd2UgZG8gaGF2ZSBhbiBhc3N1bXB0aW9uIGhlcmUsIHRoYXQgQnl0ZTAgYW5kIEJ5dGUxIGFsd2F5cyByZWFzaWQgYXQgdGhlIHNhbWUKLS8vCQkJIHNjYXR0ZXIgZ2F0aGVyIGJ1ZmZlcgotTkRJU19TVEFUVVMgU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcigKLQlJTglQTkRJU19CVUZGRVIJcEZpcnN0QnVmZmVyLAotCUlOCVVDSEFSCQkJRGVzaXJlZE9mZnNldCwKLQlPVVQgUFVDSEFSCQkJcEJ5dGUwLAotCU9VVCBQVUNIQVIJCQlwQnl0ZTEpCisvKiBJUlFMID0gRElTUEFUQ0hfTEVWRUwgKi8KKy8qIE5PVEU6IHdlIGRvIGhhdmUgYW4gYXNzdW1wdGlvbiBoZXJlLCB0aGF0IEJ5dGUwIGFuZCBCeXRlMSBhbHdheXMgcmVhc2lkIGF0IHRoZSBzYW1lICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgc2NhdHRlciBnYXRoZXIgYnVmZmVyICovCitpbnQgU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihjaGFyICpwRmlyc3RCdWZmZXIsCisJCQkJICAgICAgdTggRGVzaXJlZE9mZnNldCwKKwkJCQkgICAgICB1OCAqcEJ5dGUwLCB1OCAqcEJ5dGUxKQogewotICAgICpwQnl0ZTAgPSAqKFBVQ0hBUikocEZpcnN0QnVmZmVyICsgRGVzaXJlZE9mZnNldCk7Ci0gICAgKnBCeXRlMSA9ICooUFVDSEFSKShwRmlyc3RCdWZmZXIgKyBEZXNpcmVkT2Zmc2V0ICsgMSk7CisJKnBCeXRlMCA9ICoodTggKikocEZpcnN0QnVmZmVyICsgRGVzaXJlZE9mZnNldCk7CisJKnBCeXRlMSA9ICoodTggKikocEZpcnN0QnVmZmVyICsgRGVzaXJlZE9mZnNldCArIDEpOwogCiAJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQotdm9pZCBSVE1QX1F1ZXJ5UGFja2V0SW5mbygKLQlJTiAgUE5ESVNfUEFDS0VUIHBQYWNrZXQsCi0JT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCi0JT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCi0JT1VUCVVJTlQJCSAqcFNyY0J1ZkxlbikKK3ZvaWQgUlRNUF9RdWVyeVBhY2tldEluZm8odm9pZCAqcFBhY2tldCwKKwkJCSAgc3RydWN0IHJ0X3BhY2tldF9pbmZvICpwUGFja2V0SW5mbywKKwkJCSAgdTggKiogcFNyY0J1ZlZBLCB1MzIgKiBwU3JjQnVmTGVuKQogewogCXBQYWNrZXRJbmZvLT5CdWZmZXJDb3VudCA9IDE7Ci0JcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwlwUGFja2V0SW5mby0+cEZpcnN0QnVmZmVyID0gKGNoYXIgKilHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CiAJcFBhY2tldEluZm8tPlBoeXNpY2FsQnVmZmVyQ291bnQgPSAxOwogCXBQYWNrZXRJbmZvLT5Ub3RhbFBhY2tldExlbmd0aCA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwogCkBAIC00NTAsMzAgKzM5OCwyNiBAQAogCSpwU3JjQnVmTGVuID0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CiB9CiAKLXZvaWQgUlRNUF9RdWVyeU5leHRQYWNrZXRJbmZvKAotCUlOICBQTkRJU19QQUNLRVQgKnBwUGFja2V0LAotCU9VVCBQQUNLRVRfSU5GTyAgKnBQYWNrZXRJbmZvLAotCU9VVCBQVUNIQVIJCSAqcFNyY0J1ZlZBLAotCU9VVAlVSU5UCQkgKnBTcmNCdWZMZW4pCit2b2lkIFJUTVBfUXVlcnlOZXh0UGFja2V0SW5mbyh2b2lkICoqIHBwUGFja2V0LAorCQkJICAgICAgc3RydWN0IHJ0X3BhY2tldF9pbmZvICpwUGFja2V0SW5mbywKKwkJCSAgICAgIHU4ICoqIHBTcmNCdWZWQSwgdTMyICogcFNyY0J1ZkxlbikKIHsKLQlQTkRJU19QQUNLRVQgcFBhY2tldCA9IE5VTEw7CisJdm9pZCAqcFBhY2tldCA9IE5VTEw7CiAKIAlpZiAoKnBwUGFja2V0KQogCQlwUGFja2V0ID0gR0VUX09TX1BLVF9ORVhUKCpwcFBhY2tldCk7CiAKLQlpZiAocFBhY2tldCkKLQl7CisJaWYgKHBQYWNrZXQpIHsKIAkJcFBhY2tldEluZm8tPkJ1ZmZlckNvdW50ID0gMTsKLQkJcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwkJcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9CisJCSAgICAoY2hhciAqKUdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKIAkJcFBhY2tldEluZm8tPlBoeXNpY2FsQnVmZmVyQ291bnQgPSAxOwogCQlwUGFja2V0SW5mby0+VG90YWxQYWNrZXRMZW5ndGggPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKIAogCQkqcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwogCQkqcFNyY0J1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwogCQkqcHBQYWNrZXQgPSBHRVRfT1NfUEtUX05FWFQocFBhY2tldCk7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJcFBhY2tldEluZm8tPkJ1ZmZlckNvdW50ID0gMDsKIAkJcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9IE5VTEw7CiAJCXBQYWNrZXRJbmZvLT5QaHlzaWNhbEJ1ZmZlckNvdW50ID0gMDsKQEAgLTQ4NSwzNiArNDI5LDE5IEBACiAJfQogfQogCi0vLyBub3QgeWV0IHN1cHBvcnQgTUJTUwotUE5FVF9ERVYgZ2V0X25ldGRldl9mcm9tX2Jzc2lkKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit2b2lkICpEdXBsaWNhdGVQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB2b2lkICpwUGFja2V0LCB1OCBGcm9tV2hpY2hCU1NJRCkKIHsKLSAgICBQTkVUX0RFViBkZXZfcCA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl2b2lkICpwUmV0UGFja2V0ID0gTlVMTDsKKwl1MTYgRGF0YVNpemU7CisJdTggKnBEYXRhOwogCi0JZGV2X3AgPSBwQWQtPm5ldF9kZXY7Ci0KLQlBU1NFUlQoZGV2X3ApOwotCXJldHVybiBkZXZfcDsgLyogcmV0dXJuIG9uZSBvZiBNQlNTICovCi19Ci0KLVBORElTX1BBQ0tFVCBEdXBsaWNhdGVQYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOwotCVBORElTX1BBQ0tFVAlwUmV0UGFja2V0ID0gTlVMTDsKLQlVU0hPUlQJCQlEYXRhU2l6ZTsKLQlVQ0hBUgkJCSpwRGF0YTsKLQotCURhdGFTaXplID0gKFVTSE9SVCkgR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7Ci0JcERhdGEgPSAoUFVDSEFSKSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7Ci0KKwlEYXRhU2l6ZSA9ICh1MTYpR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisJcERhdGEgPSAodTggKilHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CiAKIAlza2IgPSBza2JfY2xvbmUoUlRQS1RfVE9fT1NQS1QocFBhY2tldCksIE1FTV9BTExPQ19GTEFHKTsKLQlpZiAoc2tiKQotCXsKKwlpZiAoc2tiKSB7CiAJCXNrYi0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpOwogCQlwUmV0UGFja2V0ID0gT1NQS1RfVE9fUlRQS1Qoc2tiKTsKIAl9CkBAIC01MjMsMjQgKzQ1MCwyMSBAQAogCiB9CiAKLVBORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKLSAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURhdGFTaXplLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit2b2lkICpkdXBsaWNhdGVfcGt0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHU4ICpwSGVhZGVyODAyXzMsCisJCQkgICB1MzIgSGRyTGVuLAorCQkJICAgdTggKnBEYXRhLAorCQkJICAgdW5zaWduZWQgbG9uZyBEYXRhU2l6ZSwgdTggRnJvbVdoaWNoQlNTSUQpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYJKnNrYjsKLQlQTkRJU19QQUNLRVQJcFBhY2tldCA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl2b2lkICpwUGFja2V0ID0gTlVMTDsKIAotCi0JaWYgKChza2IgPSBfX2Rldl9hbGxvY19za2IoSGRyTGVuICsgRGF0YVNpemUgKyAyLCBNRU1fQUxMT0NfRkxBRykpICE9IE5VTEwpCi0JeworCWlmICgoc2tiID0KKwkgICAgIF9fZGV2X2FsbG9jX3NrYihIZHJMZW4gKyBEYXRhU2l6ZSArIDIsIE1FTV9BTExPQ19GTEFHKSkgIT0gTlVMTCkgewogCQlza2JfcmVzZXJ2ZShza2IsIDIpOwotCQlOZGlzTW92ZU1lbW9yeShza2JfdGFpbF9wb2ludGVyKHNrYiksIHBIZWFkZXI4MDJfMywgSGRyTGVuKTsKKwkJTmRpc01vdmVNZW1vcnkoc2tiLT50YWlsLCBwSGVhZGVyODAyXzMsIEhkckxlbik7CiAJCXNrYl9wdXQoc2tiLCBIZHJMZW4pOwotCQlOZGlzTW92ZU1lbW9yeShza2JfdGFpbF9wb2ludGVyKHNrYiksIHBEYXRhLCBEYXRhU2l6ZSk7CisJCU5kaXNNb3ZlTWVtb3J5KHNrYi0+dGFpbCwgcERhdGEsIERhdGFTaXplKTsKIAkJc2tiX3B1dChza2IsIERhdGFTaXplKTsKIAkJc2tiLT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CiAJCXBQYWNrZXQgPSBPU1BLVF9UT19SVFBLVChza2IpOwpAQCAtNTQ5LDI0ICs0NzMsMjIgQEAKIAlyZXR1cm4gcFBhY2tldDsKIH0KIAotCiAjZGVmaW5lIFRLSVBfVFhfTUlDX1NJWkUJCTgKLVBORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit2b2lkICpkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgdm9pZCAqcFBhY2tldCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZgkqc2tiLCAqbmV3c2tiOwotCisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5ld3NrYjsKIAogCXNrYiA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOwotCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IFRLSVBfVFhfTUlDX1NJWkUpCi0JewotCQkvLyBhbGxvYyBhIG5ldyBza2IgYW5kIGNvcHkgdGhlIHBhY2tldAotCQluZXdza2IgPSBza2JfY29weV9leHBhbmQoc2tiLCBza2JfaGVhZHJvb20oc2tiKSwgVEtJUF9UWF9NSUNfU0laRSwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYl90YWlscm9vbShza2IpIDwgVEtJUF9UWF9NSUNfU0laRSkgeworCQkvKiBhbGxvYyBhIG5ldyBza2IgYW5kIGNvcHkgdGhlIHBhY2tldCAqLworCQluZXdza2IgPQorCQkgICAgc2tiX2NvcHlfZXhwYW5kKHNrYiwgc2tiX2hlYWRyb29tKHNrYiksIFRLSVBfVFhfTUlDX1NJWkUsCisJCQkJICAgIEdGUF9BVE9NSUMpOwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQlpZiAobmV3c2tiID09IE5VTEwpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkV4dGVuZCBUeC5NSUMgZm9yIHBhY2tldCBmYWlsZWQhLCBkcm9wcGluZyBwYWNrZXQhXG4iKSk7CisJCWlmIChuZXdza2IgPT0gTlVMTCkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiRXh0ZW5kIFR4Lk1JQyBmb3IgcGFja2V0IGZhaWxlZCEsIGRyb3BwaW5nIHBhY2tldCFcbiIpKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCXNrYiA9IG5ld3NrYjsKQEAgLTU3NSw0NSArNDk3LDM3IEBACiAJcmV0dXJuIE9TUEtUX1RPX1JUUEtUKHNrYik7CiB9CiAKLQotCi0KLVBORElTX1BBQ0tFVCBDbG9uZVBhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURhdGFTaXplKQordm9pZCAqQ2xvbmVQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHZvaWQgKnBQYWNrZXQsCisJCQkgdTggKnBEYXRhLCB1bnNpZ25lZCBsb25nIERhdGFTaXplKQogewotCXN0cnVjdCBza19idWZmCSpwUnhQa3Q7Ci0Jc3RydWN0IHNrX2J1ZmYJKnBDbG9uZWRQa3Q7CisJc3RydWN0IHNrX2J1ZmYgKnBSeFBrdDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcENsb25lZFBrdDsKIAogCUFTU0VSVChwUGFja2V0KTsKIAlwUnhQa3QgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KTsKIAotCS8vIGNsb25lIHRoZSBwYWNrZXQKKwkvKiBjbG9uZSB0aGUgcGFja2V0ICovCiAJcENsb25lZFBrdCA9IHNrYl9jbG9uZShwUnhQa3QsIE1FTV9BTExPQ19GTEFHKTsKIAotCWlmIChwQ2xvbmVkUGt0KQotCXsKLSAgICAJLy8gc2V0IHRoZSBjb3JyZWN0IGRhdGFwdHIgYW5kIGRhdGEgbGVuCi0gICAgCXBDbG9uZWRQa3QtPmRldiA9IHBSeFBrdC0+ZGV2OwotICAgIAlwQ2xvbmVkUGt0LT5kYXRhID0gcERhdGE7Ci0gICAgCXBDbG9uZWRQa3QtPmxlbiA9IERhdGFTaXplOwotICAgIAlwQ2xvbmVkUGt0LT50YWlsID0gcENsb25lZFBrdC0+ZGF0YSArIHBDbG9uZWRQa3QtPmxlbjsKKwlpZiAocENsb25lZFBrdCkgeworCQkvKiBzZXQgdGhlIGNvcnJlY3QgZGF0YXB0ciBhbmQgZGF0YSBsZW4gKi8KKwkJcENsb25lZFBrdC0+ZGV2ID0gcFJ4UGt0LT5kZXY7CisJCXBDbG9uZWRQa3QtPmRhdGEgPSBwRGF0YTsKKwkJcENsb25lZFBrdC0+bGVuID0gRGF0YVNpemU7CisJCXBDbG9uZWRQa3QtPnRhaWwgPSBwQ2xvbmVkUGt0LT5kYXRhICsgcENsb25lZFBrdC0+bGVuOwogCQlBU1NFUlQoRGF0YVNpemUgPCAxNTMwKTsKIAl9CiAJcmV0dXJuIHBDbG9uZWRQa3Q7CiB9CiAKLS8vCi0vLyBjaGFuZ2UgT1MgcGFja2V0IERhdGFQdHIgYW5kIERhdGFMZW4KLS8vCi12b2lkICB1cGRhdGVfb3NfcGFja2V0X2luZm8oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKKy8qICovCisvKiBjaGFuZ2UgT1MgcGFja2V0IERhdGFQdHIgYW5kIERhdGFMZW4gKi8KKy8qICovCit2b2lkIHVwZGF0ZV9vc19wYWNrZXRfaW5mbyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGssIHU4IEZyb21XaGljaEJTU0lEKQogewotCXN0cnVjdCBza19idWZmCSpwT1NQa3Q7CisJc3RydWN0IHNrX2J1ZmYgKnBPU1BrdDsKIAogCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7CiAJcE9TUGt0ID0gUlRQS1RfVE9fT1NQS1QocFJ4QmxrLT5wUnhQYWNrZXQpOwpAQCAtNjI0LDE0ICs1MzgsMTIgQEAKIAlwT1NQa3QtPnRhaWwgPSBwT1NQa3QtPmRhdGEgKyBwT1NQa3QtPmxlbjsKIH0KIAotCi12b2lkIHdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKLQlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3ZvaWQgd2xhbl84MDJfMTFfdG9fODAyXzNfcGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLAorCQkJCSB1OCAqcEhlYWRlcjgwMl8zLAorCQkJCSB1OCBGcm9tV2hpY2hCU1NJRCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZgkqcE9TUGt0OworCXN0cnVjdCBza19idWZmICpwT1NQa3Q7CiAKIAlBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOwogCUFTU0VSVChwSGVhZGVyODAyXzMpOwpAQCAtNjQzLDM3ICs1NTUsMzUgQEAKIAlwT1NQa3QtPmxlbiA9IHBSeEJsay0+RGF0YVNpemU7CiAJcE9TUGt0LT50YWlsID0gcE9TUGt0LT5kYXRhICsgcE9TUGt0LT5sZW47CiAKLQkvLwotCS8vIGNvcHkgODAyLjMgaGVhZGVyCi0JLy8KLQkvLworCS8qICovCisJLyogY29weSA4MDIuMyBoZWFkZXIgKi8KKwkvKiAqLworCS8qICovCiAKLQlOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwT1NQa3QsIExFTkdUSF84MDJfMyksIHBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zKTsKKwlOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwT1NQa3QsIExFTkdUSF84MDJfMyksIHBIZWFkZXI4MDJfMywKKwkJICAgICAgIExFTkdUSF84MDJfMyk7CiB9CiAKLXZvaWQgYW5ub3VuY2VfODAyXzNfcGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQordm9pZCBhbm5vdW5jZV84MDJfM19wYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICpwUGFja2V0KQogewogCi0Jc3RydWN0IHNrX2J1ZmYJKnBSeFBrdDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcFJ4UGt0OwogCiAJQVNTRVJUKHBQYWNrZXQpOwogCiAJcFJ4UGt0ID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCk7CiAKLSAgICAvKiBQdXNoIHVwIHRoZSBwcm90b2NvbCBzdGFjayAqLworCS8qIFB1c2ggdXAgdGhlIHByb3RvY29sIHN0YWNrICovCiAJcFJ4UGt0LT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBSeFBrdCwgcFJ4UGt0LT5kZXYpOwogCiAJbmV0aWZfcngocFJ4UGt0KTsKIH0KIAotCi1QUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUCi1ydF9nZXRfc2dfbGlzdF9mcm9tX3BhY2tldChQTkRJU19QQUNLRVQgcFBhY2tldCwgUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUICpzZykKK3N0cnVjdCBydF9ydG1wX3NnX2xpc3QgKgorcnRfZ2V0X3NnX2xpc3RfZnJvbV9wYWNrZXQodm9pZCAqcFBhY2tldCwgc3RydWN0IHJ0X3J0bXBfc2dfbGlzdCAqc2cpCiB7CiAJc2ctPk51bWJlck9mRWxlbWVudHMgPSAxOwotCXNnLT5FbGVtZW50c1swXS5BZGRyZXNzID0gIEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwlzZy0+RWxlbWVudHNbMF0uQWRkcmVzcyA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKIAlzZy0+RWxlbWVudHNbMF0uTGVuZ3RoID0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CiAJcmV0dXJuIChzZyk7CiB9CkBAIC02ODcsMTMgKzU5NywxMyBAQAogCQlyZXR1cm47CiAKIAlwdCA9IHBTcmNCdWZWQTsKLQlwcmludGsoIiVzOiAlcCwgbGVuID0gJWRcbiIsc3RyLCAgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pOwotCWZvciAoeD0wOyB4PFNyY0J1ZkxlbjsgeCsrKQotCXsKKwlwcmludGsoIiVzOiAlcCwgbGVuID0gJWRcbiIsIHN0ciwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pOworCWZvciAoeCA9IDA7IHggPCBTcmNCdWZMZW47IHgrKykgewogCQlpZiAoeCAlIDE2ID09IDApCiAJCQlwcmludGsoIjB4JTA0eCA6ICIsIHgpOwogCQlwcmludGsoIiUwMnggIiwgKCh1bnNpZ25lZCBjaGFyKXB0W3hdKSk7Ci0JCWlmICh4JTE2ID09IDE1KSBwcmludGsoIlxuIik7CisJCWlmICh4ICUgMTYgPT0gMTUpCisJCQlwcmludGsoIlxuIik7CiAJfQogCXByaW50aygiXG4iKTsKIH0KQEAgLTcxOCwxODcgKzYyOCwxOTcgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgUlRNUFNlbmRXaXJlbGVzc0V2ZW50KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCUV2ZW50X2ZsYWcsCi0JSU4JUFVDSEFSIAkJCXBBZGRyLAotCUlOCVVDSEFSCQkJQnNzSWR4LAotCUlOCUNIQVIJCQlSc3NpKQordm9pZCBSVE1QU2VuZFdpcmVsZXNzRXZlbnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdTE2IEV2ZW50X2ZsYWcsCisJCQkgICB1OCAqcEFkZHIsIHU4IEJzc0lkeCwgY2hhciBSc3NpKQogewogCi0JdW5pb24gCWl3cmVxX2RhdGEgICAgICB3cnF1OwotCVBVQ0hBUiAJcEJ1ZiA9IE5VTEwsIHBCdWZQdHIgPSBOVUxMOwotCVVTSE9SVAlldmVudCwgdHlwZSwgQnVmTGVuOwotCVVDSEFSCWV2ZW50X3RhYmxlX2xlbiA9IDA7CisJLyp1bmlvbiAgICAgICAgIGl3cmVxX2RhdGEgICAgICB3cnF1OyAqLworCWNoYXIgKnBCdWYgPSBOVUxMLCAqcEJ1ZlB0ciA9IE5VTEw7CisJdTE2IGV2ZW50LCB0eXBlLCBCdWZMZW47CisJdTggZXZlbnRfdGFibGVfbGVuID0gMDsKIAogCXR5cGUgPSBFdmVudF9mbGFnICYgMHhGRjAwOwogCWV2ZW50ID0gRXZlbnRfZmxhZyAmIDB4MDBGRjsKIAotCXN3aXRjaCAodHlwZSkKLQl7Ci0JCWNhc2UgSVdfU1lTX0VWRU5UX0ZMQUdfU1RBUlQ6Ci0JCQlldmVudF90YWJsZV9sZW4gPSBJV19TWVNfRVZFTlRfVFlQRV9OVU07Ci0JCQlicmVhazsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElXX1NZU19FVkVOVF9GTEFHX1NUQVJUOgorCQlldmVudF90YWJsZV9sZW4gPSBJV19TWVNfRVZFTlRfVFlQRV9OVU07CisJCWJyZWFrOwogCi0JCWNhc2UgSVdfU1BPT0ZfRVZFTlRfRkxBR19TVEFSVDoKLQkJCWV2ZW50X3RhYmxlX2xlbiA9IElXX1NQT09GX0VWRU5UX1RZUEVfTlVNOwotCQkJYnJlYWs7CisJY2FzZSBJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUOgorCQlldmVudF90YWJsZV9sZW4gPSBJV19TUE9PRl9FVkVOVF9UWVBFX05VTTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUOgotCQkJZXZlbnRfdGFibGVfbGVuID0gSVdfRkxPT0RfRVZFTlRfVFlQRV9OVU07Ci0JCQlicmVhazsKKwljYXNlIElXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQ6CisJCWV2ZW50X3RhYmxlX2xlbiA9IElXX0ZMT09EX0VWRU5UX1RZUEVfTlVNOworCQlicmVhazsKIAl9CiAKLQlpZiAoZXZlbnRfdGFibGVfbGVuID09IDApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFRoZSB0eXBlKCUweDAyeCkgaXMgbm90IHZhbGlkLlxuIiwgX19mdW5jX18sIHR5cGUpKTsKKwlpZiAoZXZlbnRfdGFibGVfbGVuID09IDApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIlcyA6IFRoZSB0eXBlKCUweDAyeCkgaXMgbm90IHZhbGlkLlxuIiwgX19mdW5jX18sCisJCQkgIHR5cGUpKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChldmVudCA+PSBldmVudF90YWJsZV9sZW4pCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFRoZSBldmVudCglMHgwMngpIGlzIG5vdCB2YWxpZC5cbiIsIF9fZnVuY19fLCBldmVudCkpOworCWlmIChldmVudCA+PSBldmVudF90YWJsZV9sZW4pIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIlcyA6IFRoZSBldmVudCglMHgwMngpIGlzIG5vdCB2YWxpZC5cbiIsIF9fZnVuY19fLAorCQkJICBldmVudCkpOwogCQlyZXR1cm47CiAJfQotCi0JLy9BbGxvY2F0ZSBtZW1vcnkgYW5kIGNvcHkgdGhlIG1zZy4KLQlpZigocEJ1ZiA9IGttYWxsb2MoSVdfQ1VTVE9NX01BWF9MRU4sIEdGUF9BVE9NSUMpKSAhPSBOVUxMKQotCXsKLQkJLy9QcmVwYXJlIHRoZSBwYXlsb2FkCisJLypBbGxvY2F0ZSBtZW1vcnkgYW5kIGNvcHkgdGhlIG1zZy4gKi8KKwlpZiAoKHBCdWYgPSBrbWFsbG9jKElXX0NVU1RPTV9NQVhfTEVOLCBHRlBfQVRPTUlDKSkgIT0gTlVMTCkgeworCQkvKlByZXBhcmUgdGhlIHBheWxvYWQgKi8KIAkJbWVtc2V0KHBCdWYsIDAsIElXX0NVU1RPTV9NQVhfTEVOKTsKIAogCQlwQnVmUHRyID0gcEJ1ZjsKIAogCQlpZiAocEFkZHIpCi0JCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIihSVDI4NjApIFNUQSglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCkgIiwgUFJJTlRfTUFDKHBBZGRyKSk7CisJCQlwQnVmUHRyICs9CisJCQkgICAgc3ByaW50ZihwQnVmUHRyLAorCQkJCSAgICAiKFJUMjg2MCkgU1RBKCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KSAiLAorCQkJCSAgICBQUklOVF9NQUMocEFkZHIpKTsKIAkJZWxzZSBpZiAoQnNzSWR4IDwgTUFYX01CU1NJRF9OVU0pCi0JCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIihSVDI4NjApIEJTUyh3bGFuJWQpICIsIEJzc0lkeCk7CisJCQlwQnVmUHRyICs9CisJCQkgICAgc3ByaW50ZihwQnVmUHRyLCAiKFJUMjg2MCkgQlNTKHdsYW4lZCkgIiwgQnNzSWR4KTsKIAkJZWxzZQogCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSAiKTsKIAogCQlpZiAodHlwZSA9PSBJV19TWVNfRVZFTlRfRkxBR19TVEFSVCkKLQkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiJXMiLCBwV2lyZWxlc3NTeXNFdmVudFRleHRbZXZlbnRdKTsKKwkJCXBCdWZQdHIgKz0KKwkJCSAgICBzcHJpbnRmKHBCdWZQdHIsICIlcyIsCisJCQkJICAgIHBXaXJlbGVzc1N5c0V2ZW50VGV4dFtldmVudF0pOwogCQllbHNlIGlmICh0eXBlID09IElXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQpCi0JCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIiVzIChSU1NJPSVkKSIsIHBXaXJlbGVzc1Nwb29mRXZlbnRUZXh0W2V2ZW50XSwgUnNzaSk7CisJCQlwQnVmUHRyICs9CisJCQkgICAgc3ByaW50ZihwQnVmUHRyLCAiJXMgKFJTU0k9JWQpIiwKKwkJCQkgICAgcFdpcmVsZXNzU3Bvb2ZFdmVudFRleHRbZXZlbnRdLCBSc3NpKTsKIAkJZWxzZSBpZiAodHlwZSA9PSBJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUKQotCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyIsIHBXaXJlbGVzc0Zsb29kRXZlbnRUZXh0W2V2ZW50XSk7CisJCQlwQnVmUHRyICs9CisJCQkgICAgc3ByaW50ZihwQnVmUHRyLCAiJXMiLAorCQkJCSAgICBwV2lyZWxlc3NGbG9vZEV2ZW50VGV4dFtldmVudF0pOwogCQllbHNlCiAJCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIiVzIiwgInVua25vd24gZXZlbnQiKTsKIAogCQlwQnVmUHRyW3BCdWZQdHIgLSBwQnVmXSA9ICdcMCc7CiAJCUJ1ZkxlbiA9IHBCdWZQdHIgLSBwQnVmOwogCi0JCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKLQkgICAgd3JxdS5kYXRhLmZsYWdzID0gRXZlbnRfZmxhZzsKLQkJd3JxdS5kYXRhLmxlbmd0aCA9IEJ1ZkxlbjsKLQotCQkvL3NlbmQgd2lyZWxlc3MgZXZlbnQKLQkgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBwQnVmKTsKLQotCQkvL0RCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIDogJXNcbiIsIF9fZnVuY19fLCBwQnVmKSk7CisJCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgSVdFVkNVU1RPTSwgRXZlbnRfZmxhZywgTlVMTCwKKwkJCQkJKHU4ICopcEJ1ZiwgQnVmTGVuKTsKKwkJLypEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA6ICVzXG4iLCBfX2Z1bmNfXywgcEJ1ZikpOyAqLwogCiAJCWtmcmVlKHBCdWYpOwotCX0KLQllbHNlCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB3aXJlbGVzcyBldmVudC5cbiIsIF9fZnVuY19fKSk7CisJfSBlbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXMgOiBDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHdpcmVsZXNzIGV2ZW50LlxuIiwKKwkJCSAgX19mdW5jX18pKTsKIH0KIAotdm9pZCBzZW5kX21vbml0b3JfcGFja2V0cygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrKQordm9pZCBzZW5kX21vbml0b3JfcGFja2V0cyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaykKIHsKLSAgICBzdHJ1Y3Qgc2tfYnVmZgkqcE9TUGt0OwotICAgIHdsYW5fbmdfcHJpc20yX2hlYWRlciAqcGg7Ci0gICAgaW50IHJhdGVfaW5kZXggPSAwOwotICAgIFVTSE9SVCBoZWFkZXJfbGVuID0gMDsKLSAgICBVQ0hBUiB0ZW1wX2hlYWRlcls0MF0gPSB7MH07CisJc3RydWN0IHNrX2J1ZmYgKnBPU1BrdDsKKwlzdHJ1Y3QgcnRfd2xhbl9uZ19wcmlzbTJfaGVhZGVyICpwaDsKKwlpbnQgcmF0ZV9pbmRleCA9IDA7CisJdTE2IGhlYWRlcl9sZW4gPSAwOworCXU4IHRlbXBfaGVhZGVyWzQwXSA9IHsgMCB9OwogCi0gICAgdV9pbnQzMl90IHJhbGlua3JhdGVbMjU2XSA9IHsyLDQsMTEsMjIsIDEyLDE4LDI0LDM2LDQ4LDcyLDk2LCAgMTA4LCAgIDEwOSwgMTEwLCAxMTEsIDExMiwgMTMsIDI2LCAzOSwgNTIsNzgsMTA0LCAxMTcsIDEzMCwgMjYsIDUyLCA3OCwxMDQsIDE1NiwgMjA4LCAyMzQsIDI2MCwgMjcsIDU0LDgxLDEwOCwxNjIsIDIxNiwgMjQzLCAyNzAsIC8vIExhc3QgMzgKLQk1NCwgMTA4LCAxNjIsIDIxNiwgMzI0LCA0MzIsIDQ4NiwgNTQwLCAgMTQsIDI5LCA0MywgNTcsIDg3LCAxMTUsIDEzMCwgMTQ0LCAyOSwgNTksODcsMTE1LCAxNzMsIDIzMCwyNjAsIDI4OCwgMzAsIDYwLDkwLDEyMCwxODAsMjQwLDI3MCwzMDAsNjAsMTIwLDE4MCwyNDAsMzYwLDQ4MCw1NDAsNjAwLCAwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLAotCTExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwfTsKKwl1X2ludDMyX3QgcmFsaW5rcmF0ZVsyNTZdID0geyAyLCA0LCAxMSwgMjIsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTMsIDI2LCAzOSwgNTIsIDc4LCAxMDQsIDExNywgMTMwLCAyNiwgNTIsIDc4LCAxMDQsIDE1NiwgMjA4LCAyMzQsIDI2MCwgMjcsIDU0LCA4MSwgMTA4LCAxNjIsIDIxNiwgMjQzLCAyNzAsCS8qIExhc3QgMzggKi8KKwkJNTQsIDEwOCwgMTYyLCAyMTYsIDMyNCwgNDMyLCA0ODYsIDU0MCwgMTQsIDI5LCA0MywgNTcsIDg3LCAxMTUsCisJCSAgICAxMzAsIDE0NCwgMjksIDU5LCA4NywgMTE1LCAxNzMsIDIzMCwgMjYwLCAyODgsIDMwLCA2MCwgOTAsCisJCSAgICAxMjAsIDE4MCwgMjQwLCAyNzAsIDMwMCwgNjAsIDEyMCwgMTgwLCAyNDAsIDM2MCwgNDgwLCA1NDAsCisJCSAgICA2MDAsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLAorCQkxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwKKwkJICAgIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsCisJCSAgICA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LAorCQkgICAgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwKKwkJICAgIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwgODAKKwl9OwogCi0KLSAgICBBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOwotICAgIGlmIChwUnhCbGstPkRhdGFTaXplIDwgMTApCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIHNtYWxsISAoJWQpXG4iLCBfX2Z1bmNfXywgcFJ4QmxrLT5EYXRhU2l6ZSkpOworCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7CisJaWYgKHBSeEJsay0+RGF0YVNpemUgPCAxMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzIDogU2l6ZSBpcyB0b28gc21hbGwhICglZClcbiIsIF9fZnVuY19fLAorCQkJICBwUnhCbGstPkRhdGFTaXplKSk7CiAJCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKLSAgICB9CisJfQogCi0gICAgaWYgKHBSeEJsay0+RGF0YVNpemUgKyBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSA+IFJYX0JVRkZFUl9BR0dSRVNJWkUpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIGxhcmdlISAoJXp1KVxuIiwgX19mdW5jX18sIHBSeEJsay0+RGF0YVNpemUgKyBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSkpOworCWlmIChwUnhCbGstPkRhdGFTaXplICsgc2l6ZW9mKHN0cnVjdCBydF93bGFuX25nX3ByaXNtMl9oZWFkZXIpID4KKwkgICAgUlhfQlVGRkVSX0FHR1JFU0laRSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzIDogU2l6ZSBpcyB0b28gbGFyZ2UhICglenUpXG4iLCBfX2Z1bmNfXywKKwkJCSAgcFJ4QmxrLT5EYXRhU2l6ZSArIHNpemVvZihzdHJ1Y3QgcnRfd2xhbl9uZ19wcmlzbTJfaGVhZGVyKSkpOwogCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7Ci0gICAgfQorCX0KIAotICAgIHBPU1BrdCA9IFJUUEtUX1RPX09TUEtUKHBSeEJsay0+cFJ4UGFja2V0KTsKKwlwT1NQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7CiAJcE9TUGt0LT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBCU1MwKTsKLSAgICBpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpCi0gICAgewotICAgICAgICBwUnhCbGstPkRhdGFTaXplIC09IExFTkdUSF84MDJfMTE7Ci0gICAgICAgIGlmICgocFJ4QmxrLT5wSGVhZGVyLT5GQy5Ub0RzID09IDEpICYmCi0gICAgICAgICAgICAocFJ4QmxrLT5wSGVhZGVyLT5GQy5GckRzID09IDEpKQotICAgICAgICAgICAgaGVhZGVyX2xlbiA9IExFTkdUSF84MDJfMTFfV0lUSF9BRERSNDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaGVhZGVyX2xlbiA9IExFTkdUSF84MDJfMTE7CisJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBKSB7CisJCXBSeEJsay0+RGF0YVNpemUgLT0gTEVOR1RIXzgwMl8xMTsKKwkJaWYgKChwUnhCbGstPnBIZWFkZXItPkZDLlRvRHMgPT0gMSkgJiYKKwkJICAgIChwUnhCbGstPnBIZWFkZXItPkZDLkZyRHMgPT0gMSkpCisJCQloZWFkZXJfbGVuID0gTEVOR1RIXzgwMl8xMV9XSVRIX0FERFI0OworCQllbHNlCisJCQloZWFkZXJfbGVuID0gTEVOR1RIXzgwMl8xMTsKIAotICAgICAgICAvLyBRT1MKLSAgICAJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpCi0gICAgCXsKLSAgICAJICAgIGhlYWRlcl9sZW4gKz0gMjsKLSAgICAJCS8vIERhdGEgc2tpcCBRT1MgY29udG9ybCBmaWVsZAotICAgIAkJcFJ4QmxrLT5EYXRhU2l6ZSAtPTI7Ci0gICAgCX0KLQotICAgIAkvLyBPcmRlciBiaXQ6IEEtUmFsaW5rIG9yIEhUQysKLSAgICAJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuT3JkZXIpCi0gICAgCXsKLSAgICAJICAgIGhlYWRlcl9sZW4gKz0gNDsKLQkJCS8vIERhdGEgc2tpcCBIVEMgY29udG9ybCBmaWVsZAorCQkvKiBRT1MgKi8KKwkJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpIHsKKwkJCWhlYWRlcl9sZW4gKz0gMjsKKwkJCS8qIERhdGEgc2tpcCBRT1MgY29udG9ybCBmaWVsZCAqLworCQkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSAyOworCQl9CisJCS8qIE9yZGVyIGJpdDogQS1SYWxpbmsgb3IgSFRDKyAqLworCQlpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5PcmRlcikgeworCQkJaGVhZGVyX2xlbiArPSA0OworCQkJLyogRGF0YSBza2lwIEhUQyBjb250b3JsIGZpZWxkICovCiAJCQlwUnhCbGstPkRhdGFTaXplIC09IDQ7Ci0gICAgCX0KKwkJfQorCQkvKiBDb3B5IEhlYWRlciAqLworCQlpZiAoaGVhZGVyX2xlbiA8PSA0MCkKKwkJCU5kaXNNb3ZlTWVtb3J5KHRlbXBfaGVhZGVyLCBwUnhCbGstPnBEYXRhLCBoZWFkZXJfbGVuKTsKIAotICAgICAgICAvLyBDb3B5IEhlYWRlcgotICAgICAgICBpZiAoaGVhZGVyX2xlbiA8PSA0MCkKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHRlbXBfaGVhZGVyLCBwUnhCbGstPnBEYXRhLCBoZWFkZXJfbGVuKTsKLQotICAgICAgICAvLyBza2lwIEhXIHBhZGRpbmcKLSAgICAJaWYgKHBSeEJsay0+UnhELkwyUEFEKQotICAgIAkgICAgcFJ4QmxrLT5wRGF0YSArPSAoaGVhZGVyX2xlbiArIDIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwUnhCbGstPnBEYXRhICs9IGhlYWRlcl9sZW47Ci0gICAgfSAvL2VuZCBpZgotCisJCS8qIHNraXAgSFcgcGFkZGluZyAqLworCQlpZiAocFJ4QmxrLT5SeEQuTDJQQUQpCisJCQlwUnhCbGstPnBEYXRhICs9IChoZWFkZXJfbGVuICsgMik7CisJCWVsc2UKKwkJCXBSeEJsay0+cERhdGEgKz0gaGVhZGVyX2xlbjsKKwl9CQkJLyplbmQgaWYgKi8KIAogCWlmIChwUnhCbGstPkRhdGFTaXplIDwgcE9TUGt0LT5sZW4pIHsKLSAgICAgICAgc2tiX3RyaW0ocE9TUGt0LHBSeEJsay0+RGF0YVNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNrYl9wdXQocE9TUGt0LChwUnhCbGstPkRhdGFTaXplIC0gcE9TUGt0LT5sZW4pKTsKLSAgICB9IC8vZW5kIGlmCisJCXNrYl90cmltKHBPU1BrdCwgcFJ4QmxrLT5EYXRhU2l6ZSk7CisJfSBlbHNlIHsKKwkJc2tiX3B1dChwT1NQa3QsIChwUnhCbGstPkRhdGFTaXplIC0gcE9TUGt0LT5sZW4pKTsKKwl9CQkJLyplbmQgaWYgKi8KIAotICAgIGlmICgocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkgPiAwKSB7Ci0JICAgIHNrYl9wdXQocE9TUGt0LChwUnhCbGstPnBEYXRhIC0gcE9TUGt0LT5kYXRhKSk7Ci0JICAgIHNrYl9wdWxsKHBPU1BrdCwocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkpOwotICAgIH0gLy9lbmQgaWYKKwlpZiAoKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpID4gMCkgeworCQlza2JfcHV0KHBPU1BrdCwgKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpKTsKKwkJc2tiX3B1bGwocE9TUGt0LCAocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkpOworCX0JCQkvKmVuZCBpZiAqLwogCi0gICAgaWYgKHNrYl9oZWFkcm9vbShwT1NQa3QpIDwgKHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpKyBoZWFkZXJfbGVuKSkgewotICAgICAgICBpZiAocHNrYl9leHBhbmRfaGVhZChwT1NQa3QsIChzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSArIGhlYWRlcl9sZW4pLCAwLCBHRlBfQVRPTUlDKSkgewotCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBSZWFsbG9jYXRlIGhlYWRlciBzaXplIG9mIHNrX2J1ZmYgZmFpbCFcbiIsIF9fZnVuY19fKSk7CisJaWYgKHNrYl9oZWFkcm9vbShwT1NQa3QpIDwgKHNpemVvZihzdHJ1Y3QgcnRfd2xhbl9uZ19wcmlzbTJfaGVhZGVyKSArIGhlYWRlcl9sZW4pKSB7CisJCWlmIChwc2tiX2V4cGFuZF9oZWFkCisJCSAgICAocE9TUGt0LCAoc2l6ZW9mKHN0cnVjdCBydF93bGFuX25nX3ByaXNtMl9oZWFkZXIpICsgaGVhZGVyX2xlbiksIDAsCisJCSAgICAgR0ZQX0FUT01JQykpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIiVzIDogUmVhbGxvY2F0ZSBoZWFkZXIgc2l6ZSBvZiBza19idWZmIGZhaWwhXG4iLAorCQkJCSAgX19mdW5jX18pKTsKIAkJCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKLQkgICAgfSAvL2VuZCBpZgotICAgIH0gLy9lbmQgaWYKKwkJfQkJLyplbmQgaWYgKi8KKwl9CQkJLyplbmQgaWYgKi8KIAotICAgIGlmIChoZWFkZXJfbGVuID4gMCkKLSAgICAgICAgTmRpc01vdmVNZW1vcnkoc2tiX3B1c2gocE9TUGt0LCBoZWFkZXJfbGVuKSwgdGVtcF9oZWFkZXIsIGhlYWRlcl9sZW4pOworCWlmIChoZWFkZXJfbGVuID4gMCkKKwkJTmRpc01vdmVNZW1vcnkoc2tiX3B1c2gocE9TUGt0LCBoZWFkZXJfbGVuKSwgdGVtcF9oZWFkZXIsCisJCQkgICAgICAgaGVhZGVyX2xlbik7CiAKLSAgICBwaCA9ICh3bGFuX25nX3ByaXNtMl9oZWFkZXIgKikgc2tiX3B1c2gocE9TUGt0LCBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSk7Ci0JTmRpc1plcm9NZW1vcnkocGgsIHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpKTsKKwlwaCA9IChzdHJ1Y3QgcnRfd2xhbl9uZ19wcmlzbTJfaGVhZGVyICopc2tiX3B1c2gocE9TUGt0LAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBydF93bGFuX25nX3ByaXNtMl9oZWFkZXIpKTsKKwlOZGlzWmVyb01lbW9yeShwaCwgc2l6ZW9mKHN0cnVjdCBydF93bGFuX25nX3ByaXNtMl9oZWFkZXIpKTsKIAotICAgIHBoLT5tc2djb2RlCQkgICAgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtOwotCXBoLT5tc2dsZW4JCSAgICA9IHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpOwotCXN0cmNweShwaC0+ZGV2bmFtZSwgcEFkLT5uZXRfZGV2LT5uYW1lKTsKKwlwaC0+bXNnY29kZSA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm07CisJcGgtPm1zZ2xlbiA9IHNpemVvZihzdHJ1Y3QgcnRfd2xhbl9uZ19wcmlzbTJfaGVhZGVyKTsKKwlzdHJjcHkoKGNoYXIgKilwaC0+ZGV2bmFtZSwgKGNoYXIgKilwQWQtPm5ldF9kZXYtPm5hbWUpOwogCi0gICAgcGgtPmhvc3R0aW1lLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faG9zdHRpbWU7CisJcGgtPmhvc3R0aW1lLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faG9zdHRpbWU7CiAJcGgtPmhvc3R0aW1lLnN0YXR1cyA9IDA7CiAJcGgtPmhvc3R0aW1lLmxlbiA9IDQ7CiAJcGgtPmhvc3R0aW1lLmRhdGEgPSBqaWZmaWVzOwpAQCAtOTA4LDYzICs4MjgsNzEgQEAKIAlwaC0+bWFjdGltZS5sZW4gPSAwOwogCXBoLT5tYWN0aW1lLmRhdGEgPSAwOwogCi0gICAgcGgtPmlzdHguZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4OworCXBoLT5pc3R4LmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faXN0eDsKIAlwaC0+aXN0eC5zdGF0dXMgPSAwOwogCXBoLT5pc3R4LmxlbiA9IDA7CiAJcGgtPmlzdHguZGF0YSA9IDA7CiAKLSAgICBwaC0+Y2hhbm5lbC5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2NoYW5uZWw7CisJcGgtPmNoYW5uZWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9jaGFubmVsOwogCXBoLT5jaGFubmVsLnN0YXR1cyA9IDA7CiAJcGgtPmNoYW5uZWwubGVuID0gNDsKIAotICAgIHBoLT5jaGFubmVsLmRhdGEgPSAodV9pbnQzMl90KXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJcGgtPmNoYW5uZWwuZGF0YSA9ICh1X2ludDMyX3QpIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CiAKLSAgICBwaC0+cnNzaS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3Jzc2k7CisJcGgtPnJzc2kuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpOwogCXBoLT5yc3NpLnN0YXR1cyA9IDA7CiAJcGgtPnJzc2kubGVuID0gNDsKLSAgICBwaC0+cnNzaS5kYXRhID0gKHVfaW50MzJfdClSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBwUnhCbGstPnBSeFdJLT5SU1NJMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIHBSeEJsay0+cFJ4V0ktPlJTU0kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgcFJ4QmxrLT5wUnhXSS0+UlNTSTIsIFJTU0lfMikpOzsKKwlwaC0+cnNzaS5kYXRhID0KKwkgICAgKHVfaW50MzJfdCkgUlRNUE1heFJzc2kocEFkLAorCQkJCSAgICBDb252ZXJ0VG9Sc3NpKHBBZCwgcFJ4QmxrLT5wUnhXSS0+UlNTSTAsCisJCQkJCQkgIFJTU0lfMCksIENvbnZlcnRUb1Jzc2kocEFkLAorCQkJCQkJCQkJIHBSeEJsay0+CisJCQkJCQkJCQkgcFJ4V0ktPgorCQkJCQkJCQkJIFJTU0kxLAorCQkJCQkJCQkJIFJTU0lfMSksCisJCQkJICAgIENvbnZlcnRUb1Jzc2kocEFkLCBwUnhCbGstPnBSeFdJLT5SU1NJMiwKKwkJCQkJCSAgUlNTSV8yKSk7OwogCiAJcGgtPnNpZ25hbC5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NpZ25hbDsKIAlwaC0+c2lnbmFsLnN0YXR1cyA9IDA7CiAJcGgtPnNpZ25hbC5sZW4gPSA0OwotCXBoLT5zaWduYWwuZGF0YSA9IDA7IC8vcnNzaSArIG5vaXNlOworCXBoLT5zaWduYWwuZGF0YSA9IDA7CS8qcnNzaSArIG5vaXNlOyAqLwogCiAJcGgtPm5vaXNlLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbm9pc2U7CiAJcGgtPm5vaXNlLnN0YXR1cyA9IDA7CiAJcGgtPm5vaXNlLmxlbiA9IDQ7CiAJcGgtPm5vaXNlLmRhdGEgPSAwOwogCi0gICAgaWYgKHBSeEJsay0+cFJ4V0ktPlBIWU1PREUgPj0gTU9ERV9IVE1JWCkKLSAgICB7Ci0gICAgCXJhdGVfaW5kZXggPSAxNiArICgoVUNIQVIpcFJ4QmxrLT5wUnhXSS0+QlcgKjE2KSArICgoVUNIQVIpcFJ4QmxrLT5wUnhXSS0+U2hvcnRHSSAqMzIpICsgKChVQ0hBUilwUnhCbGstPnBSeFdJLT5NQ1MpOwotICAgIH0KLSAgICBlbHNlCi0JaWYgKHBSeEJsay0+cFJ4V0ktPlBIWU1PREUgPT0gTU9ERV9PRkRNKQotICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShwUnhCbGstPnBSeFdJLT5NQ1MpICsgNDsKLSAgICBlbHNlCi0gICAgCXJhdGVfaW5kZXggPSAoVUNIQVIpKHBSeEJsay0+cFJ4V0ktPk1DUyk7Ci0gICAgaWYgKHJhdGVfaW5kZXggPCAwKQotICAgICAgICByYXRlX2luZGV4ID0gMDsKLSAgICBpZiAocmF0ZV9pbmRleCA+IDI1NSkKLSAgICAgICAgcmF0ZV9pbmRleCA9IDI1NTsKKwlpZiAocFJ4QmxrLT5wUnhXSS0+UEhZTU9ERSA+PSBNT0RFX0hUTUlYKSB7CisJCXJhdGVfaW5kZXggPQorCQkgICAgMTYgKyAoKHU4KXBSeEJsay0+cFJ4V0ktPkJXICogMTYpICsKKwkJICAgICgodTgpcFJ4QmxrLT5wUnhXSS0+U2hvcnRHSSAqIDMyKSArCisJCSAgICAoKHU4KXBSeEJsay0+cFJ4V0ktPk1DUyk7CisJfSBlbHNlIGlmIChwUnhCbGstPnBSeFdJLT5QSFlNT0RFID09IE1PREVfT0ZETSkKKwkJcmF0ZV9pbmRleCA9ICh1OCkocFJ4QmxrLT5wUnhXSS0+TUNTKSArIDQ7CisJZWxzZQorCQlyYXRlX2luZGV4ID0gKHU4KShwUnhCbGstPnBSeFdJLT5NQ1MpOworCWlmIChyYXRlX2luZGV4IDwgMCkKKwkJcmF0ZV9pbmRleCA9IDA7CisJaWYgKHJhdGVfaW5kZXggPiAyNTUpCisJCXJhdGVfaW5kZXggPSAyNTU7CiAKIAlwaC0+cmF0ZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3JhdGU7CiAJcGgtPnJhdGUuc3RhdHVzID0gMDsKIAlwaC0+cmF0ZS5sZW4gPSA0OwotICAgIHBoLT5yYXRlLmRhdGEgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdOworCXBoLT5yYXRlLmRhdGEgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdOwogCiAJcGgtPmZybWxlbi5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbjsKLSAgICBwaC0+ZnJtbGVuLnN0YXR1cyA9IDA7CisJcGgtPmZybWxlbi5zdGF0dXMgPSAwOwogCXBoLT5mcm1sZW4ubGVuID0gNDsKLQlwaC0+ZnJtbGVuLmRhdGEJPSAodV9pbnQzMl90KXBSeEJsay0+RGF0YVNpemU7CisJcGgtPmZybWxlbi5kYXRhID0gKHVfaW50MzJfdCkgcFJ4QmxrLT5EYXRhU2l6ZTsKIAorCXBPU1BrdC0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOworCXBPU1BrdC0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhwT1NQa3QsIHBPU1BrdC0+ZGV2KTsKKwlwT1NQa3QtPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJbmV0aWZfcngocE9TUGt0KTsKIAotICAgIHBPU1BrdC0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOwotICAgIHBPU1BrdC0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhwT1NQa3QsIHBPU1BrdC0+ZGV2KTsKLSAgICBwT1NQa3QtPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Ci0gICAgbmV0aWZfcngocE9TUGt0KTsKLQotICAgIHJldHVybjsKKwlyZXR1cm47CiAKIGVycl9mcmVlX3NrX2J1ZmY6CiAJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKQEAgLTk3MiwzMSArOTAwLDQ3MCBAQAogCiB9CiAKLXZvaWQgcnRtcF9vc190aHJlYWRfaW5pdChQVUNIQVIgcFRocmVhZE5hbWUsIFBWT0lEIHBOb3RpZnkpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJRGV2aWNlIElSUSByZWxhdGVkIGZ1bmN0aW9ucy4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUnRtcE9TSVJRUmVxdWVzdChzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldikKIHsKLQlkYWVtb25pemUocFRocmVhZE5hbWUgLyoiJXMiLHBBZC0+bmV0X2Rldi0+bmFtZSovKTsKKyNpZmRlZiBSVE1QX1BDSV9TVVBQT1JUCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBwTmV0RGV2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CisJaW50IHJldHZhbCA9IDA7CisKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIHBOZXREZXYpOworCisJQVNTRVJUKHBBZCk7CisKKwlpZiAocEFkLT5pbmZUeXBlID09IFJUTVBfREVWX0lORl9QQ0kpIHsKKwkJc3RydWN0IG9zX2Nvb2tpZSAqX3BPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKShwQWQtPk9TX0Nvb2tpZSk7CisJCVJUTVBfTVNJX0VOQUJMRShwQWQpOworCQlyZXR2YWwgPQorCQkgICAgcmVxdWVzdF9pcnEoX3BPYmotPnBjaV9kZXYtPmlycSwgcnQyODYwX2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQkJKG5ldF9kZXYpLT5uYW1lLCAobmV0X2RldikpOworCQlpZiAocmV0dmFsICE9IDApCisJCQlwcmludGsoIlJUMjg2MDogcmVxdWVzdF9pcnEgIEVSUk9SKCVkKVxuIiwgcmV0dmFsKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCitpbnQgUnRtcE9TSVJRUmVsZWFzZShzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHBOZXREZXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKKworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgbmV0X2Rldik7CisKKwlBU1NFUlQocEFkKTsKKworI2lmZGVmIFJUTVBfUENJX1NVUFBPUlQKKwlpZiAocEFkLT5pbmZUeXBlID09IFJUTVBfREVWX0lORl9QQ0kpIHsKKwkJc3RydWN0IG9zX2Nvb2tpZSAqcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopKHBBZC0+T1NfQ29va2llKTsKKwkJc3luY2hyb25pemVfaXJxKHBPYmotPnBjaV9kZXYtPmlycSk7CisJCWZyZWVfaXJxKHBPYmotPnBjaV9kZXYtPmlycSwgKG5ldF9kZXYpKTsKKwkJUlRNUF9NU0lfRElTQUJMRShwQWQpOworCX0KKyNlbmRpZiAvKiBSVE1QX1BDSV9TVVBQT1JUIC8vICovCisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCUZpbGUgb3Blbi9jbG9zZSByZWxhdGVkIGZ1bmN0aW9ucy4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZmlsZSAqUnRtcE9TRmlsZU9wZW4oY2hhciAqcFBhdGgsIGludCBmbGFnLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZVB0cjsKKworCWZpbGVQdHIgPSBmaWxwX29wZW4ocFBhdGgsIGZsYWcsIDApOworCWlmIChJU19FUlIoZmlsZVB0cikpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIlcygpOiBFcnJvciAlbGQgb3BlbmluZyAlc1xuIiwgX19mdW5jX18sCisJCQkgIC1QVFJfRVJSKGZpbGVQdHIpLCBwUGF0aCkpOworCX0KKworCXJldHVybiAoc3RydWN0IGZpbGUgKilmaWxlUHRyOworfQorCitpbnQgUnRtcE9TRmlsZUNsb3NlKHN0cnVjdCBmaWxlICpvc2ZkKQoreworCWZpbHBfY2xvc2Uob3NmZCwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgUnRtcE9TRmlsZVNlZWsoc3RydWN0IGZpbGUgKm9zZmQsIGludCBvZmZzZXQpCit7CisJb3NmZC0+Zl9wb3MgPSBvZmZzZXQ7Cit9CisKK2ludCBSdG1wT1NGaWxlUmVhZChzdHJ1Y3QgZmlsZSAqb3NmZCwgY2hhciAqcERhdGFQdHIsIGludCByZWFkTGVuKQoreworCS8qIFRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QgKi8KKwlpZiAob3NmZC0+Zl9vcCAmJiBvc2ZkLT5mX29wLT5yZWFkKSB7CisJCXJldHVybiBvc2ZkLT5mX29wLT5yZWFkKG9zZmQsIHBEYXRhUHRyLCByZWFkTGVuLCAmb3NmZC0+Zl9wb3MpOworCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIm5vIGZpbGUgcmVhZCBtZXRob2RcbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KK30KKworaW50IFJ0bXBPU0ZpbGVXcml0ZShzdHJ1Y3QgZmlsZSAqb3NmZCwgY2hhciAqcERhdGFQdHIsIGludCB3cml0ZUxlbikKK3sKKwlyZXR1cm4gb3NmZC0+Zl9vcC0+d3JpdGUob3NmZCwgcERhdGFQdHIsIChzaXplX3QpIHdyaXRlTGVuLAorCQkJCSAmb3NmZC0+Zl9wb3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJVGFzayBjcmVhdGUvbWFuYWdlbWVudC9raWxsIHJlbGF0ZWQgZnVuY3Rpb25zLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBSdG1wT1NUYXNrS2lsbChzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzaykKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJaW50IHJldCA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisKKwlwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKXBUYXNrLT5wcml2OworCisjaWZkZWYgS1RIUkVBRF9TVVBQT1JUCisJaWYgKHBUYXNrLT5rdGhyZWFkX3Rhc2spIHsKKwkJa3RocmVhZF9zdG9wKHBUYXNrLT5rdGhyZWFkX3Rhc2spOworCQlyZXQgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKyNlbHNlCisJQ0hFQ0tfUElEX0xFR0FMSVRZKHBUYXNrLT50YXNrUElEKSB7CisJCXByaW50aygiVGVybWluYXRlIHRoZSB0YXNrKCVzKSB3aXRoIHBpZCglZCkhXG4iLAorCQkgICAgICAgcFRhc2stPnRhc2tOYW1lLCBHRVRfUElEX05VTUJFUihwVGFzay0+dGFza1BJRCkpOworCQltYigpOworCQlwVGFzay0+dGFza19raWxsZWQgPSAxOworCQltYigpOworCQlyZXQgPSBLSUxMX1RIUkVBRF9QSUQocFRhc2stPnRhc2tQSUQsIFNJR1RFUk0sIDEpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImtpbGwgdGFzayglcykgd2l0aCBwaWQoJWQpIGZhaWxlZChyZXRWYWw9JWQpIVxuIiwKKwkJCSAgICAgICBwVGFzay0+dGFza05hbWUsIEdFVF9QSURfTlVNQkVSKHBUYXNrLT50YXNrUElEKSwKKwkJCSAgICAgICByZXQpOworCQl9IGVsc2UgeworCQkJd2FpdF9mb3JfY29tcGxldGlvbigmcFRhc2stPnRhc2tDb21wbGV0ZSk7CisJCQlwVGFzay0+dGFza1BJRCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKwkJCXBUYXNrLT50YXNrX2tpbGxlZCA9IDA7CisJCQlyZXQgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQl9CisJfQorI2VuZGlmCisKKwlyZXR1cm4gcmV0OworCit9CisKK2ludCBSdG1wT1NUYXNrTm90aWZ5VG9FeGl0KHN0cnVjdCBydF9ydG1wX29zX3Rhc2sgKnBUYXNrKQoreworCisjaWZuZGVmIEtUSFJFQURfU1VQUE9SVAorCWNvbXBsZXRlX2FuZF9leGl0KCZwVGFzay0+dGFza0NvbXBsZXRlLCAwKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgUnRtcE9TVGFza0N1c3RvbWl6ZShzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzaykKK3sKKworI2lmbmRlZiBLVEhSRUFEX1NVUFBPUlQKKworCWRhZW1vbml6ZSgoY2hhciAqKSYgcFRhc2stPnRhc2tOYW1lWzBdIC8qIiVzIixwQWQtPm5ldF9kZXYtPm5hbWUgKi8gKTsKIAogCWFsbG93X3NpZ25hbChTSUdURVJNKTsKIAlhbGxvd19zaWduYWwoU0lHS0lMTCk7CiAJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAkvKiBzaWduYWwgdGhhdCB3ZSd2ZSBzdGFydGVkIHRoZSB0aHJlYWQgKi8KLQljb21wbGV0ZShwTm90aWZ5KTsKKwljb21wbGV0ZSgmcFRhc2stPnRhc2tDb21wbGV0ZSk7CisKKyNlbmRpZgogfQogCi12b2lkIFJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoraW50IFJ0bXBPU1Rhc2tBdHRhY2goc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqcFRhc2ssCisJCQkgICAgIElOIGludCAoKmZuKSAodm9pZCAqKSwgSU4gdm9pZCAqYXJnKQogewotCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQl7Ci0JCWlmIChwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKLQkJewotCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU1RBX0xJTktET1dOX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisKKyNpZmRlZiBLVEhSRUFEX1NVUFBPUlQKKwlwVGFzay0+dGFza19raWxsZWQgPSAwOworCXBUYXNrLT5rdGhyZWFkX3Rhc2sgPSBOVUxMOworCXBUYXNrLT5rdGhyZWFkX3Rhc2sgPSBrdGhyZWFkX3J1bihmbiwgYXJnLCBwVGFzay0+dGFza05hbWUpOworCWlmIChJU19FUlIocFRhc2stPmt0aHJlYWRfdGFzaykpCisJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisjZWxzZQorCXBpZF9udW1iZXIgPSBrZXJuZWxfdGhyZWFkKGZuLCBhcmcsIFJUTVBfT1NfTUdNVF9UQVNLX0ZMQUdTKTsKKwlpZiAocGlkX251bWJlciA8IDApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJBdHRhY2ggdGFzayglcykgZmFpbGVkIVxuIiwgcFRhc2stPnRhc2tOYW1lKSk7CisJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfSBlbHNlIHsKKwkJcFRhc2stPnRhc2tQSUQgPSBHRVRfUElEKHBpZF9udW1iZXIpOworCisJCS8qIFdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gc3RhcnQgKi8KKwkJd2FpdF9mb3JfY29tcGxldGlvbigmcFRhc2stPnRhc2tDb21wbGV0ZSk7CisJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJfQorI2VuZGlmCisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IFJ0bXBPU1Rhc2tJbml0KHN0cnVjdCBydF9ydG1wX29zX3Rhc2sgKnBUYXNrLAorCQkJICAgY2hhciAqcFRhc2tOYW1lLCB2b2lkICogcFByaXYpCit7CisJaW50IGxlbjsKKworCUFTU0VSVChwVGFzayk7CisKKyNpZm5kZWYgS1RIUkVBRF9TVVBQT1JUCisJTmRpc1plcm9NZW1vcnkoKHU4ICopKHBUYXNrKSwgc2l6ZW9mKHN0cnVjdCBydF9ydG1wX29zX3Rhc2spKTsKKyNlbmRpZgorCisJbGVuID0gc3RybGVuKHBUYXNrTmFtZSk7CisJbGVuID0KKwkgICAgbGVuID4KKwkgICAgKFJUTVBfT1NfVEFTS19OQU1FX0xFTiAtIDEpID8gKFJUTVBfT1NfVEFTS19OQU1FX0xFTiAtIDEpIDogbGVuOworCU5kaXNNb3ZlTWVtb3J5KCZwVGFzay0+dGFza05hbWVbMF0sIHBUYXNrTmFtZSwgbGVuKTsKKwlwVGFzay0+cHJpdiA9IHBQcml2OworCisjaWZuZGVmIEtUSFJFQURfU1VQUE9SVAorCVJUTVBfU0VNX0VWRU5UX0lOSVRfTE9DS0VEKCYocFRhc2stPnRhc2tTZW1hKSk7CisJcFRhc2stPnRhc2tQSUQgPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisKKwlpbml0X2NvbXBsZXRpb24oJnBUYXNrLT50YXNrQ29tcGxldGUpOworI2VuZGlmCisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKwordm9pZCBSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KSB7CisJCWlmIChwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkgeworCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHLAorCQkJCQkgICAgICBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLgorCQkJCQkgICAgICBBZGRyLCBCU1MwLCAwKTsKKwkJfSBlbHNlIHsKKwkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NUQV9MSU5LRE9XTl9FVkVOVF9GTEFHLAorCQkJCQkgICAgICBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLgorCQkJCQkgICAgICBBZGRyLCBCU1MwLCAwKTsKIAkJfQogCX0KIH0KIAoraW50IFJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1MzIgZXZlbnRUeXBlLAorCQkJICAgIGludCBmbGFncywKKwkJCSAgICB1OCAqcFNyY01hYywKKwkJCSAgICB1OCAqcERhdGEsIHUzMiBkYXRhTGVuKQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKworCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKworCWlmIChmbGFncyA+IC0xKQorCQl3cnF1LmRhdGEuZmxhZ3MgPSBmbGFnczsKKworCWlmIChwU3JjTWFjKQorCQltZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHBTcmNNYWMsIE1BQ19BRERSX0xFTik7CisKKwlpZiAoKHBEYXRhICE9IE5VTEwpICYmIChkYXRhTGVuID4gMCkpCisJCXdycXUuZGF0YS5sZW5ndGggPSBkYXRhTGVuOworCisJd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIGV2ZW50VHlwZSwgJndycXUsIChjaGFyICopcERhdGEpOworCXJldHVybiAwOworfQorCitpbnQgUnRtcE9TTmV0RGV2QWRkclNldChzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldiwgdTggKnBNYWNBZGRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKworCW5ldF9kZXYgPSBwTmV0RGV2OworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgbmV0X2Rldik7CisKKwkvKiB3b3JrLWFyb3VuZCBmb3IgdGhlIFN1U0UgZHVlIHRvIGl0IGhhcyBpdCdzIG93biBpbnRlcmZhY2UgbmFtZSBtYW5hZ2VtZW50IHN5c3RlbS4gKi8KKwl7CisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLmRldl9uYW1lLCAxNik7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLmRldl9uYW1lLCBuZXRfZGV2LT5uYW1lLAorCQkJICAgICAgIHN0cmxlbihuZXRfZGV2LT5uYW1lKSk7CisJfQorCisJTmRpc01vdmVNZW1vcnkobmV0X2Rldi0+ZGV2X2FkZHIsIHBNYWNBZGRyLCA2KTsKKworCXJldHVybiAwOworfQorCisvKgorICAqCUFzc2lnbiB0aGUgbmV0d29yayBkZXYgbmFtZSBmb3IgY3JlYXRlZCBSYWxpbmsgV2lGaSBpbnRlcmZhY2UuCisgICovCitzdGF0aWMgaW50IFJ0bXBPU05ldERldlJlcXVlc3ROYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgIGNoYXIgKnBQcmVmaXhTdHIsIGludCBkZXZJZHgpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmV4aXN0TmV0RGV2OworCWNoYXIgc3VmZml4TmFtZVtJRk5BTVNJWl07CisJY2hhciBkZXNpcmVkTmFtZVtJRk5BTVNJWl07CisJaW50IGlmTmFtZUlkeCwgcHJlZml4TGVuLCBzbG90TmFtZUxlbjsKKwlpbnQgU3RhdHVzOworCisJcHJlZml4TGVuID0gc3RybGVuKHBQcmVmaXhTdHIpOworCUFTU0VSVCgocHJlZml4TGVuIDwgSUZOQU1TSVopKTsKKworCWZvciAoaWZOYW1lSWR4ID0gZGV2SWR4OyBpZk5hbWVJZHggPCAzMjsgaWZOYW1lSWR4KyspIHsKKwkJbWVtc2V0KHN1ZmZpeE5hbWUsIDAsIElGTkFNU0laKTsKKwkJbWVtc2V0KGRlc2lyZWROYW1lLCAwLCBJRk5BTVNJWik7CisJCXN0cm5jcHkoJmRlc2lyZWROYW1lWzBdLCBwUHJlZml4U3RyLCBwcmVmaXhMZW4pOworCisJCXNwcmludGYoc3VmZml4TmFtZSwgIiVkIiwgaWZOYW1lSWR4KTsKKworCQlzbG90TmFtZUxlbiA9IHN0cmxlbihzdWZmaXhOYW1lKTsKKwkJQVNTRVJUKCgoc2xvdE5hbWVMZW4gKyBwcmVmaXhMZW4pIDwgSUZOQU1TSVopKTsKKwkJc3RyY2F0KGRlc2lyZWROYW1lLCBzdWZmaXhOYW1lKTsKKworCQlleGlzdE5ldERldiA9IFJ0bXBPU05ldERldkdldEJ5TmFtZShkZXYsICZkZXNpcmVkTmFtZVswXSk7CisJCWlmIChleGlzdE5ldERldiA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJCVJ0bXBPU05ldERldmljZVJlZlB1dChleGlzdE5ldERldik7CisJfQorCisJaWYgKGlmTmFtZUlkeCA8IDMyKSB7CisJCXN0cmNweSgmZGV2LT5uYW1lWzBdLCAmZGVzaXJlZE5hbWVbMF0pOworCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiQ2Fubm90IHJlcXVlc3QgRGV2TmFtZSB3aXRoIHByZWlmeCglcykgYW5kIGluIHJhbmdlKDB+MzIpIGFzIHN1ZmZpeCBmcm9tIE9TIVxuIiwKKwkJCSAgcFByZWZpeFN0cikpOworCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCXJldHVybiBTdGF0dXM7Cit9CisKK3ZvaWQgUnRtcE9TTmV0RGV2Q2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYpCit7CisJZGV2X2Nsb3NlKHBOZXREZXYpOworfQorCit2b2lkIFJ0bXBPU05ldERldkZyZWUoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYpCit7CisJQVNTRVJUKHBOZXREZXYpOworCisJZnJlZV9uZXRkZXYocE5ldERldik7Cit9CisKK2ludCBSdG1wT1NOZXREZXZBbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqKiBuZXdfZGV2X3AsIHUzMiBwcml2RGF0YVNpemUpCit7CisJLyogYXNzaWduIGl0IGFzIG51bGwgZmlyc3QuICovCisJKm5ld19kZXZfcCA9IE5VTEw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQWxsb2NhdGUgYSBuZXQgZGV2aWNlIHdpdGggcHJpdmF0ZSBkYXRhIHNpemU9JWQhXG4iLAorCQkgIHByaXZEYXRhU2l6ZSkpOworCSpuZXdfZGV2X3AgPSBhbGxvY19ldGhlcmRldihwcml2RGF0YVNpemUpOworCWlmICgqbmV3X2Rldl9wKQorCQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwllbHNlCisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqUnRtcE9TTmV0RGV2R2V0QnlOYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2LCBjaGFyICpwRGV2TmFtZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqcFRhcmdldE5ldERldiA9IE5VTEw7CisKKwlwVGFyZ2V0TmV0RGV2ID0gZGV2X2dldF9ieV9uYW1lKGRldl9uZXQocE5ldERldiksIHBEZXZOYW1lKTsKKworCXJldHVybiBwVGFyZ2V0TmV0RGV2OworfQorCit2b2lkIFJ0bXBPU05ldERldmljZVJlZlB1dChzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldikKK3sKKwkvKgorCSAgIGV2ZXJ5IHRpbWUgZGV2X2dldF9ieV9uYW1lIGlzIGNhbGxlZCwgYW5kIGl0IGhhcyByZXR1cm5lZCBhIHZhbGlkIHN0cnVjdAorCSAgIG5ldF9kZXZpY2UqLCBkZXZfcHV0IHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXJ3YXJkcywgYmVjYXVzZSBvdGhlcndpc2UgdGhlCisJICAgbWFjaGluZSBoYW5ncyB3aGVuIHRoZSBkZXZpY2UgaXMgdW5yZWdpc3RlcmVkIChzaW5jZSBkZXYtPnJlZmNudCA+IDEpLgorCSAqLworCWlmIChwTmV0RGV2KQorCQlkZXZfcHV0KHBOZXREZXYpOworfQorCitpbnQgUnRtcE9TTmV0RGV2RGVzdG9yeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2KQoreworCisJLyogVE9ETzogTmVlZCB0byBmaXggdGhpcyAqLworCXByaW50aygiV0FSTklORzogVGhpcyBmdW5jdGlvbiglcykgbm90IGltcGxlbWVudCB5ZXQhXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgUnRtcE9TTmV0RGV2RGV0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2KQoreworCXVucmVnaXN0ZXJfbmV0ZGV2KHBOZXREZXYpOworfQorCitpbnQgUnRtcE9TTmV0RGV2QXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2LAorCQkgICAgICAgc3RydWN0IHJ0X3J0bXBfb3NfbmV0ZGV2X29wX2hvb2sgKnBEZXZPcEhvb2spCit7CisJaW50IHJldCwgcnRubF9sb2NrZWQgPSBGQUxTRTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJ0bXBPU05ldERldkF0dGFjaCgpLS0tPlxuIikpOworCS8qIElmIHdlIG5lZWQgaG9vayBzb21lIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHRoZSBuZXQgZGV2aWNlIHN0cnVjdHJ1ZSwgbm93IGRvIGl0LiAqLworCWlmIChwRGV2T3BIb29rKSB7CisJCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CisKKwkJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBwTmV0RGV2KTsKKworCQlwTmV0RGV2LT5uZXRkZXZfb3BzID0gcERldk9wSG9vay0+bmV0ZGV2X29wczsKKworCQkvKiBPUyBzcGVjaWZpYyBmbGFncywgaGVyZSB3ZSB1c2VkIHRvIGluZGljYXRlIGlmIHdlIGFyZSB2aXJ0dWFsIGludGVyZmFjZSAqLworCQlwTmV0RGV2LT5wcml2X2ZsYWdzID0gcERldk9wSG9vay0+cHJpdl9mbGFnczsKKworCQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgeworCQkJcE5ldERldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmcnQyOHh4X2l3X2hhbmRsZXJfZGVmOworCQl9CisKKwkJLyogY29weSB0aGUgbmV0IGRldmljZSBtYWMgYWRkcmVzcyB0byB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUuICovCisJCU5kaXNNb3ZlTWVtb3J5KHBOZXREZXYtPmRldl9hZGRyLCAmcERldk9wSG9vay0+ZGV2QWRkclswXSwKKwkJCSAgICAgICBNQUNfQUREUl9MRU4pOworCisJCXJ0bmxfbG9ja2VkID0gcERldk9wSG9vay0+bmVlZFByb3RjdGVkOworCX0KKworCWlmIChydG5sX2xvY2tlZCkKKwkJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2aWNlKHBOZXREZXYpOworCWVsc2UKKwkJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KHBOZXREZXYpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLVJ0bXBPU05ldERldkF0dGFjaCgpLCByZXQ9JWRcbiIsIHJldCkpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJZWxzZQorCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKK30KKworc3RydWN0IG5ldF9kZXZpY2UgKlJ0bXBPU05ldERldkNyZWF0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgaW50IGRldlR5cGUsCisJCQkgICAgaW50IGRldk51bSwKKwkJCSAgICBpbnQgcHJpdk1lbVNpemUsIGNoYXIgKnBOYW1lUHJlZml4KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2ID0gTlVMTDsKKwlpbnQgc3RhdHVzOworCisJLyogYWxsb2NhdGUgYSBuZXcgbmV0d29yayBkZXZpY2UgKi8KKwlzdGF0dXMgPSBSdG1wT1NOZXREZXZBbGxvYygmcE5ldERldiwgMCAvKnByaXZNZW1TaXplICovICk7CisJaWYgKHN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCS8qIGFsbG9jYXRpb24gZmFpbCwgZXhpdCAqLworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIkFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlIGZhaWwgKCVzKS4uLlxuIiwKKwkJCSAgcE5hbWVQcmVmaXgpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogZmluZCBhIGF2YWlsYWJsZSBpbnRlcmZhY2UgbmFtZSwgbWF4IDMyIGludGVyZmFjZXMgKi8KKwlzdGF0dXMgPSBSdG1wT1NOZXREZXZSZXF1ZXN0TmFtZShwQWQsIHBOZXREZXYsIHBOYW1lUHJlZml4LCBkZXZOdW0pOworCWlmIChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkvKiBlcnJvciEgbm8gYW55IGF2YWlsYWJsZSByYSBuYW1lIGNhbiBiZSB1c2VkISAqLworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIkFzc2lnbiBpbnRlcmZhY2UgbmFtZSAoJXMgd2l0aCBzdWZmaXggMH4zMikgZmFpbGVkLi4uXG4iLAorCQkJICBwTmFtZVByZWZpeCkpOworCQlSdG1wT1NOZXREZXZGcmVlKHBOZXREZXYpOworCisJCXJldHVybiBOVUxMOworCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiVGhlIG5hbWUgb2YgdGhlIG5ldyAlcyBpbnRlcmZhY2UgaXMgJXMuLi5cbiIsCisJCQkgIHBOYW1lUHJlZml4LCBwTmV0RGV2LT5uYW1lKSk7CisJfQorCisJcmV0dXJuIHBOZXREZXY7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmgKaW5kZXggZThkNjRjMy4uZjg1NTA4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguaApAQCAtMjMsMjcgKzIzLDIyIEBACiAgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBQcm9ncmFtOiAgICBydF9saW51eC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBDcmVhdGVkOiAgICA0LzIxLzIwMDYgMToxNzozOCBQTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBBdXRob3I6ICAgICBXdSBYaS1LdW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBDb21tZW50czogICBgZGVzY3JpcHRpb25gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUmV2aXNpb24gMS4xIDQvMjEvMjAwNiAxOjE3OjM4IFBNICB4c2lrdW4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSW5pdGlhbCByZXZpc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIE1vZHVsZSBOYW1lOgorCXJ0X2xpbnV4LmgKIAotI2luY2x1ZGUgInJ0bXBfdHlwZS5oIgorICAgIEFic3RyYWN0OgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX1JUX0xJTlVYX0hfXworI2RlZmluZSBfX1JUX0xJTlVYX0hfXworCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KQEAgLTY1LDY0ICs2MCw1NyBAQAogCiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KIAotLy8gbG9hZCBmaXJtd2FyZQorLyogbG9hZCBmaXJtd2FyZSAqLwogI2RlZmluZSBfX0tFUk5FTF9TWVNDQUxMU19fCiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CS8qIGZvciBnZXRfdW5hbGlnbmVkKCkgKi8KIAorI2RlZmluZSBLVEhSRUFEX1NVUFBPUlQgMQorLyogUlQyODcwIDIuMS4wLjAgaGFzIGl0IGRpc2FibGVkICovCiAKLSNkZWZpbmUgTUVNX0FMTE9DX0ZMQUcgICAgICAoR0ZQX0FUT01JQykgLy8oR0ZQX0RNQSB8IEdGUF9BVE9NSUMpCisjaWZkZWYgS1RIUkVBRF9TVVBQT1JUCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2VuZGlmIC8qIEtUSFJFQURfU1VQUE9SVCAvLyAqLwogCi0jaWZuZGVmIElGTkFNU0laCi0jZGVmaW5lIElGTkFNU0laIDE2Ci0jZW5kaWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJUHJvZmlsZSByZWxhdGVkIHNlY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8vI2RlZmluZSBDT05GSUdfQ0tJUF9TVVBQT1JUCisjaWZkZWYgUlRNUF9NQUNfUENJCisjZGVmaW5lIFNUQV9EUklWRVJfVkVSU0lPTgkJCSIyLjEuMC4wIgorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorI2RlZmluZSBTVEFfRFJJVkVSX1ZFUlNJT04JCQkiMi4xLjAuMCIKKy8qIFJUMzA3MCB2ZXJzaW9uOiAyLjEuMS4wICovCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcnQyOHh4X2l3X2hhbmRsZXJfZGVmOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCUNvbXBpbGVyIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICN1bmRlZiBfX2lubGluZQogI2RlZmluZSBfX2lubGluZQkgICBzdGF0aWMgaW5saW5lCisjZGVmaW5lIElOCisjZGVmaW5lIE9VVAorI2RlZmluZSBJTk9VVAogCi10eXBlZGVmIGludCAoKkhBUkRfU1RBUlRfWE1JVF9GVU5DKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU9TIFNwZWNpZmljIGRlZmluaXRpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgaW50ICgqSEFSRF9TVEFSVF9YTUlUX0ZVTkMpIChzdHJ1Y3Qgc2tfYnVmZiAqIHNrYiwKKwkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICogbmV0X2Rldik7CiAKLS8vIGFkZCBieSBrYXRoeQotCi0vKiBvcmRlciBvZiAiaWYgZGVmaW5lZCgpIiBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgZm9yIDMwNzAgZHJpdmVyCi0gICBib3RoIFJUMjg3MCBhbmQgUlQzMDcwIGFyZSBkZWZpbmVkICovCi0jaWYgZGVmaW5lZChSVDI4NjApCi0gI2RlZmluZSBTVEFfUFJPRklMRV9QQVRICQkJIi9ldGMvV2lyZWxlc3MvUlQyODYwU1RBL1JUMjg2MFNUQS5kYXQiCi0gI2RlZmluZSBTVEFfUlRNUF9GSVJNV0FSRV9GSUxFX05BTUUgIi9ldGMvV2lyZWxlc3MvUlQyODYwU1RBL1JUMjg2MFNUQS5iaW4iCi0gI2RlZmluZSBTVEFfTklDX0RFVklDRV9OQU1FCQkJIlJUMjg2MFNUQSIKLSAjZGVmaW5lIFNUQV9EUklWRVJfVkVSU0lPTgkJCSIxLjguMS4xIgotI2VsaWYgZGVmaW5lZChSVDMwNzApCi0gI2RlZmluZSBTVEFfUFJPRklMRV9QQVRICQkJIi9ldGMvV2lyZWxlc3MvUlQzMDcwU1RBL1JUMzA3MFNUQS5kYXQiCi0gI2RlZmluZSBTVEFfUlQyODcwX0lNQUdFX0ZJTEVfTkFNRSAgIi9ldGMvV2lyZWxlc3MvUlQzMDcwU1RBL3J0Mjg3MC5iaW4iCi0gI2RlZmluZSBTVEFfTklDX0RFVklDRV9OQU1FCQkJIlJUMzA3MFNUQSIKLSAjZGVmaW5lIFNUQV9EUklWRVJfVkVSU0lPTgkJCSIyLjAuMS4wIgotI2VsaWYgZGVmaW5lZChSVDI4NzApCi0gI2RlZmluZSBTVEFfUFJPRklMRV9QQVRICQkJIi9ldGMvV2lyZWxlc3MvUlQyODcwU1RBL1JUMjg3MFNUQS5kYXQiCi0gI2RlZmluZSBTVEFfUlQyODcwX0lNQUdFX0ZJTEVfTkFNRSAgIi9ldGMvV2lyZWxlc3MvUlQyODcwU1RBL3J0Mjg3MC5iaW4iCi0gI2RlZmluZSBTVEFfTklDX0RFVklDRV9OQU1FCQkJIlJUMjg3MFNUQSIKLSAjZGVmaW5lIFNUQV9EUklWRVJfVkVSU0lPTgkJCSIxLjQuMC4wIgotI2VuZGlmCi0KLSNpZmRlZiBSVDI4NjAKKyNpZmRlZiBSVE1QX01BQ19QQ0kKICNpZm5kZWYgUENJX0RFVklDRQogI2RlZmluZSBQQ0lfREVWSUNFKHZlbmQsZGV2KSBcCiAJLnZlbmRvciA9ICh2ZW5kKSwgLmRldmljZSA9IChkZXYpLCBcCiAJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsIC5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lECi0jZW5kaWYgLy8gUENJX0RFVklDRSAvLwotI2VuZGlmCi0KLSNkZWZpbmUgUlRNUF9USU1FX0FGVEVSKGEsYikJCVwKLQkodHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWEpICYmIFwKLQkgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWIpICYmIFwKLQkgKChsb25nKShiKSAtIChsb25nKShhKSA8IDApKQotCi0jZGVmaW5lIFJUTVBfVElNRV9BRlRFUl9FUShhLGIpCVwKLQkodHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWEpICYmIFwKLQkgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWIpICYmIFwKLQkgKChsb25nKShhKSAtIChsb25nKShiKSA+PSAwKSkKLSNkZWZpbmUgUlRNUF9USU1FX0JFRk9SRShhLGIpCVJUTVBfVElNRV9BRlRFUl9FUShiLGEpCisjZW5kaWYgLyogUENJX0RFVklDRSAvLyAqLworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCiAjZGVmaW5lIFJUX01PRF9JTkNfVVNFX0NPVU5UKCkgXAogCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKSBcCkBAIC0xMzMsMjY4ICsxMjEsMTA1IEBACiAKICNkZWZpbmUgUlRfTU9EX0RFQ19VU0VfQ09VTlQoKSBtb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIAotI2RlZmluZSBPU19IWgkJCUhaCisjZGVmaW5lIFJUTVBfSU5DX1JFRihfQSkJCTAKKyNkZWZpbmUgUlRNUF9ERUNfUkVGKF9BKQkJMAorI2RlZmluZSBSVE1QX0dFVF9SRUYoX0EpCQkwCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiBxdWVyeSAvcHJvYyAqLworc3RydWN0IGl3X3N0YXRpc3RpY3MgKnJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5ldHdvcmsgcmVsYXRlZCBjb25zdGFudCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBJRk5BTVNJWgorI2RlZmluZSBJRk5BTVNJWiAxNgorI2VuZGlmCiAKICNkZWZpbmUgRVRIX0xFTkdUSF9PRl9BRERSRVNTCTYKIAotI2RlZmluZSBJTgotI2RlZmluZSBPVVQKLQotI2RlZmluZSBORElTX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UCiAjZGVmaW5lIE5ESVNfU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAweDAwCiAjZGVmaW5lIE5ESVNfU1RBVFVTX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAweDAxCiAjZGVmaW5lIE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQQkJCQkweDAyCiAjZGVmaW5lIE5ESVNfU1RBVFVTX1JFU09VUkNFUyAgICAgICAgICAgICAgICAgICAweDAzCiAKLSNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX0FJRAkJCTB4MDAJCS8vMHgwMH4weDNmCi0jZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9NQlNTSUQJCTB4MDAJCS8vMHgwMCwweDEwLDB4MjAsMHgzMAotI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTCQkJMHgxMAkJLy8weDQwLDB4NTAsMHg2MCwweDcwCisjZGVmaW5lIE5ESVNfU0VUX1BBQ0tFVF9TVEFUVVMoX3AsIF9zdGF0dXMpCQkJZG97fSB3aGlsZSgwKQorI2RlZmluZSBOZGlzV3JpdGVFcnJvckxvZ0VudHJ5KF9hLCBfYiwgX2MsIF9kKQkJZG97fSB3aGlsZSgwKQorCisvKiBzdGF0aXN0aWNzIGNvdW50ZXIgKi8KKyNkZWZpbmUgU1RBVFNfSU5DX1JYX1BBQ0tFVFMoX3BBZCwgX2RldikKKyNkZWZpbmUgU1RBVFNfSU5DX1RYX1BBQ0tFVFMoX3BBZCwgX2RldikKKworI2RlZmluZSBTVEFUU19JTkNfUlhfQllURVNTKF9wQWQsIF9kZXYsIGxlbikKKyNkZWZpbmUgU1RBVFNfSU5DX1RYX0JZVEVTUyhfcEFkLCBfZGV2LCBsZW4pCisKKyNkZWZpbmUgU1RBVFNfSU5DX1JYX0VSUk9SUyhfcEFkLCBfZGV2KQorI2RlZmluZSBTVEFUU19JTkNfVFhfRVJST1JTKF9wQWQsIF9kZXYpCisKKyNkZWZpbmUgU1RBVFNfSU5DX1JYX0RST1BQRUQoX3BBZCwgX2RldikKKyNkZWZpbmUgU1RBVFNfSU5DX1RYX0RST1BQRUQoX3BBZCwgX2RldikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglSYWxpbmsgU3BlY2lmaWMgbmV0d29yayByZWxhdGVkIGNvbnN0YW50IGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9BSUQJCQkweDAwCS8qMHgwMH4weDNmICovCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9NQlNTSUQJCTB4MDAJLyoweDAwLDB4MTAsMHgyMCwweDMwICovCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9XRFMJCQkweDEwCS8qMHg0MCwweDUwLDB4NjAsMHg3MCAqLwogI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkJCTB4MjAKICNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX01FU0gJCQkweDMwCiAjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9ETFMJCQkweDQwCisjZGVmaW5lIE5FVF9ERVZJQ0VfUkVBTF9JRFhfTUFTSwkJMHgwZgkvKiBmb3IgZWFjaCBvcGVyYXRpb24gbW9kZSwgd2UgbWF4aW11bSBzdXBwb3J0IDE1IGVudGl0aWVzLiAqLwogCiAjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfRElSRUNURUQJCTAKICNkZWZpbmUgTkRJU19QQUNLRVRfVFlQRV9NVUxUSUNBU1QJCTEKICNkZWZpbmUgTkRJU19QQUNLRVRfVFlQRV9CUk9BRENBU1QJCTIKICNkZWZpbmUgTkRJU19QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUCTMKKyNkZWZpbmUgTkRJU19QQUNLRVRfVFlQRV9QUk9NSVNDVU9VUwk0CiAKLXN0cnVjdCBvc19sb2NrICB7Ci0Jc3BpbmxvY2tfdAkJbG9jazsKLQl1bnNpZ25lZCBsb25nICAJZmxhZ3M7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU9TIHNpZ25hbGluZyByZWxhdGVkIGNvbnN0YW50IGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJT1MgZmlsZSBvcGVyYXRpb24gcmVsYXRlZCBkYXRhIHN0cnVjdHVyZSBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHJ0X3J0bXBfb3NfZnNfaW5mbyB7CisJaW50IGZzdWlkOworCWludCBmc2dpZDsKKwltbV9zZWdtZW50X3QgZnM7CiB9OwogCisjZGVmaW5lIElTX0ZJTEVfT1BFTl9FUlIoX2ZkKQlJU19FUlIoKF9mZCkpCiAKLXN0cnVjdCBvc19jb29raWUgewotI2lmZGVmIFJUMjg2MAotCXN0cnVjdCBwY2lfZGV2IAkJCSpwY2lfZGV2OwotCXN0cnVjdCBwY2lfZGV2IAkJCSpwYXJlbnRfcGNpX2RldjsKLQlkbWFfYWRkcl90CQkgIAkJcEFkX3BhOwotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0Jc3RydWN0IHVzYl9kZXZpY2UJCSpwVXNiX0RldjsKLQotCXN0cnVjdCBwaWQJKk1MTUVUaHJfcGlkOwotCXN0cnVjdCBwaWQJKlJUVVNCQ21kVGhyX3BpZDsKLQlzdHJ1Y3QgcGlkCSpUaW1lclFUaHJfcGlkOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IAlyeF9kb25lX3Rhc2s7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IAltZ210X2RtYV9kb25lX3Rhc2s7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IAlhYzBfZG1hX2RvbmVfdGFzazsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCWFjMV9kbWFfZG9uZV90YXNrOwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJYWMyX2RtYV9kb25lX3Rhc2s7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IAlhYzNfZG1hX2RvbmVfdGFzazsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCWhjY2FfZG1hX2RvbmVfdGFzazsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJdGJ0dF90YXNrOwotI2lmZGVmIFJUMjg2MAotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlmaWZvX3N0YXRpc3RpY19mdWxsX3Rhc2s7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJbnVsbF9mcmFtZV9jb21wbGV0ZV90YXNrOwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlydHNfZnJhbWVfY29tcGxldGVfdGFzazsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJcHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2s7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLQl1bnNpZ25lZCBsb25nCQkJYXBkX3BpZDsgLy84MDIuMXggZGFlbW9uIHBpZAotCUlOVAkJCQkJCWlvY3RsX2lmX3R5cGU7Ci0JSU5UIAkJCQkJaW9jdGxfaWY7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU9TIHNlbWFwaG9yZSByZWxhdGVkIGRhdGEgc3RydWN0dXJlIGFuZCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IG9zX2xvY2sgeworCXNwaW5sb2NrX3QgbG9jazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogfTsKIAotI3VuZGVmICBBU1NFUlQKLSNkZWZpbmUgQVNTRVJUKHgpCi0KLXR5cGVkZWYgc3RydWN0IG9zX2Nvb2tpZQkqIFBPU19DT09LSUU7Ci10eXBlZGVmIHN0cnVjdCBwY2lfZGV2IAkJKiBQUENJX0RFVjsKLXR5cGVkZWYgc3RydWN0IG5ldF9kZXZpY2UJKiBQTkVUX0RFVjsKLXR5cGVkZWYgdm9pZAkJCQkqIFBORElTX1BBQ0tFVDsKLXR5cGVkZWYgY2hhcgkJCQlORElTX1BBQ0tFVDsKLXR5cGVkZWYgUE5ESVNfUEFDS0VUCQkqIFBQTkRJU19QQUNLRVQ7Ci10eXBlZGVmCWRtYV9hZGRyX3QJCQlORElTX1BIWVNJQ0FMX0FERFJFU1M7Ci10eXBlZGVmCWRtYV9hZGRyX3QJCQkqIFBORElTX1BIWVNJQ0FMX0FERFJFU1M7Ci10eXBlZGVmIHNwaW5sb2NrX3QJCQlORElTX1NQSU5fTE9DSzsKLXR5cGVkZWYgc3RydWN0IHRpbWVyX2xpc3QJTkRJU19NSU5JUE9SVF9USU1FUjsKLXR5cGVkZWYgdm9pZAkJCQkqIE5ESVNfSEFORExFOwotdHlwZWRlZiBjaGFyIAkJCQkqIFBORElTX0JVRkZFUjsKLQotCi0KLXZvaWQgaGV4X2R1bXAoY2hhciAqc3RyLCB1bnNpZ25lZCBjaGFyICpwU3JjQnVmVkEsIHVuc2lnbmVkIGludCBTcmNCdWZMZW4pOwotCi1kbWFfYWRkcl90IGxpbnV4X3BjaV9tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgaW50IHNkX2lkeCwgaW50IGRpcmVjdGlvbik7Ci12b2lkIGxpbnV4X3BjaV91bm1hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbik7Ci0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gTU9WRSBUTyBydG1wLmggPwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSNkZWZpbmUgUEtUU1JDX05ESVMgICAgICAgICAgICAgMHg3ZgotI2RlZmluZSBQS1RTUkNfRFJJVkVSICAgICAgICAgICAweDBmCi0jZGVmaW5lIFBSSU5UX01BQyhhZGRyKQlcCi0JYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XQotCi0KLSNkZWZpbmUgUlQyODYwX1BDSV9ERVZJQ0VfSUQJCTB4MDYwMQotCi0jaWZkZWYgUlQyODYwCi0jZGVmaW5lIFBDSV9NQVBfU0lOR0xFKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfc2RfaWR4LCBfZGlyKSBcCi0JbGludXhfcGNpX21hcF9zaW5nbGUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9zZF9pZHgsIF9kaXIpCi0KLSNkZWZpbmUgUENJX1VOTUFQX1NJTkdMRShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX2RpcikgXAotCWxpbnV4X3BjaV91bm1hcF9zaW5nbGUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9kaXIpCi0KLSNkZWZpbmUgUENJX0FMTE9DX0NPTlNJU1RFTlQoX3BjaV9kZXYsIF9zaXplLCBfcHRyKSBcCi0JcGNpX2FsbG9jX2NvbnNpc3RlbnQoX3BjaV9kZXYsIF9zaXplLCBfcHRyKQotCi0jZGVmaW5lIFBDSV9GUkVFX0NPTlNJU1RFTlQoX3BjaV9kZXYsIF9zaXplLCBfdmlydHVhbF9hZGRyLCBfcGh5c2ljYWxfYWRkcikgXAotCXBjaV9mcmVlX2NvbnNpc3RlbnQoX3BjaV9kZXYsIF9zaXplLCBfdmlydHVhbF9hZGRyLCBfcGh5c2ljYWxfYWRkcikKLQotI2RlZmluZSBERVZfQUxMT0NfU0tCKF9sZW5ndGgpIFwKLQlkZXZfYWxsb2Nfc2tiKF9sZW5ndGgpCi0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLSNkZWZpbmUgUENJX01BUF9TSU5HTEUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9kaXIpIChVTE9ORykwCi0KLSNkZWZpbmUgUENJX1VOTUFQX1NJTkdMRShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX2RpcikKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotCi0jZGVmaW5lIEJFQUNPTl9GUkFNRV9ETUFfQ0FDSEVfV0JBQ0soX3B0ciwgX3NpemUpCVwKLQlkbWFfY2FjaGVfd2JhY2soX3B0ciwgX3NpemUpCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQotI2RlZmluZSBOZGlzTUluZGljYXRlU3RhdHVzKF93LCBfeCwgX3ksIF96KQotCi10eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0CVJUTVBfT1NfVElNRVI7Ci0KLSNpZmRlZiBSVDI4NzAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tIFRpbWVyIFJlbGF0ZWQgTUFSQ08gLS0tLS0tLS0tLS0tLS0tKi8KLS8vIEluIFJUMjg3MCwgd2UgaGF2ZSBhIGxvdCBvZiB0aW1lciBmdW5jdGlvbnMgYW5kIHdpbGwgcmVhZC93cml0ZSByZWdpc3RlciwgaXQncwotLy8Jbm90IGFsbG93ZWQgaW4gTGludXggVVNCIHN1Yi1zeXN0ZW0gdG8gZG8gaXQgKCBiZWNhdXNlIG9mIHNsZWVwIGlzc3VlIHdoZW4gc3VibWl0Ci0vLyAgdG8gY3RybCBwaXBlKS4gU28gd2UgbmVlZCBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gdGFrZSBjYXJlIGl0LgotCi10eXBlZGVmIFZPSUQgKCpSVDI4NzBfVElNRVJfSEFORExFKSgKLQlJTiAgUFZPSUQgICBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gIFBWT0lEICAgRnVuY3Rpb25Db250ZXh0LAotCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMiwKLQlJTiAgUFZPSUQgICBTeXN0ZW1TcGVjaWZpYzMpOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0KLXR5cGVkZWYgc3RydWN0ICBfUkFMSU5LX1RJTUVSX1NUUlVDVCAgICB7Ci0gICAgUlRNUF9PU19USU1FUgkJVGltZXJPYmo7ICAgICAgIC8vIE5kaXMgVGltZXIgb2JqZWN0Ci0JQk9PTEVBTgkJCQlWYWxpZDsJCQkvLyBTZXQgdG8gVHJ1ZSB3aGVuIGNhbGwgUlRNUEluaXRUaW1lcgotICAgIEJPT0xFQU4gICAgICAgICAgICAgU3RhdGU7ICAgICAgICAgIC8vIFRydWUgaWYgdGltZXIgY2FuY2VsbGVkCi0gICAgQk9PTEVBTgkgICAgICAJCVBlcmlvZGljVHlwZTsJLy8gVHJ1ZSBpZiB0aW1lciBpcyBwZXJpb2RpYyB0aW1lcgotICAgIEJPT0xFQU4gICAgICAgICAgICAgUmVwZWF0OyAgICAgICAgIC8vIFRydWUgaWYgcGVyaW9kaWMgdGltZXIKLSAgICBVTE9ORyAgICAgICAgICAgICAgIFRpbWVyVmFsdWU7ICAgICAvLyBUaW1lciB2YWx1ZSBpbiBtaWxsaXNlY29uZHMKLQlVTE9ORwkJCQljb29raWU7CQkJLy8gb3Mgc3BlY2lmaWMgb2JqZWN0Ci0jaWZkZWYgUlQyODcwCi0JUlQyODcwX1RJTUVSX0hBTkRMRQloYW5kbGU7Ci0Jdm9pZAkJCQkqcEFkOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotfSAgIFJBTElOS19USU1FUl9TVFJVQ1QsICpQUkFMSU5LX1RJTUVSX1NUUlVDVDsKLQotCi0jaWZkZWYgUlQyODcwCi0KLXR5cGVkZWYgZW51bSBfUlQyODcwX0tFUk5FTF9USFJFQURfU1RBVFVTXwotewotCVJUMjg3MF9USFJFQURfVU5LTk9XTiA9IDAsCi0JUlQyODcwX1RIUkVBRF9JTklURUQgPSAxLAotCVJUMjg3MF9USFJFQURfUlVOTklORyA9IDIsCi0JUlQyODcwX1RIUkVBRF9TVE9QRUQgPSA0LAotfVJUMjg3MF9LRVJORUxfVEhSRUFEX1NUQVRVUzsKLQotI2RlZmluZSBSVDI4NzBfVEhSRUFEX0NBTl9ET19JTlNFUlQJCShSVDI4NzBfVEhSRUFEX0lOSVRFRCB8UlQyODcwX1RIUkVBRF9SVU5OSU5HKQotCi10eXBlZGVmIHN0cnVjdCBfUlQyODcwX1RJTUVSX0VOVFJZXwotewotCVJBTElOS19USU1FUl9TVFJVQ1QgCQkJKnBSYVRpbWVyOwotCXN0cnVjdCBfUlQyODcwX1RJTUVSX0VOVFJZXyAJKnBOZXh0OwotfVJUMjg3MF9USU1FUl9FTlRSWTsKLQotCi0jZGVmaW5lIFRJTUVSX1FVRVVFX1NJWkVfTUFYCTEyOAotdHlwZWRlZiBzdHJ1Y3QgX1JUMjg3MF9USU1FUl9RVUVVRV8KLXsKLQl1bnNpZ25lZCBpbnQJCXN0YXR1czsKLQlVQ0hBUgkJCQkqcFRpbWVyUVBvbGw7Ci0JUlQyODcwX1RJTUVSX0VOVFJZCSpwUVBvbGxGcmVlTGlzdDsKLQlSVDI4NzBfVElNRVJfRU5UUlkgCSpwUUhlYWQ7Ci0JUlQyODcwX1RJTUVSX0VOVFJZIAkqcFFUYWlsOwotfVJUMjg3MF9USU1FUl9RVUVVRTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotCi0vLyNkZWZpbmUgREJHCTEKLQotLy8KLS8vICBNQUNSTyBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0vLwotCi0jaWZkZWYgREJHCi1leHRlcm4gVUxPTkcgICAgUlREZWJ1Z0xldmVsOwotCi0jZGVmaW5lIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KSAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKExldmVsIDw9IFJURGVidWdMZXZlbCkgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHByaW50ayBGbXQ7ICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIERCR1BSSU5UKExldmVsLCBGbXQpICAgIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KQotCi0KLSNkZWZpbmUgREJHUFJJTlRfRVJSKEZtdCkgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIkVSUk9SISEhICIpOyAgICAgICAgICBcCi0gICAgcHJpbnRrIEZtdDsgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgREJHUFJJTlRfUyhTdGF0dXMsIEZtdCkJCVwKLXsJCQkJCQkJCQlcCi0JcHJpbnRrIEZtdDsJCQkJCVwKLX0KLQotCi0jZWxzZQotI2RlZmluZSBEQkdQUklOVChMZXZlbCwgRm10KQotI2RlZmluZSBEQkdQUklOVF9SQVcoTGV2ZWwsIEZtdCkKLSNkZWZpbmUgREJHUFJJTlRfUyhTdGF0dXMsIEZtdCkKLSNkZWZpbmUgREJHUFJJTlRfRVJSKEZtdCkKLSNlbmRpZgotCi0KLS8vCi0vLyAgc3Bpbl9sb2NrIGVuaGFuY2VkIGZvciBOZXN0ZWQgc3BpbiBsb2NrCi0vLworLyogKi8KKy8qICBzcGluX2xvY2sgZW5oYW5jZWQgZm9yIE5lc3RlZCBzcGluIGxvY2sgKi8KKy8qICovCiAjZGVmaW5lIE5kaXNBbGxvY2F0ZVNwaW5Mb2NrKF9fbG9jaykgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHNwaW5fbG9ja19pbml0KChzcGlubG9ja190ICopKF9fbG9jaykpOyAgICAgICAgICAgICAgIFwKIH0KIAogI2RlZmluZSBOZGlzRnJlZVNwaW5Mb2NrKGxvY2spICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KKwlkb3t9d2hpbGUoMCkKIAogI2RlZmluZSBSVE1QX1NFTV9MT0NLKF9fbG9jaykJCQkJCVwKIHsJCQkJCQkJCQkJCQlcCi0Jc3Bpbl9sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCQlcCisJc3Bpbl9sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJXAogfQogCiAjZGVmaW5lIFJUTVBfU0VNX1VOTE9DSyhfX2xvY2spCQkJCQlcCiB7CQkJCQkJCQkJCQkJXAotCXNwaW5fdW5sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCQlcCisJc3Bpbl91bmxvY2tfYmgoKHNwaW5sb2NrX3QgKikoX19sb2NrKSk7CQlcCiB9CiAKLS8vIHNhbXBsZSwgdXNlIHNlbWFwaG9yZSBsb2NrIHRvIHJlcGxhY2UgSVJRIGxvY2ssIDIwMDcvMTEvMTUKKy8qIHNhbXBsZSwgdXNlIHNlbWFwaG9yZSBsb2NrIHRvIHJlcGxhY2UgSVJRIGxvY2ssIDIwMDcvMTEvMTUgKi8KICNkZWZpbmUgUlRNUF9JUlFfTE9DSyhfX2xvY2ssIF9faXJxZmxhZ3MpCQkJXAogewkJCQkJCQkJCQkJCQlcCiAJX19pcnFmbGFncyA9IDA7CQkJCQkJCQkJXApAQCAtNDA0LDcgKzIyOSw3IEBACiAKICNkZWZpbmUgUlRNUF9JUlFfVU5MT0NLKF9fbG9jaywgX19pcnFmbGFnKQkJCVwKIHsJCQkJCQkJCQkJCQkJXAotCXBBZC0+aXJxX2Rpc2FibGVkICY9IDA7IFwKKwlwQWQtPmlycV9kaXNhYmxlZCAmPSAwOwkJCQkJCQlcCiAJc3Bpbl91bmxvY2tfYmgoKHNwaW5sb2NrX3QgKikoX19sb2NrKSk7CQkJXAogfQogCkBAIC00MTgsNzUgKzI0Myw4IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgoc3BpbmxvY2tfdCAqKShfX2xvY2spLCAoKHVuc2lnbmVkIGxvbmcpX19pcnFmbGFnKSk7CVwKIH0KIAotI2lmZGVmIFJUMjg2MAotLy9QYXRjaCBmb3IgQVNJQyB0dXJzdCByZWFkL3dyaXRlIGJ1ZywgbmVlZHMgdG8gcmVtb3ZlIGFmdGVyIG1ldGVsIGZpeAotI2RlZmluZSBSVE1QX0lPX1JFQUQzMihfQSwgX1IsIF9wVikJCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJXAotICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSkpOwkJXAotCQkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpKTsJCQlcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlCQkJCQkJCQkJCQkJCQkJXAotCQkqX3BWID0gMDsJCQkJCQkJCQkJCQkJXAotfQotI2RlZmluZSBSVE1QX0lPX0ZPUkNFX1JFQUQzMihfQSwgX1IsIF9wVikJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJXAotCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCVwKLQkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpKTsJCQlcCi19Ci0jZGVmaW5lIFJUTVBfSU9fUkVBRDgoX0EsIF9SLCBfcFYpCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCVwKLQkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKSk7CQkJXAotCSgqX3BWID0gcmVhZGIoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSkpOwkJCQlcCi19Ci0jZGVmaW5lIFJUTVBfSU9fV1JJVEUzMihfQSwgX1IsIF9WKQkJCQkJCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLSAgICBpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JVUlOVAlWYWw7CQkJCQkJCQkJCQkJCQkJCVwKLQlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQkJXAotCXdyaXRlbChfViwgKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CQkJCQkJCQlcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLSNkZWZpbmUgUlRNUF9JT19XUklURTgoX0EsIF9SLCBfVikJCQkJCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JVUlOVAlWYWw7CQkJCQkJCQkJCQkJCQkJCVwKLQlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQkJXAotCXdyaXRlYigoX1YpLCAoUFVDSEFSKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJCVwKLX0KLSNkZWZpbmUgUlRNUF9JT19XUklURTE2KF9BLCBfUiwgX1YpCQkJCQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCVVJTlQJVmFsOwkJCQkJCQkJCQkJCQkJCQlcCi0JVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJCVwKLQl3cml0ZXcoKF9WKSwgKFBVU0hPUlQpKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwlcCi19Ci0jZW5kaWYgLyogUlQyODYwICovCi0jaWZkZWYgUlQyODcwCi0vL1BhdGNoIGZvciBBU0lDIHR1cnN0IHJlYWQvd3JpdGUgYnVnLCBuZWVkcyB0byByZW1vdmUgYWZ0ZXIgbWV0ZWwgZml4Ci0jZGVmaW5lIFJUTVBfSU9fUkVBRDMyKF9BLCBfUiwgX3BWKQkJCQkJCQkJXAotCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKF9BLCBfUiwgX3BWKQotCi0jZGVmaW5lIFJUTVBfSU9fUkVBRDgoX0EsIF9SLCBfcFYpCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCVwKLX0KLQotI2RlZmluZSBSVE1QX0lPX1dSSVRFMzIoX0EsIF9SLCBfVikJCQkJCQkJCVwKLQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIoX0EsIF9SLCBfVikKLQotCi0jZGVmaW5lIFJUTVBfSU9fV1JJVEU4KF9BLCBfUiwgX1YpCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCVwKLQlVU0hPUlQJX1ZhbCA9IF9WOwkJCQkJCQkJCQkJXAotCVJUVVNCU2luZ2xlV3JpdGUoX0EsIF9SLCBfVmFsKTsJCQkJCQkJCVwKLX0KLQotCi0jZGVmaW5lIFJUTVBfSU9fV1JJVEUxNihfQSwgX1IsIF9WKQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQlcCi0JUlRVU0JTaW5nbGVXcml0ZShfQSwgX1IsIF9WKTsJCQkJCQkJCVwKLX0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNkZWZpbmUgTmRpc0FjcXVpcmVTcGluTG9jawkJUlRNUF9TRU1fTE9DSworI2RlZmluZSBOZGlzUmVsZWFzZVNwaW5Mb2NrCQlSVE1QX1NFTV9VTkxPQ0sKIAogI2lmbmRlZiB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dAogI2RlZmluZSBfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIHJldCkgXApAQCAtNTE5LDcgKzI3Nyw3MyBAQAogICAgICAgICBfX3JldDsgXAogfSkKICNlbmRpZgotI2RlZmluZSBPTkVfVElDSyAxCisKKyNkZWZpbmUgUlRNUF9TRU1fRVZFTlRfSU5JVF9MT0NLRUQoX3BTZW1hKQlzZW1hX2luaXQoKF9wU2VtYSksIDApCisjZGVmaW5lIFJUTVBfU0VNX0VWRU5UX0lOSVQoX3BTZW1hKQkJCXNlbWFfaW5pdCgoX3BTZW1hKSwgMSkKKyNkZWZpbmUgUlRNUF9TRU1fRVZFTlRfV0FJVChfcFNlbWEsIF9zdGF0dXMpCSgoX3N0YXR1cykgPSBkb3duX2ludGVycnVwdGlibGUoKF9wU2VtYSkpKQorI2RlZmluZSBSVE1QX1NFTV9FVkVOVF9VUChfcFNlbWEpCQkJdXAoX3BTZW1hKQorCisjaWZkZWYgS1RIUkVBRF9TVVBQT1JUCisjZGVmaW5lIFJUTVBfV0FJVF9FVkVOVF9JTlRFUlJVUFRJQkxFKF9wQWQsIF9wVGFzaykgXAoreyBcCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShfcFRhc2stPmt0aHJlYWRfcSwgXAorCQkJCQkJCQkgX3BUYXNrLT5rdGhyZWFkX3J1bm5pbmcgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpKTsgXAorCQlfcFRhc2stPmt0aHJlYWRfcnVubmluZyA9IEZBTFNFOyBcCisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIFwKKwkJeyBcCisJCQlSVE1QX1NFVF9GTEFHKF9wQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7IFwKKwkJCWJyZWFrOyBcCisJCX0gXAorfQorI2VuZGlmCisKKyNpZmRlZiBLVEhSRUFEX1NVUFBPUlQKKyNkZWZpbmUgV0FLRV9VUChfcFRhc2spIFwKKwlkb3sgXAorCQlpZiAoKF9wVGFzayktPmt0aHJlYWRfdGFzaykgXAorICAgICAgICB7IFwKKwkJCShfcFRhc2spLT5rdGhyZWFkX3J1bm5pbmcgPSBUUlVFOyBcCisJICAgICAgICB3YWtlX3VwKCYoX3BUYXNrKS0+a3RocmVhZF9xKTsgXAorCQl9IFwKKwl9d2hpbGUoMCkKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU9TIE1lbW9yeSBBY2Nlc3MgcmVsYXRlZCBkYXRhIHN0cnVjdHVyZSBhbmQgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTUVNX0FMTE9DX0ZMQUcgICAgICAoR0ZQX0FUT01JQykJLyooR0ZQX0RNQSB8IEdGUF9BVE9NSUMpICovCisKKyNkZWZpbmUgTmRpc01vdmVNZW1vcnkoRGVzdGluYXRpb24sIFNvdXJjZSwgTGVuZ3RoKSBtZW1tb3ZlKERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkKKyNkZWZpbmUgTmRpc0NvcHlNZW1vcnkoRGVzdGluYXRpb24sIFNvdXJjZSwgTGVuZ3RoKSBtZW1jcHkoRGVzdGluYXRpb24sIFNvdXJjZSwgTGVuZ3RoKQorI2RlZmluZSBOZGlzWmVyb01lbW9yeShEZXN0aW5hdGlvbiwgTGVuZ3RoKSAgICAgICAgIG1lbXNldChEZXN0aW5hdGlvbiwgMCwgTGVuZ3RoKQorI2RlZmluZSBOZGlzRmlsbE1lbW9yeShEZXN0aW5hdGlvbiwgTGVuZ3RoLCBGaWxsKSAgIG1lbXNldChEZXN0aW5hdGlvbiwgRmlsbCwgTGVuZ3RoKQorI2RlZmluZSBOZGlzQ21wTWVtb3J5KERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkgIG1lbWNtcChEZXN0aW5hdGlvbiwgU291cmNlLCBMZW5ndGgpCisjZGVmaW5lIE5kaXNFcXVhbE1lbW9yeShTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpICAgKCFtZW1jbXAoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSkKKyNkZWZpbmUgUlRNUEVxdWFsTWVtb3J5KFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkJKCFtZW1jbXAoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSkKKworI2RlZmluZSBNbG1lQWxsb2NhdGVNZW1vcnkoX3BBZCwgX3BwVkEpCQlvc19hbGxvY19tZW0oX3BBZCwgX3BwVkEsIE1HTVRfRE1BX0JVRkZFUl9TSVpFKQorI2RlZmluZSBNbG1lRnJlZU1lbW9yeShfcEFkLCBfcFZBKQkJCW9zX2ZyZWVfbWVtKF9wQWQsIF9wVkEpCisKKyNkZWZpbmUgQ09QWV9NQUNfQUREUihBZGRyMSwgQWRkcjIpICAgICAgICAgICAgIG1lbWNweSgoQWRkcjEpLCAoQWRkcjIpLCBNQUNfQUREUl9MRU4pCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJT1MgdGFzayByZWxhdGVkIGRhdGEgc3RydWN0dXJlIGFuZCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBSVE1QX09TX01HTVRfVEFTS19GTEFHUwlDTE9ORV9WTQorCisjZGVmaW5lCVRIUkVBRF9QSURfSU5JVF9WQUxVRQlOVUxMCisjZGVmaW5lCUdFVF9QSUQoX3YpCWZpbmRfZ2V0X3BpZCgoX3YpKQorI2RlZmluZQlHRVRfUElEX05VTUJFUihfdikJcGlkX25yKChfdikpCisjZGVmaW5lIENIRUNLX1BJRF9MRUdBTElUWShfcGlkKQlpZiAocGlkX25yKChfcGlkKSkgPiAwKQorI2RlZmluZSBLSUxMX1RIUkVBRF9QSUQoX0EsIF9CLCBfQykJa2lsbF9waWQoKF9BKSwgKF9CKSwgKF9DKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaW1lciByZWxhdGVkIGRlZmluaXRpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgT1NfSFoJCQlIWgorCit0eXBlZGVmIHZvaWQgKCpUSU1FUl9GVU5DVElPTikgKHVuc2lnbmVkIGxvbmcpOworCiAjZGVmaW5lIE9TX1dBSVQoX3RpbWUpIFwKIHsJaW50IF9pOyBcCiAJbG9uZyBfbG9vcCA9ICgoX3RpbWUpLygxMDAwL09TX0haKSkgPiAwID8gKChfdGltZSkvKDEwMDAvT1NfSFopKSA6IDE7XApAQCAtNTI4LDcxICszNTIsMjkyIEBACiAJZm9yIChfaT0wOyBfaTwoX2xvb3ApOyBfaSsrKSBcCiAJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KF93YWl0LCAwLCBPTkVfVElDSyk7IH0KIAorI2RlZmluZSBSVE1QX1RJTUVfQUZURVIoYSxiKQkJXAorCSh0eXBlY2hlY2sodW5zaWduZWQgbG9uZywgKHVuc2lnbmVkIGxvbmcpYSkgJiYgXAorCSB0eXBlY2hlY2sodW5zaWduZWQgbG9uZywgKHVuc2lnbmVkIGxvbmcpYikgJiYgXAorCSAoKGxvbmcpKGIpIC0gKGxvbmcpKGEpIDwgMCkpCiAKLXR5cGVkZWYgdm9pZCAoKlRJTUVSX0ZVTkNUSU9OKSh1bnNpZ25lZCBsb25nKTsKKyNkZWZpbmUgUlRNUF9USU1FX0FGVEVSX0VRKGEsYikJXAorCSh0eXBlY2hlY2sodW5zaWduZWQgbG9uZywgKHVuc2lnbmVkIGxvbmcpYSkgJiYgXAorCSB0eXBlY2hlY2sodW5zaWduZWQgbG9uZywgKHVuc2lnbmVkIGxvbmcpYikgJiYgXAorCSAoKGxvbmcpKGEpIC0gKGxvbmcpKGIpID49IDApKQorI2RlZmluZSBSVE1QX1RJTUVfQkVGT1JFKGEsYikJUlRNUF9USU1FX0FGVEVSX0VRKGIsYSkKIAotI2RlZmluZSBDT1BZX01BQ19BRERSKEFkZHIxLCBBZGRyMikgICAgICAgICAgICAgbWVtY3B5KChBZGRyMSksIChBZGRyMiksIE1BQ19BRERSX0xFTikKKyNkZWZpbmUgT05FX1RJQ0sgMQogCi0jZGVmaW5lIE1sbWVBbGxvY2F0ZU1lbW9yeShfcEFkLCBfcHBWQSkgb3NfYWxsb2NfbWVtKF9wQWQsIF9wcFZBLCBNR01UX0RNQV9CVUZGRVJfU0laRSkKLSNkZWZpbmUgTWxtZUZyZWVNZW1vcnkoX3BBZCwgX3BWQSkgICAgIG9zX2ZyZWVfbWVtKF9wQWQsIF9wVkEpCi0KLSNpZmRlZiBSVDI4NjAKLSNkZWZpbmUgQlVJTERfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJCQkJCQkJCQkJXAotdm9pZCBsaW51eF8jI19mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkJCQkJCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQlQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIgPSAoUFJBTElOS19USU1FUl9TVFJVQ1QpIGRhdGE7CQkJCVwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCV9mdW5jKE5VTEwsIChQVk9JRCkgcFRpbWVyLT5jb29raWUsIE5VTEwsIHBUaW1lcik7IAkJCQkJCQlcCi0JaWYgKHBUaW1lci0+UmVwZWF0KQkJCQkJCQkJCQkJCQkJCVwKLQkJUlRNUF9PU19BZGRfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIHBUaW1lci0+VGltZXJWYWx1ZSk7CQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCBOZGlzR2V0U3lzdGVtVXBUaW1lKHVuc2lnbmVkIGxvbmcgKiB0aW1lKQoreworCSp0aW1lID0gamlmZmllczsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglPUyBzcGVjaWZpYyBjb29raWUgZGF0YSBzdHJ1Y3R1cmUgYmluZGluZyB0byBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBvc19jb29raWUgeworI2lmZGVmIFJUTVBfTUFDX1BDSQorCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwYXJlbnRfcGNpX2RldjsKKwl1MTYgRGV2aWNlSUQ7CisJZG1hX2FkZHJfdCBwQWRfcGE7CisjZW5kaWYJCQkJLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJc3RydWN0IHVzYl9kZXZpY2UgKnBVc2JfRGV2OworI2VuZGlmCQkJCS8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHJ4X2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgbWdtdF9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBhYzBfZG1hX2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgYWMxX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGFjMl9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBhYzNfZG1hX2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGJ0dF90YXNrOworI2lmZGVmIFJUTVBfTUFDX1BDSQorCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBmaWZvX3N0YXRpc3RpY19mdWxsX3Rhc2s7CisjZW5kaWYJCQkJLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IG51bGxfZnJhbWVfY29tcGxldGVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgcnRzX2ZyYW1lX2NvbXBsZXRlX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHBzcG9sbF9mcmFtZV9jb21wbGV0ZV90YXNrOworI2VuZGlmCQkJCS8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisJdW5zaWduZWQgbG9uZyBhcGRfcGlkOwkvKjgwMi4xeCBkYWVtb24gcGlkICovCisJaW50IGlvY3RsX2lmX3R5cGU7CisJaW50IGlvY3RsX2lmOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglPUyBkZWJ1Z2dpbmcgYW5kIHByaW50aW5nIHJlbGF0ZWQgZGVmaW5pdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBSSU5UX01BQyhhZGRyKQlcCisJYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XQorCisjaWZkZWYgREJHCitleHRlcm4gdW5zaWduZWQgbG9uZyBSVERlYnVnTGV2ZWw7CisKKyNkZWZpbmUgREJHUFJJTlRfUkFXKExldmVsLCBGbXQpICAgIFwKK2RveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChMZXZlbCA8PSBSVERlYnVnTGV2ZWwpICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGsgRm10OyAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK313aGlsZSgwKQorCisjZGVmaW5lIERCR1BSSU5UKExldmVsLCBGbXQpICAgIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KQorCisjZGVmaW5lIERCR1BSSU5UX0VSUihGbXQpICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHJpbnRrKCJFUlJPUiEgIik7ICAgICAgICAgIFwKKyAgICBwcmludGsgRm10OyAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBEQkdQUklOVF9TKFN0YXR1cywgRm10KQkJXAorewkJCQkJCQkJCVwKKwlwcmludGsgRm10OwkJCQkJXAorfQorCisjZWxzZQorI2RlZmluZSBEQkdQUklOVChMZXZlbCwgRm10KQorI2RlZmluZSBEQkdQUklOVF9SQVcoTGV2ZWwsIEZtdCkKKyNkZWZpbmUgREJHUFJJTlRfUyhTdGF0dXMsIEZtdCkKKyNkZWZpbmUgREJHUFJJTlRfRVJSKEZtdCkKICNlbmRpZgotI2lmZGVmIFJUMjg3MAotI2RlZmluZSBCVUlMRF9USU1FUl9GVU5DVElPTihfZnVuYykJCQkJCQkJCQkJCQkJXAotdm9pZCBsaW51eF8jI19mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkJCQkJCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCVBSQUxJTktfVElNRVJfU1RSVUNUCV9wVGltZXIgPSAoUFJBTElOS19USU1FUl9TVFJVQ1QpZGF0YTsJCQkJCVwKLQlSVDI4NzBfVElNRVJfRU5UUlkJCSpfcFFOb2RlOwkJCQkJCQkJCQkJCVwKLQlSVE1QX0FEQVBURVIJCQkqX3BBZDsJCQkJCQkJCQkJCQkJXAotCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JX3BUaW1lci0+aGFuZGxlID0gX2Z1bmM7CQkJCQkJCQkJCQkJCQkJXAotCV9wQWQgPSAoUlRNUF9BREFQVEVSICopX3BUaW1lci0+cEFkOwkJCQkJCQkJCQkJCVwKLQlfcFFOb2RlID0gUlQyODcwX1RpbWVyUV9JbnNlcnQoX3BBZCwgX3BUaW1lcik7IAkJCQkJCQkJCVwKLQlpZiAoKF9wUU5vZGUgPT0gTlVMTCkgJiYgKF9wQWQtPlRpbWVyUS5zdGF0dXMgJiBSVDI4NzBfVEhSRUFEX0NBTl9ET19JTlNFUlQpKQlcCi0JCVJUTVBfT1NfQWRkX1RpbWVyKCZfcFRpbWVyLT5UaW1lck9iaiwgSFopOyAgICAgICAgICAgICAgIAkJCQkJXAorCisjZGVmaW5lIEFTU0VSVCh4KQorCit2b2lkIGhleF9kdW1wKGNoYXIgKnN0ciwgdW5zaWduZWQgY2hhciAqcFNyY0J1ZlZBLCB1bnNpZ25lZCBpbnQgU3JjQnVmTGVuKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCVRoZSBmb2xsb3dpbmcgY29kZSBhcmUgbm90IHJldmlzZWQsIHRlbXBvcmFyeSBwdXQgaXQgaGVyZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERldmljZSBETUEgQWNjZXNzIHJlbGF0ZWQgZGVmaW5pdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFJUTVBfTUFDX1BDSQorZG1hX2FkZHJfdCBsaW51eF9wY2lfbWFwX3NpbmdsZSh2b2lkICpoYW5kbGUsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCisJCQkJaW50IHNkX2lkeCwgaW50IGRpcmVjdGlvbik7Cit2b2lkIGxpbnV4X3BjaV91bm1hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKKwkJCSAgICBpbnQgZGlyZWN0aW9uKTsKKworI2RlZmluZSBQQ0lfTUFQX1NJTkdMRShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX3NkX2lkeCwgX2RpcikgXAorCWxpbnV4X3BjaV9tYXBfc2luZ2xlKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfc2RfaWR4LCBfZGlyKQorCisjZGVmaW5lIFBDSV9VTk1BUF9TSU5HTEUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9kaXIpIFwKKwlsaW51eF9wY2lfdW5tYXBfc2luZ2xlKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfZGlyKQorCisjZGVmaW5lIFBDSV9BTExPQ19DT05TSVNURU5UKF9wY2lfZGV2LCBfc2l6ZSwgX3B0cikgXAorCXBjaV9hbGxvY19jb25zaXN0ZW50KF9wY2lfZGV2LCBfc2l6ZSwgX3B0cikKKworI2RlZmluZSBQQ0lfRlJFRV9DT05TSVNURU5UKF9wY2lfZGV2LCBfc2l6ZSwgX3ZpcnR1YWxfYWRkciwgX3BoeXNpY2FsX2FkZHIpIFwKKwlwY2lfZnJlZV9jb25zaXN0ZW50KF9wY2lfZGV2LCBfc2l6ZSwgX3ZpcnR1YWxfYWRkciwgX3BoeXNpY2FsX2FkZHIpCisKKyNkZWZpbmUgREVWX0FMTE9DX1NLQihfbGVuZ3RoKSBcCisJZGV2X2FsbG9jX3NrYihfbGVuZ3RoKQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorI2RlZmluZSBQQ0lfTUFQX1NJTkdMRShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX2RpcikgKHVuc2lnbmVkIGxvbmcpMAorCisjZGVmaW5lIFBDSV9VTk1BUF9TSU5HTEUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9kaXIpCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisKKy8qCisgKiB1bnNpZ25lZCBsb25nCisgKiBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdygKKyAqICAgZG1hX2FkZHJfdCAgUGh5c2ljYWxBZGRyZXNzKTsKKyAqLworI2RlZmluZSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhQaHlzaWNhbEFkZHJlc3MpCQkoUGh5c2ljYWxBZGRyZXNzKQorCisvKgorICogdW5zaWduZWQgbG9uZworICogUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKAorICogICBkbWFfYWRkcl90ICBQaHlzaWNhbEFkZHJlc3MpOworICovCisjZGVmaW5lIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChQaHlzaWNhbEFkZHJlc3MpCQkoMCkKKworLyoKKyAqIHZvaWQKKyAqIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KAorICogICBkbWFfYWRkcl90ICBQaHlzaWNhbEFkZHJlc3MsCisgKiAgIHVuc2lnbmVkIGxvbmcgIFZhbHVlKTsKKyAqLworI2RlZmluZSBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhQaHlzaWNhbEFkZHJlc3MsIFZhbHVlKQlcCisJCQlQaHlzaWNhbEFkZHJlc3MgPSBWYWx1ZTsKKworLyoKKyAqIHZvaWQKKyAqIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaCgKKyAqICAgZG1hX2FkZHJfdCAgUGh5c2ljYWxBZGRyZXNzLAorICogICB1bnNpZ25lZCBsb25nICBWYWx1ZSk7CisgKi8KKyNkZWZpbmUgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKFBoeXNpY2FsQWRkcmVzcywgVmFsdWUpCisKKyNkZWZpbmUgTmRpc01JbmRpY2F0ZVN0YXR1cyhfdywgX3gsIF95LCBfeikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZXZpY2UgUmVnaXN0ZXIgSS9PIEFjY2VzcyByZWxhdGVkIGRlZmluaXRpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBSVE1QX01BQ19QQ0kKKy8qUGF0Y2ggZm9yIEFTSUMgdHVyc3QgcmVhZC93cml0ZSBidWcsIG5lZWRzIHRvIHJlbW92ZSBhZnRlciBtZXRlbCBmaXggKi8KKyNkZWZpbmUgUlRNUF9JT19SRUFEMzIoX0EsIF9SLCBfcFYpCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCVwKKyAgICBpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCVwKKwkJKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKSk7CQkJXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZQkJCQkJCQkJCQkJCQkJCVwKKwkJKl9wViA9IDA7CQkJCQkJCQkJCQkJCVwKIH0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KIAorI2RlZmluZSBSVE1QX0lPX0ZPUkNFX1JFQUQzMihfQSwgX1IsIF9wVikJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJXAorCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCVwKKwkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpKTsJCQlcCit9CiAKLSNkZWZpbmUgREVDTEFSRV9USU1FUl9GVU5DVElPTihfZnVuYykJCQlcCi12b2lkIGxpbnV4XyMjX2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKQorI2RlZmluZSBSVE1QX0lPX1JFQUQ4KF9BLCBfUiwgX3BWKQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQlcCisJKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSkpOwkJCVwKKwkoKl9wViA9IHJlYWRiKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpKTsJCQkJXAorfQorI2RlZmluZSBSVE1QX0lPX1dSSVRFMzIoX0EsIF9SLCBfVikJCQkJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisgICAgaWYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXUzMiBWYWw7CQkJCQkJCQkJCQkJCQkJCVwKKwlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQkJXAorCXdyaXRlbCgoX1YpLCAodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJCQkJCQkJCVwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQogCi0jZGVmaW5lIEdFVF9USU1FUl9GVU5DVElPTihfZnVuYykJCQkJXAotCQlsaW51eF8jI19mdW5jCisjZGVmaW5lIFJUTVBfSU9fRk9SQ0VfV1JJVEUzMihfQSwgX1IsIF9WKQkJCQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwl1MzIgVmFsOwkJCQkJCQkJCQkJCQkJCQlcCisJVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJCVwKKwl3cml0ZWwoX1YsICh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwkJCQkJCQkJXAorfQogCi1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKE1sbWVQZXJpb2RpY0V4ZWMpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihNbG1lUnNzaVJlcG9ydEV4ZWMpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCk7Ci1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEFQU0RQZXJpb2RpY0V4ZWMpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihBc2ljUmZUdW5pbmdFeGVjKTsKLSNpZmRlZiBSVDI4NzAKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQmVhY29uVXBkYXRlRXhlYyk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisjaWYgZGVmaW5lZChSQUxJTktfMjg4MCkgfHwgZGVmaW5lZChSQUxJTktfMzA1MikKKyNkZWZpbmUgUlRNUF9JT19XUklURTgoX0EsIF9SLCBfVikgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICBcCisJdW5zaWduZWQgbG9uZyBWYWw7ICAgICAgICAgICAgICAgIFwKKwl1OCBfaTsgICAgICAgICAgICAgICAgXAorCV9pID0gKChfUikgJiAweDMpOyAgICAgICAgICAgICBcCisJVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoKF9SKSAtIF9pKSkpOyAgIFwKKwlWYWwgPSBWYWwgJiAofigweDAwMDAwMGZmIDw8ICgoX2kpKjgpKSk7ICAgICAgICAgXAorCVZhbCA9IFZhbCB8ICgodW5zaWduZWQgbG9uZykoX1YpIDw8ICgoX2kpKjgpKTsgICAgICAgICBcCisJd3JpdGVsKChWYWwpLCAodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArICgoX1IpIC0gX2kpKSk7ICAgIFwKK30KKyNlbHNlCisjZGVmaW5lIFJUTVBfSU9fV1JJVEU4KF9BLCBfUiwgX1YpCQkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCXUzMiBWYWw7CQkJCQkJCQkJCQkJCQkJCVwKKwlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQkJXAorCXdyaXRlYigoX1YpLCAodTggKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CQlcCit9CisjZW5kaWYgLyogI2lmIGRlZmluZWQoQlJDTV82MzU4KSB8fCBkZWZpbmVkKFJBTElOS18yODgwKSAvLyAqLwogCi1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblRpbWVvdXQpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihTY2FuVGltZW91dCk7Ci1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXNzb2NUaW1lb3V0KTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oUmVhc3NvY1RpbWVvdXQpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihMaW5rRG93bkV4ZWMpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihQc1BvbGxXYWtlRXhlYyk7Ci1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFJhZGlvT25FeGVjKTsKKyNkZWZpbmUgUlRNUF9JT19XUklURTE2KF9BLCBfUiwgX1YpCQkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCXUzMiBWYWw7CQkJCQkJCQkJCQkJCQkJCVwKKwlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQkJXAorCXdyaXRldygoX1YpLCAodTE2ICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwlcCit9CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisvKlBhdGNoIGZvciBBU0lDIHR1cnN0IHJlYWQvd3JpdGUgYnVnLCBuZWVkcyB0byByZW1vdmUgYWZ0ZXIgbWV0ZWwgZml4ICovCisjZGVmaW5lIFJUTVBfSU9fUkVBRDMyKF9BLCBfUiwgX3BWKQkJCQkJCQkJXAorCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKChfQSksIChfUiksICh1MzIgKikoX3BWKSkKIAotdm9pZCBSVE1QX0dldEN1cnJlbnRTeXN0ZW1UaW1lKExBUkdFX0lOVEVHRVIgKnRpbWUpOworI2RlZmluZSBSVE1QX0lPX1JFQUQ4KF9BLCBfUiwgX3BWKQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQlcCit9CiAKKyNkZWZpbmUgUlRNUF9JT19XUklURTMyKF9BLCBfUiwgX1YpCQkJCQkJCQlcCisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKChfQSksIChfUiksICh1MzIpKF9WKSkKKworI2RlZmluZSBSVE1QX0lPX1dSSVRFOChfQSwgX1IsIF9WKQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQlcCisJdTE2CV9WYWwgPSBfVjsJCQkJCQkJCQkJCVwKKwlSVFVTQlNpbmdsZVdyaXRlKChfQSksIChfUiksICh1MTYpKF9WYWwpKTsJCQkJCQkJCVwKK30KKworI2RlZmluZSBSVE1QX0lPX1dSSVRFMTYoX0EsIF9SLCBfVikJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJXAorCVJUVVNCU2luZ2xlV3JpdGUoKF9BKSwgKF9SKSwgKHUxNikoX1YpKTsJCQkJCQkJCVwKK30KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOZXR3b3JrIFJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmUgYW5kIG1hcmNvIGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBLVFNSQ19ORElTICAgICAgICAgICAgIDB4N2YKKyNkZWZpbmUgUEtUU1JDX0RSSVZFUiAgICAgICAgICAgMHgwZgorCisjZGVmaW5lIFJUTVBfT1NfTkVUREVWX1NFVF9QUklWKF9wTmV0RGV2LCBfcFByaXYpCSgoX3BOZXREZXYpLT5tbF9wcml2ID0gKF9wUHJpdikpCisjZGVmaW5lIFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKF9wTmV0RGV2KQkJKChfcE5ldERldiktPm1sX3ByaXYpCisjZGVmaW5lIFJUTVBfT1NfTkVUREVWX0dFVF9ERVZOQU1FKF9wTmV0RGV2KQkoKF9wTmV0RGV2KS0+bmFtZSkKKyNkZWZpbmUgUlRNUF9PU19ORVRERVZfR0VUX1BIWUFERFIoX1BORVRERVYpCSgoX1BORVRERVYpLT5kZXZfYWRkcikKKworI2RlZmluZSBSVE1QX09TX05FVERFVl9TVEFSVF9RVUVVRShfcE5ldERldikJbmV0aWZfc3RhcnRfcXVldWUoKF9wTmV0RGV2KSkKKyNkZWZpbmUgUlRNUF9PU19ORVRERVZfU1RPUF9RVUVVRShfcE5ldERldikJbmV0aWZfc3RvcF9xdWV1ZSgoX3BOZXREZXYpKQorI2RlZmluZSBSVE1QX09TX05FVERFVl9XQUtFX1FVRVVFKF9wTmV0RGV2KQluZXRpZl93YWtlX3F1ZXVlKChfcE5ldERldikpCisjZGVmaW5lIFJUTVBfT1NfTkVUREVWX0NBUlJJRVJfT0ZGKF9wTmV0RGV2KQluZXRpZl9jYXJyaWVyX29mZigoX3BOZXREZXYpKQorCisjZGVmaW5lIFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpIFwKKwkodm9pZCAqKShwRW50cnkpCisKKyNkZWZpbmUgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpIFwKKwkoc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICopKHBQYWNrZXQpCisKKyNkZWZpbmUgR0VUX1NHX0xJU1RfRlJPTV9QQUNLRVQoX3AsIF9zYykJXAorICAgIHJ0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KF9wLCBfc2MpCisKKyNkZWZpbmUgUkVMRUFTRV9ORElTX1BBQ0tFVChfcEFkLCBfcFBhY2tldCwgX1N0YXR1cykgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUlRNUEZyZWVOZGlzUGFja2V0KF9wQWQsIF9wUGFja2V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KIAogLyoKICAqIHBhY2tldCBoZWxwZXIKQEAgLTYwMCwxNiArNjQ1LDIyIEBACiAgKiAgICAgICAgICAgICBvcyBwYWNrZXQgdG8gcnQgcGFja2V0CiAgKi8KICNkZWZpbmUgUlRQS1RfVE9fT1NQS1QoX3ApCQkoKHN0cnVjdCBza19idWZmICopKF9wKSkKLSNkZWZpbmUgT1NQS1RfVE9fUlRQS1QoX3ApCQkoKFBORElTX1BBQ0tFVCkoX3ApKQorI2RlZmluZSBPU1BLVF9UT19SVFBLVChfcCkJCSgodm9pZCAqKShfcCkpCiAKICNkZWZpbmUgR0VUX09TX1BLVF9EQVRBUFRSKF9wa3QpIFwKIAkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5kYXRhKQorI2RlZmluZSBTRVRfT1NfUEtUX0RBVEFQVFIoX3BrdCwgX2RhdGFQdHIpCVwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5kYXRhKSA9IChfZGF0YVB0cikKIAogI2RlZmluZSBHRVRfT1NfUEtUX0xFTihfcGt0KSBcCiAJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+bGVuKQorI2RlZmluZSBTRVRfT1NfUEtUX0xFTihfcGt0LCBfbGVuKQlcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+bGVuKSA9IChfbGVuKQogCiAjZGVmaW5lIEdFVF9PU19QS1RfREFUQVRBSUwoX3BrdCkgXAogCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPnRhaWwpCisjZGVmaW5lIFNFVF9PU19QS1RfREFUQVRBSUwoX3BrdCwgX3N0YXJ0LCBfbGVuKQlcCisJCSgoUlRQS1RfVE9fT1NQS1QoX3BrdCkpLT50YWlsKSA9ICh1OCAqKSgoX3N0YXJ0KSArIChfbGVuKSkKIAogI2RlZmluZSBHRVRfT1NfUEtUX0hFQUQoX3BrdCkgXAogCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmhlYWQpCkBAIC02MTksNiArNjcwLDggQEAKIAogI2RlZmluZSBHRVRfT1NfUEtUX05FVERFVihfcGt0KSBcCiAJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZGV2KQorI2RlZmluZSBTRVRfT1NfUEtUX05FVERFVihfcGt0LCBfcE5ldERldikJXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmRldikgPSAoX3BOZXREZXYpCiAKICNkZWZpbmUgR0VUX09TX1BLVF9UWVBFKF9wa3QpIFwKIAkJKFJUUEtUX1RPX09TUEtUKF9wa3QpKQpAQCAtNjI2LDYgKzY3OSw3IEBACiAjZGVmaW5lIEdFVF9PU19QS1RfTkVYVChfcGt0KSBcCiAJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+bmV4dCkKIAorI2RlZmluZSBPU19QS1RfQ0xPTkVEKF9wa3QpCQlza2JfY2xvbmVkKFJUUEtUX1RPX09TUEtUKF9wa3QpKQogCiAjZGVmaW5lIE9TX05UT0hTKF9WYWwpIFwKIAkJKG50b2hzKF9WYWwpKQpAQCAtNjM2LDU1ICs2OTAsMzYgQEAKICNkZWZpbmUgT1NfSFRPTkwoX1ZhbCkgXAogCQkoaHRvbmwoX1ZhbCkpCiAKLS8qIHN0YXRpc3RpY3MgY291bnRlciAqLwotI2RlZmluZSBTVEFUU19JTkNfUlhfUEFDS0VUUyhfcEFkLCBfZGV2KQotI2RlZmluZSBTVEFUU19JTkNfVFhfUEFDS0VUUyhfcEFkLCBfZGV2KQotCi0jZGVmaW5lIFNUQVRTX0lOQ19SWF9CWVRFU1MoX3BBZCwgX2RldiwgbGVuKQotI2RlZmluZSBTVEFUU19JTkNfVFhfQllURVNTKF9wQWQsIF9kZXYsIGxlbikKLQotI2RlZmluZSBTVEFUU19JTkNfUlhfRVJST1JTKF9wQWQsIF9kZXYpCi0jZGVmaW5lIFNUQVRTX0lOQ19UWF9FUlJPUlMoX3BBZCwgX2RldikKLQotI2RlZmluZSBTVEFUU19JTkNfUlhfRFJPUFBFRChfcEFkLCBfZGV2KQotI2RlZmluZSBTVEFUU19JTkNfVFhfRFJPUFBFRChfcEFkLCBfZGV2KQotCi0KICNkZWZpbmUgQ0JfT0ZGICAxMAogCi0KLS8vICAgY2hlY2sgRERLIE5ESVNfUEFDS0VUIGRhdGEgc3RydWN0dXJlIGFuZCBmaW5kIG91dCBvbmx5IE1pbmlwb3J0UmVzZXJ2ZWRFeFswLi43XSBjYW4gYmUgdXNlZCBieSBvdXIgZHJpdmVyIHdpdGhvdXQKLS8vICAgYW1iaWd1aXR5LiBGaWVsZHMgYWZ0ZXIgcFBhY2tldC0+TWluaXBvcnRSZXNlcnZlZEV4WzhdIG1heSBiZSB1c2VkIGJ5IG90aGVyIHdyYXBwZXIgbGF5ZXIgdGh1cyBjcmFzaGVzIHRoZSBkcml2ZXIKLS8vCi0KLS8vIFVzZXIgUHJpb3JpdHkKKy8qIFVzZXIgUHJpb3JpdHkgKi8KICNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1VQKF9wLCBfcHJpbykJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMF0gPSBfcHJpbykKICNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1VQKF9wKQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzBdKQogCi0vLyBGcmFnbWVudCAjCisvKiBGcmFnbWVudCAjICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9GUkFHTUVOVFMoX3AsIF9udW0pCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMV0gPSBfbnVtKQogI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKF9wKQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxXSkKIAotLy8gMHgwIH4weDdmOiBUWCB0byBBUCdzIG93biBCU1Mgd2hpY2ggaGFzIHRoZSBzcGVjaWZpZWQgQUlELiBpZiBBSUQ+MTI3LCBzZXQgYml0IDcgaW4gUlRNUF9TRVRfUEFDS0VUX0VNQUNUQUIgdG9vLgotLy8odGhpcyB2YWx1ZSBhbHNvIGFzIE1BQyhvbi1jaGlwIFdDSUQpIHRhYmxlIGluZGV4KQotLy8gMHg4MH4weGZmOiBUWCB0byBhIFdEUyBsaW5rLiBiMH42OiBXRFMgaW5kZXgKKy8qIDB4MCB+MHg3ZjogVFggdG8gQVAncyBvd24gQlNTIHdoaWNoIGhhcyB0aGUgc3BlY2lmaWVkIEFJRC4gaWYgQUlEPjEyNywgc2V0IGJpdCA3IGluIFJUTVBfU0VUX1BBQ0tFVF9FTUFDVEFCIHRvby4gKi8KKy8qKHRoaXMgdmFsdWUgYWxzbyBhcyBNQUMob24tY2hpcCBXQ0lEKSB0YWJsZSBpbmRleCkgKi8KKy8qIDB4ODB+MHhmZjogVFggdG8gYSBXRFMgbGluay4gYjB+NjogV0RTIGluZGV4ICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9XQ0lEKF9wLCBfd2RzaWR4KQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzJdID0gX3dkc2lkeCkKLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1dDSUQoX3ApICAgICAgICAgIAkJKChVQ0hBUikoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMl0pKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfV0NJRChfcCkgICAgICAgICAgCQkoKHU4KShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisyXSkpCiAKLS8vIDB4ZmY6IFBLVFNSQ19ORElTLCBvdGhlcnM6IGxvY2FsIFRYIGJ1ZmZlciBpbmRleC4gVGhpcyB2YWx1ZSBhZmZlY3RzIGhvdyB0byBhIHBhY2tldAorLyogMHhmZjogUEtUU1JDX05ESVMsIG90aGVyczogbG9jYWwgVFggYnVmZmVyIGluZGV4LiBUaGlzIHZhbHVlIGFmZmVjdHMgaG93IHRvIGEgcGFja2V0ICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoX3AsIF9wa3RzcmMpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrM10gPSBfcGt0c3JjKQogI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfU09VUkNFKF9wKSAgICAgICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRiszXSkKIAotLy8gUlRTL0NUUy10by1zZWxmIHByb3RlY3Rpb24gbWV0aG9kCisvKiBSVFMvQ1RTLXRvLXNlbGYgcHJvdGVjdGlvbiBtZXRob2QgKi8KICNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1JUUyhfcCwgX251bSkgICAgICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis0XSA9IF9udW0pCiAjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9SVFMoX3ApICAgICAgICAgIAkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzRdKQotLy8gc2VlIFJUTVBfUyhHKUVUX1BBQ0tFVF9FTUFDVEFCCisvKiBzZWUgUlRNUF9TKEcpRVRfUEFDS0VUX0VNQUNUQUIgKi8KIAotLy8gVFggcmF0ZSBpbmRleAorLyogVFggcmF0ZSBpbmRleCAqLwogI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfVFhSQVRFKF9wLCBfcmF0ZSkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis1XSA9IF9yYXRlKQogI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfVFhSQVRFKF9wKQkJICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis1XSkKIAotLy8gRnJvbSB3aGljaCBJbnRlcmZhY2UKKy8qIEZyb20gd2hpY2ggSW50ZXJmYWNlICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9JRihfcCwgX2lmZHgpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNl0gPSBfaWZkeCkKICNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0lGKF9wKQkJICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis2XSkKICNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKF9wLCBfYnNzKQkJUlRNUF9TRVRfUEFDS0VUX0lGKChfcCksIChfYnNzKSkKQEAgLTY5NywxMCArNzMyLDkgQEAKICNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX01PUkVEQVRBKF9wLCBfbW9yZWJpdCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis3XSA9IF9tb3JlYml0KQogI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTU9SRURBVEEoX3ApCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis3XSkKIAotCi0vLwotLy8JU2VwY2lmaWMgUGFrY2V0IFR5cGUgZGVmaW5pdGlvbgotLy8KKy8qICovCisvKiAgICAgIFNlcGNpZmljIFBha2NldCBUeXBlIGRlZmluaXRpb24gKi8KKy8qICovCiAjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0NCX09GRlNFVAkxMQogCiAjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1AJCTB4MDEKQEAgLTcxMCwxMCArNzQ0LDEwIEBACiAjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX1ZMQU4JCTB4MTAKICNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfTExDU05BUAkweDIwCiAKLS8vU3BlY2lmaWMKKy8qU3BlY2lmaWMgKi8KICNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1NQRUNJRklDKF9wLCBfZmxnKQkgICAJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSA9IF9mbGcpCiAKLS8vREhDUAorLypESENQICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ESENQKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCiAJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKIAkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKQEAgLTcyMyw3ICs3NTcsNyBAQAogCQkJfXdoaWxlKDApCiAjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9ESENQKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1ApCiAKLS8vRUFQT0wKKy8qRUFQT0wgKi8KICNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0VBUE9MKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCiAJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKIAkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKQEAgLTczMyw3ICs3NjcsNyBAQAogCQkJfXdoaWxlKDApCiAjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9FQVBPTChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTCkKIAotLy9XQUkKKy8qV0FJICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9XQUkoX3AsIF9mbGcpICAgCQkJCQkJCQkJCQkJCVwKIAkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAogCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXApAQCAtNzQ1LDcgKzc3OSw3IEBACiAKICNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgKFJUTVBfUEFDS0VUX1NQRUNJRklDX0VBUE9MIHwgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUCB8IFJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSSkpCiAKLS8vVkxBTgorLypWTEFOICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9WTEFOKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCiAJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKIAkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKQEAgLTc1NSw3ICs3ODksNyBAQAogCQkJfXdoaWxlKDApCiAjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9WTEFOKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX1ZMQU4pCiAKLS8vTExDL1NOQVAKKy8qTExDL1NOQVAgKi8KICNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0xMQ1NOQVAoX3AsIF9mbGcpICAgCQkJCQkJCQkJCQkJCVwKIAkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAogCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXApAQCAtNzY2LDcgKzgwMCw3IEBACiAKICNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0xMQ1NOQVAoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfTExDU05BUCkKIAotLy8gSVAKKy8qIElQICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9JUFY0KF9wLCBfZmxnKQkJCQkJCQkJCQkJCQkJXAogCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCiAJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCkBAIC03NzcsMTQyICs4MTEsMzUgQEAKIAogI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfSVBWNChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19JUFY0KQogCi0KLS8vIElmIHRoaXMgZmxhZyBpcyBzZXQsIGl0IGluZGljYXRlcyB0aGF0IHRoaXMgRUFQb0wgZnJhbWUgTVVTVCBiZSBjbGVhci4KKy8qIElmIHRoaXMgZmxhZyBpcyBzZXQsIGl0IGluZGljYXRlcyB0aGF0IHRoaXMgRUFQb0wgZnJhbWUgTVVTVCBiZSBjbGVhci4gKi8KICNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShfcCwgX2ZsZykgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTJdID0gX2ZsZykKICNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShfcCkgICAgICAgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTJdKQogCisvKiB1c2UgYml0MyBvZiBjYltDQl9PRkYrMTZdICovCisKICNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUXzVWVChfcCwgX2ZsZykgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMjJdID0gX2ZsZykKICNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUXzVWVChfcCkgICAgICAgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMjJdKQogCi0jaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCi0jZGVmaW5lIEJSSURHRV9UQUcgMHgzNTU2NDI1MiAgICAvLyBkZXBlbmRzIG9uIDVWVCBkZWZpbmUgaW4gYnJfaW5wdXQuYwotI2VuZGlmCisvKiBNYXggc2tiLT5jYiA9IDQ4QiA9IFtDQl9PRkYrMzhdICovCiAKLQotI2RlZmluZSBORElTX1NFVF9QQUNLRVRfU1RBVFVTKF9wLCBfc3RhdHVzKQotCi0KLSNkZWZpbmUgR0VUX1NHX0xJU1RfRlJPTV9QQUNLRVQoX3AsIF9zYykJXAotICAgIHJ0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KF9wLCBfc2MpCi0KLSNkZWZpbmUgTmRpc01vdmVNZW1vcnkoRGVzdGluYXRpb24sIFNvdXJjZSwgTGVuZ3RoKSBtZW1tb3ZlKERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkKLSNkZWZpbmUgTmRpc1plcm9NZW1vcnkoRGVzdGluYXRpb24sIExlbmd0aCkgICAgICAgICBtZW1zZXQoRGVzdGluYXRpb24sIDAsIExlbmd0aCkKLSNkZWZpbmUgTmRpc0ZpbGxNZW1vcnkoRGVzdGluYXRpb24sIExlbmd0aCwgRmlsbCkgICBtZW1zZXQoRGVzdGluYXRpb24sIEZpbGwsIExlbmd0aCkKLSNkZWZpbmUgTmRpc0VxdWFsTWVtb3J5KFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkgICAoIW1lbWNtcChTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpKQotI2RlZmluZSBSVE1QRXF1YWxNZW1vcnkoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKQkoIW1lbWNtcChTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpKQotCi0KLSNkZWZpbmUgUlRNUF9JTkNfUkVGKF9BKQkJMAotI2RlZmluZSBSVE1QX0RFQ19SRUYoX0EpCQkwCi0jZGVmaW5lIFJUTVBfR0VUX1JFRihfQSkJCTAKLQotCi0KLS8qCi0gKiBVTE9ORwotICogUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3coCi0gKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzKTsKLSAqLwotI2RlZmluZSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhQaHlzaWNhbEFkZHJlc3MpCQkoUGh5c2ljYWxBZGRyZXNzKQotCi0vKgotICogVUxPTkcKLSAqIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaCgKLSAqICAgSU4gTkRJU19QSFlTSUNBTF9BRERSRVNTICBQaHlzaWNhbEFkZHJlc3MpOwotICovCi0jZGVmaW5lIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChQaHlzaWNhbEFkZHJlc3MpCQkoMCkKLQotLyoKLSAqIFZPSUQKLSAqIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KAotICogICBJTiBORElTX1BIWVNJQ0FMX0FERFJFU1MgIFBoeXNpY2FsQWRkcmVzcywKLSAqICAgSU4gVUxPTkcgIFZhbHVlKTsKLSAqLwotI2RlZmluZSBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhQaHlzaWNhbEFkZHJlc3MsIFZhbHVlKQlcCi0JCQlQaHlzaWNhbEFkZHJlc3MgPSBWYWx1ZTsKLQotLyoKLSAqIFZPSUQKLSAqIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaCgKLSAqICAgSU4gTkRJU19QSFlTSUNBTF9BRERSRVNTICBQaHlzaWNhbEFkZHJlc3MsCi0gKiAgIElOIFVMT05HICBWYWx1ZSk7Ci0gKi8KLSNkZWZpbmUgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKFBoeXNpY2FsQWRkcmVzcywgVmFsdWUpCi0KLQotLy9DT05UQUlOSU5HX1JFQ09SRChwRW50cnksIE5ESVNfUEFDS0VULCBNaW5pcG9ydFJlc2VydmVkRXgpOwotI2RlZmluZSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KSBcCi0JKFBORElTX1BBQ0tFVCkocEVudHJ5KQotCi0jZGVmaW5lIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSBcCi0JKFBRVUVVRV9FTlRSWSkocFBhY2tldCkKLQotCi0jaWZuZGVmIENPTlRBSU5JTkdfUkVDT1JECi0jZGVmaW5lIENPTlRBSU5JTkdfUkVDT1JEKGFkZHJlc3MsIHR5cGUsIGZpZWxkKQkJCVwKLSgodHlwZSAqKSgoUENIQVIpKGFkZHJlc3MpIC0gb2Zmc2V0b2YodHlwZSwgZmllbGQpKSkKLSNlbmRpZgotCi0KLSNkZWZpbmUgUkVMRUFTRV9ORElTX1BBQ0tFVChfcEFkLCBfcFBhY2tldCwgX1N0YXR1cykgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgUlRNUEZyZWVOZGlzUGFja2V0KF9wQWQsIF9wUGFja2V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotCi0jZGVmaW5lIFNXSVRDSF9QaHlBQihfcEFBLCBfcEJCKSAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVMT05HCUFBQmFzZVBhSGlnaDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVUxPTkcJQUFCYXNlUGFMb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVMT05HCUJCQmFzZVBhSGlnaDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVUxPTkcJQkJCYXNlUGFMb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEJCQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChfcEJCKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEJCQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3coX3BCQik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBBQUJhc2VQYUhpZ2ggPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goX3BBQSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBBQUJhc2VQYUxvdyA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KF9wQUEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKF9wQUEsIEJCQmFzZVBhSGlnaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhfcEFBLCBCQkJhc2VQYUxvdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2goX3BCQiwgQUFCYXNlUGFIaWdoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KF9wQkIsIEFBQmFzZVBhTG93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0KLSNkZWZpbmUgTmRpc1dyaXRlRXJyb3JMb2dFbnRyeShfYSwgX2IsIF9jLCBfZCkKLSNkZWZpbmUgTmRpc01BbGxvY2F0ZU1hcFJlZ2lzdGVycyhfYSwgX2IsIF9jLCBfZCwgX2UpCQlORElTX1NUQVRVU19TVUNDRVNTCi0KLQotI2RlZmluZSBOZGlzQWNxdWlyZVNwaW5Mb2NrCQlSVE1QX1NFTV9MT0NLCi0jZGVmaW5lIE5kaXNSZWxlYXNlU3BpbkxvY2sJCVJUTVBfU0VNX1VOTE9DSwotCi1zdGF0aWMgaW5saW5lIHZvaWQgTmRpc0dldFN5c3RlbVVwVGltZShVTE9ORyAqdGltZSkKLXsKLQkqdGltZSA9IGppZmZpZXM7Ci19Ci0KLS8vcFBhY2tldCA9IENPTlRBSU5JTkdfUkVDT1JEKHBFbnRyeSwgTkRJU19QQUNLRVQsIE1pbmlwb3J0UmVzZXJ2ZWRFeCk7Ci0jZGVmaW5lIFFVRVVFX0VOVFJZX1RPX1BLVChwRW50cnkpIFwKLQkJKChQTkRJU19QQUNLRVQpIChwRW50cnkpKQotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU90aGVyIGZ1bmN0aW9uIHByb3RvdHlwZXMgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUlRNUF9HZXRDdXJyZW50U3lzdGVtVGltZShMQVJHRV9JTlRFR0VSICogdGltZSk7CiBpbnQgcnQyOHh4X3BhY2tldF94bWl0KHN0cnVjdCBza19idWZmICpza2IpOwogCisjaWZkZWYgUlRNUF9NQUNfUENJCisvKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KKyNkZWZpbmUgSVJRX0hBTkRMRV9UWVBFICBpcnFyZXR1cm5fdAogCitJUlFfSEFORExFX1RZUEUgcnQyODYwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi12b2lkIHJ0bXBfb3NfdGhyZWFkX2luaXQoUFVDSEFSIHBUaHJlYWROYW1lLCBQVk9JRCBwTm90aWZ5KTsKK2ludCBydDI4eHhfc3RhX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBJTiBPVVQgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CiAKLSNpZmRlZiBSVDI4NjAKLSNpZiAhZGVmaW5lZChQQ0lfQ0FQX0lEX0VYUCkKLSNkZWZpbmUgUENJX0NBUF9JRF9FWFAJCQkgICAgMHgxMAotI2VuZGlmCitleHRlcm4gaW50IHJhX210ZF93cml0ZShpbnQgbnVtLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sIGNvbnN0IHVfY2hhciAqIGJ1Zik7CitleHRlcm4gaW50IHJhX210ZF9yZWFkKGludCBudW0sIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCB1X2NoYXIgKiBidWYpOwogCi0jaWYgIWRlZmluZWQoUENJX0VYUF9MTktDVEwpCi0jZGVmaW5lIFBDSV9FWFBfTE5LQ1RMCQkJICAgIDB4MTAKLSNlbmRpZgorI2RlZmluZSBHRVRfUEFEX0ZST01fTkVUX0RFVihfcEFkLCBfbmV0X2RldikJKF9wQWQpID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKikoX25ldF9kZXYpLT5tbF9wcml2OwogCi0jaWYgIWRlZmluZWQoUENJX0NMQVNTX0JSSURHRV9QQ0kpCi0jZGVmaW5lIFBDSV9DTEFTU19CUklER0VfUENJCQkweDA2MDQKLSNlbmRpZgotCi0jZGVmaW5lIFBDSUJVU19JTlRFTF9WRU5ET1IgICAgICAgICAweDgwODYKLSNlbmRpZgotCisjZW5kaWYgLyogX19SVF9MSU5VWF9IX18gLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbWFpbl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbWFpbl9kZXYuYwppbmRleCAyMmYzN2NmLi5jM2Q5MjgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X21haW5fZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9tYWluX2Rldi5jCkBAIC0zMyw1MyArMzMsMzMgQEAKICAgICBSZXZpc2lvbiBIaXN0b3J5OgogICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CiAgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTYW1wbGUJCU1hci8yMS8wNwkJTWVyZ2UgUlQyODcwIGFuZCBSVDI4NjAgZHJpdmVycy4KICovCiAKICNpbmNsdWRlICJydF9jb25maWcuaCIKIAotI2RlZmluZSBGT1JUWV9NSFpfSU5UT0xFUkFOVF9JTlRFUlZBTAkoNjAqMTAwMCkgLy8gMSBtaW4KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogUHJpdmF0ZSBWYXJpYWJsZXMgVXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLy9zdGF0aWMgUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgUGVyaW9kaWNUaW1lcjsKIAotY2hhciAqbWFjID0gIiI7CQkgICAvLyBkZWZhdWx0IDAwOjAwOjAwOjAwOjAwOjAwCi1jaGFyICpob3N0bmFtZSA9ICIiOwkJICAgLy8gZGVmYXVsdCBDTVBDCi1tb2R1bGVfcGFyYW0gKG1hYywgY2hhcnAsIDApOwotTU9EVUxFX1BBUk1fREVTQyAobWFjLCAicnQyOHh4OiB3aXJlbGVzcyBtYWMgYWRkciIpOwotCitjaGFyICptYWMgPSAiIjsJCS8qIGRlZmF1bHQgMDA6MDA6MDA6MDA6MDA6MDAgKi8KK2NoYXIgKmhvc3RuYW1lID0gIiI7CQkvKiBkZWZhdWx0IENNUEMgKi8KK21vZHVsZV9wYXJhbShtYWMsIGNoYXJwLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWFjLCAicnQyOHh4OiB3aXJlbGVzcyBtYWMgYWRkciIpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBQcm90b3R5cGVzIG9mIEZ1bmN0aW9ucyBVc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1leHRlcm4gQk9PTEVBTiBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQoUFJUTVBfQURBUFRFUiBwQWQsIGludCBudW0pOwotZXh0ZXJuIHZvaWQgYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKFBSVE1QX0FEQVBURVIgcEFkKTsKLWV4dGVybiBORElTX1NUQVRVUyBOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcyhJTiBQUlRNUF9BREFQVEVSIHBBZCk7CiAKLSNpZmRlZiBSVDI4NjAKLWV4dGVybiB2b2lkIGluaXRfdGhyZWFkX3Rhc2soUFJUTVBfQURBUFRFUiBwQWQpOwotI2VuZGlmCisvKiBwdWJsaWMgZnVuY3Rpb24gcHJvdG90eXBlICovCitpbnQgcnQyOHh4X2Nsb3NlKElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKK2ludCBydDI4eHhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CiAKLS8vIHB1YmxpYyBmdW5jdGlvbiBwcm90b3R5cGUKLUlOVCBfX2RldmluaXQgcnQyOHh4X3Byb2JlKElOIHZvaWQgKl9kZXZfcCwgSU4gdm9pZCAqX2Rldl9pZF9wLAotCQkJCQkJCUlOIFVJTlQgYXJnYywgT1VUIFBSVE1QX0FEQVBURVIgKnBwQWQpOworLyogcHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGUgKi8KK3N0YXRpYyBpbnQgcnQyOHh4X3NlbmRfcGFja2V0cyhJTiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3AsCisJCQkgICAgICAgSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwogCi0vLyBwcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZQotc3RhdGljIGludCBydDI4eHhfaW5pdChJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7Ci1JTlQgcnQyOHh4X3NlbmRfcGFja2V0cyhJTiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3AsIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKLQotc3RhdGljIHZvaWQgQ2ZnSW5pdEhvb2soUFJUTVBfQURBUFRFUiBwQWQpOwotCi1leHRlcm4JY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHJ0Mjh4eF9pd19oYW5kbGVyX2RlZjsKLQotLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHF1ZXJ5IC9wcm9jCi1zdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cygKLSAgICBJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7Ci0KLXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpSVDI4eHhfZ2V0X2V0aGVyX3N0YXRzKAotICAgIElOICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlJUMjh4eF9nZXRfZXRoZXJfc3RhdHMoSU4gc3RydWN0IG5ldF9kZXZpY2UKKwkJCQkJCSAgICAgICAqbmV0X2Rldik7CiAKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTEwMywyMSArODMsNjYgQEAKICovCiBpbnQgTWFpblZpcnR1YWxJRl9jbG9zZShJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKIHsKLSAgICBSVE1QX0FEQVBURVIgKnBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKIAotCS8vIFNhbml0eSBjaGVjayBmb3IgcEFkCisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBuZXRfZGV2KTsKKworCS8qIFNhbml0eSBjaGVjayBmb3IgcEFkICovCiAJaWYgKHBBZCA9PSBOVUxMKQotCQlyZXR1cm4gMDsgLy8gY2xvc2Ugb2sKKwkJcmV0dXJuIDA7CS8qIGNsb3NlIG9rICovCiAKIAluZXRpZl9jYXJyaWVyX29mZihwQWQtPm5ldF9kZXYpOwogCW5ldGlmX3N0b3BfcXVldWUocEFkLT5uZXRfZGV2KTsKIAorCXsKKwkJQk9PTEVBTiBDYW5jZWxsZWQ7CisKKwkJaWYgKElORlJBX09OKHBBZCkgJiYKKwkJICAgICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkgeworCQkJc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxIERpc1JlcTsKKwkJCXN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKk1zZ0VsZW0gPQorCQkJICAgIChzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSksCisJCQkJCQkJTUVNX0FMTE9DX0ZMQUcpOworCisJCQlpZiAoTXNnRWxlbSkgeworCQkJCUNPUFlfTUFDX0FERFIoRGlzUmVxLkFkZHIsCisJCQkJCSAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQlEaXNSZXEuUmVhc29uID0gUkVBU09OX0RFQVVUSF9TVEFfTEVBVklORzsKKworCQkJCU1zZ0VsZW0tPk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJCU1zZ0VsZW0tPk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7CisJCQkJTXNnRWxlbS0+TXNnTGVuID0KKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSk7CisJCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS0+TXNnLCAmRGlzUmVxLAorCQkJCQkgICAgICAgc2l6ZW9mCisJCQkJCSAgICAgICAoc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxKSk7CisKKwkJCQkvKiBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYyAqLworCQkJCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiA9IDMyOworCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwKKwkJCQkJICAgICAgIHBBZC0+TWxtZUF1eC4KKwkJCQkJICAgICAgIEF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPQorCQkJCSAgICBDTlRMX1dBSVRfT0lEX0RJU0FTU09DOworCQkJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsIE1zZ0VsZW0pOworCQkJCWtmcmVlKE1zZ0VsZW0pOworCQkJfQorCisJCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQl9CisKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwKKwkJCQkmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5XcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lciwKKwkJCQkmQ2FuY2VsbGVkKTsKKwl9CiAKIAlWSVJUVUFMX0lGX0RPV04ocEFkKTsKIAogCVJUX01PRF9ERUNfVVNFX0NPVU5UKCk7CiAKLQlyZXR1cm4gMDsgLy8gY2xvc2Ugb2sKKwlyZXR1cm4gMDsJCS8qIGNsb3NlIG9rICovCiB9CiAKIC8qCkBAIC0xNDIsMTYgKzE2NywxOCBAQAogKi8KIGludCBNYWluVmlydHVhbElGX29wZW4oSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCiB7Ci0gICAgUlRNUF9BREFQVEVSICpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CiAKLQkvLyBTYW5pdHkgY2hlY2sgZm9yIHBBZAorCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgbmV0X2Rldik7CisKKwkvKiBTYW5pdHkgY2hlY2sgZm9yIHBBZCAqLwogCWlmIChwQWQgPT0gTlVMTCkKLQkJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCisJCXJldHVybiAwOwkvKiBjbG9zZSBvayAqLwogCiAJaWYgKFZJUlRVQUxfSUZfVVAocEFkKSAhPSAwKQogCQlyZXR1cm4gLTE7CiAKLQkvLyBpbmNyZWFzZSBNT0RVTEUgdXNlIGNvdW50CisJLyogaW5jcmVhc2UgTU9EVUxFIHVzZSBjb3VudCAqLwogCVJUX01PRF9JTkNfVVNFX0NPVU5UKCk7CiAKIAluZXRpZl9zdGFydF9xdWV1ZShuZXRfZGV2KTsKQEAgLTE4MSw0MDkgKzIwOCwxNjAgQEAKIAkJKDMpIEJBIFJlb3JkZXJpbmc6IAkJCQliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoKQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotaW50IHJ0Mjh4eF9jbG9zZShJTiBQTkVUX0RFViBkZXYpCitpbnQgcnQyOHh4X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKiBuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2OwotICAgIFJUTVBfQURBUFRFUgkqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKLQlCT09MRUFOIAkJQ2FuY2VsbGVkID0gRkFMU0U7Ci0JVUlOVDMyCQkJaSA9IDA7Ci0jaWZkZWYgUlQyODcwCi0JREVDTEFSRV9XQUlUX1FVRVVFX0hFQURfT05TVEFDSyh1bmxpbmtfd2FrZXVwKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOworCUJPT0xFQU4gQ2FuY2VsbGVkOworCXUzMiBpID0gMDsKKworI2lmZGVmIFJUTVBfTUFDX1VTQgorCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHVubGlua193YWtldXApOwogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCi0JLy9SVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpOwotI2VuZGlmIC8vIFJUMjg3MCAvLworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgbmV0X2Rldik7CiAKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjh4eF9jbG9zZVxuIikpOwogCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4eHhfY2xvc2VcbiIpKTsKLQotCS8vIFNhbml0eSBjaGVjayBmb3IgcEFkCisJQ2FuY2VsbGVkID0gRkFMU0U7CisJLyogU2FuaXR5IGNoZWNrIGZvciBwQWQgKi8KIAlpZiAocEFkID09IE5VTEwpCi0JCXJldHVybiAwOyAvLyBjbG9zZSBvaworCQlyZXR1cm4gMDsJLyogY2xvc2Ugb2sgKi8KIAogCXsKLQkJLy8gSWYgZGlydmVyIGRvZXNuJ3Qgd2FrZSB1cCBmaXJtd2FyZSBoZXJlLAotCQkvLyBOSUNMb2FkRmlybXdhcmUgd2lsbCBoYW5nIGZvcmV2ZXIgd2hlbiBpbnRlcmZhY2UgaXMgdXAgYWdhaW4uCi0jaWZkZWYgUlQyODYwCi0JCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpIHx8Ci0JCQlSVE1QX1NFVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19TRVRfUENJX0NMS19PRkZfQ09NTUFORCkgfHwKLQkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikpCi0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0jZW5kaWYKLSAgICAgICAgewotI2lmZGVmIFJUMjg2MAotCQkgICAgQXNpY0ZvcmNlV2FrZXVwKHBBZCwgUlRNUF9IQUxUKTsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkgICAgQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7Ci0jZW5kaWYKLSAgICAgICAgfQorI2lmZGVmIFJUTVBfTUFDX1BDSQorCQlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9DTE9TRSk7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKLQkJaWYgKElORlJBX09OKHBBZCkgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKLQkJewotCQkJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc1JlcTsKLQkJCU1MTUVfUVVFVUVfRUxFTSAqTXNnRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOwotCi0JCQlDT1BZX01BQ19BRERSKERpc1JlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQlEaXNSZXEuUmVhc29uID0gIFJFQVNPTl9ERUFVVEhfU1RBX0xFQVZJTkc7Ci0KLQkJCU1zZ0VsZW0tPk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOwotCQkJTXNnRWxlbS0+TXNnVHlwZSA9IE1UMl9NTE1FX0RJU0FTU09DX1JFUTsKLQkJCU1zZ0VsZW0tPk1zZ0xlbiA9IHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpOwotCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS0+TXNnLCAmRGlzUmVxLCBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSk7Ci0KLQkJCS8vIFByZXZlbnQgdG8gY29ubmVjdCBBUCBhZ2FpbiBpbiBTVEFNbG1lUGVyaW9kaWNFeGVjCi0JCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOwotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOwotCi0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKLQkJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsIE1zZ0VsZW0pOwotCQkJa2ZyZWUoTXNnRWxlbSk7Ci0KLQkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCS8qIElmIGRpcnZlciBkb2Vzbid0IHdha2UgdXAgZmlybXdhcmUgaGVyZSwgKi8KKwkJLyogTklDTG9hZEZpcm13YXJlIHdpbGwgaGFuZyBmb3JldmVyIHdoZW4gaW50ZXJmYWNlIGlzIHVwIGFnYWluLiAqLworCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkgeworCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CiAJCX0KLQotI2lmZGVmIFJUMjg3MAotCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFTU9WRV9JTl9QUk9HUkVTUyk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLSNpZmRlZiBDQ1hfU1VQUE9SVAotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkxlYXBBdXRoVGltZXIsICZDYW5jZWxsZWQpOwotI2VuZGlmCi0KLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXIsICZDYW5jZWxsZWQpOworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCiAJCU1sbWVSYWRpb09mZihwQWQpOwotI2lmZGVmIFJUMjg2MAorI2lmZGVmIFJUTVBfTUFDX1BDSQogCQlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLSNlbmRpZgorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCX0KIAogCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOwogCi0JZm9yIChpID0gMCA7IGkgPCBOVU1fT0ZfVFhfUklORzsgaSsrKQotCXsKLQkJd2hpbGUgKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbaV0gPT0gVFJVRSkKLQkJewotCQkJcHJpbnRrKCJXYWl0aW5nIGZvciBUeFF1ZXVlWyVkXSBkb25lLi4uLi4uLi4uLlxuIiwgaSk7CisJZm9yIChpID0gMDsgaSA8IE5VTV9PRl9UWF9SSU5HOyBpKyspIHsKKwkJd2hpbGUgKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbaV0gPT0gVFJVRSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiV2FpdGluZyBmb3IgVHhRdWV1ZVslZF0gZG9uZS4uLi4uLi4uLi5cbiIsCisJCQkJICBpKSk7CiAJCQlSVE1QdXNlY0RlbGF5KDEwMDApOwogCQl9CiAJfQogCi0jaWZkZWYgUlQyODcwCi0JLy8gZW5zdXJlIHRoZXJlIGFyZSBubyBtb3JlIGFjdGl2ZSB1cmJzLgotCWFkZF93YWl0X3F1ZXVlICgmdW5saW5rX3dha2V1cCwgJndhaXQpOworI2lmZGVmIFJUTVBfTUFDX1VTQgorCS8qIGVuc3VyZSB0aGVyZSBhcmUgbm8gbW9yZSBhY3RpdmUgdXJicy4gKi8KKwlhZGRfd2FpdF9xdWV1ZSgmdW5saW5rX3dha2V1cCwgJndhaXQpOwogCXBBZC0+d2FpdCA9ICZ1bmxpbmtfd2FrZXVwOwogCi0JLy8gbWF5YmUgd2FpdCBmb3IgZGVsZXRpb25zIHRvIGZpbmlzaC4KKwkvKiBtYXliZSB3YWl0IGZvciBkZWxldGlvbnMgdG8gZmluaXNoLiAqLwogCWkgPSAwOwotCS8vd2hpbGUoKGkgPCAyNSkgJiYgYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApCi0Jd2hpbGUoaSA8IDI1KQotCXsKKwkvKndoaWxlKChpIDwgMjUpICYmIGF0b21pY19yZWFkKCZwQWQtPlBlbmRpbmdSeCkgPiAwKSAqLworCXdoaWxlIChpIDwgMjUpIHsKIAkJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKIAogCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKLQkJaWYgKHBBZC0+UGVuZGluZ1J4ID09IDApCi0JCXsKKwkJaWYgKHBBZC0+UGVuZGluZ1J4ID09IDApIHsKIAkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CiAJCQlicmVhazsKIAkJfQogCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwogCi0JCW1zbGVlcChVTkxJTktfVElNRU9VVF9NUyk7CS8vVGltZSBpbiBtaWxsaXNlY29uZAorCQltc2xlZXAoVU5MSU5LX1RJTUVPVVRfTVMpOwkvKlRpbWUgaW4gbWlsbGlzZWNvbmQgKi8KIAkJaSsrOwogCX0KIAlwQWQtPndhaXQgPSBOVUxMOwotCXJlbW92ZV93YWl0X3F1ZXVlICgmdW5saW5rX3dha2V1cCwgJndhaXQpOwotI2VuZGlmIC8vIFJUMjg3MCAvLworCXJlbW92ZV93YWl0X3F1ZXVlKCZ1bmxpbmtfd2FrZXVwLCAmd2FpdCk7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKLSNpZmRlZiBSVDI4NzAKLQkvLyBXZSBuZWVkIGNsZWFyIHRpbWVyUSByZWxhdGVkIHN0cnVjdHVyZSBiZWZvcmUgZXhpdHMgb2YgdGhlIHRpbWVyIHRocmVhZC4KLQlSVDI4NzBfVGltZXJRX0V4aXQocEFkKTsKLQkvLyBDbG9zZSBrZXJuZWwgdGhyZWFkcyBvciB0YXNrbGV0cwotCVJUMjh4eFRocmVhZFRlcm1pbmF0ZShwQWQpOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0JLy8gU3RvcCBNbG1lIHN0YXRlIG1hY2hpbmUKKwkvKiBTdG9wIE1sbWUgc3RhdGUgbWFjaGluZSAqLwogCU1sbWVIYWx0KHBBZCk7CiAKLQkvLyBDbG9zZSBrZXJuZWwgdGhyZWFkcyBvciB0YXNrbGV0cwotCWtpbGxfdGhyZWFkX3Rhc2socEFkKTsKKwkvKiBDbG9zZSBuZXQgdGFza2xldHMgKi8KKwlSdG1wTmV0VGFza0V4aXQocEFkKTsKIAotCU1hY1RhYmxlUmVzZXQocEFkKTsKKwl7CisJCU1hY1RhYmxlUmVzZXQocEFkKTsKKwl9CiAKIAlNZWFzdXJlUmVxVGFiRXhpdChwQWQpOwogCVRwY1JlcVRhYkV4aXQocEFkKTsKIAotI2lmZGVmIFJUMjg2MAorCS8qIENsb3NlIGtlcm5lbCB0aHJlYWRzICovCisJUnRtcE1nbXRUYXNrRXhpdChwQWQpOworCisjaWZkZWYgUlRNUF9NQUNfUENJCisJeworCQlCT09MRUFOIGJyYzsKKwkJLyogICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgIFZhbHVlOyAqLworCisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSkpIHsKKwkJCVJUTVBfQVNJQ19JTlRFUlJVUFRfRElTQUJMRShwQWQpOworCQl9CisJCS8qIFJlY2VpdmUgcGFja2V0cyB0byBjbGVhciBETUEgaW5kZXggYWZ0ZXIgZGlzYWJsZSBpbnRlcnJ1cHQuICovCisJCS8qUlRNUEhhbmRsZVJ4RG9uZUludGVycnVwdChwQWQpOyAqLworCQkvKiBwdXQgdG8gcmFkaW8gb2ZmIHRvIHNhdmUgcG93ZXIgd2hlbiBkcml2ZXIgdW5sb2FkLiAgQWZ0ZXIgcmFkaW9vZmYsIGNhbid0IHdyaXRlIC9yZWFkIHJlZ2lzdGVyLiAgU28gbmVlZCB0byBmaW5pc2ggYWxsICovCisJCS8qIHJlZ2lzdGVyIGFjY2VzcyBiZWZvcmUgUmFkaW8gb2ZmLiAqLworCisJCWJyYyA9IFJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIFJUTVBfSEFMVCwgMCk7CisKKy8qSW4gIHNvbHV0aW9uIDMgb2YgMzA5MEYsIHRoZSBiUENJY2xrT2ZmIHdpbGwgYmUgc2V0IHRvIFRSVUUgYWZ0ZXIgY2FsbGluZyBSVDI4eHhQY2lBc2ljUmFkaW9PZmYgKi8KKwkJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7CisKKwkJaWYgKGJyYyA9PSBGQUxTRSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiJXMgY2FsbCBSVDI4eHhQY2lBc2ljUmFkaW9PZmYgZmFpbCFcbiIsCisJCQkJICBfX2Z1bmNfXykpOworCQl9CisJfQorCisvKgogCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSkpCiAJewotCQlOSUNEaXNhYmxlSW50ZXJydXB0KHBBZCk7CisJCVJUTVBfQVNJQ19JTlRFUlJVUFRfRElTQUJMRShwQWQpOwogCX0KIAogCS8vIERpc2FibGUgUngsIHJlZ2lzdGVyIHZhbHVlIHN1cHBvc2VkIHdpbGwgcmVtYWluIGFmdGVyIHJlc2V0CiAJTklDSXNzdWVSZXNldChwQWQpOworKi8KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotCS8vIEZyZWUgSVJRCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0JCS8vIERlcmVnaXN0ZXIgaW50ZXJydXB0IGZ1bmN0aW9uCi0JCVJUMjhYWF9JUlFfUkVMRUFTRShuZXRfZGV2KQorCS8qIEZyZWUgSVJRICovCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworI2lmZGVmIFJUTVBfTUFDX1BDSQorCQkvKiBEZXJlZ2lzdGVyIGludGVycnVwdCBmdW5jdGlvbiAqLworCQlSdG1wT1NJUlFSZWxlYXNlKG5ldF9kZXYpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpOwogCX0KLSNlbmRpZgotCi0JLy8gRnJlZSBSaW5nIG9yIFVTQiBidWZmZXJzCisJLyogRnJlZSBSaW5nIG9yIFVTQiBidWZmZXJzICovCiAJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeShwQWQpOwogCiAJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKIAotCS8vIEZyZWUgQkEgcmVvcmRlciByZXNvdXJjZQorCS8qIEZyZWUgQkEgcmVvcmRlciByZXNvdXJjZSAqLwogCWJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZShwQWQpOwogCiAJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCk7CiAKLQlyZXR1cm4gMDsgLy8gY2xvc2Ugb2sKLX0gLyogRW5kIG9mIHJ0Mjh4eF9jbG9zZSAqLwotCi1zdGF0aWMgaW50IHJ0Mjh4eF9pbml0KElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQotewotI2lmZGVmIFJUMjg2MAotCVBSVE1QX0FEQVBURVIgCQkJcEFkID0gKFBSVE1QX0FEQVBURVIpbmV0X2Rldi0+bWxfcHJpdjsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCVBSVE1QX0FEQVBURVIgCQkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKLSNlbmRpZgotCVVJTlQJCQkJCWluZGV4OwotCVVDSEFSCQkJCQlUbXBQaHk7Ci0JTkRJU19TVEFUVVMJCQkJU3RhdHVzOwotCVVJTlQzMiAJCU1hY0NzcjAgPSAwOwotCi0JLy8gQWxsb2NhdGUgQkEgUmVvcmRlcmluZyBtZW1vcnkKLQliYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQocEFkLCBNQVhfUkVPUkRFUklOR19NUERVX05VTSk7Ci0KLQkvLyBNYWtlIHN1cmUgTUFDIGdldHMgcmVhZHkuCi0JaW5kZXggPSAwOwotCWRvCisvKisrK01vZGlmeSBieSB3b29keSB0byBzb2x2ZSB0aGUgYnVsayBmYWlsKysrKi8KIAl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX0NTUjAsICZNYWNDc3IwKTsKLQkJcEFkLT5NQUNWZXJzaW9uID0gTWFjQ3NyMDsKLQotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAhPSAweDAwKSAmJiAocEFkLT5NQUNWZXJzaW9uICE9IDB4RkZGRkZGRkYpKQotCQkJYnJlYWs7Ci0KLQkJUlRNUHVzZWNEZWxheSgxMCk7Ci0JfSB3aGlsZSAoaW5kZXgrKyA8IDEwMCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNQUNfQ1NSMCAgWyBWZXI6UmV2PTB4JTA4eF1cbiIsIHBBZC0+TUFDVmVyc2lvbikpOwotLypJdmVyc29uIHBhdGNoIFBDSUUgTDEgaXNzdWUgKi8KLQotCS8vIERpc2FibGUgRE1BCi0JUlQyOFhYRE1BRGlzYWJsZShwQWQpOwotCi0JLy8gTG9hZCA4MDUxIGZpcm13YXJlCi0JU3RhdHVzID0gTklDTG9hZEZpcm13YXJlKHBBZCk7Ci0JaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiTklDTG9hZEZpcm13YXJlIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKLQkJZ290byBlcnIxOwogCX0KIAotCU5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKHBBZCk7Ci0KLQkvLyBEaXNhYmxlIGludGVycnVwdHMgaGVyZSB3aGljaCBpcyBhcyBzb29uIGFzIHBvc3NpYmxlCi0JLy8gVGhpcyBzdGF0ZW1lbnQgc2hvdWxkIG5ldmVyIGJlIHRydWUuIFdlIG1pZ2h0IGNvbnNpZGVyIHRvIHJlbW92ZSBpdCBsYXRlcgotI2lmZGVmIFJUMjg2MAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSkpCi0JewotCQlOSUNEaXNhYmxlSW50ZXJydXB0KHBBZCk7Ci0JfQotI2VuZGlmCi0KLQlTdGF0dXMgPSBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeShwQWQpOwotCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UX0VSUigoIlJUTVBBbGxvY0RNQU1lbW9yeSBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7Ci0JCWdvdG8gZXJyMTsKLQl9Ci0KLQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKTsKLQotCS8vIGluaXRpYWxpemUgTUxNRQotCS8vCi0KLQlTdGF0dXMgPSBNbG1lSW5pdChwQWQpOwotCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UX0VSUigoIk1sbWVJbml0IGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKLQkJZ290byBlcnIyOwotCX0KLQotCS8vIEluaXRpYWxpemUgcEFkLT5TdGFDZmcsIHBBZC0+QXBDZmcsIHBBZC0+Q29tbW9uQ2ZnIHRvIG1hbnVmYWN0dXJlIGRlZmF1bHQKLQkvLwotCVVzZXJDZmdJbml0KHBBZCk7Ci0KLSNpZmRlZiBSVDI4NzAKLQkvLyBXZSBuZWVkIGluaXQgdGltZXJRIHJlbGF0ZWQgc3RydWN0dXJlIGJlZm9yZSBjcmVhdGUgdGhlIHRpbWVyIHRocmVhZC4KLQlSVDI4NzBfVGltZXJRX0luaXQocEFkKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotCVJUMjhYWF9UQVNLX1RIUkVBRF9JTklUKHBBZCwgU3RhdHVzKTsKLQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCWdvdG8gZXJyMTsKLQotCUNmZ0luaXRIb29rKHBBZCk7Ci0KLQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLQotCU1lYXN1cmVSZXFUYWJJbml0KHBBZCk7Ci0JVHBjUmVxVGFiSW5pdChwQWQpOwotCi0JLy8KLQkvLyBJbml0IHRoZSBoYXJkd2FyZSwgd2UgbmVlZCB0byBpbml0IGFzaWMgYmVmb3JlIHJlYWQgcmVnaXN0cnksIG90aGVyd2lzZSBtYWMgcmVnaXN0ZXIgd2lsbCBiZSByZXNldAotCS8vCi0JU3RhdHVzID0gTklDSW5pdGlhbGl6ZUFkYXB0ZXIocEFkLCBUUlVFKTsKLQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVF9FUlIoKCJOSUNJbml0aWFsaXplQWRhcHRlciBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7Ci0JCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJZ290byBlcnIzOwotCX0KLQotCS8vIFJlYWQgcGFyYW1ldGVycyBmcm9tIENvbmZpZyBGaWxlCi0JU3RhdHVzID0gUlRNUFJlYWRQYXJhbWV0ZXJzSG9vayhwQWQpOwotCi0JcHJpbnRrKCIxLiBQaHkgTW9kZSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKTsKLQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVF9FUlIoKCJOSUNSZWFkUmVnUGFyYW1ldGVycyBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIixTdGF0dXMpKTsKLQkJZ290byBlcnI0OwotCX0KLQotI2lmZGVmIFJUMjg3MAotCXBBZC0+Q29tbW9uQ2ZnLmJNdWx0aXBsZUlSUCA9IEZBTFNFOwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJNdWx0aXBsZUlSUCkKLQkJcEFkLT5Db21tb25DZmcuTnVtT2ZCdWxrSW5JUlAgPSBSWF9SSU5HX1NJWkU7Ci0JZWxzZQotCQlwQWQtPkNvbW1vbkNmZy5OdW1PZkJ1bGtJbklSUCA9IDE7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLQotICAgCS8vSW5pdCBCYSBDYXBhYmlsaXR5IHBhcmFtZXRlcnMuCi0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKLQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZTsKLQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOwotCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKLQkvLyBVUGRhdGEgdG8gSFQgSUUKLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOwotCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOwotCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OwotCi0JcHJpbnRrKCIyLiBQaHkgTW9kZSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKTsKLQotCS8vIFdlIHNob3VsZCByZWFkIEVFUFJPTSBmb3IgYWxsIGNhc2VzLiAgcnQyODYwYgotCU5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzKHBBZCwgbWFjKTsKLQotCXByaW50aygiMy4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSk7Ci0KLQlOSUNJbml0QXNpY0Zyb21FRVBST00ocEFkKTsgLy9ydDI4NjBiCi0KLQkvLyBTZXQgUEhZIHRvIGFwcHJvcHJpYXRlIG1vZGUKLQlUbXBQaHkgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOwotCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAweGZmOwotCVJUTVBTZXRQaHlNb2RlKHBBZCwgVG1wUGh5KTsKLQlTZXRDb21tb25IVChwQWQpOwotCi0JLy8gTm8gdmFsaWQgY2hhbm5lbHMuCi0JaWYgKHBBZC0+Q2hhbm5lbExpc3ROdW0gPT0gMCkKLQl7Ci0JCXByaW50aygiV3JvbmcgY29uZmlndXJhdGlvbi4gTm8gdmFsaWQgY2hhbm5lbCBmb3VuZC4gQ2hlY2sgXCJDb250cnlDb2RlXCIgYW5kIFwiQ2hhbm5lbEdlb2dyYXBoeVwiIHNldHRpbmcuXG4iKTsKLQkJZ290byBlcnI0OwotCX0KLQotCXByaW50aygiTUNTIFNldCA9ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSwKLSAgICAgICAgICAgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSwgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSwKLSAgICAgICAgICAgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFszXSwgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFs0XSk7Ci0KLSNpZmRlZiBSVDI4NzAKLSAgICAvL0luaXQgUlQzMHh4IFJGUmVnaXN0ZXJzIGFmdGVyIHJlYWQgUkZJQyB0eXBlIGZyb20gRUVQUk9NCi0JTklDSW5pdFJUMzB4eFJGUmVnaXN0ZXJzKHBBZCk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLQotCQkvLwotCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotCS8vCi0JQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0KLSNpZm5kZWYgUlQyODcwCi0JLy8gODA1MSBmaXJtd2FyZSByZXF1aXJlIHRoZSBzaWduYWwgZHVyaW5nIGJvb3RpbmcgdGltZS4KLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NzIsIDB4RkYsIDB4MDAsIDB4MDApOwotI2VuZGlmCi0KLQlpZiAocEFkICYmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykpCi0JewotCQkvLwotCQkvLyBVbmRvIGV2ZXJ5dGhpbmcgaWYgaXQgZmFpbGVkCi0JCS8vCi0JCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JCXsKLQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSk7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAocEFkKQotCXsKLQkJLy8gTWljcm9zb2Z0IEhDVCByZXF1aXJlIGRyaXZlciBzZW5kIGEgZGlzY29ubmVjdCBldmVudCBhZnRlciBkcml2ZXIgaW5pdGlhbGl6YXRpb24uCi0JCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7Ci0JCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX0NIQU5HRSk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBCIVxuIikpOwotCi0KLSNpZmRlZiBSVDI4NzAKLQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyk7Ci0JCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVNT1ZFX0lOX1BST0dSRVNTKTsKLQotCQkvLwotCQkvLyBTdXBwb3J0IG11bHRpcGxlIEJ1bGtJbiBJUlAsCi0JCS8vIHRoZSB2YWx1ZSBvbiBwQWQtPkNvbW1vbkNmZy5OdW1PZkJ1bGtJbklSUCBtYXkgYmUgbGFyZ2UgdGhhbiAxLgotCQkvLwotCQlmb3IoaW5kZXg9MDsgaW5kZXg8cEFkLT5Db21tb25DZmcuTnVtT2ZCdWxrSW5JUlA7IGluZGV4KyspCi0JCXsKLQkJCVJUVVNCQnVsa1JlY2VpdmUocEFkKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUVVNCQnVsa1JlY2VpdmUhXG4iICkpOwotCQl9Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0JfS8vIGVuZCBvZiBlbHNlCi0KLQotCURCR1BSSU5UX1MoU3RhdHVzLCAoIjw9PT09IFJUTVBJbml0aWFsaXplLCBTdGF0dXM9JXhcbiIsIFN0YXR1cykpOwotCi0JcmV0dXJuIFRSVUU7Ci0KLQotZXJyNDoKLWVycjM6Ci0JTWxtZUhhbHQocEFkKTsKLWVycjI6Ci0JUlRNUEZyZWVUeFJ4UmluZ01lbW9yeShwQWQpOwotZXJyMToKLQlvc19mcmVlX21lbShwQWQsIHBBZC0+bXBkdV9ibGtfcG9vbC5tZW0pOyAvLyBmcmVlIEJBIHBvb2wKLQlSVDI4WFhfSVJRX1JFTEVBU0UobmV0X2Rldik7Ci0KLQkvLyBzaGFsbCBub3Qgc2V0IG1sX3ByaXYgdG8gTlVMTCBoZXJlIGJlY2F1c2UgdGhlIG1sX3ByaXYgZGlkbid0IGJlZW4gZnJlZSB5ZXQuCi0JLy9uZXRfZGV2LT5tbF9wcml2ID0gMDsKLQotCXByaW50aygiISEhICVzIEluaXRpYWxpemVkIGZhaWwgISEhXG4iLCBSVDI4eHhfQ0hJUF9OQU1FKTsKLQlyZXR1cm4gRkFMU0U7Ci19IC8qIEVuZCBvZiBydDI4eHhfaW5pdCAqLwotCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4eHhfY2xvc2VcbiIpKTsKKwlyZXR1cm4gMDsJCS8qIGNsb3NlIG9rICovCit9CQkJCS8qIEVuZCBvZiBydDI4eHhfY2xvc2UgKi8KIAogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNjAwLDIzNCArMzc4LDExNiBAQAogTm90ZToKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLWludCBydDI4eHhfb3BlbihJTiBQTkVUX0RFViBkZXYpCitpbnQgcnQyOHh4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqIG5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXY7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CiAJaW50IHJldHZhbCA9IDA7Ci0gCVBPU19DT09LSUUgcE9iajsKKwkvKnN0cnVjdCBvc19jb29raWUgKnBPYmo7ICovCiAKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIG5ldF9kZXYpOwogCi0JLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKLQlpZiAocEFkID09IE5VTEwpCi0JeworCS8qIFNhbml0eSBjaGVjayBmb3IgcEFkICovCisJaWYgKHBBZCA9PSBOVUxMKSB7CiAJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CiAJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLwogCQlyZXR1cm4gLTE7CiAJfQogCi0JLy8gSW5pdAotIAlwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7CisJaWYgKG5ldF9kZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pIHsKKwkJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCQluZXRfZGV2LT53aXJlbGVzc19oYW5kbGVycyA9CisJCQkgICAgKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZydDI4eHhfaXdfaGFuZGxlcl9kZWY7CisJfQorCS8qIFJlcXVlc3QgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgUENJIGRldmljZSAqLworCS8qIHJlZ2lzdGVyIHRoZSBpbnRlcnJ1cHQgcm91dGluZSB3aXRoIHRoZSBvcyAqLworCVJ0bXBPU0lSUVJlcXVlc3QobmV0X2Rldik7CiAKLQkvLyByZXNldCBBZGFwdGVyIGZsYWdzCi0JUlRNUF9DTEVBUl9GTEFHUyhwQWQpOworCS8qIEluaXQgSVJRIHBhcmFtZXRlcnMgc3RvcmVkIGluIHBBZCAqLworCVJUTVBfSVJRX0lOSVQocEFkKTsKIAotCS8vIFJlcXVlc3QgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgUENJIGRldmljZQotCS8vIHJlZ2lzdGVyIHRoZSBpbnRlcnJ1cHQgcm91dGluZSB3aXRoIHRoZSBvcwotCVJUMjhYWF9JUlFfUkVRVUVTVChuZXRfZGV2KTsKLQotCi0JLy8gSW5pdCBCc3NUYWIgJiBDaGFubmVsSW5mbyB0YWJibGVzIGZvciBhdXRvIGNoYW5uZWwgc2VsZWN0LgotCi0KLQkvLyBDaGlwICYgb3RoZXIgaW5pdAotCWlmIChydDI4eHhfaW5pdChuZXRfZGV2KSA9PSBGQUxTRSkKKwkvKiBDaGlwICYgb3RoZXIgaW5pdCAqLworCWlmIChydDI4eHhfaW5pdChwQWQsIG1hYywgaG9zdG5hbWUpID09IEZBTFNFKQogCQlnb3RvIGVycjsKIAotCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLmRldl9uYW1lLCAxNik7Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuZGV2X25hbWUsIG5ldF9kZXYtPm5hbWUsIHN0cmxlbihuZXRfZGV2LT5uYW1lKSk7CisJLyogRW5hYmxlIEludGVycnVwdCAqLworCVJUTVBfSVJRX0VOQUJMRShwQWQpOwogCi0JLy8gU2V0IHVwIHRoZSBNYWMgYWRkcmVzcwotCU5kaXNNb3ZlTWVtb3J5KG5ldF9kZXYtPmRldl9hZGRyLCAodm9pZCAqKSBwQWQtPkN1cnJlbnRBZGRyZXNzLCA2KTsKLQotCS8vIEluaXQgSVJRIHBhcmFtZXRlcnMKLQlSVDI4WFhfSVJRX0lOSVQocEFkKTsKLQotCS8vIFZhcmlvdXMgQVAgZnVuY3Rpb24gaW5pdAotCi0JLy8gRW5hYmxlIEludGVycnVwdAotCVJUMjhYWF9JUlFfRU5BQkxFKHBBZCk7Ci0KLQkvLyBOb3cgRW5hYmxlIFJ4VHgKKwkvKiBOb3cgRW5hYmxlIFJ4VHggKi8KIAlSVE1QRW5hYmxlUnhUeChwQWQpOwogCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKTsKIAogCXsKLQlVSU5UMzIgcmVnID0gMDsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTMwMCwgJnJlZyk7ICAvLyBjbGVhciBnYXJiYWdlIGludGVycnVwdHMKLQlwcmludGsoIjB4MTMwMCA9ICUwOHhcbiIsIHJlZyk7CisJCXUzMiByZWcgPSAwOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTMwMCwgJnJlZyk7CS8qIGNsZWFyIGdhcmJhZ2UgaW50ZXJydXB0cyAqLworCQlwcmludGsoIjB4MTMwMCA9ICUwOHhcbiIsIHJlZyk7CiAJfQogCi0jaWZkZWYgUlQyODYwCi0gICAgICAgIFJUTVBJbml0UENJZUxpbmtDdHJsVmFsdWUocEFkKTsKLSNlbmRpZgorCXsKKy8qICAgICAgdTMyIHJlZzsgKi8KKy8qICAgICAgdTggIGJ5dGU7ICovCisvKiAgICAgIHUxNiB0bXA7ICovCisKKy8qICAgICAgUlRNUF9JT19SRUFEMzIocEFkLCBYSUZTX1RJTUVfQ0ZHLCAmcmVnKTsgKi8KKworLyogICAgICB0bXAgPSAweDA4MDU7ICovCisvKiAgICAgIHJlZyAgPSAocmVnICYgMHhmZmZmMDAwMCkgfCB0bXA7ICovCisvKiAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIFhJRlNfVElNRV9DRkcsIHJlZyk7ICovCisKKwl9CisjaWZkZWYgUlRNUF9NQUNfUENJCisJUlRNUEluaXRQQ0llTGlua0N0cmxWYWx1ZShwQWQpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCiAJcmV0dXJuIChyZXR2YWwpOwogCiBlcnI6CisvKisrK0FkZCBieSBzaGlhbmcsIG1vdmUgZnJvbSBydDI4eHhfaW5pdCgpIHRvIGhlcmUuICovCisJUnRtcE9TSVJRUmVsZWFzZShuZXRfZGV2KTsKKy8qLS0tQWRkIGJ5IHNoaWFuZywgbW92ZSBmcm9tIHJ0Mjh4eF9pbml0KCkgdG8gaGVyZS4gKi8KIAlyZXR1cm4gKC0xKTsKLX0gLyogRW5kIG9mIHJ0Mjh4eF9vcGVuICovCit9CQkJCS8qIEVuZCBvZiBydDI4eHhfb3BlbiAqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHJ0Mjg2MF9uZXRkZXZfb3BzID0gewotCS5uZG9fb3BlbgkJPSBNYWluVmlydHVhbElGX29wZW4sCi0JLm5kb19zdG9wCQk9IE1haW5WaXJ0dWFsSUZfY2xvc2UsCi0JLm5kb19kb19pb2N0bAkJPSBydDI4eHhfc3RhX2lvY3RsLAotCS5uZG9fZ2V0X3N0YXRzCQk9IFJUMjh4eF9nZXRfZXRoZXJfc3RhdHMsCi0JLm5kb192YWxpZGF0ZV9hZGRyCT0gTlVMTCwKLQkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGV0aF9tYWNfYWRkciwKLQkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCi0JLm5kb19zdGFydF94bWl0CQk9IHJ0Mjh4eF9zZW5kX3BhY2tldHMsCisJLm5kb19vcGVuID0gTWFpblZpcnR1YWxJRl9vcGVuLAorCS5uZG9fc3RvcCA9IE1haW5WaXJ0dWFsSUZfY2xvc2UsCisJLm5kb19kb19pb2N0bCA9IHJ0Mjh4eF9zdGFfaW9jdGwsCisJLm5kb19nZXRfc3RhdHMgPSBSVDI4eHhfZ2V0X2V0aGVyX3N0YXRzLAorCS5uZG9fdmFsaWRhdGVfYWRkciA9IE5VTEwsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgPSBldGhfbWFjX2FkZHIsCisJLm5kb19jaGFuZ2VfbXR1ID0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zdGFydF94bWl0ID0gcnQyOHh4X3NlbmRfcGFja2V0cywKIH07CiAKLS8qIE11c3Qgbm90IGJlIGNhbGxlZCBmb3IgbWRldiBhbmQgYXBkZXYgKi8KLXN0YXRpYyBORElTX1NUQVRVUyBydF9pZWVlODAyMTFfaWZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgUFJUTVBfQURBUFRFUiBwQWQpCitzdHJ1Y3QgbmV0X2RldmljZSAqUnRtcFBoeU5ldERldkluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X3J0bXBfb3NfbmV0ZGV2X29wX2hvb2sgKnBOZXREZXZIb29rKQogewotCU5ESVNfU1RBVFVTIFN0YXR1czsKLQlJTlQgICAgIGk9MDsKLQlDSEFSICAgIHNsb3RfbmFtZVtJRk5BTVNJWl07Ci0Jc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2aWNlOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gTlVMTDsKKy8qICAgICAgaW50ICAgICAgICAgICAgIFN0YXR1czsgKi8KIAotCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQotCXsKLQkJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZydDI4eHhfaXdfaGFuZGxlcl9kZWY7CisJbmV0X2RldiA9CisJICAgIFJ0bXBPU05ldERldkNyZWF0ZShwQWQsIElOVF9NQUlOLCAwLCBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKSwKKwkJCSAgICAgICBJTkZfTUFJTl9ERVZfTkFNRSk7CisJaWYgKG5ldF9kZXYgPT0gTlVMTCkgeworCQlwcmludGsKKwkJICAgICgiUnRtcFBoeU5ldERldkluaXQoKTogY3JlYXRpb24gZmFpbGVkIGZvciBtYWluIHBoeXNpY2FsIG5ldCBkZXZpY2UhXG4iKTsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCi0JZGV2LT5wcml2X2ZsYWdzID0gSU5UX01BSU47Ci0JZGV2LT5uZXRkZXZfb3BzID0gJnJ0Mjg2MF9uZXRkZXZfb3BzOwotCS8vIGZpbmQgYXZhaWxhYmxlIGRldmljZSBuYW1lCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQl7Ci0JCXNwcmludGYoc2xvdF9uYW1lLCAid2xhbiVkIiwgaSk7CisJTmRpc1plcm9NZW1vcnkoKHVuc2lnbmVkIGNoYXIgKilwTmV0RGV2SG9vaywKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcnRtcF9vc19uZXRkZXZfb3BfaG9vaykpOworCXBOZXREZXZIb29rLT5uZXRkZXZfb3BzID0gJnJ0Mjg2MF9uZXRkZXZfb3BzOworCXBOZXREZXZIb29rLT5wcml2X2ZsYWdzID0gSU5UX01BSU47CisJcE5ldERldkhvb2stPm5lZWRQcm90Y3RlZCA9IEZBTFNFOwogCi0JCWRldmljZSA9IGRldl9nZXRfYnlfbmFtZShkZXZfbmV0KGRldiksIHNsb3RfbmFtZSk7Ci0JCWlmIChkZXZpY2UgIT0gTlVMTCkKLQkJCWRldl9wdXQoZGV2aWNlKTsKLQotCQlpZiAoZGV2aWNlID09IE5VTEwpCi0JCQlicmVhazsKLQl9Ci0KLQlpZihpID09IDgpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJObyBhdmFpbGFibGUgc2xvdCBuYW1lXG4iKSk7Ci0JCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCWVsc2UKLQl7Ci0JCXNwcmludGYoZGV2LT5uYW1lLCAid2xhbiVkIiwgaSk7Ci0JCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JfQotCi0JcmV0dXJuIFN0YXR1czsKLQotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIFByb2JlIFJUMjhYWCBjaGlwc2V0LgotCi1Bcmd1bWVudHM6Ci0gICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQotCV9kZXZfaWRfcAkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZSBJRAotCi1SZXR1cm4gVmFsdWU6Ci0gICAgMAkJCQkJUHJvYmUgT0sKLQktRU5PREVWCQkJCVByb2JlIEZhaWwKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBfX2RldmluaXQgICBydDI4eHhfcHJvYmUoCi0gICAgSU4gIHZvaWQgKl9kZXZfcCwKLSAgICBJTiAgdm9pZCAqX2Rldl9pZF9wLAotCUlOICBVSU5UIGFyZ2MsCi0JT1VUIFBSVE1QX0FEQVBURVIgKnBwQWQpCi17Ci0gICAgc3RydWN0ICBuZXRfZGV2aWNlCSpuZXRfZGV2OwotICAgIFBSVE1QX0FEQVBURVIgICAgICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIE5VTEw7Ci0gICAgSU5UICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JUFZPSUQJCQkJaGFuZGxlOwotI2lmZGVmIFJUMjg2MAotCXN0cnVjdCBwY2lfZGV2ICpkZXZfcCA9IChzdHJ1Y3QgcGNpX2RldiAqKV9kZXZfcDsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gKHN0cnVjdCB1c2JfaW50ZXJmYWNlICopX2Rldl9wOwotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZfcCA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7Ci0KLQlkZXZfcCA9IHVzYl9nZXRfZGV2KGRldl9wKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNUQSBEcml2ZXIgdmVyc2lvbi0lc1xuIiwgU1RBX0RSSVZFUl9WRVJTSU9OKSk7Ci0KLSAgICBuZXRfZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKFBSVE1QX0FEQVBURVIpKTsKLSAgICBpZiAobmV0X2RldiA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJhbGxvY19uZXRkZXYgZmFpbGVkXG4iKTsKLQotICAgICAgICBnb3RvIGVycl9vdXQ7Ci0gICAgfQorCW5ldF9kZXYtPm1sX3ByaXYgPSAodm9pZCAqKXBBZDsKKwlwQWQtPm5ldF9kZXYgPSBuZXRfZGV2OwogCiAJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKIAotLyogZm9yIHN1cHBvcnRpbmcgTmV0d29yayBNYW5hZ2VyICovCi0vKiBTZXQgdGhlIHN5c2ZzIHBoeXNpY2FsIGRldmljZSByZWZlcmVuY2UgZm9yIHRoZSBuZXR3b3JrIGxvZ2ljYWwgZGV2aWNlCi0gKiBpZiBzZXQgcHJpb3IgdG8gcmVnaXN0cmF0aW9uIHdpbGwgY2F1c2UgYSBzeW1saW5rIGR1cmluZyBpbml0aWFsaXphdGlvbi4KLSAqLwotICAgIFNFVF9ORVRERVZfREVWKG5ldF9kZXYsICYoZGV2X3AtPmRldikpOworCXJldHVybiBuZXRfZGV2OwogCi0JLy8gQWxsb2NhdGUgUlRNUF9BREFQVEVSIG1pbmlwb3J0IGFkYXB0ZXIgc3RydWN0dXJlCi0JaGFuZGxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG9zX2Nvb2tpZSksIEdGUF9LRVJORUwpOwotCWlmIChoYW5kbGUgPT0gTlVMTCkKLQkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OzsKLQlSVDI4WFhfSEFORExFX0RFVl9BU1NJR04oaGFuZGxlLCBkZXZfcCk7Ci0KLQlzdGF0dXMgPSBSVE1QQWxsb2NBZGFwdGVyQmxvY2soaGFuZGxlLCAmcEFkKTsKLQlpZiAoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKLQotCW5ldF9kZXYtPm1sX3ByaXYgPSAoUFZPSUQpcEFkOwotICAgIHBBZC0+bmV0X2RldiA9IG5ldF9kZXY7IC8vIG11c3QgYmUgYmVmb3JlIFJUMjhYWE5ldERldkluaXQoKQotCi0JUlQyOFhYTmV0RGV2SW5pdChfZGV2X3AsIG5ldF9kZXYsIHBBZCk7Ci0KLSAgICBwQWQtPlN0YUNmZy5PcmlEZXZUeXBlID0gbmV0X2Rldi0+dHlwZTsKLQotCS8vIFBvc3QgY29uZmlnCi0JaWYgKFJUMjhYWFByb2JlUG9zdENvbmZpZyhfZGV2X3AsIHBBZCwgMCkgPT0gRkFMU0UpCi0JCWdvdG8gZXJyX291dF91bm1hcDsKLQotCXBBZC0+T3BNb2RlID0gT1BNT0RFX1NUQTsKLQotCS8vIHNhbXBsZSBtb3ZlCi0JaWYgKHJ0X2llZWU4MDIxMV9pZl9zZXR1cChuZXRfZGV2LCBwQWQpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCWdvdG8gZXJyX291dF91bm1hcDsKLQotICAgIC8vIFJlZ2lzdGVyIHRoaXMgZGV2aWNlCi0gICAgc3RhdHVzID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOwotICAgIGlmIChzdGF0dXMpCi0gICAgICAgIGdvdG8gZXJyX291dF91bm1hcDsKLQotICAgIC8vIFNldCBkcml2ZXIgZGF0YQotCVJUMjhYWF9EUlZEQVRBX1NFVChfZGV2X3ApOwotCi0JKnBwQWQgPSBwQWQ7Ci0gICAgcmV0dXJuIDA7IC8vIHByb2JlIG9rCi0KLQotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFUlJPUiBIQU5ETEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1lcnJfb3V0X3VubWFwOgotCVJUTVBGcmVlQWRhcHRlcihwQWQpOwotCVJUMjhYWF9VTk1BUCgpOwotCi1lcnJfb3V0X2ZyZWVfbmV0ZGV2OgotCWZyZWVfbmV0ZGV2KG5ldF9kZXYpOwotCi1lcnJfb3V0OgotCVJUMjhYWF9QVVRfREVWSUNFKGRldl9wKTsKLQotCXJldHVybiAtRU5PREVWOyAvKiBwcm9iZSBmYWlsICovCi19IC8qIEVuZCBvZiBydDI4eHhfcHJvYmUgKi8KLQorfQogCiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC04NDksMzYgKzUwOSwzMiBAQAogaW50IHJ0Mjh4eF9wYWNrZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gc2tiLT5kZXY7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CiAJaW50IHN0YXR1cyA9IE5FVERFVl9UWF9PSzsKLQlQTkRJU19QQUNLRVQgcFBhY2tldCA9IChQTkRJU19QQUNLRVQpIHNrYjsKKwl2b2lkICpwUGFja2V0ID0gKHZvaWQgKilza2I7CisKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIG5ldF9kZXYpOworCisJLyogUlQyODcwU1RBIGRvZXMgdGhpcyBpbiBSVE1QU2VuZFBhY2tldHMoKSAqLwogCiAJewotCQkvLyBEcm9wIHNlbmQgcmVxdWVzdCBzaW5jZSB3ZSBhcmUgaW4gbW9uaXRvciBtb2RlCi0JCWlmIChNT05JVE9SX09OKHBBZCkpCi0JCXsKKwkJLyogRHJvcCBzZW5kIHJlcXVlc3Qgc2luY2Ugd2UgYXJlIGluIG1vbml0b3IgbW9kZSAqLworCQlpZiAoTU9OSVRPUl9PTihwQWQpKSB7CiAJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCQlnb3RvIGRvbmU7CiAJCX0KIAl9CiAKLSAgICAgICAgLy8gRWFwb2xTdGFydCBzaXplIGlzIDE4Ci0JaWYgKHNrYi0+bGVuIDwgMTQpCi0JewotCQkvL3ByaW50aygiYmFkIHBhY2tldCBzaXplOiAlZFxuIiwgcGt0LT5sZW4pOworCS8qIEVhcG9sU3RhcnQgc2l6ZSBpcyAxOCAqLworCWlmIChza2ItPmxlbiA8IDE0KSB7CisJCS8qcHJpbnRrKCJiYWQgcGFja2V0IHNpemU6ICVkXG4iLCBwa3QtPmxlbik7ICovCiAJCWhleF9kdW1wKCJiYWQgcGFja2V0Iiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CiAJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJZ290byBkb25lOwogCX0KIAogCVJUTVBfU0VUX1BBQ0tFVF81VlQocFBhY2tldCwgMCk7Ci0jaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCi0gICAgaWYgKCooaW50Kikoc2tiLT5jYikgPT0gQlJJREdFX1RBRykgewotCQlSVE1QX1NFVF9QQUNLRVRfNVZUKHBQYWNrZXQsIDEpOwotICAgIH0KLSNlbmRpZgotCi0JU1RBU2VuZFBhY2tldHMoKE5ESVNfSEFORExFKXBBZCwgKFBQTkRJU19QQUNLRVQpICZwUGFja2V0LCAxKTsKKwlTVEFTZW5kUGFja2V0cygodm9pZCAqKXBBZCwgKHZvaWQgKiopJiBwUGFja2V0LCAxKTsKIAogCXN0YXR1cyA9IE5FVERFVl9UWF9PSzsKIGRvbmU6CkBAIC04ODYsNyArNTQyLDYgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi0KIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFJvdXRpbmUgRGVzY3JpcHRpb246CkBAIC05MDMsNzIgKzU1OCw2OSBAQAogTm90ZToKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLUlOVCBydDI4eHhfc2VuZF9wYWNrZXRzKAotCUlOIHN0cnVjdCBza19idWZmIAkJKnNrYl9wLAotCUlOIHN0cnVjdCBuZXRfZGV2aWNlIAkqbmV0X2RldikKK3N0YXRpYyBpbnQgcnQyOHh4X3NlbmRfcGFja2V0cyhJTiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3AsCisJCQkgICAgICAgSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCiB7Ci0gICAgUlRNUF9BREFQVEVSICpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OwotCWlmICghKG5ldF9kZXYtPmZsYWdzICYgSUZGX1VQKSkKLQl7Ci0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCAoUE5ESVNfUEFDS0VUKXNrYl9wLCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOworCisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBuZXRfZGV2KTsKKworCWlmICghKG5ldF9kZXYtPmZsYWdzICYgSUZGX1VQKSkgeworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgKHZvaWQgKilza2JfcCwKKwkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCXJldHVybiBORVRERVZfVFhfT0s7CiAJfQogCi0JTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmc2tiX3AtPmNiW0NCX09GRl0sIDE1KTsKKwlOZGlzWmVyb01lbW9yeSgodTggKikmIHNrYl9wLT5jYltDQl9PRkZdLCAxNSk7CiAJUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKHNrYl9wLCBNQUlOX01CU1NJRCk7CiAKIAlyZXR1cm4gcnQyOHh4X3BhY2tldF94bWl0KHNrYl9wKTsKK30KIAotfSAvKiBFbmQgb2YgTUJTU19WaXJ0dWFsSUZfUGFja2V0U2VuZCAqLwotCi0KLQotCi12b2lkIENmZ0luaXRIb29rKFBSVE1QX0FEQVBURVIgcEFkKQorLyogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHF1ZXJ5IC9wcm9jICovCitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cyhJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKIHsKLQlwQWQtPmJCcm9hZENvbUhUID0gVFJVRTsKLX0gLyogRW5kIG9mIENmZ0luaXRIb29rICovCisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKIAotCi0vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gcXVlcnkgL3Byb2MKLXN0cnVjdCBpd19zdGF0aXN0aWNzICpydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzKAotICAgIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQotewotCVBSVE1QX0FEQVBURVIgcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKLQorCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgbmV0X2Rldik7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzIC0tLT5cbiIpKTsKIAotCXBBZC0+aXdfc3RhdHMuc3RhdHVzID0gMDsgLy8gU3RhdHVzIC0gZGV2aWNlIGRlcGVuZGVudCBmb3Igbm93CisJcEFkLT5pd19zdGF0cy5zdGF0dXMgPSAwOwkvKiBTdGF0dXMgLSBkZXZpY2UgZGVwZW5kZW50IGZvciBub3cgKi8KIAotCS8vIGxpbmsgcXVhbGl0eQotCXBBZC0+aXdfc3RhdHMucXVhbC5xdWFsID0gKChwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkgKiAxMikvMTAgKyAxMCk7Ci0JaWYocEFkLT5pd19zdGF0cy5xdWFsLnF1YWwgPiAxMDApCisJLyogbGluayBxdWFsaXR5ICovCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCXBBZC0+aXdfc3RhdHMucXVhbC5xdWFsID0KKwkJICAgICgocEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ICogMTIpIC8gMTAgKyAxMCk7CisKKwlpZiAocEFkLT5pd19zdGF0cy5xdWFsLnF1YWwgPiAxMDApCiAJCXBBZC0+aXdfc3RhdHMucXVhbC5xdWFsID0gMTAwOwogCi0JaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0JCXBBZC0+aXdfc3RhdHMucXVhbC5sZXZlbCA9IFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMik7CisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpIHsKKwkJcEFkLT5pd19zdGF0cy5xdWFsLmxldmVsID0KKwkJICAgIFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsCisJCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsCisJCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpOworCX0KIAotCXBBZC0+aXdfc3RhdHMucXVhbC5ub2lzZSA9IHBBZC0+QmJwV3JpdGVMYXRjaFs2Nl07IC8vIG5vaXNlIGxldmVsIChkQm0pCisJcEFkLT5pd19zdGF0cy5xdWFsLm5vaXNlID0gcEFkLT5CYnBXcml0ZUxhdGNoWzY2XTsJLyogbm9pc2UgbGV2ZWwgKGRCbSkgKi8KIAogCXBBZC0+aXdfc3RhdHMucXVhbC5ub2lzZSArPSAyNTYgLSAxNDM7Ci0JcEFkLT5pd19zdGF0cy5xdWFsLnVwZGF0ZWQgPSAxOyAgICAgLy8gRmxhZ3MgdG8ga25vdyBpZiB1cGRhdGVkCisJcEFkLT5pd19zdGF0cy5xdWFsLnVwZGF0ZWQgPSAxOwkvKiBGbGFncyB0byBrbm93IGlmIHVwZGF0ZWQgKi8KICNpZmRlZiBJV19RVUFMX0RCTQotCXBBZC0+aXdfc3RhdHMucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfREJNOwkvLyBMZXZlbCArIE5vaXNlIGFyZSBkQm0KLSNlbmRpZiAvLyBJV19RVUFMX0RCTSAvLworCXBBZC0+aXdfc3RhdHMucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfREJNOwkvKiBMZXZlbCArIE5vaXNlIGFyZSBkQm0gKi8KKyNlbmRpZiAvKiBJV19RVUFMX0RCTSAvLyAqLwogCi0JcEFkLT5pd19zdGF0cy5kaXNjYXJkLm53aWQgPSAwOyAgICAgLy8gUnggOiBXcm9uZyBud2lkL2Vzc2lkCi0JcEFkLT5pd19zdGF0cy5taXNzLmJlYWNvbiA9IDA7ICAgICAgLy8gTWlzc2VkIGJlYWNvbnMvc3VwZXJmcmFtZQorCXBBZC0+aXdfc3RhdHMuZGlzY2FyZC5ud2lkID0gMDsJLyogUnggOiBXcm9uZyBud2lkL2Vzc2lkICovCisJcEFkLT5pd19zdGF0cy5taXNzLmJlYWNvbiA9IDA7CS8qIE1pc3NlZCBiZWFjb25zL3N1cGVyZnJhbWUgKi8KIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0gcnQyOHh4X2dldF93aXJlbGVzc19zdGF0c1xuIikpOwogCXJldHVybiAmcEFkLT5pd19zdGF0czsKLX0gLyogRW5kIG9mIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMgKi8KLQotCit9CiAKIHZvaWQgdGJ0dF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLSNkZWZpbmUgTUFYX1RYX0lOX1RCVFQJCSgxNikKKy8qI2RlZmluZSBNQVhfVFhfSU5fVEJUVCAgICAgICAgICAgICAgICAoMTYpICovCiAKIH0KIApAQCAtOTg4LDE5ICs2NDAsMjAgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpSVDI4eHhfZ2V0X2V0aGVyX3N0YXRzKAotICAgIElOICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqUlQyOHh4X2dldF9ldGhlcl9zdGF0cyhJTiBzdHJ1Y3QgbmV0X2RldmljZQorCQkJCQkJICAgICAgICpuZXRfZGV2KQogewotICAgIFJUTVBfQURBUFRFUiAqcEFkID0gTlVMTDsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOwogCiAJaWYgKG5ldF9kZXYpCi0JCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgbmV0X2Rldik7CiAKLQlpZiAocEFkKQotCXsKKwlpZiAocEFkKSB7CiAKLQkJcEFkLT5zdGF0cy5yeF9wYWNrZXRzID0gcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OwotCQlwQWQtPnN0YXRzLnR4X3BhY2tldHMgPSBwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CisJCXBBZC0+c3RhdHMucnhfcGFja2V0cyA9CisJCSAgICBwQWQtPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CisJCXBBZC0+c3RhdHMudHhfcGFja2V0cyA9CisJCSAgICBwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CiAKIAkJcEFkLT5zdGF0cy5yeF9ieXRlcyA9IHBBZC0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQ7CiAJCXBBZC0+c3RhdHMudHhfYnl0ZXMgPSBwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50OwpAQCAtMTAxMSwzMCArNjY0LDczIEBACiAJCXBBZC0+c3RhdHMucnhfZHJvcHBlZCA9IDA7CiAJCXBBZC0+c3RhdHMudHhfZHJvcHBlZCA9IDA7CiAKLQkgICAgcEFkLT5zdGF0cy5tdWx0aWNhc3QgPSBwQWQtPldsYW5Db3VudGVycy5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQuUXVhZFBhcnQ7ICAgLy8gbXVsdGljYXN0IHBhY2tldHMgcmVjZWl2ZWQKLQkgICAgcEFkLT5zdGF0cy5jb2xsaXNpb25zID0gcEFkLT5Db3VudGVyczgwMjMuT25lQ29sbGlzaW9uICsgcEFkLT5Db3VudGVyczgwMjMuTW9yZUNvbGxpc2lvbnM7ICAvLyBDb2xsaXNpb24gcGFja2V0cworCQlwQWQtPnN0YXRzLm11bHRpY2FzdCA9IHBBZC0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudC5RdWFkUGFydDsJLyogbXVsdGljYXN0IHBhY2tldHMgcmVjZWl2ZWQgKi8KKwkJcEFkLT5zdGF0cy5jb2xsaXNpb25zID0gcEFkLT5Db3VudGVyczgwMjMuT25lQ29sbGlzaW9uICsgcEFkLT5Db3VudGVyczgwMjMuTW9yZUNvbGxpc2lvbnM7CS8qIENvbGxpc2lvbiBwYWNrZXRzICovCiAKLQkgICAgcEFkLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gMDsKLQkgICAgcEFkLT5zdGF0cy5yeF9vdmVyX2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7ICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVyIHJpbmcgYnVmZiBvdmVyZmxvdwotCSAgICBwQWQtPnN0YXRzLnJ4X2NyY19lcnJvcnMgPSAwOy8vcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudDsgICAgIC8vIHJlY3ZlZCBwa3Qgd2l0aCBjcmMgZXJyb3IKLQkgICAgcEFkLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SY3ZBbGlnbm1lbnRFcnJvcnM7ICAgICAgICAgIC8vIHJlY3YnZCBmcmFtZSBhbGlnbm1lbnQgZXJyb3IKLQkgICAgcEFkLT5zdGF0cy5yeF9maWZvX2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7ICAgICAgICAgICAgICAgICAgIC8vIHJlY3YnciBmaWZvIG92ZXJydW4KLQkgICAgcEFkLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVyIG1pc3NlZCBwYWNrZXQKKwkJcEFkLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gMDsKKwkJcEFkLT5zdGF0cy5yeF9vdmVyX2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7CS8qIHJlY2VpdmVyIHJpbmcgYnVmZiBvdmVyZmxvdyAqLworCQlwQWQtPnN0YXRzLnJ4X2NyY19lcnJvcnMgPSAwOwkvKnBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQ7ICAgICAvLyByZWN2ZWQgcGt0IHdpdGggY3JjIGVycm9yICovCisJCXBBZC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuUmN2QWxpZ25tZW50RXJyb3JzOwkvKiByZWN2J2QgZnJhbWUgYWxpZ25tZW50IGVycm9yICovCisJCXBBZC0+c3RhdHMucnhfZmlmb19lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOwkvKiByZWN2J3IgZmlmbyBvdmVycnVuICovCisJCXBBZC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IDA7CS8qIHJlY2VpdmVyIG1pc3NlZCBwYWNrZXQgKi8KIAotCSAgICAvLyBkZXRhaWxlZCB0eF9lcnJvcnMKLQkgICAgcEFkLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9IDA7Ci0JICAgIHBBZC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMgPSAwOwotCSAgICBwQWQtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzID0gMDsKLQkgICAgcEFkLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzID0gMDsKLQkgICAgcEFkLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzID0gMDsKKwkJLyogZGV0YWlsZWQgdHhfZXJyb3JzICovCisJCXBBZC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPSAwOworCQlwQWQtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzID0gMDsKKwkJcEFkLT5zdGF0cy50eF9maWZvX2Vycm9ycyA9IDA7CisJCXBBZC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycyA9IDA7CisJCXBBZC0+c3RhdHMudHhfd2luZG93X2Vycm9ycyA9IDA7CiAKLQkgICAgLy8gZm9yIGNzbGlwIGV0YwotCSAgICBwQWQtPnN0YXRzLnJ4X2NvbXByZXNzZWQgPSAwOwotCSAgICBwQWQtPnN0YXRzLnR4X2NvbXByZXNzZWQgPSAwOworCQkvKiBmb3IgY3NsaXAgZXRjICovCisJCXBBZC0+c3RhdHMucnhfY29tcHJlc3NlZCA9IDA7CisJCXBBZC0+c3RhdHMudHhfY29tcHJlc3NlZCA9IDA7CiAKIAkJcmV0dXJuICZwQWQtPnN0YXRzOwotCX0KLQllbHNlCi0gICAgCXJldHVybiBOVUxMOworCX0gZWxzZQorCQlyZXR1cm4gTlVMTDsKIH0KIAorQk9PTEVBTiBSdG1wUGh5TmV0RGV2RXhpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCisJLyogVW5yZWdpc3RlciBuZXR3b3JrIGRldmljZSAqLworCWlmIChuZXRfZGV2ICE9IE5VTEwpIHsKKwkJcHJpbnRrCisJCSAgICAoIlJ0bXBPU05ldERldkRldGFjaCgpOiBSdG1wT1NOZXREZXZpY2VEZXRhY2goKSwgZGV2LT5uYW1lPSVzIVxuIiwKKwkJICAgICBuZXRfZGV2LT5uYW1lKTsKKwkJUnRtcE9TTmV0RGV2RGV0YWNoKG5ldF9kZXYpOworCX0KKworCXJldHVybiBUUlVFOworCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQWxsb2NhdGUgbWVtb3J5IGZvciBhZGFwdGVyIGNvbnRyb2wgYmxvY2suCisKK0FyZ3VtZW50czoKKyAgICBwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworUmV0dXJuIFZhbHVlOgorCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwlORElTX1NUQVRVU19GQUlMVVJFCisJTkRJU19TVEFUVVNfUkVTT1VSQ0VTCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkodm9pZCAqaGFuZGxlLCB2b2lkICoqIHBwQWQpCit7CisKKwkqcHBBZCA9ICh2b2lkICopdm1hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X3J0bXBfYWRhcHRlcikpOwkvKnBjaV9hbGxvY19jb25zaXN0ZW50KHBjaV9kZXYsIHNpemVvZihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyKSwgcGh5X2FkZHIpOyAqLworCisJaWYgKCpwcEFkKSB7CisJCU5kaXNaZXJvTWVtb3J5KCpwcEFkLCBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfYWRhcHRlcikpOworCQkoKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKikqIHBwQWQpLT5PU19Db29raWUgPSBoYW5kbGU7CisJCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3BjaV9yYnVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3BjaV9yYnVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBhMGFlZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfcGNpX3JidXMuYwpAQCAtMCwwICsxLDg0MCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBydF9wY2lfcmJ1cy5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBDcmVhdGUgYW5kIHJlZ2lzdGVyIG5ldHdvcmsgaW50ZXJmYWNlLgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKK0lSUV9IQU5ETEVfVFlQRSBydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSk7CisKK3N0YXRpYyB2b2lkIHJ4X2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgbWdtdF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBhYzBfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgYWMxX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGFjMl9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBhYzNfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFN5bWJvbCAmIE1hY3JvIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgUlQyODYwX0lOVF9SWF9ETFkJCQkJKDE8PDApCS8qIGJpdCAwICovCisjZGVmaW5lIFJUMjg2MF9JTlRfVFhfRExZCQkJCSgxPDwxKQkvKiBiaXQgMSAqLworI2RlZmluZSBSVDI4NjBfSU5UX1JYX0RPTkUJCQkJKDE8PDIpCS8qIGJpdCAyICovCisjZGVmaW5lIFJUMjg2MF9JTlRfQUMwX0RNQV9ET05FCQkJKDE8PDMpCS8qIGJpdCAzICovCisjZGVmaW5lIFJUMjg2MF9JTlRfQUMxX0RNQV9ET05FCQkJKDE8PDQpCS8qIGJpdCA0ICovCisjZGVmaW5lIFJUMjg2MF9JTlRfQUMyX0RNQV9ET05FCQkJKDE8PDUpCS8qIGJpdCA1ICovCisjZGVmaW5lIFJUMjg2MF9JTlRfQUMzX0RNQV9ET05FCQkJKDE8PDYpCS8qIGJpdCA2ICovCisjZGVmaW5lIFJUMjg2MF9JTlRfSENDQV9ETUFfRE9ORQkJKDE8PDcpCS8qIGJpdCA3ICovCisjZGVmaW5lIFJUMjg2MF9JTlRfTUdNVF9ET05FCQkJKDE8PDgpCS8qIGJpdCA4ICovCisKKyNkZWZpbmUgSU5UX1JYCQkJUlQyODYwX0lOVF9SWF9ET05FCisKKyNkZWZpbmUgSU5UX0FDMF9ETFkJCShSVDI4NjBfSU5UX0FDMF9ETUFfRE9ORSkJLyp8IFJUMjg2MF9JTlRfVFhfRExZKSAqLworI2RlZmluZSBJTlRfQUMxX0RMWQkJKFJUMjg2MF9JTlRfQUMxX0RNQV9ET05FKQkvKnwgUlQyODYwX0lOVF9UWF9ETFkpICovCisjZGVmaW5lIElOVF9BQzJfRExZCQkoUlQyODYwX0lOVF9BQzJfRE1BX0RPTkUpCS8qfCBSVDI4NjBfSU5UX1RYX0RMWSkgKi8KKyNkZWZpbmUgSU5UX0FDM19ETFkJCShSVDI4NjBfSU5UX0FDM19ETUFfRE9ORSkJLyp8IFJUMjg2MF9JTlRfVFhfRExZKSAqLworI2RlZmluZSBJTlRfSENDQV9ETFkJKFJUMjg2MF9JTlRfSENDQV9ETUFfRE9ORSkJLyp8IFJUMjg2MF9JTlRfVFhfRExZKSAqLworI2RlZmluZSBJTlRfTUdNVF9ETFkJUlQyODYwX0lOVF9NR01UX0RPTkUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICoJSW50ZXJmYWNlLWRlcGVuZGVkIG1lbW9yeSBhbGxvY2F0aW9uL0ZyZWUgcmVsYXRlZCBwcm9jZWR1cmVzLgorICAqCQlNYWlubHkgZm9yIEhhcmR3YXJlIFR4RGVzYy9SeERlc2MvTWdtdERlc2MsIERNQSBNZW1vcnkgZm9yIFR4RGF0YS9SeERhdGEsIGV0Yy4sCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbiBmb3IgVHhEZXNjIE1lbW9yeSBhbGxvY2F0aW9uLiAqLwordm9pZCBSVE1QX0FsbG9jYXRlVHhEZXNjTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICB1MzIgSW5kZXgsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkgICAgICAgSU4gQk9PTEVBTiBDYWNoZWQsCisJCQkgICAgICAgdm9pZCAqKiBWaXJ0dWFsQWRkcmVzcywKKwkJCSAgICAgICBkbWFfYWRkcl90ICpQaHlzaWNhbEFkZHJlc3MpCit7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKwkqVmlydHVhbEFkZHJlc3MgPQorCSAgICAodm9pZCAqKXBjaV9hbGxvY19jb25zaXN0ZW50KHBPYmotPnBjaV9kZXYsIHNpemVvZihjaGFyKSAqIExlbmd0aCwKKwkJCQkJIFBoeXNpY2FsQWRkcmVzcyk7CisKK30KKworLyogRnVuY3Rpb24gZm9yIE1nbXREZXNjIE1lbW9yeSBhbGxvY2F0aW9uLiAqLwordm9pZCBSVE1QX0FsbG9jYXRlTWdtdERlc2NNZW1vcnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSB1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJCQkgSU4gQk9PTEVBTiBDYWNoZWQsCisJCQkJIHZvaWQgKiogVmlydHVhbEFkZHJlc3MsCisJCQkJIGRtYV9hZGRyX3QgKlBoeXNpY2FsQWRkcmVzcykKK3sKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCSpWaXJ0dWFsQWRkcmVzcyA9CisJICAgICh2b2lkICopcGNpX2FsbG9jX2NvbnNpc3RlbnQocE9iai0+cGNpX2Rldiwgc2l6ZW9mKGNoYXIpICogTGVuZ3RoLAorCQkJCQkgUGh5c2ljYWxBZGRyZXNzKTsKKworfQorCisvKiBGdW5jdGlvbiBmb3IgUnhEZXNjIE1lbW9yeSBhbGxvY2F0aW9uLiAqLwordm9pZCBSVE1QX0FsbG9jYXRlUnhEZXNjTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJCSAgICAgICBJTiBCT09MRUFOIENhY2hlZCwKKwkJCSAgICAgICB2b2lkICoqIFZpcnR1YWxBZGRyZXNzLAorCQkJICAgICAgIGRtYV9hZGRyX3QgKlBoeXNpY2FsQWRkcmVzcykKK3sKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCSpWaXJ0dWFsQWRkcmVzcyA9CisJICAgICh2b2lkICopcGNpX2FsbG9jX2NvbnNpc3RlbnQocE9iai0+cGNpX2Rldiwgc2l6ZW9mKGNoYXIpICogTGVuZ3RoLAorCQkJCQkgUGh5c2ljYWxBZGRyZXNzKTsKKworfQorCisvKiBGdW5jdGlvbiBmb3IgZnJlZSBhbGxvY2F0ZWQgRGVzYyBNZW1vcnkuICovCit2b2lkIFJUTVBfRnJlZURlc2NNZW1vcnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHVuc2lnbmVkIGxvbmcgTGVuZ3RoLAorCQkJIHZvaWQgKlZpcnR1YWxBZGRyZXNzLAorCQkJIGRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzKQoreworCXN0cnVjdCBvc19jb29raWUgKnBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwT2JqLT5wY2lfZGV2LCBMZW5ndGgsIFZpcnR1YWxBZGRyZXNzLAorCQkJICAgIFBoeXNpY2FsQWRkcmVzcyk7Cit9CisKKy8qIEZ1bmN0aW9uIGZvciBUeERhdGEgRE1BIE1lbW9yeSBhbGxvY2F0aW9uLiAqLwordm9pZCBSVE1QX0FsbG9jYXRlRmlyc3RUeEJ1ZmZlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJdTMyIEluZGV4LAorCQkJCXVuc2lnbmVkIGxvbmcgTGVuZ3RoLAorCQkJCUlOIEJPT0xFQU4gQ2FjaGVkLAorCQkJCXZvaWQgKiogVmlydHVhbEFkZHJlc3MsCisJCQkJZG1hX2FkZHJfdCAqUGh5c2ljYWxBZGRyZXNzKQoreworCXN0cnVjdCBvc19jb29raWUgKnBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJKlZpcnR1YWxBZGRyZXNzID0KKwkgICAgKHZvaWQgKilwY2lfYWxsb2NfY29uc2lzdGVudChwT2JqLT5wY2lfZGV2LCBzaXplb2YoY2hhcikgKiBMZW5ndGgsCisJCQkJCSBQaHlzaWNhbEFkZHJlc3MpOworfQorCit2b2lkIFJUTVBfRnJlZUZpcnN0VHhCdWZmZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgTGVuZ3RoLAorCQkJICAgIElOIEJPT0xFQU4gQ2FjaGVkLAorCQkJICAgIHZvaWQgKlZpcnR1YWxBZGRyZXNzLAorCQkJICAgIGRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzKQoreworCXN0cnVjdCBvc19jb29raWUgKnBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwT2JqLT5wY2lfZGV2LCBMZW5ndGgsIFZpcnR1YWxBZGRyZXNzLAorCQkJICAgIFBoeXNpY2FsQWRkcmVzcyk7Cit9CisKKy8qCisgKiBGVU5DVElPTjogQWxsb2NhdGUgYSBjb21tb24gYnVmZmVyIGZvciBETUEKKyAqIEFSR1VNRU5UUzoKKyAqICAgICBBZGFwdGVySGFuZGxlOiAgQWRhcHRlckhhbmRsZQorICogICAgIExlbmd0aDogIE51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQorICogICAgIENhY2hlZDogIFdoZXRoZXIgb3Igbm90IHRoZSBtZW1vcnkgY2FuIGJlIGNhY2hlZAorICogICAgIFZpcnR1YWxBZGRyZXNzOiAgUG9pbnRlciB0byBtZW1vcnkgaXMgcmV0dXJuZWQgaGVyZQorICogICAgIFBoeXNpY2FsQWRkcmVzczogIFBoeXNpY2FsIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB2aXJ0dWFsIGFkZHJlc3MKKyAqLwordm9pZCBSVE1QX0FsbG9jYXRlU2hhcmVkTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJCSAgICAgICBJTiBCT09MRUFOIENhY2hlZCwKKwkJCSAgICAgICB2b2lkICoqIFZpcnR1YWxBZGRyZXNzLAorCQkJICAgICAgIGRtYV9hZGRyX3QgKlBoeXNpY2FsQWRkcmVzcykKK3sKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCSpWaXJ0dWFsQWRkcmVzcyA9CisJICAgICh2b2lkICopcGNpX2FsbG9jX2NvbnNpc3RlbnQocE9iai0+cGNpX2Rldiwgc2l6ZW9mKGNoYXIpICogTGVuZ3RoLAorCQkJCQkgUGh5c2ljYWxBZGRyZXNzKTsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBBbGxvY2F0ZSBhIHBhY2tldCBidWZmZXIgZm9yIERNQQorICogQVJHVU1FTlRTOgorICogICAgIEFkYXB0ZXJIYW5kbGU6ICBBZGFwdGVySGFuZGxlCisgKiAgICAgTGVuZ3RoOiAgTnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCisgKiAgICAgQ2FjaGVkOiAgV2hldGhlciBvciBub3QgdGhlIG1lbW9yeSBjYW4gYmUgY2FjaGVkCisgKiAgICAgVmlydHVhbEFkZHJlc3M6ICBQb2ludGVyIHRvIG1lbW9yeSBpcyByZXR1cm5lZCBoZXJlCisgKiAgICAgUGh5c2ljYWxBZGRyZXNzOiAgUGh5c2ljYWwgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHZpcnR1YWwgYWRkcmVzcworICogTm90ZXM6CisgKiAgICAgQ2FjaGVkIGlzIGlnbm9yZWQ6IGFsd2F5cyBjYWNoZWQgbWVtb3J5CisgKi8KK3ZvaWQgKlJUTVBfQWxsb2NhdGVSeFBhY2tldEJ1ZmZlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSB1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJCQkJIElOIEJPT0xFQU4gQ2FjaGVkLAorCQkJCQkgdm9pZCAqKiBWaXJ0dWFsQWRkcmVzcywKKwkJCQkJIE9VVCBkbWFfYWRkcl90ICoKKwkJCQkJIFBoeXNpY2FsQWRkcmVzcykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OworCisJcGt0ID0gZGV2X2FsbG9jX3NrYihMZW5ndGgpOworCisJaWYgKHBrdCA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiY2FuJ3QgYWxsb2NhdGUgcnggJWxkIHNpemUgcGFja2V0XG4iLCBMZW5ndGgpKTsKKwl9CisKKwlpZiAocGt0KSB7CisJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOworCQkqVmlydHVhbEFkZHJlc3MgPSAodm9pZCAqKXBrdC0+ZGF0YTsKKwkJKlBoeXNpY2FsQWRkcmVzcyA9CisJCSAgICBQQ0lfTUFQX1NJTkdMRShwQWQsICpWaXJ0dWFsQWRkcmVzcywgTGVuZ3RoLCAtMSwKKwkJCQkgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCX0gZWxzZSB7CisJCSpWaXJ0dWFsQWRkcmVzcyA9ICh2b2lkICopTlVMTDsKKwkJKlBoeXNpY2FsQWRkcmVzcyA9IChkbWFfYWRkcl90KU5VTEw7CisJfQorCisJcmV0dXJuICh2b2lkICopcGt0OworfQorCit2b2lkIEludmFsaWRfUmVtYWluaW5nX1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHVuc2lnbmVkIGxvbmcgVmlydHVhbEFkZHJlc3MpCit7CisJZG1hX2FkZHJfdCBQaHlzaWNhbEFkZHJlc3M7CisKKwlQaHlzaWNhbEFkZHJlc3MgPQorCSAgICBQQ0lfTUFQX1NJTkdMRShwQWQsICh2b2lkICopKFZpcnR1YWxBZGRyZXNzICsgMTYwMCksCisJCQkgICBSWF9CVUZGRVJfTk9STVNJWkUgLSAxNjAwLCAtMSwgUENJX0RNQV9GUk9NREVWSUNFKTsKK30KKworaW50IFJ0bXBOZXRUYXNrSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJdGFza2xldF9pbml0KCZwT2JqLT5yeF9kb25lX3Rhc2ssIHJ4X2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzaywgbWdtdF9kbWFfZG9uZV90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzaywgYWMwX2RtYV9kb25lX3Rhc2tsZXQsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrLCBhYzFfZG1hX2RvbmVfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2ssIGFjMl9kbWFfZG9uZV90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzaywgYWMzX2RtYV9kb25lX3Rhc2tsZXQsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPnRidHRfdGFzaywgdGJ0dF90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+Zmlmb19zdGF0aXN0aWNfZnVsbF90YXNrLAorCQkgICAgIGZpZm9fc3RhdGlzdGljX2Z1bGxfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCit2b2lkIFJ0bXBOZXRUYXNrRXhpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJdGFza2xldF9raWxsKCZwT2JqLT5yeF9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPnRidHRfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5maWZvX3N0YXRpc3RpY19mdWxsX3Rhc2spOworfQorCitpbnQgUnRtcE1nbXRUYXNrSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDbG9zZSBrZXJuZWwgdGhyZWFkcy4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgTk9ORQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSdG1wTWdtdFRhc2tFeGl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0Mjg2MF9pbnRfZW5hYmxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdW5zaWduZWQgaW50IG1vZGUpCit7CisJdTMyIHJlZ1ZhbHVlOworCisJcEFkLT5pbnRfZGlzYWJsZV9tYXNrICY9IH4obW9kZSk7CisJcmVnVmFsdWUgPSBwQWQtPmludF9lbmFibGVfcmVnICYgfihwQWQtPmludF9kaXNhYmxlX21hc2spOworCS8qaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKSAqLworCXsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCByZWdWYWx1ZSk7CS8qIDE6ZW5hYmxlICovCisJfQorCS8qZWxzZSAqLworCS8qICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZk9QX1NUQVRVU19ET1pFICFcbiIpKTsgKi8KKworCWlmIChyZWdWYWx1ZSAhPSAwKQorCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0Mjg2MF9pbnRfZGlzYWJsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHVuc2lnbmVkIGludCBtb2RlKQoreworCXUzMiByZWdWYWx1ZTsKKworCXBBZC0+aW50X2Rpc2FibGVfbWFzayB8PSBtb2RlOworCXJlZ1ZhbHVlID0gcEFkLT5pbnRfZW5hYmxlX3JlZyAmIH4ocEFkLT5pbnRfZGlzYWJsZV9tYXNrKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIHJlZ1ZhbHVlKTsJLyogMDogZGlzYWJsZSAqLworCisJaWYgKHJlZ1ZhbHVlID09IDApIHsKKwkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqCXRhc2tsZXQgcmVsYXRlZCBwcm9jZWR1cmVzLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbWdtdF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopZGF0YTsKKwlJTlRfU09VUkNFX0NTUl9TVFJVQyBJbnRTb3VyY2U7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKworCS8qIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLiAqLworCS8qIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdCAqLworCWlmIChSVE1QX1RFU1RfRkxBRworCSAgICAocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworLyogICAgICBwcmludGsoIm1nbXRfZG1hX2RvbmVfcHJvY2Vzc1xuIik7ICovCisJSW50U291cmNlLndvcmQgPSAwOworCUludFNvdXJjZS5maWVsZC5NZ210RG1hRG9uZSA9IDE7CisJcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX01HTVRfRExZOworCisJUlRNUEhhbmRsZU1nbXRSaW5nRG1hRG9uZUludGVycnVwdChwQWQpOworCisJLyogaWYgeW91IHVzZSBSVE1QX1NFTV9MT0NLLCBzb21ldGltZXMga2VybmVsIHdpbGwgaGFuZyB1cCwgbm8gYW55ICovCisJLyogYnVnIHJlcG9ydCBvdXRwdXQgKi8KKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCisJICovCisJaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfTUdNVF9ETFkpIHsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgVHhEYXRhSW50IGFnYWluICovCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfTUdNVF9ETFkpOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByeF9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilkYXRhOworCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSAwOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4gKi8KKwkvKiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQgKi8KKwlpZiAoUlRNUF9URVNUX0ZMQUcKKwkgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKwlwQWQtPmludF9wZW5kaW5nICY9IH4oSU5UX1JYKTsKKwliUmVzY2hlZHVsZSA9IFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZShwQWQsIDApOworCisJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIHJvdHRpbmcgcGFja2V0CisJICovCisJaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfUlggfHwgYlJlc2NoZWR1bGUpIHsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+cnhfZG9uZV90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgUnhpbnQgYWdhaW4gKi8KKwlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9SWCk7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisKK30KKwordm9pZCBmaWZvX3N0YXRpc3RpY19mdWxsX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilkYXRhOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4gKi8KKwkvKiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQgKi8KKwlpZiAoUlRNUF9URVNUX0ZMQUcKKwkgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKwlwQWQtPmludF9wZW5kaW5nICY9IH4oRmlmb1N0YUZ1bGxJbnQpOworCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOworCisJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIHJvdHRpbmcgcGFja2V0CisJICovCisJaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBGaWZvU3RhRnVsbEludCkgeworCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5maWZvX3N0YXRpc3RpY19mdWxsX3Rhc2spOworCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGVuYWJsZSBSeGludCBhZ2FpbiAqLworCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBGaWZvU3RhRnVsbEludCk7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisKK30KKworc3RhdGljIHZvaWQgYWMzX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilkYXRhOworCUlOVF9TT1VSQ0VfQ1NSX1NUUlVDIEludFNvdXJjZTsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOworCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSAwOworCisJLyogRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuICovCisJLyogVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0ICovCisJaWYgKFJUTVBfVEVTVF9GTEFHCisJICAgIChwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisvKiAgICAgIHByaW50aygiYWMwX2RtYV9kb25lX3Byb2Nlc3NcbiIpOyAqLworCUludFNvdXJjZS53b3JkID0gMDsKKwlJbnRTb3VyY2UuZmllbGQuQWMzRG1hRG9uZSA9IDE7CisJcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX0FDM19ETFk7CisKKwliUmVzY2hlZHVsZSA9IFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCwgSW50U291cmNlKTsKKworCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCBsb3NlIG9mIGludGVycnVwdHMKKwkgKi8KKwlpZiAoKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfQUMzX0RMWSkgfHwgYlJlc2NoZWR1bGUpIHsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOworCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KKwlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzNfRExZKTsKKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYWMyX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilkYXRhOworCUlOVF9TT1VSQ0VfQ1NSX1NUUlVDIEludFNvdXJjZTsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOworCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSAwOworCisJLyogRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuICovCisJLyogVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0ICovCisJaWYgKFJUTVBfVEVTVF9GTEFHCisJICAgIChwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJSW50U291cmNlLndvcmQgPSAwOworCUludFNvdXJjZS5maWVsZC5BYzJEbWFEb25lID0gMTsKKwlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfQUMyX0RMWTsKKworCWJSZXNjaGVkdWxlID0gUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQocEFkLCBJbnRTb3VyY2UpOworCisJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCisJICovCisJaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDMl9ETFkpIHx8IGJSZXNjaGVkdWxlKSB7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgVHhEYXRhSW50IGFnYWluICovCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfQUMyX0RMWSk7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFjMV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopZGF0YTsKKwlJTlRfU09VUkNFX0NTUl9TVFJVQyBJbnRTb3VyY2U7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKwlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKKworCS8qIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLiAqLworCS8qIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdCAqLworCWlmIChSVE1QX1RFU1RfRkxBRworCSAgICAocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworLyogICAgICBwcmludGsoImFjMF9kbWFfZG9uZV9wcm9jZXNzXG4iKTsgKi8KKwlJbnRTb3VyY2Uud29yZCA9IDA7CisJSW50U291cmNlLmZpZWxkLkFjMURtYURvbmUgPSAxOworCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzFfRExZOworCisJYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCisJICovCisJaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDMV9ETFkpIHx8IGJSZXNjaGVkdWxlKSB7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgVHhEYXRhSW50IGFnYWluICovCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfQUMxX0RMWSk7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFjMF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopZGF0YTsKKwlJTlRfU09VUkNFX0NTUl9TVFJVQyBJbnRTb3VyY2U7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKwlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKKworCS8qIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLiAqLworCS8qIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdCAqLworCWlmIChSVE1QX1RFU1RfRkxBRworCSAgICAocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworLyogICAgICBwcmludGsoImFjMF9kbWFfZG9uZV9wcm9jZXNzXG4iKTsgKi8KKwlJbnRTb3VyY2Uud29yZCA9IDA7CisJSW50U291cmNlLmZpZWxkLkFjMERtYURvbmUgPSAxOworCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzBfRExZOworCisvKiAgICAgIFJUTVBIYW5kbGVNZ210UmluZ0RtYURvbmVJbnRlcnJ1cHQocEFkKTsgKi8KKwliUmVzY2hlZHVsZSA9IFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCwgSW50U291cmNlKTsKKworCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCBsb3NlIG9mIGludGVycnVwdHMKKwkgKi8KKwlpZiAoKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfQUMwX0RMWSkgfHwgYlJlc2NoZWR1bGUpIHsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2spOworCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KKwlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzBfRExZKTsKKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICoJaW50ZXJydXB0IGhhbmRsZXIgcmVsYXRlZCBwcm9jZWR1cmVzLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHByaW50X2ludF9jb3VudDsKKworSVJRX0hBTkRMRV9UWVBFIHJ0Mjg2MF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2luc3RhbmNlOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CisJSU5UX1NPVVJDRV9DU1JfU1RSVUMgSW50U291cmNlOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIG5ldF9kZXYpOworCisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKwkvKiBOb3RlIDAzMzEyMDA4OiB3ZSBjYW4gbm90IHJldHVybiBoZXJlIGJlZm9yZQorCSAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsICZJbnRTb3VyY2Uud29yZCk7CisJICAgUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsIEludFNvdXJjZS53b3JkKTsKKwkgICBPciBrZXJuZWwgd2lsbCBwYW5pYyBhZnRlciBpZmNvbmZpZyByYTAgZG93biBzb21ldGltZXMgKi8KKworCS8qICovCisJLyogSW5pdGFsIHRoZSBJbnRlcnJ1cHQgc291cmNlLiAqLworCS8qICovCisJSW50U291cmNlLndvcmQgPSAweDAwMDAwMDAwTDsKKy8qICAgICAgTWN1SW50U291cmNlLndvcmQgPSAweDAwMDAwMDAwTDsgKi8KKworCS8qICovCisJLyogR2V0IHRoZSBpbnRlcnJ1cHQgc291cmNlcyAmIHNhdmVkIHRvIGxvY2FsIHZhcmlhYmxlICovCisJLyogKi8KKwkvKlJUTVBfSU9fUkVBRDMyKHBBZCwgd2hlcmUsICZNY3VJbnRTb3VyY2Uud29yZCk7ICovCisJLypSVE1QX0lPX1dSSVRFMzIocEFkLCAsIE1jdUludFNvdXJjZS53b3JkKTsgKi8KKworCS8qICovCisJLyogRmxhZyBmT1BfU1RBVFVTX0RPWkUgT24sIG1lYW5zIEFTSUMgcHV0IHRvIHNsZWVwLCBlbGFzZSBtZWFucyBBU0lDSyBXYWtlVXAgKi8KKwkvKiBBbmQgYXQgdGhlIHNhbWUgdGltZSwgY2xvY2sgbWF5YmUgdHVybmVkIG9mZiB0aGF0IHNheSB0aGVyZSBpcyBubyBETUEgc2VydmljZS4gKi8KKwkvKiB3aGVuIEFTSUMgZ2V0IHRvIHNsZWVwLiAqLworCS8qIFRvIHByZXZlbnQgc3lzdGVtIGhhbmcgb24gcG93ZXIgc2F2aW5nLiAqLworCS8qIFdlIG5lZWQgdG8gY2hlY2sgaXQgYmVmb3JlIGhhbmRsZSB0aGUgSU5UX1NPVVJDRV9DU1IsIEFTSUMgbXVzdCBiZSB3YWtlIHVwLiAqLworCS8qICovCisJLyogUlQyNjYxID0+IHdoZW4gQVNJQyBpcyBzbGVlcGluZywgTUFDIHJlZ2lzdGVyIGNhbm5vdCBiZSByZWFkIGFuZCB3cml0dGVuLiAqLworCS8qIFJUMjg2MCA9PiB3aGVuIEFTSUMgaXMgc2xlZXBpbmcsIE1BQyByZWdpc3RlciBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbi4gKi8KKy8qICAgICAgaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKSAqLworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgJkludFNvdXJjZS53b3JkKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsIEludFNvdXJjZS53b3JkKTsJLyogd3JpdGUgMSB0byBjbGVhciAqLworCX0KKy8qICAgICAgZWxzZSAqLworLyogICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj4+PmZPUF9TVEFUVVNfRE9aRTw8PFxuIikpOyAqLworCisvKiAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsICZJc3JBZnRlckNsZWFyKTsgKi8KKy8qICAgICAgUlRNUF9JT19SRUFEMzIocEFkLCBNQ1VfSU5UX1NPVVJDRV9DU1IsICZNY3VJc3JBZnRlckNsZWFyKTsgKi8KKy8qICAgICAgREJHUFJJTlQoUlRfREVCVUdfSU5GTywgKCI9PT09PiBSVE1QSGFuZGxlSW50ZXJydXB0KElTUj0lMDh4LE1jdSBJU1I9JTA4eCwgQWZ0ZXIgY2xlYXIgSVNSPSUwOHgsIE1DVSBJU1I9JTA4eClcbiIsICovCisvKiAgICAgICAgICAgICAgICAgICAgICBJbnRTb3VyY2Uud29yZCwgTWN1SW50U291cmNlLndvcmQsIElzckFmdGVyQ2xlYXIsIE1jdUlzckFmdGVyQ2xlYXIpKTsgKi8KKworCS8qIERvIG5vdGhpbmcgaWYgUmVzZXQgaW4gcHJvZ3Jlc3MgKi8KKwlpZiAoUlRNUF9URVNUX0ZMQUcKKwkgICAgKHBBZCwKKwkgICAgIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkgICAgICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSkgeworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCS8qICovCisJLyogSGFuZGxlIGludGVycnVwdCwgd2FsayB0aHJvdWdoIGFsbCBiaXRzICovCisJLyogU2hvdWxkIHN0YXJ0IGZyb20gaGlnaGVzdCBwcmlvcml0eSBpbnRlcnJ1cHQgKi8KKwkvKiBUaGUgcHJpb3JpdHkgY2FuIGJlIGFkanVzdCBieSBhbHRlcmluZyBwcm9jZXNzaW5nIGlmIHN0YXRlbWVudCAqLworCS8qICovCisKKyNpZmRlZiBEQkcKKworI2VuZGlmCisKKwlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKKworCS8qIElmIHJlcXVpcmVkIHNwaW5sb2NrLCBlYWNoIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgaGFzIHRvIGFjcXVpcmUgKi8KKwkvKiBhbmQgcmVsZWFzZSBpdHNlbGYuICovCisJLyogKi8KKworCS8qIERvIG5vdGhpbmcgaWYgTklDIGRvZXNuJ3QgZXhpc3QgKi8KKwlpZiAoSW50U291cmNlLndvcmQgPT0gMHhmZmZmZmZmZikgeworCQlSVE1QX1NFVF9GTEFHKHBBZCwKKwkJCSAgICAgIChmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfAorCQkJICAgICAgIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgVHhDb2hlcmVudCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI+Pj5UeENvaGVyZW50PDw8XG4iKSk7CisJCVJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0KHBBZCk7CisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgUnhDb2hlcmVudCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI+Pj5SeENvaGVyZW50PDw8XG4iKSk7CisJCVJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0KHBBZCk7CisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgRmlmb1N0YUZ1bGxJbnQpIHsKKwkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBGaWZvU3RhRnVsbEludCkgPT0gMCkgeworCQkJLyogbWFzayBGaWZvU3RhRnVsbEludCAqLworCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgRmlmb1N0YUZ1bGxJbnQpOworCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+Zmlmb19zdGF0aXN0aWNfZnVsbF90YXNrKTsKKwkJfQorCQlwQWQtPmludF9wZW5kaW5nIHw9IEZpZm9TdGFGdWxsSW50OworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9NR01UX0RMWSkgeworCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9NR01UX0RMWSkgPT0gMCkgeworCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX01HTVRfRExZKTsKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzayk7CisJCX0KKwkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfTUdNVF9ETFk7CisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgSU5UX1JYKSB7CisJCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX1JYKSA9PSAwKSB7CisKKwkJCS8qIG1hc2sgUnhpbnQgKi8KKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9SWCk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5yeF9kb25lX3Rhc2spOworCQl9CisJCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX1JYOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9BQzNfRExZKSB7CisKKwkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMzX0RMWSkgPT0gMCkgeworCQkJLyogbWFzayBUeERhdGFJbnQgKi8KKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzNfRExZKTsKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKKwkJfQorCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9BQzNfRExZOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9BQzJfRExZKSB7CisKKwkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMyX0RMWSkgPT0gMCkgeworCQkJLyogbWFzayBUeERhdGFJbnQgKi8KKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzJfRExZKTsKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKKwkJfQorCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9BQzJfRExZOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9BQzFfRExZKSB7CisKKwkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfQUMxX0RMWTsKKworCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9BQzFfRExZKSA9PSAwKSB7CisJCQkvKiBtYXNrIFR4RGF0YUludCAqLworCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX0FDMV9ETFkpOworCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOworCQl9CisKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMwX0RMWSkgeworCisvKgorCQlpZiAoSW50U291cmNlLndvcmQgJiAweDIpIHsKKwkJCXUzMiByZWc7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIERFTEFZX0lOVF9DRkcsICZyZWcpOworCQkJcHJpbnRrKCJJbnRTb3VyY2Uud29yZCA9ICUwOHgsIERFTEFZX1JFRyA9ICUwOHhcbiIsIEludFNvdXJjZS53b3JkLCByZWcpOworCQl9CisqLworCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9BQzBfRExZOworCisJCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX0FDMF9ETFkpID09IDApIHsKKwkJCS8qIG1hc2sgVHhEYXRhSW50ICovCisJCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfQUMwX0RMWSk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7CisJCX0KKworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIFByZVRCVFRJbnQpIHsKKwkJUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQocEFkKTsKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBUQlRUSW50KSB7CisJCVJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KHBBZCk7CisJfQorCisJeworCQlpZiAoSW50U291cmNlLndvcmQgJiBBdXRvV2FrZXVwSW50KQorCQkJUlRNUEhhbmRsZVR3YWtldXBJbnRlcnJ1cHQocEFkKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBpbnZhaWxkIG9yIHdyaXRlYmFjayBjYWNoZQorICogYW5kIGNvbnZlcnQgdmlydHVhbCBhZGRyZXNzIHRvIHBoeXNpY2FsIGFkZHJlc3MKKyAqLworZG1hX2FkZHJfdCBsaW51eF9wY2lfbWFwX3NpbmdsZSh2b2lkICpoYW5kbGUsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCisJCQkJaW50IHNkX2lkeCwgaW50IGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKworCS8qCisJICAgLS0tLS0tIFBvcnRpbmcgSW5mb3JtYXRpb24gLS0tLS0tCisJICAgPiBGb3IgVHggQWxsb2M6CisJICAgbWdtdCBwYWNrZXRzID0+IHNkX2lkeCA9IDAKKwkgICBTd0lkeDogcEFkLT5NZ210UmluZy5UeENwdUlkeAorCSAgIHBUeEQgOiBwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLkFsbG9jVmE7CisKKwkgICBkYXRhIHBhY2tldHMgPT4gc2RfaWR4ID0gMQorCSAgIFR4SWR4IDogcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdLlR4Q3B1SWR4CisJICAgUXVlSWR4OiBwVHhCbGstPlF1ZUlkeAorCSAgIHBUeEQgIDogcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdLkNlbGxbVHhJZHhdLkFsbG9jVmE7CisKKwkgICA+IEZvciBSeCBBbGxvYzoKKwkgICBzZF9pZHggPSAtMQorCSAqLworCisJcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKiloYW5kbGU7CisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKwlpZiAoc2RfaWR4ID09IDEpIHsKKwkJc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrOworCQlwVHhCbGsgPSAoc3RydWN0IHJ0X3R4X2JsayAqKXB0cjsKKwkJcmV0dXJuIHBjaV9tYXBfc2luZ2xlKHBPYmotPnBjaV9kZXYsIHBUeEJsay0+cFNyY0J1ZkRhdGEsCisJCQkJICAgICAgcFR4QmxrLT5TcmNCdWZMZW4sIGRpcmVjdGlvbik7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHBjaV9tYXBfc2luZ2xlKHBPYmotPnBjaV9kZXYsIHB0ciwgc2l6ZSwgZGlyZWN0aW9uKTsKKwl9CisKK30KKwordm9pZCBsaW51eF9wY2lfdW5tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsCisJCQkgICAgaW50IGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKworCXBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopaGFuZGxlOworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJcGNpX3VubWFwX3NpbmdsZShwT2JqLT5wY2lfZGV2LCBkbWFfYWRkciwgc2l6ZSwgZGlyZWN0aW9uKTsKKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9wcm9maWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3Byb2ZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjNDFmOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3Byb2ZpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NjIgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgotCi1zdGF0aWMgdm9pZCBIVFBhcmFtZXRlcnNIb29rKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCUNIQVIJCSAgKnBWYWx1ZVN0ciwKLQlJTglDSEFSCQkgICpwSW5wdXQpOwotCi0jZGVmaW5lIEVUSF9NQUNfQUREUl9TVFJfTEVOIDE3ICAvLyBpbiBmb3JtYXQgb2YgeHg6eHg6eHg6eHg6eHg6eHgKLQotLy8gV2UgYXNzdW1lIHRoZSBzMSBpcyBhIHN0aW5nLCBzMiBpcyBhIG1lbW9yeSBzcGFjZSB3aXRoIDYgYnl0ZXMuIGFuZCBjb250ZW50IG9mIHMxIHdpbGwgYmUgY2hhbmdlZC4KLUJPT0xFQU4gcnRzdHJtYWN0b2hleChjaGFyICpzMSwgY2hhciAqczIpCi17Ci0JaW50IGkgPSAwOwotCWNoYXIgKnB0b2tTID0gczEsICpwdG9rRSA9IHMxOwotCi0JaWYgKHN0cmxlbihzMSkgIT0gRVRIX01BQ19BRERSX1NUUl9MRU4pCi0JCXJldHVybiBGQUxTRTsKLQotCXdoaWxlKCgqcHRva1MpICE9ICdcMCcpCi0JewotCQlpZigocHRva0UgPSBzdHJjaHIocHRva1MsICc6JykpICE9IE5VTEwpCi0JCQkqcHRva0UrKyA9ICdcMCc7Ci0JCWlmICgoc3RybGVuKHB0b2tTKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCpwdG9rUykpIHx8ICghaXN4ZGlnaXQoKihwdG9rUysxKSkpKQotCQkJYnJlYWs7IC8vIGZhaWwKLQkJQXRvSChwdG9rUywgJnMyW2krK10sIDEpOwotCQlwdG9rUyA9IHB0b2tFOwotCQlpZiAoaSA9PSA2KQotCQkJYnJlYWs7IC8vIHBhcnNpbmcgZmluaXNoZWQKLQl9Ci0KLQlyZXR1cm4gKCBpID09IDYgPyBUUlVFIDogRkFMU0UpOwotCi19Ci0KLQotLy8gd2UgYXNzdW1lIHRoZSBzMSBhbmQgczIgYm90aCBhcmUgc3RyaW5ncy4KLUJPT0xFQU4gcnRzdHJjYXNlY21wKGNoYXIgKnMxLCBjaGFyICpzMikKLXsKLQljaGFyICpwMSA9IHMxLCAqcDIgPSBzMjsKLQotCWlmIChzdHJsZW4oczEpICE9IHN0cmxlbihzMikpCi0JCXJldHVybiBGQUxTRTsKLQotCXdoaWxlKCpwMSAhPSAnXDAnKQotCXsKLQkJaWYoKCpwMSAhPSAqcDIpICYmICgoKnAxIF4gKnAyKSAhPSAweDIwKSkKLQkJCXJldHVybiBGQUxTRTsKLQkJcDErKzsKLQkJcDIrKzsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLy8gd2UgYXNzdW1lIHRoZSBzMSAoYnVmZmVyKSBhbmQgczIgKGtleSkgYm90aCBhcmUgc3RyaW5ncy4KLWNoYXIgKiBydHN0cnN0cnVuY2FzZWNtcChjaGFyICogczEsIGNoYXIgKiBzMikKLXsKLQlJTlQgbDEsIGwyLCBpOwotCWNoYXIgdGVtcDEsIHRlbXAyOwotCi0JbDIgPSBzdHJsZW4oczIpOwotCWlmICghbDIpCi0JCXJldHVybiAoY2hhciAqKSBzMTsKLQotCWwxID0gc3RybGVuKHMxKTsKLQotCXdoaWxlIChsMSA+PSBsMikKLQl7Ci0JCWwxLS07Ci0KLQkJZm9yKGk9MDsgaTxsMjsgaSsrKQotCQl7Ci0JCQl0ZW1wMSA9ICooczEraSk7Ci0JCQl0ZW1wMiA9ICooczIraSk7Ci0KLQkJCWlmICgoJ2EnIDw9IHRlbXAxKSAmJiAodGVtcDEgPD0gJ3onKSkKLQkJCQl0ZW1wMSA9ICdBJysodGVtcDEtJ2EnKTsKLQkJCWlmICgoJ2EnIDw9IHRlbXAyKSAmJiAodGVtcDIgPD0gJ3onKSkKLQkJCQl0ZW1wMiA9ICdBJysodGVtcDItJ2EnKTsKLQotCQkJaWYgKHRlbXAxICE9IHRlbXAyKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGkgPT0gbDIpCi0JCQlyZXR1cm4gKGNoYXIgKikgczE7Ci0KLQkJczErKzsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsgLy8gbm90IGZvdW5kCi19Ci0KLS8vYWRkIGJ5IGthdGh5Ci0KLSAvKioKLSAgKiBzdHJzdHIgLSBGaW5kIHRoZSBmaXJzdCBzdWJzdHJpbmcgaW4gYSAlTlVMIHRlcm1pbmF0ZWQgc3RyaW5nCi0gICogQHMxOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCi0gICogQHMyOiBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IKLSAgKi8KLWNoYXIgKiBydHN0cnN0cihjb25zdCBjaGFyICogczEsY29uc3QgY2hhciAqIHMyKQotewotCUlOVCBsMSwgbDI7Ci0KLQlsMiA9IHN0cmxlbihzMik7Ci0JaWYgKCFsMikKLQkJcmV0dXJuIChjaGFyICopIHMxOwotCi0JbDEgPSBzdHJsZW4oczEpOwotCi0Jd2hpbGUgKGwxID49IGwyKQotCXsKLQkJbDEtLTsKLQkJaWYgKCFtZW1jbXAoczEsczIsbDIpKQotCQkJcmV0dXJuIChjaGFyICopIHMxOwotCQlzMSsrOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi0vKioKLSAqIHJzdHJ0b2sgLSBTcGxpdCBhIHN0cmluZyBpbnRvIHRva2VucwotICogQHM6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQKLSAqIEBjdDogVGhlIGNoYXJhY3RlcnMgdG8gc2VhcmNoIGZvcgotICogKiBXQVJOSU5HOiBzdHJ0b2sgaXMgZGVwcmVjYXRlZCwgdXNlIHN0cnNlcCBpbnN0ZWFkLiBIb3dldmVyIHN0cnNlcCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG9sZCBhcmNoaXRlY3R1cmUuCi0gKi8KLWNoYXIgKiBfX3JzdHJ0b2s7Ci1jaGFyICogcnN0cnRvayhjaGFyICogcyxjb25zdCBjaGFyICogY3QpCi17Ci0JY2hhciAqc2JlZ2luLCAqc2VuZDsKLQotCXNiZWdpbiAgPSBzID8gcyA6IF9fcnN0cnRvazsKLQlpZiAoIXNiZWdpbikKLQl7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXNiZWdpbiArPSBzdHJzcG4oc2JlZ2luLGN0KTsKLQlpZiAoKnNiZWdpbiA9PSAnXDAnKQotCXsKLQkJX19yc3RydG9rID0gTlVMTDsKLQkJcmV0dXJuKCBOVUxMICk7Ci0JfQotCi0Jc2VuZCA9IHN0cnBicmsoIHNiZWdpbiwgY3QpOwotCWlmIChzZW5kICYmICpzZW5kICE9ICdcMCcpCi0JCSpzZW5kKysgPSAnXDAnOwotCi0JX19yc3RydG9rID0gc2VuZDsKLQotCXJldHVybiAoc2JlZ2luKTsKLX0KLQotLyoqCi0gKiBkZWxpbWl0Y250IC0gcmV0dXJuIHRoZSBjb3VudCBvZiBhIGdpdmVuIGRlbGltaXRlciBpbiBhIGdpdmVuIHN0cmluZy4KLSAqIEBzOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkLgotICogQGN0OiBUaGUgZGVsaW1pdGVyIHRvIHNlYXJjaCBmb3IuCi0gKiBOb3RpY2UgOiBXZSBzdXBwb3NlIHRoZSBkZWxpbWl0ZXIgaXMgYSBzaW5nbGUtY2hhciBzdHJpbmcoZm9yIGV4YW1wbGUgOiAiOyIpLgotICovCi1JTlQgZGVsaW1pdGNudChjaGFyICogcyxjb25zdCBjaGFyICogY3QpCi17Ci0JSU5UIGNvdW50ID0gMDsKLQkvKiBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lICovCi0JY29uc3QgY2hhciAqdG9rZW4gPSBzOwotCi0JZm9yICggOzsgKQotCXsKLQkJdG9rZW4gPSBzdHJwYnJrKHRva2VuLCBjdCk7IC8qIHNlYXJjaCBmb3IgZGVsaW1pdGVycyAqLwotCi0gICAgICAgIGlmICggdG9rZW4gPT0gTlVMTCApCi0JCXsKLQkJCS8qIGFkdmFuY2VkIHRvIHRoZSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3RlciAqLwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogc2tpcCB0aGUgZGVsaW1pdGVyICovCi0JICAgICsrdG9rZW47Ci0KLQkJLyoKLQkJICogUHJpbnQgdGhlIGZvdW5kIHRleHQ6IHVzZSBsZW4gd2l0aCAlLipzIHRvIHNwZWNpZnkgZmllbGQgd2lkdGguCi0JCSAqLwotCi0JCS8qIGFjY3VtdWxhdGUgZGVsaW1pdGVyIGNvdW50ICovCi0JICAgICsrY291bnQ7Ci0JfQotICAgIHJldHVybiBjb3VudDsKLX0KLQotLyoKLSAgKiBjb252ZXJ0cyB0aGUgSW50ZXJuZXQgaG9zdCBhZGRyZXNzIGZyb20gdGhlIHN0YW5kYXJkIG51bWJlcnMtYW5kLWRvdHMgbm90YXRpb24KLSAgKiBpbnRvIGJpbmFyeSBkYXRhLgotICAqIHJldHVybnMgbm9uemVybyBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZCwgemVybyBpZiBub3QuCi0gICovCi1pbnQgcnRpbmV0X2F0b24oY29uc3QgY2hhciAqY3AsIHVuc2lnbmVkIGludCAqYWRkcikKLXsKLQl1bnNpZ25lZCBpbnQgCXZhbDsKLQlpbnQgICAgICAgICAJYmFzZSwgbjsKLQljaGFyICAgICAgICAJYzsKLQl1bnNpZ25lZCBpbnQgICAgcGFydHNbNF07Ci0JdW5zaWduZWQgaW50ICAgICpwcCA9IHBhcnRzOwotCi0JZm9yICg7OykKLSAgICB7Ci0gICAgICAgICAvKgotICAgICAgICAgICogQ29sbGVjdCBudW1iZXIgdXAgdG8gYGAuJycuCi0gICAgICAgICAgKiBWYWx1ZXMgYXJlIHNwZWNpZmllZCBhcyBmb3IgQzoKLSAgICAgICAgICAqCTB4PWhleCwgMD1vY3RhbCwgb3RoZXI9ZGVjaW1hbC4KLSAgICAgICAgICAqLwotICAgICAgICAgdmFsID0gMDsKLSAgICAgICAgIGJhc2UgPSAxMDsKLSAgICAgICAgIGlmICgqY3AgPT0gJzAnKQotICAgICAgICAgewotICAgICAgICAgICAgIGlmICgqKytjcCA9PSAneCcgfHwgKmNwID09ICdYJykKLSAgICAgICAgICAgICAgICAgYmFzZSA9IDE2LCBjcCsrOwotICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgYmFzZSA9IDg7Ci0gICAgICAgICB9Ci0gICAgICAgICB3aGlsZSAoKGMgPSAqY3ApICE9ICdcMCcpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpIGMpKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgdmFsID0gKHZhbCAqIGJhc2UpICsgKGMgLSAnMCcpOwotICAgICAgICAgICAgICAgICBjcCsrOwotICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaWYgKGJhc2UgPT0gMTYgJiYgaXN4ZGlnaXQoKHVuc2lnbmVkIGNoYXIpIGMpKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgdmFsID0gKHZhbCA8PCA0KSArCi0gICAgICAgICAgICAgICAgICAgICAoYyArIDEwIC0gKGlzbG93ZXIoKHVuc2lnbmVkIGNoYXIpIGMpID8gJ2EnIDogJ0EnKSk7Ci0gICAgICAgICAgICAgICAgIGNwKys7Ci0gICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgqY3AgPT0gJy4nKQotICAgICAgICAgewotICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICogSW50ZXJuZXQgZm9ybWF0OiBhLmIuYy5kIGEuYi5jICAgKHdpdGggYyB0cmVhdGVkIGFzIDE2LWJpdHMpCi0gICAgICAgICAgICAgICogYS5iICAgICAod2l0aCBiIHRyZWF0ZWQgYXMgMjQgYml0cykKLSAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICBpZiAocHAgPj0gcGFydHMgKyAzIHx8IHZhbCA+IDB4ZmYpCi0gICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICpwcCsrID0gdmFsLCBjcCsrOwotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgIGJyZWFrOwotICAgICB9Ci0KLSAgICAgLyoKLSAgICAgICogQ2hlY2sgZm9yIHRyYWlsaW5nIGp1bmsuCi0gICAgICAqLwotICAgICB3aGlsZSAoKmNwKQotICAgICAgICAgaWYgKCFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqY3ArKykpCi0gICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgLyoKLSAgICAgICogQ29uY29jdCB0aGUgYWRkcmVzcyBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBwYXJ0cyBzcGVjaWZpZWQuCi0gICAgICAqLwotICAgICBuID0gcHAgLSBwYXJ0cyArIDE7Ci0gICAgIHN3aXRjaCAobikKLSAgICAgewotCi0gICAgICAgICBjYXNlIDE6ICAgICAgICAgLyogYSAtLSAzMiBiaXRzICovCi0gICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgIGNhc2UgMjogICAgICAgICAvKiBhLmIgLS0gOC4yNCBiaXRzICovCi0gICAgICAgICAgICAgaWYgKHZhbCA+IDB4ZmZmZmZmKQotICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICB2YWwgfD0gcGFydHNbMF0gPDwgMjQ7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgIGNhc2UgMzogICAgICAgICAvKiBhLmIuYyAtLSA4LjguMTYgYml0cyAqLwotICAgICAgICAgICAgIGlmICh2YWwgPiAweGZmZmYpCi0gICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgIHZhbCB8PSAocGFydHNbMF0gPDwgMjQpIHwgKHBhcnRzWzFdIDw8IDE2KTsKLSAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgY2FzZSA0OiAgICAgICAgIC8qIGEuYi5jLmQgLS0gOC44LjguOCBiaXRzICovCi0gICAgICAgICAgICAgaWYgKHZhbCA+IDB4ZmYpCi0gICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgIHZhbCB8PSAocGFydHNbMF0gPDwgMjQpIHwgKHBhcnRzWzFdIDw8IDE2KSB8IChwYXJ0c1syXSA8PCA4KTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgfQotCi0gICAgICphZGRyID0gaHRvbmwodmFsKTsKLSAgICAgcmV0dXJuIDE7Ci0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIEZpbmQga2V5IHNlY3Rpb24gZm9yIEdldCBrZXkgcGFyYW1ldGVyLgotCi0gICAgQXJndW1lbnRzOgotICAgICAgICBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHN0YXJ0IGZpbmQgdGhlIGtleSBzZWN0aW9uCi0gICAgICAgIHNlY3Rpb24gICAgICAgICAgICAgICAgICAgICB0aGUga2V5IG9mIHRoZSBzZWNpb24gdG8gYmUgZmluZAotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgRmFpbAotICAgICAgICBPdGhlcnMgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcwotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVBVQ0hBUiAgUlRNUEZpbmRTZWN0aW9uKAotICAgIElOICBQQ0hBUiAgIGJ1ZmZlcikKLXsKLSAgICBDSEFSIHRlbXBfYnVmWzMyXTsKLSAgICBQVUNIQVIgIHB0cjsKLQotICAgIHN0cmNweSh0ZW1wX2J1ZiwgIkRlZmF1bHQiKTsKLQotICAgIGlmKChwdHIgPSBydHN0cnN0cihidWZmZXIsIHRlbXBfYnVmKSkgIT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiAocHRyK3N0cmxlbigiXG4iKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICAgICAgR2V0IGtleSBwYXJhbWV0ZXIuCi0KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIGtleSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGtleSBzdHJpbmcKLSAgICAgICAgZGVzdCAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gZGVzdGluYXRpb24KLSAgICAgICAgZGVzdHNpemUgICAgICAgICAgICAgICAgICAgIFRoZSBkYXRhc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24KLSAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdGFydCBmaW5kIHRoZSBrZXkKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKLSAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKLQotICAgIE5vdGU6Ci0gICAgICAgIFRoaXMgcm91dGluZSBnZXQgdGhlIHZhbHVlIHdpdGggdGhlIG1hdGNoZWQga2V5IChjYXNlIGNhc2Utc2Vuc2l0aXZlKQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBSVE1QR2V0S2V5UGFyYW1ldGVyKAotICAgIElOICBQQ0hBUiAgIGtleSwKLSAgICBPVVQgUENIQVIgICBkZXN0LAotICAgIElOICBJTlQgICAgIGRlc3RzaXplLAotICAgIElOICBQQ0hBUiAgIGJ1ZmZlcikKLXsKLSAgICBVQ0hBUiAqdGVtcF9idWYxID0gTlVMTDsKLSAgICBVQ0hBUiAqdGVtcF9idWYyID0gTlVMTDsKLSAgICBDSEFSICpzdGFydF9wdHI7Ci0gICAgQ0hBUiAqZW5kX3B0cjsKLSAgICBDSEFSICpwdHI7Ci0gICAgQ0hBUiAqb2Zmc2V0ID0gMDsKLSAgICBJTlQgIGxlbjsKLQotCS8vdGVtcF9idWYxID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKLQlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMSwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKLQotCWlmKHRlbXBfYnVmMSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLQotCS8vdGVtcF9idWYyID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKLQlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMiwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKLQlpZih0ZW1wX2J1ZjIgPT0gTlVMTCkKLQl7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOwotCX0KLQotICAgIC8vZmluZCBzZWN0aW9uCi0gICAgaWYoKG9mZnNldCA9IFJUTVBGaW5kU2VjdGlvbihidWZmZXIpKSA9PSBOVUxMKQotICAgIHsKLSAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKLSAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0gICAgfQotCi0gICAgc3RyY3B5KHRlbXBfYnVmMSwgIlxuIik7Ci0gICAgc3RyY2F0KHRlbXBfYnVmMSwga2V5KTsKLSAgICBzdHJjYXQodGVtcF9idWYxLCAiPSIpOwotCi0gICAgLy9zZWFyY2gga2V5Ci0gICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cihvZmZzZXQsIHRlbXBfYnVmMSkpPT1OVUxMKQotICAgIHsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKLSAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0gICAgfQotCi0gICAgc3RhcnRfcHRyKz1zdHJsZW4oIlxuIik7Ci0gICAgaWYoKGVuZF9wdHI9cnRzdHJzdHIoc3RhcnRfcHRyLCAiXG4iKSk9PU5VTEwpCi0gICAgICAgZW5kX3B0cj1zdGFydF9wdHIrc3RybGVuKHN0YXJ0X3B0cik7Ci0KLSAgICBpZiAoZW5kX3B0cjxzdGFydF9wdHIpCi0gICAgewotCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOwotICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOwotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLSAgICB9Ci0KLSAgICBOZGlzTW92ZU1lbW9yeSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0ciwgZW5kX3B0ci1zdGFydF9wdHIpOwotICAgIHRlbXBfYnVmMltlbmRfcHRyLXN0YXJ0X3B0cl09J1wwJzsKLSAgICBsZW4gPSBzdHJsZW4odGVtcF9idWYyKTsKLSAgICBzdHJjcHkodGVtcF9idWYxLCB0ZW1wX2J1ZjIpOwotICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIodGVtcF9idWYxLCAiPSIpKSA9PSBOVUxMKQotICAgIHsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKLSAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0gICAgfQotCi0gICAgc3RyY3B5KHRlbXBfYnVmMiwgc3RhcnRfcHRyKzEpOwotICAgIHB0ciA9IHRlbXBfYnVmMjsKLSAgICAvL3RyaW0gc3BhY2Ugb3IgdGFiCi0gICAgd2hpbGUoKnB0ciAhPSAweDAwKQotICAgIHsKLSAgICAgICAgaWYoICgqcHRyID09ICcgJykgfHwgKCpwdHIgPT0gJ1x0JykgKQotICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgbGVuID0gc3RybGVuKHB0cik7Ci0gICAgbWVtc2V0KGRlc3QsIDB4MDAsIGRlc3RzaXplKTsKLSAgICBzdHJuY3B5KGRlc3QsIHB0ciwgbGVuID49IGRlc3RzaXplID8gIGRlc3RzaXplOiBsZW4pOwotCi0Jb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKLSAgICBvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOwotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICAgICAgR2V0IGtleSBwYXJhbWV0ZXIuCi0KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIGtleSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGtleSBzdHJpbmcKLSAgICAgICAgZGVzdCAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gZGVzdGluYXRpb24KLSAgICAgICAgZGVzdHNpemUgICAgICAgICAgICAgICAgICAgIFRoZSBkYXRhc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24KLSAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdGFydCBmaW5kIHRoZSBrZXkKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKLSAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKLQotICAgIE5vdGU6Ci0gICAgICAgIFRoaXMgcm91dGluZSBnZXQgdGhlIHZhbHVlIHdpdGggdGhlIG1hdGNoZWQga2V5IChjYXNlIGNhc2Utc2Vuc2l0aXZlKS4KLSAgICAgICAgSXQgaXMgY2FsbGVkIGZvciBwYXJzaW5nIFNTSUQgYW5kIGFueSBrZXkgc3RyaW5nLgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBSVE1QR2V0Q3JpdGljYWxQYXJhbWV0ZXIoCi0gICAgSU4gIFBDSEFSICAga2V5LAotICAgIE9VVCBQQ0hBUiAgIGRlc3QsCi0gICAgSU4gIElOVCAgICAgZGVzdHNpemUsCi0gICAgSU4gIFBDSEFSICAgYnVmZmVyKQotewotICAgIFVDSEFSICp0ZW1wX2J1ZjEgPSBOVUxMOwotICAgIFVDSEFSICp0ZW1wX2J1ZjIgPSBOVUxMOwotICAgIENIQVIgKnN0YXJ0X3B0cjsKLSAgICBDSEFSICplbmRfcHRyOwotICAgIENIQVIgKnB0cjsKLSAgICBDSEFSICpvZmZzZXQgPSAwOwotICAgIElOVCAgbGVuOwotCi0JLy90ZW1wX2J1ZjEgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOwotCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYxLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOwotCi0JaWYodGVtcF9idWYxID09IE5VTEwpCi0gICAgICAgIHJldHVybiAoRkFMU0UpOwotCi0JLy90ZW1wX2J1ZjIgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOwotCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYyLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOwotCWlmKHRlbXBfYnVmMiA9PSBOVUxMKQotCXsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0JfQotCi0gICAgLy9maW5kIHNlY3Rpb24KLSAgICBpZigob2Zmc2V0ID0gUlRNUEZpbmRTZWN0aW9uKGJ1ZmZlcikpID09IE5VTEwpCi0gICAgewotICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOwotICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOwotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLSAgICB9Ci0KLSAgICBzdHJjcHkodGVtcF9idWYxLCAiXG4iKTsKLSAgICBzdHJjYXQodGVtcF9idWYxLCBrZXkpOwotICAgIHN0cmNhdCh0ZW1wX2J1ZjEsICI9Iik7Ci0KLSAgICAvL3NlYXJjaCBrZXkKLSAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKG9mZnNldCwgdGVtcF9idWYxKSk9PU5VTEwpCi0gICAgewotCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOwotICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOwotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLSAgICB9Ci0KLSAgICBzdGFydF9wdHIrPXN0cmxlbigiXG4iKTsKLSAgICBpZigoZW5kX3B0cj1ydHN0cnN0cihzdGFydF9wdHIsICJcbiIpKT09TlVMTCkKLSAgICAgICBlbmRfcHRyPXN0YXJ0X3B0citzdHJsZW4oc3RhcnRfcHRyKTsKLQotICAgIGlmIChlbmRfcHRyPHN0YXJ0X3B0cikKLSAgICB7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7Ci0gICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOwotICAgIH0KLQotICAgIE5kaXNNb3ZlTWVtb3J5KHRlbXBfYnVmMiwgc3RhcnRfcHRyLCBlbmRfcHRyLXN0YXJ0X3B0cik7Ci0gICAgdGVtcF9idWYyW2VuZF9wdHItc3RhcnRfcHRyXT0nXDAnOwotICAgIGxlbiA9IHN0cmxlbih0ZW1wX2J1ZjIpOwotICAgIHN0cmNweSh0ZW1wX2J1ZjEsIHRlbXBfYnVmMik7Ci0gICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cih0ZW1wX2J1ZjEsICI9IikpID09IE5VTEwpCi0gICAgewotCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOwotICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOwotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLSAgICB9Ci0KLSAgICBzdHJjcHkodGVtcF9idWYyLCBzdGFydF9wdHIrMSk7Ci0gICAgcHRyID0gdGVtcF9idWYyOwotCi0gICAgLy90cmltIHRhYgotICAgIC8qIFdlIGNhbm5vdCB0cmltIHNwYWNlKCcgJykgZm9yIFNTSUQgYW5kIGtleSBzdHJpbmcuICovCi0gICAgd2hpbGUoKnB0ciAhPSAweDAwKQotICAgIHsKLSAgICAgICAgLy9pZiggKCpwdHIgPT0gJyAnKSB8fCAoKnB0ciA9PSAnXHQnKSApCi0gICAgICAgIGlmKCAoKnB0ciA9PSAnXHQnKSApCi0gICAgICAgICAgICBwdHIrKzsKLSAgICAgICAgZWxzZQotICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBsZW4gPSBzdHJsZW4ocHRyKTsKLSAgICBtZW1zZXQoZGVzdCwgMHgwMCwgZGVzdHNpemUpOwotICAgIHN0cm5jcHkoZGVzdCwgcHRyLCBsZW4gPj0gZGVzdHNpemUgPyAgZGVzdHNpemU6IGxlbik7Ci0KLQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOwotICAgIG9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgotICAgICAgICBHZXQgbXVsdGlwbGUga2V5IHBhcmFtZXRlci4KLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAga2V5ICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8ga2V5IHN0cmluZwotICAgICAgICBkZXN0ICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBkZXN0aW5hdGlvbgotICAgICAgICBkZXN0c2l6ZSAgICAgICAgICAgICAgICAgICAgVGhlIGRhdGFzaXplIG9mIHRoZSBkZXN0aW5hdGlvbgotICAgICAgICBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHN0YXJ0IGZpbmQgdGhlIGtleQotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBUUlVFICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcwotICAgICAgICBGQUxTRSAgICAgICAgICAgICAgICAgICAgICAgRmFpbAotCi0gICAgTm90ZToKLSAgICAgICAgVGhpcyByb3V0aW5lIGdldCB0aGUgdmFsdWUgd2l0aCB0aGUgbWF0Y2hlZCBrZXkgKGNhc2UgY2FzZS1zZW5zaXRpdmUpCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFJUTVBHZXRLZXlQYXJhbWV0ZXJXaXRoT2Zmc2V0KAotICAgIElOICBQQ0hBUiAgIGtleSwKLSAgICBPVVQgUENIQVIgICBkZXN0LAotICAgIE9VVAlVU0hPUlQJKmVuZF9vZmZzZXQsCi0gICAgSU4gIElOVCAgICAgZGVzdHNpemUsCi0gICAgSU4gIFBDSEFSICAgYnVmZmVyLAotICAgIElOCUJPT0xFQU4JYlRyaW1TcGFjZSkKLXsKLSAgICBVQ0hBUiAqdGVtcF9idWYxID0gTlVMTDsKLSAgICBVQ0hBUiAqdGVtcF9idWYyID0gTlVMTDsKLSAgICBDSEFSICpzdGFydF9wdHI7Ci0gICAgQ0hBUiAqZW5kX3B0cjsKLSAgICBDSEFSICpwdHI7Ci0gICAgQ0hBUiAqb2Zmc2V0ID0gMDsKLSAgICBJTlQgIGxlbjsKLQotCWlmICgqZW5kX29mZnNldCA+PSBNQVhfSU5JX0JVRkZFUl9TSVpFKQotCQlyZXR1cm4gKEZBTFNFKTsKLQotCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYxLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOwotCi0JaWYodGVtcF9idWYxID09IE5VTEwpCi0gICAgICAgIHJldHVybiAoRkFMU0UpOwotCi0Jb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjIsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7Ci0JaWYodGVtcF9idWYyID09IE5VTEwpCi0JewotCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOwotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLQl9Ci0KLSAgICAvL2ZpbmQgc2VjdGlvbgotCWlmKCplbmRfb2Zmc2V0ID09IDApCi0gICAgewotCQlpZiAoKG9mZnNldCA9IFJUTVBGaW5kU2VjdGlvbihidWZmZXIpKSA9PSBOVUxMKQotCQl7Ci0JCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOwotCSAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKLSAgICAJICAgIHJldHVybiAoRkFMU0UpOwotCQl9Ci0gICAgfQotCWVsc2UKLQkJb2Zmc2V0ID0gYnVmZmVyICsgKCplbmRfb2Zmc2V0KTsKLQotICAgIHN0cmNweSh0ZW1wX2J1ZjEsICJcbiIpOwotICAgIHN0cmNhdCh0ZW1wX2J1ZjEsIGtleSk7Ci0gICAgc3RyY2F0KHRlbXBfYnVmMSwgIj0iKTsKLQotICAgIC8vc2VhcmNoIGtleQotICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIob2Zmc2V0LCB0ZW1wX2J1ZjEpKT09TlVMTCkKLSAgICB7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7Ci0gICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOwotICAgIH0KLQotICAgIHN0YXJ0X3B0cis9c3RybGVuKCJcbiIpOwotICAgIGlmKChlbmRfcHRyPXJ0c3Ryc3RyKHN0YXJ0X3B0ciwgIlxuIikpPT1OVUxMKQotICAgICAgIGVuZF9wdHI9c3RhcnRfcHRyK3N0cmxlbihzdGFydF9wdHIpOwotCi0gICAgaWYgKGVuZF9wdHI8c3RhcnRfcHRyKQotICAgIHsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKLSAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0gICAgfQotCi0JKmVuZF9vZmZzZXQgPSBlbmRfcHRyIC0gYnVmZmVyOwotCi0gICAgTmRpc01vdmVNZW1vcnkodGVtcF9idWYyLCBzdGFydF9wdHIsIGVuZF9wdHItc3RhcnRfcHRyKTsKLSAgICB0ZW1wX2J1ZjJbZW5kX3B0ci1zdGFydF9wdHJdPSdcMCc7Ci0gICAgbGVuID0gc3RybGVuKHRlbXBfYnVmMik7Ci0gICAgc3RyY3B5KHRlbXBfYnVmMSwgdGVtcF9idWYyKTsKLSAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKHRlbXBfYnVmMSwgIj0iKSkgPT0gTlVMTCkKLSAgICB7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7Ci0gICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOwotICAgIH0KLQotICAgIHN0cmNweSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0cisxKTsKLSAgICBwdHIgPSB0ZW1wX2J1ZjI7Ci0gICAgLy90cmltIHNwYWNlIG9yIHRhYgotICAgIHdoaWxlKCpwdHIgIT0gMHgwMCkKLSAgICB7Ci0gICAgICAgIGlmKChiVHJpbVNwYWNlICYmICgqcHRyID09ICcgJykpIHx8ICgqcHRyID09ICdcdCcpICkKLSAgICAgICAgICAgIHB0cisrOwotICAgICAgICBlbHNlCi0gICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGxlbiA9IHN0cmxlbihwdHIpOwotICAgIG1lbXNldChkZXN0LCAweDAwLCBkZXN0c2l6ZSk7Ci0gICAgc3RybmNweShkZXN0LCBwdHIsIGxlbiA+PSBkZXN0c2l6ZSA/ICBkZXN0c2l6ZTogbGVuKTsKLQotCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7Ci0gICAgb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi1zdGF0aWMgaW50IHJ0bXBfcGFyc2Vfa2V5X2J1ZmZlcl9mcm9tX2ZpbGUoSU4gIFBSVE1QX0FEQVBURVIgcEFkLElOICBjaGFyICpidWZmZXIsSU4gIFVMT05HIEtleVR5cGUsSU4gIElOVCBCU1NJZHgsSU4gIElOVCBLZXlJZHgpCi17Ci0JUFVDSEFSCQlrZXlidWZmOwotCUlOVAkJCWkgPSBCU1NJZHgsIGlkeCA9IEtleUlkeDsKLQlVTE9ORwkJS2V5TGVuOwotCVVDSEFSCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0KLQlrZXlidWZmID0gYnVmZmVyOwotCUtleUxlbiA9IHN0cmxlbihrZXlidWZmKTsKLQotCWlmIChLZXlUeXBlID09IDEpCi0Jey8vQXNjaWkKLQkJaWYoIChLZXlMZW4gPT0gNSkgfHwgKEtleUxlbiA9PSAxMykpCi0JCXsKLQkJCXBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uS2V5TGVuID0gS2V5TGVuOwotCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbaV1baWR4XS5LZXksIGtleWJ1ZmYsIEtleUxlbik7Ci0JCQlpZiAoS2V5TGVuID09IDUpCi0JCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotCQkJZWxzZQotCQkJCUNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0JCQlwQWQtPlNoYXJlZEtleVtpXVtpZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSS9GKHdsYW4lZCkgS2V5JWRTdHI9JXMgYW5kIHR5cGU9JXNcbiIsIGksIGlkeCsxLCBrZXlidWZmLCAoS2V5VHlwZSA9PSAwKSA/ICJIZXgiOiJBc2NpaSIpKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCWVsc2UKLQkJey8vSW52YWxpZCBrZXkgbGVuZ3RoCi0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJLZXklZFN0ciBpcyBJbnZhbGlkIGtleSBsZW5ndGghIEtleUxlbiA9ICVsZCFcbiIsIGlkeCsxLCBLZXlMZW4pKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCWVsc2UKLQl7Ly9IZXggdHlwZQotCQlpZiggKEtleUxlbiA9PSAxMCkgfHwgKEtleUxlbiA9PSAyNikpCi0JCXsKLQkJCXBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uS2V5TGVuID0gS2V5TGVuIC8gMjsKLQkJCUF0b0goa2V5YnVmZiwgcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5LZXksIEtleUxlbiAvIDIpOwotCQkJaWYgKEtleUxlbiA9PSAxMCkKLQkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0JCQllbHNlCi0JCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLQkJCXBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJL0Yod2xhbiVkKSBLZXklZFN0cj0lcyBhbmQgdHlwZT0lc1xuIiwgaSwgaWR4KzEsIGtleWJ1ZmYsIChLZXlUeXBlID09IDApID8gIkhleCI6IkFzY2lpIikpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJZWxzZQotCQl7Ly9JbnZhbGlkIGtleSBsZW5ndGgKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkkvRih3bGFuJWQpIEtleSVkU3RyIGlzIEludmFsaWQga2V5IGxlbmd0aCEgS2V5TGVuID0gJWxkIVxuIiwgaSwgaWR4KzEsIEtleUxlbikpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci19Ci1zdGF0aWMgdm9pZCBydG1wX3JlYWRfa2V5X3Bhcm1zX2Zyb21fZmlsZShJTiAgUFJUTVBfQURBUFRFUiBwQWQsIGNoYXIgKnRtcGJ1ZiwgY2hhciAqYnVmZmVyKQotewotCWNoYXIJCXRva19zdHJbMTZdOwotCVBVQ0hBUgkJbWFjcHRyOwotCUlOVAkJCWkgPSAwLCBpZHg7Ci0JVUxPTkcJCUtleVR5cGVbTUFYX01CU1NJRF9OVU1dOwotCVVMT05HCQlLZXlJZHg7Ci0KLQlOZGlzWmVyb01lbW9yeShLZXlUeXBlLCBNQVhfTUJTU0lEX05VTSk7Ci0KLQkvL0RlZmF1bHRLZXlJRAotCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkRlZmF1bHRLZXlJRCIsIHRtcGJ1ZiwgMjUsIGJ1ZmZlcikpCi0JewotCQl7Ci0JCQlLZXlJZHggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJaWYoKEtleUlkeCA+PSAxICkgJiYgKEtleUlkeCA8PSA0KSkKLQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIChLZXlJZHggLSAxKTsKLQkJCWVsc2UKLQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAwOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZWZhdWx0S2V5SUQoMH4zKT0lZFxuIiwgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7Ci0JCX0KLQl9Ci0KLQotCWZvciAoaWR4ID0gMDsgaWR4IDwgNDsgaWR4KyspCi0JewotCQlzcHJpbnRmKHRva19zdHIsICJLZXklZFR5cGUiLCBpZHggKyAxKTsKLQkJLy9LZXkxVHlwZQotCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcih0b2tfc3RyLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKLQkJewotCQkgICAgZm9yIChpID0gMCwgbWFjcHRyID0gcnN0cnRvayh0bXBidWYsIjsiKTsgbWFjcHRyOyBtYWNwdHIgPSByc3RydG9rKE5VTEwsIjsiKSwgaSsrKQotCQkgICAgewotCQkJICAgIEtleVR5cGVbaV0gPSBzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApOwotCQkgICAgfQotCi0JCQl7Ci0JCQkJc3ByaW50Zih0b2tfc3RyLCAiS2V5JWRTdHIiLCBpZHggKyAxKTsKLQkJCQlpZiAoUlRNUEdldENyaXRpY2FsUGFyYW1ldGVyKHRva19zdHIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQotCQkJCXsKLQkJCQkJcnRtcF9wYXJzZV9rZXlfYnVmZmVyX2Zyb21fZmlsZShwQWQsIHRtcGJ1ZiwgS2V5VHlwZVtCU1MwXSwgQlNTMCwgaWR4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0bXBfcmVhZF9zdGFfd21tX3Bhcm1zX2Zyb21fZmlsZShJTiAgUFJUTVBfQURBUFRFUiBwQWQsIGNoYXIgKnRtcGJ1ZiwgY2hhciAqYnVmZmVyKQotewotCVBVQ0hBUgkJCQkJbWFjcHRyOwotCUlOVAkJCQkJCWk9MDsKLQlCT09MRUFOCQkJCQliV21tRW5hYmxlID0gRkFMU0U7Ci0KLQkvL1dtbUNhcGFibGUKLQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXbW1DYXBhYmxlIiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKLQl7Ci0JCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgLy9FbmFibGUKLQkJewotCQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBUUlVFOwotCQkJYldtbUVuYWJsZSA9IFRSVUU7Ci0JCX0KLQkJZWxzZSAvL0Rpc2FibGUKLQkJewotCQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBGQUxTRTsKLQkJfQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldtbUNhcGFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7Ci0JfQotCi0JLy9BY2tQb2xpY3kgZm9yIEFDX0JLLCBBQ19CRSwgQUNfVkksIEFDX1ZPCi0JaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQWNrUG9saWN5IiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKLQl7Ci0JCWZvciAoaSA9IDAsIG1hY3B0ciA9IHJzdHJ0b2sodG1wYnVmLCI7Iik7IG1hY3B0cjsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKLQkJewotCQkJcEFkLT5Db21tb25DZmcuQWNrUG9saWN5W2ldID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2wobWFjcHRyLCAwLCAxMCk7Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFja1BvbGljeVslZF09JWRcbiIsIGksIHBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtpXSkpOwotCQl9Ci0JfQotCi0JaWYgKGJXbW1FbmFibGUpCi0JewotCQkvL0FQU0RDYXBhYmxlCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkFQU0RDYXBhYmxlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLQkJewotCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKLQkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSBUUlVFOwotCQkJZWxzZQotCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSA9IEZBTFNFOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBUFNEQ2FwYWJsZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlKSk7Ci0JCX0KLQotCQkvL0FQU0RBQyBmb3IgQUNfQkUsIEFDX0JLLCBBQ19WSSwgQUNfVk8KLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQVBTREFDIiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKLQkJewotCQkJQk9PTEVBTiBhcHNkX2FjWzRdOwotCi0JCQlmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCi0JCQl7Ci0JCQkJYXBzZF9hY1tpXSA9IChCT09MRUFOKXNpbXBsZV9zdHJ0b2wobWFjcHRyLCAwLCAxMCk7Ci0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBUFNEQUMlZCAgJWRcbiIsIGksICBhcHNkX2FjW2ldKSk7Ci0JCQl9Ci0KLQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgPSBhcHNkX2FjWzBdOwotCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSyA9IGFwc2RfYWNbMV07Ci0JCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJID0gYXBzZF9hY1syXTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8gPSBhcHNkX2FjWzNdOwotCQl9Ci0JfQotCi19Ci0KLU5ESVNfU1RBVFVTCVJUTVBSZWFkUGFyYW1ldGVyc0hvb2soCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JUFVDSEFSCQkJCQlzcmMgPSBOVUxMOwotCXN0cnVjdCBmaWxlCQkJCSpzcmNmOwotCUlOVCAJCQkJCXJldHZhbDsKLSAgIAltbV9zZWdtZW50X3QJCQlvcmdmczsKLQlDSEFSCQkJCQkqYnVmZmVyOwotCUNIQVIJCQkJCSp0bXBidWY7Ci0JVUxPTkcJCQkJCVJ0c1RocmVzaDsKLQlVTE9ORwkJCQkJRnJhZ1RocmVzaDsKLQlVQ0hBUgkgICAgICAgICAgICAgICAga2V5TWF0ZXJpYWxbNDBdOwotCi0JUFVDSEFSCQkJCQltYWNwdHI7Ci0JSU5UCQkJCQkJaSA9IDA7Ci0KLQlidWZmZXIgPSBrbWFsbG9jKE1BWF9JTklfQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKLQlpZihidWZmZXIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0KLQl0bXBidWYgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOwotCWlmKHRtcGJ1ZiA9PSBOVUxMKQotCXsKLQkJa2ZyZWUoYnVmZmVyKTsKLSAgICAgICAgcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0Jc3JjID0gU1RBX1BST0ZJTEVfUEFUSDsKLQotICAgIG9yZ2ZzID0gZ2V0X2ZzKCk7Ci0gICAgc2V0X2ZzKEtFUk5FTF9EUyk7Ci0KLQlpZiAoc3JjICYmICpzcmMpCi0JewotCQlzcmNmID0gZmlscF9vcGVuKHNyYywgT19SRE9OTFksIDApOwotCQlpZiAoSVNfRVJSKHNyY2YpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIC1QVFJfRVJSKHNyY2YpLHNyYykpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gVGhlIG9iamVjdCBtdXN0IGhhdmUgYSByZWFkIG1ldGhvZAotCQkJaWYgKHNyY2YtPmZfb3AgJiYgc3JjZi0+Zl9vcC0+cmVhZCkKLQkJCXsKLQkJCQltZW1zZXQoYnVmZmVyLCAweDAwLCBNQVhfSU5JX0JVRkZFUl9TSVpFKTsKLQkJCQlyZXR2YWw9c3JjZi0+Zl9vcC0+cmVhZChzcmNmLCBidWZmZXIsIE1BWF9JTklfQlVGRkVSX1NJWkUsICZzcmNmLT5mX3Bvcyk7Ci0JCQkJaWYgKHJldHZhbCA8IDApCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gUmVhZCAlcyBlcnJvciAlZFxuIiwgc3JjLCAtcmV0dmFsKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vIHNldCBmaWxlIHBhcmFtZXRlciB0byBwb3J0Y2ZnCi0JCQkJCS8vQ291bnRyeVJlZ2lvbgotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDb3VudHJ5UmVnaW9uIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNvdW50cnlSZWdpb249JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pKTsKLQkJCQkJfQotCQkJCQkvL0NvdW50cnlSZWdpb25BQmFuZAotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDb3VudHJ5UmVnaW9uQUJhbmQiLCB0bXBidWYsIDI1LCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQ9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNvdW50cnlSZWdpb25BQmFuZD0lZFxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kKSk7Ci0JCQkJCX0KLQkJCQkJLy9Db3VudHJ5Q29kZQotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDb3VudHJ5Q29kZSIsIHRtcGJ1ZiwgMjUsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlLCB0bXBidWYgLCAyKTsKLQotCQkJCQkJaWYgKHN0cmxlbihwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSkgIT0gMCkKLQkJCQkJCXsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iQ291bnRyeUZsYWcgPSBUUlVFOwotCQkJCQkJfQotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ291bnRyeUNvZGU9JXNcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlKSk7Ci0JCQkJCX0KLQkJCQkJLy9DaGFubmVsR2VvZ3JhcGh5Ci0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNoYW5uZWxHZW9ncmFwaHkiLCB0bXBidWYsIDI1LCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQlVQ0hBUiBHZW9ncmFwaHkgPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQkJCQlpZiAoR2VvZ3JhcGh5IDw9IEJPVEgpCi0JCQkJCQl7Ci0JCQkJCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gR2VvZ3JhcGh5OwotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlWzJdID0KLQkJCQkJCQkJKHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9PSBCT1RIKSA/ICcgJyA6ICgocEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID09IElET1IpID8gJ0knIDogJ08nKTsKLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsR2VvZ3JhcGh5PSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IEJPVEg7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZVsyXSA9ICcgJzsKLQkJCQkJfQotCi0JCQkJCXsKLQkJCQkJCS8vU1NJRAotCQkJCQkJaWYgKFJUTVBHZXRDcml0aWNhbFBhcmFtZXRlcigiU1NJRCIsIHRtcGJ1ZiwgMjU2LCBidWZmZXIpKQotCQkJCQkJewotCQkJCQkJCWlmIChzdHJsZW4odG1wYnVmKSA8PSAzMikKLQkJCQkJCQl7Ci0JCQkgCQkJCQlwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuID0gKFVDSEFSKSBzdHJsZW4odG1wYnVmKTsKLQkJCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgTkRJU184MDJfMTFfTEVOR1RIX1NTSUQpOwotCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5Tc2lkLCB0bXBidWYsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pOwotCQkJCQkJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuOwotCQkJCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEKTsKLQkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCB0bXBidWYsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7Ci0JCQkJCQkJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gcEFkLT5Db21tb25DZmcuU3NpZExlbjsKLQkJCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEKTsKLQkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHRtcGJ1ZiwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOwotCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KFNTSUQ9JXMpXG4iLCBfX2Z1bmNfXywgdG1wYnVmKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJewotCQkJCQkJLy9OZXR3b3JrVHlwZQotCQkJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIk5ldHdvcmtUeXBlIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKLQkJCQkJCXsKLQkJCQkJCQlwQWQtPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKLQkJCQkJCQlpZiAoc3RyY21wKHRtcGJ1ZiwgIkFkaG9jIikgPT0gMCkKLQkJCQkJCQkJcEFkLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19BREhPQzsKLQkJCQkJCQllbHNlIC8vRGVmYXVsdCBJbmZyYXN0cnVjdHVyZSBtb2RlCi0JCQkJCQkJCXBBZC0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7Ci0JCQkJCQkJLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQotCQkJCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOwotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooTmV0d29ya1R5cGU9JWQpXG4iLCBfX2Z1bmNfXywgcEFkLT5TdGFDZmcuQnNzVHlwZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy9DaGFubmVsCi0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNoYW5uZWwiLCB0bXBidWYsIDEwLCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbD0lZFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwotCQkJCQl9Ci0JCQkJCS8vV2lyZWxlc3NNb2RlCi0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIldpcmVsZXNzTW9kZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCWludCB2YWx1ZSAgPSAwLCBtYXhQaHlNb2RlID0gUEhZXzExRzsKLQotCQkJCQkJbWF4UGh5TW9kZSA9IFBIWV8xMU5fNUc7Ci0KLQkJCQkJCXZhbHVlID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQotCQkJCQkJaWYgKHZhbHVlIDw9IG1heFBoeU1vZGUpCi0JCQkJCQl7Ci0JCQkJCQkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IHZhbHVlOwotCQkJCQkJfQotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGh5TW9kZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgIC8vQmFzaWNSYXRlCi0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkJhc2ljUmF0ZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCA9IChVTE9ORykgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJhc2ljUmF0ZT0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCkpOwotCQkJCQl9Ci0JCQkJCS8vQmVhY29uUGVyaW9kCi0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkJlYWNvblBlcmlvZCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA9IChVU0hPUlQpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCZWFjb25QZXJpb2Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCkpOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgIC8vVHhQb3dlcgotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJUeFBvd2VyIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSAoVUxPTkcpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0KLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0ID0gcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2U7Ci0KLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4UG93ZXI9JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOwotCQkJCQl9Ci0JCQkJCS8vQkdQcm90ZWN0aW9uCi0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkJHUHJvdGVjdGlvbiIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKLQkJCQkJCXsKLQkJCQkJCQljYXNlIDE6IC8vQWx3YXlzIE9uCi0JCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDE7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMjogLy9BbHdheXMgT0ZGCi0JCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDI7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMDogLy9BVVRPCi0JCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCR1Byb3RlY3Rpb249JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24pKTsKLQkJCQkJfQotCQkJCQkvL09MQkNEZXRlY3Rpb24KLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRGlzYWJsZU9MQkMiLCB0bXBidWYsIDEwLCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkpCi0JCQkJCQl7Ci0JCQkJCQkJY2FzZSAxOiAvL2Rpc2FibGUgT0xCQyBEZXRlY3Rpb24KLQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3QgPSAxOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDA6IC8vZW5hYmxlIE9MQkMgRGV0ZWN0aW9uCi0JCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRpc2FibGVPTEJDRGV0ZWN0ID0gMDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3Q9IDA7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiT0xCQ0RldGVjdGlvbj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkRpc2FibGVPTEJDRGV0ZWN0KSk7Ci0JCQkJCX0KLQkJCQkJLy9UeFByZWFtYmxlCi0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlR4UHJlYW1ibGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkpCi0JCQkJCQl7Ci0JCQkJCQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlU2hvcnQ6Ci0JCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBSdDgwMl8xMVByZWFtYmxlU2hvcnQ7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUxvbmc6Ci0JCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVMb25nOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4UHJlYW1ibGU9JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlKSk7Ci0JCQkJCX0KLQkJCQkJLy9SVFNUaHJlc2hvbGQKLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiUlRTVGhyZXNob2xkIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJUnRzVGhyZXNoID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCQkJCWlmKCAoUnRzVGhyZXNoID49IDEpICYmIChSdHNUaHJlc2ggPD0gTUFYX1JUU19USFJFU0hPTEQpICkKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgID0gKFVTSE9SVClSdHNUaHJlc2g7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gTUFYX1JUU19USFJFU0hPTEQ7Ci0KLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUU1RocmVzaG9sZD0lZFxuIiwgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKSk7Ci0JCQkJCX0KLQkJCQkJLy9GcmFnVGhyZXNob2xkCi0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkZyYWdUaHJlc2hvbGQiLCB0bXBidWYsIDEwLCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQlGcmFnVGhyZXNoID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKLQotCQkJCQkJaWYgKEZyYWdUaHJlc2ggPiBNQVhfRlJBR19USFJFU0hPTEQgfHwgRnJhZ1RocmVzaCA8IE1JTl9GUkFHX1RIUkVTSE9MRCkKLQkJCQkJCXsgLy9pbGxlZ2FsIEZyYWdUaHJlc2ggc28gd2Ugc2V0IGl0IHRvIGRlZmF1bHQKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gVFJVRTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKEZyYWdUaHJlc2ggJSAyID09IDEpCi0JCQkJCQl7Ci0JCQkJCQkJLy8gVGhlIGxlbmd0aCBvZiBlYWNoIGZyYWdtZW50IHNoYWxsIGFsd2F5cyBiZSBhbiBldmVuIG51bWJlciBvZiBvY3RldHMsIGV4Y2VwdCBmb3IgdGhlIGxhc3QgZnJhZ21lbnQKLQkJCQkJCQkvLyBvZiBhbiBNU0RVIG9yIE1NUERVLCB3aGljaCBtYXkgYmUgZWl0aGVyIGFuIGV2ZW4gb3IgYW4gb2RkIG51bWJlciBvZiBvY3RldHMuCi0JCQkJCQkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKShGcmFnVGhyZXNoIC0gMSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKUZyYWdUaHJlc2g7Ci0JCQkJCQl9Ci0JCQkJCQkvL3BBZC0+Q29tbW9uQ2ZnLkFsbG93RnJhZ1NpemUgPSAocEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQpIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF9DUkM7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFnVGhyZXNob2xkPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkpOwotCQkJCQl9Ci0JCQkJCS8vVHhCdXJzdAotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJUeEJ1cnN0IiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IFRSVUU7Ci0JCQkJCQllbHNlIC8vRGlzYWJsZQotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gRkFMU0U7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeEJ1cnN0PSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkpOwotCQkJCQl9Ci0KLSNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCi0JCQkJCS8vUGt0QWdncmVnYXRlCi0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlBrdEFnZ3JlZ2F0ZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCi0JCQkJCQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IFRSVUU7Ci0JCQkJCQllbHNlIC8vRGlzYWJsZQotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPSBGQUxTRTsKLSNpZmRlZiBQSUdHWUJBQ0tfU1VQUE9SVAotCQkJCQkJcEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUgPSBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlOwotI2VuZGlmIC8vIFBJR0dZQkFDS19TVVBQT1JUIC8vCi0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQa3RBZ2dyZWdhdGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpKTsKLQkJCQkJfQotI2Vsc2UKLQkJCQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IEZBTFNFOwotCQkJCQlwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSA9IEZBTFNFOwotI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KLQotCQkJCQkvLyBXbW1DYXBhYmxlCi0JCQkJCXJ0bXBfcmVhZF9zdGFfd21tX3Bhcm1zX2Zyb21fZmlsZShwQWQsIHRtcGJ1ZiwgYnVmZmVyKTsKLQotCQkJCQkvL1Nob3J0U2xvdAotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJTaG9ydFNsb3QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApICAvL0VuYWJsZQotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lID0gVFJVRTsKLQkJCQkJCWVsc2UgLy9EaXNhYmxlCi0JCQkJCQkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBGQUxTRTsKLQotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2hvcnRTbG90PSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSkpOwotCQkJCQl9Ci0JCQkJCS8vSUVFRTgwMjExSAotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJJRUVFODAyMTFIIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkgICAgZm9yIChpID0gMCwgbWFjcHRyID0gcnN0cnRvayh0bXBidWYsIjsiKTsgbWFjcHRyOyBtYWNwdHIgPSByc3RydG9rKE5VTEwsIjsiKSwgaSsrKQotCQkJCQkgICAgewotICAgIAkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wobWFjcHRyLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCi0gICAgCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gVFJVRTsKLSAgICAJCQkJCQllbHNlIC8vRGlzYWJsZQotICAgIAkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9IEZBTFNFOwotCi0gICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUVFRTgwMjExSD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUgpKTsKLQkJCQkJICAgIH0KLQkJCQkJfQotCQkJCQkvL0NTUGVyaW9kCi0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNTUGVyaW9kIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkgICAgaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKQotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU1BlcmlvZCA9IDA7Ci0KLSAgIAkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNTUGVyaW9kPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU1BlcmlvZCkpOwotCQkJCQl9Ci0KLQkJCQkJLy9SRFJlZ2lvbgotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJSRFJlZ2lvbiIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQlpZiAoKHN0cm5jbXAodG1wYnVmLCAiSkFQX1c1MyIsIDcpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImphcF93NTMiLCA3KSA9PSAwKSkKLQkJCQkJCXsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEpBUF9XNTM7Ci0JCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxNTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIkpBUF9XNTYiLCA3KSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJqYXBfdzU2IiwgNykgPT0gMCkpCi0JCQkJCQl7Ci0JCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBKQVBfVzU2OwotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gMTM7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmICgoc3RybmNtcCh0bXBidWYsICJKQVAiLCAzKSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJqYXAiLCAzKSA9PSAwKSkKLQkJCQkJCXsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEpBUDsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlICBpZiAoKHN0cm5jbXAodG1wYnVmLCAiRkNDIiwgMykgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiZmNjIiwgMykgPT0gMCkpCi0JCQkJCQl7Ci0JCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBGQ0M7Ci0JCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSA1OwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoKHN0cm5jbXAodG1wYnVmLCAiQ0UiLCAyKSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJjZSIsIDIpID09IDApKQotCQkJCQkJewotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gQ0U7Ci0JCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IENFOwotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gMTM7Ci0JCQkJCQl9Ci0KLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJEUmVnaW9uPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbikpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBDRTsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gMTM7Ci0JCQkJCX0KLQotCQkJCQkvL1dpcmVsZXNzRXZlbnQKLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiV2lyZWxlc3NFdmVudCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgPSAwOwkvLyBkaXNhYmxlCi0gICAJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXaXJlbGVzc0V2ZW50PSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkpOwotCQkJCQl9Ci0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIldpRmlUZXN0IiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkgICAgaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKQotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdD0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QgPSAwOwkvLyBkaXNhYmxlCi0KLSAgIAkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldpRmlUZXN0PSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QpKTsKLQkJCQkJfQotCQkJCQkvL0F1dGhNb2RlCi0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkF1dGhNb2RlIiwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCXsKLQkJCQkJCQlpZiAoKHN0cmNtcCh0bXBidWYsICJXRVBBVVRPIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3ZXBhdXRvIikgPT0gMCkpCi0JCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaDsKLQkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIlNIQVJFRCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAic2hhcmVkIikgPT0gMCkpCi0JCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOwotCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBUFNLIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGFwc2siKSA9PSAwKSkKLQkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7Ci0JCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEFOT05FIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGFub25lIikgPT0gMCkpCi0JCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKLQkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQTJQU0siKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYTJwc2siKSA9PSAwKSkKLQkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOwotCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGEiKSA9PSAwKSkKLQkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7Ci0JCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEEyIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGEyIikgPT0gMCkpCi0JCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0JCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQotCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOwotCi0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihFbmNyeXBUeXBlPSVkKVxuIiwgX19mdW5jX18sIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vRW5jcnlwVHlwZQotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJFbmNyeXBUeXBlIiwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCXsKLQkJCQkJCQlpZiAoKHN0cmNtcCh0bXBidWYsICJXRVAiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndlcCIpID09IDApKQotCQkJCQkJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMJPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLQkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIlRLSVAiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgInRraXAiKSA9PSAwKSkKLQkJCQkJCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzCT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLQkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIkFFUyIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAiYWVzIikgPT0gMCkpCi0JCQkJCQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cwk9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0KLQkJCQkJCQkvLyBVcGRhdGUgYWxsIHdlcHN0YXR1cyByZWxhdGVkCi0JCQkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlcgkJPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7Ci0JCQkJCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgCT0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOwotCQkJCQkJCXBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgCT0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOwotCQkJCQkJCXBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgCQk9IEZBTFNFOwotCi0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihFbmNyeXBUeXBlPSVkKVxuIiwgX19mdW5jX18sIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJewotCQkJCQkJaWYoUlRNUEdldENyaXRpY2FsUGFyYW1ldGVyKCJXUEFQU0siLCB0bXBidWYsIDUxMiwgYnVmZmVyKSkKLQkJCQkJCXsKLQkJCQkJCQlpbnQgICAgIGVycj0wOwotCi0JCQkJCQkJdG1wYnVmW3N0cmxlbih0bXBidWYpXSA9ICdcMCc7IC8vIG1ha2UgU1RBIGNhbiBwcm9jZXNzIC4kXiYgZm9yIFdQQVBTSyBpbnB1dAotCi0JCQkJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCi0JCQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgotCQkJCQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQkJCQkJCQkJKQotCQkJCQkJCXsKLQkJCQkJCQkJZXJyID0gMTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAoKHN0cmxlbih0bXBidWYpID49IDgpICYmIChzdHJsZW4odG1wYnVmKSA8IDY0KSkKLQkJCQkJCQl7Ci0JCQkJCQkJCVBhc3N3b3JkSGFzaCgoY2hhciAqKXRtcGJ1ZiwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbiwga2V5TWF0ZXJpYWwpOwotCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7Ci0KLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAoc3RybGVuKHRtcGJ1ZikgPT0gNjQpCi0JCQkJCQkJewotCQkJCQkJCQlBdG9IKHRtcGJ1Ziwga2V5TWF0ZXJpYWwsIDMyKTsKLQkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUE1LLCBrZXlNYXRlcmlhbCwgMzIpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJewotCQkJCQkJCQllcnIgPSAxOwotCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczo6KFdQQVBTSyBrZXktc3RyaW5nIHJlcXVpcmVkIDggfiA2NCBjaGFyYWN0ZXJzISlcbiIsIF9fZnVuY19fKSk7Ci0JCQkJCQkJfQotCi0JCQkJCQkJaWYgKGVyciA9PSAwKQotCSAgICAgICAgICAgICAgICAgICAgICAgIAkJCXsKLQkgICAgICAgICAgICAgICAgICAgICAgICAJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8Ci0JCQkJCQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCS8vIFN0YXJ0IFNUQSBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUKLQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQkJCQkJCQkJewotCQkJCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KFdQQVBTSz0lcylcbiIsIF9fZnVuY19fLCB0bXBidWYpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvL0RlZmF1bHRLZXlJRCwgS2V5VHlwZSwgS2V5U3RyCi0JCQkJCXJ0bXBfcmVhZF9rZXlfcGFybXNfZnJvbV9maWxlKHBBZCwgdG1wYnVmLCBidWZmZXIpOwotCi0JCQkJCUhUUGFyYW1ldGVyc0hvb2socEFkLCB0bXBidWYsIGJ1ZmZlcik7Ci0KLQkJCQkJewotCQkJCQkJLy9QU01vZGUKLSNpZmRlZiBSVDI4NjAKLQkJCQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJQU01vZGUiLCB0bXBidWYsIDMyLCBidWZmZXIpKQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JCQkJCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiUFNNb2RlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLSNlbmRpZgotCQkJCQkJewotCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKLQkJCQkJCQl7Ci0JCQkJCQkJCWlmICgoc3RyY21wKHRtcGJ1ZiwgIk1BWF9QU1AiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIm1heF9wc3AiKSA9PSAwKSkKLQkJCQkJCQkJewotCQkJCQkJCQkJLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCi0JCQkJCQkJCQkvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KLQkJCQkJCQkJCS8vCSAgIE1sbWVTZXRQc20ocEFkLCBQV1JfU0FWRSk7Ci0JCQkJCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLQkJCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQotCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUDsKLQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7Ci0JCQkJCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSA1OwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiRmFzdF9QU1AiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgImZhc3RfcHNwIikgPT0gMCkKLQkJCQkJCQkJCXx8IChzdHJjbXAodG1wYnVmLCAiRkFTVF9QU1AiKSA9PSAwKSkKLQkJCQkJCQkJewotCQkJCQkJCQkJLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCi0JCQkJCQkJCQkvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KLQkJCQkJCQkJCS8vCSAgIE1sbWVTZXRQc21CaXQocEFkLCBQV1JfU0FWRSk7Ci0JCQkJCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLQkJCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQotCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7Ci0JCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKLQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJMZWdhY3lfUFNQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJsZWdhY3lfcHNwIikgPT0gMCkKLQkJCQkJCQkJCXx8IChzdHJjbXAodG1wYnVmLCAiTEVHQUNZX1BTUCIpID09IDApKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQkvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKLQkJCQkJCQkJCS8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgotCQkJCQkJCQkJLy8JICAgTWxtZVNldFBzbUJpdChwQWQsIFBXUl9TQVZFKTsKLQkJCQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOwotCQkJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCi0JCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOwotCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUDsKLQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZQotCQkJCQkJCQl7IC8vRGVmYXVsdCBOZGlzODAyXzExUG93ZXJNb2RlQ0FNCi0JCQkJCQkJCQkvLyBjbGVhciBQU00gYml0IGltbWVkaWF0ZWx5Ci0JCQkJCQkJCQlNbG1lU2V0UHNtQml0KHBBZCwgUFdSX0FDVElWRSk7Ci0JCQkJCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLQkJCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQotCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOwotCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOwotCQkJCQkJCQl9Ci0JCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBTTW9kZT0lbGRcbiIsIHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyBGYXN0Um9hbWluZwotCQkJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkZhc3RSb2FtaW5nIiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKLQkJCQkJCXsKLQkJCQkJCQlpZiAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSA9PSAwKQotCQkJCQkJCQlwQWQtPlN0YUNmZy5iRmFzdFJvYW1pbmcgPSBGQUxTRTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXBBZC0+U3RhQ2ZnLmJGYXN0Um9hbWluZyA9IFRSVUU7Ci0KLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGYXN0Um9hbWluZz0lZFxuIiwgcEFkLT5TdGFDZmcuYkZhc3RSb2FtaW5nKSk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBSb2FtVGhyZXNob2xkCi0JCQkJCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiUm9hbVRocmVzaG9sZCIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCi0JCQkJCQl7Ci0JCQkJCQkJbG9uZyBsSW5mbyA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0KLQkJCQkJCQlpZiAobEluZm8gPiA5MCB8fCBsSW5mbyA8IDYwKQotCQkJCQkJCQlwQWQtPlN0YUNmZy5kQm1Ub1JvYW0gPSAtNzA7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlwQWQtPlN0YUNmZy5kQm1Ub1JvYW0gPSAoQ0hBUikoLTEpKmxJbmZvOwotCi0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUm9hbVRocmVzaG9sZD0lZCAgZEJtXG4iLCBwQWQtPlN0YUNmZy5kQm1Ub1JvYW0pKTsKLQkJCQkJCX0KLQotCQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVEduV2lmaVRlc3QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQotCQkJCQkJewotCQkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgPT0gMCkKLQkJCQkJCQkJcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gRkFMU0U7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBUUlVFOwotCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUR25XaWZpVGVzdD0lZFxuIiwgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0KSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+ICVzIGRvZXMgbm90IGhhdmUgYSB3cml0ZSBtZXRob2RcbiIsIHNyYykpOwotCQkJfQotCi0JCQlyZXR2YWw9ZmlscF9jbG9zZShzcmNmLE5VTEwpOwotCi0JCQlpZiAocmV0dmFsKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBFcnJvciAlZCBjbG9zaW5nICVzXG4iLCAtcmV0dmFsLCBzcmMpKTsKLQkJCX0KLQkJfQotCX0KLQotCXNldF9mcyhvcmdmcyk7Ci0KLQlrZnJlZShidWZmZXIpOwotCWtmcmVlKHRtcGJ1Zik7Ci0KLQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotfQotCi1zdGF0aWMgdm9pZAlIVFBhcmFtZXRlcnNIb29rKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCUNIQVIJCSAgKnBWYWx1ZVN0ciwKLQlJTglDSEFSCQkgICpwSW5wdXQpCi17Ci0KLQlJTlQgVmFsdWU7Ci0KLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfUFJPVEVDVCIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCi0gICAgewotICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0gICAgICAgIGlmIChWYWx1ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogUHJvdGVjdGlvbiAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7Ci0gICAgfQotCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX01JTU9QU0VuYWJsZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCi0gICAgewotICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0gICAgICAgIGlmIChWYWx1ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTUlNT1BTRW5hYmxlICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKLSAgICB9Ci0KLQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NSU1PUFNNb2RlIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKLSAgICB7Ci0gICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLSAgICAgICAgaWYgKFZhbHVlID4gTU1QU19FTkFCTEUpCi0gICAgICAgIHsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE1NUFNfRU5BQkxFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy9UT0RPOiBhZGQgbWltbyBwb3dlciBzYXZpbmcgbWVjaGFuaXNtCi0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBNTVBTX0VOQUJMRTsKLQkJCS8vcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gVmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1JTU9QUyBNb2RlICA9ICVkXG4iLCBWYWx1ZSkpOwotICAgIH0KLQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9CQURlY2xpbmUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQotICAgIHsKLSAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotICAgICAgICBpZiAoVmFsdWUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEJBIERlY2xpbmUgID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOwotICAgIH0KLQotCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0Rpc2FibGVSZW9yZGVyaW5nIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKLSAgICB7Ci0gICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLSAgICAgICAgaWYgKFZhbHVlID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogRGlzYWJsZVJlb3JkZXJpbmcgID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOwotICAgIH0KLQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9BdXRvQkEiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQotICAgIHsKLSAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotICAgICAgICBpZiAoVmFsdWUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOwotCSAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gQkFfTk9UVVNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7Ci0JICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBJTU1FRF9CQTsKLSAgICAgICAgfQotICAgICAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQTsKLQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeTsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEF1dG8gQkEgID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOwotICAgIH0KLQotCS8vIFR4XytIVEMgZnJhbWUKLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfSFRDIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQkJaWYgKFZhbHVlID09IDApCi0JCXsKLQkJCXBBZC0+SFRDRW5hYmxlID0gRkFMU0U7Ci0JCX0KLQkJZWxzZQotCQl7Ci0gICAgICAgICAgICAJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogVHggK0hUQyBmcmFtZSA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKLQl9Ci0KLQkvLyBFbmFibGUgSFQgTGluayBBZGFwdGF0aW9uIENvbnRyb2wKLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTGlua0FkYXB0IiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQkJaWYgKFZhbHVlID09IDApCi0JCXsKLQkJCXBBZC0+YkxpbmtBZGFwdCA9IEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEFkLT5IVENFbmFibGUgPSBUUlVFOwotCQkJcEFkLT5iTGlua0FkYXB0ID0gVFJVRTsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTGluayBBZGFwdGF0aW9uIENvbnRyb2wgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUoK0hUQykiKSk7Ci0JfQotCi0JLy8gUmV2ZXJzZSBEaXJlY3Rpb24gTWVjaGFuaXNtCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1JERyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCWlmIChWYWx1ZSA9PSAwKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iUmRnID0gRkFMU0U7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iUmRnID0gVFJVRTsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogUkRHID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlKCtIVEMpIikpOwotCX0KLQotCi0KLQotCS8vIFR4IEEtTVNVRCA/Ci0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0FNU0RVIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQkJaWYgKFZhbHVlID09IDApCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID0gVFJVRTsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogVHggQS1NU0RVID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOwotCX0KLQotCS8vIE1QRFUgRGVuc2l0eQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NcGR1RGVuc2l0eSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCWlmIChWYWx1ZSA8PTcgJiYgVmFsdWUgPj0gMCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gVmFsdWU7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTVBEVSBEZW5zaXR5ID0gJWRcbiIsIFZhbHVlKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSA0OwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1QRFUgRGVuc2l0eSA9ICVkIChEZWZhdWx0KVxuIiwgNCkpOwotCQl9Ci0JfQotCi0JLy8gTWF4IFJ4IEJBIFdpbmRvdyBTaXplCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0JBV2luU2l6ZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0KLQkJaWYgKFZhbHVlID49MSAmJiBWYWx1ZSA8PSA2NCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOwotCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEJBIFdpbmR3IFNpemUgPSAlZFxuIiwgVmFsdWUpKTsKLQkJfQotCQllbHNlCi0JCXsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBCQSBXaW5kdyBTaXplID0gNjQgKERlZnVhbHQpXG4iKSk7Ci0JCX0KLQotCX0KLQotCS8vIEd1YXJkIEludGVydmFsCi0JaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0dJIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQotCQlpZiAoVmFsdWUgPT0gR0lfNDAwKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSA9IEdJXzQwMDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJID0gR0lfODAwOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEd1YXJkIEludGVydmFsID0gJXNcbiIsIChWYWx1ZT09R0lfNDAwKSA/ICI0MDAiIDogIjgwMCIgKSk7Ci0JfQotCi0JLy8gSFQgT3BlcmF0aW9uIE1vZGUgOiBNaXhlZCBNb2RlICwgR3JlZW4gRmllbGQKLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfT3BNb2RlIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQotCQlpZiAoVmFsdWUgPT0gSFRNT0RFX0dGKQotCQl7Ci0KLQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUgID0gSFRNT0RFX0dGOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfTU07Ci0JCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogT3BlcmF0ZSBNb2RlID0gJXNcbiIsIChWYWx1ZT09SFRNT0RFX0dGKSA/ICJHcmVlbiBGaWVsZCIgOiAiTWl4ZWQgTW9kZSIgKSk7Ci0JfQotCi0JLy8gRml4ZWQgVHggbW9kZSA6IENDSywgT0ZETQotCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJGaXhlZFR4TW9kZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCi0JewotCQlVQ0hBUglmaXhfdHhfbW9kZTsKLQotCQl7Ci0JCQlmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKLQotCQkJaWYgKHN0cmNtcChwVmFsdWVTdHIsICJPRkRNIikgPT0gMCB8fCBzdHJjbXAocFZhbHVlU3RyLCAib2ZkbSIpID09IDApCi0JCQl7Ci0JCQkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfT0ZETTsKLQkJCX0KLQkJCWVsc2UgaWYgKHN0cmNtcChwVmFsdWVTdHIsICJDQ0siKSA9PSAwIHx8IHN0cmNtcChwVmFsdWVTdHIsICJjY2siKSA9PSAwKQotCQkJewotCQkgICAgICAgIGZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0NDSzsKLQkJCX0KLQkJCWVsc2UgaWYgKHN0cmNtcChwVmFsdWVTdHIsICJIVCIpID09IDAgfHwgc3RyY21wKHBWYWx1ZVN0ciwgImh0IikgPT0gMCkKLQkJCXsKLQkJICAgICAgICBmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCQkJLy8gMSA6IENDSwotCQkJCS8vIDIgOiBPRkRNCi0JCQkJLy8gb3RoZXJ3aXNlIDogSFQKLQkJCQlpZiAoVmFsdWUgPT0gRklYRURfVFhNT0RFX0NDSyB8fCBWYWx1ZSA9PSBGSVhFRF9UWE1PREVfT0ZETSkKLQkJCQkJZml4X3R4X21vZGUgPSBWYWx1ZTsKLQkJCQllbHNlCi0JCQkJCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOwotCQl9Ci0KLQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUgPSBmaXhfdHhfbW9kZTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZpeGVkIFR4IE1vZGUgPSAlZFxuIiwgZml4X3R4X21vZGUpKTsKLQotCQl9Ci0JfQotCi0KLQkvLyBDaGFubmVsIFdpZHRoCi0JaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0JXIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQotCQlpZiAoVmFsdWUgPT0gQldfNDApCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV180MDsKLQkJfQotCQllbHNlCi0JCXsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKLQkJfQotCi0jaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQwotCQlwQWQtPkNvbW1vbkNmZy5NQ2FzdFBoeU1vZGUuZmllbGQuQlcgPSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlc7Ci0jZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBDaGFubmVsIFdpZHRoID0gJXNcbiIsIChWYWx1ZT09QldfNDApID8gIjQwIE1IeiIgOiAiMjAgTUh6IiApKTsKLQl9Ci0KLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfRVhUQ0hBIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQotCQlpZiAoVmFsdWUgPT0gMCkKLQkJewotCi0JCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBICA9IEVYVENIQV9CRUxPVzsKLQkJfQotCQllbHNlCi0JCXsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQUJPVkU7Ci0JCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogRXh0IENoYW5uZWwgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJCRUxPVyIgOiAiQUJPVkUiICkpOwotCX0KLQotCS8vIE1TQwotCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NQ1MiLCBwVmFsdWVTdHIsIDUwLCBwSW5wdXQpKQotCXsKLQkJewotCQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCi0JCQlpZiAoKFZhbHVlID49IDAgJiYgVmFsdWUgPD0gMjMpIHx8IChWYWx1ZSA9PSAzMikpIC8vIDMqMwotCQl7Ci0JCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgID0gVmFsdWU7Ci0JCQkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTUNTID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgID0gTUNTX0FVVE87Ci0JCQkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNQ1MgPSBBVVRPXG4iKSk7Ci0JCX0KLQl9Ci0JfQotCi0JLy8gU1RCQwotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9TVEJDIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQkJaWYgKFZhbHVlID09IFNUQkNfVVNFKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQyA9IFNUQkNfVVNFOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFNUQkMgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMpKTsKLQl9Ci0KLQkvLyA0MF9NaHpfSW50b2xlcmFudAotCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF80ME1IWl9JTlRPTEVSQU5UIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQkJaWYgKFZhbHVlID09IDApCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJGb3J0eV9NaHpfSW50b2xlcmFudCA9IEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50ID0gVFJVRTsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogNDBNSFogSU5UT0xFUkFOVCA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iRm9ydHlfTWh6X0ludG9sZXJhbnQpKTsKLQl9Ci0JLy9IVF9UeFN0cmVhbQotCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1R4U3RyZWFtIiwgcFZhbHVlU3RyLCAxMCwgcElucHV0KSkKLQl7Ci0JCXN3aXRjaCAoc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKSkKLQkJewotCQkJY2FzZSAxOgotCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gMTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6IC8vIDMqMwotCQkJZGVmYXVsdDoKLQkJCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDM7Ci0KLQkJCQlpZiAocEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzI4ODNfVkVSU0lPTikKLQkJCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAyOyAvLyBvbmx5IDIgdHggc3RyZWFtcyBmb3IgUlQyODYwIHNlcmllcwotCQkJCWJyZWFrOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBUeCBTdHJlYW0gPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuVHhTdHJlYW0pKTsKLQl9Ci0JLy9IVF9SeFN0cmVhbQotCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1J4U3RyZWFtIiwgcFZhbHVlU3RyLCAxMCwgcElucHV0KSkKLQl7Ci0JCXN3aXRjaCAoc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKSkKLQkJewotCQkJY2FzZSAxOgotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQlkZWZhdWx0OgotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMzsKLQotCQkJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMjg4M19WRVJTSU9OKQotCQkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDI7IC8vIG9ubHkgMiByeCBzdHJlYW1zIGZvciBSVDI4NjAgc2VyaWVzCi0JCQkJYnJlYWs7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFJ4IFN0cmVhbSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhN2ViNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfdXNiLmMKQEAgLTAsMCArMSw3OTkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnR1c2JfYnVsay5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCU1vZGlmaWNhdGlvbiBsb2dzCisKKyovCisKKyNpbmNsdWRlICJydF9jb25maWcuaCIKKwordm9pZCBkdW1wX3VyYihzdHJ1Y3QgdXJiICpwdXJiKQoreworCXByaW50aygidXJiICAgICAgICAgICAgICAgICAgOjB4JTA4bHhcbiIsICh1bnNpZ25lZCBsb25nKXB1cmIpOworCXByaW50aygiXHRkZXYgICAgICAgICAgICAgICAgICAgOjB4JTA4bHhcbiIsICh1bnNpZ25lZCBsb25nKXB1cmItPmRldik7CisJcHJpbnRrKCJcdFx0ZGV2LT5zdGF0ZSAgICAgICAgICA6MHglZFxuIiwgcHVyYi0+ZGV2LT5zdGF0ZSk7CisJcHJpbnRrKCJcdHBpcGUgICAgICAgICAgICAgICAgICA6MHglMDh4XG4iLCBwdXJiLT5waXBlKTsKKwlwcmludGsoIlx0c3RhdHVzICAgICAgICAgICAgICAgIDolZFxuIiwgcHVyYi0+c3RhdHVzKTsKKwlwcmludGsoIlx0dHJhbnNmZXJfZmxhZ3MgICAgICAgIDoweCUwOHhcbiIsIHB1cmItPnRyYW5zZmVyX2ZsYWdzKTsKKwlwcmludGsoIlx0dHJhbnNmZXJfYnVmZmVyICAgICAgIDoweCUwOGx4XG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZylwdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCXByaW50aygiXHR0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOiVkXG4iLCBwdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKKwlwcmludGsoIlx0YWN0dWFsX2xlbmd0aCAgICAgICAgIDolZFxuIiwgcHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJcHJpbnRrKCJcdHNldHVwX3BhY2tldCAgICAgICAgICA6MHglMDhseFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpcHVyYi0+c2V0dXBfcGFja2V0KTsKKwlwcmludGsoIlx0c3RhcnRfZnJhbWUgICAgICAgICAgIDolZFxuIiwgcHVyYi0+c3RhcnRfZnJhbWUpOworCXByaW50aygiXHRudW1iZXJfb2ZfcGFja2V0cyAgICAgOiVkXG4iLCBwdXJiLT5udW1iZXJfb2ZfcGFja2V0cyk7CisJcHJpbnRrKCJcdGludGVydmFsICAgICAgICAgICAgICA6JWRcbiIsIHB1cmItPmludGVydmFsKTsKKwlwcmludGsoIlx0ZXJyb3JfY291bnQgICAgICAgICAgIDolZFxuIiwgcHVyYi0+ZXJyb3JfY291bnQpOworCXByaW50aygiXHRjb250ZXh0ICAgICAgICAgICAgICAgOjB4JTA4bHhcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXB1cmItPmNvbnRleHQpOworCXByaW50aygiXHRjb21wbGV0ZSAgICAgICAgICAgICAgOjB4JTA4bHhcblxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpcHVyYi0+Y29tcGxldGUpOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENyZWF0ZSBrZXJuZWwgdGhyZWFkcyAmIHRhc2tsZXRzLgorCitBcmd1bWVudHM6CisgICAgKm5ldF9kZXYJCQlQb2ludGVyIHRvIHdpcmVsZXNzIG5ldCBkZXZpY2UgaW50ZXJmYWNlCisKK1JldHVybiBWYWx1ZToKKwlORElTX1NUQVRVU19TVUNDRVNTCisJTkRJU19TVEFUVVNfRkFJTFVSRQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJ0bXBNZ210VGFza0luaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBydF9ydG1wX29zX3Rhc2sgKnBUYXNrOworCWludCBzdGF0dXM7CisKKwkvKgorCSAgIENyZWF0IFRpbWVyUSBUaHJlYWQsIFdlIG5lZWQgaW5pdCB0aW1lclEgcmVsYXRlZCBzdHJ1Y3R1cmUgYmVmb3JlIGNyZWF0ZSB0aGUgdGltZXIgdGhyZWFkLgorCSAqLworCVJ0bXBUaW1lclFJbml0KHBBZCk7CisKKwlwVGFzayA9ICZwQWQtPnRpbWVyVGFzazsKKwlSdG1wT1NUYXNrSW5pdChwVGFzaywgIlJ0bXBUaW1lclRhc2siLCBwQWQpOworCXN0YXR1cyA9IFJ0bXBPU1Rhc2tBdHRhY2gocFRhc2ssIFJ0bXBUaW1lclFUaHJlYWQsIHBUYXNrKTsKKwlpZiAoc3RhdHVzID09IE5ESVNfU1RBVFVTX0ZBSUxVUkUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBzdGFydCBSdG1wVGltZXJRVGhyZWFkXG4iLAorCQkgICAgICAgUlRNUF9PU19ORVRERVZfR0VUX0RFVk5BTUUocEFkLT5uZXRfZGV2KSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCS8qIENyZWF0IE1MTUUgVGhyZWFkICovCisJcFRhc2sgPSAmcEFkLT5tbG1lVGFzazsKKwlSdG1wT1NUYXNrSW5pdChwVGFzaywgIlJ0bXBNbG1lVGFzayIsIHBBZCk7CisJc3RhdHVzID0gUnRtcE9TVGFza0F0dGFjaChwVGFzaywgTWxtZVRocmVhZCwgcFRhc2spOworCWlmIChzdGF0dXMgPT0gTkRJU19TVEFUVVNfRkFJTFVSRSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIHN0YXJ0IE1sbWVUaHJlYWRcbiIsCisJCSAgICAgICBSVE1QX09TX05FVERFVl9HRVRfREVWTkFNRShwQWQtPm5ldF9kZXYpKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJLyogQ3JlYXQgQ29tbWFuZCBUaHJlYWQgKi8KKwlwVGFzayA9ICZwQWQtPmNtZFFUYXNrOworCVJ0bXBPU1Rhc2tJbml0KHBUYXNrLCAiUnRtcENtZFFUYXNrIiwgcEFkKTsKKwlzdGF0dXMgPSBSdG1wT1NUYXNrQXR0YWNoKHBUYXNrLCBSVFVTQkNtZFRocmVhZCwgcFRhc2spOworCWlmIChzdGF0dXMgPT0gTkRJU19TVEFUVVNfRkFJTFVSRSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIHN0YXJ0IFJUVVNCQ21kVGhyZWFkXG4iLAorCQkgICAgICAgUlRNUF9PU19ORVRERVZfR0VUX0RFVk5BTUUocEFkLT5uZXRfZGV2KSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENsb3NlIGtlcm5lbCB0aHJlYWRzLgorCitBcmd1bWVudHM6CisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICBOT05FCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJ0bXBNZ210VGFza0V4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCWludCByZXQ7CisJc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqcFRhc2s7CisKKwkvKiBTbGVlcCA1MCBtaWxsaXNlY29uZHMgc28gcGVuZGluZyBpbyBtaWdodCBmaW5pc2ggbm9ybWFsbHkgKi8KKwlSVE1QdXNlY0RlbGF5KDUwMDAwKTsKKworCS8qIFdlIHdhbnQgdG8gd2FpdCB1bnRpbCBhbGwgcGVuZGluZyByZWNlaXZlcyBhbmQgc2VuZHMgdG8gdGhlICovCisJLyogZGV2aWNlIG9iamVjdC4gV2UgY2FuY2VsIGFueSAqLworCS8qIGlycHMuIFdhaXQgdW50aWwgc2VuZHMgYW5kIHJlY2VpdmVzIGhhdmUgc3RvcHBlZC4gKi8KKwlSVFVTQkNhbmNlbFBlbmRpbmdJUlBzKHBBZCk7CisKKwkvKiBXZSBuZWVkIGNsZWFyIHRpbWVyUSByZWxhdGVkIHN0cnVjdHVyZSBiZWZvcmUgZXhpdHMgb2YgdGhlIHRpbWVyIHRocmVhZC4gKi8KKwlSdG1wVGltZXJRRXhpdChwQWQpOworCisJLyogVGVybWluYXRlIE1sbWUgVGhyZWFkICovCisJcFRhc2sgPSAmcEFkLT5tbG1lVGFzazsKKwlyZXQgPSBSdG1wT1NUYXNrS2lsbChwVGFzayk7CisJaWYgKHJldCA9PSBORElTX1NUQVRVU19GQUlMVVJFKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBraWxsIHRhc2soJXMpIGZhaWxlZCFcbiIsCisJCQkJCSAgUlRNUF9PU19ORVRERVZfR0VUX0RFVk5BTUUocEFkLT4KKwkJCQkJCQkJICAgICBuZXRfZGV2KSwKKwkJCQkJICBwVGFzay0+dGFza05hbWUpKTsKKwl9CisKKwkvKiBUZXJtaW5hdGUgY21kUSB0aHJlYWQgKi8KKwlwVGFzayA9ICZwQWQtPmNtZFFUYXNrOworI2lmZGVmIEtUSFJFQURfU1VQUE9SVAorCWlmIChwVGFzay0+a3RocmVhZF90YXNrKQorI2Vsc2UKKwlDSEVDS19QSURfTEVHQUxJVFkocFRhc2stPnRhc2tQSUQpCisjZW5kaWYKKwl7CisJCW1iKCk7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCQlwQWQtPkNtZFEuQ21kUVN0YXRlID0gUlRNUF9UQVNLX1NUQVRfU1RPUEVEOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwkJbWIoKTsKKwkJLypSVFVTQkNNRFVwKHBBZCk7ICovCisJCXJldCA9IFJ0bXBPU1Rhc2tLaWxsKHBUYXNrKTsKKwkJaWYgKHJldCA9PSBORElTX1NUQVRVU19GQUlMVVJFKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczoga2lsbCB0YXNrKCVzKSBmYWlsZWQhXG4iLAorCQkJCQkJICBSVE1QX09TX05FVERFVl9HRVRfREVWTkFNRQorCQkJCQkJICAocEFkLT5uZXRfZGV2KSwKKwkJCQkJCSAgcFRhc2stPnRhc2tOYW1lKSk7CisJCX0KKwkJcEFkLT5DbWRRLkNtZFFTdGF0ZSA9IFJUTVBfVEFTS19TVEFUX1VOS05PV047CisJfQorCisJLyogVGVybWluYXRlIHRpbWVyIHRocmVhZCAqLworCXBUYXNrID0gJnBBZC0+dGltZXJUYXNrOworCXJldCA9IFJ0bXBPU1Rhc2tLaWxsKHBUYXNrKTsKKwlpZiAocmV0ID09IE5ESVNfU1RBVFVTX0ZBSUxVUkUpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IGtpbGwgdGFzayglcykgZmFpbGVkIVxuIiwKKwkJCQkJICBSVE1QX09TX05FVERFVl9HRVRfREVWTkFNRShwQWQtPgorCQkJCQkJCQkgICAgIG5ldF9kZXYpLAorCQkJCQkgIHBUYXNrLT50YXNrTmFtZSkpOworCX0KKworfQorCitzdGF0aWMgdm9pZCBydHVzYl9kYXRhb3V0X2NvbXBsZXRlKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJc3RydWN0IHVyYiAqcFVyYjsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CisJdTggQnVsa091dFBpcGVJZDsKKwlpbnQgU3RhdHVzOworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisKKwlwVXJiID0gKHN0cnVjdCB1cmIgKilkYXRhOworCXBIVFRYQ29udGV4dCA9IChzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqKXBVcmItPmNvbnRleHQ7CisJcEFkID0gcEhUVFhDb250ZXh0LT5wQWQ7CisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisJU3RhdHVzID0gcFVyYi0+c3RhdHVzOworCisJLyogU3RvcmUgQnVsa091dCBQaXBlSWQgKi8KKwlCdWxrT3V0UGlwZUlkID0gcEhUVFhDb250ZXh0LT5CdWxrT3V0UGlwZUlkOworCXBBZC0+QnVsa091dERhdGFPbmVTZWNDb3VudCsrOworCisJLypEQkdQUklOVChSVF9ERUJVR19MT1VELCAoIkRvbmUtQiglZCk6ST0weCVseCwgQ1dQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkIVxuIiwgQnVsa091dFBpcGVJZCwgaW5faW50ZXJydXB0KCksIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgKi8KKwkvKiAgICAgICAgICAgICAgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCkpOyAqLworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBGQUxTRTsKKwlwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W0J1bGtPdXRQaXBlSWRdID0gMDsKKworCWlmIChTdGF0dXMgPT0gVVNCX1NUX05PRVJST1IpIHsKKwkJcEFkLT5CdWxrT3V0Q29tcGxldGUrKzsKKworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCQlwQWQtPkNvdW50ZXJzODAyMy5Hb29kVHJhbnNtaXRzKys7CisJCS8qUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsgKi8KKwkJRlJFRV9IVFRYX1JJTkcocEFkLCBCdWxrT3V0UGlwZUlkLCBwSFRUWENvbnRleHQpOworCQkvKlJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsgKi8KKworCX0gZWxzZQkJCS8qIFNUQVRVU19PVEhFUiAqLworCXsKKwkJdTggKnBCdWY7CisKKwkJcEFkLT5CdWxrT3V0Q29tcGxldGVPdGhlcisrOworCisJCXBCdWYgPQorCQkgICAgJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLgorCQkgICAgV2lyZWxlc3NQYWNrZXRbcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uXTsKKworCQlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkgIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJCSAgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwKKwkJCQkJICBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSkgeworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9IEJ1bGtPdXRQaXBlSWQ7CisJCQlwQWQtPmJ1bGtSZXNldFJlcVtCdWxrT3V0UGlwZUlkXSA9IHBBZC0+QnVsa091dFJlcTsKKwkJfQorCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkgICAgICgiQnVsa091dERhdGFQYWNrZXQgZmFpbGVkOiBSZWFzb25Db2RlPSVkIVxuIiwKKwkJCSAgICAgIFN0YXR1cykpOworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkgICAgICgiXHQ+PkJ1bGtPdXQgUmVxPTB4JWx4LCBDb21wbGV0ZT0weCVseCwgT3RoZXI9MHglbHhcbiIsCisJCQkgICAgICBwQWQtPkJ1bGtPdXRSZXEsIHBBZC0+QnVsa091dENvbXBsZXRlLAorCQkJICAgICAgcEFkLT5CdWxrT3V0Q29tcGxldGVPdGhlcikpOworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkgICAgICgiXHQ+PkJ1bGtPdXQgSGVhZGVyOiV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLAorCQkJICAgICAgcEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSwgcEJ1ZlszXSwgcEJ1Zls0XSwKKwkJCSAgICAgIHBCdWZbNV0sIHBCdWZbNl0sIHBCdWZbN10pKTsKKwkJLypEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPj5CdWxrT3V0Q29tcGxldGVDYW5jZWw9MHgleCwgQnVsa091dENvbXBsZXRlT3RoZXI9MHgleFxuIiwgcEFkLT5CdWxrT3V0Q29tcGxldGVDYW5jZWwsIHBBZC0+QnVsa091dENvbXBsZXRlT3RoZXIpKTsgKi8KKworCX0KKworCS8qICovCisJLyogYkluVXNlID0gVFJVRSwgbWVhbnMgc29tZSBwcm9jZXNzIGFyZSBmaWxsaW5nIFRYIGRhdGEsIGFmdGVyIHRoYXQgbXVzdCB0dXJuIG9uIGJXYWl0aW5nQnVsa091dCAqLworCS8qIGJXYWl0aW5nQnVsa091dCA9IFRSVUUsIG1lYW5zIHRoZSBUWCBkYXRhIGFyZSB3YWl0aW5nIGZvciBidWxrIG91dC4gKi8KKwkvKiAqLworCS8qUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsgKi8KKwlpZiAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gIT0KKwkgICAgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikKKwkgICAgJiYgKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gIT0KKwkJKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDgpKQorCSAgICAmJiAhUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLAorCQkJCSAgICAgKGZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUcgPDwKKwkJCQkgICAgICBCdWxrT3V0UGlwZUlkKSkpIHsKKwkJLyogSW5kaWNhdGUgVGhlcmUgaXMgZGF0YSBhdmFsaWFibGUgKi8KKwkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsCisJCQkJICAgIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwKKwkJCQkgICAgIEJ1bGtPdXRQaXBlSWQpKTsKKwl9CisJLypSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7ICovCisKKwkvKiBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4gKi8KKwkvKiBUaGUgcHJvdGVjdGlvbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZSAqLworCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKK30KKworc3RhdGljIHZvaWQgcnR1c2JfbnVsbF9mcmFtZV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcE51bGxDb250ZXh0OworCXN0cnVjdCB1cmIgKnBVcmI7CisJaW50IFN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGlycUZsYWc7CisKKwlwVXJiID0gKHN0cnVjdCB1cmIgKilkYXRhOworCXBOdWxsQ29udGV4dCA9IChzdHJ1Y3QgcnRfdHhfY29udGV4dCAqKXBVcmItPmNvbnRleHQ7CisJcEFkID0gcE51bGxDb250ZXh0LT5wQWQ7CisJU3RhdHVzID0gcFVyYi0+c3RhdHVzOworCisJLyogUmVzZXQgTnVsbCBmcmFtZSBjb250ZXh0IGZsYWdzICovCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisJcE51bGxDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJcE51bGxDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCXBBZC0+QnVsa091dFBlbmRpbmdbMF0gPSBGQUxTRTsKKwlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250WzBdID0gMDsKKworCWlmIChTdGF0dXMgPT0gVVNCX1NUX05PRVJST1IpIHsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKKworCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworCX0gZWxzZQkJCS8qIFNUQVRVU19PVEhFUiAqLworCXsKKwkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgJiYKKwkJICAgICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgorCQkgICAgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCisJCSAgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpIHsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCQkgICAgICgiQnVsayBPdXQgTnVsbCBGcmFtZSBGYWlsZWQsIFJlYXNvbkNvZGU9JWQhXG4iLAorCQkJCSAgICAgIFN0YXR1cykpOworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9CisJCQkgICAgKE1HTVRQSVBFSURYIHwgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpOworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULAorCQkJCQkJTlVMTCwgMCk7CisJCX0gZWxzZSB7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOworCQl9CisJfQorCisJLyogQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuICovCisJLyogVGhlIHByb3RlY3Rpb29uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lICovCisJUlRVU0JLaWNrQnVsa091dChwQWQpOworfQorCitzdGF0aWMgdm9pZCBydHVzYl9ydHNfZnJhbWVfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBSVFNDb250ZXh0OworCXN0cnVjdCB1cmIgKnBVcmI7CisJaW50IFN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGlycUZsYWc7CisKKwlwVXJiID0gKHN0cnVjdCB1cmIgKilkYXRhOworCXBSVFNDb250ZXh0ID0gKHN0cnVjdCBydF90eF9jb250ZXh0ICopcFVyYi0+Y29udGV4dDsKKwlwQWQgPSBwUlRTQ29udGV4dC0+cEFkOworCVN0YXR1cyA9IHBVcmItPnN0YXR1czsKKworCS8qIFJlc2V0IFJUUyBmcmFtZSBjb250ZXh0IGZsYWdzICovCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisJcFJUU0NvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwlwUlRTQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKworCWlmIChTdGF0dXMgPT0gVVNCX1NUX05PRVJST1IpIHsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9IGVsc2UJCQkvKiBTVEFUVVNfT1RIRVIgKi8KKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCSAgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJICAgICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkgICAgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKSB7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkJICAgICAoIkJ1bGsgT3V0IFJUUyBGcmFtZSBGYWlsZWRcbiIpKTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPQorCQkJICAgIChNR01UUElQRUlEWCB8IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKTsKKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwKKwkJCQkJCU5VTEwsIDApOworCQl9IGVsc2UgeworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKKwkJfQorCX0KKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+QnVsa091dExvY2tbcFJUU0NvbnRleHQtPkJ1bGtPdXRQaXBlSWRdKTsKKwlwQWQtPkJ1bGtPdXRQZW5kaW5nW3BSVFNDb250ZXh0LT5CdWxrT3V0UGlwZUlkXSA9IEZBTFNFOworCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twUlRTQ29udGV4dC0+QnVsa091dFBpcGVJZF0pOworCisJLyogQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuICovCisJLyogVGhlIHByb3RlY3Rpb29uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lICovCisJUlRVU0JLaWNrQnVsa091dChwQWQpOworCit9CisKK3N0YXRpYyB2b2lkIHJ0dXNiX3BzcG9sbF9mcmFtZV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcFBzUG9sbENvbnRleHQ7CisJc3RydWN0IHVyYiAqcFVyYjsKKwlpbnQgU3RhdHVzOworCisJcFVyYiA9IChzdHJ1Y3QgdXJiICopZGF0YTsKKwlwUHNQb2xsQ29udGV4dCA9IChzdHJ1Y3QgcnRfdHhfY29udGV4dCAqKXBVcmItPmNvbnRleHQ7CisJcEFkID0gcFBzUG9sbENvbnRleHQtPnBBZDsKKwlTdGF0dXMgPSBwVXJiLT5zdGF0dXM7CisKKwkvKiBSZXNldCBQc1BvbGwgY29udGV4dCBmbGFncyAqLworCXBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJcFBzUG9sbENvbnRleHQtPkluVXNlID0gRkFMU0U7CisJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFswXSA9IDA7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKSB7CisJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisJfSBlbHNlCQkJLyogU1RBVFVTX09USEVSICovCisJeworCQlpZiAoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSAmJgorCQkgICAgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpICYmCisJCSAgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgJiYKKwkJICAgICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSkgeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAgICAgKCJCdWxrIE91dCBQU1BvbGwgRmFpbGVkXG4iKSk7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0KKwkJCSAgICAoTUdNVFBJUEVJRFggfCBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRyk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwKKwkJCQkJCU5VTEwsIDApOworCQl9CisJfQorCisJUlRNUF9TRU1fTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSk7CisJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IEZBTFNFOworCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSk7CisKKwkvKiBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4gKi8KKwkvKiBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUgKi8KKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBIYW5kbGUgcmVjZWl2ZWQgcGFja2V0cy4KKworQXJndW1lbnRzOgorCWRhdGEJCQkJLSBVUkIgaW5mb3JtYXRpb24gcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIHZvaWQgcnhfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgdXJiICpwVXJiOworCXN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlpbnQgU3RhdHVzOworCXVuc2lnbmVkIGludCBJcnFGbGFnczsKKworCXBVcmIgPSAoc3RydWN0IHVyYiAqKWRhdGE7CisJcFJ4Q29udGV4dCA9IChzdHJ1Y3QgcnRfcnhfY29udGV4dCAqKXBVcmItPmNvbnRleHQ7CisJcEFkID0gcFJ4Q29udGV4dC0+cEFkOworCVN0YXR1cyA9IHBVcmItPnN0YXR1czsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCXBSeENvbnRleHQtPkluVXNlID0gRkFMU0U7CisJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCXBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCArPSBwVXJiLT5hY3R1YWxfbGVuZ3RoOworCS8qTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7ICovCisJcEFkLT5QZW5kaW5nUngtLTsKKworCWlmIChTdGF0dXMgPT0gVVNCX1NUX05PRVJST1IpIHsKKwkJcEFkLT5CdWxrSW5Db21wbGV0ZSsrOworCQlwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID0gMDsKKwkJaWYgKHBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCkJLyogQXMgamFuJ3MgY29tbWVudCwgaXQgbWF5IGJ1bGstaW4gc3VjY2VzcyBidXQgc2l6ZSBpcyB6ZXJvLiAqLworCQl7CisJCQlwUnhDb250ZXh0LT5SZWFkYWJsZSA9IFRSVUU7CisJCQlJTkNfUklOR19JTkRFWChwQWQtPk5leHRSeEJ1bGtJbkluZGV4LCBSWF9SSU5HX1NJWkUpOworCQl9CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJfSBlbHNlCQkJLyogU1RBVFVTX09USEVSICovCisJeworCQlwQWQtPkJ1bGtJbkNvbXBsZXRlRmFpbCsrOworCQkvKiBTdGlsbCByZWFkIHRoaXMgcGFja2V0IGFsdGhvdWdoIGl0IG1heSBjb210YWluIHdyb25nIGJ5dGVzLiAqLworCQlwUnhDb250ZXh0LT5SZWFkYWJsZSA9IEZBTFNFOworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCisJCS8qIFBhcnNpbmcgYWxsIHBhY2tldHMuIGJlY2F1c2UgYWZ0ZXIgcmVzZXQsIHRoZSBpbmRleCB3aWxsIHJlc2V0IHRvIGFsbCB6ZXJvLiAqLworCQlpZiAoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkJICAgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQgfAorCQkJCQkgICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkgICBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpIHsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAgICAgKCJCdWxrIEluIEZhaWxlZC4gU3RhdHVzPSVkLCBCSUlkeD0weCV4LCBCSVJJZHg9MHgleCwgYWN0dWFsX2xlbmd0aD0gMHgleFxuIiwKKwkJCQkgICAgICBTdGF0dXMsIHBBZC0+TmV4dFJ4QnVsa0luSW5kZXgsCisJCQkJICAgICAgcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsCisJCQkJICAgICAgcFJ4Q29udGV4dC0+cFVyYi0+YWN0dWFsX2xlbmd0aCkpOworCisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQpOworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19JTiwKKwkJCQkJCU5VTEwsIDApOworCQl9CisJfQorCisJQVNTRVJUKChwUnhDb250ZXh0LT5JblVzZSA9PSBwUnhDb250ZXh0LT5JUlBQZW5kaW5nKSk7CisKKwlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7CisKKwlyZXR1cm47CisKK30KKworc3RhdGljIHZvaWQgcnR1c2JfbWdtdF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBNTE1FQ29udGV4dDsKKwlpbnQgaW5kZXg7CisJdm9pZCAqcFBhY2tldDsKKwlzdHJ1Y3QgdXJiICpwVXJiOworCWludCBTdGF0dXM7CisJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKKworCXBVcmIgPSAoc3RydWN0IHVyYiAqKWRhdGE7CisJcE1MTUVDb250ZXh0ID0gKHN0cnVjdCBydF90eF9jb250ZXh0ICopcFVyYi0+Y29udGV4dDsKKwlwQWQgPSBwTUxNRUNvbnRleHQtPnBBZDsKKwlTdGF0dXMgPSBwVXJiLT5zdGF0dXM7CisJaW5kZXggPSBwTUxNRUNvbnRleHQtPlNlbGZJZHg7CisKKwlBU1NFUlQoKHBBZC0+TWdtdFJpbmcuVHhEbWFJZHggPT0gaW5kZXgpKTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdLCBJcnFGbGFncyk7CisKKwlpZiAoU3RhdHVzICE9IFVTQl9TVF9OT0VSUk9SKSB7CisJCS8qQnVsay1PdXQgZmFpbCBzdGF0dXMgaGFuZGxlICovCisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCSAgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJICAgICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkgICAgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKSB7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkJICAgICAoIkJ1bGsgT3V0IE1MTUUgRmFpbGVkLCBTdGF0dXM9JWQhXG4iLAorCQkJCSAgICAgIFN0YXR1cykpOworCQkJLyogVE9ETzogSG93IHRvIGhhbmRsZSBhYm91dCB0aGUgTUxNRUJ1bGtPdXQgZmFpbGVkIGlzc3VlLiBOZWVkIHRvIHJlc2VuZCB0aGUgbWdtdCBwa3Q/ICovCisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0KKwkJCSAgICAoTUdNVFBJUEVJRFggfCBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRyk7CisJCX0KKwl9CisKKwlwQWQtPkJ1bGtPdXRQZW5kaW5nW01HTVRQSVBFSURYXSA9IEZBTFNFOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrLCBJcnFGbGFncyk7CisJLyogUmVzZXQgTUxNRSBjb250ZXh0IGZsYWdzICovCisJcE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJcE1MTUVDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCXBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID0gRkFMU0U7CisJcE1MTUVDb250ZXh0LT5CdWxrT3V0U2l6ZSA9IDA7CisKKwlwUGFja2V0ID0gcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldDsKKwlwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0ID0gTlVMTDsKKworCS8qIEluY3JlYXNlIE1nbXRSaW5nIEluZGV4ICovCisJSU5DX1JJTkdfSU5ERVgocEFkLT5NZ210UmluZy5UeERtYUlkeCwgTUdNVF9SSU5HX1NJWkUpOworCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgrKzsKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrLCBJcnFGbGFncyk7CisKKwkvKiBOby1tYXR0ZXIgc3VjY2VzcyBvciBmYWlsLCB3ZSBmcmVlIHRoZSBtZ210IHBhY2tldC4gKi8KKwlpZiAocFBhY2tldCkKKwkJUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgcFBhY2tldCk7CisKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCSAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkgIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkgeworCQkvKiBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuICovCisJfSBlbHNlIHsKKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSAmJiAoKHBBZC0+YnVsa1Jlc2V0UGlwZWlkICYgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpID09IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKSkgewkvKiBGb3IgTWdtdCBCdWxrLU91dCBmYWlsZWQsIGlnbm9yZSBpdCBub3cuICovCisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwKKwkJCQkJCU5VTEwsIDApOworCQl9IGVsc2UgeworCisJCQkvKiBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4gKi8KKwkJCS8qIFRoZSBwcm90ZWN0aW9vbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZSAqLworCQkJaWYgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPAorCQkJICAgIE1HTVRfUklOR19TSVpFCisJCQkgICAgLyogcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPT0gVFJVRSAqLyApIHsKKwkJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX01MTUUpOworCQkJfQorCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOworCQl9CisJfQorCit9CisKK3N0YXRpYyB2b2lkIHJ0dXNiX2FjM19kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKKwl1OCBCdWxrT3V0UGlwZUlkID0gMzsKKwlzdHJ1Y3QgdXJiICpwVXJiOworCisJcFVyYiA9IChzdHJ1Y3QgdXJiICopZGF0YTsKKwlwSFRUWENvbnRleHQgPSAoc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKilwVXJiLT5jb250ZXh0OworCXBBZCA9IHBIVFRYQ29udGV4dC0+cEFkOworCisJcnR1c2JfZGF0YW91dF9jb21wbGV0ZSgodW5zaWduZWQgbG9uZylwVXJiKTsKKworCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCSAgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKSB7CisJCS8qIGRvIG5vdGhpbmcgYW5kIHJldHVybiBkaXJlY3RseS4gKi8KKwl9IGVsc2UgeworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSB7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwKKwkJCQkJCU5VTEwsIDApOworCQl9IGVsc2UgeworCQkJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOworCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgorCQkJICAgIC8qKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCisJCQkgICAgKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCisJCQkgICAgKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKSB7CisJCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgQnVsa091dFBpcGVJZCwKKwkJCQkJCSAgTUFYX1RYX1BST0NFU1MpOworCQkJfQorCisJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwKKwkJCQkJICAgIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCAzKTsKKwkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKwkJfQorCX0KKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcnR1c2JfYWMyX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqcEhUVFhDb250ZXh0OworCXU4IEJ1bGtPdXRQaXBlSWQgPSAyOworCXN0cnVjdCB1cmIgKnBVcmI7CisKKwlwVXJiID0gKHN0cnVjdCB1cmIgKilkYXRhOworCXBIVFRYQ29udGV4dCA9IChzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqKXBVcmItPmNvbnRleHQ7CisJcEFkID0gcEhUVFhDb250ZXh0LT5wQWQ7CisKKwlydHVzYl9kYXRhb3V0X2NvbXBsZXRlKCh1bnNpZ25lZCBsb25nKXBVcmIpOworCisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkgIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJICBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpIHsKKwkJLyogZG8gbm90aGluZyBhbmQgcmV0dXJuIGRpcmVjdGx5LiAqLworCX0gZWxzZSB7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpIHsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULAorCQkJCQkJTlVMTCwgMCk7CisJCX0gZWxzZSB7CisJCQlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF07CisJCQlpZiAoKHBBZC0+VHhTd1F1ZXVlW0J1bGtPdXRQaXBlSWRdLk51bWJlciA+IDApICYmCisJCQkgICAgLyooKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA+IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gKyAweDYwMDApKSB8fCAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID4gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgMHg2MDAwKSkgJiYgKi8KKwkJCSAgICAocEFkLT5EZVF1ZXVlUnVubmluZ1tCdWxrT3V0UGlwZUlkXSA9PSBGQUxTRSkgJiYKKwkJCSAgICAocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBGQUxTRSkpIHsKKwkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBCdWxrT3V0UGlwZUlkLAorCQkJCQkJICBNQVhfVFhfUFJPQ0VTUyk7CisJCQl9CisKKwkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLAorCQkJCQkgICAgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IDIpOworCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOworCQl9CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBydHVzYl9hYzFfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CisJdTggQnVsa091dFBpcGVJZCA9IDE7CisJc3RydWN0IHVyYiAqcFVyYjsKKworCXBVcmIgPSAoc3RydWN0IHVyYiAqKWRhdGE7CisJcEhUVFhDb250ZXh0ID0gKHN0cnVjdCBydF9odF90eF9jb250ZXh0ICopcFVyYi0+Y29udGV4dDsKKwlwQWQgPSBwSFRUWENvbnRleHQtPnBBZDsKKworCXJ0dXNiX2RhdGFvdXRfY29tcGxldGUoKHVuc2lnbmVkIGxvbmcpcFVyYik7CisKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCSAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkgIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkgeworCQkvKiBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuICovCisJfSBlbHNlIHsKKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkgeworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsCisJCQkJCQlOVUxMLCAwKTsKKwkJfSBlbHNlIHsKKwkJCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKKwkJCWlmICgocEFkLT5UeFN3UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID4gMCkgJiYKKwkJCSAgICAvKigocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiArIDB4NjAwMCkpIHx8IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPiBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAweDYwMDApKSAmJiAqLworCQkJICAgIChwQWQtPkRlUXVldWVSdW5uaW5nW0J1bGtPdXRQaXBlSWRdID09IEZBTFNFKSAmJgorCQkJICAgIChwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IEZBTFNFKSkgeworCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsCisJCQkJCQkgIE1BWF9UWF9QUk9DRVNTKTsKKwkJCX0KKworCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsCisJCQkJCSAgICBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgMSk7CisJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCX0KKwl9CisJcmV0dXJuOworCit9CisKK3N0YXRpYyB2b2lkIHJ0dXNiX2FjMF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKKwl1OCBCdWxrT3V0UGlwZUlkID0gMDsKKwlzdHJ1Y3QgdXJiICpwVXJiOworCisJcFVyYiA9IChzdHJ1Y3QgdXJiICopZGF0YTsKKwlwSFRUWENvbnRleHQgPSAoc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKilwVXJiLT5jb250ZXh0OworCXBBZCA9IHBIVFRYQ29udGV4dC0+cEFkOworCisJcnR1c2JfZGF0YW91dF9jb21wbGV0ZSgodW5zaWduZWQgbG9uZylwVXJiKTsKKworCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCSAgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKSB7CisJCS8qIGRvIG5vdGhpbmcgYW5kIHJldHVybiBkaXJlY3RseS4gKi8KKwl9IGVsc2UgeworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSB7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwKKwkJCQkJCU5VTEwsIDApOworCQl9IGVsc2UgeworCQkJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOworCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgorCQkJICAgIC8qICAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA+IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gKyAweDYwMDApKSB8fCAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID4gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgMHg2MDAwKSkgJiYgKi8KKwkJCSAgICAocEFkLT5EZVF1ZXVlUnVubmluZ1tCdWxrT3V0UGlwZUlkXSA9PSBGQUxTRSkgJiYKKwkJCSAgICAocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBGQUxTRSkpIHsKKwkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBCdWxrT3V0UGlwZUlkLAorCQkJCQkJICBNQVhfVFhfUFJPQ0VTUyk7CisJCQl9CisKKwkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwpOworCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOworCQl9CisJfQorCisJcmV0dXJuOworCit9CisKK2ludCBSdG1wTmV0VGFza0luaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBvc19jb29raWUgKnBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJLyogQ3JlYXRlIHJlY2VpdmUgdGFza2xldCAqLworCXRhc2tsZXRfaW5pdCgmcE9iai0+cnhfZG9uZV90YXNrLCByeF9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2ssIHJ0dXNiX21nbXRfZG1hX2RvbmVfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2ssIHJ0dXNiX2FjMF9kbWFfZG9uZV90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzaywgcnR1c2JfYWMxX2RtYV9kb25lX3Rhc2tsZXQsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrLCBydHVzYl9hYzJfZG1hX2RvbmVfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2ssIHJ0dXNiX2FjM19kbWFfZG9uZV90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT50YnR0X3Rhc2ssIHRidHRfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPm51bGxfZnJhbWVfY29tcGxldGVfdGFzaywKKwkJICAgICBydHVzYl9udWxsX2ZyYW1lX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPnJ0c19mcmFtZV9jb21wbGV0ZV90YXNrLAorCQkgICAgIHJ0dXNiX3J0c19mcmFtZV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5wc3BvbGxfZnJhbWVfY29tcGxldGVfdGFzaywKKwkJICAgICBydHVzYl9wc3BvbGxfZnJhbWVfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3ZvaWQgUnRtcE5ldFRhc2tFeGl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOworCisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKwl0YXNrbGV0X2tpbGwoJnBPYmotPnJ4X2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+dGJ0dF90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPm51bGxfZnJhbWVfY29tcGxldGVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5ydHNfZnJhbWVfY29tcGxldGVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5wc3BvbGxfZnJhbWVfY29tcGxldGVfdGFzayk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcC5oCmluZGV4IDkwZmQ0MGYuLmM1MGFiZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcC5oCkBAIC00MSwyNzAgKzQxLDEzNiBAQAogI2RlZmluZSBfX1JUTVBfSF9fCiAKICNpbmNsdWRlICJzcGVjdHJ1bV9kZWYuaCIKKyNpbmNsdWRlICJydG1wX2RvdDExLmgiCisjaW5jbHVkZSAicnRtcF9jaGlwLmgiCiAKLSNpbmNsdWRlICJhaXJvbmV0LmgiCitzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyOwogCi0jZGVmaW5lIFZJUlRVQUxfSUZfSU5DKF9fcEFkKSAoKF9fcEFkKS0+VmlydHVhbElmQ250KyspCi0jZGVmaW5lIFZJUlRVQUxfSUZfREVDKF9fcEFkKSAoKF9fcEFkKS0+VmlydHVhbElmQ250LS0pCi0jZGVmaW5lIFZJUlRVQUxfSUZfTlVNKF9fcEFkKSAoKF9fcEFkKS0+VmlydHVhbElmQ250KQorLyojZGVmaW5lIERCRyAgICAgICAgICAgMSAqLwogCi0jaWZkZWYgUlQyODcwCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBUaGUgVFhfQlVGRkVSIHN0cnVjdHVyZSBmb3JtcyB0aGUgdHJhbnNtaXR0ZWQgVVNCIHBhY2tldCB0byB0aGUgZGV2aWNlCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi10eXBlZGVmIHN0cnVjdCBfX1RYX0JVRkZFUnsKLQl1bmlvbgl7Ci0JCVVDSEFSCQkJV2lyZWxlc3NQYWNrZXRbVFhfQlVGRkVSX05PUk1TSVpFXTsKLQkJSEVBREVSXzgwMl8xMQlOdWxsRnJhbWU7Ci0JCVBTUE9MTF9GUkFNRQlQc1BvbGxQYWNrZXQ7Ci0JCVJUU19GUkFNRQkJUlRTRnJhbWU7Ci0JfWZpZWxkOwotCVVDSEFSCQkJQWdncmVnYXRpb25bNF07ICAvL0J1ZmZlciBmb3Igc2F2ZSBBZ2dyZWdhdGlvbiBzaXplLgotfSBUWF9CVUZGRVIsICpQVFhfQlVGRkVSOworLyojZGVmaW5lIERCR19ESUFHTk9TRSAgICAgICAgICAxICovCiAKLXR5cGVkZWYgc3RydWN0IF9fSFRUWF9CVUZGRVJ7Ci0JdW5pb24JewotCQlVQ0hBUgkJCVdpcmVsZXNzUGFja2V0W01BWF9UWEJVTEtfU0laRV07Ci0JCUhFQURFUl84MDJfMTEJTnVsbEZyYW1lOwotCQlQU1BPTExfRlJBTUUJUHNQb2xsUGFja2V0OwotCQlSVFNfRlJBTUUJCVJUU0ZyYW1lOwotCX1maWVsZDsKLQlVQ0hBUgkJCUFnZ3JlZ2F0aW9uWzRdOyAgLy9CdWZmZXIgZm9yIHNhdmUgQWdncmVnYXRpb24gc2l6ZS4KLX0gSFRUWF9CVUZGRVIsICpQSFRUWF9CVUZGRVI7Ci0KLQotLy8gdXNlZCB0byB0cmFjayBkcml2ZXItZ2VuZXJhdGVkIHdyaXRlIGlycHMKLXR5cGVkZWYgc3RydWN0IF9UWF9DT05URVhUCi17Ci0JUFZPSUQJCQlwQWQ7CQkvL0luaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZQotCVBVUkIJCQlwVXJiOwkJCS8vSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplCi0JUElSUAkJCXBJcnA7CQkJLy91c2VkIHRvIGNhbmNlbCBwZW5kaW5nIGJ1bGsgb3V0LgotCQkJCQkJCQkJLy9Jbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUKLQlQVFhfQlVGRkVSCQlUcmFuc2ZlckJ1ZmZlcjsJLy9Jbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUKLQlVTE9ORwkJCUJ1bGtPdXRTaXplOwotCVVDSEFSCQkJQnVsa091dFBpcGVJZDsKLQlVQ0hBUgkJCVNlbGZJZHg7Ci0JQk9PTEVBTgkJCUluVXNlOwotCUJPT0xFQU4JCQliV2FpdGluZ0J1bGtPdXQ7IC8vIGF0IGxlYXN0IG9uZSBwYWNrZXQgaXMgaW4gdGhpcyBUeENvbnRleHQsIHJlYWR5IGZvciBtYWtpbmcgSVJQIGFueXRpbWUuCi0JQk9PTEVBTgkJCWJGdWxsRm9yQnVsa091dDsgLy8gYWxsIHR4IGJ1ZmZlciBhcmUgZnVsbCAsIHNvIHdhaXRpbmcgZm9yIHR4IGJ1bGtvdXQuCi0JQk9PTEVBTgkJCUlSUFBlbmRpbmc7Ci0JQk9PTEVBTgkJCUxhc3RPbmU7Ci0JQk9PTEVBTgkJCWJBZ2dyZWdhdGlibGU7Ci0JVUNIQVIJCQlIZWFkZXJfODAyXzNbTEVOR1RIXzgwMl8zXTsKLQlVQ0hBUgkJCVJzdlsyXTsKLQlVTE9ORwkJCURhdGFPZmZzZXQ7Ci0JVUlOVAkJCVR4UmF0ZTsKLQlkbWFfYWRkcl90CQlkYXRhX2RtYTsJCS8vIHVyYiBkbWEgb24gbGludXgKLQotfQlUWF9DT05URVhULCAqUFRYX0NPTlRFWFQsICoqUFBUWF9DT05URVhUOwotCi0KLS8vIHVzZWQgdG8gdHJhY2sgZHJpdmVyLWdlbmVyYXRlZCB3cml0ZSBpcnBzCi10eXBlZGVmIHN0cnVjdCBfSFRfVFhfQ09OVEVYVAotewotCVBWT0lECQkJcEFkOwkJLy9Jbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUKLQlQVVJCCQkJcFVyYjsJCQkvL0luaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZQotCVBJUlAJCQlwSXJwOwkJCS8vdXNlZCB0byBjYW5jZWwgcGVuZGluZyBidWxrIG91dC4KLQkJCQkJCQkJCS8vSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplCi0JUEhUVFhfQlVGRkVSCVRyYW5zZmVyQnVmZmVyOwkvL0luaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZQotCVVMT05HCQkJQnVsa091dFNpemU7CS8vIEluZGljYXRlIHRoZSB0b3RhbCBidWxrLW91dCBzaXplIGluIGJ5dGVzIGluIG9uZSBidWxrLXRyYW5zbWlzc2lvbgotCVVDSEFSCQkJQnVsa091dFBpcGVJZDsKLQlCT09MRUFOCQkJSVJQUGVuZGluZzsKLQlCT09MRUFOCQkJTGFzdE9uZTsKLQlCT09MRUFOCQkJYkN1cldyaXRpbmc7Ci0JQk9PTEVBTgkJCWJSaW5nRW1wdHk7Ci0JQk9PTEVBTgkJCWJDb3B5U2F2ZVBhZDsKLQlVQ0hBUgkJCVNhdmVkUGFkWzhdOwotCVVDSEFSCQkJSGVhZGVyXzgwMl8zW0xFTkdUSF84MDJfM107Ci0JVUxPTkcJCQlDdXJXcml0ZVBvc2l0aW9uOwkJLy8gSW5kaWNhdGUgdGhlIGJ1ZmZlciBvZmZzZXQgd2hpY2ggcGFja2V0IHdpbGwgYmUgaW5zZXJ0ZWQgc3RhcnQgZnJvbS4KLQlVTE9ORwkJCUN1cldyaXRlUmVhbFBvczsJCS8vIEluZGljYXRlIHRoZSBidWZmZXIgb2Zmc2V0IHdoaWNoIHBhY2tldCBub3cgYXJlIHdyaXRpbmcgdG8uCi0JVUxPTkcJCQlOZXh0QnVsa091dFBvc2l0aW9uOwkvLyBJbmRpY2F0ZSB0aGUgYnVmZmVyIHN0YXJ0IG9mZnNldCBvZiBhIGJ1bGstdHJhbnNtaXNzaW9uCi0JVUxPTkcJCQlFTmV4dEJ1bGtPdXRQb3NpdGlvbjsJLy8gSW5kaWNhdGUgdGhlIGJ1ZmZlciBlbmQgb2Zmc2V0IG9mIGEgYnVsay10cmFuc21pc3Npb24KLQlVSU5UCQkJVHhSYXRlOwotCWRtYV9hZGRyX3QJCWRhdGFfZG1hOwkJLy8gdXJiIGRtYSBvbiBsaW51eAotfQlIVF9UWF9DT05URVhULCAqUEhUX1RYX0NPTlRFWFQsICoqUFBIVF9UWF9DT05URVhUOwotCi0KLS8vCi0vLyBTdHJ1Y3R1cmUgdG8ga2VlcCB0cmFjayBvZiByZWNlaXZlIHBhY2tldHMgYW5kIGJ1ZmZlcnMgdG8gaW5kaWNhdGUKLS8vIHJlY2VpdmUgZGF0YSB0byB0aGUgcHJvdG9jb2wuCi0vLwotdHlwZWRlZiBzdHJ1Y3QgX1JYX0NPTlRFWFQKLXsKLQlQVUNIQVIJCQkJVHJhbnNmZXJCdWZmZXI7Ci0JUFZPSUQJCQkJcEFkOwotCVBJUlAJCQkJcElycDsvL3VzZWQgdG8gY2FuY2VsIHBlbmRpbmcgYnVsayBpbi4KLQlQVVJCCQkJCXBVcmI7Ci0JLy9UaGVzZSAyIEJvb2xlYW4gc2hvdWxkbid0IGJvdGggYmUgMSBhdCB0aGUgc2FtZSB0aW1lLgotCVVMT05HCQkJCUJ1bGtJbk9mZnNldDsJLy8gbnVtYmVyIG9mIHBhY2tldHMgd2FpdGluZyBmb3IgcmVvcmRlcmluZyAuCi0JQk9PTEVBTgkJCQliUnhIYW5kbGluZzsJLy8gTm90aWZ5IHRoaXMgcGFja2V0IGlzIGJlaW5nIHByb2Nlc3Mgbm93LgotCUJPT0xFQU4JCQkJSW5Vc2U7CQkJLy8gVVNCIEhhcmR3YXJlIE9jY3VwaWVkLiBXYWl0IGZvciBVU0IgSFcgdG8gcHV0IHBhY2tldC4KLQlCT09MRUFOCQkJCVJlYWRhYmxlOwkJLy8gUmVjZWl2ZSBDb21wbGV0ZSBiYWNrLiBPSyBmb3IgZHJpdmVyIHRvIGluZGljYXRlIHJlY2VpdmluZyBwYWNrZXQuCi0JQk9PTEVBTgkJCQlJUlBQZW5kaW5nOwkJLy8gVE9ETzogVG8gYmUgcmVtb3ZlZAotCWF0b21pY190CQkJSXJwTG9jazsKLQlORElTX1NQSU5fTE9DSwkJUnhDb250ZXh0TG9jazsKLQlkbWFfYWRkcl90CQkJZGF0YV9kbWE7CQkvLyB1cmIgZG1hIG9uIGxpbnV4Ci19CVJYX0NPTlRFWFQsICpQUlhfQ09OVEVYVDsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotCi0vLwotLy8gIE5ESVMgVmVyc2lvbiBkZWZpbml0aW9ucwotLy8KLSNpZmRlZiAgTkRJUzUwX01JTklQT1JUCi0jZGVmaW5lIFJUTVBfTkRJU19NQUpPUl9WRVJTSU9OICAgICA1Ci0jZGVmaW5lIFJUTVBfTkRJU19NSU5PUl9WRVJTSU9OICAgICAwCi0jZW5kaWYKLQotI2lmZGVmICBORElTNTFfTUlOSVBPUlQKLSNkZWZpbmUgUlRNUF9ORElTX01BSk9SX1ZFUlNJT04gICAgIDUKLSNkZWZpbmUgUlRNUF9ORElTX01JTk9SX1ZFUlNJT04gICAgIDEKLSNlbmRpZgotCi1leHRlcm4gIGNoYXIgICAgTklDX1ZFTkRPUl9ERVNDW107Ci1leHRlcm4gIGludCAgICAgTklDX1ZFTkRPUl9ERVNDX0xFTjsKLQotZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgU05BUF9BSVJPTkVUW107Ci1leHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDaXBoZXJTdWl0ZUNpc2NvQ0NLTVtdOwotZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW47Ci1leHRlcm4JdW5zaWduZWQgY2hhcglDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0W107Ci1leHRlcm4JdW5zaWduZWQgY2hhcglDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0TGVuOwotZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ2lwaGVyU3VpdGVDQ1hUa2lwW107Ci1leHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDaXBoZXJTdWl0ZUNDWFRraXBMZW47Ci1leHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDSVNDT19PVUlbXTsKLWV4dGVybiAgVUNIQVIJQmFTaXplQXJyYXlbNF07Ci0KLWV4dGVybiBVQ0hBUiBCUk9BRENBU1RfQUREUltNQUNfQUREUl9MRU5dOwotZXh0ZXJuIFVDSEFSIE1VTFRJQ0FTVF9BRERSW01BQ19BRERSX0xFTl07Ci1leHRlcm4gVUNIQVIgWkVST19NQUNfQUREUltNQUNfQUREUl9MRU5dOwotZXh0ZXJuIFVMT05HIEJJVDMyWzMyXTsKLWV4dGVybiBVQ0hBUiBCSVQ4WzhdOwotZXh0ZXJuIGNoYXIqIENpcGhlck5hbWVbXTsKLWV4dGVybiBjaGFyKiBNQ1NUb01icHNbXTsKLWV4dGVybiBVQ0hBUgkgUnh3aU1DU1RvT2ZkbVJhdGVbMTJdOwotZXh0ZXJuIFVDSEFSIFNOQVBfODAyXzFIWzZdOwotZXh0ZXJuIFVDSEFSIFNOQVBfQlJJREdFX1RVTk5FTFs2XTsKLWV4dGVybiBVQ0hBUiBTTkFQX0FJUk9ORVRbOF07Ci1leHRlcm4gVUNIQVIgQ0tJUF9MTENfU05BUFs4XTsKLWV4dGVybiBVQ0hBUiBFQVBPTF9MTENfU05BUFs4XTsKLWV4dGVybiBVQ0hBUiBFQVBPTFsyXTsKLWV4dGVybiBVQ0hBUiBJUFhbMl07Ci1leHRlcm4gVUNIQVIgQVBQTEVfVEFMS1syXTsKLWV4dGVybiBVQ0hBUiBSYXRlSWRUb1BsY3BTaWduYWxbMTJdOyAvLyBzZWUgSUVFRTgwMi4xMWEtMTk5OSBwLjE0Ci1leHRlcm4gVUNIQVIJIE9mZG1SYXRlVG9SeHdpTUNTW107Ci1leHRlcm4gVUNIQVIgT2ZkbVNpZ25hbFRvUmF0ZUlkWzE2XSA7Ci1leHRlcm4gVUNIQVIgZGVmYXVsdF9jd21pbls0XTsKLWV4dGVybiBVQ0hBUiBkZWZhdWx0X2N3bWF4WzRdOwotZXh0ZXJuIFVDSEFSIGRlZmF1bHRfc3RhX2FpZnNuWzRdOwotZXh0ZXJuIFVDSEFSIE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbOF07Ci0KLWV4dGVybiBVU0hPUlQgUmF0ZVVwUEVSW107Ci1leHRlcm4gVVNIT1JUIFJhdGVEb3duUEVSW107Ci1leHRlcm4gVUNIQVIgIFBoeTExQk5leHRSYXRlRG93bndhcmRbXTsKLWV4dGVybiBVQ0hBUiAgUGh5MTFCTmV4dFJhdGVVcHdhcmRbXTsKLWV4dGVybiBVQ0hBUiAgUGh5MTFCR05leHRSYXRlRG93bndhcmRbXTsKLWV4dGVybiBVQ0hBUiAgUGh5MTFCR05leHRSYXRlVXB3YXJkW107Ci1leHRlcm4gVUNIQVIgIFBoeTExQU5leHRSYXRlRG93bndhcmRbXTsKLWV4dGVybiBVQ0hBUiAgUGh5MTFBTmV4dFJhdGVVcHdhcmRbXTsKLWV4dGVybiBDSEFSICAgUnNzaVNhZmVMZXZlbEZvclR4UmF0ZVtdOwotZXh0ZXJuIFVDSEFSICBSYXRlSWRUb01icHNbXTsKLWV4dGVybiBVU0hPUlQgUmF0ZUlkVG81MDBLYnBzW107Ci0KLWV4dGVybiBVQ0hBUiAgQ2lwaGVyU3VpdGVXcGFOb25lVGtpcFtdOwotZXh0ZXJuIFVDSEFSICBDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwTGVuOwotCi1leHRlcm4gVUNIQVIgIENpcGhlclN1aXRlV3BhTm9uZUFlc1tdOwotZXh0ZXJuIFVDSEFSICBDaXBoZXJTdWl0ZVdwYU5vbmVBZXNMZW47Ci0KLWV4dGVybiBVQ0hBUiAgU3NpZEllOwotZXh0ZXJuIFVDSEFSICBTdXBSYXRlSWU7Ci1leHRlcm4gVUNIQVIgIEV4dFJhdGVJZTsKLQotZXh0ZXJuIFVDSEFSICBIdENhcEllOwotZXh0ZXJuIFVDSEFSICBBZGRIdEluZm9JZTsKLWV4dGVybiBVQ0hBUiAgTmV3RXh0Q2hhbkllOwotCi1leHRlcm4gVUNIQVIgIEVycEllOwotZXh0ZXJuIFVDSEFSICBEc0llOwotZXh0ZXJuIFVDSEFSICBUaW1JZTsKLWV4dGVybiBVQ0hBUiAgV3BhSWU7Ci1leHRlcm4gVUNIQVIgIFdwYTJJZTsKLWV4dGVybiBVQ0hBUiAgSWJzc0llOwotZXh0ZXJuIFVDSEFSICBDY3gySWU7Ci0KLWV4dGVybiBVQ0hBUiAgV1BBX09VSVtdOwotZXh0ZXJuIFVDSEFSICBSU05fT1VJW107Ci1leHRlcm4gVUNIQVIgIFdNRV9JTkZPX0VMRU1bXTsKLWV4dGVybiBVQ0hBUiAgV01FX1BBUk1fRUxFTVtdOwotZXh0ZXJuIFVDSEFSICBDY3gyUW9zSW5mb1tdOwotZXh0ZXJuIFVDSEFSICBDY3gySWVJbmZvW107Ci1leHRlcm4gVUNIQVIgIFJBTElOS19PVUlbXTsKLWV4dGVybiBVQ0hBUiAgUG93ZXJDb25zdHJhaW50SUVbXTsKLQotCi1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZVtdOwotZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJbXTsKLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFHW107Ci1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQkdbXTsKLQotZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJHTjFTW107Ci1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbXTsKLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kW107Ci1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExTjFTW107Ci1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExTjJTW107Ci1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbXTsKLQotZXh0ZXJuIFVDSEFSICBQUkVfTl9IVF9PVUlbXTsKKy8qKysrQWRkIGJ5IHNoaWFuZyBmb3IgbWVyZ2UgTWluaXBvcnRNTVJlcXVlc3QoKSBhbmQgTWluaXBvcnREYXRhTU1SZXF1ZXN0KCkgaW50byBvbmUgZnVuY3Rpb24gKi8KKyNkZWZpbmUgTUFYX0RBVEFNTV9SRVRSWQkzCisjZGVmaW5lIE1HTVRfVVNFX1FVRVVFX0ZMQUcJMHg4MAorLyotLS1BZGQgYnkgc2hpYW5nIGZvciBtZXJnZSBNaW5pcG9ydE1NUmVxdWVzdCgpIGFuZCBNaW5pcG9ydERhdGFNTVJlcXVlc3QoKSBpbnRvIG9uZSBmdW5jdGlvbiAqLwogCiAjZGVmaW5lCU1BWFNFUQkJKDB4RkZGKQogCi1zdHJ1Y3QgcmVvcmRlcmluZ19tcGR1Ci17Ci0Jc3RydWN0IHJlb3JkZXJpbmdfbXBkdQkqbmV4dDsKLQlQTkRJU19QQUNLRVQJCQlwUGFja2V0OwkJLyogY292ZXJ0ZWQgdG8gODAyLjMgZnJhbWUgKi8KLQlpbnQJCQkJCQlTZXF1ZW5jZTsJCS8qIHNlcXVlbmNlIG51bWJlciBvZiBNUERVICovCi0JQk9PTEVBTgkJCQkJYkFNU0RVOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgU05BUF9BSVJPTkVUW107CitleHRlcm4gdW5zaWduZWQgY2hhciBDSVNDT19PVUlbXTsKK2V4dGVybiB1OCBCYVNpemVBcnJheVs0XTsKKworZXh0ZXJuIHU4IEJST0FEQ0FTVF9BRERSW01BQ19BRERSX0xFTl07CitleHRlcm4gdTggWkVST19NQUNfQUREUltNQUNfQUREUl9MRU5dOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgQklUMzJbMzJdOworZXh0ZXJuIHU4IEJJVDhbOF07CitleHRlcm4gY2hhciAqQ2lwaGVyTmFtZVtdOworZXh0ZXJuIGNoYXIgKk1DU1RvTWJwc1tdOworZXh0ZXJuIHU4IFJ4d2lNQ1NUb09mZG1SYXRlWzEyXTsKK2V4dGVybiB1OCBTTkFQXzgwMl8xSFs2XTsKK2V4dGVybiB1OCBTTkFQX0JSSURHRV9UVU5ORUxbNl07CitleHRlcm4gdTggU05BUF9BSVJPTkVUWzhdOworZXh0ZXJuIHU4IENLSVBfTExDX1NOQVBbOF07CitleHRlcm4gdTggRUFQT0xfTExDX1NOQVBbOF07CitleHRlcm4gdTggRUFQT0xbMl07CitleHRlcm4gdTggSVBYWzJdOworZXh0ZXJuIHU4IEFQUExFX1RBTEtbMl07CitleHRlcm4gdTggUmF0ZUlkVG9QbGNwU2lnbmFsWzEyXTsJLyogc2VlIElFRUU4MDIuMTFhLTE5OTkgcC4xNCAqLworZXh0ZXJuIHU4IE9mZG1SYXRlVG9SeHdpTUNTW107CitleHRlcm4gdTggT2ZkbVNpZ25hbFRvUmF0ZUlkWzE2XTsKK2V4dGVybiB1OCBkZWZhdWx0X2N3bWluWzRdOworZXh0ZXJuIHU4IGRlZmF1bHRfY3dtYXhbNF07CitleHRlcm4gdTggZGVmYXVsdF9zdGFfYWlmc25bNF07CitleHRlcm4gdTggTWFwVXNlclByaW9yaXR5VG9BY2Nlc3NDYXRlZ29yeVs4XTsKKworZXh0ZXJuIHUxNiBSYXRlVXBQRVJbXTsKK2V4dGVybiB1MTYgUmF0ZURvd25QRVJbXTsKK2V4dGVybiB1OCBQaHkxMUJOZXh0UmF0ZURvd253YXJkW107CitleHRlcm4gdTggUGh5MTFCTmV4dFJhdGVVcHdhcmRbXTsKK2V4dGVybiB1OCBQaHkxMUJHTmV4dFJhdGVEb3dud2FyZFtdOworZXh0ZXJuIHU4IFBoeTExQkdOZXh0UmF0ZVVwd2FyZFtdOworZXh0ZXJuIHU4IFBoeTExQU5leHRSYXRlRG93bndhcmRbXTsKK2V4dGVybiB1OCBQaHkxMUFOZXh0UmF0ZVVwd2FyZFtdOworZXh0ZXJuIGNoYXIgUnNzaVNhZmVMZXZlbEZvclR4UmF0ZVtdOworZXh0ZXJuIHU4IFJhdGVJZFRvTWJwc1tdOworZXh0ZXJuIHUxNiBSYXRlSWRUbzUwMEticHNbXTsKKworZXh0ZXJuIHU4IENpcGhlclN1aXRlV3BhTm9uZVRraXBbXTsKK2V4dGVybiB1OCBDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwTGVuOworCitleHRlcm4gdTggQ2lwaGVyU3VpdGVXcGFOb25lQWVzW107CitleHRlcm4gdTggQ2lwaGVyU3VpdGVXcGFOb25lQWVzTGVuOworCitleHRlcm4gdTggU3NpZEllOworZXh0ZXJuIHU4IFN1cFJhdGVJZTsKK2V4dGVybiB1OCBFeHRSYXRlSWU7CisKK2V4dGVybiB1OCBIdENhcEllOworZXh0ZXJuIHU4IEFkZEh0SW5mb0llOworZXh0ZXJuIHU4IE5ld0V4dENoYW5JZTsKKworZXh0ZXJuIHU4IEVycEllOworZXh0ZXJuIHU4IERzSWU7CitleHRlcm4gdTggVGltSWU7CitleHRlcm4gdTggV3BhSWU7CitleHRlcm4gdTggV3BhMkllOworZXh0ZXJuIHU4IElic3NJZTsKK2V4dGVybiB1OCBDY3gySWU7CitleHRlcm4gdTggV2FwaUllOworCitleHRlcm4gdTggV1BBX09VSVtdOworZXh0ZXJuIHU4IFJTTl9PVUlbXTsKK2V4dGVybiB1OCBXQVBJX09VSVtdOworZXh0ZXJuIHU4IFdNRV9JTkZPX0VMRU1bXTsKK2V4dGVybiB1OCBXTUVfUEFSTV9FTEVNW107CitleHRlcm4gdTggQ2N4MlFvc0luZm9bXTsKK2V4dGVybiB1OCBDY3gySWVJbmZvW107CitleHRlcm4gdTggUkFMSU5LX09VSVtdOworZXh0ZXJuIHU4IFBvd2VyQ29uc3RyYWludElFW107CisKK2V4dGVybiB1OCBSYXRlU3dpdGNoVGFibGVbXTsKK2V4dGVybiB1OCBSYXRlU3dpdGNoVGFibGUxMUJbXTsKK2V4dGVybiB1OCBSYXRlU3dpdGNoVGFibGUxMUdbXTsKK2V4dGVybiB1OCBSYXRlU3dpdGNoVGFibGUxMUJHW107CisKK2V4dGVybiB1OCBSYXRlU3dpdGNoVGFibGUxMUJHTjFTW107CitleHRlcm4gdTggUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1tdOworZXh0ZXJuIHU4IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZFtdOworZXh0ZXJuIHU4IFJhdGVTd2l0Y2hUYWJsZTExTjFTW107CitleHRlcm4gdTggUmF0ZVN3aXRjaFRhYmxlMTFOMlNbXTsKK2V4dGVybiB1OCBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kW107CisKK2V4dGVybiB1OCBQUkVfTl9IVF9PVUlbXTsKKworc3RydWN0IHJ0X3Jzc2lfc2FtcGxlIHsKKwljaGFyIExhc3RSc3NpMDsJCS8qIGxhc3QgcmVjZWl2ZWQgUlNTSSAqLworCWNoYXIgTGFzdFJzc2kxOwkJLyogbGFzdCByZWNlaXZlZCBSU1NJICovCisJY2hhciBMYXN0UnNzaTI7CQkvKiBsYXN0IHJlY2VpdmVkIFJTU0kgKi8KKwljaGFyIEF2Z1Jzc2kwOworCWNoYXIgQXZnUnNzaTE7CisJY2hhciBBdmdSc3NpMjsKKwlzaG9ydCBBdmdSc3NpMFg4OworCXNob3J0IEF2Z1Jzc2kxWDg7CisJc2hvcnQgQXZnUnNzaTJYODsKIH07CiAKLXN0cnVjdCByZW9yZGVyaW5nX2xpc3QKLXsKLQlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICpuZXh0OwotCWludCAJcWxlbjsKKy8qICovCisvKiAgUXVldWUgc3RydWN0dXJlIGFuZCBtYWNyb3MgKi8KKy8qICovCitzdHJ1Y3QgcnRfcXVldWVfZW50cnk7CisKK3N0cnVjdCBydF9xdWV1ZV9lbnRyeSB7CisJc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICpOZXh0OwogfTsKIAotc3RydWN0IHJlb3JkZXJpbmdfbXBkdV9wb29sCi17Ci0JUFZPSUQJCQkJCW1lbTsKLQlORElTX1NQSU5fTE9DSwkJCWxvY2s7Ci0Jc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAJZnJlZWxpc3Q7CisvKiBRdWV1ZSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBydF9xdWV1ZV9oZWFkZXIgeworCXN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqSGVhZDsKKwlzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKlRhaWw7CisJdW5zaWduZWQgbG9uZyBOdW1iZXI7CiB9OwogCi10eXBlZGVmIHN0cnVjdCAJX1JTU0lfU0FNUExFIHsKLQlDSEFSCQkJTGFzdFJzc2kwOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kKLQlDSEFSCQkJTGFzdFJzc2kxOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kKLQlDSEFSCQkJTGFzdFJzc2kyOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kKLQlDSEFSCQkJQXZnUnNzaTA7Ci0JQ0hBUgkJCUF2Z1Jzc2kxOwotCUNIQVIJCQlBdmdSc3NpMjsKLQlTSE9SVAkJCUF2Z1Jzc2kwWDg7Ci0JU0hPUlQJCQlBdmdSc3NpMVg4OwotCVNIT1JUCQkJQXZnUnNzaTJYODsKLX0gUlNTSV9TQU1QTEU7Ci0KLS8vCi0vLyAgUXVldWUgc3RydWN0dXJlIGFuZCBtYWNyb3MKLS8vCi10eXBlZGVmIHN0cnVjdCAgX1FVRVVFX0VOVFJZICAgIHsKLQlzdHJ1Y3QgX1FVRVVFX0VOVFJZICAgICAqTmV4dDsKLX0gICBRVUVVRV9FTlRSWSwgKlBRVUVVRV9FTlRSWTsKLQotLy8gUXVldWUgc3RydWN0dXJlCi10eXBlZGVmIHN0cnVjdCAgX1FVRVVFX0hFQURFUiAgIHsKLQlQUVVFVUVfRU5UUlkgICAgSGVhZDsKLQlQUVVFVUVfRU5UUlkgICAgVGFpbDsKLQlVTE9ORyAgICAgICAgICAgTnVtYmVyOwotfSAgIFFVRVVFX0hFQURFUiwgKlBRVUVVRV9IRUFERVI7Ci0KICNkZWZpbmUgSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKFF1ZXVlSGVhZGVyKSAgICAgICAgICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJKFF1ZXVlSGVhZGVyKS0+SGVhZCA9IChRdWV1ZUhlYWRlciktPlRhaWwgPSBOVUxMOyAgIFwKQEAgLTMxNCwxMCArMTgwLDExIEBACiAjZGVmaW5lIFJlbW92ZUhlYWRRdWV1ZShRdWV1ZUhlYWRlcikgICAgICAgICAgICAgICAgXAogKFF1ZXVlSGVhZGVyKS0+SGVhZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JUFFVRVVFX0VOVFJZIHBOZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqcE5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJaWYgKChRdWV1ZUhlYWRlciktPkhlYWQgIT0gTlVMTCkJCQkJXAogCXsJCQkJCQkJCQkJCQlcCiAJCXBOZXh0ID0gKFF1ZXVlSGVhZGVyKS0+SGVhZC0+TmV4dDsgICAgICAgICAgXAorCQkoUXVldWVIZWFkZXIpLT5IZWFkLT5OZXh0ID0gTlVMTDsJCVwKIAkJKFF1ZXVlSGVhZGVyKS0+SGVhZCA9IHBOZXh0OyAgICAgICAgICAgICAgICBcCiAJCWlmIChwTmV4dCA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQkJKFF1ZXVlSGVhZGVyKS0+VGFpbCA9IE5VTEw7ICAgICAgICAgICAgIFwKQEAgLTMyNyw0MSArMTk0LDQ5IEBACiAKICNkZWZpbmUgSW5zZXJ0SGVhZFF1ZXVlKFF1ZXVlSGVhZGVyLCBRdWV1ZUVudHJ5KSAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJKChQUVVFVUVfRU5UUlkpUXVldWVFbnRyeSktPk5leHQgPSAoUXVldWVIZWFkZXIpLT5IZWFkOyBcCi0JCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICAgICAgXAorCQkoKHN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqKVF1ZXVlRW50cnkpLT5OZXh0ID0gKFF1ZXVlSGVhZGVyKS0+SGVhZDsgXAorCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gKHN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqKShRdWV1ZUVudHJ5KTsgICAgICAgXAogCQlpZiAoKFF1ZXVlSGVhZGVyKS0+VGFpbCA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCShRdWV1ZUhlYWRlciktPlRhaWwgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICBcCisJCQkoUXVldWVIZWFkZXIpLT5UYWlsID0gKHN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqKShRdWV1ZUVudHJ5KTsgICBcCiAJCShRdWV1ZUhlYWRlciktPk51bWJlcisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfQogCiAjZGVmaW5lIEluc2VydFRhaWxRdWV1ZShRdWV1ZUhlYWRlciwgUXVldWVFbnRyeSkgICAgICAgICAgICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkoKFBRVUVVRV9FTlRSWSlRdWV1ZUVudHJ5KS0+TmV4dCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICBcCisJKChzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKilRdWV1ZUVudHJ5KS0+TmV4dCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICBcCiAJaWYgKChRdWV1ZUhlYWRlciktPlRhaWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkoUXVldWVIZWFkZXIpLT5UYWlsLT5OZXh0ID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7IFwKKwkJKFF1ZXVlSGVhZGVyKS0+VGFpbC0+TmV4dCA9IChzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKikoUXVldWVFbnRyeSk7IFwKIAllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICAgICAgXAotCShRdWV1ZUhlYWRlciktPlRhaWwgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICAgICAgICAgIFwKKwkJKFF1ZXVlSGVhZGVyKS0+SGVhZCA9IChzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKikoUXVldWVFbnRyeSk7ICAgICAgIFwKKwkoUXVldWVIZWFkZXIpLT5UYWlsID0gKHN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqKShRdWV1ZUVudHJ5KTsgICAgICAgICAgIFwKIAkoUXVldWVIZWFkZXIpLT5OdW1iZXIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKLS8vCi0vLyAgTWFjcm9zIGZvciBmbGFnIGFuZCByZWYgY291bnQgb3BlcmF0aW9ucwotLy8KKyNkZWZpbmUgSW5zZXJ0VGFpbFF1ZXVlQWMocEFkLCBwRW50cnksIFF1ZXVlSGVhZGVyLCBRdWV1ZUVudHJ5KQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQlcCisJKChzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKilRdWV1ZUVudHJ5KS0+TmV4dCA9IE5VTEw7CQkJCQkJCVwKKwlpZiAoKFF1ZXVlSGVhZGVyKS0+VGFpbCkJCQkJCQkJCQkJCVwKKwkJKFF1ZXVlSGVhZGVyKS0+VGFpbC0+TmV4dCA9IChzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKikoUXVldWVFbnRyeSk7CQkJXAorCWVsc2UJCQkJCQkJCQkJCQkJCQkJXAorCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gKHN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqKShRdWV1ZUVudHJ5KTsJCQkJXAorCShRdWV1ZUhlYWRlciktPlRhaWwgPSAoc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICopKFF1ZXVlRW50cnkpOwkJCQkJXAorCShRdWV1ZUhlYWRlciktPk51bWJlcisrOwkJCQkJCQkJCQkJXAorfQorCisvKiAqLworLyogIE1hY3JvcyBmb3IgZmxhZyBhbmQgcmVmIGNvdW50IG9wZXJhdGlvbnMgKi8KKy8qICovCiAjZGVmaW5lIFJUTVBfU0VUX0ZMQUcoX00sIF9GKSAgICAgICAoKF9NKS0+RmxhZ3MgfD0gKF9GKSkKICNkZWZpbmUgUlRNUF9DTEVBUl9GTEFHKF9NLCBfRikgICAgICgoX00pLT5GbGFncyAmPSB+KF9GKSkKICNkZWZpbmUgUlRNUF9DTEVBUl9GTEFHUyhfTSkgICAgICAgICgoX00pLT5GbGFncyA9IDApCiAjZGVmaW5lIFJUTVBfVEVTVF9GTEFHKF9NLCBfRikgICAgICAoKChfTSktPkZsYWdzICYgKF9GKSkgIT0gMCkKICNkZWZpbmUgUlRNUF9URVNUX0ZMQUdTKF9NLCBfRikgICAgICgoKF9NKS0+RmxhZ3MgJiAoX0YpKSA9PSAoX0YpKQotCi0jaWZkZWYgUlQyODYwCi0vLyBNYWNybyBmb3IgcG93ZXIgc2F2ZSBmbGFnLgorLyogTWFjcm8gZm9yIHBvd2VyIHNhdmUgZmxhZy4gKi8KICNkZWZpbmUgUlRNUF9TRVRfUFNGTEFHKF9NLCBfRikgICAgICAgKChfTSktPlBTRmxhZ3MgfD0gKF9GKSkKICNkZWZpbmUgUlRNUF9DTEVBUl9QU0ZMQUcoX00sIF9GKSAgICAgKChfTSktPlBTRmxhZ3MgJj0gfihfRikpCiAjZGVmaW5lIFJUTVBfQ0xFQVJfUFNGTEFHUyhfTSkgICAgICAgICgoX00pLT5QU0ZsYWdzID0gMCkKICNkZWZpbmUgUlRNUF9URVNUX1BTRkxBRyhfTSwgX0YpICAgICAgKCgoX00pLT5QU0ZsYWdzICYgKF9GKSkgIT0gMCkKICNkZWZpbmUgUlRNUF9URVNUX1BTRkxBR1MoX00sIF9GKSAgICAgKCgoX00pLT5QU0ZsYWdzICYgKF9GKSkgPT0gKF9GKSkKLSNlbmRpZgogCiAjZGVmaW5lIE9QU1RBVFVTX1NFVF9GTEFHKF9wQWQsIF9GKSAgICAgKChfcEFkKS0+Q29tbW9uQ2ZnLk9wU3RhdHVzRmxhZ3MgfD0gKF9GKSkKICNkZWZpbmUgT1BTVEFUVVNfQ0xFQVJfRkxBRyhfcEFkLCBfRikgICAoKF9wQWQpLT5Db21tb25DZmcuT3BTdGF0dXNGbGFncyAmPSB+KF9GKSkKQEAgLTM4NSw1OSArMjYwLDEyIEBACiAjZGVmaW5lIENLSVBfS1BfT04oX3ApCQkJCSgoKChfcCktPlN0YUNmZy5Da2lwRmxhZykgJiAweDEwKSAmJiAoKF9wKS0+U3RhQ2ZnLmJDa2lwQ21pY09uID09IFRSVUUpKQogI2RlZmluZSBDS0lQX0NNSUNfT04oX3ApCQkJKCgoKF9wKS0+U3RhQ2ZnLkNraXBGbGFnKSAmIDB4MDgpICYmICgoX3ApLT5TdGFDZmcuYkNraXBDbWljT24gPT0gVFJVRSkpCiAKLQogI2RlZmluZSBJTkNfUklOR19JTkRFWChfaWR4LCBfUmluZ1NpemUpICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgKF9pZHgpID0gKF9pZHgrMSkgJSAoX1JpbmdTaXplKTsgICAgICAgXAogfQogCi0jaWZkZWYgUlQyODcwCi0vLyBXZSB3aWxsIGhhdmUgYSBjb3N0IGRvd24gdmVyc2lvbiB3aGljaCBtYWMgdmVyc2lvbiBpcyAweDMwOTB4eHh4Ci0jZGVmaW5lIElTX1JUMzA5MChfcEFkKQkJCQkoKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZmYwMDAwKSA9PSAweDMwNzEwMDAwKSB8fCAoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzA5MDAwMDApKQotI2Vsc2UKLSNkZWZpbmUgSVNfUlQzMDkwKF9wQWQpCQkJCTAKLSNlbmRpZgotI2RlZmluZSBJU19SVDMwNzAoX3BBZCkJCQkJKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZmYwMDAwKSA9PSAweDMwNzAwMDAwKQotI2lmZGVmIFJUMjg3MAotI2RlZmluZSBJU19SVDMwNzEoX3BBZCkJCQkJKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZmYwMDAwKSA9PSAweDMwNzEwMDAwKQotI2RlZmluZSBJU19SVDMweHgoX3BBZCkJCQkJKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZjAwMDAwKSA9PSAweDMwNzAwMDAwKQotI2VuZGlmCi0KLSNkZWZpbmUgUklOR19QQUNLRVRfSU5JVChfVHhSaW5nLCBfaWR4KSAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9UeFJpbmctPkNlbGxbX2lkeF0ucE5kaXNQYWNrZXQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBfVHhSaW5nLT5DZWxsW19pZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIFRYRFRfSU5JVChfVHhEKSAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCU5kaXNaZXJvTWVtb3J5KF9UeEQsIFRYRF9TSVpFKTsJXAotCV9UeEQtPkRNQURPTkUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotLy9TZXQgbGFzdCBkYXRhIHNlZ21lbnQKLSNkZWZpbmUgUklOR19TRVRfTEFTVERTKF9UeEQsIF9Jc1NEMCkgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoX0lzU0QwKSB7X1R4RC0+TGFzdFNlYzAgPSAxO30gICAgIFwKLSAgICBlbHNlIHtfVHhELT5MYXN0U2VjMSA9IDE7fSAgICAgXAotfQotCi0vLyBJbmNyZWFzZSBUeFRzYyB2YWx1ZSBmb3IgbmV4dCB0cmFuc21pc3Npb24KLS8vIFRPRE86Ci0vLyBXaGVuIGk9PTYsIG1lYW5zIFRTQyBoYXMgZG9uZSBvbmUgZnVsbCBjeWNsZSwgZG8gcmUta2V5aW5nIHN0dWZmIGZvbGxvdyBzcGVjcwotLy8gU2hvdWxkIHNlbmQgYSBzcGVjaWFsIGV2ZW50IG1pY3Jvc29mdCBkZWZpbmVkIHRvIHJlcXVlc3QgcmUta2V5Ci0jZGVmaW5lIElOQ19UWF9UU0MoX3RzYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCBpPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgd2hpbGUgKCsrX3RzY1tpXSA9PSAweDApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChpID09IDYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8vIFN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NQ1NTZXQgaXMgY29waWVkIGZyb20gQVAgYmVhY29uLiAgRG9uJ3QgbmVlZCB0byB1cGRhdGUgaGVyZS4KKy8qIFN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NQ1NTZXQgaXMgY29waWVkIGZyb20gQVAgYmVhY29uLiAgRG9uJ3QgbmVlZCB0byB1cGRhdGUgaGVyZS4gKi8KICNkZWZpbmUgQ09QWV9IVFNFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhfcEFkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LkNoYW5uZWxXaWR0aCA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGg7ICAgICAgXApAQCAtNDUxLDM0MyArMjc5LDUyIEBACiAJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlJlY29tV2lkdGggPSBfcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8uUmVjb21XaWR0aDsgICAgICBcCiAJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk9wZXJhaW9uTW9kZSA9IF9wQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlOyAgICAgIFwKIAlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTm9uR2ZQcmVzZW50ID0gX3BBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQ7ICAgICAgXAotCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRDYXBhYmlsaXR5Lk1DU1NldCwgKF9wQWQpLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIHNpemVvZihVQ0hBUikgKiAxNik7XAorCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRDYXBhYmlsaXR5Lk1DU1NldCwgKF9wQWQpLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIHNpemVvZih1OCkqIDE2KTtcCiB9CiAKICNkZWZpbmUgQ09QWV9BUF9IVFNFVFRJTkdTX0ZST01fQkVBQ09OKF9wQWQsIF9wSHRDYXBhYmlsaXR5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplID0gKFVDSEFSKShfcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkFNc2R1U2l6ZSk7CVwKLQlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NbXBzTW9kZT0gKFVDSEFSKShfcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLk1pbW9Qcyk7CVwKLQlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NYXhSQW1wZHVGYWN0b3IgPSAoVUNIQVIpKF9wSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yKTsJXAorCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFNc2R1U2l6ZSA9ICh1OCkoX3BIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5BTXNkdVNpemUpOwlcCisJX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTW1wc01vZGU9ICh1OCkoX3BIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHMpOwlcCisJX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWF4UkFtcGR1RmFjdG9yID0gKHU4KShfcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1heFJBbXBkdUZhY3Rvcik7CVwKIH0KIAotLy8KLS8vIE1BQ1JPIGZvciAzMi1iaXQgUENJIHJlZ2lzdGVyIHJlYWQgLyB3cml0ZQotLy8KLS8vIFVzYWdlIDogUlRNUF9JT19SRUFEMzIoCi0vLyAgICAgICAgICAgICAgUFJUTVBfQURBUFRFUiBwQWQsCi0vLyAgICAgICAgICAgICAgVUxPTkcgUmVnaXN0ZXJfT2Zmc2V0LAotLy8gICAgICAgICAgICAgIFBVTE9ORyAgcFZhbHVlKQotLy8KLS8vICAgICAgICAgUlRNUF9JT19XUklURTMyKAotLy8gICAgICAgICAgICAgIFBSVE1QX0FEQVBURVIgcEFkLAotLy8gICAgICAgICAgICAgIFVMT05HIFJlZ2lzdGVyX09mZnNldCwKLS8vICAgICAgICAgICAgICBVTE9ORyBWYWx1ZSkKLS8vCisvKiAqLworLyogTUFDUk8gZm9yIDMyLWJpdCBQQ0kgcmVnaXN0ZXIgcmVhZCAvIHdyaXRlICovCisvKiAqLworLyogVXNhZ2UgOiBSVE1QX0lPX1JFQUQzMiggKi8KKy8qICAgICAgICAgICAgICBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsICovCisvKiAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBSZWdpc3Rlcl9PZmZzZXQsICovCisvKiAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqIHBWYWx1ZSkgKi8KKy8qICovCisvKiAgICAgICAgIFJUTVBfSU9fV1JJVEUzMiggKi8KKy8qICAgICAgICAgICAgICBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsICovCisvKiAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBSZWdpc3Rlcl9PZmZzZXQsICovCisvKiAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBWYWx1ZSkgKi8KKy8qICovCiAKLS8vCi0vLyBCQlAgJiBSRiBhcmUgdXNpbmcgaW5kaXJlY3QgYWNjZXNzLiBCZWZvcmUgd3JpdGUgYW55IHZhbHVlIGludG8gaXQuCi0vLyBXZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBvdXRzdGFuZGluZyBjb21tYW5kIHBlbmRpbmcgdmlhIGNoZWNraW5nIGJ1c3kgYml0LgotLy8KLSNkZWZpbmUgTUFYX0JVU1lfQ09VTlQgIDEwMCAgICAgICAgIC8vIE51bWJlciBvZiByZXRyeSBiZWZvcmUgZmFpbGluZyBhY2Nlc3MgQkJQICYgUkYgaW5kaXJlY3QgcmVnaXN0ZXIKLS8vCi0jaWZkZWYgUlQyODYwCi0jZGVmaW5lIFJUTVBfUkZfSU9fV1JJVEUzMihfQSwgX1YpICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBQSFlfQ1NSNF9TVFJVQyAgVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVUxPTkcgICAgICAgICAgIEJ1c3lDbnQgPSAwOyAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmKSAJICAgICAgICAgICAgICAgIFwKLSAgICB7CQkJCQkJCQkJCQkJXAotICAgICAgICByZXR1cm47CQkJCQkJCQkJCVwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgUkZfQ1NSX0NGRzAsICZWYWx1ZS53b3JkKTsgIFwKLSAgICAgICAgaWYgKFZhbHVlLmZpZWxkLkJ1c3kgPT0gSURMRSkgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCdXN5Q250Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgd2hpbGUgKEJ1c3lDbnQgPCBNQVhfQlVTWV9DT1VOVCk7ICAgICAgICAgICBcCi0gICAgaWYgKEJ1c3lDbnQgPCBNQVhfQlVTWV9DT1VOVCkgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgUlRNUF9JT19XUklURTMyKF9BLCBSRl9DU1JfQ0ZHMCwgX1YpOyAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIEJCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCAgICAgICAgICAgICBpLCBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChpPTA7IGk8TUFYX0JVU1lfQ09VTlQ7IGkrKykgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7ICAgICBcCi0gICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLndvcmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuZlJlYWQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFJUTVBfSU9fV1JJVEUzMihfQSwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsgICAgIFwKLSAgICAgICAgZm9yIChrPTA7IGs8TUFYX0JVU1lfQ09VTlQ7IGsrKykgICAgICAgICAgICAgICAgXAotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7IFwKLSAgICAgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAmJiAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKEJicENzci5maWVsZC5SZWdOdW0gPT0gX0kpKSAgICAgICAgICAgICAgICBcCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICooX3BWKSA9IChVQ0hBUilCYnBDc3IuZmllbGQuVmFsdWU7ICAgICAgICAgXAotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgREJHUFJJTlRfRVJSKCgiREZTIEJCUCByZWFkIFIlZCBmYWlsXG4iLCBfSSkpOyAgICAgIFwKLSAgICAgICAgKihfcFYpID0gKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV07ICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8vI2RlZmluZSBSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgIHt9Ci0vLyBSZWFkIEJCUCByZWdpc3RlciBieSByZWdpc3RlcidzIElELiBHZW5lcmF0ZSBQRVIgdG8gdGVzdCBCQQotI2RlZmluZSBSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCAgICAgICAgICAgICBpLCBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChpPTA7IGk8TUFYX0JVU1lfQ09VTlQ7IGkrKykgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQkJXAotICAgICAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLmZSZWFkID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOyAgICAgICAgICAgICAgICAgICAgICAgXAotCQlSVE1QX0lPX1dSSVRFMzIoX0EsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJCQkJXAotCQlBc2ljU2VuZENvbW1hbmRUb01jdShfQSwgMHg4MCwgMHhmZiwgMHgwLCAweDApOwkJCQkJXAotCQlSVE1QdXNlY0RlbGF5KDEwMDApOwkJCQkJCQlcCi0gICAgICAgIGZvciAoaz0wOyBrPE1BWF9CVVNZX0NPVU5UOyBrKyspICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJUlRNUF9JT19SRUFEMzIoX0EsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CQkJXAotICAgICAgICAgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IElETEUpICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoKEJicENzci5maWVsZC5CdXN5ID09IElETEUpICYmICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAoQmJwQ3NyLmZpZWxkLlJlZ051bSA9PSBfSSkpICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKihfcFYpID0gKFVDSEFSKUJicENzci5maWVsZC5WYWx1ZTsgICAgICAgICBcCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlEQkdQUklOVF9FUlIoKCJCQlAgcmVhZCBSJWQ9MHgleCBmYWlsXG4iLCBfSSwgQmJwQ3NyLndvcmQpKTsJXAotICAgICAgICAqKF9wVikgPSAoX0EpLT5CYnBXcml0ZUxhdGNoW19JXTsgICAgICAgICAgICAgICBcCi0JCVJUTVBfSU9fUkVBRDMyKF9BLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwkJCQlcCi0JCUJicENzci5maWVsZC5CdXN5ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIEJCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCAgICAgICAgICAgICBCdXN5Q250OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChCdXN5Q250PTA7IEJ1c3lDbnQ8TUFYX0JVU1lfQ09VTlQ7IEJ1c3lDbnQrKykgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7ICAgICBcCi0gICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3Iud29yZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5mUmVhZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuQnVzeSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5WYWx1ZSA9IF9WOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBSVE1QX0lPX1dSSVRFMzIoX0EsIEJCUF9DU1JfQ0ZHLCBCYnBDc3Iud29yZCk7ICAgICBcCi0gICAgICAgIChfQSktPkJicFdyaXRlTGF0Y2hbX0ldID0gX1Y7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKEJ1c3lDbnQgPT0gTUFYX0JVU1lfQ09VTlQpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBEQkdQUklOVF9FUlIoKCJCQlAgd3JpdGUgUiVkIGZhaWxcbiIsIF9JKSk7ICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotLy8gV3JpdGUgQkJQIHJlZ2lzdGVyIGJ5IHJlZ2lzdGVyJ3MgSUQgJiB2YWx1ZQotI2RlZmluZSBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCAgICAgICAgICAgICBCdXN5Q250OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChCdXN5Q250PTA7IEJ1c3lDbnQ8TUFYX0JVU1lfQ09VTlQ7IEJ1c3lDbnQrKykgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQkJXAotICAgICAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLndvcmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuZlJlYWQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuVmFsdWUgPSBfVjsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5SZWdOdW0gPSBfSTsgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKLQkJQXNpY1NlbmRDb21tYW5kVG9NY3UoX0EsIDB4ODAsIDB4ZmYsIDB4MCwgMHgwKTsJCQkJCVwKLSAgICAgICAgICAgIGlmIChfQS0+T3BNb2RlID09IE9QTU9ERV9BUCkgICAgICAgICAgICAgICAgICAgIFwKLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsJCQkJCQkJXAotICAgICAgICAoX0EpLT5CYnBXcml0ZUxhdGNoW19JXSA9IF9WOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChCdXN5Q250ID09IE1BWF9CVVNZX0NPVU5UKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJREJHUFJJTlRfRVJSKCgiQkJQIHdyaXRlIFIlZD0weCV4IGZhaWxcbiIsIF9JLCBCYnBDc3Iud29yZCkpOwlcCi0JCVJUTVBfSU9fUkVBRDMyKF9BLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwkJCQlcCi0JCUJicENzci5maWVsZC5CdXN5ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0jZW5kaWYgLyogUlQyODYwICovCi0jaWZkZWYgUlQyODcwCi0jZGVmaW5lIFJUTVBfUkZfSU9fV1JJVEUzMihfQSwgX1YpICAgICAgICAgICAgICAgICBSVFVTQldyaXRlUkZSZWdpc3RlcihfQSwgX1YpCi0jZGVmaW5lIFJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikgICBSVFVTQlJlYWRCQlBSZWdpc3RlcihfQSwgX0ksIF9wVikKLSNkZWZpbmUgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9WKSAgIFJUVVNCV3JpdGVCQlBSZWdpc3RlcihfQSwgX0ksIF9WKQotCi0jZGVmaW5lIEJCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpCQkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKF9BLCBfSSwgX1YpCi0jZGVmaW5lIEJCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgCQlSVFVTQlJlYWRCQlBSZWdpc3RlcihfQSwgX0ksIF9wVikKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotI2RlZmluZSAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKGNoLCBraHopICB7ICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIHN3aXRjaCAoY2gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6ICAgICBraHogPSAyNDEyMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDI6ICAgICBraHogPSAyNDE3MDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDM6ICAgICBraHogPSAyNDIyMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6ICAgICBraHogPSAyNDI3MDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDU6ICAgICBraHogPSAyNDMyMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDY6ICAgICBraHogPSAyNDM3MDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDc6ICAgICBraHogPSAyNDQyMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDg6ICAgICBraHogPSAyNDQ3MDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDk6ICAgICBraHogPSAyNDUyMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOiAgICBraHogPSAyNDU3MDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDExOiAgICBraHogPSAyNDYyMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOiAgICBraHogPSAyNDY3MDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOiAgICBraHogPSAyNDcyMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OiAgICBraHogPSAyNDg0MDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDM2OiAgLyogVU5JSSAqLyAga2h6ID0gNTE4MDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDogIC8qIFVOSUkgKi8gIGtoeiA9IDUyMDAwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ6ICAvKiBVTklJICovICBraHogPSA1MjIwMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4OiAgLyogVU5JSSAqLyAga2h6ID0gNTI0MDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjogIC8qIFVOSUkgKi8gIGtoeiA9IDUyNjAwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTY6ICAvKiBVTklJICovICBraHogPSA1MjgwMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDYwOiAgLyogVU5JSSAqLyAga2h6ID0gNTMwMDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA2NDogIC8qIFVOSUkgKi8gIGtoeiA9IDUzMjAwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ5OiAvKiBVTklJICovICBraHogPSA1NzQ1MDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDE1MzogLyogVU5JSSAqLyAga2h6ID0gNTc2NTAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTc6IC8qIFVOSUkgKi8gIGtoeiA9IDU3ODUwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTYxOiAvKiBVTklJICovICBraHogPSA1ODA1MDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDE2NTogLyogVU5JSSAqLyAga2h6ID0gNTgyNTAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDA6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTUwMDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDQ6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTUyMDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDg6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTU0MDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTI6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTU2MDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTY6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTU4MDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjA6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTYwMDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjQ6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTYyMDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjg6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTY0MDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzI6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTY2MDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzY6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTY4MDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDA6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTcwMDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MTcwMDAwOyAgIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAzODogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MTkwMDAwOyAgIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA0MjogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MjEwMDAwOyAgIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA0NjogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MjMwMDAwOyAgIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxODQ6IC8qIEphcGFuICovICAga2h6ID0gNDkyMDAwMDsgICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTg4OiAvKiBKYXBhbiAqLyAgIGtoeiA9IDQ5NDAwMDA7ICAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDE5MjogLyogSmFwYW4gKi8gICBraHogPSA0OTYwMDAwOyAgIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOTY6IC8qIEphcGFuICovICAga2h6ID0gNDk4MDAwMDsgICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjA4OiAvKiBKYXBhbiwgbWVhbnMgSjA4ICovICAga2h6ID0gNTA0MDAwMDsgICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjEyOiAvKiBKYXBhbiwgbWVhbnMgSjEyICovICAga2h6ID0gNTA2MDAwMDsgICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjE2OiAvKiBKYXBhbiwgbWVhbnMgSjE2ICovICAga2h6ID0gNTA4MDAwMDsgICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgIGtoeiA9IDI0MTIwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB9Ci0KLSNkZWZpbmUgICAgIE1BUF9LSFpfVE9fQ0hBTk5FTF9JRChraHosIGNoKSAgeyAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGtoeikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDEyMDAwOiAgICBjaCA9IDE7ICAgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDE3MDAwOiAgICBjaCA9IDI7ICAgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDIyMDAwOiAgICBjaCA9IDM7ICAgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDI3MDAwOiAgICBjaCA9IDQ7ICAgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDMyMDAwOiAgICBjaCA9IDU7ICAgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDM3MDAwOiAgICBjaCA9IDY7ICAgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDQyMDAwOiAgICBjaCA9IDc7ICAgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDQ3MDAwOiAgICBjaCA9IDg7ICAgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDUyMDAwOiAgICBjaCA9IDk7ICAgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDU3MDAwOiAgICBjaCA9IDEwOyAgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDYyMDAwOiAgICBjaCA9IDExOyAgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDY3MDAwOiAgICBjaCA9IDEyOyAgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDcyMDAwOiAgICBjaCA9IDEzOyAgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDg0MDAwOiAgICBjaCA9IDE0OyAgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1MTgwMDAwOiAgICBjaCA9IDM2OyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTIwMDAwMDogICAgY2ggPSA0MDsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDUyMjAwMDA6ICAgIGNoID0gNDQ7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjQwMDAwOiAgICBjaCA9IDQ4OyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTI2MDAwMDogICAgY2ggPSA1MjsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDUyODAwMDA6ICAgIGNoID0gNTY7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1MzAwMDAwOiAgICBjaCA9IDYwOyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTMyMDAwMDogICAgY2ggPSA2NDsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDU3NDUwMDA6ICAgIGNoID0gMTQ5OyAvKiBVTklJICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1NzY1MDAwOiAgICBjaCA9IDE1MzsgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTc4NTAwMDogICAgY2ggPSAxNTc7IC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDU4MDUwMDA6ICAgIGNoID0gMTYxOyAvKiBVTklJICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1ODI1MDAwOiAgICBjaCA9IDE2NTsgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTUwMDAwMDogICAgY2ggPSAxMDA7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTUyMDAwMDogICAgY2ggPSAxMDQ7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTU0MDAwMDogICAgY2ggPSAxMDg7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTU2MDAwMDogICAgY2ggPSAxMTI7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTU4MDAwMDogICAgY2ggPSAxMTY7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTYwMDAwMDogICAgY2ggPSAxMjA7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTYyMDAwMDogICAgY2ggPSAxMjQ7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTY0MDAwMDogICAgY2ggPSAxMjg7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTY2MDAwMDogICAgY2ggPSAxMzI7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTY4MDAwMDogICAgY2ggPSAxMzY7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTcwMDAwMDogICAgY2ggPSAxNDA7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTE3MDAwMDogICAgY2ggPSAzNDsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTE5MDAwMDogICAgY2ggPSAzODsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTIxMDAwMDogICAgY2ggPSA0MjsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTIzMDAwMDogICAgY2ggPSA0NjsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNDkyMDAwMDogICAgY2ggPSAxODQ7IC8qIEphcGFuICovICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNDk0MDAwMDogICAgY2ggPSAxODg7IC8qIEphcGFuICovICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNDk2MDAwMDogICAgY2ggPSAxOTI7IC8qIEphcGFuICovICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNDk4MDAwMDogICAgY2ggPSAxOTY7IC8qIEphcGFuICovICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTA0MDAwMDogICAgY2ggPSAyMDg7IC8qIEphcGFuLCBtZWFucyBKMDggKi8gIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDYwMDAwOiAgICBjaCA9IDIxMjsgLyogSmFwYW4sIG1lYW5zIEoxMiAqLyAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDUwODAwMDA6ICAgIGNoID0gMjE2OyAvKiBKYXBhbiwgbWVhbnMgSjE2ICovICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgY2ggPSAxOyAgICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB9Ci0KLS8vCi0vLyBDb21tb24gZnJhZ21lbnQgbGlzdCBzdHJ1Y3R1cmUgLSAgSWRlbnRpY2FsIHRvIHRoZSBzY2F0dGVyIGdhdGhlciBmcmFnIGxpc3Qgc3RydWN0dXJlCi0vLworLyogKi8KKy8qIENvbW1vbiBmcmFnbWVudCBsaXN0IHN0cnVjdHVyZSAtICBJZGVudGljYWwgdG8gdGhlIHNjYXR0ZXIgZ2F0aGVyIGZyYWcgbGlzdCBzdHJ1Y3R1cmUgKi8KKy8qICovCisvKiNkZWZpbmUgc3RydWN0IHJ0X3J0bXBfc2dfZWxlbWVudCAgICAgICAgIFNDQVRURVJfR0FUSEVSX0VMRU1FTlQgKi8KKy8qI2RlZmluZSBzdHJ1Y3QgcnRfcnRtcF9zZ19lbGVtZW50ICpQU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCAqLwogI2RlZmluZSBOSUNfTUFYX1BIWVNfQlVGX0NPVU5UICAgICAgICAgICAgICA4CiAKLXR5cGVkZWYgc3RydWN0IF9SVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQgewotICAgIFBWT0lECQlBZGRyZXNzOwotICAgIFVMT05HCQlMZW5ndGg7Ci0gICAgUFVMT05HCQlSZXNlcnZlZDsKLX0gUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5ULCAqUFJUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVDsKK3N0cnVjdCBydF9ydG1wX3NnX2VsZW1lbnQgeworCXZvaWQgKkFkZHJlc3M7CisJdW5zaWduZWQgbG9uZyBMZW5ndGg7CisJdW5zaWduZWQgbG9uZyAqUmVzZXJ2ZWQ7Cit9OwogCitzdHJ1Y3QgcnRfcnRtcF9zZ19saXN0IHsKKwl1bnNpZ25lZCBsb25nIE51bWJlck9mRWxlbWVudHM7CisJdW5zaWduZWQgbG9uZyAqUmVzZXJ2ZWQ7CisJc3RydWN0IHJ0X3J0bXBfc2dfZWxlbWVudCBFbGVtZW50c1tOSUNfTUFYX1BIWVNfQlVGX0NPVU5UXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9SVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QgewotICAgIFVMT05HICBOdW1iZXJPZkVsZW1lbnRzOwotICAgIFBVTE9ORyBSZXNlcnZlZDsKLSAgICBSVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQgRWxlbWVudHNbTklDX01BWF9QSFlTX0JVRl9DT1VOVF07Ci19IFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVCwgKlBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1Q7Ci0KLS8vCi0vLyAgU29tZSB1dGlsaXR5IG1hY3JvcwotLy8KKy8qICovCisvKiAgU29tZSB1dGlsaXR5IG1hY3JvcyAqLworLyogKi8KICNpZm5kZWYgbWluCiAjZGVmaW5lIG1pbihfYSwgX2IpICAgICAoKChfYSkgPCAoX2IpKSA/IChfYSkgOiAoX2IpKQogI2VuZGlmCkBAIC04MDUsMTEgKzM0MiwxMSBAQAogI2RlZmluZSBNT05JVE9SX09OKF9wKSAgICAgICAgICAgICAgKCgoX3ApLT5TdGFDZmcuQnNzVHlwZSkgPT0gQlNTX01PTklUT1IpCiAjZGVmaW5lIElETEVfT04oX3ApICAgICAgICAgICAgICAgICAoIUlORlJBX09OKF9wKSAmJiAhQURIT0NfT04oX3ApKQogCi0vLyBDaGVjayBMRUFQICYgQ0NLTSBmbGFncworLyogQ2hlY2sgTEVBUCAmIENDS00gZmxhZ3MgKi8KICNkZWZpbmUgTEVBUF9PTihfcCkgICAgICAgICAgICAgICAgICgoKF9wKS0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSkgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQogI2RlZmluZSBMRUFQX0NDS01fT04oX3ApICAgICAgICAgICAgKCgoKF9wKS0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSkgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKSAmJiAoKF9wKS0+U3RhQ2ZnLkxlYXBBdXRoSW5mby5DQ0tNID09IFRSVUUpKQogCi0vLyBpZiBvcmdpbmFsIEV0aGVybmV0IGZyYW1lIGNvbnRhaW5zIG5vIExMQy9TTkFQLCB0aGVuIGFuIGV4dHJhIExMQy9TTkFQIGVuY2FwIGlzIHJlcXVpcmVkCisvKiBpZiBvcmdpbmFsIEV0aGVybmV0IGZyYW1lIGNvbnRhaW5zIG5vIExMQy9TTkFQLCB0aGVuIGFuIGV4dHJhIExMQy9TTkFQIGVuY2FwIGlzIHJlcXVpcmVkICovCiAjZGVmaW5lIEVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfU1RBUlQoX3BCdWZWQSwgX3BFeHRyYUxsY1NuYXBFbmNhcCkJCVwKIHsJCQkJCQkJCQkJCQkJCQkJXAogCWlmICgoKCooX3BCdWZWQSArIDEyKSA8PCA4KSArICooX3BCdWZWQSArIDEzKSkgPiAxNTAwKQkJXApAQCAtODI3LDcgKzM2NCw3IEBACiAJfQkJCQkJCQkJCQkJCQkJCVwKIH0KIAotLy8gTmV3IERlZmluZSBmb3IgbmV3IFR4IFBhdGguCisvKiBOZXcgRGVmaW5lIGZvciBuZXcgVHggUGF0aC4gKi8KICNkZWZpbmUgRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQoX3BCdWZWQSwgX3BFeHRyYUxsY1NuYXBFbmNhcCkJXAogewkJCQkJCQkJCQkJCQkJCQlcCiAJaWYgKCgoKihfcEJ1ZlZBKSA8PCA4KSArICooX3BCdWZWQSArIDEpKSA+IDE1MDApCQkJXApAQCAtODQ1LDcgKzM4Miw2IEBACiAJfQkJCQkJCQkJCQkJCQkJCVwKIH0KIAotCiAjZGVmaW5lIE1BS0VfODAyXzNfSEVBREVSKF9wLCBfcE1hYzEsIF9wTWFjMiwgX3BUeXBlKSAgICAgICAgICAgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgTmRpc01vdmVNZW1vcnkoX3AsIF9wTWFjMSwgTUFDX0FERFJfTEVOKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC04NTMsMTMgKzM4OSwxMyBAQAogICAgIE5kaXNNb3ZlTWVtb3J5KChfcCArIE1BQ19BRERSX0xFTiAqIDIpLCBfcFR5cGUsIExFTkdUSF84MDJfM19UWVBFKTsgXAogfQogCi0vLyBpZiBwRGF0YSBoYXMgbm8gTExDL1NOQVAgKG5laXRoZXIgUkZDMTA0MiBub3IgQnJpZGdlIHR1bm5lbCksIGtlZXAgaXQgdGhhdCB3YXkuCi0vLyBlbHNlIGlmIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBMTEMvU05BUC1lbmNhcGVkIElQWCBvciBBUFBMRVRBTEssIHByZXNlcnZlIHRoZSBMTEMvU05BUCBmaWVsZAotLy8gZWxzZSByZW1vdmUgdGhlIExMQy9TTkFQIGZpZWxkIGZyb20gdGhlIHJlc3VsdCBFdGhlcm5ldCBmcmFtZQotLy8gUGF0Y2ggZm9yIFdIUUwgb25seSwgd2hpY2ggZGlkIG5vdCB0dXJuIG9uIE5ldGJpb3MgYnV0IHVzZSBJUFggd2l0aGluIGl0cyBwYXlsb2FkCi0vLyBOb3RlOgotLy8gICAgIF9wRGF0YSAmIF9EYXRhU2l6ZSBtYXkgYmUgYWx0ZXJlZCAocmVtb3ZlIDgtYnl0ZSBMTEMvU05BUCkgYnkgdGhpcyBNQUNSTwotLy8gICAgIF9wUmVtb3ZlZExMQ1NOQVA6IHBvaW50ZXIgdG8gcmVtb3ZlZCBMTEMvU05BUDsgTlVMTCBpcyBub3QgcmVtb3ZlZAorLyogaWYgcERhdGEgaGFzIG5vIExMQy9TTkFQIChuZWl0aGVyIFJGQzEwNDIgbm9yIEJyaWRnZSB0dW5uZWwpLCBrZWVwIGl0IHRoYXQgd2F5LiAqLworLyogZWxzZSBpZiB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgTExDL1NOQVAtZW5jYXBlZCBJUFggb3IgQVBQTEVUQUxLLCBwcmVzZXJ2ZSB0aGUgTExDL1NOQVAgZmllbGQgKi8KKy8qIGVsc2UgcmVtb3ZlIHRoZSBMTEMvU05BUCBmaWVsZCBmcm9tIHRoZSByZXN1bHQgRXRoZXJuZXQgZnJhbWUgKi8KKy8qIFBhdGNoIGZvciBXSFFMIG9ubHksIHdoaWNoIGRpZCBub3QgdHVybiBvbiBOZXRiaW9zIGJ1dCB1c2UgSVBYIHdpdGhpbiBpdHMgcGF5bG9hZCAqLworLyogTm90ZTogKi8KKy8qICAgICBfcERhdGEgJiBfRGF0YVNpemUgbWF5IGJlIGFsdGVyZWQgKHJlbW92ZSA4LWJ5dGUgTExDL1NOQVApIGJ5IHRoaXMgTUFDUk8gKi8KKy8qICAgICBfcFJlbW92ZWRMTENTTkFQOiBwb2ludGVyIHRvIHJlbW92ZWQgTExDL1NOQVA7IE5VTEwgaXMgbm90IHJlbW92ZWQgKi8KICNkZWZpbmUgQ09OVkVSVF9UT184MDJfMyhfcDgwMjNoZHIsIF9wREEsIF9wU0EsIF9wRGF0YSwgX0RhdGFTaXplLCBfcFJlbW92ZWRMTENTTkFQKSAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBjaGFyIExMQ19MZW5bMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTg2OCwxMyArNDA0LDEzIEBACiAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShTTkFQXzgwMl8xSCwgX3BEYXRhLCA2KSAgfHwgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE5kaXNFcXVhbE1lbW9yeShTTkFQX0JSSURHRV9UVU5ORUwsIF9wRGF0YSwgNikpICAgICAgICAgICAgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFBVQ0hBUiBwUHJvdG8gPSBfcERhdGEgKyA2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHU4ICpwUHJvdG8gPSBfcERhdGEgKyA2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGlmICgoTmRpc0VxdWFsTWVtb3J5KElQWCwgcFByb3RvLCAyKSB8fCBOZGlzRXF1YWxNZW1vcnkoQVBQTEVfVEFMSywgcFByb3RvLCAyKSkgJiYgIFwKICAgICAgICAgICAgIE5kaXNFcXVhbE1lbW9yeShTTkFQXzgwMl8xSCwgX3BEYXRhLCA2KSkgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIExMQ19MZW5bMF0gPSAoVUNIQVIpKF9EYXRhU2l6ZSAvIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIExMQ19MZW5bMV0gPSAoVUNIQVIpKF9EYXRhU2l6ZSAlIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIExMQ19MZW5bMF0gPSAodTgpKF9EYXRhU2l6ZSAvIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIExMQ19MZW5bMV0gPSAodTgpKF9EYXRhU2l6ZSAlIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIE1BS0VfODAyXzNfSEVBREVSKF9wODAyM2hkciwgX3BEQSwgX3BTQSwgTExDX0xlbik7ICAgICAgICAgIFwKICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTg4Nyw1NTEgKzQyMyw0MzcgQEAKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgTExDX0xlblswXSA9IChVQ0hBUikoX0RhdGFTaXplIC8gMjU2KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgTExDX0xlblsxXSA9IChVQ0hBUikoX0RhdGFTaXplICUgMjU2KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTExDX0xlblswXSA9ICh1OCkoX0RhdGFTaXplIC8gMjU2KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTExDX0xlblsxXSA9ICh1OCkoX0RhdGFTaXplICUgMjU2KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTUFLRV84MDJfM19IRUFERVIoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBMTENfTGVuKTsgICAgICAgICAgICAgIFwKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAotI2RlZmluZSBTV0lUQ0hfQUIoIF9wQUEsIF9wQkIpICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgUFZPSUQgcENDOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcENDID0gX3BCQjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9wQkIgPSBfcEFBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX3BBQSA9IHBDQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0vLyBFbnF1ZXVlIHRoaXMgZnJhbWUgdG8gTUxNRSBlbmdpbmUKLS8vIFdlIG5lZWQgdG8gZW5xdWV1ZSB0aGUgd2hvbGUgZnJhbWUgYmVjYXVzZSBNTE1FIG5lZWQgdG8gcGFzcyBkYXRhIHR5cGUKLS8vIGluZm9ybWF0aW9uIGZyb20gODAyLjExIGhlYWRlcgotI2lmZGVmIFJUMjg2MAorLyogRW5xdWV1ZSB0aGlzIGZyYW1lIHRvIE1MTUUgZW5naW5lICovCisvKiBXZSBuZWVkIHRvIGVucXVldWUgdGhlIHdob2xlIGZyYW1lIGJlY2F1c2UgTUxNRSBuZWVkIHRvIHBhc3MgZGF0YSB0eXBlICovCisvKiBpbmZvcm1hdGlvbiBmcm9tIDgwMi4xMSBoZWFkZXIgKi8KKyNpZmRlZiBSVE1QX01BQ19QQ0kKICNkZWZpbmUgUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShfcEFkLCBXY2lkLCBfcEZyYW1lLCBfRnJhbWVTaXplLCBfUnNzaTAsIF9Sc3NpMSwgX1Jzc2kyLCBfUGxjcFNpZ25hbCkgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVUlOVDMyIEhpZ2gzMlRTRiwgTG93MzJUU0Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1MzIgSGlnaDMyVFNGLCBMb3czMlRTRjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIFJUTVBfSU9fUkVBRDMyKF9wQWQsIFRTRl9USU1FUl9EVzEsICZIaWdoMzJUU0YpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBSVE1QX0lPX1JFQUQzMihfcEFkLCBUU0ZfVElNRVJfRFcwLCAmTG93MzJUU0YpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWxtZUVucXVldWVGb3JSZWN2KF9wQWQsIFdjaWQsIEhpZ2gzMlRTRiwgTG93MzJUU0YsIChVQ0hBUilfUnNzaTAsIChVQ0hBUilfUnNzaTEsKFVDSEFSKV9Sc3NpMixfRnJhbWVTaXplLCBfcEZyYW1lLCAoVUNIQVIpX1BsY3BTaWduYWwpOyAgIFwKKyAgICBNbG1lRW5xdWV1ZUZvclJlY3YoX3BBZCwgV2NpZCwgSGlnaDMyVFNGLCBMb3czMlRTRiwgKHU4KV9Sc3NpMCwgKHU4KV9Sc3NpMSwodTgpX1Jzc2kyLF9GcmFtZVNpemUsIF9wRnJhbWUsICh1OClfUGxjcFNpZ25hbCk7ICAgXAogfQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCiAjZGVmaW5lIFJFUE9SVF9NR01UX0ZSQU1FX1RPX01MTUUoX3BBZCwgV2NpZCwgX3BGcmFtZSwgX0ZyYW1lU2l6ZSwgX1Jzc2kwLCBfUnNzaTEsIF9Sc3NpMiwgX1BsY3BTaWduYWwpICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVJTlQzMiBIaWdoMzJUU0Y9MCwgTG93MzJUU0Y9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1sbWVFbnF1ZXVlRm9yUmVjdihfcEFkLCBXY2lkLCBIaWdoMzJUU0YsIExvdzMyVFNGLCAoVUNIQVIpX1Jzc2kwLCAoVUNIQVIpX1Jzc2kxLChVQ0hBUilfUnNzaTIsX0ZyYW1lU2l6ZSwgX3BGcmFtZSwgKFVDSEFSKV9QbGNwU2lnbmFsKTsgICBcCisgICAgdTMyIEhpZ2gzMlRTRj0wLCBMb3czMlRTRj0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTWxtZUVucXVldWVGb3JSZWN2KF9wQWQsIFdjaWQsIEhpZ2gzMlRTRiwgTG93MzJUU0YsICh1OClfUnNzaTAsICh1OClfUnNzaTEsKHU4KV9Sc3NpMixfRnJhbWVTaXplLCBfcEZyYW1lLCAodTgpX1BsY3BTaWduYWwpOyAgIFwKIH0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotLy9OZWVkIHRvIGNvbGxlY3QgZWFjaCBhbnQncyByc3NpIGNvbmN1cnJlbnRseQotLy9yc3NpMSBpcyByZXBvcnQgdG8gcGFpcjIgQW50IGFuZCByc3MyIGlzIHJlcHJvdCB0byBwYWlyMSBBbnQgd2hlbiA0IEFudAotI2RlZmluZSBDT0xMRUNUX1JYX0FOVEVOTkFfQVZFUkFHRV9SU1NJKF9wQWQsIF9yc3NpMSwgX3Jzc2kyKQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCVNIT1JUCUF2Z1Jzc2k7CQkJCQkJCQkJCQkJCQkJXAotCVVDSEFSCVVzZWRBbnQ7CQkJCQkJCQkJCQkJCQkJXAotCWlmIChfcEFkLT5SeEFudC5FdmFsdWF0ZVBlcmlvZCA9PSAwKQkJCQkJCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJCQkJXAotCQlVc2VkQW50ID0gX3BBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQ7CQkJCQkJCVwKLQkJQXZnUnNzaSA9IF9wQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtVc2VkQW50XTsJCQkJCQlcCi0JCWlmIChBdmdSc3NpIDwgMCkJCQkJCQkJCQkJCQkJXAotCQkJQXZnUnNzaSA9IEF2Z1Jzc2kgLSAoQXZnUnNzaSA+PiAzKSArIF9yc3NpMTsJCQkJCVwKLQkJZWxzZQkJCQkJCQkJCQkJCQkJCQlcCi0JCQlBdmdSc3NpID0gX3Jzc2kxIDw8IDM7CQkJCQkJCQkJCQlcCi0JCV9wQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtVc2VkQW50XSA9IEF2Z1Jzc2k7CQkJCQkJXAotCX0JCQkJCQkJCQkJCQkJCQkJCQlcCi0JZWxzZQkJCQkJCQkJCQkJCQkJCQkJXAotCXsJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCVVzZWRBbnQgPSBfcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50OwkJCQkJCQlcCi0JCUF2Z1Jzc2kgPSBfcEFkLT5SeEFudC5QYWlyMUF2Z1Jzc2lbVXNlZEFudF07CQkJCQkJXAotCQlpZiAoKEF2Z1Jzc2kgPCAwKSAmJiAoX3BBZC0+UnhBbnQuRmlyc3RQa3RBcnJpdmVkV2hlbkV2YWx1YXRlKSkJCVwKLQkJCUF2Z1Jzc2kgPSBBdmdSc3NpIC0gKEF2Z1Jzc2kgPj4gMykgKyBfcnNzaTE7CQkJCQlcCi0JCWVsc2UJCQkJCQkJCQkJCQkJCQkJXAotCQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JCQlfcEFkLT5SeEFudC5GaXJzdFBrdEFycml2ZWRXaGVuRXZhbHVhdGUgPSBUUlVFOwkJCQkJXAotCQkJQXZnUnNzaSA9IF9yc3NpMSA8PCAzOwkJCQkJCQkJCQkJXAotCQl9CQkJCQkJCQkJCQkJCQkJCQlcCi0JCV9wQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtVc2VkQW50XSA9IEF2Z1Jzc2k7CQkJCQkJXAotCQlfcEFkLT5SeEFudC5SY3ZQa3ROdW1XaGVuRXZhbHVhdGUrKzsJCQkJCQkJCVwKLQl9CQkJCQkJCQkJCQkJCQkJCQkJXAotfQotCi0jZGVmaW5lIE5ESVNfUVVFUllfQlVGRkVSKF9OZGlzQnVmLCBfcHBWQSwgX3BCdWZMZW4pICAgICAgICAgICAgICAgICAgICBcCi0gICAgTmRpc1F1ZXJ5QnVmZmVyKF9OZGlzQnVmLCBfcHBWQSwgX3BCdWZMZW4pCi0KLSNkZWZpbmUgTUFDX0FERFJfRVFVQUwocEFkZHIxLHBBZGRyMikgICAgICAgICAgIFJUTVBFcXVhbE1lbW9yeSgoUFZPSUQpKHBBZGRyMSksIChQVk9JRCkocEFkZHIyKSwgTUFDX0FERFJfTEVOKQorI2RlZmluZSBNQUNfQUREUl9FUVVBTChwQWRkcjEscEFkZHIyKSAgICAgICAgICAgUlRNUEVxdWFsTWVtb3J5KCh2b2lkICopKHBBZGRyMSksICh2b2lkICopKHBBZGRyMiksIE1BQ19BRERSX0xFTikKICNkZWZpbmUgU1NJRF9FUVVBTChzc2lkMSwgbGVuMSwgc3NpZDIsIGxlbjIpICAgICgobGVuMT09bGVuMikgJiYgKFJUTVBFcXVhbE1lbW9yeShzc2lkMSwgc3NpZDIsIGxlbjEpKSkKIAotLy8KLS8vIENoZWNrIGlmIGl0IGlzIEphcGFuIFc1MyhjaDUyLDU2LDYwLDY0KSBjaGFubmVsLgotLy8KKy8qICovCisvKiBDaGVjayBpZiBpdCBpcyBKYXBhbiBXNTMoY2g1Miw1Niw2MCw2NCkgY2hhbm5lbC4gKi8KKy8qICovCiAjZGVmaW5lIEphcGFuQ2hhbm5lbENoZWNrKGNoYW5uZWwpICAoKGNoYW5uZWwgPT0gNTIpIHx8IChjaGFubmVsID09IDU2KSB8fCAoY2hhbm5lbCA9PSA2MCkgfHwgKGNoYW5uZWwgPT0gNjQpKQogCi0jaWZkZWYgUlQyODYwCisjZGVmaW5lIFNUQV9FWFRSQV9TRVRUSU5HKF9wQWQpCisKICNkZWZpbmUgU1RBX1BPUlRfU0VDVVJFRChfcEFkKSBcCiB7IFwKLQlfcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsgXAotCVJUTVBfU0VUX1BTRkxBRyhfcEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOyBcCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmKF9wQWQpLT5NYWNUYWJMb2NrKTsgXAotCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBvcnRTZWN1cmVkID0gX3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkOyBcCisJQk9PTEVBTglDYW5jZWxsZWQ7IFwKKwkoX3BBZCktPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOyBcCisJTmRpc0FjcXVpcmVTcGluTG9jaygmKChfcEFkKS0+TWFjVGFiTG9jaykpOyBcCisJKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Qb3J0U2VjdXJlZCA9IChfcEFkKS0+U3RhQ2ZnLlBvcnRTZWN1cmVkOyBcCisJKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7XAogCU5kaXNSZWxlYXNlU3BpbkxvY2soJihfcEFkKS0+TWFjVGFiTG9jayk7IFwKKwlSVE1QQ2FuY2VsVGltZXIoJigoX3BBZCktPk1sbWUuTGlua0Rvd25UaW1lciksICZDYW5jZWxsZWQpO1wKKwlTVEFfRVhUUkFfU0VUVElORyhfcEFkKTsgXAogfQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0jZGVmaW5lIFNUQV9QT1JUX1NFQ1VSRUQoX3BBZCkgXAoteyBcCi0JX3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7IFwKLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZfcEFkLT5NYWNUYWJMb2NrKTsgXAotCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBvcnRTZWN1cmVkID0gX3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkOyBcCi0JTmRpc1JlbGVhc2VTcGluTG9jaygmX3BBZC0+TWFjVGFiTG9jayk7IFwKLX0KLSNlbmRpZgogCi0vLwotLy8gUmVnaXN0ZXIgc2V0IHBhaXIgZm9yIGluaXRpYWx6YXRpb24gcmVnaXN0ZXIgc2V0IGRlZmluaXRpb24KLS8vCi10eXBlZGVmIHN0cnVjdCAgX1JUTVBfUkVHX1BBSVIKLXsKLQlVTE9ORyAgIFJlZ2lzdGVyOwotCVVMT05HICAgVmFsdWU7Ci19IFJUTVBfUkVHX1BBSVIsICpQUlRNUF9SRUdfUEFJUjsKKy8qICovCisvKiAgRGF0YSBidWZmZXIgZm9yIERNQSBvcGVyYXRpb24sIHRoZSBidWZmZXIgbXVzdCBiZSBjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeSAqLworLyogIEJvdGggRE1BIHRvIC8gZnJvbSBDUFUgdXNlIHRoZSBzYW1lIHN0cnVjdHVyZS4gKi8KKy8qICovCitzdHJ1Y3QgcnRfcnRtcF9kbWFidWYgeworCXVuc2lnbmVkIGxvbmcgQWxsb2NTaXplOworCXZvaWQgKkFsbG9jVmE7CQkvKiBUeEJ1ZiB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlkbWFfYWRkcl90IEFsbG9jUGE7CS8qIFR4QnVmIHBoeXNpY2FsIGFkZHJlc3MgKi8KK307CiAKLXR5cGVkZWYgc3RydWN0ICBfUkVHX1BBSVIKLXsKLQlVQ0hBUiAgIFJlZ2lzdGVyOwotCVVDSEFSICAgVmFsdWU7Ci19IFJFR19QQUlSLCAqUFJFR19QQUlSOworLyogKi8KKy8qIENvbnRyb2wgYmxvY2sgKERlc2NyaXB0b3IpIGZvciBhbGwgcmluZyBkZXNjcmlwdG9yIERNQSBvcGVyYXRpb24sIGJ1ZmZlciBtdXN0IGJlICovCisvKiBjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeS4gY2hhciBzdG9yZWQgdGhlIGJpbmRpbmcgUnggcGFja2V0IGRlc2NyaXB0b3IgKi8KKy8qIHdoaWNoIHdvbid0IGJlIHJlbGVhc2VkLCBkcml2ZXIgaGFzIHRvIHdhaXQgdW50aWwgdXBwZXIgbGF5ZXIgcmV0dXJuIHRoZSBwYWNrZXQgKi8KKy8qIGJlZm9yZSBnaXZlaW5nIHVwIHRoaXMgcnggcmluZyBkZXNjcmlwdG9yIHRvIEFTSUMuIE5ESVNfQlVGRkVSIGlzIGFzc29jYWl0ZWQgcGFpciAqLworLyogdG8gZGVzY3JpYmUgdGhlIHBhY2tldCBidWZmZXIuIEZvciBUeCwgY2hhciBzdG9yZWQgdGhlIHR4IHBhY2tldCBkZXNjcmlwdG9yICovCisvKiB3aGljaCBkcml2ZXIgc2hvdWxkIEFDSyB1cHBlciBsYXllciB3aGVuIHRoZSB0eCBpcyBwaHlzaWNhbGx5IGRvbmUgb3IgZmFpbGVkLiAqLworLyogKi8KK3N0cnVjdCBydF9ydG1wX2RtYWNiIHsKKwl1bnNpZ25lZCBsb25nIEFsbG9jU2l6ZTsJLyogQ29udHJvbCBibG9jayBzaXplICovCisJdm9pZCAqQWxsb2NWYTsJCS8qIENvbnRyb2wgYmxvY2sgdmlydHVhbCBhZGRyZXNzICovCisJZG1hX2FkZHJfdCBBbGxvY1BhOwkvKiBDb250cm9sIGJsb2NrIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwl2b2lkICpwTmRpc1BhY2tldDsKKwl2b2lkICpwTmV4dE5kaXNQYWNrZXQ7CiAKLS8vCi0vLyBSZWdpc3RlciBzZXQgcGFpciBmb3IgaW5pdGlhbHphdGlvbiByZWdpc3RlciBzZXQgZGVmaW5pdGlvbgotLy8KLXR5cGVkZWYgc3RydWN0ICBfUlRNUF9SRl9SRUdTCi17Ci0JVUNIQVIgICBDaGFubmVsOwotCVVMT05HICAgUjE7Ci0JVUxPTkcgICBSMjsKLQlVTE9ORyAgIFIzOwotCVVMT05HICAgUjQ7Ci19IFJUTVBfUkZfUkVHUywgKlBSVE1QX1JGX1JFR1M7CisJc3RydWN0IHJ0X3J0bXBfZG1hYnVmIERtYUJ1ZjsJLyogQXNzb2NpYXRlZCBETUEgYnVmZmVyIHN0cnVjdHVyZSAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX0ZSRVFVRU5DWV9JVEVNIHsKLQlVQ0hBUglDaGFubmVsOwotCVVDSEFSCU47Ci0JVUNIQVIJUjsKLQlVQ0hBUglLOwotfSBGUkVRVUVOQ1lfSVRFTSwgKlBGUkVRVUVOQ1lfSVRFTTsKK3N0cnVjdCBydF9ydG1wX3R4X3JpbmcgeworCXN0cnVjdCBydF9ydG1wX2RtYWNiIENlbGxbVFhfUklOR19TSVpFXTsKKwl1MzIgVHhDcHVJZHg7CisJdTMyIFR4RG1hSWR4OworCXUzMiBUeFN3RnJlZUlkeDsJLyogc29mdHdhcmUgbmV4dCBmcmVlIHR4IGluZGV4ICovCit9OwogCi0vLwotLy8gIERhdGEgYnVmZmVyIGZvciBETUEgb3BlcmF0aW9uLCB0aGUgYnVmZmVyIG11c3QgYmUgY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkKLS8vICBCb3RoIERNQSB0byAvIGZyb20gQ1BVIHVzZSB0aGUgc2FtZSBzdHJ1Y3R1cmUuCi0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX0RNQUJVRgotewotCVVMT05HICAgICAgICAgICAgICAgICAgIEFsbG9jU2l6ZTsKLQlQVk9JRCAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAgICAgICAgIC8vIFR4QnVmIHZpcnR1YWwgYWRkcmVzcwotCU5ESVNfUEhZU0lDQUxfQUREUkVTUyAgIEFsbG9jUGE7ICAgICAgICAgICAgLy8gVHhCdWYgcGh5c2ljYWwgYWRkcmVzcwotfSBSVE1QX0RNQUJVRiwgKlBSVE1QX0RNQUJVRjsKK3N0cnVjdCBydF9ydG1wX3J4X3JpbmcgeworCXN0cnVjdCBydF9ydG1wX2RtYWNiIENlbGxbUlhfUklOR19TSVpFXTsKKwl1MzIgUnhDcHVJZHg7CisJdTMyIFJ4RG1hSWR4OworCWludCBSeFN3UmVhZElkeDsJLyogc29mdHdhcmUgbmV4dCByZWFkIGluZGV4ICovCit9OwogCitzdHJ1Y3QgcnRfcnRtcF9tZ210X3JpbmcgeworCXN0cnVjdCBydF9ydG1wX2RtYWNiIENlbGxbTUdNVF9SSU5HX1NJWkVdOworCXUzMiBUeENwdUlkeDsKKwl1MzIgVHhEbWFJZHg7CisJdTMyIFR4U3dGcmVlSWR4OwkvKiBzb2Z0d2FyZSBuZXh0IGZyZWUgdHggaW5kZXggKi8KK307CiAKLXR5cGVkZWYJdW5pb24JX0hFQURFUl84MDJfMTFfU0VRewotICAgIHN0cnVjdCB7Ci0JVVNIT1JUCQkJRnJhZzo0OwotCVVTSE9SVAkJCVNlcXVlbmNlOjEyOwotICAgIH0gICBmaWVsZDsKLSAgICBVU0hPUlQgICAgICAgICAgIHZhbHVlOwotfQlIRUFERVJfODAyXzExX1NFUSwgKlBIRUFERVJfODAyXzExX1NFUTsKKy8qICovCisvKiAgU3RhdGlzdGljIGNvdW50ZXIgc3RydWN0dXJlICovCisvKiAqLworc3RydWN0IHJ0X2NvdW50ZXJfODAyXzMgeworCS8qIEdlbmVyYWwgU3RhdHMgKi8KKwl1bnNpZ25lZCBsb25nIEdvb2RUcmFuc21pdHM7CisJdW5zaWduZWQgbG9uZyBHb29kUmVjZWl2ZXM7CisJdW5zaWduZWQgbG9uZyBUeEVycm9yczsKKwl1bnNpZ25lZCBsb25nIFJ4RXJyb3JzOworCXVuc2lnbmVkIGxvbmcgUnhOb0J1ZmZlcjsKIAotLy8KLS8vICBEYXRhIGJ1ZmZlciBmb3IgRE1BIG9wZXJhdGlvbiwgdGhlIGJ1ZmZlciBtdXN0IGJlIGNvbnRpZ3VvdXMgcGh5c2ljYWwgbWVtb3J5Ci0vLyAgQm90aCBETUEgdG8gLyBmcm9tIENQVSB1c2UgdGhlIHNhbWUgc3RydWN0dXJlLgotLy8KLXR5cGVkZWYgc3RydWN0ICBfUlRNUF9SRU9SREVSQlVGCi17Ci0JQk9PTEVBTgkJCUlzRnVsbDsKLQlQVk9JRCAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAgICAgICAgIC8vIFR4QnVmIHZpcnR1YWwgYWRkcmVzcwotCVVDSEFSCQkJSGVhZGVyODAyXzNbMTRdOwotCUhFQURFUl84MDJfMTFfU0VRCQkJU2VxdWVuY2U7CS8vc3VwcG9ydCBjb21wcmVzc2VkIGJpdG1hcCBCQSwgc28gbm8gY29uc2lkZXIgZnJhZ21lbnQgaW4gQkEKLQlVQ0hBUiAJCURhdGFPZmZzZXQ7Ci0JVVNIT1JUIAkJRGF0YXNpemU7Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgQWxsb2NTaXplOwotI2lmZGVmIFJUMjg2MAotCU5ESVNfUEhZU0lDQUxfQUREUkVTUyAgIEFsbG9jUGE7ICAgICAgICAgICAgLy8gVHhCdWYgcGh5c2ljYWwgYWRkcmVzcwotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JUFVDSEFSCQkJCQlBbGxvY1BhOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotfSAgIFJUTVBfUkVPUkRFUkJVRiwgKlBSVE1QX1JFT1JERVJCVUY7CisJLyogRXRoZXJuZXQgU3RhdHMgKi8KKwl1bnNpZ25lZCBsb25nIFJjdkFsaWdubWVudEVycm9yczsKKwl1bnNpZ25lZCBsb25nIE9uZUNvbGxpc2lvbjsKKwl1bnNpZ25lZCBsb25nIE1vcmVDb2xsaXNpb25zOwogCi0vLwotLy8gQ29udHJvbCBibG9jayAoRGVzY3JpcHRvcikgZm9yIGFsbCByaW5nIGRlc2NyaXB0b3IgRE1BIG9wZXJhdGlvbiwgYnVmZmVyIG11c3QgYmUKLS8vIGNvbnRpZ3VvdXMgcGh5c2ljYWwgbWVtb3J5LiBORElTX1BBQ0tFVCBzdG9yZWQgdGhlIGJpbmRpbmcgUnggcGFja2V0IGRlc2NyaXB0b3IKLS8vIHdoaWNoIHdvbid0IGJlIHJlbGVhc2VkLCBkcml2ZXIgaGFzIHRvIHdhaXQgdW50aWwgdXBwZXIgbGF5ZXIgcmV0dXJuIHRoZSBwYWNrZXQKLS8vIGJlZm9yZSBnaXZlaW5nIHVwIHRoaXMgcnggcmluZyBkZXNjcmlwdG9yIHRvIEFTSUMuIE5ESVNfQlVGRkVSIGlzIGFzc29jYWl0ZWQgcGFpcgotLy8gdG8gZGVzY3JpYmUgdGhlIHBhY2tldCBidWZmZXIuIEZvciBUeCwgTkRJU19QQUNLRVQgc3RvcmVkIHRoZSB0eCBwYWNrZXQgZGVzY3JpcHRvcgotLy8gd2hpY2ggZHJpdmVyIHNob3VsZCBBQ0sgdXBwZXIgbGF5ZXIgd2hlbiB0aGUgdHggaXMgcGh5c2ljYWxseSBkb25lIG9yIGZhaWxlZC4KLS8vCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9ETUFDQgotewotCVVMT05HICAgICAgICAgICAgICAgICAgIEFsbG9jU2l6ZTsgICAgICAgICAgLy8gQ29udHJvbCBibG9jayBzaXplCi0JUFZPSUQgICAgICAgICAgICAgICAgICAgQWxsb2NWYTsgICAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHZpcnR1YWwgYWRkcmVzcwotCU5ESVNfUEhZU0lDQUxfQUREUkVTUyAgIEFsbG9jUGE7ICAgICAgICAgICAgLy8gQ29udHJvbCBibG9jayBwaHlzaWNhbCBhZGRyZXNzCi0JUE5ESVNfUEFDS0VUIHBOZGlzUGFja2V0OwotCVBORElTX1BBQ0tFVCBwTmV4dE5kaXNQYWNrZXQ7Cit9OwogCi0JUlRNUF9ETUFCVUYgICAgICAgICAgICAgRG1hQnVmOyAgICAgICAgICAgICAvLyBBc3NvY2lhdGVkIERNQSBidWZmZXIgc3RydWN0dXJlCi19IFJUTVBfRE1BQ0IsICpQUlRNUF9ETUFDQjsKK3N0cnVjdCBydF9jb3VudGVyXzgwMl8xMSB7CisJdW5zaWduZWQgbG9uZyBMZW5ndGg7CisJTEFSR0VfSU5URUdFUiBMYXN0VHJhbnNtaXR0ZWRGcmFnbWVudENvdW50OworCUxBUkdFX0lOVEVHRVIgVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50OworCUxBUkdFX0lOVEVHRVIgTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50OworCUxBUkdFX0lOVEVHRVIgRmFpbGVkQ291bnQ7CisJTEFSR0VfSU5URUdFUiBSZXRyeUNvdW50OworCUxBUkdFX0lOVEVHRVIgTXVsdGlwbGVSZXRyeUNvdW50OworCUxBUkdFX0lOVEVHRVIgUlRTU3VjY2Vzc0NvdW50OworCUxBUkdFX0lOVEVHRVIgUlRTRmFpbHVyZUNvdW50OworCUxBUkdFX0lOVEVHRVIgQUNLRmFpbHVyZUNvdW50OworCUxBUkdFX0lOVEVHRVIgRnJhbWVEdXBsaWNhdGVDb3VudDsKKwlMQVJHRV9JTlRFR0VSIFJlY2VpdmVkRnJhZ21lbnRDb3VudDsKKwlMQVJHRV9JTlRFR0VSIE11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudDsKKwlMQVJHRV9JTlRFR0VSIEZDU0Vycm9yQ291bnQ7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9UWF9CVUYKLXsKLQlQUVVFVUVfRU5UUlkgICAgTmV4dDsKLQlVQ0hBUiAgICAgICAgICAgSW5kZXg7Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgQWxsb2NTaXplOyAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHNpemUKLQlQVk9JRCAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgdmlydHVhbCBhZGRyZXNzCi0JTkRJU19QSFlTSUNBTF9BRERSRVNTICAgQWxsb2NQYTsgICAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHBoeXNpY2FsIGFkZHJlc3MKLX0gUlRNUF9UWEJVRiwgKlBSVE1QX1RYQlVGOworc3RydWN0IHJ0X2NvdW50ZXJfcmFsaW5rIHsKKwl1bnNpZ25lZCBsb25nIFRyYW5zbWl0dGVkQnl0ZUNvdW50OwkvKiBib3RoIHN1Y2Nlc3NmdWwgYW5kIGZhaWx1cmUsIHVzZWQgdG8gY2FsY3VsYXRlIFRYIHRocm91Z2hwdXQgKi8KKwl1bnNpZ25lZCBsb25nIFJlY2VpdmVkQnl0ZUNvdW50OwkvKiBib3RoIENSQyBva2F5IGFuZCBDUkMgZXJyb3IsIHVzZWQgdG8gY2FsY3VsYXRlIFJYIHRocm91Z2hwdXQgKi8KKwl1bnNpZ25lZCBsb25nIEJlZW5EaXNhc3NvY2lhdGVkQ291bnQ7CisJdW5zaWduZWQgbG9uZyBCYWRDUUlBdXRvUmVjb3ZlcnlDb3VudDsKKwl1bnNpZ25lZCBsb25nIFBvb3JDUUlSb2FtaW5nQ291bnQ7CisJdW5zaWduZWQgbG9uZyBNZ210UmluZ0Z1bGxDb3VudDsKKwl1bnNpZ25lZCBsb25nIFJ4Q291bnRTaW5jZUxhc3ROVUxMOworCXVuc2lnbmVkIGxvbmcgUnhDb3VudDsKKwl1bnNpZ25lZCBsb25nIFJ4UmluZ0VyckNvdW50OworCXVuc2lnbmVkIGxvbmcgS2lja1R4Q291bnQ7CisJdW5zaWduZWQgbG9uZyBUeFJpbmdFcnJDb3VudDsKKwlMQVJHRV9JTlRFR0VSIFJlYWxGY3NFcnJDb3VudDsKKwl1bnNpZ25lZCBsb25nIFBlbmRpbmdOZGlzUGFja2V0Q291bnQ7CiAKLXR5cGVkZWYgc3RydWN0IF9SVE1QX1JYX0JVRgotewotCUJPT0xFQU4gICAgICAgICAgIEluVXNlOwotCVVMT05HICAgICAgICAgICAJQnlCYVJlY0luZGV4OwotCVJUTVBfUkVPUkRFUkJVRglNQVBfUlhCdWZbTUFYX1JYX1JFT1JERVJCVUZdOwotfSBSVE1QX1JYQlVGLCAqUFJUTVBfUlhCVUY7Ci10eXBlZGVmIHN0cnVjdCBfUlRNUF9UWF9SSU5HCi17Ci0JUlRNUF9ETUFDQiAgQ2VsbFtUWF9SSU5HX1NJWkVdOwotCVVJTlQzMgkJVHhDcHVJZHg7Ci0JVUlOVDMyCQlUeERtYUlkeDsKLQlVSU5UMzIJCVR4U3dGcmVlSWR4OyAJLy8gc29mdHdhcmUgbmV4dCBmcmVlIHR4IGluZGV4Ci19IFJUTVBfVFhfUklORywgKlBSVE1QX1RYX1JJTkc7CisJdW5zaWduZWQgbG9uZyBPbmVTZWNPc1R4Q291bnRbTlVNX09GX1RYX1JJTkddOworCXVuc2lnbmVkIGxvbmcgT25lU2VjRG1hRG9uZUNvdW50W05VTV9PRl9UWF9SSU5HXTsKKwl1MzIgT25lU2VjVHhEb25lQ291bnQ7CisJdW5zaWduZWQgbG9uZyBPbmVTZWNSeENvdW50OworCXUzMiBPbmVTZWNUeEFnZ3JlZ2F0aW9uQ291bnQ7CisJdTMyIE9uZVNlY1J4QWdncmVnYXRpb25Db3VudDsKKwl1MzIgT25lU2VjUmVjZWl2ZWRCeXRlQ291bnQ7CisJdTMyIE9uZVNlY0ZyYW1lRHVwbGljYXRlQ291bnQ7CiAKLXR5cGVkZWYgc3RydWN0IF9SVE1QX1JYX1JJTkcKLXsKLQlSVE1QX0RNQUNCICBDZWxsW1JYX1JJTkdfU0laRV07Ci0JVUlOVDMyCQlSeENwdUlkeDsKLQlVSU5UMzIJCVJ4RG1hSWR4OwotCUlOVDMyCQlSeFN3UmVhZElkeDsgCS8vIHNvZnR3YXJlIG5leHQgcmVhZCBpbmRleAotfSBSVE1QX1JYX1JJTkcsICpQUlRNUF9SWF9SSU5HOworCXUzMiBPbmVTZWNUcmFuc21pdHRlZEJ5dGVDb3VudDsJLyogYm90aCBzdWNjZXNzZnVsIGFuZCBmYWlsdXJlLCB1c2VkIHRvIGNhbGN1bGF0ZSBUWCB0aHJvdWdocHV0ICovCisJdTMyIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQ7CisJdTMyIE9uZVNlY1R4UmV0cnlPa0NvdW50OworCXUzMiBPbmVTZWNUeEZhaWxDb3VudDsKKwl1MzIgT25lU2VjRmFsc2VDQ0FDbnQ7CS8qIENDQSBlcnJvciBjb3VudCwgZm9yIGRlYnVnIHB1cnBvc2UsIG1pZ2h0IG1vdmUgdG8gZ2xvYmFsIGNvdW50ZXIgKi8KKwl1MzIgT25lU2VjUnhPa0NudDsJLyogUlggd2l0aG91dCBlcnJvciAqLworCXUzMiBPbmVTZWNSeE9rRGF0YUNudDsJLyogdW5pY2FzdC10by1tZSBEQVRBIGZyYW1lIGNvdW50ICovCisJdTMyIE9uZVNlY1J4RmNzRXJyQ250OwkvKiBDUkMgZXJyb3IgKi8KKwl1MzIgT25lU2VjQmVhY29uU2VudENudDsKKwl1MzIgTGFzdE9uZVNlY1RvdGFsVHhDb3VudDsJLyogT25lU2VjVHhOb1JldHJ5T2tDb3VudCArIE9uZVNlY1R4UmV0cnlPa0NvdW50ICsgT25lU2VjVHhGYWlsQ291bnQgKi8KKwl1MzIgTGFzdE9uZVNlY1J4T2tEYXRhQ250OwkvKiBPbmVTZWNSeE9rRGF0YUNudCAqLworCXVuc2lnbmVkIGxvbmcgRHVwbGljYXRlUmN2OworCXVuc2lnbmVkIGxvbmcgVHhBZ2dDb3VudDsKKwl1bnNpZ25lZCBsb25nIFR4Tm9uQWdnQ291bnQ7CisJdW5zaWduZWQgbG9uZyBUeEFnZzFNUERVQ291bnQ7CisJdW5zaWduZWQgbG9uZyBUeEFnZzJNUERVQ291bnQ7CisJdW5zaWduZWQgbG9uZyBUeEFnZzNNUERVQ291bnQ7CisJdW5zaWduZWQgbG9uZyBUeEFnZzRNUERVQ291bnQ7CisJdW5zaWduZWQgbG9uZyBUeEFnZzVNUERVQ291bnQ7CisJdW5zaWduZWQgbG9uZyBUeEFnZzZNUERVQ291bnQ7CisJdW5zaWduZWQgbG9uZyBUeEFnZzdNUERVQ291bnQ7CisJdW5zaWduZWQgbG9uZyBUeEFnZzhNUERVQ291bnQ7CisJdW5zaWduZWQgbG9uZyBUeEFnZzlNUERVQ291bnQ7CisJdW5zaWduZWQgbG9uZyBUeEFnZzEwTVBEVUNvdW50OworCXVuc2lnbmVkIGxvbmcgVHhBZ2cxMU1QRFVDb3VudDsKKwl1bnNpZ25lZCBsb25nIFR4QWdnMTJNUERVQ291bnQ7CisJdW5zaWduZWQgbG9uZyBUeEFnZzEzTVBEVUNvdW50OworCXVuc2lnbmVkIGxvbmcgVHhBZ2cxNE1QRFVDb3VudDsKKwl1bnNpZ25lZCBsb25nIFR4QWdnMTVNUERVQ291bnQ7CisJdW5zaWduZWQgbG9uZyBUeEFnZzE2TVBEVUNvdW50OwogCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9NR01UX1JJTkcKLXsKLQlSVE1QX0RNQUNCICBDZWxsW01HTVRfUklOR19TSVpFXTsKLQlVSU5UMzIJCVR4Q3B1SWR4OwotCVVJTlQzMgkJVHhEbWFJZHg7Ci0JVUlOVDMyCQlUeFN3RnJlZUlkeDsgLy8gc29mdHdhcmUgbmV4dCBmcmVlIHR4IGluZGV4Ci19IFJUTVBfTUdNVF9SSU5HLCAqUFJUTVBfTUdNVF9SSU5HOworCUxBUkdFX0lOVEVHRVIgVHJhbnNtaXR0ZWRPY3RldHNJbkFNU0RVOworCUxBUkdFX0lOVEVHRVIgVHJhbnNtaXR0ZWRBTVNEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgUmVjZWl2ZWRPY3Rlc0luQU1TRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSIFJlY2VpdmVkQU1TRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSIFRyYW5zbWl0dGVkQU1QRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSIFRyYW5zbWl0dGVkTVBEVXNJbkFNUERVQ291bnQ7CisJTEFSR0VfSU5URUdFUiBUcmFuc21pdHRlZE9jdGV0c0luQU1QRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSIE1QRFVJblJlY2VpdmVkQU1QRFVDb3VudDsKK307CiAKLS8vCi0vLyAgU3RhdGlzdGljIGNvdW50ZXIgc3RydWN0dXJlCi0vLwotdHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfODAyXzMKLXsKLQkvLyBHZW5lcmFsIFN0YXRzCi0JVUxPTkcgICAgICAgR29vZFRyYW5zbWl0czsKLQlVTE9ORyAgICAgICBHb29kUmVjZWl2ZXM7Ci0JVUxPTkcgICAgICAgVHhFcnJvcnM7Ci0JVUxPTkcgICAgICAgUnhFcnJvcnM7Ci0JVUxPTkcgICAgICAgUnhOb0J1ZmZlcjsKK3N0cnVjdCBydF9jb3VudGVyX2RycyB7CisJLyogdG8gcmVjb3JkIHRoZSBlYWNoIFRYIHJhdGUncyBxdWFsaXR5LiAwIGlzIGJlc3QsIHRoZSBiaWdnZXIgdGhlIHdvcnNlLiAqLworCXUxNiBUeFF1YWxpdHlbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOworCXU4IFBFUltNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07CisJdTggVHhSYXRlVXBQZW5hbHR5OwkvKiBleHRyYSAjIG9mIHNlY29uZCBwZW5hbHR5IGR1ZSB0byBsYXN0IHVuc3RhYmxlIGNvbmRpdGlvbiAqLworCXVuc2lnbmVkIGxvbmcgQ3VyclR4UmF0ZVN0YWJsZVRpbWU7CS8qICMgb2Ygc2Vjb25kIGluIGN1cnJlbnQgVFggcmF0ZSAqLworCUJPT0xFQU4gZk5vaXN5RW52aXJvbm1lbnQ7CisJQk9PTEVBTiBmTGFzdFNlY0FjY29yZGluZ1JTU0k7CisJdTggTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbjsJLyogMDogbm8gY2hhbmdlLCAxOnJhdGUgVVAsIDI6cmF0ZSBkb3duICovCisJdTggTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb247CS8qS2VlcCBsYXN0IHRpbWUgdmFsdWUgb2YgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiAqLworCXVuc2lnbmVkIGxvbmcgTGFzdFR4T2tDb3VudDsKK307CiAKLQkvLyBFdGhlcm5ldCBTdGF0cwotCVVMT05HICAgICAgIFJjdkFsaWdubWVudEVycm9yczsKLQlVTE9ORyAgICAgICBPbmVDb2xsaXNpb247Ci0JVUxPTkcgICAgICAgTW9yZUNvbGxpc2lvbnM7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoJc2VjdXJpdHkga2V5IHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmUKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgcnRfY2lwaGVyX2tleSB7CisJdTggS2V5WzE2XTsJCS8qIHJpZ2h0IG5vdyB3ZSBpbXBsZW1lbnQgNCBrZXlzLCAxMjggYml0cyBtYXggKi8KKwl1OCBSeE1pY1s4XTsJCS8qIG1ha2UgYWxpZ25tZW50ICovCisJdTggVHhNaWNbOF07CisJdTggVHhUc2NbNl07CQkvKiA0OGJpdCBUU0MgdmFsdWUgKi8KKwl1OCBSeFRzY1s2XTsJCS8qIDQ4Yml0IFRTQyB2YWx1ZSAqLworCXU4IENpcGhlckFsZzsJLyogMC1ub25lLCAxOldFUDY0LCAyOldFUDEyOCwgMzpUS0lQLCA0OkFFUywgNTpDS0lQNjQsIDY6Q0tJUDEyOCAqLworCXU4IEtleUxlbjsKKwl1OCBCc3NJZFs2XTsKKwkvKiBLZXkgbGVuZ3RoIGZvciBlYWNoIGtleSwgMDogZW50cnkgaXMgaW52YWxpZCAqLworCXU4IFR5cGU7CQkvKiBJbmRpY2F0ZSBQYWlyd2lzZS9Hcm91cCB3aGVuIHJlcG9ydGluZyBNSUMgZXJyb3IgKi8KK307CiAKLX0gQ09VTlRFUl84MDJfMywgKlBDT1VOVEVSXzgwMl8zOworLyogc3RydWN0dXJlIHRvIGRlZmluZSBXUEEgR3JvdXAgS2V5IFJla2V5IEludGVydmFsICovCitzdHJ1Y3QgUEFDS0VEIHJ0XzgwMl8xMV93cGFfcmVrZXkgeworCXVuc2lnbmVkIGxvbmcgUmVLZXlNZXRob2Q7CS8qIG1lY2hhbmlzbSBmb3IgcmVrZXlpbmc6IDA6ZGlzYWJsZSwgMTogdGltZS1iYXNlZCwgMjogcGFja2V0LWJhc2VkICovCisJdW5zaWduZWQgbG9uZyBSZUtleUludGVydmFsOwkvKiB0aW1lLWJhc2VkOiBzZWNvbmRzLCBwYWNrZXQtYmFzZWQ6IGtpbG8tcGFja2V0cyAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfODAyXzExIHsKLQlVTE9ORyAgICAgICAgICAgTGVuZ3RoOwotCUxBUkdFX0lOVEVHRVIgICBMYXN0VHJhbnNtaXR0ZWRGcmFnbWVudENvdW50OwotCUxBUkdFX0lOVEVHRVIgICBUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgRmFpbGVkQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIFJldHJ5Q291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIE11bHRpcGxlUmV0cnlDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgUlRTU3VjY2Vzc0NvdW50OwotCUxBUkdFX0lOVEVHRVIgICBSVFNGYWlsdXJlQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIEFDS0ZhaWx1cmVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgRnJhbWVEdXBsaWNhdGVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgUmVjZWl2ZWRGcmFnbWVudENvdW50OwotCUxBUkdFX0lOVEVHRVIgICBNdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIEZDU0Vycm9yQ291bnQ7Ci19IENPVU5URVJfODAyXzExLCAqUENPVU5URVJfODAyXzExOworI2lmZGVmIFJUTVBfTUFDX1VTQgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCVJUVVNCIEkvTyByZWxhdGVkIGRhdGEgc3RydWN0dXJlCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHJ0X3NldF9hc2ljX3djaWQgeworCXVuc2lnbmVkIGxvbmcgV0NJRDsJCS8qIG1lY2hhbmlzbSBmb3IgcmVrZXlpbmc6IDA6ZGlzYWJsZSwgMTogdGltZS1iYXNlZCwgMjogcGFja2V0LWJhc2VkICovCisJdW5zaWduZWQgbG9uZyBTZXRUaWQ7CQkvKiB0aW1lLWJhc2VkOiBzZWNvbmRzLCBwYWNrZXQtYmFzZWQ6IGtpbG8tcGFja2V0cyAqLworCXVuc2lnbmVkIGxvbmcgRGVsZXRlVGlkOwkvKiB0aW1lLWJhc2VkOiBzZWNvbmRzLCBwYWNrZXQtYmFzZWQ6IGtpbG8tcGFja2V0cyAqLworCXU4IEFkZHJbTUFDX0FERFJfTEVOXTsJLyogYXZvaWQgaW4gaW50ZXJydXB0IHdoZW4gd3JpdGUga2V5ICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBfQ09VTlRFUl9SQUxJTksgewotCVVMT05HICAgICAgICAgICBUcmFuc21pdHRlZEJ5dGVDb3VudDsgICAvLyBib3RoIHN1Y2Nlc3NmdWwgYW5kIGZhaWx1cmUsIHVzZWQgdG8gY2FsY3VsYXRlIFRYIHRocm91Z2hwdXQKLSNpZmRlZiBSVDI4NjAKLQlVTE9ORyAgICAgICAgICAgTGFzdFJlY2VpdmVkQnl0ZUNvdW50OwotI2VuZGlmCi0JVUxPTkcgICAgICAgICAgIFJlY2VpdmVkQnl0ZUNvdW50OyAgICAgIC8vIGJvdGggQ1JDIG9rYXkgYW5kIENSQyBlcnJvciwgdXNlZCB0byBjYWxjdWxhdGUgUlggdGhyb3VnaHB1dAotCVVMT05HICAgICAgICAgICBCZWVuRGlzYXNzb2NpYXRlZENvdW50OwotCVVMT05HICAgICAgICAgICBCYWRDUUlBdXRvUmVjb3ZlcnlDb3VudDsKLQlVTE9ORyAgICAgICAgICAgUG9vckNRSVJvYW1pbmdDb3VudDsKLQlVTE9ORyAgICAgICAgICAgTWdtdFJpbmdGdWxsQ291bnQ7Ci0JVUxPTkcgICAgICAgICAgIFJ4Q291bnRTaW5jZUxhc3ROVUxMOwotCVVMT05HICAgICAgICAgICBSeENvdW50OwotCVVMT05HICAgICAgICAgICBSeFJpbmdFcnJDb3VudDsKLQlVTE9ORyAgICAgICAgICAgS2lja1R4Q291bnQ7Ci0JVUxPTkcgICAgICAgICAgIFR4UmluZ0VyckNvdW50OwotCUxBUkdFX0lOVEVHRVIgICBSZWFsRmNzRXJyQ291bnQ7Ci0JVUxPTkcgICAgICAgICAgIFBlbmRpbmdOZGlzUGFja2V0Q291bnQ7CitzdHJ1Y3QgcnRfc2V0X2FzaWNfd2NpZF9hdHRyaSB7CisJdW5zaWduZWQgbG9uZyBXQ0lEOwkJLyogbWVjaGFuaXNtIGZvciByZWtleWluZzogMDpkaXNhYmxlLCAxOiB0aW1lLWJhc2VkLCAyOiBwYWNrZXQtYmFzZWQgKi8KKwl1bnNpZ25lZCBsb25nIENpcGhlcjsJCS8qIEFTSUMgQ2lwaGVyIGRlZmluaXRpb24gKi8KKwl1OCBBZGRyW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107Cit9OwogCi0JVUxPTkcgICAgICAgICAgIE9uZVNlY09zVHhDb3VudFtOVU1fT0ZfVFhfUklOR107Ci0JVUxPTkcgICAgICAgICAgIE9uZVNlY0RtYURvbmVDb3VudFtOVU1fT0ZfVFhfUklOR107Ci0JVUlOVDMyICAgICAgICAgIE9uZVNlY1R4RG9uZUNvdW50OwotCVVMT05HICAgICAgICAgICBPbmVTZWNSeENvdW50OwotCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeEFnZ3JlZ2F0aW9uQ291bnQ7Ci0JVUlOVDMyICAgICAgICAgIE9uZVNlY1J4QWdncmVnYXRpb25Db3VudDsKKy8qIGZvciBVU0IgaW50ZXJmYWNlLCBhdm9pZCBpbiBpbnRlcnJ1cHQgd2hlbiB3cml0ZSBrZXkgKi8KK3N0cnVjdCBydF9hZGRfcGFpcndpc2Vfa2V5X2VudHJ5IHsKKwl1OCBNYWNBZGRyWzZdOworCXUxNiBNYWNUYWJNYXRjaFdDSUQ7CS8qIEFTSUMgKi8KKwlzdHJ1Y3QgcnRfY2lwaGVyX2tleSBDaXBoZXJLZXk7Cit9OwogCi0JVUlOVDMyICAgCQlPbmVTZWNGcmFtZUR1cGxpY2F0ZUNvdW50OworLyogQ2lwaGVyIHN1aXRlIHR5cGUgZm9yIG1peGVkIG1vZGUgZ3JvdXAgY2lwaGVyLCBQODAyLjExaS0yMDA0ICovCit0eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9DSVBIRVJfU1VJVEVfVFlQRSB7CisJQ2lwaGVyX1R5cGVfTk9ORSwKKwlDaXBoZXJfVHlwZV9XRVA0MCwKKwlDaXBoZXJfVHlwZV9US0lQLAorCUNpcGhlcl9UeXBlX1JTVkQsCisJQ2lwaGVyX1R5cGVfQ0NNUCwKKwlDaXBoZXJfVHlwZV9XRVAxMDQKK30gUlRfODAyXzExX0NJUEhFUl9TVUlURV9UWVBFLCAqUFJUXzgwMl8xMV9DSVBIRVJfU1VJVEVfVFlQRTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotI2lmZGVmIFJUMjg3MAotCVVMT05HICAgICAgICAgICBPbmVTZWNUcmFuc21pdHRlZEJ5dGVDb3VudDsgICAvLyBib3RoIHN1Y2Nlc3NmdWwgYW5kIGZhaWx1cmUsIHVzZWQgdG8gY2FsY3VsYXRlIFRYIHRocm91Z2hwdXQKLSNlbmRpZiAvLyBSVDI4NzAgLy8KK3N0cnVjdCBydF9yb2d1ZWFwX2VudHJ5IHsKKwl1OCBBZGRyW01BQ19BRERSX0xFTl07CisJdTggRXJyb3JDb2RlWzJdOwkvKjAwIDAxLUludmFsaWQgYXV0aGVudGljYXRpb24gdHlwZSAqLworCS8qMDAgMDItQXV0aGVudGljYXRpb24gdGltZW91dCAqLworCS8qMDAgMDMtQ2hhbGxlbmdlIGZyb20gQVAgZmFpbGVkICovCisJLyowMCAwNC1DaGFsbGVuZ2UgdG8gQVAgZmFpbGVkICovCisJQk9PTEVBTiBSZXBvcnRlZDsKK307CiAKLQlVSU5UMzIgICAgICAgICAgT25lU2VjVHhOb1JldHJ5T2tDb3VudDsKLQlVSU5UMzIgICAgICAgICAgT25lU2VjVHhSZXRyeU9rQ291bnQ7Ci0JVUlOVDMyICAgICAgICAgIE9uZVNlY1R4RmFpbENvdW50OwotCVVJTlQzMiAgICAgICAgICBPbmVTZWNGYWxzZUNDQUNudDsgICAgICAvLyBDQ0EgZXJyb3IgY291bnQsIGZvciBkZWJ1ZyBwdXJwb3NlLCBtaWdodCBtb3ZlIHRvIGdsb2JhbCBjb3VudGVyCi0JVUlOVDMyICAgICAgICAgIE9uZVNlY1J4T2tDbnQ7ICAgICAgICAgIC8vIFJYIHdpdGhvdXQgZXJyb3IKLQlVSU5UMzIgICAgICAgICAgT25lU2VjUnhPa0RhdGFDbnQ7ICAgICAgLy8gdW5pY2FzdC10by1tZSBEQVRBIGZyYW1lIGNvdW50Ci0JVUlOVDMyICAgICAgICAgIE9uZVNlY1J4RmNzRXJyQ250OyAgICAgIC8vIENSQyBlcnJvcgotCVVJTlQzMiAgICAgICAgICBPbmVTZWNCZWFjb25TZW50Q250OwotCVVJTlQzMiAgICAgICAgICBMYXN0T25lU2VjVG90YWxUeENvdW50OyAvLyBPbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsgT25lU2VjVHhSZXRyeU9rQ291bnQgKyBPbmVTZWNUeEZhaWxDb3VudAotCVVJTlQzMiAgICAgICAgICBMYXN0T25lU2VjUnhPa0RhdGFDbnQ7ICAvLyBPbmVTZWNSeE9rRGF0YUNudAotCVVMT05HCQlEdXBsaWNhdGVSY3Y7Ci0JVUxPTkcJCVR4QWdnQ291bnQ7Ci0JVUxPTkcJCVR4Tm9uQWdnQ291bnQ7Ci0JVUxPTkcJCVR4QWdnMU1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cyTVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzNNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnNE1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2c1TVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzZNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnN01QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2c4TVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzlNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnMTBNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnMTFNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnMTJNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnMTNNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnMTRNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnMTVNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnMTZNUERVQ291bnQ7CitzdHJ1Y3QgcnRfcm9ndWVhcF90YWJsZSB7CisJdTggUm9ndWVBcE5yOworCXN0cnVjdCBydF9yb2d1ZWFwX2VudHJ5IFJvZ3VlQXBFbnRyeVtNQVhfTEVOX09GX0JTU19UQUJMRV07Cit9OwogCi0JTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZE9jdGV0c0luQU1TRFU7Ci0JTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZEFNU0RVQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgICAgICBSZWNlaXZlZE9jdGVzSW5BTVNEVUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICAgICAgUmVjZWl2ZWRBTVNEVUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRBTVBEVUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRNUERVc0luQU1QRFVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkT2N0ZXRzSW5BTVBEVUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICAgICAgTVBEVUluUmVjZWl2ZWRBTVBEVUNvdW50OwotfSBDT1VOVEVSX1JBTElOSywgKlBDT1VOVEVSX1JBTElOSzsKKy8qICovCisvKiBDaXNjbyBJQVBQIGZvcm1hdCAqLworLyogKi8KK3N0cnVjdCBydF9jaXNjb19pYXBwX2NvbnRlbnQgeworCXUxNiBMZW5ndGg7CQkvKklBUFAgTGVuZ3RoICovCisJdTggTWVzc2FnZVR5cGU7CS8qSUFQUCB0eXBlICovCisJdTggRnVuY3Rpb25Db2RlOwkvKklBUFAgZnVuY3Rpb24gdHlwZSAqLworCXU4IERlc3RpbmFpb25NQUNbTUFDX0FERFJfTEVOXTsKKwl1OCBTb3VyY2VNQUNbTUFDX0FERFJfTEVOXTsKKwl1MTYgVGFnOwkJLypUYWcoZWxlbWVudCBJRSkgLSBBZGphY2VudCBBUCByZXBvcnQgKi8KKwl1MTYgVGFnTGVuZ3RoOwkvKkxlbmd0aCBvZiBlbGVtZW50IG5vdCBpbmNsdWRpbmcgNCBieXRlIGhlYWRlciAqLworCXU4IE9VSVs0XTsJCS8qMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCAqLworCXU4IFByZXZpb3VzQVBbTUFDX0FERFJfTEVOXTsJLypNQUMgQWRkcmVzcyBvZiBhY2Nlc3MgcG9pbnQgKi8KKwl1MTYgQ2hhbm5lbDsKKwl1MTYgU3NpZExlbjsKKwl1OCBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJdTE2IFNlY29uZHM7CQkvKlNlY29uZHMgdGhhdCB0aGUgY2xpZW50IGhhcyBiZWVuIGRpc2Fzc29jaWF0ZWQuICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBfUElEX0NPVU5URVIgewotCVVMT05HICAgICAgICAgICBUeEFja1JlcXVpcmVkQ291bnQ7ICAgICAgLy8gQ1JDIGVycm9yCi0JVUxPTkcgICAgICAgICAgIFR4QWdncmVDb3VudDsKLQlVTE9ORyAgICAgICAgICAgVHhTdWNjZXNzQ291bnQ7IC8vIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKyBPbmVTZWNUeFJldHJ5T2tDb3VudCArIE9uZVNlY1R4RmFpbENvdW50Ci0JVUxPTkcJCUxhc3RTdWNjZXNzUmF0ZTsKLX0gUElEX0NPVU5URVIsICpQUElEX0NPVU5URVI7CisvKgorICAqCUZyYWdtZW50IEZyYW1lIHN0cnVjdHVyZQorICAqLworc3RydWN0IHJ0X2ZyYWdtZW50X2ZyYW1lIHsKKwl2b2lkICpwRnJhZ1BhY2tldDsKKwl1bnNpZ25lZCBsb25nIFJ4U2l6ZTsKKwl1MTYgU2VxdWVuY2U7CisJdTE2IExhc3RGcmFnOworCXVuc2lnbmVkIGxvbmcgRmxhZ3M7CQkvKiBTb21lIGV4dHJhIGZyYW1lIGluZm9ybWF0aW9uLiBiaXQgMDogTExDIHByZXNlbnRlZCAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfRFJTIHsKLQkvLyB0byByZWNvcmQgdGhlIGVhY2ggVFggcmF0ZSdzIHF1YWxpdHkuIDAgaXMgYmVzdCwgdGhlIGJpZ2dlciB0aGUgd29yc2UuCi0JVVNIT1JUICAgICAgICAgIFR4UXVhbGl0eVtNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07Ci0JVUNIQVIgICAgICAgICAgIFBFUltNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07Ci0JVUNIQVIgICAgICAgICAgIFR4UmF0ZVVwUGVuYWx0eTsgICAgICAvLyBleHRyYSAjIG9mIHNlY29uZCBwZW5hbHR5IGR1ZSB0byBsYXN0IHVuc3RhYmxlIGNvbmRpdGlvbgotCVVMT05HICAgICAgICAgICBDdXJyVHhSYXRlU3RhYmxlVGltZTsgLy8gIyBvZiBzZWNvbmQgaW4gY3VycmVudCBUWCByYXRlCi0JQk9PTEVBTiAgICAgICAgIGZOb2lzeUVudmlyb25tZW50OwotCUJPT0xFQU4gICAgICAgICBmTGFzdFNlY0FjY29yZGluZ1JTU0k7Ci0JVUNIQVIgICAgICAgICAgIExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247IC8vIDA6IG5vIGNoYW5nZSwgMTpyYXRlIFVQLCAyOnJhdGUgZG93bgotCVVDSEFSCQkJTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb247IC8vS2VlcCBsYXN0IHRpbWUgdmFsdWUgb2YgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbgotCVVMT05HCQkJTGFzdFR4T2tDb3VudDsKLX0gQ09VTlRFUl9EUlMsICpQQ09VTlRFUl9EUlM7CisvKiAqLworLyogUGFja2V0IGluZm9ybWF0aW9uIGZvciBOZGlzUXVlcnlQYWNrZXQgKi8KKy8qICovCitzdHJ1Y3QgcnRfcGFja2V0X2luZm8geworCXUzMiBQaHlzaWNhbEJ1ZmZlckNvdW50OwkvKiBQaHlzaWNhbCBicmVha3Mgb2YgYnVmZmVyIGRlc2NyaXBvciBjaGFpbmVkICovCisJdTMyIEJ1ZmZlckNvdW50OwkvKiBOdW1iZXIgb2YgQnVmZmVyIGRlc2NyaXB0b3IgY2hhaW5lZCAqLworCXUzMiBUb3RhbFBhY2tldExlbmd0aDsJLyogU2VsZiBleHBsYWluZWQgKi8KKwljaGFyICpwRmlyc3RCdWZmZXI7CS8qIFBvaW50ZXIgdG8gZmlyc3QgYnVmZmVyIGRlc2NyaXB0b3IgKi8KK307CiAKLS8vCi0vLyAgQXJjZm91ciBTdHJ1Y3R1cmUgQWRkZWQgYnkgUGF1bFd1Ci0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9BUkNGT1VSCi17Ci0JVUlOVCAgICAgICAgICAgIFg7Ci0JVUlOVCAgICAgICAgICAgIFk7Ci0JVUNIQVIgICAgICAgICAgIFNUQVRFWzI1Nl07Ci19IEFSQ0ZPVVJDT05URVhULCAqUEFSQ0ZPVVJDT05URVhUOworLyogKi8KKy8qICBBcmNmb3VyIFN0cnVjdHVyZSBBZGRlZCBieSBQYXVsV3UgKi8KKy8qICovCitzdHJ1Y3QgcnRfYXJjZm91cmNvbnRleHQgeworCXUzMiBYOworCXUzMiBZOworCXU4IFNUQVRFWzI1Nl07Cit9OwogCi0vLyBNSU1PIFR4IHBhcmFtZXRlciwgU2hvcnRHSSwgTUNTLCBTVEJDLCBldGMuICB0aGVzZSBhcmUgZmllbGRzIGluIFRYV0kgdG9vLiBqdXN0IGNvcHkgdG8gVFhXSS4KLXR5cGVkZWYgc3RydWN0ICBfUkVDRUlWRV9TRVRUSU5HIHsKLQlVU0hPUlQgICAJTnVtT2ZSWDoyOyAgICAgICAgICAgICAgICAgLy8gTUlNTy4gV0UgSEFWRSAzUgotCVVTSE9SVAkJTW9kZToyOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegotCVVTSE9SVAkJU2hvcnRHSToxOwotCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCi0JVVNIT1JUCQlyc3Y6MzsKLQlVU0hPUlQJCU9GRE06MTsKLQlVU0hPUlQJCU1JTU86MTsKLSB9IFJFQ0VJVkVfU0VUVElORywgKlBSRUNFSVZFX1NFVFRJTkc7CisvKiAqLworLyogVGtpcCBLZXkgc3RydWN0dXJlIHdoaWNoIFJDNCBrZXkgJiBNSUMgY2FsY3VsYXRpb24gKi8KKy8qICovCitzdHJ1Y3QgcnRfdGtpcF9rZXlfaW5mbyB7CisJdTMyIG5CeXRlc0luTTsJCS8qICMgYnl0ZXMgaW4gTSBmb3IgTUlDS0VZICovCisJdW5zaWduZWQgbG9uZyBJVjE2OworCXVuc2lnbmVkIGxvbmcgSVYzMjsKKwl1bnNpZ25lZCBsb25nIEswOwkJLyogZm9yIE1JQ0tFWSBMb3cgKi8KKwl1bnNpZ25lZCBsb25nIEsxOwkJLyogZm9yIE1JQ0tFWSBIaWcgKi8KKwl1bnNpZ25lZCBsb25nIEw7CQkvKiBDdXJyZW50IHN0YXRlIGZvciBNSUNLRVkgKi8KKwl1bnNpZ25lZCBsb25nIFI7CQkvKiBDdXJyZW50IHN0YXRlIGZvciBNSUNLRVkgKi8KKwl1bnNpZ25lZCBsb25nIE07CQkvKiBNZXNzYWdlIGFjY3VtdWxhdG9yIGZvciBNSUNLRVkgKi8KKwl1OCBSQzRLRVlbMTZdOworCXU4IE1JQ1s4XTsKK307CiAKLS8vIFNoYXJlZCBrZXkgZGF0YSBzdHJ1Y3R1cmUKLXR5cGVkZWYgc3RydWN0ICBfV0VQX0tFWSB7Ci0JVUNIQVIgICBLZXlMZW47ICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IGxlbmd0aCBmb3IgZWFjaCBrZXksIDA6IGVudHJ5IGlzIGludmFsaWQKLQlVQ0hBUiAgIEtleVtNQVhfTEVOX09GX0tFWV07ICAgICAgICAvLyByaWdodCBub3cgd2UgaW1wbGVtZW50IDQga2V5cywgMTI4IGJpdHMgbWF4Ci19IFdFUF9LRVksICpQV0VQX0tFWTsKKy8qICovCisvKiBQcml2YXRlIC8gTWlzYyBkYXRhLCBjb3VudGVycyBmb3IgZHJpdmVyIGludGVybmFsIHVzZSAqLworLyogKi8KK3N0cnVjdCBydF9wcml2YXRlIHsKKwl1MzIgU3lzdGVtUmVzZXRDbnQ7CS8qIFN5c3RlbSByZXNldCBjb3VudGVyICovCisJdTMyIFR4UmluZ0Z1bGxDbnQ7CS8qIFR4IHJpbmcgZnVsbCBvY2N1cnJhbmNlIG51bWJlciAqLworCXUzMiBQaHlSeEVyckNudDsJLyogUEhZIFJ4IGVycm9yIGNvdW50LCBmb3IgZGVidWcgcHVycG9zZSwgbWlnaHQgbW92ZSB0byBnbG9iYWwgY291bnRlciAqLworCS8qIFZhcmlhYmxlcyBmb3IgV0VQIGVuY3J5cHRpb24gLyBkZWNyeXB0aW9uIGluIHJ0bXBfd2VwLmMgKi8KKwl1MzIgRkNTQ1JDMzI7CisJc3RydWN0IHJ0X2FyY2ZvdXJjb250ZXh0IFdFUENPTlRFWFQ7CisJLyogVGtpcCBzdHVmZiAqLworCXN0cnVjdCBydF90a2lwX2tleV9pbmZvIFR4OworCXN0cnVjdCBydF90a2lwX2tleV9pbmZvIFJ4OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX0NJUEhFUl9LRVkgewotCVVDSEFSICAgS2V5WzE2XTsgICAgICAgICAgICAvLyByaWdodCBub3cgd2UgaW1wbGVtZW50IDQga2V5cywgMTI4IGJpdHMgbWF4Ci0JVUNIQVIgICBSeE1pY1s4XTsJCQkvLyBtYWtlIGFsaWdubWVudAotCVVDSEFSICAgVHhNaWNbOF07Ci0JVUNIQVIgICBUeFRzY1s2XTsgICAgICAgICAgIC8vIDQ4Yml0IFRTQyB2YWx1ZQotCVVDSEFSICAgUnhUc2NbNl07ICAgICAgICAgICAvLyA0OGJpdCBUU0MgdmFsdWUKLQlVQ0hBUiAgIENpcGhlckFsZzsgICAgICAgICAgLy8gMC1ub25lLCAxOldFUDY0LCAyOldFUDEyOCwgMzpUS0lQLCA0OkFFUywgNTpDS0lQNjQsIDY6Q0tJUDEyOAotCVVDSEFSICAgS2V5TGVuOwotCVVDSEFSICAgQnNzSWRbNl07Ci0gICAgICAgICAgICAvLyBLZXkgbGVuZ3RoIGZvciBlYWNoIGtleSwgMDogZW50cnkgaXMgaW52YWxpZAotCVVDSEFSICAgVHlwZTsgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZSBQYWlyd2lzZS9Hcm91cCB3aGVuIHJlcG9ydGluZyBNSUMgZXJyb3IKLX0gQ0lQSEVSX0tFWSwgKlBDSVBIRVJfS0VZOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCUNoYW5uZWwgYW5kIEJCUCByZWxhdGVkIGRhdGEgc3RydWN0dXJlcworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHN0cnVjdHVyZSB0byB0dW5lIEJCUCBSNjYgKEJCUCBUVU5JTkcpICovCitzdHJ1Y3QgcnRfYmJwX3I2Nl90dW5pbmcgeworCUJPT0xFQU4gYkVuYWJsZTsKKwl1MTYgRmFsc2VDY2FMb3dlclRocmVzaG9sZDsJLyogZGVmYXVsdCAxMDAgKi8KKwl1MTYgRmFsc2VDY2FVcHBlclRocmVzaG9sZDsJLyogZGVmYXVsdCA1MTIgKi8KKwl1OCBSNjZEZWx0YTsKKwl1OCBSNjZDdXJyZW50VmFsdWU7CisJQk9PTEVBTiBSNjZMb3dlclVwcGVyU2VsZWN0OwkvKkJlZm9yZSBMaW5rVXAsIFVzZWQgTG93ZXJCb3VuZCBvciBVcHBlckJvdW5kIGFzIFI2NiB2YWx1ZS4gKi8KK307CiAKLXR5cGVkZWYgc3RydWN0IF9CQlBfVFVOSU5HX1NUUlVDVCB7Ci0JQk9PTEVBTiAgICAgRW5hYmxlOwotCVVDSEFSICAgICAgIEZhbHNlQ2NhQ291bnRVcHBlckJvdW5kOyAgLy8gMTAwIHBlciBzZWMKLQlVQ0hBUiAgICAgICBGYWxzZUNjYUNvdW50TG93ZXJCb3VuZDsgIC8vIDEwIHBlciBzZWMKLQlVQ0hBUiAgICAgICBSMTdMb3dlckJvdW5kOyAgICAgICAgICAgIC8vIHNwZWNpZmllZCBpbiBFMlBST00KLQlVQ0hBUiAgICAgICBSMTdVcHBlckJvdW5kOyAgICAgICAgICAgIC8vIDB4NjggYWNjb3JkaW5nIHRvIERhdmlkIFR1bmcKLQlVQ0hBUiAgICAgICBDdXJyZW50UjE3VmFsdWU7Ci19IEJCUF9UVU5JTkcsICpQQkJQX1RVTklORzsKKy8qIHN0cnVjdHVyZSB0byBzdG9yZSBjaGFubmVsIFRYIHBvd2VyICovCitzdHJ1Y3QgcnRfY2hhbm5lbF90eF9wb3dlciB7CisJdTE2IFJlbWFpbmluZ1RpbWVGb3JVc2U7CS8qdW5pdDogc2VjICovCisJdTggQ2hhbm5lbDsKKwljaGFyIFBvd2VyOworCWNoYXIgUG93ZXIyOworCXU4IE1heFR4UHdyOworCXU4IERmc1JlcTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TT0ZUX1JYX0FOVF9ESVZFUlNJVFlfU1RSVUNUIHsKLQlVQ0hBUiAgICAgRXZhbHVhdGVQZXJpb2Q7CQkgLy8gMDpub3QgZXZhbHV0ZSBzdGF0dXMsIDE6IGV2YWx1YXRlIHN0YXR1cywgMjogc3dpdGNoaW5nIHN0YXR1cwotI2lmZGVmIFJUMjg3MAotCVVDSEFSICAgICBFdmFsdWF0ZVN0YWJsZUNudDsKLSNlbmRpZgotCVVDSEFSICAgICBQYWlyMVByaW1hcnlSeEFudDsgICAgIC8vIDA6QW50LUUxLCAxOkFudC1FMgotCVVDSEFSICAgICBQYWlyMVNlY29uZGFyeVJ4QW50OyAgIC8vIDA6QW50LUUxLCAxOkFudC1FMgotCVVDSEFSICAgICBQYWlyMlByaW1hcnlSeEFudDsgICAgIC8vIDA6QW50LUUzLCAxOkFudC1FNAotCVVDSEFSICAgICBQYWlyMlNlY29uZGFyeVJ4QW50OyAgIC8vIDA6QW50LUUzLCAxOkFudC1FNAotCVNIT1JUICAgICBQYWlyMUF2Z1Jzc2lbMl07ICAgICAgIC8vIEF2Z1Jzc2lbMF06RTEsIEF2Z1Jzc2lbMV06RTIKLQlTSE9SVCAgICAgUGFpcjJBdmdSc3NpWzJdOyAgICAgICAvLyBBdmdSc3NpWzBdOkUzLCBBdmdSc3NpWzFdOkU0Ci0JU0hPUlQgICAgIFBhaXIxTGFzdEF2Z1Jzc2k7ICAgICAgLy8KLQlTSE9SVCAgICAgUGFpcjJMYXN0QXZnUnNzaTsgICAgICAvLwotCVVMT05HICAgICBSY3ZQa3ROdW1XaGVuRXZhbHVhdGU7Ci0JQk9PTEVBTiAgIEZpcnN0UGt0QXJyaXZlZFdoZW5FdmFsdWF0ZTsKLQlSQUxJTktfVElNRVJfU1RSVUNUICAgIFJ4QW50RGl2ZXJzaXR5VGltZXI7Ci19IFNPRlRfUlhfQU5UX0RJVkVSU0lUWSwgKlBTT0ZUX1JYX0FOVF9ESVZFUlNJVFk7CisvKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgODAyLjExaiBjaGFubmVsIFRYIHBvd2VyICovCitzdHJ1Y3QgcnRfY2hhbm5lbF8xMWpfdHhfcG93ZXIgeworCXU4IENoYW5uZWw7CisJdTggQlc7CQkvKiBCV18xMCBvciBCV18yMCAqLworCWNoYXIgUG93ZXI7CisJY2hhciBQb3dlcjI7CisJdTE2IFJlbWFpbmluZ1RpbWVGb3JVc2U7CS8qdW5pdDogc2VjICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBfTEVBUF9BVVRIX0lORk8gewotCUJPT0xFQU4gICAgICAgICBFbmFibGVkOyAgICAgICAgLy9UdXJlOiBFbmFibGUgTEVBUCBBdXRoZW50aWNhdGlvbgotCUJPT0xFQU4gICAgICAgICBDQ0tNOyAgICAgICAgICAgLy9UdXJlOiBVc2UgRmFzdCBSZWF1dGhlbnRpY2F0aW9uIHdpdGggQ0NLTQotCVVDSEFSICAgICAgICAgICBSZXNlcnZlWzJdOwotCVVDSEFSICAgICAgICAgICBVc2VyTmFtZVsyNTZdOyAgLy9MRUFQLCBVc2VyIG5hbWUKLQlVTE9ORyAgICAgICAgICAgVXNlck5hbWVMZW47Ci0JVUNIQVIgICAgICAgICAgIFBhc3N3b3JkWzI1Nl07ICAvL0xFQVAsIFVzZXIgUGFzc3dvcmQKLQlVTE9ORyAgICAgICAgICAgUGFzc3dvcmRMZW47Ci19IExFQVBfQVVUSF9JTkZPLCAqUExFQVBfQVVUSF9JTkZPOworc3RydWN0IHJ0X3NvZnRfcnhfYW50X2RpdmVyc2l0eSB7CisJdTggRXZhbHVhdGVQZXJpb2Q7CS8qIDA6bm90IGV2YWx1dGUgc3RhdHVzLCAxOiBldmFsdWF0ZSBzdGF0dXMsIDI6IHN3aXRjaGluZyBzdGF0dXMgKi8KKwl1OCBFdmFsdWF0ZVN0YWJsZUNudDsKKwl1OCBQYWlyMVByaW1hcnlSeEFudDsJLyogMDpBbnQtRTEsIDE6QW50LUUyICovCisJdTggUGFpcjFTZWNvbmRhcnlSeEFudDsJLyogMDpBbnQtRTEsIDE6QW50LUUyICovCisJdTggUGFpcjJQcmltYXJ5UnhBbnQ7CS8qIDA6QW50LUUzLCAxOkFudC1FNCAqLworCXU4IFBhaXIyU2Vjb25kYXJ5UnhBbnQ7CS8qIDA6QW50LUUzLCAxOkFudC1FNCAqLworCXNob3J0IFBhaXIxQXZnUnNzaVsyXTsJLyogQXZnUnNzaVswXTpFMSwgQXZnUnNzaVsxXTpFMiAqLworCXNob3J0IFBhaXIyQXZnUnNzaVsyXTsJLyogQXZnUnNzaVswXTpFMywgQXZnUnNzaVsxXTpFNCAqLworCXNob3J0IFBhaXIxTGFzdEF2Z1Jzc2k7CS8qICovCisJc2hvcnQgUGFpcjJMYXN0QXZnUnNzaTsJLyogKi8KKwl1bnNpZ25lZCBsb25nIFJjdlBrdE51bVdoZW5FdmFsdWF0ZTsKKwlCT09MRUFOIEZpcnN0UGt0QXJyaXZlZFdoZW5FdmFsdWF0ZTsKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIFJ4QW50RGl2ZXJzaXR5VGltZXI7Cit9OwogCi10eXBlZGVmIHN0cnVjdCB7Ci0JVUNIQVIgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICAgRXJyb3JDb2RlWzJdOyAgLy8wMCAwMS1JbnZhbGlkIGF1dGhlbnRpY2F0aW9uIHR5cGUKLQkJCQkJCQkJLy8wMCAwMi1BdXRoZW50aWNhdGlvbiB0aW1lb3V0Ci0JCQkJCQkJCS8vMDAgMDMtQ2hhbGxlbmdlIGZyb20gQVAgZmFpbGVkCi0JCQkJCQkJCS8vMDAgMDQtQ2hhbGxlbmdlIHRvIEFQIGZhaWxlZAotCUJPT0xFQU4gICAgICBSZXBvcnRlZDsKLX0gUk9HVUVBUF9FTlRSWSwgKlBST0dVRUFQX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JVUNIQVIgICAgICAgICAgICAgICBSb2d1ZUFwTnI7Ci0JUk9HVUVBUF9FTlRSWSAgICAgICBSb2d1ZUFwRW50cnlbTUFYX0xFTl9PRl9CU1NfVEFCTEVdOwotfSBST0dVRUFQX1RBQkxFLCAqUFJPR1VFQVBfVEFCTEU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlCT09MRUFOICAgICBFbmFibGU7Ci0JVUNIQVIgICAgICAgRGVsdGE7Ci0JQk9PTEVBTiAgICAgUGx1c1NpZ247Ci19IENDS19UWF9QT1dFUl9DQUxJQlJBVEUsICpQQ0NLX1RYX1BPV0VSX0NBTElCUkFURTsKLQotLy8KLS8vIFJlY2VpdmUgVHVwbGUgQ2FjaGUgRm9ybWF0Ci0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9UVVBMRV9DQUNIRSAgICB7Ci0JQk9PTEVBTiAgICAgICAgIFZhbGlkOwotCVVDSEFSICAgICAgICAgICBNYWNBZGRyZXNzW01BQ19BRERSX0xFTl07Ci0JVVNIT1JUICAgICAgICAgIFNlcXVlbmNlOwotCVVTSE9SVCAgICAgICAgICBGcmFnOwotfSBUVVBMRV9DQUNIRSwgKlBUVVBMRV9DQUNIRTsKLQotLy8KLS8vIEZyYWdtZW50IEZyYW1lIHN0cnVjdHVyZQotLy8KLXR5cGVkZWYgc3RydWN0ICBfRlJBR01FTlRfRlJBTUUgewotCVBORElTX1BBQ0tFVCAgICBwRnJhZ1BhY2tldDsKLQlVTE9ORyAgICAgICBSeFNpemU7Ci0JVVNIT1JUICAgICAgU2VxdWVuY2U7Ci0JVVNIT1JUICAgICAgTGFzdEZyYWc7Ci0JVUxPTkcgICAgICAgRmxhZ3M7ICAgICAgICAgIC8vIFNvbWUgZXh0cmEgZnJhbWUgaW5mb3JtYXRpb24uIGJpdCAwOiBMTEMgcHJlc2VudGVkCi19IEZSQUdNRU5UX0ZSQU1FLCAqUEZSQUdNRU5UX0ZSQU1FOwotCi0KLS8vCi0vLyBQYWNrZXQgaW5mb3JtYXRpb24gZm9yIE5kaXNRdWVyeVBhY2tldAotLy8KLXR5cGVkZWYgc3RydWN0ICBfUEFDS0VUX0lORk8gICAgewotCVVJTlQgICAgICAgICAgICBQaHlzaWNhbEJ1ZmZlckNvdW50OyAgICAvLyBQaHlzaWNhbCBicmVha3Mgb2YgYnVmZmVyIGRlc2NyaXBvciBjaGFpbmVkCi0JVUlOVCAgICAgICAgICAgIEJ1ZmZlckNvdW50IDsgICAgICAgICAgIC8vIE51bWJlciBvZiBCdWZmZXIgZGVzY3JpcHRvciBjaGFpbmVkCi0JVUlOVCAgICAgICAgICAgIFRvdGFsUGFja2V0TGVuZ3RoIDsgICAgIC8vIFNlbGYgZXhwbGFpbmVkCi0JUE5ESVNfQlVGRkVSICAgIHBGaXJzdEJ1ZmZlcjsgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gZmlyc3QgYnVmZmVyIGRlc2NyaXB0b3IKLX0gUEFDS0VUX0lORk8sICpQUEFDS0VUX0lORk87Ci0KLS8vCi0vLyBUa2lwIEtleSBzdHJ1Y3R1cmUgd2hpY2ggUkM0IGtleSAmIE1JQyBjYWxjdWxhdGlvbgotLy8KLXR5cGVkZWYgc3RydWN0ICBfVEtJUF9LRVlfSU5GTyAgewotCVVJTlQgICAgICAgIG5CeXRlc0luTTsgIC8vICMgYnl0ZXMgaW4gTSBmb3IgTUlDS0VZCi0JVUxPTkcgICAgICAgSVYxNjsKLQlVTE9ORyAgICAgICBJVjMyOwotCVVMT05HICAgICAgIEswOyAgICAgICAgIC8vIGZvciBNSUNLRVkgTG93Ci0JVUxPTkcgICAgICAgSzE7ICAgICAgICAgLy8gZm9yIE1JQ0tFWSBIaWcKLQlVTE9ORyAgICAgICBMOyAgICAgICAgICAvLyBDdXJyZW50IHN0YXRlIGZvciBNSUNLRVkKLQlVTE9ORyAgICAgICBSOyAgICAgICAgICAvLyBDdXJyZW50IHN0YXRlIGZvciBNSUNLRVkKLQlVTE9ORyAgICAgICBNOyAgICAgICAgICAvLyBNZXNzYWdlIGFjY3VtdWxhdG9yIGZvciBNSUNLRVkKLQlVQ0hBUiAgICAgICBSQzRLRVlbMTZdOwotCVVDSEFSICAgICAgIE1JQ1s4XTsKLX0gVEtJUF9LRVlfSU5GTywgKlBUS0lQX0tFWV9JTkZPOwotCi0vLwotLy8gUHJpdmF0ZSAvIE1pc2MgZGF0YSwgY291bnRlcnMgZm9yIGRyaXZlciBpbnRlcm5hbCB1c2UKLS8vCi10eXBlZGVmIHN0cnVjdCAgX19QUklWQVRFX1NUUlVDIHsKLQlVSU5UICAgICAgIFN5c3RlbVJlc2V0Q250OyAgICAgICAgIC8vIFN5c3RlbSByZXNldCBjb3VudGVyCi0JVUlOVCAgICAgICBUeFJpbmdGdWxsQ250OyAgICAgICAgICAvLyBUeCByaW5nIGZ1bGwgb2NjdXJyYW5jZSBudW1iZXIKLQlVSU5UICAgICAgIFBoeVJ4RXJyQ250OyAgICAgICAgICAgIC8vIFBIWSBSeCBlcnJvciBjb3VudCwgZm9yIGRlYnVnIHB1cnBvc2UsIG1pZ2h0IG1vdmUgdG8gZ2xvYmFsIGNvdW50ZXIKLQkvLyBWYXJpYWJsZXMgZm9yIFdFUCBlbmNyeXB0aW9uIC8gZGVjcnlwdGlvbiBpbiBydG1wX3dlcC5jCi0JVUlOVCAgICAgICBGQ1NDUkMzMjsKLQlBUkNGT1VSQ09OVEVYVCAgV0VQQ09OVEVYVDsKLQkvLyBUa2lwIHN0dWZmCi0JVEtJUF9LRVlfSU5GTyAgIFR4OwotCVRLSVBfS0VZX0lORk8gICBSeDsKLX0gUFJJVkFURV9TVFJVQywgKlBQUklWQVRFX1NUUlVDOwotCi0vLyBzdHJ1Y3R1cmUgdG8gdHVuZSBCQlAgUjY2IChCQlAgVFVOSU5HKQotdHlwZWRlZiBzdHJ1Y3QgX0JCUF9SNjZfVFVOSU5HIHsKLQlCT09MRUFOICAgICBiRW5hYmxlOwotCVVTSE9SVCAgICAgIEZhbHNlQ2NhTG93ZXJUaHJlc2hvbGQ7ICAvLyBkZWZhdWx0IDEwMAotCVVTSE9SVCAgICAgIEZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQ7ICAvLyBkZWZhdWx0IDUxMgotCVVDSEFSICAgICAgIFI2NkRlbHRhOwotCVVDSEFSICAgICAgIFI2NkN1cnJlbnRWYWx1ZTsKLQlCT09MRUFOCQlSNjZMb3dlclVwcGVyU2VsZWN0OyAvL0JlZm9yZSBMaW5rVXAsIFVzZWQgTG93ZXJCb3VuZCBvciBVcHBlckJvdW5kIGFzIFI2NiB2YWx1ZS4KLX0gQkJQX1I2Nl9UVU5JTkcsICpQQkJQX1I2Nl9UVU5JTkc7Ci0KLS8vIHN0cnVjdHVyZSB0byBzdG9yZSBjaGFubmVsIFRYIHBvd2VyCi10eXBlZGVmIHN0cnVjdCBfQ0hBTk5FTF9UWF9QT1dFUiB7Ci0JVVNIT1JUICAgICBSZW1haW5pbmdUaW1lRm9yVXNlOwkJLy91bml0OiBzZWMKLQlVQ0hBUiAgICAgIENoYW5uZWw7Ci0JQ0hBUiAgICAgICBQb3dlcjsKLQlDSEFSICAgICAgIFBvd2VyMjsKLQlVQ0hBUiAgICAgIE1heFR4UHdyOwotCVVDSEFSICAgICAgRGZzUmVxOwotfSBDSEFOTkVMX1RYX1BPV0VSLCAqUENIQU5ORUxfVFhfUE9XRVI7Ci0KLS8vIHN0cnVjdHVyZSB0byBzdG9yZSA4MDIuMTFqIGNoYW5uZWwgVFggcG93ZXIKLXR5cGVkZWYgc3RydWN0IF9DSEFOTkVMXzExSl9UWF9QT1dFUiB7Ci0JVUNIQVIgICAgICBDaGFubmVsOwotCVVDSEFSICAgICAgQlc7CS8vIEJXXzEwIG9yIEJXXzIwCi0JQ0hBUiAgICAgICBQb3dlcjsKLQlDSEFSICAgICAgIFBvd2VyMjsKLQlVU0hPUlQgICAgIFJlbWFpbmluZ1RpbWVGb3JVc2U7CQkvL3VuaXQ6IHNlYwotfSBDSEFOTkVMXzExSl9UWF9QT1dFUiwgKlBDSEFOTkVMXzExSl9UWF9QT1dFUjsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKglzdHJ1Y3R1cmUgZm9yIHJhZGFyIGRldGVjdGlvbiBhbmQgY2hhbm5lbCBzd2l0Y2gKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgcnRfcmFkYXJfZGV0ZWN0IHsKKwkvKkJPT0xFQU4gICAgICAgICAgIElFRUU4MDIxMUg7ICAgICAgICAgICAgICAgICAgICAgLy8gMDogZGlzYWJsZSwgMTogZW5hYmxlIElFRUU4MDIuMTFoICovCisJdTggQ1NDb3VudDsJCS8qQ2hhbm5lbCBzd2l0Y2ggY291bnRlciAqLworCXU4IENTUGVyaW9kOwkJLypDaGFubmVsIHN3aXRjaCBwZXJpb2QgKGJlYWNvbiBjb3VudCkgKi8KKwl1OCBSRENvdW50OwkJLypSYWRhciBkZXRlY3Rpb24gY291bnRlciAqLworCXU4IFJETW9kZTsJCS8qUmFkYXIgRGV0ZWN0aW9uIG1vZGUgKi8KKwl1OCBSRER1clJlZ2lvbjsJLypSYWRhciBkZXRlY3Rpb24gZHVyYXRpb24gcmVnaW9uICovCisJdTggQkJQUjE2OworCXU4IEJCUFIxNzsKKwl1OCBCQlBSMTg7CisJdTggQkJQUjIxOworCXU4IEJCUFIyMjsKKwl1OCBCQlBSNjQ7CisJdW5zaWduZWQgbG9uZyBJblNlcnZpY2VNb25pdG9yQ291bnQ7CS8qIHVuaXQ6IHNlYyAqLworCXU4IERmc1Nlc3Npb25UaW1lOworCUJPT0xFQU4gYkZhc3REZnM7CisJdTggQ2hNb3ZpbmdUaW1lOworCXU4IExvbmdQdWxzZVJhZGFyVGg7Cit9OwogCiB0eXBlZGVmIGVudW0gX0FCR0JBTkRfU1RBVEVfIHsKIAlVTktOT1dOX0JBTkQsCkBAIC0xNDM5LDIzNCArODYxLDI5MSBAQAogCUFfQkFORCwKIH0gQUJHQkFORF9TVEFURTsKIAotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfU1RSVUNUIHsKLQkvLyBTVEEgc3RhdGUgbWFjaGluZXMKLQlTVEFURV9NQUNISU5FICAgICAgICAgICBDbnRsTWFjaGluZTsKLQlTVEFURV9NQUNISU5FICAgICAgICAgICBBc3NvY01hY2hpbmU7Ci0JU1RBVEVfTUFDSElORSAgICAgICAgICAgQXV0aE1hY2hpbmU7Ci0JU1RBVEVfTUFDSElORSAgICAgICAgICAgQXV0aFJzcE1hY2hpbmU7Ci0JU1RBVEVfTUFDSElORSAgICAgICAgICAgU3luY01hY2hpbmU7Ci0JU1RBVEVfTUFDSElORSAgICAgICAgICAgV3BhUHNrTWFjaGluZTsKLQlTVEFURV9NQUNISU5FICAgICAgICAgICBMZWFwTWFjaGluZTsKLQlTVEFURV9NQUNISU5FICAgICAgICAgICBBaXJvbmV0TWFjaGluZTsKLQlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBc3NvY0Z1bmNbQVNTT0NfRlVOQ19TSVpFXTsKLQlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBdXRoRnVuY1tBVVRIX0ZVTkNfU0laRV07Ci0JU1RBVEVfTUFDSElORV9GVU5DICAgICAgQXV0aFJzcEZ1bmNbQVVUSF9SU1BfRlVOQ19TSVpFXTsKLQlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBTeW5jRnVuY1tTWU5DX0ZVTkNfU0laRV07Ci0JU1RBVEVfTUFDSElORV9GVU5DICAgICAgV3BhUHNrRnVuY1tXUEFfUFNLX0ZVTkNfU0laRV07Ci0JU1RBVEVfTUFDSElORV9GVU5DICAgICAgQWlyb25ldEZ1bmNbQUlST05FVF9GVU5DX1NJWkVdOwotCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEFjdEZ1bmNbQUNUX0ZVTkNfU0laRV07Ci0JLy8gQWN0aW9uCi0JU1RBVEVfTUFDSElORSAgICAgICAgICAgQWN0TWFjaGluZTsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKy8qIFBvd2VyIHNhdmUgbWV0aG9kIGNvbnRyb2wgKi8KK3R5cGVkZWYgdW5pb24gX1BTX0NPTlRST0wgeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgRW5hYmxlUFNpbklkbGU6MTsJLyogRW5hYmxlIHJhZGlvIG9mZiB3aGVuIG5vdCBjb25uZWN0IHRvIEFQLiByYWRpbyBvbiBvbmx5IHdoZW4gc2l0ZXN1cnZleSwgKi8KKwkJdW5zaWduZWQgbG9uZyBFbmFibGVOZXdQUzoxOwkvKiBFbmFibGUgbmV3ICBDaGlwIHBvd2VyIHNhdmUgZnVjbnRpb24gLiBOZXcgbWV0aG9kIGNhbiBvbmx5IGJlIGFwcGxpZWQgaW4gY2hpcCB2ZXJzaW9uIGFmdGVyIDI4NzIuIGFuZCBQQ0llLiAqLworCQl1bnNpZ25lZCBsb25nIHJ0MzB4eFBvd2VyTW9kZToyOwkvKiBQb3dlciBMZXZlbCBNb2RlIGZvciBydDMweHggY2hpcCAqLworCQl1bnNpZ25lZCBsb25nIHJ0MzB4eEZvbGxvd0hvc3RBU1BNOjE7CS8qIENhcmQgRm9sbG93cyBIb3N0J3Mgc2V0dGluZyBmb3IgcnQzMHh4IGNoaXAuICovCisJCXVuc2lnbmVkIGxvbmcgcnQzMHh4Rm9yY2VBU1BNVGVzdDoxOwkvKiBGb3JjZSBlbmFibGUgTDEgZm9yIHJ0MzB4eCBjaGlwLiBUaGlzIGhhcyBoaWdoZXIgcHJpb3JpdHkgdGhhbiBydDMweHhGb2xsb3dIb3N0QVNQTSBNb2RlLiAqLworCQl1bnNpZ25lZCBsb25nIHJzdjoyNjsJLyogUmFkaW8gTWVhc3VyZW1lbnQgRW5hYmxlICovCisJfSBmaWVsZDsKKwl1bnNpZ25lZCBsb25nIHdvcmQ7Cit9IFBTX0NPTlRST0wsICpQUFNfQ09OVFJPTDsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotCVVMT05HICAgICAgICAgICAgICAgICAgIENoYW5uZWxRdWFsaXR5OyAgLy8gMC4uMTAwLCBDaGFubmVsIFF1YWxpdHkgSW5kaWNhdGlvbiBmb3IgUm9hbWluZwotCVVMT05HICAgICAgICAgICAgICAgICAgIE5vdzMyOyAgICAgICAgICAgLy8gbGF0Y2ggdGhlIHZhbHVlIG9mIE5kaXNHZXRTeXN0ZW1VcFRpbWUoKQotCVVMT05HICAgICAgICAgICAgICAgICAgIExhc3RTZW5kTlVMTHBzbVRpbWU7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoJc3RydWN0dXJlIGZvciBNTE1FIHN0YXRlIG1hY2hpbmUKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgcnRfbWxtZSB7CisJLyogU1RBIHN0YXRlIG1hY2hpbmVzICovCisJc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgQ250bE1hY2hpbmU7CisJc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgQXNzb2NNYWNoaW5lOworCXN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lIEF1dGhNYWNoaW5lOworCXN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lIEF1dGhSc3BNYWNoaW5lOworCXN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lIFN5bmNNYWNoaW5lOworCXN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lIFdwYVBza01hY2hpbmU7CisJc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgTGVhcE1hY2hpbmU7CisJU1RBVEVfTUFDSElORV9GVU5DIEFzc29jRnVuY1tBU1NPQ19GVU5DX1NJWkVdOworCVNUQVRFX01BQ0hJTkVfRlVOQyBBdXRoRnVuY1tBVVRIX0ZVTkNfU0laRV07CisJU1RBVEVfTUFDSElORV9GVU5DIEF1dGhSc3BGdW5jW0FVVEhfUlNQX0ZVTkNfU0laRV07CisJU1RBVEVfTUFDSElORV9GVU5DIFN5bmNGdW5jW1NZTkNfRlVOQ19TSVpFXTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgQWN0RnVuY1tBQ1RfRlVOQ19TSVpFXTsKKwkvKiBBY3Rpb24gKi8KKwlzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSBBY3RNYWNoaW5lOwogCi0JQk9PTEVBTiAgICAgICAgICAgICAgICAgYlJ1bm5pbmc7Ci0JTkRJU19TUElOX0xPQ0sgICAgICAgICAgVGFza0xvY2s7Ci0JTUxNRV9RVUVVRSAgICAgICAgICAgICAgUXVldWU7CisJLyogY29tbW9uIFdQQSBzdGF0ZSBtYWNoaW5lICovCisJc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgV3BhTWFjaGluZTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgV3BhRnVuY1tXUEFfRlVOQ19TSVpFXTsKIAotCVVJTlQgICAgICAgICAgICAgICAgICAgIFNoaWZ0UmVnOworCXVuc2lnbmVkIGxvbmcgQ2hhbm5lbFF1YWxpdHk7CS8qIDAuLjEwMCwgQ2hhbm5lbCBRdWFsaXR5IEluZGljYXRpb24gZm9yIFJvYW1pbmcgKi8KKwl1bnNpZ25lZCBsb25nIE5vdzMyOwkJLyogbGF0Y2ggdGhlIHZhbHVlIG9mIE5kaXNHZXRTeXN0ZW1VcFRpbWUoKSAqLworCXVuc2lnbmVkIGxvbmcgTGFzdFNlbmROVUxMcHNtVGltZTsKIAotCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIFBlcmlvZGljVGltZXI7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgQVBTRFBlcmlvZGljVGltZXI7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgTGlua0Rvd25UaW1lcjsKLQlSQUxJTktfVElNRVJfU1RSVUNUICAgICBMaW5rVXBUaW1lcjsKLSNpZmRlZiBSVDI4NjAKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICBiUHNQb2xsVGltZXJSdW5uaW5nOwotICAgIFJBTElOS19USU1FUl9TVFJVQ1QgICAgIFBzUG9sbFRpbWVyOwotCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIFJhZGlvT25PZmZUaW1lcjsKLSNlbmRpZgotCVVMT05HICAgICAgICAgICAgICAgICAgIFBlcmlvZGljUm91bmQ7Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgT25lU2VjUGVyaW9kaWNSb3VuZDsKKwlCT09MRUFOIGJSdW5uaW5nOworCXNwaW5sb2NrX3QgVGFza0xvY2s7CisJc3RydWN0IHJ0X21sbWVfcXVldWUgUXVldWU7CiAKLQlVQ0hBUgkJCQkJUmVhbFJ4UGF0aDsKLQlCT09MRUFOCQkJCQliTG93VGhyb3VnaHB1dDsKLQlCT09MRUFOCQkJCQliRW5hYmxlQXV0b0FudGVubmFDaGVjazsKLQlSQUxJTktfVElNRVJfU1RSVUNUCQlSeEFudEV2YWxUaW1lcjsKKwl1MzIgU2hpZnRSZWc7CiAKLSNpZmRlZiBSVDI4NzAKLQlVQ0hBUiBDYWxpQlc0MFJmUjI0OwotCVVDSEFSIENhbGlCVzIwUmZSMjQ7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi19IE1MTUVfU1RSVUNULCAqUE1MTUVfU1RSVUNUOworCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgUGVyaW9kaWNUaW1lcjsKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIEFQU0RQZXJpb2RpY1RpbWVyOworCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgTGlua0Rvd25UaW1lcjsKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIExpbmtVcFRpbWVyOworI2lmZGVmIFJUTVBfTUFDX1BDSQorCXU4IGJQc1BvbGxUaW1lclJ1bm5pbmc7CisJc3RydWN0IHJ0X3JhbGlua190aW1lciBQc1BvbGxUaW1lcjsKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIFJhZGlvT25PZmZUaW1lcjsKKyNlbmRpZgkJCQkvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKwl1bnNpZ25lZCBsb25nIFBlcmlvZGljUm91bmQ7CisJdW5zaWduZWQgbG9uZyBPbmVTZWNQZXJpb2RpY1JvdW5kOwogCi0vLyBzdHJ1Y3R1cmUgZm9yIHJhZGFyIGRldGVjdGlvbiBhbmQgY2hhbm5lbCBzd2l0Y2gKLXR5cGVkZWYgc3RydWN0IF9SQURBUl9ERVRFQ1RfU1RSVUNUIHsKLQlVQ0hBUgkJQ1NDb3VudDsJCQkvL0NoYW5uZWwgc3dpdGNoIGNvdW50ZXIKLQlVQ0hBUgkJQ1NQZXJpb2Q7CQkJLy9DaGFubmVsIHN3aXRjaCBwZXJpb2QgKGJlYWNvbiBjb3VudCkKLQlVQ0hBUgkJUkRDb3VudDsJCQkvL1JhZGFyIGRldGVjdGlvbiBjb3VudGVyCi0JVUNIQVIJCVJETW9kZTsJCQkJLy9SYWRhciBEZXRlY3Rpb24gbW9kZQotCVVDSEFSCQlSRER1clJlZ2lvbjsJCS8vUmFkYXIgZGV0ZWN0aW9uIGR1cmF0aW9uIHJlZ2lvbgotCVVDSEFSCQlCQlBSMTY7Ci0JVUNIQVIJCUJCUFIxNzsKLQlVQ0hBUgkJQkJQUjE4OwotCVVDSEFSCQlCQlBSMjE7Ci0JVUNIQVIJCUJCUFIyMjsKLQlVQ0hBUgkJQkJQUjY0OwotCVVMT05HCQlJblNlcnZpY2VNb25pdG9yQ291bnQ7IC8vIHVuaXQ6IHNlYwotCVVJTlQ4CQlEZnNTZXNzaW9uVGltZTsKLQlCT09MRUFOCQliRmFzdERmczsKLQlVSU5UOAkJQ2hNb3ZpbmdUaW1lOwotCVVJTlQ4CQlMb25nUHVsc2VSYWRhclRoOwotfSBSQURBUl9ERVRFQ1RfU1RSVUNULCAqUFJBREFSX0RFVEVDVF9TVFJVQ1Q7CisJdTggUmVhbFJ4UGF0aDsKKwlCT09MRUFOIGJMb3dUaHJvdWdocHV0OworCUJPT0xFQU4gYkVuYWJsZUF1dG9BbnRlbm5hQ2hlY2s7CisJc3RydWN0IHJ0X3JhbGlua190aW1lciBSeEFudEV2YWxUaW1lcjsKIAotdHlwZWRlZiBlbnVtIF9SRUNfQkxPQ0tBQ0tfU1RBVFVTCi17Ci0gICAgUmVjaXBpZW50X05PTkU9MCwKKyNpZmRlZiBSVDMweHgKKwl1OCBDYWxpQlc0MFJmUjI0OworCXU4IENhbGlCVzIwUmZSMjQ7CisjZW5kaWYJCQkJLyogUlQzMHh4IC8vICovCisKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIEF1dG9XYWtldXBUaW1lcjsKKwlCT09MRUFOIEF1dG9XYWtldXBUaW1lclJ1bm5pbmc7CisjZW5kaWYJCQkJLyogUlRNUF9NQUNfVVNCIC8vICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoJODAyLjExIE4gcmVsYXRlZCBkYXRhIHN0cnVjdHVyZXMKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1IHsKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICpuZXh0OworCXZvaWQgKnBQYWNrZXQ7CS8qIGNvdmVydGVkIHRvIDgwMi4zIGZyYW1lICovCisJaW50IFNlcXVlbmNlOwkJLyogc2VxdWVuY2UgbnVtYmVyIG9mIE1QRFUgKi8KKwlCT09MRUFOIGJBTVNEVTsKK307CisKK3N0cnVjdCByZW9yZGVyaW5nX2xpc3QgeworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm5leHQ7CisJaW50IHFsZW47Cit9OworCitzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1X3Bvb2wgeworCXZvaWQgKm1lbTsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IHJlb3JkZXJpbmdfbGlzdCBmcmVlbGlzdDsKK307CisKK3R5cGVkZWYgZW51bSBfUkVDX0JMT0NLQUNLX1NUQVRVUyB7CisJUmVjaXBpZW50X05PTkUgPSAwLAogCVJlY2lwaWVudF9VU0VELAogCVJlY2lwaWVudF9IYW5kbGVSZXMsCi0gICAgUmVjaXBpZW50X0FjY2VwdAorCVJlY2lwaWVudF9BY2NlcHQKIH0gUkVDX0JMT0NLQUNLX1NUQVRVUywgKlBSRUNfQkxPQ0tBQ0tfU1RBVFVTOwogCi10eXBlZGVmIGVudW0gX09SSV9CTE9DS0FDS19TVEFUVVMKLXsKLSAgICBPcmlnaW5hdG9yX05PTkU9MCwKK3R5cGVkZWYgZW51bSBfT1JJX0JMT0NLQUNLX1NUQVRVUyB7CisJT3JpZ2luYXRvcl9OT05FID0gMCwKIAlPcmlnaW5hdG9yX1VTRUQsCi0gICAgT3JpZ2luYXRvcl9XYWl0UmVzLAotICAgIE9yaWdpbmF0b3JfRG9uZQorCU9yaWdpbmF0b3JfV2FpdFJlcywKKwlPcmlnaW5hdG9yX0RvbmUKIH0gT1JJX0JMT0NLQUNLX1NUQVRVUywgKlBPUklfQkxPQ0tBQ0tfU1RBVFVTOwogCi10eXBlZGVmIHN0cnVjdCBfQkFfT1JJX0VOVFJZewotCVVDSEFSICAgV2NpZDsKLQlVQ0hBUiAgIFRJRDsKLQlVQ0hBUiAgIEJBV2luU2l6ZTsKLQlVQ0hBUiAgIFRva2VuOwotLy8gU2VxdWVuY2UgaXMgdG8gZmlsbCBldmVyeSBvdXRnb2luZyBRb1MgREFUQSBmcmFtZSdzIHNlcXVlbmNlIGZpZWxkIGluIDgwMi4xMSBoZWFkZXIuCi0JVVNIT1JUCVNlcXVlbmNlOwotCVVTSE9SVAlUaW1lT3V0VmFsdWU7Ci0JT1JJX0JMT0NLQUNLX1NUQVRVUyAgT1JJX0JBX1N0YXR1czsKLQlSQUxJTktfVElNRVJfU1RSVUNUIE9SSUJBVGltZXI7Ci0JUFZPSUQJcEFkYXB0ZXI7Ci19IEJBX09SSV9FTlRSWSwgKlBCQV9PUklfRU5UUlk7CitzdHJ1Y3QgcnRfYmFfb3JpX2VudHJ5IHsKKwl1OCBXY2lkOworCXU4IFRJRDsKKwl1OCBCQVdpblNpemU7CisJdTggVG9rZW47CisvKiBTZXF1ZW5jZSBpcyB0byBmaWxsIGV2ZXJ5IG91dGdvaW5nIFFvUyBEQVRBIGZyYW1lJ3Mgc2VxdWVuY2UgZmllbGQgaW4gODAyLjExIGhlYWRlci4gKi8KKwl1MTYgU2VxdWVuY2U7CisJdTE2IFRpbWVPdXRWYWx1ZTsKKwlPUklfQkxPQ0tBQ0tfU1RBVFVTIE9SSV9CQV9TdGF0dXM7CisJc3RydWN0IHJ0X3JhbGlua190aW1lciBPUklCQVRpbWVyOworCXZvaWQgKnBBZGFwdGVyOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX0JBX1JFQ19FTlRSWSB7Ci0JVUNIQVIgICBXY2lkOwotCVVDSEFSICAgVElEOwotCVVDSEFSICAgQkFXaW5TaXplOwkvLyA3LjMuMS4xNC4gZWFjaCBidWZmZXIgaXMgY2FwYWJsZSBvZiBob2xkaW5nIGEgbWF4IEFNU0RVIG9yIE1TRFUuCi0JVVNIT1JUCQlMYXN0SW5kU2VxOwotCVVTSE9SVAkJVGltZU91dFZhbHVlOwotCVJBTElOS19USU1FUl9TVFJVQ1QgUkVDQkFUaW1lcjsKLQlVTE9ORwkJTGFzdEluZFNlcUF0VGltZXI7Ci0JVUxPTkcJCW5Ecm9wUGFja2V0OwotCVVMT05HCQlyY3ZTZXE7Ci0JUkVDX0JMT0NLQUNLX1NUQVRVUyAgUkVDX0JBX1N0YXR1czsKLQlORElTX1NQSU5fTE9DSyAgICAgICAgICBSeFJlUmluZ0xvY2s7ICAgICAgICAgICAgICAgICAvLyBSeCBSaW5nIHNwaW5sb2NrCi0JUFZPSUQJcEFkYXB0ZXI7Ci0Jc3RydWN0IHJlb3JkZXJpbmdfbGlzdAlsaXN0OwotfSBCQV9SRUNfRU5UUlksICpQQkFfUkVDX0VOVFJZOworc3RydWN0IHJ0X2JhX3JlY19lbnRyeSB7CisJdTggV2NpZDsKKwl1OCBUSUQ7CisJdTggQkFXaW5TaXplOwkvKiA3LjMuMS4xNC4gZWFjaCBidWZmZXIgaXMgY2FwYWJsZSBvZiBob2xkaW5nIGEgbWF4IEFNU0RVIG9yIE1TRFUuICovCisJLyp1OCBOdW1PZlJ4UGt0OyAqLworCS8qdTggICAgQ3VyaW5kaWR4OyAvLyB0aGUgaGVhZCBpbiB0aGUgUlggcmVvcmRlcmluZyBidWZmZXIgKi8KKwl1MTYgTGFzdEluZFNlcTsKKy8qICAgICAgdTE2ICAgICAgICAgIExhc3RJbmRTZXFBdFRpbWVyOyAqLworCXUxNiBUaW1lT3V0VmFsdWU7CisJc3RydWN0IHJ0X3JhbGlua190aW1lciBSRUNCQVRpbWVyOworCXVuc2lnbmVkIGxvbmcgTGFzdEluZFNlcUF0VGltZXI7CisJdW5zaWduZWQgbG9uZyBuRHJvcFBhY2tldDsKKwl1bnNpZ25lZCBsb25nIHJjdlNlcTsKKwlSRUNfQkxPQ0tBQ0tfU1RBVFVTIFJFQ19CQV9TdGF0dXM7CisvKiAgICAgIHU4ICAgUnhCdWZJZHhVc2VkOyAqLworCS8qIGNvcnJlc3BvbmRpbmcgdmlydHVhbCBhZGRyZXNzIGZvciBSWCByZW9yZGVyaW5nIHBhY2tldCBzdG9yYWdlLiAqLworCS8qUlRNUF9SRU9SREVSRE1BQlVGIE1BUF9SWEJ1ZltNQVhfUlhfUkVPUkRFUkJVRl07ICovCisJc3BpbmxvY2tfdCBSeFJlUmluZ0xvY2s7CS8qIFJ4IFJpbmcgc3BpbmxvY2sgKi8KKy8qICAgICAgc3RydWN0IF9CQV9SRUNfRU5UUlkgKnBOZXh0OyAqLworCXZvaWQgKnBBZGFwdGVyOworCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QgbGlzdDsKK307CiAKK3N0cnVjdCBydF9iYV90YWJsZSB7CisJdW5zaWduZWQgbG9uZyBudW1Bc1JlY2lwaWVudDsJLyogSSBhbSByZWNpcGllbnQgb2YgbnVtQXNSZWNpcGllbnQgY2xpZW50cy4gVGhlc2UgY2xpZW50IGFyZSBpbiB0aGUgQkFSZWNFbnRyeVtdICovCisJdW5zaWduZWQgbG9uZyBudW1Bc09yaWdpbmF0b3I7CS8qIEkgYW0gb3JpZ2luYXRvciBvZiAgIG51bUFzT3JpZ2luYXRvciBjbGllbnRzLiBUaGVzZSBjbGllbnRzIGFyZSBpbiB0aGUgQkFPcmlFbnRyeVtdICovCisJdW5zaWduZWQgbG9uZyBudW1Eb25lT3JpZ2luYXRvcjsJLyogY291bnQgRG9uZSBPcmlnaW5hdG9yIHNlc3Npb25zICovCisJc3RydWN0IHJ0X2JhX29yaV9lbnRyeSBCQU9yaUVudHJ5W01BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFXTsKKwlzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5IEJBUmVjRW50cnlbTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEVdOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewotCVVMT05HCQludW1Bc1JlY2lwaWVudDsJCS8vIEkgYW0gcmVjaXBpZW50IG9mIG51bUFzUmVjaXBpZW50IGNsaWVudHMuIFRoZXNlIGNsaWVudCBhcmUgaW4gdGhlIEJBUmVjRW50cnlbXQotCVVMT05HCQludW1Bc09yaWdpbmF0b3I7CS8vIEkgYW0gb3JpZ2luYXRvciBvZiAJbnVtQXNPcmlnaW5hdG9yIGNsaWVudHMuIFRoZXNlIGNsaWVudHMgYXJlIGluIHRoZSBCQU9yaUVudHJ5W10KLQlCQV9PUklfRU5UUlkgICAgICAgQkFPcmlFbnRyeVtNQVhfTEVOX09GX0JBX09SSV9UQUJMRV07Ci0JQkFfUkVDX0VOVFJZICAgICAgIEJBUmVjRW50cnlbTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEVdOwotfSBCQV9UQUJMRSwgKlBCQV9UQUJMRTsKKy8qRm9yIFF1cmV5QkFUYWJsZU9JRCB1c2U7ICovCitzdHJ1Y3QgUEFDS0VEIHJ0X29pZF9iYV9yZWNfZW50cnkgeworCXU4IE1BQ0FkZHJbTUFDX0FERFJfTEVOXTsKKwl1OCBCYUJpdG1hcDsJCS8qIGlmIChCYUJpdG1hcCYoMTw8VElEKSksIHRoaXMgc2Vzc2lvbiB3aXRoe01BQ0FkZHIsIFRJRH1leGlzdHMsIHNvIHJlYWQgQnVmU2l6ZVtUSURdIGZvciBCdWZmZXJTaXplICovCisJdTggcnN2OworCXU4IEJ1ZlNpemVbOF07CisJUkVDX0JMT0NLQUNLX1NUQVRVUyBSRUNfQkFfU3RhdHVzWzhdOworfTsKIAotLy9Gb3IgUXVyZXlCQVRhYmxlT0lEIHVzZTsKLXR5cGVkZWYgc3RydWN0ICBQQUNLRUQgX09JRF9CQV9SRUNfRU5UUll7Ci0JVUNIQVIgICBNQUNBZGRyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICBCYUJpdG1hcDsgICAvLyBpZiAoQmFCaXRtYXAmKDE8PFRJRCkpLCB0aGlzIHNlc3Npb24gd2l0aHtNQUNBZGRyLCBUSUR9ZXhpc3RzLCBzbyByZWFkIEJ1ZlNpemVbVElEXSBmb3IgQnVmZmVyU2l6ZQotCVVDSEFSICAgcnN2OwotCVVDSEFSICAgQnVmU2l6ZVs4XTsKLQlSRUNfQkxPQ0tBQ0tfU1RBVFVTCVJFQ19CQV9TdGF0dXNbOF07Ci19IE9JRF9CQV9SRUNfRU5UUlksICpQT0lEX0JBX1JFQ19FTlRSWTsKKy8qRm9yIFF1cmV5QkFUYWJsZU9JRCB1c2U7ICovCitzdHJ1Y3QgUEFDS0VEIHJ0X29pZF9iYV9vcmlfZW50cnkgeworCXU4IE1BQ0FkZHJbTUFDX0FERFJfTEVOXTsKKwl1OCBCYUJpdG1hcDsJCS8qIGlmIChCYUJpdG1hcCYoMTw8VElEKSksIHRoaXMgc2Vzc2lvbiB3aXRoe01BQ0FkZHIsIFRJRH1leGlzdHMsIHNvIHJlYWQgQnVmU2l6ZVtUSURdIGZvciBCdWZmZXJTaXplLCByZWFkIE9SSV9CQV9TdGF0dXNbVElEXSBmb3Igc3RhdHVzICovCisJdTggcnN2OworCXU4IEJ1ZlNpemVbOF07CisJT1JJX0JMT0NLQUNLX1NUQVRVUyBPUklfQkFfU3RhdHVzWzhdOworfTsKIAotLy9Gb3IgUXVyZXlCQVRhYmxlT0lEIHVzZTsKLXR5cGVkZWYgc3RydWN0ICBQQUNLRUQgX09JRF9CQV9PUklfRU5UUll7Ci0JVUNIQVIgICBNQUNBZGRyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICBCYUJpdG1hcDsgIC8vIGlmIChCYUJpdG1hcCYoMTw8VElEKSksIHRoaXMgc2Vzc2lvbiB3aXRoe01BQ0FkZHIsIFRJRH1leGlzdHMsIHNvIHJlYWQgQnVmU2l6ZVtUSURdIGZvciBCdWZmZXJTaXplLCByZWFkIE9SSV9CQV9TdGF0dXNbVElEXSBmb3Igc3RhdHVzCi0JVUNIQVIgICByc3Y7Ci0JVUNIQVIgICBCdWZTaXplWzhdOwotCU9SSV9CTE9DS0FDS19TVEFUVVMgIE9SSV9CQV9TdGF0dXNbOF07Ci19IE9JRF9CQV9PUklfRU5UUlksICpQT0lEX0JBX09SSV9FTlRSWTsKK3N0cnVjdCBydF9xdWVyeWJhX3RhYmxlIHsKKwlzdHJ1Y3QgcnRfb2lkX2JhX29yaV9lbnRyeSBCQU9yaUVudHJ5WzMyXTsKKwlzdHJ1Y3QgcnRfb2lkX2JhX3JlY19lbnRyeSBCQVJlY0VudHJ5WzMyXTsKKwl1OCBPcmlOdW07CQkvKiBOdW1iZXIgb2YgYmVsb3cgQkFPcmlFbnRyeSAqLworCXU4IFJlY051bTsJCS8qIE51bWJlciBvZiBiZWxvdyBCQVJlY0VudHJ5ICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBfUVVFUllCQV9UQUJMRXsKLQlPSURfQkFfT1JJX0VOVFJZICAgICAgIEJBT3JpRW50cnlbMzJdOwotCU9JRF9CQV9SRUNfRU5UUlkgICAgICAgQkFSZWNFbnRyeVszMl07Ci0JVUNIQVIgICBPcmlOdW07Ly8gTnVtYmVyIG9mIGJlbG93IEJBT3JpRW50cnkKLQlVQ0hBUiAgIFJlY051bTsvLyBOdW1iZXIgb2YgYmVsb3cgQkFSZWNFbnRyeQotfSBRVUVSWUJBX1RBQkxFLCAqUFFVRVJZQkFfVEFCTEU7Ci0KLXR5cGVkZWYJdW5pb24JX0JBQ0FQX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJ4QkFXaW5MaW1pdDo4OwotCQlVSU5UMzIJCVR4QkFXaW5MaW1pdDo4OwotCQlVSU5UMzIJCUF1dG9CQToxOwkvLyBhdXRvbWF0aWNhbGx5IEJBCi0JCVVJTlQzMgkJUG9saWN5OjI7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UKLQkJVUlOVDMyCQlNcGR1RGVuc2l0eTozOwotCQlVSU5UMzIgICAgICAgCUFtc2R1RW5hYmxlOjE7CS8vRW5hYmxlIEFNU0RVIHRyYW5zbWlzc3Rpb24KLQkJVUlOVDMyICAgICAgIAlBbXNkdVNpemU6MTsJLy8gMDozODM5LCAxOjc5MzUgYnl0ZXMuIFVJTlQgIE1TRFVTaXplVG9CeXRlc1tdCT0geyAzODM5LCA3OTM1fTsKLQkJVUlOVDMyICAgICAgIAlNTVBTbW9kZToyOwkvLyBNSU1PIHBvd2VyIHNhdmUgbW9yZSwgMDpzdGF0aWMsIDE6ZHluYW1pYywgMjpyc3YsIDM6bWltbyBlbmFibGUKLQkJVUlOVDMyICAgICAgIAliSHRBZGhvYzoxOwkJCS8vIGFkaG9jIGNhbiB1c2UgaHQgcmF0ZS4KLQkJVUlOVDMyICAgICAgIAliMjA0MENvZXhpc3RTY2FuU3VwOjE7CQkvL0FzIFN0YSwgc3VwcG9ydCBkbyAyMDQwIGNvZXhpc3RlbmNlIHNjYW4gZm9yIEFQLiBBcyBBcCwgc3VwcG9ydCBtb25pdG9yIHRyaWdnZXIgZXZlbnQgdG8gY2hlY2sgaWYgY2FuIHVzZSBCVyA0ME1Iei4KLQkJVUlOVDMyICAgICAgIAk6NDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Cit0eXBlZGVmIHVuaW9uIF9CQUNBUF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIFJ4QkFXaW5MaW1pdDo4OworCQl1MzIgVHhCQVdpbkxpbWl0Ojg7CisJCXUzMiBBdXRvQkE6MTsJLyogYXV0b21hdGljYWxseSBCQSAqLworCQl1MzIgUG9saWN5OjI7CS8qIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UgKi8KKwkJdTMyIE1wZHVEZW5zaXR5OjM7CisJCXUzMiBBbXNkdUVuYWJsZToxOwkvKkVuYWJsZSBBTVNEVSB0cmFuc21pc3N0aW9uICovCisJCXUzMiBBbXNkdVNpemU6MTsJLyogMDozODM5LCAxOjc5MzUgYnl0ZXMuIHUzMiAgTVNEVVNpemVUb0J5dGVzW10gICAgICAgID0geyAzODM5LCA3OTM1fTsgKi8KKwkJdTMyIE1NUFNtb2RlOjI7CS8qIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLCAwOnN0YXRpYywgMTpkeW5hbWljLCAyOnJzdiwgMzptaW1vIGVuYWJsZSAqLworCQl1MzIgYkh0QWRob2M6MTsJLyogYWRob2MgY2FuIHVzZSBodCByYXRlLiAqLworCQl1MzIgYjIwNDBDb2V4aXN0U2NhblN1cDoxOwkvKkFzIFN0YSwgc3VwcG9ydCBkbyAyMDQwIGNvZXhpc3RlbmNlIHNjYW4gZm9yIEFQLiBBcyBBcCwgc3VwcG9ydCBtb25pdG9yIHRyaWdnZXIgZXZlbnQgdG8gY2hlY2sgaWYgY2FuIHVzZSBCVyA0ME1Iei4gKi8KKwkJdTMyIDogNDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOwogfSBCQUNBUF9TVFJVQywgKlBCQUNBUF9TVFJVQzsKIAotLy9UaGlzIHN0cnVjdHVyZSBpcyBmb3IgYWxsIDgwMi4xMW4gY2FyZCBJbnRlck9wdGliaWxpdHlUZXN0IGFjdGlvbi4gUmVzZXQgYWxsIE51bSBldmVyeSBuIHNlY29uZC4gIChEZXRhaWxzIHNlZSBNTE1FUGVyaW9kaWMpCi10eXBlZGVmCXN0cnVjdAlfSU9UX1NUUlVDCXsKLQlVQ0hBUgkJCVRocmVzaG9sZFsyXTsKLQlVQ0hBUgkJCVJlb3JkZXJUaW1lT3V0TnVtW01BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFXTsJLy8gY29tcGFyZSB3aXRoIHRocmVzaG9sZFswXQotCVVDSEFSCQkJUmVmcmVzaE51bVtNQVhfTEVOX09GX0JBX1JFQ19UQUJMRV07CS8vIGNvbXBhcmUgd2l0aCB0aHJlc2hvbGRbMV0KLQlVTE9ORwkJCU9uZVNlY0luV2luZG93Q291bnQ7Ci0JVUxPTkcJCQlPbmVTZWNGcmFtZUR1cGxpY2F0ZUNvdW50OwotCVVMT05HCQkJT25lU2VjT3V0V2luZG93Q291bnQ7Ci0JVUNIQVIJCQlEZWxPcmlBY3Q7Ci0JVUNIQVIJCQlEZWxSZWNBY3Q7Ci0JVUNIQVIJCQlSVFNTaG9ydFByb3Q7Ci0JVUNIQVIJCQlSVFNMb25nUHJvdDsKLQlCT09MRUFOCQkJYlJUU0xvbmdQcm90T247Ci0JQk9PTEVBTgkJCWJMYXN0QXRoZXJvczsKLSAgICBCT09MRUFOCQkJYkN1cnJlbnRBdGhlcm9zOwotICAgIEJPT0xFQU4gICAgICAgICBiTm93QXRoZXJvc0J1cnN0T247Ci0JQk9PTEVBTgkJCWJOZXh0RGlzYWJsZVJ4QkE7Ci0gICAgQk9PTEVBTgkJCWJUb2dnbGU7Ci19IElPVF9TVFJVQywgKlBJT1RfU1RSVUM7CitzdHJ1Y3QgcnRfb2lkX2FkZF9iYV9lbnRyeSB7CisJQk9PTEVBTiBJc1JlY2lwaWVudDsKKwl1OCBNQUNBZGRyW01BQ19BRERSX0xFTl07CisJdTggVElEOworCXU4IG5NU0RVOworCXUxNiBUaW1lT3V0OworCUJPT0xFQU4gYkFsbFRpZDsJLyogSWYgVHJ1ZSwgZGVsZXRlIGFsbCBUSUQgZm9yIEJBIHNlc3Npb25zIHdpdGggdGhpcyBNQUNhZGRyLiAqLworfTsKIAotLy8gVGhpcyBpcyB0aGUgcmVnaXN0cnkgc2V0dGluZyBmb3IgODAyLjExbiB0cmFuc21pdCBzZXR0aW5nLiAgVXNlZCBpbiBhZHZhbmNlZCBwYWdlLgorI2RlZmluZSBJU19IVF9TVEEoX3BNYWNFbnRyeSkJXAorCShfcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorCisjZGVmaW5lIElTX0hUX1JBVEUoX3BNYWNFbnRyeSkJXAorCShfcE1hY0VudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorCisjZGVmaW5lIFBFRVJfSVNfSFRfUkFURShfcE1hY0VudHJ5KQlcCisJKF9wTWFjRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCisKKy8qVGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIGFsbCA4MDIuMTFuIGNhcmQgSW50ZXJPcHRpYmlsaXR5VGVzdCBhY3Rpb24uIFJlc2V0IGFsbCBOdW0gZXZlcnkgbiBzZWNvbmQuICAoRGV0YWlscyBzZWUgTUxNRVBlcmlvZGljKSAqLworc3RydWN0IHJ0X2lvdCB7CisJdTggVGhyZXNob2xkWzJdOworCXU4IFJlb3JkZXJUaW1lT3V0TnVtW01BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFXTsJLyogY29tcGFyZSB3aXRoIHRocmVzaG9sZFswXSAqLworCXU4IFJlZnJlc2hOdW1bTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEVdOwkvKiBjb21wYXJlIHdpdGggdGhyZXNob2xkWzFdICovCisJdW5zaWduZWQgbG9uZyBPbmVTZWNJbldpbmRvd0NvdW50OworCXVuc2lnbmVkIGxvbmcgT25lU2VjRnJhbWVEdXBsaWNhdGVDb3VudDsKKwl1bnNpZ25lZCBsb25nIE9uZVNlY091dFdpbmRvd0NvdW50OworCXU4IERlbE9yaUFjdDsKKwl1OCBEZWxSZWNBY3Q7CisJdTggUlRTU2hvcnRQcm90OworCXU4IFJUU0xvbmdQcm90OworCUJPT0xFQU4gYlJUU0xvbmdQcm90T247CisJQk9PTEVBTiBiTGFzdEF0aGVyb3M7CisJQk9PTEVBTiBiQ3VycmVudEF0aGVyb3M7CisJQk9PTEVBTiBiTm93QXRoZXJvc0J1cnN0T247CisJQk9PTEVBTiBiTmV4dERpc2FibGVSeEJBOworCUJPT0xFQU4gYlRvZ2dsZTsKK307CisKKy8qIFRoaXMgaXMgdGhlIHJlZ2lzdHJ5IHNldHRpbmcgZm9yIDgwMi4xMW4gdHJhbnNtaXQgc2V0dGluZy4gIFVzZWQgaW4gYWR2YW5jZWQgcGFnZS4gKi8KIHR5cGVkZWYgdW5pb24gX1JFR19UUkFOU01JVF9TRVRUSU5HIHsKLSBzdHJ1Y3QgewotCQkgVUlOVDMyICByc3YwOjEwOwotCQkgVUlOVDMyICBUeEJGOjE7Ci0gICAgICAgICBVSU5UMzIgIEJXOjE7IC8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6Ci0gICAgICAgICBVSU5UMzIgIFNob3J0R0k6MTsKLSAgICAgICAgIFVJTlQzMiAgU1RCQzoxOyAvL1NQQUNFCi0gICAgICAgICBVSU5UMzIgIFRSQU5TTk86MjsKLSAgICAgICAgIFVJTlQzMiAgSFRNT0RFOjE7Ci0gICAgICAgICBVSU5UMzIgIEVYVENIQToyOwotICAgICAgICAgVUlOVDMyICByc3Y6MTM7Ci0gICAgfSBmaWVsZDsKLSBVSU5UMzIgICB3b3JkOworCXN0cnVjdCB7CisJCS8qdTMyICBQaHlNb2RlOjQ7ICovCisJCS8qdTMyICBNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUyAqLworCQl1MzIgcnN2MDoxMDsKKwkJdTMyIFR4QkY6MTsKKwkJdTMyIEJXOjE7CS8qY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6ICovCisJCXUzMiBTaG9ydEdJOjE7CisJCXUzMiBTVEJDOjE7CS8qU1BBQ0UgKi8KKwkJdTMyIFRSQU5TTk86MjsKKwkJdTMyIEhUTU9ERToxOworCQl1MzIgRVhUQ0hBOjI7CisJCXUzMiByc3Y6MTM7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKIH0gUkVHX1RSQU5TTUlUX1NFVFRJTkcsICpQUkVHX1RSQU5TTUlUX1NFVFRJTkc7CiAKLXR5cGVkZWYgdW5pb24gIF9ERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgewotCXN0cnVjdAl7Ci0JCQlVU0hPUlQgICAJTUNTOjc7ICAgICAgICAgICAgICAgICAJLy8gTUNTCi0JCQlVU0hPUlQJCVBoeU1vZGU6NDsKLQkJCVVTSE9SVAkgCUZpeGVkVHhNb2RlOjI7CQkJLy8gSWYgTUNTIGlzbid0IEFVVE8sIGZpeCByYXRlIGluIENDSywgT0ZETSBvciBIVCBtb2RlLgotCQkJVVNIT1JUCQlyc3Y6MzsKLQl9CWZpZWxkOwotCVVTSE9SVAkJd29yZDsKLSB9IERFU0lSRURfVFJBTlNNSVRfU0VUVElORywgKlBERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkc7Cit0eXBlZGVmIHVuaW9uIF9ERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgeworCXN0cnVjdCB7CisJCXUxNiBNQ1M6NzsJLyogTUNTICovCisJCXUxNiBQaHlNb2RlOjQ7CisJCXUxNiBGaXhlZFR4TW9kZToyOwkvKiBJZiBNQ1MgaXNuJ3QgQVVUTywgZml4IHJhdGUgaW4gQ0NLLCBPRkRNIG9yIEhUIG1vZGUuICovCisJCXUxNiByc3Y6MzsKKwl9IGZpZWxkOworCXUxNiB3b3JkOworfSBERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcsICpQREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HOwogCi10eXBlZGVmIHN0cnVjdCB7Ci0JQk9PTEVBTgkJSXNSZWNpcGllbnQ7Ci0JVUNIQVIgICBNQUNBZGRyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICBUSUQ7Ci0JVUNIQVIgICBuTVNEVTsKLQlVU0hPUlQgICBUaW1lT3V0OwotCUJPT0xFQU4gYkFsbFRpZDsgIC8vIElmIFRydWUsIGRlbGV0ZSBhbGwgVElEIGZvciBCQSBzZXNzaW9ucyB3aXRoIHRoaXMgTUFDYWRkci4KLX0gT0lEX0FERF9CQV9FTlRSWSwgKlBPSURfQUREX0JBX0VOVFJZOworI2lmZGVmIFJUTVBfTUFDX1VTQgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCVVTQi1iYXNlZCBjaGlwIEJlYWNvbiByZWxhdGVkIGRhdGEgc3RydWN0dXJlcworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQkVBQ09OX0JJVE1BUF9NQVNLCQkweGZmCitzdHJ1Y3QgcnRfYmVhY29uX3N5bmMgeworCXU4IEJlYWNvbkJ1ZltIV19CRUFDT05fTUFYX0NPVU5UXVtIV19CRUFDT05fT0ZGU0VUXTsKKwl1OCBCZWFjb25UeFdJW0hXX0JFQUNPTl9NQVhfQ09VTlRdW1RYV0lfU0laRV07CisJdW5zaWduZWQgbG9uZyBUaW1JRUxvY2F0aW9uSW5CZWFjb25bSFdfQkVBQ09OX01BWF9DT1VOVF07CisJdW5zaWduZWQgbG9uZyBDYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb25bSFdfQkVBQ09OX01BWF9DT1VOVF07CisJQk9PTEVBTiBFbmFibGVCZWFjb247CS8qIHRyaWdnZXIgdG8gZW5hYmxlIGJlYWNvbiB0cmFuc21pc3Npb24uICovCisJdTggQmVhY29uQml0TWFwOwkvKiBOT1RFOiBJZiB0aGUgTUFYX01CU1NJRF9OVU0gaXMgbGFyZ2VyIHRoYW4gOCwgdGhpcyBwYXJhbWV0ZXIgbmVlZCB0byBjaGFuZ2UuICovCisJdTggRHRpbUJpdE9uOwkvKiBOT1RFOiBJZiB0aGUgTUFYX01CU1NJRF9OVU0gaXMgbGFyZ2VyIHRoYW4gOCwgdGhpcyBwYXJhbWV0ZXIgbmVlZCB0byBjaGFuZ2UuICovCit9OworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCi0vLwotLy8gTXVsdGlwbGUgU1NJRCBzdHJ1Y3R1cmUKLS8vCi0jZGVmaW5lIFdMQU5fTUFYX05VTV9PRl9USU0JCQkoKE1BWF9MRU5fT0ZfTUFDX1RBQkxFID4+IDMpICsgMSkgLyogLzggKyAxICovCi0jZGVmaW5lIFdMQU5fQ1RfVElNX0JDTUNfT0ZGU0VUCQkwIC8qIHVuaXQ6IDMyQiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCU11bHRpcGxlIFNTSUQgcmVsYXRlZCBkYXRhIHN0cnVjdHVyZXMKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFdMQU5fTUFYX05VTV9PRl9USU0JCQkoKE1BWF9MRU5fT0ZfTUFDX1RBQkxFID4+IDMpICsgMSkJLyogLzggKyAxICovCisjZGVmaW5lIFdMQU5fQ1RfVElNX0JDTUNfT0ZGU0VUCQkwCS8qIHVuaXQ6IDMyQiAqLwogCiAvKiBjbGVhciBiY21jIFRJTSBiaXQgKi8KICNkZWZpbmUgV0xBTl9NUl9USU1fQkNNQ19DTEVBUihhcGlkeCkgXApAQCAtMTY3OCwxMzIyICsxMTU3LDEwMzAgQEAKIAogLyogY2xlYXIgYSBzdGF0aW9uIFBTIFRJTSBiaXQgKi8KICNkZWZpbmUgV0xBTl9NUl9USU1fQklUX0NMRUFSKGFkX3AsIGFwaWR4LCB3Y2lkKSBcCi0JewlVQ0hBUiB0aW1fb2Zmc2V0ID0gd2NpZCA+PiAzOyBcCi0JCVVDSEFSIGJpdF9vZmZzZXQgPSB3Y2lkICYgMHg3OyBcCisJewl1OCB0aW1fb2Zmc2V0ID0gd2NpZCA+PiAzOyBcCisJCXU4IGJpdF9vZmZzZXQgPSB3Y2lkICYgMHg3OyBcCiAJCWFkX3AtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uVGltQml0bWFwc1t0aW1fb2Zmc2V0XSAmPSAofkJJVDhbYml0X29mZnNldF0pOyB9CiAKIC8qIHNldCBhIHN0YXRpb24gUFMgVElNIGJpdCAqLwogI2RlZmluZSBXTEFOX01SX1RJTV9CSVRfU0VUKGFkX3AsIGFwaWR4LCB3Y2lkKSBcCi0JewlVQ0hBUiB0aW1fb2Zmc2V0ID0gd2NpZCA+PiAzOyBcCi0JCVVDSEFSIGJpdF9vZmZzZXQgPSB3Y2lkICYgMHg3OyBcCisJewl1OCB0aW1fb2Zmc2V0ID0gd2NpZCA+PiAzOyBcCisJCXU4IGJpdF9vZmZzZXQgPSB3Y2lkICYgMHg3OyBcCiAJCWFkX3AtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uVGltQml0bWFwc1t0aW1fb2Zmc2V0XSB8PSBCSVQ4W2JpdF9vZmZzZXRdOyB9CiAKLSNpZmRlZiBSVDI4NzAKLSNkZWZpbmUgQkVBQ09OX0JJVE1BUF9NQVNLCQkweGZmCi10eXBlZGVmIHN0cnVjdCBfQkVBQ09OX1NZTkNfU1RSVUNUXwotewotCVVDSEFSICAgICAgICAJCQlCZWFjb25CdWZbSFdfQkVBQ09OX01BWF9DT1VOVF1bSFdfQkVBQ09OX09GRlNFVF07Ci0JVUNIQVIJCQkJCUJlYWNvblR4V0lbSFdfQkVBQ09OX01BWF9DT1VOVF1bVFhXSV9TSVpFXTsKLQlVTE9ORyAJCQkJCVRpbUlFTG9jYXRpb25JbkJlYWNvbltIV19CRUFDT05fTUFYX0NPVU5UXTsKLQlVTE9ORwkJCQkJQ2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW0hXX0JFQUNPTl9NQVhfQ09VTlRdOwotCUJPT0xFQU4JCQkJCUVuYWJsZUJlYWNvbjsJCS8vIHRyaWdnZXIgdG8gZW5hYmxlIGJlYWNvbiB0cmFuc21pc3Npb24uCi0JVUNIQVIJCQkJCUJlYWNvbkJpdE1hcDsJCS8vIE5PVEU6IElmIHRoZSBNQVhfTUJTU0lEX05VTSBpcyBsYXJnZXIgdGhhbiA4LCB0aGlzIHBhcmFtZXRlciBuZWVkIHRvIGNoYW5nZS4KLQlVQ0hBUgkJCQkJRHRpbUJpdE9uOwkJCS8vIE5PVEU6IElmIHRoZSBNQVhfTUJTU0lEX05VTSBpcyBsYXJnZXIgdGhhbiA4LCB0aGlzIHBhcmFtZXRlciBuZWVkIHRvIGNoYW5nZS4KLX1CRUFDT05fU1lOQ19TVFJVQ1Q7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisvKiBjb25maWd1cmF0aW9uIGNvbW1vbiB0byBPUE1PREVfQVAgYXMgd2VsbCBhcyBPUE1PREVfU1RBICovCitzdHJ1Y3QgcnRfY29tbW9uX2NvbmZpZyB7CiAKLXR5cGVkZWYgc3RydWN0IF9NVUxUSVNTSURfU1RSVUNUIHsKLQlVQ0hBUgkJCQkJCQkJQnNzaWRbTUFDX0FERFJfTEVOXTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTc2lkTGVuOwotICAgIENIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKLSAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXBhYmlsaXR5SW5mbzsKKwlCT09MRUFOIGJDb3VudHJ5RmxhZzsKKwl1OCBDb3VudHJ5Q29kZVszXTsKKwl1OCBHZW9ncmFwaHk7CisJdTggQ291bnRyeVJlZ2lvbjsJLyogRW51bSBvZiBjb3VudHJ5IHJlZ2lvbiwgMDpGQ0MsIDE6SUMsIDI6RVRTSSwgMzpTUEFJTiwgNDpGcmFuY2UsIDU6TUtLLCA2Ok1LSzEsIDc6SXNyYWVsICovCisJdTggQ291bnRyeVJlZ2lvbkZvckFCYW5kOwkvKiBFbnVtIG9mIGNvdW50cnkgcmVnaW9uIGZvciBBIGJhbmQgKi8KKwl1OCBQaHlNb2RlOwkJLyogUEhZXzExQSwgUEhZXzExQiwgUEhZXzExQkdfTUlYRUQsIFBIWV9BQkdfTUlYRUQgKi8KKwl1MTYgRHNpZnM7CQkvKiBpbiB1bml0cyBvZiB1c2VjICovCisJdW5zaWduZWQgbG9uZyBQYWNrZXRGaWx0ZXI7CS8qIFBhY2tldCBmaWx0ZXIgZm9yIHJlY2VpdmluZyAqLworCXU4IFJlZ3VsYXRvcnlDbGFzczsKIAotICAgIFBORVRfREVWICAgICAgICAgICAgICAgICAgIAkJCU1TU0lERGV2OworCWNoYXIgU3NpZFtNQVhfTEVOX09GX1NTSURdOwkvKiBOT1QgTlVMTC10ZXJtaW5hdGVkICovCisJdTggU3NpZExlbjsJCS8qIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZCAqLworCXU4IExhc3RTc2lkTGVuOwkvKiB0aGUgYWN0dWFsIHNzaWQgbGVuZ3RoIGluIHVzZWQgKi8KKwljaGFyIExhc3RTc2lkW01BWF9MRU5fT0ZfU1NJRF07CS8qIE5PVCBOVUxMLXRlcm1pbmF0ZWQgKi8KKwl1OCBMYXN0QnNzaWRbTUFDX0FERFJfTEVOXTsKIAotCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOwotCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKLQlORElTXzgwMl8xMV9XRVBfU1RBVFVTCQkJCUdyb3VwS2V5V2VwU3RhdHVzOwotCVdQQV9NSVhfUEFJUl9DSVBIRVIJCQkJCVdwYU1peFBhaXJDaXBoZXI7CisJdTggQnNzaWRbTUFDX0FERFJfTEVOXTsKKwl1MTYgQmVhY29uUGVyaW9kOworCXU4IENoYW5uZWw7CisJdTggQ2VudHJhbENoYW5uZWw7CS8qIENlbnRyYWwgQ2hhbm5lbCB3aGVuIHVzaW5nIDQwTUh6IGlzIGluZGljYXRpbmcuIG5vdCByZWFsIGNoYW5uZWwuICovCiAKLQlVTE9ORwkJCQkJCQkJVHhDb3VudDsKLQlVTE9ORwkJCQkJCQkJUnhDb3VudDsKLQlVTE9ORwkJCQkJCQkJUmVjZWl2ZWRCeXRlQ291bnQ7Ci0JVUxPTkcJCQkJCQkJCVRyYW5zbWl0dGVkQnl0ZUNvdW50OwotCVVMT05HCQkJCQkJCQlSeEVycm9yQ291bnQ7Ci0JVUxPTkcJCQkJCQkJCVJ4RHJvcENvdW50OworCXU4IFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCXU4IFN1cFJhdGVMZW47CisJdTggRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJdTggRXh0UmF0ZUxlbjsKKwl1OCBEZXNpcmVSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsJLyogT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTICovCisJdTggTWF4RGVzaXJlZFJhdGU7CisJdTggRXhwZWN0ZWRBQ0tSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKIAotCUhUVFJBTlNNSVRfU0VUVElORwkJCQkJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsvLyBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4KLQlSVF9IVF9QSFlfSU5GTwkJCQkJCURlc2lyZWRIdFBoeUluZm87Ci0JREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HICAgICAgICAJRGVzaXJlZFRyYW5zbWl0U2V0dGluZzsgLy8gRGVzaXJlZCB0cmFuc21pdCBzZXR0aW5nLiB0aGlzIGlzIGZvciByZWFkaW5nIHJlZ2lzdHJ5IHNldHRpbmcgb25seS4gbm90IHVzZWZ1bC4KLQlCT09MRUFOCQkJCQkJCQliQXV0b1R4UmF0ZVN3aXRjaDsKKwl1bnNpZ25lZCBsb25nIEJhc2ljUmF0ZUJpdG1hcDsJLyogYmFja3VwIGJhc2ljIHJhdGViaXRtYXAgKi8KIAotCVVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRLZXlJZDsKKwlCT09MRUFOIGJBUFNEQ2FwYWJsZTsKKwlCT09MRUFOIGJJblNlcnZpY2VQZXJpb2Q7CisJQk9PTEVBTiBiQVBTREFDX0JFOworCUJPT0xFQU4gYkFQU0RBQ19CSzsKKwlCT09MRUFOIGJBUFNEQUNfVkk7CisJQk9PTEVBTiBiQVBTREFDX1ZPOwogCi0JVUNIQVIJCQkJCQkJCVR4UmF0ZTsgICAgICAgLy8gUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExLCAuLi4KLQlVQ0hBUiAgICAgCQkJCQkJCURlc2lyZWRSYXRlc1tNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ly8gT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCi0JVUNIQVIJCQkJCQkJCURlc2lyZWRSYXRlc0luZGV4OwotCVVDSEFSICAgICAJCQkJCQkJTWF4VHhSYXRlOyAgICAgICAgICAgIC8vIFJBVEVfMSwgUkFURV8yLCBSQVRFXzVfNSwgUkFURV8xMQorCS8qIGJlY2F1c2UgVFNQRUMgY2FuIG1vZGlmeSB0aGUgQVBTRCBmbGFnLCB3ZSBuZWVkIHRvIGtlZXAgdGhlIEFQU0QgZmxhZworCSAgIHJlcXVlc3RlZCBpbiBhc3NvY2lhdGlvbiBzdGFnZSBmcm9tIHRoZSBzdGF0aW9uOworCSAgIHdlIG5lZWQgdG8gcmVjb3ZlciB0aGUgQVBTRCBmbGFnIGFmdGVyIHRoZSBUU1BFQyBpcyBkZWxldGVkLiAqLworCUJPT0xFQU4gYkFDTUFQU0RCYWNrdXBbNF07CS8qIGZvciBkZWxpdmVyeS1lbmFibGVkICYgdHJpZ2dlci1lbmFibGVkIGJvdGggKi8KKwlCT09MRUFOIGJBQ01BUFNEVHJbNF07CS8qIG5vIHVzZSAqLwogCi0JVUNIQVIJCQkJCQkJCVRpbUJpdG1hcHNbV0xBTl9NQVhfTlVNX09GX1RJTV07CisJQk9PTEVBTiBiTmVlZFNlbmRUcmlnZ2VyRnJhbWU7CisJQk9PTEVBTiBiQVBTREZvcmNlUG93ZXJTYXZlOwkvKiBGb3JjZSBwb3dlciBzYXZlIG1vZGUsIHNob3VsZCBvbmx5IHVzZSBpbiBBUFNELVNUQVVUICovCisJdW5zaWduZWQgbG9uZyBUcmlnZ2VyVGltZXJDb3VudDsKKwl1OCBNYXhTUExlbmd0aDsKKwl1OCBCQlBDdXJyZW50Qlc7CS8qIEJXXzEwLCAgICAgICBCV18yMCwgQldfNDAgKi8KKwkvKiBtb3ZlIHRvIE1VTFRJU1NJRF9TVFJVQ1QgZm9yIE1CU1MgKi8KKwkvKkhUVFJBTlNNSVRfU0VUVElORyAgICBIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOy8vIEZvciB0cmFuc21pdCBwaHkgc2V0dGluZyBpbiBUWFdJLiAqLworCVJFR19UUkFOU01JVF9TRVRUSU5HIFJlZ1RyYW5zbWl0U2V0dGluZzsJLypyZWdpc3RyeSB0cmFuc21pdCBzZXR0aW5nLiB0aGlzIGlzIGZvciByZWFkaW5nIHJlZ2lzdHJ5IHNldHRpbmcgb25seS4gbm90IHVzZWZ1bC4gKi8KKwkvKnU4ICAgICAgIEZpeGVkVHhNb2RlOyAgICAgICAgICAgICAgLy8gRml4ZWQgVHggTW9kZSAoQ0NLLCBPRkRNKSwgZm9yIEhUIGZpeGVkIHR4IG1vZGUgKEdGLCBNSVgpICwgcmVmZXIgdG8gUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTW9kZSAqLworCXU4IFR4UmF0ZTsJCS8qIFNhbWUgdmFsdWUgdG8gZmlsbCBpbiBUWEQuIFR4UmF0ZSBpcyA2LWJpdCAqLworCXU4IE1heFR4UmF0ZTsJLyogUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExICovCisJdTggVHhSYXRlSW5kZXg7CS8qIFR4IHJhdGUgaW5kZXggaW4gUmF0ZVN3aXRjaFRhYmxlICovCisJdTggVHhSYXRlVGFibGVTaXplOwkvKiBWYWxpZCBUeCByYXRlIHRhYmxlIHNpemUgaW4gUmF0ZVN3aXRjaFRhYmxlICovCisJLypCT09MRUFOICAgICAgICAgICAgICAgYkF1dG9UeFJhdGVTd2l0Y2g7ICovCisJdTggTWluVHhSYXRlOwkvKiBSQVRFXzEsIFJBVEVfMiwgUkFURV81XzUsIFJBVEVfMTEgKi8KKwl1OCBSdHNSYXRlOwkJLyogUkFURV94eHggKi8KKwlIVFRSQU5TTUlUX1NFVFRJTkcgTWxtZVRyYW5zbWl0OwkvKiBNR01UIGZyYW1lIFBIWSByYXRlIHNldHRpbmcgd2hlbiBvcGVyYXRpbiBhdCBIdCByYXRlLiAqLworCXU4IE1sbWVSYXRlOwkJLyogUkFURV94eHgsIHVzZWQgdG8gc2VuZCBNTE1FIGZyYW1lcyAqLworCXU4IEJhc2ljTWxtZVJhdGU7CS8qIERlZmF1bHQgUmF0ZSBmb3Igc2VuZGluZyBNTE1FIGZyYW1lcyAqLwogCi0gICAgLy8gV1BBCi0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01LWzMyXTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUtbMzJdOwotCVVDSEFSCQkJCQkJCQlHVEtbMzJdOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxWDsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVBdXRoOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdOb25jZVszMl07Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydFNlY3VyZWQ7Ci0gICAgTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIgICAgICAgICAgUHJpdmFjeUZpbHRlcjsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQU5DbGFzczNEYXRhOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzb2xhdGVJbnRlclN0YVRyYWZmaWM7CisJdTE2IFJ0c1RocmVzaG9sZDsJLyogaW4gdW5pdCBvZiBCWVRFICovCisJdTE2IEZyYWdtZW50VGhyZXNob2xkOwkvKiBpbiB1bml0IG9mIEJZVEUgKi8KIAotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTTklFX0xlblsyXTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU05fSUVbMl1bTUFYX0xFTl9PRl9SU05JRV07CisJdTggVHhQb3dlcjsJCS8qIGluIHVuaXQgb2YgbVcgKi8KKwl1bnNpZ25lZCBsb25nIFR4UG93ZXJQZXJjZW50YWdlOwkvKiAwfjEwMCAlICovCisJdW5zaWduZWQgbG9uZyBUeFBvd2VyRGVmYXVsdDsJLyoga2VlcCBmb3IgVHhQb3dlclBlcmNlbnRhZ2UgKi8KKwl1OCBQd3JDb25zdHJhaW50OwogCisJQkFDQVBfU1RSVUMgQkFDYXBhYmlsaXR5OwkvKiAgIE5PIFVTRSA9IDBYRkYgIDsgIElNTUVEX0JBID0xICA7ICBERUxBWV9CQT0wICovCisJQkFDQVBfU1RSVUMgUkVHQkFDYXBhYmlsaXR5OwkvKiAgIE5PIFVTRSA9IDBYRkYgIDsgIElNTUVEX0JBID0xICA7ICBERUxBWV9CQT0wICovCiAKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAJCQlUaW1JRUxvY2F0aW9uSW5CZWFjb247Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgCQkJQ2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uOwotICAgIC8vIG91dGdvaW5nIEJFQUNPTiBmcmFtZSBidWZmZXIgYW5kIGNvcnJlc3BvbmRpbmcgVFhXSQotCS8vIFBUWFdJX1NUUlVDICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhY29uVHhXSTsgLy8KLSAgICBDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWFjb25CdWZbTUFYX0JFQUNPTl9TSVpFXTsgLy8gTk9URTogQmVhY29uQnVmIHNob3VsZCBiZSA0LWJ5dGUgYWxpZ25lZAorCXN0cnVjdCBydF9pb3QgSU9UZXN0UGFybTsJLyogODAyLjExbiBJbnRlck9wYmlsaXR5IFRlc3QgUGFyYW1ldGVyOyAqLworCXVuc2lnbmVkIGxvbmcgVHhQcmVhbWJsZTsJLyogUnQ4MDJfMTFQcmVhbWJsZUxvbmcsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCwgUnQ4MDJfMTFQcmVhbWJsZUF1dG8gKi8KKwlCT09MRUFOIGJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQ7CS8qIE1pY3Jvc29mdCB1c2UgMCBhcyBkaXNhYmxlICovCisJdW5zaWduZWQgbG9uZyBVc2VCR1Byb3RlY3Rpb247CS8qIDA6IGF1dG8sIDE6IGFsd2F5cyB1c2UsIDI6IGFsd2F5cyBub3QgdXNlICovCisJQk9PTEVBTiBiVXNlU2hvcnRTbG90VGltZTsJLyogMDogZGlzYWJsZSwgMSAtIHVzZSBzaG9ydCBzbG90ICg5dXMpICovCisJQk9PTEVBTiBiRW5hYmxlVHhCdXJzdDsJLyogMTogZW5ibGUgVFggUEFDS0VUIEJVUlNUICh3aGVuIEJBIGlzIGVzdGFibGlzaGVkIG9yIEFQIGlzIG5vdCBhIGxlZ2FjeSBXTU0gQVApLCAwOiBkaXNhYmxlIFRYIFBBQ0tFVCBCVVJTVCAqLworCUJPT0xFQU4gYkFnZ3JlZ2F0aW9uQ2FwYWJsZTsJLyogMTogZW5hYmxlIFRYIGFnZ3JlZ2F0aW9uIHdoZW4gdGhlIHBlZXIgc3VwcG9ydHMgaXQgKi8KKwlCT09MRUFOIGJQaWdneUJhY2tDYXBhYmxlOwkvKiAxOiBlbmFibGUgVFggcGlnZ3ktYmFjayBhY2NvcmRpbmcgTUFDJ3MgdmVyc2lvbiAqLworCUJPT0xFQU4gYklFRUU4MDIxMUg7CS8qIDE6IGVuYWJsZSBJRUVFODAyLjExaCBzcGVjLiAqLworCXVuc2lnbmVkIGxvbmcgRGlzYWJsZU9MQkNEZXRlY3Q7CS8qIDA6IGVuYWJsZSBPTEJDIGRldGVjdDsgMSBkaXNhYmxlIE9MQkMgZGV0ZWN0ICovCiAKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSGlkZVNzaWQ7Ci0JVUlOVDE2CQkJCQkJCQlTdGF0aW9uS2VlcEFsaXZlVGltZTsgLy8gdW5pdDogc2Vjb25kCisJQk9PTEVBTiBiUmRnOwogCi0gICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkxBTl9WSUQ7Ci0gICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkxBTl9Qcmlvcml0eTsKKwlCT09MRUFOIGJXbW1DYXBhYmxlOwkvKiAwOmRpc2FibGUgV01NLCAxOmVuYWJsZSBXTU0gKi8KKwlzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSBBUFFvc0NhcGFiaWxpdHk7CS8qIFFPUyBjYXBhYmlsaXR5IG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAgKi8KKwlzdHJ1Y3QgcnRfZWRjYV9wYXJtIEFQRWRjYVBhcm07CS8qIEVEQ0EgcGFyYW1ldGVycyBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQICovCisJc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtIEFQUWJzc0xvYWQ7CS8qIFFCU1MgbG9hZCBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQICovCisJdTggQWNrUG9saWN5WzRdOwkvKiBBQ0sgcG9saWN5IG9mIHRoZSBzcGVjaWZpZWQgQUMuIHNlZSBBQ0tfeHh4ICovCisJQk9PTEVBTiBiRExTQ2FwYWJsZTsJLyogMDpkaXNhYmxlIERMUywgMTplbmFibGUgRExTICovCisJLyogYSBiaXRtYXAgb2YgQk9PTEVBTiBmbGFncy4gZWFjaCBiaXQgcmVwcmVzZW50IGFuIG9wZXJhdGlvbiBzdGF0dXMgb2YgYSBwYXJ0aWN1bGFyICovCisJLyogQk9PTEVBTiBjb250cm9sLCBlaXRoZXIgT04gb3IgT0ZGLiBUaGVzZSBmbGFncyBzaG91bGQgYWx3YXlzIGJlIGFjY2Vzc2VkIHZpYSAqLworCS8qIE9QU1RBVFVTX1RFU1RfRkxBRygpLCBPUFNUQVRVU19TRVRfRkxBRygpLCBPUF9TVEFUVVNfQ0xFQVJfRkxBRygpIG1hY3Jvcy4gKi8KKwkvKiBzZWUgZk9QX1NUQVRVU194eHggaW4gUlRNUF9ERUYuQyBmb3IgZGV0YWlsIGJpdCBkZWZpbml0aW9uICovCisJdW5zaWduZWQgbG9uZyBPcFN0YXR1c0ZsYWdzOwogCi0gICAgUlRfODAyXzExX0FDTAkJCQkJCUFjY2Vzc0NvbnRyb2xMaXN0OworCUJPT0xFQU4gTmRpc1JhZGlvU3RhdGVPZmY7CS8qRm9yIEhDVCAxMi4wLCBzZXQgdGhpcyBmbGFnIHRvIFRSVUUgaW5zdGVhZCBvZiBjYWxsZWQgTWxtZVJhZGlvT2ZmLiAqLworCUFCR0JBTkRfU1RBVEUgQmFuZFN0YXRlOwkvKiBGb3Igc2V0dGluZyBCQlAgdXNlZCBvbiBCL0cgb3IgQSBtb2RlLiAqLwogCi0JLy8gRURDQSBRb3MKLSAgICBCT09MRUFOCQkJCQkJCQliV21tQ2FwYWJsZTsJLy8gMDpkaXNhYmxlIFdNTSwgMTplbmFibGUgV01NCi0gICAgQk9PTEVBTgkJCQkJCQkJYkRMU0NhcGFibGU7CS8vIDA6ZGlzYWJsZSBETFMsIDE6ZW5hYmxlIERMUworCS8qIElFRUU4MDIuMTFILS1ERlMuICovCisJc3RydWN0IHJ0X3JhZGFyX2RldGVjdCBSYWRhckRldGVjdDsKIAotCVVDSEFSICAgICAgICAgICAJCQkJCURsc1BUS1s2NF07CQkvLyBEdWUgdG8gd2luZG93cyBkaXJ2ZXIgY291bnQgb24gbWVldGluZ2hvdXNlIHRvIGhhbmRsZSA0LXdheSBzaGFrZQorCS8qIEhUICovCisJdTggQkFTaXplOwkJLyogVVNlciBkZXNpcmVkIEJBV2luZG93U2l6ZS4gU2hvdWxkIG5vdCBleGNlZWQgb3VyIG1heCBjYXBhYmlsaXR5ICovCisJLypzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eSAgICAgIFN1cHBvcnRlZEh0UGh5OyAqLworCXN0cnVjdCBydF9odF9jYXBhYmlsaXR5IERlc2lyZWRIdFBoeTsKKwlzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSBIdENhcGFiaWxpdHk7CisJc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llIEFkZEhUSW5mbzsJLyogVXNlZnVsIGFzIEFQLiAqLworCS8qVGhpcyBJRSBpcyB1c2VkIHdpdGggY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGVsZW1lbnQgd2hlbiBjaGFuZ2luZyB0byBhIG5ldyA0ME1Iei4gKi8KKwkvKlRoaXMgSUUgaXMgaW5jbHVkZWQgaW4gY2hhbm5lbCBzd2l0Y2ggYW1tb3VuY2VtZW50IGZyYW1lcyA3LjQuMS41LCBiZWFjb25zLCBwcm9iZSBSc3AuICovCisJc3RydWN0IHJ0X25ld19leHRfY2hhbl9pZSBOZXdFeHRDaGFuT2Zmc2V0OwkvKjcuMy4yLjIwQSwgMSBpZiBleHRlbnNpb24gY2hhbm5lbCBpcyBhYm92ZSB0aGUgY29udHJvbCBjaGFubmVsLCAzIGlmIGJlbG93LCAwIGlmIG5vdCBwcmVzZW50ICovCiAKLQkvLyBGb3IgODAyLjF4IGRhZW1vbiBzZXR0aW5nIHBlciBCU1MKLQlVQ0hBUgkJCQkJCQkJcmFkaXVzX3Nydl9udW07Ci0JUkFESVVTX1NSVl9JTkZPCQkJCQkJcmFkaXVzX3Nydl9pbmZvW01BWF9SQURJVVNfU1JWX05VTV07CisJQk9PTEVBTiBiSFRQcm90ZWN0OworCUJPT0xFQU4gYk1JTU9QU0VuYWJsZTsKKwlCT09MRUFOIGJCQURlY2xpbmU7CisvKjIwMDgvMTEvMDU6IEtIIGFkZCB0byBzdXBwb3J0IEFudGVubmEgcG93ZXItc2F2aW5nIG9mIEFQPC0tICovCisJQk9PTEVBTiBiR3JlZW5BUEVuYWJsZTsKKy8qMjAwOC8xMS8wNTogS0ggYWRkIHRvIHN1cHBvcnQgQW50ZW5uYSBwb3dlci1zYXZpbmcgb2YgQVAtLT4gKi8KKwlCT09MRUFOIGJEaXNhYmxlUmVvcmRlcmluZzsKKwlCT09MRUFOIGJGb3J0eV9NaHpfSW50b2xlcmFudDsKKwlCT09MRUFOIGJFeHRDaGFubmVsU3dpdGNoQW5ub3VuY2VtZW50OworCUJPT0xFQU4gYlJjdkJTU1dpZHRoVHJpZ2dlckV2ZW50czsKKwl1bnNpZ25lZCBsb25nIExhc3RSY3ZCU1NXaWR0aFRyaWdnZXJFdmVudHNUaW1lOwogCi0jaWZkZWYgUlRMODY1WF9TT0MKLQl1bnNpZ25lZCBpbnQJCQkJCQlteWxpbmtpZDsKKwl1OCBUeEJBU2l6ZTsKKworCS8qIEVuYWJsZSB3aXJlbGVzcyBldmVudCAqLworCUJPT0xFQU4gYldpcmVsZXNzRXZlbnQ7CisJQk9PTEVBTiBiV2lGaVRlc3Q7CS8qIEVuYWJsZSB0aGlzIHBhcmFtZXRlciBmb3IgV2lGaSB0ZXN0ICovCisKKwkvKiBUeCAmIFJ4IFN0cmVhbSBudW1iZXIgc2VsZWN0aW9uICovCisJdTggVHhTdHJlYW07CisJdTggUnhTdHJlYW07CisKKwlCT09MRUFOIGJIYXJkd2FyZVJhZGlvOwkvKiBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIGVuYWJsZWQgKi8KKworI2lmZGVmIFJUTVBfTUFDX1VTQgorCUJPT0xFQU4gYk11bHRpcGxlSVJQOwkvKiBNdWx0aXBsZSBCdWxrIElOIGZsYWcgKi8KKwl1OCBOdW1PZkJ1bGtJbklSUDsJLyogaWYgYk11bHRpcGxlSVJQID09IFRSVUUsIE51bU9mQnVsa0luSVJQIHdpbGwgYmUgNCBvdGhlcndpc2UgYmUgMSAqLworCXN0cnVjdCBydF9odF9jYXBhYmlsaXR5IFN1cHBvcnRlZEh0UGh5OworCXVuc2lnbmVkIGxvbmcgTWF4UGt0T25lVHhCdWxrOworCXU4IFR4QnVsa0ZhY3RvcjsKKwl1OCBSeEJ1bGtGYWN0b3I7CisKKwlCT09MRUFOIElzVXBkYXRlQmVhY29uOworCXN0cnVjdCBydF9iZWFjb25fc3luYyAqcEJlYWNvblN5bmM7CisJc3RydWN0IHJ0X3JhbGlua190aW1lciBCZWFjb25VcGRhdGVUaW1lcjsKKwl1MzIgQmVhY29uQWRqdXN0OworCXUzMiBCZWFjb25GYWN0b3I7CisJdTMyIEJlYWNvblJlbWFpbjsKKyNlbmRpZgkJCQkvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworCXNwaW5sb2NrX3QgTWVhc3VyZVJlcVRhYkxvY2s7CisJc3RydWN0IHJ0X21lYXN1cmVfcmVxX3RhYiAqcE1lYXN1cmVSZXFUYWI7CisKKwlzcGlubG9ja190IFRwY1JlcVRhYkxvY2s7CisJc3RydWN0IHJ0X3RwY19yZXFfdGFiICpwVHBjUmVxVGFiOworCisJQk9PTEVBTiBQU1BYbGluazsJLyogMDogRGlzYWJsZS4gMTogRW5hYmxlICovCisKKyNpZiBkZWZpbmVkKFJUMzA1eCl8fGRlZmluZWQoUlQzMHh4KQorCS8qIHJlcXVlc3QgYnkgR2FyeSwgZm9yIEhpZ2ggUG93ZXIgaXNzdWUgKi8KKwl1OCBIaWdoUG93ZXJQYXRjaERpc2FibGVkOwogI2VuZGlmCiAKLQotCVVJTlQzMgkJCQkJUmN2ZENvbmZsaWN0U3NpZENvdW50OwotCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRBc3NvY1Jlc3BDb3VudDsKLQlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkUmVhc3NvY1Jlc3BDb3VudDsKLQlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkUHJvYmVSZXNwQ291bnQ7Ci0JVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZEJlYWNvbkNvdW50OwotCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWREaXNhc3NvY0NvdW50OwotCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRBdXRoQ291bnQ7Ci0JVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZERlYXV0aENvdW50OwotCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRVbmtub3duTWdtdENvdW50OwotCVVJTlQzMgkJCQkJUmN2ZFJlcGxheUF0dGFja0NvdW50OwotCi0JQ0hBUgkJCQkJUnNzaU9mUmN2ZENvbmZsaWN0U3NpZDsKLQlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZEFzc29jUmVzcDsKLQlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZFJlYXNzb2NSZXNwOwotCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkUHJvYmVSZXNwOwotCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkQmVhY29uOwotCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkRGlzYXNzb2M7Ci0JQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRBdXRoOwotCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkRGVhdXRoOwotCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkVW5rbm93bk1nbXQ7Ci0JQ0hBUgkJCQkJUnNzaU9mUmN2ZFJlcGxheUF0dGFjazsKLQotCUJPT0xFQU4JCQkJCWJCY25TbnRSZXE7Ci0JVUNIQVIJCQkJCUJjbkJ1ZklkeDsKLX0gTVVMVElTU0lEX1NUUlVDVCwgKlBNVUxUSVNTSURfU1RSVUNUOwotCi0vLyBjb25maWd1cmF0aW9uIGNvbW1vbiB0byBPUE1PREVfQVAgYXMgd2VsbCBhcyBPUE1PREVfU1RBCi10eXBlZGVmIHN0cnVjdCBfQ09NTU9OX0NPTkZJRyB7Ci0KLQlCT09MRUFOCQliQ291bnRyeUZsYWc7Ci0JVUNIQVIJCUNvdW50cnlDb2RlWzNdOwotCVVDSEFSCQlHZW9ncmFwaHk7Ci0JVUNIQVIgICAgICAgQ291bnRyeVJlZ2lvbjsgICAgICAvLyBFbnVtIG9mIGNvdW50cnkgcmVnaW9uLCAwOkZDQywgMTpJQywgMjpFVFNJLCAzOlNQQUlOLCA0OkZyYW5jZSwgNTpNS0ssIDY6TUtLMSwgNzpJc3JhZWwKLQlVQ0hBUiAgICAgICBDb3VudHJ5UmVnaW9uRm9yQUJhbmQ7CS8vIEVudW0gb2YgY291bnRyeSByZWdpb24gZm9yIEEgYmFuZAotCVVDSEFSICAgICAgIFBoeU1vZGU7ICAgICAgICAgICAgLy8gUEhZXzExQSwgUEhZXzExQiwgUEhZXzExQkdfTUlYRUQsIFBIWV9BQkdfTUlYRUQKLQlVU0hPUlQgICAgICBEc2lmczsgICAgICAgICAgICAgIC8vIGluIHVuaXRzIG9mIHVzZWMKLQlVTE9ORyAgICAgICBQYWNrZXRGaWx0ZXI7ICAgICAgIC8vIFBhY2tldCBmaWx0ZXIgZm9yIHJlY2VpdmluZwotCi0JQ0hBUiAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOyAvLyBOT1QgTlVMTC10ZXJtaW5hdGVkCi0JVUNIQVIgICAgICAgU3NpZExlbjsgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHNzaWQgbGVuZ3RoIGluIHVzZWQKLQlVQ0hBUiAgICAgICBMYXN0U3NpZExlbjsgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHNzaWQgbGVuZ3RoIGluIHVzZWQKLQlDSEFSICAgICAgICBMYXN0U3NpZFtNQVhfTEVOX09GX1NTSURdOyAvLyBOT1QgTlVMTC10ZXJtaW5hdGVkCi0JVUNIQVIJCUxhc3RCc3NpZFtNQUNfQUREUl9MRU5dOwotCi0JVUNIQVIgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXTsKLQlVU0hPUlQgICAgICBCZWFjb25QZXJpb2Q7Ci0JVUNIQVIgICAgICAgQ2hhbm5lbDsKLQlVQ0hBUiAgICAgICBDZW50cmFsQ2hhbm5lbDsgICAgCS8vIENlbnRyYWwgQ2hhbm5lbCB3aGVuIHVzaW5nIDQwTUh6IGlzIGluZGljYXRpbmcuIG5vdCByZWFsIGNoYW5uZWwuCi0KLQlVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUiAgICAgICBTdXBSYXRlTGVuOwotCVVDSEFSICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSICAgICAgIEV4dFJhdGVMZW47Ci0JVUNIQVIgICAgICAgRGVzaXJlUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107ICAgICAgLy8gT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCi0JVUNIQVIgICAgICAgTWF4RGVzaXJlZFJhdGU7Ci0JVUNIQVIgICAgICAgRXhwZWN0ZWRBQ0tSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQotCVVMT05HICAgICAgIEJhc2ljUmF0ZUJpdG1hcDsgICAgICAgIC8vIGJhY2t1cCBiYXNpYyByYXRlYml0bWFwCi0KLQlCT09MRUFOCQliQVBTRENhcGFibGU7Ci0JQk9PTEVBTgkJYkluU2VydmljZVBlcmlvZDsKLQlCT09MRUFOCQliQVBTREFDX0JFOwotCUJPT0xFQU4JCWJBUFNEQUNfQks7Ci0JQk9PTEVBTgkJYkFQU0RBQ19WSTsKLQlCT09MRUFOCQliQVBTREFDX1ZPOwotCUJPT0xFQU4JCWJOZWVkU2VuZFRyaWdnZXJGcmFtZTsKLQlCT09MRUFOCQliQVBTREZvcmNlUG93ZXJTYXZlOwkvLyBGb3JjZSBwb3dlciBzYXZlIG1vZGUsIHNob3VsZCBvbmx5IHVzZSBpbiBBUFNELVNUQVVUCi0JVUxPTkcJCVRyaWdnZXJUaW1lckNvdW50OwotCVVDSEFSCQlNYXhTUExlbmd0aDsKLQlVQ0hBUgkJQkJQQ3VycmVudEJXOwkvLyBCV18xMCwgCUJXXzIwLCBCV180MAotCVJFR19UUkFOU01JVF9TRVRUSU5HICAgICAgICBSZWdUcmFuc21pdFNldHRpbmc7IC8vcmVnaXN0cnkgdHJhbnNtaXQgc2V0dGluZy4gdGhpcyBpcyBmb3IgcmVhZGluZyByZWdpc3RyeSBzZXR0aW5nIG9ubHkuIG5vdCB1c2VmdWwuCi0JVUNIQVIgICAgICAgVHhSYXRlOyAgICAgICAgICAgICAgICAgLy8gU2FtZSB2YWx1ZSB0byBmaWxsIGluIFRYRC4gVHhSYXRlIGlzIDYtYml0Ci0JVUNIQVIgICAgICAgTWF4VHhSYXRlOyAgICAgICAgICAgICAgLy8gUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExCi0JVUNIQVIgICAgICAgVHhSYXRlSW5kZXg7ICAgICAgICAgICAgLy8gVHggcmF0ZSBpbmRleCBpbiBSYXRlU3dpdGNoVGFibGUKLQlVQ0hBUiAgICAgICBUeFJhdGVUYWJsZVNpemU7ICAgICAgICAvLyBWYWxpZCBUeCByYXRlIHRhYmxlIHNpemUgaW4gUmF0ZVN3aXRjaFRhYmxlCi0JVUNIQVIgICAgICAgTWluVHhSYXRlOyAgICAgICAgICAgICAgLy8gUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExCi0JVUNIQVIgICAgICAgUnRzUmF0ZTsgICAgICAgICAgICAgICAgLy8gUkFURV94eHgKLQlIVFRSQU5TTUlUX1NFVFRJTkcJTWxtZVRyYW5zbWl0OyAgIC8vIE1HTVQgZnJhbWUgUEhZIHJhdGUgc2V0dGluZyB3aGVuIG9wZXJhdGluIGF0IEh0IHJhdGUuCi0JVUNIQVIgICAgICAgTWxtZVJhdGU7ICAgICAgICAgICAgICAgLy8gUkFURV94eHgsIHVzZWQgdG8gc2VuZCBNTE1FIGZyYW1lcwotCVVDSEFSICAgICAgIEJhc2ljTWxtZVJhdGU7ICAgICAgICAgIC8vIERlZmF1bHQgUmF0ZSBmb3Igc2VuZGluZyBNTE1FIGZyYW1lcwotCi0JVVNIT1JUICAgICAgUnRzVGhyZXNob2xkOyAgICAgICAgICAgLy8gaW4gdW5pdCBvZiBCWVRFCi0JVVNIT1JUICAgICAgRnJhZ21lbnRUaHJlc2hvbGQ7ICAgICAgLy8gaW4gdW5pdCBvZiBCWVRFCi0KLQlVQ0hBUiAgICAgICBUeFBvd2VyOyAgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIG1XCi0JVUxPTkcgICAgICAgVHhQb3dlclBlcmNlbnRhZ2U7ICAgICAgLy8gMH4xMDAgJQotCVVMT05HICAgICAgIFR4UG93ZXJEZWZhdWx0OyAgICAgICAgIC8vIGtlZXAgZm9yIFR4UG93ZXJQZXJjZW50YWdlCi0KLQlCQUNBUF9TVFJVQyAgICAgICAgQkFDYXBhYmlsaXR5OyAvLyAgIE5PIFVTRSA9IDBYRkYgIDsgIElNTUVEX0JBID0xICA7ICBERUxBWV9CQT0wCi0JQkFDQVBfU1RSVUMgICAgICAgIFJFR0JBQ2FwYWJpbGl0eTsgLy8gICBOTyBVU0UgPSAwWEZGICA7ICBJTU1FRF9CQSA9MSAgOyAgREVMQVlfQkE9MAotCi0JSU9UX1NUUlVDCQlJT1Rlc3RQYXJtOwkvLyA4MDIuMTFuIEludGVyT3BiaWxpdHkgVGVzdCBQYXJhbWV0ZXI7Ci0JVUxPTkcgICAgICAgVHhQcmVhbWJsZTsgICAgICAgICAgICAgLy8gUnQ4MDJfMTFQcmVhbWJsZUxvbmcsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCwgUnQ4MDJfMTFQcmVhbWJsZUF1dG8KLQlCT09MRUFOICAgICBiVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50OyAgICAgLy8gTWljcm9zb2Z0IHVzZSAwIGFzIGRpc2FibGUKLQlVTE9ORyAgICAgICBVc2VCR1Byb3RlY3Rpb247ICAgICAgICAvLyAwOiBhdXRvLCAxOiBhbHdheXMgdXNlLCAyOiBhbHdheXMgbm90IHVzZQotCUJPT0xFQU4gICAgIGJVc2VTaG9ydFNsb3RUaW1lOyAgICAgIC8vIDA6IGRpc2FibGUsIDEgLSB1c2Ugc2hvcnQgc2xvdCAoOXVzKQotCUJPT0xFQU4gICAgIGJFbmFibGVUeEJ1cnN0OyAgICAgICAgIC8vIDE6IGVuYmxlIFRYIFBBQ0tFVCBCVVJTVCwgMDogZGlzYWJsZSBUWCBQQUNLRVQgQlVSU1QKLQlCT09MRUFOICAgICBiQWdncmVnYXRpb25DYXBhYmxlOyAgICAgIC8vIDE6IGVuYWJsZSBUWCBhZ2dyZWdhdGlvbiB3aGVuIHRoZSBwZWVyIHN1cHBvcnRzIGl0Ci0JQk9PTEVBTiAgICAgYlBpZ2d5QmFja0NhcGFibGU7CQkvLyAxOiBlbmFibGUgVFggcGlnZ3ktYmFjayBhY2NvcmRpbmcgTUFDJ3MgdmVyc2lvbgotCUJPT0xFQU4gICAgIGJJRUVFODAyMTFIOwkJCS8vIDE6IGVuYWJsZSBJRUVFODAyLjExaCBzcGVjLgotCVVMT05HCQlEaXNhYmxlT0xCQ0RldGVjdDsJCS8vIDA6IGVuYWJsZSBPTEJDIGRldGVjdDsgMSBkaXNhYmxlIE9MQkMgZGV0ZWN0Ci0KLQlCT09MRUFOCQkJCWJSZGc7Ci0KLQlCT09MRUFOICAgICAgICAgICAgIGJXbW1DYXBhYmxlOyAgICAgICAgLy8gMDpkaXNhYmxlIFdNTSwgMTplbmFibGUgV01NCi0JUU9TX0NBUEFCSUxJVFlfUEFSTSBBUFFvc0NhcGFiaWxpdHk7ICAgIC8vIFFPUyBjYXBhYmlsaXR5IG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAKLQlFRENBX1BBUk0gICAgICAgICAgIEFQRWRjYVBhcm07ICAgICAgICAgLy8gRURDQSBwYXJhbWV0ZXJzIG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAKLQlRQlNTX0xPQURfUEFSTSAgICAgIEFQUWJzc0xvYWQ7ICAgICAgICAgLy8gUUJTUyBsb2FkIG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAKLQlVQ0hBUiAgICAgICAgICAgICAgIEFja1BvbGljeVs0XTsgICAgICAgLy8gQUNLIHBvbGljeSBvZiB0aGUgc3BlY2lmaWVkIEFDLiBzZWUgQUNLX3h4eAotCUJPT0xFQU4JCQkJYkRMU0NhcGFibGU7CQkvLyAwOmRpc2FibGUgRExTLCAxOmVuYWJsZSBETFMKLQkvLyBhIGJpdG1hcCBvZiBCT09MRUFOIGZsYWdzLiBlYWNoIGJpdCByZXByZXNlbnQgYW4gb3BlcmF0aW9uIHN0YXR1cyBvZiBhIHBhcnRpY3VsYXIKLQkvLyBCT09MRUFOIGNvbnRyb2wsIGVpdGhlciBPTiBvciBPRkYuIFRoZXNlIGZsYWdzIHNob3VsZCBhbHdheXMgYmUgYWNjZXNzZWQgdmlhCi0JLy8gT1BTVEFUVVNfVEVTVF9GTEFHKCksIE9QU1RBVFVTX1NFVF9GTEFHKCksIE9QX1NUQVRVU19DTEVBUl9GTEFHKCkgbWFjcm9zLgotCS8vIHNlZSBmT1BfU1RBVFVTX3h4eCBpbiBSVE1QX0RFRi5DIGZvciBkZXRhaWwgYml0IGRlZmluaXRpb24KLQlVTE9ORyAgICAgICAgICAgICAgIE9wU3RhdHVzRmxhZ3M7Ci0KLQlCT09MRUFOCQkJCU5kaXNSYWRpb1N0YXRlT2ZmOyAvL0ZvciBIQ1QgMTIuMCwgc2V0IHRoaXMgZmxhZyB0byBUUlVFIGluc3RlYWQgb2YgY2FsbGVkIE1sbWVSYWRpb09mZi4KLQlBQkdCQU5EX1NUQVRFCQlCYW5kU3RhdGU7CQkvLyBGb3Igc2V0dGluZyBCQlAgdXNlZCBvbiBCL0cgb3IgQSBtb2RlLgotCi0JLy8gSUVFRTgwMi4xMUgtLURGUy4KLQlSQURBUl9ERVRFQ1RfU1RSVUNUCVJhZGFyRGV0ZWN0OwotCi0JLy8gSFQKLQlVQ0hBUgkJCUJBU2l6ZTsJCS8vIFVTZXIgZGVzaXJlZCBCQVdpbmRvd1NpemUuIFNob3VsZCBub3QgZXhjZWVkIG91ciBtYXggY2FwYWJpbGl0eQotCS8vUlRfSFRfQ0FQQUJJTElUWQlTdXBwb3J0ZWRIdFBoeTsKLQlSVF9IVF9DQVBBQklMSVRZCURlc2lyZWRIdFBoeTsKLQlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7Ci0JQUREX0hUX0lORk9fSUUJCUFkZEhUSW5mbzsJLy8gVXNlZnVsIGFzIEFQLgotCS8vVGhpcyBJRSBpcyB1c2VkIHdpdGggY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGVsZW1lbnQgd2hlbiBjaGFuZ2luZyB0byBhIG5ldyA0ME1Iei4KLQkvL1RoaXMgSUUgaXMgaW5jbHVkZWQgaW4gY2hhbm5lbCBzd2l0Y2ggYW1tb3VuY2VtZW50IGZyYW1lcyA3LjQuMS41LCBiZWFjb25zLCBwcm9iZSBSc3AuCi0JTkVXX0VYVF9DSEFOX0lFCU5ld0V4dENoYW5PZmZzZXQ7CS8vNy4zLjIuMjBBLCAxIGlmIGV4dGVuc2lvbiBjaGFubmVsIGlzIGFib3ZlIHRoZSBjb250cm9sIGNoYW5uZWwsIDMgaWYgYmVsb3csIDAgaWYgbm90IHByZXNlbnQKLQotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIGJIVFByb3RlY3Q7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgYk1JTU9QU0VuYWJsZTsKLSAgICBCT09MRUFOCQkJCQliQkFEZWNsaW5lOwotCUJPT0xFQU4JCQkJCWJEaXNhYmxlUmVvcmRlcmluZzsKLQlCT09MRUFOCQkJCQliRm9ydHlfTWh6X0ludG9sZXJhbnQ7Ci0JQk9PTEVBTgkJCQkJYkV4dENoYW5uZWxTd2l0Y2hBbm5vdW5jZW1lbnQ7Ci0JQk9PTEVBTgkJCQkJYlJjdkJTU1dpZHRoVHJpZ2dlckV2ZW50czsKLQlVTE9ORwkJCQkJTGFzdFJjdkJTU1dpZHRoVHJpZ2dlckV2ZW50c1RpbWU7Ci0KLQlVQ0hBUgkJCQkJVHhCQVNpemU7Ci0KLQkvLyBFbmFibGUgd2lyZWxlc3MgZXZlbnQKLQlCT09MRUFOCQkJCWJXaXJlbGVzc0V2ZW50OwotCUJPT0xFQU4JCQkJYldpRmlUZXN0OwkJCQkvLyBFbmFibGUgdGhpcyBwYXJhbWV0ZXIgZm9yIFdpRmkgdGVzdAotCi0JLy8gVHggJiBSeCBTdHJlYW0gbnVtYmVyIHNlbGVjdGlvbgotCVVDSEFSCQkJCVR4U3RyZWFtOwotCVVDSEFSCQkJCVJ4U3RyZWFtOwotCi0JLy8gdHJhbnNtaXQgcGh5IG1vZGUsIHRyYXNtaXQgcmF0ZSBmb3IgTXVsdGljYXN0LgotI2lmZGVmIE1DQVNUX1JBVEVfU1BFQ0lGSUMKLQlVQ0hBUgkJCQlNY2FzdFRyYW5zbWl0TWNzOwotCVVDSEFSCQkJCU1jYXN0VHJhbnNtaXRQaHlNb2RlOwotI2VuZGlmIC8vIE1DQVNUX1JBVEVfU1BFQ0lGSUMgLy8KLQotCUJPT0xFQU4gICAgIAkJYkhhcmR3YXJlUmFkaW87ICAgICAvLyBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIGVuYWJsZWQKLQotI2lmZGVmIFJUMjg3MAotCUJPT0xFQU4gICAgIAkJYk11bHRpcGxlSVJQOyAgICAgICAvLyBNdWx0aXBsZSBCdWxrIElOIGZsYWcKLQlVQ0hBUiAgICAgICAJCU51bU9mQnVsa0luSVJQOyAgICAgLy8gaWYgYk11bHRpcGxlSVJQID09IFRSVUUsIE51bU9mQnVsa0luSVJQIHdpbGwgYmUgNCBvdGhlcndpc2UgYmUgMQotIAlSVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OwotCVVMT05HCQkJCU1heFBrdE9uZVR4QnVsazsKLQlVQ0hBUgkJCQlUeEJ1bGtGYWN0b3I7Ci0JVUNIQVIJCQkJUnhCdWxrRmFjdG9yOwotCi0JQkVBQ09OX1NZTkNfU1RSVUNUCSpwQmVhY29uU3luYzsKLQlSQUxJTktfVElNRVJfU1RSVUNUCUJlYWNvblVwZGF0ZVRpbWVyOwotCVVJTlQzMgkJCQlCZWFjb25BZGp1c3Q7Ci0JVUlOVDMyCQkJCUJlYWNvbkZhY3RvcjsKLQlVSU5UMzIJCQkJQmVhY29uUmVtYWluOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0KLSAJTkRJU19TUElOX0xPQ0sJCQlNZWFzdXJlUmVxVGFiTG9jazsKLQlQTUVBU1VSRV9SRVFfVEFCCQlwTWVhc3VyZVJlcVRhYjsKLQotCU5ESVNfU1BJTl9MT0NLCQkJVHBjUmVxVGFiTG9jazsKLQlQVFBDX1JFUV9UQUIJCQlwVHBjUmVxVGFiOwotCi0JLy8gdHJhbnNtaXQgcGh5IG1vZGUsIHRyYXNtaXQgcmF0ZSBmb3IgTXVsdGljYXN0LgotI2lmZGVmIE1DQVNUX1JBVEVfU1BFQ0lGSUMKLQlIVFRSQU5TTUlUX1NFVFRJTkcJCU1DYXN0UGh5TW9kZTsKLSNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCi19IENPTU1PTl9DT05GSUcsICpQQ09NTU9OX0NPTkZJRzsKKwlCT09MRUFOIEhUX0Rpc2FsbG93VEtJUDsJLyogUmVzdHJpY3QgdGhlIGVuY3J5cHRpb24gdHlwZSBpbiAxMW4gSFQgbW9kZSAqLworfTsKIAogLyogTW9kaWZpZWQgYnkgV3UgWGktS3VuIDQvMjEvMjAwNiAqLwotLy8gU1RBIGNvbmZpZ3VyYXRpb24gYW5kIHN0YXR1cwotdHlwZWRlZiBzdHJ1Y3QgX1NUQV9BRE1JTl9DT05GSUcgewotCS8vIEdST1VQIDEgLQotCS8vICAgVXNlciBjb25maWd1cmF0aW9uIGxvYWRlZCBmcm9tIFJlZ2lzdHJ5LCBFMlBST00gb3IgT0lEX3h4eC4gVGhlc2Ugc2V0dGluZ3MgZGVzY3JpYmUKLQkvLyAgIHRoZSB1c2VyIGludGVuZGVkIGNvbmZpZ3VyYXRpb24sIGJ1dCBub3QgbmVjZXNzYXJ5IGZ1bGx5IGVxdWFsIHRvIHRoZSBmaW5hbAotCS8vICAgc2V0dGluZ3MgaW4gQUNUSVZFIEJTUyBhZnRlciBuZWdvdGlhdGlvbi9jb21wcm9taXplIHdpdGggdGhlIEJTUyBob2xkZXIgKGVpdGhlcgotCS8vICAgQVAgb3IgSUJTUyBob2xkZXIpLgotCS8vICAgT25jZSBpbml0aWFsaXplZCwgdXNlciBjb25maWd1cmF0aW9uIGNhbiBvbmx5IGJlIGNoYW5nZWQgdmlhIE9JRF94eHgKLQlVQ0hBUiAgICAgICBCc3NUeXBlOyAgICAgICAgICAgICAgLy8gQlNTX0lORlJBIG9yIEJTU19BREhPQwotCVVTSE9SVCAgICAgIEF0aW1XaW47ICAgICAgICAgIC8vIHVzZWQgd2hlbiBzdGFydGluZyBhIG5ldyBJQlNTCisvKiBTVEEgY29uZmlndXJhdGlvbiBhbmQgc3RhdHVzICovCitzdHJ1Y3QgcnRfc3RhX2FkbWluX2NvbmZpZyB7CisJLyogR1JPVVAgMSAtICovCisJLyogICBVc2VyIGNvbmZpZ3VyYXRpb24gbG9hZGVkIGZyb20gUmVnaXN0cnksIEUyUFJPTSBvciBPSURfeHh4LiBUaGVzZSBzZXR0aW5ncyBkZXNjcmliZSAqLworCS8qICAgdGhlIHVzZXIgaW50ZW5kZWQgY29uZmlndXJhdGlvbiwgYnV0IG5vdCBuZWNlc3NhcnkgZnVsbHkgZXF1YWwgdG8gdGhlIGZpbmFsICovCisJLyogICBzZXR0aW5ncyBpbiBBQ1RJVkUgQlNTIGFmdGVyIG5lZ290aWF0aW9uL2NvbXByb21pemUgd2l0aCB0aGUgQlNTIGhvbGRlciAoZWl0aGVyICovCisJLyogICBBUCBvciBJQlNTIGhvbGRlcikuICovCisJLyogICBPbmNlIGluaXRpYWxpemVkLCB1c2VyIGNvbmZpZ3VyYXRpb24gY2FuIG9ubHkgYmUgY2hhbmdlZCB2aWEgT0lEX3h4eCAqLworCXU4IEJzc1R5cGU7CQkvKiBCU1NfSU5GUkEgb3IgQlNTX0FESE9DICovCisJdTE2IEF0aW1XaW47CQkvKiB1c2VkIHdoZW4gc3RhcnRpbmcgYSBuZXcgSUJTUyAqLwogCi0JLy8gR1JPVVAgMiAtCi0JLy8gICBVc2VyIGNvbmZpZ3VyYXRpb24gbG9hZGVkIGZyb20gUmVnaXN0cnksIEUyUFJPTSBvciBPSURfeHh4LiBUaGVzZSBzZXR0aW5ncyBkZXNjcmliZQotCS8vICAgdGhlIHVzZXIgaW50ZW5kZWQgY29uZmlndXJhdGlvbiwgYW5kIHNob3VsZCBiZSBhbHdheXMgYXBwbGllZCB0byB0aGUgZmluYWwKLQkvLyAgIHNldHRpbmdzIGluIEFDVElWRSBCU1Mgd2l0aG91dCBjb21wcm9taXNpbmcgd2l0aCB0aGUgQlNTIGhvbGRlci4KLQkvLyAgIE9uY2UgaW5pdGlhbGl6ZWQsIHVzZXIgY29uZmlndXJhdGlvbiBjYW4gb25seSBiZSBjaGFuZ2VkIHZpYSBPSURfeHh4Ci0JVUNIQVIgICAgICAgUnNzaVRyaWdnZXI7Ci0JVUNIQVIgICAgICAgUnNzaVRyaWdnZXJNb2RlOyAgICAgIC8vIFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEIG9yIFJTU0lfVFJJR0dFUkVEX1VQT05fRVhDQ0VFRF9USFJFU0hPTEQKLQlVU0hPUlQgICAgICBEZWZhdWx0TGlzdGVuQ291bnQ7ICAgLy8gZGVmYXVsdCBsaXN0ZW4gY291bnQ7Ci0JVUxPTkcgICAgICAgV2luZG93c1Bvd2VyTW9kZTsgICAgICAgICAgIC8vIFBvd2VyIG1vZGUgZm9yIEFDIHBvd2VyCi0JVUxPTkcgICAgICAgV2luZG93c0JhdHRlcnlQb3dlck1vZGU7ICAgIC8vIFBvd2VyIG1vZGUgZm9yIGJhdHRlcnkgaWYgZXhpc3RzCi0JQk9PTEVBTiAgICAgYldpbmRvd3NBQ0NBTUVuYWJsZTsgICAgICAgIC8vIEVuYWJsZSBDQU0gcG93ZXIgbW9kZSB3aGVuIEFDIG9uCi0JQk9PTEVBTiAgICAgYkF1dG9SZWNvbm5lY3Q7ICAgICAgICAgLy8gU2V0IHRvIFRSVUUgd2hlbiBzZXR0aW5nIE9JRF84MDJfMTFfU1NJRCB3aXRoIG5vIG1hdGNoaW5nIEJTU0lECi0JVUxPTkcgICAgICAgV2luZG93c1Bvd2VyUHJvZmlsZTsgICAgLy8gV2luZG93cyBwb3dlciBwcm9maWxlLCBmb3IgTkRJUzUuMSBQblAKKwkvKiBHUk9VUCAyIC0gKi8KKwkvKiAgIFVzZXIgY29uZmlndXJhdGlvbiBsb2FkZWQgZnJvbSBSZWdpc3RyeSwgRTJQUk9NIG9yIE9JRF94eHguIFRoZXNlIHNldHRpbmdzIGRlc2NyaWJlICovCisJLyogICB0aGUgdXNlciBpbnRlbmRlZCBjb25maWd1cmF0aW9uLCBhbmQgc2hvdWxkIGJlIGFsd2F5cyBhcHBsaWVkIHRvIHRoZSBmaW5hbCAqLworCS8qICAgc2V0dGluZ3MgaW4gQUNUSVZFIEJTUyB3aXRob3V0IGNvbXByb21pc2luZyB3aXRoIHRoZSBCU1MgaG9sZGVyLiAqLworCS8qICAgT25jZSBpbml0aWFsaXplZCwgdXNlciBjb25maWd1cmF0aW9uIGNhbiBvbmx5IGJlIGNoYW5nZWQgdmlhIE9JRF94eHggKi8KKwl1OCBSc3NpVHJpZ2dlcjsKKwl1OCBSc3NpVHJpZ2dlck1vZGU7CS8qIFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEIG9yIFJTU0lfVFJJR0dFUkVEX1VQT05fRVhDQ0VFRF9USFJFU0hPTEQgKi8KKwl1MTYgRGVmYXVsdExpc3RlbkNvdW50OwkvKiBkZWZhdWx0IGxpc3RlbiBjb3VudDsgKi8KKwl1bnNpZ25lZCBsb25nIFdpbmRvd3NQb3dlck1vZGU7CS8qIFBvd2VyIG1vZGUgZm9yIEFDIHBvd2VyICovCisJdW5zaWduZWQgbG9uZyBXaW5kb3dzQmF0dGVyeVBvd2VyTW9kZTsJLyogUG93ZXIgbW9kZSBmb3IgYmF0dGVyeSBpZiBleGlzdHMgKi8KKwlCT09MRUFOIGJXaW5kb3dzQUNDQU1FbmFibGU7CS8qIEVuYWJsZSBDQU0gcG93ZXIgbW9kZSB3aGVuIEFDIG9uICovCisJQk9PTEVBTiBiQXV0b1JlY29ubmVjdDsJLyogU2V0IHRvIFRSVUUgd2hlbiBzZXR0aW5nIE9JRF84MDJfMTFfU1NJRCB3aXRoIG5vIG1hdGNoaW5nIEJTU0lEICovCisJdW5zaWduZWQgbG9uZyBXaW5kb3dzUG93ZXJQcm9maWxlOwkvKiBXaW5kb3dzIHBvd2VyIHByb2ZpbGUsIGZvciBORElTNS4xIFBuUCAqLwogCi0JLy8gTUlCOmllZWU4MDJkb3QxMS5kb3QxMXNtdCgxKS5kb3QxMVN0YXRpb25Db25maWdUYWJsZSgxKQotCVVTSE9SVCAgICAgIFBzbTsgICAgICAgICAgICAgICAgICAvLyBwb3dlciBtYW5hZ2VtZW50IG1vZGUgICAoUFdSX0FDVElWRXxQV1JfU0FWRSkKLQlVU0hPUlQgICAgICBEaXNhc3NvY1JlYXNvbjsKLQlVQ0hBUiAgICAgICBEaXNhc3NvY1N0YVtNQUNfQUREUl9MRU5dOwotCVVTSE9SVCAgICAgIERlYXV0aFJlYXNvbjsKLQlVQ0hBUiAgICAgICBEZWF1dGhTdGFbTUFDX0FERFJfTEVOXTsKLQlVU0hPUlQgICAgICBBdXRoRmFpbFJlYXNvbjsKLQlVQ0hBUiAgICAgICBBdXRoRmFpbFN0YVtNQUNfQUREUl9MRU5dOworCS8qIE1JQjppZWVlODAyZG90MTEuZG90MTFzbXQoMSkuZG90MTFTdGF0aW9uQ29uZmlnVGFibGUoMSkgKi8KKwl1MTYgUHNtOwkJLyogcG93ZXIgbWFuYWdlbWVudCBtb2RlICAgKFBXUl9BQ1RJVkV8UFdSX1NBVkUpICovCisJdTE2IERpc2Fzc29jUmVhc29uOworCXU4IERpc2Fzc29jU3RhW01BQ19BRERSX0xFTl07CisJdTE2IERlYXV0aFJlYXNvbjsKKwl1OCBEZWF1dGhTdGFbTUFDX0FERFJfTEVOXTsKKwl1MTYgQXV0aEZhaWxSZWFzb247CisJdTggQXV0aEZhaWxTdGFbTUFDX0FERFJfTEVOXTsKIAotCU5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSICAgICAgICAgIFByaXZhY3lGaWx0ZXI7ICAvLyBQcml2YWN5RmlsdGVyIGVudW0gZm9yIDgwMi4xWAotCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOyAgICAgICAvLyBUaGlzIHNob3VsZCBtYXRjaCB0byB3aGF0ZXZlciBtaWNyb3NvZnQgZGVmaW5lZAotCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKLQlORElTXzgwMl8xMV9XRVBfU1RBVFVTCQkJCU9yaWdXZXBTdGF0dXM7CS8vIE9yaWdpbmFsIHdlcCBzdGF0dXMgc2V0IGZyb20gT0lECisJTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIgUHJpdmFjeUZpbHRlcjsJLyogUHJpdmFjeUZpbHRlciBlbnVtIGZvciA4MDIuMVggKi8KKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIEF1dGhNb2RlOwkvKiBUaGlzIHNob3VsZCBtYXRjaCB0byB3aGF0ZXZlciBtaWNyb3NvZnQgZGVmaW5lZCAqLworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgV2VwU3RhdHVzOworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgT3JpZ1dlcFN0YXR1czsJLyogT3JpZ2luYWwgd2VwIHN0YXR1cyBzZXQgZnJvbSBPSUQgKi8KIAotCS8vIEFkZCB0byBzdXBwb3J0IGRpZmZlcmVudCBjaXBoZXIgc3VpdGUgZm9yIFdQQTIvV1BBIG1vZGUKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJR3JvdXBDaXBoZXI7CQkvLyBNdWx0aWNhc3QgY2lwaGVyIHN1aXRlCi0JTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCVBhaXJDaXBoZXI7CQkJLy8gVW5pY2FzdCBjaXBoZXIgc3VpdGUKLQlCT09MRUFOCQkJCQkJCQliTWl4Q2lwaGVyOwkJCS8vIEluZGljYXRlIGN1cnJlbnQgUGFpciAmIEdyb3VwIHVzZSBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlcwotCVVTSE9SVAkJCQkJCQkJUnNuQ2FwYWJpbGl0eTsKKwkvKiBBZGQgdG8gc3VwcG9ydCBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlIGZvciBXUEEyL1dQQSBtb2RlICovCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgR3JvdXBDaXBoZXI7CS8qIE11bHRpY2FzdCBjaXBoZXIgc3VpdGUgKi8KKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUyBQYWlyQ2lwaGVyOwkvKiBVbmljYXN0IGNpcGhlciBzdWl0ZSAqLworCUJPT0xFQU4gYk1peENpcGhlcjsJLyogSW5kaWNhdGUgY3VycmVudCBQYWlyICYgR3JvdXAgdXNlIGRpZmZlcmVudCBjaXBoZXIgc3VpdGVzICovCisJdTE2IFJzbkNhcGFiaWxpdHk7CiAKLQlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBHcm91cEtleVdlcFN0YXR1czsKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTIEdyb3VwS2V5V2VwU3RhdHVzOwogCi0JVUNIQVIJCVBNS1szMl07ICAgICAgICAgICAgICAgIC8vIFdQQSBQU0sgbW9kZSBQTUsKLQlVQ0hBUiAgICAgICBQVEtbNjRdOyAgICAgICAgICAgICAgICAvLyBXUEEgUFNLIG1vZGUgUFRLCi0JVUNIQVIJCUdUS1szMl07CQkJCS8vIEdUSyBmcm9tIGF1dGhlbnRpY2F0b3IKLQlCU1NJRF9JTkZPCVNhdmVkUE1LW1BNS0lEX05PXTsKLQlVSU5UCQlTYXZlZFBNS051bTsJCQkvLyBTYXZlZCBQTUtJRCBudW1iZXIKKwl1OCBXcGFQYXNzUGhyYXNlWzY0XTsJLyogV1BBIFBTSyBwYXNzIHBocmFzZSAqLworCXUzMiBXcGFQYXNzUGhyYXNlTGVuOwkvKiB0aGUgbGVuZ3RoIG9mIFdQQSBQU0sgcGFzcyBwaHJhc2UgKi8KKwl1OCBQTUtbMzJdOwkJLyogV1BBIFBTSyBtb2RlIFBNSyAqLworCXU4IFBUS1s2NF07CQkvKiBXUEEgUFNLIG1vZGUgUFRLICovCisJdTggR1RLWzMyXTsJCS8qIEdUSyBmcm9tIGF1dGhlbnRpY2F0b3IgKi8KKwlzdHJ1Y3QgcnRfYnNzaWRfaW5mbyBTYXZlZFBNS1tQTUtJRF9OT107CisJdTMyIFNhdmVkUE1LTnVtOwkvKiBTYXZlZCBQTUtJRCBudW1iZXIgKi8KIAotCVVDSEFSCQlEZWZhdWx0S2V5SWQ7CisJdTggRGVmYXVsdEtleUlkOwogCisJLyogV1BBIDgwMi4xeCBwb3J0IGNvbnRyb2wsIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVELCBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQgKi8KKwl1OCBQb3J0U2VjdXJlZDsKIAotCS8vIFdQQSA4MDIuMXggcG9ydCBjb250cm9sLCBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCwgV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVECi0JVUNIQVIgICAgICAgUG9ydFNlY3VyZWQ7CisJLyogRm9yIFdQQSBjb3VudGVybWVhc3VyZXMgKi8KKwl1bnNpZ25lZCBsb25nIExhc3RNaWNFcnJvclRpbWU7CS8qIHJlY29yZCBsYXN0IE1JQyBlcnJvciB0aW1lICovCisJdW5zaWduZWQgbG9uZyBNaWNFcnJDbnQ7CS8qIFNob3VsZCBiZSAwLCAxLCAyLCB0aGVuIHJlc2V0IHRvIHplcm8gKGFmdGVyIGRpc2Fzc29pY2lhdGlvbikuICovCisJQk9PTEVBTiBiQmxvY2tBc3NvYzsJLyogQmxvY2sgYXNzb2NpYXRlIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMgYWZ0ZXIgY291bnRlciBtZWFzdXJlIG9jY3VycmVkLiAqLworCS8qIEZvciBXUEEtUFNLIHN1cHBsaWNhbnQgc3RhdGUgKi8KKwlXUEFfU1RBVEUgV3BhU3RhdGU7CS8qIERlZmF1bHQgaXMgU1NfTk9UVVNFIGFuZCBoYW5kbGVkIGJ5IG1pY3Jvc29mdCA4MDIuMXggKi8KKwl1OCBSZXBsYXlDb3VudGVyWzhdOworCXU4IEFOb25jZVszMl07CS8qIEFOb25jZSBmb3IgV1BBLVBTSyBmcm9tIGF1cmhlbnRpY2F0b3IgKi8KKwl1OCBTTm9uY2VbMzJdOwkvKiBTTm9uY2UgZm9yIFdQQS1QU0sgKi8KIAotCS8vIEZvciBXUEEgY291bnRlcm1lYXN1cmVzCi0JVUxPTkcgICAgICAgTGFzdE1pY0Vycm9yVGltZTsgICAvLyByZWNvcmQgbGFzdCBNSUMgZXJyb3IgdGltZQotCVVMT05HICAgICAgIE1pY0VyckNudDsgICAgICAgICAgLy8gU2hvdWxkIGJlIDAsIDEsIDIsIHRoZW4gcmVzZXQgdG8gemVybyAoYWZ0ZXIgZGlzYXNzb2ljaWF0aW9uKS4KLQlCT09MRUFOICAgICBiQmxvY2tBc3NvYzsgICAgICAgIC8vIEJsb2NrIGFzc29jaWF0ZSBhdHRlbXB0IGZvciA2MCBzZWNvbmRzIGFmdGVyIGNvdW50ZXIgbWVhc3VyZSBvY2N1cnJlZC4KLQkvLyBGb3IgV1BBLVBTSyBzdXBwbGljYW50IHN0YXRlCi0JV1BBX1NUQVRFICAgV3BhU3RhdGU7ICAgICAgICAgICAvLyBEZWZhdWx0IGlzIFNTX05PVFVTRSBhbmQgaGFuZGxlZCBieSBtaWNyb3NvZnQgODAyLjF4Ci0JVUNIQVIgICAgICAgUmVwbGF5Q291bnRlcls4XTsKLQlVQ0hBUiAgICAgICBBTm9uY2VbMzJdOyAgICAgICAgIC8vIEFOb25jZSBmb3IgV1BBLVBTSyBmcm9tIGF1cmhlbnRpY2F0b3IKLQlVQ0hBUiAgICAgICBTTm9uY2VbMzJdOyAgICAgICAgIC8vIFNOb25jZSBmb3IgV1BBLVBTSworCXU4IExhc3RTTlIwOwkJLyogbGFzdCByZWNlaXZlZCBCRUFDT04ncyBTTlIgKi8KKwl1OCBMYXN0U05SMTsJCS8qIGxhc3QgcmVjZWl2ZWQgQkVBQ09OJ3MgU05SIGZvciAybmQgIGFudGVubmEgKi8KKwlzdHJ1Y3QgcnRfcnNzaV9zYW1wbGUgUnNzaVNhbXBsZTsKKwl1bnNpZ25lZCBsb25nIE51bU9mQXZnUnNzaVNhbXBsZTsKIAotCVVDSEFSICAgICAgIExhc3RTTlIwOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIEJFQUNPTidzIFNOUgotCVVDSEFSICAgICAgIExhc3RTTlIxOyAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgQkVBQ09OJ3MgU05SIGZvciAybmQgIGFudGVubmEKLQlSU1NJX1NBTVBMRSBSc3NpU2FtcGxlOwotCVVMT05HICAgICAgIE51bU9mQXZnUnNzaVNhbXBsZTsKKwl1bnNpZ25lZCBsb25nIExhc3RCZWFjb25SeFRpbWU7CS8qIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IEJFQUNPTiBSWCB0aW1lICovCisJdW5zaWduZWQgbG9uZyBMYXN0MTFiQmVhY29uUnhUaW1lOwkvKiBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCAxMUIgQkVBQ09OIFJYIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nIExhc3QxMWdCZWFjb25SeFRpbWU7CS8qIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IDExRyBCRUFDT04gUlggdGltZSAqLworCXVuc2lnbmVkIGxvbmcgTGFzdDIwTkJlYWNvblJ4VGltZTsJLyogT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgMjBNSHogTiBCRUFDT04gUlggdGltZSAqLwogCi0JVUxPTkcgICAgICAgTGFzdEJlYWNvblJ4VGltZTsgICAgIC8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IEJFQUNPTiBSWCB0aW1lCi0JVUxPTkcgICAgICAgTGFzdDExYkJlYWNvblJ4VGltZTsgIC8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IDExQiBCRUFDT04gUlggdGltZQotCVVMT05HCQlMYXN0MTFnQmVhY29uUnhUaW1lOwkvLyBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCAxMUcgQkVBQ09OIFJYIHRpbWUKLQlVTE9ORwkJTGFzdDIwTkJlYWNvblJ4VGltZTsJLy8gT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgMjBNSHogTiBCRUFDT04gUlggdGltZQorCXVuc2lnbmVkIGxvbmcgTGFzdFNjYW5UaW1lOwkvKiBSZWNvcmQgbGFzdCBzY2FuIHRpbWUgZm9yIGlzc3VlIEJTU0lEX1NDQU5fTElTVCAqLworCXVuc2lnbmVkIGxvbmcgU2NhbkNudDsJCS8qIFNjYW4gY291bnRzIHNpbmNlIG1vc3QgcmVjZW50IFNTSUQsIEJTU0lELCBTQ0FOIE9JRCByZXF1ZXN0ICovCisJQk9PTEVBTiBiU3dSYWRpbzsJLyogU29mdHdhcmUgY29udHJvbGxlZCBSYWRpbyBPbi9PZmYsIFRSVUU6IE9uICovCisJQk9PTEVBTiBiSHdSYWRpbzsJLyogSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBPbi9PZmYsIFRSVUU6IE9uICovCisJQk9PTEVBTiBiUmFkaW87CQkvKiBSYWRpbyBzdGF0ZSwgQW5kIG9mIFN3ICYgSHcgcmFkaW8gc3RhdGUgKi8KKwlCT09MRUFOIGJIYXJkd2FyZVJhZGlvOwkvKiBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIGVuYWJsZWQgKi8KKwlCT09MRUFOIGJTaG93SGlkZGVuU1NJRDsJLyogU2hvdyBhbGwga25vd24gU1NJRCBpbiBTU0lEIGxpc3QgZ2V0IG9wZXJhdGlvbiAqLwogCi0JVUxPTkcgICAgICAgTGFzdFNjYW5UaW1lOyAgICAgICAvLyBSZWNvcmQgbGFzdCBzY2FuIHRpbWUgZm9yIGlzc3VlIEJTU0lEX1NDQU5fTElTVAotCVVMT05HICAgICAgIFNjYW5DbnQ7ICAgICAgICAgICAgLy8gU2NhbiBjb3VudHMgc2luY2UgbW9zdCByZWNlbnQgU1NJRCwgQlNTSUQsIFNDQU4gT0lEIHJlcXVlc3QKLQlCT09MRUFOICAgICBiU3dSYWRpbzsgICAgICAgICAgIC8vIFNvZnR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gT24vT2ZmLCBUUlVFOiBPbgotCUJPT0xFQU4gICAgIGJId1JhZGlvOyAgICAgICAgICAgLy8gSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBPbi9PZmYsIFRSVUU6IE9uCi0JQk9PTEVBTiAgICAgYlJhZGlvOyAgICAgICAgICAgICAvLyBSYWRpbyBzdGF0ZSwgQW5kIG9mIFN3ICYgSHcgcmFkaW8gc3RhdGUKLQlCT09MRUFOICAgICBiSGFyZHdhcmVSYWRpbzsgICAgIC8vIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gZW5hYmxlZAotCUJPT0xFQU4gICAgIGJTaG93SGlkZGVuU1NJRDsgICAgLy8gU2hvdyBhbGwga25vd24gU1NJRCBpbiBTU0lEIGxpc3QgZ2V0IG9wZXJhdGlvbgotI2lmZGVmIFJUMjg2MAotICAgIEJPT0xFQU4JCUFkaG9jQk9ubHlKb2luZWQ7CS8vIEluZGljYXRlIEFkaG9jIEIgSm9pbi4KLSAgICBCT09MRUFOCQlBZGhvY0JHSm9pbmVkOwkJLy8gSW5kaWNhdGUgQWRob2MgQi9HIEpvaW4uCi0gICAgQk9PTEVBTgkJQWRob2MyME5Kb2luZWQ7CQkvLyBJbmRpY2F0ZSBBZGhvYyAyME1IeiBOIEpvaW4uCi0jZW5kaWYKLQkvLyBOZXcgZm9yIFdQQSwgd2luZG93cyB3YW50IHVzIHRvIGtlZXAgYXNzb2NpYXRpb24gaW5mb3JtYXRpb24gYW5kCi0JLy8gRml4ZWQgSUVzIGZyb20gbGFzdCBhc3NvY2lhdGlvbiByZXNwb25zZQotCU5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OICAgICBBc3NvY0luZm87Ci0JVVNIT1JUICAgICAgIFJlcVZhcklFTGVuOyAgICAgICAgICAgICAgICAvLyBMZW5ndGggb2YgbmV4dCBWSUUgaW5jbHVkZSBFSUQgJiBMZW5ndGgKLQlVQ0hBUiAgICAgICBSZXFWYXJJRXNbTUFYX1ZJRV9MRU5dOwkJLy8gVGhlIGNvbnRlbnQgc2F2ZWQgaGVyZSBzaG91bGQgYmUgbGl0dGxlLWVuZGlhbiBmb3JtYXQuCi0JVVNIT1JUICAgICAgIFJlc1ZhcklFTGVuOyAgICAgICAgICAgICAgICAvLyBMZW5ndGggb2YgbmV4dCBWSUUgaW5jbHVkZSBFSUQgJiBMZW5ndGgKLQlVQ0hBUiAgICAgICBSZXNWYXJJRXNbTUFYX1ZJRV9MRU5dOworCS8qIE5ldyBmb3IgV1BBLCB3aW5kb3dzIHdhbnQgdXMgdG8ga2VlcCBhc3NvY2lhdGlvbiBpbmZvcm1hdGlvbiBhbmQgKi8KKwkvKiBGaXhlZCBJRXMgZnJvbSBsYXN0IGFzc29jaWF0aW9uIHJlc3BvbnNlICovCisJc3RydWN0IHJ0X25kaXNfODAyXzExX2Fzc29jaWF0aW9uX2luZm9ybWF0aW9uIEFzc29jSW5mbzsKKwl1MTYgUmVxVmFySUVMZW47CS8qIExlbmd0aCBvZiBuZXh0IFZJRSBpbmNsdWRlIEVJRCAmIExlbmd0aCAqLworCXU4IFJlcVZhcklFc1tNQVhfVklFX0xFTl07CS8qIFRoZSBjb250ZW50IHNhdmVkIGhlcmUgc2hvdWxkIGJlIGxpdHRsZS1lbmRpYW4gZm9ybWF0LiAqLworCXUxNiBSZXNWYXJJRUxlbjsJLyogTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoICovCisJdTggUmVzVmFySUVzW01BWF9WSUVfTEVOXTsKIAotCVVDSEFSICAgICAgIFJTTklFX0xlbjsKLQlVQ0hBUiAgICAgICBSU05fSUVbTUFYX0xFTl9PRl9SU05JRV07CS8vIFRoZSBjb250ZW50IHNhdmVkIGhlcmUgc2hvdWxkIGJlIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCXU4IFJTTklFX0xlbjsKKwl1OCBSU05fSUVbTUFYX0xFTl9PRl9SU05JRV07CS8qIFRoZSBjb250ZW50IHNhdmVkIGhlcmUgc2hvdWxkIGJlIGxpdHRsZS1lbmRpYW4gZm9ybWF0LiAqLwogCi0JLy8gTmV3IHZhcmlhYmxlcyB1c2VkIGZvciBDQ1ggMS4wCi0JQk9PTEVBTiAgICAgICAgICAgICBiQ2tpcE9uOwotCUJPT0xFQU4gICAgICAgICAgICAgYkNraXBDbWljT247Ci0JVUNIQVIgICAgICAgICAgICAgICBDa2lwRmxhZzsKLQlVQ0hBUiAgICAgICAgICAgICAgIEdJVlszXTsgIC8vZm9yIENDWCBpdgotCVVDSEFSICAgICAgICAgICAgICAgUnhTRVFbNF07Ci0JVUNIQVIgICAgICAgICAgICAgICBUeFNFUVs0XTsKLQlVQ0hBUiAgICAgICAgICAgICAgIENLSVBNSUNbNF07Ci0JVUNIQVIgICAgICAgICAgICAgICBMZWFwQXV0aE1vZGU7Ci0JTEVBUF9BVVRIX0lORk8gICAgICBMZWFwQXV0aEluZm87Ci0JVUNIQVIgICAgICAgICAgICAgICBIYXNoUHdkWzE2XTsKLQlVQ0hBUiAgICAgICAgICAgICAgIE5ldHdvcmtDaGFsbGVuZ2VbOF07Ci0JVUNIQVIgICAgICAgICAgICAgICBOZXR3b3JrQ2hhbGxlbmdlUmVzcG9uc2VbMjRdOwotCVVDSEFSICAgICAgICAgICAgICAgUGVlckNoYWxsZW5nZVs4XTsKKwl1bnNpZ25lZCBsb25nIENMQnVzeUJ5dGVzOwkvKiBTYXZlIHRoZSB0b3RhbCBieXRlcyByZWNlaXZlZCBkdXJuaW5nIGNoYW5uZWwgbG9hZCBzY2FuIHRpbWUgKi8KKwl1MTYgUlBJRGVuc2l0eVs4XTsJLyogQXJyYXkgZm9yIFJQSSBkZW5zaXR5IGNvbGxlY3Rpb24gKi8KIAotCVVDSEFSICAgICAgICAgICAgICAgUGVlckNoYWxsZW5nZVJlc3BvbnNlWzI0XTsKLQlVQ0hBUiAgICAgICAgICAgICAgIFNlc3Npb25LZXlbMTZdOyAvL05ldHdvcmsgc2Vzc2lvbiBrZXlzIChOU0spCi0JUkFMSU5LX1RJTUVSX1NUUlVDVCBMZWFwQXV0aFRpbWVyOwotCVJPR1VFQVBfVEFCTEUgICAgICAgUm9ndWVBcFRhYjsgICAvL0Npc2NvIENDWDEgUm9ndWUgQVAgRGV0ZWN0aW9uCisJdTggUk1SZXFDbnQ7CQkvKiBOdW1iZXIgb2YgbWVhc3VyZW1lbnQgcmVxdWVzdCBzYXZlZC4gKi8KKwl1OCBDdXJyZW50Uk1SZXFJZHg7CS8qIE51bWJlciBvZiBtZWFzdXJlbWVudCByZXF1ZXN0IHNhdmVkLiAqLworCUJPT0xFQU4gUGFyYWxsZWxSZXE7CS8qIFBhcmFsbGVsIG1lYXN1cmVtZW50LCBvbmx5IG9uZSByZXF1ZXN0IHBlcmZvcm1lZCwgKi8KKwkvKiBJdCBtdXN0IGJlIHRoZSBzYW1lIGNoYW5uZWwgd2l0aCBtYXhpbXVtIGR1cmF0aW9uICovCisJdTE2IFBhcmFsbGVsRHVyYXRpb247CS8qIE1heGltdW0gZHVyYXRpb24gZm9yIHBhcmFsbGVsIG1lYXN1cmVtZW50ICovCisJdTggUGFyYWxsZWxDaGFubmVsOwkvKiBPbmx5IG9uZSBjaGFubmVsIHdpdGggcGFyYWxsZWwgbWVhc3VyZW1lbnQgKi8KKwl1MTYgSUFQUFRva2VuOwkvKiBJQVBQIGRpYWxvZyB0b2tlbiAqLworCS8qIEhhY2sgZm9yIGNoYW5uZWwgbG9hZCBhbmQgbm9pc2UgaGlzdG9ncmFtIHBhcmFtZXRlcnMgKi8KKwl1OCBOSEZhY3RvcjsJCS8qIFBhcmFtZXRlciBmb3IgTm9pc2UgaGlzdG9ncmFtICovCisJdTggQ0xGYWN0b3I7CQkvKiBQYXJhbWV0ZXIgZm9yIGNoYW5uZWwgbG9hZCAqLwogCi0JLy8gTmV3IGNvbnRyb2wgZmxhZ3MgZm9yIENDWAotCUNDWF9DT05UUk9MICAgICAgICAgQ0NYQ29udHJvbDsgICAgICAgICAgICAgICAgIC8vIE1hc3RlciBhZG1pbmlzdHJhdGlvbiBzdGF0ZQotCUJPT0xFQU4gICAgICAgICAgICAgQ0NYRW5hYmxlOyAgICAgICAgICAgICAgICAgIC8vIEFjdHVhbCBDQ1ggc3RhdGUKLQlVQ0hBUiAgICAgICAgICAgICAgIENDWFNjYW5DaGFubmVsOyAgICAgICAgICAgICAvLyBTZWxlY3RlZCBjaGFubmVsIGZvciBDQ1ggYmVhY29uIHJlcXVlc3QKLQlVU0hPUlQgICAgICAgICAgICAgIENDWFNjYW5UaW1lOyAgICAgICAgICAgICAgICAvLyBUaW1lIG91dCB0byB3YWl0IGZvciBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlCi0JVUNIQVIgICAgICAgICAgICAgICBDQ1hSZXFUeXBlOyAgICAgICAgICAgICAgICAgLy8gQ3VycmVudCBwcm9jZXNzaW5nIENDWCByZXF1ZXN0IHR5cGUKLQlCU1NfVEFCTEUgICAgICAgICAgIENDWEJzc1RhYjsgICAgICAgICAgICAgICAgICAvLyBCU1MgVGFibGUKLQlVQ0hBUiAgICAgICAgICAgICAgIEZyYW1lUmVwb3J0QnVmWzIwNDhdOyAgICAgICAvLyBCdWZmZXIgZm9yIGNyZWF0aW5nIGZyYW1lIHJlcG9ydAotCVVTSE9SVCAgICAgICAgICAgICAgRnJhbWVSZXBvcnRMZW47ICAgICAgICAgICAgIC8vIEN1cnJlbnQgRnJhbWUgcmVwb3J0IGxlbmd0aAotCVVMT05HICAgICAgICAgICAgICAgQ0xCdXN5Qnl0ZXM7ICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIHRvdGFsIGJ5dGVzIHJlY2VpdmVkIGR1cm5pbmcgY2hhbm5lbCBsb2FkIHNjYW4gdGltZQotCVVTSE9SVCAgICAgICAgICAgICAgUlBJRGVuc2l0eVs4XTsgICAgICAgICAgICAgIC8vIEFycmF5IGZvciBSUEkgZGVuc2l0eSBjb2xsZWN0aW9uCi0JLy8gU3RhcnQgYWRkcmVzcyBvZiBlYWNoIEJTUyB0YWJsZSB3aXRoaW4gRnJhbWVSZXBvcnRCdWYKLQkvLyBJdCdzIGltcG9ydGFudCB0byB1cGRhdGUgdGhlIFJ4UG93ZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgQnNzCi0JVVNIT1JUICAgICAgICAgICAgICBCc3NSZXBvcnRPZmZzZXRbTUFYX0xFTl9PRl9CU1NfVEFCTEVdOwotCVVTSE9SVCAgICAgICAgICAgICAgQmVhY29uVG9rZW47ICAgICAgICAgICAgICAgIC8vIFRva2VuIGZvciBiZWFjb24gcmVwb3J0Ci0JVUxPTkcgICAgICAgICAgICAgICBMYXN0QnNzSW5kZXg7ICAgICAgICAgICAgICAgLy8gTW9zdCBjdXJyZW50IHJlcG9ydGVkIEJzcyBpbmRleAotCVJNX1JFUVVFU1RfQUNUSU9OICAgTWVhc3VyZW1lbnRSZXF1ZXN0WzE2XTsgICAgIC8vIFNhdmVkIG1lYXN1cmVtZW50IHJlcXVlc3QKLQlVQ0hBUiAgICAgICAgICAgICAgIFJNUmVxQ250OyAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgbWVhc3VyZW1lbnQgcmVxdWVzdCBzYXZlZC4KLQlVQ0hBUiAgICAgICAgICAgICAgIEN1cnJlbnRSTVJlcUlkeDsgICAgICAgICAgICAvLyBOdW1iZXIgb2YgbWVhc3VyZW1lbnQgcmVxdWVzdCBzYXZlZC4KLQlCT09MRUFOICAgICAgICAgICAgIFBhcmFsbGVsUmVxOyAgICAgICAgICAgICAgICAvLyBQYXJhbGxlbCBtZWFzdXJlbWVudCwgb25seSBvbmUgcmVxdWVzdCBwZXJmb3JtZWQsCi0JCQkJCQkJCQkJCQkJLy8gSXQgbXVzdCBiZSB0aGUgc2FtZSBjaGFubmVsIHdpdGggbWF4aW11bSBkdXJhdGlvbgotCVVTSE9SVCAgICAgICAgICAgICAgUGFyYWxsZWxEdXJhdGlvbjsgICAgICAgICAgIC8vIE1heGltdW0gZHVyYXRpb24gZm9yIHBhcmFsbGVsIG1lYXN1cmVtZW50Ci0JVUNIQVIgICAgICAgICAgICAgICBQYXJhbGxlbENoYW5uZWw7ICAgICAgICAgICAgLy8gT25seSBvbmUgY2hhbm5lbCB3aXRoIHBhcmFsbGVsIG1lYXN1cmVtZW50Ci0JVVNIT1JUICAgICAgICAgICAgICBJQVBQVG9rZW47ICAgICAgICAgICAgICAgICAgLy8gSUFQUCBkaWFsb2cgdG9rZW4KLQlVQ0hBUiAgICAgICAgICAgICAgIENDWFFvc0VDV01pbjsgICAgICAgICAgICAgICAvLyBDaXNjbyBRT1MgRUNXTWluIGZvciBBQyAwCi0JVUNIQVIgICAgICAgICAgICAgICBDQ1hRb3NFQ1dNYXg7ICAgICAgICAgICAgICAgLy8gQ2lzY28gUU9TIEVDV01heCBmb3IgQUMgMAotCS8vIEhhY2sgZm9yIGNoYW5uZWwgbG9hZCBhbmQgbm9pc2UgaGlzdG9ncmFtIHBhcmFtZXRlcnMKLQlVQ0hBUiAgICAgICAgICAgICAgIE5IRmFjdG9yOyAgICAgICAgICAgICAgICAgICAvLyBQYXJhbWV0ZXIgZm9yIE5vaXNlIGhpc3RvZ3JhbQotCVVDSEFSICAgICAgICAgICAgICAgQ0xGYWN0b3I7ICAgICAgICAgICAgICAgICAgIC8vIFBhcmFtZXRlciBmb3IgY2hhbm5lbCBsb2FkCisJc3RydWN0IHJ0X3JhbGlua190aW1lciBTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lcjsKKwlCT09MRUFOIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZzsKIAotCVVDSEFSICAgICAgICAgICAgICAgS1JLWzE2XTsgICAgICAgIC8vS2V5IFJlZnJlc2ggS2V5LgotCVVDSEFSICAgICAgICAgICAgICAgQlRLWzMyXTsgICAgICAgIC8vQmFzZSBUcmFuc2llbnQgS2V5Ci0JQk9PTEVBTiAgICAgICAgICAgICBDQ0tNTGlua1VwRmxhZzsKLQlVTE9ORyAgICAgICAgICAgICAgIENDS01STjsgICAgLy8oUmUpQXNzb2NpYXRpb24gcmVxdWVzdCBudW1iZXIuCi0JTEFSR0VfSU5URUdFUiAgICAgICBDQ0tNQmVhY29uQXRKb2luVGltZVN0YW1wOyAgLy9UU0YgdGltZXIgZm9yIFJlLWFzc29jYWl0ZSB0byB0aGUgbmV3IEFQCi0JVUNIQVIgICAgICAgICAgICAgICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQ7ICAgICAgLy9pbiBkQm0KLQlVQ0hBUiAgICAgICAgICAgICAgIEFpcm9uZXRJUEFkZHJlc3NbNF07ICAgICAgICAvL2VnLiAxOTIuMTY4LjEuMQotCUJPT0xFQU4gICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWc7ICAgIC8vZmxhZyBmb3IgZGV0ZXJtaW5pbmcgcmVwb3J0IEFzc29jIExvc3QgdGltZQotCUNIQVIgICAgICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsgLy9BZGphY2VudCBBUCdzIFNTSUQgcmVwb3J0Ci0JVUNIQVIgICAgICAgICAgICAgICBDQ1hBZGphY2VudEFQU3NpZExlbjsgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHNzaWQgbGVuZ3RoIGluIHVzZWQKLQlVQ0hBUiAgICAgICAgICAgICAgIENDWEFkamFjZW50QVBCc3NpZFtNQUNfQUREUl9MRU5dOyAgICAgICAgIC8vQWRqYWNlbnQgQVAncyBCU1NJRCByZXBvcnQKLQlVU0hPUlQgICAgICAgICAgICAgIENDWEFkamFjZW50QVBDaGFubmVsOwotCVVMT05HICAgICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUExpbmtEb3duVGltZTsgIC8vZm9yIFNwZWMgUzMyLgorCXU4IER0aW1Db3VudDsJLyogMC4uIER0aW1QZXJpb2QtMSAqLworCXU4IER0aW1QZXJpb2Q7CS8qIGRlZmF1bHQgPSAzICovCiAKLQlSQUxJTktfVElNRVJfU1RSVUNUCVN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyOwotCUJPT0xFQU4JCQkJU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nOworCS8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKwkvKiBUaGlzIGlzIG9ubHkgZm9yIFdIUUwgdGVzdC4gKi8KKwlCT09MRUFOIFdocWxUZXN0OworCS8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KIAotCVVDSEFSICAgICAgICAgICAJRHRpbUNvdW50OyAgICAgIC8vIDAuLiBEdGltUGVyaW9kLTEKLQlVQ0hBUiAgICAgICAgICAgCUR0aW1QZXJpb2Q7ICAgICAvLyBkZWZhdWx0ID0gMworCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXI7CisJLyogRmFzdCBSb2FtaW5nICovCisJQk9PTEVBTiBiQXV0b1JvYW1pbmc7CS8qIDA6ZGlzYWJsZSBhdXRvIHJvYW1pbmcgYnkgUlNTSSwgMTplbmFibGUgYXV0byByb2FtaW5nIGJ5IFJTU0kgKi8KKwljaGFyIGRCbVRvUm9hbTsJCS8qIHRoZSBjb25kaXRpb24gdG8gcm9hbSB3aGVuIHJlY2VpdmluZyBSc3NpIGxlc3MgdGhhbiB0aGlzIHZhbHVlLiBJdCdzIG5lZ2F0aXZlIHZhbHVlLiAqLwogCi0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vIFRoaXMgaXMgb25seSBmb3IgV0hRTCB0ZXN0LgotCUJPT0xFQU4JCQkJV2hxbFRlc3Q7Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCUJPT0xFQU4gSUVFRTgwMjFYOworCUJPT0xFQU4gSUVFRTgwMjF4X3JlcXVpcmVkX2tleXM7CisJc3RydWN0IHJ0X2NpcGhlcl9rZXkgRGVzaXJlU2hhcmVkS2V5WzRdOwkvKiBSZWNvcmQgdXNlciBkZXNpcmVkIFdFUCBrZXlzICovCisJdTggRGVzaXJlU2hhcmVkS2V5SWQ7CiAKLSAgICBSQUxJTktfVElNRVJfU1RSVUNUIFdwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyOwotICAgIC8vIEZhc3QgUm9hbWluZwotCUJPT0xFQU4JCSAgICAgICAgYkZhc3RSb2FtaW5nOyAgICAgICAvLyAwOmRpc2FibGUgZmFzdCByb2FtaW5nLCAxOmVuYWJsZSBmYXN0IHJvYW1pbmcKLQlDSEFSCQkgICAgICAgIGRCbVRvUm9hbTsgICAgICAgICAgLy8gdGhlIGNvbmRpdGlvbiB0byByb2FtIHdoZW4gcmVjZWl2aW5nIFJzc2kgbGVzcyB0aGFuIHRoaXMgdmFsdWUuIEl0J3MgbmVnYXRpdmUgdmFsdWUuCisJLyogMDogZHJpdmVyIGlnbm9yZXMgd3BhX3N1cHBsaWNhbnQgKi8KKwkvKiAxOiB3cGFfc3VwcGxpY2FudCBpbml0aWF0ZXMgc2Nhbm5pbmcgYW5kIEFQIHNlbGVjdGlvbiAqLworCS8qIDI6IGRyaXZlciB0YWtlcyBjYXJlIG9mIHNjYW5uaW5nLCBBUCBzZWxlY3Rpb24sIGFuZCBJRUVFIDgwMi4xMSBhc3NvY2lhdGlvbiBwYXJhbWV0ZXJzICovCisJdTggV3BhU3VwcGxpY2FudFVQOworCXU4IFdwYVN1cHBsaWNhbnRTY2FuQ291bnQ7CisJQk9PTEVBTiBiUlNOX0lFX0Zyb21XcGFTdXBwbGljYW50OwogCi0gICAgQk9PTEVBTiAgICAgICAgICAgICBJRUVFODAyMVg7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBJRUVFODAyMXhfcmVxdWlyZWRfa2V5czsKLSAgICBDSVBIRVJfS0VZCSAgICAgICAgRGVzaXJlU2hhcmVkS2V5WzRdOwkvLyBSZWNvcmQgdXNlciBkZXNpcmVkIFdFUCBrZXlzCi0gICAgVUNIQVIgICAgICAgICAgICAgICBEZXNpcmVTaGFyZWRLZXlJZDsKKwljaGFyIGRldl9uYW1lWzE2XTsKKwl1MTYgT3JpRGV2VHlwZTsKIAotICAgIC8vIDA6IGRyaXZlciBpZ25vcmVzIHdwYV9zdXBwbGljYW50Ci0gICAgLy8gMTogd3BhX3N1cHBsaWNhbnQgaW5pdGlhdGVzIHNjYW5uaW5nIGFuZCBBUCBzZWxlY3Rpb24KLSAgICAvLyAyOiBkcml2ZXIgdGFrZXMgY2FyZSBvZiBzY2FubmluZywgQVAgc2VsZWN0aW9uLCBhbmQgSUVFRSA4MDIuMTEgYXNzb2NpYXRpb24gcGFyYW1ldGVycwotICAgIFVDSEFSICAgICAgICAgICAgICAgV3BhU3VwcGxpY2FudFVQOwotCVVDSEFSCQkJCVdwYVN1cHBsaWNhbnRTY2FuQ291bnQ7CisJQk9PTEVBTiBiVEduV2lmaVRlc3Q7CisJQk9PTEVBTiBiU2NhblJlcUlzRnJvbVdlYlVJOwogCi0gICAgQ0hBUiAgICAgICAgICAgICAgICBkZXZfbmFtZVsxNl07Ci0gICAgVVNIT1JUICAgICAgICAgICAgICBPcmlEZXZUeXBlOworCUhUVFJBTlNNSVRfU0VUVElORyBIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOwkvKiBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4gKi8KKwlERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgRGVzaXJlZFRyYW5zbWl0U2V0dGluZzsKKwlzdHJ1Y3QgcnRfaHRfcGh5X2luZm8gRGVzaXJlZEh0UGh5SW5mbzsKKwlCT09MRUFOIGJBdXRvVHhSYXRlU3dpdGNoOwogCi0gICAgQk9PTEVBTiAgICAgICAgICAgICBiVEduV2lmaVRlc3Q7Ci0JQk9PTEVBTgkJCSAgICBiU2NhblJlcUlzRnJvbVdlYlVJOworI2lmZGVmIFJUTVBfTUFDX1BDSQorCXU4IEJCUFIzOworCS8qIFBTIENvbnRyb2wgaGFzIDIgbWVhbmluZ3MgZm9yIGFkdmFuY2VkIHBvd2VyIHNhdmUgZnVuY3Rpb24uICovCisJLyogMS4gRW5hYmxlUFNpbklkbGUgOiBXaGVuIG5vIGNvbm5lY3Rpb24sIGFsd2F5cyByYWRpbyBvZmYgZXhjZXB0IG5lZWQgdG8gZG8gc2l0ZSBzdXJ2ZXkuICovCisJLyogMi4gRW5hYmxlTmV3UFMgIDogd2lsbCBzYXZlIG1vcmUgY3VycmVudCBpbiBzbGVlcCBvciByYWRpbyBvZmYgbW9kZS4gKi8KKwlQU19DT05UUk9MIFBTQ29udHJvbDsKKyNlbmRpZgkJCQkvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotCUhUVFJBTlNNSVRfU0VUVElORwkJCQlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOy8vIEZvciB0cmFuc21pdCBwaHkgc2V0dGluZyBpbiBUWFdJLgotCURFU0lSRURfVFJBTlNNSVRfU0VUVElORyAgICAgICAJRGVzaXJlZFRyYW5zbWl0U2V0dGluZzsKLQlSVF9IVF9QSFlfSU5GTwkJCQkJRGVzaXJlZEh0UGh5SW5mbzsKLQlCT09MRUFOCQkJCQkJCWJBdXRvVHhSYXRlU3dpdGNoOworCUJPT0xFQU4gYkF1dG9Db25uZWN0QnlCc3NpZDsKKwl1bnNpZ25lZCBsb25nIEJlYWNvbkxvc3RUaW1lOwkvKiBzZWNvbmRzICovCisJQk9PTEVBTiBiRm9yY2VUeEJ1cnN0OwkvKiAxOiBmb3JjZSBlbmJsZSBUWCBQQUNLRVQgQlVSU1QsIDA6IGRpc2FibGUgKi8KK307CiAKLSNpZmRlZiBSVDI4NjAKLSAgICBVQ0hBUiAgICAgICBCQlBSMzsKLSNlbmRpZgotfSBTVEFfQURNSU5fQ09ORklHLCAqUFNUQV9BRE1JTl9DT05GSUc7CisvKiBUaGlzIGRhdGEgc3RydWN0dXJlIGtlZXAgdGhlIGN1cnJlbnQgYWN0aXZlIEJTUy9JQlNTJ3MgY29uZmlndXJhdGlvbiB0aGF0IHRoaXMgU1RBICovCisvKiBoYWQgYWdyZWVkIHVwb24gam9pbmluZyB0aGUgbmV0d29yay4gV2hpY2ggbWVhbnMgdGhlc2UgcGFyYW1ldGVycyBhcmUgdXN1YWxseSBkZWNpZGVkICovCisvKiBieSB0aGUgQlNTL0lCU1MgY3JlYXRvciBpbnN0ZWFkIG9mIHVzZXIgY29uZmlndXJhdGlvbi4gRGF0YSBpbiB0aGlzIGRhdGEgc3RydWN0dXJyZSAqLworLyogaXMgdmFsaWQgb25seSB3aGVuIGVpdGhlciBBREhPQ19PTihwQWQpIG9yIElORlJBX09OKHBBZCkgaXMgVFJVRS4gKi8KKy8qIE5vcm1hbGx5LCBhZnRlciBTQ0FOIG9yIGZhaWxlZCByb2FtaW5nIGF0dGVtcHRzLCB3ZSBuZWVkIHRvIHJlY292ZXIgYmFjayB0byAqLworLyogdGhlIGN1cnJlbnQgYWN0aXZlIHNldHRpbmdzLiAqLworc3RydWN0IHJ0X3N0YV9hY3RpdmVfY29uZmlnIHsKKwl1MTYgQWlkOworCXUxNiBBdGltV2luOwkJLyogaW4ga3VzZWM7IElCU1MgcGFyYW1ldGVyIHNldCBlbGVtZW50ICovCisJdTE2IENhcGFiaWxpdHlJbmZvOworCXUxNiBDZnBNYXhEdXJhdGlvbjsKKwl1MTYgQ2ZwUGVyaW9kOwogCi0vLyBUaGlzIGRhdGEgc3RydWN0dXJlIGtlZXAgdGhlIGN1cnJlbnQgYWN0aXZlIEJTUy9JQlNTJ3MgY29uZmlndXJhdGlvbiB0aGF0IHRoaXMgU1RBCi0vLyBoYWQgYWdyZWVkIHVwb24gam9pbmluZyB0aGUgbmV0d29yay4gV2hpY2ggbWVhbnMgdGhlc2UgcGFyYW1ldGVycyBhcmUgdXN1YWxseSBkZWNpZGVkCi0vLyBieSB0aGUgQlNTL0lCU1MgY3JlYXRvciBpbnN0ZWFkIG9mIHVzZXIgY29uZmlndXJhdGlvbi4gRGF0YSBpbiB0aGlzIGRhdGEgc3RydWN0dXJyZQotLy8gaXMgdmFsaWQgb25seSB3aGVuIGVpdGhlciBBREhPQ19PTihwQWQpIG9yIElORlJBX09OKHBBZCkgaXMgVFJVRS4KLS8vIE5vcm1hbGx5LCBhZnRlciBTQ0FOIG9yIGZhaWxlZCByb2FtaW5nIGF0dGVtcHRzLCB3ZSBuZWVkIHRvIHJlY292ZXIgYmFjayB0bwotLy8gdGhlIGN1cnJlbnQgYWN0aXZlIHNldHRpbmdzLgotdHlwZWRlZiBzdHJ1Y3QgX1NUQV9BQ1RJVkVfQ09ORklHIHsKLQlVU0hPUlQgICAgICBBaWQ7Ci0JVVNIT1JUICAgICAgQXRpbVdpbjsgICAgICAgICAgICAgICAgLy8gaW4ga3VzZWM7IElCU1MgcGFyYW1ldGVyIHNldCBlbGVtZW50Ci0JVVNIT1JUICAgICAgQ2FwYWJpbGl0eUluZm87Ci0JVVNIT1JUICAgICAgQ2ZwTWF4RHVyYXRpb247Ci0JVVNIT1JUICAgICAgQ2ZwUGVyaW9kOworCS8qIENvcHkgc3VwcG9ydGVkIHJhdGUgZnJvbSBkZXNpcmVkIEFQJ3MgYmVhY29uLiBXZSBhcmUgdHJ5aW5nIHRvIG1hdGNoICovCisJLyogQVAncyBzdXBwb3J0ZWQgYW5kIGV4dGVuZGVkIHJhdGUgc2V0dGluZ3MuICovCisJdTggU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJdTggRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJdTggU3VwUmF0ZUxlbjsKKwl1OCBFeHRSYXRlTGVuOworCS8qIENvcHkgc3VwcG9ydGVkIGh0IGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaCAqLworCXN0cnVjdCBydF9odF9waHlfaW5mbyBTdXBwb3J0ZWRQaHlJbmZvOworCXN0cnVjdCBydF9odF9jYXBhYmlsaXR5IFN1cHBvcnRlZEh0UGh5OworfTsKIAotCS8vIENvcHkgc3VwcG9ydGVkIHJhdGUgZnJvbSBkZXNpcmVkIEFQJ3MgYmVhY29uLiBXZSBhcmUgdHJ5aW5nIHRvIG1hdGNoCi0JLy8gQVAncyBzdXBwb3J0ZWQgYW5kIGV4dGVuZGVkIHJhdGUgc2V0dGluZ3MuCi0JVUNIQVIgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIgICAgICAgU3VwUmF0ZUxlbjsKLQlVQ0hBUiAgICAgICBFeHRSYXRlTGVuOwotCS8vIENvcHkgc3VwcG9ydGVkIGh0IGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaAotCVJUX0hUX1BIWV9JTkZPCQlTdXBwb3J0ZWRQaHlJbmZvOwotCVJUX0hUX0NBUEFCSUxJVFkJU3VwcG9ydGVkSHRQaHk7Ci19IFNUQV9BQ1RJVkVfQ09ORklHLCAqUFNUQV9BQ1RJVkVfQ09ORklHOworc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeTsKIAotI2lmZGVmIFJUMjg3MAotLy8gZm9yIFVTQiBpbnRlcmZhY2UsIGF2b2lkIGluIGludGVycnVwdCB3aGVuIHdyaXRlIGtleQotdHlwZWRlZiBzdHJ1Y3QgICBSVF9BRERfUEFJUldJU0VfS0VZX0VOVFJZIHsKLSAgICAgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgICAgICAgICBNYWNBZGRyOwotICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY1RhYk1hdGNoV0NJRDsgICAgICAgIC8vIEFTSUMKLSAgICAgICAgQ0lQSEVSX0tFWSAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJLZXk7Ci19IFJUX0FERF9QQUlSV0lTRV9LRVlfRU5UUlksKlBSVF9BRERfUEFJUldJU0VfS0VZX0VOVFJZOwotI2VuZGlmIC8vIFJUMjg3MCAvLworc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSB7CisJLypDaG9vc2UgMSBmcm9tIFZhbGlkQXNXRFMgYW5kIFZhbGlkQXNDTEkgIHRvIHZhbGlkaXplLiAqLworCUJPT0xFQU4gVmFsaWRBc0NMSTsJLyogU3RhIG1vZGUsIHNldCB0aGlzIFRSVUUgYWZ0ZXIgTGlua3VwLHRvby4gKi8KKwlCT09MRUFOIFZhbGlkQXNXRFM7CS8qIFRoaXMgaXMgV0RTIEVudHJ5LiBvbmx5IGZvciBBUCBtb2RlLiAqLworCUJPT0xFQU4gVmFsaWRBc0FwQ2xpOwkvKlRoaXMgaXMgYSBBUC1DbGllbnQgZW50cnksIG9ubHkgZm9yIEFQIG1vZGUgd2hpY2ggZW5hYmxlIEFQLUNsaWVudCBmdW5jdGlvbnMuICovCisJQk9PTEVBTiBWYWxpZEFzTWVzaDsKKwlCT09MRUFOIFZhbGlkQXNEbHM7CS8qIFRoaXMgaXMgRExTIEVudHJ5LiBvbmx5IGZvciBTVEEgbW9kZS4gKi8KKwlCT09MRUFOIGlzQ2FjaGVkOworCUJPT0xFQU4gYklBbUJhZEF0aGVyb3M7CS8qIEZsYWcgaWYgdGhpcyBpcyBBdGhlcm9zIGNoaXAgdGhhdCBoYXMgSU9UIHByb2JsZW0uICBXZSBuZWVkIHRvIHR1cm4gb24gUlRTL0NUUyBwcm90ZWN0aW9uLiAqLwogCi0vLyAtLS0tLS0tLS0tLSBzdGFydCBvZiBBUCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQVVUSC1SU1AgU3RhdGUgTWFjaGluZSBBdXggZGF0YSBzdHJ1Y3R1cmUKLXR5cGVkZWYgc3RydWN0IF9BUF9NTE1FX0FVWCB7Ci0JVUNIQVIgICAgICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07Ci0JVVNIT1JUICAgICAgICAgICAgICBBbGc7Ci0JQ0hBUiAgICAgICAgICAgICAgICBDaGFsbGVuZ2VbQ0lQSEVSX1RFWFRfTEVOXTsKLX0gQVBfTUxNRV9BVVgsICpQQVBfTUxNRV9BVVg7Ci0KLS8vIHN0cnVjdHVyZSB0byBkZWZpbmUgV1BBIEdyb3VwIEtleSBSZWtleSBJbnRlcnZhbAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVF84MDJfMTFfV1BBX1JFS0VZIHsKLQlVTE9ORyBSZUtleU1ldGhvZDsgICAgICAgICAgLy8gbWVjaGFuaXNtIGZvciByZWtleWluZzogMDpkaXNhYmxlLCAxOiB0aW1lLWJhc2VkLCAyOiBwYWNrZXQtYmFzZWQKLQlVTE9ORyBSZUtleUludGVydmFsOyAgICAgICAgLy8gdGltZS1iYXNlZDogc2Vjb25kcywgcGFja2V0LWJhc2VkOiBraWxvLXBhY2tldHMKLX0gUlRfV1BBX1JFS0VZLCpQUlRfV1BBX1JFS0VZLCBSVF84MDJfMTFfV1BBX1JFS0VZLCAqUFJUXzgwMl8xMV9XUEFfUkVLRVk7Ci0KLXR5cGVkZWYgc3RydWN0IF9NQUNfVEFCTEVfRU5UUlkgewotCS8vQ2hvb3NlIDEgZnJvbSBWYWxpZEFzV0RTIGFuZCBWYWxpZEFzQ0xJICB0byB2YWxpZGl6ZS4KLQlCT09MRUFOCQlWYWxpZEFzQ0xJOwkJLy8gU3RhIG1vZGUsIHNldCB0aGlzIFRSVUUgYWZ0ZXIgTGlua3VwLHRvby4KLQlCT09MRUFOCQlWYWxpZEFzV0RTOwkvLyBUaGlzIGlzIFdEUyBFbnRyeS4gb25seSBmb3IgQVAgbW9kZS4KLQlCT09MRUFOCQlWYWxpZEFzQXBDbGk7ICAgLy9UaGlzIGlzIGEgQVAtQ2xpZW50IGVudHJ5LCBvbmx5IGZvciBBUCBtb2RlIHdoaWNoIGVuYWJsZSBBUC1DbGllbnQgZnVuY3Rpb25zLgotCUJPT0xFQU4JCVZhbGlkQXNNZXNoOwotCUJPT0xFQU4JCVZhbGlkQXNEbHM7CS8vIFRoaXMgaXMgRExTIEVudHJ5LiBvbmx5IGZvciBTVEEgbW9kZS4KLQlCT09MRUFOCQlpc0NhY2hlZDsKLQlCT09MRUFOCQliSUFtQmFkQXRoZXJvczsJLy8gRmxhZyBpZiB0aGlzIGlzIEF0aGVyb3MgY2hpcCB0aGF0IGhhcyBJT1QgcHJvYmxlbS4gIFdlIG5lZWQgdG8gdHVybiBvbiBSVFMvQ1RTIHByb3RlY3Rpb24uCi0KLQlVQ0hBUiAgICAgICAgIAlFbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZzsgIC8vIEVucXVldWUgRUFQb0wtU3RhcnQgZm9yIHRyaWdnZXJpbmcgRUFQIFNNCi0JLy9qYW4gZm9yIHdwYQotCS8vIHJlY29yZCB3aGljaCBlbnRyeSByZXZva2UgTUlDIEZhaWx1cmUgLCBpZiBpdCBsZWF2ZXMgdGhlIEJTUyBpdHNlbGYsIEFQIHdvbid0IHVwZGF0ZSBhTUlDRmFpbFRpbWUgTUlCCi0JVUNIQVIgICAgICAgICAgIENNVGltZXJSdW5uaW5nOwotCVVDSEFSICAgICAgICAgICBhcGlkeDsJCQkvLyBNQlNTIG51bWJlcgotCVVDSEFSICAgICAgICAgICBSU05JRV9MZW47Ci0JVUNIQVIgICAgICAgICAgIFJTTl9JRVtNQVhfTEVOX09GX1JTTklFXTsKLQlVQ0hBUiAgICAgICAgICAgQU5vbmNlW0xFTl9LRVlfREVTQ19OT05DRV07Ci0JVUNIQVIgICAgICAgICAgIFJfQ291bnRlcltMRU5fS0VZX0RFU0NfUkVQTEFZXTsKLQlVQ0hBUiAgICAgICAgICAgUFRLWzY0XTsKLQlVQ0hBUiAgICAgICAgICAgUmVUcnlDb3VudGVyOwotCVJBTElOS19USU1FUl9TVFJVQ1QgICAgICAgICAgICAgICAgIFJldHJ5VGltZXI7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVAkJCQkJRW5xdWV1ZVN0YXJ0Rm9yUFNLVGltZXI7CS8vIEEgdGltZXIgd2hpY2ggZW5xdWV1ZSBFQVBvTC1TdGFydCBmb3IgdHJpZ2dlcmluZyBQU0sgU00KLQlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsgICAvLyBUaGlzIHNob3VsZCBtYXRjaCB0byB3aGF0ZXZlciBtaWNyb3NvZnQgZGVmaW5lZAotCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKLQlBUF9XUEFfU1RBVEUgICAgV3BhU3RhdGU7Ci0JR1RLX1NUQVRFICAgICAgIEdUS1N0YXRlOwotCVVTSE9SVCAgICAgICAgICBQb3J0U2VjdXJlZDsKLQlORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiAgUHJpdmFjeUZpbHRlcjsgICAgICAvLyBQcml2YWN5RmlsdGVyIGVudW0gZm9yIDgwMi4xWAotCUNJUEhFUl9LRVkgICAgICBQYWlyd2lzZUtleTsKLQlQVk9JRCAgICAgICAgICAgcEFkOwotICAgIElOVAkJCQlQTUtJRF9DYWNoZUlkeDsKLSAgICBVQ0hBUgkJCVBNS0lEW0xFTl9QTUtJRF07Ci0KLQotCVVDSEFSICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICAgICAgICAgIFBzTW9kZTsKLQlTU1QgICAgICAgICAgICAgU3N0OwotCUFVVEhfU1RBVEUgICAgICBBdXRoU3RhdGU7IC8vIGZvciBTSEFSRUQgS0VZIGF1dGhlbnRpY2F0aW9uIHN0YXRlIG1hY2hpbmUgdXNlZCBvbmx5Ci0JQk9PTEVBTgkJCUlzUmVhc3NvY1N0YTsJLy8gSW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIGEgcmVhc3NvY2lhdGlvbiBwcm9jZWR1cmUKLQlVU0hPUlQgICAgICAgICAgQWlkOwotCVVTSE9SVCAgICAgICAgICBDYXBhYmlsaXR5SW5mbzsKLQlVQ0hBUiAgICAgICAgICAgTGFzdFJzc2k7Ci0JVUxPTkcgICAgICAgICAgIE5vRGF0YUlkbGVDb3VudDsKLQlVSU5UMTYJCQlTdGF0aW9uS2VlcEFsaXZlQ291bnQ7IC8vIHVuaXQ6IHNlY29uZAotCVVMT05HICAgICAgICAgICBQc1FJZGxlQ291bnQ7Ci0JUVVFVUVfSEVBREVSICAgIFBzUXVldWU7Ci0KLQlVSU5UMzIJCQlTdGFDb25uZWN0VGltZTsJCS8vIHRoZSBsaXZlIHRpbWUgb2YgdGhpcyBzdGF0aW9uIHNpbmNlIGFzc29jaWF0ZWQgd2l0aCBBUAotCi0JQk9PTEVBTgkJCWJTZW5kQkFSOwotCVVTSE9SVAkJCU5vQkFEYXRhQ291bnREb3duOwotCi0JVUlOVDMyICAgCQlDYWNoZWRCdWZbMTZdOwkJLy8gVUlOVCAoNCBieXRlcykgZm9yIGFsaWdubWVudAotCVVJTlQJCQlUeEJGQ291bnQ7IC8vIDMqMwotCVVJTlQJCQlGSUZPQ291bnQ7Ci0JVUlOVAkJCURlYnVnRklGT0NvdW50OwotCVVJTlQJCQlEZWJ1Z1R4Q291bnQ7Ci0gICAgQk9PTEVBTgkJCWJEbHNJbml0OwotCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy9XRFMgZW50cnkgbmVlZHMgdGhlc2UKLS8vIHJ0Mjg2MCBhZGQgdGhpcy4gaWYgVmFsaWRBc1dEUz09VFJVRSwgTWF0Y2hXRFNUYWJJZHggaXMgdGhlIGluZGV4IGluIFdkc1RhYi5NYWNUYWIKLQlVSU5UCQkJTWF0Y2hXRFNUYWJJZHg7Ci0JVUNIQVIgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGU7Ci0JVUNIQVIgICAgICAgICAgIEN1cnJUeFJhdGU7Ci0JVUNIQVIgICAgICAgICAgIEN1cnJUeFJhdGVJbmRleDsKLQkvLyB0byByZWNvcmQgdGhlIGVhY2ggVFggcmF0ZSdzIHF1YWxpdHkuIDAgaXMgYmVzdCwgdGhlIGJpZ2dlciB0aGUgd29yc2UuCi0JVVNIT1JUICAgICAgICAgIFR4UXVhbGl0eVtNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07Ci0JVUlOVDMyCQkJT25lU2VjVHhOb1JldHJ5T2tDb3VudDsKLQlVSU5UMzIgICAgICAgICAgT25lU2VjVHhSZXRyeU9rQ291bnQ7Ci0JVUlOVDMyICAgICAgICAgIE9uZVNlY1R4RmFpbENvdW50OwotCVVJTlQzMgkJCUNvbnRpbnVlVHhGYWlsQ250OwotCVVJTlQzMiAgICAgICAgICBDdXJyVHhSYXRlU3RhYmxlVGltZTsgLy8gIyBvZiBzZWNvbmQgaW4gY3VycmVudCBUWCByYXRlCi0JVUNIQVIgICAgICAgICAgIFR4UmF0ZVVwUGVuYWx0eTsgICAgICAvLyBleHRyYSAjIG9mIHNlY29uZCBwZW5hbHR5IGR1ZSB0byBsYXN0IHVuc3RhYmxlIGNvbmRpdGlvbgotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlCT09MRUFOICAgICAgICAgZk5vaXN5RW52aXJvbm1lbnQ7Ci0JQk9PTEVBTgkJCWZMYXN0U2VjQWNjb3JkaW5nUlNTSTsKLQlVQ0hBUiAgICAgICAgICAgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbjsgLy8gMDogbm8gY2hhbmdlLCAxOnJhdGUgVVAsIDI6cmF0ZSBkb3duCi0JQ0hBUgkJCUxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uOyAvL0tlZXAgbGFzdCB0aW1lIHZhbHVlIG9mIExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24KLQlVTE9ORwkJCUxhc3RUeE9rQ291bnQ7Ci0JVUNIQVIgICAgICAgICAgIFBFUltNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07Ci0KLQkvLyBhIGJpdG1hcCBvZiBCT09MRUFOIGZsYWdzLiBlYWNoIGJpdCByZXByZXNlbnQgYW4gb3BlcmF0aW9uIHN0YXR1cyBvZiBhIHBhcnRpY3VsYXIKLQkvLyBCT09MRUFOIGNvbnRyb2wsIGVpdGhlciBPTiBvciBPRkYuIFRoZXNlIGZsYWdzIHNob3VsZCBhbHdheXMgYmUgYWNjZXNzZWQgdmlhCi0JLy8gQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcoKSwgQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygpLCBDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcoKSBtYWNyb3MuCi0JLy8gc2VlIGZPUF9TVEFUVVNfeHh4IGluIFJUTVBfREVGLkMgZm9yIGRldGFpbCBiaXQgZGVmaW5pdGlvbi4gZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VECi0JVUxPTkcgICAgICAgICAgIENsaWVudFN0YXR1c0ZsYWdzOwotCi0JSFRUUkFOU01JVF9TRVRUSU5HCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7Ly8gRm9yIHRyYW5zbWl0IHBoeSBzZXR0aW5nIGluIFRYV0kuCi0KLQkvLyBIVCBFV0MgTUlNTy1OIHVzZWQgcGFyYW1ldGVycwotCVVTSE9SVAkJUlhCQWJpdG1hcDsJLy8gZmlsbCB0byBvbi1jaGlwICBSWFdJX0JBX0JJVE1BU0sgaW4gOC4xLjNSWCBhdHRyaWJ1dGUgZW50cnkgZm9ybWF0Ci0JVVNIT1JUCQlUWEJBYml0bWFwOwkvLyBUaGlzIGJpdG1hcCBhcyBvcmlnaW5hdG9yLCBvbmx5IGtlZXAgaW4gc29mdHdhcmUgdXNlZCB0byBtYXJrIEFNUERVIGJpdCBpbiBUWFdJCi0JVVNIT1JUCQlUWEF1dG9CQWJpdG1hcDsKLQlVU0hPUlQJCUJBRGVjbGluZUJpdG1hcDsKLQlVU0hPUlQJCUJBUmVjV2NpZEFycmF5W05VTV9PRl9USURdOwkvLyBUaGUgbWFwcGluZyB3Y2lkIG9mIHJlY2lwaWVudCBzZXNzaW9uLiBpZiBSWEJBYml0bWFwIGJpdCBpcyBtYXNrZWQKLQlVU0hPUlQJCUJBT3JpV2NpZEFycmF5W05VTV9PRl9USURdOyAvLyBUaGUgbWFwcGluZyB3Y2lkIG9mIG9yaWdpbmF0b3Igc2Vzc2lvbi4gaWYgVFhCQWJpdG1hcCBiaXQgaXMgbWFza2VkCi0JVVNIT1JUCQlCQU9yaVNlcXVlbmNlW05VTV9PRl9USURdOyAvLyBUaGUgbWFwcGluZyB3Y2lkIG9mIG9yaWdpbmF0b3Igc2Vzc2lvbi4gaWYgVFhCQWJpdG1hcCBiaXQgaXMgbWFza2VkCi0KLQkvLyA4MDIuMTFuIGZlYXR1cmVzLgotCVVDSEFSCQlNcGR1RGVuc2l0eTsKLQlVQ0hBUgkJTWF4UkFtcGR1RmFjdG9yOwotCVVDSEFSCQlBTXNkdVNpemU7Ci0JVUNIQVIJCU1tcHNNb2RlOwkvLyBNSU1PIHBvd2VyIHNhdmUgbW9yZS4KLQotCUhUX0NBUEFCSUxJVFlfSUUJCUhUQ2FwYWJpbGl0eTsKLQotCUJPT0xFQU4JCWJBdXRvVHhSYXRlU3dpdGNoOwotCi0JVUNIQVIgICAgICAgUmF0ZUxlbjsKLQlzdHJ1Y3QgX01BQ19UQUJMRV9FTlRSWSAqcE5leHQ7Ci0gICAgVVNIT1JUICAgICAgVHhTZXFbTlVNX09GX1RJRF07Ci0JVVNIT1JUCQlOb25Rb3NEYXRhU2VxOwotCi0JUlNTSV9TQU1QTEUJUnNzaVNhbXBsZTsKLQotCVVJTlQzMgkJCVRYTUNTRXhwZWN0ZWRbMTZdOwotCVVJTlQzMgkJCVRYTUNTU3VjY2Vzc2Z1bFsxNl07Ci0JVUlOVDMyCQkJVFhNQ1NGYWlsZWRbMTZdOwotCVVJTlQzMgkJCVRYTUNTQXV0b0ZhbGxCYWNrWzE2XVsxNl07Ci0jaWZkZWYgUlQyODcwCi0JVUxPTkcgICAJCUxhc3RCZWFjb25SeFRpbWU7Ci0jZW5kaWYKLX0gTUFDX1RBQkxFX0VOVFJZLCAqUE1BQ19UQUJMRV9FTlRSWTsKLQotdHlwZWRlZiBzdHJ1Y3QgX01BQ19UQUJMRSB7Ci0JVVNIT1JUCQkJU2l6ZTsKLQlNQUNfVEFCTEVfRU5UUlkgKkhhc2hbSEFTSF9UQUJMRV9TSVpFXTsKLQlNQUNfVEFCTEVfRU5UUlkgQ29udGVudFtNQVhfTEVOX09GX01BQ19UQUJMRV07Ci0JUVVFVUVfSEVBREVSICAgIE1jYXN0UHNRdWV1ZTsKLQlVTE9ORyAgICAgICAgICAgUHNRSWRsZUNvdW50OwotCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbkluUHNtOwotCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbkJhZEF0aGVyb3M7CS8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGlzIGF0aGVyb3MgODAyLjExbiBDaGlwLiAgV2UgbmVlZCB0byB1c2UgUlRTL0NUUyB3aXRoIEF0aGVyb3MgODAyLC4xMW4gY2hpcC4KLQlCT09MRUFOCQkJZkFueVR4T1BGb3JjZURpc2FibGU7CS8vIENoZWNrIGlmIGl0IGlzIG5lY2Vzc2FyeSB0byBkaXNhYmxlIEJFIFR4T1AKLSNpZmRlZiBSVDI4NzAKLQlCT09MRUFOCQkJZkFsbFN0YXRpb25Bc1JhbGluazsgCS8vIENoZWNrIGlmIGFsbCBzdGF0aW9ucyBhcmUgcmFsaW5rLWNoaXBzZXQKLSNlbmRpZgotCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbklzTGVnYWN5OwkvLyBDaGVjayBpZiBJIHVzZSBsZWdhY3kgcmF0ZSB0byB0cmFuc21pdCB0byBteSBCU1MgU3RhdGlvbi8KLQlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb25Ob25HRjsJCS8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGNhbid0IHN1cHBvcnQgR0YuCi0JQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uMjBPbmx5OwkJLy8gQ2hlY2sgaWYgYW55IFN0YXRpb24gY2FuJ3Qgc3VwcG9ydCBHRi4KLQlCT09MRUFOCQkJZkFueVN0YXRpb25NSU1PUFNEeW5hbWljOyAvLyBDaGVjayBpZiBhbnkgU3RhdGlvbiBpcyBNSU1PIER5bmFtaWMKLQlCT09MRUFOICAgICAgICAgZkFueUJBU2Vzc2lvbjsgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBCQSBzZXNzaW9uLiAgRm9yY2UgdHVybiBvbiBSVFMvQ1RTCi19IE1BQ19UQUJMRSwgKlBNQUNfVEFCTEU7Ci0KLSNkZWZpbmUgSVNfSFRfU1RBKF9wTWFjRW50cnkpCVwKLQkoX3BNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKLQotI2RlZmluZSBJU19IVF9SQVRFKF9wTWFjRW50cnkpCVwKLQkoX3BNYWNFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKLQotI2RlZmluZSBQRUVSX0lTX0hUX1JBVEUoX3BNYWNFbnRyeSkJXAotCShfcE1hY0VudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQotCi10eXBlZGVmIHN0cnVjdCBfV0RTX0VOVFJZIHsKLQlCT09MRUFOICAgICAgICAgVmFsaWQ7Ci0JVUNIQVIgICAgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKLQlVTE9ORyAgICAgICAgICAgTm9EYXRhSWRsZUNvdW50OwotCXN0cnVjdCBfV0RTX0VOVFJZICpwTmV4dDsKLX0gV0RTX0VOVFJZLCAqUFdEU19FTlRSWTsKKwl1OCBFbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZzsJLyogRW5xdWV1ZSBFQVBvTC1TdGFydCBmb3IgdHJpZ2dlcmluZyBFQVAgU00gKi8KKwkvKmphbiBmb3Igd3BhICovCisJLyogcmVjb3JkIHdoaWNoIGVudHJ5IHJldm9rZSBNSUMgRmFpbHVyZSAsIGlmIGl0IGxlYXZlcyB0aGUgQlNTIGl0c2VsZiwgQVAgd29uJ3QgdXBkYXRlIGFNSUNGYWlsVGltZSBNSUIgKi8KKwl1OCBDTVRpbWVyUnVubmluZzsKKwl1OCBhcGlkeDsJCS8qIE1CU1MgbnVtYmVyICovCisJdTggUlNOSUVfTGVuOworCXU4IFJTTl9JRVtNQVhfTEVOX09GX1JTTklFXTsKKwl1OCBBTm9uY2VbTEVOX0tFWV9ERVNDX05PTkNFXTsKKwl1OCBTTm9uY2VbTEVOX0tFWV9ERVNDX05PTkNFXTsKKwl1OCBSX0NvdW50ZXJbTEVOX0tFWV9ERVNDX1JFUExBWV07CisJdTggUFRLWzY0XTsKKwl1OCBSZVRyeUNvdW50ZXI7CisJc3RydWN0IHJ0X3JhbGlua190aW1lciBSZXRyeVRpbWVyOworCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgRW5xdWV1ZVN0YXJ0Rm9yUFNLVGltZXI7CS8qIEEgdGltZXIgd2hpY2ggZW5xdWV1ZSBFQVBvTC1TdGFydCBmb3IgdHJpZ2dlcmluZyBQU0sgU00gKi8KKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIEF1dGhNb2RlOwkvKiBUaGlzIHNob3VsZCBtYXRjaCB0byB3aGF0ZXZlciBtaWNyb3NvZnQgZGVmaW5lZCAqLworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgV2VwU3RhdHVzOworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgR3JvdXBLZXlXZXBTdGF0dXM7CisJQVBfV1BBX1NUQVRFIFdwYVN0YXRlOworCUdUS19TVEFURSBHVEtTdGF0ZTsKKwl1MTYgUG9ydFNlY3VyZWQ7CisJTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIgUHJpdmFjeUZpbHRlcjsJLyogUHJpdmFjeUZpbHRlciBlbnVtIGZvciA4MDIuMVggKi8KKwlzdHJ1Y3QgcnRfY2lwaGVyX2tleSBQYWlyd2lzZUtleTsKKwl2b2lkICpwQWQ7CisJaW50IFBNS0lEX0NhY2hlSWR4OworCXU4IFBNS0lEW0xFTl9QTUtJRF07CiAKLXR5cGVkZWYgc3RydWN0ICBfV0RTX1RBQkxFX0VOVFJZIHsKLQlVU0hPUlQJCQlTaXplOwotCVVDSEFSICAgICAgICAgICBXZHNBZGRyW01BQ19BRERSX0xFTl07Ci0JV0RTX0VOVFJZICAgICAgICpIYXNoW0hBU0hfVEFCTEVfU0laRV07Ci0JV0RTX0VOVFJZICAgICAgIENvbnRlbnRbTUFYX0xFTl9PRl9NQUNfVEFCTEVdOwotCVVDSEFSICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlOwotCVVDSEFSICAgICAgICAgICBDdXJyVHhSYXRlOwotCVVTSE9SVCAgICAgICAgICBUeFF1YWxpdHlbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVTSE9SVCAgICAgICAgICBPbmVTZWNUeE9rQ291bnQ7Ci0JVVNIT1JUICAgICAgICAgIE9uZVNlY1R4UmV0cnlPa0NvdW50OwotCVVTSE9SVCAgICAgICAgICBPbmVTZWNUeEZhaWxDb3VudDsKLQlVTE9ORyAgICAgICAgICAgQ3VyclR4UmF0ZVN0YWJsZVRpbWU7IC8vICMgb2Ygc2Vjb25kIGluIGN1cnJlbnQgVFggcmF0ZQotCVVDSEFSICAgICAgICAgICBUeFJhdGVVcFBlbmFsdHk7ICAgICAgLy8gZXh0cmEgIyBvZiBzZWNvbmQgcGVuYWx0eSBkdWUgdG8gbGFzdCB1bnN0YWJsZSBjb25kaXRpb24KLX0gV0RTX1RBQkxFX0VOVFJZLCAqUFdEU19UQUJMRV9FTlRSWTsKKwl1OCBBZGRyW01BQ19BRERSX0xFTl07CisJdTggUHNNb2RlOworCVNTVCBTc3Q7CisJQVVUSF9TVEFURSBBdXRoU3RhdGU7CS8qIGZvciBTSEFSRUQgS0VZIGF1dGhlbnRpY2F0aW9uIHN0YXRlIG1hY2hpbmUgdXNlZCBvbmx5ICovCisJQk9PTEVBTiBJc1JlYXNzb2NTdGE7CS8qIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhIHJlYXNzb2NpYXRpb24gcHJvY2VkdXJlICovCisJdTE2IEFpZDsKKwl1MTYgQ2FwYWJpbGl0eUluZm87CisJdTggTGFzdFJzc2k7CisJdW5zaWduZWQgbG9uZyBOb0RhdGFJZGxlQ291bnQ7CisJdTE2IFN0YXRpb25LZWVwQWxpdmVDb3VudDsJLyogdW5pdDogc2Vjb25kICovCisJdW5zaWduZWQgbG9uZyBQc1FJZGxlQ291bnQ7CisJc3RydWN0IHJ0X3F1ZXVlX2hlYWRlciBQc1F1ZXVlOwogCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX1dEU19FTlRSWSB7Ci0JUE5FVF9ERVYJCQlkZXY7Ci0JVUNIQVIJCQkJVmFsaWQ7Ci0JVUNIQVIJCQkJUGh5TW9kZTsKLQlVQ0hBUgkJCQlQZWVyV2RzQWRkcltNQUNfQUREUl9MRU5dOwotCVVDSEFSCQkJCU1hY1RhYk1hdGNoV0NJRDsJLy8gQVNJQwotCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgIFdlcFN0YXR1czsKLQlVQ0hBUgkJCQkJS2V5SWR4OwotCUNJUEhFUl9LRVkgICAgICAgICAgCVdkc0tleTsKLQlIVFRSQU5TTUlUX1NFVFRJTkcJCQkJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsKLQlSVF9IVF9QSFlfSU5GTwkJCQkJRGVzaXJlZEh0UGh5SW5mbzsKLQlCT09MRUFOCQkJCQkJCWJBdXRvVHhSYXRlU3dpdGNoOwotCURFU0lSRURfVFJBTlNNSVRfU0VUVElORyAgICAgICAJRGVzaXJlZFRyYW5zbWl0U2V0dGluZzsgLy8gRGVzaXJlZCB0cmFuc21pdCBzZXR0aW5nLgotfSBSVF84MDJfMTFfV0RTX0VOVFJZLCAqUFJUXzgwMl8xMV9XRFNfRU5UUlk7CisJdTMyIFN0YUNvbm5lY3RUaW1lOwkvKiB0aGUgbGl2ZSB0aW1lIG9mIHRoaXMgc3RhdGlvbiBzaW5jZSBhc3NvY2lhdGVkIHdpdGggQVAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgX1dEU19UQUJMRSB7Ci0JVUNIQVIgICAgICAgICAgICAgICBNb2RlOwotCVVMT05HICAgICAgICAgICAgICAgU2l6ZTsKLQlSVF84MDJfMTFfV0RTX0VOVFJZCVdkc0VudHJ5W01BWF9XRFNfRU5UUlldOwotfSBXRFNfVEFCTEUsICpQV0RTX1RBQkxFOworCUJPT0xFQU4gYlNlbmRCQVI7CisJdTE2IE5vQkFEYXRhQ291bnREb3duOwogCi10eXBlZGVmIHN0cnVjdCBfQVBDTElfU1RSVUNUIHsKLQlQTkVUX0RFVgkJCQlkZXY7Ci0jaWZkZWYgUlRMODY1WF9TT0MKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBteWxpbmtpZDsKLSNlbmRpZgotCUJPT0xFQU4gICAgICAgICAgICAgICAgIEVuYWJsZTsJLy8gU2V0IGl0IGFzIDEgaWYgdGhlIGFwY2xpIGludGVyZmFjZSB3YXMgY29uZmlndXJlZCB0byAiMSIgIG9yIGJ5IGl3cHJpdiBjbWQgIkFwQ2xpRW5hYmxlIgotCUJPT0xFQU4gICAgICAgICAgICAgICAgIFZhbGlkOwkvLyBTZXQgaXQgYXMgMSBpZiB0aGUgYXBjbGkgaW50ZXJmYWNlIGFzc29jaWF0ZWQgc3VjY2VzcyB0byByZW1vdGUgQVAuCi0JVUNIQVIJCQkJCU1hY1RhYldDSUQ7CS8vV0NJRCB2YWx1ZSwgd2hpY2ggcG9pbnQgdG8gdGhlIGVudHJ5IG9mIEFTSUMgTWFjIHRhYmxlLgotCVVDSEFSICAgICAgICAgICAgICAgICAgIFNzaWRMZW47Ci0JQ0hBUiAgICAgICAgICAgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworCXUzMiBDYWNoZWRCdWZbMTZdOwkvKiB1MzIgKDQgYnl0ZXMpIGZvciBhbGlnbm1lbnQgKi8KKwl1MzIgVHhCRkNvdW50OwkJLyogMyozICovCisJdTMyIEZJRk9Db3VudDsKKwl1MzIgRGVidWdGSUZPQ291bnQ7CisJdTMyIERlYnVnVHhDb3VudDsKKwlCT09MRUFOIGJEbHNJbml0OwogCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgQ2ZnU3NpZExlbjsKLQlDSEFSICAgICAgICAgICAgICAgICAgICBDZmdTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0JVUNIQVIgICAgICAgICAgICAgICAgICAgQ2ZnQXBDbGlCc3NpZFtFVEhfTEVOR1RIX09GX0FERFJFU1NdOwotCVVDSEFSICAgICAgICAgICAgICAgICAgIEN1cnJlbnRBZGRyZXNzW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qV0RTIGVudHJ5IG5lZWRzIHRoZXNlICovCisvKiBpZiBWYWxpZEFzV0RTPT1UUlVFLCBNYXRjaFdEU1RhYklkeCBpcyB0aGUgaW5kZXggaW4gV2RzVGFiLk1hY1RhYiAqLworCXUzMiBNYXRjaFdEU1RhYklkeDsKKwl1OCBNYXhTdXBwb3J0ZWRSYXRlOworCXU4IEN1cnJUeFJhdGU7CisJdTggQ3VyclR4UmF0ZUluZGV4OworCS8qIHRvIHJlY29yZCB0aGUgZWFjaCBUWCByYXRlJ3MgcXVhbGl0eS4gMCBpcyBiZXN0LCB0aGUgYmlnZ2VyIHRoZSB3b3JzZS4gKi8KKwl1MTYgVHhRdWFsaXR5W01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKKy8qICAgICAgdTE2ICAgICAgICAgIE9uZVNlY1R4T2tDb3VudDsgKi8KKwl1MzIgT25lU2VjVHhOb1JldHJ5T2tDb3VudDsKKwl1MzIgT25lU2VjVHhSZXRyeU9rQ291bnQ7CisJdTMyIE9uZVNlY1R4RmFpbENvdW50OworCXUzMiBDb250aW51ZVR4RmFpbENudDsKKwl1MzIgQ3VyclR4UmF0ZVN0YWJsZVRpbWU7CS8qICMgb2Ygc2Vjb25kIGluIGN1cnJlbnQgVFggcmF0ZSAqLworCXU4IFR4UmF0ZVVwUGVuYWx0eTsJLyogZXh0cmEgIyBvZiBzZWNvbmQgcGVuYWx0eSBkdWUgdG8gbGFzdCB1bnN0YWJsZSBjb25kaXRpb24gKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0JVUxPTkcgICAgICAgICAgICAgICAgICAgQXBDbGlSY3ZCZWFjb25UaW1lOworCUJPT0xFQU4gZk5vaXN5RW52aXJvbm1lbnQ7CisJQk9PTEVBTiBmTGFzdFNlY0FjY29yZGluZ1JTU0k7CisJdTggTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbjsJLyogMDogbm8gY2hhbmdlLCAxOnJhdGUgVVAsIDI6cmF0ZSBkb3duICovCisJY2hhciBMYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbjsJLypLZWVwIGxhc3QgdGltZSB2YWx1ZSBvZiBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uICovCisJdW5zaWduZWQgbG9uZyBMYXN0VHhPa0NvdW50OworCXU4IFBFUltNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07CiAKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBDdHJsQ3VyclN0YXRlOwotCVVMT05HICAgICAgICAgICAgICAgICAgIFN5bmNDdXJyU3RhdGU7Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgQXV0aEN1cnJTdGF0ZTsKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBBc3NvY0N1cnJTdGF0ZTsKLQlVTE9ORwkJCQkJV3BhUHNrQ3VyclN0YXRlOworCS8qIGEgYml0bWFwIG9mIEJPT0xFQU4gZmxhZ3MuIGVhY2ggYml0IHJlcHJlc2VudCBhbiBvcGVyYXRpb24gc3RhdHVzIG9mIGEgcGFydGljdWxhciAqLworCS8qIEJPT0xFQU4gY29udHJvbCwgZWl0aGVyIE9OIG9yIE9GRi4gVGhlc2UgZmxhZ3Mgc2hvdWxkIGFsd2F5cyBiZSBhY2Nlc3NlZCB2aWEgKi8KKwkvKiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRygpLCBDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCksIENMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRygpIG1hY3Jvcy4gKi8KKwkvKiBzZWUgZk9QX1NUQVRVU194eHggaW4gUlRNUF9ERUYuQyBmb3IgZGV0YWlsIGJpdCBkZWZpbml0aW9uLiBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQgKi8KKwl1bnNpZ25lZCBsb25nIENsaWVudFN0YXR1c0ZsYWdzOwogCi0JVVNIT1JUICAgICAgICAgICAgICAgICAgQXV0aFJlcUNudDsKLQlVU0hPUlQgICAgICAgICAgICAgICAgICBBc3NvY1JlcUNudDsKKwlIVFRSQU5TTUlUX1NFVFRJTkcgSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsJLyogRm9yIHRyYW5zbWl0IHBoeSBzZXR0aW5nIGluIFRYV0kuICovCiAKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBDbGllbnRTdGF0dXNGbGFnczsKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBNcGR1RGVuc2l0eTsKKwkvKiBIVCBFV0MgTUlNTy1OIHVzZWQgcGFyYW1ldGVycyAqLworCXUxNiBSWEJBYml0bWFwOwkvKiBmaWxsIHRvIG9uLWNoaXAgIFJYV0lfQkFfQklUTUFTSyBpbiA4LjEuM1JYIGF0dHJpYnV0ZSBlbnRyeSBmb3JtYXQgKi8KKwl1MTYgVFhCQWJpdG1hcDsJLyogVGhpcyBiaXRtYXAgYXMgb3JpZ2luYXRvciwgb25seSBrZWVwIGluIHNvZnR3YXJlIHVzZWQgdG8gbWFyayBBTVBEVSBiaXQgaW4gVFhXSSAqLworCXUxNiBUWEF1dG9CQWJpdG1hcDsKKwl1MTYgQkFEZWNsaW5lQml0bWFwOworCXUxNiBCQVJlY1djaWRBcnJheVtOVU1fT0ZfVElEXTsJLyogVGhlIG1hcHBpbmcgd2NpZCBvZiByZWNpcGllbnQgc2Vzc2lvbi4gaWYgUlhCQWJpdG1hcCBiaXQgaXMgbWFza2VkICovCisJdTE2IEJBT3JpV2NpZEFycmF5W05VTV9PRl9USURdOwkvKiBUaGUgbWFwcGluZyB3Y2lkIG9mIG9yaWdpbmF0b3Igc2Vzc2lvbi4gaWYgVFhCQWJpdG1hcCBiaXQgaXMgbWFza2VkICovCisJdTE2IEJBT3JpU2VxdWVuY2VbTlVNX09GX1RJRF07CS8qIFRoZSBtYXBwaW5nIHdjaWQgb2Ygb3JpZ2luYXRvciBzZXNzaW9uLiBpZiBUWEJBYml0bWFwIGJpdCBpcyBtYXNrZWQgKi8KIAotCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOyAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRvIHdoYXRldmVyIG1pY3Jvc29mdCBkZWZpbmVkCi0JTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworCS8qIDgwMi4xMW4gZmVhdHVyZXMuICovCisJdTggTXBkdURlbnNpdHk7CisJdTggTWF4UkFtcGR1RmFjdG9yOworCXU4IEFNc2R1U2l6ZTsKKwl1OCBNbXBzTW9kZTsJCS8qIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLiAqLwogCi0JLy8gQWRkIHRvIHN1cHBvcnQgZGlmZmVyZW50IGNpcGhlciBzdWl0ZSBmb3IgV1BBMi9XUEEgbW9kZQotCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCQlHcm91cENpcGhlcjsJCS8vIE11bHRpY2FzdCBjaXBoZXIgc3VpdGUKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJUGFpckNpcGhlcjsJCQkvLyBVbmljYXN0IGNpcGhlciBzdWl0ZQotCUJPT0xFQU4JCQkJCQkJCWJNaXhDaXBoZXI7CQkJLy8gSW5kaWNhdGUgY3VycmVudCBQYWlyICYgR3JvdXAgdXNlIGRpZmZlcmVudCBjaXBoZXIgc3VpdGVzCi0JVVNIT1JUCQkJCQkJCQlSc25DYXBhYmlsaXR5OworCXN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llIEhUQ2FwYWJpbGl0eTsKIAotCVVDSEFSCQlQU0tbMTAwXTsJCQkJLy8gcmVzZXJ2ZSBQU0sga2V5IG1hdGVyaWFsCi0JVUNIQVIgICAgICAgUFNLTGVuOwotCVVDSEFSICAgICAgIFBNS1szMl07ICAgICAgICAgICAgICAgIC8vIFdQQSBQU0sgbW9kZSBQTUsKLQlVQ0hBUgkJR1RLWzMyXTsJCQkJLy8gR1RLIGZyb20gYXV0aGVudGljYXRvcgorCUJPT0xFQU4gYkF1dG9UeFJhdGVTd2l0Y2g7CiAKLQlDSVBIRVJfS0VZICAgICAgU2hhcmVkS2V5W1NIQVJFX0tFWV9OVU1dOwotCVVDSEFSICAgICAgICAgICBEZWZhdWx0S2V5SWQ7CisJdTggUmF0ZUxlbjsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwTmV4dDsKKwl1MTYgVHhTZXFbTlVNX09GX1RJRF07CisJdTE2IE5vblFvc0RhdGFTZXE7CiAKLQkvLyBzdG9yZSBSU05fSUUgYnVpbHQgYnkgZHJpdmVyCi0JVUNIQVIJCVJTTl9JRVtNQVhfTEVOX09GX1JTTklFXTsgIC8vIFRoZSBjb250ZW50IHNhdmVkIGhlcmUgc2hvdWxkIGJlIGNvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCi0JVUNIQVIJCVJTTklFX0xlbjsKKwlzdHJ1Y3QgcnRfcnNzaV9zYW1wbGUgUnNzaVNhbXBsZTsKIAotCS8vIEZvciBXUEEgY291bnRlcm1lYXN1cmVzCi0JVUxPTkcgICAgICAgTGFzdE1pY0Vycm9yVGltZTsgICAvLyByZWNvcmQgbGFzdCBNSUMgZXJyb3IgdGltZQotCUJPT0xFQU4gICAgICAgICAgICAgICAgIGJCbG9ja0Fzc29jOyAvLyBCbG9jayBhc3NvY2lhdGUgYXR0ZW1wdCBmb3IgNjAgc2Vjb25kcyBhZnRlciBjb3VudGVyIG1lYXN1cmUgb2NjdXJyZWQuCisJdTMyIFRYTUNTRXhwZWN0ZWRbMTZdOworCXUzMiBUWE1DU1N1Y2Nlc3NmdWxbMTZdOworCXUzMiBUWE1DU0ZhaWxlZFsxNl07CisJdTMyIFRYTUNTQXV0b0ZhbGxCYWNrWzE2XVsxNl07CiAKLQkvLyBGb3IgV1BBLVBTSyBzdXBwbGljYW50IHN0YXRlCi0JVUNIQVIgICAgICAgCVNOb25jZVszMl07ICAgICAgICAgLy8gU05vbmNlIGZvciBXUEEtUFNLCi0JVUNIQVIJCQlHTm9uY2VbMzJdOwkJCS8vIEdOb25jZSBmb3IgV1BBLVBTSyBmcm9tIGF1dGhlbnRpY2F0b3IKKwl1bnNpZ25lZCBsb25nIExhc3RCZWFjb25SeFRpbWU7CiAKLQlIVFRSQU5TTUlUX1NFVFRJTkcJCQkJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsKLQlSVF9IVF9QSFlfSU5GTwkJCQkJRGVzaXJlZEh0UGh5SW5mbzsKLQlCT09MRUFOCQkJCQkJCWJBdXRvVHhSYXRlU3dpdGNoOwotCURFU0lSRURfVFJBTlNNSVRfU0VUVElORyAgICAgICAJRGVzaXJlZFRyYW5zbWl0U2V0dGluZzsgLy8gRGVzaXJlZCB0cmFuc21pdCBzZXR0aW5nLgotfSBBUENMSV9TVFJVQ1QsICpQQVBDTElfU1RSVUNUOworCXVuc2lnbmVkIGxvbmcgQXNzb2NEZWFkTGluZTsKK307CiAKLS8vIC0tLS0tLS0tLS0tIGVuZCBvZiBBUCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdHJ1Y3QgcnRfbWFjX3RhYmxlIHsKKwl1MTYgU2l6ZTsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpIYXNoW0hBU0hfVEFCTEVfU0laRV07CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSBDb250ZW50W01BWF9MRU5fT0ZfTUFDX1RBQkxFXTsKKwlzdHJ1Y3QgcnRfcXVldWVfaGVhZGVyIE1jYXN0UHNRdWV1ZTsKKwl1bnNpZ25lZCBsb25nIFBzUUlkbGVDb3VudDsKKwlCT09MRUFOIGZBbnlTdGF0aW9uSW5Qc207CisJQk9PTEVBTiBmQW55U3RhdGlvbkJhZEF0aGVyb3M7CS8qIENoZWNrIGlmIGFueSBTdGF0aW9uIGlzIGF0aGVyb3MgODAyLjExbiBDaGlwLiAgV2UgbmVlZCB0byB1c2UgUlRTL0NUUyB3aXRoIEF0aGVyb3MgODAyLC4xMW4gY2hpcC4gKi8KKwlCT09MRUFOIGZBbnlUeE9QRm9yY2VEaXNhYmxlOwkvKiBDaGVjayBpZiBpdCBpcyBuZWNlc3NhcnkgdG8gZGlzYWJsZSBCRSBUeE9QICovCisJQk9PTEVBTiBmQWxsU3RhdGlvbkFzUmFsaW5rOwkvKiBDaGVjayBpZiBhbGwgc3RhdGlvbnMgYXJlIHJhbGluay1jaGlwc2V0ICovCisJQk9PTEVBTiBmQW55U3RhdGlvbklzTGVnYWN5OwkvKiBDaGVjayBpZiBJIHVzZSBsZWdhY3kgcmF0ZSB0byB0cmFuc21pdCB0byBteSBCU1MgU3RhdGlvbi8gKi8KKwlCT09MRUFOIGZBbnlTdGF0aW9uTm9uR0Y7CS8qIENoZWNrIGlmIGFueSBTdGF0aW9uIGNhbid0IHN1cHBvcnQgR0YuICovCisJQk9PTEVBTiBmQW55U3RhdGlvbjIwT25seTsJLyogQ2hlY2sgaWYgYW55IFN0YXRpb24gY2FuJ3Qgc3VwcG9ydCBHRi4gKi8KKwlCT09MRUFOIGZBbnlTdGF0aW9uTUlNT1BTRHluYW1pYzsJLyogQ2hlY2sgaWYgYW55IFN0YXRpb24gaXMgTUlNTyBEeW5hbWljICovCisJQk9PTEVBTiBmQW55QkFTZXNzaW9uOwkvKiBDaGVjayBpZiB0aGVyZSBpcyBCQSBzZXNzaW9uLiAgRm9yY2UgdHVybiBvbiBSVFMvQ1RTICovCisvKjIwMDgvMTAvMjg6IEtIIGFkZCB0byBzdXBwb3J0IEFudGVubmEgcG93ZXItc2F2aW5nIG9mIEFQPC0tICovCisvKjIwMDgvMTAvMjg6IEtIIGFkZCB0byBzdXBwb3J0IEFudGVubmEgcG93ZXItc2F2aW5nIG9mIEFQLS0+ICovCit9OwogCi1zdHJ1Y3Qgd2lmaWNvbmYKLXsKLQlCT09MRUFOCWJTaG9ydEdJOworc3RydWN0IHdpZmljb25mIHsKKwlCT09MRUFOIGJTaG9ydEdJOwogCUJPT0xFQU4gYkdyZWVuRmllbGQ7CiB9OwogCitzdHJ1Y3QgcnRfcnRtcF9kZXZfaW5mbyB7CisJdTggY2hpcE5hbWVbMTZdOworCVJUTVBfSU5GX1RZUEUgaW5mVHlwZTsKK307CiAKK3N0cnVjdCBydF9ydG1wX2NoaXBfb3AgeworCS8qICBDYWxpYnJhdGlvbiBhY2Nlc3MgcmVsYXRlZCBjYWxsYmFjayBmdW5jdGlvbnMgKi8KKwlpbnQgKCplZWluaXQpIChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwkvKiBpbnQgKCplZWluaXQpKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7ICovCisJaW50ICgqZWVyZWFkKSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MTYgb2Zmc2V0LCB1MTYgKnBWYWx1ZSk7CS8qIGludCAoKmVlcmVhZCkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBpbnQgb2Zmc2V0LCB1MTYgKnBWYWx1ZSk7ICovCiAKKwkvKiBNQ1UgcmVsYXRlZCBjYWxsYmFjayBmdW5jdGlvbnMgKi8KKwlpbnQgKCpsb2FkRmlybXdhcmUpIChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwkvKiBpbnQgKCpsb2FkRmlybXdhcmUpKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7ICovCisJaW50ICgqZXJhc2VGaXJtd2FyZSkgKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CS8qIGludCAoKmVyYXNlRmlybXdhcmUpKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7ICovCisJaW50ICgqc2VuZENvbW1hbmRUb01jdSkgKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggY21kLCB1OCB0b2tlbiwgdTggYXJnMCwgdTggYXJnMSk7OwkvKiBpbnQgKCpzZW5kQ29tbWFuZFRvTWN1KShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IGNtZCwgdTggdG9rZW4sIHU4IGFyZzAsIHU4IGFyZzEpOyAqLwogCi10eXBlZGVmIHN0cnVjdCBfSU5GX1BDSV9DT05GSUcKLXsKLQlQVUNIQVIgICAgICAgICAgICAgICAgICBDU1JCYXNlQWRkcmVzczsgICAgIC8vIFBDSSBNTUlPIEJhc2UgQWRkcmVzcywgYWxsIGFjY2VzcyB3aWxsIHVzZQotfUlORl9QQ0lfQ09ORklHOworCS8qIFJGIGFjY2VzcyByZWxhdGVkIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLworCXN0cnVjdCBydF9yZWdfcGFpciAqcFJGUmVnVGFibGU7CisJdm9pZCAoKkFzaWNSZkluaXQpIChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworCXZvaWQgKCpBc2ljUmZUdXJuT24pIChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworCXZvaWQgKCpBc2ljUmZUdXJuT2ZmKSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKKwl2b2lkICgqQXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUpIChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworCXZvaWQgKCpBc2ljSGFsdEFjdGlvbikgKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfSU5GX1VTQl9DT05GSUcKLXsKLQlVSU5UICAgICAgICAgICAgICAgIEJ1bGtJbkVwQWRkcjsJCS8vIGJ1bGstaW4gZW5kcG9pbnQgYWRkcmVzcwotCVVJTlQgICAgICAgICAgICAgICAgQnVsa091dEVwQWRkcls2XTsJLy8gYnVsay1vdXQgZW5kcG9pbnQgYWRkcmVzcworLyogKi8KKy8qICBUaGUgbWluaXBvcnQgYWRhcHRlciBzdHJ1Y3R1cmUgKi8KKy8qICovCitzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyIHsKKwl2b2lkICpPU19Db29raWU7CS8qIHNhdmUgc3BlY2lmaWMgc3RydWN0dXJlIHJlbGF0aXZlIHRvIE9TICovCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisJdW5zaWduZWQgbG9uZyBWaXJ0dWFsSWZDbnQ7CiAKLX1JTkZfVVNCX0NPTkZJRzsKKwlzdHJ1Y3QgcnRfcnRtcF9jaGlwX29wIGNoaXBPcHM7CisJdTE2IFRoaXNUYnR0TnVtVG9OZXh0V2FrZVVwOwogCi0KLQotLy8KLS8vICBUaGUgbWluaXBvcnQgYWRhcHRlciBzdHJ1Y3R1cmUKLS8vCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9BREFQVEVSCi17Ci0JUFZPSUQJCQkJCU9TX0Nvb2tpZTsJLy8gc2F2ZSBzcGVjaWZpYyBzdHJ1Y3R1cmUgcmVsYXRpdmUgdG8gT1MKLQlQTkVUX0RFVgkJCQluZXRfZGV2OwotCVVMT05HCQkJCQlWaXJ0dWFsSWZDbnQ7Ci0KLSNpZmRlZiBSVDI4NjAKLSAgICBVU0hPUlQJCSAgICAgICAgICAgIExua0N0cmxCaXRNYXNrOwotICAgIFVTSE9SVAkJICAgICAgICAgICAgUkxua0N0cmxDb25maWd1cmF0aW9uOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIFJMbmtDdHJsT2Zmc2V0OwotICAgIFVTSE9SVAkJICAgICAgICAgICAgSG9zdExua0N0cmxDb25maWd1cmF0aW9uOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIEhvc3RMbmtDdHJsT2Zmc2V0OwotCVVTSE9SVAkJICAgICAgICAgICAgUENJZVBvd2VyU2F2ZUxldmVsOwotICAgCUJPT0xFQU4JCQkJCWJQQ0ljbGtPZmY7CQkJCQkJLy8gZmxhZyB0aGF0IGluZGljYXRlIGlmIHRoZSBQSUNFIHBvd2VyIHN0YXR1cyBpbiBDb25maWd1cmF0aW9uIFNQYWNlLi4KLSAgIAlVTE9ORwkJCQkJQ2hlY2tEbWFCdXN5Q291bnQ7ICAvLyBDaGVjayBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIENvdW50LgotICAgCVVTSE9SVAkJCQkJVGhpc1RidHROdW1Ub05leHRXYWtlVXA7Ci0JVUxPTkcJCQkJCVNhbWVSeEJ5dGVDb3VudDsKLQotCisjaWZkZWYgUlRNUF9NQUNfUENJCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgIFBDSSByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFBDSSByZWxhdGVkIHBhcmFtZXRlcnMJCQkJCQkJCQkJCQkJCQkJICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCVBVQ0hBUiAgICAgICAgICAgICAgICAgIENTUkJhc2VBZGRyZXNzOyAgICAgLy8gUENJIE1NSU8gQmFzZSBBZGRyZXNzLCBhbGwgYWNjZXNzIHdpbGwgdXNlCisJdTggKkNTUkJhc2VBZGRyZXNzOwkvKiBQQ0kgTU1JTyBCYXNlIEFkZHJlc3MsIGFsbCBhY2Nlc3Mgd2lsbCB1c2UgKi8KKwl1bnNpZ25lZCBpbnQgaXJxX251bTsKIAotCVVJTlQJCQkJCWludF9lbmFibGVfcmVnOwotCVVJTlQJCQkJCWludF9kaXNhYmxlX21hc2s7Ci0JVUlOVAkJCQkJaW50X3BlbmRpbmc7CisJdTE2IExua0N0cmxCaXRNYXNrOworCXUxNiBSTG5rQ3RybENvbmZpZ3VyYXRpb247CisJdTE2IFJMbmtDdHJsT2Zmc2V0OworCXUxNiBIb3N0TG5rQ3RybENvbmZpZ3VyYXRpb247CisJdTE2IEhvc3RMbmtDdHJsT2Zmc2V0OworCXUxNiBQQ0llUG93ZXJTYXZlTGV2ZWw7CisJdW5zaWduZWQgbG9uZyBSdDN4eEhvc3RMaW5rQ3RybDsJLyogVVNlZCBmb3IgMzA5MEYgY2hpcCAqLworCXVuc2lnbmVkIGxvbmcgUnQzeHhSYWxpbmtMaW5rQ3RybDsJLyogVVNlZCBmb3IgMzA5MEYgY2hpcCAqLworCXUxNiBEZXZpY2VJRDsJLyogUmVhZCBmcm9tIFBDSSBjb25maWcgKi8KKwl1bnNpZ25lZCBsb25nIEFjY2Vzc0JCUEZhaWxDb3VudDsKKwlCT09MRUFOIGJQQ0ljbGtPZmY7CS8qIGZsYWcgdGhhdCBpbmRpY2F0ZSBpZiB0aGUgUElDRSBwb3dlciBzdGF0dXMgaW4gQ29uZmlndXJhdGlvbiBTUGFjZS4uICovCisJQk9PTEVBTiBiUENJY2xrT2ZmRGlzYWJsZVR4OwkvKiAqLwogCisJQk9PTEVBTiBicnQzMHh4QmFuTWN1Q21kOwkvKndoZW4gPSAweGZmIG1lYW5zIGFsbCBjb21tYW5kcyBhcmUgb2sgdG8gc2V0IC4gKi8KKwlCT09MRUFOIGIzMDkwRVNwZWNpYWxDaGlwOwkvKjMwOTBFIHNwZWNpYWwgY2hpcCB0aGF0IHdyaXRlIEVFUFJPTSAweDI0PTB4OTI4MC4gKi8KKwl1bnNpZ25lZCBsb25nIENoZWNrRG1hQnVzeUNvdW50OwkvKiBDaGVjayBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIENvdW50LiAqLwogCi0JUlRNUF9ETUFCVUYgICAgICAgICAgICAgVHhCdWZTcGFjZVtOVU1fT0ZfVFhfUklOR107IC8vIFNoYXJlZCBtZW1vcnkgb2YgYWxsIDFzdCBwcmUtYWxsb2NhdGVkIFR4QnVmIGFzc29jaWF0ZWQgd2l0aCBlYWNoIFRYRAotCVJUTVBfRE1BQlVGICAgICAgICAgICAgIFJ4RGVzY1Jpbmc7ICAgICAgICAgICAgICAgICAvLyBTaGFyZWQgbWVtb3J5IGZvciBSWCBkZXNjcmlwdG9ycwotCVJUTVBfRE1BQlVGICAgICAgICAgICAgIFR4RGVzY1JpbmdbTlVNX09GX1RYX1JJTkddOyAJLy8gU2hhcmVkIG1lbW9yeSBmb3IgVHggZGVzY3JpcHRvcnMKLQlSVE1QX1RYX1JJTkcgICAgICAgICAgICBUeFJpbmdbTlVNX09GX1RYX1JJTkddOyAgICAgCS8vIEFDMH40ICsgSENDQQotI2VuZGlmCisJdTMyIGludF9lbmFibGVfcmVnOworCXUzMiBpbnRfZGlzYWJsZV9tYXNrOworCXUzMiBpbnRfcGVuZGluZzsKIAotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIGlycV9sb2NrOwotCVVDSEFSICAgICAgICAgICAgICAgICAgIGlycV9kaXNhYmxlZDsKKwlzdHJ1Y3QgcnRfcnRtcF9kbWFidWYgVHhCdWZTcGFjZVtOVU1fT0ZfVFhfUklOR107CS8qIFNoYXJlZCBtZW1vcnkgb2YgYWxsIDFzdCBwcmUtYWxsb2NhdGVkIFR4QnVmIGFzc29jaWF0ZWQgd2l0aCBlYWNoIFRYRCAqLworCXN0cnVjdCBydF9ydG1wX2RtYWJ1ZiBSeERlc2NSaW5nOwkvKiBTaGFyZWQgbWVtb3J5IGZvciBSWCBkZXNjcmlwdG9ycyAqLworCXN0cnVjdCBydF9ydG1wX2RtYWJ1ZiBUeERlc2NSaW5nW05VTV9PRl9UWF9SSU5HXTsJLyogU2hhcmVkIG1lbW9yeSBmb3IgVHggZGVzY3JpcHRvcnMgKi8KKwlzdHJ1Y3QgcnRfcnRtcF90eF9yaW5nIFR4UmluZ1tOVU1fT0ZfVFhfUklOR107CS8qIEFDMH40ICsgSENDQSAqLworI2VuZGlmCQkJCS8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0jaWZkZWYgUlQyODcwCisJc3BpbmxvY2tfdCBpcnFfbG9jazsKKwl1OCBpcnFfZGlzYWJsZWQ7CisKKyNpZmRlZiBSVE1QX01BQ19VU0IKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgVVNCIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlzdHJ1Y3QgdXNiX2NvbmZpZ19kZXNjcmlwdG9yCQkqY29uZmlnOwotCVVJTlQJCQkJCQkJCUJ1bGtJbkVwQWRkcjsJCS8vIGJ1bGstaW4gZW5kcG9pbnQgYWRkcmVzcwotCVVJTlQJCQkJCQkJCUJ1bGtPdXRFcEFkZHJbNl07CS8vIGJ1bGstb3V0IGVuZHBvaW50IGFkZHJlc3MKKwlzdHJ1Y3QgdXNiX2NvbmZpZ19kZXNjcmlwdG9yICpjb25maWc7CisJdTMyIEJ1bGtJbkVwQWRkcjsJLyogYnVsay1pbiBlbmRwb2ludCBhZGRyZXNzICovCisJdTMyIEJ1bGtPdXRFcEFkZHJbNl07CS8qIGJ1bGstb3V0IGVuZHBvaW50IGFkZHJlc3MgKi8KIAotCVVJTlQJCQkJCQkJCU51bWJlck9mUGlwZXM7Ci0JVVNIT1JUCQkJCQkJCQlCdWxrT3V0TWF4UGFja2V0U2l6ZTsKLQlVU0hPUlQJCQkJCQkJCUJ1bGtJbk1heFBhY2tldFNpemU7CisJdTMyIE51bWJlck9mUGlwZXM7CisJdTE2IEJ1bGtPdXRNYXhQYWNrZXRTaXplOworCXUxNiBCdWxrSW5NYXhQYWNrZXRTaXplOwogCi0JLy89PT09PT1Db250cm9sIEZsYWdzCi0JTE9ORyAgICAgICAgICAgICAgICAgICAgCVBlbmRpbmdJb0NvdW50OwotCVVMT05HCQkJCQkJQnVsa0ZsYWdzOwotCUJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBiVXNiVHhCdWxrQWdncmU7CS8vIEZsYWdzIGZvciBidWxrIG91dCBkYXRhIHByaW9yaXR5CisJLyo9PT09PT1Db250cm9sIEZsYWdzICovCisJbG9uZyBQZW5kaW5nSW9Db3VudDsKKwl1bnNpZ25lZCBsb25nIEJ1bGtGbGFnczsKKwlCT09MRUFOIGJVc2JUeEJ1bGtBZ2dyZTsJLyogRmxhZ3MgZm9yIGJ1bGsgb3V0IGRhdGEgcHJpb3JpdHkgKi8KIAorCS8qPT09PT09Q21kIFRocmVhZCAqLworCXN0cnVjdCBydF9jbWRxIENtZFE7CisJc3BpbmxvY2tfdCBDbWRRTG9jazsJLyogQ21kUUxvY2sgc3BpbmxvY2sgKi8KKwlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrIGNtZFFUYXNrOwogCi0JLy89PT09PT1UaW1lciBUaHJlYWQKLQlSVDI4NzBfVElNRVJfUVVFVUUJCVRpbWVyUTsKLQlORElTX1NQSU5fTE9DSwkJCVRpbWVyUUxvY2s7Ci0KLQotCS8vPT09PT09Q21kIFRocmVhZAotCUNtZFEJCQkJCUNtZFE7Ci0JTkRJU19TUElOX0xPQ0sJCQlDbWRRTG9jazsJCQkJLy8gQ21kUUxvY2sgc3BpbmxvY2sKLQotCUJPT0xFQU4JCQkJCVRpbWVyRnVuY19raWxsOwotCUJPT0xFQU4JCQkJCW1sbWVfa2lsbDsKLQotCi0JLy89PT09PT1TZW1hcGhvcmVzIChldmVudCkKLQlzdHJ1Y3Qgc2VtYXBob3JlCQkJbWxtZV9zZW1hcGhvcmU7CQkJLyogdG8gc2xlZXAgdGhyZWFkIG9uCSovCi0Jc3RydWN0IHNlbWFwaG9yZQkJCVJUVVNCQ21kX3NlbWFwaG9yZTsJCS8qIHRvIHNsZWVwIHRocmVhZCBvbgkqLwotCXN0cnVjdCBzZW1hcGhvcmUJCQlSVFVTQlRpbWVyX3NlbWFwaG9yZTsKLQlzdHJ1Y3QgY29tcGxldGlvbgkJCVRpbWVyUUNvbXBsZXRlOwotCXN0cnVjdCBjb21wbGV0aW9uCQkJbWxtZUNvbXBsZXRlOwotCXN0cnVjdCBjb21wbGV0aW9uCQkJQ21kUUNvbXBsZXRlOwotCXdhaXRfcXVldWVfaGVhZF90CQkJKndhaXQ7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0KKwkvKj09PT09PVNlbWFwaG9yZXMgKGV2ZW50KSAqLworCXN0cnVjdCBzZW1hcGhvcmUgVXNiVmVuZG9yUmVxX3NlbWFwaG9yZTsKKwl2b2lkICpVc2JWZW5kb3JSZXFCdWY7CisJd2FpdF9xdWV1ZV9oZWFkX3QgKndhaXQ7CisjZW5kaWYJCQkJLyogUlRNUF9NQUNfVVNCIC8vICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvKiAgICAgIEJvdGggUENJL1VTQiByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFJCVVMgcmVsYXRlZCBwYXJhbWV0ZXJzCQkJCQkJCQkJCQkJCQkJCSAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICBCb3RoIFBDSS9VU0IgcmVsYXRlZCBwYXJhbWV0ZXJzCQkJCQkJCQkJCQkJCQkgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLypzdHJ1Y3QgcnRfcnRtcF9kZXZfaW5mbyAgICAgICAgICAgICAgICAgY2hpcEluZm87ICovCisJUlRNUF9JTkZfVFlQRSBpbmZUeXBlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgIERyaXZlciBNZ210IHJlbGF0ZWQgcGFyYW1ldGVycwkJCQkJCQkJCQkJCQkJICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCXN0cnVjdCBydF9ydG1wX29zX3Rhc2sgbWxtZVRhc2s7CisjaWZkZWYgUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQKKwkvKiBJZiB5b3Ugd2FudCB1c2UgdGltZXIgdGFzayB0byBoYW5kbGUgdGhlIHRpbWVyIHJlbGF0ZWQgam9icywgZW5hYmxlIHRoaXMuICovCisJc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19xdWV1ZSBUaW1lclE7CisJc3BpbmxvY2tfdCBUaW1lclFMb2NrOworCXN0cnVjdCBydF9ydG1wX29zX3Rhc2sgdGltZXJUYXNrOworI2VuZGlmCQkJCS8qIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgVHggcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCUJPT0xFQU4gICAgICAgICAgICAgICAgIERlUXVldWVSdW5uaW5nW05VTV9PRl9UWF9SSU5HXTsgIC8vIGZvciBlbnN1cmluZyBSVFVTQkRlUXVldWVQYWNrZXQgZ2V0IGNhbGwgb25jZQotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIERlUXVldWVMb2NrW05VTV9PRl9UWF9SSU5HXTsKKwlCT09MRUFOIERlUXVldWVSdW5uaW5nW05VTV9PRl9UWF9SSU5HXTsJLyogZm9yIGVuc3VyaW5nIFJUVVNCRGVRdWV1ZVBhY2tldCBnZXQgY2FsbCBvbmNlICovCisJc3BpbmxvY2tfdCBEZVF1ZXVlTG9ja1tOVU1fT0ZfVFhfUklOR107CiAKLSNpZmRlZiBSVDI4NzAKLQkvLyBEYXRhIHJlbGF0ZWQgY29udGV4dCBhbmQgQUMgc3BlY2lmaWVkLCA0IEFDIHN1cHBvcnRlZAotCU5ESVNfU1BJTl9MT0NLCQkJQnVsa091dExvY2tbNl07CQkJLy8gQnVsa091dCBzcGlubG9jayBmb3IgNCBBQ3MKLQlORElTX1NQSU5fTE9DSwkJCU1MTUVCdWxrT3V0TG9jazsJLy8gTUxNRSBCdWxrT3V0IGxvY2sKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkvKiBEYXRhIHJlbGF0ZWQgY29udGV4dCBhbmQgQUMgc3BlY2lmaWVkLCA0IEFDIHN1cHBvcnRlZCAqLworCXNwaW5sb2NrX3QgQnVsa091dExvY2tbNl07CS8qIEJ1bGtPdXQgc3BpbmxvY2sgZm9yIDQgQUNzICovCisJc3BpbmxvY2tfdCBNTE1FQnVsa091dExvY2s7CS8qIE1MTUUgQnVsa091dCBsb2NrICovCiAKLQlIVF9UWF9DT05URVhUCQkJVHhDb250ZXh0W05VTV9PRl9UWF9SSU5HXTsKLQlORElTX1NQSU5fTE9DSwkJCVR4Q29udGV4dFF1ZXVlTG9ja1tOVU1fT0ZfVFhfUklOR107CQkvLyBUeENvbnRleHRRdWV1ZSBzcGlubG9jaworCXN0cnVjdCBydF9odF90eF9jb250ZXh0IFR4Q29udGV4dFtOVU1fT0ZfVFhfUklOR107CisJc3BpbmxvY2tfdCBUeENvbnRleHRRdWV1ZUxvY2tbTlVNX09GX1RYX1JJTkddOwkvKiBUeENvbnRleHRRdWV1ZSBzcGlubG9jayAqLwogCi0JLy8gNCBzZXRzIG9mIEJ1bGsgT3V0IGluZGV4IGFuZCBwZW5kaW5nIGZsYWcKLQlVQ0hBUgkJCQkJTmV4dEJ1bGtPdXRJbmRleFs0XTsJLy8gb25seSB1c2VkIGZvciA0IEVEQ0EgYnVsa291dCBwaXBlCisJLyogNCBzZXRzIG9mIEJ1bGsgT3V0IGluZGV4IGFuZCBwZW5kaW5nIGZsYWcgKi8KKwl1OCBOZXh0QnVsa091dEluZGV4WzRdOwkvKiBvbmx5IHVzZWQgZm9yIDQgRURDQSBidWxrb3V0IHBpcGUgKi8KIAotCUJPT0xFQU4JCQkJCUJ1bGtPdXRQZW5kaW5nWzZdOwkvLyB1c2VkIGZvciB0b3RhbCA2IGJ1bGtvdXQgcGlwZQotCVVDSEFSCQkJCQlidWxrUmVzZXRQaXBlaWQ7Ci0JQk9PTEVBTgkJCQkJTWdtdEJ1bGtQZW5kaW5nOwotCVVMT05HCQkJCQlidWxrUmVzZXRSZXFbNl07Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisJQk9PTEVBTiBCdWxrT3V0UGVuZGluZ1s2XTsJLyogdXNlZCBmb3IgdG90YWwgNiBidWxrb3V0IHBpcGUgKi8KKwl1OCBidWxrUmVzZXRQaXBlaWQ7CisJQk9PTEVBTiBNZ210QnVsa1BlbmRpbmc7CisJdW5zaWduZWQgbG9uZyBidWxrUmVzZXRSZXFbNl07CisjZW5kaWYJCQkJLyogUlRNUF9NQUNfVVNCIC8vICovCiAKLQkvLyByZXNvdXJjZSBmb3Igc29mdHdhcmUgYmFja2xvZyBxdWV1ZXMKLQlRVUVVRV9IRUFERVIgICAgICAgICAgICBUeFN3UXVldWVbTlVNX09GX1RYX1JJTkddOyAgLy8gNCBBQyArIDEgSENDQQotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFR4U3dRdWV1ZUxvY2tbTlVNX09GX1RYX1JJTkddOwkvLyBUeFN3UXVldWUgc3BpbmxvY2sKKwkvKiByZXNvdXJjZSBmb3Igc29mdHdhcmUgYmFja2xvZyBxdWV1ZXMgKi8KKwlzdHJ1Y3QgcnRfcXVldWVfaGVhZGVyIFR4U3dRdWV1ZVtOVU1fT0ZfVFhfUklOR107CS8qIDQgQUMgKyAxIEhDQ0EgKi8KKwlzcGlubG9ja190IFR4U3dRdWV1ZUxvY2tbTlVNX09GX1RYX1JJTkddOwkvKiBUeFN3UXVldWUgc3BpbmxvY2sgKi8KIAotCVJUTVBfRE1BQlVGICAgICAgICAgICAgIE1nbXREZXNjUmluZzsgICAgICAgICAgICAgICAJLy8gU2hhcmVkIG1lbW9yeSBmb3IgTUdNVCBkZXNjcmlwdG9ycwotCVJUTVBfTUdNVF9SSU5HICAgICAgICAgIE1nbXRSaW5nOwotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIE1nbXRSaW5nTG9jazsgICAgICAgICAgICAgICAJLy8gUHJpbyBSaW5nIHNwaW5sb2NrCi0KKwlzdHJ1Y3QgcnRfcnRtcF9kbWFidWYgTWdtdERlc2NSaW5nOwkvKiBTaGFyZWQgbWVtb3J5IGZvciBNR01UIGRlc2NyaXB0b3JzICovCisJc3RydWN0IHJ0X3J0bXBfbWdtdF9yaW5nIE1nbXRSaW5nOworCXNwaW5sb2NrX3QgTWdtdFJpbmdMb2NrOwkvKiBQcmlvIFJpbmcgc3BpbmxvY2sgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICBSeCByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgUlQyODYwCi0JUlRNUF9SWF9SSU5HICAgICAgICAgICAgUnhSaW5nOwotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFJ4UmluZ0xvY2s7ICAgICAgICAgICAgICAgICAvLyBSeCBSaW5nIHNwaW5sb2NrCi0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQlSWF9DT05URVhUCQkJCVJ4Q29udGV4dFtSWF9SSU5HX1NJWkVdOyAgLy8gMSBmb3IgcmVkdW5kYW50IG11bHRpcGxlIElSUCBidWxrIGluLgotCU5ESVNfU1BJTl9MT0NLCQkJQnVsa0luTG9jazsJCQkJLy8gQnVsa0luIHNwaW5sb2NrIGZvciA0IEFDcwotCVVDSEFSCQkJCQlQZW5kaW5nUng7CQkJCS8vIFRoZSBNYXhpbWEgcGVuZGluZyBSeCB2YWx1ZSBzaG91bGQgYmUgCVJYX1JJTkdfU0laRS4KLQlVQ0hBUgkJCQkJTmV4dFJ4QnVsa0luSW5kZXg7CQkvLyBJbmRpY2F0ZSB0aGUgY3VycmVudCBSeENvbnRleHQgSW5kZXggd2hpY2ggaG9sZCBieSBIb3N0IGNvbnRyb2xsZXIuCi0JVUNIQVIJCQkJCU5leHRSeEJ1bGtJblJlYWRJbmRleDsJLy8gSW5kaWNhdGUgdGhlIGN1cnJlbnQgUnhDb250ZXh0IEluZGV4IHdoaWNoIGRyaXZlciBjYW4gcmVhZCAmIHByb2Nlc3MgaXQuCi0JVUxPTkcJCQkJCU5leHRSeEJ1bGtJblBvc2l0aW9uOyAgIC8vIFdhbnQgdG8gY29udGF0ZW5hdGUgMiBVUkIgYnVmZmVyIHdoaWxlIDFzdCBpcyBidWxraW4gZmFpbGVkIFVSQi4gVGhpcyBQb3NpdGlvbiBpcyAxc3QgVVJCIFRyYW5zZmVyTGVuZ3RoLgotCVVMT05HCQkJCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aDsJLy8gY3VycmVudCBsZW5ndGggb2YgdGhlIHBhY2tldCBidWZmZXIKLQlVTE9ORwkJCQkJUmVhZFBvc2l0aW9uOwkJCS8vIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBpbiBhIHBhY2tldCBidWZmZXIKLSNlbmRpZiAvLyBSVDI4NzAgLy8KIAorI2lmZGVmIFJUTVBfTUFDX1BDSQorCXN0cnVjdCBydF9ydG1wX3J4X3JpbmcgUnhSaW5nOworCXNwaW5sb2NrX3QgUnhSaW5nTG9jazsJLyogUnggUmluZyBzcGlubG9jayAqLworI2lmZGVmIFJUMzA5MAorCXNwaW5sb2NrX3QgTWN1Q21kTG9jazsJLypNQ1UgQ29tbWFuZCBRdWV1ZSBzcGlubG9jayAqLworI2VuZGlmCQkJCS8qIFJUMzA5MCAvLyAqLworI2VuZGlmCQkJCS8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCXN0cnVjdCBydF9yeF9jb250ZXh0IFJ4Q29udGV4dFtSWF9SSU5HX1NJWkVdOwkvKiAxIGZvciByZWR1bmRhbnQgbXVsdGlwbGUgSVJQIGJ1bGsgaW4uICovCisJc3BpbmxvY2tfdCBCdWxrSW5Mb2NrOwkvKiBCdWxrSW4gc3BpbmxvY2sgZm9yIDQgQUNzICovCisJdTggUGVuZGluZ1J4OwkvKiBUaGUgTWF4aW11bSBwZW5kaW5nIFJ4IHZhbHVlIHNob3VsZCBiZSAgICAgICBSWF9SSU5HX1NJWkUuICovCisJdTggTmV4dFJ4QnVsa0luSW5kZXg7CS8qIEluZGljYXRlIHRoZSBjdXJyZW50IFJ4Q29udGV4dCBJbmRleCB3aGljaCBob2xkIGJ5IEhvc3QgY29udHJvbGxlci4gKi8KKwl1OCBOZXh0UnhCdWxrSW5SZWFkSW5kZXg7CS8qIEluZGljYXRlIHRoZSBjdXJyZW50IFJ4Q29udGV4dCBJbmRleCB3aGljaCBkcml2ZXIgY2FuIHJlYWQgJiBwcm9jZXNzIGl0LiAqLworCXVuc2lnbmVkIGxvbmcgTmV4dFJ4QnVsa0luUG9zaXRpb247CS8qIFdhbnQgdG8gY29udGF0ZW5hdGUgMiBVUkIgYnVmZmVyIHdoaWxlIDFzdCBpcyBidWxraW4gZmFpbGVkIFVSQi4gVGhpcyBQb3NpdGlvbiBpcyAxc3QgVVJCIFRyYW5zZmVyTGVuZ3RoLiAqLworCXVuc2lnbmVkIGxvbmcgVHJhbnNmZXJCdWZmZXJMZW5ndGg7CS8qIGN1cnJlbnQgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgYnVmZmVyICovCisJdW5zaWduZWQgbG9uZyBSZWFkUG9zaXRpb247CS8qIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBpbiBhIHBhY2tldCBidWZmZXIgKi8KKyNlbmRpZgkJCQkvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICBBU0lDIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCVVJTlQzMiAgICAgICAgICAgICAgIAlNQUNWZXJzaW9uOyAgICAgIAkvLyBNQUMgdmVyc2lvbi4gUmVjb3JkIHJ0Mjg2MEMoMHgyODYwMDEwMCkgb3IgcnQyODYwRCAoMHgyODYwMDEwMSkuLgorCXUzMiBNQUNWZXJzaW9uOwkvKiBNQUMgdmVyc2lvbi4gUmVjb3JkIHJ0Mjg2MEMoMHgyODYwMDEwMCkgb3IgcnQyODYwRCAoMHgyODYwMDEwMSkuLiAqLwogCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gRTJQUk9NCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JVUxPTkcgICAgICAgICAgICAgICAgICAgRWVwcm9tVmVyc2lvbjsgICAgICAgICAgLy8gYnl0ZSAwOiB2ZXJzaW9uLCBieXRlIDE6IHJldmlzaW9uLCBieXRlIDJ+MzogdW51c2VkCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgRUVQUk9NQWRkcmVzc051bTsgICAgICAgLy8gOTNjNDY9NiAgOTNjNjY9OAotCVVTSE9SVCAgICAgICAgICAgICAgICAgIEVFUFJPTURlZmF1bHRWYWx1ZVtOVU1fRUVQUk9NX0JCUF9QQVJNU107Ci0jaWZkZWYgUlQyODcwCi0JQk9PTEVBTiAgICAgICAgICAgICAgICAgRWVwcm9tQWNjZXNzOwotI2VuZGlmCi0JVUxPTkcgICAgICAgICAgICAgICAgICAgRmlybXdhcmVWZXJzaW9uOyAgICAgICAgLy8gYnl0ZSAwOiBNaW5vciB2ZXJzaW9uLCBieXRlIDE6IE1ham9yIHZlcnNpb24sIG90aGVyd2lzZSB1bnVzZWQuCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogRTJQUk9NICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJdW5zaWduZWQgbG9uZyBFZXByb21WZXJzaW9uOwkvKiBieXRlIDA6IHZlcnNpb24sIGJ5dGUgMTogcmV2aXNpb24sIGJ5dGUgMn4zOiB1bnVzZWQgKi8KKwl1bnNpZ25lZCBsb25nIEZpcm13YXJlVmVyc2lvbjsJLyogYnl0ZSAwOiBNaW5vciB2ZXJzaW9uLCBieXRlIDE6IE1ham9yIHZlcnNpb24sIG90aGVyd2lzZSB1bnVzZWQuICovCisJdTE2IEVFUFJPTURlZmF1bHRWYWx1ZVtOVU1fRUVQUk9NX0JCUF9QQVJNU107CisJdTggRUVQUk9NQWRkcmVzc051bTsJLyogOTNjNDY9NiAgOTNjNjY9OCAqLworCUJPT0xFQU4gRWVwcm9tQWNjZXNzOworCXU4IEVGdXNlVGFnOwogCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gQkJQIENvbnRyb2wKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBCYnBXcml0ZUxhdGNoWzE0MF07ICAgICAvLyByZWNvcmQgbGFzdCBCQlAgcmVnaXN0ZXIgdmFsdWUgd3JpdHRlbiB2aWEgQkJQX0lPX1dSSVRFL0JCUF9JT19XUklURV9WWV9SRUdfSUQKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBCYnBSc3NpVG9EYm1EZWx0YTsKLQlCQlBfUjY2X1RVTklORyAgICAgICAgICBCYnBUdW5pbmc7CisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogQkJQIENvbnRyb2wgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwl1OCBCYnBXcml0ZUxhdGNoWzE0MF07CS8qIHJlY29yZCBsYXN0IEJCUCByZWdpc3RlciB2YWx1ZSB3cml0dGVuIHZpYSBCQlBfSU9fV1JJVEUvQkJQX0lPX1dSSVRFX1ZZX1JFR19JRCAqLworCWNoYXIgQmJwUnNzaVRvRGJtRGVsdGE7CS8qIGNoYW5nZSBmcm9tIHU4IHRvIGNoYXIgZm9yIGhpZ2ggcG93ZXIgKi8KKwlzdHJ1Y3QgcnRfYmJwX3I2Nl90dW5pbmcgQmJwVHVuaW5nOwogCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIFJGSUMgY29udHJvbAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBSZkljVHlwZTsgICAgICAgLy8gUkZJQ194eHgKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBSZkZyZXFPZmZzZXQ7ICAgLy8gRnJlcXVlbmN5IG9mZnNldCBmb3IgY2hhbm5lbCBzd2l0Y2hpbmcKLQlSVE1QX1JGX1JFR1MgICAgICAgICAgICBMYXRjaFJmUmVnczsgICAgLy8gbGF0Y2ggdGggbGF0ZXN0IFJGIHByb2dyYW1taW5nIHZhbHVlIHNpbmNlIFJGIElDIGRvZXNuJ3Qgc3VwcG9ydCBSRUFECisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIFJGSUMgY29udHJvbCAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwl1OCBSZkljVHlwZTsJCS8qIFJGSUNfeHh4ICovCisJdW5zaWduZWQgbG9uZyBSZkZyZXFPZmZzZXQ7CS8qIEZyZXF1ZW5jeSBvZmZzZXQgZm9yIGNoYW5uZWwgc3dpdGNoaW5nICovCisJc3RydWN0IHJ0X3J0bXBfcmZfcmVncyBMYXRjaFJmUmVnczsJLyogbGF0Y2ggdGggbGF0ZXN0IFJGIHByb2dyYW1taW5nIHZhbHVlIHNpbmNlIFJGIElDIGRvZXNuJ3Qgc3VwcG9ydCBSRUFEICovCiAKLQlFRVBST01fQU5URU5OQV9TVFJVQyAgICBBbnRlbm5hOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSBBTnRlbm5hIGRlZmluaXRpb24gaXMgZGlmZmVyZW50IGZvciBhICYgZy4gV2UgbmVlZCB0byBzYXZlIGl0IGZvciBmdXR1cmUgcmVmZXJlbmNlLgotCUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQyAgICBOaWNDb25maWcyOworCUVFUFJPTV9BTlRFTk5BX1NUUlVDIEFudGVubmE7CS8qIFNpbmNlIEFOdGVubmEgZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgZm9yIGEgJiBnLiBXZSBuZWVkIHRvIHNhdmUgaXQgZm9yIGZ1dHVyZSByZWZlcmVuY2UuICovCisJRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDIE5pY0NvbmZpZzI7CiAKLQkvLyBUaGlzIHNvZnQgUnggQW50ZW5uYSBEaXZlcnNpdHkgbWVjaGFuaXNtIGlzIHVzZWQgb25seSB3aGVuIHVzZXIgc2V0Ci0JLy8gUlggQW50ZW5uYSA9IERJVkVSU0lUWSBPTgotCVNPRlRfUlhfQU5UX0RJVkVSU0lUWSAgIFJ4QW50OworCS8qIFRoaXMgc29mdCBSeCBBbnRlbm5hIERpdmVyc2l0eSBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IHdoZW4gdXNlciBzZXQgKi8KKwkvKiBSWCBBbnRlbm5hID0gRElWRVJTSVRZIE9OICovCisJc3RydWN0IHJ0X3NvZnRfcnhfYW50X2RpdmVyc2l0eSBSeEFudDsKIAotCVVDSEFSICAgICAgICAgICAgICAgICAgIFJGUHJvZ1NlcTsKLQlDSEFOTkVMX1RYX1BPV0VSICAgICAgICBUeFBvd2VyW01BWF9OVU1fT0ZfQ0hBTk5FTFNdOyAgICAgICAvLyBTdG9yZSBUeCBwb3dlciB2YWx1ZSBmb3IgYWxsIGNoYW5uZWxzLgotCUNIQU5ORUxfVFhfUE9XRVIgICAgICAgIENoYW5uZWxMaXN0W01BWF9OVU1fT0ZfQ0hBTk5FTFNdOyAgIC8vIGxpc3QgYWxsIHN1cHBvcnRlZCBjaGFubmVscyBmb3Igc2l0ZSBzdXJ2ZXkKLQlDSEFOTkVMXzExSl9UWF9QT1dFUiAgICBUeFBvd2VyMTFKW01BWF9OVU1fT0ZfMTFKQ0hBTk5FTFNdOyAgICAgICAvLyA4MDIuMTFqIGNoYW5uZWwgYW5kIGJ3Ci0JQ0hBTk5FTF8xMUpfVFhfUE9XRVIgICAgQ2hhbm5lbExpc3QxMUpbTUFYX05VTV9PRl8xMUpDSEFOTkVMU107ICAgLy8gbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleQorCXU4IFJGUHJvZ1NlcTsKKwlzdHJ1Y3QgcnRfY2hhbm5lbF90eF9wb3dlciBUeFBvd2VyW01BWF9OVU1fT0ZfQ0hBTk5FTFNdOwkvKiBTdG9yZSBUeCBwb3dlciB2YWx1ZSBmb3IgYWxsIGNoYW5uZWxzLiAqLworCXN0cnVjdCBydF9jaGFubmVsX3R4X3Bvd2VyIENoYW5uZWxMaXN0W01BWF9OVU1fT0ZfQ0hBTk5FTFNdOwkvKiBsaXN0IGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMgZm9yIHNpdGUgc3VydmV5ICovCisJc3RydWN0IHJ0X2NoYW5uZWxfMTFqX3R4X3Bvd2VyIFR4UG93ZXIxMUpbTUFYX05VTV9PRl8xMUpDSEFOTkVMU107CS8qIDgwMi4xMWogY2hhbm5lbCBhbmQgYncgKi8KKwlzdHJ1Y3QgcnRfY2hhbm5lbF8xMWpfdHhfcG93ZXIgQ2hhbm5lbExpc3QxMUpbTUFYX05VTV9PRl8xMUpDSEFOTkVMU107CS8qIGxpc3QgYWxsIHN1cHBvcnRlZCBjaGFubmVscyBmb3Igc2l0ZSBzdXJ2ZXkgKi8KIAotCVVDSEFSICAgICAgICAgICAgICAgICAgIENoYW5uZWxMaXN0TnVtOyAgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBjaGFubmVsIGluIENoYW5uZWxMaXN0W10KLQlVQ0hBUgkJCQkJQmJwOTQ7Ci0JQk9PTEVBTgkJCQkJQmJwRm9yQ0NLOwotCVVMT05HCQlUeDIwTVB3ckNmZ0FCYW5kWzVdOwotCVVMT05HCQlUeDIwTVB3ckNmZ0dCYW5kWzVdOwotCVVMT05HCQlUeDQwTVB3ckNmZ0FCYW5kWzVdOwotCVVMT05HCQlUeDQwTVB3ckNmZ0dCYW5kWzVdOworCXU4IENoYW5uZWxMaXN0TnVtOwkvKiBudW1iZXIgb2YgY2hhbm5lbCBpbiBDaGFubmVsTGlzdFtdICovCisJdTggQmJwOTQ7CisJQk9PTEVBTiBCYnBGb3JDQ0s7CisJdW5zaWduZWQgbG9uZyBUeDIwTVB3ckNmZ0FCYW5kWzVdOworCXVuc2lnbmVkIGxvbmcgVHgyME1Qd3JDZmdHQmFuZFs1XTsKKwl1bnNpZ25lZCBsb25nIFR4NDBNUHdyQ2ZnQUJhbmRbNV07CisJdW5zaWduZWQgbG9uZyBUeDQwTVB3ckNmZ0dCYW5kWzVdOwogCi0JQk9PTEVBTiAgICAgYkF1dG9UeEFnY0E7ICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBkcml2ZXIgYXV0byBUeCBBZ2MgY29udHJvbAotCVVDSEFSCSAgICBUc3NpUmVmQTsJCQkJCS8vIFN0b3JlIFRzc2kgcmVmZXJlbmNlIHZhbHVlIGFzIDI1IHRlbXBlcmF0dXJlLgotCVVDSEFSCSAgICBUc3NpUGx1c0JvdW5kYXJ5QVs1XTsJCS8vIFRzc2kgYm91bmRhcnkgZm9yIGluY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuCi0JVUNIQVIJICAgIFRzc2lNaW51c0JvdW5kYXJ5QVs1XTsJCS8vIFRzc2kgYm91bmRhcnkgZm9yIGRlY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuCi0JVUNIQVIJICAgIFR4QWdjU3RlcEE7CQkJCQkvLyBTdG9yZSBUeCBUU1NJIGRlbHRhIGluY3JlbWVudCAvIGRlY3JlbWVudCB2YWx1ZQotCUNIQVIJCVR4QWdjQ29tcGVuc2F0ZUE7CQkJLy8gU3RvcmUgdGhlIGNvbXBlbnNhdGlvbiAoVHhBZ2NTdGVwICogKGlkeC0xKSkKKwlCT09MRUFOIGJBdXRvVHhBZ2NBOwkvKiBFbmFibGUgZHJpdmVyIGF1dG8gVHggQWdjIGNvbnRyb2wgKi8KKwl1OCBUc3NpUmVmQTsJCS8qIFN0b3JlIFRzc2kgcmVmZXJlbmNlIHZhbHVlIGFzIDI1IHRlbXBlcmF0dXJlLiAqLworCXU4IFRzc2lQbHVzQm91bmRhcnlBWzVdOwkvKiBUc3NpIGJvdW5kYXJ5IGZvciBpbmNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLiAqLworCXU4IFRzc2lNaW51c0JvdW5kYXJ5QVs1XTsJLyogVHNzaSBib3VuZGFyeSBmb3IgZGVjcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4gKi8KKwl1OCBUeEFnY1N0ZXBBOwkvKiBTdG9yZSBUeCBUU1NJIGRlbHRhIGluY3JlbWVudCAvIGRlY3JlbWVudCB2YWx1ZSAqLworCWNoYXIgVHhBZ2NDb21wZW5zYXRlQTsJLyogU3RvcmUgdGhlIGNvbXBlbnNhdGlvbiAoVHhBZ2NTdGVwICogKGlkeC0xKSkgKi8KIAotCUJPT0xFQU4gICAgIGJBdXRvVHhBZ2NHOyAgICAgICAgICAgICAgICAvLyBFbmFibGUgZHJpdmVyIGF1dG8gVHggQWdjIGNvbnRyb2wKLQlVQ0hBUgkgICAgVHNzaVJlZkc7CQkJCQkvLyBTdG9yZSBUc3NpIHJlZmVyZW5jZSB2YWx1ZSBhcyAyNSB0ZW1wZXJhdHVyZS4KLQlVQ0hBUgkgICAgVHNzaVBsdXNCb3VuZGFyeUdbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBpbmNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgotCVVDSEFSCSAgICBUc3NpTWludXNCb3VuZGFyeUdbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBkZWNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgotCVVDSEFSCSAgICBUeEFnY1N0ZXBHOwkJCQkJLy8gU3RvcmUgVHggVFNTSSBkZWx0YSBpbmNyZW1lbnQgLyBkZWNyZW1lbnQgdmFsdWUKLQlDSEFSCQlUeEFnY0NvbXBlbnNhdGVHOwkJCS8vIFN0b3JlIHRoZSBjb21wZW5zYXRpb24gKFR4QWdjU3RlcCAqIChpZHgtMSkpCisJQk9PTEVBTiBiQXV0b1R4QWdjRzsJLyogRW5hYmxlIGRyaXZlciBhdXRvIFR4IEFnYyBjb250cm9sICovCisJdTggVHNzaVJlZkc7CQkvKiBTdG9yZSBUc3NpIHJlZmVyZW5jZSB2YWx1ZSBhcyAyNSB0ZW1wZXJhdHVyZS4gKi8KKwl1OCBUc3NpUGx1c0JvdW5kYXJ5R1s1XTsJLyogVHNzaSBib3VuZGFyeSBmb3IgaW5jcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4gKi8KKwl1OCBUc3NpTWludXNCb3VuZGFyeUdbNV07CS8qIFRzc2kgYm91bmRhcnkgZm9yIGRlY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuICovCisJdTggVHhBZ2NTdGVwRzsJLyogU3RvcmUgVHggVFNTSSBkZWx0YSBpbmNyZW1lbnQgLyBkZWNyZW1lbnQgdmFsdWUgKi8KKwljaGFyIFR4QWdjQ29tcGVuc2F0ZUc7CS8qIFN0b3JlIHRoZSBjb21wZW5zYXRpb24gKFR4QWdjU3RlcCAqIChpZHgtMSkpICovCiAKLQkvLysrK0ZvciBSVDI4NzAsIHRoZSBwYXJhbWV0ZXJlcyBpcyBzdGFydCBmcm9tIEJHUnNzaU9mZnNldDEgfiBCR1Jzc2lPZmZzZXQzCi0JQ0hBUgkJQkdSc3NpT2Zmc2V0MDsJCQkJLy8gU3RvcmUgQi9HIFJTU0kjMCBPZmZzZXQgdmFsdWUgb24gRUVQUk9NIDB4NDZoCi0JQ0hBUgkJQkdSc3NpT2Zmc2V0MTsJCQkJLy8gU3RvcmUgQi9HIFJTU0kjMSBPZmZzZXQgdmFsdWUKLQlDSEFSCQlCR1Jzc2lPZmZzZXQyOwkJCQkvLyBTdG9yZSBCL0cgUlNTSSMyIE9mZnNldCB2YWx1ZQotCS8vLS0tCisJY2hhciBCR1Jzc2lPZmZzZXQwOwkvKiBTdG9yZSBCL0cgUlNTSSMwIE9mZnNldCB2YWx1ZSBvbiBFRVBST00gMHg0NmggKi8KKwljaGFyIEJHUnNzaU9mZnNldDE7CS8qIFN0b3JlIEIvRyBSU1NJIzEgT2Zmc2V0IHZhbHVlICovCisJY2hhciBCR1Jzc2lPZmZzZXQyOwkvKiBTdG9yZSBCL0cgUlNTSSMyIE9mZnNldCB2YWx1ZSAqLwogCi0JLy8rKytGb3IgUlQyODcwLCB0aGUgcGFyYW1ldGVyZXMgaXMgc3RhcnQgZnJvbSBBUnNzaU9mZnNldDEgfiBBUnNzaU9mZnNldDMKLQlDSEFSCQlBUnNzaU9mZnNldDA7CQkJCS8vIFN0b3JlIEEgUlNTSSMwIE9mZnNldCB2YWx1ZSBvbiBFRVBST00gMHg0QWgKLQlDSEFSCQlBUnNzaU9mZnNldDE7CQkJCS8vIFN0b3JlIEEgUlNTSSMxIE9mZnNldCB2YWx1ZQotCUNIQVIJCUFSc3NpT2Zmc2V0MjsJCQkJLy8gU3RvcmUgQSBSU1NJIzIgT2Zmc2V0IHZhbHVlCi0JLy8tLS0KKwljaGFyIEFSc3NpT2Zmc2V0MDsJLyogU3RvcmUgQSBSU1NJIzAgT2Zmc2V0IHZhbHVlIG9uIEVFUFJPTSAweDRBaCAqLworCWNoYXIgQVJzc2lPZmZzZXQxOwkvKiBTdG9yZSBBIFJTU0kjMSBPZmZzZXQgdmFsdWUgKi8KKwljaGFyIEFSc3NpT2Zmc2V0MjsJLyogU3RvcmUgQSBSU1NJIzIgT2Zmc2V0IHZhbHVlICovCiAKLQlDSEFSCQlCTE5BR2FpbjsJCQkJCS8vIFN0b3JlIEIvRyBleHRlcm5hbCBMTkEjMCB2YWx1ZSBvbiBFRVBST00gMHg0NGgKLQlDSEFSCQlBTE5BR2FpbjA7CQkJCQkvLyBTdG9yZSBBIGV4dGVybmFsIExOQSMwIHZhbHVlIGZvciBjaDM2fjY0Ci0JQ0hBUgkJQUxOQUdhaW4xOwkJCQkJLy8gU3RvcmUgQSBleHRlcm5hbCBMTkEjMSB2YWx1ZSBmb3IgY2gxMDB+MTI4Ci0JQ0hBUgkJQUxOQUdhaW4yOwkJCQkJLy8gU3RvcmUgQSBleHRlcm5hbCBMTkEjMiB2YWx1ZSBmb3IgY2gxMzJ+MTY1CisJY2hhciBCTE5BR2FpbjsJCS8qIFN0b3JlIEIvRyBleHRlcm5hbCBMTkEjMCB2YWx1ZSBvbiBFRVBST00gMHg0NGggKi8KKwljaGFyIEFMTkFHYWluMDsJCS8qIFN0b3JlIEEgZXh0ZXJuYWwgTE5BIzAgdmFsdWUgZm9yIGNoMzZ+NjQgKi8KKwljaGFyIEFMTkFHYWluMTsJCS8qIFN0b3JlIEEgZXh0ZXJuYWwgTE5BIzEgdmFsdWUgZm9yIGNoMTAwfjEyOCAqLworCWNoYXIgQUxOQUdhaW4yOwkJLyogU3RvcmUgQSBleHRlcm5hbCBMTkEjMiB2YWx1ZSBmb3IgY2gxMzJ+MTY1ICovCisjaWZkZWYgUlQzMHh4CisJLyogZm9yIDM1NzIgKi8KKwl1OCBCYnAyNTsKKwl1OCBCYnAyNjsKIAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBMRUQgY29udHJvbAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlNQ1VfTEVEQ1NfU1RSVUMJCUxlZENudGw7Ci0JVVNIT1JUCQkJCUxlZDE7CS8vIHJlYWQgZnJvbSBFRVBST00gMHgzYwotCVVTSE9SVAkJCQlMZWQyOwkvLyBFRVBST00gMHgzZQotCVVTSE9SVAkJCQlMZWQzOwkvLyBFRVBST00gMHg0MAotCVVDSEFSCQkJCUxlZEluZGljYXRvclN0cmVndGg7Ci0JVUNIQVIJCQkJUnNzaVNpbmdhbHN0cmVuZ3RoT2ZmZXQ7Ci0gICAgQk9PTEVBTgkJCQliTGVkT25TY2FubmluZzsKLQlVQ0hBUgkJCQlMZWRTdGF0dXM7CisJdTggVHhNaXhlckdhaW4yNEc7CS8qIFR4IG1peGVyIGdhaW4gdmFsdWUgZnJvbSBFRVBST00gdG8gaW1wcm92ZSBUeCBFVk0gLyBUeCBEQUMsIDIuNEcgKi8KKwl1OCBUeE1peGVyR2FpbjVHOworI2VuZGlmCQkJCS8qIFJUMzB4eCAvLyAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBMRUQgY29udHJvbCAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlNQ1VfTEVEQ1NfU1RSVUMgTGVkQ250bDsKKwl1MTYgTGVkMTsJCS8qIHJlYWQgZnJvbSBFRVBST00gMHgzYyAqLworCXUxNiBMZWQyOwkJLyogRUVQUk9NIDB4M2UgKi8KKwl1MTYgTGVkMzsJCS8qIEVFUFJPTSAweDQwICovCisJdTggTGVkSW5kaWNhdG9yU3RyZW5ndGg7CisJdTggUnNzaVNpbmdhbHN0cmVuZ3RoT2ZmZXQ7CisJQk9PTEVBTiBiTGVkT25TY2FubmluZzsKKwl1OCBMZWRTdGF0dXM7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgODAyLjExIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvLyBvdXRnb2luZyBCRUFDT04gZnJhbWUgYnVmZmVyIGFuZCBjb3JyZXNwb25kaW5nIFRYRAotCVRYV0lfU1RSVUMgICAgICAgICAgICAgIAlCZWFjb25UeFdJOwotCVBVQ0hBUgkJCQkJCUJlYWNvbkJ1ZjsKLQlVU0hPUlQJCQkJCQlCZWFjb25PZmZzZXRbSFdfQkVBQ09OX01BWF9DT1VOVF07CisJLyogb3V0Z29pbmcgQkVBQ09OIGZyYW1lIGJ1ZmZlciBhbmQgY29ycmVzcG9uZGluZyBUWEQgKi8KKwlzdHJ1Y3QgcnRfdHh3aSBCZWFjb25UeFdJOworCXU4ICpCZWFjb25CdWY7CisJdTE2IEJlYWNvbk9mZnNldFtIV19CRUFDT05fTUFYX0NPVU5UXTsKIAotCS8vIHByZS1idWlsZCBQUy1QT0xMIGFuZCBOVUxMIGZyYW1lIHVwb24gbGluayB1cC4gZm9yIGVmZmljaWVuY3kgcHVycG9zZS4KLQlQU1BPTExfRlJBTUUgICAgICAgICAgICAJUHNQb2xsRnJhbWU7Ci0JSEVBREVSXzgwMl8xMSAgICAgICAgICAgCU51bGxGcmFtZTsKKwkvKiBwcmUtYnVpbGQgUFMtUE9MTCBhbmQgTlVMTCBmcmFtZSB1cG9uIGxpbmsgdXAuIGZvciBlZmZpY2llbmN5IHB1cnBvc2UuICovCisJc3RydWN0IHJ0X3BzcG9sbF9mcmFtZSBQc1BvbGxGcmFtZTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBOdWxsRnJhbWU7CiAKLSNpZmRlZiBSVDI4NzAKLQlUWF9DT05URVhUCQkJCUJlYWNvbkNvbnRleHRbQkVBQ09OX1JJTkdfU0laRV07Ci0JVFhfQ09OVEVYVAkJCQlOdWxsQ29udGV4dDsKLQlUWF9DT05URVhUCQkJCVBzUG9sbENvbnRleHQ7Ci0JVFhfQ09OVEVYVAkJCQlSVFNDb250ZXh0OwotI2VuZGlmIC8vIFJUMjg3MCAvLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCXN0cnVjdCBydF90eF9jb250ZXh0IEJlYWNvbkNvbnRleHRbQkVBQ09OX1JJTkdfU0laRV07CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgTnVsbENvbnRleHQ7CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgUHNQb2xsQ29udGV4dDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCBSVFNDb250ZXh0OworI2VuZGlmCQkJCS8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCisvKj09PT09PT09PUFQPT09PT09PT09PT0gKi8KIAorLyo9PT09PT09U1RBPT09PT09PT09PT0gKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIFNUQSBzcGVjaWZpYyBjb25maWd1cmF0aW9uICYgb3BlcmF0aW9uIHN0YXR1cyAqLworCS8qIHVzZWQgb25seSB3aGVuIHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCXN0cnVjdCBydF9zdGFfYWRtaW5fY29uZmlnIFN0YUNmZzsJLyogdXNlciBkZXNpcmVkIHNldHRpbmdzICovCisJc3RydWN0IHJ0X3N0YV9hY3RpdmVfY29uZmlnIFN0YUFjdGl2ZTsJLyogdmFsaWQgb25seSB3aGVuIEFESE9DX09OKHBBZCkgfHwgSU5GUkFfT04ocEFkKSAqLworCWNoYXIgbmlja25hbWVbSVdfRVNTSURfTUFYX1NJWkUgKyAxXTsJLyogbmlja25hbWUsIG9ubHkgdXNlZCBpbiB0aGUgaXdjb25maWcgaS9mICovCisJaW50IFByZU1lZGlhU3RhdGU7CiAKLS8vPT09PT09PT09QVA9PT09PT09PT09PQorLyo9PT09PT09Q29tbW9uPT09PT09PT09PT0gKi8KKwkvKiBPUCBtb2RlOiBlaXRoZXIgQVAgb3IgU1RBICovCisJdTggT3BNb2RlOwkJLyogT1BNT0RFX1NUQSwgT1BNT0RFX0FQICovCiAKKwlpbnQgSW5kaWNhdGVNZWRpYVN0YXRlOwkvKiBCYXNlIG9uIEluZGljYXRpb24gc3RhdGUsIGRlZmF1bHQgaXMgTmRpc01lZGlhU3RhdGVEaXNDb25uZWN0ZWQgKi8KIAotLy89PT09PT09U1RBPT09PT09PT09PT0KLS8qIE1vZGlmaWVkIGJ5IFd1IFhpLUt1biA0LzIxLzIwMDYgKi8KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIFNUQSBzcGVjaWZpYyBjb25maWd1cmF0aW9uICYgb3BlcmF0aW9uIHN0YXR1cwotCS8vIHVzZWQgb25seSB3aGVuIHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNUQV9BRE1JTl9DT05GSUcgICAgICAgIFN0YUNmZzsgICAgICAgICAgIC8vIHVzZXIgZGVzaXJlZCBzZXR0aW5ncwotCVNUQV9BQ1RJVkVfQ09ORklHICAgICAgIFN0YUFjdGl2ZTsgICAgICAgICAvLyB2YWxpZCBvbmx5IHdoZW4gQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpCi0JQ0hBUiAgICAgICAgICAgICAgICAgICAgbmlja25hbWVbSVdfRVNTSURfTUFYX1NJWkUrMV07IC8vIG5pY2tuYW1lLCBvbmx5IHVzZWQgaW4gdGhlIGl3Y29uZmlnIGkvZgotCU5ESVNfTUVESUFfU1RBVEUgICAgICAgIFByZU1lZGlhU3RhdGU7CisJLyogTUFUIHJlbGF0ZWQgcGFyYW1ldGVycyAqLwogCi0vLz09PT09PT1Db21tb249PT09PT09PT09PQotCS8vIE9QIG1vZGU6IGVpdGhlciBBUCBvciBTVEEKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBPcE1vZGU7ICAgICAgICAgICAgICAgICAgICAgLy8gT1BNT0RFX1NUQSwgT1BNT0RFX0FQCisJLyogY29uZmlndXJhdGlvbjogcmVhZCBmcm9tIFJlZ2lzdHJ5ICYgRTJQUk9NICovCisJQk9PTEVBTiBiTG9jYWxBZG1pbk1BQzsJLyogVXNlIHVzZXIgY2hhbmdlZCBNQUMgKi8KKwl1OCBQZXJtYW5lbnRBZGRyZXNzW01BQ19BRERSX0xFTl07CS8qIEZhY3RvcnkgZGVmYXVsdCBNQUMgYWRkcmVzcyAqLworCXU4IEN1cnJlbnRBZGRyZXNzW01BQ19BRERSX0xFTl07CS8qIFVzZXIgY2hhbmdlZCBNQUMgYWRkcmVzcyAqLwogCi0JTkRJU19NRURJQV9TVEFURSAgICAgICAgSW5kaWNhdGVNZWRpYVN0YXRlOwkJCS8vIEJhc2Ugb24gSW5kaWNhdGlvbiBzdGF0ZSwgZGVmYXVsdCBpcyBOZGlzTWVkaWFTdGF0ZURpc0Nvbm5lY3RlZAorCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIGNvbW1vbiBjb25maWd1cmF0aW9uIHRvIGJvdGggT1BNT0RFX1NUQSBhbmQgT1BNT0RFX0FQICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJc3RydWN0IHJ0X2NvbW1vbl9jb25maWcgQ29tbW9uQ2ZnOworCXN0cnVjdCBydF9tbG1lIE1sbWU7CiAKKwkvKiBBUCBuZWVkcyB0aG9zZSB2YWlhYmxlcyBmb3Igc2l0ZSBzdXJ2ZXkgZmVhdHVyZS4gKi8KKwlzdHJ1Y3QgcnRfbWxtZV9hdXggTWxtZUF1eDsJLyogdGVtcG9yYXJ5IHNldHRpbmdzIHVzZWQgZHVyaW5nIE1MTUUgc3RhdGUgbWFjaGluZSAqLworCXN0cnVjdCBydF9ic3NfdGFibGUgU2NhblRhYjsJLyogc3RvcmUgdGhlIGxhdGVzdCBTQ0FOIHJlc3VsdCAqLwogCi0JLy8gY29uZmlndXJhdGlvbjogcmVhZCBmcm9tIFJlZ2lzdHJ5ICYgRTJQUk9NCi0JQk9PTEVBTiAgICAgICAgICAgICAgICAgYkxvY2FsQWRtaW5NQUM7ICAgICAgICAgICAgIC8vIFVzZSB1c2VyIGNoYW5nZWQgTUFDCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgUGVybWFuZW50QWRkcmVzc1tNQUNfQUREUl9MRU5dOyAgICAvLyBGYWN0b3J5IGRlZmF1bHQgTUFDIGFkZHJlc3MKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBDdXJyZW50QWRkcmVzc1tNQUNfQUREUl9MRU5dOyAgICAgIC8vIFVzZXIgY2hhbmdlZCBNQUMgYWRkcmVzcworCS8qQWJvdXQgTWFjVGFiLCB0aGUgc3RhIGRyaXZlciB3aWxsIHVzZSAjMCBhbmQgIzEgZm9yIG11bHRpY2FzdCBhbmQgQVAuICovCisJc3RydWN0IHJ0X21hY190YWJsZSBNYWNUYWI7CS8qIEFTSUMgb24tY2hpcCBXQ0lEIGVudHJ5IHRhYmxlLiAgQXQgVFgsIEFTSUMgYWx3YXlzIHVzZSBrZXkgYWNjb3JkaW5nIHRvIHRoaXMgb24tY2hpcCB0YWJsZS4gKi8KKwlzcGlubG9ja190IE1hY1RhYkxvY2s7CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBjb21tb24gY29uZmlndXJhdGlvbiB0byBib3RoIE9QTU9ERV9TVEEgYW5kIE9QTU9ERV9BUAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUNPTU1PTl9DT05GSUcgICAgICAgICAgIENvbW1vbkNmZzsKLQlNTE1FX1NUUlVDVCAgICAgICAgICAgICBNbG1lOworCXN0cnVjdCBydF9iYV90YWJsZSBCQVRhYmxlOwogCi0JLy8gQVAgbmVlZHMgdGhvc2UgdmFpYWJsZXMgZm9yIHNpdGUgc3VydmV5IGZlYXR1cmUuCi0JTUxNRV9BVVggICAgICAgICAgICAgICAgTWxtZUF1eDsgICAgICAgICAgIC8vIHRlbXBvcmFyeSBzZXR0aW5ncyB1c2VkIGR1cmluZyBNTE1FIHN0YXRlIG1hY2hpbmUKLQlCU1NfVEFCTEUgICAgICAgICAgICAgICBTY2FuVGFiOyAgICAgICAgICAgLy8gc3RvcmUgdGhlIGxhdGVzdCBTQ0FOIHJlc3VsdAorCXNwaW5sb2NrX3QgQkFUYWJMb2NrOworCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgUkVDQkFUaW1lcjsKIAotCS8vQWJvdXQgTWFjVGFiLCB0aGUgc3RhIGRyaXZlciB3aWxsIHVzZSAjMCBhbmQgIzEgZm9yIG11bHRpY2FzdCBhbmQgQVAuCi0JTUFDX1RBQkxFICAgICAgICAgICAgICAgICBNYWNUYWI7ICAgICAvLyBBU0lDIG9uLWNoaXAgV0NJRCBlbnRyeSB0YWJsZS4gIEF0IFRYLCBBU0lDIGFsd2F5cyB1c2Uga2V5IGFjY29yZGluZyB0byB0aGlzIG9uLWNoaXAgdGFibGUuCi0JTkRJU19TUElOX0xPQ0sgICAgICAgICAgTWFjVGFiTG9jazsKKwkvKiBlbmNyeXB0aW9uL2RlY3J5cHRpb24gS0VZIHRhYmxlcyAqLworCXN0cnVjdCBydF9jaXBoZXJfa2V5IFNoYXJlZEtleVtNQVhfTUJTU0lEX05VTV1bNF07CS8qIFNUQSBhbHdheXMgdXNlIFNoYXJlZEtleVtCU1MwXVswLi4zXSAqLwogCi0JQkFfVEFCTEUJCQlCQVRhYmxlOworCS8qIFJYIHJlLWFzc2VtYmx5IGJ1ZmZlciBmb3IgZnJhZ21lbnRhdGlvbiAqLworCXN0cnVjdCBydF9mcmFnbWVudF9mcmFtZSBGcmFnRnJhbWU7CS8qIEZyYW1lIHN0b3JhZ2UgZm9yIGZyYWdtZW50IGZyYW1lICovCiAKLQlORElTX1NQSU5fTE9DSyAgICAgICAgICBCQVRhYkxvY2s7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCBSRUNCQVRpbWVyOworCS8qIHZhcmlvdXMgQ291bnRlcnMgKi8KKwlzdHJ1Y3QgcnRfY291bnRlcl84MDJfMyBDb3VudGVyczgwMjM7CS8qIDgwMi4zIGNvdW50ZXJzICovCisJc3RydWN0IHJ0X2NvdW50ZXJfODAyXzExIFdsYW5Db3VudGVyczsJLyogODAyLjExIE1JQiBjb3VudGVycyAqLworCXN0cnVjdCBydF9jb3VudGVyX3JhbGluayBSYWxpbmtDb3VudGVyczsJLyogUmFsaW5rIHByb3ByaWV0eSBjb3VudGVycyAqLworCXN0cnVjdCBydF9jb3VudGVyX2RycyBEcnNDb3VudGVyczsJLyogY291bnRlcnMgZm9yIER5bmFtaWMgVFggUmF0ZSBTd2l0Y2hpbmcgKi8KKwlzdHJ1Y3QgcnRfcHJpdmF0ZSBQcml2YXRlSW5mbzsJLyogUHJpdmF0ZSBpbmZvcm1hdGlvbiAmIGNvdW50ZXJzICovCiAKLQkvLyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gS0VZIHRhYmxlcwotCUNJUEhFUl9LRVkgICAgICAgICAgICAgIFNoYXJlZEtleVtNQVhfTUJTU0lEX05VTV1bNF07IC8vIFNUQSBhbHdheXMgdXNlIFNoYXJlZEtleVtCU1MwXVswLi4zXQorCS8qIGZsYWdzLCBzZWUgZlJUTVBfQURBUFRFUl94eHggZmxhZ3MgKi8KKwl1bnNpZ25lZCBsb25nIEZsYWdzOwkJLyogUmVwcmVzZW50IGN1cnJlbnQgZGV2aWNlIHN0YXR1cyAqLworCXVuc2lnbmVkIGxvbmcgUFNGbGFnczsJCS8qIFBvd2VyIFNhdmUgb3BlcmF0aW9uIGZsYWcuICovCiAKLQkJLy8gUlggcmUtYXNzZW1ibHkgYnVmZmVyIGZvciBmcmFnbWVudGF0aW9uCi0JRlJBR01FTlRfRlJBTUUgICAgICAgICAgRnJhZ0ZyYW1lOyAgICAgICAgICAgICAgICAgIC8vIEZyYW1lIHN0b3JhZ2UgZm9yIGZyYWdtZW50IGZyYW1lCisJLyogY3VycmVudCBUWCBzZXF1ZW5jZSAjICovCisJdTE2IFNlcXVlbmNlOwogCi0JLy8gdmFyaW91cyBDb3VudGVycwotCUNPVU5URVJfODAyXzMgICAgICAgICAgIENvdW50ZXJzODAyMzsgICAgICAgICAgICAgICAvLyA4MDIuMyBjb3VudGVycwotCUNPVU5URVJfODAyXzExICAgICAgICAgIFdsYW5Db3VudGVyczsgICAgICAgICAgICAgICAvLyA4MDIuMTEgTUlCIGNvdW50ZXJzCi0JQ09VTlRFUl9SQUxJTksgICAgICAgICAgUmFsaW5rQ291bnRlcnM7ICAgICAgICAgICAgIC8vIFJhbGluayBwcm9wcmlldHkgY291bnRlcnMKLQlDT1VOVEVSX0RSUyAgICAgICAgICAgICBEcnNDb3VudGVyczsgICAgICAgICAgICAgICAgLy8gY291bnRlcnMgZm9yIER5bmFtaWMgVFggUmF0ZSBTd2l0Y2hpbmcKLQlQUklWQVRFX1NUUlVDICAgICAgICAgICBQcml2YXRlSW5mbzsgICAgICAgICAgICAgICAgLy8gUHJpdmF0ZSBpbmZvcm1hdGlvbiAmIGNvdW50ZXJzCisJLyogQ29udHJvbCBkaXNjb25uZWN0IC8gY29ubmVjdCBldmVudCBnZW5lcmF0aW9uICovCisJLyorKytEaWRuJ3QgdXNlZCBhbnltb3JlICovCisJdW5zaWduZWQgbG9uZyBMaW5rRG93blRpbWU7CisJLyotLS0gKi8KKwl1bnNpZ25lZCBsb25nIExhc3RSeFJhdGU7CisJdW5zaWduZWQgbG9uZyBMYXN0VHhSYXRlOworCS8qKysrVXNlZCBvbmx5IGZvciBTdGF0aW9uICovCisJQk9PTEVBTiBiQ29uZmlnQ2hhbmdlZDsJLyogQ29uZmlnIENoYW5nZSBmbGFnIGZvciB0aGUgc2FtZSBTU0lEIHNldHRpbmcgKi8KKwkvKi0tLSAqLwogCi0JLy8gZmxhZ3MsIHNlZSBmUlRNUF9BREFQVEVSX3h4eCBmbGFncwotCVVMT05HICAgICAgICAgICAgICAgICAgIEZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAvLyBSZXByZXNlbnQgY3VycmVudCBkZXZpY2Ugc3RhdHVzCi0jaWZkZWYgUlQyODYwCi0JVUxPTkcgICAgICAgICAgICAgICAgICAgUFNGbGFnczsgICAgICAgICAgICAgICAgICAgIC8vIFBvd2VyIFNhdmUgb3BlcmF0aW9uIGZsYWcuCi0jZW5kaWYKKwl1bnNpZ25lZCBsb25nIEV4dHJhSW5mbzsJLyogRXh0cmEgaW5mb3JtYXRpb24gZm9yIGRpc3BsYXlpbmcgc3RhdHVzICovCisJdW5zaWduZWQgbG9uZyBTeXN0ZW1FcnJvckJpdG1hcDsJLyogYjA6IEUyUFJPTSB2ZXJzaW9uIGVycm9yICovCiAKLQkvLyBjdXJyZW50IFRYIHNlcXVlbmNlICMKLQlVU0hPUlQgICAgICAgICAgICAgICAgICBTZXF1ZW5jZTsKKwkvKisrK0RpZG4ndCB1c2VkIGFueW1vcmUgKi8KKwl1bnNpZ25lZCBsb25nIE1hY0ljVmVyc2lvbjsJLyogTUFDL0JCUCBzZXJpYWwgaW50ZXJmYWNlIGlzc3VlIHNvbHZlZCBhZnRlciB2ZXIuRCAqLworCS8qLS0tICovCiAKLQkvLyBDb250cm9sIGRpc2Nvbm5lY3QgLyBjb25uZWN0IGV2ZW50IGdlbmVyYXRpb24KLQkvLysrK0RpZG4ndCB1c2VkIGFueW1vcmUKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBMaW5rRG93blRpbWU7Ci0JLy8tLS0KLQlVTE9ORyAgICAgICAgICAgICAgICAgICBMYXN0UnhSYXRlOwotCVVMT05HICAgICAgICAgICAgICAgICAgIExhc3RUeFJhdGU7Ci0JLy8rKytVc2VkIG9ubHkgZm9yIFN0YXRpb24KLQlCT09MRUFOICAgICAgICAgICAgICAgICBiQ29uZmlnQ2hhbmdlZDsgICAgICAgICAvLyBDb25maWcgQ2hhbmdlIGZsYWcgZm9yIHRoZSBzYW1lIFNTSUQgc2V0dGluZwotCS8vLS0tCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogU3lzdGVtIGV2ZW50IGxvZyAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCXN0cnVjdCBydF84MDJfMTFfZXZlbnRfdGFibGUgRXZlbnRUYWI7CiAKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBFeHRyYUluZm87ICAgICAgICAgICAgICAvLyBFeHRyYSBpbmZvcm1hdGlvbiBmb3IgZGlzcGxheWluZyBzdGF0dXMKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBTeXN0ZW1FcnJvckJpdG1hcDsgICAgICAvLyBiMDogRTJQUk9NIHZlcnNpb24gZXJyb3IKLQotCS8vKysrRGlkbid0IHVzZWQgYW55bW9yZQotCVVMT05HICAgICAgICAgICAgICAgICAgIE1hY0ljVmVyc2lvbjsgICAgICAgICAgIC8vIE1BQy9CQlAgc2VyaWFsIGludGVyZmFjZSBpc3N1ZSBzb2x2ZWQgYWZ0ZXIgdmVyLkQKLQkvLy0tLQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gU3lzdGVtIGV2ZW50IGxvZwotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVJUXzgwMl8xMV9FVkVOVF9UQUJMRSAgIEV2ZW50VGFiOwotCi0KLQlCT09MRUFOCQlIVENFbmFibGU7CisJQk9PTEVBTiBIVENFbmFibGU7CiAKIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogICAgICBTdGF0aXN0aWMgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBSVDI4NzAKLQlVTE9ORwkJCQkJCUJ1bGtPdXREYXRhT25lU2VjQ291bnQ7Ci0JVUxPTkcJCQkJCQlCdWxrSW5EYXRhT25lU2VjQ291bnQ7Ci0JVUxPTkcJCQkJCQlCdWxrTGFzdE9uZVNlY0NvdW50OyAvLyBCdWxrT3V0RGF0YU9uZVNlY0NvdW50ICsgQnVsa0luRGF0YU9uZVNlY0NvdW50Ci0JVUxPTkcJCQkJCQl3YXRjaERvZ1J4Q250OwotCVVMT05HCQkJCQkJd2F0Y2hEb2dSeE92ZXJGbG93Q250OwotCVVMT05HCQkJCQkJd2F0Y2hEb2dUeFBlbmRpbmdDbnRbTlVNX09GX1RYX1JJTkddOwotI2VuZGlmIC8vIFJUMjg3MCAvLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCXVuc2lnbmVkIGxvbmcgQnVsa091dERhdGFPbmVTZWNDb3VudDsKKwl1bnNpZ25lZCBsb25nIEJ1bGtJbkRhdGFPbmVTZWNDb3VudDsKKwl1bnNpZ25lZCBsb25nIEJ1bGtMYXN0T25lU2VjQ291bnQ7CS8qIEJ1bGtPdXREYXRhT25lU2VjQ291bnQgKyBCdWxrSW5EYXRhT25lU2VjQ291bnQgKi8KKwl1bnNpZ25lZCBsb25nIHdhdGNoRG9nUnhDbnQ7CisJdW5zaWduZWQgbG9uZyB3YXRjaERvZ1J4T3ZlckZsb3dDbnQ7CisJdW5zaWduZWQgbG9uZyB3YXRjaERvZ1R4UGVuZGluZ0NudFtOVU1fT0ZfVFhfUklOR107CisJaW50IFRyYW5zZmVyZWRMZW5ndGhbTlVNX09GX1RYX1JJTkddOworI2VuZGlmCQkJCS8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCi0JQk9PTEVBTgkJCQkJCWJVcGRhdGVCY25DbnREb25lOwotCVVMT05HCQkJCQkJd2F0Y2hEb2dNYWNEZWFkbG9jazsJLy8gcHJldmVudCBNQUMvQkJQIGludG8gZGVhZGxvY2sgY29uZGl0aW9uCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIERFQlVHIHBhcmFtZXJ0cwotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlCT09MRUFOCQliQmFuQWxsQmFTZXR1cDsKLQlCT09MRUFOCQliUHJvbWlzY3VvdXM7CisJQk9PTEVBTiBiVXBkYXRlQmNuQ250RG9uZTsKKwl1bnNpZ25lZCBsb25nIHdhdGNoRG9nTWFjRGVhZGxvY2s7CS8qIHByZXZlbnQgTUFDL0JCUCBpbnRvIGRlYWRsb2NrIGNvbmRpdGlvbiAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBERUJVRyBwYXJhbWVydHMgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyp1bnNpZ25lZCBsb25nICAgICAgICAgRGVidWdTZXR0aW5nWzRdOyAqLworCUJPT0xFQU4gYkJhbkFsbEJhU2V0dXA7CisJQk9PTEVBTiBiUHJvbWlzY3VvdXM7CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gcnQyODYwYyBlbXVsYXRpb24tdXNlIFBhcmFtZXRlcnMKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JVUxPTkcJCXJ0c2FjY3VbMzBdOwotCVVMT05HCQljdHNhY2N1WzMwXTsKLQlVTE9ORwkJY2ZlbmRhY2N1WzMwXTsKLQlVTE9ORwkJYmFjb250ZW50WzE2XTsKLQlVTE9ORwkJcnhpbnRbUlhfUklOR19TSVpFKzFdOwotCVVDSEFSCQlyY3ZiYVs2MF07Ci0JQk9PTEVBTgkJYkxpbmtBZGFwdDsKLQlCT09MRUFOCQliRm9yY2VQcmludFRYOwotCUJPT0xFQU4JCWJGb3JjZVByaW50Ulg7Ci0JQk9PTEVBTgkJYkRpc2FibGVzY2FubmluZzsJCS8vZGVmaW5lZCBpbiBSVDI4NzAgVVNCCi0JQk9PTEVBTgkJYlN0YUZpZm9UZXN0OwotCUJPT0xFQU4JCWJQcm90ZWN0aW9uVGVzdDsKLQlCT09MRUFOCQliSENDQVRlc3Q7Ci0JQk9PTEVBTgkJYkdlbk9uZUhDQ0E7Ci0JQk9PTEVBTgkJYkJyb2FkQ29tSFQ7Ci0JLy8rKytGb2xsb3dpbmcgYWRkIGZyb20gUlQyODcwIFVTQi4KLQlVTE9ORwkJQnVsa091dFJlcTsKLQlVTE9ORwkJQnVsa091dENvbXBsZXRlOwotCVVMT05HCQlCdWxrT3V0Q29tcGxldGVPdGhlcjsKLQlVTE9ORwkJQnVsa091dENvbXBsZXRlQ2FuY2VsOwkvLyBzZWVtcyBub3QgdXNlIG5vdz8KLQlVTE9ORwkJQnVsa0luUmVxOwotCVVMT05HCQlCdWxrSW5Db21wbGV0ZTsKLQlVTE9ORwkJQnVsa0luQ29tcGxldGVGYWlsOwotCS8vLS0tCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIHJ0Mjg2MGMgZW11bGF0aW9uLXVzZSBQYXJhbWV0ZXJzICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qdW5zaWduZWQgbG9uZyAgICAgICAgIHJ0c2FjY3VbMzBdOyAqLworCS8qdW5zaWduZWQgbG9uZyAgICAgICAgIGN0c2FjY3VbMzBdOyAqLworCS8qdW5zaWduZWQgbG9uZyAgICAgICAgIGNmZW5kYWNjdVszMF07ICovCisJLyp1bnNpZ25lZCBsb25nICAgICAgICAgYmFjb250ZW50WzE2XTsgKi8KKwkvKnVuc2lnbmVkIGxvbmcgICAgICAgICByeGludFtSWF9SSU5HX1NJWkUrMV07ICovCisJLyp1OCAgICAgICAgIHJjdmJhWzYwXTsgKi8KKwlCT09MRUFOIGJMaW5rQWRhcHQ7CisJQk9PTEVBTiBiRm9yY2VQcmludFRYOworCUJPT0xFQU4gYkZvcmNlUHJpbnRSWDsKKwkvKkJPT0xFQU4gICAgICAgICAgICAgICBiRGlzYWJsZXNjYW5uaW5nOyAgICAgICAgICAgICAgIC8vZGVmaW5lZCBpbiBSVDI4NzAgVVNCICovCisJQk9PTEVBTiBiU3RhRmlmb1Rlc3Q7CisJQk9PTEVBTiBiUHJvdGVjdGlvblRlc3Q7CisJQk9PTEVBTiBiQnJvYWRDb21IVDsKKwkvKisrK0ZvbGxvd2luZyBhZGQgZnJvbSBSVDI4NzAgVVNCLiAqLworCXVuc2lnbmVkIGxvbmcgQnVsa091dFJlcTsKKwl1bnNpZ25lZCBsb25nIEJ1bGtPdXRDb21wbGV0ZTsKKwl1bnNpZ25lZCBsb25nIEJ1bGtPdXRDb21wbGV0ZU90aGVyOworCXVuc2lnbmVkIGxvbmcgQnVsa091dENvbXBsZXRlQ2FuY2VsOwkvKiBzZWVtcyBub3QgdXNlIG5vdz8gKi8KKwl1bnNpZ25lZCBsb25nIEJ1bGtJblJlcTsKKwl1bnNpZ25lZCBsb25nIEJ1bGtJbkNvbXBsZXRlOworCXVuc2lnbmVkIGxvbmcgQnVsa0luQ29tcGxldGVGYWlsOworCS8qLS0tICovCiAKLSAgICBzdHJ1Y3Qgd2lmaWNvbmYJCQlXSUZJdGVzdGJlZDsKKwlzdHJ1Y3Qgd2lmaWNvbmYgV0lGSXRlc3RiZWQ7CiAKIAlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1X3Bvb2wgbXBkdV9ibGtfcG9vbDsKIAotCVVMT05HCQkJCQlPbmVTZWNvbmRub25CRXBhY2tldHM7CQkvLyByZWNvcmQgbm9uIEJFIHBhY2tldHMgcGVyIHNlY29uZAorCXVuc2lnbmVkIGxvbmcgT25lU2Vjb25kbm9uQkVwYWNrZXRzOwkvKiByZWNvcmQgbm9uIEJFIHBhY2tldHMgcGVyIHNlY29uZCAqLwogCi0gICAgc3RydWN0IGl3X3N0YXRpc3RpY3MgICAgaXdfc3RhdHM7CisjaWZkZWYgTElOVVgKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyBpd19zdGF0czsKIAotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworI2VuZGlmCQkJCS8qIExJTlVYIC8vICovCiAKLQlVTE9ORwkJCQkJVGJ0dFRpY2tDb3VudDsKKwl1bnNpZ25lZCBsb25nIFRidHRUaWNrQ291bnQ7CiAjaWZkZWYgUENJX01TSV9TVVBQT1JUCi0JQk9PTEVBTgkJCQkJSGF2ZU1zaTsKLSNlbmRpZiAvLyBQQ0lfTVNJX1NVUFBPUlQgLy8KKwlCT09MRUFOIEhhdmVNc2k7CisjZW5kaWYJCQkJLyogUENJX01TSV9TVVBQT1JUIC8vICovCiAKLQotCVVDSEFSCQkJCQlpc19vbjsKKwl1OCBpc19vbjsKIAogI2RlZmluZSBUSU1FX0JBU0UJCQkoMTAwMDAwMC9PU19IWikKICNkZWZpbmUgVElNRV9PTkVfU0VDT05ECQkoMTAwMDAwMC9USU1FX0JBU0UpCi0JVUNIQVIJCQkJCWZsZ19iZV9hZGp1c3Q7Ci0JVUxPTkcJCQkJCWJlX2FkanVzdF9sYXN0X3RpbWU7CisJdTggZmxnX2JlX2FkanVzdDsKKwl1bnNpZ25lZCBsb25nIGJlX2FkanVzdF9sYXN0X3RpbWU7CiAKKwl1OCBGbGdDdHNFbmFibGVkOworCXU4IFBNX0ZsZ1N1c3BlbmQ7CiAKLQotCVVJTlQ4CQkJCQlQTV9GbGdTdXNwZW5kOwotCi0jaWZkZWYgUlQyODcwCi0JQk9PTEVBTgkJYlVzZUVmdXNlOwotI2VuZGlmCi19IFJUTVBfQURBUFRFUiwgKlBSVE1QX0FEQVBURVI7Ci0KLS8vCi0vLyBDaXNjbyBJQVBQIGZvcm1hdAotLy8KLXR5cGVkZWYgc3RydWN0ICBfQ0lTQ09fSUFQUF9DT05URU5UXwotewotCVVTSE9SVCAgICAgTGVuZ3RoOyAgICAgICAgLy9JQVBQIExlbmd0aAotCVVDSEFSICAgICAgTWVzc2FnZVR5cGU7ICAgICAgLy9JQVBQIHR5cGUKLQlVQ0hBUiAgICAgIEZ1bmN0aW9uQ29kZTsgICAgIC8vSUFQUCBmdW5jdGlvbiB0eXBlCi0JVUNIQVIgICAgICBEZXN0aW5haW9uTUFDW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICAgICBTb3VyY2VNQUNbTUFDX0FERFJfTEVOXTsKLQlVU0hPUlQgICAgIFRhZzsgICAgICAgICAgIC8vVGFnKGVsZW1lbnQgSUUpIC0gQWRqYWNlbnQgQVAgcmVwb3J0Ci0JVVNIT1JUICAgICBUYWdMZW5ndGg7ICAgICAvL0xlbmd0aCBvZiBlbGVtZW50IG5vdCBpbmNsdWRpbmcgNCBieXRlIGhlYWRlcgotCVVDSEFSICAgICAgT1VJWzRdOyAgICAgICAgICAgLy8weDAwLCAweDQwLCAweDk2LCAweDAwCi0JVUNIQVIgICAgICBQcmV2aW91c0FQW01BQ19BRERSX0xFTl07ICAgICAgIC8vTUFDIEFkZHJlc3Mgb2YgYWNjZXNzIHBvaW50Ci0JVVNIT1JUICAgICBDaGFubmVsOwotCVVTSE9SVCAgICAgU3NpZExlbjsKLQlVQ0hBUiAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKLQlVU0hPUlQgICAgIFNlY29uZHM7ICAgICAgICAgIC8vU2Vjb25kcyB0aGF0IHRoZSBjbGllbnQgaGFzIGJlZW4gZGlzYXNzb2NpYXRlZC4KLX0gQ0lTQ09fSUFQUF9DT05URU5ULCAqUENJU0NPX0lBUFBfQ09OVEVOVDsKKyNpZmRlZiBSVDMweHgKKyNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKKwlCT09MRUFOIGJVc2VFZnVzZTsKKwl1OCBFRVBST01JbWFnZVsxMDI0XTsKKyNlbmRpZgkJCQkvKiBSVE1QX0VGVVNFX1NVUFBPUlQgLy8gKi8KKyNlbmRpZgkJCQkvKiBSVDMweHggLy8gKi8KK307CiAKICNkZWZpbmUgREVMQVlJTlRNQVNLCQkweDAwMDNmZmZiCiAjZGVmaW5lIElOVE1BU0sJCQkJMHgwMDAzZmZmYgogI2RlZmluZSBJbmRNYXNrCQkJCTB4MDAwM2ZmZmMKLSNkZWZpbmUgUnhJTlQJCQkJMHgwMDAwMDAwNQkvLyBEZWxheWVkIFJ4IG9yIGluZGl2aSByeAotI2RlZmluZSBUeERhdGFJbnQJCQkweDAwMDAwMGZhCS8vIERlbGF5ZWQgVHggb3IgaW5kaXZpIHR4Ci0jZGVmaW5lIFR4TWdtdEludAkJCTB4MDAwMDAxMDIJLy8gRGVsYXllZCBUeCBvciBpbmRpdmkgdHgKLSNkZWZpbmUgVHhDb2hlcmVudAkJCTB4MDAwMjAwMDAJLy8gdHggY29oZXJlbnQKLSNkZWZpbmUgUnhDb2hlcmVudAkJCTB4MDAwMTAwMDAJLy8gcnggY29oZXJlbnQKLSNkZWZpbmUgTWN1Q29tbWFuZAkJCTB4MDAwMDAyMDAJLy8gbWN1Ci0jZGVmaW5lIFByZVRCVFRJbnQJCQkweDAwMDAxMDAwCS8vIFByZS1UQlRUIGludGVycnVwdAotI2RlZmluZSBUQlRUSW50CQkJCTB4MDAwMDA4MDAJCS8vIFRCVFQgaW50ZXJydXB0Ci0jZGVmaW5lIEdQVGltZU91dEludAkJCTB4MDAwMDgwMDAJCS8vIEdQdGltZW91dCBpbnRlcnJ1cHQKLSNkZWZpbmUgQXV0b1dha2V1cEludAkJMHgwMDAwNDAwMAkJLy8gQXV0b1dha2V1cEludCBpbnRlcnJ1cHQKLSNkZWZpbmUgRmlmb1N0YUZ1bGxJbnQJCQkweDAwMDAyMDAwCS8vICBmaWZvIHN0YXRpc3RpY3MgZnVsbCBpbnRlcnJ1cHQKKyNkZWZpbmUgUnhJTlQJCQkJMHgwMDAwMDAwNQkvKiBEZWxheWVkIFJ4IG9yIGluZGl2aSByeCAqLworI2RlZmluZSBUeERhdGFJbnQJCQkweDAwMDAwMGZhCS8qIERlbGF5ZWQgVHggb3IgaW5kaXZpIHR4ICovCisjZGVmaW5lIFR4TWdtdEludAkJCTB4MDAwMDAxMDIJLyogRGVsYXllZCBUeCBvciBpbmRpdmkgdHggKi8KKyNkZWZpbmUgVHhDb2hlcmVudAkJCTB4MDAwMjAwMDAJLyogdHggY29oZXJlbnQgKi8KKyNkZWZpbmUgUnhDb2hlcmVudAkJCTB4MDAwMTAwMDAJLyogcnggY29oZXJlbnQgKi8KKyNkZWZpbmUgTWN1Q29tbWFuZAkJCTB4MDAwMDAyMDAJLyogbWN1ICovCisjZGVmaW5lIFByZVRCVFRJbnQJCQkweDAwMDAxMDAwCS8qIFByZS1UQlRUIGludGVycnVwdCAqLworI2RlZmluZSBUQlRUSW50CQkJCTB4MDAwMDA4MDAJLyogVEJUVCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgR1BUaW1lT3V0SW50CQkJMHgwMDAwODAwMAkvKiBHUHRpbWVvdXQgaW50ZXJydXB0ICovCisjZGVmaW5lIEF1dG9XYWtldXBJbnQJCTB4MDAwMDQwMDAJLyogQXV0b1dha2V1cEludCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRmlmb1N0YUZ1bGxJbnQJCQkweDAwMDAyMDAwCS8qICBmaWZvIHN0YXRpc3RpY3MgZnVsbCBpbnRlcnJ1cHQgKi8KIAotCi10eXBlZGVmIHN0cnVjdCBfUlhfQkxLXwotewotCVJUMjhYWF9SWERfU1RSVUMJUnhEOwotCVBSWFdJX1NUUlVDCQkJcFJ4V0k7Ci0JUEhFQURFUl84MDJfMTEJCXBIZWFkZXI7Ci0JUE5ESVNfUEFDS0VUCQlwUnhQYWNrZXQ7Ci0JVUNIQVIJCQkJKnBEYXRhOwotCVVTSE9SVAkJCQlEYXRhU2l6ZTsKLQlVU0hPUlQJCQkJRmxhZ3M7Ci0JVUNIQVIJCQkJVXNlclByaW9yaXR5OwkvLyBmb3IgY2FsY3VsYXRlIFRLSVAgTUlDIHVzaW5nCi19IFJYX0JMSzsKLQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCVJ4IFBhdGggc29mdHdhcmUgY29udHJvbCBibG9jayByZWxhdGVkIGRhdGEgc3RydWN0dXJlcworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBydF9yeF9ibGsgeworCVJUMjhYWF9SWERfU1RSVUMgUnhEOworCXN0cnVjdCBydF9yeHdpICogcFJ4V0k7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyOworCXZvaWQgKnBSeFBhY2tldDsKKwl1OCAqcERhdGE7CisJdTE2IERhdGFTaXplOworCXUxNiBGbGFnczsKKwl1OCBVc2VyUHJpb3JpdHk7CS8qIGZvciBjYWxjdWxhdGUgVEtJUCBNSUMgdXNpbmcgKi8KK307CiAKICNkZWZpbmUgUlhfQkxLX1NFVF9GTEFHKF9wUnhCbGssIF9mbGFnKQkJKF9wUnhCbGstPkZsYWdzIHw9IF9mbGFnKQogI2RlZmluZSBSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIF9mbGFnKQkoX3BSeEJsay0+RmxhZ3MgJiBfZmxhZykKICNkZWZpbmUgUlhfQkxLX0NMRUFSX0ZMQUcoX3BSeEJsaywgX2ZsYWcpCShfcFJ4QmxrLT5GbGFncyAmPSB+KF9mbGFnKSkKIAotCiAjZGVmaW5lIGZSWF9XRFMJCQkweDAwMDEKICNkZWZpbmUgZlJYX0FNU0RVICAgICAgIDB4MDAwMgogI2RlZmluZSBmUlhfQVJBTElOSyAgICAgMHgwMDA0CkBAIC0zMDEyLDYgKzIxOTksOSBAQAogI2RlZmluZSBMRU5HVEhfQVJBTElOS19TVUJGUkFNRUhFQUQJMTQKICNkZWZpbmUgTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxECSAyCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKglUeCBQYXRoIHNvZnR3YXJlIGNvbnRyb2wgYmxvY2sgcmVsYXRlZCBkYXRhIHN0cnVjdHVyZXMKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIFRYX1VOS09XTl9GUkFNRQkJCTB4MDAKICNkZWZpbmUgVFhfTUNBU1RfRlJBTUUJCQkweDAxCiAjZGVmaW5lIFRYX0xFR0FDWV9GUkFNRQkJCTB4MDIKQEAgLTMwMjAsMTE0ICsyMjEwLDY1IEBACiAjZGVmaW5lIFRYX1JBTElOS19GUkFNRQkJCTB4MTAKICNkZWZpbmUgVFhfRlJBR19GUkFNRQkJCTB4MjAKIAorLyogICAgICBDdXJyZW50bHkgdGhlIHNpemVvZihzdHJ1Y3QgcnRfdHhfYmxrKSBpcyAxNDggYnl0ZXMuICovCitzdHJ1Y3QgcnRfdHhfYmxrIHsKKwl1OCBRdWVJZHg7CisJdTggVHhGcmFtZVR5cGU7CS8qIEluZGljYXRlIHRoZSBUcmFuc21pc3Npb24gdHlwZSBvZiB0aGUgYWxsIGZyYW1lcyBpbiBvbmUgYmF0Y2ggKi8KKwl1OCBUb3RhbEZyYW1lTnVtOwkvKiBUb3RhbCBmcmFtZSBudW1iZXIgd2FudCB0byBzZW5kLW91dCBpbiBvbmUgYmF0Y2ggKi8KKwl1MTYgVG90YWxGcmFnTnVtOwkvKiBUb3RhbCBmcmFtZSBmcmFnbWVudHMgcmVxdWlyZWQgaW4gb25lIGJhdGNoICovCisJdTE2IFRvdGFsRnJhbWVMZW47CS8qIFRvdGFsIGxlbmd0aCBvZiBhbGwgZnJhbWVzIHdhbnQgdG8gc2VuZC1vdXQgaW4gb25lIGJhdGNoICovCiAKLS8vCUN1cnJlbnRseSB0aGUgc2l6ZW9mKFRYX0JMSykgaXMgMTQ4IGJ5dGVzLgotdHlwZWRlZiBzdHJ1Y3QgX1RYX0JMS18KLXsKLQlVQ0hBUgkJCQlRdWVJZHg7Ci0JVUNIQVIJCQkJVHhGcmFtZVR5cGU7CQkJCS8vIEluZGljYXRlIHRoZSBUcmFuc21pc3Npb24gdHlwZSBvZiB0aGUgYWxsIGZyYW1lcyBpbiBvbmUgYmF0Y2gKLQlVQ0hBUgkJCQlUb3RhbEZyYW1lTnVtOwkJCQkvLyBUb3RhbCBmcmFtZSBudW1iZXIgd2FudCB0byBzZW5kLW91dCBpbiBvbmUgYmF0Y2gKLQlVU0hPUlQJCQkJVG90YWxGcmFnTnVtOwkJCQkvLyBUb3RhbCBmcmFtZSBmcmFnbWVudHMgcmVxdWlyZWQgaW4gb25lIGJhdGNoCi0JVVNIT1JUCQkJCVRvdGFsRnJhbWVMZW47CQkJCS8vIFRvdGFsIGxlbmd0aCBvZiBhbGwgZnJhbWVzIHdhbnQgdG8gc2VuZC1vdXQgaW4gb25lIGJhdGNoCisJc3RydWN0IHJ0X3F1ZXVlX2hlYWRlciBUeFBhY2tldExpc3Q7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5OwkvKiBOVUxMOiBwYWNrZXQgd2l0aCA4MDIuMTEgUkEgZmllbGQgaXMgbXVsdGljYXN0L2Jyb2FkY2FzdCBhZGRyZXNzICovCisJSFRUUkFOU01JVF9TRVRUSU5HICpwVHJhbnNtaXQ7CiAKLQlRVUVVRV9IRUFERVIJCVR4UGFja2V0TGlzdDsKLQlNQUNfVEFCTEVfRU5UUlkJCSpwTWFjRW50cnk7CQkJCQkvLyBOVUxMOiBwYWNrZXQgd2l0aCA4MDIuMTEgUkEgZmllbGQgaXMgbXVsdGljYXN0L2Jyb2FkY2FzdCBhZGRyZXNzCi0JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQ7CisJLyogRm9sbG93aW5nIHN0cnVjdHVyZSB1c2VkIGZvciB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIGEgc3BlY2lmaWMgcGFja2V0LiAqLworCXZvaWQgKnBQYWNrZXQ7CisJdTggKnBTcmNCdWZIZWFkZXI7CS8qIFJlZmVyZW5jZSB0byB0aGUgaGVhZCBvZiBza19idWZmLT5kYXRhICovCisJdTggKnBTcmNCdWZEYXRhOwkvKiBSZWZlcmVuY2UgdG8gdGhlIHNrX2J1ZmYtPmRhdGEsIHdpbGwgY2hhbmdlZCBkZXBlbmRzIG9uIGhhbmxkaW5nIHByb2dyZXNzcyAqLworCXUzMiBTcmNCdWZMZW47CQkvKiBMZW5ndGggb2YgcGFja2V0IHBheWxvYWQgd2hpY2ggbm90IGluY2x1ZGluZyBMYXllciAyIGhlYWRlciAqLworCXU4ICpwRXh0cmFMbGNTbmFwRW5jYXA7CS8qIE5VTEwgbWVhbnMgbm8gZXh0cmEgTExDL1NOQVAgaXMgcmVxdWlyZWQgKi8KKwl1OCBIZWFkZXJCdWZbMTI4XTsJLyogVGVtcEJ1ZmZlciBmb3IgVFhfSU5GTyArIFRYX1dJICsgODAyLjExIEhlYWRlciArIHBhZGRpbmcgKyBBTVNEVSBTdWJIZWFkZXIgKyBMTEMvU05BUCAqLworCS8qUlQyODcwIDIuMS4wLjAgdXNlcyBvbmx5IDgwIGJ5dGVzICovCisJLypSVDMwNzAgMi4xLjEuMCB1c2VzIG9ubHkgOTYgYnl0ZXMgKi8KKwkvKlJUMzA5MCAyLjEuMC4wIHVzZXMgb25seSA5NiBieXRlcyAqLworCXU4IE1wZHVIZWFkZXJMZW47CS8qIDgwMi4xMSBoZWFkZXIgbGVuZ3RoIE5PVCBpbmNsdWRpbmcgdGhlIHBhZGRpbmcgKi8KKwl1OCBIZHJQYWRMZW47CS8qIHJlY29yZGluZyBIZWFkZXIgUGFkZGluZyBMZW5ndGg7ICovCisJdTggYXBpZHg7CQkvKiBUaGUgaW50ZXJmYWNlIGFzc29jaWF0ZWQgdG8gdGhpcyBwYWNrZXQgKi8KKwl1OCBXY2lkOwkJLyogVGhlIE1BQyBlbnRyeSBhc3NvY2lhdGVkIHRvIHRoaXMgcGFja2V0ICovCisJdTggVXNlclByaW9yaXR5OwkvKiBwcmlvcml0eSBjbGFzcyBvZiBwYWNrZXQgKi8KKwl1OCBGcmFtZUdhcDsJCS8qIHdoYXQga2luZCBvZiBJRlMgdGhpcyBwYWNrZXQgdXNlICovCisJdTggTXBkdVJlcU51bTsJLyogbnVtYmVyIG9mIGZyYWdtZW50cyBvZiB0aGlzIGZyYW1lICovCisJdTggVHhSYXRlOwkJLyogVE9ETzogT2Jzb2xldGVkPyBTaG91bGQgY2hhbmdlIHRvIE1DUz8gKi8KKwl1OCBDaXBoZXJBbGc7CS8qIGNpcGhlciBhbG9ncml0aG0gKi8KKwlzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcEtleTsKIAotCS8vIEZvbGxvd2luZyBzdHJ1Y3R1cmUgdXNlZCBmb3IgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBhIHNwZWNpZmljIHBhY2tldC4KLQlQTkRJU19QQUNLRVQJCXBQYWNrZXQ7Ci0JUFVDSEFSCQkJCXBTcmNCdWZIZWFkZXI7CQkJCS8vIFJlZmVyZW5jZSB0byB0aGUgaGVhZCBvZiBza19idWZmLT5kYXRhCi0JUFVDSEFSCQkJCXBTcmNCdWZEYXRhOwkJCQkvLyBSZWZlcmVuY2UgdG8gdGhlIHNrX2J1ZmYtPmRhdGEsIHdpbGwgY2hhbmdlZCBkZXBlbmRzIG9uIGhhbmxkaW5nIHByb2dyZXNzcwotCVVJTlQJCQkJU3JjQnVmTGVuOwkJCQkJLy8gTGVuZ3RoIG9mIHBhY2tldCBwYXlsb2FkIHdoaWNoIG5vdCBpbmNsdWRpbmcgTGF5ZXIgMiBoZWFkZXIKLQlQVUNIQVIJCQkJcEV4dHJhTGxjU25hcEVuY2FwOwkJCS8vIE5VTEwgbWVhbnMgbm8gZXh0cmEgTExDL1NOQVAgaXMgcmVxdWlyZWQKLQlVQ0hBUgkJCQlIZWFkZXJCdWZbODBdOwkJCQkvLyBUZW1wQnVmZmVyIGZvciBUWF9JTkZPICsgVFhfV0kgKyA4MDIuMTEgSGVhZGVyICsgcGFkZGluZyArIEFNU0RVIFN1YkhlYWRlciArIExMQy9TTkFQCi0JVUNIQVIJCQkJTXBkdUhlYWRlckxlbjsJCQkJLy8gODAyLjExIGhlYWRlciBsZW5ndGggTk9UIGluY2x1ZGluZyB0aGUgcGFkZGluZwotCVVDSEFSCQkJCUhkclBhZExlbjsJCQkJCS8vIHJlY29yZGluZyBIZWFkZXIgUGFkZGluZyBMZW5ndGg7Ci0JVUNIQVIJCQkJYXBpZHg7CQkJCQkJLy8gVGhlIGludGVyZmFjZSBhc3NvY2lhdGVkIHRvIHRoaXMgcGFja2V0Ci0JVUNIQVIJCQkJV2NpZDsJCQkJCQkvLyBUaGUgTUFDIGVudHJ5IGFzc29jaWF0ZWQgdG8gdGhpcyBwYWNrZXQKLQlVQ0hBUgkJCQlVc2VyUHJpb3JpdHk7CQkJCS8vIHByaW9yaXR5IGNsYXNzIG9mIHBhY2tldAotCVVDSEFSCQkJCUZyYW1lR2FwOwkJCQkJLy8gd2hhdCBraW5kIG9mIElGUyB0aGlzIHBhY2tldCB1c2UKLQlVQ0hBUgkJCQlNcGR1UmVxTnVtOwkJCQkJLy8gbnVtYmVyIG9mIGZyYWdtZW50cyBvZiB0aGlzIGZyYW1lCi0JVUNIQVIJCQkJVHhSYXRlOwkJCQkJCS8vIFRPRE86IE9ic29sZXRlZD8gU2hvdWxkIGNoYW5nZSB0byBNQ1M/Ci0JVUNIQVIJCQkJQ2lwaGVyQWxnOwkJCQkJLy8gY2lwaGVyIGFsb2dyaXRobQotCVBDSVBIRVJfS0VZCQkJcEtleTsKKwl1MTYgRmxhZ3M7CQkvKlNlZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZm9yIGRldGFpbC4gKi8KIAorCS8qWU9VIFNIT1VMRCBOT1QgVE9VQ0ggSVQhIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB1c2VkIGZvciBoYXJkd2FyZS1kZXBlbmRlZCBsYXllci4gKi8KKwl1bnNpZ25lZCBsb25nIFByaXY7CQkvKiBIYXJkd2FyZSBzcGVjaWZpYyB2YWx1ZSBzYXZlZCBpbiBoZXJlLiAqLworfTsKIAotCi0JVVNIT1JUCQkJCUZsYWdzOwkJCQkJCS8vU2VlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBmb3IgZGV0YWlsLgotCi0JLy9ZT1UgU0hPVUxEIE5PVCBUT1VDSCBJVCEgRm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHVzZWQgZm9yIGhhcmR3YXJlLWRlcGVuZGVkIGxheWVyLgotCVVMT05HCQkJCVByaXY7CQkJCQkJLy8gSGFyZHdhcmUgc3BlY2lmaWMgdmFsdWUgc2F2ZWQgaW4gaGVyZS4KLX0gVFhfQkxLLCAqUFRYX0JMSzsKLQotCi0jZGVmaW5lIGZUWF9iUnRzUmVxdWlyZWQJCTB4MDAwMQkvLyBJbmRpY2F0ZSBpZiBuZWVkIHNlbmQgUlRTIGZyYW1lIGZvciBwcm90ZWN0aW9uLiBOb3QgdXNlZCBpbiBSVDI4NjAvUlQyODcwLgotI2RlZmluZSBmVFhfYkFja1JlcXVpcmVkICAgICAgIAkweDAwMDIJLy8gdGhlIHBhY2tldCBuZWVkIGFjayByZXNwb25zZQotI2RlZmluZSBmVFhfYlBpZ2d5QmFjayAgICAgCQkweDAwMDQJLy8gTGVnYWN5IGRldmljZSB1c2UgUGlnZ2JhY2sgb3Igbm90Ci0jZGVmaW5lIGZUWF9iSFRSYXRlICAgICAgICAgCTB4MDAwOAkvLyBhbGxvdyB0byB1c2UgSFQgcmF0ZQotI2RlZmluZSBmVFhfYkZvcmNlTm9uUW9TICAgICAgIAkweDAwMTAJLy8gZm9yY2UgdG8gdHJhbnNtaXQgZnJhbWUgd2l0aG91dCBXTU0tUW9TIGluIEhUIG1vZGUKLSNkZWZpbmUgZlRYX2JBbGxvd0ZyYWcgICAgICAgCTB4MDAyMAkvLyBhbGxvdyB0byBmcmFnbWVudCB0aGUgcGFja2V0LCBBLU1QRFUsIEEtTVNEVSwgQS1SYWxpbmsgaXMgbm90IGFsbG93ZWQgdG8gZnJhZ21lbnQKLSNkZWZpbmUgZlRYX2JNb3JlRGF0YQkJCTB4MDA0MAkvLyB0aGVyZSBhcmUgbW9yZSBkYXRhIHBhY2tldHMgaW4gUG93ZXJTYXZlIFF1ZXVlCi0jZGVmaW5lIGZUWF9iV01NCQkJCTB4MDA4MAkvLyBRT1MgRGF0YQotCisjZGVmaW5lIGZUWF9iUnRzUmVxdWlyZWQJCTB4MDAwMQkvKiBJbmRpY2F0ZSBpZiBuZWVkIHNlbmQgUlRTIGZyYW1lIGZvciBwcm90ZWN0aW9uLiBOb3QgdXNlZCBpbiBSVDI4NjAvUlQyODcwLiAqLworI2RlZmluZSBmVFhfYkFja1JlcXVpcmVkICAgICAgIAkweDAwMDIJLyogdGhlIHBhY2tldCBuZWVkIGFjayByZXNwb25zZSAqLworI2RlZmluZSBmVFhfYlBpZ2d5QmFjayAgICAgCQkweDAwMDQJLyogTGVnYWN5IGRldmljZSB1c2UgUGlnZ2JhY2sgb3Igbm90ICovCisjZGVmaW5lIGZUWF9iSFRSYXRlICAgICAgICAgCTB4MDAwOAkvKiBhbGxvdyB0byB1c2UgSFQgcmF0ZSAqLworI2RlZmluZSBmVFhfYkZvcmNlTm9uUW9TICAgICAgIAkweDAwMTAJLyogZm9yY2UgdG8gdHJhbnNtaXQgZnJhbWUgd2l0aG91dCBXTU0tUW9TIGluIEhUIG1vZGUgKi8KKyNkZWZpbmUgZlRYX2JBbGxvd0ZyYWcgICAgICAgCTB4MDAyMAkvKiBhbGxvdyB0byBmcmFnbWVudCB0aGUgcGFja2V0LCBBLU1QRFUsIEEtTVNEVSwgQS1SYWxpbmsgaXMgbm90IGFsbG93ZWQgdG8gZnJhZ21lbnQgKi8KKyNkZWZpbmUgZlRYX2JNb3JlRGF0YQkJCTB4MDA0MAkvKiB0aGVyZSBhcmUgbW9yZSBkYXRhIHBhY2tldHMgaW4gUG93ZXJTYXZlIFF1ZXVlICovCisjZGVmaW5lIGZUWF9iV01NCQkJCTB4MDA4MAkvKiBRT1MgRGF0YSAqLwogI2RlZmluZSBmVFhfYkNsZWFyRUFQRnJhbWUJCTB4MDEwMAogCi0jZGVmaW5lIFRYX0JMS19BU1NJR05fRkxBRyhfcFR4QmxrLCBfZmxhZywgdmFsdWUpCVwKLQkJZG8gewkJCQkJCQkJCQlcCi0JCQlpZiAodmFsdWUpIAkJCQkJCQkJXAotCQkJCShfcFR4QmxrLT5GbGFncyB8PSBfZmxhZykgCQkJXAotCQkJZWxzZSAJCQkJCQkJCQlcCi0JCQkJKF9wVHhCbGstPkZsYWdzICY9IH4oX2ZsYWcpKQkJXAotCQl9d2hpbGUoMCkKLQogI2RlZmluZSBUWF9CTEtfU0VUX0ZMQUcoX3BUeEJsaywgX2ZsYWcpCQkoX3BUeEJsay0+RmxhZ3MgfD0gX2ZsYWcpCiAjZGVmaW5lIFRYX0JMS19URVNUX0ZMQUcoX3BUeEJsaywgX2ZsYWcpCSgoKF9wVHhCbGstPkZsYWdzICYgX2ZsYWcpID09IF9mbGFnKSA/IDEgOiAwKQogI2RlZmluZSBUWF9CTEtfQ0xFQVJfRkxBRyhfcFR4QmxrLCBfZmxhZykJKF9wVHhCbGstPkZsYWdzICY9IH4oX2ZsYWcpKQogCi0KLQotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZmRlZiBSVDI4NjAKLS8vCi0vLyBFbmFibGUgJiBEaXNhYmxlIE5JQyBpbnRlcnJ1cHQgdmlhIHdyaXRpbmcgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIKLS8vIFNpbmNlIGl0IHVzZSBBREFQVEVSIHN0cnVjdHVyZSwgaXQgaGF2ZSB0byBiZSBwdXQgYWZ0ZXIgc3RydWN0dXJlIGRlZmluaXRpb24uCi0vLwotX19pbmxpbmUgICAgVk9JRCAgICBOSUNEaXNhYmxlSW50ZXJydXB0KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKQotewotCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgMHgwKTsgICAgIC8vIDA6IGRpc2FibGUKLQkvL1JUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9JTlRfRU5BLCAweDApOwkgCS8vIDB4NDE4IGlzIGZvciBmaXJtd2FyZSAuIFNXIGRvZXNuJ3QgaGFuZGxlIGhlcmUuCi0JUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFKTsKLX0KLQotX19pbmxpbmUgICAgVk9JRCAgICBOSUNFbmFibGVJbnRlcnJ1cHQoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCi17Ci0JLy8KLQkvLyBGbGFnICJmT1BfU1RBVFVTX0RPWkUiIE9uLCBtZWFucyBBU0lDIHB1dCB0byBzbGVlcCwgZWxzZSBtZWFucyBBU0lDIFdha2VVcAotCS8vIFRvIHByZXZlbnQgU3lzdGVtIGhhbmcsIHdlIHNob3VsZCBlbmFsYmUgdGhlIGludGVycnVwdCB3aGVuCi0JLy8gQVNJQyBpcyBhbHJlYWR5IFdha2UgVXAuCi0JLy8KLSAgICAvLyBSVDI2NjEgPT4gd2hlbiBBU0lDIGlzIHNsZWVwaW5nLCBNQUMgcmVnaXN0ZXIgY2Fubm90IGJlIHJlYWQgYW5kIHdyaXR0ZW4uCi0JLy8gUlQyODYwID0+IHdoZW4gQVNJQyBpcyBzbGVlcGluZywgTUFDIHJlZ2lzdGVyIGNhbiBiZSByZWFkIGFuZCB3cml0dGVuLgotCS8vaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotCXsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCBwQWQtPmludF9lbmFibGVfcmVnIC8qREVMQVlJTlRNQVNLKi8pOyAgICAgLy8gMTplbmFibGUKLQl9Ci0JLy9lbHNlCi0JLy8JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZk9QX1NUQVRVU19ET1pFICFcbiIpKTsKLQotCS8vUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX0lOVF9FTkEsIDB4MDAwMDAwMzApOyAvLyAxIDogZW5hYmxlCi0JUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgVk9JRCBDb252ZXJ0TXVsdGljYXN0SVAyTUFDKAotCUlOIFBVQ0hBUiBwSXBBZGRyLAotCUlOIFBVQ0hBUiAqcHBNYWNBZGRyLAotCUlOIFVJTlQxNiBQcm90b1R5cGUpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoJT3RoZXIgc3RhdGljIGlubGluZSBmdW5jdGlvbiBkZWZpbml0aW9ucworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBDb252ZXJ0TXVsdGljYXN0SVAyTUFDKHU4ICpwSXBBZGRyLAorCQkJCQkgIHU4ICoqIHBwTWFjQWRkciwKKwkJCQkJICB1MTYgUHJvdG9UeXBlKQogewogCWlmIChwSXBBZGRyID09IE5VTEwpCiAJCXJldHVybjsKQEAgLTMxMzUsMjQxNCArMjI3NiwxNDUwIEBACiAJaWYgKHBwTWFjQWRkciA9PSBOVUxMIHx8ICpwcE1hY0FkZHIgPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0Jc3dpdGNoIChQcm90b1R5cGUpCi0JewotCQljYXNlIEVUSF9QX0lQVjY6Ci0vLwkJCW1lbXNldCgqcHBNYWNBZGRyLCAwLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOwotCQkJKigqcHBNYWNBZGRyKSA9IDB4MzM7Ci0JCQkqKCpwcE1hY0FkZHIgKyAxKSA9IDB4MzM7Ci0JCQkqKCpwcE1hY0FkZHIgKyAyKSA9IHBJcEFkZHJbMTJdOwotCQkJKigqcHBNYWNBZGRyICsgMykgPSBwSXBBZGRyWzEzXTsKLQkJCSooKnBwTWFjQWRkciArIDQpID0gcElwQWRkclsxNF07Ci0JCQkqKCpwcE1hY0FkZHIgKyA1KSA9IHBJcEFkZHJbMTVdOwotCQkJYnJlYWs7CisJc3dpdGNoIChQcm90b1R5cGUpIHsKKwljYXNlIEVUSF9QX0lQVjY6CisvKiAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKnBwTWFjQWRkciwgMCwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsgKi8KKwkJKigqcHBNYWNBZGRyKSA9IDB4MzM7CisJCSooKnBwTWFjQWRkciArIDEpID0gMHgzMzsKKwkJKigqcHBNYWNBZGRyICsgMikgPSBwSXBBZGRyWzEyXTsKKwkJKigqcHBNYWNBZGRyICsgMykgPSBwSXBBZGRyWzEzXTsKKwkJKigqcHBNYWNBZGRyICsgNCkgPSBwSXBBZGRyWzE0XTsKKwkJKigqcHBNYWNBZGRyICsgNSkgPSBwSXBBZGRyWzE1XTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBFVEhfUF9JUDoKLQkJZGVmYXVsdDoKLS8vCQkJbWVtc2V0KCpwcE1hY0FkZHIsIDAsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7Ci0JCQkqKCpwcE1hY0FkZHIpID0gMHgwMTsKLQkJCSooKnBwTWFjQWRkciArIDEpID0gMHgwMDsKLQkJCSooKnBwTWFjQWRkciArIDIpID0gMHg1ZTsKLQkJCSooKnBwTWFjQWRkciArIDMpID0gcElwQWRkclsxXSAmIDB4N2Y7Ci0JCQkqKCpwcE1hY0FkZHIgKyA0KSA9IHBJcEFkZHJbMl07Ci0JCQkqKCpwcE1hY0FkZHIgKyA1KSA9IHBJcEFkZHJbM107Ci0JCQlicmVhazsKKwljYXNlIEVUSF9QX0lQOgorCWRlZmF1bHQ6CisvKiAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKnBwTWFjQWRkciwgMCwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsgKi8KKwkJKigqcHBNYWNBZGRyKSA9IDB4MDE7CisJCSooKnBwTWFjQWRkciArIDEpID0gMHgwMDsKKwkJKigqcHBNYWNBZGRyICsgMikgPSAweDVlOworCQkqKCpwcE1hY0FkZHIgKyAzKSA9IHBJcEFkZHJbMV0gJiAweDdmOworCQkqKCpwcE1hY0FkZHIgKyA0KSA9IHBJcEFkZHJbMl07CisJCSooKnBwTWFjQWRkciArIDUpID0gcElwQWRkclszXTsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuOwogfQotI2VuZGlmIC8qIFJUMjg2MCAqLwogCi0vLwotLy8gIFByaXZhdGUgcm91dGluZXMgaW4gcnRtcF9pbml0LmMKLS8vCi1ORElTX1NUQVRVUyBSVE1QQWxsb2NBZGFwdGVyQmxvY2soCi0JSU4gUFZPSUQJCQloYW5kbGUsCi0JT1VUIFBSVE1QX0FEQVBURVIgICAqcHBBZGFwdGVyCi0JKTsKK2NoYXIgKkdldFBoeU1vZGUoaW50IE1vZGUpOworY2hhciAqR2V0QlcoaW50IEJXKTsKIAotTkRJU19TVEFUVVMgUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQKLQkpOworLyogKi8KKy8qICBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfaW5pdC5jICovCisvKiAqLworaW50IFJUTVBBbGxvY0FkYXB0ZXJCbG9jayh2b2lkICpoYW5kbGUsCisJCQkJICBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICogKiBwcEFkYXB0ZXIpOwogCi1ORElTX1NUQVRVUwlSVE1QUmVhZFBhcmFtZXRlcnNIb29rKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkCi0JKTsKK2ludCBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJUTVBGcmVlQWRhcHRlcigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZAotCSk7Cit2b2lkIFJUTVBGcmVlQWRhcHRlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1ORElTX1NUQVRVUyBOSUNSZWFkUmVnUGFyYW1ldGVycygKLQlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCi0JSU4gIE5ESVNfSEFORExFICAgICAgICAgV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0Ci0JKTsKK2ludCBOSUNSZWFkUmVnUGFyYW1ldGVycyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHZvaWQgKldyYXBwZXJDb25maWd1cmF0aW9uQ29udGV4dCk7CiAKLSNpZmRlZiBSVDI4NzAKLVZPSUQgTklDSW5pdFJUMzB4eFJGUmVnaXN0ZXJzKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNpZmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKK3ZvaWQgTklDSW5pdFJGUmVnaXN0ZXJzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAotCUlOCVBVQ0hBUgkJCQltYWNfYWRkcik7Cit2b2lkIFJ0bXBDaGlwT3BzUkZIb29rKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgTklDSW5pdEFzaWNGcm9tRUVQUk9NKAotCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCk7CitpbnQgUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgIHU4IHJlZ0lELCB1OCB2YWx1ZSk7CiAKLVZPSUQgTklDSW5pdFR4UnhSaW5nQW5kQmFja2xvZ1F1ZXVlKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK2ludCBSVDMweHhSZWFkUkZSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHU4IHJlZ0lELCB1OCAqcFZhbHVlKTsKKyNlbmRpZiAvKiBSVE1QX1JGX1JXX1NVUFBPUlQgLy8gKi8KIAotTkRJU19TVEFUVVMgTklDSW5pdGlhbGl6ZUFkYXB0ZXIoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gICBCT09MRUFOICAgIGJIYXJkUmVzZXQpOwordm9pZCBOSUNSZWFkRUVQUk9NUGFyYW1ldGVycyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICptYWNfYWRkcik7CiAKLU5ESVNfU1RBVFVTIE5JQ0luaXRpYWxpemVBc2ljKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBCT09MRUFOCQliSGFyZFJlc2V0KTsKLSNpZmRlZiBSVDI4NjAKLVZPSUQgTklDUmVzdG9yZUJCUFZhbHVlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLSNlbmRpZgotVk9JRCBOSUNJc3N1ZVJlc2V0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgTklDSW5pdEFzaWNGcm9tRUVQUk9NKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUlRNUFJpbmdDbGVhblVwKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiAgICAgICAgICAgUmluZ1R5cGUpOworaW50IE5JQ0luaXRpYWxpemVBZGFwdGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gQk9PTEVBTiBiSGFyZFJlc2V0KTsKIAotVk9JRCBVc2VyQ2ZnSW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CitpbnQgTklDSW5pdGlhbGl6ZUFzaWMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJIYXJkUmVzZXQpOwogCi1WT0lEIE5JQ1Jlc2V0RnJvbUVycm9yKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgTklDSXNzdWVSZXNldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIE5JQ0VyYXNlRmlybXdhcmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBSVE1QUmluZ0NsZWFuVXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBSaW5nVHlwZSk7CiAKLU5ESVNfU1RBVFVTIE5JQ0xvYWRGaXJtd2FyZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIFVzZXJDZmdJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLU5ESVNfU1RBVFVTIE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgTklDUmVzZXRGcm9tRXJyb3Ioc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotQk9PTEVBTiBOSUNDaGVja0ZvckhhbmcoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworaW50IE5JQ0xvYWRGaXJtd2FyZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIE5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIE5JQ0VyYXNlRmlybXdhcmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBOSUNVcGRhdGVSYXdDb3VudGVycygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CitpbnQgTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVUxPTkcJUlRNUE5vdEFsbFplcm8oCi0JSU4JUFZPSUQJcFNyYzEsCi0JSU4JVUxPTkcJTGVuZ3RoKTsKK0JPT0xFQU4gTklDQ2hlY2tGb3JIYW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUlRNUFplcm9NZW1vcnkoCi0JSU4gIFBWT0lEICAgcFNyYywKLQlJTiAgVUxPTkcgICBMZW5ndGgpOwordm9pZCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVUxPTkcgUlRNUENvbXBhcmVNZW1vcnkoCi0JSU4gIFBWT0lEICAgcFNyYzEsCi0JSU4gIFBWT0lEICAgcFNyYzIsCi0JSU4gIFVMT05HICAgTGVuZ3RoKTsKK3ZvaWQgTklDVXBkYXRlUmF3Q291bnRlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSVE1QTW92ZU1lbW9yeSgKLQlPVVQgUFZPSUQgICBwRGVzdCwKLQlJTiAgUFZPSUQgICBwU3JjLAotCUlOICBVTE9ORyAgIExlbmd0aCk7Cit2b2lkIFJUTVBaZXJvTWVtb3J5KHZvaWQgKnBTcmMsIHVuc2lnbmVkIGxvbmcgTGVuZ3RoKTsKIAotVk9JRCBBdG9IKAotCWNoYXIJKnNyYywKLQlVQ0hBUgkqZGVzdCwKLQlpbnQJCWRlc3RsZW4pOwordW5zaWduZWQgbG9uZyBSVE1QQ29tcGFyZU1lbW9yeSh2b2lkICpwU3JjMSwgdm9pZCAqcFNyYzIsIHVuc2lnbmVkIGxvbmcgTGVuZ3RoKTsKIAotVUNIQVIgQnRvSCgKLQljaGFyIGNoKTsKK3ZvaWQgUlRNUE1vdmVNZW1vcnkodm9pZCAqcERlc3QsIHZvaWQgKnBTcmMsIHVuc2lnbmVkIGxvbmcgTGVuZ3RoKTsKIAotVk9JRCBSVE1QUGF0Y2hNYWNCYnBCdWcoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBBdG9IKGNoYXIgKnNyYywgdTggKmRlc3QsIGludCBkZXN0bGVuKTsKIAotVk9JRCBSVE1QSW5pdFRpbWVyKAotCUlOICBQUlRNUF9BREFQVEVSICAgICAgICAgICBwQWQsCi0JSU4gIFBSQUxJTktfVElNRVJfU1RSVUNUICAgIHBUaW1lciwKLQlJTiAgUFZPSUQgICAgICAgICAgICAgICAgICAgcFRpbWVyRnVuYywKLQlJTglQVk9JRAkJCQkJcERhdGEsCi0JSU4gIEJPT0xFQU4gICAgICAgICAgICAgICAgIFJlcGVhdCk7Cit1OCBCdG9IKGNoYXIgY2gpOwogCi1WT0lEIFJUTVBTZXRUaW1lcigKLQlJTiAgUFJBTElOS19USU1FUl9TVFJVQ1QgICAgcFRpbWVyLAotCUlOICBVTE9ORyAgICAgICAgICAgICAgICAgICBWYWx1ZSk7Cit2b2lkIFJUTVBQYXRjaE1hY0JicEJ1ZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCit2b2lkIFJUTVBJbml0VGltZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICBzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyICpwVGltZXIsCisJCSAgIHZvaWQgKnBUaW1lckZ1bmMsIHZvaWQgKnBEYXRhLCBJTiBCT09MRUFOIFJlcGVhdCk7CiAKLVZPSUQgUlRNUE1vZFRpbWVyKAotCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKLQlJTglVTE9ORwkJCQkJVmFsdWUpOwordm9pZCBSVE1QU2V0VGltZXIoc3RydWN0IHJ0X3JhbGlua190aW1lciAqcFRpbWVyLCB1bnNpZ25lZCBsb25nIFZhbHVlKTsKIAotVk9JRCBSVE1QQ2FuY2VsVGltZXIoCi0JSU4gIFBSQUxJTktfVElNRVJfU1RSVUNUICAgIHBUaW1lciwKLQlPVVQgQk9PTEVBTiAgICAgICAgICAgICAgICAgKnBDYW5jZWxsZWQpOwordm9pZCBSVE1QTW9kVGltZXIoc3RydWN0IHJ0X3JhbGlua190aW1lciAqcFRpbWVyLCB1bnNpZ25lZCBsb25nIFZhbHVlKTsKIAotVk9JRCBSVE1QU2V0TEVEKAotCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKLQlJTiBVQ0hBUgkJCVN0YXR1cyk7Cit2b2lkIFJUTVBDYW5jZWxUaW1lcihzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyICpwVGltZXIsIE9VVCBCT09MRUFOICogcENhbmNlbGxlZCk7CiAKLVZPSUQgUlRNUFNldFNpZ25hbExFRCgKLQlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCi0JSU4gTkRJU184MDJfMTFfUlNTSSBEYm0pOwordm9pZCBSVE1QU2V0TEVEKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggU3RhdHVzKTsKIAotVk9JRCBSVE1QRW5hYmxlUnhUeCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Cit2b2lkIFJUTVBTZXRTaWduYWxMRUQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBORElTXzgwMl8xMV9SU1NJIERibSk7CiAKLS8vCi0vLyBwcm90b3R5cGUgaW4gYWN0aW9uLmMKLS8vCi1WT0lEIEFjdGlvblN0YXRlTWFjaGluZUluaXQoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gICAgSU4gIFNUQVRFX01BQ0hJTkUgKlMsCi0gICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKK3ZvaWQgUlRNUEVuYWJsZVJ4VHgoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBNbG1lQUREQkFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKy8qICovCisvKiBwcm90b3R5cGUgaW4gYWN0aW9uLmMgKi8KKy8qICovCit2b2lkIEFjdGlvblN0YXRlTWFjaGluZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTLAorCQkJICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CiAKLVZPSUQgTWxtZURFTEJBQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIE1sbWVBRERCQUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIE1sbWVETFNBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgTWxtZURFTEJBQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgTWxtZUludmFsaWRBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgTWxtZURMU0FjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIE1sbWVRT1NBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgTWxtZUludmFsaWRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBQZWVyQWRkQkFSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgTWxtZVFPU0FjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFBlZXJBZGRCQVJzcEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBQZWVyQWRkQkFSZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBQZWVyRGVsQkFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUGVlckFkZEJBUnNwQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgUGVlckJBQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFBlZXJEZWxCQUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFNlbmRQU01QQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJV2NpZCwKLQlJTiBVQ0hBUgkJCVBzbXApOwordm9pZCBQZWVyQkFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBQZWVyUk1BY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgU2VuZFBTTVBBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBXY2lkLCB1OCBQc21wKTsKIAotVk9JRCBQZWVyUHVibGljQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFBlZXJSTUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFBlZXJIVEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBQZWVyUHVibGljQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgUGVlclFPU0FjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBQZWVySFRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBSRUNCQVRpbWVyVGltZW91dCgKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwordm9pZCBQZWVyUU9TQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgT1JJQkFUaW1lclRpbWVvdXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwordm9pZCBSRUNCQVRpbWVyVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSAgICAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CiAKLVZPSUQgU2VuZFJlZnJlc2hCQVIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnkpOwordm9pZCBPUklCQVRpbWVyVGltZW91dChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIEFjdEhlYWRlckluaXQoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gICAgSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKLSAgICBJTiBQVUNIQVIgQWRkcjEsCi0gICAgSU4gUFVDSEFSIEFkZHIyLAotICAgIElOIFBVQ0hBUiBBZGRyMyk7Cit2b2lkIFNlbmRSZWZyZXNoQkFSKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5KTsKIAotVk9JRCBCYXJIZWFkZXJJbml0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE9VVCBQRlJBTUVfQkFSIHBDbnRsQmFyLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gUFVDSEFSIHBTQSk7Cit2b2lkIEFjdEhlYWRlckluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICBzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZHI4MDIxMSwKKwkJICAgdTggKkFkZHIxLCB1OCAqQWRkcjIsIHU4ICpBZGRyMyk7CiAKLVZPSUQgSW5zZXJ0QWN0RmllbGQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4sCi0JSU4gVUlOVDggQ2F0ZWdvcnksCi0JSU4gVUlOVDggQWN0Q29kZSk7Cit2b2lkIEJhckhlYWRlckluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICBzdHJ1Y3QgcnRfZnJhbWVfYmFyICogcENudGxCYXIsIHU4ICpwREEsIHU4ICpwU0EpOwogCi1CT09MRUFOIENudGxFbnF1ZXVlRm9yUmVjdigKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVTE9ORyBXY2lkLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLQlJTiBQRlJBTUVfQkFfUkVRIHBNc2cpOwordm9pZCBJbnNlcnRBY3RGaWVsZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICB1OCAqcEZyYW1lQnVmLAorCQkgICAgdW5zaWduZWQgbG9uZyAqcEZyYW1lTGVuLCB1OCBDYXRlZ29yeSwgdTggQWN0Q29kZSk7CiAKLS8vCi0vLyBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfZGF0YS5jCi0vLwotQk9PTEVBTiBSVE1QSGFuZGxlUnhEb25lSW50ZXJydXB0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK0JPT0xFQU4gQ250bEVucXVldWVGb3JSZWN2KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgV2NpZCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLCBzdHJ1Y3QgcnRfZnJhbWVfYmFfcmVxICogcE1zZyk7CiAKLUJPT0xFQU4gUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIElOVF9TT1VSQ0VfQ1NSX1NUUlVDIFR4UmluZ0JpdG1hcCk7CisvKiAqLworLyogUHJpdmF0ZSByb3V0aW5lcyBpbiBydG1wX2RhdGEuYyAqLworLyogKi8KK0JPT0xFQU4gUlRNUEhhbmRsZVJ4RG9uZUludGVycnVwdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJUTVBIYW5kbGVNZ210UmluZ0RtYURvbmVJbnRlcnJ1cHQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworQk9PTEVBTiBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSBJTlRfU09VUkNFX0NTUl9TVFJVQyBUeFJpbmdCaXRtYXApOwogCi1WT0lEIFJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgUlRNUEhhbmRsZU1nbXRSaW5nRG1hRG9uZUludGVycnVwdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJUTVBIYW5kbGVQcmVUQlRUSW50ZXJydXB0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgUlRNUEhhbmRsZVRCVFRJbnRlcnJ1cHQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotdm9pZCBSVE1QSGFuZGxlVHdha2V1cEludGVycnVwdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIFJUTVBIYW5kbGVQcmVUQlRUSW50ZXJydXB0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwordm9pZCBSVE1QSGFuZGxlVHdha2V1cEludGVycnVwdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1CT09MRUFOIFR4RnJhbWVJc0FnZ3JlZ2F0aWJsZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBQcmV2QWRkcjEsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwODAyM2hkcik7Cit2b2lkIFJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLUJPT0xFQU4gUGVlcklzQWdncmVPbigKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgVUxPTkcgICAgICAgICAgVHhSYXRlLAotICAgIElOICBQTUFDX1RBQkxFX0VOVFJZIHBNYWNFbnRyeSk7CitCT09MRUFOIFR4RnJhbWVJc0FnZ3JlZ2F0aWJsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICB1OCAqcFByZXZBZGRyMSwgdTggKnA4MDIzaGRyKTsKIAotTkRJU19TVEFUVVMgU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcigKLQlJTiAgUE5ESVNfQlVGRkVSICAgIHBGaXJzdEJ1ZmZlciwKLQlJTiAgVUNIQVIgICAgICAgICAgIERlc2lyZWRPZmZzZXQsCi0JT1VUIFBVQ0hBUiAgICAgICAgICBwQnl0ZTAsCi0JT1VUIFBVQ0hBUiAgICAgICAgICBwQnl0ZTEpOworQk9PTEVBTiBQZWVySXNBZ2dyZU9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBUeFJhdGUsIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBNYWNFbnRyeSk7CiAKLU5ESVNfU1RBVFVTIFNUQVNlbmRQYWNrZXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKK2ludCBTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKGNoYXIgKnBGaXJzdEJ1ZmZlciwKKwkJCQkgICAgICB1OCBEZXNpcmVkT2Zmc2V0LAorCQkJCSAgICAgIHU4ICpwQnl0ZTAsIHU4ICpwQnl0ZTEpOwogCi1WT0lEIFNUQVNlbmRQYWNrZXRzKAotCUlOICBORElTX0hBTkRMRSAgICAgTWluaXBvcnRBZGFwdGVyQ29udGV4dCwKLQlJTiAgUFBORElTX1BBQ0tFVCAgIHBwUGFja2V0QXJyYXksCi0JSU4gIFVJTlQgICAgICAgICAgICBOdW1iZXJPZlBhY2tldHMpOworaW50IFNUQVNlbmRQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICpwUGFja2V0KTsKIAotVk9JRCBSVE1QRGVRdWV1ZVBhY2tldCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgIAlJTglCT09MRUFOCQkJYkludENvbnRleHQsCi0JSU4gIFVDSEFSCQkJUXVlSWR4LAotCUlOCVVDSEFSCQkJTWF4X1R4X1BhY2tldHMpOwordm9pZCBTVEFTZW5kUGFja2V0cyh2b2lkICpNaW5pcG9ydEFkYXB0ZXJDb250ZXh0LAorCQkgICAgdm9pZCAqKnBwUGFja2V0QXJyYXksIHUzMiBOdW1iZXJPZlBhY2tldHMpOwogCi1ORElTX1NUQVRVUwlSVE1QSGFyZFRyYW5zbWl0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFBORElTX1BBQ0tFVAkJcFBhY2tldCwKLQlJTiAgVUNIQVIJCQlRdWVJZHgsCi0JT1VUCVBVTE9ORwkJCXBGcmVlVFhETGVmdCk7Cit2b2lkIFJUTVBEZVF1ZXVlUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIElOIEJPT0xFQU4gYkludENvbnRleHQsCisJCSAgICAgICB1OCBRdWVJZHgsIHU4IE1heF9UeF9QYWNrZXRzKTsKIAotTkRJU19TVEFUVVMJU1RBSGFyZFRyYW5zbWl0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFRYX0JMSwkJCSpwVHhCbGssCi0JSU4gIFVDSEFSCQkJUXVlSWR4KTsKK2ludCBSVE1QSGFyZFRyYW5zbWl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdm9pZCAqcFBhY2tldCwKKwkJCSAgICAgdTggUXVlSWR4LCB1bnNpZ25lZCBsb25nICpwRnJlZVRYRExlZnQpOwogCi1WT0lEIFNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CitpbnQgU1RBSGFyZFRyYW5zbWl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssIHU4IFF1ZUlkeCk7CiAKLU5ESVNfU1RBVFVTIFJUTVBGcmVlVFhEUmVxdWVzdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIgICAgICAgICAgIFJpbmdUeXBlLAotCUlOICBVQ0hBUiAgICAgICAgICAgTnVtYmVyUmVxdWlyZWQsCi0JSU4gCVBVQ0hBUiAgICAgICAgICBGcmVlTnVtYmVySXMpOwordm9pZCBTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJCSAgICAgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLCB1OCBGcm9tV2hpY2hCU1NJRCk7CiAKLU5ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSCVF1ZUlkeCwKLQlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworaW50IFJUTVBGcmVlVFhEUmVxdWVzdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdTggUmluZ1R5cGUsCisJCQkgICAgICAgdTggTnVtYmVyUmVxdWlyZWQsIHU4ICpGcmVlTnVtYmVySXMpOwogCi1ORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0TWdtdFJpbmcoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSCVF1ZUlkeCwKLQlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworaW50IE1sbWVIYXJkVHJhbnNtaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1OCBRdWVJZHgsIHZvaWQgKnBQYWNrZXQpOwogCi1ORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0VHhSaW5nKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUglRdWVJZHgsCi0JSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKK2ludCBNbG1lSGFyZFRyYW5zbWl0TWdtdFJpbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgICAgdTggUXVlSWR4LCB2b2lkICpwUGFja2V0KTsKIAotVVNIT1JUICBSVE1QQ2FsY0R1cmF0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiAgICAgICAgICAgUmF0ZSwKLQlJTiAgVUxPTkcgICAgICAgICAgIFNpemUpOworI2lmZGVmIFJUTVBfTUFDX1BDSQoraW50IE1sbWVIYXJkVHJhbnNtaXRUeFJpbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgIHU4IFF1ZUlkeCwgdm9pZCAqcFBhY2tldCk7CiAKLVZPSUQgUlRNUFdyaXRlVHhXSSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVFhXSV9TVFJVQwkJcFR4V0ksCi0JSU4gIEJPT0xFQU4gICAgCQlGUkFHLAotCUlOICBCT09MRUFOICAgIAkJQ0ZBQ0ssCi0JSU4gIEJPT0xFQU4gICAgCQlJbnNUaW1lc3RhbXAsCi0JSU4JQk9PTEVBTgkJCUFNUERVLAotCUlOCUJPT0xFQU4JCQlBY2ssCi0JSU4JQk9PTEVBTgkJCU5TZXEsCQkvLyBIVyBuZXcgYSBzZXF1ZW5jZS4KLQlJTglVQ0hBUgkJCUJBU2l6ZSwKLQlJTglVQ0hBUgkJCVdDSUQsCi0JSU4JVUxPTkcJCQlMZW5ndGgsCi0JSU4gIFVDSEFSICAgICAgCQlQSUQsCi0JSU4JVUNIQVIJCQlUSUQsCi0JSU4JVUNIQVIJCQlUeFJhdGUsCi0JSU4JVUNIQVIJCQlUeG9wbW9kZSwKLQlJTglCT09MRUFOCQkJQ2ZBY2ssCi0JSU4JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQpOworaW50IE1sbWVEYXRhSGFyZFRyYW5zbWl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgdTggUXVlSWR4LCB2b2lkICpwUGFja2V0KTsKIAordm9pZCBSVE1QV3JpdGVUeERlc2NyaXB0b3Ioc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X3R4ZCAqIHBUeEQsIElOIEJPT0xFQU4gYldJViwgdTggUVNFTCk7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKLVZPSUQgUlRNUFdyaXRlVHhXSV9EYXRhKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAotCUlOCVRYX0JMSwkJCQkqcFR4QmxrKTsKK3UxNiBSVE1QQ2FsY0R1cmF0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggUmF0ZSwgdW5zaWduZWQgbG9uZyBTaXplKTsKIAordm9pZCBSVE1QV3JpdGVUeFdJKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3R4d2kgKiBwVHhXSSwgSU4gQk9PTEVBTiBGUkFHLCBJTiBCT09MRUFOIENGQUNLLCBJTiBCT09MRUFOIEluc1RpbWVzdGFtcCwgSU4gQk9PTEVBTiBBTVBEVSwgSU4gQk9PTEVBTiBBY2ssIElOIEJPT0xFQU4gTlNlcSwJLyogSFcgbmV3IGEgc2VxdWVuY2UuICovCisJCSAgIHU4IEJBU2l6ZSwKKwkJICAgdTggV0NJRCwKKwkJICAgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCSAgIHU4IFBJRCwKKwkJICAgdTggVElELAorCQkgICB1OCBUeFJhdGUsCisJCSAgIHU4IFR4b3Btb2RlLAorCQkgICBJTiBCT09MRUFOIENmQWNrLCBJTiBIVFRSQU5TTUlUX1NFVFRJTkcgKiBwVHJhbnNtaXQpOwogCi1WT0lEIFJUTVBXcml0ZVR4V0lfQ2FjaGUoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCi0JSU4JVFhfQkxLCQkJCSpwVHhCbGspOwordm9pZCBSVE1QV3JpdGVUeFdJX0RhdGEoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X3R4d2kgKiBwVHhXSSwgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrKTsKIAotVk9JRCBSVE1QV3JpdGVUeERlc2NyaXB0b3IoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFRYRF9TVFJVQwkJcFR4RCwKLQlJTglCT09MRUFOCQkJYldJViwKLQlJTglVQ0hBUgkJCVFTRUwpOwordm9pZCBSVE1QV3JpdGVUeFdJX0NhY2hlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSBzdHJ1Y3QgcnRfdHh3aSAqIHBUeFdJLCBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspOwogCi1WT0lEIFJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIFJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotTkRJU19TVEFUVVMgTWluaXBvcnRNTVJlcXVlc3QoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JVUNIQVIJCQlRdWVJZHgsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4gIFVJTlQgICAgICAgICAgICBMZW5ndGgpOworaW50IE1pbmlwb3J0TU1SZXF1ZXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHU4IFF1ZUlkeCwgdTggKnBEYXRhLCB1MzIgTGVuZ3RoKTsKIAotVk9JRCBSVE1QU2VuZE51bGxGcmFtZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIgICAgICAgICAgIFR4UmF0ZSwKLQlJTglCT09MRUFOCQkJYlFvc051bGwpOworLyorKyttYXJrIGJ5IHNoaWFuZywgbm93IHRoaXMgZnVuY3Rpb24gbWVyZ2UgdG8gTWluaXBvcnRNTVJlcXVlc3QoKSAqLworLyotLS1tYXJrIGJ5IHNoaWFuZywgbm93IHRoaXMgZnVuY3Rpb24gbWVyZ2UgdG8gTWluaXBvcnRNTVJlcXVlc3QoKSAqLwogCi1WT0lEIFJUTVBTZW5kRGlzYXNzb2NpYXRpb25GcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Cit2b2lkIFJUTVBTZW5kTnVsbEZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHU4IFR4UmF0ZSwgSU4gQk9PTEVBTiBiUW9zTnVsbCk7CiAKLVZPSUQgUlRNUFNlbmRSVFNGcmFtZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKLQlJTgl1bnNpZ25lZCBpbnQJTmV4dE1wZHVTaXplLAotCUlOICBVQ0hBUiAgICAgICAgICAgVHhSYXRlLAotCUlOICBVQ0hBUiAgICAgICAgICAgUlRTUmF0ZSwKLQlJTiAgVVNIT1JUICAgICAgICAgIEFja0R1cmF0aW9uLAotCUlOICBVQ0hBUiAgICAgICAgICAgUXVlSWR4LAotCUlOICBVQ0hBUgkJCUZyYW1lR2FwKTsKK3ZvaWQgUlRNUFNlbmREaXNhc3NvY2lhdGlvbkZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVBRVUVVRV9IRUFERVIgICBSVE1QQ2hlY2tUeFN3UXVldWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JT1VUIFVDSEFSICAgICAgICAgICAqUXVlSWR4KTsKK3ZvaWQgUlRNUFNlbmRSVFNGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgIHU4ICpwREEsCisJCSAgICAgIElOIHVuc2lnbmVkIGludCBOZXh0TXBkdVNpemUsCisJCSAgICAgIHU4IFR4UmF0ZSwKKwkJICAgICAgdTggUlRTUmF0ZSwKKwkJICAgICAgdTE2IEFja0R1cmF0aW9uLAorCQkgICAgICB1OCBRdWVJZHgsIHU4IEZyYW1lR2FwKTsKIAotVk9JRCBSVE1QUmVwb3J0TWljRXJyb3IoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBDSVBIRVJfS0VZICAgICBwV3BhS2V5KTsKK3N0cnVjdCBydF9xdWV1ZV9oZWFkZXIgKlJUTVBDaGVja1R4U3dRdWV1ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICogUXVlSWR4KTsKIAotVk9JRAlXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBSVE1QUmVwb3J0TWljRXJyb3Ioc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcFdwYUtleSk7CiAKLVZPSUQgICAgV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MoCi0gICAgSU4gIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiAgUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOICBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Cit2b2lkIFdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1ORElTX1NUQVRVUyBSVE1QQ2xvbmVOZGlzUGFja2V0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCUJPT0xFQU4gICAgcEluc0FNU0RVSGRyLAotCUlOICBQTkRJU19QQUNLRVQgICAgcEluUGFja2V0LAotCU9VVCBQTkRJU19QQUNLRVQgICAqcHBPdXRQYWNrZXQpOwordm9pZCBXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYyh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCQkJdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkJCXZvaWQgKlN5c3RlbVNwZWNpZmljMiwKKwkJCQl2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOwogCi1ORElTX1NUQVRVUyBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQTkRJU19QQUNLRVQgICAgKnBQYWNrZXQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwSGVhZGVyLAotCUlOICBVSU5UICAgICAgICAgICAgSGVhZGVyTGVuLAotCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCi0JSU4gIFVJTlQgICAgICAgICAgICBEYXRhTGVuKTsKK3ZvaWQgV3BhU3RhUGFpcndpc2VLZXlTZXR0aW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUlRNUEZyZWVOZGlzUGFja2V0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7Cit2b2lkIFdwYVN0YUdyb3VwS2V5U2V0dGluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1CT09MRUFOIFJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZSgKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgICAgIFF1ZUlkeCk7CitpbnQgUlRNUENsb25lTmRpc1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJSU4gQk9PTEVBTiBwSW5zQU1TRFVIZHIsCisJCQkJdm9pZCAqcEluUGFja2V0LAorCQkJCXZvaWQgKiogcHBPdXRQYWNrZXQpOwogCi1CT09MRUFOIFJUTVBDaGVja0RIQ1BGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7CitpbnQgUlRNUEFsbG9jYXRlTmRpc1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgdm9pZCAqKiBwUGFja2V0LAorCQkJCSAgIHU4ICpwSGVhZGVyLAorCQkJCSAgIHUzMiBIZWFkZXJMZW4sCisJCQkJICAgdTggKnBEYXRhLCB1MzIgRGF0YUxlbik7CiAKK3ZvaWQgUlRNUEZyZWVOZGlzUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqcFBhY2tldCk7CiAKLUJPT0xFQU4gUlRNUENoZWNrRXRoZXJUeXBlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKK0JPT0xFQU4gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggUXVlSWR4KTsKIAorQk9PTEVBTiBSVE1QQ2hlY2tESENQRnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICpwUGFja2V0KTsKIAotLy8KLS8vIFByaXZhdGUgcm91dGluZXMgaW4gcnRtcF93ZXAuYwotLy8KLVZPSUQgUlRNUEluaXRXZXBFbmdpbmUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5LAotCUlOICBVQ0hBUiAgICAgICAgICAgS2V5SWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBLZXlMZW4sCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCk7CitCT09MRUFOIFJUTVBDaGVja0V0aGVyVHlwZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHZvaWQgKnBQYWNrZXQpOwogCi1WT0lEIFJUTVBFbmNyeXB0RGF0YSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKLQlJTiAgVUlOVCAgICAgICAgICAgIExlbik7CisvKiAqLworLyogUHJpdmF0ZSByb3V0aW5lcyBpbiBydG1wX3dlcC5jICovCisvKiAqLwordm9pZCBSVE1QSW5pdFdlcEVuZ2luZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCAqcEtleSwKKwkJICAgICAgIHU4IEtleUlkLCB1OCBLZXlMZW4sIHU4ICpwRGVzdCk7CiAKLUJPT0xFQU4JUlRNUFNvZnREZWNyeXB0V0VQKAotCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKLQlJTiBQVUNIQVIJCQlwRGF0YSwKLQlJTiBVTE9ORwkJCURhdGFCeXRlQ250LAotCUlOIFBDSVBIRVJfS0VZCQlwR3JvdXBLZXkpOwordm9pZCBSVE1QRW5jcnlwdERhdGEoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgIHU4ICpwU3JjLCB1OCAqcERlc3QsIHUzMiBMZW4pOwogCi1WT0lEIFJUTVBTZXRJQ1YoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCk7CitCT09MRUFOIFJUTVBTb2Z0RGVjcnlwdFdFUChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1OCAqcERhdGEsCisJCQkgICB1bnNpZ25lZCBsb25nIERhdGFCeXRlQ250LCBzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcEdyb3VwS2V5KTsKIAotVk9JRCBBUkNGT1VSX0lOSVQoCi0JSU4gIFBBUkNGT1VSQ09OVEVYVCBDdHgsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5LAotCUlOICBVSU5UICAgICAgICAgICAgS2V5TGVuKTsKK3ZvaWQgUlRNUFNldElDVihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICpwRGVzdCk7CiAKLVVDSEFSICAgQVJDRk9VUl9CWVRFKAotCUlOICBQQVJDRk9VUkNPTlRFWFQgICAgIEN0eCk7Cit2b2lkIEFSQ0ZPVVJfSU5JVChzdHJ1Y3QgcnRfYXJjZm91cmNvbnRleHQgKkN0eCwgdTggKnBLZXksIHUzMiBLZXlMZW4pOwogCi1WT0lEIEFSQ0ZPVVJfREVDUllQVCgKLQlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0LAotCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKLQlJTiAgVUlOVCAgICAgICAgICAgIExlbik7Cit1OCBBUkNGT1VSX0JZVEUoc3RydWN0IHJ0X2FyY2ZvdXJjb250ZXh0ICpDdHgpOwogCi1WT0lEIEFSQ0ZPVVJfRU5DUllQVCgKLQlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0LAotCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKLQlJTiAgVUlOVCAgICAgICAgICAgIExlbik7Cit2b2lkIEFSQ0ZPVVJfREVDUllQVChzdHJ1Y3QgcnRfYXJjZm91cmNvbnRleHQgKkN0eCwKKwkJICAgICB1OCAqcERlc3QsIHU4ICpwU3JjLCB1MzIgTGVuKTsKIAotVk9JRCBXUEFBUkNGT1VSX0VOQ1JZUFQoCi0JSU4gIFBBUkNGT1VSQ09OVEVYVCBDdHgsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCi0JSU4gIFVJTlQgICAgICAgICAgICBMZW4pOwordm9pZCBBUkNGT1VSX0VOQ1JZUFQoc3RydWN0IHJ0X2FyY2ZvdXJjb250ZXh0ICpDdHgsCisJCSAgICAgdTggKnBEZXN0LCB1OCAqcFNyYywgdTMyIExlbik7CiAKLVVJTlQgUlRNUF9DQUxDX0ZDUzMyKAotCUlOICBVSU5UICAgRmNzLAotCUlOICBQVUNIQVIgIENwLAotCUlOICBJTlQgICAgIExlbik7Cit2b2lkIFdQQUFSQ0ZPVVJfRU5DUllQVChzdHJ1Y3QgcnRfYXJjZm91cmNvbnRleHQgKkN0eCwKKwkJCXU4ICpwRGVzdCwgdTggKnBTcmMsIHUzMiBMZW4pOwogCi0vLwotLy8gTUxNRSByb3V0aW5lcwotLy8KK3UzMiBSVE1QX0NBTENfRkNTMzIodTMyIEZjcywgdTggKkNwLCBpbnQgTGVuKTsKIAotLy8gQXNpYy9SRi9CQlAgcmVsYXRlZCBmdW5jdGlvbnMKKy8qICovCisvKiBNTE1FIHJvdXRpbmVzICovCisvKiAqLwogCi1WT0lEIEFzaWNBZGp1c3RUeFBvd2VyKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKy8qIEFzaWMvUkYvQkJQIHJlbGF0ZWQgZnVuY3Rpb25zICovCiAKLVZPSUQgCUFzaWNVcGRhdGVQcm90ZWN0KAotCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAJCVVTSE9SVAkJCU9wZXJhaW9uTW9kZSwKLQlJTiAJCVVDSEFSCQkJU2V0TWFzaywKLQlJTgkJQk9PTEVBTgkJCWJEaXNhYmxlQkdQcm90ZWN0LAotCUlOCQlCT09MRUFOCQkJYk5vbkdGRXhpc3QpOwordm9pZCBBc2ljQWRqdXN0VHhQb3dlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIEFzaWNTd2l0Y2hDaGFubmVsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJQ2hhbm5lbCwKLQlJTglCT09MRUFOCQkJYlNjYW4pOwordm9pZCBBc2ljVXBkYXRlUHJvdGVjdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1MTYgT3BlcmFpb25Nb2RlLAorCQkgICAgICAgdTggU2V0TWFzaywKKwkJICAgICAgIElOIEJPT0xFQU4gYkRpc2FibGVCR1Byb3RlY3QsIElOIEJPT0xFQU4gYk5vbkdGRXhpc3QpOwogCi1WT0lEIEFzaWNMb2NrQ2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBDaGFubmVsKSA7Cit2b2lkIEFzaWNTd2l0Y2hDaGFubmVsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHU4IENoYW5uZWwsIElOIEJPT0xFQU4gYlNjYW4pOwogCi1WT0lEIEFzaWNSZlR1bmluZ0V4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKK3ZvaWQgQXNpY0xvY2tDaGFubmVsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQ2hhbm5lbCk7CiAKLVZPSUQgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVTSE9SVCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKK3ZvaWQgQXNpY1JmVHVuaW5nRXhlYyh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSAgICAgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOwogCi1WT0lEIEFzaWNGb3JjZVNsZWVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgQXNpY1Jlc2V0QkJQQWdlbnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBBc2ljRm9yY2VXYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0jaWZkZWYgUlQyODYwCi0JSU4gVUNIQVIgICAgCSBMZXZlbCk7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQlJTiBCT09MRUFOICAgIGJGcm9tVHgpOwotI2VuZGlmCit2b2lkIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTE2IFRidHROdW1Ub05leHRXYWtlVXApOwogCi1WT0lEIEFzaWNTZXRCc3NpZCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSIHBCc3NpZCk7Cit2b2lkIEFzaWNGb3JjZVNsZWVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgQXNpY1NldE1jYXN0V0MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBBc2ljRm9yY2VXYWtldXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJGcm9tVHgpOwogCi1WT0lEIEFzaWNEZWxXY2lkVGFiKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCVdjaWQpOwordm9pZCBBc2ljU2V0QnNzaWQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqcEJzc2lkKTsKIAotVk9JRCBBc2ljRW5hYmxlUkRHKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgQXNpY1NldE1jYXN0V0Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBBc2ljRGlzYWJsZVJERygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIEFzaWNEZWxXY2lkVGFiKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggV2NpZCk7CiAKLVZPSUQgQXNpY0Rpc2FibGVTeW5jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgQXNpY0VuYWJsZVJERyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIEFzaWNFbmFibGVCc3NTeW5jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgQXNpY0Rpc2FibGVSREcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBBc2ljRW5hYmxlSWJzc1N5bmMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBBc2ljRGlzYWJsZVN5bmMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBBc2ljU2V0RWRjYVBhcm0oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUEVEQ0FfUEFSTSAgICBwRWRjYVBhcm0pOwordm9pZCBBc2ljRW5hYmxlQnNzU3luYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIEFzaWNTZXRTbG90VGltZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOIGJVc2VTaG9ydFNsb3RUaW1lKTsKK3ZvaWQgQXNpY0VuYWJsZUlic3NTeW5jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgQXNpY0FkZFNoYXJlZEtleUVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSICAgICAgICAgQnNzSW5kZXgsCi0JSU4gVUNIQVIgICAgICAgICBLZXlJZHgsCi0JSU4gVUNIQVIgICAgICAgICBDaXBoZXJBbGcsCi0JSU4gUFVDSEFSICAgICAgICBwS2V5LAotCUlOIFBVQ0hBUiAgICAgICAgcFR4TWljLAotCUlOIFBVQ0hBUiAgICAgICAgcFJ4TWljKTsKK3ZvaWQgQXNpY1NldEVkY2FQYXJtKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X2VkY2FfcGFybSAqcEVkY2FQYXJtKTsKIAotVk9JRCBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgICAgICAgICBCc3NJbmRleCwKLQlJTiBVQ0hBUiAgICAgICAgIEtleUlkeCk7Cit2b2lkIEFzaWNTZXRTbG90VGltZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYlVzZVNob3J0U2xvdFRpbWUpOwogCi1WT0lEIEFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVAkJV0NJRCwKLQlJTiBVQ0hBUgkJQnNzSW5kZXgsCi0JSU4gVUNIQVIgICAgICAgIENpcGhlckFsZywKLQlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUpOwordm9pZCBBc2ljQWRkU2hhcmVkS2V5RW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdTggQnNzSW5kZXgsCisJCQkgICB1OCBLZXlJZHgsCisJCQkgICB1OCBDaXBoZXJBbGcsCisJCQkgICB1OCAqcEtleSwgdTggKnBUeE1pYywgdTggKnBSeE1pYyk7CiAKLVZPSUQgQXNpY1VwZGF0ZVdDSURJVkVJVigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQJCVdDSUQsCi0JSU4gVUxPTkcgICAgICAgIHVJViwKLQlJTiBVTE9ORyAgICAgICAgdUVJVik7Cit2b2lkIEFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICB1OCBCc3NJbmRleCwgdTggS2V5SWR4KTsKIAotVk9JRCBBc2ljVXBkYXRlUnhXQ0lEVGFibGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUCQlXQ0lELAotCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIpOwordm9pZCBBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHUxNiBXQ0lELAorCQkJICAgICB1OCBCc3NJbmRleCwKKwkJCSAgICAgdTggQ2lwaGVyQWxnLAorCQkJICAgICBJTiBCT09MRUFOIGJVc2VQYWlyZXdpc2VLZXlUYWJsZSk7CiAKLVZPSUQgQXNpY0FkZEtleUVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVAkJV0NJRCwKLQlJTiBVQ0hBUgkJQnNzSW5kZXgsCi0JSU4gVUNIQVIJCUtleUlkeCwKLQlJTiBQQ0lQSEVSX0tFWQlwQ2lwaGVyS2V5LAotCUlOIEJPT0xFQU4JCWJVc2VQYWlyZXdpc2VLZXlUYWJsZSwKLQlJTiBCT09MRUFOCQliVHhLZXkpOwordm9pZCBBc2ljVXBkYXRlV0NJRElWRUlWKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSB1MTYgV0NJRCwgdW5zaWduZWQgbG9uZyB1SVYsIHVuc2lnbmVkIGxvbmcgdUVJVik7CiAKLVZPSUQgQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSICAgICAgICBwQWRkciwKLQlJTiBVQ0hBUgkJV0NJRCwKLQlJTiBDSVBIRVJfS0VZCQkgKnBDaXBoZXJLZXkpOwordm9pZCBBc2ljVXBkYXRlUnhXQ0lEVGFibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdTE2IFdDSUQsIHU4ICpwQWRkcik7CiAKLVZPSUQgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiAgcEFkLAotCUlOIFVDSEFSCQkgQnNzSWR4LAotCUlOIFVDSEFSCQkgV2NpZCk7Cit2b2lkIEFzaWNBZGRLZXlFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgdTE2IFdDSUQsCisJCSAgICAgdTggQnNzSW5kZXgsCisJCSAgICAgdTggS2V5SWR4LAorCQkgICAgIHN0cnVjdCBydF9jaXBoZXJfa2V5ICpwQ2lwaGVyS2V5LAorCQkgICAgIElOIEJPT0xFQU4gYlVzZVBhaXJld2lzZUtleVRhYmxlLCBJTiBCT09MRUFOIGJUeEtleSk7CiAKLUJPT0xFQU4gQXNpY1NlbmRDb21tYW5kVG9NY3UoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgICAgICAgICBDb21tYW5kLAotCUlOIFVDSEFSICAgICAgICAgVG9rZW4sCi0JSU4gVUNIQVIgICAgICAgICBBcmcwLAotCUlOIFVDSEFSICAgICAgICAgQXJnMSk7Ci0jaWZkZWYgUlQyODYwCi1CT09MRUFOIEFzaWNDaGVja0NvbW1hbk9rKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCQkgQ29tbWFuZCk7Ci0jZW5kaWYKLVZPSUQgTWFjQWRkclJhbmRvbUJzc2lkKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCU9VVCBQVUNIQVIgcEFkZHIpOwordm9pZCBBc2ljQWRkUGFpcndpc2VLZXlFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHU4ICpwQWRkciwKKwkJCSAgICAgdTggV0NJRCwgc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBDaXBoZXJLZXkpOwogCi1WT0lEIE1ndE1hY0hlYWRlckluaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICAgIHBBZCwKLQlJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAotCUlOIFVDSEFSIFN1YlR5cGUsCi0JSU4gVUNIQVIgVG9EcywKLQlJTiBQVUNIQVIgcERBLAotCUlOIFBVQ0hBUiBwQnNzaWQpOwordm9pZCBBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJdTggQnNzSWR4LCB1OCBXY2lkKTsKIAotVk9JRCBNbG1lUmFkaW9PZmYoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOworQk9PTEVBTiBBc2ljU2VuZENvbW1hbmRUb01jdShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHU4IENvbW1hbmQsCisJCQkgICAgIHU4IFRva2VuLCB1OCBBcmcwLCB1OCBBcmcxKTsKIAotVk9JRCBNbG1lUmFkaW9PbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisjaWZkZWYgUlRNUF9NQUNfUENJCitCT09MRUFOIEFzaWNDaGVja0NvbW1hbk9rKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQ29tbWFuZCk7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKK3ZvaWQgTWFjQWRkclJhbmRvbUJzc2lkKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKnBBZGRyKTsKIAotVk9JRCBCc3NUYWJsZUluaXQoCi0JSU4gQlNTX1RBQkxFICpUYWIpOwordm9pZCBNZ3RNYWNIZWFkZXJJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGRyODAyMTEsCisJCSAgICAgIHU4IFN1YlR5cGUsCisJCSAgICAgIHU4IFRvRHMsIHU4ICpwREEsIHU4ICpwQnNzaWQpOwogCi1WT0lEIEJBVGFibGVJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIEJBX1RBQkxFICpUYWIpOwordm9pZCBNbG1lUmFkaW9PZmYoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVUxPTkcgQnNzVGFibGVTZWFyY2goCi0JSU4gQlNTX1RBQkxFICpUYWIsCi0JSU4gUFVDSEFSIHBCc3NpZCwKLQlJTiBVQ0hBUiBDaGFubmVsKTsKK3ZvaWQgTWxtZVJhZGlvT24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVUxPTkcgQnNzU3NpZFRhYmxlU2VhcmNoKAotCUlOIEJTU19UQUJMRSAqVGFiLAotCUlOIFBVQ0hBUiAgICBwQnNzaWQsCi0JSU4gUFVDSEFSICAgIHBTc2lkLAotCUlOIFVDSEFSICAgICBTc2lkTGVuLAotCUlOIFVDSEFSICAgICBDaGFubmVsKTsKK3ZvaWQgQnNzVGFibGVJbml0KHN0cnVjdCBydF9ic3NfdGFibGUgKlRhYik7CiAKLVVMT05HIEJzc1RhYmxlU2VhcmNoV2l0aFNTSUQoCi0JSU4gQlNTX1RBQkxFICpUYWIsCi0JSU4gUFVDSEFSICAgIEJzc2lkLAotCUlOIFBVQ0hBUiAgICBwU3NpZCwKLQlJTiBVQ0hBUiAgICAgU3NpZExlbiwKLQlJTiBVQ0hBUiAgICAgQ2hhbm5lbCk7Cit2b2lkIEJBVGFibGVJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X2JhX3RhYmxlICpUYWIpOwogCi1WT0lEIEJzc1RhYmxlRGVsZXRlRW50cnkoCi0JSU4gT1VUICBQQlNTX1RBQkxFIHBUYWIsCi0JSU4gICAgICBQVUNIQVIgcEJzc2lkLAotCUlOICAgICAgVUNIQVIgQ2hhbm5lbCk7Cit1bnNpZ25lZCBsb25nIEJzc1RhYmxlU2VhcmNoKHN0cnVjdCBydF9ic3NfdGFibGUgKlRhYiwgdTggKnBCc3NpZCwgdTggQ2hhbm5lbCk7CiAKLVZPSUQgQkFUYWJsZURlbGV0ZU9SSUVudHJ5KAotCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKLQlJTgkJQkFfT1JJX0VOVFJZCSpwQkFPUklFbnRyeSk7Cit1bnNpZ25lZCBsb25nIEJzc1NzaWRUYWJsZVNlYXJjaChzdHJ1Y3QgcnRfYnNzX3RhYmxlICpUYWIsCisJCQkgdTggKnBCc3NpZCwKKwkJCSB1OCAqcFNzaWQsIHU4IFNzaWRMZW4sIHU4IENoYW5uZWwpOwogCi1WT0lEICBCc3NFbnRyeVNldCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlPVVQgUEJTU19FTlRSWSBwQnNzLAotCUlOIFBVQ0hBUiBwQnNzaWQsCi0JSU4gQ0hBUiBTc2lkW10sCi0JSU4gVUNIQVIgU3NpZExlbiwKLQlJTiBVQ0hBUiBCc3NUeXBlLAotCUlOIFVTSE9SVCBCZWFjb25QZXJpb2QsCi0JSU4gUENGX1BBUk0gQ2ZQYXJtLAotCUlOIFVTSE9SVCBBdGltV2luLAotCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKLQlJTiBVQ0hBUiBTdXBSYXRlW10sCi0JSU4gVUNIQVIgU3VwUmF0ZUxlbiwKLQlJTiBVQ0hBUiBFeHRSYXRlW10sCi0JSU4gVUNIQVIgRXh0UmF0ZUxlbiwKLQlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAotCUlOIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKLQlJTiBVQ0hBUgkJCUFkZEh0SW5mb0xlbiwKLQlJTiBVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQsCi0JSU4gVUNIQVIgQ2hhbm5lbCwKLQlJTiBDSEFSIFJzc2ksCi0JSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCi0JSU4gVUNIQVIgQ2tpcEZsYWcsCi0JSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCi0JSU4gUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCi0JSU4gUFFCU1NfTE9BRF9QQVJNIHBRYnNzTG9hZCwKLQlJTiBVU0hPUlQgTGVuZ3RoVklFLAotCUlOIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSk7Cit1bnNpZ25lZCBsb25nIEJzc1RhYmxlU2VhcmNoV2l0aFNTSUQoc3RydWN0IHJ0X2Jzc190YWJsZSAqVGFiLAorCQkJICAgICB1OCAqQnNzaWQsCisJCQkgICAgIHU4ICpwU3NpZCwKKwkJCSAgICAgdTggU3NpZExlbiwgdTggQ2hhbm5lbCk7CiAKLVVMT05HICBCc3NUYWJsZVNldEVudHJ5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCU9VVCBQQlNTX1RBQkxFIHBUYWIsCi0JSU4gUFVDSEFSIHBCc3NpZCwKLQlJTiBDSEFSIFNzaWRbXSwKLQlJTiBVQ0hBUiBTc2lkTGVuLAotCUlOIFVDSEFSIEJzc1R5cGUsCi0JSU4gVVNIT1JUIEJlYWNvblBlcmlvZCwKLQlJTiBDRl9QQVJNICpDZlBhcm0sCi0JSU4gVVNIT1JUIEF0aW1XaW4sCi0JSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAotCUlOIFVDSEFSIFN1cFJhdGVbXSwKLQlJTiBVQ0hBUiBTdXBSYXRlTGVuLAotCUlOIFVDSEFSIEV4dFJhdGVbXSwKLQlJTiBVQ0hBUiBFeHRSYXRlTGVuLAotCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAotCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAotCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKLQlJTiBVQ0hBUiBDaGFubmVsLAotCUlOIENIQVIgUnNzaSwKLQlJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKLQlJTiBVQ0hBUiBDa2lwRmxhZywKLQlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKLQlJTiBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKLQlJTiBQUUJTU19MT0FEX1BBUk0gcFFic3NMb2FkLAotCUlOIFVTSE9SVCBMZW5ndGhWSUUsCi0JSU4gUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKTsKK3Vuc2lnbmVkIGxvbmcgQnNzU3NpZFRhYmxlU2VhcmNoQnlTU0lEKHN0cnVjdCBydF9ic3NfdGFibGUgKlRhYiwKKwkJCSAgICAgICB1OCAqcFNzaWQsIHU4IFNzaWRMZW4pOwogCi1WT0lEIEJBVGFibGVJbnNlcnRFbnRyeSgKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVU0hPUlQgQWlkLAotICAgIElOIFVTSE9SVAkJVGltZU91dFZhbHVlLAotCUlOIFVTSE9SVAkJU3RhcnRpbmdTZXEsCi0gICAgSU4gVUNIQVIgVElELAotCUlOIFVDSEFSIEJBV2luU2l6ZSwKLQlJTiBVQ0hBUiBPcmlnaW5hdG9yU3RhdHVzLAotICAgIElOIEJPT0xFQU4gSXNSZWNpcGllbnQpOwordm9pZCBCc3NUYWJsZURlbGV0ZUVudHJ5KHN0cnVjdCBydF9ic3NfdGFibGUgKnBUYWIsCisJCQkgdTggKnBCc3NpZCwgdTggQ2hhbm5lbCk7CiAKLVZPSUQgQnNzVGFibGVTc2lkU29ydCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlPVVQgQlNTX1RBQkxFICpPdXRUYWIsCi0JSU4gIENIQVIgU3NpZFtdLAotCUlOICBVQ0hBUiBTc2lkTGVuKTsKK3ZvaWQgQkFUYWJsZURlbGV0ZU9SSUVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHN0cnVjdCBydF9iYV9vcmlfZW50cnkgKnBCQU9SSUVudHJ5KTsKIAotVk9JRCAgQnNzVGFibGVTb3J0QnlSc3NpKAotCUlOIE9VVCBCU1NfVEFCTEUgKk91dFRhYik7Cit2b2lkIEJzc0VudHJ5U2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X2Jzc19lbnRyeSAqcEJzcywgdTggKnBCc3NpZCwgY2hhciBTc2lkW10sIHU4IFNzaWRMZW4sIHU4IEJzc1R5cGUsIHUxNiBCZWFjb25QZXJpb2QsIHN0cnVjdCBydF9jZl9wYXJtICogQ2ZQYXJtLCB1MTYgQXRpbVdpbiwgdTE2IENhcGFiaWxpdHlJbmZvLCB1OCBTdXBSYXRlW10sIHU4IFN1cFJhdGVMZW4sIHU4IEV4dFJhdGVbXSwgdTggRXh0UmF0ZUxlbiwgc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUgKiBwSHRDYXBhYmlsaXR5LCBzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgKiBwQWRkSHRJbmZvLAkvKiBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUgKi8KKwkJIHU4IEh0Q2FwYWJpbGl0eUxlbiwKKwkJIHU4IEFkZEh0SW5mb0xlbiwKKwkJIHU4IE5ld0V4dENoYW5PZmZzZXQsCisJCSB1OCBDaGFubmVsLAorCQkgY2hhciBSc3NpLAorCQkgSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCisJCSB1OCBDa2lwRmxhZywKKwkJIHN0cnVjdCBydF9lZGNhX3Bhcm0gKnBFZGNhUGFybSwKKwkJIHN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtICpwUW9zQ2FwYWJpbGl0eSwKKwkJIHN0cnVjdCBydF9xYnNzX2xvYWRfcGFybSAqcFFic3NMb2FkLAorCQkgdTE2IExlbmd0aFZJRSwgc3RydWN0IHJ0X25kaXNfODAyXzExX3ZhcmlhYmxlX2llcyAqcFZJRSk7CiAKLVZPSUQgQnNzQ2lwaGVyUGFyc2UoCi0JSU4gT1VUICBQQlNTX0VOVFJZICBwQnNzKTsKK3Vuc2lnbmVkIGxvbmcgQnNzVGFibGVTZXRFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9ic3NfdGFibGUgKnBUYWIsIHU4ICpwQnNzaWQsIGNoYXIgU3NpZFtdLCB1OCBTc2lkTGVuLCB1OCBCc3NUeXBlLCB1MTYgQmVhY29uUGVyaW9kLCBzdHJ1Y3QgcnRfY2ZfcGFybSAqIENmUGFybSwgdTE2IEF0aW1XaW4sIHUxNiBDYXBhYmlsaXR5SW5mbywgdTggU3VwUmF0ZVtdLCB1OCBTdXBSYXRlTGVuLCB1OCBFeHRSYXRlW10sIHU4IEV4dFJhdGVMZW4sIHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llICogcEh0Q2FwYWJpbGl0eSwgc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llICogcEFkZEh0SW5mbywJLyogQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFICovCisJCSAgICAgICB1OCBIdENhcGFiaWxpdHlMZW4sCisJCSAgICAgICB1OCBBZGRIdEluZm9MZW4sCisJCSAgICAgICB1OCBOZXdFeHRDaGFuT2Zmc2V0LAorCQkgICAgICAgdTggQ2hhbm5lbCwKKwkJICAgICAgIGNoYXIgUnNzaSwKKwkJICAgICAgIElOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAorCQkgICAgICAgdTggQ2tpcEZsYWcsCisJCSAgICAgICBzdHJ1Y3QgcnRfZWRjYV9wYXJtICpwRWRjYVBhcm0sCisJCSAgICAgICBzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSAqcFFvc0NhcGFiaWxpdHksCisJCSAgICAgICBzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0gKnBRYnNzTG9hZCwKKwkJICAgICAgIHUxNiBMZW5ndGhWSUUsIHN0cnVjdCBydF9uZGlzXzgwMl8xMV92YXJpYWJsZV9pZXMgKnBWSUUpOwogCi1ORElTX1NUQVRVUyAgTWxtZVF1ZXVlSW5pdCgKLQlJTiBNTE1FX1FVRVVFICpRdWV1ZSk7Cit2b2lkIEJBVGFibGVJbnNlcnRFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQl1MTYgQWlkLAorCQkJdTE2IFRpbWVPdXRWYWx1ZSwKKwkJCXUxNiBTdGFydGluZ1NlcSwKKwkJCXU4IFRJRCwKKwkJCXU4IEJBV2luU2l6ZSwKKwkJCXU4IE9yaWdpbmF0b3JTdGF0dXMsIElOIEJPT0xFQU4gSXNSZWNpcGllbnQpOwogCi1WT0lEICBNbG1lUXVldWVEZXN0cm95KAotCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKTsKK3ZvaWQgQnNzVGFibGVTc2lkU29ydChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgIHN0cnVjdCBydF9ic3NfdGFibGUgKk91dFRhYiwgY2hhciBTc2lkW10sIHU4IFNzaWRMZW4pOwogCi1CT09MRUFOIE1sbWVFbnF1ZXVlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVMT05HIE1hY2hpbmUsCi0JSU4gVUxPTkcgTXNnVHlwZSwKLQlJTiBVTE9ORyBNc2dMZW4sCi0JSU4gVk9JRCAqTXNnKTsKK3ZvaWQgQnNzVGFibGVTb3J0QnlSc3NpKHN0cnVjdCBydF9ic3NfdGFibGUgKk91dFRhYik7CiAKLUJPT0xFQU4gTWxtZUVucXVldWVGb3JSZWN2KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIFVMT05HIFdjaWQsCi0JSU4gVUxPTkcgVGltZVN0YW1wSGlnaCwKLQlJTiBVTE9ORyBUaW1lU3RhbXBMb3csCi0JSU4gVUNIQVIgUnNzaTAsCi0JSU4gVUNIQVIgUnNzaTEsCi0JSU4gVUNIQVIgUnNzaTIsCi0JSU4gVUxPTkcgTXNnTGVuLAotCUlOIFBWT0lEIE1zZywKLQlJTiBVQ0hBUiBTaWduYWwpOwordm9pZCBCc3NDaXBoZXJQYXJzZShzdHJ1Y3QgcnRfYnNzX2VudHJ5ICpwQnNzKTsKIAoraW50IE1sbWVRdWV1ZUluaXQoc3RydWN0IHJ0X21sbWVfcXVldWUgKlF1ZXVlKTsKIAotQk9PTEVBTiBNbG1lRGVxdWV1ZSgKLQlJTiBNTE1FX1FVRVVFICpRdWV1ZSwKLQlPVVQgTUxNRV9RVUVVRV9FTEVNICoqRWxlbSk7Cit2b2lkIE1sbWVRdWV1ZURlc3Ryb3koc3RydWN0IHJ0X21sbWVfcXVldWUgKlF1ZXVlKTsKIAotVk9JRCAgICBNbG1lUmVzdGFydFN0YXRlTWFjaGluZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CitCT09MRUFOIE1sbWVFbnF1ZXVlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgIHVuc2lnbmVkIGxvbmcgTWFjaGluZSwKKwkJICAgIHVuc2lnbmVkIGxvbmcgTXNnVHlwZSwgdW5zaWduZWQgbG9uZyBNc2dMZW4sIHZvaWQgKiBNc2cpOwogCi1CT09MRUFOICBNbG1lUXVldWVFbXB0eSgKLQlJTiBNTE1FX1FVRVVFICpRdWV1ZSk7CitCT09MRUFOIE1sbWVFbnF1ZXVlRm9yUmVjdihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1bnNpZ25lZCBsb25nIFdjaWQsCisJCQkgICB1bnNpZ25lZCBsb25nIFRpbWVTdGFtcEhpZ2gsCisJCQkgICB1bnNpZ25lZCBsb25nIFRpbWVTdGFtcExvdywKKwkJCSAgIHU4IFJzc2kwLAorCQkJICAgdTggUnNzaTEsCisJCQkgICB1OCBSc3NpMiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLCB2b2lkICpNc2csIHU4IFNpZ25hbCk7CiAKLUJPT0xFQU4gIE1sbWVRdWV1ZUZ1bGwoCi0JSU4gTUxNRV9RVUVVRSAqUXVldWUpOworQk9PTEVBTiBNbG1lRGVxdWV1ZShzdHJ1Y3QgcnRfbWxtZV9xdWV1ZSAqUXVldWUsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKiogRWxlbSk7CiAKLUJPT0xFQU4gIE1zZ1R5cGVTdWJzdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQRlJBTUVfODAyXzExIHBGcmFtZSwKLQlPVVQgSU5UICpNYWNoaW5lLAotCU9VVCBJTlQgKk1zZ1R5cGUpOwordm9pZCBNbG1lUmVzdGFydFN0YXRlTWFjaGluZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFN0YXRlTWFjaGluZUluaXQoCi0JSU4gU1RBVEVfTUFDSElORSAqU20sCi0JSU4gU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10sCi0JSU4gVUxPTkcgU3ROciwKLQlJTiBVTE9ORyBNc2dOciwKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkMgRGVmRnVuYywKLQlJTiBVTE9ORyBJbml0U3RhdGUsCi0JSU4gVUxPTkcgQmFzZSk7CitCT09MRUFOIE1sbWVRdWV1ZUVtcHR5KHN0cnVjdCBydF9tbG1lX3F1ZXVlICpRdWV1ZSk7CiAKLVZPSUQgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKAotCUlOIFNUQVRFX01BQ0hJTkUgKlMsCi0JSU4gVUxPTkcgU3QsCi0JVUxPTkcgTXNnLAotCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBGKTsKK0JPT0xFQU4gTWxtZVF1ZXVlRnVsbChzdHJ1Y3QgcnRfbWxtZV9xdWV1ZSAqUXVldWUpOwogCi1WT0lEIFN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gU1RBVEVfTUFDSElORSAqUywKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworQk9PTEVBTiBNc2dUeXBlU3Vic3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgIHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKiBwRnJhbWUsCisJCSAgICAgaW50ICogTWFjaGluZSwgaW50ICogTXNnVHlwZSk7CiAKLVZPSUQgRHJvcCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBTdGF0ZU1hY2hpbmVJbml0KHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTbSwKKwkJICAgICAgSU4gU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10sCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgU3ROciwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBNc2dOciwKKwkJICAgICAgSU4gU1RBVEVfTUFDSElORV9GVU5DIERlZkZ1bmMsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgSW5pdFN0YXRlLCB1bnNpZ25lZCBsb25nIEJhc2UpOwogCi1WT0lEIEFzc29jU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgU1RBVEVfTUFDSElORSAqU20sCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKK3ZvaWQgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTLAorCQkJICAgdW5zaWduZWQgbG9uZyBTdCwgdW5zaWduZWQgbG9uZyBNc2csIElOIFNUQVRFX01BQ0hJTkVfRlVOQyBGKTsKIAotVk9JRCBSZWFzc29jVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwordm9pZCBTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICBzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSAqUywgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgQXNzb2NUaW1lb3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Cit2b2lkIERyb3Aoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBEaXNhc3NvY1RpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKK3ZvaWQgQXNzb2NTdGF0ZU1hY2hpbmVJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTbSwKKwkJCSAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CiAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVk9JRCBNbG1lQXNzb2NSZXFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFJlYXNzb2NUaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAotVk9JRCBNbG1lUmVhc3NvY1JlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgQXNzb2NUaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOwogCi1WT0lEIE1sbWVEaXNhc3NvY1JlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgRGlzYXNzb2NUaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOwogCi1WT0lEIFBlZXJBc3NvY1JzcEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCBNbG1lQXNzb2NSZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBQZWVyUmVhc3NvY1JzcEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgTWxtZVJlYXNzb2NSZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBQZWVyRGlzYXNzb2NBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIE1sbWVEaXNhc3NvY1JlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIERpc2Fzc29jVGltZW91dEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUGVlckFzc29jUnNwQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgQXNzb2NUaW1lb3V0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBQZWVyUmVhc3NvY1JzcEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEICBSZWFzc29jVGltZW91dEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUGVlckRpc2Fzc29jQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgIENsczNlcnJBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiBwQWRkcik7Cit2b2lkIERpc2Fzc29jVGltZW91dEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFN3aXRjaEJldHdlZW5XZXBBbmRDa2lwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgQXNzb2NUaW1lb3V0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgIEludmFsaWRTdGF0ZVdoZW5Bc3NvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUmVhc3NvY1RpbWVvdXRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCAgSW52YWxpZFN0YXRlV2hlblJlYXNzb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIENsczNlcnJBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqcEFkZHIpOwogCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBJbnZhbGlkU3RhdGVXaGVuQXNzb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotI2lmZGVmIFJUMjg3MAotVk9JRCBNbG1lQ250bENvbmZpcm0oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUxPTkcgTXNnVHlwZSwKLQlJTiBVU0hPUlQgTXNnKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KK3ZvaWQgSW52YWxpZFN0YXRlV2hlblJlYXNzb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCAgQ29tcG9zZVBzUG9sbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIEludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgIENvbXBvc2VOdWxsRnJhbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgcEFkKTsKKyNpZmRlZiBSVE1QX01BQ19VU0IKK3ZvaWQgTWxtZUNudGxDb25maXJtKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdW5zaWduZWQgbG9uZyBNc2dUeXBlLCB1MTYgTXNnKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotVk9JRCAgQXNzb2NQb3N0UHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSIHBBZGRyMiwKLQlJTiAgVVNIT1JUIENhcGFiaWxpdHlJbmZvLAotCUlOICBVU0hPUlQgQWlkLAotCUlOICBVQ0hBUiBTdXBSYXRlW10sCi0JSU4gIFVDSEFSIFN1cFJhdGVMZW4sCi0JSU4gIFVDSEFSIEV4dFJhdGVbXSwKLQlJTiAgVUNIQVIgRXh0UmF0ZUxlbiwKLQlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKLQlJTiBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKLQlJTiAgVUNIQVIgSHRDYXBhYmlsaXR5TGVuLAotCUlOIEFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbyk7Cit2b2lkIENvbXBvc2VQc1BvbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBBdXRoU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiBQU1RBVEVfTUFDSElORSBzbSwKLQlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwordm9pZCBDb21wb3NlTnVsbEZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgQXV0aFRpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKK3ZvaWQgQXNzb2NQb3N0UHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgIHU4ICpwQWRkcjIsCisJCSAgIHUxNiBDYXBhYmlsaXR5SW5mbywKKwkJICAgdTE2IEFpZCwKKwkJICAgdTggU3VwUmF0ZVtdLAorCQkgICB1OCBTdXBSYXRlTGVuLAorCQkgICB1OCBFeHRSYXRlW10sCisJCSAgIHU4IEV4dFJhdGVMZW4sCisJCSAgIHN0cnVjdCBydF9lZGNhX3Bhcm0gKnBFZGNhUGFybSwKKwkJICAgc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUgKiBwSHRDYXBhYmlsaXR5LAorCQkgICB1OCBIdENhcGFiaWxpdHlMZW4sIHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSAqIHBBZGRIdEluZm8pOworCit2b2lkIEF1dGhTdGF0ZU1hY2hpbmVJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKnNtLCBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCit2b2lkIEF1dGhUaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAotVk9JRCBNbG1lQXV0aFJlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgTWxtZUF1dGhSZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBQZWVyQXV0aFJzcEF0U2VxMkFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBBdXRoVGltZW91dEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgQXV0aFRpbWVvdXRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBDbHMyZXJyQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgcEFkZHIpOwordm9pZCBDbHMyZXJyQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKnBBZGRyKTsKIAotVk9JRCBNbG1lRGVhdXRoUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBNbG1lRGVhdXRoUmVxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgSW52YWxpZFN0YXRlV2hlbkF1dGgoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIEludmFsaWRTdGF0ZVdoZW5BdXRoKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi1WT0lEIEF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQU1RBVEVfTUFDSElORSBTbSwKLQlJTiAgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwordm9pZCBBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTbSwKKwkJCSAgICAgSU4gU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwogCi1WT0lEIFBlZXJEZWF1dGhBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUGVlckRlYXV0aEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFBlZXJBdXRoU2ltcGxlUnNwR2VuQW5kU2VuZCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUEhFQURFUl84MDJfMTEgIHBIZHI4MDIxMSwKLQlJTiAgVVNIT1JUIEFsZywKLQlJTiAgVVNIT1JUIFNlcSwKLQlJTiAgVVNIT1JUIFJlYXNvbiwKLQlJTiAgVVNIT1JUIFN0YXR1cyk7Cit2b2lkIFBlZXJBdXRoU2ltcGxlUnNwR2VuQW5kU2VuZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhkcjgwMjExLAorCQkJCSB1MTYgQWxnLAorCQkJCSB1MTYgU2VxLAorCQkJCSB1MTYgUmVhc29uLCB1MTYgU3RhdHVzKTsKIAotLy8KLS8vIFByaXZhdGUgcm91dGluZXMgaW4gZGxzLmMKLS8vCisvKiAqLworLyogUHJpdmF0ZSByb3V0aW5lcyBpbiBkbHMuYyAqLworLyogKi8KIAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotVk9JRCBTeW5jU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgU1RBVEVfTUFDSElORSAqU20sCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKK3ZvaWQgU3luY1N0YXRlTWFjaGluZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICBzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSAqU20sCisJCQkgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CiAKLVZPSUQgQmVhY29uVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwordm9pZCBCZWFjb25UaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CiAKLVZPSUQgU2NhblRpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKK3ZvaWQgU2NhblRpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOwogCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5TY2FuKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBJbnZhbGlkU3RhdGVXaGVuU2NhbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5Kb2luKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBJbnZhbGlkU3RhdGVXaGVuSm9pbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5TdGFydCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgSW52YWxpZFN0YXRlV2hlblN0YXJ0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgRW5xdWV1ZVByb2JlUmVxdWVzdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIEVucXVldWVQcm9iZVJlcXVlc3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotQk9PTEVBTiBTY2FuUnVubmluZygKLQkJSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQk9PTEVBTiBTY2FuUnVubmluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi1WT0lEIE1sbWVDbnRsSW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgU1RBVEVfTUFDSElORSAqUywKLQlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwordm9pZCBNbG1lQ250bEluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTLCBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwogCi1WT0lEIE1sbWVDbnRsTWFjaGluZVBlcmZvcm1BY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFNUQVRFX01BQ0hJTkUgKlMsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIE1sbWVDbnRsTWFjaGluZVBlcmZvcm1BY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlMsCisJCQkJICBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBDbnRsSWRsZVByb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIENudGxJZGxlUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIENudGxPaWRTY2FuUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIENudGxPaWRTY2FuUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIENudGxPaWRTc2lkUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICogRWxlbSk7Cit2b2lkIENudGxPaWRTc2lkUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIENudGxPaWRSVEJzc2lkUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICogRWxlbSk7Cit2b2lkIENudGxPaWRSVEJzc2lkUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIENudGxNbG1lUm9hbWluZ1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pOwordm9pZCBDbnRsTWxtZVJvYW1pbmdQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgQ250bFdhaXREaXNhc3NvY1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIENudGxXYWl0RGlzYXNzb2NQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgQ250bFdhaXRKb2luUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgQ250bFdhaXRKb2luUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIENudGxXYWl0UmVhc3NvY1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIENudGxXYWl0UmVhc3NvY1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBDbnRsV2FpdFN0YXJ0UHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgQ250bFdhaXRTdGFydFByb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBDbnRsV2FpdEF1dGhQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBDbnRsV2FpdEF1dGhQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgQ250bFdhaXRBdXRoUHJvYzIoCi0JSU4gIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBDbnRsV2FpdEF1dGhQcm9jMihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIENudGxXYWl0QXNzb2NQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBDbnRsV2FpdEFzc29jUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIExpbmtVcCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIgQnNzVHlwZSk7Cit2b2lkIExpbmtVcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IEJzc1R5cGUpOwogCi1WT0lEIExpbmtEb3duKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBCT09MRUFOICAgICAgICAgSXNSZXFGcm9tQVApOwordm9pZCBMaW5rRG93bihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gSXNSZXFGcm9tQVApOwogCi1WT0lEIEl0ZXJhdGVPbkJzc1RhYigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIEl0ZXJhdGVPbkJzc1RhYihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIEl0ZXJhdGVPbkJzc1RhYjIoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOzsKK3ZvaWQgSXRlcmF0ZU9uQnNzVGFiMihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOzsKIAotVk9JRCBKb2luUGFybUZpbGwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE9VVCBNTE1FX0pPSU5fUkVRX1NUUlVDVCAqSm9pblJlcSwKLQlJTiAgVUxPTkcgQnNzSWR4KTsKK3ZvaWQgSm9pblBhcm1GaWxsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICBzdHJ1Y3QgcnRfbWxtZV9qb2luX3JlcSAqSm9pblJlcSwgdW5zaWduZWQgbG9uZyBCc3NJZHgpOwogCi1WT0lEIEFzc29jUGFybUZpbGwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gT1VUIE1MTUVfQVNTT0NfUkVRX1NUUlVDVCAqQXNzb2NSZXEsCi0JSU4gIFBVQ0hBUiBwQWRkciwKLQlJTiAgVVNIT1JUIENhcGFiaWxpdHlJbmZvLAotCUlOICBVTE9ORyBUaW1lb3V0LAotCUlOICBVU0hPUlQgTGlzdGVuSW50dik7Cit2b2lkIEFzc29jUGFybUZpbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICBzdHJ1Y3QgcnRfbWxtZV9hc3NvY19yZXEgKkFzc29jUmVxLAorCQkgICB1OCAqcEFkZHIsCisJCSAgIHUxNiBDYXBhYmlsaXR5SW5mbywKKwkJICAgdW5zaWduZWQgbG9uZyBUaW1lb3V0LCB1MTYgTGlzdGVuSW50dik7CiAKLVZPSUQgU2NhblBhcm1GaWxsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBPVVQgTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKlNjYW5SZXEsCi0JSU4gIENIQVIgU3NpZFtdLAotCUlOICBVQ0hBUiBTc2lkTGVuLAotCUlOICBVQ0hBUiBCc3NUeXBlLAotCUlOICBVQ0hBUiBTY2FuVHlwZSk7Cit2b2lkIFNjYW5QYXJtRmlsbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgc3RydWN0IHJ0X21sbWVfc2Nhbl9yZXEgKlNjYW5SZXEsCisJCSAgY2hhciBTc2lkW10sCisJCSAgdTggU3NpZExlbiwgdTggQnNzVHlwZSwgdTggU2NhblR5cGUpOwogCi1WT0lEIERpc2Fzc29jUGFybUZpbGwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE9VVCBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgKkRpc2Fzc29jUmVxLAotCUlOICBQVUNIQVIgcEFkZHIsCi0JSU4gIFVTSE9SVCBSZWFzb24pOwordm9pZCBEaXNhc3NvY1Bhcm1GaWxsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxICpEaXNhc3NvY1JlcSwKKwkJICAgICAgdTggKnBBZGRyLCB1MTYgUmVhc29uKTsKIAotVk9JRCBTdGFydFBhcm1GaWxsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBPVVQgTUxNRV9TVEFSVF9SRVFfU1RSVUNUICpTdGFydFJlcSwKLQlJTiAgQ0hBUiBTc2lkW10sCi0JSU4gIFVDSEFSIFNzaWRMZW4pOwordm9pZCBTdGFydFBhcm1GaWxsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgc3RydWN0IHJ0X21sbWVfc3RhcnRfcmVxICpTdGFydFJlcSwKKwkJICAgY2hhciBTc2lkW10sIHU4IFNzaWRMZW4pOwogCi1WT0lEIEF1dGhQYXJtRmlsbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgT1VUIE1MTUVfQVVUSF9SRVFfU1RSVUNUICpBdXRoUmVxLAotCUlOICBQVUNIQVIgcEFkZHIsCi0JSU4gIFVTSE9SVCBBbGcpOwordm9pZCBBdXRoUGFybUZpbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgIHN0cnVjdCBydF9tbG1lX2F1dGhfcmVxICpBdXRoUmVxLAorCQkgIHU4ICpwQWRkciwgdTE2IEFsZyk7CiAKLVZPSUQgRW5xdWV1ZVBzUG9sbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIEVucXVldWVQc1BvbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBFbnF1ZXVlQmVhY29uRnJhbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBFbnF1ZXVlQmVhY29uRnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBNbG1lSm9pblJlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgTWxtZUpvaW5SZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBNbG1lU2NhblJlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgTWxtZVNjYW5SZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBNbG1lU3RhcnRSZXFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIE1sbWVTdGFydFJlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFNjYW5UaW1lb3V0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBTY2FuVGltZW91dEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIEJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIEJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgUGVlckJlYWNvbkF0Sm9pbkFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUGVlckJlYWNvbkF0Sm9pbkFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFBlZXJCZWFjb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFBlZXJCZWFjb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBQZWVyUHJvYmVSZXFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBQZWVyUHJvYmVSZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBTY2FuTmV4dENoYW5uZWwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBTY2FuTmV4dENoYW5uZWwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVUxPTkcgTWFrZUlic3NCZWFjb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordW5zaWduZWQgbG9uZyBNYWtlSWJzc0JlYWNvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIENDWEFkamFjZW50QVBSZXBvcnQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworQk9PTEVBTiBNbG1lU2NhblJlcVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHZvaWQgKiBNc2csCisJCQkgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJICB1OCAqIEJzc1R5cGUsCisJCQkgIGNoYXIgc3NpZFtdLAorCQkJICB1OCAqIFNzaWRMZW4sIHU4ICogU2NhblR5cGUpOwogCi1CT09MRUFOIE1sbWVTY2FuUmVxU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBWT0lEICpNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlPVVQgVUNIQVIgKkJzc1R5cGUsCi0JT1VUIENIQVIgc3NpZFtdLAotCU9VVCBVQ0hBUiAqU3NpZExlbiwKLQlPVVQgVUNIQVIgKlNjYW5UeXBlKTsKK0JPT0xFQU4gUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgdm9pZCAqIE1zZywKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkJICAgIHU4IE1zZ0NoYW5uZWwsCisJCQkJICAgIHU4ICpwQWRkcjIsCisJCQkJICAgIHU4ICpwQnNzaWQsCisJCQkJICAgIGNoYXIgU3NpZFtdLAorCQkJCSAgICB1OCAqIHBTc2lkTGVuLAorCQkJCSAgICB1OCAqIHBCc3NUeXBlLAorCQkJCSAgICB1MTYgKiBwQmVhY29uUGVyaW9kLAorCQkJCSAgICB1OCAqIHBDaGFubmVsLAorCQkJCSAgICB1OCAqIHBOZXdDaGFubmVsLAorCQkJCSAgICBPVVQgTEFSR0VfSU5URUdFUiAqIHBUaW1lc3RhbXAsCisJCQkJICAgIHN0cnVjdCBydF9jZl9wYXJtICogcENmUGFybSwKKwkJCQkgICAgdTE2ICogcEF0aW1XaW4sCisJCQkJICAgIHUxNiAqIHBDYXBhYmlsaXR5SW5mbywKKwkJCQkgICAgdTggKiBwRXJwLAorCQkJCSAgICB1OCAqIHBEdGltQ291bnQsCisJCQkJICAgIHU4ICogcER0aW1QZXJpb2QsCisJCQkJICAgIHU4ICogcEJjYXN0RmxhZywKKwkJCQkgICAgdTggKiBwTWVzc2FnZVRvTWUsCisJCQkJICAgIHU4IFN1cFJhdGVbXSwKKwkJCQkgICAgdTggKiBwU3VwUmF0ZUxlbiwKKwkJCQkgICAgdTggRXh0UmF0ZVtdLAorCQkJCSAgICB1OCAqIHBFeHRSYXRlTGVuLAorCQkJCSAgICB1OCAqIHBDa2lwRmxhZywKKwkJCQkgICAgdTggKiBwQWlyb25ldENlbGxQb3dlckxpbWl0LAorCQkJCSAgICBzdHJ1Y3QgcnRfZWRjYV9wYXJtICpwRWRjYVBhcm0sCisJCQkJICAgIHN0cnVjdCBydF9xYnNzX2xvYWRfcGFybSAqcFFic3NMb2FkLAorCQkJCSAgICBzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSAqcFFvc0NhcGFiaWxpdHksCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgKiBwUmFsaW5rSWUsCisJCQkJICAgIHU4ICogcEh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkgICAgdTggKiBwUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkgICAgc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUgKiBwSHRDYXBhYmlsaXR5LAorCQkJCSAgICB1OCAqIEFkZEh0SW5mb0xlbiwKKwkJCQkgICAgc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llICogQWRkSHRJbmZvLAorCQkJCSAgICB1OCAqIE5ld0V4dENoYW5uZWwsCisJCQkJICAgIHUxNiAqIExlbmd0aFZJRSwKKwkJCQkgICAgc3RydWN0IHJ0X25kaXNfODAyXzExX3ZhcmlhYmxlX2llcyAqcFZJRSk7CiAKLUJPT0xFQU4gUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBWT0lEICpNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlJTiAgVUNIQVIgTXNnQ2hhbm5lbCwKLQlPVVQgUFVDSEFSIHBBZGRyMiwKLQlPVVQgUFVDSEFSIHBCc3NpZCwKLQlPVVQgQ0hBUiBTc2lkW10sCi0JT1VUIFVDSEFSICpwU3NpZExlbiwKLQlPVVQgVUNIQVIgKnBCc3NUeXBlLAotCU9VVCBVU0hPUlQgKnBCZWFjb25QZXJpb2QsCi0JT1VUIFVDSEFSICpwQ2hhbm5lbCwKLQlPVVQgVUNIQVIgKnBOZXdDaGFubmVsLAotCU9VVCBMQVJHRV9JTlRFR0VSICpwVGltZXN0YW1wLAotCU9VVCBDRl9QQVJNICpwQ2ZQYXJtLAotCU9VVCBVU0hPUlQgKnBBdGltV2luLAotCU9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKLQlPVVQgVUNIQVIgKnBFcnAsCi0JT1VUIFVDSEFSICpwRHRpbUNvdW50LAotCU9VVCBVQ0hBUiAqcER0aW1QZXJpb2QsCi0JT1VUIFVDSEFSICpwQmNhc3RGbGFnLAotCU9VVCBVQ0hBUiAqcE1lc3NhZ2VUb01lLAotCU9VVCBVQ0hBUiBTdXBSYXRlW10sCi0JT1VUIFVDSEFSICpwU3VwUmF0ZUxlbiwKLQlPVVQgVUNIQVIgRXh0UmF0ZVtdLAotCU9VVCBVQ0hBUiAqcEV4dFJhdGVMZW4sCi0JT1VUCVVDSEFSICpwQ2tpcEZsYWcsCi0JT1VUCVVDSEFSICpwQWlyb25ldENlbGxQb3dlckxpbWl0LAotCU9VVCBQRURDQV9QQVJNICAgICAgIHBFZGNhUGFybSwKLQlPVVQgUFFCU1NfTE9BRF9QQVJNICBwUWJzc0xvYWQsCi0JT1VUIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAotCU9VVCBVTE9ORyAqcFJhbGlua0llLAotCU9VVCBVQ0hBUgkJICpwSHRDYXBhYmlsaXR5TGVuLAotCU9VVCBVQ0hBUgkJICpwUHJlTkh0Q2FwYWJpbGl0eUxlbiwKLQlPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKLQlPVVQgVUNIQVIJCSAqQWRkSHRJbmZvTGVuLAotCU9VVCBBRERfSFRfSU5GT19JRSAqQWRkSHRJbmZvLAotCU9VVCBVQ0hBUiAqTmV3RXh0Q2hhbm5lbCwKLQlPVVQgVVNIT1JUICpMZW5ndGhWSUUsCi0JT1VUIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSk7CitCT09MRUFOIFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHZvaWQgKiBwTXNnLAorCQkJCSB1bnNpZ25lZCBsb25nIE1zZ0xlbiwgdTggKnBBZGRyMik7CiAKLUJPT0xFQU4gUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKnBNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotCU9VVCBQVUNIQVIgcEFkZHIyKTsKK0JPT0xFQU4gUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgdm9pZCAqIHBNc2csIHVuc2lnbmVkIGxvbmcgTXNnTGVuKTsKIAotQk9PTEVBTiBQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqcE1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4pOworQk9PTEVBTiBQZWVyRGVsQkFBY3Rpb25TYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTggV2NpZCwgdm9pZCAqIHBNc2csIHVuc2lnbmVkIGxvbmcgTXNnTGVuKTsKIAotQk9PTEVBTiBQZWVyRGVsQkFBY3Rpb25TYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVUNIQVIgV2NpZCwKLSAgICBJTiBWT0lEICpwTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbik7CitCT09MRUFOIE1sbWVBc3NvY1JlcVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB2b2lkICogTXNnLAorCQkJICAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkgICB1OCAqcEFwQWRkciwKKwkJCSAgIHUxNiAqIENhcGFiaWxpdHlJbmZvLAorCQkJICAgdW5zaWduZWQgbG9uZyAqIFRpbWVvdXQsIHUxNiAqIExpc3RlbkludHYpOwogCi1CT09MRUFOIE1sbWVBc3NvY1JlcVNhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVk9JRCAqTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQXBBZGRyLAotCU9VVCBVU0hPUlQgKkNhcGFiaWxpdHlJbmZvLAotCU9VVCBVTE9ORyAqVGltZW91dCwKLQlPVVQgVVNIT1JUICpMaXN0ZW5JbnR2KTsKK0JPT0xFQU4gTWxtZUF1dGhSZXFTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICB2b2lkICogTXNnLAorCQkJICB1bnNpZ25lZCBsb25nIE1zZ0xlbiwKKwkJCSAgdTggKnBBZGRyLAorCQkJICB1bnNpZ25lZCBsb25nICogVGltZW91dCwgdTE2ICogQWxnKTsKIAotQk9PTEVBTiBNbG1lQXV0aFJlcVNhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVk9JRCAqTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQWRkciwKLQlPVVQgVUxPTkcgKlRpbWVvdXQsCi0JT1VUIFVTSE9SVCAqQWxnKTsKK0JPT0xFQU4gTWxtZVN0YXJ0UmVxU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHZvaWQgKiBNc2csCisJCQkgICB1bnNpZ25lZCBsb25nIE1zZ0xlbiwKKwkJCSAgIGNoYXIgU3NpZFtdLCB1OCAqIFNzaWRsZW4pOwogCi1CT09MRUFOIE1sbWVTdGFydFJlcVNhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVk9JRCAqTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JT1VUIENIQVIgU3NpZFtdLAotCU9VVCBVQ0hBUiAqU3NpZGxlbik7CitCT09MRUFOIFBlZXJBdXRoU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHZvaWQgKiBNc2csCisJCSAgICAgICB1bnNpZ25lZCBsb25nIE1zZ0xlbiwKKwkJICAgICAgIHU4ICpwQWRkciwKKwkJICAgICAgIHUxNiAqIEFsZywKKwkJICAgICAgIHUxNiAqIFNlcSwKKwkJICAgICAgIHUxNiAqIFN0YXR1cywgY2hhciBDaGxnVGV4dFtdKTsKIAotQk9PTEVBTiBQZWVyQXV0aFNhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVk9JRCAqTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQWRkciwKLQlPVVQgVVNIT1JUICpBbGcsCi0JT1VUIFVTSE9SVCAqU2VxLAotCU9VVCBVU0hPUlQgKlN0YXR1cywKLQlPVVQgQ0hBUiBDaGxnVGV4dFtdKTsKK0JPT0xFQU4gUGVlckFzc29jUnNwU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqIHBNc2csIHVuc2lnbmVkIGxvbmcgTXNnTGVuLCB1OCAqcEFkZHIyLCB1MTYgKiBwQ2FwYWJpbGl0eUluZm8sIHUxNiAqIHBTdGF0dXMsIHUxNiAqIHBBaWQsIHU4IFN1cFJhdGVbXSwgdTggKiBwU3VwUmF0ZUxlbiwgdTggRXh0UmF0ZVtdLCB1OCAqIHBFeHRSYXRlTGVuLCBzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSAqIHBIdENhcGFiaWxpdHksIHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSAqIHBBZGRIdEluZm8sCS8qIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRSAqLworCQkJICAgdTggKiBwSHRDYXBhYmlsaXR5TGVuLAorCQkJICAgdTggKiBwQWRkSHRJbmZvTGVuLAorCQkJICAgdTggKiBwTmV3RXh0Q2hhbm5lbE9mZnNldCwKKwkJCSAgIHN0cnVjdCBydF9lZGNhX3Bhcm0gKnBFZGNhUGFybSwgdTggKiBwQ2tpcEZsYWcpOwogCi1CT09MRUFOIFBlZXJBc3NvY1JzcFNhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiBWT0lEICpwTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQWRkcjIsCi0JT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAotCU9VVCBVU0hPUlQgKnBTdGF0dXMsCi0JT1VUIFVTSE9SVCAqcEFpZCwKLQlPVVQgVUNIQVIgU3VwUmF0ZVtdLAotCU9VVCBVQ0hBUiAqcFN1cFJhdGVMZW4sCi0JT1VUIFVDSEFSIEV4dFJhdGVbXSwKLQlPVVQgVUNIQVIgKnBFeHRSYXRlTGVuLAotICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKLSAgICBPVVQgQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLSAgICBPVVQgVUNIQVIJCQkqcEh0Q2FwYWJpbGl0eUxlbiwKLSAgICBPVVQgVUNIQVIJCQkqcEFkZEh0SW5mb0xlbiwKLSAgICBPVVQgVUNIQVIJCQkqcE5ld0V4dENoYW5uZWxPZmZzZXQsCi0JT1VUIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotCU9VVCBVQ0hBUiAqcENraXBGbGFnKTsKK0JPT0xFQU4gUGVlckRpc2Fzc29jU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHZvaWQgKiBNc2csCisJCQkgICB1bnNpZ25lZCBsb25nIE1zZ0xlbiwKKwkJCSAgIHU4ICpwQWRkcjIsIHUxNiAqIFJlYXNvbik7CiAKLUJPT0xFQU4gUGVlckRpc2Fzc29jU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBWT0lEICpNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBZGRyMiwKLQlPVVQgVVNIT1JUICpSZWFzb24pOworQk9PTEVBTiBQZWVyV3BhTWVzc2FnZVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKiBwTXNnLAorCQkJICAgICB1bnNpZ25lZCBsb25nIE1zZ0xlbiwKKwkJCSAgICAgdTggTXNnVHlwZSwgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5KTsKIAotQk9PTEVBTiBQZWVyRGVhdXRoU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBWT0lEICpNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBZGRyMiwKLQlPVVQgVVNIT1JUICpSZWFzb24pOworQk9PTEVBTiBQZWVyRGVhdXRoU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSB2b2lkICogTXNnLAorCQkJIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJIHU4ICpwQWRkcjIsIHUxNiAqIFJlYXNvbik7CiAKLUJPT0xFQU4gUGVlclByb2JlUmVxU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBWT0lEICpNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBZGRyMiwKLQlPVVQgQ0hBUiBTc2lkW10sCi0JT1VUIFVDSEFSICpwU3NpZExlbik7CitCT09MRUFOIFBlZXJQcm9iZVJlcVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB2b2lkICogTXNnLAorCQkJICAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkgICB1OCAqcEFkZHIyLAorCQkJICAgY2hhciBTc2lkW10sIHU4ICogcFNzaWRMZW4pOwogCi1CT09MRUFOIEdldFRpbUJpdCgKLQlJTiAgQ0hBUiAqUHRyLAotCUlOICBVU0hPUlQgQWlkLAotCU9VVCBVQ0hBUiAqVGltTGVuLAotCU9VVCBVQ0hBUiAqQmNhc3RGbGFnLAotCU9VVCBVQ0hBUiAqRHRpbUNvdW50LAotCU9VVCBVQ0hBUiAqRHRpbVBlcmlvZCwKLQlPVVQgVUNIQVIgKk1lc3NhZ2VUb01lKTsKK0JPT0xFQU4gR2V0VGltQml0KGNoYXIgKiBQdHIsCisJCSAgdTE2IEFpZCwKKwkJICB1OCAqIFRpbUxlbiwKKwkJICB1OCAqIEJjYXN0RmxhZywKKwkJICB1OCAqIER0aW1Db3VudCwKKwkJICB1OCAqIER0aW1QZXJpb2QsIHU4ICogTWVzc2FnZVRvTWUpOwogCi1VQ0hBUiBDaGFubmVsU2FuaXR5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSIGNoYW5uZWwpOwordTggQ2hhbm5lbFNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IGNoYW5uZWwpOwogCi1ORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgTmV0d29ya1R5cGVJblVzZVNhbml0eSgKLQlJTiBQQlNTX0VOVFJZIHBCc3MpOworTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoc3RydWN0IHJ0X2Jzc19lbnRyeSAqcEJzcyk7CiAKLUJPT0xFQU4gTWxtZURlbEJBUmVxU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4pOworQk9PTEVBTiBNbG1lRGVsQkFSZXFTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdm9pZCAqIE1zZywgdW5zaWduZWQgbG9uZyBNc2dMZW4pOwogCi1CT09MRUFOIE1sbWVBZGRCQVJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyKTsKK0JPT0xFQU4gTWxtZUFkZEJBUmVxU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHZvaWQgKiBNc2csIHVuc2lnbmVkIGxvbmcgTXNnTGVuLCB1OCAqcEFkZHIyKTsKIAotVUxPTkcgTWFrZU91dGdvaW5nRnJhbWUoCi0JT1VUIENIQVIgKkJ1ZmZlciwKLQlPVVQgVUxPTkcgKkxlbmd0aCwgLi4uKTsKK3Vuc2lnbmVkIGxvbmcgTWFrZU91dGdvaW5nRnJhbWUodTggKiBCdWZmZXIsIHVuc2lnbmVkIGxvbmcgKiBMZW5ndGgsIC4uLik7CiAKLVZPSUQgIExmc3JJbml0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVTE9ORyBTZWVkKTsKK3ZvaWQgTGZzckluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1bnNpZ25lZCBsb25nIFNlZWQpOwogCi1VQ0hBUiBSYW5kb21CeXRlKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3U4IFJhbmRvbUJ5dGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBBc2ljVXBkYXRlQXV0b0ZhbGxCYWNrVGFibGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcFR4UmF0ZSk7Cit2b2lkIEFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICpwVHhSYXRlKTsKIAotVk9JRCAgTWxtZVBlcmlvZGljRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwordm9pZCBNbG1lUGVyaW9kaWNFeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CiAKLVZPSUQgTGlua0Rvd25FeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Cit2b2lkIExpbmtEb3duRXhlYyh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAotVk9JRCBTVEFNbG1lUGVyaW9kaWNFeGVjKAotCVBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgU1RBTWxtZVBlcmlvZGljRXhlYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIE1sbWVBdXRvU2NhbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIE1sbWVBdXRvU2NhbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIE1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLUJPT0xFQU4gTWxtZVZhbGlkYXRlU1NJRCgKLQlJTiBQVUNIQVIgcFNzaWQsCi0JSU4gVUNIQVIgIFNzaWRMZW4pOworQk9PTEVBTiBNbG1lVmFsaWRhdGVTU0lEKHU4ICpwU3NpZCwgdTggU3NpZExlbik7CiAKLVZPSUQgTWxtZUNoZWNrRm9yUm9hbWluZygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVTE9ORyAgICBOb3czMik7Cit2b2lkIE1sbWVDaGVja0ZvclJvYW1pbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1bnNpZ25lZCBsb25nIE5vdzMyKTsKIAotVk9JRCBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUxPTkcgICAgICAgICAgIE5vdyk7CitCT09MRUFOIE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIE1sbWVTZXRUeFJhdGUoCi0JSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKLQlJTiBQUlRNUF9UWF9SQVRFX1NXSVRDSAlwVHhSYXRlKTsKK3ZvaWQgTWxtZVNldFR4UmF0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwgc3RydWN0IHJ0X3J0bXBfdHhfcmF0ZV9zd2l0Y2ggKiBwVHhSYXRlKTsKIAotVk9JRCBNbG1lU2VsZWN0VHhSYXRlVGFibGUoCi0JSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKLQlJTiBQVUNIQVIJCQkJKnBwVGFibGUsCi0JSU4gUFVDSEFSCQkJCXBUYWJsZVNpemUsCi0JSU4gUFVDSEFSCQkJCXBJbml0VHhSYXRlSWR4KTsKK3ZvaWQgTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJCSAgIHU4ICoqIHBwVGFibGUsCisJCQkgICB1OCAqcFRhYmxlU2l6ZSwgdTggKnBJbml0VHhSYXRlSWR4KTsKIAotVk9JRCBNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUxPTkcgTm93KTsKK3ZvaWQgTWxtZUNhbGN1bGF0ZUNoYW5uZWxRdWFsaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5LCB1bnNpZ25lZCBsb25nIE5vdyk7CiAKLVZPSUQgTWxtZUNoZWNrUHNtQ2hhbmdlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVMT05HICAgIE5vdzMyKTsKK3ZvaWQgTWxtZUNoZWNrUHNtQ2hhbmdlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdW5zaWduZWQgbG9uZyBOb3czMik7CiAKLVZPSUQgTWxtZVNldFBzbUJpdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgcHNtKTsKK3ZvaWQgTWxtZVNldFBzbUJpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHUxNiBwc20pOwogCi1WT0lEIE1sbWVTZXRUeFByZWFtYmxlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVCBUeFByZWFtYmxlKTsKK3ZvaWQgTWxtZVNldFR4UHJlYW1ibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MTYgVHhQcmVhbWJsZSk7CiAKLVZPSUQgVXBkYXRlQmFzaWNSYXRlQml0bWFwKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKK3ZvaWQgVXBkYXRlQmFzaWNSYXRlQml0bWFwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgTWxtZVVwZGF0ZVR4UmF0ZXMoCi0JSU4gUFJUTVBfQURBUFRFUiAJcEFkLAotCUlOIAlCT09MRUFOCQkgCWJMaW5rVXAsCi0JSU4JVUNIQVIJCQlhcGlkeCk7Cit2b2lkIE1sbWVVcGRhdGVUeFJhdGVzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIElOIEJPT0xFQU4gYkxpbmtVcCwgdTggYXBpZHgpOwogCi1WT0lEIE1sbWVVcGRhdGVIdFR4UmF0ZXMoCi0JSU4gUFJUTVBfQURBUFRFUiAJCXBBZCwKLQlJTglVQ0hBUgkJCQlhcGlkeCk7Cit2b2lkIE1sbWVVcGRhdGVIdFR4UmF0ZXMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBhcGlkeCk7CiAKLVZPSUQgICAgUlRNUENoZWNrUmF0ZXMoCi0JSU4gICAgICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIE9VVCAgVUNIQVIgICAgICAgICAgIFN1cFJhdGVbXSwKLQlJTiBPVVQgIFVDSEFSICAgICAgICAgICAqU3VwUmF0ZUxlbik7Cit2b2lkIFJUTVBDaGVja1JhdGVzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgIElOIHU4IFN1cFJhdGVbXSwgSU4gdTggKiBTdXBSYXRlTGVuKTsKIAotQk9PTEVBTiBSVE1QQ2hlY2tDaGFubmVsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCQlDZW50cmFsQ2hhbm5lbCwKLQlJTiBVQ0hBUgkJQ2hhbm5lbCk7CitCT09MRUFOIFJUTVBDaGVja0NoYW5uZWwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHU4IENlbnRyYWxDaGFubmVsLCB1OCBDaGFubmVsKTsKIAotQk9PTEVBTiAJUlRNUENoZWNrSHQoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCQlVQ0hBUglXY2lkLAotCUlOIE9VVAlIVF9DQVBBQklMSVRZX0lFCQkJKnBIdENhcGFiaWxpdHksCi0JSU4gT1VUCUFERF9IVF9JTkZPX0lFCQkJKnBBZGRIdEluZm8pOworQk9PTEVBTiBSVE1QQ2hlY2tIdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICB1OCBXY2lkLAorCQkgICAgc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUgKiBwSHRDYXBhYmlsaXR5LAorCQkgICAgc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llICogcEFkZEh0SW5mbyk7CiAKLVZPSUQgU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwordm9pZCBTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJCQkgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJCQkgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwKKwkJCQkgIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CiAKLVZPSUQgUlRNUFVwZGF0ZU1sbWVSYXRlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKK3ZvaWQgUlRNUFVwZGF0ZU1sbWVSYXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLUNIQVIgUlRNUE1heFJzc2koCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gQ0hBUgkJCQlSc3NpMCwKLQlJTiBDSEFSCQkJCVJzc2kxLAotCUlOIENIQVIJCQkJUnNzaTIpOworY2hhciBSVE1QTWF4UnNzaShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSBjaGFyIFJzc2kwLCBjaGFyIFJzc2kxLCBjaGFyIFJzc2kyKTsKIAotVk9JRCBBc2ljU2V0UnhBbnQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlBbnQpOworI2lmZGVmIFJUMzB4eAordm9pZCBBc2ljU2V0UnhBbnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBBbnQpOwogCi1WT0lEIEFzaWNFdmFsdWF0ZVJ4QW50KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKK3ZvaWQgUlRNUEZpbHRlckNhbGlicmF0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgQXNpY1J4QW50RXZhbFRpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKyNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKKy8qMjAwOC8wOS8xMTpLSCBhZGQgdG8gc3VwcG9ydCBlZnVzZTwtLSAqLworaW50IHNldF9lRnVzZUdldEZyZWVCbG9ja0NvdW50X1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyICphcmcpOwogCi1WT0lEIEFQU0RQZXJpb2RpY0V4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKK2ludCBzZXRfZUZ1c2VkdW1wX1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyICphcmcpOwogCi1CT09MRUFOIFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2goCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpOwordm9pZCBlRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJdTE2IE9mZnNldCwKKwkJCQl1MTYgTGVuZ3RoLCB1MTYgKiBwRGF0YSk7CiAKLVVDSEFSIFJUTVBTdGFGaXhlZFR4TW9kZSgKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSk7CitpbnQgUnRtcEVmdXNlU3VwcG9ydENoZWNrKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygKLQkJVUNIQVIJCQkJZml4ZWRfdHhfbW9kZSwKLQkJUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpOwordm9pZCBlRnVzZUdldEZyZWVCbG9ja0NvdW50KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTMyICpFZnVzZUZyZWVCbG9jayk7CiAKLUJPT0xFQU4gUlRNUEF1dG9SYXRlU3dpdGNoQ2hlY2soCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQpOworaW50IGVGdXNlX2luaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKKy8qMjAwOC8wOS8xMTpLSCBhZGQgdG8gc3VwcG9ydCBlZnVzZS0tPiAqLworI2VuZGlmIC8qIFJUTVBfRUZVU0VfU1VQUE9SVCAvLyAqLwogCi1ORElTX1NUQVRVUyBNbG1lSW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisvKiBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cCAqLwordm9pZCBSVDMweHhMb2FkUkZOb3JtYWxNb2RlU2V0dXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBNbG1lSGFuZGxlcigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIFJUMzB4eExvYWRSRlNsZWVwTW9kZVNldHVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgTWxtZUhhbHQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBSVDMweHhSZXZlcnNlUkZTbGVlcE1vZGVTZXR1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworLyogZW5kIGpvaG5saSAqLwogCi1WT0lEIE1sbWVSZXNldFJhbGlua0NvdW50ZXJzKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKyNpZmRlZiBSVDMwNzAKK3ZvaWQgTklDSW5pdFJUMzA3MFJGUmVnaXN0ZXJzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CisjZW5kaWYgLyogUlQzMDcwIC8vICovCisjaWZkZWYgUlQzMDkwCit2b2lkIE5JQ0luaXRSVDMwOTBSRlJlZ2lzdGVycyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworI2VuZGlmIC8qIFJUMzA5MCAvLyAqLwogCi1WT0lEIEJ1aWxkQ2hhbm5lbExpc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBSVDMweHhIYWx0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVVDSEFSIEZpcnN0Q2hhbm5lbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIFJUMzB4eFNldFJ4QW50KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQW50KTsKKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KIAotVUNIQVIgTmV4dENoYW5uZWwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSIGNoYW5uZWwpOwordm9pZCBBc2ljRXZhbHVhdGVSeEFudChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIENoYW5nZVRvQ2VsbFBvd2VyTGltaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgICAgICAgICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpOwordm9pZCBBc2ljUnhBbnRFdmFsVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCQkgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJCSAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOwogCi1VU0hPUlQgUlRNUF9FRVBST01fUkVBRDE2KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVU0hPUlQgT2Zmc2V0KTsKK3ZvaWQgQVBTRFBlcmlvZGljRXhlYyh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSAgICAgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOwogCi1WT0lEIFJUTVBfRUVQUk9NX1dSSVRFMTYoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVTSE9SVCBPZmZzZXQsCi0JSU4gIFVTSE9SVCBEYXRhKTsKK0JPT0xFQU4gUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSk7CiAKLS8vCi0vLyBQcm90b3R5cGVzIG9mIGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gcnRtcF90a2lwLmMKLS8vCi1WT0lEICAgIFJUTVBJbml0VGtpcEVuZ2luZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBUS2V5LAotCUlOICBVQ0hBUiAgICAgICAgICAgS2V5SWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwVEEsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwTUlDS2V5LAotCUlOICBQVUNIQVIgICAgICAgICAgcFRTQywKLQlPVVQgUFVMT05HICAgICAgICAgIHBJVjE2LAotCU9VVCBQVUxPTkcgICAgICAgICAgcElWMzIpOwordTggUlRNUFN0YUZpeGVkVHhNb2RlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5KTsKIAotVk9JRCAgICBSVE1QSW5pdE1JQ0VuZ2luZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBLZXksCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwREEsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwU0EsCi0JSU4gIFVDSEFSICAgICAgICAgICBVc2VyUHJpb3JpdHksCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwTUlDS2V5KTsKK3ZvaWQgUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZyh1OCBmaXhlZF90eF9tb2RlLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpOwogCi1CT09MRUFOIFJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTQSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXksCi0JSU4JVUNIQVIJCQlVc2VyUHJpb3JpdHksCi0JSU4gIFVJTlQgICAgICAgICAgICBMZW4pOworQk9PTEVBTiBSVE1QQXV0b1JhdGVTd2l0Y2hDaGVjayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEICAgIFJUTVBDYWxjdWxhdGVNSUNWYWx1ZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRW5jYXAsCi0JSU4gIFBDSVBIRVJfS0VZICAgICBwS2V5LAotCUlOCVVDSEFSCQkJYXBpZHgpOworaW50IE1sbWVJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLUJPT0xFQU4gUlRNUFRraXBDb21wYXJlTUlDVmFsdWVXaXRoTExDKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcExMQywKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwREEsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwU0EsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwTUlDS2V5LAotCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKK3ZvaWQgTWxtZUhhbmRsZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCAgICBSVE1QVGtpcEFwcGVuZEJ5dGUoCi0JSU4gIFBUS0lQX0tFWV9JTkZPICBwVGtpcCwKLQlJTiAgVUNIQVIgICAgICAgICAgIHVDaGFyKTsKK3ZvaWQgTWxtZUhhbHQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCAgICBSVE1QVGtpcEFwcGVuZCgKLQlJTiAgUFRLSVBfS0VZX0lORk8gIHBUa2lwLAotCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKLQlJTiAgVUlOVCAgICAgICAgICAgIG5CeXRlcyk7Cit2b2lkIE1sbWVSZXNldFJhbGlua0NvdW50ZXJzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgICAgUlRNUFRraXBHZXRNSUMoCi0JSU4gIFBUS0lQX0tFWV9JTkZPICBwVGtpcCk7Cit2b2lkIEJ1aWxkQ2hhbm5lbExpc3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotQk9PTEVBTiBSVE1QU29mdERlY3J5cHRUS0lQKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUglwRGF0YSwKLQlJTiBVTE9ORwlEYXRhQnl0ZUNudCwKLQlJTiBVQ0hBUiAgICBVc2VyUHJpb3JpdHksCi0JSU4gUENJUEhFUl9LRVkJcFdwYUtleSk7Cit1OCBGaXJzdENoYW5uZWwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotQk9PTEVBTiBSVE1QU29mdERlY3J5cHRBRVMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSCXBEYXRhLAotCUlOIFVMT05HCURhdGFCeXRlQ250LAotCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpOwordTggTmV4dENoYW5uZWwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBjaGFubmVsKTsKIAotLy8KLS8vIFByb3RvdHlwZXMgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiBjbW1faW5mby5jCi0vLwotTkRJU19TVEFUVVMgUlRNUFdQQVJlbW92ZUtleVByb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBWT0lEICAgICAgICAgICBwQnVmKTsKK3ZvaWQgQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgdTggQWlyb25ldENlbGxQb3dlckxpbWl0KTsKIAotVk9JRCAgICBSVE1QV1BBUmVtb3ZlQWxsS2V5cygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisvKiAqLworLyogUHJvdG90eXBlcyBvZiBmdW5jdGlvbiBkZWZpbml0aW9uIGluIHJ0bXBfdGtpcC5jICovCisvKiAqLwordm9pZCBSVE1QSW5pdFRraXBFbmdpbmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJdTggKnBUS2V5LAorCQkJdTggS2V5SWQsCisJCQl1OCAqcFRBLAorCQkJdTggKnBNSUNLZXksCisJCQl1OCAqcFRTQywgdW5zaWduZWQgbG9uZyAqcElWMTYsIHVuc2lnbmVkIGxvbmcgKnBJVjMyKTsKIAotQk9PTEVBTiBSVE1QQ2hlY2tTdHJQcmludEFibGUoCi0gICAgSU4gIENIQVIgKnBJblB1dFN0ciwKLSAgICBJTiAgVUNIQVIgc3RyTGVuKTsKK3ZvaWQgUlRNUEluaXRNSUNFbmdpbmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgdTggKnBLZXksCisJCSAgICAgICB1OCAqcERBLAorCQkgICAgICAgdTggKnBTQSwgdTggVXNlclByaW9yaXR5LCB1OCAqcE1JQ0tleSk7CiAKLVZPSUQgICAgUlRNUFNldFBoeU1vZGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVMT05HIHBoeW1vZGUpOworQk9PTEVBTiBSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJdTggKnBTcmMsCisJCQkJdTggKnBEQSwKKwkJCQl1OCAqcFNBLAorCQkJCXU4ICpwTUlDS2V5LAorCQkJCXU4IFVzZXJQcmlvcml0eSwgdTMyIExlbik7CiAKLVZPSUQJUlRNUFVwZGF0ZUhUSUUoCi0JSU4JUlRfSFRfQ0FQQUJJTElUWQkqcFJ0SHQsCi0JSU4JCVVDSEFSCQkJCSpwTWNzU2V0LAotCU9VVAkJSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKLQlPVVQJCUFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbyk7Cit2b2lkIFJUTVBDYWxjdWxhdGVNSUNWYWx1ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB2b2lkICpwUGFja2V0LAorCQkJICAgdTggKnBFbmNhcCwKKwkJCSAgIHN0cnVjdCBydF9jaXBoZXJfa2V5ICpwS2V5LCB1OCBhcGlkeCk7CiAKLVZPSUQJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUJzc0lkeCwKLQlJTiAJVUNIQVIJCSAJS2V5SWR4LAotCUlOIAlVQ0hBUgkJIAlDaXBoZXJBbGcsCi0JSU4gCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KTsKK3ZvaWQgUlRNUFRraXBBcHBlbmRCeXRlKHN0cnVjdCBydF90a2lwX2tleV9pbmZvICpwVGtpcCwgdTggdUNoYXIpOwogCi1DSEFSICpHZXRFbmNyeXB0VHlwZSgKLQlDSEFSIGVuYyk7Cit2b2lkIFJUTVBUa2lwQXBwZW5kKHN0cnVjdCBydF90a2lwX2tleV9pbmZvICpwVGtpcCwgdTggKnBTcmMsIHUzMiBuQnl0ZXMpOwogCi1DSEFSICpHZXRBdXRoTW9kZSgKLQlDSEFSIGF1dGgpOwordm9pZCBSVE1QVGtpcEdldE1JQyhzdHJ1Y3QgcnRfdGtpcF9rZXlfaW5mbyAqcFRraXApOwogCi1WT0lEIFJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7CitCT09MRUFOIFJUTVBTb2Z0RGVjcnlwdFRLSVAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHU4ICpwRGF0YSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIERhdGFCeXRlQ250LAorCQkJICAgIHU4IFVzZXJQcmlvcml0eSwgc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBXcGFLZXkpOwogCi1WT0lEIFJUTVBJb2N0bEdldE1hY1RhYmxlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIHN0cnVjdCBpd3JlcSAqd3JxKTsKK0JPT0xFQU4gUlRNUFNvZnREZWNyeXB0QUVTKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHU4ICpwRGF0YSwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgRGF0YUJ5dGVDbnQsIHN0cnVjdCBydF9jaXBoZXJfa2V5ICpwV3BhS2V5KTsKIAotVk9JRCAgICBSVE1QQWRkQlNTSURDaXBoZXIoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JVUNIQVIJQWlkLAotICAgIElOICBQTkRJU184MDJfMTFfS0VZICAgIHBLZXksCi0gICAgSU4gIFVDSEFSICAgQ2lwaGVyQWxnKTsKKy8qICovCisvKiBQcm90b3R5cGVzIG9mIGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gY21tX2luZm8uYyAqLworLyogKi8KK2ludCBSVF9DZmdTZXRDb3VudHJ5UmVnaW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgY2hhciAqYXJnLCBpbnQgYmFuZCk7CiAKLVZPSUQJUlRNUFNldEhUKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU9JRF9TRVRfSFRfUEhZTU9ERSAqcEhUUGh5TW9kZSk7CitpbnQgUlRfQ2ZnU2V0V2lyZWxlc3NNb2RlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgY2hhciAqYXJnKTsKIAotVk9JRAlSVE1QU2V0SW5kaXZpZHVhbEhUKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglVQ0hBUgkJCQlhcGlkeCk7CitpbnQgUlRfQ2ZnU2V0U2hvcnRTbG90KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgY2hhciAqYXJnKTsKIAotVk9JRCBSVE1QU2VuZFdpcmVsZXNzRXZlbnQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJRXZlbnRfZmxhZywKLQlJTglQVUNIQVIgCQkJcEFkZHIsCi0JSU4gIFVDSEFSCQkJQnNzSWR4LAotCUlOCUNIQVIJCQlSc3NpKTsKK2ludCBSVF9DZmdTZXRXZXBLZXkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgY2hhciAqa2V5U3RyaW5nLAorCQkgICAgc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBTaGFyZWRLZXksIGludCBrZXlJZHgpOwogCi0vLwotLy8gcHJvdG90eXBlIGluIHdwYS5jCi0vLwotQk9PTEVBTiBXcGFNc2dUeXBlU3Vic3QoCi0JSU4gIFVDSEFSICAgRUFQVHlwZSwKLQlPVVQgSU5UCQkqTXNnVHlwZSk7CitpbnQgUlRfQ2ZnU2V0V1BBUFNLS2V5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIGNoYXIgKmtleVN0cmluZywKKwkJICAgICAgIHU4ICogcEhhc2hTdHIsCisJCSAgICAgICBpbnQgaGFzaFN0ckxlbiwgdTggKnBQTUtCdWYpOwogCi1WT0lEIFdwYVBza1N0YXRlTWFjaGluZUluaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAotCUlOICBTVEFURV9NQUNISU5FICAgICAgICpTLAotCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisvKiAqLworLyogUHJvdG90eXBlcyBvZiBmdW5jdGlvbiBkZWZpbml0aW9uIGluIGNtbV9pbmZvLmMgKi8KKy8qICovCit2b2lkIFJUTVBXUEFSZW1vdmVBbGxLZXlzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgV3BhRUFQT0xLZXlBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFJUTVBTZXRQaHlNb2RlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdW5zaWduZWQgbG9uZyBwaHltb2RlKTsKIAotVk9JRCAgICBXcGFQYWlyTXNnMUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUlRNUFVwZGF0ZUhUSUUoc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHkgKnBSdEh0LAorCQkgICAgdTggKiBwTWNzU2V0LAorCQkgICAgc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUgKiBwSHRDYXBhYmlsaXR5LAorCQkgICAgc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llICogcEFkZEh0SW5mbyk7CiAKLVZPSUQgICAgV3BhUGFpck1zZzNBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIHU4IEJzc0lkeCwKKwkJCSAgICAgICB1OCBLZXlJZHgsCisJCQkgICAgICAgdTggQ2lwaGVyQWxnLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpOwogCi1WT0lEICAgIFdwYUdyb3VwTXNnMUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK2NoYXIgKkdldEVuY3J5cHRUeXBlKGNoYXIgZW5jKTsKIAotVk9JRCAgICBXcGFNYWNIZWFkZXJJbml0KAotCUlOICAgICAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiBPVVQgIFBIRUFERVJfODAyXzExICBwSGRyODAyMTEsCi0JSU4gICAgICBVQ0hBUiAgICAgICAgICAgd2VwLAotCUlOICAgICAgUFVDSEFSICAgICAgICAgIHBBZGRyMSk7CitjaGFyICpHZXRBdXRoTW9kZShjaGFyIGF1dGgpOwogCi1WT0lEICAgIFdwYTJQYWlyTXNnMUFjdGlvbigKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUlRNUFNldEhUKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X29pZF9zZXRfaHRfcGh5bW9kZSAqcEhUUGh5TW9kZSk7CiAKLVZPSUQgICAgV3BhMlBhaXJNc2czQWN0aW9uKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBSVE1QU2V0SW5kaXZpZHVhbEhUKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggYXBpZHgpOwogCi1CT09MRUFOIFBhcnNlS2V5RGF0YSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIHBLZXlEYXRhLAotICAgIElOICBVQ0hBUiAgICAgICAgICAgS2V5RGF0YUxlbiwKLQlJTglVQ0hBUgkJCWJQYWlyZXdpc2UpOwordm9pZCBSVE1QU2VuZFdpcmVsZXNzRXZlbnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdTE2IEV2ZW50X2ZsYWcsCisJCQkgICB1OCAqcEFkZHIsIHU4IEJzc0lkeCwgY2hhciBSc3NpKTsKIAotVk9JRCAgICBSVE1QVG9XaXJlbGVzc1N0YSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBIZWFkZXI4MDJfMywKLSAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAotICAgIElOICBVSU5UICAgICAgICAgICAgRGF0YUxlbiwKLSAgICBJTglCT09MRUFOCQkJaXM0d2F5RnJhbWUpOworY2hhciBDb252ZXJ0VG9Sc3NpKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgY2hhciBSc3NpLCB1OCBSc3NpTnVtYmVyKTsKIAotVk9JRCAgICBITUFDX1NIQTEoCi0JSU4gIFVDSEFSICAgKnRleHQsCi0JSU4gIFVJTlQgICAgdGV4dF9sZW4sCi0JSU4gIFVDSEFSICAgKmtleSwKLQlJTiAgVUlOVCAgICBrZXlfbGVuLAotCUlOICBVQ0hBUiAgICpkaWdlc3QpOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCUZ1bmN0aW9uIHByb3RvdHlwZSBpbiBjbW1fd3BhLmMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3ZvaWQgUlRNUFRvV2lyZWxlc3NTdGEoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkgICAgICAgdTggKnBIZWFkZXI4MDJfMywKKwkJICAgICAgIHUzMiBIZHJMZW4sCisJCSAgICAgICB1OCAqcERhdGEsCisJCSAgICAgICB1MzIgRGF0YUxlbiwgSU4gQk9PTEVBTiBiQ2xlYXJGcmFtZSk7CiAKLVZPSUQgICAgUFJGKAotCUlOICBVQ0hBUiAgICprZXksCi0JSU4gIElOVCAgICAga2V5X2xlbiwKLQlJTiAgVUNIQVIgICAqcHJlZml4LAotCUlOICBJTlQgICAgIHByZWZpeF9sZW4sCi0JSU4gIFVDSEFSICAgKmRhdGEsCi0JSU4gIElOVCAgICAgZGF0YV9sZW4sCi0JT1VUIFVDSEFSICAgKm91dHB1dCwKLQlJTiAgSU5UICAgICBsZW4pOwordm9pZCBXcGFEZXJpdmVQVEsoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgIHU4ICogUE1LLAorCQkgIHU4ICogQU5vbmNlLAorCQkgIHU4ICogQUEsCisJCSAgdTggKiBTTm9uY2UsCisJCSAgdTggKiBTQSwgdTggKiBvdXRwdXQsIHUzMiBsZW4pOwogCi1WT0lEICAgIENDS01QUkYoCi0JSU4gIFVDSEFSICAgKmtleSwKLQlJTiAgSU5UICAgICBrZXlfbGVuLAotCUlOICBVQ0hBUiAgICpkYXRhLAotCUlOICBJTlQgICAgIGRhdGFfbGVuLAotCU9VVCBVQ0hBUiAgICpvdXRwdXQsCi0JSU4gIElOVCAgICAgbGVuKTsKK3ZvaWQgR2VuUmFuZG9tKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKiBtYWNBZGRyLCB1OCAqIHJhbmRvbSk7CiAKLVZPSUQgV3BhQ291bnRQVEsoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgKlBNSywKLQlJTiAgVUNIQVIgICAqQU5vbmNlLAotCUlOICBVQ0hBUiAgICpBQSwKLQlJTiAgVUNIQVIgICAqU05vbmNlLAotCUlOICBVQ0hBUiAgICpTQSwKLQlPVVQgVUNIQVIgICAqb3V0cHV0LAotCUlOICBVSU5UICAgIGxlbik7CitCT09MRUFOIFJUTVBDaGVja1dQQWZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkJICB1OCAqcERhdGEsCisJCQkgIHVuc2lnbmVkIGxvbmcgRGF0YUJ5dGVDb3VudCwgdTggRnJvbVdoaWNoQlNTSUQpOwogCi1WT0lEICAgIEdlblJhbmRvbSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglVQ0hBUgkJCSptYWNBZGRyLAotCU9VVAlVQ0hBUgkJCSpyYW5kb20pOwordm9pZCBBRVNfR1RLX0tFWV9VTldSQVAodTggKiBrZXksCisJCQl1OCAqIHBsYWludGV4dCwKKwkJCXUzMiBjX2xlbiwgdTggKiBjaXBoZXJ0ZXh0KTsKIAotLy8KLS8vIHByb3RvdHlwZSBpbiBhaXJvbmV0LmMKLS8vCi1WT0lEICAgIEFpcm9uZXRTdGF0ZU1hY2hpbmVJbml0KAotCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKLQlJTiAgU1RBVEVfTUFDSElORSAgICAgICAqUywKLQlPVVQgU1RBVEVfTUFDSElORV9GVU5DICBUcmFuc1tdKTsKK0JPT0xFQU4gUlRNUFBhcnNlRWFwb2xLZXlEYXRhKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHU4ICpwS2V5RGF0YSwKKwkJCSAgICAgIHU4IEtleURhdGFMZW4sCisJCQkgICAgICB1OCBHcm91cEtleUluZGV4LAorCQkJICAgICAgdTggTXNnVHlwZSwKKwkJCSAgICAgIElOIEJPT0xFQU4gYldQQTIsIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSk7CiAKLVZPSUQgICAgQWlyb25ldE1zZ0FjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgQ29uc3RydWN0RWFwb2xNc2coc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkgICAgICAgdTggR3JvdXBLZXlXZXBTdGF0dXMsCisJCSAgICAgICB1OCBNc2dUeXBlLAorCQkgICAgICAgdTggRGVmYXVsdEtleUlkeCwKKwkJICAgICAgIHU4ICogS2V5Tm9uY2UsCisJCSAgICAgICB1OCAqIFR4UlNDLAorCQkgICAgICAgdTggKiBHVEssCisJCSAgICAgICB1OCAqIFJTTklFLAorCQkgICAgICAgdTggUlNOSUVfTGVuLCBzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICogcE1zZyk7CiAKLVZPSUQgICAgQWlyb25ldFJlcXVlc3RBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CitpbnQgUlRNUFNvZnREZWNyeXB0QnJvYWRDYXN0RGF0YShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGssCisJCQkJCSBJTiBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUworCQkJCQkgR3JvdXBDaXBoZXIsCisJCQkJCSBzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcFNoYXJkX2tleSk7CiAKLVZPSUQgICAgQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOwordm9pZCBSVE1QTWFrZVJTTklFKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgdTMyIEF1dGhNb2RlLCB1MzIgV2VwU3RhdHVzLCB1OCBhcGlkeCk7CiAKLVZPSUQgICAgTm9pc2VIaXN0UmVxdWVzdEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKKy8qICovCisvKiBmdW5jdGlvbiBwcm90b3R5cGUgaW4gYXBfd3BhLmMgKi8KKy8qICovCit2b2lkIFJUTVBHZXRUeFRzY0Zyb21Bc2ljKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgdTggYXBpZHgsIHU4ICpwVHhUc2MpOwogCi1WT0lEICAgIEJlYWNvblJlcXVlc3RBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7Cit2b2lkIEFQSW5zdGFsbFBhaXJ3aXNlS2V5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5KTsKIAotVk9JRCAgICBBaXJvbmV0UmVwb3J0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordTMyIEFQVmFsaWRhdGVSU05JRShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkgICAgIHU4ICpwUnNuSWUsIHU4IHJzbmllX2xlbik7CiAKLVZPSUQgICAgQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7Cit2b2lkIEhhbmRsZUNvdW50ZXJNZWFzdXJlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5KTsKIAotVk9JRCAgICBOb2lzZUhpc3RSZXBvcnRBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7Cit2b2lkIFdQQVN0YXJ0NFdheUhTKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwgdW5zaWduZWQgbG9uZyBUaW1lSW50ZXJ2YWwpOwogCi1WT0lEICAgIEFpcm9uZXRGaW5hbFJlcG9ydEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIFdQQVN0YXJ0MldheUdyb3VwSFMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpOwogCi1WT0lEICAgIEJlYWNvblJlcG9ydEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKK3ZvaWQgUGVlclBhaXJNc2cxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgICAgQWlyb25ldEFkZEJlYWNvblJlcG9ydCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCi0JSU4gIFVMT05HICAgICAgICAgICAgICAgSW5kZXgsCi0JSU4gIFBNTE1FX1FVRVVFX0VMRU0gICAgcEVsZW0pOwordm9pZCBQZWVyUGFpck1zZzJBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCAgICBBaXJvbmV0Q3JlYXRlQmVhY29uUmVwb3J0RnJvbUJzc1RhYmxlKAotCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCk7Cit2b2lkIFBlZXJQYWlyTXNnM0FjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1DSEFSICAgIENvbnZlcnRUb1Jzc2koCi0JSU4gUFJUTVBfQURBUFRFUiAgcEFkLAotCUlOIENIQVIJCQkJUnNzaSwKLQlJTiBVQ0hBUiAgICBSc3NpTnVtYmVyKTsKK3ZvaWQgUGVlclBhaXJNc2c0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLS8vCi0vLyBmdW5jdGlvbiBwcm90b3R5cGUgaW4gY21tX3dwYS5jCi0vLwotQk9PTEVBTiBSVE1QQ2hlY2tXUEFmcmFtZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKLQlJTiBQVUNIQVIgCQkJcERhdGEsCi0JSU4gVUxPTkcgCQkJRGF0YUJ5dGVDb3VudCwKLQlJTiBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKK3ZvaWQgUGVlckdyb3VwTXNnMUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBBRVNfR1RLX0tFWV9VTldSQVAoCi0JSU4gIFVDSEFSICAgKmtleSwKLQlPVVQgVUNIQVIgICAqcGxhaW50ZXh0LAotCUlOCVVDSEFSCWNfbGVuLAotCUlOICBVQ0hBUiAgICpjaXBoZXJ0ZXh0KTsKK3ZvaWQgUGVlckdyb3VwTXNnMkFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkJIHZvaWQgKiBNc2csIHUzMiBNc2dMZW4pOwogCi1WT0lEIFJUTVBNYWtlUlNOSUUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVJTlQgICAgICAgICAgICBBdXRoTW9kZSwKLQlJTiAgVUlOVCAgICAgICAgICAgIFdlcFN0YXR1cywKLQlJTglVQ0hBUgkJCWFwaWR4KTsKK3ZvaWQgV3BhRGVyaXZlR1RLKHU4ICogUE1LLAorCQkgIHU4ICogR05vbmNlLAorCQkgIHU4ICogQUEsIHU4ICogb3V0cHV0LCB1MzIgbGVuKTsKIAotLy8KLS8vIGZ1bmN0aW9uIHByb3RvdHlwZSBpbiBhcF93cGEuYwotLy8KK3ZvaWQgQUVTX0dUS19LRVlfV1JBUCh1OCAqIGtleSwKKwkJICAgICAgdTggKiBwbGFpbnRleHQsCisJCSAgICAgIHUzMiBwX2xlbiwgdTggKiBjaXBoZXJ0ZXh0KTsKIAotVk9JRCBIYW5kbGVDb3VudGVyTWVhc3VyZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnkpOworLyp0eXBlZGVmIHZvaWQgKCpUSU1FUl9GVU5DVElPTikodW5zaWduZWQgbG9uZyk7ICovCiAKIC8qIHRpbWVvdXQgLS0gbXMgKi8KLVZPSUQgUlRNUF9TZXRQZXJpb2RpY1RpbWVyKAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKLQlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpOwordm9pZCBSVE1QX1NldFBlcmlvZGljVGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKiBwVGltZXIsCisJCQkgICBJTiB1bnNpZ25lZCBsb25nIHRpbWVvdXQpOwogCi1WT0lEIFJUTVBfT1NfSW5pdF9UaW1lcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglORElTX01JTklQT1JUX1RJTUVSICpwVGltZXIsCi0JSU4JVElNRVJfRlVOQ1RJT04gZnVuY3Rpb24sCi0JSU4JUFZPSUQgZGF0YSk7Cit2b2lkIFJUTVBfT1NfSW5pdF9UaW1lcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgdGltZXJfbGlzdCAqIHBUaW1lciwKKwkJCUlOIFRJTUVSX0ZVTkNUSU9OIGZ1bmN0aW9uLCB2b2lkICpkYXRhKTsKIAotVk9JRCBSVE1QX09TX0FkZF9UaW1lcigKLQlJTglORElTX01JTklQT1JUX1RJTUVSCSpwVGltZXIsCi0JSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKK3ZvaWQgUlRNUF9PU19BZGRfVGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKiBwVGltZXIsCisJCSAgICAgICBJTiB1bnNpZ25lZCBsb25nIHRpbWVvdXQpOwogCi1WT0lEIFJUTVBfT1NfTW9kX1RpbWVyKAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJKnBUaW1lciwKLQlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpOwordm9pZCBSVE1QX09TX01vZF9UaW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqIHBUaW1lciwKKwkJICAgICAgIElOIHVuc2lnbmVkIGxvbmcgdGltZW91dCk7CiAKK3ZvaWQgUlRNUF9PU19EZWxfVGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKiBwVGltZXIsCisJCSAgICAgICBPVVQgQk9PTEVBTiAqIHBDYW5jZWxsZWQpOwogCi1WT0lEIFJUTVBfT1NfRGVsX1RpbWVyKAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJKnBUaW1lciwKLQlPVVQJQk9PTEVBTgkJCQkgKnBDYW5jZWxsZWQpOwordm9pZCBSVE1QX09TX1JlbGVhc2VfUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICpwRW50cnkpOwogCit2b2lkIFJUTVB1c2VjRGVsYXkodW5zaWduZWQgbG9uZyB1c2VjKTsKIAotVk9JRCBSVE1QX09TX1JlbGVhc2VfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVBRVUVVRV9FTlRSWSAgcEVudHJ5KTsKK2ludCBvc19hbGxvY19tZW0oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHU4ICoqIG1lbSwgdW5zaWduZWQgbG9uZyBzaXplKTsKIAotVk9JRCBSVE1QdXNlY0RlbGF5KAotCUlOCVVMT05HCXVzZWMpOworaW50IG9zX2ZyZWVfbWVtKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqbWVtKTsKIAotTkRJU19TVEFUVVMgb3NfYWxsb2NfbWVtKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCU9VVAlQVUNIQVIgKm1lbSwKLQlJTglVTE9ORyAgc2l6ZSk7Cit2b2lkIFJUTVBfQWxsb2NhdGVTaGFyZWRNZW1vcnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgTGVuZ3RoLAorCQkJICAgICAgIElOIEJPT0xFQU4gQ2FjaGVkLAorCQkJICAgICAgIHZvaWQgKiogVmlydHVhbEFkZHJlc3MsCisJCQkgICAgICAgZG1hX2FkZHJfdCAqUGh5c2ljYWxBZGRyZXNzKTsKIAotTkRJU19TVEFUVVMgb3NfZnJlZV9tZW0oCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JUFVDSEFSIG1lbSk7Cit2b2lkIFJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAoraW50IEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KHZvaWQgKmhhbmRsZSwgdm9pZCAqKiBwcEFkKTsKIAotdm9pZCBSVE1QX0FsbG9jYXRlU2hhcmVkTWVtb3J5KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7Cit2b2lkIFJUTVBfQWxsb2NhdGVUeERlc2NNZW1vcnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIHUzMiBJbmRleCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJCSAgICAgICBJTiBCT09MRUFOIENhY2hlZCwKKwkJCSAgICAgICB2b2lkICoqIFZpcnR1YWxBZGRyZXNzLAorCQkJICAgICAgIGRtYV9hZGRyX3QgKlBoeXNpY2FsQWRkcmVzcyk7CiAKLVZPSUQgUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIFJUTVBfQWxsb2NhdGVGaXJzdFR4QnVmZmVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQl1MzIgSW5kZXgsCisJCQkJdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkJSU4gQk9PTEVBTiBDYWNoZWQsCisJCQkJdm9pZCAqKiBWaXJ0dWFsQWRkcmVzcywKKwkJCQlkbWFfYWRkcl90ICpQaHlzaWNhbEFkZHJlc3MpOwogCi1ORElTX1NUQVRVUyBBZGFwdGVyQmxvY2tBbGxvY2F0ZU1lbW9yeSgKLQlJTiBQVk9JRAloYW5kbGUsCi0JT1VUCVBWT0lECSpwcEFkKTsKK3ZvaWQgUlRNUF9GcmVlRmlyc3RUeEJ1ZmZlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkgICAgSU4gQk9PTEVBTiBDYWNoZWQsCisJCQkgICAgdm9pZCAqVmlydHVhbEFkZHJlc3MsCisJCQkgICAgZG1hX2FkZHJfdCBQaHlzaWNhbEFkZHJlc3MpOwogCi12b2lkIFJUTVBfQWxsb2NhdGVUeERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUlOVAlJbmRleCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOwordm9pZCBSVE1QX0FsbG9jYXRlTWdtdERlc2NNZW1vcnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSB1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJCQkgSU4gQk9PTEVBTiBDYWNoZWQsCisJCQkJIHZvaWQgKiogVmlydHVhbEFkZHJlc3MsCisJCQkJIGRtYV9hZGRyX3QgKlBoeXNpY2FsQWRkcmVzcyk7CiAKLXZvaWQgUlRNUF9BbGxvY2F0ZUZpcnN0VHhCdWZmZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUlOVAlJbmRleCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOwordm9pZCBSVE1QX0FsbG9jYXRlUnhEZXNjTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJCSAgICAgICBJTiBCT09MRUFOIENhY2hlZCwKKwkJCSAgICAgICB2b2lkICoqIFZpcnR1YWxBZGRyZXNzLAorCQkJICAgICAgIGRtYV9hZGRyX3QgKlBoeXNpY2FsQWRkcmVzcyk7CiAKLXZvaWQgUlRNUF9BbGxvY2F0ZU1nbXREZXNjTWVtb3J5KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7Cit2b2lkIFJUTVBfRnJlZURlc2NNZW1vcnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHVuc2lnbmVkIGxvbmcgTGVuZ3RoLAorCQkJIHZvaWQgKlZpcnR1YWxBZGRyZXNzLAorCQkJIGRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzKTsKIAotdm9pZCBSVE1QX0FsbG9jYXRlUnhEZXNjTWVtb3J5KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7Cit2b2lkICpSdG1wT1NOZXRQa3RBbGxvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIGludCBzaXplKTsKIAotUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVSeFBhY2tldEJ1ZmZlcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOwordm9pZCAqUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgTGVuZ3RoLAorCQkJCQkgSU4gQk9PTEVBTiBDYWNoZWQsCisJCQkJCSB2b2lkICoqIFZpcnR1YWxBZGRyZXNzLAorCQkJCQkgT1VUIGRtYV9hZGRyX3QgKgorCQkJCQkgUGh5c2ljYWxBZGRyZXNzKTsKIAotUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVUeFBhY2tldEJ1ZmZlcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcyk7Cit2b2lkICpSVE1QX0FsbG9jYXRlVHhQYWNrZXRCdWZmZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkJCSBJTiBCT09MRUFOIENhY2hlZCwKKwkJCQkJIHZvaWQgKiogVmlydHVhbEFkZHJlc3MpOwogCi1QTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoKTsKK3ZvaWQgKlJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBMZW5ndGgpOwogCi12b2lkIFJUTVBfUXVlcnlQYWNrZXRJbmZvKAotCUlOICBQTkRJU19QQUNLRVQgcFBhY2tldCwKLQlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKLQlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKLQlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKTsKK3ZvaWQgUlRNUF9RdWVyeVBhY2tldEluZm8odm9pZCAqcFBhY2tldCwKKwkJCSAgc3RydWN0IHJ0X3BhY2tldF9pbmZvICpwUGFja2V0SW5mbywKKwkJCSAgdTggKiogcFNyY0J1ZlZBLCB1MzIgKiBwU3JjQnVmTGVuKTsKIAotdm9pZCBSVE1QX1F1ZXJ5TmV4dFBhY2tldEluZm8oCi0JSU4gIFBORElTX1BBQ0tFVCAqcHBQYWNrZXQsCi0JT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCi0JT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCi0JT1VUCVVJTlQJCSAqcFNyY0J1Zkxlbik7Cit2b2lkIFJUTVBfUXVlcnlOZXh0UGFja2V0SW5mbyh2b2lkICoqIHBwUGFja2V0LAorCQkJICAgICAgc3RydWN0IHJ0X3BhY2tldF9pbmZvICpwUGFja2V0SW5mbywKKwkJCSAgICAgIHU4ICoqIHBTcmNCdWZWQSwgdTMyICogcFNyY0J1Zkxlbik7CiAKK0JPT0xFQU4gUlRNUF9GaWxsVHhCbGtJbmZvKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrKTsKIAotQk9PTEVBTiBSVE1QX0ZpbGxUeEJsa0luZm8oCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVFhfQkxLICpwVHhCbGspOworc3RydWN0IHJ0X3J0bXBfc2dfbGlzdCAqCitydF9nZXRfc2dfbGlzdF9mcm9tX3BhY2tldCh2b2lkICpwUGFja2V0LCBzdHJ1Y3QgcnRfcnRtcF9zZ19saXN0ICpzZyk7CiAKK3ZvaWQgYW5ub3VuY2VfODAyXzNfcGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqcFBhY2tldCk7CiAKLVBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QKLXJ0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KFBORElTX1BBQ0tFVCBwUGFja2V0LCBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QgKnNnKTsKK3UzMiBCQV9SZW9yZGVyX0FNU0RVX0Fubm5vdW5jZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHZvaWQgKnBQYWNrZXQpOwogCitzdHJ1Y3QgbmV0X2RldmljZSAqZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggRnJvbVdoaWNoQlNTSUQpOwogCi0gdm9pZCBhbm5vdW5jZV84MDJfM19wYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpOwordm9pZCAqZHVwbGljYXRlX3BrdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1OCAqcEhlYWRlcjgwMl8zLAorCQkJICAgdTMyIEhkckxlbiwKKwkJCSAgIHU4ICpwRGF0YSwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgRGF0YVNpemUsIHU4IEZyb21XaGljaEJTU0lEKTsKIAordm9pZCAqZHVwbGljYXRlX3BrdF93aXRoX1RLSVBfTUlDKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJIHZvaWQgKnBPbGRQa3QpOwogCi1VSU5UIEJBX1Jlb3JkZXJfQU1TRFVfQW5ubm91bmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKK3ZvaWQgYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgICAgc3RydWN0IHJ0X2JhX3JlY19lbnRyeSAqcEJBRW50cnksCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgTm93MzIpOwogCi1QTkVUX0RFViBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Cit2b2lkIEJBT3JpU2Vzc2lvblNldFVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJICAgICAgIHU4IFRJRCwKKwkJICAgICAgIHUxNiBUaW1lT3V0LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBEZWxheVRpbWUsIElOIEJPT0xFQU4gaXNGb3JjZWQpOwogCi0KLVBORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKLSAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURhdGFTaXplLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi0KLVBORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBPbGRQa3QpOwotCi12b2lkIGJhX2ZsdXNoX3Jlb3JkZXJpbmdfdGltZW91dF9tcGR1cygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBQQkFfUkVDX0VOVFJZCXBCQUVudHJ5LAotCUlOIFVMT05HCQkJTm93MzIpOwotCi0KLVZPSUQgQkFPcmlTZXNzaW9uU2V0VXAoCi0JCQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQkJCUlOIE1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCQkJSU4gVUNIQVIJCQlUSUQsCi0JCQlJTiBVU0hPUlQJCQlUaW1lT3V0LAotCQkJSU4gVUxPTkcJCQlEZWxheVRpbWUsCi0JCQlJTiBCT09MRUFOCQlpc0ZvcmNlZCk7Ci0KLVZPSUQgQkFTZXNzaW9uVGVhckRvd25BTEwoCi0JSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCQlVQ0hBUiBXY2lkKTsKK3ZvaWQgQkFTZXNzaW9uVGVhckRvd25BTEwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBXY2lkKTsKIAogQk9PTEVBTiBPU19OZWVkX0Nsb25lX1BhY2tldCh2b2lkKTsKIAordm9pZCBidWlsZF90eF9wYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgIHZvaWQgKnBQYWNrZXQsCisJCSAgICAgdTggKnBGcmFtZSwgdW5zaWduZWQgbG9uZyBGcmFtZUxlbik7CiAKLVZPSUQgYnVpbGRfdHhfcGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAotCUlOCVBVQ0hBUglwRnJhbWUsCi0JSU4JVUxPTkcJRnJhbWVMZW4pOwordm9pZCBCQU9yaVNlc3Npb25UZWFyRG93bihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHU4IFdjaWQsCisJCQkgIHU4IFRJRCwKKwkJCSAgSU4gQk9PTEVBTiBiUGFzc2l2ZSwgSU4gQk9PTEVBTiBiRm9yY2VTZW5kKTsKIAordm9pZCBCQVJlY1Nlc3Npb25UZWFyRG93bihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHU4IFdjaWQsIHU4IFRJRCwgSU4gQk9PTEVBTiBiUGFzc2l2ZSk7CiAKLVZPSUQgQkFPcmlTZXNzaW9uVGVhckRvd24oCi0JSU4gT1VUCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCQlVQ0hBUgkJCVdjaWQsCi0JSU4JCVVDSEFSCQkJVElELAotCUlOCQlCT09MRUFOCQkJYlBhc3NpdmUsCi0JSU4JCUJPT0xFQU4JCQliRm9yY2VTZW5kKTsKK0JPT0xFQU4gYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgaW50IG51bSk7Cit2b2lkIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIEJBUmVjU2Vzc2lvblRlYXJEb3duKAotCUlOIE9VVAlQUlRNUF9BREFQVEVSCXBBZCwKLQlJTgkJVUNIQVIJCQlXY2lkLAotCUlOCQlVQ0hBUgkJCVRJRCwKLQlJTgkJQk9PTEVBTgkJCWJQYXNzaXZlKTsKK2NoYXIgKnJzdHJ0b2soY2hhciAqcywgSU4gY29uc3QgY2hhciAqY3QpOwogCi1CT09MRUFOIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfaW5pdChQUlRNUF9BREFQVEVSIHBBZCwgaW50IG51bSk7Ci12b2lkIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZShQUlRNUF9BREFQVEVSIHBBZCk7CisvKi8vLy8vLy8vIGNvbW1vbiBpb2N0bCBmdW5jdGlvbnMgLy8vLy8vLy8vLyAqLworaW50IFNldENvbW1vbkhUKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLUJPT0xFQU4gcnRzdHJtYWN0b2hleCgKLQlJTiBjaGFyICpzMSwKLQlJTiBjaGFyICpzMik7CitpbnQgV3BhQ2hlY2tFYXBDb2RlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgIHU4ICpwRnJhbWUsIHUxNiBGcmFtZUxlbiwgdTE2IE9mZlNldCk7CiAKLUJPT0xFQU4gcnRzdHJjYXNlY21wKAotCUlOIGNoYXIgKnMxLAotCUlOIGNoYXIgKnMyKTsKK3ZvaWQgV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgICAgIElOIEJPT0xFQU4gYlVuaWNhc3QpOwogCi1jaGFyICpydHN0cnN0cnVuY2FzZWNtcCgKLQlJTiBjaGFyICpzMSwKLQlJTiBjaGFyICpzMik7CitpbnQgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotY2hhciAgICAqcnRzdHJzdHIoCi0JSU4JY29uc3QgY2hhciAqIHMxLAotCUlOCWNvbnN0IGNoYXIgKiBzMik7CitCT09MRUFOIFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYXJnYyk7CiAKLWNoYXIgKnJzdHJ0b2soCi0JSU4gY2hhciAqIHMsCi0JSU4gY29uc3QgY2hhciAqIGN0KTsKKy8qIEFNUERVIHBhY2tldCBpbmRpY2F0aW9uICovCit2b2lkIEluZGljYXRlX0FNUERVX1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGssIHU4IEZyb21XaGljaEJTU0lEKTsKIAotaW50IHJ0aW5ldF9hdG9uKAotCWNvbnN0IGNoYXIgKmNwLAotCXVuc2lnbmVkIGludCAqYWRkcik7CisvKiBBTVNEVSBwYWNrZXQgaW5kaWNhdGlvbiAqLwordm9pZCBJbmRpY2F0ZV9BTVNEVV9QYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLCB1OCBGcm9tV2hpY2hCU1NJRCk7CiAKLS8vLy8vLy8vLy8gY29tbW9uIGlvY3RsIGZ1bmN0aW9ucyAvLy8vLy8vLy8vCi1JTlQgU2V0X0RyaXZlclZlcnNpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOworLyogTm9ybWFsIGxlZ2FjeSBSeCBwYWNrZXQgaW5kaWNhdGlvbiAqLwordm9pZCBJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGssIHU4IEZyb21XaGljaEJTU0lEKTsKIAotSU5UIFNldF9Db3VudHJ5UmVnaW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKK3ZvaWQgSW5kaWNhdGVfRUFQT0xfUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpOwogCi1JTlQgU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Cit2b2lkIHVwZGF0ZV9vc19wYWNrZXRfaW5mbyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGssIHU4IEZyb21XaGljaEJTU0lEKTsKIAotSU5UIFNldF9XaXJlbGVzc01vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwordm9pZCB3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGssCisJCQkJIHU4ICpwSGVhZGVyODAyXzMsCisJCQkJIHU4IEZyb21XaGljaEJTU0lEKTsKIAotSU5UIFNldF9DaGFubmVsX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9TaG9ydFNsb3RfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X1R4UG93ZXJfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQgU2V0X0JHUHJvdGVjdGlvbl9Qcm9jKAotCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gIFBVQ0hBUgkJCWFyZyk7Ci0KLUlOVCBTZXRfVHhQcmVhbWJsZV9Qcm9jKAotCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gIFBVQ0hBUgkJCWFyZyk7Ci0KLUlOVCBTZXRfUlRTVGhyZXNob2xkX1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiAgUFVDSEFSCQkJYXJnKTsKLQotSU5UIFNldF9GcmFnVGhyZXNob2xkX1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiAgUFVDSEFSCQkJYXJnKTsKLQotSU5UIFNldF9UeEJ1cnN0X1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiAgUFVDSEFSCQkJYXJnKTsKLQotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLUlOVAlTZXRfUGt0QWdncmVnYXRlX1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiAgUFVDSEFSCQkJYXJnKTsKLSNlbmRpZgotCi1JTlQJU2V0X0lFRUU4MDIxMUhfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi0jaWZkZWYgREJHCi1JTlQJU2V0X0RlYnVnX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLSNlbmRpZgotCi1JTlQJU2hvd19EZXNjSW5mb19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfQkFTZXR1cF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfQkFEZWNsaW5lX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9CQU9yaVRlYXJEb3duX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9CQVJlY1RlYXJEb3duX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9IdEJ3X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9IdE1jc19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRHaV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRPcE1vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0h0U3RiY19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRIdGNfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0h0RXh0Y2hhX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9IdE1wZHVEZW5zaXR5X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9IdEJhV2luU2l6ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRSZGdfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0h0TGlua0FkYXB0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9IdEFtc2R1X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9IdEF1dG9CYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRQcm90ZWN0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9IdE1pbW9Qc19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLQotSU5UCVNldF9Gb3JjZVNob3J0R0lfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0ZvcmNlR0ZfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0Q29tbW9uSFQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwotCi1JTlQJU2V0X1NlbmRQU01QQWN0aW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9IdE1JTU9QU21vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi0KLUlOVAlTZXRfSHRUeEJBU2l6ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAkgICAgV3BhQ2hlY2tFYXBDb2RlKAotCUlOICBQUlRNUF9BREFQVEVSICAgCXBBZCwKLQlJTiAgUFVDSEFSCQkJCXBGcmFtZSwKLQlJTiAgVVNIT1JUCQkJCUZyYW1lTGVuLAotCUlOICBVU0hPUlQJCQkJT2ZmU2V0KTsKLQotVk9JRCAgICBXcGFTZW5kTWljRmFpbHVyZVRvV3BhU3VwcGxpY2FudCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCi0gICAgSU4gIEJPT0xFQU4gICAgICAgICAgICAgYlVuaWNhc3QpOwotCi1pbnQgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MoCi0JSU4gIFJUTVBfQURBUFRFUiAqcEFkKTsKLQotQk9PTEVBTiBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JQk9PTEVBTgkJCWFyZ2MpOwotCi0vLyBBTVBEVSBwYWNrZXQgaW5kaWNhdGlvbgotVk9JRCBJbmRpY2F0ZV9BTVBEVV9QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotLy8gQU1TRFUgcGFja2V0IGluZGljYXRpb24KLVZPSUQgSW5kaWNhdGVfQU1TRFVfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLS8vIE5vcm1hbCBsZWdhY3kgUnggcGFja2V0IGluZGljYXRpb24KLVZPSUQgSW5kaWNhdGVfTGVnYWN5X1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi1WT0lEIEluZGljYXRlX0VBUE9MX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi12b2lkICB1cGRhdGVfb3NfcGFja2V0X2luZm8oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotdm9pZCB3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCi0JSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi1VSU5UIGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCVBORElTX1BBQ0tFVAkJcFBhY2tldCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURhdGFTaXplKTsKLQotLy8gcmVtb3ZlIExMQyBhbmQgZ2V0IDgwMl8zIEhlYWRlcgorLyogcmVtb3ZlIExMQyBhbmQgZ2V0IDgwMl8zIEhlYWRlciAqLwogI2RlZmluZSAgUlRNUF84MDJfMTFfUkVNT1ZFX0xMQ19BTkRfQ09OVkVSVF9UT184MDJfMyhfcFJ4QmxrLCBfcEhlYWRlcjgwMl8zKQlcCiB7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JUFVDSEFSIF9wUmVtb3ZlZExMQ1NOQVAgPSBOVUxMLCBfcERBLCBfcFNBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl1OCAqX3BSZW1vdmVkTExDU05BUCA9IE5VTEwsICpfcERBLCAqX3BTQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCQkJCQkJCQkJCQkJCQkJCQkJCVwKIAlpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfTUVTSCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCV9wREEgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJX3BTQSA9IChQVUNIQVIpX3BSeEJsay0+cEhlYWRlciArIHNpemVvZihIRUFERVJfODAyXzExKTsgICAgICAgICAgICAgICAgXAorCQlfcFNBID0gKHU4ICopX3BSeEJsay0+cEhlYWRlciArIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSk7ICAgICAgICAgICAgICAgIFwKIAl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTU1NjUsMTMzICszNzQyLDEyMiBAQAogCQlfcFJ4QmxrLT5EYXRhU2l6ZSwgX3BSZW1vdmVkTExDU05BUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKLVZPSUQgU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwordm9pZCBTdGFfQW5ub3VuY2Vfb3JfRm9yd2FyZF84MDJfM19QYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgIHZvaWQgKnBQYWNrZXQsCisJCQkJCSAgdTggRnJvbVdoaWNoQlNTSUQpOwogCiAjZGVmaW5lIEFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKF9wQWQsIF9wUGFja2V0LCBfRnJvbVdoaWNoQlNTKVwKIAkJCVN0YV9Bbm5vdW5jZV9vcl9Gb3J3YXJkXzgwMl8zX1BhY2tldChfcEFkLCBfcFBhY2tldCwgX0Zyb21XaGljaEJTUyk7Ci0JCQkvL2Fubm91bmNlXzgwMl8zX3BhY2tldChfcEFkLCBfcFBhY2tldCk7CisJCQkvKmFubm91bmNlXzgwMl8zX3BhY2tldChfcEFkLCBfcFBhY2tldCk7ICovCiAKLVBORElTX1BBQ0tFVCBEdXBsaWNhdGVQYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Cit2b2lkICpEdXBsaWNhdGVQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB2b2lkICpwUGFja2V0LCB1OCBGcm9tV2hpY2hCU1NJRCk7CiAKK3ZvaWQgKkNsb25lUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSB2b2lkICpwUGFja2V0LAorCQkJIHU4ICpwRGF0YSwgdW5zaWduZWQgbG9uZyBEYXRhU2l6ZSk7CiAKLVBORElTX1BBQ0tFVCBDbG9uZVBhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURhdGFTaXplKTsKKy8qIE5vcm1hbCwgQU1QRFUgb3IgQU1TRFUgKi8KK3ZvaWQgQ21tUnhub25SYWxpbmtGcmFtZUluZGljYXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLCB1OCBGcm9tV2hpY2hCU1NJRCk7CiAKK3ZvaWQgQ21tUnhSYWxpbmtGcmFtZUluZGljYXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJCSAgICAgIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpOwogCi0vLyBOb3JtYWwsIEFNUERVIG9yIEFNU0RVCi1WT0lEIENtbVJ4bm9uUmFsaW5rRnJhbWVJbmRpY2F0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwordm9pZCBVcGRhdGVfUnNzaV9TYW1wbGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X3Jzc2lfc2FtcGxlICpwUnNzaSwgc3RydWN0IHJ0X3J4d2kgKiBwUnhXSSk7CiAKLVZPSUQgQ21tUnhSYWxpbmtGcmFtZUluZGljYXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Cit2b2lkICpHZXRQYWNrZXRGcm9tUnhSaW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgT1VUIFBSVDI4WFhfUlhEX1NUUlVDIHBTYXZlUnhELAorCQkJCSBPVVQgQk9PTEVBTiAqIHBiUmVzY2hlZHVsZSwKKwkJCQkgSU4gdTMyICogcFJ4UGVuZGluZyk7CiAKLVZPSUQgVXBkYXRlX1Jzc2lfU2FtcGxlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFJTU0lfU0FNUExFCQkqcFJzc2ksCi0JSU4gUFJYV0lfU1RSVUMJCXBSeFdJKTsKK3ZvaWQgKlJUTVBEZUZyYWdtZW50RGF0YUZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrKTsKIAotUE5ESVNfUEFDS0VUIFJUTVBEZUZyYWdtZW50RGF0YUZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGspOwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiBlbnVtIHsKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtCQk9IDB4MDAwMDAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ob3N0dGltZQk9IDB4MDAwMTAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9tYWN0aW1lCT0gMHgwMDAyMDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2NoYW5uZWwJPSAweDAwMDMwMDQ0LAotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcnNzaQkJPSAweDAwMDQwMDQ0LAotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fc3EJCT0gMHgwMDA1MDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NpZ25hbAk9IDB4MDAwNjAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ub2lzZQkJPSAweDAwMDcwMDQ0LAotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcmF0ZQkJPSAweDAwMDgwMDQ0LAotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faXN0eAkJPSAweDAwMDkwMDQ0LAotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fZnJtbGVuCT0gMHgwMDBBMDA0NAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm0gPSAweDAwMDAwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faG9zdHRpbWUgPSAweDAwMDEwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbWFjdGltZSA9IDB4MDAwMjAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9jaGFubmVsID0gMHgwMDAzMDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3Jzc2kgPSAweDAwMDQwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fc3EgPSAweDAwMDUwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fc2lnbmFsID0gMHgwMDA2MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX25vaXNlID0gMHgwMDA3MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3JhdGUgPSAweDAwMDgwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faXN0eCA9IDB4MDAwOTAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9mcm1sZW4gPSAweDAwMEEwMDQ0CiB9OwogZW51bSB7Ci0JUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19ub192YWx1ZQk9IDB4MDAKKwlQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX25vX3ZhbHVlID0gMHgwMAogfTsKIGVudW0gewotCVA4MDIxMUVOVU1fdHJ1dGhfZmFsc2UJCQk9IDB4MDAsCi0JUDgwMjExRU5VTV90cnV0aF90cnVlCQkJPSAweDAxCisJUDgwMjExRU5VTV90cnV0aF9mYWxzZSA9IDB4MDAsCisJUDgwMjExRU5VTV90cnV0aF90cnVlID0gMHgwMQogfTsKIAogLyogRGVmaW5pdGlvbiBmcm9tIG1hZHdpZmkgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgVUlOVDMyIGRpZDsKLSAgICAgICAgVUlOVDE2IHN0YXR1czsKLSAgICAgICAgVUlOVDE2IGxlbjsKLSAgICAgICAgVUlOVDMyIGRhdGE7Ci19IHA4MDIxMWl0ZW1fdWludDMyX3Q7CitzdHJ1Y3QgcnRfcDgwMjExaXRlbV91aW50MzIgeworCXUzMiBkaWQ7CisJdTE2IHN0YXR1czsKKwl1MTYgbGVuOworCXUzMiBkYXRhOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICBVSU5UMzIgbXNnY29kZTsKLSAgICAgICAgVUlOVDMyIG1zZ2xlbjsKK3N0cnVjdCBydF93bGFuX25nX3ByaXNtMl9oZWFkZXIgeworCXUzMiBtc2djb2RlOworCXUzMiBtc2dsZW47CiAjZGVmaW5lIFdMQU5fREVWTkFNRUxFTl9NQVggMTYKLSAgICAgICAgVUlOVDggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBob3N0dGltZTsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBtYWN0aW1lOwotICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGNoYW5uZWw7Ci0gICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgcnNzaTsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBzcTsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBzaWduYWw7Ci0gICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3Qgbm9pc2U7Ci0gICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgcmF0ZTsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBpc3R4OwotICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGZybWxlbjsKLX0gd2xhbl9uZ19wcmlzbTJfaGVhZGVyOworCXU4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07CisJc3RydWN0IHJ0X3A4MDIxMWl0ZW1fdWludDMyIGhvc3R0aW1lOworCXN0cnVjdCBydF9wODAyMTFpdGVtX3VpbnQzMiBtYWN0aW1lOworCXN0cnVjdCBydF9wODAyMTFpdGVtX3VpbnQzMiBjaGFubmVsOworCXN0cnVjdCBydF9wODAyMTFpdGVtX3VpbnQzMiByc3NpOworCXN0cnVjdCBydF9wODAyMTFpdGVtX3VpbnQzMiBzcTsKKwlzdHJ1Y3QgcnRfcDgwMjExaXRlbV91aW50MzIgc2lnbmFsOworCXN0cnVjdCBydF9wODAyMTFpdGVtX3VpbnQzMiBub2lzZTsKKwlzdHJ1Y3QgcnRfcDgwMjExaXRlbV91aW50MzIgcmF0ZTsKKwlzdHJ1Y3QgcnRfcDgwMjExaXRlbV91aW50MzIgaXN0eDsKKwlzdHJ1Y3QgcnRfcDgwMjExaXRlbV91aW50MzIgZnJtbGVuOworfTsKIAogLyogVGhlIHJhZGlvIGNhcHR1cmUgaGVhZGVyIHByZWNlZGVzIHRoZSA4MDIuMTEgaGVhZGVyLiAqLwotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9pZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIHsKLSAgICBVSU5UOAlpdF92ZXJzaW9uOwkvKiBWZXJzaW9uIDAuIE9ubHkgaW5jcmVhc2VzCitzdHJ1Y3QgUEFDS0VEIHJ0X2llZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgeworCXU4IGl0X3ZlcnNpb247CS8qIFZlcnNpb24gMC4gT25seSBpbmNyZWFzZXMKIAkJCQkgKiBmb3IgZHJhc3RpYyBjaGFuZ2VzLAogCQkJCSAqIGludHJvZHVjdGlvbiBvZiBjb21wYXRpYmxlCiAJCQkJICogbmV3IGZpZWxkcyBkb2VzIG5vdCBjb3VudC4KIAkJCQkgKi8KLSAgICBVSU5UOAlpdF9wYWQ7Ci0gICAgVUlOVDE2ICAgICBpdF9sZW47ICAgICAgICAgLyogbGVuZ3RoIG9mIHRoZSB3aG9sZQorCXU4IGl0X3BhZDsKKwl1MTYgaXRfbGVuOwkJLyogbGVuZ3RoIG9mIHRoZSB3aG9sZQogCQkJCSAqIGhlYWRlciBpbiBieXRlcywgaW5jbHVkaW5nCiAJCQkJICogaXRfdmVyc2lvbiwgaXRfcGFkLAogCQkJCSAqIGl0X2xlbiwgYW5kIGRhdGEgZmllbGRzLgogCQkJCSAqLwotICAgIFVJTlQzMiAgIGl0X3ByZXNlbnQ7CS8qIEEgYml0bWFwIHRlbGxpbmcgd2hpY2gKLQkJCQkJICogZmllbGRzIGFyZSBwcmVzZW50LiBTZXQgYml0IDMxCi0JCQkJCSAqICgweDgwMDAwMDAwKSB0byBleHRlbmQgdGhlCi0JCQkJCSAqIGJpdG1hcCBieSBhbm90aGVyIDMyIGJpdHMuCi0JCQkJCSAqIEFkZGl0aW9uYWwgZXh0ZW5zaW9ucyBhcmUgbWFkZQotCQkJCQkgKiBieSBzZXR0aW5nIGJpdCAzMS4KLQkJCQkJICovCi19aWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciA7CisJdTMyIGl0X3ByZXNlbnQ7CS8qIEEgYml0bWFwIHRlbGxpbmcgd2hpY2gKKwkJCQkgKiBmaWVsZHMgYXJlIHByZXNlbnQuIFNldCBiaXQgMzEKKwkJCQkgKiAoMHg4MDAwMDAwMCkgdG8gZXh0ZW5kIHRoZQorCQkJCSAqIGJpdG1hcCBieSBhbm90aGVyIDMyIGJpdHMuCisJCQkJICogQWRkaXRpb25hbCBleHRlbnNpb25zIGFyZSBtYWRlCisJCQkJICogYnkgc2V0dGluZyBiaXQgMzEuCisJCQkJICovCit9OwogCiBlbnVtIGllZWU4MDIxMV9yYWRpb3RhcF90eXBlIHsKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfVFNGVCA9IDAsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0ZMQUdTID0gMSwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfUkFURSA9IDIsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0NIQU5ORUwgPSAzLAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9GSFNTID0gNCwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVFNJR05BTCA9IDUsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0RCTV9BTlROT0lTRSA9IDYsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0xPQ0tfUVVBTElUWSA9IDcsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX1RYX0FUVEVOVUFUSU9OID0gOCwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfREJfVFhfQVRURU5VQVRJT04gPSA5LAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fVFhfUE9XRVIgPSAxMCwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfQU5URU5OQSA9IDExLAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlRTSUdOQUwgPSAxMiwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UTk9JU0UgPSAxMworCUlFRUU4MDIxMV9SQURJT1RBUF9UU0ZUID0gMCwKKwlJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MgPSAxLAorCUlFRUU4MDIxMV9SQURJT1RBUF9SQVRFID0gMiwKKwlJRUVFODAyMTFfUkFESU9UQVBfQ0hBTk5FTCA9IDMsCisJSUVFRTgwMjExX1JBRElPVEFQX0ZIU1MgPSA0LAorCUlFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UU0lHTkFMID0gNSwKKwlJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVE5PSVNFID0gNiwKKwlJRUVFODAyMTFfUkFESU9UQVBfTE9DS19RVUFMSVRZID0gNywKKwlJRUVFODAyMTFfUkFESU9UQVBfVFhfQVRURU5VQVRJT04gPSA4LAorCUlFRUU4MDIxMV9SQURJT1RBUF9EQl9UWF9BVFRFTlVBVElPTiA9IDksCisJSUVFRTgwMjExX1JBRElPVEFQX0RCTV9UWF9QT1dFUiA9IDEwLAorCUlFRUU4MDIxMV9SQURJT1RBUF9BTlRFTk5BID0gMTEsCisJSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVFNJR05BTCA9IDEyLAorCUlFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlROT0lTRSA9IDEzCiB9OwogCiAjZGVmaW5lIFdMQU5fUkFESU9UQVBfUFJFU0VOVCAoCQkJXApAQCAtNTcwMCw3MzcgKzM4NjYsNDkxIEBACiAJKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1JBVEUpICB8IAlcCiAJIDApCiAKLXR5cGVkZWYgc3RydWN0IF93bGFuX3JhZGlvdGFwX2hlYWRlciB7Ci0JaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciB3dF9paGRyOwotCUlOVDY0IHd0X3RzZnQ7Ci0JVUlOVDggd3RfZmxhZ3M7Ci0JVUlOVDggd3RfcmF0ZTsKLX0gd2xhbl9yYWRpb3RhcF9oZWFkZXI7CitzdHJ1Y3QgcnRfd2xhbl9yYWRpb3RhcF9oZWFkZXIgeworCXN0cnVjdCBydF9pZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIHd0X2loZHI7CisJbG9uZyBsb25nIHd0X3RzZnQ7CisJdTggd3RfZmxhZ3M7CisJdTggd3RfcmF0ZTsKK307CiAvKiBEZWZpbml0aW9uIGZyb20gbWFkd2lmaSAqLwogCi12b2lkIHNlbmRfbW9uaXRvcl9wYWNrZXRzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGspOwordm9pZCBzZW5kX21vbml0b3JfcGFja2V0cyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsayk7CiAKLS8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiBxdWVyeSAvcHJvYwotc3RydWN0IGl3X3N0YXRpc3RpY3MgKnJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMoCi0gICAgSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwordm9pZCBSVE1QU2V0RGVzaXJlZFJhdGVzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyLCBsb25nIFJhdGVzKTsKIAotVk9JRCAgICBSVE1QU2V0RGVzaXJlZFJhdGVzKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIExPTkcgICAgICAgICAgICBSYXRlcyk7CitpbnQgU2V0X0ZpeGVkVHhNb2RlX1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyICphcmcpOwogCi1JTlQJU2V0X0ZpeGVkVHhNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKK0JPT0xFQU4gUlQyOFhYQ2hpcHNldENoZWNrKElOIHZvaWQgKl9kZXZfcCk7CiAKLXN0YXRpYyBpbmxpbmUgY2hhciogR2V0UGh5TW9kZSgKLQlpbnQgTW9kZSkKLXsKLQlzd2l0Y2goTW9kZSkKLQl7Ci0JCWNhc2UgTU9ERV9DQ0s6Ci0JCQlyZXR1cm4gIkNDSyI7Cit2b2lkIFJUMjhYWERNQURpc2FibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotCQljYXNlIE1PREVfT0ZETToKLQkJCXJldHVybiAiT0ZETSI7Ci0JCWNhc2UgTU9ERV9IVE1JWDoKLQkJCXJldHVybiAiSFRNSVgiOwordm9pZCBSVDI4WFhETUFFbmFibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotCQljYXNlIE1PREVfSFRHUkVFTkZJRUxEOgotCQkJcmV0dXJuICJHUkVFTiI7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gIk4vQSI7Ci0JfQotfQordm9pZCBSVDI4eHhfVXBkYXRlQmVhY29uVG9Bc2ljKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICBpbnQgYXBpZHgsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBCZWFjb25MZW4sIHVuc2lnbmVkIGxvbmcgVXBkYXRlUG9zKTsKIAoraW50IHJ0Mjh4eF9pbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJY2hhciAqcERlZmF1bHRNYWMsIGNoYXIgKnBIb3N0TmFtZSk7CiAKLXN0YXRpYyBpbmxpbmUgY2hhciogR2V0QlcoCi0JaW50IEJXKQotewotCXN3aXRjaChCVykKLQl7Ci0JCWNhc2UgQldfMTA6Ci0JCQlyZXR1cm4gIjEwTSI7CitpbnQgUnRtcE5ldFRhc2tJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLQkJY2FzZSBCV18yMDoKLQkJCXJldHVybiAiMjBNIjsKLQkJY2FzZSBCV180MDoKLQkJCXJldHVybiAiNDBNIjsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAiTi9BIjsKLQl9Ci19Cit2b2lkIFJ0bXBOZXRUYXNrRXhpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCitpbnQgUnRtcE1nbXRUYXNrSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJUMjh4eFRocmVhZFRlcm1pbmF0ZSgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCk7Ci0KLUJPT0xFQU4gUlQyOFhYQ2hpcHNldENoZWNrKAotCUlOIHZvaWQgKl9kZXZfcCk7Ci0KLUJPT0xFQU4gUlQyOFhYTmV0RGV2SW5pdCgKLQlJTiB2b2lkIAkJCQkqX2Rldl9wLAotCUlOIHN0cnVjdCAgbmV0X2RldmljZQkqbmV0X2RldiwKLQlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKTsKLQotQk9PTEVBTiBSVDI4WFhQcm9iZVBvc3RDb25maWcoCi0JSU4gdm9pZCAJCQkJKl9kZXZfcCwKLQlJTiBSVE1QX0FEQVBURVIgCQkqcEFkLAotCUlOIElOVDMyCQkJCWFyZ2MpOwotCi1WT0lEIFJUMjhYWERNQURpc2FibGUoCi0JSU4gUlRNUF9BREFQVEVSIAkJKnBBZCk7Ci0KLVZPSUQgUlQyOFhYRE1BRW5hYmxlKAotCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpOwotCi1WT0lEIFJUMjh4eF9VcGRhdGVCZWFjb25Ub0FzaWMoCi0JSU4gUlRNUF9BREFQVEVSICogcEFkLAotCUlOIElOVCBhcGlkeCwKLQlJTiBVTE9ORyBCZWFjb25MZW4sCi0JSU4gVUxPTkcgVXBkYXRlUG9zKTsKLQotSU5UIHJ0Mjh4eF9zdGFfaW9jdGwoCi0JSU4Jc3RydWN0IG5ldF9kZXZpY2UJKm5ldF9kZXYsCi0JSU4JT1VUCXN0cnVjdCBpZnJlcQkqcnEsCi0JSU4JSU5UCQkJY21kKTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotUE5ESVNfUEFDS0VUIEdldFBhY2tldEZyb21SeFJpbmcoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAkJUFJUMjhYWF9SWERfU1RSVUMJcFNhdmVSeEQsCi0JT1VUCQlCT09MRUFOCQkJKnBiUmVzY2hlZHVsZSwKLQlJTiBPVVQJVUlOVDMyCQkJKnBSeFBlbmRpbmcpOwotCi0KLXZvaWQga2lsbF90aHJlYWRfdGFzayhQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIFJ0bXBNZ210VGFza0V4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAogdm9pZCB0YnR0X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKIAotI2lmZGVmIFJUMjg2MAotLy8KLS8vIEZ1bmN0aW9uIFByb3RvdHlwZSBpbiBjbW1fZGF0YV8yODYwLmMKLS8vCi1VU0hPUlQgUnRtcFBDSV9Xcml0ZVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglCT09MRUFOCQkJYklzTGFzdCwKLQlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOworc3RydWN0IG5ldF9kZXZpY2UgKlJ0bXBQaHlOZXREZXZJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHN0cnVjdCBydF9ydG1wX29zX25ldGRldl9vcF9ob29rICpwTmV0SG9vayk7CiAKLVVTSE9SVCBSdG1wUENJX1dyaXRlU2luZ2xlVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCUJPT0xFQU4JCQliSXNMYXN0LAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7CitCT09MRUFOIFJ0bXBQaHlOZXREZXZFeGl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwogCi1VU0hPUlQgUnRtcFBDSV9Xcml0ZU11bHRpVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVDSEFSCQkJZnJhbWVOdW0sCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKK2ludCBSdG1wUmFEZXZDdHJsSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIFJUTVBfSU5GX1RZUEUgaW5mVHlwZSk7CiAKLVVTSE9SVAlSdG1wUENJX1dyaXRlRnJhZ1R4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYWdOdW0sCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKK0JPT0xFQU4gUnRtcFJhRGV2Q3RybEV4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVTdWJUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JQk9PTEVBTgkJCWJJc0xhc3QsCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKy8qICovCisvKiBGdW5jdGlvbiBQcm90b3R5cGUgaW4gY21tX2RhdGFfcGNpLmMgKi8KKy8qICovCit1MTYgUnRtcFBDSV9Xcml0ZVR4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCSAgICAgICBJTiBCT09MRUFOIGJJc0xhc3QsIHUxNiAqIEZyZWVOdW1iZXIpOwogCi1WT0lEIFJ0bXBQQ0lfRmluYWxXcml0ZVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVU0hPUlQJCQl0b3RhbE1QRFVTaXplLAotCUlOCVVTSE9SVAkJCUZpcnN0VHhJZHgpOwordTE2IFJ0bXBQQ0lfV3JpdGVTaW5nbGVUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgICAgIElOIEJPT0xFQU4gYklzTGFzdCwKKwkJCQkgICAgIHUxNiAqIEZyZWVOdW1iZXIpOwogCi1WT0lEIFJ0bXBQQ0lEYXRhTGFzdFR4SWR4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJUXVlSWR4LAotCUlOCVVTSE9SVAkJCUxhc3RUeElkeCk7Cit1MTYgUnRtcFBDSV9Xcml0ZU11bHRpVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgICAgdTggZnJhbWVOdW0sIHUxNiAqIEZyZWVOdW1iZXIpOwogCi1WT0lEIFJ0bXBQQ0lEYXRhS2lja091dCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVDSEFSCQkJUXVlSWR4KTsKK3UxNiBSdG1wUENJX1dyaXRlRnJhZ1R4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgICB1OCBmcmFnTnVtLCB1MTYgKiBGcmVlTnVtYmVyKTsKIAordTE2IFJ0bXBQQ0lfV3JpdGVTdWJUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgIElOIEJPT0xFQU4gYklzTGFzdCwgdTE2ICogRnJlZU51bWJlcik7CiAKLWludCBSdG1wUENJTWdtdEtpY2tPdXQoCi0JSU4gUlRNUF9BREFQVEVSIAkqcEFkLAotCUlOIFVDSEFSIAkJCVF1ZUlkeCwKLQlJTiBQTkRJU19QQUNLRVQJCXBQYWNrZXQsCi0JSU4gUFVDSEFSCQkJcFNyY0J1ZlZBLAotCUlOIFVJTlQgCQkJU3JjQnVmTGVuKTsKK3ZvaWQgUnRtcFBDSV9GaW5hbFdyaXRlVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICB1MTYgdG90YWxNUERVU2l6ZSwKKwkJCQkgIHUxNiBGaXJzdFR4SWR4KTsKIAordm9pZCBSdG1wUENJRGF0YUxhc3RUeElkeChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHU4IFF1ZUlkeCwgdTE2IExhc3RUeElkeCk7CiAKLU5ESVNfU1RBVFVTIFJUTVBDaGVja1J4RXJyb3IoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBIRUFERVJfODAyXzExICBwSGVhZGVyLAotCUlOCVBSWFdJX1NUUlVDCXBSeFdJLAotCUlOICBQUlQyOFhYX1JYRF9TVFJVQyAgICAgIHBSeEQpOwordm9pZCBSdG1wUENJRGF0YUtpY2tPdXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLCB1OCBRdWVJZHgpOwogCi1WT0lEIFJUTVBJbml0UENJZUxpbmtDdHJsVmFsdWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOworaW50IFJ0bXBQQ0lNZ210S2lja091dChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCBRdWVJZHgsCisJCSAgICAgICB2b2lkICpwUGFja2V0LAorCQkgICAgICAgdTggKnBTcmNCdWZWQSwgdTMyIFNyY0J1Zkxlbik7CiAKLVZPSUQgUlRNUEZpbmRIb3N0UENJRGV2KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkKTsKK2ludCBSVE1QQ2hlY2tSeEVycm9yKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyLAorCQkJICAgICBzdHJ1Y3QgcnRfcnh3aSAqIHBSeFdJLCBJTiBQUlQyOFhYX1JYRF9TVFJVQyBwUnhEKTsKIAotVk9JRCBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgVUNIQVIJCUxldmVsKTsKK0JPT0xFQU4gUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHU4IExldmVsLCB1MTYgVGJ0dE51bVRvTmV4dFdha2VVcCk7CiAKLVZPSUQgUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gCVVTSE9SVAkJTWF4KTsKK0JPT0xFQU4gUlQyOHh4UGNpQXNpY1JhZGlvT24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBMZXZlbCk7CiAKLVZPSUQgUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCUlOIFVDSEFSICAgICAgICAgICAgTGV2ZWwsCi0JSU4gVVNIT1JUICAgICAgICAgICBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKK3ZvaWQgUlRNUEluaXRQQ0llTGlua0N0cmxWYWx1ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1CT09MRUFOIFJUMjh4eFBjaUFzaWNSYWRpb09uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSICAgICBMZXZlbCk7Cit2b2lkIFJUTVBGaW5kSG9zdFBDSURldihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiAgICAJIExldmVsKTsKK3ZvaWQgUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IExldmVsKTsKIAotVk9JRCBSVDI4eHhQY2lTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCk7Cit2b2lkIFJUTVBQQ0llTGlua0N0cmxTZXR0aW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTE2IE1heCk7CiAKLVZPSUQgUHNQb2xsV2FrZUV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKK3ZvaWQgUlRNUHJ0M3hTZXRQQ0llUG93ZXJMaW5rQ3RybChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEICBSYWRpb09uRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwordm9pZCBQc1BvbGxXYWtlRXhlYyh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CiAKLVZPSUQgUlQyOHh4UGNpTWxtZVJhZGlvT24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBSYWRpb09uRXhlYyh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CiAKLVZPSUQgUlQyOHh4UGNpTWxtZVJhZGlvT0ZGKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLSNlbmRpZiAvKiBSVDI4NjAgKi8KK3ZvaWQgUlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gQk9PTEVBTiBiRnJvbVR4KTsKIAotVk9JRCBBc2ljVHVybk9mZlJGQ2xrKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCUlOCVVDSEFSICAgICAgICAgICBDaGFubmVsKTsKK3ZvaWQgUlQyOHh4UGNpU3RhQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgdTE2IFRidHROdW1Ub05leHRXYWtlVXApOwogCi1WT0lEIEFzaWNUdXJuT25SRkNsaygKLQlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCi0JSU4JVUNIQVIJCQlDaGFubmVsKTsKK3ZvaWQgUlQyOHh4UGNpTWxtZVJhZGlvT24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotTlRTVEFUVVMgUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJUmVnSUQsCi0JSU4JVUNIQVIJCQlWYWx1ZSk7Cit2b2lkIFJUMjh4eFBjaU1sbWVSYWRpb09GRihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi1OVFNUQVRVUyBSVDMweHhSZWFkUkZSZWdpc3RlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVJlZ0lELAotCUlOCVBVQ0hBUgkJCXBWYWx1ZSk7CisjaWZkZWYgUlRNUF9NQUNfVVNCCisvKiAqLworLyogRnVuY3Rpb24gUHJvdG90eXBlIGluIHJ0dXNiX2J1bGsuYyAqLworLyogKi8KK3ZvaWQgUlRVU0JJbml0VHhEZXNjKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICBzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcFR4Q29udGV4dCwKKwkJICAgICB1OCBCdWxrT3V0UGlwZUlkLCBJTiB1c2JfY29tcGxldGVfdCBGdW5jKTsKIAotVUNIQVIgZUZ1c2VSZWFkUmVnaXN0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlPVVQJVVNIT1JUKiBwRGF0YSk7Cit2b2lkIFJUVVNCSW5pdEhUVHhEZXNjKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwVHhDb250ZXh0LAorCQkgICAgICAgdTggQnVsa091dFBpcGVJZCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgQnVsa091dFNpemUsIElOIHVzYl9jb21wbGV0ZV90IEZ1bmMpOwogCi1WT0lEIGVGdXNlUmVhZFBoeXNpY2FsKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotICAJSU4JUFVTSE9SVCBscEluQnVmZmVyLAotICAJSU4JVUxPTkcgbkluQnVmZmVyU2l6ZSwKLSAgCU9VVAlQVVNIT1JUIGxwT3V0QnVmZmVyLAotICAJSU4JVUxPTkcgbk91dEJ1ZmZlclNpemUKLSk7Cit2b2lkIFJUVVNCSW5pdFJ4RGVzYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0KTsKIAotTlRTVEFUVVMgZUZ1c2VSZWFkKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlPVVQJUFVDSEFSCQkJcERhdGEsCi0JSU4JVVNIT1JUCQkJTGVuZ3RoKTsKK3ZvaWQgUlRVU0JDbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIGVGdXNlUGh5c2ljYWxXcml0ZVJlZ2lzdGVycygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQgT2Zmc2V0LAotCUlOCVVTSE9SVCBMZW5ndGgsCi0JT1VUCVVTSE9SVCogcERhdGEpOwordm9pZCBSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLU5UU1RBVFVTIGVGdXNlV3JpdGVSZWdpc3RlcnMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUIE9mZnNldCwKLQlJTglVU0hPUlQgTGVuZ3RoLAotCUlOCVVTSE9SVCogcERhdGEpOwordm9pZCBSVFVTQkJ1bGtPdXREYXRhUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1OCBCdWxrT3V0UGlwZUlkLCB1OCBJbmRleCk7CiAKLVZPSUQgZUZ1c2VXcml0ZVBoeXNpY2FsKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotICAJUFVTSE9SVCBscEluQnVmZmVyLAotCVVMT05HIG5JbkJ1ZmZlclNpemUsCi0gIAlQVUNIQVIgbHBPdXRCdWZmZXIsCi0gIAlVTE9ORyBuT3V0QnVmZmVyU2l6ZQotKTsKK3ZvaWQgUlRVU0JCdWxrT3V0TnVsbEZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLU5UU1RBVFVTIGVGdXNlV3JpdGUoCi0gICAJSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVTSE9SVAkJCWxlbmd0aCk7Cit2b2lkIFJUVVNCQnVsa091dFJUU0ZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLUlOVCBzZXRfZUZ1c2VHZXRGcmVlQmxvY2tDb3VudF9Qcm9jKAotICAgCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Cit2b2lkIFJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1JTlQgc2V0X2VGdXNlZHVtcF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Cit2b2lkIFJUVVNCQ2FuY2VsUGVuZGluZ0lSUHMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotSU5UIHNldF9lRnVzZUxvYWRGcm9tQmluX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKK3ZvaWQgUlRVU0JCdWxrT3V0TUxNRVBhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IEluZGV4KTsKIAotTlRTVEFUVVMgZUZ1c2VXcml0ZVJlZ2lzdGVyc0Zyb21CaW4oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUIE9mZnNldCwKLQlJTglVU0hPUlQgTGVuZ3RoLAotCUlOCVVTSE9SVCogcERhdGEpOwordm9pZCBSVFVTQkJ1bGtPdXRQc1BvbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBlRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQgT2Zmc2V0LAotCUlOCVVTSE9SVCBMZW5ndGgsCi0JT1VUCVVTSE9SVCogcERhdGEpOwordm9pZCBSVFVTQkNsZWFuVXBNTE1FQnVsa091dFF1ZXVlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUlQzMHh4TG9hZFJGTm9ybWFsTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIgCXBBZCk7Cit2b2lkIFJUVVNCS2lja0J1bGtPdXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSVDMweHhMb2FkUkZTbGVlcE1vZGVTZXR1cCgKLQlJTiBQUlRNUF9BREFQVEVSIAlwQWQpOwordm9pZCBSVFVTQkJ1bGtSZWNlaXZlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUlQzMHh4UmV2ZXJzZVJGU2xlZXBNb2RlU2V0dXAoCi0JSU4gUFJUTVBfQURBUFRFUiAJcEFkKTsKK3ZvaWQgRG9CdWxrSW4oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotI2lmZGVmIFJUMjg3MAotLy8KLS8vIEZ1bmN0aW9uIFByb3RvdHlwZSBpbiBydHVzYl9idWxrLmMKLS8vCi1WT0lECVJUVVNCSW5pdFR4RGVzYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVFhfQ09OVEVYVAkJcFR4Q29udGV4dCwKLQlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQsCi0JSU4JdXNiX2NvbXBsZXRlX3QJRnVuYyk7Cit2b2lkIFJUVVNCSW5pdFJ4RGVzYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0KTsKIAotVk9JRAlSVFVTQkluaXRIVFR4RGVzYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQSFRfVFhfQ09OVEVYVAlwVHhDb250ZXh0LAotCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKLQlJTglVTE9ORwkJCUJ1bGtPdXRTaXplLAotCUlOCXVzYl9jb21wbGV0ZV90CUZ1bmMpOwordm9pZCBSVFVTQkJ1bGtSeEhhbmRsZShJTiB1bnNpZ25lZCBsb25nIGRhdGEpOwogCi1WT0lEIFJUVVNCQ2xlYW5VcERhdGFCdWxrT3V0UXVldWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOworLyogKi8KKy8qIEZ1bmN0aW9uIFByb3RvdHlwZSBpbiBydHVzYl9pby5jICovCisvKiAqLworaW50IFJUVVNCTXVsdGlSZWFkKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXUxNiBPZmZzZXQsIHU4ICpwRGF0YSwgdTE2IGxlbmd0aCk7CiAKLVZPSUQgUlRVU0JDYW5jZWxQZW5kaW5nQnVsa091dElSUCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7CitpbnQgUlRVU0JNdWx0aVdyaXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSB1MTYgT2Zmc2V0LCB1OCAqcERhdGEsIHUxNiBsZW5ndGgpOwogCi1WT0lEIFJUVVNCQnVsa091dERhdGFQYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlCdWxrT3V0UGlwZUlkLAotCUlOCVVDSEFSCQkJSW5kZXgpOworaW50IFJUVVNCTXVsdGlXcml0ZV9PbmVCeXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgdTE2IE9mZnNldCwgdTggKnBEYXRhKTsKIAotVk9JRCBSVFVTQkJ1bGtPdXROdWxsRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOworaW50IFJUVVNCUmVhZEJCUFJlZ2lzdGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHU4IElkLCB1OCAqcFZhbHVlKTsKIAotVk9JRCBSVFVTQkJ1bGtPdXRSVFNGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7CitpbnQgUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICB1OCBJZCwgdTggVmFsdWUpOwogCi1WT0lEIFJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7CitpbnQgUlRVU0JXcml0ZVJGUmVnaXN0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MzIgVmFsdWUpOwogCi1WT0lEIFJUVVNCQ2FuY2VsUGVuZGluZ0lSUHMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOworaW50IFJUVVNCX1ZlbmRvclJlcXVlc3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1MzIgVHJhbnNmZXJGbGFncywKKwkJCSAgICAgdTggUmVzZXJ2ZWRCaXRzLAorCQkJICAgICB1OCBSZXF1ZXN0LAorCQkJICAgICB1MTYgVmFsdWUsCisJCQkgICAgIHUxNiBJbmRleCwKKwkJCSAgICAgdm9pZCAqVHJhbnNmZXJCdWZmZXIsCisJCQkgICAgIHUzMiBUcmFuc2ZlckJ1ZmZlckxlbmd0aCk7CiAKLVZPSUQgUlRVU0JCdWxrT3V0TUxNRVBhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUluZGV4KTsKK2ludCBSVFVTQlJlYWRFRVBST00oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHUxNiBPZmZzZXQsIHU4ICpwRGF0YSwgdTE2IGxlbmd0aCk7CiAKLVZPSUQgUlRVU0JCdWxrT3V0UHNQb2xsKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKK2ludCBSVFVTQldyaXRlRUVQUk9NKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgdTE2IE9mZnNldCwgdTggKnBEYXRhLCB1MTYgbGVuZ3RoKTsKIAotVk9JRCBSVFVTQkNsZWFuVXBNTE1FQnVsa091dFF1ZXVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKK3ZvaWQgUlRVU0JQdXRUb1NsZWVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUlRVU0JLaWNrQnVsa091dCgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCk7CitpbnQgUlRVU0JXYWtlVXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRAlSVFVTQkJ1bGtSZWNlaXZlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKK3ZvaWQgUlRVU0JJbml0aWFsaXplQ21kUShzdHJ1Y3QgcnRfY21kcSAqY21kcSk7CiAKLVZPSUQgRG9CdWxrSW4oCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOworaW50IFJUVVNCRW5xdWV1ZUNtZEZyb21OZGlzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgSU4gTkRJU19PSUQgT2lkLAorCQkJCSAgICBJTiBCT09MRUFOIFNldEluZm9ybWF0aW9uLAorCQkJCSAgICB2b2lkICpwSW5mb3JtYXRpb25CdWZmZXIsCisJCQkJICAgIHUzMiBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCk7CiAKLVZPSUQgUlRVU0JJbml0UnhEZXNjKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICBQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dCk7CitpbnQgUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgICBJTiBORElTX09JRCBPaWQsCisJCQkJICAgIHZvaWQgKnBJbmZvcm1hdGlvbkJ1ZmZlciwKKwkJCQkgICAgdTMyIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKIAotLy8KLS8vIEZ1bmN0aW9uIFByb3RvdHlwZSBpbiBydHVzYl9pby5jCi0vLwotTlRTVEFUVVMgUlRVU0JNdWx0aVJlYWQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCU9VVAlQVUNIQVIJCQlwRGF0YSwKLQlJTglVU0hPUlQJCQlsZW5ndGgpOwordm9pZCBSVFVTQkRlcXVldWVDbWQoc3RydWN0IHJ0X2NtZHEgKmNtZHEsIHN0cnVjdCBydF9jbWRxZWxtdCAqICogcGNtZHFlbG10KTsKIAotTlRTVEFUVVMgUlRVU0JNdWx0aVdyaXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVU0hPUlQJCQlsZW5ndGgpOworaW50IFJUVVNCQ21kVGhyZWFkKElOIHZvaWQgKkNvbnRleHQpOwogCi1OVFNUQVRVUyBSVFVTQk11bHRpV3JpdGVfT25lQnl0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JSU4JUFVDSEFSCQkJcERhdGEpOwordm9pZCBSVFVTQkJzc0JlYWNvbkV4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotTlRTVEFUVVMgUlRVU0JSZWFkQkJQUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlJZCwKLQlJTglQVUNIQVIJCQlwVmFsdWUpOwordm9pZCBSVFVTQkJzc0JlYWNvblN0b3Aoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotTlRTVEFUVVMgUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJSWQsCi0JSU4JVUNIQVIJCQlWYWx1ZSk7Ci0KLU5UU1RBVFVTIFJUVVNCV3JpdGVSRlJlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVJTlQzMgkJCVZhbHVlKTsKLQotTlRTVEFUVVMgUlRVU0JfVmVuZG9yUmVxdWVzdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVSU5UMzIJCQlUcmFuc2ZlckZsYWdzLAotCUlOCVVDSEFSCQkJUmVzZXJ2ZWRCaXRzLAotCUlOCVVDSEFSCQkJUmVxdWVzdCwKLQlJTglVU0hPUlQJCQlWYWx1ZSwKLQlJTglVU0hPUlQJCQlJbmRleCwKLQlJTglQVk9JRAkJCVRyYW5zZmVyQnVmZmVyLAotCUlOCVVJTlQzMgkJCVRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKLQotTlRTVEFUVVMgUlRVU0JSZWFkRUVQUk9NKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlPVVQJUFVDSEFSCQkJcERhdGEsCi0JSU4JVVNIT1JUCQkJbGVuZ3RoKTsKLQotTlRTVEFUVVMgUlRVU0JXcml0ZUVFUFJPTSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVVNIT1JUCQkJbGVuZ3RoKTsKLQotVk9JRCBSVFVTQlB1dFRvU2xlZXAoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwotCi1OVFNUQVRVUyBSVFVTQldha2VVcCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgUlRVU0JJbml0aWFsaXplQ21kUSgKLQlJTglQQ21kUQljbWRxKTsKLQotTkRJU19TVEFUVVMJUlRVU0JFbnF1ZXVlQ21kRnJvbU5kaXMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTkRJU19PSUQJCU9pZCwKLQlJTglCT09MRUFOCQkJU2V0SW5mb3JtYXRpb24sCi0JSU4JUFZPSUQJCQlwSW5mb3JtYXRpb25CdWZmZXIsCi0JSU4JVUlOVDMyCQkJSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOwotCi1ORElTX1NUQVRVUyBSVFVTQkVucXVldWVJbnRlcm5hbENtZCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBORElTX09JRAkJCU9pZCwKLQlJTiBQVk9JRAkJCXBJbmZvcm1hdGlvbkJ1ZmZlciwKLQlJTiBVSU5UMzIJCQlJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCk7Ci0KLVZPSUQgUlRVU0JEZXF1ZXVlQ21kKAotCUlOCVBDbWRRCQljbWRxLAotCU9VVAlQQ21kUUVsbXQJKnBjbWRxZWxtdCk7Ci0KLUlOVCBSVFVTQkNtZFRocmVhZCgKLQlJTiBPVVQgUFZPSUQgQ29udGV4dCk7Ci0KLUlOVCBUaW1lclFUaHJlYWQoCi0JSU4gT1VUIFBWT0lEIENvbnRleHQpOwotCi1SVDI4NzBfVElNRVJfRU5UUlkgKlJUMjg3MF9UaW1lclFfSW5zZXJ0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFJBTElOS19USU1FUl9TVFJVQ1QgKnBUaW1lcik7Ci0KLUJPT0xFQU4gUlQyODcwX1RpbWVyUV9SZW1vdmUoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUkFMSU5LX1RJTUVSX1NUUlVDVCAqcFRpbWVyKTsKLQotdm9pZCBSVDI4NzBfVGltZXJRX0V4aXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOwotCi12b2lkIFJUMjg3MF9UaW1lclFfSW5pdCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCk7Ci0KLVZPSUQgUlQyODcwX0Jzc0JlYWNvbkV4aXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOwordm9pZCBSVFVTQkJzc0JlYWNvblN0YXJ0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUlQyODcwX0Jzc0JlYWNvblN0b3AoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOwordm9pZCBSVFVTQkJzc0JlYWNvbkluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSVDI4NzBfQnNzQmVhY29uU3RhcnQoCi0JSU4gUlRNUF9BREFQVEVSICogcEFkKTsKK3ZvaWQgUlRVU0JXYXRjaERvZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJUMjg3MF9Cc3NCZWFjb25Jbml0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKK2ludCBSVFVTQldyaXRlTUFDUmVnaXN0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIHUxNiBPZmZzZXQsIHUzMiBWYWx1ZSk7CiAKLVZPSUQgUlQyODcwX1dhdGNoRG9nKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKK2ludCBSVFVTQlJlYWRNQUNSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICB1MTYgT2Zmc2V0LCB1MzIgKnBWYWx1ZSk7CiAKLU5UU1RBVFVTIFJUVVNCV3JpdGVNQUNSZWdpc3RlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JSU4JVUlOVDMyCQkJVmFsdWUpOworaW50IFJUVVNCU2luZ2xlV3JpdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICB1MTYgT2Zmc2V0LCB1MTYgVmFsdWUpOwogCi1OVFNUQVRVUyBSVFVTQlJlYWRNQUNSZWdpc3RlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JT1VUCVBVSU5UMzIJCQlwVmFsdWUpOworaW50IFJUVVNCRmlybXdhcmVXcml0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgdTggKnBGd0ltYWdlLCB1bnNpZ25lZCBsb25nIEZ3TGVuKTsKIAotTlRTVEFUVVMgUlRVU0JTaW5nbGVXcml0ZSgKLQlJTiAJUlRNUF9BREFQVEVSIAkqcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlJTglVU0hPUlQJCQlWYWx1ZSk7CitpbnQgUlRVU0JWZW5kZXJSZXNldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1OVFNUQVRVUyBSVFVTQkZpcm13YXJlUnVuKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKK2ludCBSVFVTQlNldEhhcmRXYXJlUmVnaXN0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIsIHZvaWQgKnBCdWYpOwogCi1OVFNUQVRVUyBSVFVTQkZpcm13YXJlV3JpdGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSCQlwRndJbWFnZSwKLQlJTiBVTE9ORwkJRndMZW4pOworaW50IFJUVVNCUXVlcnlIYXJkV2FyZVJlZ2lzdGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyLAorCQkJCSAgICAgICB2b2lkICpwQnVmKTsKIAotTlRTVEFUVVMJUlRVU0JGaXJtd2FyZU9wbW9kZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVJTlQzMgkJCXBWYWx1ZSk7Cit2b2lkIENNREhhbmRsZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotTlRTVEFUVVMJUlRVU0JWZW5kZXJSZXNldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7CitpbnQgUlRVU0JXcml0ZUhXTUFDQWRkcmVzcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlcik7CiAKLVZPSUQgQ01ESGFuZGxlcigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIE1hY1RhYmxlSW5pdGlhbGl6ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCit2b2lkIE1sbWVTZXRQc20oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MTYgcHNtKTsKIAotTkRJU19TVEFUVVMJIENyZWF0ZVRocmVhZHMoCi0JSU4Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgKTsKK2ludCBSVE1QV1BBQWRkS2V5UHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHZvaWQgKnBCdWYpOwogCit2b2lkIEFzaWNSeEFudEV2YWxBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBNYWNUYWJsZUluaXRpYWxpemUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBhcHBlbmRfcGt0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJdTggKnBIZWFkZXI4MDJfMywKKwkJdTMyIEhkckxlbiwKKwkJdTggKnBEYXRhLAorCQl1bnNpZ25lZCBsb25nIERhdGFTaXplLCB2b2lkICoqIHBwUGFja2V0KTsKIAotVk9JRCBNbG1lU2V0UHNtKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVCBwc20pOwordTMyIGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQl2b2lkICpwUGFja2V0LAorCQkJCXU4ICpwRGF0YSwgdW5zaWduZWQgbG9uZyBEYXRhU2l6ZSk7CiAKLU5ESVNfU1RBVFVTIFJUTVBXUEFBZGRLZXlQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVk9JRCAgICAgICAgICAgcEJ1Zik7CitpbnQgUlRNUENoZWNrUnhFcnJvcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlciwKKwkJCSAgICAgc3RydWN0IHJ0X3J4d2kgKiBwUnhXSSwKKwkJCSAgICAgSU4gUFJUMjhYWF9SWERfU1RSVUMgcFJ4SU5GTyk7CiAKLVZPSUQgQXNpY1J4QW50RXZhbEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIFJUVVNCTWxtZUhhcmRUcmFuc21pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tZ210ICpwTWdtdCk7CiAKLU5ESVNfU1RBVFVTCVJUTVBDaGVja1J4RXJyb3IoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUEhFQURFUl84MDJfMTEJcEhlYWRlciwKLQlJTglQUlhXSV9TVFJVQwlwUnhXSSwKLQlJTglQUlQyOFhYX1JYRF9TVFJVQwlwUnhJTkZPKTsKK2ludCBNbG1lVGhyZWFkKHZvaWQgKkNvbnRleHQpOwogCi1JTlQgTWxtZVRocmVhZCgKLQlJTiBQVk9JRCBDb250ZXh0KTsKKy8qICovCisvKiBGdW5jdGlvbiBQcm90b3R5cGUgaW4gcnR1c2JfZGF0YS5jICovCisvKiAqLworaW50IFJUVVNCRnJlZURlc2NyaXB0b3JSZXF1ZXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgICAgdTggQnVsa091dFBpcGVJZCwKKwkJCQkgICAgICAgdTMyIE51bWJlclJlcXVpcmVkKTsKIAotLy8KLS8vIEZ1bmN0aW9uIFByb3RvdHlwZSBpbiBydHVzYl9kYXRhLmMKLS8vCi1ORElTX1NUQVRVUwlSVFVTQkZyZWVEZXNjcmlwdG9yUmVxdWVzdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQsCi0JSU4JVUlOVDMyCQkJTnVtYmVyUmVxdWlyZWQpOworQk9PTEVBTiBSVFVTQk5lZWRRdWV1ZUJhY2tGb3JBZ2coc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBCdWxrT3V0UGlwZUlkKTsKIAordm9pZCBSVE1QV3JpdGVUeEluZm8oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgIHN0cnVjdCBydF90eGluZm8gKnBUeEluZm8sCisJCSAgICAgdTE2IFVTQkRNQXBrdExlbiwKKwkJICAgICBJTiBCT09MRUFOIGJXaXYsCisJCSAgICAgdTggUXVldWVTZWwsIHU4IE5leHRWYWxpZCwgdTggVHhCdXJzdCk7CiAKLUJPT0xFQU4JUlRVU0JOZWVkUXVldWVCYWNrRm9yQWdnKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFVDSEFSCQlCdWxrT3V0UGlwZUlkKTsKKy8qICovCisvKiBGdW5jdGlvbiBQcm90b3R5cGUgaW4gY21tX2RhdGFfdXNiLmMgKi8KKy8qICovCit1MTYgUnRtcFVTQl9Xcml0ZVN1YlR4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJCSAgSU4gQk9PTEVBTiBiSXNMYXN0LCB1MTYgKiBGcmVlTnVtYmVyKTsKIAordTE2IFJ0bXBVU0JfV3JpdGVTaW5nbGVUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgICAgIElOIEJPT0xFQU4gYklzTGFzdCwKKwkJCQkgICAgIHUxNiAqIEZyZWVOdW1iZXIpOwogCi1WT0lEIFJUTVBXcml0ZVR4SW5mbygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVFhJTkZPX1NUUlVDIAlwVHhJbmZvLAotCUlOCSAgVVNIT1JUCQlVU0JETUFwa3RMZW4sCi0JSU4JICBCT09MRUFOCQliV2l2LAotCUlOCSAgVUNIQVIJCQlRdWV1ZVNlbCwKLQlJTgkgIFVDSEFSCQkJTmV4dFZhbGlkLAotCUlOCSAgVUNIQVIJCQlUeEJ1cnN0KTsKK3UxNiBSdG1wVVNCX1dyaXRlRnJhZ1R4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgICB1OCBmcmFnTnVtLCB1MTYgKiBGcmVlTnVtYmVyKTsKIAotLy8KLS8vIEZ1bmN0aW9uIFByb3RvdHlwZSBpbiBjbW1fZGF0YV8yODcwLmMKLS8vCi1VU0hPUlQgUnRtcFVTQl9Xcml0ZVN1YlR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglCT09MRUFOCQkJYklzTGFzdCwKLQlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOwordTE2IFJ0bXBVU0JfV3JpdGVNdWx0aVR4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICAgIHU4IGZyYW1lTnVtLCB1MTYgKiBGcmVlTnVtYmVyKTsKIAotVVNIT1JUIFJ0bXBVU0JfV3JpdGVTaW5nbGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JQk9PTEVBTgkJCWJJc0xhc3QsCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKK3ZvaWQgUnRtcFVTQl9GaW5hbFdyaXRlVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICB1MTYgdG90YWxNUERVU2l6ZSwgdTE2IFR4SWR4KTsKIAotVVNIT1JUCVJ0bXBVU0JfV3JpdGVGcmFnVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVDSEFSCQkJZnJhZ051bSwKLQlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOwordm9pZCBSdG1wVVNCRGF0YUxhc3RUeElkeChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHU4IFF1ZUlkeCwgdTE2IFR4SWR4KTsKIAotVVNIT1JUIFJ0bXBVU0JfV3JpdGVNdWx0aVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYW1lTnVtLAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7Cit2b2lkIFJ0bXBVU0JEYXRhS2lja091dChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssIHU4IFF1ZUlkeCk7CiAKLVZPSUQgUnRtcFVTQl9GaW5hbFdyaXRlVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVTSE9SVAkJCXRvdGFsTVBEVVNpemUsCi0jaWZkZWYgUlQyODYwCi0JSU4JVVNIT1JUCQkJRmlyc3RUeElkeCk7Ci0jZW5kaWYKLQlJTglVU0hPUlQJCQlUeElkeCk7CitpbnQgUnRtcFVTQk1nbXRLaWNrT3V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHU4IFF1ZUlkeCwKKwkJICAgICAgIHZvaWQgKnBQYWNrZXQsCisJCSAgICAgICB1OCAqcFNyY0J1ZlZBLCB1MzIgU3JjQnVmTGVuKTsKIAotVk9JRCBSdG1wVVNCRGF0YUxhc3RUeElkeCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglVU0hPUlQJCQlUeElkeCk7Cit2b2lkIFJ0bXBVU0JOdWxsRnJhbWVLaWNrT3V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTggUXVlSWR4LAorCQkJICAgICB1OCAqIHBOdWxsRnJhbWUsIHUzMiBmcmFtZUxlbik7CiAKLVZPSUQgUnRtcFVTQkRhdGFLaWNrT3V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVUNIQVIJCQlRdWVJZHgpOwordm9pZCBSdG1wVXNiU3RhQXNpY0ZvcmNlV2FrZXVwVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCQkJICAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkJCSAgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwKKwkJCQkgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOwogCit2b2lkIFJUMjh4eFVzYlN0YUFzaWNGb3JjZVdha2V1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYkZyb21UeCk7CiAKLWludCBSdG1wVVNCTWdtdEtpY2tPdXQoCi0JSU4gUlRNUF9BREFQVEVSIAkqcEFkLAotCUlOIFVDSEFSIAkJCVF1ZUlkeCwKLQlJTiBQTkRJU19QQUNLRVQJCXBQYWNrZXQsCi0JSU4gUFVDSEFSCQkJcFNyY0J1ZlZBLAotCUlOIFVJTlQgCQkJU3JjQnVmTGVuKTsKK3ZvaWQgUlQyOHh4VXNiU3RhQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgdTE2IFRidHROdW1Ub05leHRXYWtlVXApOwogCi1WT0lEIFJ0bXBVU0JOdWxsRnJhbWVLaWNrT3V0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFVDSEFSCQlRdWVJZHgsCi0JSU4gVUNIQVIJCSpwTnVsbEZyYW1lLAotCUlOIFVJTlQzMgkJZnJhbWVMZW4pOwordm9pZCBSVDI4eHhVc2JNbG1lUmFkaW9PbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJUMjh4eFVzYlN0YUFzaWNGb3JjZVdha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOICAgICAgIGJGcm9tVHgpOwordm9pZCBSVDI4eHhVc2JNbG1lUmFkaW9PRkYoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotVk9JRCBSVDI4eHhVc2JTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCk7Cit2b2lkIEFzaWNUdXJuT2ZmUkZDbGsoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBDaGFubmVsKTsKIAotVk9JRCBSVDI4eHhVc2JNbG1lUmFkaW9PbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIEFzaWNUdXJuT25SRkNsayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IENoYW5uZWwpOwogCi1WT0lEIFJUMjh4eFVzYk1sbWVSYWRpb09GRigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisjaWZkZWYgUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQKK2ludCBSdG1wVGltZXJRVGhyZWFkKElOIHZvaWQgKkNvbnRleHQpOwogCi1JTlQgUlRNUFNob3dDZmdWYWx1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwTmFtZSwKLQlJTglQVUNIQVIJCQlwQnVmKTsKK3N0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfZW50cnkgKlJ0bXBUaW1lclFJbnNlcnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyICpwVGltZXIpOwogCi1QQ0hBUiAgIFJUTVBHZXRSYWxpbmtBdXRoTW9kZVN0cigKLSAgICBJTiAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSBhdXRoTW9kZSk7CitCT09MRUFOIFJ0bXBUaW1lclFSZW1vdmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHN0cnVjdCBydF9yYWxpbmtfdGltZXIgKnBUaW1lcik7CiAKLVBDSEFSICAgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cigKLSAgICBJTiAgVVNIT1JUIGVuY3J5TW9kZSk7Cit2b2lkIFJ0bXBUaW1lclFFeGl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgQXNpY1N0YUJicFR1bmluZygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIFJ0bXBUaW1lclFJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CisjZW5kaWYgLyogUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQgLy8gKi8KIAotI2lmZGVmIFJUMjg2MAotVk9JRCBBc2ljUmVzZXRGcm9tRE1BQnVzeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIEFzaWNTdGFCYnBUdW5pbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBBc2ljUmVzZXRCQlAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOworQk9PTEVBTiBTdGFBZGRNYWNUYWJsZUVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksCisJCQkgICAgdTggTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywKKwkJCSAgICBzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSAqIHBIdENhcGFiaWxpdHksCisJCQkgICAgdTggSHRDYXBhYmlsaXR5TGVuLAorCQkJICAgIHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSAqIHBBZGRIdEluZm8sCisJCQkgICAgdTggQWRkSHRJbmZvTGVuLCB1MTYgQ2FwYWJpbGl0eUluZm8pOwogCi1WT0lEIEFzaWNSZXNldE1BQygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CitCT09MRUFOIEFVVEhfUmVxU2VuZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqcEVsZW0sCisJCSAgICAgc3RydWN0IHJ0X3JhbGlua190aW1lciAqcEF1dGhUaW1lciwKKwkJICAgICBjaGFyICpwU01OYW1lLAorCQkgICAgIHUxNiBTZXFObywKKwkJICAgICB1OCAqcE5ld0VsZW1lbnQsIHVuc2lnbmVkIGxvbmcgRWxlbWVudExlbik7CiAKLVZPSUQgQXNpY1Jlc2V0UEJGKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotQk9PTEVBTiBTdGFBZGRNYWNUYWJsZUVudHJ5KAotCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAotCUlOICBVQ0hBUgkJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAotCUlOICBIVF9DQVBBQklMSVRZX0lFCSpwSHRDYXBhYmlsaXR5LAotCUlOICBVQ0hBUgkJCQlIdENhcGFiaWxpdHlMZW4sCi0JSU4gIFVTSE9SVCAgICAgICAgCQlDYXBhYmlsaXR5SW5mbyk7Ci0jZW5kaWYKK3ZvaWQgUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotdm9pZCBSVE1QX0luZGljYXRlTWVkaWFTdGF0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Cit2b2lkIFJlU3luY0JlYWNvblRpbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSZVN5bmNCZWFjb25UaW1lKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgUlRNUFNldEFHQ0luaXRWYWx1ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IEJhbmRXaWR0aCk7CiAKLVZPSUQgUlRNUFNldEFHQ0luaXRWYWx1ZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVQ0hBUgkJCUJhbmRXaWR0aCk7CitpbnQgcnQyOHh4X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IHJ0Mjh4eF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCi1pbnQgcnQyOHh4X2Nsb3NlKElOIFBORVRfREVWIGRldik7Ci1pbnQgcnQyOHh4X29wZW4oSU4gUE5FVF9ERVYgZGV2KTsKKyNkZWZpbmUgVklSVFVBTF9JRl9JTkMoX19wQWQpICgoX19wQWQpLT5WaXJ0dWFsSWZDbnQrKykKKyNkZWZpbmUgVklSVFVBTF9JRl9ERUMoX19wQWQpICgoX19wQWQpLT5WaXJ0dWFsSWZDbnQtLSkKKyNkZWZpbmUgVklSVFVBTF9JRl9OVU0oX19wQWQpICgoX19wQWQpLT5WaXJ0dWFsSWZDbnQpCiAKLV9faW5saW5lIElOVCBWSVJUVUFMX0lGX1VQKFBSVE1QX0FEQVBURVIgcEFkKQorI2lmZGVmIExJTlVYCitfX2lubGluZSBpbnQgVklSVFVBTF9JRl9VUChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JaWYgKFZJUlRVQUxfSUZfTlVNKHBBZCkgPT0gMCkKLQl7Ci0JCWlmIChydDI4eHhfb3BlbihwQWQtPm5ldF9kZXYpICE9IDApCisJaWYgKFZJUlRVQUxfSUZfTlVNKHBBZCkgPT0gMCkgeworCQlpZiAocnQyOHh4X29wZW4ocEFkLT5uZXRfZGV2KSAhPSAwKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJydDI4eHhfb3BlbiByZXR1cm4gZmFpbCFcbiIpKTsKIAkJCXJldHVybiAtMTsKLQl9Ci0JZWxzZQotCXsKKwkJfQorCX0gZWxzZSB7CiAJfQogCVZJUlRVQUxfSUZfSU5DKHBBZCk7CiAJcmV0dXJuIDA7CiB9CiAKLV9faW5saW5lIFZPSUQgVklSVFVBTF9JRl9ET1dOKFBSVE1QX0FEQVBURVIgcEFkKQorX19pbmxpbmUgdm9pZCBWSVJUVUFMX0lGX0RPV04oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewogCVZJUlRVQUxfSUZfREVDKHBBZCk7CiAJaWYgKFZJUlRVQUxfSUZfTlVNKHBBZCkgPT0gMCkKIAkJcnQyOHh4X2Nsb3NlKHBBZC0+bmV0X2Rldik7CiAJcmV0dXJuOwogfQorI2VuZGlmIC8qIExJTlVYIC8vICovCiAKKy8qCisJT1MgUmVsYXRlZCBmdW5jaXRvbiBwcm90b3R5cGUgZGVmaW5pdGlvbnMuCisJVE9ETzogTWF5YmUgd2UgbmVlZCB0byBtb3ZlIHRoZXNlIGZ1bmN0aW9uIHByb3RvdHlwZXMgdG8gb3RoZXIgcHJvcGVyIHBsYWNlLgorKi8KK2ludCBSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgdTMyIGV2ZW50VHlwZSwKKwkJCSAgICBpbnQgZmxhZ3MsCisJCQkgICAgdTggKnBTcmNNYWMsCisJCQkgICAgdTggKnBEYXRhLCB1MzIgZGF0YUxlbik7CiAKLSNlbmRpZiAgLy8gX19SVE1QX0hfXworaW50IFJ0bXBPU05ldERldkFkZHJTZXQoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYsIHU4ICpwTWFjQWRkcik7CiAKK2ludCBSdG1wT1NOZXREZXZBdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYsCisJCSAgICAgICBzdHJ1Y3QgcnRfcnRtcF9vc19uZXRkZXZfb3BfaG9vayAqcERldk9wSG9vayk7CisKK3ZvaWQgUnRtcE9TTmV0RGV2Q2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYpOworCit2b2lkIFJ0bXBPU05ldERldkRldGFjaChzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldik7CisKK2ludCBSdG1wT1NOZXREZXZBbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqKiBwTmV3TmV0RGV2LCB1MzIgcHJpdkRhdGFTaXplKTsKKwordm9pZCBSdG1wT1NOZXREZXZGcmVlKHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2KTsKKworc3RydWN0IG5ldF9kZXZpY2UgKlJ0bXBPU05ldERldkdldEJ5TmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldiwgY2hhciAqcERldk5hbWUpOworCit2b2lkIFJ0bXBPU05ldERldmljZVJlZlB1dChzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldik7CisKK3N0cnVjdCBuZXRfZGV2aWNlICpSdG1wT1NOZXREZXZDcmVhdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIGludCBkZXZUeXBlLAorCQkJICAgIGludCBkZXZOdW0sCisJCQkgICAgaW50IHByaXZNZW1TaXplLCBjaGFyICpwTmFtZVByZWZpeCk7CisKKy8qCisJVGFzayBvcGVyYXRpb24gcmVsYXRlZCBmdW5jdGlvbiBwcm90b3R5cGVzCisqLwordm9pZCBSdG1wT1NUYXNrQ3VzdG9taXplKHN0cnVjdCBydF9ydG1wX29zX3Rhc2sgKnBUYXNrKTsKKworaW50IFJ0bXBPU1Rhc2tOb3RpZnlUb0V4aXQoc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqcFRhc2spOworCitpbnQgUnRtcE9TVGFza0tpbGwoc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqcFRhc2spOworCitpbnQgUnRtcE9TVGFza0luaXQoc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqcFRhc2ssCisJCQkgICBjaGFyICpwVGFza05hbWUsIHZvaWQgKiBwUHJpdik7CisKK2ludCBSdG1wT1NUYXNrQXR0YWNoKHN0cnVjdCBydF9ydG1wX29zX3Rhc2sgKnBUYXNrLAorCQkJICAgICBJTiBpbnQgKCpmbikgKHZvaWQgKiksIElOIHZvaWQgKmFyZyk7CisKKy8qCisJRmlsZSBvcGVyYXRpb24gcmVsYXRlZCBmdW5jdGlvbiBwcm90b3R5cGVzCisqLworc3RydWN0IGZpbGUgKlJ0bXBPU0ZpbGVPcGVuKElOIGNoYXIgKnBQYXRoLCBJTiBpbnQgZmxhZywgSU4gaW50IG1vZGUpOworCitpbnQgUnRtcE9TRmlsZUNsb3NlKHN0cnVjdCBmaWxlICpvc2ZkKTsKKwordm9pZCBSdG1wT1NGaWxlU2VlayhzdHJ1Y3QgZmlsZSAqb3NmZCwgSU4gaW50IG9mZnNldCk7CisKK2ludCBSdG1wT1NGaWxlUmVhZChzdHJ1Y3QgZmlsZSAqb3NmZCwgSU4gY2hhciAqcERhdGFQdHIsIElOIGludCByZWFkTGVuKTsKKworaW50IFJ0bXBPU0ZpbGVXcml0ZShzdHJ1Y3QgZmlsZSAqb3NmZCwgSU4gY2hhciAqcERhdGFQdHIsIElOIGludCB3cml0ZUxlbik7CisKKyNlbmRpZiAvKiBfX1JUTVBfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfY2hpcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2NoaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWRmMmNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2NoaXAuaApAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX2NoaXAuaAorCisJQWJzdHJhY3Q6CisJUmFsaW5rIFdpcmVsZXNzIENoaXAgcmVsYXRlZCBkZWZpbml0aW9uICYgc3RydWN0dXJlcworCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkgIFdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZglfX1JUTVBfQ0hJUF9IX18KKyNkZWZpbmUJX19SVE1QX0NISVBfSF9fCisKKyNpbmNsdWRlICJydG1wX3R5cGUuaCIKKworI2lmZGVmIFJUMjg2MAorI2luY2x1ZGUgImNoaXAvcnQyODYwLmgiCisjZW5kaWYgLyogUlQyODYwIC8vICovCisjaWZkZWYgUlQyODcwCisjaW5jbHVkZSAiY2hpcC9ydDI4NzAuaCIKKyNlbmRpZiAvKiBSVDI4NzAgLy8gKi8KKyNpZmRlZiBSVDMwNzAKKyNpbmNsdWRlICJjaGlwL3J0MzA3MC5oIgorI2VuZGlmIC8qIFJUMzA3MCAvLyAqLworI2lmZGVmIFJUMzA5MAorI2luY2x1ZGUgImNoaXAvcnQzMDkwLmgiCisjZW5kaWYgLyogUlQzMDkwIC8vICovCisKKy8qIFdlIHdpbGwgaGF2ZSBhIGNvc3QgZG93biB2ZXJzaW9uIHdoaWNoIG1hYyB2ZXJzaW9uIGlzIDB4MzA5MHh4eHggKi8KKy8qICovCisvKiBSVDMwOTBBIGZhY3RzICovCisvKiAqLworLyogYSkgMi40IEdIeiAqLworLyogYikgUmVwbGFjZW1lbnQgZm9yIFJUMzA5MCAqLworLyogYykgSW50ZXJuYWwgTE5BICovCisvKiBkKSBJbnRlcmZlcmVuY2Ugb3ZlciBjaGFubmVsICMxNCAqLworLyogZSkgTmV3IEJCUCBmZWF0dXJlcyAoZS5nLiwgU0lHIHJlLW1vZHVsYXRpb24pICovCisvKiAqLworI2RlZmluZSBJU19SVDMwOTBBKF9wQWQpCQkJCSgoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzA5MDAwMDApKQorCisvKiBXZSB3aWxsIGhhdmUgYSBjb3N0IGRvd24gdmVyc2lvbiB3aGljaCBtYWMgdmVyc2lvbiBpcyAweDMwOTB4eHh4ICovCisjZGVmaW5lIElTX1JUMzA5MChfcEFkKQkJCQkoKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZmYwMDAwKSA9PSAweDMwNzEwMDAwKSB8fCAoSVNfUlQzMDkwQShfcEFkKSkpCisKKyNkZWZpbmUgSVNfUlQzMDcwKF9wQWQpCQkoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzA3MDAwMDApCisjZGVmaW5lIElTX1JUMzA3MShfcEFkKQkJKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZmYwMDAwKSA9PSAweDMwNzEwMDAwKQorI2RlZmluZSBJU19SVDIwNzAoX3BBZCkJCSgoKF9wQWQpLT5SZkljVHlwZSA9PSBSRklDXzIwMjApIHx8ICgoX3BBZCktPkVGdXNlVGFnID09IDB4MjcpKQorCisjZGVmaW5lIElTX1JUMzB4eChfcEFkKQkJKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZjAwMDAwKSA9PSAweDMwNzAwMDAwfHxJU19SVDMwOTBBKF9wQWQpKQorLyojZGVmaW5lIElTX1JUMzA1WChfcEFkKSAgICAgICAgICAgICAgICgoX3BBZCktPk1BQ1ZlcnNpb24gPT0gMHgyODcyMDIwMCkgKi8KKworLyogUlQzNTcyLCAzNTkyLCAzNTYyLCAzMDYyIHNoYXJlIHRoZSBzYW1lIE1BQyB2ZXJzaW9uICovCisjZGVmaW5lIElTX1JUMzU3MihfcEFkKQkJKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZmYwMDAwKSA9PSAweDM1NzIwMDAwKQorI2RlZmluZSBJU19WRVJTSU9OX0JFRk9SRV9GKF9wQWQpCQkJKCgoX3BBZCktPk1BQ1ZlcnNpb24mMHhmZmZmKSA8PSAweDAyMTEpCisvKiBGIHZlcnNpb24gaXMgMHgwMjEyLCBFIHZlcnNpb24gaXMgMHgwMjExLiAzMDl4IGNhbiBzYXZlIG1vcmUgcG93ZXIgYWZ0ZXIgRiB2ZXJzaW9uLiAqLworI2RlZmluZSBJU19WRVJTSU9OX0FGVEVSX0YoX3BBZCkJCQkoKCgoX3BBZCktPk1BQ1ZlcnNpb24mMHhmZmZmKSA+PSAweDAyMTIpIHx8ICgoKF9wQWQpLT5iMzA5MEVTcGVjaWFsQ2hpcCA9PSBUUlVFKSkpCisvKiAqLworLyogUlQzMzkwIGZhY3RzICovCisvKiAqLworLyogYSkgQmFzZSBvbiBSVDMwOTAgKFJGIElDOiBSVDMwMjApICovCisvKiBiKSAyLjQgR0h6ICovCisvKiBjKSAxeDEgKi8KKy8qIGQpIFNpbmdsZSBjaGlwICovCisvKiBlKSBJbnRlcm5hbCBjb21wb25lbnRzOiBQQSBhbmQgTE5BICovCisvKiAqLworLypSVDMzOTAsUlQzMzcwICovCisjZGVmaW5lIElTX1JUMzM5MChfcEFkKQkJCQkoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4RkZGRjAwMDApID09IDB4MzM5MDAwMDApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogUENJIHJlZ2lzdGVycyAtIGJhc2UgYWRkcmVzcyAweDAwMDAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBDSElQX1BDSV9DRkcJCTB4MDAwMAorI2RlZmluZSBDSElQX1BDSV9FRUNUUkwJCTB4MDAwNAorI2RlZmluZSBDSElQX1BDSV9NQ1VDVFJMCTB4MDAwOAorCisjZGVmaW5lIE9QVF8xNAkJCTB4MTE0CisKKyNkZWZpbmUgUkVUUllfTElNSVQJCTEwCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogQkJQICYgUkYgICAgIGRlZmluaXRpb24gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZQlCVVNZCQkgICAgICAgICAgICAgICAgMQorI2RlZmluZQlJRExFCQkgICAgICAgICAgICAgICAgMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEVFUFJPTSBkZWZpbml0aW9uICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgRUVETyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgRUVESSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRUVDUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgRUVTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRUVSTCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKworI2RlZmluZSBFRVBST01fV1JJVEVfT1BDT0RFICAgICAgICAgMHgwNQorI2RlZmluZSBFRVBST01fUkVBRF9PUENPREUgICAgICAgICAgMHgwNgorI2RlZmluZSBFRVBST01fRVdEU19PUENPREUgICAgICAgICAgMHgxMAorI2RlZmluZSBFRVBST01fRVdFTl9PUENPREUgICAgICAgICAgMHgxMworCisjZGVmaW5lIE5VTV9FRVBST01fQkJQX1BBUk1TCQkxOQkvKiBJbmNsdWRlIE5JQyBDb25maWcgMCwgMSwgQ1IsIFRYIEFMQyBzdGVwLCBCQlBzICovCisjZGVmaW5lIE5VTV9FRVBST01fVFhfR19QQVJNUwkJNworI2RlZmluZSBFRVBST01fTklDMV9PRkZTRVQgICAgICAgICAgMHgzNAkvKiBUaGUgYWRkcmVzcyBpcyBmcm9tIE5JQyBjb25maWcgMCwgbm90IEJCUCByZWdpc3RlciBJRCAqLworI2RlZmluZSBFRVBST01fTklDMl9PRkZTRVQgICAgICAgICAgMHgzNgkvKiBUaGUgYWRkcmVzcyBpcyBmcm9tIE5JQyBjb25maWcgMCwgbm90IEJCUCByZWdpc3RlciBJRCAqLworI2RlZmluZSBFRVBST01fQkJQX0JBU0VfT0ZGU0VUCQkweGYwCS8qIFRoZSBhZGRyZXNzIGlzIGZyb20gTklDIGNvbmZpZyAwLCBub3QgQkJQIHJlZ2lzdGVyIElEICovCisjZGVmaW5lIEVFUFJPTV9HX1RYX1BXUl9PRkZTRVQJCTB4NTIKKyNkZWZpbmUgRUVQUk9NX0dfVFgyX1BXUl9PRkZTRVQJCTB4NjAKKyNkZWZpbmUgRUVQUk9NX0xFRDFfT0ZGU0VUCQkJMHgzYworI2RlZmluZSBFRVBST01fTEVEMl9PRkZTRVQJCQkweDNlCisjZGVmaW5lIEVFUFJPTV9MRUQzX09GRlNFVAkJCTB4NDAKKyNkZWZpbmUgRUVQUk9NX0xOQV9PRkZTRVQJCQkweDQ0CisjZGVmaW5lIEVFUFJPTV9SU1NJX0JHX09GRlNFVAkJMHg0NgorI2RlZmluZSBFRVBST01fVFhNSVhFUl9HQUlOXzJfNEcJMHg0OAorI2RlZmluZSBFRVBST01fUlNTSV9BX09GRlNFVAkJMHg0YQorI2RlZmluZSBFRVBST01fVFhNSVhFUl9HQUlOXzVHCQkweDRjCisjZGVmaW5lIEVFUFJPTV9ERUZJTkVfTUFYX1RYUFdSCQkweDRlCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl8yXzRHCTB4ZGUJLyogMjBNSFogMi40RyB0eCBwb3dlci4gKi8KKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzJfNEcJMHhlZQkvKiA0ME1IWiAyLjRHIHR4IHBvd2VyLiAqLworI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcJCTB4ZmEJLyogMjBNSFogNUcgdHggcG93ZXIuICovCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RwkJMHgxMGEJLyogNDBNSFogNUcgdHggcG93ZXIuICovCisjZGVmaW5lIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgICAgICAweDc4CisjZGVmaW5lIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICAgICAgMHhhNgorLyojZGVmaW5lIEVFUFJPTV9KYXBhbl9UWF9QV1JfT0ZGU0VUICAgICAgMHg5MCAvLyA4MDIuMTFqICovCisvKiNkZWZpbmUgRUVQUk9NX0phcGFuX1RYMl9QV1JfT0ZGU0VUICAgICAgMHhiZSAqLworLyojZGVmaW5lIEVFUFJPTV9UU1NJX1JFRl9PRkZTRVQgICAgICAgIDB4NTQgKi8KKy8qI2RlZmluZSBFRVBST01fVFNTSV9ERUxUQV9PRkZTRVQgICAgICAweDI0ICovCisvKiNkZWZpbmUgRUVQUk9NX0NDS19UWF9QV1JfT0ZGU0VUICAweDYyICovCisvKiNkZWZpbmUgRUVQUk9NX0NBTElCUkFURV9PRkZTRVQgICAgICAgMHg3YyAqLworI2RlZmluZSBFRVBST01fVkVSU0lPTl9PRkZTRVQgICAgICAgMHgwMgorI2RlZmluZSBFRVBST01fRlJFUV9PRkZTRVQJCQkweDNhCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURQkweGRlCS8qIDIwTUhaIHBvd2VyLiAqLworI2RlZmluZSBFRVBST01fVFhQT1dFUl9ERUxUQQkJMHg1MAkvKiAyME1IWiBBTkQgNDAgTUhaIHVzZSBkaWZmZXJlbnQgcG93ZXIuIFRoaXMgaXMgZGVsdGEgaW4gNDBNSFouICovCisjZGVmaW5lIFZBTElEX0VFUFJPTV9WRVJTSU9OICAgICAgICAxCisKKy8qCisgICogICBFRVBST00gb3BlcmF0aW9uIHJlbGF0ZWQgbWFyY29zCisgICovCisjZGVmaW5lIFJUMjh4eF9FRVBST01fUkVBRDE2KF9wQWQsIF9vZmZzZXQsIF92YWx1ZSkJCQlcCisJKF9wQWQpLT5jaGlwT3BzLmVlcmVhZCgoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKShfcEFkKSwgKHUxNikoX29mZnNldCksICh1MTYgKikmKF92YWx1ZSkpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICBFMlBST00gZGF0YSBsYXlvdXQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogKi8KKy8qIE1DVV9MRURDUzogTUNVIExFRCBDb250cm9sIFNldHRpbmcuICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfTUNVX0xFRENTX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1OCBMZWRNb2RlOjc7CisJCXU4IFBvbGFyaXR5OjE7CisJfSBmaWVsZDsKKwl1OCB3b3JkOworfSBNQ1VfTEVEQ1NfU1RSVUMsICpQTUNVX0xFRENTX1NUUlVDOworCisvKiAqLworLyogRUVQUk9NIGFudGVubmEgc2VsZWN0IGZvcm1hdCAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX0VFUFJPTV9BTlRFTk5BX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgUnhQYXRoOjQ7CS8qIDE6IDFSLCAyOiAyUiwgMzogM1IgKi8KKwkJdTE2IFR4UGF0aDo0OwkvKiAxOiAxVCwgMjogMlQgKi8KKwkJdTE2IFJmSWNUeXBlOjQ7CS8qIHNlZSBFMlBST00gZG9jdW1lbnQgKi8KKwkJdTE2IFJzdjo0OworCX0gZmllbGQ7CisJdTE2IHdvcmQ7Cit9IEVFUFJPTV9BTlRFTk5BX1NUUlVDLCAqUEVFUFJPTV9BTlRFTk5BX1NUUlVDOworCit0eXBlZGVmIHVuaW9uIF9FRVBST01fTklDX0NJTkZJRzJfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBIYXJkd2FyZVJhZGlvQ29udHJvbDoxOwkvKiAxOmVuYWJsZSwgMDpkaXNhYmxlICovCisJCXUxNiBEeW5hbWljVHhBZ2NDb250cm9sOjE7CS8qICovCisJCXUxNiBFeHRlcm5hbExOQUZvckc6MTsJLyogKi8KKwkJdTE2IEV4dGVybmFsTE5BRm9yQToxOwkvKiBleHRlcm5hbCBMTkEgZW5hYmxlIGZvciAyLjRHICovCisJCXUxNiBDYXJkYnVzQWNjZWxlcmF0aW9uOjE7CS8qICEgTk9URTogMCAtIGVuYWJsZSwgMSAtIGRpc2FibGUgKi8KKwkJdTE2IEJXNDBNU2lkZWJhbmRGb3JHOjE7CisJCXUxNiBCVzQwTVNpZGViYW5kRm9yQToxOworCQl1MTYgRW5hYmxlV1BTUEJDOjE7CS8qIFdQUyBQQkMgQ29udHJvbCBiaXQgKi8KKwkJdTE2IEJXNDBNQXZhaWxGb3JHOjE7CS8qIDA6ZW5hYmxlLCAxOmRpc2FibGUgKi8KKwkJdTE2IEJXNDBNQXZhaWxGb3JBOjE7CS8qIDA6ZW5hYmxlLCAxOmRpc2FibGUgKi8KKwkJdTE2IFJzdjE6MTsJLyogbXVzdCBiZSAwICovCisJCXUxNiBBbnREaXZlcnNpdHk6MTsJLyogQW50ZW5uYSBkaXZlcnNpdHkgKi8KKwkJdTE2IFJzdjI6MzsJLyogbXVzdCBiZSAwICovCisJCXUxNiBEQUNUZXN0Qml0OjE7CS8qIGNvbnRyb2wgaWYgZHJpdmVyIHNob3VsZCBwYXRjaCB0aGUgREFDIGlzc3VlICovCisJfSBmaWVsZDsKKwl1MTYgd29yZDsKK30gRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDLCAqUEVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQzsKKworLyogKi8KKy8qIFRYX1BXUiBWYWx1ZSB2YWxpZCByYW5nZSAweEZBKC02KSB+IDB4MjQoMzYpICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfRUVQUk9NX1RYX1BXUl9TVFJVQyB7CisJc3RydWN0IHsKKwkJY2hhciBCeXRlMDsJLyogTG93IEJ5dGUgKi8KKwkJY2hhciBCeXRlMTsJLyogSGlnaCBCeXRlICovCisJfSBmaWVsZDsKKwl1MTYgd29yZDsKK30gRUVQUk9NX1RYX1BXUl9TVFJVQywgKlBFRVBST01fVFhfUFdSX1NUUlVDOworCit0eXBlZGVmIHVuaW9uIF9FRVBST01fVkVSU0lPTl9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTggRmFlUmVsZWFzZU51bWJlcjsJLyogTG93IEJ5dGUgKi8KKwkJdTggVmVyc2lvbjsJLyogSGlnaCBCeXRlICovCisJfSBmaWVsZDsKKwl1MTYgd29yZDsKK30gRUVQUk9NX1ZFUlNJT05fU1RSVUMsICpQRUVQUk9NX1ZFUlNJT05fU1RSVUM7CisKK3R5cGVkZWYgdW5pb24gX0VFUFJPTV9MRURfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBQb2xhcml0eVJEWV9HOjE7CS8qIFBvbGFyaXR5IFJEWV9HIHNldHRpbmcuICovCisJCXUxNiBQb2xhcml0eVJEWV9BOjE7CS8qIFBvbGFyaXR5IFJEWV9BIHNldHRpbmcuICovCisJCXUxNiBQb2xhcml0eUFDVDoxOwkvKiBQb2xhcml0eSBBQ1Qgc2V0dGluZy4gKi8KKwkJdTE2IFBvbGFyaXR5R1BJT18wOjE7CS8qIFBvbGFyaXR5IEdQSU8jMCBzZXR0aW5nLiAqLworCQl1MTYgUG9sYXJpdHlHUElPXzE6MTsJLyogUG9sYXJpdHkgR1BJTyMxIHNldHRpbmcuICovCisJCXUxNiBQb2xhcml0eUdQSU9fMjoxOwkvKiBQb2xhcml0eSBHUElPIzIgc2V0dGluZy4gKi8KKwkJdTE2IFBvbGFyaXR5R1BJT18zOjE7CS8qIFBvbGFyaXR5IEdQSU8jMyBzZXR0aW5nLiAqLworCQl1MTYgUG9sYXJpdHlHUElPXzQ6MTsJLyogUG9sYXJpdHkgR1BJTyM0IHNldHRpbmcuICovCisJCXUxNiBMZWRNb2RlOjU7CS8qIExlZCBtb2RlLiAqLworCQl1MTYgUnN2ZDozOwkvKiBSZXNlcnZlZCAqLworCX0gZmllbGQ7CisJdTE2IHdvcmQ7Cit9IEVFUFJPTV9MRURfU1RSVUMsICpQRUVQUk9NX0xFRF9TVFJVQzsKKwordHlwZWRlZiB1bmlvbiBfRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUMgeworCXN0cnVjdCB7CisJCXU4IERlbHRhVmFsdWU6NjsJLyogVHggUG93ZXIgZGFsdGEgdmFsdWUgKE1BWD00KSAqLworCQl1OCBUeXBlOjE7CS8qIDE6IHBsdXMgdGhlIGRlbHRhIHZhbHVlLCAwOiBtaW51cyB0aGUgZGVsdGEgdmFsdWUgKi8KKwkJdTggVHhQb3dlckVuYWJsZToxOwkvKiBFbmFibGUgKi8KKwl9IGZpZWxkOworCXU4IHZhbHVlOworfSBFRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQywgKlBFRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQzsKKworI2VuZGlmIC8qIF9fUlRNUF9DSElQX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2NraXBtaWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9ja2lwbWljLmgKaW5kZXggMzk5NTViOS4uNmZmOTM1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2NraXBtaWMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfY2tpcG1pYy5oCkBAIC0zNyw0MiArMzcsMjcgQEAKICNpZm5kZWYJX19SVE1QX0NLSVBNSUNfSF9fCiAjZGVmaW5lCV9fUlRNUF9DS0lQTUlDX0hfXwogCi10eXBlZGVmCXN0cnVjdAlfTUlDX0NPTlRFWFQJeworc3RydWN0IHJ0X21pY19jb250ZXh0IHsKIAkvKiAtLS0gTU1IIGNvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQlVQ0hBUgkJQ0tbMTZdOwkJCQkvKiB0aGUga2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQlVQ0hBUgkJY29lZmZpY2llbnRbMTZdOwkvKiBjdXJyZW50IGFlcyBjb3VudGVyIG1vZGUgY29lZmZpY2llbnRzICAgICAgKi8KLQlVTE9OR0xPTkcJYWNjdW07CQkJCS8qIGFjY3VtdWxhdGVkIG1pYywgcmVkdWNlZCB0byB1MzIgaW4gZmluYWwoKSAqLwotCVVJTlQJCXBvc2l0aW9uOwkJCS8qIGN1cnJlbnQgcG9zaXRpb24gKGJ5dGUgb2Zmc2V0KSBpbiBtZXNzYWdlICAqLwotCVVDSEFSCQlwYXJ0WzRdOwkJCS8qIGZvciBjb252ZXJzaW9uIG9mIG1lc3NhZ2UgdG8gdTMyIGZvciBtbWggICAqLwotfQlNSUNfQ09OVEVYVCwgKlBNSUNfQ09OVEVYVDsKKwl1OCBDS1sxNl07CQkvKiB0aGUga2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1OCBjb2VmZmljaWVudFsxNl07CS8qIGN1cnJlbnQgYWVzIGNvdW50ZXIgbW9kZSBjb2VmZmljaWVudHMgICAgICAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyBhY2N1bTsJLyogYWNjdW11bGF0ZWQgbWljLCByZWR1Y2VkIHRvIHUzMiBpbiBmaW5hbCgpICovCisJdTMyIHBvc2l0aW9uOwkJLyogY3VycmVudCBwb3NpdGlvbiAoYnl0ZSBvZmZzZXQpIGluIG1lc3NhZ2UgICovCisJdTggcGFydFs0XTsJCS8qIGZvciBjb252ZXJzaW9uIG9mIG1lc3NhZ2UgdG8gdTMyIGZvciBtbWggICAqLworfTsKIAotVk9JRCB4b3JfMTI4KAotICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGEsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYiwKLSAgICBPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOwordm9pZCB4b3JfMTI4KHU4ICphLCB1OCAqYiwgdTggKm91dCk7CiAKLVVDSEFSIFJUTVBDa2lwU2JveCgKLSAgICBJTiAgVUNIQVIgICAgICAgICAgICAgICBhKTsKK3U4IFJUTVBDa2lwU2JveCh1OCBhKTsKIAotVk9JRCB4b3JfMzIoCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYSwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBiLAotICAgIE9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7Cit2b2lkIHhvcl8zMih1OCAqYSwgdTggKmIsIHU4ICpvdXQpOwogCi1WT0lEIG5leHRfa2V5KAotICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGtleSwKLSAgICBJTiAgSU5UICAgICAgICAgICAgICAgICByb3VuZCk7Cit2b2lkIG5leHRfa2V5KHU4ICprZXksIGludCByb3VuZCk7CiAKLVZPSUQgYnl0ZV9zdWIoCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCi0gICAgT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKK3ZvaWQgYnl0ZV9zdWIodTggKmluLCB1OCAqb3V0KTsKIAotVk9JRCBzaGlmdF9yb3coCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCi0gICAgT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKK3ZvaWQgc2hpZnRfcm93KHU4ICppbiwgdTggKm91dCk7CiAKLVZPSUQgbWl4X2NvbHVtbigKLSAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKLSAgICBPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOwordm9pZCBtaXhfY29sdW1uKHU4ICppbiwgdTggKm91dCk7CiAKLSNlbmRpZiAvL19fUlRNUF9DS0lQTUlDX0hfXworI2VuZGlmIC8qX19SVE1QX0NLSVBNSUNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfZGVmLmgKaW5kZXggZjVmZWU1Ny4uOWM1NGJhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2RlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9kZWYuaApAQCAtNDEsOSArNDEsOSBAQAogCiAjaW5jbHVkZSAib2lkLmgiCiAKLS8vCi0vLyAgRGVidWcgaW5mb3JtYXRpb24gdmVyYm9zaXR5OiBsb3dlciB2YWx1ZXMgaW5kaWNhdGUgaGlnaGVyIHVyZ2VuY3kKLS8vCisvKiAqLworLyogIERlYnVnIGluZm9ybWF0aW9uIHZlcmJvc2l0eTogbG93ZXIgdmFsdWVzIGluZGljYXRlIGhpZ2hlciB1cmdlbmN5ICovCisvKiAqLwogI2RlZmluZSBSVF9ERUJVR19PRkYgICAgICAgIDAKICNkZWZpbmUgUlRfREVCVUdfRVJST1IgICAgICAxCiAjZGVmaW5lIFJUX0RFQlVHX1dBUk4gICAgICAgMgpAQCAtNTEsMTExICs1MSwxMDEgQEAKICNkZWZpbmUgUlRfREVCVUdfSU5GTyAgICAgICA0CiAjZGVmaW5lIFJUX0RFQlVHX0xPVUQgICAgICAgNQogCi0jZGVmaW5lIE5JQ19UQUcgICAgICAgICAgICAgKChVTE9ORyknMDY4MicpCi0jZGVmaW5lIE5JQ19EQkdfU1RSSU5HICAgICAgKCIqKlJUMjh4eCoqIikKKyNkZWZpbmUgTklDX1RBRyAgICAgICAgICAgICAoKHVuc2lnbmVkIGxvbmcpJzA2ODInKQorI2RlZmluZSBOSUNfREJHX2NoYXIgICAgICAoIioqUlQyOHh4KioiKQogCi0jZGVmaW5lIFJBTElOS18yODgzX1ZFUlNJT04JCSgoVUlOVDMyKTB4Mjg4MzAzMDApCi0jZGVmaW5lIFJBTElOS18yODgwRV9WRVJTSU9OCSgoVUlOVDMyKTB4Mjg3MjAyMDApCi0jZGVmaW5lIFJBTElOS18zMDcwX1ZFUlNJT04JCSgoVUlOVDMyKTB4MzA3MDAyMDApCi0KLS8vCi0vLyBORElTIHZlcnNpb24gaW4gdXNlIGJ5IHRoZSBOSUMgZHJpdmVyLgotLy8gVGhlIGhpZ2ggYnl0ZSBpcyB0aGUgbWFqb3IgdmVyc2lvbi4gVGhlIGxvdyBieXRlIGlzIHRoZSBtaW5vciB2ZXJzaW9uLgotLy8KLSNpZmRlZiAgTkRJUzUxX01JTklQT1JUCi0jZGVmaW5lIE5JQ19EUklWRVJfVkVSU0lPTiAgICAgIDB4MDUwMQotI2Vsc2UKLSNkZWZpbmUgTklDX0RSSVZFUl9WRVJTSU9OICAgICAgMHgwNTAwCi0jZW5kaWYKLQotLy8KLS8vIE5ESVMgbWVkaWEgdHlwZSwgY3VycmVudCBpcyBldGhlcm5ldCwgY2hhbmdlIGlmIG5hdGl2ZSB3aXJlbGVzcyBzdXBwb3J0ZWQKLS8vCi0jZGVmaW5lIE5JQ19NRURJQV9UWVBFICAgICAgICAgIE5kaXNNZWRpdW04MDJfMwotI2RlZmluZSBOSUNfUENJX0hEUl9MRU5HVEggICAgICAweGUyCi0jZGVmaW5lIE5JQ19NQVhfUEFDS0VUX1NJWkUgICAgIDIzMDQKLSNkZWZpbmUgTklDX0hFQURFUl9TSVpFICAgICAgICAgMTQKLSNkZWZpbmUgTUFYX01BUF9SRUdJU1RFUlNfTkVFREVEIDMyCi0jZGVmaW5lIE1JTl9NQVBfUkVHSVNURVJTX05FRURFRCAyICAgLy9Ub2RvOiBzaG91bGQgY29uc2lkZXIgZnJhZ21lbnQgaXNzdWUuCi0KLS8vCi0vLyBpbnRlcmZhY2UgdHlwZSwgd2UgdXNlIFBDSQotLy8KLSNkZWZpbmUgTklDX0lOVEVSRkFDRV9UWVBFICAgICAgTmRpc0ludGVyZmFjZVBjaQotI2RlZmluZSBOSUNfSU5URVJSVVBUX01PREUgICAgICBOZGlzSW50ZXJydXB0TGV2ZWxTZW5zaXRpdmUKLQotLy8KLS8vIGJ1ZmZlciBzaXplIHBhc3NlZCBpbiBOZGlzTVF1ZXJ5QWRhcHRlclJlc291cmNlcwotLy8gV2Ugc2hvdWxkIG9ubHkgbmVlZCB0aHJlZSBhZGFwdGVyIHJlc291cmNlcyAoSU8sIGludGVycnVwdCBhbmQgbWVtb3J5KSwKLS8vIFNvbWUgZGV2aWNlcyBnZXQgZXh0cmEgcmVzb3VyY2VzLCBzbyBoYXZlIHJvb20gZm9yIDEwIHJlc291cmNlcwotLy8gICAgICAgICAgICAgICAgICAgIFVGX1NJWkUgICAoc2l6ZW9mKE5ESVNfUkVTT1VSQ0VfTElTVCkgKyAoMTAqc2l6ZW9mKENNX1BBUlRJQUxfUkVTT1VSQ0VfREVTQ1JJUFRPUikpKQotCi0KLSNkZWZpbmUgTklDX1JFU09VUkNFX0IvLwotLy8gSU8gc3BhY2UgbGVuZ3RoCi0vLwotI2RlZmluZSBOSUNfTUFQX0lPU1BBQ0VfTEVOR1RIICBzaXplb2YoQ1NSX1NUUlVDKQotCi0jZGVmaW5lIE1BWF9SWF9QS1RfTEVOCTE1MjAKLQotLy8KLS8vIEVudHJ5IG51bWJlciBmb3IgZWFjaCBETUEgZGVzY3JpcHRvciByaW5nCi0vLwotCi0jaWZkZWYgUlQyODYwCi0jZGVmaW5lIFRYX1JJTkdfU0laRSAgICAgICAgICAgIDY0IC8vNjQKLSNkZWZpbmUgTUdNVF9SSU5HX1NJWkUgICAgICAgICAgMTI4Ci0jZGVmaW5lIFJYX1JJTkdfU0laRSAgICAgICAgICAgIDEyOCAvLzY0Ci0jZGVmaW5lIE1BWF9UWF9QUk9DRVNTICAgICAgICAgIFRYX1JJTkdfU0laRSAvLzgKLSNkZWZpbmUgTUFYX0RNQV9ET05FX1BST0NFU1MgICAgVFhfUklOR19TSVpFCi0jZGVmaW5lIE1BWF9UWF9ET05FX1BST0NFU1MgICAgIFRYX1JJTkdfU0laRSAvLzgKLSNkZWZpbmUgTE9DQUxfVFhCVUZfU0laRSAgICAgICAgMgotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0jZGVmaW5lIFRYX1JJTkdfU0laRSAgICAgICAgICAgIDggLy8gMQorI2lmZGVmIFJUTVBfTUFDX1VTQgorI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgICAgICAgICA4CS8qIDEgKi8KICNkZWZpbmUgUFJJT19SSU5HX1NJWkUgICAgICAgICAgOAotI2RlZmluZSBNR01UX1JJTkdfU0laRSAgICAgICAzMiAvLyBQUklPX1JJTkdfU0laRQorI2RlZmluZSBNR01UX1JJTkdfU0laRQkJMzIJLyogUFJJT19SSU5HX1NJWkUgKi8KICNkZWZpbmUgUlhfUklOR19TSVpFICAgICAgICAgICAgOAogI2RlZmluZSBNQVhfVFhfUFJPQ0VTUyAgICAgICAgICA0CiAjZGVmaW5lIExPQ0FMX1RYQlVGX1NJWkUgICAgICAgIDIwNDgKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotI2RlZmluZSBNQVhfUlhfUFJPQ0VTUyAgICAgICAgICAxMjggLy82NCAvLzMyCisvKiNkZWZpbmUgUEFDS0VEICovCisKKyNkZWZpbmUgUkFMSU5LXzI4ODNfVkVSU0lPTgkJKCh1MzIpMHgyODgzMDMwMCkKKyNkZWZpbmUgUkFMSU5LXzI4ODBFX1ZFUlNJT04JKCh1MzIpMHgyODcyMDIwMCkKKyNkZWZpbmUgUkFMSU5LXzMwNzBfVkVSU0lPTgkJKCh1MzIpMHgzMDcwMDIwMCkKKworI2RlZmluZSBNQVhfUlhfUEtUX0xFTgkxNTIwCisKKy8qICovCisvKiBFbnRyeSBudW1iZXIgZm9yIGVhY2ggRE1BIGRlc2NyaXB0b3IgcmluZyAqLworLyogKi8KKworI2lmZGVmIFJUTVBfTUFDX1BDSQorI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgICAgICAgICA2NAkvKjY0ICovCisjZGVmaW5lIE1HTVRfUklOR19TSVpFICAgICAgICAgIDEyOAorI2RlZmluZSBSWF9SSU5HX1NJWkUgICAgICAgICAgICAxMjgJLyo2NCAqLworI2RlZmluZSBNQVhfVFhfUFJPQ0VTUyAgICAgICAgICBUWF9SSU5HX1NJWkUJLyo4ICovCisjZGVmaW5lIE1BWF9ETUFfRE9ORV9QUk9DRVNTICAgIFRYX1JJTkdfU0laRQorI2RlZmluZSBNQVhfVFhfRE9ORV9QUk9DRVNTICAgICBUWF9SSU5HX1NJWkUJLyo4ICovCisjZGVmaW5lIExPQ0FMX1RYQlVGX1NJWkUgICAgICAgIDIKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKworI2RlZmluZSBNQVhfUlhfUFJPQ0VTUyAgICAgICAgICAxMjgJLyo2NCAvLzMyICovCiAjZGVmaW5lIE5VTV9PRl9MT0NBTF9UWEJVRiAgICAgIDIKICNkZWZpbmUgVFhEX1NJWkUgICAgICAgICAgICAgICAgMTYKICNkZWZpbmUgVFhXSV9TSVpFICAgICAgICAgICAgICAgMTYKICNkZWZpbmUgUlhEX1NJWkUgICAgICAgICAgICAgICAJMTYKICNkZWZpbmUgUlhXSV9TSVpFICAgICAgICAgICAgIAkxNgotLy8gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyA4MDIuMTEgSGVhZGVyIFNpemUgKyBBTVNEVSBzdWIgZnJhbWUgaGVhZGVyCi0jZGVmaW5lIFRYX0RNQV8xU1RfQlVGRkVSX1NJWkUgIDk2ICAgIC8vIG9ubHkgdGhlIDFzdCBwaHlzaWNhbCBidWZmZXIgaXMgcHJlLWFsbG9jYXRlZAotI2RlZmluZSBNR01UX0RNQV9CVUZGRVJfU0laRSAgICAxNTM2IC8vMjA0OAotI2RlZmluZSBSWF9CVUZGRVJfQUdHUkVTSVpFICAgICAzODQwIC8vMzkwNCAvLzM5NjggLy80MDk2IC8vMjA0OCAvLzQwOTYKLSNkZWZpbmUgUlhfQlVGRkVSX05PUk1TSVpFICAgICAgMzg0MCAvLzM5MDQgLy8zOTY4IC8vNDA5NiAvLzIwNDggLy80MDk2CisvKiBUWElORk9fU0laRSArIFRYV0lfU0laRSArIDgwMi4xMSBIZWFkZXIgU2l6ZSArIEFNU0RVIHN1YiBmcmFtZSBoZWFkZXIgKi8KKyNkZWZpbmUgVFhfRE1BXzFTVF9CVUZGRVJfU0laRSAgOTYJLyogb25seSB0aGUgMXN0IHBoeXNpY2FsIGJ1ZmZlciBpcyBwcmUtYWxsb2NhdGVkICovCisjZGVmaW5lIE1HTVRfRE1BX0JVRkZFUl9TSVpFICAgIDE1MzYJLyoyMDQ4ICovCisjZGVmaW5lIFJYX0JVRkZFUl9BR0dSRVNJWkUgICAgIDM4NDAJLyozOTA0IC8vMzk2OCAvLzQwOTYgLy8yMDQ4IC8vNDA5NiAqLworI2RlZmluZSBSWF9CVUZGRVJfTk9STVNJWkUgICAgICAzODQwCS8qMzkwNCAvLzM5NjggLy80MDk2IC8vMjA0OCAvLzQwOTYgKi8KICNkZWZpbmUgVFhfQlVGRkVSX05PUk1TSVpFCQlSWF9CVUZGRVJfTk9STVNJWkUKLSNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUgICAgICAgICAgMjM0NiAgICAgICAgICAgICAgICAgICAgLy8gTWF4aW11bSA4MDIuMTEgZnJhbWUgc2l6ZQotI2RlZmluZSBNQVhfQUdHUkVHQVRJT05fU0laRSAgICAzODQwIC8vMzkwNCAvLzM5NjggLy80MDk2CisjZGVmaW5lIE1BWF9GUkFNRV9TSVpFICAgICAgICAgIDIzNDYJLyogTWF4aW11bSA4MDIuMTEgZnJhbWUgc2l6ZSAqLworI2RlZmluZSBNQVhfQUdHUkVHQVRJT05fU0laRSAgICAzODQwCS8qMzkwNCAvLzM5NjggLy80MDk2ICovCiAjZGVmaW5lIE1BWF9OVU1fT0ZfVFVQTEVfQ0FDSEUgIDIKICNkZWZpbmUgTUFYX01DQVNUX0xJU1RfU0laRSAgICAgMzIKICNkZWZpbmUgTUFYX0xFTl9PRl9WRU5ET1JfREVTQyAgNjQKLS8vI2RlZmluZSBNQVhfU0laRV9PRl9NQ0FTVF9QU1EgICAoTlVNX09GX0xPQ0FMX1RYQlVGID4+IDIpIC8vIEFQIHdvbid0IHNwZW5kIG1vcmUgdGhhbiAxLzQgb2YgdG90YWwgYnVmZmVycyBvbiBNL0JDQVNUIFBTUQorLyojZGVmaW5lIE1BWF9TSVpFX09GX01DQVNUX1BTUSAgIChOVU1fT0ZfTE9DQUxfVFhCVUYgPj4gMikgLy8gQVAgd29uJ3Qgc3BlbmQgbW9yZSB0aGFuIDEvNCBvZiB0b3RhbCBidWZmZXJzIG9uIE0vQkNBU1QgUFNRICovCiAjZGVmaW5lIE1BWF9TSVpFX09GX01DQVNUX1BTUSAgICAgICAgICAgICAgIDMyCiAKICNkZWZpbmUgTUFYX1JYX1BST0NFU1NfQ05UCShSWF9SSU5HX1NJWkUpCiAKKy8qCisJV01NIE5vdGU6IElmIG1lbW9yeSBvZiB5b3VyIHN5c3RlbSBpcyBub3QgbXVjaCwgcGxlYXNlIHJlZHVjZSB0aGUgZGVmaW5pdGlvbjsKKwlvciB3aGVuIHlvdSBkbyBXTU0gdGVzdCwgdGhlIHF1ZXVlIGZvciBsb3cgcHJpb3JpdHkgQUMgd2lsbCBiZSBmdWxsLCBpLmUuCisJVFhfUklOR19TSVpFICsgTUFYX1BBQ0tFVFNfSU5fUVVFVUUgcGFja2V0cyBmb3IgdGhlIEFDIHdpbGwgYmUgYnVmZmVyZWQgaW4KKwlXTEFOLCBtYXliZSBubyBhbnkgcGFja2V0IGJ1ZmZlciBjYW4gYmUgZ290IGluIEV0aGVybmV0IGRyaXZlci4KIAotI2RlZmluZSBNQVhfUEFDS0VUU19JTl9RVUVVRQkJCQkoNTEyKSAvLyg1MTIpICAgIC8vIHRvIHBhc3MgV01NIEE1LVdQQVBTSworCVNvbWV0aW1lcyBubyBwYWNrZXQgYnVmZmVyIGNhbiBiZSBnb3QgaW4gRXRoZXJuZXQgZHJpdmVyLCB0aGUgc3lzdGVtIHdpbGwKKwlzZW5kIGZsb3cgY29udHJvbCBwYWNrZXQgdG8gdGhlIHNlbmRlciB0byBzbG93IGRvd24gaXRzIHNlbmRpbmcgcmF0ZS4KKwlTbyBubyBXTU0gY2FuIGJlIHNhdyBpbiB0aGUgYWlyLgorKi8KKworLyoKKwlOZWVkIHRvIHVzZSA2NCBpbiB2eHdvcmtzIGZvciB0ZXN0IGNhc2UgV01NIEE1LVQwNworCVR3byBkbmxpbmsgKDEwTWJwcykgZnJvbSBhIFdNTSBzdGF0aW9uIHRvIGEgbm9uLVdNTSBzdGF0aW9uLgorCUlmIHVzZSAyNTYsIHF1ZXVlIGlzIG5vdCBlbm91Z2guCisJQW5kIGluIHJ0X21haW5fZW5kLmMsIGNsQ29uZmlnLmNsTnVtID0gUlhfUklOR19TSVpFICogMzsgaXMgY2hhbmdlZCB0bworCWNsQ29uZmlnLmNsTnVtID0gUlhfUklOR19TSVpFICogNDsKKyovCisvKiBUT0RPOiBGb3IgVnhXb3JrcyB0aGUgc2l6ZSBpcyAyNTYuIFNoYWxsIHdlIGNhaG5nZSB0aGUgdmFsdWUgYXMgMjU2IGZvciBhbGwgT1M/Pz8/PyAqLworI2RlZmluZSBNQVhfUEFDS0VUU19JTl9RVUVVRQkJCQkoNTEyKQkvKig1MTIpICAgIC8vIHRvIHBhc3MgV01NIEE1LVdQQVBTSyAqLworCiAjZGVmaW5lIE1BWF9QQUNLRVRTX0lOX01DQVNUX1BTX1FVRVVFCQkzMgotI2RlZmluZSBNQVhfUEFDS0VUU19JTl9QU19RVUVVRQkJCQkxMjgJLy8zMgotI2RlZmluZSBXTU1fTlVNX09GX0FDICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBBQzAsIEFDMSwgQUMyLCBhbmQgQUMzICovCisjZGVmaW5lIE1BWF9QQUNLRVRTX0lOX1BTX1FVRVVFCQkJCTEyOAkvKjMyICovCisjZGVmaW5lIFdNTV9OVU1fT0ZfQUMgICAgICAgICAgICAgICAgICAgICAgIDQJLyogQUMwLCBBQzEsIEFDMiwgYW5kIEFDMyAqLwogCisjaWZkZWYgUlRNUF9FRlVTRV9TVVBQT1JUCisvKjIwMDgvMDkvMTE6S0ggYWRkIHRvIHN1cHBvcnQgZWZ1c2U8LS0gKi8KICNkZWZpbmUgTUFYX0VFUFJPTV9CSU5fRklMRV9TSVpFCQkJCQkxMDI0CisjZGVmaW5lIEVGVVNFX0JVRkZFUl9QQVRICQkJCQkJIi90bXAvUlQzMHh4RUVQUk9NLmJpbiIKKy8qMjAwOC8wOS8xMTpLSCBhZGQgdG8gc3VwcG9ydCBlZnVzZS0tPiAqLworI2VuZGlmIC8qIFJUTVBfRUZVU0VfU1VQUE9SVCAvLyAqLwogCi0vLyBSeEZpbHRlcgorLyogUnhGaWx0ZXIgKi8KICNkZWZpbmUgU1RBTk9STUFMCSAweDE3Zjk3CiAjZGVmaW5lIEFQTk9STUFMCSAweDE1Zjk3Ci0vLwotLy8gIFJUTVBfQURBUFRFUiBmbGFncwotLy8KKyNkZWZpbmUgUFNQWExJTksJIDB4MTdmOTMKKy8qICovCisvKiAgc3RydWN0IHJ0X3J0bXBfYWRhcHRlciBmbGFncyAqLworLyogKi8KICNkZWZpbmUgZlJUTVBfQURBUFRFUl9NQVBfUkVHSVNURVIgICAgICAgICAgMHgwMDAwMDAwMQogI2RlZmluZSBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UgICAgICAweDAwMDAwMDAyCiAjZGVmaW5lIGZSVE1QX0FEQVBURVJfSEFSRFdBUkVfRVJST1IgICAgICAgIDB4MDAwMDAwMDQKQEAgLTE4MSwxMyArMTcxLDEzIEBACiAjZGVmaW5lIGZSVE1QX0FEQVBURVJfU0NBTl8yMDQwIAkJCTB4MDQwMDAwMDAKICNkZWZpbmUJZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVAkJMHgwODAwMDAwMAogCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfU1RBUlRfVVAgICAgICAgICAJCTB4MTAwMDAwMDAJLy9EZXZpdmUgYWxyZWFkeSBpbml0aWFsaXplZCBhbmQgZW5hYmxlZCBUeC9SeC4KKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCAgICAgICAgIAkJMHgxMDAwMDAwMAkvKkRldml2ZSBhbHJlYWR5IGluaXRpYWxpemVkIGFuZCBlbmFibGVkIFR4L1J4LiAqLwogI2RlZmluZSBmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX0NIQU5HRSAgICAweDIwMDAwMDAwCiAjZGVmaW5lIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYgICAgICAgIDB4NDAwMDAwMDAKIAotLy8KLS8vICBTVEEgb3BlcmF0aW9uIHN0YXR1cyBmbGFncwotLy8KKy8qICovCisvKiAgU1RBIG9wZXJhdGlvbiBzdGF0dXMgZmxhZ3MgKi8KKy8qICovCiAjZGVmaW5lIGZPUF9TVEFUVVNfSU5GUkFfT04gICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKICNkZWZpbmUgZk9QX1NUQVRVU19BREhPQ19PTiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgogI2RlZmluZSBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEICAgICAweDAwMDAwMDA0CkBAIC0xOTcsMjggKzE4NywzNCBAQAogI2RlZmluZSBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCAgICAweDAwMDAwMDgwCiAjZGVmaW5lIGZPUF9TVEFUVVNfV01NX0lOVVNFRCAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKICNkZWZpbmUgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBmT1BfU1RBVFVTX0RPWkUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwICAvLyBkZWJ1ZyBwdXJwb3NlCi0jZGVmaW5lIGZPUF9TVEFUVVNfUElHR1lCQUNLX0lOVVNFRCAgICAgICAgIDB4MDAwMDA4MDAgIC8vIHBpZ2d5LWJhY2ssIGFuZCBhZ2dyZWdhdGlvbgorI2RlZmluZSBmT1BfU1RBVFVTX0RPWkUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCS8qIGRlYnVnIHB1cnBvc2UgKi8KKyNkZWZpbmUgZk9QX1NUQVRVU19QSUdHWUJBQ0tfSU5VU0VEICAgICAgICAgMHgwMDAwMDgwMAkvKiBwaWdneS1iYWNrLCBhbmQgYWdncmVnYXRpb24gKi8KICNkZWZpbmUgZk9QX1NUQVRVU19BUFNEX0lOVVNFRAkJCQkweDAwMDAxMDAwCiAjZGVmaW5lIGZPUF9TVEFUVVNfVFhfQU1TRFVfSU5VU0VECQkJMHgwMDAwMjAwMAogI2RlZmluZSBmT1BfU1RBVFVTX01BWF9SRVRSWV9FTkFCTEVECQkweDAwMDA0MDAwCiAjZGVmaW5lIGZPUF9TVEFUVVNfV0FLRVVQX05PVyAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBmT1BfU1RBVFVTX1BDSUVfREVWSUNFICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UgZk9QX1NUQVRVU19QQ0lFX0RFVklDRQogCi0jaWZkZWYgUlQyODYwCi0vLwotLy8gIFJUTVBfQURBUFRFUiBQU0ZsYWdzIDogcmVsYXRlZCB0byBhZHZhbmNlZCBwb3dlciBzYXZlLgotLy8KLS8vIEluZGljYXRlIHdoZXRoZXIgZHJpdmVyIGNhbiBnbyB0byBzbGVlcCBtb2RlIGZyb20gbm93LiBUaGlzIGZsYWcgaXMgdXNlZnVsIEFGVEVSIGxpbmsgdXAKKy8qICovCisvKiAgc3RydWN0IHJ0X3J0bXBfYWRhcHRlciBQU0ZsYWdzIDogcmVsYXRlZCB0byBhZHZhbmNlZCBwb3dlciBzYXZlLiAqLworLyogKi8KKy8qIEluZGljYXRlIHdoZXRoZXIgZHJpdmVyIGNhbiBnbyB0byBzbGVlcCBtb2RlIGZyb20gbm93LiBUaGlzIGZsYWcgaXMgdXNlZnVsIEFGVEVSIGxpbmsgdXAgKi8KICNkZWZpbmUgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQICAgICAgICAgIDB4MDAwMDAwMDEKLS8vIEluZGljYXRlIHdoZXRoZXIgZHJpdmVyIGhhcyBpc3N1ZSBhIExpbmtDb250cm9sIGNvbW1hbmQgdG8gUENJZSBMMQorLyogSW5kaWNhdGUgd2hldGhlciBkcml2ZXIgaGFzIGlzc3VlIGEgTGlua0NvbnRyb2wgY29tbWFuZCB0byBQQ0llIEwxICovCiAjZGVmaW5lIGZSVE1QX1BTX1NFVF9QQ0lfQ0xLX09GRl9DT01NQU5EICAgICAgICAgIDB4MDAwMDAwMDIKLS8vIEluZGljYXRlIGRyaXZlciBzaG91bGQgZGlzYWJsZSBraWNrIG9mZiBoYXJkd2FyZSB0byBzZW5kIHBhY2tldHMgZnJvbSBub3cuCisvKiBJbmRpY2F0ZSBkcml2ZXIgc2hvdWxkIGRpc2FibGUga2ljayBvZmYgaGFyZHdhcmUgdG8gc2VuZCBwYWNrZXRzIGZyb20gbm93LiAqLwogI2RlZmluZSBmUlRNUF9QU19ESVNBQkxFX1RYICAgICAgICAgMHgwMDAwMDAwNAotLy8gSW5kaWNhdGUgZHJpdmVyIHNob3VsZCBJTU1FRElBVEVMWSBmbyB0byBzbGVlcCBhZnRlciByZWNlaXZpbmcgQVAncyBiZWFjb24gaW4gd2hpY2ggIGRvZXNuJ3QgaW5kaWNhdGUgdW5pY2F0ZSBub3IgbXVsdGljYXN0IHBhY2tldHMgZm9yIG1lCi0vLy4gVGhpcyBmbGFnIGlzIHVzZWQgT05MWSBpbiBSVE1QSGFuZGxlUnhEb25lSW50ZXJydXB0IHJvdXRpbmUuCisvKiBJbmRpY2F0ZSBkcml2ZXIgc2hvdWxkIElNTUVESUFURUxZIGZvIHRvIHNsZWVwIGFmdGVyIHJlY2VpdmluZyBBUCdzIGJlYWNvbiBpbiB3aGljaCAgZG9lc24ndCBpbmRpY2F0ZSB1bmljYXRlIG5vciBtdWx0aWNhc3QgcGFja2V0cyBmb3IgbWUgKi8KKy8qLiBUaGlzIGZsYWcgaXMgdXNlZCBPTkxZIGluIFJUTVBIYW5kbGVSeERvbmVJbnRlcnJ1cHQgcm91dGluZS4gKi8KICNkZWZpbmUgZlJUTVBfUFNfR09fVE9fU0xFRVBfTk9XICAgICAgICAgMHgwMDAwMDAwOAotI2VuZGlmCisjZGVmaW5lIGZSVE1QX1BTX1RPR0dMRV9MMQkJMHgwMDAwMDAxMAkvKiBVc2UgVG9nZ2xlIEwxIG1lY2hhbmlzbSBmb3IgcnQyOHh4IFBDSWUgKi8KKworI2lmZGVmIFJUMzA5MAorI2RlZmluZSBXQUtFX01DVV9DTUQJCQkJMHgzMQorI2RlZmluZSBTTEVFUF9NQ1VfQ01ECQkJCQkweDMwCisjZGVmaW5lIFJGT0ZGX01DVV9DTUQJCQkJMHgzNQorI2VuZGlmIC8qIFJUMzA5MCAvLyAqLwogCiAjZGVmaW5lIENDS1NFVFBST1RFQ1QJCTB4MQogI2RlZmluZSBPRkRNU0VUUFJPVEVDVAkJMHgyCkBAIC0yMjgsMTIgKzIyNCwxMiBAQAogI2RlZmluZSBHUjQwU0VUUFJPVEVDVAkJMHgyMAogI2RlZmluZSBBTExOX1NFVFBST1RFQ1QJCShHUjQwU0VUUFJPVEVDVCB8IEdGMjBTRVRQUk9URUNUIHwgTU00MFNFVFBST1RFQ1QgfCBNTTIwU0VUUFJPVEVDVCkKIAotLy8KLS8vICBBUCdzIGNsaWVudCB0YWJsZSBvcGVyYXRpb24gc3RhdHVzIGZsYWdzCi0vLwotI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSAgICAgICAgICAweDAwMDAwMDAxICAvLyBDTElFTlQgY2FuIHBhcnNlIFFPUyBEQVRBIGZyYW1lCi0jZGVmaW5lIGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUgIDB4MDAwMDAwMDIgIC8vIENMSUVOVCBjYW4gcmVjZWl2ZSBSYWxpbmsncyBwcm9wcmlldGFyeSBUWCBhZ2dyZWdhdGlvbiBmcmFtZQotI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19QSUdHWUJBQ0tfQ0FQQUJMRSAgICAweDAwMDAwMDA0ICAvLyBDTElFTlQgc3VwcG9ydCBwaWdneS1iYWNrCisvKiAqLworLyogIEFQJ3MgY2xpZW50IHRhYmxlIG9wZXJhdGlvbiBzdGF0dXMgZmxhZ3MgKi8KKy8qICovCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFICAgICAgICAgIDB4MDAwMDAwMDEJLyogQ0xJRU5UIGNhbiBwYXJzZSBRT1MgREFUQSBmcmFtZSAqLworI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFICAweDAwMDAwMDAyCS8qIENMSUVOVCBjYW4gcmVjZWl2ZSBSYWxpbmsncyBwcm9wcmlldGFyeSBUWCBhZ2dyZWdhdGlvbiBmcmFtZSAqLworI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19QSUdHWUJBQ0tfQ0FQQUJMRSAgICAweDAwMDAwMDA0CS8qIENMSUVOVCBzdXBwb3J0IHBpZ2d5LWJhY2sgKi8KICNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VECQkJMHgwMDAwMDAwOAogI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFCQkweDAwMDAwMDEwCiAjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUJCTB4MDAwMDAwMjAKQEAgLTI0Miw0NyArMjM4LDQ4IEBACiAjZGVmaW5lIGZDTElFTlRfU1RBVFVTX0hUQ19DQVBBQkxFCQkJMHgwMDAwMDEwMAogI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRQkJCTB4MDAwMDAyMDAKICNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfTUNTRkVFREJBQ0tfQ0FQQUJMRSAgMHgwMDAwMDQwMAotI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19BUFNEX0NBUEFCTEUgICAgICAgICAweDAwMDAwODAwICAvKiBVQVBTRCBTVEFUSU9OICovCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX0FQU0RfQ0FQQUJMRSAgICAgICAgIDB4MDAwMDA4MDAJLyogVUFQU0QgU1RBVElPTiAqLwogCiAjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUCQkweDAwMTAwMDAwCi0vLwotLy8gIFNUQSBjb25maWd1cmF0aW9uIGZsYWdzCi0vLworLyogKi8KKy8qICBTVEEgY29uZmlndXJhdGlvbiBmbGFncyAqLworLyogKi8KIAotLy8gODAyLjExbiBPcGVyYXRpbmcgTW9kZSBEZWZpbml0aW9uLiAwLTMgYWxzbyB1c2VkIGluIEFTSUNVUGRhdGVQcm90ZWN0IHN3aXRjaCBjYXNlCisvKiA4MDIuMTFuIE9wZXJhdGluZyBNb2RlIERlZmluaXRpb24uIDAtMyBhbHNvIHVzZWQgaW4gQVNJQ1VQZGF0ZVByb3RlY3Qgc3dpdGNoIGNhc2UgKi8KICNkZWZpbmUgSFRfTk9fUFJPVEVDVAkwCiAjZGVmaW5lIEhUX0xFR0FDWV9QUk9URUNUCTEKICNkZWZpbmUgSFRfNDBfUFJPVEVDVAkyCiAjZGVmaW5lIEhUXzIwNDBfUFJPVEVDVAkzCiAjZGVmaW5lIEhUX1JUU0NUU182TQk3Ci0vL2ZvbGxvd2luZyBpcyBvdXIgb3duIGRlZmluaXRpb24gaW4gb3JkZXIgdG8gdHVybiBvbiBvdXIgQVNJQyBwcm90ZWN0aW9uIHJlZ2lzdGVyIGluIElORlJBU1RSVUNUVVJFLgotI2RlZmluZSBIVF9BVEhFUk9TCTgJLy8gcnQyODYwYyBoYXMgcHJvYmxlbSB3aXRoIGF0aGVyb3MgY2hpcC4gd2UgbmVlZCB0byB0dXJuIG9uIFJUUy9DVFMgLgotI2RlZmluZSBIVF9GT1JDRVJUU0NUUwk5CS8vIEZvcmNlIHR1cm4gb24gUlRTL0NUUyBmaXJzdC4gdGhlbiBnbyB0byBldmFsdWF0ZSBpZiB0aGlzIGZvcmNlIFJUUyBpcyBuZWNlc3NhcnkuCisvKmZvbGxvd2luZyBpcyBvdXIgb3duIGRlZmluaXRpb24gaW4gb3JkZXIgdG8gdHVybiBvbiBvdXIgQVNJQyBwcm90ZWN0aW9uIHJlZ2lzdGVyIGluIElORlJBU1RSVUNUVVJFLiAqLworI2RlZmluZSBIVF9BVEhFUk9TCTgJLyogcnQyODYwYyBoYXMgcHJvYmxlbSB3aXRoIGF0aGVyb3MgY2hpcC4gd2UgbmVlZCB0byB0dXJuIG9uIFJUUy9DVFMgLiAqLworI2RlZmluZSBIVF9GT1JDRVJUU0NUUwk5CS8qIEZvcmNlIHR1cm4gb24gUlRTL0NUUyBmaXJzdC4gdGhlbiBnbyB0byBldmFsdWF0ZSBpZiB0aGlzIGZvcmNlIFJUUyBpcyBuZWNlc3NhcnkuICovCiAKLS8vCi0vLyBSWCBQYWNrZXQgRmlsdGVyIGNvbnRyb2wgZmxhZ3MuIEFwcGx5IG9uIHBBZC0+UGFja2V0RmlsdGVyCi0vLworLyogKi8KKy8qIFJYIFBhY2tldCBGaWx0ZXIgY29udHJvbCBmbGFncy4gQXBwbHkgb24gcEFkLT5QYWNrZXRGaWx0ZXIgKi8KKy8qICovCiAjZGVmaW5lIGZSWF9GSUxURVJfQUNDRVBUX0RJUkVDVCAgICAgICAgICAgIE5ESVNfUEFDS0VUX1RZUEVfRElSRUNURUQKICNkZWZpbmUgZlJYX0ZJTFRFUl9BQ0NFUFRfTVVMVElDQVNUICAgICAgICAgTkRJU19QQUNLRVRfVFlQRV9NVUxUSUNBU1QKICNkZWZpbmUgZlJYX0ZJTFRFUl9BQ0NFUFRfQlJPQURDQVNUICAgICAgICAgTkRJU19QQUNLRVRfVFlQRV9CUk9BRENBU1QKICNkZWZpbmUgZlJYX0ZJTFRFUl9BQ0NFUFRfQUxMX01VTFRJQ0FTVCAgICAgTkRJU19QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUCisjZGVmaW5lIGZSWF9GSUxURVJfQUNDRVBUX1BST01JU0NVT1VTICAgICAgIE5ESVNfUEFDS0VUX1RZUEVfUFJPTUlTQ1VPVVMKIAotLy8KLS8vIEVycm9yIGNvZGUgc2VjdGlvbgotLy8KLS8vIE5ESVNfRVJST1JfQ09ERV9BREFQVEVSX05PVF9GT1VORAorLyogKi8KKy8qIEVycm9yIGNvZGUgc2VjdGlvbiAqLworLyogKi8KKy8qIE5ESVNfRVJST1JfQ09ERV9BREFQVEVSX05PVF9GT1VORCAqLwogI2RlZmluZSBFUlJMT0dfUkVBRF9QQ0lfU0xPVF9GQUlMRUQgICAgIDB4MDAwMDAxMDFMCiAjZGVmaW5lIEVSUkxPR19XUklURV9QQ0lfU0xPVF9GQUlMRUQgICAgMHgwMDAwMDEwMkwKICNkZWZpbmUgRVJSTE9HX1ZFTkRPUl9ERVZJQ0VfTk9NQVRDSCAgICAweDAwMDAwMTAzTAogCi0vLyBORElTX0VSUk9SX0NPREVfQURBUFRFUl9ESVNBQkxFRAorLyogTkRJU19FUlJPUl9DT0RFX0FEQVBURVJfRElTQUJMRUQgKi8KICNkZWZpbmUgRVJSTE9HX0JVU19NQVNURVJfRElTQUJMRUQgICAgICAweDAwMDAwMjAxTAogCi0vLyBORElTX0VSUk9SX0NPREVfVU5TVVBQT1JURURfQ09ORklHVVJBVElPTgorLyogTkRJU19FUlJPUl9DT0RFX1VOU1VQUE9SVEVEX0NPTkZJR1VSQVRJT04gKi8KICNkZWZpbmUgRVJSTE9HX0lOVkFMSURfU1BFRURfRFVQTEVYICAgICAweDAwMDAwMzAxTAogI2RlZmluZSBFUlJMT0dfU0VUX1NFQ09OREFSWV9GQUlMRUQgICAgIDB4MDAwMDAzMDJMCiAKLS8vIE5ESVNfRVJST1JfQ09ERV9PVVRfT0ZfUkVTT1VSQ0VTCisvKiBORElTX0VSUk9SX0NPREVfT1VUX09GX1JFU09VUkNFUyAqLwogI2RlZmluZSBFUlJMT0dfT1VUX09GX01FTU9SWSAgICAgICAgICAgIDB4MDAwMDA0MDFMCiAjZGVmaW5lIEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWSAgICAgMHgwMDAwMDQwMkwKICNkZWZpbmUgRVJSTE9HX09VVF9PRl9NQVBfUkVHSVNURVJTICAgICAweDAwMDAwNDAzTApAQCAtMjkyLDIyICsyODksMjEgQEAKICNkZWZpbmUgRVJSTE9HX09VVF9PRl9ORElTX1BBQ0tFVCAgICAgICAweDAwMDAwNDA3TAogI2RlZmluZSBFUlJMT0dfT1VUX09GX0xPT0tBU0lERV9NRU1PUlkgIDB4MDAwMDA0MDhMCiAKLS8vIE5ESVNfRVJST1JfQ09ERV9IQVJEV0FSRV9GQUlMVVJFCisvKiBORElTX0VSUk9SX0NPREVfSEFSRFdBUkVfRkFJTFVSRSAqLwogI2RlZmluZSBFUlJMT0dfU0VMRlRFU1RfRkFJTEVEICAgICAgICAgIDB4MDAwMDA1MDFMCiAjZGVmaW5lIEVSUkxPR19JTklUSUFMSVpFX0FEQVBURVIgICAgICAgMHgwMDAwMDUwMkwKICNkZWZpbmUgRVJSTE9HX1JFTU9WRV9NSU5JUE9SVCAgICAgICAgICAweDAwMDAwNTAzTAogCi0vLyBORElTX0VSUk9SX0NPREVfUkVTT1VSQ0VfQ09ORkxJQ1QKKy8qIE5ESVNfRVJST1JfQ09ERV9SRVNPVVJDRV9DT05GTElDVCAqLwogI2RlZmluZSBFUlJMT0dfTUFQX0lPX1NQQUNFICAgICAgICAgICAgIDB4MDAwMDA2MDFMCiAjZGVmaW5lIEVSUkxPR19RVUVSWV9BREFQVEVSX1JFU09VUkNFUyAgMHgwMDAwMDYwMkwKICNkZWZpbmUgRVJSTE9HX05PX0lPX1JFU09VUkNFICAgICAgICAgICAweDAwMDAwNjAzTAogI2RlZmluZSBFUlJMT0dfTk9fSU5URVJSVVBUX1JFU09VUkNFICAgIDB4MDAwMDA2MDRMCiAjZGVmaW5lIEVSUkxPR19OT19NRU1PUllfUkVTT1VSQ0UgICAgICAgMHgwMDAwMDYwNUwKIAotCi0vLyBXRFMgZGVmaW5pdGlvbgorLyogV0RTIGRlZmluaXRpb24gKi8KICNkZWZpbmUJTUFYX1dEU19FTlRSWSAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgV0RTX1BBSVJXSVNFX0tFWV9PRkZTRVQgICAgIDYwICAgIC8vIFdEUyBsaW5rcyB1c2VzIHBhaXJ3aXNlIGtleSM2MCB+IDYzIGluIEFTSUMgcGFpcndpc2Uga2V5IHRhYmxlCisjZGVmaW5lIFdEU19QQUlSV0lTRV9LRVlfT0ZGU0VUICAgICA2MAkvKiBXRFMgbGlua3MgdXNlcyBwYWlyd2lzZSBrZXkjNjAgfiA2MyBpbiBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZSAqLwogCiAjZGVmaW5lCVdEU19ESVNBQkxFX01PREUgICAgICAgICAgICAwCiAjZGVmaW5lCVdEU19SRVNUUklDVF9NT0RFICAgICAgICAgICAxCkBAIC0zMTUsMjMgKzMxMSwyMCBAQAogI2RlZmluZQlXRFNfUkVQRUFURVJfTU9ERSAgICAgICAgICAgMwogI2RlZmluZQlXRFNfTEFaWV9NT0RFICAgICAgICAgICAgICAgNAogCi0KICNkZWZpbmUgTUFYX01FU0hfTlVNCQkJCTAKIAogI2RlZmluZSBNQVhfQVBDTElfTlVNCQkJCTAKIAogI2RlZmluZSBNQVhfTUJTU0lEX05VTQkJCQkxCi0jaWYgZGVmaW5lZChSVDI4NjApIHx8IGRlZmluZWQoUlQzMHh4KQogI2lmZGVmIE1CU1NfU1VQUE9SVAogI3VuZGVmCU1BWF9NQlNTSURfTlVNCiAjZGVmaW5lIE1BWF9NQlNTSURfTlVNCQkJCSg4IC0gTUFYX01FU0hfTlVNIC0gTUFYX0FQQ0xJX05VTSkKLSNlbmRpZiAvLyBNQlNTX1NVUFBPUlQgLy8KLSNlbmRpZgorI2VuZGlmIC8qIE1CU1NfU1VQUE9SVCAvLyAqLwogCiAvKiBzYW5pdHkgY2hlY2sgZm9yIGFwaWR4ICovCiAjZGVmaW5lIE1CU1NfTVJfQVBJRFhfU0FOSVRZX0NIRUNLKGFwaWR4KSBcCiAgICAgeyBpZiAoYXBpZHggPiBNQVhfTUJTU0lEX05VTSkgeyBcCi0gICAgICAgICAgcHJpbnRrKCIlcz4gRXJyb3IhIGFwaWR4ID0gJWQgPiBNQVhfTUJTU0lEX05VTSFcbiIsIF9fZnVuY19fLCBhcGlkeCk7IFwKKyAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcz4gRXJyb3IhIGFwaWR4ID0gJWQgPiBNQVhfTUJTU0lEX05VTSFcbiIsIF9fZnVuY19fLCBhcGlkeCkpOyBcCiAJICBhcGlkeCA9IE1BSU5fTUJTU0lEOyB9IH0KIAogI2RlZmluZSBWQUxJRF9XQ0lEKF93Y2lkKQkoKF93Y2lkKSA+IDAgJiYgKF93Y2lkKSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFICkKQEAgLTMzOSwxMiArMzMyLDExIEBACiAjZGVmaW5lIE1BSU5fTUJTU0lEICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIEZJUlNUX01CU1NJRCAgICAgICAgICAgICAgICAxCiAKLQogI2RlZmluZSBNQVhfQkVBQ09OX1NJWkUJCQkJNTEyCi0vLyBJZiB0aGUgTUFYX01CU1NJRF9OVU0gaXMgbGFyZ2VyIHRoYW4gNiwKLS8vIGl0IHNoYWxsIHJlc2VydmUgc29tZSBXQ0lEIHNwYWNlKHdjaWQgMjIyfjI1MykgZm9yIGJlYWNvbiBmcmFtZXMuCi0vLyAtCXRoZXNlIHdjaWQgMjM4fjI1MyBhcmUgcmVzZXJ2ZWQgZm9yIGJlYWNvbiM2KHJhNikuCi0vLyAtCXRoZXNlIHdjaWQgMjIyfjIzNyBhcmUgcmVzZXJ2ZWQgZm9yIGJlYWNvbiM3KHJhNykuCisvKiBJZiB0aGUgTUFYX01CU1NJRF9OVU0gaXMgbGFyZ2VyIHRoYW4gNiwgKi8KKy8qIGl0IHNoYWxsIHJlc2VydmUgc29tZSBXQ0lEIHNwYWNlKHdjaWQgMjIyfjI1MykgZm9yIGJlYWNvbiBmcmFtZXMuICovCisvKiAtICAgIHRoZXNlIHdjaWQgMjM4fjI1MyBhcmUgcmVzZXJ2ZWQgZm9yIGJlYWNvbiM2KHJhNikuICovCisvKiAtICAgIHRoZXNlIHdjaWQgMjIyfjIzNyBhcmUgcmVzZXJ2ZWQgZm9yIGJlYWNvbiM3KHJhNykuICovCiAjaWYgZGVmaW5lZChNQVhfTUJTU0lEX05VTSkgJiYgKE1BWF9NQlNTSURfTlVNID09IDgpCiAjZGVmaW5lIEhXX1JFU0VSVkVEX1dDSUQJMjIyCiAjZWxpZiBkZWZpbmVkKE1BWF9NQlNTSURfTlVNKSAmJiAoTUFYX01CU1NJRF9OVU0gPT0gNykKQEAgLTM1MywxNyArMzQ1LDE3IEBACiAjZGVmaW5lIEhXX1JFU0VSVkVEX1dDSUQJMjU1CiAjZW5kaWYKIAotLy8gVGhlbiBkZWRpY2F0ZSB3Y2lkIG9mIERGUyBhbmQgQ2Fycmllci1TZW5zZS4KKy8qIFRoZW4gZGVkaWNhdGUgd2NpZCBvZiBERlMgYW5kIENhcnJpZXItU2Vuc2UuICovCiAjZGVmaW5lIERGU19DVFNfV0NJRCAJCShIV19SRVNFUlZFRF9XQ0lEIC0gMSkKICNkZWZpbmUgQ1NfQ1RTX1dDSUQgCQkoSFdfUkVTRVJWRURfV0NJRCAtIDIpCiAjZGVmaW5lIExBU1RfU1BFQ0lGSUNfV0NJRAkoSFdfUkVTRVJWRURfV0NJRCAtIDIpCiAKLS8vIElmIE1BWF9NQlNTSURfTlVNIGlzIDgsIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSB3Y2lkIGZvciB0aGUgYXNzb2NpYXRlZCBTVEEgaXMgMjExLgotLy8gSWYgTUFYX01CU1NJRF9OVU0gaXMgNywgdGhlIG1heGltdW0gYXZhaWxhYmxlIHdjaWQgZm9yIHRoZSBhc3NvY2lhdGVkIFNUQSBpcyAyMjguCisvKiBJZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGUgbWF4aW11bSBhdmFpbGFibGUgd2NpZCBmb3IgdGhlIGFzc29jaWF0ZWQgU1RBIGlzIDIxMS4gKi8KKy8qIElmIE1BWF9NQlNTSURfTlVNIGlzIDcsIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSB3Y2lkIGZvciB0aGUgYXNzb2NpYXRlZCBTVEEgaXMgMjI4LiAqLwogI2RlZmluZSBNQVhfQVZBSUxBQkxFX0NMSUVOVF9XQ0lECShMQVNUX1NQRUNJRklDX1dDSUQgLSBNQVhfTUJTU0lEX05VTSAtIDEpCiAKLS8vIFRYIG5lZWQgV0NJRCB0byBmaW5kIENpcGhlciBLZXkKLS8vIHRoZXNlIHdjaWQgMjEyIH4gMjE5IGFyZSByZXNlcnZlZCBmb3IgYmMvbWMgcGFja2V0cyBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LgorLyogVFggbmVlZCBXQ0lEIHRvIGZpbmQgQ2lwaGVyIEtleSAqLworLyogdGhlc2Ugd2NpZCAyMTIgfiAyMTkgYXJlIHJlc2VydmVkIGZvciBiYy9tYyBwYWNrZXRzIGlmIE1BWF9NQlNTSURfTlVNIGlzIDguICovCiAjZGVmaW5lIEdFVF9Hcm91cEtleV9XQ0lEKF9fd2NpZCwgX19ic3NpZHgpIFwKIAl7CQkJCQkJCQkJCVwKIAkJX193Y2lkID0gTEFTVF9TUEVDSUZJQ19XQ0lEIC0gKE1BWF9NQlNTSURfTlVNKSArIF9fYnNzaWR4OwlcCkBAIC0zNzEsOCArMzYzLDcgQEAKIAogI2RlZmluZSBJc0dyb3VwS2V5V0NJRChfX3djaWQpICgoKF9fd2NpZCkgPCBMQVNUX1NQRUNJRklDX1dDSUQpICYmICgoX193Y2lkKSA+PSAoTEFTVF9TUEVDSUZJQ19XQ0lEIC0gKE1BWF9NQlNTSURfTlVNKSkpKQogCi0KLS8vIGRlZmluaXRpb24gdG8gc3VwcG9ydCBtdWx0aXBsZSBCU1NJRAorLyogZGVmaW5pdGlvbiB0byBzdXBwb3J0IG11bHRpcGxlIEJTU0lEICovCiAjZGVmaW5lIEJTUzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBCU1MxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgQlNTMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCkBAIC0zODIsMjYgKzM3MywyNiBAQAogI2RlZmluZSBCU1M2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKICNkZWZpbmUgQlNTNyAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CiAKLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIExlbmd0aCBkZWZpbml0aW9ucworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIExlbmd0aCBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBQRUVSX0tFWV9OTyAgICAgICAgICAgICAgICAgICAgIDIKICNkZWZpbmUgTUFDX0FERFJfTEVOICAgICAgICAgICAgICAgICAgICA2CiAjZGVmaW5lIFRJTUVTVEFNUF9MRU4gICAgICAgICAgICAgICAgICAgOAotI2RlZmluZSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyAgICAgIE1BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFUyAvLyAxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0Ci0jZGVmaW5lIE1BWF9MRU5fT0ZfS0VZICAgICAgICAgICAgICAgICAgMzIgICAgICAvLyAzMiBvY3RldHMgPT0gMjU2IGJpdHMsIFJlZGVmaW5lIGZvciBXUEEKLSNkZWZpbmUgTUFYX05VTV9PRl9DSEFOTkVMUyAgICAgICAgICAgICBNQVhfTlVNX09GX0NIUyAgICAgIC8vIDE0IGNoYW5uZWxzIEAyLjRHICsgIDEyQFVOSUkgKyA0IEBNTUFDICsgMTEgQEhpcGVyTEFOMiArIDcgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uCi0jZGVmaW5lIE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFMgICAgICAgICAgICAgMjAgICAgICAvLyAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJICsgNCBATU1BQyArIDExIEBIaXBlckxBTjIgKyA3IEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbgorI2RlZmluZSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyAgICAgIE1BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFUwkvKiAxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0ICovCisjZGVmaW5lIE1BWF9MRU5fT0ZfS0VZICAgICAgICAgICAgICAgICAgMzIJLyogMzIgb2N0ZXRzID09IDI1NiBiaXRzLCBSZWRlZmluZSBmb3IgV1BBICovCisjZGVmaW5lIE1BWF9OVU1fT0ZfQ0hBTk5FTFMgICAgICAgICAgICAgTUFYX05VTV9PRl9DSFMJLyogMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb24gKi8KKyNkZWZpbmUgTUFYX05VTV9PRl8xMUpDSEFOTkVMUyAgICAgICAgICAgICAyMAkvKiAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJICsgNCBATU1BQyArIDExIEBIaXBlckxBTjIgKyA3IEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbiAqLwogI2RlZmluZSBNQVhfTEVOX09GX1NTSUQgICAgICAgICAgICAgICAgIDMyCiAjZGVmaW5lIENJUEhFUl9URVhUX0xFTiAgICAgICAgICAgICAgICAgMTI4CiAjZGVmaW5lIEhBU0hfVEFCTEVfU0laRSAgICAgICAgICAgICAgICAgMjU2Ci0jZGVmaW5lIE1BWF9WSUVfTEVOICAgICAgICAgICAgICAgICAgICAgMTAyNCAgIC8vIE5ldyBmb3IgV1BBIGNpcGhlciBzdWl0ZSB2YXJpYWJsZSBJRSBzaXplcy4KKyNkZWZpbmUgTUFYX1ZJRV9MRU4gICAgICAgICAgICAgICAgICAgICAxMDI0CS8qIE5ldyBmb3IgV1BBIGNpcGhlciBzdWl0ZSB2YXJpYWJsZSBJRSBzaXplcy4gKi8KICNkZWZpbmUgTUFYX1NVUFBPUlRfTUNTICAgICAgICAgICAgIDMyCisjZGVmaW5lIE1BWF9OVU1fT0ZfQkJQX0xBVENIICAgICAgICAgICAgIDE0MAogCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gQVNJQyBXQ0lEIFRhYmxlIGRlZmluaXRpb24uCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2RlZmluZSBCU1NJRF9XQ0lECQkxCS8vIGluIGluZnJhIG1vZGUsIGFsd2F5cyBwdXQgYnNzaWQgd2l0aCB0aGlzIFdDSUQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBBU0lDIFdDSUQgVGFibGUgZGVmaW5pdGlvbi4gKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjZGVmaW5lIEJTU0lEX1dDSUQJCTEJLyogaW4gaW5mcmEgbW9kZSwgYWx3YXlzIHB1dCBic3NpZCB3aXRoIHRoaXMgV0NJRCAqLwogI2RlZmluZSBNQ0FTVF9XQ0lECTB4MAogI2RlZmluZSBCU1MwTWNhc3RfV0NJRAkweDAKICNkZWZpbmUgQlNTMU1jYXN0X1dDSUQJMHhmOApAQCAtNDE1LDEwICs0MDYsMTAgQEAKIAogI2RlZmluZSBNQVhfTlVNX09GX0FDTF9MSVNUCQkJCU1BWF9OVU1CRVJfT0ZfQUNMCiAKLSNkZWZpbmUgTUFYX0xFTl9PRl9NQUNfVEFCTEUgICAgICAgICAgICBNQVhfTlVNQkVSX09GX01BQyAvLyBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGlzIHZhbHVlIGNhbid0IGJlIGxhcmdlciB0aGFuIDIxMQorI2RlZmluZSBNQVhfTEVOX09GX01BQ19UQUJMRSAgICAgICAgICAgIE1BWF9OVU1CRVJfT0ZfTUFDCS8qIGlmIE1BWF9NQlNTSURfTlVNIGlzIDgsIHRoaXMgdmFsdWUgY2FuJ3QgYmUgbGFyZ2VyIHRoYW4gMjExICovCiAKICNpZiBNQVhfTEVOX09GX01BQ19UQUJMRT5NQVhfQVZBSUxBQkxFX0NMSUVOVF9XQ0lECi0jZXJyb3IgTUFYX0xFTl9PRl9NQUNfVEFCTEUgY2FuIG5vdCBiZSBsYXJnZXIgdGhhbiBNQVhfQVZBSUxBQkxFX0NMSUVOVF9XQ0lEISEhIQorI2Vycm9yIE1BWF9MRU5fT0ZfTUFDX1RBQkxFIGNhbiBub3QgYmUgbGFyZ2VyIHRoYW4gTUFYX0FWQUlMQUJMRV9DTElFTlRfV0NJRCEKICNlbmRpZgogCiAjZGVmaW5lIE1BWF9OVU1fT0ZfV0RTX0xJTktfUEVSQlNTSUQJICAgICAgICAgICAgMwpAQCAtNDI4LDQyICs0MTksNDEgQEAKIAogI2RlZmluZSBOVU1fT0ZfVElECQkJOAogI2RlZmluZSBNQVhfQUlEX0JBICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFICAgICAgICAgICgoTlVNX09GX1RJRCAqIE1BWF9MRU5fT0ZfTUFDX1RBQkxFKS8yKS8vICAgKE5VTV9PRl9USUQqTUFYX0FJRF9CQSArIDMyKQkgLy9CbG9jayBBQ0sgcmVjaXBpZW50Ci0jZGVmaW5lIE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFICAgICAgICAgICgoTlVNX09GX1RJRCAqIE1BWF9MRU5fT0ZfTUFDX1RBQkxFKS8yKS8vICAgKE5VTV9PRl9USUQqTUFYX0FJRF9CQSArIDMyKSAgIC8vIEJsb2NrIEFDSyBvcmlnaW5hdG9yCisjZGVmaW5lIE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFICAgICAgICAgICgoTlVNX09GX1RJRCAqIE1BWF9MRU5fT0ZfTUFDX1RBQkxFKS8yKQkvKiAgIChOVU1fT0ZfVElEKk1BWF9BSURfQkEgKyAzMikgICAgICAgIC8vQmxvY2sgQUNLIHJlY2lwaWVudCAqLworI2RlZmluZSBNQVhfTEVOX09GX0JBX09SSV9UQUJMRSAgICAgICAgICAoKE5VTV9PRl9USUQgKiBNQVhfTEVOX09GX01BQ19UQUJMRSkvMikJLyogICAoTlVNX09GX1RJRCpNQVhfQUlEX0JBICsgMzIpICAgLy8gQmxvY2sgQUNLIG9yaWdpbmF0b3IgKi8KICNkZWZpbmUgTUFYX0xFTl9PRl9CU1NfVEFCTEUgICAgICAgICAgICAgNjQKICNkZWZpbmUgTUFYX1JFT1JERVJJTkdfTVBEVV9OVU0JCQkgNTEyCiAKLS8vIGtleSByZWxhdGVkIGRlZmluaXRpb25zCisvKiBrZXkgcmVsYXRlZCBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBTSEFSRV9LRVlfTlVNICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgTUFYX0xFTl9PRl9TSEFSRV9LRVkgICAgICAgICAgICAxNiAgICAvLyBieXRlIGNvdW50Ci0jZGVmaW5lIE1BWF9MRU5fT0ZfUEVFUl9LRVkgICAgICAgICAgICAgMTYgICAgLy8gYnl0ZSBjb3VudAotI2RlZmluZSBQQUlSV0lTRV9LRVlfTlVNICAgICAgICAgICAgICAgIDY0ICAgIC8vIGluIE1BQyBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZQorI2RlZmluZSBNQVhfTEVOX09GX1NIQVJFX0tFWSAgICAgICAgICAgIDE2CS8qIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgTUFYX0xFTl9PRl9QRUVSX0tFWSAgICAgICAgICAgICAxNgkvKiBieXRlIGNvdW50ICovCisjZGVmaW5lIFBBSVJXSVNFX0tFWV9OVU0gICAgICAgICAgICAgICAgNjQJLyogaW4gTUFDIEFTSUMgcGFpcndpc2Uga2V5IHRhYmxlICovCiAjZGVmaW5lIEdST1VQX0tFWV9OVU0gICAgICAgICAgICAgICAgICAgNAogI2RlZmluZSBQTUtfTEVOICAgICAgICAgICAgICAgICAgICAgICAgIDMyCi0jZGVmaW5lIFdEU19QQUlSV0lTRV9LRVlfT0ZGU0VUICAgICAgICAgNjAgICAgLy8gV0RTIGxpbmtzIHVzZXMgcGFpcndpc2Uga2V5IzYwIH4gNjMgaW4gQVNJQyBwYWlyd2lzZSBrZXkgdGFibGUKLSNkZWZpbmUJUE1LSURfTk8gICAgICAgICAgICAgICAgICAgICAgICA0ICAgICAvLyBOdW1iZXIgb2YgUE1LSUQgc2F2ZWQgc3VwcG9ydGVkCisjZGVmaW5lIFdEU19QQUlSV0lTRV9LRVlfT0ZGU0VUICAgICAgICAgNjAJLyogV0RTIGxpbmtzIHVzZXMgcGFpcndpc2Uga2V5IzYwIH4gNjMgaW4gQVNJQyBwYWlyd2lzZSBrZXkgdGFibGUgKi8KKyNkZWZpbmUJUE1LSURfTk8gICAgICAgICAgICAgICAgICAgICAgICA0CS8qIE51bWJlciBvZiBQTUtJRCBzYXZlZCBzdXBwb3J0ZWQgKi8KICNkZWZpbmUgTUFYX0xFTl9PRl9NTE1FX0JVRkZFUiAgICAgICAgICAyMDQ4CiAKLS8vIHBvd2VyIHN0YXR1cyByZWxhdGVkIGRlZmluaXRpb25zCisvKiBwb3dlciBzdGF0dXMgcmVsYXRlZCBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBQV1JfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgUFdSX1NBVkUgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFBXUl9NTVBTICAgICAgICAgICAgICAgICAgICAgICAgMgkJCS8vTUlNTyBwb3dlciBzYXZlCisjZGVmaW5lIFBXUl9NTVBTICAgICAgICAgICAgICAgICAgICAgICAgMgkvKk1JTU8gcG93ZXIgc2F2ZSAqLwogCi0vLyBBdXRoIGFuZCBBc3NvYyBtb2RlIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKy8qIEF1dGggYW5kIEFzc29jIG1vZGUgcmVsYXRlZCBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBBVVRIX01PREVfT1BFTiAgICAgICAgICAgICAgICAgIDB4MDAKICNkZWZpbmUgQVVUSF9NT0RFX0tFWSAgICAgICAgICAgICAgICAgICAweDAxCiAKLS8vIEJTUyBUeXBlIGRlZmluaXRpb25zCi0jZGVmaW5lIEJTU19BREhPQyAgICAgICAgICAgICAgICAgICAgICAgMCAgLy8gPSBOZGlzODAyXzExSUJTUwotI2RlZmluZSBCU1NfSU5GUkEgICAgICAgICAgICAgICAgICAgICAgIDEgIC8vID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlCi0jZGVmaW5lIEJTU19BTlkgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLy8gPSBOZGlzODAyXzExQXV0b1Vua25vd24KLSNkZWZpbmUgQlNTX01PTklUT1IJCQkgICAgICAgICAgICAzICAvLyA9IE5kaXM4MDJfMTFNb25pdG9yCisvKiBCU1MgVHlwZSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBCU1NfQURIT0MgICAgICAgICAgICAgICAgICAgICAgIDAJLyogPSBOZGlzODAyXzExSUJTUyAqLworI2RlZmluZSBCU1NfSU5GUkEgICAgICAgICAgICAgICAgICAgICAgIDEJLyogPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgQlNTX0FOWSAgICAgICAgICAgICAgICAgICAgICAgICAyCS8qID0gTmRpczgwMl8xMUF1dG9Vbmtub3duICovCisjZGVmaW5lIEJTU19NT05JVE9SCQkJICAgICAgICAgICAgMwkvKiA9IE5kaXM4MDJfMTFNb25pdG9yICovCiAKLQotLy8gUmVhc29uIGNvZGUgZGVmaW5pdGlvbnMKKy8qIFJlYXNvbiBjb2RlIGRlZmluaXRpb25zICovCiAjZGVmaW5lIFJFQVNPTl9SRVNFUlZFRCAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBSRUFTT05fVU5TUEVDSUZZICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgUkVBU09OX05PX0xPTkdFUl9WQUxJRCAgICAgICAgICAyCisjZGVmaW5lIFJFQVNPTl9OT19sb25nRVJfVkFMSUQgICAgICAgICAgMgogI2RlZmluZSBSRUFTT05fREVBVVRIX1NUQV9MRUFWSU5HICAgICAgIDMKICNkZWZpbmUgUkVBU09OX0RJU0FTU09DX0lOQUNUSVZFICAgICAgICA0CiAjZGVmaW5lIFJFQVNPTl9ESVNBU1NQQ19BUF9VTkFCTEUgICAgICAgNQpAQCAtNDk1LDcgKzQ4NSw3IEBACiAjZGVmaW5lIFJFQVNPTl9RT1NfUkVRVUVTVF9USU1FT1VUICAgICAgICAzOQogI2RlZmluZSBSRUFTT05fUU9TX0NJUEhFUl9OT1RfU1VQUE9SVCAgICAgNDUKIAotLy8gU3RhdHVzIGNvZGUgZGVmaW5pdGlvbnMKKy8qIFN0YXR1cyBjb2RlIGRlZmluaXRpb25zICovCiAjZGVmaW5lIE1MTUVfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBNTE1FX1VOU1BFQ0lGWV9GQUlMICAgICAgICAgICAgIDEKICNkZWZpbmUgTUxNRV9DQU5OT1RfU1VQUE9SVF9DQVAgICAgICAgICAxMApAQCAtNTE1LDYgKzUwNSw5IEBACiAjZGVmaW5lIE1MTUVfUU9TX1VOU1BFQ0lGWSAgICAgICAgICAgICAgICAzMgogI2RlZmluZSBNTE1FX1JFUVVFU1RfREVDTElORUQgICAgICAgICAgICAgMzcKICNkZWZpbmUgTUxNRV9SRVFVRVNUX1dJVEhfSU5WQUxJRF9QQVJBTSAgIDM4CisjZGVmaW5lIE1MTUVfSU5WQUxJRF9HUk9VUF9DSVBIRVIJICA0MQorI2RlZmluZSBNTE1FX0lOVkFMSURfUEFJUldJU0VfQ0lQSEVSCSAgNDIKKyNkZWZpbmUgTUxNRV9JTlZBTElEX0FLTVAJCQkgIDQzCiAjZGVmaW5lIE1MTUVfRExTX05PVF9BTExPV19JTl9RQlNTICAgICAgICA0OAogI2RlZmluZSBNTE1FX0RFU1RfU1RBX05PVF9JTl9RQlNTICAgICAgICAgNDkKICNkZWZpbmUgTUxNRV9ERVNUX1NUQV9JU19OT1RfQV9RU1RBICAgICAgIDUwCkBAIC01MjQsNyArNTE3LDcgQEAKICNkZWZpbmUgTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVCAgICAgICAweDUzCiAjZGVmaW5lIE1MTUVfTUFDX1RBQkxFX0ZBSUwgICAgICAgICAgICAgMHg1NAogCi0vLyBJRSBjb2RlCisvKiBJRSBjb2RlICovCiAjZGVmaW5lIElFX1NTSUQgICAgICAgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBJRV9TVVBQX1JBVEVTICAgICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgSUVfRkhfUEFSTSAgICAgICAgICAgICAgICAgICAgICAyCkBAIC01MzIsOTQgKzUyNSw5NSBAQAogI2RlZmluZSBJRV9DRl9QQVJNICAgICAgICAgICAgICAgICAgICAgIDQKICNkZWZpbmUgSUVfVElNICAgICAgICAgICAgICAgICAgICAgICAgICA1CiAjZGVmaW5lIElFX0lCU1NfUEFSTSAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBJRV9DT1VOVFJZICAgICAgICAgICAgICAgICAgICAgIDcgICAgIC8vIDgwMi4xMWQKLSNkZWZpbmUgSUVfODAyXzExRF9SRVFVRVNUICAgICAgICAgICAgICAxMCAgICAvLyA4MDIuMTFkCi0jZGVmaW5lIElFX1FCU1NfTE9BRCAgICAgICAgICAgICAgICAgICAgMTEgICAgLy8gODAyLjExZSBkOQotI2RlZmluZSBJRV9FRENBX1BBUkFNRVRFUiAgICAgICAgICAgICAgIDEyICAgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgSUVfVFNQRUMgICAgICAgICAgICAgICAgICAgICAgICAxMyAgICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIElFX1RDTEFTICAgICAgICAgICAgICAgICAgICAgICAgMTQgICAgLy8gODAyLjExZSBkOQotI2RlZmluZSBJRV9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIDE1ICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfQ09VTlRSWSAgICAgICAgICAgICAgICAgICAgICA3CS8qIDgwMi4xMWQgKi8KKyNkZWZpbmUgSUVfODAyXzExRF9SRVFVRVNUICAgICAgICAgICAgICAxMAkvKiA4MDIuMTFkICovCisjZGVmaW5lIElFX1FCU1NfTE9BRCAgICAgICAgICAgICAgICAgICAgMTEJLyogODAyLjExZSBkOSAqLworI2RlZmluZSBJRV9FRENBX1BBUkFNRVRFUiAgICAgICAgICAgICAgIDEyCS8qIDgwMi4xMWUgZDkgKi8KKyNkZWZpbmUgSUVfVFNQRUMgICAgICAgICAgICAgICAgICAgICAgICAxMwkvKiA4MDIuMTFlIGQ5ICovCisjZGVmaW5lIElFX1RDTEFTICAgICAgICAgICAgICAgICAgICAgICAgMTQJLyogODAyLjExZSBkOSAqLworI2RlZmluZSBJRV9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIDE1CS8qIDgwMi4xMWUgZDkgKi8KICNkZWZpbmUgSUVfQ0hBTExFTkdFX1RFWFQgICAgICAgICAgICAgICAxNgotI2RlZmluZSBJRV9QT1dFUl9DT05TVFJBSU5UICAgICAgICAgICAgIDMyICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9QT1dFUl9DQVBBQklMSVRZICAgICAgICAgICAgIDMzICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9UUENfUkVRVUVTVCAgICAgICAgICAgICAgICAgIDM0ICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9UUENfUkVQT1JUICAgICAgICAgICAgICAgICAgIDM1ICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9TVVBQX0NIQU5ORUxTICAgICAgICAgICAgICAgIDM2ICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQgIDM3ICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUICAgICAgICAgIDM4ICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQgICAgICAgICAgIDM5ICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9RVUlFVCAgICAgICAgICAgICAgICAgICAgICAgIDQwICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9JQlNTX0RGUyAgICAgICAgICAgICAgICAgICAgIDQxICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9FUlAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyICAgIC8vIDgwMi4xMWcKLSNkZWZpbmUgSUVfVFNfREVMQVkgICAgICAgICAgICAgICAgICAgICA0MyAgICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIElFX1RDTEFTX1BST0NFU1NJTkcgICAgICAgICAgICAgNDQgICAgLy8gODAyLjExZSBkOQotI2RlZmluZSBJRV9RT1NfQ0FQQUJJTElUWSAgICAgICAgICAgICAgIDQ2ICAgIC8vIDgwMi4xMWUgZDYKLSNkZWZpbmUgSUVfSFRfQ0FQICAgICAgICAgICAgICAgICAgICAgICA0NSAgICAvLyA4MDIuMTFuIGQxLiBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRAotI2RlZmluZSBJRV9BUF9DSEFOTkVMX1JFUE9SVAkJCTUxICAgIC8vIDgwMi4xMWsgZDYKLSNkZWZpbmUgSUVfSFRfQ0FQMiAgICAgICAgICAgICAgICAgICAgICAgICA1MiAgICAvLyA4MDIuMTFuIGQxLiBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRAotI2RlZmluZSBJRV9SU04gICAgICAgICAgICAgICAgICAgICAgICAgIDQ4ICAgIC8vIDgwMi4xMWkgZDMuMAotI2RlZmluZSBJRV9XUEEyICAgICAgICAgICAgICAgICAgICAgICAgIDQ4ICAgIC8vIFdQQTIKLSNkZWZpbmUgSUVfRVhUX1NVUFBfUkFURVMgICAgICAgICAgICAgICA1MCAgICAvLyA4MDIuMTFnCi0jZGVmaW5lIElFX1NVUFBfUkVHX0NMQVNTICAgICAgICAgICAgICAgNTkgICAgLy8gODAyLjExeS4gU3VwcG9ydGVkIHJlZ3VsYXRvcnkgY2xhc3Nlcy4KLSNkZWZpbmUgSUVfRVhUX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVAk2MAkvLyA4MDIuMTFuCi0jZGVmaW5lIElFX0FERF9IVCAgICAgICAgICAgICAgICAgICAgICAgICA2MSAgICAvLyA4MDIuMTFuIGQxLiBBRERJVElPTkFMIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJECi0jZGVmaW5lIElFX0FERF9IVDIgICAgICAgICAgICAgICAgICAgICAgICA1MyAgICAvLyA4MDIuMTFuIGQxLiBBRERJVElPTkFMIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJECisjZGVmaW5lIElFX1BPV0VSX0NPTlNUUkFpbnQgICAgICAgICAgICAgMzIJLyogODAyLjExaCBkMy4zICovCisjZGVmaW5lIElFX1BPV0VSX0NBUEFCSUxJVFkgICAgICAgICAgICAgMzMJLyogODAyLjExaCBkMy4zICovCisjZGVmaW5lIElFX1RQQ19SRVFVRVNUICAgICAgICAgICAgICAgICAgMzQJLyogODAyLjExaCBkMy4zICovCisjZGVmaW5lIElFX1RQQ19SRVBPUlQgICAgICAgICAgICAgICAgICAgMzUJLyogODAyLjExaCBkMy4zICovCisjZGVmaW5lIElFX1NVUFBfQ0hBTk5FTFMgICAgICAgICAgICAgICAgMzYJLyogODAyLjExaCBkMy4zICovCisjZGVmaW5lIElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVCAgMzcJLyogODAyLjExaCBkMy4zICovCisjZGVmaW5lIElFX01FQVNVUkVNRU5UX1JFUVVFU1QgICAgICAgICAgMzgJLyogODAyLjExaCBkMy4zICovCisjZGVmaW5lIElFX01FQVNVUkVNRU5UX1JFUE9SVCAgICAgICAgICAgMzkJLyogODAyLjExaCBkMy4zICovCisjZGVmaW5lIElFX1FVSUVUICAgICAgICAgICAgICAgICAgICAgICAgNDAJLyogODAyLjExaCBkMy4zICovCisjZGVmaW5lIElFX0lCU1NfREZTICAgICAgICAgICAgICAgICAgICAgNDEJLyogODAyLjExaCBkMy4zICovCisjZGVmaW5lIElFX0VSUCAgICAgICAgICAgICAgICAgICAgICAgICAgNDIJLyogODAyLjExZyAqLworI2RlZmluZSBJRV9UU19ERUxBWSAgICAgICAgICAgICAgICAgICAgIDQzCS8qIDgwMi4xMWUgZDkgKi8KKyNkZWZpbmUgSUVfVENMQVNfUFJPQ0VTU0lORyAgICAgICAgICAgICA0NAkvKiA4MDIuMTFlIGQ5ICovCisjZGVmaW5lIElFX1FPU19DQVBBQklMSVRZICAgICAgICAgICAgICAgNDYJLyogODAyLjExZSBkNiAqLworI2RlZmluZSBJRV9IVF9DQVAgICAgICAgICAgICAgICAgICAgICAgIDQ1CS8qIDgwMi4xMW4gZDEuIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJEICovCisjZGVmaW5lIElFX0FQX0NIQU5ORUxfUkVQT1JUCQkJNTEJLyogODAyLjExayBkNiAqLworI2RlZmluZSBJRV9IVF9DQVAyICAgICAgICAgICAgICAgICAgICAgICAgIDUyCS8qIDgwMi4xMW4gZDEuIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJEICovCisjZGVmaW5lIElFX1JTTiAgICAgICAgICAgICAgICAgICAgICAgICAgNDgJLyogODAyLjExaSBkMy4wICovCisjZGVmaW5lIElFX1dQQTIgICAgICAgICAgICAgICAgICAgICAgICAgNDgJLyogV1BBMiAqLworI2RlZmluZSBJRV9FWFRfU1VQUF9SQVRFUyAgICAgICAgICAgICAgIDUwCS8qIDgwMi4xMWcgKi8KKyNkZWZpbmUgSUVfU1VQUF9SRUdfQ0xBU1MgICAgICAgICAgICAgICA1OQkvKiA4MDIuMTF5LiBTdXBwb3J0ZWQgcmVndWxhdG9yeSBjbGFzc2VzLiAqLworI2RlZmluZSBJRV9FWFRfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UCTYwCS8qIDgwMi4xMW4gKi8KKyNkZWZpbmUgSUVfQUREX0hUICAgICAgICAgICAgICAgICAgICAgICAgIDYxCS8qIDgwMi4xMW4gZDEuIEFERElUSU9OQUwgSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQgKi8KKyNkZWZpbmUgSUVfQUREX0hUMiAgICAgICAgICAgICAgICAgICAgICAgIDUzCS8qIDgwMi4xMW4gZDEuIEFERElUSU9OQUwgSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQgKi8KIAorLyogRm9yIDgwMi4xMW4gRDMuMDMgKi8KKy8qI2RlZmluZSBJRV9ORVdfRVhUX0NIQV9PRkZTRVQgICAgICAgICAgICAgNjIgICAgLy8gODAyLjExbiBkMS4gTmV3IGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldCBlbGVtZXQgKi8KKyNkZWZpbmUgSUVfU0VDT05EQVJZX0NIX09GRlNFVAkJNjIJLyogODAyLjExbiBEMy4wMyAgICAgICAgU2Vjb25kYXJ5IENoYW5uZWwgT2Zmc2V0IGVsZW1lbnQgKi8KKyNkZWZpbmUgSUVfV0FQSQkJCQkJCQk2OAkvKiBXQVBJIGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KKyNkZWZpbmUgSUVfMjA0MF9CU1NfQ09FWElTVCAgICAgICAgICAgICAgIDcyCS8qIDgwMi4xMW4gRDMuMC4zICovCisjZGVmaW5lIElFXzIwNDBfQlNTX0lOVE9MRVJBTlRfUkVQT1JUICAgICA3MwkvKiA4MDIuMTFuIEQzLjAzICovCisjZGVmaW5lIElFX09WRVJMQVBCU1NfU0NBTl9QQVJNICAgICAgICAgICA3NAkvKiA4MDIuMTFuIEQzLjAzICovCisjZGVmaW5lIElFX0VYVF9DQVBBQklMSVRZICAgICAgICAgICAgICAgIDEyNwkvKiA4MDIuMTFuIEQzLjAzICovCiAKLS8vIEZvciA4MDIuMTFuIEQzLjAzCi0vLyNkZWZpbmUgSUVfTkVXX0VYVF9DSEFfT0ZGU0VUICAgICAgICAgICAgIDYyICAgIC8vIDgwMi4xMW4gZDEuIE5ldyBleHRlbnNpb24gY2hhbm5lbCBvZmZzZXQgZWxlbWV0Ci0jZGVmaW5lIElFX1NFQ09OREFSWV9DSF9PRkZTRVQJCTYyCS8vIDgwMi4xMW4gRDMuMDMJU2Vjb25kYXJ5IENoYW5uZWwgT2Zmc2V0IGVsZW1lbnQKLSNkZWZpbmUgSUVfMjA0MF9CU1NfQ09FWElTVCAgICAgICAgICAgICAgIDcyICAgIC8vIDgwMi4xMW4gRDMuMC4zCi0jZGVmaW5lIElFXzIwNDBfQlNTX0lOVE9MRVJBTlRfUkVQT1JUICAgICA3MyAgICAvLyA4MDIuMTFuIEQzLjAzCi0jZGVmaW5lIElFX09WRVJMQVBCU1NfU0NBTl9QQVJNICAgICAgICAgICA3NCAgICAvLyA4MDIuMTFuIEQzLjAzCi0jZGVmaW5lIElFX0VYVF9DQVBBQklMSVRZICAgICAgICAgICAgICAgIDEyNyAgIC8vIDgwMi4xMW4gRDMuMDMKKyNkZWZpbmUgSUVfV1BBICAgICAgICAgICAgICAgICAgICAgICAgICAyMjEJLyogV1BBICovCisjZGVmaW5lIElFX1ZFTkRPUl9TUEVDSUZJQyAgICAgICAgICAgICAgMjIxCS8qIFdpZmkgV01NIChXTUUpICovCiAKKyNkZWZpbmUgT1VJX0JST0FEQ09NX0hUICAgICAgICAgICAgICA1MQkvKiAqLworI2RlZmluZSBPVUlfQlJPQURDT01fSFRBREQgICAgICAgICAgICAgIDUyCS8qICovCisjZGVmaW5lIE9VSV9QUkVOX0hUX0NBUCAgICAgICAgICAgICAgNTEJLyogKi8KKyNkZWZpbmUgT1VJX1BSRU5fQUREX0hUICAgICAgICAgICAgICA1MgkvKiAqLwogCi0jZGVmaW5lIElFX1dQQSAgICAgICAgICAgICAgICAgICAgICAgICAgMjIxICAgLy8gV1BBCi0jZGVmaW5lIElFX1ZFTkRPUl9TUEVDSUZJQyAgICAgICAgICAgICAgMjIxICAgLy8gV2lmaSBXTU0gKFdNRSkKLQotI2RlZmluZSBPVUlfQlJPQURDT01fSFQgICAgICAgICAgICAgIDUxICAgLy8KLSNkZWZpbmUgT1VJX0JST0FEQ09NX0hUQUREICAgICAgICAgICAgICA1MiAgIC8vCi0jZGVmaW5lIE9VSV9QUkVOX0hUX0NBUCAgICAgICAgICAgICAgNTEgICAvLwotI2RlZmluZSBPVUlfUFJFTl9BRERfSFQgICAgICAgICAgICAgIDUyICAgLy8KLQotLy8gQ0NYIGluZm9ybWF0aW9uCi0jZGVmaW5lIElFX0FJUk9ORVRfQ0tJUCAgICAgICAgICAgICAgICAgMTMzICAgLy8gQ0NYMS4wIElEIDg1SCBmb3IgQ0tJUAotI2RlZmluZSBJRV9BUF9UWF9QT1dFUiAgICAgICAgICAgICAgICAgIDE1MCAgIC8vIENDWCAyLjAgZm9yIEFQIHRyYW5zbWl0IHBvd2VyCi0jZGVmaW5lIElFX01FQVNVUkVNRU5UX0NBUEFCSUxJVFkgICAgICAgMjIxICAgLy8gQ0NYIDIuMAorLyogQ0NYIGluZm9ybWF0aW9uICovCisjZGVmaW5lIElFX0FJUk9ORVRfQ0tJUCAgICAgICAgICAgICAgICAgMTMzCS8qIENDWDEuMCBJRCA4NUggZm9yIENLSVAgKi8KKyNkZWZpbmUgSUVfQVBfVFhfUE9XRVIgICAgICAgICAgICAgICAgICAxNTAJLyogQ0NYIDIuMCBmb3IgQVAgdHJhbnNtaXQgcG93ZXIgKi8KKyNkZWZpbmUgSUVfTUVBU1VSRU1FTlRfQ0FQQUJJTElUWSAgICAgICAyMjEJLyogQ0NYIDIuMCAqLwogI2RlZmluZSBJRV9DQ1hfVjIgICAgICAgICAgICAgICAgICAgICAgIDIyMQotI2RlZmluZSBJRV9BSVJPTkVUX0lQQUREUkVTUyAgICAgICAgICAgIDE0OSAgIC8vIENDWCBJRCA5NUggZm9yIElQIEFkZHJlc3MKLSNkZWZpbmUgSUVfQUlST05FVF9DQ0tNUkVBU1NPQyAgICAgICAgICAxNTYgICAvLyBDQ1ggSUQgOUNIIGZvciBDQ0tNIFJlYXNzb2NpYXRpb24gUmVxdWVzdCBlbGVtZW50CisjZGVmaW5lIElFX0FJUk9ORVRfSVBBRERSRVNTICAgICAgICAgICAgMTQ5CS8qIENDWCBJRCA5NUggZm9yIElQIEFkZHJlc3MgKi8KKyNkZWZpbmUgSUVfQUlST05FVF9DQ0tNUkVBU1NPQyAgICAgICAgICAxNTYJLyogQ0NYIElEIDlDSCBmb3IgQ0NLTSBSZWFzc29jaWF0aW9uIFJlcXVlc3QgZWxlbWVudCAqLwogI2RlZmluZSBDS0lQX05FR09USUFUSU9OX0xFTkdUSCAgICAgICAgIDMwCiAjZGVmaW5lIEFJUk9ORVRfSVBBRERSRVNTX0xFTkdUSCAgICAgICAgMTAKICNkZWZpbmUgQUlST05FVF9DQ0tNUkVBU1NPQ19MRU5HVEggICAgICAyNAogCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gTUxNRSBzdGF0ZSBtYWNoaW5lIGRlZmluaXRpb24KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogTUxNRSBzdGF0ZSBtYWNoaW5lIGRlZmluaXRpb24gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLS8vIFNUQSBNTE1FIHN0YXRlIG1haGNpbmVzCisvKiBTVEEgTUxNRSBzdGF0ZSBtYWhjaW5lcyAqLwogI2RlZmluZSBBU1NPQ19TVEFURV9NQUNISU5FICAgICAgICAgICAgIDEKICNkZWZpbmUgQVVUSF9TVEFURV9NQUNISU5FICAgICAgICAgICAgICAyCiAjZGVmaW5lIEFVVEhfUlNQX1NUQVRFX01BQ0hJTkUgICAgICAgICAgMwogI2RlZmluZSBTWU5DX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgIDQKICNkZWZpbmUgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUgICAgICAgICA1CiAjZGVmaW5lIFdQQV9QU0tfU1RBVEVfTUFDSElORSAgICAgICAgICAgNgotI2RlZmluZSBMRUFQX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgIDcKKy8qI2RlZmluZSBMRUFQX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgIDcgKi8KICNkZWZpbmUgQUlST05FVF9TVEFURV9NQUNISU5FICAgICAgICAgICA4CiAjZGVmaW5lIEFDVElPTl9TVEFURV9NQUNISU5FICAgICAgICAgICA5CiAKLS8vIEFQIE1MTUUgc3RhdGUgbWFjaGluZXMKKy8qIEFQIE1MTUUgc3RhdGUgbWFjaGluZXMgKi8KICNkZWZpbmUgQVBfQVNTT0NfU1RBVEVfTUFDSElORSAgICAgICAgICAxMQogI2RlZmluZSBBUF9BVVRIX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDEyCi0jZGVmaW5lIEFQX0FVVEhfUlNQX1NUQVRFX01BQ0hJTkUgICAgICAgMTMKICNkZWZpbmUgQVBfU1lOQ19TVEFURV9NQUNISU5FICAgICAgICAgICAxNAogI2RlZmluZSBBUF9DTlRMX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDE1Ci0jZGVmaW5lIEFQX1dQQV9TVEFURV9NQUNISU5FICAgICAgICAgICAgMTYKKyNkZWZpbmUgV1NDX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAxNworI2RlZmluZSBXU0NfVVBOUF9TVEFURV9NQUNISU5FCQkgICAgMTgKIAotLy8KLS8vIFNUQSdzIENPTlRST0wvQ09OTkVDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KKyNkZWZpbmUgV1BBX1NUQVRFX01BQ0hJTkUJCQkyMworCisvKiAqLworLyogU1RBJ3MgQ09OVFJPTC9DT05ORUNUIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjICovCisvKiAqLwogI2RlZmluZSBDTlRMX0lETEUgICAgICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgQ05UTF9XQUlUX0RJU0FTU09DICAgICAgICAgICAgICAxCiAjZGVmaW5lIENOVExfV0FJVF9KT0lOICAgICAgICAgICAgICAgICAgMgpAQCAtNjMwLDkgKzYyNCw5IEBACiAjZGVmaW5lIENOVExfV0FJVF9BVVRIMiAgICAgICAgICAgICAgICAgNwogI2RlZmluZSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTiAgICAgICAgIDgKICNkZWZpbmUgQ05UTF9XQUlUX09JRF9ESVNBU1NPQyAgICAgICAgICA5Ci0jaWZkZWYgUlQyODcwCisjaWZkZWYgUlRNUF9NQUNfVVNCCiAjZGVmaW5lIENOVExfV0FJVF9TQ0FOX0ZPUl9DT05ORUNUICAgICAgMTAKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAogI2RlZmluZSBNVDJfQVNTT0NfQ09ORiAgICAgICAgICAgICAgICAgIDM0CiAjZGVmaW5lIE1UMl9BVVRIX0NPTkYgICAgICAgICAgICAgICAgICAgMzUKQEAgLTY0NiwxMyArNjQwLDE0IEBACiAjZGVmaW5lIE1UMl9HRVRfQ09ORiAgICAgICAgICAgICAgICAgICAgNDMKICNkZWZpbmUgTVQyX1NFVF9DT05GICAgICAgICAgICAgICAgICAgICA0NAogI2RlZmluZSBNVDJfUkVTRVRfQ09ORiAgICAgICAgICAgICAgICAgIDQ1CisjZGVmaW5lIE1UMl9GVF9PVERfQ09ORgkJCQkJNDYKICNkZWZpbmUgTVQyX01MTUVfUk9BTUlOR19SRVEgICAgICAgICAgICA1MgogCiAjZGVmaW5lIENOVExfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAgMQogCi0vLwotLy8gU1RBJ3MgQVNTT0Mgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCisvKiAqLworLyogU1RBJ3MgQVNTT0Mgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMgKi8KKy8qICovCiAjZGVmaW5lIEFTU09DX0lETEUgICAgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBBU1NPQ19XQUlUX1JTUCAgICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgUkVBU1NPQ19XQUlUX1JTUCAgICAgICAgICAgICAgICAyCkBAIC02NzUsMjQgKzY3MCwyNiBAQAogCiAjZGVmaW5lIEFTU09DX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgKE1BWF9BU1NPQ19TVEFURSAqIE1BWF9BU1NPQ19NU0cpCiAKLS8vCi0vLyBBQ1Qgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCisvKiAqLworLyogQUNUIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjICovCisvKiAqLwogI2RlZmluZSBBQ1RfSURMRSAgICAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIE1BWF9BQ1RfU1RBVEUgICAgICAgICAgICAgICAgIDEKIAogI2RlZmluZSBBQ1RfTUFDSElORV9CQVNFICAgICAgICAgICAgICAwCiAKLS8vVGhvc2UgUEVFUl94eF9DQVRFIG51bWJlciBpcyBiYXNlZCBvbiByZWFsIENhdGVnYXJ5IHZhbHVlIGluIElFRUUgc3BlYy4gUGxlYXNlIGRvbidlcyBtb2RpZnkgaXQgYnkgeW91ciBzZWxmLgotLy9DYXRlZ29yeQorLypUaG9zZSBQRUVSX3h4X0NBVEUgbnVtYmVyIGlzIGJhc2VkIG9uIHJlYWwgQ2F0ZWdhcnkgdmFsdWUgaW4gSUVFRSBzcGVjLiBQbGVhc2UgZG9uJ2VzIG1vZGlmeSBpdCBieSB5b3VyIHNlbGYuICovCisvKkNhdGVnb3J5ICovCiAjZGVmaW5lIE1UMl9QRUVSX1NQRUNUUlVNX0NBVEUgICAgICAgICAgICAgIDAKICNkZWZpbmUgTVQyX1BFRVJfUU9TX0NBVEUgICAgICAgICAgICAgIDEKICNkZWZpbmUgTVQyX1BFRVJfRExTX0NBVEUgICAgICAgICAgICAgMgogI2RlZmluZSBNVDJfUEVFUl9CQV9DQVRFICAgICAgICAgICAgIDMKICNkZWZpbmUgTVQyX1BFRVJfUFVCTElDX0NBVEUgICAgICAgICAgICAgNAogI2RlZmluZSBNVDJfUEVFUl9STV9DQVRFICAgICAgICAgICAgIDUKLSNkZWZpbmUgTVQyX1BFRVJfSFRfQ0FURSAgICAgICAgICAgICA3CS8vCTcuNC43CisvKiAiRlRfQ0FURUdPUllfQlNTX1RSQU5TSVRJT04gZXF1YWwgdG8gNiIgaXMgZGVmaW5lZCBmaWxlIG9mICJkb3QxMXJfZnQuaCIgKi8KKyNkZWZpbmUgTVQyX1BFRVJfSFRfQ0FURSAgICAgICAgICAgICA3CS8qICAgICAgNy40LjcgKi8KICNkZWZpbmUgTUFYX1BFRVJfQ0FURV9NU0cgICAgICAgICAgICAgICAgICAgNworCiAjZGVmaW5lIE1UMl9NTE1FX0FERF9CQV9DQVRFICAgICAgICAgICAgIDgKICNkZWZpbmUgTVQyX01MTUVfT1JJX0RFTEJBX0NBVEUgICAgICAgICAgICAgOQogI2RlZmluZSBNVDJfTUxNRV9SRUNfREVMQkFfQ0FURSAgICAgICAgICAgICAxMApAQCAtNzAxLDcgKzY5OCw3IEBACiAjZGVmaW5lIE1UMl9BQ1RfSU5WQUxJRCAgICAgICAgICAgICAxMwogI2RlZmluZSBNQVhfQUNUX01TRyAgICAgICAgICAgICAgICAgICAxNAogCi0vL0NhdGVnb3J5IGZpZWxkCisvKkNhdGVnb3J5IGZpZWxkICovCiAjZGVmaW5lIENBVEVHT1JZX1NQRUNUUlVNCQkwCiAjZGVmaW5lIENBVEVHT1JZX1FPUwkJCTEKICNkZWZpbmUgQ0FURUdPUllfRExTCQkJMgpAQCAtNzEwLDM4ICs3MDcsMzUgQEAKICNkZWZpbmUgQ0FURUdPUllfUk0JCQk1CiAjZGVmaW5lIENBVEVHT1JZX0hUCQkJNwogCi0KLS8vIERMUyBBY3Rpb24gZnJhbWUgZGVmaW5pdGlvbgorLyogRExTIEFjdGlvbiBmcmFtZSBkZWZpbml0aW9uICovCiAjZGVmaW5lIEFDVElPTl9ETFNfUkVRVUVTVAkJCTAKICNkZWZpbmUgQUNUSU9OX0RMU19SRVNQT05TRQkJCTEKICNkZWZpbmUgQUNUSU9OX0RMU19URUFSRE9XTgkJCTIKIAotLy9TcGVjdHJ1bSAgQWN0aW9uIGZpZWxkIHZhbHVlIDgwMi4xMWggNy40LjEKLSNkZWZpbmUgU1BFQ19NUlEJMAkvLyBSZXF1ZXN0Ci0jZGVmaW5lIFNQRUNfTVJQCTEJLy9SZXBvcnQKKy8qU3BlY3RydW0gIEFjdGlvbiBmaWVsZCB2YWx1ZSA4MDIuMTFoIDcuNC4xICovCisjZGVmaW5lIFNQRUNfTVJRCTAJLyogUmVxdWVzdCAqLworI2RlZmluZSBTUEVDX01SUAkxCS8qUmVwb3J0ICovCiAjZGVmaW5lIFNQRUNfVFBDUlEJMgogI2RlZmluZSBTUEVDX1RQQ1JQCTMKICNkZWZpbmUgU1BFQ19DSEFOTkVMX1NXSVRDSAk0CiAKLQotLy9CQSAgQWN0aW9uIGZpZWxkIHZhbHVlCisvKkJBICBBY3Rpb24gZmllbGQgdmFsdWUgKi8KICNkZWZpbmUgQUREQkFfUkVRCTAKICNkZWZpbmUgQUREQkFfUkVTUAkxCiAjZGVmaW5lIERFTEJBICAgMgogCi0vL1B1YmxpYydzICBBY3Rpb24gZmllbGQgdmFsdWUgaW4gUHVibGljIENhdGVnb3J5LiAgU29tZSBpbiA4MDIuMTF5IGFuZCBzb21lIGluIDExbgotI2RlZmluZSBBQ1RJT05fQlNTXzIwNDBfQ09FWElTVAkJCQkwCS8vIDExbgotI2RlZmluZSBBQ1RJT05fRFNFX0VOQUJMRU1FTlQJCQkJCTEJLy8gMTF5IEQ5LjAKLSNkZWZpbmUgQUNUSU9OX0RTRV9ERUVOQUJMRU1FTlQJCQkJMgkvLyAxMXkgRDkuMAotI2RlZmluZSBBQ1RJT05fRFNFX1JFR19MT0NBVElPTl9BTk5PVU5DRQkzCS8vIDExeSBEOS4wCi0jZGVmaW5lIEFDVElPTl9FWFRfQ0hfU1dJVENIX0FOTk9VTkNFCQk0CS8vIDExeSBEOS4wCi0jZGVmaW5lIEFDVElPTl9EU0VfTUVBU1VSRU1FTlRfUkVRCQkJNQkvLyAxMXkgRDkuMAotI2RlZmluZSBBQ1RJT05fRFNFX01FQVNVUkVNRU5UX1JFUE9SVAkJNgkvLyAxMXkgRDkuMAotI2RlZmluZSBBQ1RJT05fTUVBU1VSRU1FTlRfUElMT1RfQUNUSU9OCQk3ICAJLy8gMTF5IEQ5LjAKLSNkZWZpbmUgQUNUSU9OX0RTRV9QT1dFUl9DT05TVFJBSU5UCQkJOAkvLyAxMXkgRDkuMAorLypQdWJsaWMncyAgQWN0aW9uIGZpZWxkIHZhbHVlIGluIFB1YmxpYyBDYXRlZ29yeS4gIFNvbWUgaW4gODAyLjExeSBhbmQgc29tZSBpbiAxMW4gKi8KKyNkZWZpbmUgQUNUSU9OX0JTU18yMDQwX0NPRVhJU1QJCQkJMAkvKiAxMW4gKi8KKyNkZWZpbmUgQUNUSU9OX0RTRV9FTkFCTEVNRU5UCQkJCQkxCS8qIDExeSBEOS4wICovCisjZGVmaW5lIEFDVElPTl9EU0VfREVFTkFCTEVNRU5UCQkJCTIJLyogMTF5IEQ5LjAgKi8KKyNkZWZpbmUgQUNUSU9OX0RTRV9SRUdfTE9DQVRJT05fQU5OT1VOQ0UJMwkvKiAxMXkgRDkuMCAqLworI2RlZmluZSBBQ1RJT05fRVhUX0NIX1NXSVRDSF9BTk5PVU5DRQkJNAkvKiAxMXkgRDkuMCAqLworI2RlZmluZSBBQ1RJT05fRFNFX01FQVNVUkVNRU5UX1JFUQkJCTUJLyogMTF5IEQ5LjAgKi8KKyNkZWZpbmUgQUNUSU9OX0RTRV9NRUFTVVJFTUVOVF9SRVBPUlQJCTYJLyogMTF5IEQ5LjAgKi8KKyNkZWZpbmUgQUNUSU9OX01FQVNVUkVNRU5UX1BJTE9UX0FDVElPTgkJNwkvKiAxMXkgRDkuMCAqLworI2RlZmluZSBBQ1RJT05fRFNFX1BPV0VSX0NPTlNUUkFJTlQJCQk4CS8qIDExeSBEOS4wICovCiAKLQotLy9IVCAgQWN0aW9uIGZpZWxkIHZhbHVlCisvKkhUICBBY3Rpb24gZmllbGQgdmFsdWUgKi8KICNkZWZpbmUgTk9USUZZX0JXX0FDVElPTgkJCQkwCiAjZGVmaW5lIFNNUFNfQUNUSU9OCQkJCQkJMQogI2RlZmluZSBQU01QX0FDVElPTiAgIAkJCQkJMgpAQCAtNzUzLDkgKzc0Nyw5IEBACiAjZGVmaW5lIEhUX0lORk9fRVhDSEFOR0UJCQkJOAogCiAjZGVmaW5lIEFDVF9GVU5DX1NJWkUgICAgICAgICAgICAgICAgIChNQVhfQUNUX1NUQVRFICogTUFYX0FDVF9NU0cpCi0vLwotLy8gU1RBJ3MgQVVUSEVOVElDQVRJT04gc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldnZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLworLyogKi8KKy8qIFNUQSdzIEFVVEhFTlRJQ0FUSU9OIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZ2ZW50cywgdG90YWwgZnVuY3Rpb24gIyAqLworLyogKi8KICNkZWZpbmUgQVVUSF9SRVFfSURMRSAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIEFVVEhfV0FJVF9TRVEyICAgICAgICAgICAgICAgICAgMQogI2RlZmluZSBBVVRIX1dBSVRfU0VRNCAgICAgICAgICAgICAgICAgIDIKQEAgLTc2OSw5ICs3NjMsOSBAQAogCiAjZGVmaW5lIEFVVEhfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAgKE1BWF9BVVRIX1NUQVRFICogTUFYX0FVVEhfTVNHKQogCi0vLwotLy8gU1RBJ3MgQVVUSF9SU1Agc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCisvKiAqLworLyogU1RBJ3MgQVVUSF9SU1Agc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMgKi8KKy8qICovCiAjZGVmaW5lIEFVVEhfUlNQX0lETEUgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBBVVRIX1JTUF9XQUlUX0NIQUwgICAgICAgICAgICAgIDEKICNkZWZpbmUgTUFYX0FVVEhfUlNQX1NUQVRFICAgICAgICAgICAgICAyCkBAIC03ODQsMTAgKzc3OCwxMCBAQAogCiAjZGVmaW5lIEFVVEhfUlNQX0ZVTkNfU0laRSAgICAgICAgICAgICAgKE1BWF9BVVRIX1JTUF9TVEFURSAqIE1BWF9BVVRIX1JTUF9NU0cpCiAKLS8vCi0vLyBTVEEncyBTWU5DIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLwotI2RlZmluZSBTWU5DX0lETEUgICAgICAgICAgICAgICAgICAgICAgIDAgIC8vIG1lcmdlIE5PX0JTUyxJQlNTX0lETEUsSUJTU19BQ1RJVkUgYW5kIEJTUyBpbiB0byAxIHN0YXRlCisvKiAqLworLyogU1RBJ3MgU1lOQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIyAqLworLyogKi8KKyNkZWZpbmUgU1lOQ19JRExFICAgICAgICAgICAgICAgICAgICAgICAwCS8qIG1lcmdlIE5PX0JTUyxJQlNTX0lETEUsSUJTU19BQ1RJVkUgYW5kIEJTUyBpbiB0byAxIHN0YXRlICovCiAjZGVmaW5lIEpPSU5fV0FJVF9CRUFDT04gICAgICAgICAgICAgICAgMQogI2RlZmluZSBTQ0FOX0xJU1RFTiAgICAgICAgICAgICAgICAgICAgIDIKICNkZWZpbmUgTUFYX1NZTkNfU1RBVEUgICAgICAgICAgICAgICAgICAzCkBAIC04MDcsNyArODAxLDcgQEAKIAogI2RlZmluZSBTWU5DX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgIChNQVhfU1lOQ19TVEFURSAqIE1BWF9TWU5DX01TRykKIAotLy9NZXNzYWdlcyBmb3IgdGhlIERMUyBzdGF0ZSBtYWNoaW5lCisvKk1lc3NhZ2VzIGZvciB0aGUgRExTIHN0YXRlIG1hY2hpbmUgKi8KICNkZWZpbmUgRExTX0lETEUJCQkJCQkwCiAjZGVmaW5lIE1BWF9ETFNfU1RBVEUJCQkJCTEKIApAQCAtODIxLDQ1ICs4MTUsMTggQEAKIAogI2RlZmluZSBETFNfRlVOQ19TSVpFCQkJCQkoTUFYX0RMU19TVEFURSAqIE1BWF9ETFNfTVNHKQogCi0vLwotLy8gU1RBJ3MgV1BBLVBTSyBTdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KLSNkZWZpbmUgV1BBX1BTS19JRExFCQkJCQkwCi0jZGVmaW5lIE1BWF9XUEFfUFNLX1NUQVRFCQkJCTEKKy8qICovCisvKiBXU0MgU3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMgKi8KKy8qICovCiAKLSNkZWZpbmUgV1BBX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE1UMl9FQVBQYWNrZXQgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBNVDJfRUFQT0xTdGFydCAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgTVQyX0VBUE9MTG9nb2ZmICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIE1UMl9FQVBPTEtleSAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBNVDJfRUFQT0xBU0ZBbGVydCAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgTUFYX1dQQV9QU0tfTVNHICAgICAgICAgICAgICAgICA1Ci0KLSNkZWZpbmUJV1BBX1BTS19GVU5DX1NJWkUJCQkJKE1BWF9XUEFfUFNLX1NUQVRFICogTUFYX1dQQV9QU0tfTVNHKQotCi0vLwotLy8gU1RBJ3MgQ0lTQ08tQUlST05FVCBTdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KLSNkZWZpbmUgQUlST05FVF9JRExFCQkJCQkwCi0jZGVmaW5lCUFJUk9ORVRfU0NBTk5JTkcJCQkJMQotI2RlZmluZSBNQVhfQUlST05FVF9TVEFURQkJCQkyCi0KLSNkZWZpbmUgQUlST05FVF9NQUNISU5FX0JBU0UJCSAgICAwCi0jZGVmaW5lIE1UMl9BSVJPTkVUX01TRwkJCQkgICAgMAotI2RlZmluZSBNVDJfQUlST05FVF9TQ0FOX1JFUQkJICAgIDEKLSNkZWZpbmUgTVQyX0FJUk9ORVRfU0NBTl9ET05FCQkgICAgMgotI2RlZmluZSBNQVhfQUlST05FVF9NU0cJCQkJICAgIDMKLQotI2RlZmluZQlBSVJPTkVUX0ZVTkNfU0laRQkJCQkoTUFYX0FJUk9ORVRfU1RBVEUgKiBNQVhfQUlST05FVF9NU0cpCi0KLS8vCi0vLyBBUCdzIENPTlRST0wvQ09OTkVDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KKy8qICovCisvKiBBUCdzIENPTlRST0wvQ09OTkVDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIyAqLworLyogKi8KICNkZWZpbmUgQVBfQ05UTF9GVU5DX1NJWkUgICAgICAgICAgICAgICAxCiAKLS8vCi0vLyBBUCdzIEFTU09DIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLworLyogKi8KKy8qIEFQJ3MgQVNTT0Mgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMgKi8KKy8qICovCiAjZGVmaW5lIEFQX0FTU09DX0lETEUgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBBUF9NQVhfQVNTT0NfU1RBVEUgICAgICAgICAgICAgIDEKIApAQCAtODczLDM2ICs4NDAsMjUgQEAKIAogI2RlZmluZSBBUF9BU1NPQ19GVU5DX1NJWkUgICAgICAgICAgICAgIChBUF9NQVhfQVNTT0NfU1RBVEUgKiBBUF9NQVhfQVNTT0NfTVNHKQogCi0vLwotLy8gQVAncyBBVVRIRU5USUNBVElPTiBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KKy8qICovCisvKiBBUCdzIEFVVEhFTlRJQ0FUSU9OIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjICovCisvKiAqLwogI2RlZmluZSBBUF9BVVRIX1JFUV9JRExFICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgQVBfTUFYX0FVVEhfU1RBVEUgICAgICAgICAgICAgICAxCiAKICNkZWZpbmUgQVBfQVVUSF9NQUNISU5FX0JBU0UgICAgICAgICAgICAwCiAjZGVmaW5lIEFQTVQyX01MTUVfREVBVVRIX1JFUSAgICAgICAgICAgMAogI2RlZmluZSBBUE1UMl9DTFMyRVJSICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQVBfTUFYX0FVVEhfTVNHICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFQTVQyX1BFRVJfREVBVVRIICAgICAgICAgICAgICAgMgorI2RlZmluZSBBUE1UMl9QRUVSX0FVVEhfUkVRCQkJCTMKKyNkZWZpbmUgQVBNVDJfUEVFUl9BVVRIX0NPTkZJUk0JCQk0CisjZGVmaW5lIEFQX01BWF9BVVRIX01TRyAgICAgICAgICAgICAgICAgNQogCiAjZGVmaW5lIEFQX0FVVEhfRlVOQ19TSVpFICAgICAgICAgICAgICAgKEFQX01BWF9BVVRIX1NUQVRFICogQVBfTUFYX0FVVEhfTVNHKQogCi0vLwotLy8gQVAncyBBVVRILVJTUCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KLSNkZWZpbmUgQVBfQVVUSF9SU1BfSURMRSAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEFQX01BWF9BVVRIX1JTUF9TVEFURSAgICAgICAgICAgMQotCi0jZGVmaW5lIEFQX0FVVEhfUlNQX01BQ0hJTkVfQkFTRSAgICAgICAgMAotI2RlZmluZSBBUE1UMl9BVVRIX0NIQUxMRU5HRV9USU1FT1VUICAgIDAKLSNkZWZpbmUgQVBNVDJfUEVFUl9BVVRIX09ERCAgICAgICAgICAgICAxCi0jZGVmaW5lIEFQTVQyX1BFRVJfREVBVVRIICAgICAgICAgICAgICAgMgotI2RlZmluZSBBUF9NQVhfQVVUSF9SU1BfTVNHICAgICAgICAgICAgIDMKLQotI2RlZmluZSBBUF9BVVRIX1JTUF9GVU5DX1NJWkUgICAgICAgICAgIChBUF9NQVhfQVVUSF9SU1BfU1RBVEUgKiBBUF9NQVhfQVVUSF9SU1BfTVNHKQotCi0vLwotLy8gQVAncyBTWU5DIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLworLyogKi8KKy8qIEFQJ3MgU1lOQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIyAqLworLyogKi8KICNkZWZpbmUgQVBfU1lOQ19JRExFICAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIEFQX1NDQU5fTElTVEVOCQkJCQkxCiAjZGVmaW5lIEFQX01BWF9TWU5DX1NUQVRFICAgICAgICAgICAgICAgMgpAQCAtOTE4LDMwICs4NzQsMzAgQEAKIAogI2RlZmluZSBBUF9TWU5DX0ZVTkNfU0laRSAgICAgICAgICAgICAgIChBUF9NQVhfU1lOQ19TVEFURSAqIEFQX01BWF9TWU5DX01TRykKIAotLy8KLS8vIEFQJ3MgV1BBIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLwotI2RlZmluZSBBUF9XUEFfUFRLICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQVBfTUFYX1dQQV9QVEtfU1RBVEUgICAgICAgICAgICAxCisvKiAqLworLyogQ29tbW9uIFdQQSBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIyAqLworLyogKi8KKyNkZWZpbmUgV1BBX1BUSyAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1BWF9XUEFfUFRLX1NUQVRFICAgICAgICAgICAgMQogCi0jZGVmaW5lIEFQX1dQQV9NQUNISU5FX0JBU0UgICAgICAgICAgICAgMAotI2RlZmluZSBBUE1UMl9FQVBQYWNrZXQgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQVBNVDJfRUFQT0xTdGFydCAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFQTVQyX0VBUE9MTG9nb2ZmICAgICAgICAgICAgICAgMgotI2RlZmluZSBBUE1UMl9FQVBPTEtleSAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgQVBNVDJfRUFQT0xBU0ZBbGVydCAgICAgICAgICAgICA0Ci0jZGVmaW5lIEFQX01BWF9XUEFfTVNHICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBXUEFfTUFDSElORV9CQVNFICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX0VBUFBhY2tldCAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9FQVBPTFN0YXJ0ICAgICAgICAgICAgICAgMQorI2RlZmluZSBNVDJfRUFQT0xMb2dvZmYgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTVQyX0VBUE9MS2V5ICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIE1UMl9FQVBPTEFTRkFsZXJ0ICAgICAgICAgICAgNAorI2RlZmluZSBNQVhfV1BBX01TRyAgICAgICAgICAgICAgICAgIDUKIAotI2RlZmluZSBBUF9XUEFfRlVOQ19TSVpFICAgICAgICAgICAgICAgIChBUF9NQVhfV1BBX1BUS19TVEFURSAqIEFQX01BWF9XUEFfTVNHKQorI2RlZmluZSBXUEFfRlVOQ19TSVpFICAgICAgICAgICAgICAgIChNQVhfV1BBX1BUS19TVEFURSAqIE1BWF9XUEFfTVNHKQogCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotLy8gdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBoZWFkZXIgRkMuVHl0ZSwgd2hpY2ggaXMgYjMuLmIyIG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyCisvKiB2YWx1ZSBkb21haW4gb2YgODAyLjExIGhlYWRlciBGQy5UeXRlLCB3aGljaCBpcyBiMy4uYjIgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIgKi8KICNkZWZpbmUgQlRZUEVfTUdNVCAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgQlRZUEVfQ05UTCAgICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgQlRZUEVfREFUQSAgICAgICAgICAgICAgICAgIDIKIAotLy8gdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBNR01UIGZyYW1lJ3MgRkMuc3VidHlwZSwgd2hpY2ggaXMgYjcuLjQgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIKKy8qIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgTUdNVCBmcmFtZSdzIEZDLnN1YnR5cGUsIHdoaWNoIGlzIGI3Li40IG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyICovCiAjZGVmaW5lIFNVQlRZUEVfQVNTT0NfUkVRICAgICAgICAgICAwCiAjZGVmaW5lIFNVQlRZUEVfQVNTT0NfUlNQICAgICAgICAgICAxCiAjZGVmaW5lIFNVQlRZUEVfUkVBU1NPQ19SRVEgICAgICAgICAyCkBAIC05NTYsNyArOTEyLDcgQEAKICNkZWZpbmUgU1VCVFlQRV9BQ1RJT04gICAgICAgICAgICAgIDEzCiAjZGVmaW5lIFNVQlRZUEVfQUNUSU9OX05PX0FDSyAgICAgICAgICAgICAgMTQKIAotLy8gdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBDTlRMIGZyYW1lJ3MgRkMuc3VidHlwZSwgd2hpY2ggaXMgYjcuLjQgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIKKy8qIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgQ05UTCBmcmFtZSdzIEZDLnN1YnR5cGUsIHdoaWNoIGlzIGI3Li40IG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyICovCiAjZGVmaW5lIFNVQlRZUEVfV1JBUFBFUiAgICAgICAJNwogI2RlZmluZSBTVUJUWVBFX0JMT0NLX0FDS19SRVEgICAgICAgOAogI2RlZmluZSBTVUJUWVBFX0JMT0NLX0FDSyAgICAgICAgICAgOQpAQCAtOTY3LDcgKzkyMyw3IEBACiAjZGVmaW5lIFNVQlRZUEVfQ0ZFTkQgICAgICAgICAgICAgICAxNAogI2RlZmluZSBTVUJUWVBFX0NGRU5EX0NGQUNLICAgICAgICAgMTUKIAotLy8gdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBEQVRBIGZyYW1lJ3MgRkMuc3VidHlwZSwgd2hpY2ggaXMgYjcuLjQgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIKKy8qIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgREFUQSBmcmFtZSdzIEZDLnN1YnR5cGUsIHdoaWNoIGlzIGI3Li40IG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyICovCiAjZGVmaW5lIFNVQlRZUEVfREFUQSAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIFNVQlRZUEVfREFUQV9DRkFDSyAgICAgICAgICAxCiAjZGVmaW5lIFNVQlRZUEVfREFUQV9DRlBPTEwgICAgICAgICAyCkBAIC05ODUsMTUgKzk0MSwxNSBAQAogI2RlZmluZSBTVUJUWVBFX1FPU19DRlBPTEwgICAgICAgICAgMTQKICNkZWZpbmUgU1VCVFlQRV9RT1NfQ0ZBQ0tfQ0ZQT0xMICAgIDE1CiAKLS8vIEFDSyBwb2xpY3kgb2YgUU9TIENvbnRyb2wgZmllbGQgYml0IDY6NQotI2RlZmluZSBOT1JNQUxfQUNLICAgICAgICAgICAgICAgICAgMHgwMCAgLy8gYjY6NSA9IDAwCi0jZGVmaW5lIE5PX0FDSyAgICAgICAgICAgICAgICAgICAgICAweDIwICAvLyBiNjo1ID0gMDEKLSNkZWZpbmUgTk9fRVhQTElDSVRfQUNLICAgICAgICAgICAgIDB4NDAgIC8vIGI2OjUgPSAxMAotI2RlZmluZSBCTE9DS19BQ0sgICAgICAgICAgICAgICAgICAgMHg2MCAgLy8gYjY6NSA9IDExCisvKiBBQ0sgcG9saWN5IG9mIFFPUyBDb250cm9sIGZpZWxkIGJpdCA2OjUgKi8KKyNkZWZpbmUgTk9STUFMX0FDSyAgICAgICAgICAgICAgICAgIDB4MDAJLyogYjY6NSA9IDAwICovCisjZGVmaW5lIE5PX0FDSyAgICAgICAgICAgICAgICAgICAgICAweDIwCS8qIGI2OjUgPSAwMSAqLworI2RlZmluZSBOT19FWFBMSUNJVF9BQ0sgICAgICAgICAgICAgMHg0MAkvKiBiNjo1ID0gMTAgKi8KKyNkZWZpbmUgQkxPQ0tfQUNLICAgICAgICAgICAgICAgICAgIDB4NjAJLyogYjY6NSA9IDExICovCiAKLS8vCi0vLyBydG1wX2RhdGEuYyB1c2UgdGhlc2UgZGVmaW5pdGlvbgotLy8KKy8qICovCisvKiBydG1wX2RhdGEuYyB1c2UgdGhlc2UgZGVmaW5pdGlvbiAqLworLyogKi8KICNkZWZpbmUgTEVOR1RIXzgwMl8xMSAgICAgICAgICAgICAgIDI0CiAjZGVmaW5lIExFTkdUSF84MDJfMTFfQU5EX0ggICAgICAgICAzMAogI2RlZmluZSBMRU5HVEhfODAyXzExX0NSQ19IICAgICAgICAgMzQKQEAgLTEwMDcsNDIgKzk2Myw0MiBAQAogI2RlZmluZSBMRU5HVEhfQ1JDICAgICAgICAgICAgICAgICAgNAogI2RlZmluZSBNQVhfU0VRX05VTUJFUiAgICAgICAgICAgICAgMHgwZmZmCiAjZGVmaW5lIExFTkdUSF84MDJfM19OT19UWVBFCQkxMgotI2RlZmluZSBMRU5HVEhfODAyXzFRCQkJCTQgLyogVkxBTiByZWxhdGVkICovCisjZGVmaW5lIExFTkdUSF84MDJfMVEJCQkJNAkvKiBWTEFOIHJlbGF0ZWQgKi8KIAotLy8gU1RBX0NTUjQuZmllbGQuVHhSZXN1bHQKKy8qIFNUQV9DU1I0LmZpZWxkLlR4UmVzdWx0ICovCiAjZGVmaW5lIFRYX1JFU1VMVF9TVUNDRVNTICAgICAgICAgICAwCiAjZGVmaW5lIFRYX1JFU1VMVF9aRVJPX0xFTkdUSCAgICAgICAxCiAjZGVmaW5lIFRYX1JFU1VMVF9VTkRFUl9SVU4gICAgICAgICAyCiAjZGVmaW5lIFRYX1JFU1VMVF9PSFlfRVJST1IgICAgICAgICA0CiAjZGVmaW5lIFRYX1JFU1VMVF9SRVRSWV9GQUlMICAgICAgICA2CiAKLS8vIEFsbCBQSFkgcmF0ZSBzdW1tYXJ5IGluIFRYRAotLy8gUHJlYW1ibGUgTU9ERSBpbiBUeEQKKy8qIEFsbCBQSFkgcmF0ZSBzdW1tYXJ5IGluIFRYRCAqLworLyogUHJlYW1ibGUgTU9ERSBpbiBUeEQgKi8KICNkZWZpbmUgTU9ERV9DQ0sJMAogI2RlZmluZSBNT0RFX09GRE0gICAxCiAjZGVmaW5lIE1PREVfSFRNSVgJMgogI2RlZmluZSBNT0RFX0hUR1JFRU5GSUVMRAkzCiAKLS8vIE1DUyBmb3IgQ0NLLiAgQlcuU0dJLlNUQkMgYXJlIHJlc2VydmVkCi0jZGVmaW5lIE1DU19MT05HUF9SQVRFXzEgICAgICAgICAgICAgICAgICAgICAgMAkgLy8gbG9uZyBwcmVhbWJsZSBDQ0sgMU1icHMKLSNkZWZpbmUgTUNTX0xPTkdQX1JBVEVfMiAgICAgICAgICAgICAgICAgICAgICAxCS8vIGxvbmcgcHJlYW1ibGUgQ0NLIDFNYnBzCi0jZGVmaW5lIE1DU19MT05HUF9SQVRFXzVfNSAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBNQ1NfTE9OR1BfUkFURV8xMSAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzEgICAgICAgICAgICAgICAgICAgICAgNAkgLy8gbG9uZyBwcmVhbWJsZSBDQ0sgMU1icHMuIHNob3J0IGlzIGZvcmJpZGRlbiBpbiAxTWJwcwotI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfMiAgICAgICAgICAgICAgICAgICAgICA1CS8vIHNob3J0IHByZWFtYmxlIENDSyAyTWJwcworLyogTUNTIGZvciBDQ0suICBCVy5TR0kuU1RCQyBhcmUgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUNTX2xvbmdQX1JBVEVfMSAgICAgICAgICAgICAgICAgICAgICAwCS8qIGxvbmcgcHJlYW1ibGUgQ0NLIDFNYnBzICovCisjZGVmaW5lIE1DU19sb25nUF9SQVRFXzIgICAgICAgICAgICAgICAgICAgICAgMQkvKiBsb25nIHByZWFtYmxlIENDSyAxTWJwcyAqLworI2RlZmluZSBNQ1NfbG9uZ1BfUkFURV81XzUgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUNTX2xvbmdQX1JBVEVfMTEgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIE1DU19TSE9SVFBfUkFURV8xICAgICAgICAgICAgICAgICAgICAgIDQJLyogbG9uZyBwcmVhbWJsZSBDQ0sgMU1icHMuIHNob3J0IGlzIGZvcmJpZGRlbiBpbiAxTWJwcyAqLworI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfMiAgICAgICAgICAgICAgICAgICAgICA1CS8qIHNob3J0IHByZWFtYmxlIENDSyAyTWJwcyAqLwogI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfNV81ICAgICAgICAgICAgICAgICAgICA2CiAjZGVmaW5lIE1DU19TSE9SVFBfUkFURV8xMSAgICAgICAgICAgICAgICAgICAgIDcKLS8vIFRvIHNlbmQgZHVwbGljYXRlIGxlZ2FjeSBPRkRNLiBzZXQgQlc9QldfNDAuICBTR0kuU1RCQyBhcmUgcmVzZXJ2ZWQKLSNkZWZpbmUgTUNTX1JBVEVfNiAgICAgICAgICAgICAgICAgICAgICAwICAgLy8gbGVnYWN5IE9GRE0KLSNkZWZpbmUgTUNTX1JBVEVfOSAgICAgICAgICAgICAgICAgICAgICAxICAgLy8gT0ZETQotI2RlZmluZSBNQ1NfUkFURV8xMiAgICAgICAgICAgICAgICAgICAgIDIgICAvLyBPRkRNCi0jZGVmaW5lIE1DU19SQVRFXzE4ICAgICAgICAgICAgICAgICAgICAgMyAgIC8vIE9GRE0KLSNkZWZpbmUgTUNTX1JBVEVfMjQgICAgICAgICAgICAgICAgICAgICA0ICAvLyBPRkRNCi0jZGVmaW5lIE1DU19SQVRFXzM2ICAgICAgICAgICAgICAgICAgICAgNSAgIC8vIE9GRE0KLSNkZWZpbmUgTUNTX1JBVEVfNDggICAgICAgICAgICAgICAgICAgICA2ICAvLyBPRkRNCi0jZGVmaW5lIE1DU19SQVRFXzU0ICAgICAgICAgICAgICAgICAgICAgNyAvLyBPRkRNCi0vLyBIVAotI2RlZmluZSBNQ1NfMAkJMAkvLyAxUworLyogVG8gc2VuZCBkdXBsaWNhdGUgbGVnYWN5IE9GRE0uIHNldCBCVz1CV180MC4gIFNHSS5TVEJDIGFyZSByZXNlcnZlZCAqLworI2RlZmluZSBNQ1NfUkFURV82ICAgICAgICAgICAgICAgICAgICAgIDAJLyogbGVnYWN5IE9GRE0gKi8KKyNkZWZpbmUgTUNTX1JBVEVfOSAgICAgICAgICAgICAgICAgICAgICAxCS8qIE9GRE0gKi8KKyNkZWZpbmUgTUNTX1JBVEVfMTIgICAgICAgICAgICAgICAgICAgICAyCS8qIE9GRE0gKi8KKyNkZWZpbmUgTUNTX1JBVEVfMTggICAgICAgICAgICAgICAgICAgICAzCS8qIE9GRE0gKi8KKyNkZWZpbmUgTUNTX1JBVEVfMjQgICAgICAgICAgICAgICAgICAgICA0CS8qIE9GRE0gKi8KKyNkZWZpbmUgTUNTX1JBVEVfMzYgICAgICAgICAgICAgICAgICAgICA1CS8qIE9GRE0gKi8KKyNkZWZpbmUgTUNTX1JBVEVfNDggICAgICAgICAgICAgICAgICAgICA2CS8qIE9GRE0gKi8KKyNkZWZpbmUgTUNTX1JBVEVfNTQgICAgICAgICAgICAgICAgICAgICA3CS8qIE9GRE0gKi8KKy8qIEhUICovCisjZGVmaW5lIE1DU18wCQkwCS8qIDFTICovCiAjZGVmaW5lIE1DU18xCQkxCiAjZGVmaW5lIE1DU18yCQkyCiAjZGVmaW5lIE1DU18zCQkzCkBAIC0xMDUwLDcgKzEwMDYsNyBAQAogI2RlZmluZSBNQ1NfNQkJNQogI2RlZmluZSBNQ1NfNgkJNgogI2RlZmluZSBNQ1NfNwkJNwotI2RlZmluZSBNQ1NfOAkJOAkvLyAyUworI2RlZmluZSBNQ1NfOAkJOAkvKiAyUyAqLwogI2RlZmluZSBNQ1NfOQkJOQogI2RlZmluZSBNQ1NfMTAJCTEwCiAjZGVmaW5lIE1DU18xMQkJMTEKQEAgLTEwNTgsNyArMTAxNCw3IEBACiAjZGVmaW5lIE1DU18xMwkJMTMKICNkZWZpbmUgTUNTXzE0CQkxNAogI2RlZmluZSBNQ1NfMTUJCTE1Ci0jZGVmaW5lIE1DU18xNgkJMTYJLy8gMyozCisjZGVmaW5lIE1DU18xNgkJMTYJLyogMyozICovCiAjZGVmaW5lIE1DU18xNwkJMTcKICNkZWZpbmUgTUNTXzE4CQkxOAogI2RlZmluZSBNQ1NfMTkJCTE5CkBAIC0xMDY5LDQ5ICsxMDI1LDQ4IEBACiAjZGVmaW5lIE1DU18zMgkJMzIKICNkZWZpbmUgTUNTX0FVVE8JCTMzCiAKLS8vIE9JRF9IVFBIWU1PREUKLS8vIE1PREUKKy8qIE9JRF9IVFBIWU1PREUgKi8KKy8qIE1PREUgKi8KICNkZWZpbmUgSFRNT0RFX01NCTAKICNkZWZpbmUgSFRNT0RFX0dGCTEKIAotLy8gRml4ZWQgVHggTU9ERSAtIEhULCBDQ0sgb3IgT0ZETQorLyogRml4ZWQgVHggTU9ERSAtIEhULCBDQ0sgb3IgT0ZETSAqLwogI2RlZmluZSBGSVhFRF9UWE1PREVfSFQJCTAKICNkZWZpbmUgRklYRURfVFhNT0RFX0NDSwkxCiAjZGVmaW5lIEZJWEVEX1RYTU9ERV9PRkRNIAkyCi0vLyBCVworLyogQlcgKi8KICNkZWZpbmUgQldfMjAJCUJBTkRfV0lEVEhfMjAKICNkZWZpbmUgQldfNDAJCUJBTkRfV0lEVEhfNDAKICNkZWZpbmUgQldfQk9USAkJQkFORF9XSURUSF9CT1RICi0jZGVmaW5lIEJXXzEwCQlCQU5EX1dJRFRIXzEwCS8vIDgwMi4xMWogaGFzIDEwTUh6LiBUaGlzIGRlZmluaXRpb24gaXMgZm9yIGludGVybmFsIHVzYWdlLiBkb2Vzbid0IGZpbGwgaW4gdGhlIElFIG9yIG90aGVyIGZpZWxkLgorI2RlZmluZSBCV18xMAkJQkFORF9XSURUSF8xMAkvKiA4MDIuMTFqIGhhcyAxME1Iei4gVGhpcyBkZWZpbml0aW9uIGlzIGZvciBpbnRlcm5hbCB1c2FnZS4gZG9lc24ndCBmaWxsIGluIHRoZSBJRSBvciBvdGhlciBmaWVsZC4gKi8KIAotLy8gU0hPUlRHSQotI2RlZmluZSBHSV80MDAJCUdBUF9JTlRFUlZBTF80MDAJLy8gb25seSBzdXBwb3J0IGluIEhUIG1vZGUKKy8qIFNIT1JUR0kgKi8KKyNkZWZpbmUgR0lfNDAwCQlHQVBfSU5URVJWQUxfNDAwCS8qIG9ubHkgc3VwcG9ydCBpbiBIVCBtb2RlICovCiAjZGVmaW5lIEdJX0JPVEgJCUdBUF9JTlRFUlZBTF9CT1RICiAjZGVmaW5lIEdJXzgwMAkJR0FQX0lOVEVSVkFMXzgwMAotLy8gU1RCQworLyogU1RCQyAqLwogI2RlZmluZSBTVEJDX05PTkUJMAotI2RlZmluZSBTVEJDX1VTRQkxCS8vIGxpbWl0ZWQgdXNlIGluIHJ0Mjg2MGIgcGh5Ci0jZGVmaW5lIFJYU1RCQ19PTkUJMQkvLyByeCBzdXBwb3J0IG9mIG9uZSBzcGF0aWFsIHN0cmVhbQotI2RlZmluZSBSWFNUQkNfVFdPCTIJLy8gcnggc3VwcG9ydCBvZiAxIGFuZCAyIHNwYXRpYWwgc3RyZWFtCi0jZGVmaW5lIFJYU1RCQ19USFIJMwkvLyByeCBzdXBwb3J0IG9mIDF+MyBzcGF0aWFsIHN0cmVhbQotLy8gTUNTIEZFRURCQUNLCi0jZGVmaW5lIE1DU0ZCS19OT05FCTAgIC8vIG5vdCBzdXBwb3J0IG1jcyBmZWVkYmFjayAvCi0jZGVmaW5lIE1DU0ZCS19SU1YJMQkvLyByZXNlcnZlZAotI2RlZmluZSBNQ1NGQktfVU5TT0xJQ0lUCTIJLy8gb25seSBzdXBwb3J0IHVuc29saWN0IG1jcyBmZWVkYmFjawotI2RlZmluZSBNQ1NGQktfTVJRCTMJLy8gcmVzcG9uc2UgdG8gYm90aCBNUlEgYW5kIHVuc29saWN0IG1jcyBmZWVkYmFjaworI2RlZmluZSBTVEJDX1VTRQkxCS8qIGxpbWl0ZWQgdXNlIGluIHJ0Mjg2MGIgcGh5ICovCisjZGVmaW5lIFJYU1RCQ19PTkUJMQkvKiByeCBzdXBwb3J0IG9mIG9uZSBzcGF0aWFsIHN0cmVhbSAqLworI2RlZmluZSBSWFNUQkNfVFdPCTIJLyogcnggc3VwcG9ydCBvZiAxIGFuZCAyIHNwYXRpYWwgc3RyZWFtICovCisjZGVmaW5lIFJYU1RCQ19USFIJMwkvKiByeCBzdXBwb3J0IG9mIDF+MyBzcGF0aWFsIHN0cmVhbSAqLworLyogTUNTIEZFRURCQUNLICovCisjZGVmaW5lIE1DU0ZCS19OT05FCTAJLyogbm90IHN1cHBvcnQgbWNzIGZlZWRiYWNrIC8gKi8KKyNkZWZpbmUgTUNTRkJLX1JTVgkxCS8qIHJlc2VydmVkICovCisjZGVmaW5lIE1DU0ZCS19VTlNPTElDSVQJMgkvKiBvbmx5IHN1cHBvcnQgdW5zb2xpY3QgbWNzIGZlZWRiYWNrICovCisjZGVmaW5lIE1DU0ZCS19NUlEJMwkvKiByZXNwb25zZSB0byBib3RoIE1SUSBhbmQgdW5zb2xpY3QgbWNzIGZlZWRiYWNrICovCiAKLS8vIE1JTU8gcG93ZXIgc2FmZQorLyogTUlNTyBwb3dlciBzYWZlICovCiAjZGVmaW5lCU1NUFNfU1RBVElDCTAKICNkZWZpbmUJTU1QU19EWU5BTUlDCQkxCiAjZGVmaW5lICAgTU1QU19SU1YJCTIKICNkZWZpbmUgTU1QU19FTkFCTEUJCTMKIAotCi0vLyBBLU1TRFUgc2l6ZQorLyogQS1NU0RVIHNpemUgKi8KICNkZWZpbmUJQU1TRFVfMAkwCiAjZGVmaW5lCUFNU0RVXzEJCTEKIAotLy8gTUNTIHVzZSA3IGJpdHMKKy8qIE1DUyB1c2UgNyBiaXRzICovCiAjZGVmaW5lIFRYUkFURU1JTU8JCTB4ODAKICNkZWZpbmUgVFhSQVRFTUNTCQkweDdGCiAjZGVmaW5lIFRYUkFURU9GRE0JCTB4N0YKQEAgLTExMTksNzMgKzEwNzQsNzcgQEAKICNkZWZpbmUgUkFURV8yICAgICAgICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgUkFURV81XzUgICAgICAgICAgICAgICAgICAgIDIKICNkZWZpbmUgUkFURV8xMSAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgUkFURV82ICAgICAgICAgICAgICAgICAgICAgIDQgICAvLyBPRkRNCi0jZGVmaW5lIFJBVEVfOSAgICAgICAgICAgICAgICAgICAgICA1ICAgLy8gT0ZETQotI2RlZmluZSBSQVRFXzEyICAgICAgICAgICAgICAgICAgICAgNiAgIC8vIE9GRE0KLSNkZWZpbmUgUkFURV8xOCAgICAgICAgICAgICAgICAgICAgIDcgICAvLyBPRkRNCi0jZGVmaW5lIFJBVEVfMjQgICAgICAgICAgICAgICAgICAgICA4ICAgLy8gT0ZETQotI2RlZmluZSBSQVRFXzM2ICAgICAgICAgICAgICAgICAgICAgOSAgIC8vIE9GRE0KLSNkZWZpbmUgUkFURV80OCAgICAgICAgICAgICAgICAgICAgIDEwICAvLyBPRkRNCi0jZGVmaW5lIFJBVEVfNTQgICAgICAgICAgICAgICAgICAgICAxMSAgLy8gT0ZETQorI2RlZmluZSBSQVRFXzYgICAgICAgICAgICAgICAgICAgICAgNAkvKiBPRkRNICovCisjZGVmaW5lIFJBVEVfOSAgICAgICAgICAgICAgICAgICAgICA1CS8qIE9GRE0gKi8KKyNkZWZpbmUgUkFURV8xMiAgICAgICAgICAgICAgICAgICAgIDYJLyogT0ZETSAqLworI2RlZmluZSBSQVRFXzE4ICAgICAgICAgICAgICAgICAgICAgNwkvKiBPRkRNICovCisjZGVmaW5lIFJBVEVfMjQgICAgICAgICAgICAgICAgICAgICA4CS8qIE9GRE0gKi8KKyNkZWZpbmUgUkFURV8zNiAgICAgICAgICAgICAgICAgICAgIDkJLyogT0ZETSAqLworI2RlZmluZSBSQVRFXzQ4ICAgICAgICAgICAgICAgICAgICAgMTAJLyogT0ZETSAqLworI2RlZmluZSBSQVRFXzU0ICAgICAgICAgICAgICAgICAgICAgMTEJLyogT0ZETSAqLwogI2RlZmluZSBSQVRFX0ZJUlNUX09GRE1fUkFURSAgICAgICAgUkFURV82CiAjZGVmaW5lIFJBVEVfTEFTVF9PRkRNX1JBVEUgICAgICAgIAlSQVRFXzU0Ci0jZGVmaW5lIFJBVEVfNl81ICAgICAgICAgICAgICAgICAgICAxMiAgLy8gSFQgbWl4Ci0jZGVmaW5lIFJBVEVfMTMgICAgICAgICAgICAgICAgICAgICAxMyAgLy8gSFQgbWl4Ci0jZGVmaW5lIFJBVEVfMTlfNSAgICAgICAgICAgICAgICAgICAxNCAgLy8gSFQgbWl4Ci0jZGVmaW5lIFJBVEVfMjYgICAgICAgICAgICAgICAgICAgICAxNSAgLy8gSFQgbWl4Ci0jZGVmaW5lIFJBVEVfMzkgICAgICAgICAgICAgICAgICAgICAxNiAgLy8gSFQgbWl4Ci0jZGVmaW5lIFJBVEVfNTIgICAgICAgICAgICAgICAgICAgICAxNyAgLy8gSFQgbWl4Ci0jZGVmaW5lIFJBVEVfNThfNSAgICAgICAgICAgICAgICAgICAxOCAgLy8gSFQgbWl4Ci0jZGVmaW5lIFJBVEVfNjUgICAgICAgICAgICAgICAgICAgICAxOSAgLy8gSFQgbWl4Ci0jZGVmaW5lIFJBVEVfNzggICAgICAgICAgICAgICAgICAgICAyMCAgLy8gSFQgbWl4Ci0jZGVmaW5lIFJBVEVfMTA0ICAgICAgICAgICAgICAgICAgICAyMSAgLy8gSFQgbWl4Ci0jZGVmaW5lIFJBVEVfMTE3ICAgICAgICAgICAgICAgICAgICAyMiAgLy8gSFQgbWl4Ci0jZGVmaW5lIFJBVEVfMTMwICAgICAgICAgICAgICAgICAgICAyMyAgLy8gSFQgbWl4Ci0vLyNkZWZpbmUgUkFURV9BVVRPX1NXSVRDSCAgICAgICAgICAgIDI1NSAvLyBmb3IgU3RhQ2ZnLkZpeGVkVHhSYXRlIG9ubHkKKyNkZWZpbmUgUkFURV82XzUgICAgICAgICAgICAgICAgICAgIDEyCS8qIEhUIG1peCAqLworI2RlZmluZSBSQVRFXzEzICAgICAgICAgICAgICAgICAgICAgMTMJLyogSFQgbWl4ICovCisjZGVmaW5lIFJBVEVfMTlfNSAgICAgICAgICAgICAgICAgICAxNAkvKiBIVCBtaXggKi8KKyNkZWZpbmUgUkFURV8yNiAgICAgICAgICAgICAgICAgICAgIDE1CS8qIEhUIG1peCAqLworI2RlZmluZSBSQVRFXzM5ICAgICAgICAgICAgICAgICAgICAgMTYJLyogSFQgbWl4ICovCisjZGVmaW5lIFJBVEVfNTIgICAgICAgICAgICAgICAgICAgICAxNwkvKiBIVCBtaXggKi8KKyNkZWZpbmUgUkFURV81OF81ICAgICAgICAgICAgICAgICAgIDE4CS8qIEhUIG1peCAqLworI2RlZmluZSBSQVRFXzY1ICAgICAgICAgICAgICAgICAgICAgMTkJLyogSFQgbWl4ICovCisjZGVmaW5lIFJBVEVfNzggICAgICAgICAgICAgICAgICAgICAyMAkvKiBIVCBtaXggKi8KKyNkZWZpbmUgUkFURV8xMDQgICAgICAgICAgICAgICAgICAgIDIxCS8qIEhUIG1peCAqLworI2RlZmluZSBSQVRFXzExNyAgICAgICAgICAgICAgICAgICAgMjIJLyogSFQgbWl4ICovCisjZGVmaW5lIFJBVEVfMTMwICAgICAgICAgICAgICAgICAgICAyMwkvKiBIVCBtaXggKi8KKy8qI2RlZmluZSBSQVRFX0FVVE9fU1dJVENIICAgICAgICAgICAgMjU1IC8vIGZvciBTdGFDZmcuRml4ZWRUeFJhdGUgb25seSAqLwogI2RlZmluZSBIVFJBVEVfMCAgICAgICAgICAgICAgICAgICAgICAxMgogI2RlZmluZSBSQVRFX0ZJUlNUX01NX1JBVEUgICAgICAgIEhUUkFURV8wCiAjZGVmaW5lIFJBVEVfRklSU1RfSFRfUkFURSAgICAgICAgSFRSQVRFXzAKICNkZWZpbmUgUkFURV9MQVNUX0hUX1JBVEUgICAgICAgIEhUUkFURV8wCiAKLS8vIHBUeFdJLT50eG9wCi0jZGVmaW5lIElGU19IVFRYT1AgICAgICAgICAgICAgICAgIDAJLy8gVGhlIHR4b3Agd2lsbCBiZSBoYW5kbGVzIGJ5IEFTSUMuCisvKiBwVHhXSS0+dHhvcCAqLworI2RlZmluZSBJRlNfSFRUWE9QICAgICAgICAgICAgICAgICAwCS8qIFRoZSB0eG9wIHdpbGwgYmUgaGFuZGxlcyBieSBBU0lDLiAqLwogI2RlZmluZSBJRlNfUElGUyAgICAgICAgICAgICAgICAgICAgMQogI2RlZmluZSBJRlNfU0lGUyAgICAgICAgICAgICAgICAgICAgMgogI2RlZmluZSBJRlNfQkFDS09GRiAgICAgICAgICAgICAgICAgMwogCi0vLyBwVHhELT5SZXRyeU1vZGUKLSNkZWZpbmUgTE9OR19SRVRSWSAgICAgICAgICAgICAgICAgIDEKKy8qIHBUeEQtPlJldHJ5TW9kZSAqLworI2RlZmluZSBsb25nX1JFVFJZICAgICAgICAgICAgICAgICAgMQogI2RlZmluZSBTSE9SVF9SRVRSWSAgICAgICAgICAgICAgICAgMAogCi0vLyBDb3VudHJ5IFJlZ2lvbiBkZWZpbml0aW9uCisvKiBDb3VudHJ5IFJlZ2lvbiBkZWZpbml0aW9uICovCiAjZGVmaW5lIFJFR0lPTl9NSU5JTVVNX0JHX0JBTkQgICAgICAgICAgICAwCi0jZGVmaW5lIFJFR0lPTl8wX0JHX0JBTkQgICAgICAgICAgICAgICAgICAwICAgICAgIC8vIDEtMTEKLSNkZWZpbmUgUkVHSU9OXzFfQkdfQkFORCAgICAgICAgICAgICAgICAgIDEgICAgICAgLy8gMS0xMwotI2RlZmluZSBSRUdJT05fMl9CR19CQU5EICAgICAgICAgICAgICAgICAgMiAgICAgICAvLyAxMC0xMQotI2RlZmluZSBSRUdJT05fM19CR19CQU5EICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyAxMC0xMwotI2RlZmluZSBSRUdJT05fNF9CR19CQU5EICAgICAgICAgICAgICAgICAgNCAgICAgICAvLyAxNAotI2RlZmluZSBSRUdJT05fNV9CR19CQU5EICAgICAgICAgICAgICAgICAgNSAgICAgICAvLyAxLTE0Ci0jZGVmaW5lIFJFR0lPTl82X0JHX0JBTkQgICAgICAgICAgICAgICAgICA2ICAgICAgIC8vIDMtOQotI2RlZmluZSBSRUdJT05fN19CR19CQU5EICAgICAgICAgICAgICAgICAgNyAgICAgICAvLyA1LTEzCi0jZGVmaW5lIFJFR0lPTl8zMV9CR19CQU5EICAgICAgICAgICAgICAgICAzMSAgICAgICAvLyA1LTEzCisjZGVmaW5lIFJFR0lPTl8wX0JHX0JBTkQgICAgICAgICAgICAgICAgICAwCS8qIDEtMTEgKi8KKyNkZWZpbmUgUkVHSU9OXzFfQkdfQkFORCAgICAgICAgICAgICAgICAgIDEJLyogMS0xMyAqLworI2RlZmluZSBSRUdJT05fMl9CR19CQU5EICAgICAgICAgICAgICAgICAgMgkvKiAxMC0xMSAqLworI2RlZmluZSBSRUdJT05fM19CR19CQU5EICAgICAgICAgICAgICAgICAgMwkvKiAxMC0xMyAqLworI2RlZmluZSBSRUdJT05fNF9CR19CQU5EICAgICAgICAgICAgICAgICAgNAkvKiAxNCAqLworI2RlZmluZSBSRUdJT05fNV9CR19CQU5EICAgICAgICAgICAgICAgICAgNQkvKiAxLTE0ICovCisjZGVmaW5lIFJFR0lPTl82X0JHX0JBTkQgICAgICAgICAgICAgICAgICA2CS8qIDMtOSAqLworI2RlZmluZSBSRUdJT05fN19CR19CQU5EICAgICAgICAgICAgICAgICAgNwkvKiA1LTEzICovCisjZGVmaW5lIFJFR0lPTl8zMV9CR19CQU5EICAgICAgICAgICAgICAgICAzMQkvKiA1LTEzICovCiAjZGVmaW5lIFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQgICAgICAgICAgICA3CiAKICNkZWZpbmUgUkVHSU9OX01JTklNVU1fQV9CQU5EICAgICAgICAgICAgIDAKLSNkZWZpbmUgUkVHSU9OXzBfQV9CQU5EICAgICAgICAgICAgICAgICAgIDAgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQotI2RlZmluZSBSRUdJT05fMV9BX0JBTkQgICAgICAgICAgICAgICAgICAgMSAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwCi0jZGVmaW5lIFJFR0lPTl8yX0FfQkFORCAgICAgICAgICAgICAgICAgICAyICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NAotI2RlZmluZSBSRUdJT05fM19BX0JBTkQgICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyA1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxCi0jZGVmaW5lIFJFR0lPTl80X0FfQkFORCAgICAgICAgICAgICAgICAgICA0ICAgICAgIC8vIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1Ci0jZGVmaW5lIFJFR0lPTl81X0FfQkFORCAgICAgICAgICAgICAgICAgICA1ICAgICAgIC8vIDE0OSwgMTUzLCAxNTcsIDE2MQotI2RlZmluZSBSRUdJT05fNl9BX0JBTkQgICAgICAgICAgICAgICAgICAgNiAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OAotI2RlZmluZSBSRUdJT05fN19BX0JBTkQgICAgICAgICAgICAgICAgICAgNyAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQotI2RlZmluZSBSRUdJT05fOF9BX0JBTkQgICAgICAgICAgICAgICAgICAgOCAgICAgICAvLyA1MiwgNTYsIDYwLCA2NAotI2RlZmluZSBSRUdJT05fOV9BX0JBTkQgICAgICAgICAgICAgICAgICAgOSAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQotI2RlZmluZSBSRUdJT05fMTBfQV9CQU5EICAgICAgICAgICAgICAgICAgMTAJICAvLyAzNiwgNDAsIDQ0LCA0OCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKLSNkZWZpbmUgUkVHSU9OXzExX0FfQkFORCAgICAgICAgICAgICAgICAgIDExCSAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxNDksIDE1MywgMTU3LCAxNjEKLSNkZWZpbmUgUkVHSU9OX01BWElNVU1fQV9CQU5EICAgICAgICAgICAgIDExCisjZGVmaW5lIFJFR0lPTl8wX0FfQkFORCAgICAgICAgICAgICAgICAgICAwCS8qIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUgKi8KKyNkZWZpbmUgUkVHSU9OXzFfQV9CQU5EICAgICAgICAgICAgICAgICAgIDEJLyogMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCAqLworI2RlZmluZSBSRUdJT05fMl9BX0JBTkQgICAgICAgICAgICAgICAgICAgMgkvKiAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQgKi8KKyNkZWZpbmUgUkVHSU9OXzNfQV9CQU5EICAgICAgICAgICAgICAgICAgIDMJLyogNTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MSAqLworI2RlZmluZSBSRUdJT05fNF9BX0JBTkQgICAgICAgICAgICAgICAgICAgNAkvKiAxNDksIDE1MywgMTU3LCAxNjEsIDE2NSAqLworI2RlZmluZSBSRUdJT05fNV9BX0JBTkQgICAgICAgICAgICAgICAgICAgNQkvKiAxNDksIDE1MywgMTU3LCAxNjEgKi8KKyNkZWZpbmUgUkVHSU9OXzZfQV9CQU5EICAgICAgICAgICAgICAgICAgIDYJLyogMzYsIDQwLCA0NCwgNDggKi8KKyNkZWZpbmUgUkVHSU9OXzdfQV9CQU5EICAgICAgICAgICAgICAgICAgIDcJLyogMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUsIDE2OSwgMTczICovCisjZGVmaW5lIFJFR0lPTl84X0FfQkFORCAgICAgICAgICAgICAgICAgICA4CS8qIDUyLCA1NiwgNjAsIDY0ICovCisjZGVmaW5lIFJFR0lPTl85X0FfQkFORCAgICAgICAgICAgICAgICAgICA5CS8qIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1ICovCisjZGVmaW5lIFJFR0lPTl8xMF9BX0JBTkQgICAgICAgICAgICAgICAgICAxMAkvKiAzNiwgNDAsIDQ0LCA0OCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUgKi8KKyNkZWZpbmUgUkVHSU9OXzExX0FfQkFORCAgICAgICAgICAgICAgICAgIDExCS8qIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTQ5LCAxNTMsIDE1NywgMTYxICovCisjZGVmaW5lIFJFR0lPTl8xMl9BX0JBTkQgICAgICAgICAgICAgICAgICAxMgkvKiAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwICovCisjZGVmaW5lIFJFR0lPTl8xM19BX0JBTkQgICAgICAgICAgICAgICAgICAxMwkvKiA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSAqLworI2RlZmluZSBSRUdJT05fMTRfQV9CQU5EICAgICAgICAgICAgICAgICAgMTQJLyogMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1ICovCisjZGVmaW5lIFJFR0lPTl8xNV9BX0JBTkQgICAgICAgICAgICAgICAgICAxNQkvKiAxNDksIDE1MywgMTU3LCAxNjEsIDE2NSwgMTY5LCAxNzMgKi8KKyNkZWZpbmUgUkVHSU9OX01BWElNVU1fQV9CQU5EICAgICAgICAgICAgIDE1CiAKLS8vIHBUeEQtPkNpcGhlckFsZworLyogcFR4RC0+Q2lwaGVyQWxnICovCiAjZGVmaW5lIENJUEhFUl9OT05FICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIENJUEhFUl9XRVA2NCAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIENJUEhFUl9XRVAxMjggICAgICAgICAgICAgICAyCkBAIC0xMTkzLDIwICsxMTUyLDEwIEBACiAjZGVmaW5lIENJUEhFUl9BRVMgICAgICAgICAgICAgICAgICA0CiAjZGVmaW5lIENJUEhFUl9DS0lQNjQgICAgICAgICAgICAgICA1CiAjZGVmaW5lIENJUEhFUl9DS0lQMTI4ICAgICAgICAgICAgICA2Ci0jZGVmaW5lIENJUEhFUl9US0lQX05PX01JQyAgICAgICAgICA3ICAgICAgIC8vIE1JQyBhcHBlbmRlZCBieSBkcml2ZXI6IG5vdCBhIHZhbGlkIHZhbHVlIGluIGhhcmR3YXJlIGtleSB0YWJsZQorI2RlZmluZSBDSVBIRVJfVEtJUF9OT19NSUMgICAgICAgICAgNwkvKiBNSUMgYXBwZW5kZWQgYnkgZHJpdmVyOiBub3QgYSB2YWxpZCB2YWx1ZSBpbiBoYXJkd2FyZSBrZXkgdGFibGUgKi8KICNkZWZpbmUgQ0lQSEVSX1NNUzQJCQkJCTgKIAotLy8gdmFsdWUgZG9tYWluIG9mIHBBZC0+UmZJY1R5cGUKLSNkZWZpbmUgUkZJQ18yODIwICAgICAgICAgICAgICAgICAgIDEgICAgICAgLy8gMi40RyAyVDNSCi0jZGVmaW5lIFJGSUNfMjg1MCAgICAgICAgICAgICAgICAgICAyICAgICAgIC8vIDIuNEcvNUcgMlQzUgotI2RlZmluZSBSRklDXzI3MjAgICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyAyLjRHIDFUMlIKLSNkZWZpbmUgUkZJQ18yNzUwICAgICAgICAgICAgICAgICAgIDQgICAgICAgLy8gMi40Ry81RyAxVDJSCi0jZGVmaW5lIFJGSUNfMzAyMCAgICAgICAgICAgICAgICAgICA1ICAgICAgIC8vIDIuNEcgMVQxUgotI2RlZmluZSBSRklDXzIwMjAgICAgICAgICAgICAgICAgICAgNiAgICAgICAvLyAyLjRHIEIvRwotI2RlZmluZSBSRklDXzMwMjEgICAgICAgICAgICAgICAgICAgNyAgICAgICAvLyAyLjRHIDFUMlIKLSNkZWZpbmUgUkZJQ18zMDIyICAgICAgICAgICAgICAgICAgIDggICAgICAgLy8gMi40RyAyVDJSCi0KLS8vIExFRCBTdGF0dXMuCisvKiBMRUQgU3RhdHVzLiAqLwogI2RlZmluZSBMRURfTElOS19ET1dOICAgICAgICAgICAgICAgMAogI2RlZmluZSBMRURfTElOS19VUCAgICAgICAgICAgICAgICAgMQogI2RlZmluZSBMRURfUkFESU9fT0ZGICAgICAgICAgICAgICAgMgpAQCAtMTIxNiwzNSArMTE2NSwzNSBAQAogI2RlZmluZSBMRURfT05fU0lURV9TVVJWRVkgICAgICAgICAgNgogI2RlZmluZSBMRURfUE9XRVJfVVAgICAgICAgICAgICAgICAgNwogCi0vLyB2YWx1ZSBkb21haW4gb2YgcEFkLT5MZWRDbnRsLkxlZE1vZGUgYW5kIEUyUFJPTQorLyogdmFsdWUgZG9tYWluIG9mIHBBZC0+TGVkQ250bC5MZWRNb2RlIGFuZCBFMlBST00gKi8KICNkZWZpbmUgTEVEX01PREVfREVGQVVMVCAgICAgICAgICAgIDAKICNkZWZpbmUgTEVEX01PREVfVFdPX0xFRAkJCTEKLSNkZWZpbmUgTEVEX01PREVfU0lHTkFMX1NUUkVHVEgJCTggIC8vIEVFUFJPTSBkZWZpbmUgPTgKKy8qI2RlZmluZSBMRURfTU9ERV9TSUdOQUxfU1RSRUdUSCAgICAgICAgICAgICAgIDggIC8vIEVFUFJPTSBkZWZpbmUgPTggKi8KKyNkZWZpbmUgTEVEX01PREVfU0lHTkFMX1NUUkVHVEgJCTB4NDAJLyogRUVQUk9NIGRlZmluZSA9IDY0ICovCiAKLS8vIFJDNCBpbml0IHZhbHVlLCB1c2VkIGZybyBXRVAgJiBUS0lQCi0jZGVmaW5lIFBQUElOSVRGQ1MzMiAgICAgICAgICAgICAgICAweGZmZmZmZmZmICAgLyogSW5pdGlhbCBGQ1MgdmFsdWUgKi8KKy8qIFJDNCBpbml0IHZhbHVlLCB1c2VkIGZybyBXRVAgJiBUS0lQICovCisjZGVmaW5lIFBQUElOSVRGQ1MzMiAgICAgICAgICAgICAgICAweGZmZmZmZmZmCS8qIEluaXRpYWwgRkNTIHZhbHVlICovCiAKLS8vIHZhbHVlIGRvbWFpbiBvZiBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZC4gODAyLjFYIGNvbnRyb2xsZWQgcG9ydCBkZWZpbml0aW9uCisvKiB2YWx1ZSBkb21haW4gb2YgcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQuIDgwMi4xWCBjb250cm9sbGVkIHBvcnQgZGVmaW5pdGlvbiAqLwogI2RlZmluZSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCAgICAgMQogI2RlZmluZSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQgMgogCiAjZGVmaW5lIFBBSVJXSVNFX0tFWSAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIEdST1VQX0tFWSAgICAgICAgICAgICAgICAgICAyCiAKLS8vZGVmaW5pdGlvbiBvZiBEUlMKKy8qZGVmaW5pdGlvbiBvZiBEUlMgKi8KICNkZWZpbmUgTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gJMzIKIAotCi0vLyBwcmUtYWxsb2NhdGVkIGZyZWUgTkRJUyBQQUNLRVQvQlVGRkVSIHBvbGwgZm9yIGludGVybmFsIHVzYWdlCisvKiBwcmUtYWxsb2NhdGVkIGZyZWUgTkRJUyBQQUNLRVQvQlVGRkVSIHBvbGwgZm9yIGludGVybmFsIHVzYWdlICovCiAjZGVmaW5lIE1BWF9OVU1fT0ZfRlJFRV9ORElTX1BBQ0tFVCAxMjgKIAotLy9CbG9jayBBQ0sKKy8qQmxvY2sgQUNLICovCiAjZGVmaW5lIE1BWF9UWF9SRU9SREVSQlVGICAgNjQKICNkZWZpbmUgTUFYX1JYX1JFT1JERVJCVUYgICA2NAogI2RlZmluZSBERUZBVUxUX1RYX1RJTUVPVVQgICAzMAogI2RlZmluZSBERUZBVUxUX1JYX1RJTUVPVVQgICAzMAogCi0vLyBkZWZpbml0aW9uIG9mIFJlY2lwaWVudCBvciBPcmlnaW5hdG9yCisvKiBkZWZpbml0aW9uIG9mIFJlY2lwaWVudCBvciBPcmlnaW5hdG9yICovCiAjZGVmaW5lIElfUkVDSVBJRU5UICAgICAgICAgICAgICAgICAgVFJVRQogI2RlZmluZSBJX09SSUdJTkFUT1IgICAgICAgICAgICAgICAgICAgRkFMU0UKIApAQCAtMTI1Miw0NiArMTIwMSw0NSBAQAogI2RlZmluZSBERUZBVUxUX1JGX1RYX1BPV0VSICAgICAgICAgNQogCiAjZGVmaW5lIE1BWF9JTklfQlVGRkVSX1NJWkUJCQk0MDk2Ci0jZGVmaW5lIE1BWF9QQVJBTV9CVUZGRVJfU0laRQkJKDIwNDgpIC8vIGVub3VnaCBmb3IgQUNMICgxOCo2NCkKLQkJCQkJCQkJCQkJLy8xOCA6IHRoZSBsZW5ndGggb2YgTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgIjAxOjAyOjAzOjA0OjA1OjA2OyIpCi0JCQkJCQkJCQkJCS8vNjQgOiBNQVhfTlVNX09GX0FDTF9MSVNUCi0vLyBkZWZpbml0aW9uIG9mIHBBZC0+T3BNb2RlCisjZGVmaW5lIE1BWF9QQVJBTV9CVUZGRVJfU0laRQkJKDIwNDgpCS8qIGVub3VnaCBmb3IgQUNMICgxOCo2NCkgKi8KKwkJCQkJCQkJCQkJLyoxOCA6IHRoZSBsZW5ndGggb2YgTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgIjAxOjAyOjAzOjA0OjA1OjA2OyIpICovCisJCQkJCQkJCQkJCS8qNjQgOiBNQVhfTlVNX09GX0FDTF9MSVNUICovCisvKiBkZWZpbml0aW9uIG9mIHBBZC0+T3BNb2RlICovCiAjZGVmaW5lIE9QTU9ERV9TVEEgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIE9QTU9ERV9BUCAgICAgICAgICAgICAgICAgICAxCi0vLyNkZWZpbmUgT1BNT0RFX0wzX0JSRyAgICAgICAgICAgICAgIDIgICAgICAgLy8gYXMgQVAgYW5kIFNUQSBhdCB0aGUgc2FtZSB0aW1lCisvKiNkZWZpbmUgT1BNT0RFX0wzX0JSRyAgICAgICAgICAgICAgIDIgICAgICAgLy8gYXMgQVAgYW5kIFNUQSBhdCB0aGUgc2FtZSB0aW1lICovCiAKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT0gQVAgcnRtcF9kZWYuaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIHZhbHVlIGRvbWFpbiBmb3IgcEFkLT5FdmVudFRhYi5Mb2dbXS5FdmVudAotI2RlZmluZSBFVkVOVF9SRVNFVF9BQ0NFU1NfUE9JTlQgICAgMCAvLyBMb2cgPSAiaGg6bW06c3MgICBSZXN0YXJ0IEFjY2VzcyBQb2ludCIKLSNkZWZpbmUgRVZFTlRfQVNTT0NJQVRFRCAgICAgICAgICAgIDEgLy8gTG9nID0gImhoOm1tOnNzICAgU1RBIDAwOjAxOjAyOjAzOjA0OjA1IGFzc29jaWF0ZWQiCi0jZGVmaW5lIEVWRU5UX0RJU0FTU09DSUFURUQgICAgICAgICAyIC8vIExvZyA9ICJoaDptbTpzcyAgIFNUQSAwMDowMTowMjowMzowNDowNSBsZWZ0IHRoaXMgQlNTIgotI2RlZmluZSBFVkVOVF9BR0VEX09VVCAgICAgICAgICAgICAgMyAvLyBMb2cgPSAiaGg6bW06c3MgICBTVEEgMDA6MDE6MDI6MDM6MDQ6MDUgd2FzIGFnZWQtb3V0IGFuZCByZW1vdmVkIGZyb20gdGhpcyBCU1MiCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09IEFQIHJ0bXBfZGVmLmggPT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiB2YWx1ZSBkb21haW4gZm9yIHBBZC0+RXZlbnRUYWIuTG9nW10uRXZlbnQgKi8KKyNkZWZpbmUgRVZFTlRfUkVTRVRfQUNDRVNTX1BPaW50ICAgIDAJLyogTG9nID0gImhoOm1tOnNzICAgUmVzdGFydCBBY2Nlc3MgUG9pbnQiICovCisjZGVmaW5lIEVWRU5UX0FTU09DSUFURUQgICAgICAgICAgICAxCS8qIExvZyA9ICJoaDptbTpzcyAgIFNUQSAwMDowMTowMjowMzowNDowNSBhc3NvY2lhdGVkIiAqLworI2RlZmluZSBFVkVOVF9ESVNBU1NPQ0lBVEVEICAgICAgICAgMgkvKiBMb2cgPSAiaGg6bW06c3MgICBTVEEgMDA6MDE6MDI6MDM6MDQ6MDUgbGVmdCB0aGlzIEJTUyIgKi8KKyNkZWZpbmUgRVZFTlRfQUdFRF9PVVQgICAgICAgICAgICAgIDMJLyogTG9nID0gImhoOm1tOnNzICAgU1RBIDAwOjAxOjAyOjAzOjA0OjA1IHdhcyBhZ2VkLW91dCBhbmQgcmVtb3ZlZCBmcm9tIHRoaXMgQlNTIiAqLwogI2RlZmluZSBFVkVOVF9DT1VOVEVSX00gICAgICAgICAgICAgNAogI2RlZmluZSBFVkVOVF9JTlZBTElEX1BTSyAgICAgICAgICAgNQogI2RlZmluZSBFVkVOVF9NQVhfRVZFTlRfVFlQRSAgICAgICAgNgotLy8gPT09PSBlbmQgb2YgQVAgcnRtcF9kZWYuaCA9PT09PT09PT09PT0KKy8qID09PT0gZW5kIG9mIEFQIHJ0bXBfZGVmLmggPT09PT09PT09PT09ICovCiAKLS8vIGRlZmluaXRpb24gUlNTSSBOdW1iZXIKKy8qIGRlZmluaXRpb24gUlNTSSBOdW1iZXIgKi8KICNkZWZpbmUgUlNTSV8wCQkJCQkwCiAjZGVmaW5lIFJTU0lfMQkJCQkJMQogI2RlZmluZSBSU1NJXzIJCQkJCTIKIAotLy8gZGVmaW5pdGlvbiBvZiByYWRhciBkZXRlY3Rpb24KLSNkZWZpbmUgUkRfTk9STUFMX01PREUJCQkJMAkvLyBOb3QgZm91bmQgcmFkYXIgc2lnbmFsCi0jZGVmaW5lIFJEX1NXSVRDSElOR19NT0RFCQkJMQkvLyBGb3VuZCByYWRhciBzaWduYWwsIGFuZCBkb2luZyBjaGFubmVsIHN3aXRjaAotI2RlZmluZSBSRF9TSUxFTkNFX01PREUJCQkJMgkvLyBBZnRlciBjaGFubmVsIHN3aXRjaCwgbmVlZCB0byBiZSBzaWxlbmNlIGEgd2hpbGUgdG8gZW5zdXJlIHJhZGFyIG5vdCBmb3VuZAorLyogZGVmaW5pdGlvbiBvZiByYWRhciBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUkRfTk9STUFMX01PREUJCQkJMAkvKiBOb3QgZm91bmQgcmFkYXIgc2lnbmFsICovCisjZGVmaW5lIFJEX1NXSVRDSElOR19NT0RFCQkJMQkvKiBGb3VuZCByYWRhciBzaWduYWwsIGFuZCBkb2luZyBjaGFubmVsIHN3aXRjaCAqLworI2RlZmluZSBSRF9TSUxFTkNFX01PREUJCQkJMgkvKiBBZnRlciBjaGFubmVsIHN3aXRjaCwgbmVlZCB0byBiZSBzaWxlbmNlIGEgd2hpbGUgdG8gZW5zdXJlIHJhZGFyIG5vdCBmb3VuZCAqLwogCi0vL0RyaXZlciBkZWZpbmVkIGNpZCBmb3IgbWFwcGluZyBzdGF0dXMgYW5kIGNvbW1hbmQuCisvKkRyaXZlciBkZWZpbmVkIGNpZCBmb3IgbWFwcGluZyBzdGF0dXMgYW5kIGNvbW1hbmQuICovCiAjZGVmaW5lICBTTEVFUENJRAkweDExCiAjZGVmaW5lICBXQUtFQ0lECTB4MjIKICNkZWZpbmUgIFFVRVJZUE9XRVJDSUQJMHgzMwogI2RlZmluZSAgT1dORVJNQ1UJMHgxCiAjZGVmaW5lICBPV05FUkNQVQkweDAKIAotLy8gTUJTU0lEIGRlZmluaXRpb24KKy8qIE1CU1NJRCBkZWZpbml0aW9uICovCiAjZGVmaW5lIEVOVFJZX05PVF9GT1VORCAgICAgICAgICAgICAweEZGCiAKLQogLyogQWZ0ZXIgTGludXggMi42LjksCiAgKiBWTEFOIG1vZHVsZSB1c2UgUHJpdmF0ZSAoZnJvbSB1c2VyKSBpbnRlcmZhY2UgZmxhZ3MgKG5ldGRldmljZS0+cHJpdl9mbGFncykuCiAgKiAjZGVmaW5lIElGRl84MDJfMVFfVkxBTiAweDEgICAgICAgICAtLSAgICA4MDIuMVEgVkxBTiBkZXZpY2UuICBpbiBpZi5oCkBAIC0xMzA1LDE5ICsxMjUzLDIxIEBACiAjZGVmaW5lIElOVF9BUENMSSAgICAgICAgICAgICAgICAgICAweDA0MDAKICNkZWZpbmUgSU5UX01FU0ggICAgICAgICAgICAgICAgICAgCTB4MDUwMAogCi0vLyBVc2UgYml0bWFwIHRvIGFsbG93IGNvZXhpc3Qgb2YgQVRFX1RYRlJBTUUgYW5kIEFURV9SWEZSQU1FKGkuZS4sdG8gc3VwcG9ydCBMb29wQmFjayBtb2RlKQorI2RlZmluZSBJTkZfTUFJTl9ERVZfTkFNRQkJIndsYW4iCisjZGVmaW5lIElORl9NQlNTSURfREVWX05BTUUJCSJyYSIKKyNkZWZpbmUgSU5GX1dEU19ERVZfTkFNRQkJIndkcyIKKyNkZWZpbmUgSU5GX0FQQ0xJX0RFVl9OQU1FCQkiYXBjbGkiCisjZGVmaW5lIElORl9NRVNIX0RFVl9OQU1FCQkibWVzaCIKIAotLy8gV0VQIEtleSBUWVBFCisvKiBXRVAgS2V5IFRZUEUgKi8KICNkZWZpbmUgV0VQX0hFWEFERUNJTUFMX1RZUEUgICAgMAogI2RlZmluZSBXRVBfQVNDSUlfVFlQRSAgICAgICAgICAxCiAKLQotCi0vLyBXSVJFTEVTUyBFVkVOVFMgZGVmaW5pdGlvbgorLyogV0lSRUxFU1MgRVZFTlRTIGRlZmluaXRpb24gKi8KIC8qIE1heCBudW1iZXIgb2YgY2hhciBpbiBjdXN0b20gZXZlbnQsIHJlZmVyIHRvIHdpcmVsZXNzX3Rvb2xzLjI4L3dpcmVsZXNzLjIwLmggKi8KICNkZWZpbmUgSVdfQ1VTVE9NX01BWF9MRU4JCQkJICAJCQkyNTUJLyogSW4gYnl0ZXMgKi8KIAotLy8gRm9yIHN5c3RlbSBldmVudCAtIHN0YXJ0CisvKiBGb3Igc3lzdGVtIGV2ZW50IC0gc3RhcnQgKi8KICNkZWZpbmUJSVdfU1lTX0VWRU5UX0ZMQUdfU1RBUlQgICAgICAgICAgICAgICAgICAgICAweDAyMDAKICNkZWZpbmUJSVdfQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKICNkZWZpbmUJSVdfRElTQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAweDAyMDEKQEAgLTEzMzgsMTIgKzEyODgsMTIgQEAKICNkZWZpbmUgSVdfU1RBX0xJTktET1dOX0VWRU5UX0ZMQUcJCQkJCTB4MDIxMAogI2RlZmluZSBJV19TQ0FOX0NPTVBMRVRFRF9FVkVOVF9GTEFHCQkJCTB4MDIxMQogI2RlZmluZSBJV19TQ0FOX0VOUVVFVUVfRkFJTF9FVkVOVF9GTEFHCQkJCTB4MDIxMgotLy8gaWYgYWRkIG5ldyBzeXN0ZW0gZXZlbnQgZmxhZywgcGxlYXNlIHVwYWR0ZSB0aGUgSVdfU1lTX0VWRU5UX0ZMQUdfRU5ECisvKiBpZiBhZGQgbmV3IHN5c3RlbSBldmVudCBmbGFnLCBwbGVhc2UgdXBhZHRlIHRoZSBJV19TWVNfRVZFTlRfRkxBR19FTkQgKi8KICNkZWZpbmUJSVdfU1lTX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgICAgICAweDAyMTIKICNkZWZpbmUJSVdfU1lTX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX1NZU19FVkVOVF9GTEFHX0VORCAtIElXX1NZU19FVkVOVF9GTEFHX1NUQVJUICsgMSkKLS8vIEZvciBzeXN0ZW0gZXZlbnQgLSBlbmQKKy8qIEZvciBzeXN0ZW0gZXZlbnQgLSBlbmQgKi8KIAotLy8gRm9yIHNwb29mIGF0dGFjayBldmVudCAtIHN0YXJ0CisvKiBGb3Igc3Bvb2YgYXR0YWNrIGV2ZW50IC0gc3RhcnQgKi8KICNkZWZpbmUJSVdfU1BPT0ZfRVZFTlRfRkxBR19TVEFSVCAgICAgICAgICAgICAgICAgICAweDAzMDAKICNkZWZpbmUgSVdfQ09ORkxJQ1RfU1NJRF9FVkVOVF9GTEFHCQkJCQkweDAzMDAKICNkZWZpbmUgSVdfU1BPT0ZfQVNTT0NfUkVTUF9FVkVOVF9GTEFHCQkJCTB4MDMwMQpAQCAtMTM1NSwxMiArMTMwNSwxMiBAQAogI2RlZmluZSBJV19TUE9PRl9ERUFVVEhfRVZFTlRfRkxBRwkJCQkJMHgwMzA3CiAjZGVmaW5lIElXX1NQT09GX1VOS05PV05fTUdNVF9FVkVOVF9GTEFHCQkJMHgwMzA4CiAjZGVmaW5lIElXX1JFUExBWV9BVFRBQ0tfRVZFTlRfRkxBRwkJCQkJMHgwMzA5Ci0vLyBpZiBhZGQgbmV3IHNwb29mIGF0dGFjayBldmVudCBmbGFnLCBwbGVhc2UgdXBhZHRlIHRoZSBJV19TUE9PRl9FVkVOVF9GTEFHX0VORAorLyogaWYgYWRkIG5ldyBzcG9vZiBhdHRhY2sgZXZlbnQgZmxhZywgcGxlYXNlIHVwYWR0ZSB0aGUgSVdfU1BPT0ZfRVZFTlRfRkxBR19FTkQgKi8KICNkZWZpbmUJSVdfU1BPT0ZfRVZFTlRfRkxBR19FTkQgICAgICAgICAgICAgICAgICAgICAweDAzMDkKICNkZWZpbmUJSVdfU1BPT0ZfRVZFTlRfVFlQRV9OVU0JCQkJCQkoSVdfU1BPT0ZfRVZFTlRfRkxBR19FTkQgLSBJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUICsgMSkKLS8vIEZvciBzcG9vZiBhdHRhY2sgZXZlbnQgLSBlbmQKKy8qIEZvciBzcG9vZiBhdHRhY2sgZXZlbnQgLSBlbmQgKi8KIAotLy8gRm9yIGZsb29kaW5nIGF0dGFjayBldmVudCAtIHN0YXJ0CisvKiBGb3IgZmxvb2RpbmcgYXR0YWNrIGV2ZW50IC0gc3RhcnQgKi8KICNkZWZpbmUJSVdfRkxPT0RfRVZFTlRfRkxBR19TVEFSVCAgICAgICAgICAgICAgICAgICAweDA0MDAKICNkZWZpbmUgSVdfRkxPT0RfQVVUSF9FVkVOVF9GTEFHCQkJCQkweDA0MDAKICNkZWZpbmUgSVdfRkxPT0RfQVNTT0NfUkVRX0VWRU5UX0ZMQUcJCQkJMHgwNDAxCkBAIC0xMzY5LDE4ICsxMzE5LDE4IEBACiAjZGVmaW5lIElXX0ZMT09EX0RJU0FTU09DX0VWRU5UX0ZMQUcJCQkJMHgwNDA0CiAjZGVmaW5lIElXX0ZMT09EX0RFQVVUSF9FVkVOVF9GTEFHCQkJCQkweDA0MDUKICNkZWZpbmUgSVdfRkxPT0RfRUFQX1JFUV9FVkVOVF9GTEFHCQkJCQkweDA0MDYKLS8vIGlmIGFkZCBuZXcgZmxvb2RpbmcgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX0ZMT09EX0VWRU5UX0ZMQUdfRU5ECisvKiBpZiBhZGQgbmV3IGZsb29kaW5nIGF0dGFjayBldmVudCBmbGFnLCBwbGVhc2UgdXBhZHRlIHRoZSBJV19GTE9PRF9FVkVOVF9GTEFHX0VORCAqLwogI2RlZmluZQlJV19GTE9PRF9FVkVOVF9GTEFHX0VORCAgICAgICAgICAgICAgICAgICAJMHgwNDA2CiAjZGVmaW5lCUlXX0ZMT09EX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX0ZMT09EX0VWRU5UX0ZMQUdfRU5EIC0gSVdfRkxPT0RfRVZFTlRfRkxBR19TVEFSVCArIDEpCi0vLyBGb3IgZmxvb2RpbmcgYXR0YWNrIC0gZW5kCisvKiBGb3IgZmxvb2RpbmcgYXR0YWNrIC0gZW5kICovCiAKLS8vIEVuZCAtIFdJUkVMRVNTIEVWRU5UUyBkZWZpbml0aW9uCisvKiBFbmQgLSBXSVJFTEVTUyBFVkVOVFMgZGVmaW5pdGlvbiAqLwogCi0vLyBkZWZpbml0aW9uIGZvciBETFMsIGthdGh5CisvKiBkZWZpbml0aW9uIGZvciBETFMsIGthdGh5ICovCiAjZGVmaW5lCU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlkgICAxCiAjZGVmaW5lCU1BWF9OVU1fT0ZfRExTX0VOVFJZICAgICAgICBNQVhfTlVNQkVSX09GX0RMU19FTlRSWQogCi0vL0Jsb2NrIEFDSyAsIHJ0Mjg2MCwga2F0aHkKKy8qQmxvY2sgQUNLLCBrYXRoeSAqLwogI2RlZmluZSBNQVhfVFhfUkVPUkRFUkJVRgkJNjQKICNkZWZpbmUgTUFYX1JYX1JFT1JERVJCVUYJCTY0CiAjZGVmaW5lIERFRkFVTFRfVFhfVElNRU9VVAkJMzAKQEAgLTEzOTIsNjUgKzEzNDIsNDggQEAKICNkZWZpbmUgSVdfRVNTSURfTUFYX1NJWkUgICAJCTMyCiAjZW5kaWYKIAotI2lmZGVmIE1DQVNUX1JBVEVfU1BFQ0lGSUMKLSNkZWZpbmUgTUNBU1RfRElTQUJMRQkwCi0jZGVmaW5lIE1DQVNUX0NDSwkJMQotI2RlZmluZSBNQ0FTVF9PRkRNCQkyCi0jZGVmaW5lIE1DQVNUX0hUTUlYCQkzCi0jZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLwotCi0jaWZkZWYgUlQyODYwCi0vLyBGb3IgQXNpY1JhZGlvT2ZmL0FzaWNSYWRpb09uL0FzaWNGb3JjZVdha2V1cCBmdW5jdGlvbgotLy8gVGhpcyBpcyB0byBpbmRpY2F0ZSBmcm9tIHdoZXJlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbi4KLSNkZWZpbmUgRE9UMTFQT1dFUlNBVkUJCTAJLy8gVE8gZG8gLjExIHBvd2VyIHNhdmUgc2xlZXAKLSNkZWZpbmUgR1VJUkFESU9fT0ZGCQkxCS8vIFRvIHBlcmZvcm0gUmFkaW8gT0ZmIGNvbW1hbmQgZnJvbSBHVUkKLSNkZWZpbmUgUlRNUF9IQUxUCQkJMgkvLyBDYWxsZWQgZnJvbSBIYWx0IGhhbmRsZXIuCi0jZGVmaW5lIEdVSV9JRExFX1BPV0VSX1NBVkUJMwkvLyBDYWxsIHRvIHNsZWVwIGJlZm9yZSBsaW5rIHVwIHdpdGggQVAKLSNkZWZpbmUgRlJPTV9UWAkJCQk0CS8vIEZvcmNlIHdha2UgdXAgZnJvbSBUeCBwYWNrZXQuCi0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLS8vIEZvciBBc2ljUmFkaW9PZmYvQXNpY1JhZGlvT24gZnVuY3Rpb24KKy8qIEZvciBBc2ljUmFkaW9PZmYvQXNpY1JhZGlvT24gZnVuY3Rpb24gKi8KICNkZWZpbmUgRE9UMTFQT1dFUlNBVkUJCTAKICNkZWZpbmUgR1VJUkFESU9fT0ZGCQkxCiAjZGVmaW5lIFJUTVBfSEFMVAkJICAgIDIKICNkZWZpbmUgR1VJX0lETEVfUE9XRVJfU0FWRQkJMwotI2VuZGlmCisvKiAtLSAqLwogCi0vLyBkZWZpbml0aW9uIGZvciBXcGFTdXBwb3J0IGZsYWcKKy8qIGRlZmluaXRpb24gZm9yIFdwYVN1cHBvcnQgZmxhZyAqLwogI2RlZmluZSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFCQkJCTAKICNkZWZpbmUgV1BBX1NVUFBMSUNBTlRfRU5BQkxFCQkJCTEKICNkZWZpbmUJV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJCTIKIAotLy8gRW5kaWFuIGJ5dGUgc3dhcHBpbmcgY29kZXMKKy8qIEVuZGlhbiBieXRlIHN3YXBwaW5nIGNvZGVzICovCiAjZGVmaW5lIFNXQVAxNih4KSBcCi0gICAgKChVSU5UMTYpKCBcCi0gICAgKCgoVUlOVDE2KSh4KSAmIChVSU5UMTYpIDB4MDBmZlUpIDw8IDgpIHwgXAotICAgICgoKFVJTlQxNikoeCkgJiAoVUlOVDE2KSAweGZmMDBVKSA+PiA4KSApKQorICAgICgodTE2KSggXAorICAgICgoKHUxNikoeCkgJiAodTE2KTB4MDBmZlUpIDw8IDgpIHwgXAorICAgICgoKHUxNikoeCkgJiAodTE2KTB4ZmYwMFUpID4+IDgpICkpCiAKICNkZWZpbmUgU1dBUDMyKHgpIFwKLSAgICAoKFVJTlQzMikoIFwKLSAgICAoKChVSU5UMzIpKHgpICYgKFVJTlQzMikgMHgwMDAwMDBmZlVMKSA8PCAyNCkgfCBcCi0gICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4MDAwMGZmMDBVTCkgPDwgIDgpIHwgXAotICAgICgoKFVJTlQzMikoeCkgJiAoVUlOVDMyKSAweDAwZmYwMDAwVUwpID4+ICA4KSB8IFwKLSAgICAoKChVSU5UMzIpKHgpICYgKFVJTlQzMikgMHhmZjAwMDAwMFVMKSA+PiAyNCkgKSkKKyAgICAoKHUzMikoIFwKKyAgICAoKCh1MzIpKHgpICYgKHUzMikweDAwMDAwMGZmVUwpIDw8IDI0KSB8IFwKKyAgICAoKCh1MzIpKHgpICYgKHUzMikweDAwMDBmZjAwVUwpIDw8ICA4KSB8IFwKKyAgICAoKCh1MzIpKHgpICYgKHUzMikweDAwZmYwMDAwVUwpID4+ICA4KSB8IFwKKyAgICAoKCh1MzIpKHgpICYgKHUzMikweGZmMDAwMDAwVUwpID4+IDI0KSApKQogCiAjZGVmaW5lIFNXQVA2NCh4KSBcCi0gICAgKChVSU5UNjQpKCBcCi0gICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDAwMDAwMDAwMGZmVUxMKSA8PCA1NikgfCBcCi0gICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDAwMDAwMDBmZjAwVUxMKSA8PCA0MCkgfCBcCi0gICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDAwMDAwZmYwMDAwVUxMKSA8PCAyNCkgfCBcCi0gICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDAwMGZmMDAwMDAwVUxMKSA8PCAgOCkgfCBcCi0gICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDBmZjAwMDAwMDAwVUxMKSA+PiAgOCkgfCBcCi0gICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwZmYwMDAwMDAwMDAwVUxMKSA+PiAyNCkgfCBcCi0gICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMGZmMDAwMDAwMDAwMDAwVUxMKSA+PiA0MCkgfCBcCi0gICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHhmZjAwMDAwMDAwMDAwMDAwVUxMKSA+PiA1NikgKSkKKyAgICAoKHU2NCkoIFwKKyAgICAodTY0KSgoKHU2NCkoeCkgJiAodTY0KTB4MDAwMDAwMDAwMDAwMDBmZlVMTCkgPDwgNTYpIHwgXAorICAgICh1NjQpKCgodTY0KSh4KSAmICh1NjQpMHgwMDAwMDAwMDAwMDBmZjAwVUxMKSA8PCA0MCkgfCBcCisgICAgKHU2NCkoKCh1NjQpKHgpICYgKHU2NCkweDAwMDAwMDAwMDBmZjAwMDBVTEwpIDw8IDI0KSB8IFwKKyAgICAodTY0KSgoKHU2NCkoeCkgJiAodTY0KTB4MDAwMDAwMDBmZjAwMDAwMFVMTCkgPDwgIDgpIHwgXAorICAgICh1NjQpKCgodTY0KSh4KSAmICh1NjQpMHgwMDAwMDBmZjAwMDAwMDAwVUxMKSA+PiAgOCkgfCBcCisgICAgKHU2NCkoKCh1NjQpKHgpICYgKHU2NCkweDAwMDBmZjAwMDAwMDAwMDBVTEwpID4+IDI0KSB8IFwKKyAgICAodTY0KSgoKHU2NCkoeCkgJiAodTY0KTB4MDBmZjAwMDAwMDAwMDAwMFVMTCkgPj4gNDApIHwgXAorICAgICh1NjQpKCgodTY0KSh4KSAmICh1NjQpMHhmZjAwMDAwMDAwMDAwMDAwVUxMKSA+PiA1NikgKSkKIAotI2RlZmluZSBjcHUybGU2NCh4KSAoKFVJTlQ2NCkoeCkpCi0jZGVmaW5lIGxlMmNwdTY0KHgpICgoVUlOVDY0KSh4KSkKLSNkZWZpbmUgY3B1MmxlMzIoeCkgKChVSU5UMzIpKHgpKQotI2RlZmluZSBsZTJjcHUzMih4KSAoKFVJTlQzMikoeCkpCi0jZGVmaW5lIGNwdTJsZTE2KHgpICgoVUlOVDE2KSh4KSkKLSNkZWZpbmUgbGUyY3B1MTYoeCkgKChVSU5UMTYpKHgpKQorI2RlZmluZSBjcHUybGU2NCh4KSAoKHU2NCkoeCkpCisjZGVmaW5lIGxlMmNwdTY0KHgpICgodTY0KSh4KSkKKyNkZWZpbmUgY3B1MmxlMzIoeCkgKCh1MzIpKHgpKQorI2RlZmluZSBsZTJjcHUzMih4KSAoKHUzMikoeCkpCisjZGVmaW5lIGNwdTJsZTE2KHgpICgodTE2KSh4KSkKKyNkZWZpbmUgbGUyY3B1MTYoeCkgKCh1MTYpKHgpKQogI2RlZmluZSBjcHUyYmU2NCh4KSBTV0FQNjQoKHgpKQogI2RlZmluZSBiZTJjcHU2NCh4KSBTV0FQNjQoKHgpKQogI2RlZmluZSBjcHUyYmUzMih4KSBTV0FQMzIoKHgpKQpAQCAtMTQ1OCw2ICsxMzkxLDM2IEBACiAjZGVmaW5lIGNwdTJiZTE2KHgpIFNXQVAxNigoeCkpCiAjZGVmaW5lIGJlMmNwdTE2KHgpIFNXQVAxNigoeCkpCiAKLSNlbmRpZiAgLy8gX19SVE1QX0RFRl9IX18KKyNkZWZpbmUgQUJTKF94LCBfeSkgKChfeCkgPiAoX3kpKSA/ICgoX3gpIC0oX3kpKSA6ICgoX3kpIC0oX3gpKQogCisjZGVmaW5lIEEyRGVjKF9YLCBfcCkJCQkJXAorewkJCQkJCQkJCVwKKwl1OCAqcDsJCQkJCQlcCisJX1ggPSAwOwkJCQkJCQlcCisJcCA9IF9wOwkJCQkJCQlcCisJd2hpbGUgKCgoKnAgPj0gJzAnKSAmJiAoKnAgPD0gJzknKSkpCQlcCisJewkJCQkJCQkJCQkJCVwKKwkJaWYgKCgqcCA+PSAnMCcpICYmICgqcCA8PSAnOScpKQkJXAorCQkJX1ggPSBfWCAqIDEwICsgKnAgLSA0ODsJCQkJCVwKKwkJcCsrOwkJCQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJCVwKK30KIAorI2RlZmluZSBBMkhleChfWCwgX3ApCQkJCVwKK2RvewkJCQkJCQkJCVwKKwljaGFyICpfX3A7CQkJCQkJXAorCShfWCkgPSAwOwkJCQkJCQlcCisJX19wID0gKGNoYXIgKikoX3ApOwkJCQkJCQlcCisJd2hpbGUgKCgoKl9fcCA+PSAnYScpICYmICgqX19wIDw9ICdmJykpIHx8ICgoKl9fcCA+PSAnQScpICYmICgqX19wIDw9ICdGJykpIHx8ICgoKl9fcCA+PSAnMCcpICYmICgqX19wIDw9ICc5JykpKQkJXAorCXsJCQkJCQkJCQkJCQlcCisJCWlmICgoKl9fcCA+PSAnYScpICYmICgqX19wIDw9ICdmJykpCQkJCVwKKwkJCShfWCkgPSAoX1gpICogMTYgKyAqX19wIC0gODc7CQkJCQlcCisJCWVsc2UgaWYgKCgqX19wID49ICdBJykgJiYgKCpfX3AgPD0gJ0YnKSkJCVwKKwkJCShfWCkgPSAoX1gpICogMTYgKyAqX19wIC0gNTU7CQkJCQlcCisJCWVsc2UgaWYgKCgqX19wID49ICcwJykgJiYgKCpfX3AgPD0gJzknKSkJCVwKKwkJCShfWCkgPSAoX1gpICogMTYgKyAqX19wIC0gNDg7CQkJCQlcCisJCV9fcCsrOwkJCQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJCVwKK313aGlsZSgwKQorCisjZW5kaWYgLyogX19SVE1QX0RFRl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9kb3QxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2RvdDExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4YWJkNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9kb3QxMS5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgX19ET1QxMV9CQVNFX0hfXworI2RlZmluZSBfX0RPVDExX0JBU0VfSF9fCisKKyNpbmNsdWRlICJydG1wX3R5cGUuaCIKKworLyogNC1ieXRlIEhUQyBmaWVsZC4gIG1heWJlIGluY2x1ZGVkIGluIGFueSBmcmFtZSBleGNlcHQgbm9uLVFPUyBkYXRhIGZyYW1lLiAgVGhlIE9yZGVyIGJpdCBtdXN0IHNldCAxLiAqLworc3RydWN0IFBBQ0tFRCBydF9odF9jb250cm9sIHsKKwl1MzIgTUE6MTsJCS8qbWFuYWdlbWVudCBhY3Rpb24gcGF5bG9hZCBleGlzdCBpbiAoUW9TIE51bGwrSFRDKSAqLworCXUzMiBUUlE6MTsJCS8qc291bmRpbmcgcmVxdWVzdCAqLworCXUzMiBNUlE6MTsJCS8qTUNTIGZlZWRiYWNrLiBSZXF1ZXN0IGZvciBhIE1DUyBmZWVkYmFjayAqLworCXUzMiBNUlNvckFTSTozOwkvKiBNUlEgU2VxdWVuY2UgaWRlbnRpZmllci4gdW5jaGFuZ2VkIGR1cmluZyBlbnRpcmUgcHJvY2VkdXJlLiAweDAwMC0weDExMC4gKi8KKwl1MzIgTUZTOjM7CQkvKlNFVCB0byB0aGUgcmVjZWl2ZWQgdmFsdWUgb2YgTVJTLiAweDExMSBmb3IgdW5zb2xpY2l0ZWQgTUZCLiAqLworCXUzMiBNRkJvckFTQzo3OwkvKkxpbmsgYWRhcHRhdGlvbiBmZWVkYmFjayBjb250YWluaW5nIHJlY29tbWVuZGVkIE1DUy4gMHg3ZiBmb3Igbm8gZmVlZGJhY2sgb3Igbm90IGF2YWlsYWJsZSAqLworCXUzMiBDYWxQb3M6MjsJLyogY2FsaWJyYXRpb24gcG9zaXRpb24gKi8KKwl1MzIgQ2FsU2VxOjI7CS8qY2FsaWJyYXRpb24gc2VxdWVuY2UgKi8KKwl1MzIgRkJLUmVxOjI7CS8qZmVlZGJhY2sgcmVxdWVzdCAqLworCXUzMiBDU0lTVEVFUklORzoyOwkvKkNTSS8gU1RFRVJJTkcgKi8KKwl1MzIgWkxGQW5ub3VjZToxOwkvKiBaTEYgYW5ub3VuY2VtZW50ICovCisJdTMyIHJzdjo1OwkJLypjYWxpYnJhdGlvbiBzZXF1ZW5jZSAqLworCXUzMiBBQ0NvbnN0cmFpbnQ6MTsJLypmZWVkYmFjayByZXF1ZXN0ICovCisJdTMyIFJERzoxOwkJLypSREcgLyBNb3JlIFBQRFUgKi8KK307CisKKy8qIDItYnl0ZSBRT1MgQ09OVFJPTCBmaWVsZCAqLworc3RydWN0IFBBQ0tFRCBydF9xb3NfY29udHJvbCB7CisJdTE2IFRJRDo0OworCXUxNiBFT1NQOjE7CisJdTE2IEFja1BvbGljeToyOwkvKjA6IG5vcm1hbCBBQ0sgMTpObyBBQ0sgMjpzY2hlZHVsZWQgdW5kZXIgTVRCQS9QU01QICAzOiBCQSAqLworCXUxNiBBTXNkdVByZXNlbnQ6MTsKKwl1MTYgVHhvcF9RdWV1ZVNpemU6ODsKK307CisKKy8qIDItYnl0ZSBGcmFtZSBjb250cm9sIGZpZWxkICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX2NvbnRyb2wgeworCXUxNiBWZXI6MjsJCS8qIFByb3RvY29sIHZlcnNpb24gKi8KKwl1MTYgVHlwZToyOwkJLyogTVNEVSB0eXBlICovCisJdTE2IFN1YlR5cGU6NDsJLyogTVNEVSBzdWJ0eXBlICovCisJdTE2IFRvRHM6MTsJCS8qIFRvIERTIGluZGljYXRpb24gKi8KKwl1MTYgRnJEczoxOwkJLyogRnJvbSBEUyBpbmRpY2F0aW9uICovCisJdTE2IE1vcmVGcmFnOjE7CS8qIE1vcmUgZnJhZ21lbnQgYml0ICovCisJdTE2IFJldHJ5OjE7CQkvKiBSZXRyeSBzdGF0dXMgYml0ICovCisJdTE2IFB3ck1nbXQ6MTsJLyogUG93ZXIgbWFuYWdlbWVudCBiaXQgKi8KKwl1MTYgTW9yZURhdGE6MTsJLyogTW9yZSBkYXRhIGJpdCAqLworCXUxNiBXZXA6MTsJCS8qIFdlcCBkYXRhICovCisJdTE2IE9yZGVyOjE7CQkvKiBTdHJpY3Qgb3JkZXIgZXhwZWN0ZWQgKi8KK307CisKK3N0cnVjdCBQQUNLRUQgcnRfaGVhZGVyXzgwMl8xMSB7CisJc3RydWN0IHJ0X2ZyYW1lX2NvbnRyb2wgRkM7CisJdTE2IER1cmF0aW9uOworCXU4IEFkZHIxW01BQ19BRERSX0xFTl07CisJdTggQWRkcjJbTUFDX0FERFJfTEVOXTsKKwl1OCBBZGRyM1tNQUNfQUREUl9MRU5dOworCXUxNiBGcmFnOjQ7CisJdTE2IFNlcXVlbmNlOjEyOworCXU4IE9jdGV0WzBdOworfTsKKworc3RydWN0IFBBQ0tFRCBydF9wc3BvbGxfZnJhbWUgeworCXN0cnVjdCBydF9mcmFtZV9jb250cm9sIEZDOworCXUxNiBBaWQ7CisJdTggQnNzaWRbTUFDX0FERFJfTEVOXTsKKwl1OCBUYVtNQUNfQUREUl9MRU5dOworfTsKKworc3RydWN0IFBBQ0tFRCBydF9ydHNfZnJhbWUgeworCXN0cnVjdCBydF9mcmFtZV9jb250cm9sIEZDOworCXUxNiBEdXJhdGlvbjsKKwl1OCBBZGRyMVtNQUNfQUREUl9MRU5dOworCXU4IEFkZHIyW01BQ19BRERSX0xFTl07Cit9OworCisjZW5kaWYgLyogX19ET1QxMV9CQVNFX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2lmYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfaWZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDhjMDU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2lmYWNlLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKwlydF9pZmFjZS5oCisKKyAgICBBYnN0cmFjdDoKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIF9fUlRNUF9JRkFDRV9IX18KKyNkZWZpbmUgX19SVE1QX0lGQUNFX0hfXworCisjaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAorI2luY2x1ZGUgImlmYWNlL3J0bXBfcGNpLmgiCisjZW5kaWYgLyogUlRNUF9QQ0lfU1VQUE9SVCAvLyAqLworI2lmZGVmIFJUTVBfVVNCX1NVUFBPUlQKKyNpbmNsdWRlICJpZmFjZS9ydG1wX3VzYi5oIgorI2VuZGlmIC8qIFJUTVBfVVNCX1NVUFBPUlQgLy8gKi8KKworc3RydWN0IHJ0X2luZl9wY2lfY29uZmlnIHsKKwl1bnNpZ25lZCBsb25nIENTUkJhc2VBZGRyZXNzOwkvKiBQQ0kgTU1JTyBCYXNlIEFkZHJlc3MsIGFsbCBhY2Nlc3Mgd2lsbCB1c2UgKi8KKwl1bnNpZ25lZCBpbnQgaXJxX251bTsKK307CisKK3N0cnVjdCBydF9pbmZfdXNiX2NvbmZpZyB7CisJdTggQnVsa0luRXBBZGRyOwkvKiBidWxrLWluIGVuZHBvaW50IGFkZHJlc3MgKi8KKwl1OCBCdWxrT3V0RXBBZGRyWzZdOwkvKiBidWxrLW91dCBlbmRwb2ludCBhZGRyZXNzICovCit9OworCitzdHJ1Y3QgcnRfaW5mX3JidXNfY29uZmlnIHsKKwl1bnNpZ25lZCBsb25nIGNzcl9hZGRyOworCXVuc2lnbmVkIGludCBpcnE7Cit9OworCit0eXBlZGVmIGVudW0gX1JUTVBfSU5GX1RZUEVfIHsKKwlSVE1QX0RFVl9JTkZfVU5LTk9XTiA9IDAsCisJUlRNUF9ERVZfSU5GX1BDSSA9IDEsCisJUlRNUF9ERVZfSU5GX1VTQiA9IDIsCisJUlRNUF9ERVZfSU5GX1JCVVMgPSA0LAorfSBSVE1QX0lORl9UWVBFOworCit0eXBlZGVmIHVuaW9uIF9SVE1QX0lORl9DT05GSUdfIHsKKwlzdHJ1Y3QgcnRfaW5mX3BjaV9jb25maWcgcGNpQ29uZmlnOworCXN0cnVjdCBydF9pbmZfdXNiX2NvbmZpZyB1c2JDb25maWc7CisJc3RydWN0IHJ0X2luZl9yYnVzX2NvbmZpZyByYnVzQ29uZmlnOworfSBSVE1QX0lORl9DT05GSUc7CisKKyNlbmRpZiAvKiBfX1JUTVBfSUZBQ0VfSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfbWN1LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfbWN1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5ODdlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9tY3UuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0bXBfbWN1LmgKKworCUFic3RyYWN0OgorCU1pbmlwb3J0IGhlYWRlciBmaWxlIGZvciBtY3UgcmVsYXRlZCBpbmZvcm1hdGlvbgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19SVE1QX01DVV9IX18KKyNkZWZpbmUgX19SVE1QX01DVV9IX18KKworaW50IFJ0bXBBc2ljRXJhc2VGaXJtd2FyZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworCitpbnQgUnRtcEFzaWNMb2FkRmlybXdhcmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKKworaW50IFJ0bXBBc2ljU2VuZENvbW1hbmRUb01jdShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHU4IENvbW1hbmQsCisJCQkgICAgIHU4IFRva2VuLCB1OCBBcmcwLCB1OCBBcmcxKTsKKworI2VuZGlmIC8qIF9fUlRNUF9NQ1VfSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfb3MuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9vcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YzMwYzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfb3MuaApAQCAtMCwwICsxLDkwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorCXJ0bXBfb3MuaAorCisgICAgQWJzdHJhY3Q6CisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBfX1JUTVBfT1NfSF9fCisjZGVmaW5lIF9fUlRNUF9PU19IX18KKworI2lmZGVmIExJTlVYCisjaW5jbHVkZSAicnRfbGludXguaCIKKyNlbmRpZiAvKiBMSU5VWCAvLyAqLworCisvKgorCVRoaXMgZGF0YSBzdHJ1Y3R1cmUgbWFpbmx5IHN0cmlwIHNvbWUgY2FsbGJhY2sgZnVuY3Rpb24gZGVmaW5lZCBpbgorCSJzdHJ1Y3QgbmV0X2RldmljZSIgaW4ga2VybmVsIHNvdXJjZSAiaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCIuCisKKwlUaGUgZGVmaW5pdGlvbiBvZiB0aGlzIGRhdGEgc3RydWN0dXJlIG1heSB2YXJpb3VzIGRlcGVuZHMgb24gZGlmZmVyZW50CisJT1MuIFVzZSBpdCBjYXJlZnVsbHkuCisqLworc3RydWN0IHJ0X3J0bXBfb3NfbmV0ZGV2X29wX2hvb2sgeworCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqbmV0ZGV2X29wczsKKwl2b2lkICpwcml2OworCWludCBwcml2X2ZsYWdzOworCXVuc2lnbmVkIGNoYXIgZGV2QWRkcls2XTsKKwl1bnNpZ25lZCBjaGFyIGRldk5hbWVbMTZdOworCXVuc2lnbmVkIGNoYXIgbmVlZFByb3RjdGVkOworfTsKKwordHlwZWRlZiBlbnVtIF9SVE1QX1RBU0tfU1RBVFVTXyB7CisJUlRNUF9UQVNLX1NUQVRfVU5LTk9XTiA9IDAsCisJUlRNUF9UQVNLX1NUQVRfSU5JVEVEID0gMSwKKwlSVE1QX1RBU0tfU1RBVF9SVU5OSU5HID0gMiwKKwlSVE1QX1RBU0tfU1RBVF9TVE9QRUQgPSA0LAorfSBSVE1QX1RBU0tfU1RBVFVTOworI2RlZmluZSBSVE1QX1RBU0tfQ0FOX0RPX0lOU0VSVAkJKFJUTVBfVEFTS19TVEFUX0lOSVRFRCB8UlRNUF9UQVNLX1NUQVRfUlVOTklORykKKworI2RlZmluZSBSVE1QX09TX1RBU0tfTkFNRV9MRU4JMTYKK3N0cnVjdCBydF9ydG1wX29zX3Rhc2sgeworCWNoYXIgdGFza05hbWVbUlRNUF9PU19UQVNLX05BTUVfTEVOXTsKKwl2b2lkICpwcml2OworCS8qdW5zaWduZWQgbG9uZyAgICAgICAgIHRhc2tGbGFnczsgKi8KKwlSVE1QX1RBU0tfU1RBVFVTIHRhc2tTdGF0dXM7CisjaWZuZGVmIEtUSFJFQURfU1VQUE9SVAorCXN0cnVjdCBzZW1hcGhvcmUgdGFza1NlbWE7CisJc3RydWN0IHBpZCAqdGFza1BJRDsKKwlzdHJ1Y3QgY29tcGxldGlvbiB0YXNrQ29tcGxldGU7CisjZW5kaWYKKwl1bnNpZ25lZCBjaGFyIHRhc2tfa2lsbGVkOworI2lmZGVmIEtUSFJFQURfU1VQUE9SVAorCXN0cnVjdCB0YXNrX3N0cnVjdCAqa3RocmVhZF90YXNrOworCXdhaXRfcXVldWVfaGVhZF90IGt0aHJlYWRfcTsKKwlCT09MRUFOIGt0aHJlYWRfcnVubmluZzsKKyNlbmRpZgorfTsKKworaW50IFJ0bXBPU0lSUVJlcXVlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYpOworaW50IFJ0bXBPU0lSUVJlbGVhc2Uoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYpOworCisjZW5kaWYgLyogX19STVRQX09TX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3RpbWVyLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGI4YWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3RpbWVyLmgKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisJcnRtcF90aW1lci5oCisKKyAgICBBYnN0cmFjdDoKKwlSYWxpbmsgV2lyZWxlc3MgRHJpdmVyIHRpbWVyIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBkZWxjYXJhdGlvbnMKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisJV2hvICAgICAgICAgICBXaGVuICAgICAgICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUgICAgICAgICAgRGF0ZSAgICAgICAgICAgICAgICAgTW9kaWZpY2F0aW9uIGxvZ3MKKwlTaGlhbmcgVHUgICAgQXVnLTI4LTIwMDgJaW5pdCB2ZXJzaW9uCisKKyovCisKKyNpZm5kZWYgX19SVE1QX1RJTUVSX0hfXworI2RlZmluZSAgX19SVE1QX1RJTUVSX0hfXworCisjaW5jbHVkZSAicnRtcF9vcy5oIgorCisjZGVmaW5lIERFQ0xBUkVfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJXAorCXZvaWQgcnRtcF90aW1lcl8jI19mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkKKworI2RlZmluZSBHRVRfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJCVwKKwlydG1wX3RpbWVyXyMjX2Z1bmMKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gVGltZXIgUmVsYXRlZCBNQVJDTyAtLS0tLS0tLS0tLS0tLS0qLworLyogSW4gc29tZSBvcyBvciBjaGlwc2V0LCB3ZSBoYXZlIGEgbG90IG9mIHRpbWVyIGZ1bmN0aW9ucyBhbmQgd2lsbCByZWFkL3dyaXRlIHJlZ2lzdGVyLCAqLworLyogICBpdCdzIG5vdCBhbGxvd2VkIGluIExpbnV4IFVTQiBzdWItc3lzdGVtIHRvIGRvIGl0ICggYmVjYXVzZSBvZiBzbGVlcCBpc3N1ZSB3aGVuICovCisvKiAgc3VibWl0IHRvIGN0cmwgcGlwZSkuIFNvIHdlIG5lZWQgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHRha2UgY2FyZSBpdC4gKi8KKworI2lmZGVmIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUCit0eXBlZGVmIHZvaWQoKlJUTVBfVElNRVJfVEFTS19IQU5ETEUpICh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCQkJICAgICAgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJCQkgICAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLAorCQkJCSAgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOworI2VuZGlmIC8qIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vICovCisKK3N0cnVjdCBydF9yYWxpbmtfdGltZXIgeworCXN0cnVjdCB0aW1lcl9saXN0IFRpbWVyT2JqOwkvKiBOZGlzIFRpbWVyIG9iamVjdCAqLworCUJPT0xFQU4gVmFsaWQ7CQkvKiBTZXQgdG8gVHJ1ZSB3aGVuIGNhbGwgUlRNUEluaXRUaW1lciAqLworCUJPT0xFQU4gU3RhdGU7CQkvKiBUcnVlIGlmIHRpbWVyIGNhbmNlbGxlZCAqLworCUJPT0xFQU4gUGVyaW9kaWNUeXBlOwkvKiBUcnVlIGlmIHRpbWVyIGlzIHBlcmlvZGljIHRpbWVyICovCisJQk9PTEVBTiBSZXBlYXQ7CQkvKiBUcnVlIGlmIHBlcmlvZGljIHRpbWVyICovCisJdW5zaWduZWQgbG9uZyBUaW1lclZhbHVlOwkvKiBUaW1lciB2YWx1ZSBpbiBtaWxsaXNlY29uZHMgKi8KKwl1bnNpZ25lZCBsb25nIGNvb2tpZTsJCS8qIG9zIHNwZWNpZmljIG9iamVjdCAqLworI2lmZGVmIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUCisJUlRNUF9USU1FUl9UQVNLX0hBTkRMRSBoYW5kbGU7CisJdm9pZCAqcEFkOworI2VuZGlmCQkJCS8qIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vICovCit9OworCisjaWZkZWYgUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQKK3N0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfZW50cnkgeworCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgKnBSYVRpbWVyOworCXN0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfZW50cnkgKnBOZXh0OworfTsKKworI2RlZmluZSBUSU1FUl9RVUVVRV9TSVpFX01BWAkxMjgKK3N0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfcXVldWUgeworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJdW5zaWduZWQgY2hhciAqcFRpbWVyUVBvbGw7CisJc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19lbnRyeSAqcFFQb2xsRnJlZUxpc3Q7CisJc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19lbnRyeSAqcFFIZWFkOworCXN0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfZW50cnkgKnBRVGFpbDsKK307CisKKyNkZWZpbmUgQlVJTERfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJCQkJCQkJCVwKK3ZvaWQgcnRtcF90aW1lcl8jI19mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCQlcCisJc3RydWN0IHJ0X3JhbGlua190aW1lciAqX3BUaW1lciA9IChzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyICopZGF0YTsJCQkJXAorCXN0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfZW50cnkgKl9wUU5vZGU7CQkJCQkJCQkJCVwKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpfcEFkOwkJCQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlfcFRpbWVyLT5oYW5kbGUgPSBfZnVuYzsJCQkJCQkJCQkJCQkJXAorCV9wQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKV9wVGltZXItPnBBZDsJCQkJCQkJCQkJXAorCV9wUU5vZGUgPSBSdG1wVGltZXJRSW5zZXJ0KF9wQWQsIF9wVGltZXIpOwkJCQkJCQkJXAorCWlmICgoX3BRTm9kZSA9PSBOVUxMKSAmJiAoX3BBZC0+VGltZXJRLnN0YXR1cyAmIFJUTVBfVEFTS19DQU5fRE9fSU5TRVJUKSkJXAorCQlSVE1QX09TX0FkZF9UaW1lcigmX3BUaW1lci0+VGltZXJPYmosIE9TX0haKTsJCQkJCQkJXAorfQorI2Vsc2UKKyNkZWZpbmUgQlVJTERfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJCQkJCQkJCVwKK3ZvaWQgcnRtcF90aW1lcl8jI19mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCQlcCisJc3RydWN0IHJ0X3JhbGlua190aW1lciAqcFRpbWVyID0gKHN0cnVjdCBydF9yYWxpbmtfdGltZXIgKilkYXRhOwkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQkJXAorCV9mdW5jKE5VTEwsICh2b2lkICopcFRpbWVyLT5jb29raWUsIE5VTEwsIHBUaW1lcik7CQkJCQkJCVwKKwlpZiAocFRpbWVyLT5SZXBlYXQpCQkJCQkJCQkJCQkJCQlcCisJCVJUTVBfT1NfQWRkX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBwVGltZXItPlRpbWVyVmFsdWUpOwkJCVwKK30KKyNlbmRpZiAvKiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLyAqLworCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKE1sbWVQZXJpb2RpY0V4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihNbG1lUnNzaVJlcG9ydEV4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEFQU0RQZXJpb2RpY0V4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihBc2ljUmZUdW5pbmdFeGVjKTsKKyNpZmRlZiBSVE1QX01BQ19VU0IKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQmVhY29uVXBkYXRlRXhlYyk7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQmVhY29uVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXV0aFRpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKERpc2Fzc29jVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKExpbmtEb3duRXhlYyk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYyk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFBzUG9sbFdha2VFeGVjKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oUmFkaW9PbkV4ZWMpOworCisjaWZkZWYgUlRNUF9NQUNfVVNCCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFJ0bXBVc2JTdGFBc2ljRm9yY2VXYWtldXBUaW1lb3V0KTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworI2lmIGRlZmluZWQoQVBfTEVEKSB8fCBkZWZpbmVkKFNUQV9MRUQpCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKExlZEN0cmxNYWluKTsKKyNlbmRpZgorCisjZW5kaWYgLyogX19SVE1QX1RJTUVSX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3R5cGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF90eXBlLmgKaW5kZXggMWZkN2RmMS4uZDliYjJkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3R5cGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfdHlwZS5oCkBAIC0zOCw1NyArMzgsNTIgQEAKICNpZm5kZWYgX19SVE1QX1RZUEVfSF9fCiAjZGVmaW5lIF9fUlRNUF9UWVBFX0hfXwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogI2RlZmluZSBQQUNLRUQgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQogCi0vLyBQdXQgcGxhdGZvcm0gZGVwZW5kZW50IGRlY2xhcmF0aW9uIGhlcmUKLS8vIEZvciBleGFtcGxlLCBsaW51eCB0eXBlIGRlZmluaXRpb24KLXR5cGVkZWYgdW5zaWduZWQgY2hhcgkJVUlOVDg7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlVSU5UMTY7Ci10eXBlZGVmIHVuc2lnbmVkIGludAkJVUlOVDMyOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJVUlOVDY0OwotdHlwZWRlZiBpbnQJCQkJCUlOVDMyOwotdHlwZWRlZiBsb25nIGxvbmcgCQkJSU5UNjQ7Ci0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAqCQkJUFVJTlQ4OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAqCQlQVUlOVDE2OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgKgkJCVBVSU5UMzI7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAqCVBVSU5UNjQ7Ci10eXBlZGVmIGludAkqCQkJCQlQSU5UMzI7Ci10eXBlZGVmIGxvbmcgbG9uZyAqIAkJCVBJTlQ2NDsKLQotdHlwZWRlZiBzaWduZWQgY2hhcgkJCUNIQVI7Ci10eXBlZGVmIHNpZ25lZCBzaG9ydAkJU0hPUlQ7Ci10eXBlZGVmIHNpZ25lZCBpbnQJCQlJTlQ7Ci10eXBlZGVmIHNpZ25lZCBsb25nCQkJTE9ORzsKLXR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZwlMT05HTE9ORzsKLQotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIJCVVDSEFSOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJVVNIT1JUOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQJCVVJTlQ7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcJCVVMT05HOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJVUxPTkdMT05HOwotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIJCUJPT0xFQU47Ci10eXBlZGVmIHZvaWQJCQkJVk9JRDsKLQotdHlwZWRlZiBWT0lEICoJCQkJUFZPSUQ7Ci10eXBlZGVmIENIQVIgKgkJCQlQQ0hBUjsKLXR5cGVkZWYgVUNIQVIgKiAJCQlQVUNIQVI7Ci10eXBlZGVmIFVTSE9SVCAqCQkJUFVTSE9SVDsKLXR5cGVkZWYgTE9ORyAqCQkJCVBMT05HOwotdHlwZWRlZiBVTE9ORyAqCQkJCVBVTE9ORzsKLXR5cGVkZWYgVUlOVCAqCQkJCVBVSU5UOwotCi10eXBlZGVmIHVuc2lnbmVkIGludAlORElTX01FRElBX1NUQVRFOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEJPT0xFQU47CiAKIHR5cGVkZWYgdW5pb24gX0xBUkdFX0lOVEVHRVIgewotICAgIHN0cnVjdCB7Ci0gICAgICAgIFVJTlQgTG93UGFydDsKLSAgICAgICAgSU5UMzIgSGlnaFBhcnQ7Ci0gICAgfSB1OwotICAgIElOVDY0IFF1YWRQYXJ0OworCXN0cnVjdCB7CisJCXUzMiBMb3dQYXJ0OworCQlpbnQgSGlnaFBhcnQ7CisJfSB1OworCWxvbmcgbG9uZyBRdWFkUGFydDsKIH0gTEFSR0VfSU5URUdFUjsKIAotI2VuZGlmICAvLyBfX1JUTVBfVFlQRV9IX18KKy8qICovCisvKiBSZWdpc3RlciBzZXQgcGFpciBmb3IgaW5pdGlhbHphdGlvbiByZWdpc3RlciBzZXQgZGVmaW5pdGlvbiAqLworLyogKi8KK3N0cnVjdCBydF9ydG1wX3JlZ19wYWlyIHsKKwl1bnNpZ25lZCBsb25nIFJlZ2lzdGVyOworCXVuc2lnbmVkIGxvbmcgVmFsdWU7Cit9OwogCitzdHJ1Y3QgcnRfcmVnX3BhaXIgeworCXU4IFJlZ2lzdGVyOworCXU4IFZhbHVlOworfTsKKworLyogKi8KKy8qIFJlZ2lzdGVyIHNldCBwYWlyIGZvciBpbml0aWFsemF0aW9uIHJlZ2lzdGVyIHNldCBkZWZpbml0aW9uICovCisvKiAqLworc3RydWN0IHJ0X3J0bXBfcmZfcmVncyB7CisJdTggQ2hhbm5lbDsKKwl1bnNpZ25lZCBsb25nIFIxOworCXVuc2lnbmVkIGxvbmcgUjI7CisJdW5zaWduZWQgbG9uZyBSMzsKKwl1bnNpZ25lZCBsb25nIFI0OworfTsKKworc3RydWN0IHJ0X2ZyZXF1ZW5jeV9pdGVtIHsKKwl1OCBDaGFubmVsOworCXU4IE47CisJdTggUjsKKwl1OCBLOworfTsKKworI2RlZmluZSBTVEFUVVNfU1VDQ0VTUwkJCQkweDAwCisjZGVmaW5lIFNUQVRVU19VTlNVQ0NFU1NGVUwJCTB4MDEKKworI2VuZGlmIC8qIF9fUlRNUF9UWVBFX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydHVzYl9pby5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydHVzYl9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YTJmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0dXNiX2lvLmgKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBfX1JUVVNCX0lPX0hfXworI2RlZmluZSBfX1JUVVNCX0lPX0hfXworCisjaW5jbHVkZSAicnRtcF90eXBlLmgiCisKKy8qIE5ldyBmb3IgTWVldGluZ0hvdXNlIEFwaSBzdXBwb3J0ICovCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDEwMQkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9VTlBMVUcgICAgICAgICAgICAgICAgICAgICAweDBENzMwMTAyCS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1NXSVRDSF9GVU5DVElPTiAgICAgICAgICAgIDB4MEQ3MzAxMDMJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9NVUxUSV9XUklURV9NQUMgICAgICAgICAgICAgICAgICAgMHgwRDczMDEwNwkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX01VTFRJX1JFQURfTUFDICAgICAgICAgICAgICAgICAgICAweDBENzMwMTA4CS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfVkVORE9SX0VFUFJPTV9XUklURSAgICAgICAgICAgICAgIDB4MEQ3MzAxMEEJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfRUVQUk9NX1JFQUQgICAgICAgICAgICAgICAgMHgwRDczMDEwQgkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9FTlRFUl9URVNUTU9ERSAgICAgICAgICAgICAweDBENzMwMTBDCS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfVkVORE9SX0VYSVRfVEVTVE1PREUgICAgICAgICAgICAgIDB4MEQ3MzAxMEQJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfV1JJVEVfQkJQICAgICAgICAgICAgICAgICAgMHgwRDczMDExOQkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9SRUFEX0JCUCAgICAgICAgICAgICAgICAgICAweDBENzMwMTE4CS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1dSSVRFX1JGICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMUEJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfRkxJUF9JUSAgICAgICAgICAgICAgICAgICAgMHgwRDczMDExRAkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUICAgICAgICAgICAgICAgICAgICAweDBENzMwMjEwCS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfUkVTRVRfQlVMS19JTiAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTEJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9TRVRfUFNNX0JJVAkJCQkweDBENzMwMjEyCS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfU0VUX1JBRElPICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTQJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9VUERBVEVfVFhfUkFURSAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxNgkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9BRERfS0VZX1dFUCAgICAgICAgICAgICAgICAweDBENzMwMjE4CS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfUkVTRVRfRlJPTV9FUlJPUiAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMUEJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9MSU5LX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxQgkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1JFU0VUX0ZST01fTkRJUyAgICAgICAgICAgICAgICAgICAweDBENzMwMjFDCS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfQ0hFQ0tfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTUJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9GT1JDRV9XQUtFX1VQICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIyMgkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1NFVF9CVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBENzMwMjI1CS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfU0VUX0FTSUNfV0NJRCAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMjYJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEX0NJUEhFUiAgICAgICAgICAgICAgMHgwRDczMDIyNwkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1FLRVJJT0RJQ19FWEVDVVQgICAgICAgICAgICAgICAgICAweDBENzMwMjNECS8qIGNtZCAqLworI2RlZmluZSBSVF9DTURfU0VUX0tFWV9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMjgJLyogY21kICovCisjZGVmaW5lIFJUX0NNRF9TRVRfUlhfV0NJRF9UQUJMRSAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIyOQkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1NFVF9DTElFTlRfTUFDX0VOVFJZICAgICAgICAgICAgICAweDBENzMwMjNFCS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfU0VUX0dST1VQX0tFWQkJCQkJCTB4MEQ3MzAyM0YJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9TRVRfUEFJUldJU0VfS0VZCQkJCQkweDBENzMwMjQwCS8qIGNtZCAqLworCisjZGVmaW5lIENNRFRIUkVBRF84MDJfMTFfUVVFUllfSEFSRFdBUkVfUkVHSVNURVIgICAgMHgwRDcxMDEwNQkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9TRVRfUEhZX01PREUgICAgICAgICAgICAgICAweDBENzkwMTBDCS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfODAyXzExX1NFVF9TVEFfQ09ORklHICAgICAgICAgICAgIDB4MEQ3OTAxMTEJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF84MDJfMTFfU0VUX1BSRUFNQkxFICAgICAgICAgICAgICAgMHgwRDc5MDEwMQkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9DT1VOVEVSX01FQVNVUkUJCQkweDBENzkwMTAyCS8qIGNtZCAqLworLyogYWRkIGJ5IGpvaG5saSwgZml4ICJpbl9pbnRlcnJ1cHQiIGVycm9yIHdoZW4gY2FsbCAiTWFjVGFibGVEZWxldGVFbnRyeSIgaW4gUnggdGFza2xldCAqLworI2RlZmluZSBDTURUSFJFQURfVVBEQVRFX1BST1RFQ1QJCQkJCTB4MEQ3OTAxMDMJLyogY21kICovCisvKiBlbmQgam9obmxpICovCisKKy8qQ01EVEhSRUFEX01VTFRJX1JFQURfTUFDICovCisvKkNNRFRIUkVBRF9NVUxUSV9XUklURV9NQUMgKi8KKy8qQ01EVEhSRUFEX1ZFTkRPUl9FRVBST01fUkVBRCAqLworLypDTURUSFJFQURfVkVORE9SX0VFUFJPTV9XUklURSAqLworc3RydWN0IHJ0X2NtZGhhbmRsZXJfdGx2IHsKKwl1MTYgT2Zmc2V0OworCXUxNiBMZW5ndGg7CisJdTggRGF0YUZpcnN0OworfTsKKworc3RydWN0IHJ0X2NtZHFlbG10OworCitzdHJ1Y3QgcnRfY21kcWVsbXQgeworCXUzMiBjb21tYW5kOworCXZvaWQgKmJ1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcmxlbmd0aDsKKwlCT09MRUFOIENtZEZyb21OZGlzOworCUJPT0xFQU4gU2V0T3BlcmF0aW9uOworCXN0cnVjdCBydF9jbWRxZWxtdCAqbmV4dDsKK307CisKK3N0cnVjdCBydF9jbWRxIHsKKwl1MzIgc2l6ZTsKKwlzdHJ1Y3QgcnRfY21kcWVsbXQgKmhlYWQ7CisJc3RydWN0IHJ0X2NtZHFlbG10ICp0YWlsOworCXUzMiBDbWRRU3RhdGU7Cit9OworCisjZGVmaW5lIEVucXVldWVDbWQoY21kcSwgY21kcWVsbXQpCQlcCit7CQkJCQkJCQkJCVwKKwlpZiAoY21kcS0+c2l6ZSA9PSAwKQkJCQlcCisJCWNtZHEtPmhlYWQgPSBjbWRxZWxtdDsJCQlcCisJZWxzZQkJCQkJCQkJXAorCQljbWRxLT50YWlsLT5uZXh0ID0gY21kcWVsbXQ7CVwKKwljbWRxLT50YWlsID0gY21kcWVsbXQ7CQkJCVwKKwljbWRxZWxtdC0+bmV4dCA9IE5VTEw7CQkJCVwKKwljbWRxLT5zaXplKys7CQkJCQkJXAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlVU0IgQ21kIHRvIEFTSUMgUmVsYXRlZCBNQUNSTworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiByZXNldCBNQUMgb2YgYSBzdGF0aW9uIGVudHJ5IHRvIDB4RkZGRkZGRkZGRkZGICovCisjZGVmaW5lIFJUTVBfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIFdjaWQpCQkJCQlcCisJewlzdHJ1Y3QgcnRfc2V0X2FzaWNfd2NpZAlTZXRBc2ljV2NpZDsJCQkJCQlcCisJCVNldEFzaWNXY2lkLldDSUQgPSBXY2lkOwkJCQkJCQkJXAorCQlTZXRBc2ljV2NpZC5TZXRUaWQgPSAweGZmZmZmZmZmOwkJCQkJCVwKKwkJU2V0QXNpY1djaWQuRGVsZXRlVGlkID0gMHhmZmZmZmZmZjsJCQkJCQlcCisJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSUQsCVwKKwkJCQkmU2V0QXNpY1djaWQsIHNpemVvZihzdHJ1Y3QgcnRfc2V0X2FzaWNfd2NpZCkpOwl9CisKKy8qIGFkZCB0aGlzIGVudHJ5IGludG8gQVNJQyBSWCBXQ0lEIHNlYXJjaCB0YWJsZSAqLworI2RlZmluZSBSVE1QX1NUQV9FTlRSWV9BREQocEFkLCBwRW50cnkpCQkJCQkJCVwKKwlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9TRVRfQ0xJRU5UX01BQ19FTlRSWSwJXAorCQkJCQkJCXBFbnRyeSwgc2l6ZW9mKHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkpKTsKKworLyogYWRkIGJ5IGpvaG5saSwgZml4ICJpbl9pbnRlcnJ1cHQiIGVycm9yIHdoZW4gY2FsbCAiTWFjVGFibGVEZWxldGVFbnRyeSIgaW4gUnggdGFza2xldCAqLworLyogU2V0IE1BQyByZWdpc3RlciB2YWx1ZSBhY2NvcmRpbmcgb3BlcmF0aW9uIG1vZGUgKi8KKyNkZWZpbmUgUlRNUF9VUERBVEVfUFJPVEVDVChwQWQpCVwKKwlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9VUERBVEVfUFJPVEVDVCwgTlVMTCwgMCk7CisvKiBlbmQgam9obmxpICovCisKKy8qIHJlbW92ZSBQYWlyLXdpc2Uga2V5IG1hdGVyaWFsIGZyb20gQVNJQyAqLworLyogeWV0IGltcGxlbWVudCAqLworI2RlZmluZSBSVE1QX1NUQV9FTlRSWV9LRVlfREVMKHBBZCwgQnNzSWR4LCBXY2lkKQorCisvKiBhZGQgQ2xpZW50IHNlY3VyaXR5IGluZm9ybWF0aW9uIGludG8gQVNJQyBXQ0lEIHRhYmxlIGFuZCBJVkVJViB0YWJsZSAqLworI2RlZmluZSBSVE1QX1NUQV9TRUNVUklUWV9JTkZPX0FERChwQWQsIGFwaWR4LCBLZXlJRCwgcEVudHJ5KQkJCQkJCVwKKwl7CVJUTVBfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIHBFbnRyeS0+QWlkKTsJCQkJCQkJCVwKKwkJaWYgKHBFbnRyeS0+QWlkID49IDEpIHsJCQkJCQkJCQkJCQkJCVwKKwkJCXN0cnVjdCBydF9zZXRfYXNpY193Y2lkX2F0dHJpCVNldEFzaWNXY2lkQXR0cmk7CQkJCQkJCQlcCisJCQlTZXRBc2ljV2NpZEF0dHJpLldDSUQgPSBwRW50cnktPkFpZDsJCQkJCQkJCQlcCisJCQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPD0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkgJiYJCQkJXAorCQkJCShwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSkJCQkJXAorCQkJewkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlTZXRBc2ljV2NpZEF0dHJpLkNpcGhlciA9IHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uQ2lwaGVyQWxnOwlcCisJCQl9CQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJZWxzZSBpZiAocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQkJCQkJXAorCQkJewkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlTZXRBc2ljV2NpZEF0dHJpLkNpcGhlciA9IHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uQ2lwaGVyQWxnOwlcCisJCQl9CQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJZWxzZSBTZXRBc2ljV2NpZEF0dHJpLkNpcGhlciA9IDA7CQkJCQkJCQkJCVwKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImFpZCBjaXBoZXIgPSAlbGRcbiIsU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIpKTsgICAgICAgXAorCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfU0VUX0FTSUNfV0NJRF9DSVBIRVIsCQkJXAorCQkJCQkJCSZTZXRBc2ljV2NpZEF0dHJpLCBzaXplb2Yoc3RydWN0IHJ0X3NldF9hc2ljX3djaWRfYXR0cmkpKTsgfSB9CisKKy8qIEluc2VydCB0aGUgQkEgYml0bWFwIHRvIEFTSUMgZm9yIHRoZSBXY2lkIGVudHJ5ICovCisjZGVmaW5lIFJUTVBfQUREX0JBX1NFU1NJT05fVE9fQVNJQyhfcEFkLCBfQWlkLCBfVElEKQkJCQkJXAorCQlkb3sJCQkJCQkJCQkJCQkJCQkJXAorCQkJc3RydWN0IHJ0X3NldF9hc2ljX3djaWQJU2V0QXNpY1djaWQ7CQkJCQkJCVwKKwkJCVNldEFzaWNXY2lkLldDSUQgPSAoX0FpZCk7CQkJCQkJCQkJXAorCQkJU2V0QXNpY1djaWQuU2V0VGlkID0gKDB4MTAwMDA8PChfVElEKSk7CQkJCQkJXAorCQkJU2V0QXNpY1djaWQuRGVsZXRlVGlkID0gMHhmZmZmZmZmZjsJCQkJCQkJXAorCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQoKF9wQWQpLCBDTURUSFJFQURfU0VUX0FTSUNfV0NJRCwgJlNldEFzaWNXY2lkLCBzaXplb2Yoc3RydWN0IHJ0X3NldF9hc2ljX3djaWQpKTsJXAorCQl9d2hpbGUoMCkKKworLyogUmVtb3ZlIHRoZSBCQSBiaXRtYXAgZnJvbSBBU0lDIGZvciB0aGUgV2NpZCBlbnRyeSAqLworI2RlZmluZSBSVE1QX0RFTF9CQV9TRVNTSU9OX0ZST01fQVNJQyhfcEFkLCBfV2NpZCwgX1RJRCkJCQkJXAorCQlkb3sJCQkJCQkJCQkJCQkJCQkJXAorCQkJc3RydWN0IHJ0X3NldF9hc2ljX3djaWQJU2V0QXNpY1djaWQ7CQkJCQkJCVwKKwkJCVNldEFzaWNXY2lkLldDSUQgPSAoX1djaWQpOwkJCQkJCQkJCVwKKwkJCVNldEFzaWNXY2lkLlNldFRpZCA9ICgweGZmZmZmZmZmKTsJCQkJCQkJXAorCQkJU2V0QXNpY1djaWQuRGVsZXRlVGlkID0gKDB4MTAwMDA8PChfVElEKSApOwkJCQkJXAorCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQoKF9wQWQpLCBDTURUSFJFQURfU0VUX0FTSUNfV0NJRCwgJlNldEFzaWNXY2lkLCBzaXplb2Yoc3RydWN0IHJ0X3NldF9hc2ljX3djaWQpKTsJXAorCQl9d2hpbGUoMCkKKworI2VuZGlmIC8qIF9fUlRVU0JfSU9fSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtLmgKaW5kZXggMGE4NzhiYS4uNjQ4ZmQ2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3BlY3RydW0uaApAQCAtMjMsNyArMjMsNyBAQAogICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KKyAqLwogCiAjaWZuZGVmIF9fU1BFQ1RSVU1fSF9fCiAjZGVmaW5lIF9fU1BFQ1RSVU1fSF9fCkBAIC0zMSwxMTIgKzMxLDcgQEAKICNpbmNsdWRlICJydG1wX3R5cGUuaCIKICNpbmNsdWRlICJzcGVjdHJ1bV9kZWYuaCIKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9UUENfUkVQT1JUX0lORk8KLXsKLQlVSU5UOCBUeFB3cjsKLQlVSU5UOCBMaW5rTWFyZ2luOwotfSBUUENfUkVQT1JUX0lORk8sICpQVFBDX1JFUE9SVF9JTkZPOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0NIX1NXX0FOTl9JTkZPCi17Ci0JVUlOVDggQ2hTd01vZGU7Ci0JVUlOVDggQ2hhbm5lbDsKLQlVSU5UOCBDaFN3Q250OwotfSBDSF9TV19BTk5fSU5GTywgKlBDSF9TV19BTk5fSU5GTzsKLQotdHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfUkVRX01PREUKLXsKLQlzdHJ1Y3QgUEFDS0VECi0JewotCQlVSU5UOCBSZXYwOjE7Ci0JCVVJTlQ4IEVuYWJsZToxOwotCQlVSU5UOCBSZXF1ZXN0OjE7Ci0JCVVJTlQ4IFJlcG9ydDoxOwotCQlVSU5UOCBSZXYxOjQ7Ci0JfSBmaWVsZDsKLQlVSU5UOCB3b3JkOwotfSBNRUFTVVJFX1JFUV9NT0RFLCAqUE1FQVNVUkVfUkVRX01PREU7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SRVEKLXsKLQlVSU5UOCBDaE51bTsKLQlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKLQlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOwotfSBNRUFTVVJFX1JFUSwgKlBNRUFTVVJFX1JFUTsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX1JFUV9JTkZPCi17Ci0JVUlOVDggVG9rZW47Ci0JTUVBU1VSRV9SRVFfTU9ERSBSZXFNb2RlOwotCVVJTlQ4IFJlcVR5cGU7Ci0JTUVBU1VSRV9SRVEgTWVhc3VyZVJlcTsKLX0gTUVBU1VSRV9SRVFfSU5GTywgKlBNRUFTVVJFX1JFUV9JTkZPOwotCi10eXBlZGVmIHVuaW9uIFBBQ0tFRCBfTUVBU1VSRV9CQVNJQ19SRVBPUlRfTUFQCi17Ci0Jc3RydWN0IFBBQ0tFRAotCXsKLQkJVUlOVDggQlNTOjE7Ci0JCVVJTlQ4IE9mZG1QcmVhbWJsZToxOwotCQlVSU5UOCBVbmlkZW50aWZpZWRTaWduYWw6MTsKLQkJVUlOVDggUmFkYXI6MTsKLQkJVUlOVDggVW5tZWFzdXJlOjE7Ci0JCVVJTlQ4IFJldjozOwotCX0gZmllbGQ7Ci0JVUlOVDggd29yZDsKLX0gTUVBU1VSRV9CQVNJQ19SRVBPUlRfTUFQLCAqUE1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUDsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX0JBU0lDX1JFUE9SVAotewotCVVJTlQ4IENoTnVtOwotCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOwotCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247Ci0JTUVBU1VSRV9CQVNJQ19SRVBPUlRfTUFQIE1hcDsKLX0gTUVBU1VSRV9CQVNJQ19SRVBPUlQsICpQTUVBU1VSRV9CQVNJQ19SRVBPUlQ7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9DQ0FfUkVQT1JUCi17Ci0JVUlOVDggQ2hOdW07Ci0JVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7Ci0JVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKLQlVSU5UOCBDQ0FfQnVzeV9GcmFjdGlvbjsKLX0gTUVBU1VSRV9DQ0FfUkVQT1JULCAqUE1FQVNVUkVfQ0NBX1JFUE9SVDsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX1JQSV9SRVBPUlQKLXsKLQlVSU5UOCBDaE51bTsKLQlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKLQlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOwotCVVJTlQ4IFJQSV9EZW5zaXR5WzhdOwotfSBNRUFTVVJFX1JQSV9SRVBPUlQsICpQTUVBU1VSRV9SUElfUkVQT1JUOwotCi10eXBlZGVmIHVuaW9uIFBBQ0tFRCBfTUVBU1VSRV9SRVBPUlRfTU9ERQotewotCXN0cnVjdCBQQUNLRUQKLQl7Ci0JCVVJTlQ4IExhdGU6MTsKLQkJVUlOVDggSW5jYXBhYmxlOjE7Ci0JCVVJTlQ4IFJlZnVzZWQ6MTsKLQkJVUlOVDggUmV2OjU7Ci0JfSBmaWVsZDsKLQlVSU5UOCB3b3JkOwotfSBNRUFTVVJFX1JFUE9SVF9NT0RFLCAqUE1FQVNVUkVfUkVQT1JUX01PREU7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SRVBPUlRfSU5GTwotewotCVVJTlQ4IFRva2VuOwotCU1FQVNVUkVfUkVQT1JUX01PREUgUmVwb3J0TW9kZTsKLQlVSU5UOCBSZXBvcnRUeXBlOwotCVVJTlQ4IE9jdGVjdFswXTsKLX0gTUVBU1VSRV9SRVBPUlRfSU5GTywgKlBNRUFTVVJFX1JFUE9SVF9JTkZPOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1FVSUVUX0lORk8KLXsKLQlVSU5UOCBRdWlldENudDsKLQlVSU5UOCBRdWlldFBlcmlvZDsKLQlVSU5UOCBRdWlldER1cmF0aW9uOwotCVVJTlQ4IFF1aWV0T2Zmc2V0OwotfSBRVUlFVF9JTkZPLCAqUFFVSUVUX0lORk87CitjaGFyIFJUTVBfR2V0VHhQd3Ioc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBIVFRSQU5TTUlUX1NFVFRJTkcgSFRUeE1vZGUpOwogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xNTAsMTQgKzQ1LDE2IEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKLQlJTiBVSU5UOCBNZWFzdXJlQ2gsCi0JSU4gVUlOVDE2IE1lYXN1cmVEdXJhdGlvbik7Cit2b2lkIE1ha2VNZWFzdXJlbWVudFJlcUZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTggKnBPdXRCdWZmZXIsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgKnBGcmFtZUxlbiwKKwkJCSAgICAgdTggVG90YWxMZW4sCisJCQkgICAgIHU4IENhdGVnb3J5LAorCQkJICAgICB1OCBBY3Rpb24sCisJCQkgICAgIHU4IE1lYXN1cmVUb2tlbiwKKwkJCSAgICAgdTggTWVhc3VyZVJlcU1vZGUsCisJCQkgICAgIHU4IE1lYXN1cmVSZXFUeXBlLAorCQkJICAgICB1OCBOdW1PZlJlcGV0aXRpb25zKTsKIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTcxLDE1ICs2OCwxMyBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBFbnF1ZXVlTWVhc3VyZW1lbnRSZXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKLQlJTiBVSU5UOCBNZWFzdXJlVG9rZW4sCi0JSU4gVUlOVDggTWVhc3VyZVJlcU1vZGUsCi0JSU4gVUlOVDggTWVhc3VyZVJlcVR5cGUsCi0JSU4gVUlOVDggUmVwb3J0SW5mb0xlbiwKLQlJTiBQVUlOVDggcFJlcG9ydEluZm8pOwordm9pZCBFbnF1ZXVlTWVhc3VyZW1lbnRSZXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdTggKnBEQSwKKwkJCSAgIHU4IERpYWxvZ1Rva2VuLAorCQkJICAgdTggTWVhc3VyZVRva2VuLAorCQkJICAgdTggTWVhc3VyZVJlcU1vZGUsCisJCQkgICB1OCBNZWFzdXJlUmVxVHlwZSwKKwkJCSAgIHU4IFJlcG9ydEluZm9MZW4sIHU4ICpwUmVwb3J0SW5mbyk7CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTE5MywxMCArODgsNyBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBFbnF1ZXVlVFBDUmVxKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gVUNIQVIgRGlhbG9nVG9rZW4pOwordm9pZCBFbnF1ZXVlVFBDUmVxKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKnBEQSwgdTggRGlhbG9nVG9rZW4pOwogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0yMTAsMTIgKzEwMiw5IEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEVucXVldWVUUENSZXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKLQlJTiBVSU5UOCBUeFB3ciwKLQlJTiBVSU5UOCBMaW5rTWFyZ2luKTsKK3ZvaWQgRW5xdWV1ZVRQQ1JlcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgIHU4ICpwREEsCisJCSAgIHU4IERpYWxvZ1Rva2VuLCB1OCBUeFB3ciwgdTggTGlua01hcmdpbik7CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTIzMSwxMSArMTIwLDggQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgRW5xdWV1ZUNoU3dBbm4oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVSU5UOCBDaFN3TW9kZSwKLQlJTiBVSU5UOCBOZXdDaCk7Cit2b2lkIEVucXVldWVDaFN3QW5uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgIHU4ICpwREEsIHU4IENoU3dNb2RlLCB1OCBOZXdDaCk7CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTI0OSw5ICsxMzUsNyBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBQZWVyU3BlY3RydW1BY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUGVlclNwZWN0cnVtQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTI2MiwzMSArMTQ2LDQ0IEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1JTlQgU2V0X01lYXN1cmVSZXFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOworaW50IFNldF9NZWFzdXJlUmVxX1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyICphcmcpOwogCi1JTlQgU2V0X1RwY1JlcV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7CitpbnQgU2V0X1RwY1JlcV9Qcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgY2hhciAqYXJnKTsKIAotVk9JRCBNZWFzdXJlUmVxVGFiSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CitpbnQgU2V0X1B3ckNvbnN0cmFpbnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyICphcmcpOwogCi1WT0lEIE1lYXN1cmVSZXFUYWJFeGl0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgTWVhc3VyZVJlcVRhYkluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBUcGNSZXFUYWJJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgTWVhc3VyZVJlcVRhYkV4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBUcGNSZXFUYWJFeGl0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3N0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeSAqTWVhc3VyZVJlcUxvb2tVcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IERpYWxvZ1Rva2VuKTsKIAotVk9JRCBOb3RpZnlDaFN3QW5uVG9QZWVyQVBzKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwUkEsCi0JSU4gUFVDSEFSIHBUQSwKLQlJTiBVSU5UOCBDaFN3TW9kZSwKLQlJTiBVSU5UOCBDaGFubmVsKTsKLSNlbmRpZiAvLyBfX1NQRUNUUlVNX0hfXyAvLworc3RydWN0IHJ0X21lYXN1cmVfcmVxX2VudHJ5ICpNZWFzdXJlUmVxSW5zZXJ0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggRGlhbG9nVG9rZW4pOwogCit2b2lkIE1lYXN1cmVSZXFEZWxldGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBEaWFsb2dUb2tlbik7CisKK3ZvaWQgSW5zZXJ0Q2hhbm5lbFJlcElFKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXU4ICpwRnJhbWVCdWYsCisJCQl1bnNpZ25lZCBsb25nICpwRnJhbWVMZW4sCisJCQljaGFyICpwQ291bnRyeSwgdTggUmVndWxhdG9yeUNsYXNzKTsKKwordm9pZCBJbnNlcnRUcGNSZXBvcnRJRShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCAqcEZyYW1lQnVmLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqcEZyYW1lTGVuLAorCQkgICAgICAgdTggVHhQd3IsIHU4IExpbmtNYXJnaW4pOworCit2b2lkIEluc2VydERpYWxvZ1Rva2VuKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHU4ICpwRnJhbWVCdWYsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpwRnJhbWVMZW4sIHU4IERpYWxvZ1Rva2VuKTsKKwordm9pZCBUcGNSZXFUYWJJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CisKK3ZvaWQgVHBjUmVxVGFiRXhpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworCit2b2lkIE5vdGlmeUNoU3dBbm5Ub1BlZXJBUHMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHU4ICpwUkEsCisJCQkgICAgdTggKnBUQSwgdTggQ2hTd01vZGUsIHU4IENoYW5uZWwpOworCit2b2lkIFJndUNsYXNzX0J1aWxkQmNuQ2hMaXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTggKnBCdWYsIHVuc2lnbmVkIGxvbmcgKnBCdWZMZW4pOworI2VuZGlmIC8qIF9fU1BFQ1RSVU1fSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtX2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bV9kZWYuaAppbmRleCA0Y2E0ODE3Li44ZmZjZmIwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bV9kZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtX2RlZi5oCkBAIC0zOSwxMyArMzksNjIgQEAKICNpZm5kZWYgX19TUEVDVFJVTV9ERUZfSF9fCiAjZGVmaW5lIF9fU1BFQ1RSVU1fREVGX0hfXwogCi0jZGVmaW5lIE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRQkJMworI2RlZmluZSBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUJCTMyCiAjZGVmaW5lIE1BWF9IQVNIX01FQVNVUkVfUkVRX1RBQl9TSVpFCU1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRQogCi0jZGVmaW5lIE1BWF9UUENfUkVRX1RBQl9TSVpFCQkJMworI2RlZmluZSBNQVhfVFBDX1JFUV9UQUJfU0laRQkJCTMyCiAjZGVmaW5lIE1BWF9IQVNIX1RQQ19SRVFfVEFCX1NJWkUJCU1BWF9UUENfUkVRX1RBQl9TSVpFCiAKLSNkZWZpbmUgTUlOX1JDVl9QV1IJCQkJMTAwCQkvKiBOZWdhdGl2ZSB2YWx1ZSAoKGRCbSkgKi8KKyNkZWZpbmUgTUlOX1JDVl9QV1IJCQkJMTAwCS8qIE5lZ2F0aXZlIHZhbHVlICgoZEJtKSAqLworCisjZGVmaW5lIFRQQ19SRVFfQUdFX09VVAkJCTUwMAkvKiBtcyAqLworI2RlZmluZSBNUV9SRVFfQUdFX09VVAkJCTUwMAkvKiBtcyAqLworCisjZGVmaW5lIFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKF9EaWFsb2dUb2tlbikJKChfRGlhbG9nVG9rZW4pICUgTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRSkKKyNkZWZpbmUgTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChfRGlhbG9nVG9rZW4pCQkoKF9EaWFsb2dUb2tlbikgJSBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUpCisKK3N0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeTsKKworc3RydWN0IHJ0X21lYXN1cmVfcmVxX2VudHJ5IHsKKwlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKnBOZXh0OworCXVuc2lnbmVkIGxvbmcgbGFzdFRpbWU7CisJQk9PTEVBTiBWYWxpZDsKKwl1OCBEaWFsb2dUb2tlbjsKKwl1OCBNZWFzdXJlRGlhbG9nVG9rZW5bM107CS8qIDA6YmFzaWMgbWVhc3VyZSwgMTogQ0NBIG1lYXN1cmUsIDI6IFJQSV9IaXN0b2dyYW0gbWVhc3VyZS4gKi8KK307CisKK3N0cnVjdCBydF9tZWFzdXJlX3JlcV90YWIgeworCXU4IFNpemU7CisJc3RydWN0IHJ0X21lYXN1cmVfcmVxX2VudHJ5ICpIYXNoW01BWF9IQVNIX01FQVNVUkVfUkVRX1RBQl9TSVpFXTsKKwlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgQ29udGVudFtNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkVdOworfTsKKworc3RydWN0IHJ0X3RwY19yZXFfZW50cnk7CisKK3N0cnVjdCBydF90cGNfcmVxX2VudHJ5IHsKKwlzdHJ1Y3QgcnRfdHBjX3JlcV9lbnRyeSAqcE5leHQ7CisJdW5zaWduZWQgbG9uZyBsYXN0VGltZTsKKwlCT09MRUFOIFZhbGlkOworCXU4IERpYWxvZ1Rva2VuOworfTsKKworc3RydWN0IHJ0X3RwY19yZXFfdGFiIHsKKwl1OCBTaXplOworCXN0cnVjdCBydF90cGNfcmVxX2VudHJ5ICpIYXNoW01BWF9IQVNIX1RQQ19SRVFfVEFCX1NJWkVdOworCXN0cnVjdCBydF90cGNfcmVxX2VudHJ5IENvbnRlbnRbTUFYX1RQQ19SRVFfVEFCX1NJWkVdOworfTsKKworLyogVGhlIHJlZ3VsYXRvcnkgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBydF9kb3QxMV9jaGFubmVsX3NldCB7CisJdTggTnVtYmVyT2ZDaGFubmVsczsKKwl1OCBNYXhUeFB3cjsKKwl1OCBDaGFubmVsTGlzdFsxNl07Cit9OworCitzdHJ1Y3QgcnRfZG90MTFfcmVndWxhdG9yeV9pbmZvcm1hdGlvbiB7CisJdTggUmVndWxhdG9yeUNsYXNzOworCXN0cnVjdCBydF9kb3QxMV9jaGFubmVsX3NldCBDaGFubmVsU2V0OworfTsKIAogI2RlZmluZSBSTV9UUENfUkVRCQkJCTAKICNkZWZpbmUgUk1fTUVBU1VSRV9SRVEJCQkxCkBAIC01Myw0MyArMTAyLDEwMSBAQAogI2RlZmluZSBSTV9CQVNJQwkJCQkwCiAjZGVmaW5lIFJNX0NDQQkJCQkJMQogI2RlZmluZSBSTV9SUElfSElTVE9HUkFNCQkyCisjZGVmaW5lIFJNX0NIX0xPQUQJCQkJMworI2RlZmluZSBSTV9OT0lTRV9ISVNUT0dSQU0JCTQKIAotI2RlZmluZSBUUENfUkVRX0FHRV9PVVQJCQk1MDAJCS8qIG1zICovCi0jZGVmaW5lIE1RX1JFUV9BR0VfT1VUCQkJNTAwCQkvKiBtcyAqLworc3RydWN0IFBBQ0tFRCBydF90cGNfcmVwb3J0X2luZm8geworCXU4IFR4UHdyOworCXU4IExpbmtNYXJnaW47Cit9OwogCi0jZGVmaW5lIFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKF9EaWFsb2dUb2tlbikJKChfRGlhbG9nVG9rZW4pICUgTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRSkKLSNkZWZpbmUgTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChfRGlhbG9nVG9rZW4pCQkoKF9EaWFsb2dUb2tlbikgJSBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUpCitzdHJ1Y3QgUEFDS0VEIHJ0X2NoX3N3X2Fubl9pbmZvIHsKKwl1OCBDaFN3TW9kZTsKKwl1OCBDaGFubmVsOworCXU4IENoU3dDbnQ7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfTUVBU1VSRV9SRVFfRU5UUlkKLXsKLQlzdHJ1Y3QgX01FQVNVUkVfUkVRX0VOVFJZICpwTmV4dDsKLQlVTE9ORyBsYXN0VGltZTsKLQlCT09MRUFOCVZhbGlkOwotCVVJTlQ4IERpYWxvZ1Rva2VuOwotCVVJTlQ4IE1lYXN1cmVEaWFsb2dUb2tlblszXTsJLy8gMDpiYXNpYyBtZWFzdXJlLCAxOiBDQ0EgbWVhc3VyZSwgMjogUlBJX0hpc3RvZ3JhbSBtZWFzdXJlLgotfSBNRUFTVVJFX1JFUV9FTlRSWSwgKlBNRUFTVVJFX1JFUV9FTlRSWTsKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9NRUFTVVJFX1JFUV9NT0RFIHsKKwlzdHJ1Y3QgUEFDS0VEIHsKKwkJdTggUGFyYWxsZWw6MTsKKwkJdTggRW5hYmxlOjE7CisJCXU4IFJlcXVlc3Q6MTsKKwkJdTggUmVwb3J0OjE7CisJCXU4IER1cmF0aW9uTWFuZGF0b3J5OjE7CisJCSB1ODozOworCX0gZmllbGQ7CisJdTggd29yZDsKK30gTUVBU1VSRV9SRVFfTU9ERSwgKlBNRUFTVVJFX1JFUV9NT0RFOwogCi10eXBlZGVmIHN0cnVjdCBfTUVBU1VSRV9SRVFfVEFCCi17Ci0JVUNIQVIgU2l6ZTsKLQlQTUVBU1VSRV9SRVFfRU5UUlkgSGFzaFtNQVhfSEFTSF9NRUFTVVJFX1JFUV9UQUJfU0laRV07Ci0JTUVBU1VSRV9SRVFfRU5UUlkgQ29udGVudFtNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkVdOwotfSBNRUFTVVJFX1JFUV9UQUIsICpQTUVBU1VSRV9SRVFfVEFCOworc3RydWN0IFBBQ0tFRCBydF9tZWFzdXJlX3JlcSB7CisJdTggQ2hOdW07CisJdTY0IE1lYXN1cmVTdGFydFRpbWU7CisJdTE2IE1lYXN1cmVEdXJhdGlvbjsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9UUENfUkVRX0VOVFJZCi17Ci0Jc3RydWN0IF9UUENfUkVRX0VOVFJZICpwTmV4dDsKLQlVTE9ORyBsYXN0VGltZTsKLQlCT09MRUFOIFZhbGlkOwotCVVJTlQ4IERpYWxvZ1Rva2VuOwotfSBUUENfUkVRX0VOVFJZLCAqUFRQQ19SRVFfRU5UUlk7CitzdHJ1Y3QgUEFDS0VEIHJ0X21lYXN1cmVfcmVxX2luZm8geworCXU4IFRva2VuOworCU1FQVNVUkVfUkVRX01PREUgUmVxTW9kZTsKKwl1OCBSZXFUeXBlOworCXU4IE9jdFswXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9UUENfUkVRX1RBQgotewotCVVDSEFSIFNpemU7Ci0JUFRQQ19SRVFfRU5UUlkgSGFzaFtNQVhfSEFTSF9UUENfUkVRX1RBQl9TSVpFXTsKLQlUUENfUkVRX0VOVFJZIENvbnRlbnRbTUFYX1RQQ19SRVFfVEFCX1NJWkVdOwotfSBUUENfUkVRX1RBQiwgKlBUUENfUkVRX1RBQjsKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9NRUFTVVJFX0JBU0lDX1JFUE9SVF9NQVAgeworCXN0cnVjdCBQQUNLRUQgeworCQl1OCBCU1M6MTsKIAotI2VuZGlmIC8vIF9fU1BFQ1RSVU1fREVGX0hfXyAvLworCQl1OCBPZmRtUHJlYW1ibGU6MTsKKwkJdTggVW5pZGVudGlmaWVkU2lnbmFsOjE7CisJCXU4IFJhZGFyOjE7CisJCXU4IFVubWVhc3VyZToxOworCQl1OCBSZXY6MzsKKwl9IGZpZWxkOworCXU4IHdvcmQ7Cit9IE1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUCwgKlBNRUFTVVJFX0JBU0lDX1JFUE9SVF9NQVA7CiAKK3N0cnVjdCBQQUNLRUQgcnRfbWVhc3VyZV9iYXNpY19yZXBvcnQgeworCXU4IENoTnVtOworCXU2NCBNZWFzdXJlU3RhcnRUaW1lOworCXUxNiBNZWFzdXJlRHVyYXRpb247CisJTUVBU1VSRV9CQVNJQ19SRVBPUlRfTUFQIE1hcDsKK307CisKK3N0cnVjdCBQQUNLRUQgcnRfbWVhc3VyZV9jY2FfcmVwb3J0IHsKKwl1OCBDaE51bTsKKwl1NjQgTWVhc3VyZVN0YXJ0VGltZTsKKwl1MTYgTWVhc3VyZUR1cmF0aW9uOworCXU4IENDQV9CdXN5X0ZyYWN0aW9uOworfTsKKworc3RydWN0IFBBQ0tFRCBydF9tZWFzdXJlX3JwaV9yZXBvcnQgeworCXU4IENoTnVtOworCXU2NCBNZWFzdXJlU3RhcnRUaW1lOworCXUxNiBNZWFzdXJlRHVyYXRpb247CisJdTggUlBJX0RlbnNpdHlbOF07Cit9OworCit0eXBlZGVmIHVuaW9uIFBBQ0tFRCBfTUVBU1VSRV9SRVBPUlRfTU9ERSB7CisJc3RydWN0IFBBQ0tFRCB7CisJCXU4IExhdGU6MTsKKwkJdTggSW5jYXBhYmxlOjE7CisJCXU4IFJlZnVzZWQ6MTsKKwkJdTggUmV2OjU7CisJfSBmaWVsZDsKKwl1OCB3b3JkOworfSBNRUFTVVJFX1JFUE9SVF9NT0RFLCAqUE1FQVNVUkVfUkVQT1JUX01PREU7CisKK3N0cnVjdCBQQUNLRUQgcnRfbWVhc3VyZV9yZXBvcnRfaW5mbyB7CisJdTggVG9rZW47CisJdTggUmVwb3J0TW9kZTsKKwl1OCBSZXBvcnRUeXBlOworCXU4IE9jdGVjdFswXTsKK307CisKK3N0cnVjdCBQQUNLRUQgcnRfcXVpZXRfaW5mbyB7CisJdTggUXVpZXRDbnQ7CisJdTggUXVpZXRQZXJpb2Q7CisJdTE2IFF1aWV0RHVyYXRpb247CisJdTE2IFF1aWV0T2Zmc2V0OworfTsKKworI2VuZGlmIC8qIF9fU1BFQ1RSVU1fREVGX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYWlyb25ldC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYWlyb25ldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWY0YTE5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Fpcm9uZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMTIgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlhaXJvbmV0LmMKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlQYXVsIExpbgkwNC0wNi0xNQkJSW5pdGlhbAotKi8KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlhc3NvY2lhdGlvbglzdGF0ZSBtYWNoaW5lIGluaXQsCWluY2x1ZGluZyBzdGF0ZQl0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0Ci0JUGFyYW1ldGVyczoKLQkJUyAtCXBvaW50ZXIJdG8gdGhlIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lECUFpcm9uZXRTdGF0ZU1hY2hpbmVJbml0KAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglTVEFURV9NQUNISU5FCQkqUywKLQlPVVQJU1RBVEVfTUFDSElORV9GVU5DCVRyYW5zW10pCi17Ci0JU3RhdGVNYWNoaW5lSW5pdChTLAlUcmFucywgTUFYX0FJUk9ORVRfU1RBVEUsIE1BWF9BSVJPTkVUX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBBSVJPTkVUX0lETEUsIEFJUk9ORVRfTUFDSElORV9CQVNFKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUlST05FVF9JRExFLCBNVDJfQUlST05FVF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpQWlyb25ldE1zZ0FjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFJUk9ORVRfSURMRSwgTVQyX0FJUk9ORVRfU0NBTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpQWlyb25ldFJlcXVlc3RBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBSVJPTkVUX1NDQU5OSU5HLCBNVDJfQUlST05FVF9TQ0FOX0RPTkUsIChTVEFURV9NQUNISU5FX0ZVTkMpQWlyb25ldFJlcG9ydEFjdGlvbik7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyBpcwlzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9uLgotCQlXaGVuIHJlY2VpdmluZyBFQVBPTCBwYWNrZXRzIHdoaWNoIGlzICBmb3IgODAyLjF4IGtleSBtYW5hZ2VtZW50LgotCQlVc2UJYm90aCBpbglXUEEsIGFuZCBXUEFQU0sJY2FzZS4KLQkJSW4gdGhpcwlmdW5jdGlvbiwgZnVydGhlciBkaXNwYXRjaCB0byBkaWZmZXJlbnQJZnVuY3Rpb25zIGFjY29yZGluZwl0byB0aGUgcmVjZWl2ZWQJcGFja2V0LgkgMyBjYXRlZ29yaWVzIGFyZSA6Ci0JCSAgMS4gIG5vcm1hbCA0LXdheSBwYWlyd2lzZWtleSBhbmQgMi13YXkgZ3JvdXBrZXkgaGFuZHNoYWtlCi0JCSAgMi4gIE1JQyBlcnJvcgkoQ291bnRlcm1lYXN1cmVzIGF0dGFjaykgIHJlcG9ydCBwYWNrZXQJZnJvbSBTVEEuCi0JCSAgMy4gIFJlcXVlc3QgZm9yIHBhaXJ3aXNlL2dyb3VwIGtleSB1cGRhdGUJZnJvbSBTVEEKLQlSZXR1cm46Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUFpcm9uZXRNc2dBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQotewotCVVTSE9SVAkJCQkJCQlMZW5ndGg7Ci0JVUNIQVIJCQkJCQkJSW5kZXgsIGk7Ci0JUFVDSEFSCQkJCQkJCXBEYXRhOwotCVBBSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUJCXBSTVJlcTsKLQlQUk1fUkVRVUVTVF9BQ1RJT04JCQkJcFJlcUVsZW07Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0tLT4gQWlyb25ldE1zZ0FjdGlvblxuIikpOwotCi0JLy8gMC4gR2V0IEFpcm9uZXQgSUFQUCBoZWFkZXIgZmlyc3QKLQlwUk1SZXEgPSAoUEFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRSkgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExXTsKLQlwRGF0YSAgPSAoUFVDSEFSKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTFdOwotCi0JLy8gMS4gQ2hhbmdlIGVuZGlhbiBmb3JtYXQgZm9ybSBuZXR3b3JrIHRvIGxpdHRsZSBlbmRpYW4KLQlMZW5ndGggPSBiZTJjcHUxNihwUk1SZXEtPklBUFAuTGVuZ3RoKTsKLQotCS8vIDIuMCBTYW5pdHkgY2hlY2ssIHRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW4gQ0NYIDIuMCBzdXBwb3J0IGlzIGVuYWJsZWQKLQlpZiAocEFkLT5TdGFDZmcuQ0NYRW5hYmxlICE9IFRSVUUpCi0JCXJldHVybjsKLQotCS8vIDIuMSBSYWRpbyBtZWFzdXJlbWVudCBtdXN0IGJlIG9uCi0JaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuUk1FbmFibGUgIT0gMSkKLQkJcmV0dXJuOwotCi0JLy8gMi4yLiBEZWJ1ZyBwcmludCBhbGwgYml0IGluZm9ybWF0aW9uCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUFQUCBJRCAmIExlbmd0aCAlZFxuIiwgTGVuZ3RoKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUFQUCBUeXBlICV4XG4iLCBwUk1SZXEtPklBUFAuVHlwZSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklBUFAgU3ViVHlwZSAleFxuIiwgcFJNUmVxLT5JQVBQLlN1YlR5cGUpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIERpYWxvZyBUb2tlbiAleFxuIiwgcFJNUmVxLT5JQVBQLlRva2VuKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUFQUCBBY3RpdmF0aW9uIERlbGF5ICV4XG4iLCBwUk1SZXEtPkRlbGF5KSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUFQUCBNZWFzdXJlbWVudCBPZmZzZXQgJXhcbiIsIHBSTVJlcS0+T2Zmc2V0KSk7Ci0KLQkvLyAzLiBDaGVjayBJQVBQIGZyYW1lIHR5cGUsIGl0IG11c3QgYmUgMHgzMiBmb3IgQ2lzY28gQWlyb25ldCBleHRlbnNpb24KLQlpZiAocFJNUmVxLT5JQVBQLlR5cGUgIT0gQUlST05FVF9JQVBQX1RZUEUpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJXcm9uZyBJQVBQIHR5cGUgZm9yIENpc2NvIEFpcm9uZXQgZXh0ZW5zaW9uXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyA0LiBDaGVjayBJQVBQIGZyYW1lIHN1YnR5cGUsIGl0IG11c3QgYmUgMHgwMSBmb3IgQ2lzY28gQWlyb25ldCBleHRlbnNpb24gcmVxdWVzdC4KLQkvLyAgICBTaW5jZSB3ZSBhcmUgYWN0aW5nIGFzIGNsaWVudCBvbmx5LCB3ZSB3aWxsIGRpc3JlZ2FyZHMgcmVwbHkgc3VidHlwZS4KLQlpZiAocFJNUmVxLT5JQVBQLlN1YlR5cGUgIT0gQUlST05FVF9JQVBQX1NVQlRZUEVfUkVRVUVTVCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIElBUFAgc3VidHlwZSBmb3IgQ2lzY28gQWlyb25ldCBleHRlbnNpb25cbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vIDUuIFZlcmlmeSBEZXN0aW5hdGlvbiBNQUMgYW5kIFNvdXJjZSBNQUMsIGJvdGggc2hvdWxkIGJlIGFsbCB6ZXJvcy4KLQlpZiAoISBNQUNfQUREUl9FUVVBTChwUk1SZXEtPklBUFAuREEsIFpFUk9fTUFDX0FERFIpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3JvbmcgSUFQUCBEQSBmb3IgQ2lzY28gQWlyb25ldCBleHRlbnNpb24sIGl0J3Mgbm90IFplcm9cbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghIE1BQ19BRERSX0VRVUFMKHBSTVJlcS0+SUFQUC5TQSwgWkVST19NQUNfQUREUikpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJXcm9uZyBJQVBQIFNBIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbiwgaXQncyBub3QgWmVyb1xuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gNi4gUmVpbml0IGFsbCByZXBvcnQgcmVsYXRlZCBmaWVsZHMKLQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZiwgMjA0OCk7Ci0JTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuQnNzUmVwb3J0T2Zmc2V0LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9MRU5fT0ZfQlNTX1RBQkxFKTsKLQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3QsIHNpemVvZihSTV9SRVFVRVNUX0FDVElPTikgKiA0KTsKLQotCS8vIDcuIFBvaW50IHRvIHRoZSBzdGFydCBvZiBmaXJzdCBlbGVtZW50IHJlcG9ydCBlbGVtZW50Ci0JcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4gICA9IExFTkdUSF84MDJfMTEgKyBzaXplb2YoQUlST05FVF9JQVBQX0hFQURFUik7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRlIgbGVuID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7Ci0JcEFkLT5TdGFDZmcuTGFzdEJzc0luZGV4ICAgICA9IDB4ZmY7Ci0JcEFkLT5TdGFDZmcuUk1SZXFDbnQgICAgICAgICA9IDA7Ci0JcEFkLT5TdGFDZmcuUGFyYWxsZWxSZXEgICAgICA9IEZBTFNFOwotCXBBZC0+U3RhQ2ZnLlBhcmFsbGVsRHVyYXRpb24gPSAwOwotCXBBZC0+U3RhQ2ZnLlBhcmFsbGVsQ2hhbm5lbCAgPSAwOwotCXBBZC0+U3RhQ2ZnLklBUFBUb2tlbiAgICAgICAgPSBwUk1SZXEtPklBUFAuVG9rZW47Ci0JcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4ICA9IDA7Ci0JcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgICAgICA9IDA7Ci0JLy8gUmVzZXQgdGhlIHN0YXRpc3RpY3MKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5W2ldID0gMDsKLQotCUluZGV4ID0gMDsKLQotCS8vIDguIFNhdmUgZGlhbG9nIHRva2VuIGZvciByZXBvcnQKLQlwQWQtPlN0YUNmZy5JQVBQVG9rZW4gPSBwUk1SZXEtPklBUFAuVG9rZW47Ci0KLQkvLyBTYXZlIEFjdGl2YXRpb24gZGVsYXkgJiBtZWFzdXJlbWVudCBvZmZzZXQsIE5vdCByZWFsbHkgbmVlZGVkCi0KLQkvLyA5LiBQb2ludCB0byB0aGUgZmlyc3QgcmVxdWVzdCBlbGVtZW50Ci0JcERhdGEgKz0gc2l6ZW9mKEFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRSk7Ci0JLy8gICAgTGVuZ3RoIHNob3VsZCBleGNsdWRlIHRoZSBDSVNDTyBBaXJvbmV0IFNOQVAgaGVhZGVyCi0JTGVuZ3RoIC09IChzaXplb2YoQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FKSAtIExFTkdUSF84MDJfMV9IKTsKLQotCS8vIDEwLiBTdGFydCBQYXJzaW5nIHRoZSBNZWFzdXJlbWVudCBlbGVtZW50cy4KLQkvLyAgICBCZSBjYXJlZnVsIGFib3V0IG11bHRpcGxlIE1SIGVsZW1lbnRzIHdpdGhpbiBvbmUgZnJhbWVzLgotCXdoaWxlIChMZW5ndGggPiAwKQotCXsKLQkJcFJlcUVsZW0gPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSBwRGF0YTsKLQkJc3dpdGNoIChwUmVxRWxlbS0+UmVxRWxlbS5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVRVUVTVDoKLQkJCQkvLyBGcm9tIHRoZSBleGFtcGxlLCBpdCBzZWVtcyB3ZSBvbmx5IG5lZWQgdG8gc3VwcG9ydCBvbmUgcmVxdWVzdCBpbiBvbmUgZnJhbWUKLQkJCQkvLyBUaGVyZSBpcyBubyBtdWx0aXBsZSByZXF1ZXN0IGluIG9uZSBmcmFtZS4KLQkJCQkvLyBCZXNpZGVzLCBsb29rcyBsaWtlIHdlIG5lZWQgdG8gdGFrZSBjYXJlIHRoZSBtZWFzdXJlbWVudCByZXF1ZXN0IG9ubHkuCi0JCQkJLy8gVGhlIG1lYXN1cmVtZW50IHJlcXVlc3QgaXMgYWx3YXlzIDQgYnl0ZXMuCi0KLQkJCQkvLyBTdGFydCBwYXJzaW5nIHRoaXMgdHlwZSBvZiByZXF1ZXN0LgotCQkJCS8vIDAuIEVpZCBpcyBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUCi0JCQkJLy8gMS4gTGVuZ3RoIGRpZG4ndCBpbmNsdWRlIEVpZCBhbmQgTGVuZ3RoIGZpZWxkLCBpdCBhbHdheXMgYmUgOC4KLQkJCQkvLyAyLiBNZWFzdXJlbWVudCBUb2tlbiwgd2Ugbm5lZCB0byBzYXZlIGl0IGZvciB0aGUgY29ycmVzcG9uZGluZyByZXBvcnQuCi0JCQkJLy8gMy4gTWVhc3VyZW1lbnQgTW9kZSwgQWx0aG91Z2ggdGhlcmUgYXJlIGRlZmluaXRpb25zLCBidXQgd2UgZGluJ3Qgc2VlIHZhbHVlIG90aGVyIHRoYW4KLQkJCQkvLyAgICAwIGZyb20gdGVzdCBzcGVjcyBleGFtcGxlcy4KLQkJCQkvLyA0LiBNZWFzdXJlbWVudCBUeXBlLCB0aGlzIGlzIHdoYXQgd2UgbmVlZCB0byBkby4KLQkJCQlzd2l0Y2ggKHBSZXFFbGVtLT5SZXFFbGVtLlR5cGUpCi0JCQkJewotCQkJCQljYXNlIE1TUk5fVFlQRV9DSEFOTkVMX0xPQURfUkVROgotCQkJCQljYXNlIE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUToKLQkJCQkJY2FzZSBNU1JOX1RZUEVfQkVBQ09OX1JFUToKLQkJCQkJCS8vIENoZWNrIHRoZSBFbmFibGUgbm9uLXNlcnZpbmcgY2hhbm5lbCBtZWFzdXJlbWVudCBjb250cm9sCi0JCQkJCQlpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5EQ1JNRW5hYmxlID09IDApCi0JCQkJCQl7Ci0JCQkJCQkJLy8gQ2hlY2sgY2hhbm5lbCBiZWZvcmUgZW5xdWV1ZSB0aGUgYWN0aW9uCi0JCQkJCQkJaWYgKHBSZXFFbGVtLT5NZWFzdXJlbWVudC5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCS8vIElmIG9mZiBjaGFubmVsIG1lYXN1cmVtZW50LCBjaGVjayB0aGUgVFUgZHVyYXRpb24gbGltaXQKLQkJCQkJCQlpZiAocFJlcUVsZW0tPk1lYXN1cmVtZW50LkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJCQkJCQkJaWYgKHBSZXFFbGVtLT5NZWFzdXJlbWVudC5EdXJhdGlvbiA+IHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuVHVMaW1pdCkKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCi0JCQkJCQkvLyBTYXZlIHJlcXVlc3RzIGFuZCBleGVjdXRlIGFjdGlvbnMgbGF0ZXIKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLCBwUmVxRWxlbSwgc2l6ZW9mKFJNX1JFUVVFU1RfQUNUSU9OKSk7Ci0JCQkJCQlJbmRleCArPSAxOwotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJY2FzZSBNU1JOX1RZUEVfRlJBTUVfUkVROgotCQkJCQkJLy8gU2luY2UgaXQncyBvcHRpb24sIHdlIHdpbGwgc3VwcG9ydCBsYXRlcgotCQkJCQkJLy8gRnJhbWVSZXF1ZXN0QWN0aW9uKHBBZCwgcERhdGEpOwotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJZGVmYXVsdDoKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCS8vIFBvaW50IHRvIG5leHQgTWVhc3VyZW1lbnQgcmVxdWVzdAotCQkJCXBEYXRhICArPSBzaXplb2YoUk1fUkVRVUVTVF9BQ1RJT04pOwotCQkJCUxlbmd0aCAtPSBzaXplb2YoUk1fUkVRVUVTVF9BQ1RJT04pOwotCQkJCWJyZWFrOwotCi0JCQkvLyBXZSBhY2NlcHQgcmVxdWVzdCBvbmx5LCBhbGwgb3RoZXJzIGFyZSBkcm9wcGVkCi0JCQljYXNlIElFX01FQVNVUkVNRU5UX1JFUE9SVDoKLQkJCWNhc2UgSUVfQVBfVFhfUE9XRVI6Ci0JCQljYXNlIElFX01FQVNVUkVNRU5UX0NBUEFCSUxJVFk6Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8vIDExLiBVcGRhdGUgc29tZSBmbGFncyBhbmQgaW5kZXgKLQlwQWQtPlN0YUNmZy5STVJlcUNudCA9IEluZGV4OwotCi0JaWYgKEluZGV4KQotCXsKLQkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fUkVRLCAwLCBOVUxMKTsKLQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0tLSBBaXJvbmV0TXNnQWN0aW9uXG4iKSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlBaXJvbmV0UmVxdWVzdEFjdGlvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCi17Ci0JUFJNX1JFUVVFU1RfQUNUSU9OCXBSZXE7Ci0KLQkvLyAxLiBQb2ludCB0byBuZXh0IHJlcXVlc3QgZWxlbWVudAotCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeF07Ci0KLQkvLyAyLiBQYXJzZSBtZWFzdXJlbWVudCB0eXBlIGFuZCBjYWxsIGFwcHJvcHJpYXRlIGZ1bmN0aW9ucwotCWlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVEpCi0JCS8vIENoYW5uZWwgTG9hZCBtZWFzdXJlbWVudCByZXF1ZXN0Ci0JCUNoYW5uZWxMb2FkUmVxdWVzdEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7Ci0JZWxzZSBpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUSkKLQkJLy8gTm9pc2UgSGlzdG9ncmFtIG1lYXN1cmVtZW50IHJlcXVlc3QKLQkJTm9pc2VIaXN0UmVxdWVzdEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7Ci0JZWxzZSBpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9CRUFDT05fUkVRKQotCQkvLyBCZWFjb24gbWVhc3VyZW1lbnQgcmVxdWVzdAotCQlCZWFjb25SZXF1ZXN0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKLQllbHNlCi0JCS8vIFVua25vd24uIERvIG5vdGhpbmcgYW5kIHJldHVybiwgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCi0JCXJldHVybjsKLQotCS8vIDMuIFBlZWsgaW50byB0aGUgbmV4dCByZXF1ZXN0LCBpZiBpdCdzIHBhcmFsbGVsLCB3ZSB3aWxsIHVwZGF0ZSB0aGUgc2NhbiB0aW1lIHRvIHRoZSBsYXJnZXN0IG9uZQotCWlmICgocEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4ICsgMSkgPCBwQWQtPlN0YUNmZy5STVJlcUNudCkKLQl7Ci0JCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCArIDFdOwotCQkvLyBDaGVjayBmb3IgcGFyYWxsZWwgYml0Ci0JCWlmICgocFJlcS0+UmVxRWxlbS5Nb2RlICYgMHgwMSkgJiYgKHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWwgPT0gcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwpKQotCQl7Ci0JCQkvLyBVcGRhdGUgcGFyYWxsZWwgbW9kZSByZXF1ZXN0IGluZm9ybWF0aW9uCi0JCQlwQWQtPlN0YUNmZy5QYXJhbGxlbFJlcSA9IFRSVUU7Ci0JCQlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSA9ICgocFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24gPiBwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSkgPwotCQkJKHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uKSA6IChwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSkpOwotCQl9Ci0JfQotCi0JLy8gNC4gQ2FsbCBSVDI4WFhfTUxNRV9IQU5ETEVSIHRvIGV4ZWN1dGUgdGhlIHJlcXVlc3QgbWxtZSBjb21tYW5kcywgU2NhbiByZXF1ZXN0IGlzIHRoZSBvbmx5IG9uZSB1c2VkCi0JUlQyOFhYX01MTUVfSEFORExFUihwQWQpOwotCi19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVByZXBhcmUgY2hhbm5lbCBsb2FkIHJlcG9ydCBhY3Rpb24sIHNwZWNpYWwgc2NhbiBvcGVyYXRpb24gYWRkZWQKLQkJdG8gc3VwcG9ydAotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgotCQlwRGF0YQkJU3RhcnQgZnJvbSBlbGVtZW50IElECi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUNoYW5uZWxMb2FkUmVxdWVzdEFjdGlvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUluZGV4KQotewotCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxOwotCU1MTUVfU0NBTl9SRVFfU1RSVUNUCQkJU2NhblJlcTsKLQlVQ0hBUgkJCQkJCQlaZXJvU3NpZFszMl07Ci0JTkRJU19TVEFUVVMJCQkJCQlOU3RhdHVzOwotCVBVQ0hBUgkJCQkJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlQSEVBREVSXzgwMl8xMQkJCQkJcE51bGxGcmFtZTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWxMb2FkUmVxdWVzdEFjdGlvbiAtLS0tLT5cbiIpKTsKLQotCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XTsKLQlOZGlzWmVyb01lbW9yeShaZXJvU3NpZCwgMzIpOwotCi0JLy8gUHJlcGFyZSBmb3Igc3BlY2lhbCBzY2FuIHJlcXVlc3QKLQkvLyBUaGUgc2NhbiBkZWZpbml0aW9uIGlzIGRpZmZlcmVudCB3aXRoIG91ciBBY3RpdmUsIFBhc3NpdmUgc2NhbiBkZWZpbml0aW9uLgotCS8vIEZvciBDQ1gyLCBBY3RpdmUgbWVhbnMgc2VuZCBvdXQgcHJvYmUgcmVxdWVzdCB3aXRoIGJyb2FkY2FzdCBCU1NJRC4KLQkvLyBQYXNzaXZlIG1lYW5zIG5vIHByb2JlIHJlcXVlc3Qgc2VudCwgb25seSBsaXN0ZW4gdG8gdGhlIGJlYWNvbnMuCi0JLy8gVGhlIGNoYW5uZWwgc2Nhbm5lZCBpcyBmaXhlZCBhcyBzcGVjaWZpZWQsIG5vIG5lZWQgdG8gc2NhbiBhbGwgY2hhbm5lbHMuCi0JLy8gVGhlIHNjYW4gd2FpdCB0aW1lIGlzIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB0b28uCi0JLy8gUGFzc2l2ZSBzY2FuIE1vZGUKLQotCS8vIENvbnRyb2wgc3RhdGUgbWFjaGluZSBpcyBub3QgaWRsZSwgcmVqZWN0IHRoZSByZXF1ZXN0Ci0JaWYgKChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgJiYgKEluZGV4ID09IDApKQotCQlyZXR1cm47Ci0KLQkvLyBGaWxsIG91dCBzdHVmZiBmb3Igc2NhbiByZXF1ZXN0Ci0JU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIFplcm9Tc2lkLCAwLCBCU1NfQU5ZLCBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCk7Ci0JTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7Ci0JcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOwotCi0JLy8gUmVzZXQgc29tZSBpbnRlcm5hbCBjb250cm9sIGZsYWdzIHRvIG1ha2Ugc3VyZSB0aGlzIHNjYW4gd29ya3MuCi0JQnNzVGFibGVJbml0KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIpOwotCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKLQlwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCA9IHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWw7Ci0JcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgICAgPSBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbjsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkR1cmF0aW9uICVkLCBDaGFubmVsICVkIVxuIiwgcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24sIHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWwpKTsKLQotCS8vIElmIGl0J3Mgbm9uIHNlcnZpbmcgY2hhbm5lbCBzY2FuLCBzZW5kIG91dCBhIG51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uLgotCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCXsKLQkJLy8gVXNlIE1MTUUgZW5xdWV1ZSBtZXRob2QKLQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQlyZXR1cm47Ci0KLQkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjs7Ci0JCS8vIE1ha2UgdGhlIHBvd2VyIHNhdmUgTnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24KLQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBOdWxsRnJhbWUsIFNVQlRZUEVfTlVMTF9GVU5DLCAxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQlwTnVsbEZyYW1lLT5EdXJhdGlvbiAJPSAwOwotCQlwTnVsbEZyYW1lLT5GQy5UeXBlIAk9IEJUWVBFX0RBVEE7Ci0JCXBOdWxsRnJhbWUtPkZDLlB3ck1nbXQJPSBQV1JfU0FWRTsKLQotCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCi0JCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKLQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKLQl9Ci0KLQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9DSEFOTkVMX0xPQURfUkVROwotCXBBZC0+U3RhQ2ZnLkNMQnVzeUJ5dGVzICAgID0gMDsKLQkvLyBFbmFibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIDB4MTAxMCk7Ci0KLQkvLyBTZXQgY2hhbm5lbCBsb2FkIG1lYXN1cmVtZW50IGZsYWcKLQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVCk7Ci0KLQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWxMb2FkUmVxdWVzdEFjdGlvbiA8LS0tLS1cbiIpKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVByZXBhcmUgbm9pc2UgaGlzdG9ncmFtIHJlcG9ydCBhY3Rpb24sIHNwZWNpYWwgc2NhbiBvcGVyYXRpb24gYWRkZWQKLQkJdG8gc3VwcG9ydAotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgotCQlwRGF0YQkJU3RhcnQgZnJvbSBlbGVtZW50IElECi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECU5vaXNlSGlzdFJlcXVlc3RBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlJbmRleCkKLXsKLQlQUk1fUkVRVUVTVF9BQ1RJT04JCQkJcFJlcTsKLQlNTE1FX1NDQU5fUkVRX1NUUlVDVAkJCVNjYW5SZXE7Ci0JVUNIQVIJCQkJCQkJWmVyb1NzaWRbMzJdLCBpOwotCU5ESVNfU1RBVFVTCQkJCQkJTlN0YXR1czsKLQlQVUNIQVIJCQkJCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JUEhFQURFUl84MDJfMTEJCQkJCXBOdWxsRnJhbWU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uIC0tLS0tPlxuIikpOwotCi0JcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdOwotCU5kaXNaZXJvTWVtb3J5KFplcm9Tc2lkLCAzMik7Ci0KLQkvLyBQcmVwYXJlIGZvciBzcGVjaWFsIHNjYW4gcmVxdWVzdAotCS8vIFRoZSBzY2FuIGRlZmluaXRpb24gaXMgZGlmZmVyZW50IHdpdGggb3VyIEFjdGl2ZSwgUGFzc2l2ZSBzY2FuIGRlZmluaXRpb24uCi0JLy8gRm9yIENDWDIsIEFjdGl2ZSBtZWFucyBzZW5kIG91dCBwcm9iZSByZXF1ZXN0IHdpdGggYnJvYWRjYXN0IEJTU0lELgotCS8vIFBhc3NpdmUgbWVhbnMgbm8gcHJvYmUgcmVxdWVzdCBzZW50LCBvbmx5IGxpc3RlbiB0byB0aGUgYmVhY29ucy4KLQkvLyBUaGUgY2hhbm5lbCBzY2FubmVkIGlzIGZpeGVkIGFzIHNwZWNpZmllZCwgbm8gbmVlZCB0byBzY2FuIGFsbCBjaGFubmVscy4KLQkvLyBUaGUgc2NhbiB3YWl0IHRpbWUgaXMgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHRvby4KLQkvLyBQYXNzaXZlIHNjYW4gTW9kZQotCi0JLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpZGxlLCByZWplY3QgdGhlIHJlcXVlc3QKLQlpZiAoKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKSAmJiAoSW5kZXggPT0gMCkpCi0JCXJldHVybjsKLQotCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKLQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgWmVyb1NzaWQsIDAsIEJTU19BTlksIFNDQU5fQ0lTQ09fTk9JU0UpOwotCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOwotCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKLQotCS8vIFJlc2V0IHNvbWUgaW50ZXJuYWwgY29udHJvbCBmbGFncyB0byBtYWtlIHN1cmUgdGhpcyBzY2FuIHdvcmtzLgotCUJzc1RhYmxlSW5pdCgmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiKTsKLQlwQWQtPlN0YUNmZy5TY2FuQ250ICAgICAgICA9IDA7Ci0JcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgPSBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsOwotCXBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lICAgID0gcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb247Ci0JcEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSAgICAgPSBNU1JOX1RZUEVfTk9JU0VfSElTVF9SRVE7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEdXJhdGlvbiAlZCwgQ2hhbm5lbCAlZCFcbiIsIHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uLCBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsKSk7Ci0KLQkvLyBJZiBpdCdzIG5vbiBzZXJ2aW5nIGNoYW5uZWwgc2Nhbiwgc2VuZCBvdXQgYSBudWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbi4KLQlpZiAocEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQl7Ci0JCS8vIFVzZSBNTE1FIGVucXVldWUgbWV0aG9kCi0JCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJcmV0dXJuOwotCi0JCXBOdWxsRnJhbWUgPSAoUEhFQURFUl84MDJfMTEpIHBPdXRCdWZmZXI7Ci0JCS8vIE1ha2UgdGhlIHBvd2VyIHNhdmUgTnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24KLQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBOdWxsRnJhbWUsIFNVQlRZUEVfTlVMTF9GVU5DLCAxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQlwTnVsbEZyYW1lLT5EdXJhdGlvbiAJPSAwOwotCQlwTnVsbEZyYW1lLT5GQy5UeXBlICAJPSBCVFlQRV9EQVRBOwotCQlwTnVsbEZyYW1lLT5GQy5Qd3JNZ210CT0gUFdSX1NBVkU7Ci0KLQkJLy8gU2VuZCB1c2luZyBwcmlvcml0eSBxdWV1ZQotCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgUFNNIERhdGEgZnJhbWUgZm9yIG9mZiBjaGFubmVsIFJNXG4iKSk7Ci0JCVJUTVB1c2VjRGVsYXkoNTAwMCk7Ci0JfQotCi0JLy8gUmVzZXQgdGhlIHN0YXRpc3RpY3MKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5W2ldID0gMDsKLQotCS8vIEVuYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbgotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgMHgxMDEwKTsKLQotCS8vIFNldCBjaGFubmVsIGxvYWQgbWVhc3VyZW1lbnQgZmxhZwotCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UKTsKLQotCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm9pc2VIaXN0UmVxdWVzdEFjdGlvbiA8LS0tLS1cbiIpKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVByZXBhcmUgQmVhY29uIHJlcG9ydCBhY3Rpb24sIHNwZWNpYWwgc2NhbiBvcGVyYXRpb24gYWRkZWQKLQkJdG8gc3VwcG9ydAotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgotCQlwRGF0YQkJU3RhcnQgZnJvbSBlbGVtZW50IElECi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUJlYWNvblJlcXVlc3RBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlJbmRleCkKLXsKLQlQUk1fUkVRVUVTVF9BQ1RJT04JCQkJcFJlcTsKLQlORElTX1NUQVRVUwkJCQkJCU5TdGF0dXM7Ci0JUFVDSEFSCQkJCQkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCVBIRUFERVJfODAyXzExCQkJCQlwTnVsbEZyYW1lOwotCU1MTUVfU0NBTl9SRVFfU1RSVUNUCQkJU2NhblJlcTsKLQlVQ0hBUgkJCQkJCQlaZXJvU3NpZFszMl07Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCZWFjb25SZXF1ZXN0QWN0aW9uIC0tLS0tPlxuIikpOwotCi0JcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdOwotCU5kaXNaZXJvTWVtb3J5KFplcm9Tc2lkLCAzMik7Ci0KLQkvLyBQcmVwYXJlIGZvciBzcGVjaWFsIHNjYW4gcmVxdWVzdAotCS8vIFRoZSBzY2FuIGRlZmluaXRpb24gaXMgZGlmZmVyZW50IHdpdGggb3VyIEFjdGl2ZSwgUGFzc2l2ZSBzY2FuIGRlZmluaXRpb24uCi0JLy8gRm9yIENDWDIsIEFjdGl2ZSBtZWFucyBzZW5kIG91dCBwcm9iZSByZXF1ZXN0IHdpdGggYnJvYWRjYXN0IEJTU0lELgotCS8vIFBhc3NpdmUgbWVhbnMgbm8gcHJvYmUgcmVxdWVzdCBzZW50LCBvbmx5IGxpc3RlbiB0byB0aGUgYmVhY29ucy4KLQkvLyBUaGUgY2hhbm5lbCBzY2FubmVkIGlzIGZpeGVkIGFzIHNwZWNpZmllZCwgbm8gbmVlZCB0byBzY2FuIGFsbCBjaGFubmVscy4KLQkvLyBUaGUgc2NhbiB3YWl0IHRpbWUgaXMgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHRvby4KLQlpZiAocFJlcS0+TWVhc3VyZW1lbnQuU2Nhbk1vZGUgPT0gTVNSTl9TQ0FOX01PREVfUEFTU0lWRSkKLQl7Ci0JCS8vIFBhc3NpdmUgc2NhbiBNb2RlCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBhc3NpdmUgU2NhbiBNb2RlIVxuIikpOwotCi0JCS8vIENvbnRyb2wgc3RhdGUgbWFjaGluZSBpcyBub3QgaWRsZSwgcmVqZWN0IHRoZSByZXF1ZXN0Ci0JCWlmICgocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpICYmIChJbmRleCA9PSAwKSkKLQkJCXJldHVybjsKLQotCQkvLyBGaWxsIG91dCBzdHVmZiBmb3Igc2NhbiByZXF1ZXN0Ci0JCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl9DSVNDT19QQVNTSVZFKTsKLQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7Ci0JCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKLQotCQkvLyBSZXNldCBzb21lIGludGVybmFsIGNvbnRyb2wgZmxhZ3MgdG8gbWFrZSBzdXJlIHRoaXMgc2NhbiB3b3Jrcy4KLQkJQnNzVGFibGVJbml0KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIpOwotCQlwQWQtPlN0YUNmZy5TY2FuQ250ICAgICAgICA9IDA7Ci0JCXBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsID0gcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbDsKLQkJcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgICAgPSBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbjsKLQkJcEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSAgICAgPSBNU1JOX1RZUEVfQkVBQ09OX1JFUTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHVyYXRpb24gJWQhXG4iLCBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbikpOwotCi0JCS8vIElmIGl0J3Mgbm9uIHNlcnZpbmcgY2hhbm5lbCBzY2FuLCBzZW5kIG91dCBhIG51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uLgotCQlpZiAocEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJewotCQkJLy8gVXNlIE1MTUUgZW5xdWV1ZSBtZXRob2QKLQkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQkJaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCQlyZXR1cm47Ci0KLQkJCXBOdWxsRnJhbWUgPSAoUEhFQURFUl84MDJfMTEpIHBPdXRCdWZmZXI7Ci0JCQkvLyBNYWtlIHRoZSBwb3dlciBzYXZlIE51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uCi0JCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcE51bGxGcmFtZSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQlwTnVsbEZyYW1lLT5EdXJhdGlvbiAJPSAwOwotCQkJcE51bGxGcmFtZS0+RkMuVHlwZSAgICAgPSBCVFlQRV9EQVRBOwotCQkJcE51bGxGcmFtZS0+RkMuUHdyTWdtdCAgPSBQV1JfU0FWRTsKLQotCQkJLy8gU2VuZCB1c2luZyBwcmlvcml0eSBxdWV1ZQotCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgUFNNIERhdGEgZnJhbWUgZm9yIG9mZiBjaGFubmVsIFJNXG4iKSk7Ci0JCQlSVE1QdXNlY0RlbGF5KDUwMDApOwotCQl9Ci0KLQkJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfU0NBTk5JTkc7Ci0JfQotCWVsc2UgaWYgKHBSZXEtPk1lYXN1cmVtZW50LlNjYW5Nb2RlID09IE1TUk5fU0NBTl9NT0RFX0FDVElWRSkKLQl7Ci0JCS8vIEFjdGl2ZSBzY2FuIE1vZGUKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWN0aXZlIFNjYW4gTW9kZSFcbiIpKTsKLQotCQkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgaXMgbm90IGlkbGUsIHJlamVjdCB0aGUgcmVxdWVzdAotCQlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCi0JCQlyZXR1cm47Ci0KLQkJLy8gRmlsbCBvdXQgc3R1ZmYgZm9yIHNjYW4gcmVxdWVzdAotCQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgWmVyb1NzaWQsIDAsIEJTU19BTlksIFNDQU5fQ0lTQ09fQUNUSVZFKTsKLQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7Ci0JCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKLQotCQkvLyBSZXNldCBzb21lIGludGVybmFsIGNvbnRyb2wgZmxhZ3MgdG8gbWFrZSBzdXJlIHRoaXMgc2NhbiB3b3Jrcy4KLQkJQnNzVGFibGVJbml0KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIpOwotCQlwQWQtPlN0YUNmZy5TY2FuQ250ICAgICAgICA9IDA7Ci0JCXBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsID0gcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbDsKLQkJcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgICAgPSBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbjsKLQkJcEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSAgICAgPSBNU1JOX1RZUEVfQkVBQ09OX1JFUTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHVyYXRpb24gJWQhXG4iLCBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbikpOwotCi0JCS8vIElmIGl0J3Mgbm9uIHNlcnZpbmcgY2hhbm5lbCBzY2FuLCBzZW5kIG91dCBhIG51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uLgotCQlpZiAocEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJewotCQkJLy8gVXNlIE1MTUUgZW5xdWV1ZSBtZXRob2QKLQkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQkJaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCQlyZXR1cm47Ci0KLQkJCXBOdWxsRnJhbWUgPSAoUEhFQURFUl84MDJfMTEpIHBPdXRCdWZmZXI7Ci0JCQkvLyBNYWtlIHRoZSBwb3dlciBzYXZlIE51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uCi0JCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcE51bGxGcmFtZSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQlwTnVsbEZyYW1lLT5EdXJhdGlvbiAJPSAwOwotCQkJcE51bGxGcmFtZS0+RkMuVHlwZSAgICAgPSBCVFlQRV9EQVRBOwotCQkJcE51bGxGcmFtZS0+RkMuUHdyTWdtdCAgPSBQV1JfU0FWRTsKLQotCQkJLy8gU2VuZCB1c2luZyBwcmlvcml0eSBxdWV1ZQotCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgUFNNIERhdGEgZnJhbWUgZm9yIG9mZiBjaGFubmVsIFJNXG4iKSk7Ci0JCQlSVE1QdXNlY0RlbGF5KDUwMDApOwotCQl9Ci0KLQkJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfU0NBTk5JTkc7Ci0JfQotCWVsc2UgaWYgKHBSZXEtPk1lYXN1cmVtZW50LlNjYW5Nb2RlID09IE1TUk5fU0NBTl9NT0RFX0JFQUNPTl9UQUJMRSkKLQl7Ci0JCS8vIEJlYWNvbiByZXBvcnQgTW9kZSwgcmVwb3J0IGFsbCB0aGUgQVBTIGluIGN1cnJlbnQgYnNzIHRhYmxlCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvbiBSZXBvcnQgTW9kZSFcbiIpKTsKLQotCQkvLyBDb3B5IGN1cnJlbnQgQlNTIHRhYmxlIHRvIENDWCB0YWJsZSwgd2UgY2FuIG9taXQgdGhpcyBzdGVwIGxhdGVyIG9uLgotCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLCAmcEFkLT5TY2FuVGFiLCBzaXplb2YoQlNTX1RBQkxFKSk7Ci0KLQkJLy8gQ3JlYXRlIGJlYWNvbiByZXBvcnQgZnJvbSBCc3MgdGFibGUKLQkJQWlyb25ldENyZWF0ZUJlYWNvblJlcG9ydEZyb21Cc3NUYWJsZShwQWQpOwotCi0JCS8vIFNldCBzdGF0ZSB0byBzY2FubmluZwotCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKLQotCQkvLyBFbnF1ZXVlIHJlcG9ydCByZXF1ZXN0Ci0JCS8vIENpc2NvIHNjYW4gcmVxdWVzdCBpcyBmaW5pc2hlZCwgcHJlcGFyZSBiZWFjb24gcmVwb3J0Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgQUlST05FVF9TVEFURV9NQUNISU5FLCBNVDJfQUlST05FVF9TQ0FOX0RPTkUsIDAsIE5VTEwpOwotCX0KLQllbHNlCi0JewotCQkvLyBXcm9uZyBzY2FuIE1vZGUKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3JvbmcgU2NhbiBNb2RlIVxuIikpOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblJlcXVlc3RBY3Rpb24gPC0tLS0tXG4iKSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlBaXJvbmV0UmVwb3J0QWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKLXsKLQlQUk1fUkVRVUVTVF9BQ1RJT04JcFJlcTsKLQlVTE9ORwkJCQlOb3czMjsKLQotICAgIE5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdzMyKTsKLQlwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lID0gTm93MzI7Ci0KLQlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHhdOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWlyb25ldFJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKLQotCS8vIDEuIFBhcnNlIG1lYXN1cmVtZW50IHR5cGUgYW5kIGNhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb25zCi0JaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUSkKLQkJLy8gQ2hhbm5lbCBMb2FkIG1lYXN1cmVtZW50IHJlcXVlc3QKLQkJQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOwotCWVsc2UgaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfTk9JU0VfSElTVF9SRVEpCi0JCS8vIE5vaXNlIEhpc3RvZ3JhbSBtZWFzdXJlbWVudCByZXF1ZXN0Ci0JCU5vaXNlSGlzdFJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7Ci0JZWxzZSBpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9CRUFDT05fUkVRKQotCQkvLyBCZWFjb24gbWVhc3VyZW1lbnQgcmVxdWVzdAotCQlCZWFjb25SZXBvcnRBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOwotCWVsc2UKLQkJLy8gVW5rbm93bi4gRG8gbm90aGluZyBhbmQgcmV0dXJuCi0JCTsKLQotCS8vIDIuIFBvaW50IHRvIHRoZSBjb3JyZWN0IGluZGV4IG9mIGFjdGlvbiBlbGVtZW50LCBzdGFydCBmcm9tIDAKLQlwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgrKzsKLQotCS8vIDMuIENoZWNrIGZvciBwYXJhbGxlbCBhY3Rpb25zCi0JaWYgKHBBZC0+U3RhQ2ZnLlBhcmFsbGVsUmVxID09IFRSVUUpCi0JewotCQlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHhdOwotCi0JCS8vIFByb2Nlc3MgbmV4dCBhY3Rpb24gcmlnaHQgYXdheQotCQlpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9DSEFOTkVMX0xPQURfUkVRKQotCQkJLy8gQ2hhbm5lbCBMb2FkIG1lYXN1cmVtZW50IHJlcXVlc3QKLQkJCUNoYW5uZWxMb2FkUmVwb3J0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKLQkJZWxzZSBpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUSkKLQkJCS8vIE5vaXNlIEhpc3RvZ3JhbSBtZWFzdXJlbWVudCByZXF1ZXN0Ci0JCQlOb2lzZUhpc3RSZXBvcnRBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOwotCi0JCXBBZC0+U3RhQ2ZnLlBhcmFsbGVsUmVxID0gRkFMU0U7Ci0JCXBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCsrOwotCX0KLQotCWlmIChwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHggPj0gcEFkLT5TdGFDZmcuUk1SZXFDbnQpCi0JewotCQkvLyA0LiBUaGVyZSBpcyBubyBtb3JlIHVucHJvY2Vzc2VkIG1lYXN1cmVtZW50IHJlcXVlc3QsIGdvIGZvciB0cmFuc21pdCB0aGlzIHJlcG9ydAotCQlBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24ocEFkKTsKLQkJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfSURMRTsKLQl9Ci0JZWxzZQotCXsKLQkJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4XTsKLQotCQlpZiAocFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQl7Ci0JCQlSVE1QdXNlY0RlbGF5KDEwMDAwMCk7Ci0JCX0KLQotCQkvLyA1LiBUaGVyZSBhcmUgbW9yZSByZXF1ZXN0cyB0byBiZSBtZWFzdXJlCi0JCU1sbWVFbnF1ZXVlKHBBZCwgQUlST05FVF9TVEFURV9NQUNISU5FLCBNVDJfQUlST05FVF9TQ0FOX1JFUSwgMCwgTlVMTCk7Ci0JCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBaXJvbmV0UmVwb3J0QWN0aW9uIDwtLS0tLVxuIikpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJQWlyb25ldEZpbmFsUmVwb3J0QWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCVBVQ0hBUgkJCQkJcERlc3Q7Ci0JUEFJUk9ORVRfSUFQUF9IRUFERVIJcElBUFA7Ci0JUEhFQURFUl84MDJfMTEJCQlwSGVhZGVyOwotCVVDSEFSCQkJCQlBY2tSYXRlID0gUkFURV8yOwotCVVTSE9SVAkJCQkJQWNrRHVyYXRpb24gPSAwOwotCU5ESVNfU1RBVFVTCQkJCU5TdGF0dXM7Ci0JUFVDSEFSCQkJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlVTE9ORwkJCQkJRnJhbWVMZW4gPSAwOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWlyb25ldEZpbmFsUmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOwotCi0JLy8gMC4gU2V0IHVwIHRoZSBmcmFtZSBwb2ludGVyLCBGcmFtZSB3YXMgaW5pdGVkIGF0IHRoZSBlbmQgb2YgbWVzc2FnZSBhY3Rpb24KLQlwRGVzdCA9ICZwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZltMRU5HVEhfODAyXzExXTsKLQotCS8vIDEuIFVwZGF0ZSByZXBvcnQgSUFQUCBmaWVsZHMKLQlwSUFQUCA9IChQQUlST05FVF9JQVBQX0hFQURFUikgcERlc3Q7Ci0KLQkvLyAyLiBDb3B5IENpc2NvIFNOQVAgaGVhZGVyCi0JTmRpc01vdmVNZW1vcnkocElBUFAtPkNpc2NvU25hcEhlYWRlciwgU05BUF9BSVJPTkVULCBMRU5HVEhfODAyXzFfSCk7Ci0KLQkvLyAzLiBuZXR3b3JrIG9yZGVyIGZvciB0aGlzIDE2Yml0IGxlbmd0aAotCXBJQVBQLT5MZW5ndGggID0gY3B1MmJlMTYocEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4gLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIXzgwMl8xX0gpOwotCi0JLy8gMy4xIHNhbml0eSBjaGVjayB0aGUgcmVwb3J0IGxlbmd0aCwgaWdub3JlIGl0IGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmVwb3J0Ci0JaWYgKGJlMmNwdTE2KHBJQVBQLT5MZW5ndGgpIDw9IDE4KQotCQlyZXR1cm47Ci0KLQkvLyA0LiBUeXBlIG11c3QgYmUgMHgzMgotCXBJQVBQLT5UeXBlICAgID0gQUlST05FVF9JQVBQX1RZUEU7Ci0KLQkvLyA1LiBTdWJUeXBlIGZvciByZXBvcnQgbXVzdCBiZSAweDgxCi0JcElBUFAtPlN1YlR5cGUgPSBBSVJPTkVUX0lBUFBfU1VCVFlQRV9SRVBPUlQ7Ci0KLQkvLyA2LiBEQSBpcyBub3QgdXNlZCBhbmQgbXVzdCBiZSB6ZXJvLCBhbHRob3VnaCB0aGUgd2hvbGUgZnJhbWUgd2FzIGNsZWFyZWQgYXQgdGhlIHN0YXJ0IG9mIGZ1bmN0aW9uCi0JLy8gICAgV2Ugd2lsbCBkbyBpdCBhZ2FpbiBoZXJlLiBXZSBjYW4gdXNlIEJTU0lEIGluc3RlYWQKLQlDT1BZX01BQ19BRERSKHBJQVBQLT5EQSwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCi0JLy8gNy4gU0EgaXMgdGhlIGNsaWVudCByZXBvcnRpbmcgd2hpY2ggbXVzdCBiZSBvdXIgTUFDCi0JQ09QWV9NQUNfQUREUihwSUFQUC0+U0EsIHBBZC0+Q3VycmVudEFkZHJlc3MpOwotCi0JLy8gOC4gQ29weSB0aGUgc2F2ZWQgZGlhbG9nIHRva2VuCi0JcElBUFAtPlRva2VuID0gcEFkLT5TdGFDZmcuSUFQUFRva2VuOwotCi0JLy8gOS4gTWFrZSB0aGUgUmVwb3J0IGZyYW1lIDgwMi4xMSBoZWFkZXIKLQkvLyAgICBSZXVzZSBmdW5jdGlvbiBpbiB3cGEuYwotCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmOwotCXBBZC0+U2VxdWVuY2UgKys7Ci0JV3BhTWFjSGVhZGVySW5pdChwQWQsIHBIZWFkZXIsIDAsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQotCS8vIEFDSyBzaXplCWlzIDE0IGluY2x1ZGUgQ1JDLCBhbmQgaXRzIHJhdGUJaXMgYmFzZWQgb24gcmVhbCB0aW1lIGluZm9ybWF0aW9uCi0JQWNrUmF0ZSAgICAgPSBwQWQtPkNvbW1vbkNmZy5FeHBlY3RlZEFDS1JhdGVbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOwotCUFja0R1cmF0aW9uID0gUlRNUENhbGNEdXJhdGlvbihwQWQsIEFja1JhdGUsIDE0KTsKLQlwSGVhZGVyLT5EdXJhdGlvbiA9IHBBZC0+Q29tbW9uQ2ZnLkRzaWZzICsgQWNrRHVyYXRpb247Ci0KLQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJcmV0dXJuOwotCi0JLy8gMTAuIFByZXBhcmUgcmVwb3J0IGZyYW1lIHdpdGggZHluYW1pYyBvdXRidWZmZXIuIEp1c3Qgc2ltcGx5IGNvcHkgZXZlcnl0aGluZy4KLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCSAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuLCBwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZiwKLQkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0KLQkvLyAxMS4gU2VuZCB1c2luZyBwcmlvcml0eSBxdWV1ZQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0KLQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlID0gTVNSTl9UWVBFX1VOVVNFRDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFpcm9uZXRGaW5hbFJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUNoYW5uZWxMb2FkUmVwb3J0QWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJSW5kZXgpCi17Ci0JUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UCXBSZXBvcnQ7Ci0JUENIQU5ORUxfTE9BRF9SRVBPUlQJCXBMb2FkOwotCVBVQ0hBUgkJCQkJCXBEZXN0OwotCVVDSEFSCQkJCQkJQ0NBQnVzeUZyYWN0aW9uOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24gLS0tLS0+XG4iKSk7Ci0KLQkvLyBEaXNhYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uLCBtYWtlIGl0IGJhY2sgdG8gbm9ybWFsCi0JUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOyAvLyBTdGFpb24gbm90IGRyb3AgY29udHJvbCBmcmFtZSB3aWxsIGZhaWwgV2lGaSBDZXJ0aWZpY2F0aW9uLgotCi0JLy8gMC4gU2V0dXAgcG9pbnRlciBmb3IgcHJvY2Vzc2luZyBiZWFjb24gJiBwcm9iZSByZXNwb25zZQotCXBEZXN0ID0gKFBVQ0hBUikgJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW3BBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuXTsKLQlwUmVwb3J0ID0gKFBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCkgcERlc3Q7Ci0KLQkvLyAxLiBGaWxsIE1lYXN1cmVtZW50IHJlcG9ydCBlbGVtZW50IGZpZWxkLgotCXBSZXBvcnQtPkVpZCAgICA9IElFX01FQVNVUkVNRU5UX1JFUE9SVDsKLQkvLyBGaXhlZCBMZW5ndGggYXQgOSwgbm90IGluY2x1ZGUgRWlkIGFuZCBsZW5ndGggZmllbGRzCi0JcFJlcG9ydC0+TGVuZ3RoID0gOTsKLQlwUmVwb3J0LT5Ub2tlbiAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLlJlcUVsZW0uVG9rZW47Ci0JcFJlcG9ydC0+TW9kZSAgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5SZXFFbGVtLk1vZGU7Ci0JcFJlcG9ydC0+VHlwZSAgID0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVE7Ci0KLQkvLyAyLiBGaWxsIGNoYW5uZWwgcmVwb3J0IG1lYXN1cmVtZW50IGRhdGEKLQlwRGVzdCArPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOwotCXBMb2FkICA9IChQQ0hBTk5FTF9MT0FEX1JFUE9SVCkgcERlc3Q7Ci0JcExvYWQtPkNoYW5uZWwgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5NZWFzdXJlbWVudC5DaGFubmVsOwotCXBMb2FkLT5TcGFyZSAgICA9IDA7Ci0JcExvYWQtPkR1cmF0aW9uID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5NZWFzdXJlbWVudC5EdXJhdGlvbjsKLQotCS8vIDMuIENhbGN1bGF0ZSB0aGUgQ0NBIEJ1c3kgRnJhY3Rpb24KLQkvLyAgICAoQnl0ZXMgKyBBQ0sgc2l6ZSkgKiA4IC8gVHggc3BlZWQgKiAyNTUgLyAxMDAwIC8gbWVhc3VyZW1lbnQgZHVyYXRpb24sIHVzZSAyNCB1cyBUeCBzcGVlZAotCS8vICAgICA9ICAoQnl0ZXMgKyBBQ0spIC8gMTIgLyBkdXJhdGlvbgotCS8vICAgICA5IGlzIHRoZSBnb29kIHZhbHVlIGZvciBwQWQtPlN0YUNmZy5DTEZhY3RvcgotCS8vIENDQUJ1c3lGcmFjdGlvbiA9IChVQ0hBUikgKHBBZC0+U3RhQ2ZnLkNMQnVzeUJ5dGVzIC8gOSAvIHBMb2FkLT5EdXJhdGlvbik7Ci0JQ0NBQnVzeUZyYWN0aW9uID0gKFVDSEFSKSAocEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgLyBwQWQtPlN0YUNmZy5DTEZhY3RvciAvIHBMb2FkLT5EdXJhdGlvbik7Ci0JaWYgKENDQUJ1c3lGcmFjdGlvbiA8IDEwKQotCQkJQ0NBQnVzeUZyYWN0aW9uID0gKFVDSEFSKSAocEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgLyAzIC8gcExvYWQtPkR1cmF0aW9uKSArIDE7Ci0KLQlwTG9hZC0+Q0NBQnVzeSA9IENDQUJ1c3lGcmFjdGlvbjsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTEJ1c3lCeXRlICVsZCwgRHVyYXRpb24gJWQsIFJlc3VsdCwgJWRcbiIsIHBBZC0+U3RhQ2ZnLkNMQnVzeUJ5dGVzLCBwTG9hZC0+RHVyYXRpb24sIENDQUJ1c3lGcmFjdGlvbikpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRnJhbWVSZXBvcnRMZW4gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7Ci0JcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4gKz0gKHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCkgKyBzaXplb2YoQ0hBTk5FTF9MT0FEX1JFUE9SVCkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYW1lUmVwb3J0TGVuICVkXG4iLCBwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbikpOwotCi0JLy8gNC4gQ2xlYXIgY2hhbm5lbCBsb2FkIG1lYXN1cmVtZW50IGZsYWcKLQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UKTsKLQotCS8vIDUuIHJlc2V0IHRvIGlkbGUgc3RhdGUKLQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9JRExFOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlOb2lzZUhpc3RSZXBvcnRBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlJbmRleCkKLXsKLQlQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQJcFJlcG9ydDsKLQlQTk9JU0VfSElTVF9SRVBPUlQJCQlwTm9pc2U7Ci0JUFVDSEFSCQkJCQkJcERlc3Q7Ci0JVUNIQVIJCQkJCQlpLE5vaXNlQ250OwotCVVTSE9SVAkJCQkJCVRvdGFsUlBJQ250LCBUb3RhbFJQSVN1bTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vaXNlSGlzdFJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKLQotCS8vIDAuIERpc2FibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24sIG1ha2UgaXQgYmFjayB0byBub3JtYWwKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7IC8vIFN0YWlvbiBub3QgZHJvcCBjb250cm9sIGZyYW1lIHdpbGwgZmFpbCBXaUZpIENlcnRpZmljYXRpb24uCi0JLy8gMS4gU2V0dXAgcG9pbnRlciBmb3IgcHJvY2Vzc2luZyBiZWFjb24gJiBwcm9iZSByZXNwb25zZQotCXBEZXN0ID0gKFBVQ0hBUikgJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW3BBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuXTsKLQlwUmVwb3J0ID0gKFBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCkgcERlc3Q7Ci0KLQkvLyAyLiBGaWxsIE1lYXN1cmVtZW50IHJlcG9ydCBlbGVtZW50IGZpZWxkLgotCXBSZXBvcnQtPkVpZCAgICA9IElFX01FQVNVUkVNRU5UX1JFUE9SVDsKLQkvLyBGaXhlZCBMZW5ndGggYXQgMTYsIG5vdCBpbmNsdWRlIEVpZCBhbmQgbGVuZ3RoIGZpZWxkcwotCXBSZXBvcnQtPkxlbmd0aCA9IDE2OwotCXBSZXBvcnQtPlRva2VuICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uUmVxRWxlbS5Ub2tlbjsKLQlwUmVwb3J0LT5Nb2RlICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLlJlcUVsZW0uTW9kZTsKLQlwUmVwb3J0LT5UeXBlICAgPSBNU1JOX1RZUEVfTk9JU0VfSElTVF9SRVE7Ci0KLQkvLyAzLiBGaWxsIG5vaXNlIGhpc3RvZ3JhbSByZXBvcnQgbWVhc3VyZW1lbnQgZGF0YQotCXBEZXN0ICs9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7Ci0JcE5vaXNlICA9IChQTk9JU0VfSElTVF9SRVBPUlQpIHBEZXN0OwotCXBOb2lzZS0+Q2hhbm5lbCAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLk1lYXN1cmVtZW50LkNoYW5uZWw7Ci0JcE5vaXNlLT5TcGFyZSAgICA9IDA7Ci0JcE5vaXNlLT5EdXJhdGlvbiA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uTWVhc3VyZW1lbnQuRHVyYXRpb247Ci0JLy8gNC4gRmlsbCBOb2lzZSBoaXN0b2dyYW0sIHRoZSB0b3RhbCBSUEkgY291bnRzIHNob3VsZCBiZSAwLjQgKiBUVQotCS8vICAgIFdlIGVzdGltYXRlIDQwMDAgbm9ybWFsIHBhY2tldHMgcmVjZWl2ZWQgZHVybmluZyAxMCBzZWNvbmRzIHRlc3QuCi0JLy8gICAgQWRqdXN0IGl0IGlmIHJlcXVpcmVkLgotCS8vIDMgaXMgYSBnb29kIHZhbHVlIGZvciBwQWQtPlN0YUNmZy5OSEZhY3RvcgotCS8vIFRvdGFsUlBJQ250ID0gcE5vaXNlLT5EdXJhdGlvbiAqIDMgLyAxMDsKLQlUb3RhbFJQSUNudCA9IHBOb2lzZS0+RHVyYXRpb24gKiBwQWQtPlN0YUNmZy5OSEZhY3RvciAvIDEwOwotCVRvdGFsUlBJU3VtID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JewotCQlUb3RhbFJQSVN1bSArPSBwQWQtPlN0YUNmZy5SUElEZW5zaXR5W2ldOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSUEkgJWQgQ29udXRzICVkXG4iLCBpLCBwQWQtPlN0YUNmZy5SUElEZW5zaXR5W2ldKSk7Ci0JfQotCi0JLy8gRG91YmxlIGNoZWNrIGlmIHRoZSBjb3VudGVyIGlzIGxhcmdlciB0aGFuIG91ciBleHBlY3RhdGlvbi4KLQkvLyBXZSB3aWxsIHJlcGxhY2UgaXQgd2l0aCB0aGUgdG90YWwgbnVtYmVyIHBsdXMgYSBmcmFjdGlvbi4KLQlpZiAoVG90YWxSUElTdW0gPiBUb3RhbFJQSUNudCkKLQkJVG90YWxSUElDbnQgPSBUb3RhbFJQSVN1bSArIHBOb2lzZS0+RHVyYXRpb24gLyAyMDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRvdGFsIFJQSSBDb251dHMgJWRcbiIsIFRvdGFsUlBJQ250KSk7Ci0KLQkvLyA1LiBJbml0aWFsaXplIG5vaXNlIGNvdW50IGZvciB0aGUgdG90YWwgc3VtbWF0aW9uIG9mIDB4ZmYKLQlOb2lzZUNudCA9IDA7Ci0JZm9yIChpID0gMTsgaSA8IDg7IGkrKykKLQl7Ci0JCXBOb2lzZS0+RGVuc2l0eVtpXSA9IChVQ0hBUikgKHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gKiAyNTUgLyBUb3RhbFJQSUNudCk7Ci0JCWlmICgocE5vaXNlLT5EZW5zaXR5W2ldID09IDApICYmIChwQWQtPlN0YUNmZy5SUElEZW5zaXR5W2ldICE9IDApKQotCQkJcE5vaXNlLT5EZW5zaXR5W2ldKys7Ci0JCU5vaXNlQ250ICs9IHBOb2lzZS0+RGVuc2l0eVtpXTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVwb3J0ZWQgUlBJWyVkXSAgPSAweCUwMnhcbiIsIGksIHBOb2lzZS0+RGVuc2l0eVtpXSkpOwotCX0KLQotCS8vIDYuIFJQSVswXSByZXByZXNlbnRzIHRoZSByZXN0IG9mIGNvdW50cwotCXBOb2lzZS0+RGVuc2l0eVswXSA9IDB4ZmYgLSBOb2lzZUNudDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZXBvcnRlZCBSUElbMF0gID0gMHglMDJ4XG4iLCBwTm9pc2UtPkRlbnNpdHlbMF0pKTsKLQotCXBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuICs9IChzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpICsgc2l6ZW9mKE5PSVNFX0hJU1RfUkVQT1JUKSk7Ci0KLQkvLyA3LiBDbGVhciBjaGFubmVsIGxvYWQgbWVhc3VyZW1lbnQgZmxhZwotCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQpOwotCi0JLy8gOC4gcmVzZXQgdG8gaWRsZSBzdGF0ZQotCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX0lETEU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb2lzZUhpc3RSZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlQcmVwYXJlIEJlYWNvbiByZXBvcnQgYWN0aW9uLAotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlCZWFjb25SZXBvcnRBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlJbmRleCkKLXsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCZWFjb25SZXBvcnRBY3Rpb24gLS0tLS0+XG4iKSk7Ci0KLQkvLyBMb29rcyBsaWtlIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdGhpbmcgbmVlZCB0byBkbyBoZXJlLgotCS8vIEFsbCBtZWFzdXJlbWVudCByZXBvcnQgYWxyZWFkeSBmaW5pc2hlZCBpbiBBZGRCZWFjb25SZXBvcnQKLQkvLyBUaGUgbGVuZ3RoIGlzIGluIHRoZSBGcmFtZVJlcG9ydExlbgotCi0JLy8gcmVzZXQgQmVhY29uIGluZGV4IGZvciBuZXh0IGJlYWNvbiByZXF1ZXN0Ci0JcEFkLT5TdGFDZmcuTGFzdEJzc0luZGV4ID0gMHhmZjsKLQotCS8vIHJlc2V0IHRvIGlkbGUgc3RhdGUKLQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9JRExFOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUmVwb3J0QWN0aW9uIDwtLS0tLVxuIikpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQkJSW5kZXgJCUN1cnJlbnQgQlNTSUQgaW4gQ0NYQnNzdGFiIGVudHJ5IGluZGV4Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlBaXJvbmV0QWRkQmVhY29uUmVwb3J0KAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglVTE9ORwkJCQlJbmRleCwKLQlJTglQTUxNRV9RVUVVRV9FTEVNCXBFbGVtKQotewotCVBWT0lECQkJCQkJcE1zZzsKLQlQVUNIQVIJCQkJCQlwU3JjLCBwRGVzdDsKLQlVQ0hBUgkJCQkJCVJlcUlkeDsKLQlVTE9ORwkJCQkJCU1zZ0xlbjsKLQlVU0hPUlQJCQkJCQlMZW5ndGg7Ci0JUEZSQU1FXzgwMl8xMQkJCQlwRnJhbWU7Ci0JUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UCXBSZXBvcnQ7Ci0JUEVJRF9TVFJVQ1QJCQkgICAgICAgIHBFaWQ7Ci0JUEJFQUNPTl9SRVBPUlQJCQkJcEJlYWNvblJlcG9ydDsKLQlQQlNTX0VOVFJZCQkJCQlwQnNzOwotCi0JLy8gMC4gU2V0dXAgcG9pbnRlciBmb3IgcHJvY2Vzc2luZyBiZWFjb24gJiBwcm9iZSByZXNwb25zZQotCXBNc2cgICA9IHBFbGVtLT5Nc2c7Ci0JTXNnTGVuID0gcEVsZW0tPk1zZ0xlbjsKLQlwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSkgcE1zZzsKLQlwU3JjICAgPSBwRnJhbWUtPk9jdGV0OwkJCQkvLyBTdGFydCBmcm9tIEFQIFRTRgotCXBCc3MgICA9IChQQlNTX0VOVFJZKSAmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc0VudHJ5W0luZGV4XTsKLQlSZXFJZHggPSBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHg7Ci0KLQkvLyAxIENoZWNrIHRoZSBJbmRleCwgaWYgd2UgYWxyZWFkeSBjcmVhdGUgdGhpcyBlbnRyeSwgb25seSB1cGRhdGUgdGhlIGF2ZXJhZ2UgUlNTSQotCWlmICgoSW5kZXggPD0gcEFkLT5TdGFDZmcuTGFzdEJzc0luZGV4KSAmJiAocEFkLT5TdGFDZmcuTGFzdEJzc0luZGV4ICE9IDB4ZmYpKQotCXsKLQkJcERlc3QgID0gKFBVQ0hBUikgJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW3BBZC0+U3RhQ2ZnLkJzc1JlcG9ydE9mZnNldFtJbmRleF1dOwotCQkvLyBQb2ludCB0byBic3MgcmVwb3J0IGluZm9ybWF0aW9uCi0JCXBEZXN0ICs9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7Ci0JCXBCZWFjb25SZXBvcnQgPSAoUEJFQUNPTl9SRVBPUlQpIHBEZXN0OwotCi0JCS8vIFVwZGF0ZSBSeCBwb3dlciwgaW4gZEJtCi0JCS8vIEdldCB0aGUgb3JpZ2luYWwgUlNTSSByZWFkYmFjayBmcm9tIEJCUAotCQlwQmVhY29uUmVwb3J0LT5SeFBvd2VyICs9IHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7Ci0JCS8vIEF2ZXJhZ2UgdGhlIFJzc2kgcmVhZGluZwotCQlwQmVhY29uUmVwb3J0LT5SeFBvd2VyICA9IChwQmVhY29uUmVwb3J0LT5SeFBvd2VyICsgcEJzcy0+UnNzaSkgLyAyOwotCQkvLyBHZXQgdG8gZEJtIGZvcm1hdAotCQlwQmVhY29uUmVwb3J0LT5SeFBvd2VyIC09IHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQnNzaWQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggIiwKLQkJCXBCc3MtPkJzc2lkWzBdLCBwQnNzLT5Cc3NpZFsxXSwgcEJzcy0+QnNzaWRbMl0sCi0JCQlwQnNzLT5Cc3NpZFszXSwgcEJzcy0+QnNzaWRbNF0sIHBCc3MtPkJzc2lkWzVdKSk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJ4UG93ZXJbJWxkXSBSc3NpICVkLCBBdmcgUnNzaSAlZFxuIiwgSW5kZXgsIChwQnNzLT5Sc3NpIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSksIHBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgLSAyNTYpKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRnJhbWVSZXBvcnRMZW4gPSAlZFxuIiwgcEFkLT5TdGFDZmcuQnNzUmVwb3J0T2Zmc2V0W0luZGV4XSkpOwotCi0JCS8vIFVwZGF0ZSBvdGhlciBpbmZvcm1hdGlvbiBoZXJlCi0KLQkJLy8gRG9uZQotCQlyZXR1cm47Ci0JfQotCi0JLy8gMi4gVXBkYXRlIHJlcG9ydGVkIEluZGV4Ci0JcEFkLT5TdGFDZmcuTGFzdEJzc0luZGV4ID0gSW5kZXg7Ci0KLQkvLyAzLiBTZXR1cCB0aGUgYnVmZmVyIGFkZHJlc3MgZm9yIGNvcHlpbmcgdGhpcyBCU1NJRCBpbnRvIHJlcG9ydGluZyBmcmFtZQotCS8vICAgIFRoZSBvZmZzZXQgc2hvdWxkIHN0YXJ0IGFmdGVyIDgwMi4xMSBoZWFkZXIgYW5kIHJlcG9ydCBmcmFtZSBoZWFkZXIuCi0JcERlc3QgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW5dOwotCi0JLy8gNC4gU2F2ZSB0aGUgc3RhcnQgb2Zmc2V0IG9mIGVhY2ggQnNzIGluIHJlcG9ydCBmcmFtZQotCXBBZC0+U3RhQ2ZnLkJzc1JlcG9ydE9mZnNldFtJbmRleF0gPSBwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbjsKLQotCS8vIDUuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGZpZWxkcwotCXBSZXBvcnQgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKLQlwUmVwb3J0LT5FaWQgPSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQ7Ci0JcFJlcG9ydC0+TGVuZ3RoID0gMDsKLQlwUmVwb3J0LT5Ub2tlbiAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5SZXFFbGVtLlRva2VuOwotCXBSZXBvcnQtPk1vZGUgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLlJlcUVsZW0uTW9kZTsKLQlwUmVwb3J0LT5UeXBlICAgPSBNU1JOX1RZUEVfQkVBQ09OX1JFUTsKLQlMZW5ndGggICAgICAgICAgPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOwotCXBEZXN0ICAgICAgICAgICs9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7Ci0KLQkvLyA2LiBTdGFydCB0aGViZWFjb24gcmVwb3J0IGZvcm1hdAotCXBCZWFjb25SZXBvcnQgPSAoUEJFQUNPTl9SRVBPUlQpIHBEZXN0OwotCXBEZXN0ICAgICAgICArPSBzaXplb2YoQkVBQ09OX1JFUE9SVCk7Ci0JTGVuZ3RoICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKLQotCS8vIDcuIENvcHkgQ2hhbm5lbCBudW1iZXIKLQlwQmVhY29uUmVwb3J0LT5DaGFubmVsICAgICAgICA9IHBCc3MtPkNoYW5uZWw7Ci0JcEJlYWNvblJlcG9ydC0+U3BhcmUgICAgICAgICAgPSAwOwotCXBCZWFjb25SZXBvcnQtPkR1cmF0aW9uICAgICAgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W1JlcUlkeF0uTWVhc3VyZW1lbnQuRHVyYXRpb247Ci0JcEJlYWNvblJlcG9ydC0+UGh5VHlwZSAgICAgICAgPSAoKHBCc3MtPlN1cFJhdGVMZW4rcEJzcy0+RXh0UmF0ZUxlbiA+IDQpID8gUEhZX0VSUCA6IFBIWV9EU1MpOwotCS8vIDguIFJ4IHBvd2VyLCBpbiBkQm0KLQlwQmVhY29uUmVwb3J0LT5SeFBvd2VyICAgICAgICA9IHBCc3MtPlJzc2kgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQnNzaWQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggIiwKLQkJcEJzcy0+QnNzaWRbMF0sIHBCc3MtPkJzc2lkWzFdLCBwQnNzLT5Cc3NpZFsyXSwKLQkJcEJzcy0+QnNzaWRbM10sIHBCc3MtPkJzc2lkWzRdLCBwQnNzLT5Cc3NpZFs1XSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJ4UG93ZXJbJWxkXSwgUnNzaSAlZFxuIiwgSW5kZXgsIHBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgLSAyNTYpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFtZVJlcG9ydExlbiA9ICVkXG4iLCBwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbikpOwotCi0JcEJlYWNvblJlcG9ydC0+QmVhY29uSW50ZXJ2YWwgPSBwQnNzLT5CZWFjb25QZXJpb2Q7Ci0JQ09QWV9NQUNfQUREUihwQmVhY29uUmVwb3J0LT5CU1NJRCwgcEZyYW1lLT5IZHIuQWRkcjMpOwotCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25SZXBvcnQtPlBhcmVudFRTRiwgcFNyYywgNCk7Ci0JTmRpc01vdmVNZW1vcnkocEJlYWNvblJlcG9ydC0+VGFyZ2V0VFNGLCAmcEVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOwotCU5kaXNNb3ZlTWVtb3J5KCZwQmVhY29uUmVwb3J0LT5UYXJnZXRUU0ZbNF0sICZwRWxlbS0+VGltZVN0YW1wLnUuSGlnaFBhcnQsIDQpOwotCi0JLy8gOS4gU2tpcCB0aGUgYmVhY29uIGZyYW1lIGFuZCBvZmZzZXQgdG8gc3RhcnQgb2YgY2FwYWJpbGl0eWluZm8gc2luY2Ugd2UgYWxyZWFkeSBwcm9jZXNzZWQgY2FwYWJpbGl0eWluZm8KLQlwU3JjICs9IChUSU1FU1RBTVBfTEVOICsgMik7Ci0JcEJlYWNvblJlcG9ydC0+Q2FwYWJpbGl0eUluZm8gPSAqKFVTSE9SVCAqKXBTcmM7Ci0KLQkvLyAxMC4gUG9pbnQgdG8gc3RhcnQgb2YgZWxlbWVudCBJRAotCXBTcmMgKz0gMjsKLQlwRWlkID0gKFBFSURfU1RSVUNUKSBwU3JjOwotCi0JLy8gMTEuIFN0YXJ0IHByb2Nlc3MgYWxsIHZhcmlhYmxlIEVpZCBvYXlsb2FkIGFuZCBhZGQgdGhlIGFwcHJvcHJpYXRlIHRvIHRoZSBmcmFtZSByZXBvcnQKLQl3aGlsZSAoKChQVUNIQVIpIHBFaWQgKyBwRWlkLT5MZW4gKyAxKSA8ICgoUFVDSEFSKSBwRnJhbWUgKyBNc2dMZW4pKQotCXsKLQkJLy8gT25seSBsaW1pdGVkIEVJRCBhcmUgcmVxdWlyZWQgdG8gcmVwb3J0IGZvciBDQ1ggMi4gSXQgaW5jbHVkZXMgU1NJRCwgU3VwcG9ydGVkIHJhdGUsCi0JCS8vIEZIIHBhcmFtZW50ZXIgc2V0LCBEUyBwYXJhbWV0ZXIgc2V0LCBDRiBwYXJhbWV0ZXIgc2V0LCBJQlNTIHBhcmFtZXRlciBzZXQsCi0JCS8vIFRJTSAocmVwb3J0IGZpcnN0IDQgYnl0ZXMgb25seSwgcmFkaW8gbWVhc3VyZW1lbnQgY2FwYWJpbGl0eQotCQlzd2l0Y2ggKHBFaWQtPkVpZCkKLQkJewotCQkJY2FzZSBJRV9TU0lEOgotCQkJY2FzZSBJRV9TVVBQX1JBVEVTOgotCQkJY2FzZSBJRV9GSF9QQVJNOgotCQkJY2FzZSBJRV9EU19QQVJNOgotCQkJY2FzZSBJRV9DRl9QQVJNOgotCQkJY2FzZSBJRV9JQlNTX1BBUk06Ci0JCQkJTmRpc01vdmVNZW1vcnkocERlc3QsIHBFaWQsIHBFaWQtPkxlbiArIDIpOwotCQkJCXBEZXN0ICArPSAocEVpZC0+TGVuICsgMik7Ci0JCQkJTGVuZ3RoICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBJRV9NRUFTVVJFTUVOVF9DQVBBQklMSVRZOgotCQkJCS8vIFNpbmNlIHRoaXMgSUUgaXMgZHVwbGljYXRlZCB3aXRoIFdQQSBzZWN1cml0eSBJRSwgd2UgaGFzIHRvIGRvIHNhbml0eSBjaGVjayBiZWZvcmUKLQkJCQkvLyByZWNvZ25pemUgaXQuCi0JCQkJLy8gMS4gSXQgYWxzbyBoYXMgZml4ZWQgNiBieXRlcyBJRSBsZW5ndGguCi0JCQkJaWYgKHBFaWQtPkxlbiAhPSA2KQotCQkJCQlicmVhazsKLQkJCQkvLyAyLiBDaGVjayB0aGUgQ2lzY28gQWlyb25ldCBPVUkKLQkJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KENJU0NPX09VSSwgKHBTcmMgKyAyKSwgMykpCi0JCQkJewotCQkJCQkvLyBNYXRjaGVkLCB0aGlzIGlzIHdoYXQgd2Ugd2FudAotCQkJCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEVpZCwgcEVpZC0+TGVuICsgMik7Ci0JCQkJCXBEZXN0ICArPSAocEVpZC0+TGVuICsgMik7Ci0JCQkJCUxlbmd0aCArPSAocEVpZC0+TGVuICsgMik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIElFX1RJTToKLQkJCQlpZiAocEVpZC0+TGVuID4gNCkKLQkJCQl7Ci0JCQkJCS8vIE1heSB0cnVuY2F0ZSBhbmQgcmVwb3J0IHRoZSBmaXJzdCA0IGJ5dGVzIG9ubHksIHdpdGggdGhlIGVpZCAmIGxlbiwgdG90YWwgc2hvdWxkIGJlIDYKLQkJCQkJTmRpc01vdmVNZW1vcnkocERlc3QsIHBFaWQsIDYpOwotCQkJCQlwRGVzdCAgKz0gNjsKLQkJCQkJTGVuZ3RoICs9IDY7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwRWlkLCBwRWlkLT5MZW4gKyAyKTsKLQkJCQkJcERlc3QgICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJCQkJTGVuZ3RoICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJLy8gMTIuIE1vdmUgdG8gbmV4dCBlbGVtZW50IElECi0JCXBTcmMgKz0gKDIgKyBwRWlkLT5MZW4pOwotCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwU3JjOwotCX0KLQotCS8vIDEzLiBVcGRhdGUgdGhlIGxlbmd0aCBpbiB0aGUgaGVhZGVyLCBub3QgaW5jbHVkZSBFSUQgYW5kIGxlbmd0aAotCXBSZXBvcnQtPkxlbmd0aCA9IExlbmd0aCAtIDQ7Ci0KLQkvLyAxNC4gVXBkYXRlIHRoZSBmcmFtZSByZXBvcnQgYnVmZmVyIGRhdGEgbGVuZ3RoCi0JcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4gKz0gTGVuZ3RoOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZSIGxlbiA9ICVkXG4iLCBwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbikpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQkJSW5kZXgJCUN1cnJlbnQgQlNTSUQgaW4gQ0NYQnNzdGFiIGVudHJ5IGluZGV4Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlBaXJvbmV0Q3JlYXRlQmVhY29uUmVwb3J0RnJvbUJzc1RhYmxlKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCkKLXsKLQlQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQJcFJlcG9ydDsKLQlQQkVBQ09OX1JFUE9SVAkJCQlwQmVhY29uUmVwb3J0OwotCVVDSEFSCQkJCQkJSW5kZXgsIFJlcUlkeDsKLQlVU0hPUlQJCQkJCQlMZW5ndGg7Ci0JUFVDSEFSCQkJCQkJcERlc3Q7Ci0JUEJTU19FTlRSWQkJCQkJcEJzczsKLQotCS8vIDAuIHNldHVwIGJhc2UgcG9pbnRlcgotCVJlcUlkeCA9IHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeDsKLQotCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IHBBZC0+U3RhQ2ZnLkNDWEJzc1RhYi5Cc3NOcjsgSW5kZXgrKykKLQl7Ci0JCS8vIDEuIFNldHVwIHRoZSBidWZmZXIgYWRkcmVzcyBmb3IgY29weWluZyB0aGlzIEJTU0lEIGludG8gcmVwb3J0aW5nIGZyYW1lCi0JCS8vICAgIFRoZSBvZmZzZXQgc2hvdWxkIHN0YXJ0IGFmdGVyIDgwMi4xMSBoZWFkZXIgYW5kIHJlcG9ydCBmcmFtZSBoZWFkZXIuCi0JCXBEZXN0ICA9IChQVUNIQVIpICZwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZltwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbl07Ci0JCXBCc3MgICA9IChQQlNTX0VOVFJZKSAmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc0VudHJ5W0luZGV4XTsKLQkJTGVuZ3RoID0gMDsKLQotCQkvLyAyLiBGaWxsIE1lYXN1cmVtZW50IHJlcG9ydCBmaWVsZHMKLQkJcFJlcG9ydCAgICAgICAgID0gKFBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCkgcERlc3Q7Ci0JCXBSZXBvcnQtPkVpZCAgICA9IElFX01FQVNVUkVNRU5UX1JFUE9SVDsKLQkJcFJlcG9ydC0+TGVuZ3RoID0gMDsKLQkJcFJlcG9ydC0+VG9rZW4gID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W1JlcUlkeF0uUmVxRWxlbS5Ub2tlbjsKLQkJcFJlcG9ydC0+TW9kZSAgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W1JlcUlkeF0uUmVxRWxlbS5Nb2RlOwotCQlwUmVwb3J0LT5UeXBlICAgPSBNU1JOX1RZUEVfQkVBQ09OX1JFUTsKLQkJTGVuZ3RoICAgICAgICAgID0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKLQkJcERlc3QgICAgICAgICAgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKLQotCQkvLyAzLiBTdGFydCB0aGUgYmVhY29uIHJlcG9ydCBmb3JtYXQKLQkJcEJlYWNvblJlcG9ydCA9IChQQkVBQ09OX1JFUE9SVCkgcERlc3Q7Ci0JCXBEZXN0ICAgICAgICArPSBzaXplb2YoQkVBQ09OX1JFUE9SVCk7Ci0JCUxlbmd0aCAgICAgICArPSBzaXplb2YoQkVBQ09OX1JFUE9SVCk7Ci0KLQkJLy8gNC4gQ29weSBDaGFubmVsIG51bWJlcgotCQlwQmVhY29uUmVwb3J0LT5DaGFubmVsICAgICAgICA9IHBCc3MtPkNoYW5uZWw7Ci0JCXBCZWFjb25SZXBvcnQtPlNwYXJlICAgICAgICAgID0gMDsKLQkJcEJlYWNvblJlcG9ydC0+RHVyYXRpb24gICAgICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5NZWFzdXJlbWVudC5EdXJhdGlvbjsKLQkJcEJlYWNvblJlcG9ydC0+UGh5VHlwZSAgICAgICAgPSAoKHBCc3MtPlN1cFJhdGVMZW4rcEJzcy0+RXh0UmF0ZUxlbiA+IDQpID8gUEhZX0VSUCA6IFBIWV9EU1MpOwotCQlwQmVhY29uUmVwb3J0LT5SeFBvd2VyICAgICAgICA9IHBCc3MtPlJzc2kgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhOwotCQlwQmVhY29uUmVwb3J0LT5CZWFjb25JbnRlcnZhbCA9IHBCc3MtPkJlYWNvblBlcmlvZDsKLQkJcEJlYWNvblJlcG9ydC0+Q2FwYWJpbGl0eUluZm8gPSBwQnNzLT5DYXBhYmlsaXR5SW5mbzsKLQkJQ09QWV9NQUNfQUREUihwQmVhY29uUmVwb3J0LT5CU1NJRCwgcEJzcy0+QnNzaWQpOwotCQlOZGlzTW92ZU1lbW9yeShwQmVhY29uUmVwb3J0LT5QYXJlbnRUU0YsIHBCc3MtPlBUU0YsIDQpOwotCQlOZGlzTW92ZU1lbW9yeShwQmVhY29uUmVwb3J0LT5UYXJnZXRUU0YsIHBCc3MtPlRUU0YsIDgpOwotCi0JCS8vIDUuIENyZWF0ZSBTU0lECi0JCSpwRGVzdCsrID0gMHgwMDsKLQkJKnBEZXN0KysgPSBwQnNzLT5Tc2lkTGVuOwotCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbik7Ci0JCXBEZXN0ICArPSBwQnNzLT5Tc2lkTGVuOwotCQlMZW5ndGggKz0gKDIgKyBwQnNzLT5Tc2lkTGVuKTsKLQotCQkvLyA2LiBDcmVhdGUgU3VwcG9ydFJhdGVzCi0JCSpwRGVzdCsrID0gMHgwMTsKLQkJKnBEZXN0KysgPSBwQnNzLT5TdXBSYXRlTGVuOwotCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEJzcy0+U3VwUmF0ZSwgcEJzcy0+U3VwUmF0ZUxlbik7Ci0JCXBEZXN0ICArPSBwQnNzLT5TdXBSYXRlTGVuOwotCQlMZW5ndGggKz0gKDIgKyBwQnNzLT5TdXBSYXRlTGVuKTsKLQotCQkvLyA3LiBEUyBQYXJhbWV0ZXIKLQkJKnBEZXN0KysgPSAweDAzOwotCQkqcERlc3QrKyA9IDE7Ci0JCSpwRGVzdCsrID0gcEJzcy0+Q2hhbm5lbDsKLQkJTGVuZ3RoICArPSAzOwotCi0JCS8vIDguIElCU1MgcGFyYW1ldGVyIGlmIHByZXNlbnRzCi0JCWlmIChwQnNzLT5Cc3NUeXBlID09IEJTU19BREhPQykKLQkJewotCQkJKnBEZXN0KysgPSAweDA2OwotCQkJKnBEZXN0KysgPSAyOwotCQkJKihQVVNIT1JUKSBwRGVzdCA9IHBCc3MtPkF0aW1XaW47Ci0JCQlwRGVzdCAgICs9IDI7Ci0JCQlMZW5ndGggICs9IDQ7Ci0JCX0KLQotCQkvLyA5LiBVcGRhdGUgbGVuZ3RoIGZpZWxkLCBub3QgaW5jbHVkZSBFSUQgYW5kIGxlbmd0aAotCQlwUmVwb3J0LT5MZW5ndGggPSBMZW5ndGggLSA0OwotCi0JCS8vIDEwLiBVcGRhdGUgdG90YWwgZnJhbWUgc2l6ZQotCQlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiArPSBMZW5ndGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXNzb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Fzc29jLmMKaW5kZXggMWE1ODcxNS4uNzA1NWYyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXNzb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hc3NvYy5jCkBAIC0zNiwzMSArMzYsMzEgQEAKICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKLVVDSEFSCUNpcGhlcldwYVRlbXBsYXRlW10gPSB7Ci0JCTB4ZGQsIAkJCQkJLy8gV1BBIElFCi0JCTB4MTYsCQkJCQkvLyBMZW5ndGgKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCi0JCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0Ci0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDUwLCAweGYyLCAweDAxCS8vIGF1dGhlbnRpY2F0aW9uCi0JCX07Cit1OCBDaXBoZXJXcGFUZW1wbGF0ZVtdID0geworCTB4ZGQsCQkJLyogV1BBIElFICovCisJMHgxNiwJCQkvKiBMZW5ndGggKi8KKwkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvKiBvdWkgKi8KKwkweDAxLCAweDAwLAkJLyogVmVyc2lvbiAqLworCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8qIE11bHRpY2FzdCAqLworCTB4MDEsIDB4MDAsCQkvKiBOdW1iZXIgb2YgdW5pY2FzdCAqLworCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8qIHVuaWNhc3QgKi8KKwkweDAxLCAweDAwLAkJLyogbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCAqLworCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEJLyogYXV0aGVudGljYXRpb24gKi8KK307CiAKLVVDSEFSCUNpcGhlcldwYTJUZW1wbGF0ZVtdID0gewotCQkweDMwLAkJCQkJLy8gUlNOIElFCi0JCTB4MTQsCQkJCQkvLyBMZW5ndGgKLQkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgotCQkweDAwLCAweDBmLCAweGFjLCAweDAyLAkvLyBncm91cCBjaXBoZXIsIFRLSVAKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIHBhaXJ3aXNlCi0JCTB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCS8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDBmLCAweGFjLCAweDAyLAkvLyBhdXRoZW50aWNhdGlvbgotCQkweDAwLCAweDAwLAkJCQkvLyBSU04gY2FwYWJpbGl0eQotCQl9OwordTggQ2lwaGVyV3BhMlRlbXBsYXRlW10gPSB7CisJMHgzMCwJCQkvKiBSU04gSUUgKi8KKwkweDE0LAkJCS8qIExlbmd0aCAqLworCTB4MDEsIDB4MDAsCQkvKiBWZXJzaW9uICovCisJMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwJLyogZ3JvdXAgY2lwaGVyLCBUS0lQICovCisJMHgwMSwgMHgwMCwJCS8qIG51bWJlciBvZiBwYWlyd2lzZSAqLworCTB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCS8qIHVuaWNhc3QgKi8KKwkweDAxLCAweDAwLAkJLyogbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCAqLworCTB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCS8qIGF1dGhlbnRpY2F0aW9uICovCisJMHgwMCwgMHgwMCwJCS8qIFJTTiBjYXBhYmlsaXR5ICovCit9OwogCi1VQ0hBUglDY3gySWVJbmZvW10gPSB7IDB4MDAsIDB4NDAsIDB4OTYsIDB4MDMsIDB4MDJ9OwordTggQ2N4MkllSW5mb1tdID0geyAweDAwLCAweDQwLCAweDk2LCAweDAzLCAweDAyIH07CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTczLDU1ICs3Myw4NCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBBc3NvY1N0YXRlTWFjaGluZUluaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gIFNUQVRFX01BQ0hJTkUgKlMsCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQordm9pZCBBc3NvY1N0YXRlTWFjaGluZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlMsIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKIHsKLQlTdGF0ZU1hY2hpbmVJbml0KFMsIFRyYW5zLCBNQVhfQVNTT0NfU1RBVEUsIE1BWF9BU1NPQ19NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQVNTT0NfSURMRSwgQVNTT0NfTUFDSElORV9CQVNFKTsKKwlTdGF0ZU1hY2hpbmVJbml0KFMsIFRyYW5zLCBNQVhfQVNTT0NfU1RBVEUsIE1BWF9BU1NPQ19NU0csCisJCQkgKFNUQVRFX01BQ0hJTkVfRlVOQykgRHJvcCwgQVNTT0NfSURMRSwKKwkJCSBBU1NPQ19NQUNISU5FX0JBU0UpOwogCi0JLy8gZmlyc3QgY29sdW1uCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9NTE1FX0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lQXNzb2NSZXFBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19JRExFLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lUmVhc3NvY1JlcUFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lRGlzYXNzb2NSZXFBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19JRExFLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRpc2Fzc29jQWN0aW9uKTsKKwkvKiBmaXJzdCBjb2x1bW4gKi8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfQVNTT0NfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgTWxtZUFzc29jUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfUkVBU1NPQ19SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBNbG1lUmVhc3NvY1JlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIE1sbWVEaXNhc3NvY1JlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJEaXNhc3NvY0FjdGlvbik7CiAKLQkvLyBzZWNvbmQgY29sdW1uCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5SZWFzc29jKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBc3NvY1JzcEFjdGlvbik7Ci0JLy8KLQkvLyBQYXRjaCAzQ29tIEFQIE1PZGU6M0NSV0U0NTRHNzIKLQkvLyBXZSBzZW5kIEFzc29jIHJlcXVlc3QgZnJhbWUgdG8gdGhpcyBBUCwgaXQgYWx3YXlzIHNlbmQgUmVhc3NvYyBSc3Agbm90IEFzc29jaWF0ZSBSc3AuCi0JLy8KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX1JFQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBc3NvY1JzcEFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfQVNTT0NfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylBc3NvY1RpbWVvdXRBY3Rpb24pOworCS8qIHNlY29uZCBjb2x1bW4gKi8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0FTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIEludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpCisJCQkgICAgICBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJEaXNhc3NvY0FjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9BU1NPQ19SU1AsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBQZWVyQXNzb2NSc3BBY3Rpb24pOworCS8qICovCisJLyogUGF0Y2ggM0NvbSBBUCBNT2RlOjNDUldFNDU0RzcyICovCisJLyogV2Ugc2VuZCBBc3NvYyByZXF1ZXN0IGZyYW1lIHRvIHRoaXMgQVAsIGl0IGFsd2F5cyBzZW5kIFJlYXNzb2MgUnNwIG5vdCBBc3NvY2lhdGUgUnNwLiAqLworCS8qICovCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9SRUFTU09DX1JTUCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJBc3NvY1JzcEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfQVNTT0NfVElNRU9VVCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIEFzc29jVGltZW91dEFjdGlvbik7CiAKLQkvLyB0aGlyZCBjb2x1bW4KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5SZWFzc29jKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRpc2Fzc29jQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfUkVBU1NPQ19SU1AsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclJlYXNzb2NSc3BBY3Rpb24pOwotCS8vCi0JLy8gUGF0Y2gsIEFQIGRvZXNuJ3Qgc2VuZCBSZWFzc29jaWF0ZSBSc3AgZnJhbWUgdG8gU3RhdGlvbi4KLQkvLwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9BU1NPQ19SU1AsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclJlYXNzb2NSc3BBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfUkVBU1NPQ19USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKVJlYXNzb2NUaW1lb3V0QWN0aW9uKTsKKwkvKiB0aGlyZCBjb2x1bW4gKi8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfUkVBU1NPQ19SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpCisJCQkgICAgICBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfRElTQVNTT0NfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlckRpc2Fzc29jQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfUkVBU1NPQ19SU1AsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBQZWVyUmVhc3NvY1JzcEFjdGlvbik7CisJLyogKi8KKwkvKiBQYXRjaCwgQVAgZG9lc24ndCBzZW5kIFJlYXNzb2NpYXRlIFJzcCBmcmFtZSB0byBTdGF0aW9uLiAqLworCS8qICovCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0FTU09DX1JTUCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJSZWFzc29jUnNwQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1JFQVNTT0NfVElNRU9VVCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFJlYXNzb2NUaW1lb3V0QWN0aW9uKTsKIAotCS8vIGZvdXJ0aCBjb2x1bW4KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXNzb2MpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfUkVBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblJlYXNzb2MpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEaXNhc3NvY0FjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfRElTQVNTT0NfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylEaXNhc3NvY1RpbWVvdXRBY3Rpb24pOworCS8qIGZvdXJ0aCBjb2x1bW4gKi8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0FTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIEludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpCisJCQkgICAgICBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJEaXNhc3NvY0FjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfRElTQVNTT0NfVElNRU9VVCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIERpc2Fzc29jVGltZW91dEFjdGlvbik7CiAKLQkvLyBpbml0aWFsaXplIHRoZSB0aW1lcgotCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKLQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOwotCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwkvKiBpbml0aWFsaXplIHRoZSB0aW1lciAqLworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsCisJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsCisJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsCisJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKIH0KIAogLyoKQEAgLTEzNiwyMCArMTY1LDIwIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEFzc29jVGltZW91dChJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JCQkJIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQkJCQkgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCQkJCSBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit2b2lkIEFzc29jVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQogewotCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKIAotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJLyogRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuICovCisJLyogVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0ICovCisJaWYgKFJUTVBfVEVTVF9GTEFHCisJICAgIChwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCiAJCXJldHVybjsKIAogCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX1RJTUVPVVQsIDAsIE5VTEwpOwotCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwlSVE1QX01MTUVfSEFORExFUihwQWQpOwogfQogCiAvKgpAQCAtMTY0LDIwICsxOTMsMjAgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgUmVhc3NvY1RpbWVvdXQoSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCQkJCQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQkJCQkJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQordm9pZCBSZWFzc29jVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMykKIHsKLQlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CiAKLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCS8qIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLiAqLworCS8qIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdCAqLworCWlmIChSVE1QX1RFU1RfRkxBRworCSAgICAocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQogCQlyZXR1cm47CiAKIAlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX1RJTUVPVVQsIDAsIE5VTEwpOwotCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwlSVE1QX01MTUVfSEFORExFUihwQWQpOwogfQogCiAvKgpAQCAtMTkyLDIwICsyMjEsMjAgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgRGlzYXNzb2NUaW1lb3V0KElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQkJCQkJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCQkJCQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3ZvaWQgRGlzYXNzb2NUaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpCiB7Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OwogCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4gKi8KKwkvKiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQgKi8KKwlpZiAoUlRNUF9URVNUX0ZMQUcKKwkgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKIAkJcmV0dXJuOwogCiAJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfRElTQVNTT0NfVElNRU9VVCwgMCwgTlVMTCk7Ci0JUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7CiB9CiAKIC8qCkBAIC0yMzAsMzQ5ICsyNTksMzE1IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIE1sbWVBc3NvY1JlcUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIE1sbWVBc3NvY1JlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVUNIQVIJCQlBcEFkZHJbNl07Ci0JSEVBREVSXzgwMl8xMQlBc3NvY0hkcjsKLQlVQ0hBUgkJCUNjeDJMZW4gPSA1OwotCVVDSEFSCQkJV21lSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCAweDA3LCAweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxLCAweDAwfTsKLQlVU0hPUlQJCQlMaXN0ZW5JbnR2OwotCVVMT05HCQkJVGltZW91dDsKLQlVU0hPUlQJCQlDYXBhYmlsaXR5SW5mbzsKLQlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7Ci0JUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMJCU5TdGF0dXM7Ci0JVUxPTkcJCQlGcmFtZUxlbiA9IDA7Ci0JVUxPTkcJCQl0bXA7Ci0JVVNIT1JUCQkJVmFySWVzT2Zmc2V0OwotCVVDSEFSCQkJQ2tpcEZsYWc7Ci0JVUNIQVIJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbQ0tJUF9ORUdPVElBVElPTl9MRU5HVEhdOwotCVVDSEFSCQkJQWlyb25ldENraXBJZSA9IElFX0FJUk9ORVRfQ0tJUDsKLQlVQ0hBUgkJCUFpcm9uZXRDa2lwTGVuID0gQ0tJUF9ORUdPVElBVElPTl9MRU5HVEg7Ci0JVUNIQVIJCQlBaXJvbmV0SVBBZGRyZXNzSUUgPSBJRV9BSVJPTkVUX0lQQUREUkVTUzsKLQlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NMZW4gPSBBSVJPTkVUX0lQQUREUkVTU19MRU5HVEg7Ci0JVUNIQVIJCQlBaXJvbmV0SVBBZGRyZXNzQnVmZmVyW0FJUk9ORVRfSVBBRERSRVNTX0xFTkdUSF0gPSB7MHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMH07Ci0JVVNIT1JUCQkJU3RhdHVzOworCXU4IEFwQWRkcls2XTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBBc3NvY0hkcjsKKwl1OCBXbWVJZVs5XSA9CisJICAgIHsgSUVfVkVORE9SX1NQRUNJRklDLCAweDA3LCAweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxLAorICAgICAgIDB4MDAgfTsKKwl1MTYgTGlzdGVuSW50djsKKwl1bnNpZ25lZCBsb25nIFRpbWVvdXQ7CisJdTE2IENhcGFiaWxpdHlJbmZvOworCUJPT0xFQU4gVGltZXJDYW5jZWxsZWQ7CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCWludCBOU3RhdHVzOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW4gPSAwOworCXVuc2lnbmVkIGxvbmcgdG1wOworCXUxNiBWYXJJZXNPZmZzZXQ7CisJdTE2IFN0YXR1czsKIAotCS8vIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZAotCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9PSBUUlVFKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBCbG9jayBBc3NvYyByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKKwkvKiBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QgKi8KKwlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFTU09DIC0gQmxvY2sgQXNzb2MgcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QhXG4iKSk7CiAJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKIAkJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwKKwkJCSAgICAmU3RhdHVzKTsKIAl9Ci0JLy8gY2hlY2sgc2FuaXR5IGZpcnN0Ci0JZWxzZSBpZiAoTWxtZUFzc29jUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFwQWRkciwgJkNhcGFiaWxpdHlJbmZvLCAmVGltZW91dCwgJkxpc3RlbkludHYpKQotCXsKKwkvKiBjaGVjayBzYW5pdHkgZmlyc3QgKi8KKwllbHNlIGlmIChNbG1lQXNzb2NSZXFTYW5pdHkKKwkJIChwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBcEFkZHIsICZDYXBhYmlsaXR5SW5mbywKKwkJICAmVGltZW91dCwgJkxpc3RlbkludHYpKSB7CiAJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CiAJCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBBcEFkZHIpOwogCi0JCS8vIEdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCS8qIEdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCiAJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7Ci0JCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVNTT0MgLSBNbG1lQXNzb2NSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJBU1NPQyAtIE1sbWVBc3NvY1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CiAJCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CiAJCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCSAgICBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CiAJCQlyZXR1cm47CiAJCX0KLQotCQkvLyBBZGQgYnkgSmFtZXMgMDMvMDYvMjcKLQkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTik7Ci0JCS8vIEFzc29jaWF0aW9uIGRvbid0IG5lZWQgdG8gcmVwb3J0IE1BQyBhZGRyZXNzCisJCS8qIEFkZCBieSBKYW1lcyAwMy8wNi8yNyAqLworCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uTGVuZ3RoID0KKwkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbmRpc184MDJfMTFfYXNzb2NpYXRpb25faW5mb3JtYXRpb24pOworCQkvKiBBc3NvY2lhdGlvbiBkb24ndCBuZWVkIHRvIHJlcG9ydCBNQUMgYWRkcmVzcyAqLwogCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uQXZhaWxhYmxlUmVxdWVzdEZpeGVkSUVzID0KLQkJCU5ESVNfODAyXzExX0FJX1JFUUZJX0NBUEFCSUxJVElFUyB8IE5ESVNfODAyXzExX0FJX1JFUUZJX0xJU1RFTklOVEVSVkFMOwotCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdEZpeGVkSUVzLkNhcGFiaWxpdGllcyA9IENhcGFiaWxpdHlJbmZvOwotCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdEZpeGVkSUVzLkxpc3RlbkludGVydmFsID0gTGlzdGVuSW50djsKLQkJLy8gT25seSByZWFzc29jaWF0ZSBuZWVkIHRoaXMKLQkJLy9DT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkFzc29jSW5mby5SZXF1ZXN0Rml4ZWRJRXMuQ3VycmVudEFQQWRkcmVzcywgQXBBZGRyKTsKLQkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLk9mZnNldFJlcXVlc3RJRXMgPSBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pOworCQkgICAgTkRJU184MDJfMTFfQUlfUkVRRklfQ0FQQUJJTElUSUVTIHwKKwkJICAgIE5ESVNfODAyXzExX0FJX1JFUUZJX0xJU1RFTklOVEVSVkFMOworCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdEZpeGVkSUVzLkNhcGFiaWxpdGllcyA9CisJCSAgICBDYXBhYmlsaXR5SW5mbzsKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5MaXN0ZW5JbnRlcnZhbCA9CisJCSAgICBMaXN0ZW5JbnR2OworCQkvKiBPbmx5IHJlYXNzb2NpYXRlIG5lZWQgdGhpcyAqLworCQkvKkNPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5DdXJyZW50QVBBZGRyZXNzLCBBcEFkZHIpOyAqLworCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uT2Zmc2V0UmVxdWVzdElFcyA9CisJCSAgICBzaXplb2Yoc3RydWN0IHJ0X25kaXNfODAyXzExX2Fzc29jaWF0aW9uX2luZm9ybWF0aW9uKTsKIAotICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMsIE1BWF9WSUVfTEVOKTsKLQkJLy8gRmlyc3QgYWRkIFNTSUQKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzLCBNQVhfVklFX0xFTik7CisJCS8qIEZpcnN0IGFkZCBTU0lEICovCiAJCVZhckllc09mZnNldCA9IDA7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJlNzaWRJZSwgMSk7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJlNzaWRJZSwKKwkJCSAgICAgICAxKTsKIAkJVmFySWVzT2Zmc2V0ICs9IDE7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAxKTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LAorCQkJICAgICAgICZwQWQtPk1sbWVBdXguU3NpZExlbiwgMSk7CiAJCVZhckllc09mZnNldCArPSAxOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwKKwkJCSAgICAgICBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOwogCQlWYXJJZXNPZmZzZXQgKz0gcEFkLT5NbG1lQXV4LlNzaWRMZW47CiAKLQkJLy8gU2Vjb25kIGFkZCBTdXBwb3J0ZWQgcmF0ZXMKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmU3VwUmF0ZUllLCAxKTsKKwkJLyogU2Vjb25kIGFkZCBTdXBwb3J0ZWQgcmF0ZXMgKi8KKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmU3VwUmF0ZUllLAorCQkJICAgICAgIDEpOwogCQlWYXJJZXNPZmZzZXQgKz0gMTsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sIDEpOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsCisJCQkgICAgICAgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCAxKTsKIAkJVmFySWVzT2Zmc2V0ICs9IDE7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LAorCQkJICAgICAgIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CiAJCVZhckllc09mZnNldCArPSBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbjsKLQkJLy8gRW5kIEFkZCBieSBKYW1lcworCQkvKiBFbmQgQWRkIGJ5IEphbWVzICovCiAKLSAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpICYmCi0gICAgICAgICAgICAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gVFJVRSkpCi0gICAgICAgICAgICBDYXBhYmlsaXR5SW5mbyB8PSAweDAxMDA7CisJCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KSAmJgorCQkgICAgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IFRSVUUpKQorCQkJQ2FwYWJpbGl0eUluZm8gfD0gMHgwMTAwOwogCiAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gU2VuZCBBU1NPQyByZXF1ZXN0Li4uXG4iKSk7Ci0JCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQXNzb2NIZHIsIFNVQlRZUEVfQVNTT0NfUkVRLCAwLCBBcEFkZHIsIEFwQWRkcik7CisJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQXNzb2NIZHIsIFNVQlRZUEVfQVNTT0NfUkVRLCAwLCBBcEFkZHIsCisJCQkJIEFwQWRkcik7CiAKLQkJLy8gQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QKLQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAotCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksCSZBc3NvY0hkciwKLQkJCQkJCSAgMiwJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkgIDIsCQkJCQkJJkxpc3RlbkludHYsCi0JCQkJCQkgIDEsCQkJCQkJJlNzaWRJZSwKLQkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCi0JCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAJcEFkLT5NbG1lQXV4LlNzaWQsCi0JCQkJCQkgIDEsCQkJCQkJJlN1cFJhdGVJZSwKLQkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCi0JCQkJCQkgIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCAgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCi0JCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJLyogQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QgKi8KKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgJkZyYW1lTGVuLAorCQkJCSAgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSwgJkFzc29jSGRyLAorCQkJCSAgMiwgJkNhcGFiaWxpdHlJbmZvLAorCQkJCSAgMiwgJkxpc3RlbkludHYsCisJCQkJICAxLCAmU3NpZEllLAorCQkJCSAgMSwgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLAorCQkJCSAgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIHBBZC0+TWxtZUF1eC5Tc2lkLAorCQkJCSAgMSwgJlN1cFJhdGVJZSwKKwkJCQkgIDEsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwKKwkJCQkgIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwKKwkJCQkgIEVORF9PRl9BUkdTKTsKIAotCQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkKLQkJewotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCi0JCQkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwgIHBBZC0+TWxtZUF1eC5FeHRSYXRlLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkgeworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkgIDEsICZFeHRSYXRlSWUsCisJCQkJCSAgMSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAorCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAorCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCBFTkRfT0ZfQVJHUyk7CiAJCQlGcmFtZUxlbiArPSB0bXA7CiAJCX0KLQotCQkvLyBIVAotCQlpZiAoKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKLQkJewotCQkJVUxPTkcgVG1wTGVuOwotCQkJVUNIQVIgSHRMZW47Ci0JCQlVQ0hBUiBCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OwotCQkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYlByZU5IdCA9PSBUUlVFKQotCQkJeworCQkvKiBIVCAqLworCQlpZiAoKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPiAwKQorCQkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpIHsKKwkJCXVuc2lnbmVkIGxvbmcgVG1wTGVuOworCQkJdTggSHRMZW47CisJCQl1OCBCUk9BRENPTVs0XSA9IHsgMHgwLCAweDkwLCAweDRjLCAweDMzIH07CisJCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iUHJlTkh0ID09IFRSVUUpIHsKIAkJCQlIdExlbiA9IFNJWkVfSFRfQ0FQX0lFICsgNDsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAotCQkJCQkJCSAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKLQkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwKKwkJCQkJCSAgJlRtcExlbiwgMSwgJldwYUllLCAxLCAmSHRMZW4sCisJCQkJCQkgIDQsICZCUk9BRENPTVswXSwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCSAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCX0gZWxzZSB7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAorCQkJCQkJICAmVG1wTGVuLCAxLCAmSHRDYXBJZSwgMSwKKwkJCQkJCSAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sCisJCQkJCQkgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CiAJCQl9CiAJCQlGcmFtZUxlbiArPSBUbXBMZW47CiAJCX0KLQotCQkvLyBhZGQgUmFsaW5rIHByb3ByaWV0YXJ5IElFIHRvIGluZm9ybSBBUCB0aGlzIFNUQSBpcyBnb2luZyB0byB1c2UgQUdHUkVHQVRJT04gb3IgUElHR1ktQkFDSytBR0dSRUdBVElPTgotCQkvLyBDYXNlIEk6IChBZ2dyZWdhdGlvbiArIFBpZ2d5LUJhY2spCi0JCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKLQkJLy8gMi4gTWFjIHN1cHBvcnQgcGlnZ3ktYmFjawotCQkvLyAzLiBBUCBhbm5vdWNlcyBpdCdzIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KLQkJLy8gQ2FzZSBJSTogKEFnZ3JlZ2F0aW9uKQotCQkvLyAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5ECi0JCS8vIDIuIEFQIGFubm91Y2VzIGl0J3MgQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpCi0JCXsKLQkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpICYmICgocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKSkKLQkJCXsKLQkJCQlVTE9ORyBUbXBMZW47Ci0JCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCi0JCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkvKiBhZGQgUmFsaW5rIHByb3ByaWV0YXJ5IElFIHRvIGluZm9ybSBBUCB0aGlzIFNUQSBpcyBnb2luZyB0byB1c2UgQUdHUkVHQVRJT04gb3IgUElHR1ktQkFDSytBR0dSRUdBVElPTiAqLworCQkvKiBDYXNlIEk6IChBZ2dyZWdhdGlvbiArIFBpZ2d5LUJhY2spICovCisJCS8qIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQgKi8KKwkJLyogMi4gTWFjIHN1cHBvcnQgcGlnZ3ktYmFjayAqLworCQkvKiAzLiBBUCBhbm5vdWNlcyBpdCdzIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04gKi8KKwkJLyogQ2FzZSBJSTogKEFnZ3JlZ2F0aW9uKSAqLworCQkvKiAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5EICovCisJCS8qIDIuIEFQIGFubm91Y2VzIGl0J3MgQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04gKi8KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpIHsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpCisJCQkgICAgJiYgKChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDMpID09IDMpKSB7CisJCQkJdW5zaWduZWQgbG9uZyBUbXBMZW47CisJCQkJdTggUmFsaW5rSWVbOV0gPQorCQkJCSAgICB7IElFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywKKwkJCSAgICAweDAzLCAweDAwLCAweDAwLCAweDAwIH07CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAorCQkJCQkJICAmVG1wTGVuLCA5LCBSYWxpbmtJZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0gZWxzZSBpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAxKSB7CisJCQkJdW5zaWduZWQgbG9uZyBUbXBMZW47CisJCQkJdTggUmFsaW5rSWVbOV0gPQorCQkJCSAgICB7IElFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywKKwkJCSAgICAweDAxLCAweDAwLCAweDAwLCAweDAwIH07CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAorCQkJCQkJICAmVG1wTGVuLCA5LCBSYWxpbmtJZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOwogCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKIAkJCX0KLQkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkKLQkJCXsKLQkJCQlVTE9ORyBUbXBMZW47Ci0JCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAxLCAweDAwLCAweDAwLCAweDAwfTsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCi0JCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCVVMT05HIFRtcExlbjsKLQkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMH07Ci0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLAkJICZUbXBMZW4sCi0JCQkJCQkJICA5LAkJCQkJCSBSYWxpbmtJZSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGxvbmcgVG1wTGVuOworCQkJdTggUmFsaW5rSWVbOV0gPQorCQkJICAgIHsgSUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDA2LAorCQkgICAgMHgwMCwgMHgwMCwgMHgwMCB9OworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmVG1wTGVuLCA5LAorCQkJCQkgIFJhbGlua0llLCBFTkRfT0ZfQVJHUyk7CiAJCQlGcmFtZUxlbiArPSBUbXBMZW47CiAJCX0KIAotCQlpZiAocEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uYlZhbGlkKQotCQl7Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkKLQkJCXsKLQkJCQlRQlNTX1NUQV9JTkZPX1BBUk0gUW9zSW5mbzsKKwkJaWYgKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJWYWxpZCkgeworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZQorCQkJICAgICYmIHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkgeworCQkJCXN0cnVjdCBydF9xYnNzX3N0YV9pbmZvX3Bhcm0gUW9zSW5mbzsKIAotCQkJCU5kaXNaZXJvTWVtb3J5KCZRb3NJbmZvLCBzaXplb2YoUUJTU19TVEFfSU5GT19QQVJNKSk7CisJCQkJTmRpc1plcm9NZW1vcnkoJlFvc0luZm8sCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X3Fic3Nfc3RhX2luZm9fcGFybSkpOwogCQkJCVFvc0luZm8uVUFQU0RfQUNfQkUgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFOwogCQkJCVFvc0luZm8uVUFQU0RfQUNfQksgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLOwogCQkJCVFvc0luZm8uVUFQU0RfQUNfVkkgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJOwogCQkJCVFvc0luZm8uVUFQU0RfQUNfVk8gPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPOwotCQkJCVFvc0luZm8uTWF4U1BMZW5ndGggPSBwQWQtPkNvbW1vbkNmZy5NYXhTUExlbmd0aDsKLQkJCQlXbWVJZVs4XSB8PSAqKFBVQ0hBUikmUW9zSW5mbzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLSAgICAgICAgICAgICAgICAvLyBUaGUgUGFyYW1ldGVyIFNldCBDb3VudCBpcyBzZXQgdG8goacwoaggaW4gdGhlIGFzc29jaWF0aW9uIHJlcXVlc3QgZnJhbWVzCi0gICAgICAgICAgICAgICAgLy8gV21lSWVbOF0gfD0gKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCAmIDB4MGYpOworCQkJCVFvc0luZm8uTWF4U1BMZW5ndGggPQorCQkJCSAgICBwQWQtPkNvbW1vbkNmZy5NYXhTUExlbmd0aDsKKwkJCQlXbWVJZVs4XSB8PSAqKHU4ICopJiBRb3NJbmZvOworCQkJfSBlbHNlIHsKKwkJCQkvKiBUaGUgUGFyYW1ldGVyIFNldCBDb3VudCBpcyBzZXQgdG8goacwoaggaW4gdGhlIGFzc29jaWF0aW9uIHJlcXVlc3QgZnJhbWVzICovCisJCQkJLyogV21lSWVbOF0gfD0gKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCAmIDB4MGYpOyAqLwogCQkJfQogCi0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICZ0bXAsCi0JCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICZXbWVJZVswXSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJICA5LCAmV21lSWVbMF0sIEVORF9PRl9BUkdTKTsKIAkJCUZyYW1lTGVuICs9IHRtcDsKIAkJfQotCi0JCS8vCi0JCS8vIExldCBXUEEoIzIyMSkgRWxlbWVudCBJRCBvbiB0aGUgZW5kIG9mIHRoaXMgYXNzb2NpYXRpb24gZnJhbWUuCi0JCS8vIE90aGVyd2lzZSBzb21lIEFQIHdpbGwgZmFpbCBvbiBwYXJzaW5nIEVsZW1lbnQgSUQgYW5kIHNldCBzdGF0dXMgZmFpbCBvbiBBc3NvYyBSc3AuCi0JCS8vIEZvciBleGFtcGxlOiBQdXQgVmVuZG9yIFNwZWNpZmljIElFIG9uIHRoZSBmcm9udCBvZiBXUEEgSUUuCi0JCS8vIFRoaXMgaGFwcGVucyBvbiBBUCAoTW9kZWwgTm86TGlua3N5cyBXUks1NEcpCi0JCS8vCisJCS8qICovCisJCS8qIExldCBXUEEoIzIyMSkgRWxlbWVudCBJRCBvbiB0aGUgZW5kIG9mIHRoaXMgYXNzb2NpYXRpb24gZnJhbWUuICovCisJCS8qIE90aGVyd2lzZSBzb21lIEFQIHdpbGwgZmFpbCBvbiBwYXJzaW5nIEVsZW1lbnQgSUQgYW5kIHNldCBzdGF0dXMgZmFpbCBvbiBBc3NvYyBSc3AuICovCisJCS8qIEZvciBleGFtcGxlOiBQdXQgVmVuZG9yIFNwZWNpZmljIElFIG9uIHRoZSBmcm9udCBvZiBXUEEgSUUuICovCisJCS8qIFRoaXMgaGFwcGVucyBvbiBBUCAoTW9kZWwgTm86TGlua3N5cyBXUks1NEcpICovCisJCS8qICovCiAJCWlmICgoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKLSAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAotICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKLSAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQotCQkJKQotICAgICAgICAgICAgKQotCQl7Ci0JCQlVQ0hBUiBSU05JZSA9IElFX1dQQTsKKwkJICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKwkJICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorCQkgICAgKQorCQkgICAgKSB7CisJCQl1OCBSU05JZSA9IElFX1dQQTsKIAotCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAotICAgICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSkKLQkJCXsKKwkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKwkJCSAgICB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCQlOZGlzODAyXzExQXV0aE1vZGVXUEEyKSkgewogCQkJCVJTTkllID0gSUVfV1BBMjsKIAkJCX0KIAotCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSAxKQotICAgICAgICAgICAgUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIEJTUzApOworCQkJaWYgKChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0KKwkJCSAgICAgV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCQkJICAgICYmIChwQWQtPlN0YUNmZy5iUlNOX0lFX0Zyb21XcGFTdXBwbGljYW50ID09IEZBTFNFKSkKKwkJCQlSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsCisJCQkJCSAgICAgIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgQlNTMCk7CiAKLSAgICAgICAgICAgIC8vIENoZWNrIGZvciBXUEEgUE1LIGNhY2hlIGxpc3QKLQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQotCQkJewotCQkJICAgIElOVCAgICAgaWR4OwotICAgICAgICAgICAgICAgIEJPT0xFQU4gRm91bmRQTUsgPSBGQUxTRTsKLQkJCQkvLyBTZWFyY2ggY2hjaGVkIFBNS0lELCBhcHBlbmQgaXQgaWYgZXhpc3RlZAotCQkJCWZvciAoaWR4ID0gMDsgaWR4IDwgUE1LSURfTk87IGlkeCsrKQotCQkJCXsKLQkJCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShBcEFkZHIsICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLkJTU0lELCA2KSkKLQkJCQkJeworCQkJLyogQ2hlY2sgZm9yIFdQQSBQTUsgY2FjaGUgbGlzdCAqLworCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHsKKwkJCQlpbnQgaWR4OworCQkJCUJPT0xFQU4gRm91bmRQTUsgPSBGQUxTRTsKKwkJCQkvKiBTZWFyY2ggY2hjaGVkIFBNS0lELCBhcHBlbmQgaXQgaWYgZXhpc3RlZCAqLworCQkJCWZvciAoaWR4ID0gMDsgaWR4IDwgUE1LSURfTk87IGlkeCsrKSB7CisJCQkJCWlmIChOZGlzRXF1YWxNZW1vcnkKKwkJCQkJICAgIChBcEFkZHIsCisJCQkJCSAgICAgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uQlNTSUQsCisJCQkJCSAgICAgNikpIHsKIAkJCQkJCUZvdW5kUE1LID0gVFJVRTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJfQotCi0JCQkJaWYgKEZvdW5kUE1LKQotCQkJCXsKLQkJCQkJLy8gU2V0IFBNSyBudW1iZXIKLQkJCQkJKihQVVNIT1JUKSAmcEFkLT5TdGFDZmcuUlNOX0lFW3BBZC0+U3RhQ2ZnLlJTTklFX0xlbl0gPSAxOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFW3BBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDJdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5QTUtJRCwgMTYpOwotICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5SU05JRV9MZW4gKz0gMTg7CisJCQkJaWYgKEZvdW5kUE1LKSB7CisJCQkJCS8qIFNldCBQTUsgbnVtYmVyICovCisJCQkJCSoodTE2ICopJiBwQWQtPlN0YUNmZy5SU05fSUVbcEFkLT4KKwkJCQkJCQkJCVN0YUNmZy4KKwkJCQkJCQkJCVJTTklFX0xlbl0KKwkJCQkJICAgID0gMTsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLgorCQkJCQkJICAgICAgIFJTTl9JRVtwQWQtPlN0YUNmZy4KKwkJCQkJCQkgICAgICBSU05JRV9MZW4gKyAyXSwKKwkJCQkJCSAgICAgICAmcEFkLT5TdGFDZmcuCisJCQkJCQkgICAgICAgU2F2ZWRQTUtbaWR4XS5QTUtJRCwgMTYpOworCQkJCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gKz0gMTg7CiAJCQkJfQogCQkJfQogCi0JCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IDEpCi0JCQl7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAJCSZ0bXAsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgIAlwQWQtPlN0YUNmZy5SU05JRV9MZW4sCQkJcEFkLT5TdGFDZmcuUlNOX0lFLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAJRU5EX09GX0FSR1MpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgCQkmdG1wLAotCQkJCSAgICAgICAgICAgICAgCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSU05JZSwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwJCQlwQWQtPlN0YUNmZy5SU05fSUUsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgIAlFTkRfT0ZfQVJHUyk7CisJCQlpZiAoKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PQorCQkJICAgICBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLmJSU05fSUVfRnJvbVdwYVN1cHBsaWNhbnQgPT0KKwkJCQlUUlVFKSkgeworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCSAgcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAorCQkJCQkJICBwQWQtPlN0YUNmZy5SU05fSUUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCX0gZWxzZSB7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkJICAxLCAmUlNOSWUsCisJCQkJCQkgIDEsICZwQWQtPlN0YUNmZy5SU05JRV9MZW4sCisJCQkJCQkgIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwKKwkJCQkJCSAgcEFkLT5TdGFDZmcuUlNOX0lFLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CiAJCQl9CiAKIAkJCUZyYW1lTGVuICs9IHRtcDsKIAotCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSAxKQotCQkJewotCSAgICAgICAgICAgIC8vIEFwcGVuZCBWYXJpYWJsZSBJRQotCSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJlJTTkllLCAxKTsKLQkgICAgICAgICAgICBWYXJJZXNPZmZzZXQgKz0gMTsKLQkgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZwQWQtPlN0YUNmZy5SU05JRV9MZW4sIDEpOwotCSAgICAgICAgICAgIFZhckllc09mZnNldCArPSAxOworCQkJaWYgKChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0KKwkJCSAgICAgV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCQkJICAgIHx8IChwQWQtPlN0YUNmZy5iUlNOX0lFX0Zyb21XcGFTdXBwbGljYW50ID09CisJCQkJRkFMU0UpKSB7CisJCQkJLyogQXBwZW5kIFZhcmlhYmxlIElFICovCisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsKKwkJCQkJICAgICAgIFZhckllc09mZnNldCwgJlJTTkllLCAxKTsKKwkJCQlWYXJJZXNPZmZzZXQgKz0gMTsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKworCQkJCQkgICAgICAgVmFySWVzT2Zmc2V0LAorCQkJCQkgICAgICAgJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwgMSk7CisJCQkJVmFySWVzT2Zmc2V0ICs9IDE7CiAJCQl9Ci0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIHBBZC0+U3RhQ2ZnLlJTTl9JRSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwKKwkJCQkgICAgICAgcEFkLT5TdGFDZmcuUlNOX0lFLAorCQkJCSAgICAgICBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOwogCQkJVmFySWVzT2Zmc2V0ICs9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKIAotCQkJLy8gU2V0IFZhcmlhYmxlIElFcyBMZW5ndGgKKwkJCS8qIFNldCBWYXJpYWJsZSBJRXMgTGVuZ3RoICovCiAJCQlwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA9IFZhckllc09mZnNldDsKIAkJfQogCi0JCS8vIFdlIGhhdmUgdXBkYXRlIHRoYXQgYXQgUGVlckJlYWNvbkF0Sm9pblJlcXVlc3QoKQotCQlDa2lwRmxhZyA9IHBBZC0+U3RhQ2ZnLkNraXBGbGFnOwotCQlpZiAoQ2tpcEZsYWcgIT0gMCkKLQkJewotCQkJTmRpc1plcm9NZW1vcnkoQ2tpcE5lZ290aWF0aW9uQnVmZmVyLCBDS0lQX05FR09USUFUSU9OX0xFTkdUSCk7Ci0JCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbMl0gPSAweDY2OwotCQkJLy8gTWFrZSBpdCB0cnkgS1AgJiBNSUMsIHNpbmNlIHdlIGhhdmUgdG8gZm9sbG93IHRoZSByZXN1bHQgZnJvbSBBc3NvY1JzcAotCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyWzhdID0gMHgxODsKLQkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlcltDS0lQX05FR09USUFUSU9OX0xFTkdUSCAtIDFdID0gMHgyMjsKLQkJCUNraXBGbGFnID0gMHgxODsKLQotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAJJnRtcCwKLQkJCQkJCTEsCQkJCQkJICAJCSZBaXJvbmV0Q2tpcEllLAotCQkJCQkJMSwJCQkJCQkgIAkJJkFpcm9uZXRDa2lwTGVuLAotCQkJCQkJQWlyb25ldENraXBMZW4sIAkJICAJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlciwKLQkJCQkJCUVORF9PRl9BUkdTKTsKLQkJCUZyYW1lTGVuICs9IHRtcDsKLQkJfQotCi0JCS8vIEFkZCBDQ1ggdjIgcmVxdWVzdCBpZiBDQ1gyIGFkbWluIHN0YXRlIGlzIG9uCi0JCWlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkVuYWJsZSA9PSAxKQotCQl7Ci0KLQkJCS8vCi0JCQkvLyBBZGQgQWlyb25ldElQQWRkcmVzc0lFIGZvciBDaXNjbyBDQ1ggMi5YCi0JCQkvLyBBZGQgQ0NYIFZlcnNpb24KLQkJCS8vCi0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCi0JCQkJCQkxLAkJCQkJCQkmQWlyb25ldElQQWRkcmVzc0lFLAotCQkJCQkJMSwJCQkJCQkJJkFpcm9uZXRJUEFkZHJlc3NMZW4sCi0JCQkJCQlBaXJvbmV0SVBBZGRyZXNzTGVuLAkJQWlyb25ldElQQWRkcmVzc0J1ZmZlciwKLQkJCQkJCTEsCQkJCQkJCSZDY3gySWUsCi0JCQkJCQkxLAkJCQkJCQkmQ2N4MkxlbiwKLQkJCQkJCUNjeDJMZW4sCQkJCSAgICBDY3gySWVJbmZvLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCQkJRnJhbWVMZW4gKz0gdG1wOwotCi0JCQkvLyBBZGQgYnkgSmFtZXMgMDMvMDYvMjcKLQkJCS8vIFNldCBWYXJpYWJsZSBJRXMgTGVuZ3RoCi0JCQlwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA9IFZhckllc09mZnNldDsKLQkJCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5SZXF1ZXN0SUVMZW5ndGggPSBWYXJJZXNPZmZzZXQ7Ci0KLQkJCS8vIE9mZnNldFJlc3BvbnNlSUVzIGZvbGxvdyBSZXFWYXJJRQotCQkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLk9mZnNldFJlc3BvbnNlSUVzID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKSArIHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuOwotCQkJLy8gRW5kIEFkZCBieSBKYW1lcwotCQl9Ci0KLQogCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKIAogCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCBUaW1lb3V0KTsKIAkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19XQUlUX1JTUDsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBU1NPQyAtIE1sbWVBc3NvY1JlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsZWQuIEJVRyEhISEhISBcbiIpKTsKKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFTU09DIC0gTWxtZUFzc29jUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZC4gQlVHIVxuIikpOwogCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CiAJCVN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsCisJCQkgICAgJlN0YXR1cyk7CiAJfQogCiB9CkBAIC01OTQsMTg3ICs1ODksMTY4IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIE1sbWVSZWFzc29jUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgTWxtZVJlYXNzb2NSZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVDSEFSCQkJQXBBZGRyWzZdOwotCUhFQURFUl84MDJfMTEJUmVhc3NvY0hkcjsKLQlVQ0hBUgkJCUNjeDJMZW4gPSA1OwotCVVDSEFSCQkJV21lSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCAweDA3LCAweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxLCAweDAwfTsKLQlVU0hPUlQJCQlDYXBhYmlsaXR5SW5mbywgTGlzdGVuSW50djsKLQlVTE9ORwkJCVRpbWVvdXQ7Ci0JVUxPTkcJCQlGcmFtZUxlbiA9IDA7Ci0JQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOwotCU5ESVNfU1RBVFVTCQlOU3RhdHVzOwotCVVMT05HCQkJdG1wOwotCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCVVTSE9SVAkJCVN0YXR1czsKKwl1OCBBcEFkZHJbNl07CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgUmVhc3NvY0hkcjsKKwl1OCBXbWVJZVs5XSA9CisJICAgIHsgSUVfVkVORE9SX1NQRUNJRklDLCAweDA3LCAweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxLAorICAgICAgIDB4MDAgfTsKKwl1MTYgQ2FwYWJpbGl0eUluZm8sIExpc3RlbkludHY7CisJdW5zaWduZWQgbG9uZyBUaW1lb3V0OworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW4gPSAwOworCUJPT0xFQU4gVGltZXJDYW5jZWxsZWQ7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCXUxNiBTdGF0dXM7CiAKLQkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKLQlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQmxvY2sgUmVBc3NvYyByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKKwkvKiBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QgKi8KKwlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFTU09DIC0gQmxvY2sgUmVBc3NvYyByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKIAkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwogCQlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOwotCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwKKwkJCSAgICAmU3RhdHVzKTsKIAl9Ci0JLy8gdGhlIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lIGFzIHRoZSBhc3NvY2lhdGlvbgotCWVsc2UgaWYoTWxtZUFzc29jUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFwQWRkciwgJkNhcGFiaWxpdHlJbmZvLCAmVGltZW91dCwgJkxpc3RlbkludHYpKQotCXsKKwkvKiB0aGUgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUgYXMgdGhlIGFzc29jaWF0aW9uICovCisJZWxzZSBpZiAoTWxtZUFzc29jUmVxU2FuaXR5CisJCSAocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQXBBZGRyLCAmQ2FwYWJpbGl0eUluZm8sCisJCSAgJlRpbWVvdXQsICZMaXN0ZW5JbnR2KSkgewogCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CiAKLQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZVJlYXNzb2NSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkFTU09DIC0gTWxtZVJlYXNzb2NSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOwogCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwogCQkJU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOwotCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCSAgICBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKIAkJCXJldHVybjsKIAkJfQogCiAJCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBBcEFkZHIpOwogCi0JCS8vIG1ha2UgZnJhbWUsIHVzZSBic3NpZCBhcyB0aGUgQVAgYWRkcmVzcz8/Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gU2VuZCBSRS1BU1NPQyByZXF1ZXN0Li4uXG4iKSk7Ci0JCU1ndE1hY0hlYWRlckluaXQocEFkLCAmUmVhc3NvY0hkciwgU1VCVFlQRV9SRUFTU09DX1JFUSwgMCwgQXBBZGRyLCBBcEFkZHIpOwotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmUmVhc3NvY0hkciwKLQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJkxpc3RlbkludHYsCi0JCQkJCQkgIE1BQ19BRERSX0xFTiwgICAgICAgICAgICAgQXBBZGRyLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLAotCQkJCQkJICBwQWQtPk1sbWVBdXguU3NpZExlbiwgICAgIHBBZC0+TWxtZUF1eC5Tc2lkLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCi0JCQkJCQkgIDEsCQkJCQkJJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAotCQkJCQkJICBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgIHBBZC0+TWxtZUF1eC5TdXBSYXRlLAotCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCS8qIG1ha2UgZnJhbWUsIHVzZSBic3NpZCBhcyB0aGUgQVAgYWRkcmVzcz8/ICovCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQVNTT0MgLSBTZW5kIFJFLUFTU09DIHJlcXVlc3QuLi5cbiIpKTsKKwkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZSZWFzc29jSGRyLCBTVUJUWVBFX1JFQVNTT0NfUkVRLCAwLAorCQkJCSBBcEFkZHIsIEFwQWRkcik7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSwKKwkJCQkgICZSZWFzc29jSGRyLCAyLCAmQ2FwYWJpbGl0eUluZm8sIDIsCisJCQkJICAmTGlzdGVuSW50diwgTUFDX0FERFJfTEVOLCBBcEFkZHIsIDEsICZTc2lkSWUsCisJCQkJICAxLCAmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCisJCQkJICBwQWQtPk1sbWVBdXguU3NpZExlbiwgcEFkLT5NbG1lQXV4LlNzaWQsIDEsCisJCQkJICAmU3VwUmF0ZUllLCAxLCAmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkJICBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkJICBFTkRfT0ZfQVJHUyk7CiAKLQkJaWYgKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuICE9IDApCi0JCXsKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICZ0bXAsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAotCQkJCQkJCSAgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCSAgICBwQWQtPk1sbWVBdXguRXh0UmF0ZSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJaWYgKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuICE9IDApIHsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJICAxLCAmRXh0UmF0ZUllLAorCQkJCQkgIDEsICZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwKKwkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwKKwkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZSwgRU5EX09GX0FSR1MpOwogCQkJRnJhbWVMZW4gKz0gdG1wOwogCQl9CiAKLQkJaWYgKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJWYWxpZCkKLQkJewotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iQVBTRENhcGFibGUpCi0JCQl7Ci0JCQkJUUJTU19TVEFfSU5GT19QQVJNIFFvc0luZm87CisJCWlmIChwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iVmFsaWQpIHsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUKKwkJCSAgICAmJiBwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iQVBTRENhcGFibGUpIHsKKwkJCQlzdHJ1Y3QgcnRfcWJzc19zdGFfaW5mb19wYXJtIFFvc0luZm87CiAKLQkJCQlOZGlzWmVyb01lbW9yeSgmUW9zSW5mbywgc2l6ZW9mKFFCU1NfU1RBX0lORk9fUEFSTSkpOworCQkJCU5kaXNaZXJvTWVtb3J5KCZRb3NJbmZvLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9xYnNzX3N0YV9pbmZvX3Bhcm0pKTsKIAkJCQlRb3NJbmZvLlVBUFNEX0FDX0JFID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRTsKIAkJCQlRb3NJbmZvLlVBUFNEX0FDX0JLID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSzsKIAkJCQlRb3NJbmZvLlVBUFNEX0FDX1ZJID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSTsKIAkJCQlRb3NJbmZvLlVBUFNEX0FDX1ZPID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTzsKLQkJCQlRb3NJbmZvLk1heFNQTGVuZ3RoID0gcEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGg7Ci0JCQkJV21lSWVbOF0gfD0gKihQVUNIQVIpJlFvc0luZm87CisJCQkJUW9zSW5mby5NYXhTUExlbmd0aCA9CisJCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoOworCQkJCVdtZUllWzhdIHw9ICoodTggKikmIFFvc0luZm87CiAJCQl9CiAKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgJnRtcCwKLQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgJldtZUllWzBdLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJRnJhbWVMZW4gKz0gdG1wOwotCQl9Ci0KLQkJLy8gSFQKLQkJaWYgKChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID4gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCi0JCXsKLQkJCVVMT05HIFRtcExlbjsKLQkJCVVDSEFSIEh0TGVuOwotCQkJVUNIQVIgQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKLQkJCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPT0gVFJVRSkKLQkJCXsKLQkJCQlIdExlbiA9IFNJWkVfSFRfQ0FQX0lFICsgNDsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAotCQkJCQkJCSAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKLQkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJfQotCQkJRnJhbWVMZW4gKz0gVG1wTGVuOwotCQl9Ci0KLQkJLy8gYWRkIFJhbGluayBwcm9wcmlldGFyeSBJRSB0byBpbmZvcm0gQVAgdGhpcyBTVEEgaXMgZ29pbmcgdG8gdXNlIEFHR1JFR0FUSU9OIG9yIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04KLQkJLy8gQ2FzZSBJOiAoQWdncmVnYXRpb24gKyBQaWdneS1CYWNrKQotCQkvLyAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5ECi0JCS8vIDIuIE1hYyBzdXBwb3J0IHBpZ2d5LWJhY2sKLQkJLy8gMy4gQVAgYW5ub3VjZXMgaXQncyBQSUdHWS1CQUNLK0FHR1JFR0FUSU9OLWNhcGFibGUgaW4gQkVBQ09OCi0JCS8vIENhc2UgSUk6IChBZ2dyZWdhdGlvbikKLQkJLy8gMS4gdXNlciBlbmFibGUgYWdncmVnYXRpb24sIEFORAotCQkvLyAyLiBBUCBhbm5vdWNlcyBpdCdzIEFHR1JFR0FUSU9OLWNhcGFibGUgaW4gQkVBQ09OCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKQotCQl7Ci0JCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlKSAmJiAoKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMykgPT0gMykpCi0JCQl7Ci0JCQkJVUxPTkcgVG1wTGVuOwotCQkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwMywgMHgwMCwgMHgwMCwgMHgwMH07Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcitGcmFtZUxlbiwgICAgICAgICAgICZUbXBMZW4sCi0JCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbGlua0llLAotCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCQlGcmFtZUxlbiArPSBUbXBMZW47Ci0JCQl9Ci0JCQllbHNlIGlmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDEpCi0JCQl7Ci0JCQkJVUxPTkcgVG1wTGVuOwotCQkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMH07Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcitGcmFtZUxlbiwgICAgICAgICAgICZUbXBMZW4sCi0JCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbGlua0llLAotCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCQlGcmFtZUxlbiArPSBUbXBMZW47Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlVTE9ORyBUbXBMZW47Ci0JCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDB9OwotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcitGcmFtZUxlbiwJCSAmVG1wTGVuLAotCQkJCQkJCSAgOSwJCQkJCQkgUmFsaW5rSWUsCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQlGcmFtZUxlbiArPSBUbXBMZW47Ci0JCX0KLQotCQkvLyBBZGQgQ0NYIHYyIHJlcXVlc3QgaWYgQ0NYMiBhZG1pbiBzdGF0ZSBpcyBvbgotCQlpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5FbmFibGUgPT0gMSkKLQkJewotCQkJLy8KLQkJCS8vIEFkZCBDQ1ggVmVyc2lvbgotCQkJLy8KIAkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKLQkJCQkJCTEsCQkJCQkJCSZDY3gySWUsCi0JCQkJCQkxLAkJCQkJCQkmQ2N4MkxlbiwKLQkJCQkJCUNjeDJMZW4sCQkJCSAgICBDY3gySWVJbmZvLAotCQkJCQkJRU5EX09GX0FSR1MpOworCQkJCQkgIDksICZXbWVJZVswXSwgRU5EX09GX0FSR1MpOwogCQkJRnJhbWVMZW4gKz0gdG1wOwogCQl9CisJCS8qIEhUICovCisJCWlmICgocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA+IDApCisJCSAgICAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkgeworCQkJdW5zaWduZWQgbG9uZyBUbXBMZW47CisJCQl1OCBIdExlbjsKKwkJCXU4IEJST0FEQ09NWzRdID0geyAweDAsIDB4OTAsIDB4NGMsIDB4MzMgfTsKKwkJCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPT0gVFJVRSkgeworCQkJCUh0TGVuID0gU0laRV9IVF9DQVBfSUUgKyA0OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwKKwkJCQkJCSAgJlRtcExlbiwgMSwgJldwYUllLCAxLCAmSHRMZW4sCisJCQkJCQkgIDQsICZCUk9BRENPTVswXSwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCSAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCX0gZWxzZSB7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAorCQkJCQkJICAmVG1wTGVuLCAxLCAmSHRDYXBJZSwgMSwKKwkJCQkJCSAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sCisJCQkJCQkgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQl9CisJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCX0KKwkJLyogYWRkIFJhbGluayBwcm9wcmlldGFyeSBJRSB0byBpbmZvcm0gQVAgdGhpcyBTVEEgaXMgZ29pbmcgdG8gdXNlIEFHR1JFR0FUSU9OIG9yIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04gKi8KKwkJLyogQ2FzZSBJOiAoQWdncmVnYXRpb24gKyBQaWdneS1CYWNrKSAqLworCQkvKiAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5EICovCisJCS8qIDIuIE1hYyBzdXBwb3J0IHBpZ2d5LWJhY2sgKi8KKwkJLyogMy4gQVAgYW5ub3VjZXMgaXQncyBQSUdHWS1CQUNLK0FHR1JFR0FUSU9OLWNhcGFibGUgaW4gQkVBQ09OICovCisJCS8qIENhc2UgSUk6IChBZ2dyZWdhdGlvbikgKi8KKwkJLyogMS4gdXNlciBlbmFibGUgYWdncmVnYXRpb24sIEFORCAqLworCQkvKiAyLiBBUCBhbm5vdWNlcyBpdCdzIEFHR1JFR0FUSU9OLWNhcGFibGUgaW4gQkVBQ09OICovCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSB7CisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlKQorCQkJICAgICYmICgocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKSkgeworCQkJCXVuc2lnbmVkIGxvbmcgVG1wTGVuOworCQkJCXU4IFJhbGlua0llWzldID0KKwkJCQkgICAgeyBJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsCisJCQkgICAgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwKKwkJCQkJCSAgJlRtcExlbiwgOSwgUmFsaW5rSWUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCQl9IGVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkgeworCQkJCXVuc2lnbmVkIGxvbmcgVG1wTGVuOworCQkJCXU4IFJhbGlua0llWzldID0KKwkJCQkgICAgeyBJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsCisJCQkgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCB9OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwKKwkJCQkJCSAgJlRtcExlbiwgOSwgUmFsaW5rSWUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCQl9CisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBsb25nIFRtcExlbjsKKwkJCXU4IFJhbGlua0llWzldID0KKwkJCSAgICB7IElFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwNCwKKwkJICAgIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJlRtcExlbiwgOSwKKwkJCQkJICBSYWxpbmtJZSwgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQl9CiAKIAkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CiAJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CiAKLQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCBUaW1lb3V0KTsgLyogaW4gbVNlYyAqLworCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsIFRpbWVvdXQpOwkvKiBpbiBtU2VjICovCiAJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gUkVBU1NPQ19XQUlUX1JTUDsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBU1NPQyAtIE1sbWVSZWFzc29jUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZC4gQlVHISEhISBcbiIpKTsKKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFTU09DIC0gTWxtZVJlYXNzb2NSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkLiBCVUchXG4iKSk7CiAJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKIAkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsCisJCQkgICAgJlN0YXR1cyk7CiAJfQogfQogCkBAIC03ODksNTEgKzc2NSw1MCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgcERpc2Fzc29jUmVxOwotCUhFQURFUl84MDJfMTEgICAgICAgICBEaXNhc3NvY0hkcjsKLQlQSEVBREVSXzgwMl8xMSAgICAgICAgcERpc2Fzc29jSGRyOwotCVBVQ0hBUiAgICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlVTE9ORyAgICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOwotCU5ESVNfU1RBVFVTICAgICAgICAgICBOU3RhdHVzOwotCUJPT0xFQU4gICAgICAgICAgICAgICBUaW1lckNhbmNlbGxlZDsKLQlVTE9ORyAgICAgICAgICAgICAgICAgVGltZW91dCA9IDA7Ci0JVVNIT1JUICAgICAgICAgICAgICAgIFN0YXR1czsKKwlzdHJ1Y3QgcnRfbWxtZV9kaXNhc3NvY19yZXEgKnBEaXNhc3NvY1JlcTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBEaXNhc3NvY0hkcjsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBEaXNhc3NvY0hkcjsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbiA9IDA7CisJaW50IE5TdGF0dXM7CisJQk9PTEVBTiBUaW1lckNhbmNlbGxlZDsKKwl1bnNpZ25lZCBsb25nIFRpbWVvdXQgPSA1MDA7CisJdTE2IFN0YXR1czsKIAotCS8vIHNraXAgc2FuaXR5IGNoZWNrCi0JcERpc2Fzc29jUmVxID0gKFBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKEVsZW0tPk1zZyk7CisJLyogc2tpcCBzYW5pdHkgY2hlY2sgKi8KKwlwRGlzYXNzb2NSZXEgPSAoc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxICopKEVsZW0tPk1zZyk7CiAKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIE1sbWVEaXNhc3NvY1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWRcbiIpKTsKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFTU09DIC0gTWxtZURpc2Fzc29jUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZFxuIikpOwogCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CiAJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfRElTQVNTT0NfQ09ORiwgMiwKKwkJCSAgICAmU3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAotCi0KIAlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBTZW5kIERJU0FTU09DIHJlcXVlc3RbQlNTSUQ6OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IChSZWFzb249JWQpXG4iLAotCQkJCXBEaXNhc3NvY1JlcS0+QWRkclswXSwgcERpc2Fzc29jUmVxLT5BZGRyWzFdLCBwRGlzYXNzb2NSZXEtPkFkZHJbMl0sCi0JCQkJcERpc2Fzc29jUmVxLT5BZGRyWzNdLCBwRGlzYXNzb2NSZXEtPkFkZHJbNF0sIHBEaXNhc3NvY1JlcS0+QWRkcls1XSwgcERpc2Fzc29jUmVxLT5SZWFzb24pKTsKLQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRpc2Fzc29jSGRyLCBTVUJUWVBFX0RJU0FTU09DLCAwLCBwRGlzYXNzb2NSZXEtPkFkZHIsIHBEaXNhc3NvY1JlcS0+QWRkcik7CS8vIHBhdGNoIHBlYXAgdHRscyBzd2l0Y2hpbmcgaXNzdWUKLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwmRGlzYXNzb2NIZHIsCi0JCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICZwRGlzYXNzb2NSZXEtPlJlYXNvbiwKLQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFTU09DIC0gU2VuZCBESVNBU1NPQyByZXF1ZXN0W0JTU0lEOjolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAoUmVhc29uPSVkKVxuIiwKKwkJICBwRGlzYXNzb2NSZXEtPkFkZHJbMF0sIHBEaXNhc3NvY1JlcS0+QWRkclsxXSwKKwkJICBwRGlzYXNzb2NSZXEtPkFkZHJbMl0sIHBEaXNhc3NvY1JlcS0+QWRkclszXSwKKwkJICBwRGlzYXNzb2NSZXEtPkFkZHJbNF0sIHBEaXNhc3NvY1JlcS0+QWRkcls1XSwKKwkJICBwRGlzYXNzb2NSZXEtPlJlYXNvbikpOworCU1ndE1hY0hlYWRlckluaXQocEFkLCAmRGlzYXNzb2NIZHIsIFNVQlRZUEVfRElTQVNTT0MsIDAsIHBEaXNhc3NvY1JlcS0+QWRkciwgcERpc2Fzc29jUmVxLT5BZGRyKTsJLyogcGF0Y2ggcGVhcCB0dGxzIHN3aXRjaGluZyBpc3N1ZSAqLworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwKKwkJCSAgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSwgJkRpc2Fzc29jSGRyLAorCQkJICAyLCAmcERpc2Fzc29jUmVxLT5SZWFzb24sIEVORF9PRl9BUkdTKTsKIAlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAotCS8vIFRvIHBhdGNoIEluc3RhbmNlIGFuZCBCdWZmYWxvKE4pIEFQCi0JLy8gRHJpdmVyIGhhcyB0byBzZW5kIGRlYXV0aCB0byBJbnN0YW5jZSBBUCwgYnV0IEJ1ZmZhbG8oTikgbmVlZHMgdG8gc2VuZCBkaXNhc3NvYyB0byByZXNldCBBdXRoZW50aWNhdG9yJ3Mgc3RhdGUgbWFjaGluZQotCS8vIFRoZXJlZm9yZSwgd2Ugc2VuZCBib3RoIG9mIHRoZW0uCi0JcERpc2Fzc29jSGRyID0gKFBIRUFERVJfODAyXzExKXBPdXRCdWZmZXI7CisJLyogVG8gcGF0Y2ggSW5zdGFuY2UgYW5kIEJ1ZmZhbG8oTikgQVAgKi8KKwkvKiBEcml2ZXIgaGFzIHRvIHNlbmQgZGVhdXRoIHRvIEluc3RhbmNlIEFQLCBidXQgQnVmZmFsbyhOKSBuZWVkcyB0byBzZW5kIGRpc2Fzc29jIHRvIHJlc2V0IEF1dGhlbnRpY2F0b3IncyBzdGF0ZSBtYWNoaW5lICovCisJLyogVGhlcmVmb3JlLCB3ZSBzZW5kIGJvdGggb2YgdGhlbS4gKi8KKwlwRGlzYXNzb2NIZHIgPSAoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKikgcE91dEJ1ZmZlcjsKIAlwRGlzYXNzb2NIZHItPkZDLlN1YlR5cGUgPSBTVUJUWVBFX0RFQVVUSDsKIAlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIApAQCAtODQyLDE0ICs4MTcsMTEgQEAKIAlwQWQtPlN0YUNmZy5EaXNhc3NvY1JlYXNvbiA9IFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORzsKIAlDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRpc2Fzc29jU3RhLCBwRGlzYXNzb2NSZXEtPkFkZHIpOwogCi0JUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgVGltZW91dCk7IC8qIGluIG1TZWMgKi8KKwlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCBUaW1lb3V0KTsJLyogaW4gbVNlYyAqLwogCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gRElTQVNTT0NfV0FJVF9SU1A7CiAKLSAgICB7Ci0gICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKLSAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOwotICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7Ci0gICAgfQorCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgU0lPQ0dJV0FQLCAtMSwgTlVMTCwgTlVMTCwgMCk7CisKIH0KIAogLyoKQEAgLTg2Myw5NCArODM1LDgxIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIFBlZXJBc3NvY1JzcEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIFBlZXJBc3NvY1JzcEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbywgU3RhdHVzLCBBaWQ7Ci0JVUNIQVIgICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgU3VwUmF0ZUxlbjsKLQlVQ0hBUiAgICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlTGVuOwotCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOwotCVVDSEFSICAgICAgICAgQ2tpcEZsYWc7Ci0JRURDQV9QQVJNICAgICBFZGNhUGFybTsKLQlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7Ci0JQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JVUNIQVIJCQlIdENhcGFiaWxpdHlMZW47Ci0JVUNIQVIJCQlBZGRIdEluZm9MZW47Ci0JVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKwl1MTYgQ2FwYWJpbGl0eUluZm8sIFN0YXR1cywgQWlkOworCXU4IFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBTdXBSYXRlTGVuOworCXU4IEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlTGVuOworCXU4IEFkZHIyW01BQ19BRERSX0xFTl07CisJQk9PTEVBTiBUaW1lckNhbmNlbGxlZDsKKwl1OCBDa2lwRmxhZzsKKwlzdHJ1Y3QgcnRfZWRjYV9wYXJtIEVkY2FQYXJtOworCXN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llIEh0Q2FwYWJpbGl0eTsKKwlzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgQWRkSHRJbmZvOwkvKiBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUgKi8KKwl1OCBIdENhcGFiaWxpdHlMZW4gPSAwOworCXU4IEFkZEh0SW5mb0xlbjsKKwl1OCBOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKIAotCWlmIChQZWVyQXNzb2NSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZDYXBhYmlsaXR5SW5mbywgJlN0YXR1cywgJkFpZCwgU3VwUmF0ZSwgJlN1cFJhdGVMZW4sIEV4dFJhdGUsICZFeHRSYXRlTGVuLAotCQkmSHRDYXBhYmlsaXR5LCZBZGRIdEluZm8sICZIdENhcGFiaWxpdHlMZW4sJkFkZEh0SW5mb0xlbiwmTmV3RXh0Q2hhbm5lbE9mZnNldCwgJkVkY2FQYXJtLCAmQ2tpcEZsYWcpKQotCXsKLQkJLy8gVGhlIGZyYW1lIGlzIGZvciBtZSA/Ci0JCWlmKE1BQ19BRERSX0VRVUFMKEFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXNzb2NSc3BBY3Rpb24oKTpBU1NPQyAtIHJlY2VpdmUgQVNTT0NfUlNQIHRvIG1lIChzdGF0dXM9JWQpXG4iLCBTdGF0dXMpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBc3NvY1JzcEFjdGlvbigpOk1hY1RhYmxlIFslZF0uQU1zZHVTaXplID0gJWQuIENsaWVudFN0YXR1c0ZsYWdzID0gMHglbHggXG4iLEVsZW0tPldjaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkNsaWVudFN0YXR1c0ZsYWdzKSk7Ci0JCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCQkJaWYoU3RhdHVzID09IE1MTUVfU1VDQ0VTUykKLQkJCXsKLSNpZmRlZiBSVDI4NjAKLQkJCQkvLyBnbyB0byBwcm9jZWR1cmUgbGlzdGVkIG9uIHBhZ2UgMzc2Ci0JCQkJQXNzb2NQb3N0UHJvYyhwQWQsIEFkZHIyLCBDYXBhYmlsaXR5SW5mbywgQWlkLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLAotCQkJCQkmRWRjYVBhcm0sICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mbyk7CisJaWYgKFBlZXJBc3NvY1JzcFNhbml0eQorCSAgICAocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZDYXBhYmlsaXR5SW5mbywgJlN0YXR1cywKKwkgICAgICZBaWQsIFN1cFJhdGUsICZTdXBSYXRlTGVuLCBFeHRSYXRlLCAmRXh0UmF0ZUxlbiwgJkh0Q2FwYWJpbGl0eSwKKwkgICAgICZBZGRIdEluZm8sICZIdENhcGFiaWxpdHlMZW4sICZBZGRIdEluZm9MZW4sICZOZXdFeHRDaGFubmVsT2Zmc2V0LAorCSAgICAgJkVkY2FQYXJtLCAmQ2tpcEZsYWcpKSB7CisJCS8qIFRoZSBmcmFtZSBpcyBmb3IgbWUgPyAqLworCQlpZiAoTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlBlZXJBc3NvY1JzcEFjdGlvbigpOkFTU09DIC0gcmVjZWl2ZSBBU1NPQ19SU1AgdG8gbWUgKHN0YXR1cz0lZClcbiIsCisJCQkJICBTdGF0dXMpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlBlZXJBc3NvY1JzcEFjdGlvbigpOk1hY1RhYmxlIFslZF0uQU1zZHVTaXplID0gJWQuIENsaWVudFN0YXR1c0ZsYWdzID0gMHglbHggXG4iLAorCQkJCSAgRWxlbS0+V2NpZCwKKwkJCQkgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplLAorCQkJCSAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4KKwkJCQkgIENsaWVudFN0YXR1c0ZsYWdzKSk7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLAorCQkJCQkmVGltZXJDYW5jZWxsZWQpOwogCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7Ci0gICAgICAgICAgICAgICAgICAgIHdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKHBBZCk7CisJCQlpZiAoU3RhdHVzID09IE1MTUVfU1VDQ0VTUykgeworCQkJCXU4IE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSAwOworCQkJCXU4IGlkeDsKIAotICAgICAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOwotICAgICAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJCQlVQ0hBUgkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSAwOwotCQkJCVVDSEFSCQkJaWR4OwotCi0JCQkJLy8gc3VwcG9ydGVkIHJhdGVzIGFycmF5IG1heSBub3QgYmUgc29ydGVkLiBzb3J0IGl0IGFuZCBmaW5kIHRoZSBtYXhpbXVtIHJhdGUKLQkJCSAgICBmb3IgKGlkeD0wOyBpZHg8U3VwUmF0ZUxlbjsgaWR4KyspCi0gICAgICAgICAgICAgICAgewotCQkJICAgICAgICBpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8IChTdXBSYXRlW2lkeF0gJiAweDdmKSkKLQkJCSAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBTdXBSYXRlW2lkeF0gJiAweDdmOwotCQkJICAgIH0KLQotCQkJCWZvciAoaWR4PTA7IGlkeDxFeHRSYXRlTGVuOyBpZHgrKykKLQkJCSAgICB7Ci0JCQkgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKEV4dFJhdGVbaWR4XSAmIDB4N2YpKQotCQkJICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IEV4dFJhdGVbaWR4XSAmIDB4N2Y7Ci0gICAgICAgICAgICAgICAgfQotCQkJCS8vIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYKLQkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCi0JCQkJCSZFZGNhUGFybSwgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCAmQWRkSHRJbmZvKTsKLQotCQkJCVN0YUFkZE1hY1RhYmxlRW50cnkocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCBDYXBhYmlsaXR5SW5mbyk7Ci0jZW5kaWYKLQkJCQlwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IENraXBGbGFnOwotCQkJCWlmIChDa2lwRmxhZyAmIDB4MTgpCi0JCQkJewotCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5UeFNFUSwgNCk7Ci0JCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJ4U0VRLCA0KTsKLQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuQ0tJUE1JQywgNCk7Ci0JCQkJCXBBZC0+U3RhQ2ZnLkdJVlswXSA9IFJhbmRvbUJ5dGUocEFkKTsKLQkJCQkJcEFkLT5TdGFDZmcuR0lWWzFdID0gUmFuZG9tQnl0ZShwQWQpOwotCQkJCQlwQWQtPlN0YUNmZy5HSVZbMl0gPSBSYW5kb21CeXRlKHBBZCk7Ci0JCQkJCXBBZC0+U3RhQ2ZnLmJDa2lwT24gPSBUUlVFOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8Q0NYPiBwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IDB4JTAyeFxuIiwgcEFkLT5TdGFDZmcuQ2tpcEZsYWcpKTsKKwkJCQkvKiBzdXBwb3J0ZWQgcmF0ZXMgYXJyYXkgbWF5IG5vdCBiZSBzb3J0ZWQuIHNvcnQgaXQgYW5kIGZpbmQgdGhlIG1heGltdW0gcmF0ZSAqLworCQkJCWZvciAoaWR4ID0gMDsgaWR4IDwgU3VwUmF0ZUxlbjsgaWR4KyspIHsKKwkJCQkJaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPAorCQkJCQkgICAgKFN1cFJhdGVbaWR4XSAmIDB4N2YpKQorCQkJCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9CisJCQkJCQkgICAgU3VwUmF0ZVtpZHhdICYgMHg3ZjsKIAkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7CisKKwkJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IEV4dFJhdGVMZW47IGlkeCsrKSB7CisJCQkJCWlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwKKwkJCQkJICAgIChFeHRSYXRlW2lkeF0gJiAweDdmKSkKKwkJCQkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPQorCQkJCQkJICAgIEV4dFJhdGVbaWR4XSAmIDB4N2Y7CisJCQkJfQorCQkJCS8qIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYgKi8KKwkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsCisJCQkJCSAgICAgIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsCisJCQkJCSAgICAgIEV4dFJhdGVMZW4sICZFZGNhUGFybSwKKwkJCQkJICAgICAgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkgICAgICAmQWRkSHRJbmZvKTsKKworCQkJCVN0YUFkZE1hY1RhYmxlRW50cnkocEFkLAorCQkJCQkJICAgICZwQWQtPk1hY1RhYi4KKwkJCQkJCSAgICBDb250ZW50W0JTU0lEX1dDSURdLAorCQkJCQkJICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMsCisJCQkJCQkgICAgJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCSAgICBIdENhcGFiaWxpdHlMZW4sICZBZGRIdEluZm8sCisJCQkJCQkgICAgQWRkSHRJbmZvTGVuLAorCQkJCQkJICAgIENhcGFiaWxpdHlJbmZvKTsKIAkJCX0KIAkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJICAgIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKIAkJfQotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJBc3NvY1JzcEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJBU1NPQyAtIFBlZXJBc3NvY1JzcEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CiAJfQogfQogCkBAIC05NjUsNjEgKzkyNCw2MiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBQZWVyUmVhc3NvY1JzcEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIFBlZXJSZWFzc29jUnNwQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgICAgICBDYXBhYmlsaXR5SW5mbzsKLQlVU0hPUlQgICAgICBTdGF0dXM7Ci0JVVNIT1JUICAgICAgQWlkOwotCVVDSEFSICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBTdXBSYXRlTGVuOwotCVVDSEFSICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlTGVuOwotCVVDSEFSICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICAgICAgQ2tpcEZsYWc7Ci0JQk9PTEVBTiAgICAgVGltZXJDYW5jZWxsZWQ7Ci0JRURDQV9QQVJNICAgRWRjYVBhcm07Ci0JSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OwotCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuOwotCVVDSEFSCQkJQWRkSHRJbmZvTGVuOwotCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisJdTE2IENhcGFiaWxpdHlJbmZvOworCXUxNiBTdGF0dXM7CisJdTE2IEFpZDsKKwl1OCBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgU3VwUmF0ZUxlbjsKKwl1OCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZUxlbjsKKwl1OCBBZGRyMltNQUNfQUREUl9MRU5dOworCXU4IENraXBGbGFnOworCUJPT0xFQU4gVGltZXJDYW5jZWxsZWQ7CisJc3RydWN0IHJ0X2VkY2FfcGFybSBFZGNhUGFybTsKKwlzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSBIdENhcGFiaWxpdHk7CisJc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llIEFkZEh0SW5mbzsJLyogQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFICovCisJdTggSHRDYXBhYmlsaXR5TGVuOworCXU4IEFkZEh0SW5mb0xlbjsKKwl1OCBOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKIAotCWlmKFBlZXJBc3NvY1JzcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkNhcGFiaWxpdHlJbmZvLCAmU3RhdHVzLCAmQWlkLCBTdXBSYXRlLCAmU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgJkV4dFJhdGVMZW4sCi0JCQkJCQkJCSZIdENhcGFiaWxpdHksCSZBZGRIdEluZm8sICZIdENhcGFiaWxpdHlMZW4sICZBZGRIdEluZm9MZW4sJk5ld0V4dENoYW5uZWxPZmZzZXQsICZFZGNhUGFybSwgJkNraXBGbGFnKSkKLQl7Ci0JCWlmKE1BQ19BRERSX0VRVUFMKEFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpKSAvLyBUaGUgZnJhbWUgaXMgZm9yIG1lID8KKwlpZiAoUGVlckFzc29jUnNwU2FuaXR5CisJICAgIChwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkNhcGFiaWxpdHlJbmZvLCAmU3RhdHVzLAorCSAgICAgJkFpZCwgU3VwUmF0ZSwgJlN1cFJhdGVMZW4sIEV4dFJhdGUsICZFeHRSYXRlTGVuLCAmSHRDYXBhYmlsaXR5LAorCSAgICAgJkFkZEh0SW5mbywgJkh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mb0xlbiwgJk5ld0V4dENoYW5uZWxPZmZzZXQsCisJICAgICAmRWRjYVBhcm0sICZDa2lwRmxhZykpIHsKKwkJaWYgKE1BQ19BRERSX0VRVUFMKEFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpKQkvKiBUaGUgZnJhbWUgaXMgZm9yIG1lID8gKi8KIAkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSByZWNlaXZlIFJFQVNTT0NfUlNQIHRvIG1lIChzdGF0dXM9JWQpXG4iLCBTdGF0dXMpKTsKLQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkFTU09DIC0gcmVjZWl2ZSBSRUFTU09DX1JTUCB0byBtZSAoc3RhdHVzPSVkKVxuIiwKKwkJCQkgIFN0YXR1cykpOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLAorCQkJCQkmVGltZXJDYW5jZWxsZWQpOwogCi0JCQlpZihTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQotCQkJewotCQkJCS8vIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYKLQkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCi0JCQkJCSAmRWRjYVBhcm0sICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mbyk7CisJCQlpZiAoU3RhdHVzID09IE1MTUVfU1VDQ0VTUykgeworCQkJCS8qIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYgKi8KKwkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsCisJCQkJCSAgICAgIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsCisJCQkJCSAgICAgIEV4dFJhdGVMZW4sICZFZGNhUGFybSwKKwkJCQkJICAgICAgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkgICAgICAmQWRkSHRJbmZvKTsKIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OwotICAgICAgICAgICAgICAgICAgICB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYyhwQWQpOwotCi0gICAgICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKLQotICAgICAgICAgICAgICAgIH0KKwkJCQl7CisJCQkJCXdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKHBBZCk7CisJCQkJCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgU0lPQ0dJV0FQLAorCQkJCQkJCQktMSwKKwkJCQkJCQkJJnBBZC0+TWxtZUF1eC4KKwkJCQkJCQkJQnNzaWRbMF0sIE5VTEwsCisJCQkJCQkJCTApOworCQkJCX0KIAogCQkJfQotCi0JCQl7Ci0JCQkJLy8gQ2tpcEZsYWcgaXMgbm8gdXNlIGZvciByZWFzc29jaWF0ZQotCQkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQkJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKLQkJCX0KKwkJCS8qIENraXBGbGFnIGlzIG5vIHVzZSBmb3IgcmVhc3NvY2lhdGUgKi8KKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJICAgIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOwogCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUGVlclJlYXNzb2NSc3BBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQVNTT0MgLSBQZWVyUmVhc3NvY1JzcEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CiAJfQogCiB9CkBAIC0xMDM0LDMwICs5OTQsMTggQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgQXNzb2NQb3N0UHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcEFkZHIyLAotCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKLQlJTiBVU0hPUlQgQWlkLAotCUlOIFVDSEFSIFN1cFJhdGVbXSwKLQlJTiBVQ0hBUiBTdXBSYXRlTGVuLAotCUlOIFVDSEFSIEV4dFJhdGVbXSwKLQlJTiBVQ0hBUiBFeHRSYXRlTGVuLAotCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotCUlOIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAotCUlOIFVDSEFSIEh0Q2FwYWJpbGl0eUxlbiwKLQlJTiBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQordm9pZCBBc3NvY1Bvc3RQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKnBBZGRyMiwgdTE2IENhcGFiaWxpdHlJbmZvLCB1MTYgQWlkLCB1OCBTdXBSYXRlW10sIHU4IFN1cFJhdGVMZW4sIHU4IEV4dFJhdGVbXSwgdTggRXh0UmF0ZUxlbiwgc3RydWN0IHJ0X2VkY2FfcGFybSAqcEVkY2FQYXJtLCBzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSAqIHBIdENhcGFiaWxpdHksIHU4IEh0Q2FwYWJpbGl0eUxlbiwgc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llICogcEFkZEh0SW5mbykJLyogQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFICovCiB7Ci0JVUxPTkcgSWR4OworCXVuc2lnbmVkIGxvbmcgSWR4OwogCiAJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBCU1NfSU5GUkE7CiAJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIHBBZGRyMik7CiAJcEFkLT5NbG1lQXV4LkFpZCA9IEFpZDsKLQlwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87CisJcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvID0KKwkgICAgQ2FwYWJpbGl0eUluZm8gJiBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPOwogCi0JLy8gU29tZSBIVCBBUCBtaWdodCBsb3N0IFdNTSBJRS4gV2UgYWRkIFdNTSBvdXJzZWx2ZXMuIGJlYWN1YXNlIEhUIHJlcXVpcmVzIFFvUyBvbi4KLQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApICYmIChwRWRjYVBhcm0tPmJWYWxpZCA9PSBGQUxTRSkpCi0JeworCS8qIFNvbWUgSFQgQVAgbWlnaHQgbG9zdCBXTU0gSUUuIFdlIGFkZCBXTU0gb3Vyc2VsdmVzLiBiZWFjdWFzZSBIVCByZXF1aXJlcyBRb1Mgb24uICovCisJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEVkY2FQYXJtLT5iVmFsaWQgPT0gRkFMU0UpKSB7CiAJCXBFZGNhUGFybS0+YlZhbGlkID0gVFJVRTsKIAkJcEVkY2FQYXJtLT5BaWZzblswXSA9IDM7CiAJCXBFZGNhUGFybS0+QWlmc25bMV0gPSA3OwpAQCAtMTA3NCw4OCArMTAyMiwxMTMgQEAKIAkJcEVkY2FQYXJtLT5Dd21heFsyXSA9IDQ7CiAJCXBFZGNhUGFybS0+Q3dtYXhbM10gPSAzOwogCi0JCXBFZGNhUGFybS0+VHhvcFswXSAgPSAwOwotCQlwRWRjYVBhcm0tPlR4b3BbMV0gID0gMDsKLQkJcEVkY2FQYXJtLT5UeG9wWzJdICA9IDk2OwotCQlwRWRjYVBhcm0tPlR4b3BbM10gID0gNDg7CisJCXBFZGNhUGFybS0+VHhvcFswXSA9IDA7CisJCXBFZGNhUGFybS0+VHhvcFsxXSA9IDA7CisJCXBFZGNhUGFybS0+VHhvcFsyXSA9IDk2OworCQlwRWRjYVBhcm0tPlR4b3BbM10gPSA0ODsKIAogCX0KIAotCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwgcEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLCBwRWRjYVBhcm0sIHNpemVvZihzdHJ1Y3QgcnRfZWRjYV9wYXJtKSk7CiAKLQkvLyBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCByYXRlcworCS8qIGZpbHRlciBvdXQgdW4tc3VwcG9ydGVkIHJhdGVzICovCiAJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOwogCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBTdXBSYXRlLCBTdXBSYXRlTGVuKTsKIAlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCAmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4pOwogCi0JLy8gZmlsdGVyIG91dCB1bi1zdXBwb3J0ZWQgcmF0ZXMKKwkvKiBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCByYXRlcyAqLwogCXBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKIAlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7CiAJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKIAotCWlmIChIdENhcGFiaWxpdHlMZW4gPiAwKQotCXsKKwlpZiAoSHRDYXBhYmlsaXR5TGVuID4gMCkgewogCQlSVE1QQ2hlY2tIdChwQWQsIEJTU0lEX1dDSUQsIHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8pOwogCX0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiAgQVAuQU1zZHVTaXplID0gJWQuIENsaWVudFN0YXR1c0ZsYWdzID0gMHglbHggXG4iLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFNc2R1U2l6ZSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJBc3NvY1Bvc3RQcm9jPT09PiAgQVAuQU1zZHVTaXplID0gJWQuIENsaWVudFN0YXR1c0ZsYWdzID0gMHglbHggXG4iLAorCQkgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplLAorCQkgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+ICAgIChNbXBzPSVkLCBBbXNkdVNpemU9JWQsIClcbiIsCi0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTW1wc01vZGUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFzc29jUG9zdFByb2M9PT0+ICAgIChNbXBzPSVkLCBBbXNkdVNpemU9JWQsIClcbiIsCisJCSAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NbXBzTW9kZSwKKwkJICBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFNc2R1U2l6ZSkpOwogCi0JLy8gU2V0IE5ldyBXUEEgaW5mb3JtYXRpb24KKwkvKiBTZXQgTmV3IFdQQSBpbmZvcm1hdGlvbiAqLwogCUlkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBBZGRyMiwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOwotCWlmIChJZHggPT0gQlNTX05PVF9GT1VORCkKLQl7CisJaWYgKElkeCA9PSBCU1NfTk9UX0ZPVU5EKSB7CiAJCURCR1BSSU5UX0VSUigoIkFTU09DIC0gQ2FuJ3QgZmluZCBCU1MgYWZ0ZXIgcmVjZWl2aW5nIEFzc29jIHJlc3BvbnNlXG4iKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIEluaXQgdmFyaWFibGUKKwl9IGVsc2UgeworCQkvKiBJbml0IHZhcmlhYmxlICovCiAJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID0gMDsKLQkJTmRpc1plcm9NZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIE1BWF9MRU5fT0ZfUlNOSUUpOworCQlOZGlzWmVyb01lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwKKwkJCSAgICAgICBNQVhfTEVOX09GX1JTTklFKTsKIAotCQkvLyBTdG9yZSBhcHByb3ByaWF0ZSBSU05fSUUgZm9yIFdQQSBTTSBuZWdvdGlhdGlvbiBsYXRlcgotCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgJiYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlZhcklFTGVuICE9IDApKQotCQl7Ci0JCQlQVUNIQVIgICAgICAgICAgICAgIHBWSUU7Ci0JCQlVU0hPUlQgICAgICAgICAgICAgIGxlbjsKLQkJCVBFSURfU1RSVUNUICAgICAgICAgcEVpZDsKKwkJLyogU3RvcmUgYXBwcm9wcmlhdGUgUlNOX0lFIGZvciBXUEEgU00gbmVnb3RpYXRpb24gbGF0ZXIgKi8KKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCSAgICAmJiAocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVmFySUVMZW4gIT0gMCkpIHsKKwkJCXU4ICpwVklFOworCQkJdTE2IGxlbjsKKwkJCXN0cnVjdCBydF9laWQgKiBwRWlkOwogCiAJCQlwVklFID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVmFySUVzOwotCQkJbGVuCSA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlZhcklFTGVuOworCQkJbGVuID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVmFySUVMZW47CisJCQkvKktIIG5lZWQgdG8gY2hlY2sgYWdhaW4gKi8KKwkJCS8qIERvbid0IGFsbG93IHRvIGdvIHRvIHNsZWVwIG1vZGUgaWYgYXV0aG1vZGUgaXMgV1BBLXJlbGF0ZWQuICovCisJCQkvKlRoaXMgY2FuIG1ha2UgQXV0aGVudGljYXRpb24gcHJvY2VzcyBtb3JlIHNtb290aGx5LiAqLworCQkJUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwogCi0JCQl3aGlsZSAobGVuID4gMCkKLQkJCXsKLQkJCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOwotCQkJCS8vIEZvciBXUEEvV1BBUFNLCi0JCQkJaWYgKChwRWlkLT5FaWQgPT0gSUVfV1BBKSAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkKLQkJCQkJJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSB8fCBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQotCQkJCXsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBWSUUsIChwRWlkLT5MZW4gKyAyKSk7Ci0JCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID0gKHBFaWQtPkxlbiArIDIpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiBTdG9yZSBSU05fSUUgZm9yIFdQQSBTTSBuZWdvdGlhdGlvbiBcbiIpKTsKKwkJCXdoaWxlIChsZW4gPiAwKSB7CisJCQkJcEVpZCA9IChzdHJ1Y3QgcnRfZWlkICopIHBWSUU7CisJCQkJLyogRm9yIFdQQS9XUEFQU0sgKi8KKwkJCQlpZiAoKHBFaWQtPkVpZCA9PSBJRV9XUEEpCisJCQkJICAgICYmCisJCQkJICAgIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKQorCQkJCSAgICAmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCQkJTmRpczgwMl8xMUF1dGhNb2RlV1BBCisJCQkJCXx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkJCU5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpIHsKKwkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuCisJCQkJCQkgICAgICAgQ29udGVudFtCU1NJRF9XQ0lEXS4KKwkJCQkJCSAgICAgICBSU05fSUUsIHBWSUUsCisJCQkJCQkgICAgICAgKHBFaWQtPkxlbiArIDIpKTsKKwkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4KKwkJCQkJICAgIFJTTklFX0xlbiA9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJBc3NvY1Bvc3RQcm9jPT09PiBTdG9yZSBSU05fSUUgZm9yIFdQQSBTTSBuZWdvdGlhdGlvbiBcbiIpKTsKIAkJCQl9Ci0JCQkJLy8gRm9yIFdQQTIvV1BBMlBTSwotCQkJCWVsc2UgaWYgKChwRWlkLT5FaWQgPT0gSUVfUlNOKSAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpCi0JCQkJCSYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQkJCXsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBWSUUsIChwRWlkLT5MZW4gKyAyKSk7Ci0JCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID0gKHBFaWQtPkxlbiArIDIpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiBTdG9yZSBSU05fSUUgZm9yIFdQQTIgU00gbmVnb3RpYXRpb24gXG4iKSk7CisJCQkJLyogRm9yIFdQQTIvV1BBMlBTSyAqLworCQkJCWVsc2UgaWYgKChwRWlkLT5FaWQgPT0gSUVfUlNOKQorCQkJCQkgJiYKKwkJCQkJIChOZGlzRXF1YWxNZW1vcnkKKwkJCQkJICAocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkKKwkJCQkJICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCQkgICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIKKwkJCQkJICAgICB8fCBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCQkgICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKSB7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLgorCQkJCQkJICAgICAgIENvbnRlbnRbQlNTSURfV0NJRF0uCisJCQkJCQkgICAgICAgUlNOX0lFLCBwVklFLAorCQkJCQkJICAgICAgIChwRWlkLT5MZW4gKyAyKSk7CisJCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uCisJCQkJCSAgICBSU05JRV9MZW4gPSAocEVpZC0+TGVuICsgMik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiQXNzb2NQb3N0UHJvYz09PT4gU3RvcmUgUlNOX0lFIGZvciBXUEEyIFNNIG5lZ290aWF0aW9uIFxuIikpOwogCQkJCX0KIAogCQkJCXBWSUUgKz0gKHBFaWQtPkxlbiArIDIpOwotCQkJCWxlbiAgLT0gKHBFaWQtPkxlbiArIDIpOworCQkJCWxlbiAtPSAocEVpZC0+TGVuICsgMik7CiAJCQl9CisKIAkJfQogCi0JCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9PSAwKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiBubyBSU05fSUUgXG4iKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQloZXhfZHVtcCgiUlNOX0lFIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKTsKKwkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID09IDApIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkFzc29jUG9zdFByb2M9PT0+IG5vIFJTTl9JRSBcbiIpKTsKKwkJfSBlbHNlIHsKKwkJCWhleF9kdW1wKCJSU05fSUUiLAorCQkJCSBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwKKwkJCQkgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pOwogCQl9CiAJfQogfQpAQCAtMTE3MSw0MyArMTE0NCwzNiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBQZWVyRGlzYXNzb2NBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBQZWVyRGlzYXNzb2NBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlVU0hPUlQgICAgICAgIFJlYXNvbjsKKwl1OCBBZGRyMltNQUNfQUREUl9MRU5dOworCXUxNiBSZWFzb247CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJEaXNhc3NvY0FjdGlvbigpXG4iKSk7Ci0JaWYoUGVlckRpc2Fzc29jU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmUmVhc29uKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUGVlckRpc2Fzc29jQWN0aW9uKCkgUmVhc29uID0gJWRcbiIsIFJlYXNvbikpOwotCQlpZiAoSU5GUkFfT04ocEFkKSAmJiBNQUNfQUREUl9FUVVBTChwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgQWRkcjIpKQotCQl7CisJaWYgKFBlZXJEaXNhc3NvY1Nhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJlJlYXNvbikpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJBU1NPQyAtIFBlZXJEaXNhc3NvY0FjdGlvbigpIFJlYXNvbiA9ICVkXG4iLAorCQkJICBSZWFzb24pKTsKKwkJaWYgKElORlJBX09OKHBBZCkKKwkJICAgICYmIE1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBBZGRyMikpIHsKIAotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQkJewotCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RJU0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpIHsKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLAorCQkJCQkJICAgICAgSVdfRElTQVNTT0NfRVZFTlRfRkxBRywKKwkJCQkJCSAgICAgIHBBZC0+TWFjVGFiLgorCQkJCQkJICAgICAgQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLAorCQkJCQkJICAgICAgQlNTMCwgMCk7CiAJCQl9CiAKLQkJCS8vCi0JCQkvLyBHZXQgQ3VycmVudCBTeXN0ZW0gdGltZSBhbmQgVHVybiBvbiBBZGphY2VudEFQUmVwb3J0Ci0JCQkvLwotCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUExpbmtEb3duVGltZSk7Ci0JCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQUmVwb3J0RmxhZyA9IFRSVUU7CiAJCQlMaW5rRG93bihwQWQsIFRSVUUpOwogCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwogCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OwotICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKLSAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7Ci0gICAgICAgICAgICB9CisJCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIFNJT0NHSVdBUCwgLTEsIE5VTEwsIE5VTEwsCisJCQkJCQkwKTsKIAkJfQotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJEaXNhc3NvY0FjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJBU1NPQyAtIFBlZXJEaXNhc3NvY0FjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CiAJfQogCiB9CkBAIC0xMjIzLDExICsxMTg5LDkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgQXNzb2NUaW1lb3V0QWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgQXNzb2NUaW1lb3V0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgIFN0YXR1czsKKwl1MTYgU3RhdHVzOwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQXNzb2NUaW1lb3V0QWN0aW9uXG4iKSk7CiAJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwogCVN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7CkBAIC0xMjQzLDExICsxMjA3LDkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgUmVhc3NvY1RpbWVvdXRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBSZWFzc29jVGltZW91dEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVVNIT1JUICBTdGF0dXM7CisJdTE2IFN0YXR1czsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFJlYXNzb2NUaW1lb3V0QWN0aW9uXG4iKSk7CiAJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwogCVN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7CkBAIC0xMjYzLDUxICsxMjI1LDQ5IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIERpc2Fzc29jVGltZW91dEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIERpc2Fzc29jVGltZW91dEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVVNIT1JUICBTdGF0dXM7CisJdTE2IFN0YXR1czsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIERpc2Fzc29jVGltZW91dEFjdGlvblxuIikpOwogCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKIAlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7Ci0JTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19DT05GLCAyLAorCQkgICAgJlN0YXR1cyk7CiB9CiAKLVZPSUQgSW52YWxpZFN0YXRlV2hlbkFzc29jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgSW52YWxpZFN0YXRlV2hlbkFzc29jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgIFN0YXR1czsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIEludmFsaWRTdGF0ZVdoZW5Bc3NvYyhzdGF0ZT0lbGQpLCByZXNldCBBU1NPQyBzdGF0ZSBtYWNoaW5lXG4iLAotCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSkpOworCXUxNiBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlbkFzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCisJCSAgcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUpKTsKIAlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CiAJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKIAlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CiB9CiAKLVZPSUQgSW52YWxpZFN0YXRlV2hlblJlYXNzb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVVNIT1JUIFN0YXR1czsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCi0JCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJdTE2IFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQVNTT0MgLSBJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyhzdGF0ZT0lbGQpLCByZXNldCBBU1NPQyBzdGF0ZSBtYWNoaW5lXG4iLAorCQkgIHBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CiAJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwogCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CiAJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CiB9CiAKLVZPSUQgSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIEludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCi0JCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJdTE2IFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQVNTT0MgLSBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2Moc3RhdGU9JWxkKSwgcmVzZXQgQVNTT0Mgc3RhdGUgbWFjaGluZVxuIiwKKwkJICBwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSkpOwogCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKIAlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOwotCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfRElTQVNTT0NfQ09ORiwgMiwKKwkJICAgICZTdGF0dXMpOwogfQogCiAvKgpAQCAtMTMyMywzMyArMTI4MywzMSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBDbHMzZXJyQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIpCit2b2lkIENsczNlcnJBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqcEFkZHIpCiB7Ci0JSEVBREVSXzgwMl8xMSAgICAgICAgIERpc2Fzc29jSGRyOwotCVBIRUFERVJfODAyXzExICAgICAgICBwRGlzYXNzb2NIZHI7Ci0JUFVDSEFSICAgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCVVMT05HICAgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JTkRJU19TVEFUVVMgICAgICAgICAgIE5TdGF0dXM7Ci0JVVNIT1JUICAgICAgICAgICAgICAgIFJlYXNvbiA9IFJFQVNPTl9DTFMzRVJSOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIERpc2Fzc29jSGRyOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcERpc2Fzc29jSGRyOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuID0gMDsKKwlpbnQgTlN0YXR1czsKKwl1MTYgUmVhc29uID0gUkVBU09OX0NMUzNFUlI7CiAKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KIAlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQogCQlyZXR1cm47CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIENsYXNzIDMgRXJyb3IsIFNlbmQgRElTQVNTT0MgZnJhbWVcbiIpKTsKLQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRpc2Fzc29jSGRyLCBTVUJUWVBFX0RJU0FTU09DLCAwLCBwQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwkvLyBwYXRjaCBwZWFwIHR0bHMgc3dpdGNoaW5nIGlzc3VlCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRpc2Fzc29jSGRyLAotCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAmUmVhc29uLAotCQkJCQkgIEVORF9PRl9BUkdTKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQVNTT0MgLSBDbGFzcyAzIEVycm9yLCBTZW5kIERJU0FTU09DIGZyYW1lXG4iKSk7CisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZEaXNhc3NvY0hkciwgU1VCVFlQRV9ESVNBU1NPQywgMCwgcEFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsJLyogcGF0Y2ggcGVhcCB0dGxzIHN3aXRjaGluZyBpc3N1ZSAqLworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwKKwkJCSAgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSwgJkRpc2Fzc29jSGRyLAorCQkJICAyLCAmUmVhc29uLCBFTkRfT0ZfQVJHUyk7CiAJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CiAKLQkvLyBUbyBwYXRjaCBJbnN0YW5jZSBhbmQgQnVmZmFsbyhOKSBBUAotCS8vIERyaXZlciBoYXMgdG8gc2VuZCBkZWF1dGggdG8gSW5zdGFuY2UgQVAsIGJ1dCBCdWZmYWxvKE4pIG5lZWRzIHRvIHNlbmQgZGlzYXNzb2MgdG8gcmVzZXQgQXV0aGVudGljYXRvcidzIHN0YXRlIG1hY2hpbmUKLQkvLyBUaGVyZWZvcmUsIHdlIHNlbmQgYm90aCBvZiB0aGVtLgotCXBEaXNhc3NvY0hkciA9IChQSEVBREVSXzgwMl8xMSlwT3V0QnVmZmVyOworCS8qIFRvIHBhdGNoIEluc3RhbmNlIGFuZCBCdWZmYWxvKE4pIEFQICovCisJLyogRHJpdmVyIGhhcyB0byBzZW5kIGRlYXV0aCB0byBJbnN0YW5jZSBBUCwgYnV0IEJ1ZmZhbG8oTikgbmVlZHMgdG8gc2VuZCBkaXNhc3NvYyB0byByZXNldCBBdXRoZW50aWNhdG9yJ3Mgc3RhdGUgbWFjaGluZSAqLworCS8qIFRoZXJlZm9yZSwgd2Ugc2VuZCBib3RoIG9mIHRoZW0uICovCisJcERpc2Fzc29jSGRyID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIHBPdXRCdWZmZXI7CiAJcERpc2Fzc29jSGRyLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9ERUFVVEg7CiAJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CiAKQEAgLTEzNTksMzUyICsxMzE3LDI3MSBAQAogCUNPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGlzYXNzb2NTdGEsIHBBZGRyKTsKIH0KIAotIC8qCi0JID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JIERlc2NyaXB0aW9uOgotCQkgU3dpdGNoIGJldHdlZW4gV0VQIGFuZCBDS0lQIHVwb24gbmV3IGFzc29jaWF0aW9uIHVwLgotCSBQYXJhbWV0ZXJzOgotCi0JIElSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICovCi1WT0lEIFN3aXRjaEJldHdlZW5XZXBBbmRDa2lwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoraW50IHdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlpbnQgICAgICAgICAgICBpOwotCVNIQVJFREtFWV9NT0RFX1NUUlVDICBjc3IxOworCWNoYXIgY3VzdG9tW0lXX0NVU1RPTV9NQVhdID0geyAwIH07CiAKLQkvLyBpZiBLUCBpcyByZXF1aXJlZC4gY2hhbmdlIHRoZSBDaXBoZXJBbGcgaW4gaGFyZHdhcmUgc2hhcmQga2V5IHRhYmxlIGZyb20gV0VQCi0JLy8gdG8gQ0tJUC4gZWxzZSByZW1haW4gYXMgV0VQCi0JaWYgKHBBZC0+U3RhQ2ZnLmJDa2lwT24gJiYgKHBBZC0+U3RhQ2ZnLkNraXBGbGFnICYgMHgxMCkpCi0JewotCQkvLyBtb2RpZnkgaGFyZHdhcmUga2V5IHRhYmxlIHNvIHRoYXQgTUFDIHVzZSBjb3JyZWN0IGFsZ29yaXRobSB0byBkZWNyeXB0IFJYCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UsICZjc3IxLndvcmQpOwotCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9PSBDSVBIRVJfV0VQNjQpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVA2NDsKLQkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9PSBDSVBIRVJfV0VQMTI4KQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENJUEhFUl9DS0lQMTI4OwotCi0JCWlmIChjc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OwotCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7Ci0KLQkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7Ci0JCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKLQotCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9PSBDSVBIRVJfV0VQNjQpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVA2NDsKLQkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9PSBDSVBIRVJfV0VQMTI4KQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENJUEhFUl9DS0lQMTI4OwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSwgY3NyMS53b3JkKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3dpdGNoQmV0d2VlbldlcEFuZENraXA6IG1vZGlmeSBCU1MwIGNpcGhlciB0byAlc1xuIiwgQ2lwaGVyTmFtZVtjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnXSkpOwotCi0JCS8vIG1vZGlmeSBzb2Z0d2FyZSBrZXkgdGFibGUgc28gdGhhdCBkcml2ZXIgY2FuIHNwZWNpZnkgY29ycmVjdCBhbGdvcml0aG0gaW4gVFhEIHVwb24gVFgKLQkJZm9yIChpPTA7IGk8U0hBUkVfS0VZX05VTTsgaSsrKQotCQl7Ci0JCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKLQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OwotCQkJZWxzZSBpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCi0JCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7Ci0JCX0KLQl9Ci0KLQkvLyBlbHNlIGlmIEtQIE5PVCBpbnVzZWQuIGNoYW5nZSB0aGUgQ2lwaGVyQWxnIGluIGhhcmR3YXJlIHNoYXJkIGtleSB0YWJsZSBmcm9tIENLSVAKLQkvLyB0byBXRVAuCi0JZWxzZQotCXsKLQkJLy8gbW9kaWZ5IGhhcmR3YXJlIGtleSB0YWJsZSBzbyB0aGF0IE1BQyB1c2UgY29ycmVjdCBhbGdvcml0aG0gdG8gZGVjcnlwdCBSWAotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFLCAmY3NyMS53b3JkKTsKLQkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVA2NCkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0JCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVAxMjgpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLQotCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCi0JCWlmIChjc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0KLQkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVA2NCkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0JCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVAxMjgpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLQotCQkvLyBtb2RpZnkgc29mdHdhcmUga2V5IHRhYmxlIHNvIHRoYXQgZHJpdmVyIGNhbiBzcGVjaWZ5IGNvcnJlY3QgYWxnb3JpdGhtIGluIFRYRCB1cG9uIFRYCi0JCWZvciAoaT0wOyBpPFNIQVJFX0tFWV9OVU07IGkrKykKLQkJewotCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQotCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQkJCWVsc2UgaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKLQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCQl9Ci0KLQkJLy8KLQkJLy8gT24gV1BBLU5PTkUsIG11c3QgdXBkYXRlIENpcGhlckFsZy4KLQkJLy8gQmVjYXVzZSB0aGUgT0lEXzgwMl8xMV9XRVBfU1RBVFVTIHdhcyBiZWVuIHNldCBhZnRlciBPSURfODAyXzExX0FERF9LRVkKLQkJLy8gYW5kIENpcGhlckFsZyB3aWxsIGJlIENJUEhFUl9OT05FIGJ5IFdpbmRvd3MgWmVyb0NvbmZpZy4KLQkJLy8gU28gd2UgbmVlZCB0byB1cGRhdGUgQ2lwaGVyQWxnIGFmdGVyIGNvbm5lY3QuCi0JCS8vCi0JCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQl7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgU0hBUkVfS0VZX05VTTsgaSsrKQotCQkJewotCQkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5LZXlMZW4gIT0gMCkKLQkJCQl7Ci0JCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJCQkJewotCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JCQkJCXsKLQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCQkJfQotCQkJfQotCi0JCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOwotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzFdLkNpcGhlckFsZzsKLQkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVsyXS5DaXBoZXJBbGc7Ci0JCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bM10uQ2lwaGVyQWxnOwotCQl9Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFLCBjc3IxLndvcmQpOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcDogbW9kaWZ5IEJTUzAgY2lwaGVyIHRvICVzXG4iLCBDaXBoZXJOYW1lW2NzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGddKSk7Ci0JfQotfQotCi1pbnQgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MoCi0JSU4gIFJUTVBfQURBUFRFUiAqcEFkKQotewotICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKLSAgICBjaGFyIGN1c3RvbVtJV19DVVNUT01fTUFYXSA9IHswfTsKLQotICAgIGlmIChwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA8PSBJV19DVVNUT01fTUFYKQotICAgIHsKLSAgICAgICAgd3JxdS5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuOwotICAgICAgICBtZW1jcHkoY3VzdG9tLCBwQWQtPlN0YUNmZy5SZXFWYXJJRXMsIHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKTsKLSAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZBU1NPQ1JFUUlFLCAmd3JxdSwgY3VzdG9tKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA+IE1BWF9DVVNUT01fTEVOXG4iKSk7CisJaWYgKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuIDw9IElXX0NVU1RPTV9NQVgpIHsKKwkJTmRpc01vdmVNZW1vcnkoY3VzdG9tLCBwQWQtPlN0YUNmZy5SZXFWYXJJRXMsCisJCQkgICAgICAgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4pOworCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZBU1NPQ1JFUUlFLCAtMSwgTlVMTCwgY3VzdG9tLAorCQkJCQlwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbik7CisJfSBlbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgicEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gPiBNQVhfQ1VTVE9NX0xFTlxuIikpOwogCiAJcmV0dXJuIDA7CiAKIH0KIAotI2lmZGVmIFJUMjg3MAotQk9PTEVBTiBTdGFBZGRNYWNUYWJsZUVudHJ5KAotCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAotCUlOICBVQ0hBUgkJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAotCUlOICBIVF9DQVBBQklMSVRZX0lFCSpwSHRDYXBhYmlsaXR5LAotCUlOICBVQ0hBUgkJCQlIdENhcGFiaWxpdHlMZW4sCi0JSU4gIFVTSE9SVCAgICAgICAgCQlDYXBhYmlsaXR5SW5mbykKK0JPT0xFQU4gU3RhQWRkTWFjVGFibGVFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkJICAgIHU4IE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMsCisJCQkgICAgc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUgKiBwSHRDYXBhYmlsaXR5LAorCQkJICAgIHU4IEh0Q2FwYWJpbGl0eUxlbiwKKwkJCSAgICBzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgKiBwQWRkSHRJbmZvLAorCQkJICAgIHU4IEFkZEh0SW5mb0xlbiwgdTE2IENhcGFiaWxpdHlJbmZvKQogewotCVVDSEFSICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisJdTggTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CiAKIAlpZiAoQURIT0NfT04ocEFkKSkKIAkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOwogCi0Jc3dpdGNoIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzKQotICAgIHsKLSAgICAgICAgY2FzZSAxMDg6IE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzU0OyAgIGJyZWFrOwotICAgICAgICBjYXNlIDk2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNDg7ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8zNjsgICBicmVhazsKLSAgICAgICAgY2FzZSA0ODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI0OyAgIGJyZWFrOwotICAgICAgICBjYXNlIDM2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTg7ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMjsgICBicmVhazsKLSAgICAgICAgY2FzZSAxODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzk7ICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNjsgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKLSAgICAgICAgY2FzZSAxMTogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzVfNTsgIGJyZWFrOwotICAgICAgICBjYXNlIDQ6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjsgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xOyAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOwotICAgIH0KKwlzd2l0Y2ggKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMpIHsKKwljYXNlIDEwODoKKwkJTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNTQ7CisJCWJyZWFrOworCWNhc2UgOTY6CisJCU1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzQ4OworCQlicmVhazsKKwljYXNlIDcyOgorCQlNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8zNjsKKwkJYnJlYWs7CisJY2FzZSA0ODoKKwkJTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjQ7CisJCWJyZWFrOworCWNhc2UgMzY6CisJCU1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE4OworCQlicmVhazsKKwljYXNlIDI0OgorCQlNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMjsKKwkJYnJlYWs7CisJY2FzZSAxODoKKwkJTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfOTsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNjsKKwkJYnJlYWs7CisJY2FzZSAyMjoKKwkJTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisJCWJyZWFrOworCWNhc2UgMTE6CisJCU1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzVfNTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yOworCQlicmVhazsKKwljYXNlIDI6CisJCU1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCU1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOworCQlicmVhazsKKwl9CiAKLSAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykgJiYgKE1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykKKwkgICAgJiYgKE1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkpCisJCXJldHVybiBGQUxTRTsKIAotCS8vIDExbiBvbmx5Ci0JaWYgKCgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSYmIChIdENhcGFiaWxpdHlMZW4gPT0gMCkpCisJLyogMTFuIG9ubHkgKi8KKwlpZiAoKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fMl80RykKKwkgICAgIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKQorCSAgICAmJiAoSHRDYXBhYmlsaXR5TGVuID09IDApKQogCQlyZXR1cm4gRkFMU0U7CiAKIAlpZiAoIXBFbnRyeSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gRkFMU0U7CiAKIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCWlmIChwRW50cnkpCi0JeworCWlmIChwRW50cnkpIHsKIAkJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwogCQlpZiAoKE1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkgfHwKLQkJCShwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpKQotCQl7CisJCSAgICAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKSkgewogCQkJcEVudHJ5LT5SYXRlTGVuID0gNDsKIAkJCWlmIChNYXhTdXBwb3J0ZWRSYXRlID49IFJBVEVfRklSU1RfT0ZETV9SQVRFKQogCQkJCU1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOwotCQl9Ci0JCWVsc2UKKwkJfSBlbHNlCiAJCQlwRW50cnktPlJhdGVMZW4gPSAxMjsKIAogCQlwRW50cnktPk1heEhUUGh5TW9kZS53b3JkID0gMDsKIAkJcEVudHJ5LT5NaW5IVFBoeU1vZGUud29yZCA9IDA7CiAJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSAwOwogCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBNYXhTdXBwb3J0ZWRSYXRlOwotCQlpZiAocEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpCi0JCXsKKwkJaWYgKHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKSB7CiAJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPQorCQkJICAgIHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKIAkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9CisJCQkgICAgcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwogCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwogCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPQorCQkJICAgIE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CiAJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9CisJCQkgICAgT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKIAkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0KKwkJCSAgICBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOwogCQl9CiAJCXBFbnRyeS0+Q2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbzsKLQkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSk7Ci0JCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1BJR0dZQkFDS19DQVBBQkxFKTsKKwkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKHBFbnRyeSwKKwkJCQkJIGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUpOworCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcocEVudHJ5LAorCQkJCQkgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUpOwogCX0KIAotCS8vIElmIHRoaXMgRW50cnkgc3VwcG9ydHMgODAyLjExbiwgdXBncmFkZSB0byBIVCByYXRlLgotCWlmICgoSHRDYXBhYmlsaXR5TGVuICE9IDApICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQotCXsKLQkJVUNIQVIJaiwgYml0bWFzazsgLy9rLGJpdG1hc2s7Ci0JCUNIQVIgICAgaTsKKwlOZGlzWmVyb01lbW9yeSgmcEVudHJ5LT5IVENhcGFiaWxpdHksIHNpemVvZihwRW50cnktPkhUQ2FwYWJpbGl0eSkpOworCS8qIElmIHRoaXMgRW50cnkgc3VwcG9ydHMgODAyLjExbiwgdXBncmFkZSB0byBIVCByYXRlLiAqLworCWlmICgoSHRDYXBhYmlsaXR5TGVuICE9IDApCisJICAgICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKSB7CisJCXU4IGosIGJpdG1hc2s7CS8qayxiaXRtYXNrOyAqLworCQljaGFyIGk7CiAKIAkJaWYgKEFESE9DX09OKHBBZCkpCi0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOwotCQlpZiAoKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCi0JCXsKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LAorCQkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOworCQlpZiAoKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5HRikKKwkJICAgICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKSB7CiAJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKIAkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YgPSBUUlVFOwogCQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gMTsKIAkJfQogCi0JCWlmICgocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpKQotCQl7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVz0gQldfNDA7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCkpOwotCQl9Ci0JCWVsc2UKLQkJeworCQlpZiAoKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGgpICYmCisJCSAgICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCkgJiYKKwkJICAgICgocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisJCSAgICAgfHwgKChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCSAmJiAocEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0KKwkJCSAgICAgcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby4KKwkJCSAgICAgRXh0Q2hhbk9mZnNldCkpKSkgeworCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV180MDsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPQorCQkJICAgICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LgorCQkJICAgICAgU2hvcnRHSWZvcjQwKSAmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uCisJCQkJCSAgICAgICBTaG9ydEdJZm9yNDApKTsKKwkJfSBlbHNlIHsKIAkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCkpOworCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9CisJCQkgICAgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuCisJCQkgICAgICBTaG9ydEdJZm9yMjApICYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby4KKwkJCQkJICAgICAgIFNob3J0R0lmb3IyMCkpOwogCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb24yME9ubHkgPSBUUlVFOwogCQl9CiAKLQkJLy8gMyozCi0JCWlmIChwQWQtPk1BQ1ZlcnNpb24gPj0gUkFMSU5LXzI4ODNfVkVSU0lPTiAmJiBwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMzA3MF9WRVJTSU9OKQotCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuVHhCRiA9IHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5UeEJGOworCQkvKiAzKjMgKi8KKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4M19WRVJTSU9OCisJCSAgICAmJiBwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMzA3MF9WRVJTSU9OKQorCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuVHhCRiA9CisJCQkgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlR4QkY7CiAKLQkJLy8gZmluZCBtYXggZml4ZWQgcmF0ZQotCQlmb3IgKGk9MjM7IGk+PTA7IGktLSkgLy8gMyozCisJCS8qIGZpbmQgbWF4IGZpeGVkIHJhdGUgKi8KKwkJZm9yIChpID0gMjM7IGkgPj0gMDsgaS0tKQkvKiAzKjMgKi8KIAkJewotCQkJaiA9IGkvODsKLQkJCWJpdG1hc2sgPSAoMTw8KGktKGoqOCkpKTsKLQkJCWlmICgocEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbal0gJiBiaXRtYXNrKSAmJiAocEh0Q2FwYWJpbGl0eS0+TUNTU2V0W2pdICYgYml0bWFzaykpCi0JCQl7CisJCQlqID0gaSAvIDg7CisJCQliaXRtYXNrID0gKDEgPDwgKGkgLSAoaiAqIDgpKSk7CisJCQlpZiAoKHBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0W2pdICYgYml0bWFzaykKKwkJCSAgICAmJiAocEh0Q2FwYWJpbGl0eS0+TUNTU2V0W2pdICYgYml0bWFzaykpIHsKIAkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBpOwogCQkJCWJyZWFrOwogCQkJfQotCQkJaWYgKGk9PTApCisJCQlpZiAoaSA9PSAwKQogCQkJCWJyZWFrOwogCQl9CiAKLQotCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pCi0JCXsKLQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9PSAzMikKLQkJCXsKLQkJCQkvLyBGaXggTUNTIGFzIEhUIER1cGxpY2F0ZWQgTW9kZQorCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pIHsKKwkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9PSAzMikgeworCQkJCS8qIEZpeCBNQ1MgYXMgSFQgRHVwbGljYXRlZCBNb2RlICovCiAJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSAxOwogCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOwogCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAwOwogCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAwOwogCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IDMyOwotCQkJfQotCQkJZWxzZSBpZiAocEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID4gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUykKLQkJCXsKLQkJCQkvLyBTVEEgc3VwcG9ydHMgZml4ZWQgTUNTCi0JCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCX0gZWxzZSBpZiAocEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID4KKwkJCQkgICBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKSB7CisJCQkJLyogU1RBIHN1cHBvcnRzIGZpeGVkIE1DUyAqLworCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9CisJCQkJICAgIHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CiAJCQl9CiAJCX0KIAotCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5SeFNUQkMgJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykpOworCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0KKwkJICAgIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uCisJCSAgICAgUnhTVEJDICYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpKTsKIAkJcEVudHJ5LT5NcGR1RGVuc2l0eSA9IHBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKLQkJcEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPSBwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yOwotCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHM7Ci0JCXBFbnRyeS0+QU1zZHVTaXplID0gKFVDSEFSKXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5BTXNkdVNpemU7CisJCXBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID0KKwkJICAgIHBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3I7CisJCXBFbnRyeS0+TW1wc01vZGUgPSAodTgpcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLk1pbW9QczsKKwkJcEVudHJ5LT5BTXNkdVNpemUgPSAodTgpcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkFNc2R1U2l6ZTsKIAkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CiAKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSAmJiAocEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9PSBGQUxTRSkpCi0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEKTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZQorCQkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPT0gRkFMU0UpKQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksCisJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpOwogCQlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKTsKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LAorCQkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7CiAJCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQotCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOworCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksCisJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKIAkJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5UeFNUQkMpCi0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOworCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksCisJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7CiAJCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDKQotCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LAorCQkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUpOwogCQlpZiAocEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlBsdXNIVEMpCi0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUpOwotCQlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CisJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwKKwkJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX0hUQ19DQVBBQkxFKTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcKKwkJICAgICYmIHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksCisJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CiAJCWlmIChwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uTUNTRmVlZGJhY2sgPT0gMHgwMykKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFKTsKLQl9Ci0JZWxzZQotCXsKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LAorCQkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfTUNTRkVFREJBQ0tfQ0FQQUJMRSk7CisJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgcEh0Q2FwYWJpbGl0eSwKKwkJCSAgICAgICBIdENhcGFiaWxpdHlMZW4pOworCX0gZWxzZSB7CiAJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uSXNMZWdhY3kgPSBUUlVFOwogCX0KIAotCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgcEh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLQogCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOwogCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKIAotCS8vIFNldCBhc2ljIGF1dG8gZmFsbCBiYWNrCi0JaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IFRSVUUpCi0JewotCQlQVUNIQVIJCQkJCXBUYWJsZTsKLQkJVUNIQVIJCQkJCVRhYmxlU2l6ZSA9IDA7CisJLyogU2V0IGFzaWMgYXV0byBmYWxsIGJhY2sgKi8KKwlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkgeworCQl1OCAqcFRhYmxlOworCQl1OCBUYWJsZVNpemUgPSAwOwogCi0JCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKKwkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLAorCQkJCSAgICAgICZwRW50cnktPkN1cnJUeFJhdGVJbmRleCk7CiAJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOwotCX0KLQllbHNlCi0JewotCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREU7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJfSBlbHNlIHsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOwogCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CiAKLQkJLy8gSWYgdGhlIGxlZ2FjeSBtb2RlIGlzIHNldCwgb3ZlcndyaXRlIHRoZSB0cmFuc21pdCBzZXR0aW5nIG9mIHRoaXMgZW50cnkuCi0JCVJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUsIHBFbnRyeSk7CisJCS8qIElmIHRoZSBsZWdhY3kgbW9kZSBpcyBzZXQsIG92ZXJ3cml0ZSB0aGUgdHJhbnNtaXQgc2V0dGluZyBvZiB0aGlzIGVudHJ5LiAqLworCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKCh1OClwQWQtPlN0YUNmZy4KKwkJCQkJICBEZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLgorCQkJCQkgIEZpeGVkVHhNb2RlLCBwRW50cnkpOwogCX0KIAogCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKQEAgLTE3MTUsMTUgKzE1OTIsMTQgQEAKIAogCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CiAKLSAgICB7Ci0gICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKLSAgICAgICAgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MocEFkKTsKKwl7CisJCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwkJd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MocEFkKTsKIAotICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOwotICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisJCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKwkJbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisJCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKIAotICAgIH0KKwl9CiAJcmV0dXJuIFRSVUU7CiB9Ci0jZW5kaWYgLyogUlQyODcwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoLmMKaW5kZXggZDg0MTRlYS4uNDA0YmQyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXV0aC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGguYwpAQCAtNTUsMjcgKzU1LDM1IEBACiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwogCi12b2lkIEF1dGhTdGF0ZU1hY2hpbmVJbml0KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFNUQVRFX01BQ0hJTkUgKlNtLAotICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3ZvaWQgQXV0aFN0YXRlTWFjaGluZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICBzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSAqU20sIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKIHsKLSAgICBTdGF0ZU1hY2hpbmVJbml0KFNtLCBUcmFucywgTUFYX0FVVEhfU1RBVEUsIE1BWF9BVVRIX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBBVVRIX1JFUV9JRExFLCBBVVRIX01BQ0hJTkVfQkFTRSk7CisJU3RhdGVNYWNoaW5lSW5pdChTbSwgVHJhbnMsIE1BWF9BVVRIX1NUQVRFLCBNQVhfQVVUSF9NU0csCisJCQkgKFNUQVRFX01BQ0hJTkVfRlVOQykgRHJvcCwgQVVUSF9SRVFfSURMRSwKKwkJCSBBVVRIX01BQ0hJTkVfQkFTRSk7CiAKLSAgICAvLyB0aGUgZmlyc3QgY29sdW1uCi0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JFUV9JRExFLCBNVDJfTUxNRV9BVVRIX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lQXV0aFJlcUFjdGlvbik7CisJLyogdGhlIGZpcnN0IGNvbHVtbiAqLworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9SRVFfSURMRSwgTVQyX01MTUVfQVVUSF9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBNbG1lQXV0aFJlcUFjdGlvbik7CiAKLSAgICAvLyB0aGUgc2Vjb25kIGNvbHVtbgotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTIsIE1UMl9NTE1FX0FVVEhfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5BdXRoKTsKLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVEyLCBNVDJfUEVFUl9BVVRIX0VWRU4sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24pOwotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTIsIE1UMl9BVVRIX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpQXV0aFRpbWVvdXRBY3Rpb24pOworCS8qIHRoZSBzZWNvbmQgY29sdW1uICovCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX01MTUVfQVVUSF9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBJbnZhbGlkU3RhdGVXaGVuQXV0aCk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX1BFRVJfQVVUSF9FVkVOLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTIsIE1UMl9BVVRIX1RJTUVPVVQsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBBdXRoVGltZW91dEFjdGlvbik7CiAKLSAgICAvLyB0aGUgdGhpcmQgY29sdW1uCi0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX01MTUVfQVVUSF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkF1dGgpOwotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTQsIE1UMl9QRUVSX0FVVEhfRVZFTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbik7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX0FVVEhfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylBdXRoVGltZW91dEFjdGlvbik7CisJLyogdGhlIHRoaXJkIGNvbHVtbiAqLworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTQsIE1UMl9NTE1FX0FVVEhfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgSW52YWxpZFN0YXRlV2hlbkF1dGgpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTQsIE1UMl9QRUVSX0FVVEhfRVZFTiwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVE0LCBNVDJfQVVUSF9USU1FT1VULAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgQXV0aFRpbWVvdXRBY3Rpb24pOwogCi0JUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQXV0aFRpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsCisJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTihBdXRoVGltZW91dCksIHBBZCwgRkFMU0UpOwogfQogCiAvKgpAQCAtODcsMzEgKzk1LDI4IEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEF1dGhUaW1lb3V0KAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3ZvaWQgQXV0aFRpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpCiB7Ci0gICAgUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OwogCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBVVRIIC0gQXV0aFRpbWVvdXRcbiIpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gQXV0aFRpbWVvdXRcbiIpKTsKIAotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJLyogRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuICovCisJLyogVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0ICovCisJaWYgKFJUTVBfVEVTVF9GTEFHCisJICAgIChwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCiAJCXJldHVybjsKIAotCS8vIHNlbmQgYSBkZS1hdXRoIHRvIHJlc2V0IEFQJ3Mgc3RhdGUgbWFjaGluZSAoUGF0Y2ggQVAtRGlyNjM1KQorCS8qIHNlbmQgYSBkZS1hdXRoIHRvIHJlc2V0IEFQJ3Mgc3RhdGUgbWFjaGluZSAoUGF0Y2ggQVAtRGlyNjM1KSAqLwogCWlmIChwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID09IEFVVEhfV0FJVF9TRVEyKQogCQlDbHMyZXJyQWN0aW9uKHBBZCwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKIAotCi0gICAgTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX1RJTUVPVVQsIDAsIE5VTEwpOwotICAgIFJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwlNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfVElNRU9VVCwgMCwgTlVMTCk7CisJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKIH0KIAotCiAvKgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgRGVzY3JpcHRpb246CkBAIC0xMjAsNjcgKzEyNSwxOSBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBNbG1lQXV0aFJlcUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIE1sbWVBdXRoUmVxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgQWRkcls2XTsKLSAgICBVU0hPUlQgICAgICAgICAgICAgQWxnLCBTZXEsIFN0YXR1czsKLSAgICBVTE9ORyAgICAgICAgICAgICAgVGltZW91dDsKLSAgICBIRUFERVJfODAyXzExICAgICAgQXV0aEhkcjsKLSAgICBCT09MRUFOICAgICAgICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0gICAgTkRJU19TVEFUVVMgICAgICAgIE5TdGF0dXM7Ci0gICAgUFVDSEFSICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotICAgIFVMT05HICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJaWYgKEFVVEhfUmVxU2VuZAorCSAgICAocEFkLCBFbGVtLCAmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgIkFVVEgiLCAxLCBOVUxMLCAwKSkKKwkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfV0FJVF9TRVEyOworCWVsc2UgeworCQl1MTYgU3RhdHVzOwogCi0JLy8gQmxvY2sgYWxsIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kCi0JaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID09IFRSVUUpCi0JewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gQmxvY2sgQXV0aCByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKLSAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgIFN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7Ci0gICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworCQlwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwKKwkJCSAgICAmU3RhdHVzKTsKIAl9Ci0gICAgZWxzZSBpZihNbG1lQXV0aFJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyLCAmVGltZW91dCwgJkFsZykpCi0gICAgewotICAgICAgICAvLyByZXNldCB0aW1lcgotICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0gICAgICAgIENPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBBZGRyKTsKLSAgICAgICAgcEFkLT5NbG1lQXV4LkFsZyAgPSBBbGc7Ci0gICAgICAgIFNlcSA9IDE7Ci0gICAgICAgIFN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKLQotICAgICAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotICAgICAgICBpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBNbG1lQXV0aFJlcUFjdGlvbihBbGc6JWQpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWRcbiIsIEFsZykpOwotICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgICAgICBTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7Ci0gICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBTZW5kIEFVVEggcmVxdWVzdCBzZXEjMSAoQWxnPSVkKS4uLlxuIiwgQWxnKSk7Ci0gICAgICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwgU1VCVFlQRV9BVVRILCAwLCBBZGRyLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotICAgICAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkF1dGhIZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmQWxnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJlNlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLSAgICAgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0gICAgCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0KLSAgICAgICAgUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCBUaW1lb3V0KTsKLSAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfV0FJVF9TRVEyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEQkdQUklOVF9FUlIoKCJBVVRIIC0gTWxtZUF1dGhSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkXG4iKSk7Ci0gICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOwotICAgICAgICBTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOwotICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKLSAgICB9CiB9CiAKIC8qCkBAIC0xOTEsMTAyICsxNDgsMTMwIEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotICAgIFVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLSAgICBVU0hPUlQgICAgICAgIFNlcSwgU3RhdHVzLCBSZW1vdGVTdGF0dXMsIEFsZzsKLSAgICBVQ0hBUiAgICAgICAgIENobGdUZXh0W0NJUEhFUl9URVhUX0xFTl07Ci0gICAgVUNIQVIgICAgICAgICBDeXBlckNobGdUZXh0W0NJUEhFUl9URVhUX0xFTiArIDggKyA4XTsKLSAgICBVQ0hBUiAgICAgICAgIEVsZW1lbnRbMl07Ci0gICAgSEVBREVSXzgwMl8xMSBBdXRoSGRyOwotICAgIEJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0gICAgUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLSAgICBORElTX1NUQVRVUyAgIE5TdGF0dXM7Ci0gICAgVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0gICAgVVNIT1JUICAgICAgICBTdGF0dXMyOworCXU4IEFkZHIyW01BQ19BRERSX0xFTl07CisJdTE2IFNlcSwgU3RhdHVzLCBSZW1vdGVTdGF0dXMsIEFsZzsKKwl1OCBDaGxnVGV4dFtDSVBIRVJfVEVYVF9MRU5dOworCXU4IEN5cGVyQ2hsZ1RleHRbQ0lQSEVSX1RFWFRfTEVOICsgOCArIDhdOworCXU4IEVsZW1lbnRbMl07CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgQXV0aEhkcjsKKwlCT09MRUFOIFRpbWVyQ2FuY2VsbGVkOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwlpbnQgTlN0YXR1czsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuID0gMDsKKwl1MTYgU3RhdHVzMjsKIAotICAgIGlmIChQZWVyQXV0aFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkFsZywgJlNlcSwgJlN0YXR1cywgQ2hsZ1RleHQpKQotICAgIHsKLSAgICAgICAgaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQWRkcjIpICYmIFNlcSA9PSAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUmVjZWl2ZSBBVVRIX1JTUCBzZXEjMiB0byBtZSAoQWxnPSVkLCBTdGF0dXM9JWQpXG4iLCBBbGcsIFN0YXR1cykpOwotICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCWlmIChQZWVyQXV0aFNhbml0eQorCSAgICAocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZBbGcsICZTZXEsICZTdGF0dXMsCisJICAgICAoY2hhciAqKUNobGdUZXh0KSkgeworCQlpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBBZGRyMikgJiYgU2VxID09IDIpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkFVVEggLSBSZWNlaXZlIEFVVEhfUlNQIHNlcSMyIHRvIG1lIChBbGc9JWQsIFN0YXR1cz0lZClcbiIsCisJCQkJICBBbGcsIFN0YXR1cykpOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLAorCQkJCQkmVGltZXJDYW5jZWxsZWQpOwogCi0gICAgICAgICAgICBpZiAoU3RhdHVzID09IE1MTUVfU1VDQ0VTUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBBdXRoZW50aWNhdGlvbiBNb2RlICJMRUFQIiBoYXMgYWxsb3cgZm9yIENDWCAxLlgKLSAgICAgICAgICAgICAgICBpZiAoKHBBZC0+TWxtZUF1eC5BbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLQkJCQkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKLSAgICAgICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIDIuIHNoYXJlZCBrZXksIG5lZWQgdG8gYmUgY2hhbGxlbmdlZAotICAgICAgICAgICAgICAgICAgICBTZXErKzsKLSAgICAgICAgICAgICAgICAgICAgUmVtb3RlU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCQkJaWYgKFN0YXR1cyA9PSBNTE1FX1NVQ0NFU1MpIHsKKwkJCQkvKiBBdXRoZW50aWNhdGlvbiBNb2RlICJMRUFQIiBoYXMgYWxsb3cgZm9yIENDWCAxLlggKi8KKwkJCQlpZiAocEFkLT5NbG1lQXV4LkFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKSB7CisJCQkJCXBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPQorCQkJCQkgICAgQVVUSF9SRVFfSURMRTsKKwkJCQkJTWxtZUVucXVldWUocEFkLAorCQkJCQkJICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQkJICAgIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIDIuIHNoYXJlZCBrZXksIG5lZWQgdG8gYmUgY2hhbGxlbmdlZCAqLworCQkJCQlTZXErKzsKKwkJCQkJUmVtb3RlU3RhdHVzID0gTUxNRV9TVUNDRVNTOwogCi0JCQkJCS8vIEdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0gICAgICAgICAgICAgICAgICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzMiA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQorCQkJCQkvKiBHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCQkJCQlOU3RhdHVzID0KKwkJCQkJICAgIE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsCisJCQkJCQkJICAgICAgICZwT3V0QnVmZmVyKTsKKwkJCQkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkJICgiQVVUSCAtIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKKwkJCQkJCXBBZC0+TWxtZS5BdXRoTWFjaGluZS4KKwkJCQkJCSAgICBDdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworCQkJCQkJU3RhdHVzMiA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKwkJCQkJCU1sbWVFbnF1ZXVlKHBBZCwKKwkJCQkJCQkgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCQkJICAgIE1UMl9BVVRIX0NPTkYsIDIsCisJCQkJCQkJICAgICZTdGF0dXMyKTsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQogCi0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBTZW5kIEFVVEggcmVxdWVzdCBzZXEjMy4uLlxuIikpOwotICAgICAgICAgICAgICAgICAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkF1dGhIZHIsIFNVQlRZUEVfQVVUSCwgMCwgQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7Ci0gICAgICAgICAgICAgICAgICAgIEF1dGhIZHIuRkMuV2VwID0gMTsKLSAgICAgICAgICAgICAgICAgICAgLy8gRW5jcnlwdCBjaGFsbGVuZ2UgdGV4dCAmIGF1dGggaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAgICAgUlRNUEluaXRXZXBFbmdpbmUoCi0gICAgICAgICAgICAgICAgICAgIAlwQWQsCi0gICAgICAgICAgICAgICAgICAgIAlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKLSAgICAgICAgICAgICAgICAgICAgCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKLSAgICAgICAgICAgICAgICAgICAgCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuLAotICAgICAgICAgICAgICAgICAgICAJQ3lwZXJDaGxnVGV4dCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiQVVUSCAtIFNlbmQgQVVUSCByZXF1ZXN0IHNlcSMzLi4uXG4iKSk7CisJCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwKKwkJCQkJCQkgU1VCVFlQRV9BVVRILCAwLCBBZGRyMiwKKwkJCQkJCQkgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKwkJCQkJQXV0aEhkci5GQy5XZXAgPSAxOworCQkJCQkvKiBFbmNyeXB0IGNoYWxsZW5nZSB0ZXh0ICYgYXV0aCBpbmZvcm1hdGlvbiAqLworCQkJCQlSVE1QSW5pdFdlcEVuZ2luZShwQWQsCisJCQkJCQkJICBwQWQtPgorCQkJCQkJCSAgU2hhcmVkS2V5W0JTUzBdW3BBZC0+CisJCQkJCQkJCQkgIFN0YUNmZy4KKwkJCQkJCQkJCSAgRGVmYXVsdEtleUlkXS4KKwkJCQkJCQkgIEtleSwKKwkJCQkJCQkgIHBBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgRGVmYXVsdEtleUlkLAorCQkJCQkJCSAgcEFkLT4KKwkJCQkJCQkgIFNoYXJlZEtleVtCU1MwXVtwQWQtPgorCQkJCQkJCQkJICBTdGFDZmcuCisJCQkJCQkJCQkgIERlZmF1bHRLZXlJZF0uCisJCQkJCQkJICBLZXlMZW4sCisJCQkJCQkJICBDeXBlckNobGdUZXh0KTsKIAotCQkJCQlBbGcgPSBjcHUybGUxNigqKFVTSE9SVCAqKSZBbGcpOwotCQkJCQlTZXEgPSBjcHUybGUxNigqKFVTSE9SVCAqKSZTZXEpOwotCQkJCQlSZW1vdGVTdGF0dXM9IGNwdTJsZTE2KCooVVNIT1JUICopJlJlbW90ZVN0YXR1cyk7CisJCQkJCUFsZyA9IGNwdTJsZTE2KCoodTE2ICopICYgQWxnKTsKKwkJCQkJU2VxID0gY3B1MmxlMTYoKih1MTYgKikgJiBTZXEpOworCQkJCQlSZW1vdGVTdGF0dXMgPQorCQkJCQkgICAgY3B1MmxlMTYoKih1MTYgKikgJgorCQkJCQkJICAgICBSZW1vdGVTdGF0dXMpOwogCi0JCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIChQVUNIQVIpICZBbGcsIEN5cGVyQ2hsZ1RleHQgKyA0LCAyKTsKLQkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgKFBVQ0hBUikgJlNlcSwgQ3lwZXJDaGxnVGV4dCArIDYsIDIpOwotCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCAoUFVDSEFSKSAmUmVtb3RlU3RhdHVzLCBDeXBlckNobGdUZXh0ICsgOCwgMik7CisJCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsICh1OCAqKSYgQWxnLAorCQkJCQkJCUN5cGVyQ2hsZ1RleHQgKyA0LCAyKTsKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgKHU4ICopJiBTZXEsCisJCQkJCQkJQ3lwZXJDaGxnVGV4dCArIDYsIDIpOworCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLAorCQkJCQkJCSh1OCAqKSYgUmVtb3RlU3RhdHVzLAorCQkJCQkJCUN5cGVyQ2hsZ1RleHQgKyA4LCAyKTsKIAkJCQkJRWxlbWVudFswXSA9IDE2OwogCQkJCQlFbGVtZW50WzFdID0gMTI4OwotCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCBFbGVtZW50LCBDeXBlckNobGdUZXh0ICsgMTAsIDIpOwotCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCBDaGxnVGV4dCwgQ3lwZXJDaGxnVGV4dCArIDEyLCAxMjgpOworCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCBFbGVtZW50LAorCQkJCQkJCUN5cGVyQ2hsZ1RleHQgKyAxMCwgMik7CisJCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIENobGdUZXh0LAorCQkJCQkJCUN5cGVyQ2hsZ1RleHQgKyAxMiwKKwkJCQkJCQkxMjgpOwogCQkJCQlSVE1QU2V0SUNWKHBBZCwgQ3lwZXJDaGxnVGV4dCArIDE0MCk7Ci0gICAgICAgICAgICAgICAgICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZBdXRoSGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfVEVYVF9MRU4gKyAxNiwgICAgIEN5cGVyQ2hsZ1RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLSAgICAgICAgICAgICAgICAgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0gICAgICAgICAgICAgICAgCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwKKwkJCQkJCQkgIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSksCisJCQkJCQkJICAmQXV0aEhkciwKKwkJCQkJCQkgIENJUEhFUl9URVhUX0xFTiArIDE2LAorCQkJCQkJCSAgQ3lwZXJDaGxnVGV4dCwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLAorCQkJCQkJCSAgRnJhbWVMZW4pOworCQkJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogCi0gICAgICAgICAgICAgICAgICAgIFJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgQVVUSF9USU1FT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfV0FJVF9TRVE0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoRmFpbFJlYXNvbiA9IFN0YXR1czsKLSAgICAgICAgICAgICAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkF1dGhGYWlsU3RhLCBBZGRyMik7Ci0gICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFBlZXJBdXRoU2FuaXR5KCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKLSAgICB9CisJCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwKKwkJCQkJCSAgICAgQVVUSF9USU1FT1VUKTsKKwkJCQkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9CisJCQkJCSAgICBBVVRIX1dBSVRfU0VRNDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXBBZC0+U3RhQ2ZnLkF1dGhGYWlsUmVhc29uID0gU3RhdHVzOworCQkJCUNPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQXV0aEZhaWxTdGEsIEFkZHIyKTsKKwkJCQlwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQkgICAgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFVVEggLSBQZWVyQXV0aFNhbml0eSgpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisJfQogfQogCiAvKgpAQCAtMjk3LDM2ICsyODIsMzUgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0gICAgVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotICAgIFVTSE9SVCAgICAgICAgQWxnLCBTZXEsIFN0YXR1czsKLSAgICBDSEFSICAgICAgICAgIENobGdUZXh0W0NJUEhFUl9URVhUX0xFTl07Ci0gICAgQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKKwl1OCBBZGRyMltNQUNfQUREUl9MRU5dOworCXUxNiBBbGcsIFNlcSwgU3RhdHVzOworCWNoYXIgQ2hsZ1RleHRbQ0lQSEVSX1RFWFRfTEVOXTsKKwlCT09MRUFOIFRpbWVyQ2FuY2VsbGVkOwogCi0gICAgaWYoUGVlckF1dGhTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZBbGcsICZTZXEsICZTdGF0dXMsIENobGdUZXh0KSkKLSAgICB7Ci0gICAgICAgIGlmKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQWRkcjIpICYmIFNlcSA9PSA0KQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUmVjZWl2ZSBBVVRIX1JTUCBzZXEjNCB0byBtZVxuIikpOwotICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCWlmIChQZWVyQXV0aFNhbml0eQorCSAgICAocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZBbGcsICZTZXEsICZTdGF0dXMsCisJICAgICBDaGxnVGV4dCkpIHsKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQWRkcjIpICYmIFNlcSA9PSA0KSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJBVVRIIC0gUmVjZWl2ZSBBVVRIX1JTUCBzZXEjNCB0byBtZVxuIikpOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLAorCQkJCQkmVGltZXJDYW5jZWxsZWQpOwogCi0gICAgICAgICAgICBpZiAoU3RhdHVzICE9IE1MTUVfU1VDQ0VTUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoRmFpbFJlYXNvbiA9IFN0YXR1czsKLSAgICAgICAgICAgICAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkF1dGhGYWlsU3RhLCBBZGRyMik7Ci0gICAgICAgICAgICB9CisJCQlpZiAoU3RhdHVzICE9IE1MTUVfU1VDQ0VTUykgeworCQkJCXBBZC0+U3RhQ2ZnLkF1dGhGYWlsUmVhc29uID0gU3RhdHVzOworCQkJCUNPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQXV0aEZhaWxTdGEsIEFkZHIyKTsKKwkJCX0KIAotICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOwotICAgIH0KKwkJCXBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwKKwkJCQkgICAgMiwgJlN0YXR1cyk7CisJCX0KKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFVVEggLSBQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisJfQogfQogCiAvKgpAQCAtMzM3LDQ3ICszMjEsNDkgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZURlYXV0aFJlcUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIE1sbWVEZWF1dGhSZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotICAgIE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgKnBJbmZvOwotICAgIEhFQURFUl84MDJfMTEgRGVhdXRoSGRyOwotICAgIFBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0gICAgTkRJU19TVEFUVVMgICBOU3RhdHVzOwotICAgIFVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOwotICAgIFVTSE9SVCAgICAgICAgU3RhdHVzOworCXN0cnVjdCBydF9tbG1lX2RlYXV0aF9yZXEgKnBJbmZvOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIERlYXV0aEhkcjsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbiA9IDA7CisJdTE2IFN0YXR1czsKIAotICAgIHBJbmZvID0gKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgKilFbGVtLT5Nc2c7CisJcEluZm8gPSAoc3RydWN0IHJ0X21sbWVfZGVhdXRoX3JlcSAqKUVsZW0tPk1zZzsKIAotICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0gICAgaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBNbG1lRGVhdXRoUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKLSAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgIFN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKLSAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RFQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFVVEggLSBNbG1lRGVhdXRoUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKKwkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RFQVVUSF9DT05GLCAyLAorCQkJICAgICZTdGF0dXMpOworCQlyZXR1cm47CisJfQogCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFNlbmQgREUtQVVUSCByZXF1ZXN0IChSZWFzb249JWQpLi4uXG4iLCBwSW5mby0+UmVhc29uKSk7Ci0gICAgTWd0TWFjSGVhZGVySW5pdChwQWQsICZEZWF1dGhIZHIsIFNVQlRZUEVfREVBVVRILCAwLCBwSW5mby0+QWRkciwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKLSAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwmRGVhdXRoSGRyLAotICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmcEluZm8tPlJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0gICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFVVEggLSBTZW5kIERFLUFVVEggcmVxdWVzdCAoUmVhc29uPSVkKS4uLlxuIiwKKwkJICBwSW5mby0+UmVhc29uKSk7CisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZEZWF1dGhIZHIsIFNVQlRZUEVfREVBVVRILCAwLCBwSW5mby0+QWRkciwKKwkJCSBwQWQtPk1sbWVBdXguQnNzaWQpOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSwKKwkJCSAgJkRlYXV0aEhkciwgMiwgJnBJbmZvLT5SZWFzb24sIEVORF9PRl9BUkdTKTsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogCi0gICAgcEFkLT5TdGFDZmcuRGVhdXRoUmVhc29uID0gcEluZm8tPlJlYXNvbjsKLSAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRlYXV0aFN0YSwgcEluZm8tPkFkZHIpOwotICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOwotICAgIFN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKLSAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfREVBVVRIX0NPTkYsIDIsICZTdGF0dXMpOworCXBBZC0+U3RhQ2ZnLkRlYXV0aFJlYXNvbiA9IHBJbmZvLT5SZWFzb247CisJQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EZWF1dGhTdGEsIHBJbmZvLT5BZGRyKTsKKwlwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RFQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKIAotCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgZGVhdXRoZW50aWNhdGlvbgorCS8qIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgZGVhdXRoZW50aWNhdGlvbiAqLwogCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfREVBVVRIX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RFQVVUSF9FVkVOVF9GTEFHLAorCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwKKwkJCQkgICAgICBCU1MwLCAwKTsKIH0KIAogLyoKQEAgLTM4OCwxNSArMzc0LDEzIEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEF1dGhUaW1lb3V0QWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgQXV0aFRpbWVvdXRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotICAgIFVTSE9SVCBTdGF0dXM7Ci0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIEF1dGhUaW1lb3V0QWN0aW9uXG4iKSk7Ci0gICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKLSAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKwl1MTYgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBBdXRoVGltZW91dEFjdGlvblxuIikpOworCXBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworCVN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CiB9CiAKIC8qCkBAIC00MDcsMTUgKzM5MSwxNSBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBJbnZhbGlkU3RhdGVXaGVuQXV0aCgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIEludmFsaWRTdGF0ZVdoZW5BdXRoKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLSAgICBVU0hPUlQgU3RhdHVzOwotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBJbnZhbGlkU3RhdGVXaGVuQXV0aCAoc3RhdGU9JWxkKSwgcmVzZXQgQVVUSCBzdGF0ZSBtYWNoaW5lXG4iLCBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlKSk7Ci0gICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKLSAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKwl1MTYgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJBVVRIIC0gSW52YWxpZFN0YXRlV2hlbkF1dGggKHN0YXRlPSVsZCksIHJlc2V0IEFVVEggc3RhdGUgbWFjaGluZVxuIiwKKwkJICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKIH0KIAogLyoKQEAgLTQzMCwzMSArNDE0LDEwNCBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBDbHMyZXJyQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFBVQ0hBUiBwQWRkcikKK3ZvaWQgQ2xzMmVyckFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICpwQWRkcikKIHsKLSAgICBIRUFERVJfODAyXzExIERlYXV0aEhkcjsKLSAgICBQVUNIQVIgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotICAgIE5ESVNfU1RBVFVTICAgTlN0YXR1czsKLSAgICBVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKLSAgICBVU0hPUlQgICAgICAgIFJlYXNvbiA9IFJFQVNPTl9DTFMyRVJSOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIERlYXV0aEhkcjsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbiA9IDA7CisJdTE2IFJlYXNvbiA9IFJFQVNPTl9DTFMyRVJSOwogCi0gICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLSAgICBpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotICAgICAgICByZXR1cm47CisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybjsKIAotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBDbGFzcyAyIGVycm9yLCBTZW5kIERFQVVUSCBmcmFtZS4uLlxuIikpOwotICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmRGVhdXRoSGRyLCBTVUJUWVBFX0RFQVVUSCwgMCwgcEFkZHIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7Ci0gICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRlYXV0aEhkciwKLSAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJlJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0gICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFVVEggLSBDbGFzcyAyIGVycm9yLCBTZW5kIERFQVVUSCBmcmFtZS4uLlxuIikpOworCU1ndE1hY0hlYWRlckluaXQocEFkLCAmRGVhdXRoSGRyLCBTVUJUWVBFX0RFQVVUSCwgMCwgcEFkZHIsCisJCQkgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSksCisJCQkgICZEZWF1dGhIZHIsIDIsICZSZWFzb24sIEVORF9PRl9BUkdTKTsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogCi0gICAgcEFkLT5TdGFDZmcuRGVhdXRoUmVhc29uID0gUmVhc29uOwotICAgIENPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGVhdXRoU3RhLCBwQWRkcik7CisJcEFkLT5TdGFDZmcuRGVhdXRoUmVhc29uID0gUmVhc29uOworCUNPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGVhdXRoU3RhLCBwQWRkcik7CiB9CiAKK0JPT0xFQU4gQVVUSF9SZXFTZW5kKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpwRWxlbSwKKwkJICAgICBzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyICpwQXV0aFRpbWVyLAorCQkgICAgIGNoYXIgKnBTTU5hbWUsCisJCSAgICAgdTE2IFNlcU5vLAorCQkgICAgIHU4ICpwTmV3RWxlbWVudCwgdW5zaWduZWQgbG9uZyBFbGVtZW50TGVuKQoreworCXUxNiBBbGcsIFNlcSwgU3RhdHVzOworCXU4IEFkZHJbNl07CisJdW5zaWduZWQgbG9uZyBUaW1lb3V0OworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIEF1dGhIZHI7CisJQk9PTEVBTiBUaW1lckNhbmNlbGxlZDsKKwlpbnQgTlN0YXR1czsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbiA9IDAsIHRtcCA9IDA7CiAKKwkvKiBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QgKi8KKwlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiVzIC0gQmxvY2sgQXV0aCByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIsCisJCQkgIHBTTU5hbWUpKTsKKwkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsCisJCQkgICAgJlN0YXR1cyk7CisJfSBlbHNlCisJICAgIGlmIChNbG1lQXV0aFJlcVNhbml0eQorCQkocEFkLCBwRWxlbS0+TXNnLCBwRWxlbS0+TXNnTGVuLCBBZGRyLCAmVGltZW91dCwgJkFsZykpIHsKKwkJLyogcmVzZXQgdGltZXIgKi8KKwkJUlRNUENhbmNlbFRpbWVyKHBBdXRoVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIEFkZHIpOworCQlwQWQtPk1sbWVBdXguQWxnID0gQWxnOworCQlTZXEgPSBTZXFObzsKKwkJU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KKwkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiJXMgLSBNbG1lQXV0aFJlcUFjdGlvbihBbGc6JWQpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWRcbiIsCisJCQkJICBwU01OYW1lLCBBbGcpKTsKKwkJCXBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworCQkJU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwKKwkJCQkgICAgMiwgJlN0YXR1cyk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiVzIC0gU2VuZCBBVVRIIHJlcXVlc3Qgc2VxIzEgKEFsZz0lZCkuLi5cbiIsIHBTTU5hbWUsCisJCQkgIEFsZykpOworCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkF1dGhIZHIsIFNVQlRZUEVfQVVUSCwgMCwgQWRkciwKKwkJCQkgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgJkZyYW1lTGVuLCBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpLAorCQkJCSAgJkF1dGhIZHIsIDIsICZBbGcsIDIsICZTZXEsIDIsICZTdGF0dXMsCisJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkJaWYgKHBOZXdFbGVtZW50ICYmIEVsZW1lbnRMZW4pIHsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJICBFbGVtZW50TGVuLCBwTmV3RWxlbWVudCwgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwkJUlRNUFNldFRpbWVyKHBBdXRoVGltZXIsIFRpbWVvdXQpOworCQlyZXR1cm4gVFJVRTsKKwl9IGVsc2UgeworCQlEQkdQUklOVF9FUlIoKCIlcyAtIE1sbWVBdXRoUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZFxuIiwKKwkJCSAgICAgIHBTTU5hbWUpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXV0aF9yc3AuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGhfcnNwLmMKaW5kZXggY2M2MzliMS4uNWIwMThiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXV0aF9yc3AuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoX3JzcC5jCkBAIC00NywxOCArNDcsMjEgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgQXV0aFJzcFN0YXRlTWFjaGluZUluaXQoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gUFNUQVRFX01BQ0hJTkUgU20sCi0gICAgSU4gU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit2b2lkIEF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlNtLAorCQkJICAgICBJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKIHsKLSAgICBTdGF0ZU1hY2hpbmVJbml0KFNtLCBUcmFucywgTUFYX0FVVEhfUlNQX1NUQVRFLCBNQVhfQVVUSF9SU1BfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFVVEhfUlNQX0lETEUsIEFVVEhfUlNQX01BQ0hJTkVfQkFTRSk7CisJU3RhdGVNYWNoaW5lSW5pdChTbSwgVHJhbnMsIE1BWF9BVVRIX1JTUF9TVEFURSwgTUFYX0FVVEhfUlNQX01TRywKKwkJCSAoU1RBVEVfTUFDSElORV9GVU5DKSBEcm9wLCBBVVRIX1JTUF9JRExFLAorCQkJIEFVVEhfUlNQX01BQ0hJTkVfQkFTRSk7CiAKLSAgICAvLyBjb2x1bW4gMQotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9SU1BfSURMRSwgTVQyX1BFRVJfREVBVVRILCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEZWF1dGhBY3Rpb24pOworCS8qIGNvbHVtbiAxICovCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JTUF9JRExFLCBNVDJfUEVFUl9ERUFVVEgsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBQZWVyRGVhdXRoQWN0aW9uKTsKIAotICAgIC8vIGNvbHVtbiAyCi0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JTUF9XQUlUX0NIQUwsIE1UMl9QRUVSX0RFQVVUSCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGVhdXRoQWN0aW9uKTsKKwkvKiBjb2x1bW4gMiAqLworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9SU1BfV0FJVF9DSEFMLCBNVDJfUEVFUl9ERUFVVEgsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBQZWVyRGVhdXRoQWN0aW9uKTsKIAogfQogCkBAIC03MCwzOSArNzMsMzIgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBQZWVyQXV0aFNpbXBsZVJzcEdlbkFuZFNlbmQoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAotICAgIElOIFVTSE9SVCBBbGcsCi0gICAgSU4gVVNIT1JUIFNlcSwKLSAgICBJTiBVU0hPUlQgUmVhc29uLAotICAgIElOIFVTSE9SVCBTdGF0dXMpCit2b2lkIFBlZXJBdXRoU2ltcGxlUnNwR2VuQW5kU2VuZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhkcjgwMjExLAorCQkJCSB1MTYgQWxnLAorCQkJCSB1MTYgU2VxLAorCQkJCSB1MTYgUmVhc29uLCB1MTYgU3RhdHVzKQogewotICAgIEhFQURFUl84MDJfMTEgICAgIEF1dGhIZHI7Ci0gICAgVUxPTkcgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOwotICAgIFBVQ0hBUiAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotICAgIE5ESVNfU1RBVFVTICAgICAgIE5TdGF0dXM7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgQXV0aEhkcjsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuID0gMDsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJaW50IE5TdGF0dXM7CiAKLSAgICBpZiAoUmVhc29uICE9IE1MTUVfU1VDQ0VTUykKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXIgQVVUSCBmYWlsLi4uXG4iKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisJaWYgKFJlYXNvbiAhPSBNTE1FX1NVQ0NFU1MpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlciBBVVRIIGZhaWwuLi5cbiIpKTsKKwkJcmV0dXJuOworCX0KKwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm47CiAKLQkvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0gICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKLSAgICBpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotICAgICAgICByZXR1cm47Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIEFVVEggcmVzcG9uc2UgKHNlcSMyKS4uLlxuIikpOwotICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwgU1VCVFlQRV9BVVRILCAwLCBwSGRyODAyMTEtPkFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJkF1dGhIZHIsCi0gICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmQWxnLAotICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJlNlcSwKLSAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZSZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOwotICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgQVVUSCByZXNwb25zZSAoc2VxIzIpLi4uXG4iKSk7CisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBdXRoSGRyLCBTVUJUWVBFX0FVVEgsIDAsIHBIZHI4MDIxMS0+QWRkcjIsCisJCQkgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSksCisJCQkgICZBdXRoSGRyLCAyLCAmQWxnLCAyLCAmU2VxLCAyLCAmUmVhc29uLCBFTkRfT0ZfQVJHUyk7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CiAJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKIH0KIApAQCAtMTE0LDM1ICsxMTAsMzMgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBQZWVyRGVhdXRoQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFBNTE1FX1FVRVVFX0VMRU0gRWxlbSkKK3ZvaWQgUGVlckRlYXV0aEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0gICAgVUNIQVIgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLSAgICBVU0hPUlQgICAgICBSZWFzb247CisJdTggQWRkcjJbTUFDX0FERFJfTEVOXTsKKwl1MTYgUmVhc29uOwogCi0gICAgaWYgKFBlZXJEZWF1dGhTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZSZWFzb24pKQotICAgIHsKLSAgICAgICAgaWYgKElORlJBX09OKHBBZCkgJiYgTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKSkKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBVVRIX1JTUCAtIHJlY2VpdmUgREUtQVVUSCBmcm9tIG91ciBBUCAoUmVhc29uPSVkKVxuIiwgUmVhc29uKSk7CisJaWYgKFBlZXJEZWF1dGhTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZSZWFzb24pKSB7CisJCWlmIChJTkZSQV9PTihwQWQpCisJCSAgICAmJiBNQUNfQUREUl9FUVVBTChBZGRyMiwgcEFkLT5Db21tb25DZmcuQnNzaWQpCisJCSAgICApIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkFVVEhfUlNQIC0gcmVjZWl2ZSBERS1BVVRIIGZyb20gb3VyIEFQIChSZWFzb249JWQpXG4iLAorCQkJCSAgUmVhc29uKSk7CiAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOwotICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKLSAgICAgICAgICAgIH0KKwkJCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgU0lPQ0dJV0FQLCAtMSwgTlVMTCwgTlVMTCwKKwkJCQkJCTApOwogCi0JCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIGRlYXV0aGVudGljYXRpb24KKwkJCS8qIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgZGVhdXRoZW50aWNhdGlvbiAqLwogCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RFQVVUSF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RFQVVUSF9FVkVOVF9GTEFHLAorCQkJCQkJICAgICAgcEFkLT5NYWNUYWIuCisJCQkJCQkgICAgICBDb250ZW50W0JTU0lEX1dDSURdLkFkZHIsCisJCQkJCQkgICAgICBCU1MwLCAwKTsKIAotICAgICAgICAgICAgTGlua0Rvd24ocEFkLCBUUlVFKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFVVEhfUlNQIC0gUGVlckRlYXV0aEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7Ci0gICAgfQorCQkJTGlua0Rvd24ocEFkLCBUUlVFKTsKKwkJfQorCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQVVUSF9SU1AgLSBQZWVyRGVhdXRoQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwl9CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Nvbm5lY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Nvbm5lY3QuYwppbmRleCA3YmM3NWFiLi4xN2U1OWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9jb25uZWN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvY29ubmVjdC5jCkBAIC0zNiwzNCArMzYsMzkgQEAKICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKLVVDSEFSCUNpcGhlclN1aXRlV3BhTm9uZVRraXBbXSA9IHsKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCi0JCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0Ci0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDUwLCAweGYyLCAweDAwCS8vIGF1dGhlbnRpY2F0aW9uCi0JCX07Ci1VQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwTGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwKSAvIHNpemVvZihVQ0hBUikpOwordTggQ2lwaGVyU3VpdGVXcGFOb25lVGtpcFtdID0geworCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8qIG91aSAqLworCTB4MDEsIDB4MDAsCQkvKiBWZXJzaW9uICovCisJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLyogTXVsdGljYXN0ICovCisJMHgwMSwgMHgwMCwJCS8qIE51bWJlciBvZiB1bmljYXN0ICovCisJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLyogdW5pY2FzdCAqLworCTB4MDEsIDB4MDAsCQkvKiBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kICovCisJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMAkvKiBhdXRoZW50aWNhdGlvbiAqLworfTsKIAotVUNIQVIJQ2lwaGVyU3VpdGVXcGFOb25lQWVzW10gPSB7Ci0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQotCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCi0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQsCS8vIE11bHRpY2FzdAotCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAotCQkweDAwLCAweDUwLCAweGYyLCAweDA0LAkvLyB1bmljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMAkvLyBhdXRoZW50aWNhdGlvbgotCQl9OwotVUNIQVIJQ2lwaGVyU3VpdGVXcGFOb25lQWVzTGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZVdwYU5vbmVBZXMpIC8gc2l6ZW9mKFVDSEFSKSk7Cit1OCBDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwTGVuID0KKyAgICAoc2l6ZW9mKENpcGhlclN1aXRlV3BhTm9uZVRraXApIC8gc2l6ZW9mKHU4KSk7CiAKLS8vIFRoZSBmb2xsb3dpbmcgTUFDUk8gaXMgY2FsbGVkIGFmdGVyIDEuIHN0YXJ0aW5nIGFuIG5ldyBJQlNTLCAyLiBzdWNjZXNmdWxseSBKT0lOIGFuIElCU1MsCi0vLyBvciAzLiBzdWNjZXNmdWxseSBBU1NPQ0lBVEUgdG8gYSBCU1MsIDQuIHN1Y2Nlc3NmdWxseSBSRV9BU1NPQ0lBVEUgdG8gYSBCU1MKLS8vIEFsbCBzZXR0aW5ncyBzdWNjZXNzZnVseSBuZWdvdGlhdGVkIGZ1cmluZyBNTE1FIHN0YXRlIG1hY2hpbmVzIGJlY29tZSBmaW5hbCBzZXR0aW5ncwotLy8gYW5kIGFyZSBjb3BpZWQgdG8gcEFkLT5TdGFBY3RpdmUKK3U4IENpcGhlclN1aXRlV3BhTm9uZUFlc1tdID0geworCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8qIG91aSAqLworCTB4MDEsIDB4MDAsCQkvKiBWZXJzaW9uICovCisJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLyogTXVsdGljYXN0ICovCisJMHgwMSwgMHgwMCwJCS8qIE51bWJlciBvZiB1bmljYXN0ICovCisJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLyogdW5pY2FzdCAqLworCTB4MDEsIDB4MDAsCQkvKiBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kICovCisJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMAkvKiBhdXRoZW50aWNhdGlvbiAqLworfTsKKwordTggQ2lwaGVyU3VpdGVXcGFOb25lQWVzTGVuID0KKyAgICAoc2l6ZW9mKENpcGhlclN1aXRlV3BhTm9uZUFlcykgLyBzaXplb2YodTgpKTsKKworLyogVGhlIGZvbGxvd2luZyBNQUNSTyBpcyBjYWxsZWQgYWZ0ZXIgMS4gc3RhcnRpbmcgYW4gbmV3IElCU1MsIDIuIHN1Y2Nlc2Z1bGx5IEpPSU4gYW4gSUJTUywgKi8KKy8qIG9yIDMuIHN1Y2Nlc2Z1bGx5IEFTU09DSUFURSB0byBhIEJTUywgNC4gc3VjY2Vzc2Z1bGx5IFJFX0FTU09DSUFURSB0byBhIEJTUyAqLworLyogQWxsIHNldHRpbmdzIHN1Y2Nlc3NmdWx5IG5lZ290aWF0ZWQgZnVyaW5nIE1MTUUgc3RhdGUgbWFjaGluZXMgYmVjb21lIGZpbmFsIHNldHRpbmdzICovCisvKiBhbmQgYXJlIGNvcGllZCB0byBwQWQtPlN0YUFjdGl2ZSAqLwogI2RlZmluZSBDT1BZX1NFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhfcEFkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJTmRpc1plcm9NZW1vcnkoKF9wQWQpLT5Db21tb25DZmcuU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsJCQkJCQkJXAogCShfcEFkKS0+Q29tbW9uQ2ZnLlNzaWRMZW4gPSAoX3BBZCktPk1sbWVBdXguU3NpZExlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPkNvbW1vbkNmZy5Tc2lkLCAoX3BBZCktPk1sbWVBdXguU3NpZCwgKF9wQWQpLT5NbG1lQXV4LlNzaWRMZW4pOyBcCiAJQ09QWV9NQUNfQUREUigoX3BBZCktPkNvbW1vbkNmZy5Cc3NpZCwgKF9wQWQpLT5NbG1lQXV4LkJzc2lkKTsgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNzksOSArODQsOSBAQAogCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+U3RhQWN0aXZlLlN1cFJhdGUsIChfcEFkKS0+TWxtZUF1eC5TdXBSYXRlLCAoX3BBZCktPk1sbWVBdXguU3VwUmF0ZUxlbik7XAogCShfcEFkKS0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPSAoX3BBZCktPk1sbWVBdXguRXh0UmF0ZUxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPlN0YUFjdGl2ZS5FeHRSYXRlLCAoX3BBZCktPk1sbWVBdXguRXh0UmF0ZSwgKF9wQWQpLT5NbG1lQXV4LkV4dFJhdGVMZW4pO1wKLQlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBFZGNhUGFybSwgJihfcEFkKS0+TWxtZUF1eC5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7XAotCU5kaXNNb3ZlTWVtb3J5KCYoX3BBZCktPkNvbW1vbkNmZy5BUFFvc0NhcGFiaWxpdHksICYoX3BBZCktPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpO1wKLQlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBRYnNzTG9hZCwgJihfcEFkKS0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTtcCisJTmRpc01vdmVNZW1vcnkoJihfcEFkKS0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0sICYoX3BBZCktPk1sbWVBdXguQVBFZGNhUGFybSwgc2l6ZW9mKHN0cnVjdCBydF9lZGNhX3Bhcm0pKTtcCisJTmRpc01vdmVNZW1vcnkoJihfcEFkKS0+Q29tbW9uQ2ZnLkFQUW9zQ2FwYWJpbGl0eSwgJihfcEFkKS0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksIHNpemVvZihzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSkpO1wKKwlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBRYnNzTG9hZCwgJihfcEFkKS0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2Yoc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtKSk7XAogCUNPUFlfTUFDX0FERFIoKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCAoX3BBZCktPk1sbWVBdXguQnNzaWQpOyAgICAgIFwKIAkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFpZCA9IChfcEFkKS0+TWxtZUF1eC5BaWQ7ICAgICAgICAgICAgICAgICAgICAgICBcCiAJKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSAoX3BBZCktPlN0YUNmZy5QYWlyQ2lwaGVyO1wKQEAgLTk3LDEzICsxMDIsMTEgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBNbG1lQ250bEluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gU1RBVEVfTUFDSElORSAqUywKLQlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit2b2lkIE1sbWVDbnRsSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlMsIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKIHsKLQkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgZGlmZmVycyBmcm9tIG90aGVyIHN0YXRlIG1hY2hpbmVzLCB0aGUgaW50ZXJmYWNlCi0JLy8gZm9sbG93cyB0aGUgc3RhbmRhcmQgaW50ZXJmYWNlCisJLyogQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGRpZmZlcnMgZnJvbSBvdGhlciBzdGF0ZSBtYWNoaW5lcywgdGhlIGludGVyZmFjZSAqLworCS8qIGZvbGxvd3MgdGhlIHN0YW5kYXJkIGludGVyZmFjZSAqLwogCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CiB9CiAKQEAgLTExNSwxMTggKzExOCwxMDggQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBNbG1lQ250bE1hY2hpbmVQZXJmb3JtQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFNUQVRFX01BQ0hJTkUgKlMsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBNbG1lQ250bE1hY2hpbmVQZXJmb3JtQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTLAorCQkJCSAgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlzd2l0Y2gocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSkKLQl7Ci0JCWNhc2UgQ05UTF9JRExFOgotCQkJewotCQkJCUNudGxJZGxlUHJvYyhwQWQsIEVsZW0pOworCXN3aXRjaCAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSkgeworCWNhc2UgQ05UTF9JRExFOgorCQlDbnRsSWRsZVByb2MocEFkLCBFbGVtKTsKKwkJYnJlYWs7CisJY2FzZSBDTlRMX1dBSVRfRElTQVNTT0M6CisJCUNudGxXYWl0RGlzYXNzb2NQcm9jKHBBZCwgRWxlbSk7CisJCWJyZWFrOworCWNhc2UgQ05UTF9XQUlUX0pPSU46CisJCUNudGxXYWl0Sm9pblByb2MocEFkLCBFbGVtKTsKKwkJYnJlYWs7CisKKwkJLyogQ05UTF9XQUlUX1JFQVNTT0MgaXMgdGhlIG9ubHkgc3RhdGUgaW4gQ05UTCBtYWNoaW5lIHRoYXQgZG9lcyAqLworCQkvKiBub3QgdHJpZ2dlcmVkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYnkgIlJUTVBTZXRJbmZvcm1hdGlvbihPSURfeHh4KSIuICovCisJCS8qIFRoZXJlZm9yZSBub3QgcHJvdGVjdGVkIGJ5IE5ESVMncyAib25seSBvbmUgb3V0c3RhbmRpbmcgT0lEIHJlcXVlc3QiICovCisJCS8qIHJ1bGUuIFdoaWNoIG1lYW5zIE5ESVMgbWF5IFNFVCBPSUQgaW4gdGhlIG1pZGRsZSBvZiBST0FNaW5nIGF0dGVtcHRzLiAqLworCQkvKiBDdXJyZW50IGFwcHJvYWNoIGlzIHRvIGJsb2NrIG5ldyBTRVQgcmVxdWVzdCBhdCBSVE1QU2V0SW5mb3JtYXRpb24oKSAqLworCQkvKiB3aGVuIENudGxNYWNoaW5lLkN1cnJTdGF0ZSBpcyBub3QgQ05UTF9JRExFICovCisJY2FzZSBDTlRMX1dBSVRfUkVBU1NPQzoKKwkJQ250bFdhaXRSZWFzc29jUHJvYyhwQWQsIEVsZW0pOworCQlicmVhazsKKworCWNhc2UgQ05UTF9XQUlUX1NUQVJUOgorCQlDbnRsV2FpdFN0YXJ0UHJvYyhwQWQsIEVsZW0pOworCQlicmVhazsKKwljYXNlIENOVExfV0FJVF9BVVRIOgorCQlDbnRsV2FpdEF1dGhQcm9jKHBBZCwgRWxlbSk7CisJCWJyZWFrOworCWNhc2UgQ05UTF9XQUlUX0FVVEgyOgorCQlDbnRsV2FpdEF1dGhQcm9jMihwQWQsIEVsZW0pOworCQlicmVhazsKKwljYXNlIENOVExfV0FJVF9BU1NPQzoKKwkJQ250bFdhaXRBc3NvY1Byb2MocEFkLCBFbGVtKTsKKwkJYnJlYWs7CisKKwljYXNlIENOVExfV0FJVF9PSURfTElTVF9TQ0FOOgorCQlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfU0NBTl9DT05GKSB7CisJCQkvKiBSZXN1bWUgVHhSaW5nIGFmdGVyIFNDQU5JTkcgY29tcGxldGUuIFdlIGhvcGUgdGhlIG91dC1vZi1zZXJ2aWNlIHRpbWUgKi8KKwkJCS8qIHdvbid0IGJlIHRvbyBsb25nIHRvIGxldCB1cHBlciBsYXllciB0aW1lLW91dCB0aGUgd2FpdGluZyBmcmFtZXMgKi8KKwkJCVJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CisKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisKKwkJCS8qICovCisJCQkvKiBTZXQgTEVEIHN0YXR1cyB0byBwcmV2aW91cyBzdGF0dXMuICovCisJCQkvKiAqLworCQkJaWYgKHBBZC0+YkxlZE9uU2Nhbm5pbmcpIHsKKwkJCQlwQWQtPmJMZWRPblNjYW5uaW5nID0gRkFMU0U7CisJCQkJUlRNUFNldExFRChwQWQsIHBBZC0+TGVkU3RhdHVzKTsKIAkJCX0KLQkJCWJyZWFrOwotCQljYXNlIENOVExfV0FJVF9ESVNBU1NPQzoKLQkJCUNudGxXYWl0RGlzYXNzb2NQcm9jKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDTlRMX1dBSVRfSk9JTjoKLQkJCUNudGxXYWl0Sm9pblByb2MocEFkLCBFbGVtKTsKLQkJCWJyZWFrOworCQl9CisJCWJyZWFrOwogCi0JCS8vIENOVExfV0FJVF9SRUFTU09DIGlzIHRoZSBvbmx5IHN0YXRlIGluIENOVEwgbWFjaGluZSB0aGF0IGRvZXMKLQkJLy8gbm90IHRyaWdnZXJlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGJ5ICJSVE1QU2V0SW5mb3JtYXRpb24oT0lEX3h4eCkiLgotCQkvLyBUaGVyZWZvcmUgbm90IHByb3RlY3RlZCBieSBORElTJ3MgIm9ubHkgb25lIG91dHN0YW5kaW5nIE9JRCByZXF1ZXN0IgotCQkvLyBydWxlLiBXaGljaCBtZWFucyBORElTIG1heSBTRVQgT0lEIGluIHRoZSBtaWRkbGUgb2YgUk9BTWluZyBhdHRlbXB0cy4KLQkJLy8gQ3VycmVudCBhcHByb2FjaCBpcyB0byBibG9jayBuZXcgU0VUIHJlcXVlc3QgYXQgUlRNUFNldEluZm9ybWF0aW9uKCkKLQkJLy8gd2hlbiBDbnRsTWFjaGluZS5DdXJyU3RhdGUgaXMgbm90IENOVExfSURMRQotCQljYXNlIENOVExfV0FJVF9SRUFTU09DOgotCQkJQ250bFdhaXRSZWFzc29jUHJvYyhwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTlRMX1dBSVRfU1RBUlQ6Ci0JCQlDbnRsV2FpdFN0YXJ0UHJvYyhwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ05UTF9XQUlUX0FVVEg6Ci0JCQlDbnRsV2FpdEF1dGhQcm9jKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDTlRMX1dBSVRfQVVUSDI6Ci0JCQlDbnRsV2FpdEF1dGhQcm9jMihwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ05UTF9XQUlUX0FTU09DOgotCQkJQ250bFdhaXRBc3NvY1Byb2MocEFkLCBFbGVtKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ05UTF9XQUlUX09JRF9MSVNUX1NDQU46Ci0JCQlpZihFbGVtLT5Nc2dUeXBlID09IE1UMl9TQ0FOX0NPTkYpCi0JCQl7Ci0JCQkJLy8gUmVzdW1lIFR4UmluZyBhZnRlciBTQ0FOSU5HIGNvbXBsZXRlLiBXZSBob3BlIHRoZSBvdXQtb2Ytc2VydmljZSB0aW1lCi0JCQkJLy8gd29uJ3QgYmUgdG9vIGxvbmcgdG8gbGV0IHVwcGVyIGxheWVyIHRpbWUtb3V0IHRoZSB3YWl0aW5nIGZyYW1lcwotCQkJCVJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKHBBZCk7Ci0JCQkJaWYgKHBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgIT0gTVNSTl9UWVBFX1VOVVNFRCkKLQkJCQl7Ci0JCQkJCS8vIENpc2NvIHNjYW4gcmVxdWVzdCBpcyBmaW5pc2hlZCwgcHJlcGFyZSBiZWFjb24gcmVwb3J0Ci0JCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQUlST05FVF9TVEFURV9NQUNISU5FLCBNVDJfQUlST05FVF9TQ0FOX0RPTkUsIDAsIE5VTEwpOwotCQkJCX0KLQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCi0gICAgICAgICAgICAgICAgLy8KLQkJCQkvLyBTZXQgTEVEIHN0YXR1cyB0byBwcmV2aW91cyBzdGF0dXMuCi0JCQkJLy8KLQkJCQlpZiAocEFkLT5iTGVkT25TY2FubmluZykKLQkJCQl7Ci0JCQkJCXBBZC0+YkxlZE9uU2Nhbm5pbmcgPSBGQUxTRTsKLQkJCQkJUlRNUFNldExFRChwQWQsIHBBZC0+TGVkU3RhdHVzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIENOVExfV0FJVF9PSURfRElTQVNTT0M6Ci0JCQlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfRElTQVNTT0NfQ09ORikKLQkJCXsKLQkJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKLQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCQkJfQotCQkJYnJlYWs7Ci0jaWZkZWYgUlQyODcwCi0JCS8vCi0JCS8vIFRoaXMgc3RhdGUgaXMgZm9yIHRoYXQgd2Ugd2FudCB0byBjb25uZWN0IHRvIGFuIEFQIGJ1dAotCQkvLyBpdCBkaWRuJ3QgZmluZCBvbiBCU1MgTGlzdCB0YWJsZS4gU28gd2UgbmVlZCB0byBzY2FuIHRoZSBhaXIgZmlyc3QsCi0JCS8vIGFmdGVyIHRoYXQgd2UgY2FuIHRyeSB0byBjb25uZWN0IHRvIHRoZSBkZXNpcmVkIEFQIGlmIGF2YWlsYWJsZS4KLQkJLy8KLQkJY2FzZSBDTlRMX1dBSVRfU0NBTl9GT1JfQ09OTkVDVDoKLQkJCWlmKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1NDQU5fQ09ORikKLQkJCXsKLQkJCQkvLyBSZXN1bWUgVHhSaW5nIGFmdGVyIFNDQU5JTkcgY29tcGxldGUuIFdlIGhvcGUgdGhlIG91dC1vZi1zZXJ2aWNlIHRpbWUKLQkJCQkvLyB3b24ndCBiZSB0b28gbG9uZyB0byBsZXQgdXBwZXIgbGF5ZXIgdGltZS1vdXQgdGhlIHdhaXRpbmcgZnJhbWVzCi0JCQkJUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24ocEFkKTsKKwljYXNlIENOVExfV0FJVF9PSURfRElTQVNTT0M6CisJCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9ESVNBU1NPQ19DT05GKSB7CisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCX0KKwkJYnJlYWs7CisjaWZkZWYgUlRNUF9NQUNfVVNCCisJCS8qICovCisJCS8qIFRoaXMgc3RhdGUgaXMgZm9yIHRoYXQgd2Ugd2FudCB0byBjb25uZWN0IHRvIGFuIEFQIGJ1dCAqLworCQkvKiBpdCBkaWRuJ3QgZmluZCBvbiBCU1MgTGlzdCB0YWJsZS4gU28gd2UgbmVlZCB0byBzY2FuIHRoZSBhaXIgZmlyc3QsICovCisJCS8qIGFmdGVyIHRoYXQgd2UgY2FuIHRyeSB0byBjb25uZWN0IHRvIHRoZSBkZXNpcmVkIEFQIGlmIGF2YWlsYWJsZS4gKi8KKwkJLyogKi8KKwljYXNlIENOVExfV0FJVF9TQ0FOX0ZPUl9DT05ORUNUOgorCQlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfU0NBTl9DT05GKSB7CisJCQkvKiBSZXN1bWUgVHhSaW5nIGFmdGVyIFNDQU5JTkcgY29tcGxldGUuIFdlIGhvcGUgdGhlIG91dC1vZi1zZXJ2aWNlIHRpbWUgKi8KKwkJCS8qIHdvbid0IGJlIHRvbyBsb25nIHRvIGxldCB1cHBlciBsYXllciB0aW1lLW91dCB0aGUgd2FpdGluZyBmcmFtZXMgKi8KKwkJCVJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CiAjaWZkZWYgQ0NYX1NVUFBPUlQKLQkJCQlpZiAocEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSAhPSBNU1JOX1RZUEVfVU5VU0VEKQotCQkJCXsKLQkJCQkJLy8gQ2lzY28gc2NhbiByZXF1ZXN0IGlzIGZpbmlzaGVkLCBwcmVwYXJlIGJlYWNvbiByZXBvcnQKLQkJCQkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgMCwgTlVMTCk7Ci0JCQkJfQotI2VuZGlmIC8vIENDWF9TVVBQT1JUIC8vCi0JCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQotCQkJCS8vCi0JCQkJLy8gQ2hlY2sgaWYgd2UgY2FuIGNvbm5lY3QgdG8uCi0JCQkJLy8KLQkJCQlCc3NUYWJsZVNzaWRTb3J0KHBBZCwgJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7Ci0JCQkJaWYgKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yID4gMCkKLQkJCQl7Ci0JCQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKLQkJCQl9CisJCQlpZiAocEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSAhPSBNU1JOX1RZUEVfVU5VU0VEKSB7CisJCQkJLyogQ2lzY28gc2NhbiByZXF1ZXN0IGlzIGZpbmlzaGVkLCBwcmVwYXJlIGJlYWNvbiByZXBvcnQgKi8KKwkJCQlNbG1lRW5xdWV1ZShwQWQsIEFJUk9ORVRfU1RBVEVfTUFDSElORSwKKwkJCQkJICAgIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgMCwgTlVMTCk7CiAJCQl9Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UX0VSUigoIiFFUlJPUiEgQ05UTCAtIElsbGVnYWwgbWVzc2FnZSB0eXBlKD0lbGQpIiwgRWxlbS0+TXNnVHlwZSkpOwotCQkJYnJlYWs7CisjZW5kaWYgLyogQ0NYX1NVUFBPUlQgLy8gKi8KKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisKKwkJCS8qICovCisJCQkvKiBDaGVjayBpZiB3ZSBjYW4gY29ubmVjdCB0by4gKi8KKwkJCS8qICovCisJCQlCc3NUYWJsZVNzaWRTb3J0KHBBZCwgJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLAorCQkJCQkgKGNoYXIgKikgcEFkLT5NbG1lQXV4LgorCQkJCQkgQXV0b1JlY29ubmVjdFNzaWQsCisJCQkJCSBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCQkJaWYgKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yID4gMCkgeworCQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKwlkZWZhdWx0OgorCQlEQkdQUklOVF9FUlIoKCJFUlJPUiEgQ05UTCAtIElsbGVnYWwgbWVzc2FnZSB0eXBlKD0lbGQpIiwKKwkJCSAgICAgIEVsZW0tPk1zZ1R5cGUpKTsKKwkJYnJlYWs7CiAJfQogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAlEZXNjcmlwdGlvbjoKQEAgLTIzNSw5MiArMjI4LDk1IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgQ250bElkbGVQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgQ250bElkbGVQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICBEaXNhc3NvY1JlcTsKKwlzdHJ1Y3QgcnRfbWxtZV9kaXNhc3NvY19yZXEgRGlzYXNzb2NSZXE7CiAKIAlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCiAJCXJldHVybjsKIAotCXN3aXRjaChFbGVtLT5Nc2dUeXBlKQotCXsKLQkJY2FzZSBPSURfODAyXzExX1NTSUQ6Ci0JCQlDbnRsT2lkU3NpZFByb2MocEFkLCBFbGVtKTsKLQkJCWJyZWFrOworCXN3aXRjaCAoRWxlbS0+TXNnVHlwZSkgeworCWNhc2UgT0lEXzgwMl8xMV9TU0lEOgorCQlDbnRsT2lkU3NpZFByb2MocEFkLCBFbGVtKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBPSURfODAyXzExX0JTU0lEOgotCQkJQ250bE9pZFJUQnNzaWRQcm9jKHBBZCxFbGVtKTsKLQkJCWJyZWFrOworCWNhc2UgT0lEXzgwMl8xMV9CU1NJRDoKKwkJQ250bE9pZFJUQnNzaWRQcm9jKHBBZCwgRWxlbSk7CisJCWJyZWFrOwogCi0JCWNhc2UgT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU46Ci0JCQlDbnRsT2lkU2NhblByb2MocEFkLEVsZW0pOwotCQkJYnJlYWs7CisJY2FzZSBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTjoKKwkJQ250bE9pZFNjYW5Qcm9jKHBBZCwgRWxlbSk7CisJCWJyZWFrOwogCi0JCWNhc2UgT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEU6Ci0JCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DOworCWNhc2UgT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEU6CisJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJCSBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxKSwgJkRpc2Fzc29jUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7CiAKLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJKQotICAgICAgICAgICAgewotICAgIAkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKLSAgICAJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCi0gICAgCQkJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKLSAgICAJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7Ci0gICAgICAgICAgICB9Ci0JCQlicmVhazsKKwkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPQorCQkgICAgV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJKSB7CisJCQkvKiBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lEICovCisJCQkvKiBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuICovCisJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSAzMjsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwKKwkJCQkgICAgICAgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKwkJfQorCQlicmVhazsKIAotCQljYXNlIE1UMl9NTE1FX1JPQU1JTkdfUkVROgotCQkJQ250bE1sbWVSb2FtaW5nUHJvYyhwQWQsIEVsZW0pOwotCQkJYnJlYWs7CisJY2FzZSBNVDJfTUxNRV9ST0FNSU5HX1JFUToKKwkJQ250bE1sbWVSb2FtaW5nUHJvYyhwQWQsIEVsZW0pOworCQlicmVhazsKIAotICAgICAgICBjYXNlIE9JRF84MDJfMTFfTUlDX0ZBSUxVUkVfUkVQT1JUX0ZSQU1FOgotICAgICAgICAgICAgV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lKHBBZCwgRWxlbSk7Ci0gICAgICAgICAgICBicmVhazsKKwljYXNlIE9JRF84MDJfMTFfTUlDX0ZBSUxVUkVfUkVQT1JUX0ZSQU1FOgorCQlXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUocEFkLCBFbGVtKTsKKwkJYnJlYWs7CiAKLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBJbGxlZ2FsIG1lc3NhZ2UgaW4gQ250bElkbGVQcm9jKE1zZ1R5cGU9JWxkKVxuIixFbGVtLT5Nc2dUeXBlKSk7Ci0JCQlicmVhazsKKwlkZWZhdWx0OgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkNOVEwgLSBJbGxlZ2FsIG1lc3NhZ2UgaW4gQ250bElkbGVQcm9jKE1zZ1R5cGU9JWxkKVxuIiwKKwkJCSAgRWxlbS0+TXNnVHlwZSkpOworCQlicmVhazsKIAl9CiB9CiAKLVZPSUQgQ250bE9pZFNjYW5Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgQ250bE9pZFNjYW5Qcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlNTE1FX1NDQU5fUkVRX1NUUlVDVCAgICAgICBTY2FuUmVxOwotCVVMT05HICAgICAgICAgICAgICAgICAgICAgIEJzc0lkeCA9IEJTU19OT1RfRk9VTkQ7Ci0JQlNTX0VOVFJZICAgICAgICAgICAgICAgICAgQ3VyckJzczsKKwlzdHJ1Y3QgcnRfbWxtZV9zY2FuX3JlcSBTY2FuUmVxOworCXVuc2lnbmVkIGxvbmcgQnNzSWR4ID0gQlNTX05PVF9GT1VORDsKKwlzdHJ1Y3QgcnRfYnNzX2VudHJ5IEN1cnJCc3M7CiAKLQkvLyByZWNvcmQgY3VycmVudCBCU1MgaWYgbmV0d29yayBpcyBjb25uZWN0ZWQuCi0JLy8gMjAwMy0yLTEzIGRvIG5vdCBpbmNsdWRlIGN1cnJlbnQgSUJTUyBpZiB0aGlzIGlzIHRoZSBvbmx5IFNUQSBpbiB0aGlzIElCU1MuCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQl7Ci0JCUJzc0lkeCA9IEJzc1NzaWRUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCWlmIChCc3NJZHggIT0gQlNTX05PVF9GT1VORCkKLQkJewotCQkJTmRpc01vdmVNZW1vcnkoJkN1cnJCc3MsICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XSwgc2l6ZW9mKEJTU19FTlRSWSkpOworCS8qIHJlY29yZCBjdXJyZW50IEJTUyBpZiBuZXR3b3JrIGlzIGNvbm5lY3RlZC4gKi8KKwkvKiAyMDAzLTItMTMgZG8gbm90IGluY2x1ZGUgY3VycmVudCBJQlNTIGlmIHRoaXMgaXMgdGhlIG9ubHkgU1RBIGluIHRoaXMgSUJTUy4gKi8KKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKSB7CisJCUJzc0lkeCA9CisJCSAgICBCc3NTc2lkVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkJICAgICAgICh1OCAqKXBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisJCQkJICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCisJCQkJICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlpZiAoQnNzSWR4ICE9IEJTU19OT1RfRk9VTkQpIHsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZDdXJyQnNzLCAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfYnNzX2VudHJ5KSk7CiAJCX0KIAl9Ci0KLQkvLyBjbGVhbiB1cCBwcmV2aW91cyBTQ0FOIHJlc3VsdCwgYWRkIGN1cnJlbnQgQlNTIGJhY2sgdG8gdGFibGUgaWYgYW55CisJLyogY2xlYW4gdXAgcHJldmlvdXMgU0NBTiByZXN1bHQsIGFkZCBjdXJyZW50IEJTUyBiYWNrIHRvIHRhYmxlIGlmIGFueSAqLwogCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKLQlpZiAoQnNzSWR4ICE9IEJTU19OT1RfRk9VTkQpCi0JewotCQkvLyBEREsgTm90ZTogSWYgdGhlIE5JQyBpcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIEJTU0lEIGFuZCBTU0lECi0JCS8vICAgIHRoYXQgYXJlIG5vdCBjb250YWluZWQgaW4gdGhlIGxpc3Qgb2YgQlNTSURzIGdlbmVyYXRlZCBieSB0aGlzIHNjYW4sIHRoZQotCQkvLyAgICBCU1NJRCBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudGx5IGFzc29jaWF0ZWQgQlNTSUQgYW5kIFNTSUQgc2hvdWxkIGJlCi0JCS8vICAgIGFwcGVuZGVkIHRvIHRoZSBsaXN0IG9mIEJTU0lEcyBpbiB0aGUgTklDJ3MgZGF0YWJhc2UuCi0JCS8vIFRvIGVuc3VyZSB0aGlzLCB3ZSBhcHBlbmQgdGhpcyBCU1MgYXMgdGhlIGZpcnN0IGVudHJ5IGluIFNDQU4gcmVzdWx0Ci0JCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbMF0sICZDdXJyQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJaWYgKEJzc0lkeCAhPSBCU1NfTk9UX0ZPVU5EKSB7CisJCS8qIERESyBOb3RlOiBJZiB0aGUgTklDIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgQlNTSUQgYW5kIFNTSUQgKi8KKwkJLyogICAgdGhhdCBhcmUgbm90IGNvbnRhaW5lZCBpbiB0aGUgbGlzdCBvZiBCU1NJRHMgZ2VuZXJhdGVkIGJ5IHRoaXMgc2NhbiwgdGhlICovCisJCS8qICAgIEJTU0lEIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50bHkgYXNzb2NpYXRlZCBCU1NJRCBhbmQgU1NJRCBzaG91bGQgYmUgKi8KKwkJLyogICAgYXBwZW5kZWQgdG8gdGhlIGxpc3Qgb2YgQlNTSURzIGluIHRoZSBOSUMncyBkYXRhYmFzZS4gKi8KKwkJLyogVG8gZW5zdXJlIHRoaXMsIHdlIGFwcGVuZCB0aGlzIEJTUyBhcyB0aGUgZmlyc3QgZW50cnkgaW4gU0NBTiByZXN1bHQgKi8KKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVswXSwgJkN1cnJCc3MsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9ic3NfZW50cnkpKTsKIAkJcEFkLT5TY2FuVGFiLkJzc05yID0gMTsKIAl9CiAKLQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgIiIsIDAsIEJTU19BTlksIFNDQU5fQUNUSVZFKTsKKwlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgKGNoYXIgKilFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQlNTX0FOWSwKKwkJICAgICBTQ0FOX0FDVElWRSk7CiAJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLAotCQlzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7CisJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfc2Nhbl9yZXEpLCAmU2NhblJlcSk7CiAJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOwogfQogCkBAIC0zMzMsMTcxICszMjksMTc0IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgQ250bE9pZFNzaWRQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pCit2b2lkIENudGxPaWRTc2lkUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JUE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgcE9pZFNzaWQgPSAoTkRJU184MDJfMTFfU1NJRCAqKUVsZW0tPk1zZzsKLQlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICBEaXNhc3NvY1JlcTsKLQlVTE9ORwkJCQkJICAgTm93OworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV9zc2lkICogcE9pZFNzaWQgPSAoc3RydWN0IHJ0X25kaXNfODAyXzExX3NzaWQgKikgRWxlbS0+TXNnOworCXN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSBEaXNhc3NvY1JlcTsKKwl1bnNpZ25lZCBsb25nIE5vdzsKIAotI2lmZGVmIFJUMjg2MAotCS8vIEJCUCBhbmQgUkYgYXJlIG5vdCBhY2Nlc3NpYmxlIGluIFBTIG1vZGUsIHdlIGhhcyB0byB3YWtlIHRoZW0gdXAgZmlyc3QKLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgUlRNUF9IQUxUKTsKLSNlbmRpZgotCi0JLy8gU3RlcCAxLiByZWNvcmQgdGhlIGRlc2lyZWQgdXNlciBzZXR0aW5ncyB0byBNbG1lQXV4CisJLyogU3RlcCAxLiByZWNvcmQgdGhlIGRlc2lyZWQgdXNlciBzZXR0aW5ncyB0byBNbG1lQXV4ICovCiAJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CiAJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHBPaWRTc2lkLT5Tc2lkLCBwT2lkU3NpZC0+U3NpZExlbmd0aCk7Ci0JcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSAoVUNIQVIpcE9pZFNzaWQtPlNzaWRMZW5ndGg7CisJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSAodTgpcE9pZFNzaWQtPlNzaWRMZW5ndGg7CiAJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOwogCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gcEFkLT5TdGFDZmcuQnNzVHlwZTsKIAorCXBBZC0+U3RhQ2ZnLmJBdXRvQ29ubmVjdEJ5QnNzaWQgPSBGQUxTRTsKIAotCS8vCi0JLy8gVXBkYXRlIFJlY29ubmVjdCBTc2lkLCB0aGF0IHVzZXIgZGVzaXJlZCB0byBjb25uZWN0LgotCS8vCisJLyogKi8KKwkvKiBVcGRhdGUgUmVjb25uZWN0IFNzaWQsIHRoYXQgdXNlciBkZXNpcmVkIHRvIGNvbm5lY3QuICovCisJLyogKi8KIAlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LlNzaWQsCisJCSAgICAgICBwQWQtPk1sbWVBdXguU3NpZExlbik7CiAJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gcEFkLT5NbG1lQXV4LlNzaWRMZW47CiAKLQkvLyBzdGVwIDIuIGZpbmQgYWxsIG1hdGNoaW5nIEJTUyBpbiB0aGUgbGFzdGVzdCBTQ0FOIHJlc3VsdCAoaW5Cc3NUYWIpCi0JLy8gICAgJiBsb2cgdGhlbSBpbnRvIE1sbWVBdXguU3NpZEJzc1RhYiBmb3IgbGF0ZXItb24gaXRlcmF0aW9uLiBTb3J0IGJ5IFJTU0kgb3JkZXIKLQlCc3NUYWJsZVNzaWRTb3J0KHBBZCwgJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCS8qIHN0ZXAgMi4gZmluZCBhbGwgbWF0Y2hpbmcgQlNTIGluIHRoZSBsYXN0ZXN0IFNDQU4gcmVzdWx0IChpbkJzc1RhYikgKi8KKwkvKiAgICAmIGxvZyB0aGVtIGludG8gTWxtZUF1eC5Tc2lkQnNzVGFiIGZvciBsYXRlci1vbiBpdGVyYXRpb24uIFNvcnQgYnkgUlNTSSBvcmRlciAqLworCUJzc1RhYmxlU3NpZFNvcnQocEFkLCAmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIsCisJCQkgKGNoYXIgKilwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtICVkIEJTUyBvZiAlZCBCU1MgbWF0Y2ggdGhlIGRlc2lyZSAoJWQpU1NJRCAtICVzXG4iLAotCQkJcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIsIHBBZC0+U2NhblRhYi5Cc3NOciwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIHBBZC0+TWxtZUF1eC5Tc2lkKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSAlZCBCU1Mgb2YgJWQgQlNTIG1hdGNoIHRoZSBkZXNpcmUgKCVkKVNTSUQgLSAlc1xuIiwKKwkJICBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciwgcEFkLT5TY2FuVGFiLkJzc05yLAorCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBwQWQtPk1sbWVBdXguU3NpZCkpOwogCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CiAKIAlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmCi0JCShwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuID09IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLlNzaWRMZW4pICYmCi0JCU5kaXNFcXVhbE1lbW9yeShwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXS5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSAmJgotCQlNQUNfQUREUl9FUVVBTChwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0uQnNzaWQpKQotCXsKLQkJLy8gQ2FzZSAxLiBhbHJlYWR5IGNvbm5lY3RlZCB3aXRoIGFuIEFQIHdobyBoYXMgdGhlIGRlc2lyZWQgU1NJRAotCQkvLyAgICAgICAgIHdpdGggaGlnaGVzdCBSU1NJCisJICAgIChwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuID09CisJICAgICBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXS5Tc2lkTGVuKQorCSAgICAmJiBOZGlzRXF1YWxNZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwKKwkJCSAgICAgICBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXS5Tc2lkLAorCQkJICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pCisJICAgICYmIE1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJICAgICAgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0uQnNzaWQpKSB7CisJCS8qIENhc2UgMS4gYWxyZWFkeSBjb25uZWN0ZWQgd2l0aCBhbiBBUCB3aG8gaGFzIHRoZSBkZXNpcmVkIFNTSUQgKi8KKwkJLyogICAgICAgICB3aXRoIGhpZ2hlc3QgUlNTSSAqLwogCi0JCS8vIEFkZCBjaGVja2luZyBNb2RlICJMRUFQIiBmb3IgQ0NYIDEuMAorCQkvKiBBZGQgY2hlY2tpbmcgTW9kZSAiTEVBUCIgZm9yIENDWCAxLjAgKi8KIAkJaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAotCQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8Ci0JCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8Ci0JCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0JCQkgKSAmJgotCQkJKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCi0JCXsKLQkJCS8vIGNhc2UgMS4xIEZvciBXUEEsIFdQQS1QU0ssIGlmIHRoZSAxeCBwb3J0IGlzIG5vdCBzZWN1cmVkLCB3ZSBoYXZlIHRvIHJlZG8KLQkJCS8vICAgICAgICAgIGNvbm5lY3Rpb24gcHJvY2VzcwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAuLi5cbiIpKTsKLQkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOwotCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCi0JCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKwkJICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorCQkgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorCQkgICAgKSAmJgorCQkgICAgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpIHsKKwkJCS8qIGNhc2UgMS4xIEZvciBXUEEsIFdQQS1QU0ssIGlmIHRoZSAxeCBwb3J0IGlzIG5vdCBzZWN1cmVkLCB3ZSBoYXZlIHRvIHJlZG8gKi8KKwkJCS8qICAgICAgICAgIGNvbm5lY3Rpb24gcHJvY2VzcyAqLworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAuLi5cbiIpKTsKKwkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsCisJCQkJCSBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJCQkJIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsCisJCQkJICAgIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSksCisJCQkJICAgICZEaXNhc3NvY1JlcSk7CiAJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOwotCQl9Ci0JCWVsc2UgaWYgKHBBZC0+YkNvbmZpZ0NoYW5nZWQgPT0gVFJVRSkKLQkJewotCQkJLy8gY2FzZSAxLjIgSW1wb3J0YW50IENvbmZpZyBoYXMgY2hhbmdlZCwgd2UgaGF2ZSB0byByZWNvbm5lY3QgdG8gdGhlIHNhbWUgQVAKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQIEJlY2F1c2UgY29uZmlnIGNoYW5nZWQuLi5cbiIpKTsKLQkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOwotCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCi0JCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKwkJfSBlbHNlIGlmIChwQWQtPmJDb25maWdDaGFuZ2VkID09IFRSVUUpIHsKKwkJCS8qIGNhc2UgMS4yIEltcG9ydGFudCBDb25maWcgaGFzIGNoYW5nZWQsIHdlIGhhdmUgdG8gcmVjb25uZWN0IHRvIHRoZSBzYW1lIEFQICovCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUCBCZWNhdXNlIGNvbmZpZyBjaGFuZ2VkLi4uXG4iKSk7CisJCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLAorCQkJCQkgcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkJCSBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLAorCQkJCSAgICBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9kaXNhc3NvY19yZXEpLAorCQkJCSAgICAmRGlzYXNzb2NSZXEpOwogCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIGNhc2UgMS4zLiBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUgU1NJRCB3aXRoIGhpZ2hlc3QgUlNTSS4KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBhbHJlYWR5IHdpdGggdGhpcyBCU1NJRC4gaWdub3JlIHRoaXMgU0VUX1NTSUQgcmVxdWVzdFxuIikpOwotCQkJLy8KLQkJCS8vIChIQ1QgMTIuMSkgMWNfd2xhbl9tZWRpYWV2ZW50cyByZXF1aXJlZAotCQkJLy8gbWVkaWEgY29ubmVjdCBldmVudHMgYXJlIGluZGljYXRlZCB3aGVuIGFzc29jaWF0aW5nIHdpdGggdGhlIHNhbWUgQVAKLQkJCS8vCi0JCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJCXsKLQkJCQkvLwotCQkJCS8vIFNpbmNlIE1lZGlhU3RhdGUgYWxyZWFkeSBpcyBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZAotCQkJCS8vIFdlIGp1c3QgaW5kaWNhdGUgdGhlIGNvbm5lY3QgZXZlbnQgYWdhaW4gdG8gbWVldCB0aGUgV0hRTCByZXF1aXJlZC4KLQkJCQkvLwotCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCX0gZWxzZSB7CisJCQkvKiBjYXNlIDEuMy4gYWxyZWFkeSBjb25uZWN0ZWQgdG8gdGhlIFNTSUQgd2l0aCBoaWdoZXN0IFJTU0kuICovCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gYWxyZWFkeSB3aXRoIHRoaXMgQlNTSUQuIGlnbm9yZSB0aGlzIFNFVF9TU0lEIHJlcXVlc3RcbiIpKTsKKwkJCS8qICovCisJCQkvKiAoSENUIDEyLjEpIDFjX3dsYW5fbWVkaWFldmVudHMgcmVxdWlyZWQgKi8KKwkJCS8qIG1lZGlhIGNvbm5lY3QgZXZlbnRzIGFyZSBpbmRpY2F0ZWQgd2hlbiBhc3NvY2lhdGluZyB3aXRoIHRoZSBzYW1lIEFQICovCisJCQkvKiAqLworCQkJaWYgKElORlJBX09OKHBBZCkpIHsKKwkJCQkvKiAqLworCQkJCS8qIFNpbmNlIE1lZGlhU3RhdGUgYWxyZWFkeSBpcyBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCAqLworCQkJCS8qIFdlIGp1c3QgaW5kaWNhdGUgdGhlIGNvbm5lY3QgZXZlbnQgYWdhaW4gdG8gbWVldCB0aGUgV0hRTCByZXF1aXJlZC4gKi8KKwkJCQkvKiAqLworCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0KKwkJCQkgICAgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CiAJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLSAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cAorCQkJCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOwkvKiBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cCAqLwogCQkJfQogCiAJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OwotCi0gICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOwotICAgICAgICAgICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOwotICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKLQotICAgICAgICAgICAgfQorCQkJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBTSU9DR0lXQVAsIC0xLAorCQkJCQkJJnBBZC0+TWxtZUF1eC5Cc3NpZFswXSwgTlVMTCwKKwkJCQkJCTApOwogCQl9Ci0JfQotCWVsc2UgaWYgKElORlJBX09OKHBBZCkpCi0JewotCQkvLwotCQkvLyBGb3IgUlQ2MQotCQkvLyBbODg4ODhdIE9JRF84MDJfMTFfU1NJRCBzaG91bGQgaGF2ZSByZXR1cm5lZCBORFRFU1RfV0VQX0FQMihSZXR1cm5lZDogKQotCQkvLyBSVDYxIG1heSBsb3N0IFNTSUQsIGFuZCBub3QgY29ubmVjdCB0byBORFRFU1RfV0VQX0FQMiBhbmQgd2lsbCBjb25uZWN0IHRvIE5EVEVTVF9XRVBfQVAyIGJ5IEF1dG9yZWNvbm5lY3QKLQkJLy8gQnV0IG1lZGlhIHN0YXR1cyBpcyBjb25uZWN0ZWQsIHNvIHRoZSBTU0lEIG5vdCByZXBvcnQgY29ycmVjdGx5LgotCQkvLwotCQlpZiAoIVNTSURfRVFVQUwocEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKSkKLQkJewotCQkJLy8KLQkJCS8vIERpZmZlcmVudCBTU0lEIG1lYW5zIG5vdCBSb2FtaW5nIGNhc2UsIHNvIHdlIGxldCBMaW5rRG93bigpIHRvIEluZGljYXRlIGEgZGlzY29ubmVjdCBldmVudC4KLQkJCS8vCisJfSBlbHNlIGlmIChJTkZSQV9PTihwQWQpKSB7CisJCS8qICovCisJCS8qIEZvciBSVDYxICovCisJCS8qIFs4ODg4OF0gT0lEXzgwMl8xMV9TU0lEIHNob3VsZCBoYXZlIHJldHVybmVkIE5EVEVTVF9XRVBfQVAyKFJldHVybmVkOiApICovCisJCS8qIFJUNjEgbWF5IGxvc3QgU1NJRCwgYW5kIG5vdCBjb25uZWN0IHRvIE5EVEVTVF9XRVBfQVAyIGFuZCB3aWxsIGNvbm5lY3QgdG8gTkRURVNUX1dFUF9BUDIgYnkgQXV0b3JlY29ubmVjdCAqLworCQkvKiBCdXQgbWVkaWEgc3RhdHVzIGlzIGNvbm5lY3RlZCwgc28gdGhlIFNTSUQgbm90IHJlcG9ydCBjb3JyZWN0bHkuICovCisJCS8qICovCisJCWlmICghU1NJRF9FUVVBTAorCQkgICAgKHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCisJCSAgICAgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKSkgeworCQkJLyogKi8KKwkJCS8qIERpZmZlcmVudCBTU0lEIG1lYW5zIG5vdCBSb2FtaW5nIGNhc2UsIHNvIHdlIGxldCBMaW5rRG93bigpIHRvIEluZGljYXRlIGEgZGlzY29ubmVjdCBldmVudC4gKi8KKwkJCS8qICovCiAJCQlwQWQtPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBUUlVFOwogCQl9Ci0JCS8vIGNhc2UgMi4gYWN0aXZlIElORlJBIGFzc29jaWF0aW9uIGV4aXN0ZW50Ci0JCS8vICAgIHJvYW1pbmcgaXMgZG9uZSB3aXRoaW4gbWluaXBvcnQgZHJpdmVyLCBub3RoaW5nIHRvIGRvIHdpdGggY29uZmlndXJhdGlvbgotCQkvLyAgICB1dGlsaXR5LiBzbyB1cG9uIGEgbmV3IFNFVChPSURfODAyXzExX1NTSUQpIGlzIHJlY2VpdmVkLCB3ZSBqdXN0Ci0JCS8vICAgIGRpc2Fzc29jaWF0ZSB3aXRoIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAsCi0JCS8vICAgIHRoZW4gcGVyZm9ybSBhIG5ldyBhc3NvY2lhdGlvbiB3aXRoIHRoaXMgbmV3IFNTSUQsIG5vIG1hdHRlciB0aGUKLQkJLy8gICAgbmV3L29sZCBTU0lEIGFyZSB0aGUgc2FtZSBvciBub3QuCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQLi4uXG4iKSk7Ci0JCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQkvKiBjYXNlIDIuIGFjdGl2ZSBJTkZSQSBhc3NvY2lhdGlvbiBleGlzdGVudCAqLworCQkvKiAgICByb2FtaW5nIGlzIGRvbmUgd2l0aGluIG1pbmlwb3J0IGRyaXZlciwgbm90aGluZyB0byBkbyB3aXRoIGNvbmZpZ3VyYXRpb24gKi8KKwkJLyogICAgdXRpbGl0eS4gc28gdXBvbiBhIG5ldyBTRVQoT0lEXzgwMl8xMV9TU0lEKSBpcyByZWNlaXZlZCwgd2UganVzdCAqLworCQkvKiAgICBkaXNhc3NvY2lhdGUgd2l0aCB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQLCAqLworCQkvKiAgICB0aGVuIHBlcmZvcm0gYSBuZXcgYXNzb2NpYXRpb24gd2l0aCB0aGlzIG5ldyBTU0lELCBubyBtYXR0ZXIgdGhlICovCisJCS8qICAgIG5ldy9vbGQgU1NJRCBhcmUgdGhlIHNhbWUgb3Igbm90LiAqLworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQLi4uXG4iKSk7CisJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJCSBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOwogCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKLQkJCQkJc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7CisJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSksICZEaXNhc3NvY1JlcSk7CiAJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChBREhPQ19PTihwQWQpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZHJvcCBjdXJyZW50IEFESE9DXG4iKSk7CisJfSBlbHNlIHsKKwkJaWYgKEFESE9DX09OKHBBZCkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkcm9wIGN1cnJlbnQgQURIT0NcbiIpKTsKIAkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOwotCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLAorCQkJCQkgICAgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwogCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKIAkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0gICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6TkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBDIVxuIikpOworCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNudGxPaWRTc2lkUHJvYygpOk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQyFcbiIpKTsKIAkJfQogCiAJCWlmICgocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPT0gMCkgJiYKLQkJCShwQWQtPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9PSBUUlVFKSAmJgotCQkJKHBBZC0+TWxtZUF1eC5Cc3NUeXBlID09IEJTU19JTkZSQSkgJiYKLQkJCShNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbikgPT0gVFJVRSkKLQkJCSkKLQkJewotCQkJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgICAgICAgU2NhblJlcTsKKwkJICAgIChwQWQtPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9PSBUUlVFKSAmJgorCQkgICAgKHBBZC0+TWxtZUF1eC5Cc3NUeXBlID09IEJTU19JTkZSQSkgJiYKKwkJICAgIChNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbikKKwkJICAgICA9PSBUUlVFKQorCQkgICAgKSB7CisJCQlzdHJ1Y3QgcnRfbWxtZV9zY2FuX3JlcSBTY2FuUmVxOwogCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gTm8gbWF0Y2hpbmcgQlNTLCBzdGFydCBhIG5ldyBzY2FuXG4iKSk7Ci0JCQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBCU1NfQU5ZLCBTQ0FOX0FDVElWRSk7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKLQkJCS8vIFJlc2V0IE1pc3NlZCBzY2FuIG51bWJlcgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIE5vIG1hdGNoaW5nIEJTUywgc3RhcnQgYSBuZXcgc2NhblxuIikpOworCQkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIChjaGFyICopcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJICAgICBwQWQtPk1sbWVBdXguU3NpZExlbiwgQlNTX0FOWSwKKwkJCQkgICAgIFNDQU5fQUNUSVZFKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3NjYW5fcmVxKSwgJlNjYW5SZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9CisJCQkgICAgQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisJCQkvKiBSZXNldCBNaXNzZWQgc2NhbiBudW1iZXIgKi8KIAkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCXBBZC0+TWxtZUF1eC5Cc3NJZHggPSAwOwogCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CiAJCX0KIAl9CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgpAQCAtNTA2LDE2NSArNTA1LDE5NiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIENudGxPaWRSVEJzc2lkUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKQordm9pZCBDbnRsT2lkUlRCc3NpZFByb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVMT05HICAgICAgIEJzc0lkeDsKLQlQVUNIQVIgICAgICBwT2lkQnNzaWQgPSAoUFVDSEFSKUVsZW0tPk1zZzsKLQlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICAgRGlzYXNzb2NSZXE7Ci0JTUxNRV9KT0lOX1JFUV9TVFJVQ1QgICAgICAgIEpvaW5SZXE7CisJdW5zaWduZWQgbG9uZyBCc3NJZHg7CisJdTggKnBPaWRCc3NpZCA9ICh1OCAqKUVsZW0tPk1zZzsKKwlzdHJ1Y3QgcnRfbWxtZV9kaXNhc3NvY19yZXEgRGlzYXNzb2NSZXE7CisJc3RydWN0IHJ0X21sbWVfam9pbl9yZXEgSm9pblJlcTsKIAotCS8vIHJlY29yZCB1c2VyIGRlc2lyZWQgc2V0dGluZ3MKKwkvKiByZWNvcmQgdXNlciBkZXNpcmVkIHNldHRpbmdzICovCiAJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIHBPaWRCc3NpZCk7CiAJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBwQWQtPlN0YUNmZy5Cc3NUeXBlOwogCi0JLy8KLQkvLyBVcGRhdGUgUmVjb25uZWN0IFNzaWQsIHRoYXQgdXNlciBkZXNpcmVkIHRvIGNvbm5lY3QuCi0JLy8KLQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7Ci0JcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gcEFkLT5NbG1lQXV4LlNzaWRMZW47Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOwotCi0JLy8gZmluZCB0aGUgZGVzaXJlZCBCU1MgaW4gdGhlIGxhdGVzdCBTQ0FOIHJlc3VsdCB0YWJsZQorCS8qIGZpbmQgdGhlIGRlc2lyZWQgQlNTIGluIHRoZSBsYXRlc3QgU0NBTiByZXN1bHQgdGFibGUgKi8KIAlCc3NJZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwT2lkQnNzaWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKLQlpZiAoQnNzSWR4ID09IEJTU19OT1RfRk9VTkQpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQlNTSUQgbm90IGZvdW5kLiByZXBseSBORElTX1NUQVRVU19OT1RfQUNDRVBURURcbiIpKTsKLQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwlpZiAoQnNzSWR4ID09IEJTU19OT1RfRk9VTkQpIHsKKwkJc3RydWN0IHJ0X21sbWVfc2Nhbl9yZXEgU2NhblJlcTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkNOVEwgLSBCU1NJRCBub3QgZm91bmQuIHJlcGx5IE5ESVNfU1RBVFVTX05PVF9BQ0NFUFRFRFxuIikpOworCQkvKnBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7ICovCisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJDTlRMIC0gQlNTSUQgbm90IGZvdW5kLiBzdGFydCBhIG5ldyBzY2FuXG4iKSk7CisJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCAoY2hhciAqKXBBZC0+TWxtZUF1eC5Tc2lkLAorCQkJICAgICBwQWQtPk1sbWVBdXguU3NpZExlbiwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3NjYW5fcmVxKSwgJlNjYW5SZXEpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisJCS8qIFJlc2V0IE1pc3NlZCBzY2FuIG51bWJlciAqLworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUpOwogCQlyZXR1cm47CiAJfQorCS8qICovCisJLyogVXBkYXRlIFJlY29ubmVjdCBTc2lkLCB0aGF0IHVzZXIgZGVzaXJlZCB0byBjb25uZWN0LiAqLworCS8qICovCisJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiA9CisJICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWRMZW47CisJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLAorCQkgICAgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZCwKKwkJICAgICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWRMZW4pOwogCi0JLy8gY29weSB0aGUgbWF0Y2hlZCBCU1MgZW50cnkgZnJvbSBTY2FuVGFiIHRvIE1sbWVBdXguU3NpZEJzc1RhYi4gV2h5PwotCS8vIEJlY2F1c2Ugd2UgbmVlZCB0aGlzIGVudHJ5IHRvIGJlY29tZSB0aGUgSk9JTiB0YXJnZXQgaW4gbGF0ZXIgb24gU1lOQyBzdGF0ZSBtYWNoaW5lCisJLyogY29weSB0aGUgbWF0Y2hlZCBCU1MgZW50cnkgZnJvbSBTY2FuVGFiIHRvIE1sbWVBdXguU3NpZEJzc1RhYi4gV2h5PyAqLworCS8qIEJlY2F1c2Ugd2UgbmVlZCB0aGlzIGVudHJ5IHRvIGJlY29tZSB0aGUgSk9JTiB0YXJnZXQgaW4gbGF0ZXIgb24gU1lOQyBzdGF0ZSBtYWNoaW5lICovCiAJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7CiAJcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPSAxOwotCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXSwgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLAorCQkgICAgICAgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLCBzaXplb2Yoc3RydWN0IHJ0X2Jzc19lbnRyeSkpOwogCi0JLy8gMjAwMi0xMS0yNiBza2lwIHRoZSBmb2xsb3dpbmcgY2hlY2tpbmcuIGkuZS4gaWYgdXNlciB3YW50cyB0byByZS1jb25uZWN0IHRvIHNhbWUgQVAKLQkvLyAgIHdlIGp1c3QgZm9sbG93IG5vcm1hbCBwcm9jZWR1cmUuIFRoZSByZWFzb24gb2YgdXNlciBkb2luZyB0aGlzIG1heSBiZWNhdXNlIGhlL3NoZSBjaGFuZ2VkCi0JLy8gICBBUCB0byBhbm90aGVyIGNoYW5uZWwsIGJ1dCB3ZSBzdGlsbCByZWNlaXZlZCBCRUFDT04gZnJvbSBpdCB0aHVzIGRvbid0IGNsYWltIExpbmsgRG93bi4KLQkvLyAgIFNpbmNlIHVzZXIga25vd3MgaGUncyBjaGFuZ2VkIEFQIGNoYW5uZWwsIGhlJ2xsIHJlLWNvbm5lY3QgYWdhaW4uIEJ5IHNraXBwaW5nIHRoZSBmb2xsb3dpbmcKLQkvLyAgIGNoZWNraW5nLCB3ZSdsbCBkaXNhc3NvY2lhdGUgdGhlbiByZS1kbyBub3JtYWwgYXNzb2NpYXRpb24gd2l0aCB0aGlzIEFQIGF0IHRoZSBuZXcgY2hhbm5lbC4KLQkvLyAyMDAzLTEtNiBSZS1lbmFibGUgdGhpcyBmZWF0dXJlIGJhc2VkIG9uIG1pY3Jvc29mdCByZXF1aXJlbWVudCB3aGljaCBwcmVmZXIgbm90IHRvIHJlLWRvCi0JLy8gICBjb25uZWN0aW9uIHdoZW4gc2V0dGluZyB0aGUgc2FtZSBCU1NJRC4KLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmCi0JCU1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwT2lkQnNzaWQpKQorCS8qIEFkZCBTU0lEIGludG8gTWxtZUF1eCBmb3Igc2l0ZSBzdXJleSBqb2luaW5nIGhpZGRlbiBTU0lEICovCisJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5Tc2lkTGVuOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5Tc2lkLAorCQkgICAgICAgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCiAJewotCQkvLyBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUgc2FtZSBCU1NJRCwgZ28gYmFjayB0byBpZGxlIHN0YXRlIGRpcmVjdGx5Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBhbHJlYWR5IGluIHRoaXMgQlNTSUQuIGlnbm9yZSB0aGlzIFNFVF9CU1NJRCByZXF1ZXN0XG4iKSk7Ci0JCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7Ci0KLSAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwotCi0gICAgICAgICAgICB9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChJTkZSQV9PTihwQWQpKQotCQl7Ci0JCQkvLyBkaXNhc3NvYyBmcm9tIGN1cnJlbnQgQVAgZmlyc3QKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQIC4uLlxuIikpOwotCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKLQkJCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCQlpZiAoSU5GUkFfT04ocEFkKSkgeworCQkJLyogZGlzYXNzb2MgZnJvbSBjdXJyZW50IEFQIGZpcnN0ICovCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUCAuLi5cbiIpKTsKKwkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsCisJCQkJCSBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJCQkJIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsCisJCQkJICAgIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSksCisJCQkJICAgICZEaXNhc3NvY1JlcSk7CiAKIAkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoQURIT0NfT04ocEFkKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gZHJvcCBjdXJyZW50IEFESE9DXG4iKSk7CisJCX0gZWxzZSB7CisJCQlpZiAoQURIT0NfT04ocEFkKSkgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJDTlRMIC0gZHJvcCBjdXJyZW50IEFESE9DXG4iKSk7CiAJCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0JCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKLQkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLAorCQkJCQkJICAgIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9CisJCQkJICAgIE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOwogCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0gICAgICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEMhXG4iKSk7CisJCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBDIVxuIikpOwogCQkJfQotCi0JCQkvLyBDaGFuZ2UgdGhlIHdlcHN0YXR1cyB0byBvcmlnaW5hbCB3ZXBzdGF0dXMKLQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKLQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKKwkJCS8qIENoYW5nZSB0aGUgd2Vwc3RhdHVzIHRvIG9yaWdpbmFsIHdlcHN0YXR1cyAqLworCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKKwkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOwogCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOwogCi0JCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCi0JCQkvLyBTZXQgdGhlIFBhaXJ3aXNlIGFuZCBHcm91cCBjaXBoZXIgdG8gbWF0Y2ggdGhlIGludGVuZGVkIEFQIHNldHRpbmcKLQkJCS8vIFdlIGNhbiBvbmx5IGNvbm5lY3QgdG8gQVAgd2l0aCBsZXNzIHNlY3VyZWQgY2lwaGVyIHNldHRpbmcKLQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKLQkJCXsKLQkJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5Hcm91cENpcGhlcjsKKwkJCS8qIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcgKi8KKwkJCS8qIFNldCB0aGUgUGFpcndpc2UgYW5kIEdyb3VwIGNpcGhlciB0byBtYXRjaCB0aGUgaW50ZW5kZWQgQVAgc2V0dGluZyAqLworCQkJLyogV2UgY2FuIG9ubHkgY29ubmVjdCB0byBBUCB3aXRoIGxlc3Mgc2VjdXJlZCBjaXBoZXIgc2V0dGluZyAqLworCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQkgICAgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkJTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkgeworCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0KKwkJCQkgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLgorCQkJCSAgICBHcm91cENpcGhlcjsKIAotCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXIpCi0JCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcjsKLQkJCQllbHNlIGlmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlckF1eDsKLQkJCQllbHNlCS8vIFRoZXJlIGlzIG5vIFBhaXJDaXBoZXIgQXV4LCBkb3duZ3JhZGUgb3VyIGNhcGFiaWxpdHkgdG8gVEtJUAotCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09CisJCQkJICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS4KKwkJCQkgICAgUGFpckNpcGhlcikKKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9CisJCQkJCSAgICBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuCisJCQkJCSAgICBQYWlyQ2lwaGVyOworCQkJCWVsc2UgaWYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS4KKwkJCQkJIFBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0KKwkJCQkJICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS4KKwkJCQkJICAgIFBhaXJDaXBoZXJBdXg7CisJCQkJZWxzZQkvKiBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAgKi8KKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9CisJCQkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJfSBlbHNlCisJCQkgICAgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorCQkJCXx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkgeworCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0KKwkJCQkgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi4KKwkJCQkgICAgR3JvdXBDaXBoZXI7CisKKwkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09CisJCQkJICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuCisJCQkJICAgIFBhaXJDaXBoZXIpCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPQorCQkJCQkgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi4KKwkJCQkJICAgIFBhaXJDaXBoZXI7CisJCQkJZWxzZSBpZiAocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi4KKwkJCQkJIFBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0KKwkJCQkJICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuCisJCQkJCSAgICBQYWlyQ2lwaGVyQXV4OworCQkJCWVsc2UJLyogVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQICovCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPQorCQkJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKworCQkJCS8qIFJTTiBjYXBhYmlsaXR5ICovCisJCQkJcEFkLT5TdGFDZmcuUnNuQ2FwYWJpbGl0eSA9CisJCQkJICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuCisJCQkJICAgIFJzbkNhcGFiaWxpdHk7CiAJCQl9Ci0JCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQkJewotCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5Hcm91cENpcGhlcjsKLQotCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyKQotCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyOwotCQkJCWVsc2UgaWYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXJBdXg7Ci0JCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKLQkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0KLQkJCQkvLyBSU04gY2FwYWJpbGl0eQotCQkJCXBBZC0+U3RhQ2ZnLlJzbkNhcGFiaWxpdHkgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlJzbkNhcGFiaWxpdHk7Ci0JCQl9Ci0KLQkJCS8vIFNldCBNaXggY2lwaGVyIGZsYWcKLQkJCXBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPSAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcikgPyBGQUxTRSA6IFRSVUU7Ci0JCQlpZiAocEFkLT5TdGFDZmcuYk1peENpcGhlciA9PSBUUlVFKQotCQkJewotCQkJCS8vIElmIG1peCBjaXBoZXIsIHJlLWJ1aWxkIFJTTklFCi0JCQkJUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIDApOwotCQkJfQotCQkJLy8gTm8gYWN0aXZlIGFzc29jaWF0aW9uLCBqb2luIHRoZSBCU1MgaW1tZWRpYXRlbHkKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBqb2luaW5nICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IC4uLlxuIiwKLQkJCQlwT2lkQnNzaWRbMF0scE9pZEJzc2lkWzFdLHBPaWRCc3NpZFsyXSxwT2lkQnNzaWRbM10scE9pZEJzc2lkWzRdLHBPaWRCc3NpZFs1XSkpOworCQkJLyogU2V0IE1peCBjaXBoZXIgZmxhZyAqLworCQkJcEFkLT5TdGFDZmcuYk1peENpcGhlciA9CisJCQkgICAgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0KKwkJCSAgICAgcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIpID8gRkFMU0UgOiBUUlVFOworCQkJLyppZiAocEFkLT5TdGFDZmcuYk1peENpcGhlciA9PSBUUlVFKQorCQkJICAgeworCQkJICAgLy8gSWYgbWl4IGNpcGhlciwgcmUtYnVpbGQgUlNOSUUKKwkJCSAgIFJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCAwKTsKKwkJCSAgIH0gKi8KKwkJCS8qIE5vIGFjdGl2ZSBhc3NvY2lhdGlvbiwgam9pbiB0aGUgQlNTIGltbWVkaWF0ZWx5ICovCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDTlRMIC0gam9pbmluZyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAuLi5cbiIsCisJCQkJICBwT2lkQnNzaWRbMF0sIHBPaWRCc3NpZFsxXSwgcE9pZEJzc2lkWzJdLAorCQkJCSAgcE9pZEJzc2lkWzNdLCBwT2lkQnNzaWRbNF0sIHBPaWRCc3NpZFs1XSkpOwogCiAJCQlKb2luUGFybUZpbGwocEFkLCAmSm9pblJlcSwgcEFkLT5NbG1lQXV4LkJzc0lkeCk7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfSk9JTl9SRVEsIHNpemVvZihNTE1FX0pPSU5fUkVRX1NUUlVDVCksICZKb2luUmVxKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9KT0lOX1JFUSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2pvaW5fcmVxKSwgJkpvaW5SZXEpOwogCiAJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0pPSU47CiAJCX0KIAl9CiB9CiAKLS8vIFJvYW1pbmcgaXMgdGhlIG9ubHkgZXh0ZXJuYWwgcmVxdWVzdCB0cmlnZ2VyaW5nIENOVEwgc3RhdGUgbWFjaGluZQotLy8gZGVzcGl0ZSBvZiBvdGhlciAiU0VUIE9JRCIgb3BlcmF0aW9uLiBBbGwgIlNFVCBPSUQiIHJlbGF0ZWQgb2VyYXRpb25zCi0vLyBoYXBwZW4gaW4gc2VxdWVuY2UsIGJlY2F1c2Ugbm8gb3RoZXIgU0VUIE9JRCB3aWxsIGJlIHNlbnQgdG8gdGhpcyBkZXZpY2UKLS8vIHVudGlsIHRoZSB0aGUgcHJldmlvdXMgU0VUIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSAoc3VjY2Vzc2Z1bCBvIGZhaWxlZCkuCi0vLyBTbywgaG93IGRvIHdlIHF1YXJhbnRlZSB0aGlzIFJPQU1JTkcgcmVxdWVzdCB3b24ndCBjb3JydXB0IG90aGVyICJTRVQgT0lEIj8KLS8vIG9yIGJlZW4gY29ycnVwdGVkIGJ5IG90aGVyICJTRVQgT0lEIj8KLS8vCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgQ250bE1sbWVSb2FtaW5nUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCisvKiBSb2FtaW5nIGlzIHRoZSBvbmx5IGV4dGVybmFsIHJlcXVlc3QgdHJpZ2dlcmluZyBDTlRMIHN0YXRlIG1hY2hpbmUgKi8KKy8qIGRlc3BpdGUgb2Ygb3RoZXIgIlNFVCBPSUQiIG9wZXJhdGlvbi4gQWxsICJTRVQgT0lEIiByZWxhdGVkIG9lcmF0aW9ucyAqLworLyogaGFwcGVuIGluIHNlcXVlbmNlLCBiZWNhdXNlIG5vIG90aGVyIFNFVCBPSUQgd2lsbCBiZSBzZW50IHRvIHRoaXMgZGV2aWNlICovCisvKiB1bnRpbCB0aGUgdGhlIHByZXZpb3VzIFNFVCBvcGVyYXRpb24gaXMgY29tcGxldGUgKHN1Y2Nlc3NmdWwgbyBmYWlsZWQpLiAqLworLyogU28sIGhvdyBkbyB3ZSBxdWFyYW50ZWUgdGhpcyBST0FNSU5HIHJlcXVlc3Qgd29uJ3QgY29ycnVwdCBvdGhlciAiU0VUIE9JRCI/ICovCisvKiBvciBiZWVuIGNvcnJ1cHRlZCBieSBvdGhlciAiU0VUIE9JRCI/ICovCisvKiAqLworLyogSVJRTCA9IERJU1BBVENIX0xFVkVMICovCit2b2lkIENudGxNbG1lUm9hbWluZ1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCS8vIFRPRE86Ci0JLy8gQVAgaW4gZGlmZmVyZW50IGNoYW5uZWwgbWF5IHNob3cgbG93ZXIgUlNTSSB0aGFuIGFjdHVhbCB2YWx1ZT8/Ci0JLy8gc2hvdWxkIHdlIGFkZCBhIHdlaWdodGluZyBmYWN0b3IgdG8gY29tcGVuc2F0ZSBpdD8KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBSb2FtaW5nIGluIE1sbWVBdXguUm9hbVRhYi4uLlxuIikpOworCXU4IEJCUFZhbHVlID0gMDsKIAotCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYiwgJnBBZC0+TWxtZUF1eC5Sb2FtVGFiLCBzaXplb2YocEFkLT5NbG1lQXV4LlJvYW1UYWIpKTsKLQlwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciA9IHBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc05yOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBSb2FtaW5nIGluIE1sbWVBdXguUm9hbVRhYi4uLlxuIikpOwogCi0JQnNzVGFibGVTb3J0QnlSc3NpKCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYik7Ci0JcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7Ci0JSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJeworCQkvKkxldCBCQlAgcmVnaXN0ZXIgYXQgMjBNSHogdG8gZG8gKGZhc3QpIHJvYW1pbmcuICovCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJQkJQVmFsdWUgJj0gKH4weDE4KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYiwgJnBBZC0+TWxtZUF1eC5Sb2FtVGFiLAorCQkJICAgICAgIHNpemVvZihwQWQtPk1sbWVBdXguUm9hbVRhYikpOworCQlwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciA9IHBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc05yOworCisJCUJzc1RhYmxlU29ydEJ5UnNzaSgmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIpOworCQlwQWQtPk1sbWVBdXguQnNzSWR4ID0gMDsKKwkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJfQogfQogCiAvKgpAQCAtNjc1LDM0ICs3MDUsMzUgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBDbnRsV2FpdERpc2Fzc29jUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIENudGxXYWl0RGlzYXNzb2NQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgICAgIFN0YXJ0UmVxOworCXN0cnVjdCBydF9tbG1lX3N0YXJ0X3JlcSBTdGFydFJlcTsKIAotCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9ESVNBU1NPQ19DT05GKQotCXsKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfRElTQVNTT0NfQ09ORikgewogCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gRGlzLWFzc29jaWF0ZSBzdWNjZXNzZnVsXG4iKSk7CiAKLQkgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQl7Ci0JCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19ESVNBU1NPQ19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpIHsKKwkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RJU0FTU09DX0VWRU5UX0ZMQUcsCisJCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uCisJCQkJCSAgICAgIEFkZHIsIEJTUzAsIDApOwogCQl9CiAKIAkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CiAKLQkJLy8gY2FzZSAxLiBubyBtYXRjaGluZyBCU1MsIGFuZCB1c2VyIHdhbnRzIEFESE9DLCBzbyB3ZSBqdXN0IHN0YXJ0IGEgbmV3IG9uZQotCQlpZiAoKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yPT0wKSAmJiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gTm8gbWF0Y2hpbmcgQlNTLCBzdGFydCBhIG5ldyBBREhPQyAoU3NpZD0lcykuLi5cbiIscEFkLT5NbG1lQXV4LlNzaWQpKTsKLQkJCVN0YXJ0UGFybUZpbGwocEFkLCAmU3RhcnRSZXEsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU1RBUlRfUkVRLCBzaXplb2YoTUxNRV9TVEFSVF9SRVFfU1RSVUNUKSwgJlN0YXJ0UmVxKTsKKwkJLyogY2FzZSAxLiBubyBtYXRjaGluZyBCU1MsIGFuZCB1c2VyIHdhbnRzIEFESE9DLCBzbyB3ZSBqdXN0IHN0YXJ0IGEgbmV3IG9uZSAqLworCQlpZiAoKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yID09IDApCisJCSAgICAmJiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDTlRMIC0gTm8gbWF0Y2hpbmcgQlNTLCBzdGFydCBhIG5ldyBBREhPQyAoU3NpZD0lcykuLi5cbiIsCisJCQkJICBwQWQtPk1sbWVBdXguU3NpZCkpOworCQkJU3RhcnRQYXJtRmlsbChwQWQsICZTdGFydFJlcSwgKGNoYXIgKilwQWQtPk1sbWVBdXguU3NpZCwKKwkJCQkgICAgICBwQWQtPk1sbWVBdXguU3NpZExlbik7CisJCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU1RBUlRfUkVRLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfc3RhcnRfcmVxKSwgJlN0YXJ0UmVxKTsKIAkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfU1RBUlQ7CiAJCX0KLQkJLy8gY2FzZSAyLiB0cnkgZWFjaCBtYXRjaGVkIEJTUwotCQllbHNlCi0JCXsKKwkJLyogY2FzZSAyLiB0cnkgZWFjaCBtYXRjaGVkIEJTUyAqLworCQllbHNlIHsKIAkJCXBBZC0+TWxtZUF1eC5Cc3NJZHggPSAwOwogCiAJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKQEAgLTcxOCw3NCArNzQ5LDgxIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgQ250bFdhaXRKb2luUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIENudGxXYWl0Sm9pblByb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVTSE9SVCAgICAgICAgICAgICAgICAgICAgICBSZWFzb247Ci0JTUxNRV9BVVRIX1JFUV9TVFJVQ1QgICAgICAgIEF1dGhSZXE7CisJdTE2IFJlYXNvbjsKKwlzdHJ1Y3QgcnRfbWxtZV9hdXRoX3JlcSBBdXRoUmVxOwogCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0pPSU5fQ09ORikKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOwotCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKLQkJewotCQkJLy8gMS4gam9pbmVkIGFuIElCU1MsIHdlIGFyZSBwcmV0dHkgbXVjaCBkb25lIGhlcmUKLQkJCWlmIChwQWQtPk1sbWVBdXguQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCQl7Ci0JCQkgICAgLy8KLQkJCQkvLyA1RyBiYW5kcyBydWxlcyBvZiBKYXBhbjoKLQkJCQkvLyBBZCBob2MgbXVzdCBiZSBkaXNhYmxlZCBpbiBXNTMoY2g1Miw1Niw2MCw2NCkgY2hhbm5lbHMuCi0JCQkJLy8KLQkJCQlpZiAoIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgotICAgICAgICAgICAgICAgICAgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJCQkgICApCi0JCQkJewotCQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQ2hhbm5lbD0lZCwgSm9pbiBhZGhvYyBvbiBXNTMoNTIsNTYsNjAsNjQpIENoYW5uZWxzIGFyZSBub3QgYWNjZXB0ZWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfSk9JTl9DT05GKSB7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKHUxNikpOworCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykgeworCQkJLyogMS4gam9pbmVkIGFuIElCU1MsIHdlIGFyZSBwcmV0dHkgbXVjaCBkb25lIGhlcmUgKi8KKwkJCWlmIChwQWQtPk1sbWVBdXguQnNzVHlwZSA9PSBCU1NfQURIT0MpIHsKKwkJCQkvKiAqLworCQkJCS8qIDVHIGJhbmRzIHJ1bGVzIG9mIEphcGFuOiAqLworCQkJCS8qIEFkIGhvYyBtdXN0IGJlIGRpc2FibGVkIGluIFc1MyhjaDUyLDU2LDYwLDY0KSBjaGFubmVscy4gKi8KKwkJCQkvKiAqLworCQkJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYKKwkJCQkgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLAorCQkJCQkJICAgICAgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQkgICAgKSB7CisJCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPQorCQkJCQkgICAgQ05UTF9JRExFOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIkNOVEwgLSBDaGFubmVsPSVkLCBKb2luIGFkaG9jIG9uIFc1Myg1Miw1Niw2MCw2NCkgQ2hhbm5lbHMgYXJlIG5vdCBhY2NlcHRlZFxuIiwKKwkJCQkJCSAgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwogCQkJCQlyZXR1cm47CiAJCQkJfQogCiAJCQkJTGlua1VwKHBBZCwgQlNTX0FESE9DKTsKIAkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBqb2luIHRoZSBJQlNTID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAotCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzBdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAotCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzNdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIkNOVEwgLSBqb2luIHRoZSBJQlNTID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAorCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzBdLAorCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLAorCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAorCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzNdLAorCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLAorCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKSk7CiAKLSAgICAgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOworCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0KKwkJCQkgICAgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CiAJCQl9Ci0JCQkvLyAyLiBqb2luZWQgYSBuZXcgSU5GUkEgbmV0d29yaywgc3RhcnQgZnJvbSBhdXRoZW50aWNhdGlvbgotCQkJZWxzZQotCQkJeworCQkJLyogMi4gam9pbmVkIGEgbmV3IElORlJBIG5ldHdvcmssIHN0YXJ0IGZyb20gYXV0aGVudGljYXRpb24gKi8KKwkJCWVsc2UgewogCQkJCXsKLQkJCQkJLy8gZWl0aGVyIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCBvciBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLCB0cnkgc2hhcmVkIGtleSBmaXJzdAotCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgfHwKLQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSkKLQkJCQkJewotCQkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKTsKKwkJCQkJLyogZWl0aGVyIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCBvciBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLCB0cnkgc2hhcmVkIGtleSBmaXJzdCAqLworCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkJCSAgICAgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJCQkgICAgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkJCQlOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSkgeworCQkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsCisJCQkJCQkJICAgICBwQWQtPk1sbWVBdXguQnNzaWQsCisJCQkJCQkJICAgICBBVVRIX01PREVfS0VZKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLAorCQkJCQkJCSAgICAgcEFkLT5NbG1lQXV4LkJzc2lkLAorCQkJCQkJCSAgICAgQVVUSF9NT0RFX09QRU4pOwogCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlT3Blbik7Ci0JCQkJCX0KKwkJCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsCisJCQkJCQkgICAgTVQyX01MTUVfQVVUSF9SRVEsCisJCQkJCQkgICAgc2l6ZW9mCisJCQkJCQkgICAgKHN0cnVjdCBydF9tbG1lX2F1dGhfcmVxKSwKKwkJCQkJCSAgICAmQXV0aFJlcSk7CiAJCQkJfQotCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BVVRIX1JFUSwKLQkJCQkJCQlzaXplb2YoTUxNRV9BVVRIX1JFUV9TVFJVQ1QpLCAmQXV0aFJlcSk7CiAKLQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FVVEg7CisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9CisJCQkJICAgIENOVExfV0FJVF9BVVRIOwogCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gMy4gZmFpbGVkLCB0cnkgbmV4dCBCU1MKKwkJfSBlbHNlIHsKKwkJCS8qIDMuIGZhaWxlZCwgdHJ5IG5leHQgQlNTICovCiAJCQlwQWQtPk1sbWVBdXguQnNzSWR4Kys7CiAJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKIAkJfQogCX0KIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CkBAIC03OTQsNzQgKzgzMiw4NiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIENudGxXYWl0U3RhcnRQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgQ250bFdhaXRTdGFydFByb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVTSE9SVCAgICAgIFJlc3VsdDsKKwl1MTYgUmVzdWx0OwogCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1NUQVJUX0NPTkYpCi0JewotCQlOZGlzTW92ZU1lbW9yeSgmUmVzdWx0LCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKLQkJaWYgKFJlc3VsdCA9PSBNTE1FX1NVQ0NFU1MpCi0JCXsKLQkJICAgIC8vCi0JCQkvLyA1RyBiYW5kcyBydWxlcyBvZiBKYXBhbjoKLQkJCS8vIEFkIGhvYyBtdXN0IGJlIGRpc2FibGVkIGluIFc1MyhjaDUyLDU2LDYwLDY0KSBjaGFubmVscy4KLQkJCS8vCi0JCQlpZiAoIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgotICAgICAgICAgICAgICAgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQkJICAgKQotCQkJeworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9TVEFSVF9DT05GKSB7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZXN1bHQsIEVsZW0tPk1zZywgc2l6ZW9mKHUxNikpOworCQlpZiAoUmVzdWx0ID09IE1MTUVfU1VDQ0VTUykgeworCQkJLyogKi8KKwkJCS8qIDVHIGJhbmRzIHJ1bGVzIG9mIEphcGFuOiAqLworCQkJLyogQWQgaG9jIG11c3QgYmUgZGlzYWJsZWQgaW4gVzUzKGNoNTIsNTYsNjAsNjQpIGNoYW5uZWxzLiAqLworCQkJLyogKi8KKwkJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYKKwkJCSAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkgICAgKSB7CiAJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQ2hhbm5lbD0lZCwgU3RhcnQgYWRob2Mgb24gVzUzKDUyLDU2LDYwLDY0KSBDaGFubmVscyBhcmUgbm90IGFjY2VwdGVkXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIkNOVEwgLSBDaGFubmVsPSVkLCBTdGFydCBhZGhvYyBvbiBXNTMoNTIsNTYsNjAsNjQpIENoYW5uZWxzIGFyZSBub3QgYWNjZXB0ZWRcbiIsCisJCQkJCSAgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwogCQkJCXJldHVybjsKIAkJCX0KLQotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKLQkJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLgorCQkJCSAgICAgICBNQ1NTZXRbMF0sIDE2KTsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpIHsKIAkJCQlOX0NoYW5uZWxDaGVjayhwQWQpOwogCQkJCVNldENvbW1vbkhUKHBBZCk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sICZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOwotCQkJCVJUTVBDaGVja0h0KHBBZCwgQlNTSURfV0NJRCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbyk7Ci0JCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBUUlVFOwotCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSwgMTYpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0sIDE2KTsKLQkJCQlDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKHBBZCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sCisJCQkJCSAgICAgICAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkpOworCQkJCVJUTVBDaGVja0h0KHBBZCwgQlNTSURfV0NJRCwKKwkJCQkJICAgICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCisJCQkJCSAgICAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKTsKKwkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9CisJCQkJICAgIFRSVUU7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uCisJCQkJCSAgICAgICBNQ1NTZXRbMF0sCisJCQkJCSAgICAgICAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LgorCQkJCQkgICAgICAgTUNTU2V0WzBdLCAxNik7CisJCQkJQ09QWV9IVFNFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRworCQkJCSAgICAocEFkKTsKIAotCQkJCWlmICgocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggID09IEJXXzQwKSAmJgotCQkJCQkocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkpCi0JCQkJewotCQkJCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKKwkJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uCisJCQkJICAgICBDaGFubmVsV2lkdGggPT0gQldfNDApCisJCQkJICAgICYmIChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLgorCQkJCQlFeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkpIHsKKwkJCQkJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0KKwkJCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOworCQkJCX0gZWxzZQorCQkJCSAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uCisJCQkJCSBDaGFubmVsV2lkdGggPT0gQldfNDApCisJCQkJCSYmIChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLgorCQkJCQkgICAgRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQkVMT1cpKSB7CisJCQkJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9CisJCQkJCSAgICBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKIAkJCQl9Ci0JCQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoICA9PSBCV180MCkgJiYKLQkJCQkJCSAocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9CRUxPVykpCi0JCQkJewotCQkJCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKwkJCX0gZWxzZSB7CisJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPQorCQkJCSAgICBGQUxTRTsKIAkJCX0KIAkJCUxpbmtVcChwQWQsIEJTU19BREhPQyk7CiAJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCQkJLy8gQmVmb3JlIHNlbmQgYmVhY29uLCBkcml2ZXIgbmVlZCBkbyByYWRhciBkZXRlY3Rpb24KLQkJCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0ICkKLQkJCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKLQkJCQkmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKQotCQkJewotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX1NJTEVOQ0VfTU9ERTsKKwkJCS8qIEJlZm9yZSBzZW5kIGJlYWNvbiwgZHJpdmVyIG5lZWQgZG8gcmFkYXIgZGV0ZWN0aW9uICovCisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJCSAgICAmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJCSAgICAmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKSB7CisJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0KKwkJCQkgICAgUkRfU0lMRU5DRV9NT0RFOwogCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJEQ291bnQgPSAwOwogCQkJfQogCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gc3RhcnQgYSBuZXcgSUJTUyA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IC4uLlxuIiwKLQkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsxXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsyXSwKLQkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs0XSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs1XSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIFN0YXJ0IElCU1MgZmFpbC4gQlVHISEhISFcbiIpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNOVEwgLSBzdGFydCBhIG5ldyBJQlNTID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAorCQkJCSAgcEFkLT5Db21tb25DZmcuQnNzaWRbMF0sCisJCQkJICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFsxXSwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAorCQkJCSAgcEFkLT5Db21tb25DZmcuQnNzaWRbM10sCisJCQkJICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFs0XSwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKSk7CisJCX0gZWxzZSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDTlRMIC0gU3RhcnQgSUJTUyBmYWlsLiBCVUchXG4iKSk7CiAJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwogCQl9CiAJfQpAQCAtODc1LDUyICs5MjUsNTcgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBDbnRsV2FpdEF1dGhQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgQ250bFdhaXRBdXRoUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICBSZWFzb247Ci0JTUxNRV9BU1NPQ19SRVFfU1RSVUNUICAgICAgICBBc3NvY1JlcTsKLQlNTE1FX0FVVEhfUkVRX1NUUlVDVCAgICAgICAgIEF1dGhSZXE7CisJdTE2IFJlYXNvbjsKKwlzdHJ1Y3QgcnRfbWxtZV9hc3NvY19yZXEgQXNzb2NSZXE7CisJc3RydWN0IHJ0X21sbWVfYXV0aF9yZXEgQXV0aFJlcTsKIAotCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9BVVRIX0NPTkYpCi0JewotCQlOZGlzTW92ZU1lbW9yeSgmUmVhc29uLCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKLQkJaWYgKFJlYXNvbiA9PSBNTE1FX1NVQ0NFU1MpCi0JCXsKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfQVVUSF9DT05GKSB7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKHUxNikpOworCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykgewogCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggT0tcbiIpKTsKLQkJCUFzc29jUGFybUZpbGwocEFkLCAmQXNzb2NSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvLAotCQkJCQkJICBBU1NPQ19USU1FT1VULCBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOworCQkJQXNzb2NQYXJtRmlsbChwQWQsICZBc3NvY1JlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLAorCQkJCSAgICAgIHBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbywKKwkJCQkgICAgICBBU1NPQ19USU1FT1VULAorCQkJCSAgICAgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCk7CiAKIAkJCXsKLQkJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FTU09DX1JFUSwKLQkJCQkJCQlzaXplb2YoTUxNRV9BU1NPQ19SRVFfU1RSVUNUKSwgJkFzc29jUmVxKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsCisJCQkJCSAgICBNVDJfTUxNRV9BU1NPQ19SRVEsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfYXNzb2NfcmVxKSwKKwkJCQkJICAgICZBc3NvY1JlcSk7CiAKLQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FTU09DOworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPQorCQkJCSAgICBDTlRMX1dBSVRfQVNTT0M7CiAJCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBUaGlzIGZhaWwgbWF5IGJlY2F1c2Ugb2YgdGhlIEFQIGFscmVhZHkga2VlcCB1cyBpbiBpdHMgTUFDIHRhYmxlIHdpdGhvdXQKLQkJCS8vIGFnZWluZy1vdXQuIFRoZSBwcmV2aW91cyBhdXRoZW50aWNhdGlvbiBhdHRlbXB0IG11c3QgaGF2ZSBsZXQgaXQgcmVtb3ZlIHVzLgotCQkJLy8gc28gdHJ5IEF1dGhlbnRpY2F0aW9uIGFnYWluIG1heSBoZWxwLiBGb3IgRC1MaW5rIERXTC05MDBBUCsgY29tcGF0aWJpbGl0eS4KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIEZBSUwsIHRyeSBhZ2Fpbi4uLlxuIikpOworCQl9IGVsc2UgeworCQkJLyogVGhpcyBmYWlsIG1heSBiZWNhdXNlIG9mIHRoZSBBUCBhbHJlYWR5IGtlZXAgdXMgaW4gaXRzIE1BQyB0YWJsZSB3aXRob3V0ICovCisJCQkvKiBhZ2Vpbmctb3V0LiBUaGUgcHJldmlvdXMgYXV0aGVudGljYXRpb24gYXR0ZW1wdCBtdXN0IGhhdmUgbGV0IGl0IHJlbW92ZSB1cy4gKi8KKwkJCS8qIHNvIHRyeSBBdXRoZW50aWNhdGlvbiBhZ2FpbiBtYXkgaGVscC4gRm9yIEQtTGluayBEV0wtOTAwQVArIGNvbXBhdGliaWxpdHkuICovCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDTlRMIC0gQVVUSCBGQUlMLCB0cnkgYWdhaW4uLi5cbiIpKTsKIAogCQkJewotCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSB8fAotCQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkpCi0JCQkJewotCQkJCQkvLyBlaXRoZXIgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkIG9yIE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gsIHRyeSBzaGFyZWQga2V5IGZpcnN0Ci0JCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCk7CisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCSAgICAgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJCSAgICB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCQkJTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkpIHsKKwkJCQkJLyogZWl0aGVyIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCBvciBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLCB0cnkgc2hhcmVkIGtleSBmaXJzdCAqLworCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwKKwkJCQkJCSAgICAgcEFkLT5NbG1lQXV4LkJzc2lkLAorCQkJCQkJICAgICBBVVRIX01PREVfS0VZKTsKKwkJCQl9IGVsc2UgeworCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwKKwkJCQkJCSAgICAgcEFkLT5NbG1lQXV4LkJzc2lkLAorCQkJCQkJICAgICBBVVRIX01PREVfT1BFTik7CiAJCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pOwotCQkJCX0KLQkJCX0KLQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BVVRIX1JFUSwKLQkJCQkJCXNpemVvZihNTE1FX0FVVEhfUkVRX1NUUlVDVCksICZBdXRoUmVxKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwKKwkJCQkJICAgIE1UMl9NTE1FX0FVVEhfUkVRLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2F1dGhfcmVxKSwKKwkJCQkJICAgICZBdXRoUmVxKTsKIAorCQkJfQogCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BVVRIMjsKIAkJfQogCX0KQEAgLTkzNCw0NCArOTg5LDQ5IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgQ250bFdhaXRBdXRoUHJvYzIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBDbnRsV2FpdEF1dGhQcm9jMihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICBSZWFzb247Ci0JTUxNRV9BU1NPQ19SRVFfU1RSVUNUICAgICAgICBBc3NvY1JlcTsKLQlNTE1FX0FVVEhfUkVRX1NUUlVDVCAgICAgICAgIEF1dGhSZXE7CisJdTE2IFJlYXNvbjsKKwlzdHJ1Y3QgcnRfbWxtZV9hc3NvY19yZXEgQXNzb2NSZXE7CisJc3RydWN0IHJ0X21sbWVfYXV0aF9yZXEgQXV0aFJlcTsKIAotCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9BVVRIX0NPTkYpCi0JewotCQlOZGlzTW92ZU1lbW9yeSgmUmVhc29uLCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKLQkJaWYgKFJlYXNvbiA9PSBNTE1FX1NVQ0NFU1MpCi0JCXsKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfQVVUSF9DT05GKSB7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKHUxNikpOworCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykgewogCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggT0tcbiIpKTsKLQkJCUFzc29jUGFybUZpbGwocEFkLCAmQXNzb2NSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvLAotCQkJCQkJICBBU1NPQ19USU1FT1VULCBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOwotCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BU1NPQ19SRVEsCi0JCQkJCQlzaXplb2YoTUxNRV9BU1NPQ19SRVFfU1RSVUNUKSwgJkFzc29jUmVxKTsKLQotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BU1NPQzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkgJiYKLQkJCQkgKHBBZC0+TWxtZUF1eC5BbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSkKKwkJCUFzc29jUGFybUZpbGwocEFkLCAmQXNzb2NSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwKKwkJCQkgICAgICBwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8sCisJCQkJICAgICAgQVNTT0NfVElNRU9VVCwKKwkJCQkgICAgICBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOwogCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIEZBSUwsIHRyeSBPUEVOIHN5c3RlbS4uLlxuIikpOwotCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pOwotCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BVVRIX1JFUSwKLQkJCQkJCQlzaXplb2YoTUxNRV9BVVRIX1JFUV9TVFJVQ1QpLCAmQXV0aFJlcSk7CisJCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLAorCQkJCQkgICAgTVQyX01MTUVfQVNTT0NfUkVRLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Fzc29jX3JlcSksCisJCQkJCSAgICAmQXNzb2NSZXEpOwogCi0JCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BVVRIMjsKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0KKwkJCQkgICAgQ05UTF9XQUlUX0FTU09DOwogCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIG5vdCBzdWNjZXNzLCB0cnkgbmV4dCBCU1MKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBGQUlMLCBnaXZlIHVwOyB0cnkgbmV4dCBCU1NcbiIpKTsKLQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOyAvLz8/Pz8/Pz8KKwkJfSBlbHNlIHsKKwkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCSAgICAgTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkKKwkJCSAgICAmJiAocEFkLT5NbG1lQXV4LkFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpKSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIkNOVEwgLSBBVVRIIEZBSUwsIHRyeSBPUEVOIHN5c3RlbS4uLlxuIikpOworCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsCisJCQkJCSAgICAgTmRpczgwMl8xMUF1dGhNb2RlT3Blbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsCisJCQkJCSAgICBNVDJfTUxNRV9BVVRIX1JFUSwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9hdXRoX3JlcSksCisJCQkJCSAgICAmQXV0aFJlcSk7CisKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0KKwkJCQkgICAgQ05UTF9XQUlUX0FVVEgyOworCQkJfSBlbHNlIHsKKwkJCQkvKiBub3Qgc3VjY2VzcywgdHJ5IG5leHQgQlNTICovCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIkNOVEwgLSBBVVRIIEZBSUwsIGdpdmUgdXA7IHRyeSBuZXh0IEJTU1xuIikpOworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CS8qPz8/Pz8/PyAqLwogCQkJCXBBZC0+TWxtZUF1eC5Cc3NJZHgrKzsKIAkJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKIAkJCX0KQEAgLTk4NywzMCArMTA0NywzMCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIENudGxXYWl0QXNzb2NQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgQ250bFdhaXRBc3NvY1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVTSE9SVCAgICAgIFJlYXNvbjsKKwl1MTYgUmVhc29uOwogCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0FTU09DX0NPTkYpCi0JewotCQlOZGlzTW92ZU1lbW9yeSgmUmVhc29uLCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKLQkJaWYgKFJlYXNvbiA9PSBNTE1FX1NVQ0NFU1MpCi0JCXsKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfQVNTT0NfQ09ORikgeworCQlOZGlzTW92ZU1lbW9yeSgmUmVhc29uLCBFbGVtLT5Nc2csIHNpemVvZih1MTYpKTsKKwkJaWYgKFJlYXNvbiA9PSBNTE1FX1NVQ0NFU1MpIHsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkgeworCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0FTU09DX0VWRU5UX0ZMQUcsCisJCQkJCQkgICAgICBwQWQtPk1hY1RhYi4KKwkJCQkJCSAgICAgIENvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwKKwkJCQkJCSAgICAgIEJTUzAsIDApOworCQkJfQorCiAJCQlMaW5rVXAocEFkLCBCU1NfSU5GUkEpOwogCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBc3NvY2lhdGlvbiBzdWNjZXNzZnVsIG9uIEJTUyAjJWxkXG4iLHBBZC0+TWxtZUF1eC5Cc3NJZHgpKTsKLQotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQkJewotCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBub3Qgc3VjY2VzcywgdHJ5IG5leHQgQlNTCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQXNzb2NpYXRpb24gZmFpbHMgb24gQlNTICMlbGRcbiIscEFkLT5NbG1lQXV4LkJzc0lkeCkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQ05UTCAtIEFzc29jaWF0aW9uIHN1Y2Nlc3NmdWwgb24gQlNTICMlbGRcbiIsCisJCQkJICBwQWQtPk1sbWVBdXguQnNzSWR4KSk7CisJCX0gZWxzZSB7CisJCQkvKiBub3Qgc3VjY2VzcywgdHJ5IG5leHQgQlNTICovCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDTlRMIC0gQXNzb2NpYXRpb24gZmFpbHMgb24gQlNTICMlbGRcbiIsCisJCQkJICBwQWQtPk1sbWVBdXguQnNzSWR4KSk7CiAJCQlwQWQtPk1sbWVBdXguQnNzSWR4Kys7CiAJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKIAkJfQpAQCAtMTAyNSw1MiArMTA4NSw1MSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIENudGxXYWl0UmVhc3NvY1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBDbnRsV2FpdFJlYXNzb2NQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgICAgICBSZXN1bHQ7CisJdTE2IFJlc3VsdDsKIAotCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9SRUFTU09DX0NPTkYpCi0JewotCQlOZGlzTW92ZU1lbW9yeSgmUmVzdWx0LCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKLQkJaWYgKFJlc3VsdCA9PSBNTE1FX1NVQ0NFU1MpCi0JCXsKLQkJCS8vCi0JCQkvLyBORElTIHJlcXVpcmVzIGEgbmV3IExpbmsgVVAgaW5kaWNhdGlvbiBidXQgbm8gTGluayBEb3duIGZvciBSRS1BU1NPQwotCQkJLy8KKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfUkVBU1NPQ19DT05GKSB7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZXN1bHQsIEVsZW0tPk1zZywgc2l6ZW9mKHUxNikpOworCQlpZiAoUmVzdWx0ID09IE1MTUVfU1VDQ0VTUykgeworCQkJLyogc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBhc3NvY2lhdGlvbiAqLworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0FTU09DX0VWRU5UX0ZMQUcsCisJCQkJCQkgICAgICBwQWQtPk1hY1RhYi4KKwkJCQkJCSAgICAgIENvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwKKwkJCQkJCSAgICAgIEJTUzAsIDApOworCisJCQkvKiAqLworCQkJLyogTkRJUyByZXF1aXJlcyBhIG5ldyBMaW5rIFVQIGluZGljYXRpb24gYnV0IG5vIExpbmsgRG93biBmb3IgUkUtQVNTT0MgKi8KKwkJCS8qICovCiAJCQlMaW5rVXAocEFkLCBCU1NfSU5GUkEpOwogCi0JCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIGFzc29jaWF0aW9uCi0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQogCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBSZS1hc3NvY2l0aW9uIHN1Y2Nlc3NmdWwgb24gQlNTICMlbGRcbiIsIHBBZC0+TWxtZUF1eC5Sb2FtSWR4KSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyByZWFzc29jIGZhaWxlZCwgdHJ5IHRvIHBpY2sgbmV4dCBCU1MgaW4gdGhlIEJTUyBUYWJsZQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIFJlLWFzc29jaXRpb24gZmFpbHMgb24gQlNTICMlbGRcbiIsIHBBZC0+TWxtZUF1eC5Sb2FtSWR4KSk7Ci0JCQlwQWQtPk1sbWVBdXguUm9hbUlkeCsrOwotCQkJSXRlcmF0ZU9uQnNzVGFiMihwQWQpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQ05UTCAtIFJlLWFzc29jaXRpb24gc3VjY2Vzc2Z1bCBvbiBCU1MgIyVsZFxuIiwKKwkJCQkgIHBBZC0+TWxtZUF1eC5Sb2FtSWR4KSk7CisJCX0gZWxzZSB7CisJCQkvKiByZWFzc29jIGZhaWxlZCwgdHJ5IHRvIHBpY2sgbmV4dCBCU1MgaW4gdGhlIEJTUyBUYWJsZSAqLworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQ05UTCAtIFJlLWFzc29jaXRpb24gZmFpbHMgb24gQlNTICMlbGRcbiIsCisJCQkJICBwQWQtPk1sbWVBdXguUm9hbUlkeCkpOworCQkJeworCQkJCXBBZC0+TWxtZUF1eC5Sb2FtSWR4Kys7CisJCQkJSXRlcmF0ZU9uQnNzVGFiMihwQWQpOworCQkJfQogCQl9CiAJfQogfQogCi0KLSNpZmRlZiBSVDI4NzAKLVZPSUQJQWRob2NUdXJuT25Rb3MoCi0JSU4gIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBBZGhvY1R1cm5PblFvcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7CiAjZGVmaW5lIEFDMF9ERUZfVFhPUAkJMAogI2RlZmluZSBBQzFfREVGX1RYT1AJCTAKICNkZWZpbmUgQUMyX0RFRl9UWE9QCQk5NAogI2RlZmluZSBBQzNfREVGX1RYT1AJCTQ3CiAKLQkvLyBUdXJuIG9uIFFPcyBpZiB1c2UgSFQgcmF0ZS4KLQlpZiAocEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPT0gRkFMU0UpCi0JeworCS8qIFR1cm4gb24gUU9zIGlmIHVzZSBIVCByYXRlLiAqLworCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9PSBGQUxTRSkgewogCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9IFRSVUU7CiAJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMF0gPSAzOwogCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzFdID0gNzsKQEAgLTEwODcsMTQgKzExNDYsMTMgQEAKIAkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsyXSA9IDQ7CiAJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbM10gPSAzOwogCi0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFswXSAgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMV0gID0gMDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdICA9IEFDMl9ERUZfVFhPUDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzNdICA9IEFDM19ERUZfVFhPUDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzBdID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzFdID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdID0gQUMyX0RFRl9UWE9QOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbM10gPSBBQzNfREVGX1RYT1A7CiAJfQogCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKIH0KLSNlbmRpZiAvKiBSVDI4NzAgKi8KIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTEwNCwxMTAgKzExNjIsODEgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBMaW5rVXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgQnNzVHlwZSkKK3ZvaWQgTGlua1VwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQnNzVHlwZSkKIHsKLQlVTE9ORwlOb3c7Ci0JVUlOVDMyCURhdGE7Ci0JQk9PTEVBTglDYW5jZWxsZWQ7Ci0JVUNIQVIJVmFsdWUgPSAwLCBpZHg7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMLCAqcEN1cnJFbnRyeTsKKwl1bnNpZ25lZCBsb25nIE5vdzsKKwl1MzIgRGF0YTsKKwlCT09MRUFOIENhbmNlbGxlZDsKKwl1OCBWYWx1ZSA9IDAsIGlkeCA9IDAsIEhhc2hJZHggPSAwOworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5ID0gTlVMTDsKIAotI2lmZGVmIFJUMjg2MAotCWlmIChSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQpKQotCXsKLQkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfSEFMVCk7Ci0JCVJUTVB1c2VjRGVsYXkoNjAwMCk7Ci0JCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworCS8qIEluaXQgQ2hhbm5lbFF1YWxpdHkgdG8gcHJldmVudCBERUFEX0NRSSBhdCBpbml0aWFsIExpbmtVcCAqLworCXBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA9IDUwOworCisJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJaWYgKHBFbnRyeSkgeworCQlNYWNUYWJsZURlbGV0ZUVudHJ5KHBBZCwgcEVudHJ5LT5BaWQsIHBFbnRyeS0+QWRkcik7CisJCXBFbnRyeSA9IE5VTEw7CiAJfQotI2VuZGlmCiAKIAlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKIAotCS8vCi0JLy8gQVNTT0MgLSBEaXNhc3NvY1RpbWVvdXRBY3Rpb24KLQkvLyBDTlRMIC0gRGlzLWFzc29jaWF0ZSBzdWNjZXNzZnVsCi0JLy8gISEhIExJTksgRE9XTiAhISEKLQkvLyBbODg4ODhdIE9JRF84MDJfMTFfU1NJRCBzaG91bGQgaGF2ZSByZXR1cm5lZCBORFRFU1RfV0VQX0FQMihSZXR1cm5lZDogKQotCS8vCi0JLy8gVG8gcHJldmVudCBEaXNhc3NvY1RpbWVvdXRBY3Rpb24gdG8gY2FsbCBMaW5rIGRvd24gYWZ0ZXIgd2UgbGluayB1cCwKLQkvLyBjYW5jZWwgdGhlIERpc2Fzc29jVGltZXIgbm8gbWF0dGVyIHdoYXQgaXQgc3RhcnQgb3Igbm90LgotCS8vCi0JUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgICZDYW5jZWxsZWQpOworCS8qICovCisJLyogQVNTT0MgLSBEaXNhc3NvY1RpbWVvdXRBY3Rpb24gKi8KKwkvKiBDTlRMIC0gRGlzLWFzc29jaWF0ZSBzdWNjZXNzZnVsICovCisJLyogISBMSU5LIERPV04gISAqLworCS8qIFs4ODg4OF0gT0lEXzgwMl8xMV9TU0lEIHNob3VsZCBoYXZlIHJldHVybmVkIE5EVEVTVF9XRVBfQVAyKFJldHVybmVkOiApICovCisJLyogKi8KKwkvKiBUbyBwcmV2ZW50IERpc2Fzc29jVGltZW91dEFjdGlvbiB0byBjYWxsIExpbmsgZG93biBhZnRlciB3ZSBsaW5rIHVwLCAqLworCS8qIGNhbmNlbCB0aGUgRGlzYXNzb2NUaW1lciBubyBtYXR0ZXIgd2hhdCBpdCBzdGFydCBvciBub3QuICovCisJLyogKi8KKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAmQ2FuY2VsbGVkKTsKIAogCUNPUFlfU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKHBBZCk7CiAKIAlDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKHBBZCk7CiAKLQkvLyBJdCdzIHF1aXRlIGRpZmZpY3VsdCB0byB0ZWxsIGlmIGEgbmV3bHkgYWRkZWQgS0VZIGlzIFdFUCBvciBDS0lQIHVudGlsIGEgbmV3IEJTUwotCS8vIGlzIGZvcm1lZCAoZWl0aGVyIEFTU09DL1JFLUFTU09DIGRvbmUgb3IgSUJTUyBzdGFydGVkLiBMaW5rVVAgc2hvdWxkIGJlIGEgc2FmZSBwbGFjZQotCS8vIHRvIGV4YW1pbmUgaWYgY2lwaGVyIGFsZ29yaXRobSBzd2l0Y2hpbmcgaXMgcmVxdWlyZWQuCi0JLy9ydDI4NjBiLiBEb24ndCBrbm93IHdoeSBuZWVkIHRoaXMKLQlTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcChwQWQpOwotCi0jaWZkZWYgUlQyODYwCi0JLy8gQmVmb3JlIHBvd2VyIHNhdmUgYmVmb3JlIGxpbmsgdXAgZnVuY3Rpb24sIFdlIHdpbGwgZm9yY2UgdXNlIDFSLgotCS8vIFNvIGFmdGVyIGxpbmsgdXAsIGNoZWNrIFJ4IGFudGVubmEgIyBhZ2Fpbi4KKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkvKiBCZWZvcmUgcG93ZXIgc2F2ZSBiZWZvcmUgbGluayB1cCBmdW5jdGlvbiwgV2Ugd2lsbCBmb3JjZSB1c2UgMVIuICovCisJLyogU28gYWZ0ZXIgbGluayB1cCwgY2hlY2sgUnggYW50ZW5uYSAjIGFnYWluLiAqLwogCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKLQlpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCi0JeworCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpIHsKIAkJVmFsdWUgfD0gKDB4MTApOwotCX0KLQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKLQl7CisJfSBlbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpIHsKIAkJVmFsdWUgfD0gKDB4OCk7Ci0JfQotCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCXsKKwl9IGVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkgewogCQlWYWx1ZSB8PSAoMHgwKTsKIAl9CiAJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgVmFsdWUpOwogCXBBZC0+U3RhQ2ZnLkJCUFIzID0gVmFsdWU7Ci0jZW5kaWYgLyogUlQyODYwICovCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKLQlpZiAoQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JeworCWlmIChCc3NUeXBlID09IEJTU19BREhPQykgewogCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURIT0NfT04pOwogCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19JTkZSQV9PTik7CiAKLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCAgPT0gQldfNDApICYmCi0JCQkocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7Ci0JCX0KLQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAyKSAmJgotCQkJCSAocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggID09IEJXXzQwKSAmJgotCQkJCSAocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9CRUxPVykpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7Ci0JCX0KLSNpZmRlZiBSVDI4NzAKIAkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKIAkJCUFkaG9jVHVybk9uUW9zKHBBZCk7Ci0jZW5kaWYKIAotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFBZGhvYyBMSU5LIFVQICEhISBcbiIgKSk7Ci0JfQotCWVsc2UKLQl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFkaG9jIExJTksgVVAhXG4iKSk7CisJfSBlbHNlIHsKIAkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKIAkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURIT0NfT04pOwogCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIUluZnJhIExJTksgVVAgISEhIFxuIiApKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW5mcmEgTElOSyBVUCFcbiIpKTsKIAl9CiAKLQkvLyAzKjMKLQkvLyByZXNldCBUeCBiZWFtZm9ybWluZyBiaXQKKwkvKiAzKjMgKi8KKwkvKiByZXNldCBUeCBiZWFtZm9ybWluZyBiaXQgKi8KIAlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7CiAJVmFsdWUgJj0gKH4weDAxKTsKIAlWYWx1ZSB8PSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuVHhCRjsKIAlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBWYWx1ZSk7CiAKLQkvLyBDaGFuZ2UgdG8gQVAgY2hhbm5lbAotICAgIGlmICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLQl7Ci0JCS8vIE11c3QgdXNpbmcgNDBNSHouCisJLyogQ2hhbmdlIHRvIEFQIGNoYW5uZWwgKi8KKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID4gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkgICAgJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpIHsKKwkJLyogTXVzdCB1c2luZyA0ME1Iei4gKi8KIAkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CiAJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKIAkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwpAQCAtMTIxNywzNCArMTI0NiwzNSBAQAogCQlWYWx1ZSB8PSAweDEwOwogCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBWYWx1ZSk7CiAKLQkJLy8gIFJYIDogY29udHJvbCBjaGFubmVsIGF0IGxvd2VyCisJCS8qICBSWCA6IGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlciAqLwogCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZWYWx1ZSk7CiAJCVZhbHVlICY9ICh+MHgyMCk7CiAJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKLSNpZmRlZiBSVDI4NjAKLSAgICAgICAgcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKLSNlbmRpZgorI2lmZGVmIFJUTVBfTUFDX1BDSQorCQlwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZEYXRhKTsKIAkJRGF0YSAmPSAweGZmZmZmZmZlOwogCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7CiAKLQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQotCQl7CisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkgewogCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MUEpOwogCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MEEpOwogCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTYpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnQyODYwQyAhXG4iKSk7CiAJCX0KIAotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBMb3dlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgQmVsb3cuIENlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOwotCX0KLQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLSAgICB7Ci0JICAgIC8vIE11c3QgdXNpbmcgNDBNSHouCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiNDBNSHogTG93ZXIgTElOSyBVUCEgQ29udHJvbCBDaGFubmVsIGF0IEJlbG93LiBDZW50cmFsID0gJWQgXG4iLAorCQkJICBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCX0gZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJICAgJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PQorCQkgICAgICAgQldfNDApKSB7CisJCS8qIE11c3QgdXNpbmcgNDBNSHouICovCiAJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOwogCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JICAgIEFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwogCiAJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKIAkJVmFsdWUgJj0gKH4weDE4KTsKQEAgLTEyNTYsMjUgKzEyODYsMjQgQEAKIAkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIERhdGEpOwogCiAJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKLQkgICAgVmFsdWUgfD0gKDB4MjApOworCQlWYWx1ZSB8PSAoMHgyMCk7CiAJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKLSNpZmRlZiBSVDI4NjAKLSAgICAgICAgcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKLSNlbmRpZgorI2lmZGVmIFJUTVBfTUFDX1BDSQorCQlwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0JCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKLQkJeworCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApIHsKIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDFBKTsKIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDBBKTsKIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDE2KTsKLQkJCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydDI4NjBDICFcbiIpKTsKIAkJfQogCi0JICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISA0ME1IeiBVcHBlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgVXBwZXJDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkgICAgcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiNDBNSHogVXBwZXIgTElOSyBVUCEgQ29udHJvbCBDaGFubmVsIGF0IFVwcGVyQ2VudHJhbCA9ICVkIFxuIiwKKwkJCSAgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKwl9IGVsc2UgeworCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKIAkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwogCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKIAkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CkBAIC0xMjkwLDUxMSArMTMxOSw1MzMgQEAKIAkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOwogCQlWYWx1ZSAmPSAofjB4MjApOwogCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBWYWx1ZSk7Ci0jaWZkZWYgUlQyODYwCi0gICAgICAgIHBBZC0+U3RhQ2ZnLkJCUFIzID0gVmFsdWU7Ci0jZW5kaWYKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCi0JCXsKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKSB7CiAJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxNik7CiAJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwOCk7CiAJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxMSk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydDI4NjBDICFcbiIpKTsKIAkJfQogCi0JICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISAyME1IeiBMSU5LIFVQICEhISBcbiIgKSk7Ci0gICAgfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIyME1IeiBMSU5LIFVQIVxuIikpOworCX0KIAogCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcpOwotCS8vCi0JLy8gU2F2ZSBCQlBfUjY2IHZhbHVlLCBpdCB3aWxsIGJlIHVzZWQgaW4gUlRVU0JSZXN1bWVNc2R1VHJhbnNtaXNzaW9uCi0JLy8KLQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIFVQICEhISAoQnNzVHlwZT0lZCwgQUlEPSVkLCBzc2lkPSVzLCBDaGFubmVsPSVkLCBDZW50cmFsQ2hhbm5lbCA9ICVkKVxuIiwKLQkJQnNzVHlwZSwgcEFkLT5TdGFBY3RpdmUuQWlkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCS8qICovCisJLyogU2F2ZSBCQlBfUjY2IHZhbHVlLCBpdCB3aWxsIGJlIHVzZWQgaW4gUlRVU0JSZXN1bWVNc2R1VHJhbnNtaXNzaW9uICovCisJLyogKi8KKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LAorCQkJCSAgICAmcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIFVQICEhISAoRGVuc2l0eSA9JWQsIClcbiIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTXBkdURlbnNpdHkpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiTElOSyBVUCEgKEJzc1R5cGU9JWQsIEFJRD0lZCwgc3NpZD0lcywgQ2hhbm5lbD0lZCwgQ2VudHJhbENoYW5uZWwgPSAlZClcbiIsCisJCSAgQnNzVHlwZSwgcEFkLT5TdGFBY3RpdmUuQWlkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7CiAKLQkJQXNpY1NldEJzc2lkKHBBZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJMSU5LIFVQISAoRGVuc2l0eSA9JWQsIClcbiIsCisJCSAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NcGR1RGVuc2l0eSkpOworCisJQXNpY1NldEJzc2lkKHBBZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwogCiAJQXNpY1NldFNsb3RUaW1lKHBBZCwgVFJVRSk7CiAJQXNpY1NldEVkY2FQYXJtKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0pOwogCi0JLy8gQ2FsbCB0aGlzIGZvciBSVFMgcHJvdGVjdGlvbmZvciBsZWdhY3kgcmF0ZSwgd2Ugd2lsbCBhbHdheXMgZW5hYmxlIFJUUyB0aHJlc2hvbGQsIGJ1dCBub3JtYWxseSBpdCB3aWxsIG5vdCBoaXQKLQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAsIChPRkRNU0VUUFJPVEVDVCB8IENDS1NFVFBST1RFQ1QpLCBUUlVFLCBGQUxTRSk7CisJLyogQ2FsbCB0aGlzIGZvciBSVFMgcHJvdGVjdGlvbmZvciBsZWdhY3kgcmF0ZSwgd2Ugd2lsbCBhbHdheXMgZW5hYmxlIFJUUyB0aHJlc2hvbGQsIGJ1dCBub3JtYWxseSBpdCB3aWxsIG5vdCBoaXQgKi8KKwlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAsIChPRkRNU0VUUFJPVEVDVCB8IENDS1NFVFBST1RFQ1QpLCBUUlVFLAorCQkJICBGQUxTRSk7CiAKLQlpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IFRSVUUpKQotCXsKLQkJLy8gVXBkYXRlIEhUIHByb3RlY3Rpb25mb3IgYmFzZWQgb24gQVAncyBvcGVyYXRpbmcgbW9kZS4KLSAgICAJaWYgKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkKLSAgICAJewotICAgIAkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgVFJVRSk7Ci0gICAgCX0KLSAgICAJZWxzZQotICAgCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOworCWlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkpIHsKKwkJLyogVXBkYXRlIEhUIHByb3RlY3Rpb25mb3IgYmFzZWQgb24gQVAncyBvcGVyYXRpbmcgbW9kZS4gKi8KKwkJaWYgKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkgeworCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLAorCQkJCQkgIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi4KKwkJCQkJICBPcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsCisJCQkJCSAgVFJVRSk7CisJCX0gZWxzZQorCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLAorCQkJCQkgIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi4KKwkJCQkJICBPcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsCisJCQkJCSAgRkFMU0UpOwogCX0KIAotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkRyc0NvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl9EUlMpKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5EcnNDb3VudGVycywgc2l6ZW9mKHN0cnVjdCBydF9jb3VudGVyX2RycykpOwogCiAJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKLQlwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lID0gTm93OyAgIC8vIGxhc3QgUlggdGltZXN0YW1wCisJcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSA9IE5vdzsJLyogbGFzdCBSWCB0aW1lc3RhbXAgKi8KIAogCWlmICgocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSAhPSBSdDgwMl8xMVByZWFtYmxlTG9uZykgJiYKLQkJQ0FQX0lTX1NIT1JUX1BSRUFNQkxFX09OKHBBZC0+U3RhQWN0aXZlLkNhcGFiaWxpdHlJbmZvKSkKLQl7CisJICAgIENBUF9JU19TSE9SVF9QUkVBTUJMRV9PTihwQWQtPlN0YUFjdGl2ZS5DYXBhYmlsaXR5SW5mbykpIHsKIAkJTWxtZVNldFR4UHJlYW1ibGUocEFkLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQpOwogCX0KIAogCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7CiAKLQlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID09IFJEX1NJTEVOQ0VfTU9ERSkKLQl7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9PSBSRF9TSUxFTkNFX01PREUpIHsKIAl9CiAJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfTk9STUFMX01PREU7CiAKLQlpZiAoQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JeworCWlmIChCc3NUeXBlID09IEJTU19BREhPQykgewogCQlNYWtlSWJzc0JlYWNvbihwQWQpOwogCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLQkJCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQotCQkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKLQkJewotCQkJOyAvL0RvIG5vdGhpbmcKLQkJfQotCQllbHNlCi0JCXsKKwkJICAgICYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCQkgICAgJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkgeworCQkJOwkvKkRvIG5vdGhpbmcgKi8KKwkJfSBlbHNlIHsKIAkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOwogCQl9CiAKLQkJLy8gSW4gYWQgaG9jIG1vZGUsIHVzZSBNQUMgdGFibGUgZnJvbSBpbmRleCAxLgotCQkvLyBwLnMgQVNJQyB1c2UgYWxsIDB4ZmYgYXMgdGVybWluYXRpb24gb2YgV0NJRCB0YWJsZSBzZWFyY2guVG8gcHJldmVudCBpdCdzIDB4ZmYtZmYtZmYtZmYtZmYtZmYsIFdyaXRlIDAgaGVyZS4KKwkJLyogSW4gYWQgaG9jIG1vZGUsIHVzZSBNQUMgdGFibGUgZnJvbSBpbmRleCAxLiAqLworCQkvKiBwLnMgQVNJQyB1c2UgYWxsIDB4ZmYgYXMgdGVybWluYXRpb24gb2YgV0NJRCB0YWJsZSBzZWFyY2guVG8gcHJldmVudCBpdCdzIDB4ZmYtZmYtZmYtZmYtZmYtZmYsIFdyaXRlIDAgaGVyZS4gKi8KIAkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1dDSURfQkFTRSwgMHgwMCk7CiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIDB4MTgwOCwgMHgwMCk7CiAKLQkJLy8gSWYgV0VQIGlzIGVuYWJsZWQsIGFkZCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyBpbnRvIEFzaWMKLQkJLy8gRmlsbCBpbiBTaGFyZWQgS2V5IFRhYmxlKG9mZnNldDogMHg2YzAwKSBhbmQgU2hhcmVkIEtleSBNb2RlKG9mZnNldDogMHg3MDAwKQorCQkvKiBJZiBXRVAgaXMgZW5hYmxlZCwgYWRkIGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIGludG8gQXNpYyAqLworCQkvKiBGaWxsIGluIFNoYXJlZCBLZXkgVGFibGUob2Zmc2V0OiAweDZjMDApIGFuZCBTaGFyZWQgS2V5IE1vZGUob2Zmc2V0OiAweDcwMDApICovCiAKLQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkKLQkJewotCQkJUFVDSEFSCUtleTsKLQkJCVVDSEFSIAlDaXBoZXJBbGc7CisJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpIHsKKwkJCXU4ICpLZXk7CisJCQl1OCBDaXBoZXJBbGc7CiAKLQkJCWZvciAoaWR4PTA7IGlkeCA8IFNIQVJFX0tFWV9OVU07IGlkeCsrKQotICAgICAgICAJeworCQkJZm9yIChpZHggPSAwOyBpZHggPCBTSEFSRV9LRVlfTlVNOyBpZHgrKykgewogCQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uQ2lwaGVyQWxnOwotICAgIAkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5OworCQkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5OwogCi0JCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gMCkKLQkJCQl7Ci0JCQkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCi0gICAgCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCQkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IDApIHsKKwkJCQkJLyogU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMgKi8KKwkJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgaWR4LAorCQkJCQkJCSAgICAgIENpcGhlckFsZywgS2V5LAorCQkJCQkJCSAgICAgIE5VTEwsIE5VTEwpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKQotCQkJCQl7Ci0JCQkJCQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQotCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKwkJCQkJaWYgKGlkeCA9PSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpIHsKKwkJCQkJCS8qIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlICovCisJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkJCSAgaWR4LAorCQkJCQkJCQkJICBDaXBoZXJBbGcsCisJCQkJCQkJCQkgIE5VTEwpOwogCQkJCQl9CiAJCQkJfQogCi0KIAkJCX0KIAkJfQotCQkvLyBJZiBXUEFOb25lIGlzIGVuYWJsZWQsIGFkZCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyBpbnRvIEFzaWMKLQkJLy8gRmlsbCBpbiBTaGFyZWQgS2V5IFRhYmxlKG9mZnNldDogMHg2YzAwKSBhbmQgU2hhcmVkIEtleSBNb2RlKG9mZnNldDogMHg3MDAwKQotCQllbHNlIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQl7Ci0JCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAwOwkvLyBhbHdheXMgYmUgemVybworCQkvKiBJZiBXUEFOb25lIGlzIGVuYWJsZWQsIGFkZCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyBpbnRvIEFzaWMgKi8KKwkJLyogRmlsbCBpbiBTaGFyZWQgS2V5IFRhYmxlKG9mZnNldDogMHg2YzAwKSBhbmQgU2hhcmVkIEtleSBNb2RlKG9mZnNldDogMHg3MDAwKSAqLworCQllbHNlIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKSB7CisJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAwOwkvKiBhbHdheXMgYmUgemVybyAqLwogCi0gICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0JCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7Ci0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIHBBZC0+U3RhQ2ZnLlBNSywgTEVOX1RLSVBfRUspOworCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2NpcGhlcl9rZXkpKTsKKwkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorCQkJCSAgICAgICBwQWQtPlN0YUNmZy5QTUssIExFTl9US0lQX0VLKTsKIAotICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLSAgICAgICAgICAgIHsKLSAgICAJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBNS1sxNl0sIExFTl9US0lQX1JYTUlDSyk7Ci0gICAgCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsICZwQWQtPlN0YUNmZy5QTUtbMTZdLCBMRU5fVEtJUF9UWE1JQ0spOwotICAgICAgICAgICAgfQotCi0JCQkvLyBEZWNpZGUgaXRzIENoaXBlckFsZwotCQkJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09CisJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLAorCQkJCQkgICAgICAgJnBBZC0+U3RhQ2ZnLlBNS1sxNl0sCisJCQkJCSAgICAgICBMRU5fVEtJUF9SWE1JQ0spOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorCQkJCQkgICAgICAgJnBBZC0+U3RhQ2ZnLlBNS1sxNl0sCisJCQkJCSAgICAgICBMRU5fVEtJUF9UWE1JQ0spOworCQkJfQorCQkJLyogRGVjaWRlIGl0cyBDaGlwZXJBbGcgKi8KKwkJCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09CisJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKIAkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLQkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0KKwkJCQkgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKIAkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwotCQkJZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlVua25vdyBDaXBoZXIgKD0lZCksIHNldCBDaXBoZXIgdG8gQUVTXG4iLCBwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyKSk7CisJCQllbHNlIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiVW5rbm93IENpcGhlciAoPSVkKSwgc2V0IENpcGhlciB0byBBRVNcbiIsCisJCQkJCSAgcEFkLT5TdGFDZmcuUGFpckNpcGhlcikpOwogCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0gICAgICAgICAgICB9CisJCQl9CiAKLQkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCisJCQkvKiBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYyAqLwogCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKLQkJCQkJCQkJICBCU1MwLAotCQkJCQkJCQkgIDAsCi0JCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAotCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKLQkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKLQkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7CisJCQkJCSAgICAgIEJTUzAsCisJCQkJCSAgICAgIDAsCisJCQkJCSAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKwkJCQkJICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorCQkJCQkgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKwkJCQkJICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOwogCi0gICAgICAgICAgICAvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQotCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIDAsIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywgTlVMTCk7CisJCQkvKiBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZSAqLworCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIDAsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLgorCQkJCQkJICBDaXBoZXJBbGcsIE5VTEwpOwogCiAJCX0KIAotCX0KLQllbHNlIC8vIEJTU19JTkZSQQorCX0gZWxzZQkJCS8qIEJTU19JTkZSQSAqLwogCXsKLQkJLy8gQ2hlY2sgdGhlIG5ldyBTU0lEIHdpdGggbGFzdCBTU0lECi0JCXdoaWxlIChDYW5jZWxsZWQgPT0gVFJVRSkKLQkJewotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuID09IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pCi0JCQl7Ci0JCQkJaWYgKFJUTVBDb21wYXJlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbikgPT0gMCkKLQkJCQl7Ci0JCQkJCS8vIExpbmsgdG8gdGhlIG9sZCBvbmUgbm8gbGlua2Rvd24gaXMgcmVxdWlyZWQuCisJCS8qIENoZWNrIHRoZSBuZXcgU1NJRCB3aXRoIGxhc3QgU1NJRCAqLworCQl3aGlsZSAoQ2FuY2VsbGVkID09IFRSVUUpIHsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbiA9PQorCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pIHsKKwkJCQlpZiAoUlRNUENvbXBhcmVNZW1vcnkKKwkJCQkgICAgKHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkLAorCQkJCSAgICAgcEFkLT5Db21tb25DZmcuU3NpZCwKKwkJCQkgICAgIHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuKSA9PSAwKSB7CisJCQkJCS8qIExpbmsgdG8gdGhlIG9sZCBvbmUgbm8gbGlua2Rvd24gaXMgcmVxdWlyZWQuICovCiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KLQkJCS8vIFNlbmQgbGluayBkb3duIGV2ZW50IGJlZm9yZSBzZXQgdG8gbGluayB1cAorCQkJLyogU2VuZCBsaW5rIGRvd24gZXZlbnQgYmVmb3JlIHNldCB0byBsaW5rIHVwICovCiAJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOwogCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLSAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEFBIVxuIikpOworCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQUEhXG4iKSk7CiAJCQlicmVhazsKIAkJfQogCi0JCS8vCi0JCS8vIE9uIFdQQSBtb2RlLCBSZW1vdmUgQWxsIEtleXMgaWYgbm90IGNvbm5lY3QgdG8gdGhlIGxhc3QgQlNTSUQKLQkJLy8gS2V5IHdpbGwgYmUgc2V0IGFmdGVyIDQtd2F5IGhhbmRzaGFrZS4KLQkJLy8KLQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQotCQl7Ci0JCQlVTE9ORyAJCUlWOworCQkvKiAqLworCQkvKiBPbiBXUEEgbW9kZSwgUmVtb3ZlIEFsbCBLZXlzIGlmIG5vdCBjb25uZWN0IHRvIHRoZSBsYXN0IEJTU0lEICovCisJCS8qIEtleSB3aWxsIGJlIHNldCBhZnRlciA0LXdheSBoYW5kc2hha2UuICovCisJCS8qICovCisJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHsKKwkJCXVuc2lnbmVkIGxvbmcgSVY7CiAKLQkJCS8vIFJlbW92ZSBhbGwgV1BBIGtleXMKKwkJCS8qIFJlbW92ZSBhbGwgV1BBIGtleXMgKi8KKwkJCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKIAkJCVJUTVBXUEFSZW1vdmVBbGxLZXlzKHBBZCk7CiAJCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKLQkJCXBBZC0+U3RhQ2ZnLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQOworCQkJcEFkLT5TdGFDZmcuUHJpdmFjeUZpbHRlciA9CisJCQkgICAgTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKIAotCQkJLy8gRml4ZWQgY29ubmVjdGlvbiBmYWlsZWQgd2l0aCBSYW5nZSBNYXhpbWl6ZXIgLSA1MTUgQVAgKE1hcnZlbGwgQ2hpcCkgd2hlbiBzZWN1cml0eSBpcyBXUEFQU0svVEtJUAotCQkJLy8gSWYgSVYgcmVsYXRlZCB2YWx1ZXMgYXJlIHRvbyBsYXJnZSBpbiBHcm91cE1zZzIsIEFQIHdvdWxkIGlnbm9yZSB0aGlzIG1lc3NhZ2UuCi0JCQlJViA9IDA7CisJCQkvKiBGaXhlZCBjb25uZWN0aW9uIGZhaWxlZCB3aXRoIFJhbmdlIE1heGltaXplciAtIDUxNSBBUCAoTWFydmVsbCBDaGlwKSB3aGVuIHNlY3VyaXR5IGlzIFdQQVBTSy9US0lQICovCisJCQkvKiBJZiBJViByZWxhdGVkIHZhbHVlcyBhcmUgdG9vIGxhcmdlIGluIEdyb3VwTXNnMiwgQVAgd291bGQgaWdub3JlIHRoaXMgbWVzc2FnZS4gKi8KKwkJCUlWID0gMTsKIAkJCUlWIHw9IChwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPDwgMzApOwogCQkJQXNpY1VwZGF0ZVdDSURJVkVJVihwQWQsIEJTU0lEX1dDSUQsIElWLCAwKTsKLQotI2lmZGVmIFJUMjg2MAotCQkJUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwotI2VuZGlmCiAJCX0KLQkJLy8gTk9URToKLQkJLy8gdGhlIGRlY2lzaW9uIG9mIHVzaW5nICJzaG9ydCBzbG90IHRpbWUiIG9yIG5vdCBtYXkgY2hhbmdlIGR5bmFtaWNhbGx5IGR1ZSB0bwotCQkvLyBuZXcgU1RBIGFzc29jaWF0aW9uIHRvIHRoZSBBUC4gc28gd2UgaGF2ZSB0byBkZWNpZGUgdGhhdCB1cG9uIHBhcnNpbmcgQkVBQ09OLCBub3QgaGVyZQorCQkvKiBOT1RFOiAqLworCQkvKiB0aGUgZGVjaXNpb24gb2YgdXNpbmcgInNob3J0IHNsb3QgdGltZSIgb3Igbm90IG1heSBjaGFuZ2UgZHluYW1pY2FsbHkgZHVlIHRvICovCisJCS8qIG5ldyBTVEEgYXNzb2NpYXRpb24gdG8gdGhlIEFQLiBzbyB3ZSBoYXZlIHRvIGRlY2lkZSB0aGF0IHVwb24gcGFyc2luZyBCRUFDT04sIG5vdCBoZXJlICovCiAKLQkJLy8gTk9URToKLQkJLy8gdGhlIGRlY2lzaW9uIHRvIHVzZSAiUlRDL0NUUyIgb3IgIkNUUy10by1zZWxmIiBwcm90ZWN0aW9uIG9yIG5vdCBtYXkgY2hhbmdlIGR5bmFtaWNhbGx5Ci0JCS8vIGR1ZSB0byBuZXcgU1RBIGFzc29jaWF0aW9uIHRvIHRoZSBBUC4gc28gd2UgaGF2ZSB0byBkZWNpZGUgdGhhdCB1cG9uIHBhcnNpbmcgQkVBQ09OLCBub3QgaGVyZQorCQkvKiBOT1RFOiAqLworCQkvKiB0aGUgZGVjaXNpb24gdG8gdXNlICJSVEMvQ1RTIiBvciAiQ1RTLXRvLXNlbGYiIHByb3RlY3Rpb24gb3Igbm90IG1heSBjaGFuZ2UgZHluYW1pY2FsbHkgKi8KKwkJLyogZHVlIHRvIG5ldyBTVEEgYXNzb2NpYXRpb24gdG8gdGhlIEFQLiBzbyB3ZSBoYXZlIHRvIGRlY2lkZSB0aGF0IHVwb24gcGFyc2luZyBCRUFDT04sIG5vdCBoZXJlICovCiAKIAkJQ29tcG9zZVBzUG9sbChwQWQpOwogCQlDb21wb3NlTnVsbEZyYW1lKHBBZCk7CiAKLQkJCUFzaWNFbmFibGVCc3NTeW5jKHBBZCk7CisJCUFzaWNFbmFibGVCc3NTeW5jKHBBZCk7CiAKLQkJLy8gQWRkIEJTU0lEIHRvIFdDSUQgc2VhcmNoIHRhYmxlCisJCS8qIEFkZCBCU1NJRCB0byBXQ0lEIHNlYXJjaCB0YWJsZSAqLwogCQlBc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCBCU1NJRF9XQ0lELCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAKLQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLQkJLy8gYWRkIHRoaXMgQlNTSUQgZW50cnkgaW50byBIQVNIIHRhYmxlCi0JCXsKLQkJCVVDSEFSIEhhc2hJZHg7CisJCS8qIElmIFdFUCBpcyBlbmFibGVkLCBhZGQgcGFpZXdpc2UgYW5kIHNoYXJlZCBrZXkgKi8KKwkJaWYgKCgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSAmJgorCQkgICAgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpICYmCisJCSAgICAgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSkgfHwKKwkJICAgICgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpICYmCisJCSAgICAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkpKSB7CisJCQl1OCAqS2V5OworCQkJdTggQ2lwaGVyQWxnOwogCi0JCQkvL3BFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOwotCQkJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQkJaWYgKHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKLQkJCXsKLQkJCQlwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID0gcEVudHJ5OwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBDdXJyRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOwotCQkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQotCQkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7Ci0JCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7Ci0JCQl9Ci0JCX0KLQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLQotCi0JCS8vIElmIFdFUCBpcyBlbmFibGVkLCBhZGQgcGFpZXdpc2UgYW5kIHNoYXJlZCBrZXkKLSAgICAgICAgaWYgKCgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSYmCi0gICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkmJgotICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkpIHx8Ci0gICAgICAgICAgICAoKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKSYmCi0gICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpKSkKLQkJewotCQkJUFVDSEFSCUtleTsKLQkJCVVDSEFSIAlDaXBoZXJBbGc7Ci0KLQkJCWZvciAoaWR4PTA7IGlkeCA8IFNIQVJFX0tFWV9OVU07IGlkeCsrKQotICAgICAgICAJeworCQkJZm9yIChpZHggPSAwOyBpZHggPCBTSEFSRV9LRVlfTlVNOyBpZHgrKykgewogCQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uQ2lwaGVyQWxnOwotICAgIAkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5OworCQkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5OwogCi0JCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gMCkKLQkJCQl7Ci0JCQkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCi0gICAgCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCQkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IDApIHsKKwkJCQkJLyogU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMgKi8KKwkJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgaWR4LAorCQkJCQkJCSAgICAgIENpcGhlckFsZywgS2V5LAorCQkJCQkJCSAgICAgIE5VTEwsIE5VTEwpOwogCi0JCQkJCWlmIChpZHggPT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKQotCQkJCQl7Ci0JCQkJCQkvLyBBc3NpZ24gZ3JvdXAga2V5IGluZm8KLQkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgTlVMTCk7CisJCQkJCWlmIChpZHggPT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKSB7CisJCQkJCQkvKiBBc3NpZ24gZ3JvdXAga2V5IGluZm8gKi8KKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCQkJICBCU1MwLAorCQkJCQkJCQkJICBpZHgsCisJCQkJCQkJCQkgIENpcGhlckFsZywKKwkJCQkJCQkJCSAgTlVMTCk7CiAKLQkJCQkJCS8vIEFzc2lnbiBwYWlyd2lzZSBrZXkgaW5mbwotCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBwRW50cnkpOworCQkJCQkJcEVudHJ5LT5BaWQgPSBCU1NJRF9XQ0lEOworCQkJCQkJLyogQXNzaWduIHBhaXJ3aXNlIGtleSBpbmZvICovCisJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkJCSAgaWR4LAorCQkJCQkJCQkJICBDaXBoZXJBbGcsCisJCQkJCQkJCQkgIHBFbnRyeSk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KLQotCQkvLyBvbmx5IElORlJBU1RSVUNUVVJFIG1vZGUgbmVlZCB0byBpbmRpY2F0ZSBjb25uZWN0aXZpdHkgaW1tZWRpYXRlbHk7IEFESE9DIG1vZGUKLQkJLy8gc2hvdWxkIHdhaXQgdW50aWwgYXQgbGVhc3QgMiBhY3RpdmUgbm9kZXMgaW4gdGhpcyBCU1NJRC4KKwkJLyogb25seSBJTkZSQVNUUlVDVFVSRSBtb2RlIG5lZWQgdG8gaW5kaWNhdGUgY29ubmVjdGl2aXR5IGltbWVkaWF0ZWx5OyBBREhPQyBtb2RlICovCisJCS8qIHNob3VsZCB3YWl0IHVudGlsIGF0IGxlYXN0IDIgYWN0aXZlIG5vZGVzIGluIHRoaXMgQlNTSUQuICovCiAJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwogCi0gICAgICAgIC8vIEZvciBHVUkgKysKLQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQl7CisJCS8qIEZvciBHVUkgKysgKi8KKwkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB7CiAJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwogCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7Ci0jaWZkZWYgUlQyODcwCiAJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotI2VuZGlmCisJCX0gZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCSAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PQorCQkJICAgIFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuTGlua0Rvd25UaW1lciwKKwkJCQkJICAgICBMSU5LX0RPV05fVElNRU9VVCk7CiAJCX0KLSAgICAgICAgLy8gLS0KLSNpZmRlZiBSVDI4NjAKLQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLSNlbmRpZgorCQkvKiAtLSAqLwogCi0JCS8vIEFkZCBCU1NJRCBpbiBteSBNQUMgVGFibGUuCi0gICAgICAgIE5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0JCVJUTVBNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWlkID0gQlNTSURfV0NJRDsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5wQWQgPSBwQWQ7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uVmFsaWRBc0NMSSA9IFRSVUU7CS8vQWx0aG91Z2ggdGhpcyBpcyBic3NpZC4uc3RpbGwgc2V0IFZhbGlkQXNDbAotCQlwQWQtPk1hY1RhYi5TaXplID0gMTsJLy8gaW5mcmEgbW9kZSBhbHdheXMgc2V0IE1BQ3RhYiBzaXplID0xLgotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlNzdCA9IFNTVF9BU1NPQzsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BdXRoU3RhdGUgPSBTU1RfQVNTT0M7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQXV0aE1vZGUgPSBwQWQtPlN0YUNmZy5BdXRoTW9kZTsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7Ci0gICAgICAgIE5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisJCS8qIEFkZCBCU1NJRCBpbiBteSBNQUMgVGFibGUuICovCisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisJCS8qIGFkZCB0aGlzIE1BQyBlbnRyeSBpbnRvIEhBU0ggdGFibGUgKi8KKwkJaWYgKHBFbnRyeSkgeworCQkJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJaWYgKHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPT0gTlVMTCkgeworCQkJCXBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPSBwRW50cnk7CisJCQl9IGVsc2UgeworCQkJCXBDdXJyRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCQkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKSB7CisJCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKKwkJCQl9CisJCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7CisJCQl9CisJCX0KKwkJUlRNUE1vdmVNZW1vcnkocEVudHJ5LT5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJCSAgICAgICBNQUNfQUREUl9MRU4pOworCQlwRW50cnktPkFpZCA9IEJTU0lEX1dDSUQ7CisJCXBFbnRyeS0+cEFkID0gcEFkOworCQlwRW50cnktPlZhbGlkQXNDTEkgPSBUUlVFOwkvKkFsdGhvdWdoIHRoaXMgaXMgYnNzaWQuLnN0aWxsIHNldCBWYWxpZEFzQ2wgKi8KKwkJcEFkLT5NYWNUYWIuU2l6ZSA9IDE7CS8qIGluZnJhIG1vZGUgYWx3YXlzIHNldCBNQUN0YWIgc2l6ZSA9MS4gKi8KKwkJcEVudHJ5LT5Tc3QgPSBTU1RfQVNTT0M7CisJCXBFbnRyeS0+QXV0aFN0YXRlID0gU1NUX0FTU09DOworCQlwRW50cnktPkF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7CisJCXBFbnRyeS0+V2VwU3RhdHVzID0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworCQlpZiAocEVudHJ5LT5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgeworCQkJcEVudHJ5LT5XcGFTdGF0ZSA9IEFTX05PVFVTRTsKKwkJCXBFbnRyeS0+UHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsOworCQl9IGVsc2UgeworCQkJcEVudHJ5LT5XcGFTdGF0ZSA9IEFTX1BUS1NUQVJUOworCQkJcEVudHJ5LT5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKKwkJfQorCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwogCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIFVQICEhISAgQ2xpZW50U3RhdHVzRmxhZ3M9JWx4KVxuIiwKLQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJMSU5LIFVQISAgQ2xpZW50U3RhdHVzRmxhZ3M9JWx4KVxuIiwKKwkJCSAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOwogCiAJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgVFJVRSwgQlNTMCk7CiAJCU1sbWVVcGRhdGVIdFR4UmF0ZXMocEFkLCBCU1MwKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEgKFN0YUFjdGl2ZS5iSHRFbmFibGUgPSVkLCApXG4iLCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSkpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkxJTksgVVAhIChTdGFBY3RpdmUuYkh0RW5hYmxlID0lZCwgKVxuIiwKKwkJCSAgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUpKTsKIAotCQlpZiAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkKLQkJewotCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSkgJiYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMykgPT0gMykKLQkJCXsKLQotCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QSUdHWUJBQ0tfSU5VU0VEKTsKLQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKLSAgICAgICAgICAgICAgICBSVE1QU2V0UGlnZ3lCYWNrKHBBZCwgVFJVRSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHVybiBvbiBQaWdneS1CYWNrXG4iKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDEpCi0JCQl7Ci0JCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSB7CisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlKQorCQkJICAgICYmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDMpID09IDMpIHsKKwkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsCisJCQkJCQkgIGZPUF9TVEFUVVNfUElHR1lCQUNLX0lOVVNFRCk7CisJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLAorCQkJCQkJICBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7CisJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksCisJCQkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSk7CisJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksCisJCQkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUpOworCQkJCVJUTVBTZXRQaWdneUJhY2socEFkLCBUUlVFKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiVHVybiBvbiBQaWdneS1CYWNrXG4iKSk7CisJCQl9IGVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkgeworCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwKKwkJCQkJCSAgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOworCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LAorCQkJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJSYWxpbmsgQWdncmVnYXRpb25cbiIpKTsKIAkJCX0KIAkJfQogCi0JCWlmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAhPSAweDApCi0JCXsKLQkJCWlmIChDTElFTlRfU1RBVFVTX1RFU1RfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpKQotCQkJeworCQlpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgIT0gMHgwKSB7CisJCQlpZiAoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcKKwkJCSAgICAocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSkpIHsKIAkJCQlBc2ljRW5hYmxlUkRHKHBBZCk7CiAJCQl9Ci0KIAkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpOwotCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpOwotCQl9Ci0JCWVsc2UKLQkJeworCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksCisJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7CisJCX0gZWxzZSB7CiAJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpOwotCQkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7CisJCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcocEVudHJ5LAorCQkJCQkJIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKIAkJfQogCX0KIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0NPTk5FQ1QgRXZlbnQgQiEuQkFDYXBhYmlsaXR5ID0gJXguIENsaWVudFN0YXR1c0ZsYWdzID0gJWx4XG4iLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZCwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJORElTX1NUQVRVU19NRURJQV9DT05ORUNUIEV2ZW50IEIhLkJBQ2FwYWJpbGl0eSA9ICV4LiBDbGllbnRTdGF0dXNGbGFncyA9ICVseFxuIiwKKwkJICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZCwKKwkJICBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkNsaWVudFN0YXR1c0ZsYWdzKSk7CiAKLQkvLyBTZXQgTEVECisJLyogU2V0IExFRCAqLwogCVJUTVBTZXRMRUQocEFkLCBMRURfTElOS19VUCk7CiAKIAlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCA9IDA7CiAJcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgPSAwOwotCXBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBGQUxTRTsgICAgICAgIC8vIFJlc2V0IGNvbmZpZyBmbGFnCi0JcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7ICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uIHRvIGxpbmsgaXMgdXAKKwlwQWQtPmJDb25maWdDaGFuZ2VkID0gRkFMU0U7CS8qIFJlc2V0IGNvbmZpZyBmbGFnICovCisJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CS8qIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiB0byBsaW5rIGlzIHVwICovCiAKLQkvLyBTZXQgYXNpYyBhdXRvIGZhbGwgYmFjaworCS8qIFNldCBhc2ljIGF1dG8gZmFsbCBiYWNrICovCiAJewotCQlQVUNIQVIJCQkJCXBUYWJsZTsKLQkJVUNIQVIJCQkJCVRhYmxlU2l6ZSA9IDA7CisJCXU4ICpwVGFibGU7CisJCXU4IFRhYmxlU2l6ZSA9IDA7CiAKLQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sICZwVGFibGUsICZUYWJsZVNpemUsICZwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCk7CisJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLAorCQkJCSAgICAgICZwVGFibGUsICZUYWJsZVNpemUsCisJCQkJICAgICAgJnBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KTsKIAkJQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlKHBBZCwgcFRhYmxlKTsKIAl9CiAKIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotICAgIHBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUud29yZDsKLSAgICBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7Ci0JaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IEZBTFNFKQotCXsKKwlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7CisJcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOworCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBGQUxTRSkgewogCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CiAKIAkJaWYgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAzMikKIAkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CiAKLQkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPiBNQ1NfNykgfHwgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAzMikpCisJCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID4gTUNTXzcpCisJCSAgICB8fCAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDMyKSkKIAkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CiAKLQkJLy8gSWYgdGhlIGxlZ2FjeSBtb2RlIGlzIHNldCwgb3ZlcndyaXRlIHRoZSB0cmFuc21pdCBzZXR0aW5nIG9mIHRoaXMgZW50cnkuCisJCS8qIElmIHRoZSBsZWdhY3kgbW9kZSBpcyBzZXQsIG92ZXJ3cml0ZSB0aGUgdHJhbnNtaXQgc2V0dGluZyBvZiB0aGlzIGVudHJ5LiAqLwogCQlpZiAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pCi0JCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlLCBwRW50cnkpOwotCX0KLQllbHNlCisJCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKCh1OClwQWQtPlN0YUNmZy4KKwkJCQkJCSAgRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC4KKwkJCQkJCSAgRml4ZWRUeE1vZGUsIHBFbnRyeSk7CisJfSBlbHNlCiAJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOwogCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CiAKLQkvLyAgTGV0IExpbmsgU3RhdHVzIFBhZ2UgZGlzcGxheSBmaXJzdCBpbml0aWFsIHJhdGUuCi0JcEFkLT5MYXN0VHhSYXRlID0gKFVTSE9SVCkocEVudHJ5LT5IVFBoeU1vZGUud29yZCk7Ci0JLy8gU2VsZWN0IERBQyBhY2NvcmRpbmcgdG8gSFQgb3IgTGVnYWN5Ci0JaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdICE9IDB4MDApCi0JeworCS8qICBMZXQgTGluayBTdGF0dXMgUGFnZSBkaXNwbGF5IGZpcnN0IGluaXRpYWwgcmF0ZS4gKi8KKwlwQWQtPkxhc3RUeFJhdGUgPSAodTE2KShwRW50cnktPkhUUGh5TW9kZS53b3JkKTsKKwkvKiBTZWxlY3QgREFDIGFjY29yZGluZyB0byBIVCBvciBMZWdhY3kgKi8KKwlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gIT0gMHgwMCkgewogCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZWYWx1ZSk7CiAJCVZhbHVlICY9ICh+MHgxOCk7Ci0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpCi0JCXsKLQkJICAgIFZhbHVlIHw9IDB4MTA7CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpIHsKKwkJCVZhbHVlIHw9IDB4MTA7CiAJCX0KIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgVmFsdWUpOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJlZhbHVlKTsKIAkJVmFsdWUgJj0gKH4weDE4KTsKIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgVmFsdWUpOwogCX0KIAotCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkKLQl7Ci0JfQotCWVsc2UgaWYgKHBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID09IDApCi0JewotCSAgICAvLyBJZiBIVCBBUCBkb2Vzbid0IHN1cHBvcnQgTWF4UkFtcGR1RmFjdG9yID0gMSwgd2UgbmVlZCB0byBzZXQgbWF4IFBTRFUgdG8gMC4KLQkgICAgLy8gQmVjYXVzZSBvdXIgSW5pdCB2YWx1ZSBpcyAxIGF0IE1BQ1JlZ1RhYmxlLgorCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkgeworCX0gZWxzZSBpZiAocEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPT0gMCkgeworCQkvKiBJZiBIVCBBUCBkb2Vzbid0IHN1cHBvcnQgTWF4UkFtcGR1RmFjdG9yID0gMSwgd2UgbmVlZCB0byBzZXQgbWF4IFBTRFUgdG8gMC4gKi8KKwkJLyogQmVjYXVzZSBvdXIgSW5pdCB2YWx1ZSBpcyAxIGF0IE1BQ1JlZ1RhYmxlLiAqLwogCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQVhfTEVOX0NGRywgMHgwZmZmKTsKIAl9Ci0KLQkvLyBQYXRjaCBmb3IgTWFydmVsIEFQIHRvIGdhaW4gaGlnaCB0aHJvdWdocHV0Ci0JLy8gTmVlZCB0byBzZXQgYXMgZm9sbG93aW5nLAotCS8vIDEuIFNldCB0eG9wIGluIHJlZ2lzdGVyLUVEQ0FfQUMwX0NGRyBhcyAweDYwCi0JLy8gMi4gU2V0IEVuVFhXcml0ZUJhY2tERE9ORSBpbiByZWdpc3Rlci1XUERNQV9HTE9fQ0ZHIGFzIHplcm8KLQkvLyAzLiBQQkZfTUFYX1BDTlQgYXMgMHgxRjNGQkY5RgotCS8vIDQuIGtpY2sgcGVyIHR3byBwYWNrZXRzIHdoZW4gZGVxdWV1ZQotCS8vCi0JLy8gVHhvcCBjYW4gb25seSBiZSBtb2RpZmllZCB3aGVuIFJERyBpcyBvZmYsIFdNTSBpcyBkaXNhYmxlIGFuZCBUeEJ1cnN0IGlzIGVuYWJsZQotCS8vCi0JLy8gaWYgMS4gTGVnYWN5IEFQIFdNTSBvbiwgIG9yIDIuIDExbiBBUCwgQU1QRFUgZGlzYWJsZS4gIEZvcmNlIHR1cm4gb2ZmIGJ1cnN0IG5vIG1hdHRlciB3aGF0IGJFbmFibGVUeEJ1cnN0IGlzLgotCWlmICgKLQkJIShwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9PSAxICYmIHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpICYmCi0JCSgoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpKQotCQl8fCAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IFRSVUUpICYmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID09IEJBX05PVFVTRSkpKSkKLQl7CisJLyogUGF0Y2ggZm9yIE1hcnZlbCBBUCB0byBnYWluIGhpZ2ggdGhyb3VnaHB1dCAqLworCS8qIE5lZWQgdG8gc2V0IGFzIGZvbGxvd2luZywgKi8KKwkvKiAxLiBTZXQgdHhvcCBpbiByZWdpc3Rlci1FRENBX0FDMF9DRkcgYXMgMHg2MCAqLworCS8qIDIuIFNldCBFblRYV3JpdGVCYWNrRERPTkUgaW4gcmVnaXN0ZXItV1BETUFfR0xPX0NGRyBhcyB6ZXJvICovCisJLyogMy4gUEJGX01BWF9QQ05UIGFzIDB4MUYzRkJGOUYgKi8KKwkvKiA0LiBraWNrIHBlciB0d28gcGFja2V0cyB3aGVuIGRlcXVldWUgKi8KKwkvKiAqLworCS8qIFR4b3AgY2FuIG9ubHkgYmUgbW9kaWZpZWQgd2hlbiBSREcgaXMgb2ZmLCBXTU0gaXMgZGlzYWJsZSBhbmQgVHhCdXJzdCBpcyBlbmFibGUgKi8KKwkvKiAqLworCS8qIGlmIDEuIExlZ2FjeSBBUCBXTU0gb24sICBvciAyLiAxMW4gQVAsIEFNUERVIGRpc2FibGUuICBGb3JjZSB0dXJuIG9mZiBidXJzdCBubyBtYXR0ZXIgd2hhdCBiRW5hYmxlVHhCdXJzdCBpcy4gKi8KKwlpZiAoISgocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPT0gMSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpKQorCSAgICAmJiAocEFkLT5TdGFDZmcuYkZvcmNlVHhCdXJzdCA9PSBGQUxTRSkKKwkgICAgJiYKKwkgICAgKCgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpCisJICAgICAgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSkKKwkgICAgIHx8ICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkKKwkJICYmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID09IEJBX05PVFVTRSkpKSkgewogCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOwotCQlEYXRhICAmPSAweEZGRkZGRjAwOworCQlEYXRhICY9IDB4RkZGRkZGMDA7CiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7CiAKIAkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX01BWF9QQ05ULCAweDFGM0Y3RjlGKTsKIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhidXJzdCAxXG4iKSk7Ci0JfQotCWVsc2UKLQlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCi0JeworCX0gZWxzZSBpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpIHsKIAkJUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKLQkJRGF0YSAgJj0gMHhGRkZGRkYwMDsKLQkJRGF0YSAgfD0gMHg2MDsKKwkJRGF0YSAmPSAweEZGRkZGRjAwOworCQlEYXRhIHw9IDB4NjA7CiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7CiAJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5vd0F0aGVyb3NCdXJzdE9uID0gVFJVRTsKIAogCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfTUFYX1BDTlQsIDB4MUYzRkJGOUYpOwogCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeGJ1cnN0IDJcbiIpKTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOwotCQlEYXRhICAmPSAweEZGRkZGRjAwOworCQlEYXRhICY9IDB4RkZGRkZGMDA7CiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7CiAKIAkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX01BWF9QQ05ULCAweDFGM0Y3RjlGKTsKIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhidXJzdCAzXG4iKSk7CiAJfQogCi0JLy8gUmUtY2hlY2sgdG8gdHVybiBvbiBUWCBidXJzdCBvciBub3QuCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJMYXN0QXRoZXJvcyA9PSBUUlVFKSAmJiAoKFNUQV9XRVBfT04ocEFkKSl8fChTVEFfVEtJUF9PTihwQWQpKSkpCi0JeworCS8qIFJlLWNoZWNrIHRvIHR1cm4gb24gVFggYnVyc3Qgb3Igbm90LiAqLworCWlmICgocEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTGFzdEF0aGVyb3MgPT0gVFJVRSkKKwkgICAgJiYgKChTVEFfV0VQX09OKHBBZCkpIHx8IChTVEFfVEtJUF9PTihwQWQpKSkpIHsKIAkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTmV4dERpc2FibGVSeEJBID0gVFJVRTsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQotCQl7Ci0JCSAgICBVSU5UMzIgTUFDVmFsdWUgPSAwOwotCQkJLy8gRm9yY2UgZGlzYWJsZSAgVFhPUCB2YWx1ZSBpbiB0aGlzIGNhc2UuIFRoZSBzYW1lIGFjdGlvbiBpbiBNTE1FVXBkYXRlUHJvdGVjdCB0b28uCi0JCQkvLyBJIGRpZG4ndCBjaGFuZ2UgUEJGX01BWF9QQ05UIHNldHRpbmcuCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkgeworCQkJdTMyIE1BQ1ZhbHVlID0gMDsKKwkJCS8qIEZvcmNlIGRpc2FibGUgIFRYT1AgdmFsdWUgaW4gdGhpcyBjYXNlLiBUaGUgc2FtZSBhY3Rpb24gaW4gTUxNRVVwZGF0ZVByb3RlY3QgdG9vLiAqLworCQkJLyogSSBkaWRuJ3QgY2hhbmdlIFBCRl9NQVhfUENOVCBzZXR0aW5nLiAqLwogCQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZNQUNWYWx1ZSk7Ci0JCQlNQUNWYWx1ZSAgJj0gMHhGRkZGRkYwMDsKKwkJCU1BQ1ZhbHVlICY9IDB4RkZGRkZGMDA7CiAJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIE1BQ1ZhbHVlKTsKIAkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5vd0F0aGVyb3NCdXJzdE9uID0gRkFMU0U7CiAJCX0KLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOZXh0RGlzYWJsZVJ4QkEgPSBGQUxTRTsKIAl9CiAKIAlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJMYXN0QXRoZXJvcyA9IEZBTFNFOwogCUNPUFlfTUFDX0FERFIocEFkLT5Db21tb25DZmcuTGFzdEJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcEFkLT5iTmV4dERpc2FibGVSeEJBPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5leHREaXNhYmxlUnhCQSkpOwotCS8vIEJTU0lEIGFkZCBpbiBvbmUgTUFDIGVudHJ5IHRvby4gIEJlY2F1c2UgaW4gVHgsIEFTSUMgbmVlZCB0byBjaGVjayBDaXBoZXIgYW5kIElWL0VJViwgQkFiaXRtYXAKLQkvLyBQdGhlciBpbmZvcm1hdGlvbiBpbiBNQUNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSBpcyBub3QgbmVjZXNzYXJ5IGZvciBkcml2ZXIuCi0JLy8gTm90ZTogQXMgU1RBLCBUaGUgTUFDVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uIFBhaXJ3aXNlS2V5IGFuZCBTaGFyZWQgS2V5IGZvciBCU1MwIGFyZSB0aGUgc2FtZS4KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgicEFkLT5iTmV4dERpc2FibGVSeEJBPSAlZCBcbiIsCisJCSAgcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTmV4dERpc2FibGVSeEJBKSk7CisJLyogQlNTSUQgYWRkIGluIG9uZSBNQUMgZW50cnkgdG9vLiAgQmVjYXVzZSBpbiBUeCwgQVNJQyBuZWVkIHRvIGNoZWNrIENpcGhlciBhbmQgSVYvRUlWLCBCQWJpdG1hcCAqLworCS8qIFB0aGVyIGluZm9ybWF0aW9uIGluIE1BQ1RhYi5Db250ZW50W0JTU0lEX1dDSURdIGlzIG5vdCBuZWNlc3NhcnkgZm9yIGRyaXZlci4gKi8KKwkvKiBOb3RlOiBBcyBTVEEsIFRoZSBNQUNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4gUGFpcndpc2VLZXkgYW5kIFNoYXJlZCBLZXkgZm9yIEJTUzAgYXJlIHRoZSBzYW1lLiAqLwogCi0gICAgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0gICAgewotICAgICAgICBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwotCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7CisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpIHsKKwkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAmJgorCQkgICAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkgJiYKKwkJICAgIChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSkpIDsKKwkJZWxzZSB7CisJCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJcEFkLT5TdGFDZmcuUHJpdmFjeUZpbHRlciA9CisJCQkgICAgTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7CisJCX0KIAl9CiAKIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwogCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsKIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwogCi0gICAgLy8KLQkvLyBQYXRjaCBBdGhlcm9zIEFQIFRYIHdpbGwgYnJlYWtkb3duIGlzc3VlLgotCS8vIEFQIE1vZGVsOiBETGluayBEV0wtODIwMEFQCi0JLy8KLQlpZiAoSU5GUkFfT04ocEFkKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmIFNUQV9US0lQX09OKHBBZCkpCi0JeworCS8qICovCisJLyogUGF0Y2ggQXRoZXJvcyBBUCBUWCB3aWxsIGJyZWFrZG93biBpc3N1ZS4gKi8KKwkvKiBBUCBNb2RlbDogRExpbmsgRFdMLTgyMDBBUCAqLworCS8qICovCisJaWYgKElORlJBX09OKHBBZCkgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKQorCSAgICAmJiBTVEFfVEtJUF9PTihwQWQpKSB7CiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX1BBUlNFUl9DRkcsIDB4MDEpOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX1BBUlNFUl9DRkcsIDB4MDApOwogCX0KIAogCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOwotI2lmZGVmIFJUMjg2MAorCiAJUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cpOwotI2VuZGlmCiB9CiAKIC8qCkBAIC0xODIyLDIyMCArMTg3MywxOTAgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBMaW5rRG93bigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiAgQk9PTEVBTiAgICAgIElzUmVxRnJvbUFQKQordm9pZCBMaW5rRG93bihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gSXNSZXFGcm9tQVApCiB7Ci0JVUNIQVIJCQkgICAgaSwgQnl0ZVZhbHVlID0gMDsKLSNpZmRlZiBSVDI4NjAKLQlCT09MRUFOCQlDYW5jZWxsZWQ7Ci0jZW5kaWYKKwl1OCBpLCBCeXRlVmFsdWUgPSAwOwogCi0JLy8gRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24KKwkvKiBEbyBub3RoaW5nIGlmIG1vbml0b3IgbW9kZSBpcyBvbiAqLwogCWlmIChNT05JVE9SX09OKHBBZCkpCiAJCXJldHVybjsKIAotI2lmZGVmIFJUMjg2MAogCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfR09fVE9fU0xFRVBfTk9XKTsKLQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwJCSZDYW5jZWxsZWQpOwotCi0JLy8gTm90IGFsbG93IGdvIHRvIHNsZWVwIHdpdGhpbiBsaW5rZG93biBmdW5jdGlvbi4KKwkvKkNvbW1lbnQgdGhlIGNvZGVzLCBiZWFzdWUgdGhlIGxpbmUgMjI5MSBjYWxsIHRoZSBzYW1lIGZ1bmN0aW9uLiAqLworCS8qUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsICAgICAgICAgICAgICAgJkNhbmNlbGxlZCk7ICovCisJLyogTm90IGFsbG93IGdvIHRvIHNsZWVwIHdpdGhpbiBsaW5rZG93biBmdW5jdGlvbi4gKi8KIAlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0jZW5kaWYKIAotICAgIGlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQl7Ci0JCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NUQV9MSU5LRE9XTl9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkgeworCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRywKKwkJCQkgICAgICBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsCisJCQkJICAgICAgQlNTMCwgMCk7CiAJfQogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgRE9XTiAhISFcbiIpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMSU5LIERPV04hXG4iKSk7CiAJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKIAotI2lmZGVmIFJUMjg2MAotICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCi0gICAgewotCSAgICBCT09MRUFOIENhbmNlbGxlZDsKLSAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLSAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOwotICAgIH0KKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpIHsKKwkJQk9PTEVBTiBDYW5jZWxsZWQ7CisJCXBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLCAmQ2FuY2VsbGVkKTsKKwl9CiAKLSAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSB8fAotCQlSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQpIHx8Ci0JCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikpCi0gICAgewotCQlBc2ljRm9yY2VXYWtldXAocEFkLCBSVE1QX0hBTFQpOwotICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKLSAgICB9CisJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKLSAgICBwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLSNlbmRpZgotCWlmIChBREhPQ19PTihwQWQpKQkJLy8gQWRob2MgbW9kZSBsaW5rIGRvd24KKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKQorCSAgICB8fCBSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQpCisJICAgIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikpIHsKKwkJQVVUT19XQUtFVVBfU1RSVUMgQXV0b1dha2V1cENmZzsKKwkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisJCUF1dG9XYWtldXBDZmcud29yZCA9IDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisJfQorI2lmZGVmIFJUTVBfTUFDX1BDSQorCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCisJaWYgKEFESE9DX09OKHBBZCkpCS8qIEFkaG9jIG1vZGUgbGluayBkb3duICovCiAJewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOIDEhISFcbiIpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTElOSyBET1dOIDEhXG4iKSk7CiAKIAkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURIT0NfT04pOwogCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwogCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOwogCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOwotCQlCc3NUYWJsZURlbGV0ZUVudHJ5KCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1hY1RhYi5TaXplPSVkICEhIVxuIiwgcEFkLT5NYWNUYWIuU2l6ZSkpOwotCX0KLQllbHNlCQkJCQkvLyBJbmZyYSBzdHJ1Y3R1cmUgbW9kZQorCQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQlCc3NUYWJsZURlbGV0ZUVudHJ5KCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJCSAgICBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIgTWFjVGFiLlNpemU9JWQgIVxuIiwgcEFkLT5NYWNUYWIuU2l6ZSkpOworCX0gZWxzZQkJCS8qIEluZnJhIHN0cnVjdHVyZSBtb2RlICovCiAJewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOIDIhISFcbiIpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTElOSyBET1dOIDIhXG4iKSk7CiAKIAkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOwogCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwogCi0JCS8vIFNhdmVkIGxhc3QgU1NJRCBmb3IgbGlua3VwIGNvbXBhcmlzb24KKwkJLyogU2F2ZWQgbGFzdCBTU0lEIGZvciBsaW5rdXAgY29tcGFyaXNvbiAqLwogCQlwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbiA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbik7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLAorCQkJICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuKTsKIAkJQ09QWV9NQUNfQUREUihwQWQtPkNvbW1vbkNmZy5MYXN0QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJaWYgKHBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9PSBUUlVFKQotCQl7CisJCWlmIChwQWQtPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPT0gVFJVRSkgewogCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKIAkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0gICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBBIVxuIikpOworCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQSFcbiIpKTsKIAkJCXBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotICAgICAgICAgICAgLy8KLQkJCS8vIElmIGRpc2Fzc29jaWF0aW9uIHJlcXVlc3QgaXMgZnJvbSBORElTLCB0aGVuIHdlIGRvbid0IG5lZWQgdG8gZGVsZXRlIEJTU0lEIGZyb20gZW50cnkuCi0JCQkvLyBPdGhlcndpc2UgbG9zdCBiZWFjb24gb3IgcmVjZWl2ZSBEZS1BdXRoZW50aWNhdGlvbiBmcm9tIEFQLAotCQkJLy8gdGhlbiB3ZSBzaG91bGQgZGVsZXRlIEJTU0lEIGZyb20gQnNzVGFibGUuCi0JCQkvLyBJZiB3ZSBkb24ndCBkZWxldGUgZnJvbSBlbnRyeSwgcm9hbWluZyB3aWxsIGZhaWwuCi0JCQkvLwotCQkJQnNzVGFibGVEZWxldGVFbnRyeSgmcEFkLT5TY2FuVGFiLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCX0gZWxzZSB7CisJCQkvKiAqLworCQkJLyogSWYgZGlzYXNzb2NpYXRpb24gcmVxdWVzdCBpcyBmcm9tIE5ESVMsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkZWxldGUgQlNTSUQgZnJvbSBlbnRyeS4gKi8KKwkJCS8qIE90aGVyd2lzZSBsb3N0IGJlYWNvbiBvciByZWNlaXZlIERlLUF1dGhlbnRpY2F0aW9uIGZyb20gQVAsICovCisJCQkvKiB0aGVuIHdlIHNob3VsZCBkZWxldGUgQlNTSUQgZnJvbSBCc3NUYWJsZS4gKi8KKwkJCS8qIElmIHdlIGRvbid0IGRlbGV0ZSBmcm9tIGVudHJ5LCByb2FtaW5nIHdpbGwgZmFpbC4gKi8KKwkJCS8qICovCisJCQlCc3NUYWJsZURlbGV0ZUVudHJ5KCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJCQkgICAgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CiAJCX0KIAotCQkvLyByZXN0b3JlIGJhY2sgdG8gLQotCQkvLyAgICAgIDEuIGxvbmcgc2xvdCAoMjAgdXMpIG9yIHNob3J0IHNsb3QgKDkgdXMpIHRpbWUKLQkJLy8gICAgICAyLiB0dXJuIG9uL29mZiBSVFMvQ1RTIGFuZC9vciBDVFMtdG8tc2VsZiBwcm90ZWN0aW9uCi0JCS8vICAgICAgMy4gc2hvcnQgcHJlYW1ibGUKKwkJLyogcmVzdG9yZSBiYWNrIHRvIC0gKi8KKwkJLyogICAgICAxLiBsb25nIHNsb3QgKDIwIHVzKSBvciBzaG9ydCBzbG90ICg5IHVzKSB0aW1lICovCisJCS8qICAgICAgMi4gdHVybiBvbi9vZmYgUlRTL0NUUyBhbmQvb3IgQ1RTLXRvLXNlbGYgcHJvdGVjdGlvbiAqLworCQkvKiAgICAgIDMuIHNob3J0IHByZWFtYmxlICovCiAJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKTsKIAotCQlpZiAocEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWcgPT0gVFJVRSkKLQkJewotCQkJLy8KLQkJCS8vIFJlY29yZCBjdXJyZW50IEFQJ3MgaW5mb3JtYXRpb24uCi0JCQkvLyBmb3IgbGF0ZXIgdXNlZCByZXBvcnRpbmcgQWRqYWNlbnQgQVAgcmVwb3J0LgotCQkJLy8KLQkJCXBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQkJCXBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBTc2lkTGVuID0gcEFkLT5Db21tb25DZmcuU3NpZExlbjsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBTc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQU3NpZExlbik7Ci0JCQlDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBCc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQl9CiAJfQogCi0JZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQl7CisJZm9yIChpID0gMTsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspIHsKIAkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9PSBUUlVFKQotCQkJTWFjVGFibGVEZWxldGVFbnRyeShwQWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQWlkLCBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFkZHIpOworCQkJTWFjVGFibGVEZWxldGVFbnRyeShwQWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQWlkLAorCQkJCQkgICAgcEFkLT5NYWNUYWIuQ29udGVudFtpXS5BZGRyKTsKIAl9CiAKLQlwQWQtPlN0YUNmZy5DQ1hRb3NFQ1dNaW4JPSA0OwotCXBBZC0+U3RhQ2ZnLkNDWFFvc0VDV01heAk9IDEwOwotCi0JQXNpY1NldFNsb3RUaW1lKHBBZCwgVFJVRSk7IC8vRkFMU0UpOworCUFzaWNTZXRTbG90VGltZShwQWQsIFRSVUUpOwkvKkZBTFNFKTsgKi8KIAlBc2ljU2V0RWRjYVBhcm0ocEFkLCBOVUxMKTsKIAotCS8vIFNldCBMRUQKKwkvKiBTZXQgTEVEICovCiAJUlRNUFNldExFRChwQWQsIExFRF9MSU5LX0RPV04pOwotICAgIHBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCA9IDB4RjA7Ci0gICAgUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvLyBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGZpcm13YXJlIGlzIG5vdCBkb25lIGl0LgorCXBBZC0+TGVkSW5kaWNhdG9yU3RyZW5ndGggPSAweEYwOworCVJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLyogRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBmaXJtd2FyZSBpcyBub3QgZG9uZSBpdC4gKi8KIAotCQlBc2ljRGlzYWJsZVN5bmMocEFkKTsKKwlBc2ljRGlzYWJsZVN5bmMocEFkKTsKIAogCXBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kID0gMDsKIAlwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCA9IDA7CiAKLQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCi0JewotCQkvLyBSZW1vdmUgU3RhQ2ZnIEluZm9ybWF0aW9uIGFmdGVyIGxpbmsgZG93bgorCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkgeworCQkvKiBSZW1vdmUgU3RhQ2ZnIEluZm9ybWF0aW9uIGFmdGVyIGxpbmsgZG93biAqLwogCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKIAkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKIAkJcEFkLT5Db21tb25DZmcuU3NpZExlbiA9IDA7CiAJfQogCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7Ci0JTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBzaXplb2Yoc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUpKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkpOwogCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSAwOwogCXBBZC0+TWxtZUF1eC5OZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKIAotCS8vIFJlc2V0IFdQQS1QU0sgc3RhdGUuIE9ubHkgcmVzZXQgd2hlbiBzdXBwbGljYW50IGVuYWJsZWQKLQlpZiAocEFkLT5TdGFDZmcuV3BhU3RhdGUgIT0gU1NfTk9UVVNFKQotCXsKKwkvKiBSZXNldCBXUEEtUFNLIHN0YXRlLiBPbmx5IHJlc2V0IHdoZW4gc3VwcGxpY2FudCBlbmFibGVkICovCisJaWYgKHBBZC0+U3RhQ2ZnLldwYVN0YXRlICE9IFNTX05PVFVTRSkgewogCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOwotCQkvLyBDbGVhciBSZXBsYXkgY291bnRlcgorCQkvKiBDbGVhciBSZXBsYXkgY291bnRlciAqLwogCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCA4KTsKKwogCX0KLQotCi0JLy8KLQkvLyBpZiBsaW5rIGRvd24gY29tZSBmcm9tIEFQLCB3ZSBuZWVkIHRvIHJlbW92ZSBhbGwgV1BBIGtleXMgb24gV1BBIG1vZGUuCi0JLy8gb3RoZXJ3aXNlIHdpbGwgY2F1c2UgNC13YXkgaGFuZHNoYWtpbmcgZmFpbGVkLCBzaW5jZSB0aGUgV1BBIGtleSBub3QgZW1wdHkuCi0JLy8KLQlpZiAoKElzUmVxRnJvbUFQKSAmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKLQl7Ci0JCS8vIFJlbW92ZSBhbGwgV1BBIGtleXMKKwkvKiAqLworCS8qIGlmIGxpbmsgZG93biBjb21lIGZyb20gQVAsIHdlIG5lZWQgdG8gcmVtb3ZlIGFsbCBXUEEga2V5cyBvbiBXUEEgbW9kZS4gKi8KKwkvKiBvdGhlcndpc2Ugd2lsbCBjYXVzZSA0LXdheSBoYW5kc2hha2luZyBmYWlsZWQsIHNpbmNlIHRoZSBXUEEga2V5IG5vdCBlbXB0eS4gKi8KKwkvKiAqLworCWlmICgoSXNSZXFGcm9tQVApICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpKSB7CisJCS8qIFJlbW92ZSBhbGwgV1BBIGtleXMgKi8KIAkJUlRNUFdQQVJlbW92ZUFsbEtleXMocEFkKTsKIAl9CisJLyogODAyLjF4IHBvcnQgY29udHJvbCAqLwogCi0JLy8gODAyLjF4IHBvcnQgY29udHJvbAotCi0JLy8gUHJldmVudCBjbGVhciBQb3J0U2VjdXJlZCBoZXJlIHdpdGggc3RhdGljIFdFUAotCS8vIE5ldHdvcmtNYW5nZXIgc2V0IHNlY3VyaXR5IHBvbGljeSBmaXJzdCB0aGVuIHNldCBTU0lEIHRvIGNvbm5lY3QgQVAuCisJLyogUHJldmVudCBjbGVhciBQb3J0U2VjdXJlZCBoZXJlIHdpdGggc3RhdGljIFdFUCAqLworCS8qIE5ldHdvcmtNYW5nZXIgc2V0IHNlY3VyaXR5IHBvbGljeSBmaXJzdCB0aGVuIHNldCBTU0lEIHRvIGNvbm5lY3QgQVAuICovCiAJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAmJgotCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSAmJgotCQkocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IEZBTFNFKSkKLQl7CisJICAgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpICYmCisJICAgIChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gRkFMU0UpKSB7CiAJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CiAJCXBBZC0+U3RhQ2ZnLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQOwogCX0KIAogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWFjVGFiLCBzaXplb2Yoc3RydWN0IHJ0X21hY190YWJsZSkpOwogCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUG9ydFNlY3VyZWQgPSBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsKIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwogCiAJcEFkLT5TdGFDZmcuTWljRXJyQ250ID0gMDsKIAotCS8vIFR1cm4gb2ZmIENraXAgY29udHJvbCBmbGFnCi0JcEFkLT5TdGFDZmcuYkNraXBPbiA9IEZBTFNFOwotCXBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IEZBTFNFOwotCi0gICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKLQkvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cAorCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJLyogVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uIHRvIGxpbmsgaXMgdXAgKi8KIAlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOwogCi0jaWZkZWYgUlQyODYwCi0gICAgcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCA9IEZBTFNFOwotCXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgPSBGQUxTRTsKLQlwQWQtPlN0YUNmZy5BZGhvYzIwTkpvaW5lZCA9IEZBTFNFOwotI2VuZGlmCi0gICAgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKwlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOwogCi0JLy8gUmVzZXQgdGhlIEN1cnJlbnQgQVAncyBJUCBhZGRyZXNzCi0JTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuQWlyb25ldElQQWRkcmVzcywgNCk7Ci0jaWZkZWYgUlQyODcwCisjaWZkZWYgUlRNUF9NQUNfVVNCCiAJcEFkLT5iVXNiVHhCdWxrQWdncmUgPSBGQUxTRTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCS8vIENsZWFuIGFzc29jaWF0aW9uIGluZm9ybWF0aW9uCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLkFzc29jSW5mbywgc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKSk7Ci0JcEFkLT5TdGFDZmcuQXNzb2NJbmZvLkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTik7CisJLyogQ2xlYW4gYXNzb2NpYXRpb24gaW5mb3JtYXRpb24gKi8KKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuQXNzb2NJbmZvLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9uZGlzXzgwMl8xMV9hc3NvY2lhdGlvbl9pbmZvcm1hdGlvbikpOworCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5MZW5ndGggPQorCSAgICBzaXplb2Yoc3RydWN0IHJ0X25kaXNfODAyXzExX2Fzc29jaWF0aW9uX2luZm9ybWF0aW9uKTsKIAlwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA9IDA7CiAJcEFkLT5TdGFDZmcuUmVzVmFySUVMZW4gPSAwOwogCi0JLy8KLQkvLyBSZXNldCBSU1NJIHZhbHVlIGFmdGVyIGxpbmsgZG93bgotCS8vCisJLyogKi8KKwkvKiBSZXNldCBSU1NJIHZhbHVlIGFmdGVyIGxpbmsgZG93biAqLworCS8qICovCiAJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCA9IDA7CiAJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMFg4ID0gMDsKIAlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxID0gMDsKQEAgLTIwNDMsMzcgKzIwNjQsMzYgQEAKIAlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyID0gMDsKIAlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyWDggPSAwOwogCi0JLy8gUmVzdG9yZSBNbG1lUmF0ZQorCS8qIFJlc3RvcmUgTWxtZVJhdGUgKi8KIAlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7CiAJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7CiAKLQkvLwotCS8vIEFmdGVyIExpbmsgZG93biwgcmVzZXQgcGlnZ3ktYmFjayBzZXR0aW5nIGluIEFTSUMuIERpc2FibGUgUkRHLgotCS8vCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKLQl7CisJLyogKi8KKwkvKiBBZnRlciBMaW5rIGRvd24sIHJlc2V0IHBpZ2d5LWJhY2sgc2V0dGluZyBpbiBBU0lDLiBEaXNhYmxlIFJERy4gKi8KKwkvKiAqLworCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApIHsKIAkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CiAJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJ5dGVWYWx1ZSk7CiAJCUJ5dGVWYWx1ZSAmPSAofjB4MTgpOwogCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCeXRlVmFsdWUpOwogCX0KLQotCS8vIFJlc2V0IERBQworCS8qIFJlc2V0IERBQyAqLwogCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJ5dGVWYWx1ZSk7CiAJQnl0ZVZhbHVlICY9ICh+MHgxOCk7Ci0JaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikKLQl7CisJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikgewogCQlCeXRlVmFsdWUgfD0gMHgxMDsKIAl9CiAJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQnl0ZVZhbHVlKTsKIAotCVJUTVBTZXRQaWdneUJhY2socEFkLEZBTFNFKTsKKwlSVE1QU2V0UGlnZ3lCYWNrKHBBZCwgRkFMU0UpOwogCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BJR0dZQkFDS19JTlVTRUQpOwogCiAJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQgPSBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZDsKIAotCS8vIFJlc3RvcmUgYWxsIHNldHRpbmdzIGluIHRoZSBmb2xsb3dpbmcuCi0JQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwLCAoQUxMTl9TRVRQUk9URUNUfENDS1NFVFBST1RFQ1R8T0ZETVNFVFBST1RFQ1QpLCBUUlVFLCBGQUxTRSk7CisJLyogUmVzdG9yZSBhbGwgc2V0dGluZ3MgaW4gdGhlIGZvbGxvd2luZy4gKi8KKwlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAsCisJCQkgIChBTExOX1NFVFBST1RFQ1QgfCBDQ0tTRVRQUk9URUNUIHwgT0ZETVNFVFBST1RFQ1QpLAorCQkJICBUUlVFLCBGQUxTRSk7CiAJQXNpY0Rpc2FibGVSREcocEFkKTsKIAlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJDdXJyZW50QXRoZXJvcyA9IEZBTFNFOwogCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5vd0F0aGVyb3NCdXJzdE9uID0gRkFMU0U7CkBAIC0yMDgxLDMwICsyMTAxLDE3IEBACiAJUlRNUF9JT19XUklURTMyKHBBZCwgTUFYX0xFTl9DRkcsIDB4MWZmZik7CiAJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CiAKLSNpZmRlZiBSVDI4NjAKLQkvLyBBbGxvdyBnbyB0byBzbGVlcCBhZnRlciBsaW5rZG93biBzdGVwcy4KKy8qIEFsbG93IGdvIHRvIHNsZWVwIGFmdGVyIGxpbmtkb3duIHN0ZXBzLiAqLwogCVJUTVBfU0VUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0jZW5kaWYKIAotCXsKLQkJdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OwotCQltZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7Ci0JCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKwlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIFNJT0NHSVdBUCwgLTEsIE5VTEwsIE5VTEwsIDApOworCisjaWZkZWYgUlQzMHh4CisJaWYgKChJU19SVDMweHgocEFkKSB8fCBJU19SVDMwOTAocEFkKSB8fCBJU19SVDMzOTAocEFkKSkKKwkgICAgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPiAxIHx8IHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPiAxKSkgeworCQlSVE1QX0FTSUNfTU1QU19ESVNBQkxFKHBBZCk7CiAJfQotCi0JaWYgKElTX1JUMzA5MChwQWQpKQotCXsKLQkJVUlOVDMyCQkJCW1hY2RhdGE7Ci0JCS8vIGRpc2FibGUgTU1QUyBCQlAgY29udHJvbCByZWdpc3RlcgotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCeXRlVmFsdWUpOwotCQlCeXRlVmFsdWUgJj0gfigweDA0KTsJLy9iaXQgMgotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCeXRlVmFsdWUpOwotCi0JCS8vIGRpc2FibGUgTU1QUyBNQUMgY29udHJvbCByZWdpc3RlcgotCQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTIxMCwgJm1hY2RhdGEpOwotCQltYWNkYXRhICY9IH4oMHgwOSk7CS8vYml0IDAsIDMKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgMHgxMjEwLCBtYWNkYXRhKTsKLQl9CisjZW5kaWYgLyogUlQzMHh4IC8vICovCiB9CiAKIC8qCkBAIC0yMTE1LDExMiArMjEyMiwxNDggQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBJdGVyYXRlT25Cc3NUYWIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIEl0ZXJhdGVPbkJzc1RhYihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JTUxNRV9TVEFSVF9SRVFfU1RSVUNUICAgU3RhcnRSZXE7Ci0JTUxNRV9KT0lOX1JFUV9TVFJVQ1QgICAgSm9pblJlcTsKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBCc3NJZHg7CisJc3RydWN0IHJ0X21sbWVfc3RhcnRfcmVxIFN0YXJ0UmVxOworCXN0cnVjdCBydF9tbG1lX2pvaW5fcmVxIEpvaW5SZXE7CisJdW5zaWduZWQgbG9uZyBCc3NJZHg7CiAKLQkvLyBDaGFuZ2UgdGhlIHdlcHN0YXR1cyB0byBvcmlnaW5hbCB3ZXBzdGF0dXMKLQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMgICA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7Ci0JcEFkLT5TdGFDZmcuUGFpckNpcGhlciAgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCS8qIENoYW5nZSB0aGUgd2Vwc3RhdHVzIHRvIG9yaWdpbmFsIHdlcHN0YXR1cyAqLworCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CiAJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOwogCiAJQnNzSWR4ID0gcEFkLT5NbG1lQXV4LkJzc0lkeDsKLQlpZiAoQnNzSWR4IDwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIpCi0JewotCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCi0JCS8vIFNldCB0aGUgUGFpcndpc2UgYW5kIEdyb3VwIGNpcGhlciB0byBtYXRjaCB0aGUgaW50ZW5kZWQgQVAgc2V0dGluZwotCQkvLyBXZSBjYW4gb25seSBjb25uZWN0IHRvIEFQIHdpdGggbGVzcyBzZWN1cmVkIGNpcGhlciBzZXR0aW5nCi0JCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKLQkJewotCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5Hcm91cENpcGhlcjsKKwlpZiAoQnNzSWR4IDwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIpIHsKKwkJLyogQ2hlY2sgY2lwaGVyIHN1aXRlLCBBUCBtdXN0IGhhdmUgbW9yZSBzZWN1cmVkIGNpcGhlciB0aGFuIHN0YXRpb24gc2V0dGluZyAqLworCQkvKiBTZXQgdGhlIFBhaXJ3aXNlIGFuZCBHcm91cCBjaXBoZXIgdG8gbWF0Y2ggdGhlIGludGVuZGVkIEFQIHNldHRpbmcgKi8KKwkJLyogV2UgY2FuIG9ubHkgY29ubmVjdCB0byBBUCB3aXRoIGxlc3Mgc2VjdXJlZCBjaXBoZXIgc2V0dGluZyAqLworCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJICAgIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKSB7CisJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9CisJCQkgICAgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuCisJCQkgICAgR3JvdXBDaXBoZXI7CiAKLQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcikKLQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcjsKLQkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQotCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4OwotCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKLQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0KKwkJCSAgICBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS4KKwkJCSAgICBQYWlyQ2lwaGVyKQorCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPQorCQkJCSAgICBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLgorCQkJCSAgICBXUEEuUGFpckNpcGhlcjsKKwkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLgorCQkJCSBQYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0KKwkJCQkgICAgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS4KKwkJCQkgICAgV1BBLlBhaXJDaXBoZXJBdXg7CisJCQllbHNlCS8qIFRoZXJlIGlzIG5vIFBhaXJDaXBoZXIgQXV4LCBkb3duZ3JhZGUgb3VyIGNhcGFiaWxpdHkgdG8gVEtJUCAqLworCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPQorCQkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQl9IGVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorCQkJICAgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkgICAgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpIHsKKwkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0KKwkJCSAgICBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuCisJCQkgICAgR3JvdXBDaXBoZXI7CisKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0KKwkJCSAgICBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuCisJCQkgICAgUGFpckNpcGhlcikKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0KKwkJCQkgICAgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS4KKwkJCQkgICAgV1BBMi5QYWlyQ2lwaGVyOworCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLgorCQkJCSBQYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0KKwkJCQkgICAgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS4KKwkJCQkgICAgV1BBMi5QYWlyQ2lwaGVyQXV4OworCQkJZWxzZQkvKiBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAgKi8KKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0KKwkJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKworCQkJLyogUlNOIGNhcGFiaWxpdHkgKi8KKwkJCXBBZC0+U3RhQ2ZnLlJzbkNhcGFiaWxpdHkgPQorCQkJICAgIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi4KKwkJCSAgICBSc25DYXBhYmlsaXR5OwogCQl9Ci0JCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0JCXsKLQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLkdyb3VwQ2lwaGVyOworCQkvKiBTZXQgTWl4IGNpcGhlciBmbGFnICovCisJCXBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPQorCQkgICAgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0KKwkJICAgICBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcikgPyBGQUxTRSA6IFRSVUU7CisJCS8qaWYgKHBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPT0gVFJVRSkKKwkJICAgeworCQkgICAvLyBJZiBtaXggY2lwaGVyLCByZS1idWlsZCBSU05JRQorCQkgICBSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgMCk7CisJCSAgIH0gKi8KIAotCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlcikKLQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXI7Ci0JCQllbHNlIGlmIChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyQXV4OwotCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKLQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLQotCQkJLy8gUlNOIGNhcGFiaWxpdHkKLQkJCXBBZC0+U3RhQ2ZnLlJzbkNhcGFiaWxpdHkgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUnNuQ2FwYWJpbGl0eTsKLQkJfQotCi0JCS8vIFNldCBNaXggY2lwaGVyIGZsYWcKLQkJcEFkLT5TdGFDZmcuYk1peENpcGhlciA9IChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyKSA/IEZBTFNFIDogVFJVRTsKLQkJaWYgKHBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPT0gVFJVRSkKLQkJewotCQkJLy8gSWYgbWl4IGNpcGhlciwgcmUtYnVpbGQgUlNOSUUKLQkJCVJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCAwKTsKLQkJfQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBpdGVyYXRlIEJTUyAlbGQgb2YgJWRcbiIsIEJzc0lkeCwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJDTlRMIC0gaXRlcmF0ZSBCU1MgJWxkIG9mICVkXG4iLCBCc3NJZHgsCisJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yKSk7CiAJCUpvaW5QYXJtRmlsbChwQWQsICZKb2luUmVxLCBCc3NJZHgpOwotCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfSk9JTl9SRVEsIHNpemVvZihNTE1FX0pPSU5fUkVRX1NUUlVDVCksCi0JCQkJCSZKb2luUmVxKTsKKwkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0pPSU5fUkVRLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9qb2luX3JlcSksICZKb2luUmVxKTsKIAkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9KT0lOOwotCX0KLQllbHNlIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBbGwgQlNTIGZhaWw7IHN0YXJ0IGEgbmV3IEFESE9DIChTc2lkPSVzKS4uLlxuIixwQWQtPk1sbWVBdXguU3NpZCkpOwotCQlTdGFydFBhcm1GaWxsKHBBZCwgJlN0YXJ0UmVxLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOwotCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU1RBUlRfUkVRLCBzaXplb2YoTUxNRV9TVEFSVF9SRVFfU1RSVUNUKSwgJlN0YXJ0UmVxKTsKKwl9IGVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQ05UTCAtIEFsbCBCU1MgZmFpbDsgc3RhcnQgYSBuZXcgQURIT0MgKFNzaWQ9JXMpLi4uXG4iLAorCQkJICBwQWQtPk1sbWVBdXguU3NpZCkpOworCQlTdGFydFBhcm1GaWxsKHBBZCwgJlN0YXJ0UmVxLCAoY2hhciAqKXBBZC0+TWxtZUF1eC5Tc2lkLAorCQkJICAgICAgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU1RBUlRfUkVRLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9zdGFydF9yZXEpLCAmU3RhcnRSZXEpOwogCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1NUQVJUOwotCX0KLQllbHNlIC8vIG5vIG1vcmUgQlNTCisJfSBlbHNlCQkJLyogbm8gbW9yZSBCU1MgKi8KIAl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBbGwgcm9hbWluZyBmYWlsZWQsIHN0YXkgQCBjaCAjJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKLQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCisJCXsKKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDTlRMIC0gQWxsIHJvYW1pbmcgZmFpbGVkLCByZXN0b3JlIHRvIGNoYW5uZWwgJWQsIFRvdGFsIEJTU1slMDJkXVxuIiwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOworCQl9CisKIAkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKIAl9CiB9CiAKLS8vIGZvciByZS1hc3NvY2lhdGlvbiBvbmx5Ci0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgSXRlcmF0ZU9uQnNzVGFiMigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKKy8qIGZvciByZS1hc3NvY2lhdGlvbiBvbmx5ICovCisvKiBJUlFMID0gRElTUEFUQ0hfTEVWRUwgKi8KK3ZvaWQgSXRlcmF0ZU9uQnNzVGFiMihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QgUmVhc3NvY1JlcTsKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBCc3NJZHg7Ci0JQlNTX0VOVFJZICAgICAgICAgICAgICAgKnBCc3M7CisJc3RydWN0IHJ0X21sbWVfYXNzb2NfcmVxIFJlYXNzb2NSZXE7CisJdW5zaWduZWQgbG9uZyBCc3NJZHg7CisJc3RydWN0IHJ0X2Jzc19lbnRyeSAqcEJzczsKIAogCUJzc0lkeCA9IHBBZC0+TWxtZUF1eC5Sb2FtSWR4OwogCXBCc3MgPSAmcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzRW50cnlbQnNzSWR4XTsKIAotCWlmIChCc3NJZHggPCBwQWQtPk1sbWVBdXguUm9hbVRhYi5Cc3NOcikKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBpdGVyYXRlIEJTUyAlbGQgb2YgJWRcbiIsIEJzc0lkeCwgcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnIpKTsKKwlpZiAoQnNzSWR4IDwgcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnIpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJDTlRMIC0gaXRlcmF0ZSBCU1MgJWxkIG9mICVkXG4iLCBCc3NJZHgsCisJCQkgIHBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc05yKSk7CiAKIAkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQnNzLT5DaGFubmVsLCBGQUxTRSk7CiAJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBCc3MtPkNoYW5uZWwpOwogCi0JCS8vIHJlYXNzb2NpYXRlIG1lc3NhZ2UgaGFzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBhc3NvY2lhdGUgbWVzc2FnZQotCQlBc3NvY1Bhcm1GaWxsKHBBZCwgJlJlYXNzb2NSZXEsIHBCc3MtPkJzc2lkLCBwQnNzLT5DYXBhYmlsaXR5SW5mbywKLQkJCQkJICBBU1NPQ19USU1FT1VULCBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOworCQkvKiByZWFzc29jaWF0ZSBtZXNzYWdlIGhhcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgYXNzb2NpYXRlIG1lc3NhZ2UgKi8KKwkJQXNzb2NQYXJtRmlsbChwQWQsICZSZWFzc29jUmVxLCBwQnNzLT5Cc3NpZCwKKwkJCSAgICAgIHBCc3MtPkNhcGFiaWxpdHlJbmZvLCBBU1NPQ19USU1FT1VULAorCQkJICAgICAgcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50KTsKIAkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwKLQkJCQkJc2l6ZW9mKE1MTUVfUkVBU1NPQ19SRVFfU1RSVUNUKSwgJlJlYXNzb2NSZXEpOworCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9hc3NvY19yZXEpLCAmUmVhc3NvY1JlcSk7CiAKIAkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9SRUFTU09DOwotCX0KLQllbHNlIC8vIG5vIG1vcmUgQlNTCisJfSBlbHNlCQkJLyogbm8gbW9yZSBCU1MgKi8KIAl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBbGwgZmFzdCByb2FtaW5nIGZhaWxlZCwgYmFjayB0byBjaCAjJWRcbiIscEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwotCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKLQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkJeworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNOVEwgLSBBbGwgcm9hbWluZyBmYWlsZWQsIHJlc3RvcmUgdG8gY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLAorCQkJCSAgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5TY2FuVGFiLkJzc05yKSk7CisJCX0KKwogCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwogCX0KIH0KQEAgLTIyMzMsMTAgKzIyNzYsOCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIEpvaW5QYXJtRmlsbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBPVVQgTUxNRV9KT0lOX1JFUV9TVFJVQ1QgKkpvaW5SZXEsCi0JSU4gVUxPTkcgQnNzSWR4KQordm9pZCBKb2luUGFybUZpbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgIHN0cnVjdCBydF9tbG1lX2pvaW5fcmVxICpKb2luUmVxLCB1bnNpZ25lZCBsb25nIEJzc0lkeCkKIHsKIAlKb2luUmVxLT5Cc3NJZHggPSBCc3NJZHg7CiB9CkBAIC0yMjQ5LDE1ICsyMjkwLDEyIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgU2NhblBhcm1GaWxsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE9VVCBNTE1FX1NDQU5fUkVRX1NUUlVDVCAqU2NhblJlcSwKLQlJTiBDSEFSIFNzaWRbXSwKLQlJTiBVQ0hBUiBTc2lkTGVuLAotCUlOIFVDSEFSIEJzc1R5cGUsCi0JSU4gVUNIQVIgU2NhblR5cGUpCit2b2lkIFNjYW5QYXJtRmlsbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgc3RydWN0IHJ0X21sbWVfc2Nhbl9yZXEgKlNjYW5SZXEsCisJCSAgY2hhciBTc2lkW10sCisJCSAgdTggU3NpZExlbiwgdTggQnNzVHlwZSwgdTggU2NhblR5cGUpCiB7Ci0gICAgTmRpc1plcm9NZW1vcnkoU2NhblJlcS0+U3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwlOZGlzWmVyb01lbW9yeShTY2FuUmVxLT5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOwogCVNjYW5SZXEtPlNzaWRMZW4gPSBTc2lkTGVuOwogCU5kaXNNb3ZlTWVtb3J5KFNjYW5SZXEtPlNzaWQsIFNzaWQsIFNzaWRMZW4pOwogCVNjYW5SZXEtPkJzc1R5cGUgPSBCc3NUeXBlOwpAQCAtMjI3MiwxMSArMjMxMCw5IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgU3RhcnRQYXJtRmlsbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBPVVQgTUxNRV9TVEFSVF9SRVFfU1RSVUNUICpTdGFydFJlcSwKLQlJTiBDSEFSIFNzaWRbXSwKLQlJTiBVQ0hBUiBTc2lkTGVuKQordm9pZCBTdGFydFBhcm1GaWxsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgc3RydWN0IHJ0X21sbWVfc3RhcnRfcmVxICpTdGFydFJlcSwKKwkJICAgY2hhciBTc2lkW10sIHU4IFNzaWRMZW4pCiB7CiAJQVNTRVJUKFNzaWRMZW4gPD0gTUFYX0xFTl9PRl9TU0lEKTsKIAlOZGlzTW92ZU1lbW9yeShTdGFydFJlcS0+U3NpZCwgU3NpZCwgU3NpZExlbik7CkBAIC0yMjkxLDExICsyMzI3LDkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBBdXRoUGFybUZpbGwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gT1VUIE1MTUVfQVVUSF9SRVFfU1RSVUNUICpBdXRoUmVxLAotCUlOIFBVQ0hBUiBwQWRkciwKLQlJTiBVU0hPUlQgQWxnKQordm9pZCBBdXRoUGFybUZpbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgIHN0cnVjdCBydF9tbG1lX2F1dGhfcmVxICpBdXRoUmVxLAorCQkgIHU4ICpwQWRkciwgdTE2IEFsZykKIHsKIAlDT1BZX01BQ19BRERSKEF1dGhSZXEtPkFkZHIsIHBBZGRyKTsKIAlBdXRoUmVxLT5BbGcgPSBBbGc7CkBAIC0yMzEwLDgyICsyMzQ0LDEwOSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotCi0KLSNpZmRlZiBSVDI4NzAKLQotVk9JRCBNbG1lQ250bENvbmZpcm0oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUxPTkcgTXNnVHlwZSwKLQlJTiBVU0hPUlQgTXNnKQorI2lmZGVmIFJUTVBfTUFDX1BDSQordm9pZCBDb21wb3NlUHNQb2xsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNc2dUeXBlLCBzaXplb2YoVVNIT1JUKSwgJk1zZyk7Ci19Ci0jZW5kaWYKLQotVk9JRCBDb21wb3NlUHNQb2xsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotI2lmZGVmIFJUMjg3MAotCVBUWElORk9fU1RSVUMJCXBUeEluZm87Ci0JUFRYV0lfU1RSVUMJCXBUeFdJOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ29tcG9zZVBzUG9sbFxuIikpOwotI2VuZGlmCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+UHNQb2xsRnJhbWUsIHNpemVvZihQU1BPTExfRlJBTUUpKTsKLQotI2lmZGVmIFJUMjg3MAotCXBBZC0+UHNQb2xsRnJhbWUuRkMuUHdyTWdtdCA9IDA7Ci0jZW5kaWYKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5Qc1BvbGxGcmFtZSwgc2l6ZW9mKHN0cnVjdCBydF9wc3BvbGxfZnJhbWUpKTsKIAlwQWQtPlBzUG9sbEZyYW1lLkZDLlR5cGUgPSBCVFlQRV9DTlRMOwogCXBBZC0+UHNQb2xsRnJhbWUuRkMuU3ViVHlwZSA9IFNVQlRZUEVfUFNfUE9MTDsKIAlwQWQtPlBzUG9sbEZyYW1lLkFpZCA9IHBBZC0+U3RhQWN0aXZlLkFpZCB8IDB4QzAwMDsKIAlDT1BZX01BQ19BRERSKHBBZC0+UHNQb2xsRnJhbWUuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAlDT1BZX01BQ19BRERSKHBBZC0+UHNQb2xsRnJhbWUuVGEsIHBBZC0+Q3VycmVudEFkZHJlc3MpOwotCi0jaWZkZWYgUlQyODcwCi0JUlRNUFplcm9NZW1vcnkoJnBBZC0+UHNQb2xsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbMF0sIDEwMCk7Ci0JcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKSZwQWQtPlBzUG9sbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdOwotCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sIChVU0hPUlQpKHNpemVvZihQU1BPTExfRlJBTUUpK1RYV0lfU0laRSksIFRSVUUsIEVwVG9RdWV1ZVtNR01UUElQRUlEWF0sIEZBTFNFLCAgRkFMU0UpOwotCXBUeFdJID0gKFBUWFdJX1NUUlVDKSZwQWQtPlBzUG9sbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W1RYSU5GT19TSVpFXTsKLQlSVE1QV3JpdGVUeFdJKHBBZCwgcFR4V0ksIEZBTFNFLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCBGQUxTRSwgMCwgQlNTSURfV0NJRCwgKHNpemVvZihQU1BPTExfRlJBTUUpKSwKLQkJMCwgIDAsIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLCBJRlNfQkFDS09GRiwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOwotCVJUTVBNb3ZlTWVtb3J5KCZwQWQtPlBzUG9sbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W1RYV0lfU0laRStUWElORk9fU0laRV0sICZwQWQtPlBzUG9sbEZyYW1lLCBzaXplb2YoUFNQT0xMX0ZSQU1FKSk7Ci0JLy8gQXBwZW5kIDQgZXh0cmEgemVybyBieXRlcy4KLQlwQWQtPlBzUG9sbENvbnRleHQuQnVsa091dFNpemUgPSAgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBzaXplb2YoUFNQT0xMX0ZSQU1FKSArIDQ7Ci0jZW5kaWYKIH0KIAotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIENvbXBvc2VOdWxsRnJhbWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCisvKiBJUlFMID0gRElTUEFUQ0hfTEVWRUwgKi8KK3ZvaWQgQ29tcG9zZU51bGxGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0jaWZkZWYgUlQyODcwCi0JUFRYSU5GT19TVFJVQwkJcFR4SW5mbzsKLQlQVFhXSV9TVFJVQwkJcFR4V0k7Ci0jZW5kaWYKLQotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk51bGxGcmFtZSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5OdWxsRnJhbWUsIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOwogCXBBZC0+TnVsbEZyYW1lLkZDLlR5cGUgPSBCVFlQRV9EQVRBOwogCXBBZC0+TnVsbEZyYW1lLkZDLlN1YlR5cGUgPSBTVUJUWVBFX05VTExfRlVOQzsKIAlwQWQtPk51bGxGcmFtZS5GQy5Ub0RzID0gMTsKIAlDT1BZX01BQ19BRERSKHBBZC0+TnVsbEZyYW1lLkFkZHIxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CiAJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotI2lmZGVmIFJUMjg3MAotCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXSwgMTAwKTsKLQlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpJnBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdOwotCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sIChVU0hPUlQpKHNpemVvZihIRUFERVJfODAyXzExKStUWFdJX1NJWkUpLCBUUlVFLCBFcFRvUXVldWVbTUdNVFBJUEVJRFhdLCBGQUxTRSwgIEZBTFNFKTsKLQlwVHhXSSA9IChQVFhXSV9TVFJVQykmcEFkLT5OdWxsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbVFhJTkZPX1NJWkVdOwotCVJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCAwLCBCU1NJRF9XQ0lELCAoc2l6ZW9mKEhFQURFUl84MDJfMTEpKSwKLQkJMCwgMCwgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7Ci0JUlRNUE1vdmVNZW1vcnkoJnBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W1RYV0lfU0laRStUWElORk9fU0laRV0sICZwQWQtPk51bGxGcmFtZSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQlwQWQtPk51bGxDb250ZXh0LkJ1bGtPdXRTaXplID0gIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgc2l6ZW9mKHBBZC0+TnVsbEZyYW1lKSArIDQ7Ci0jZW5kaWYKK30KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKK3ZvaWQgTWxtZUNudGxDb25maXJtKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdW5zaWduZWQgbG9uZyBNc2dUeXBlLCB1MTYgTXNnKQoreworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1zZ1R5cGUsIHNpemVvZih1MTYpLAorCQkgICAgJk1zZyk7CiB9CiAKK3ZvaWQgQ29tcG9zZVBzUG9sbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJc3RydWN0IHJ0X3R4aW5mbyAqcFR4SW5mbzsKKwlzdHJ1Y3QgcnRfdHh3aSAqIHBUeFdJOwogCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ29tcG9zZVBzUG9sbFxuIikpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlBzUG9sbEZyYW1lLCBzaXplb2Yoc3RydWN0IHJ0X3BzcG9sbF9mcmFtZSkpOwogCisJcEFkLT5Qc1BvbGxGcmFtZS5GQy5Qd3JNZ210ID0gMDsKKwlwQWQtPlBzUG9sbEZyYW1lLkZDLlR5cGUgPSBCVFlQRV9DTlRMOworCXBBZC0+UHNQb2xsRnJhbWUuRkMuU3ViVHlwZSA9IFNVQlRZUEVfUFNfUE9MTDsKKwlwQWQtPlBzUG9sbEZyYW1lLkFpZCA9IHBBZC0+U3RhQWN0aXZlLkFpZCB8IDB4QzAwMDsKKwlDT1BZX01BQ19BRERSKHBBZC0+UHNQb2xsRnJhbWUuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlDT1BZX01BQ19BRERSKHBBZC0+UHNQb2xsRnJhbWUuVGEsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJUlRNUFplcm9NZW1vcnkoJnBBZC0+UHNQb2xsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuCisJCSAgICAgICBXaXJlbGVzc1BhY2tldFswXSwgMTAwKTsKKwlwVHhJbmZvID0KKwkgICAgKHN0cnVjdCBydF90eGluZm8gKikmIHBBZC0+UHNQb2xsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuCisJICAgIFdpcmVsZXNzUGFja2V0WzBdOworCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sCisJCQkodTE2KShzaXplb2Yoc3RydWN0IHJ0X3BzcG9sbF9mcmFtZSkgKyBUWFdJX1NJWkUpLCBUUlVFLAorCQkJRXBUb1F1ZXVlW01HTVRQSVBFSURYXSwgRkFMU0UsIEZBTFNFKTsKKwlwVHhXSSA9CisJICAgIChzdHJ1Y3QgcnRfdHh3aSAqKSAmIHBBZC0+UHNQb2xsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuCisJICAgIFdpcmVsZXNzUGFja2V0W1RYSU5GT19TSVpFXTsKKwlSVE1QV3JpdGVUeFdJKHBBZCwgcFR4V0ksIEZBTFNFLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCBGQUxTRSwgMCwKKwkJICAgICAgQlNTSURfV0NJRCwgKHNpemVvZihzdHJ1Y3QgcnRfcHNwb2xsX2ZyYW1lKSksIDAsIDAsCisJCSAgICAgICh1OClwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLAorCQkgICAgICBJRlNfQkFDS09GRiwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOworCVJUTVBNb3ZlTWVtb3J5KCZwQWQtPlBzUG9sbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLgorCQkgICAgICAgV2lyZWxlc3NQYWNrZXRbVFhXSV9TSVpFICsgVFhJTkZPX1NJWkVdLAorCQkgICAgICAgJnBBZC0+UHNQb2xsRnJhbWUsIHNpemVvZihzdHJ1Y3QgcnRfcHNwb2xsX2ZyYW1lKSk7CisJLyogQXBwZW5kIDQgZXh0cmEgemVybyBieXRlcy4gKi8KKwlwQWQtPlBzUG9sbENvbnRleHQuQnVsa091dFNpemUgPQorCSAgICBUWElORk9fU0laRSArIFRYV0lfU0laRSArIHNpemVvZihzdHJ1Y3QgcnRfcHNwb2xsX2ZyYW1lKSArIDQ7Cit9CisKKy8qIElSUUwgPSBESVNQQVRDSF9MRVZFTCAqLwordm9pZCBDb21wb3NlTnVsbEZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlzdHJ1Y3QgcnRfdHhpbmZvICpwVHhJbmZvOworCXN0cnVjdCBydF90eHdpICogcFR4V0k7CisKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5OdWxsRnJhbWUsIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOworCXBBZC0+TnVsbEZyYW1lLkZDLlR5cGUgPSBCVFlQRV9EQVRBOworCXBBZC0+TnVsbEZyYW1lLkZDLlN1YlR5cGUgPSBTVUJUWVBFX05VTExfRlVOQzsKKwlwQWQtPk51bGxGcmFtZS5GQy5Ub0RzID0gMTsKKwlDT1BZX01BQ19BRERSKHBBZC0+TnVsbEZyYW1lLkFkZHIxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC4KKwkJICAgICAgIFdpcmVsZXNzUGFja2V0WzBdLCAxMDApOworCXBUeEluZm8gPQorCSAgICAoc3RydWN0IHJ0X3R4aW5mbyAqKSYgcEFkLT5OdWxsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuCisJICAgIFdpcmVsZXNzUGFja2V0WzBdOworCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sCisJCQkodTE2KShzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpICsgVFhXSV9TSVpFKSwgVFJVRSwKKwkJCUVwVG9RdWV1ZVtNR01UUElQRUlEWF0sIEZBTFNFLCBGQUxTRSk7CisJcFR4V0kgPQorCSAgICAoc3RydWN0IHJ0X3R4d2kgKikgJiBwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC4KKwkgICAgV2lyZWxlc3NQYWNrZXRbVFhJTkZPX1NJWkVdOworCVJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCAwLAorCQkgICAgICBCU1NJRF9XQ0lELCAoc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSksIDAsIDAsCisJCSAgICAgICh1OClwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLAorCQkgICAgICBJRlNfQkFDS09GRiwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOworCVJUTVBNb3ZlTWVtb3J5KCZwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC4KKwkJICAgICAgIFdpcmVsZXNzUGFja2V0W1RYV0lfU0laRSArIFRYSU5GT19TSVpFXSwgJnBBZC0+TnVsbEZyYW1lLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSk7CisJcEFkLT5OdWxsQ29udGV4dC5CdWxrT3V0U2l6ZSA9CisJICAgIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgc2l6ZW9mKHBBZC0+TnVsbEZyYW1lKSArIDQ7Cit9CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTIzOTcsNzMgKzI0NTgsNzEgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVUxPTkcgTWFrZUlic3NCZWFjb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit1bnNpZ25lZCBsb25nIE1ha2VJYnNzQmVhY29uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlVQ0hBUiAgICAgICAgIERzTGVuID0gMSwgSWJzc0xlbiA9IDI7Ci0JVUNIQVIgICAgICAgICBMb2NhbEVycEllWzNdID0ge0lFX0VSUCwgMSwgMHgwNH07Ci0JSEVBREVSXzgwMl8xMSBCY25IZHI7Ci0JVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbzsKKwl1OCBEc0xlbiA9IDEsIElic3NMZW4gPSAyOworCXU4IExvY2FsRXJwSWVbM10gPSB7IElFX0VSUCwgMSwgMHgwNCB9OworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIEJjbkhkcjsKKwl1MTYgQ2FwYWJpbGl0eUluZm87CiAJTEFSR0VfSU5URUdFUiBGYWtlVGltZXN0YW1wOwotCVVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOwotCVBUWFdJX1NUUlVDCSAgcFR4V0kgPSAmcEFkLT5CZWFjb25UeFdJOwotCUNIQVIgICAgICAgICAqcEJlYWNvbkZyYW1lID0gcEFkLT5CZWFjb25CdWY7Ci0JQk9PTEVBTiAgICAgICBQcml2YWN5OwotCVVDSEFSICAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIgICAgICAgICBTdXBSYXRlTGVuID0gMDsKLQlVQ0hBUiAgICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSICAgICAgICAgRXh0UmF0ZUxlbiA9IDA7Ci0JVUNIQVIgICAgICAgICBSU05JZSA9IElFX1dQQTsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuID0gMDsKKwlzdHJ1Y3QgcnRfdHh3aSAqIHBUeFdJID0gJnBBZC0+QmVhY29uVHhXSTsKKwl1OCAqcEJlYWNvbkZyYW1lID0gcEFkLT5CZWFjb25CdWY7CisJQk9PTEVBTiBQcml2YWN5OworCXU4IFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCXU4IFN1cFJhdGVMZW4gPSAwOworCXU4IEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCXU4IEV4dFJhdGVMZW4gPSAwOworCXU4IFJTTkllID0gSUVfV1BBOwogCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSkKLQl7Ci0JCVN1cFJhdGVbMF0gPSAweDgyOyAvLyAxIG1icHMKLQkJU3VwUmF0ZVsxXSA9IDB4ODQ7IC8vIDIgbWJwcwotCQlTdXBSYXRlWzJdID0gMHg4YjsgLy8gNS41IG1icHMKLQkJU3VwUmF0ZVszXSA9IDB4OTY7IC8vIDExIG1icHMKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpKSB7CisJCVN1cFJhdGVbMF0gPSAweDgyOwkvKiAxIG1icHMgKi8KKwkJU3VwUmF0ZVsxXSA9IDB4ODQ7CS8qIDIgbWJwcyAqLworCQlTdXBSYXRlWzJdID0gMHg4YjsJLyogNS41IG1icHMgKi8KKwkJU3VwUmF0ZVszXSA9IDB4OTY7CS8qIDExIG1icHMgKi8KIAkJU3VwUmF0ZUxlbiA9IDQ7CiAJCUV4dFJhdGVMZW4gPSAwOwotCX0KLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JewotCQlTdXBSYXRlWzBdICA9IDB4OEM7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJU3VwUmF0ZVsxXSAgPSAweDEyOyAgICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCVN1cFJhdGVbMl0gID0gMHg5ODsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJU3VwUmF0ZVszXSAgPSAweDI0OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlTdXBSYXRlWzRdICA9IDB4YjA7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCVN1cFJhdGVbNV0gID0gMHg0ODsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJU3VwUmF0ZVs2XSAgPSAweDYwOyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlTdXBSYXRlWzddICA9IDB4NmM7ICAgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCVN1cFJhdGVMZW4gID0gODsKLQkJRXh0UmF0ZUxlbiAgPSAwOworCX0gZWxzZSBpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KSB7CisJCVN1cFJhdGVbMF0gPSAweDhDOwkvKiA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCVN1cFJhdGVbMV0gPSAweDEyOwkvKiA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCVN1cFJhdGVbMl0gPSAweDk4OwkvKiAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZSAqLworCQlTdXBSYXRlWzNdID0gMHgyNDsJLyogMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJU3VwUmF0ZVs0XSA9IDB4YjA7CS8qIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCVN1cFJhdGVbNV0gPSAweDQ4OwkvKiAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlTdXBSYXRlWzZdID0gMHg2MDsJLyogNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJU3VwUmF0ZVs3XSA9IDB4NmM7CS8qIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCVN1cFJhdGVMZW4gPSA4OworCQlFeHRSYXRlTGVuID0gMDsKIAotCQkvLwotCQkvLyBBbHNvIFVwZGF0ZSBNbG1lUmF0ZSAmIFJ0c1JhdGUgZm9yIEcgb25seSAmIEEgb25seQotCQkvLworCQkvKiAqLworCQkvKiBBbHNvIFVwZGF0ZSBNbG1lUmF0ZSAmIFJ0c1JhdGUgZm9yIEcgb25seSAmIEEgb25seSAqLworCQkvKiAqLwogCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKIAkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfNjsKIAkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOwotCX0KLQllbHNlCi0JewotCQlTdXBSYXRlWzBdID0gMHg4MjsgLy8gMSBtYnBzCi0JCVN1cFJhdGVbMV0gPSAweDg0OyAvLyAyIG1icHMKLQkJU3VwUmF0ZVsyXSA9IDB4OGI7IC8vIDUuNSBtYnBzCi0JCVN1cFJhdGVbM10gPSAweDk2OyAvLyAxMSBtYnBzCisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPQorCQkgICAgT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA9CisJCSAgICBNT0RFX09GRE07CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPQorCQkgICAgT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCX0gZWxzZSB7CisJCVN1cFJhdGVbMF0gPSAweDgyOwkvKiAxIG1icHMgKi8KKwkJU3VwUmF0ZVsxXSA9IDB4ODQ7CS8qIDIgbWJwcyAqLworCQlTdXBSYXRlWzJdID0gMHg4YjsJLyogNS41IG1icHMgKi8KKwkJU3VwUmF0ZVszXSA9IDB4OTY7CS8qIDExIG1icHMgKi8KIAkJU3VwUmF0ZUxlbiA9IDQ7CiAKLQkJRXh0UmF0ZVswXSAgPSAweDBDOyAgICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLAotCQlFeHRSYXRlWzFdICA9IDB4MTI7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJRXh0UmF0ZVsyXSAgPSAweDE4OyAgICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywKLQkJRXh0UmF0ZVszXSAgPSAweDI0OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlFeHRSYXRlWzRdICA9IDB4MzA7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLAotCQlFeHRSYXRlWzVdICA9IDB4NDg7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCUV4dFJhdGVbNl0gID0gMHg2MDsgICAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJRXh0UmF0ZVs3XSAgPSAweDZjOyAgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlFeHRSYXRlTGVuICA9IDg7CisJCUV4dFJhdGVbMF0gPSAweDBDOwkvKiA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCAqLworCQlFeHRSYXRlWzFdID0gMHgxMjsJLyogOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlFeHRSYXRlWzJdID0gMHgxODsJLyogMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsICovCisJCUV4dFJhdGVbM10gPSAweDI0OwkvKiAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlFeHRSYXRlWzRdID0gMHgzMDsJLyogMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsICovCisJCUV4dFJhdGVbNV0gPSAweDQ4OwkvKiAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlFeHRSYXRlWzZdID0gMHg2MDsJLyogNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJRXh0UmF0ZVs3XSA9IDB4NmM7CS8qIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCUV4dFJhdGVMZW4gPSA4OwogCX0KIAogCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOwpAQCAtMjQ3MSw5OSArMjUzMCw5NiBAQAogCXBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOwogCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLkV4dFJhdGUsIEV4dFJhdGUsIEV4dFJhdGVMZW4pOwogCi0JLy8gY29tcG9zZSBJQlNTIGJlYWNvbiBmcmFtZQotCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQmNuSGRyLCBTVUJUWVBFX0JFQUNPTiwgMCwgQlJPQURDQVNUX0FERFIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQlQcml2YWN5ID0gKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB8fAotCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8Ci0JCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCk7Ci0JQ2FwYWJpbGl0eUluZm8gPSBDQVBfR0VORVJBVEUoMCwgMSwgUHJpdmFjeSwgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KSwgMCwgMCk7CisJLyogY29tcG9zZSBJQlNTIGJlYWNvbiBmcmFtZSAqLworCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQmNuSGRyLCBTVUJUWVBFX0JFQUNPTiwgMCwgQlJPQURDQVNUX0FERFIsCisJCQkgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCVByaXZhY3kgPSAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpCisJICAgIHx8IChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkgICAgfHwgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKTsKKwlDYXBhYmlsaXR5SW5mbyA9CisJICAgIENBUF9HRU5FUkFURSgwLCAxLCBQcml2YWN5LAorCQkJIChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVTaG9ydCksCisJCQkgMCwgMCk7CiAKLQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUsICAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICAgICAgICAmQmNuSGRyLAotCQkJCQkgIFRJTUVTVEFNUF9MRU4sICAgICAgICAgICAgICAgICAgICZGYWtlVGltZXN0YW1wLAotCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QsCi0JCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNhcGFiaWxpdHlJbmZvLAotCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCi0JCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgICAgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZCwKLQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAotCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlTGVuLAotCQkJCQkgIFN1cFJhdGVMZW4sICAgICAgICAgICAgICAgICAgICAgIFN1cFJhdGUsCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRzSWUsCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRzTGVuLAotCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5DaGFubmVsLAotCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJYnNzSWUsCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NMZW4sCi0JCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLkF0aW1XaW4sCi0JCQkJCSAgRU5EX09GX0FSR1MpOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSwgJkZyYW1lTGVuLAorCQkJICBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpLCAmQmNuSGRyLAorCQkJICBUSU1FU1RBTVBfTEVOLCAmRmFrZVRpbWVzdGFtcCwKKwkJCSAgMiwgJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCwKKwkJCSAgMiwgJkNhcGFiaWxpdHlJbmZvLAorCQkJICAxLCAmU3NpZEllLAorCQkJICAxLCAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKKwkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwKKwkJCSAgMSwgJlN1cFJhdGVJZSwKKwkJCSAgMSwgJlN1cFJhdGVMZW4sCisJCQkgIFN1cFJhdGVMZW4sIFN1cFJhdGUsCisJCQkgIDEsICZEc0llLAorCQkJICAxLCAmRHNMZW4sCisJCQkgIDEsICZwQWQtPkNvbW1vbkNmZy5DaGFubmVsLAorCQkJICAxLCAmSWJzc0llLAorCQkJICAxLCAmSWJzc0xlbiwgMiwgJnBBZC0+U3RhQWN0aXZlLkF0aW1XaW4sIEVORF9PRl9BUkdTKTsKIAotCS8vIGFkZCBFUlBfSUUgYW5kIEVYVF9SQUUgSUUgb2YgaW4gODAyLjExZwotCWlmIChFeHRSYXRlTGVuKQotCXsKLQkJVUxPTkcJdG1wOworCS8qIGFkZCBFUlBfSUUgYW5kIEVYVF9SQUUgSUUgb2YgaW4gODAyLjExZyAqLworCWlmIChFeHRSYXRlTGVuKSB7CisJCXVuc2lnbmVkIGxvbmcgdG1wOwogCi0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSArIEZyYW1lTGVuLCAgICAgICAgICZ0bXAsCi0JCQkJCQkgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsRXJwSWUsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlTGVuLAotCQkJCQkJICBFeHRSYXRlTGVuLCAgICAgICAgICAgICAgICAgICAgICBFeHRSYXRlLAotCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSArIEZyYW1lTGVuLCAmdG1wLAorCQkJCSAgMywgTG9jYWxFcnBJZSwKKwkJCQkgIDEsICZFeHRSYXRlSWUsCisJCQkJICAxLCAmRXh0UmF0ZUxlbiwKKwkJCQkgIEV4dFJhdGVMZW4sIEV4dFJhdGUsIEVORF9PRl9BUkdTKTsKKwkJRnJhbWVMZW4gKz0gdG1wOworCX0KKwkvKiBJZiBhZGhvYyBzZWNydWl0eSBpcyBzZXQgZm9yIFdQQS1Ob25lLCBhcHBlbmQgdGhlIGNpcGhlciBzdWl0ZSBJRSAqLworCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKSB7CisJCXVuc2lnbmVkIGxvbmcgdG1wOworCQlSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywKKwkJCSAgICAgIEJTUzApOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSArIEZyYW1lTGVuLCAmdG1wLAorCQkJCSAgMSwgJlJTTkllLAorCQkJCSAgMSwgJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwKKwkJCQkgIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwgcEFkLT5TdGFDZmcuUlNOX0lFLAorCQkJCSAgRU5EX09GX0FSR1MpOwogCQlGcmFtZUxlbiArPSB0bXA7CiAJfQogCi0JLy8gSWYgYWRob2Mgc2VjcnVpdHkgaXMgc2V0IGZvciBXUEEtTm9uZSwgYXBwZW5kIHRoZSBjaXBoZXIgc3VpdGUgSUUKLQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQl7Ci0JCVVMT05HIHRtcDsKLSAgICAgICAgUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIEJTUzApOworCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkgeworCQl1bnNpZ25lZCBsb25nIFRtcExlbjsKKwkJdTggSHRMZW4sIEh0TGVuMTsKIAotCQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUgKyBGcmFtZUxlbiwgICAgICAgIAkmdG1wLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkmUlNOSWUsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAotCQkJCQkJICBwQWQtPlN0YUNmZy5SU05JRV9MZW4sICAgICAgCQlwQWQtPlN0YUNmZy5SU05fSUUsCi0JCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJRnJhbWVMZW4gKz0gdG1wOwotCX0KLQotCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKLQl7Ci0JCVVMT05HIFRtcExlbjsKLQkJVUNIQVIgSHRMZW4sIEh0TGVuMTsKLQotCQkvLyBhZGQgSFQgQ2FwYWJpbGl0eSBJRQorCQkvKiBhZGQgSFQgQ2FwYWJpbGl0eSBJRSAqLwogCQlIdExlbiA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpOwogCQlIdExlbjEgPSBzaXplb2YocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKTsKIAotCQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUrRnJhbWVMZW4sCSZUbXBMZW4sCi0JCQkJCQkgIDEsCQkJCQkJJkh0Q2FwSWUsCi0JCQkJCQkgIDEsCQkJCQkJJkh0TGVuLAotCQkJCQkJICBIdExlbiwJCQkJCSZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCi0JCQkJCQkgIDEsCQkJCQkJJkFkZEh0SW5mb0llLAotCQkJCQkJICAxLAkJCQkJCSZIdExlbjEsCi0JCQkJCQkgIEh0TGVuMSwJCQkJCSZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sCi0JCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lICsgRnJhbWVMZW4sICZUbXBMZW4sCisJCQkJICAxLCAmSHRDYXBJZSwKKwkJCQkgIDEsICZIdExlbiwKKwkJCQkgIEh0TGVuLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAorCQkJCSAgMSwgJkFkZEh0SW5mb0llLAorCQkJCSAgMSwgJkh0TGVuMSwKKwkJCQkgIEh0TGVuMSwgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywKKwkJCQkgIEVORF9PRl9BUkdTKTsKIAogCQlGcmFtZUxlbiArPSBUbXBMZW47CiAJfQotCi0JLy9iZWFjb24gdXNlIHJlc2VydmVkIFdDSUQgMHhmZgotICAgIGlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0gICAgewotCVJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCAgVFJVRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCAwLCAweGZmLCBGcmFtZUxlbiwKLQkJUElEX01HTVQsIFBJRF9CRUFDT04sIFJBVEVfMSwgSUZTX0hUVFhPUCwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvLyBTZXQgdG8gdXNlIDFNYnBzIGZvciBBZGhvYyBiZWFjb24uCisJLypiZWFjb24gdXNlIHJlc2VydmVkIFdDSUQgMHhmZiAqLworCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpIHsKKwkJUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCBGQUxTRSwKKwkJCSAgICAgIFRSVUUsIDAsIDB4ZmYsIEZyYW1lTGVuLCBQSURfTUdNVCwgUElEX0JFQUNPTiwKKwkJCSAgICAgIFJBVEVfMSwgSUZTX0hUVFhPUCwgRkFMU0UsCisJCQkgICAgICAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKKwl9IGVsc2UgeworCQkvKiBTZXQgdG8gdXNlIDFNYnBzIGZvciBBZGhvYyBiZWFjb24uICovCiAJCUhUVFJBTlNNSVRfU0VUVElORyBUcmFuc21pdDsKLSAgICAgICAgVHJhbnNtaXQud29yZCA9IDA7Ci0gICAgICAgIFJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCAgVFJVRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCAwLCAweGZmLCBGcmFtZUxlbiwKLSAgICAJCVBJRF9NR01ULCBQSURfQkVBQ09OLCBSQVRFXzEsIElGU19IVFRYT1AsIEZBTFNFLCAmVHJhbnNtaXQpOwotICAgIH0KKwkJVHJhbnNtaXQud29yZCA9IDA7CisJCVJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCBUUlVFLCBGQUxTRSwgRkFMU0UsCisJCQkgICAgICBUUlVFLCAwLCAweGZmLCBGcmFtZUxlbiwgUElEX01HTVQsIFBJRF9CRUFDT04sCisJCQkgICAgICBSQVRFXzEsIElGU19IVFRYT1AsIEZBTFNFLCAmVHJhbnNtaXQpOworCX0KIAotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1ha2VJYnNzQmVhY29uIChsZW49JWxkKSwgU3VwUmF0ZUxlbj0lZCwgRXh0UmF0ZUxlbj0lZCwgQ2hhbm5lbD0lZCwgUGh5TW9kZT0lZFxuIiwKLQkJCQkJRnJhbWVMZW4sIFN1cFJhdGVMZW4sIEV4dFJhdGVMZW4sIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiTWFrZUlic3NCZWFjb24gKGxlbj0lbGQpLCBTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkLCBDaGFubmVsPSVkLCBQaHlNb2RlPSVkXG4iLAorCQkgIEZyYW1lTGVuLCBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKIAlyZXR1cm4gRnJhbWVMZW47CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvcnRtcF9kYXRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9ydG1wX2RhdGEuYwppbmRleCBmNzUxYWI2Li41ZDM0OGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9ydG1wX2RhdGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9ydG1wX2RhdGEuYwpAQCAtMzMsMTExICszMywxNjcgQEAKIAlSZXZpc2lvbiBIaXN0b3J5OgogCVdobyAJCVdoZW4JCQlXaGF0CiAJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4JCSAgICAgIEF1Zy8xNy8wNAkJbWFqb3IgbW9kaWZpY2F0aW9uIGZvciBSVDI1NjEvMjY2MQotCUphbiBMZWUJICAgICAgTWFyLzE3LzA2CQltYWpvciBtb2RpZmljYXRpb24gZm9yIFJUMjg2MCBOZXcgUmluZyBEZXNpZ24KICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKLQotCi1WT0lEIFNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3ZvaWQgU1RBUnhFQVBPTEZyYW1lSW5kaWNhdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksCisJCQkgICAgIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpCiB7Ci0JUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCA9ICYocFJ4QmxrLT5SeEQpOwotCVBSWFdJX1NUUlVDCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7Ci0JVUNIQVIJCQkqcFRtcEJ1ZjsKKwlQUlQyOFhYX1JYRF9TVFJVQyBwUnhEID0gJihwUnhCbGstPlJ4RCk7CisJc3RydWN0IHJ0X3J4d2kgKiBwUnhXSSA9IHBSeEJsay0+cFJ4V0k7CisJdTggKnBUbXBCdWY7CiAKLQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKQotCXsKLQkJLy8gQWxsIEVBUG9MIGZyYW1lcyBoYXZlIHRvIHBhc3MgdG8gdXBwZXIgbGF5ZXIgKGV4LiBXUEFfU1VQUExJQ0FOVCBkYWVtb24pCi0JCS8vIFRCRCA6IHByb2Nlc3MgZnJhZ21lbnRlZCBFQVBvbCBmcmFtZXMKKwlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSB7CisJCS8qIEFsbCBFQVBvTCBmcmFtZXMgaGF2ZSB0byBwYXNzIHRvIHVwcGVyIGxheWVyIChleC4gV1BBX1NVUFBMSUNBTlQgZGFlbW9uKSAqLworCQkvKiBUQkQgOiBwcm9jZXNzIGZyYWdtZW50ZWQgRUFQb2wgZnJhbWVzICovCiAJCXsKLQkJCS8vIEluIDgwMi4xeCBtb2RlLCBpZiB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgRUFQLVNVQ0NFU1MgcGFja2V0LCB0dXJuIG9uIHRoZSBQb3J0U2VjdXJlZCB2YXJpYWJsZQotCQkJaWYgKCBwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSAmJgotCQkJCSAoRUFQX0NPREVfU1VDQ0VTUyA9PSBXcGFDaGVja0VhcENvZGUocEFkLCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplLCBMRU5HVEhfODAyXzFfSCkpKQotCQkJewotCQkJCVBVQ0hBUglLZXk7Ci0JCQkJVUNIQVIgCUNpcGhlckFsZzsKLQkJCQlpbnQgICAgIGlkeCA9IDA7CisJCQkvKiBJbiA4MDIuMXggbW9kZSwgaWYgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIEVBUC1TVUNDRVNTIHBhY2tldCwgdHVybiBvbiB0aGUgUG9ydFNlY3VyZWQgdmFyaWFibGUgKi8KKwkJCWlmIChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSAmJgorCQkJICAgIChFQVBfQ09ERV9TVUNDRVNTID09CisJCQkgICAgIFdwYUNoZWNrRWFwQ29kZShwQWQsIHBSeEJsay0+cERhdGEsCisJCQkJCSAgICAgcFJ4QmxrLT5EYXRhU2l6ZSwKKwkJCQkJICAgICBMRU5HVEhfODAyXzFfSCkpKSB7CisJCQkJdTggKktleTsKKwkJCQl1OCBDaXBoZXJBbGc7CisJCQkJaW50IGlkeCA9IDA7CiAKLQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVAtU1VDQ0VTUyBQYWNrZXRcbiIpKTsKKwkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAgICAgKCJSZWNlaXZlIEVBUC1TVUNDRVNTIFBhY2tldFxuIikpOworCQkJCS8qcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsgKi8KIAkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CiAKLSAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPT0gRkFMU0UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZHggPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlJZDsKLSAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uQ2lwaGVyQWxnOwotCQkJCQlLZXkgPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXk7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID09CisJCQkJICAgIEZBTFNFKSB7CisJCQkJCWlkeCA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleUlkOworCQkJCQlDaXBoZXJBbGcgPQorCQkJCQkgICAgcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uCisJCQkJCSAgICBDaXBoZXJBbGc7CisJCQkJCUtleSA9CisJCQkJCSAgICBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS4KKwkJCQkJICAgIEtleTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuID4gMCkKLSAgICAJCQkJewotI2lmZGVmIFJUMjg2MAotCQkJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLgorCQkJCQkgICAgS2V5TGVuID4gMCkgeworI2lmZGVmIFJUTVBfTUFDX1BDSQorCQkJCQkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5ID0KKwkJCQkJCSAgICAmcEFkLT5NYWNUYWIuCisJCQkJCQkgICAgQ29udGVudFtCU1NJRF9XQ0lEXTsKIAotCQkJCQkJLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKLQkJCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCQkJCQkJLyogU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMgKi8KKwkJCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsCisJCQkJCQkJCSAgICAgIGlkeCwKKwkJCQkJCQkJICAgICAgQ2lwaGVyQWxnLAorCQkJCQkJCQkgICAgICBLZXksIE5VTEwsCisJCQkJCQkJCSAgICAgIE5VTEwpOwogCi0JCQkJCQkvLyBBc3NpZ24gZ3JvdXAga2V5IGluZm8KLQkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgTlVMTCk7CisJCQkJCQkvKiBBc3NpZ24gZ3JvdXAga2V5IGluZm8gKi8KKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCQkJICBCU1MwLAorCQkJCQkJCQkJICBpZHgsCisJCQkJCQkJCQkgIENpcGhlckFsZywKKwkJCQkJCQkJCSAgTlVMTCk7CiAKLQkJCQkJCS8vIEFzc2lnbiBwYWlyd2lzZSBrZXkgaW5mbwotCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBwRW50cnkpOworCQkJCQkJLyogQXNzaWduIHBhaXJ3aXNlIGtleSBpbmZvICovCisJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkJCSAgaWR4LAorCQkJCQkJCQkJICBDaXBoZXJBbGcsCisJCQkJCQkJCQkgIHBFbnRyeSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkJCQkJdW5pb24KLQkJCQkJCXsKLQkJCQkJCQljaGFyIGJ1ZltzaXplb2YoTkRJU184MDJfMTFfV0VQKStNQVhfTEVOX09GX0tFWS0gMV07Ci0JCQkJCQkJTkRJU184MDJfMTFfV0VQIGtleWluZm87Ci0JCQkJCQl9ICBXZXBLZXk7CisJCQkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9CisJCQkJCQkgICAgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQkJCQlwQWQtPkV4dHJhSW5mbyA9CisJCQkJCQkgICAgR0VORVJBTF9MSU5LX1VQOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQkJCQkJdW5pb24geworCQkJCQkJCWNoYXIgYnVmW3NpemVvZgorCQkJCQkJCQkgKHN0cnVjdCBydF9uZGlzXzgwMl8xMV93ZXApCisJCQkJCQkJCSArCisJCQkJCQkJCSBNQVhfTEVOX09GX0tFWQorCQkJCQkJCQkgLSAxXTsKKwkJCQkJCQlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfd2VwIGtleWluZm87CisJCQkJCQl9CisJCQkJCQlXZXBLZXk7CiAJCQkJCQlpbnQgbGVuOwogCisJCQkJCQlOZGlzWmVyb01lbW9yeSgmV2VwS2V5LAorCQkJCQkJCSAgICAgICBzaXplb2YoV2VwS2V5KSk7CisJCQkJCQlsZW4gPQorCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLgorCQkJCQkJICAgIERlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbjsKIAotCQkJCQkJTmRpc1plcm9NZW1vcnkoJldlcEtleSwgc2l6ZW9mKFdlcEtleSkpOwotCQkJCQkJbGVuID1wQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXlMZW47CisJCQkJCQlOZGlzTW92ZU1lbW9yeShXZXBLZXkua2V5aW5mby4KKwkJCQkJCQkgICAgICAgS2V5TWF0ZXJpYWwsCisJCQkJCQkJICAgICAgIHBBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgICAgICBEZXNpcmVTaGFyZWRLZXkKKwkJCQkJCQkgICAgICAgW2lkeF0uS2V5LAorCQkJCQkJCSAgICAgICBwQWQtPlN0YUNmZy4KKwkJCQkJCQkgICAgICAgRGVzaXJlU2hhcmVkS2V5CisJCQkJCQkJICAgICAgIFtpZHhdLktleUxlbik7CiAKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KFdlcEtleS5rZXlpbmZvLktleU1hdGVyaWFsLAotCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleSwKLQkJCQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXlMZW4pOwotCi0JCQkJCQlXZXBLZXkua2V5aW5mby5LZXlJbmRleCA9IDB4ODAwMDAwMDAgKyBpZHg7CisJCQkJCQlXZXBLZXkua2V5aW5mby5LZXlJbmRleCA9CisJCQkJCQkgICAgMHg4MDAwMDAwMCArIGlkeDsKIAkJCQkJCVdlcEtleS5rZXlpbmZvLktleUxlbmd0aCA9IGxlbjsKLQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID0oVUNIQVIpIChsZW4gPD0gNSA/IDUgOiAxMyk7CisJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLgorCQkJCQkJICAgIEtleUxlbiA9CisJCQkJCQkgICAgKHU4KShsZW4gPD0gNSA/IDUgOiAxMyk7CiAKLQkJCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0JCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKLQkJCQkJCS8vIG5lZWQgdG8gZW5xdWV1ZSBjbWQgdG8gdGhyZWFkCi0JCQkJCQlSVFVTQkVucXVldWVDbWRGcm9tTmRpcyhwQWQsIE9JRF84MDJfMTFfQUREX1dFUCwgVFJVRSwgJldlcEtleSwgc2l6ZW9mKFdlcEtleS5rZXlpbmZvKSArIGxlbiAtIDEpOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCQkJCQkJLy8gRm9yIFByZXZlbnRpbmcgU2hhcmRLZXkgVGFibGUgaXMgY2xlYXJlZCBieSByZW1vdmUga2V5IHByb2NlZHVyZS4KLSAgICAJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXlMZW47Ci0JCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleSwKLQkJCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleSwKLQkJCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbik7Ci0gICAgCQkJCX0KKwkJCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0KKwkJCQkJCSAgICBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCQkJCXBBZC0+RXh0cmFJbmZvID0KKwkJCQkJCSAgICBHRU5FUkFMX0xJTktfVVA7CisJCQkJCQkvKiBuZWVkIHRvIGVucXVldWUgY21kIHRvIHRocmVhZCAqLworCQkJCQkJUlRVU0JFbnF1ZXVlQ21kRnJvbU5kaXMocEFkLAorCQkJCQkJCQkJT0lEXzgwMl8xMV9BRERfV0VQLAorCQkJCQkJCQkJVFJVRSwKKwkJCQkJCQkJCSZXZXBLZXksCisJCQkJCQkJCQlzaXplb2YKKwkJCQkJCQkJCShXZXBLZXkuCisJCQkJCQkJCQkga2V5aW5mbykKKwkJCQkJCQkJCSsgbGVuIC0KKwkJCQkJCQkJCTEpOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCQkJCQkJLyogRm9yIFByZXZlbnRpbmcgU2hhcmRLZXkgVGFibGUgaXMgY2xlYXJlZCBieSByZW1vdmUga2V5IHByb2NlZHVyZS4gKi8KKwkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uCisJCQkJCQkgICAgQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS4KKwkJCQkJCSAgICBLZXlMZW4gPQorCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLgorCQkJCQkJICAgIERlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbjsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+CisJCQkJCQkJICAgICAgIFNoYXJlZEtleVtCU1MwXQorCQkJCQkJCSAgICAgICBbaWR4XS5LZXksCisJCQkJCQkJICAgICAgIHBBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgICAgICBEZXNpcmVTaGFyZWRLZXkKKwkJCQkJCQkgICAgICAgW2lkeF0uS2V5LAorCQkJCQkJCSAgICAgICBwQWQtPlN0YUNmZy4KKwkJCQkJCQkgICAgICAgRGVzaXJlU2hhcmVkS2V5CisJCQkJCQkJICAgICAgIFtpZHhdLktleUxlbik7CisJCQkJCX0KIAkJCQl9CiAJCQl9CiAKIAkJCUluZGljYXRlX0xlZ2FjeV9QYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKIAkJCXJldHVybjsKIAkJfQotCX0KLQllbHNlCi0JewotCQkvLyBTcGVjaWFsIERBVEEgZnJhbWUgdGhhdCBoYXMgdG8gcGFzcyB0byBNTE1FCi0JCS8vCSAxLiBDaXNjbyBBaXJvbmV0IGZyYW1lcyBmb3IgQ0NYMi4gV2UgbmVlZCBwYXNzIGl0IHRvIE1MTUUgZm9yIHNwZWNpYWwgcHJvY2VzcwotCQkvLwkgMi4gRUFQT0wgaGFuZHNoYWtpbmcgZnJhbWVzIHdoZW4gZHJpdmVyIHN1cHBsaWNhbnQgZW5hYmxlZCwgcGFzcyB0byBNTE1FIGZvciBzcGVjaWFsIHByb2Nlc3MKKwl9IGVsc2UgeworCQkvKiBTcGVjaWFsIERBVEEgZnJhbWUgdGhhdCBoYXMgdG8gcGFzcyB0byBNTE1FICovCisJCS8qICAgICAgIDEuIENpc2NvIEFpcm9uZXQgZnJhbWVzIGZvciBDQ1gyLiBXZSBuZWVkIHBhc3MgaXQgdG8gTUxNRSBmb3Igc3BlY2lhbCBwcm9jZXNzICovCisJCS8qICAgICAgIDIuIEVBUE9MIGhhbmRzaGFraW5nIGZyYW1lcyB3aGVuIGRyaXZlciBzdXBwbGljYW50IGVuYWJsZWQsIHBhc3MgdG8gTUxNRSBmb3Igc3BlY2lhbCBwcm9jZXNzICovCiAJCXsKIAkJCXBUbXBCdWYgPSBwUnhCbGstPnBEYXRhIC0gTEVOR1RIXzgwMl8xMTsKIAkJCU5kaXNNb3ZlTWVtb3J5KHBUbXBCdWYsIHBSeEJsay0+cEhlYWRlciwgTEVOR1RIXzgwMl8xMSk7Ci0JCQlSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIHBUbXBCdWYsIHBSeEJsay0+RGF0YVNpemUgKyBMRU5HVEhfODAyXzExLCBwUnhXSS0+UlNTSTAsIHBSeFdJLT5SU1NJMSwgcFJ4V0ktPlJTU0kyLCBwUnhELT5QbGNwU2lnbmFsKTsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIhISEgcmVwb3J0IEVBUE9ML0FJUk9ORVQgREFUQSB0byBNTE1FIChsZW49JWQpICEhIVxuIiwgcFJ4QmxrLT5EYXRhU2l6ZSkpOworCQkJUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShwQWQsIHBSeFdJLT5XaXJlbGVzc0NsaUlELAorCQkJCQkJICBwVG1wQnVmLAorCQkJCQkJICBwUnhCbGstPkRhdGFTaXplICsKKwkJCQkJCSAgTEVOR1RIXzgwMl8xMSwgcFJ4V0ktPlJTU0kwLAorCQkJCQkJICBwUnhXSS0+UlNTSTEsIHBSeFdJLT5SU1NJMiwKKwkJCQkJCSAgcFJ4RC0+UGxjcFNpZ25hbCk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJICAgICAoInJlcG9ydCBFQVBPTC9BSVJPTkVUIERBVEEgdG8gTUxNRSAobGVuPSVkKSAhXG4iLAorCQkJCSAgICAgIHBSeEJsay0+RGF0YVNpemUpKTsKIAkJfQogCX0KIApAQCAtMTQ2LDQ5NSArMjAyLDQ4MyBAQAogCiB9CiAKLVZPSUQgU1RBUnhEYXRhRnJhbWVBbm5vdW5jZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit2b2lkIFNUQVJ4RGF0YUZyYW1lQW5ub3VuY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJCSAgICBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGssIHU4IEZyb21XaGljaEJTU0lEKQogewogCi0JLy8gbm9uLUVBUCBmcmFtZQotCWlmICghUlRNUENoZWNrV1BBZnJhbWUocEFkLCBwRW50cnksIHBSeEJsay0+cERhdGEsIHBSeEJsay0+RGF0YVNpemUsIEZyb21XaGljaEJTU0lEKSkKLQl7CisJLyogbm9uLUVBUCBmcmFtZSAqLworCWlmICghUlRNUENoZWNrV1BBZnJhbWUKKwkgICAgKHBBZCwgcEVudHJ5LCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplLCBGcm9tV2hpY2hCU1NJRCkpIHsKKwogCQl7Ci0JCQkvLyBkcm9wIGFsbCBub24tRUFQIERBVEEgZnJhbWUgYmVmb3JlCi0JCQkvLyB0aGlzIGNsaWVudCdzIFBvcnQtQWNjZXNzLUNvbnRyb2wgaXMgc2VjdXJlZAotCQkJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuV2VwKQotCQkJewotCQkJCS8vIHVuc3VwcG9ydGVkIGNpcGhlciBzdWl0ZQotCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKLQkJCQl7Ci0JCQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkvKiBkcm9wIGFsbCBub24tRUFQIERBVEEgZnJhbWUgYmVmb3JlICovCisJCQkvKiB0aGlzIGNsaWVudCdzIFBvcnQtQWNjZXNzLUNvbnRyb2wgaXMgc2VjdXJlZCAqLworCQkJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuV2VwKSB7CisJCQkJLyogdW5zdXBwb3J0ZWQgY2lwaGVyIHN1aXRlICovCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PQorCQkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKSB7CisJCQkJCS8qIHJlbGVhc2UgcGFja2V0ICovCisJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLAorCQkJCQkJCSAgICBwUnhCbGstPnBSeFBhY2tldCwKKwkJCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCQkJCXJldHVybjsKIAkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gZW5jcnlwdGlvbiBpbi11c2UgYnV0IHJlY2VpdmUgYSBub24tRUFQT0wgY2xlYXIgdGV4dCBmcmFtZSwgZHJvcCBpdAotCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpICYmCi0JCQkJCShwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQotCQkJCXsKLQkJCQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogZW5jcnlwdGlvbiBpbi11c2UgYnV0IHJlY2VpdmUgYSBub24tRUFQT0wgY2xlYXIgdGV4dCBmcmFtZSwgZHJvcCBpdCAqLworCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9CisJCQkJICAgICBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKQorCQkJCSAgICAmJiAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0KKwkJCQkJV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkgeworCQkJCQkvKiByZWxlYXNlIHBhY2tldCAqLworCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwKKwkJCQkJCQkgICAgcFJ4QmxrLT5wUnhQYWNrZXQsCisJCQkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQkJCQlyZXR1cm47CiAJCQkJfQogCQkJfQogCQl9CiAJCVJYX0JMS19DTEVBUl9GTEFHKHBSeEJsaywgZlJYX0VBUCk7Ci0JCWlmICghUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BUkFMSU5LKSkKLQkJewotCQkJLy8gTm9ybWFsIGxlZ2FjeSwgQU1QRFUgb3IgQU1TRFUKLQkJCUNtbVJ4bm9uUmFsaW5rRnJhbWVJbmRpY2F0ZShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQlpZiAoIVJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQVJBTElOSykpIHsKKwkJCS8qIE5vcm1hbCBsZWdhY3ksIEFNUERVIG9yIEFNU0RVICovCisJCQlDbW1SeG5vblJhbGlua0ZyYW1lSW5kaWNhdGUocEFkLCBwUnhCbGssCisJCQkJCQkgICAgRnJvbVdoaWNoQlNTSUQpOwogCisJCX0gZWxzZSB7CisJCQkvKiBBUkFMSU5LICovCisJCQlDbW1SeFJhbGlua0ZyYW1lSW5kaWNhdGUocEFkLCBwRW50cnksIHBSeEJsaywKKwkJCQkJCSBGcm9tV2hpY2hCU1NJRCk7CiAJCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBBUkFMSU5LCi0JCQlDbW1SeFJhbGlua0ZyYW1lSW5kaWNhdGUocEFkLCBwRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCQl9Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0VBUCk7CiAKLQkJaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1QRFUpICYmIChwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPT0gMCkpCi0JCXsKKwkJaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1QRFUpCisJCSAgICAmJiAocEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID09IDApKSB7CiAJCQlJbmRpY2F0ZV9BTVBEVV9QYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIERldGVybWluIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgRUFQIGZyYW1lCi0JCQkvLyAgdG8gV1BBIHN0YXRlIG1hY2hpbmUgb3IgdXBwZXIgbGF5ZXIKLQkJCVNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKHBBZCwgcEVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJfSBlbHNlIHsKKwkJCS8qIERldGVybWluIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgRUFQIGZyYW1lICovCisJCQkvKiAgdG8gV1BBIHN0YXRlIG1hY2hpbmUgb3IgdXBwZXIgbGF5ZXIgKi8KKwkJCVNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKHBBZCwgcEVudHJ5LCBwUnhCbGssCisJCQkJCQlGcm9tV2hpY2hCU1NJRCk7CiAJCX0KIAl9CiB9CiAKLQotLy8gRm9yIFRLSVAgZnJhbWUsIGNhbGN1bGF0ZSB0aGUgTUlDIHZhbHVlCi1CT09MRUFOIFNUQUNoZWNrVGtpcE1JQ1ZhbHVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCUlOCVJYX0JMSwkJCSpwUnhCbGspCisvKiBGb3IgVEtJUCBmcmFtZSwgY2FsY3VsYXRlIHRoZSBNSUMgdmFsdWUgKi8KK0JPT0xFQU4gU1RBQ2hlY2tUa2lwTUlDVmFsdWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaykKIHsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOwotCVVDSEFSCQkJKnBEYXRhID0gcFJ4QmxrLT5wRGF0YTsKLQlVU0hPUlQJCQlEYXRhU2l6ZSA9IHBSeEJsay0+RGF0YVNpemU7Ci0JVUNIQVIJCQlVc2VyUHJpb3JpdHkgPSBwUnhCbGstPlVzZXJQcmlvcml0eTsKLQlQQ0lQSEVSX0tFWQkJcFdwYUtleTsKLQlVQ0hBUgkJCSpwREEsICpwU0E7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOworCXU4ICpwRGF0YSA9IHBSeEJsay0+cERhdGE7CisJdTE2IERhdGFTaXplID0gcFJ4QmxrLT5EYXRhU2l6ZTsKKwl1OCBVc2VyUHJpb3JpdHkgPSBwUnhCbGstPlVzZXJQcmlvcml0eTsKKwlzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcFdwYUtleTsKKwl1OCAqcERBLCAqcFNBOwogCiAJcFdwYUtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVtwUnhCbGstPnBSeFdJLT5LZXlJbmRleF07CiAKIAlwREEgPSBwSGVhZGVyLT5BZGRyMTsKLQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9JTkZSQSkpCi0JeworCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0lORlJBKSkgewogCQlwU0EgPSBwSGVhZGVyLT5BZGRyMzsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwU0EgPSBwSGVhZGVyLT5BZGRyMjsKIAl9CiAKIAlpZiAoUlRNUFRraXBDb21wYXJlTUlDVmFsdWUocEFkLAotCQkJCQkJCQlwRGF0YSwKLQkJCQkJCQkJcERBLAotCQkJCQkJCQlwU0EsCi0JCQkJCQkJCXBXcGFLZXktPlJ4TWljLAotCQkJCQkJCQlVc2VyUHJpb3JpdHksCi0JCQkJCQkJCURhdGFTaXplKSA9PSBGQUxTRSkKLQl7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIlJ4IE1JQyBWYWx1ZSBlcnJvciAyXG4iKSk7CisJCQkJICAgIHBEYXRhLAorCQkJCSAgICBwREEsCisJCQkJICAgIHBTQSwKKwkJCQkgICAgcFdwYUtleS0+UnhNaWMsCisJCQkJICAgIFVzZXJQcmlvcml0eSwgRGF0YVNpemUpID09IEZBTFNFKSB7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSeCBNSUMgVmFsdWUgZXJyb3IgMlxuIikpOwogCi0JCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCi0JCXsKLQkJCVdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KHBBZCwgKHBXcGFLZXktPlR5cGUgPT0gUEFJUldJU0VLRVkpID8gVFJVRSA6IEZBTFNFKTsKLQkJfQotCQllbHNlCi0JCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkgeworCQkJV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQocEFkLAorCQkJCQkJCSAocFdwYUtleS0+VHlwZSA9PQorCQkJCQkJCSAgUEFJUldJU0VLRVkpID8gVFJVRSA6CisJCQkJCQkJIEZBTFNFKTsKKwkJfSBlbHNlIHsKIAkJCVJUTVBSZXBvcnRNaWNFcnJvcihwQWQsIHBXcGFLZXkpOwogCQl9CiAKLQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJLyogcmVsZWFzZSBwYWNrZXQgKi8KKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LAorCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAogCXJldHVybiBUUlVFOwogfQogCi0KLS8vCi0vLyBBbGwgUnggcm91dGluZXMgdXNlIFJYX0JMSyBzdHJ1Y3R1cmUgdG8gaGFuZGUgcnggZXZlbnRzCi0vLyBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0byBidWlsZCBwUnhCbGsgYXR0cmlidXRlcwotLy8gIDEuIHBIZWFkZXIgcG9pbnRlciB0byA4MDIuMTEgSGVhZGVyCi0vLyAgMi4gcERhdGEgcG9pbnRlciB0byBwYXlsb2FkIGluY2x1ZGluZyBMTEMgKGp1c3Qgc2tpcCBIZWFkZXIpCi0vLyAgMy4gc2V0IHBheWxvYWQgc2l6ZSBpbmNsdWRpbmcgTExDIHRvIERhdGFTaXplCi0vLyAgNC4gc2V0IHNvbWUgZmxhZ3Mgd2l0aCBSWF9CTEtfU0VUX0ZMQUcoKQotLy8KLVZPSUQgU1RBSGFuZGxlUnhEYXRhRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaykKKy8qICovCisvKiBBbGwgUnggcm91dGluZXMgdXNlIHN0cnVjdCBydF9yeF9ibGsgc3RydWN0dXJlIHRvIGhhbmRlIHJ4IGV2ZW50cyAqLworLyogSXQgaXMgdmVyeSBpbXBvcnRhbnQgdG8gYnVpbGQgcFJ4QmxrIGF0dHJpYnV0ZXMgKi8KKy8qICAxLiBwSGVhZGVyIHBvaW50ZXIgdG8gODAyLjExIEhlYWRlciAqLworLyogIDIuIHBEYXRhIHBvaW50ZXIgdG8gcGF5bG9hZCBpbmNsdWRpbmcgTExDIChqdXN0IHNraXAgSGVhZGVyKSAqLworLyogIDMuIHNldCBwYXlsb2FkIHNpemUgaW5jbHVkaW5nIExMQyB0byBEYXRhU2l6ZSAqLworLyogIDQuIHNldCBzb21lIGZsYWdzIHdpdGggUlhfQkxLX1NFVF9GTEFHKCkgKi8KKy8qICovCit2b2lkIFNUQUhhbmRsZVJ4RGF0YUZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrKQogewotCVBSVDI4WFhfUlhEX1NUUlVDCQkJCXBSeEQgPSAmKHBSeEJsay0+UnhEKTsKLQlQUlhXSV9TVFJVQwkJCQkJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKLQlQSEVBREVSXzgwMl8xMQkJCQkJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKLQlQTkRJU19QQUNLRVQJCQkJCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OwotCUJPT0xFQU4gCQkJCQkJYkZyYWdtZW50ID0gRkFMU0U7Ci0JTUFDX1RBQkxFX0VOVFJZCSAgICAJCQkqcEVudHJ5ID0gTlVMTDsKLQlVQ0hBUgkJCQkJCQlGcm9tV2hpY2hCU1NJRCA9IEJTUzA7Ci0JVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyUHJpb3JpdHkgPSAwOworCVBSVDI4WFhfUlhEX1NUUlVDIHBSeEQgPSAmKHBSeEJsay0+UnhEKTsKKwlzdHJ1Y3QgcnRfcnh3aSAqIHBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7CisJdm9pZCAqcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7CisJQk9PTEVBTiBiRnJhZ21lbnQgPSBGQUxTRTsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkgPSBOVUxMOworCXU4IEZyb21XaGljaEJTU0lEID0gQlNTMDsKKwl1OCBVc2VyUHJpb3JpdHkgPSAwOwogCiAJewotCQkvLyBiZWZvcmUgTElOSyBVUCwgYWxsIERBVEEgZnJhbWVzIGFyZSByZWplY3RlZAotCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJewotCQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkvKiBiZWZvcmUgTElOSyBVUCwgYWxsIERBVEEgZnJhbWVzIGFyZSByZWplY3RlZCAqLworCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgeworCQkJLyogcmVsZWFzZSBwYWNrZXQgKi8KKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsCisJCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJCXJldHVybjsKIAkJfQotCi0JCS8vIERyb3Agbm90IG15IEJTUyBmcmFtZXMKLQkJaWYgKHBSeEQtPk15QnNzID09IDApCi0JCXsKKwkJLyogRHJvcCBub3QgbXkgQlNTIGZyYW1lcyAqLworCQlpZiAocFJ4RC0+TXlCc3MgPT0gMCkgewogCQkJewotCQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJLyogcmVsZWFzZSBwYWNrZXQgKi8KKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LAorCQkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfQogCiAJCXBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwrKzsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSAmJiAocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpKQotCQl7Ci0JCQlVQ0hBUiAqcERhdGE7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImJBUFNEQ2FwYWJsZVxuIikpOworCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlCisJCSAgICAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZQorCQkgICAgJiYgKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KSkgeworCQkJdTggKnBEYXRhOworCQkJREJHUFJJTlQoUlRfREVCVUdfSU5GTywgKCJiQVBTRENhcGFibGVcbiIpKTsKIAotCQkJLy8gUW9zIGJpdCA0Ci0JCQlwRGF0YSA9IChQVUNIQVIpcEhlYWRlciArIExFTkdUSF84MDJfMTE7Ci0JCQlpZiAoKCpwRGF0YSA+PiA0KSAmIDB4MDEpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSeERvbmUtIFJjdiBFT1NQIGZyYW1lLCBkcml2ZXIgbWF5IGZhbGwgaW50byBzbGVlcFxuIikpOworCQkJLyogUW9zIGJpdCA0ICovCisJCQlwRGF0YSA9ICh1OCAqKXBIZWFkZXIgKyBMRU5HVEhfODAyXzExOworCQkJaWYgKCgqcERhdGEgPj4gNCkgJiAweDAxKSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfSU5GTywKKwkJCQkJICgiUnhEb25lLSBSY3YgRU9TUCBmcmFtZSwgZHJpdmVyIG1heSBmYWxsIGludG8gc2xlZXBcbiIpKTsKIAkJCQlwQWQtPkNvbW1vbkNmZy5iSW5TZXJ2aWNlUGVyaW9kID0gRkFMU0U7CiAKLQkJCQkvLyBGb3JjZSBkcml2ZXIgdG8gZmFsbCBpbnRvIHNsZWVwIG1vZGUgd2hlbiByY3YgRU9TUCBmcmFtZQotCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJCQl7Ci0JCQkJCVVTSE9SVCAgVGJ0dE51bVRvTmV4dFdha2VVcDsKLQkJCQkJVVNIT1JUICBOZXh0RHRpbSA9IHBBZC0+U3RhQ2ZnLkR0aW1QZXJpb2Q7Ci0JCQkJCVVMT05HICAgTm93OworCQkJCS8qIEZvcmNlIGRyaXZlciB0byBmYWxsIGludG8gc2xlZXAgbW9kZSB3aGVuIHJjdiBFT1NQIGZyYW1lICovCisJCQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKSB7CisJCQkJCXUxNiBUYnR0TnVtVG9OZXh0V2FrZVVwOworCQkJCQl1MTYgTmV4dER0aW0gPQorCQkJCQkgICAgcEFkLT5TdGFDZmcuRHRpbVBlcmlvZDsKKwkJCQkJdW5zaWduZWQgbG9uZyBOb3c7CiAKIAkJCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKLQkJCQkJTmV4dER0aW0gLT0gKFVTSE9SVCkoTm93IC0gcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSkvcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOworCQkJCQlOZXh0RHRpbSAtPQorCQkJCQkgICAgKHUxNikoTm93IC0KKwkJCQkJCSAgICAgIHBBZC0+U3RhQ2ZnLgorCQkJCQkJICAgICAgTGFzdEJlYWNvblJ4VGltZSkgLworCQkJCQkgICAgcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOwogCi0JCQkJCVRidHROdW1Ub05leHRXYWtlVXAgPSBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQ7Ci0JCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSkgJiYgKFRidHROdW1Ub05leHRXYWtlVXAgPiBOZXh0RHRpbSkpCisJCQkJCVRidHROdW1Ub05leHRXYWtlVXAgPQorCQkJCQkgICAgcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50OworCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkJCSAgICAocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSkKKwkJCQkJICAgICYmIChUYnR0TnVtVG9OZXh0V2FrZVVwID4gTmV4dER0aW0pKQogCQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IE5leHREdGltOwogCi0JCQkJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfU0FWRSk7Ci0JCQkJCS8vIGlmIFdNTS1BUFNEIGlzIGZhaWxlZCwgdHJ5IHRvIGRpc2FibGUgZm9sbG93aW5nIGxpbmUKLQkJCQkJQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKwkJCQkJUlRNUF9TRVRfUFNNX0JJVChwQWQsIFBXUl9TQVZFKTsKKwkJCQkJLyogaWYgV01NLUFQU0QgaXMgZmFpbGVkLCB0cnkgdG8gZGlzYWJsZSBmb2xsb3dpbmcgbGluZSAqLworCQkJCQlBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsCisJCQkJCQkJCVRidHROdW1Ub05leHRXYWtlVXApOwogCQkJCX0KIAkJCX0KIAotCQkJaWYgKChwSGVhZGVyLT5GQy5Nb3JlRGF0YSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJblNlcnZpY2VQZXJpb2QpKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2VuZGluZyBhbm90aGVyIHRyaWdnZXIgZnJhbWUgd2hlbiBNb3JlIERhdGEgYml0IGlzIHNldCB0byAxXG4iKSk7CisJCQlpZiAoKHBIZWFkZXItPkZDLk1vcmVEYXRhKQorCQkJICAgICYmIChwQWQtPkNvbW1vbkNmZy5iSW5TZXJ2aWNlUGVyaW9kKSkgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJTZW5kaW5nIGFub3RoZXIgdHJpZ2dlciBmcmFtZSB3aGVuIE1vcmUgRGF0YSBiaXQgaXMgc2V0IHRvIDFcbiIpKTsKIAkJCX0KIAkJfQotCi0JCS8vIERyb3AgTlVMTCwgQ0YtQUNLKG5vIGRhdGEpLCBDRi1QT0xMKG5vIGRhdGEpLCBhbmQgQ0YtQUNLK0NGLVBPTEwobm8gZGF0YSkgZGF0YSBmcmFtZQotCQlpZiAoKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA0KSkgLy8gYml0IDIgOiBubyBEQVRBCisJCS8qIERyb3AgTlVMTCwgQ0YtQUNLKG5vIGRhdGEpLCBDRi1QT0xMKG5vIGRhdGEpLCBhbmQgQ0YtQUNLK0NGLVBPTEwobm8gZGF0YSkgZGF0YSBmcmFtZSAqLworCQlpZiAoKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA0KSkJLyogYml0IDIgOiBubyBEQVRBICovCiAJCXsKLQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCS8qIHJlbGVhc2UgcGFja2V0ICovCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LAorCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCQlyZXR1cm47CiAJCX0KKwkJLyogRHJvcCBub3QgbXkgQlNTIGZyYW1lICh3ZSBjYW4gbm90IG9ubHkgY2hlY2sgdGhlIE15QnNzIGJpdCBpbiBSeEQpICovCiAKLQkgICAgLy8gRHJvcCBub3QgbXkgQlNTIGZyYW1lICh3ZSBjYW4gbm90IG9ubHkgY2hlY2sgdGhlIE15QnNzIGJpdCBpbiBSeEQpCi0KLQkJaWYgKElORlJBX09OKHBBZCkpCi0JCXsKLQkJCS8vIEluZnJhc3RydWN0dXJlIG1vZGUsIGNoZWNrIGFkZHJlc3MgMiBmb3IgQlNTSUQKLQkJCWlmICghUlRNUEVxdWFsTWVtb3J5KCZwSGVhZGVyLT5BZGRyMiwgJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCA2KSkKLQkJCXsKLQkJCQkvLyBSZWNlaXZlIGZyYW1lIG5vdCBteSBCU1NJRAotCSAgICAgICAgICAgIC8vIHJlbGVhc2UgcGFja2V0Ci0JICAgICAgICAgICAgUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCWlmIChJTkZSQV9PTihwQWQpKSB7CisJCQkvKiBJbmZyYXN0cnVjdHVyZSBtb2RlLCBjaGVjayBhZGRyZXNzIDIgZm9yIEJTU0lEICovCisJCQlpZiAoIVJUTVBFcXVhbE1lbW9yeQorCQkJICAgICgmcEhlYWRlci0+QWRkcjIsICZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgNikpIHsKKwkJCQkvKiBSZWNlaXZlIGZyYW1lIG5vdCBteSBCU1NJRCAqLworCQkJCS8qIHJlbGVhc2UgcGFja2V0ICovCisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwKKwkJCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJCQlyZXR1cm47CiAJCQl9Ci0JCX0KLQkJZWxzZQkvLyBBZC1Ib2MgbW9kZSBvciBOb3QgYXNzb2NpYXRlZAorCQl9IGVsc2UJCS8qIEFkLUhvYyBtb2RlIG9yIE5vdCBhc3NvY2lhdGVkICovCiAJCXsKLQkJCS8vIEFkLUhvYyBtb2RlLCBjaGVjayBhZGRyZXNzIDMgZm9yIEJTU0lECi0JCQlpZiAoIVJUTVBFcXVhbE1lbW9yeSgmcEhlYWRlci0+QWRkcjMsICZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgNikpCi0JCQl7Ci0JCQkJLy8gUmVjZWl2ZSBmcmFtZSBub3QgbXkgQlNTSUQKLQkgICAgICAgICAgICAvLyByZWxlYXNlIHBhY2tldAotCSAgICAgICAgICAgIFJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJLyogQWQtSG9jIG1vZGUsIGNoZWNrIGFkZHJlc3MgMyBmb3IgQlNTSUQgKi8KKwkJCWlmICghUlRNUEVxdWFsTWVtb3J5CisJCQkgICAgKCZwSGVhZGVyLT5BZGRyMywgJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCA2KSkgeworCQkJCS8qIFJlY2VpdmUgZnJhbWUgbm90IG15IEJTU0lEICovCisJCQkJLyogcmVsZWFzZSBwYWNrZXQgKi8KKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LAorCQkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfQogCi0JCS8vCi0JCS8vIGZpbmQgcEVudHJ5Ci0JCS8vCi0JCWlmIChwUnhXSS0+V2lyZWxlc3NDbGlJRCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCQl7CisJCS8qICovCisJCS8qIGZpbmQgcEVudHJ5ICovCisJCS8qICovCisJCWlmIChwUnhXSS0+V2lyZWxlc3NDbGlJRCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSB7CiAJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwUnhXSS0+V2lyZWxlc3NDbGlJRF07Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyAxLiByZWxlYXNlIHBhY2tldCBpZiBpbmZyYSBtb2RlCi0JCQkvLyAyLiBuZXcgYSBwRW50cnkgaWYgYWQtaG9jIG1vZGUKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQl9IGVsc2UgeworCQkJLyogMS4gcmVsZWFzZSBwYWNrZXQgaWYgaW5mcmEgbW9kZSAqLworCQkJLyogMi4gbmV3IGEgcEVudHJ5IGlmIGFkLWhvYyBtb2RlICovCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LAorCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCQlyZXR1cm47CiAJCX0KIAotCQkvLyBpbmZyYSBvciBhZC1ob2MKLQkJaWYgKElORlJBX09OKHBBZCkpCi0JCXsKKwkJLyogaW5mcmEgb3IgYWQtaG9jICovCisJCWlmIChJTkZSQV9PTihwQWQpKSB7CiAJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfSU5GUkEpOwogCQkJQVNTRVJUKHBSeFdJLT5XaXJlbGVzc0NsaUlEID09IEJTU0lEX1dDSUQpOwogCQl9Ci0KLQkJLy8gY2hlY2sgQXRoZXJvcyBDbGllbnQKLQkJaWYgKChwRW50cnktPmJJQW1CYWRBdGhlcm9zID09IEZBTFNFKSAmJiAgKHBSeEQtPkFNUERVID09IDEpICYmIChwSGVhZGVyLT5GQy5SZXRyeSApKQotCQl7CisJCS8qIGNoZWNrIEF0aGVyb3MgQ2xpZW50ICovCisJCWlmICgocEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9PSBGQUxTRSkgJiYgKHBSeEQtPkFNUERVID09IDEpCisJCSAgICAmJiAocEhlYWRlci0+RkMuUmV0cnkpKSB7CiAJCQlwRW50cnktPmJJQW1CYWRBdGhlcm9zID0gVFJVRTsKIAkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkN1cnJlbnRBdGhlcm9zID0gVFJVRTsKIAkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkxhc3RBdGhlcm9zID0gVFJVRTsKLQkJCWlmICghU1RBX0FFU19PTihwQWQpKQotCQkJewotCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgOCwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCBGQUxTRSk7CisJCQlpZiAoIVNUQV9BRVNfT04ocEFkKSkgeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgOCwgQUxMTl9TRVRQUk9URUNULCBUUlVFLAorCQkJCQkJICBGQUxTRSk7CiAJCQl9CiAJCX0KIAl9CiAKLQlwUnhCbGstPnBEYXRhID0gKFVDSEFSICopcEhlYWRlcjsKKwlwUnhCbGstPnBEYXRhID0gKHU4ICopIHBIZWFkZXI7CiAKLQkvLwotCS8vIHVwZGF0ZSBSeEJsay0+cERhdGEsIERhdGFTaXplCi0JLy8gODAyLjExIEhlYWRlciwgUU9TLCBIVEMsIEh3IFBhZGRpbmcKLQkvLworCS8qICovCisJLyogdXBkYXRlIFJ4QmxrLT5wRGF0YSwgRGF0YVNpemUgKi8KKwkvKiA4MDIuMTEgSGVhZGVyLCBRT1MsIEhUQywgSHcgUGFkZGluZyAqLworCS8qICovCiAKLQkvLyAxLiBza2lwIDgwMi4xMSBIRUFERVIKKwkvKiAxLiBza2lwIDgwMi4xMSBIRUFERVIgKi8KIAl7CiAJCXBSeEJsay0+cERhdGEgKz0gTEVOR1RIXzgwMl8xMTsKIAkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSBMRU5HVEhfODAyXzExOwogCX0KIAotCS8vIDIuIFFPUwotCWlmIChwSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkKLQl7CisJLyogMi4gUU9TICovCisJaWYgKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KSB7CiAJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9RT1MpOwogCQlVc2VyUHJpb3JpdHkgPSAqKHBSeEJsay0+cERhdGEpICYgMHgwZjsKLQkJLy8gYml0IDcgaW4gUW9TIENvbnRyb2wgZmllbGQgc2lnbmFscyB0aGUgSFQgQS1NU0RVIGZvcm1hdAotCQlpZiAoKCpwUnhCbGstPnBEYXRhKSAmIDB4ODApCi0JCXsKKwkJLyogYml0IDcgaW4gUW9TIENvbnRyb2wgZmllbGQgc2lnbmFscyB0aGUgSFQgQS1NU0RVIGZvcm1hdCAqLworCQlpZiAoKCpwUnhCbGstPnBEYXRhKSAmIDB4ODApIHsKIAkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSk7CiAJCX0KLQotCQkvLyBza2lwIFFPUyBjb250b3JsIGZpZWxkCisJCS8qIHNraXAgUU9TIGNvbnRvcmwgZmllbGQgKi8KIAkJcFJ4QmxrLT5wRGF0YSArPSAyOwotCQlwUnhCbGstPkRhdGFTaXplIC09MjsKKwkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSAyOwogCX0KIAlwUnhCbGstPlVzZXJQcmlvcml0eSA9IFVzZXJQcmlvcml0eTsKIAotCS8vIDMuIE9yZGVyIGJpdDogQS1SYWxpbmsgb3IgSFRDKwotCWlmIChwSGVhZGVyLT5GQy5PcmRlcikKLQl7CisJLyogY2hlY2sgaWYgbmVlZCB0byByZXNlbmQgUFMgUG9sbCB3aGVuIHJlY2VpdmVkIHBhY2tldCB3aXRoIE1vcmVEYXRhID0gMSAqLworCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJiAocEhlYWRlci0+RkMuTW9yZURhdGEgPT0gMSkpIHsKKwkJaWYgKCgoKFVzZXJQcmlvcml0eSA9PSAwKSB8fCAoVXNlclByaW9yaXR5ID09IDMpKSAmJgorCQkgICAgIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgPT0gMCkgfHwKKwkJICAgICgoKFVzZXJQcmlvcml0eSA9PSAxKSB8fCAoVXNlclByaW9yaXR5ID09IDIpKSAmJgorCQkgICAgIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPT0gMCkgfHwKKwkJICAgICgoKFVzZXJQcmlvcml0eSA9PSA0KSB8fCAoVXNlclByaW9yaXR5ID09IDUpKSAmJgorCQkgICAgIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPT0gMCkgfHwKKwkJICAgICgoKFVzZXJQcmlvcml0eSA9PSA2KSB8fCAoVXNlclByaW9yaXR5ID09IDcpKSAmJgorCQkgICAgIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8gPT0gMCkpIHsKKwkJCS8qIG5vbi1VQVBTRCBkZWxpdmVyeS1lbmFibGVkIEFDICovCisJCQlSVE1QX1BTX1BPTExfRU5RVUVVRShwQWQpOworCQl9CisJfQorCS8qIDMuIE9yZGVyIGJpdDogQS1SYWxpbmsgb3IgSFRDKyAqLworCWlmIChwSGVhZGVyLT5GQy5PcmRlcikgewogI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLQkJaWYgKChwUnhXSS0+UEhZTU9ERSA8PSBNT0RFX09GRE0pICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpKQorCQlpZiAoKHBSeFdJLT5QSFlNT0RFIDw9IE1PREVfT0ZETSkKKwkJICAgICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpKQogCQl7CiAJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfQVJBTElOSyk7Ci0JCX0KLQkJZWxzZQotI2VuZGlmCisJCX0gZWxzZQorI2VuZGlmIC8qIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8gKi8KIAkJewogCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0hUQyk7Ci0JCQkvLyBza2lwIEhUQyBjb250b3JsIGZpZWxkCisJCQkvKiBza2lwIEhUQyBjb250b3JsIGZpZWxkICovCiAJCQlwUnhCbGstPnBEYXRhICs9IDQ7CiAJCQlwUnhCbGstPkRhdGFTaXplIC09IDQ7CiAJCX0KIAl9Ci0KLQkvLyA0LiBza2lwIEhXIHBhZGRpbmcKLQlpZiAocFJ4RC0+TDJQQUQpCi0JewotCQkvLyBqdXN0IG1vdmUgcERhdGEgcG9pbnRlcgotCQkvLyBiZWNhdXNlIERhdGFTaXplIGV4Y2x1ZGluZyBIVyBwYWRkaW5nCisJLyogNC4gc2tpcCBIVyBwYWRkaW5nICovCisJaWYgKHBSeEQtPkwyUEFEKSB7CisJCS8qIGp1c3QgbW92ZSBwRGF0YSBwb2ludGVyICovCisJCS8qIGJlY2F1c2UgRGF0YVNpemUgZXhjbHVkaW5nIEhXIHBhZGRpbmcgKi8KIAkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX1BBRCk7CiAJCXBSeEJsay0+cERhdGEgKz0gMjsKIAl9CiAKLQlpZiAocFJ4RC0+QkEpCi0JeworCWlmIChwUnhELT5CQSkgewogCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfQU1QRFUpOwogCX0KLQotCS8vCi0JLy8gQ2FzZSBJICBQcm9jZXNzIEJyb2FkY2FzdCAmIE11bHRpY2FzdCBkYXRhIGZyYW1lCi0JLy8KLQlpZiAocFJ4RC0+QmNhc3QgfHwgcFJ4RC0+TWNhc3QpCi0JeworCS8qICovCisJLyogQ2FzZSBJICBQcm9jZXNzIEJyb2FkY2FzdCAmIE11bHRpY2FzdCBkYXRhIGZyYW1lICovCisJLyogKi8KKwlpZiAocFJ4RC0+QmNhc3QgfHwgcFJ4RC0+TWNhc3QpIHsKIAkJSU5DX0NPVU5URVI2NChwQWQtPldsYW5Db3VudGVycy5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQpOwogCi0JCS8vIERyb3AgTWNhc3QvQmNhc3QgZnJhbWUgd2l0aCBmcmFnbWVudCBiaXQgb24KLQkJaWYgKHBIZWFkZXItPkZDLk1vcmVGcmFnKQotCQl7Ci0JCQkvLyByZWxlYXNlIHBhY2tldAotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCS8qIERyb3AgTWNhc3QvQmNhc3QgZnJhbWUgd2l0aCBmcmFnbWVudCBiaXQgb24gKi8KKwkJaWYgKHBIZWFkZXItPkZDLk1vcmVGcmFnKSB7CisJCQkvKiByZWxlYXNlIHBhY2tldCAqLworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwKKwkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQkJcmV0dXJuOwogCQl9Ci0KLQkJLy8gRmlsdGVyIG91dCBCY2FzdCBmcmFtZSB3aGljaCBBUCByZWxheWVkIGZvciB1cwotCQlpZiAocEhlYWRlci0+RkMuRnJEcyAmJiBNQUNfQUREUl9FUVVBTChwSGVhZGVyLT5BZGRyMywgcEFkLT5DdXJyZW50QWRkcmVzcykpCi0JCXsKLQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJLyogRmlsdGVyIG91dCBCY2FzdCBmcmFtZSB3aGljaCBBUCByZWxheWVkIGZvciB1cyAqLworCQlpZiAocEhlYWRlci0+RkMuRnJEcworCQkgICAgJiYgTUFDX0FERFJfRVFVQUwocEhlYWRlci0+QWRkcjMsIHBBZC0+Q3VycmVudEFkZHJlc3MpKSB7CisJCQkvKiByZWxlYXNlIHBhY2tldCAqLworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwKKwkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQkJcmV0dXJuOwogCQl9CiAKIAkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwogCQlyZXR1cm47Ci0JfQotCWVsc2UgaWYgKHBSeEQtPlUyTSkKLQl7Ci0JCXBBZC0+TGFzdFJ4UmF0ZSA9IChVU0hPUlQpKChwUnhXSS0+TUNTKSArIChwUnhXSS0+QlcgPDw3KSArIChwUnhXSS0+U2hvcnRHSSA8PDgpKyAocFJ4V0ktPlBIWU1PREUgPDwxNCkpIDsKKwl9IGVsc2UgaWYgKHBSeEQtPlUyTSkgeworCQlwQWQtPkxhc3RSeFJhdGUgPQorCQkgICAgKHUxNikoKHBSeFdJLT5NQ1MpICsgKHBSeFdJLT5CVyA8PCA3KSArCisJCQkgICAgICAocFJ4V0ktPlNob3J0R0kgPDwgOCkgKyAocFJ4V0ktPlBIWU1PREUgPDwgMTQpKTsKIAotCQlpZiAoQURIT0NfT04ocEFkKSkKLQkJeworCQlpZiAoQURIT0NfT04ocEFkKSkgewogCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyLT5BZGRyMik7CiAJCQlpZiAocEVudHJ5KQotCQkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwRW50cnktPlJzc2lTYW1wbGUsIHBSeFdJKTsKKwkJCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcEVudHJ5LT5Sc3NpU2FtcGxlLAorCQkJCQkJICAgcFJ4V0kpOwogCQl9CiAKLQogCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgcFJ4V0kpOwogCi0JCXBBZC0+U3RhQ2ZnLkxhc3RTTlIwID0gKFVDSEFSKShwUnhXSS0+U05SMCk7Ci0JCXBBZC0+U3RhQ2ZnLkxhc3RTTlIxID0gKFVDSEFSKShwUnhXSS0+U05SMSk7CisJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIwID0gKHU4KShwUnhXSS0+U05SMCk7CisJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIxID0gKHU4KShwUnhXSS0+U05SMSk7CiAKIAkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudCsrOwogCisJCWlmICghKChwSGVhZGVyLT5GcmFnID09IDApICYmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZyA9PSAwKSkpIHsKKwkJCS8qIHJlLWFzc2VtYmxlIHRoZSBmcmFnbWVudGVkIHBhY2tldHMgKi8KKwkJCS8qIHJldHVybiBjb21wbGV0ZSBmcmFtZSAocFJ4UGFja2V0KSBvciBOVUxMICovCisJCQliRnJhZ21lbnQgPSBUUlVFOworCQkJcFJ4UGFja2V0ID0gUlRNUERlRnJhZ21lbnREYXRhRnJhbWUocEFkLCBwUnhCbGspOworCQl9CiAKLSAgICAJaWYgKCEoKHBIZWFkZXItPkZyYWcgPT0gMCkgJiYgKHBIZWFkZXItPkZDLk1vcmVGcmFnID09IDApKSkKLSAgICAJewotICAgIAkJLy8gcmUtYXNzZW1ibGUgdGhlIGZyYWdtZW50ZWQgcGFja2V0cwotICAgIAkJLy8gcmV0dXJuIGNvbXBsZXRlIGZyYW1lIChwUnhQYWNrZXQpIG9yIE5VTEwKLSAgICAJCWJGcmFnbWVudCA9IFRSVUU7Ci0gICAgCQlwUnhQYWNrZXQgPSBSVE1QRGVGcmFnbWVudERhdGFGcmFtZShwQWQsIHBSeEJsayk7Ci0gICAgCX0KLQotICAgIAlpZiAocFJ4UGFja2V0KQotICAgIAl7CisJCWlmIChwUnhQYWNrZXQpIHsKIAkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BSeFdJLT5XaXJlbGVzc0NsaUlEXTsKIAotICAgIAkJLy8gcHJvY2VzcyBjb21wbGV0ZSBmcmFtZQotICAgIAkJaWYgKGJGcmFnbWVudCAmJiAocFJ4RC0+RGVjcnlwdGVkKSAmJiAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkpCi0gICAgCQl7Ci0JCQkJLy8gTWludXMgTUlDIGxlbmd0aAorCQkJLyogcHJvY2VzcyBjb21wbGV0ZSBmcmFtZSAqLworCQkJaWYgKGJGcmFnbWVudCAmJiAocFJ4RC0+RGVjcnlwdGVkKQorCQkJICAgICYmIChwRW50cnktPldlcFN0YXR1cyA9PQorCQkJCU5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpKSB7CisJCQkJLyogTWludXMgTUlDIGxlbmd0aCAqLwogCQkJCXBSeEJsay0+RGF0YVNpemUgLT0gODsKIAotICAgIAkJCS8vIEZvciBUS0lQIGZyYW1lLCBjYWxjdWxhdGUgdGhlIE1JQyB2YWx1ZQotICAgIAkJCWlmIChTVEFDaGVja1RraXBNSUNWYWx1ZShwQWQsIHBFbnRyeSwgcFJ4QmxrKSA9PSBGQUxTRSkKLSAgICAJCQl7Ci0gICAgCQkJCXJldHVybjsKLSAgICAJCQl9Ci0gICAgCQl9CisJCQkJLyogRm9yIFRLSVAgZnJhbWUsIGNhbGN1bGF0ZSB0aGUgTUlDIHZhbHVlICovCisJCQkJaWYgKFNUQUNoZWNrVGtpcE1JQ1ZhbHVlKHBBZCwgcEVudHJ5LCBwUnhCbGspID09CisJCQkJICAgIEZBTFNFKSB7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CiAKLSAgICAJCVNUQVJ4RGF0YUZyYW1lQW5ub3VuY2UocEFkLCBwRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQkJU1RBUnhEYXRhRnJhbWVBbm5vdW5jZShwQWQsIHBFbnRyeSwgcFJ4QmxrLAorCQkJCQkgICAgICAgRnJvbVdoaWNoQlNTSUQpOwogCQkJcmV0dXJuOwotICAgIAl9Ci0gICAgCWVsc2UKLSAgICAJewotICAgIAkJLy8ganVzdCByZXR1cm4KLSAgICAJCS8vIGJlY2F1c2UgUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoKSB3aWxsIHJlbGVhc2UgcnggcGFja2V0LAotICAgIAkJLy8gaWYgcGFja2V0IGlzIGZyYWdtZW50ZWQKLSAgICAJCXJldHVybjsKLSAgICAJfQorCQl9IGVsc2UgeworCQkJLyoganVzdCByZXR1cm4gKi8KKwkJCS8qIGJlY2F1c2UgUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoKSB3aWxsIHJlbGVhc2UgcnggcGFja2V0LCAqLworCQkJLyogaWYgcGFja2V0IGlzIGZyYWdtZW50ZWQgKi8KKwkJCXJldHVybjsKKwkJfQogCX0KIAogCUFTU0VSVCgwKTsKLQkvLyByZWxlYXNlIHBhY2tldAorCS8qIHJlbGVhc2UgcGFja2V0ICovCiAJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiB9CiAKLVZPSUQgU1RBSGFuZGxlUnhNZ210RnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaykKK3ZvaWQgU1RBSGFuZGxlUnhNZ210RnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGspCiB7Ci0JUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCA9ICYocFJ4QmxrLT5SeEQpOwotCVBSWFdJX1NUUlVDCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7Ci0JUEhFQURFUl84MDJfMTEJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKLQlQTkRJU19QQUNLRVQJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7CisJUFJUMjhYWF9SWERfU1RSVUMgcFJ4RCA9ICYocFJ4QmxrLT5SeEQpOworCXN0cnVjdCBydF9yeHdpICogcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKKwl2b2lkICpwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKIAotCWRvCi0JeworCWRvIHsKIAotCQkvLyBXZSBzaG91bGQgY29sbGVjdCBSU1NJIG5vdCBvbmx5IFUyTSBkYXRhIGJ1dCBhbHNvIG15IGJlYWNvbgotCQlpZiAocEFkLT5SeEFudC5FdmFsdWF0ZVBlcmlvZCA9PSAwICYmCi0JCSAgICBwSGVhZGVyLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OICYmCi0JCSAgICBNQUNfQUREUl9FUVVBTCgmcEFkLT5Db21tb25DZmcuQnNzaWQsICZwSGVhZGVyLT5BZGRyMikpIHsKLQkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLCBwUnhXSSk7Ci0KLQkJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIwID0gKFVDSEFSKShwUnhXSS0+U05SMCk7Ci0JCQlwQWQtPlN0YUNmZy5MYXN0U05SMSA9IChVQ0hBUikocFJ4V0ktPlNOUjEpOwotCQl9Ci0KLSNpZmRlZiBSVDI4NzAKLQkJLy8gY29sbGVjdCByc3NpIGluZm9ybWF0aW9uIGZvciBhbnRlbm5hIGRpdmVyc2l0eQotCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkFudERpdmVyc2l0eSkKLQkJewotCQkJaWYgKChwUnhELT5VMk0pIHx8ICgocEhlYWRlci0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX0JFQUNPTikgJiYgKE1BQ19BRERSX0VRVUFMKCZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgJnBIZWFkZXItPkFkZHIyKSkpKQotCQkJewotCQkJCQlDT0xMRUNUX1JYX0FOVEVOTkFfQVZFUkFHRV9SU1NJKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIChVQ0hBUilwUnhXSS0+UlNTSTAsIFJTU0lfMCksIDApOyAvL05vdGU6IFJTU0kyIG5vdCB1c2VkIG9uIFJUNzMKLQkJCQkJcEFkLT5TdGFDZmcuTnVtT2ZBdmdSc3NpU2FtcGxlICsrOworCQkvKiBjaGVjayBpZiBuZWVkIHRvIHJlc2VuZCBQUyBQb2xsIHdoZW4gcmVjZWl2ZWQgcGFja2V0IHdpdGggTW9yZURhdGEgPSAxICovCisJCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQorCQkgICAgJiYgKHBIZWFkZXItPkZDLk1vcmVEYXRhID09IDEpKSB7CisJCQkvKiBmb3IgVUFQU0QsIGFsbCBtYW5hZ2VtZW50IGZyYW1lcyB3aWxsIGJlIFZPIHByaW9yaXR5ICovCisJCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTyA9PSAwKSB7CisJCQkJLyogbm9uLVVBUFNEIGRlbGl2ZXJ5LWVuYWJsZWQgQUMgKi8KKwkJCQlSVE1QX1BTX1BPTExfRU5RVUVVRShwQWQpOwogCQkJfQogCQl9Ci0jZW5kaWYKIAotCQkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKLQkJaWYgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPiBNR01UX0RNQV9CVUZGRVJfU0laRSkKLQkJeworCQkvKiBUT0RPOiBpZiBNb3JlRGF0YSA9PSAwLCBzdGF0aW9uIGNhbiBnbyB0byBzbGVlcCAqLworCisJCS8qIFdlIHNob3VsZCBjb2xsZWN0IFJTU0kgbm90IG9ubHkgVTJNIGRhdGEgYnV0IGFsc28gbXkgYmVhY29uICovCisJCWlmICgocEhlYWRlci0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX0JFQUNPTikKKwkJICAgICYmIChNQUNfQUREUl9FUVVBTCgmcEFkLT5Db21tb25DZmcuQnNzaWQsICZwSGVhZGVyLT5BZGRyMikpCisJCSAgICAmJiAocEFkLT5SeEFudC5FdmFsdWF0ZVBlcmlvZCA9PSAwKSkgeworCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHBSeFdJKTsKKworCQkJcEFkLT5TdGFDZmcuTGFzdFNOUjAgPSAodTgpKHBSeFdJLT5TTlIwKTsKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIxID0gKHU4KShwUnhXSS0+U05SMSk7CisJCX0KKworCQkvKiBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUgKi8KKwkJaWYgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPiBNR01UX0RNQV9CVUZGRVJfU0laRSkgewogCQkJREJHUFJJTlRfRVJSKCgiU1RBSGFuZGxlUnhNZ210RnJhbWU6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVkIFxuIiwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCkpOwogCQkJYnJlYWs7CiAJCX0KIAotCQlSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIHBIZWFkZXIsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsCi0JCQkJCQkJCQlwUnhXSS0+UlNTSTAsIHBSeFdJLT5SU1NJMSwgcFJ4V0ktPlJTU0kyLCBwUnhELT5QbGNwU2lnbmFsKTsKKwkJUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShwQWQsIHBSeFdJLT5XaXJlbGVzc0NsaUlELCBwSGVhZGVyLAorCQkJCQkgIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsCisJCQkJCSAgcFJ4V0ktPlJTU0kwLCBwUnhXSS0+UlNTSTEsCisJCQkJCSAgcFJ4V0ktPlJTU0kyLCBwUnhELT5QbGNwU2lnbmFsKTsKIAl9IHdoaWxlIChGQUxTRSk7CiAKIAlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKIH0KIAotVk9JRCBTVEFIYW5kbGVSeENvbnRyb2xGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrKQordm9pZCBTVEFIYW5kbGVSeENvbnRyb2xGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaykKIHsKLQlQUlhXSV9TVFJVQwkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOwotCVBIRUFERVJfODAyXzExCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7Ci0JUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCXN0cnVjdCBydF9yeHdpICogcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKKwl2b2lkICpwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKIAotCXN3aXRjaCAocEhlYWRlci0+RkMuU3ViVHlwZSkKLQl7Ci0JCWNhc2UgU1VCVFlQRV9CTE9DS19BQ0tfUkVROgotCQkJewotCQkJCUNudGxFbnF1ZXVlRm9yUmVjdihwQWQsIHBSeFdJLT5XaXJlbGVzc0NsaUlELCAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCksIChQRlJBTUVfQkFfUkVRKXBIZWFkZXIpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9CTE9DS19BQ0s6Ci0JCWNhc2UgU1VCVFlQRV9BQ0s6Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKKwlzd2l0Y2ggKHBIZWFkZXItPkZDLlN1YlR5cGUpIHsKKwljYXNlIFNVQlRZUEVfQkxPQ0tfQUNLX1JFUToKKwkJeworCQkJQ250bEVucXVldWVGb3JSZWN2KHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsCisJCQkJCSAgIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50KSwKKwkJCQkJICAgKHN0cnVjdCBydF9mcmFtZV9iYV9yZXEgKikgcEhlYWRlcik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTVUJUWVBFX0JMT0NLX0FDSzoKKwljYXNlIFNVQlRZUEVfQUNLOgorCWRlZmF1bHQ6CisJCWJyZWFrOwogCX0KIAogCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTY1NCwxNDEgKzY5OCwxMjcgQEAKIAkJTmVlZCB0byBjb25zaWRlciBRT1MgREFUQSBmb3JtYXQgd2hlbiBjb252ZXJ0aW5nIHRvIDgwMi4zCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotQk9PTEVBTiBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JQk9PTEVBTgkJCWFyZ2MpCitCT09MRUFOIFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYXJnYykKIHsKLQlORElTX1NUQVRVUwkJCVN0YXR1czsKLQlVSU5UMzIJCQlSeFByb2Nlc3NlZCwgUnhQZW5kaW5nOwotCUJPT0xFQU4JCQliUmVzY2hlZHVsZSA9IEZBTFNFOwotCVJUMjhYWF9SWERfU1RSVUMJKnBSeEQ7Ci0JVUNIQVIJCQkqcERhdGE7Ci0JUFJYV0lfU1RSVUMJCXBSeFdJOwotCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQ7Ci0JUEhFQURFUl84MDJfMTEJcEhlYWRlcjsKLQlSWF9CTEsJCQlSeENlbGw7CisJaW50IFN0YXR1czsKKwl1MzIgUnhQcm9jZXNzZWQsIFJ4UGVuZGluZzsKKwlCT09MRUFOIGJSZXNjaGVkdWxlID0gRkFMU0U7CisJUFJUMjhYWF9SWERfU1RSVUMgcFJ4RDsKKwl1OCAqcERhdGE7CisJc3RydWN0IHJ0X3J4d2kgKiBwUnhXSTsKKwl2b2lkICpwUnhQYWNrZXQ7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyOworCXN0cnVjdCBydF9yeF9ibGsgUnhDZWxsOwogCiAJUnhQcm9jZXNzZWQgPSBSeFBlbmRpbmcgPSAwOwogCi0JLy8gcHJvY2VzcyB3aG9sZSByeCByaW5nCi0Jd2hpbGUgKDEpCi0JeworCS8qIHByb2Nlc3Mgd2hvbGUgcnggcmluZyAqLworCXdoaWxlICgxKSB7CiAKIAkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSB8fAotCQkJIVJUTVBfVEVTVF9GTEFHKHBBZCxmUlRNUF9BREFQVEVSX1NUQVJUX1VQKSkKLQkJeworCQkJCSAgIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCSAgIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJICAgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSB8fAorCQkgICAgIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpIHsKIAkJCWJyZWFrOwogCQl9Ci0KLSNpZmRlZiBSVDI4NjAKLQkJaWYgKFJ4UHJvY2Vzc2VkKysgPiBNQVhfUlhfUFJPQ0VTU19DTlQpCi0JCXsKLQkJCS8vIG5lZWQgdG8gcmVzY2hlZHVsZSByeCBoYW5kbGUKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJaWYgKFJ4UHJvY2Vzc2VkKysgPiBNQVhfUlhfUFJPQ0VTU19DTlQpIHsKKwkJCS8qIG5lZWQgdG8gcmVzY2hlZHVsZSByeCBoYW5kbGUgKi8KIAkJCWJSZXNjaGVkdWxlID0gVFJVRTsKIAkJCWJyZWFrOwogCQl9Ci0jZW5kaWYKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotCQlSeFByb2Nlc3NlZCArKzsgLy8gdGVzdAorCQlSeFByb2Nlc3NlZCsrOwkvKiB0ZXN0ICovCiAKLQkJLy8gMS4gYWxsb2NhdGUgYSBuZXcgZGF0YSBwYWNrZXQgaW50byByeCByaW5nIHRvIHJlcGxhY2UgcmVjZWl2ZWQgcGFja2V0Ci0JCS8vICAgIHRoZW4gcHJvY2Vzc2luZyB0aGUgcmVjZWl2ZWQgcGFja2V0Ci0JCS8vIDIuIHRoZSBjYWxsZWUgbXVzdCB0YWtlIGNoYXJnZSBvZiByZWxlYXNlIG9mIHBhY2tldAotCQkvLyAzLiBBcyBmYXIgYXMgZHJpdmVyIGlzIGNvbmNlcm5lZCAsCi0JCS8vICAgIHRoZSByeCBwYWNrZXQgbXVzdAotCQkvLyAgICAgIGEuIGJlIGluZGljYXRlZCB0byB1cHBlciBsYXllciBvcgotCQkvLyAgICAgIGIuIGJlIHJlbGVhc2VkIGlmIGl0IGlzIGRpc2NhcmRlZAotCQlwUnhQYWNrZXQgPSBHZXRQYWNrZXRGcm9tUnhSaW5nKHBBZCwgJihSeENlbGwuUnhEKSwgJmJSZXNjaGVkdWxlLCAmUnhQZW5kaW5nKTsKLQkJaWYgKHBSeFBhY2tldCA9PSBOVUxMKQotCQl7Ci0JCQkvLyBubyBtb3JlIHBhY2tldCB0byBwcm9jZXNzCisJCS8qIDEuIGFsbG9jYXRlIGEgbmV3IGRhdGEgcGFja2V0IGludG8gcnggcmluZyB0byByZXBsYWNlIHJlY2VpdmVkIHBhY2tldCAqLworCQkvKiAgICB0aGVuIHByb2Nlc3NpbmcgdGhlIHJlY2VpdmVkIHBhY2tldCAqLworCQkvKiAyLiB0aGUgY2FsbGVlIG11c3QgdGFrZSBjaGFyZ2Ugb2YgcmVsZWFzZSBvZiBwYWNrZXQgKi8KKwkJLyogMy4gQXMgZmFyIGFzIGRyaXZlciBpcyBjb25jZXJuZWQgLCAqLworCQkvKiAgICB0aGUgcnggcGFja2V0IG11c3QgKi8KKwkJLyogICAgICBhLiBiZSBpbmRpY2F0ZWQgdG8gdXBwZXIgbGF5ZXIgb3IgKi8KKwkJLyogICAgICBiLiBiZSByZWxlYXNlZCBpZiBpdCBpcyBkaXNjYXJkZWQgKi8KKwkJcFJ4UGFja2V0ID0KKwkJICAgIEdldFBhY2tldEZyb21SeFJpbmcocEFkLCAmKFJ4Q2VsbC5SeEQpLCAmYlJlc2NoZWR1bGUsCisJCQkJCSZSeFBlbmRpbmcpOworCQlpZiAocFJ4UGFja2V0ID09IE5VTEwpIHsKKwkJCS8qIG5vIG1vcmUgcGFja2V0IHRvIHByb2Nlc3MgKi8KIAkJCWJyZWFrOwogCQl9Ci0KLQkJLy8gZ2V0IHJ4IHJpbmcgZGVzY3JpcHRvcgorCQkvKiBnZXQgcnggcmluZyBkZXNjcmlwdG9yICovCiAJCXBSeEQgPSAmKFJ4Q2VsbC5SeEQpOwotCQkvLyBnZXQgcnggZGF0YSBidWZmZXIKLQkJcERhdGEJPSBHRVRfT1NfUEtUX0RBVEFQVFIocFJ4UGFja2V0KTsKLQkJcFJ4V0kJPSAoUFJYV0lfU1RSVUMpIHBEYXRhOwotCQlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSAocERhdGErUlhXSV9TSVpFKSA7CisJCS8qIGdldCByeCBkYXRhIGJ1ZmZlciAqLworCQlwRGF0YSA9IEdFVF9PU19QS1RfREFUQVBUUihwUnhQYWNrZXQpOworCQlwUnhXSSA9IChzdHJ1Y3QgcnRfcnh3aSAqKSBwRGF0YTsKKwkJcEhlYWRlciA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSAocERhdGEgKyBSWFdJX1NJWkUpOwogCi0JCS8vIGJ1aWxkIFJ4Q2VsbAorCQkvKiBidWlsZCBSeENlbGwgKi8KIAkJUnhDZWxsLnBSeFdJID0gcFJ4V0k7CiAJCVJ4Q2VsbC5wSGVhZGVyID0gcEhlYWRlcjsKIAkJUnhDZWxsLnBSeFBhY2tldCA9IHBSeFBhY2tldDsKLQkJUnhDZWxsLnBEYXRhID0gKFVDSEFSICopIHBIZWFkZXI7CisJCVJ4Q2VsbC5wRGF0YSA9ICh1OCAqKSBwSGVhZGVyOwogCQlSeENlbGwuRGF0YVNpemUgPSBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50OwogCQlSeENlbGwuRmxhZ3MgPSAwOwogCi0JCS8vIEluY3JlYXNlIFRvdGFsIHJlY2VpdmUgYnl0ZSBjb3VudGVyIGFmdGVyIHJlYWwgZGF0YSByZWNlaXZlZCBubyBtYXRlciBhbnkgZXJyb3Igb3Igbm90Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQgKz0gIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudCArKzsKKwkJLyogSW5jcmVhc2UgVG90YWwgcmVjZWl2ZSBieXRlIGNvdW50ZXIgYWZ0ZXIgcmVhbCBkYXRhIHJlY2VpdmVkIG5vIG1hdGVyIGFueSBlcnJvciBvciBub3QgKi8KKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SZWNlaXZlZEJ5dGVDb3VudCArPQorCQkgICAgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSZWNlaXZlZEJ5dGVDb3VudCArPQorCQkgICAgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50Kys7CiAKIAkJSU5DX0NPVU5URVI2NChwQWQtPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQpOwogCiAJCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IDwgMTQpCiAJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwogCi0gICAgICAgIGlmIChNT05JVE9SX09OKHBBZCkpCi0JCXsKLSAgICAgICAgICAgIHNlbmRfbW9uaXRvcl9wYWNrZXRzKHBBZCwgJlJ4Q2VsbCk7CisJCWlmIChNT05JVE9SX09OKHBBZCkpIHsKKwkJCXNlbmRfbW9uaXRvcl9wYWNrZXRzKHBBZCwgJlJ4Q2VsbCk7CiAJCQlicmVhazsKIAkJfQotCQkvKiBSVDI4NzAgaW52b2tlcyBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUoKSBpbiBydHVzYl9idWxrLmMgKi8KIAotCQkvLyBDaGVjayBmb3IgYWxsIFJ4RCBlcnJvcnMKKwkJLyogU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKCkgaXMgY2FsbGVkIGluIHJ0dXNiX2J1bGsuYyAqLworCisJCS8qIENoZWNrIGZvciBhbGwgUnhEIGVycm9ycyAqLwogCQlTdGF0dXMgPSBSVE1QQ2hlY2tSeEVycm9yKHBBZCwgcEhlYWRlciwgcFJ4V0ksIHBSeEQpOwogCi0JCS8vIEhhbmRsZSB0aGUgcmVjZWl2ZWQgZnJhbWUKLQkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlzd2l0Y2ggKHBIZWFkZXItPkZDLlR5cGUpCi0JCQl7Ci0JCQkJLy8gQ0FTRSBJLCByZWNlaXZlIGEgREFUQSBmcmFtZQotCQkJCWNhc2UgQlRZUEVfREFUQToKKwkJLyogSGFuZGxlIHRoZSByZWNlaXZlZCBmcmFtZSAqLworCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXN3aXRjaCAocEhlYWRlci0+RkMuVHlwZSkgeworCQkJCS8qIENBU0UgSSwgcmVjZWl2ZSBhIERBVEEgZnJhbWUgKi8KKwkJCWNhc2UgQlRZUEVfREFUQToKIAkJCQl7Ci0JCQkJCS8vIHByb2Nlc3MgREFUQSBmcmFtZQorCQkJCQkvKiBwcm9jZXNzIERBVEEgZnJhbWUgKi8KIAkJCQkJU1RBSGFuZGxlUnhEYXRhRnJhbWUocEFkLCAmUnhDZWxsKTsKIAkJCQl9CiAJCQkJYnJlYWs7Ci0JCQkJLy8gQ0FTRSBJSSwgcmVjZWl2ZSBhIE1HTVQgZnJhbWUKLQkJCQljYXNlIEJUWVBFX01HTVQ6CisJCQkJLyogQ0FTRSBJSSwgcmVjZWl2ZSBhIE1HTVQgZnJhbWUgKi8KKwkJCWNhc2UgQlRZUEVfTUdNVDoKIAkJCQl7CiAJCQkJCVNUQUhhbmRsZVJ4TWdtdEZyYW1lKHBBZCwgJlJ4Q2VsbCk7CiAJCQkJfQogCQkJCWJyZWFrOwotCQkJCS8vIENBU0UgSUlJLiByZWNlaXZlIGEgQ05UTCBmcmFtZQotCQkJCWNhc2UgQlRZUEVfQ05UTDoKKwkJCQkvKiBDQVNFIElJSS4gcmVjZWl2ZSBhIENOVEwgZnJhbWUgKi8KKwkJCWNhc2UgQlRZUEVfQ05UTDoKIAkJCQl7CiAJCQkJCVNUQUhhbmRsZVJ4Q29udHJvbEZyYW1lKHBBZCwgJlJ4Q2VsbCk7CiAJCQkJfQogCQkJCWJyZWFrOwotCQkJCS8vIGRpc2NhcmQgb3RoZXIgdHlwZQotCQkJCWRlZmF1bHQ6Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCQlicmVhazsKKwkJCQkvKiBkaXNjYXJkIG90aGVyIHR5cGUgKi8KKwkJCWRlZmF1bHQ6CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwKKwkJCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQlicmVhazsKIAkJCX0KLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCXBBZC0+Q291bnRlcnM4MDIzLlJ4RXJyb3JzKys7Ci0JCQkvLyBkaXNjYXJkIHRoaXMgZnJhbWUKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJLyogZGlzY2FyZCB0aGlzIGZyYW1lICovCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LAorCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCX0KIAl9CiAKLSNpZmRlZiBSVDI4NjAKLQkvLyBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cgaXMgc2V0IGlmIHJlY2VpdmluZyBiZWFjb24uCi0JaWYgKFJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cpICYmIChJTkZSQV9PTihwQWQpKSkKLQl7Ci0JCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfR09fVE9fU0xFRVBfTk9XKTsKLQkJQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAocEFkLCBwQWQtPlRoaXNUYnR0TnVtVG9OZXh0V2FrZVVwKTsKLQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKLQl9Ci0jZW5kaWYKIAlyZXR1cm4gYlJlc2NoZWR1bGU7CiB9CiAKQEAgLTgwMywxNSArODMzLDkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRNUEhhbmRsZVR3YWtldXBJbnRlcnJ1cHQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIFJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLSNpZmRlZiBSVDI4NjAKLQlBc2ljRm9yY2VXYWtldXAocEFkLCBET1QxMVBPV0VSU0FWRSk7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKIAlBc2ljRm9yY2VXYWtldXAocEFkLCBGQUxTRSk7Ci0jZW5kaWYKIH0KIAogLyoKQEAgLTgyMCw5ICs4NDQsOSBAQAogICAgIEVhcmx5IGNoZWNraW5nIGFuZCBPUy1kZXBlbmVkIHBhcnNpbmcgZm9yIFR4IHBhY2tldCBzZW5kIHRvIG91ciBTVEEgZHJpdmVyLgogCiBBcmd1bWVudHM6Ci0gICAgTkRJU19IQU5ETEUgCU1pbmlwb3J0QWRhcHRlckNvbnRleHQJUG9pbnRlciByZWZlciB0byB0aGUgZGV2aWNlIGhhbmRsZSwgaS5lLiwgdGhlIHBBZC4KLQlQUE5ESVNfUEFDS0VUCXBwUGFja2V0QXJyYXkJCQlUaGUgcGFja2V0IGFycmF5IG5lZWQgdG8gZG8gdHJhbnNtaXNzaW9uLgotCVVJTlQJCQlOdW1iZXJPZlBhY2tldHMJCQlOdW1iZXIgb2YgcGFja2V0IGluIHBhY2tldCBhcnJheS4KKyAgICB2b2lkICoJTWluaXBvcnRBZGFwdGVyQ29udGV4dAlQb2ludGVyIHJlZmVyIHRvIHRoZSBkZXZpY2UgaGFuZGxlLCBpLmUuLCB0aGUgcEFkLgorCXZvaWQgKioJcHBQYWNrZXRBcnJheQkJCVRoZSBwYWNrZXQgYXJyYXkgbmVlZCB0byBkbyB0cmFuc21pc3Npb24uCisJdTMyCQkJTnVtYmVyT2ZQYWNrZXRzCQkJTnVtYmVyIG9mIHBhY2tldCBpbiBwYWNrZXQgYXJyYXkuCiAKIFJldHVybiBWYWx1ZToKIAlOT05FCkBAIC04MzIsNDcgKzg1NiwzOSBAQAogCVlvdSBvbmx5IGNhbiBwdXQgT1MtZGVwZW5lZCAmIFNUQSByZWxhdGVkIGNvZGUgaW4gaGVyZS4KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgU1RBU2VuZFBhY2tldHMoCi0JSU4JTkRJU19IQU5ETEUJCU1pbmlwb3J0QWRhcHRlckNvbnRleHQsCi0JSU4JUFBORElTX1BBQ0tFVAlwcFBhY2tldEFycmF5LAotCUlOCVVJTlQJCQlOdW1iZXJPZlBhY2tldHMpCit2b2lkIFNUQVNlbmRQYWNrZXRzKHZvaWQgKk1pbmlwb3J0QWRhcHRlckNvbnRleHQsCisJCSAgICB2b2lkICoqcHBQYWNrZXRBcnJheSwgdTMyIE51bWJlck9mUGFja2V0cykKIHsKLQlVSU5UCQkJSW5kZXg7Ci0JUFJUTVBfQURBUFRFUglwQWQgPSAoUFJUTVBfQURBUFRFUikgTWluaXBvcnRBZGFwdGVyQ29udGV4dDsKLQlQTkRJU19QQUNLRVQJcFBhY2tldDsKLQlCT09MRUFOCQkJYWxsb3dUb1NlbmQgPSBGQUxTRTsKKwl1MzIgSW5kZXg7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilNaW5pcG9ydEFkYXB0ZXJDb250ZXh0OworCXZvaWQgKnBQYWNrZXQ7CisJQk9PTEVBTiBhbGxvd1RvU2VuZCA9IEZBTFNFOwogCi0KLQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOdW1iZXJPZlBhY2tldHM7IEluZGV4KyspCi0JeworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE51bWJlck9mUGFja2V0czsgSW5kZXgrKykgewogCQlwUGFja2V0ID0gcHBQYWNrZXRBcnJheVtJbmRleF07CiAKLQkJZG8KLQkJewotCQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykgfHwKLQkJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykgfHwKLQkJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKLQkJCXsKLQkJCQkvLyBEcm9wIHNlbmQgcmVxdWVzdCBzaW5jZSBoYXJkd2FyZSBpcyBpbiByZXNldCBzdGF0ZQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYgKCFJTkZSQV9PTihwQWQpICYmICFBREhPQ19PTihwQWQpKQotCQkJewotCQkJCS8vIERyb3Agc2VuZCByZXF1ZXN0IHNpbmNlIHRoZXJlIGFyZSBubyBwaHlzaWNhbCBjb25uZWN0aW9uIHlldAotCQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBSZWNvcmQgdGhhdCBvcmlnbmFsIHBhY2tldCBzb3VyY2UgaXMgZnJvbSBORElTIGxheWVyLHNvIHRoYXQKLQkJCQkvLyBsYXRlciBvbiBkcml2ZXIga25vd3MgaG93IHRvIHJlbGVhc2UgdGhpcyBORElTIFBBQ0tFVAotCQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIDApOyAvLyB0aGlzIGZpZWxkIGlzIHVzZWxlc3Mgd2hlbiBpbiBTVEEgbW9kZQorCQlkbyB7CisJCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKQorCQkJICAgIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwKKwkJCQkJICAgICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKQorCQkJICAgIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKSB7CisJCQkJLyogRHJvcCBzZW5kIHJlcXVlc3Qgc2luY2UgaGFyZHdhcmUgaXMgaW4gcmVzZXQgc3RhdGUgKi8KKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoIUlORlJBX09OKHBBZCkgJiYgIUFESE9DX09OKHBBZCkpIHsKKwkJCQkvKiBEcm9wIHNlbmQgcmVxdWVzdCBzaW5jZSB0aGVyZSBhcmUgbm8gcGh5c2ljYWwgY29ubmVjdGlvbiB5ZXQgKi8KKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJLyogUmVjb3JkIHRoYXQgb3JpZ25hbCBwYWNrZXQgc291cmNlIGlzIGZyb20gTkRJUyBsYXllcixzbyB0aGF0ICovCisJCQkJLyogbGF0ZXIgb24gZHJpdmVyIGtub3dzIGhvdyB0byByZWxlYXNlIHRoaXMgTkRJUyBQQUNLRVQgKi8KKwkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCAwKTsJLyogdGhpcyBmaWVsZCBpcyB1c2VsZXNzIHdoZW4gaW4gU1RBIG1vZGUgKi8KIAkJCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKHBQYWNrZXQsIFBLVFNSQ19ORElTKTsKLQkJCQlORElTX1NFVF9QQUNLRVRfU1RBVFVTKHBQYWNrZXQsIE5ESVNfU1RBVFVTX1BFTkRJTkcpOworCQkJCU5ESVNfU0VUX1BBQ0tFVF9TVEFUVVMocFBhY2tldCwKKwkJCQkJCSAgICAgICBORElTX1NUQVRVU19QRU5ESU5HKTsKIAkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlBlbmRpbmdOZGlzUGFja2V0Q291bnQrKzsKIAogCQkJCWFsbG93VG9TZW5kID0gVFJVRTsKIAkJCX0KLQkJfSB3aGlsZShGQUxTRSk7CisJCX0gd2hpbGUgKEZBTFNFKTsKIAogCQlpZiAoYWxsb3dUb1NlbmQgPT0gVFJVRSkKIAkJCVNUQVNlbmRQYWNrZXQocEFkLCBwUGFja2V0KTsKQEAgLTg4MCwxMiArODk2LDExIEBACiAJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJfQogCi0JLy8gRGVxdWV1ZSBvdXRnb2luZyBmcmFtZXMgZnJvbSBUeFN3UXVldWVbXSBhbmQgcHJvY2VzcyBpdAorCS8qIERlcXVldWUgb3V0Z29pbmcgZnJhbWVzIGZyb20gVHhTd1F1ZXVlW10gYW5kIHByb2Nlc3MgaXQgKi8KIAlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOwogCiB9CiAKLQogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogUm91dGluZSBEZXNjcmlwdGlvbjoKQEAgLTg5OCwyMDEgKzkxMywxOTkgQEAKIAlwUGFja2V0IAlQb2ludGVyIHRvIHNlbmQgcGFja2V0CiAKIFJldHVybiBWYWx1ZToKLQlORElTX1NUQVRVU19TVUNDRVNTCQkJSWYgc3VjY2VzIHRvIHF1ZXVlIHRoZSBwYWNrZXQgaW50byBUeFN3UXVldWUuCisJTkRJU19TVEFUVVNfU1VDQ0VTUwkJCUlmIHN1Y2Nlc3MgdG8gcXVldWUgdGhlIHBhY2tldCBpbnRvIFR4U3dRdWV1ZS4KIAlORElTX1NUQVRVU19GQUlMVVJFCQkJSWYgZmFpbGVkIHRvIGRvIGVuLXF1ZXVlLgogCiBOb3RlOgogCVlvdSBvbmx5IGNhbiBwdXQgT1MtaW5kZXBlbmVkICYgU1RBIHJlbGF0ZWQgY29kZSBpbiBoZXJlLgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTkRJU19TVEFUVVMgU1RBU2VuZFBhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK2ludCBTVEFTZW5kUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqcFBhY2tldCkKIHsKLQlQQUNLRVRfSU5GTyAJUGFja2V0SW5mbzsKLQlQVUNIQVIJCQlwU3JjQnVmVkE7Ci0JVUlOVAkJCVNyY0J1ZkxlbjsKLQlVSU5UCQkJQWxsb3dGcmFnU2l6ZTsKLQlVQ0hBUgkJCU51bWJlck9mRnJhZzsKLQlVQ0hBUgkJCVF1ZUlkeCwgVXNlclByaW9yaXR5OwotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQgCUlycUZsYWdzOwotCVVDSEFSCQkJRmxnSXNJUCA9IDA7Ci0JVUNIQVIJCQlSYXRlOworCXN0cnVjdCBydF9wYWNrZXRfaW5mbyBQYWNrZXRJbmZvOworCXU4ICpwU3JjQnVmVkE7CisJdTMyIFNyY0J1ZkxlbjsKKwl1MzIgQWxsb3dGcmFnU2l6ZTsKKwl1OCBOdW1iZXJPZkZyYWc7CisJdTggUlRTUmVxdWlyZWQ7CisJdTggUXVlSWR4LCBVc2VyUHJpb3JpdHk7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgSXJxRmxhZ3M7CisJdTggRmxnSXNJUCA9IDA7CisJdTggUmF0ZTsKIAotCS8vIFByZXBhcmUgcGFja2V0IGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgYnVmZmVyIGRlc2NyaXB0b3IKLQkvLyBjaGFpbmVkIHdpdGhpbiBhIHNpbmdsZSBORElTIHBhY2tldC4KKwkvKiBQcmVwYXJlIHBhY2tldCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIGJ1ZmZlciBkZXNjcmlwdG9yICovCisJLyogY2hhaW5lZCB3aXRoaW4gYSBzaW5nbGUgTkRJUyBwYWNrZXQuICovCiAJUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwU3JjQnVmVkEsICZTcmNCdWZMZW4pOwogCi0JaWYgKHBTcmNCdWZWQSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJTVEFTZW5kUGFja2V0IC0tPiBwU3JjQnVmVkEgPT0gTlVMTCAhISFTcmNCdWZMZW49JXhcbiIsU3JjQnVmTGVuKSk7Ci0JCS8vIFJlc291cmVjZSBpcyBsb3csIHN5c3RlbSBkaWQgbm90IGFsbG9jYXRlIHZpcnR1YWwgYWRkcmVzcwotCQkvLyByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBkaXJlY3RseSB0byB1cHBlciBsYXllcgorCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIlNUQVNlbmRQYWNrZXQgLS0+IHBTcmNCdWZWQSA9PSBOVUxMICFTcmNCdWZMZW49JXhcbiIsCisJCQkgIFNyY0J1ZkxlbikpOworCQkvKiBSZXNvdXJlY2UgaXMgbG93LCBzeXN0ZW0gZGlkIG5vdCBhbGxvY2F0ZSB2aXJ0dWFsIGFkZHJlc3MgKi8KKwkJLyogcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkUgZGlyZWN0bHkgdG8gdXBwZXIgbGF5ZXIgKi8KIAkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKIAl9CiAKLQotCWlmIChTcmNCdWZMZW4gPCAxNCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiU1RBU2VuZFBhY2tldCAtLT4gTmRpcyBQYWNrZXQgYnVmZmVyIGVycm9yICEhIVxuIikpOworCWlmIChTcmNCdWZMZW4gPCAxNCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIlNUQVNlbmRQYWNrZXQgLS0+IE5kaXMgUGFja2V0IGJ1ZmZlciBlcnJvciFcbiIpKTsKIAkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCX0KLQotCS8vIEluIEhUIHJhdGUgYWRob2MgbW9kZSwgQS1NUERVIGlzIG9mdGVuIHVzZWQuIFNvIG5lZWQgdG8gbG9va3VwIEJBIFRhYmxlIGFuZCBNQUMgRW50cnkuCi0JLy8gTm90ZSBtdWx0aWNhc3QgcGFja2V0cyBpbiBhZGhvYyBhbHNvIHVzZSBCU1NJRF9XQ0lEIGluZGV4LgorCS8qIEluIEhUIHJhdGUgYWRob2MgbW9kZSwgQS1NUERVIGlzIG9mdGVuIHVzZWQuIFNvIG5lZWQgdG8gbG9va3VwIEJBIFRhYmxlIGFuZCBNQUMgRW50cnkuICovCisJLyogTm90ZSBtdWx0aWNhc3QgcGFja2V0cyBpbiBhZGhvYyBhbHNvIHVzZSBCU1NJRF9XQ0lEIGluZGV4LiAqLwogCXsKLQkJaWYoSU5GUkFfT04ocEFkKSkKLQkJeworCQlpZiAoSU5GUkFfT04ocEFkKSkgewogCQkJewotCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07Ci0JCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCBCU1NJRF9XQ0lEKTsKLQkJCVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5UeFJhdGU7Ci0JCX0KLQkJfQotCQllbHNlIGlmIChBREhPQ19PTihwQWQpKQotCQl7Ci0JCQlpZiAoKnBTcmNCdWZWQSAmIDB4MDEpCi0JCQl7CisJCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJCQkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgQlNTSURfV0NJRCk7CisJCQkJUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZTsKKwkJCX0KKwkJfSBlbHNlIGlmIChBREhPQ19PTihwQWQpKSB7CisJCQlpZiAoKnBTcmNCdWZWQSAmIDB4MDEpIHsKIAkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCBNQ0FTVF9XQ0lEKTsKIAkJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKKwkJCX0gZWxzZSB7CiAJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwU3JjQnVmVkEpOwogCQkJfQogCQkJUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZTsKIAkJfQogCX0KIAotCWlmICghcEVudHJ5KQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJTVEFTZW5kUGFja2V0LT5DYW5ub3QgZmluZCBwRW50cnkoJTJ4OiUyeDolMng6JTJ4OiUyeDolMngpIGluIE1hY1RhYiFcbiIsIFBSSU5UX01BQyhwU3JjQnVmVkEpKSk7Ci0JCS8vIFJlc291cmVjZSBpcyBsb3csIHN5c3RlbSBkaWQgbm90IGFsbG9jYXRlIHZpcnR1YWwgYWRkcmVzcwotCQkvLyByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBkaXJlY3RseSB0byB1cHBlciBsYXllcgorCWlmICghcEVudHJ5KSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiU1RBU2VuZFBhY2tldC0+Q2Fubm90IGZpbmQgcEVudHJ5KCUyeDolMng6JTJ4OiUyeDolMng6JTJ4KSBpbiBNYWNUYWIhXG4iLAorCQkJICBQUklOVF9NQUMocFNyY0J1ZlZBKSkpOworCQkvKiBSZXNvdXJlY2UgaXMgbG93LCBzeXN0ZW0gZGlkIG5vdCBhbGxvY2F0ZSB2aXJ0dWFsIGFkZHJlc3MgKi8KKwkJLyogcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkUgZGlyZWN0bHkgdG8gdXBwZXIgbGF5ZXIgKi8KIAkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKIAl9CiAKIAlpZiAoQURIT0NfT04ocEFkKQotCQkpCi0JewotCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCAoVUNIQVIpcEVudHJ5LT5BaWQpOworCSAgICApIHsKKwkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgKHU4KXBFbnRyeS0+QWlkKTsKIAl9Ci0KLQkvLwotCS8vIENoZWNrIHRoZSBFdGhlcm5ldCBGcmFtZSB0eXBlIG9mIHRoaXMgcGFja2V0LCBhbmQgc2V0IHRoZSBSVE1QX1NFVF9QQUNLRVRfU1BFQ0lGSUMgZmxhZ3MuCi0JLy8JCUhlcmUgd2Ugc2V0IHRoZSBQQUNLRVRfU1BFQ0lGSUMgZmxhZ3MoTExDLCBWTEFOLCBESENQL0FSUCwgRUFQT0wpLgorCS8qICovCisJLyogQ2hlY2sgdGhlIEV0aGVybmV0IEZyYW1lIHR5cGUgb2YgdGhpcyBwYWNrZXQsIGFuZCBzZXQgdGhlIFJUTVBfU0VUX1BBQ0tFVF9TUEVDSUZJQyBmbGFncy4gKi8KKwkvKiAgICAgICAgICAgICAgSGVyZSB3ZSBzZXQgdGhlIFBBQ0tFVF9TUEVDSUZJQyBmbGFncyhMTEMsIFZMQU4sIERIQ1AvQVJQLCBFQVBPTCkuICovCiAJUlRNUENoZWNrRXRoZXJUeXBlKHBBZCwgcFBhY2tldCk7CiAKLQotCi0JLy8KLQkvLyBXUEEgODAyLjF4IHNlY3VyZWQgcG9ydCBjb250cm9sIC0gZHJvcCBhbGwgbm9uLTgwMi4xeCBmcmFtZSBiZWZvcmUgcG9ydCBzZWN1cmVkCi0JLy8KKwkvKiAqLworCS8qIFdQQSA4MDIuMXggc2VjdXJlZCBwb3J0IGNvbnRyb2wgLSBkcm9wIGFsbCBub24tODAyLjF4IGZyYW1lIGJlZm9yZSBwb3J0IHNlY3VyZWQgKi8KKwkvKiAqLwogCWlmICgoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKLQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8Ci0JCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKLQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQotCQkgIHx8IChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSkKLQkJICApCi0JCSAgJiYgKChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpIHx8IChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPj0gMikpCi0JCSAgJiYgKFJUTVBfR0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0KT09IEZBTFNFKQotCQkgICkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBU2VuZFBhY2tldCAtLT4gRHJvcCBwYWNrZXQgYmVmb3JlIHBvcnQgc2VjdXJlZCAhISFcbiIpKTsKKwkgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorCSAgICAgfHwgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKQorCSAgICApCisJICAgICYmICgocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKQorCQl8fCAocEFkLT5TdGFDZmcuTWljRXJyQ250ID49IDIpKQorCSAgICAmJiAoUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBQYWNrZXQpID09IEZBTFNFKQorCSAgICApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJTVEFTZW5kUGFja2V0IC0tPiBEcm9wIHBhY2tldCBiZWZvcmUgcG9ydCBzZWN1cmVkIVxuIikpOwogCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAKIAkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKIAl9CiAKKwkvKiBTVEVQIDEuIERlY2lkZSBudW1iZXIgb2YgZnJhZ21lbnRzIHJlcXVpcmVkIHRvIGRlbGl2ZXIgdGhpcyBNU0RVLiAqLworCS8qICAgICAgICAgVGhlIGVzdGltYXRpb24gaGVyZSBpcyBub3QgdmVyeSBhY2N1cmF0ZSBiZWNhdXNlIGRpZmZpY3VsdCB0byAqLworCS8qICAgICAgICAgdGFrZSBlbmNyeXB0aW9uIG92ZXJoZWFkIGludG8gY29uc2lkZXJhdGlvbiBoZXJlLiBUaGUgcmVzdWx0ICovCisJLyogICAgICAgICAiTnVtYmVyT2ZGcmFnIiBpcyB0aGVuIGp1c3QgdXNlZCB0byBwcmUtY2hlY2sgaWYgZW5vdWdoIGZyZWUgKi8KKwkvKiAgICAgICAgIFRYRCBhcmUgYXZhaWxhYmxlIHRvIGhvbGQgdGhpcyBNU0RVLiAqLwogCi0JLy8gU1RFUCAxLiBEZWNpZGUgbnVtYmVyIG9mIGZyYWdtZW50cyByZXF1aXJlZCB0byBkZWxpdmVyIHRoaXMgTVNEVS4KLQkvLwkgICBUaGUgZXN0aW1hdGlvbiBoZXJlIGlzIG5vdCB2ZXJ5IGFjY3VyYXRlIGJlY2F1c2UgZGlmZmljdWx0IHRvCi0JLy8JICAgdGFrZSBlbmNyeXB0aW9uIG92ZXJoZWFkIGludG8gY29uc2lkZXJhdGlvbiBoZXJlLiBUaGUgcmVzdWx0Ci0JLy8JICAgIk51bWJlck9mRnJhZyIgaXMgdGhlbiBqdXN0IHVzZWQgdG8gcHJlLWNoZWNrIGlmIGVub3VnaCBmcmVlCi0JLy8JICAgVFhEIGFyZSBhdmFpbGFibGUgdG8gaG9sZCB0aGlzIE1TRFUuCi0KLQotCWlmICgqcFNyY0J1ZlZBICYgMHgwMSkJLy8gZnJhZ21lbnRhdGlvbiBub3QgYWxsb3dlZCBvbiBtdWx0aWNhc3QgJiBicm9hZGNhc3QKKwlpZiAoKnBTcmNCdWZWQSAmIDB4MDEpCS8qIGZyYWdtZW50YXRpb24gbm90IGFsbG93ZWQgb24gbXVsdGljYXN0ICYgYnJvYWRjYXN0ICovCiAJCU51bWJlck9mRnJhZyA9IDE7CiAJZWxzZSBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpKQotCQlOdW1iZXJPZkZyYWcgPSAxOwkvLyBBZ2dyZWdhdGlvbiBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24KKwkJTnVtYmVyT2ZGcmFnID0gMTsJLyogQWdncmVnYXRpb24gb3ZlcndoZWxtcyBmcmFnbWVudGF0aW9uICovCiAJZWxzZSBpZiAoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpKQotCQlOdW1iZXJPZkZyYWcgPSAxOwkvLyBBZ2dyZWdhdGlvbiBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24KLQllbHNlIGlmICgocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9IVE1JWCkgfHwgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfSFRHUkVFTkZJRUxEKSkKLQkJTnVtYmVyT2ZGcmFnID0gMTsJLy8gTUlNTyBSQVRFIG92ZXJ3aGVsbXMgZnJhZ21lbnRhdGlvbgotCWVsc2UKLQl7Ci0JCS8vIFRoZSBjYWxjdWxhdGVkICJOdW1iZXJPZkZyYWciIGlzIGEgcm91Z2ggZXN0aW1hdGlvbiBiZWNhdXNlIG9mIHZhcmlvdXMKLQkJLy8gZW5jcnlwdGlvbi9lbmNhcHN1bGF0aW9uIG92ZXJoZWFkIG5vdCB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoaXMgbnVtYmVyIGlzIGp1c3QKLQkJLy8gdXNlZCB0byBtYWtlIHN1cmUgZW5vdWdoIGZyZWUgVFhEIGFyZSBhdmFpbGFibGUgYmVmb3JlIGZyYWdtZW50YXRpb24gdGFrZXMgcGxhY2UuCi0JCS8vIEluIGNhc2UgdGhlIGFjdHVhbCByZXF1aXJlZCBudW1iZXIgb2YgZnJhZ21lbnRzIG9mIGFuIE5ESVMgcGFja2V0Ci0JCS8vIGV4Y2NlZWRzICJOdW1iZXJPZkZyYWciY2FjdWxhdGVkIGhlcmUgYW5kIG5vdCBlbm91Z2ggZnJlZSBUWEQgYXZhaWxhYmxlLCB0aGUKLQkJLy8gbGFzdCBmcmFnbWVudCAoaS5lLiBsYXN0IE1QRFUpIHdpbGwgYmUgZHJvcHBlZCBpbiBSVE1QSGFyZFRyYW5zbWl0KCkgZHVlIHRvIG91dCBvZgotCQkvLyByZXNvdXJjZSwgYW5kIHRoZSBORElTIHBhY2tldCB3aWxsIGJlIGluZGljYXRlZCBORElTX1NUQVRVU19GQUlMVVJFLiBUaGlzIHNob3VsZAotCQkvLyByYXJlbHkgaGFwcGVuIGFuZCB0aGUgcGVuYWx0eSBpcyBqdXN0IGxpa2UgYSBUWCBSRVRSWSBmYWlsLiBBZmZvcmRhYmxlLgorCQlOdW1iZXJPZkZyYWcgPSAxOwkvKiBBZ2dyZWdhdGlvbiBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24gKi8KKwllbHNlIGlmICgocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9IVE1JWCkKKwkJIHx8IChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUR1JFRU5GSUVMRCkpCisJCU51bWJlck9mRnJhZyA9IDE7CS8qIE1JTU8gUkFURSBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24gKi8KKwllbHNlIHsKKwkJLyogVGhlIGNhbGN1bGF0ZWQgIk51bWJlck9mRnJhZyIgaXMgYSByb3VnaCBlc3RpbWF0aW9uIGJlY2F1c2Ugb2YgdmFyaW91cyAqLworCQkvKiBlbmNyeXB0aW9uL2VuY2Fwc3VsYXRpb24gb3ZlcmhlYWQgbm90IHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gVGhpcyBudW1iZXIgaXMganVzdCAqLworCQkvKiB1c2VkIHRvIG1ha2Ugc3VyZSBlbm91Z2ggZnJlZSBUWEQgYXJlIGF2YWlsYWJsZSBiZWZvcmUgZnJhZ21lbnRhdGlvbiB0YWtlcyBwbGFjZS4gKi8KKwkJLyogSW4gY2FzZSB0aGUgYWN0dWFsIHJlcXVpcmVkIG51bWJlciBvZiBmcmFnbWVudHMgb2YgYW4gTkRJUyBwYWNrZXQgKi8KKwkJLyogZXhjY2VlZHMgIk51bWJlck9mRnJhZyJjYWN1bGF0ZWQgaGVyZSBhbmQgbm90IGVub3VnaCBmcmVlIFRYRCBhdmFpbGFibGUsIHRoZSAqLworCQkvKiBsYXN0IGZyYWdtZW50IChpLmUuIGxhc3QgTVBEVSkgd2lsbCBiZSBkcm9wcGVkIGluIFJUTVBIYXJkVHJhbnNtaXQoKSBkdWUgdG8gb3V0IG9mICovCisJCS8qIHJlc291cmNlLCBhbmQgdGhlIE5ESVMgcGFja2V0IHdpbGwgYmUgaW5kaWNhdGVkIE5ESVNfU1RBVFVTX0ZBSUxVUkUuIFRoaXMgc2hvdWxkICovCisJCS8qIHJhcmVseSBoYXBwZW4gYW5kIHRoZSBwZW5hbHR5IGlzIGp1c3QgbGlrZSBhIFRYIFJFVFJZIGZhaWwuIEFmZm9yZGFibGUuICovCiAKLQkJQWxsb3dGcmFnU2l6ZSA9IChwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkgLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIX0NSQzsKLQkJTnVtYmVyT2ZGcmFnID0gKChQYWNrZXRJbmZvLlRvdGFsUGFja2V0TGVuZ3RoIC0gTEVOR1RIXzgwMl8zICsgTEVOR1RIXzgwMl8xX0gpIC8gQWxsb3dGcmFnU2l6ZSkgKyAxOwotCQkvLyBUbyBnZXQgYWNjdXJhdGUgbnVtYmVyIG9mIGZyYWdtZW50YXRpb24sIE1pbnVzIDEgaWYgdGhlIHNpemUganVzdCBtYXRjaCB0byBhbGxvd2FibGUgZnJhZ21lbnQgc2l6ZQotCQlpZiAoKChQYWNrZXRJbmZvLlRvdGFsUGFja2V0TGVuZ3RoIC0gTEVOR1RIXzgwMl8zICsgTEVOR1RIXzgwMl8xX0gpICUgQWxsb3dGcmFnU2l6ZSkgPT0gMCkKLQkJeworCQlBbGxvd0ZyYWdTaXplID0KKwkJICAgIChwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkgLSBMRU5HVEhfODAyXzExIC0KKwkJICAgIExFTkdUSF9DUkM7CisJCU51bWJlck9mRnJhZyA9CisJCSAgICAoKFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGggLSBMRU5HVEhfODAyXzMgKworCQkgICAgICBMRU5HVEhfODAyXzFfSCkgLyBBbGxvd0ZyYWdTaXplKSArIDE7CisJCS8qIFRvIGdldCBhY2N1cmF0ZSBudW1iZXIgb2YgZnJhZ21lbnRhdGlvbiwgTWludXMgMSBpZiB0aGUgc2l6ZSBqdXN0IG1hdGNoIHRvIGFsbG93YWJsZSBmcmFnbWVudCBzaXplICovCisJCWlmICgoKFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGggLSBMRU5HVEhfODAyXzMgKworCQkgICAgICBMRU5HVEhfODAyXzFfSCkgJSBBbGxvd0ZyYWdTaXplKSA9PSAwKSB7CiAJCQlOdW1iZXJPZkZyYWctLTsKIAkJfQogCX0KIAotCS8vIFNhdmUgZnJhZ21lbnQgbnVtYmVyIHRvIE5kaXMgcGFja2V0IHJlc2VydmVkIGZpZWxkCisJLyogU2F2ZSBmcmFnbWVudCBudW1iZXIgdG8gTmRpcyBwYWNrZXQgcmVzZXJ2ZWQgZmllbGQgKi8KIAlSVE1QX1NFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQsIE51bWJlck9mRnJhZyk7CiAKKwkvKiBTVEVQIDIuIENoZWNrIHRoZSByZXF1aXJlbWVudCBvZiBSVFM6ICovCisJLyogICAgICAgICBJZiBtdWx0aXBsZSBmcmFnbWVudCByZXF1aXJlZCwgUlRTIGlzIHJlcXVpcmVkIG9ubHkgZm9yIHRoZSBmaXJzdCBmcmFnbWVudCAqLworCS8qICAgICAgICAgaWYgdGhlIGZyYWdtZW50IHNpemUgbGFyZ2UgdGhhbiBSVFMgdGhyZXNob2xkICovCisJLyogICAgIEZvciBSVDI4eHgsIExldCBBU0lDIHNlbmQgUlRTL0NUUyAqLworLyogICAgICBSVE1QX1NFVF9QQUNLRVRfUlRTKHBQYWNrZXQsIDApOyAqLworCWlmIChOdW1iZXJPZkZyYWcgPiAxKQorCQlSVFNSZXF1aXJlZCA9CisJCSAgICAocEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPgorCQkgICAgIHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCkgPyAxIDogMDsKKwllbHNlCisJCVJUU1JlcXVpcmVkID0KKwkJICAgIChQYWNrZXRJbmZvLlRvdGFsUGFja2V0TGVuZ3RoID4KKwkJICAgICBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpID8gMSA6IDA7CiAKLQkvLyBTVEVQIDIuIENoZWNrIHRoZSByZXF1aXJlbWVudCBvZiBSVFM6Ci0JLy8JICAgSWYgbXVsdGlwbGUgZnJhZ21lbnQgcmVxdWlyZWQsIFJUUyBpcyByZXF1aXJlZCBvbmx5IGZvciB0aGUgZmlyc3QgZnJhZ21lbnQKLQkvLwkgICBpZiB0aGUgZnJhZ21lbnQgc2l6ZSBsYXJnZSB0aGFuIFJUUyB0aHJlc2hvbGQKLQkvLyAgICAgRm9yIFJUMjh4eCwgTGV0IEFTSUMgc2VuZCBSVFMvQ1RTCi0JUlRNUF9TRVRfUEFDS0VUX1JUUyhwUGFja2V0LCAwKTsKKwkvKiBTYXZlIFJUUyByZXF1aXJlbWVudCB0byBOZGlzIHBhY2tldCByZXNlcnZlZCBmaWVsZCAqLworCVJUTVBfU0VUX1BBQ0tFVF9SVFMocFBhY2tldCwgUlRTUmVxdWlyZWQpOwogCVJUTVBfU0VUX1BBQ0tFVF9UWFJBVEUocFBhY2tldCwgcEFkLT5Db21tb25DZmcuVHhSYXRlKTsKIAotCS8vCi0JLy8gU1RFUCAzLiBUcmFmZmljIGNsYXNzaWZpY2F0aW9uLiBvdXRjb21lID0gPFVzZXJQcmlvcml0eSwgUXVlSWR4PgotCS8vCisJLyogKi8KKwkvKiBTVEVQIDMuIFRyYWZmaWMgY2xhc3NpZmljYXRpb24uIG91dGNvbWUgPSA8VXNlclByaW9yaXR5LCBRdWVJZHg+ICovCisJLyogKi8KIAlVc2VyUHJpb3JpdHkgPSAwOwotCVF1ZUlkeAkJID0gUUlEX0FDX0JFOwotI2lmZGVmIFJUMjg2MAotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpKQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCisJUXVlSWR4ID0gUUlEX0FDX0JFOwogCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmCi0JCUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKQotI2VuZGlmCi0JewotCQlVU0hPUlQgUHJvdG9jb2w7Ci0JCVVDSEFSICBMbGNTbmFwTGVuID0gMCwgQnl0ZTAsIEJ5dGUxOwotCQlkbwotCQl7Ci0JCQkvLyBnZXQgRXRoZXJuZXQgcHJvdG9jb2wgZmllbGQKLQkJCVByb3RvY29sID0gKFVTSE9SVCkoKHBTcmNCdWZWQVsxMl0gPDwgOCkgKyBwU3JjQnVmVkFbMTNdKTsKLQkJCWlmIChQcm90b2NvbCA8PSAxNTAwKQotCQkJewotCQkJCS8vIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZCBmcm9tIExMQy9TTkFQCi0JCQkJaWYgKFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoUGFja2V0SW5mby5wRmlyc3RCdWZmZXIsIExFTkdUSF84MDJfMyArIDYsICZCeXRlMCwgJkJ5dGUxKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCSAgICBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkgeworCQl1MTYgUHJvdG9jb2w7CisJCXU4IExsY1NuYXBMZW4gPSAwLCBCeXRlMCwgQnl0ZTE7CisJCWRvIHsKKwkJCS8qIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZCAqLworCQkJUHJvdG9jb2wgPQorCQkJICAgICh1MTYpKChwU3JjQnVmVkFbMTJdIDw8IDgpICsgcFNyY0J1ZlZBWzEzXSk7CisJCQlpZiAoUHJvdG9jb2wgPD0gMTUwMCkgeworCQkJCS8qIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZCBmcm9tIExMQy9TTkFQICovCisJCQkJaWYgKFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIKKwkJCQkgICAgKFBhY2tldEluZm8ucEZpcnN0QnVmZmVyLCBMRU5HVEhfODAyXzMgKyA2LAorCQkJCSAgICAgJkJ5dGUwLCAmQnl0ZTEpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCiAJCQkJCWJyZWFrOwogCi0JCQkJUHJvdG9jb2wgPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CisJCQkJUHJvdG9jb2wgPSAodTE2KSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CiAJCQkJTGxjU25hcExlbiA9IDg7CiAJCQl9Ci0KLQkJCS8vIGFsd2F5cyBBQ19CRSBmb3Igbm9uLUlQIHBhY2tldAorCQkJLyogYWx3YXlzIEFDX0JFIGZvciBub24tSVAgcGFja2V0ICovCiAJCQlpZiAoUHJvdG9jb2wgIT0gMHgwODAwKQogCQkJCWJyZWFrOwogCi0JCQkvLyBnZXQgSVAgaGVhZGVyCi0JCQlpZiAoU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihQYWNrZXRJbmZvLnBGaXJzdEJ1ZmZlciwgTEVOR1RIXzgwMl8zICsgTGxjU25hcExlbiwgJkJ5dGUwLCAmQnl0ZTEpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkvKiBnZXQgSVAgaGVhZGVyICovCisJCQlpZiAoU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcgorCQkJICAgIChQYWNrZXRJbmZvLnBGaXJzdEJ1ZmZlciwgTEVOR1RIXzgwMl8zICsgTGxjU25hcExlbiwKKwkJCSAgICAgJkJ5dGUwLCAmQnl0ZTEpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCiAJCQkJYnJlYWs7CiAKLQkJCS8vIHJldHVybiBBQ19CRSBpZiBwYWNrZXQgaXMgbm90IElQdjQKKwkJCS8qIHJldHVybiBBQ19CRSBpZiBwYWNrZXQgaXMgbm90IElQdjQgKi8KIAkJCWlmICgoQnl0ZTAgJiAweGYwKSAhPSAweDQwKQogCQkJCWJyZWFrOwogCkBAIC0xMTAwLDYzICsxMTEzLDU5IEBACiAJCQlVc2VyUHJpb3JpdHkgPSAoQnl0ZTEgJiAweGUwKSA+PiA1OwogCQkJUXVlSWR4ID0gTWFwVXNlclByaW9yaXR5VG9BY2Nlc3NDYXRlZ29yeVtVc2VyUHJpb3JpdHldOwogCi0JCQkvLyBUT0RPOiBoYXZlIHRvIGNoZWNrIEFDTSBiaXQuIGFwcGx5IFRTUEVDIGlmIEFDTSBpcyBPTgotCQkJLy8gVE9ETzogZG93bmdyYWRlIFVQICYgUXVlSWR4IGJlZm9yZSBwYXNzaW5nIEFDTQotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFDTVtRdWVJZHhdKQotCQkJeworCQkJLyogVE9ETzogaGF2ZSB0byBjaGVjayBBQ00gYml0LiBhcHBseSBUU1BFQyBpZiBBQ00gaXMgT04gKi8KKwkJCS8qIFRPRE86IGRvd25ncmFkZSBVUCAmIFF1ZUlkeCBiZWZvcmUgcGFzc2luZyBBQ00gKi8KKwkJCS8qCisJCQkgICBVbmRlciBXTU0gQUNNIGNvbnRyb2wsIHdlIGRvbnQgbmVlZCB0byBjaGVjayB0aGUgYml0OworCQkJICAgT3Igd2hlbiBhIFRTUEVDIGlzIGJ1aWx0IGZvciBWTyBidXQgd2Ugd2lsbCBjaGFuZ2UgdG8gaXNzdWUKKwkJCSAgIEJBIHNlc3Npb24gZm9yIEJFIGhlcmUsIHNvIHdlIHdpbGwgbm90IHVzZSBCQSB0byBzZW5kIFZPIHBhY2tldHMuCisJCQkgKi8KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBQ01bUXVlSWR4XSkgewogCQkJCVVzZXJQcmlvcml0eSA9IDA7Ci0JCQkJUXVlSWR4CQkgPSBRSURfQUNfQkU7CisJCQkJUXVlSWR4ID0gUUlEX0FDX0JFOwogCQkJfQogCQl9IHdoaWxlIChGQUxTRSk7CiAJfQogCiAJUlRNUF9TRVRfUEFDS0VUX1VQKHBQYWNrZXQsIFVzZXJQcmlvcml0eSk7CiAKLQotCi0JLy8gTWFrZSBzdXJlIFNlbmRUeFdhaXQgcXVldWUgcmVzb3VyY2Ugd29uJ3QgYmUgdXNlZCBieSBvdGhlciB0aHJlYWRzCisJLyogTWFrZSBzdXJlIFNlbmRUeFdhaXQgcXVldWUgcmVzb3VyY2Ugd29uJ3QgYmUgdXNlZCBieSBvdGhlciB0aHJlYWRzICovCiAJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCWlmIChwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA+PSBNQVhfUEFDS0VUU19JTl9RVUVVRSkKLQl7CisJaWYgKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyID49IE1BWF9QQUNLRVRTX0lOX1FVRVVFKSB7CiAJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwogCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAKIAkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCWVsc2UKLQl7Ci0JCUluc2VydFRhaWxRdWV1ZSgmcEFkLT5UeFN3UXVldWVbUXVlSWR4XSwgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpKTsKKwl9IGVsc2UgeworCQlJbnNlcnRUYWlsUXVldWVBYyhwQWQsIHBFbnRyeSwgJnBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0sCisJCQkJICBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOwogCX0KIAlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKIAotICAgIGlmICgocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9PSBUUlVFKSYmCi0jaWZkZWYgUlQyODYwCi0gICAgICAgIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSkKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotICAgICAgICBJU19IVF9TVEEocEVudHJ5KSkKLSNlbmRpZgotCXsKLQkJaWYgKCgocEVudHJ5LT5UWEJBYml0bWFwICYgKDE8PFVzZXJQcmlvcml0eSkpID09IDApICYmCi0gICAgICAgICAgICAoKHBFbnRyeS0+QkFEZWNsaW5lQml0bWFwICYgKDE8PFVzZXJQcmlvcml0eSkpID09IDApICYmCi0gICAgICAgICAgICAocEVudHJ5LT5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkKLQkJCSAvLyBGb3IgSU9UIGNvbXBhdGliaWxpdHksIGlmCi0JCQkgLy8gMS4gSXQgaXMgUmFsaW5rIGNoaXAgb3IKLQkJCSAvLyAyLiBJdCBpcyBPUEVOIG9yIEFFUyBtb2RlLAotCQkJIC8vIHRoZW4gQkEgc2Vzc2lvbiBjYW4gYmUgYnVsaXQuCi0JCQkgJiYgKChwRW50cnktPlZhbGlkQXNDTEkgJiYgcEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgIT0gMHgwKSB8fAotCQkJIAkgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCB8fCBwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKLQkJCSkKLQkJewotCQkJQkFPcmlTZXNzaW9uU2V0VXAocEFkLCBwRW50cnksIDAsIDAsIDEwLCBGQUxTRSk7CisJaWYgKChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID09IFRSVUUpICYmCisJICAgIElTX0hUX1NUQShwRW50cnkpKSB7CisJCS8qc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07ICovCisJCWlmICgoKHBFbnRyeS0+VFhCQWJpdG1hcCAmICgxIDw8IFVzZXJQcmlvcml0eSkpID09IDApICYmCisJCSAgICAoKHBFbnRyeS0+QkFEZWNsaW5lQml0bWFwICYgKDEgPDwgVXNlclByaW9yaXR5KSkgPT0gMCkgJiYKKwkJICAgIChwRW50cnktPlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKQorCQkgICAgLyogRm9yIElPVCBjb21wYXRpYmlsaXR5LCBpZiAqLworCQkgICAgLyogMS4gSXQgaXMgUmFsaW5rIGNoaXAgb3IgKi8KKwkJICAgIC8qIDIuIEl0IGlzIE9QRU4gb3IgQUVTIG1vZGUsICovCisJCSAgICAvKiB0aGVuIEJBIHNlc3Npb24gY2FuIGJlIGJ1bGl0LiAqLworCQkgICAgJiYgKChwRW50cnktPlZhbGlkQXNDTEkgJiYgcEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgIT0gMHgwKQorCQkJfHwgKHBFbnRyeS0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBFbmFibGVkCisJCQkgICAgJiYgcEVudHJ5LT5XZXBTdGF0dXMgIT0KKwkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSkKKwkJICAgICkgeworCQkJQkFPcmlTZXNzaW9uU2V0VXAocEFkLCBwRW50cnksIFVzZXJQcmlvcml0eSwgMCwgMTAsCisJCQkJCSAgRkFMU0UpOwogCQl9CiAJfQogCi0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUXVlSWR4XSsrOyAvLyBUT0RPOiBmb3IgZGVidWcgb25seS4gdG8gYmUgcmVtb3ZlZAorCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjT3NUeENvdW50W1F1ZUlkeF0rKzsJLyogVE9ETzogZm9yIGRlYnVnIG9ubHkuIHRvIGJlIHJlbW92ZWQgKi8KIAlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0xMTc5LDEyMyArMTE4OCwxMzIgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KKyNpZmRlZiBSVE1QX01BQ19QQ0kKK2ludCBSVE1QRnJlZVRYRFJlcXVlc3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIHU4IFF1ZUlkeCwKKwkJCSAgICAgICB1OCBOdW1iZXJSZXF1aXJlZCwgdTggKkZyZWVOdW1iZXJJcykKK3sKKwl1bnNpZ25lZCBsb25nIEZyZWVOdW1iZXIgPSAwOworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwogCi0jaWZkZWYgUlQyODcwCisJc3dpdGNoIChRdWVJZHgpIHsKKwljYXNlIFFJRF9BQ19CSzoKKwljYXNlIFFJRF9BQ19CRToKKwljYXNlIFFJRF9BQ19WSToKKwljYXNlIFFJRF9BQ19WTzoKKwkJaWYgKHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhTd0ZyZWVJZHggPgorCQkgICAgcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCkKKwkJCUZyZWVOdW1iZXIgPQorCQkJICAgIHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhTd0ZyZWVJZHggLQorCQkJICAgIHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHggLSAxOworCQllbHNlCisJCQlGcmVlTnVtYmVyID0KKwkJCSAgICBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4U3dGcmVlSWR4ICsgVFhfUklOR19TSVpFIC0KKwkJCSAgICBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4IC0gMTsKKworCQlpZiAoRnJlZU51bWJlciA+PSBOdW1iZXJSZXF1aXJlZCkKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCWJyZWFrOworCisJY2FzZSBRSURfTUdNVDoKKwkJaWYgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPiBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KQorCQkJRnJlZU51bWJlciA9CisJCQkgICAgcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCAtIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHggLQorCQkJICAgIDE7CisJCWVsc2UKKwkJCUZyZWVOdW1iZXIgPQorCQkJICAgIHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggKyBNR01UX1JJTkdfU0laRSAtCisJCQkgICAgcEFkLT5NZ210UmluZy5UeENwdUlkeCAtIDE7CisKKwkJaWYgKEZyZWVOdW1iZXIgPj0gTnVtYmVyUmVxdWlyZWQpCisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiUlRNUEZyZWVUWERSZXF1ZXN0OjpJbnZhbGlkIFF1ZUlkeCg9JWQpXG4iLCBRdWVJZHgpKTsKKwkJYnJlYWs7CisJfQorCSpGcmVlTnVtYmVySXMgPSAodTgpRnJlZU51bWJlcjsKKworCXJldHVybiAoU3RhdHVzKTsKK30KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKIC8qCiAJQWN0dWFsbHksIHRoaXMgZnVuY3Rpb24gdXNlZCB0byBjaGVjayBpZiB0aGUgVHhIYXJkd2FyZSBRdWV1ZSBzdGlsbCBoYXMgZnJhbWUgbmVlZCB0byBzZW5kLgogCUlmIG5vIGZyYW1lIG5lZWQgdG8gc2VuZCwgZ28gdG8gc2xlZXAsIGVsc2UsIHN0aWxsIHdha2UgdXAuCiAqLwotI2VuZGlmCi1ORElTX1NUQVRVUyBSVE1QRnJlZVRYRFJlcXVlc3QoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCQlVQ0hBUgkJCVF1ZUlkeCwKLQlJTgkJVUNIQVIJCQlOdW1iZXJSZXF1aXJlZCwKLQlJTgkJUFVDSEFSCQkJRnJlZU51bWJlcklzKQoraW50IFJUTVBGcmVlVFhEUmVxdWVzdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdTggUXVlSWR4LAorCQkJICAgICAgIHU4IE51bWJlclJlcXVpcmVkLCB1OCAqRnJlZU51bWJlcklzKQogewotI2lmZGVmIFJUMjg2MAotCVVMT05HCQlGcmVlTnVtYmVyID0gMDsKLSNlbmRpZgotCU5ESVNfU1RBVFVTIAlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotI2lmZGVmIFJUMjg3MAotCXVuc2lnbmVkIGxvbmcgICBJcnFGbGFnczsKLQlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7Ci0jZW5kaWYKKwkvKnVuc2lnbmVkIGxvbmcgICAgICAgICBGcmVlTnVtYmVyID0gMDsgKi8KKwlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzOworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CiAKLQlzd2l0Y2ggKFF1ZUlkeCkKLQl7Ci0JCWNhc2UgUUlEX0FDX0JLOgotCQljYXNlIFFJRF9BQ19CRToKLQkJY2FzZSBRSURfQUNfVkk6Ci0JCWNhc2UgUUlEX0FDX1ZPOgotCQljYXNlIFFJRF9IQ0NBOgotI2lmZGVmIFJUMjg2MAotCQkJaWYgKHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhTd0ZyZWVJZHggPiBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4KQotCQkJCUZyZWVOdW1iZXIgPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4U3dGcmVlSWR4IC0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCAtIDE7Ci0JCQllbHNlCi0JCQkJRnJlZU51bWJlciA9IHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhTd0ZyZWVJZHggKyBUWF9SSU5HX1NJWkUgLSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4IC0gMTsKLQotCQkJaWYgKEZyZWVOdW1iZXIgPj0gTnVtYmVyUmVxdWlyZWQpCi0JCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkJewotCQkJCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOwotCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKLQkJCQlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiAhPSBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uKSB8fAotCQkJCQkocEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpKQotCQkJCXsKLQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQkJCQl9Ci0JCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7Ci0JCQl9Ci0jZW5kaWYKLQkJCWJyZWFrOwotCi0JCWNhc2UgUUlEX01HTVQ6Ci0jaWZkZWYgUlQyODYwCi0JCQlpZiAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA+IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgpCi0JCQkJRnJlZU51bWJlciA9IHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggLSBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4IC0gMTsKLQkJCWVsc2UKLQkJCQlGcmVlTnVtYmVyID0gcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCArIE1HTVRfUklOR19TSVpFIC0gcEFkLT5NZ210UmluZy5UeENwdUlkeCAtIDE7Ci0KLQkJCWlmIChGcmVlTnVtYmVyID49IE51bWJlclJlcXVpcmVkKQotCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJCWlmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ICE9IE1HTVRfUklOR19TSVpFKQorCXN3aXRjaCAoUXVlSWR4KSB7CisJY2FzZSBRSURfQUNfQks6CisJY2FzZSBRSURfQUNfQkU6CisJY2FzZSBRSURfQUNfVkk6CisJY2FzZSBRSURfQUNfVk86CisJCXsKKwkJCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwKKwkJCQkgICAgICBJcnFGbGFncyk7CisJCQlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiAhPQorCQkJICAgICBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uKQorCQkJICAgIHx8IChwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkpIHsKIAkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCQkJZWxzZQorCQkJfSBlbHNlIHsKIAkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotI2VuZGlmCi0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJSVE1QRnJlZVRYRFJlcXVlc3Q6OkludmFsaWQgUXVlSWR4KD0lZClcbiIsIFF1ZUlkeCkpOwotCQkJYnJlYWs7CisJCQl9CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sCisJCQkJCUlycUZsYWdzKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFFJRF9NR01UOgorCQlpZiAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCAhPSBNR01UX1JJTkdfU0laRSkKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCWVsc2UKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiUlRNUEZyZWVUWERSZXF1ZXN0OjpJbnZhbGlkIFF1ZUlkeCg9JWQpXG4iLCBRdWVJZHgpKTsKKwkJYnJlYWs7CiAJfQotI2lmZGVmIFJUMjg2MAotCSpGcmVlTnVtYmVySXMgPSAoVUNIQVIpRnJlZU51bWJlcjsKLSNlbmRpZgogCiAJcmV0dXJuIChTdGF0dXMpOwogfQorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCi0KLQotVk9JRCBSVE1QU2VuZERpc2Fzc29jaWF0aW9uRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUTVBTZW5kRGlzYXNzb2NpYXRpb25GcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7CiB9CiAKLVZPSUQJUlRNUFNlbmROdWxsRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlUeFJhdGUsCi0JSU4JQk9PTEVBTiAJCWJRb3NOdWxsKQordm9pZCBSVE1QU2VuZE51bGxGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCBUeFJhdGUsIElOIEJPT0xFQU4gYlFvc051bGwpCiB7Ci0JVUNIQVIJTnVsbEZyYW1lWzQ4XTsKLQlVTE9ORwlMZW5ndGg7Ci0JUEhFQURFUl84MDJfMTEJcEhlYWRlcl84MDJfMTE7CisJdTggTnVsbEZyYW1lWzQ4XTsKKwl1bnNpZ25lZCBsb25nIExlbmd0aDsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZWFkZXJfODAyXzExOwogCi0gICAgLy8gV1BBIDgwMi4xeCBzZWN1cmVkIHBvcnQgY29udHJvbAotICAgIGlmICgoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKLSAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8Ci0gICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKLSAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQotCQkJICB8fCAocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUpCi0gICAgICAgICkgJiYKLSAgICAgICAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKLQl7CisJLyogV1BBIDgwMi4xeCBzZWN1cmVkIHBvcnQgY29udHJvbCAqLworCWlmICgoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKwkgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorCSAgICAgfHwgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKQorCSAgICApICYmIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKSB7CiAJCXJldHVybjsKIAl9CiAKIAlOZGlzWmVyb01lbW9yeShOdWxsRnJhbWUsIDQ4KTsKLQlMZW5ndGggPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisJTGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKTsKIAotCXBIZWFkZXJfODAyXzExID0gKFBIRUFERVJfODAyXzExKSBOdWxsRnJhbWU7CisJcEhlYWRlcl84MDJfMTEgPSAoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKikgTnVsbEZyYW1lOwogCiAJcEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPSBCVFlQRV9EQVRBOwogCXBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9OVUxMX0ZVTkM7CkBAIC0xMzA0LDk3ICsxMzIyLDg0IEBACiAJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOwogCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAKLQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkKLQl7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpIHsKIAkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKwl9IGVsc2UgeworCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9CisJCSAgICAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSA/IDEgOiAwOwogCX0KLQllbHNlCi0JewotCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpID8gMTogMDsKLQl9Ci0JcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gcEFkLT5Db21tb25DZmcuRHNpZnMgKyBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgVHhSYXRlLCAxNCk7CisJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0KKwkgICAgcEFkLT5Db21tb25DZmcuRHNpZnMgKyBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgVHhSYXRlLCAxNCk7CiAKIAlwQWQtPlNlcXVlbmNlKys7CiAJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZTsKIAotCS8vIFByZXBhcmUgUW9zTnVsbCBmdW5jdGlvbiBmcmFtZQotCWlmIChiUW9zTnVsbCkKLQl7CisJLyogUHJlcGFyZSBRb3NOdWxsIGZ1bmN0aW9uIGZyYW1lICovCisJaWYgKGJRb3NOdWxsKSB7CiAJCXBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9RT1NfTlVMTDsKIAotCQkvLyBjb3B5IFFPUyBjb250cm9sIGJ5dGVzCi0JCU51bGxGcmFtZVtMZW5ndGhdCT0gIDA7Ci0JCU51bGxGcmFtZVtMZW5ndGgrMV0gPSAgMDsKLQkJTGVuZ3RoICs9IDI7Ly8gaWYgcGFkIHdpdGggMiBieXRlcyBmb3IgYWxpZ25tZW50LCBBUFNEIHdpbGwgZmFpbAorCQkvKiBjb3B5IFFPUyBjb250cm9sIGJ5dGVzICovCisJCU51bGxGcmFtZVtMZW5ndGhdID0gMDsKKwkJTnVsbEZyYW1lW0xlbmd0aCArIDFdID0gMDsKKwkJTGVuZ3RoICs9IDI7CS8qIGlmIHBhZCB3aXRoIDIgYnl0ZXMgZm9yIGFsaWdubWVudCwgQVBTRCB3aWxsIGZhaWwgKi8KIAl9CiAKIAlIQUxfS2lja091dE51bGxGcmFtZVR4KHBBZCwgMCwgTnVsbEZyYW1lLCBMZW5ndGgpOwogCiB9CiAKLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRAlSVE1QU2VuZFJUU0ZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBEQSwKLQlJTgl1bnNpZ25lZCBpbnQJTmV4dE1wZHVTaXplLAotCUlOCVVDSEFSCQkJVHhSYXRlLAotCUlOCVVDSEFSCQkJUlRTUmF0ZSwKLQlJTglVU0hPUlQJCQlBY2tEdXJhdGlvbiwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglVQ0hBUgkJCUZyYW1lR2FwKQorLyogSVJRTCA9IERJU1BBVENIX0xFVkVMICovCit2b2lkIFJUTVBTZW5kUlRTRnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICB1OCAqcERBLAorCQkgICAgICBJTiB1bnNpZ25lZCBpbnQgTmV4dE1wZHVTaXplLAorCQkgICAgICB1OCBUeFJhdGUsCisJCSAgICAgIHU4IFJUU1JhdGUsCisJCSAgICAgIHUxNiBBY2tEdXJhdGlvbiwgdTggUXVlSWR4LCB1OCBGcmFtZUdhcCkKIHsKIH0KIAotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgRklORCBFTkNSWVBUIEtFWSBBTkQgREVDSURFIENJUEhFUiBBTEdPUklUSE0KLS8vCQlGaW5kIHRoZSBXUEEga2V5LCBlaXRoZXIgR3JvdXAgb3IgUGFpcndpc2UgS2V5Ci0vLwkJTEVBUCArIFRLSVAgYWxzbyB1c2UgV1BBIGtleS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWNpZGUgV0VQIGJpdCBhbmQgY2lwaGVyIHN1aXRlIHRvIGJlIHVzZWQuIFNhbWUgY2lwaGVyIHN1aXRlIHNob3VsZCBiZSB1c2VkIGZvciB3aG9sZSBmcmFnbWVudCBidXJzdAotLy8gSW4gQ2lzY28gQ0NYIDIuMCBMZWFwIEF1dGhlbnRpY2F0aW9uCi0vLwkJICAgV2VwU3RhdHVzIGlzIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQgYnV0IHRoZSBrZXkgd2lsbCB1c2UgUGFpcndpc2VLZXkKLS8vCQkgICBJbnN0ZWFkIG9mIHRoZSBTaGFyZWRLZXksIFNoYXJlZEtleSBMZW5ndGggbWF5IGJlIFplcm8uCi1WT0lEIFNUQUZpbmRDaXBoZXJBbGdvcml0aG0oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaykKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRklORCBFTkNSWVBUIEtFWSBBTkQgREVDSURFIENJUEhFUiBBTEdPUklUSE0gKi8KKy8qICAgICAgICAgICAgICBGaW5kIHRoZSBXUEEga2V5LCBlaXRoZXIgR3JvdXAgb3IgUGFpcndpc2UgS2V5ICovCisvKiAgICAgICAgICAgICAgTEVBUCArIFRLSVAgYWxzbyB1c2UgV1BBIGtleS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBEZWNpZGUgV0VQIGJpdCBhbmQgY2lwaGVyIHN1aXRlIHRvIGJlIHVzZWQuIFNhbWUgY2lwaGVyIHN1aXRlIHNob3VsZCBiZSB1c2VkIGZvciB3aG9sZSBmcmFnbWVudCBidXJzdCAqLworLyogSW4gQ2lzY28gQ0NYIDIuMCBMZWFwIEF1dGhlbnRpY2F0aW9uICovCisvKiAgICAgICAgICAgICAgICAgV2VwU3RhdHVzIGlzIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQgYnV0IHRoZSBrZXkgd2lsbCB1c2UgUGFpcndpc2VLZXkgKi8KKy8qICAgICAgICAgICAgICAgICBJbnN0ZWFkIG9mIHRoZSBTaGFyZWRLZXksIFNoYXJlZEtleSBMZW5ndGggbWF5IGJlIFplcm8uICovCit2b2lkIFNUQUZpbmRDaXBoZXJBbGdvcml0aG0oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspCiB7Ci0JTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJQ2lwaGVyOwkJCQkvLyBUbyBpbmRpY2F0ZSBjaXBoZXIgdXNlZCBmb3IgdGhpcyBwYWNrZXQKLQlVQ0hBUgkJCQkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsJCS8vIGNpcGhlciBhbG9ncml0aG0KLQlVQ0hBUgkJCQkJCQlLZXlJZHggPSAweGZmOwotCVBVQ0hBUgkJCQkJCQlwU3JjQnVmVkE7Ci0JUENJUEhFUl9LRVkJCQkJCQlwS2V5ID0gTlVMTDsKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUyBDaXBoZXI7CS8qIFRvIGluZGljYXRlIGNpcGhlciB1c2VkIGZvciB0aGlzIHBhY2tldCAqLworCXU4IENpcGhlckFsZyA9IENJUEhFUl9OT05FOwkvKiBjaXBoZXIgYWxvZ3JpdGhtICovCisJdTggS2V5SWR4ID0gMHhmZjsKKwl1OCAqcFNyY0J1ZlZBOworCXN0cnVjdCBydF9jaXBoZXJfa2V5ICpwS2V5ID0gTlVMTDsKIAogCXBTcmNCdWZWQSA9IEdFVF9PU19QS1RfREFUQVBUUihwVHhCbGstPnBQYWNrZXQpOwogCiAJewotCSAgICAvLyBTZWxlY3QgQ2lwaGVyCi0JICAgIGlmICgoKnBTcmNCdWZWQSAmIDB4MDEpICYmIChBREhPQ19PTihwQWQpKSkKLQkgICAgICAgIENpcGhlciA9IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyOyAvLyBDaXBoZXIgZm9yIE11bHRpY2FzdCBvciBCcm9hZGNhc3QKLQkgICAgZWxzZQotCSAgICAgICAgQ2lwaGVyID0gcEFkLT5TdGFDZmcuUGFpckNpcGhlcjsgLy8gQ2lwaGVyIGZvciBVbmljYXN0CisJCS8qIFNlbGVjdCBDaXBoZXIgKi8KKwkJaWYgKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKQorCQkJQ2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7CS8qIENpcGhlciBmb3IgTXVsdGljYXN0IG9yIEJyb2FkY2FzdCAqLworCQllbHNlCisJCQlDaXBoZXIgPSBwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyOwkvKiBDaXBoZXIgZm9yIFVuaWNhc3QgKi8KIAotCQlpZiAoUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBUeEJsay0+cFBhY2tldCkpCi0JCXsKLQkJCUFTU0VSVChwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPD0gQ0lQSEVSX0NLSVAxMjgpOworCQlpZiAoUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBUeEJsay0+cFBhY2tldCkpIHsKKwkJCUFTU0VSVChwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPD0KKwkJCSAgICAgICBDSVBIRVJfQ0tJUDEyOCk7CiAKLQkJCS8vIDQtd2F5IGhhbmRzaGFraW5nIGZyYW1lIG11c3QgYmUgY2xlYXIKLQkJCWlmICghKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpKSAmJiAocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnKSAmJgotCQkJCShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4pKQotCQkJeworCQkJLyogNC13YXkgaGFuZHNoYWtpbmcgZnJhbWUgbXVzdCBiZSBjbGVhciAqLworCQkJaWYgKCEoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQ2xlYXJFQVBGcmFtZSkpCisJCQkgICAgJiYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZykKKwkJCSAgICAmJiAocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuKSkgewogCQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKIAkJCQlLZXlJZHggPSAwOwogCQkJfQotCQl9Ci0JCWVsc2UgaWYgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKQotCQl7Ci0JCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOwotCQl9Ci0JCWVsc2UgaWYgKChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKLQkJCQkgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKLQkJewotCQkJaWYgKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKSAvLyBtdWx0aWNhc3QKKwkJfSBlbHNlIGlmIChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkgeworCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCQl9IGVsc2UgaWYgKChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKKwkJCSAgIChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpIHsKKwkJCWlmICgoKnBTcmNCdWZWQSAmIDB4MDEpICYmIChBREhPQ19PTihwQWQpKSkJLyogbXVsdGljYXN0ICovCiAJCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOwogCQkJZWxzZSBpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuKQogCQkJCUtleUlkeCA9IDA7CkBAIC0xNDA0LDE2ICsxNDA5LDE3IEBACiAKIAkJaWYgKEtleUlkeCA9PSAweGZmKQogCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCWVsc2UgaWYgKChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkgfHwgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID09IDApKQorCQllbHNlIGlmICgoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCisJCQkgfHwgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID09IDApKQogCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JICAgIGVsc2UgaWYgKCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgJiYKLQkgICAgICAgICAgICAgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSAmJgotCSAgICAgICAgICAgICAocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUpICYmCi0JICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQotCSAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCWVsc2UKLQkJewotCQkJLy9IZWFkZXJfODAyXzExLkZDLldlcCA9IDE7CisJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAmJgorCQkJIChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkgJiYKKwkJCSAocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUpICYmCisJCQkgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09CisJCQkgIFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisJCQlDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJZWxzZSB7CisJCQkvKkhlYWRlcl84MDJfMTEuRkMuV2VwID0gMTsgKi8KIAkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnOwogCQkJcEtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdOwogCQl9CkBAIC0xNDIzLDQ3ICsxNDI5LDQ3IEBACiAJcFR4QmxrLT5wS2V5ID0gcEtleTsKIH0KIAotCi1WT0lEIFNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBUWF9CTEsgICAgICAgICAgKnBUeEJsaykKK3ZvaWQgU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspCiB7Ci0JSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKnBIZWFkZXJfODAyXzExOwogCi0JLy8KLQkvLyBNQUtFIEEgQ09NTU9OIDgwMi4xMSBIRUFERVIKLQkvLworCS8qICovCisJLyogTUFLRSBBIENPTU1PTiA4MDIuMTEgSEVBREVSICovCisJLyogKi8KIAotCS8vIG5vcm1hbCB3bGFuIGhlYWRlciBzaXplIDogMjQgb2N0ZXRzCi0JcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCS8qIG5vcm1hbCB3bGFuIGhlYWRlciBzaXplIDogMjQgb2N0ZXRzICovCisJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKTsKIAotCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKKwlwSGVhZGVyXzgwMl8xMSA9CisJICAgIChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSAmIHBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKIAotCU5kaXNaZXJvTWVtb3J5KHBIZWFkZXJfODAyXzExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCU5kaXNaZXJvTWVtb3J5KHBIZWFkZXJfODAyXzExLCBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpKTsKIAogCXBIZWFkZXJfODAyXzExLT5GQy5GckRzID0gMDsKIAlwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7Ci0JcEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPSAoKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpID8gU1VCVFlQRV9RREFUQSA6IFNVQlRZUEVfREFUQSk7CisJcEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPQorCSAgICAoKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpID8gU1VCVFlQRV9RREFUQSA6CisJICAgICBTVUJUWVBFX0RBVEEpOwogCi0gICAgaWYgKHBUeEJsay0+cE1hY0VudHJ5KQotCXsKLQkJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTm9uUW9TKSkKLQkJewotCQkJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcFR4QmxrLT5wTWFjRW50cnktPk5vblFvc0RhdGFTZXE7Ci0JCQlwVHhCbGstPnBNYWNFbnRyeS0+Tm9uUW9zRGF0YVNlcSA9IChwVHhCbGstPnBNYWNFbnRyeS0+Tm9uUW9zRGF0YVNlcSsxKSAmIE1BWFNFUTsKLQkJfQotCQllbHNlCi0JCXsKKwlpZiAocFR4QmxrLT5wTWFjRW50cnkpIHsKKwkJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTm9uUW9TKSkgeworCQkJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0KKwkJCSAgICBwVHhCbGstPnBNYWNFbnRyeS0+Tm9uUW9zRGF0YVNlcTsKKwkJCXBUeEJsay0+cE1hY0VudHJ5LT5Ob25Rb3NEYXRhU2VxID0KKwkJCSAgICAocFR4QmxrLT5wTWFjRW50cnktPk5vblFvc0RhdGFTZXEgKyAxKSAmIE1BWFNFUTsKKwkJfSBlbHNlIHsKIAkJCXsKLSAgICAJICAgIHBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV07Ci0gICAgCSAgICBwVHhCbGstPnBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldID0gKHBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0rMSkgJiBNQVhTRVE7Ci0gICAgCX0KLQl9Ci0JfQotCWVsc2UKLQl7CisJCQkJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0KKwkJCQkgICAgcFR4QmxrLT5wTWFjRW50cnktPlR4U2VxW3BUeEJsay0+CisJCQkJCQkJICAgICBVc2VyUHJpb3JpdHldOworCQkJCXBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0gPQorCQkJCSAgICAocFR4QmxrLT5wTWFjRW50cnktPgorCQkJCSAgICAgVHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldICsgMSkgJiBNQVhTRVE7CisJCQl9CisJCX0KKwl9IGVsc2UgewogCQlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlNlcXVlbmNlOwotCQlwQWQtPlNlcXVlbmNlID0gKHBBZC0+U2VxdWVuY2UrMSkgJiBNQVhTRVE7IC8vIG5leHQgc2VxdWVuY2UKKwkJcEFkLT5TZXF1ZW5jZSA9IChwQWQtPlNlcXVlbmNlICsgMSkgJiBNQVhTRVE7CS8qIG5leHQgc2VxdWVuY2UgKi8KIAl9CiAKIAlwSGVhZGVyXzgwMl8xMS0+RnJhZyA9IDA7CkBAIC0xNDcxLDIwICsxNDc3LDIzIEBACiAJcEhlYWRlcl84MDJfMTEtPkZDLk1vcmVEYXRhID0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iTW9yZURhdGEpOwogCiAJewotCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJeworCQlpZiAoSU5GUkFfT04ocEFkKSkgewogCQkJewotCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOwotCQkJcEhlYWRlcl84MDJfMTEtPkZDLlRvRHMgPSAxOwotCQl9Ci0JCX0KLQkJZWxzZSBpZiAoQURIT0NfT04ocEFkKSkKLQkJewotCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjEsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7Ci0JCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0JCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIxLAorCQkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsCisJCQkJCSAgICAgIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLAorCQkJCQkgICAgICBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCQkJCXBIZWFkZXJfODAyXzExLT5GQy5Ub0RzID0gMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChBREhPQ19PTihwQWQpKSB7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwKKwkJCQkgICAgICBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsCisJCQkJICAgICAgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMywKKwkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAJCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDA7CiAJCX0KIAl9CkBAIC0xNDkyLDEwNyArMTUwMSwxMDcgQEAKIAlpZiAocFR4QmxrLT5DaXBoZXJBbGcgIT0gQ0lQSEVSX05PTkUpCiAJCXBIZWFkZXJfODAyXzExLT5GQy5XZXAgPSAxOwogCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLgotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLiAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpCi0gICAgCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CiAJZWxzZQotICAgIAlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOwogfQogCi1WT0lEIFNUQUJ1aWxkQ2FjaGU4MDJfMTFIZWFkZXIoCi0JSU4gUlRNUF9BREFQVEVSCQkqcEFkLAotCUlOIFRYX0JMSwkJCSpwVHhCbGssCi0JSU4gVUNIQVIJCQkqcEhlYWRlcikKK3ZvaWQgU1RBQnVpbGRDYWNoZTgwMl8xMUhlYWRlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLCB1OCAqIHBIZWFkZXIpCiB7Ci0JTUFDX1RBQkxFX0VOVFJZCSpwTWFjRW50cnk7Ci0JUEhFQURFUl84MDJfMTEJcEhlYWRlcjgwMjExOworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBNYWNFbnRyeTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZWFkZXI4MDIxMTsKIAotCXBIZWFkZXI4MDIxMSA9IChQSEVBREVSXzgwMl8xMSlwSGVhZGVyOworCXBIZWFkZXI4MDIxMSA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSBwSGVhZGVyOwogCXBNYWNFbnRyeSA9IHBUeEJsay0+cE1hY0VudHJ5OwogCi0JLy8KLQkvLyBVcGRhdGUgdGhlIGNhY2hlZCA4MDIuMTEgSEVBREVSCi0JLy8KKwkvKiAqLworCS8qIFVwZGF0ZSB0aGUgY2FjaGVkIDgwMi4xMSBIRUFERVIgKi8KKwkvKiAqLwogCi0JLy8gbm9ybWFsIHdsYW4gaGVhZGVyIHNpemUgOiAyNCBvY3RldHMKLQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisJLyogbm9ybWFsIHdsYW4gaGVhZGVyIHNpemUgOiAyNCBvY3RldHMgKi8KKwlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpOwogCi0JLy8gTW9yZSBCaXQKKwkvKiBNb3JlIEJpdCAqLwogCXBIZWFkZXI4MDIxMS0+RkMuTW9yZURhdGEgPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7CiAKLQkvLyBTZXF1ZW5jZQorCS8qIFNlcXVlbmNlICovCiAJcEhlYWRlcjgwMjExLT5TZXF1ZW5jZSA9IHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOwotICAgIHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldID0gKHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldKzEpICYgTUFYU0VROworCXBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldID0KKwkgICAgKHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldICsgMSkgJiBNQVhTRVE7CiAKIAl7Ci0JCS8vIFRoZSBhZGRyMyBvZiBub3JtYWwgcGFja2V0IHNlbmQgZnJvbSBEUyBpcyBEZXN0IE1hYyBhZGRyZXNzLgorCQkvKiBDaGVjayBpZiB0aGUgZnJhbWUgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMgZGlyZWN0IGxpbmsgaW50ZXJmYWNlICovCisJCS8qIElmIHBhY2tldCBjYW4gYmUgc2VudCB0aHJvdWdoIERMUywgdGhlbiBmb3JjZSBhZ2dyZWdhdGlvbiBkaXNhYmxlLiAoSGFyZCB0byBkZXRlcm1pbmUgcGVlciBTVEEncyBjYXBhYmlsaXR5KSAqLworCisJCS8qIFRoZSBhZGRyMyBvZiBub3JtYWwgcGFja2V0IHNlbmQgZnJvbSBEUyBpcyBEZXN0IE1hYyBhZGRyZXNzLiAqLwogCQlpZiAoQURIT0NfT04ocEFkKSkKLQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcjgwMjExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyODAyMTEtPkFkZHIzLAorCQkJCSAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAkJZWxzZQotCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyODAyMTEtPkFkZHIzLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyODAyMTEtPkFkZHIzLAorCQkJCSAgICAgIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CiAJfQogCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLgotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLiAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpCi0gICAgCXBIZWFkZXI4MDIxMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCQlwSGVhZGVyODAyMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKIAllbHNlCi0gICAgCXBIZWFkZXI4MDIxMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworCQlwSGVhZGVyODAyMTEtPkZDLlB3ck1nbXQgPSAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKTsKIH0KIAotc3RhdGljIGlubGluZSBQVUNIQVIgU1RBX0J1aWxkX0FSYWxpbmtfRnJhbWVfSGVhZGVyKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFRYX0JMSwkJKnBUeEJsaykKK3N0YXRpYyBpbmxpbmUgdTggKlNUQV9CdWlsZF9BUmFsaW5rX0ZyYW1lX0hlYWRlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCQkgICAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrKQogewotCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ci0JSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7Ci0JUE5ESVNfUEFDS0VUCXBOZXh0UGFja2V0OwotCVVJTlQzMgkJCW5leHRCdWZMZW47Ci0JUFFVRVVFX0VOVFJZCXBRRW50cnk7CisJdTggKnBIZWFkZXJCdWZQdHI7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKnBIZWFkZXJfODAyXzExOworCXZvaWQgKnBOZXh0UGFja2V0OworCXUzMiBuZXh0QnVmTGVuOworCXN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqcFFFbnRyeTsKIAogCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOwogCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKIAotCiAJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07Ci0JcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJfODAyXzExID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CiAKLQkvLyBzdGVhbCAib3JkZXIiIGJpdCB0byBtYXJrICJhZ2dyZWdhdGlvbiIKKwkvKiBzdGVhbCAib3JkZXIiIGJpdCB0byBtYXJrICJhZ2dyZWdhdGlvbiIgKi8KIAlwSGVhZGVyXzgwMl8xMS0+RkMuT3JkZXIgPSAxOwogCi0JLy8gc2tpcCBjb21tb24gaGVhZGVyCisJLyogc2tpcCBjb21tb24gaGVhZGVyICovCiAJcEhlYWRlckJ1ZlB0ciArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CiAKLQlpZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iV01NKSkKLQl7Ci0JCS8vCi0JCS8vIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzCi0JCS8vCisJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpIHsKKwkJLyogKi8KKwkJLyogYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMgKi8KKwkJLyogKi8KIAkJKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKIAotCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOwotCQlwSGVhZGVyQnVmUHRyICs9MjsKKwkJKihwSGVhZGVyQnVmUHRyICsgMSkgPSAwOworCQlwSGVhZGVyQnVmUHRyICs9IDI7CiAJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOwogCX0KKwkvKiBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIuIExMQyBoZWFkZXIgc2hvdWxkIGF0IDQtYnl0ZXMgYWxpZ21lbnQuICovCisJcFR4QmxrLT5IZHJQYWRMZW4gPSAodW5zaWduZWQgbG9uZylwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJCdWZQdHIgPSAodTggKilST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwlwVHhCbGstPkhkclBhZExlbiA9ICh1bnNpZ25lZCBsb25nKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOwogCi0JLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyLiBMTEMgaGVhZGVyIHNob3VsZCBhdCA0LWJ5dGVzIGFsaWdtZW50LgotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7Ci0JcEhlYWRlckJ1ZlB0ciA9IChQQ0hBUilST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKLQlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKLQotCS8vIEZvciBSQSBBZ2dyZWdhdGlvbiwKLQkvLyBwdXQgdGhlIDJuZCBNU0RVIGxlbmd0aChleHRyYSAyLWJ5dGUgZmllbGQpIGFmdGVyIFFPU19DT05UUk9MIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0CisJLyogRm9yIFJBIEFnZ3JlZ2F0aW9uLCAqLworCS8qIHB1dCB0aGUgMm5kIE1TRFUgbGVuZ3RoKGV4dHJhIDItYnl0ZSBmaWVsZCkgYWZ0ZXIgc3RydWN0IHJ0X3Fvc19jb250cm9sIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0ICovCiAJcFFFbnRyeSA9IHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQ7Ci0JcE5leHRQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QS1QocFFFbnRyeSk7CisJcE5leHRQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7CiAJbmV4dEJ1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBOZXh0UGFja2V0KTsKIAlpZiAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocE5leHRQYWNrZXQpKQogCQluZXh0QnVmTGVuIC09IExFTkdUSF84MDJfMVE7CiAKLQkqcEhlYWRlckJ1ZlB0ciA9IChVQ0hBUiluZXh0QnVmTGVuICYgMHhmZjsKLQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAoVUNIQVIpKG5leHRCdWZMZW4gPj4gOCk7CisJKnBIZWFkZXJCdWZQdHIgPSAodTgpbmV4dEJ1ZkxlbiAmIDB4ZmY7CisJKihwSGVhZGVyQnVmUHRyICsgMSkgPSAodTgpKG5leHRCdWZMZW4gPj4gOCk7CiAKIAlwSGVhZGVyQnVmUHRyICs9IDI7CiAJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CkBAIC0xNjAxLDE5OCArMTYxMCwyMDcgQEAKIAogfQogCi1zdGF0aWMgaW5saW5lIFBVQ0hBUiBTVEFfQnVpbGRfQU1TRFVfRnJhbWVfSGVhZGVyKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFRYX0JMSwkJKnBUeEJsaykKK3N0YXRpYyBpbmxpbmUgdTggKlNUQV9CdWlsZF9BTVNEVV9GcmFtZV9IZWFkZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkJICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspCiB7Ci0JUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsvLywgcFNhdmVCdWZQdHI7Ci0JSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7Ci0KKwl1OCAqcEhlYWRlckJ1ZlB0cjsJLyosIHBTYXZlQnVmUHRyOyAqLworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICpwSGVhZGVyXzgwMl8xMTsKIAogCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOwogCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKIAogCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOwotCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKKwlwSGVhZGVyXzgwMl8xMSA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOwogCi0JLy8gc2tpcCBjb21tb24gaGVhZGVyCisJLyogc2tpcCBjb21tb24gaGVhZGVyICovCiAJcEhlYWRlckJ1ZlB0ciArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CiAKLQkvLwotCS8vIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzCi0JLy8KKwkvKiAqLworCS8qIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzICovCisJLyogKi8KIAkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOwogCi0JLy8KLQkvLyBBLU1TRFUgcGFja2V0Ci0JLy8KKwkvKiAqLworCS8qIEEtTVNEVSBwYWNrZXQgKi8KKwkvKiAqLwogCSpwSGVhZGVyQnVmUHRyIHw9IDB4ODA7CiAKLQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOwotCXBIZWFkZXJCdWZQdHIgKz0yOworCSoocEhlYWRlckJ1ZlB0ciArIDEpID0gMDsKKwlwSGVhZGVyQnVmUHRyICs9IDI7CiAJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CiAKLQkvL3BTYXZlQnVmUHRyID0gcEhlYWRlckJ1ZlB0cjsKKwkvKnBTYXZlQnVmUHRyID0gcEhlYWRlckJ1ZlB0cjsgKi8KIAotCS8vCi0JLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyCi0JLy8gTExDIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50Ci0JLy8KLQkvLyBAQEAgTXBkdUhlYWRlckxlbiBleGNsdWRpbmcgcGFkZGluZyBAQEAKLQkvLwotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7Ci0JcEhlYWRlckJ1ZlB0ciA9IChQQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7Ci0JcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CisJLyogKi8KKwkvKiBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIgKi8KKwkvKiBMTEMgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQgKi8KKwkvKiAqLworCS8qIEBAQCBNcGR1SGVhZGVyTGVuIGV4Y2x1ZGluZyBwYWRkaW5nIEBAQCAqLworCS8qICovCisJcFR4QmxrLT5IZHJQYWRMZW4gPSAodW5zaWduZWQgbG9uZylwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJCdWZQdHIgPSAodTggKilST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwlwVHhCbGstPkhkclBhZExlbiA9ICh1bnNpZ25lZCBsb25nKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOwogCiAJcmV0dXJuIHBIZWFkZXJCdWZQdHI7CiAKIH0KIAotCi1WT0lEIFNUQV9BTVBEVV9GcmFtZV9UeCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrKQordm9pZCBTVEFfQU1QRFVfRnJhbWVfVHgoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspCiB7Ci0JSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7Ci0JUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKLQlVU0hPUlQJCQlGcmVlTnVtYmVyOwotCU1BQ19UQUJMRV9FTlRSWQkqcE1hY0VudHJ5OwotCUJPT0xFQU4JCQliVkxBTlBrdDsKLQlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqcEhlYWRlcl84MDJfMTE7CisJdTggKnBIZWFkZXJCdWZQdHI7CisJdTE2IEZyZWVOdW1iZXI7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5OworCUJPT0xFQU4gYlZMQU5Qa3Q7CisJc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICpwUUVudHJ5OwogCiAJQVNTRVJUKHBUeEJsayk7CiAKLQl3aGlsZShwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkKQotCXsKKwl3aGlsZSAocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkgewogCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CiAJCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKLQkJaWYgKCBSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCi0JCXsKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKSB7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LAorCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOworCQliVkxBTlBrdCA9CisJCSAgICAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CiAKIAkJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7Ci0JCWlmIChwTWFjRW50cnktPmlzQ2FjaGVkKQotCQl7Ci0JCQkvLyBOT1RFOiBQbGVhc2UgbWFrZSBzdXJlIHRoZSBzaXplIG9mIHBNYWNFbnRyeS0+Q2FjaGVkQnVmW10gaXMgc21hbGxlciB0aGFuIHBUeEJsay0+SGVhZGVyQnVmW10hISEhCi0JCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0sIChQVUNIQVIpJnBNYWNFbnRyeS0+Q2FjaGVkQnVmWzBdLCBUWFdJX1NJWkUgKyBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCQkJcEhlYWRlckJ1ZlB0ciA9IChQVUNIQVIpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV0pOworCQlpZiAocE1hY0VudHJ5LT5pc0NhY2hlZCkgeworCQkJLyogTk9URTogUGxlYXNlIG1ha2Ugc3VyZSB0aGUgc2l6ZSBvZiBwTWFjRW50cnktPkNhY2hlZEJ1ZltdIGlzIHNtYWxsZXIgdGhhbiBwVHhCbGstPkhlYWRlckJ1ZltdISAqLworCQkJTmRpc01vdmVNZW1vcnkoKHU4ICopJiBwVHhCbGstPgorCQkJCSAgICAgICBIZWFkZXJCdWZbVFhJTkZPX1NJWkVdLAorCQkJCSAgICAgICAodTggKikmIHBNYWNFbnRyeS0+Q2FjaGVkQnVmWzBdLAorCQkJCSAgICAgICBUWFdJX1NJWkUgKyBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpKTsKKwkJCXBIZWFkZXJCdWZQdHIgPQorCQkJICAgICh1OCAqKSgmcFR4QmxrLT4KKwkJCQkgICAgICBIZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdKTsKIAkJCVNUQUJ1aWxkQ2FjaGU4MDJfMTFIZWFkZXIocEFkLCBwVHhCbGssIHBIZWFkZXJCdWZQdHIpOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7CiAJCQlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7CiAKLQkJCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOworCQkJcEhlYWRlckJ1ZlB0ciA9CisJCQkgICAgJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKIAkJfQogCisJCXBIZWFkZXJfODAyXzExID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CiAKLQkJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOwotCi0JCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCQkvKiBza2lwIGNvbW1vbiBoZWFkZXIgKi8KIAkJcEhlYWRlckJ1ZlB0ciArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CiAKLQkJLy8KLQkJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKLQkJLy8KKwkJLyogKi8KKwkJLyogYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMgKi8KKwkJLyogKi8KIAkJKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKLQkJKihwSGVhZGVyQnVmUHRyKzEpID0gMDsKLQkJcEhlYWRlckJ1ZlB0ciArPTI7CisJCSoocEhlYWRlckJ1ZlB0ciArIDEpID0gMDsKKwkJcEhlYWRlckJ1ZlB0ciArPSAyOwogCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKIAotCQkvLwotCQkvLyBidWlsZCBIVEMrCi0JCS8vIEhUQyBjb250cm9sIGZpbGVkIGZvbGxvd2luZyBRb1MgZmllbGQKLQkJLy8KLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUmRnID09IFRSVUUpICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBUeEJsay0+cE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSkpCi0JCXsKLQkJCWlmIChwTWFjRW50cnktPmlzQ2FjaGVkID09IEZBTFNFKQotCQkJewotCQkJCS8vIG1hcmsgSFRDIGJpdAorCQkvKiAqLworCQkvKiBidWlsZCBIVEMrICovCisJCS8qIEhUQyBjb250cm9sIGZpbGVkIGZvbGxvd2luZyBRb1MgZmllbGQgKi8KKwkJLyogKi8KKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUmRnID09IFRSVUUpCisJCSAgICAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwVHhCbGstPnBNYWNFbnRyeSwKKwkJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKSkgeworCQkJaWYgKHBNYWNFbnRyeS0+aXNDYWNoZWQgPT0gRkFMU0UpIHsKKwkJCQkvKiBtYXJrIEhUQyBiaXQgKi8KIAkJCQlwSGVhZGVyXzgwMl8xMS0+RkMuT3JkZXIgPSAxOwogCiAJCQkJTmRpc1plcm9NZW1vcnkocEhlYWRlckJ1ZlB0ciwgNCk7Ci0JCQkJKihwSGVhZGVyQnVmUHRyKzMpIHw9IDB4ODA7CisJCQkJKihwSGVhZGVyQnVmUHRyICsgMykgfD0gMHg4MDsKIAkJCX0KIAkJCXBIZWFkZXJCdWZQdHIgKz0gNDsKIAkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSA0OwogCQl9Ci0KLQkJLy9wVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZWFkZXJCdWYgLSBUWFdJX1NJWkUgLSBUWElORk9fU0laRTsKKwkJLypwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZWFkZXJCdWYgLSBUWFdJX1NJWkUgLSBUWElORk9fU0laRTsgKi8KIAkJQVNTRVJUKHBUeEJsay0+TXBkdUhlYWRlckxlbiA+PSAyNCk7CiAKLQkJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwkJLyogc2tpcCA4MDIuMyBoZWFkZXIgKi8KIAkJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKLQkJcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKKwkJcFR4QmxrLT5TcmNCdWZMZW4gLT0gTEVOR1RIXzgwMl8zOwogCi0JCS8vIHNraXAgdmxhbiB0YWcKLQkJaWYgKGJWTEFOUGt0KQotCQl7Ci0JCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7Ci0JCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROworCQkvKiBza2lwIHZsYW4gdGFnICovCisJCWlmIChiVkxBTlBrdCkgeworCQkJcFR4QmxrLT5wU3JjQnVmRGF0YSArPSBMRU5HVEhfODAyXzFROworCQkJcFR4QmxrLT5TcmNCdWZMZW4gLT0gTEVOR1RIXzgwMl8xUTsKIAkJfQotCi0JCS8vCi0JCS8vIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlcgotCQkvLyBMTEMgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQKLQkJLy8KLQkJLy8gQEBAIE1wZHVIZWFkZXJMZW4gZXhjbHVkaW5nIHBhZGRpbmcgQEBACi0JCS8vCi0JCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7Ci0JCXBIZWFkZXJCdWZQdHIgPSAoUENIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOwotCQlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKKwkJLyogKi8KKwkJLyogcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyICovCisJCS8qIExMQyBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudCAqLworCQkvKiAqLworCQkvKiBAQEAgTXBkdUhlYWRlckxlbiBleGNsdWRpbmcgcGFkZGluZyBAQEAgKi8KKwkJLyogKi8KKwkJcFR4QmxrLT5IZHJQYWRMZW4gPSAodW5zaWduZWQgbG9uZylwSGVhZGVyQnVmUHRyOworCQlwSGVhZGVyQnVmUHRyID0gKHU4ICopUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7CisJCXBUeEJsay0+SGRyUGFkTGVuID0gKHVuc2lnbmVkIGxvbmcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CiAKIAkJewogCi0JCQkvLwotCQkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cwotCQkJLy8KLQkJCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOwotCQkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQotCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCS8qICovCisJCQkvKiBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzICovCisJCQkvKiAqLworCQkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQocFR4QmxrLT4KKwkJCQkJCQkgICAgcFNyY0J1ZkRhdGEgLSAyLAorCQkJCQkJCSAgICBwVHhCbGstPgorCQkJCQkJCSAgICBwRXh0cmFMbGNTbmFwRW5jYXApOworCQkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKSB7CisJCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwKKwkJCQkJICAgICAgIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKIAkJCQlwSGVhZGVyQnVmUHRyICs9IDY7Ci0JCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCi0JCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKKwkJCQkvKiBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikgKi8KKwkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLAorCQkJCQkgICAgICAgcFR4QmxrLT5wU3JjQnVmRGF0YSAtIDIsIDIpOwogCQkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKIAkJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7CiAJCQl9CiAKIAkJfQogCi0JCWlmIChwTWFjRW50cnktPmlzQ2FjaGVkKQotCQl7Ci0gICAgICAgICAgICBSVE1QV3JpdGVUeFdJX0NhY2hlKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisJCWlmIChwTWFjRW50cnktPmlzQ2FjaGVkKSB7CisJCQlSVE1QV3JpdGVUeFdJX0NhY2hlKHBBZCwKKwkJCQkJICAgIChzdHJ1Y3QgcnRfdHh3aSAqKSAoJnBUeEJsay0+CisJCQkJCQkJICAgSGVhZGVyQnVmCisJCQkJCQkJICAgW1RYSU5GT19TSVpFXSksCisJCQkJCSAgICBwVHhCbGspOworCQl9IGVsc2UgeworCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwKKwkJCQkJICAgKHN0cnVjdCBydF90eHdpICopICgmcFR4QmxrLT4KKwkJCQkJCQkgIEhlYWRlckJ1ZgorCQkJCQkJCSAgW1RYSU5GT19TSVpFXSksCisJCQkJCSAgIHBUeEJsayk7CiAKLQkJCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpKCZwTWFjRW50cnktPkNhY2hlZEJ1ZlswXSksIHNpemVvZihwTWFjRW50cnktPkNhY2hlZEJ1ZikpOwotCQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikoJnBNYWNFbnRyeS0+Q2FjaGVkQnVmWzBdKSwgKFBVQ0hBUikoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIChwSGVhZGVyQnVmUHRyIC0gKFBVQ0hBUikoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSkpKTsKKwkJCU5kaXNaZXJvTWVtb3J5KCh1OCAqKSgmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0pLAorCQkJCSAgICAgICBzaXplb2YocE1hY0VudHJ5LT5DYWNoZWRCdWYpKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCh1OCAqKSgmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0pLAorCQkJCSAgICAgICAodTggKikoJnBUeEJsay0+CisJCQkJCQkgSGVhZGVyQnVmW1RYSU5GT19TSVpFXSksCisJCQkJICAgICAgIChwSGVhZGVyQnVmUHRyIC0KKwkJCQkJKHU4ICopKCZwVHhCbGstPgorCQkJCQkJICBIZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSkpOwogCQkJcE1hY0VudHJ5LT5pc0NhY2hlZCA9IFRSVUU7CiAJCX0KIAotCQkvLyBjYWxjdWxhdGUgVHJhbnNtaXR0ZWQgQU1QRFUgY291bnQgYW5kIEJ5dGVDb3VudAorCQkvKiBjYWxjdWxhdGUgVHJhbnNtaXR0ZWQgQU1QRFUgY291bnQgYW5kIEJ5dGVDb3VudCAqLwogCQl7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkTVBEVXNJbkFNUERVQ291bnQudS5Mb3dQYXJ0ICsrOwotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZE9jdGV0c0luQU1QRFVDb3VudC5RdWFkUGFydCArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRNUERVc0luQU1QRFVDb3VudC51LgorCQkJICAgIExvd1BhcnQrKzsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRPY3RldHNJbkFNUERVQ291bnQuCisJCQkgICAgUXVhZFBhcnQgKz0gcFR4QmxrLT5TcmNCdWZMZW47CiAJCX0KIAotCQkvL0ZyZWVOdW1iZXIgPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7CisJCS8qRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsgKi8KIAogCQlIQUxfV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBUUlVFLCAmRnJlZU51bWJlcik7CiAKLQkJLy8KLQkJLy8gS2ljayBvdXQgVHgKLQkJLy8KLSNpZmRlZiBSVDI4NjAKKwkJLyogKi8KKwkJLyogS2ljayBvdXQgVHggKi8KKwkJLyogKi8KIAkJaWYgKCFSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCkpCi0jZW5kaWYKIAkJCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKIAogCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CkBAIC0xODAxLDExOCArMTgxOSwxMjQgQEAKIAogfQogCi0KLVZPSUQgU1RBX0FNU0RVX0ZyYW1lX1R4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGspCit2b2lkIFNUQV9BTVNEVV9GcmFtZV9UeChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaykKIHsKLQlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOwotCVVTSE9SVAkJCUZyZWVOdW1iZXI7Ci0JVVNIT1JUCQkJc3ViRnJhbWVQYXlsb2FkTGVuID0gMDsJLy8gQU1TRFUgU3ViZnJhbWUgbGVuZ3RoIHdpdGhvdXQgQU1TRFUtSGVhZGVyIC8gUGFkZGluZy4KLQlVU0hPUlQJCQl0b3RhbE1QRFVTaXplPTA7Ci0JVUNIQVIJCQkqc3ViRnJhbWVIZWFkZXI7Ci0JVUNIQVIJCQlwYWRkaW5nID0gMDsKLQlVU0hPUlQJCQlGaXJzdFR4ID0gMCwgTGFzdFR4SWR4ID0gMDsKLQlCT09MRUFOCQkJYlZMQU5Qa3Q7Ci0JaW50IAkJCWZyYW1lTnVtID0gMDsKLQlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKLQorCXU4ICpwSGVhZGVyQnVmUHRyOworCXUxNiBGcmVlTnVtYmVyOworCXUxNiBzdWJGcmFtZVBheWxvYWRMZW4gPSAwOwkvKiBBTVNEVSBTdWJmcmFtZSBsZW5ndGggd2l0aG91dCBBTVNEVS1IZWFkZXIgLyBQYWRkaW5nLiAqLworCXUxNiB0b3RhbE1QRFVTaXplID0gMDsKKwl1OCAqc3ViRnJhbWVIZWFkZXI7CisJdTggcGFkZGluZyA9IDA7CisJdTE2IEZpcnN0VHggPSAwLCBMYXN0VHhJZHggPSAwOworCUJPT0xFQU4gYlZMQU5Qa3Q7CisJaW50IGZyYW1lTnVtID0gMDsKKwlzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKnBRRW50cnk7CiAKIAlBU1NFUlQocFR4QmxrKTsKIAogCUFTU0VSVCgocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyID4gMSkpOwogCi0Jd2hpbGUocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkKLQl7CisJd2hpbGUgKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpIHsKIAkJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOwogCQlwVHhCbGstPnBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7Ci0JCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCi0JCXsKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKSB7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LAorCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOworCQliVkxBTlBrdCA9CisJCSAgICAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CiAKLQkJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwkJLyogc2tpcCA4MDIuMyBoZWFkZXIgKi8KIAkJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKLQkJcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKKwkJcFR4QmxrLT5TcmNCdWZMZW4gLT0gTEVOR1RIXzgwMl8zOwogCi0JCS8vIHNraXAgdmxhbiB0YWcKLQkJaWYgKGJWTEFOUGt0KQotCQl7Ci0JCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7Ci0JCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROworCQkvKiBza2lwIHZsYW4gdGFnICovCisJCWlmIChiVkxBTlBrdCkgeworCQkJcFR4QmxrLT5wU3JjQnVmRGF0YSArPSBMRU5HVEhfODAyXzFROworCQkJcFR4QmxrLT5TcmNCdWZMZW4gLT0gTEVOR1RIXzgwMl8xUTsKIAkJfQogCi0JCWlmIChmcmFtZU51bSA9PSAwKQotCQl7Ci0JCQlwSGVhZGVyQnVmUHRyID0gU1RBX0J1aWxkX0FNU0RVX0ZyYW1lX0hlYWRlcihwQWQsIHBUeEJsayk7CisJCWlmIChmcmFtZU51bSA9PSAwKSB7CisJCQlwSGVhZGVyQnVmUHRyID0KKwkJCSAgICBTVEFfQnVpbGRfQU1TRFVfRnJhbWVfSGVhZGVyKHBBZCwgcFR4QmxrKTsKIAotCQkJLy8gTk9URTogVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IHdpbGwgYmUgdXBkYXRlZCBhZnRlciBmaW5hbCBmcmFtZSB3YXMgaGFuZGxlZC4KLQkJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7Ci0JCX0KLQkJZWxzZQotCQl7CisJCQkvKiBOT1RFOiBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGZpbmFsIGZyYW1lIHdhcyBoYW5kbGVkLiAqLworCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwKKwkJCQkJICAgKHN0cnVjdCBydF90eHdpICopICgmcFR4QmxrLT4KKwkJCQkJCQkgIEhlYWRlckJ1ZgorCQkJCQkJCSAgW1RYSU5GT19TSVpFXSksCisJCQkJCSAgIHBUeEJsayk7CisJCX0gZWxzZSB7CiAJCQlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmWzBdOwotCQkJcGFkZGluZyA9IFJPVU5EX1VQKExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQgKyBzdWJGcmFtZVBheWxvYWRMZW4sIDQpIC0gKExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQgKyBzdWJGcmFtZVBheWxvYWRMZW4pOwotCQkJTmRpc1plcm9NZW1vcnkocEhlYWRlckJ1ZlB0ciwgcGFkZGluZyArIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQpOworCQkJcGFkZGluZyA9CisJCQkgICAgUk9VTkRfVVAoTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArCisJCQkJICAgICBzdWJGcmFtZVBheWxvYWRMZW4sCisJCQkJICAgICA0KSAtIChMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsKKwkJCQkJICAgc3ViRnJhbWVQYXlsb2FkTGVuKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBIZWFkZXJCdWZQdHIsCisJCQkJICAgICAgIHBhZGRpbmcgKyBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEKTsKIAkJCXBIZWFkZXJCdWZQdHIgKz0gcGFkZGluZzsKIAkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IHBhZGRpbmc7CiAJCX0KIAotCQkvLwotCQkvLyBBLU1TRFUgc3ViZnJhbWUKLQkJLy8gICBEQSg2KStTQSg2KStMZW5ndGgoMikgKyBMTEMvU05BUCBFbmNhcAotCQkvLworCQkvKiAqLworCQkvKiBBLU1TRFUgc3ViZnJhbWUgKi8KKwkJLyogICBEQSg2KStTQSg2KStMZW5ndGgoMikgKyBMTEMvU05BUCBFbmNhcCAqLworCQkvKiAqLwogCQlzdWJGcmFtZUhlYWRlciA9IHBIZWFkZXJCdWZQdHI7CiAJCXN1YkZyYW1lUGF5bG9hZExlbiA9IHBUeEJsay0+U3JjQnVmTGVuOwogCiAJCU5kaXNNb3ZlTWVtb3J5KHN1YkZyYW1lSGVhZGVyLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIsIDEyKTsKIAotCiAJCXBIZWFkZXJCdWZQdHIgKz0gTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKIAkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7CiAKLQotCQkvLwotCQkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCi0JCS8vCi0JCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOworCQkvKiAqLworCQkvKiBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzICovCisJCS8qICovCisJCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKHBUeEJsay0+cFNyY0J1ZkRhdGEgLSAyLAorCQkJCQkJICAgIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKIAogCQlzdWJGcmFtZVBheWxvYWRMZW4gPSBwVHhCbGstPlNyY0J1ZkxlbjsKIAotCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCi0JCXsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKSB7CisJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLAorCQkJCSAgICAgICBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgNik7CiAJCQlwSGVhZGVyQnVmUHRyICs9IDY7Ci0JCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKLQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgMik7CisJCQkvKiBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkRhdGEgLSAyLAorCQkJCSAgICAgICAyKTsKIAkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKIAkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKIAkJCXN1YkZyYW1lUGF5bG9hZExlbiArPSBMRU5HVEhfODAyXzFfSDsKIAkJfQotCi0JCS8vIHVwZGF0ZSBzdWJGcmFtZSBMZW5ndGggZmllbGQKKwkJLyogdXBkYXRlIHN1YkZyYW1lIExlbmd0aCBmaWVsZCAqLwogCQlzdWJGcmFtZUhlYWRlclsxMl0gPSAoc3ViRnJhbWVQYXlsb2FkTGVuICYgMHhGRjAwKSA+PiA4OwogCQlzdWJGcmFtZUhlYWRlclsxM10gPSBzdWJGcmFtZVBheWxvYWRMZW4gJiAweEZGOwogCiAJCXRvdGFsTVBEVVNpemUgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CiAKLQkJaWYgKGZyYW1lTnVtID09MCkKLQkJCUZpcnN0VHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7CisJCWlmIChmcmFtZU51bSA9PSAwKQorCQkJRmlyc3RUeCA9CisJCQkgICAgSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwKKwkJCQkJCSAgICAgJkZyZWVOdW1iZXIpOwogCQllbHNlCi0JCQlMYXN0VHhJZHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7CisJCQlMYXN0VHhJZHggPQorCQkJICAgIEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sCisJCQkJCQkgICAgICZGcmVlTnVtYmVyKTsKIAogCQlmcmFtZU51bSsrOwogCiAJCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKIAkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOwogCi0JCS8vIGNhbGN1bGF0ZSBUcmFuc21pdHRlZCBBTVNEVSBDb3VudCBhbmQgQnl0ZUNvdW50CisJCS8qIGNhbGN1bGF0ZSBUcmFuc21pdHRlZCBBTVNEVSBDb3VudCBhbmQgQnl0ZUNvdW50ICovCiAJCXsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVNEVUNvdW50LnUuTG93UGFydCArKzsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRPY3RldHNJbkFNU0RVLlF1YWRQYXJ0ICs9IHRvdGFsTVBEVVNpemU7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1TRFVDb3VudC51Lkxvd1BhcnQrKzsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRPY3RldHNJbkFNU0RVLlF1YWRQYXJ0ICs9CisJCQkgICAgdG90YWxNUERVU2l6ZTsKIAkJfQogCiAJfQpAQCAtMTkyMCwzOCArMTk0NCwzMSBAQAogCUhBTF9GaW5hbFdyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgdG90YWxNUERVU2l6ZSwgRmlyc3RUeCk7CiAJSEFMX0xhc3RUeElkeChwQWQsIHBUeEJsay0+UXVlSWR4LCBMYXN0VHhJZHgpOwogCi0JLy8KLQkvLyBLaWNrIG91dCBUeAotCS8vCi0jaWZkZWYgUlQyODYwCisJLyogKi8KKwkvKiBLaWNrIG91dCBUeCAqLworCS8qICovCiAJaWYgKCFSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCkpCi0jZW5kaWYKIAkJSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOwogfQogCi1WT0lEIFNUQV9MZWdhY3lfRnJhbWVfVHgoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaykKK3ZvaWQgU1RBX0xlZ2FjeV9GcmFtZV9UeChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaykKIHsKLQlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKLQlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOwotCVVTSE9SVAkJCUZyZWVOdW1iZXI7Ci0JQk9PTEVBTgkJCWJWTEFOUGt0OwotCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICpwSGVhZGVyXzgwMl8xMTsKKwl1OCAqcEhlYWRlckJ1ZlB0cjsKKwl1MTYgRnJlZU51bWJlcjsKKwlCT09MRUFOIGJWTEFOUGt0OworCXN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqcFFFbnRyeTsKIAogCUFTU0VSVChwVHhCbGspOwogCi0KIAlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CiAJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOwotCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCi0JeworCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpIHsKIAkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9NQ0FTVF9GUkFNRSkKLQl7CisJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfTUNBU1RfRlJBTUUpIHsKIAkJSU5DX0NPVU5URVI2NChwQWQtPldsYW5Db3VudGVycy5NdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQpOwogCX0KIApAQCAtMTk2OCwxODEgKzE5ODUsMTg3IEBACiAJU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7CiAJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOwogCi0KLQkvLyBza2lwIDgwMi4zIGhlYWRlcgorCS8qIHNraXAgODAyLjMgaGVhZGVyICovCiAJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKLQlwVHhCbGstPlNyY0J1ZkxlbiAgLT0gTEVOR1RIXzgwMl8zOworCXBUeEJsay0+U3JjQnVmTGVuIC09IExFTkdUSF84MDJfMzsKIAotCS8vIHNraXAgdmxhbiB0YWcKLQlpZiAoYlZMQU5Qa3QpCi0JewotCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7Ci0JCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJLyogc2tpcCB2bGFuIHRhZyAqLworCWlmIChiVkxBTlBrdCkgeworCQlwVHhCbGstPnBTcmNCdWZEYXRhICs9IExFTkdUSF84MDJfMVE7CisJCXBUeEJsay0+U3JjQnVmTGVuIC09IExFTkdUSF84MDJfMVE7CiAJfQogCiAJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07Ci0JcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJfODAyXzExID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CiAKLQkvLyBza2lwIGNvbW1vbiBoZWFkZXIKKwkvKiBza2lwIGNvbW1vbiBoZWFkZXIgKi8KIAlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKIAotCWlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pKQotCXsKLQkJLy8KLQkJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKLQkJLy8KLQkJKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKLQkJKihwSGVhZGVyQnVmUHRyKzEpID0gMDsKLQkJcEhlYWRlckJ1ZlB0ciArPTI7CisJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpIHsKKwkJLyogKi8KKwkJLyogYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMgKi8KKwkJLyogKi8KKwkJKihwSGVhZGVyQnVmUHRyKSA9CisJCSAgICAoKHBUeEJsay0+VXNlclByaW9yaXR5ICYgMHgwRikgfCAocEFkLT5Db21tb25DZmcuCisJCQkJCQkgICAgICBBY2tQb2xpY3lbcFR4QmxrLT4KKwkJCQkJCQkJUXVlSWR4XSA8PCA1KSk7CisJCSoocEhlYWRlckJ1ZlB0ciArIDEpID0gMDsKKwkJcEhlYWRlckJ1ZlB0ciArPSAyOwogCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKIAl9Ci0KLQkvLyBUaGUgcmVtYWluaW5nIGNvbnRlbnQgb2YgTVBEVSBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudAotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7Ci0JcEhlYWRlckJ1ZlB0ciA9IChQQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7Ci0JcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CisJLyogVGhlIHJlbWFpbmluZyBjb250ZW50IG9mIE1QRFUgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQgKi8KKwlwVHhCbGstPkhkclBhZExlbiA9ICh1bnNpZ25lZCBsb25nKXBIZWFkZXJCdWZQdHI7CisJcEhlYWRlckJ1ZlB0ciA9ICh1OCAqKVJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCXBUeEJsay0+SGRyUGFkTGVuID0gKHVuc2lnbmVkIGxvbmcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CiAKIAl7CiAKLQkJLy8KLQkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cwotCQkvLwotCQkvLwotICAgCQkvLyBpZiBvcmlnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwKLQkJLy8gdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZAotCQkvLwotCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX1NUQVJUKHBUeEJsay0+cFNyY0J1ZkhlYWRlciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOwotCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCi0JCXsKLQkJCVVDSEFSIHZsYW5fc2l6ZTsKKwkJLyogKi8KKwkJLyogSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cyAqLworCQkvKiAqLworCQkvKiAqLworCQkvKiBpZiBvcmlnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwgKi8KKwkJLyogdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZCAqLworCQkvKiAqLworCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX1NUQVJUKHBUeEJsay0+cFNyY0J1ZkhlYWRlciwKKwkJCQkJCSAgIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKwkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKSB7CisJCQl1OCB2bGFuX3NpemU7CiAKLQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsCisJCQkJICAgICAgIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKIAkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKLQkJCS8vIHNraXAgdmxhbiB0YWcKLQkJCXZsYW5fc2l6ZSA9ICAoYlZMQU5Qa3QpID8gTEVOR1RIXzgwMl8xUSA6IDA7Ci0JCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKLQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcisxMit2bGFuX3NpemUsIDIpOworCQkJLyogc2tpcCB2bGFuIHRhZyAqLworCQkJdmxhbl9zaXplID0gKGJWTEFOUGt0KSA/IExFTkdUSF84MDJfMVEgOiAwOworCQkJLyogZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pICovCisJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLAorCQkJCSAgICAgICBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyAxMiArIHZsYW5fc2l6ZSwKKwkJCQkgICAgICAgMik7CiAJCQlwSGVhZGVyQnVmUHRyICs9IDI7CiAJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7CiAJCX0KIAogCX0KIAotCS8vCi0JLy8gcHJlcGFyZSBmb3IgVFhXSQotCS8vIHVzZSBXY2lkIGFzIEtleSBJbmRleAotCS8vCisJLyogKi8KKwkvKiBwcmVwYXJlIGZvciBUWFdJICovCisJLyogdXNlIFdjaWQgYXMgS2V5IEluZGV4ICovCisJLyogKi8KIAotCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKHN0cnVjdCBydF90eHdpICopICgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwKKwkJCSAgIHBUeEJsayk7CiAKLQkvL0ZyZWVOdW1iZXIgPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7CisJLypGcmVlTnVtYmVyID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOyAqLwogCiAJSEFMX1dyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgVFJVRSwgJkZyZWVOdW1iZXIpOwogCiAJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOwogCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKIAotCS8vCi0JLy8gS2ljayBvdXQgVHgKLQkvLwotI2lmZGVmIFJUMjg2MAorCS8qICovCisJLyogS2ljayBvdXQgVHggKi8KKwkvKiAqLwogCWlmICghUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpKQotI2VuZGlmCiAJCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKIH0KIAotCi1WT0lEIFNUQV9BUmFsaW5rX0ZyYW1lX1R4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGspCit2b2lkIFNUQV9BUmFsaW5rX0ZyYW1lX1R4KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrKQogewotCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ci0JVVNIT1JUCQkJRnJlZU51bWJlcjsKLQlVU0hPUlQJCQl0b3RhbE1QRFVTaXplPTA7Ci0JVVNIT1JUCQkJRmlyc3RUeCwgTGFzdFR4SWR4OwotCWludCAJCQlmcmFtZU51bSA9IDA7Ci0JQk9PTEVBTgkJCWJWTEFOUGt0OwotCVBRVUVVRV9FTlRSWQlwUUVudHJ5OwotCisJdTggKnBIZWFkZXJCdWZQdHI7CisJdTE2IEZyZWVOdW1iZXI7CisJdTE2IHRvdGFsTVBEVVNpemUgPSAwOworCXUxNiBGaXJzdFR4LCBMYXN0VHhJZHg7CisJaW50IGZyYW1lTnVtID0gMDsKKwlCT09MRUFOIGJWTEFOUGt0OworCXN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqcFFFbnRyeTsKIAogCUFTU0VSVChwVHhCbGspOwogCi0JQVNTRVJUKChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXI9PSAyKSk7CisJQVNTRVJUKChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIgPT0gMikpOwogCi0KLQlGaXJzdFR4ID0gTGFzdFR4SWR4ID0gMDsgIC8vIElzIGl0IG9rIGluaXQgdGhleSBhcyAwPwotCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCi0JeworCUZpcnN0VHggPSBMYXN0VHhJZHggPSAwOwkvKiBJcyBpdCBvayBpbml0IHRoZXkgYXMgMD8gKi8KKwl3aGlsZSAocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkgewogCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CiAJCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKIAotCQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQotCQl7Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJaWYgKFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkgeworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwKKwkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQkJY29udGludWU7CiAJCX0KIAotCQliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKKwkJYlZMQU5Qa3QgPQorCQkgICAgKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOwogCi0JCS8vIHNraXAgODAyLjMgaGVhZGVyCisJCS8qIHNraXAgODAyLjMgaGVhZGVyICovCiAJCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7Ci0JCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisJCXBUeEJsay0+U3JjQnVmTGVuIC09IExFTkdUSF84MDJfMzsKIAotCQkvLyBza2lwIHZsYW4gdGFnCi0JCWlmIChiVkxBTlBrdCkKLQkJewotCQkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROwotCQkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKKwkJLyogc2tpcCB2bGFuIHRhZyAqLworCQlpZiAoYlZMQU5Qa3QpIHsKKwkJCXBUeEJsay0+cFNyY0J1ZkRhdGEgKz0gTEVOR1RIXzgwMl8xUTsKKwkJCXBUeEJsay0+U3JjQnVmTGVuIC09IExFTkdUSF84MDJfMVE7CiAJCX0KIAotCQlpZiAoZnJhbWVOdW0gPT0gMCkKLQkJewkvLyBGb3IgZmlyc3QgZnJhbWUsIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSA4MDIuMTEgaGVhZGVyICsgcGFkZGluZyhvcHRpb25hbCkgKyBSQS1BR0ctTEVOICsgU05BUCBIZWFkZXIKKwkJaWYgKGZyYW1lTnVtID09IDApIHsJLyogRm9yIGZpcnN0IGZyYW1lLCB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgODAyLjExIGhlYWRlciArIHBhZGRpbmcob3B0aW9uYWwpICsgUkEtQUdHLUxFTiArIFNOQVAgSGVhZGVyICovCiAKLQkJCXBIZWFkZXJCdWZQdHIgPSBTVEFfQnVpbGRfQVJhbGlua19GcmFtZV9IZWFkZXIocEFkLCBwVHhCbGspOworCQkJcEhlYWRlckJ1ZlB0ciA9CisJCQkgICAgU1RBX0J1aWxkX0FSYWxpbmtfRnJhbWVfSGVhZGVyKHBBZCwgcFR4QmxrKTsKIAotCQkJLy8gSXQncyBvayB3cml0ZSB0aGUgVHhXSSBoZXJlLCBiZWNhdXNlIHRoZSBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQKLQkJCS8vCXdpbGwgYmUgdXBkYXRlZCBhZnRlciBmaW5hbCBmcmFtZSB3YXMgaGFuZGxlZC4KLQkJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisJCQkvKiBJdCdzIG9rIHdyaXRlIHRoZSBUeFdJIGhlcmUsIGJlY2F1c2UgdGhlIFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAqLworCQkJLyogICAgICB3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgZmluYWwgZnJhbWUgd2FzIGhhbmRsZWQuICovCisJCQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLAorCQkJCQkgICAoc3RydWN0IHJ0X3R4d2kgKikgKCZwVHhCbGstPgorCQkJCQkJCSAgSGVhZGVyQnVmCisJCQkJCQkJICBbVFhJTkZPX1NJWkVdKSwKKwkJCQkJICAgcFR4QmxrKTsKIAorCQkJLyogKi8KKwkJCS8qIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMgKi8KKwkJCS8qICovCisJCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChwVHhCbGstPgorCQkJCQkJCSAgICBwU3JjQnVmRGF0YSAtIDIsCisJCQkJCQkJICAgIHBUeEJsay0+CisJCQkJCQkJICAgIHBFeHRyYUxsY1NuYXBFbmNhcCk7CiAKLQkJCS8vCi0JCQkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCi0JCQkvLwotCQkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQocFR4QmxrLT5wU3JjQnVmRGF0YS0yLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCk7Ci0KLQkJCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKLQkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgNik7CisJCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLAorCQkJCQkgICAgICAgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOwogCQkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKLQkJCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKLQkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZEYXRhLTIsIDIpOworCQkJCS8qIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKSAqLworCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsCisJCQkJCSAgICAgICBwVHhCbGstPnBTcmNCdWZEYXRhIC0gMiwgMik7CiAJCQkJcEhlYWRlckJ1ZlB0ciArPSAyOwogCQkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKIAkJCX0KLQkJfQotCQllbHNlCi0JCXsJLy8gRm9yIHNlY29uZCBhZ2dyZWdhdGVkIGZyYW1lLCB3ZSBuZWVkIGNyZWF0ZSB0aGUgODAyLjMgaGVhZGVyIHRvIGhlYWRlckJ1ZiwgYmVjYXVzZSBQQ0kgd2lsbCBjb3B5IGl0IHRvIFNEUHRyMC4KKwkJfSBlbHNlIHsJLyogRm9yIHNlY29uZCBhZ2dyZWdhdGVkIGZyYW1lLCB3ZSBuZWVkIGNyZWF0ZSB0aGUgODAyLjMgaGVhZGVyIHRvIGhlYWRlckJ1ZiwgYmVjYXVzZSBQQ0kgd2lsbCBjb3B5IGl0IHRvIFNEUHRyMC4gKi8KIAogCQkJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZlswXTsKIAkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IDA7CiAKLQkJCS8vIEEtUmFsaW5rIHN1Yi1zZXF1ZW50IGZyYW1lIGhlYWRlciBpcyB0aGUgc2FtZSBhcyA4MDIuMyBoZWFkZXIuCi0JCQkvLyAgIERBKDYpK1NBKDYpK0ZyYW1lVHlwZSgyKQotCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAxMik7CisJCQkvKiBBLVJhbGluayBzdWItc2VxdWVudCBmcmFtZSBoZWFkZXIgaXMgdGhlIHNhbWUgYXMgODAyLjMgaGVhZGVyLiAqLworCQkJLyogICBEQSg2KStTQSg2KStGcmFtZVR5cGUoMikgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlciwKKwkJCQkgICAgICAgMTIpOwogCQkJcEhlYWRlckJ1ZlB0ciArPSAxMjsKLQkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQotCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKKwkJCS8qIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKSAqLworCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YSAtIDIsCisJCQkJICAgICAgIDIpOwogCQkJcEhlYWRlckJ1ZlB0ciArPSAyOwogCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gTEVOR1RIX0FSQUxJTktfU1VCRlJBTUVIRUFEOwogCQl9CiAKIAkJdG90YWxNUERVU2l6ZSArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKIAotCQkvL0ZyZWVOdW1iZXIgPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7Ci0JCWlmIChmcmFtZU51bSA9PTApCi0JCQlGaXJzdFR4ID0gSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgJkZyZWVOdW1iZXIpOworCQkvKkZyZWVOdW1iZXIgPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7ICovCisJCWlmIChmcmFtZU51bSA9PSAwKQorCQkJRmlyc3RUeCA9CisJCQkgICAgSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwKKwkJCQkJCSAgICAgJkZyZWVOdW1iZXIpOwogCQllbHNlCi0JCQlMYXN0VHhJZHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7CisJCQlMYXN0VHhJZHggPQorCQkJICAgIEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sCisJCQkJCQkgICAgICZGcmVlTnVtYmVyKTsKIAogCQlmcmFtZU51bSsrOwogCkBAIC0yMTU1LDQwICsyMTc4LDM0IEBACiAJSEFMX0ZpbmFsV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCB0b3RhbE1QRFVTaXplLCBGaXJzdFR4KTsKIAlIQUxfTGFzdFR4SWR4KHBBZCwgcFR4QmxrLT5RdWVJZHgsIExhc3RUeElkeCk7CiAKLQkvLwotCS8vIEtpY2sgb3V0IFR4Ci0JLy8KLSNpZmRlZiBSVDI4NjAKKwkvKiAqLworCS8qIEtpY2sgb3V0IFR4ICovCisJLyogKi8KIAlpZiAoIVJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19ESVNBQkxFX1RYKSkKLSNlbmRpZgogCQlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7CiAKIH0KIAotCi1WT0lEIFNUQV9GcmFnbWVudF9GcmFtZV9UeCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBUWF9CTEsJCSpwVHhCbGspCit2b2lkIFNUQV9GcmFnbWVudF9GcmFtZV9UeChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaykKIHsKLQlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKLQlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOwotCVVTSE9SVAkJCUZyZWVOdW1iZXI7Ci0JVUNIQVIgCQkJZnJhZ051bSA9IDA7Ci0JUEFDS0VUX0lORk8JCVBhY2tldEluZm87Ci0JVVNIT1JUCQkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMDsKLQlVSU5UMzIJCQlGcmVlTXBkdVNpemUsIFNyY1JlbWFpbmluZ0J5dGVzOwotCVVTSE9SVAkJCUFja0R1cmF0aW9uOwotCVVJTlQgCQkJTmV4dE1wZHVTaXplOwotCUJPT0xFQU4JCQliVkxBTlBrdDsKLQlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKLQorCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICpwSGVhZGVyXzgwMl8xMTsKKwl1OCAqcEhlYWRlckJ1ZlB0cjsKKwl1MTYgRnJlZU51bWJlcjsKKwl1OCBmcmFnTnVtID0gMDsKKwlzdHJ1Y3QgcnRfcGFja2V0X2luZm8gUGFja2V0SW5mbzsKKwl1MTYgRW5jcnlwdGlvbk92ZXJoZWFkID0gMDsKKwl1MzIgRnJlZU1wZHVTaXplLCBTcmNSZW1haW5pbmdCeXRlczsKKwl1MTYgQWNrRHVyYXRpb247CisJdTMyIE5leHRNcGR1U2l6ZTsKKwlCT09MRUFOIGJWTEFOUGt0OworCXN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqcFFFbnRyeTsKKwlIVFRSQU5TTUlUX1NFVFRJTkcgKnBUcmFuc21pdDsKIAogCUFTU0VSVChwVHhCbGspOwogCiAJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOwogCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKLQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQotCXsKKwlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKSB7CiAJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQlyZXR1cm47CiAJfQpAQCAtMjE5OSwxMTIgKzIyMTYsMTI1IEBACiAJU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7CiAJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOwogCi0JaWYgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9US0lQKQotCXsKLQkJcFR4QmxrLT5wUGFja2V0ID0gZHVwbGljYXRlX3BrdF93aXRoX1RLSVBfTUlDKHBBZCwgcFR4QmxrLT5wUGFja2V0KTsKKwlpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHsKKwkJcFR4QmxrLT5wUGFja2V0ID0KKwkJICAgIGR1cGxpY2F0ZV9wa3Rfd2l0aF9US0lQX01JQyhwQWQsIHBUeEJsay0+cFBhY2tldCk7CiAJCWlmIChwVHhCbGstPnBQYWNrZXQgPT0gTlVMTCkKIAkJCXJldHVybjsKLQkJUlRNUF9RdWVyeVBhY2tldEluZm8ocFR4QmxrLT5wUGFja2V0LCAmUGFja2V0SW5mbywgJnBUeEJsay0+cFNyY0J1ZkhlYWRlciwgJnBUeEJsay0+U3JjQnVmTGVuKTsKKwkJUlRNUF9RdWVyeVBhY2tldEluZm8ocFR4QmxrLT5wUGFja2V0LCAmUGFja2V0SW5mbywKKwkJCQkgICAgICZwVHhCbGstPnBTcmNCdWZIZWFkZXIsCisJCQkJICAgICAmcFR4QmxrLT5TcmNCdWZMZW4pOwogCX0KLQotCS8vIHNraXAgODAyLjMgaGVhZGVyCisJLyogc2tpcCA4MDIuMyBoZWFkZXIgKi8KIAlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOwotCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisJcFR4QmxrLT5TcmNCdWZMZW4gLT0gTEVOR1RIXzgwMl8zOwogCi0KLQkvLyBza2lwIHZsYW4gdGFnCi0JaWYgKGJWTEFOUGt0KQotCXsKLQkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROwotCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROworCS8qIHNraXAgdmxhbiB0YWcgKi8KKwlpZiAoYlZMQU5Qa3QpIHsKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YSArPSBMRU5HVEhfODAyXzFROworCQlwVHhCbGstPlNyY0J1ZkxlbiAtPSBMRU5HVEhfODAyXzFROwogCX0KIAogCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOwotCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKilwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJfODAyXzExID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CiAKLQotCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCS8qIHNraXAgY29tbW9uIGhlYWRlciAqLwogCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOwogCi0JaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpCi0JewotCQkvLwotCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcwotCQkvLworCWlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pKSB7CisJCS8qICovCisJCS8qIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzICovCisJCS8qICovCiAJCSpwSGVhZGVyQnVmUHRyID0gKHBUeEJsay0+VXNlclByaW9yaXR5ICYgMHgwRik7CiAKLQkJKihwSGVhZGVyQnVmUHRyKzEpID0gMDsKLQkJcEhlYWRlckJ1ZlB0ciArPTI7CisJCSoocEhlYWRlckJ1ZlB0ciArIDEpID0gMDsKKwkJcEhlYWRlckJ1ZlB0ciArPSAyOwogCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKIAl9CisJLyogKi8KKwkvKiBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIgKi8KKwkvKiBMTEMgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQgKi8KKwkvKiAqLworCXBUeEJsay0+SGRyUGFkTGVuID0gKHVuc2lnbmVkIGxvbmcpcEhlYWRlckJ1ZlB0cjsKKwlwSGVhZGVyQnVmUHRyID0gKHU4ICopUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7CisJcFR4QmxrLT5IZHJQYWRMZW4gPSAodW5zaWduZWQgbG9uZykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKIAotCS8vCi0JLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyCi0JLy8gTExDIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50Ci0JLy8KLQlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOwotCXBIZWFkZXJCdWZQdHIgPSAoUENIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOwotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOwotCi0KLQotCS8vCi0JLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cwotCS8vCi0JLy8KLSAgIAkvLyBpZiBvcmlnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwKLQkvLyB0aGVuIGFuIGV4dHJhIExMQy9TTkFQIGVuY2FwIGlzIHJlcXVpcmVkCi0JLy8KLQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX1NUQVJUKHBUeEJsay0+cFNyY0J1ZkhlYWRlciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOwotCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKLQl7Ci0JCVVDSEFSIHZsYW5fc2l6ZTsKKwkvKiAqLworCS8qIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMgKi8KKwkvKiAqLworCS8qICovCisJLyogaWYgb3JpZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsICovCisJLyogdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZCAqLworCS8qICovCisJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChwVHhCbGstPnBTcmNCdWZIZWFkZXIsCisJCQkJCSAgIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKwlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApIHsKKwkJdTggdmxhbl9zaXplOwogCiAJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKIAkJcEhlYWRlckJ1ZlB0ciArPSA2OwotCQkvLyBza2lwIHZsYW4gdGFnCi0JCXZsYW5fc2l6ZSA9ICAoYlZMQU5Qa3QpID8gTEVOR1RIXzgwMl8xUSA6IDA7Ci0JCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQotCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIrMTIrdmxhbl9zaXplLCAyKTsKKwkJLyogc2tpcCB2bGFuIHRhZyAqLworCQl2bGFuX3NpemUgPSAoYlZMQU5Qa3QpID8gTEVOR1RIXzgwMl8xUSA6IDA7CisJCS8qIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKSAqLworCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLAorCQkJICAgICAgIHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIDEyICsgdmxhbl9zaXplLCAyKTsKIAkJcEhlYWRlckJ1ZlB0ciArPSAyOwogCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7CiAJfQogCisJLyogSWYgVEtJUCBpcyB1c2VkIGFuZCBmcmFnbWVudGF0aW9uIGlzIHJlcXVpcmVkLiBEcml2ZXIgaGFzIHRvICovCisJLyogICAgICBhcHBlbmQgVEtJUCBNSUMgYXQgdGFpbCBvZiB0aGUgc2NhdHRlciBidWZmZXIgKi8KKwkvKiAgICAgIE1BQyBBU0lDIHdpbGwgb25seSBwZXJmb3JtIElWL0VJVi9JQ1YgaW5zZXJ0aW9uIGJ1dCBubyBUS0lQIE1JQyAqLworCWlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgeworCQlSVE1QQ2FsY3VsYXRlTUlDVmFsdWUocEFkLCBwVHhCbGstPnBQYWNrZXQsCisJCQkJICAgICAgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIHBUeEJsay0+cEtleSwKKwkJCQkgICAgICAwKTsKIAotCS8vIElmIFRLSVAgaXMgdXNlZCBhbmQgZnJhZ21lbnRhdGlvbiBpcyByZXF1aXJlZC4gRHJpdmVyIGhhcyB0bwotCS8vCWFwcGVuZCBUS0lQIE1JQyBhdCB0YWlsIG9mIHRoZSBzY2F0dGVyIGJ1ZmZlcgotCS8vCU1BQyBBU0lDIHdpbGwgb25seSBwZXJmb3JtIElWL0VJVi9JQ1YgaW5zZXJ0aW9uIGJ1dCBubyBUS0lQIE1JQwotCWlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkKLQl7Ci0KLQkJLy8gTk9URTogRE9OJ1QgcmVmZXIgdGhlIHNrYi0+bGVuIGRpcmVjdGx5IGFmdGVyIGZvbGxvd2luZyBjb3B5LiBCZWNhc3VlIHRoZSBsZW5ndGggaXMgbm90IGFkanVzdAotCQkvLwkJCXRvIGNvcnJlY3QgbGVuZ2h0LCByZWZlciB0byBwVHhCbGstPlNyY0J1ZkxlbiBmb3IgdGhlIHBhY2tldCBsZW5ndGggaW4gZm9sbG93aW5nIHByb2dyZXNzLgotCQlOZGlzTW92ZU1lbW9yeShwVHhCbGstPnBTcmNCdWZEYXRhICsgcFR4QmxrLT5TcmNCdWZMZW4sICZwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQ1swXSwgOCk7Ci0JCS8vc2tiX3B1dCgoUlRQS1RfVE9fT1NQS1QocFR4QmxrLT5wUGFja2V0KSktPnRhaWwsIDgpOworCQkvKiBOT1RFOiBET04nVCByZWZlciB0aGUgc2tiLT5sZW4gZGlyZWN0bHkgYWZ0ZXIgZm9sbG93aW5nIGNvcHkuIEJlY2FzdWUgdGhlIGxlbmd0aCBpcyBub3QgYWRqdXN0ICovCisJCS8qICAgICAgICAgICAgICAgICAgICAgIHRvIGNvcnJlY3QgbGVuZ2h0LCByZWZlciB0byBwVHhCbGstPlNyY0J1ZkxlbiBmb3IgdGhlIHBhY2tldCBsZW5ndGggaW4gZm9sbG93aW5nIHByb2dyZXNzLiAqLworCQlOZGlzTW92ZU1lbW9yeShwVHhCbGstPnBTcmNCdWZEYXRhICsgcFR4QmxrLT5TcmNCdWZMZW4sCisJCQkgICAgICAgJnBBZC0+UHJpdmF0ZUluZm8uVHguTUlDWzBdLCA4KTsKKwkJLypza2JfcHV0KChSVFBLVF9UT19PU1BLVChwVHhCbGstPnBQYWNrZXQpKS0+dGFpbCwgOCk7ICovCiAJCXBUeEJsay0+U3JjQnVmTGVuICs9IDg7CiAJCXBUeEJsay0+VG90YWxGcmFtZUxlbiArPSA4OwogCQlwVHhCbGstPkNpcGhlckFsZyA9IENJUEhFUl9US0lQX05PX01JQzsKIAl9Ci0KLQkvLwotCS8vIGNhbGN1YXRlIHRoZSBvdmVyaGVhZCBieXRlcyB0aGF0IGVuY3J5cHRpb24gYWxnb3JpdGhtIG1heSBhZGQuIFRoaXMKLQkvLyBhZmZlY3RzIHRoZSBjYWxjdWxhdGUgb2YgImR1cmF0aW9uIiBmaWVsZAotCS8vCi0JaWYgKChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQNjQpIHx8IChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQMTI4KSkKLQkJRW5jcnlwdGlvbk92ZXJoZWFkID0gODsgLy9XRVA6IElWWzRdICsgSUNWWzRdOworCS8qICovCisJLyogY2FsY3VhdGUgdGhlIG92ZXJoZWFkIGJ5dGVzIHRoYXQgZW5jcnlwdGlvbiBhbGdvcml0aG0gbWF5IGFkZC4gVGhpcyAqLworCS8qIGFmZmVjdHMgdGhlIGNhbGN1bGF0ZSBvZiAiZHVyYXRpb24iIGZpZWxkICovCisJLyogKi8KKwlpZiAoKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKKwkgICAgfHwgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpKQorCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSA4OwkvKldFUDogSVZbNF0gKyBJQ1ZbNF07ICovCiAJZWxzZSBpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKQotCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAxMjsvL1RLSVA6IElWWzRdICsgRUlWWzRdICsgSUNWWzRdLCBNSUMgd2lsbCBiZSBhZGRlZCB0byBUb3RhbFBhY2tldExlbmd0aAorCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAxMjsJLypUS0lQOiBJVls0XSArIEVJVls0XSArIElDVls0XSwgTUlDIHdpbGwgYmUgYWRkZWQgdG8gVG90YWxQYWNrZXRMZW5ndGggKi8KIAllbHNlIGlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkKLQkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMjA7Ly9US0lQOiBJVls0XSArIEVJVls0XSArIElDVls0XSArIE1JQ1s4XQorCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAyMDsJLypUS0lQOiBJVls0XSArIEVJVls0XSArIElDVls0XSArIE1JQ1s4XSAqLwogCWVsc2UgaWYgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9BRVMpCi0JCUVuY3J5cHRpb25PdmVyaGVhZCA9IDE2OwkvLyBBRVM6IElWWzRdICsgRUlWWzRdICsgTUlDWzhdCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDE2OwkvKiBBRVM6IElWWzRdICsgRUlWWzRdICsgTUlDWzhdICovCiAJZWxzZQogCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAwOwogCi0JLy8gZGVjaWRlIGhvdyBtdWNoIHRpbWUgYW4gQUNLL0NUUyBmcmFtZSB3aWxsIGNvbnN1bWUgaW4gdGhlIGFpcgotCUFja0R1cmF0aW9uID0gUlRNUENhbGNEdXJhdGlvbihwQWQsIHBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtwVHhCbGstPlR4UmF0ZV0sIDE0KTsKKwlwVHJhbnNtaXQgPSBwVHhCbGstPnBUcmFuc21pdDsKKwkvKiBEZWNpZGUgdGhlIFRYIHJhdGUgKi8KKwlpZiAocFRyYW5zbWl0LT5maWVsZC5NT0RFID09IE1PREVfQ0NLKQorCQlwVHhCbGstPlR4UmF0ZSA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOworCWVsc2UgaWYgKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA9PSBNT0RFX09GRE0pCisJCXBUeEJsay0+VHhSYXRlID0gcFRyYW5zbWl0LT5maWVsZC5NQ1MgKyBSQVRFX0ZJUlNUX09GRE1fUkFURTsKKwllbHNlCisJCXBUeEJsay0+VHhSYXRlID0gUkFURV82XzU7CiAKLQkvLyBJbml0IHRoZSB0b3RhbCBwYXlsb2FkIGxlbmd0aCBvZiB0aGlzIGZyYW1lLgorCS8qIGRlY2lkZSBob3cgbXVjaCB0aW1lIGFuIEFDSy9DVFMgZnJhbWUgd2lsbCBjb25zdW1lIGluIHRoZSBhaXIgKi8KKwlpZiAocFR4QmxrLT5UeFJhdGUgPD0gUkFURV9MQVNUX09GRE1fUkFURSkKKwkJQWNrRHVyYXRpb24gPQorCQkgICAgUlRNUENhbGNEdXJhdGlvbihwQWQsCisJCQkJICAgICBwQWQtPkNvbW1vbkNmZy5FeHBlY3RlZEFDS1JhdGVbcFR4QmxrLT4KKwkJCQkJCQkJICAgIFR4UmF0ZV0sCisJCQkJICAgICAxNCk7CisJZWxzZQorCQlBY2tEdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBSQVRFXzZfNSwgMTQpOworCisJLyogSW5pdCB0aGUgdG90YWwgcGF5bG9hZCBsZW5ndGggb2YgdGhpcyBmcmFtZS4gKi8KIAlTcmNSZW1haW5pbmdCeXRlcyA9IHBUeEJsay0+U3JjQnVmTGVuOwogCiAJcFR4QmxrLT5Ub3RhbEZyYWdOdW0gPSAweGZmOwpAQCAtMjMxNSwyNSArMjM0NSwyOCBAQAogCiAJCUZyZWVNcGR1U2l6ZSAtPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CiAKLQkJaWYgKFNyY1JlbWFpbmluZ0J5dGVzIDw9IEZyZWVNcGR1U2l6ZSkKLQkJewkvLyB0aGlzIGlzIHRoZSBsYXN0IG9yIG9ubHkgZnJhZ21lbnQKKwkJaWYgKFNyY1JlbWFpbmluZ0J5dGVzIDw9IEZyZWVNcGR1U2l6ZSkgewkvKiB0aGlzIGlzIHRoZSBsYXN0IG9yIG9ubHkgZnJhZ21lbnQgKi8KIAogCQkJcFR4QmxrLT5TcmNCdWZMZW4gPSBTcmNSZW1haW5pbmdCeXRlczsKIAogCQkJcEhlYWRlcl84MDJfMTEtPkZDLk1vcmVGcmFnID0gMDsKLQkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IHBBZC0+Q29tbW9uQ2ZnLkRzaWZzICsgQWNrRHVyYXRpb247CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPQorCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLkRzaWZzICsgQWNrRHVyYXRpb247CiAKLQkJCS8vIEluZGljYXRlIHRoZSBsb3dlciBsYXllciB0aGF0IHRoaXMncyB0aGUgbGFzdCBmcmFnbWVudC4KKwkJCS8qIEluZGljYXRlIHRoZSBsb3dlciBsYXllciB0aGF0IHRoaXMncyB0aGUgbGFzdCBmcmFnbWVudC4gKi8KIAkJCXBUeEJsay0+VG90YWxGcmFnTnVtID0gZnJhZ051bTsKLQkJfQotCQllbHNlCi0JCXsJLy8gbW9yZSBmcmFnbWVudCBpcyByZXF1aXJlZAorCQl9IGVsc2UgewkvKiBtb3JlIGZyYWdtZW50IGlzIHJlcXVpcmVkICovCiAKIAkJCXBUeEJsay0+U3JjQnVmTGVuID0gRnJlZU1wZHVTaXplOwogCi0JCQlOZXh0TXBkdVNpemUgPSBtaW4oKChVSU5UKVNyY1JlbWFpbmluZ0J5dGVzIC0gcFR4QmxrLT5TcmNCdWZMZW4pLCAoKFVJTlQpcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQpKTsKKwkJCU5leHRNcGR1U2l6ZSA9CisJCQkgICAgbWluKCgodTMyKVNyY1JlbWFpbmluZ0J5dGVzIC0gcFR4QmxrLT5TcmNCdWZMZW4pLAorCQkJCSgodTMyKXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7CiAJCQlwSGVhZGVyXzgwMl8xMS0+RkMuTW9yZUZyYWcgPSAxOwotCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gKDMgKiBwQWQtPkNvbW1vbkNmZy5Ec2lmcykgKyAoMiAqIEFja0R1cmF0aW9uKSArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBwVHhCbGstPlR4UmF0ZSwgTmV4dE1wZHVTaXplICsgRW5jcnlwdGlvbk92ZXJoZWFkKTsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9CisJCQkgICAgKDMgKiBwQWQtPkNvbW1vbkNmZy5Ec2lmcykgKyAoMiAqIEFja0R1cmF0aW9uKSArCisJCQkgICAgUlRNUENhbGNEdXJhdGlvbihwQWQsIHBUeEJsay0+VHhSYXRlLAorCQkJCQkgICAgIE5leHRNcGR1U2l6ZSArIEVuY3J5cHRpb25PdmVyaGVhZCk7CiAJCX0KIAogCQlpZiAoZnJhZ051bSA9PSAwKQpAQCAtMjM0MSwxNiArMjM3NCwxOSBAQAogCQllbHNlCiAJCQlwVHhCbGstPkZyYW1lR2FwID0gSUZTX1NJRlM7CiAKLQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKwkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwKKwkJCQkgICAoc3RydWN0IHJ0X3R4d2kgKikgKCZwVHhCbGstPgorCQkJCQkJICBIZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwKKwkJCQkgICBwVHhCbGspOwogCiAJCUhBTF9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCAmRnJlZU51bWJlcik7CiAKIAkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOwogCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CiAKLQkJLy8gVXBkYXRlIHRoZSBmcmFtZSBudW1iZXIsIHJlbWFpbmluZyBzaXplIG9mIHRoZSBORElTIHBhY2tldCBwYXlsb2FkLgorCQkvKiBVcGRhdGUgdGhlIGZyYW1lIG51bWJlciwgcmVtYWluaW5nIHNpemUgb2YgdGhlIE5ESVMgcGFja2V0IHBheWxvYWQuICovCiAKLQkJLy8gc3BhY2UgZm9yIDgwMi4xMSBoZWFkZXIuCisJCS8qIHNwYWNlIGZvciA4MDIuMTEgaGVhZGVyLiAqLwogCQlpZiAoZnJhZ051bSA9PSAwICYmIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQogCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuIC09IExFTkdUSF84MDJfMV9IOwogCkBAIC0yMzU4LDE3ICsyMzk0LDE3IEBACiAJCVNyY1JlbWFpbmluZ0J5dGVzIC09IHBUeEJsay0+U3JjQnVmTGVuOwogCQlwVHhCbGstPnBTcmNCdWZEYXRhICs9IHBUeEJsay0+U3JjQnVmTGVuOwogCi0JCXBIZWFkZXJfODAyXzExLT5GcmFnKys7CSAvLyBpbmNyZWFzZSBGcmFnICMKKwkJcEhlYWRlcl84MDJfMTEtPkZyYWcrKzsJLyogaW5jcmVhc2UgRnJhZyAjICovCiAKLQl9d2hpbGUoU3JjUmVtYWluaW5nQnl0ZXMgPiAwKTsKKwl9IHdoaWxlIChTcmNSZW1haW5pbmdCeXRlcyA+IDApOwogCi0JLy8KLQkvLyBLaWNrIG91dCBUeAotCS8vCi0JSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOworCS8qICovCisJLyogS2ljayBvdXQgVHggKi8KKwkvKiAqLworCWlmICghUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpKQorCQlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7CiB9CiAKLQogI2RlZmluZSBSRUxFQVNFX0ZSQU1FU19PRl9UWEJMSyhfcEFkLCBfcFR4QmxrLCBfcFFFbnRyeSwgX1N0YXR1cykgCQkJCQkJCQkJCVwKIAkJd2hpbGUoX3BUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCQkJCQkJCQkJCQkJCQlcCiAJCXsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXApAQCAtMjM3Niw3ICsyNDEyLDYgQEAKIAkJCVJFTEVBU0VfTkRJU19QQUNLRVQoX3BBZCwgUVVFVUVfRU5UUllfVE9fUEFDS0VUKF9wUUVudHJ5KSwgX1N0YXR1cyk7CVwKIAkJfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTIzODcsNyArMjQyMiw3IEBACiAKIAlBcmd1bWVudHM6CiAJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlQTkRJU19QQUNLRVQJUG9pbnRlciB0byBvdXRnb2luZyBOZGlzIGZyYW1lCisJCXZvaWQgKglQb2ludGVyIHRvIG91dGdvaW5nIE5kaXMgZnJhbWUKIAkJTnVtYmVyT2ZGcmFnCU51bWJlciBvZiBmcmFnbWVudCByZXF1aXJlZAogCiAJUmV0dXJuIFZhbHVlOgpAQCAtMjM5OSwxMjIgKzI0MzQsMTE3IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1ORElTX1NUQVRVUyBTVEFIYXJkVHJhbnNtaXQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVFhfQkxLIAkJCSpwVHhCbGssCi0JSU4JVUNIQVIJCQlRdWVJZHgpCitpbnQgU1RBSGFyZFRyYW5zbWl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssIHU4IFF1ZUlkeCkKIHsKLQlORElTX1BBQ0tFVAkJKnBQYWNrZXQ7Ci0JUFFVRVVFX0VOVFJZCXBRRW50cnk7CisJY2hhciAqcFBhY2tldDsKKwlzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKnBRRW50cnk7CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBTVEVQIDAuIERPIFNBTklUWSBDSEVDSyBBTkQgU09NRSBFQVJMWSBQUkVQQVJBVElPTi4KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIFNURVAgMC4gRE8gU0FOSVRZIENIRUNLIEFORCBTT01FIEVBUkxZIFBSRVBBUkFUSU9OLiAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qICovCiAJQVNTRVJUKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcik7Ci0JaWYgKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBUeEJsay0+VG90YWxGcmFtZU51bSA9PSAlbGQhXG4iLCBwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIpKTsKKwlpZiAocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgicFR4QmxrLT5Ub3RhbEZyYW1lTnVtID09ICVsZCFcbiIsCisJCQkgIHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcikpOwogCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKIAl9CiAKIAlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpOwogCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gU1RFUCAxLiBXQUtFIFVQIFBIWQotCS8vCQlvdXRnb2luZyBmcmFtZSBhbHdheXMgd2FrZXVwIFBIWSB0byBwcmV2ZW50IGZyYW1lIGxvc3QgYW5kCi0JLy8JCXR1cm4gb2ZmIFBTTSBiaXQgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIG5vdCB0byBjaGFuZ2UgUFNNIGJpdCwganVzdCBzZW5kIHRoaXMgZnJhbWUgb3V0PwotCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotCXsKLQkgICAgREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNGb3JjZVdha2V1cCBBdCBIYXJkVHhcbiIpKTsKLSNpZmRlZiBSVDI4NjAKLQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgRlJPTV9UWCk7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBTVEVQIDEuIFdBS0UgVVAgUEhZICovCisJLyogICAgICAgICAgICAgIG91dGdvaW5nIGZyYW1lIGFsd2F5cyB3YWtldXAgUEhZIHRvIHByZXZlbnQgZnJhbWUgbG9zdCBhbmQgKi8KKwkvKiAgICAgICAgICAgICAgdHVybiBvZmYgUFNNIGJpdCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogbm90IHRvIGNoYW5nZSBQU00gYml0LCBqdXN0IHNlbmQgdGhpcyBmcmFtZSBvdXQ/ICovCisJaWYgKChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpCisJICAgICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpIHsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiQXNpY0ZvcmNlV2FrZXVwIEF0IEhhcmRUeFxuIikpOworI2lmZGVmIFJUTVBfTUFDX1BDSQogCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKLSNlbmRpZgorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9GT1JDRV9XQUtFX1VQLCBOVUxMLCAwKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAl9Ci0KLQkvLyBJdCBzaG91bGQgbm90IGNoYW5nZSBQU00gYml0LCB3aGVuIEFQU0QgdHVybiBvbi4KLQlpZiAoKCEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSAmJiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSA9PSBGQUxTRSkpCi0JCXx8IChSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFR4QmxrLT5wUGFja2V0KSkKLQkJfHwgKFJUTVBfR0VUX1BBQ0tFVF9XQUkocFR4QmxrLT5wUGFja2V0KSkpCi0JeworCS8qIEl0IHNob3VsZCBub3QgY2hhbmdlIFBTTSBiaXQsIHdoZW4gQVBTRCB0dXJuIG9uLiAqLworCWlmICgoIQorCSAgICAgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZQorCSAgICAgICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKQorCSAgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUgPT0gRkFMU0UpKQorCSAgICB8fCAoUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBUeEJsay0+cFBhY2tldCkpCisJICAgIHx8IChSVE1QX0dFVF9QQUNLRVRfV0FJKHBUeEJsay0+cFBhY2tldCkpKSB7CiAJCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJgotICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQKSkKLQkJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfQUNUSVZFKTsKKwkJICAgIChwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID09CisJCSAgICAgTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQKSkKKwkJCVJUTVBfU0VUX1BTTV9CSVQocEFkLCBQV1JfQUNUSVZFKTsKIAl9CiAKLQlzd2l0Y2ggKHBUeEJsay0+VHhGcmFtZVR5cGUpCi0JewotCQljYXNlIFRYX0FNUERVX0ZSQU1FOgotCQkJCVNUQV9BTVBEVV9GcmFtZV9UeChwQWQsIHBUeEJsayk7Ci0JCQlicmVhazsKLQkJY2FzZSBUWF9BTVNEVV9GUkFNRToKLQkJCQlTVEFfQU1TRFVfRnJhbWVfVHgocEFkLCBwVHhCbGspOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFhfTEVHQUNZX0ZSQU1FOgotCQkJCVNUQV9MZWdhY3lfRnJhbWVfVHgocEFkLCBwVHhCbGspOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFhfTUNBU1RfRlJBTUU6Ci0JCQkJU1RBX0xlZ2FjeV9GcmFtZV9UeChwQWQsIHBUeEJsayk7Ci0JCQlicmVhazsKLQkJY2FzZSBUWF9SQUxJTktfRlJBTUU6Ci0JCQkJU1RBX0FSYWxpbmtfRnJhbWVfVHgocEFkLCBwVHhCbGspOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFhfRlJBR19GUkFNRToKLQkJCQlTVEFfRnJhZ21lbnRfRnJhbWVfVHgocEFkLCBwVHhCbGspOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl7Ci0JCQkJLy8gSXQgc2hvdWxkIG5vdCBoYXBwZW5lZCEKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZW5kIGEgcGFjZWt0IHdhcyBub3QgY2xhc3NpZmllZCEhIEl0IHNob3VsZCBub3QgaGFwcGVuIVxuIikpOwotCQkJCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcikKLQkJCQl7Ci0JCQkJCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKLQkJCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKLQkJCQkJaWYgKHBQYWNrZXQpCi0JCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJfQorCXN3aXRjaCAocFR4QmxrLT5UeEZyYW1lVHlwZSkgeworCWNhc2UgVFhfQU1QRFVfRlJBTUU6CisJCVNUQV9BTVBEVV9GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCWJyZWFrOworCWNhc2UgVFhfQU1TRFVfRlJBTUU6CisJCVNUQV9BTVNEVV9GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCWJyZWFrOworCWNhc2UgVFhfTEVHQUNZX0ZSQU1FOgorCQlTVEFfTGVnYWN5X0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJYnJlYWs7CisJY2FzZSBUWF9NQ0FTVF9GUkFNRToKKwkJU1RBX0xlZ2FjeV9GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCWJyZWFrOworCWNhc2UgVFhfUkFMSU5LX0ZSQU1FOgorCQlTVEFfQVJhbGlua19GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCWJyZWFrOworCWNhc2UgVFhfRlJBR19GUkFNRToKKwkJU1RBX0ZyYWdtZW50X0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJeworCQkJLyogSXQgc2hvdWxkIG5vdCBoYXBwZW5lZCEgKi8KKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIlNlbmQgYSBwYWNrZXQgd2FzIG5vdCBjbGFzc2lmaWVkISBJdCBzaG91bGQgbm90IGhhcHBlbiFcbiIpKTsKKwkJCXdoaWxlIChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIpIHsKKwkJCQlwUUVudHJ5ID0KKwkJCQkgICAgUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKwkJCQlpZiAocFBhY2tldCkKKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsCisJCQkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQkJfQotCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKIAogfQogCi1VTE9ORyAgSGFzaEJ5dGVzUG9seW5vbWlhbChVQ0hBUiAqdmFsdWUsIHVuc2lnbmVkIGludCBsZW4pCit1bnNpZ25lZCBsb25nIEhhc2hCeXRlc1BvbHlub21pYWwodTggKiB2YWx1ZSwgdW5zaWduZWQgaW50IGxlbikKIHsKLSAgIHVuc2lnbmVkIGNoYXIgKndvcmQgPSB2YWx1ZTsKLSAgIHVuc2lnbmVkIGludCByZXQgPSAwOwotICAgdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgY2hhciAqd29yZCA9IHZhbHVlOworCXVuc2lnbmVkIGludCByZXQgPSAwOworCXVuc2lnbmVkIGludCBpOwogCi0gICBmb3IoaT0wOyBpIDwgbGVuOyBpKyspCi0gICB7Ci0JICBpbnQgbW9kID0gaSAlIDMyOwotCSAgcmV0IF49KHVuc2lnbmVkIGludCkgKHdvcmRbaV0pIDw8IG1vZDsKLQkgIHJldCBePSh1bnNpZ25lZCBpbnQpICh3b3JkW2ldKSA+PiAoMzIgLSBtb2QpOwotICAgfQotICAgcmV0dXJuIHJldDsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaW50IG1vZCA9IGkgJSAzMjsKKwkJcmV0IF49ICh1bnNpZ25lZCBpbnQpKHdvcmRbaV0pIDw8IG1vZDsKKwkJcmV0IF49ICh1bnNpZ25lZCBpbnQpKHdvcmRbaV0pID4+ICgzMiAtIG1vZCk7CisJfQorCXJldHVybiByZXQ7CiB9CiAKLVZPSUQgU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit2b2lkIFN0YV9Bbm5vdW5jZV9vcl9Gb3J3YXJkXzgwMl8zX1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSAgdm9pZCAqcFBhY2tldCwKKwkJCQkJICB1OCBGcm9tV2hpY2hCU1NJRCkKIHsKLQlpZiAoVFJVRQotCQkpCi0JeworCWlmIChUUlVFKSB7CiAJCWFubm91bmNlXzgwMl8zX3BhY2tldChwQWQsIHBQYWNrZXQpOwotCX0KLQllbHNlCi0JewotCQkvLyByZWxlYXNlIHBhY2tldAorCX0gZWxzZSB7CisJCS8qIHJlbGVhc2UgcGFja2V0ICovCiAJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKIAl9CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3Nhbml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc2FuaXR5LmMKaW5kZXggN2Q1MzBmNi4uOGY5ZmQxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc2FuaXR5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc2FuaXR5LmMKQEAgLTM2LDE1ICszNiwxNSBAQAogKi8KICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAotZXh0ZXJuIFVDSEFSCUNJU0NPX09VSVtdOworZXh0ZXJuIHU4IENJU0NPX09VSVtdOwogCi1leHRlcm4gVUNIQVIJV1BBX09VSVtdOwotZXh0ZXJuIFVDSEFSCVJTTl9PVUlbXTsKLWV4dGVybiBVQ0hBUglXTUVfSU5GT19FTEVNW107Ci1leHRlcm4gVUNIQVIJV01FX1BBUk1fRUxFTVtdOwotZXh0ZXJuIFVDSEFSCUNjeDJRb3NJbmZvW107Ci1leHRlcm4gVUNIQVIJUkFMSU5LX09VSVtdOwotZXh0ZXJuIFVDSEFSCUJST0FEQ09NX09VSVtdOworZXh0ZXJuIHU4IFdQQV9PVUlbXTsKK2V4dGVybiB1OCBSU05fT1VJW107CitleHRlcm4gdTggV01FX0lORk9fRUxFTVtdOworZXh0ZXJuIHU4IFdNRV9QQVJNX0VMRU1bXTsKK2V4dGVybiB1OCBDY3gyUW9zSW5mb1tdOworZXh0ZXJuIHU4IFJBTElOS19PVUlbXTsKK2V4dGVybiB1OCBCUk9BRENPTV9PVUlbXTsKIAogLyoKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNTQsMjcgKzU0LDI1IEBACiAgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1CT09MRUFOIE1sbWVTdGFydFJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBDSEFSIFNzaWRbXSwKLSAgICBPVVQgVUNIQVIgKnBTc2lkTGVuKQorQk9PTEVBTiBNbG1lU3RhcnRSZXFTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdm9pZCAqIE1zZywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJICAgY2hhciBTc2lkW10sIHU4ICogcFNzaWRMZW4pCiB7Ci0gICAgTUxNRV9TVEFSVF9SRVFfU1RSVUNUICpJbmZvOworCXN0cnVjdCBydF9tbG1lX3N0YXJ0X3JlcSAqSW5mbzsKIAotICAgIEluZm8gPSAoTUxNRV9TVEFSVF9SRVFfU1RSVUNUICopKE1zZyk7CisJSW5mbyA9IChzdHJ1Y3QgcnRfbWxtZV9zdGFydF9yZXEgKikoTXNnKTsKIAotICAgIGlmIChJbmZvLT5Tc2lkTGVuID4gTUFYX0xFTl9PRl9TU0lEKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVN0YXJ0UmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBTU0lEIGxlbmd0aFxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorCWlmIChJbmZvLT5Tc2lkTGVuID4gTUFYX0xFTl9PRl9TU0lEKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiTWxtZVN0YXJ0UmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBTU0lEIGxlbmd0aFxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQogCi0gICAgKnBTc2lkTGVuID0gSW5mby0+U3NpZExlbjsKLSAgICBOZGlzTW92ZU1lbW9yeShTc2lkLCBJbmZvLT5Tc2lkLCAqcFNzaWRMZW4pOworCSpwU3NpZExlbiA9IEluZm8tPlNzaWRMZW47CisJTmRpc01vdmVNZW1vcnkoU3NpZCwgSW5mby0+U3NpZCwgKnBTc2lkTGVuKTsKIAotICAgIHJldHVybiBUUlVFOworCXJldHVybiBUUlVFOwogfQogCiAvKgpAQCAtODgsMjExICs4NiwxNjEgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLUJPT0xFQU4gUGVlckFzc29jUnNwU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKnBNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKLSAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAotICAgIE9VVCBVU0hPUlQgKnBBaWQsCi0gICAgT1VUIFVDSEFSIFN1cFJhdGVbXSwKLSAgICBPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAotICAgIE9VVCBVQ0hBUiBFeHRSYXRlW10sCi0gICAgT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKLSAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCi0gICAgT1VUIEFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0gICAgT1VUIFVDSEFSCQkJKnBIdENhcGFiaWxpdHlMZW4sCi0gICAgT1VUIFVDSEFSCQkJKnBBZGRIdEluZm9MZW4sCi0gICAgT1VUIFVDSEFSCQkJKnBOZXdFeHRDaGFubmVsT2Zmc2V0LAotICAgIE9VVCBQRURDQV9QQVJNIHBFZGNhUGFybSwKLSAgICBPVVQgVUNIQVIgKnBDa2lwRmxhZykKK0JPT0xFQU4gUGVlckFzc29jUnNwU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqIHBNc2csIHVuc2lnbmVkIGxvbmcgTXNnTGVuLCB1OCAqcEFkZHIyLCB1MTYgKiBwQ2FwYWJpbGl0eUluZm8sIHUxNiAqIHBTdGF0dXMsIHUxNiAqIHBBaWQsIHU4IFN1cFJhdGVbXSwgdTggKiBwU3VwUmF0ZUxlbiwgdTggRXh0UmF0ZVtdLCB1OCAqIHBFeHRSYXRlTGVuLCBzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSAqIHBIdENhcGFiaWxpdHksIHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSAqIHBBZGRIdEluZm8sCS8qIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRSAqLworCQkJICAgdTggKiBwSHRDYXBhYmlsaXR5TGVuLAorCQkJICAgdTggKiBwQWRkSHRJbmZvTGVuLAorCQkJICAgdTggKiBwTmV3RXh0Q2hhbm5lbE9mZnNldCwKKwkJCSAgIHN0cnVjdCBydF9lZGNhX3Bhcm0gKnBFZGNhUGFybSwgdTggKiBwQ2tpcEZsYWcpCiB7Ci0gICAgQ0hBUiAgICAgICAgICBJZVR5cGUsICpQdHI7Ci0gICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOwotICAgIFBFSURfU1RSVUNUICAgcEVpZDsKLSAgICBVTE9ORyAgICAgICAgIExlbmd0aCA9IDA7CisJY2hhciBJZVR5cGUsICpQdHI7CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIHBNc2c7CisJc3RydWN0IHJ0X2VpZCAqIHBFaWQ7CisJdW5zaWduZWQgbG9uZyBMZW5ndGggPSAwOwogCiAJKnBOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKIAkqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7CiAJKnBBZGRIdEluZm9MZW4gPSAwOwotICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7Ci0gICAgUHRyID0gcEZyYW1lLT5PY3RldDsKLSAgICBMZW5ndGggKz0gTEVOR1RIXzgwMl8xMTsKKwlDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOworCVB0ciA9IChjaGFyICopcEZyYW1lLT5PY3RldDsKKwlMZW5ndGggKz0gTEVOR1RIXzgwMl8xMTsKIAotICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOwotICAgIExlbmd0aCArPSAyOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsICAgICAgICAgJnBGcmFtZS0+T2N0ZXRbMl0sIDIpOwotICAgIExlbmd0aCArPSAyOwotICAgICpwQ2tpcEZsYWcgPSAwOwotICAgICpwRXh0UmF0ZUxlbiA9IDA7Ci0gICAgcEVkY2FQYXJtLT5iVmFsaWQgPSBGQUxTRTsKKwlOZGlzTW92ZU1lbW9yeShwQ2FwYWJpbGl0eUluZm8sICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKKwlMZW5ndGggKz0gMjsKKwlOZGlzTW92ZU1lbW9yeShwU3RhdHVzLCAmcEZyYW1lLT5PY3RldFsyXSwgMik7CisJTGVuZ3RoICs9IDI7CisJKnBDa2lwRmxhZyA9IDA7CisJKnBFeHRSYXRlTGVuID0gMDsKKwlwRWRjYVBhcm0tPmJWYWxpZCA9IEZBTFNFOwogCi0gICAgaWYgKCpwU3RhdHVzICE9IE1MTUVfU1VDQ0VTUykKLSAgICAgICAgcmV0dXJuIFRSVUU7CisJaWYgKCpwU3RhdHVzICE9IE1MTUVfU1VDQ0VTUykKKwkJcmV0dXJuIFRSVUU7CiAKLSAgICBOZGlzTW92ZU1lbW9yeShwQWlkLCAmcEZyYW1lLT5PY3RldFs0XSwgMik7Ci0gICAgTGVuZ3RoICs9IDI7CisJTmRpc01vdmVNZW1vcnkocEFpZCwgJnBGcmFtZS0+T2N0ZXRbNF0sIDIpOworCUxlbmd0aCArPSAyOwogCi0gICAgLy8gQWlkIGFscmVhZHkgc3dhcGVkIGJ5dGUgb3JkZXIgaW4gUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKCkgZm9yIGJpZyBlbmRpYW4gcGxhdGZvcm0KLSAgICAqcEFpZCA9ICgqcEFpZCkgJiAweDNmZmY7IC8vIEFJRCBpcyBsb3cgMTQtYml0CisJLyogQWlkIGFscmVhZHkgc3dhcGVkIGJ5dGUgb3JkZXIgaW4gUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKCkgZm9yIGJpZyBlbmRpYW4gcGxhdGZvcm0gKi8KKwkqcEFpZCA9ICgqcEFpZCkgJiAweDNmZmY7CS8qIEFJRCBpcyBsb3cgMTQtYml0ICovCiAKLSAgICAvLyAtLSBnZXQgc3VwcG9ydGVkIHJhdGVzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIEllVHlwZSA9IHBGcmFtZS0+T2N0ZXRbNl07Ci0gICAgKnBTdXBSYXRlTGVuID0gcEZyYW1lLT5PY3RldFs3XTsKLSAgICBpZiAoKEllVHlwZSAhPSBJRV9TVVBQX1JBVEVTKSB8fCAoKnBTdXBSYXRlTGVuID4gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwU2FuaXR5IGZhaWwgLSB3cm9uZyBTdXBwb3J0ZWRSYXRlcyBJRVxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgJnBGcmFtZS0+T2N0ZXRbOF0sICpwU3VwUmF0ZUxlbik7CisJLyogLS0gZ2V0IHN1cHBvcnRlZCByYXRlcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIgKi8KKwlJZVR5cGUgPSBwRnJhbWUtPk9jdGV0WzZdOworCSpwU3VwUmF0ZUxlbiA9IHBGcmFtZS0+T2N0ZXRbN107CisJaWYgKChJZVR5cGUgIT0gSUVfU1VQUF9SQVRFUykKKwkgICAgfHwgKCpwU3VwUmF0ZUxlbiA+IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlBlZXJBc3NvY1JzcFNhbml0eSBmYWlsIC0gd3JvbmcgU3VwcG9ydGVkUmF0ZXMgSUVcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0gZWxzZQorCQlOZGlzTW92ZU1lbW9yeShTdXBSYXRlLCAmcEZyYW1lLT5PY3RldFs4XSwgKnBTdXBSYXRlTGVuKTsKIAotICAgIExlbmd0aCA9IExlbmd0aCArIDIgKyAqcFN1cFJhdGVMZW47CisJTGVuZ3RoID0gTGVuZ3RoICsgMiArICpwU3VwUmF0ZUxlbjsKIAotICAgIC8vIG1hbnkgQVAgaW1wbGVtZW50IHByb3ByaWV0YXJ5IElFcyBpbiBub24tc3RhbmRhcmQgb3JkZXIsIHdlJ2QgYmV0dGVyCi0gICAgLy8gdG9sZXJhdGUgbWlzLW9yZGVyZWQgSUVzIHRvIGdldCBiZXN0IGNvbXBhdGliaWxpdHkKLSAgICBwRWlkID0gKFBFSURfU1RSVUNUKSAmcEZyYW1lLT5PY3RldFs4ICsgKCpwU3VwUmF0ZUxlbildOworCS8qIG1hbnkgQVAgaW1wbGVtZW50IHByb3ByaWV0YXJ5IElFcyBpbiBub24tc3RhbmRhcmQgb3JkZXIsIHdlJ2QgYmV0dGVyICovCisJLyogdG9sZXJhdGUgbWlzLW9yZGVyZWQgSUVzIHRvIGdldCBiZXN0IGNvbXBhdGliaWxpdHkgKi8KKwlwRWlkID0gKHN0cnVjdCBydF9laWQgKikgJiBwRnJhbWUtPk9jdGV0WzggKyAoKnBTdXBSYXRlTGVuKV07CiAKLSAgICAvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIHdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChwRWlkLT5FaWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgSUVfRVhUX1NVUFBfUkFURVM6Ci0gICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEV4dFJhdGUsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOwotICAgICAgICAgICAgICAgICAgICAqcEV4dFJhdGVMZW4gPSBwRWlkLT5MZW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOworCS8qIGdldCB2YXJpYWJsZSBmaWVsZHMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyICovCisJd2hpbGUgKChMZW5ndGggKyAyICsgcEVpZC0+TGVuKSA8PSBNc2dMZW4pIHsKKwkJc3dpdGNoIChwRWlkLT5FaWQpIHsKKwkJY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKKwkJCWlmIChwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShFeHRSYXRlLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKwkJCQkqcEV4dFJhdGVMZW4gPSBwRWlkLT5MZW47CisJCQl9CisJCQlicmVhazsKIAotICAgICAgICAgICAgIGNhc2UgSUVfSFRfQ0FQOgotICAgICAgICAgICAgY2FzZSBJRV9IVF9DQVAyOgotCQkJaWYgKHBFaWQtPkxlbiA+PSBTSVpFX0hUX0NBUF9JRSkgIC8vTm90ZTogYWxsb3cgZXh0ZW5zaW9uLiEhCisJCWNhc2UgSUVfSFRfQ0FQOgorCQljYXNlIElFX0hUX0NBUDI6CisJCQlpZiAocEVpZC0+TGVuID49IFNJWkVfSFRfQ0FQX0lFKQkvKk5vdGU6IGFsbG93IGV4dGVuc2lvbiEgKi8KIAkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBwRWlkLT5PY3RldCwgU0laRV9IVF9DQVBfSUUpOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksIHBFaWQtPk9jdGV0LAorCQkJCQkgICAgICAgU0laRV9IVF9DQVBfSUUpOwogCi0JCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSk7Ci0JCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7CisJCQkJKih1MTYgKikgKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pID0KKwkJCQkgICAgY3B1MmxlMTYoKih1MTYgKikKKwkJCQkJICAgICAoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykpOworCQkJCSoodTE2ICopICgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9CisJCQkJICAgIGNwdTJsZTE2KCoodTE2ICopCisJCQkJCSAgICAgKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKIAogCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSB3cm9uZyBJRV9IVF9DQVAuIFxuIikpOworCQkJfSBlbHNlIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLAorCQkJCQkgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSB3cm9uZyBJRV9IVF9DQVAuIFxuIikpOwogCQkJfQogCi0JCWJyZWFrOwotICAgICAgICAgICAgY2FzZSBJRV9BRERfSFQ6Ci0gICAgICAgICAgICBjYXNlIElFX0FERF9IVDI6Ci0JCQlpZiAocEVpZC0+TGVuID49IHNpemVvZihBRERfSFRfSU5GT19JRSkpCi0JCQl7Ci0JCQkJLy8gVGhpcyBJRSBhbGxvd3MgZXh0ZW5zaW9uLCBidXQgd2UgY2FuIGlnbm9yZSBleHRyYSBieXRlcyBiZXlvbmQgb3VyIGtub3dsZWRnZSAsIHNvIG9ubHkKLQkJCQkvLyBjb3B5IGZpcnN0IHNpemVvZihBRERfSFRfSU5GT19JRSkKLQkJCQlOZGlzTW92ZU1lbW9yeShwQWRkSHRJbmZvLCBwRWlkLT5PY3RldCwgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisJCQlicmVhazsKKwkJY2FzZSBJRV9BRERfSFQ6CisJCWNhc2UgSUVfQUREX0hUMjoKKwkJCWlmIChwRWlkLT5MZW4gPj0gc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkpIHsKKwkJCQkvKiBUaGlzIElFIGFsbG93cyBleHRlbnNpb24sIGJ1dCB3ZSBjYW4gaWdub3JlIGV4dHJhIGJ5dGVzIGJleW9uZCBvdXIga25vd2xlZGdlICwgc28gb25seSAqLworCQkJCS8qIGNvcHkgZmlyc3Qgc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkgKi8KKwkJCQlOZGlzTW92ZU1lbW9yeShwQWRkSHRJbmZvLCBwRWlkLT5PY3RldCwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUpKTsKIAotCQkJCSooVVNIT1JUICopKCZwQWRkSHRJbmZvLT5BZGRIdEluZm8yKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkSHRJbmZvLT5BZGRIdEluZm8yKSk7Ci0JCQkJKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzMpID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzMpKTsKKwkJCQkqKHUxNiAqKSAoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzIpID0KKwkJCQkgICAgY3B1MmxlMTYoKih1MTYgKikKKwkJCQkJICAgICAoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzIpKTsKKwkJCQkqKHUxNiAqKSAoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzMpID0KKwkJCQkgICAgY3B1MmxlMTYoKih1MTYgKikKKwkJCQkJICAgICAoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzMpKTsKIAogCQkJCSpwQWRkSHRJbmZvTGVuID0gU0laRV9BRERfSFRfSU5GT19JRTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIHdyb25nIElFX0FERF9IVC4gXG4iKSk7CisJCQl9IGVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkJCSAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIHdyb25nIElFX0FERF9IVC4gXG4iKSk7CiAJCQl9CiAKLQkJYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElFX1NFQ09OREFSWV9DSF9PRkZTRVQ6Ci0JCQlpZiAocEVpZC0+TGVuID09IDEpCi0JCQl7CisJCQlicmVhazsKKwkJY2FzZSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUOgorCQkJaWYgKHBFaWQtPkxlbiA9PSAxKSB7CiAJCQkJKnBOZXdFeHRDaGFubmVsT2Zmc2V0ID0gcEVpZC0+T2N0ZXRbMF07CisJCQl9IGVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkJCSAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIHdyb25nIElFX1NFQ09OREFSWV9DSF9PRkZTRVQuIFxuIikpOwogCQkJfQotCQkJZWxzZQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckFzc29jUnNwU2FuaXR5IC0gd3JvbmcgSUVfU0VDT05EQVJZX0NIX09GRlNFVC4gXG4iKSk7CisJCQlicmVhazsKKworCQljYXNlIElFX1ZFTkRPUl9TUEVDSUZJQzoKKwkJCS8qIGhhbmRsZSBXTUUgUEFSQU1URVIgRUxFTUVOVCAqLworCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV01FX1BBUk1fRUxFTSwgNikKKwkJCSAgICAmJiAocEVpZC0+TGVuID09IDI0KSkgeworCQkJCXU4ICpwdHI7CisJCQkJaW50IGk7CisKKwkJCQkvKiBwYXJzaW5nIEVEQ0EgcGFyYW1ldGVycyAqLworCQkJCXBFZGNhUGFybS0+YlZhbGlkID0gVFJVRTsKKwkJCQlwRWRjYVBhcm0tPmJRQWNrID0gRkFMU0U7CS8qIHBFaWQtPk9jdGV0WzBdICYgMHgxMDsgKi8KKwkJCQlwRWRjYVBhcm0tPmJRdWV1ZVJlcXVlc3QgPSBGQUxTRTsJLyogcEVpZC0+T2N0ZXRbMF0gJiAweDIwOyAqLworCQkJCXBFZGNhUGFybS0+YlR4b3BSZXF1ZXN0ID0gRkFMU0U7CS8qIHBFaWQtPk9jdGV0WzBdICYgMHg0MDsgKi8KKwkJCQkvKnBFZGNhUGFybS0+Yk1vcmVEYXRhQWNrICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg4MDsgKi8KKwkJCQlwRWRjYVBhcm0tPkVkY2FVcGRhdGVDb3VudCA9CisJCQkJICAgIHBFaWQtPk9jdGV0WzZdICYgMHgwZjsKKwkJCQlwRWRjYVBhcm0tPmJBUFNEQ2FwYWJsZSA9CisJCQkJICAgIChwRWlkLT5PY3RldFs2XSAmIDB4ODApID8gMSA6IDA7CisJCQkJcHRyID0gKHU4ICopJiBwRWlkLT5PY3RldFs4XTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQkJCXU4IGFjaSA9ICgqcHRyICYgMHg2MCkgPj4gNTsJLyogYjV+NiBpcyBBQyBJTkRFWCAqLworCQkJCQlwRWRjYVBhcm0tPmJBQ01bYWNpXSA9ICgoKCpwdHIpICYgMHgxMCkgPT0gMHgxMCk7CS8qIGI1IGlzIEFDTSAqLworCQkJCQlwRWRjYVBhcm0tPkFpZnNuW2FjaV0gPSAoKnB0cikgJiAweDBmOwkvKiBiMH4zIGlzIEFJRlNOICovCisJCQkJCXBFZGNhUGFybS0+Q3dtaW5bYWNpXSA9ICoocHRyICsgMSkgJiAweDBmOwkvKiBiMH40IGlzIEN3bWluICovCisJCQkJCXBFZGNhUGFybS0+Q3dtYXhbYWNpXSA9ICoocHRyICsgMSkgPj4gNDsJLyogYjV+OCBpcyBDd21heCAqLworCQkJCQlwRWRjYVBhcm0tPlR4b3BbYWNpXSA9ICoocHRyICsgMikgKyAyNTYgKiAoKihwdHIgKyAzKSk7CS8qIGluIHVuaXQgb2YgMzItdXMgKi8KKwkJCQkJcHRyICs9IDQ7CS8qIHBvaW50IHRvIG5leHQgQUMgKi8KKwkJCQl9CiAJCQl9Ci0JCWJyZWFrOwotICAgICAgICAgICAgY2FzZSBJRV9BSVJPTkVUX0NLSVA6Ci0gICAgICAgICAgICAgICAgLy8gMC4gQ2hlY2sgQWlyb25ldCBJRSBsZW5ndGgsIGl0IG11c3QgYmUgbGFyZ2VyIG9yIGVxdWFsIHRvIDI4Ci0gICAgICAgICAgICAgICAgLy8gICAgQ2lzY28ncyBBUCBWeFdvcmsgdmVyc2lvbih3aWxsIG5vdCBiZSBzdXBwb3J0ZWQpIHVzZWQgdGhpcyBJRSBsZW5ndGggYXMgMjgKLSAgICAgICAgICAgICAgICAvLyAgICBDaXNjbydzIEFQIElPUyB2ZXJzaW9uIHVzZWQgdGhpcyBJRSBsZW5ndGggYXMgMzAKLSAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDwgKENLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMikpCi0gICAgICAgICAgICAgICAgYnJlYWs7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIGlnbm9yZSB1bnJlY29nbml6ZWQgRUlEID0gJWRcbiIsCisJCQkJICBwRWlkLT5FaWQpKTsKKwkJCWJyZWFrOworCQl9CiAKLSAgICAgICAgICAgICAgICAvLyAxLiBDb3B5IENLSVAgZmxhZyBieXRlIHRvIGJ1ZmZlciBmb3IgcHJvY2VzcwotICAgICAgICAgICAgICAgICpwQ2tpcEZsYWcgPSAqKHBFaWQtPk9jdGV0ICsgOCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCUxlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47CisJCXBFaWQgPSAoc3RydWN0IHJ0X2VpZCAqKSAoKHU4ICopIHBFaWQgKyAyICsgcEVpZC0+TGVuKTsKKwl9CiAKLSAgICAgICAgICAgIGNhc2UgSUVfQUlST05FVF9JUEFERFJFU1M6Ci0gICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiAhPSAweDBBKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgLy8gR2V0IENpc2NvIEFpcm9uZXQgSVAgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBDSVNDT19PVUksIDMpID09IDEpCi0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkFpcm9uZXRJUEFkZHJlc3MsIHBFaWQtPk9jdGV0ICsgNCwgNCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8vIENDWDIsIFdNTSB1c2UgdGhlIHNhbWUgSUUgdmFsdWUKLSAgICAgICAgICAgIC8vIGNhc2UgSUVfQ0NYX1YyOgotICAgICAgICAgICAgY2FzZSBJRV9WRU5ET1JfU1BFQ0lGSUM6Ci0gICAgICAgICAgICAgICAgLy8gaGFuZGxlIFdNRSBQQVJBTVRFUiBFTEVNRU5UCi0gICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV01FX1BBUk1fRUxFTSwgNikgJiYgKHBFaWQtPkxlbiA9PSAyNCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBQVUNIQVIgcHRyOwotICAgICAgICAgICAgICAgICAgICBpbnQgaTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBwYXJzaW5nIEVEQ0EgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJWYWxpZCAgICAgICAgICA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlFBY2sgICAgICAgICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgxMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUXVldWVSZXF1ZXN0ICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDIwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJUeG9wUmVxdWVzdCAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4NDA7Ci0gICAgICAgICAgICAgICAgICAgIC8vcEVkY2FQYXJtLT5iTW9yZURhdGFBY2sgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDgwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkVkY2FVcGRhdGVDb3VudCA9IHBFaWQtPk9jdGV0WzZdICYgMHgwZjsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQVBTRENhcGFibGUgICAgPSAocEVpZC0+T2N0ZXRbNl0gJiAweDgwKSA/IDEgOiAwOwotICAgICAgICAgICAgICAgICAgICBwdHIgPSAmcEVpZC0+T2N0ZXRbOF07Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgYWNpID0gKCpwdHIgJiAweDYwKSA+PiA1OyAvLyBiNX42IGlzIEFDIElOREVYCi0gICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bYWNpXSAgPSAoKCgqcHRyKSAmIDB4MTApID09IDB4MTApOyAgIC8vIGI1IGlzIEFDTQotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzblthY2ldID0gKCpwdHIpICYgMHgwZjsgICAgICAgICAgICAgICAvLyBiMH4zIGlzIEFJRlNOCi0gICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW2FjaV0gPSAqKHB0cisxKSAmIDB4MGY7ICAgICAgICAgICAgIC8vIGIwfjQgaXMgQ3dtaW4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbYWNpXSA9ICoocHRyKzEpID4+IDQ7ICAgICAgICAgICAgICAgLy8gYjV+OCBpcyBDd21heAotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW2FjaV0gID0gKihwdHIrMikgKyAyNTYgKiAoKihwdHIrMykpOyAvLyBpbiB1bml0IG9mIDMyLXVzCi0gICAgICAgICAgICAgICAgICAgICAgICBwdHIgKz0gNDsgLy8gcG9pbnQgdG8gbmV4dCBBQwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gaGFuZGxlIENDWCBJRQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIDAuIENoZWNrIHRoZSBzaXplIGFuZCBDQ1ggYWRtaW4gY29udHJvbAotICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5FbmFibGUgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuICE9IDUpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAvLyBUdXJuIENDWDIgaWYgbWF0Y2hlZAotICAgICAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBDY3gySWVJbmZvLCA1KSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQ0NYRW5hYmxlID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIGlnbm9yZSB1bnJlY29nbml6ZWQgRUlEID0gJWRcbiIsIHBFaWQtPkVpZCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgTGVuZ3RoID0gTGVuZ3RoICsgMiArIHBFaWQtPkxlbjsKLSAgICAgICAgcEVpZCA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKilwRWlkICsgMiArIHBFaWQtPkxlbik7Ci0gICAgfQotCi0gICAgLy8gRm9yY2UgQ0NYMiBlbmFibGUgdG8gVFJVRSBmb3IgdGhvc2UgQVAgZGlkbid0IHJlcGxheSBDQ1ggdjIgSUUsIHdlIHN0aWxsIGZvcmNlIGl0IHRvIGJlIG9uCi0gICAgaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuRW5hYmxlID09IDEpCi0gICAgICAgIHBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IFRSVUU7Ci0KLSAgICByZXR1cm4gVFJVRTsKKwlyZXR1cm4gVFJVRTsKIH0KIAogLyoKQEAgLTMwNiw0NyArMjU0LDQ2IEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1CT09MRUFOIFBlZXJQcm9iZVJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBDSEFSIFNzaWRbXSwKLSAgICBPVVQgVUNIQVIgKnBTc2lkTGVuKQorQk9PTEVBTiBQZWVyUHJvYmVSZXFTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdm9pZCAqIE1zZywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJICAgdTggKnBBZGRyMiwKKwkJCSAgIGNoYXIgU3NpZFtdLCB1OCAqIHBTc2lkTGVuKQogewotICAgIFVDSEFSICAgICAgICAgSWR4OwotICAgIFVDSEFSCSAgICAgIFJhdGVMZW47Ci0gICAgQ0hBUiAgICAgICAgICBJZVR5cGU7Ci0gICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisJdTggSWR4OworCXU4IFJhdGVMZW47CisJY2hhciBJZVR5cGU7CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIE1zZzsKIAotICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisJQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKIAotICAgIGlmICgocEZyYW1lLT5PY3RldFswXSAhPSBJRV9TU0lEKSB8fCAocEZyYW1lLT5PY3RldFsxXSA+IE1BWF9MRU5fT0ZfU1NJRCkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyUHJvYmVSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFNTSUQgSUUoVHlwZT0lZCxMZW49JWQpXG4iLHBGcmFtZS0+T2N0ZXRbMF0scEZyYW1lLT5PY3RldFsxXSkpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorCWlmICgocEZyYW1lLT5PY3RldFswXSAhPSBJRV9TU0lEKQorCSAgICB8fCAocEZyYW1lLT5PY3RldFsxXSA+IE1BWF9MRU5fT0ZfU1NJRCkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJQZWVyUHJvYmVSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFNTSUQgSUUoVHlwZT0lZCxMZW49JWQpXG4iLAorCQkJICBwRnJhbWUtPk9jdGV0WzBdLCBwRnJhbWUtPk9jdGV0WzFdKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CiAKLSAgICAqcFNzaWRMZW4gPSBwRnJhbWUtPk9jdGV0WzFdOwotICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQsICZwRnJhbWUtPk9jdGV0WzJdLCAqcFNzaWRMZW4pOworCSpwU3NpZExlbiA9IHBGcmFtZS0+T2N0ZXRbMV07CisJTmRpc01vdmVNZW1vcnkoU3NpZCwgJnBGcmFtZS0+T2N0ZXRbMl0sICpwU3NpZExlbik7CiAKLSAgICBJZHggPSAqcFNzaWRMZW4gKyAyOworCUlkeCA9ICpwU3NpZExlbiArIDI7CiAKLSAgICAvLyAtLSBnZXQgc3VwcG9ydGVkIHJhdGVzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIEllVHlwZSA9IHBGcmFtZS0+T2N0ZXRbSWR4XTsKLSAgICBSYXRlTGVuID0gcEZyYW1lLT5PY3RldFtJZHggKyAxXTsKLSAgICBpZiAoSWVUeXBlICE9IElFX1NVUFBfUkFURVMpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyUHJvYmVSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFN1cHBvcnRSYXRlcyBJRShUeXBlPSVkLExlbj0lZClcbiIscEZyYW1lLT5PY3RldFtJZHhdLHBGcmFtZS0+T2N0ZXRbSWR4KzFdKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUcpICYmIChSYXRlTGVuIDwgOCkpCi0gICAgICAgICAgICByZXR1cm4gKEZBTFNFKTsKLSAgICB9CisJLyogLS0gZ2V0IHN1cHBvcnRlZCByYXRlcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIgKi8KKwlJZVR5cGUgPSBwRnJhbWUtPk9jdGV0W0lkeF07CisJUmF0ZUxlbiA9IHBGcmFtZS0+T2N0ZXRbSWR4ICsgMV07CisJaWYgKEllVHlwZSAhPSBJRV9TVVBQX1JBVEVTKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUGVlclByb2JlUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBTdXBwb3J0UmF0ZXMgSUUoVHlwZT0lZCxMZW49JWQpXG4iLAorCQkJICBwRnJhbWUtPk9jdGV0W0lkeF0sIHBGcmFtZS0+T2N0ZXRbSWR4ICsgMV0pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0gZWxzZSB7CisJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFHKSAmJiAoUmF0ZUxlbiA8IDgpKQorCQkJcmV0dXJuIChGQUxTRSk7CisJfQogCi0gICAgcmV0dXJuIFRSVUU7CisJcmV0dXJuIFRSVUU7CiB9CiAKIC8qCkBAIC0zNTcsNjIgKzMwNCw1OCBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotQk9PTEVBTiBHZXRUaW1CaXQoCi0gICAgSU4gQ0hBUiAqUHRyLAotICAgIElOIFVTSE9SVCBBaWQsCi0gICAgT1VUIFVDSEFSICpUaW1MZW4sCi0gICAgT1VUIFVDSEFSICpCY2FzdEZsYWcsCi0gICAgT1VUIFVDSEFSICpEdGltQ291bnQsCi0gICAgT1VUIFVDSEFSICpEdGltUGVyaW9kLAotICAgIE9VVCBVQ0hBUiAqTWVzc2FnZVRvTWUpCitCT09MRUFOIEdldFRpbUJpdChjaGFyICogUHRyLAorCQkgIHUxNiBBaWQsCisJCSAgdTggKiBUaW1MZW4sCisJCSAgdTggKiBCY2FzdEZsYWcsCisJCSAgdTggKiBEdGltQ291bnQsCisJCSAgdTggKiBEdGltUGVyaW9kLCB1OCAqIE1lc3NhZ2VUb01lKQogewotICAgIFVDSEFSICAgICAgICAgIEJpdENudGwsIE4xLCBOMiwgTXlCeXRlLCBNeUJpdDsKLSAgICBDSEFSICAgICAgICAgICpJZHhQdHI7CisJdTggQml0Q250bCwgTjEsIE4yLCBNeUJ5dGUsIE15Qml0OworCWNoYXIgKklkeFB0cjsKIAotICAgIElkeFB0ciA9IFB0cjsKKwlJZHhQdHIgPSBQdHI7CiAKLSAgICBJZHhQdHIgKys7Ci0gICAgKlRpbUxlbiA9ICpJZHhQdHI7CisJSWR4UHRyKys7CisJKlRpbUxlbiA9ICpJZHhQdHI7CiAKLSAgICAvLyBnZXQgRFRJTSBDb3VudCBmcm9tIFRJTSBlbGVtZW50Ci0gICAgSWR4UHRyICsrOwotICAgICpEdGltQ291bnQgPSAqSWR4UHRyOworCS8qIGdldCBEVElNIENvdW50IGZyb20gVElNIGVsZW1lbnQgKi8KKwlJZHhQdHIrKzsKKwkqRHRpbUNvdW50ID0gKklkeFB0cjsKIAotICAgIC8vIGdldCBEVElNIFBlcmlvZCBmcm9tIFRJTSBlbGVtZW50Ci0gICAgSWR4UHRyKys7Ci0gICAgKkR0aW1QZXJpb2QgPSAqSWR4UHRyOworCS8qIGdldCBEVElNIFBlcmlvZCBmcm9tIFRJTSBlbGVtZW50ICovCisJSWR4UHRyKys7CisJKkR0aW1QZXJpb2QgPSAqSWR4UHRyOwogCi0gICAgLy8gZ2V0IEJpdG1hcCBDb250cm9sIGZyb20gVElNIGVsZW1lbnQKLSAgICBJZHhQdHIrKzsKLSAgICBCaXRDbnRsID0gKklkeFB0cjsKKwkvKiBnZXQgQml0bWFwIENvbnRyb2wgZnJvbSBUSU0gZWxlbWVudCAqLworCUlkeFB0cisrOworCUJpdENudGwgPSAqSWR4UHRyOwogCi0gICAgaWYgKCgqRHRpbUNvdW50ID09IDApICYmIChCaXRDbnRsICYgMHgwMSkpCi0gICAgICAgICpCY2FzdEZsYWcgPSBUUlVFOwotICAgIGVsc2UKLSAgICAgICAgKkJjYXN0RmxhZyA9IEZBTFNFOworCWlmICgoKkR0aW1Db3VudCA9PSAwKSAmJiAoQml0Q250bCAmIDB4MDEpKQorCQkqQmNhc3RGbGFnID0gVFJVRTsKKwllbHNlCisJCSpCY2FzdEZsYWcgPSBGQUxTRTsKIAotICAgIC8vIFBhcnNlIFBhcnRpYWwgVmlydHVhbCBCaXRtYXAgZnJvbSBUSU0gZWxlbWVudAotICAgIE4xID0gQml0Q250bCAmIDB4ZmU7ICAgIC8vIE4xIGlzIHRoZSBmaXJzdCBiaXRtYXAgYnl0ZSMKLSAgICBOMiA9ICpUaW1MZW4gLSA0ICsgTjE7ICAvLyBOMiBpcyB0aGUgbGFzdCBiaXRtYXAgYnl0ZSMKKwkvKiBQYXJzZSBQYXJ0aWFsIFZpcnR1YWwgQml0bWFwIGZyb20gVElNIGVsZW1lbnQgKi8KKwlOMSA9IEJpdENudGwgJiAweGZlOwkvKiBOMSBpcyB0aGUgZmlyc3QgYml0bWFwIGJ5dGUjICovCisJTjIgPSAqVGltTGVuIC0gNCArIE4xOwkvKiBOMiBpcyB0aGUgbGFzdCBiaXRtYXAgYnl0ZSMgKi8KIAotICAgIGlmICgoQWlkIDwgKE4xIDw8IDMpKSB8fCAoQWlkID49ICgoTjIgKyAxKSA8PCAzKSkpCi0gICAgICAgICpNZXNzYWdlVG9NZSA9IEZBTFNFOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE15Qnl0ZSA9IChBaWQgPj4gMykgLSBOMTsgICAgICAgICAgICAgICAgICAgICAgIC8vIG15IGJ5dGUgcG9zaXRpb24gaW4gdGhlIGJpdG1hcCBieXRlLXN0cmVhbQotICAgICAgICBNeUJpdCA9IEFpZCAlIDE2IC0gKChNeUJ5dGUgJiAweDAxKT8gODowKTsKKwlpZiAoKEFpZCA8IChOMSA8PCAzKSkgfHwgKEFpZCA+PSAoKE4yICsgMSkgPDwgMykpKQorCQkqTWVzc2FnZVRvTWUgPSBGQUxTRTsKKwllbHNlIHsKKwkJTXlCeXRlID0gKEFpZCA+PiAzKSAtIE4xOwkvKiBteSBieXRlIHBvc2l0aW9uIGluIHRoZSBiaXRtYXAgYnl0ZS1zdHJlYW0gKi8KKwkJTXlCaXQgPSBBaWQgJSAxNiAtICgoTXlCeXRlICYgMHgwMSkgPyA4IDogMCk7CiAKLSAgICAgICAgSWR4UHRyICs9IChNeUJ5dGUgKyAxKTsKKwkJSWR4UHRyICs9IChNeUJ5dGUgKyAxKTsKIAotICAgICAgICAvL2lmICgqSWR4UHRyKQotICAgICAgICAvLyAgICBEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlRJTSBiaXRtYXAgPSAweCUwMnhcbiIsICpJZHhQdHIpKTsKKwkJLyppZiAoKklkeFB0cikgKi8KKwkJLyogICAgREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJUSU0gYml0bWFwID0gMHglMDJ4XG4iLCAqSWR4UHRyKSk7ICovCiAKLSAgICAgICAgaWYgKCpJZHhQdHIgJiAoMHgwMSA8PCBNeUJpdCkpCi0gICAgICAgICAgICAqTWVzc2FnZVRvTWUgPSBUUlVFOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAqTWVzc2FnZVRvTWUgPSBGQUxTRTsKLSAgICB9CisJCWlmICgqSWR4UHRyICYgKDB4MDEgPDwgTXlCaXQpKQorCQkJKk1lc3NhZ2VUb01lID0gVFJVRTsKKwkJZWxzZQorCQkJKk1lc3NhZ2VUb01lID0gRkFMU0U7CisJfQogCi0gICAgcmV0dXJuIFRSVUU7CisJcmV0dXJuIFRSVUU7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3N5bmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3N5bmMuYwppbmRleCBhNmU0MzYyLi5jYmU5MGE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zeW5jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc3luYy5jCkBAIC0zNyw0NSArMzcsNyBAQAogKi8KICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAotI2lmZGVmIFJUMjg2MAotI2RlZmluZSBBQzBfREVGX1RYT1AJCTAKLSNkZWZpbmUgQUMxX0RFRl9UWE9QCQkwCi0jZGVmaW5lIEFDMl9ERUZfVFhPUAkJOTQKLSNkZWZpbmUgQUMzX0RFRl9UWE9QCQk0NwotCi1WT0lECUFkaG9jVHVybk9uUW9zKAotCUlOICBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQkvLyBUdXJuIG9uIFFPcyBpZiB1c2UgSFQgcmF0ZS4KLQlpZiAocEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPT0gRkFMU0UpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9IFRSVUU7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMF0gPSAzOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzFdID0gNzsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblsyXSA9IDE7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bM10gPSAxOwotCi0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMF0gPSA0OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzFdID0gNDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblsyXSA9IDM7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bM10gPSAyOwotCi0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMF0gPSAxMDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsxXSA9IDY7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMl0gPSA0OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzNdID0gMzsKLQotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMF0gID0gMDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzFdICA9IDA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFsyXSAgPSBBQzJfREVGX1RYT1A7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFszXSAgPSBBQzNfREVGX1RYT1A7Ci0JfQotCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKLX0KLSNlbmRpZiAvKiBSVDI4NjAgKi8KLSNpZmRlZiBSVDI4NzAKLSNkZWZpbmUgQURIT0NfRU5UUllfQkVBQ09OX0xPU1RfVElNRQkoMipPU19IWikJLy8gMiBzZWMKLSNlbmRpZgorI2RlZmluZSBBREhPQ19FTlRSWV9CRUFDT05fTE9TVF9USU1FCSgyKk9TX0haKQkvKiAyIHNlYyAqLwogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC04OCwzOCArNTAsNTYgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgU3luY1N0YXRlTWFjaGluZUluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gU1RBVEVfTUFDSElORSAqU20sCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQordm9pZCBTeW5jU3RhdGVNYWNoaW5lSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTbSwgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQogewotCVN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfU1lOQ19TVEFURSwgTUFYX1NZTkNfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIFNZTkNfSURMRSwgU1lOQ19NQUNISU5FX0JBU0UpOworCVN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfU1lOQ19TVEFURSwgTUFYX1NZTkNfTVNHLAorCQkJIChTVEFURV9NQUNISU5FX0ZVTkMpIERyb3AsIFNZTkNfSURMRSwKKwkJCSBTWU5DX01BQ0hJTkVfQkFTRSk7CiAKLQkvLyBjb2x1bW4gMQotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfTUxNRV9TQ0FOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lU2NhblJlcUFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9NTE1FX0pPSU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVKb2luUmVxQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX01MTUVfU1RBUlRfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVTdGFydFJlcUFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9QRUVSX0JFQUNPTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQmVhY29uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX1BFRVJfUFJPQkVfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJQcm9iZVJlcUFjdGlvbik7CisJLyogY29sdW1uIDEgKi8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX01MTUVfU0NBTl9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBNbG1lU2NhblJlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9NTE1FX0pPSU5fUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgTWxtZUpvaW5SZXFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfTUxNRV9TVEFSVF9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBNbG1lU3RhcnRSZXFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfUEVFUl9CRUFDT04sCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBQZWVyQmVhY29uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX1BFRVJfUFJPQkVfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlclByb2JlUmVxQWN0aW9uKTsKIAotCS8vY29sdW1uIDIKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX1NDQU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TY2FuKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX0pPSU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Kb2luKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX1NUQVJUX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU3RhcnQpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX1BFRVJfQkVBQ09OLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb25BdEpvaW5BY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX0JFQUNPTl9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24pOworCS8qY29sdW1uIDIgKi8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX1NDQU5fUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgSW52YWxpZFN0YXRlV2hlblNjYW4pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX01MTUVfSk9JTl9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBJbnZhbGlkU3RhdGVXaGVuSm9pbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfTUxNRV9TVEFSVF9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBJbnZhbGlkU3RhdGVXaGVuU3RhcnQpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX1BFRVJfQkVBQ09OLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlckJlYWNvbkF0Sm9pbkFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfQkVBQ09OX1RJTUVPVVQsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uKTsKIAotCS8vIGNvbHVtbiAzCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfU0NBTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblNjYW4pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9NTE1FX0pPSU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Kb2luKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfTUxNRV9TVEFSVF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblN0YXJ0KTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfUEVFUl9CRUFDT04sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJlYWNvbkF0U2NhbkFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX1BFRVJfUFJPQkVfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb25BdFNjYW5BY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9TQ0FOX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpU2NhblRpbWVvdXRBY3Rpb24pOworCS8qIGNvbHVtbiAzICovCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfU0NBTl9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBJbnZhbGlkU3RhdGVXaGVuU2Nhbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfSk9JTl9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBJbnZhbGlkU3RhdGVXaGVuSm9pbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfU1RBUlRfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgSW52YWxpZFN0YXRlV2hlblN0YXJ0KTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfUEVFUl9CRUFDT04sCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfUEVFUl9QUk9CRV9SU1AsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfU0NBTl9USU1FT1VULAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgU2NhblRpbWVvdXRBY3Rpb24pOwogCi0JLy8gdGltZXIgaW5pdAotCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQmVhY29uVGltZW91dCksIHBBZCwgRkFMU0UpOwotCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KSwgcEFkLCBGQUxTRSk7CisJLyogdGltZXIgaW5pdCAqLworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLAorCQkgICAgICBHRVRfVElNRVJfRlVOQ1RJT04oQmVhY29uVGltZW91dCksIHBBZCwgRkFMU0UpOworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwKKwkJICAgICAgR0VUX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KSwgcEFkLCBGQUxTRSk7CiB9CiAKIC8qCkBAIC0xMzEsMzYgKzExMSwzNSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBCZWFjb25UaW1lb3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3ZvaWQgQmVhY29uVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSAgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpCiB7Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTWU5DIC0gQmVhY29uVGltZW91dFxuIikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCZWFjb25UaW1lb3V0XG4iKSk7CiAKLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4gKi8KKwkvKiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQgKi8KIAlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQogCQlyZXR1cm47CiAKIAlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKLQkJKQotCXsKLQkJVUNIQVIgICAgICAgIEJCUFZhbHVlID0gMDsKKwkgICAgKSB7CisJCXU4IEJCUFZhbHVlID0gMDsKIAkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwogCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CiAJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKIAkJQkJQVmFsdWUgJj0gKH4weDE4KTsKIAkJQkJQVmFsdWUgfD0gMHgxMDsKIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gRW5kIG9mIFNDQU4sIHJlc3RvcmUgdG8gNDBNSHogY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJTWU5DIC0gRW5kIG9mIFNDQU4sIHJlc3RvcmUgdG8gNDBNSHogY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLAorCQkJICBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgcEFkLT5TY2FuVGFiLkJzc05yKSk7CiAJfQogCiAJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9CRUFDT05fVElNRU9VVCwgMCwgTlVMTCk7Ci0JUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7CiB9CiAKIC8qCkBAIC0xNzIsMzIgKzE1MSwyOCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBTY2FuVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit2b2lkIFNjYW5UaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQogewotCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKIAotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJLyogRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuICovCisJLyogVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0ICovCiAJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKIAkJcmV0dXJuOwogCi0JaWYgKE1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9USU1FT1VULCAwLCBOVUxMKSkKLQl7Ci0JCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gVG8gcHJldmVudCBTeW5jTWFjaGluZS5DdXJyU3RhdGUgaXMgU0NBTl9MSVNURU4gZm9yZXZlci4KKwlpZiAoTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX1RJTUVPVVQsIDAsIE5VTEwpKSB7CisJCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7CisJfSBlbHNlIHsKKwkJLyogVG8gcHJldmVudCBTeW5jTWFjaGluZS5DdXJyU3RhdGUgaXMgU0NBTl9MSVNURU4gZm9yZXZlci4gKi8KIAkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSAwOwogCQlTY2FuTmV4dENoYW5uZWwocEFkKTsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQl7Ci0JCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TQ0FOX0VOUVVFVUVfRkFJTF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpIHsKKwkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsCisJCQkJCSAgICAgIElXX1NDQU5fRU5RVUVVRV9GQUlMX0VWRU5UX0ZMQUcsCisJCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uCisJCQkJCSAgICAgIEFkZHIsIEJTUzAsIDApOwogCQl9CiAJfQogfQpAQCAtMjA4LDgxICsxODMsNzggQEAKIAkJTUxNRSBTQ0FOIHJlcSBzdGF0ZSBtYWNoaW5lIHByb2NlZHVyZQogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZVNjYW5SZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBNbG1lU2NhblJlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVUNIQVIgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuLCBTY2FuVHlwZSwgQnNzVHlwZSwgQkJQVmFsdWUgPSAwOwotCUJPT0xFQU4gICAgICAgIFRpbWVyQ2FuY2VsbGVkOwotCVVMT05HCQkgICBOb3c7Ci0JVVNIT1JUICAgICAgICAgU3RhdHVzOwotCVBIRUFERVJfODAyXzExIHBIZHI4MDIxMTsKLQlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyAgICBOU3RhdHVzOworCXU4IFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgU3NpZExlbiwgU2NhblR5cGUsIEJzc1R5cGUsIEJCUFZhbHVlID0gMDsKKwlCT09MRUFOIFRpbWVyQ2FuY2VsbGVkOworCXVuc2lnbmVkIGxvbmcgTm93OworCXUxNiBTdGF0dXM7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGRyODAyMTE7CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCWludCBOU3RhdHVzOwogCi0JLy8gQ2hlY2sgdGhlIHRvdGFsIHNjYW4gdHJpZXMgZm9yIG9uZSBzaW5nbGUgT0lEIGNvbW1hbmQKLQkvLyBJZiB0aGlzIGlzIHRoZSBDQ1ggMi4wIENhc2UsIHNraXAgdGhhdCEKLQlpZiAoICFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIE1sbWVTY2FuUmVxQWN0aW9uIGJlZm9yZSBTdGFydHVwXG4iKSk7CisJLyogQ2hlY2sgdGhlIHRvdGFsIHNjYW4gdHJpZXMgZm9yIG9uZSBzaW5nbGUgT0lEIGNvbW1hbmQgKi8KKwkvKiBJZiB0aGlzIGlzIHRoZSBDQ1ggMi4wIENhc2UsIHNraXAgdGhhdCEgKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJTWU5DIC0gTWxtZVNjYW5SZXFBY3Rpb24gYmVmb3JlIFN0YXJ0dXBcbiIpKTsKIAkJcmV0dXJuOwogCX0KLQotCS8vIEluY3JlYXNlIHRoZSBzY2FuIHJldHJ5IGNvdW50ZXJzLgorCS8qIEluY3JlYXNlIHRoZSBzY2FuIHJldHJ5IGNvdW50ZXJzLiAqLwogCXBBZC0+U3RhQ2ZnLlNjYW5DbnQrKzsKIAotI2lmZGVmIFJUMjg2MAotICAgIGlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKSAmJgotICAgICAgICAoSURMRV9PTihwQWQpKSAmJgotCQkocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpICYmCi0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkKLQl7Ci0JCVJUMjh4eFBjaUFzaWNSYWRpb09uKHBBZCwgR1VJX0lETEVfUE9XRVJfU0FWRSk7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkgJiYKKwkgICAgKElETEVfT04ocEFkKSkgJiYKKwkgICAgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKSAmJgorCSAgICAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkpIHsKKwkJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBGQUxTRSkgeworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCBQb3dlcldha2VDSUQsIDB4MDAsCisJCQkJCSAgICAgMHgwMik7CisJCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyV2FrZUNJRCk7CisJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlBTTSAtIElzc3VlIFdha2UgdXAgY29tbWFuZCBcbiIpKTsKKwkJfSBlbHNlIHsKKwkJCVJUMjh4eFBjaUFzaWNSYWRpb09uKHBBZCwgR1VJX0lETEVfUE9XRVJfU0FWRSk7CisJCX0KIAl9Ci0jZW5kaWYKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotCS8vIGZpcnN0IGNoZWNrIHRoZSBwYXJhbWV0ZXIgc2FuaXR5CisJLyogZmlyc3QgY2hlY2sgdGhlIHBhcmFtZXRlciBzYW5pdHkgKi8KIAlpZiAoTWxtZVNjYW5SZXFTYW5pdHkocEFkLAotCQkJCQkJICBFbGVtLT5Nc2csCi0JCQkJCQkgIEVsZW0tPk1zZ0xlbiwKLQkJCQkJCSAgJkJzc1R5cGUsCi0JCQkJCQkgIFNzaWQsCi0JCQkJCQkgICZTc2lkTGVuLAotCQkJCQkJICAmU2NhblR5cGUpKQotCXsKKwkJCSAgICAgIEVsZW0tPk1zZywKKwkJCSAgICAgIEVsZW0tPk1zZ0xlbiwKKwkJCSAgICAgICZCc3NUeXBlLCAoY2hhciAqKVNzaWQsICZTc2lkTGVuLCAmU2NhblR5cGUpKSB7CiAKLQkJLy8gQ2hlY2sgZm9yIGNoYW5uZWwgbG9hZCBhbmQgbm9pc2UgaGlzdCByZXF1ZXN0Ci0JCS8vIFN1c3BlbmQgTVNEVSBvbmx5IGF0IHNjYW4gcmVxdWVzdCwgbm90IHRoZSBsYXN0IHR3byBtZW50aW9uZWQKLQkJaWYgKChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX05PSVNFKSB8fCAoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpKQotCQl7Ci0JCQlpZiAocEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJCQlSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24ocEFkKTsJCQkvLyBTdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uIGhlcmUKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIFN1c3BlbmQgTVNEVSB0cmFuc21pc3Npb24gaGVyZQotCQkJUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKHBBZCk7Ci0JCX0KKwkJLyogQ2hlY2sgZm9yIGNoYW5uZWwgbG9hZCBhbmQgbm9pc2UgaGlzdCByZXF1ZXN0ICovCisJCS8qIFN1c3BlbmQgTVNEVSBvbmx5IGF0IHNjYW4gcmVxdWVzdCwgbm90IHRoZSBsYXN0IHR3byBtZW50aW9uZWQgKi8KKwkJLyogU3VzcGVuZCBNU0RVIHRyYW5zbWlzc2lvbiBoZXJlICovCisJCVJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbihwQWQpOwogCi0JCS8vCi0JCS8vIFRvIHByZXZlbnQgZGF0YSBsb3N0LgotCQkvLyBTZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9uIHRvIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCBiZWZvcmUgU0NBTiBwcm9ncmVzcy4KLQkJLy8gQW5kIHNob3VsZCBzZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9mZiB0byBBUCwgd2hlbiBzY2FuIHByb2dyZXNzIGRvbmUKLQkJLy8KLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJiAoSU5GUkFfT04ocEFkKSkpCi0JCXsKLQkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOwotCQkJaWYgKE5TdGF0dXMJPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCXsKLQkJCQlwSGRyODAyMTEgPSAoUEhFQURFUl84MDJfMTEpIHBPdXRCdWZmZXI7Ci0JCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBIZHI4MDIxMSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCS8qICovCisJCS8qIFRvIHByZXZlbnQgZGF0YSBsb3N0LiAqLworCQkvKiBTZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9uIHRvIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCBiZWZvcmUgU0NBTiBwcm9ncmVzcy4gKi8KKwkJLyogQW5kIHNob3VsZCBzZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9mZiB0byBBUCwgd2hlbiBzY2FuIHByb2dyZXNzIGRvbmUgKi8KKwkJLyogKi8KKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQorCQkgICAgJiYgKElORlJBX09OKHBBZCkpKSB7CisJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKHZvaWQgKikmIHBPdXRCdWZmZXIpOworCQkJaWYgKE5TdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkJCXBIZHI4MDIxMSA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSBwT3V0QnVmZmVyOworCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwSGRyODAyMTEsCisJCQkJCQkgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsCisJCQkJCQkgcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkJCQkgcEFkLT5Db21tb25DZmcuQnNzaWQpOwogCQkJCXBIZHI4MDIxMS0+RHVyYXRpb24gPSAwOwogCQkJCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7CiAJCQkJcEhkcjgwMjExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CiAKLQkJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCi0JCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTY2FuUmVxQWN0aW9uIC0tIFNlbmQgUFNNIERhdGEgZnJhbWUgZm9yIG9mZiBjaGFubmVsIFJNXG4iKSk7CisJCQkJLyogU2VuZCB1c2luZyBwcmlvcml0eSBxdWV1ZSAqLworCQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwKKwkJCQkJCSAgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIk1sbWVTY2FuUmVxQWN0aW9uIC0tIFNlbmQgUFNNIERhdGEgZnJhbWUgZm9yIG9mZiBjaGFubmVsIFJNXG4iKSk7CiAJCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKIAkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOwogCQkJfQpAQCAtMjkwLDM4ICsyNjIsMzIgQEAKIAogCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwogCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7Ci0JCS8vIHJlc2V0IGFsbCB0aGUgdGltZXJzCisJCS8qIHJlc2V0IGFsbCB0aGUgdGltZXJzICovCiAJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwogCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CiAKLQkJLy8gcmVjb3JkIGRlc2lyZWQgQlNTIHBhcmFtZXRlcnMKKwkJLyogcmVjb3JkIGRlc2lyZWQgQlNTIHBhcmFtZXRlcnMgKi8KIAkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBCc3NUeXBlOwogCQlwQWQtPk1sbWVBdXguU2NhblR5cGUgPSBTY2FuVHlwZTsKIAkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBTc2lkTGVuOwotICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CiAJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKIAotCQkvLyBzdGFydCBmcm9tIHRoZSBmaXJzdCBjaGFubmVsCisJCS8qIHN0YXJ0IGZyb20gdGhlIGZpcnN0IGNoYW5uZWwgKi8KIAkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBGaXJzdENoYW5uZWwocEFkKTsKIAotCQkvLyBDaGFuZ2UgdGhlIHNjYW4gY2hhbm5lbCB3aGVuIGRlYWxpbmcgd2l0aCBDQ1ggYmVhY29uIHJlcG9ydAotCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fUEFTU0lWRSkgfHwgKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQUNUSVZFKSB8fAotCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKSB8fCAoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19OT0lTRSkpCi0JCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsOwotCi0JCS8vIExldCBCQlAgcmVnaXN0ZXIgYXQgMjBNSHogdG8gZG8gc2NhbgorCQkvKiBMZXQgQkJQIHJlZ2lzdGVyIGF0IDIwTUh6IHRvIGRvIHNjYW4gKi8KIAkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwogCQlCQlBWYWx1ZSAmPSAofjB4MTgpOwogCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CiAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCQlAgUjQgdG8gMjBNSHoubFxuIikpOwogCQlTY2FuTmV4dENoYW5uZWwocEFkKTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlEQkdQUklOVF9FUlIoKCJTWU5DIC0gTWxtZVNjYW5SZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOwogCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwogCQlTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOwotCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9DT05GLCAyLCAmU3RhdHVzKTsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwKKwkJCSAgICAmU3RhdHVzKTsKIAl9CiB9CiAKQEAgLTMzMSw0OSArMjk3LDQ3IEBACiAJCU1MTUUgSk9JTiByZXEgc3RhdGUgbWFjaGluZSBwcm9jZWR1cmUKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIE1sbWVKb2luUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgTWxtZUpvaW5SZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVDSEFSICAgICAgICBCQlBWYWx1ZSA9IDA7Ci0JQlNTX0VOVFJZICAgICpwQnNzOwotCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0JSEVBREVSXzgwMl8xMSBIZHI4MDIxMTsKLQlORElTX1NUQVRVUyAgIE5TdGF0dXM7Ci0JVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlQVUNIQVIgICAgICAgIHBTdXBSYXRlID0gTlVMTDsKLQlVQ0hBUiAgICAgICAgIFN1cFJhdGVMZW47Ci0JUFVDSEFSICAgICAgICBwRXh0UmF0ZSA9IE5VTEw7Ci0JVUNIQVIgICAgICAgICBFeHRSYXRlTGVuOwotCVVDSEFSICAgICAgICAgQVN1cFJhdGVbXSA9IHsweDhDLCAweDEyLCAweDk4LCAweDI0LCAweGIwLCAweDQ4LCAweDYwLCAweDZDfTsKLQlVQ0hBUiAgICAgICAgIEFTdXBSYXRlTGVuID0gc2l6ZW9mKEFTdXBSYXRlKS9zaXplb2YoVUNIQVIpOwotCU1MTUVfSk9JTl9SRVFfU1RSVUNUICpwSW5mbyA9IChNTE1FX0pPSU5fUkVRX1NUUlVDVCAqKShFbGVtLT5Nc2cpOworCXU4IEJCUFZhbHVlID0gMDsKKwlzdHJ1Y3QgcnRfYnNzX2VudHJ5ICpwQnNzOworCUJPT0xFQU4gVGltZXJDYW5jZWxsZWQ7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgSGRyODAyMTE7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbiA9IDA7CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCXU4ICpwU3VwUmF0ZSA9IE5VTEw7CisJdTggU3VwUmF0ZUxlbjsKKwl1OCAqcEV4dFJhdGUgPSBOVUxMOworCXU4IEV4dFJhdGVMZW47CisJdTggQVN1cFJhdGVbXSA9IHsgMHg4QywgMHgxMiwgMHg5OCwgMHgyNCwgMHhiMCwgMHg0OCwgMHg2MCwgMHg2QyB9OworCXU4IEFTdXBSYXRlTGVuID0gc2l6ZW9mKEFTdXBSYXRlKSAvIHNpemVvZih1OCk7CisJc3RydWN0IHJ0X21sbWVfam9pbl9yZXEgKnBJbmZvID0gKHN0cnVjdCBydF9tbG1lX2pvaW5fcmVxICopKEVsZW0tPk1zZyk7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gTWxtZUpvaW5SZXFBY3Rpb24oQlNTICMlbGQpXG4iLCBwSW5mby0+QnNzSWR4KSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlNZTkMgLSBNbG1lSm9pblJlcUFjdGlvbihCU1MgIyVsZClcbiIsIHBJbmZvLT5Cc3NJZHgpKTsKIAotI2lmZGVmIFJUMjg2MAotICAgIGlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKSAmJgotICAgICAgICAoSURMRV9PTihwQWQpKSAmJgotCQkocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpICYmCi0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkKLQl7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkgJiYKKwkgICAgKElETEVfT04ocEFkKSkgJiYKKwkgICAgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKSAmJgorCSAgICAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkpIHsKIAkJUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFKTsKIAl9Ci0jZW5kaWYKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotCS8vIHJlc2V0IGFsbCB0aGUgdGltZXJzCisJLyogcmVzZXQgYWxsIHRoZSB0aW1lcnMgKi8KIAlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CiAJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CiAKIAlwQnNzID0gJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W3BJbmZvLT5Cc3NJZHhdOwogCi0JLy8gcmVjb3JkIHRoZSBkZXNpcmVkIFNTSUQgJiBCU1NJRCB3ZSdyZSB3YWl0aW5nIGZvcgorCS8qIHJlY29yZCB0aGUgZGVzaXJlZCBTU0lEICYgQlNTSUQgd2UncmUgd2FpdGluZyBmb3IgKi8KIAlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEJzcy0+QnNzaWQpOwogCi0JLy8gSWYgQVAncyBTU0lEIGlzIG5vdCBoaWRkZW4sIGl0IGlzIE9LIGZvciB1cGRhdGluZyBzc2lkIHRvIE1sbWVBdXggYWdhaW4uCi0JaWYgKHBCc3MtPkhpZGRlbiA9PSAwKQotCXsKKwkvKiBJZiBBUCdzIFNTSUQgaXMgbm90IGhpZGRlbiwgaXQgaXMgT0sgZm9yIHVwZGF0aW5nIHNzaWQgdG8gTWxtZUF1eCBhZ2Fpbi4gKi8KKwlpZiAocEJzcy0+SGlkZGVuID09IDApIHsKKwkJUlRNUFplcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CiAJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBwQnNzLT5Tc2lkLCBwQnNzLT5Tc2lkTGVuKTsKIAkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBwQnNzLT5Tc2lkTGVuOwogCX0KQEAgLTM4Miw4OCArMzQ2LDg3IEBACiAJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBwQnNzLT5DaGFubmVsOwogCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBCc3MtPkNlbnRyYWxDaGFubmVsOwogCi0JLy8gTGV0IEJCUCByZWdpc3RlciBhdCAyME1IeiB0byBkbyBzY2FuCisJLyogTGV0IEJCUCByZWdpc3RlciBhdCAyME1IeiB0byBkbyBzY2FuICovCiAJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwogCUJCUFZhbHVlICY9ICh+MHgxOCk7CiAJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEJCUCBSNCB0byAyME1Iei5sXG4iKSk7CiAKLQkvLyBzd2l0Y2ggY2hhbm5lbCBhbmQgd2FpdGluZyBmb3IgYmVhY29uIHRpbWVyCisJLyogc3dpdGNoIGNoYW5uZWwgYW5kIHdhaXRpbmcgZm9yIGJlYWNvbiB0aW1lciAqLwogCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwsIEZBTFNFKTsKIAlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CiAJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsIEpPSU5fVElNRU9VVCk7CiAKLSAgICBkbwotCXsKKwlkbyB7CiAJCWlmICgoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCi0gICAgICAgICAgICAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkgJiYKLSAgICAgICAgICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKSkKLSAgICAgICAgICAgICkKLQkJewotCQkJLy8KLQkJCS8vIFdlIGNhbid0IHNlbmQgYW55IFByb2JlIHJlcXVlc3QgZnJhbWUgdG8gbWVldCA4MDIuMTFoLgotCQkJLy8KKwkJICAgICAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkgJiYKKwkJICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKSkKKwkJICAgICkgeworCQkJLyogKi8KKwkJCS8qIFdlIGNhbid0IHNlbmQgYW55IFByb2JlIHJlcXVlc3QgZnJhbWUgdG8gbWVldCA4MDIuMTFoLiAqLworCQkJLyogKi8KIAkJCWlmIChwQnNzLT5IaWRkZW4gPT0gMCkKIAkJCQlicmVhazsKIAkJfQotCi0JCS8vCi0JCS8vIHNlbmQgcHJvYmUgcmVxdWVzdAotCQkvLworCQkvKiAqLworCQkvKiBzZW5kIHByb2JlIHJlcXVlc3QgKi8KKwkJLyogKi8KIAkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKLQkJaWYgKE5TdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsIDw9IDE0KQotCQkJeworCQlpZiAoTlN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpIHsKIAkJCQlwU3VwUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGU7CiAJCQkJU3VwUmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW47CiAJCQkJcEV4dFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlOwogCQkJCUV4dFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vCi0JCQkJLy8gT3ZlcndyaXRlIFN1cHBvcnQgUmF0ZSwgQ0NLIHJhdGUgYXJlIG5vdCBhbGxvd2VkCi0JCQkJLy8KKwkJCX0gZWxzZSB7CisJCQkJLyogKi8KKwkJCQkvKiBPdmVyd3JpdGUgU3VwcG9ydCBSYXRlLCBDQ0sgcmF0ZSBhcmUgbm90IGFsbG93ZWQgKi8KKwkJCQkvKiAqLwogCQkJCXBTdXBSYXRlID0gQVN1cFJhdGU7CiAJCQkJU3VwUmF0ZUxlbiA9IEFTdXBSYXRlTGVuOwogCQkJCUV4dFJhdGVMZW4gPSAwOwogCQkJfQogCiAJCQlpZiAocEFkLT5NbG1lQXV4LkJzc1R5cGUgPT0gQlNTX0lORlJBKQotCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBwQWQtPk1sbWVBdXguQnNzaWQsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisJCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZIZHI4MDIxMSwKKwkJCQkJCSBTVUJUWVBFX1BST0JFX1JFUSwgMCwKKwkJCQkJCSBwQWQtPk1sbWVBdXguQnNzaWQsCisJCQkJCQkgcEFkLT5NbG1lQXV4LkJzc2lkKTsKIAkJCWVsc2UKLQkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgQlJPQURDQVNUX0FERFIsIEJST0FEQ0FTVF9BRERSKTsKKwkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLAorCQkJCQkJIFNVQlRZUEVfUFJPQkVfUkVRLCAwLAorCQkJCQkJIEJST0FEQ0FTVF9BRERSLAorCQkJCQkJIEJST0FEQ0FTVF9BRERSKTsKIAotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0JCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZIZHI4MDIxMSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLAotCQkJCQkJCSAgcEFkLT5NbG1lQXV4LlNzaWRMZW4sCSAgICBwQWQtPk1sbWVBdXguU3NpZCwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVMZW4sCi0JCQkJCQkJICBTdXBSYXRlTGVuLCAgICAgICAgICAgICAgIHBTdXBSYXRlLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgJkZyYW1lTGVuLAorCQkJCQkgIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSksICZIZHI4MDIxMSwKKwkJCQkJICAxLCAmU3NpZEllLAorCQkJCQkgIDEsICZwQWQtPk1sbWVBdXguU3NpZExlbiwKKwkJCQkJICBwQWQtPk1sbWVBdXguU3NpZExlbiwKKwkJCQkJICBwQWQtPk1sbWVBdXguU3NpZCwgMSwgJlN1cFJhdGVJZSwgMSwKKwkJCQkJICAmU3VwUmF0ZUxlbiwgU3VwUmF0ZUxlbiwgcFN1cFJhdGUsCisJCQkJCSAgRU5EX09GX0FSR1MpOwogCi0JCQlpZiAoRXh0UmF0ZUxlbikKLQkJCXsKLQkJCQlVTE9ORyBUbXA7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXAsCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlTGVuLAotCQkJCQkJCQkgIEV4dFJhdGVMZW4sICAgICAgICAgICAgICAgICAgICAgICBwRXh0UmF0ZSwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlpZiAoRXh0UmF0ZUxlbikgeworCQkJCXVuc2lnbmVkIGxvbmcgVG1wOworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJlRtcCwKKwkJCQkJCSAgMSwgJkV4dFJhdGVJZSwKKwkJCQkJCSAgMSwgJkV4dFJhdGVMZW4sCisJCQkJCQkgIEV4dFJhdGVMZW4sIHBFeHRSYXRlLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CiAJCQkJRnJhbWVMZW4gKz0gVG1wOwogCQkJfQogCi0KIAkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwogCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKIAkJfQotICAgIH0gd2hpbGUgKEZBTFNFKTsKKwl9IHdoaWxlIChGQUxTRSk7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gU3dpdGNoIHRvIGNoICVkLCBXYWl0IEJFQUNPTiBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQlwQnNzLT5DaGFubmVsLCBwQnNzLT5Cc3NpZFswXSwgcEJzcy0+QnNzaWRbMV0sIHBCc3MtPkJzc2lkWzJdLCBwQnNzLT5Cc3NpZFszXSwgcEJzcy0+QnNzaWRbNF0sIHBCc3MtPkJzc2lkWzVdKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlNZTkMgLSBTd2l0Y2ggdG8gY2ggJWQsIFdhaXQgQkVBQ09OIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSAgcEJzcy0+Q2hhbm5lbCwgcEJzcy0+QnNzaWRbMF0sIHBCc3MtPkJzc2lkWzFdLCBwQnNzLT5Cc3NpZFsyXSwKKwkJICBwQnNzLT5Cc3NpZFszXSwgcEJzcy0+QnNzaWRbNF0sIHBCc3MtPkJzc2lkWzVdKSk7CiAKIAlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gSk9JTl9XQUlUX0JFQUNPTjsKIH0KQEAgLTQ3NCw5NSArNDM3LDExMCBAQAogCQlNTE1FIFNUQVJUIFJlcXVlc3Qgc3RhdGUgbWFjaGluZSBwcm9jZWR1cmUsIHN0YXJ0aW5nIGFuIElCU1MKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIE1sbWVTdGFydFJlcUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIE1sbWVTdGFydFJlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVUNIQVIgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIFNzaWRMZW47Ci0JQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKKwl1OCBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIFNzaWRMZW47CisJQk9PTEVBTiBUaW1lckNhbmNlbGxlZDsKIAotCS8vIE5ldyBmb3IgV1BBIHNlY3VyaXR5IHN1aXRlcwotCVVDSEFSCQkJCQkJVmFySUVbTUFYX1ZJRV9MRU5dOyAJLy8gVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUKLQlORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMJKnBWSUUgPSBOVUxMOwotCUxBUkdFX0lOVEVHRVIJCQkJVGltZVN0YW1wOworCS8qIE5ldyBmb3IgV1BBIHNlY3VyaXR5IHN1aXRlcyAqLworCXU4IFZhcklFW01BWF9WSUVfTEVOXTsJLyogVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUgKi8KKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfdmFyaWFibGVfaWVzICpwVklFID0gTlVMTDsKKwlMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcDsKIAlCT09MRUFOIFByaXZhY3k7Ci0JVVNIT1JUIFN0YXR1czsKKwl1MTYgU3RhdHVzOwogCi0JLy8gSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUKLQlwVklFID0gKFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMpIFZhcklFOworCS8qIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlICovCisJcFZJRSA9IChzdHJ1Y3QgcnRfbmRpc184MDJfMTFfdmFyaWFibGVfaWVzICopVmFySUU7CiAJcFZJRS0+TGVuZ3RoID0gMDsKLQlUaW1lU3RhbXAudS5Mb3dQYXJ0ICA9IDA7CisJVGltZVN0YW1wLnUuTG93UGFydCA9IDA7CiAJVGltZVN0YW1wLnUuSGlnaFBhcnQgPSAwOwogCi0JaWYgKE1sbWVTdGFydFJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBTc2lkLCAmU3NpZExlbikpCi0JewotCQkvLyByZXNldCBhbGwgdGhlIHRpbWVycworCWlmIChNbG1lU3RhcnRSZXFTYW5pdHkKKwkgICAgKHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIChjaGFyICopU3NpZCwgJlNzaWRMZW4pKSB7CisJCS8qIHJlc2V0IGFsbCB0aGUgdGltZXJzICovCiAJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKIAkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CiAKLQkJLy8KLQkJLy8gU3RhcnQgYSBuZXcgSUJTUy4gQWxsIElCU1MgcGFyYW1ldGVycyBhcmUgZGVjaWRlZCBub3cuLi4uCi0JCS8vCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTdGFydFJlcUFjdGlvbiAtIFN0YXJ0IGEgbmV3IElCU1MuIEFsbCBJQlNTIHBhcmFtZXRlcnMgYXJlIGRlY2lkZWQgbm93Li4uLiBcbiIpKTsKLQkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgICAgICAgICAgID0gQlNTX0FESE9DOworCQkvKiAqLworCQkvKiBTdGFydCBhIG5ldyBJQlNTLiBBbGwgSUJTUyBwYXJhbWV0ZXJzIGFyZSBkZWNpZGVkIG5vdy4uLi4gKi8KKwkJLyogKi8KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNbG1lU3RhcnRSZXFBY3Rpb24gLSBTdGFydCBhIG5ldyBJQlNTLiBBbGwgSUJTUyBwYXJhbWV0ZXJzIGFyZSBkZWNpZGVkIG5vdy4uLi4gXG4iKSk7CisJCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gQlNTX0FESE9DOwogCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgU3NpZCwgU3NpZExlbik7Ci0JCXBBZC0+TWxtZUF1eC5Tc2lkTGVuICAgICAgICAgICA9IFNzaWRMZW47CisJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gU3NpZExlbjsKIAotCQkvLyBnZW5lcmF0ZSBhIHJhZG9tIG51bWJlciBhcyBCU1NJRAorCQkvKiBnZW5lcmF0ZSBhIHJhZG9tIG51bWJlciBhcyBCU1NJRCAqLwogCQlNYWNBZGRyUmFuZG9tQnNzaWQocEFkLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU3RhcnRSZXFBY3Rpb24gLSBnZW5lcmF0ZSBhIHJhZG9tIG51bWJlciBhcyBCU1NJRCBcbiIpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNbG1lU3RhcnRSZXFBY3Rpb24gLSBnZW5lcmF0ZSBhIHJhZG9tIG51bWJlciBhcyBCU1NJRCBcbiIpKTsKIAotCQlQcml2YWN5ID0gKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB8fAotCQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAotCQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKTsKLQkJcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvICAgID0gQ0FQX0dFTkVSQVRFKDAsMSxQcml2YWN5LCAocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpLCAxLCAwKTsKLQkJcEFkLT5NbG1lQXV4LkJlYWNvblBlcmlvZCAgICAgID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOwotCQlwQWQtPk1sbWVBdXguQXRpbVdpbiAgICAgICAgICAgPSBwQWQtPlN0YUNmZy5BdGltV2luOwotCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCAgICAgICAgICAgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQlQcml2YWN5ID0KKwkJICAgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkKKwkJICAgIHx8IChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJICAgIHx8IChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCk7CisJCXBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbyA9CisJCSAgICBDQVBfR0VORVJBVEUoMCwgMSwgUHJpdmFjeSwKKwkJCQkgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0KKwkJCQkgIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCksIDEsIDApOworCQlwQWQtPk1sbWVBdXguQmVhY29uUGVyaW9kID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOworCQlwQWQtPk1sbWVBdXguQXRpbVdpbiA9IHBBZC0+U3RhQ2ZnLkF0aW1XaW47CisJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKIAotCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgICAgPSBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKKwkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKIAotCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbj0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLQkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKKwkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3VwUmF0ZSwgcEFkLT5Db21tb25DZmcuU3VwUmF0ZSwKKwkJCSAgICAgICBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkgICAgICAgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKIAkJcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgcEFkLT5Db21tb25DZmcuRXh0UmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwotCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgcEFkLT5Db21tb25DZmcuRXh0UmF0ZSwKKwkJCSAgICAgICBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LkV4dFJhdGUsCisJCQkgICAgICAgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKIAotCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQotCQl7Ci0JCQlSVE1QVXBkYXRlSFRJRSgmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LCAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbMF0sICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCAmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbyk7Ci0JCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOwotCQkJLy8gTm90IHR1cm4gcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID0gVFJVRSBoZXJlLgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID0gVFJVRVxuIikpOwotCQl9Ci0JCWVsc2UKLQkJeworCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSB7CisJCQlSVE1QVXBkYXRlSFRJRSgmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LAorCQkJCSAgICAgICAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbMF0sCisJCQkJICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCSAgICAgICAmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbyk7CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gc2l6ZW9mKHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llKTsKKwkJCS8qIE5vdCB0dXJuIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LmJIdEVuYWJsZSA9IFRSVUUgaGVyZS4gKi8KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlNZTkMgLXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LmJIdEVuYWJsZSA9IFRSVUVcbiIpKTsKKwkJfSBlbHNlIHsKIAkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSAwOwogCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKwkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLgorCQkJCSAgICAgICBNQ1NTZXRbMF0sIDE2KTsKIAkJfQotCQkvLyB0ZW1wb3JhcmlseSBub3Qgc3VwcG9ydCBRT1MgaW4gSUJTUwotCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKLQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKLQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7CisJCS8qIHRlbXBvcmFyaWx5IG5vdCBzdXBwb3J0IFFPUyBpbiBJQlNTICovCisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwgc2l6ZW9mKHN0cnVjdCBydF9lZGNhX3Bhcm0pKTsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0pKTsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtKSk7CiAKIAkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCwgRkFMU0UpOwogCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CiAKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIE1sbWVTdGFydFJlcUFjdGlvbihjaD0gJWQsc3VwIHJhdGVzPSAlZCwgZXh0IHJhdGVzPSVkKVxuIiwKLQkJCXBBZC0+TWxtZUF1eC5DaGFubmVsLCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJTWU5DIC0gTWxtZVN0YXJ0UmVxQWN0aW9uKGNoPSAlZCxzdXAgcmF0ZXM9ICVkLCBleHQgcmF0ZXM9JWQpXG4iLAorCQkJICBwQWQtPk1sbWVBdXguQ2hhbm5lbCwgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKSk7CiAKIAkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKIAkJU3RhdHVzID0gTUxNRV9TVUNDRVNTOwotCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwgJlN0YXR1cyk7Ci0JfQotCWVsc2UKLQl7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TVEFSVF9DT05GLCAyLAorCQkJICAgICZTdGF0dXMpOworCX0gZWxzZSB7CiAJCURCR1BSSU5UX0VSUigoIlNZTkMgLSBNbG1lU3RhcnRSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbC5cbiIpKTsKIAkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKIAkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NUQVJUX0NPTkYsIDIsICZTdGF0dXMpOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwKKwkJCSAgICAmU3RhdHVzKTsKIAl9CiB9CiAKQEAgLTU3MiwxMjYgKzU1MCwxMTYgQEAKIAkJcGVlciBzZW5kcyBiZWFjb24gYmFjayB3aGVuIHNjYW5uaW5nCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgUGVlckJlYWNvbkF0U2NhbkFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVUNIQVIgICAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgQnNzVHlwZSwgQ2hhbm5lbCwgTmV3Q2hhbm5lbCwKLQkJCQkJU3NpZExlbiwgRHRpbUNvdW50LCBEdGltUGVyaW9kLCBCY2FzdEZsYWcsIE1lc3NhZ2VUb01lOwotCUNGX1BBUk0gICAgICAgICBDZlBhcm07Ci0JVVNIT1JUICAgICAgICAgIEJlYWNvblBlcmlvZCwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm87Ci0JUEZSQU1FXzgwMl8xMSAgIHBGcmFtZTsKLQlMQVJHRV9JTlRFR0VSICAgVGltZVN0YW1wOwotCVVDSEFSICAgICAgICAgICBFcnA7Ci0JVUNIQVIgICAgICAgICAJU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSCQkgIAlTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOwotCVVTSE9SVCAJCQlMZW5WSUU7Ci0JVUNIQVIJCQlDa2lwRmxhZzsKLQlVQ0hBUgkJCUFpcm9uZXRDZWxsUG93ZXJMaW1pdDsKLQlFRENBX1BBUk0gICAgICAgRWRjYVBhcm07Ci0JUUJTU19MT0FEX1BBUk0gIFFic3NMb2FkOwotCVFPU19DQVBBQklMSVRZX1BBUk0gUW9zQ2FwYWJpbGl0eTsKLQlVTE9ORwkJCQkJCVJhbGlua0llOwotCVVDSEFSCQkJCQkJVmFySUVbTUFYX1ZJRV9MRU5dOwkJLy8gVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUKLQlORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMJKnBWSUUgPSBOVUxMOwotCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKLQlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiA9IDAsIFByZU5IdENhcGFiaWxpdHlMZW4gPSAwOwotCVVDSEFSCQkJQWRkSHRJbmZvTGVuOwotCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisJdTggQnNzaWRbTUFDX0FERFJfTEVOXSwgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwl1OCBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIEJzc1R5cGUsIENoYW5uZWwsIE5ld0NoYW5uZWwsCisJICAgIFNzaWRMZW4sIER0aW1Db3VudCwgRHRpbVBlcmlvZCwgQmNhc3RGbGFnLCBNZXNzYWdlVG9NZTsKKwlzdHJ1Y3QgcnRfY2ZfcGFybSBDZlBhcm07CisJdTE2IEJlYWNvblBlcmlvZCwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm87CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGcmFtZTsKKwlMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcDsKKwl1OCBFcnA7CisJdTggU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sCisJICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCXU4IFN1cFJhdGVMZW4sIEV4dFJhdGVMZW47CisJdTE2IExlblZJRTsKKwl1OCBDa2lwRmxhZzsKKwl1OCBBaXJvbmV0Q2VsbFBvd2VyTGltaXQ7CisJc3RydWN0IHJ0X2VkY2FfcGFybSBFZGNhUGFybTsKKwlzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0gUWJzc0xvYWQ7CisJc3RydWN0IHJ0X3Fvc19jYXBhYmlsaXR5X3Bhcm0gUW9zQ2FwYWJpbGl0eTsKKwl1bnNpZ25lZCBsb25nIFJhbGlua0llOworCXU4IFZhcklFW01BWF9WSUVfTEVOXTsJLyogVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUgKi8KKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfdmFyaWFibGVfaWVzICpwVklFID0gTlVMTDsKKwlzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSBIdENhcGFiaWxpdHk7CisJc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llIEFkZEh0SW5mbzsJLyogQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFICovCisJdTggSHRDYXBhYmlsaXR5TGVuID0gMCwgUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJdTggQWRkSHRJbmZvTGVuOworCXU4IE5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOwogCi0JcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpIEVsZW0tPk1zZzsKLQkvLyBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZQotCXBWSUUgPSAoUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcykgVmFySUU7CisJLyogTmRpc0ZpbGxNZW1vcnkoU3NpZCwgTUFYX0xFTl9PRl9TU0lELCAweDAwKTsgKi8KKwlwRnJhbWUgPSAoc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqKSBFbGVtLT5Nc2c7CisJLyogSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUgKi8KKwlwVklFID0gKHN0cnVjdCBydF9uZGlzXzgwMl8xMV92YXJpYWJsZV9pZXMgKilWYXJJRTsKIAlwVklFLT5MZW5ndGggPSAwOwogCi0gICAgUlRNUFplcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEh0Q2FwYWJpbGl0eSkpOwotCVJUTVBaZXJvTWVtb3J5KCZBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCVJUTVBaZXJvTWVtb3J5KCZIdENhcGFiaWxpdHksIHNpemVvZihIdENhcGFiaWxpdHkpKTsKKwlSVE1QWmVyb01lbW9yeSgmQWRkSHRJbmZvLCBzaXplb2Yoc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llKSk7CiAKIAlpZiAoUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KHBBZCwKLQkJCQkJCQkJRWxlbS0+TXNnLAotCQkJCQkJCQlFbGVtLT5Nc2dMZW4sCi0JCQkJCQkJCUVsZW0tPkNoYW5uZWwsCi0JCQkJCQkJCUFkZHIyLAotCQkJCQkJCQlCc3NpZCwKLQkJCQkJCQkJU3NpZCwKLQkJCQkJCQkJJlNzaWRMZW4sCi0JCQkJCQkJCSZCc3NUeXBlLAotCQkJCQkJCQkmQmVhY29uUGVyaW9kLAotCQkJCQkJCQkmQ2hhbm5lbCwKLQkJCQkJCQkJJk5ld0NoYW5uZWwsCi0JCQkJCQkJCSZUaW1lU3RhbXAsCi0JCQkJCQkJCSZDZlBhcm0sCi0JCQkJCQkJCSZBdGltV2luLAotCQkJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkJCSZFcnAsCi0JCQkJCQkJCSZEdGltQ291bnQsCi0JCQkJCQkJCSZEdGltUGVyaW9kLAotCQkJCQkJCQkmQmNhc3RGbGFnLAotCQkJCQkJCQkmTWVzc2FnZVRvTWUsCi0JCQkJCQkJCVN1cFJhdGUsCi0JCQkJCQkJCSZTdXBSYXRlTGVuLAotCQkJCQkJCQlFeHRSYXRlLAotCQkJCQkJCQkmRXh0UmF0ZUxlbiwKLQkJCQkJCQkJJkNraXBGbGFnLAotCQkJCQkJCQkmQWlyb25ldENlbGxQb3dlckxpbWl0LAotCQkJCQkJCQkmRWRjYVBhcm0sCi0JCQkJCQkJCSZRYnNzTG9hZCwKLQkJCQkJCQkJJlFvc0NhcGFiaWxpdHksCi0JCQkJCQkJCSZSYWxpbmtJZSwKLQkJCQkJCQkJJkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkJJlByZU5IdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJCSZIdENhcGFiaWxpdHksCi0JCQkJCQkJCSZBZGRIdEluZm9MZW4sCi0JCQkJCQkJCSZBZGRIdEluZm8sCi0JCQkJCQkJCSZOZXdFeHRDaGFubmVsT2Zmc2V0LAotCQkJCQkJCQkmTGVuVklFLAotCQkJCQkJCQlwVklFKSkKLQl7Ci0JCVVMT05HIElkeDsKLQkJQ0hBUiBSc3NpID0gMDsKKwkJCQkJRWxlbS0+TXNnLAorCQkJCQlFbGVtLT5Nc2dMZW4sCisJCQkJCUVsZW0tPkNoYW5uZWwsCisJCQkJCUFkZHIyLAorCQkJCQlCc3NpZCwKKwkJCQkJKGNoYXIgKilTc2lkLAorCQkJCQkmU3NpZExlbiwKKwkJCQkJJkJzc1R5cGUsCisJCQkJCSZCZWFjb25QZXJpb2QsCisJCQkJCSZDaGFubmVsLAorCQkJCQkmTmV3Q2hhbm5lbCwKKwkJCQkJJlRpbWVTdGFtcCwKKwkJCQkJJkNmUGFybSwKKwkJCQkJJkF0aW1XaW4sCisJCQkJCSZDYXBhYmlsaXR5SW5mbywKKwkJCQkJJkVycCwKKwkJCQkJJkR0aW1Db3VudCwKKwkJCQkJJkR0aW1QZXJpb2QsCisJCQkJCSZCY2FzdEZsYWcsCisJCQkJCSZNZXNzYWdlVG9NZSwKKwkJCQkJU3VwUmF0ZSwKKwkJCQkJJlN1cFJhdGVMZW4sCisJCQkJCUV4dFJhdGUsCisJCQkJCSZFeHRSYXRlTGVuLAorCQkJCQkmQ2tpcEZsYWcsCisJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisJCQkJCSZFZGNhUGFybSwKKwkJCQkJJlFic3NMb2FkLAorCQkJCQkmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJJlJhbGlua0llLAorCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJJkh0Q2FwYWJpbGl0eSwKKwkJCQkJJkFkZEh0SW5mb0xlbiwKKwkJCQkJJkFkZEh0SW5mbywKKwkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsICZMZW5WSUUsIHBWSUUpKSB7CisJCXVuc2lnbmVkIGxvbmcgSWR4OworCQljaGFyIFJzc2kgPSAwOwogCiAJCUlkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLCBDaGFubmVsKTsKIAkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKQogCQkJUnNzaSA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlJzc2k7CiAKLQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKSk7CisJCVJzc2kgPQorCQkgICAgUlRNUE1heFJzc2kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCksCisJCQkJQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpLAorCQkJCUNvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKSk7CiAKIAkJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSB8fCAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApKQogCQkJSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CiAKLQkJaWYgKChwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICE9IE1TUk5fVFlQRV9VTlVTRUQpICYmIChDaGFubmVsID09IHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsKSkKLQkJewotCQkJSWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCi0JCQkJCQkgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sRXh0UmF0ZSwgRXh0UmF0ZUxlbiwgJkh0Q2FwYWJpbGl0eSwKLQkJCQkJCSAmQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwgTmV3RXh0Q2hhbm5lbE9mZnNldCwgQ2hhbm5lbCwgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywKLQkJCQkJCSAmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LCAmUWJzc0xvYWQsIExlblZJRSwgcFZJRSk7Ci0JCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpCi0JCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc0VudHJ5W0lkeF0uUFRTRiwgJkVsZW0tPk1zZ1syNF0sIDQpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSWR4XS5UVFNGWzBdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbNF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKLQkJCQlpZiAocEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSA9PSBNU1JOX1RZUEVfQkVBQ09OX1JFUSkKLQkJCQkJQWlyb25ldEFkZEJlYWNvblJlcG9ydChwQWQsIElkeCwgRWxlbSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlJZHggPSBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U2NhblRhYiwgQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwKLQkJCQkJCSAgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sICAmSHRDYXBhYmlsaXR5LAotCQkJCQkJICZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLAotCQkJCQkJICZFZGNhUGFybSwgJlFvc0NhcGFiaWxpdHksICZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKKwkJSWR4ID0KKwkJICAgIEJzc1RhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TY2FuVGFiLCBCc3NpZCwgKGNoYXIgKilTc2lkLAorCQkJCSAgICAgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLCAmQ2ZQYXJtLAorCQkJCSAgICAgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsCisJCQkJICAgICBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLAorCQkJCSAgICAgJkh0Q2FwYWJpbGl0eSwgJkFkZEh0SW5mbywgSHRDYXBhYmlsaXR5TGVuLAorCQkJCSAgICAgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLAorCQkJCSAgICAgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgJkVkY2FQYXJtLAorCQkJCSAgICAgJlFvc0NhcGFiaWxpdHksICZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKIAotCQkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKQotCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlBUU0YsICZFbGVtLT5Nc2dbMjRdLCA0KTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVFRTRlswXSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5UVFNGWzRdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7Ci0JCQl9CisJCWlmIChJZHggIT0gQlNTX05PVF9GT1VORCkgeworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uUFRTRiwKKwkJCQkgICAgICAgJkVsZW0tPk1zZ1syNF0sIDQpOworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbMF0sCisJCQkJICAgICAgICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5UVFNGWzRdLAorCQkJCSAgICAgICAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CiAJCX0KKwogCX0KLQkvLyBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlZAorCS8qIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmVkICovCiB9CiAKIC8qCkBAIC03MDAsMTM0ICs2NjgsMjA3IEBACiAJCVdoZW4gd2FpdGluZyBqb2luaW5nIHRoZSAoSSlCU1MsIGJlYWNvbiByZWNlaXZlZCBmcm9tIGV4dGVybmFsCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBQZWVyQmVhY29uQXRKb2luQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgUGVlckJlYWNvbkF0Sm9pbkFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVUNIQVIgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dLCBBZGRyMltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuLCBCc3NUeXBlLCBDaGFubmVsLCBNZXNzYWdlVG9NZSwKLQkJCQkgIER0aW1Db3VudCwgRHRpbVBlcmlvZCwgQmNhc3RGbGFnLCBOZXdDaGFubmVsOworCXU4IEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07CisJdTggU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuLCBCc3NUeXBlLCBDaGFubmVsLCBNZXNzYWdlVG9NZSwKKwkgICAgRHRpbUNvdW50LCBEdGltUGVyaW9kLCBCY2FzdEZsYWcsIE5ld0NoYW5uZWw7CiAJTEFSR0VfSU5URUdFUiBUaW1lU3RhbXA7Ci0JVVNIT1JUICAgICAgICBCZWFjb25QZXJpb2QsIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvOwotCUNGX1BBUk0gICAgICAgQ2Y7Ci0JQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKLQlVQ0hBUiAgICAgICAgIEVycDsKLQlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUgkJICBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOwotCVVDSEFSICAgICAgICAgQ2tpcEZsYWc7Ci0JVVNIT1JUIAkJICBMZW5WSUU7Ci0JVUNIQVIJCSAgQWlyb25ldENlbGxQb3dlckxpbWl0OwotCUVEQ0FfUEFSTSAgICAgICBFZGNhUGFybTsKLQlRQlNTX0xPQURfUEFSTSAgUWJzc0xvYWQ7Ci0JUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OwotCVVTSE9SVCAgICAgICAgU3RhdHVzOwotCVVDSEFSCQkJCQkJVmFySUVbTUFYX1ZJRV9MRU5dOwkJLy8gVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUKLQlORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMJKnBWSUUgPSBOVUxMOwotCVVMT05HICAgICAgICAgICBSYWxpbmtJZTsKLQlVTE9ORyAgICAgICAgIElkeDsKLQlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7Ci0JQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JVUNIQVIJCQkJSHRDYXBhYmlsaXR5TGVuID0gMCwgUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7Ci0JVUNIQVIJCQlBZGRIdEluZm9MZW47Ci0JVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKLQlVQ0hBUgkJCUNlbnRyYWxDaGFubmVsOworCXUxNiBCZWFjb25QZXJpb2QsIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvOworCXN0cnVjdCBydF9jZl9wYXJtIENmOworCUJPT0xFQU4gVGltZXJDYW5jZWxsZWQ7CisJdTggRXJwOworCXU4IFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLAorCSAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwl1OCBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOworCXU4IENraXBGbGFnOworCXUxNiBMZW5WSUU7CisJdTggQWlyb25ldENlbGxQb3dlckxpbWl0OworCXN0cnVjdCBydF9lZGNhX3Bhcm0gRWRjYVBhcm07CisJc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtIFFic3NMb2FkOworCXN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtIFFvc0NhcGFiaWxpdHk7CisJdTE2IFN0YXR1czsKKwl1OCBWYXJJRVtNQVhfVklFX0xFTl07CS8qIFRvdGFsIFZJRSBsZW5ndGggPSBNQVhfVklFX0xFTiAtIC01ICovCisJc3RydWN0IHJ0X25kaXNfODAyXzExX3ZhcmlhYmxlX2llcyAqcFZJRSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBSYWxpbmtJZTsKKwl1bnNpZ25lZCBsb25nIElkeDsKKwlzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSBIdENhcGFiaWxpdHk7CisJc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llIEFkZEh0SW5mbzsJLyogQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFICovCisJdTggSHRDYXBhYmlsaXR5TGVuID0gMCwgUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJdTggQWRkSHRJbmZvTGVuOworCXU4IE5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCXU4IENlbnRyYWxDaGFubmVsOworCUJPT0xFQU4gYkFsbG93TnJhdGUgPSBGQUxTRTsKIAotCS8vIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlCi0JcFZJRSA9IChQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzKSBWYXJJRTsKKwkvKiBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZSAqLworCXBWSUUgPSAoc3RydWN0IHJ0X25kaXNfODAyXzExX3ZhcmlhYmxlX2llcyAqKVZhcklFOwogCXBWSUUtPkxlbmd0aCA9IDA7Ci0gICAgUlRNUFplcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEh0Q2FwYWJpbGl0eSkpOwotCVJUTVBaZXJvTWVtb3J5KCZBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOwotCisJUlRNUFplcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEh0Q2FwYWJpbGl0eSkpOworCVJUTVBaZXJvTWVtb3J5KCZBZGRIdEluZm8sIHNpemVvZihzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUpKTsKIAogCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAotCQkJCQkJCQlFbGVtLT5Nc2csCi0JCQkJCQkJCUVsZW0tPk1zZ0xlbiwKLQkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKLQkJCQkJCQkJQWRkcjIsCi0JCQkJCQkJCUJzc2lkLAotCQkJCQkJCQlTc2lkLAotCQkJCQkJCQkmU3NpZExlbiwKLQkJCQkJCQkJJkJzc1R5cGUsCi0JCQkJCQkJCSZCZWFjb25QZXJpb2QsCi0JCQkJCQkJCSZDaGFubmVsLAotCQkJCQkJCQkmTmV3Q2hhbm5lbCwKLQkJCQkJCQkJJlRpbWVTdGFtcCwKLQkJCQkJCQkJJkNmLAotCQkJCQkJCQkmQXRpbVdpbiwKLQkJCQkJCQkJJkNhcGFiaWxpdHlJbmZvLAotCQkJCQkJCQkmRXJwLAotCQkJCQkJCQkmRHRpbUNvdW50LAotCQkJCQkJCQkmRHRpbVBlcmlvZCwKLQkJCQkJCQkJJkJjYXN0RmxhZywKLQkJCQkJCQkJJk1lc3NhZ2VUb01lLAotCQkJCQkJCQlTdXBSYXRlLAotCQkJCQkJCQkmU3VwUmF0ZUxlbiwKLQkJCQkJCQkJRXh0UmF0ZSwKLQkJCQkJCQkJJkV4dFJhdGVMZW4sCi0JCQkJCQkJCSZDa2lwRmxhZywKLQkJCQkJCQkJJkFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKLQkJCQkJCQkJJkVkY2FQYXJtLAotCQkJCQkJCQkmUWJzc0xvYWQsCi0JCQkJCQkJCSZRb3NDYXBhYmlsaXR5LAotCQkJCQkJCQkmUmFsaW5rSWUsCi0JCQkJCQkJCSZIdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJCSZQcmVOSHRDYXBhYmlsaXR5TGVuLAotCQkJCQkJCQkmSHRDYXBhYmlsaXR5LAotCQkJCQkJCQkmQWRkSHRJbmZvTGVuLAotCQkJCQkJCQkmQWRkSHRJbmZvLAotCQkJCQkJCQkmTmV3RXh0Q2hhbm5lbE9mZnNldCwKLQkJCQkJCQkJJkxlblZJRSwKLQkJCQkJCQkJcFZJRSkpCi0JewotCQkvLyBEaXNxdWFsaWZ5IDExYiBvbmx5IGFkaG9jIHdoZW4gd2UgYXJlIGluIDExZyBvbmx5IGFkaG9jIG1vZGUKLQkJaWYgKChCc3NUeXBlID09IEJTU19BREhPQykgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykgJiYgKChTdXBSYXRlTGVuK0V4dFJhdGVMZW4pPCAxMikpCisJCQkJCUVsZW0tPk1zZywKKwkJCQkJRWxlbS0+TXNnTGVuLAorCQkJCQlFbGVtLT5DaGFubmVsLAorCQkJCQlBZGRyMiwKKwkJCQkJQnNzaWQsCisJCQkJCShjaGFyICopU3NpZCwKKwkJCQkJJlNzaWRMZW4sCisJCQkJCSZCc3NUeXBlLAorCQkJCQkmQmVhY29uUGVyaW9kLAorCQkJCQkmQ2hhbm5lbCwKKwkJCQkJJk5ld0NoYW5uZWwsCisJCQkJCSZUaW1lU3RhbXAsCisJCQkJCSZDZiwKKwkJCQkJJkF0aW1XaW4sCisJCQkJCSZDYXBhYmlsaXR5SW5mbywKKwkJCQkJJkVycCwKKwkJCQkJJkR0aW1Db3VudCwKKwkJCQkJJkR0aW1QZXJpb2QsCisJCQkJCSZCY2FzdEZsYWcsCisJCQkJCSZNZXNzYWdlVG9NZSwKKwkJCQkJU3VwUmF0ZSwKKwkJCQkJJlN1cFJhdGVMZW4sCisJCQkJCUV4dFJhdGUsCisJCQkJCSZFeHRSYXRlTGVuLAorCQkJCQkmQ2tpcEZsYWcsCisJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisJCQkJCSZFZGNhUGFybSwKKwkJCQkJJlFic3NMb2FkLAorCQkJCQkmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJJlJhbGlua0llLAorCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJJkh0Q2FwYWJpbGl0eSwKKwkJCQkJJkFkZEh0SW5mb0xlbiwKKwkJCQkJJkFkZEh0SW5mbywKKwkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsICZMZW5WSUUsIHBWSUUpKSB7CisJCS8qIERpc3F1YWxpZnkgMTFiIG9ubHkgYWRob2Mgd2hlbiB3ZSBhcmUgaW4gMTFnIG9ubHkgYWRob2MgbW9kZSAqLworCQlpZiAoKEJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykKKwkJICAgICYmICgoU3VwUmF0ZUxlbiArIEV4dFJhdGVMZW4pIDwgMTIpKQogCQkJcmV0dXJuOwogCi0JCS8vIEJFQUNPTiBmcm9tIGRlc2lyZWQgQlNTL0lCU1MgZm91bmQuIFdlIHNob3VsZCBiZSBhYmxlIHRvIGRlY2lkZSBtb3N0Ci0JCS8vIEJTUyBwYXJhbWV0ZXJzIGhlcmUuCi0JCS8vIFEuIEJ1dCB3aGF0IGhhcHBlbiBpZiB0aGlzIEpPSU4gZG9lc24ndCBjb25jbHVkZSBhIHN1Y2Nlc3NmdWwgQVNTT0NJQVRFSU9OPwotCQkvLyAgICBEbyB3ZSBuZWVkIHRvIHJlY2VvdmVyIGJhY2sgYWxsIHBhcmFtZXRlcnMgYmVsb25naW5nIHRvIHByZXZpb3VzIEJTUz8KLQkJLy8gQS4gU2hvdWxkIGJlIG5vdC4gVGhlcmUncyBubyBiYWNrLWRvb3IgcmVjb3ZlciB0byBwcmV2aW91cyBBUC4gSXQgc3RpbGwgbmVlZAotCQkvLyAgICBhIG5ldyBKT0lOLUFVVEgtQVNTT0Mgc2VxdWVuY2UuCi0JCWlmIChNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIEJzc2lkKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIHJlY2VpdmUgZGVzaXJlZCBCRUFDT04gYXQgSm9pbldhaXRCZWFjb24uLi4gQ2hhbm5lbCA9ICVkXG4iLCBDaGFubmVsKSk7Ci0JCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJLyogQkVBQ09OIGZyb20gZGVzaXJlZCBCU1MvSUJTUyBmb3VuZC4gV2Ugc2hvdWxkIGJlIGFibGUgdG8gZGVjaWRlIG1vc3QgKi8KKwkJLyogQlNTIHBhcmFtZXRlcnMgaGVyZS4gKi8KKwkJLyogUS4gQnV0IHdoYXQgaGFwcGVuIGlmIHRoaXMgSk9JTiBkb2Vzbid0IGNvbmNsdWRlIGEgc3VjY2Vzc2Z1bCBBU1NPQ0lBVEVJT04/ICovCisJCS8qICAgIERvIHdlIG5lZWQgdG8gcmVjZW92ZXIgYmFjayBhbGwgcGFyYW1ldGVycyBiZWxvbmdpbmcgdG8gcHJldmlvdXMgQlNTPyAqLworCQkvKiBBLiBTaG91bGQgYmUgbm90LiBUaGVyZSdzIG5vIGJhY2stZG9vciByZWNvdmVyIHRvIHByZXZpb3VzIEFQLiBJdCBzdGlsbCBuZWVkICovCisJCS8qICAgIGEgbmV3IEpPSU4tQVVUSC1BU1NPQyBzZXF1ZW5jZS4gKi8KKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQnNzaWQpKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJTWU5DIC0gcmVjZWl2ZSBkZXNpcmVkIEJFQUNPTiBhdCBKb2luV2FpdEJlYWNvbi4uLiBDaGFubmVsID0gJWRcbiIsCisJCQkJICBDaGFubmVsKSk7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwKKwkJCQkJJlRpbWVyQ2FuY2VsbGVkKTsKIAotCQkJLy8gVXBkYXRlIFJTU0kgdG8gcHJldmVudCBObyBzaWduYWwgZGlzcGxheSB3aGVuIGNhcmRzIGZpcnN0IGluaXRpYWxpemVkCi0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMAk9IENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKTsKLQkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxCT0gQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpOwotCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMik7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwCT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTA7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwWDgJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwIDw8IDM7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxCT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTE7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxWDgJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxIDw8IDM7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyCT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTI7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyWDgJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyIDw8IDM7CisJCQkvKiBVcGRhdGUgUlNTSSB0byBwcmV2ZW50IE5vIHNpZ25hbCBkaXNwbGF5IHdoZW4gY2FyZHMgZmlyc3QgaW5pdGlhbGl6ZWQgKi8KKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwID0KKwkJCSAgICBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCk7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSA9CisJCQkgICAgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIgPQorCQkJICAgIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKTsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgPQorCQkJICAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMFg4ID0KKwkJCSAgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwIDw8IDM7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxID0KKwkJCSAgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMTsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTFYOCA9CisJCQkgICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSA8PCAzOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMiA9CisJCQkgICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTI7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyWDggPQorCQkJICAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIgPDwgMzsKIAotCQkJLy8KLQkJCS8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgU1NJRCBvbmx5IHNldCB0byBhbnksIHRoZW4gd2UgY2FuIHJlY29yZCB0aGUgY3VycmVudCBTU0lELgotCQkJLy8gT3RoZXJ3aXNlIHdpbGwgY2F1c2UgaGlkZGVuIFNTSUQgYXNzb2NpYXRpb24gZmFpbGVkLgotCQkJLy8KLQkJCWlmIChwQWQtPk1sbWVBdXguU3NpZExlbiA9PSAwKQotCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKKwkJCS8qICovCisJCQkvKiBXZSBuZWVkIHRvIGNoZWNrIGlmIFNTSUQgb25seSBzZXQgdG8gYW55LCB0aGVuIHdlIGNhbiByZWNvcmQgdGhlIGN1cnJlbnQgU1NJRC4gKi8KKwkJCS8qIE90aGVyd2lzZSB3aWxsIGNhdXNlIGhpZGRlbiBTU0lEIGFzc29jaWF0aW9uIGZhaWxlZC4gKi8KKwkJCS8qICovCisJCQlpZiAocEFkLT5NbG1lQXV4LlNzaWRMZW4gPT0gMCkgeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBTc2lkLAorCQkJCQkgICAgICAgU3NpZExlbik7CiAJCQkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBTc2lkTGVuOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUlkeCA9IEJzc1NzaWRUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBDaGFubmVsKTsKKwkJCX0gZWxzZSB7CisJCQkJSWR4ID0KKwkJCQkgICAgQnNzU3NpZFRhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLAorCQkJCQkJICAgICAgIHBBZC0+TWxtZUF1eC5Tc2lkLAorCQkJCQkJICAgICAgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLAorCQkJCQkJICAgICAgIENoYW5uZWwpOwogCi0JCQkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKQotCQkJCXsKLQkJCQkJLy8KLQkJCQkJLy8gTXVsdGlwbGUgU1NJRCBjYXNlLCB1c2VkIGNvcnJlY3QgQ2FwYWJpbGl0eUluZm8KLQkJCQkJLy8KLQkJCQkJQ2FwYWJpbGl0eUluZm8gPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5DYXBhYmlsaXR5SW5mbzsKKwkJCQlpZiAoSWR4ID09IEJTU19OT1RfRk9VTkQpIHsKKwkJCQkJY2hhciBSc3NpID0gMDsKKwkJCQkJUnNzaSA9CisJCQkJCSAgICBSVE1QTWF4UnNzaShwQWQsCisJCQkJCQkJQ29udmVydFRvUnNzaShwQWQsCisJCQkJCQkJCSAgICAgIEVsZW0tPgorCQkJCQkJCQkgICAgICBSc3NpMCwKKwkJCQkJCQkJICAgICAgUlNTSV8wKSwKKwkJCQkJCQlDb252ZXJ0VG9Sc3NpKHBBZCwKKwkJCQkJCQkJICAgICAgRWxlbS0+CisJCQkJCQkJCSAgICAgIFJzc2kxLAorCQkJCQkJCQkgICAgICBSU1NJXzEpLAorCQkJCQkJCUNvbnZlcnRUb1Jzc2kocEFkLAorCQkJCQkJCQkgICAgICBFbGVtLT4KKwkJCQkJCQkJICAgICAgUnNzaTIsCisJCQkJCQkJCSAgICAgIFJTU0lfMikpOworCQkJCQlJZHggPQorCQkJCQkgICAgQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsCisJCQkJCQkJICAgICBCc3NpZCwKKwkJCQkJCQkgICAgIChjaGFyICopIFNzaWQsCisJCQkJCQkJICAgICBTc2lkTGVuLCBCc3NUeXBlLAorCQkJCQkJCSAgICAgQmVhY29uUGVyaW9kLCAmQ2YsCisJCQkJCQkJICAgICBBdGltV2luLAorCQkJCQkJCSAgICAgQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkJICAgICBTdXBSYXRlLAorCQkJCQkJCSAgICAgU3VwUmF0ZUxlbiwKKwkJCQkJCQkgICAgIEV4dFJhdGUsCisJCQkJCQkJICAgICBFeHRSYXRlTGVuLAorCQkJCQkJCSAgICAgJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgICAgICZBZGRIdEluZm8sCisJCQkJCQkJICAgICBIdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJICAgICBBZGRIdEluZm9MZW4sCisJCQkJCQkJICAgICBOZXdFeHRDaGFubmVsT2Zmc2V0LAorCQkJCQkJCSAgICAgQ2hhbm5lbCwgUnNzaSwKKwkJCQkJCQkgICAgIFRpbWVTdGFtcCwKKwkJCQkJCQkgICAgIENraXBGbGFnLAorCQkJCQkJCSAgICAgJkVkY2FQYXJtLAorCQkJCQkJCSAgICAgJlFvc0NhcGFiaWxpdHksCisJCQkJCQkJICAgICAmUWJzc0xvYWQsIExlblZJRSwKKwkJCQkJCQkgICAgIHBWSUUpOworCQkJCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpIHsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2NhblRhYi4KKwkJCQkJCQkgICAgICAgQnNzRW50cnlbSWR4XS4KKwkJCQkJCQkgICAgICAgUFRTRiwKKwkJCQkJCQkgICAgICAgJkVsZW0tPk1zZ1syNF0sCisJCQkJCQkJICAgICAgIDQpOworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi4KKwkJCQkJCQkgICAgICAgQnNzRW50cnlbSWR4XS4KKwkJCQkJCQkgICAgICAgVFRTRlswXSwKKwkJCQkJCQkgICAgICAgJkVsZW0tPlRpbWVTdGFtcC4KKwkJCQkJCQkgICAgICAgdS5Mb3dQYXJ0LCA0KTsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuCisJCQkJCQkJICAgICAgIEJzc0VudHJ5W0lkeF0uCisJCQkJCQkJICAgICAgIFRUU0ZbNF0sCisJCQkJCQkJICAgICAgICZFbGVtLT5UaW1lU3RhbXAuCisJCQkJCQkJICAgICAgIHUuTG93UGFydCwgNCk7CisJCQkJCQlDYXBhYmlsaXR5SW5mbyA9CisJCQkJCQkgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uCisJCQkJCQkgICAgQ2FwYWJpbGl0eUluZm87CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvKiAqLworCQkJCQkvKiBNdWx0aXBsZSBTU0lEIGNhc2UsIHVzZWQgY29ycmVjdCBDYXBhYmlsaXR5SW5mbyAqLworCQkJCQkvKiAqLworCQkJCQlDYXBhYmlsaXR5SW5mbyA9CisJCQkJCSAgICBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS4KKwkJCQkJICAgIENhcGFiaWxpdHlJbmZvOwogCQkJCX0KIAkJCX0KIAkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Cc3NpZCwgQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0JCQlwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87CisJCQlwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8gPQorCQkJICAgIENhcGFiaWxpdHlJbmZvICYgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTzsKIAkJCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gQnNzVHlwZTsKIAkJCXBBZC0+TWxtZUF1eC5CZWFjb25QZXJpb2QgPSBCZWFjb25QZXJpb2Q7CiAJCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IENoYW5uZWw7CkBAIC04MzYsMTA3ICs4NzcsMTU5IEBACiAJCQlwQWQtPk1sbWVBdXguQ2ZwTWF4RHVyYXRpb24gPSBDZi5DZnBNYXhEdXJhdGlvbjsKIAkJCXBBZC0+TWxtZUF1eC5BUFJhbGlua0llID0gUmFsaW5rSWU7CiAKLQkJCS8vIENvcHkgQVAncyBzdXBwb3J0ZWQgcmF0ZSB0byBNbG1lQXV4IGZvciBjcmVhdGluZyBhc3NvaWNhdGlvbiByZXF1ZXN0Ci0JCQkvLyBBbHNvIGZpbHRlciBvdXQgbm90IHN1cHBvcnRlZCByYXRlCisJCQkvKiBDb3B5IEFQJ3Mgc3VwcG9ydGVkIHJhdGUgdG8gTWxtZUF1eCBmb3IgY3JlYXRpbmcgYXNzb2ljYXRpb24gcmVxdWVzdCAqLworCQkJLyogQWxzbyBmaWx0ZXIgb3V0IG5vdCBzdXBwb3J0ZWQgcmF0ZSAqLwogCQkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOwotCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOwotCQkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBTdXBSYXRlLAorCQkJCSAgICAgICBTdXBSYXRlTGVuKTsKKwkJCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkJICAgICAgICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CiAJCQlwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47Ci0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7Ci0JCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkV4dFJhdGUsIEV4dFJhdGUsCisJCQkJICAgICAgIEV4dFJhdGVMZW4pOworCQkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwKKwkJCQkgICAgICAgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKIAotICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIDE2KTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LAorCQkJCSAgICAgICAxNik7CisKKwkJCWlmICgoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBOZGlzODAyXzExV0VQRW5hYmxlZCkKKwkJCSAgICAgJiYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPQorCQkJCSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSkKKwkJCSAgICB8fCAocEFkLT5Db21tb25DZmcuSFRfRGlzYWxsb3dUS0lQID09IEZBTFNFKSkgeworCQkJCWJBbGxvd05yYXRlID0gVFJVRTsKKwkJCX0KIAogCQkJcEFkLT5NbG1lQXV4Lk5ld0V4dENoYW5uZWxPZmZzZXQgPSBOZXdFeHRDaGFubmVsT2Zmc2V0OwogCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IEh0Q2FwYWJpbGl0eUxlbjsKIAotCQkJLy8gZmlsdGVyIG91dCB1bi1zdXBwb3J0ZWQgaHQgcmF0ZXMKLQkJCWlmICgoKEh0Q2FwYWJpbGl0eUxlbiA+IDApIHx8IChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkpICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQotCQkJewotCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBTSVpFX0hUX0NBUF9JRSk7Ci0gICAJCQkJUlRNUE1vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sICZBZGRIdEluZm8sIFNJWkVfQUREX0hUX0lORk9fSUUpOworCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJICAgICAgIFNJWkVfSFRfQ0FQX0lFKTsKKwkJCS8qIGZpbHRlciBvdXQgdW4tc3VwcG9ydGVkIGh0IHJhdGVzICovCisJCQlpZiAoKChIdENhcGFiaWxpdHlMZW4gPiAwKSB8fCAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApKQorCQkJICAgICYmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJCSYmIChiQWxsb3dOcmF0ZSkpKSB7CisJCQkJUlRNUE1vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sCisJCQkJCSAgICAgICAmQWRkSHRJbmZvLCBTSVpFX0FERF9IVF9JTkZPX0lFKTsKIAotCQkJCS8vIFN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NQ1NTZXQgc3RvcmVzIFBlZXIgQVAncyAxMW4gUnggY2FwYWJpbGl0eQotCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LCBIdENhcGFiaWxpdHkuTUNTU2V0LCAxNik7Ci0JCQkJcEFkLT5NbG1lQXV4Lk5ld0V4dENoYW5uZWxPZmZzZXQgPSBOZXdFeHRDaGFubmVsT2Zmc2V0OworCQkJCS8qIFN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NQ1NTZXQgc3RvcmVzIFBlZXIgQVAncyAxMW4gUnggY2FwYWJpbGl0eSAqLworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uCisJCQkJCSAgICAgICBNQ1NTZXQsIEh0Q2FwYWJpbGl0eS5NQ1NTZXQsIDE2KTsKKwkJCQlwQWQtPk1sbWVBdXguTmV3RXh0Q2hhbm5lbE9mZnNldCA9CisJCQkJICAgIE5ld0V4dENoYW5uZWxPZmZzZXQ7CiAJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOwotCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gVFJVRTsKKwkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9CisJCQkJICAgIFRSVUU7CiAJCQkJaWYgKFByZU5IdENhcGFiaWxpdHlMZW4gPiAwKQotCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPSBUUlVFOwotCQkJCVJUTVBDaGVja0h0KHBBZCwgQlNTSURfV0NJRCwgJkh0Q2FwYWJpbGl0eSwgJkFkZEh0SW5mbyk7Ci0JCQkJLy8gQ29weSBBUCBQYXJhbWV0ZXIgdG8gU3RhQWN0aXZlLiAgVGhpcyBpcyBhbHNvIGluIExpbmtVcC4KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uISAoTXBkdURlbnNpdHk9JWQsIE1heFJBbXBkdUZhY3Rvcj0lZCwgQlc9JWQpXG4iLAotCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NcGR1RGVuc2l0eSwgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTWF4UkFtcGR1RmFjdG9yLCBIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkpOworCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLgorCQkJCQkgICAgYlByZU5IdCA9IFRSVUU7CisJCQkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCAmSHRDYXBhYmlsaXR5LAorCQkJCQkgICAgJkFkZEh0SW5mbyk7CisJCQkJLyogQ29weSBBUCBQYXJhbWV0ZXIgdG8gU3RhQWN0aXZlLiAgVGhpcyBpcyBhbHNvIGluIExpbmtVcC4gKi8KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiUGVlckJlYWNvbkF0Sm9pbkFjdGlvbiEgKE1wZHVEZW5zaXR5PSVkLCBNYXhSQW1wZHVGYWN0b3I9JWQsIEJXPSVkKVxuIiwKKwkJCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS4KKwkJCQkJICBNcGR1RGVuc2l0eSwKKwkJCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS4KKwkJCQkJICBNYXhSQW1wZHVGYWN0b3IsCisJCQkJCSAgSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGgpKTsKIAotCQkJCWlmIChBZGRIdEluZm9MZW4gPiAwKQotCQkJCXsKKwkJCQlpZiAoQWRkSHRJbmZvTGVuID4gMCkgewogCQkJCQlDZW50cmFsQ2hhbm5lbCA9IEFkZEh0SW5mby5Db250cm9sQ2hhbjsKLQkJIAkJCS8vIENoZWNrIGFnYWluIHRoZSBCYW5kd2lkdGggY2FwYWJpbGl0eSBvZiB0aGlzIEFQLgotCQkgCQkJaWYgKChBZGRIdEluZm8uQ29udHJvbENoYW4gPiAyKSYmIChBZGRIdEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSAmJiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotCQkgCQkJewotCQkgCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuIC0gMjsKLQkJIAkJCX0KLQkJIAkJCWVsc2UgaWYgKChBZGRIdEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0FCT1ZFKSAmJiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotCQkgCQkJewotCQkgCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuICsgMjsKLQkJIAkJCX0KKwkJCQkJLyogQ2hlY2sgYWdhaW4gdGhlIEJhbmR3aWR0aCBjYXBhYmlsaXR5IG9mIHRoaXMgQVAuICovCisJCQkJCWlmICgoQWRkSHRJbmZvLkNvbnRyb2xDaGFuID4gMikKKwkJCQkJICAgICYmIChBZGRIdEluZm8uQWRkSHRJbmZvLgorCQkJCQkJRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQkVMT1cpCisJCQkJCSAgICAmJiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby4KKwkJCQkJCUNoYW5uZWxXaWR0aCA9PSBCV180MCkpIHsKKwkJCQkJCUNlbnRyYWxDaGFubmVsID0KKwkJCQkJCSAgICBBZGRIdEluZm8uQ29udHJvbENoYW4gLSAyOworCQkJCQl9IGVsc2UKKwkJCQkJICAgIGlmICgoQWRkSHRJbmZvLkFkZEh0SW5mby4KKwkJCQkJCSBFeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkKKwkJCQkJCSYmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLgorCQkJCQkJICAgIENoYW5uZWxXaWR0aCA9PSBCV180MCkpIHsKKwkJCQkJCUNlbnRyYWxDaGFubmVsID0KKwkJCQkJCSAgICBBZGRIdEluZm8uQ29udHJvbENoYW4gKyAyOworCQkJCQl9CisJCQkJCS8qIENoZWNrIEVycm9yIC4gKi8KKwkJCQkJaWYgKHBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCAhPQorCQkJCQkgICAgQ2VudHJhbENoYW5uZWwpCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uIEhUPT09PkJlYWNvbiBDZW50cmFsIENoYW5uZWwgPSAlZCwgQ29udHJvbCBDaGFubmVsID0gJWQuIE1sbWVhdXggQ2VudHJhbENoYW5uZWwgPSAlZFxuIiwKKwkJCQkJCQkgIENlbnRyYWxDaGFubmVsLAorCQkJCQkJCSAgQWRkSHRJbmZvLkNvbnRyb2xDaGFuLAorCQkJCQkJCSAgcEFkLT5NbG1lQXV4LgorCQkJCQkJCSAgQ2VudHJhbENoYW5uZWwpKTsKIAotCQkJCQkvLyBDaGVjayBFcnJvciAuCi0JCQkJCWlmIChwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgIT0gQ2VudHJhbENoYW5uZWwpCi0JCSAJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUGVlckJlYWNvbkF0Sm9pbkFjdGlvbiBIVD09PT5CZWFjb24gQ2VudHJhbCBDaGFubmVsID0gJWQsIENvbnRyb2wgQ2hhbm5lbCA9ICVkLiBNbG1lYXV4IENlbnRyYWxDaGFubmVsID0gJWRcbiIsIENlbnRyYWxDaGFubmVsLCBBZGRIdEluZm8uQ29udHJvbENoYW4sIHBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCkpOwotCi0JCSAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uIEhUPT09PkNlbnRyYWwgQ2hhbm5lbCA9ICVkLCBDb250cm9sIENoYW5uZWwgPSAlZCwgIC5cbiIsIENlbnRyYWxDaGFubmVsLCBBZGRIdEluZm8uQ29udHJvbENoYW4pKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uIEhUPT09PkNlbnRyYWwgQ2hhbm5lbCA9ICVkLCBDb250cm9sIENoYW5uZWwgPSAlZCwgIC5cbiIsCisJCQkJCQkgIENlbnRyYWxDaGFubmVsLAorCQkJCQkJICBBZGRIdEluZm8uQ29udHJvbENoYW4pKTsKIAogCQkJCX0KIAotCQkJfQotCQkJZWxzZQotCQkJewotICAgCQkJCS8vIFRvIHByZXZlbnQgZXJyb3IsIGxldCBsZWdhY3kgQVAgbXVzdCBoYXZlIHNhbWUgQ2VudHJhbENoYW5uZWwgYW5kIENoYW5uZWwuCi0JCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYgKFByZU5IdENhcGFiaWxpdHlMZW4gPT0gMCkpCi0JCQkJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+TWxtZUF1eC5DaGFubmVsOworCQkJfSBlbHNlIHsKKwkJCQkvKiBUbyBwcmV2ZW50IGVycm9yLCBsZXQgbGVnYWN5IEFQIG11c3QgaGF2ZSBzYW1lIENlbnRyYWxDaGFubmVsIGFuZCBDaGFubmVsLiAqLworCQkJCWlmICgoSHRDYXBhYmlsaXR5TGVuID09IDApCisJCQkJICAgICYmIChQcmVOSHRDYXBhYmlsaXR5TGVuID09IDApKQorCQkJCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPQorCQkJCQkgICAgcEFkLT5NbG1lQXV4LkNoYW5uZWw7CiAKLQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOwotCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBTSVpFX0hUX0NBUF9JRSk7Ci0JCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sIFNJWkVfQUREX0hUX0lORk9fSUUpOworCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0KKwkJCQkgICAgRkFMU0U7CisJCQkJcEFkLT5NbG1lQXV4Lk5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkgICAgICAgU0laRV9IVF9DQVBfSUUpOworCQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSAwOworCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLAorCQkJCQkgICAgICAgU0laRV9BRERfSFRfSU5GT19JRSk7CiAJCQl9CiAKIAkJCVJUTVBVcGRhdGVNbG1lUmF0ZShwQWQpOwogCi0JCQkvLyBjb3B5IFFPUyByZWxhdGVkIGluZm9ybWF0aW9uCisJCQkvKiBjb3B5IFFPUyByZWxhdGVkIGluZm9ybWF0aW9uICovCiAJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKQotCQkJCSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQotCQkJCSkKLQkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sICZFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRYnNzTG9hZCwgJlFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwgJlFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7Ci0JCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKLQkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKKwkJCSAgICB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJICAgICkgeworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwKKwkJCQkJICAgICAgICZFZGNhUGFybSwgc2l6ZW9mKHN0cnVjdCBydF9lZGNhX3Bhcm0pKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUWJzc0xvYWQsCisJCQkJCSAgICAgICAmUWJzc0xvYWQsCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksCisJCQkJCSAgICAgICAmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSkpOworCQkJfSBlbHNlIHsKKwkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2VkY2FfcGFybSkpOworCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRYnNzTG9hZCwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0pKTsKKwkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSkpOwogCQkJfQogCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gYWZ0ZXIgSk9JTiwgU3VwUmF0ZUxlbj0lZCwgRXh0UmF0ZUxlbj0lZFxuIiwKLQkJCQkJCQkJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlNZTkMgLSBhZnRlciBKT0lOLCBTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkXG4iLAorCQkJCSAgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbikpOwogCi0JCQlpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0ICE9IDB4RkYpCi0JCQl7Ci0JCQkJLy9XZSBuZWVkIHRvIGNoYW5nZSBvdXIgVHhQb3dlciBmb3IgQ0NYIDIuMCBBUCBDb250cm9sIG9mIENsaWVudCBUcmFuc21pdCBQb3dlcgotCQkJCUNoYW5nZVRvQ2VsbFBvd2VyTGltaXQocEFkLCBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpOwotCQkJfQotCQkJZWxzZSAgLy9Vc2VkIHRoZSBkZWZhdWx0IFRYIFBvd2VyIFBlcmNlbnRhZ2UuCi0JCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKKwkJCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgIT0gMHhGRikgeworCQkJCS8qV2UgbmVlZCB0byBjaGFuZ2Ugb3VyIFR4UG93ZXIgZm9yIENDWCAyLjAgQVAgQ29udHJvbCBvZiBDbGllbnQgVHJhbnNtaXQgUG93ZXIgKi8KKwkJCQlDaGFuZ2VUb0NlbGxQb3dlckxpbWl0KHBBZCwKKwkJCQkJCSAgICAgICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpOworCQkJfSBlbHNlCS8qVXNlZCB0aGUgZGVmYXVsdCBUWCBQb3dlciBQZXJjZW50YWdlLiAqLworCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0KKwkJCQkgICAgcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CiAKIAkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CiAJCQlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfSk9JTl9DT05GLCAyLCAmU3RhdHVzKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9KT0lOX0NPTkYsCisJCQkJICAgIDIsICZTdGF0dXMpOwogCQl9Ci0JCS8vIG5vdCB0byBtZSBCRUFDT04sIGlnbm9yZWQKKwkJLyogbm90IHRvIG1lIEJFQUNPTiwgaWdub3JlZCAqLwogCX0KLQkvLyBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlIHRoaXMgZnJhbWUKKwkvKiBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlIHRoaXMgZnJhbWUgKi8KIH0KIAogLyoKQEAgLTk0OCw2NjIgKzEwNDEsNjYwIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIFBlZXJCZWFjb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBQZWVyQmVhY29uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVQ0hBUiAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JQ0hBUiAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0JQ0ZfUEFSTSAgICAgICBDZlBhcm07Ci0JVUNIQVIgICAgICAgICBTc2lkTGVuLCBNZXNzYWdlVG9NZT0wLCBCc3NUeXBlLCBDaGFubmVsLCBOZXdDaGFubmVsLCBpbmRleD0wOwotCVVDSEFSICAgICAgICAgRHRpbUNvdW50PTAsIER0aW1QZXJpb2Q9MCwgQmNhc3RGbGFnPTA7Ci0JVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbywgQXRpbVdpbiwgQmVhY29uUGVyaW9kOworCXU4IEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07CisJY2hhciBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJc3RydWN0IHJ0X2NmX3Bhcm0gQ2ZQYXJtOworCXU4IFNzaWRMZW4sIE1lc3NhZ2VUb01lID0gMCwgQnNzVHlwZSwgQ2hhbm5lbCwgTmV3Q2hhbm5lbCwgaW5kZXggPSAwOworCXU4IER0aW1Db3VudCA9IDAsIER0aW1QZXJpb2QgPSAwLCBCY2FzdEZsYWcgPSAwOworCXUxNiBDYXBhYmlsaXR5SW5mbywgQXRpbVdpbiwgQmVhY29uUGVyaW9kOwogCUxBUkdFX0lOVEVHRVIgVGltZVN0YW1wOwotCVVTSE9SVCAgICAgICAgVGJ0dE51bVRvTmV4dFdha2VVcDsKLQlVQ0hBUiAgICAgICAgIEVycDsKLQlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUgkJICBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOwotCVVDSEFSCQkgIENraXBGbGFnOwotCVVTSE9SVCAgICAgICAgTGVuVklFOwotCVVDSEFSCQkgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdDsKLQlFRENBX1BBUk0gICAgICAgRWRjYVBhcm07Ci0JUUJTU19MT0FEX1BBUk0gIFFic3NMb2FkOwotCVFPU19DQVBBQklMSVRZX1BBUk0gUW9zQ2FwYWJpbGl0eTsKLQlVTE9ORyAgICAgICAgICAgUmFsaW5rSWU7Ci0JLy8gTmV3IGZvciBXUEEgc2VjdXJpdHkgc3VpdGVzCi0JVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07CQkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQotCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7Ci0JSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OwotCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLCBQcmVOSHRDYXBhYmlsaXR5TGVuOwotCVVDSEFSCQkJQWRkSHRJbmZvTGVuOwotCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisJdTE2IFRidHROdW1Ub05leHRXYWtlVXA7CisJdTggRXJwOworCXU4IFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLAorCSAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwl1OCBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOworCXU4IENraXBGbGFnOworCXUxNiBMZW5WSUU7CisJdTggQWlyb25ldENlbGxQb3dlckxpbWl0OworCXN0cnVjdCBydF9lZGNhX3Bhcm0gRWRjYVBhcm07CisJc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtIFFic3NMb2FkOworCXN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtIFFvc0NhcGFiaWxpdHk7CisJdW5zaWduZWQgbG9uZyBSYWxpbmtJZTsKKwkvKiBOZXcgZm9yIFdQQSBzZWN1cml0eSBzdWl0ZXMgKi8KKwl1OCBWYXJJRVtNQVhfVklFX0xFTl07CS8qIFRvdGFsIFZJRSBsZW5ndGggPSBNQVhfVklFX0xFTiAtIC01ICovCisJc3RydWN0IHJ0X25kaXNfODAyXzExX3ZhcmlhYmxlX2llcyAqcFZJRSA9IE5VTEw7CisJc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUgSHRDYXBhYmlsaXR5OworCXN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSBBZGRIdEluZm87CS8qIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRSAqLworCXU4IEh0Q2FwYWJpbGl0eUxlbiwgUHJlTkh0Q2FwYWJpbGl0eUxlbjsKKwl1OCBBZGRIdEluZm9MZW47CisJdTggTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CiAKIAlpZiAoIShJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkKLQkJKSkKKwkgICAgKSkKIAkJcmV0dXJuOwogCi0JLy8gSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUKLQlwVklFID0gKFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMpIFZhcklFOworCS8qIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlICovCisJcFZJRSA9IChzdHJ1Y3QgcnRfbmRpc184MDJfMTFfdmFyaWFibGVfaWVzICopVmFySUU7CiAJcFZJRS0+TGVuZ3RoID0gMDsKLSAgICBSVE1QWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5LCBzaXplb2YoSHRDYXBhYmlsaXR5KSk7Ci0JUlRNUFplcm9NZW1vcnkoJkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisJUlRNUFplcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEh0Q2FwYWJpbGl0eSkpOworCVJUTVBaZXJvTWVtb3J5KCZBZGRIdEluZm8sIHNpemVvZihzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUpKTsKIAogCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAotCQkJCQkJCQlFbGVtLT5Nc2csCi0JCQkJCQkJCUVsZW0tPk1zZ0xlbiwKLQkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKLQkJCQkJCQkJQWRkcjIsCi0JCQkJCQkJCUJzc2lkLAotCQkJCQkJCQlTc2lkLAotCQkJCQkJCQkmU3NpZExlbiwKLQkJCQkJCQkJJkJzc1R5cGUsCi0JCQkJCQkJCSZCZWFjb25QZXJpb2QsCi0JCQkJCQkJCSZDaGFubmVsLAotCQkJCQkJCQkmTmV3Q2hhbm5lbCwKLQkJCQkJCQkJJlRpbWVTdGFtcCwKLQkJCQkJCQkJJkNmUGFybSwKLQkJCQkJCQkJJkF0aW1XaW4sCi0JCQkJCQkJCSZDYXBhYmlsaXR5SW5mbywKLQkJCQkJCQkJJkVycCwKLQkJCQkJCQkJJkR0aW1Db3VudCwKLQkJCQkJCQkJJkR0aW1QZXJpb2QsCi0JCQkJCQkJCSZCY2FzdEZsYWcsCi0JCQkJCQkJCSZNZXNzYWdlVG9NZSwKLQkJCQkJCQkJU3VwUmF0ZSwKLQkJCQkJCQkJJlN1cFJhdGVMZW4sCi0JCQkJCQkJCUV4dFJhdGUsCi0JCQkJCQkJCSZFeHRSYXRlTGVuLAotCQkJCQkJCQkmQ2tpcEZsYWcsCi0JCQkJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCi0JCQkJCQkJCSZFZGNhUGFybSwKLQkJCQkJCQkJJlFic3NMb2FkLAotCQkJCQkJCQkmUW9zQ2FwYWJpbGl0eSwKLQkJCQkJCQkJJlJhbGlua0llLAotCQkJCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAotCQkJCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJJkFkZEh0SW5mb0xlbiwKLQkJCQkJCQkJJkFkZEh0SW5mbywKLQkJCQkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsCi0JCQkJCQkJCSZMZW5WSUUsCi0JCQkJCQkJCXBWSUUpKQotCXsKKwkJCQkJRWxlbS0+TXNnLAorCQkJCQlFbGVtLT5Nc2dMZW4sCisJCQkJCUVsZW0tPkNoYW5uZWwsCisJCQkJCUFkZHIyLAorCQkJCQlCc3NpZCwKKwkJCQkJU3NpZCwKKwkJCQkJJlNzaWRMZW4sCisJCQkJCSZCc3NUeXBlLAorCQkJCQkmQmVhY29uUGVyaW9kLAorCQkJCQkmQ2hhbm5lbCwKKwkJCQkJJk5ld0NoYW5uZWwsCisJCQkJCSZUaW1lU3RhbXAsCisJCQkJCSZDZlBhcm0sCisJCQkJCSZBdGltV2luLAorCQkJCQkmQ2FwYWJpbGl0eUluZm8sCisJCQkJCSZFcnAsCisJCQkJCSZEdGltQ291bnQsCisJCQkJCSZEdGltUGVyaW9kLAorCQkJCQkmQmNhc3RGbGFnLAorCQkJCQkmTWVzc2FnZVRvTWUsCisJCQkJCVN1cFJhdGUsCisJCQkJCSZTdXBSYXRlTGVuLAorCQkJCQlFeHRSYXRlLAorCQkJCQkmRXh0UmF0ZUxlbiwKKwkJCQkJJkNraXBGbGFnLAorCQkJCQkmQWlyb25ldENlbGxQb3dlckxpbWl0LAorCQkJCQkmRWRjYVBhcm0sCisJCQkJCSZRYnNzTG9hZCwKKwkJCQkJJlFvc0NhcGFiaWxpdHksCisJCQkJCSZSYWxpbmtJZSwKKwkJCQkJJkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJJlByZU5IdENhcGFiaWxpdHlMZW4sCisJCQkJCSZIdENhcGFiaWxpdHksCisJCQkJCSZBZGRIdEluZm9MZW4sCisJCQkJCSZBZGRIdEluZm8sCisJCQkJCSZOZXdFeHRDaGFubmVsT2Zmc2V0LCAmTGVuVklFLCBwVklFKSkgewogCQlCT09MRUFOIGlzX215X2Jzc2lkLCBpc19teV9zc2lkOwotCQlVTE9ORyAgIEJzc2lkeCwgTm93OwotCQlCU1NfRU5UUlkgKnBCc3M7Ci0JCUNIQVIJCVJlYWxSc3NpID0gUlRNUE1heFJzc2kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMSwgUlNTSV8xKSwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpKTsKKwkJdW5zaWduZWQgbG9uZyBCc3NpZHgsIE5vdzsKKwkJc3RydWN0IHJ0X2Jzc19lbnRyeSAqcEJzczsKKwkJY2hhciBSZWFsUnNzaSA9CisJCSAgICBSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKSwKKwkJCQlDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksCisJCQkJQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpKTsKIAotCQlpc19teV9ic3NpZCA9IE1BQ19BRERSX0VRVUFMKEJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk/IFRSVUUgOiBGQUxTRTsKLQkJaXNfbXlfc3NpZCA9IFNTSURfRVFVQUwoU3NpZCwgU3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbik/IFRSVUU6RkFMU0U7CisJCWlzX215X2Jzc2lkID0KKwkJICAgIE1BQ19BRERSX0VRVUFMKEJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCkgPyBUUlVFIDogRkFMU0U7CisJCWlzX215X3NzaWQgPQorCQkgICAgU1NJRF9FUVVBTChTc2lkLCBTc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLAorCQkJICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pID8gVFJVRSA6IEZBTFNFOwogCi0KLQkJLy8gaWdub3JlIEJFQUNPTiBub3QgZm9yIG15IFNTSUQKLQkJaWYgKCghIGlzX215X3NzaWQpICYmICghIGlzX215X2Jzc2lkKSkKKwkJLyogaWdub3JlIEJFQUNPTiBub3QgZm9yIG15IFNTSUQgKi8KKwkJaWYgKCghaXNfbXlfc3NpZCkgJiYgKCFpc19teV9ic3NpZCkpCiAJCQlyZXR1cm47CiAKLQkJLy8gSXQgbWVhbnMgU1RBIHdhaXRzIGRpc2Fzc29jIGNvbXBsZXRlbHkgZnJvbSB0aGlzIEFQLCBpZ25vcmVzIHRoaXMgYmVhY29uLgorCQkvKiBJdCBtZWFucyBTVEEgd2FpdHMgZGlzYXNzb2MgY29tcGxldGVseSBmcm9tIHRoaXMgQVAsIGlnbm9yZXMgdGhpcyBiZWFjb24uICovCiAJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfV0FJVF9ESVNBU1NPQykKIAkJCXJldHVybjsKIAotCQkvLyBDb3B5IENvbnRyb2wgY2hhbm5lbCBmb3IgdGhpcyBCU1NJRC4KKwkJLyogQ29weSBDb250cm9sIGNoYW5uZWwgZm9yIHRoaXMgQlNTSUQuICovCiAJCWlmIChBZGRIdEluZm9MZW4gIT0gMCkKIAkJCUNoYW5uZWwgPSBBZGRIdEluZm8uQ29udHJvbENoYW47CiAKIAkJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSB8fCAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApKQogCQkJSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CiAKLQkJLy8KLQkJLy8gSG91c2VrZWVwaW5nICJTc2lkQnNzVGFiIiB0YWJsZSBmb3IgbGF0ZXItb24gUk9BTWluZyB1c2FnZS4KLQkJLy8KKwkJLyogKi8KKwkJLyogSG91c2VrZWVwaW5nICJTc2lkQnNzVGFiIiB0YWJsZSBmb3IgbGF0ZXItb24gUk9BTWluZyB1c2FnZS4gKi8KKwkJLyogKi8KIAkJQnNzaWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsIENoYW5uZWwpOwotCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpCi0JCXsKLQkJCS8vIGRpc2NvdmVyIG5ldyBBUCBvZiB0aGlzIG5ldHdvcmssIGNyZWF0ZSBCU1MgZW50cnkKLQkJCUJzc2lkeCA9IEJzc1RhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TY2FuVGFiLCBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAotCQkJCQkJICZDZlBhcm0sIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLAotCQkJCQkJJkh0Q2FwYWJpbGl0eSwgJkFkZEh0SW5mbyxIdENhcGFiaWxpdHlMZW4sQWRkSHRJbmZvTGVuLE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsCi0JCQkJCQlSZWFsUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwKLQkJCQkJCSZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKLQkJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkgLy8gcmV0dXJuIGlmIEJTUyB0YWJsZSBmdWxsCisJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkgeworCQkJLyogZGlzY292ZXIgbmV3IEFQIG9mIHRoaXMgbmV0d29yaywgY3JlYXRlIEJTUyBlbnRyeSAqLworCQkJQnNzaWR4ID0KKwkJCSAgICBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U2NhblRhYiwgQnNzaWQsIFNzaWQsCisJCQkJCSAgICAgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAorCQkJCQkgICAgICZDZlBhcm0sIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLAorCQkJCQkgICAgIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsCisJCQkJCSAgICAgRXh0UmF0ZUxlbiwgJkh0Q2FwYWJpbGl0eSwKKwkJCQkJICAgICAmQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sCisJCQkJCSAgICAgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LAorCQkJCQkgICAgIENoYW5uZWwsIFJlYWxSc3NpLCBUaW1lU3RhbXAsCisJCQkJCSAgICAgQ2tpcEZsYWcsICZFZGNhUGFybSwKKwkJCQkJICAgICAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsCisJCQkJCSAgICAgcFZJRSk7CisJCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpCS8qIHJldHVybiBpZiBCU1MgdGFibGUgZnVsbCAqLwogCQkJCXJldHVybjsKIAotCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uUFRTRiwgJkVsZW0tPk1zZ1syNF0sIDQpOwotCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLlRUU0ZbMF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKLQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5UVFNGWzRdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7Ci0KLQorCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uUFRTRiwKKwkJCQkgICAgICAgJkVsZW0tPk1zZ1syNF0sIDQpOworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLlRUU0ZbMF0sCisJCQkJICAgICAgICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5UVFNGWzRdLAorCQkJCSAgICAgICAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CiAKIAkJfQogCi0JCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgKE5ld0NoYW5uZWwgIT0gMCkgJiYgKENoYW5uZWwgIT0gTmV3Q2hhbm5lbCkpCi0JCXsKLQkJCS8vIFN3aXRjaGluZyB0byBjaGFubmVsIDEgY2FuIHByZXZlbnQgZnJvbSByZXNjYW5uaW5nIHRoZSBjdXJyZW50IGNoYW5uZWwgaW1tZWRpYXRlbHkgKGJ5IGF1dG8gcmVjb25uZWN0aW9uKS4KLQkJCS8vIEluIGFkZGl0aW9uLCBjbGVhciB0aGUgTUxNRSBxdWV1ZSBhbmQgdGhlIHNjYW4gdGFibGUgdG8gZGlzY2FyZCB0aGUgUlggcGFja2V0cyBhbmQgcHJldmlvdXMgc2Nhbm5pbmcgcmVzdWx0cy4KKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJiAoTmV3Q2hhbm5lbCAhPSAwKQorCQkgICAgJiYgKENoYW5uZWwgIT0gTmV3Q2hhbm5lbCkpIHsKKwkJCS8qIFN3aXRjaGluZyB0byBjaGFubmVsIDEgY2FuIHByZXZlbnQgZnJvbSByZXNjYW5uaW5nIHRoZSBjdXJyZW50IGNoYW5uZWwgaW1tZWRpYXRlbHkgKGJ5IGF1dG8gcmVjb25uZWN0aW9uKS4gKi8KKwkJCS8qIEluIGFkZGl0aW9uLCBjbGVhciB0aGUgTUxNRSBxdWV1ZSBhbmQgdGhlIHNjYW4gdGFibGUgdG8gZGlzY2FyZCB0aGUgUlggcGFja2V0cyBhbmQgcHJldmlvdXMgc2Nhbm5pbmcgcmVzdWx0cy4gKi8KIAkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgMSwgRkFMU0UpOwogCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgMSk7Ci0JCSAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOwogCQkJTWxtZVF1ZXVlSW5pdCgmcEFkLT5NbG1lLlF1ZXVlKTsKIAkJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKLQkJICAgIFJUTVB1c2VjRGVsYXkoMTAwMDAwMCk7CQkvLyB1c2UgZGVsYXkgdG8gcHJldmVudCBTVEEgZG8gcmVhc3NvYworCQkJUlRNUHVzZWNEZWxheSgxMDAwMDAwKTsJLyogdXNlIGRlbGF5IHRvIHByZXZlbnQgU1RBIGRvIHJlYXNzb2MgKi8KIAotCQkJLy8gY2hhbm5lbCBzYW5pdHkgY2hlY2sKLQkJCWZvciAoaW5kZXggPSAwIDsgaW5kZXggPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpbmRleCsrKQotCQkJewotCQkJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2luZGV4XS5DaGFubmVsID09IE5ld0NoYW5uZWwpCi0JCQkJewotCQkJCQlwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJCS8qIGNoYW5uZWwgc2FuaXR5IGNoZWNrICovCisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpbmRleCsrKSB7CisJCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLkNoYW5uZWwgPT0KKwkJCQkgICAgTmV3Q2hhbm5lbCkgeworCQkJCQlwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsID0KKwkJCQkJICAgIE5ld0NoYW5uZWw7CiAJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBOZXdDaGFubmVsOwotCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKLQkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb24gLSBTVEEgcmVjZWl2ZSBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgSUUgKE5ldyBDaGFubmVsID0lZClcbiIsIE5ld0NoYW5uZWwpKTsKKwkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLAorCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuCisJCQkJCQkJICBDaGFubmVsLCBGQUxTRSk7CisJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsCisJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiUGVlckJlYWNvbiAtIFNUQSByZWNlaXZlIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBJRSAoTmV3IENoYW5uZWwgPSVkKVxuIiwKKwkJCQkJCSAgTmV3Q2hhbm5lbCkpOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CiAKLQkJCWlmIChpbmRleCA+PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQotCQkJeworCQkJaWYgKGluZGV4ID49IHBBZC0+Q2hhbm5lbExpc3ROdW0pIHsKIAkJCQlEQkdQUklOVF9FUlIoKCJQZWVyQmVhY29uKGNhbiBub3QgZmluZCBOZXcgQ2hhbm5lbD0lZCBpbiBDaGFubmVsTGlzdFslZF1cbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3ROdW0pKTsKIAkJCX0KIAkJfQorCQkvKiBpZiB0aGUgc3NpZCBtYXRjaGVkICYgYnNzaWQgdW5tYXRjaGVkLCB3ZSBzaG91bGQgc2VsZWN0IHRoZSBic3NpZCB3aXRoIGxhcmdlIHZhbHVlLiAqLworCQkvKiBUaGlzIG1pZ2h0IGhhcHBlbmVkIHdoZW4gdHdvIFNUQSBzdGFydCBhdCB0aGUgc2FtZSB0aW1lICovCisJCWlmICgoIWlzX215X2Jzc2lkKSAmJiBBREhPQ19PTihwQWQpKSB7CisJCQlpbnQgaTsKIAotCQkvLyBpZiB0aGUgc3NpZCBtYXRjaGVkICYgYnNzaWQgdW5tYXRjaGVkLCB3ZSBzaG91bGQgc2VsZWN0IHRoZSBic3NpZCB3aXRoIGxhcmdlIHZhbHVlLgotCQkvLyBUaGlzIG1pZ2h0IGhhcHBlbmVkIHdoZW4gdHdvIFNUQSBzdGFydCBhdCB0aGUgc2FtZSB0aW1lCi0JCWlmICgoISBpc19teV9ic3NpZCkgJiYgQURIT0NfT04ocEFkKSkKLQkJewotCQkJSU5UCWk7Ci0KLQkJCS8vIEFkZCB0aGUgc2FmZWd1YXJkIGFnYWluc3QgdGhlIG1pc21hdGNoIG9mIGFkaG9jIHdlcCBzdGF0dXMKLQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uV2VwU3RhdHVzKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBOb3QgbWF0Y2hlZCB3ZXAgc3RhdHVzICVkICVkXG4iLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLldlcFN0YXR1cykpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImJzc2lkPSVzXG4iLCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5Cc3NpZCkpOworCQkJLyogQWRkIHRoZSBzYWZlZ3VhcmQgYWdhaW5zdCB0aGUgbWlzbWF0Y2ggb2YgYWRob2Mgd2VwIHN0YXR1cyAqLworCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPQorCQkJICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLldlcFN0YXR1cykgewogCQkJCXJldHVybjsKIAkJCX0KLQotCQkJLy8gY29sbGFwc2UgaW50byB0aGUgQURIT0MgbmV0d29yayB3aGljaCBoYXMgYmlnZ2VyIEJTU0lEIHZhbHVlLgotCQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkJCXsKLQkJCQlpZiAoQnNzaWRbaV0gPiBwQWQtPkNvbW1vbkNmZy5Cc3NpZFtpXSkKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBtZXJnZSB0byB0aGUgSUJTUyB3aXRoIGJpZ2dlciBCU1NJRD0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCQkJCUJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKKwkJCS8qIGNvbGxhcHNlIGludG8gdGhlIEFESE9DIG5ldHdvcmsgd2hpY2ggaGFzIGJpZ2dlciBCU1NJRCB2YWx1ZS4gKi8KKwkJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCQlpZiAoQnNzaWRbaV0gPiBwQWQtPkNvbW1vbkNmZy5Cc3NpZFtpXSkgeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIlNZTkMgLSBtZXJnZSB0byB0aGUgSUJTUyB3aXRoIGJpZ2dlciBCU1NJRD0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkJCSAgQnNzaWRbMF0sIEJzc2lkWzFdLCBCc3NpZFsyXSwKKwkJCQkJCSAgQnNzaWRbM10sIEJzc2lkWzRdLAorCQkJCQkJICBCc3NpZFs1XSkpOwogCQkJCQlBc2ljRGlzYWJsZVN5bmMocEFkKTsKLQkJCQkJQ09QWV9NQUNfQUREUihwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgQnNzaWQpOworCQkJCQlDT1BZX01BQ19BRERSKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJCQkJICAgICAgQnNzaWQpOwogCQkJCQlBc2ljU2V0QnNzaWQocEFkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQkJCU1ha2VJYnNzQmVhY29uKHBBZCk7ICAgICAgICAvLyByZS1idWlsZCBCRUFDT04gZnJhbWUKLQkJCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7ICAgIC8vIGNvcHkgQkVBQ09OIGZyYW1lIHRvIG9uLWNoaXAgbWVtb3J5CisJCQkJCU1ha2VJYnNzQmVhY29uKHBBZCk7CS8qIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZSAqLworCQkJCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsJLyogY29weSBCRUFDT04gZnJhbWUgdG8gb24tY2hpcCBtZW1vcnkgKi8KIAkJCQkJaXNfbXlfYnNzaWQgPSBUUlVFOwogCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoQnNzaWRbaV0gPCBwQWQtPkNvbW1vbkNmZy5Cc3NpZFtpXSkKKwkJCQl9IGVsc2UgaWYgKEJzc2lkW2ldIDwgcEFkLT5Db21tb25DZmcuQnNzaWRbaV0pCiAJCQkJCWJyZWFrOwogCQkJfQogCQl9CiAKLQogCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwogCQlwQnNzID0gJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdOwotCQlwQnNzLT5Sc3NpID0gUmVhbFJzc2k7ICAgICAgIC8vIGxhc3Rlc3QgUlNTSQotCQlwQnNzLT5MYXN0QmVhY29uUnhUaW1lID0gTm93OyAgIC8vIGxhc3QgUlggdGltZXN0YW1wCisJCXBCc3MtPlJzc2kgPSBSZWFsUnNzaTsJLyogbGFzdGVzdCBSU1NJICovCisJCXBCc3MtPkxhc3RCZWFjb25SeFRpbWUgPSBOb3c7CS8qIGxhc3QgUlggdGltZXN0YW1wICovCiAKLQkJLy8KLQkJLy8gQkVBQ09OIGZyb20gbXkgQlNTSUQgLSBlaXRoZXIgSUJTUyBvciBJTkZSQSBuZXR3b3JrCi0JCS8vCi0JCWlmIChpc19teV9ic3NpZCkKLQkJewotCQkJUlhXSV9TVFJVQwlSeFdJOworCQkvKiAqLworCQkvKiBCRUFDT04gZnJvbSBteSBCU1NJRCAtIGVpdGhlciBJQlNTIG9yIElORlJBIG5ldHdvcmsgKi8KKwkJLyogKi8KKwkJaWYgKGlzX215X2Jzc2lkKSB7CisJCQlzdHJ1Y3QgcnRfcnh3aSBSeFdJOwogCiAJCQlwQWQtPlN0YUNmZy5EdGltQ291bnQgPSBEdGltQ291bnQ7CiAJCQlwQWQtPlN0YUNmZy5EdGltUGVyaW9kID0gRHRpbVBlcmlvZDsKIAkJCXBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgPSBOb3c7CiAKLQogCQkJUnhXSS5SU1NJMCA9IEVsZW0tPlJzc2kwOwogCQkJUnhXSS5SU1NJMSA9IEVsZW0tPlJzc2kxOwogCQkJUnhXSS5SU1NJMiA9IEVsZW0tPlJzc2kyOwogCiAJCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgJlJ4V0kpOwotCQkJaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCAhPSAweEZGKQotCQkJewotCQkJCS8vCi0JCQkJLy8gV2UgZ2V0IHRoZSBDaXNjbyAoY2N4KSAiVHhQb3dlciBMaW1pdCIgcmVxdWlyZWQKLQkJCQkvLyBDaGFuZ2VkIHRvIGFwcHJvcHJpYXRlIFR4UG93ZXIgTGltaXQgZm9yIENpc28gQ29tcGF0aWJsZSBFeHRlbnNpb25zCi0JCQkJLy8KLQkJCQlDaGFuZ2VUb0NlbGxQb3dlckxpbWl0KHBBZCwgQWlyb25ldENlbGxQb3dlckxpbWl0KTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLwotCQkJCS8vIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCBlcXVhbCB0byAweEZGIG1lYW5zIHRoZSBDaXNjbyAoY2N4KSAiVHhQb3dlciBMaW1pdCIgbm90IGV4aXN0LgotCQkJCS8vIFVzZWQgdGhlIGRlZmF1bHQgVFggUG93ZXIgUGVyY2VudGFnZSwgdGhhdCBzZXQgZnJvbSBVSS4KLQkJCQkvLwotCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisJCQlpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0ICE9IDB4RkYpIHsKKwkJCQkvKiAqLworCQkJCS8qIFdlIGdldCB0aGUgQ2lzY28gKGNjeCkgIlR4UG93ZXIgTGltaXQiIHJlcXVpcmVkICovCisJCQkJLyogQ2hhbmdlZCB0byBhcHByb3ByaWF0ZSBUeFBvd2VyIExpbWl0IGZvciBDaXNvIENvbXBhdGlibGUgRXh0ZW5zaW9ucyAqLworCQkJCS8qICovCisJCQkJQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdChwQWQsCisJCQkJCQkgICAgICAgQWlyb25ldENlbGxQb3dlckxpbWl0KTsKKwkJCX0gZWxzZSB7CisJCQkJLyogKi8KKwkJCQkvKiBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgZXF1YWwgdG8gMHhGRiBtZWFucyB0aGUgQ2lzY28gKGNjeCkgIlR4UG93ZXIgTGltaXQiIG5vdCBleGlzdC4gKi8KKwkJCQkvKiBVc2VkIHRoZSBkZWZhdWx0IFRYIFBvd2VyIFBlcmNlbnRhZ2UsIHRoYXQgc2V0IGZyb20gVUkuICovCisJCQkJLyogKi8KKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9CisJCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OwogCQkJfQogCi0jaWZkZWYgUlQyODYwCi0JCQkvLyBhdCBsZWFzdCBvbmUgMTFiIHBlZXIgam9pbmVkLiBkb3duZ3JhZGUgdGhlIE1heFR4UmF0ZSB0byAxMU1icHMKLQkJCS8vIGFmdGVyIGxhc3QgMTFiIHBlZXIgbGVmdCBmb3Igc2V2ZXJhbCBzZWNvbmRzLCB3ZSdsbCBhdXRvIHN3aXRjaCBiYWNrIHRvIDExRyByYXRlCi0JCQkvLyBpbiBNbG1lUGVyaW9kaWNFeGVjKCkKLSNlbmRpZgotCQkJaWYgKEFESE9DX09OKHBBZCkgJiYgKENBUF9JU19JQlNTX09OKENhcGFiaWxpdHlJbmZvKSkpCi0JCQl7Ci0jaWZkZWYgUlQyODYwCi0JCQkJQk9PTEVBTgliUmVzdGFydDsKLSAgICAgICAgICAgICAgICBCT09MRUFOCWJuUmVzdGFydDsKKwkJCWlmIChBREhPQ19PTihwQWQpICYmIChDQVBfSVNfSUJTU19PTihDYXBhYmlsaXR5SW5mbykpKSB7CisJCQkJdTggTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IDA7CisJCQkJdTggaWR4OworCQkJCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeTsKIAotCQkJCWJSZXN0YXJ0ID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgYm5SZXN0YXJ0ID0gRkFMU0U7Ci0KLQkJCQlkbwotCQkJCXsKLQkJCQkJaWYgKChTdXBSYXRlTGVuK0V4dFJhdGVMZW4gPD0gNCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IFJBVEVfMTEpKQotCQkJCQl7Ci0JCQkJCQlpZiAocEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCA9PSBGQUxTRSkKLQkJCQkJCXsKLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gMTFiIHBlZXIgam9pbmVkLiBkb3duLWdyYWRlIHRvIDExYiBUWCByYXRlcyBcbiIpKTsKLQkJCQkJCQliUmVzdGFydCA9IFRSVUU7Ci0JCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwgU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwotCQkJCQkJCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOwotCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLkV4dFJhdGUsIEV4dFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLQkJCQkJCQlwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKLQkJCQkJCQlwQWQtPlN0YUNmZy5BZGhvY0JPbmx5Sm9pbmVkID0gVFJVRTsKLQkJCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOwotCQkJCQkJCUFzaWNTZXRFZGNhUGFybShwQWQsIE5VTEwpOwotCQkJCQkJfQotCi0JCQkJCQkvLyB0aGlzIHRpbWVzdGFtcCBpcyBmb3IgTWxtZVBlcmlvZGljRXhlYygpIHRvIGNoZWNrIGlmIGFsbCAxMUIgcGVlcnMgaGF2ZSBsZWZ0Ci0JCQkJCQlwQWQtPlN0YUNmZy5MYXN0MTFiQmVhY29uUnhUaW1lID0gTm93OwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQotCQkJCQkvLyBVcGRhdGUgSHQgUGh5LgotCQkJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCi0JCQkJCXsKLQkJCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmCi0JCQkJCQkJIXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgJiYKLQkJCQkJCQkhcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCkKLQkJCQkJCQlBZGhvY1R1cm5PblFvcyhwQWQpOwotCi0JCQkJCQkvLyBIYW5kbGUgcmF0ZSBzd2l0Y2ggaXNzdWUgd2hlbiBBZGhvYyBtb2RlCi0JCQkJCQlpZiAoKFN1cFJhdGVMZW4rRXh0UmF0ZUxlbiA+PSA4KSAmJiAoSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAoSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKSkKLQkJCQkJCXsKLQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCA9PSBGQUxTRSkKLQkJCQkJCQl7Ci0JCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSAxMWcgcGVlciBqb2luZWQuIGRvd24tZ3JhZGUgdG8gMTFnIFRYIHJhdGVzIFxuIikpOwotCQkJCQkJCQliUmVzdGFydCA9IFRSVUU7Ci0JCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsIFN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLQkJCQkJCQkJcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47Ci0JCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLkV4dFJhdGUsIEV4dFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLQkJCQkJCQkJcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47Ci0JCQkJCQkJCXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgPSBUUlVFOwotCQkJCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOwotCQkJCQkJCQlBc2ljU2V0RWRjYVBhcm0ocEFkLCBOVUxMKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQkvLyB0aGlzIHRpbWVzdGFtcCBpcyBmb3IgTWxtZVBlcmlvZGljRXhlYygpIHRvIGNoZWNrIGlmIGFsbCAxMWcgcGVlcnMgaGF2ZSBsZWZ0Ci0JCQkJCQkJcEFkLT5TdGFDZmcuTGFzdDExZ0JlYWNvblJ4VGltZSA9IE5vdzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKCFwQWQtPlN0YUNmZy5BZGhvY0JHSm9pbmVkICYmCi0JCQkJCQkJCSAhcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCAmJgotCQkJCQkJCQkgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkgJiYKLQkJCQkJCQkJIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV18yMCkpCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkFkaG9jMjBOSm9pbmVkID09IEZBTFNFKQotCQkJCQkJCXsKLQkJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCi0JCQkJCQkJCXBBZC0+U3RhQ2ZnLkFkaG9jMjBOSm9pbmVkID0gVFJVRTsKLQkJCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksICZIdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKLQkJCQkJCQkJaWYgKEFkZEh0SW5mb0xlbiAhPSAwKQotCQkJCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sICZBZGRIdEluZm8sIEFkZEh0SW5mb0xlbik7Ci0JCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LCBIdENhcGFiaWxpdHkuTUNTU2V0LCAxNik7Ci0KLQkJCQkJCQkJUlRNUENoZWNrSHQocEFkLCBFbGVtLT5XY2lkLCAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8pOwotCQkJCQkJCQlDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKHBBZCk7Ci0JCQkJCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gVFJVRTsKLQkJCQkJCQkJYlJlc3RhcnQgPSBUUlVFOwotCQkJCQkJCQliblJlc3RhcnQgPSBUUlVFOwotCQkJCQkJCX0KLQkJCQkJCQkvLyB0aGlzIHRpbWVzdGFtcCBpcyBmb3IgTWxtZVBlcmlvZGljRXhlYygpIHRvIGNoZWNrIGlmIGFsbCAyME1IeiBOIHBlZXJzIGhhdmUgbGVmdAotCQkJCQkJCXBBZC0+U3RhQ2ZnLkxhc3QyME5CZWFjb25SeFRpbWUgPSBOb3c7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBTSVpFX0hUX0NBUF9JRSk7Ci0JCQkJCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgU0laRV9BRERfSFRfSU5GT19JRSk7Ci0JCQkJCX0KLQkJCQl9d2hpbGUgKEZBTFNFKTsKLQotCQkJCS8vIElmIHBlZXIgQWRob2MgaXMgbGVnYWN5IG1vZGUsIEkgZG9uJ3QgbmVlZCB0byBjYWxsIE1sbWVVcGRhdGVIdFR4UmF0ZXMgbm8gbWF0dGVyIEkgc3VwcG9ydCBIVCBvciBub3QKLQkJCQlpZiAoKGJSZXN0YXJ0ID09IFRSVUUpICYmIChiblJlc3RhcnQgPT0gRkFMU0UpKQotCQkJCXsKLQkJCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7Ci0JCQkJCU1ha2VJYnNzQmVhY29uKHBBZCk7ICAgICAgICAvLyByZS1idWlsZCBCRUFDT04gZnJhbWUKLQkJCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7ICAgIC8vIGNvcHkgdG8gb24tY2hpcCBtZW1vcnkKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKGJSZXN0YXJ0ID09IFRSVUUpICYmIChiblJlc3RhcnQgPT0gVFJVRSkpCi0JCQkJewotCQkJCQlNbG1lVXBkYXRlVHhSYXRlcyhwQWQsIEZBTFNFLCBCU1MwKTsKLQkJCQkJTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIEJTUzApOwotCQkJCQlNYWtlSWJzc0JlYWNvbihwQWQpOyAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCi0JCQkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOyAgICAvLyBjb3B5IHRvIG9uLWNoaXAgbWVtb3J5CisJCQkJLyogc3VwcG9ydGVkIHJhdGVzIGFycmF5IG1heSBub3QgYmUgc29ydGVkLiBzb3J0IGl0IGFuZCBmaW5kIHRoZSBtYXhpbXVtIHJhdGUgKi8KKwkJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IFN1cFJhdGVMZW47IGlkeCsrKSB7CisJCQkJCWlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwKKwkJCQkJICAgIChTdXBSYXRlW2lkeF0gJiAweDdmKSkKKwkJCQkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPQorCQkJCQkJICAgIFN1cFJhdGVbaWR4XSAmIDB4N2Y7CiAJCQkJfQogCi0JCQkJLy8gQXQgbGVhc3QgYW5vdGhlciBwZWVyIGluIHRoaXMgSUJTUywgZGVjbGFyZSBNZWRpYVN0YXRlIGFzIENPTk5FQ1RFRAotCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQotCQkJCXsKLQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7Ci0KLQkJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLQkJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLQkgICAgICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7Ci0JCQkJCUFzaWNTZXRCc3NpZChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQotCQkJCQkvLyAyMDAzLzAzLzEyIC0gam9obgotCQkJCQkvLyBNYWtlIHN1cmUgdGhpcyBlbnRyeSBpbiAiU2NhblRhYiIgdGFibGUsIHRodXMgY29tcGxpZXMgdG8gTWljcm9zb2Z0J3MgcG9saWN5IHRoYXQKLQkJCQkJLy8gInNpdGUgc3VydmV5IiByZXN1bHQgc2hvdWxkIGFsd2F5cyBpbmNsdWRlIHRoZSBjdXJyZW50IGNvbm5lY3RlZCBuZXR3b3JrLgotCQkJCQkvLwotCQkJCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgQ2hhbm5lbCk7Ci0JCQkJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKLQkJCQkJewotCQkJCQkJQnNzaWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCi0JCQkJCQkJCQkmQ2ZQYXJtLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwgJkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJCSZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLCBSZWFsUnNzaSwgVGltZVN0YW1wLCAwLAotCQkJCQkJCQkJJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOwotCQkJCQl9Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFESE9DICBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRC5cbiIpKTsKKwkJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IEV4dFJhdGVMZW47IGlkeCsrKSB7CisJCQkJCWlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwKKwkJCQkJICAgIChFeHRSYXRlW2lkeF0gJiAweDdmKSkKKwkJCQkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPQorCQkJCQkJICAgIEV4dFJhdGVbaWR4XSAmIDB4N2Y7CiAJCQkJfQogCi0JCQkJLy8gQWQtaG9jIG1vZGUgaXMgdXNpbmcgTUFDIGFkZHJlc3MgYXMgQkEgc2Vzc2lvbi4gU28gd2UgbmVlZCB0byBjb250aW51b3VzbHkgZmluZCBuZXdseSBqb2luZWQgYWRob2Mgc3RhdGlvbiBieSByZWNlaXZpbmcgYmVhY29uLgotCQkJCS8vIFRvIHByZXZlbnQgYWx3YXlzIGNoZWNrIHRoaXMsIHdlIHVzZSB3Y2lkID09IFJFU0VSVkVEX1dDSUQgdG8gcmVjb2duaXplIGl0IGFzIG5ld2x5IGpvaW5lZCBhZGhvYyBzdGF0aW9uLgotCQkJCWlmIChBREhPQ19PTihwQWQpICYmIChFbGVtLT5XY2lkID09IFJFU0VSVkVEX1dDSUQpKQotCQkJCXsKLQkJCQkJVUNIQVIJaWR4OwotCQkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQotCQkJCQkvLyBsb29rIHVwIHRoZSBleGlzdGluZyB0YWJsZQotCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIEFkZHIyKTsKLQkJCQkJaWYgKHBFbnRyeSA9PSBOVUxMKQotCQkJCQl7Ci0JCQkJCQkvLyBBbm90aGVyIGFkaG9jIGpvaW5pbmcsIGFkZCB0byBvdXIgTUFDIHRhYmxlLgotCQkJCQkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnRFbnRyeShwQWQsIEFkZHIyLCBCU1MwLCBGQUxTRSk7Ci0JCQkJCQlpZiAocEVudHJ5KQotCQkJCQkJewotCQkJCQkJCXBFbnRyeS0+U3N0ID0gU1NUX0FTU09DOwotCQkJCQkJCWlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKLQkJCQkJCQkvLyBBZnRlciBJbnNlcnRFbnRyeSwgV3JpdGUgdG8gQVNJQyBvbi1jaGlwIHRhYmxlLgotCQkJCQkJCVJUMjhYWF9TVEFfU0VDVVJJVFlfSU5GT19BREQocEFkLCBCU1MwLCBpZHgsIHBFbnRyeSk7Ci0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQURIT0MgJXg6JXg6JXg6JXg6JXg6JXggIGpvaW4gaW4uRW50cnk9JWRcbiIsIEFkZHIyWzBdLEFkZHIyWzFdLEFkZHIyWzJdLEFkZHIyWzNdLEFkZHIyWzRdLEFkZHIyWzVdLCBwRW50cnktPkFpZCkpOwotCi0JCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOwotCSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChIdENhcGFiaWxpdHlMZW4gPD0gMCkKLQkgICAgICAgICAgICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAwOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVyA9IDA7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAwOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKFN1cFJhdGVMZW4rRXh0UmF0ZUxlbiA8PSA0KSAmJiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkpCi0JICAgICAgICAJCQkJCXsKLQkgICAgICAgIAkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkgICAgICAgIAkJCQkJfQotCSAgICAgICAgCQkJCQllbHNlCi0JICAgICAgICAJCQkJCXsKLQkgICAgICAgIAkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JICAgICAgICAJCQkJCX0KLQkJCQkJCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCQkJCQkJCWVsc2UKLQkJCQkJCQl7Ci0JCQkJCQkJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgRkFMU0UsIDApOwotCQkJCQkJCQlNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgQlNTMCk7Ci0JCQkJCQkJfQotCi0JICAgICAgICAgICAgICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKHBBZCk7Ci0KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwotCi0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotI2VuZGlmIC8qIFJUMjg2MCAqLwotI2lmZGVmIFJUMjg3MAotCQkJCVVDSEFSCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IDA7Ci0JCQkJVUNIQVIJCQlpZHg7Ci0JCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7Ci0KLQkJCQkvLyBzdXBwb3J0ZWQgcmF0ZXMgYXJyYXkgbWF5IG5vdCBiZSBzb3J0ZWQuIHNvcnQgaXQgYW5kIGZpbmQgdGhlIG1heGltdW0gcmF0ZQotCQkJICAgIGZvciAoaWR4PTA7IGlkeDxTdXBSYXRlTGVuOyBpZHgrKykKLQkJCSAgICB7Ci0JCQkgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKFN1cFJhdGVbaWR4XSAmIDB4N2YpKQotCQkJICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IFN1cFJhdGVbaWR4XSAmIDB4N2Y7Ci0JCQkgICAgfQotCi0JCQkJZm9yIChpZHg9MDsgaWR4PEV4dFJhdGVMZW47IGlkeCsrKQotCQkJICAgIHsKLQkJCSAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoRXh0UmF0ZVtpZHhdICYgMHg3ZikpCi0JCQkgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gRXh0UmF0ZVtpZHhdICYgMHg3ZjsKLQkJCSAgICB9Ci0KLQkJCQkvLyBsb29rIHVwIHRoZSBleGlzdGluZyB0YWJsZQorCQkJCS8qIGxvb2sgdXAgdGhlIGV4aXN0aW5nIHRhYmxlICovCiAJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBBZGRyMik7CiAKLQkJCQkvLyBBZC1ob2MgbW9kZSBpcyB1c2luZyBNQUMgYWRkcmVzcyBhcyBCQSBzZXNzaW9uLiBTbyB3ZSBuZWVkIHRvIGNvbnRpbnVvdXNseSBmaW5kIG5ld2x5IGpvaW5lZCBhZGhvYyBzdGF0aW9uIGJ5IHJlY2VpdmluZyBiZWFjb24uCi0JCQkJLy8gVG8gcHJldmVudCBhbHdheXMgY2hlY2sgdGhpcywgd2UgdXNlIHdjaWQgPT0gUkVTRVJWRURfV0NJRCB0byByZWNvZ25pemUgaXQgYXMgbmV3bHkgam9pbmVkIGFkaG9jIHN0YXRpb24uCi0JCQkJaWYgKChBREhPQ19PTihwQWQpICYmIChFbGVtLT5XY2lkID09IFJFU0VSVkVEX1dDSUQpKSB8fAotCQkJCQkocEVudHJ5ICYmICgocEVudHJ5LT5MYXN0QmVhY29uUnhUaW1lICsgQURIT0NfRU5UUllfQkVBQ09OX0xPU1RfVElNRSkgPCBOb3cpKSkKLQkJCQl7CisJCQkJLyogQWQtaG9jIG1vZGUgaXMgdXNpbmcgTUFDIGFkZHJlc3MgYXMgQkEgc2Vzc2lvbi4gU28gd2UgbmVlZCB0byBjb250aW51b3VzbHkgZmluZCBuZXdseSBqb2luZWQgYWRob2Mgc3RhdGlvbiBieSByZWNlaXZpbmcgYmVhY29uLiAqLworCQkJCS8qIFRvIHByZXZlbnQgYWx3YXlzIGNoZWNrIHRoaXMsIHdlIHVzZSB3Y2lkID09IFJFU0VSVkVEX1dDSUQgdG8gcmVjb2duaXplIGl0IGFzIG5ld2x5IGpvaW5lZCBhZGhvYyBzdGF0aW9uLiAqLworCQkJCWlmICgoQURIT0NfT04ocEFkKQorCQkJCSAgICAgJiYgKEVsZW0tPldjaWQgPT0gUkVTRVJWRURfV0NJRCkpCisJCQkJICAgIHx8IChwRW50cnkKKwkJCQkJJiYKKwkJCQkJKChwRW50cnktPkxhc3RCZWFjb25SeFRpbWUgKworCQkJCQkgIEFESE9DX0VOVFJZX0JFQUNPTl9MT1NUX1RJTUUpIDwKKwkJCQkJIE5vdykpKSB7CiAJCQkJCWlmIChwRW50cnkgPT0gTlVMTCkKLQkJCQkJCS8vIEFub3RoZXIgYWRob2Mgam9pbmluZywgYWRkIHRvIG91ciBNQUMgdGFibGUuCi0JCQkJCQlwRW50cnkgPSBNYWNUYWJsZUluc2VydEVudHJ5KHBBZCwgQWRkcjIsIEJTUzAsIEZBTFNFKTsKKwkJCQkJCS8qIEFub3RoZXIgYWRob2Mgam9pbmluZywgYWRkIHRvIG91ciBNQUMgdGFibGUuICovCisJCQkJCQlwRW50cnkgPQorCQkJCQkJICAgIE1hY1RhYmxlSW5zZXJ0RW50cnkocEFkLAorCQkJCQkJCQkJQWRkcjIsCisJCQkJCQkJCQlCU1MwLAorCQkJCQkJCQkJRkFMU0UpOwogCi0JCQkJCWlmIChTdGFBZGRNYWNUYWJsZUVudHJ5KHBBZCwgcEVudHJ5LCBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLCAmSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4sIENhcGFiaWxpdHlJbmZvKSA9PSBGQUxTRSkKLQkJCQkJewotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQURIT0MgLSBBZGQgRW50cnkgZmFpbGVkLlxuIikpOworCQkJCQlpZiAoU3RhQWRkTWFjVGFibGVFbnRyeShwQWQsCisJCQkJCQkJCXBFbnRyeSwKKwkJCQkJCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmQWRkSHRJbmZvLAorCQkJCQkJCQlBZGRIdEluZm9MZW4sCisJCQkJCQkJCUNhcGFiaWxpdHlJbmZvKQorCQkJCQkgICAgPT0gRkFMU0UpIHsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJCSAoIkFESE9DIC0gQWRkIEVudHJ5IGZhaWxlZC5cbiIpKTsKIAkJCQkJCXJldHVybjsKIAkJCQkJfQogCiAJCQkJCWlmIChwRW50cnkgJiYKLQkJCQkJCShFbGVtLT5XY2lkID09IFJFU0VSVkVEX1dDSUQpKQotCQkJCQl7CisJCQkJCSAgICAoRWxlbS0+V2NpZCA9PSBSRVNFUlZFRF9XQ0lEKSkgewogCQkJCQkJaWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOwotCQkJCQkJUlQyOFhYX1NUQV9TRUNVUklUWV9JTkZPX0FERChwQWQsIEJTUzAsIGlkeCwgcEVudHJ5KTsKKwkJCQkJCVJUTVBfU1RBX1NFQ1VSSVRZX0lORk9fQUREKHBBZCwKKwkJCQkJCQkJCSAgIEJTUzAsCisJCQkJCQkJCQkgICBpZHgsCisJCQkJCQkJCQkgICBwRW50cnkpOwogCQkJCQl9CiAJCQkJfQogCiAJCQkJaWYgKHBFbnRyeSAmJiBwRW50cnktPlZhbGlkQXNDTEkpCiAJCQkJCXBFbnRyeS0+TGFzdEJlYWNvblJ4VGltZSA9IE5vdzsKIAotCQkJCS8vIEF0IGxlYXN0IGFub3RoZXIgcGVlciBpbiB0aGlzIElCU1MsIGRlY2xhcmUgTWVkaWFTdGF0ZSBhcyBDT05ORUNURUQKLQkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCQl7Ci0JCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQkJCS8qIEF0IGxlYXN0IGFub3RoZXIgcGVlciBpbiB0aGlzIElCU1MsIGRlY2xhcmUgTWVkaWFTdGF0ZSBhcyBDT05ORUNURUQgKi8KKwkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRworCQkJCSAgICAocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpIHsKKwkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLAorCQkJCQkJCSAgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwogCi0JCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0KKwkJCQkJICAgIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwogCQkJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotCSAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKKwkJCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CiAJCQkJCUFzaWNTZXRCc3NpZChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAotCQkJCQkvLyAyMDAzLzAzLzEyIC0gam9obgotCQkJCQkvLyBNYWtlIHN1cmUgdGhpcyBlbnRyeSBpbiAiU2NhblRhYiIgdGFibGUsIHRodXMgY29tcGxpZXMgdG8gTWljcm9zb2Z0J3MgcG9saWN5IHRoYXQKLQkJCQkJLy8gInNpdGUgc3VydmV5IiByZXN1bHQgc2hvdWxkIGFsd2F5cyBpbmNsdWRlIHRoZSBjdXJyZW50IGNvbm5lY3RlZCBuZXR3b3JrLgotCQkJCQkvLwotCQkJCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgQ2hhbm5lbCk7Ci0JCQkJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKLQkJCQkJewotCQkJCQkJQnNzaWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCi0JCQkJCQkJCQkmQ2ZQYXJtLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwgJkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJCSZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLCBSZWFsUnNzaSwgVGltZVN0YW1wLCAwLAotCQkJCQkJCQkJJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOworCQkJCQkvKiAyMDAzLzAzLzEyIC0gam9obiAqLworCQkJCQkvKiBNYWtlIHN1cmUgdGhpcyBlbnRyeSBpbiAiU2NhblRhYiIgdGFibGUsIHRodXMgY29tcGxpZXMgdG8gTWljcm9zb2Z0J3MgcG9saWN5IHRoYXQgKi8KKwkJCQkJLyogInNpdGUgc3VydmV5IiByZXN1bHQgc2hvdWxkIGFsd2F5cyBpbmNsdWRlIHRoZSBjdXJyZW50IGNvbm5lY3RlZCBuZXR3b3JrLiAqLworCQkJCQkvKiAqLworCQkJCQlCc3NpZHggPQorCQkJCQkgICAgQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsCisJCQkJCQkJICAgQ2hhbm5lbCk7CisJCQkJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkgeworCQkJCQkJQnNzaWR4ID0KKwkJCQkJCSAgICBCc3NUYWJsZVNldEVudHJ5KHBBZCwKKwkJCQkJCQkJICAgICAmcEFkLT4KKwkJCQkJCQkJICAgICBTY2FuVGFiLAorCQkJCQkJCQkgICAgIEJzc2lkLAorCQkJCQkJCQkgICAgIFNzaWQsCisJCQkJCQkJCSAgICAgU3NpZExlbiwKKwkJCQkJCQkJICAgICBCc3NUeXBlLAorCQkJCQkJCQkgICAgIEJlYWNvblBlcmlvZCwKKwkJCQkJCQkJICAgICAmQ2ZQYXJtLAorCQkJCQkJCQkgICAgIEF0aW1XaW4sCisJCQkJCQkJCSAgICAgQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkJCSAgICAgU3VwUmF0ZSwKKwkJCQkJCQkJICAgICBTdXBSYXRlTGVuLAorCQkJCQkJCQkgICAgIEV4dFJhdGUsCisJCQkJCQkJCSAgICAgRXh0UmF0ZUxlbiwKKwkJCQkJCQkJICAgICAmSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkgICAgICZBZGRIdEluZm8sCisJCQkJCQkJCSAgICAgSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkgICAgIEFkZEh0SW5mb0xlbiwKKwkJCQkJCQkJICAgICBOZXdFeHRDaGFubmVsT2Zmc2V0LAorCQkJCQkJCQkgICAgIENoYW5uZWwsCisJCQkJCQkJCSAgICAgUmVhbFJzc2ksCisJCQkJCQkJCSAgICAgVGltZVN0YW1wLAorCQkJCQkJCQkgICAgIDAsCisJCQkJCQkJCSAgICAgJkVkY2FQYXJtLAorCQkJCQkJCQkgICAgICZRb3NDYXBhYmlsaXR5LAorCQkJCQkJCQkgICAgICZRYnNzTG9hZCwKKwkJCQkJCQkJICAgICBMZW5WSUUsCisJCQkJCQkJCSAgICAgcFZJRSk7CiAJCQkJCX0KLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQURIT0MgIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVELlxuIikpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIkFESE9DICBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRC5cbiIpKTsKIAkJCQl9Ci0jZW5kaWYgLyogUlQyODcwICovCiAJCQl9CiAKLQkJCWlmIChJTkZSQV9PTihwQWQpKQotCQkJeworCQkJaWYgKElORlJBX09OKHBBZCkpIHsKIAkJCQlCT09MRUFOIGJVc2VTaG9ydFNsb3QsIGJVc2VCR1Byb3RlY3Rpb247CiAKLQkJCQkvLyBkZWNpZGUgdG8gdXNlL2NoYW5nZSB0byAtCi0JCQkJLy8gICAgICAxLiBsb25nIHNsb3QgKDIwIHVzKSBvciBzaG9ydCBzbG90ICg5IHVzKSB0aW1lCi0JCQkJLy8gICAgICAyLiB0dXJuIG9uL29mZiBSVFMvQ1RTIGFuZC9vciBDVFMtdG8tc2VsZiBwcm90ZWN0aW9uCi0JCQkJLy8gICAgICAzLiBzaG9ydCBwcmVhbWJsZQorCQkJCS8qIGRlY2lkZSB0byB1c2UvY2hhbmdlIHRvIC0gKi8KKwkJCQkvKiAgICAgIDEuIGxvbmcgc2xvdCAoMjAgdXMpIG9yIHNob3J0IHNsb3QgKDkgdXMpIHRpbWUgKi8KKwkJCQkvKiAgICAgIDIuIHR1cm4gb24vb2ZmIFJUUy9DVFMgYW5kL29yIENUUy10by1zZWxmIHByb3RlY3Rpb24gKi8KKwkJCQkvKiAgICAgIDMuIHNob3J0IHByZWFtYmxlICovCiAKLQkJCQkvL2JVc2VTaG9ydFNsb3QgPSBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSAmJiBDQVBfSVNfU0hPUlRfU0xPVChDYXBhYmlsaXR5SW5mbyk7Ci0JCQkJYlVzZVNob3J0U2xvdCA9IENBUF9JU19TSE9SVF9TTE9UKENhcGFiaWxpdHlJbmZvKTsKLQkJCQlpZiAoYlVzZVNob3J0U2xvdCAhPSBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKSkKKwkJCQkvKmJVc2VTaG9ydFNsb3QgPSBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSAmJiBDQVBfSVNfU0hPUlRfU0xPVChDYXBhYmlsaXR5SW5mbyk7ICovCisJCQkJYlVzZVNob3J0U2xvdCA9CisJCQkJICAgIENBUF9JU19TSE9SVF9TTE9UKENhcGFiaWxpdHlJbmZvKTsKKwkJCQlpZiAoYlVzZVNob3J0U2xvdCAhPQorCQkJCSAgICBPUFNUQVRVU19URVNUX0ZMQUcocEFkLAorCQkJCQkJICAgICAgIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQpKQogCQkJCQlBc2ljU2V0U2xvdFRpbWUocEFkLCBiVXNlU2hvcnRTbG90KTsKIAotCQkJCWJVc2VCR1Byb3RlY3Rpb24gPSAocEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID09IDEpIHx8ICAgIC8vIGFsd2F5cyB1c2UKLQkJCQkJCQkJICAgKChwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPT0gMCkgJiYgRVJQX0lTX1VTRV9QUk9URUNUSU9OKEVycCkpOworCQkJCWJVc2VCR1Byb3RlY3Rpb24gPSAocEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID09IDEpIHx8CS8qIGFsd2F5cyB1c2UgKi8KKwkJCQkgICAgKChwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPT0gMCkKKwkJCQkgICAgICYmIEVSUF9JU19VU0VfUFJPVEVDVElPTihFcnApKTsKIAotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpIC8vIGFsd2F5cyBubyBCRyBwcm90ZWN0aW9uIGluIEEtYmFuZC4gZmFsc2VseSBoYXBwZW5lZCB3aGVuIHN3aXRjaGluZyBBL0cgYmFuZCB0byBhIGR1YWwtYmFuZCBBUAorCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCS8qIGFsd2F5cyBubyBCRyBwcm90ZWN0aW9uIGluIEEtYmFuZC4gZmFsc2VseSBoYXBwZW5lZCB3aGVuIHN3aXRjaGluZyBBL0cgYmFuZCB0byBhIGR1YWwtYmFuZCBBUCAqLwogCQkJCQliVXNlQkdQcm90ZWN0aW9uID0gRkFMU0U7CiAKLQkJCQlpZiAoYlVzZUJHUHJvdGVjdGlvbiAhPSBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKSkKKwkJCQlpZiAoYlVzZUJHUHJvdGVjdGlvbiAhPQorCQkJCSAgICBPUFNUQVRVU19URVNUX0ZMQUcocEFkLAorCQkJCQkJICAgICAgIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKQogCQkJCXsKLQkJCQkJaWYgKGJVc2VCR1Byb3RlY3Rpb24pCi0JCQkJCXsKLQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCk7Ci0JCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIChPRkRNU0VUUFJPVEVDVHxDQ0tTRVRQUk9URUNUfEFMTE5fU0VUUFJPVEVDVCksRkFMU0UsKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpOwotCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAoT0ZETVNFVFBST1RFQ1R8Q0NLU0VUUFJPVEVDVHxBTExOX1NFVFBST1RFQ1QpLFRSVUUsKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkpOworCQkJCQlpZiAoYlVzZUJHUHJvdGVjdGlvbikgeworCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLAorCQkJCQkJCQkgIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpOworCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLAorCQkJCQkJCQkgIHBBZC0+TWxtZUF1eC4KKwkJCQkJCQkJICBBZGRIdEluZm8uCisJCQkJCQkJCSAgQWRkSHRJbmZvMi4KKwkJCQkJCQkJICBPcGVyYWlvbk1vZGUsCisJCQkJCQkJCSAgKE9GRE1TRVRQUk9URUNUCisJCQkJCQkJCSAgIHwKKwkJCQkJCQkJICAgQ0NLU0VUUFJPVEVDVAorCQkJCQkJCQkgICB8CisJCQkJCQkJCSAgIEFMTE5fU0VUUFJPVEVDVCksCisJCQkJCQkJCSAgRkFMU0UsCisJCQkJCQkJCSAgKHBBZC0+TWxtZUF1eC4KKwkJCQkJCQkJICAgQWRkSHRJbmZvLgorCQkJCQkJCQkgICBBZGRIdEluZm8yLgorCQkJCQkJCQkgICBOb25HZlByZXNlbnQKKwkJCQkJCQkJICAgPT0gMSkpOworCQkJCQl9IGVsc2UgeworCQkJCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsCisJCQkJCQkJCSAgICBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKTsKKwkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwKKwkJCQkJCQkJICBwQWQtPk1sbWVBdXguCisJCQkJCQkJCSAgQWRkSHRJbmZvLgorCQkJCQkJCQkgIEFkZEh0SW5mbzIuCisJCQkJCQkJCSAgT3BlcmFpb25Nb2RlLAorCQkJCQkJCQkgIChPRkRNU0VUUFJPVEVDVAorCQkJCQkJCQkgICB8CisJCQkJCQkJCSAgIENDS1NFVFBST1RFQ1QKKwkJCQkJCQkJICAgfAorCQkJCQkJCQkgICBBTExOX1NFVFBST1RFQ1QpLAorCQkJCQkJCQkgIFRSVUUsCisJCQkJCQkJCSAgKHBBZC0+TWxtZUF1eC4KKwkJCQkJCQkJICAgQWRkSHRJbmZvLgorCQkJCQkJCQkgICBBZGRIdEluZm8yLgorCQkJCQkJCQkgICBOb25HZlByZXNlbnQKKwkJCQkJCQkJICAgPT0gMSkpOwogCQkJCQl9CiAKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJTWU5DIC0gQVAgY2hhbmdlZCBCL0cgcHJvdGVjdGlvbiB0byAlZFxuIiwgYlVzZUJHUHJvdGVjdGlvbikpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLAorCQkJCQkJICgiU1lOQyAtIEFQIGNoYW5nZWQgQi9HIHByb3RlY3Rpb24gdG8gJWRcbiIsCisJCQkJCQkgIGJVc2VCR1Byb3RlY3Rpb24pKTsKIAkJCQl9Ci0KLQkJCQkvLyBjaGVjayBIdCBwcm90ZWN0aW9uIG1vZGUuIGFuZCBhZGhlcmUgdG8gdGhlIE5vbi1HRiBkZXZpY2UgaW5kaWNhdGlvbiBieSBBUC4KKwkJCQkvKiBjaGVjayBIdCBwcm90ZWN0aW9uIG1vZGUuIGFuZCBhZGhlcmUgdG8gdGhlIE5vbi1HRiBkZXZpY2UgaW5kaWNhdGlvbiBieSBBUC4gKi8KIAkJCQlpZiAoKEFkZEh0SW5mb0xlbiAhPSAwKSAmJgotCQkJCQkoKEFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSAhPSBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKSB8fAotCQkJCQkoQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ICE9IHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpKSkKLQkJCQl7Ci0JCQkJCXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSBBZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQ7Ci0JCQkJCXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgPSBBZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGU7Ci0JCQkJCWlmIChwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID09IDEpCi0JCQkJewotCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBUUlVFKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKKwkJCQkgICAgKChBZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgIT0KKwkJCQkgICAgICBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuCisJCQkJICAgICAgT3BlcmFpb25Nb2RlKQorCQkJCSAgICAgfHwgKEFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCAhPQorCQkJCQkgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLgorCQkJCQkgTm9uR2ZQcmVzZW50KSkpIHsKKwkJCQkJcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLgorCQkJCQkgICAgTm9uR2ZQcmVzZW50ID0KKwkJCQkJICAgIEFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudDsKKwkJCQkJcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLgorCQkJCQkgICAgT3BlcmFpb25Nb2RlID0KKwkJCQkJICAgIEFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZTsKKwkJCQkJaWYgKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi4KKwkJCQkJICAgIE5vbkdmUHJlc2VudCA9PSAxKSB7CisJCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsCisJCQkJCQkJCSAgcEFkLT5NbG1lQXV4LgorCQkJCQkJCQkgIEFkZEh0SW5mby4KKwkJCQkJCQkJICBBZGRIdEluZm8yLgorCQkJCQkJCQkgIE9wZXJhaW9uTW9kZSwKKwkJCQkJCQkJICBBTExOX1NFVFBST1RFQ1QsCisJCQkJCQkJCSAgRkFMU0UsIFRSVUUpOworCQkJCQl9IGVsc2UKKwkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwKKwkJCQkJCQkJICBwQWQtPk1sbWVBdXguCisJCQkJCQkJCSAgQWRkSHRJbmZvLgorCQkJCQkJCQkgIEFkZEh0SW5mbzIuCisJCQkJCQkJCSAgT3BlcmFpb25Nb2RlLAorCQkJCQkJCQkgIEFMTE5fU0VUUFJPVEVDVCwKKwkJCQkJCQkJICBGQUxTRSwgRkFMU0UpOwogCi0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBBUCBjaGFuZ2VkIE4gT3BlcmFpb25Nb2RlIHRvICVkXG4iLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKSk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiU1lOQyAtIEFQIGNoYW5nZWQgTiBPcGVyYWlvbk1vZGUgdG8gJWRcbiIsCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uCisJCQkJCQkgIEFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKSk7CiAJCQkJfQogCi0JCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKSAmJgotCQkJCQlFUlBfSVNfVVNFX0JBUktFUl9QUkVBTUJMRShFcnApKQotCQkJCXsKLQkJCQkJTWxtZVNldFR4UHJlYW1ibGUocEFkLCBSdDgwMl8xMVByZWFtYmxlTG9uZyk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBBUCBmb3JjZWQgdG8gdXNlIExPTkcgcHJlYW1ibGVcbiIpKTsKKwkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKQorCQkJCSAgICAmJiBFUlBfSVNfVVNFX0JBUktFUl9QUkVBTUJMRShFcnApKSB7CisJCQkJCU1sbWVTZXRUeFByZWFtYmxlKHBBZCwKKwkJCQkJCQkgIFJ0ODAyXzExUHJlYW1ibGVMb25nKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJTWU5DIC0gQVAgZm9yY2VkIHRvIHVzZSBsb25nIHByZWFtYmxlXG4iKSk7CiAJCQkJfQogCi0JCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgICAgJiYKLQkJCQkJKEVkY2FQYXJtLmJWYWxpZCA9PSBUUlVFKSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLQkJCQkJKEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCAhPSBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCkpCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQVAgY2hhbmdlIEVEQ0EgcGFyYW1ldGVycyhmcm9tICVkIHRvICVkKVxuIiwKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50LAotCQkJCQkJRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50KSk7CisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRworCQkJCSAgICAocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpCisJCQkJICAgICYmIChFZGNhUGFybS5iVmFsaWQgPT0gVFJVRSkKKwkJCQkgICAgJiYgKEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCAhPQorCQkJCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLgorCQkJCQlFZGNhVXBkYXRlQ291bnQpKSB7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiU1lOQyAtIEFQIGNoYW5nZSBFRENBIHBhcmFtZXRlcnMoZnJvbSAlZCB0byAlZClcbiIsCisJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uCisJCQkJCQkgIEVkY2FVcGRhdGVDb3VudCwKKwkJCQkJCSAgRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50KSk7CiAJCQkJCUFzaWNTZXRFZGNhUGFybShwQWQsICZFZGNhUGFybSk7CiAJCQkJfQotCi0JCQkJLy8gY29weSBRT1MgcmVsYXRlZCBpbmZvcm1hdGlvbgotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUFFic3NMb2FkLCAmUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUFFvc0NhcGFiaWxpdHksICZRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOworCQkJCS8qIGNvcHkgUU9TIHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBRYnNzTG9hZCwKKwkJCQkJICAgICAgICZRYnNzTG9hZCwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0pKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBRb3NDYXBhYmlsaXR5LAorCQkJCQkgICAgICAgJlFvc0NhcGFiaWxpdHksCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X3Fvc19jYXBhYmlsaXR5X3Bhcm0pKTsKIAkJCX0KLQotCQkJLy8gb25seSBJTkZSQVNUUlVDVFVSRSBtb2RlIHN1cHBvcnQgcG93ZXItc2F2aW5nIGZlYXR1cmUKLQkJCWlmICgoSU5GUkFfT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSkgfHwgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKQotCQkJewotCQkJCVVDSEFSIEZyZWVOdW1iZXI7Ci0JCQkJLy8gIDEuIEFQIGhhcyBiYWNrbG9nZ2VkIHVuaWNhc3QtdG8tbWUgZnJhbWUsIHN0YXkgQVdBS0UsIHNlbmQgUFNQT0xMCi0JCQkJLy8gIDIuIEFQIGhhcyBiYWNrbG9nZ2VkIGJyb2FkY2FzdC9tdWx0aWNhc3QgZnJhbWUgYW5kIHdlIHdhbnQgdGhvc2UgZnJhbWVzLCBzdGF5IEFXQUtFCi0JCQkJLy8gIDMuIHdlIGhhdmUgb3V0Z29pbmcgZnJhbWVzIGluIFR4UmluZyBvciBNZ210UmluZywgYmV0dGVyIHN0YXkgQVdBS0UKLQkJCQkvLyAgNC4gUHNtIGNoYW5nZSB0byBQV1JfU0FWRSwgYnV0IEFQIG5vdCBiZWVuIGluZm9ybWVkIHlldCwgd2UgYmV0dGVyIHN0YXkgQVdBS0UKLQkJCQkvLyAgNS4gb3RoZXJ3aXNlLCBwdXQgUEhZIGJhY2sgdG8gc2xlZXAgdG8gc2F2ZSBiYXR0ZXJ5LgotCQkJCWlmIChNZXNzYWdlVG9NZSkKLQkJCQl7Ci0jaWZkZWYgUlQyODYwCi0JCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCi0JCQkJCXsKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIHBBZC0+U3RhQ2ZnLkJCUFIzKTsKKwkJCS8qIG9ubHkgSU5GUkFTVFJVQ1RVUkUgbW9kZSBzdXBwb3J0IHBvd2VyLXNhdmluZyBmZWF0dXJlICovCisJCQlpZiAoKElORlJBX09OKHBBZCkgJiYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkpCisJCQkgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKSB7CisJCQkJdTggRnJlZU51bWJlcjsKKwkJCQkvKiAgMS4gQVAgaGFzIGJhY2tsb2dnZWQgdW5pY2FzdC10by1tZSBmcmFtZSwgc3RheSBBV0FLRSwgc2VuZCBQU1BPTEwgKi8KKwkJCQkvKiAgMi4gQVAgaGFzIGJhY2tsb2dnZWQgYnJvYWRjYXN0L211bHRpY2FzdCBmcmFtZSBhbmQgd2Ugd2FudCB0aG9zZSBmcmFtZXMsIHN0YXkgQVdBS0UgKi8KKwkJCQkvKiAgMy4gd2UgaGF2ZSBvdXRnb2luZyBmcmFtZXMgaW4gVHhSaW5nIG9yIE1nbXRSaW5nLCBiZXR0ZXIgc3RheSBBV0FLRSAqLworCQkJCS8qICA0LiBQc20gY2hhbmdlIHRvIFBXUl9TQVZFLCBidXQgQVAgbm90IGJlZW4gaW5mb3JtZWQgeWV0LCB3ZSBiZXR0ZXIgc3RheSBBV0FLRSAqLworCQkJCS8qICA1LiBvdGhlcndpc2UsIHB1dCBQSFkgYmFjayB0byBzbGVlcCB0byBzYXZlIGJhdHRlcnkuICovCisJCQkJaWYgKE1lc3NhZ2VUb01lKSB7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcKKwkJCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKSB7CisJCQkJCQkvKiBSZXN0b3JlIHRvIGNvcnJlY3QgQkJQIFIzIHZhbHVlICovCisJCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+CisJCQkJCQkgICAgMSkKKwkJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lECisJCQkJCQkJICAgIChwQWQsIEJCUF9SMywKKwkJCQkJCQkgICAgIHBBZC0+U3RhQ2ZnLkJCUFIzKTsKKwkJCQkJCS8qIFR1cm4gY2xrIHRvIDgwTWh6LiAqLwogCQkJCQl9Ci0jZW5kaWYKLQkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSAmJgotCQkJCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSAmJiBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLICYmIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTykKLQkJCQkJewotCQkJCQkJcEFkLT5Db21tb25DZmcuYk5lZWRTZW5kVHJpZ2dlckZyYW1lID0gVFJVRTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQlSVDI4WFhfUFNfUE9MTF9FTlFVRVVFKHBBZCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKEJjYXN0RmxhZyAmJiAoRHRpbUNvdW50ID09IDApICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKSkKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKwkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZQorCQkJCQkgICAgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS4KKwkJCQkJICAgIGJBUFNEQ2FwYWJsZQorCQkJCQkgICAgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRQorCQkJCQkgICAgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSworCQkJCQkgICAgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSQorCQkJCQkgICAgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTykgeworCQkJCQkJcEFkLT5Db21tb25DZmcuCisJCQkJCQkgICAgYk5lZWRTZW5kVHJpZ2dlckZyYW1lID0KKwkJCQkJCSAgICBUUlVFOworCQkJCQl9IGVsc2UKKwkJCQkJCVJUTVBfUFNfUE9MTF9FTlFVRVVFKHBBZCk7CisJCQkJfSBlbHNlIGlmIChCY2FzdEZsYWcgJiYgKER0aW1Db3VudCA9PSAwKQorCQkJCQkgICAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLAorCQkJCQkJCQkgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pKQogCQkJCXsKLSNpZmRlZiBSVDI4NjAKLQkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKLQkJCQkJewotCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOworI2lmZGVmIFJUTVBfTUFDX1BDSQorCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkJCSAgICAocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkgeworCQkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPgorCQkJCQkJICAgIDEpCisJCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRAorCQkJCQkJCSAgICAocEFkLCBCQlBfUjMsCisJCQkJCQkJICAgICBwQWQtPlN0YUNmZy5CQlBSMyk7CiAJCQkJCX0KLSNlbmRpZgotCQkJCX0KLQkJCQllbHNlIGlmICgocEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXS5OdW1iZXIgIT0gMCkJCQkJCQkJCQkJCQkJfHwKLQkJCQkJCShwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQkJfHwKLQkJCQkJCShwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQkJfHwKLQkJCQkJCShwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQkJfHwKLQkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfQkssIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAotCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8Ci0JCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX0FDX1ZJLCBUWF9SSU5HX1NJWkUgLSAxLCAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykJfHwKLQkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfVk8sIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAotCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9NR01ULCBNR01UX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKSkKLQkJCQl7Ci0JCQkJCS8vIFRPRE86IGNvbnNpZGVyIHNjaGVkdWxlZCBIQ0NBLiBtaWdodCBub3QgYmUgcHJvcGVyIHRvIHVzZSB0cmFkaXRpb25hbCBEVElNLWJhc2VkIHBvd2VyLXNhdmluZyBzY2hlbWUKLQkJCQkJLy8gY2FuIHdlIGNoZWF0IGhlcmUgKGkuZS4ganVzdCBjaGVjayBNR01UICYgQUNfQkUpIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2U/Ci0jaWZkZWYgUlQyODYwCi0JCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCi0JCQkJCXsKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIHBBZC0+U3RhQ2ZnLkJCUFIzKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKwkJCQl9IGVsc2UKKwkJCQkgICAgaWYgKChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLk51bWJlciAhPSAwKQorCQkJCQl8fCAocEFkLT5UeFN3UXVldWVbUUlEX0FDX0JFXS5OdW1iZXIgIT0KKwkJCQkJICAgIDApCisJCQkJCXx8IChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldLk51bWJlciAhPQorCQkJCQkgICAgMCkKKwkJCQkJfHwgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10uTnVtYmVyICE9CisJCQkJCSAgICAwKQorCQkJCQl8fAorCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0CisJCQkJCSAocEFkLCBRSURfQUNfQkssIFRYX1JJTkdfU0laRSAtIDEsCisJCQkJCSAgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJCXx8CisJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QKKwkJCQkJIChwQWQsIFFJRF9BQ19CRSwgVFhfUklOR19TSVpFIC0gMSwKKwkJCQkJICAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQkJfHwKKwkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdAorCQkJCQkgKHBBZCwgUUlEX0FDX1ZJLCBUWF9SSU5HX1NJWkUgLSAxLAorCQkJCQkgICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCQl8fAorCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0CisJCQkJCSAocEFkLCBRSURfQUNfVk8sIFRYX1JJTkdfU0laRSAtIDEsCisJCQkJCSAgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJCXx8CisJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QKKwkJCQkJIChwQWQsIFFJRF9NR01ULCBNR01UX1JJTkdfU0laRSAtIDEsCisJCQkJCSAgJkZyZWVOdW1iZXIpICE9CisJCQkJCSBORElTX1NUQVRVU19TVUNDRVNTKSkgeworCQkJCQkvKiBUT0RPOiBjb25zaWRlciBzY2hlZHVsZWQgSENDQS4gbWlnaHQgbm90IGJlIHByb3BlciB0byB1c2UgdHJhZGl0aW9uYWwgRFRJTS1iYXNlZCBwb3dlci1zYXZpbmcgc2NoZW1lICovCisJCQkJCS8qIGNhbiB3ZSBjaGVhdCBoZXJlIChpLmUuIGp1c3QgY2hlY2sgTUdNVCAmIEFDX0JFKSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlPyAqLworI2lmZGVmIFJUTVBfTUFDX1BDSQorCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkJCSAgICAocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkgeworCQkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPgorCQkJCQkJICAgIDEpCisJCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRAorCQkJCQkJCSAgICAocEFkLCBCQlBfUjMsCisJCQkJCQkJICAgICBwQWQtPlN0YUNmZy5CQlBSMyk7CiAJCQkJCX0KLSNlbmRpZgotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlVU0hPUlQgTmV4dER0aW0gPSBEdGltQ291bnQ7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKChwQWQtPkNvbW1vbkNmZy4KKwkJCQkJICAgICBiQUNNQVBTRFRyW1FJRF9BQ19WT10pCisJCQkJCSAgICB8fCAocEFkLT5Db21tb25DZmcuCisJCQkJCQliQUNNQVBTRFRyW1FJRF9BQ19WSV0pCisJCQkJCSAgICB8fCAocEFkLT5Db21tb25DZmcuCisJCQkJCQliQUNNQVBTRFRyW1FJRF9BQ19CS10pCisJCQkJCSAgICB8fCAocEFkLT5Db21tb25DZmcuCisJCQkJCQliQUNNQVBTRFRyW1FJRF9BQ19CRV0pKSB7CisJCQkJCQkvKgorCQkJCQkJICAgV01NIFNwZWMgdjEuMCAzLjYuMi40LAorCQkJCQkJICAgVGhlIFdNTSBTVEEgc2hhbGwgcmVtYWluIGF3YWtlIHVudGlsIGl0IHJlY2VpdmVzIGEKKwkJCQkJCSAgIFFvUyBEYXRhIG9yIE51bGwgZnJhbWUgYWRkcmVzc2VkIHRvIGl0LCB3aXRoIHRoZQorCQkJCQkJICAgRU9TUCBzdWJmaWVsZCBpbiBRb1MgQ29udHJvbCBmaWVsZCBzZXQgdG8gMS4KIAotCQkJCQlpZiAoTmV4dER0aW0gPT0gMCkKLQkJCQkJCU5leHREdGltID0gRHRpbVBlcmlvZDsKKwkJCQkJCSAgIFNvIHdlIGNhbiBub3Qgc2xlZXAgaGVyZSBvciB3ZSB3aWxsIHN1ZmZlciBhIGNhc2U6CiAKLQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudDsKLQkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKSAmJiAoVGJ0dE51bVRvTmV4dFdha2VVcCA+IE5leHREdGltKSkKLQkJCQkJCVRidHROdW1Ub05leHRXYWtlVXAgPSBOZXh0RHRpbTsKKwkJCQkJCSAgIFBTIE1hbmFnZW1lbnQgRnJhbWUgLS0+CisJCQkJCQkgICBUcmlnZ2VyIGZyYW1lIC0tPgorCQkJCQkJICAgQmVhY29uIChUSU09MCkgKEJlYWNvbiBpcyBjbG9zZXIgdG8gVHJpZyBmcmFtZSkgLS0+CisJCQkJCQkgICBTdGF0aW9uIGdvZXMgdG8gc2xlZXAgLS0+CisJCQkJCQkgICBBUCBkZWxpdmVyeSBxdWV1ZWQgVUFQU0QgcGFja2V0cyAtLT4KKwkJCQkJCSAgIFN0YXRpb24gY2FuIE5PVCByZWNlaXZlIHRoZSByZXBseQogCi0JCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJCQkJewotI2lmZGVmIFJUMjg2MAotCQkJCQkJLy8gU2V0IGEgZmxhZyB0byBnbyB0byBzbGVlcCAuIFRoZW4gYWZ0ZXIgcGFyc2UgdGhpcyBSeERvbmVJbnRlcnJ1cHQsIHdpbGwgZ28gdG8gc2xlZXAgbW9kZS4KLQkJCQkJCVJUTVBfU0VUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0dPX1RPX1NMRUVQX05PVyk7Ci0JCQkJCQlwQWQtPlRoaXNUYnR0TnVtVG9OZXh0V2FrZVVwID0gVGJ0dE51bVRvTmV4dFdha2VVcDsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkJCQkJQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKLSNlbmRpZgorCQkJCQkJICAgTWF5YmUgd2UgbmVlZCBhIHRpbWVvdXQgdGltZXIgdG8gYXZvaWQgdGhhdCB3ZSBkbworCQkJCQkJICAgTk9UIHJlY2VpdmUgdGhlIEVPU1AgZnJhbWUuCisKKwkJCQkJCSAgIFdlIGNhbiBub3QgdXNlIE1vcmUgRGF0YSB0byBjaGVjayBpZiBTUCBpcyBlbmRlZAorCQkJCQkJICAgZHVlIHRvIE1heFNQTGVuZ3RoLgorCQkJCQkJICovCisJCQkJCX0gZWxzZSB7CisJCQkJCQl1MTYgTmV4dER0aW0gPSBEdGltQ291bnQ7CisKKwkJCQkJCWlmIChOZXh0RHRpbSA9PSAwKQorCQkJCQkJCU5leHREdGltID0gRHRpbVBlcmlvZDsKKworCQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9CisJCQkJCQkgICAgcEFkLT5TdGFDZmcuCisJCQkJCQkgICAgRGVmYXVsdExpc3RlbkNvdW50OworCQkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRworCQkJCQkJICAgIChwQWQsCisJCQkJCQkgICAgIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKQorCQkJCQkJICAgICYmIChUYnR0TnVtVG9OZXh0V2FrZVVwID4KKwkJCQkJCQlOZXh0RHRpbSkpCisJCQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9CisJCQkJCQkJICAgIE5leHREdGltOworCisJCQkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRworCQkJCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfRE9aRSkpIHsKKwkJCQkJCQkvKiBTZXQgYSBmbGFnIHRvIGdvIHRvIHNsZWVwIC4gVGhlbiBhZnRlciBwYXJzZSB0aGlzIFJ4RG9uZUludGVycnVwdCwgd2lsbCBnbyB0byBzbGVlcCBtb2RlLiAqLworCQkJCQkJCXBBZC0+CisJCQkJCQkJICAgIFRoaXNUYnR0TnVtVG9OZXh0V2FrZVVwCisJCQkJCQkJICAgID0KKwkJCQkJCQkgICAgVGJ0dE51bVRvTmV4dFdha2VVcDsKKwkJCQkJCQlBc2ljU2xlZXBUaGVuQXV0b1dha2V1cAorCQkJCQkJCSAgICAocEFkLAorCQkJCQkJCSAgICAgcEFkLT4KKwkJCQkJCQkgICAgIFRoaXNUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKwkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfQotCQkvLyBub3QgbXkgQlNTSUQsIGlnbm9yZSBpdAorCQkvKiBub3QgbXkgQlNTSUQsIGlnbm9yZSBpdCAqLwogCX0KLQkvLyBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlIHRoaXMgZnJhbWUKKwkvKiBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlIHRoaXMgZnJhbWUgKi8KIH0KIAogLyoKQEAgLTE2MTIsMTE2ICsxNzAzLDEyNiBAQAogCQlSZWNlaXZlIFBST0JFIFJFUSBmcm9tIHJlbW90ZSBwZWVyIHdoZW4gb3BlcmF0aW5nIGluIElCU1MgbW9kZQogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgUGVlclByb2JlUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgUGVlclByb2JlUmVxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVQ0hBUiAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JQ0hBUiAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0JVUNIQVIgICAgICAgICBTc2lkTGVuOwotCVVDSEFSCQkgIEh0TGVuLCBBZGRIdExlbiwgTmV3RXh0TGVuOwotCUhFQURFUl84MDJfMTEgUHJvYmVSc3BIZHI7Ci0JTkRJU19TVEFUVVMgICBOU3RhdHVzOwotCVBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7CisJdTggQWRkcjJbTUFDX0FERFJfTEVOXTsKKwljaGFyIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwl1OCBTc2lkTGVuOworCXU4IEh0TGVuLCBBZGRIdExlbiwgTmV3RXh0TGVuOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIFByb2JlUnNwSGRyOworCWludCBOU3RhdHVzOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuID0gMDsKIAlMQVJHRV9JTlRFR0VSIEZha2VUaW1lc3RhbXA7Ci0JVUNIQVIgICAgICAgICBEc0xlbiA9IDEsIElic3NMZW4gPSAyOwotCVVDSEFSICAgICAgICAgTG9jYWxFcnBJZVszXSA9IHtJRV9FUlAsIDEsIDB9OwotCUJPT0xFQU4gICAgICAgUHJpdmFjeTsKLQlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvOwotCVVDSEFSCQkgIFJTTkllID0gSUVfV1BBOworCXU4IERzTGVuID0gMSwgSWJzc0xlbiA9IDI7CisJdTggTG9jYWxFcnBJZVszXSA9IHsgSUVfRVJQLCAxLCAwIH07CisJQk9PTEVBTiBQcml2YWN5OworCXUxNiBDYXBhYmlsaXR5SW5mbzsKKwl1OCBSU05JZSA9IElFX1dQQTsKIAotCWlmICghIEFESE9DX09OKHBBZCkpCisJaWYgKCFBREhPQ19PTihwQWQpKQogCQlyZXR1cm47CiAKLQlpZiAoUGVlclByb2JlUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCBTc2lkLCAmU3NpZExlbikpCi0JewotCQlpZiAoKFNzaWRMZW4gPT0gMCkgfHwgU1NJRF9FUVVBTChTc2lkLCBTc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSkKLQkJewotCQkJLy8gYWxsb2NhdGUgYW5kIHNlbmQgb3V0IFByb2JlUnNwIGZyYW1lCi0JCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChQZWVyUHJvYmVSZXFTYW5pdHkKKwkgICAgKHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCBTc2lkLCAmU3NpZExlbikpIHsKKwkJaWYgKChTc2lkTGVuID09IDApCisJCSAgICB8fCBTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSkgeworCQkJLyogYWxsb2NhdGUgYW5kIHNlbmQgb3V0IFByb2JlUnNwIGZyYW1lICovCisJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCiAJCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQogCQkJCXJldHVybjsKIAotCQkJLy9wQWQtPlN0YUNmZy5BdGltV2luID0gMDsgIC8vID8/Pz8/PworCQkJLypwQWQtPlN0YUNmZy5BdGltV2luID0gMDsgIC8vID8/Pz8/PyAqLwogCi0JCQlQcml2YWN5ID0gKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB8fAotCQkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKLQkJCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpOwotCQkJQ2FwYWJpbGl0eUluZm8gPSBDQVBfR0VORVJBVEUoMCwgMSwgUHJpdmFjeSwgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KSwgMCwgMCk7CisJCQlQcml2YWN5ID0KKwkJCSAgICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09CisJCQkgICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpCisJCQkgICAgfHwgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PQorCQkJCU5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQkgICAgfHwgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PQorCQkJCU5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpOworCQkJQ2FwYWJpbGl0eUluZm8gPQorCQkJICAgIENBUF9HRU5FUkFURSgwLCAxLCBQcml2YWN5LAorCQkJCQkgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0KKwkJCQkJICBSdDgwMl8xMVByZWFtYmxlU2hvcnQpLCAwLCAwKTsKIAotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAgICAgJlByb2JlUnNwSGRyLAotCQkJCQkJCSAgVElNRVNUQU1QX0xFTiwgICAgICAgICAgICAgICAgJkZha2VUaW1lc3RhbXAsCi0JCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kLAotCQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNhcGFiaWxpdHlJbmZvLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLAotCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZCwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwKLQkJCQkJCQkgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sICAgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEc0xlbiwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5DaGFubmVsLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJYnNzTGVuLAotCQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLkF0aW1XaW4sCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSwgJlByb2JlUnNwSGRyLAorCQkJCQkgIFRJTUVTVEFNUF9MRU4sICZGYWtlVGltZXN0YW1wLAorCQkJCQkgIDIsICZwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QsCisJCQkJCSAgMiwgJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkgIDEsICZTc2lkSWUsCisJCQkJCSAgMSwgJnBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCisJCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwKKwkJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkLCAxLCAmU3VwUmF0ZUllLCAxLAorCQkJCQkgICZwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLAorCQkJCQkgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sCisJCQkJCSAgcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwgMSwgJkRzSWUsIDEsCisJCQkJCSAgJkRzTGVuLCAxLCAmcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgMSwKKwkJCQkJICAmSWJzc0llLCAxLCAmSWJzc0xlbiwgMiwKKwkJCQkJICAmcEFkLT5TdGFBY3RpdmUuQXRpbVdpbiwgRU5EX09GX0FSR1MpOwogCi0JCQlpZiAocEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbikKLQkJCXsKLQkJCQlVTE9ORyB0bXA7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgJnRtcCwKLQkJCQkJCQkJICAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbEVycEllLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4sCi0JCQkJCQkJCSAgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiwgICAgJnBBZC0+U3RhQWN0aXZlLkV4dFJhdGUsCi0JCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJaWYgKHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4pIHsKKwkJCQl1bnNpZ25lZCBsb25nIHRtcDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJCQkgIDMsIExvY2FsRXJwSWUsCisJCQkJCQkgIDEsICZFeHRSYXRlSWUsCisJCQkJCQkgIDEsICZwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuLAorCQkJCQkJICBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuLAorCQkJCQkJICAmcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IHRtcDsKKwkJCX0KKwkJCS8qIElmIGFkaG9jIHNlY3J1aXR5IGlzIHNldCBmb3IgV1BBLU5vbmUsIGFwcGVuZCB0aGUgY2lwaGVyIHN1aXRlIElFICovCisJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgeworCQkJCXVuc2lnbmVkIGxvbmcgdG1wOworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCSAgMSwgJlJTTkllLAorCQkJCQkJICAxLCAmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAorCQkJCQkJICBwQWQtPlN0YUNmZy5SU05JRV9MZW4sCisJCQkJCQkgIHBBZC0+U3RhQ2ZnLlJTTl9JRSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOwogCQkJCUZyYW1lTGVuICs9IHRtcDsKIAkJCX0KIAotCQkJLy8gSWYgYWRob2Mgc2VjcnVpdHkgaXMgc2V0IGZvciBXUEEtTm9uZSwgYXBwZW5kIHRoZSBjaXBoZXIgc3VpdGUgSUUKLQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQkJewotCQkJCVVMT05HIHRtcDsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAJJnRtcCwKLQkJCQkJCSAgCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUlNOSWUsCi0JCQkJCQkgIAkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAotCQkJCQkJICAJCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4sICAgICAgCXBBZC0+U3RhQ2ZnLlJTTl9JRSwKLQkJCQkJCSAgCQkJRU5EX09GX0FSR1MpOwotCQkJCUZyYW1lTGVuICs9IHRtcDsKLQkJCX0KLQotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKLQkJCXsKLQkJCQlVTE9ORyBUbXBMZW47Ci0JCQkJVUNIQVIJQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpIHsKKwkJCQl1bnNpZ25lZCBsb25nIFRtcExlbjsKKwkJCQl1OCBCUk9BRENPTVs0XSA9IHsgMHgwLCAweDkwLCAweDRjLCAweDMzIH07CiAJCQkJSHRMZW4gPSBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KTsKIAkJCQlBZGRIdExlbiA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pOwogCQkJCU5ld0V4dExlbiA9IDE7Ci0JCQkJLy9OZXcgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IElFIGlzIGluY2x1ZGVkIGluIEJlYWNvbiwgUHJvYmUgUnNwIG9yIGNoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBGcmFtZQotCQkJCWlmIChwQWQtPmJCcm9hZENvbUhUID09IFRSVUUpCi0JCQkJewotCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldwYUllLAotCQkJCQkJCQkgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQlJPQURDT01bMF0sCi0JCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCi0JCQkJCQkJCSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSksICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBZGRIdEluZm9JZSwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFkZEh0TGVuLAotCQkJCQkJCQkgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSwgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5ld0V4dENoYW5JZSwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5ld0V4dExlbiwKLQkJCQkJCQkJIHNpemVvZihORVdfRVhUX0NIQU5fSUUpLCAgICAgICAgICAmcEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJLypOZXcgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IElFIGlzIGluY2x1ZGVkIGluIEJlYWNvbiwgUHJvYmUgUnNwIG9yIGNoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBGcmFtZSAqLworCQkJCWlmIChwQWQtPmJCcm9hZENvbUhUID09IFRSVUUpIHsKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAorCQkJCQkJCSAgJlRtcExlbiwgMSwgJldwYUllLCA0LAorCQkJCQkJCSAgJkJST0FEQ09NWzBdLAorCQkJCQkJCSAgcEFkLT5NbG1lQXV4LgorCQkJCQkJCSAgSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCSAgJnBBZC0+TWxtZUF1eC4KKwkJCQkJCQkgIEh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQl9IGVsc2UgeworCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCisJCQkJCQkJICAmVG1wTGVuLCAxLCAmSHRDYXBJZSwKKwkJCQkJCQkgIDEsICZIdExlbiwKKwkJCQkJCQkgIHNpemVvZgorCQkJCQkJCSAgKHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llKSwKKwkJCQkJCQkgICZwQWQtPkNvbW1vbkNmZy4KKwkJCQkJCQkgIEh0Q2FwYWJpbGl0eSwgMSwKKwkJCQkJCQkgICZBZGRIdEluZm9JZSwgMSwKKwkJCQkJCQkgICZBZGRIdExlbiwKKwkJCQkJCQkgIHNpemVvZgorCQkJCQkJCSAgKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSksCisJCQkJCQkJICAmcEFkLT5Db21tb25DZmcuCisJCQkJCQkJICBBZGRIVEluZm8sIDEsCisJCQkJCQkJICAmTmV3RXh0Q2hhbkllLCAxLAorCQkJCQkJCSAgJk5ld0V4dExlbiwKKwkJCQkJCQkgIHNpemVvZgorCQkJCQkJCSAgKHN0cnVjdCBydF9uZXdfZXh0X2NoYW5faWUpLAorCQkJCQkJCSAgJnBBZC0+Q29tbW9uQ2ZnLgorCQkJCQkJCSAgTmV3RXh0Q2hhbk9mZnNldCwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKIAkJCQl9CiAJCQkJRnJhbWVMZW4gKz0gVG1wTGVuOwogCQkJfQpAQCAtMTczMiwxMSArMTgzMyw5IEBACiAJfQogfQogCi1WT0lEIEJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgU3RhdHVzOworCXUxNiBTdGF0dXM7CiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb25cbiIpKTsKIAlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwogCVN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7CkBAIC0xNzQ5LDIwICsxODQ4LDE4IEBACiAJCVNjYW4gdGltZW91dCBwcm9jZWR1cmUuIGJhc2ljYWxseSBhZGQgY2hhbm5lbCBpbmRleCBieSAxIGFuZCByZXNjYW4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIFNjYW5UaW1lb3V0QWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgU2NhblRpbWVvdXRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewogCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gTmV4dENoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CiAKLQkvLyBPbmx5IG9uZSBjaGFubmVsIHNjYW5uZWQgZm9yIENJU0NPIGJlYWNvbiByZXF1ZXN0CisJLyogT25seSBvbmUgY2hhbm5lbCBzY2FubmVkIGZvciBDSVNDTyBiZWFjb24gcmVxdWVzdCAqLwogCWlmICgocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQUNUSVZFKSB8fAotCQkocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fUEFTU0lWRSkgfHwKLQkJKHBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX05PSVNFKSB8fAotCQkocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKSkKKwkgICAgKHBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX1BBU1NJVkUpIHx8CisJICAgIChwQWQtPk1sbWVBdXguU2NhblR5cGUgPT0gU0NBTl9DSVNDT19OT0lTRSkgfHwKKwkgICAgKHBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCkpCiAJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gMDsKIAotCS8vIHRoaXMgcm91dGluZSB3aWxsIHN0b3AgaWYgcEFkLT5NbG1lQXV4LkNoYW5uZWwgPT0gMAorCS8qIHRoaXMgcm91dGluZSB3aWxsIHN0b3AgaWYgcEFkLT5NbG1lQXV4LkNoYW5uZWwgPT0gMCAqLwogCVNjYW5OZXh0Q2hhbm5lbChwQWQpOwogfQogCkBAIC0xNzcxLDEyICsxODY4LDEyIEBACiAJRGVzY3JpcHRpb246CiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBJbnZhbGlkU3RhdGVXaGVuU2NhbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIEludmFsaWRTdGF0ZVdoZW5TY2FuKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFZTkMgLSBJbnZhbGlkU3RhdGVXaGVuU2NhbihzdGF0ZT0lbGQpLiBSZXNldCBTWU5DIG1hY2hpbmVcbiIsIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwl1MTYgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJBWU5DIC0gSW52YWxpZFN0YXRlV2hlblNjYW4oc3RhdGU9JWxkKS4gUmVzZXQgU1lOQyBtYWNoaW5lXG4iLAorCQkgIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKIAlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwogCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CiAJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7CkBAIC0xNzg3LDEyICsxODg0LDEyIEBACiAJRGVzY3JpcHRpb246CiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBJbnZhbGlkU3RhdGVXaGVuSm9pbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIEludmFsaWRTdGF0ZVdoZW5Kb2luKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWRTdGF0ZVdoZW5Kb2luKHN0YXRlPSVsZCkuIFJlc2V0IFNZTkMgbWFjaGluZVxuIiwgcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSkpOworCXUxNiBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkludmFsaWRTdGF0ZVdoZW5Kb2luKHN0YXRlPSVsZCkuIFJlc2V0IFNZTkMgbWFjaGluZVxuIiwKKwkJICBwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlKSk7CiAJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKIAlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOwogCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9KT0lOX0NPTkYsIDIsICZTdGF0dXMpOwpAQCAtMTgwMywxMiArMTkwMCwxMiBAQAogCURlc2NyaXB0aW9uOgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgSW52YWxpZFN0YXRlV2hlblN0YXJ0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgSW52YWxpZFN0YXRlV2hlblN0YXJ0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWRTdGF0ZVdoZW5TdGFydChzdGF0ZT0lbGQpLiBSZXNldCBTWU5DIG1hY2hpbmVcbiIsIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwl1MTYgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJJbnZhbGlkU3RhdGVXaGVuU3RhcnQoc3RhdGU9JWxkKS4gUmVzZXQgU1lOQyBtYWNoaW5lXG4iLAorCQkgIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKIAlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwogCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CiAJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NUQVJUX0NPTkYsIDIsICZTdGF0dXMpOwpAQCAtMTgyMiw1NCArMTkxOSw1MSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBFbnF1ZXVlUHNQb2xsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBFbnF1ZXVlUHNQb2xsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlpZiAocEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUCkKLSAgICAJcEFkLT5Qc1BvbGxGcmFtZS5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7Ci0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCAoUFVDSEFSKSZwQWQtPlBzUG9sbEZyYW1lLCBzaXplb2YoUFNQT0xMX0ZSQU1FKSk7Ci19CiAKKwlpZiAocEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUCkKKwkJcEFkLT5Qc1BvbGxGcmFtZS5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCAodTggKikmIHBBZC0+UHNQb2xsRnJhbWUsCisJCQkgIHNpemVvZihzdHJ1Y3QgcnRfcHNwb2xsX2ZyYW1lKSk7Cit9CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAlEZXNjcmlwdGlvbjoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEVucXVldWVQcm9iZVJlcXVlc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIEVucXVldWVQcm9iZVJlcXVlc3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCU5ESVNfU1RBVFVTICAgICBOU3RhdGU7Ci0JUFVDSEFSICAgICAgICAgIHBPdXRCdWZmZXI7Ci0JVUxPTkcgICAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlIRUFERVJfODAyXzExICAgSGRyODAyMTE7CisJaW50IE5TdGF0ZTsKKwl1OCAqcE91dEJ1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuID0gMDsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBIZHI4MDIxMTsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZvcmNlIG91dCBhIFByb2JlUmVxdWVzdCAuLi5cbiIpKTsKIAotCU5TdGF0ZSA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZiAoTlN0YXRlID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgQlJPQURDQVNUX0FERFIsIEJST0FEQ0FTVF9BRERSKTsKKwlOU3RhdGUgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KKwlpZiAoTlN0YXRlID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZIZHI4MDIxMSwgU1VCVFlQRV9QUk9CRV9SRVEsIDAsCisJCQkJIEJST0FEQ0FTVF9BRERSLCBCUk9BRENBU1RfQUREUik7CiAKLQkJLy8gdGhpcyBQcm9iZVJlcXVlc3QgZXhwbGljaXRseSBzcGVjaWZ5IFNTSUQgdG8gcmVkdWNlIHVud2FudGVkIFByb2JlUmVzcG9uc2UKLQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0JCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgICAgICAgJkhkcjgwMjExLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCi0JCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwKLQkJCQkJCSAgcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwgICAgICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLAotCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCS8qIHRoaXMgUHJvYmVSZXF1ZXN0IGV4cGxpY2l0bHkgc3BlY2lmeSBTU0lEIHRvIHJlZHVjZSB1bndhbnRlZCBQcm9iZVJlc3BvbnNlICovCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwKKwkJCQkgIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSksICZIZHI4MDIxMSwKKwkJCQkgIDEsICZTc2lkSWUsCisJCQkJICAxLCAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisJCQkJICAxLCAmU3VwUmF0ZUllLAorCQkJCSAgMSwgJnBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sCisJCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLAorCQkJCSAgcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwgRU5EX09GX0FSR1MpOwogCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKIAl9CiAKIH0KIAotQk9PTEVBTiBTY2FuUnVubmluZygKLQkJSU4gUFJUTVBfQURBUFRFUiBwQWQpCitCT09MRUFOIFNjYW5SdW5uaW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKIAlyZXR1cm4gKHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPT0gU0NBTl9MSVNURU4pID8gVFJVRSA6IEZBTFNFOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS93cGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3dwYS5jCmluZGV4IDhjMzRlMzkuLjY5YjhhMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3dwYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3dwYS5jCkBAIC0zNywxODEzICszNyw3IEBACiAqLwogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogCi0jZGVmaW5lCQlXUEFSU05JRQkweGRkCi0jZGVmaW5lCQlXUEEyUlNOSUUJMHgzMAotCi0vL2V4dGVybiBVQ0hBUiBCSVQ4W107Ci1VQ0hBUglDaXBoZXJXcGFQc2tUa2lwW10gPSB7Ci0JCTB4REQsIDB4MTYsCQkJCS8vIFJTTiBJRQotCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKLQkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgotCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyBNdWx0aWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gdW5pY2FzdAotCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCi0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIJLy8gYXV0aGVudGljYXRpb24KLQkJfTsKLVVDSEFSCUNpcGhlcldwYVBza1RraXBMZW4gPSAoc2l6ZW9mKENpcGhlcldwYVBza1RraXApIC8gc2l6ZW9mKFVDSEFSKSk7Ci0KLVVDSEFSCUNpcGhlcldwYVBza0Flc1tdID0gewotCQkweERELCAweDE2LCAJCQkvLyBSU04gSUUKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCi0JCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLy8gTXVsdGljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0Ci0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQsCS8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDUwLCAweGYyLCAweDAyCS8vIGF1dGhlbnRpY2F0aW9uCi0JCX07Ci1VQ0hBUglDaXBoZXJXcGFQc2tBZXNMZW4gPSAoc2l6ZW9mKENpcGhlcldwYVBza0FlcykgLyBzaXplb2YoVUNIQVIpKTsKLQotVUNIQVIJQ2lwaGVyU3VpdGVDaXNjb0NDS01bXSA9IHsKLQkJMHhERCwgMHgxNiwJCQkJLy8gUlNOIElFCi0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsIC8vIG91aQotCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCi0JCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDEsIC8vIE11bHRpY2FzdAotCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdWljYXN0Ci0JCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDEsIC8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDQwLCAweDk2LCAweDAwICAvLyBBdXRoZW50aWNhdGlvbgotCQl9OwotVUNIQVIJQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlQ2lzY29DQ0tNKSAvIHNpemVvZihVQ0hBUikpOwotCi1VQ0hBUglDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0W10gPSB7Ci0JCTB4REQsIDB4MTgsCQkJCS8vIFJTTiBJRQotCQkweDAwLCAweDUwLCAweGYyLCAweDAxLCAvLyBvdWkKLQkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgotCQkweDAwLCAweDQwLCAweDk2LCAweDAxLCAvLyBNdWx0aWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVpY2FzdAotCQkweDAwLCAweDQwLCAweDk2LCAweDAxLCAvLyB1bmljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKLQkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwKLQkJMHgyOCwgMHgwMC8vIEF1dGhlbnRpY2F0aW9uCi0JCX07Ci0KLVVDSEFSCUNpcGhlclN1aXRlQ2lzY29DQ0tNMjRMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlQ2lzY29DQ0tNMjQpIC8gc2l6ZW9mKFVDSEFSKSk7Ci0KLVVDSEFSCUNpcGhlclN1aXRlQ0NYVGtpcFtdID0gewotCQkweERELCAweDE2LAkJCQkvLyBSU04gSUUKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCi0JCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0Ci0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDUwLCAweGYyLCAweDAxCS8vIGF1dGhlbnRpY2F0aW9uCi0JCX07Ci1VQ0hBUglDaXBoZXJTdWl0ZUNDWFRraXBMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlQ0NYVGtpcCkgLyBzaXplb2YoVUNIQVIpKTsKLQotVUNIQVIJQ0NYX0xMQ19IRFJbXSA9IHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAyfTsKLVVDSEFSCUxMQ19OT1JNQUxbXSA9IHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKLQotVUNIQVIJRUFQT0xfRlJBTUVbXSA9IHsweDg4LCAweDhFfTsKLQotQk9PTEVBTiBDaGVja1JTTklFKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCi0JSU4gIFVDSEFSICAgICAgICAgICBEYXRhTGVuLAotCU9VVAlVQ0hBUgkJCSpPZmZzZXQpOwotCi12b2lkIGluY19ieXRlX2FycmF5KFVDSEFSICpjb3VudGVyLCBpbnQgbGVuKTsKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNsYXNzaWZ5IFdQQSBFQVAgbWVzc2FnZSB0eXBlCi0KLQlBcmd1bWVudHM6Ci0JCUVBUFR5cGUJCVZhbHVlIG9mIEVBUCBtZXNzYWdlIHR5cGUKLQkJTXNnVHlwZQkJSW50ZXJuYWwgTWVzc2FnZSBkZWZpbml0aW9uIGZvciBNTE1FIHN0YXRlIG1hY2hpbmUKLQotCVJldHVybiBWYWx1ZToKLQkJVFJVRQkJRm91bmQgYXBwcm9wcmlhdGUgbWVzc2FnZSB0eXBlCi0JCUZBTFNFCQlObyBhcHByb3ByaWF0ZSBtZXNzYWdlIHR5cGUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQkJQWxsIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiB3cGEuaAotCQlGb3Igc3VwcGxpY2FudCwgdGhlcmUgaXMgb25seSBFQVBPTCBLZXkgbWVzc2FnZSBhdmFsaWFibGUKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4JV3BhTXNnVHlwZVN1YnN0KAotCUlOCVVDSEFSCUVBUFR5cGUsCi0JT1VUCUlOVAkJKk1zZ1R5cGUpCi17Ci0Jc3dpdGNoIChFQVBUeXBlKQotCXsKLQkJY2FzZSBFQVBQYWNrZXQ6Ci0JCQkqTXNnVHlwZSA9IE1UMl9FQVBQYWNrZXQ7Ci0JCQlicmVhazsKLQkJY2FzZSBFQVBPTFN0YXJ0OgotCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xTdGFydDsKLQkJCWJyZWFrOwotCQljYXNlIEVBUE9MTG9nb2ZmOgotCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xMb2dvZmY7Ci0JCQlicmVhazsKLQkJY2FzZSBFQVBPTEtleToKLQkJCSpNc2dUeXBlID0gTVQyX0VBUE9MS2V5OwotCQkJYnJlYWs7Ci0JCWNhc2UgRUFQT0xBU0ZBbGVydDoKLQkJCSpNc2dUeXBlID0gTVQyX0VBUE9MQVNGQWxlcnQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBGQUxTRTsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJYXNzb2NpYXRpb24Jc3RhdGUgbWFjaGluZSBpbml0LAlpbmNsdWRpbmcgc3RhdGUJdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAotCVBhcmFtZXRlcnM6Ci0JCVMgLQlwb2ludGVyCXRvIHRoZSBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBXcGFQc2tTdGF0ZU1hY2hpbmVJbml0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVNUQVRFX01BQ0hJTkUgKlMsCi0JT1VUCVNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQotewotCVN0YXRlTWFjaGluZUluaXQoUywJVHJhbnMsIE1BWF9XUEFfUFNLX1NUQVRFLCBNQVhfV1BBX1BTS19NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgV1BBX1BTS19JRExFLCBXUEFfTUFDSElORV9CQVNFKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgV1BBX1BTS19JRExFLCBNVDJfRUFQT0xLZXksIChTVEFURV9NQUNISU5FX0ZVTkMpV3BhRUFQT0xLZXlBY3Rpb24pOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgaXMJc3RhdGUgbWFjaGluZSBmdW5jdGlvbi4KLQkJV2hlbiByZWNlaXZpbmcgRUFQT0wgcGFja2V0cyB3aGljaCBpcyAgZm9yIDgwMi4xeCBrZXkgbWFuYWdlbWVudC4KLQkJVXNlCWJvdGggaW4JV1BBLCBhbmQgV1BBUFNLCWNhc2UuCi0JCUluIHRoaXMJZnVuY3Rpb24sIGZ1cnRoZXIgZGlzcGF0Y2ggdG8gZGlmZmVyZW50CWZ1bmN0aW9ucyBhY2NvcmRpbmcJdG8gdGhlIHJlY2VpdmVkCXBhY2tldC4JIDMgY2F0ZWdvcmllcyBhcmUgOgotCQkgIDEuICBub3JtYWwgNC13YXkgcGFpcndpc2VrZXkgYW5kIDItd2F5IGdyb3Vwa2V5IGhhbmRzaGFrZQotCQkgIDIuICBNSUMgZXJyb3IJKENvdW50ZXJtZWFzdXJlcyBhdHRhY2spICByZXBvcnQgcGFja2V0CWZyb20gU1RBLgotCQkgIDMuICBSZXF1ZXN0IGZvciBwYWlyd2lzZS9ncm91cCBrZXkgdXBkYXRlCWZyb20gU1RBCi0JUmV0dXJuOgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBXcGFFQVBPTEtleUFjdGlvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCi0KLXsKLQlJTlQgICAgICAgICAgICAgTXNnVHlwZSA9IEVBUE9MX01TR19JTlZBTElEOwotCVBLRVlfREVTQ1JJUFRFUiBwS2V5RGVzYzsKLQlQSEVBREVSXzgwMl8xMSAgcEhlYWRlcjsgLy9yZWQKLQlVQ0hBUiAgICAgICAgICAgWmVyb1JlcGxheVtMRU5fS0VZX0RFU0NfUkVQTEFZXTsKLQlVQ0hBUiBFYXBvbFZyOwotCUtFWV9JTkZPCQlwZWVyS2V5SW5mbzsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLS0tPiBXcGFFQVBPTEtleUFjdGlvblxuIikpOwotCi0JLy8gR2V0IDgwMi4xMSBoZWFkZXIgZmlyc3QKLQlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7Ci0KLQkvLyBHZXQgRUFQb0wtS2V5IERlc2NyaXB0b3IKLQlwS2V5RGVzYyA9IChQS0VZX0RFU0NSSVBURVIpICZFbGVtLT5Nc2dbKExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCArIExFTkdUSF9FQVBPTF9IKV07Ci0KLQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgc2l6ZW9mKHBlZXJLZXlJbmZvKSk7Ci0JTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIChQVUNIQVIpJnBLZXlEZXNjLT5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKLQotCSooKFVTSE9SVCAqKSZwZWVyS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmcGVlcktleUluZm8pKTsKLQotCi0JLy8gMS4gQ2hlY2sgRUFQT0wgZnJhbWUgdmVyc2lvbiBhbmQgdHlwZQotCUVhcG9sVnIJPSAoVUNIQVIpIEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExK0xFTkdUSF84MDJfMV9IXTsKLQotICAgIGlmICgoKEVhcG9sVnIgIT0gRUFQT0xfVkVSKSAmJiAoRWFwb2xWciAhPSBFQVBPTF9WRVIyKSkgfHwgKChwS2V5RGVzYy0+VHlwZSAhPSBXUEExX0tFWV9ERVNDKSAmJiAocEtleURlc2MtPlR5cGUgIT0gV1BBMl9LRVlfREVTQykpKQotCXsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiS2V5IGRlc2NyaXB0ZXIgZG9lcyBub3QgbWF0Y2ggd2l0aCBXUEEgcnVsZVxuIikpOwotCQkJcmV0dXJuOwotCX0KLQotCS8vIEZpcnN0IHZhbGlkYXRlIHJlcGxheSBjb3VudGVyLCBvbmx5IGFjY2VwdCBtZXNzYWdlIHdpdGggbGFyZ2VyIHJlcGxheSBjb3VudGVyCi0JLy8gTGV0IGVxdWFsIHBhc3MsIHNvbWUgQVAgc3RhcnQgd2l0aCBhbGwgemVybyByZXBsYXkgY291bnRlcgotCU5kaXNaZXJvTWVtb3J5KFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCi0JaWYoKFJUTVBDb21wYXJlTWVtb3J5KHBLZXlEZXNjLT5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKSAmJgotCQkoUlRNUENvbXBhcmVNZW1vcnkocEtleURlc2MtPlJlcGxheUNvdW50ZXIsIFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDApKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiICAgUmVwbGF5Q291bnRlciBub3QgbWF0Y2ggICBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vIFByb2Nlc3MgV1BBMlBTSyBmcmFtZQotCWlmKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0JewotCQlpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkgJiYKLQkJCShwZWVyS2V5SW5mby5FS0RfREwgPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKLQkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgotCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCi0JCXsKLQkJCU1zZ1R5cGUgPSBFQVBPTF9QQUlSX01TR18xOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgUGFpcndpc2UgTWVzc2FnZSAxXG4iKSk7Ci0JCX0gZWxzZSBpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkgJiYKLQkJCShwZWVyS2V5SW5mby5FS0RfREwgID09IDEpICYmCi0JCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCi0JCQkocGVlcktleUluZm8uS2V5TWljID09IDEpICYmCi0JCQkocGVlcktleUluZm8uU2VjdXJlID09IDEpICYmCi0JCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQotCQl7Ci0JCQlNc2dUeXBlID0gRUFQT0xfUEFJUl9NU0dfMzsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IFBhaXJ3aXNlIE1lc3NhZ2UgM1xuIikpOwotCQl9IGVsc2UgaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gR1JPVVBLRVkpICYmCi0JCQkocGVlcktleUluZm8uRUtEX0RMID09IDEpICYmCi0JCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCi0JCQkocGVlcktleUluZm8uS2V5TWljID09IDEpICYmCi0JCQkocGVlcktleUluZm8uU2VjdXJlID09IDEpICYmCi0JCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQotCQl7Ci0JCQlNc2dUeXBlID0gRUFQT0xfR1JPVVBfTVNHXzE7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBHcm91cCBNZXNzYWdlIDFcbiIpKTsKLQkJfQotCi0JCS8vIFdlIHdpbGwgYXNzdW1lIGxpbmsgaXMgdXAgKGFzc29jIHN1Y2Vlc3MgYW5kIHBvcnQgbm90IHNlY3VyZWQpLgotCQkvLyBBbGwgc3RhdGUgaGFzIHRvIGJlIGFibGUgdG8gcHJvY2VzcyBtZXNzYWdlIGZyb20gcHJldmlvdXMgc3RhdGUKLQkJc3dpdGNoKHBBZC0+U3RhQ2ZnLldwYVN0YXRlKQotCQl7Ci0JCWNhc2UgU1NfU1RBUlQ6Ci0JCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCi0JCQl7Ci0JCQkJV3BhMlBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTU19XQUlUX01TR18zOgotCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQotCQkJewotCQkJCVdwYTJQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOwotCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKLQkJCX0KLQkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQotCQkJewotCQkJCVdwYTJQYWlyTXNnM0FjdGlvbihwQWQsIEVsZW0pOwotCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9HUk9VUDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgU1NfV0FJVF9HUk9VUDoJCS8vIFdoZW4gZG9pbmcgZ3JvdXAga2V5IGV4Y2hhbmdlCi0JCWNhc2UgU1NfRklOSVNIOgkJCS8vIFRoaXMgaGFwcGVuZWQgd2hlbiB1cGRhdGUgZ3JvdXAga2V5Ci0JCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCi0JCQl7Ci0JCQkgICAgLy8gUmVzZXQgcG9ydCBzZWN1cmVkIHZhcmlhYmxlCi0JCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0JCQkJV3BhMlBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOwotCQkJfQotCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCi0JCQl7Ci0JCQkgICAgLy8gUmVzZXQgcG9ydCBzZWN1cmVkIHZhcmlhYmxlCi0JCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0JCQkJV3BhMlBhaXJNc2czQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX0dST1VQOwotCQkJfQotCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKQotCQkJewotCQkJCVdwYUdyb3VwTXNnMUFjdGlvbihwQWQsIEVsZW0pOwotCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfRklOSVNIOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCS8vIFByb2Nlc3MgV1BBUFNLIEZyYW1lCi0JLy8gQ2xhc3NpZnkgbWVzc2FnZSBUeXBlLCBlaXRoZXIgcGFpcndpc2UgbWVzc2FnZSAxLCAzLCBvciBncm91cCBtZXNzYWdlIDEgZm9yIHN1cHBsaWNhbnQKLQllbHNlIGlmKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKLQl7Ci0JCWlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IFBBSVJXSVNFS0VZKSAmJgotCQkJKHBlZXJLZXlJbmZvLktleUluZGV4ID09IDApICYmCi0JCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCi0JCQkocGVlcktleUluZm8uS2V5TWljID09IDApICYmCi0JCQkocGVlcktleUluZm8uU2VjdXJlID09IDApICYmCi0JCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQotCQl7Ci0JCQlNc2dUeXBlID0gRUFQT0xfUEFJUl9NU0dfMTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IFBhaXJ3aXNlIE1lc3NhZ2UgMVxuIikpOwotCQl9Ci0JCWVsc2UgaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gUEFJUldJU0VLRVkpICYmCi0JCQkocGVlcktleUluZm8uS2V5SW5kZXggPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKLQkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkgJiYKLQkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgotCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCi0JCXsKLQkJCU1zZ1R5cGUgPSBFQVBPTF9QQUlSX01TR18zOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgUGFpcndpc2UgTWVzc2FnZSAzXG4iKSk7Ci0JCX0KLQkJZWxzZSBpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBHUk9VUEtFWSkgJiYKLQkJCShwZWVyS2V5SW5mby5LZXlJbmRleCAhPSAwKSAmJgotCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgotCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAxKSAmJgotCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAxKSAmJgotCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCi0JCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKLQkJewotCQkJTXNnVHlwZSA9IEVBUE9MX0dST1VQX01TR18xOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgR3JvdXAgTWVzc2FnZSAxXG4iKSk7Ci0JCX0KLQotCQkvLyBXZSB3aWxsIGFzc3VtZSBsaW5rIGlzIHVwIChhc3NvYyBzdWNlZXNzIGFuZCBwb3J0IG5vdCBzZWN1cmVkKS4KLQkJLy8gQWxsIHN0YXRlIGhhcyB0byBiZSBhYmxlIHRvIHByb2Nlc3MgbWVzc2FnZSBmcm9tIHByZXZpb3VzIHN0YXRlCi0JCXN3aXRjaChwQWQtPlN0YUNmZy5XcGFTdGF0ZSkKLQkJewotCQljYXNlIFNTX1NUQVJUOgotCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQotCQkJewotCQkJCVdwYVBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTU19XQUlUX01TR18zOgotCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQotCQkJewotCQkJCVdwYVBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOwotCQkJfQotCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCi0JCQl7Ci0JCQkJV3BhUGFpck1zZzNBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfR1JPVVA7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFNTX1dBSVRfR1JPVVA6CQkvLyBXaGVuIGRvaW5nIGdyb3VwIGtleSBleGNoYW5nZQotCQljYXNlIFNTX0ZJTklTSDoJCQkvLyBUaGlzIGhhcHBlbmVkIHdoZW4gdXBkYXRlIGdyb3VwIGtleQotCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQotCQkJewotCQkJCVdwYVBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOwotCQkJCS8vIFJlc2V0IHBvcnQgc2VjdXJlZCB2YXJpYWJsZQotCQkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOwotCQkJfQotCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCi0JCQl7Ci0JCQkJV3BhUGFpck1zZzNBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfR1JPVVA7Ci0JCQkJLy8gUmVzZXQgcG9ydCBzZWN1cmVkIHZhcmlhYmxlCi0JCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0JCQl9Ci0JCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCi0JCQl7Ci0JCQkJV3BhR3JvdXBNc2cxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19GSU5JU0g7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tLS0gV3BhRUFQT0xLZXlBY3Rpb25cbiIpKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVByb2Nlc3MgUGFpcndpc2Uga2V5IDQtd2F5IGhhbmRzaGFraW5nCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0JCUVsZW0JCU1lc3NhZ2UgYm9keQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlXcGFQYWlyTXNnMUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKLQlVQ0hBUgkJCQkqbXBvb2wsICpQVEssICpkaWdlc3Q7Ci0JUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKLQlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlQRUFQT0xfUEFDS0VUICAgICAgIHBNc2cxOwotCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OwotCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYVBhaXJNc2cxQWN0aW9uIC0tLS0tPlxuIikpOwotCi0JLy8gYWxsb2NhdGUgbWVtb3J5IHBvb2wKLQlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1wb29sLCAyNTYpOwotCi0JaWYgKG1wb29sID09IE5VTEwpCi0JCXJldHVybjsKLQotCS8vIFBUSyBMZW4gPSA4MC4KLQlQVEsgPSAoVUNIQVIgKikgUk9VTkRfVVAobXBvb2wsIDQpOwotCS8vIGRpZ2VzdCBMZW4gPSA4MC4KLQlkaWdlc3QgPSAoVUNIQVIgKikgUk9VTkRfVVAoUFRLICsgODAsIDQpOwotCi0JcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgRWxlbS0+TXNnOwotCi0JLy8gUHJvY2VzcyBtZXNzYWdlIDEgZnJvbSBhdXRoZW50aWNhdG9yCi0JcE1zZzEgPSAoUEVBUE9MX1BBQ0tFVCkgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOwotCi0JLy8gMS4gU2F2ZSBSZXBsYXkgY291bnRlciwgaXQgd2lsbCB1c2UgdG8gdmVyaWZ5IG1lc3NhZ2UgMyBhbmQgY29uc3RydWN0IG1lc3NhZ2UgMgotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBNc2cxLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCi0JLy8gMi4gU2F2ZSBBTm9uY2UKLQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5BTm9uY2UsIHBNc2cxLT5LZXlEZXNjLktleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOwotCi0JLy8gR2VuZXJhdGUgcmFuZG9tIFNOb25jZQotCUdlblJhbmRvbShwQWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+U3RhQ2ZnLlNOb25jZSk7Ci0KLQkvLyBDYWxjIFBUSyhBTm9uY2UsIFNOb25jZSkKLQlXcGFDb3VudFBUSyhwQWQsCi0JCXBBZC0+U3RhQ2ZnLlBNSywKLQkJcEFkLT5TdGFDZmcuQU5vbmNlLAotCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKLQkJcEFkLT5TdGFDZmcuU05vbmNlLAotCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAotCQlQVEssCi0JCUxFTl9QVEspOwotCi0JLy8gU2F2ZSBrZXkgdG8gUFRLIGVudHJ5Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUFRLLCBQVEssIExFTl9QVEspOwotCi0JLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0Ci0JTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7Ci0KLQkvLyBaZXJvIE1lc3NhZ2UgMiBib2R5Ci0JTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOwotCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7Ci0JUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKLQkvLwotCS8vIE1lc3NhZ2UgMiBhcyAgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsU05vbmNlLE1JQyxSU04gSUUpCi0JLy8KLQlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKLQkvLyAxLiBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZSBSU04gSUUKLQlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JewotCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAyOwotCX0KLQllbHNlCSAgLy8gVEtJUAotCXsKLQkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMTsKLQl9Ci0KLQkvLyBmaWxsIGluIERhdGEgTWF0ZXJpYWwgYW5kIGl0cyBsZW5ndGgKLQlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzBdID0gSUVfV1BBOwotCVBhY2tldC5LZXlEZXNjLktleURhdGFbMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47Ci0JUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDI7Ci0JTmRpc01vdmVNZW1vcnkoJlBhY2tldC5LZXlEZXNjLktleURhdGFbMl0sIHBBZC0+U3RhQ2ZnLlJTTl9JRSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKLQotCS8vIFVwZGF0ZSBwYWNrZXQgbGVuZ3RoIGFmdGVyIGRlY2lkZSBLZXkgZGF0YSBwYXlsb2FkCi0JUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFICsgUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXTsKLQotCS8vIFVwZGF0ZSBLZXkgbGVuZ3RoCi0JUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gcE1zZzEtPktleURlc2MuS2V5TGVuZ3RoWzBdOwotCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBNc2cxLT5LZXlEZXNjLktleUxlbmd0aFsxXTsKLQkvLyAyLiBLZXkgVHlwZSBQZWVyS2V5Ci0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7Ci0KLQkvLyAzLiBLZXlNaWMgZmllbGQgcHJlc2VudGVkCi0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKLQotCS8vQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KLQkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOwotCi0KLQkvLyA0LiBGaWxsIFNOb25jZQotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU5vbmNlLCBwQWQtPlN0YUNmZy5TTm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7Ci0KLQkvLyA1LiBLZXkgUmVwbGF5IENvdW50Ci0JTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0KLQkvLyBTZW5kIEVBUE9MKDAsIDEsIDAsIDAsIDAsIFAsIDAsIFNOb25jZSwgTUlDLCBSU05fSUUpCi0JLy8gT3V0IGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UgMgotCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKLQlpZihwT3V0QnVmZmVyID09IE5VTEwpCi0JewotCQlvc19mcmVlX21lbShwQWQsIG1wb29sKTsKLQkJcmV0dXJuOwotCX0KLQkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KLQkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0JCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCi0JCUVORF9PRl9BUkdTKTsKLQotCS8vIDYuIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCi0JTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7Ci0JaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsJLy8gQUVTCi0KLQkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKLQkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOwotCX0KLQllbHNlCi0JewkvLyBUS0lQCi0JCWhtYWNfbWQ1KFBUSywgIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7Ci0JfQotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQotCS8vaGV4X2R1bXAoIk1JQyIsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7Ci0KLQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCi0JCQkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJCSZIZWFkZXI4MDJfMywKLQkJCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCi0JCQkJCQlFTkRfT0ZfQVJHUyk7Ci0KLQotCS8vIDUuIENvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgc2VuZCBNc2cgMiB0byBhdXRoZW50aWNhdG9yCi0JUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIFRSVUUpOwotCi0JTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOwotCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFQYWlyTXNnMUFjdGlvbiA8LS0tLS1cbiIpKTsKLX0KLQotVk9JRCBXcGEyUGFpck1zZzFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7Ci0JVUNIQVIJCQkJKm1wb29sLCAqUFRLLCAqZGlnZXN0OwotCVBVQ0hBUiAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07Ci0JVUxPTkcgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnMTsKLQlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKLQlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl07Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGEyUGFpck1zZzFBY3Rpb24gLS0tLS0+XG4iKSk7Ci0KLQkvLyBhbGxvY2F0ZSBtZW1vcnkgcG9vbAotCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbXBvb2wsIDI1Nik7Ci0KLQlpZiAobXBvb2wgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JLy8gUFRLIExlbiA9IDgwLgotCVBUSyA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7Ci0JLy8gZGlnZXN0IExlbiA9IDgwLgotCWRpZ2VzdCA9IChVQ0hBUiAqKSBST1VORF9VUChQVEsgKyA4MCwgNCk7Ci0KLQlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7Ci0KLQkvLyBQcm9jZXNzIG1lc3NhZ2UgMSBmcm9tIGF1dGhlbnRpY2F0b3IKLQkJcE1zZzEgPSAoUEVBUE9MX1BBQ0tFVCkJJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOwotCi0JLy8gMS4gU2F2ZSBSZXBsYXkgY291bnRlciwgaXQgd2lsbCB1c2UgdG8gdmVyaWZ5IG1lc3NhZ2UgMyBhbmQgY29uc3RydWN0IG1lc3NhZ2UgMgotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBNc2cxLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCi0JLy8gMi4gU2F2ZSBBTm9uY2UKLQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5BTm9uY2UsIHBNc2cxLT5LZXlEZXNjLktleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOwotCi0JLy8gR2VuZXJhdGUgcmFuZG9tIFNOb25jZQotCUdlblJhbmRvbShwQWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+U3RhQ2ZnLlNOb25jZSk7Ci0KLQlpZihwTXNnMS0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdID4gMCApCi0JewotCQkvLyBjYWNoZWQgUE1LSUQKLQl9Ci0KLQkvLyBDYWxjIFBUSyhBTm9uY2UsIFNOb25jZSkKLQlXcGFDb3VudFBUSyhwQWQsCi0JCXBBZC0+U3RhQ2ZnLlBNSywKLQkJcEFkLT5TdGFDZmcuQU5vbmNlLAotCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKLQkJcEFkLT5TdGFDZmcuU05vbmNlLAotCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAotCQlQVEssCi0JCUxFTl9QVEspOwotCi0JLy8gU2F2ZSBrZXkgdG8gUFRLIGVudHJ5Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUFRLLCBQVEssIExFTl9QVEspOwotCi0JLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0Ci0JTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7Ci0KLQkvLyBaZXJvIG1lc3NhZ2UgMiBib2R5Ci0JTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOwotCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7Ci0JUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKLQkvLwotCS8vIE1lc3NhZ2UgMiBhcyAgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsU05vbmNlLE1JQyxSU04gSUUpCi0JLy8KLQlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKLQotCS8vIDEuIEtleSBkZXNjcmlwdG9yIHZlcnNpb24gYW5kIGFwcHJvcHJpYXRlIFJTTiBJRQotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsKLQkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMjsKLQl9Ci0JZWxzZQkgIC8vIFRLSVAKLQl7Ci0JCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDE7Ci0JfQotCi0JLy8gZmlsbCBpbiBEYXRhIE1hdGVyaWFsIGFuZCBpdHMgbGVuZ3RoCi0JUGFja2V0LktleURlc2MuS2V5RGF0YVswXSA9IElFX1dQQTI7Ci0JUGFja2V0LktleURlc2MuS2V5RGF0YVsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKLQlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMjsKLQlOZGlzTW92ZU1lbW9yeSgmUGFja2V0LktleURlc2MuS2V5RGF0YVsyXSwgcEFkLT5TdGFDZmcuUlNOX0lFLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOwotCi0JLy8gVXBkYXRlIHBhY2tldCBsZW5ndGggYWZ0ZXIgZGVjaWRlIEtleSBkYXRhIHBheWxvYWQKLQlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyBQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdOwotCi0JLy8gMi4gS2V5IFR5cGUgUGVlcktleQotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IFBBSVJXSVNFS0VZOwotCi0JLy8gMy4gS2V5TWljIGZpZWxkIHByZXNlbnRlZAotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7Ci0KLQkvLyBVcGRhdGUgS2V5IExlbmd0aAotCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFswXSA9IDA7Ci0JUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzFdID0gcE1zZzEtPktleURlc2MuS2V5TGVuZ3RoWzFdOwotCi0JLy8gNC4gRmlsbCBTTm9uY2UKLQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlOb25jZSwgcEFkLT5TdGFDZmcuU05vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOwotCi0JLy8gNS4gS2V5IFJlcGxheSBDb3VudAotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCi0JLy8gQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KLQkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOwotCi0JLy8gU2VuZCBFQVBPTC1LZXkoMCwxLDAsMCwwLFAsMCxTTm9uY2UsTUlDLFJTTiBJRSkKLQkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZSAyCi0JTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKLQlpZihwT3V0QnVmZmVyID09IE5VTEwpCi0JewotCQlvc19mcmVlX21lbShwQWQsIG1wb29sKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgotCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICZGcmFtZUxlbiwKLQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKLQkJRU5EX09GX0FSR1MpOwotCi0JLy8gNi4gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKLQlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKLQlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQl7Ci0JCS8vIEFFUwotCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIFBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOwotCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7Ci0JfQotCWVsc2UKLQl7Ci0JCWhtYWNfbWQ1KFBUSywgIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7Ci0JfQotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQotCi0JLy8gTWFrZSAgVHJhbnNtaXR0aW5nIGZyYW1lCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCi0JCQkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJJkhlYWRlcjgwMl8zLAotCQkJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKLQkJCQkJCUVORF9PRl9BUkdTKTsKLQotCi0JLy8gNS4gQ29weSBmcmFtZSB0byBUeCByaW5nCi0JUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIFRSVUUpOwotCi0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQlvc19mcmVlX21lbShwQWQsIG1wb29sKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYTJQYWlyTXNnMUFjdGlvbiA8LS0tLS1cbiIpKTsKLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUHJvY2VzcyBQYWlyd2lzZSBrZXkgNC13YXkgaGFuZHNoYWtpbmcKLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKLQkJRWxlbQkJTWVzc2FnZSBib2R5Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVdwYVBhaXJNc2czQWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKLQotewotCVBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKLQlQVUNIQVIgICAgICAgICAgCXBPdXRCdWZmZXIgPSBOVUxMOwotCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOwotCVVMT05HICAgICAgICAgICAJRnJhbWVMZW4gPSAwOwotCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OwotCVBFQVBPTF9QQUNLRVQgICAgICAgcE1zZzM7Ci0JVUNIQVIgICAgICAgICAgIAlNaWNbMTZdLCBPbGRNaWNbMTZdOwotCU1BQ19UQUJMRV9FTlRSWSAJKnBFbnRyeSA9IE5VTEw7Ci0JVUNIQVIJCQkJc2tpcF9vZmZzZXQ7Ci0JS0VZX0lORk8JCQlwZWVyS2V5SW5mbzsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYVBhaXJNc2czQWN0aW9uIC0tLS0tPlxuIikpOwotCi0JLy8gUmVjb3JkIDgwMi4xMSBoZWFkZXIgJiB0aGUgcmVjZWl2ZWQgRUFQT0wgcGFja2V0IE1zZzMKLQlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7Ci0JcE1zZzMgPSAoUEVBUE9MX1BBQ0tFVCkJJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOwotCi0JTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIHNpemVvZihwZWVyS2V5SW5mbykpOwotCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCAoUFVDSEFSKSZwTXNnMy0+S2V5RGVzYy5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKLQotCSooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSk7Ci0KLQotCS8vIDEuIFZlcmlmeSBjaXBoZXIgdHlwZSBtYXRjaAotCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMikpCi0JewotCQlyZXR1cm47Ci0JfQotCWVsc2UgaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMSkpCi0JewotCQlyZXR1cm47Ci0JfQotCi0JLy8gVmVyaWZ5IFJTTiBJRQotCS8vaWYgKCFSVE1QRXF1YWxNZW1vcnkocE1zZzMtPktleURlc2MuS2V5RGF0YSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKSkKLQlpZiAoIUNoZWNrUlNOSUUocEFkLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdLCAmc2tpcF9vZmZzZXQpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlNOX0lFIERpZmZlcmVudCBpbiBNc2cgMyBvZiBXUEExIDQtd2F5IGhhbmRzaGFrZSEhIFxuIikpOwotCQloZXhfZHVtcCgiVGhlIG9yaWdpbmFsIFJTTl9JRSIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbik7Ci0JCWhleF9kdW1wKCJUaGUgcmVjZWl2ZWQgUlNOX0lFIiwgcE1zZzMtPktleURlc2MuS2V5RGF0YSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSk7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSU05fSUUgVkFMSUQgaW4gTXNnIDMgb2YgV1BBMSA0LXdheSBoYW5kc2hha2UhISBcbiIpKTsKLQotCi0JLy8gMi4gQ2hlY2sgTUlDIHZhbHVlCi0JLy8gU2F2ZSB0aGUgTUlDIGFuZCByZXBsYWNlIHdpdGggemVybwotCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcE1zZzMtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQlOZGlzWmVyb01lbW9yeShwTXNnMy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQl7Ci0JCS8vIEFFUwotCQlVQ0hBUiBkaWdlc3RbODBdOwotCi0JCUhNQUNfU0hBMSgoUFVDSEFSKSBwTXNnMywgcE1zZzMtPkJvZHlfTGVuWzFdICsgNCwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7Ci0JCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKLQl9Ci0JZWxzZQkvLyBUS0lQCi0JewotCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUikgcE1zZzMsIHBNc2czLT5Cb2R5X0xlblsxXSArIDQsIE1pYyk7Ci0JfQotCi0JaWYoIU5kaXNFcXVhbE1lbW9yeShPbGRNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQykpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIgTUlDIERpZmZlcmVudCBpbiBtc2cgMyBvZiA0LXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOwotCQlyZXR1cm47Ci0JfQotCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1JQyBWQUxJRCBpbiBtc2cgMyBvZiA0LXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOwotCi0JLy8gMy4gQ2hlY2sgUmVwbGF5IENvdW50ZXIsIGl0IGhhcyB0byBiZSBsYXJnZXIgdGhhbiBsYXN0IG9uZS4gTm8gbmVlZCB0byBiZSBleGFjdCBvbmUgbGFyZ2VyCi0JaWYoUlRNUENvbXBhcmVNZW1vcnkocE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkKLQkJcmV0dXJuOwotCi0JLy8gVXBkYXRlIG5ldyByZXBsYXkgY291bnRlcgotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCi0JLy8gNC4gRG91YmxlIGNoZWNrIEFOb25jZQotCWlmKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5TdGFDZmcuQU5vbmNlLCBwTXNnMy0+S2V5RGVzYy5LZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKSkKLQkJcmV0dXJuOwotCi0JLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0Ci0JTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7Ci0KLQkvLyBaZXJvIE1lc3NhZ2UgNCBib2R5Ci0JTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOwotCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7Ci0JUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKLQlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUU7CQkvLyBObyBkYXRhIGZpZWxkCi0KLQkvLwotCS8vIE1lc3NhZ2UgNCBhcyAgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsMCxNSUMsMCkKLQkvLwotCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOwotCi0JLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiBhbmQgYXBwcm9wcmlhdGUgUlNOIElFCi0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gcGVlcktleUluZm8uS2V5RGVzY1ZlcjsKLQotCS8vIFVwZGF0ZSBLZXkgTGVuZ3RoCi0JUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gcE1zZzMtPktleURlc2MuS2V5TGVuZ3RoWzBdOwotCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBNc2czLT5LZXlEZXNjLktleUxlbmd0aFsxXTsKLQotCS8vIEtleSBUeXBlIFBlZXJLZXkKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBQQUlSV0lTRUtFWTsKLQotCS8vIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOwotCi0JLy8gSW4gTXNnMywgIEtleUluZm8uc2VjdXJlID0wIGlmIEdyb3VwIEtleSBIUyB0byBjb21lLiAxIGlmIG5vIGdyb3VwIGtleSBIUwotCS8vIFN0YXRpb24gc2VuZHMgTXNnNCAgS2V5SW5mby5zZWN1cmUgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoYXQgaW4gTXNnLjMKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZT0gcGVlcktleUluZm8uU2VjdXJlOwotCi0JLy8gQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KLQkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOwotCi0JLy8gS2V5IFJlcGxheSBjb3VudAotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCi0JLy8gT3V0IGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UgNAotCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKLQlpZihwT3V0QnVmZmVyID09IE5VTEwpCi0JCXJldHVybjsKLQotCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgotCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKLQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKLQkJRU5EX09GX0FSR1MpOwotCi0JLy8gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKLQlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKLQlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JewotCQkvLyBBRVMKLQkJVUNIQVIgZGlnZXN0WzgwXTsKLQotCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOwotCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7Ci0JfQotCWVsc2UKLQl7Ci0JCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKLQl9Ci0JTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCi0JLy8gVXBkYXRlIFBUSwotCS8vIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0JcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7Ci0gICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOwotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OCtMRU5fVEtJUF9SWE1JQ0tdLCBMRU5fVEtJUF9UWE1JQ0spOwotCi0JLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKLQlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLQllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0JZWxzZQotCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQotCS8vIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIE1BQ19UQUJMRV9FTlRSWQotCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOwotCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOwotCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLCBMRU5fVEtJUF9SWE1JQ0spOwotCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKLQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKLQotCS8vIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCi0JQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKLQkJCQkJCSAgQlNTMCwKLQkJCQkJCSAgMCwKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7Ci0KLQkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKLQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJICAwLAotCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAotCQkJCQkJCSAgcEVudHJ5KTsKLQotCS8vIE1ha2UgdHJhbnNtaXR0aW5nIGZyYW1lCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCi0JCQkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJJkhlYWRlcjgwMl8zLAotCQkJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKLQkJCQkJCUVORF9PRl9BUkdTKTsKLQotCi0JLy8gQ29weSBmcmFtZSB0byBUeCByaW5nIGFuZCBTZW5kIE1lc3NhZ2UgNCB0byBhdXRoZW50aWNhdG9yCi0JUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIFRSVUUpOwotCi0JTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhUGFpck1zZzNBY3Rpb24gPC0tLS0tXG4iKSk7Ci19Ci0KLVZPSUQgICAgV3BhMlBhaXJNc2czQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi0KLXsKLQlQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7Ci0JUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKLQlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKLQlQRUFQT0xfUEFDS0VUICAgICAgIHBNc2czOwotCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XSwgT2xkTWljWzE2XTsKLQlVQ0hBUiAgICAgICAgICAgICAgICptcG9vbCwgKktFWURBVEEsICpkaWdlc3Q7Ci0JVUNIQVIgICAgICAgICAgICAgICBLZXlbMzJdOwotCU1BQ19UQUJMRV9FTlRSWSAJKnBFbnRyeSA9IE5VTEw7Ci0JS0VZX0lORk8JCQlwZWVyS2V5SW5mbzsKLQotCS8vIGFsbG9jYXRlIG1lbW9yeQotCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbXBvb2wsIDEwMjQpOwotCi0JaWYobXBvb2wgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JLy8gS0VZREFUQSBMZW4gPSA1MTIuCi0JS0VZREFUQSA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7Ci0JLy8gZGlnZXN0IExlbiA9IDgwLgotCWRpZ2VzdCA9IChVQ0hBUiAqKSBST1VORF9VUChLRVlEQVRBICsgNTEyLCA0KTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYTJQYWlyTXNnM0FjdGlvbiAtLS0tLT5cbiIpKTsKLQotCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIEVsZW0tPk1zZzsKLQotCS8vIFByb2Nlc3MgbWVzc2FnZSAzIGZyYW1lLgotCXBNc2czID0gKFBFQVBPTF9QQUNLRVQpCSZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKLQotCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCBzaXplb2YocGVlcktleUluZm8pKTsKLQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgKFBVQ0hBUikmcE1zZzMtPktleURlc2MuS2V5SW5mbywgc2l6ZW9mKEtFWV9JTkZPKSk7Ci0KLQkqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykpOwotCi0JLy8gMS4gVmVyaWZ5IGNpcGhlciB0eXBlIG1hdGNoCi0JaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyIT0gMikpCi0JewotCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOwotCQlyZXR1cm47Ci0JfQotCWVsc2UgaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMSkpCi0JewotCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gMi4gQ2hlY2sgTUlDIHZhbHVlCi0JLy8gU2F2ZSB0aGUgTUlDIGFuZCByZXBsYWNlIHdpdGggemVybwotCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcE1zZzMtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQlOZGlzWmVyb01lbW9yeShwTXNnMy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQl7Ci0JCS8vIEFFUwotCQlITUFDX1NIQTEoKFBVQ0hBUikgcE1zZzMsIHBNc2czLT5Cb2R5X0xlblsxXSArIDQsIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOwotCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7Ci0JfQotCWVsc2UKLQl7Ci0JCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKSBwTXNnMywgcE1zZzMtPkJvZHlfTGVuWzFdICsgNCwgTWljKTsKLQl9Ci0KLQlpZighTmRpc0VxdWFsTWVtb3J5KE9sZE1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiBNSUMgRGlmZmVyZW50IGluIG1zZyAzIG9mIDQtd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7Ci0JCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTUlDIFZBTElEIGluIG1zZyAzIG9mIDQtd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7Ci0KLQkvLyAzLiBDaGVjayBSZXBsYXkgQ291bnRlciwgaXQgaGFzIHRvIGJlIGxhcmdlciB0aGFuIGxhc3Qgb25lLiBObyBuZWVkIHRvIGJlIGV4YWN0IG9uZSBsYXJnZXIKLQlpZihSVE1QQ29tcGFyZU1lbW9yeShwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKQotCXsKLQkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vIFVwZGF0ZSBuZXcgcmVwbGF5IGNvdW50ZXIKLQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLQotCS8vIDQuIERvdWJsZSBjaGVjayBBTm9uY2UKLQlpZighTmRpc0VxdWFsTWVtb3J5KHBBZC0+U3RhQ2ZnLkFOb25jZSwgcE1zZzMtPktleURlc2MuS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSkpCi0JewotCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gT2J0YWluIEdUSwotCS8vIDUuIERlY3J5cHQgR1RLIGZyb20gS2V5IERhdGEKLQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiRUtEID0gJWRcbiIsIHBlZXJLZXlJbmZvLkVLRF9ETCkpOwotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsKLQkJLy8gRGVjcnlwdCBBRVMgR1RLCi0JCUFFU19HVEtfS0VZX1VOV1JBUCgmcEFkLT5TdGFDZmcuUFRLWzE2XSwgS0VZREFUQSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSxwTXNnMy0+S2V5RGVzYy5LZXlEYXRhKTsKLQl9Ci0JZWxzZQkgIC8vIFRLSVAKLQl7Ci0JCUlOVCBpOwotCQkvLyBEZWNyeXB0IFRLSVAgR1RLCi0JCS8vIENvbnN0cnVjdCAzMiBieXRlcyBSQzQgS2V5Ci0JCU5kaXNNb3ZlTWVtb3J5KEtleSwgcE1zZzMtPktleURlc2MuS2V5SXYsIDE2KTsKLQkJTmRpc01vdmVNZW1vcnkoJktleVsxNl0sICZwQWQtPlN0YUNmZy5QVEtbMTZdLCAxNik7Ci0JCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBLZXksIDMyKTsKLQkJLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcwotCQlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKLQkJCUFSQ0ZPVVJfQllURSgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhUKTsKLQkJLy8gRGVjcnlwdCBHVEsuIEJlY2FyZWZ1bCwgdGhlcmUgaXMgbm8gSUNWIHRvIGNoZWNrIHRoZSByZXN1bHQgaXMgY29ycmVjdCBvciBub3QKLQkJQVJDRk9VUl9ERUNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtFWURBVEEsIHBNc2czLT5LZXlEZXNjLktleURhdGEsIHBNc2czLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOwotCX0KLQotCWlmICghUGFyc2VLZXlEYXRhKHBBZCwgS0VZREFUQSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSwgMSkpCi0JewotCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gVXBkYXRlIEdUSyB0byBBU0lDCi0JLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKLQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAotCQkJCQkJICBCU1MwLAotCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYyk7Ci0KLQkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKLQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCi0JCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKLQkJCQkJCQkgIE5VTEwpOwotCi0JLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0Ci0JTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7Ci0KLQkvLyBaZXJvIG1lc3NhZ2UgNCBib2R5Ci0JTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOwotCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7Ci0JUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKLQlQYWNrZXQuQm9keV9MZW5bMV0gIAk9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFOwkJLy8gTm8gZGF0YSBmaWVsZAotCi0JLy8KLQkvLyBNZXNzYWdlIDQgYXMgIEVBUE9MLUtleSgwLDEsMCwwLDAsUCwwLDAsTUlDLDApCi0JLy8KLQlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKLQotCS8vIEtleSBkZXNjcmlwdG9yIHZlcnNpb24gYW5kIGFwcHJvcHJpYXRlIFJTTiBJRQotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IHBlZXJLZXlJbmZvLktleURlc2NWZXI7Ci0KLQkvLyBVcGRhdGUgS2V5IExlbmd0aAotCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFswXSA9IHBNc2czLT5LZXlEZXNjLktleUxlbmd0aFswXTsKLQlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMV0gPSBwTXNnMy0+S2V5RGVzYy5LZXlMZW5ndGhbMV07Ci0KLQkvLyBLZXkgVHlwZSBQZWVyS2V5Ci0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7Ci0KLQkvLyBLZXlNaWMgZmllbGQgcHJlc2VudGVkCi0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZSA9IDE7Ci0KLQkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgotCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7Ci0KLQkvLyBLZXkgUmVwbGF5IGNvdW50Ci0JTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0KLQkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZSA0Ci0JTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQotCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKLQl7Ci0JCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KLQkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0JCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCi0JCUVORF9PRl9BUkdTKTsKLQotCS8vIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCi0JTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7Ci0JaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JewotCQkvLyBBRVMKLQkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKLQkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOwotCX0KLQllbHNlCi0JewotCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7Ci0JfQotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQotCS8vIFVwZGF0ZSBQVEsKLQkvLyBQcmVwYXJlIHBhaXItd2lzZSBrZXkgaW5mb3JtYXRpb24gaW50byBzaGFyZWQga2V5IHRhYmxlCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sIExFTl9US0lQX0VLKTsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sIExFTl9US0lQX1JYTUlDSyk7Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKLQotCS8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCi0JaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7Ci0JZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwotCWVsc2UKLQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0KLQkvLyBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBNQUNfVEFCTEVfRU5UUlkKLQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKLQlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7Ci0JTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLCBMRU5fVEtJUF9SWE1JQ0spOwotCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4K0xFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7Ci0JcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7Ci0KLQkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQotCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCi0JCQkJCQkgIEJTUzAsCi0JCQkJCQkgIDAsCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOwotCi0JLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0JUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCi0JCQkJCQkJICBCU1MwLAotCQkJCQkJCSAgMCwKLQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKLQkJCQkJCQkgIHBFbnRyeSk7Ci0KLQkvLyBNYWtlICBUcmFuc21pdHRpbmcgZnJhbWUKLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgCSZGcmFtZUxlbiwKLQkJCSAgCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkmSGVhZGVyODAyXzMsCi0JCQkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAmUGFja2V0LAotCQkJCQkJRU5EX09GX0FSR1MpOwotCi0KLQkvLyBDb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIFNlbmQgTWVzc2FnZSA0IHRvIGF1dGhlbnRpY2F0b3IKLQlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgVFJVRSk7Ci0KLQkvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAotCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKLQotICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCi0gICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLQotCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKLQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOwotCi0KLQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHNldCBrZXkgZG9uZSBXUEEyCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHLCBwRW50cnktPkFkZHIsIEJTUzAsIDApOwotCi0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3BhMlBhaXJNc2czQWN0aW9uIDwtLS0tLVxuIikpOwotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlQcm9jZXNzIEdyb3VwIGtleSAyLXdheSBoYW5kc2hha2luZwotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgotCQlFbGVtCQlNZXNzYWdlIGJvZHkKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJV3BhR3JvdXBNc2cxQWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKLQotewotCVBVQ0hBUiAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07Ci0JVUxPTkcgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7Ci0JUEVBUE9MX1BBQ0tFVCAgICAgICBwR3JvdXA7Ci0JVUNIQVIgICAgICAgICAgICAgICAqbXBvb2wsICpkaWdlc3QsICpLRVlEQVRBOwotCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XSwgT2xkTWljWzE2XTsKLQlVQ0hBUiAgICAgICAgICAgICAgIEdUS1szMl0sIEtleVszMl07Ci0JS0VZX0lORk8JCQlwZWVyS2V5SW5mbzsKLQotCS8vIGFsbG9jYXRlIG1lbW9yeQotCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbXBvb2wsIDEwMjQpOwotCi0JaWYobXBvb2wgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JLy8gZGlnZXN0IExlbiA9IDgwLgotCWRpZ2VzdCA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7Ci0JLy8gS0VZREFUQSBMZW4gPSA1MTIuCi0JS0VZREFUQSA9IChVQ0hBUiAqKSBST1VORF9VUChkaWdlc3QgKyA4MCwgNCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFHcm91cE1zZzFBY3Rpb24gLS0tLS0+XG4iKSk7Ci0KLQkvLyBQcm9jZXNzIEdyb3VwIE1lc3NhZ2UgMSBmcmFtZS4gc2tpcCA4MDIuMTEgaGVhZGVyKDI0KSAmIExMQ19TTkFQIGhlYWRlcig4KQotCXBHcm91cCA9IChQRUFQT0xfUEFDS0VUKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07Ci0KLQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgc2l6ZW9mKHBlZXJLZXlJbmZvKSk7Ci0JTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIChQVUNIQVIpJnBHcm91cC0+S2V5RGVzYy5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKLQotCSooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSk7Ci0KLQkvLyAwLiBDaGVjayBjaXBoZXIgdHlwZSBtYXRjaAotCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSAyKSkKLQl7Ci0JCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZSBpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMSkpCi0JewotCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gMS4gVmVyaWZ5IFJlcGxheSBjb3VudGVyCi0JLy8gICAgQ2hlY2sgUmVwbGF5IENvdW50ZXIsIGl0IGhhcyB0byBiZSBsYXJnZXIgdGhhbiBsYXN0IG9uZS4gTm8gbmVlZCB0byBiZSBleGFjdCBvbmUgbGFyZ2VyCi0JaWYoUlRNUENvbXBhcmVNZW1vcnkocEdyb3VwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpCi0JewotCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gVXBkYXRlIG5ldyByZXBsYXkgY291bnRlcgotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBHcm91cC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLQotCS8vIDIuIFZlcmlmeSBNSUMgaXMgdmFsaWQKLQkvLyBTYXZlIHRoZSBNSUMgYW5kIHJlcGxhY2Ugd2l0aCB6ZXJvCi0JTmRpc01vdmVNZW1vcnkoT2xkTWljLCBwR3JvdXAtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQlOZGlzWmVyb01lbW9yeShwR3JvdXAtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQl7CS8vIEFFUwotCQlITUFDX1NIQTEoKFBVQ0hBUikgcEdyb3VwLCBwR3JvdXAtPkJvZHlfTGVuWzFdICsgNCwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7Ci0JCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKLQl9Ci0JZWxzZQotCXsJLy8gVEtJUAotCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUikgcEdyb3VwLCBwR3JvdXAtPkJvZHlfTGVuWzFdICsgNCwgTWljKTsKLQl9Ci0KLQlpZighTmRpc0VxdWFsTWVtb3J5KE9sZE1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiBNSUMgRGlmZmVyZW50IGluIGdyb3VwIG1zZyAxIG9mIDItd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7Ci0JCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUiltcG9vbCk7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTUlDIFZBTElEIGluIGdyb3VwIG1zZyAxIG9mIDItd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7Ci0KLQotCS8vIDMuIERlY3J5cHQgR1RLIGZyb20gS2V5IERhdGEKLQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JewotCQkvLyBEZWNyeXB0IEFFUyBHVEsKLQkJQUVTX0dUS19LRVlfVU5XUkFQKCZwQWQtPlN0YUNmZy5QVEtbMTZdLCBLRVlEQVRBLCAgcEdyb3VwLT5LZXlEZXNjLktleURhdGFMZW5bMV0sIHBHcm91cC0+S2V5RGVzYy5LZXlEYXRhKTsKLQl9Ci0JZWxzZQkvLyBUS0lQCi0JewotCQlJTlQgaTsKLQotCQkvLyBEZWNyeXB0IFRLSVAgR1RLCi0JCS8vIENvbnN0cnVjdCAzMiBieXRlcyBSQzQgS2V5Ci0JCU5kaXNNb3ZlTWVtb3J5KEtleSwgcEdyb3VwLT5LZXlEZXNjLktleUl2LCAxNik7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZLZXlbMTZdLCAmcEFkLT5TdGFDZmcuUFRLWzE2XSwgMTYpOwotCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS2V5LCAzMik7Ci0JCS8vZGlzY2FyZCBmaXJzdCAyNTYgYnl0ZXMKLQkJZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JCQlBUkNGT1VSX0JZVEUoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCk7Ci0JCS8vIERlY3J5cHQgR1RLLiBCZWNhcmVmdWwsIHRoZXJlIGlzIG5vIElDViB0byBjaGVjayB0aGUgcmVzdWx0IGlzIGNvcnJlY3Qgb3Igbm90Ci0JCUFSQ0ZPVVJfREVDUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBLRVlEQVRBLCBwR3JvdXAtPktleURlc2MuS2V5RGF0YSwgcEdyb3VwLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOwotCX0KLQotCS8vIFByb2Nlc3MgZGVjcnlwdGVkIGtleSBkYXRhIG1hdGVyaWFsCi0JLy8gUGFyc2Uga2V5RGF0YSB0byBoYW5kbGUgS0RFIGZvcm1hdCBmb3IgV1BBMlBTSwotCWlmIChwZWVyS2V5SW5mby5FS0RfREwpCi0JewotCQlpZiAoIVBhcnNlS2V5RGF0YShwQWQsIEtFWURBVEEsIHBHcm91cC0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdLCAwKSkKLQkJewotCQkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQllbHNlCS8vIFdQQVBTSwotCXsKLQkJLy8gc2V0IGtleSBtYXRlcmlhbCwgVHhNaWMgYW5kIFJ4TWljIGZvciBXUEFQU0sKLQkJTmRpc01vdmVNZW1vcnkoR1RLLCBLRVlEQVRBLCAzMik7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkdUSywgR1RLLCAzMik7Ci0JCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IHBlZXJLZXlJbmZvLktleUluZGV4OwotCi0JCS8vIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUKLQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0sIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0JCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBHVEssIExFTl9US0lQX0VLKTsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgJkdUS1sxNl0sIExFTl9US0lQX1JYTUlDSyk7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsICZHVEtbMjRdLCBMRU5fVEtJUF9UWE1JQ0spOwotCi0JCS8vIFVwZGF0ZSBTaGFyZWQgS2V5IENpcGhlckFsZwotCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotCQlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7Ci0JCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0JCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkKLQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkKQotCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCi0gICAgCS8vaGV4X2R1bXAoIkdyb3VwIEtleSA6IiwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIExFTl9US0lQX0VLKTsKLQl9Ci0KLQkvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQotCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCi0JCQkJCQkgIEJTUzAsCi0JCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljKTsKLQotCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQotCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAotCQkJCQkJCSAgQlNTMCwKLQkJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKLQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAotCQkJCQkJCSAgTlVMTCk7Ci0KLQkvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAotCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKLQotICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCi0gICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLQotCS8vIGluaXQgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAotCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOwotCi0JLy8gWmVybyBHcm91cCBtZXNzYWdlIDEgYm9keQotCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKLQlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOwotCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7Ci0JUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFOwkJLy8gTm8gZGF0YSBmaWVsZAotCi0JLy8KLQkvLyBHcm91cCBNZXNzYWdlIDIgYXMgIEVBUE9MLUtleSgxLDAsMCwwLEcsMCwwLE1JQywwKQotCS8vCi0JaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0JewotCQlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKLQl9Ci0JZWxzZQotCXsKLQkJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7Ci0JfQotCi0JLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiBhbmQgYXBwcm9wcmlhdGUgUlNOIElFCi0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gcGVlcktleUluZm8uS2V5RGVzY1ZlcjsKLQotCS8vIFVwZGF0ZSBLZXkgTGVuZ3RoCi0JUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gcEdyb3VwLT5LZXlEZXNjLktleUxlbmd0aFswXTsKLQlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMV0gPSBwR3JvdXAtPktleURlc2MuS2V5TGVuZ3RoWzFdOwotCi0JLy8gS2V5IEluZGV4IGFzIEctTXNnIDEKLQlpZihwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCi0JCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5SW5kZXggPSBwZWVyS2V5SW5mby5LZXlJbmRleDsKLQotCS8vIEtleSBUeXBlIEdyb3VwIGtleQotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IEdST1VQS0VZOwotCi0JLy8gS2V5TWljIGZpZWxkIHByZXNlbnRlZAotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7Ci0KLQkvLyBTZWN1cmUgYml0Ci0JUGFja2V0LktleURlc2MuS2V5SW5mby5TZWN1cmUgID0gMTsKLQotCS8vIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCi0JKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKLQotCS8vIEtleSBSZXBsYXkgY291bnQKLQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwR3JvdXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0KLQkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgZ3JvdXAgbWVzc2FnZSAyCi0JTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQotCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKLQl7Ci0JCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUiltcG9vbCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KLQkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0JCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCi0JCUVORF9PRl9BUkdTKTsKLQotCS8vIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCi0JTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7Ci0JaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsKLQkJLy8gQUVTCi0JCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7Ci0JCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKLQl9Ci0JZWxzZQotCXsKLQkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOwotCX0KLQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7Ci0KLQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgIAkJJkZyYW1lTGVuLAotCQkJCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkmSGVhZGVyODAyXzMsCi0JCQkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAmUGFja2V0LAotCQkJCQkJRU5EX09GX0FSR1MpOwotCi0KLQkvLyA1LiBDb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIHByZXBhcmUgZm9yIGVuY3J5cHRpb24KLQlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgRkFMU0UpOwotCi0JLy8gNiBGcmVlIGFsbG9jYXRlZCBtZW1vcnkKLQlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpcE91dEJ1ZmZlcik7Ci0Jb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKLQotCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3Igc2V0IGtleSBkb25lIFdQQTIKLQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NFVF9LRVlfRE9ORV9XUEEyX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFHcm91cE1zZzFBY3Rpb24gPC0tLS0tXG4iKSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlJbml0IFdQQSBNQUMgaGVhZGVyCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVdwYU1hY0hlYWRlckluaXQoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE9VVAlQSEVBREVSXzgwMl8xMQlwSGRyODAyMTEsCi0JSU4JCVVDSEFSCQkJd2VwLAotCUlOCQlQVUNIQVIJCSAgICBwQWRkcjEpCi17Ci0JTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCXBIZHI4MDIxMS0+RkMuVHlwZQk9IEJUWVBFX0RBVEE7Ci0JcEhkcjgwMjExLT5GQy5Ub0RzCT0gMTsKLQlpZiAod2VwCT09IDEpCi0JCXBIZHI4MDIxMS0+RkMuV2VwID0gMTsKLQotCSAvLwlBZGRyMTogQlNTSUQsIEFkZHIyOiBTQSwgQWRkcjM6CURBCi0JQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIxLCBwQWRkcjEpOwotCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0JQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JcEhkcjgwMjExLT5TZXF1ZW5jZSA9CXBBZC0+U2VxdWVuY2U7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKLQlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgZW5jcnlwdGlvbiBiZWZvcmUgcmVhbGx5Ci0Jc2VudCBvdXQgdG8gYWlyLgotCi0JQXJndW1lbnRzOgotCQlwQWQJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKLQkJUE5ESVNfUEFDS0VUCVBvaW50ZXIgdG8gb3V0Z29pbmcgTmRpcyBmcmFtZQotCQlOdW1iZXJPZkZyYWcJTnVtYmVyIG9mIGZyYWdtZW50IHJlcXVpcmVkCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEICAgIFJUTVBUb1dpcmVsZXNzU3RhKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcEhlYWRlcjgwMl8zLAotICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAotCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCi0gICAgSU4gIFVJTlQgICAgICAgICAgICBEYXRhTGVuLAotICAgIElOCUJPT0xFQU4JCQlpczR3YXlGcmFtZSkKLQotewotCU5ESVNfU1RBVFVTICAgICBTdGF0dXM7Ci0JUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQ7Ci0JVUNIQVIgICBJbmRleDsKLQotCWRvCi0JewotCQkvLyAxLiBidWlsZCBhIE5ESVMgcGFja2V0IGFuZCBjYWxsIFJUTVBTZW5kUGFja2V0KCk7Ci0JCS8vICAgIGJlIGNhcmVmdWwgYWJvdXQgaG93L3doZW4gdG8gcmVsZWFzZSB0aGlzIGludGVybmFsIGFsbG9jYXRlZCBORElTIFBBQ0tFVCBidWZmZXIKLQkJU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwUGFja2V0LCBwSGVhZGVyODAyXzMsIEhkckxlbiwgcERhdGEsIERhdGFMZW4pOwotCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQlicmVhazsKLQotCQlpZiAoaXM0d2F5RnJhbWUpCi0JCQlSVE1QX1NFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBQYWNrZXQsIDEpOwotCQllbHNlCi0JCQlSVE1QX1NFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBQYWNrZXQsIDApOwotCi0JCS8vIDIuIHNlbmQgb3V0IHRoZSBwYWNrZXQKLQkJU3RhdHVzID0gU1RBU2VuZFBhY2tldChwQWQsIHBQYWNrZXQpOwotCQlpZihTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJLy8gRGVxdWV1ZSBvbmUgZnJhbWUgZnJvbSBUeFN3UXVldWUwLi4zIHF1ZXVlIGFuZCBwcm9jZXNzIGl0Ci0JCQkvLyBUaGVyZSBhcmUgdGhyZWUgcGxhY2UgY2FsbGluZyBkZXF1ZXVlIGZvciBUWCByaW5nLgotCQkJLy8gMS4gSGVyZSwgcmlnaHQgYWZ0ZXIgcXVldWVpbmcgdGhlIGZyYW1lLgotCQkJLy8gMi4gQXQgdGhlIGVuZCBvZiBUeFJpbmdUeERvbmUgc2VydmljZSByb3V0aW5lLgotCQkJLy8gMy4gVXBvbiBORElTIGNhbGwgUlRNUFNlbmRQYWNrZXRzCi0JCQlpZigoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpICYmCi0JCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSkKLQkJCXsKLQkJCQlmb3IoSW5kZXggPSAwOyBJbmRleCA8IDU7IEluZGV4ICsrKQotCQkJCQlpZihwQWQtPlR4U3dRdWV1ZVtJbmRleF0uTnVtYmVyID4gMCkKLQkJCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEluZGV4LCBNQVhfVFhfUFJPQ0VTUyk7Ci0JCQl9Ci0JCX0KLQl9IHdoaWxlKEZBTFNFKTsKLQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBDaGVjayBTYW5pdHkgUlNOIElFIGZvcm0gQVAKLQotICAgIEFyZ3VtZW50czoKLQotICAgIFJldHVybiBWYWx1ZToKLQotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBDaGVja1JTTklFKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCi0JSU4gIFVDSEFSICAgICAgICAgICBEYXRhTGVuLAotCU9VVAlVQ0hBUgkJCSpPZmZzZXQpCi17Ci0JUFVDSEFSICAgICAgICAgICAgICBwVklFOwotCVVDSEFSICAgICAgICAgICAgICAgbGVuOwotCVBFSURfU1RSVUNUICAgICAgICAgcEVpZDsKLQlCT09MRUFOCQkJCXJlc3VsdCA9IEZBTFNFOwotCi0JcFZJRSA9IHBEYXRhOwotCWxlbgkgPSBEYXRhTGVuOwotCSpPZmZzZXQgPSAwOwotCi0Jd2hpbGUgKGxlbiA+IHNpemVvZihSU05JRTIpKQotCXsKLQkJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFZJRTsKLQkJLy8gV1BBIFJTTiBJRQotCQlpZiAoKHBFaWQtPkVpZCA9PSBJRV9XUEEpICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKSkKLQkJewotCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEgfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgotCQkJCShOZGlzRXF1YWxNZW1vcnkocFZJRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKSkgJiYKLQkJCQkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPT0gKHBFaWQtPkxlbiArIDIpKSkKLQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hlY2tSU05JRSA9PT4gV1BBL1dQQVBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsIChwRWlkLT5MZW4gKyAyKSkpOwotCQkJCQlyZXN1bHQgPSBUUlVFOwotCQkJfQotCi0JCQkqT2Zmc2V0ICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJfQotCQkvLyBXUEEyIFJTTiBJRQotCQllbHNlIGlmICgocEVpZC0+RWlkID09IElFX1JTTikgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKSkKLQkJewotCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCi0JCQkJKE5kaXNFcXVhbE1lbW9yeShwVklFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pKSAmJgotCQkJCShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9PSAocEVpZC0+TGVuICsgMikpKQotCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVja1JTTklFID09PiBXUEEyL1dQQTJQU0sgUlNOIElFIG1hdGNoZWQgaW4gTXNnIDMsIExlbmd0aCglZCkgXG4iLCAocEVpZC0+TGVuICsgMikpKTsKLQkJCQkJcmVzdWx0ID0gVFJVRTsKLQkJCX0KLQotCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlicmVhazsKLQkJfQotCi0JCXBWSUUgKz0gKHBFaWQtPkxlbiArIDIpOwotCQlsZW4gIC09IChwRWlkLT5MZW4gKyAyKTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVja1JTTklFID09PiBza2lwX29mZnNldCglZCkgXG4iLCAqT2Zmc2V0KSk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotCi19Ci0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgUGFyc2UgS0VZREFUQSBmaWVsZC4gIEtFWURBVEFbXSBNYXkgY29udGFpbiAyIFJTTiBJRSBhbmQgb3B0aW9uYWxseSBHVEsuCi0gICAgR1RLICBpcyBlbmNhcHR1bGF0ZWQgaW4gS0RFIGZvcm1hdCBhdCAgcC44MyA4MDIuMTFpIEQxMAotCi0gICAgQXJndW1lbnRzOgotCi0gICAgUmV0dXJuIFZhbHVlOgotCi0gICAgTm90ZToKLSAgICAgICAgODAyLjExaSBEMTAKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4gUGFyc2VLZXlEYXRhKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcEtleURhdGEsCi0JSU4gIFVDSEFSICAgICAgICAgICBLZXlEYXRhTGVuLAotCUlOCVVDSEFSCQkJYlBhaXJld2lzZSkKLXsKLSAgICBQS0RFX0VOQ0FQICAgICAgICAgIHBLREUgPSBOVUxMOwotICAgIFBVQ0hBUiAgICAgICAgICAgICAgcE15S2V5RGF0YSA9IHBLZXlEYXRhOwotICAgIFVDSEFSICAgICAgICAgICAgICAgS2V5RGF0YUxlbmd0aCA9IEtleURhdGFMZW47Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBHVEtMRU47Ci0JVUNIQVIJCQkJc2tpcF9vZmZzZXQ7Ci0KLQkvLyBWZXJpZnkgVGhlIFJTTiBJRSBjb250YWluZWQgaW4gUGFpcmV3aXNlLU1zZyAzIGFuZCBza2lwIGl0Ci0JaWYgKGJQYWlyZXdpc2UpCi0gICAgewotCQkvLyBDaGVjayBSU04gSUUgd2hldGhlciBpdCBpcyBXUEEyL1dQQTJQU0sKLQkJaWYgKCFDaGVja1JTTklFKHBBZCwgcEtleURhdGEsIEtleURhdGFMZW4sICZza2lwX29mZnNldCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlBhcnNlS2V5RGF0YSA9PT4gV1BBMi9XUEEyUFNLIFJTTiBJRSBtaXNtYXRjaGVkIFxuIikpOwotCQkJaGV4X2R1bXAoIkdldCBLRVlEQVRBIDoiLCBwS2V5RGF0YSwgS2V5RGF0YUxlbik7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0gICAgCX0KLSAgICAJZWxzZQotCQl7Ci0JCQkvLyBza2lwIFJTTiBJRQotCQkJcE15S2V5RGF0YSArPSBza2lwX29mZnNldDsKLQkJCUtleURhdGFMZW5ndGggLT0gc2tpcF9vZmZzZXQ7Ci0KLQkJCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGFyc2VLZXlEYXRhID09PiBXUEEyL1dQQTJQU0sgUlNOIElFIG1hdGNoZWQgaW4gTXNnIDMsIExlbmd0aCglZCkgXG4iLCBza2lwX29mZnNldCkpOwotCQl9Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJQYXJzZUtleURhdGEgPT0+IEtleURhdGFMZW5ndGggJWQgd2l0aG91dCBSU05fSUUgXG4iLCBLZXlEYXRhTGVuZ3RoKSk7Ci0KLQkvLyBQYXJzZSBFS0QgZm9ybWF0Ci0JaWYgKEtleURhdGFMZW5ndGggPj0gOCkKLSAgICB7Ci0gICAgICAgIHBLREUgPSAoUEtERV9FTkNBUCkgcE15S2V5RGF0YTsKLSAgICB9Ci0JZWxzZQotICAgIHsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEtleURhdGFMZW5ndGggaXMgdG9vIHNob3J0IFxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0KLQkvLyBTYW5pdHkgY2hlY2sgLSBzaGFyZWQga2V5IGluZGV4IHNob3VsZCBub3QgYmUgMAotCWlmIChwS0RFLT5HVEtFbmNhcC5LaWQgPT0gMCkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBHVEsgS2V5IGluZGV4IHplcm8gXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLQkvLyBTYW5pdHkgY2hlY2sgLSBLRUQgbGVuZ3RoCi0JaWYgKEtleURhdGFMZW5ndGggPCAocEtERS0+TGVuICsgMikpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogVGhlIGxlbiBmcm9tIEtERSBpcyB0b28gc2hvcnQgXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLQkvLyBHZXQgR1RLIGxlbmd0aCAtIHJlZmVyIHRvIElFRUUgODAyLjExaS0yMDA0IHAuODIKLQlHVEtMRU4gPSBwS0RFLT5MZW4gLTY7Ci0KLQlpZiAoR1RLTEVOIDwgTEVOX0FFU19LRVkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogR1RLIEtleSBsZW5ndGggaXMgdG9vIHNob3J0ICglZCkgXG4iLCBHVEtMRU4pKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCX0KLQllbHNlCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkdUSyBLZXkgd2l0aCBLREUgZm9ybWV0IGdvdCBpbmRleD0lZCwgbGVuPSVkIFxuIiwgcEtERS0+R1RLRW5jYXAuS2lkLCBHVEtMRU4pKTsKLQotCS8vIFVwZGF0ZSBHVEsKLQkvLyBzZXQga2V5IG1hdGVyaWFsLCBUeE1pYyBhbmQgUnhNaWMgZm9yIFdQQVBTSwotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkdUSywgcEtERS0+R1RLRW5jYXAuR1RLLCAzMik7Ci0JcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gcEtERS0+R1RLRW5jYXAuS2lkOwotCi0JLy8gVXBkYXRlIHNoYXJlZCBrZXkgdGFibGUKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IExFTl9US0lQX0VLOwotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBwS0RFLT5HVEtFbmNhcC5HVEssIExFTl9US0lQX0VLKTsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCAmcEtERS0+R1RLRW5jYXAuR1RLWzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCAmcEtERS0+R1RLRW5jYXAuR1RLWzI0XSwgTEVOX1RLSVBfVFhNSUNLKTsKLQotCS8vIFVwZGF0ZSBTaGFyZWQgS2V5IENpcGhlckFsZwotCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0JCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7Ci0JZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwotCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkKLQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0JZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkKLQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCi0JcmV0dXJuIFRSVUU7Ci0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNpc2NvIENDS00gUFJGIGZ1bmN0aW9uCi0KLQlBcmd1bWVudHM6Ci0JCWtleQkJCQlDaXNjbyBCYXNlIFRyYW5zaWVudCBLZXkgKEJUSykKLQkJa2V5X2xlbgkJCVRoZSBrZXkgbGVuZ3RoIG9mIHRoZSBCVEsKLQkJZGF0YQkJCVJ1cXVlc3QgTnVtYmVyKFJOKSArIEJTU0lECi0JCWRhdGFfbGVuCQlUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhCi0JCW91dHB1dAkJCVN0b3JlIGZvciBQVEsoUGFpcndpc2UgdHJhbnNpZW50IGtleXMpCi0JCWxlbgkJCQlUaGUgbGVuZ3RoIG9mIHRoZSBvdXRwdXQKLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0JCTgwMi4xaQlBbm5leCBGLjkKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQ0NLTVBSRigKLQlJTglVQ0hBUgkqa2V5LAotCUlOCUlOVAkJa2V5X2xlbiwKLQlJTglVQ0hBUgkqZGF0YSwKLQlJTglJTlQJCWRhdGFfbGVuLAotCU9VVAlVQ0hBUgkqb3V0cHV0LAotCUlOCUlOVAkJbGVuKQotewotCUlOVAkJaTsKLQlVQ0hBUglpbnB1dFsxMDI0XTsKLQlJTlQJCWN1cnJlbnRpbmRleCA9IDA7Ci0JSU5UCQl0b3RhbF9sZW47Ci0KLQlOZGlzTW92ZU1lbW9yeShpbnB1dCwgZGF0YSwgZGF0YV9sZW4pOwotCXRvdGFsX2xlbiA9IGRhdGFfbGVuOwotCWlucHV0W3RvdGFsX2xlbl0gPSAwOwotCXRvdGFsX2xlbisrOwotCWZvcgkoaSA9IDA7CWkgPAkobGVuICsgMTkpIC8gMjA7IGkrKykKLQl7Ci0JCUhNQUNfU0hBMShpbnB1dCwgdG90YWxfbGVuLAlrZXksIGtleV9sZW4sICZvdXRwdXRbY3VycmVudGluZGV4XSk7Ci0JCWN1cnJlbnRpbmRleCArPQkyMDsKLQkJaW5wdXRbdG90YWxfbGVuIC0gMV0rKzsKLQl9Ci19Cit2b2lkIGluY19ieXRlX2FycmF5KHU4ICogY291bnRlciwgaW50IGxlbik7CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xODY0LDE4OSArNTgsMTc4IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBSZXBvcnRNaWNFcnJvcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQQ0lQSEVSX0tFWSAJcFdwYUtleSkKK3ZvaWQgUlRNUFJlcG9ydE1pY0Vycm9yKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBXcGFLZXkpCiB7Ci0JVUxPTkcJTm93OwotICAgIFVDSEFSICAgdW5pY2FzdEtleSA9IChwV3BhS2V5LT5UeXBlID09IFBBSVJXSVNFX0tFWSA/IDE6MCk7CisJdW5zaWduZWQgbG9uZyBOb3c7CisJdTggdW5pY2FzdEtleSA9IChwV3BhS2V5LT5UeXBlID09IFBBSVJXSVNFX0tFWSA/IDEgOiAwKTsKIAotCS8vIFJlY29yZCBMYXN0IE1JQyBlcnJvciB0aW1lIGFuZCBjb3VudAotCU5vdyA9IGppZmZpZXM7Ci0JaWYgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9PSAwKQotCXsKKwkvKiBSZWNvcmQgTGFzdCBNSUMgZXJyb3IgdGltZSBhbmQgY291bnQgKi8KKwlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCWlmIChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPT0gMCkgewogCQlwQWQtPlN0YUNmZy5NaWNFcnJDbnQrKzsKIAkJcEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSA9IE5vdzsKLSAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgOCk7Ci0JfQotCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9PSAxKQotCXsKLQkJaWYgKChwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lICsgKDYwICogT1NfSFopKSA8IE5vdykKLQkJewotCQkJLy8gVXBkYXRlIExhc3QgTUlDIGVycm9yIHRpbWUsIHRoaXMgZGlkIG5vdCB2aW9sYXRlIHR3byBNSUMgZXJyb3JzIHdpdGhpbiA2MCBzZWNvbmRzCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIDgpOworCX0gZWxzZSBpZiAocEFkLT5TdGFDZmcuTWljRXJyQ250ID09IDEpIHsKKwkJaWYgKChwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lICsgKDYwICogT1NfSFopKSA8IE5vdykgeworCQkJLyogVXBkYXRlIExhc3QgTUlDIGVycm9yIHRpbWUsIHRoaXMgZGlkIG5vdCB2aW9sYXRlIHR3byBNSUMgZXJyb3JzIHdpdGhpbiA2MCBzZWNvbmRzICovCiAJCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gTm93OwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCiAJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfQ09VTlRFUl9NRUFTVVJFU19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsCisJCQkJCQkgICAgICBJV19DT1VOVEVSX01FQVNVUkVTX0VWRU5UX0ZMQUcsCisJCQkJCQkgICAgICBwQWQtPk1hY1RhYi4KKwkJCQkJCSAgICAgIENvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwKKwkJCQkJCSAgICAgIEJTUzAsIDApOwogCiAJCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gTm93OwotCQkJLy8gVmlvbGF0ZSBNSUMgZXJyb3IgY291bnRzLCBNSUMgY291bnRlcm1lYXN1cmVzIGtpY2tzIGluCisJCQkvKiBWaW9sYXRlIE1JQyBlcnJvciBjb3VudHMsIE1JQyBjb3VudGVybWVhc3VyZXMga2lja3MgaW4gKi8KIAkJCXBBZC0+U3RhQ2ZnLk1pY0VyckNudCsrOworCQkJLyogV2Ugc2hhbGwgYmxvY2sgYWxsIHJlY2VwdGlvbiAqLworCQkJLyogV2Ugc2hhbGwgY2xlYW4gYWxsIFR4IHJpbmcgYW5kIGRpc2Fzc29pY2F0ZSBmcm9tIEFQIGFmdGVyIG5leHQgRUFQT0wgZnJhbWUgKi8KKwkJCS8qICovCisJCQkvKiBObyBuZWNlc3NhcnkgdG8gY2xlYW4gYWxsIFR4IHJpbmcsIG9uIFJUTVBIYXJkVHJhbnNtaXQgd2lsbCBzdG9wIHNlbmRpbmcgbm9uLTgwMi4xWCBFQVBPTCBwYWNrZXRzICovCisJCQkvKiBpZiBwQWQtPlN0YUNmZy5NaWNFcnJDbnQgZ3JlYXRlciB0aGFuIDIuICovCisJCQkvKiAqLworCQkJLyogUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsgKi8KKwkJCS8qIFJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CRSk7ICovCisJCQkvKiBSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOyAqLworCQkJLyogUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsgKi8KKwkJCS8qIFJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9IQ0NBKTsgKi8KIAkJfQotCX0KLQllbHNlCi0JewotCQkvLyBNSUMgZXJyb3IgY291bnQgPj0gMgotCQkvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuCisJfSBlbHNlIHsKKwkJLyogTUlDIGVycm9yIGNvdW50ID49IDIgKi8KKwkJLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiAqLwogCQk7CiAJfQotICAgIE1sbWVFbnF1ZXVlKHBBZCwKLQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLQkJCQlPSURfODAyXzExX01JQ19GQUlMVVJFX1JFUE9SVF9GUkFNRSwKLQkJCQkxLAotCQkJCSZ1bmljYXN0S2V5KTsKKwlNbG1lRW5xdWV1ZShwQWQsCisJCSAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJICAgIE9JRF84MDJfMTFfTUlDX0ZBSUxVUkVfUkVQT1JUX0ZSQU1FLCAxLCAmdW5pY2FzdEtleSk7CiAKLSAgICBpZiAocEFkLT5TdGFDZmcuTWljRXJyQ250ID09IDIpCi0gICAgewotICAgICAgICBSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLldwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyLCAxMDApOwotICAgIH0KKwlpZiAocEFkLT5TdGFDZmcuTWljRXJyQ250ID09IDIpIHsKKwkJUlRNUFNldFRpbWVyKCZwQWQtPlN0YUNmZy5XcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lciwgMTAwKTsKKwl9CiB9CiAKICNkZWZpbmUJTEVOR1RIX0VBUF9IICAgIDQKLS8vIElmIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBFQVAtUGFja2V0ICxmaW5kIG91dCBpdHMgRUFQLUNvZGUgKFJlcXVlc3QoMHgwMSksIFJlc3BvbnNlKDB4MDIpLCBTdWNjZXNzKDB4MDMpLCBGYWlsdXJlKDB4MDQpKS4KLUlOVAkgICAgV3BhQ2hlY2tFYXBDb2RlKAotCUlOICBQUlRNUF9BREFQVEVSICAgCQlwQWQsCi0JSU4gIFBVQ0hBUgkJCQlwRnJhbWUsCi0JSU4gIFVTSE9SVAkJCQlGcmFtZUxlbiwKLQlJTiAgVVNIT1JUCQkJCU9mZlNldCkKKy8qIElmIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBFQVAtUGFja2V0ICxmaW5kIG91dCBpdHMgRUFQLUNvZGUgKFJlcXVlc3QoMHgwMSksIFJlc3BvbnNlKDB4MDIpLCBTdWNjZXNzKDB4MDMpLCBGYWlsdXJlKDB4MDQpKS4gKi8KK2ludCBXcGFDaGVja0VhcENvZGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgdTggKnBGcmFtZSwgdTE2IEZyYW1lTGVuLCB1MTYgT2ZmU2V0KQogewogCi0JUFVDSEFSCXBEYXRhOwotCUlOVAlyZXN1bHQgPSAwOworCXU4ICpwRGF0YTsKKwlpbnQgcmVzdWx0ID0gMDsKIAotCWlmKCBGcmFtZUxlbiA8IE9mZlNldCArIExFTkdUSF9FQVBPTF9IICsgTEVOR1RIX0VBUF9IICkKKwlpZiAoRnJhbWVMZW4gPCBPZmZTZXQgKyBMRU5HVEhfRUFQT0xfSCArIExFTkdUSF9FQVBfSCkKIAkJcmV0dXJuIHJlc3VsdDsKIAotCXBEYXRhID0gcEZyYW1lICsgT2ZmU2V0OyAvLyBza2lwIG9mZnNldCBieXRlcworCXBEYXRhID0gcEZyYW1lICsgT2ZmU2V0OwkvKiBza2lwIG9mZnNldCBieXRlcyAqLwogCi0JaWYoKihwRGF0YSsxKSA9PSBFQVBQYWNrZXQpIAkvLyA4MDIuMXggaGVhZGVyIC0gUGFja2V0IFR5cGUKKwlpZiAoKihwRGF0YSArIDEpID09IEVBUFBhY2tldCkJLyogODAyLjF4IGhlYWRlciAtIFBhY2tldCBUeXBlICovCiAJewotCQkgcmVzdWx0ID0gKihwRGF0YSs0KTsJCS8vIEVBUCBoZWFkZXIgLSBDb2RlCisJCXJlc3VsdCA9ICoocERhdGEgKyA0KTsJLyogRUFQIGhlYWRlciAtIENvZGUgKi8KIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1WT0lEICAgIFdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiAgQk9PTEVBTiAgICAgICAgICBiVW5pY2FzdCkKK3ZvaWQgV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJVbmljYXN0KQogewotICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKLSAgICBjaGFyIGN1c3RvbVtJV19DVVNUT01fTUFYXSA9IHswfTsKKwljaGFyIGN1c3RvbVtJV19DVVNUT01fTUFYXSA9IHsgMCB9OwogCi0gICAgc3ByaW50ZihjdXN0b20sICJNTE1FLU1JQ0hBRUxNSUNGQUlMVVJFLmluZGljYXRpb24iKTsKLSAgICBpZiAoYlVuaWNhc3QpCi0gICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMgdW5pY2FzdCIsIGN1c3RvbSk7Ci0gICAgd3JxdS5kYXRhLmxlbmd0aCA9IHN0cmxlbihjdXN0b20pOwotICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgY3VzdG9tKTsKKwlzcHJpbnRmKGN1c3RvbSwgIk1MTUUtTUlDSEFFTE1JQ0ZBSUxVUkUuaW5kaWNhdGlvbiIpOworCWlmIChiVW5pY2FzdCkKKwkJc3ByaW50ZihjdXN0b20sICIlcyB1bmljYXN0IiwgY3VzdG9tKTsKIAotICAgIHJldHVybjsKKwlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZDVVNUT00sIC0xLCBOVUxMLCAodTggKiljdXN0b20sCisJCQkJc3RybGVuKGN1c3RvbSkpOworCisJcmV0dXJuOwogfQogCi1WT0lECVdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIFdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKLQlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKLQlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl07Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBiVW5pY2FzdDsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJdTggSGVhZGVyODAyXzNbMTRdOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW4gPSAwOworCXN0cnVjdCBydF9lYXBvbF9wYWNrZXQgUGFja2V0OworCXU4IE1pY1sxNl07CisJQk9PTEVBTiBiVW5pY2FzdDsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSAtLS0tLT5cbiIpKTsKIAotICAgIGJVbmljYXN0ID0gKEVsZW0tPk1zZ1swXSA9PSAxID8gVFJVRTpGQUxTRSk7CisJYlVuaWNhc3QgPSAoRWxlbS0+TXNnWzBdID09IDEgPyBUUlVFIDogRkFMU0UpOwogCXBBZC0+U2VxdWVuY2UgPSAoKHBBZC0+U2VxdWVuY2UpICsgMSkgJiAoTUFYX1NFUV9OVU1CRVIpOwogCi0JLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0Ci0JTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisJLyogaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0ICovCisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJICBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CiAKIAlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7Ci0JUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKLQlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OworCVBhY2tldC5Qcm9WZXIgPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUgPSBFQVBPTEtleTsKIAogCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOwogCi0gICAgLy8gUmVxdWVzdCBmaWVsZCBwcmVzZW50ZWQKLSAgICBQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlJlcXVlc3QgPSAxOworCS8qIFJlcXVlc3QgZmllbGQgcHJlc2VudGVkICovCisJUGFja2V0LktleURlc2MuS2V5SW5mby5SZXF1ZXN0ID0gMTsKIAotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQl7CisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSB7CiAJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDI7Ci0JfQotCWVsc2UJICAvLyBUS0lQCisJfSBlbHNlCQkJLyogVEtJUCAqLwogCXsKIAkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMTsKIAl9CiAKLSAgICBQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSAoYlVuaWNhc3QgPyBQQUlSV0lTRUtFWSA6IEdST1VQS0VZKTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSAoYlVuaWNhc3QgPyBQQUlSV0lTRUtFWSA6IEdST1VQS0VZKTsKIAotCS8vIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOworCS8qIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQgKi8KKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyA9IDE7CiAKLSAgICAvLyBFcnJvciBmaWVsZCBwcmVzZW50ZWQKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLkVycm9yICA9IDE7CisJLyogRXJyb3IgZmllbGQgcHJlc2VudGVkICovCisJUGFja2V0LktleURlc2MuS2V5SW5mby5FcnJvciA9IDE7CiAKLQkvLyBVcGRhdGUgcGFja2V0IGxlbmd0aCBhZnRlciBkZWNpZGUgS2V5IGRhdGEgcGF5bG9hZAotCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRTsKKwkvKiBVcGRhdGUgcGFja2V0IGxlbmd0aCBhZnRlciBkZWNpZGUgS2V5IGRhdGEgcGF5bG9hZCAqLworCVNFVF91MTZfVE9fQVJSQVJZKFBhY2tldC5Cb2R5X0xlbiwgTEVOX0VBUE9MX0tFWV9NU0cpCisJICAgIC8qIEtleSBSZXBsYXkgQ291bnQgKi8KKwkgICAgTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwKKwkJCSAgIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCWluY19ieXRlX2FycmF5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIDgpOwogCi0JLy8gS2V5IFJlcGxheSBDb3VudAotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotICAgIGluY19ieXRlX2FycmF5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIDgpOworCS8qIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuICovCisJKigodTE2ICopICYgUGFja2V0LktleURlc2MuS2V5SW5mbykgPQorCSAgICBjcHUybGUxNigqKCh1MTYgKikgJiBQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7CiAKLQkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgotCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7Ci0KLQotCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKLQlpZihwT3V0QnVmZmVyID09IE5VTEwpCi0JeworCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICh1OCAqKikgJiBwT3V0QnVmZmVyKTsJLyogYWxsb2NhdGUgbWVtb3J5ICovCisJaWYgKHBPdXRCdWZmZXIgPT0gTlVMTCkgewogCQlyZXR1cm47CiAJfQorCS8qIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbiAqLworCS8qIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uICovCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgJkZyYW1lTGVuLAorCQkJICBDT05WX0FSUkFSWV9UT191MTYoUGFja2V0LkJvZHlfTGVuKSArIDQsICZQYWNrZXQsCisJCQkgIEVORF9PRl9BUkdTKTsKIAotCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgotCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0JCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAmUGFja2V0LAotCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLQotCS8vIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCisJLyogUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUgKi8KIAlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKLQlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JewkvLyBBRVMKLSAgICAgICAgVUNIQVIgZGlnZXN0WzIwXSA9IHswfTsKLQkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHsJLyogQUVTICovCisJCXU4IGRpZ2VzdFsyMF0gPSB7IDAgfTsKKwkJSE1BQ19TSEExKHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwKKwkJCSAgZGlnZXN0LCBTSEExX0RJR0VTVF9TSVpFKTsKIAkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOwotCX0KLQllbHNlCi0JewkvLyBUS0lQCi0JCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfSBlbHNlIHsJCS8qIFRLSVAgKi8KKwkJSE1BQ19NRDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLAorCQkJIE1pYywgTUQ1X0RJR0VTVF9TSVpFKTsKIAl9CiAJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOwogCi0gICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCi0gICAgCSAgCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkJJkhlYWRlcjgwMl8zLAotICAgIAkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAgJlBhY2tldCwKLSAgICAJCQkJRU5EX09GX0FSR1MpOworCS8qIGNvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgc2VuZCBNSUMgZmFpbHVyZSByZXBvcnQgZnJhbWUgdG8gYXV0aGVudGljYXRvciAqLworCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sCisJCQkgIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsCisJCQkgICh1OCAqKSYgUGFja2V0LAorCQkJICBDT05WX0FSUkFSWV9UT191MTYoUGFja2V0LkJvZHlfTGVuKSArIDQsIEZBTFNFKTsKIAotCS8vIG9weSBmcmFtZSB0byBUeCByaW5nIGFuZCBzZW5kIE1JQyBmYWlsdXJlIHJlcG9ydCBmcmFtZSB0byBhdXRoZW50aWNhdG9yCi0JUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIEZBTFNFKTsKLQotCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsICh1OCAqKXBPdXRCdWZmZXIpOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lIDwtLS0tLVxuIikpOwogfQpAQCAtMjA2MCw3ICsyNDMsNyBAQAogICogcm9sbGluZyBvdmVyIHRvIG1vcmUgc2lnbmlmaWNhbnQgYnl0ZXMgaWYgdGhlIGJ5dGUgd2FzIGluY3JlbWVudGVkIGZyb20KICAqIDB4ZmYgdG8gMHgwMC4KICAqLwotdm9pZCBpbmNfYnl0ZV9hcnJheShVQ0hBUiAqY291bnRlciwgaW50IGxlbikKK3ZvaWQgaW5jX2J5dGVfYXJyYXkodTggKiBjb3VudGVyLCBpbnQgbGVuKQogewogCWludCBwb3MgPSBsZW4gLSAxOwogCXdoaWxlIChwb3MgPj0gMCkgewpAQCAtMjA3MSwyMSArMjU0LDEyMCBAQAogCX0KIH0KIAotVk9JRCBXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYygKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit2b2lkIFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJCQl2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCQkJdm9pZCAqU3lzdGVtU3BlY2lmaWMyLAorCQkJCXZvaWQgKlN5c3RlbVNwZWNpZmljMykKIHsKLSAgICBSVE1QX0FEQVBURVIgICAgICAgICAgICAgICAgKnBBZCA9IChQUlRNUF9BREFQVEVSKUZ1bmN0aW9uQ29udGV4dDsKLSAgICBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICAgRGlzYXNzb2NSZXE7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CisJc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxIERpc2Fzc29jUmVxOwogCi0JLy8gZGlzYXNzb2MgZnJvbSBjdXJyZW50IEFQIGZpcnN0Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFJlcG9ydE1pY0Vycm9yIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUCBhZnRlciBzZW5kaW5nIHNlY29uZCBjb250aW51b3VzIEVBUE9MIGZyYW1lXG4iKSk7Ci0JRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9NSUNfRkFJTFVSRSk7Ci0JTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCS8qIGRpc2Fzc29jIGZyb20gY3VycmVudCBBUCBmaXJzdCAqLworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJSVE1QUmVwb3J0TWljRXJyb3IgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQIGFmdGVyIHNlbmRpbmcgc2Vjb25kIGNvbnRpbnVvdXMgRUFQT0wgZnJhbWVcbiIpKTsKKwlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJCSBSRUFTT05fTUlDX0ZBSUxVUkUpOworCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSksICZEaXNhc3NvY1JlcSk7CiAKIAlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOwogCXBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gVFJVRTsKIH0KIAordm9pZCBXcGFTdGFQYWlyd2lzZUtleVNldHRpbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBydF9jaXBoZXJfa2V5ICpwU2hhcmVkS2V5OworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeTsKKworCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCisJLyogUGFpcndpc2Uga2V5IHNoYWxsIHVzZSBrZXkjMCAqLworCXBTaGFyZWRLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF07CisKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QVEssIHBFbnRyeS0+UFRLLCBMRU5fUFRLKTsKKworCS8qIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUgKi8KKwlOZGlzWmVyb01lbW9yeShwU2hhcmVkS2V5LCBzaXplb2Yoc3RydWN0IHJ0X2NpcGhlcl9rZXkpKTsKKwlwU2hhcmVkS2V5LT5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKwlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7CisJTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+UnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLAorCQkgICAgICAgTEVOX1RLSVBfUlhNSUNLKTsKKwlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5UeE1pYywKKwkJICAgICAgICZwQWQtPlN0YUNmZy5QVEtbNDggKyBMRU5fVEtJUF9SWE1JQ0tdLCBMRU5fVEtJUF9UWE1JQ0spOworCisJLyogRGVjaWRlIGl0cyBDaGlwZXJBbGcgKi8KKwlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJZWxzZQorCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKworCS8qIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKi8KKwlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sCisJCSAgICAgICBMRU5fVEtJUF9FSyk7CisJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sCisJCSAgICAgICBMRU5fVEtJUF9SWE1JQ0spOworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsCisJCSAgICAgICAmcEFkLT5TdGFDZmcuUFRLWzQ4ICsgTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKKwlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBTaGFyZWRLZXktPkNpcGhlckFsZzsKKworCS8qIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlICovCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCSAgICAgIEJTUzAsCisJCQkgICAgICAwLAorCQkJICAgICAgcFNoYXJlZEtleS0+Q2lwaGVyQWxnLAorCQkJICAgICAgcFNoYXJlZEtleS0+S2V5LAorCQkJICAgICAgcFNoYXJlZEtleS0+VHhNaWMsIHBTaGFyZWRLZXktPlJ4TWljKTsKKworCS8qIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSAqLworCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCAwLCBwU2hhcmVkS2V5LT5DaXBoZXJBbGcsIHBFbnRyeSk7CisJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiJXMgOiBBSUQoJWQpIHBvcnQgc2VjdXJlZFxuIiwgX19mdW5jX18sIHBFbnRyeS0+QWlkKSk7CisKK30KKwordm9pZCBXcGFTdGFHcm91cEtleVNldHRpbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBydF9jaXBoZXJfa2V5ICpwU2hhcmVkS2V5OworCisJcFNoYXJlZEtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdOworCisJLyogUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZSAqLworCU5kaXNaZXJvTWVtb3J5KHBTaGFyZWRLZXksIHNpemVvZihzdHJ1Y3QgcnRfY2lwaGVyX2tleSkpOworCXBTaGFyZWRLZXktPktleUxlbiA9IExFTl9US0lQX0VLOworCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPktleSwgcEFkLT5TdGFDZmcuR1RLLCBMRU5fVEtJUF9FSyk7CisJTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+UnhNaWMsICZwQWQtPlN0YUNmZy5HVEtbMTZdLAorCQkgICAgICAgTEVOX1RLSVBfUlhNSUNLKTsKKwlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5UeE1pYywgJnBBZC0+U3RhQ2ZnLkdUS1syNF0sCisJCSAgICAgICBMRU5fVEtJUF9UWE1JQ0spOworCisJLyogVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnICovCisJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkKQorCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkKKwkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworCS8qIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlICovCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCSAgICAgIEJTUzAsCisJCQkgICAgICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkgICAgICBwU2hhcmVkS2V5LT5DaXBoZXJBbGcsCisJCQkgICAgICBwU2hhcmVkS2V5LT5LZXksCisJCQkgICAgICBwU2hhcmVkS2V5LT5UeE1pYywgcFNoYXJlZEtleS0+UnhNaWMpOworCisJLyogVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlICovCisJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJICBCU1MwLAorCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorCQkJCSAgcFNoYXJlZEtleS0+Q2lwaGVyQWxnLCBOVUxMKTsKKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGFfaW9jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhX2lvY3RsLmMKaW5kZXggYzBlMDQyNS4uZDhmYmU2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGFfaW9jdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YV9pb2N0bC5jCkBAIC00MCw3ICs0MCw3IEBACiAjaW5jbHVkZQkicnRfY29uZmlnLmgiCiAKICNpZmRlZiBEQkcKLWV4dGVybiBVTE9ORyAgICBSVERlYnVnTGV2ZWw7CitleHRlcm4gdW5zaWduZWQgbG9uZyBSVERlYnVnTGV2ZWw7CiAjZW5kaWYKIAogI2RlZmluZSBOUl9XRVBfS0VZUyAJCQkJNApAQCAtNDksNDI0ICs0OSwzMTAgQEAKIAogI2RlZmluZSBHUk9VUF9LRVlfTk8gICAgICAgICAgICAgICAgNAogCi1leHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhMlRlbXBsYXRlW107Ci1leHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhUHNrVGtpcFtdOwotZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYVBza1RraXBMZW47CitleHRlcm4gdTggQ2lwaGVyV3BhMlRlbXBsYXRlW107CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlRfVkVSU0lPTl9JTkZPewotICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25XOwotICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25YOwotICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25ZOwotICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25aOwotICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkWWVhcjsKLSAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZE1vbnRoOwotICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkRGF5OwotfSBSVF9WRVJTSU9OX0lORk8sICpQUlRfVkVSU0lPTl9JTkZPOwotCi1zdHJ1Y3QgaXdfcHJpdl9hcmdzIHByaXZ0YWJbXSA9IHsKLXsgUlRQUklWX0lPQ1RMX1NFVCwKLSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCAwLAotICAic2V0In0sCi0KLXsgUlRQUklWX0lPQ1RMX1NIT1csIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCi0gICIifSwKLXsgUlRQUklWX0lPQ1RMX1NIT1csIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKLSAgIiJ9LAotLyogLS0tIHN1Yi1pb2N0bHMgZGVmaW5pdGlvbnMgLS0tICovCi0gICAgeyBTSE9XX0NPTk5fU1RBVFVTLAotCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImNvbm5TdGF0dXMiIH0sCi0JeyBTSE9XX0RSVklFUl9WRVJJT04sCi0JICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiZHJpdmVyVmVyIiB9LAotICAgIHsgU0hPV19CQV9JTkZPLAotCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImJhaW5mbyIgfSwKLQl7IFNIT1dfREVTQ19JTkZPLAotCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRlc2NpbmZvIiB9LAotICAgIHsgUkFJT19PRkYsCi0JICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAicmFkaW9fb2ZmIiB9LAotCXsgUkFJT19PTiwKLQkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJyYWRpb19vbiIgfSwKLQl7IFNIT1dfQ0ZHX1ZBTFVFLAotCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAic2hvdyIgfSwKLS8qIC0tLSBzdWItaW9jdGxzIHJlbGF0aW9ucyAtLS0gKi8KLQoteyBSVFBSSVZfSU9DVExfU1RBVElTVElDUywKLSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKLSAgInN0YXQifSwKLXsgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZLAotICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCi0gICJnZXRfc2l0ZV9zdXJ2ZXkifSwKK3N0cnVjdCBQQUNLRUQgcnRfdmVyc2lvbl9pbmZvIHsKKwl1OCBEcml2ZXJWZXJzaW9uVzsKKwl1OCBEcml2ZXJWZXJzaW9uWDsKKwl1OCBEcml2ZXJWZXJzaW9uWTsKKwl1OCBEcml2ZXJWZXJzaW9uWjsKKwl1MzIgRHJpdmVyQnVpbGRZZWFyOworCXUzMiBEcml2ZXJCdWlsZE1vbnRoOworCXUzMiBEcml2ZXJCdWlsZERheTsKIH07CiAKLUlOVCBTZXRfU1NJRF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOwotCi0jaWZkZWYgV01NX1NVUFBPUlQKLUlOVAlTZXRfV21tQ2FwYWJsZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0jZW5kaWYKLQotSU5UIFNldF9OZXR3b3JrVHlwZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X0F1dGhNb2RlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfRW5jcnlwVHlwZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X0RlZmF1bHRLZXlJRF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X0tleTFfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKLQotSU5UIFNldF9LZXkyX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfS2V5M19Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X0tleTRfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKLQotSU5UIFNldF9XUEFQU0tfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKLQotCi1JTlQgU2V0X1BTTW9kZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X1dwYV9TdXBwb3J0KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLU5ESVNfU1RBVFVTIFJUTVBXUEFOb25lQWRkS2V5UHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTglQVk9JRAkJCXBCdWYpOwotCi1JTlQgU2V0X0ZyYWdUZXN0X1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfVEduV2lmaVRlc3RfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVCBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1zdGF0aWMgc3RydWN0IHsKLQlDSEFSICpuYW1lOwotCUlOVCAoKnNldF9wcm9jKShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLCBQVUNIQVIgYXJnKTsKLX0gKlBSVE1QX1BSSVZBVEVfU0VUX1BST0MsIFJUTVBfUFJJVkFURV9TVVBQT1JUX1BST0NbXSA9IHsKLQl7IkRyaXZlclZlcnNpb24iLAkJCQlTZXRfRHJpdmVyVmVyc2lvbl9Qcm9jfSwKLQl7IkNvdW50cnlSZWdpb24iLAkJCQlTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jfSwKLQl7IkNvdW50cnlSZWdpb25BQmFuZCIsCQkJU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jfSwKLQl7IlNTSUQiLAkJCQkJCVNldF9TU0lEX1Byb2N9LAotCXsiV2lyZWxlc3NNb2RlIiwJCQkJU2V0X1dpcmVsZXNzTW9kZV9Qcm9jfSwKLQl7IlR4QnVyc3QiLAkJCQkJU2V0X1R4QnVyc3RfUHJvY30sCi0JeyJUeFByZWFtYmxlIiwJCQkJU2V0X1R4UHJlYW1ibGVfUHJvY30sCi0JeyJUeFBvd2VyIiwJCQkJCVNldF9UeFBvd2VyX1Byb2N9LAotCXsiQ2hhbm5lbCIsCQkJCQlTZXRfQ2hhbm5lbF9Qcm9jfSwKLQl7IkJHUHJvdGVjdGlvbiIsCQkJCVNldF9CR1Byb3RlY3Rpb25fUHJvY30sCi0JeyJSVFNUaHJlc2hvbGQiLAkJCQlTZXRfUlRTVGhyZXNob2xkX1Byb2N9LAotCXsiRnJhZ1RocmVzaG9sZCIsCQkJCVNldF9GcmFnVGhyZXNob2xkX1Byb2N9LAotCXsiSHRCdyIsCQkgICAgICAgICAgICAgICAgU2V0X0h0QndfUHJvY30sCi0JeyJIdE1jcyIsCQkgICAgICAgICAgICAgICAgU2V0X0h0TWNzX1Byb2N9LAotCXsiSHRHaSIsCQkgICAgICAgICAgICAgICAgU2V0X0h0R2lfUHJvY30sCi0JeyJIdE9wTW9kZSIsCQkgICAgICAgICAgICBTZXRfSHRPcE1vZGVfUHJvY30sCi0JeyJIdEV4dGNoYSIsCQkgICAgICAgICAgICBTZXRfSHRFeHRjaGFfUHJvY30sCi0JeyJIdE1wZHVEZW5zaXR5IiwJCSAgICAgICAgU2V0X0h0TXBkdURlbnNpdHlfUHJvY30sCi0JeyJIdEJhV2luU2l6ZSIsCQkgICAgICAgIAlTZXRfSHRCYVdpblNpemVfUHJvY30sCi0JeyJIdFJkZyIsCQkgICAgICAgIAkJU2V0X0h0UmRnX1Byb2N9LAotCXsiSHRBbXNkdSIsCQkgICAgICAgIAkJU2V0X0h0QW1zZHVfUHJvY30sCi0JeyJIdEF1dG9CYSIsCQkgICAgICAgIAlTZXRfSHRBdXRvQmFfUHJvY30sCi0JeyJIdEJhRGVjbGluZSIsCQkJCQlTZXRfQkFEZWNsaW5lX1Byb2N9LAotCXsiSHRQcm90ZWN0IiwJCSAgICAgICAgCVNldF9IdFByb3RlY3RfUHJvY30sCi0JeyJIdE1pbW9QcyIsCQkgICAgICAgIAlTZXRfSHRNaW1vUHNfUHJvY30sCi0jaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAotCXsiUGt0QWdncmVnYXRlIiwJCQkJU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jfSwKLSNlbmRpZgotCi0jaWZkZWYgV01NX1NVUFBPUlQKLQl7IldtbUNhcGFibGUiLAkJCQkJU2V0X1dtbUNhcGFibGVfUHJvY30sCi0jZW5kaWYKLQl7IklFRUU4MDIxMUgiLAkJCQkJU2V0X0lFRUU4MDIxMUhfUHJvY30sCi0gICAgeyJOZXR3b3JrVHlwZSIsICAgICAgICAgICAgICAgICBTZXRfTmV0d29ya1R5cGVfUHJvY30sCi0JeyJBdXRoTW9kZSIsCQkJCQlTZXRfQXV0aE1vZGVfUHJvY30sCi0JeyJFbmNyeXBUeXBlIiwJCQkJCVNldF9FbmNyeXBUeXBlX1Byb2N9LAotCXsiRGVmYXVsdEtleUlEIiwJCQkJU2V0X0RlZmF1bHRLZXlJRF9Qcm9jfSwKLQl7IktleTEiLAkJCQkJCVNldF9LZXkxX1Byb2N9LAotCXsiS2V5MiIsCQkJCQkJU2V0X0tleTJfUHJvY30sCi0JeyJLZXkzIiwJCQkJCQlTZXRfS2V5M19Qcm9jfSwKLQl7IktleTQiLAkJCQkJCVNldF9LZXk0X1Byb2N9LAotCXsiV1BBUFNLIiwJCQkJCQlTZXRfV1BBUFNLX1Byb2N9LAotCXsiUmVzZXRDb3VudGVyIiwJCQkJU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvY30sCi0JeyJQU01vZGUiLCAgICAgICAgICAgICAgICAgICAgICBTZXRfUFNNb2RlX1Byb2N9LAotI2lmZGVmIERCRwotCXsiRGVidWciLAkJCQkJCVNldF9EZWJ1Z19Qcm9jfSwKLSNlbmRpZgotICAgIHsiV3BhU3VwcG9ydCIsICAgICAgICAgICAgICAgICAgU2V0X1dwYV9TdXBwb3J0fSwKLQl7IkZpeGVkVHhNb2RlIiwgICAgICAgICAgICAgICAgIFNldF9GaXhlZFR4TW9kZV9Qcm9jfSwKLSAgICB7IlRHbldpZmlUZXN0IiwgICAgICAgICAgICAgICAgIFNldF9UR25XaWZpVGVzdF9Qcm9jfSwKLSAgICB7IkZvcmNlR0YiLAkJICAgICAgICAJCVNldF9Gb3JjZUdGX1Byb2N9LAotCXsiTG9uZ1JldHJ5IiwJICAgICAgICAJCVNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jfSwKLQl7IlNob3J0UmV0cnkiLAkgICAgICAgIAkJU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jfSwKLSNpZmRlZiBSVDI4NzAKLQl7ImVmdXNlRnJlZU51bWJlciIsCQkJCXNldF9lRnVzZUdldEZyZWVCbG9ja0NvdW50X1Byb2N9LAotCXsiZWZ1c2VEdW1wIiwJCQkJCXNldF9lRnVzZWR1bXBfUHJvY30sCi0JeyJlZnVzZUxvYWRGcm9tQmluIiwJCQkJc2V0X2VGdXNlTG9hZEZyb21CaW5fUHJvY30sCi0jZW5kaWYKLQl7TlVMTCx9CitzdGF0aWMgX19zMzIgcmFsaW5rcmF0ZVtdID0geyAyLCA0LCAxMSwgMjIsCS8qIENDSyAqLworCTEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDgsCS8qIE9GRE0gKi8KKwkxMywgMjYsIDM5LCA1MiwgNzgsIDEwNCwgMTE3LCAxMzAsIDI2LCA1MiwgNzgsIDEwNCwgMTU2LCAyMDgsIDIzNCwgMjYwLAkvKiAyME1IeiwgODAwbnMgR0ksIE1DUzogMCB+IDE1ICovCisJMzksIDc4LCAxMTcsIDE1NiwgMjM0LCAzMTIsIDM1MSwgMzkwLAkvKiAyME1IeiwgODAwbnMgR0ksIE1DUzogMTYgfiAyMyAqLworCTI3LCA1NCwgODEsIDEwOCwgMTYyLCAyMTYsIDI0MywgMjcwLCA1NCwgMTA4LCAxNjIsIDIxNiwgMzI0LCA0MzIsIDQ4NiwgNTQwLAkvKiA0ME1IeiwgODAwbnMgR0ksIE1DUzogMCB+IDE1ICovCisJODEsIDE2MiwgMjQzLCAzMjQsIDQ4NiwgNjQ4LCA3MjksIDgxMCwJLyogNDBNSHosIDgwMG5zIEdJLCBNQ1M6IDE2IH4gMjMgKi8KKwkxNCwgMjksIDQzLCA1NywgODcsIDExNSwgMTMwLCAxNDQsIDI5LCA1OSwgODcsIDExNSwgMTczLCAyMzAsIDI2MCwgMjg4LAkvKiAyME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1ICovCisJNDMsIDg3LCAxMzAsIDE3MywgMjYwLCAzMTcsIDM5MCwgNDMzLAkvKiAyME1IeiwgNDAwbnMgR0ksIE1DUzogMTYgfiAyMyAqLworCTMwLCA2MCwgOTAsIDEyMCwgMTgwLCAyNDAsIDI3MCwgMzAwLCA2MCwgMTIwLCAxODAsIDI0MCwgMzYwLCA0ODAsIDU0MCwgNjAwLAkvKiA0ME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1ICovCisJOTAsIDE4MCwgMjcwLCAzNjAsIDU0MCwgNzIwLCA4MTAsIDkwMAogfTsKIAoraW50IFNldF9TU0lEX1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIsIGNoYXIgKmFyZyk7CiAKLVZPSUQgUlRNUEFkZEtleSgKLQlJTglQUlRNUF9BREFQVEVSCSAgICBwQWQsCi0JSU4JUE5ESVNfODAyXzExX0tFWSAgICBwS2V5KQoraW50IFNldF9OZXR3b3JrVHlwZV9Qcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyLCBjaGFyICphcmcpOworCit2b2lkIFJUTVBBZGRLZXkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbmRpc184MDJfMTFfa2V5ICpwS2V5KQogewotCVVMT05HCQkJCUtleUlkeDsKLQlNQUNfVEFCTEVfRU5UUlkgIAkqcEVudHJ5OworCXVuc2lnbmVkIGxvbmcgS2V5SWR4OworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeTsKIAotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRLZXkgLS0tLS0tPlxuIikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRLZXkgLS0tLS0tPlxuIikpOwogCi0jaWZkZWYgUlQyODYwCi0JUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwotCWlmIChSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQpKQotCXsKLQkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKLQkJewotCQkJUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLQkJCXJldHVybjsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBXUEFBZGRLZXlQcm9jMT09PlxuIikpOwotCQlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9IQUxUKTsKLQkJUlRNUHVzZWNEZWxheSg2MDAwKTsKLQkJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7Ci0JfQotI2VuZGlmCisJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgeworCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKSB7CisJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgeworCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywgMzIpOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywKKwkJCQkJICAgICAgIHBLZXktPktleU1hdGVyaWFsLAorCQkJCQkgICAgICAgcEtleS0+S2V5TGVuZ3RoKTsKKwkJCQlnb3RvIGVuZDsKKwkJCX0KKwkJCS8qIFVwZGF0ZSBQVEsgKi8KKwkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9jaXBoZXJfa2V5KSk7CisJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKwkJCQkgICAgICAgcEtleS0+S2V5TWF0ZXJpYWwsIExFTl9US0lQX0VLKTsKIAotCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JewotCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQotCQl7Ci0JCSAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5QTUssIDMyKTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QTUssIHBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOwotICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICAgICAgfQotCQkgICAgLy8gVXBkYXRlIFBUSwotCQkgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotICAgICAgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIHBLZXktPktleU1hdGVyaWFsLCBMRU5fVEtJUF9FSyk7CisJCQlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PQorCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywKKwkJCQkJICAgICAgIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssCisJCQkJCSAgICAgICBMRU5fVEtJUF9UWE1JQ0spOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorCQkJCQkgICAgICAgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArCisJCQkJCSAgICAgICBMRU5fVEtJUF9UWE1JQ0ssCisJCQkJCSAgICAgICBMRU5fVEtJUF9SWE1JQ0spOworCQkJfSBlbHNlIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKwkJCQkJICAgICAgIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssCisJCQkJCSAgICAgICBMRU5fVEtJUF9UWE1JQ0spOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLAorCQkJCQkgICAgICAgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArCisJCQkJCSAgICAgICBMRU5fVEtJUF9UWE1JQ0ssCisJCQkJCSAgICAgICBMRU5fVEtJUF9SWE1JQ0spOworCQkJfQogCi0gICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOwotICAgICAgICAgICAgfQorCQkJLyogRGVjaWRlIGl0cyBDaGlwZXJBbGcgKi8KKwkJCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09CisJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0KKwkJCQkgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCQkJZWxzZQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwogCi0gICAgICAgICAgICAvLyBEZWNpZGUgaXRzIENoaXBlckFsZwotICAgICAgICAJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLSAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLSAgICAgICAgCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLSAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwotICAgICAgICAJZWxzZQotICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQkJLyogVXBkYXRlIHRoZXNlIHJlbGF0ZWQgaW5mb3JtYXRpb24gdG8gc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqLworCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwKKwkJCQkgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorCQkJCSAgICAgICBMRU5fVEtJUF9FSyk7CisJCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLAorCQkJCSAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywKKwkJCQkgICAgICAgTEVOX1RLSVBfUlhNSUNLKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsCisJCQkJICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorCQkJCSAgICAgICBMRU5fVEtJUF9UWE1JQ0spOworCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPQorCQkJICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKIAotICAgICAgICAgICAgLy8gVXBkYXRlIHRoZXNlIHJlbGF0ZWQgaW5mb3JtYXRpb24gdG8gTUFDX1RBQkxFX0VOVFJZCi0gICAgICAgIAlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIExFTl9US0lQX0VLKTsKLSAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBMRU5fVEtJUF9SWE1JQ0spOwotICAgICAgICAJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5UeE1pYywgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIExFTl9US0lQX1RYTUlDSyk7Ci0gICAgICAgIAlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKKwkJCS8qIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlICovCisJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkgICAgICBCU1MwLAorCQkJCQkgICAgICAwLAorCQkJCQkgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisJCQkJCSAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKwkJCQkJICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCisJCQkJCSAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljKTsKIAotICAgICAgICAJLy8gVXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKLSAgICAgICAgCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCi0gICAgICAgIAkJCQkJCSAgQlNTMCwKLSAgICAgICAgCQkJCQkJICAwLAotICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKLSAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCi0gICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCi0gICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOworCQkJLyogVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlICovCisJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCSAgQlNTMCwKKwkJCQkJCSAgMCwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uCisJCQkJCQkgIENpcGhlckFsZywgcEVudHJ5KTsKIAotICAgICAgICAJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0gICAgICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLSAgICAgICAgCQkJCQkJCSAgQlNTMCwKLSAgICAgICAgCQkJCQkJCSAgMCwKLSAgICAgICAgCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAotICAgICAgICAJCQkJCQkJICBwRW50cnkpOwotCi0gICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHsKKwkJCQkvKiBzZXQgODAyLjF4IHBvcnQgY29udHJvbCAqLworCQkJCS8qcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsgKi8KIAkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CiAKLSAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQotICAgICAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0gICAgICAgICAgICB9Ci0JCX0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBVcGRhdGUgR1RLCi0gICAgICAgICAgICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAocEtleS0+S2V5SW5kZXggJiAweEZGKTsKLSAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotICAgICAgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBwS2V5LT5LZXlNYXRlcmlhbCwgTEVOX1RLSVBfRUspOworCQkJCS8qIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJICovCisJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPQorCQkJCSAgICBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFVwZGF0ZSBHVEsgKi8KKwkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChwS2V5LT5LZXlJbmRleCAmIDB4RkYpOworCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+CisJCQkJICAgICAgIFNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy4KKwkJCQkJCSAgICAgICBEZWZhdWx0S2V5SWRdLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2NpcGhlcl9rZXkpKTsKKwkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0KKwkJCSAgICBMRU5fVEtJUF9FSzsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+CisJCQkJICAgICAgIFNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy4KKwkJCQkJCSAgICAgICBEZWZhdWx0S2V5SWRdLktleSwKKwkJCQkgICAgICAgcEtleS0+S2V5TWF0ZXJpYWwsIExFTl9US0lQX0VLKTsKIAotICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKLSAgICAgICAgICAgIH0KKwkJCWlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PQorCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPgorCQkJCQkgICAgICAgU2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgICAgICBEZWZhdWx0S2V5SWRdLgorCQkJCQkgICAgICAgUnhNaWMsCisJCQkJCSAgICAgICBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLAorCQkJCQkgICAgICAgTEVOX1RLSVBfVFhNSUNLKTsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPgorCQkJCQkgICAgICAgU2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgICAgICBEZWZhdWx0S2V5SWRdLgorCQkJCQkgICAgICAgVHhNaWMsCisJCQkJCSAgICAgICBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsKKwkJCQkJICAgICAgIExFTl9US0lQX1RYTUlDSywKKwkJCQkJICAgICAgIExFTl9US0lQX1JYTUlDSyk7CisJCQl9IGVsc2UgeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+CisJCQkJCSAgICAgICBTaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuCisJCQkJCQkJICAgICAgIERlZmF1bHRLZXlJZF0uCisJCQkJCSAgICAgICBUeE1pYywKKwkJCQkJICAgICAgIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssCisJCQkJCSAgICAgICBMRU5fVEtJUF9UWE1JQ0spOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+CisJCQkJCSAgICAgICBTaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuCisJCQkJCQkJICAgICAgIERlZmF1bHRLZXlJZF0uCisJCQkJCSAgICAgICBSeE1pYywKKwkJCQkJICAgICAgIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKworCQkJCQkgICAgICAgTEVOX1RLSVBfVFhNSUNLLAorCQkJCQkgICAgICAgTEVOX1RLSVBfUlhNSUNLKTsKKwkJCX0KIAotICAgICAgICAgICAgLy8gVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnCi0gICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotICAgIAkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0gICAgCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLSAgICAJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0gICAgCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCQkJLyogVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnICovCisJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLgorCQkJICAgIENpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09CisJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLgorCQkJCSAgICBDaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09CisJCQkJIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS4KKwkJCQkgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKIAotICAgICAgICAgICAgLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKLSAgICAgICAgCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCi0gICAgICAgIAkJCQkJCSAgQlNTMCwKLSAgICAgICAgCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCi0gICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCi0gICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCi0gICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywKLSAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljKTsKKwkJCS8qIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlICovCisJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkgICAgICBCU1MwLAorCQkJCQkgICAgICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCSAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLgorCQkJCQkJCQkgICBEZWZhdWx0S2V5SWRdLgorCQkJCQkgICAgICBDaXBoZXJBbGcsCisJCQkJCSAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLgorCQkJCQkJCQkgICBEZWZhdWx0S2V5SWRdLgorCQkJCQkgICAgICBLZXksCisJCQkJCSAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLgorCQkJCQkJCQkgICBEZWZhdWx0S2V5SWRdLgorCQkJCQkgICAgICBUeE1pYywKKwkJCQkJICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuCisJCQkJCQkJCSAgIERlZmF1bHRLZXlJZF0uCisJCQkJCSAgICAgIFJ4TWljKTsKIAotICAgICAgICAJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0gICAgICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLSAgICAgICAgCQkJCQkJCSAgQlNTMCwKLSAgICAgICAgCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAotICAgICAgICAJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKLSAgICAgICAgCQkJCQkJCSAgTlVMTCk7CisJCQkvKiBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgKi8KKwkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+CisJCQkJCQkJCSAgICAgICBTdGFDZmcuCisJCQkJCQkJCSAgICAgICBEZWZhdWx0S2V5SWRdLgorCQkJCQkJICBDaXBoZXJBbGcsIE5VTEwpOwogCi0gICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorCQkJLyogc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wgKi8KKwkJCS8qcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsgKi8KIAkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKIAotICAgICAgICAgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKLSAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0gICAgICAgIH0KLQl9Ci0JZWxzZQkvLyBkeW5hbWljIFdFUCBmcm9tIHdwYV9zdXBwbGljYW50CisJCQkvKiBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSSAqLworCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJfQorCX0gZWxzZQkJCS8qIGR5bmFtaWMgV0VQIGZyb20gd3BhX3N1cHBsaWNhbnQgKi8KIAl7Ci0JCVVDSEFSCUNpcGhlckFsZzsKLSAgICAJUFVDSEFSCUtleTsKKwkJdTggQ2lwaGVyQWxnOworCQl1OCAqS2V5OwogCi0JCWlmKHBLZXktPktleUxlbmd0aCA9PSAzMikKKwkJaWYgKHBLZXktPktleUxlbmd0aCA9PSAzMikKIAkJCWdvdG8gZW5kOwogCiAJCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKIAotCQlpZiAoS2V5SWR4IDwgNCkKLQkJewotCQkJLy8gaXQgaXMgYSBkZWZhdWx0IHNoYXJlZCBrZXksIGZvciBQYWlyd2lzZSBrZXkgc2V0dGluZwotCQkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKLQkJCXsKKwkJaWYgKEtleUlkeCA8IDQpIHsKKwkJCS8qIGl0IGlzIGEgZGVmYXVsdCBzaGFyZWQga2V5LCBmb3IgUGFpcndpc2Uga2V5IHNldHRpbmcgKi8KKwkJCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApIHsKIAkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBLZXktPkJTU0lEKTsKIAotCQkJCWlmIChwRW50cnkpCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QQWRkS2V5OiBTZXQgUGFpci13aXNlIEtleVxuIikpOworCQkJCWlmIChwRW50cnkpIHsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJSVE1QQWRkS2V5OiBTZXQgUGFpci13aXNlIEtleVxuIikpOwogCi0JCQkJCS8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKLSAJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuS2V5TGVuID0gKFVDSEFSKXBLZXktPktleUxlbmd0aDsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKwkJCQkJLyogc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aCAqLworCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9CisJCQkJCSAgICAodTgpcEtleS0+S2V5TGVuZ3RoOworCQkJCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwKKwkJCQkJCSAgICAgICAmcEtleS0+S2V5TWF0ZXJpYWwsCisJCQkJCQkgICAgICAgcEtleS0+S2V5TGVuZ3RoKTsKIAotCQkJCQkvLyBzZXQgQ2lwaGVyIHR5cGUKKwkJCQkJLyogc2V0IENpcGhlciB0eXBlICovCiAJCQkJCWlmIChwS2V5LT5LZXlMZW5ndGggPT0gNSkKLQkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPQorCQkJCQkJICAgIENJUEhFUl9XRVA2NDsKIAkJCQkJZWxzZQotCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPQorCQkJCQkJICAgIENJUEhFUl9XRVAxMjg7CiAKLQkJCQkJLy8gQWRkIFBhaXItd2lzZSBrZXkgdG8gQXNpYwotCQkJCQlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgKLQkJCQkJCXBBZCwKLQkJCQkJCXBFbnRyeS0+QWRkciwKLQkJCQkJCShVQ0hBUilwRW50cnktPkFpZCwKLSAgICAgICAgICAgICAgICAJCSZwRW50cnktPlBhaXJ3aXNlS2V5KTsKKwkJCQkJLyogQWRkIFBhaXItd2lzZSBrZXkgdG8gQXNpYyAqLworCQkJCQlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeShwQWQsCisJCQkJCQkJCXBFbnRyeS0+QWRkciwKKwkJCQkJCQkJKHU4KXBFbnRyeS0+CisJCQkJCQkJCUFpZCwKKwkJCQkJCQkJJnBFbnRyeS0+CisJCQkJCQkJCVBhaXJ3aXNlS2V5KTsKIAotCQkJCQkvLyB1cGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGVudHJ5Ci0JCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoCi0JCQkJCQlwQWQsCi0JCQkJCQlCU1MwLAotCQkJCQkJS2V5SWR4LCAvLyBUaGUgdmFsdWUgbWF5IGJlIG5vdCB6ZXJvCi0JCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZywKLQkJCQkJCXBFbnRyeSk7CisJCQkJCS8qIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZW50cnkgKi8KKwkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwJLyogVGhlIHZhbHVlIG1heSBiZSBub3QgemVybyAqLworCQkJCQkJCQkgIHBFbnRyeS0+CisJCQkJCQkJCSAgUGFpcndpc2VLZXkuCisJCQkJCQkJCSAgQ2lwaGVyQWxnLAorCQkJCQkJCQkgIHBFbnRyeSk7CiAKIAkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0gICAgICAgICAgICB7Ci0JCQkJLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQotCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OworCQkJfSBlbHNlIHsKKwkJCQkvKiBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpICovCisJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKHU4KUtleUlkeDsKIAotCQkJCS8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKLQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcEtleS0+S2V5TGVuZ3RoOwotCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisJCQkJLyogc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aCAqLworCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0KKwkJCQkgICAgKHU4KXBLZXktPktleUxlbmd0aDsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwKKwkJCQkJICAgICAgICZwS2V5LT5LZXlNYXRlcmlhbCwKKwkJCQkJICAgICAgIHBLZXktPktleUxlbmd0aCk7CiAKLQkJCQkvLyBTZXQgQ2lwZXIgdHlwZQorCQkJCS8qIFNldCBDaXBlciB0eXBlICovCiAJCQkJaWYgKHBLZXktPktleUxlbmd0aCA9PSA1KQotCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPQorCQkJCQkgICAgQ0lQSEVSX1dFUDY0OwogCQkJCWVsc2UKLQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9CisJCQkJCSAgICBDSVBIRVJfV0VQMTI4OwogCi0gICAgCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7Ci0gICAgCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXk7CisJCQkJQ2lwaGVyQWxnID0KKwkJCQkgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisJCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXk7CiAKLQkJCQkvLyBTZXQgR3JvdXAga2V5IG1hdGVyaWFsIHRvIEFzaWMKLSAgICAJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKwkJCQkvKiBTZXQgR3JvdXAga2V5IG1hdGVyaWFsIHRvIEFzaWMgKi8KKwkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBLZXlJZHgsCisJCQkJCQkgICAgICBDaXBoZXJBbGcsIEtleSwgTlVMTCwKKwkJCQkJCSAgICAgIE5VTEwpOwogCi0JCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKLQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIE5VTEwpOworCQkJCS8qIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlICovCisJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwKKwkJCQkJCQkgIENpcGhlckFsZywgTlVMTCk7CiAKIAkJCX0KIAkJfQogCX0KIGVuZDoKLSNpZmRlZiBSVDI4NjAKLQlSVE1QX1NFVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwotICAgIERCR1BSSU5UKFJUX0RFQlVHX0lORk8sICgiPC0tLS0tLSBSVE1QQWRkS2V5XG4iKSk7Ci0jZW5kaWYKIAlyZXR1cm47CiB9CiAKLWNoYXIgKiBydHN0cmNocihjb25zdCBjaGFyICogcywgaW50IGMpCitjaGFyICpydHN0cmNocihjb25zdCBjaGFyICpzLCBpbnQgYykKIHsKLSAgICBmb3IoOyAqcyAhPSAoY2hhcikgYzsgKytzKQotICAgICAgICBpZiAoKnMgPT0gJ1wwJykKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiAoY2hhciAqKSBzOworCWZvciAoOyAqcyAhPSAoY2hhciljOyArK3MpCisJCWlmICgqcyA9PSAnXDAnKQorCQkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIChjaGFyICopczsKIH0KIAogLyoKQEAgLTQ3NSwxNTkgKzM2MSwxNjQgQEAKIAogaW50CiBydF9pb2N0bF9naXduYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQorCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCiB7Ci0vLwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OwotCXN0cm5jcHkobmFtZSwgUlQyOHh4X0NISVBfTkFNRSAiIFdpcmVsZXNzIiwgSUZOQU1TSVopOworCXN0cm5jcHkobmFtZSwgIlJhbGluayBTVEEiLCBJRk5BTVNJWik7CisJLyogUlQyODcwIDIuMS4wLjAgdXNlcyAiUlQyODcwIFdpcmVsZXNzIiAqLworCS8qIFJUMzA5MCAyLjEuMC4wIHVzZXMgIlJUMjg2MCBXaXJlbGVzcyIgKi8KIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX3Npd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQlzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCisJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICBzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKLQlpbnQgCWNoYW4gPSAtMTsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CisJaW50IGNoYW4gPSAtMTsKIAotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0gICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgICAgICByZXR1cm4gLUVORVRET1dOOwotICAgIH0KKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKIAorCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CisJfQogCiAJaWYgKGZyZXEtPmUgPiAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmKChmcmVxLT5lID09IDApICYmIChmcmVxLT5tIDw9IDEwMDApKQotCQljaGFuID0gZnJlcS0+bTsJLy8gU2V0dGluZyBieSBjaGFubmVsIG51bWJlcgorCWlmICgoZnJlcS0+ZSA9PSAwKSAmJiAoZnJlcS0+bSA8PSAxMDAwKSkKKwkJY2hhbiA9IGZyZXEtPm07CS8qIFNldHRpbmcgYnkgY2hhbm5lbCBudW1iZXIgKi8KIAllbHNlCi0JCU1BUF9LSFpfVE9fQ0hBTk5FTF9JRCggKGZyZXEtPm0gLzEwMCkgLCBjaGFuKTsgLy8gU2V0dGluZyBieSBmcmVxdWVuY3kgLSBzZWFyY2ggdGhlIHRhYmxlICwgbGlrZSAyLjQxMkcsIDIuNDIyRywKKwkJTUFQX0tIWl9UT19DSEFOTkVMX0lEKChmcmVxLT5tIC8gMTAwKSwgY2hhbik7CS8qIFNldHRpbmcgYnkgZnJlcXVlbmN5IC0gc2VhcmNoIHRoZSB0YWJsZSAsIGxpa2UgMi40MTJHLCAyLjQyMkcsICovCiAKLSAgICBpZiAoQ2hhbm5lbFNhbml0eShwQWRhcHRlciwgY2hhbikgPT0gVFJVRSkKLSAgICB7Ci0JcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID0gY2hhbjsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI9PT5ydF9pb2N0bF9zaXdmcmVxOjpTSU9DU0lXRlJFUVtjbWQ9MHgleF0gKENoYW5uZWw9JWQpXG4iLCBTSU9DU0lXRlJFUSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJaWYgKENoYW5uZWxTYW5pdHkocEFkYXB0ZXIsIGNoYW4pID09IFRSVUUpIHsKKwkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID0gY2hhbjsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCI9PT5ydF9pb2N0bF9zaXdmcmVxOjpTSU9DU0lXRlJFUVtjbWQ9MHgleF0gKENoYW5uZWw9JWQpXG4iLAorCQkJICBTSU9DU0lXRlJFUSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0dXJuIDA7CiB9CisKIGludCBydF9pb2N0bF9naXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OwotCVVDSEFSIGNoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsOwotCVVMT05HCW07CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOworCXU4IGNoOworCXVuc2lnbmVkIGxvbmcgbSA9IDI0MTIwMDA7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIj09PnJ0X2lvY3RsX2dpd2ZyZXEgICVkXG4iLCBjaCkpOworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOwogCi0gICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKGNoLCBtKTsKKwljaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PnJ0X2lvY3RsX2dpd2ZyZXEgICVkXG4iLCBjaCkpOworCisJTUFQX0NIQU5ORUxfSURfVE9fS0haKGNoLCBtKTsKIAlmcmVxLT5tID0gbSAqIDEwMDsKIAlmcmVxLT5lID0gMTsKIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX3Npd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQorCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIF9fdTMyICogbW9kZSwgY2hhciAqZXh0cmEpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CiAKLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICB7Ci0gICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKLSAgICB9CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CiAKLQlzd2l0Y2ggKCptb2RlKQotCXsKLQkJY2FzZSBJV19NT0RFX0FESE9DOgotCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJBZGhvYyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVdfTU9ERV9JTkZSQToKLQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiSW5mcmEiKTsKLQkJCWJyZWFrOwotICAgICAgICBjYXNlIElXX01PREVfTU9OSVRPUjoKLQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiTW9uaXRvciIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfc2l3bW9kZTo6U0lPQ1NJV01PREUgKHVua25vd24gJWQpXG4iLCAqbW9kZSkpOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKIAl9CiAKLQkvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5CisJc3dpdGNoICgqbW9kZSkgeworCWNhc2UgSVdfTU9ERV9BREhPQzoKKwkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJBZGhvYyIpOworCQlicmVhazsKKwljYXNlIElXX01PREVfSU5GUkE6CisJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiSW5mcmEiKTsKKwkJYnJlYWs7CisJY2FzZSBJV19NT0RFX01PTklUT1I6CisJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiTW9uaXRvciIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIj09PT5ydF9pb2N0bF9zaXdtb2RlOjpTSU9DU0lXTU9ERSAodW5rbm93biAlZClcbiIsCisJCQkgICptb2RlKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFJlc2V0IFJhbGluayBzdXBwbGljYW50IHRvIG5vdCB1c2UsIGl0IHdpbGwgYmUgc2V0IHRvIHN0YXJ0IHdoZW4gVUkgc2V0IFBNSyBrZXkgKi8KIAlwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOwogCiAJcmV0dXJuIDA7CiB9CiAKIGludCBydF9pb2N0bF9naXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBfX3UzMiAqIG1vZGUsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOworCisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CiAKIAlpZiAoQURIT0NfT04ocEFkYXB0ZXIpKQogCQkqbW9kZSA9IElXX01PREVfQURIT0M7Ci0gICAgZWxzZSBpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorCWVsc2UgaWYgKElORlJBX09OKHBBZGFwdGVyKSkKIAkJKm1vZGUgPSBJV19NT0RFX0lORlJBOwotICAgIGVsc2UgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQotICAgIHsKLSAgICAgICAgKm1vZGUgPSBJV19NT0RFX01PTklUT1I7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgKm1vZGUgPSBJV19NT0RFX0FVVE87CisJZWxzZSBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpIHsKKwkJKm1vZGUgPSBJV19NT0RFX01PTklUT1I7CisJfSBlbHNlCisJCSptb2RlID0gSVdfTU9ERV9BVVRPOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+cnRfaW9jdGxfZ2l3bW9kZShtb2RlPSVkKVxuIiwgKm1vZGUpKTsKIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX3Npd3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCisJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CiAKLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgCXsKLSAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAgICAgCXJldHVybiAtRU5FVERPV047Ci0gICAgCX0KKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKKworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKIGludCBydF9pb2N0bF9naXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQorCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQogewogCXJldHVybiAwOwogfQogCiBpbnQgcnRfaW9jdGxfZ2l3cmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OwotCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKWV4dHJhOwogCXUxNiB2YWw7CiAJaW50IGk7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+cnRfaW9jdGxfZ2l3cmFuZ2VcbiIpKTsKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9naXdyYW5nZVxuIikpOwogCWRhdGEtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOwogCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkpOwogCiAJcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKIAotCWlmIChJTkZSQV9PTihwQWRhcHRlcil8fEFESE9DX09OKHBBZGFwdGVyKSkKLQl7CisJaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpIHsKIAkJcmFuZ2UtPm1pbl9wbXAgPSAxICogMTAyNDsKIAkJcmFuZ2UtPm1heF9wbXAgPSA2NTUzNSAqIDEwMjQ7CiAJCXJhbmdlLT5taW5fcG10ID0gMSAqIDEwMjQ7CkBAIC02MzUsNyArNTI2LDcgQEAKIAkJcmFuZ2UtPnBtcF9mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKIAkJcmFuZ2UtPnBtdF9mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7CiAJCXJhbmdlLT5wbV9jYXBhID0gSVdfUE9XRVJfUEVSSU9EIHwgSVdfUE9XRVJfVElNRU9VVCB8Ci0JCQlJV19QT1dFUl9VTklDQVNUX1IgfCBJV19QT1dFUl9BTExfUjsKKwkJICAgIElXX1BPV0VSX1VOSUNBU1RfUiB8IElXX1BPV0VSX0FMTF9SOwogCX0KIAogCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOwpAQCAtNjQ2LDE1ICs1MzcsMTQgQEAKIAlyYW5nZS0+bWluX3JldHJ5ID0gMDsKIAlyYW5nZS0+bWF4X3JldHJ5ID0gMjU1OwogCi0JcmFuZ2UtPm51bV9jaGFubmVscyA9ICBwQWRhcHRlci0+Q2hhbm5lbExpc3ROdW07CisJcmFuZ2UtPm51bV9jaGFubmVscyA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bTsKIAogCXZhbCA9IDA7Ci0JZm9yIChpID0gMTsgaSA8PSByYW5nZS0+bnVtX2NoYW5uZWxzOyBpKyspCi0JewotCQl1MzIgbTsKLQkJcmFuZ2UtPmZyZXFbdmFsXS5pID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ktMV0uQ2hhbm5lbDsKLQkJTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpLTFdLkNoYW5uZWwsIG0pOwotCQlyYW5nZS0+ZnJlcVt2YWxdLm0gPSBtICogMTAwOyAvKiBIWiAqLworCWZvciAoaSA9IDE7IGkgPD0gcmFuZ2UtPm51bV9jaGFubmVsczsgaSsrKSB7CisJCXUzMiBtID0gMjQxMjAwMDsKKwkJcmFuZ2UtPmZyZXFbdmFsXS5pID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0W2kgLSAxXS5DaGFubmVsOworCQlNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkYXB0ZXItPkNoYW5uZWxMaXN0W2kgLSAxXS5DaGFubmVsLCBtKTsKKwkJcmFuZ2UtPmZyZXFbdmFsXS5tID0gbSAqIDEwMDsJLyogT1NfSFogKi8KIAogCQlyYW5nZS0+ZnJlcVt2YWxdLmUgPSAxOwogCQl2YWwrKzsKQEAgLTY2MywxMSArNTUzLDExIEBACiAJfQogCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gdmFsOwogCi0JcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAxMDA7IC8qIHdoYXQgaXMgY29ycmVjdCBtYXg/IFRoaXMgd2FzIG5vdAotCQkJCQkqIGRvY3VtZW50ZWQgZXhhY3RseS4gQXQgbGVhc3QKLQkJCQkJKiA2OSBoYXMgYmVlbiBvYnNlcnZlZC4gKi8KLQlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAwOyAvKiBkQiAqLwotCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDA7IC8qIGRCICovCisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAxMDA7CS8qIHdoYXQgaXMgY29ycmVjdCBtYXg/IFRoaXMgd2FzIG5vdAorCQkJCQkgKiBkb2N1bWVudGVkIGV4YWN0bHkuIEF0IGxlYXN0CisJCQkJCSAqIDY5IGhhcyBiZWVuIG9ic2VydmVkLiAqLworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDA7CS8qIGRCICovCisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsJLyogZEIgKi8KIAogCS8qIFdoYXQgd291bGQgYmUgc3VpdGFibGUgdmFsdWVzIGZvciAiYXZlcmFnZS90eXBpY2FsIiBxdWFsPyAqLwogCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gMjA7CkBAIC02ODcsNzAgKzU3Nyw2OCBAQAogCiAJLyogSVdfRU5DX0NBUEFfKiBiaXQgZmllbGQgKi8KIAlyYW5nZS0+ZW5jX2NhcGEgPSBJV19FTkNfQ0FQQV9XUEEgfCBJV19FTkNfQ0FQQV9XUEEyIHwKLQkJCQkJSVdfRU5DX0NBUEFfQ0lQSEVSX1RLSVAgfCBJV19FTkNfQ0FQQV9DSVBIRVJfQ0NNUDsKKwkgICAgSVdfRU5DX0NBUEFfQ0lQSEVSX1RLSVAgfCBJV19FTkNfQ0FQQV9DSVBIRVJfQ0NNUDsKIAogCXJldHVybiAwOwogfQogCiBpbnQgcnRfaW9jdGxfc2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OwotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJzc2lkOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKKwlORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCc3NpZDsKIAotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLSAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgICAgIAlyZXR1cm4gLUVORVRET1dOOwotICAgIH0KKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKIAotCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQotICAgIHsKLSAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKLSAgICB9CisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CiAKLSAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKLSAgICAvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgotICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7Ci0JLy8gUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMKLQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisJaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpIHsKKwkJUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIk1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lIVxuIikpOworCX0KKwkvKiB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcgKi8KKwkvKiB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLiAqLworCXBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisJLyogUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMgKi8KKwlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiA9IDMyOwogCi0gICAgbWVtc2V0KEJzc2lkLCAwLCBNQUNfQUREUl9MRU4pOwotICAgIG1lbWNweShCc3NpZCwgYXBfYWRkci0+c2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKLSAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKLSAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLSAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lELAotICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUyksCi0gICAgICAgICAgICAgICAgKFZPSUQgKikmQnNzaWQpOworCW1lbXNldChCc3NpZCwgMCwgTUFDX0FERFJfTEVOKTsKKwltZW1jcHkoQnNzaWQsIGFwX2FkZHItPnNhX2RhdGEsIE1BQ19BRERSX0xFTik7CisJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCSAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJICAgIE9JRF84MDJfMTFfQlNTSUQsCisJCSAgICBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpLCAodm9pZCAqKSAmIEJzc2lkKTsKIAotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DU0lXQVAgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0gICAgICAgIEJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiSU9DVEw6OlNJT0NTSVdBUCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgQnNzaWRbMF0sCisJCSAgQnNzaWRbMV0sIEJzc2lkWzJdLCBCc3NpZFszXSwgQnNzaWRbNF0sIEJzc2lkWzVdKSk7CiAKIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX2dpd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgICAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CiAKLQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKLQl7CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CisKKwlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkgewogCQlhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAJCW1lbWNweShhcF9hZGRyLT5zYV9kYXRhLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5Cc3NpZCwgRVRIX0FMRU4pOwogCX0KLSAgICAvLyBBZGQgZm9yIFJUMjg3MAotICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCi0gICAgewotICAgICAgICBhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0gICAgICAgIG1lbWNweShhcF9hZGRyLT5zYV9kYXRhLCAmcEFkYXB0ZXItPk1sbWVBdXguQnNzaWQsIEVUSF9BTEVOKTsKLSAgICB9Ci0JZWxzZQotCXsKKwkvKiBBZGQgZm9yIFJUMjg3MCAqLworCWVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpIHsKKwkJYXBfYWRkci0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQltZW1jcHkoYXBfYWRkci0+c2FfZGF0YSwgJnBBZGFwdGVyLT5NbG1lQXV4LkJzc2lkLCBFVEhfQUxFTik7CisJfSBlbHNlIHsKIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NHSVdBUCg9RU1QVFkpXG4iKSk7CiAJCXJldHVybiAtRU5PVENPTk47CiAJfQpAQCAtNzc0LDMxNiArNjYyLDMxNyBAQAogICogTkI6IHZhcmlvdXMgY2FsY3VsYXRpb25zIGFyZSBiYXNlZCBvbiB0aGUgb3Jpbm9jby93YXZlbGFuCiAgKiAgICAgZHJpdmVycyBmb3IgY29tcGF0aWJpbGl0eQogICovCi1zdGF0aWMgdm9pZCBzZXRfcXVhbGl0eShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3F1YWxpdHkgKmlxLAotICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGNoYXIgcnNzaSkKK3N0YXRpYyB2b2lkIHNldF9xdWFsaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyLAorCQkJc3RydWN0IGl3X3F1YWxpdHkgKmlxLCBzaWduZWQgY2hhciByc3NpKQogewogCV9fdTggQ2hhbm5lbFF1YWxpdHk7CiAKLQkvLyBOb3JtYWxpemUgUnNzaQorCS8qIE5vcm1hbGl6ZSBSc3NpICovCiAJaWYgKHJzc2kgPj0gLTUwKQogCQlDaGFubmVsUXVhbGl0eSA9IDEwMDsKLQllbHNlIGlmIChyc3NpID49IC04MCkgLy8gYmV0d2VlbiAtNTAgfiAtODBkYm0KLQkJQ2hhbm5lbFF1YWxpdHkgPSAoX191OCkoMjQgKyAoKHJzc2kgKyA4MCkgKiAyNikvMTApOwotCWVsc2UgaWYgKHJzc2kgPj0gLTkwKSAgIC8vIGJldHdlZW4gLTgwIH4gLTkwZGJtCi0gICAgICAgIENoYW5uZWxRdWFsaXR5ID0gKF9fdTgpKChyc3NpICsgOTApICogMjYpLzEwOworCWVsc2UgaWYgKHJzc2kgPj0gLTgwKQkvKiBiZXR3ZWVuIC01MCB+IC04MGRibSAqLworCQlDaGFubmVsUXVhbGl0eSA9IChfX3U4KSAoMjQgKyAoKHJzc2kgKyA4MCkgKiAyNikgLyAxMCk7CisJZWxzZSBpZiAocnNzaSA+PSAtOTApCS8qIGJldHdlZW4gLTgwIH4gLTkwZGJtICovCisJCUNoYW5uZWxRdWFsaXR5ID0gKF9fdTgpICgocnNzaSArIDkwKSAqIDI2KSAvIDEwOwogCWVsc2UKIAkJQ2hhbm5lbFF1YWxpdHkgPSAwOwogCi0gICAgaXEtPnF1YWwgPSAoX191OClDaGFubmVsUXVhbGl0eTsKKwlpcS0+cXVhbCA9IChfX3U4KSBDaGFubmVsUXVhbGl0eTsKIAotICAgIGlxLT5sZXZlbCA9IChfX3U4KShyc3NpKTsKLSAgICBpcS0+bm9pc2UgPSAocEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdID4gcEFkYXB0ZXItPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkKSA/ICgoX191OClwQWRhcHRlci0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQpIDogKChfX3U4KSBwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0pOyAJLy8gbm9pc2UgbGV2ZWwgKGRCbSkKLSAgICBpcS0+bm9pc2UgKz0gMjU2IC0gMTQzOwotICAgIGlxLT51cGRhdGVkID0gcEFkYXB0ZXItPml3X3N0YXRzLnF1YWwudXBkYXRlZDsKKwlpcS0+bGV2ZWwgPSAoX191OCkgKHJzc2kpOworCWlxLT5ub2lzZSA9IChwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0gPiBwQWRhcHRlci0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQpID8gKChfX3U4KSBwQWRhcHRlci0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQpIDogKChfX3U4KSBwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0pOwkvKiBub2lzZSBsZXZlbCAoZEJtKSAqLworCWlxLT5ub2lzZSArPSAyNTYgLSAxNDM7CisJaXEtPnVwZGF0ZWQgPSBwQWRhcHRlci0+aXdfc3RhdHMucXVhbC51cGRhdGVkOwogfQogCiBpbnQgcnRfaW9jdGxfaXdhcGxpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQogewotIAlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKIAogCXN0cnVjdCBzb2NrYWRkciBhZGRyW0lXX01BWF9BUF07CiAJc3RydWN0IGl3X3F1YWxpdHkgcXVhbFtJV19NQVhfQVBdOwogCWludCBpOwogCi0gICAJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLSAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgewotICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CisKKwkvKmNoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwogCQlkYXRhLT5sZW5ndGggPSAwOwogCQlyZXR1cm4gMDsKLSAgICAgICAgLy9yZXR1cm4gLUVORVRET1dOOworCQkvKnJldHVybiAtRU5FVERPV047ICovCiAJfQogCi0JZm9yIChpID0gMDsgaSA8SVdfTUFYX0FQIDsgaSsrKQotCXsKLQkJaWYgKGkgPj0gIHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yKQorCWZvciAoaSA9IDA7IGkgPCBJV19NQVhfQVA7IGkrKykgeworCQlpZiAoaSA+PSBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcikKIAkJCWJyZWFrOwogCQlhZGRyW2ldLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQkJCW1lbWNweShhZGRyW2ldLnNhX2RhdGEsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKLQkJc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZxdWFsW2ldLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKKwkJbWVtY3B5KGFkZHJbaV0uc2FfZGF0YSwgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLAorCQkgICAgICAgTUFDX0FERFJfTEVOKTsKKwkJc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZxdWFsW2ldLAorCQkJICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2kpOwogCX0KIAlkYXRhLT5sZW5ndGggPSBpOwotCW1lbWNweShleHRyYSwgJmFkZHIsIGkqc2l6ZW9mKGFkZHJbMF0pKTsKLQlkYXRhLT5mbGFncyA9IDE7CQkvKiBzaWduYWwgcXVhbGl0eSBwcmVzZW50IChzb3J0IG9mKSAqLwotCW1lbWNweShleHRyYSArIGkqc2l6ZW9mKGFkZHJbMF0pLCAmcXVhbCwgaSpzaXplb2YocXVhbFtpXSkpOworCW1lbWNweShleHRyYSwgJmFkZHIsIGkgKiBzaXplb2YoYWRkclswXSkpOworCWRhdGEtPmZsYWdzID0gMTsJLyogc2lnbmFsIHF1YWxpdHkgcHJlc2VudCAoc29ydCBvZikgKi8KKwltZW1jcHkoZXh0cmEgKyBpICogc2l6ZW9mKGFkZHJbMF0pLCAmcXVhbCwgaSAqIHNpemVvZihxdWFsW2ldKSk7CiAKIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX3Npd3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQorCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKIAotCVVMT05HCQkJCQkJCQlOb3c7CisJdW5zaWduZWQgbG9uZyBOb3c7CiAJaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAKLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CisKKwkvKmNoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwogCQlyZXR1cm4gLUVORVRET1dOOwogCX0KIAotCWlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgaW4gTW9uaXRvciBNb2RlIG5vdyAhISFcbiIpKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotI2lmZGVmIFJUMjg2MAotCWlmICgocEFkYXB0ZXItPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAoSURMRV9PTihwQWRhcHRlcikpCi0JCSYmIChwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQotCQkmJiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkKLQl7Ci0JCVJUMjh4eFBjaUFzaWNSYWRpb09uKHBBZGFwdGVyLCBHVUlfSURMRV9QT1dFUl9TQVZFKTsKKwlpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJEcml2ZXIgaXMgaW4gTW9uaXRvciBNb2RlIG5vdyFcbiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCS8vIENoZWNrIGlmIHN0aWxsIHJhZGlvIG9mZi4KLQllbHNlIGlmIChwQWRhcHRlci0+YlBDSWNsa09mZiA9PSBUUlVFKQotCQlyZXR1cm4gMDsKLSNlbmRpZgotCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCi0JeworCisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkgewogCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQrKzsKIAl9CiAKLSAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7CiAJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKLQkJcmV0dXJuIDA7Ci0JZG97CisJCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworCWRvIHsKIAkJTm93ID0gamlmZmllczsKIAotCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkgJiYKLQkJCShwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQgPiAzKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIFdwYVN1cHBsaWNhbnRTY2FuQ291bnQgPiAzXG4iKSk7CisJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCQkgICAgJiYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCA+IDMpKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJXcGFTdXBwbGljYW50U2NhbkNvdW50ID4gM1xuIikpOwogCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgJiYKLQkJCSgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8Ci0JCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKSAmJgotCQkJKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIFBvcnQgTm90IFNlY3VyZWQhIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKKwkJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcKKwkJICAgICAocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJICAgICYmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQl8fCAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisJCSAgICAmJiAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PQorCQkJV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTGluayBVUCwgUG9ydCBOb3QgU2VjdXJlZCEgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOwogCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCi0JCXsKLQkJCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgeworCQkJUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUhXG4iKSk7CiAJCX0KLQotCQkvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKLQkJLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKwkJLyogdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nICovCisJCS8qIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuICovCiAJCXBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7Ci0JCS8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCisJCS8qIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzICovCiAJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7CiAJCXBBZGFwdGVyLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OwogCiAJCU1sbWVFbnF1ZXVlKHBBZGFwdGVyLAotCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCi0JCQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKLQkJCTAsCi0JCQlOVUxMKTsKKwkJCSAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCSAgICBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwgMCwgTlVMTCk7CiAKIAkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQkJUlQyOFhYX01MTUVfSEFORExFUihwQWRhcHRlcik7Ci0JfXdoaWxlKDApOwotCXJldHVybiAwOworCQlSVE1QX01MTUVfSEFORExFUihwQWRhcHRlcik7CisJfSB3aGlsZSAoMCk7CisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiB9CiAKIGludCBydF9pb2N0bF9naXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCiB7Ci0KLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OwotCWludCBpPTA7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOworCWludCBpID0gMDsKIAljaGFyICpjdXJyZW50X2V2ID0gZXh0cmEsICpwcmV2aW91c19ldiA9IGV4dHJhOwogCWNoYXIgKmVuZF9idWY7Ci0JY2hhciAqY3VycmVudF92YWwsIGN1c3RvbVtNQVhfQ1VTVE9NX0xFTl0gPSB7MH07CisJY2hhciAqY3VycmVudF92YWw7CisJY2hhciBjdXN0b21bTUFYX0NVU1RPTV9MRU5dID0geyAwIH07CiAJc3RydWN0IGl3X2V2ZW50IGl3ZTsKIAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0gICAgeworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOworCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgewogCQkvKgogCQkgKiBTdGlsbCBzY2FubmluZywgaW5kaWNhdGUgdGhlIGNhbGxlciBzaG91bGQgdHJ5IGFnYWluLgogCQkgKi8KIAkJcmV0dXJuIC1FQUdBSU47CiAJfQogCi0JaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKLQl7CisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkgewogCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQgPSAwOwogCX0KIAotCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NOciA9PSAwKQotCXsKKwlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIgPT0gMCkgewogCQlkYXRhLT5sZW5ndGggPSAwOwogCQlyZXR1cm4gMDsKIAl9CiAKLSAgICBpZiAoZGF0YS0+bGVuZ3RoID4gMCkKLSAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgZGF0YS0+bGVuZ3RoOwotICAgIGVsc2UKLSAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKKwlpZiAoZGF0YS0+bGVuZ3RoID4gMCkKKwkJZW5kX2J1ZiA9IGV4dHJhICsgZGF0YS0+bGVuZ3RoOworCWVsc2UKKwkJZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKIAotCWZvciAoaSA9IDA7IGkgPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsgaSsrKQotCXsKLQkJaWYgKGN1cnJlbnRfZXYgPj0gZW5kX2J1ZikKKwlmb3IgKGkgPSAwOyBpIDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7IGkrKykgeworCQlpZiAoY3VycmVudF9ldiA+PSBlbmRfYnVmKSB7CiAJCQlyZXR1cm4gLUUyQklHOwotCi0JCS8vTUFDIGFkZHJlc3MKLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQl9CisJCS8qTUFDIGFkZHJlc3MgKi8KKwkJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwogCQlpd2UuY21kID0gU0lPQ0dJV0FQOwogCQlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQkJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBFVEhfQUxFTik7CisJCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsCisJCSAgICAgICAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIEVUSF9BTEVOKTsKIAotICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7Ci0JCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKLSAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCi0JCXJldHVybiAtRTJCSUc7CisJCXByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9CisJCSAgICBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLAorCQkJCQkgSVdfRVZfQUREUl9MRU4pOworCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKwkJCXJldHVybiAtRTJCSUc7CiAKIAkJLyoKLQkJUHJvdG9jb2w6Ci0JCQlpdCB3aWxsIHNob3cgc2Nhbm5lZCBBUCdzIFdpcmVsZXNzTW9kZSAuCi0JCQlpdCBtaWdodCBiZQotCQkJCQk4MDIuMTFhCi0JCQkJCTgwMi4xMWEvbgotCQkJCQk4MDIuMTFnL24KLQkJCQkJODAyLjExYi9nL24KLQkJCQkJODAyLjExZwotCQkJCQk4MDIuMTFiL2cKLQkJKi8KKwkJICAgUHJvdG9jb2w6CisJCSAgIGl0IHdpbGwgc2hvdyBzY2FubmVkIEFQJ3MgV2lyZWxlc3NNb2RlIC4KKwkJICAgaXQgbWlnaHQgYmUKKwkJICAgODAyLjExYQorCQkgICA4MDIuMTFhL24KKwkJICAgODAyLjExZy9uCisJCSAgIDgwMi4xMWIvZy9uCisJCSAgIDgwMi4xMWcKKwkJICAgODAyLjExYi9nCisJCSAqLwogCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwogCQlpd2UuY21kID0gU0lPQ0dJV05BTUU7CiAKLQotCXsKLQkJUEJTU19FTlRSWSBwQnNzRW50cnk9JnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldOwotCQlCT09MRUFOIGlzR29ubHk9RkFMU0U7Ci0JCWludCByYXRlQ250PTA7Ci0KLQkJaWYgKHBCc3NFbnRyeS0+Q2hhbm5lbD4xNCkKIAkJewotCQkJaWYgKHBCc3NFbnRyeS0+SHRDYXBhYmlsaXR5TGVuIT0wKQotCQkJCXN0cmNweShpd2UudS5uYW1lLCI4MDIuMTFhL24iKTsKLQkJCWVsc2UKLQkJCQlzdHJjcHkoaXdlLnUubmFtZSwiODAyLjExYSIpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLyoKLQkJCQlpZiBvbmUgb2Ygbm9uIEIgbW9kZSByYXRlIGlzIHNldCBzdXBwb3J0ZWQgcmF0ZSAuIGl0IG1lYW4gRyBvbmx5LgotCQkJKi8KLQkJCWZvciAocmF0ZUNudD0wO3JhdGVDbnQ8cEJzc0VudHJ5LT5TdXBSYXRlTGVuO3JhdGVDbnQrKykKLQkJCXsKKwkJCXN0cnVjdCBydF9ic3NfZW50cnkgKnBCc3NFbnRyeSA9ICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXTsKKwkJCUJPT0xFQU4gaXNHb25seSA9IEZBTFNFOworCQkJaW50IHJhdGVDbnQgPSAwOworCisJCQlpZiAocEJzc0VudHJ5LT5DaGFubmVsID4gMTQpIHsKKwkJCQlpZiAocEJzc0VudHJ5LT5IdENhcGFiaWxpdHlMZW4gIT0gMCkKKwkJCQkJc3RyY3B5KGl3ZS51Lm5hbWUsICI4MDIuMTFhL24iKTsKKwkJCQllbHNlCisJCQkJCXN0cmNweShpd2UudS5uYW1lLCAiODAyLjExYSIpOworCQkJfSBlbHNlIHsKIAkJCQkvKgotCQkJCQk2TWJwcygxNDApIDlNYnBzKDE0NikgYW5kID49MTJNYnBzKDE1MikgYXJlIHN1cHBvcnRlZCByYXRlICwgaXQgbWVhbiBHIG9ubHkuCi0JCQkJKi8KLQkJCQlpZiAocEJzc0VudHJ5LT5TdXBSYXRlW3JhdGVDbnRdPT0xNDAgfHwgcEJzc0VudHJ5LT5TdXBSYXRlW3JhdGVDbnRdPT0xNDYgfHwgcEJzc0VudHJ5LT5TdXBSYXRlW3JhdGVDbnRdPj0xNTIpCi0JCQkJCWlzR29ubHk9VFJVRTsKLQkJCX0KKwkJCQkgICBpZiBvbmUgb2Ygbm9uIEIgbW9kZSByYXRlIGlzIHNldCBzdXBwb3J0ZWQgcmF0ZSAuIGl0IG1lYW4gRyBvbmx5LgorCQkJCSAqLworCQkJCWZvciAocmF0ZUNudCA9IDA7CisJCQkJICAgICByYXRlQ250IDwgcEJzc0VudHJ5LT5TdXBSYXRlTGVuOworCQkJCSAgICAgcmF0ZUNudCsrKSB7CisJCQkJCS8qCisJCQkJCSAgIDZNYnBzKDE0MCkgOU1icHMoMTQ2KSBhbmQgPj0xMk1icHMoMTUyKSBhcmUgc3VwcG9ydGVkIHJhdGUgLCBpdCBtZWFuIEcgb25seS4KKwkJCQkJICovCisJCQkJCWlmIChwQnNzRW50cnktPlN1cFJhdGVbcmF0ZUNudF0gPT0gMTQwCisJCQkJCSAgICB8fCBwQnNzRW50cnktPlN1cFJhdGVbcmF0ZUNudF0gPT0KKwkJCQkJICAgIDE0NgorCQkJCQkgICAgfHwgcEJzc0VudHJ5LT5TdXBSYXRlW3JhdGVDbnRdID49CisJCQkJCSAgICAxNTIpCisJCQkJCQlpc0dvbmx5ID0gVFJVRTsKKwkJCQl9CiAKLQkJCWZvciAocmF0ZUNudD0wO3JhdGVDbnQ8cEJzc0VudHJ5LT5FeHRSYXRlTGVuO3JhdGVDbnQrKykKLQkJCXsKLQkJCQlpZiAocEJzc0VudHJ5LT5FeHRSYXRlW3JhdGVDbnRdPT0xNDAgfHwgcEJzc0VudHJ5LT5FeHRSYXRlW3JhdGVDbnRdPT0xNDYgfHwgcEJzc0VudHJ5LT5FeHRSYXRlW3JhdGVDbnRdPj0xNTIpCi0JCQkJCWlzR29ubHk9VFJVRTsKLQkJCX0KKwkJCQlmb3IgKHJhdGVDbnQgPSAwOworCQkJCSAgICAgcmF0ZUNudCA8IHBCc3NFbnRyeS0+RXh0UmF0ZUxlbjsKKwkJCQkgICAgIHJhdGVDbnQrKykgeworCQkJCQlpZiAocEJzc0VudHJ5LT5FeHRSYXRlW3JhdGVDbnRdID09IDE0MAorCQkJCQkgICAgfHwgcEJzc0VudHJ5LT5FeHRSYXRlW3JhdGVDbnRdID09CisJCQkJCSAgICAxNDYKKwkJCQkJICAgIHx8IHBCc3NFbnRyeS0+RXh0UmF0ZVtyYXRlQ250XSA+PQorCQkJCQkgICAgMTUyKQorCQkJCQkJaXNHb25seSA9IFRSVUU7CisJCQkJfQogCi0KLQkJCWlmIChwQnNzRW50cnktPkh0Q2FwYWJpbGl0eUxlbiE9MCkKLQkJCXsKLQkJCQlpZiAoaXNHb25seT09VFJVRSkKLQkJCQkJc3RyY3B5KGl3ZS51Lm5hbWUsIjgwMi4xMWcvbiIpOwotCQkJCWVsc2UKLQkJCQkJc3RyY3B5KGl3ZS51Lm5hbWUsIjgwMi4xMWIvZy9uIik7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKGlzR29ubHk9PVRSVUUpCi0JCQkJCXN0cmNweShpd2UudS5uYW1lLCI4MDIuMTFnIik7Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJaWYgKHBCc3NFbnRyeS0+U3VwUmF0ZUxlbj09NCAmJiBwQnNzRW50cnktPkV4dFJhdGVMZW49PTApCi0JCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwiODAyLjExYiIpOworCQkJCWlmIChwQnNzRW50cnktPkh0Q2FwYWJpbGl0eUxlbiAhPSAwKSB7CisJCQkJCWlmIChpc0dvbmx5ID09IFRSVUUpCisJCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwgIjgwMi4xMWcvbiIpOwogCQkJCQllbHNlCi0JCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwiODAyLjExYi9nIik7CisJCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwKKwkJCQkJCSAgICAgICAiODAyLjExYi9nL24iKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoaXNHb25seSA9PSBUUlVFKQorCQkJCQkJc3RyY3B5KGl3ZS51Lm5hbWUsICI4MDIuMTFnIik7CisJCQkJCWVsc2UgeworCQkJCQkJaWYgKHBCc3NFbnRyeS0+U3VwUmF0ZUxlbiA9PSA0CisJCQkJCQkgICAgJiYgcEJzc0VudHJ5LT5FeHRSYXRlTGVuID09CisJCQkJCQkgICAgMCkKKwkJCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwKKwkJCQkJCQkgICAgICAgIjgwMi4xMWIiKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwKKwkJCQkJCQkgICAgICAgIjgwMi4xMWIvZyIpOworCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9Ci0JfQogCiAJCXByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKLQkJY3VycmVudF9ldgkgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9BRERSX0xFTik7Ci0gICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotCQlyZXR1cm4gLUUyQklHOworCQljdXJyZW50X2V2ID0KKwkJICAgIGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsCisJCQkJCSBJV19FVl9BRERSX0xFTik7CisJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorCQkJcmV0dXJuIC1FMkJJRzsKIAotCQkvL0VTU0lECi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLypFU1NJRCAqLworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CiAJCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CiAJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKIAkJaXdlLnUuZGF0YS5mbGFncyA9IDE7CiAKLSAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OwotCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkKTsKLSAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCi0JCXJldHVybiAtRTJCSUc7CisJCXByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9CisJCSAgICBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLAorCQkJCQkgKGNoYXIgKilwQWRhcHRlci0+U2NhblRhYi4KKwkJCQkJIEJzc0VudHJ5W2ldLlNzaWQpOworCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKwkJCXJldHVybiAtRTJCSUc7CiAKLQkJLy9OZXR3b3JrIFR5cGUKLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvKk5ldHdvcmsgVHlwZSAqLworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CiAJCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKLQkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gTmRpczgwMl8xMUlCU1MpCi0JCXsKKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gTmRpczgwMl8xMUlCU1MpIHsKIAkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FESE9DOwotCQl9Ci0JCWVsc2UgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlKQotCQl7CisJCX0gZWxzZSBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PQorCQkJICAgTmRpczgwMl8xMUluZnJhc3RydWN0dXJlKSB7CiAJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9JTkZSQTsKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FVVE87CiAJCX0KIAkJaXdlLmxlbiA9IElXX0VWX1VJTlRfTEVOOwogCi0gICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKLQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBJV19FVl9VSU5UX0xFTik7Ci0gICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotCQlyZXR1cm4gLUUyQklHOworCQlwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPQorCQkgICAgaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKKwkJCQkJIElXX0VWX1VJTlRfTEVOKTsKKwkJaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisJCQlyZXR1cm4gLUUyQklHOwogCi0JCS8vQ2hhbm5lbCBhbmQgRnJlcXVlbmN5Ci0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLypDaGFubmVsIGFuZCBGcmVxdWVuY3kgKi8KKwkJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwogCQlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CiAJCWlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQpAQCAtMTA5NCwxNzIgKzk4MywyMTcgQEAKIAkJaXdlLnUuZnJlcS5pID0gMDsKIAogCQlwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7Ci0JCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7Ci0gICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotCQlyZXR1cm4gLUUyQklHOworCQljdXJyZW50X2V2ID0KKwkJICAgIGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsCisJCQkJCSBJV19FVl9GUkVRX0xFTik7CisJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorCQkJcmV0dXJuIC1FMkJJRzsKIAotICAgICAgICAvL0FkZCBxdWFsaXR5IHN0YXRpc3RpY3MKLSAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICBtZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwotICAgIAlpd2UuY21kID0gSVdFVlFVQUw7Ci0gICAgCWl3ZS51LnF1YWwubGV2ZWwgPSAwOwotICAgIAlpd2UudS5xdWFsLm5vaXNlID0gMDsKLSAgICAgICAgc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZpd2UudS5xdWFsLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKLSAgICAJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX1FVQUxfTEVOKTsKLSAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCi0JCXJldHVybiAtRTJCSUc7CisJCS8qQWRkIHF1YWxpdHkgc3RhdGlzdGljcyAqLworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBJV0VWUVVBTDsKKwkJaXdlLnUucXVhbC5sZXZlbCA9IDA7CisJCWl3ZS51LnF1YWwubm9pc2UgPSAwOworCQlzZXRfcXVhbGl0eShwQWRhcHRlciwgJml3ZS51LnF1YWwsCisJCQkgICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSk7CisJCWN1cnJlbnRfZXYgPQorCQkgICAgaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKKwkJCQkJIElXX0VWX1FVQUxfTEVOKTsKKwkJaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisJCQlyZXR1cm4gLUUyQklHOwogCi0JCS8vRW5jeXB0aW9uIGtleQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8qRW5jeXB0aW9uIGtleSAqLworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CiAJCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOwotCQlpZiAoQ0FQX0lTX1BSSVZBQ1lfT04gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNhcGFiaWxpdHlJbmZvICkpCi0JCQlpd2UudS5kYXRhLmZsYWdzID1JV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKwkJaWYgKENBUF9JU19QUklWQUNZX09OCisJCSAgICAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2FwYWJpbGl0eUluZm8pKQorCQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOwogCQllbHNlCiAJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOwogCi0gICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKLSAgICAgICAgY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsJml3ZSwgKGNoYXIgKilwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWyhpd2UudS5kYXRhLmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKS0xXS5LZXkpOwotICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKLQkJcmV0dXJuIC1FMkJJRzsKKwkJcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0KKwkJICAgIGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsCisJCQkJCSAoY2hhciAqKXBBZGFwdGVyLT4KKwkJCQkJIFNoYXJlZEtleVtCU1MwXVsoaXdlLnUuZGF0YS4KKwkJCQkJCQkgIGZsYWdzICYKKwkJCQkJCQkgIElXX0VOQ09ERV9JTkRFWCkgLQorCQkJCQkJCSAxXS5LZXkpOworCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKwkJCXJldHVybiAtRTJCSUc7CiAKLQkJLy9CaXQgUmF0ZQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBVQ0hBUiB0bXBSYXRlID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZVtwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuLTFdOworCQkvKkJpdCBSYXRlICovCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4pIHsKKwkJCXU4IHRtcFJhdGUgPQorCQkJICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVbcEFkYXB0ZXItPgorCQkJCQkJCQkgIFNjYW5UYWIuCisJCQkJCQkJCSAgQnNzRW50cnlbaV0uCisJCQkJCQkJCSAgU3VwUmF0ZUxlbiAtCisJCQkJCQkJCSAgMV07CiAJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwogCQkJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOwotICAgIAkJY3VycmVudF92YWwgPSBjdXJyZW50X2V2ICsgSVdfRVZfTENQX0xFTjsKLSAgICAgICAgICAgIGlmICh0bXBSYXRlID09IDB4ODIpCi0gICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAxICogMTAwMDAwMDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4NCkKLSAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDIgKiAxMDAwMDAwOwotICAgICAgICAgICAgZWxzZSBpZiAodG1wUmF0ZSA9PSAweDhCKQotICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgNS41ICogMTAwMDAwMDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg5NikKLSAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDExICogMTAwMDAwMDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAJCSAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gICh0bXBSYXRlLzIpICogMTAwMDAwMDsKKwkJCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47CisJCQlpZiAodG1wUmF0ZSA9PSAweDgyKQorCQkJCWl3ZS51LmJpdHJhdGUudmFsdWUgPSAxICogMTAwMDAwMDsKKwkJCWVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4NCkKKwkJCQlpd2UudS5iaXRyYXRlLnZhbHVlID0gMiAqIDEwMDAwMDA7CisJCQllbHNlIGlmICh0bXBSYXRlID09IDB4OEIpCisJCQkJaXdlLnUuYml0cmF0ZS52YWx1ZSA9IDUuNSAqIDEwMDAwMDA7CisJCQllbHNlIGlmICh0bXBSYXRlID09IDB4OTYpCisJCQkJaXdlLnUuYml0cmF0ZS52YWx1ZSA9IDExICogMTAwMDAwMDsKKwkJCWVsc2UKKwkJCQlpd2UudS5iaXRyYXRlLnZhbHVlID0gKHRtcFJhdGUgLyAyKSAqIDEwMDAwMDA7CisKKwkJCWlmICh0bXBSYXRlID09IDB4NmMKKwkJCSAgICAmJiBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5IdENhcGFiaWxpdHlMZW4gPgorCQkJICAgIDApIHsKKwkJCQlpbnQgcmF0ZV9jb3VudCA9CisJCQkJICAgIHNpemVvZihyYWxpbmtyYXRlKSAvIHNpemVvZihfX3MzMik7CisJCQkJc3RydWN0IHJ0X2h0X2NhcF9pbmZvIGNhcEluZm8gPQorCQkJCSAgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5IdENhcGFiaWxpdHkuCisJCQkJICAgIEh0Q2FwSW5mbzsKKwkJCQlpbnQgc2hvcnRHSSA9CisJCQkJICAgIGNhcEluZm8uQ2hhbm5lbFdpZHRoID8gY2FwSW5mby4KKwkJCQkgICAgU2hvcnRHSWZvcjQwIDogY2FwSW5mby5TaG9ydEdJZm9yMjA7CisJCQkJaW50IG1heE1DUyA9CisJCQkJICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkh0Q2FwYWJpbGl0eS4KKwkJCQkgICAgTUNTU2V0WzFdID8gMTUgOiA3OworCQkJCWludCByYXRlX2luZGV4ID0KKwkJCQkgICAgMTIgKyAoKHU4KWNhcEluZm8uQ2hhbm5lbFdpZHRoICogMjQpICsKKwkJCQkgICAgKCh1OClzaG9ydEdJICogNDgpICsgKCh1OCltYXhNQ1MpOworCQkJCWlmIChyYXRlX2luZGV4IDwgMCkKKwkJCQkJcmF0ZV9pbmRleCA9IDA7CisJCQkJaWYgKHJhdGVfaW5kZXggPiByYXRlX2NvdW50KQorCQkJCQlyYXRlX2luZGV4ID0gcmF0ZV9jb3VudDsKKwkJCQlpd2UudS5iaXRyYXRlLnZhbHVlID0KKwkJCQkgICAgcmFsaW5rcmF0ZVtyYXRlX2luZGV4XSAqIDUwMDAwMDsKKwkJCX0KIAogCQkJaXdlLnUuYml0cmF0ZS5kaXNhYmxlZCA9IDA7CiAJCQljdXJyZW50X3ZhbCA9IGl3ZV9zdHJlYW1fYWRkX3ZhbHVlKGluZm8sIGN1cnJlbnRfZXYsCi0JCQkJY3VycmVudF92YWwsIGVuZF9idWYsICZpd2UsCi0gICAgCQkJSVdfRVZfUEFSQU1fTEVOKTsKKwkJCQkJCQkgICBjdXJyZW50X3ZhbCwgZW5kX2J1ZiwKKwkJCQkJCQkgICAmaXdlLAorCQkJCQkJCSAgIElXX0VWX1BBUkFNX0xFTik7CiAKLSAgICAgICAgCWlmKChjdXJyZW50X3ZhbC1jdXJyZW50X2V2KT5JV19FVl9MQ1BfTEVOKQotICAgICAgICAgICAgCWN1cnJlbnRfZXYgPSBjdXJyZW50X3ZhbDsKLSAgICAgICAgCWVsc2UKLQkJCXJldHVybiAtRTJCSUc7Ci0gICAgICAgIH0KLQotCQkvL1dQQSBJRQotCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4gPiAwKQotCQl7CisJCQlpZiAoKGN1cnJlbnRfdmFsIC0gY3VycmVudF9ldikgPiBJV19FVl9MQ1BfTEVOKQorCQkJCWN1cnJlbnRfZXYgPSBjdXJyZW50X3ZhbDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUUyQklHOworCQl9CisJCS8qV1BBIElFICovCisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiA+IDApIHsKIAkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CiAJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOwotCQkJbWVtY3B5KGN1c3RvbSwgJihwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRVswXSksCi0JCQkJCQkgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbik7CisJCQltZW1jcHkoY3VzdG9tLAorCQkJICAgICAgICYocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVbMF0pLAorCQkJICAgICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuKTsKIAkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7Ci0JCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuOwotCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGN1c3RvbSk7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9CisJCQkgICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW47CisJCQljdXJyZW50X2V2ID0KKwkJCSAgICBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLAorCQkJCQkJICZpd2UsIGN1c3RvbSk7CiAJCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKIAkJCQlyZXR1cm4gLUUyQklHOwogCQl9Ci0KLQkJLy9XUEEyIElFCi0gICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiA+IDApCi0gICAgICAgIHsKLSAgICAgICAgCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCS8qV1BBMiBJRSAqLworCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gPiAwKSB7CisJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwogCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKLQkJCW1lbWNweShjdXN0b20sICYocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVbMF0pLAotCQkJCQkJICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4pOworCQkJbWVtY3B5KGN1c3RvbSwKKwkJCSAgICAgICAmKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFWzBdKSwKKwkJCSAgICAgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbik7CiAJCQlpd2UuY21kID0gSVdFVkdFTklFOwotCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbjsKLQkJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBjdXN0b20pOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPQorCQkJICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuOworCQkJY3VycmVudF9ldiA9CisJCQkgICAgaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwKKwkJCQkJCSAmaXdlLCBjdXN0b20pOwogCQkJaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCiAJCQkJcmV0dXJuIC1FMkJJRzsKLSAgICAgICAgfQorCQl9CiAJfQogCiAJZGF0YS0+bGVuZ3RoID0gY3VycmVudF9ldiAtIGV4dHJhOwotICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOwotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SICwoIj09PT5ydF9pb2N0bF9naXdzY2FuLiAlZCglZCkgQlNTIHJldHVybmVkLCBkYXRhLT5sZW5ndGggPSAlZFxuIixpICwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIsIGRhdGEtPmxlbmd0aCkpOworCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkgKCI9PT0+cnRfaW9jdGxfZ2l3c2Nhbi4gJWQoJWQpIEJTUyByZXR1cm5lZCwgZGF0YS0+bGVuZ3RoID0gJWRcbiIsCisJCSAgaSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIsIGRhdGEtPmxlbmd0aCkpOwogCXJldHVybiAwOwogfQogCiBpbnQgcnRfaW9jdGxfc2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CiAKLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICB7Ci0gICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKLSAgICB9CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CiAKLQlpZiAoZGF0YS0+ZmxhZ3MpCi0JewotCQlQQ0hBUglwU3NpZFN0cmluZyA9IE5VTEw7CisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CiAKLQkJLy8gSW5jbHVkZXMgbnVsbCBjaGFyYWN0ZXIuCisJaWYgKGRhdGEtPmZsYWdzKSB7CisJCWNoYXIgKnBTc2lkU3RyaW5nID0gTlVMTDsKKworCQkvKiBJbmNsdWRlcyBudWxsIGNoYXJhY3Rlci4gKi8KIAkJaWYgKGRhdGEtPmxlbmd0aCA+IChJV19FU1NJRF9NQVhfU0laRSArIDEpKQogCQkJcmV0dXJuIC1FMkJJRzsKIAotCQlwU3NpZFN0cmluZyA9IChDSEFSICopIGttYWxsb2MoTUFYX0xFTl9PRl9TU0lEKzEsIE1FTV9BTExPQ19GTEFHKTsKLQkJaWYgKHBTc2lkU3RyaW5nKQotCQl7Ci0JCQlOZGlzWmVyb01lbW9yeShwU3NpZFN0cmluZywgTUFYX0xFTl9PRl9TU0lEKzEpOworCQlwU3NpZFN0cmluZyA9IGttYWxsb2MoTUFYX0xFTl9PRl9TU0lEICsgMSwgTUVNX0FMTE9DX0ZMQUcpOworCQlpZiAocFNzaWRTdHJpbmcpIHsKKwkJCU5kaXNaZXJvTWVtb3J5KHBTc2lkU3RyaW5nLCBNQVhfTEVOX09GX1NTSUQgKyAxKTsKIAkJCU5kaXNNb3ZlTWVtb3J5KHBTc2lkU3RyaW5nLCBlc3NpZCwgZGF0YS0+bGVuZ3RoKTsKIAkJCWlmIChTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCBwU3NpZFN0cmluZykgPT0gRkFMU0UpCiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJZWxzZQorCQl9IGVsc2UKIAkJCXJldHVybiAtRU5PTUVNOwotCX0KLQllbHNlCi0JewotCQkvLyBBTlkgc3NpZAorCX0gZWxzZSB7CisJCS8qIEFOWSBzc2lkICovCiAJCWlmIChTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCAiIikgPT0gRkFMU0UpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLSAgICB9CisJfQogCXJldHVybiAwOwogfQogCiBpbnQgcnRfaW9jdGxfZ2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CisKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKIAogCWRhdGEtPmZsYWdzID0gMTsKLSAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCi0gICAgewotICAgICAgICBkYXRhLT5sZW5ndGggID0gMDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorCWlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkgeworCQlkYXRhLT5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKwl9CiAKLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJNZWRpYVN0YXRlIGlzIGNvbm5lY3RlZFxuIikpOworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNZWRpYVN0YXRlIGlzIGNvbm5lY3RlZFxuIikpOwogCQlkYXRhLT5sZW5ndGggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW47Ci0JCW1lbWNweShlc3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW4pOworCQltZW1jcHkoZXNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwKKwkJICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbik7CiAJfQotI2lmZGVmIFJUMjg3MAotICAgIC8vIEFkZCBmb3IgUlQyODcwCi0gICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKLSAgICB7Ci0gICAgICAgIGRhdGEtPmxlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKLQkJbWVtY3B5KGVzc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbik7CisjaWZkZWYgUlRNUF9NQUNfVVNCCisJLyogQWRkIGZvciBSVDI4NzAgKi8KKwllbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKSB7CisJCWRhdGEtPmxlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKKwkJbWVtY3B5KGVzc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsCisJCSAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW4pOwogCX0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQllbHNlCi0Jey8vdGhlIEFOWSBzc2lkIHdhcyBzcGVjaWZpZWQKLQkJZGF0YS0+bGVuZ3RoICA9IDA7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIk1lZGlhU3RhdGUgaXMgbm90IGNvbm5lY3RlZCwgZXNzXG4iKSk7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisJZWxzZSB7CQkJLyp0aGUgQU5ZIHNzaWQgd2FzIHNwZWNpZmllZCAqLworCQlkYXRhLT5sZW5ndGggPSAwOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIk1lZGlhU3RhdGUgaXMgbm90IGNvbm5lY3RlZCwgZXNzXG4iKSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xMjY3LDE3ICsxMjAxLDE4IEBACiB9CiAKIGludCBydF9pb2N0bF9zaXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKIAotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0gICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgICAgICByZXR1cm4gLUVORVRET1dOOwotICAgIH0KKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKKworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CisJfQogCiAJaWYgKGRhdGEtPmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEyODUsNDUgKzEyMjAsNDcgQEAKIAltZW1zZXQocEFkYXB0ZXItPm5pY2tuYW1lLCAwLCBJV19FU1NJRF9NQVhfU0laRSArIDEpOwogCW1lbWNweShwQWRhcHRlci0+bmlja25hbWUsIG5pY2tuYW1lLCBkYXRhLT5sZW5ndGgpOwogCi0KIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX2dpd25pY2tuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQogewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOwogCi0JaWYgKGRhdGEtPmxlbmd0aCA+IHN0cmxlbihwQWRhcHRlci0+bmlja25hbWUpICsgMSkKLQkJZGF0YS0+bGVuZ3RoID0gc3RybGVuKHBBZGFwdGVyLT5uaWNrbmFtZSkgKyAxOworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOworCisJaWYgKGRhdGEtPmxlbmd0aCA+IHN0cmxlbigoY2hhciAqKXBBZGFwdGVyLT5uaWNrbmFtZSkgKyAxKQorCQlkYXRhLT5sZW5ndGggPSBzdHJsZW4oKGNoYXIgKilwQWRhcHRlci0+bmlja25hbWUpICsgMTsKIAlpZiAoZGF0YS0+bGVuZ3RoID4gMCkgewotCQltZW1jcHkobmlja25hbWUsIHBBZGFwdGVyLT5uaWNrbmFtZSwgZGF0YS0+bGVuZ3RoLTEpOwotCQluaWNrbmFtZVtkYXRhLT5sZW5ndGgtMV0gPSAnXDAnOworCQltZW1jcHkobmlja25hbWUsIHBBZGFwdGVyLT5uaWNrbmFtZSwgZGF0YS0+bGVuZ3RoIC0gMSk7CisJCW5pY2tuYW1lW2RhdGEtPmxlbmd0aCAtIDFdID0gJ1wwJzsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKIGludCBydF9pb2N0bF9zaXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCisJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOwogCXUxNiB2YWw7CiAKLSAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKLSAgICB9CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CisKKwkvKmNoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlyZXR1cm4gLUVORVRET1dOOworCX0KIAogCWlmIChydHMtPmRpc2FibGVkKQogCQl2YWwgPSBNQVhfUlRTX1RIUkVTSE9MRDsKIAllbHNlIGlmIChydHMtPnZhbHVlIDwgMCB8fCBydHMtPnZhbHVlID4gTUFYX1JUU19USFJFU0hPTEQpCiAJCXJldHVybiAtRUlOVkFMOwogCWVsc2UgaWYgKHJ0cy0+dmFsdWUgPT0gMCkKLQkgICAgdmFsID0gTUFYX1JUU19USFJFU0hPTEQ7CisJCXZhbCA9IE1BWF9SVFNfVEhSRVNIT0xEOwogCWVsc2UKIAkJdmFsID0gcnRzLT52YWx1ZTsKIApAQCAtMTMzNCwxNyArMTI3MSwxOCBAQAogfQogCiBpbnQgcnRfaW9jdGxfZ2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQorCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKIAotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0gICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICAJewotICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0gICAgICAgIAlyZXR1cm4gLUVORVRET1dOOwotICAgIAl9CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CisKKwkvKmNoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlyZXR1cm4gLUVORVRET1dOOworCX0KIAogCXJ0cy0+dmFsdWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZDsKIAlydHMtPmRpc2FibGVkID0gKHJ0cy0+dmFsdWUgPT0gTUFYX1JUU19USFJFU0hPTEQpOwpAQCAtMTM1NCwyNSArMTI5MiwyNyBAQAogfQogCiBpbnQgcnRfaW9jdGxfc2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCXN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCisJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOwogCXUxNiB2YWw7CiAKLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgCXsKLSAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKLSAgICAJfQorCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOworCisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CiAKIAlpZiAoZnJhZy0+ZGlzYWJsZWQpCiAJCXZhbCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKLQllbHNlIGlmIChmcmFnLT52YWx1ZSA+PSBNSU5fRlJBR19USFJFU0hPTEQgJiYgZnJhZy0+dmFsdWUgPD0gTUFYX0ZSQUdfVEhSRVNIT0xEKQotCQl2YWwgPSBfX2NwdV90b19sZTE2KGZyYWctPnZhbHVlICYgfjB4MSk7IC8qIGV2ZW4gbnVtYmVycyBvbmx5ICovCisJZWxzZSBpZiAoZnJhZy0+dmFsdWUgPj0gTUlOX0ZSQUdfVEhSRVNIT0xECisJCSAmJiBmcmFnLT52YWx1ZSA8PSBNQVhfRlJBR19USFJFU0hPTEQpCisJCXZhbCA9IF9fY3B1X3RvX2xlMTYoZnJhZy0+dmFsdWUgJiB+MHgxKTsJLyogZXZlbiBudW1iZXJzIG9ubHkgKi8KIAllbHNlIGlmIChmcmFnLT52YWx1ZSA9PSAwKQotCSAgICB2YWwgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJCXZhbCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKIAllbHNlCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0xMzgxLDE3ICsxMzIxLDE4IEBACiB9CiAKIGludCBydF9pb2N0bF9naXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CiAKLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgCXsKLSAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKLSAgICAJfQorCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOworCisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CiAKIAlmcmFnLT52YWx1ZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQ7CiAJZnJhZy0+ZGlzYWJsZWQgPSAoZnJhZy0+dmFsdWUgPT0gTUFYX0ZSQUdfVEhSRVNIT0xEKTsKQEAgLTE0MDMsMTU2ICsxMzQ0LDE2MSBAQAogI2RlZmluZSBNQVhfV0VQX0tFWV9TSVpFIDEzCiAjZGVmaW5lIE1JTl9XRVBfS0VZX1NJWkUgNQogaW50IHJ0X2lvY3RsX3Npd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqZXh0cmEpCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOwogCi0JLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLSAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotICAgIAl7Ci0gICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAgICAgCXJldHVybiAtRU5FVERPV047Ci0gICAgCX0KKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKIAotCWlmICgoZXJxLT5sZW5ndGggPT0gMCkgJiYKLSAgICAgICAgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpKQotCXsKKwkvKmNoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmICgoZXJxLT5sZW5ndGggPT0gMCkgJiYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpKSB7CiAJCXBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKIAkJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKIAkJcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLSAgICAgICAgZ290byBkb25lOwotCX0gZWxzZSBpZiAoCi0JCSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEIHx8IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfT1BFTikpIHsKKwkJcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIGlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQKKwkJICAgfHwgZXJxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKSB7CisJCS8qcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOyAqLwogCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKIAkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CiAJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKIAkJcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisJCXBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwogCQlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKQogCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKLSAgICAJZWxzZQorCQllbHNlCiAJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKIAl9CiAKLSAgICBpZiAoZXJxLT5sZW5ndGggPiAwKQotCXsKKwlpZiAoZXJxLT5sZW5ndGggPiAwKSB7CiAJCWludCBrZXlJZHggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOwogCQkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUga2V5ICovCiAJCWlmIChlcnEtPmxlbmd0aCA+IE1BWF9XRVBfS0VZX1NJWkUpIHsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCS8qIENoZWNrIGtleSBpbmRleCAqLwotCQlpZiAoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6Oldyb25nIGtleUlkeD0lZCEgVXNpbmcgZGVmYXVsdCBrZXkgaW5zdGVhZCAoJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUlkeCwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKwkJaWYgKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpXcm9uZyBrZXlJZHg9JWQhIFVzaW5nIGRlZmF1bHQga2V5IGluc3RlYWQgKCVkKVxuIiwKKwkJCQkgIGtleUlkeCwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKIAotICAgICAgICAgICAgLy9Vc2luZyBkZWZhdWx0IGtleQorCQkJLypVc2luZyBkZWZhdWx0IGtleSAqLwogCQkJa2V5SWR4ID0gcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQ7Ci0gICAgICAgIH0KLQkJZWxzZQotCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQ9a2V5SWR4OworCQl9IGVsc2UKKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0ga2V5SWR4OwogCi0gICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksICAxNik7CisJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIDE2KTsKIAotCQlpZiAoZXJxLT5sZW5ndGggPT0gTUFYX1dFUF9LRVlfU0laRSkKLSAgICAgICAgewotCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1BWF9XRVBfS0VZX1NJWkU7Ci0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLQkJfQotCQllbHNlIGlmIChlcnEtPmxlbmd0aCA9PSBNSU5fV0VQX0tFWV9TSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUlOX1dFUF9LRVlfU0laRTsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0JCX0KLQkJZWxzZQorCQlpZiAoZXJxLT5sZW5ndGggPT0gTUFYX1dFUF9LRVlfU0laRSkgeworCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9CisJCQkgICAgTUFYX1dFUF9LRVlfU0laRTsKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPQorCQkJICAgIENJUEhFUl9XRVAxMjg7CisJCX0gZWxzZSBpZiAoZXJxLT5sZW5ndGggPT0gTUlOX1dFUF9LRVlfU0laRSkgeworCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9CisJCQkgICAgTUlOX1dFUF9LRVlfU0laRTsKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPQorCQkJICAgIENJUEhFUl9XRVA2NDsKKwkJfSBlbHNlCiAJCQkvKiBEaXNhYmxlIHRoZSBrZXkgKi8KIAkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSAwOwogCiAJCS8qIENoZWNrIGlmIHRoZSBrZXkgaXMgbm90IG1hcmtlZCBhcyBpbnZhbGlkICovCi0JCWlmKCEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkpIHsKKwkJaWYgKCEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkpIHsKIAkJCS8qIENvcHkgdGhlIGtleSBpbiB0aGUgZHJpdmVyICovCi0JCQlOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHRyYSwgZXJxLT5sZW5ndGgpOwotICAgICAgICB9Ci0JfQotICAgIGVsc2UKLQkJCXsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksCisJCQkJICAgICAgIGV4dHJhLCBlcnEtPmxlbmd0aCk7CisJCX0KKwl9IGVsc2UgewogCQkvKiBEbyB3ZSB3YW50IHRvIGp1c3Qgc2V0IHRoZSB0cmFuc21pdCBrZXkgaW5kZXggPyAqLwogCQlpbnQgaW5kZXggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOwotCQlpZiAoKGluZGV4ID49IDApICYmIChpbmRleCA8IDQpKQotICAgICAgICB7CisJCWlmICgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDwgNCkpIHsKIAkJCXBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gaW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGVsc2UKKwkJfSBlbHNlCiAJCQkvKiBEb24ndCBjb21wbGFpbiBpZiBvbmx5IGNoYW5nZSB0aGUgbW9kZSAqLwotCQkJaWYgKCEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSkgewotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9CisJCWlmICghKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfTU9ERSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIGRvbmU6Ci0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjplcnEtPmZsYWdzPSV4XG4iLGVycS0+ZmxhZ3MpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OkF1dGhNb2RlPSV4XG4iLHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OkRlZmF1bHRLZXlJZD0leCwgS2V5TGVuID0gJWRcbiIscEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4pKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OldlcFN0YXR1cz0leFxuIixwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OmVycS0+ZmxhZ3M9JXhcbiIsIGVycS0+ZmxhZ3MpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpBdXRoTW9kZT0leFxuIiwKKwkJICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6RGVmYXVsdEtleUlkPSV4LCBLZXlMZW4gPSAlZFxuIiwKKwkJICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKwkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS4KKwkJICBLZXlMZW4pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpXZXBTdGF0dXM9JXhcbiIsCisJCSAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMpKTsKIAlyZXR1cm4gMDsKIH0KIAogaW50CiBydF9pb2N0bF9naXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleSkKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OwogCWludCBraWQ7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOwogCi0JLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKKworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CiAJfQogCiAJa2lkID0gZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfZ2l3ZW5jb2RlICVkXG4iLCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIj09PT5ydF9pb2N0bF9naXdlbmNvZGUgJWRcbiIsIGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpKTsKIAotCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JeworCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpIHsKIAkJZXJxLT5sZW5ndGggPSAwOwogCQllcnEtPmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOwotCX0KLQllbHNlIGlmICgoa2lkID4gMCkgJiYgKGtpZCA8PTQpKQotCXsKLQkJLy8gY29weSB3ZXAga2V5Ci0JCWVycS0+ZmxhZ3MgPSBraWQgOwkJCS8qIE5COiBiYXNlIDEgKi8KLQkJaWYgKGVycS0+bGVuZ3RoID4gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5TGVuKQotCQkJZXJxLT5sZW5ndGggPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXlMZW47Ci0JCW1lbWNweShrZXksIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleSwgZXJxLT5sZW5ndGgpOwotCQkvL2lmICgoa2lkID09IHBBZGFwdGVyLT5Qb3J0Q2ZnLkRlZmF1bHRLZXlJZCkpCi0JCS8vZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsJLyogWFhYICovCisJfSBlbHNlIGlmICgoa2lkID4gMCkgJiYgKGtpZCA8PSA0KSkgeworCQkvKiBjb3B5IHdlcCBrZXkgKi8KKwkJZXJxLT5mbGFncyA9IGtpZDsJLyogTkI6IGJhc2UgMSAqLworCQlpZiAoZXJxLT5sZW5ndGggPiBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZCAtIDFdLktleUxlbikKKwkJCWVycS0+bGVuZ3RoID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQgLSAxXS5LZXlMZW47CisJCW1lbWNweShrZXksIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkIC0gMV0uS2V5LAorCQkgICAgICAgZXJxLT5sZW5ndGgpOworCQkvKmlmICgoa2lkID09IHBBZGFwdGVyLT5Qb3J0Q2ZnLkRlZmF1bHRLZXlJZCkpICovCisJCS8qZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsgKi8JLyogWFhYICovCiAJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKLQkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CS8qIFhYWCAqLwogCQllbHNlCi0JCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkvKiBYWFggKi8KIAotCX0KLQllbHNlIGlmIChraWQgPT0gMCkKLQl7CisJfSBlbHNlIGlmIChraWQgPT0gMCkgewogCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCi0JCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkvKiBYWFggKi8KIAkJZWxzZQotCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLwotCQllcnEtPmxlbmd0aCA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbjsKLQkJbWVtY3B5KGtleSwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBlcnEtPmxlbmd0aCk7Ci0JCS8vIGNvcHkgZGVmYXVsdCBrZXkgSUQKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CS8qIFhYWCAqLworCQllcnEtPmxlbmd0aCA9CisJCSAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS4KKwkJICAgIEtleUxlbjsKKwkJbWVtY3B5KGtleSwKKwkJICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLgorCQkgICAgICAgS2V5LCBlcnEtPmxlbmd0aCk7CisJCS8qIGNvcHkgZGVmYXVsdCBrZXkgSUQgKi8KIAkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQotCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLworCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJLyogWFhYICovCiAJCWVsc2UKLQkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KLQkJZXJxLT5mbGFncyA9IHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkICsgMTsJCQkvKiBOQjogYmFzZSAxICovCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkvKiBYWFggKi8KKwkJZXJxLT5mbGFncyA9IHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkICsgMTsJLyogTkI6IGJhc2UgMSAqLwogCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwkvKiBYWFggKi8KIAl9CiAKQEAgLTE1NjAsNzcwICsxNTA2LDU4NSBAQAogCiB9CiAKLXN0YXRpYyBpbnQKLXJ0X2lvY3RsX3NldHBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgdm9pZCAqdywgY2hhciAqZXh0cmEpCit2b2lkIGdldEJhSW5mbyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGNoYXIgKnBPdXRCdWYpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWRhcHRlci0+T1NfQ29va2llOwotCWNoYXIgKnRoaXNfY2hhciA9IGV4dHJhOwotCWNoYXIgKnZhbHVlOwotCWludCAgU3RhdHVzPTA7CisJaW50IGksIGo7CisJc3RydWN0IHJ0X2JhX29yaV9lbnRyeSAqcE9yaUJBRW50cnk7CisJc3RydWN0IHJ0X2JhX3JlY19lbnRyeSAqcFJlY0JBRW50cnk7CiAKLQl7Ci0JCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKLSAgICAgICAgcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKLQl9Ci0KLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgCXsKLSAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCQkJcmV0dXJuIC1FTkVURE9XTjsKLSAgICAJfQotCi0JaWYgKCEqdGhpc19jaGFyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCi0JICAgICp2YWx1ZSsrID0gMDsKLQotCWlmICghdmFsdWUpCi0JICAgIHJldHVybiAtRUlOVkFMOwotCi0JLy8gcmVqZWN0IHNldHRpbmcgbm90aGluZyBiZXNpZGVzIEFOWSBzc2lkKHNzaWRMZW49MCkKLSAgICBpZiAoISp2YWx1ZSAmJiAoc3RyY21wKHRoaXNfY2hhciwgIlNTSUQiKSAhPSAwKSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLQlmb3IgKFBSVE1QX1BSSVZBVEVfU0VUX1BST0MgPSBSVE1QX1BSSVZBVEVfU1VQUE9SVF9QUk9DOyBQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lOyBQUlRNUF9QUklWQVRFX1NFVF9QUk9DKyspCi0JewotCSAgICBpZiAoc3RyY21wKHRoaXNfY2hhciwgUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgICAgaWYoIVBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPnNldF9wcm9jKHBBZGFwdGVyLCB2YWx1ZSkpCi0JICAgICAgICB7CS8vRkFMU0U6U2V0IHByaXZhdGUgZmFpbGVkIHRoZW4gcmV0dXJuIEludmFsaWQgYXJndW1lbnQKLQkJCSAgICBTdGF0dXMgPSAtRUlOVkFMOwotCSAgICAgICAgfQotCQkgICAgYnJlYWs7CS8vRXhpdCBmb3IgbG9vcC4KLQkgICAgfQotCX0KLQotCWlmKFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWUgPT0gTlVMTCkKLQl7ICAvL05vdCBmb3VuZCBhcmd1bWVudAotCSAgICBTdGF0dXMgPSAtRUlOVkFMOwotCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfc2V0cGFyYW06OiAoaXdwcml2KSBOb3QgU3VwcG9ydCBTZXQgQ29tbWFuZCBbJXM9JXNdXG4iLCB0aGlzX2NoYXIsIHZhbHVlKSk7Ci0JfQotCi0gICAgcmV0dXJuIFN0YXR1czsKLX0KLQotCi1zdGF0aWMgaW50Ci1ydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKLXsKLQlJTlQJCQkJU3RhdHVzID0gMDsKLSAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OwotCi0gICAgaWYgKGV4dHJhID09IE5VTEwpCi0gICAgewotICAgICAgICB3cnEtPmxlbmd0aCA9IDA7Ci0gICAgICAgIHJldHVybiAtRUlPOwotICAgIH0KLQotICAgIG1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOwotICAgIHNwcmludGYoZXh0cmEsICJcblxuIik7Ci0KLQl7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCk7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCAtIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KTsKLQl9Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyBhZnRlciByZXRyeSAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpOwotICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IGZhaWwgdG8gUmN2IEFDSyBhZnRlciByZXRyeSAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC5RdWFkUGFydCk7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIFN1Y2Nlc3MgUmN2IENUUyAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydCk7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIEZhaWwgUmN2IENUUyAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydCk7Ci0KLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0KTsKLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCB3aXRoIENSQyAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC5RdWFkUGFydCk7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggZHJvcCBkdWUgdG8gb3V0IG9mIHJlc291cmNlICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIpOwotICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IGR1cGxpY2F0ZSBmcmFtZSAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0KTsKLQotICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIkZhbHNlIENDQSAob25lIHNlY29uZCkgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250KTsKLQl7Ci0gICAgCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKLSAgICAgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1CIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOwotICAgICAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUMgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG5cbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKLQl9Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiV3BhU3VwcGxpY2FudFVQICAgICAgICAgICAgICAgICA9ICVkXG5cbiIsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCk7Ci0KLSAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcywgd3JxLT5sZW5ndGggPSAlZFxuIiwgd3JxLT5sZW5ndGgpKTsKLQotICAgIHJldHVybiBTdGF0dXM7Ci19Ci0KLXZvaWQJZ2V0QmFJbmZvKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBPdXRCdWYpCi17Ci0JSU5UIGksIGo7Ci0JQkFfT1JJX0VOVFJZICpwT3JpQkFFbnRyeTsKLQlCQV9SRUNfRU5UUlkgKnBSZWNCQUVudHJ5OwotCi0JZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQl7Ci0JCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07Ci0JCWlmICgoKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCi0JCQl8fCAocEVudHJ5LT5WYWxpZEFzV0RTKSB8fCAocEVudHJ5LT5WYWxpZEFzTWVzaCkpCi0JCXsKLQkJCXNwcmludGYocE91dEJ1ZiArIHN0cmxlbihwT3V0QnVmKSwgIlxuJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggKEFpZCA9ICVkKSAoQVApIC1cbiIsCi0JCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKLQkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdLCBwRW50cnktPkFpZCk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspIHsKKwkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisJCWlmICgoKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSkKKwkJICAgICAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKKwkJICAgIHx8IChwRW50cnktPlZhbGlkQXNXRFMpIHx8IChwRW50cnktPlZhbGlkQXNNZXNoKSkgeworCQkJc3ByaW50ZihwT3V0QnVmICsgc3RybGVuKHBPdXRCdWYpLAorCQkJCSJcbiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIChBaWQgPSAlZCkgKEFQKSAtXG4iLAorCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLAorCQkJCXBFbnRyeS0+QWRkclsyXSwgcEVudHJ5LT5BZGRyWzNdLAorCQkJCXBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdLCBwRW50cnktPkFpZCk7CiAKIAkJCXNwcmludGYocE91dEJ1ZiwgIiVzW1JlY2lwaWVudF1cbiIsIHBPdXRCdWYpOwotCQkJZm9yIChqPTA7IGogPCBOVU1fT0ZfVElEOyBqKyspCi0JCQl7Ci0JCQkJaWYgKHBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbal0gIT0gMCkKLQkJCQl7Ci0JCQkJCXBSZWNCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbcEVudHJ5LT5CQVJlY1djaWRBcnJheVtqXV07Ci0JCQkJCXNwcmludGYocE91dEJ1ZiArIHN0cmxlbihwT3V0QnVmKSwgIlRJRD0lZCwgQkFXaW5TaXplPSVkLCBMYXN0SW5kU2VxPSVkLCBSZW9yZGVyaW5nUGt0cz0lZFxuIiwgaiwgcFJlY0JBRW50cnktPkJBV2luU2l6ZSwgcFJlY0JBRW50cnktPkxhc3RJbmRTZXEsIHBSZWNCQUVudHJ5LT5saXN0LnFsZW4pOworCQkJZm9yIChqID0gMDsgaiA8IE5VTV9PRl9USUQ7IGorKykgeworCQkJCWlmIChwRW50cnktPkJBUmVjV2NpZEFycmF5W2pdICE9IDApIHsKKwkJCQkJcFJlY0JBRW50cnkgPQorCQkJCQkgICAgJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W3BFbnRyeS0+CisJCQkJCQkJCSAgICAgQkFSZWNXY2lkQXJyYXkKKwkJCQkJCQkJICAgICBbal1dOworCQkJCQlzcHJpbnRmKHBPdXRCdWYgKyBzdHJsZW4ocE91dEJ1ZiksCisJCQkJCQkiVElEPSVkLCBCQVdpblNpemU9JWQsIExhc3RJbmRTZXE9JWQsIFJlb3JkZXJpbmdQa3RzPSVkXG4iLAorCQkJCQkJaiwgcFJlY0JBRW50cnktPkJBV2luU2l6ZSwKKwkJCQkJCXBSZWNCQUVudHJ5LT5MYXN0SW5kU2VxLAorCQkJCQkJcFJlY0JBRW50cnktPmxpc3QucWxlbik7CiAJCQkJfQogCQkJfQogCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcbiIsIHBPdXRCdWYpOwogCiAJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1tPcmlnaW5hdG9yXVxuIiwgcE91dEJ1Zik7Ci0JCQlmb3IgKGo9MDsgaiA8IE5VTV9PRl9USUQ7IGorKykKLQkJCXsKLQkJCQlpZiAocEVudHJ5LT5CQU9yaVdjaWRBcnJheVtqXSAhPSAwKQotCQkJCXsKLQkJCQkJcE9yaUJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtwRW50cnktPkJBT3JpV2NpZEFycmF5W2pdXTsKLQkJCQkJc3ByaW50ZihwT3V0QnVmICsgc3RybGVuKHBPdXRCdWYpLCAiVElEPSVkLCBCQVdpblNpemU9JWQsIFN0YXJ0U2VxPSVkLCBDdXJUeFNlcT0lZFxuIiwgaiwgcE9yaUJBRW50cnktPkJBV2luU2l6ZSwgcE9yaUJBRW50cnktPlNlcXVlbmNlLCBwRW50cnktPlR4U2VxW2pdKTsKKwkJCWZvciAoaiA9IDA7IGogPCBOVU1fT0ZfVElEOyBqKyspIHsKKwkJCQlpZiAocEVudHJ5LT5CQU9yaVdjaWRBcnJheVtqXSAhPSAwKSB7CisJCQkJCXBPcmlCQUVudHJ5ID0KKwkJCQkJICAgICZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtwRW50cnktPgorCQkJCQkJCQkgICAgIEJBT3JpV2NpZEFycmF5CisJCQkJCQkJCSAgICAgW2pdXTsKKwkJCQkJc3ByaW50ZihwT3V0QnVmICsgc3RybGVuKHBPdXRCdWYpLAorCQkJCQkJIlRJRD0lZCwgQkFXaW5TaXplPSVkLCBTdGFydFNlcT0lZCwgQ3VyVHhTZXE9JWRcbiIsCisJCQkJCQlqLCBwT3JpQkFFbnRyeS0+QkFXaW5TaXplLAorCQkJCQkJcE9yaUJBRW50cnktPlNlcXVlbmNlLAorCQkJCQkJcEVudHJ5LT5UeFNlcVtqXSk7CiAJCQkJfQogCQkJfQogCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcblxuIiwgcE91dEJ1Zik7CiAJCX0KLSAgICAgICAgaWYgKHN0cmxlbihwT3V0QnVmKSA+IChJV19QUklWX1NJWkVfTUFTSyAtIDMwKSkKLSAgICAgICAgICAgICAgICBicmVhazsKKwkJaWYgKHN0cmxlbihwT3V0QnVmKSA+IChJV19QUklWX1NJWkVfTUFTSyAtIDMwKSkKKwkJCWJyZWFrOwogCX0KIAogCXJldHVybjsKIH0KIAotc3RhdGljIGludAotcnRfcHJpdmF0ZV9zaG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKLXsKLSAgICBJTlQJCQkJU3RhdHVzID0gMDsKLSAgICBQUlRNUF9BREFQVEVSIHBBZCA9IGRldi0+bWxfcHJpdjsKLSAgICBQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0gICAgdTMyICAgICAgICAgICAgIHN1YmNtZCA9IHdycS0+ZmxhZ3M7Ci0KLSAgICBpZiAoZXh0cmEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHdycS0+bGVuZ3RoID0gMDsKLSAgICAgICAgcmV0dXJuIC1FSU87Ci0gICAgfQotICAgIG1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOwotCi0JewotCQlwT2JqLT5pb2N0bF9pZl90eXBlID0gSU5UX01BSU47Ci0gICAgICAgIHBPYmotPmlvY3RsX2lmID0gTUFJTl9NQlNTSUQ7Ci0JfQotCi0gICAgc3dpdGNoKHN1YmNtZCkKLSAgICB7Ci0KLSAgICAgICAgY2FzZSBTSE9XX0NPTk5fU1RBVFVTOgotICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCi0gICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVykKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIk1vbml0b3IgTW9kZShDZW50cmFsQ2hhbm5lbCAlZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJNb25pdG9yIE1vZGUoQ2hhbm5lbCAlZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKLSAgICAgICAgICAgIAl7Ci0gICAgICAgICAgICAJICAgIGlmIChJTkZSQV9PTihwQWQpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJDb25uZWN0ZWQoQVA6ICVzWyUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXSlcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Tc2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFs0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKTsKLSAgICAgICAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiU3NpZD0lcyAsU3NpZGxlbiA9ICVkXG4iLHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pKTsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFESE9DX09OKHBBZCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiQ29ubmVjdGVkXG4iKTsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAJZWxzZQotICAgICAgICAgICAgCXsKLSAgICAgICAgICAgIAkgICAgc3ByaW50ZihleHRyYSwgIkRpc2Nvbm5lY3RlZFxuIik7Ci0gICAgICAgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIkNvbm5TdGF0dXMgaXMgbm90IGNvbm5lY3RlZFxuIikpOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0hPV19EUlZJRVJfVkVSSU9OOgotICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkRyaXZlciB2ZXJzaW9uLSVzLCAlcyAlc1xuIiwgU1RBX0RSSVZFUl9WRVJTSU9OLCBfX0RBVEVfXywgX19USU1FX18gKTsKLSAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0hPV19CQV9JTkZPOgotICAgICAgICAgICAgZ2V0QmFJbmZvKHBBZCwgZXh0cmEpOwotICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCi0gICAgICAgICAgICBicmVhazsKLQkJY2FzZSBTSE9XX0RFU0NfSU5GTzoKLQkJCXsKLQkJCQlTaG93X0Rlc2NJbmZvX1Byb2MocEFkLCBOVUxMKTsKLQkJCQl3cnEtPmxlbmd0aCA9IDA7IC8vIDE6IHNpemUgb2YgJ1wwJwotCQkJfQotCQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgUkFJT19PRkY6Ci0gICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiU2Nhbm5pbmdcbiIpOwotICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBGQUxTRTsKLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gIT0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOwotICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PZmYocEFkKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCi0JCQkJCXBBZC0+RXh0cmFJbmZvID0gU1dfUkFESU9fT0ZGOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJSYWRpbyBPZmZcbiIpOwotICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSQUlPX09OOgotI2lmZGVmIFJUMjg3MAotICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlNjYW5uaW5nXG4iKTsKLSAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBUUlVFOwotICAgICAgICAgICAgLy9pZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKLSAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PbihwQWQpOwotICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KLQkJCQkJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJSYWRpbyBPblxuIik7Ci0gICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKLSAgICAgICAgICAgIGJyZWFrOwotCi0JCWNhc2UgU0hPV19DRkdfVkFMVUU6Ci0JCQl7Ci0JCQkJU3RhdHVzID0gUlRNUFNob3dDZmdWYWx1ZShwQWQsIHdycS0+cG9pbnRlciwgZXh0cmEpOwotCQkJCWlmIChTdGF0dXMgPT0gMCkKLQkJCQkJd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCi0JCQl9Ci0JCQlicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0gdW5rbm93IHN1YmNtZCA9ICVkXG4iLCBfX2Z1bmNfXywgc3ViY21kKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gU3RhdHVzOwotfQotCiBpbnQgcnRfaW9jdGxfc2l3bWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCi0JCQkgICBjaGFyICpleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKIAlzdHJ1Y3QgaXdfbWxtZSAqcE1sbWUgPSAoc3RydWN0IGl3X21sbWUgKil3cnF1LT5kYXRhLnBvaW50ZXI7Ci0JTUxNRV9RVUVVRV9FTEVNCQkJCU1zZ0VsZW07Ci0JTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc0Fzc29jUmVxOwotCU1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICBEZUF1dGhSZXE7CisJc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSBNc2dFbGVtOworCXN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSBEaXNBc3NvY1JlcTsKKwlzdHJ1Y3QgcnRfbWxtZV9kZWF1dGhfcmVxIERlQXV0aFJlcTsKKworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgZGV2KTsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzXG4iLCBfX2Z1bmNfXykpOwogCiAJaWYgKHBNbG1lID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc3dpdGNoKHBNbG1lLT5jbWQpCi0JeworCXN3aXRjaCAocE1sbWUtPmNtZCkgewogI2lmZGVmIElXX01MTUVfREVBVVRICi0JCWNhc2UgSVdfTUxNRV9ERUFVVEg6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfREVBVVRIXG4iLCBfX2Z1bmNfXykpOwotCQkJQ09QWV9NQUNfQUREUihEZUF1dGhSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQkJRGVBdXRoUmVxLlJlYXNvbiA9IHBNbG1lLT5yZWFzb25fY29kZTsKLQkJCU1zZ0VsZW0uTXNnTGVuID0gc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpOwotCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEZUF1dGhSZXEsIHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKSk7Ci0JCQlNbG1lRGVhdXRoUmVxQWN0aW9uKHBBZCwgJk1zZ0VsZW0pOwotCQkJaWYgKElORlJBX09OKHBBZCkpCi0JCQl7Ci0JCQkgICAgTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0JCQkgICAgcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCQkJfQotCQkJYnJlYWs7Ci0jZW5kaWYgLy8gSVdfTUxNRV9ERUFVVEggLy8KKwljYXNlIElXX01MTUVfREVBVVRIOgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIj09PT0+ICVzIC0gSVdfTUxNRV9ERUFVVEhcbiIsIF9fZnVuY19fKSk7CisJCUNPUFlfTUFDX0FERFIoRGVBdXRoUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJRGVBdXRoUmVxLlJlYXNvbiA9IHBNbG1lLT5yZWFzb25fY29kZTsKKwkJTXNnRWxlbS5Nc2dMZW4gPSBzaXplb2Yoc3RydWN0IHJ0X21sbWVfZGVhdXRoX3JlcSk7CisJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGVBdXRoUmVxLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9kZWF1dGhfcmVxKSk7CisJCU1sbWVEZWF1dGhSZXFBY3Rpb24ocEFkLCAmTXNnRWxlbSk7CisJCWlmIChJTkZSQV9PTihwQWQpKSB7CisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJfQorCQlicmVhazsKKyNlbmRpZiAvKiBJV19NTE1FX0RFQVVUSCAvLyAqLwogI2lmZGVmIElXX01MTUVfRElTQVNTT0MKLQkJY2FzZSBJV19NTE1FX0RJU0FTU09DOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RJU0FTU09DXG4iLCBfX2Z1bmNfXykpOwotCQkJQ09QWV9NQUNfQUREUihEaXNBc3NvY1JlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQlEaXNBc3NvY1JlcS5SZWFzb24gPSAgcE1sbWUtPnJlYXNvbl9jb2RlOworCWNhc2UgSVdfTUxNRV9ESVNBU1NPQzoKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI9PT09PiAlcyAtIElXX01MTUVfRElTQVNTT0NcbiIsIF9fZnVuY19fKSk7CisJCUNPUFlfTUFDX0FERFIoRGlzQXNzb2NSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQlEaXNBc3NvY1JlcS5SZWFzb24gPSBwTWxtZS0+cmVhc29uX2NvZGU7CiAKLQkJCU1zZ0VsZW0uTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7Ci0JCQlNc2dFbGVtLk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7Ci0JCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpOwotCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEaXNBc3NvY1JlcSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCkpOworCQlNc2dFbGVtLk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQlNc2dFbGVtLk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7CisJCU1zZ0VsZW0uTXNnTGVuID0gc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSk7CisJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGlzQXNzb2NSZXEsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSkpOwogCi0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKLQkJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKLQkJCWJyZWFrOwotI2VuZGlmIC8vIElXX01MTUVfRElTQVNTT0MgLy8KLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gVW5rbm93IENvbW1hbmRcbiIsIF9fZnVuY19fKSk7Ci0JCQlicmVhazsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7CisJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogSVdfTUxNRV9ESVNBU1NPQyAvLyAqLworCWRlZmF1bHQ6CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiPT09PT4gJXMgLSBVbmtub3cgQ29tbWFuZFxuIiwgX19mdW5jX18pKTsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKIGludCBydF9pb2N0bF9zaXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQorCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0JUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKIAlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOwogCi0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKKworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CiAJfQogCXN3aXRjaCAocGFyYW0tPmZsYWdzICYgSVdfQVVUSF9JTkRFWCkgewotICAgIAljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046Ci0gICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7Ci0JCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBMikKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKKwljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046CisJCWlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEpIHsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0KKwkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJfSBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEyKQorCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CiAKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKLSAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfTk9ORSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQNDAgfHwKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVAxMDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1RLSVApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfQ0NNUCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0NJUEhFUl9QQUlSV0lTRSAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgCWNhc2UgSVdfQVVUSF9DSVBIRVJfR1JPVVA6Ci0gICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX05PTkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVA0MCB8fAotICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDEwNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfVEtJUCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9DQ01QKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX0dST1VQIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAJY2FzZSBJV19BVVRIX0tFWV9NR01UOgotICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOwotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAvLyBXRVAgMXgKLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IDApCi0gICAgICAgICAgICB7Ci0JCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9LRVlfTUdNVCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgCWNhc2UgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIAljYXNlIElXX0FVVEhfUFJJVkFDWV9JTlZPS0VEOgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfUFJJVkFDWV9JTlZPS0VEIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7Ci0gICAgCQlicmVhazsKLSAgICAJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6Ci0gICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlICE9IDApCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKLQkJCWVsc2UKLQkJCXsKLQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLQkJCX0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7Ci0gICAgCQlicmVhazsKLSAgICAJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgotCQkJaWYgKHBhcmFtLT52YWx1ZSAmIElXX0FVVEhfQUxHX1NIQVJFRF9LRVkpCi0gICAgICAgICAgICB7Ci0JCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKLQkJCX0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSAmIElXX0FVVEhfQUxHX09QRU5fU1lTVEVNKQotICAgICAgICAgICAgewotCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotCQkJfQotICAgICAgICAgICAgZWxzZQotCQkJCXJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfODAyMTFfQVVUSF9BTEcgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKLQkJCWJyZWFrOwotICAgIAljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6Ci0gICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfRU5BQkxFRCAtIERyaXZlciBzdXBwb3J0cyBXUEEhKHBhcmFtLT52YWx1ZSA9ICVkKVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOwotICAgIAkJYnJlYWs7Ci0gICAgCWRlZmF1bHQ6Ci0gICAgCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsCisJCQkgIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKKwkJaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKSB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9CisJCQkgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCX0gZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDQwIHx8CisJCQkgICBwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQMTA0KSB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCQkJcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0KKwkJCSAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCQkJcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKwkJfSBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfVEtJUCkgeworCQkJcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPQorCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPQorCQkJICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworCQkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0KKwkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQl9IGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9DQ01QKSB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9CisJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9CisJCQkgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPQorCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIlczo6SVdfQVVUSF9DSVBIRVJfUEFJUldJU0UgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsCisJCQkgIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKKwkJaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKSB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQl9IGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVA0MCB8fAorCQkJICAgcGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDEwNCkgeworCQkJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCQl9IGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9US0lQKSB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0KKwkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQl9IGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9DQ01QKSB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0KKwkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiJXM6OklXX0FVVEhfQ0lQSEVSX0dST1VQIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLAorCQkJICBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKKwkJaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkgeworCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0KKwkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisJCQl9IGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCQkgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9CisJCQkJICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKwkJCX0gZWxzZQorCQkJCS8qIFdFUCAxeCAqLworCQkJCXBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gVFJVRTsKKwkJfSBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gMCkgeworCQkJLypwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7ICovCisJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiVzOjpJV19BVVRIX0tFWV9NR01UIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLAorCQkJICBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTDoKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKKwkJLyppZiAocGFyYW0tPnZhbHVlID09IDApCisJCSAgIHsKKwkJICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisJCSAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQkgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQkgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQkgICB9ICovCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiJXM6OklXX0FVVEhfUFJJVkFDWV9JTlZPS0VEIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLAorCQkJICBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorCQlpZiAocGFyYW0tPnZhbHVlICE9IDApCisJCQlwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0KKwkJCSAgICBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCWVsc2UgeworCQkJLypwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7ICovCisJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLAorCQkJICBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKKwkJaWYgKHBhcmFtLT52YWx1ZSAmIElXX0FVVEhfQUxHX1NIQVJFRF9LRVkpIHsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisJCX0gZWxzZSBpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pIHsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiVzOjpJV19BVVRIXzgwMjExX0FVVEhfQUxHIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLAorCQkJICBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIlczo6SVdfQVVUSF9XUEFfRU5BQkxFRCAtIERyaXZlciBzdXBwb3J0cyBXUEEhKHBhcmFtLT52YWx1ZSA9ICVkKVxuIiwKKwkJCSAgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKIGludCBydF9pb2N0bF9naXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CiAJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKIAotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotICAgIHsKLSAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0gICAgCXJldHVybiAtRU5FVERPV047Ci0gICAgfQorCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOworCisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CiAKIAlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKIAljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKLSAgICAgICAgcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkgPyAwIDogMTsKKwkJcGFyYW0tPnZhbHVlID0KKwkJICAgIChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PQorCQkgICAgIE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkgPyAwIDogMTsKIAkJYnJlYWs7CiAKIAljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6Ci0gICAgICAgIHBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgPyBJV19BVVRIX0FMR19TSEFSRURfS0VZIDogSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07CisJCXBhcmFtLT52YWx1ZSA9CisJCSAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkgICAgIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgPyBJV19BVVRIX0FMR19TSEFSRURfS0VZIDoKKwkJICAgIElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOwogCQlicmVhazsKIAogCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKLQkJcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSA/IDEgOiAwOworCQlwYXJhbS0+dmFsdWUgPQorCQkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0KKwkJICAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEpID8gMSA6IDA7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9naXdhdXRoOjpwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIHBhcmFtLT52YWx1ZSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJydF9pb2N0bF9naXdhdXRoOjpwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIHBhcmFtLT52YWx1ZSkpOwogCXJldHVybiAwOwogfQogCi12b2lkIGZuU2V0Q2lwaGVyS2V5KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIElOVCAgICAgICAgICAgICBrZXlJZHgsCi0gICAgSU4gIFVDSEFSICAgICAgICAgICBDaXBoZXJBbGcsCi0gICAgSU4gIEJPT0xFQU4gICAgICAgICBiR1RLLAotICAgIElOICBzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0KQordm9pZCBmblNldENpcGhlcktleShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciwKKwkJICAgIGludCBrZXlJZHgsCisJCSAgICB1OCBDaXBoZXJBbGcsCisJCSAgICBJTiBCT09MRUFOIGJHVEssIElOIHN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQpCiB7Ci0jaWZkZWYgUlQyODYwCi0JUlRNUF9DTEVBUl9QU0ZMQUcocEFkYXB0ZXIsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0JaWYgKFJUTVBfVEVTVF9QU0ZMQUcocEFkYXB0ZXIsIGZSVE1QX1BTX1NFVF9QQ0lfQ0xLX09GRl9DT01NQU5EKSkKLQl7Ci0JCWlmIChwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKLQkJewotCQkJUlRNUF9TRVRfUFNGTEFHKHBBZGFwdGVyLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwotCQkJcmV0dXJuOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQUFkZEtleVByb2MxPT0+XG4iKSk7Ci0JCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkYXB0ZXIsIFJFU1RPUkVfSEFMVCk7Ci0JCVJUTVB1c2VjRGVsYXkoNjAwMCk7Ci0JCXBBZGFwdGVyLT5iUENJY2xrT2ZmID0gRkFMU0U7Ci0JfQotI2VuZGlmCi0gICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLSAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7Ci0gICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0LT5rZXksIExFTl9US0lQX0VLKTsKLSAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uVHhNaWMsIGV4dC0+a2V5ICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7Ci0gICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlJ4TWljLCBleHQtPmtleSArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOwotICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XSwgc2l6ZW9mKHN0cnVjdCBydF9jaXBoZXJfa2V5KSk7CisJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IExFTl9US0lQX0VLOworCU5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LAorCQkgICAgICAgTEVOX1RLSVBfRUspOworCU5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywKKwkJICAgICAgIGV4dC0+a2V5ICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisJTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlJ4TWljLAorCQkgICAgICAgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywKKwkJICAgICAgIExFTl9US0lQX1JYTUlDSyk7CisJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKIAotICAgIC8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJLyogVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUgKi8KIAlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCi0JCQkJCQkgIEJTUzAsCi0JCQkJCQkgIGtleUlkeCwKLQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKLQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwKLQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLAotCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMpOworCQkJICAgICAgQlNTMCwKKwkJCSAgICAgIGtleUlkeCwKKwkJCSAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCisJCQkgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LAorCQkJICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLAorCQkJICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlJ4TWljKTsKIAotICAgIGlmIChiR1RLKQotICAgICAgICAvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKLSAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKLSAgICAJCQkJCQkJICBCU1MwLAotICAgIAkJCQkJCQkgIGtleUlkeCwKLSAgICAJCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAotICAgIAkJCQkJCQkgIE5VTEwpOwotICAgIGVsc2UKLSAgICAgICAgLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0gICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsCi0gICAgCQkJCQkJCSAgQlNTMCwKLSAgICAJCQkJCQkJICBrZXlJZHgsCi0gICAgCQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKLSAgICAJCQkJCQkJICAmcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdKTsKLSNpZmRlZiBSVDI4NjAKLQlSVE1QX1NFVF9QU0ZMQUcocEFkYXB0ZXIsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0jZW5kaWYKKwlpZiAoYkdUSykKKwkJLyogVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlICovCisJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsCisJCQkJCSAgQlNTMCwKKwkJCQkJICBrZXlJZHgsCisJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLgorCQkJCQkgIENpcGhlckFsZywgTlVMTCk7CisJZWxzZQorCQkvKiBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgKi8KKwkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKKwkJCQkJICBCU1MwLAorCQkJCQkgIGtleUlkeCwKKwkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uCisJCQkJCSAgQ2lwaGVyQWxnLAorCQkJCQkgICZwQWRhcHRlci0+TWFjVGFiLgorCQkJCQkgIENvbnRlbnRbQlNTSURfV0NJRF0pOwogfQogCiBpbnQgcnRfaW9jdGxfc2l3ZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKLQkJCSAgIGNoYXIgKmV4dHJhKQotCQkJewotICAgIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOwogCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CiAJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOwotICAgIGludCBrZXlJZHgsIGFsZyA9IGV4dC0+YWxnOworCWludCBrZXlJZHgsIGFsZyA9IGV4dC0+YWxnOwogCi0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKKworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CiAJfQogCi0gICAgaWYgKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkKLQl7Ci0gICAgICAgIGtleUlkeCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKLSAgICAgICAgLy8gc2V0IEJTU0lEIHdjaWQgZW50cnkgb2YgdGhlIFBhaXItd2lzZSBLZXkgdGFibGUgYXMgbm8tc2VjdXJpdHkgbW9kZQotCSAgICBBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWRhcHRlciwgQlNTMCwgQlNTSURfV0NJRCk7Ci0gICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSAwOworCWlmIChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKKwkJa2V5SWR4ID0gKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQkvKiBzZXQgQlNTSUQgd2NpZCBlbnRyeSBvZiB0aGUgUGFpci13aXNlIEtleSB0YWJsZSBhcyBuby1zZWN1cml0eSBtb2RlICovCisJCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBCU1NJRF9XQ0lEKTsKKwkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IDA7CiAJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCAwLCAoVUNIQVIpa2V5SWR4KTsKLSAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OlJlbW92ZSBhbGwga2V5cyEoZW5jb2RpbmctPmZsYWdzID0gJXgpXG4iLCBfX2Z1bmNfXywgZW5jb2RpbmctPmZsYWdzKSk7Ci0gICAgfQotCQkJCQllbHNlCi0gICAgewotICAgICAgICAvLyBHZXQgS2V5IEluZGV4IGFuZCBjb252ZXQgdG8gb3VyIG93biBkZWZpbmVkIGtleSBpbmRleAotICAgIAlrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7Ci0gICAgCWlmKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkKLSAgICAJCXJldHVybiAtRUlOVkFMOworCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsICh1OClrZXlJZHgpOworCQlOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfY2lwaGVyX2tleSkpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiVzOjpSZW1vdmUgYWxsIGtleXMhKGVuY29kaW5nLT5mbGFncyA9ICV4KVxuIiwKKwkJCSAgX19mdW5jX18sIGVuY29kaW5nLT5mbGFncykpOworCX0gZWxzZSB7CisJCS8qIEdldCBLZXkgSW5kZXggYW5kIGNvbnZldCB0byBvdXIgb3duIGRlZmluZWQga2V5IGluZGV4ICovCisJCWtleUlkeCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJaWYgKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkKKwkJCXJldHVybiAtRUlOVkFMOwogCi0gICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKLSAgICAgICAgewotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBrZXlJZHg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6RGVmYXVsdEtleUlkID0gJWRcbiIsIF9fZnVuY19fLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOwotICAgICAgICB9CisJCWlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkgeworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBrZXlJZHg7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCIlczo6RGVmYXVsdEtleUlkID0gJWRcbiIsIF9fZnVuY19fLAorCQkJCSAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKwkJfQogCi0gICAgICAgIHN3aXRjaCAoYWxnKSB7Ci0gICAgCQljYXNlIElXX0VOQ09ERV9BTEdfTk9ORToKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19OT05FXG4iLCBfX2Z1bmNfXykpOwotICAgIAkJCWJyZWFrOwotICAgIAkJY2FzZSBJV19FTkNPREVfQUxHX1dFUDoKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19XRVAgLSBleHQtPmtleV9sZW4gPSAlZCwga2V5SWR4ID0gJWRcbiIsIF9fZnVuY19fLCBleHQtPmtleV9sZW4sIGtleUlkeCkpOwotICAgIAkJCWlmIChleHQtPmtleV9sZW4gPT0gTUFYX1dFUF9LRVlfU0laRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgIAkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNQVhfV0VQX0tFWV9TSVpFOwotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLQkJCQl9Ci0gICAgICAgIAkJZWxzZSBpZiAoZXh0LT5rZXlfbGVuID09IE1JTl9XRVBfS0VZX1NJWkUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUlOX1dFUF9LRVlfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJc3dpdGNoIChhbGcpIHsKKwkJY2FzZSBJV19FTkNPREVfQUxHX05PTkU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCIlczo6SVdfRU5DT0RFX0FMR19OT05FXG4iLCBfX2Z1bmNfXykpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCIlczo6SVdfRU5DT0RFX0FMR19XRVAgLSBleHQtPmtleV9sZW4gPSAlZCwga2V5SWR4ID0gJWRcbiIsCisJCQkJICBfX2Z1bmNfXywgZXh0LT5rZXlfbGVuLCBrZXlJZHgpKTsKKwkJCWlmIChleHQtPmtleV9sZW4gPT0gTUFYX1dFUF9LRVlfU0laRSkgeworCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPQorCQkJCSAgICBNQVhfV0VQX0tFWV9TSVpFOworCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPQorCQkJCSAgICBDSVBIRVJfV0VQMTI4OworCQkJfSBlbHNlIGlmIChleHQtPmtleV9sZW4gPT0gTUlOX1dFUF9LRVlfU0laRSkgeworCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPQorCQkJCSAgICBNSU5fV0VQX0tFWV9TSVpFOworCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPQorCQkJCSAgICBDSVBIRVJfV0VQNjQ7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwKKwkJCQkgICAgICAgMTYpOworCQkJTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwKKwkJCQkgICAgICAgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7CisJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9PQorCQkJICAgIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZAorCQkJICAgIHx8IHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0KKwkJCSAgICBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkKSB7CisJCQkJLyogU2V0IEdyb3VwIGtleSBtYXRlcmlhbCB0byBBc2ljICovCisJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBrZXlJZHgsCisJCQkJCQkgICAgICBwQWRhcHRlci0+CisJCQkJCQkgICAgICBTaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS4KKwkJCQkJCSAgICAgIENpcGhlckFsZywKKwkJCQkJCSAgICAgIHBBZGFwdGVyLT4KKwkJCQkJCSAgICAgIFNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLgorCQkJCQkJICAgICAgS2V5LCBOVUxMLCBOVUxMKTsKKworCQkJCS8qIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlICovCisJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwKKwkJCQkJCQkgIGtleUlkeCwKKwkJCQkJCQkgIHBBZGFwdGVyLT4KKwkJCQkJCQkgIFNoYXJlZEtleVtCU1MwXQorCQkJCQkJCSAgW2tleUlkeF0uQ2lwaGVyQWxnLAorCQkJCQkJCSAgTlVMTCk7CisKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKworCQkJCS8qIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJICovCisJCQkJcEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9CisJCQkJICAgIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwogCQkJfQotICAgICAgICAJCWVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLSAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCAgMTYpOwotCQkJICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LCBleHQtPmtleV9sZW4pOwotCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCB8fAotCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQpCisJCQlicmVhazsKKwkJY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCIlczo6SVdfRU5DT0RFX0FMR19US0lQIC0ga2V5SWR4ID0gJWQsIGV4dC0+a2V5X2xlbiA9ICVkXG4iLAorCQkJCSAgX19mdW5jX18sIGtleUlkeCwgZXh0LT5rZXlfbGVuKSk7CisJCQlpZiAoZXh0LT5rZXlfbGVuID09IDMyKSB7CisJCQkJaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKSB7CisJCQkJCWZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsCisJCQkJCQkgICAgICAgQ0lQSEVSX1RLSVAsIEZBTFNFLCBleHQpOworCQkJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PQorCQkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgeworCQkJCQkJLypwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7ICovCisJCQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKwkJCQkJCXBBZGFwdGVyLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPQorCQkJCQkJICAgIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChleHQtPgorCQkJCQkgICBleHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkKIAkJCQl7Ci0JCQkJCS8vIFNldCBHcm91cCBrZXkgbWF0ZXJpYWwgdG8gQXNpYwotCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIGtleUlkeCwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgTlVMTCwgTlVMTCk7CisJCQkJCWZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsCisJCQkJCQkgICAgICAgQ0lQSEVSX1RLSVAsIFRSVUUsIGV4dCk7CiAKLQkJCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKLQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwga2V5SWR4LCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLCBOVUxMKTsKLQorCQkJCQkvKiBzZXQgODAyLjF4IHBvcnQgY29udHJvbCAqLworCQkJCQkvKnBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsgKi8KIAkJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7Ci0KLSAgICAJCQkJLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKLSAgICAJCQkJcEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJCQlwQWRhcHRlci0+SW5kaWNhdGVNZWRpYVN0YXRlID0KKwkJCQkJICAgIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwogCQkJCX0KLSAgICAJCQlicmVhazsKLSAgICAgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19US0lQOgotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19FTkNPREVfQUxHX1RLSVAgLSBrZXlJZHggPSAlZCwgZXh0LT5rZXlfbGVuID0gJWRcbiIsIF9fZnVuY19fLCBrZXlJZHgsIGV4dC0+a2V5X2xlbikpOwotICAgICAgICAgICAgICAgIGlmIChleHQtPmtleV9sZW4gPT0gMzIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9US0lQLCBGQUxTRSwgZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQljYXNlIElXX0VOQ09ERV9BTEdfQ0NNUDoKKwkJCWlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkgeworCQkJCWZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9BRVMsCisJCQkJCSAgICAgICBGQUxTRSwgZXh0KTsKKwkJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PQorCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorCQkJCQkvKnBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsgKi8KKwkJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisJCQkJcEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9CisJCQkJICAgIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJfSBlbHNlIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKSB7CisJCQkJZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX0FFUywKKwkJCQkJICAgICAgIFRSVUUsIGV4dCk7CisKKwkJCQkvKiBzZXQgODAyLjF4IHBvcnQgY29udHJvbCAqLworCQkJCS8qcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOyAqLworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworCQkJCXBBZGFwdGVyLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPQorCQkJCSAgICBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX1RLSVAsIFRSVUUsIGV4dCk7CisJfQogCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAotICAgICAgICAgICAgCSAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgotICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKLQkJewotICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfQUVTLCBGQUxTRSwgZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKLSAgICAgICAgICAgICAgICAgICAgCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX0FFUywgVFJVRSwgZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAotICAgICAgICAJICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgCQlkZWZhdWx0OgotICAgIAkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIGludAogcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IGRldi0+bWxfcHJpdjsKLQlQQ0hBUiBwS2V5ID0gTlVMTDsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOworCWNoYXIgKnBLZXkgPSBOVUxMOwogCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CiAJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOwogCWludCBpZHgsIG1heF9rZXlfbGVuOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9naXdlbmNvZGVleHRcbiIpKTsKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIGRldik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0X2lvY3RsX2dpd2VuY29kZWV4dFxuIikpOwogCiAJbWF4X2tleV9sZW4gPSBlbmNvZGluZy0+bGVuZ3RoIC0gc2l6ZW9mKCpleHQpOwogCWlmIChtYXhfa2V5X2xlbiA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOwotCWlmIChpZHgpCi0JeworCWlmIChpZHgpIHsKIAkJaWYgKGlkeCA8IDEgfHwgaWR4ID4gNCkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlpZHgtLTsKIAogCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAotCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKLQkJewotCQkJaWYgKGlkeCAhPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpCi0JCQl7CisJCSAgICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKSB7CisJCQlpZiAoaWR4ICE9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkgewogCQkJCWV4dC0+a2V5X2xlbiA9IDA7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCX0KLQl9Ci0JZWxzZQorCX0gZWxzZQogCQlpZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CiAKIAllbmNvZGluZy0+ZmxhZ3MgPSBpZHggKyAxOwogCW1lbXNldChleHQsIDAsIHNpemVvZigqZXh0KSk7CiAKIAlleHQtPmtleV9sZW4gPSAwOwotCXN3aXRjaChwQWQtPlN0YUNmZy5XZXBTdGF0dXMpIHsKLQkJY2FzZSBOZGlzODAyXzExV0VQRGlzYWJsZWQ6Ci0JCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfTk9ORTsKLQkJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7Ci0JCQlicmVhazsKLQkJY2FzZSBOZGlzODAyXzExV0VQRW5hYmxlZDoKLQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19XRVA7Ci0JCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPiBtYXhfa2V5X2xlbikKLQkJCQlyZXR1cm4gLUUyQklHOwotCQkJZWxzZQotCQkJewotCQkJCWV4dC0+a2V5X2xlbiA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuOwotCQkJCXBLZXkgPSAmKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5WzBdKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6Ci0JCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKLQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfVEtJUDsKLQkJCWVsc2UKLQkJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfQ0NNUDsKKwlzd2l0Y2ggKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykgeworCWNhc2UgTmRpczgwMl8xMVdFUERpc2FibGVkOgorCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfTk9ORTsKKwkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJYnJlYWs7CisJY2FzZSBOZGlzODAyXzExV0VQRW5hYmxlZDoKKwkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1dFUDsKKwkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gbWF4X2tleV9sZW4pCisJCQlyZXR1cm4gLUUyQklHOworCQllbHNlIHsKKwkJCWV4dC0+a2V5X2xlbiA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuOworCQkJcEtleSA9IChjaGFyICopJiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlbMF0pOworCQl9CisJCWJyZWFrOworCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKwljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19US0lQOworCQllbHNlCisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfQ0NNUDsKIAotCQkJaWYgKG1heF9rZXlfbGVuIDwgMzIpCi0JCQkJcmV0dXJuIC1FMkJJRzsKLQkJCWVsc2UKLQkJCXsKLQkJCQlleHQtPmtleV9sZW4gPSAzMjsKLQkJCQlwS2V5ID0gJnBBZC0+U3RhQ2ZnLlBNS1swXTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChtYXhfa2V5X2xlbiA8IDMyKQorCQkJcmV0dXJuIC1FMkJJRzsKKwkJZWxzZSB7CisJCQlleHQtPmtleV9sZW4gPSAzMjsKKwkJCXBLZXkgPSAoY2hhciAqKSYgcEFkLT5TdGFDZmcuUE1LWzBdOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChleHQtPmtleV9sZW4gJiYgcEtleSkKLQl7CisJaWYgKGV4dC0+a2V5X2xlbiAmJiBwS2V5KSB7CiAJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKIAkJbWVtY3B5KGV4dC0+a2V5LCBwS2V5LCBleHQtPmtleV9sZW4pOwogCX0KQEAgLTIzMzIsMjIgKzIwOTMsMjUgQEAKIH0KIAogaW50IHJ0X2lvY3RsX3Npd2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CiAKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIGRldik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0X2lvY3RsX3Npd2dlbmllXG4iKSk7CisJcEFkLT5TdGFDZmcuYlJTTl9JRV9Gcm9tV3BhU3VwcGxpY2FudCA9IEZBTFNFOwogCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IE1BWF9MRU5fT0ZfUlNOSUUgfHwKIAkgICAgKHdycXUtPmRhdGEubGVuZ3RoICYmIGV4dHJhID09IE5VTEwpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICh3cnF1LT5kYXRhLmxlbmd0aCkKLQl7CisJaWYgKHdycXUtPmRhdGEubGVuZ3RoKSB7CiAJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IHdycXUtPmRhdGEubGVuZ3RoOwotCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBleHRyYSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKLQl9Ci0JZWxzZQotCXsKKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgZXh0cmEsCisJCQkgICAgICAgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwkJcEFkLT5TdGFDZmcuYlJTTl9JRV9Gcm9tV3BhU3VwcGxpY2FudCA9IFRSVUU7CisJfSBlbHNlIHsKIAkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gMDsKIAkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgTUFYX0xFTl9PRl9SU05JRSk7CiAJfQpAQCAtMjM1NiwxODIgKzIxMjAsMjEzIEBACiB9CiAKIGludCBydF9pb2N0bF9naXdnZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKKworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgZGV2KTsKIAogCWlmICgocEFkLT5TdGFDZmcuUlNOSUVfTGVuID09IDApIHx8Ci0JCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCi0JeworCSAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpKSB7CiAJCXdycXUtPmRhdGEubGVuZ3RoID0gMDsKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCi0JewotCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA8IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbikKLQkJcmV0dXJuIC1FMkJJRzsKKwlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkgeworCQlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pCisJCQlyZXR1cm4gLUUyQklHOwogCi0Jd3JxdS0+ZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47Ci0JbWVtY3B5KGV4dHJhLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOwotCX0KLQllbHNlCi0JewotCQlVQ0hBUiBSU05JZSA9IElFX1dQQTsKKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJCW1lbWNweShleHRyYSwgJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwl9IGVsc2UgeworCQl1OCBSU05JZSA9IElFX1dQQTsKIAotCQlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCAocEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMikpIC8vIElELCBMZW4KKwkJaWYgKHdycXUtPmRhdGEubGVuZ3RoIDwgKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDIpKQkvKiBJRCwgTGVuICovCiAJCQlyZXR1cm4gLUUyQklHOwogCQl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDI7CiAKIAkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAotICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpKQorCQkgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpKQogCQkJUlNOSWUgPSBJRV9SU047CiAKIAkJZXh0cmFbMF0gPSAoY2hhcilSU05JZTsKIAkJZXh0cmFbMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47Ci0JCW1lbWNweShleHRyYSsyLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCQltZW1jcHkoZXh0cmEgKyAyLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLAorCQkgICAgICAgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX3Npd3Bta3NhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKLQkJCSAgIGNoYXIgKmV4dHJhKQorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CiAJc3RydWN0IGl3X3Bta3NhICpwUG1rc2EgPSAoc3RydWN0IGl3X3Bta3NhICopd3JxdS0+ZGF0YS5wb2ludGVyOwotCUlOVAlDYWNoZWRJZHggPSAwLCBpZHggPSAwOworCWludCBDYWNoZWRJZHggPSAwLCBpZHggPSAwOworCisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBkZXYpOwogCiAJaWYgKHBQbWtzYSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT4gcnRfaW9jdGxfc2l3cG1rc2FcbiIpKTsKLQlzd2l0Y2gocFBta3NhLT5jbWQpCi0JewotCQljYXNlIElXX1BNS1NBX0ZMVVNIOgotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUssIHNpemVvZihCU1NJRF9JTkZPKSpQTUtJRF9OTyk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX0ZMVVNIXG4iKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJV19QTUtTQV9SRU1PVkU6Ci0JCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKLQkJCXsKLQkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAotCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQotCQkgICAgICAgIHsKLQkJICAgICAgICAJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgTUFDX0FERFJfTEVOKTsKLQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRCwgMTYpOwotCQkJCQlmb3IgKGlkeCA9IENhY2hlZElkeDsgaWR4IDwgKHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtIC0gMSk7IGlkeCsrKQotCQkJCQl7Ci0JCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5CU1NJRFswXSwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeCsxXS5CU1NJRFswXSwgTUFDX0FERFJfTEVOKTsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLlBNS0lEWzBdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4KzFdLlBNS0lEWzBdLCAxNik7Ci0JCQkJCX0KLQkJCQkJcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0tLTsKLQkJCSAgICAgICAgYnJlYWs7Ci0JCSAgICAgICAgfQotCSAgICAgICAgfQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnRfaW9jdGxfc2l3cG1rc2FcbiIpKTsKKwlzd2l0Y2ggKHBQbWtzYS0+Y21kKSB7CisJY2FzZSBJV19QTUtTQV9GTFVTSDoKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUssCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9ic3NpZF9pbmZvKSAqIFBNS0lEX05PKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX0ZMVVNIXG4iKSk7CisJCWJyZWFrOworCWNhc2UgSVdfUE1LU0FfUkVNT1ZFOgorCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOworCQkgICAgIENhY2hlZElkeCsrKSB7CisJCQkvKiBjb21wYXJlIHRoZSBCU1NJRCAqLworCQkJaWYgKE5kaXNFcXVhbE1lbW9yeQorCQkJICAgIChwUG1rc2EtPmJzc2lkLnNhX2RhdGEsCisJCQkgICAgIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsCisJCQkgICAgIE1BQ19BRERSX0xFTikpIHsKKwkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLgorCQkJCQkgICAgICAgQlNTSUQsIE1BQ19BRERSX0xFTik7CisJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS4KKwkJCQkJICAgICAgIFBNS0lELCAxNik7CisJCQkJZm9yIChpZHggPSBDYWNoZWRJZHg7CisJCQkJICAgICBpZHggPCAocEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0gLSAxKTsKKwkJCQkgICAgIGlkeCsrKSB7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy4KKwkJCQkJCSAgICAgICBTYXZlZFBNS1tpZHhdLkJTU0lEWzBdLAorCQkJCQkJICAgICAgICZwQWQtPlN0YUNmZy4KKwkJCQkJCSAgICAgICBTYXZlZFBNS1tpZHggKworCQkJCQkJCQkxXS5CU1NJRFswXSwKKwkJCQkJCSAgICAgICBNQUNfQUREUl9MRU4pOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuCisJCQkJCQkgICAgICAgU2F2ZWRQTUtbaWR4XS5QTUtJRFswXSwKKwkJCQkJCSAgICAgICAmcEFkLT5TdGFDZmcuCisJCQkJCQkgICAgICAgU2F2ZWRQTUtbaWR4ICsKKwkJCQkJCQkJMV0uUE1LSURbMF0sCisJCQkJCQkgICAgICAgMTYpOworCQkJCX0KKwkJCQlwQWQtPlN0YUNmZy5TYXZlZFBNS051bS0tOworCQkJCWJyZWFrOworCQkJfQorCQl9CiAKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfUkVNT1ZFXG4iKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJV19QTUtTQV9BREQ6Ci0JCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKLQkJCXsKLQkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAotCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQotCQkJICAgICAgICBicmVhazsKLQkgICAgICAgIH0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX1JFTU9WRVxuIikpOworCQlicmVhazsKKwljYXNlIElXX1BNS1NBX0FERDoKKwkJZm9yIChDYWNoZWRJZHggPSAwOyBDYWNoZWRJZHggPCBwQWQtPlN0YUNmZy5TYXZlZFBNS051bTsKKwkJICAgICBDYWNoZWRJZHgrKykgeworCQkJLyogY29tcGFyZSB0aGUgQlNTSUQgKi8KKwkJCWlmIChOZGlzRXF1YWxNZW1vcnkKKwkJCSAgICAocFBta3NhLT5ic3NpZC5zYV9kYXRhLAorCQkJICAgICBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELAorCQkJICAgICBNQUNfQUREUl9MRU4pKQorCQkJCWJyZWFrOworCQl9CiAKLQkgICAgICAgIC8vIEZvdW5kLCByZXBsYWNlIGl0Ci0JICAgICAgICBpZiAoQ2FjaGVkSWR4IDwgUE1LSURfTk8pCi0JICAgICAgICB7Ci0JCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBQTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOwotCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lEWzBdLCBwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIE1BQ19BRERSX0xFTik7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uUE1LSURbMF0sIHBQbWtzYS0+cG1raWQsIDE2KTsKLQkJICAgICAgICBwQWQtPlN0YUNmZy5TYXZlZFBNS051bSsrOwotCSAgICAgICAgfQotCSAgICAgICAgLy8gTm90IGZvdW5kLCByZXBsYWNlIHRoZSBsYXN0IG9uZQotCSAgICAgICAgZWxzZQotCSAgICAgICAgewotCQkgICAgICAgIC8vIFJhbmRvbWx5IHJlcGxhY2Ugb25lCi0JCSAgICAgICAgQ2FjaGVkSWR4ID0gKHBQbWtzYS0+YnNzaWQuc2FfZGF0YVs1XSAlIFBNS0lEX05PKTsKLQkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIFBNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7Ci0JCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSURbMF0sIHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRFswXSwgcFBta3NhLT5wbWtpZCwgMTYpOwotCSAgICAgICAgfQorCQkvKiBGb3VuZCwgcmVwbGFjZSBpdCAqLworCQlpZiAoQ2FjaGVkSWR4IDwgUE1LSURfTk8pIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwKKwkJCQkgKCJVcGRhdGUgUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLgorCQkJCSAgICAgICBCU1NJRFswXSwgcFBta3NhLT5ic3NpZC5zYV9kYXRhLAorCQkJCSAgICAgICBNQUNfQUREUl9MRU4pOworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uCisJCQkJICAgICAgIFBNS0lEWzBdLCBwUG1rc2EtPnBta2lkLCAxNik7CisJCQlwQWQtPlN0YUNmZy5TYXZlZFBNS051bSsrOworCQl9CisJCS8qIE5vdCBmb3VuZCwgcmVwbGFjZSB0aGUgbGFzdCBvbmUgKi8KKwkJZWxzZSB7CisJCQkvKiBSYW5kb21seSByZXBsYWNlIG9uZSAqLworCQkJQ2FjaGVkSWR4ID0gKHBQbWtzYS0+YnNzaWQuc2FfZGF0YVs1XSAlIFBNS0lEX05PKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwKKwkJCQkgKCJVcGRhdGUgUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLgorCQkJCSAgICAgICBCU1NJRFswXSwgcFBta3NhLT5ic3NpZC5zYV9kYXRhLAorCQkJCSAgICAgICBNQUNfQUREUl9MRU4pOworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uCisJCQkJICAgICAgIFBNS0lEWzBdLCBwUG1rc2EtPnBta2lkLCAxNik7CisJCX0KIAotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBJV19QTUtTQV9BRERcbiIpKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBVbmtub3cgQ29tbWFuZCEhXG4iKSk7Ci0JCQlicmVhazsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX0FERFxuIikpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoInJ0X2lvY3RsX3Npd3Bta3NhIC0gVW5rbm93biBDb21tYW5kIVxuIikpOworCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX3Npd3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7Ci0gICAgVUlOVDMyICAgICAgICAgIHJhdGUgPSB3cnF1LT5iaXRyYXRlLnZhbHVlLCBmaXhlZCA9IHdycXUtPmJpdHJhdGUuZml4ZWQ7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKKwl1MzIgcmF0ZSA9IHdycXUtPmJpdHJhdGUudmFsdWUsIGZpeGVkID0gd3JxdS0+Yml0cmF0ZS5maXhlZDsKIAotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0gIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgIAlyZXR1cm4gLUVORVRET1dOOworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgZGV2KTsKKworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJydF9pb2N0bF9zaXdyYXRlOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CiAJfQogCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6KHJhdGUgPSAlZCwgZml4ZWQgPSAlZClcbiIsIHJhdGUsIGZpeGVkKSk7Ci0gICAgLyogcmF0ZSA9IC0xID0+IGF1dG8gcmF0ZQotICAgICAgIHJhdGUgPSBYLCBmaXhlZCA9IDEgPT4gKGZpeGVkIHJhdGUgWCkKLSAgICAqLwotICAgIGlmIChyYXRlID09IC0xKQotICAgIHsKLQkJLy9BdXRvIFJhdGUKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgicnRfaW9jdGxfc2l3cmF0ZTo6KHJhdGUgPSAlZCwgZml4ZWQgPSAlZClcbiIsIHJhdGUsIGZpeGVkKSk7CisJLyogcmF0ZSA9IC0xID0+IGF1dG8gcmF0ZQorCSAgIHJhdGUgPSBYLCBmaXhlZCA9IDEgPT4gKGZpeGVkIHJhdGUgWCkKKwkgKi8KKwlpZiAocmF0ZSA9PSAtMSkgeworCQkvKkF1dG8gUmF0ZSAqLwogCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOwogCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CiAJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fAotCQkgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkKKwkJICAgIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9CisJCSAgICAgTU9ERV9PRkRNKSkKIAkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAtMSk7CiAKIAkJU2V0Q29tbW9uSFQocEFkKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKGZpeGVkKQotICAgICAgICB7Ci0gICAgICAgIAlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8Ci0gICAgICAgICAgICAgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkKLSAgICAgICAgICAgICAgICBSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgcmF0ZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKLSAgICAgICAgICAgICAgICBTZXRDb21tb25IVChwQWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6KEh0TWNzPSVkKVxuIixwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETzogcmF0ZSA9IFgsIGZpeGVkID0gMCA9PiAocmF0ZXMgPD0gWCkKLSAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKLSAgICAgICAgfQotICAgIH0KKwl9IGVsc2UgeworCQlpZiAoZml4ZWQpIHsKKwkJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwKKwkJCSAgICAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuCisJCQkgICAgIE1PREUgPD0gTU9ERV9PRkRNKSkKKwkJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgcmF0ZSk7CisJCQllbHNlIHsKKwkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkJICAgIE1DU19BVVRPOworCQkJCVNldENvbW1vbkhUKHBBZCk7CisJCQl9CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJydF9pb2N0bF9zaXdyYXRlOjooSHRNY3M9JWQpXG4iLAorCQkJCSAgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC4KKwkJCQkgIE1DUykpOworCQl9IGVsc2UgeworCQkJLyogVE9ETzogcmF0ZSA9IFgsIGZpeGVkID0gMCA9PiAocmF0ZXMgPD0gWCkgKi8KKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJfQorCX0KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBpbnQgcnRfaW9jdGxfZ2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCisJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLSAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OwotICAgIGludCByYXRlX2luZGV4ID0gMCwgcmF0ZV9jb3VudCA9IDA7Ci0gICAgSFRUUkFOU01JVF9TRVRUSU5HIGh0X3NldHRpbmc7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKKwlpbnQgcmF0ZV9pbmRleCA9IDAsIHJhdGVfY291bnQgPSAwOworCUhUVFJBTlNNSVRfU0VUVElORyBodF9zZXR0aW5nOworLyogUmVtb3ZlIHRvIGdsb2JhbCB2YXJpYWJsZQogICAgIF9fczMyIHJhbGlua3JhdGVbXSA9CiAJezIsICA0LCAgIDExLCAgMjIsIC8vIENDSwogCTEyLCAxOCwgICAyNCwgIDM2LCA0OCwgNzIsIDk2LCAxMDgsIC8vIE9GRE0KQEAgLTI1NDMsMzI5ICsyMzM4LDI5NSBAQAogCTQzLCA4NywgIDEzMCwgMTczLCAyNjAsIDMxNywgMzkwLCA0MzMsCQkJCQkJCQkJCSAgLy8gMjBNSHosIDQwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKIAkzMCwgNjAsICAgOTAsIDEyMCwgMTgwLCAyNDAsIDI3MCwgMzAwLCA2MCwgMTIwLCAxODAsIDI0MCwgMzYwLCA0ODAsIDU0MCwgNjAwLCAvLyA0ME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1CiAJOTAsIDE4MCwgMjcwLCAzNjAsIDU0MCwgNzIwLCA4MTAsIDkwMH07CQkJCQkJCQkJCSAgLy8gNDBNSHosIDQwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKyovCisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBkZXYpOwogCi0gICAgcmF0ZV9jb3VudCA9IHNpemVvZihyYWxpbmtyYXRlKS9zaXplb2YoX19zMzIpOwotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0gIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgIAlyZXR1cm4gLUVORVRET1dOOworCXJhdGVfY291bnQgPSBzaXplb2YocmFsaW5rcmF0ZSkgLyBzaXplb2YoX19zMzIpOworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlyZXR1cm4gLUVORVRET1dOOwogCX0KIAotICAgIGlmICgocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gRkFMU0UpICYmCi0gICAgICAgIChJTkZSQV9PTihwQWQpKSAmJgotICAgICAgICAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkpCi0gICAgICAgIGh0X3NldHRpbmcud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOwotICAgIGVsc2UKLSAgICAgICAgaHRfc2V0dGluZy53b3JkID0gcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZDsKKwlpZiAoKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IEZBTFNFKSAmJgorCSAgICAoSU5GUkFfT04ocEFkKSkgJiYKKwkgICAgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpCisJICAgICB8fCAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PQorCQkgTU9ERV9PRkRNKSkpCisJCWh0X3NldHRpbmcud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOworCWVsc2UKKwkJaHRfc2V0dGluZy53b3JkID0KKwkJICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQ7CiAKLSAgICBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCi0gICAgewotICAgIAlyYXRlX2luZGV4ID0gMTIgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuQlcgKjI0KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5TaG9ydEdJICo0OCkgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuTUNTKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPT0gTU9ERV9PRkRNKQotICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShodF9zZXR0aW5nLmZpZWxkLk1DUykgKyA0OwotICAgIGVsc2UgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA9PSBNT0RFX0NDSykKLSAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikoaHRfc2V0dGluZy5maWVsZC5NQ1MpOworCWlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkgeworLyogICAgICByYXRlX2luZGV4ID0gMTIgKyAoKHU4KWh0X3NldHRpbmcuZmllbGQuQlcgKjE2KSArICgodTgpaHRfc2V0dGluZy5maWVsZC5TaG9ydEdJICozMikgKyAoKHU4KWh0X3NldHRpbmcuZmllbGQuTUNTKTsgKi8KKwkJcmF0ZV9pbmRleCA9CisJCSAgICAxMiArICgodTgpaHRfc2V0dGluZy5maWVsZC5CVyAqIDI0KSArCisJCSAgICAoKHU4KWh0X3NldHRpbmcuZmllbGQuU2hvcnRHSSAqIDQ4KSArCisJCSAgICAoKHU4KWh0X3NldHRpbmcuZmllbGQuTUNTKTsKKwl9IGVsc2UgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA9PSBNT0RFX09GRE0pCisJCXJhdGVfaW5kZXggPSAodTgpKGh0X3NldHRpbmcuZmllbGQuTUNTKSArIDQ7CisJZWxzZSBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID09IE1PREVfQ0NLKQorCQlyYXRlX2luZGV4ID0gKHU4KShodF9zZXR0aW5nLmZpZWxkLk1DUyk7CiAKLSAgICBpZiAocmF0ZV9pbmRleCA8IDApCi0gICAgICAgIHJhdGVfaW5kZXggPSAwOworCWlmIChyYXRlX2luZGV4IDwgMCkKKwkJcmF0ZV9pbmRleCA9IDA7CiAKLSAgICBpZiAocmF0ZV9pbmRleCA+IHJhdGVfY291bnQpCi0gICAgICAgIHJhdGVfaW5kZXggPSByYXRlX2NvdW50OworCWlmIChyYXRlX2luZGV4ID4gcmF0ZV9jb3VudCkKKwkJcmF0ZV9pbmRleCA9IHJhdGVfY291bnQ7CiAKLSAgICB3cnF1LT5iaXRyYXRlLnZhbHVlID0gcmFsaW5rcmF0ZVtyYXRlX2luZGV4XSAqIDUwMDAwMDsKLSAgICB3cnF1LT5iaXRyYXRlLmRpc2FibGVkID0gMDsKKwl3cnF1LT5iaXRyYXRlLnZhbHVlID0gcmFsaW5rcmF0ZVtyYXRlX2luZGV4XSAqIDUwMDAwMDsKKwl3cnF1LT5iaXRyYXRlLmRpc2FibGVkID0gMDsKIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3QgaXdfaGFuZGxlciBydF9oYW5kbGVyW10gPQotewotCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NTSVdDT01NSVQgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmFtZSwJCQkvKiBTSU9DR0lXTkFNRSAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ1NJV05XSUQgICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NHSVdOV0lEICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZnJlcSwJCSAgICAvKiBTSU9DU0lXRlJFUSAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2ZyZXEsCQkgICAgLyogU0lPQ0dJV0ZSRVEgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtb2RlLAkJICAgIC8qIFNJT0NTSVdNT0RFICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bW9kZSwJCSAgICAvKiBTSU9DR0lXTU9ERSAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NFTlMgICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTRU5TICAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdSQU5HRSAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmFuZ2UsCQkgICAgLyogU0lPQ0dJV1JBTkdFICAqLwotCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1BSSVYgICAqLwotCShpd19oYW5kbGVyKSBOVUxMIC8qIGtlcm5lbCBjb2RlICovLCAgICAvKiBTSU9DR0lXUFJJViAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXU1RBVFMgICovCi0JKGl3X2hhbmRsZXIpIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMgLyoga2VybmVsIGNvZGUgKi8sICAgIC8qIFNJT0NHSVdTVEFUUyAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1BZICAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NQWSAgICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdUSFJTUFkgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DR0lXVEhSU1BZICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2FwLCAgICAgICAgICAgIC8qIFNJT0NTSVdBUCAgICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3YXAsCQkgICAgLyogU0lPQ0dJV0FQICAgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtbG1lLAkgICAgICAgIC8qIFNJT0NTSVdNTE1FICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfaXdhcGxpc3QsCQkgICAgLyogU0lPQ0dJV0FQTElTVCAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdzY2FuLAkJICAgIC8qIFNJT0NTSVdTQ0FOICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3c2NhbiwJCSAgICAvKiBTSU9DR0lXU0NBTiAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2Vzc2lkLAkJICAgIC8qIFNJT0NTSVdFU1NJRCAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZXNzaWQsCQkgICAgLyogU0lPQ0dJV0VTU0lEICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXduaWNrbiwJCSAgICAvKiBTSU9DU0lXTklDS04gICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd25pY2tuLAkJICAgIC8qIFNJT0NHSVdOSUNLTiAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiAtLSBob2xlIC0tICAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogLS0gaG9sZSAtLSAgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdyYXRlLCAgICAgICAgICAvKiBTSU9DU0lXUkFURSAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3JhdGUsICAgICAgICAgIC8qIFNJT0NHSVdSQVRFICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cnRzLAkJICAgIC8qIFNJT0NTSVdSVFMgICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cnRzLAkJICAgIC8qIFNJT0NHSVdSVFMgICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZnJhZywJCSAgICAvKiBTSU9DU0lXRlJBRyAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2ZyYWcsCQkgICAgLyogU0lPQ0dJV0ZSQUcgICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdUWFBPVyAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXVFhQT1cgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1JFVFJZICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdSRVRSWSAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZW5jb2RlLAkJLyogU0lPQ1NJV0VOQ09ERSAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlbmNvZGUsCQkvKiBTSU9DR0lXRU5DT0RFICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1BPV0VSICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdQT1dFUiAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJCQkvKiAtLSBob2xlIC0tICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJCQkJLyogLS0gaG9sZSAtLSAqLwotICAgIChpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdnZW5pZSwgICAgICAgICAvKiBTSU9DU0lXR0VOSUUgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2dlbmllLCAgICAgICAgIC8qIFNJT0NHSVdHRU5JRSAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3YXV0aCwJCSAgICAvKiBTSU9DU0lXQVVUSCAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2F1dGgsCQkgICAgLyogU0lPQ0dJV0FVVEggICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlbmNvZGVleHQsCSAgICAvKiBTSU9DU0lXRU5DT0RFRVhUICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2VuY29kZWV4dCwJCS8qIFNJT0NHSVdFTkNPREVFWFQgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cG1rc2EsICAgICAgICAgLyogU0lPQ1NJV1BNS1NBICAqLworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcnRfaGFuZGxlcltdID0geworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXQ09NTUlUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd25hbWUsCS8qIFNJT0NHSVdOQU1FICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV05XSUQgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXTldJRCAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2ZyZXEsCS8qIFNJT0NTSVdGUkVRICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZnJlcSwJLyogU0lPQ0dJV0ZSRVEgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtb2RlLAkvKiBTSU9DU0lXTU9ERSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd21vZGUsCS8qIFNJT0NHSVdNT0RFICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV1NFTlMgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXU0VOUyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8gLAkvKiBTSU9DU0lXUkFOR0UgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3JhbmdlLAkvKiBTSU9DR0lXUkFOR0UgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8gLAkvKiBTSU9DU0lXUFJJViAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyoga2VybmVsIGNvZGUgKi8gLAkvKiBTSU9DR0lXUFJJViAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8gLAkvKiBTSU9DU0lXU1RBVFMgICovCisJKGl3X2hhbmRsZXIpIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMgLyoga2VybmVsIGNvZGUgKi8gLAkvKiBTSU9DR0lXU1RBVFMgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdTUFkgICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ0dJV1NQWSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXVEhSU1BZICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdUSFJTUFkgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3YXAsCS8qIFNJT0NTSVdBUCAgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3YXAsCS8qIFNJT0NHSVdBUCAgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bWxtZSwJLyogU0lPQ1NJV01MTUUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9pd2FwbGlzdCwJLyogU0lPQ0dJV0FQTElTVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdzY2FuLAkvKiBTSU9DU0lXU0NBTiAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3NjYW4sCS8qIFNJT0NHSVdTQ0FOICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZXNzaWQsCS8qIFNJT0NTSVdFU1NJRCAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZXNzaWQsCS8qIFNJT0NHSVdFU1NJRCAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bmlja24sCS8qIFNJT0NTSVdOSUNLTiAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmlja24sCS8qIFNJT0NHSVdOSUNLTiAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogLS0gaG9sZSAtLSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiAtLSBob2xlIC0tICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3JhdGUsCS8qIFNJT0NTSVdSQVRFICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmF0ZSwJLyogU0lPQ0dJV1JBVEUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdydHMsCS8qIFNJT0NTSVdSVFMgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cnRzLAkvKiBTSU9DR0lXUlRTICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2ZyYWcsCS8qIFNJT0NTSVdGUkFHICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZnJhZywJLyogU0lPQ0dJV0ZSQUcgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXVFhQT1cgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdUWFBPVyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV1JFVFJZICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXUkVUUlkgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2VuY29kZSwJLyogU0lPQ1NJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlbmNvZGUsCS8qIFNJT0NHSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV1BPV0VSICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXUE9XRVIgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdnZW5pZSwJLyogU0lPQ1NJV0dFTklFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdnZW5pZSwJLyogU0lPQ0dJV0dFTklFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdhdXRoLAkvKiBTSU9DU0lXQVVUSCAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2F1dGgsCS8qIFNJT0NHSVdBVVRIICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZW5jb2RlZXh0LAkvKiBTSU9DU0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2VuY29kZWV4dCwJLyogU0lPQ0dJV0VOQ09ERUVYVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdwbWtzYSwJLyogU0lPQ1NJV1BNS1NBICAqLwogfTsKIAotc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcnRfcHJpdl9oYW5kbGVyc1tdID0gewotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAxICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3NldHBhcmFtLCAvKiArIDB4MDIgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAzICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNCAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDUgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA2ICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNyAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDggKi8KLQkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcywgLyogKyAweDA5ICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQSAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEIgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBDICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRCAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEUgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBGICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMCAqLwotCShpd19oYW5kbGVyKSBydF9wcml2YXRlX3Nob3csIC8qICsgMHgxMSAqLwotICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTIgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEzICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNSAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTcgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE4ICovCi19OwotCi1jb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcnQyOHh4X2l3X2hhbmRsZXJfZGVmID0KLXsKLSNkZWZpbmUJTihhKQkoc2l6ZW9mIChhKSAvIHNpemVvZiAoYVswXSkpCi0JLnN0YW5kYXJkCT0gKGl3X2hhbmRsZXIgKikgcnRfaGFuZGxlciwKLQkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKHJ0X2hhbmRsZXIpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAotCS5wcml2YXRlCT0gKGl3X2hhbmRsZXIgKikgcnRfcHJpdl9oYW5kbGVycywKLQkubnVtX3ByaXZhdGUJCT0gTihydF9wcml2X2hhbmRsZXJzKSwKLQkucHJpdmF0ZV9hcmdzCT0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKikgcHJpdnRhYiwKLQkubnVtX3ByaXZhdGVfYXJncwk9IE4ocHJpdnRhYiksCitjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcnQyOHh4X2l3X2hhbmRsZXJfZGVmID0geworCS5zdGFuZGFyZCA9IChpd19oYW5kbGVyICopIHJ0X2hhbmRsZXIsCisJLm51bV9zdGFuZGFyZCA9IHNpemVvZihydF9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKICNpZiBJV19IQU5ETEVSX1ZFUlNJT04gPj0gNwotICAgIC5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzLAorCS5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzLAogI2VuZGlmCiB9OwogCi1JTlQgcnQyOHh4X3N0YV9pb2N0bCgKLQlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKLQlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKLQlJTglJTlQJCQkJCWNtZCkKK2ludCBydDI4eHhfc3RhX2lvY3RsKElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAorCQkgICAgIElOIE9VVCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQogewotCVJUTVBfQURBUFRFUiAqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQlzdHJ1Y3QgaXdyZXEgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOwotCUJPT0xFQU4JCQkJU3RhdGVNYWNoaW5lVG91Y2hlZCA9IEZBTFNFOwotCUlOVAkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcnE7CisJQk9PTEVBTiBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisJaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAKLSAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgewotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JCSAgICByZXR1cm4gLUVORVRET1dOOwotICAgICAgICB9Ci0gICAgfQorCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgbmV0X2Rldik7CiAKLQl7CS8vIGRldGVybWluZSB0aGlzIGlvY3RsIGNvbW1hbmQgaXMgY29tbWluZyBmcm9tIHdoaWNoIGludGVyZmFjZS4KKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQkJcmV0dXJuIC1FTkVURE9XTjsKKwkJfQorCX0KKworCXsJCQkvKiBkZXRlcm1pbmUgdGhpcyBpb2N0bCBjb21tYW5kIGlzIGNvbW1pbmcgZnJvbSB3aGljaCBpbnRlcmZhY2UuICovCiAJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKIAkJcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKIAl9CiAKLQlzd2l0Y2goY21kKQotCXsKLSAgICAgICAgY2FzZSBTSU9DR0lGSFdBRERSOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NHSUZIV0FERFJcbiIpKTsKLQkJCW1lbWNweSh3cnEtPnUubmFtZSwgcEFkLT5DdXJyZW50QWRkcmVzcywgRVRIX0FMRU4pOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0lPQ0dJV05BTUU6Ci0gICAgICAgIHsKLSAgICAgICAgCWNoYXIgKm5hbWU9JndycS0+dS5uYW1lWzBdOwotICAgICAgICAJcnRfaW9jdGxfZ2l3bmFtZShuZXRfZGV2LCBOVUxMLCBuYW1lLCBOVUxMKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0dJRkhXQUREUjoKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NHSUZIV0FERFJcbiIpKTsKKwkJbWVtY3B5KHdycS0+dS5uYW1lLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFVEhfQUxFTik7CisJCWJyZWFrOworCWNhc2UgU0lPQ0dJV05BTUU6CisJCXsKKwkJCWNoYXIgKm5hbWUgPSAmd3JxLT51Lm5hbWVbMF07CisJCQlydF9pb2N0bF9naXduYW1lKG5ldF9kZXYsIE5VTEwsIG5hbWUsIE5VTEwpOwogCQkJYnJlYWs7CiAJCX0KLQkJY2FzZSBTSU9DR0lXRVNTSUQ6ICAvL0dldCBFU1NJRAotICAgICAgICB7Ci0gICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmVzc2lkPSZ3cnEtPnUuZXNzaWQ7Ci0gICAgICAgIAlydF9pb2N0bF9naXdlc3NpZChuZXRfZGV2LCBOVUxMLCBlc3NpZCwgZXNzaWQtPnBvaW50ZXIpOworCWNhc2UgU0lPQ0dJV0VTU0lEOgkvKkdldCBFU1NJRCAqLworCQl7CisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmVzc2lkID0gJndycS0+dS5lc3NpZDsKKwkJCXJ0X2lvY3RsX2dpd2Vzc2lkKG5ldF9kZXYsIE5VTEwsIGVzc2lkLCBlc3NpZC0+cG9pbnRlcik7CiAJCQlicmVhazsKIAkJfQotCQljYXNlIFNJT0NTSVdFU1NJRDogIC8vU2V0IEVTU0lECi0gICAgICAgIHsKLSAgICAgICAgCXN0cnVjdCBpd19wb2ludAkqZXNzaWQ9JndycS0+dS5lc3NpZDsKLSAgICAgICAgCXJ0X2lvY3RsX3Npd2Vzc2lkKG5ldF9kZXYsIE5VTEwsIGVzc2lkLCBlc3NpZC0+cG9pbnRlcik7CisJY2FzZSBTSU9DU0lXRVNTSUQ6CS8qU2V0IEVTU0lEICovCisJCXsKKwkJCXN0cnVjdCBpd19wb2ludCAqZXNzaWQgPSAmd3JxLT51LmVzc2lkOworCQkJcnRfaW9jdGxfc2l3ZXNzaWQobmV0X2RldiwgTlVMTCwgZXNzaWQsIGVzc2lkLT5wb2ludGVyKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWNhc2UgU0lPQ1NJV05XSUQ6ICAgLy8gc2V0IG5ldHdvcmsgaWQgKHRoZSBjZWxsKQotCQljYXNlIFNJT0NHSVdOV0lEOiAgIC8vIGdldCBuZXR3b3JrIGlkCi0JCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKLQkJCWJyZWFrOwotCQljYXNlIFNJT0NTSVdGUkVROiAgIC8vc2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikKLSAgICAgICAgewotICAgICAgICAJc3RydWN0IGl3X2ZyZXEgKmZyZXE9JndycS0+dS5mcmVxOwotICAgICAgICAJcnRfaW9jdGxfc2l3ZnJlcShuZXRfZGV2LCBOVUxMLCBmcmVxLCBOVUxMKTsKKwljYXNlIFNJT0NTSVdOV0lEOgkvKiBzZXQgbmV0d29yayBpZCAodGhlIGNlbGwpICovCisJY2FzZSBTSU9DR0lXTldJRDoJLyogZ2V0IG5ldHdvcmsgaWQgKi8KKwkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCWNhc2UgU0lPQ1NJV0ZSRVE6CS8qc2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikgKi8KKwkJeworCQkJc3RydWN0IGl3X2ZyZXEgKmZyZXEgPSAmd3JxLT51LmZyZXE7CisJCQlydF9pb2N0bF9zaXdmcmVxKG5ldF9kZXYsIE5VTEwsIGZyZXEsIE5VTEwpOwogCQkJYnJlYWs7CiAJCX0KLQkJY2FzZSBTSU9DR0lXRlJFUTogICAvLyBnZXQgY2hhbm5lbC9mcmVxdWVuY3kgKEh6KQotICAgICAgICB7Ci0gICAgICAgIAlzdHJ1Y3QgaXdfZnJlcSAqZnJlcT0md3JxLT51LmZyZXE7Ci0gICAgICAgIAlydF9pb2N0bF9naXdmcmVxKG5ldF9kZXYsIE5VTEwsIGZyZXEsIE5VTEwpOworCWNhc2UgU0lPQ0dJV0ZSRVE6CS8qIGdldCBjaGFubmVsL2ZyZXF1ZW5jeSAoSHopICovCisJCXsKKwkJCXN0cnVjdCBpd19mcmVxICpmcmVxID0gJndycS0+dS5mcmVxOworCQkJcnRfaW9jdGxfZ2l3ZnJlcShuZXRfZGV2LCBOVUxMLCBmcmVxLCBOVUxMKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWNhc2UgU0lPQ1NJV05JQ0tOOiAvL3NldCBub2RlIG5hbWUvbmlja25hbWUKLSAgICAgICAgewotICAgICAgICAJc3RydWN0IGl3X3BvaW50ICpkYXRhPSZ3cnEtPnUuZGF0YTsKLSAgICAgICAgCXJ0X2lvY3RsX3Npd25pY2tuKG5ldF9kZXYsIE5VTEwsIGRhdGEsIE5VTEwpOworCWNhc2UgU0lPQ1NJV05JQ0tOOgkvKnNldCBub2RlIG5hbWUvbmlja25hbWUgKi8KKwkJeworCQkJLypzdHJ1Y3QgaXdfcG9pbnQgKmRhdGE9JndycS0+dS5kYXRhOyAqLworCQkJLypydF9pb2N0bF9zaXduaWNrbihuZXRfZGV2LCBOVUxMLCBkYXRhLCBOVUxMKTsgKi8KIAkJCWJyZWFrOwogCQl9Ci0JCWNhc2UgU0lPQ0dJV05JQ0tOOiAvL2dldCBub2RlIG5hbWUvbmlja25hbWUKLSAgICAgICAgewotICAgICAgICAJc3RydWN0IGl3X3BvaW50ICpkYXRhPSZ3cnEtPnUuZGF0YTsKLSAgICAgICAgCXJ0X2lvY3RsX2dpd25pY2tuKG5ldF9kZXYsIE5VTEwsIGRhdGEsIE5VTEwpOworCWNhc2UgU0lPQ0dJV05JQ0tOOgkvKmdldCBub2RlIG5hbWUvbmlja25hbWUgKi8KKwkJeworCQkJc3RydWN0IGl3X3BvaW50ICplcnEgPSBOVUxMOworCQkJZXJxID0gJndycS0+dS5kYXRhOworCQkJZXJxLT5sZW5ndGggPSBzdHJsZW4oKGNoYXIgKilwQWQtPm5pY2tuYW1lKTsKKwkJCVN0YXR1cyA9CisJCQkgICAgY29weV90b191c2VyKGVycS0+cG9pbnRlciwgcEFkLT5uaWNrbmFtZSwKKwkJCQkJIGVycS0+bGVuZ3RoKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWNhc2UgU0lPQ0dJV1JBVEU6ICAgLy9nZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKQotCQkgICAgcnRfaW9jdGxfZ2l3cmF0ZShuZXRfZGV2LCBOVUxMLCAmd3JxLT51LCBOVUxMKTsKLSAgICAgICAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNJT0NTSVdSQVRFOiAgLy9zZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKQotCSAgICAgICAgcnRfaW9jdGxfc2l3cmF0ZShuZXRfZGV2LCBOVUxMLCAmd3JxLT51LCBOVUxMKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNJT0NHSVdSVFM6ICAvLyBnZXQgUlRTL0NUUyB0aHJlc2hvbGQgKGJ5dGVzKQotICAgICAgICB7Ci0gICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKnJ0cz0md3JxLT51LnJ0czsKLSAgICAgICAgCXJ0X2lvY3RsX2dpd3J0cyhuZXRfZGV2LCBOVUxMLCBydHMsIE5VTEwpOworCWNhc2UgU0lPQ0dJV1JBVEU6CS8qZ2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykgKi8KKwkJcnRfaW9jdGxfZ2l3cmF0ZShuZXRfZGV2LCBOVUxMLCAmd3JxLT51LCBOVUxMKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DU0lXUkFURToJLypzZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKSAqLworCQlydF9pb2N0bF9zaXdyYXRlKG5ldF9kZXYsIE5VTEwsICZ3cnEtPnUsIE5VTEwpOworCQlicmVhazsKKwljYXNlIFNJT0NHSVdSVFM6CS8qIGdldCBSVFMvQ1RTIHRocmVzaG9sZCAoYnl0ZXMpICovCisJCXsKKwkJCXN0cnVjdCBpd19wYXJhbSAqcnRzID0gJndycS0+dS5ydHM7CisJCQlydF9pb2N0bF9naXdydHMobmV0X2RldiwgTlVMTCwgcnRzLCBOVUxMKTsKIAkJCWJyZWFrOwogCQl9Ci0gICAgICAgIGNhc2UgU0lPQ1NJV1JUUzogIC8vc2V0IFJUUy9DVFMgdGhyZXNob2xkIChieXRlcykKLSAgICAgICAgewotICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpydHM9JndycS0+dS5ydHM7Ci0gICAgICAgIAlydF9pb2N0bF9zaXdydHMobmV0X2RldiwgTlVMTCwgcnRzLCBOVUxMKTsKKwljYXNlIFNJT0NTSVdSVFM6CS8qc2V0IFJUUy9DVFMgdGhyZXNob2xkIChieXRlcykgKi8KKwkJeworCQkJc3RydWN0IGl3X3BhcmFtICpydHMgPSAmd3JxLT51LnJ0czsKKwkJCXJ0X2lvY3RsX3Npd3J0cyhuZXRfZGV2LCBOVUxMLCBydHMsIE5VTEwpOwogCQkJYnJlYWs7CiAJCX0KLSAgICAgICAgY2FzZSBTSU9DR0lXRlJBRzogIC8vZ2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykKLSAgICAgICAgewotICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpmcmFnPSZ3cnEtPnUuZnJhZzsKLSAgICAgICAgCXJ0X2lvY3RsX2dpd2ZyYWcobmV0X2RldiwgTlVMTCwgZnJhZywgTlVMTCk7CisJY2FzZSBTSU9DR0lXRlJBRzoJLypnZXQgZnJhZ21lbnRhdGlvbiB0aHIgKGJ5dGVzKSAqLworCQl7CisJCQlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcgPSAmd3JxLT51LmZyYWc7CisJCQlydF9pb2N0bF9naXdmcmFnKG5ldF9kZXYsIE5VTEwsIGZyYWcsIE5VTEwpOwogCQkJYnJlYWs7CiAJCX0KLSAgICAgICAgY2FzZSBTSU9DU0lXRlJBRzogIC8vc2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykKLSAgICAgICAgewotICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpmcmFnPSZ3cnEtPnUuZnJhZzsKLSAgICAgICAgCXJ0X2lvY3RsX3Npd2ZyYWcobmV0X2RldiwgTlVMTCwgZnJhZywgTlVMTCk7CisJY2FzZSBTSU9DU0lXRlJBRzoJLypzZXQgZnJhZ21lbnRhdGlvbiB0aHIgKGJ5dGVzKSAqLworCQl7CisJCQlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcgPSAmd3JxLT51LmZyYWc7CisJCQlydF9pb2N0bF9zaXdmcmFnKG5ldF9kZXYsIE5VTEwsIGZyYWcsIE5VTEwpOwogCQkJYnJlYWs7CiAJCX0KLSAgICAgICAgY2FzZSBTSU9DR0lXRU5DT0RFOiAgLy9nZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlCi0gICAgICAgIHsKLSAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXJxPSZ3cnEtPnUuZW5jb2Rpbmc7Ci0gICAgICAgIAlpZihlcnEtPnBvaW50ZXIpCi0gICAgICAgIAkJcnRfaW9jdGxfZ2l3ZW5jb2RlKG5ldF9kZXYsIE5VTEwsIGVycSwgZXJxLT5wb2ludGVyKTsKKwljYXNlIFNJT0NHSVdFTkNPREU6CS8qZ2V0IGVuY29kaW5nIHRva2VuICYgbW9kZSAqLworCQl7CisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmVycSA9ICZ3cnEtPnUuZW5jb2Rpbmc7CisJCQlpZiAoZXJxKQorCQkJCXJ0X2lvY3RsX2dpd2VuY29kZShuZXRfZGV2LCBOVUxMLCBlcnEsCisJCQkJCQkgICBlcnEtPnBvaW50ZXIpOwogCQkJYnJlYWs7CiAJCX0KLSAgICAgICAgY2FzZSBTSU9DU0lXRU5DT0RFOiAgLy9zZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlCi0gICAgICAgIHsKLSAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXJxPSZ3cnEtPnUuZW5jb2Rpbmc7Ci0gICAgICAgIAlpZihlcnEtPnBvaW50ZXIpCi0gICAgICAgIAkJcnRfaW9jdGxfc2l3ZW5jb2RlKG5ldF9kZXYsIE5VTEwsIGVycSwgZXJxLT5wb2ludGVyKTsKKwljYXNlIFNJT0NTSVdFTkNPREU6CS8qc2V0IGVuY29kaW5nIHRva2VuICYgbW9kZSAqLworCQl7CisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmVycSA9ICZ3cnEtPnUuZW5jb2Rpbmc7CisJCQlpZiAoZXJxKQorCQkJCXJ0X2lvY3RsX3Npd2VuY29kZShuZXRfZGV2LCBOVUxMLCBlcnEsCisJCQkJCQkgICBlcnEtPnBvaW50ZXIpOwogCQkJYnJlYWs7CiAJCX0KLQkJY2FzZSBTSU9DR0lXQVA6ICAgICAvL2dldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcwotICAgICAgICB7Ci0gICAgICAgIAlzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHI9JndycS0+dS5hcF9hZGRyOwotICAgICAgICAJcnRfaW9jdGxfZ2l3YXAobmV0X2RldiwgTlVMTCwgYXBfYWRkciwgYXBfYWRkci0+c2FfZGF0YSk7CisJY2FzZSBTSU9DR0lXQVA6CS8qZ2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzICovCisJCXsKKwkJCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciA9ICZ3cnEtPnUuYXBfYWRkcjsKKwkJCXJ0X2lvY3RsX2dpd2FwKG5ldF9kZXYsIE5VTEwsIGFwX2FkZHIsCisJCQkJICAgICAgIGFwX2FkZHItPnNhX2RhdGEpOwogCQkJYnJlYWs7CiAJCX0KLQkgICAgY2FzZSBTSU9DU0lXQVA6ICAvL3NldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcwotICAgICAgICB7Ci0gICAgICAgIAlzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHI9JndycS0+dS5hcF9hZGRyOwotICAgICAgICAJcnRfaW9jdGxfc2l3YXAobmV0X2RldiwgTlVMTCwgYXBfYWRkciwgYXBfYWRkci0+c2FfZGF0YSk7CisJY2FzZSBTSU9DU0lXQVA6CS8qc2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzICovCisJCXsKKwkJCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciA9ICZ3cnEtPnUuYXBfYWRkcjsKKwkJCXJ0X2lvY3RsX3Npd2FwKG5ldF9kZXYsIE5VTEwsIGFwX2FkZHIsCisJCQkJICAgICAgIGFwX2FkZHItPnNhX2RhdGEpOwogCQkJYnJlYWs7CiAJCX0KLQkJY2FzZSBTSU9DR0lXTU9ERTogICAvL2dldCBvcGVyYXRpb24gbW9kZQotICAgICAgICB7Ci0gICAgICAgIAlfX3UzMiAqbW9kZT0md3JxLT51Lm1vZGU7Ci0gICAgICAgIAlydF9pb2N0bF9naXdtb2RlKG5ldF9kZXYsIE5VTEwsIG1vZGUsIE5VTEwpOworCWNhc2UgU0lPQ0dJV01PREU6CS8qZ2V0IG9wZXJhdGlvbiBtb2RlICovCisJCXsKKwkJCV9fdTMyICptb2RlID0gJndycS0+dS5tb2RlOworCQkJcnRfaW9jdGxfZ2l3bW9kZShuZXRfZGV2LCBOVUxMLCBtb2RlLCBOVUxMKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWNhc2UgU0lPQ1NJV01PREU6ICAgLy9zZXQgb3BlcmF0aW9uIG1vZGUKLSAgICAgICAgewotICAgICAgICAJX191MzIgKm1vZGU9JndycS0+dS5tb2RlOwotICAgICAgICAJcnRfaW9jdGxfc2l3bW9kZShuZXRfZGV2LCBOVUxMLCBtb2RlLCBOVUxMKTsKKwljYXNlIFNJT0NTSVdNT0RFOgkvKnNldCBvcGVyYXRpb24gbW9kZSAqLworCQl7CisJCQlfX3UzMiAqbW9kZSA9ICZ3cnEtPnUubW9kZTsKKwkJCXJ0X2lvY3RsX3Npd21vZGUobmV0X2RldiwgTlVMTCwgbW9kZSwgTlVMTCk7CiAJCQlicmVhazsKIAkJfQotCQljYXNlIFNJT0NHSVdTRU5TOiAgIC8vZ2V0IHNlbnNpdGl2aXR5IChkQm0pCi0JCWNhc2UgU0lPQ1NJV1NFTlM6CS8vc2V0IHNlbnNpdGl2aXR5IChkQm0pCi0JCWNhc2UgU0lPQ0dJV1BPV0VSOiAgLy9nZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncwotCQljYXNlIFNJT0NTSVdQT1dFUjogIC8vc2V0IFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZ3MKLQkJY2FzZSBTSU9DR0lXVFhQT1c6ICAvL2dldCB0cmFuc21pdCBwb3dlciAoZEJtKQotCQljYXNlIFNJT0NTSVdUWFBPVzogIC8vc2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pCi0JCWNhc2UgU0lPQ0dJV1JBTkdFOgkvL0dldCByYW5nZSBvZiBwYXJhbWV0ZXJzCi0JCWNhc2UgU0lPQ0dJV1JFVFJZOgkvL2dldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCi0JCWNhc2UgU0lPQ1NJV1JFVFJZOgkvL3NldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCi0JCWNhc2UgUlRfUFJJVl9JT0NUTDoKLQkJY2FzZSBSVF9QUklWX0lPQ1RMX0VYVDoKLQkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0lPQ0dJV1BSSVY6Ci0JCQlpZiAod3JxLT51LmRhdGEucG9pbnRlcikKLQkJCXsKLQkJCQlpZiAoIGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihwcml2dGFiKSkgIT0gVFJVRSkKLQkJCQkJYnJlYWs7Ci0JCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHByaXZ0YWIpIC8gc2l6ZW9mKHByaXZ0YWJbMF0pOwotCQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcHJpdnRhYiwgc2l6ZW9mKHByaXZ0YWIpKSkKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFJUUFJJVl9JT0NUTF9TRVQ6Ci0JCQlpZihhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCkgIT0gVFJVRSkKLQkJCQlicmVhazsKLQkJCXJ0X2lvY3RsX3NldHBhcmFtKG5ldF9kZXYsIE5VTEwsIE5VTEwsIHdycS0+dS5kYXRhLnBvaW50ZXIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZOgotCQkJUlRNUElvY3RsR2V0U2l0ZVN1cnZleShwQWQsIHdycSk7Ci0JCSAgICBicmVhazsKLSAgICAgICAgY2FzZSBTSU9DRVRIVE9PTDoKLSAgICAgICAgICAgICAgICBicmVhazsKLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIklPQ1RMOjp1bmtub3duIElPQ1RMJ3MgY21kID0gMHglMDh4XG4iLCBjbWQpKTsKLQkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOwotCQkJYnJlYWs7CisJY2FzZSBTSU9DR0lXU0VOUzoJLypnZXQgc2Vuc2l0aXZpdHkgKGRCbSkgKi8KKwljYXNlIFNJT0NTSVdTRU5TOgkvKnNldCBzZW5zaXRpdml0eSAoZEJtKSAqLworCWNhc2UgU0lPQ0dJV1BPV0VSOgkvKmdldCBQb3dlciBNYW5hZ2VtZW50IHNldHRpbmdzICovCisJY2FzZSBTSU9DU0lXUE9XRVI6CS8qc2V0IFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZ3MgKi8KKwljYXNlIFNJT0NHSVdUWFBPVzoJLypnZXQgdHJhbnNtaXQgcG93ZXIgKGRCbSkgKi8KKwljYXNlIFNJT0NTSVdUWFBPVzoJLypzZXQgdHJhbnNtaXQgcG93ZXIgKGRCbSkgKi8KKwljYXNlIFNJT0NHSVdSQU5HRToJLypHZXQgcmFuZ2Ugb2YgcGFyYW1ldGVycyAqLworCWNhc2UgU0lPQ0dJV1JFVFJZOgkvKmdldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lICovCisJY2FzZSBTSU9DU0lXUkVUUlk6CS8qc2V0IHJldHJ5IGxpbWl0cyBhbmQgbGlmZXRpbWUgKi8KKwljYXNlIFJUX1BSSVZfSU9DVEw6CisJY2FzZSBSVF9QUklWX0lPQ1RMX0VYVDoKKwljYXNlIFJUUFJJVl9JT0NUTF9TRVQ6CisJY2FzZSBSVFBSSVZfSU9DVExfR1NJVEVTVVJWRVk6CisJY2FzZSBTSU9DR0lXUFJJVjoKKwkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCWNhc2UgU0lPQ0VUSFRPT0w6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiSU9DVEw6OnVua25vd24gSU9DVEwncyBjbWQgPSAweCUwOHhcbiIsIGNtZCkpOworCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CiAJfQogCi0gICAgaWYoU3RhdGVNYWNoaW5lVG91Y2hlZCkgLy8gVXBwZXIgbGF5ZXIgc2VudCBhIE1MTUUtcmVsYXRlZCBvcGVyYXRpb25zCi0gICAgCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwlpZiAoU3RhdGVNYWNoaW5lVG91Y2hlZCkJLyogVXBwZXIgbGF5ZXIgc2VudCBhIE1MTUUtcmVsYXRlZCBvcGVyYXRpb25zICovCisJCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7CiAKIAlyZXR1cm4gU3RhdHVzOwogfQpAQCAtMjg3OCw5NSArMjYzOSw3NyBAQAogICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1JTlQgU2V0X1NTSURfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoraW50IFNldF9TU0lEX1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIsIGNoYXIgKmFyZykKIHsKLSAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkLCAqcFNzaWQ9TlVMTDsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IFRSVUU7CisJc3RydWN0IHJ0X25kaXNfODAyXzExX3NzaWQgU3NpZCwgKnBTc2lkID0gTlVMTDsKKwlCT09MRUFOIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKKwlpbnQgc3VjY2VzcyA9IFRSVUU7CiAKLSAgICBpZiggc3RybGVuKGFyZykgPD0gTUFYX0xFTl9PRl9TU0lEKQotICAgIHsKLSAgICAgICAgTmRpc1plcm9NZW1vcnkoJlNzaWQsIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSk7Ci0gICAgICAgIGlmIChzdHJsZW4oYXJnKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShTc2lkLlNzaWQsIGFyZywgc3RybGVuKGFyZykpOwotICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gc3RybGVuKGFyZyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAgIC8vQU5ZIHNzaWQKLSAgICAgICAgewotICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gMDsKLQkJICAgIG1lbWNweShTc2lkLlNzaWQsICIiLCAwKTsKKwlpZiAoc3RybGVuKGFyZykgPD0gTUFYX0xFTl9PRl9TU0lEKSB7CisJCU5kaXNaZXJvTWVtb3J5KCZTc2lkLCBzaXplb2Yoc3RydWN0IHJ0X25kaXNfODAyXzExX3NzaWQpKTsKKwkJaWYgKHN0cmxlbihhcmcpICE9IDApIHsKKwkJCU5kaXNNb3ZlTWVtb3J5KFNzaWQuU3NpZCwgYXJnLCBzdHJsZW4oYXJnKSk7CisJCQlTc2lkLlNzaWRMZW5ndGggPSBzdHJsZW4oYXJnKTsKKwkJfSBlbHNlCQkvKkFOWSBzc2lkICovCisJCXsKKwkJCVNzaWQuU3NpZExlbmd0aCA9IDA7CisJCQltZW1jcHkoU3NpZC5Tc2lkLCAiIiwgMCk7CiAJCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CiAJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQkgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9CisJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKIAkJfQotICAgICAgICBwU3NpZCA9ICZTc2lkOworCQlwU3NpZCA9ICZTc2lkOwogCi0gICAgICAgIGlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQotICAgICAgICB7Ci0gICAgICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKLSAgICAgICAgfQorCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgeworCQkJUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUhXG4iKSk7CisJCX0KIAotICAgICAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IFRSVUU7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuV3BhUGFzc1BocmFzZUxlbiA+PSA4KSAmJgorCQkgICAgKHBBZGFwdGVyLT5TdGFDZmcuV3BhUGFzc1BocmFzZUxlbiA8PSA2NCkpIHsKKwkJCWNoYXIgcGFzc3BocmFzZV9zdHJbNjVdID0geyAwIH07CisJCQl1OCBrZXlNYXRlcmlhbFs0MF07CisKKwkJCVJUTVBNb3ZlTWVtb3J5KHBhc3NwaHJhc2Vfc3RyLAorCQkJCSAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVBhc3NQaHJhc2UsCisJCQkJICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhUGFzc1BocmFzZUxlbik7CisJCQlSVE1QWmVyb01lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywgMzIpOworCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhUGFzc1BocmFzZUxlbiA9PSA2NCkgeworCQkJCUF0b0goKGNoYXIgKilwQWRhcHRlci0+U3RhQ2ZnLldwYVBhc3NQaHJhc2UsCisJCQkJICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBNSywgMzIpOworCQkJfSBlbHNlIHsKKwkJCQlQYXNzd29yZEhhc2goKGNoYXIgKilwQWRhcHRlci0+U3RhQ2ZnLgorCQkJCQkgICAgIFdwYVBhc3NQaHJhc2UsIFNzaWQuU3NpZCwKKwkJCQkJICAgICBTc2lkLlNzaWRMZW5ndGgsIGtleU1hdGVyaWFsKTsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywKKwkJCQkJICAgICAgIGtleU1hdGVyaWFsLCAzMik7CisJCQl9CisJCX0KKworCQlwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IFRSVUU7CisJCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOwogCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOwogCi0gICAgICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLSAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9TU0lELAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfU1NJRCksCi0gICAgICAgICAgICAgICAgICAgIChWT0lEICopcFNzaWQpOworCQlNbG1lRW5xdWV1ZShwQWRhcHRlciwKKwkJCSAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCSAgICBPSURfODAyXzExX1NTSUQsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9uZGlzXzgwMl8xMV9zc2lkKSwgKHZvaWQgKikgcFNzaWQpOwogCi0gICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBUUlVFOwotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfU1NJRF9Qcm9jOjooTGVuPSVkLFNzaWQ9JXMpXG4iLCBTc2lkLlNzaWRMZW5ndGgsIFNzaWQuU3NpZCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHN1Y2Nlc3MgPSBGQUxTRTsKKwkJU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiU2V0X1NTSURfUHJvYzo6KExlbj0lZCxTc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLAorCQkJICBTc2lkLlNzaWQpKTsKKwl9IGVsc2UKKwkJc3VjY2VzcyA9IEZBTFNFOwogCi0gICAgaWYgKFN0YXRlTWFjaGluZVRvdWNoZWQpIC8vIFVwcGVyIGxheWVyIHNlbnQgYSBNTE1FLXJlbGF0ZWQgb3BlcmF0aW9ucwotICAgIAlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKKwlpZiAoU3RhdGVNYWNoaW5lVG91Y2hlZCkJLyogVXBwZXIgbGF5ZXIgc2VudCBhIE1MTUUtcmVsYXRlZCBvcGVyYXRpb25zICovCisJCVJUTVBfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKIAotICAgIHJldHVybiBzdWNjZXNzOworCXJldHVybiBzdWNjZXNzOwogfQogCi0jaWZkZWYgV01NX1NVUFBPUlQKLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdtbUNhcGFibGUgRW5hYmxlIG9yIERpc2FibGUKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfV21tQ2FwYWJsZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlCT09MRUFOCWJXbW1DYXBhYmxlOwotCi0JYldtbUNhcGFibGUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKChiV21tQ2FwYWJsZSA9PSAxKQotI2lmZGVmIFJUMjg3MAotCQkmJiAocEFkLT5OdW1iZXJPZlBpcGVzID49IDUpCi0jZW5kaWYgLy8gUlQyODcwIC8vCi0JCSkKLQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBUUlVFOwotCWVsc2UgaWYgKGJXbW1DYXBhYmxlID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gRkFMU0U7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XbW1DYXBhYmxlX1Byb2M6OihiV21tQ2FwYWJsZT0lZClcbiIsCi0JCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZiAvLyBXTU1fU1VQUE9SVCAvLwotCiAvKgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgRGVzY3JpcHRpb246CkBAIC0yOTc1LDE2NiArMjcxOCwxODQgQEAKICAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotSU5UIFNldF9OZXR3b3JrVHlwZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCitpbnQgU2V0X05ldHdvcmtUeXBlX1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIsIGNoYXIgKmFyZykKIHsKLSAgICBVSU5UMzIJVmFsdWUgPSAwOworCXUzMiBWYWx1ZSA9IDA7CiAKLSAgICBpZiAoc3RyY21wKGFyZywgIkFkaG9jIikgPT0gMCkKLQl7Ci0JCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0FESE9DKQotCQl7Ci0JCQkvLyBDb25maWcgaGFzIGNoYW5nZWQKKwlpZiAoc3RyY21wKGFyZywgIkFkaG9jIikgPT0gMCkgeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlICE9IEJTU19BREhPQykgeworCQkJLyogQ29uZmlnIGhhcyBjaGFuZ2VkICovCiAJCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOwotICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOwotICAgICAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQlpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpIHsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywKKwkJCQkJCVNUQU5PUk1BTCk7CisJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKIAkJCQlWYWx1ZSAmPSAofjB4ODApOwogCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOwotICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7Ci0gICAgICAgICAgICB9Ci0JCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQotCQkJewotCQkJCS8vQk9PTEVBTiBDYW5jZWxsZWQ7Ci0JCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAotCQkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KLQkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7Ci0JCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKwkJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLAorCQkJCQkJICAgIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKwkJCQlMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworCQkJfQorCQkJaWYgKElORlJBX09OKHBBZGFwdGVyKSkgeworCQkJCS8qQk9PTEVBTiBDYW5jZWxsZWQ7ICovCisJCQkJLyogU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRCAqLworCQkJCS8qIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4gKi8KKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiA9IDMyOworCQkJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5NbG1lQXV4LgorCQkJCQkgICAgICAgQXV0b1JlY29ubmVjdFNzaWQsCisJCQkJCSAgICAgICBwQWRhcHRlci0+TWxtZUF1eC4KKwkJCQkJICAgICAgIEF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKIAogCQkJCUxpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CiAKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEJCIVxuIikpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEJCIVxuIikpOwogCQkJfQogCQl9CiAJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19BREhPQzsKLSAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KEFELUhPQylcbiIpKTsKLQl9Ci0gICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIkluZnJhIikgPT0gMCkKLQl7Ci0JCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0lORlJBKQotCQl7Ci0JCQkvLyBDb25maWcgaGFzIGNoYW5nZWQKKwkJcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooQUQtSE9DKVxuIikpOworCX0gZWxzZSBpZiAoc3RyY21wKGFyZywgIkluZnJhIikgPT0gMCkgeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlICE9IEJTU19JTkZSQSkgeworCQkJLyogQ29uZmlnIGhhcyBjaGFuZ2VkICovCiAJCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOwotICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOwotICAgICAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQlpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpIHsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywKKwkJCQkJCVNUQU5PUk1BTCk7CisJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKIAkJCQlWYWx1ZSAmPSAofjB4ODApOwogCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOwotICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7Ci0gICAgICAgICAgICB9Ci0JCQlpZiAoQURIT0NfT04ocEFkYXB0ZXIpKQotCQkJewotCQkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKLQkJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCi0JCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOwotCQkJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisJCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwKKwkJCQkJCSAgICBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CisJCQkJTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKwkJCX0KKwkJCWlmIChBREhPQ19PTihwQWRhcHRlcikpIHsKKwkJCQkvKiBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lEICovCisJCQkJLyogU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLiAqLworCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gMzI7CisJCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguCisJCQkJCSAgICAgICBBdXRvUmVjb25uZWN0U3NpZCwKKwkJCQkJICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LgorCQkJCQkgICAgICAgQXV0b1JlY29ubmVjdFNzaWRMZW4pOwogCiAJCQkJTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKIAkJCX0KIAkJfQogCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7Ci0gICAgICAgIHBBZGFwdGVyLT5uZXRfZGV2LT50eXBlID0gcEFkYXB0ZXItPlN0YUNmZy5PcmlEZXZUeXBlOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihJTkZSQSlcbiIpKTsKLQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7Ci0JfQotICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICJNb25pdG9yIikgPT0gMCkKLSAgICB7Ci0JCVVDSEFSCWJicFZhbHVlID0gMDsKKwkJcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooSU5GUkEpXG4iKSk7CisJfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiTW9uaXRvciIpID09IDApIHsKKwkJdTggYmJwVmFsdWUgPSAwOwogCQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOwogCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKLSAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19BREhPQ19PTik7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfQURIT0NfT04pOwogCQlPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotCQkvLyBkaXNhYmxlIGFsbCBwZXJpb2RpYyBzdGF0ZSBtYWNoaW5lCisJCS8qIGRpc2FibGUgYWxsIHBlcmlvZGljIHN0YXRlIG1hY2hpbmUgKi8KIAkJcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IEZBTFNFOwotCQkvLyByZXNldCBhbGwgbWxtZSBzdGF0ZSBtYWNoaW5lCi0JCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCBcbiIpKTsKLSAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gMzY7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgTl9DaGFubmVsQ2hlY2socEFkYXB0ZXIpOworCQkvKiByZXNldCBhbGwgbWxtZSBzdGF0ZSBtYWNoaW5lICovCisJCVJUTVBfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCBcbiIpKTsKKwkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPT0gMCkgeworCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gMzY7CisJCQllbHNlCisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDY7CisJCX0gZWxzZQorCQkJTl9DaGFubmVsQ2hlY2socEFkYXB0ZXIpOwogCi0JaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCi0gICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCAmJgotICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID09IEVYVENIQV9BQk9WRSkKLQkJewotCQkJLy8gNDBNSHogLGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsICZiYnBWYWx1ZSk7CisJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorCQkgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDAgJiYKKwkJICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PQorCQkgICAgRVhUQ0hBX0FCT1ZFKSB7CisJCQkvKiA0ME1IeiAsY29udHJvbCBjaGFubmVsIGF0IGxvd2VyICovCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwKKwkJCQkJCSAgICAmYmJwVmFsdWUpOwogCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKIAkJCWJicFZhbHVlIHw9IDB4MTA7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwKKwkJCQkJCSAgICAgYmJwVmFsdWUpOwogCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKLQkJCS8vICBSWCA6IGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsICZiYnBWYWx1ZSk7CisJCQkvKiAgUlggOiBjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIgKi8KKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLAorCQkJCQkJICAgICZiYnBWYWx1ZSk7CiAJCQliYnBWYWx1ZSAmPSAofjB4MjApOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCBiYnBWYWx1ZSk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsCisJCQkJCQkgICAgIGJicFZhbHVlKTsKIAogCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOwogCQkJVmFsdWUgJj0gMHhmZmZmZmZmZTsKIAkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsIFZhbHVlKTsKLQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOwotICAgICAgICAgICAgQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKLQkJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCAsY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKLQkJfQotCQllbHNlIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgotICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCAmJgotICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0JFTE9XKQotCQl7Ci0JCQkvLyA0ME1IeiAsY29udHJvbCBjaGFubmVsIGF0IHVwcGVyCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPQorCQkJICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7CisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwKKwkJCQkJICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLAorCQkJCQkgIEZBTFNFKTsKKwkJCUFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwKKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJCV180MCAsY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKKwkJCQkgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwKKwkJCQkgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKwkJfSBlbHNlIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRAorCQkJICAgJiYgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0KKwkJCSAgIEJXXzQwCisJCQkgICAmJiBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC4KKwkJCSAgIEVYVENIQSA9PSBFWFRDSEFfQkVMT1cpIHsKKwkJCS8qIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgdXBwZXIgKi8KKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LAorCQkJCQkJICAgICZiYnBWYWx1ZSk7CiAJCQliYnBWYWx1ZSAmPSAofjB4MTgpOwogCQkJYmJwVmFsdWUgfD0gMHgxMDsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgYmJwVmFsdWUpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LAorCQkJCQkJICAgICBiYnBWYWx1ZSk7CiAJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOwogCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOwogCQkJVmFsdWUgfD0gMHgxOwogCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgVmFsdWUpOwogCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgJmJicFZhbHVlKTsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLAorCQkJCQkJICAgICZiYnBWYWx1ZSk7CiAJCQliYnBWYWx1ZSB8PSAoMHgyMCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsIGJicFZhbHVlKTsKLQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAyOwotICAgICAgICAgICAgQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKLQkJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCAsY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIDIwTUh6Ci0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywKKwkJCQkJCSAgICAgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9CisJCQkgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLAorCQkJCQkgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsCisJCQkJCSAgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLAorCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkJXXzQwICxjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAorCQkJCSAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAorCQkJCSAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCQl9IGVsc2UgeworCQkJLyogMjBNSHogKi8KKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LAorCQkJCQkJICAgICZiYnBWYWx1ZSk7CiAJCQliYnBWYWx1ZSAmPSAofjB4MTgpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsCisJCQkJCQkgICAgIGJicFZhbHVlKTsKIAkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7Ci0JCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAorCQkJCQkgIEZBTFNFKTsKIAkJCUFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzIwLCBDaGFubmVsKCVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJCV18yMCwgQ2hhbm5lbCglZClcbiIsCisJCQkJICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKIAkJfQotCQkvLyBFbmFibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24KKwkJLyogRW5hYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uICovCiAJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCAweDMpOwotCQkvLyBBU0lDIHN1cHBvcnN0cyBzbmlmZmVyIGZ1bmN0aW9uIHdpdGggcmVwbGFjaW5nIFJTU0kgd2l0aCB0aW1lc3RhbXAuCi0JCS8vUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJLy9WYWx1ZSB8PSAoMHg4MCk7Ci0JCS8vUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQkJLy8gZGlzYWJsZSBzeW5jCisJCS8qIEFTSUMgc3VwcG9yc3RzIHNuaWZmZXIgZnVuY3Rpb24gd2l0aCByZXBsYWNpbmcgUlNTSSB3aXRoIHRpbWVzdGFtcC4gKi8KKwkJLypSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOyAqLworCQkvKlZhbHVlIHw9ICgweDgwKTsgKi8KKwkJLypSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOyAqLworCQkvKiBkaXNhYmxlIHN5bmMgKi8KIAkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKIAkJY3NyLmZpZWxkLmJCZWFjb25HZW4gPSAwOwogCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAwOwpAQCAtMzE0Miw2NTUgKzI5MDMsMTYgQEAKIAkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKIAogCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfTU9OSVRPUjsKLSAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNOyAvL0FSUEhSRF9JRUVFODAyMTE7IC8vIElFRUU4MDIxMQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihNT05JVE9SKVxuIikpOwotICAgIH0KKwkJcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNOwkvKkFSUEhSRF9JRUVFODAyMTE7IC8vIElFRUU4MDIxMSAqLworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KE1PTklUT1IpXG4iKSk7CisJfQorCS8qIFJlc2V0IFJhbGluayBzdXBwbGljYW50IHRvIG5vdCB1c2UsIGl0IHdpbGwgYmUgc2V0IHRvIHN0YXJ0IHdoZW4gVUkgc2V0IFBNSyBrZXkgKi8KKwlwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOwogCi0gICAgLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQotICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfTmV0d29ya1R5cGVfUHJvYzo6KE5ldHdvcmtUeXBlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlKSk7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQXV0aGVudGljYXRpb24gbW9kZQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9BdXRoTW9kZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCi17Ci0gICAgaWYgKChzdHJjbXAoYXJnLCAiV0VQQVVUTyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid2VwYXV0byIpID09IDApKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaDsKLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIk9QRU4iKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIm9wZW4iKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0gICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJTSEFSRUQiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgInNoYXJlZCIpID09IDApKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOwotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGFwc2siKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQU5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYW5vbmUiKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7Ci0gICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEyUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEycHNrIikgPT0gMCkpCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOwotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEiKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQTIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYTIiKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0F1dGhNb2RlX1Byb2M6OihBdXRoTW9kZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBFbmNyeXB0aW9uIFR5cGUKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfRW5jcnlwVHlwZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCi17Ci0gICAgaWYgKChzdHJjbXAoYXJnLCAiTk9ORSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAibm9uZSIpID09IDApKQotICAgIHsKLSAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKLQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotICAgIH0KLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldFUCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid2VwIikgPT0gMCkpCi0gICAgewotICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLQkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiVEtJUCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAidGtpcCIpID09IDApKQotICAgIHsKLSAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiQUVTIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJhZXMiKSA9PSAwKSkKLSAgICB7Ci0gICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKLQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0VuY3J5cFR5cGVfUHJvYzo6KEVuY3J5cFR5cGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cykpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IERlZmF1bHQgS2V5IElECi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0RlZmF1bHRLZXlJRF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCi17Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4OwotCi0gICAgS2V5SWR4ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLSAgICBpZigoS2V5SWR4ID49IDEgKSAmJiAoS2V5SWR4IDw9IDQpKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgKEtleUlkeCAtIDEgKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0RlZmF1bHRLZXlJRF9Qcm9jOjooRGVmYXVsdEtleUlEPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBXRVAgS0VZMQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9LZXkxX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OwotCi0gICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgS2V5TGVuID0gc3RybGVuKGFyZyk7Ci0KLSAgICBzd2l0Y2ggKEtleUxlbikKLSAgICB7Ci0gICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW47Ci0gICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIGFyZywgS2V5TGVuKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKLSAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuIC8gMiA7Ci0gICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIEtleUxlbiAvIDIpOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuOwotICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBhcmcsIEtleUxlbik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKLSAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuIC8gMiA7Ci0gICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIEtleUxlbiAvIDIpOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0KLSAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQotICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0Ci0gICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCi0gICAgewotICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdFUCBLRVkyCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0tleTJfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQotewotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7Ci0KLSAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCi0KLSAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKLQotICAgIHN3aXRjaCAoS2V5TGVuKQotICAgIHsKLSAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCi0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbjsKLSAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgYXJnLCBLZXlMZW4pOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQotICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKLSAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgS2V5TGVuIC8gMik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW47Ci0gICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIGFyZywgS2V5TGVuKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQotICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKLSAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgS2V5TGVuIC8gMik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0KLSAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQotICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0Ci0gICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCi0gICAgewotICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBXRVAgS0VZMwotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9LZXkzX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OwotCi0gICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgS2V5TGVuID0gc3RybGVuKGFyZyk7Ci0KLSAgICBzd2l0Y2ggKEtleUxlbikKLSAgICB7Ci0gICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW47Ci0gICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIGFyZywgS2V5TGVuKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUFzY2lpKVxuIiwgYXJnKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKLSAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuIC8gMiA7Ci0gICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIEtleUxlbiAvIDIpOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9SGV4KVxuIiwgYXJnKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuOwotICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBhcmcsIEtleUxlbik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9QXNjaWkpXG4iLCBhcmcpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKLSAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuIC8gMiA7Ci0gICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIEtleUxlbiAvIDIpOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUhleClcbiIsIGFyZykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCi0gICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKLSAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAotICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgotICAgIHsKLSAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgV0VQIEtFWTQKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfS2V5NF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCi17Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKLQotICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKLQotICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOwotCi0gICAgc3dpdGNoIChLZXlMZW4pCi0gICAgewotICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuOwotICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBhcmcsIEtleUxlbik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCi0gICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbiAvIDIgOwotICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBLZXlMZW4gLyAyKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCi0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbjsKLSAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgYXJnLCBLZXlMZW4pOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCi0gICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbiAvIDIgOwotICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBLZXlMZW4gLyAyKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQotICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCi0gICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKLSAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKLSAgICB7Ci0gICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgV1BBIFBTSyBrZXkKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfV1BBUFNLX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKLXsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICBrZXlNYXRlcmlhbFs0MF07Ci0KLSAgICBpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgotICAgICAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgotCSAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQkpCi0gICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCi0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV1BBUFNLX1Byb2M6OihXUEFQU0s9JXMpXG4iLCBhcmcpKTsKLQotICAgIE5kaXNaZXJvTWVtb3J5KGtleU1hdGVyaWFsLCA0MCk7Ci0KLSAgICBpZiAoKHN0cmxlbihhcmcpIDwgOCkgfHwgKHN0cmxlbihhcmcpID4gNjQpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IGZhaWxlZCEhKFdQQVBTSz0lcyksIFdQQVBTSyBrZXktc3RyaW5nIHJlcXVpcmVkIDggfiA2NCBjaGFyYWN0ZXJzIFxuIiwgYXJnKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoc3RybGVuKGFyZykgPT0gNjQpCi0gICAgewotICAgICAgICBBdG9IKGFyZywga2V5TWF0ZXJpYWwsIDMyKTsKLSAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgUGFzc3dvcmRIYXNoKChjaGFyICopYXJnLCBwQWRhcHRlci0+TWxtZUF1eC5Tc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5Tc2lkTGVuLCBrZXlNYXRlcmlhbCk7Ci0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCBrZXlNYXRlcmlhbCwgMzIpOwotICAgIH0KLQotCi0KLSAgICBpZihwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DICYmCi0gICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotICAgIHsKLSAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8vIFN0YXJ0IFNUQSBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBQb3dlciBTYXZpbmcgbW9kZQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9QU01vZGVfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQotewotICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQotICAgIHsKLSAgICAgICAgaWYgKChzdHJjbXAoYXJnLCAiTWF4X1BTUCIpID09IDApIHx8Ci0JCQkoc3RyY21wKGFyZywgIm1heF9wc3AiKSA9PSAwKSB8fAotCQkJKHN0cmNtcChhcmcsICJNQVhfUFNQIikgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQotICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCi0gICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOwotICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gNTsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiRmFzdF9QU1AiKSA9PSAwKSB8fAotCQkJCSAoc3RyY21wKGFyZywgImZhc3RfcHNwIikgPT0gMCkgfHwKLSAgICAgICAgICAgICAgICAgKHN0cmNtcChhcmcsICJGQVNUX1BTUCIpID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKLSAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgotICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLSAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIkxlZ2FjeV9QU1AiKSA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgImxlZ2FjeV9wc3AiKSA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgIkxFR0FDWV9QU1AiKSA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCi0gICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KLSAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7Ci0gICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy9EZWZhdWx0IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0KLSAgICAgICAgICAgIC8vIGNsZWFyIFBTTSBiaXQgaW1tZWRpYXRlbHkKLSAgICAgICAgICAgIE1sbWVTZXRQc21CaXQocEFkYXB0ZXIsIFBXUl9BQ1RJVkUpOwotICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLSAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOwotICAgICAgICB9Ci0KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1BTTW9kZV9Qcm9jOjooUFNNb2RlPSVsZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdwYVN1cHBvcnQgZmxhZy4KLSAgICBWYWx1ZToKLSAgICAgICAgMDogRHJpdmVyIGlnbm9yZSB3cGFfc3VwcGxpY2FudC4KLSAgICAgICAgMTogd3BhX3N1cHBsaWNhbnQgaW5pdGlhdGVzIHNjYW5uaW5nIGFuZCBBUCBzZWxlY3Rpb24uCi0gICAgICAgIDI6IGRyaXZlciB0YWtlcyBjYXJlIG9mIHNjYW5uaW5nLCBBUCBzZWxlY3Rpb24sIGFuZCBJRUVFIDgwMi4xMSBhc3NvY2lhdGlvbiBwYXJhbWV0ZXJzLgotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9XcGFfU3VwcG9ydCgKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0KLSAgICBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKLSAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKLSAgICBlbHNlIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAxKQotICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEU7Ci0gICAgZWxzZSBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMikKLSAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJOwotICAgIGVsc2UKLSAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XcGFfU3VwcG9ydDo6KFdwYVN1cHBsaWNhbnRVUD0lZClcbiIsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVCBTZXRfVEduV2lmaVRlc3RfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKLXsKLSAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQotICAgICAgICBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBGQUxTRTsKLSAgICBlbHNlCi0gICAgICAgIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IFRSVUU7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfVEduV2lmaVRlc3RfUHJvYzo6KGJUR25XaWZpVGVzdD0lZClcbiIsIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCkpOwotCXJldHVybiBUUlVFOwotfQotCi1JTlQgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVFhfUlRZX0NGR19TVFJVQwl0eF9ydHlfY2ZnOwotCVVDSEFSCQkJCUxvbmdSZXRyeUxpbWl0ID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7Ci0JdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQgPSBMb25nUmV0cnlMaW1pdDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2M6Oih0eF9ydHlfY2ZnPTB4JXgpXG4iLCB0eF9ydHlfY2ZnLndvcmQpKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlUWF9SVFlfQ0ZHX1NUUlVDCXR4X3J0eV9jZmc7Ci0JVUNIQVIJCQkJU2hvcnRSZXRyeUxpbWl0ID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooTmV0d29ya1R5cGU9JWQpXG4iLAorCQkgIHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSkpOwogCi0JUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOwotCXR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCA9IFNob3J0UmV0cnlMaW1pdDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jOjoodHhfcnR5X2NmZz0weCV4KVxuIiwgdHhfcnR5X2NmZy53b3JkKSk7CiAJcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3VzYl9tYWluX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC91c2JfbWFpbl9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjVhMjM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC91c2JfbWFpbl9kZXYuYwpAQCAtMCwwICsxLDg4NyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisKKy8qIEZvbGxvd2luZyBpbmZvcm1hdGlvbiB3aWxsIGJlIHNob3cgd2hlbiB5b3UgcnVuICdtb2RpbmZvJyAqLworLyogKioqIElmIHlvdSBoYXZlIGEgc29sdXRpb24gZm9yIHRoZSBidWcgaW4gY3VycmVudCB2ZXJzaW9uIG9mIGRyaXZlciwgcGxlYXNlIG1haWwgdG8gbWUuICovCisvKiBPdGhlcndpc2UgcG9zdCB0byBmb3J1bSBpbiByYWxpbmt0ZWNoJ3Mgd2ViIHNpdGUod3d3LnJhbGlua3RlY2guY29tKSBhbmQgbGV0IGFsbCB1c2VycyBoZWxwIHlvdS4gKioqICovCitNT0RVTEVfQVVUSE9SKCJQYXVsIExpbiA8cGF1bF9saW5AcmFsaW5rdGVjaC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJUMjg3MC9SVDMwNzAgV2lyZWxlc3MgTGFuIExpbnV4IERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworI2lmZGVmIE1PRFVMRV9WRVJTSU9OCitNT0RVTEVfVkVSU0lPTihTVEFfRFJJVkVSX1ZFUlNJT04pOworI2VuZGlmCisKKy8qIG1vZHVsZSB0YWJsZSAqLworc3RydWN0IHVzYl9kZXZpY2VfaWQgcnR1c2JfdXNiX2lkW10gPSB7CisjaWZkZWYgUlQyODcwCisJe1VTQl9ERVZJQ0UoMHgxNDhGLCAweDI3NzApfSwJLyogUmFsaW5rICovCisJe1VTQl9ERVZJQ0UoMHgxNDhGLCAweDI4NzApfSwJLyogUmFsaW5rICovCisJe1VTQl9ERVZJQ0UoMHgwN0I4LCAweDI4NzApfSwJLyogQWJvQ29tICovCisJe1VTQl9ERVZJQ0UoMHgwN0I4LCAweDI3NzApfSwJLyogQWJvQ29tICovCisJe1VTQl9ERVZJQ0UoMHgwREY2LCAweDAwMzkpfSwJLyogU2l0ZWNvbSAyNzcwICovCisJe1VTQl9ERVZJQ0UoMHgwODNBLCAweDc1MTIpfSwJLyogQXJjYWR5YW4gMjc3MCAqLworCXtVU0JfREVWSUNFKDB4MDc4OSwgMHgwMTYyKX0sCS8qIExvZ2l0ZWMgMjg3MCAqLworCXtVU0JfREVWSUNFKDB4MDc4OSwgMHgwMTYzKX0sCS8qIExvZ2l0ZWMgMjg3MCAqLworCXtVU0JfREVWSUNFKDB4MDc4OSwgMHgwMTY0KX0sCS8qIExvZ2l0ZWMgMjg3MCAqLworCXtVU0JfREVWSUNFKDB4MTc3ZiwgMHgwMzAyKX0sCS8qIGxzdXNiICovCisJe1VTQl9ERVZJQ0UoMHgwQjA1LCAweDE3MzEpfSwJLyogQXN1cyAqLworCXtVU0JfREVWSUNFKDB4MEIwNSwgMHgxNzMyKX0sCS8qIEFzdXMgKi8KKwl7VVNCX0RFVklDRSgweDBCMDUsIDB4MTc0Mil9LAkvKiBBc3VzICovCisJe1VTQl9ERVZJQ0UoMHgwREY2LCAweDAwMTcpfSwJLyogU2l0ZWNvbSAqLworCXtVU0JfREVWSUNFKDB4MERGNiwgMHgwMDJCKX0sCS8qIFNpdGVjb20gKi8KKwl7VVNCX0RFVklDRSgweDBERjYsIDB4MDAyQyl9LAkvKiBTaXRlY29tICovCisJe1VTQl9ERVZJQ0UoMHgwREY2LCAweDAwMkQpfSwJLyogU2l0ZWNvbSAqLworCXtVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzA2KX0sCS8qIENvbmNlcHRyb25pYyAqLworCXtVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzI4KX0sCS8qIENvbmNlcHRyb25pYyAqLworCXtVU0JfREVWSUNFKDB4MjAxOSwgMHhFRDA2KX0sCS8qIFBsYW5leCBDb21tdW5pY2F0aW9ucywgSW5jLiAqLworCXtVU0JfREVWSUNFKDB4MDdEMSwgMHgzQzA5KX0sCS8qIEQtTGluayAqLworCXtVU0JfREVWSUNFKDB4MDdEMSwgMHgzQzExKX0sCS8qIEQtTGluayAqLworCXtVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzA3KX0sCS8qIEFMICovCisJe1VTQl9ERVZJQ0UoMHgwNTBELCAweDgwNTMpfSwJLyogQmVsa2luICovCisJe1VTQl9ERVZJQ0UoMHgxNEIyLCAweDNDMjMpfSwJLyogQWlybGluayAqLworCXtVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzI3KX0sCS8qIEFpcmxpbmsgKi8KKwl7VVNCX0RFVklDRSgweDA3QUEsIDB4MDAyRil9LAkvKiBDb3JlZ2EgKi8KKwl7VVNCX0RFVklDRSgweDA3QUEsIDB4MDAzQyl9LAkvKiBDb3JlZ2EgKi8KKwl7VVNCX0RFVklDRSgweDA3QUEsIDB4MDAzRil9LAkvKiBDb3JlZ2EgKi8KKwl7VVNCX0RFVklDRSgweDEwNDQsIDB4ODAwQil9LAkvKiBHaWdhYnl0ZSAqLworCXtVU0JfREVWSUNFKDB4MTVBOSwgMHgwMDA2KX0sCS8qIFNwYXJrbGFuICovCisJe1VTQl9ERVZJQ0UoMHgwODNBLCAweEI1MjIpfSwJLyogU01DICovCisJe1VTQl9ERVZJQ0UoMHgwODNBLCAweEE2MTgpfSwJLyogU01DICovCisJe1VTQl9ERVZJQ0UoMHgwODNBLCAweDg1MjIpfSwJLyogQXJjYWR5YW4gKi8KKwl7VVNCX0RFVklDRSgweDA4M0EsIDB4NzUyMil9LAkvKiBBcmNhZHlhbiAqLworCXtVU0JfREVWSUNFKDB4MENERSwgMHgwMDIyKX0sCS8qIFpDT00gKi8KKwl7VVNCX0RFVklDRSgweDA1ODYsIDB4MzQxNil9LAkvKiBaeXhlbCAqLworCXtVU0JfREVWSUNFKDB4MENERSwgMHgwMDI1KX0sCS8qIFp5eGVsICovCisJe1VTQl9ERVZJQ0UoMHgxNzQwLCAweDk3MDEpfSwJLyogRW5HZW5pdXMgKi8KKwl7VVNCX0RFVklDRSgweDE3NDAsIDB4OTcwMil9LAkvKiBFbkdlbml1cyAqLworCXtVU0JfREVWSUNFKDB4MDQ3MSwgMHgyMDBmKX0sCS8qIFBoaWxpcHMgKi8KKwl7VVNCX0RFVklDRSgweDE0QjIsIDB4M0MyNSl9LAkvKiBEcmF5dGVrICovCisJe1VTQl9ERVZJQ0UoMHgxM0QzLCAweDMyNDcpfSwJLyogQXp1cmVXYXZlICovCisJe1VTQl9ERVZJQ0UoMHgwODNBLCAweDY2MTgpfSwJLyogQWNjdG9uICovCisJe1VTQl9ERVZJQ0UoMHgxNWM1LCAweDAwMDgpfSwJLyogQW1pdCAqLworCXtVU0JfREVWSUNFKDB4MEU2NiwgMHgwMDAxKX0sCS8qIEhhd2tpbmcgKi8KKwl7VVNCX0RFVklDRSgweDBFNjYsIDB4MDAwMyl9LAkvKiBIYXdraW5nICovCisJe1VTQl9ERVZJQ0UoMHgxMjlCLCAweDE4MjgpfSwJLyogU2llbWVucyAqLworCXtVU0JfREVWSUNFKDB4MTU3RSwgMHgzMDBFKX0sCS8qIFUtTWVkaWEgKi8KKwl7VVNCX0RFVklDRSgweDA1MGQsIDB4ODA1Yyl9LAorCXtVU0JfREVWSUNFKDB4MDUwZCwgMHg4MTVjKX0sCisJe1VTQl9ERVZJQ0UoMHgxNDgyLCAweDNDMDkpfSwJLyogQWJvY29tICovCisJe1VTQl9ERVZJQ0UoMHgxNEIyLCAweDNDMDkpfSwJLyogQWxwaGEgKi8KKwl7VVNCX0RFVklDRSgweDA0RTgsIDB4MjAxOCl9LAkvKiBzYW1zdW5nICovCisJe1VTQl9ERVZJQ0UoMHg1QTU3LCAweDAyODApfSwJLyogWmlud2VsbCAqLworCXtVU0JfREVWSUNFKDB4NUE1NywgMHgwMjgyKX0sCS8qIFppbndlbGwgKi8KKwl7VVNCX0RFVklDRSgweDczOTIsIDB4NzcxOCl9LAorCXtVU0JfREVWSUNFKDB4NzM5MiwgMHg3NzE3KX0sCisJe1VTQl9ERVZJQ0UoMHgxNzM3LCAweDAwNzApfSwJLyogTGlua3N5cyBXVVNCMTAwICovCisJe1VTQl9ERVZJQ0UoMHgxNzM3LCAweDAwNzEpfSwJLyogTGlua3N5cyBXVVNCNjAwTiAqLworCXtVU0JfREVWSUNFKDB4MDQxMSwgMHgwMGU4KX0sCS8qIEJ1ZmZhbG8gV0xJLVVDLUczMDBOICovCisJe1VTQl9ERVZJQ0UoMHgwNTBkLCAweDgxNWMpfSwJLyogQmVsa2luIEY1RDgwNTMgKi8KKyNlbmRpZiAvKiBSVDI4NzAgLy8gKi8KKyNpZmRlZiBSVDMwNzAKKwl7VVNCX0RFVklDRSgweDE0OEYsIDB4MzA3MCl9LAkvKiBSYWxpbmsgMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MTQ4RiwgMHgzMDcxKX0sCS8qIFJhbGluayAzMDcxICovCisJe1VTQl9ERVZJQ0UoMHgxNDhGLCAweDMwNzIpfSwJLyogUmFsaW5rIDMwNzIgKi8KKwl7VVNCX0RFVklDRSgweDBEQjAsIDB4MzgyMCl9LAkvKiBSYWxpbmsgMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MERGNiwgMHgwMDNFKX0sCS8qIFNpdGVjb20gMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MERGNiwgMHgwMDQyKX0sCS8qIFNpdGVjb20gMzA3MiAqLworCXtVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzEyKX0sCS8qIEFMIDMwNzAgKi8KKwl7VVNCX0RFVklDRSgweDE4QzUsIDB4MDAxMil9LAkvKiBDb3JlZ2EgMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MDgzQSwgMHg3NTExKX0sCS8qIEFyY2FkeWFuIDMwNzAgKi8KKwl7VVNCX0RFVklDRSgweDE3NDAsIDB4OTcwMyl9LAkvKiBFbkdlbml1cyAzMDcwICovCisJe1VTQl9ERVZJQ0UoMHgxNzQwLCAweDk3MDUpfSwJLyogRW5HZW5pdXMgMzA3MSAqLworCXtVU0JfREVWSUNFKDB4MTc0MCwgMHg5NzA2KX0sCS8qIEVuR2VuaXVzIDMwNzIgKi8KKwl7VVNCX0RFVklDRSgweDEzRDMsIDB4MzI3Myl9LAkvKiBBenVyZVdhdmUgMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MTA0NCwgMHg4MDBEKX0sCS8qIEdpZ2FieXRlIEdOLVdCMzJMIDMwNzAgKi8KKwl7VVNCX0RFVklDRSgweDIwMTksIDB4QUIyNSl9LAkvKiBQbGFuZXggQ29tbXVuaWNhdGlvbnMsIEluYy4gUlQzMDcwICovCisJe1VTQl9ERVZJQ0UoMHgwN0I4LCAweDMwNzApfSwJLyogQWJvQ29tIDMwNzAgKi8KKwl7VVNCX0RFVklDRSgweDA3QjgsIDB4MzA3MSl9LAkvKiBBYm9Db20gMzA3MSAqLworCXtVU0JfREVWSUNFKDB4MDdCOCwgMHgzMDcyKX0sCS8qIEFib2NvbSAzMDcyICovCisJe1VTQl9ERVZJQ0UoMHg3MzkyLCAweDc3MTEpfSwJLyogRWRpbWF4IDMwNzAgKi8KKwl7VVNCX0RFVklDRSgweDFBMzIsIDB4MDMwNCl9LAkvKiBRdWFudGEgMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MUVEQSwgMHgyMzEwKX0sCS8qIEFpclRpZXMgMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MDdEMSwgMHgzQzBBKX0sCS8qIEQtTGluayAzMDcyICovCisJe1VTQl9ERVZJQ0UoMHgwN0QxLCAweDNDMEQpfSwJLyogRC1MaW5rIDMwNzAgKi8KKwl7VVNCX0RFVklDRSgweDA3RDEsIDB4M0MwRSl9LAkvKiBELUxpbmsgMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MDdEMSwgMHgzQzBGKX0sCS8qIEQtTGluayAzMDcwICovCisJe1VTQl9ERVZJQ0UoMHgxRDRELCAweDAwMEMpfSwJLyogUGVnYXRyb24gQ29ycG9yYXRpb24gMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MUQ0RCwgMHgwMDBFKX0sCS8qIFBlZ2F0cm9uIENvcnBvcmF0aW9uIDMwNzAgKi8KKwl7VVNCX0RFVklDRSgweDVBNTcsIDB4NTI1Nyl9LAkvKiBaaW53ZWxsIDMwNzAgKi8KKwl7VVNCX0RFVklDRSgweDVBNTcsIDB4MDI4Myl9LAkvKiBaaW53ZWxsIDMwNzIgKi8KKwl7VVNCX0RFVklDRSgweDA0QkIsIDB4MDk0NSl9LAkvKiBJLU8gREFUQSAzMDcyICovCisJe1VTQl9ERVZJQ0UoMHgyMDNELCAweDE0ODApfSwJLyogRW5jb3JlIDMwNzAgKi8KKyNlbmRpZiAvKiBSVDMwNzAgLy8gKi8KKwl7VVNCX0RFVklDRSgweDBERjYsIDB4MDAzRil9LAkvKiBTaXRlY29tIFdMLTYwOCAqLworCXtVU0JfREVWSUNFKDB4MTczNywgMHgwMDc3KX0sCS8qIExpbmtzeXMgV1VTQjU0R0MtRVUgdjMgKi8KKwl7VVNCX0RFVklDRSgweDIwMDEsIDB4M0MwOSl9LAkvKiBELUxpbmsgKi8KKwl7VVNCX0RFVklDRSgweDIwMDEsIDB4M0MwQSl9LAkvKiBELUxpbmsgMzA3MiAqLworCXtVU0JfREVWSUNFKDB4MjAxOSwgMHhFRDE0KX0sCS8qIFBsYW5leCBDb21tdW5pY2F0aW9ucywgSW5jLiAqLworCXt9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK2ludCBjb25zdCBydHVzYl91c2JfaWRfbGVuID0KKyAgICBzaXplb2YocnR1c2JfdXNiX2lkKSAvIHNpemVvZihzdHJ1Y3QgdXNiX2RldmljZV9pZCk7CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBydHVzYl91c2JfaWQpOworCitzdGF0aWMgdm9pZCBydDI4NzBfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBydDI4NzBfcHJvYmUoSU4gc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkJICBJTiBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKKwkJCQkgIElOIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICpkZXZfaWQsCisJCQkJICBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICoqIHBwQWQpOworCisjaWZuZGVmIFBGX05PRlJFRVpFCisjZGVmaW5lIFBGX05PRlJFRVpFICAwCisjZW5kaWYKKworZXh0ZXJuIGludCBydDI4eHhfY2xvc2UoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworZXh0ZXJuIGludCBydDI4eHhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CisKK3N0YXRpYyBCT09MRUFOIFVTQkRldkNvbmZpZ0luaXQoSU4gc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKwkJCQlJTiBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCQlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENoZWNrIHRoZSBjaGlwc2V0IHZlbmRvci9wcm9kdWN0IElELgorCitBcmd1bWVudHM6CisgICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQorCitSZXR1cm4gVmFsdWU6CisgICAgVFJVRQkJCQlDaGVjayBvaworCUZBTFNFCQkJCUNoZWNrIGZhaWwKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlQyOFhYQ2hpcHNldENoZWNrKElOIHZvaWQgKl9kZXZfcCkKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKV9kZXZfcDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2X3AgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXUzMiBpOworCisJZm9yIChpID0gMDsgaSA8IHJ0dXNiX3VzYl9pZF9sZW47IGkrKykgeworCQlpZiAoZGV2X3AtPmRlc2NyaXB0b3IuaWRWZW5kb3IgPT0gcnR1c2JfdXNiX2lkW2ldLmlkVmVuZG9yICYmCisJCSAgICBkZXZfcC0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgPT0gcnR1c2JfdXNiX2lkW2ldLmlkUHJvZHVjdCkgeworCQkJcHJpbnRrKCJydDI4NzA6IGlkVmVuZG9yID0gMHgleCwgaWRQcm9kdWN0ID0gMHgleFxuIiwKKwkJCSAgICAgICBkZXZfcC0+ZGVzY3JpcHRvci5pZFZlbmRvciwKKwkJCSAgICAgICBkZXZfcC0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSA9PSBydHVzYl91c2JfaWRfbGVuKSB7CisJCXByaW50aygicnQyODcwOiBFcnJvciEgRGV2aWNlIERlc2NyaXB0b3Igbm90IG1hdGNoaW5nIVxuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyp0ZXN0ZWQgZm9yIGtlcm5lbCAyLjZzZXJpZXMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBydDI4NzBfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK3N0YXRpYyBpbnQgcnQyODcwX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CisjZW5kaWYgLyogQ09ORklHX1BNIC8vICovCisKK3N0YXRpYyBpbnQgcnR1c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOworc3RhdGljIHZvaWQgcnR1c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CisKK3N0YXRpYyBCT09MRUFOIFVTQkRldkNvbmZpZ0luaXQoSU4gc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKwkJCQlJTiBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCQlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKKwl1bnNpZ25lZCBsb25nIEJ1bGtPdXRJZHg7CisJdTMyIGk7CisKKwkvKiBnZXQgdGhlIGFjdGl2ZSBpbnRlcmZhY2UgZGVzY3JpcHRvciAqLworCWlmYWNlX2Rlc2MgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKworCS8qIGdldCAjIG9mIGVucG9pbnRzICAqLworCXBBZC0+TnVtYmVyT2ZQaXBlcyA9IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiTnVtRW5kcG9pbnRzPSVkXG4iLCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHMpKTsKKworCS8qIENvbmZpZ3VyZSBQaXBlcyAqLworCUJ1bGtPdXRJZHggPSAwOworCisJZm9yIChpID0gMDsgaSA8IHBBZC0+TnVtYmVyT2ZQaXBlczsgaSsrKSB7CisJCWlmICgoaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5ibUF0dHJpYnV0ZXMgPT0KKwkJICAgICBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSAmJgorCQkgICAgKChpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJgorCQkgICAgICBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfSU4pKSB7CisJCQlwQWQtPkJ1bGtJbkVwQWRkciA9CisJCQkgICAgaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCQkJcEFkLT5CdWxrSW5NYXhQYWNrZXRTaXplID0KKwkJCSAgICBsZTJjcHUxNihpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLgorCQkJCSAgICAgd01heFBhY2tldFNpemUpOworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJICAgICAoIkJVTEsgSU4gTWF4UGFja2V0U2l6ZSA9ICVkXG4iLAorCQkJCSAgICAgIHBBZC0+QnVsa0luTWF4UGFja2V0U2l6ZSkpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAgICAgKCJFUCBhZGRyZXNzID0gMHglMnhcbiIsCisJCQkJICAgICAgaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy4KKwkJCQkgICAgICBiRW5kcG9pbnRBZGRyZXNzKSk7CisJCX0gZWxzZQorCQkgICAgaWYgKChpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJtQXR0cmlidXRlcyA9PQorCQkJIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspCisJCQkmJgorCQkJKChpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLgorCQkJICBiRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PQorCQkJIFVTQl9ESVJfT1VUKSkgeworCQkJLyogdGhlcmUgYXJlIDYgYnVsayBvdXQgRVAuIEVQNiBoaWdoZXN0IHByaW9yaXR5LiAqLworCQkJLyogRVAxLTQgaXMgRURDQS4gIEVQNSBpcyBIQ0NBLiAqLworCQkJcEFkLT5CdWxrT3V0RXBBZGRyW0J1bGtPdXRJZHgrK10gPQorCQkJICAgIGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYkVuZHBvaW50QWRkcmVzczsKKwkJCXBBZC0+QnVsa091dE1heFBhY2tldFNpemUgPQorCQkJICAgIGxlMmNwdTE2KGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuCisJCQkJICAgICB3TWF4UGFja2V0U2l6ZSk7CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkgICAgICgiQlVMSyBPVVQgTWF4UGFja2V0U2l6ZSA9ICVkXG4iLAorCQkJCSAgICAgIHBBZC0+QnVsa091dE1heFBhY2tldFNpemUpKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkgICAgICgiRVAgYWRkcmVzcyA9IDB4JTJ4ICBcbiIsCisJCQkJICAgICAgaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy4KKwkJCQkgICAgICBiRW5kcG9pbnRBZGRyZXNzKSk7CisJCX0KKwl9CisKKwlpZiAoIShwQWQtPkJ1bGtJbkVwQWRkciAmJiBwQWQtPkJ1bGtPdXRFcEFkZHJbMF0pKSB7CisJCXByaW50aworCQkgICAgKCIlczogQ291bGQgbm90IGZpbmQgYm90aCBidWxrLWluIGFuZCBidWxrLW91dCBlbmRwb2ludHNcbiIsCisJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXBBZC0+Y29uZmlnID0gJmRldi0+Y29uZmlnLT5kZXNjOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgcEFkKTsKKworCXJldHVybiBUUlVFOworCit9CisKK3N0YXRpYyBpbnQgcnR1c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CisJaW50IHJ2OworCisJZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlkZXYgPSB1c2JfZ2V0X2RldihkZXYpOworCisJcnYgPSBydDI4NzBfcHJvYmUoaW50ZiwgZGV2LCBpZCwgJnBBZCk7CisJaWYgKHJ2ICE9IDApCisJCXVzYl9wdXRfZGV2KGRldik7CisKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyB2b2lkIHJ0dXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCisJcEFkID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCisJcnQyODcwX2Rpc2Nvbm5lY3QoZGV2LCBwQWQpOworfQorCitzdHJ1Y3QgdXNiX2RyaXZlciBydHVzYl9kcml2ZXIgPSB7CisJLm5hbWUgPSAicnQyODcwIiwKKwkucHJvYmUgPSBydHVzYl9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IHJ0dXNiX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0gcnR1c2JfdXNiX2lkLAorCisjaWZkZWYgQ09ORklHX1BNCitzdXNwZW5kOnJ0Mjg3MF9zdXNwZW5kLAorcmVzdW1lOnJ0Mjg3MF9yZXN1bWUsCisjZW5kaWYKK307CisKKyNpZmRlZiBDT05GSUdfUE0KKwordm9pZCBSVDI4NzBSZWplY3RQZW5kaW5nUGFja2V0cyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJLyogY2xlYXIgUFMgcGFja2V0cyAqLworCS8qIGNsZWFyIFR4U3cgcGFja2V0cyAqLworfQorCitzdGF0aWMgaW50IHJ0Mjg3MF9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODcwX3N1c3BlbmQoKVxuIikpOworCW5ldF9kZXYgPSBwQWQtPm5ldF9kZXY7CisJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRfZGV2KTsKKworCXBBZC0+UE1fRmxnU3VzcGVuZCA9IDE7CisJaWYgKG5ldGlmX3J1bm5pbmcobmV0X2RldikpIHsKKwkJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHBBZCk7CisJCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKTsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4NzBfc3VzcGVuZCgpXG4iKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQyODcwX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NzBfcmVzdW1lKClcbiIpKTsKKworCXBBZC0+UE1fRmxnU3VzcGVuZCA9IDA7CisJbmV0X2RldiA9IHBBZC0+bmV0X2RldjsKKwluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldF9kZXYpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOworCW5ldGlmX2NhcnJpZXJfb24obmV0X2Rldik7CisJbmV0aWZfd2FrZV9xdWV1ZShuZXRfZGV2KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODcwX3Jlc3VtZSgpXG4iKSk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNIC8vICovCisKKy8qIEluaXQgZHJpdmVyIG1vZHVsZSAqLworaW50IF9faW5pdCBydHVzYl9pbml0KHZvaWQpCit7CisJcHJpbnRrKCJydHVzYiBpbml0IC0tLT5cbiIpOworCXJldHVybiB1c2JfcmVnaXN0ZXIoJnJ0dXNiX2RyaXZlcik7Cit9CisKKy8qIERlaW5pdCBkcml2ZXIgbW9kdWxlICovCit2b2lkIF9fZXhpdCBydHVzYl9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJnJ0dXNiX2RyaXZlcik7CisJcHJpbnRrKCI8LS0tIHJ0dXNiIGV4aXRcbiIpOworfQorCittb2R1bGVfaW5pdChydHVzYl9pbml0KTsKK21vZHVsZV9leGl0KHJ0dXNiX2V4aXQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLworLyogZnVuY3Rpb24gZGVjbGFyYXRpb25zCQkJCQkJCQkJCQkJKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgTUxNRSBrZXJuZWwgdGhyZWFkLgorCitBcmd1bWVudHM6CisJKkNvbnRleHQJCQl0aGUgcEFkLCBkcml2ZXIgY29udHJvbCBibG9jayBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICAwCQkJCQljbG9zZSB0aGUgdGhyZWFkCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgTWxtZVRocmVhZChJTiB2b2lkICpDb250ZXh0KQoreworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzazsKKwlpbnQgc3RhdHVzOworCXN0YXR1cyA9IDA7CisKKwlwVGFzayA9IChzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICopQ29udGV4dDsKKwlwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKXBUYXNrLT5wcml2OworCisJUnRtcE9TVGFza0N1c3RvbWl6ZShwVGFzayk7CisKKwl3aGlsZSAoIXBUYXNrLT50YXNrX2tpbGxlZCkgeworI2lmZGVmIEtUSFJFQURfU1VQUE9SVAorCQlSVE1QX1dBSVRfRVZFTlRfSU5URVJSVVBUSUJMRShwQWQsIHBUYXNrKTsKKyNlbHNlCisJCVJUTVBfU0VNX0VWRU5UX1dBSVQoJihwVGFzay0+dGFza1NlbWEpLCBzdGF0dXMpOworCisJCS8qIHVubG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICovCisJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKwkJLyogbG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICwgbmVlZCB0byBjaGVjayBpZiByZXF1aXJlZCAqLworCQkvKmRvd24oJihwQWQtPnVzYmRldl9zZW1hcGhvcmUpKTsgKi8KKworCQlpZiAoIXBBZC0+UE1fRmxnU3VzcGVuZCkKKwkJCU1sbWVIYW5kbGVyKHBBZCk7CisJfQorCisJLyogbm90aWZ5IHRoZSBleGl0IHJvdXRpbmUgdGhhdCB3ZSdyZSBhY3R1YWxseSBleGl0aW5nIG5vdworCSAqCisJICogY29tcGxldGUoKS93YWl0X2Zvcl9jb21wbGV0aW9uKCkgaXMgc2ltaWxhciB0byB1cCgpL2Rvd24oKSwKKwkgKiBleGNlcHQgdGhhdCBjb21wbGV0ZSgpIGlzIHNhZmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHN0cnVjdHVyZQorCSAqIGlzIGdldHRpbmcgZGVsZXRlZCBpbiBhIHBhcmFsbGVsIG1vZGUgb2YgZXhlY3V0aW9uIChpLmUuIGp1c3QKKwkgKiBhZnRlciB0aGUgZG93bigpIC0tIHRoYXQncyBuZWNlc3NhcnkgZm9yIHRoZSB0aHJlYWQtc2h1dGRvd24KKwkgKiBjYXNlLgorCSAqCisJICogY29tcGxldGVfYW5kX2V4aXQoKSBnb2VzIGV2ZW4gZnVydGhlciB0aGFuIHRoaXMgLS0gaXQgaXMgc2FmZSBpbgorCSAqIHRoZSBjYXNlIHRoYXQgdGhlIHRocmVhZCBvZiB0aGUgY2FsbGVyIGlzIGdvaW5nIGF3YXkgKG5vdCBqdXN0CisJICogdGhlIHN0cnVjdHVyZSkgLS0gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBtb2R1bGUtcmVtb3ZlIGNhc2UuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgaW4gcHJlZW1wdGlvbiBrZXJuZWxzLCB3aGljaCB0cmFuc2ZlciB0aGUgZmxvdworCSAqIG9mIGV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGEgY29tcGxldGUoKS4KKwkgKi8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tJXNcbiIsIF9fRlVOQ1RJT05fXykpOworI2lmbmRlZiBLVEhSRUFEX1NVUFBPUlQKKwlwVGFzay0+dGFza1BJRCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKwljb21wbGV0ZV9hbmRfZXhpdCgmcFRhc2stPnRhc2tDb21wbGV0ZSwgMCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKKworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFVTQiBjb21tYW5kIGtlcm5lbCB0aHJlYWQuCisKK0FyZ3VtZW50czoKKwkqQ29udGV4dAkJCXRoZSBwQWQsIGRyaXZlciBjb250cm9sIGJsb2NrIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCWNsb3NlIHRoZSB0aHJlYWQKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBSVFVTQkNtZFRocmVhZChJTiB2b2lkICpDb250ZXh0KQoreworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzazsKKwlpbnQgc3RhdHVzOworCXN0YXR1cyA9IDA7CisKKwlwVGFzayA9IChzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICopQ29udGV4dDsKKwlwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKXBUYXNrLT5wcml2OworCisJUnRtcE9TVGFza0N1c3RvbWl6ZShwVGFzayk7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwlwQWQtPkNtZFEuQ21kUVN0YXRlID0gUlRNUF9UQVNLX1NUQVRfUlVOTklORzsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKworCXdoaWxlIChwQWQgJiYgcEFkLT5DbWRRLkNtZFFTdGF0ZSA9PSBSVE1QX1RBU0tfU1RBVF9SVU5OSU5HKSB7CisjaWZkZWYgS1RIUkVBRF9TVVBQT1JUCisJCVJUTVBfV0FJVF9FVkVOVF9JTlRFUlJVUFRJQkxFKHBBZCwgcFRhc2spOworI2Vsc2UKKwkJLyogbG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICovCisJCVJUTVBfU0VNX0VWRU5UX1dBSVQoJihwVGFzay0+dGFza1NlbWEpLCBzdGF0dXMpOworCisJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKwkJaWYgKHBBZC0+Q21kUS5DbWRRU3RhdGUgPT0gUlRNUF9UQVNLX1NUQVRfU1RPUEVEKQorCQkJYnJlYWs7CisKKwkJaWYgKCFwQWQtPlBNX0ZsZ1N1c3BlbmQpCisJCQlDTURIYW5kbGVyKHBBZCk7CisJfQorCisJaWYgKHBBZCAmJiAhcEFkLT5QTV9GbGdTdXNwZW5kKSB7CS8qIENsZWFyIHRoZSBDbWRRRWxlbWVudHMuICovCisJCXN0cnVjdCBydF9jbWRxZWxtdCAqcENtZFFFbG10ID0gTlVMTDsKKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwkJcEFkLT5DbWRRLkNtZFFTdGF0ZSA9IFJUTVBfVEFTS19TVEFUX1NUT1BFRDsKKwkJd2hpbGUgKHBBZC0+Q21kUS5zaXplKSB7CisJCQlSVFVTQkRlcXVldWVDbWQoJnBBZC0+Q21kUSwgJnBDbWRRRWxtdCk7CisJCQlpZiAocENtZFFFbG10KSB7CisJCQkJaWYgKHBDbWRRRWxtdC0+Q21kRnJvbU5kaXMgPT0gVFJVRSkgeworCQkJCQlpZiAocENtZFFFbG10LT5idWZmZXIgIT0gTlVMTCkKKwkJCQkJCW9zX2ZyZWVfbWVtKHBBZCwKKwkJCQkJCQkgICAgcENtZFFFbG10LT5idWZmZXIpOworCQkJCQlvc19mcmVlX21lbShwQWQsICh1OCAqKXBDbWRRRWxtdCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKChwQ21kUUVsbXQtPmJ1ZmZlciAhPSBOVUxMKQorCQkJCQkgICAgJiYgKHBDbWRRRWxtdC0+YnVmZmVybGVuZ3RoICE9IDApKQorCQkJCQkJb3NfZnJlZV9tZW0ocEFkLAorCQkJCQkJCSAgICBwQ21kUUVsbXQtPmJ1ZmZlcik7CisJCQkJCW9zX2ZyZWVfbWVtKHBBZCwgKHU4ICopcENtZFFFbG10KTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwl9CisJLyogbm90aWZ5IHRoZSBleGl0IHJvdXRpbmUgdGhhdCB3ZSdyZSBhY3R1YWxseSBleGl0aW5nIG5vdworCSAqCisJICogY29tcGxldGUoKS93YWl0X2Zvcl9jb21wbGV0aW9uKCkgaXMgc2ltaWxhciB0byB1cCgpL2Rvd24oKSwKKwkgKiBleGNlcHQgdGhhdCBjb21wbGV0ZSgpIGlzIHNhZmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHN0cnVjdHVyZQorCSAqIGlzIGdldHRpbmcgZGVsZXRlZCBpbiBhIHBhcmFsbGVsIG1vZGUgb2YgZXhlY3V0aW9uIChpLmUuIGp1c3QKKwkgKiBhZnRlciB0aGUgZG93bigpIC0tIHRoYXQncyBuZWNlc3NhcnkgZm9yIHRoZSB0aHJlYWQtc2h1dGRvd24KKwkgKiBjYXNlLgorCSAqCisJICogY29tcGxldGVfYW5kX2V4aXQoKSBnb2VzIGV2ZW4gZnVydGhlciB0aGFuIHRoaXMgLS0gaXQgaXMgc2FmZSBpbgorCSAqIHRoZSBjYXNlIHRoYXQgdGhlIHRocmVhZCBvZiB0aGUgY2FsbGVyIGlzIGdvaW5nIGF3YXkgKG5vdCBqdXN0CisJICogdGhlIHN0cnVjdHVyZSkgLS0gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBtb2R1bGUtcmVtb3ZlIGNhc2UuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgaW4gcHJlZW1wdGlvbiBrZXJuZWxzLCB3aGljaCB0cmFuc2ZlciB0aGUgZmxvdworCSAqIG9mIGV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGEgY29tcGxldGUoKS4KKwkgKi8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tUlRVU0JDbWRUaHJlYWRcbiIpKTsKKworI2lmbmRlZiBLVEhSRUFEX1NVUFBPUlQKKwlwVGFzay0+dGFza1BJRCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKwljb21wbGV0ZV9hbmRfZXhpdCgmcFRhc2stPnRhc2tDb21wbGV0ZSwgMCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKKworfQorCit2b2lkIFJUVVNCV2F0Y2hEb2coc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CisJaW50IGlkeDsKKwl1bnNpZ25lZCBsb25nIGlycUZsYWdzOworCVBVUkIgcFVyYjsKKwlCT09MRUFOIG5lZWREdW1wU2VxID0gRkFMU0U7CisJdTMyIE1BQ1ZhbHVlOworCXUzMiBUeFJ4UV9QY250OworCisJaWR4ID0gMDsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYUlhRX1BDTlQsICZNQUNWYWx1ZSk7CisJaWYgKChNQUNWYWx1ZSAmIDB4ZmYpICE9IDApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJUWCBRVUVVRSAwIE5vdCBFTVBUWShWYWx1ZT0weCUweCkhXG4iLAorCQkJICBNQUNWYWx1ZSkpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfQ0ZHLCAweGY0MDAxMik7CisJCXdoaWxlICgoTUFDVmFsdWUgJiAweGZmKSAhPSAwICYmIChpZHgrKyA8IDEwKSkgeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWFJYUV9QQ05ULCAmTUFDVmFsdWUpOworCQkJUlRNUHVzZWNEZWxheSgxKTsKKwkJfQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfQ0ZHLCAweGY0MDAwNik7CisJfQorCisJaWYgKHBBZC0+d2F0Y2hEb2dSeE92ZXJGbG93Q250ID49IDIpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNYXliZSB0aGUgUnggQnVsay1JbiBoYW5nZWQhIENhbmNlbCB0aGUgcGVuZGluZyBSeCBidWxrcyByZXF1ZXN0IVxuIikpOworCQlpZiAoKCFSVE1QX1RFU1RfRkxBRworCQkgICAgIChwQWQsCisJCSAgICAgIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJICAgICAgIGZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUIHwKKwkJICAgICAgIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCSAgICAgICBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNhbGwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU4gdG8gY2FuY2VsIHRoZSBwZW5kaW5nIFJ4IEJ1bGshXG4iKSk7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQpOworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19JTiwKKwkJCQkJCU5VTEwsIDApOworCQkJbmVlZER1bXBTZXEgPSBUUlVFOworCQl9CisJCXBBZC0+d2F0Y2hEb2dSeE92ZXJGbG93Q250ID0gMDsKKwl9CisKKwlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIDB4NDM4LCAmVHhSeFFfUGNudCk7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE5VTV9PRl9UWF9SSU5HOyBpZHgrKykgeworCQlwVXJiID0gTlVMTDsKKworCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW2lkeF0sIGlycUZsYWdzKTsKKwkJaWYgKChwQWQtPkJ1bGtPdXRQZW5kaW5nW2lkeF0gPT0gVFJVRSkKKwkJICAgICYmIHBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnQpIHsKKwkJCWludCBhY3R1YWxfbGVuZ3RoID0gMCwgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDA7CisJCQlCT09MRUFOIGlzRGF0YVBhY2tldCA9IEZBTFNFOworCQkJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtpZHhdKys7CisKKwkJCWlmICgocEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtpZHhdID4gMikgJiYKKwkJCSAgICAoIVJUTVBfVEVTVF9GTEFHCisJCQkgICAgIChwQWQsCisJCQkgICAgICAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkgICAgICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCSAgICAgICBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfAorCQkJICAgICAgIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQkJICAgICkgeworCQkJCS8qIEZJWE1FOiBGb2xsb3dpbmcgY29kZSBqdXN0IHN1cHBvcnQgc2luZ2xlIGJ1bGsgb3V0LiBJZiB5b3Ugd2FubmEgc3VwcG9ydCBtdWx0aXBsZSBidWxrIG91dC4gTW9kaWZ5IGl0ISAqLworCQkJCXBIVFRYQ29udGV4dCA9CisJCQkJICAgIChzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqKSgmcEFkLT5UeENvbnRleHRbaWR4XSk7CisJCQkJaWYgKHBIVFRYQ29udGV4dC0+SVJQUGVuZGluZykgewkvKiBDaGVjayBUeENvbnRleHQuICovCisJCQkJCXBVcmIgPSBwSFRUWENvbnRleHQtPnBVcmI7CisKKwkJCQkJYWN0dWFsX2xlbmd0aCA9IHBVcmItPmFjdHVhbF9sZW5ndGg7CisJCQkJCXRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPQorCQkJCQkgICAgcFVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aDsKKwkJCQkJaXNEYXRhUGFja2V0ID0gVFJVRTsKKwkJCQl9IGVsc2UgaWYgKGlkeCA9PSBNR01UUElQRUlEWCkgeworCQkJCQlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcE1MTUVDb250ZXh0LCAqcE5VTExDb250ZXh0LAorCQkJCQkgICAgKnBQc1BvbGxDb250ZXh0OworCisJCQkJCS8qQ2hlY2sgTWdtdENvbnRleHQuICovCisJCQkJCXBNTE1FQ29udGV4dCA9CisJCQkJCSAgICAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKikocEFkLT5NZ210UmluZy4KKwkJCQkJCQkgICBDZWxsW3BBZC0+TWdtdFJpbmcuCisJCQkJCQkJCVR4RG1hSWR4XS4KKwkJCQkJCQkgICBBbGxvY1ZhKTsKKwkJCQkJcFBzUG9sbENvbnRleHQgPQorCQkJCQkgICAgKHN0cnVjdCBydF90eF9jb250ZXh0ICopKCZwQWQtPlBzUG9sbENvbnRleHQpOworCQkJCQlwTlVMTENvbnRleHQgPQorCQkJCQkgICAgKHN0cnVjdCBydF90eF9jb250ZXh0ICopKCZwQWQtPk51bGxDb250ZXh0KTsKKworCQkJCQlpZiAocE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nKSB7CisJCQkJCQlBU1NFUlQocE1MTUVDb250ZXh0LT4KKwkJCQkJCSAgICAgICBJUlBQZW5kaW5nKTsKKwkJCQkJCXBVcmIgPSBwTUxNRUNvbnRleHQtPnBVcmI7CisJCQkJCX0gZWxzZSBpZiAocE5VTExDb250ZXh0LT5JUlBQZW5kaW5nKSB7CisJCQkJCQlBU1NFUlQocE5VTExDb250ZXh0LT4KKwkJCQkJCSAgICAgICBJUlBQZW5kaW5nKTsKKwkJCQkJCXBVcmIgPSBwTlVMTENvbnRleHQtPnBVcmI7CisJCQkJCX0gZWxzZSBpZiAocFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcpIHsKKwkJCQkJCUFTU0VSVChwUHNQb2xsQ29udGV4dC0+CisJCQkJCQkgICAgICAgSVJQUGVuZGluZyk7CisJCQkJCQlwVXJiID0gcFBzUG9sbENvbnRleHQtPnBVcmI7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbaWR4XSwKKwkJCQkJCWlycUZsYWdzKTsKKworCQkJCXByaW50ayhLRVJOX0lORk8gIiVkOiVsdSBMVEw9JWQgLCBUTD0lZCBMOiVkXG4iLAorCQkJCSAgICAgICBpZHgsIHBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbaWR4XSwKKwkJCQkgICAgICAgcEFkLT5UcmFuc2ZlcmVkTGVuZ3RoW2lkeF0sCisJCQkJICAgICAgIGFjdHVhbF9sZW5ndGgsIHRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOworCisJCQkJaWYgKHBVcmIpIHsKKwkJCQkJaWYgKChpc0RhdGFQYWNrZXQKKwkJCQkJICAgICAmJiBwQWQtPlRyYW5zZmVyZWRMZW5ndGhbaWR4XSA9PQorCQkJCQkgICAgIGFjdHVhbF9sZW5ndGgKKwkJCQkJICAgICAmJiBwQWQtPlRyYW5zZmVyZWRMZW5ndGhbaWR4XSA8CisJCQkJCSAgICAgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aAorCQkJCQkgICAgICYmIGFjdHVhbF9sZW5ndGggIT0gMAorLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFR4UnhRX1BjbnQ9PTAgKi8KKwkJCQkJICAgICAmJiBwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W2lkeF0gPgorCQkJCQkgICAgIDMpCisJCQkJCSAgICB8fCBpc0RhdGFQYWNrZXQgPT0gRkFMU0UKKwkJCQkJICAgIHx8IHBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbaWR4XSA+CisJCQkJCSAgICA2KSB7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkgKCJNYXliZSB0aGUgVHggQnVsay1PdXQgaGFuZ2VkISBDYW5jZWwgdGhlIHBlbmRpbmcgVHggYnVsa3MgcmVxdWVzdCBvZiBpZHgoJWQpIVxuIiwKKwkJCQkJCQkgIGlkeCkpOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkJICgiVW5saW5rIHRoZSBwZW5kaW5nIFVSQiFcbiIpKTsKKwkJCQkJCS8qIHVubGluayBpdCBub3cgKi8KKwkJCQkJCVJUVVNCX1VOTElOS19VUkIocFVyYik7CisJCQkJCQkvKiBTbGVlcCAyMDAgbWljcm9zZWNvbmRzIHRvIGdpdmUgY2FuY2VsbGF0aW9uIHRpbWUgdG8gd29yayAqLworCQkJCQkJLypSVE1QdXNlY0RlbGF5KDIwMCk7ICovCisJCQkJCQluZWVkRHVtcFNlcSA9IFRSVUU7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCSAoIlVua25vd24gYnVsa091dCBVUkIgbWF5YmUgaGFuZ2VkIVxuIikpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW2lkeF0sCisJCQkJCQlpcnFGbGFncyk7CisJCQl9CisKKwkJCWlmIChpc0RhdGFQYWNrZXQgPT0gVFJVRSkKKwkJCQlwQWQtPlRyYW5zZmVyZWRMZW5ndGhbaWR4XSA9IGFjdHVhbF9sZW5ndGg7CisJCX0gZWxzZSB7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbaWR4XSwgaXJxRmxhZ3MpOworCQl9CisJfQorCisJLyogRm9yIFNpZ21hIGRlYnVnLCBkdW1wIHRoZSBiYV9yZW9yZGVyaW5nIHNlcXVlbmNlLiAqLworCWlmICgobmVlZER1bXBTZXEgPT0gVFJVRSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKSkgeworCQl1MTYgSWR4OworCQlzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwQkFFbnRyeSA9IE5VTEw7CisJCXU4IGNvdW50ID0gMDsKKwkJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CisKKwkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5CQVJlY1djaWRBcnJheVswXTsKKworCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCQlpZiAoKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAwKSAmJiAocEJBRW50cnktPmxpc3QubmV4dCAhPSBOVUxMKSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTklDVXBkYXRlUmF3Q291bnRlcnMoKTpUaGUgUXVldWVpbmcgcGt0IGluIHJlb3JkZXJpbmcgYnVmZmVyOlxuIikpOworCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisJCQltcGR1X2JsayA9IHBCQUVudHJ5LT5saXN0Lm5leHQ7CisJCQl3aGlsZSAobXBkdV9ibGspIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiXHQlZDpTZXEtJWQsIGJBTVNEVS0lZCFcbiIsIGNvdW50LAorCQkJCQkgIG1wZHVfYmxrLT5TZXF1ZW5jZSwKKwkJCQkJICBtcGR1X2Jsay0+YkFNU0RVKSk7CisJCQkJbXBkdV9ibGsgPSBtcGR1X2Jsay0+bmV4dDsKKwkJCQljb3VudCsrOworCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJcbnBCQUVudHJ5LT5MYXN0SW5kU2VxPSVkIVxuIiwKKwkJCQkgIHBCQUVudHJ5LT5MYXN0SW5kU2VxKSk7CisJCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKwkJfQorCX0KK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBSZWxlYXNlIGFsbG9jYXRlZCByZXNvdXJjZXMuCisKK0FyZ3VtZW50czoKKyAgICAqZGV2CQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQorCXBBZAkJCQkJZHJpdmVyIGNvbnRyb2wgYmxvY2sgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIHZvaWQgcnQyODcwX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkgKCJydHVzYl9kaXNjb25uZWN0OiB1bnJlZ2lzdGVyIHVzYm5ldCB1c2ItJXMtJXNcbiIsCisJCSAgZGV2LT5idXMtPmJ1c19uYW1lLCBkZXYtPmRldnBhdGgpKTsKKwlpZiAoIXBBZCkgeworCQl1c2JfcHV0X2RldihkZXYpOworCQlwcmludGsoInJ0dXNiX2Rpc2Nvbm5lY3Q6IHBBZCA9PSBOVUxMIVxuIik7CisJCXJldHVybjsKKwl9CisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCk7CisKKwkvKiBmb3IgZGVidWcsIHdhaXQgdG8gc2hvdyBzb21lIG1lc3NhZ2VzIHRvIC9wcm9jIHN5c3RlbSAqLworCXVkZWxheSgxKTsKKworCVJ0bXBQaHlOZXREZXZFeGl0KHBBZCwgcEFkLT5uZXRfZGV2KTsKKworCS8qIEZJWE1FOiBTaGFsbCB3ZSBuZWVkIGZvbGxvd2luZyBkZWxheSBhbmQgZmx1c2ggdGhlIHNjaGVkdWxlPz8gKi8KKwl1ZGVsYXkoMSk7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwl1ZGVsYXkoMSk7CisKKwkvKiBmcmVlIHRoZSByb290IG5ldF9kZXZpY2UgKi8KKwlSdG1wT1NOZXREZXZGcmVlKHBBZC0+bmV0X2Rldik7CisKKwlSdG1wUmFEZXZDdHJsRXhpdChwQWQpOworCisJLyogcmVsZWFzZSBhIHVzZSBvZiB0aGUgdXNiIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwl1c2JfcHV0X2RldihkZXYpOworCXVkZWxheSgxKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiBSVFVTQiBkaXNjb25uZWN0IHN1Y2Nlc3NmdWxseVxuIikpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBydDI4NzBfcHJvYmUoSU4gc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkJICBJTiBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKKwkJCQkgIElOIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICpkZXZfaWQsCisJCQkJICBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICoqIHBwQWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBOVUxMOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopTlVMTDsKKwlpbnQgc3RhdHVzLCBydjsKKwl2b2lkICpoYW5kbGU7CisJc3RydWN0IHJ0X3J0bXBfb3NfbmV0ZGV2X29wX2hvb2sgbmV0RGV2SG9vazsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydDI4NzBfcHJvYmUoKSFcbiIpKTsKKworCS8qIENoZWNrIGNoaXBzZXQgdmVuZG9yL3Byb2R1Y3QgSUQgKi8KKwkvKmlmIChSVDI4WFhDaGlwc2V0Q2hlY2soX2Rldl9wKSA9PSBGQUxTRSkgKi8KKwkvKiAgICAgIGdvdG8gZXJyX291dDsgKi8KKworLypSdG1wRGV2SW5pdD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCS8qIEFsbG9jYXRlIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgYWRhcHRlciBzdHJ1Y3R1cmUgKi8KKwloYW5kbGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb3NfY29va2llKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisJCXByaW50aworCQkgICAgKCJydDI4NzBfcHJvYmUoKTogQWxsb2NhdGUgbWVtb3J5IGZvciBvcyBoYW5kbGUgZmFpbGVkIVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkoKHN0cnVjdCBvc19jb29raWUgKiloYW5kbGUpLT5wVXNiX0RldiA9IHVzYl9kZXY7CisKKwlydiA9IFJUTVBBbGxvY0FkYXB0ZXJCbG9jayhoYW5kbGUsICZwQWQpOworCWlmIChydiAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCWtmcmVlKGhhbmRsZSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisvKlVTQkRldkluaXQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJaWYgKFVTQkRldkNvbmZpZ0luaXQodXNiX2RldiwgaW50ZiwgcEFkKSA9PSBGQUxTRSkKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmFkZXY7CisKKwlSdG1wUmFEZXZDdHJsSW5pdChwQWQsIFJUTVBfREVWX0lORl9VU0IpOworCisvKk5ldERldkluaXQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJbmV0X2RldiA9IFJ0bXBQaHlOZXREZXZJbml0KHBBZCwgJm5ldERldkhvb2spOworCWlmIChuZXRfZGV2ID09IE5VTEwpCisJCWdvdG8gZXJyX291dF9mcmVlX3JhZGV2OworCisJLyogSGVyZSBhcmUgdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHdpdGggdXNiIHNwZWNpZmljIHBhcmFtZXRlcnMuICovCisJLyogZm9yIHN1cHBvcnRpbmcgTmV0d29yayBNYW5hZ2VyLgorCSAqIFNldCB0aGUgc3lzZnMgcGh5c2ljYWwgZGV2aWNlIHJlZmVyZW5jZSBmb3IgdGhlIG5ldHdvcmsgbG9naWNhbCBkZXZpY2UgaWYgc2V0IHByaW9yIHRvIHJlZ2lzdHJhdGlvbiB3aWxsCisJICogY2F1c2UgYSBzeW1saW5rIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKwkgKi8KKwlTRVRfTkVUREVWX0RFVihuZXRfZGV2LCAmKHVzYl9kZXYtPmRldikpOworCisJcEFkLT5TdGFDZmcuT3JpRGV2VHlwZSA9IG5ldF9kZXYtPnR5cGU7CisKKy8qQWxsIGRvbmUsIGl0J3MgdGltZSB0byByZWdpc3RlciB0aGUgbmV0IGRldmljZSB0byBsaW51eCBrZXJuZWwuICovCisJLyogUmVnaXN0ZXIgdGhpcyBkZXZpY2UgKi8KKwlzdGF0dXMgPSBSdG1wT1NOZXREZXZBdHRhY2gobmV0X2RldiwgJm5ldERldkhvb2spOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCisjaWZkZWYgS1RIUkVBRF9TVVBQT1JUCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcEFkLT5tbG1lVGFzay5rdGhyZWFkX3EpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBBZC0+dGltZXJUYXNrLmt0aHJlYWRfcSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcEFkLT5jbWRRVGFzay5rdGhyZWFkX3EpOworI2VuZGlmCisKKwkqcHBBZCA9IHBBZDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT1ydDI4NzBfcHJvYmUoKSFcbiIpKTsKKworCXJldHVybiAwOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVSUk9SIEhBTkRMRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2Vycl9vdXRfZnJlZV9uZXRkZXY6CisJUnRtcE9TTmV0RGV2RnJlZShuZXRfZGV2KTsKKworZXJyX291dF9mcmVlX3JhZGV2OgorCVJUTVBGcmVlQWRhcHRlcihwQWQpOworCitlcnJfb3V0OgorCSpwcEFkID0gTlVMTDsKKworCXJldHVybiAtMTsKKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC93cGEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvd3BhLmgKaW5kZXggNzAwNmUzOC4uNjE5OWFlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC93cGEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3dwYS5oCkBAIC0zOCw3ICszOCw3IEBACiAjaWZuZGVmCV9fV1BBX0hfXwogI2RlZmluZQlfX1dQQV9IX18KIAotLy8gRUFQT0wgS2V5IGRlc2NyaXB0ZXIgZnJhbWUgZm9ybWF0IHJlbGF0ZWQgbGVuZ3RoCisvKiBFQVBPTCBLZXkgZGVzY3JpcHRlciBmcmFtZSBmb3JtYXQgcmVsYXRlZCBsZW5ndGggKi8KICNkZWZpbmUgTEVOX0tFWV9ERVNDX05PTkNFCQkJMzIKICNkZWZpbmUgTEVOX0tFWV9ERVNDX0lWCQkJCTE2CiAjZGVmaW5lIExFTl9LRVlfREVTQ19SU0MJCQk4CkBAIC00NiwzOSArNDYsMzggQEAKICNkZWZpbmUgTEVOX0tFWV9ERVNDX1JFUExBWQkJCTgKICNkZWZpbmUgTEVOX0tFWV9ERVNDX01JQwkJCTE2CiAKLS8vIFRoZSBsZW5ndGggaXMgdGhlIEVBUG9MLUtleSBmcmFtZSBleGNlcHQga2V5IGRhdGEgZmllbGQuCi0vLyBQbGVhc2UgcmVmZXIgdG8gODAyLjExaS0yMDA0ICxGaWd1cmUgNDN1IGluIHAuNzgKLSNkZWZpbmUgTEVOX0VBUE9MX0tFWV9NU0cJCQkoc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUpCisvKiBUaGUgbGVuZ3RoIGlzIHRoZSBFQVBvTC1LZXkgZnJhbWUgZXhjZXB0IGtleSBkYXRhIGZpZWxkLiAqLworLyogUGxlYXNlIHJlZmVyIHRvIDgwMi4xMWktMjAwNCAsRmlndXJlIDQzdSBpbiBwLjc4ICovCisjZGVmaW5lIExFTl9FQVBPTF9LRVlfTVNHCQkJKHNpemVvZihzdHJ1Y3QgcnRfa2V5X2Rlc2NyaXB0ZXIpIC0gTUFYX0xFTl9PRl9SU05JRSkKIAotLy8gRUFQIENvZGUgVHlwZS4KKy8qIEVBUCBDb2RlIFR5cGUuICovCiAjZGVmaW5lIEVBUF9DT0RFX1JFUVVFU1QJMQogI2RlZmluZSBFQVBfQ09ERV9SRVNQT05TRQkyCiAjZGVmaW5lIEVBUF9DT0RFX1NVQ0NFU1MgICAgMwogI2RlZmluZSBFQVBfQ09ERV9GQUlMVVJFICAgIDQKIAotLy8gRUFQT0wgZnJhbWUgUHJvdG9jb2wgVmVyc2lvbgorLyogRUFQT0wgZnJhbWUgUHJvdG9jb2wgVmVyc2lvbiAqLwogI2RlZmluZQlFQVBPTF9WRVIJCQkJCTEKICNkZWZpbmUJRUFQT0xfVkVSMgkJCQkJMgogCi0vLyBFQVBPTC1LRVkgRGVzY3JpcHRvciBUeXBlCisvKiBFQVBPTC1LRVkgRGVzY3JpcHRvciBUeXBlICovCiAjZGVmaW5lCVdQQTFfS0VZX0RFU0MJCQkJMHhmZQogI2RlZmluZSBXUEEyX0tFWV9ERVNDICAgICAgICAgICAgICAgMHgwMgogCi0vLyBLZXkgRGVzY3JpcHRvciBWZXJzaW9uIG9mIEtleSBJbmZvcm1hdGlvbgorLyogS2V5IERlc2NyaXB0b3IgVmVyc2lvbiBvZiBLZXkgSW5mb3JtYXRpb24gKi8KICNkZWZpbmUJREVTQ19UWVBFX1RLSVAJCQkJMQogI2RlZmluZQlERVNDX1RZUEVfQUVTCQkJCTIKLSNkZWZpbmUgREVTQ19UWVBFX01FU0gJCQkJMwogCiAjZGVmaW5lIExFTl9NU0cxXzJXQVkgICAgICAgICAgICAgICAweDdmCiAjZGVmaW5lIE1BWF9MRU5fT0ZfRUFQX0hTICAgICAgICAgICAyNTYKIAogI2RlZmluZSBMRU5fTUFTVEVSX0tFWQkJCQkzMgogCi0vLyBFQVBPTCBFSywgTUsKKy8qIEVBUE9MIEVLLCBNSyAqLwogI2RlZmluZSBMRU5fRUFQX0VLCQkJCQkxNgogI2RlZmluZSBMRU5fRUFQX01JQ0sJCQkJMTYKICNkZWZpbmUgTEVOX0VBUF9LRVkJCQkJCSgoTEVOX0VBUF9FSykrKExFTl9FQVBfTUlDSykpCi0vLyBUS0lQIGtleSByZWxhdGVkCisvKiBUS0lQIGtleSByZWxhdGVkICovCiAjZGVmaW5lIExFTl9QTUtJRAkJCQkJMTYKICNkZWZpbmUgTEVOX1RLSVBfRUsJCQkJCTE2CiAjZGVmaW5lIExFTl9US0lQX1JYTUlDSwkJCQk4CkBAIC05MCwxMiArODksMTggQEAKICNkZWZpbmUgVEtJUF9BUF9SWE1JQ0tfT0ZGU0VUCQkoVEtJUF9BUF9UWE1JQ0tfT0ZGU0VUK0xFTl9US0lQX1RYTUlDSykKICNkZWZpbmUgVEtJUF9HVEtfTEVOR1RICQkJCSgoTEVOX1RLSVBfRUspKyhMRU5fVEtJUF9SWE1JQ0spKyhMRU5fVEtJUF9UWE1JQ0spKQogI2RlZmluZSBMRU5fUFRLCQkJCQkJKChMRU5fRUFQX0tFWSkrKExFTl9US0lQX0tFWSkpCisjZGVmaW5lIE1JTl9MRU5fT0ZfR1RLCQkJCTUKKyNkZWZpbmUgTEVOX1BNSwkJCQkJCTMyCisjZGVmaW5lIExFTl9QTUtfTkFNRQkJCQkxNgorI2RlZmluZSBMRU5fTk9OQ0UJCQkJCTMyCiAKLS8vIFJTTiBJRSBMZW5ndGggZGVmaW5pdGlvbgotI2RlZmluZSBNQVhfTEVOX09GX1JTTklFICAgICAgICAgCTkwCisvKiBSU04gSUUgTGVuZ3RoIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgTUFYX0xFTl9PRl9SU05JRQkJMjU1CiAjZGVmaW5lIE1JTl9MRU5fT0ZfUlNOSUUgICAgICAgICAJOAogCi0vL0VBUCBQYWNrZXQgVHlwZQorI2RlZmluZSBLRVlfTElGRVRJTUUJCQkJMzYwMAorCisvKkVBUCBQYWNrZXQgVHlwZSAqLwogI2RlZmluZQlFQVBQYWNrZXQJCTAKICNkZWZpbmUJRUFQT0xTdGFydAkJMQogI2RlZmluZQlFQVBPTExvZ29mZgkJMgpAQCAtMTE0LDExICsxMTksMzMgQEAKICNkZWZpbmUgUEFJUldJU0VLRVkJCQkJCTEKICNkZWZpbmUgR1JPVVBLRVkJCQkJCTAKIAotLy8gUmV0cnkgdGltZXIgY291bnRlciBpbml0aWFsIHZhbHVlCisvKiBSZXRyeSB0aW1lciBjb3VudGVyIGluaXRpYWwgdmFsdWUgKi8KICNkZWZpbmUgUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUiAgICAgICAgICAgMAogI2RlZmluZSBQRUVSX01TRzNfUkVUUllfVElNRVJfQ1RSICAgICAgICAgICAxMAogI2RlZmluZSBHUk9VUF9NU0cxX1JFVFJZX1RJTUVSX0NUUiAgICAgICAgICAyMAogCisvKiNpZmRlZiBDT05GSUdfQVBfU1VQUE9SVCAqLworLyogV1BBIG1lY2hhbmlzbSByZXRyeSB0aW1lciBpbnRlcnZhbCAqLworI2RlZmluZSBQRUVSX01TRzFfUkVUUllfRVhFQ19JTlRWICAgICAgICAgICAxMDAwCS8qIDEgc2VjICovCisjZGVmaW5lIFBFRVJfTVNHM19SRVRSWV9FWEVDX0lOVFYgICAgICAgICAgIDMwMDAJLyogMyBzZWMgKi8KKyNkZWZpbmUgR1JPVVBfS0VZX1VQREFURV9FWEVDX0lOVFYgICAgICAgICAgMTAwMAkvKiAxIHNlYyAqLworI2RlZmluZSBQRUVSX0dST1VQX0tFWV9VUERBVEVfSU5JVgkJCTIwMDAJLyogMiBzZWMgKi8KKworI2RlZmluZSBFTlFVRVVFX0VBUE9MX1NUQVJUX1RJTUVSCQkJMjAwCS8qIDIwMCBtcyAqLworCisvKiBncm91cCByZWtleSBpbnRlcnZhbCAqLworI2RlZmluZSBUSU1FX1JFS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBLVF9SRUtFWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRElTQUJMRV9SRUtFWSAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfUkVLRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgTUFYX1JFS0VZX0lOVEVSICAgICAgICAgICAgICAgICAgICAgMHgzZmZmZmZmCisvKiNlbmRpZiAvLyBDT05GSUdfQVBfU1VQUE9SVCAvLyAqLworCisjZGVmaW5lIEdST1VQX1NVSVRFCQkJCQkwCisjZGVmaW5lIFBBSVJXSVNFX1NVSVRFCQkJCTEKKyNkZWZpbmUgQUtNX1NVSVRFCQkJCQkyCisjZGVmaW5lIFBNS0lEX0xJU1QJCQkJCTMKIAogI2RlZmluZSBFQVBPTF9TVEFSVF9ESVNBQkxFCQkJCQkwCiAjZGVmaW5lIEVBUE9MX1NUQVJUX1BTSwkJCQkJCTEKQEAgLTEyOSwxMiArMTU2LDMzIEBACiAjZGVmaW5lIE1JWF9DSVBIRVJfV1BBMl9US0lQX09OKHgpICAgICAgKCgoeCkgJiAweDAyKSAhPSAwKQogI2RlZmluZSBNSVhfQ0lQSEVSX1dQQTJfQUVTX09OKHgpICAgICAgICgoKHgpICYgMHgwMSkgIT0gMCkKIAorI2lmbmRlZiBST1VORF9VUAogI2RlZmluZSBST1VORF9VUChfX3gsIF9feSkgXAotCSgoKFVMT05HKSgoX194KSsoKF9feSktMSkpKSAmICgoVUxPTkcpfigoX195KS0xKSkpCisJKCgodW5zaWduZWQgbG9uZykoKF9feCkrKChfX3kpLTEpKSkgJiAoKHVuc2lnbmVkIGxvbmcpfigoX195KS0xKSkpCisjZW5kaWYKKworI2RlZmluZQlTRVRfdTE2X1RPX0FSUkFSWShfViwgX0xFTikJCVwKK3sJCQkJCQkJCQkJCVwKKwlfVlswXSA9IChfTEVOICYgMHhGRjAwKSA+PiA4OwkJCVwKKwlfVlsxXSA9IChfTEVOICYgMHhGRik7CQkJCQlcCit9CisKKyNkZWZpbmUJSU5DX3UxNl9UT19BUlJBUlkoX1YsIF9MRU4pCQkJXAorewkJCQkJCQkJCQkJCVwKKwl1MTYJdmFyX2xlbjsJCQkJCQkJXAorCQkJCQkJCQkJCQkJXAorCXZhcl9sZW4gPSAoX1ZbMF08PDgpIHwgKF9WWzFdKTsJCQkJXAorCXZhcl9sZW4gKz0gX0xFTjsJCQkJCQkJXAorCQkJCQkJCQkJCQkJXAorCV9WWzBdID0gKHZhcl9sZW4gJiAweEZGMDApID4+IDg7CQkJXAorCV9WWzFdID0gKHZhcl9sZW4gJiAweEZGKTsJCQkJCVwKK30KKworI2RlZmluZQlDT05WX0FSUkFSWV9UT191MTYoX1YpCSgoX1ZbMF08PDgpIHwgKF9WWzFdKSkKIAogI2RlZmluZQlBRERfT05FX1RvXzY0QklUX1ZBUihfVikJCVwKIHsJCQkJCQkJCQkJXAotCVVDSEFSCWNudCA9IExFTl9LRVlfREVTQ19SRVBMQVk7CVwKKwl1OAljbnQgPSBMRU5fS0VZX0RFU0NfUkVQTEFZOwlcCiAJZG8JCQkJCQkJCQlcCiAJewkJCQkJCQkJCVwKIAkJY250LS07CQkJCQkJCVwKQEAgLTE0NiwxODIgKzE5NCwyMDAgQEAKIAogI2RlZmluZSBJU19XUEFfQ0FQQUJJTElUWShhKSAgICAgICAoKChhKSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmICgoYSkgPD0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQogCi0vLyBFQVBPTCBLZXkgSW5mb3JtYXRpb24gZGVmaW5pdGlvbiB3aXRoaW4gS2V5IGRlc2NyaXB0b3IgZm9ybWF0Ci10eXBlZGVmCXN0cnVjdCBQQUNLRUQgX0tFWV9JTkZPCi17Ci0JVUNIQVIJS2V5TWljOjE7Ci0JVUNIQVIJU2VjdXJlOjE7Ci0JVUNIQVIJRXJyb3I6MTsKLQlVQ0hBUglSZXF1ZXN0OjE7Ci0JVUNIQVIJRUtEX0RMOjE7ICAgICAgIC8vIEVLRCBmb3IgQVA7IERMIGZvciBTVEEKLQlVQ0hBUglSc3ZkOjM7Ci0JVUNIQVIJS2V5RGVzY1ZlcjozOwotCVVDSEFSCUtleVR5cGU6MTsKLQlVQ0hBUglLZXlJbmRleDoyOwotCVVDSEFSCUluc3RhbGw6MTsKLQlVQ0hBUglLZXlBY2s6MTsKLX0JS0VZX0lORk8sICpQS0VZX0lORk87CisvKiBFQVBPTCBLZXkgSW5mb3JtYXRpb24gZGVmaW5pdGlvbiB3aXRoaW4gS2V5IGRlc2NyaXB0b3IgZm9ybWF0ICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2tleV9pbmZvIHsKKwl1OCBLZXlNaWM6MTsKKwl1OCBTZWN1cmU6MTsKKwl1OCBFcnJvcjoxOworCXU4IFJlcXVlc3Q6MTsKKwl1OCBFS0RfREw6MTsJCS8qIEVLRCBmb3IgQVA7IERMIGZvciBTVEEgKi8KKwl1OCBSc3ZkOjM7CisJdTggS2V5RGVzY1ZlcjozOworCXU4IEtleVR5cGU6MTsKKwl1OCBLZXlJbmRleDoyOworCXU4IEluc3RhbGw6MTsKKwl1OCBLZXlBY2s6MTsKK307CiAKLS8vIEVBUE9MIEtleSBkZXNjcmlwdG9yIGZvcm1hdAotdHlwZWRlZglzdHJ1Y3QgUEFDS0VEIF9LRVlfREVTQ1JJUFRFUgotewotCVVDSEFSCQlUeXBlOwotCUtFWV9JTkZPCUtleUluZm87Ci0JVUNIQVIJCUtleUxlbmd0aFsyXTsKLQlVQ0hBUgkJUmVwbGF5Q291bnRlcltMRU5fS0VZX0RFU0NfUkVQTEFZXTsKLQlVQ0hBUgkJS2V5Tm9uY2VbTEVOX0tFWV9ERVNDX05PTkNFXTsKLQlVQ0hBUgkJS2V5SXZbTEVOX0tFWV9ERVNDX0lWXTsKLQlVQ0hBUgkJS2V5UnNjW0xFTl9LRVlfREVTQ19SU0NdOwotCVVDSEFSCQlLZXlJZFtMRU5fS0VZX0RFU0NfSURdOwotCVVDSEFSCQlLZXlNaWNbTEVOX0tFWV9ERVNDX01JQ107Ci0JVUNIQVIJCUtleURhdGFMZW5bMl07Ci0JVUNIQVIJCUtleURhdGFbTUFYX0xFTl9PRl9SU05JRV07Ci19CUtFWV9ERVNDUklQVEVSLCAqUEtFWV9ERVNDUklQVEVSOworLyogRUFQT0wgS2V5IGRlc2NyaXB0b3IgZm9ybWF0ICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2tleV9kZXNjcmlwdGVyIHsKKwl1OCBUeXBlOworCXN0cnVjdCBydF9rZXlfaW5mbyBLZXlJbmZvOworCXU4IEtleUxlbmd0aFsyXTsKKwl1OCBSZXBsYXlDb3VudGVyW0xFTl9LRVlfREVTQ19SRVBMQVldOworCXU4IEtleU5vbmNlW0xFTl9LRVlfREVTQ19OT05DRV07CisJdTggS2V5SXZbTEVOX0tFWV9ERVNDX0lWXTsKKwl1OCBLZXlSc2NbTEVOX0tFWV9ERVNDX1JTQ107CisJdTggS2V5SWRbTEVOX0tFWV9ERVNDX0lEXTsKKwl1OCBLZXlNaWNbTEVOX0tFWV9ERVNDX01JQ107CisJdTggS2V5RGF0YUxlblsyXTsKKwl1OCBLZXlEYXRhW01BWF9MRU5fT0ZfUlNOSUVdOworfTsKIAotdHlwZWRlZglzdHJ1Y3QgUEFDS0VEIF9FQVBPTF9QQUNLRVQKLXsKLQlVQ0hBUgkgCQkJUHJvVmVyOwotCVVDSEFSCSAJCQlQcm9UeXBlOwotCVVDSEFSCSAJCQlCb2R5X0xlblsyXTsKLQlLRVlfREVTQ1JJUFRFUgkJS2V5RGVzYzsKLX0JRUFQT0xfUEFDS0VULCAqUEVBUE9MX1BBQ0tFVDsKK3N0cnVjdCBQQUNLRUQgcnRfZWFwb2xfcGFja2V0IHsKKwl1OCBQcm9WZXI7CisJdTggUHJvVHlwZTsKKwl1OCBCb2R5X0xlblsyXTsKKwlzdHJ1Y3QgcnRfa2V5X2Rlc2NyaXB0ZXIgS2V5RGVzYzsKK307CiAKLS8vODAyLjExaSBEMTAgcGFnZSA4MwotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9HVEtfRU5DQVAKLXsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIEtpZDoyOwotICAgIFVDSEFSICAgICAgICAgICAgICAgdHg6MTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIHJzdjo1OwotICAgIFVDSEFSICAgICAgICAgICAgICAgcnN2MTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIEdUS1tUS0lQX0dUS19MRU5HVEhdOwotfSAgIEdUS19FTkNBUCwgKlBHVEtfRU5DQVA7CisvKjgwMi4xMWkgRDEwIHBhZ2UgODMgKi8KK3N0cnVjdCBQQUNLRUQgcnRfZ3RrX2VuY2FwIHsKKwl1OCBLaWQ6MjsKKwl1OCB0eDoxOworCXU4IHJzdjo1OworCXU4IHJzdjE7CisJdTggR1RLW1RLSVBfR1RLX0xFTkdUSF07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0tERV9FTkNBUAotewotICAgIFVDSEFSICAgICAgICAgICAgICAgVHlwZTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIExlbjsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIE9VSVszXTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIERhdGFUeXBlOwotICAgIEdUS19FTkNBUCAgICAgIEdUS0VuY2FwOwotfSAgIEtERV9FTkNBUCwgKlBLREVfRU5DQVA7CitzdHJ1Y3QgUEFDS0VEIHJ0X2tkZV9lbmNhcCB7CisJdTggVHlwZTsKKwl1OCBMZW47CisJdTggT1VJWzNdOworCXU4IERhdGFUeXBlOworCXN0cnVjdCBydF9ndGtfZW5jYXAgR1RLRW5jYXA7Cit9OwogCi0vLyBGb3IgV1BBMQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05JRSB7Ci0gICAgVUNIQVIgICBvdWlbNF07Ci0gICAgVVNIT1JUICB2ZXJzaW9uOwotICAgIFVDSEFSICAgbWNhc3RbNF07Ci0gICAgVVNIT1JUICB1Y291bnQ7Ci0gICAgc3RydWN0IFBBQ0tFRCB7Ci0gICAgICAgIFVDSEFSIG91aVs0XTsKLSAgICB9dWNhc3RbMV07Ci19IFJTTklFLCAqUFJTTklFOworLyogRm9yIFdQQTEgKi8KK3N0cnVjdCBQQUNLRUQgcnRfcnNuaWUgeworCXU4IG91aVs0XTsKKwl1MTYgdmVyc2lvbjsKKwl1OCBtY2FzdFs0XTsKKwl1MTYgdWNvdW50OworCXN0cnVjdCBQQUNLRUQgeworCQl1OCBvdWlbNF07CisJfSB1Y2FzdFsxXTsKK307CiAKLS8vIEZvciBXUEEyCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTklFMiB7Ci0gICAgVVNIT1JUICB2ZXJzaW9uOwotICAgIFVDSEFSICAgbWNhc3RbNF07Ci0gICAgVVNIT1JUICB1Y291bnQ7Ci0gICAgc3RydWN0IFBBQ0tFRCB7Ci0gICAgICAgIFVDSEFSIG91aVs0XTsKLSAgICB9dWNhc3RbMV07Ci19IFJTTklFMiwgKlBSU05JRTI7CisvKiBGb3IgV1BBMiAqLworc3RydWN0IFBBQ0tFRCBydF9yc25pZTIgeworCXUxNiB2ZXJzaW9uOworCXU4IG1jYXN0WzRdOworCXUxNiB1Y291bnQ7CisJc3RydWN0IFBBQ0tFRCB7CisJCXU4IG91aVs0XTsKKwl9IHVjYXN0WzFdOworfTsKIAotLy8gQUtNIFN1aXRlCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTklFX0FVVEggewotICAgIFVTSE9SVCBhY291bnQ7Ci0gICAgc3RydWN0IFBBQ0tFRCB7Ci0gICAgICAgIFVDSEFSIG91aVs0XTsKLSAgICB9YXV0aFsxXTsKLX0gUlNOSUVfQVVUSCwqUFJTTklFX0FVVEg7CisvKiBBS00gU3VpdGUgKi8KK3N0cnVjdCBQQUNLRUQgcnRfcnNuaWVfYXV0aCB7CisJdTE2IGFjb3VudDsKKwlzdHJ1Y3QgUEFDS0VEIHsKKwkJdTggb3VpWzRdOworCX0gYXV0aFsxXTsKK307CiAKLXR5cGVkZWYJdW5pb24gUEFDS0VEIF9SU05fQ0FQQUJJTElUSUVTCXsKLQlzdHJ1Y3QJUEFDS0VEIHsKLSAgICAgICAgVVNIT1JUCQlQcmVBdXRoOjE7Ci0JCVVTSE9SVAkJTm9fUGFpcndpc2U6MTsKLQkJVVNIT1JUCQlQVEtTQV9SX0NvdW50ZXI6MjsKLQkJVVNIT1JUCQlHVEtTQV9SX0NvdW50ZXI6MjsKLQkJVVNIT1JUCQlSc3ZkOjEwOwotCX0JZmllbGQ7Ci0JVVNIT1JUCQkJd29yZDsKLX0JUlNOX0NBUEFCSUxJVElFUywgKlBSU05fQ0FQQUJJTElUSUVTOwordHlwZWRlZiB1bmlvbiBQQUNLRUQgX1JTTl9DQVBBQklMSVRJRVMgeworCXN0cnVjdCBQQUNLRUQgeworCQl1MTYgUHJlQXV0aDoxOworCQl1MTYgTm9fUGFpcndpc2U6MTsKKwkJdTE2IFBUS1NBX1JfQ291bnRlcjoyOworCQl1MTYgR1RLU0FfUl9Db3VudGVyOjI7CisJCXUxNiBSc3ZkOjEwOworCX0gZmllbGQ7CisJdTE2IHdvcmQ7Cit9IFJTTl9DQVBBQklMSVRJRVMsICpQUlNOX0NBUEFCSUxJVElFUzsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9FQVBfSERSIHsKLSAgICBVQ0hBUiAgIFByb1ZlcjsKLSAgICBVQ0hBUiAgIFByb1R5cGU7Ci0gICAgVUNIQVIgICBCb2R5X0xlblsyXTsKLSAgICBVQ0hBUiAgIGNvZGU7Ci0gICAgVUNIQVIgICBpZGVudGlmaWVyOwotICAgIFVDSEFSICAgbGVuZ3RoWzJdOyAvLyBpbmNsdWRpbmcgY29kZSBhbmQgaWRlbnRpZmllciwgZm9sbG93ZWQgYnkgbGVuZ3RoLTIgb2N0ZXRzIG9mIGRhdGEKLX0gRUFQX0hEUiwgKlBFQVBfSERSOworc3RydWN0IFBBQ0tFRCBydF9lYXBfaGRyIHsKKwl1OCBQcm9WZXI7CisJdTggUHJvVHlwZTsKKwl1OCBCb2R5X0xlblsyXTsKKwl1OCBjb2RlOworCXU4IGlkZW50aWZpZXI7CisJdTggbGVuZ3RoWzJdOwkvKiBpbmNsdWRpbmcgY29kZSBhbmQgaWRlbnRpZmllciwgZm9sbG93ZWQgYnkgbGVuZ3RoLTIgb2N0ZXRzIG9mIGRhdGEgKi8KK307CiAKLS8vIEZvciBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUgc3RhdGVzLiA4MDIuMTFpIERyYWZ0IDQuMSwgcC4gOTcKLS8vIFdlIHNpbXBsaWZpZWQgaXQKLXR5cGVkZWYJZW51bQlfV3BhU3RhdGUKLXsKLQlTU19OT1RVU0UsCQkJCS8vIDAKLQlTU19TVEFSVCwJCQkJLy8gMQotCVNTX1dBSVRfTVNHXzMsCQkJLy8gMgotCVNTX1dBSVRfR1JPVVAsCQkJLy8gMwotCVNTX0ZJTklTSCwgIAkJCS8vIDQKLQlTU19LRVlVUERBVEUsCQkJLy8gNQotfQlXUEFfU1RBVEU7CisvKiBGb3Igc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lIHN0YXRlcy4gODAyLjExaSBEcmFmdCA0LjEsIHAuIDk3ICovCisvKiBXZSBzaW1wbGlmaWVkIGl0ICovCit0eXBlZGVmIGVudW0gX1dwYVN0YXRlIHsKKwlTU19OT1RVU0UsCQkvKiAwICovCisJU1NfU1RBUlQsCQkvKiAxICovCisJU1NfV0FJVF9NU0dfMywJCS8qIDIgKi8KKwlTU19XQUlUX0dST1VQLAkJLyogMyAqLworCVNTX0ZJTklTSCwJCS8qIDQgKi8KKwlTU19LRVlVUERBVEUsCQkvKiA1ICovCit9IFdQQV9TVEFURTsKIAotLy8KLS8vCVRoZSBkZWZpbml0aW9uIG9mIHRoZSBjaXBoZXIgY29tYmluYXRpb24KLS8vCi0vLyAJIGJpdDMJYml0MiAgYml0MSAgIGJpdDAKLS8vCSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwotLy8gCXwJICBXUEEJIHwJICAgV1BBMiAgIHwKLS8vCSstLS0tLS0rLS0tLS0rLS0tLS0tKy0tLS0tKwotLy8JfCBUS0lQIHwgQUVTIHwgVEtJUCB8IEFFUyB8Ci0vLwl8CTAgIHwgIDEgIHwgICAxICB8ICAwICB8IC0+IDB4MDYKLS8vCXwJMCAgfCAgMSAgfCAgIDEgIHwgIDEgIHwgLT4gMHgwNwotLy8JfAkxICB8ICAwICB8ICAgMCAgfCAgMSAgfCAtPiAweDA5Ci0vLwl8CTEgIHwgIDAgIHwgICAxICB8ICAxICB8IC0+IDB4MEIKLS8vCXwJMSAgfCAgMSAgfCAgIDAgIHwgIDEgIHwgLT4gMHgwRAotLy8JfAkxICB8ICAxICB8ICAgMSAgfCAgMCAgfCAtPiAweDBFCi0vLwl8CTEgIHwgIDEgIHwgICAxICB8ICAxICB8CS0+IDB4MEYKLS8vCSstLS0tLS0rLS0tLS0rLS0tLS0tKy0tLS0tKwotLy8KLXR5cGVkZWYJZW51bQlfV3BhTWl4UGFpckNpcGhlcgotewotCU1JWF9DSVBIRVJfTk9UVVNFIAkJCT0gMHgwMCwKLQlXUEFfTk9ORV9XUEEyX1RLSVBBRVMJCT0gMHgwMywJCS8vIFdQQTItVEtJUEFFUwotCVdQQV9BRVNfV1BBMl9US0lQIAkJCT0gMHgwNiwKLQlXUEFfQUVTX1dQQTJfVEtJUEFFUwkJPSAweDA3LAotCVdQQV9US0lQX1dQQTJfQUVTCQkJPSAweDA5LAotCVdQQV9US0lQX1dQQTJfVEtJUEFFUwkJPSAweDBCLAotCVdQQV9US0lQQUVTX1dQQTJfTk9ORQkJPSAweDBDLAkJLy8gV1BBLVRLSVBBRVMKLQlXUEFfVEtJUEFFU19XUEEyX0FFUwkJPSAweDBELAotCVdQQV9US0lQQUVTX1dQQTJfVEtJUAkJPSAweDBFLAotCVdQQV9US0lQQUVTX1dQQTJfVEtJUEFFUwk9IDB4MEYsCi19CVdQQV9NSVhfUEFJUl9DSVBIRVI7CisvKiAqLworLyogICAgICBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgY2lwaGVyIGNvbWJpbmF0aW9uICovCisvKiAqLworLyogICAgICAgYml0MyAgIGJpdDIgIGJpdDEgICBiaXQwICovCisvKiAgICAgICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKyAqLworLyogICAgICB8ICAgICAgICAgV1BBICAgIHwgICAgICAgICBXUEEyICAgfCAqLworLyogICAgICArLS0tLS0tKy0tLS0tKy0tLS0tLSstLS0tLSsgKi8KKy8qICAgICAgfCBUS0lQIHwgQUVTIHwgVEtJUCB8IEFFUyB8ICovCisvKiAgICAgIHwgICAgICAgMCAgfCAgMSAgfCAgIDEgIHwgIDAgIHwgLT4gMHgwNiAqLworLyogICAgICB8ICAgICAgIDAgIHwgIDEgIHwgICAxICB8ICAxICB8IC0+IDB4MDcgKi8KKy8qICAgICAgfCAgICAgICAxICB8ICAwICB8ICAgMCAgfCAgMSAgfCAtPiAweDA5ICovCisvKiAgICAgIHwgICAgICAgMSAgfCAgMCAgfCAgIDEgIHwgIDEgIHwgLT4gMHgwQiAqLworLyogICAgICB8ICAgICAgIDEgIHwgIDEgIHwgICAwICB8ICAxICB8IC0+IDB4MEQgKi8KKy8qICAgICAgfCAgICAgICAxICB8ICAxICB8ICAgMSAgfCAgMCAgfCAtPiAweDBFICovCisvKiAgICAgIHwgICAgICAgMSAgfCAgMSAgfCAgIDEgIHwgIDEgIHwgLT4gMHgwRiAqLworLyogICAgICArLS0tLS0tKy0tLS0tKy0tLS0tLSstLS0tLSsgKi8KKy8qICovCit0eXBlZGVmIGVudW0gX1dwYU1peFBhaXJDaXBoZXIgeworCU1JWF9DSVBIRVJfTk9UVVNFID0gMHgwMCwKKwlXUEFfTk9ORV9XUEEyX1RLSVBBRVMgPSAweDAzLAkvKiBXUEEyLVRLSVBBRVMgKi8KKwlXUEFfQUVTX1dQQTJfVEtJUCA9IDB4MDYsCisJV1BBX0FFU19XUEEyX1RLSVBBRVMgPSAweDA3LAorCVdQQV9US0lQX1dQQTJfQUVTID0gMHgwOSwKKwlXUEFfVEtJUF9XUEEyX1RLSVBBRVMgPSAweDBCLAorCVdQQV9US0lQQUVTX1dQQTJfTk9ORSA9IDB4MEMsCS8qIFdQQS1US0lQQUVTICovCisJV1BBX1RLSVBBRVNfV1BBMl9BRVMgPSAweDBELAorCVdQQV9US0lQQUVTX1dQQTJfVEtJUCA9IDB4MEUsCisJV1BBX1RLSVBBRVNfV1BBMl9US0lQQUVTID0gMHgwRiwKK30gV1BBX01JWF9QQUlSX0NJUEhFUjsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05fSUVfSEVBREVSX1NUUlVDVAl7Ci0JVUNIQVIJCUVpZDsKLQlVQ0hBUgkJTGVuZ3RoOwotCVVTSE9SVAkJVmVyc2lvbjsJLy8gTGl0dGxlIGVuZGlhbiBmb3JtYXQKLX0JUlNOX0lFX0hFQURFUl9TVFJVQ1QsICpQUlNOX0lFX0hFQURFUl9TVFJVQ1Q7CitzdHJ1Y3QgUEFDS0VEIHJ0X3Jzbl9pZV9oZWFkZXIgeworCXU4IEVpZDsKKwl1OCBMZW5ndGg7CisJdTE2IFZlcnNpb247CQkvKiBMaXR0bGUgZW5kaWFuIGZvcm1hdCAqLworfTsKIAotLy8gQ2lwaGVyIHN1aXRlIHNlbGVjdG9yIHR5cGVzCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0NJUEhFUl9TVUlURV9TVFJVQ1QJewotCVVDSEFSCQlPdWlbM107Ci0JVUNIQVIJCVR5cGU7Ci19CUNJUEhFUl9TVUlURV9TVFJVQ1QsICpQQ0lQSEVSX1NVSVRFX1NUUlVDVDsKKy8qIENpcGhlciBzdWl0ZSBzZWxlY3RvciB0eXBlcyAqLworc3RydWN0IFBBQ0tFRCBydF9jaXBoZXJfc3VpdGVfc3RydWN0IHsKKwl1OCBPdWlbM107CisJdTggVHlwZTsKK307CiAKLS8vIEF1dGhlbnRpY2F0aW9uIGFuZCBLZXkgTWFuYWdlbWVudCBzdWl0ZSBzZWxlY3RvcgotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9BS01fU1VJVEVfU1RSVUNUCXsKLQlVQ0hBUgkJT3VpWzNdOwotCVVDSEFSCQlUeXBlOwotfQlBS01fU1VJVEVfU1RSVUNULCAqUEFLTV9TVUlURV9TVFJVQ1Q7CisvKiBBdXRoZW50aWNhdGlvbiBhbmQgS2V5IE1hbmFnZW1lbnQgc3VpdGUgc2VsZWN0b3IgKi8KK3N0cnVjdCBQQUNLRUQgcnRfYWttX3N1aXRlIHsKKwl1OCBPdWlbM107CisJdTggVHlwZTsKK307CiAKLS8vIFJTTiBjYXBhYmlsaXR5Ci10eXBlZGVmIHN0cnVjdAlQQUNLRUQgX1JTTl9DQVBBQklMSVRZCXsKLQlVU0hPUlQJCVJzdjoxMDsKLQlVU0hPUlQJCUdUS1NBUmVwbGF5Q250OjI7Ci0JVVNIT1JUCQlQVEtTQVJlcGxheUNudDoyOwotCVVTSE9SVAkJTm9QYWlyd2lzZToxOwotCVVTSE9SVAkJUHJlQXV0aDoxOwotfQlSU05fQ0FQQUJJTElUWSwgKlBSU05fQ0FQQUJJTElUWTsKKy8qIFJTTiBjYXBhYmlsaXR5ICovCitzdHJ1Y3QgUEFDS0VEIHJ0X3Jzbl9jYXBhYmlsaXR5IHsKKwl1MTYgUnN2OjEwOworCXUxNiBHVEtTQVJlcGxheUNudDoyOworCXUxNiBQVEtTQVJlcGxheUNudDoyOworCXUxNiBOb1BhaXJ3aXNlOjE7CisJdTE2IFByZUF1dGg6MTsKK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVRoZSBwcm90b3R5cGUgaXMgZGVmaW5lZCBpbiBjbW1fd3BhLmMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitCT09MRUFOIFdwYU1zZ1R5cGVTdWJzdCh1OCBFQVBUeXBlLCBpbnQgKiBNc2dUeXBlKTsKKwordm9pZCBQUkYodTggKiBrZXksCisJIGludCBrZXlfbGVuLAorCSB1OCAqIHByZWZpeCwKKwkgaW50IHByZWZpeF9sZW4sCisJIHU4ICogZGF0YSwgaW50IGRhdGFfbGVuLCB1OCAqIG91dHB1dCwgaW50IGxlbik7CisKK2ludCBQYXNzd29yZEhhc2goY2hhciAqcGFzc3dvcmQsCisJCSB1bnNpZ25lZCBjaGFyICpzc2lkLCBpbnQgc3NpZGxlbmd0aCwgdW5zaWduZWQgY2hhciAqb3V0cHV0KTsKKwordTggKkdldFN1aXRlRnJvbVJTTklFKHU4ICpyc25pZSwKKwkJCSB1MzIgcnNuaWVfbGVuLCB1OCB0eXBlLCB1OCAqIGNvdW50KTsKKwordm9pZCBXcGFTaG93QWxsc3VpdGUodTggKnJzbmllLCB1MzIgcnNuaWVfbGVuKTsKKwordm9pZCBSVE1QSW5zZXJ0UlNOSUUodTggKnBGcmFtZUJ1ZiwKKwkJICAgICB1bnNpZ25lZCBsb25nICpwRnJhbWVMZW4sCisJCSAgICAgdTggKnJzbmllX3B0ciwKKwkJICAgICB1OCByc25pZV9sZW4sCisJCSAgICAgdTggKnBta2lkX3B0ciwgdTggcG1raWRfbGVuKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwLzI4NzBfbWFpbl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvMjg3MF9tYWluX2Rldi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGVkNDhiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvMjg3MF9tYWluX2Rldi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUzMCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIHJ0bXBfbWFpbi5jCi0KLSAgICBBYnN0cmFjdDoKLSAgICBtYWluIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBOYW1lICAgICAgICBEYXRlICAgICAgICAgICAgTW9kaWZpY2F0aW9uIGxvZ3MKLSAgICBKYW4gTGVlCQkwMS0xMC0yMDA1CSAgICBtb2RpZmllZAotCVNhbXBsZQkJSnVuLzAxLzA3CQlNZXJnZSBSVDI4NzAgYW5kIFJUMjg2MCBkcml2ZXJzLgotKi8KLQotI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgotCi0KLS8vIEZvbGxvd2luZyBpbmZvcm1hdGlvbiB3aWxsIGJlIHNob3cgd2hlbiB5b3UgcnVuICdtb2RpbmZvJwotLy8gKioqIElmIHlvdSBoYXZlIGEgc29sdXRpb24gZm9yIHRoZSBidWcgaW4gY3VycmVudCB2ZXJzaW9uIG9mIGRyaXZlciwgcGxlYXNlIG1haWwgdG8gbWUuCi0vLyBPdGhlcndpc2UgcG9zdCB0byBmb3J1bSBpbiByYWxpbmt0ZWNoJ3Mgd2ViIHNpdGUod3d3LnJhbGlua3RlY2guY29tKSBhbmQgbGV0IGFsbCB1c2VycyBoZWxwIHlvdS4gKioqCi1NT0RVTEVfQVVUSE9SKCJQYXVsIExpbiA8cGF1bF9saW5AcmFsaW5rdGVjaC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oUlQyOHh4X0NISVBfTkFNRSAiIFdpcmVsZXNzIExBTiBMaW51eCBEcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLSNpZmRlZiBNT0RVTEVfVkVSU0lPTgotTU9EVUxFX1ZFUlNJT04oU1RBX0RSSVZFUl9WRVJTSU9OKTsKLSNlbmRpZgotTU9EVUxFX0FMSUFTKCJydDMwNzBzdGEiKTsKLQotLyogS2VybmVsIHRocmVhZCBhbmQgdmFycywgd2hpY2ggaGFuZGxlcyBwYWNrZXRzIHRoYXQgYXJlIGNvbXBsZXRlZC4gT25seQotICogcGFja2V0cyB0aGF0IGhhdmUgYSAiY29tcGxldGUiIGZ1bmN0aW9uIGFyZSBzZW50IGhlcmUuIFRoaXMgd2F5LCB0aGUKLSAqIGNvbXBsZXRpb24gaXMgcnVuIG91dCBvZiBrZXJuZWwgY29udGV4dCwgYW5kIGRvZXNuJ3QgYmxvY2sgdGhlIHJlc3Qgb2YKLSAqIHRoZSBzdGFjay4gKi8KLQotZXh0ZXJuIElOVCBfX2RldmluaXQgcnQyOHh4X3Byb2JlKElOIHZvaWQgKl9kZXZfcCwgSU4gdm9pZCAqX2Rldl9pZF9wLAotCQkJCQkJCQkJSU4gVUlOVCBhcmdjLCBPVVQgUFJUTVBfQURBUFRFUiAqcHBBZCk7Ci0KLXN0cnVjdCB1c2JfZGV2aWNlX2lkIHJ0dXNiX3VzYl9pZFtdID0gewotCXsgVVNCX0RFVklDRSgweDE0OEYsIDB4Mjc3MCkgfSwgLyogUmFsaW5rICovCi0JeyBVU0JfREVWSUNFKDB4MTczNywgMHgwMDcxKSB9LCAvKiBMaW5rc3lzIFdVU0I2MDBOICovCi0JeyBVU0JfREVWSUNFKDB4MTczNywgMHgwMDcwKSB9LCAvKiBMaW5rc3lzICovCi0JeyBVU0JfREVWSUNFKDB4MTQ4RiwgMHgyODcwKSB9LCAvKiBSYWxpbmsgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxNDhGLCAweDMwNzApIH0sIC8qIFJhbGluayAzMDcwICovCi0JeyBVU0JfREVWSUNFKDB4MTQ4RiwgMHgzMDcxKSB9LCAvKiBSYWxpbmsgMzA3MSAqLwotCXsgVVNCX0RFVklDRSgweDE0OEYsIDB4MzA3MikgfSwgLyogUmFsaW5rIDMwNzIgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwQjA1LCAweDE3MzEpIH0sIC8qIEFzdXMgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwQjA1LCAweDE3MzIpIH0sIC8qIEFzdXMgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwQjA1LCAweDE3NDIpIH0sIC8qIEFzdXMgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwREY2LCAweDAwMTcpIH0sIC8qIFNpdGVjb20gKi8KLQl7IFVTQl9ERVZJQ0UoMHgwREY2LCAweDAwMkIpIH0sIC8qIFNpdGVjb20gKi8KLQl7IFVTQl9ERVZJQ0UoMHgwREY2LCAweDAwMkMpIH0sIC8qIFNpdGVjb20gKi8KLQl7IFVTQl9ERVZJQ0UoMHgwREY2LCAweDAwM0UpIH0sIC8qIFNpdGVjb20gMzA3MCAqLwotCXsgVVNCX0RFVklDRSgweDBERjYsIDB4MDAyRCkgfSwgLyogU2l0ZWNvbSAqLwotCXsgVVNCX0RFVklDRSgweDBERjYsIDB4MDAzOSkgfSwgLyogU2l0ZWNvbSAyNzcwICovCi0JeyBVU0JfREVWSUNFKDB4MERGNiwgMHgwMDNGKSB9LCAvKiBTaXRlY29tIFdMLTYwOCAqLwotCXsgVVNCX0RFVklDRSgweDE0QjIsIDB4M0MwNikgfSwgLyogQ29uY2VwdHJvbmljICovCi0JeyBVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzI4KSB9LCAvKiBDb25jZXB0cm9uaWMgKi8KLQl7IFVTQl9ERVZJQ0UoMHgyMDE5LCAweEVEMDYpIH0sIC8qIFBsYW5leCBDb21tdW5pY2F0aW9ucywgSW5jLiAqLwotCXsgVVNCX0RFVklDRSgweDIwMTksIDB4RUQxNCkgfSwgLyogUGxhbmV4IENvbW11bmljYXRpb25zLCBJbmMuICovCi0JeyBVU0JfREVWSUNFKDB4MjAxOSwgMHhBQjI1KSB9LCAvKiBQbGFuZXggQ29tbXVuaWNhdGlvbnMsIEluYy4gUlQzMDcwICovCi0JeyBVU0JfREVWSUNFKDB4MDdEMSwgMHgzQzA5KSB9LCAvKiBELUxpbmsgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwN0QxLCAweDNDMTEpIH0sIC8qIEQtTGluayAqLwotCXsgVVNCX0RFVklDRSgweDIwMDEsIDB4M0MwOSkgfSwgLyogRC1MaW5rICovCi0JeyBVU0JfREVWSUNFKDB4MjAwMSwgMHgzQzBBKSB9LCAvKiBELUxpbmsgMzA3MiovCi0JeyBVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzA3KSB9LCAvKiBBTCAqLwotCXsgVVNCX0RFVklDRSgweDE0QjIsIDB4M0MxMikgfSwgLyogQUwgMzA3MCAqLwotCXsgVVNCX0RFVklDRSgweDA1MEQsIDB4ODA1MykgfSwgLyogQmVsa2luICovCi0JeyBVU0JfREVWSUNFKDB4MDUwRCwgMHg4MTVDKSB9LCAvKiBCZWxraW4gKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNTBELCAweDgyNWEpIH0sIC8qIEJlbGtpbiAqLwotCXsgVVNCX0RFVklDRSgweDE0QjIsIDB4M0MyMykgfSwgLyogQWlybGluayAqLwotCXsgVVNCX0RFVklDRSgweDE0QjIsIDB4M0MyNykgfSwgLyogQWlybGluayAqLwotCXsgVVNCX0RFVklDRSgweDA3QUEsIDB4MDAyRikgfSwgLyogQ29yZWdhICovCi0JeyBVU0JfREVWSUNFKDB4MDdBQSwgMHgwMDNDKSB9LCAvKiBDb3JlZ2EgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwN0FBLCAweDAwM0YpIH0sIC8qIENvcmVnYSAqLwotCXsgVVNCX0RFVklDRSgweDE4QzUsIDB4MDAxMikgfSwgLyogQ29yZWdhIDMwNzAgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxMDQ0LCAweDgwMEIpIH0sIC8qIEdpZ2FieXRlICovCi0JeyBVU0JfREVWSUNFKDB4MTA0NCwgMHg4MDBEKSB9LCAvKiBHaWdhYnl0ZSBHTi1XQjMyTCAzMDcwICovCi0JeyBVU0JfREVWSUNFKDB4MTVBOSwgMHgwMDA2KSB9LCAvKiBTcGFya2xhbiAqLwotCXsgVVNCX0RFVklDRSgweDA4M0EsIDB4QjUyMikgfSwgLyogU01DICovCi0JeyBVU0JfREVWSUNFKDB4MDgzQSwgMHhBNjE4KSB9LCAvKiBTTUMgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwODNBLCAweDg1MjIpIH0sIC8qIEFyY2FkeWFuICovCi0JeyBVU0JfREVWSUNFKDB4MDgzQSwgMHg3NTEyKSB9LCAvKiBBcmNhZHlhbiAyNzcwICovCi0JeyBVU0JfREVWSUNFKDB4MDgzQSwgMHg3NTIyKSB9LCAvKiBBcmNhZHlhbiAqLwotCXsgVVNCX0RFVklDRSgweDA4M0EsIDB4NzUxMSkgfSwgLyogQXJjYWR5YW4gMzA3MCAqLwotCXsgVVNCX0RFVklDRSgweDBDREUsIDB4MDAyMikgfSwgLyogWkNPTSAqLwotCXsgVVNCX0RFVklDRSgweDA1ODYsIDB4MzQxNikgfSwgLyogWnl4ZWwgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwQ0RFLCAweDAwMjUpIH0sIC8qIFp5eGVsICovCi0JeyBVU0JfREVWSUNFKDB4MTc0MCwgMHg5NzAxKSB9LCAvKiBFbkdlbml1cyAqLwotCXsgVVNCX0RFVklDRSgweDE3NDAsIDB4OTcwMikgfSwgLyogRW5HZW5pdXMgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxNzQwLCAweDk3MDMpIH0sIC8qIEVuR2VuaXVzIDMwNzAgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNDcxLCAweDIwMGYpIH0sIC8qIFBoaWxpcHMgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxNEIyLCAweDNDMjUpIH0sIC8qIERyYXl0ZWsgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxM0QzLCAweDMyNDcpIH0sIC8qIEF6dXJlV2F2ZSAqLwotCXsgVVNCX0RFVklDRSgweDEzRDMsIDB4MzI3MykgfSwgLyogQXp1cmVXYXZlIDMwNzAqLwotCXsgVVNCX0RFVklDRSgweDA4M0EsIDB4NjYxOCkgfSwgLyogQWNjdG9uICovCi0JeyBVU0JfREVWSUNFKDB4MTVjNSwgMHgwMDA4KSB9LCAvKiBBbWl0ICovCi0JeyBVU0JfREVWSUNFKDB4MEU2NiwgMHgwMDAxKSB9LCAvKiBIYXdraW5nICovCi0JeyBVU0JfREVWSUNFKDB4MEU2NiwgMHgwMDAzKSB9LCAvKiBIYXdraW5nICovCi0JeyBVU0JfREVWSUNFKDB4MTI5QiwgMHgxODI4KSB9LCAvKiBTaWVtZW5zICovCi0JeyBVU0JfREVWSUNFKDB4MTU3RSwgMHgzMDBFKSB9LCAvKiBVLU1lZGlhICovCi0JeyBVU0JfREVWSUNFKDB4MDUwZCwgMHg4MDVjKSB9LAotCXsgVVNCX0RFVklDRSgweDE0ODIsIDB4M0MwOSkgfSwgLyogQWJvY29tKi8KLQl7IFVTQl9ERVZJQ0UoMHgxNEIyLCAweDNDMDkpIH0sIC8qIEFscGhhICovCi0JeyBVU0JfREVWSUNFKDB4MDRFOCwgMHgyMDE4KSB9LCAvKiBzYW1zdW5nICovCi0JeyBVU0JfREVWSUNFKDB4MDdCOCwgMHgzMDcwKSB9LCAvKiBBYm9Db20gMzA3MCAqLwotCXsgVVNCX0RFVklDRSgweDA3QjgsIDB4MzA3MSkgfSwgLyogQWJvQ29tIDMwNzEgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwN0I4LCAweDI4NzApIH0sIC8qIEFib0NvbSAqLwotCXsgVVNCX0RFVklDRSgweDA3QjgsIDB4Mjc3MCkgfSwgLyogQWJvQ29tICovCi0JeyBVU0JfREVWSUNFKDB4MDdCOCwgMHgzMDcyKSB9LCAvKiBBYm9jb20gMzA3MiAqLwotCXsgVVNCX0RFVklDRSgweDczOTIsIDB4NzcxMSkgfSwgLyogRWRpbWF4IDMwNzAgKi8KLQl7IFVTQl9ERVZJQ0UoMHg1QTU3LCAweDAyODApIH0sIC8qIFppbndlbGwgKi8KLQl7IFVTQl9ERVZJQ0UoMHg1QTU3LCAweDAyODIpIH0sIC8qIFppbndlbGwgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxQTMyLCAweDAzMDQpIH0sIC8qIFF1YW50YSAzMDcwICovCi0JeyBVU0JfREVWSUNFKDB4MDc4OSwgMHgwMTYyKSB9LCAvKiBMb2dpdGVjIDI4NzAgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNzg5LCAweDAxNjMpIH0sIC8qIExvZ2l0ZWMgMjg3MCAqLwotCXsgVVNCX0RFVklDRSgweDA3ODksIDB4MDE2NCkgfSwgLyogTG9naXRlYyAyODcwICovCi0JeyBVU0JfREVWSUNFKDB4NzM5MiwgMHg3NzE3KSB9LCAvKiBFZGltYXggKi8KLQl7IFVTQl9ERVZJQ0UoMHgxRURBLCAweDIzMTApIH0sIC8qIEFpclRpZXMgMzA3MCAqLwotCXsgVVNCX0RFVklDRSgweDE3MzcsIDB4MDA3NykgfSwgLyogTGlua3N5cyBXVVNCNTRHQy1FVSB2MyAqLwotCXsgfSAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwotfTsKLQotSU5UIGNvbnN0ICAgICAgICAgICAgICAgcnR1c2JfdXNiX2lkX2xlbiA9IHNpemVvZihydHVzYl91c2JfaWQpIC8gc2l6ZW9mKHN0cnVjdCB1c2JfZGV2aWNlX2lkKTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBydHVzYl91c2JfaWQpOwotCi0jaWZuZGVmIFBGX05PRlJFRVpFCi0jZGVmaW5lIFBGX05PRlJFRVpFICAwCi0jZW5kaWYKLQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHJ0Mjg3MF9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwotc3RhdGljIGludCBydDI4NzBfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKLSNlbmRpZiAvLyBDT05GSUdfUE0gLy8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy90ZXN0ZWQgZm9yIGtlcm5lbCAyLjZzZXJpZXMKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcnR1c2JfcHJvYmUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAotCQkJCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKLXN0YXRpYyB2b2lkIHJ0dXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwotCi1zdHJ1Y3QgdXNiX2RyaXZlciBydHVzYl9kcml2ZXIgPSB7Ci0JLm5hbWU9InJ0Mjg3MCIsCi0JLnByb2JlPXJ0dXNiX3Byb2JlLAotCS5kaXNjb25uZWN0PXJ0dXNiX2Rpc2Nvbm5lY3QsCi0JLmlkX3RhYmxlPXJ0dXNiX3VzYl9pZCwKLQotI2lmZGVmIENPTkZJR19QTQotCXN1c3BlbmQ6CXJ0Mjg3MF9zdXNwZW5kLAotCXJlc3VtZToJCXJ0Mjg3MF9yZXN1bWUsCi0jZW5kaWYKLQl9OwotCi0jaWZkZWYgQ09ORklHX1BNCi0KLVZPSUQgUlQyODYwUmVqZWN0UGVuZGluZ1BhY2tldHMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JLy8gY2xlYXIgUFMgcGFja2V0cwotCS8vIGNsZWFyIFR4U3cgcGFja2V0cwotfQotCi1zdGF0aWMgaW50IHJ0Mjg3MF9zdXNwZW5kKAotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAotCXBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7Ci0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODcwX3N1c3BlbmQoKVxuIikpOwotCW5ldF9kZXYgPSBwQWQtPm5ldF9kZXY7Ci0JbmV0aWZfZGV2aWNlX2RldGFjaCAobmV0X2Rldik7Ci0KLQlwQWQtPlBNX0ZsZ1N1c3BlbmQgPSAxOwotCWlmIChuZXRpZl9ydW5uaW5nKG5ldF9kZXYpKSB7Ci0JCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOwotCQlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7Ci0JfQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODcwX3N1c3BlbmQoKVxuIikpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJ0Mjg3MF9yZXN1bWUoCi0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwotCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjg3MF9yZXN1bWUoKVxuIikpOwotCi0JcEFkLT5QTV9GbGdTdXNwZW5kID0gMDsKLQluZXRfZGV2ID0gcEFkLT5uZXRfZGV2OwotCW5ldGlmX2RldmljZV9hdHRhY2ggKG5ldF9kZXYpOwotCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOwotCW5ldGlmX2NhcnJpZXJfb24obmV0X2Rldik7Ci0JbmV0aWZfd2FrZV9xdWV1ZShuZXRfZGV2KTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODcwX3Jlc3VtZSgpXG4iKSk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLy8gQ09ORklHX1BNIC8vCi0KLQotLy8gSW5pdCBkcml2ZXIgbW9kdWxlCi1JTlQgX19pbml0IHJ0dXNiX2luaXQodm9pZCkKLXsKLQlwcmludGsoInJ0dXNiIGluaXQgLS0tPlxuIik7Ci0JcmV0dXJuIHVzYl9yZWdpc3RlcigmcnR1c2JfZHJpdmVyKTsKLX0KLQotLy8gRGVpbml0IGRyaXZlciBtb2R1bGUKLVZPSUQgX19leGl0IHJ0dXNiX2V4aXQodm9pZCkKLXsKLQl1c2JfZGVyZWdpc3RlcigmcnR1c2JfZHJpdmVyKTsKLQlwcmludGsoIjwtLS0gcnR1c2IgZXhpdFxuIik7Ci19Ci0KLW1vZHVsZV9pbml0KHJ0dXNiX2luaXQpOwotbW9kdWxlX2V4aXQocnR1c2JfZXhpdCk7Ci0KLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCi0vKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMJCQkJCQkJCQkJCQkqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBNTE1FIGtlcm5lbCB0aHJlYWQuCi0KLUFyZ3VtZW50czoKLQkqQ29udGV4dAkJCXRoZSBwQWQsIGRyaXZlciBjb250cm9sIGJsb2NrIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotICAgIDAJCQkJCWNsb3NlIHRoZSB0aHJlYWQKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBNbG1lVGhyZWFkKAotCUlOIHZvaWQgKkNvbnRleHQpCi17Ci0JUFJUTVBfQURBUFRFUglwQWQgPSAoUFJUTVBfQURBUFRFUilDb250ZXh0OwotCVBPU19DT09LSUUJcE9iajsKLQlpbnQgc3RhdHVzOwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JcnRtcF9vc190aHJlYWRfaW5pdCgicnQyODcwTWxtZVRocmVhZCIsIChQVk9JRCkmKHBBZC0+bWxtZUNvbXBsZXRlKSk7Ci0KLQl3aGlsZSAocEFkLT5tbG1lX2tpbGwgPT0gMCkKLQl7Ci0JCS8qIGxvY2sgdGhlIGRldmljZSBwb2ludGVycyAqLwotCQkvL2Rvd24oJihwQWQtPm1sbWVfc2VtYXBob3JlKSk7Ci0JCXN0YXR1cyA9IGRvd25faW50ZXJydXB0aWJsZSgmKHBBZC0+bWxtZV9zZW1hcGhvcmUpKTsKLQotCQkvKiBsb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgLCBuZWVkIHRvIGNoZWNrIGlmIHJlcXVpcmVkKi8KLQkJLy9kb3duKCYocEFkLT51c2JkZXZfc2VtYXBob3JlKSk7Ci0KLQkJaWYgKCFwQWQtPlBNX0ZsZ1N1c3BlbmQpCi0JCU1sbWVIYW5kbGVyKHBBZCk7Ci0KLQkJLyogdW5sb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgKi8KLQkJLy91cCgmKHBBZC0+dXNiZGV2X3NlbWFwaG9yZSkpOwotCQlpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiBub3RpZnkgdGhlIGV4aXQgcm91dGluZSB0aGF0IHdlJ3JlIGFjdHVhbGx5IGV4aXRpbmcgbm93Ci0JICoKLQkgKiBjb21wbGV0ZSgpL3dhaXRfZm9yX2NvbXBsZXRpb24oKSBpcyBzaW1pbGFyIHRvIHVwKCkvZG93bigpLAotCSAqIGV4Y2VwdCB0aGF0IGNvbXBsZXRlKCkgaXMgc2FmZSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgc3RydWN0dXJlCi0JICogaXMgZ2V0dGluZyBkZWxldGVkIGluIGEgcGFyYWxsZWwgbW9kZSBvZiBleGVjdXRpb24gKGkuZS4ganVzdAotCSAqIGFmdGVyIHRoZSBkb3duKCkgLS0gdGhhdCdzIG5lY2Vzc2FyeSBmb3IgdGhlIHRocmVhZC1zaHV0ZG93bgotCSAqIGNhc2UuCi0JICoKLQkgKiBjb21wbGV0ZV9hbmRfZXhpdCgpIGdvZXMgZXZlbiBmdXJ0aGVyIHRoYW4gdGhpcyAtLSBpdCBpcyBzYWZlIGluCi0JICogdGhlIGNhc2UgdGhhdCB0aGUgdGhyZWFkIG9mIHRoZSBjYWxsZXIgaXMgZ29pbmcgYXdheSAobm90IGp1c3QKLQkgKiB0aGUgc3RydWN0dXJlKSAtLSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIG1vZHVsZS1yZW1vdmUgY2FzZS4KLQkgKiBUaGlzIGlzIGltcG9ydGFudCBpbiBwcmVlbXB0aW9uIGtlcm5lbHMsIHdoaWNoIHRyYW5zZmVyIHRoZSBmbG93Ci0JICogb2YgZXhlY3V0aW9uIGltbWVkaWF0ZWx5IHVwb24gYSBjb21wbGV0ZSgpLgotCSAqLwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCggIjwtLS0lc1xuIixfX2Z1bmNfXykpOwotCi0JcE9iai0+TUxNRVRocl9waWQgPSBOVUxMOwotCi0JY29tcGxldGVfYW5kX2V4aXQgKCZwQWQtPm1sbWVDb21wbGV0ZSwgMCk7Ci0JcmV0dXJuIDA7Ci0KLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIFVTQiBjb21tYW5kIGtlcm5lbCB0aHJlYWQuCi0KLUFyZ3VtZW50czoKLQkqQ29udGV4dAkJCXRoZSBwQWQsIGRyaXZlciBjb250cm9sIGJsb2NrIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotICAgIDAJCQkJCWNsb3NlIHRoZSB0aHJlYWQKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBSVFVTQkNtZFRocmVhZCgKLQlJTiB2b2lkICogQ29udGV4dCkKLXsKLQlQUlRNUF9BREFQVEVSCXBBZCA9IChQUlRNUF9BREFQVEVSKUNvbnRleHQ7Ci0JUE9TX0NPT0tJRQkJcE9iajsKLQlpbnQgc3RhdHVzOwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JcnRtcF9vc190aHJlYWRfaW5pdCgicnQyODcwQ21kVGhyZWFkIiwgKFBWT0lEKSYocEFkLT5DbWRRQ29tcGxldGUpKTsKLQotCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOwotCXBBZC0+Q21kUS5DbWRRU3RhdGUgPSBSVDI4NzBfVEhSRUFEX1JVTk5JTkc7Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7Ci0KLQl3aGlsZSAocEFkLT5DbWRRLkNtZFFTdGF0ZSA9PSBSVDI4NzBfVEhSRUFEX1JVTk5JTkcpCi0JewotCQkvKiBsb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgKi8KLQkJLy9kb3duKCYocEFkLT5SVFVTQkNtZF9zZW1hcGhvcmUpKTsKLQkJc3RhdHVzID0gZG93bl9pbnRlcnJ1cHRpYmxlKCYocEFkLT5SVFVTQkNtZF9zZW1hcGhvcmUpKTsKLQotCQlpZiAocEFkLT5DbWRRLkNtZFFTdGF0ZSA9PSBSVDI4NzBfVEhSRUFEX1NUT1BFRCkKLQkJCWJyZWFrOwotCi0JCWlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBsb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgLCBuZWVkIHRvIGNoZWNrIGlmIHJlcXVpcmVkKi8KLQkJLy9kb3duKCYocEFkLT51c2JkZXZfc2VtYXBob3JlKSk7Ci0KLQkJaWYgKCFwQWQtPlBNX0ZsZ1N1c3BlbmQpCi0JCUNNREhhbmRsZXIocEFkKTsKLQotCQkvKiB1bmxvY2sgdGhlIGRldmljZSBwb2ludGVycyAqLwotCQkvL3VwKCYocEFkLT51c2JkZXZfc2VtYXBob3JlKSk7Ci0JfQotCi0JaWYgKCFwQWQtPlBNX0ZsZ1N1c3BlbmQpCi0JewkvLyBDbGVhciB0aGUgQ21kUUVsZW1lbnRzLgotCQlDbWRRRWxtdAkqcENtZFFFbG10ID0gTlVMTDsKLQotCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKLQkJcEFkLT5DbWRRLkNtZFFTdGF0ZSA9IFJUMjg3MF9USFJFQURfU1RPUEVEOwotCQl3aGlsZShwQWQtPkNtZFEuc2l6ZSkKLQkJewotCQkJUlRVU0JEZXF1ZXVlQ21kKCZwQWQtPkNtZFEsICZwQ21kUUVsbXQpOwotCQkJaWYgKHBDbWRRRWxtdCkKLQkJCXsKLQkJCQlpZiAocENtZFFFbG10LT5DbWRGcm9tTmRpcyA9PSBUUlVFKQotCQkJCXsKLQkJCQkJaWYgKHBDbWRRRWxtdC0+YnVmZmVyICE9IE5VTEwpCi0JCQkJCQlOZGlzRnJlZU1lbW9yeShwQ21kUUVsbXQtPmJ1ZmZlciwgcENtZFFFbG10LT5idWZmZXJsZW5ndGgsIDApOwotCi0JCQkJCU5kaXNGcmVlTWVtb3J5KHBDbWRRRWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWlmICgocENtZFFFbG10LT5idWZmZXIgIT0gTlVMTCkgJiYgKHBDbWRRRWxtdC0+YnVmZmVybGVuZ3RoICE9IDApKQotCQkJCQkJTmRpc0ZyZWVNZW1vcnkocENtZFFFbG10LT5idWZmZXIsIHBDbWRRRWxtdC0+YnVmZmVybGVuZ3RoLCAwKTsKLQkJICAgICAgICAgICAgewotCQkJCQkJTmRpc0ZyZWVNZW1vcnkocENtZFFFbG10LCBzaXplb2YoQ21kUUVsbXQpLCAwKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOwotCX0KLQkvKiBub3RpZnkgdGhlIGV4aXQgcm91dGluZSB0aGF0IHdlJ3JlIGFjdHVhbGx5IGV4aXRpbmcgbm93Ci0JICoKLQkgKiBjb21wbGV0ZSgpL3dhaXRfZm9yX2NvbXBsZXRpb24oKSBpcyBzaW1pbGFyIHRvIHVwKCkvZG93bigpLAotCSAqIGV4Y2VwdCB0aGF0IGNvbXBsZXRlKCkgaXMgc2FmZSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgc3RydWN0dXJlCi0JICogaXMgZ2V0dGluZyBkZWxldGVkIGluIGEgcGFyYWxsZWwgbW9kZSBvZiBleGVjdXRpb24gKGkuZS4ganVzdAotCSAqIGFmdGVyIHRoZSBkb3duKCkgLS0gdGhhdCdzIG5lY2Vzc2FyeSBmb3IgdGhlIHRocmVhZC1zaHV0ZG93bgotCSAqIGNhc2UuCi0JICoKLQkgKiBjb21wbGV0ZV9hbmRfZXhpdCgpIGdvZXMgZXZlbiBmdXJ0aGVyIHRoYW4gdGhpcyAtLSBpdCBpcyBzYWZlIGluCi0JICogdGhlIGNhc2UgdGhhdCB0aGUgdGhyZWFkIG9mIHRoZSBjYWxsZXIgaXMgZ29pbmcgYXdheSAobm90IGp1c3QKLQkgKiB0aGUgc3RydWN0dXJlKSAtLSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIG1vZHVsZS1yZW1vdmUgY2FzZS4KLQkgKiBUaGlzIGlzIGltcG9ydGFudCBpbiBwcmVlbXB0aW9uIGtlcm5lbHMsIHdoaWNoIHRyYW5zZmVyIHRoZSBmbG93Ci0JICogb2YgZXhlY3V0aW9uIGltbWVkaWF0ZWx5IHVwb24gYSBjb21wbGV0ZSgpLgotCSAqLwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCggIjwtLS1SVFVTQkNtZFRocmVhZFxuIikpOwotCi0JcE9iai0+UlRVU0JDbWRUaHJfcGlkID0gTlVMTDsKLQotCWNvbXBsZXRlX2FuZF9leGl0ICgmcEFkLT5DbWRRQ29tcGxldGUsIDApOwotCXJldHVybiAwOwotCi19Ci0KLQotc3RhdGljIHZvaWQgUlQyODcwX1RpbWVyUV9IYW5kbGUoUlRNUF9BREFQVEVSICpwQWQpCi17Ci0JaW50IHN0YXR1czsKLQlSQUxJTktfVElNRVJfU1RSVUNUCSpwVGltZXI7Ci0JUlQyODcwX1RJTUVSX0VOVFJZCSpwRW50cnk7Ci0JdW5zaWduZWQgbG9uZwlpcnFGbGFnOwotCi0Jd2hpbGUoIXBBZC0+VGltZXJGdW5jX2tpbGwpCi0JewotLy8JCXByaW50aygid2FpdGluZyBmb3IgZXZlbnQhXG4iKTsKLQkJcFRpbWVyID0gTlVMTDsKLQotCQlzdGF0dXMgPSBkb3duX2ludGVycnVwdGlibGUoJihwQWQtPlJUVVNCVGltZXJfc2VtYXBob3JlKSk7Ci0KLQkJaWYgKHBBZC0+VGltZXJRLnN0YXR1cyA9PSBSVDI4NzBfVEhSRUFEX1NUT1BFRCkKLQkJCWJyZWFrOwotCi0JCS8vIGV2ZW50IGhhcHBlbmVkLgotCQl3aGlsZShwQWQtPlRpbWVyUS5wUUhlYWQpCi0JCXsKLQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZyk7Ci0JCQlwRW50cnkgPSBwQWQtPlRpbWVyUS5wUUhlYWQ7Ci0JCQlpZiAocEVudHJ5KQotCQkJewotCQkJCXBUaW1lciA9IHBFbnRyeS0+cFJhVGltZXI7Ci0KLQkJCQkvLyB1cGRhdGUgcFFIZWFkCi0JCQkJcEFkLT5UaW1lclEucFFIZWFkID0gcEVudHJ5LT5wTmV4dDsKLQkJCQlpZiAocEVudHJ5ID09IHBBZC0+VGltZXJRLnBRVGFpbCkKLQkJCQkJcEFkLT5UaW1lclEucFFUYWlsID0gTlVMTDsKLQotCQkJCS8vIHJldHVybiB0aGlzIHF1ZXVlIGVudHJ5IHRvIHRpbWVyUUZyZWVMaXN0LgotCQkJCXBFbnRyeS0+cE5leHQgPSBwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdDsKLQkJCQlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IHBFbnRyeTsKLQkJCX0KLQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFnKTsKLQotCQkJaWYgKHBUaW1lcikKLQkJCXsKLQkJCQlpZiAocFRpbWVyLT5oYW5kbGUgIT0gTlVMTCkKLQkJCQlpZiAoIXBBZC0+UE1fRmxnU3VzcGVuZCkKLQkJCQkJcFRpbWVyLT5oYW5kbGUoTlVMTCwgKFBWT0lEKSBwVGltZXItPmNvb2tpZSwgTlVMTCwgcFRpbWVyKTsKLQkJCQlpZiAoKHBUaW1lci0+UmVwZWF0KSAmJiAocFRpbWVyLT5TdGF0ZSA9PSBGQUxTRSkpCi0JCQkJCVJUTVBfT1NfQWRkX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBwVGltZXItPlRpbWVyVmFsdWUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCQlwQWQtPlRpbWVyUS5zdGF0dXMgPSBSVDI4NzBfVEhSRUFEX1NUT1BFRDsKLQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLQotSU5UIFRpbWVyUVRocmVhZCgKLQlJTiBPVVQgUFZPSUQgQ29udGV4dCkKLXsKLQlQUlRNUF9BREFQVEVSCXBBZDsKLQlQT1NfQ09PS0lFCXBPYmo7Ci0KLQlwQWQgPSAoUFJUTVBfQURBUFRFUilDb250ZXh0OwotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlydG1wX29zX3RocmVhZF9pbml0KCJydDI4NzBUaW1lclFIYW5kbGUiLCAoUFZPSUQpJihwQWQtPlRpbWVyUUNvbXBsZXRlKSk7Ci0KLQlSVDI4NzBfVGltZXJRX0hhbmRsZShwQWQpOwotCi0JLyogbm90aWZ5IHRoZSBleGl0IHJvdXRpbmUgdGhhdCB3ZSdyZSBhY3R1YWxseSBleGl0aW5nIG5vdwotCSAqCi0JICogY29tcGxldGUoKS93YWl0X2Zvcl9jb21wbGV0aW9uKCkgaXMgc2ltaWxhciB0byB1cCgpL2Rvd24oKSwKLQkgKiBleGNlcHQgdGhhdCBjb21wbGV0ZSgpIGlzIHNhZmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHN0cnVjdHVyZQotCSAqIGlzIGdldHRpbmcgZGVsZXRlZCBpbiBhIHBhcmFsbGVsIG1vZGUgb2YgZXhlY3V0aW9uIChpLmUuIGp1c3QKLQkgKiBhZnRlciB0aGUgZG93bigpIC0tIHRoYXQncyBuZWNlc3NhcnkgZm9yIHRoZSB0aHJlYWQtc2h1dGRvd24KLQkgKiBjYXNlLgotCSAqCi0JICogY29tcGxldGVfYW5kX2V4aXQoKSBnb2VzIGV2ZW4gZnVydGhlciB0aGFuIHRoaXMgLS0gaXQgaXMgc2FmZSBpbgotCSAqIHRoZSBjYXNlIHRoYXQgdGhlIHRocmVhZCBvZiB0aGUgY2FsbGVyIGlzIGdvaW5nIGF3YXkgKG5vdCBqdXN0Ci0JICogdGhlIHN0cnVjdHVyZSkgLS0gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBtb2R1bGUtcmVtb3ZlIGNhc2UuCi0JICogVGhpcyBpcyBpbXBvcnRhbnQgaW4gcHJlZW1wdGlvbiBrZXJuZWxzLCB3aGljaCB0cmFuc2ZlciB0aGUgZmxvdwotCSAqIG9mIGV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGEgY29tcGxldGUoKS4KLQkgKi8KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoICI8LS0tJXNcbiIsX19mdW5jX18pKTsKLQotCXBPYmotPlRpbWVyUVRocl9waWQgPSBOVUxMOwotCi0JY29tcGxldGVfYW5kX2V4aXQoJnBBZC0+VGltZXJRQ29tcGxldGUsIDApOwotCXJldHVybiAwOwotCi19Ci0KLQotUlQyODcwX1RJTUVSX0VOVFJZICpSVDI4NzBfVGltZXJRX0luc2VydCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBSQUxJTktfVElNRVJfU1RSVUNUICpwVGltZXIpCi17Ci0JUlQyODcwX1RJTUVSX0VOVFJZICpwUU5vZGUgPSBOVUxMLCAqcFFUYWlsOwotCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7Ci0KLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOwotCWlmIChwQWQtPlRpbWVyUS5zdGF0dXMgJiBSVDI4NzBfVEhSRUFEX0NBTl9ET19JTlNFUlQpCi0JewotCQlpZihwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCkKLQkJewotCQkJcFFOb2RlID0gcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3Q7Ci0JCQlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IHBRTm9kZS0+cE5leHQ7Ci0KLQkJCXBRTm9kZS0+cFJhVGltZXIgPSBwVGltZXI7Ci0JCQlwUU5vZGUtPnBOZXh0ID0gTlVMTDsKLQotCQkJcFFUYWlsID0gcEFkLT5UaW1lclEucFFUYWlsOwotCQkJaWYgKHBBZC0+VGltZXJRLnBRVGFpbCAhPSBOVUxMKQotCQkJCXBRVGFpbC0+cE5leHQgPSBwUU5vZGU7Ci0JCQlwQWQtPlRpbWVyUS5wUVRhaWwgPSBwUU5vZGU7Ci0JCQlpZiAocEFkLT5UaW1lclEucFFIZWFkID09IE5VTEwpCi0JCQkJcEFkLT5UaW1lclEucFFIZWFkID0gcFFOb2RlOwotCQl9Ci0JCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7Ci0KLQkJaWYgKHBRTm9kZSkKLQkJCXVwKCZwQWQtPlJUVVNCVGltZXJfc2VtYXBob3JlKTsKLQkJCS8vd2FrZV91cCgmdGltZXJXYWl0USk7Ci0JfQotCWVsc2UKLQl7Ci0JCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7Ci0JfQotCXJldHVybiBwUU5vZGU7Ci19Ci0KLQotQk9PTEVBTiBSVDI4NzBfVGltZXJRX1JlbW92ZSgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBSQUxJTktfVElNRVJfU1RSVUNUICpwVGltZXIpCi17Ci0JUlQyODcwX1RJTUVSX0VOVFJZICpwTm9kZSwgKnBQcmV2ID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGlycUZsYWdzOwotCi0JUlRNUF9JUlFfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7Ci0JaWYgKHBBZC0+VGltZXJRLnN0YXR1cyA+PSBSVDI4NzBfVEhSRUFEX0lOSVRFRCkKLQl7Ci0JCXBOb2RlID0gcEFkLT5UaW1lclEucFFIZWFkOwotCQl3aGlsZSAocE5vZGUpCi0JCXsKLQkJCWlmIChwTm9kZS0+cFJhVGltZXIgPT0gcFRpbWVyKQotCQkJCWJyZWFrOwotCQkJcFByZXYgPSBwTm9kZTsKLQkJCXBOb2RlID0gcE5vZGUtPnBOZXh0OwotCQl9Ci0KLQkJLy8gTm93IG1vdmUgaXQgdG8gZnJlZUxpc3QgcXVldWUuCi0JCWlmIChwTm9kZSkKLQkJewotCQkJaWYgKHBOb2RlID09IHBBZC0+VGltZXJRLnBRSGVhZCkKLQkJCQlwQWQtPlRpbWVyUS5wUUhlYWQgPSBwTm9kZS0+cE5leHQ7Ci0JCQlpZiAocE5vZGUgPT0gcEFkLT5UaW1lclEucFFUYWlsKQotCQkJCXBBZC0+VGltZXJRLnBRVGFpbCA9IHBQcmV2OwotCQkJaWYgKHBQcmV2ICE9IE5VTEwpCi0JCQkJcFByZXYtPnBOZXh0ID0gcE5vZGUtPnBOZXh0OwotCi0JCQkvLyByZXR1cm4gdGhpcyBxdWV1ZSBlbnRyeSB0byB0aW1lclFGcmVlTGlzdC4KLQkJCXBOb2RlLT5wTmV4dCA9IHBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0OwotCQkJcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBwTm9kZTsKLQkJfQotCX0KLQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotdm9pZCBSVDI4NzBfVGltZXJRX0V4aXQoUlRNUF9BREFQVEVSICpwQWQpCi17Ci0JUlQyODcwX1RJTUVSX0VOVFJZICpwVGltZXJROwotCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7Ci0KLQlSVE1QX0lSUV9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKLQl3aGlsZSAocEFkLT5UaW1lclEucFFIZWFkKQotCXsKLQkJcFRpbWVyUSA9IHBBZC0+VGltZXJRLnBRSGVhZDsKLQkJcEFkLT5UaW1lclEucFFIZWFkID0gcFRpbWVyUS0+cE5leHQ7Ci0JCS8vIHJlbW92ZSB0aGUgdGltZVEKLQl9Ci0JcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBOVUxMOwotCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5UaW1lclEucFRpbWVyUVBvbGwpOwotCXBBZC0+VGltZXJRLnBRVGFpbCA9IE5VTEw7Ci0JcEFkLT5UaW1lclEucFFIZWFkID0gTlVMTDsKLQlwQWQtPlRpbWVyUS5zdGF0dXMgPSBSVDI4NzBfVEhSRUFEX1NUT1BFRDsKLQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOwotCi19Ci0KLQotdm9pZCBSVDI4NzBfVGltZXJRX0luaXQoUlRNUF9BREFQVEVSICpwQWQpCi17Ci0JaW50IAlpOwotCVJUMjg3MF9USU1FUl9FTlRSWSAqcFFOb2RlLCAqcEVudHJ5OwotCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7Ci0KLQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5UaW1lclFMb2NrKTsKLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOwotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlRpbWVyUSwgc2l6ZW9mKHBBZC0+VGltZXJRKSk7Ci0JLy9JbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPlRpbWVyUS5jb3VudCwgMCk7Ci0KLQkvKiBJbml0aWFsaXNlIHRoZSB3YWl0IHEgaGVhZCAqLwotCS8vaW5pdF93YWl0cXVldWVfaGVhZCgmdGltZXJXYWl0USk7Ci0KLQlvc19hbGxvY19tZW0ocEFkLCAmcEFkLT5UaW1lclEucFRpbWVyUVBvbGwsIHNpemVvZihSVDI4NzBfVElNRVJfRU5UUlkpICogVElNRVJfUVVFVUVfU0laRV9NQVgpOwotCWlmIChwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCkKLQl7Ci0JCXBFbnRyeSA9IE5VTEw7Ci0JCXBRTm9kZSA9IChSVDI4NzBfVElNRVJfRU5UUlkgKilwQWQtPlRpbWVyUS5wVGltZXJRUG9sbDsKLQkJZm9yIChpID0gMCA7aSA8VElNRVJfUVVFVUVfU0laRV9NQVg7IGkrKykKLQkJewotCQkJcFFOb2RlLT5wTmV4dCA9IHBFbnRyeTsKLQkJCXBFbnRyeSA9IHBRTm9kZTsKLQkJCXBRTm9kZSsrOwotCQl9Ci0JCXBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0ID0gcEVudHJ5OwotCQlwQWQtPlRpbWVyUS5wUUhlYWQgPSBOVUxMOwotCQlwQWQtPlRpbWVyUS5wUVRhaWwgPSBOVUxMOwotCQlwQWQtPlRpbWVyUS5zdGF0dXMgPSBSVDI4NzBfVEhSRUFEX0lOSVRFRDsKLQl9Ci0JUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKLX0KLQotCi1WT0lEIFJUMjg3MF9XYXRjaERvZyhJTiBSVE1QX0FEQVBURVIgKnBBZCkKLXsKLQlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OwotCWludCAJCQkJCWlkeDsKLQlVTE9ORwkJCQlpcnFGbGFnczsKLQlQVVJCCQkgICAJCXBVcmI7Ci0JQk9PTEVBTgkJCQluZWVkRHVtcFNlcSA9IEZBTFNFOwotCVVJTlQzMiAgICAgICAgICAJTUFDVmFsdWU7Ci0KLQotCWlkeCA9IDA7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBUWFJYUV9QQ05ULCAmTUFDVmFsdWUpOwotCWlmICgoTUFDVmFsdWUgJiAweGZmKSAhPTAgKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVFggUVVFVUUgMCBOb3QgRU1QVFkoVmFsdWU9MHglMHgpLiAhISEhISEhISEhISEhISFcbiIsIE1BQ1ZhbHVlKSk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9DRkcsIDB4ZjQwMDEyKTsKLQkJd2hpbGUoKE1BQ1ZhbHVlICYweGZmKSAhPSAwICYmIChpZHgrKyA8IDEwKSkKLQkJewotCQkgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgVFhSWFFfUENOVCwgJk1BQ1ZhbHVlKTsKLQkJICAgICAgICBOZGlzTVNsZWVwKDEpOwotCQl9Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9DRkcsIDB4ZjQwMDA2KTsKLQl9Ci0KLS8vUFMgcGFja2V0cyB1c2UgSENDQSBxdWV1ZSB3aGVuIGRlcXVldWUgZnJvbSBQUyB1bmljYXN0IHF1ZXVlIChXaUZpIFdQQTIgTUE5X0RUMSBmb3IgTWFydmVsbCBCIFNUQSkKLQlpZHggPSAwOwotCWlmICgoTUFDVmFsdWUgJiAweGZmMDApICE9MCApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUWCBRVUVVRSAxIE5vdCBFTVBUWShWYWx1ZT0weCUweCkuICEhISEhISEhISEhISEhIVxuIiwgTUFDVmFsdWUpKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX0NGRywgMHhmNDAwMGEpOwotCQl3aGlsZSgoTUFDVmFsdWUgJjB4ZmYwMCkgIT0gMCAmJiAoaWR4KysgPCAxMCkpCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhSWFFfUENOVCwgJk1BQ1ZhbHVlKTsKLQkJCU5kaXNNU2xlZXAoMSk7Ci0JCX0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX0NGRywgMHhmNDAwMDYpOwotCX0KLQotCWlmIChwQWQtPndhdGNoRG9nUnhPdmVyRmxvd0NudCA+PSAyKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWF5YmUgdGhlIFJ4IEJ1bGstSW4gaGFuZ2VkISBDYW5jZWwgdGhlIHBlbmRpbmcgUnggYnVsa3MgcmVxdWVzdCFcbiIpKTsKLQkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCQlmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCB8Ci0JCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDYWxsIENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOIHRvIGNhbmNlbCB0aGUgcGVuZGluZyBSeCBCdWxrIVxuIikpOwotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUKTsKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU4sIE5VTEwsIDApOwotCQkJbmVlZER1bXBTZXEgPSBUUlVFOwotCQl9Ci0JCXBBZC0+d2F0Y2hEb2dSeE92ZXJGbG93Q250ID0gMDsKLQl9Ci0KLQotCWZvciAoaWR4ID0gMDsgaWR4IDwgTlVNX09GX1RYX1JJTkc7IGlkeCsrKQotCXsKLQkJcFVyYiA9IE5VTEw7Ci0KLQkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tpZHhdLCBpcnFGbGFncyk7Ci0JCWlmICgocEFkLT5CdWxrT3V0UGVuZGluZ1tpZHhdID09IFRSVUUpICYmIHBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnQpCi0JCXsKLQkJCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbaWR4XSsrOwotCi0JCQlpZiAoKHBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbaWR4XSA+IDIpICYmCi0JCQkJICghUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCB8IGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQotCQkJCSkKLQkJCXsKLQkJCQkvLyBGSVhNRTogRm9sbG93aW5nIGNvZGUganVzdCBzdXBwb3J0IHNpbmdsZSBidWxrIG91dC4gSWYgeW91IHdhbm5hIHN1cHBvcnQgbXVsdGlwbGUgYnVsayBvdXQuIE1vZGlmeSBpdCEKLQkJCQlwSFRUWENvbnRleHQgPSAoUEhUX1RYX0NPTlRFWFQpKCZwQWQtPlR4Q29udGV4dFtpZHhdKTsKLQkJCQlpZiAocEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nKQotCQkJCXsJLy8gQ2hlY2sgVHhDb250ZXh0LgotCQkJCQlwVXJiID0gcEhUVFhDb250ZXh0LT5wVXJiOwotCQkJCX0KLQkJCQllbHNlIGlmIChpZHggPT0gTUdNVFBJUEVJRFgpCi0JCQkJewotCQkJCQlQVFhfQ09OVEVYVCBwTUxNRUNvbnRleHQsIHBOVUxMQ29udGV4dCwgcFBzUG9sbENvbnRleHQ7Ci0KLQkJCQkJLy9DaGVjayBNZ210Q29udGV4dC4KLQkJCQkJcE1MTUVDb250ZXh0ID0gKFBUWF9DT05URVhUKShwQWQtPk1nbXRSaW5nLkNlbGxbcEFkLT5NZ210UmluZy5UeERtYUlkeF0uQWxsb2NWYSk7Ci0JCQkJCXBQc1BvbGxDb250ZXh0ID0gKFBUWF9DT05URVhUKSgmcEFkLT5Qc1BvbGxDb250ZXh0KTsKLQkJCQkJcE5VTExDb250ZXh0ID0gKFBUWF9DT05URVhUKSgmcEFkLT5OdWxsQ29udGV4dCk7Ci0KLQkJCQkJaWYgKHBNTE1FQ29udGV4dC0+SVJQUGVuZGluZykKLQkJCQkJewotCQkJCQkJQVNTRVJUKHBNTE1FQ29udGV4dC0+SVJQUGVuZGluZyk7Ci0JCQkJCQlwVXJiID0gcE1MTUVDb250ZXh0LT5wVXJiOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHBOVUxMQ29udGV4dC0+SVJQUGVuZGluZykKLQkJCQkJewotCQkJCQkJQVNTRVJUKHBOVUxMQ29udGV4dC0+SVJQUGVuZGluZyk7Ci0JCQkJCQlwVXJiID0gcE5VTExDb250ZXh0LT5wVXJiOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nKQotCQkJCQl7Ci0JCQkJCQlBU1NFUlQocFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcpOwotCQkJCQkJcFVyYiA9IHBQc1BvbGxDb250ZXh0LT5wVXJiOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW2lkeF0sIGlycUZsYWdzKTsKLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1heWJlIHRoZSBUeCBCdWxrLU91dCBoYW5nZWQhIENhbmNlbCB0aGUgcGVuZGluZyBUeCBidWxrcyByZXF1ZXN0IG9mIGlkeCglZCkhXG4iLCBpZHgpKTsKLQkJCQlpZiAocFVyYikKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlVubGluayB0aGUgcGVuZGluZyBVUkIhXG4iKSk7Ci0JCQkJCS8vIHVubGluayBpdCBub3cKLQkJCQkJUlRVU0JfVU5MSU5LX1VSQihwVXJiKTsKLQkJCQkJLy8gU2xlZXAgMjAwIG1pY3Jvc2Vjb25kcyB0byBnaXZlIGNhbmNlbGxhdGlvbiB0aW1lIHRvIHdvcmsKLQkJCQkJUlRNUHVzZWNEZWxheSgyMDApOwotCQkJCQluZWVkRHVtcFNlcSA9IFRSVUU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlVua29udyBidWxrT3V0IFVSQiBtYXliZSBoYW5nZWQhISEhISEhISEhISFcbiIpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW2lkeF0sIGlycUZsYWdzKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tpZHhdLCBpcnFGbGFncyk7Ci0JCX0KLQl9Ci0KLQkvLyBGb3IgU2lnbWEgZGVidWcsIGR1bXAgdGhlIGJhX3Jlb3JkZXJpbmcgc2VxdWVuY2UuCi0JaWYoKG5lZWREdW1wU2VxID09IFRSVUUpICYmIChwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPT0gMCkpCi0JewotCQlVU0hPUlQJCQkJSWR4OwotCQlQQkFfUkVDX0VOVFJZCQlwQkFFbnRyeSA9IE5VTEw7Ci0JCVVDSEFSCQkJCWNvdW50ID0gMDsKLQkJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7Ci0KLQkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5CQVJlY1djaWRBcnJheVswXTsKLQotCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOwotCQlpZigocEJBRW50cnktPmxpc3QucWxlbiA+IDApICYmIChwQkFFbnRyeS0+bGlzdC5uZXh0ICE9IE5VTEwpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOSUNVcGRhdGVSYXdDb3VudGVycygpOlRoZSBRdWV1ZWluZyBwa3QgaW4gcmVvcmRlcmluZyBidWZmZXI6XG4iKSk7Ci0JCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKLQkJCW1wZHVfYmxrID0gcEJBRW50cnktPmxpc3QubmV4dDsKLQkJCXdoaWxlIChtcGR1X2JsaykKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJcdCVkOlNlcS0lZCwgYkFNU0RVLSVkIVxuIiwgY291bnQsIG1wZHVfYmxrLT5TZXF1ZW5jZSwgbXBkdV9ibGstPmJBTVNEVSkpOwotCQkJCW1wZHVfYmxrID0gbXBkdV9ibGstPm5leHQ7Ci0JCQkJY291bnQrKzsKLQkJCX0KLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXG5wQkFFbnRyeS0+TGFzdEluZFNlcT0lZCFcbiIsIHBCQUVudHJ5LT5MYXN0SW5kU2VxKSk7Ci0JCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKLQkJfQotCX0KLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBSZWxlYXNlIGFsbG9jYXRlZCByZXNvdXJjZXMuCi0KLUFyZ3VtZW50czoKLSAgICAqZGV2CQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQotCXBBZAkJCQkJZHJpdmVyIGNvbnRyb2wgYmxvY2sgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIHZvaWQgX3J0dXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UJKm5ldF9kZXYgPSBOVUxMOwotCi0KLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJydHVzYl9kaXNjb25uZWN0OiB1bnJlZ2lzdGVyIHVzYm5ldCB1c2ItJXMtJXNcbiIsCi0JCQkJZGV2LT5idXMtPmJ1c19uYW1lLCBkZXYtPmRldnBhdGgpKTsKLQlpZiAoIXBBZCkKLQl7Ci0JCXVzYl9wdXRfZGV2KGRldik7Ci0KLQkJcHJpbnRrKCJydHVzYl9kaXNjb25uZWN0OiBwQWQgPT0gTlVMTCFcbiIpOwotCQlyZXR1cm47Ci0JfQotCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpOwotCi0KLQotCS8vIGZvciBkZWJ1Zywgd2FpdCB0byBzaG93IHNvbWUgbWVzc2FnZXMgdG8gL3Byb2Mgc3lzdGVtCi0JdWRlbGF5KDEpOwotCi0KLQotCi0JbmV0X2RldiA9IHBBZC0+bmV0X2RldjsKLQlpZiAocEFkLT5uZXRfZGV2ICE9IE5VTEwpCi0JewotCQlwcmludGsoInJ0dXNiX2Rpc2Nvbm5lY3Q6IHVucmVnaXN0ZXJfbmV0ZGV2KCksIGRldi0+bmFtZT0lcyFcbiIsIG5ldF9kZXYtPm5hbWUpOwotCQl1bnJlZ2lzdGVyX25ldGRldiAocEFkLT5uZXRfZGV2KTsKLQl9Ci0JdWRlbGF5KDEpOwotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0JdWRlbGF5KDEpOwotCi0JLy8gZnJlZSBuZXRfZGV2aWNlIG1lbW9yeQotCWZyZWVfbmV0ZGV2KG5ldF9kZXYpOwotCi0JLy8gZnJlZSBhZGFwdGVyIG1lbW9yeQotCVJUTVBGcmVlQWRhcHRlcihwQWQpOwotCi0JLy8gcmVsZWFzZSBhIHVzZSBvZiB0aGUgdXNiIGRldmljZSBzdHJ1Y3R1cmUKLQl1c2JfcHV0X2RldihkZXYpOwotCXVkZWxheSgxKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiBSVFVTQiBkaXNjb25uZWN0IHN1Y2Nlc3NmdWxseVxuIikpOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgUHJvYmUgUlQyOFhYIGNoaXBzZXQuCi0KLUFyZ3VtZW50czoKLSAgICAqZGV2CQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQotCWludGVyZmFjZQotCSppZF90YWJsZQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZSBJRAotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIGludCBydHVzYl9wcm9iZSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCi0JCQkJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWQ7Ci0JcmV0dXJuIChpbnQpcnQyOHh4X3Byb2JlKCh2b2lkICopaW50ZiwgKHZvaWQgKilpZCwgMCwgJnBBZCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgcnR1c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQlzdHJ1Y3QgdXNiX2RldmljZSAgICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwotCVBSVE1QX0FEQVBURVIgICAgICAgcEFkOwotCi0KLQlwQWQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7Ci0KLQlfcnR1c2JfZGlzY29ubmVjdChkZXYsIHBBZCk7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBDbG9zZSBrZXJuZWwgdGhyZWFkcy4KLQotQXJndW1lbnRzOgotCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTk9ORQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVDI4eHhUaHJlYWRUZXJtaW5hdGUoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpCi17Ci0JUE9TX0NPT0tJRQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCUlOVAkJCXJldDsKLQotCi0JLy8gU2xlZXAgNTAgbWlsbGlzZWNvbmRzIHNvIHBlbmRpbmcgaW8gbWlnaHQgZmluaXNoIG5vcm1hbGx5Ci0JUlRNUHVzZWNEZWxheSg1MDAwMCk7Ci0KLQkvLyBXZSB3YW50IHRvIHdhaXQgdW50aWwgYWxsIHBlbmRpbmcgcmVjZWl2ZXMgYW5kIHNlbmRzIHRvIHRoZQotCS8vIGRldmljZSBvYmplY3QuIFdlIGNhbmNlbCBhbnkKLQkvLyBpcnBzLiBXYWl0IHVudGlsIHNlbmRzIGFuZCByZWNlaXZlcyBoYXZlIHN0b3BwZWQuCi0JUlRVU0JDYW5jZWxQZW5kaW5nSVJQcyhwQWQpOwotCi0JLy8gVGVybWluYXRlIFRocmVhZHMKLQotCWlmIChwaWRfbnIocE9iai0+VGltZXJRVGhyX3BpZCkgPiAwKQotCXsKLQkJUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQkJcHJpbnRrKCJUZXJtaW5hdGUgdGhlIFRpbWVyUVRocl9waWQ9JWQhXG4iLCBwaWRfbnIocE9iai0+VGltZXJRVGhyX3BpZCkpOwotCQltYigpOwotCQlwQWQtPlRpbWVyRnVuY19raWxsID0gMTsKLQkJbWIoKTsKLQkJcmV0ID0ga2lsbF9waWQocE9iai0+VGltZXJRVGhyX3BpZCwgU0lHVEVSTSwgMSk7Ci0JCWlmIChyZXQpCi0JCXsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gc3RvcCBUaW1lclFUaHJlYWQsIHBpZD0lZCwgcmV0PSVkIVxuIiwKLQkJCQkJcEFkLT5uZXRfZGV2LT5uYW1lLCBwaWRfbnIocE9iai0+VGltZXJRVGhyX3BpZCksIHJldCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZwQWQtPlRpbWVyUUNvbXBsZXRlKTsKLQkJCXBPYmotPlRpbWVyUVRocl9waWQgPSBOVUxMOwotCQl9Ci0JfQotCi0JaWYgKHBpZF9ucihwT2JqLT5NTE1FVGhyX3BpZCkgPiAwKQotCXsKLQkJcHJpbnRrKCJUZXJtaW5hdGUgdGhlIE1MTUVUaHJfcGlkPSVkIVxuIiwgcGlkX25yKHBPYmotPk1MTUVUaHJfcGlkKSk7Ci0JCW1iKCk7Ci0JCXBBZC0+bWxtZV9raWxsID0gMTsKLQkJLy9SVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Ci0JCW1iKCk7Ci0JCXJldCA9IGtpbGxfcGlkKHBPYmotPk1MTUVUaHJfcGlkLCBTSUdURVJNLCAxKTsKLQkJaWYgKHJldCkKLQkJewotCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gTWxtZSB0aHJlYWQsIHBpZD0lZCwgcmV0PSVkIVxuIiwKLQkJCQkJcEFkLT5uZXRfZGV2LT5uYW1lLCBwaWRfbnIocE9iai0+TUxNRVRocl9waWQpLCByZXQpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy93YWl0X2Zvcl9jb21wbGV0aW9uICgmcEFkLT5ub3RpZnkpOwotCQkJd2FpdF9mb3JfY29tcGxldGlvbiAoJnBBZC0+bWxtZUNvbXBsZXRlKTsKLQkJCXBPYmotPk1MTUVUaHJfcGlkID0gTlVMTDsKLQkJfQotCX0KLQotCWlmIChwaWRfbnIocE9iai0+UlRVU0JDbWRUaHJfcGlkKSA+IDApCi0JewotCQlwcmludGsoIlRlcm1pbmF0ZSB0aGUgUlRVU0JDbWRUaHJfcGlkPSVkIVxuIiwgcGlkX25yKHBPYmotPlJUVVNCQ21kVGhyX3BpZCkpOwotCQltYigpOwotCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKLQkJcEFkLT5DbWRRLkNtZFFTdGF0ZSA9IFJUMjg3MF9USFJFQURfU1RPUEVEOwotCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKLQkJbWIoKTsKLQkJLy9SVFVTQkNNRFVwKHBBZCk7Ci0JCXJldCA9IGtpbGxfcGlkKHBPYmotPlJUVVNCQ21kVGhyX3BpZCwgU0lHVEVSTSwgMSk7Ci0JCWlmIChyZXQpCi0JCXsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gUlRVU0JDbWQgdGhyZWFkLCBwaWQ9JWQsIHJldD0lZCFcbiIsCi0JCQkJCXBBZC0+bmV0X2Rldi0+bmFtZSwgcGlkX25yKHBPYmotPlJUVVNCQ21kVGhyX3BpZCksIHJldCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvL3dhaXRfZm9yX2NvbXBsZXRpb24gKCZwQWQtPm5vdGlmeSk7Ci0JCQl3YWl0X2Zvcl9jb21wbGV0aW9uICgmcEFkLT5DbWRRQ29tcGxldGUpOwotCQkJcE9iai0+UlRVU0JDbWRUaHJfcGlkID0gTlVMTDsKLQkJfQotCX0KLQotCS8vIEtpbGwgdGFza2xldHMKLQlwQWQtPm1sbWVfa2lsbCA9IDA7Ci0JcEFkLT5DbWRRLkNtZFFTdGF0ZSA9IFJUMjg3MF9USFJFQURfVU5LTk9XTjsKLQlwQWQtPlRpbWVyRnVuY19raWxsID0gMDsKLX0KLQotCi12b2lkIGtpbGxfdGhyZWFkX3Rhc2soSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JUE9TX0NPT0tJRSBwT2JqOwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCXRhc2tsZXRfa2lsbCgmcE9iai0+cnhfZG9uZV90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+dGJ0dF90YXNrKTsKLQotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgQ2hlY2sgdGhlIGNoaXBzZXQgdmVuZG9yL3Byb2R1Y3QgSUQuCi0KLUFyZ3VtZW50czoKLSAgICBfZGV2X3AJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCi0KLVJldHVybiBWYWx1ZToKLSAgICBUUlVFCQkJCUNoZWNrIG9rCi0JRkFMU0UJCQkJQ2hlY2sgZmFpbAotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBSVDI4WFhDaGlwc2V0Q2hlY2soCi0JSU4gdm9pZCAqX2Rldl9wKQotewotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gKHN0cnVjdCB1c2JfaW50ZXJmYWNlICopX2Rldl9wOwotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZfcCA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7Ci0JVUlOVDMyIGk7Ci0KLQotCWZvcihpPTA7IGk8cnR1c2JfdXNiX2lkX2xlbjsgaSsrKQotCXsKLQkJaWYgKGRldl9wLT5kZXNjcmlwdG9yLmlkVmVuZG9yID09IHJ0dXNiX3VzYl9pZFtpXS5pZFZlbmRvciAmJgotCQkJZGV2X3AtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ID09IHJ0dXNiX3VzYl9pZFtpXS5pZFByb2R1Y3QpCi0JCXsKLQkJCXByaW50aygicnQyODcwOiBpZFZlbmRvciA9IDB4JXgsIGlkUHJvZHVjdCA9IDB4JXhcbiIsCi0JCQkJCWRldl9wLT5kZXNjcmlwdG9yLmlkVmVuZG9yLCBkZXZfcC0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoaSA9PSBydHVzYl91c2JfaWRfbGVuKQotCXsKLQkJcHJpbnRrKCJydDI4NzA6IEVycm9yISBEZXZpY2UgRGVzY3JpcHRvciBub3QgbWF0Y2hpbmchXG4iKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgSW5pdCBuZXQgZGV2aWNlIHN0cnVjdHVyZS4KLQotQXJndW1lbnRzOgotICAgIF9kZXZfcAkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKLSAgICAqbmV0X2RldgkJCVBvaW50IHRvIHRoZSBuZXQgZGV2aWNlCi0JKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLSAgICBUUlVFCQkJCUluaXQgb2sKLQlGQUxTRQkJCQlJbml0IGZhaWwKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4gUlQyOFhYTmV0RGV2SW5pdCgKLQlJTiB2b2lkIAkJCQkqX2Rldl9wLAotCUlOIHN0cnVjdCAgbmV0X2RldmljZQkqbmV0X2RldiwKLQlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKQotewotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gKHN0cnVjdCB1c2JfaW50ZXJmYWNlICopX2Rldl9wOwotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZfcCA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7Ci0KLQotCXBBZC0+Y29uZmlnID0gJmRldl9wLT5jb25maWctPmRlc2M7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBJbml0IG5ldCBkZXZpY2Ugc3RydWN0dXJlLgotCi1Bcmd1bWVudHM6Ci0gICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQotCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgVFJVRQkJCQlDb25maWcgb2sKLQlGQUxTRQkJCQlDb25maWcgZmFpbAotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBSVDI4WFhQcm9iZVBvc3RDb25maWcoCi0JSU4gdm9pZCAJCQkJKl9kZXZfcCwKLQlJTiBSVE1QX0FEQVBURVIgCQkqcEFkLAotCUlOIElOVDMyCQkJCWludGVyZmFjZSkKLXsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKV9kZXZfcDsKLQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOwotCVVMT05HIEJ1bGtPdXRJZHg7Ci0JVUlOVDMyIGk7Ci0KLQotCS8qIGdldCB0aGUgYWN0aXZlIGludGVyZmFjZSBkZXNjcmlwdG9yICovCi0JaWZhY2VfZGVzYyA9IGludGYtPmN1cl9hbHRzZXR0aW5nOwotCi0JLyogZ2V0ICMgb2YgZW5wb2ludHMgICovCi0JcEFkLT5OdW1iZXJPZlBpcGVzID0gaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAotCQkJKCJOdW1FbmRwb2ludHM9JWRcbiIsIGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50cykpOwotCi0JLyogQ29uZmlndXJlIFBpcGVzICovCi0JQnVsa091dElkeCA9IDA7Ci0KLQlmb3IoaT0wOyBpPHBBZC0+TnVtYmVyT2ZQaXBlczsgaSsrKQotCXsKLQkJaWYgKChpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJtQXR0cmlidXRlcyA9PQotCQkJCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEspICYmCi0JCQkoKGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYkVuZHBvaW50QWRkcmVzcyAmCi0JCQkJVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX0lOKSkKLQkJewotCQkJcEFkLT5CdWxrSW5FcEFkZHIgPSBpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3M7Ci0JCQlwQWQtPkJ1bGtJbk1heFBhY2tldFNpemUgPSBpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLndNYXhQYWNrZXRTaXplOwotCi0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCi0JCQkJKCJCVUxLIElOIE1heGltdW1QYWNrZXRTaXplID0gJWRcbiIsIHBBZC0+QnVsa0luTWF4UGFja2V0U2l6ZSkpOwotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAotCQkJCSgiRVAgYWRkcmVzcyA9IDB4JTJ4XG4iLCBpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3MpKTsKLQkJfQotCQllbHNlIGlmICgoaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5ibUF0dHJpYnV0ZXMgPT0KLQkJCQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSykgJiYKLQkJCQkoKGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYkVuZHBvaW50QWRkcmVzcyAmCi0JCQkJCVVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9PVVQpKQotCQl7Ci0JCQkvLyB0aGVyZSBhcmUgNiBidWxrIG91dCBFUC4gRVA2IGhpZ2hlc3QgcHJpb3JpdHkuCi0JCQkvLyBFUDEtNCBpcyBFRENBLiAgRVA1IGlzIEhDQ0EuCi0JCQlwQWQtPkJ1bGtPdXRFcEFkZHJbQnVsa091dElkeCsrXSA9IGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYkVuZHBvaW50QWRkcmVzczsKLQkJCXBBZC0+QnVsa091dE1heFBhY2tldFNpemUgPSBpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLndNYXhQYWNrZXRTaXplOwotCi0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCi0JCQkJKCJCVUxLIE9VVCBNYXhpbXVtUGFja2V0U2l6ZSA9ICVkXG4iLCBwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplKSk7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCi0JCQkJKCJFUCBhZGRyZXNzID0gMHglMnggIFxuIiwgaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzKSk7Ci0JCX0KLQl9Ci0KLQlpZiAoIShwQWQtPkJ1bGtJbkVwQWRkciAmJiBwQWQtPkJ1bGtPdXRFcEFkZHJbMF0pKQotCXsKLQkJcHJpbnRrKCIlczogQ291bGQgbm90IGZpbmQgYm90aCBidWxrLWluIGFuZCBidWxrLW91dCBlbmRwb2ludHNcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgRGlzYWJsZSBETUEuCi0KLUFyZ3VtZW50czoKLQkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlQyOFhYRE1BRGlzYWJsZSgKLQlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKQotewotCS8vIG5vIHVzZQotfQotCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBFbmFibGUgRE1BLgotCi1Bcmd1bWVudHM6Ci0JKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUMjhYWERNQUVuYWJsZSgKLQlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKQotewotCVdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOwotCVVTQl9ETUFfQ0ZHX1NUUlVDCVVzYkNmZzsKLQlpbnQJCQkJCWkgPSAwOwotCi0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4NCk7Ci0JZG8KLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKLQkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKLQkJCWJyZWFrOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiAgRE1BQnVzeVxuIikpOwotCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCQlpKys7Ci0JfXdoaWxlICggaSA8MjAwKTsKLQotCi0JUlRNUHVzZWNEZWxheSg1MCk7Ci0JR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9IDE7Ci0JR2xvQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gMTsKLQlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBXUklURSBETUEgb2Zmc2V0IDB4MjA4ID0gMHgleFxuIiwgR2xvQ2ZnLndvcmQpKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7Ci0KLQlVc2JDZmcud29yZCA9IDA7Ci0JVXNiQ2ZnLmZpZWxkLnBoeWNsZWFyID0gMDsKLQkvKiB1c2IgdmVyc2lvbiBpcyAxLjEsZG8gbm90IHVzZSBidWxrIGluIGFnZ3JlZ2F0aW9uICovCi0JaWYgKHBBZC0+QnVsa0luTWF4UGFja2V0U2l6ZSA9PSA1MTIpCi0JCQlVc2JDZmcuZmllbGQuUnhCdWxrQWdnRW4gPSAxOwotCS8qIGZvciBsYXN0IHBhY2tldCwgUEJGIG1pZ2h0IHVzZSBtb3JlIHRoYW4gbGltaXRlZCwgc28gbWludXMgMiB0byBwcmV2ZW50IGZyb20gZXJyb3IgKi8KLQlVc2JDZmcuZmllbGQuUnhCdWxrQWdnTG10ID0gKE1BWF9SWEJVTEtfU0laRSAvMTAyNCktMzsKLQlVc2JDZmcuZmllbGQuUnhCdWxrQWdnVE91dCA9IDB4ODA7IC8qIDIwMDYtMTAtMTggKi8KLQlVc2JDZmcuZmllbGQuUnhCdWxrRW4gPSAxOwotCVVzYkNmZy5maWVsZC5UeEJ1bGtFbiA9IDE7Ci0KLQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBVU0JfRE1BX0NGRywgVXNiQ2ZnLndvcmQpOwotCi19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgV3JpdGUgQmVhY29uIGJ1ZmZlciB0byBBc2ljLgotCi1Bcmd1bWVudHM6Ci0JKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUMjh4eF9VcGRhdGVCZWFjb25Ub0FzaWMoCi0JSU4gUlRNUF9BREFQVEVSCQkqcEFkLAotCUlOIElOVAkJCQlhcGlkeCwKLQlJTiBVTE9ORwkJCUZyYW1lTGVuLAotCUlOIFVMT05HCQkJVXBkYXRlUG9zKQotewotCVBVQ0hBUiAgICAgICAgCXBCZWFjb25GcmFtZSA9IE5VTEw7Ci0JVUNIQVIgIAkJCSpwdHI7Ci0JVUlOVCAgCQkJaSwgcGFkZGluZzsKLQlCRUFDT05fU1lOQ19TVFJVQ1QJKnBCZWFjb25TeW5jID0gcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmM7Ci0JVUlOVDMyCQkJbG9uZ1ZhbHVlOwotCUJPT0xFQU4JCQliQmNuUmVxID0gRkFMU0U7Ci0JVUNIQVIJCQliY25faWR4ID0gMDsKLQotCi0JaWYgKHBCZWFjb25GcmFtZSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQmVhY29uRnJhbWUgaXMgTlVMTCFcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwQmVhY29uU3luYyA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQmVhY29uU3luYyBpcyBOVUxMIVxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JLy9pZiAoKHBBZC0+V2RzVGFiLk1vZGUgPT0gV0RTX0JSSURHRV9NT0RFKSB8fAotCS8vCSgocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLk1TU0lERGV2ID09IE5VTEwpIHx8ICEocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLk1TU0lERGV2LT5mbGFncyAmIElGRl9VUCkpCi0JLy8JKQotCWlmIChiQmNuUmVxID09IEZBTFNFKQotCXsKLQkJLyogd2hlbiB0aGUgcmEgaW50ZXJmYWNlIGlzIGRvd24sIGRvIG5vdCBzZW5kIGl0cyBiZWFjb24gZnJhbWUgKi8KLQkJLyogY2xlYXIgYWxsIHplcm8gKi8KLQkJZm9yKGk9MDsgaTxUWFdJX1NJWkU7IGkrPTQpIHsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgaSwgMHgwMCk7Ci0JCX0KLQkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCAmPSAofihCRUFDT05fQklUTUFQX01BU0sgJiAoMSA8PCBiY25faWR4KSkpOwotCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtiY25faWR4XSwgVFhXSV9TSVpFKTsKLQl9Ci0JZWxzZQotCXsKLQkJcHRyID0gKFBVQ0hBUikmcEFkLT5CZWFjb25UeFdJOwotCi0JCWlmIChOZGlzRXF1YWxNZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbYmNuX2lkeF0sICZwQWQtPkJlYWNvblR4V0ksIFRYV0lfU0laRSkgPT0gRkFMU0UpCi0JCXsJLy8gSWYgQmVhY29uVHhXSSBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHJld3JpdGUgdGhlIFR4V0kgZm9yIHRoZSBCZWFjb24gZnJhbWVzLgotCQkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCAmPSAofihCRUFDT05fQklUTUFQX01BU0sgJiAoMSA8PCBiY25faWR4KSkpOwotCQkJTmRpc01vdmVNZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbYmNuX2lkeF0sICZwQWQtPkJlYWNvblR4V0ksIFRYV0lfU0laRSk7Ci0JCX0KLQotCQlpZiAoKHBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgJiAoMSA8PCBiY25faWR4KSkgIT0gKDEgPDwgYmNuX2lkeCkpCi0JCXsKLQkJCWZvciAoaT0wOyBpPFRYV0lfU0laRTsgaSs9NCkgIC8vIDE2LWJ5dGUgVFhXSSBmaWVsZAotCQkJewotCQkJCWxvbmdWYWx1ZSA9ICAqcHRyICsgKCoocHRyKzEpPDw4KSArICgqKHB0cisyKTw8MTYpICsgKCoocHRyKzMpPDwyNCk7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBpLCBsb25nVmFsdWUpOwotCQkJCXB0ciArPSA0OwotCQkJfQotCQl9Ci0KLQkJcHRyID0gcEJlYWNvblN5bmMtPkJlYWNvbkJ1ZltiY25faWR4XTsKLQkJcGFkZGluZyA9IChGcmFtZUxlbiAmIDB4MDEpOwotCQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKShwQmVhY29uRnJhbWUgKyBGcmFtZUxlbiksIHBhZGRpbmcpOwotCQlGcmFtZUxlbiArPSBwYWRkaW5nOwotCQlmb3IgKGkgPSAwIDsgaSA8IEZyYW1lTGVuIC8qSFdfQkVBQ09OX09GRlNFVCovOyBpICs9IDIpCi0JCXsKLQkJCWlmIChOZGlzRXF1YWxNZW1vcnkocHRyLCBwQmVhY29uRnJhbWUsIDIpID09IEZBTFNFKQotCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KHB0ciwgcEJlYWNvbkZyYW1lLCAyKTsKLQkJCQkvL3Nob3J0VmFsdWUgPSAqcHRyICsgKCoocHRyKzEpPDw4KTsKLQkJCQkvL1JUTVBfSU9fV1JJVEU4KHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBUWFdJX1NJWkUgKyBpLCBzaG9ydFZhbHVlKTsKLQkJCQlSVFVTQk11bHRpV3JpdGUocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIFRYV0lfU0laRSArIGksIHB0ciwgMik7Ci0JCQl9Ci0JCQlwdHIgKz0yOwotCQkJcEJlYWNvbkZyYW1lICs9IDI7Ci0JCX0KLQotCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwIHw9ICgxIDw8IGJjbl9pZHgpOwotCi0JCS8vIEZvciBBUCBpbnRlcmZhY2UsIHNldCB0aGUgRHRpbUJpdE9uIHNvIHRoYXQgd2UgY2FuIHNlbmQgQmNhc3QvTWNhc3QgZnJhbWUgb3V0IGFmdGVyIHRoaXMgYmVhY29uIGZyYW1lLgotCX0KLQotfQotCi0KLVZPSUQgUlQyODcwX0Jzc0JlYWNvblN0b3AoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpCi17Ci0JQkVBQ09OX1NZTkNfU1RSVUNUCSpwQmVhY29uU3luYzsKLQlpbnQgaSwgb2Zmc2V0OwotCUJPT0xFQU4JQ2FuY2VsbGVkID0gVFJVRTsKLQotCXBCZWFjb25TeW5jID0gcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmM7Ci0JaWYgKHBCZWFjb25TeW5jICYmIHBCZWFjb25TeW5jLT5FbmFibGVCZWFjb24pCi0JewotCQlJTlQgTnVtT2ZCY247Ci0KLQkJTnVtT2ZCY24gPSBNQVhfTUVTSF9OVU07Ci0KLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lciwgJkNhbmNlbGxlZCk7Ci0KLQkJZm9yKGk9MDsgaTxOdW1PZkJjbjsgaSsrKQotCQl7Ci0JCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uQnVmW2ldLCBIV19CRUFDT05fT0ZGU0VUKTsKLQkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2ldLCBUWFdJX1NJWkUpOwotCi0JCQlmb3IgKG9mZnNldD0wOyBvZmZzZXQ8SFdfQkVBQ09OX09GRlNFVDsgb2Zmc2V0Kz00KQotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2ldICsgb2Zmc2V0LCAweDAwKTsKLQotCQkJcEJlYWNvblN5bmMtPkNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbltpXSA9IDA7Ci0JCQlwQmVhY29uU3luYy0+VGltSUVMb2NhdGlvbkluQmVhY29uW2ldID0gMDsKLQkJfQotCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwID0gMDsKLQkJcEJlYWNvblN5bmMtPkR0aW1CaXRPbiA9IDA7Ci0JfQotfQotCi0KLVZPSUQgUlQyODcwX0Jzc0JlYWNvblN0YXJ0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKQotewotCWludCBhcGlkeDsKLQlCRUFDT05fU1lOQ19TVFJVQ1QJKnBCZWFjb25TeW5jOwotLy8JTEFSR0VfSU5URUdFUiAJdHNmVGltZSwgZGVsdGFUaW1lOwotCi0JcEJlYWNvblN5bmMgPSBwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYzsKLQlpZiAocEJlYWNvblN5bmMgJiYgcEJlYWNvblN5bmMtPkVuYWJsZUJlYWNvbikKLQl7Ci0JCUlOVCBOdW1PZkJjbjsKLQotCQlOdW1PZkJjbiA9IE1BWF9NRVNIX05VTTsKLQotCQlmb3IoYXBpZHg9MDsgYXBpZHg8TnVtT2ZCY247IGFwaWR4KyspCi0JCXsKLQkJCVVDSEFSIENhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbiA9IDA7Ci0JCQlVQ0hBUiBUaW1JRUxvY2F0aW9uSW5CZWFjb24gPSAwOwotCi0JCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uQnVmW2FwaWR4XSwgSFdfQkVBQ09OX09GRlNFVCk7Ci0JCQlwQmVhY29uU3luYy0+Q2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW2FwaWR4XSA9IENhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbjsKLQkJCXBCZWFjb25TeW5jLT5UaW1JRUxvY2F0aW9uSW5CZWFjb25bYXBpZHhdID0gVGltSUVMb2NhdGlvbkluQmVhY29uOwotCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbYXBpZHhdLCBUWFdJX1NJWkUpOwotCQl9Ci0JCXBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgPSAwOwotCQlwQmVhY29uU3luYy0+RHRpbUJpdE9uID0gMDsKLQkJcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIuUmVwZWF0ID0gVFJVRTsKLQotCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25BZGp1c3QgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25GYWN0b3IgPSAweGZmZmZmZmZmIC8gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCAxMCk7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblJlbWFpbiA9ICgweGZmZmZmZmZmICUgKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCAxMCkpICsgMTsKLQkJcHJpbnRrKFJUMjh4eF9DSElQX05BTUUgIl9Cc3NCZWFjb25TdGFydDpCZWFjb25GYWN0b3I9JWQsIEJlYWNvblJlbWFpbj0lZCFcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJlYWNvbkZhY3RvciwgcEFkLT5Db21tb25DZmcuQmVhY29uUmVtYWluKTsKLQkJUlRNUFNldFRpbWVyKCZwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lciwgcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kKTsKLQotCX0KLX0KLQotCi1WT0lEIFJUMjg3MF9Cc3NCZWFjb25Jbml0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKQotewotCUJFQUNPTl9TWU5DX1NUUlVDVAkqcEJlYWNvblN5bmM7Ci0JaW50IGk7Ci0KLQlOZGlzQWxsb2NNZW1vcnkocEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMsIHNpemVvZihCRUFDT05fU1lOQ19TVFJVQ1QpLCBNRU1fQUxMT0NfRkxBRyk7Ci0JaWYgKHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jKQotCXsKLQkJcEJlYWNvblN5bmMgPSBwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYzsKLQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMsIHNpemVvZihCRUFDT05fU1lOQ19TVFJVQ1QpKTsKLQkJZm9yKGk9MDsgaSA8IEhXX0JFQUNPTl9NQVhfQ09VTlQ7IGkrKykKLQkJewotCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvbkJ1ZltpXSwgSFdfQkVBQ09OX09GRlNFVCk7Ci0JCQlwQmVhY29uU3luYy0+Q2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW2ldID0gMDsKLQkJCXBCZWFjb25TeW5jLT5UaW1JRUxvY2F0aW9uSW5CZWFjb25baV0gPSAwOwotCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbaV0sIFRYV0lfU0laRSk7Ci0JCX0KLQkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCA9IDA7Ci0KLQkJLy9SVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblVwZGF0ZVRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQmVhY29uVXBkYXRlRXhlYyksIHBBZCwgVFJVRSk7Ci0JCXBCZWFjb25TeW5jLT5FbmFibGVCZWFjb24gPSBUUlVFOwotCX0KLX0KLQotCi1WT0lEIFJUMjg3MF9Cc3NCZWFjb25FeGl0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKQotewotCUJFQUNPTl9TWU5DX1NUUlVDVAkqcEJlYWNvblN5bmM7Ci0JQk9PTEVBTglDYW5jZWxsZWQgPSBUUlVFOwotCWludCBpOwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jKQotCXsKLQkJcEJlYWNvblN5bmMgPSBwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYzsKLQkJcEJlYWNvblN5bmMtPkVuYWJsZUJlYWNvbiA9IEZBTFNFOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblVwZGF0ZVRpbWVyLCAmQ2FuY2VsbGVkKTsKLQkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCA9IDA7Ci0KLQkJZm9yKGk9MDsgaTxIV19CRUFDT05fTUFYX0NPVU5UOyBpKyspCi0JCXsKLQkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25CdWZbaV0sIEhXX0JFQUNPTl9PRkZTRVQpOwotCQkJcEJlYWNvblN5bmMtPkNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbltpXSA9IDA7Ci0JCQlwQmVhY29uU3luYy0+VGltSUVMb2NhdGlvbkluQmVhY29uW2ldID0gMDsKLQkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2ldLCBUWFdJX1NJWkUpOwotCQl9Ci0KLQkJTmRpc0ZyZWVNZW1vcnkocEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMsIEhXX0JFQUNPTl9PRkZTRVQgKiBIV19CRUFDT05fTUFYX0NPVU5ULCAwKTsKLQkJcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMgPSBOVUxMOwotCX0KLX0KLQotVk9JRCBCZWFjb25VcGRhdGVFeGVjKAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLQlQUlRNUF9BREFQVEVSCXBBZCA9IChQUlRNUF9BREFQVEVSKUZ1bmN0aW9uQ29udGV4dDsKLQlMQVJHRV9JTlRFR0VSCXRzZlRpbWVfYTsvLywgdHNmVGltZV9iLCBkZWx0YVRpbWVfZXhwLCBkZWx0YVRpbWVfYWI7Ci0JVUlOVDMyCQkJZGVsdGEsIHJlbWFpbiwgcmVtYWluX2xvdywgcmVtYWluX2hpZ2g7Ci0vLwlCT09MRUFOCQkJcG9zaXRpdmU7Ci0KLQlSZVN5bmNCZWFjb25UaW1lKHBBZCk7Ci0KLQotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBUU0ZfVElNRVJfRFcwLCAmdHNmVGltZV9hLnUuTG93UGFydCk7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBUU0ZfVElNRVJfRFcxLCAmdHNmVGltZV9hLnUuSGlnaFBhcnQpOwotCi0KLQkvL3Bvc2l0aXZlPWdldERlbHRhVGltZSh0c2ZUaW1lX2EsIGV4cGVjdGVkVGltZSwgJmRlbHRhVGltZV9leHApOwotCXJlbWFpbl9oaWdoID0gcEFkLT5Db21tb25DZmcuQmVhY29uUmVtYWluICogdHNmVGltZV9hLnUuSGlnaFBhcnQ7Ci0JcmVtYWluX2xvdyA9IHRzZlRpbWVfYS51Lkxvd1BhcnQgJSAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDEwKTsKLQlyZW1haW4gPSAocmVtYWluX2hpZ2ggKyByZW1haW5fbG93KSUocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDEwKTsKLQlkZWx0YSA9IChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApIC0gcmVtYWluOwotCi0JcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIuVGltZXJWYWx1ZSA9IChkZWx0YSA+PiAxMCkgKyAxMDsKLQotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL0tjb25maWcKaW5kZXggYWVhNWM4Mi4uZmQzYmEzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvS2NvbmZpZwpAQCAtMSw1ICsxLDcgQEAKIGNvbmZpZyBSVDI4NzAKIAl0cmlzdGF0ZSAiUmFsaW5rIDI4NzAvMzA3MCB3aXJlbGVzcyBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCICYmIFg4NiAmJiBXTEFOCisJc2VsZWN0IFdJUkVMRVNTX0VYVAorCXNlbGVjdCBXRVhUX1BSSVYKIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBkcml2ZXIgZm9yIHRoZSBSYWxpbmsgeHg3MCB3aXJlbGVzcyBjaGlwcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL01ha2VmaWxlCmluZGV4IDMwNmMzMzEuLjUyM2U3ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9NYWtlZmlsZQpAQCAtMSwyNyArMSwzNSBAQAorIwogb2JqLSQoQ09ORklHX1JUMjg3MCkJKz0gcnQyODcwc3RhLm8KIAogIyBUT0RPOiBhbGwgb2YgdGhlc2Ugc2hvdWxkIGJlIHJlbW92ZWQKIEVYVFJBX0NGTEFHUyArPSAtRExJTlVYIC1EQUdHUkVHQVRJT05fU1VQUE9SVCAtRFBJR0dZQkFDS19TVVBQT1JUIC1EV01NX1NVUFBPUlQKLUVYVFJBX0NGTEFHUyArPSAtRFJUMjg3MCAtRFJUMzA3MAorRVhUUkFfQ0ZMQUdTICs9IC1EUlRNUF9NQUNfVVNCIC1EUlRNUF9VU0JfU1VQUE9SVCAtRFJUMjg3MCAtRFJUTVBfVElNRVJfVEFTS19TVVBQT1JUCitFWFRSQV9DRkxBR1MgKz0gLURSVE1QX1JGX1JXX1NVUFBPUlQgLURSVE1QX0VGVVNFX1NVUFBPUlQgLURSVDMweHggLURSVDMwNzAKIEVYVFJBX0NGTEFHUyArPSAtRERCRwogCiBydDI4NzBzdGEtb2JqcyA6PQkJXAotCWNvbW1vbi9tZDUubwkJXAorCWNvbW1vbi9jcnlwdF9tZDUubwlcCisJY29tbW9uL2NyeXB0X3NoYTIubwlcCisJY29tbW9uL2NyeXB0X2htYWMubwlcCiAJY29tbW9uL21sbWUubwkJXAotCWNvbW1vbi9ydG1wX3dlcC5vCVwKKwljb21tb24vY21tX3dlcC5vCVwKIAljb21tb24vYWN0aW9uLm8JCVwKIAljb21tb24vY21tX2RhdGEubwlcCiAJY29tbW9uL3J0bXBfaW5pdC5vCVwKLQljb21tb24vcnRtcF90a2lwLm8JXAorCWNvbW1vbi9jbW1fdGtpcC5vCVwKKwljb21tb24vY21tX2Flcy5vCVwKIAljb21tb24vY21tX3N5bmMubwlcCiAJY29tbW9uL2VlcHJvbS5vCQlcCiAJY29tbW9uL2NtbV9zYW5pdHkubwlcCiAJY29tbW9uL2NtbV9pbmZvLm8JXAorCWNvbW1vbi9jbW1fY2ZnLm8JXAogCWNvbW1vbi9jbW1fd3BhLm8JXAogCWNvbW1vbi9kZnMubwkJXAogCWNvbW1vbi9zcGVjdHJ1bS5vCVwKKwljb21tb24vcnRtcF90aW1lci5vCVwKKwljb21tb24vcnRfY2hhbm5lbC5vCVwKKwljb21tb24vY21tX2FzaWMubwlcCiAJc3RhL2Fzc29jLm8JCVwKLQlzdGEvYWlyb25ldC5vCQlcCiAJc3RhL2F1dGgubwkJXAogCXN0YS9hdXRoX3JzcC5vCQlcCiAJc3RhL3N5bmMubwkJXApAQCAtMzAsMTQgKzM4LDE4IEBACiAJc3RhL2Nvbm5lY3QubwkJXAogCXN0YS93cGEubwkJXAogCXJ0X2xpbnV4Lm8JCVwKLQlydF9wcm9maWxlLm8JCVwKIAlydF9tYWluX2Rldi5vCQlcCiAJc3RhX2lvY3RsLm8JCVwKIAljb21tb24vYmFfYWN0aW9uLm8JXAotCTI4NzBfbWFpbl9kZXYubwkJXAotCWNvbW1vbi8yODcwX3J0bXBfaW5pdC5vCVwKKwl1c2JfbWFpbl9kZXYubwkJXAorCXJ0X3VzYi5vCQlcCisJY29tbW9uL2NtbV9tYWNfdXNiLm8JXAogCWNvbW1vbi9ydHVzYl9pby5vCVwKIAljb21tb24vcnR1c2JfYnVsay5vCVwKIAljb21tb24vcnR1c2JfZGF0YS5vCVwKLQljb21tb24vY21tX2RhdGFfMjg3MC5vCi0KKwljb21tb24vY21tX2RhdGFfdXNiLm8JXAorCWNvbW1vbi9ydG1wX21jdS5vCVwKKwljb21tb24vZWVfZWZ1c2UubwlcCisJY2hpcHMvcnQzMHh4Lm8JCVwKKwljb21tb24vcnRfcmYubwkJXAorCWNoaXBzL3J0MzA3MC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NoaXBzL3J0MzA3MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jaGlwcy9ydDMwNzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTZkYjVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jaGlwcy9ydDMwNzAuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NoaXBzL3J0MzA3MC5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jaGlwcy9ydDMweHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY2hpcHMvcnQzMHh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1NmI4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY2hpcHMvcnQzMHh4LmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3J0Mjg2MC9jaGlwcy9ydDMweHguYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uLzI4NzBfcnRtcF9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi8yODcwX3J0bXBfaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTE3ZDllLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uLzI4NzBfcnRtcF9pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMwICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JMjg3MF9ydG1wX2luaXQuYwotCi0JQWJzdHJhY3Q6Ci0JTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVBhdWwgTGluICAgIDIwMDItMDgtMDEgICAgY3JlYXRlZAotICAgIEpvaG4gQ2hhbmcgIDIwMDQtMDgtMjAgICAgUlQyNTYxLzI2NjEgdXNlIHNjYXR0ZXItZ2F0aGVyIHNjaGVtZQotICAgIEphbiBMZWUgIAkyMDA2LTA5LTE1ICAgIFJUMjg2MC4gQ2hhbmdlIGZvciA4MDIuMTFuICwgRUVQUk9NLCBMZWQsIEJBLCBIVC4KLQlTYW1wbGUgTGluCTIwMDctMDUtMzEgICAgTWVyZ2UgUlQyODYwIGFuZCBSVDI4NzAgZHJpdmVycy4KLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi1zdGF0aWMgdm9pZCByeF9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIHJ0Mjg3MF9oY2NhX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIHJ0Mjg3MF9hYzNfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgcnQyODcwX2FjMl9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBydDI4NzBfYWMxX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIHJ0Mjg3MF9hYzBfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgcnQyODcwX21nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgcnQyODcwX251bGxfZnJhbWVfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgcnQyODcwX3J0c19mcmFtZV9jb21wbGV0ZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBydDI4NzBfcHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIHJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEluaXRpYWxpemUgcmVjZWl2ZSBkYXRhIHN0cnVjdHVyZXMuCi0KLUFyZ3VtZW50czoKLSAgICBwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5ESVNfU1RBVFVTX1NVQ0NFU1MKLQlORElTX1NUQVRVU19SRVNPVVJDRVMKLQotTm90ZToKLQlJbml0aWFsaXplIGFsbCByZWNlaXZlIHJlbGVhdGVkIHByaXZhdGUgYnVmZmVyLCBpbmNsdWRlIHRob3NlIGRlZmluZQotCWluIFJUTVBfQURBUFRFUiBzdHJ1Y3R1cmUgYW5kIGFsbCBwcml2YXRlIGRhdGEgc3RydWN0dXJlcy4gVGhlIG1haG9yCi0Jd29yayBpcyB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIGVhY2ggcGFja2V0IGFuZCBjaGFpbiBidWZmZXIgdG8KLQlORElTIHBhY2tldCBkZXNjcmlwdG9yLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMJTklDSW5pdFJlY3YoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JVUNIQVIJCQkJaTsKLQlORElTX1NUQVRVUwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JUE9TX0NPT0tJRQkJCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0UmVjdlxuIikpOwotCXBPYmogPSBwT2JqOwotCi0JLy9JbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPlBlbmRpbmdSeCwgMCk7Ci0JcEFkLT5QZW5kaW5nUnggPSAwOwotCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4IAk9IDA7CS8vIE5leHQgUnggUmVhZCBpbmRleAotCXBBZC0+TmV4dFJ4QnVsa0luSW5kZXgJCT0gMCA7IC8vUlhfUklOR19TSVpFIC0xOyAvLyBSeCBCdWxrIHBvaW50ZXIKLQlwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uIAk9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKLQl7Ci0JCVBSWF9DT05URVhUICBwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7Ci0KLQkJLy9BbGxvY2F0ZSBVUkIKLQkJcFJ4Q29udGV4dC0+cFVyYiA9IFJUVVNCX0FMTE9DX1VSQigwKTsKLQkJaWYgKHBSeENvbnRleHQtPnBVcmIgPT0gTlVMTCkKLQkJewotCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwotCQkJZ290byBvdXQxOwotCQl9Ci0KLQkJLy8gQWxsb2NhdGUgdHJhbnNmZXIgYnVmZmVyCi0JCXBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gUlRVU0JfVVJCX0FMTE9DX0JVRkZFUihwT2JqLT5wVXNiX0RldiwgTUFYX1JYQlVMS19TSVpFLCAmcFJ4Q29udGV4dC0+ZGF0YV9kbWEpOwotCQlpZiAocFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPT0gTlVMTCkKLQkJewotCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwotCQkJZ290byBvdXQxOwotCQl9Ci0KLQkJTmRpc1plcm9NZW1vcnkocFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXIsIE1BWF9SWEJVTEtfU0laRSk7Ci0KLQkJcFJ4Q29udGV4dC0+cEFkCT0gcEFkOwotCQlwUnhDb250ZXh0LT5wSXJwID0gTlVMTDsKLQkJcFJ4Q29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7Ci0JCXBSeENvbnRleHQtPklSUFBlbmRpbmcJPSBGQUxTRTsKLQkJcFJ4Q29udGV4dC0+UmVhZGFibGUJPSBGQUxTRTsKLQkJLy9wUnhDb250ZXh0LT5SZW9yZGVySW5Vc2UgPSBGQUxTRTsKLQkJcFJ4Q29udGV4dC0+YlJ4SGFuZGxpbmcgPSBGQUxTRTsKLQkJcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0ID0gMDsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdFJlY3ZcbiIpKTsKLQlyZXR1cm4gU3RhdHVzOwotCi1vdXQxOgotCWZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQotCXsKLQkJUFJYX0NPTlRFWFQgIHBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKLQotCQlpZiAoTlVMTCAhPSBwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlcikKLQkJewotCQkJUlRVU0JfVVJCX0ZSRUVfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBNQVhfUlhCVUxLX1NJWkUsCi0JCQkJCQkJCXBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLCBwUnhDb250ZXh0LT5kYXRhX2RtYSk7Ci0JCQlwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IE5VTEw7Ci0JCX0KLQotCQlpZiAoTlVMTCAhPSBwUnhDb250ZXh0LT5wVXJiKQotCQl7Ci0JCQlSVFVTQl9VTkxJTktfVVJCKHBSeENvbnRleHQtPnBVcmIpOwotCQkJUlRVU0JfRlJFRV9VUkIocFJ4Q29udGV4dC0+cFVyYik7Ci0JCQlwUnhDb250ZXh0LT5wVXJiID0gTlVMTDsKLQkJfQotCX0KLQotCXJldHVybiBTdGF0dXM7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBJbml0aWFsaXplIHRyYW5zbWl0IGRhdGEgc3RydWN0dXJlcy4KLQotQXJndW1lbnRzOgotICAgIHBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi1SZXR1cm4gVmFsdWU6Ci0JTkRJU19TVEFUVVNfU1VDQ0VTUwotCU5ESVNfU1RBVFVTX1JFU09VUkNFUwotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMJTklDSW5pdFRyYW5zbWl0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotI2RlZmluZSBMTV9VU0JfQUxMT0MocE9iaiwgQ29udGV4dCwgVEJfVHlwZSwgQnVmZmVyU2l6ZSwgU3RhdHVzLCBtc2cxLCBlcnIxLCBtc2cyLCBlcnIyKQlcCi0JQ29udGV4dC0+cFVyYiA9IFJUVVNCX0FMTE9DX1VSQigwKTsJCVwKLQlpZiAoQ29udGV4dC0+cFVyYiA9PSBOVUxMKSB7CQkJXAotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgbXNnMSk7CQlcCi0JCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsJCVwKLQkJZ290byBlcnIxOyB9CQkJCQkJXAotCQkJCQkJCQkJCQlcCi0JQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSAJCQkJXAotCQkoVEJfVHlwZSlSVFVTQl9VUkJfQUxMT0NfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBCdWZmZXJTaXplLCAmQ29udGV4dC0+ZGF0YV9kbWEpOwlcCi0JaWYgKENvbnRleHQtPlRyYW5zZmVyQnVmZmVyID09IE5VTEwpIHsJXAotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgbXNnMik7CQlcCi0JCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsJCVwKLQkJZ290byBlcnIyOyB9Ci0KLSNkZWZpbmUgTE1fVVJCX0ZSRUUocE9iaiwgQ29udGV4dCwgQnVmZmVyU2l6ZSkJCQkJXAotCWlmIChOVUxMICE9IENvbnRleHQtPnBVcmIpIHsJCQkJCQkJXAotCQlSVFVTQl9VTkxJTktfVVJCKENvbnRleHQtPnBVcmIpOwkJCQkJXAotCQlSVFVTQl9GUkVFX1VSQihDb250ZXh0LT5wVXJiKTsJCQkJCQlcCi0JCUNvbnRleHQtPnBVcmIgPSBOVUxMOyB9CQkJCQkJCQlcCi0JaWYgKE5VTEwgIT0gQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIpIHsJCQkJXAotCQlSVFVTQl9VUkJfRlJFRV9CVUZGRVIocE9iai0+cFVzYl9EZXYsIEJ1ZmZlclNpemUsCVwKLQkJCQkJCQkJQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIsCVwKLQkJCQkJCQkJQ29udGV4dC0+ZGF0YV9kbWEpOwkJCVwKLQkJQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSBOVUxMOyB9Ci0KLQlVQ0hBUgkJCWksIGFjaWR4OwotCU5ESVNfU1RBVFVTICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCVBUWF9DT05URVhUCQlwTnVsbENvbnRleHQgICA9ICYocEFkLT5OdWxsQ29udGV4dCk7Ci0JUFRYX0NPTlRFWFQJCXBQc1BvbGxDb250ZXh0ID0gJihwQWQtPlBzUG9sbENvbnRleHQpOwotCVBUWF9DT05URVhUCQlwUlRTQ29udGV4dCAgICA9ICYocEFkLT5SVFNDb250ZXh0KTsKLQlQVFhfQ09OVEVYVAkJcE1MTUVDb250ZXh0ID0gTlVMTDsKLS8vCVBIVF9UWF9DT05URVhUCXBIVFRYQ29udGV4dCA9IE5VTEw7Ci0JUE9TX0NPT0tJRQkJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQlQVk9JRAkJCVJpbmdCYXNlVmE7Ci0vLwlSVE1QX1RYX1JJTkcJKnBUeFJpbmc7Ci0JUlRNUF9NR01UX1JJTkcgICpwTWdtdFJpbmc7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdFRyYW5zbWl0XG4iKSk7Ci0JcE9iaiA9IHBPYmo7Ci0KLQkvLyBJbml0IDQgc2V0IG9mIFR4IHBhcmFtZXRlcnMKLQlmb3IoYWNpZHggPSAwOyBhY2lkeCA8IE5VTV9PRl9UWF9SSU5HOyBhY2lkeCsrKQotCXsKLQkJLy8gSW5pdGlhbGl6ZSBhbGwgVHJhbnNtaXQgcmVsZWF0ZWQgcXVldWVzCi0JCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEFkLT5UeFN3UXVldWVbYWNpZHhdKTsKLQotCQkvLyBOZXh0IExvY2FsIHR4IHJpbmcgcG9pbnRlciB3YWl0aW5nIGZvciBidWNrIG91dAotCQlwQWQtPk5leHRCdWxrT3V0SW5kZXhbYWNpZHhdID0gYWNpZHg7Ci0JCXBBZC0+QnVsa091dFBlbmRpbmdbYWNpZHhdID0gRkFMU0U7IC8vIEJ1Y2sgT3V0IGNvbnRyb2wgZmxhZwotCQkvL3BBZC0+RGF0YUJ1bGtEb25lSWR4W2FjaWR4XSA9IDA7Ci0JfQotCi0JLy9wQWQtPk5leHRNTE1FSW5kZXgJPSAwOwotCS8vcEFkLT5QdXNoTWdtdEluZGV4CT0gMDsKLQkvL3BBZC0+UG9wTWdtdEluZGV4CT0gMDsKLQkvL0ludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+TWdtdFF1ZXVlU2l6ZSwgMCk7Ci0JLy9JbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPlR4Q291bnQsIDApOwotCi0JLy9wQWQtPlByaW9SaW5nRmlyc3RJbmRleAk9IDA7Ci0JLy9wQWQtPlByaW9SaW5nVHhDbnQJCT0gMDsKLQotCWRvCi0JewotCQkvLwotCQkvLyBUWF9SSU5HX1NJWkUsIDQgQUNzCi0JCS8vCi0JCWZvcihhY2lkeD0wOyBhY2lkeDw0OyBhY2lkeCsrKQotCQl7Ci0JCQlQSFRfVFhfQ09OVEVYVAlwSFRUWENvbnRleHQgPSAmKHBBZC0+VHhDb250ZXh0W2FjaWR4XSk7Ci0KLQkJCU5kaXNaZXJvTWVtb3J5KHBIVFRYQ29udGV4dCwgc2l6ZW9mKEhUX1RYX0NPTlRFWFQpKTsKLQkJCS8vQWxsb2NhdGUgVVJCCi0JCQlMTV9VU0JfQUxMT0MocE9iaiwgcEhUVFhDb250ZXh0LCBQSFRUWF9CVUZGRVIsIHNpemVvZihIVFRYX0JVRkZFUiksIFN0YXR1cywKLQkJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBUeENvbnRleHRbJWRdIHVyYiEhIFxuIiwgYWNpZHgpLAotCQkJCQkJCWRvbmUsCi0JCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggVHhDb250ZXh0WyVkXSBIVFRYX0JVRkZFUiAhISBcbiIsIGFjaWR4KSwKLQkJCQkJCQlvdXQxKTsKLQotCQkJTmRpc1plcm9NZW1vcnkocEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+QWdncmVnYXRpb24sIDQpOwotCQkJcEhUVFhDb250ZXh0LT5wQWQgPSBwQWQ7Ci0JCQlwSFRUWENvbnRleHQtPnBJcnAgPSBOVUxMOwotCQkJcEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7Ci0JCQlwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPSAwOwotCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9IDA7Ci0JCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSAwOwotCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPSAwOwotCQkJcEhUVFhDb250ZXh0LT5CdWxrT3V0U2l6ZSA9IDA7Ci0JCQlwSFRUWENvbnRleHQtPkJ1bGtPdXRQaXBlSWQgPSBhY2lkeDsKLQkJCXBIVFRYQ29udGV4dC0+YlJpbmdFbXB0eSA9IFRSVUU7Ci0JCQlwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCA9IEZBTFNFOwotCi0JCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW2FjaWR4XSA9IEZBTFNFOwotCQl9Ci0KLQotCQkvLwotCQkvLyBNR01UX1JJTkdfU0laRQotCQkvLwotCQkvLyBBbGxvY2F0ZSBNR01UIHJpbmcgZGVzY3JpcHRvcidzIG1lbW9yeQotCQlwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUgPSBNR01UX1JJTkdfU0laRSAqIHNpemVvZihUWF9DT05URVhUKTsKLQkJUlRNUEFsbG9jYXRlTWVtb3J5KCZwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhLCBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUpOwotCQlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSA9PSBOVUxMKQotCQl7Ci0JCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyIGZvciBNZ210RGVzY1JpbmchXG4iKSk7Ci0JCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0JCQlnb3RvIG91dDE7Ci0JCX0KLQkJTmRpc1plcm9NZW1vcnkocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplKTsKLQkJUmluZ0Jhc2VWYSAgICAgPSBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhOwotCi0JCS8vIEluaXRpYWxpemUgTUdNVCBSaW5nIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlciBtZW1vcnkKLQkJcE1nbXRSaW5nID0gJnBBZC0+TWdtdFJpbmc7Ci0JCWZvciAoaSA9IDA7IGkgPCBNR01UX1JJTkdfU0laRTsgaSsrKQotCQl7Ci0JCQkvLyBsaW5rIHRoZSBwcmUtYWxsb2NhdGVkIE1nbXQgYnVmZmVyIHRvIE1nbXRSaW5nLkNlbGwKLQkJCXBNZ210UmluZy0+Q2VsbFtpXS5BbGxvY1NpemUgPSBzaXplb2YoVFhfQ09OVEVYVCk7Ci0JCQlwTWdtdFJpbmctPkNlbGxbaV0uQWxsb2NWYSA9IFJpbmdCYXNlVmE7Ci0JCQlwTWdtdFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCQkJcE1nbXRSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJCS8vQWxsb2NhdGUgVVJCIGZvciBNTE1FQ29udGV4dAotCQkJcE1MTUVDb250ZXh0ID0gKFBUWF9DT05URVhUKSBwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKLQkJCXBNTE1FQ29udGV4dC0+cFVyYiA9IFJUVVNCX0FMTE9DX1VSQigwKTsKLQkJCWlmIChwTUxNRUNvbnRleHQtPnBVcmIgPT0gTlVMTCkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggTUxNRUNvbnRleHRbJWRdIHVyYiEhIFxuIiwgaSkpOwotCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLQkJCQlnb3RvIG91dDI7Ci0JCQl9Ci0JCQlwTUxNRUNvbnRleHQtPnBBZCA9IHBBZDsKLQkJCXBNTE1FQ29udGV4dC0+cElycCA9IE5VTEw7Ci0JCQlwTUxNRUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gTlVMTDsKLQkJCXBNTE1FQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKLQkJCXBNTE1FQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOwotCQkJcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBGQUxTRTsKLQkJCXBNTE1FQ29udGV4dC0+QnVsa091dFNpemUgPSAwOwotCQkJcE1MTUVDb250ZXh0LT5TZWxmSWR4ID0gaTsKLQotCQkJLy8gT2Zmc2V0IHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MKLQkJCVJpbmdCYXNlVmEgPSAoUFVDSEFSKSBSaW5nQmFzZVZhICsgc2l6ZW9mKFRYX0NPTlRFWFQpOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1HTVQgUmluZzogdG90YWwgJWQgZW50cnkgYWxsb2NhdGVkXG4iLCBpKSk7Ci0KLQkJLy9wQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gKE1HTVRfUklOR19TSVpFIC0gMSk7Ci0JCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPSBNR01UX1JJTkdfU0laRTsKLQkJcEFkLT5NZ210UmluZy5UeENwdUlkeCA9IDA7Ci0JCXBBZC0+TWdtdFJpbmcuVHhEbWFJZHggPSAwOwotCi0JCS8vCi0JCS8vIEJFQUNPTl9SSU5HX1NJWkUKLQkJLy8KLQkJZm9yKGk9MDsgaTxCRUFDT05fUklOR19TSVpFOyBpKyspIC8vIDIKLQkJewotCQkJUFRYX0NPTlRFWFQJcEJlYWNvbkNvbnRleHQgPSAmKHBBZC0+QmVhY29uQ29udGV4dFtpXSk7Ci0KLQotCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvbkNvbnRleHQsIHNpemVvZihUWF9DT05URVhUKSk7Ci0KLQkJCS8vQWxsb2NhdGUgVVJCCi0JCQlMTV9VU0JfQUxMT0MocE9iaiwgcEJlYWNvbkNvbnRleHQsIFBUWF9CVUZGRVIsIHNpemVvZihUWF9CVUZGRVIpLCBTdGF0dXMsCi0JCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggQmVhY29uQ29udGV4dFslZF0gdXJiISEgXG4iLCBpKSwKLQkJCQkJCQlvdXQyLAotCQkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIEJlYWNvbkNvbnRleHRbJWRdIFRYX0JVRkZFUiAhISBcbiIsIGkpLAotCQkJCQkJCW91dDMpOwotCi0JCQlwQmVhY29uQ29udGV4dC0+cEFkID0gcEFkOwotCQkJcEJlYWNvbkNvbnRleHQtPnBJcnAgPSBOVUxMOwotCQkJcEJlYWNvbkNvbnRleHQtPkluVXNlID0gRkFMU0U7Ci0JCQlwQmVhY29uQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOwotCQl9Ci0KLQkJLy8KLQkJLy8gTnVsbENvbnRleHQKLQkJLy8KLQkJTmRpc1plcm9NZW1vcnkocE51bGxDb250ZXh0LCBzaXplb2YoVFhfQ09OVEVYVCkpOwotCi0JCS8vQWxsb2NhdGUgVVJCCi0JCUxNX1VTQl9BTExPQyhwT2JqLCBwTnVsbENvbnRleHQsIFBUWF9CVUZGRVIsIHNpemVvZihUWF9CVUZGRVIpLCBTdGF0dXMsCi0JCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBOdWxsQ29udGV4dCB1cmIhISBcbiIpLAotCQkJCQkJb3V0MywKLQkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIE51bGxDb250ZXh0IFRYX0JVRkZFUiAhISBcbiIpLAotCQkJCQkJb3V0NCk7Ci0KLQkJcE51bGxDb250ZXh0LT5wQWQgPSBwQWQ7Ci0JCXBOdWxsQ29udGV4dC0+cElycCA9IE5VTEw7Ci0JCXBOdWxsQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKLQkJcE51bGxDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7Ci0KLQkJLy8KLQkJLy8gUlRTQ29udGV4dAotCQkvLwotCQlOZGlzWmVyb01lbW9yeShwUlRTQ29udGV4dCwgc2l6ZW9mKFRYX0NPTlRFWFQpKTsKLQotCQkvL0FsbG9jYXRlIFVSQgotCQlMTV9VU0JfQUxMT0MocE9iaiwgcFJUU0NvbnRleHQsIFBUWF9CVUZGRVIsIHNpemVvZihUWF9CVUZGRVIpLCBTdGF0dXMsCi0JCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBSVFNDb250ZXh0IHVyYiEhIFxuIiksCi0JCQkJCQlvdXQ0LAotCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggUlRTQ29udGV4dCBUWF9CVUZGRVIgISEgXG4iKSwKLQkJCQkJCW91dDUpOwotCi0JCXBSVFNDb250ZXh0LT5wQWQgPSBwQWQ7Ci0JCXBSVFNDb250ZXh0LT5wSXJwID0gTlVMTDsKLQkJcFJUU0NvbnRleHQtPkluVXNlID0gRkFMU0U7Ci0JCXBSVFNDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7Ci0KLQkJLy8KLQkJLy8gUHNQb2xsQ29udGV4dAotCQkvLwotCQkvL05kaXNaZXJvTWVtb3J5KHBQc1BvbGxDb250ZXh0LCBzaXplb2YoVFhfQ09OVEVYVCkpOwotCQkvL0FsbG9jYXRlIFVSQgotCQlMTV9VU0JfQUxMT0MocE9iaiwgcFBzUG9sbENvbnRleHQsIFBUWF9CVUZGRVIsIHNpemVvZihUWF9CVUZGRVIpLCBTdGF0dXMsCi0JCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBQc1BvbGxDb250ZXh0IHVyYiEhIFxuIiksCi0JCQkJCQlvdXQ1LAotCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggUHNQb2xsQ29udGV4dCBUWF9CVUZGRVIgISEgXG4iKSwKLQkJCQkJCW91dDYpOwotCi0JCXBQc1BvbGxDb250ZXh0LT5wQWQgPSBwQWQ7Ci0JCXBQc1BvbGxDb250ZXh0LT5wSXJwID0gTlVMTDsKLQkJcFBzUG9sbENvbnRleHQtPkluVXNlID0gRkFMU0U7Ci0JCXBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7Ci0JCXBQc1BvbGxDb250ZXh0LT5iQWdncmVnYXRpYmxlID0gRkFMU0U7Ci0JCXBQc1BvbGxDb250ZXh0LT5MYXN0T25lID0gVFJVRTsKLQotCX0gICB3aGlsZSAoRkFMU0UpOwotCi0KLWRvbmU6Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ0luaXRUcmFuc21pdFxuIikpOwotCi0JcmV0dXJuIFN0YXR1czsKLQotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFUlJPUiBIQU5ETEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1vdXQ2OgotCUxNX1VSQl9GUkVFKHBPYmosIHBQc1BvbGxDb250ZXh0LCBzaXplb2YoVFhfQlVGRkVSKSk7Ci0KLW91dDU6Ci0JTE1fVVJCX0ZSRUUocE9iaiwgcFJUU0NvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKLQotb3V0NDoKLQlMTV9VUkJfRlJFRShwT2JqLCBwTnVsbENvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKLQotb3V0MzoKLQlmb3IoaT0wOyBpPEJFQUNPTl9SSU5HX1NJWkU7IGkrKykKLQl7Ci0JCVBUWF9DT05URVhUCXBCZWFjb25Db250ZXh0ID0gJihwQWQtPkJlYWNvbkNvbnRleHRbaV0pOwotCQlpZiAocEJlYWNvbkNvbnRleHQpCi0JCQlMTV9VUkJfRlJFRShwT2JqLCBwQmVhY29uQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOwotCX0KLQotb3V0MjoKLQlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSkKLQl7Ci0JCXBNZ210UmluZyA9ICZwQWQtPk1nbXRSaW5nOwotCWZvcihpPTA7IGk8TUdNVF9SSU5HX1NJWkU7IGkrKykKLQl7Ci0JCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVCkgcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7Ci0JCWlmIChwTUxNRUNvbnRleHQpCi0JCQlMTV9VUkJfRlJFRShwT2JqLCBwTUxNRUNvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKLQl9Ci0JCU5kaXNGcmVlTWVtb3J5KHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSwgMCk7Ci0JCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEgPSBOVUxMOwotCX0KLQotb3V0MToKLQlmb3IgKGFjaWR4ID0gMDsgYWNpZHggPCA0OyBhY2lkeCsrKQotCXsKLQkJUEhUX1RYX0NPTlRFWFQgcFR4Q29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbYWNpZHhdKTsKLQkJaWYgKHBUeENvbnRleHQpCi0JCQlMTV9VUkJfRlJFRShwT2JqLCBwVHhDb250ZXh0LCBzaXplb2YoSFRUWF9CVUZGRVIpKTsKLQl9Ci0KLQkvLyBIZXJlIHdlIGRpZG4ndCBoYXZlIGFueSBwcmUtYWxsb2NhdGVkIG1lbW9yeSBuZWVkIHRvIGZyZWUuCi0KLQlyZXR1cm4gU3RhdHVzOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgQWxsb2NhdGUgRE1BIG1lbW9yeSBibG9ja3MgZm9yIHNlbmQsIHJlY2VpdmUuCi0KLUFyZ3VtZW50czoKLSAgICBwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5ESVNfU1RBVFVTX1NVQ0NFU1MKLQlORElTX1NUQVRVU19GQUlMVVJFCi0JTkRJU19TVEFUVVNfUkVTT1VSQ0VTCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUwlSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLS8vCUNPVU5URVJfODAyXzExCXBDb3VudGVyID0gJnBBZC0+V2xhbkNvdW50ZXJzOwotCU5ESVNfU1RBVFVTCQlTdGF0dXM7Ci0JSU5UCQkJCW51bTsKLQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5XG4iKSk7Ci0KLQotCWRvCi0JewotCQkvLyBJbml0IHRoZSBDbWRRIGFuZCBDbWRRTG9jawotCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7Ci0JCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOwotCQlSVFVTQkluaXRpYWxpemVDbWRRKCZwQWQtPkNtZFEpOwotCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKLQotCi0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1MTUVCdWxrT3V0TG9jayk7Ci0JCS8vTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TUxNRVdhaXRRdWV1ZUxvY2spOwotCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1swXSk7Ci0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzFdKTsKLQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbMl0pOwotCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1szXSk7Ci0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzRdKTsKLQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbNV0pOwotCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrSW5Mb2NrKTsKLQotCQlmb3IgKG51bSA9IDA7IG51bSA8IE5VTV9PRl9UWF9SSU5HOyBudW0rKykKLQkJewotCQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW251bV0pOwotCQl9Ci0KLS8vCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NZW1Mb2NrKTsJLy8gTm90IHVzZWQgaW4gUlQyOFhYCi0KLS8vCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsgLy8gaW5pdCBpdCBpbiBVc2VyQ2ZnSW5pdCgpCi0vLwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsgLy8gaW5pdCBpdCBpbiBCQVRhYmxlSW5pdCgpCi0KLS8vCQlmb3IobnVtPTA7IG51bTxNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgbnVtKyspCi0vLwkJewotLy8JCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbbnVtXS5SeFJlUmluZ0xvY2spOwotLy8JCX0KLQotCQkvLwotCQkvLyBJbml0IE1hYyBUYWJsZQotCQkvLwotLy8JCU1hY1RhYmxlSW5pdGlhbGl6ZShwQWQpOwotCi0JCS8vCi0JCS8vIEluaXQgc2VuZCBkYXRhIHN0cnVjdHVyZXMgYW5kIHJlbGF0ZWQgcGFyYW1ldGVycwotCQkvLwotCQlTdGF0dXMgPSBOSUNJbml0VHJhbnNtaXQocEFkKTsKLQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJYnJlYWs7Ci0KLQkJLy8KLQkJLy8gSW5pdCByZWNlaXZlIGRhdGEgc3RydWN0dXJlcyBhbmQgcmVsYXRlZCBwYXJhbWV0ZXJzCi0JCS8vCi0JCVN0YXR1cyA9IE5JQ0luaXRSZWN2KHBBZCk7Ci0JCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCWJyZWFrOwotCi0JCXBBZC0+UGVuZGluZ0lvQ291bnQgPSAxOwotCi0JfSB3aGlsZSAoRkFMU0UpOwotCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+RnJhZ0ZyYW1lLCBzaXplb2YoRlJBR01FTlRfRlJBTUUpKTsKLQlwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9ICBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9OT1JNU0laRSk7Ci0KLQlpZiAocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPT0gTlVMTCkKLQl7Ci0JCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLQl9Ci0KLQlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnksIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7Ci0JcmV0dXJuIFN0YXR1czsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotCUNhbGxzIFVTQl9JbnRlcmZhY2VTdG9wIGFuZCBmcmVlcyBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgVVJCcwotICAgIGNhbGxzIE5kaXNNRGVyZWdpc3RlckRldmljZSBhbmQgZnJlZXMgdGhlIG1lbW9yeQotICAgIGFsbG9jYXRlZCBpbiBWTmV0SW5pdGlhbGl6ZSBmb3IgdGhlIEFkYXB0ZXIgT2JqZWN0Ci0KLUFyZ3VtZW50czoKLQkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLSNkZWZpbmUgTE1fVVJCX0ZSRUUocE9iaiwgQ29udGV4dCwgQnVmZmVyU2l6ZSkJCQkJXAotCWlmIChOVUxMICE9IENvbnRleHQtPnBVcmIpIHsJCQkJCQkJXAotCQlSVFVTQl9VTkxJTktfVVJCKENvbnRleHQtPnBVcmIpOwkJCQkJXAotCQlSVFVTQl9GUkVFX1VSQihDb250ZXh0LT5wVXJiKTsJCQkJCQlcCi0JCUNvbnRleHQtPnBVcmIgPSBOVUxMOyB9CQkJCQkJCQlcCi0JaWYgKE5VTEwgIT0gQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIpIHsJCQkJCVwKLQkJUlRVU0JfVVJCX0ZSRUVfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBCdWZmZXJTaXplLAlcCi0JCQkJCQkJCUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyLAlcCi0JCQkJCQkJCUNvbnRleHQtPmRhdGFfZG1hKTsJCQlcCi0JCUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gTlVMTDsgfQotCi0KLQlVSU5UICAgICAgICAgICAgICAgIGksIGFjaWR4OwotCVBUWF9DT05URVhUCQkJcE51bGxDb250ZXh0ICAgPSAmcEFkLT5OdWxsQ29udGV4dDsKLQlQVFhfQ09OVEVYVAkJCXBQc1BvbGxDb250ZXh0ID0gJnBBZC0+UHNQb2xsQ29udGV4dDsKLQlQVFhfQ09OVEVYVAkJCXBSVFNDb250ZXh0ICAgID0gJnBBZC0+UlRTQ29udGV4dDsKLS8vCVBIVF9UWF9DT05URVhUIAkJcEhUVFhDb250ZXh0OwotCS8vUFJUTVBfUkVPUkRFUkJVRglwUmVvcmRlckJ1ZjsKLQlQT1NfQ09PS0lFCQkJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLS8vCVJUTVBfVFhfUklORwkJKnBUeFJpbmc7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLS0+IFJUTVBGcmVlVHhSeFJpbmdNZW1vcnlcbiIpKTsKLQlwT2JqID0gcE9iajsKLQotCS8vIEZyZWUgYWxsIHJlc291cmNlcyBmb3IgdGhlIFJFQ0VJVkUgYnVmZmVyIHF1ZXVlLgotCWZvcihpPTA7IGk8KFJYX1JJTkdfU0laRSk7IGkrKykKLQl7Ci0JCVBSWF9DT05URVhUICBwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7Ci0JCWlmIChwUnhDb250ZXh0KQotCQkJTE1fVVJCX0ZSRUUocE9iaiwgcFJ4Q29udGV4dCwgTUFYX1JYQlVMS19TSVpFKTsKLQl9Ci0KLQkvLyBGcmVlIFBzUG9sbCBmcmFtZSByZXNvdXJjZQotCUxNX1VSQl9GUkVFKHBPYmosIHBQc1BvbGxDb250ZXh0LCBzaXplb2YoVFhfQlVGRkVSKSk7Ci0KLQkvLyBGcmVlIE5VTEwgZnJhbWUgcmVzb3VyY2UKLQlMTV9VUkJfRlJFRShwT2JqLCBwTnVsbENvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKLQotCS8vIEZyZWUgUlRTIGZyYW1lIHJlc291cmNlCi0JTE1fVVJCX0ZSRUUocE9iaiwgcFJUU0NvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKLQotCi0JLy8gRnJlZSBiZWFjb24gZnJhbWUgcmVzb3VyY2UKLQlmb3IoaT0wOyBpPEJFQUNPTl9SSU5HX1NJWkU7IGkrKykKLQl7Ci0JCVBUWF9DT05URVhUCXBCZWFjb25Db250ZXh0ID0gJihwQWQtPkJlYWNvbkNvbnRleHRbaV0pOwotCQlpZiAocEJlYWNvbkNvbnRleHQpCi0JCQlMTV9VUkJfRlJFRShwT2JqLCBwQmVhY29uQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOwotCX0KLQotCi0JLy8gRnJlZSBtZ210IGZyYW1lIHJlc291cmNlCi0JZm9yKGkgPSAwOyBpIDwgTUdNVF9SSU5HX1NJWkU7IGkrKykKLQl7Ci0JCVBUWF9DT05URVhUIHBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVClwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKLQkJLy9MTV9VUkJfRlJFRShwT2JqLCBwTUxNRUNvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKLQkJaWYgKE5VTEwgIT0gcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0KQotCQl7Ci0JCQlSVE1QRnJlZU5kaXNQYWNrZXQocEFkLCBwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5kaXNQYWNrZXQpOwotCQkJcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKLQkJCXBNTE1FQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSBOVUxMOwotCQl9Ci0KLQkJaWYgKHBNTE1FQ29udGV4dCkKLQkJewotCQkJaWYgKE5VTEwgIT0gcE1MTUVDb250ZXh0LT5wVXJiKQotCQkJewotCQkJCVJUVVNCX1VOTElOS19VUkIocE1MTUVDb250ZXh0LT5wVXJiKTsKLQkJCQlSVFVTQl9GUkVFX1VSQihwTUxNRUNvbnRleHQtPnBVcmIpOwotCQkJCXBNTE1FQ29udGV4dC0+cFVyYiA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEpCi0JCU5kaXNGcmVlTWVtb3J5KHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSwgMCk7Ci0KLQotCS8vIEZyZWUgVHggZnJhbWUgcmVzb3VyY2UKLQkJZm9yKGFjaWR4PTA7IGFjaWR4PDQ7IGFjaWR4KyspCi0JCXsKLQkJUEhUX1RYX0NPTlRFWFQgcEhUVFhDb250ZXh0ID0gJihwQWQtPlR4Q29udGV4dFthY2lkeF0pOwotCQkJaWYgKHBIVFRYQ29udGV4dCkKLQkJCQlMTV9VUkJfRlJFRShwT2JqLCBwSFRUWENvbnRleHQsIHNpemVvZihIVFRYX0JVRkZFUikpOwotCQl9Ci0KLQlpZiAocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQpCi0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlmb3IoaT0wOyBpPDY7IGkrKykKLQl7Ci0JCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbaV0pOwotCX0KLQotCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+QnVsa0luTG9jayk7Ci0JTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NTE1FQnVsa091dExvY2spOwotCi0JTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7Ci0KLQkvLyBDbGVhciBhbGwgcGVuZGluZyBidWxrLW91dCByZXF1ZXN0IGZsYWdzLgotCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIDB4ZmZmZmZmZmYpOwotCi0vLwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCi0vLwlmb3IoaT0wOyBpPE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBpKyspCi0vLwl7Ci0vLwkJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbaV0uUnhSZVJpbmdMb2NrKTsKLS8vCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjwtLS0gUmVsZWFzZUFkYXB0ZXJcbiIpKTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWRhcHRlciBjb250cm9sIGJsb2NrLgotCi1Bcmd1bWVudHM6Ci0gICAgcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLVJldHVybiBWYWx1ZToKLQlORElTX1NUQVRVU19TVUNDRVNTCi0JTkRJU19TVEFUVVNfRkFJTFVSRQotCU5ESVNfU1RBVFVTX1JFU09VUkNFUwotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMgQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoCi0JSU4gUFZPSUQJaGFuZGxlLAotCU9VVAlQVk9JRAkqcHBBZCkKLXsKLQlQVVNCX0RFVgl1c2JfZGV2OwotCVBPU19DT09LSUUJcE9iaiA9IChQT1NfQ09PS0lFKSBoYW5kbGU7Ci0KLQotCXVzYl9kZXYgPSBwT2JqLT5wVXNiX0RldjsKLQotCXBPYmotPk1MTUVUaHJfcGlkCT0gTlVMTDsKLQlwT2JqLT5SVFVTQkNtZFRocl9waWQJPSBOVUxMOwotCi0JKnBwQWQgPSAoUFZPSUQpdm1hbGxvYyhzaXplb2YoUlRNUF9BREFQVEVSKSk7Ci0KLQlpZiAoKnBwQWQpCi0JewotCQlOZGlzWmVyb01lbW9yeSgqcHBBZCwgc2l6ZW9mKFJUTVBfQURBUFRFUikpOwotCQkoKFBSVE1QX0FEQVBURVIpKnBwQWQpLT5PU19Db29raWUgPSBoYW5kbGU7Ci0JCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JfQotCWVsc2UKLQl7Ci0JCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JfQotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgQ3JlYXRlIGtlcm5lbCB0aHJlYWRzICYgdGFza2xldHMuCi0KLUFyZ3VtZW50czoKLSAgICAqbmV0X2RldgkJCVBvaW50ZXIgdG8gd2lyZWxlc3MgbmV0IGRldmljZSBpbnRlcmZhY2UKLQotUmV0dXJuIFZhbHVlOgotCU5ESVNfU1RBVFVTX1NVQ0NFU1MKLQlORElTX1NUQVRVU19GQUlMVVJFCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUwkgQ3JlYXRlVGhyZWFkcygKLQlJTglzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKLXsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7Ci0JUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCXBpZF90IHBpZF9udW1iZXI7Ci0KLQkvL2luaXRfTVVURVgoJihwQWQtPnVzYmRldl9zZW1hcGhvcmUpKTsKLQotCWluaXRfTVVURVhfTE9DS0VEKCYocEFkLT5tbG1lX3NlbWFwaG9yZSkpOwotCWluaXRfY29tcGxldGlvbiAoJnBBZC0+bWxtZUNvbXBsZXRlKTsKLQotCWluaXRfTVVURVhfTE9DS0VEKCYocEFkLT5SVFVTQkNtZF9zZW1hcGhvcmUpKTsKLQlpbml0X2NvbXBsZXRpb24gKCZwQWQtPkNtZFFDb21wbGV0ZSk7Ci0KLQlpbml0X01VVEVYX0xPQ0tFRCgmKHBBZC0+UlRVU0JUaW1lcl9zZW1hcGhvcmUpKTsKLQlpbml0X2NvbXBsZXRpb24gKCZwQWQtPlRpbWVyUUNvbXBsZXRlKTsKLQotCS8vIENyZWF0IE1MTUUgVGhyZWFkCi0JcE9iai0+TUxNRVRocl9waWQgPSBOVUxMOwotCXBpZF9udW1iZXIgPSBrZXJuZWxfdGhyZWFkKE1sbWVUaHJlYWQsIHBBZCwgQ0xPTkVfVk0pOwotCWlmIChwaWRfbnVtYmVyIDwgMCkKLQl7Ci0JCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIHN0YXJ0IE1sbWUgdGhyZWFkXG4iLHBBZC0+bmV0X2Rldi0+bmFtZSk7Ci0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCXBPYmotPk1MTUVUaHJfcGlkID0gZmluZF9nZXRfcGlkKHBpZF9udW1iZXIpOwotCi0JLy8gV2FpdCBmb3IgdGhlIHRocmVhZCB0byBzdGFydAotCXdhaXRfZm9yX2NvbXBsZXRpb24oJihwQWQtPm1sbWVDb21wbGV0ZSkpOwotCi0JLy8gQ3JlYXQgQ29tbWFuZCBUaHJlYWQKLQlwT2JqLT5SVFVTQkNtZFRocl9waWQgPSBOVUxMOwotCXBpZF9udW1iZXIgPSBrZXJuZWxfdGhyZWFkKFJUVVNCQ21kVGhyZWFkLCBwQWQsIENMT05FX1ZNKTsKLQlpZiAocGlkX251bWJlciA8IDApCi0JewotCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBzdGFydCBSVFVTQkNtZCB0aHJlYWRcbiIscEFkLT5uZXRfZGV2LT5uYW1lKTsKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JcE9iai0+UlRVU0JDbWRUaHJfcGlkID0gZmluZF9nZXRfcGlkKHBpZF9udW1iZXIpOwotCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmKHBBZC0+Q21kUUNvbXBsZXRlKSk7Ci0KLQlwT2JqLT5UaW1lclFUaHJfcGlkID0gTlVMTDsKLQlwaWRfbnVtYmVyID0ga2VybmVsX3RocmVhZChUaW1lclFUaHJlYWQsIHBBZCwgQ0xPTkVfVk0pOwotCWlmIChwaWRfbnVtYmVyIDwgMCkKLQl7Ci0JCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIHN0YXJ0IFRpbWVyUVRocmVhZFxuIixwQWQtPm5ldF9kZXYtPm5hbWUpOwotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQlwT2JqLT5UaW1lclFUaHJfcGlkID0gZmluZF9nZXRfcGlkKHBpZF9udW1iZXIpOwotCi0JLy8gV2FpdCBmb3IgdGhlIHRocmVhZCB0byBzdGFydAotCXdhaXRfZm9yX2NvbXBsZXRpb24oJihwQWQtPlRpbWVyUUNvbXBsZXRlKSk7Ci0KLQkvLyBDcmVhdGUgcmVjZWl2ZSB0YXNrbGV0Ci0JdGFza2xldF9pbml0KCZwT2JqLT5yeF9kb25lX3Rhc2ssIHJ4X2RvbmVfdGFza2xldCwgKFVMT05HKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2ssIHJ0Mjg3MF9tZ210X2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzaywgcnQyODcwX2FjMF9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2ssIHJ0Mjg3MF9hYzFfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrLCBydDI4NzBfYWMyX2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzaywgcnQyODcwX2FjM19kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrLCBydDI4NzBfaGNjYV9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+dGJ0dF90YXNrLCB0YnR0X3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5udWxsX2ZyYW1lX2NvbXBsZXRlX3Rhc2ssIHJ0Mjg3MF9udWxsX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5ydHNfZnJhbWVfY29tcGxldGVfdGFzaywgcnQyODcwX3J0c19mcmFtZV9jb21wbGV0ZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+cHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2ssIHJ0Mjg3MF9wc3BvbGxfZnJhbWVfY29tcGxldGVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotIAlBcyBTVEEncyBCU1NJRCBpcyBhIFdDIHRvbywgaXQgdXNlcyBzaGFyZWQga2V5IHRhYmxlLgotIAlUaGlzIGZ1bmN0aW9uIHdyaXRlIGNvcnJlY3QgdW5pY2FzdCBUWCBrZXkgdG8gQVNJQyBXQ0lELgotIAlBbmQgd2Ugc3RpbGwgbWFrZSBhIGNvcHkgaW4gb3VyIE1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LgotCUNhbGxlciBndWFyYW50ZWUgVEtJUC9BRVMgYWx3YXlzIGhhcyBrZXlpZHggPSAwLiAocGFpcndpc2Uga2V5KQotCUNhbGxlciBndWFyYW50ZWUgV0VQIGNhbGxzIHRoaXMgZnVuY3Rpb24gd2hlbiBzZXQgVHhrZXksICBkZWZhdWx0IGtleSBpbmRleD0wfjMuCi0KLUFyZ3VtZW50czoKLQlwQWQgCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JcEtleQkJCQkJUG9pbnRlciB0byB0aGUgd2hlcmUgdGhlIGtleSBzdG9yZWQKLQotUmV0dXJuIFZhbHVlOgotCU5ESVNfU1VDQ0VTUwkJCUFkZCBrZXkgc3VjY2Vzc2Z1bGx5Ci0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBBZGRCU1NJRENpcGhlcigKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JVUNIQVIJCQkJQWlkLAotCUlOCVBORElTXzgwMl8xMV9LRVkJcEtleSwKLQlJTiAgVUNIQVIgICAJCQlDaXBoZXJBbGcpCi17Ci0JUFVDSEFSCQlwVHhNaWMsIHBSeE1pYzsKLQlCT09MRUFOIAliS2V5UlNDLCBiQXV0aGVudGljYXRvcjsgLy8gaW5kaWNhdGUgdGhlIHJlY2VpdmUgU0Mgc2V0IGJ5IEtleVJTQyB2YWx1ZQotLy8JVUNIQVIJCUNpcGhlckFsZzsKLQlVQ0hBUgkJaTsKLQlVTE9ORwkJV0NJREF0dHJpOwotCVVTSE9SVAkgCW9mZnNldDsKLQlVQ0hBUgkJS2V5SWR4LCBJVkVJVls4XTsKLQlVSU5UMzIJCVZhbHVlOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEFkZEJTU0lEQ2lwaGVyPT0+IEFpZCA9ICVkXG4iLEFpZCkpOwotCi0JLy8gQml0IDI5IG9mIEFkZC1rZXkgS2V5UlNDCi0JYktleVJTQyAJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDIwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKLQotCS8vIEJpdCAyOCBvZiBBZGQta2V5IEF1dGhlbnRpY2F0b3IKLQliQXV0aGVudGljYXRvciA9IChwS2V5LT5LZXlJbmRleCAmIDB4MTAwMDAwMDApID8gVFJVRSA6IEZBTFNFOwotCUtleUlkeCA9IChVQ0hBUilwS2V5LT5LZXlJbmRleCYweGZmOwotCi0JaWYgKEtleUlkeCA+IDQpCi0JCXJldHVybjsKLQotCi0JaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCi0JewlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQkJewotCQkJLy8gZm9yIFdQQS1Ob25lIFR4LCBSeCBNSUMgaXMgdGhlIHNhbWUKLQkJCXBUeE1pYyA9IChQVUNIQVIpICgmcEtleS0+S2V5TWF0ZXJpYWwpICsgMTY7Ci0JCQlwUnhNaWMgPSBwVHhNaWM7Ci0JCX0KLQkJZWxzZSBpZiAoYkF1dGhlbnRpY2F0b3IgPT0gVFJVRSkKLQkJewotCQkJcFR4TWljID0gKFBVQ0hBUikgKCZwS2V5LT5LZXlNYXRlcmlhbCkgKyAxNjsKLQkJCXBSeE1pYyA9IChQVUNIQVIpICgmcEtleS0+S2V5TWF0ZXJpYWwpICsgMjQ7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwUnhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDE2OwotCQkJcFR4TWljID0gKFBVQ0hBUikgKCZwS2V5LT5LZXlNYXRlcmlhbCkgKyAyNDsKLQkJfQotCi0JCW9mZnNldCA9IFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICsgKEFpZCAqIEhXX0tFWV9FTlRSWV9TSVpFKSArIDB4MTA7Ci0JCWZvciAoaT0wOyBpPDg7ICkKLQkJewotCQkJVmFsdWUgPSAqKHBUeE1pYytpKTsKLQkJCVZhbHVlICs9ICgqKHBUeE1pYytpKzEpPDw4KTsKLQkJCVZhbHVlICs9ICgqKHBUeE1pYytpKzIpPDwxNik7Ci0JCQlWYWx1ZSArPSAoKihwVHhNaWMraSszKTw8MjQpOwotCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0K2ksIFZhbHVlKTsKLQkJCWkrPTQ7Ci0JCX0KLQotCQlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChBaWQgKiBIV19LRVlfRU5UUllfU0laRSkgKyAweDE4OwotCQlmb3IgKGk9MDsgaTw4OyApCi0JCXsKLQkJCVZhbHVlID0gKihwUnhNaWMraSk7Ci0JCQlWYWx1ZSArPSAoKihwUnhNaWMraSsxKTw8OCk7Ci0JCQlWYWx1ZSArPSAoKihwUnhNaWMraSsyKTw8MTYpOwotCQkJVmFsdWUgKz0gKCoocFJ4TWljK2krMyk8PDI0KTsKLQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCtpLCBWYWx1ZSk7Ci0JCQlpKz00OwotCQl9Ci0KLQkJLy8gT25seSBLZXkgbGVudGggZXF1YWwgdG8gVEtJUCBrZXkgaGF2ZSB0aGVzZQotCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuUnhNaWMsIHBSeE1pYywgOCk7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5UeE1pYywgcFR4TWljLCA4KTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKLQkJCQkoIglUeE1JQyAgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggXG4iLAotCQkJCXBUeE1pY1swXSxwVHhNaWNbMV0scFR4TWljWzJdLHBUeE1pY1szXSwKLQkJCQlwVHhNaWNbNF0scFR4TWljWzVdLHBUeE1pY1s2XSxwVHhNaWNbN10pKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCi0JCQkJKCIJUnhNSUMgID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFxuIiwKLQkJCQlwUnhNaWNbMF0scFJ4TWljWzFdLHBSeE1pY1syXSxwUnhNaWNbM10sCi0JCQkJcFJ4TWljWzRdLHBSeE1pY1s1XSxwUnhNaWNbNl0scFJ4TWljWzddKSk7Ci0JfQotCi0JLy8gMi4gUmVjb3JkIFNlY3VyaXR5IEtleS4KLQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LktleUxlbj0gKFVDSEFSKXBLZXktPktleUxlbmd0aDsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7Ci0KLQkvLyAzLiBDaGVjayBSeFRzYy4gQW5kIHVzZWQgdG8gaW5pdCB0byBBU0lDIElWLgotCWlmIChiS2V5UlNDID09IFRSVUUpCi0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5SeFRzYywgJnBLZXktPktleVJTQywgNik7Ci0JZWxzZQotCQlOZGlzWmVyb01lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuUnhUc2MsIDYpOwotCi0JLy8gNC4gSW5pdCBUeFRzYyB0byBvbmUgYmFzZWQgb24gV2lGaSBXUEEgc3BlY3MKLQlwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuVHhUc2NbMF0gPSAxOwotCXBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5UeFRzY1sxXSA9IDA7Ci0JcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlR4VHNjWzJdID0gMDsKLQlwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuVHhUc2NbM10gPSAwOwotCXBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5UeFRzY1s0XSA9IDA7Ci0JcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlR4VHNjWzVdID0gMDsKLQotCUNpcGhlckFsZyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5DaXBoZXJBbGc7Ci0KLQlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChBaWQgKiBIV19LRVlfRU5UUllfU0laRSk7Ci0JUlRVU0JNdWx0aVdyaXRlKHBBZCwgKFVTSE9SVCkgb2Zmc2V0LCBwS2V5LT5LZXlNYXRlcmlhbCwKLQkJCQkoKHBLZXktPktleUxlbmd0aCA9PSBMRU5fVEtJUF9LRVkpID8gMTYgOiAoVVNIT1JUKXBLZXktPktleUxlbmd0aCkpOwotCi0Jb2Zmc2V0ID0gU0hBUkVEX0tFWV9UQUJMRV9CQVNFICsgKEtleUlkeCAqIEhXX0tFWV9FTlRSWV9TSVpFKTsKLQlSVFVTQk11bHRpV3JpdGUocEFkLCAoVVNIT1JUKSBvZmZzZXQsIHBLZXktPktleU1hdGVyaWFsLCAoVVNIT1JUKXBLZXktPktleUxlbmd0aCk7Ci0KLQlvZmZzZXQgPSBQQUlSV0lTRV9JVkVJVl9UQUJMRV9CQVNFICsgKEFpZCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOwotCU5kaXNaZXJvTWVtb3J5KElWRUlWLCA4KTsKLQotCS8vIElWL0VJVgotCWlmICgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKSB8fAotCQkoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwKLQkJKENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSkKLQl7Ci0JCUlWRUlWWzNdID0gMHgyMDsgLy8gRWl2IGJpdCBvbi4ga2V5aWQgYWx3YXlzIDAgZm9yIHBhaXJ3aXNlIGtleQotCX0KLQkvLyBkZWZhdWx0IGtleSBpZHggbmVlZHMgdG8gc2V0LgotCS8vIGluIFRLSVAvQUVTIEtleUlkeCA9IDAgLCBXRVAgS2V5SWR4IGlzIGRlZmF1bHQgdHgga2V5LgotCWVsc2UKLQl7Ci0JCUlWRUlWWzNdIHw9IChLZXlJZHg8PCA2KTsKLQl9Ci0JUlRVU0JNdWx0aVdyaXRlKHBBZCwgKFVTSE9SVCkgb2Zmc2V0LCBJVkVJViwgOCk7Ci0KLQkvLyBXQ0lEIEF0dHJpYnV0ZSBVREY6MywgQlNTSWR4OjMsIEFsZzozLCBLZXl0YWJsZToxPVBBSVJXSVNFIEtFWSwgQlNTSWR4IGlzIDAKLQlpZiAoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwKLQkJKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpIHx8Ci0JCShDaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykpCi0JewotCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKXxTSEFSRURLRVlUQUJMRTsKLQl9Ci0JZWxzZQotCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKXxTSEFSRURLRVlUQUJMRTsKLQotCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKEFpZCogSFdfV0NJRF9BVFRSSV9TSVpFKTsKLQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Ci0JUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsICZWYWx1ZSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCU1NJRF9XQ0lEIDogb2Zmc2V0ID0gJXgsIFdDSURBdHRyaSA9ICVseFxuIiwKLQkJCW9mZnNldCwgV0NJREF0dHJpKSk7Ci0KLQkvLyBwQWRkcgotCS8vIEFkZCBCc3NpZCBtYWMgYWRkcmVzcyBhdCBsaW5rdXAuIG5vdCBoZXJlLiAgY2hlY2shCi0JLypvZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgKEJTU0lEX1dDSUQgKiBIV19XQ0lEX0VOVFJZX1NJWkUpOwotCSpmb3IgKGk9MDsgaTxNQUNfQUREUl9MRU47IGkrKykKLQl7Ci0JCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0K2ksIHBLZXktPkJTU0lEW2ldKTsKLQl9Ci0JKi8KLQotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFkZEJTU0lEYXNXQ0lERW50cnk6IEFsZz0lcywgS2V5TGVuZ3RoID0gJWRcbiIsCi0JCQlDaXBoZXJOYW1lW0NpcGhlckFsZ10sIHBLZXktPktleUxlbmd0aCkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIktleSBbaWR4PSV4XSBbS2V5TGVuID0gJWRdXG4iLAotCQkJcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOwotCWZvcihpPTA7IGk8cEtleS0+S2V5TGVuZ3RoOyBpKyspCi0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIiAleDoiLCBwS2V5LT5LZXlNYXRlcmlhbFtpXSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiCSBcbiIpKTsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBHZXQgYSByZWNlaXZlZCBwYWNrZXQuCi0KLUFyZ3VtZW50czoKLQlwQWQJCQkJCWRldmljZSBjb250cm9sIGJsb2NrCi0JcFNhdmVSeEQJCQlyZWNlaXZlIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24KLQkqcGJSZXNjaGVkdWxlCQluZWVkIHJlc2NoZWR1bGUgZmxhZwotCSpwUnhQZW5kaW5nCQkJcGVuZGluZyByZWNlaXZlZCBwYWNrZXQgZmxhZwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgdGhlIHJlY2lldmVkIHBhY2tldAotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotI2RlZmluZSBSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRQkJCTQKLVBORElTX1BBQ0tFVCBHZXRQYWNrZXRGcm9tUnhSaW5nKAotCUlOCQlQUlRNUF9BREFQVEVSCQlwQWQsCi0JT1VUCQlQUlQyOFhYX1JYRF9TVFJVQwlwU2F2ZVJ4RCwKLQlPVVQJCUJPT0xFQU4JCQkJKnBiUmVzY2hlZHVsZSwKLQlJTiBPVVQJVUlOVDMyCQkJCSpwUnhQZW5kaW5nKQotewotCVBSWF9DT05URVhUCQlwUnhDb250ZXh0OwotCVBORElTX1BBQ0tFVAlwU2tiOwotCVBVQ0hBUgkJCXBEYXRhOwotCVVMT05HCQkJVGhpc0ZyYW1lTGVuOwotCVVMT05HCQkJUnhCdWZmZXJMZW5ndGg7Ci0JUFJYV0lfU1RSVUMJCXBSeFdJOwotCi0JcFJ4Q29udGV4dCA9ICZwQWQtPlJ4Q29udGV4dFtwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleF07Ci0JaWYgKChwUnhDb250ZXh0LT5SZWFkYWJsZSA9PSBGQUxTRSkgfHwgKHBSeENvbnRleHQtPkluVXNlID09IFRSVUUpKQotCQlyZXR1cm4gTlVMTDsKLQotCVJ4QnVmZmVyTGVuZ3RoID0gcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0IC0gcEFkLT5SZWFkUG9zaXRpb247Ci0JaWYgKFJ4QnVmZmVyTGVuZ3RoIDwgKFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFICsgc2l6ZW9mKFJYV0lfU1RSVUMpICsgc2l6ZW9mKFJYSU5GT19TVFJVQykpKQotCXsKLQkJZ290byBsYWJlbF9udWxsOwotCX0KLQotCXBEYXRhID0gJnBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyW3BBZC0+UmVhZFBvc2l0aW9uXTsgLyogNEtCICovCi0JLy8gVGhlIFJYRE1BIGZpZWxkIGlzIDQgYnl0ZXMsIG5vdyBqdXN0IHVzZSB0aGUgZmlyc3QgMiBieXRlcy4gVGhlIExlbmd0aCBpbmNsdWRpbmcgdGhlIChSWFdJICsgTVNEVSArIFBhZGRpbmcpCi0JVGhpc0ZyYW1lTGVuID0gKnBEYXRhICsgKCoocERhdGErMSk8PDgpOwotICAgIGlmIChUaGlzRnJhbWVMZW4gPT0gMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJJUklkeCglZCk6IFJYRE1BTGVuIGlzIHplcm8uWyVsZF0sIEJ1bGtJbkJ1ZkxlbiA9ICVsZClcbiIsCi0JCQkJCQkJCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBUaGlzRnJhbWVMZW4sIHBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCkpOwotCQlnb3RvIGxhYmVsX251bGw7Ci0JfQotCWlmICgoVGhpc0ZyYW1lTGVuJjB4MykgIT0gMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkJJUklkeCglZCk6IFJYRE1BTGVuIG5vdCBtdWx0aXBsZSBvZiA0LlslbGRdLCBCdWxrSW5CdWZMZW4gPSAlbGQpXG4iLAotCQkJCQkJCQlwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCwgVGhpc0ZyYW1lTGVuLCBwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQpKTsKLQkJZ290byBsYWJlbF9udWxsOwotCX0KLQotCWlmICgoVGhpc0ZyYW1lTGVuICsgOCk+IFJ4QnVmZmVyTGVuZ3RoKQkvLyA4IGZvciAoUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkUgKyBzaXplb2YoUlhJTkZPX1NUUlVDKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQklSSWR4KCVkKTpGcmFtZUxlbigweCVseCkgb3V0cmFuZ2VzLiBCdWxrSW5MZW49MHglbHgsIHJlbWFpbmluZyBSeEJ1Zkxlbj0weCVseCwgUmVhZFBvcz0weCVseFxuIiwKLQkJCQkJCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBUaGlzRnJhbWVMZW4sIHBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCwgUnhCdWZmZXJMZW5ndGgsIHBBZC0+UmVhZFBvc2l0aW9uKSk7Ci0KLQkJLy8gZXJyb3IgZnJhbWUuIGZpbmlzaCB0aGlzIGxvb3AKLQkJZ290byBsYWJlbF9udWxsOwotCX0KLQotCS8vIHNraXAgVVNCIGZyYW1lIGxlbmd0aCBmaWVsZAotCXBEYXRhICs9IFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFOwotCXBSeFdJID0gKFBSWFdJX1NUUlVDKXBEYXRhOwotCi0JaWYgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPiBUaGlzRnJhbWVMZW4pCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcygpOnBSeFdJTVBEVXRvdGFsQnl0ZUNvdW50KCVkKSBsYXJnZSB0aGFuIFJ4RE1BTGVuKCVsZClcbiIsCi0JCQkJCQkJCQlfX2Z1bmNfXywgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCwgVGhpc0ZyYW1lTGVuKSk7Ci0JCWdvdG8gbGFiZWxfbnVsbDsKLQl9Ci0KLQkvLyBhbGxvY2F0ZSBhIHJ4IHBhY2tldAotCXBTa2IgPSBkZXZfYWxsb2Nfc2tiKFRoaXNGcmFtZUxlbik7Ci0JaWYgKHBTa2IgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiJXMoKTpDYW5ub3QgQWxsb2NhdGUgc2sgYnVmZmVyIGZvciB0aGlzIEJ1bGstSW4gYnVmZmVyIVxuIiwgX19mdW5jX18pKTsKLQkJZ290byBsYWJlbF9udWxsOwotCX0KLQotCS8vIGNvcHkgdGhlIHJ4IHBhY2tldAotCW1lbWNweShza2JfcHV0KHBTa2IsIFRoaXNGcmFtZUxlbiksIHBEYXRhLCBUaGlzRnJhbWVMZW4pOwotCVJUUEtUX1RPX09TUEtUKHBTa2IpLT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBCU1MwKTsKLQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKE9TUEtUX1RPX1JUUEtUKHBTa2IpLCBQS1RTUkNfTkRJUyk7Ci0KLQkvLyBjb3B5IFJ4RAotCSpwU2F2ZVJ4RCA9ICooUFJYSU5GT19TVFJVQykocERhdGEgKyBUaGlzRnJhbWVMZW4pOwotCi0JLy8gdXBkYXRlIG5leHQgcGFja2V0IHJlYWQgcG9zaXRpb24uCi0JcEFkLT5SZWFkUG9zaXRpb24gKz0gKFRoaXNGcmFtZUxlbiArIFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFICsgUlhJTkZPX1NJWkUpOwkvLyA4IGZvciAoUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkUgKyBzaXplb2YoUlhJTkZPX1NUUlVDKSkKLQotCXJldHVybiBwU2tiOwotCi1sYWJlbF9udWxsOgotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBIYW5kbGUgcmVjZWl2ZWQgcGFja2V0cy4KLQotQXJndW1lbnRzOgotCWRhdGEJCQkJLSBVUkIgaW5mb3JtYXRpb24gcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIHZvaWQgcnhfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlwdXJiYl90IAkJCXBVcmI7Ci0JUFJYX0NPTlRFWFQJCQlwUnhDb250ZXh0OwotCVBSVE1QX0FEQVBURVIJCXBBZDsKLQlOVFNUQVRVUwkJCVN0YXR1czsKLQl1bnNpZ25lZCBpbnQJCUlycUZsYWdzOwotCi0JcFVyYgkJPSAocHVyYmJfdClkYXRhOwotCXBSeENvbnRleHQJPSAoUFJYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKLQlwQWQgCQk9IHBSeENvbnRleHQtPnBBZDsKLQlTdGF0dXMgPSBwVXJiLT5zdGF0dXM7Ci0KLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwotCXBSeENvbnRleHQtPkluVXNlID0gRkFMU0U7Ci0JcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOwotCXBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCArPSBwVXJiLT5hY3R1YWxfbGVuZ3RoOwotCS8vTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7Ci0JcEFkLT5QZW5kaW5nUngtLTsKLQotCWlmIChTdGF0dXMgPT0gVVNCX1NUX05PRVJST1IpCi0JewotCQlwQWQtPkJ1bGtJbkNvbXBsZXRlKys7Ci0JCXBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gPSAwOwotCQlpZiAocFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0KQkvLyBBcyBqYW4ncyBjb21tZW50LCBpdCBtYXkgYnVsay1pbiBzdWNjZXNzIGJ1dCBzaXplIGlzIHplcm8uCi0JCXsKLQkJCXBSeENvbnRleHQtPlJlYWRhYmxlID0gVFJVRTsKLQkJCUlOQ19SSU5HX0lOREVYKHBBZC0+TmV4dFJ4QnVsa0luSW5kZXgsIFJYX1JJTkdfU0laRSk7Ci0JCX0KLQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKLQl9Ci0JZWxzZQkgLy8gU1RBVFVTX09USEVSCi0JewotCQlwQWQtPkJ1bGtJbkNvbXBsZXRlRmFpbCsrOwotCQkvLyBTdGlsbCByZWFkIHRoaXMgcGFja2V0IGFsdGhvdWdoIGl0IG1heSBjb210YWluIHdyb25nIGJ5dGVzLgotCQlwUnhDb250ZXh0LT5SZWFkYWJsZSA9IEZBTFNFOwotCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwotCi0JCS8vIFBhcnNpbmcgYWxsIHBhY2tldHMuIGJlY2F1c2UgYWZ0ZXIgcmVzZXQsIHRoZSBpbmRleCB3aWxsIHJlc2V0IHRvIGFsbCB6ZXJvLgotCQlpZiAoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUIHwKLQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCi0JCXsKLQotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGsgSW4gRmFpbGVkLiBTdGF0dXM9JWQsIEJJSWR4PTB4JXgsIEJJUklkeD0weCV4LCBhY3R1YWxfbGVuZ3RoPSAweCV4XG4iLAotCQkJCQkJCVN0YXR1cywgcEFkLT5OZXh0UnhCdWxrSW5JbmRleCwgcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsIHBSeENvbnRleHQtPnBVcmItPmFjdHVhbF9sZW5ndGgpKTsKLQotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUKTsKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU4sIE5VTEwsIDApOwotCQl9Ci0JfQotCi0JQVNTRVJUKChwUnhDb250ZXh0LT5JblVzZSA9PSBwUnhDb250ZXh0LT5JUlBQZW5kaW5nKSk7Ci0KLQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7Ci0KLQlyZXR1cm47Ci0KLX0KLQotCi1zdGF0aWMgdm9pZCBydDI4NzBfbWdtdF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlQUlRNUF9BREFQVEVSIAlwQWQ7Ci0JUFRYX0NPTlRFWFQJCXBNTE1FQ29udGV4dDsKLQlpbnQJCQkJaW5kZXg7Ci0JUE5ESVNfUEFDS0VUCXBQYWNrZXQ7Ci0JcHVyYmJfdAkJCXBVcmI7Ci0JTlRTVEFUVVMJCVN0YXR1czsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOwotCi0KLQlwVXJiCQkJPSAocHVyYmJfdClkYXRhOwotCXBNTE1FQ29udGV4dAk9IChQVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OwotCXBBZCAJCQk9IHBNTE1FQ29udGV4dC0+cEFkOwotCVN0YXR1cwkJCT0gcFVyYi0+c3RhdHVzOwotCWluZGV4IAkJCT0gcE1MTUVDb250ZXh0LT5TZWxmSWR4OwotCi0JQVNTRVJUKChwQWQtPk1nbXRSaW5nLlR4RG1hSWR4ID09IGluZGV4KSk7Ci0KLQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW01HTVRQSVBFSURYXSwgSXJxRmxhZ3MpOwotCi0KLQlpZiAoU3RhdHVzICE9IFVTQl9TVF9OT0VSUk9SKQotCXsKLQkJLy9CdWxrLU91dCBmYWlsIHN0YXR1cyBoYW5kbGUKLQkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgotCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpCi0JCXsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrIE91dCBNTE1FIEZhaWxlZCwgU3RhdHVzPSVkIVxuIiwgU3RhdHVzKSk7Ci0JCQkvLyBUT0RPOiBIb3cgdG8gaGFuZGxlIGFib3V0IHRoZSBNTE1FQnVsa091dCBmYWlsZWQgaXNzdWUuIE5lZWQgdG8gcmVzZW5kIHRoZSBtZ210IHBrdD8KLQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOwotCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPSAoTUdNVFBJUEVJRFggfCBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRyk7Ci0JCX0KLQl9Ci0KLQlwQWQtPkJ1bGtPdXRQZW5kaW5nW01HTVRQSVBFSURYXSA9IEZBTFNFOwotCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrLCBJcnFGbGFncyk7Ci0JLy8gUmVzZXQgTUxNRSBjb250ZXh0IGZsYWdzCi0JcE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7Ci0JcE1MTUVDb250ZXh0LT5JblVzZSA9IEZBTFNFOwotCXBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID0gRkFMU0U7Ci0JcE1MTUVDb250ZXh0LT5CdWxrT3V0U2l6ZSA9IDA7Ci0KLQlwUGFja2V0ID0gcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldDsKLQlwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0ID0gTlVMTDsKLQotCS8vIEluY3JlYXNlIE1nbXRSaW5nIEluZGV4Ci0JSU5DX1JJTkdfSU5ERVgocEFkLT5NZ210UmluZy5UeERtYUlkeCwgTUdNVF9SSU5HX1NJWkUpOwotCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgrKzsKLQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrLCBJcnFGbGFncyk7Ci0KLQkvLyBOby1tYXR0ZXIgc3VjY2VzcyBvciBmYWlsLCB3ZSBmcmVlIHRoZSBtZ210IHBhY2tldC4KLQlpZiAocFBhY2tldCkKLQkJUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgcFBhY2tldCk7Ci0KLQlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCi0JewotCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCi0JfQotCWVsc2UKLQl7Ci0JCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkgJiYKLQkJCSgocEFkLT5idWxrUmVzZXRQaXBlaWQgJiBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRykgPT0gQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpKQotCQl7CS8vIEZvciBNZ210IEJ1bGstT3V0IGZhaWxlZCwgaWdub3JlIGl0IG5vdy4KLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKLQkJfQotCQllbHNlCi0JCXsKLQotCQkJLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCi0JCQkvLyBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKLQkJCWlmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4IDwgTUdNVF9SSU5HX1NJWkUgLyogcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPT0gVFJVRSAqLykKLQkJCXsKLQkJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX01MTUUpOwotCQkJfQotCQkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKLQkJCX0KLQkJfQotCi19Ci0KLQotc3RhdGljIHZvaWQgcnQyODcwX2hjY2FfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JUFJUTVBfQURBUFRFUgkJcEFkOwotCVBIVF9UWF9DT05URVhUCQlwSFRUWENvbnRleHQ7Ci0JVUNIQVIJCQkJQnVsa091dFBpcGVJZCA9IDQ7Ci0JcHVyYmJfdAkJCQlwVXJiOwotCi0JREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIi0tLT5oY2NhX2RtYV9kb25lX3Rhc2tsZXRcbiIpKTsKLQotCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7Ci0JcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7Ci0JcEFkCQkJCT0gcEhUVFhDb250ZXh0LT5wQWQ7Ci0KLQlydDI4NzBfZGF0YW91dF9jb21wbGV0ZV90YXNrbGV0KCh1bnNpZ25lZCBsb25nKXBVcmIpOwotCi0JaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKQotCXsKLQkJLy8gZG8gbm90aGluZyBhbmQgcmV0dXJuIGRpcmVjdGx5LgotCX0KLQllbHNlCi0JewotCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKQotCQl7Ci0JCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7Ci0JCX0KLQkJZWxzZQotCQl7CXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKLQkJCWlmICgocEFkLT5UeFN3UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID4gMCkgJiYKLQkJCQkvKigocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiArIDB4NjAwMCkpIHx8IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPiBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAweDYwMDApKSAmJiAqLwotCQkJCShwQWQtPkRlUXVldWVSdW5uaW5nW0J1bGtPdXRQaXBlSWRdID09IEZBTFNFKSAmJgotCQkJCShwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IEZBTFNFKSkKLQkJCXsKLQkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBCdWxrT3V0UGlwZUlkLCBNQVhfVFhfUFJPQ0VTUyk7Ci0JCQl9Ci0KLQkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUw8PDQpOwotCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOwotCQl9Ci0JfQotCi0JREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIjwtLS1oY2NhX2RtYV9kb25lX3Rhc2tsZXRcbiIpKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBydDI4NzBfYWMzX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCVBSVE1QX0FEQVBURVIJCXBBZDsKLQlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OwotCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQgPSAzOwotCXB1cmJiX3QJCQkJcFVyYjsKLQotCi0JcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKLQlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKLQlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKLQotCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7Ci0KLQlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCi0JewotCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCi0JfQotCWVsc2UKLQl7Ci0JCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCi0JCXsKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKLQkJfQotCQllbHNlCi0JCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOwotCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgotCQkJCS8qKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCi0JCQkJKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCi0JCQkJKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKQotCQkJewotCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsIE1BWF9UWF9QUk9DRVNTKTsKLQkJCX0KLQotCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTDw8Myk7Ci0JCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Ci0JCX0KLQl9Ci0KLQotCQlyZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQgcnQyODcwX2FjMl9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlQUlRNUF9BREFQVEVSCQlwQWQ7Ci0JUEhUX1RYX0NPTlRFWFQJCXBIVFRYQ29udGV4dDsKLQlVQ0hBUgkJCQlCdWxrT3V0UGlwZUlkID0gMjsKLQlwdXJiYl90CQkJCXBVcmI7Ci0KLQotCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7Ci0JcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7Ci0JcEFkCQkJCT0gcEhUVFhDb250ZXh0LT5wQWQ7Ci0KLQlydDI4NzBfZGF0YW91dF9jb21wbGV0ZV90YXNrbGV0KCh1bnNpZ25lZCBsb25nKXBVcmIpOwotCi0JaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKQotCXsKLQkJLy8gZG8gbm90aGluZyBhbmQgcmV0dXJuIGRpcmVjdGx5LgotCX0KLQllbHNlCi0JewotCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKQotCQl7Ci0JCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7Ci0JCX0KLQkJZWxzZQotCQl7CXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKLQkJCWlmICgocEFkLT5UeFN3UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID4gMCkgJiYKLQkJCQkvKigocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiArIDB4NjAwMCkpIHx8IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPiBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAweDYwMDApKSAmJiAqLwotCQkJCShwQWQtPkRlUXVldWVSdW5uaW5nW0J1bGtPdXRQaXBlSWRdID09IEZBTFNFKSAmJgotCQkJCShwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IEZBTFNFKSkKLQkJCXsKLQkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBCdWxrT3V0UGlwZUlkLCBNQVhfVFhfUFJPQ0VTUyk7Ci0JCQl9Ci0KLQkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUw8PDIpOwotCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOwotCQl9Ci0JfQotCi0JCXJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZCBydDI4NzBfYWMxX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCVBSVE1QX0FEQVBURVIJCXBBZDsKLQlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OwotCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQgPSAxOwotCXB1cmJiX3QJCQkJcFVyYjsKLQotCi0JcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKLQlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKLQlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKLQotCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7Ci0KLQlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCi0JewotCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCi0JfQotCWVsc2UKLQl7Ci0JCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCi0JCXsKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKLQkJfQotCQllbHNlCi0JCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOwotCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgotCQkJCS8qKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCi0JCQkJKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCi0JCQkJKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKQotCQkJewotCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsIE1BWF9UWF9QUk9DRVNTKTsKLQkJCX0KLQotCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTDw8MSk7Ci0JCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Ci0JCX0KLQl9Ci0KLQotCXJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZCBydDI4NzBfYWMwX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCVBSVE1QX0FEQVBURVIJCXBBZDsKLQlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OwotCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQgPSAwOwotCXB1cmJiX3QJCQkJcFVyYjsKLQotCi0JcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKLQlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKLQlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKLQotCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7Ci0KLQlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCi0JewotCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCi0JfQotCWVsc2UKLQl7Ci0JCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCi0JCXsKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKLQkJfQotCQllbHNlCi0JCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOwotCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgotCQkJCS8qICAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA+IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gKyAweDYwMDApKSB8fCAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID4gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgMHg2MDAwKSkgJiYgKi8KLQkJCQkocEFkLT5EZVF1ZXVlUnVubmluZ1tCdWxrT3V0UGlwZUlkXSA9PSBGQUxTRSkgJiYKLQkJCQkocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBGQUxTRSkpCi0JCQl7Ci0JCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgQnVsa091dFBpcGVJZCwgTUFYX1RYX1BST0NFU1MpOwotCQkJfQotCi0JCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMKTsKLQkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKLQkJfQotCX0KLQotCi0JcmV0dXJuOwotCi19Ci0KLQotc3RhdGljIHZvaWQgcnQyODcwX251bGxfZnJhbWVfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JUFJUTVBfQURBUFRFUglwQWQ7Ci0JUFRYX0NPTlRFWFQJCXBOdWxsQ29udGV4dDsKLQlwdXJiYl90CQkJcFVyYjsKLQlOVFNUQVRVUwkJU3RhdHVzOwotCXVuc2lnbmVkIGxvbmcJaXJxRmxhZzsKLQotCi0JcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKLQlwTnVsbENvbnRleHQJPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKLQlwQWQgCQkJPSBwTnVsbENvbnRleHQtPnBBZDsKLQlTdGF0dXMgCQkJPSBwVXJiLT5zdGF0dXM7Ci0KLQkvLyBSZXNldCBOdWxsIGZyYW1lIGNvbnRleHQgZmxhZ3MKLQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKLQlwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgCT0gRkFMU0U7Ci0JcE51bGxDb250ZXh0LT5JblVzZSAJCT0gRkFMU0U7Ci0JcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IEZBTFNFOwotCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbMF0gPSAwOwotCi0JaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKLQl7Ci0JCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7Ci0KLQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKLQl9Ci0JZWxzZQkvLyBTVEFUVVNfT1RIRVIKLQl7Ci0JCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgotCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQotCQl7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgTnVsbCBGcmFtZSBGYWlsZWQsIFJlYXNvbkNvZGU9JWQhXG4iLCBTdGF0dXMpKTsKLQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOwotCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPSAoTUdNVFBJUEVJRFggfCBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRyk7Ci0JCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOwotCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIE5VTEwsIDApOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKLQkJfQotCX0KLQotCS8vIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLgotCS8vIFRoZSBwcm90ZWN0aW9vbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZQotCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKLQotfQotCi0KLXN0YXRpYyB2b2lkIHJ0Mjg3MF9ydHNfZnJhbWVfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JUFJUTVBfQURBUFRFUglwQWQ7Ci0JUFRYX0NPTlRFWFQJCXBSVFNDb250ZXh0OwotCXB1cmJiX3QJCQlwVXJiOwotCU5UU1RBVFVTCQlTdGF0dXM7Ci0JdW5zaWduZWQgbG9uZwlpcnFGbGFnOwotCi0KLQlwVXJiCQk9IChwdXJiYl90KWRhdGE7Ci0JcFJUU0NvbnRleHQJPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKLQlwQWQJCQk9IHBSVFNDb250ZXh0LT5wQWQ7Ci0JU3RhdHVzCQk9IHBVcmItPnN0YXR1czsKLQotCS8vIFJlc2V0IFJUUyBmcmFtZSBjb250ZXh0IGZsYWdzCi0JUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7Ci0JcFJUU0NvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKLQlwUlRTQ29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7Ci0KLQlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQotCXsKLQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKLQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKLQl9Ci0JZWxzZQkvLyBTVEFUVVNfT1RIRVIKLQl7Ci0JCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgotCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQotCQl7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgUlRTIEZyYW1lIEZhaWxlZFxuIikpOwotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7Ci0JCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9IChNR01UUElQRUlEWCB8IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKTsKLQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7Ci0JCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOwotCQl9Ci0JfQotCi0JUlRNUF9TRU1fTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twUlRTQ29udGV4dC0+QnVsa091dFBpcGVJZF0pOwotCXBBZC0+QnVsa091dFBlbmRpbmdbcFJUU0NvbnRleHQtPkJ1bGtPdXRQaXBlSWRdID0gRkFMU0U7Ci0JUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BSVFNDb250ZXh0LT5CdWxrT3V0UGlwZUlkXSk7Ci0KLQkvLyBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4KLQkvLyBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKLQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Ci0KLX0KLQotCi1zdGF0aWMgdm9pZCBydDI4NzBfcHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCVBSVE1QX0FEQVBURVIJcEFkOwotCVBUWF9DT05URVhUCQlwUHNQb2xsQ29udGV4dDsKLQlwdXJiYl90CQkJcFVyYjsKLQlOVFNUQVRVUwkJU3RhdHVzOwotCi0KLQlwVXJiCQkJPSAocHVyYmJfdClkYXRhOwotCXBQc1BvbGxDb250ZXh0CT0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7Ci0JcEFkCQkJCT0gcFBzUG9sbENvbnRleHQtPnBBZDsKLQlTdGF0dXMJCQk9IHBVcmItPnN0YXR1czsKLQotCS8vIFJlc2V0IFBzUG9sbCBjb250ZXh0IGZsYWdzCi0JcFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcJPSBGQUxTRTsKLQlwUHNQb2xsQ29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7Ci0JcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFswXSA9IDA7Ci0KLQlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQotCXsKLQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKLQl9Ci0JZWxzZSAvLyBTVEFUVVNfT1RIRVIKLQl7Ci0JCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgotCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQotCQl7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgUFNQb2xsIEZhaWxlZFxuIikpOwotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7Ci0JCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9IChNR01UUElQRUlEWCB8IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKTsKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKLQkJfQotCX0KLQotCVJUTVBfU0VNX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0pOwotCXBBZC0+QnVsa091dFBlbmRpbmdbMF0gPSBGQUxTRTsKLQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0pOwotCi0JLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCi0JLy8gVGhlIHByb3RlY3Rpb29uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lCi0JUlRVU0JLaWNrQnVsa091dChwQWQpOwotCi19Ci0KLQotc3RhdGljIHZvaWQgcnQyODcwX2RhdGFvdXRfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JUFJUTVBfQURBUFRFUgkJcEFkOwotCXB1cmJiX3QJCQkJcFVyYjsKLQlQT1NfQ09PS0lFCQkJcE9iajsKLQlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OwotCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQ7Ci0JTlRTVEFUVVMJCQlTdGF0dXM7Ci0JdW5zaWduZWQgbG9uZwkJSXJxRmxhZ3M7Ci0KLQotCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7Ci0JcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7Ci0JcEFkCQkJCT0gcEhUVFhDb250ZXh0LT5wQWQ7Ci0JcE9iaiAJCQk9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQlTdGF0dXMJCQk9IHBVcmItPnN0YXR1czsKLQotCS8vIFN0b3JlIEJ1bGtPdXQgUGlwZUlkCi0JQnVsa091dFBpcGVJZCA9IHBIVFRYQ29udGV4dC0+QnVsa091dFBpcGVJZDsKLQlwQWQtPkJ1bGtPdXREYXRhT25lU2VjQ291bnQrKzsKLQotCS8vREJHUFJJTlQoUlRfREVCVUdfTE9VRCwgKCJEb25lLUIoJWQpOkk9MHglbHgsIENXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCFcbiIsIEJ1bGtPdXRQaXBlSWQsIGluX2ludGVycnVwdCgpLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sCi0JLy8JCXBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpKTsKLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKLQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7Ci0JcEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7Ci0JcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtCdWxrT3V0UGlwZUlkXSA9IDA7Ci0KLQlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQotCXsKLQkJcEFkLT5CdWxrT3V0Q29tcGxldGUrKzsKLQotCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKLQotCQlwQWQtPkNvdW50ZXJzODAyMy5Hb29kVHJhbnNtaXRzKys7Ci0JCS8vUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKLQkJRlJFRV9IVFRYX1JJTkcocEFkLCBCdWxrT3V0UGlwZUlkLCBwSFRUWENvbnRleHQpOwotCQkvL1JUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKLQotCi0JfQotCWVsc2UJLy8gU1RBVFVTX09USEVSCi0JewotCQlQVUNIQVIJcEJ1ZjsKLQotCQlwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKys7Ci0KLQkJcEJ1ZiA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb25dOwotCi0JCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwKLQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQotCQl7Ci0JCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKLQkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0gQnVsa091dFBpcGVJZDsKLQkJCXBBZC0+YnVsa1Jlc2V0UmVxW0J1bGtPdXRQaXBlSWRdID0gcEFkLT5CdWxrT3V0UmVxOwotCQl9Ci0JCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwotCi0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrT3V0RGF0YVBhY2tldCBmYWlsZWQ6IFJlYXNvbkNvZGU9JWQhXG4iLCBTdGF0dXMpKTsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlx0Pj5CdWxrT3V0IFJlcT0weCVseCwgQ29tcGxldGU9MHglbHgsIE90aGVyPTB4JWx4XG4iLCBwQWQtPkJ1bGtPdXRSZXEsIHBBZC0+QnVsa091dENvbXBsZXRlLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKSk7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJcdD4+QnVsa091dCBIZWFkZXI6JXggJXggJXggJXggJXggJXggJXggJXhcbiIsIHBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0sIHBCdWZbM10sIHBCdWZbNF0sIHBCdWZbNV0sIHBCdWZbNl0sIHBCdWZbN10pKTsKLQkJLy9EQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPj5CdWxrT3V0Q29tcGxldGVDYW5jZWw9MHgleCwgQnVsa091dENvbXBsZXRlT3RoZXI9MHgleFxuIiwgcEFkLT5CdWxrT3V0Q29tcGxldGVDYW5jZWwsIHBBZC0+QnVsa091dENvbXBsZXRlT3RoZXIpKTsKLQotCX0KLQotCS8vCi0JLy8gYkluVXNlID0gVFJVRSwgbWVhbnMgc29tZSBwcm9jZXNzIGFyZSBmaWxsaW5nIFRYIGRhdGEsIGFmdGVyIHRoYXQgbXVzdCB0dXJuIG9uIGJXYWl0aW5nQnVsa091dAotCS8vIGJXYWl0aW5nQnVsa091dCA9IFRSVUUsIG1lYW5zIHRoZSBUWCBkYXRhIGFyZSB3YWl0aW5nIGZvciBidWxrIG91dC4KLQkvLwotCS8vUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKLQlpZiAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gIT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSAmJgotCQkocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPSAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKzgpKSAmJgotCQkhUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBRyA8PCBCdWxrT3V0UGlwZUlkKSkpCi0JewotCQkvLyBJbmRpY2F0ZSBUaGVyZSBpcyBkYXRhIGF2YWxpYWJsZQotCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBCdWxrT3V0UGlwZUlkKSk7Ci0JfQotCS8vUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwotCi0JLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCi0JLy8gVGhlIHByb3RlY3Rpb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKLQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Ci19Ci0KLS8qIEVuZCBvZiAyODcwX3J0bXBfaW5pdC5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9hY2N0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9hY2N0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4MDZjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2FjY3Rpb24uYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NvbW1vbi9hY3Rpb24uYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9hZXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9hZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWQ2YTE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2Flcy5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi8uLi9ydDI4NjAvY29tbW9uL2NtbV9hZXMuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9hc2ljLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fYXNpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZGU4MTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fYXNpYy5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi8uLi9ydDI4NjAvY29tbW9uL2NtbV9hc2ljLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fY2ZnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fY2ZnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyYmRkNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9jZmcuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NvbW1vbi9jbW1fY2ZnLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fZGF0YV8yODcwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fZGF0YV8yODcwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNjNhNDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2RhdGFfMjg3MC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTM2ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qCi0gICBBbGwgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBtdXN0IGJlIFVTQi1kZXBlbmRlZCwgb3IgeW91IHNob3VsZCBvdXQgeW91ciBmdW5jdGlvbgotCWluIG90aGVyIGZpbGVzLgotCi0qLwotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLS8qCi0JV2UgY2FuIGRvIGNvcHkgdGhlIGZyYW1lIGludG8gcFR4Q29udGV4dCB3aGVuIG1hdGNoIGZvbGxvd2luZyBjb25kaXRpb25zLgotCQk9PgotCQk9PgotCQk9PgotKi8KLXN0YXRpYyBpbmxpbmUgTkRJU19TVEFUVVMgUnRtcFVTQkNhbkRvV3JpdGUoCi0JSU4gUlRNUF9BREFQVEVSCQkqcEFkLAotCUlOIFVDSEFSCQkJUXVlSWR4LAotCUlOIEhUX1RYX0NPTlRFWFQgCSpwSFRUWENvbnRleHQpCi17Ci0JTkRJU19TVEFUVVMJY2FuV3JpdGUgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0KLQlpZiAoKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pIDwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSAmJiAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgTE9DQUxfVFhCVUZfU0laRSkgPiBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlJ0bXBVU0JDYW5Eb1dyaXRlIGMxIVxuIikpOwotCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBRdWVJZHgpKTsKLQl9Ci0JZWxzZSBpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9PSA4KSAmJiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uIDwgTE9DQUxfVFhCVUZfU0laRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlJ0bXBVU0JDYW5Eb1dyaXRlIGMyIVxuIikpOwotCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBRdWVJZHgpKTsKLQl9Ci0JZWxzZSBpZiAocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBUUlVFKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJSdG1wVVNCQ2FuRG9Xcml0ZSBjMyFcbiIpKTsKLQl9Ci0JZWxzZQotCXsKLQkJY2FuV3JpdGUgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCX0KLQotCi0JcmV0dXJuIGNhbldyaXRlOwotfQotCi0KLVVTSE9SVCBSdG1wVVNCX1dyaXRlU3ViVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCUJPT0xFQU4JCQliSXNMYXN0LAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKLXsKLQotCS8vIER1bW15IGZ1bmN0aW9uLiBTaG91bGQgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCXJldHVybiAwOwotCi19Ci0KLVVTSE9SVAlSdG1wVVNCX1dyaXRlRnJhZ1R4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYWdOdW0sCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQotewotCUhUX1RYX0NPTlRFWFQJKnBIVFRYQ29udGV4dDsKLQlVU0hPUlQJCQlod0hkckxlbjsJLy8gVGhlIGh3SGRyTGVuIGNvbnNpc3Qgb2YgODAyLjExIGhlYWRlciBsZW5ndGggcGx1cyB0aGUgaGVhZGVyIHBhZGRpbmcgbGVuZ3RoLgotCVVJTlQzMgkJCWZpbGxPZmZzZXQ7Ci0JVFhJTkZPX1NUUlVDCSpwVHhJbmZvOwotCVRYV0lfU1RSVUMJCSpwVHhXSTsKLQlQVUNIQVIJCQlwV2lyZWxlc3NQYWNrZXQgPSBOVUxMOwotCVVDSEFSCQkJUXVlSWR4OwotCU5ESVNfU1RBVFVTCQlTdGF0dXM7Ci0JdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKLQlVSU5UMzIJCQlVU0JETUFwa3RMZW4gPSAwLCBETUFIZHJMZW4sIHBhZGRpbmc7Ci0JQk9PTEVBTgkJCVR4UUxhc3RSb3VuZCA9IEZBTFNFOwotCi0JLy8KLQkvLyBnZXQgVHggUmluZyBSZXNvdXJjZSAmIERtYSBCdWZmZXIgYWRkcmVzcwotCS8vCi0JUXVlSWR4ID0gcFR4QmxrLT5RdWVJZHg7Ci0JcEhUVFhDb250ZXh0ICA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOwotCi0JUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOwotCi0JcEhUVFhDb250ZXh0ICA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOwotCWZpbGxPZmZzZXQgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247Ci0KLQlpZihmcmFnTnVtID09IDApCi0JewotCQkvLyBDaGVjayBpZiB3ZSBoYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhpcyBidWxrLW91dCBiYXRjaC4KLQkJU3RhdHVzID0gUnRtcFVTQkNhbkRvV3JpdGUocEFkLCBRdWVJZHgsIHBIVFRYQ29udGV4dCk7Ci0JCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IFRSVUU7Ci0KLQkJCS8vIFJlc2VydmUgc3BhY2UgZm9yIDggYnl0ZXMgcGFkZGluZy4KLQkJCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQotCQkJewotCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gKz0gODsKLQkJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gODsKLQkJCQlmaWxsT2Zmc2V0ICs9IDg7Ci0JCQl9Ci0JCQlwVHhCbGstPlByaXYgPSAwOwotCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKLQotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQlyZXR1cm4oU3RhdHVzKTsKLQkJfQotCX0KLQllbHNlCi0JewotCQkvLyBGb3Igc3ViLXNlcXVlbnQgZnJhbWVzIG9mIHRoaXMgYnVsay1vdXQgYmF0Y2guIEp1c3QgY29weSBpdCB0byBvdXIgYnVsay1vdXQgYnVmZmVyLgotCQlTdGF0dXMgPSAoKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkgPyBORElTX1NUQVRVU19TVUNDRVNTIDogTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJZmlsbE9mZnNldCArPSBwVHhCbGstPlByaXY7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKLQotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQlyZXR1cm4oU3RhdHVzKTsKLQkJfQotCX0KLQotCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpKCZwVHhCbGstPkhlYWRlckJ1ZlswXSksIFRYSU5GT19TSVpFKTsKLQlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZlswXSk7Ci0JcFR4V0k9IChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSk7Ci0KLQlwV2lyZWxlc3NQYWNrZXQgPSAmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbZmlsbE9mZnNldF07Ci0KLQkvLyBjb3B5IFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCi0JLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7Ci0JaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKLQotCS8vIEJ1aWxkIG91ciBVUkIgZm9yIFVTQkQKLQlETUFIZHJMZW4gPSBUWFdJX1NJWkUgKyBod0hkckxlbjsKLQlVU0JETUFwa3RMZW4gPSBETUFIZHJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKLQlwYWRkaW5nID0gKDQgLSAoVVNCRE1BcGt0TGVuICUgNCkpICYgMHgwMzsJLy8gcm91bmQgdXAgdG8gNCBieXRlIGFsaWdubWVudAotCVVTQkRNQXBrdExlbiArPSBwYWRkaW5nOwotCi0JcFR4QmxrLT5Qcml2ICs9IChUWElORk9fU0laRSArIFVTQkRNQXBrdExlbik7Ci0KLQkvLyBGb3IgVHhJbmZvLCB0aGUgbGVuZ3RoIG9mIFVTQkRNQXBrdExlbiA9IFRYV0lfU0laRSArIDgwMi4xMSBoZWFkZXIgKyBwYXlsb2FkCi0JUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkoVVNCRE1BcGt0TGVuKSwgRkFMU0UsIEZJRk9fRURDQSwgRkFMU0UgLypOZXh0VmFsaWQqLywgIEZBTFNFKTsKLQotCWlmIChmcmFnTnVtID09IHBUeEJsay0+VG90YWxGcmFnTnVtKQotCXsKLQkJcFR4SW5mby0+VVNCRE1BVHhidXJzdCA9IDA7Ci0JCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgcFR4QmxrLT5Qcml2ICsgMzkwNik+IE1BWF9UWEJVTEtfTElNSVQpCi0JCXsKLQkJCXBUeEluZm8tPlN3VXNlTGFzdFJvdW5kID0gMTsKLQkJCVR4UUxhc3RSb3VuZCA9IFRSVUU7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJcFR4SW5mby0+VVNCRE1BVHhidXJzdCA9IDE7Ci0JfQotCi0JTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPkhlYWRlckJ1ZiwgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7Ci0JcFdpcmVsZXNzUGFja2V0ICs9IChUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuKTsKLQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyArPSAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7Ci0KLQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKLQotCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5wU3JjQnVmRGF0YSwgcFR4QmxrLT5TcmNCdWZMZW4pOwotCi0JLy8JWmVybyB0aGUgbGFzdCBwYWRkaW5nLgotCXBXaXJlbGVzc1BhY2tldCArPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQlOZGlzWmVyb01lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBhZGRpbmcgKyA4KTsKLQotCWlmIChmcmFnTnVtID09IHBUeEJsay0+VG90YWxGcmFnTnVtKQotCXsKLQkJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOwotCi0JCS8vIFVwZGF0ZSB0aGUgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLiAzOTA2IHVzZWQgdG8gcHJldmVudCB0aGUgTmV4dEJ1bGtPdXQgaXMgYSBBLVJBTElOSy9BLU1TRFUgRnJhbWUuCi0JCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSBwVHhCbGstPlByaXY7Ci0JCWlmIChUeFFMYXN0Um91bmQgPT0gVFJVRSkKLQkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9IDg7Ci0JCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOwotCi0KLQkJLy8gRmluYWxseSwgc2V0IGJDdXJXcml0aW5nIGFzIEZBTFNFCi0JcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IEZBTFNFOwotCi0JCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOwotCi0JCS8vIHN1Y2NlZWQgYW5kIHJlbGVhc2UgdGhlIHNrYiBidWZmZXIKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JfQotCi0KLQlyZXR1cm4oU3RhdHVzKTsKLQotfQotCi0KLVVTSE9SVCBSdG1wVVNCX1dyaXRlU2luZ2xlVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCUJPT0xFQU4JCQliSXNMYXN0LAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKLXsKLQlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7Ci0JVVNIT1JUCQkJaHdIZHJMZW47Ci0JVUlOVDMyCQkJZmlsbE9mZnNldDsKLQlUWElORk9fU1RSVUMJKnBUeEluZm87Ci0JVFhXSV9TVFJVQwkJKnBUeFdJOwotCVBVQ0hBUgkJCXBXaXJlbGVzc1BhY2tldDsKLQlVQ0hBUgkJCVF1ZUlkeDsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOwotCU5ESVNfU1RBVFVTCQlTdGF0dXM7Ci0JVUlOVDMyCQkJVVNCRE1BcGt0TGVuID0gMCwgRE1BSGRyTGVuLCBwYWRkaW5nOwotCUJPT0xFQU4JCQliVHhRTGFzdFJvdW5kID0gRkFMU0U7Ci0KLQkvLyBGb3IgVVNCLCBkaWRuJ3QgbmVlZCBQQ0lfTUFQX1NJTkdMRSgpCi0JLy9TcmNCdWZQQSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgKGNoYXIgKikgcFR4QmxrLT5wU3JjQnVmRGF0YSwgcFR4QmxrLT5TcmNCdWZMZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwotCi0KLQkvLwotCS8vIGdldCBUeCBSaW5nIFJlc291cmNlICYgRG1hIEJ1ZmZlciBhZGRyZXNzCi0JLy8KLQlRdWVJZHggPSBwVHhCbGstPlF1ZUlkeDsKLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKLQlwSFRUWENvbnRleHQgID0gJnBBZC0+VHhDb250ZXh0W1F1ZUlkeF07Ci0JZmlsbE9mZnNldCA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKLQotCi0KLQkvLyBDaGVjayByaW5nIGZ1bGwuCi0JU3RhdHVzID0gUnRtcFVTQkNhbkRvV3JpdGUocEFkLCBRdWVJZHgsIHBIVFRYQ29udGV4dCk7Ci0JaWYoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gVFJVRTsKLQotCQlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZlswXSk7Ci0JCXBUeFdJPSAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pOwotCi0JCS8vIFJlc2VydmUgc3BhY2UgZm9yIDggYnl0ZXMgcGFkZGluZy4KLQkJaWYgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCi0JCXsKLQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gKz0gODsKLQkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSA4OwotCQkJZmlsbE9mZnNldCArPSA4OwotCQl9Ci0JCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOwotCi0JCXBXaXJlbGVzc1BhY2tldCA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XTsKLQotCQkvLyBjb3B5IFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCi0JCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4sIDQpOwotCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOwotCi0JCS8vIEJ1aWxkIG91ciBVUkIgZm9yIFVTQkQKLQkJRE1BSGRyTGVuID0gVFhXSV9TSVpFICsgaHdIZHJMZW47Ci0JCVVTQkRNQXBrdExlbiA9IERNQUhkckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOwotCQlwYWRkaW5nID0gKDQgLSAoVVNCRE1BcGt0TGVuICUgNCkpICYgMHgwMzsJLy8gcm91bmQgdXAgdG8gNCBieXRlIGFsaWdubWVudAotCQlVU0JETUFwa3RMZW4gKz0gcGFkZGluZzsKLQotCQlwVHhCbGstPlByaXYgPSAoVFhJTkZPX1NJWkUgKyBVU0JETUFwa3RMZW4pOwotCi0JCS8vIEZvciBUeEluZm8sIHRoZSBsZW5ndGggb2YgVVNCRE1BcGt0TGVuID0gVFhXSV9TSVpFICsgODAyLjExIGhlYWRlciArIHBheWxvYWQKLQkJLy9QUyBwYWNrZXRzIHVzZSBIQ0NBIHF1ZXVlIHdoZW4gZGVxdWV1ZSBmcm9tIFBTIHVuaWNhc3QgcXVldWUgKFdpRmkgV1BBMiBNQTlfRFQxIGZvciBNYXJ2ZWxsIEIgU1RBKQotCQlSVE1QV3JpdGVUeEluZm8ocEFkLCBwVHhJbmZvLCAoVVNIT1JUKShVU0JETUFwa3RMZW4pLCBGQUxTRSwgRklGT19FRENBLCBGQUxTRSAvKk5leHRWYWxpZCovLCAgRkFMU0UpOwotCi0JCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgMzkwNiArIHBUeEJsay0+UHJpdikgPiBNQVhfVFhCVUxLX0xJTUlUKQotCQl7Ci0JCQlwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9IDE7Ci0JCQliVHhRTGFzdFJvdW5kID0gVFJVRTsKLQkJfQotCQlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+SGVhZGVyQnVmLCBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuKTsKLQkJcFdpcmVsZXNzUGFja2V0ICs9IChUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuKTsKLQotCQkvLyBXZSB1bmxvY2sgaXQgaGVyZSB0byBwcmV2ZW50IHRoZSBmaXJzdCA4IGJ5dGVzIG1heWJlIG92ZXItd3JpdGVkIGlzc3VlLgotCQkvLwkxLiBGaXJzdCB3ZSBnb3QgQ3VyV3JpdGVQb3NpdGlvbiBidXQgdGhlIGZpcnN0IDggYnl0ZXMgc3RpbGwgbm90IHdyaXRlIHRvIHRoZSBwVHhjb250ZXh0LgotCQkvLwkyLiBBbiBpbnRlcnJ1cHQgYnJlYWsgb3VyIHJvdXRpbmUgYW5kIGhhbmRsZSBidWxrLW91dCBjb21wbGV0ZS4KLQkJLy8JMy4gSW4gdGhlIGJ1bGstb3V0IGNvbXBsbGV0ZSwgaXQgbmVlZCB0byBkbyBhbm90aGVyIGJ1bGstb3V0LAotCQkvLwkJCWlmIHRoZSBFTmV4dEJ1bGtPdXRQb3NpdGlvbiBpcyBqdXN0IHRoZSBzYW1lIGFzIEN1cldyaXRlUG9zaXRpb24sIGl0IHdpbGwgc2F2ZSB0aGUgZmlyc3QgOCBieXRlcyBmcm9tIEN1cldyaXRlUG9zaXRpb24sCi0JCS8vCQkJYnV0IHRoZSBwYXlsb2FkIHN0aWxsIG5vdCBjb3B5ZWQuIHRoZSBwVHhDb250ZXh0LT5TYXZlZFBhZFtdIHdpbGwgc2F2ZSBhcyBhbGx6ZXJvLiBhbmQgc2V0IHRoZSBiQ29weVBhZCA9IFRSVUUuCi0JCS8vCTQuIEludGVycnVwdCBjb21wbGV0ZS4KLQkJLy8gIDUuIE91ciBpbnRlcnJ1cHRlZCByb3V0aW5lIGdvIGJhY2sgYW5kIGZpbGwgdGhlIGZpcnN0IDggYnl0ZXMgdG8gcFR4Q29udGV4dC4KLQkJLy8JNi4gTmV4dCB0aW1lIHdoZW4gZG8gYnVsay1vdXQsIGl0IGZvdW5kIHRoZSBiQ29weVBhZD09VFJVRSBhbmQgd2lsbCBjb3B5IHRoZSBTYXZlZFBhZFtdIHRvIHBUeENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24uCi0JCS8vCQlhbmQgdGhlIHBhY2tldCB3aWxsIHdyb25nLgotCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyArPSAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7Ci0JCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOwotCi0JCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5wU3JjQnVmRGF0YSwgcFR4QmxrLT5TcmNCdWZMZW4pOwotCQlwV2lyZWxlc3NQYWNrZXQgKz0gcFR4QmxrLT5TcmNCdWZMZW47Ci0JCU5kaXNaZXJvTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcGFkZGluZyArIDgpOwotCi0JCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKLQotCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gcFR4QmxrLT5Qcml2OwotCQlpZiAoYlR4UUxhc3RSb3VuZCkKLQkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9IDg7Ci0JCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOwotCi0JcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IEZBTFNFOwotCX0KLQotCi0JUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7Ci0KLQotCS8vIHN1Y2NlZWQgYW5kIHJlbGVhc2UgdGhlIHNrYiBidWZmZXIKLQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybihTdGF0dXMpOwotCi19Ci0KLQotVVNIT1JUIFJ0bXBVU0JfV3JpdGVNdWx0aVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYW1lTnVtLAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKLXsKLQlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7Ci0JVVNIT1JUCQkJaHdIZHJMZW47CS8vIFRoZSBod0hkckxlbiBjb25zaXN0IG9mIDgwMi4xMSBoZWFkZXIgbGVuZ3RoIHBsdXMgdGhlIGhlYWRlciBwYWRkaW5nIGxlbmd0aC4KLQlVSU5UMzIJCQlmaWxsT2Zmc2V0OwotCVRYSU5GT19TVFJVQwkqcFR4SW5mbzsKLQlUWFdJX1NUUlVDCQkqcFR4V0k7Ci0JUFVDSEFSCQkJcFdpcmVsZXNzUGFja2V0ID0gTlVMTDsKLQlVQ0hBUgkJCVF1ZUlkeDsKLQlORElTX1NUQVRVUwkJU3RhdHVzOwotCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7Ci0JLy9VSU5UMzIJCQlVU0JETUFwa3RMZW4gPSAwLCBETUFIZHJMZW4sIHBhZGRpbmc7Ci0KLQkvLwotCS8vIGdldCBUeCBSaW5nIFJlc291cmNlICYgRG1hIEJ1ZmZlciBhZGRyZXNzCi0JLy8KLQlRdWVJZHggPSBwVHhCbGstPlF1ZUlkeDsKLQlwSFRUWENvbnRleHQgID0gJnBBZC0+VHhDb250ZXh0W1F1ZUlkeF07Ci0KLQlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7Ci0KLQlpZihmcmFtZU51bSA9PSAwKQotCXsKLQkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIHRoaXMgYnVsay1vdXQgYmF0Y2guCi0JCVN0YXR1cyA9IFJ0bXBVU0JDYW5Eb1dyaXRlKHBBZCwgUXVlSWR4LCBwSFRUWENvbnRleHQpOwotCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBUUlVFOwotCi0JCQlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZlswXSk7Ci0JCQlwVHhXST0gKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKTsKLQotCi0JCQkvLyBSZXNlcnZlIHNwYWNlIGZvciA4IGJ5dGVzIHBhZGRpbmcuCi0JCQlpZiAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkKLQkJCXsKLQotCQkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSA4OwotCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gKz0gODsKLQkJCX0KLQkJCWZpbGxPZmZzZXQgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247Ci0JCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKLQotCQkJcFdpcmVsZXNzUGFja2V0ID0gJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W2ZpbGxPZmZzZXRdOwotCi0JCQkvLwotCQkJLy8gQ29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlcgotCQkJLy8KLQkJCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKQotCQkJCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCwgNCkrTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKLQkJCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsgcFR4QmxrLT5IZHJQYWRMZW4gKyBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOwotCQkJZWxzZSBpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpCi0JCQkJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQsIDQpK0xFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRDsKLQkJCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQgKyBwVHhCbGstPkhkclBhZExlbiArIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRDsKLQkJCWVsc2UKLQkJCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsKLQkJCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOwotCi0JCQkvLyBVcGRhdGUgdGhlIHBUeEJsay0+UHJpdi4KLQkJCXBUeEJsay0+UHJpdiA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW47Ci0KLQkJCS8vCXBUeEluZm8tPlVTQkRNQXBrdExlbiBub3cganVzdCBhIHRlbXAgdmFsdWUgYW5kIHdpbGwgdG8gY29ycmVjdCBsYXR0ZXIuCi0JCQlSVE1QV3JpdGVUeEluZm8ocEFkLCBwVHhJbmZvLCAoVVNIT1JUKShwVHhCbGstPlByaXYpLCBGQUxTRSwgRklGT19FRENBLCBGQUxTRSAvKk5leHRWYWxpZCovLCAgRkFMU0UpOwotCi0JCQkvLyBDb3B5IGl0LgotCQkJTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPkhlYWRlckJ1ZiwgcFR4QmxrLT5Qcml2KTsKLQkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zICs9IHBUeEJsay0+UHJpdjsKLQkJCXBXaXJlbGVzc1BhY2tldCArPSBwVHhCbGstPlByaXY7Ci0JCX0KLQl9Ci0JZWxzZQotCXsJLy8gRm9yIHN1Yi1zZXF1ZW50IGZyYW1lcyBvZiB0aGlzIGJ1bGstb3V0IGJhdGNoLiBKdXN0IGNvcHkgaXQgdG8gb3VyIGJ1bGstb3V0IGJ1ZmZlci4KLQotCQlTdGF0dXMgPSAoKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkgPyBORElTX1NUQVRVU19TVUNDRVNTIDogTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJZmlsbE9mZnNldCA9ICAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgcFR4QmxrLT5Qcml2KTsKLQkJCXBXaXJlbGVzc1BhY2tldCA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XTsKLQotCQkJLy9od0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5IZWFkZXJCdWYsIHBUeEJsay0+TXBkdUhlYWRlckxlbik7Ci0JCQlwV2lyZWxlc3NQYWNrZXQgKz0gKHBUeEJsay0+TXBkdUhlYWRlckxlbik7Ci0JCQlwVHhCbGstPlByaXYgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOwotCQl9Ci0JCWVsc2UKLQkJewkvLyBJdCBzaG91bGQgbm90IGhhcHBlbmVkIG5vdyB1bmxlc3Mgd2UgYXJlIGdvaW5nIHRvIHNodXRkb3duLgotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3JpdGVNdWx0aVR4UmVzb3VyY2UoKTpiQ3VyV3JpdGluZyBpcyBGQUxTRSB3aGVuIGhhbmRsZSBzdWItc2VxdWVudCBmcmFtZXMuXG4iKSk7Ci0JCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCQl9Ci0JfQotCi0KLQkvLyBXZSB1bmxvY2sgaXQgaGVyZSB0byBwcmV2ZW50IHRoZSBmaXJzdCA4IGJ5dGVzIG1heWJlIG92ZXItd3JpdGUgaXNzdWUuCi0JLy8JMS4gRmlyc3Qgd2UgZ290IEN1cldyaXRlUG9zaXRpb24gYnV0IHRoZSBmaXJzdCA4IGJ5dGVzIHN0aWxsIG5vdCB3cml0ZSB0byB0aGUgcFR4Q29udGV4dC4KLQkvLwkyLiBBbiBpbnRlcnJ1cHQgYnJlYWsgb3VyIHJvdXRpbmUgYW5kIGhhbmRsZSBidWxrLW91dCBjb21wbGV0ZS4KLQkvLwkzLiBJbiB0aGUgYnVsay1vdXQgY29tcGxsZXRlLCBpdCBuZWVkIHRvIGRvIGFub3RoZXIgYnVsay1vdXQsCi0JLy8JCQlpZiB0aGUgRU5leHRCdWxrT3V0UG9zaXRpb24gaXMganVzdCB0aGUgc2FtZSBhcyBDdXJXcml0ZVBvc2l0aW9uLCBpdCB3aWxsIHNhdmUgdGhlIGZpcnN0IDggYnl0ZXMgZnJvbSBDdXJXcml0ZVBvc2l0aW9uLAotCS8vCQkJYnV0IHRoZSBwYXlsb2FkIHN0aWxsIG5vdCBjb3B5ZWQuIHRoZSBwVHhDb250ZXh0LT5TYXZlZFBhZFtdIHdpbGwgc2F2ZSBhcyBhbGx6ZXJvLiBhbmQgc2V0IHRoZSBiQ29weVBhZCA9IFRSVUUuCi0JLy8JNC4gSW50ZXJydXB0IGNvbXBsZXRlLgotCS8vICA1LiBPdXIgaW50ZXJydXB0ZWQgcm91dGluZSBnbyBiYWNrIGFuZCBmaWxsIHRoZSBmaXJzdCA4IGJ5dGVzIHRvIHBUeENvbnRleHQuCi0JLy8JNi4gTmV4dCB0aW1lIHdoZW4gZG8gYnVsay1vdXQsIGl0IGZvdW5kIHRoZSBiQ29weVBhZD09VFJVRSBhbmQgd2lsbCBjb3B5IHRoZSBTYXZlZFBhZFtdIHRvIHBUeENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24uCi0JLy8JCWFuZCB0aGUgcGFja2V0IHdpbGwgd3JvbmcuCi0JUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7Ci0KLQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIldyaXRlTXVsdGlUeFJlc291cmNlOiBDV1BvcyA9ICVsZCwgTkJPdXRQb3MgPSAlbGQuXG4iLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLy8gQ29weSB0aGUgZnJhbWUgY29udGVudCBpbnRvIERNQSBidWZmZXIgYW5kIHVwZGF0ZSB0aGUgcFR4QmxrLT5Qcml2Ci0JTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPnBTcmNCdWZEYXRhLCBwVHhCbGstPlNyY0J1Zkxlbik7Ci0JcFdpcmVsZXNzUGFja2V0ICs9IHBUeEJsay0+U3JjQnVmTGVuOwotCXBUeEJsay0+UHJpdiArPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQotZG9uZToKLQkvLyBSZWxlYXNlIHRoZSBza2IgYnVmZmVyIGhlcmUKLQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybihTdGF0dXMpOwotCi19Ci0KLQotVk9JRCBSdG1wVVNCX0ZpbmFsV3JpdGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVVNIT1JUCQkJdG90YWxNUERVU2l6ZSwKLQlJTglVU0hPUlQJCQlUeElkeCkKLXsKLQlVQ0hBUgkJCVF1ZUlkeDsKLQlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7Ci0JVUlOVDMyCQkJZmlsbE9mZnNldDsKLQlUWElORk9fU1RSVUMJKnBUeEluZm87Ci0JVFhXSV9TVFJVQwkJKnBUeFdJOwotCVVJTlQzMgkJCVVTQkRNQXBrdExlbiwgcGFkZGluZzsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOwotCVBVQ0hBUgkJCXBXaXJlbGVzc1BhY2tldDsKLQotCVF1ZUlkeCA9IHBUeEJsay0+UXVlSWR4OwotCXBIVFRYQ29udGV4dCAgPSAmcEFkLT5UeENvbnRleHRbUXVlSWR4XTsKLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKLQotCWlmIChwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IFRSVUUpCi0JewotCQlmaWxsT2Zmc2V0ID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOwotCQlpZiAoKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikgfHwgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLTgpID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCi0JCQkmJiAocEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPT0gVFJVRSkpCi0JCQlwV2lyZWxlc3NQYWNrZXQgPSAoUFVDSEFSKSgmcEhUVFhDb250ZXh0LT5TYXZlZFBhZFswXSk7Ci0JCWVsc2UKLQkJCXBXaXJlbGVzc1BhY2tldCA9IChQVUNIQVIpKCZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XSk7Ci0KLQkJLy8KLQkJLy8gVXBkYXRlIFR4SW5mby0+VVNCRE1BcGt0TGVuICwKLQkJLy8JCXRoZSBsZW5ndGggPSBUWFdJX1NJWkUgKyA4MDIuMTFfaGRyICsgODAyLjExX2hkcl9wYWQgKyBwYXlsb2FkX29mX2FsbF9iYXRjaF9mcmFtZXMgKyBCdWxrLU91dC1wYWRkaW5nCi0JCS8vCi0JCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQykocFdpcmVsZXNzUGFja2V0KTsKLQotCQkvLyBDYWxjdWxhdGUgdGhlIGJ1bGstb3V0IHBhZGRpbmcKLQkJVVNCRE1BcGt0TGVuID0gcFR4QmxrLT5Qcml2IC0gVFhJTkZPX1NJWkU7Ci0JCXBhZGRpbmcgPSAoNCAtIChVU0JETUFwa3RMZW4gJSA0KSkgJiAweDAzOwkvLyByb3VuZCB1cCB0byA0IGJ5dGUgYWxpZ25tZW50Ci0JCVVTQkRNQXBrdExlbiArPSBwYWRkaW5nOwotCi0JCXBUeEluZm8tPlVTQkRNQVR4UGt0TGVuID0gVVNCRE1BcGt0TGVuOwotCi0JCS8vCi0JCS8vIFVwZGF0ZSBUWFdJLT5NUERVdG90YWxCeXRlQ291bnQgLAotCQkvLwkJdGhlIGxlbmd0aCA9IDgwMi4xMSBoZWFkZXIgKyBwYXlsb2FkX29mX2FsbF9iYXRjaF9mcmFtZXMKLQkJcFR4V0k9IChQVFhXSV9TVFJVQykocFdpcmVsZXNzUGFja2V0ICsgVFhJTkZPX1NJWkUpOwotCQlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gdG90YWxNUERVU2l6ZTsKLQotCQkvLwotCQkvLyBVcGRhdGUgdGhlIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbgotCQkvLwotCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gKFRYSU5GT19TSVpFICsgVVNCRE1BcGt0TGVuKTsKLQkJaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAzOTA2KT4gTUFYX1RYQlVMS19MSU1JVCkKLQkJewkvLyBBZGQgMzkwNiBmb3IgcHJldmVudCB0aGUgTmV4dEJ1bGtPdXQgcGFja2V0IHNpemUgaXMgYSBBLVJBTElOSy9BLU1TRFUgRnJhbWUuCi0JCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSA4OwotCQkJcFR4SW5mby0+U3dVc2VMYXN0Um91bmQgPSAxOwotCQl9Ci0JCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOwotCi0KLQkJLy8KLQkJLy8JWmVybyB0aGUgbGFzdCBwYWRkaW5nLgotCQkvLwotCQlwV2lyZWxlc3NQYWNrZXQgPSAoJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W2ZpbGxPZmZzZXQgKyBwVHhCbGstPlByaXZdKTsKLQkJTmRpc1plcm9NZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwYWRkaW5nICsgOCk7Ci0KLQkJLy8gRmluYWxseSwgc2V0IGJDdXJXcml0aW5nIGFzIEZBTFNFCi0JCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBGQUxTRTsKLQotCX0KLQllbHNlCi0JewkvLyBJdCBzaG91bGQgbm90IGhhcHBlbmVkIG5vdyB1bmxlc3Mgd2UgYXJlIGdvaW5nIHRvIHNodXRkb3duLgotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJGaW5hbFdyaXRlVHhSZXNvdXJjZSgpOmJDdXJXcml0aW5nIGlzIEZBTFNFIHdoZW4gaGFuZGxlIGxhc3QgZnJhbWVzLlxuIikpOwotCX0KLQotCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOwotCi19Ci0KLQotVk9JRCBSdG1wVVNCRGF0YUxhc3RUeElkeCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglVU0hPUlQJCQlUeElkeCkKLXsKLQkvLyBETyBub3RoaW5nIGZvciBVU0IuCi19Ci0KLQotLyoKLQlXaGVuIGNhbiBkbyBidWxrLW91dDoKLQkJMS4gVHhTd0ZyZWVJZHggPCBUWF9SSU5HX1NJWkU7Ci0JCQlJdCBtZWFucyBoYXMgYXQgbGVhc3Qgb25lIFJpbmcgZW50aXR5IGlzIHJlYWR5IGZvciBidWxrLW91dCwga2ljayBpdCBvdXQuCi0JCTIuIElmIFR4U3dGcmVlSWR4ID09IFRYX1JJTkdfU0laRQotCQkJQ2hlY2sgaWYgdGhlIEN1cldyaXRpbmcgZmxhZyBpcyBGQUxTRSwgaWYgaXQncyBGQUxTRSwgd2UgY2FuIGRvIGtpY2sgb3V0LgotCi0qLwotVk9JRCBSdG1wVVNCRGF0YUtpY2tPdXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCVF1ZUlkeCkKLXsKLQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBRdWVJZHgpKTsKLQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Ci0KLX0KLQotCi0vKgotCU11c3QgYmUgcnVuIGluIEludGVycnVwdCBjb250ZXh0Ci0JVGhpcyBmdW5jdGlvbiBoYW5kbGUgUlQyODcwIHNwZWNpZmljIFR4RGVzYyBhbmQgY3B1IGluZGV4IHVwZGF0ZSBhbmQga2ljayB0aGUgcGFja2V0IG91dC4KLSAqLwotaW50IFJ0bXBVU0JNZ210S2lja091dCgKLQlJTiBSVE1QX0FEQVBURVIgCSpwQWQsCi0JSU4gVUNIQVIgCQkJUXVlSWR4LAotCUlOIFBORElTX1BBQ0tFVAkJcFBhY2tldCwKLQlJTiBQVUNIQVIJCQlwU3JjQnVmVkEsCi0JSU4gVUlOVCAJCQlTcmNCdWZMZW4pCi17Ci0JUFRYSU5GT19TVFJVQwlwVHhJbmZvOwotCVVMT05HCQkJQnVsa091dFNpemU7Ci0JVUNIQVIJCQlwYWRMZW47Ci0JUFVDSEFSCQkJcERlc3Q7Ci0JVUxPTkcJCQlTd0lkeCA9IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHg7Ci0JUFRYX0NPTlRFWFQJCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVClwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLkFsbG9jVmE7Ci0JdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKLQotCi0JcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKShwU3JjQnVmVkEpOwotCi0JLy8gQnVpbGQgb3VyIFVSQiBmb3IgVVNCRAotCUJ1bGtPdXRTaXplID0gU3JjQnVmTGVuOwotCUJ1bGtPdXRTaXplID0gKEJ1bGtPdXRTaXplICsgMykgJiAofjMpOwotCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sIChVU0hPUlQpKEJ1bGtPdXRTaXplIC0gVFhJTkZPX1NJWkUpLCBUUlVFLCBFcFRvUXVldWVbTUdNVFBJUEVJRFhdLCBGQUxTRSwgIEZBTFNFKTsKLQotCUJ1bGtPdXRTaXplICs9IDQ7IC8vIEFsd2F5cyBhZGQgNCBleHRyYSBieXRlcyBhdCBldmVyeSBwYWNrZXQuCi0KLQkvLyBJZiBCdWxrT3V0U2l6ZSBpcyBtdWx0aXBsZSBvZiBCdWxrT3V0TWF4UGFja2V0U2l6ZSwgYWRkIGV4dHJhIDQgYnl0ZXMgYWdhaW4uCi0JaWYgKChCdWxrT3V0U2l6ZSAlIHBBZC0+QnVsa091dE1heFBhY2tldFNpemUpID09IDApCi0JCUJ1bGtPdXRTaXplICs9IDQ7Ci0KLQlwYWRMZW4gPSBCdWxrT3V0U2l6ZSAtIFNyY0J1ZkxlbjsKLQlBU1NFUlQoKHBhZExlbiA8PSBSVE1QX1BLVF9UQUlMX1BBRERJTkcpKTsKLQotCS8vIE5vdyBtZW16ZXJvIGFsbCBleHRyYSBwYWRkaW5nIGJ5dGVzLgotCXBEZXN0ID0gKFBVQ0hBUikocFNyY0J1ZlZBICsgU3JjQnVmTGVuKTsKLQlza2JfcHV0KEdFVF9PU19QS1RfVFlQRShwUGFja2V0KSwgcGFkTGVuKTsKLQlOZGlzWmVyb01lbW9yeShwRGVzdCwgcGFkTGVuKTsKLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrLCBJcnFGbGFncyk7Ci0KLQlwQWQtPk1nbXRSaW5nLkNlbGxbcEFkLT5NZ210UmluZy5UeENwdUlkeF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OwotCXBNTE1FQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSAoUFRYX0JVRkZFUikoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpKTsKLQotCS8vIExlbmd0aCBpbiBUeEluZm8gc2hvdWxkIGJlIDggbGVzcyB0aGFuIGJ1bGtvdXQgc2l6ZS4KLQlwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplID0gQnVsa091dFNpemU7Ci0JcE1MTUVDb250ZXh0LT5JblVzZSA9IFRSVUU7Ci0JcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBUUlVFOwotCi0KLQkvL2ZvciBkZWJ1ZwotCS8vaGV4X2R1bXAoIlJ0bXBVU0JNZ210S2lja091dCIsICZwTUxNRUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXSwgKHBNTE1FQ29udGV4dC0+QnVsa091dFNpemUgPiAxNiA/IDE2IDogcE1MTUVDb250ZXh0LT5CdWxrT3V0U2l6ZSkpOwotCi0JLy9wQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7Ci0JLy9wQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7Ci0KLQkvL2lmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID09IE1HTVRfUklOR19TSVpFKQotCS8vCW5lZWRLaWNrT3V0ID0gVFJVRTsKLQotCS8vIERlY3JlYXNlIHRoZSBUeFN3RnJlZUlkeCBhbmQgSW5jcmVhc2UgdGhlIFRYX0NUWF9JRFgKLQlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4LS07Ci0JSU5DX1JJTkdfSU5ERVgocEFkLT5NZ210UmluZy5UeENwdUlkeCwgTUdNVF9SSU5HX1NJWkUpOwotCi0JUlRNUF9JUlFfVU5MT0NLKCZwQWQtPk1MTUVCdWxrT3V0TG9jaywgSXJxRmxhZ3MpOwotCi0JUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKTsKLQkvL2lmIChuZWVkS2lja091dCkKLQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1WT0lEIFJ0bXBVU0JOdWxsRnJhbWVLaWNrT3V0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFVDSEFSCQlRdWVJZHgsCi0JSU4gVUNIQVIJCSpwTnVsbEZyYW1lLAotCUlOIFVJTlQzMgkJZnJhbWVMZW4pCi17Ci0JaWYgKHBBZC0+TnVsbENvbnRleHQuSW5Vc2UgPT0gRkFMU0UpCi0JewotCQlQVFhfQ09OVEVYVAkJcE51bGxDb250ZXh0OwotCQlQVFhJTkZPX1NUUlVDCXBUeEluZm87Ci0JCVBUWFdJX1NUUlVDCQlwVHhXSTsKLQkJUFVDSEFSCQkJcFdpcmVsZXNzUGt0OwotCi0JCXBOdWxsQ29udGV4dCA9ICYocEFkLT5OdWxsQ29udGV4dCk7Ci0KLQkJLy8gU2V0IHRoZSBpbiB1c2UgYml0Ci0JCXBOdWxsQ29udGV4dC0+SW5Vc2UgPSBUUlVFOwotCQlwV2lyZWxlc3NQa3QgPSAoUFVDSEFSKSZwTnVsbENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXTsKLQotCQlSVE1QWmVyb01lbW9yeSgmcFdpcmVsZXNzUGt0WzBdLCAxMDApOwotCQlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpJnBXaXJlbGVzc1BrdFswXTsKLQkJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkoc2l6ZW9mKEhFQURFUl84MDJfMTEpK1RYV0lfU0laRSksIFRSVUUsIEVwVG9RdWV1ZVtNR01UUElQRUlEWF0sIEZBTFNFLCAgRkFMU0UpOwotCQlwVHhJbmZvLT5RU0VMID0gRklGT19FRENBOwotCQlwVHhXSSA9IChQVFhXSV9TVFJVQykmcFdpcmVsZXNzUGt0W1RYSU5GT19TSVpFXTsKLQkJUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCAgRkFMU0UsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCAwLCBCU1NJRF9XQ0lELCAoc2l6ZW9mKEhFQURFUl84MDJfMTEpKSwKLQkJCTAsIDAsIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLCBJRlNfSFRUWE9QLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7Ci0JCVJUTVBNb3ZlTWVtb3J5KCZwV2lyZWxlc3NQa3RbVFhXSV9TSVpFK1RYSU5GT19TSVpFXSwgJnBBZC0+TnVsbEZyYW1lLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCQlwQWQtPk51bGxDb250ZXh0LkJ1bGtPdXRTaXplID0gIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgc2l6ZW9mKHBBZC0+TnVsbEZyYW1lKSArIDQ7Ci0KLQkJLy8gRmlsbCBvdXQgZnJhbWUgbGVuZ3RoIGluZm9ybWF0aW9uIGZvciBnbG9iYWwgQnVsayBvdXQgYXJiaXRvcgotCQkvL3BOdWxsQ29udGV4dC0+QnVsa091dFNpemUgPSBUcmFuc2ZlckJ1ZmZlckxlbmd0aDsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIHNlbmQgTlVMTCBGcmFtZSBAJWQgTWJwcy4uLlxuIiwgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZV0pKTsKLQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05VTEwpOwotCi0JCS8vIEtpY2sgYnVsayBvdXQKLQkJUlRVU0JLaWNrQnVsa091dChwQWQpOwotCX0KLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJQ2hlY2sgUnggZGVzY3JpcHRvciwgcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkUgaWYgYW55IGVycm9yIGRvdW5kCi0KLQlBcmd1bWVudHM6Ci0JCXBSeEQJCVBvaW50ZXIJdG8gdGhlIFJ4IGRlc2NyaXB0b3IKLQotCVJldHVybiBWYWx1ZToKLQkJTkRJU19TVEFUVVNfU1VDQ0VTUwkJTm8gZXJyCi0JCU5ESVNfU1RBVFVTX0ZBSUxVUkUJCUVycm9yCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMJUlRNUENoZWNrUnhFcnJvcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQSEVBREVSXzgwMl8xMQlwSGVhZGVyLAotCUlOCVBSWFdJX1NUUlVDCXBSeFdJLAotCUlOCVBSVDI4WFhfUlhEX1NUUlVDCXBSeElORk8pCi17Ci0JUENJUEhFUl9LRVkgcFdwYUtleTsKLQlJTlQJZEJtOwotCi0JaWYgKHBBZC0+YlByb21pc2N1b3VzID09IFRSVUUpCi0JCXJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKLQlpZihwUnhJTkZPID09IE5VTEwpCi0JCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKLQotCS8vIFBoeSBlcnJvcnMgJiBDUkMgZXJyb3JzCi0JaWYgKHBSeElORk8tPkNyYykKLQl7Ci0JCS8vIENoZWNrIFJTU0kgZm9yIE5vaXNlIEhpc3Qgc3RhdGlzdGljIGNvbGxlY3Rpb24uCi0JCWRCbSA9IChJTlQpIChwUnhXSS0+UlNTSTApIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKLQkJaWYgKGRCbSA8PSAtODcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzBdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtODIpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzFdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNzcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzJdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNzIpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzNdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNjcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzRdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNjIpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzVdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNTcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzZdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA+IC01NykKLQkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbN10gKz0gMTsKLQotCQlyZXR1cm4oTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JfQotCi0JLy8gQWRkIFJ4IHNpemUgdG8gY2hhbm5lbCBsb2FkIGNvdW50ZXIsIHdlIHNob3VsZCBpZ25vcmUgZXJyb3IgY291bnRzCi0JcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgKz0gKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQrIDE0KTsKLQotCS8vIERyb3AgVG9EcyBwcm9taXNjb3VzIGZyYW1lLCBpdCBpcyBvcGVuZWQgZHVlIHRvIENDWCAyIGNoYW5uZWwgbG9hZCBzdGF0aXN0aWNzCi0JaWYgKHBIZWFkZXItPkZDLlRvRHMpCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiRXJyO0ZDLlRvRHNcbiIpKTsKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JLy8gUGF1bCAwNC0wMyBmb3IgT0ZETSBSeCBsZW5ndGggaXNzdWUKLQlpZiAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA+IE1BWF9BR0dSRUdBVElPTl9TSVpFKQotCXsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoInJlY2VpdmVkIHBhY2tldCB0b28gbG9uZ1xuIikpOwotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQkvLyBEcm9wIG5vdCBVMk0gZnJhbWVzLCBjYW50J3MgZHJvcCBoZXJlIGJlY2F1c2Ugd2Ugd2lsbCBkcm9wIGJlYWNvbiBpbiB0aGlzIGNhc2UKLQkvLyBJIGFtIGtpbmQgb2YgZG91YnRpbmcgdGhlIFUyTSBiaXQgb3BlcmF0aW9uCi0JLy8gaWYgKHBSeEQtPlUyTSA9PSAwKQotCS8vCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKLQotCS8vIGRyb3AgZGVjeXB0aW9uIGZhaWwgZnJhbWUKLQlpZiAocFJ4SU5GTy0+RGVjcnlwdGVkICYmIHBSeElORk8tPkNpcGhlckVycikKLQl7Ci0KLQkJLy8KLQkJLy8gTUlDIEVycm9yCi0JCS8vCi0JCWlmICgocFJ4SU5GTy0+Q2lwaGVyRXJyID09IDIpICYmIHBSeElORk8tPk15QnNzKQotCQl7Ci0JCQlwV3BhS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BSeFdJLT5LZXlJbmRleF07Ci0JCQlSVE1QUmVwb3J0TWljRXJyb3IocEFkLCBwV3BhS2V5KTsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIlJ4IE1JQyBWYWx1ZSBlcnJvclxuIikpOwotCQl9Ci0KLQkJaWYgKHBSeElORk8tPkRlY3J5cHRlZCAmJgotCQkJKHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BSeFdJLT5LZXlJbmRleF0uQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpICYmCi0JCQkocEhlYWRlci0+U2VxdWVuY2UgPT0gcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UpKQotCQl7Ci0JCQkvLwotCQkJLy8gQWNjZXB0YWJsZSBzaW5jZSB0aGUgRmlyc3QgRnJhZ0ZyYW1lIG5vIENpcGhlckVyciBwcm9ibGVtLgotCQkJLy8KLQkJCXJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJfQotCi0JCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKLQl9Ci0KLQlyZXR1cm4oTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci19Ci0KLVZPSUQgUlQyOHh4VXNiU3RhQXNpY0ZvcmNlV2FrZXVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIEJPT0xFQU4gICAgICAgYkZyb21UeCkKLXsKLSAgICBBVVRPX1dBS0VVUF9TVFJVQwlBdXRvV2FrZXVwQ2ZnOwotCi0JQXV0b1dha2V1cENmZy53b3JkID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0KLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIDB4ZmYsIDB4MDAsIDB4MDIpOwotCi0JT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci19Ci0KLVZPSUQgUlQyOHh4VXNiU3RhQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApCi17Ci0JQVVUT19XQUtFVVBfU1RSVUMJQXV0b1dha2V1cENmZzsKLQotCS8vIHdlIGhhdmUgZGVjaWRlZCB0byBTTEVFUCwgc28gYXQgbGVhc3QgZG8gaXQgZm9yIGEgQkVBQ09OIHBlcmlvZC4KLQlpZiAoVGJ0dE51bVRvTmV4dFdha2VVcCA9PSAwKQotCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gMTsKLQotCUF1dG9XYWtldXBDZmcud29yZCA9IDA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOwotCi0JQXV0b1dha2V1cENmZy5maWVsZC5OdW1vZlNsZWVwaW5nVGJ0dCA9IFRidHROdW1Ub05leHRXYWtlVXAgLSAxOwotCUF1dG9XYWtldXBDZmcuZmllbGQuRW5hYmxlQXV0b1dha2V1cCA9IDE7Ci0JQXV0b1dha2V1cENmZy5maWVsZC5BdXRvTGVhZFRpbWUgPSA1OwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKLQotCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgMHhmZiwgMHhmZiwgMHgwMik7ICAgLy8gc2VuZCBQT1dFUi1TQVZFIGNvbW1hbmQgdG8gTUNVLiBUaW1lb3V0IDQwdXMuCi0KLQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci0KLX0KLQotVk9JRCBSVDI4eHhVc2JNbG1lUmFkaW9PbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUMjh4eFVzYk1sbWVSYWRpb09uKClcbiIpKTsKLQotCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCi0JCXJldHVybjsKLQotICAgIAlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIDB4ZmYsIDB4MDAsIDB4MDIpOwotCQlSVE1QdXNlY0RlbGF5KDEwMDAwKTsKLQotCU5JQ1Jlc2V0RnJvbUVycm9yKHBBZCk7Ci0KLQkvLyBFbmFibGUgVHgvUngKLQlSVE1QRW5hYmxlUnhUeChwQWQpOwotCi0jaWZkZWYgUlQzMDcwCi0JaWYgKElTX1JUMzA3MShwQWQpKQotCXsKLQkJUlQzMHh4UmV2ZXJzZVJGU2xlZXBNb2RlU2V0dXAocEFkKTsKLQl9Ci0jZW5kaWYgLy8gUlQzMDcwIC8vCi0KLQkvLyBDbGVhciBSYWRpbyBvZmYgZmxhZwotCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKLQotCVJUVVNCQnVsa1JlY2VpdmUocEFkKTsKLQotCS8vIFNldCBMRUQKLQlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09OKTsKLX0KLQotVk9JRCBSVDI4eHhVc2JNbG1lUmFkaW9PRkYoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7Ci0JVUlOVDMyCVZhbHVlLCBpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVDI4eHhVc2JNbG1lUmFkaW9PRkYoKVxuIikpOwotCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQotCQlyZXR1cm47Ci0KLQkvLyBTZXQgTEVECi0JUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOwotCS8vIFNldCBSYWRpbyBvZmYgZmxhZwotCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7Ci0KLQl7Ci0JCS8vIExpbmsgZG93biBmaXJzdCBpZiBhbnkgYXNzb2NpYXRpb24gZXhpc3RzCi0JCWlmIChJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkpCi0JCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKLQkJUlRNUHVzZWNEZWxheSgxMDAwMCk7Ci0KLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJLy8gQ2xlYW4gdXAgb2xkIGJzcyB0YWJsZQotCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7Ci0JfQotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKLQl7Ci0JCS8vIE11c3QgdXNpbmcgNDBNSHouCi0JCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIE11c3QgdXNpbmcgMjBNSHouCi0JCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQl9Ci0KLQkvLyBEaXNhYmxlIFR4L1J4IERNQQotCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsJICAgLy8gZGlzYWJsZSBETUEKLQlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSAwOwotCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDA7Ci0JUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOwkgICAvLyBhYm9ydCBhbGwgVFggcmluZ3MKLQotCS8vIFdhaXRpbmcgZm9yIERNQSBpZGxlCi0JaSA9IDA7Ci0JZG8KLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKLQkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQotCQkJYnJlYWs7Ci0KLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQl9d2hpbGUgKGkrKyA8IDEwMCk7Ci0KLQkvLyBEaXNhYmxlIE1BQyBUeC9SeAotCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCVZhbHVlICY9ICgweGZmZmZmZmYzKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQotCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgMHhmZiwgMHhmZiwgMHgwMik7Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9kYXRhX3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2RhdGFfdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0Njc1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9kYXRhX3VzYi5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi8uLi9ydDI4NjAvY29tbW9uL2NtbV9kYXRhX3VzYi5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX21hY191c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9tYWNfdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2YWY0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9tYWNfdXNiLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3J0Mjg2MC9jb21tb24vY21tX21hY191c2IuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9wcm9maWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fcHJvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MjZlNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fcHJvZmlsZS5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi8uLi9ydDI4NjAvY29tbW9uL2NtbV9wcm9maWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3RraXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzNjNzFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3RraXAuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NvbW1vbi9jbW1fdGtpcC5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3dlcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3dlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjgxMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fd2VwLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3J0Mjg2MC9jb21tb24vY21tX3dlcC5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY3J5cHRfaG1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY3J5cHRfaG1hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZDg0ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jcnlwdF9obWFjLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3J0Mjg2MC9jb21tb24vY3J5cHRfaG1hYy5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY3J5cHRfbWQ1LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jcnlwdF9tZDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTdhMmNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY3J5cHRfbWQ1LmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3J0Mjg2MC9jb21tb24vY3J5cHRfbWQ1LmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jcnlwdF9zaGEyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jcnlwdF9zaGEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdmZmIzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NyeXB0X3NoYTIuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NvbW1vbi9jcnlwdF9zaGEyLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9lZV9lZnVzZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vZWVfZWZ1c2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTM0ZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vZWVfZWZ1c2UuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NvbW1vbi9lZV9lZnVzZS5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRfY2hhbm5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRfY2hhbm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4Y2ViNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydF9jaGFubmVsLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3J0Mjg2MC9jb21tb24vcnRfY2hhbm5lbC5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRfcmYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0X3JmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxY2ZmMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0X3JmLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3J0Mjg2MC9jb21tb24vcnRfcmYuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfbWN1LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX21jdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYjdmMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX21jdS5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi8uLi9ydDI4NjAvY29tbW9uL3J0bXBfbWN1LmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX3RpbWVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0YWVkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfdGltZXIuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NvbW1vbi9ydG1wX3RpbWVyLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9idWxrLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9idWxrLmMKaW5kZXggYTQyNDRiNS4uMzc5NzgwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfYnVsay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2J1bGsuYwpAQCAtMSw0ICsxLDQgQEAKLSAvKgorLyoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBSYWxpbmsgVGVjaCBJbmMuCiAgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCkBAIC0zNywxMzMgKzM3LDEyNCBAQAogCiAqLwogCisjaWZkZWYgUlRNUF9NQUNfVVNCCisKICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLS8vIE1hdGNoIHRvdGFsIDYgYnVsa291dCBlbmRwb2ludCB0byBjb3JyZXNwb25kaW5nIHF1ZXVlLgotVUNIQVIJRXBUb1F1ZXVlWzZdPXtGSUZPX0VEQ0EsIEZJRk9fRURDQSwgRklGT19FRENBLCBGSUZPX0VEQ0EsIEZJRk9fRURDQSwgRklGT19NR01UfTsKKy8qIE1hdGNoIHRvdGFsIDYgYnVsa291dCBlbmRwb2ludCB0byBjb3JyZXNwb25kaW5nIHF1ZXVlLiAqLwordTggRXBUb1F1ZXVlWzZdID0KKyAgICB7IEZJRk9fRURDQSwgRklGT19FRENBLCBGSUZPX0VEQ0EsIEZJRk9fRURDQSwgRklGT19FRENBLCBGSUZPX01HTVQgfTsKIAotLy9zdGF0aWMgQk9PTEVBTiBTaW5nbGVCdWxrT3V0ID0gRkFMU0U7CisvKnN0YXRpYyBCT09MRUFOIFNpbmdsZUJ1bGtPdXQgPSBGQUxTRTsgKi8KIAotdm9pZCBSVFVTQl9GSUxMX0JVTEtfVVJCIChzdHJ1Y3QgdXJiICpwVXJiLAotCXN0cnVjdCB1c2JfZGV2aWNlICpwVXNiX0RldiwKLQl1bnNpZ25lZCBpbnQgYnVsa3BpcGUsCi0Jdm9pZCAqcFRyYW5zZmVyQnVmLAotCWludCBCdWZTaXplLAotCXVzYl9jb21wbGV0ZV90IENvbXBsZXRlLAotCXZvaWQgKnBDb250ZXh0KQordm9pZCBSVFVTQl9GSUxMX0JVTEtfVVJCKHN0cnVjdCB1cmIgKnBVcmIsCisJCQkgc3RydWN0IHVzYl9kZXZpY2UgKnBVc2JfRGV2LAorCQkJIHVuc2lnbmVkIGludCBidWxrcGlwZSwKKwkJCSB2b2lkICpwVHJhbnNmZXJCdWYsCisJCQkgaW50IEJ1ZlNpemUsIHVzYl9jb21wbGV0ZV90IENvbXBsZXRlLCB2b2lkICpwQ29udGV4dCkKIHsKIAotCXVzYl9maWxsX2J1bGtfdXJiKHBVcmIsIHBVc2JfRGV2LCBidWxrcGlwZSwgcFRyYW5zZmVyQnVmLCBCdWZTaXplLCAodXNiX2NvbXBsZXRlX3QpQ29tcGxldGUsIHBDb250ZXh0KTsKKwl1c2JfZmlsbF9idWxrX3VyYihwVXJiLCBwVXNiX0RldiwgYnVsa3BpcGUsIHBUcmFuc2ZlckJ1ZiwgQnVmU2l6ZSwKKwkJCSAgKHVzYl9jb21wbGV0ZV90KSBDb21wbGV0ZSwgcENvbnRleHQpOwogCiB9CiAKLVZPSUQJUlRVU0JJbml0VHhEZXNjKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBUWF9DT05URVhUCQlwVHhDb250ZXh0LAotCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKLQlJTgl1c2JfY29tcGxldGVfdAlGdW5jKQordm9pZCBSVFVTQkluaXRUeERlc2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgIHN0cnVjdCBydF90eF9jb250ZXh0ICpwVHhDb250ZXh0LAorCQkgICAgIHU4IEJ1bGtPdXRQaXBlSWQsIElOIHVzYl9jb21wbGV0ZV90IEZ1bmMpCiB7Ci0JUFVSQgkJCQlwVXJiOwotCVBVQ0hBUgkJCQlwU3JjID0gTlVMTDsKLQlQT1NfQ09PS0lFCQkJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKwlQVVJCIHBVcmI7CisJdTggKnBTcmMgPSBOVUxMOworCXN0cnVjdCBvc19jb29raWUgKnBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOwogCiAJcFVyYiA9IHBUeENvbnRleHQtPnBVcmI7CiAJQVNTRVJUKHBVcmIpOwogCi0JLy8gU3RvcmUgQnVsa091dCBQaXBlSWQKKwkvKiBTdG9yZSBCdWxrT3V0IFBpcGVJZCAqLwogCXBUeENvbnRleHQtPkJ1bGtPdXRQaXBlSWQgPSBCdWxrT3V0UGlwZUlkOwogCi0JaWYgKHBUeENvbnRleHQtPmJBZ2dyZWdhdGlibGUpCi0JeworCWlmIChwVHhDb250ZXh0LT5iQWdncmVnYXRpYmxlKSB7CiAJCXBTcmMgPSAmcFR4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXItPkFnZ3JlZ2F0aW9uWzJdOwotCX0KLQllbHNlCi0JewotCQlwU3JjID0gKFBVQ0hBUikgcFR4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0OworCX0gZWxzZSB7CisJCXBTcmMgPQorCQkgICAgKHU4ICopcFR4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0OwogCX0KIAotCi0JLy9Jbml0aWFsaXplIGEgdHggYnVsayB1cmIKKwkvKkluaXRpYWxpemUgYSB0eCBidWxrIHVyYiAqLwogCVJUVVNCX0ZJTExfQlVMS19VUkIocFVyYiwKLQkJCQkJCXBPYmotPnBVc2JfRGV2LAotCQkJCQkJdXNiX3NuZGJ1bGtwaXBlKHBPYmotPnBVc2JfRGV2LCBwQWQtPkJ1bGtPdXRFcEFkZHJbQnVsa091dFBpcGVJZF0pLAotCQkJCQkJcFNyYywKLQkJCQkJCXBUeENvbnRleHQtPkJ1bGtPdXRTaXplLAotCQkJCQkJRnVuYywKLQkJCQkJCXBUeENvbnRleHQpOworCQkJICAgIHBPYmotPnBVc2JfRGV2LAorCQkJICAgIHVzYl9zbmRidWxrcGlwZShwT2JqLT5wVXNiX0RldiwKKwkJCQkJICAgIHBBZC0+QnVsa091dEVwQWRkcltCdWxrT3V0UGlwZUlkXSksCisJCQkgICAgcFNyYywgcFR4Q29udGV4dC0+QnVsa091dFNpemUsIEZ1bmMsIHBUeENvbnRleHQpOwogCiAJaWYgKHBUeENvbnRleHQtPmJBZ2dyZWdhdGlibGUpCi0JCXBVcmItPnRyYW5zZmVyX2RtYQk9IChwVHhDb250ZXh0LT5kYXRhX2RtYSArIFRYX0JVRkZFUl9OT1JNU0laRSArIDIpOworCQlwVXJiLT50cmFuc2Zlcl9kbWEgPQorCQkgICAgKHBUeENvbnRleHQtPmRhdGFfZG1hICsgVFhfQlVGRkVSX05PUk1TSVpFICsgMik7CiAJZWxzZQotCQlwVXJiLT50cmFuc2Zlcl9kbWEJPSBwVHhDb250ZXh0LT5kYXRhX2RtYTsKKwkJcFVyYi0+dHJhbnNmZXJfZG1hID0gcFR4Q29udGV4dC0+ZGF0YV9kbWE7CiAKIAlwVXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKIAogfQogCi1WT0lECVJUVVNCSW5pdEhUVHhEZXNjKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBIVF9UWF9DT05URVhUCXBUeENvbnRleHQsCi0JSU4JVUNIQVIJCQlCdWxrT3V0UGlwZUlkLAotCUlOCVVMT05HCQkJQnVsa091dFNpemUsCi0JSU4JdXNiX2NvbXBsZXRlX3QJRnVuYykKK3ZvaWQgUlRVU0JJbml0SFRUeERlc2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBUeENvbnRleHQsCisJCSAgICAgICB1OCBCdWxrT3V0UGlwZUlkLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBCdWxrT3V0U2l6ZSwgSU4gdXNiX2NvbXBsZXRlX3QgRnVuYykKIHsKLQlQVVJCCQkJCXBVcmI7Ci0JUFVDSEFSCQkJCXBTcmMgPSBOVUxMOwotCVBPU19DT09LSUUJCQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCVBVUkIgcFVyYjsKKwl1OCAqcFNyYyA9IE5VTEw7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CiAKIAlwVXJiID0gcFR4Q29udGV4dC0+cFVyYjsKIAlBU1NFUlQocFVyYik7CiAKLQkvLyBTdG9yZSBCdWxrT3V0IFBpcGVJZAorCS8qIFN0b3JlIEJ1bGtPdXQgUGlwZUlkICovCiAJcFR4Q29udGV4dC0+QnVsa091dFBpcGVJZCA9IEJ1bGtPdXRQaXBlSWQ7CiAKLQlwU3JjID0gJnBUeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtwVHhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uXTsKKwlwU3JjID0KKwkgICAgJnBUeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtwVHhDb250ZXh0LT4KKwkJCQkJCQkgICAgICBOZXh0QnVsa091dFBvc2l0aW9uXTsKIAotCi0JLy9Jbml0aWFsaXplIGEgdHggYnVsayB1cmIKKwkvKkluaXRpYWxpemUgYSB0eCBidWxrIHVyYiAqLwogCVJUVVNCX0ZJTExfQlVMS19VUkIocFVyYiwKLQkJCQkJCXBPYmotPnBVc2JfRGV2LAotCQkJCQkJdXNiX3NuZGJ1bGtwaXBlKHBPYmotPnBVc2JfRGV2LCBwQWQtPkJ1bGtPdXRFcEFkZHJbQnVsa091dFBpcGVJZF0pLAotCQkJCQkJcFNyYywKLQkJCQkJCUJ1bGtPdXRTaXplLAotCQkJCQkJRnVuYywKLQkJCQkJCXBUeENvbnRleHQpOworCQkJICAgIHBPYmotPnBVc2JfRGV2LAorCQkJICAgIHVzYl9zbmRidWxrcGlwZShwT2JqLT5wVXNiX0RldiwKKwkJCQkJICAgIHBBZC0+QnVsa091dEVwQWRkcltCdWxrT3V0UGlwZUlkXSksCisJCQkgICAgcFNyYywgQnVsa091dFNpemUsIEZ1bmMsIHBUeENvbnRleHQpOwogCi0JcFVyYi0+dHJhbnNmZXJfZG1hCT0gKHBUeENvbnRleHQtPmRhdGFfZG1hICsgcFR4Q29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbik7CisJcFVyYi0+dHJhbnNmZXJfZG1hID0KKwkgICAgKHBUeENvbnRleHQtPmRhdGFfZG1hICsgcFR4Q29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbik7CiAJcFVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CiAKIH0KIAotVk9JRAlSVFVTQkluaXRSeERlc2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFJYX0NPTlRFWFQJCXBSeENvbnRleHQpCit2b2lkIFJUVVNCSW5pdFJ4RGVzYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0KQogewotCVBVUkIJCQkJcFVyYjsKLQlQT1NfQ09PS0lFCQkJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQlVTE9ORwkJCQlSWF9idWxrX3NpemU7Ci0KKwlQVVJCIHBVcmI7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisJdW5zaWduZWQgbG9uZyBSWF9idWxrX3NpemU7CiAKIAlwVXJiID0gcFJ4Q29udGV4dC0+cFVyYjsKIAlBU1NFUlQocFVyYik7CiAKLQlpZiAoIHBBZC0+QnVsa0luTWF4UGFja2V0U2l6ZSA9PSA2NCkKKwlpZiAocEFkLT5CdWxrSW5NYXhQYWNrZXRTaXplID09IDY0KQogCQlSWF9idWxrX3NpemUgPSA0MDk2OwogCWVsc2UKIAkJUlhfYnVsa19zaXplID0gTUFYX1JYQlVMS19TSVpFOwogCi0JLy9Jbml0aWFsaXplIGEgcnggYnVsayB1cmIKKwkvKkluaXRpYWxpemUgYSByeCBidWxrIHVyYiAqLwogCVJUVVNCX0ZJTExfQlVMS19VUkIocFVyYiwKLQkJCQkJCXBPYmotPnBVc2JfRGV2LAotCQkJCQkJdXNiX3JjdmJ1bGtwaXBlKHBPYmotPnBVc2JfRGV2LCBwQWQtPkJ1bGtJbkVwQWRkciksCi0JCQkJCQkmKHBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyW3BBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb25dKSwKLQkJCQkJCVJYX2J1bGtfc2l6ZSAtIChwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uKSwKLQkJCQkJCSh1c2JfY29tcGxldGVfdClSVFVTQkJ1bGtSeENvbXBsZXRlLAotCQkJCQkJKHZvaWQgKilwUnhDb250ZXh0KTsKKwkJCSAgICBwT2JqLT5wVXNiX0RldiwKKwkJCSAgICB1c2JfcmN2YnVsa3BpcGUocE9iai0+cFVzYl9EZXYsIHBBZC0+QnVsa0luRXBBZGRyKSwKKwkJCSAgICAmKHBSeENvbnRleHQtPgorCQkJICAgICAgVHJhbnNmZXJCdWZmZXJbcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbl0pLAorCQkJICAgIFJYX2J1bGtfc2l6ZSAtIChwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uKSwKKwkJCSAgICAodXNiX2NvbXBsZXRlX3QpIFJUVVNCQnVsa1J4Q29tcGxldGUsCisJCQkgICAgKHZvaWQgKilwUnhDb250ZXh0KTsKIAotCXBVcmItPnRyYW5zZmVyX2RtYQk9IHBSeENvbnRleHQtPmRhdGFfZG1hICsgcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbjsKKwlwVXJiLT50cmFuc2Zlcl9kbWEgPSBwUnhDb250ZXh0LT5kYXRhX2RtYSArIHBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb247CiAJcFVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CiAKLQogfQogCiAvKgpAQCAtMTg4LDE3NyArMTc5LDIxNSBAQAogCQlpZigxIC8qIShpbl9pbnRlcnJ1cHQoKSAmIDB4ZmZmZjAwMDApKi8pCVwKIAkJCVJUTVBfSVJRX1VOTE9DSygocExvY2spLCBJcnFGbGFncyk7CiAKLQotVk9JRAlSVFVTQkJ1bGtPdXREYXRhUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKLQlJTglVQ0hBUgkJCUluZGV4KQordm9pZCBSVFVTQkJ1bGtPdXREYXRhUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1OCBCdWxrT3V0UGlwZUlkLCB1OCBJbmRleCkKIHsKIAotCVBIVF9UWF9DT05URVhUCXBIVFRYQ29udGV4dDsKLQlQVVJCCQkJcFVyYjsKLQlpbnQJCQkJcmV0ID0gMDsKLQlQVFhJTkZPX1NUUlVDCXBUeEluZm8sIHBMYXN0VHhJbmZvID0gTlVMTDsKLQlQVFhXSV9TVFJVQyAgICAgICAgICAgICBwVHhXSTsKLQlVTE9ORwkJCVRtcEJ1bGtFbmRQb3MsIFRoaXNCdWxrU2l6ZTsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzID0gMCwgSXJxRmxhZ3MyID0gMDsKLQlQVUNIQVIJCQlwV2lyZWxlc3NQa3QsIHBBcHBlbmRhbnQ7Ci0JQk9PTEVBTgkJCWJUeFFMYXN0Um91bmQgPSBGQUxTRTsKLQlVQ0hBUgkJCWFsbHplcm9bNF09IHsweDAsMHgwLDB4MCwweDB9OworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CisJUFVSQiBwVXJiOworCWludCByZXQgPSAwOworCXN0cnVjdCBydF90eGluZm8gKnBUeEluZm8sICpwTGFzdFR4SW5mbyA9IE5VTEw7CisJc3RydWN0IHJ0X3R4d2kgKiBwVHhXSTsKKwl1bnNpZ25lZCBsb25nIFRtcEJ1bGtFbmRQb3MsIFRoaXNCdWxrU2l6ZTsKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzID0gMCwgSXJxRmxhZ3MyID0gMDsKKwl1OCAqcFdpcmVsZXNzUGt0LCAqcEFwcGVuZGFudDsKKwlCT09MRUFOIGJUeFFMYXN0Um91bmQgPSBGQUxTRTsKKwl1OCBhbGx6ZXJvWzRdID0geyAweDAsIDB4MCwgMHgwLCAweDAgfTsKIAogCUJVTEtfT1VUX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKLQlpZiAoKHBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPT0gVFJVRSkgfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWCkpCi0JeworCWlmICgocEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9PSBUUlVFKQorCSAgICB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYKSkgewogCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIAlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gVFJVRTsKIAogCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCi0JCSkKLQl7CisJICAgICkgewogCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7CiAJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwogCQlyZXR1cm47CiAJfQogCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwogCi0KIAlwSFRUWENvbnRleHQgPSAmKHBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdKTsKIAogCUJVTEtfT1VUX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFnczIpOwotCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pCi0JCXx8ICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbi04KSA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQotCXsKLQkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MyKTsKKwlpZiAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPT0KKwkgICAgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikKKwkgICAgfHwgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uIC0gOCkgPT0KKwkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkgeworCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLAorCQkJCUlycUZsYWdzMik7CiAKIAkJQlVMS19PVVRfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwogCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7CiAKLQkJLy8gQ2xlYXIgRGF0YSBmbGFnCi0JCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHIDw8IEJ1bGtPdXRQaXBlSWQpKTsKLQkJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBCdWxrT3V0UGlwZUlkKSk7CisJCS8qIENsZWFyIERhdGEgZmxhZyAqLworCQlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLAorCQkJCSAgICAgIChmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHIDw8CisJCQkJICAgICAgIEJ1bGtPdXRQaXBlSWQpKTsKKwkJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwKKwkJCQkgICAgICAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8CisJCQkJICAgICAgIEJ1bGtPdXRQaXBlSWQpKTsKIAogCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKIAkJcmV0dXJuOwogCX0KKwkvKiBDbGVhciBEYXRhIGZsYWcgKi8KKwlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLAorCQkJICAgICAgKGZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUcgPDwgQnVsa091dFBpcGVJZCkpOworCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsCisJCQkgICAgICAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKIAotCS8vIENsZWFyIERhdGEgZmxhZwotCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHIDw8IEJ1bGtPdXRQaXBlSWQpKTsKLQlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKLQotCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCdWxrT3V0LUI6ST0weCVseCwgQ1dQb3M9JWxkLCBDV1JQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkIVxuIiwgaW5faW50ZXJydXB0KCksCi0JLy8JCQkJCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcywgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLAotCS8vCQkJCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKSk7CisJLypEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJ1bGtPdXQtQjpJPTB4JWx4LCBDV1Bvcz0lbGQsIENXUlBvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQhXG4iLCBpbl9pbnRlcnJ1cHQoKSwgKi8KKwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MsIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgKi8KKwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKSk7ICovCiAJcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID0gcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbjsKIAlUaGlzQnVsa1NpemUgPSAwOwogCVRtcEJ1bGtFbmRQb3MgPSBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb247CiAJcFdpcmVsZXNzUGt0ID0gJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdOwogCi0JaWYgKChwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCA9PSBUUlVFKSkKLQl7Ci0JCWlmIChSVE1QRXF1YWxNZW1vcnkocEhUVFhDb250ZXh0LT5TYXZlZFBhZCwgYWxsemVybyw0KSkKLQkJewotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiZTEsIGFsbHplcm8gOiAleCAgJXggICV4ICAleCAgJXggICV4ICAleCAgJXggXG4iLAotCQkJCXBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMF0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMV0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMl0scEhUVFhDb250ZXh0LT5TYXZlZFBhZFszXQotCQkJCSxwSFRUWENvbnRleHQtPlNhdmVkUGFkWzRdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzVdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzZdLHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbN10pKTsKKwlpZiAoKHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkID09IFRSVUUpKSB7CisJCWlmIChSVE1QRXF1YWxNZW1vcnkocEhUVFhDb250ZXh0LT5TYXZlZFBhZCwgYWxsemVybywgNCkpIHsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCQkgICAgICgiZTEsIGFsbHplcm8gOiAleCAgJXggICV4ICAleCAgJXggICV4ICAleCAgJXggXG4iLAorCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMF0sCisJCQkJICAgICAgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFsxXSwKKwkJCQkgICAgICBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzJdLAorCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbM10KKwkJCQkgICAgICAsIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNF0sCisJCQkJICAgICAgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFs1XSwKKwkJCQkgICAgICBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzZdLAorCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbN10pKTsKIAkJfQotCQlOZGlzTW92ZU1lbW9yeSgmcFdpcmVsZXNzUGt0W1RtcEJ1bGtFbmRQb3NdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkLCA4KTsKKwkJTmRpc01vdmVNZW1vcnkoJnBXaXJlbGVzc1BrdFtUbXBCdWxrRW5kUG9zXSwKKwkJCSAgICAgICBwSFRUWENvbnRleHQtPlNhdmVkUGFkLCA4KTsKIAkJcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPSBGQUxTRTsKIAkJaWYgKHBBZC0+YkZvcmNlUHJpbnRUWCA9PSBUUlVFKQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVFVTQkJ1bGtPdXREYXRhUGFja2V0IC0tPiBDT1BZIFBBRC4gQ3VyV3JpdGUgPSAlbGQsIE5leHRCdWxrID0gJWxkLiAgIEVOZXh0QnVsayA9ICVsZC5cbiIsICAgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlJUVVNCQnVsa091dERhdGFQYWNrZXQgLS0+IENPUFkgUEFELiBDdXJXcml0ZSA9ICVsZCwgTmV4dEJ1bGsgPSAlbGQuICAgRU5leHRCdWxrID0gJWxkLlxuIiwKKwkJCQkgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwKKwkJCQkgIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwKKwkJCQkgIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24pKTsKIAl9CiAKLQlkbwotCXsKLQkJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKSZwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvc107Ci0JCXBUeFdJID0gKFBUWFdJX1NUUlVDKSZwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvcyArIFRYSU5GT19TSVpFXTsKKwlkbyB7CisJCXBUeEluZm8gPSAoc3RydWN0IHJ0X3R4aW5mbyAqKSYgcFdpcmVsZXNzUGt0W1RtcEJ1bGtFbmRQb3NdOworCQlwVHhXSSA9CisJCSAgICAoc3RydWN0IHJ0X3R4d2kgKikgJiBwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvcyArIFRYSU5GT19TSVpFXTsKIAogCQlpZiAocEFkLT5iRm9yY2VQcmludFRYID09IFRSVUUpCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVFVTQkJ1bGtPdXREYXRhUGFja2V0IEFNUERVID0gJWQuXG4iLCAgIHBUeFdJLT5BTVBEVSkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiUlRVU0JCdWxrT3V0RGF0YVBhY2tldCBBTVBEVSA9ICVkLlxuIiwKKwkJCQkgIHBUeFdJLT5BTVBEVSkpOwogCi0JCS8vIGFkZCBieSBJdmVyc29uLCBsaW1pdCBCdWxrT3V0IHNpemUgdG8gNGsgdG8gcGFzcyBXTU0gYiBtb2RlIDJUMVIgdGVzdCBpdGVtcwotCQkvL2lmICgoVGhpc0J1bGtTaXplICE9IDApICAmJiAocFR4V0ktPkFNUERVID09IDApKQotCQlpZiAoKFRoaXNCdWxrU2l6ZSAhPSAwKSAmJiAocFR4V0ktPlBIWU1PREUgPT0gTU9ERV9DQ0spKQotCQl7Ci0JCQlpZiAoKChUaGlzQnVsa1NpemUmMHhmZmZmODAwMCkgIT0gMCkgfHwgKChUaGlzQnVsa1NpemUmMHgxMDAwKSA9PSAweDEwMDApKQotCQkJewotCQkJCS8vIExpbWl0IEJ1bGtPdXQgc2l6ZSB0byBhYm91dCA0ayBieXRlcy4KLQkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0gVG1wQnVsa0VuZFBvczsKKwkJLyogYWRkIGJ5IEl2ZXJzb24sIGxpbWl0IEJ1bGtPdXQgc2l6ZSB0byA0ayB0byBwYXNzIFdNTSBiIG1vZGUgMlQxUiB0ZXN0IGl0ZW1zICovCisJCS8qaWYgKChUaGlzQnVsa1NpemUgIT0gMCkgICYmIChwVHhXSS0+QU1QRFUgPT0gMCkpICovCisJCWlmICgoVGhpc0J1bGtTaXplICE9IDApICYmIChwVHhXSS0+UEhZTU9ERSA9PSBNT0RFX0NDSykpIHsKKwkJCWlmICgoKFRoaXNCdWxrU2l6ZSAmIDB4ZmZmZjgwMDApICE9IDApCisJCQkgICAgfHwgKChUaGlzQnVsa1NpemUgJiAweDEwMDApID09IDB4MTAwMCkpIHsKKwkJCQkvKiBMaW1pdCBCdWxrT3V0IHNpemUgdG8gYWJvdXQgNGsgYnl0ZXMuICovCisJCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9CisJCQkJICAgIFRtcEJ1bGtFbmRQb3M7CiAJCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmICgoKHBBZC0+QnVsa091dE1heFBhY2tldFNpemUgPCA1MTIpICYmICgoVGhpc0J1bGtTaXplJjB4ZmZmZmY4MDApICE9IDApICkgLyp8fCAoIChUaGlzQnVsa1NpemUgIT0gMCkgICYmIChwVHhXSS0+QU1QRFUgPT0gMCkpKi8pCi0JCQl7Ci0JCQkJLy8gRm9yIFVTQiAxLjEgb3IgcGVlciB3aGljaCBkaWRuJ3Qgc3VwcG9ydCBBTVBEVSwgbGltaXQgdGhlIEJ1bGtPdXQgc2l6ZS4KLQkJCQkvLyBGb3IgcGVyZm9ybWVuY2UgaW4gYi9nIG1vZGUsIG5vdyBqdXN0IGNoZWNrIGZvciBVU0IgMS4xIGFuZCBkaWRuJ3QgY2FyZSBhYm91dCB0aGUgQVBNRFUgb3Igbm90ISAyMDA4LzA2LzA0LgotCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPSBUbXBCdWxrRW5kUG9zOworCQkJfSBlbHNlCisJCQkgICAgaWYgKCgocEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSA8IDUxMikKKwkJCQkgJiYgKChUaGlzQnVsa1NpemUgJiAweGZmZmZmODAwKSAhPQorCQkJCSAgICAgMCkpCisJCQkJLyp8fCAoIChUaGlzQnVsa1NpemUgIT0gMCkgICYmIChwVHhXSS0+QU1QRFUgPT0gMCkpICovCisJCQkJKSB7CisJCQkJLyogRm9yIFVTQiAxLjEgb3IgcGVlciB3aGljaCBkaWRuJ3Qgc3VwcG9ydCBBTVBEVSwgbGltaXQgdGhlIEJ1bGtPdXQgc2l6ZS4gKi8KKwkJCQkvKiBGb3IgcGVyZm9ybWVuY2UgaW4gYi9nIG1vZGUsIG5vdyBqdXN0IGNoZWNrIGZvciBVU0IgMS4xIGFuZCBkaWRuJ3QgY2FyZSBhYm91dCB0aGUgQVBNRFUgb3Igbm90ISAyMDA4LzA2LzA0LiAqLworCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPQorCQkJCSAgICBUbXBCdWxrRW5kUG9zOwogCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JCS8vIGVuZCBJdmVyc29uCi0JCWVsc2UKLQkJewotCQkJaWYgKCgoVGhpc0J1bGtTaXplJjB4ZmZmZjgwMDApICE9IDApIHx8ICgoVGhpc0J1bGtTaXplJjB4NjAwMCkgPT0gMHg2MDAwKSkKLQkJCXsJLy8gTGltaXQgQnVsa091dCBzaXplIHRvIGFib3V0IDI0ayBieXRlcy4KLQkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0gVG1wQnVsa0VuZFBvczsKKwkJLyogZW5kIEl2ZXJzb24gKi8KKwkJZWxzZSB7CisJCQlpZiAoKChUaGlzQnVsa1NpemUgJiAweGZmZmY4MDAwKSAhPSAwKSB8fCAoKFRoaXNCdWxrU2l6ZSAmIDB4NjAwMCkgPT0gMHg2MDAwKSkgewkvKiBMaW1pdCBCdWxrT3V0IHNpemUgdG8gYWJvdXQgMjRrIGJ5dGVzLiAqLworCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPQorCQkJCSAgICBUbXBCdWxrRW5kUG9zOwogCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAoKChwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplIDwgNTEyKSAmJiAoKFRoaXNCdWxrU2l6ZSYweGZmZmZmODAwKSAhPSAwKSApIC8qfHwgKCAoVGhpc0J1bGtTaXplICE9IDApICAmJiAocFR4V0ktPkFNUERVID09IDApKSovKQotCQkJewkvLyBGb3IgVVNCIDEuMSBvciBwZWVyIHdoaWNoIGRpZG4ndCBzdXBwb3J0IEFNUERVLCBsaW1pdCB0aGUgQnVsa091dCBzaXplLgotCQkJCS8vIEZvciBwZXJmb3JtZW5jZSBpbiBiL2cgbW9kZSwgbm93IGp1c3QgY2hlY2sgZm9yIFVTQiAxLjEgYW5kIGRpZG4ndCBjYXJlIGFib3V0IHRoZSBBUE1EVSBvciBub3QhIDIwMDgvMDYvMDQuCi0JCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9IFRtcEJ1bGtFbmRQb3M7CisJCQl9IGVsc2UgaWYgKCgocEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSA8IDUxMikgJiYgKChUaGlzQnVsa1NpemUgJiAweGZmZmZmODAwKSAhPSAwKSkgLyp8fCAoIChUaGlzQnVsa1NpemUgIT0gMCkgICYmIChwVHhXSS0+QU1QRFUgPT0gMCkpICovICkgewkvKiBGb3IgVVNCIDEuMSBvciBwZWVyIHdoaWNoIGRpZG4ndCBzdXBwb3J0IEFNUERVLCBsaW1pdCB0aGUgQnVsa091dCBzaXplLiAqLworCQkJCS8qIEZvciBwZXJmb3JtZW5jZSBpbiBiL2cgbW9kZSwgbm93IGp1c3QgY2hlY2sgZm9yIFVTQiAxLjEgYW5kIGRpZG4ndCBjYXJlIGFib3V0IHRoZSBBUE1EVSBvciBub3QhIDIwMDgvMDYvMDQuICovCisJCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9CisJCQkJICAgIFRtcEJ1bGtFbmRQb3M7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAotCQlpZiAoVG1wQnVsa0VuZFBvcyA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pCi0JCXsKKwkJaWYgKFRtcEJ1bGtFbmRQb3MgPT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSB7CiAJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0gVG1wQnVsa0VuZFBvczsKIAkJCWJyZWFrOwogCQl9CiAKLQkJLy9QUyBwYWNrZXRzIHVzZSBIQ0NBIHF1ZXVlIHdoZW4gZGVxdWV1ZSBmcm9tIFBTIHVuaWNhc3QgcXVldWUgKFdpRmkgV1BBMiBNQTlfRFQxIGZvciBNYXJ2ZWxsIEIgU1RBKQotCQlpZiAocFR4SW5mby0+UVNFTCAhPSBGSUZPX0VEQ0EpCi0JCXsKLQkJCXByaW50aygiJXMoKTogPT09PT4gcFR4SW5mby0+UXVldWVTZWwoJWQpIT0gRklGT19FRENBISEhIVxuIiwgX19mdW5jX18sIHBUeEluZm8tPlFTRUwpOwotCQkJcHJpbnRrKCJcdENXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCFcbiIsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCk7Ci0JCQloZXhfZHVtcCgiV3JvbmcgUVNlbCBQa3Q6IiwgKFBVQ0hBUikmcFdpcmVsZXNzUGt0W1RtcEJ1bGtFbmRQb3NdLCAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uIC0gcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSk7CisJCWlmIChwVHhJbmZvLT5RU0VMICE9IEZJRk9fRURDQSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiJXMoKTogPT09PT4gcFR4SW5mby0+UXVldWVTZWwoJWQpIT0gRklGT19FRENBISEhIVxuIiwKKwkJCQkgIF9fRlVOQ1RJT05fXywgcFR4SW5mby0+UVNFTCkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiXHRDV1Bvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQhXG4iLAorCQkJCSAgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLAorCQkJCSAgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLAorCQkJCSAgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwKKwkJCQkgIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKSk7CisJCQloZXhfZHVtcCgiV3JvbmcgUVNlbCBQa3Q6IiwKKwkJCQkgKHU4ICopJiBwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvc10sCisJCQkJIChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gLQorCQkJCSAgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSk7CiAJCX0KIAotCQlpZiAocFR4SW5mby0+VVNCRE1BVHhQa3RMZW4gPD0gOCkKLQkJewotCQkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MyKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SIC8qUlRfREVCVUdfVFJBQ0UqLywoImUyLCBVU0JETUFUeFBrdExlbj09MCwgU2l6ZT0lbGQsIGJDU1BhZD0lZCwgQ1dQb3M9JWxkLCBOQlBvcz0lbGQsIENXUlBvcz0lbGQhXG4iLAotCQkJCQlwSFRUWENvbnRleHQtPkJ1bGtPdXRTaXplLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zKSk7CisJCWlmIChwVHhJbmZvLT5VU0JETUFUeFBrdExlbiA8PSA4KSB7CisJCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLAorCQkJCQlJcnFGbGFnczIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IgLypSVF9ERUJVR19UUkFDRSAqLyAsCisJCQkJICgiZTIsIFVTQkRNQVR4UGt0TGVuPT0wLCBTaXplPSVsZCwgYkNTUGFkPSVkLCBDV1Bvcz0lbGQsIE5CUG9zPSVsZCwgQ1dSUG9zPSVsZCFcbiIsCisJCQkJICBwSFRUWENvbnRleHQtPkJ1bGtPdXRTaXplLAorCQkJCSAgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQsCisJCQkJICBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sCisJCQkJICBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sCisJCQkJICBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcykpOwogCQkJewotCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiAvKlJUX0RFQlVHX1RSQUNFKi8sKCIleCAgJXggICV4ICAleCAgJXggICV4ICAleCAgJXggXG4iLAotCQkJCQlwSFRUWENvbnRleHQtPlNhdmVkUGFkWzBdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzFdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzJdLHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbM10KLQkJCQkJLHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNF0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNV0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNl0scEhUVFhDb250ZXh0LT5TYXZlZFBhZFs3XSkpOworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiAvKlJUX0RFQlVHX1RSQUNFICovCisJCQkJCSAgICAgLAorCQkJCQkgICAgICgiJXggICV4ICAleCAgJXggICV4ICAleCAgJXggICV4IFxuIiwKKwkJCQkJICAgICAgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFswXSwKKwkJCQkJICAgICAgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFsxXSwKKwkJCQkJICAgICAgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFsyXSwKKwkJCQkJICAgICAgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFszXQorCQkJCQkgICAgICAsIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNF0sCisJCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNV0sCisJCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNl0sCisJCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbN10pKTsKIAkJCX0KIAkJCXBBZC0+YkZvcmNlUHJpbnRUWCA9IFRSVUU7Ci0JCQlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJCQlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLAorCQkJCSAgICAgIElycUZsYWdzKTsKIAkJCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBGQUxTRTsKLQkJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwotCQkJLy9EQkdQUklOVChSVF9ERUJVR19MT1VELCgiT3V0OnBUeEluZm8tPlVTQkRNQVR4UGt0TGVuPSVkIVxuIiwgcFR4SW5mby0+VVNCRE1BVHhQa3RMZW4pKTsKKwkJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwKKwkJCQkJSXJxRmxhZ3MpOworCQkJLypEQkdQUklOVChSVF9ERUJVR19MT1VELCgiT3V0OnBUeEluZm8tPlVTQkRNQVR4UGt0TGVuPSVkIVxuIiwgcFR4SW5mby0+VVNCRE1BVHhQa3RMZW4pKTsgKi8KIAkJCXJldHVybjsKIAkJfQotCi0JCQkvLyBJbmNyZWFzZSBUb3RhbCB0cmFuc21pdCBieXRlIGNvdW50ZXIKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUcmFuc21pdHRlZEJ5dGVDb3VudCArPSAgcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudCArPSAgcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKKwkJLyogSW5jcmVhc2UgVG90YWwgdHJhbnNtaXQgYnl0ZSBjb3VudGVyICovCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0KKwkJICAgIHBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0KKwkJICAgIHBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQ7CiAKIAkJcExhc3RUeEluZm8gPSBwVHhJbmZvOwogCi0JCS8vIE1ha2Ugc3VyZSB3ZSB1c2UgRURDQSBRVUVVRS4KLQkJcFR4SW5mby0+UVNFTCA9IEZJRk9fRURDQTsgIC8vUFMgcGFja2V0cyB1c2UgSENDQSBxdWV1ZSB3aGVuIGRlcXVldWUgZnJvbSBQUyB1bmljYXN0IHF1ZXVlIChXaUZpIFdQQTIgTUE5X0RUMSBmb3IgTWFydmVsbCBCIFNUQSkKLQkJVGhpc0J1bGtTaXplICs9IChwVHhJbmZvLT5VU0JETUFUeFBrdExlbis0KTsKLQkJVG1wQnVsa0VuZFBvcyArPSAocFR4SW5mby0+VVNCRE1BVHhQa3RMZW4rNCk7CisJCS8qIE1ha2Ugc3VyZSB3ZSB1c2UgRURDQSBRVUVVRS4gKi8KKwkJcFR4SW5mby0+UVNFTCA9IEZJRk9fRURDQTsKKwkJVGhpc0J1bGtTaXplICs9IChwVHhJbmZvLT5VU0JETUFUeFBrdExlbiArIDQpOworCQlUbXBCdWxrRW5kUG9zICs9IChwVHhJbmZvLT5VU0JETUFUeFBrdExlbiArIDQpOwogCiAJCWlmIChUbXBCdWxrRW5kUG9zICE9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikKIAkJCXBUeEluZm8tPlVTQkRNQU5leHRWTEQgPSAxOwogCi0JCWlmIChwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9PSAxKQotCQl7CisJCWlmIChwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9PSAxKSB7CiAJCQlpZiAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID09IDgpCiAJCQkJcFR4SW5mby0+VVNCRE1BTmV4dFZMRCA9IDA7CiAJCQlwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9IDA7CkBAIC0zNjgsNjggKzM5Nyw4OCBAQAogCiAJCQlicmVhazsKIAkJfQotCX13aGlsZSAoVFJVRSk7CiAKLQkvLyBhZGp1c3QgdGhlIHBUeEluZm8tPlVTQkRNQU5leHRWTEQgdmFsdWUgb2YgbGFzdCBwVHhJbmZvLgotCWlmIChwTGFzdFR4SW5mbykKLQl7CisJfSB3aGlsZSAoVFJVRSk7CisKKwkvKiBhZGp1c3QgdGhlIHBUeEluZm8tPlVTQkRNQU5leHRWTEQgdmFsdWUgb2YgbGFzdCBwVHhJbmZvLiAqLworCWlmIChwTGFzdFR4SW5mbykgewogCQlwTGFzdFR4SW5mby0+VVNCRE1BTmV4dFZMRCA9IDA7CiAJfQogCiAJLyoKLQkJV2UgbmVlZCB0byBjb3B5IFNhdmVkUGFkIHdoZW4gZm9sbG93aW5nIGNvbmRpdGlvbiBtYXRjaGVkIQotCQkJMS4gTm90IHRoZSBsYXN0IHJvdW5kIG9mIHRoZSBUeFF1ZXVlIGFuZAotCQkJMi4gYW55IG1hdGNoIG9mIGZvbGxvd2luZyBjYXNlczoKLQkJCQkoMSkuIFRoZSBFbmQgUG9zaXRpb24gb2YgdGhpcyBidWxrIG91dCBpcyByZWFjaCB0byB0aGUgQ3VycmVuY3QgV3JpdGUgcG9zaXRpb24gYW5kCi0JCQkJCQl0aGUgVHhJbmZvIGFuZCByZWxhdGVkIGhlYWRlciBhbHJlYWR5IHdyaXRlIHRvIHRoZSBDdXJXcml0ZVBvc2l0aW9uLgotCQkJICAgCQk9PihFTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBDdXJXcml0ZVBvc2l0aW9uKSAmJiAoQ3VyV3JpdGVSZWFsUG9zID4gQ3VyV3JpdGVQb3NpdGlvbikKKwkgICBXZSBuZWVkIHRvIGNvcHkgU2F2ZWRQYWQgd2hlbiBmb2xsb3dpbmcgY29uZGl0aW9uIG1hdGNoZWQhCisJICAgMS4gTm90IHRoZSBsYXN0IHJvdW5kIG9mIHRoZSBUeFF1ZXVlIGFuZAorCSAgIDIuIGFueSBtYXRjaCBvZiBmb2xsb3dpbmcgY2FzZXM6CisJICAgKDEpLiBUaGUgRW5kIFBvc2l0aW9uIG9mIHRoaXMgYnVsayBvdXQgaXMgcmVhY2ggdG8gdGhlIEN1cnJlbmN0IFdyaXRlIHBvc2l0aW9uIGFuZAorCSAgIHRoZSBUeEluZm8gYW5kIHJlbGF0ZWQgaGVhZGVyIGFscmVhZHkgd3JpdGUgdG8gdGhlIEN1cldyaXRlUG9zaXRpb24uCisJICAgPT4oRU5leHRCdWxrT3V0UG9zaXRpb24gPT0gQ3VyV3JpdGVQb3NpdGlvbikgJiYgKEN1cldyaXRlUmVhbFBvcyA+IEN1cldyaXRlUG9zaXRpb24pCiAKLQkJCQkoMikuIFRoZSBFbmRQb3NpdGlvbiBvZiB0aGUgYnVsayBvdXQgaXMgbm90IHJlYWNoIHRvIHRoZSBDdXJyZW50IFdyaXRlIFBvc2l0aW9uLgotCQkJCQk9PihFTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPSBDdXJXcml0ZVBvc2l0aW9uKQotCSovCisJICAgKDIpLiBUaGUgRW5kUG9zaXRpb24gb2YgdGhlIGJ1bGsgb3V0IGlzIG5vdCByZWFjaCB0byB0aGUgQ3VycmVudCBXcml0ZSBQb3NpdGlvbi4KKwkgICA9PihFTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPSBDdXJXcml0ZVBvc2l0aW9uKQorCSAqLwogCWlmICgoYlR4UUxhc3RSb3VuZCA9PSBGQUxTRSkgJiYKLQkJICgoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSAmJiAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPiBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKSB8fAotCQkgIChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICE9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCi0JCSkKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBIVFRYQ29udGV4dC0+U2F2ZWRQYWQsICZwV2lyZWxlc3NQa3RbcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbl0sIDgpOworCSAgICAoKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09CisJICAgICAgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikKKwkgICAgICAmJiAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPgorCQkgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCisJICAgICB8fCAocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPQorCQkgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkKKwkgICAgKSB7CisJCU5kaXNNb3ZlTWVtb3J5KHBIVFRYQ29udGV4dC0+U2F2ZWRQYWQsCisJCQkgICAgICAgJnBXaXJlbGVzc1BrdFtwSFRUWENvbnRleHQtPgorCQkJCQkgICAgIEVOZXh0QnVsa091dFBvc2l0aW9uXSwgOCk7CiAJCXBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkID0gVFJVRTsKLQkJaWYgKFJUTVBFcXVhbE1lbW9yeShwSFRUWENvbnRleHQtPlNhdmVkUGFkLCBhbGx6ZXJvLDQpKQotCQl7Ci0JCQlQVUNIQVIJcEJ1ZiA9ICZwSFRUWENvbnRleHQtPlNhdmVkUGFkWzBdOwotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiV0FSTklORy1aZXJvLTM6JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngsQ1dQb3M9JWxkLCBDV1JQb3M9JWxkLCBiQ1c9JWQsIE5CUG9zPSVsZCwgVEJQb3M9JWxkLCBUQlNpemU9JWxkXG4iLAotCQkJCXBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0scEJ1ZlszXSxwQnVmWzRdLCBwQnVmWzVdLCBwQnVmWzZdLHBCdWZbN10sIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MsCi0JCQkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZywgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLCBUbXBCdWxrRW5kUG9zLCBUaGlzQnVsa1NpemUpKTsKKwkJaWYgKFJUTVBFcXVhbE1lbW9yeShwSFRUWENvbnRleHQtPlNhdmVkUGFkLCBhbGx6ZXJvLCA0KSkgeworCQkJdTggKnBCdWYgPSAmcEhUVFhDb250ZXh0LT5TYXZlZFBhZFswXTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCQkgICAgICgiV0FSTklORy1aZXJvLTM6JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngsQ1dQb3M9JWxkLCBDV1JQb3M9JWxkLCBiQ1c9JWQsIE5CUG9zPSVsZCwgVEJQb3M9JWxkLCBUQlNpemU9JWxkXG4iLAorCQkJCSAgICAgIHBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0sIHBCdWZbM10sCisJCQkJICAgICAgcEJ1Zls0XSwgcEJ1Zls1XSwgcEJ1Zls2XSwgcEJ1Zls3XSwKKwkJCQkgICAgICBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sCisJCQkJICAgICAgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MsCisJCQkJICAgICAgcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZywKKwkJCQkgICAgICBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sCisJCQkJICAgICAgVG1wQnVsa0VuZFBvcywgVGhpc0J1bGtTaXplKSk7CiAKIAkJCXBCdWYgPSAmcFdpcmVsZXNzUGt0W3BIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbl07Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJcdENXUG9zPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLCBwQnVmWzBdLCBwQnVmWzFdLCBwQnVmWzJdLHBCdWZbM10scEJ1Zls0XSwgcEJ1Zls1XSwgcEJ1Zls2XSxwQnVmWzddKSk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkJICAgICAoIlx0Q1dQb3M9JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCQkJICAgICAgcEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSwgcEJ1ZlszXSwKKwkJCQkgICAgICBwQnVmWzRdLCBwQnVmWzVdLCBwQnVmWzZdLCBwQnVmWzddKSk7CiAJCX0KLQkJLy9EQkdQUklOVChSVF9ERUJVR19MT1VELCgiRU5Qb3M9PUNXUG9zPSVsZCwgQ1dSUG9zPSVsZCwgYkNTUGFkPSVkIVxuIiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcywgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpKTsKKwkJLypEQkdQUklOVChSVF9ERUJVR19MT1VELCgiRU5Qb3M9PUNXUG9zPSVsZCwgQ1dSUG9zPSVsZCwgYkNTUGFkPSVkIVxuIiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcywgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpKTsgKi8KIAl9CiAKIAlpZiAocEFkLT5iRm9yY2VQcmludFRYID09IFRSVUUpCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQnVsa091dC1BOlNpemU9JWxkLCBDV1Bvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQhXG4iLCBUaGlzQnVsa1NpemUsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCkpOwotCS8vREJHUFJJTlQoUlRfREVCVUdfTE9VRCwoIkJ1bGtPdXQtQTpTaXplPSVsZCwgQ1dQb3M9JWxkLCBDV1JQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkLCBiTFJvdW5kPSVkIVxuIiwgVGhpc0J1bGtTaXplLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkLCBiVHhRTGFzdFJvdW5kKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQnVsa091dC1BOlNpemU9JWxkLCBDV1Bvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQhXG4iLAorCQkJICBUaGlzQnVsa1NpemUsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwKKwkJCSAgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLAorCQkJICBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLAorCQkJICBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCkpOworCS8qREJHUFJJTlQoUlRfREVCVUdfTE9VRCwoIkJ1bGtPdXQtQTpTaXplPSVsZCwgQ1dQb3M9JWxkLCBDV1JQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkLCBiTFJvdW5kPSVkIVxuIiwgVGhpc0J1bGtTaXplLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkLCBiVHhRTGFzdFJvdW5kKSk7ICovCiAKLQkJLy8gVVNCIERNQSBlbmdpbmUgcmVxdWlyZXMgdG8gcGFkIGV4dHJhIDQgYnl0ZXMuIFRoaXMgcGFkIGRvZXNuJ3QgY291bnQgaW50byByZWFsIGJ1bGtvdXRzaXplLgorCS8qIFVTQiBETUEgZW5naW5lIHJlcXVpcmVzIHRvIHBhZCBleHRyYSA0IGJ5dGVzLiBUaGlzIHBhZCBkb2Vzbid0IGNvdW50IGludG8gcmVhbCBidWxrb3V0c2l6ZS4gKi8KIAlwQXBwZW5kYW50ID0gJnBXaXJlbGVzc1BrdFtUbXBCdWxrRW5kUG9zXTsKIAlOZGlzWmVyb01lbW9yeShwQXBwZW5kYW50LCA4KTsKKwlUaGlzQnVsa1NpemUgKz0gNDsKKwlwSFRUWENvbnRleHQtPkxhc3RPbmUgPSBUUlVFOworCWlmICgoVGhpc0J1bGtTaXplICUgcEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSkgPT0gMCkKIAkJVGhpc0J1bGtTaXplICs9IDQ7Ci0JCXBIVFRYQ29udGV4dC0+TGFzdE9uZSA9IFRSVUU7Ci0JCWlmICgoVGhpc0J1bGtTaXplICUgcEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSkgPT0gMCkKLQkJCVRoaXNCdWxrU2l6ZSArPSA0OwogCXBIVFRYQ29udGV4dC0+QnVsa091dFNpemUgPSBUaGlzQnVsa1NpemU7CiAKIAlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W0J1bGtPdXRQaXBlSWRdID0gMTsKIAlCVUxLX09VVF9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFnczIpOwogCi0JLy8gSW5pdCBUeCBjb250ZXh0IGRlc2NyaXB0b3IKLQlSVFVTQkluaXRIVFR4RGVzYyhwQWQsIHBIVFRYQ29udGV4dCwgQnVsa091dFBpcGVJZCwgVGhpc0J1bGtTaXplLCAodXNiX2NvbXBsZXRlX3QpUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKTsKKwkvKiBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvciAqLworCVJUVVNCSW5pdEhUVHhEZXNjKHBBZCwgcEhUVFhDb250ZXh0LCBCdWxrT3V0UGlwZUlkLCBUaGlzQnVsa1NpemUsCisJCQkgICh1c2JfY29tcGxldGVfdCkgUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKTsKIAogCXBVcmIgPSBwSFRUWENvbnRleHQtPnBVcmI7Ci0JaWYoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JCdWxrT3V0RGF0YVBhY2tldDogU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOworCWlmICgocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkgIT0gMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIlJUVVNCQnVsa091dERhdGFQYWNrZXQ6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLAorCQkJICByZXQpKTsKIAogCQlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CiAJCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBGQUxTRTsKQEAgLTQ0Niw0OCArNDk1LDQxIEBACiAKIH0KIAotCi1WT0lEIFJUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQordm9pZCBSVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUoc3RydWN0IHVyYiAqcFVyYiwgc3RydWN0IHB0X3JlZ3MgKiBwdF9yZWdzKQogewotCVBIVF9UWF9DT05URVhUCXBIVFRYQ29udGV4dDsKLQlQUlRNUF9BREFQVEVSCXBBZDsKLQlQT1NfQ09PS0lFIAkJcE9iajsKLQlVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQ7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKwl1OCBCdWxrT3V0UGlwZUlkOwogCisJcEhUVFhDb250ZXh0ID0gKHN0cnVjdCBydF9odF90eF9jb250ZXh0ICopcFVyYi0+Y29udGV4dDsKKwlwQWQgPSBwSFRUWENvbnRleHQtPnBBZDsKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKIAotCXBIVFRYQ29udGV4dAk9IChQSFRfVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OwotCXBBZCAJCQk9IHBIVFRYQ29udGV4dC0+cEFkOwotCXBPYmogCQkJPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQkvLyBTdG9yZSBCdWxrT3V0IFBpcGVJZAotCUJ1bGtPdXRQaXBlSWQJPSBwSFRUWENvbnRleHQtPkJ1bGtPdXRQaXBlSWQ7CisJLyogU3RvcmUgQnVsa091dCBQaXBlSWQgKi8KKwlCdWxrT3V0UGlwZUlkID0gcEhUVFhDb250ZXh0LT5CdWxrT3V0UGlwZUlkOwogCXBBZC0+QnVsa091dERhdGFPbmVTZWNDb3VudCsrOwogCi0Jc3dpdGNoIChCdWxrT3V0UGlwZUlkKQotCXsKLQkJY2FzZSAwOgotCQkJCXBPYmotPmFjMF9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOwotCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKLQkJCQlicmVhazsKLQkJY2FzZSAxOgotCQkJCXBPYmotPmFjMV9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOwotCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKLQkJCQlicmVhazsKLQkJY2FzZSAyOgotCQkJCXBPYmotPmFjMl9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOwotCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKLQkJCQlicmVhazsKLQkJY2FzZSAzOgotCQkJCXBPYmotPmFjM19kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOwotCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKLQkJCQlicmVhazsKLQkJY2FzZSA0OgotCQkJCXBPYmotPmhjY2FfZG1hX2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKLQkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOwotCQkJCWJyZWFrOworCXN3aXRjaCAoQnVsa091dFBpcGVJZCkgeworCWNhc2UgMDoKKwkJcE9iai0+YWMwX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlwT2JqLT5hYzFfZG1hX2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOworCQlicmVhazsKKwljYXNlIDI6CisJCXBPYmotPmFjMl9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOworCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJcE9iai0+YWMzX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKKwkJYnJlYWs7CiAJfQotfQogCit9CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC01MDIsMTcgKzU0NCwxNiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVFVTQkJ1bGtPdXROdWxsRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUVVNCQnVsa091dE51bGxGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JUFRYX0NPTlRFWFQJCXBOdWxsQ29udGV4dCA9ICYocEFkLT5OdWxsQ29udGV4dCk7Ci0JUFVSQgkJCXBVcmI7Ci0JaW50CQkJCXJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcE51bGxDb250ZXh0ID0gJihwQWQtPk51bGxDb250ZXh0KTsKKwlQVVJCIHBVcmI7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKIAogCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKLQlpZiAoKHBBZC0+QnVsa091dFBlbmRpbmdbMF0gPT0gVFJVRSkgfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWCkpCi0JeworCWlmICgocEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9PSBUUlVFKQorCSAgICB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYKSkgewogCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKIAkJcmV0dXJuOwogCX0KQEAgLTUyMSw0NSArNTYyLDQ1IEBACiAJcE51bGxDb250ZXh0LT5JUlBQZW5kaW5nID0gVFJVRTsKIAlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKIAotCS8vIEluY3JlYXNlIFRvdGFsIHRyYW5zbWl0IGJ5dGUgY291bnRlcgotCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIHBOdWxsQ29udGV4dC0+QnVsa091dFNpemU7CisJLyogSW5jcmVhc2UgVG90YWwgdHJhbnNtaXQgYnl0ZSBjb3VudGVyICovCisJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudCArPSBwTnVsbENvbnRleHQtPkJ1bGtPdXRTaXplOwogCi0KLQkvLyBDbGVhciBOdWxsIGZyYW1lIGJ1bGsgZmxhZworCS8qIENsZWFyIE51bGwgZnJhbWUgYnVsayBmbGFnICovCiAJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTlVMTCk7CiAKLQkvLyBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvcgotCVJUVVNCSW5pdFR4RGVzYyhwQWQsIHBOdWxsQ29udGV4dCwgMCwgKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa091dE51bGxGcmFtZUNvbXBsZXRlKTsKKwkvKiBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvciAqLworCVJUVVNCSW5pdFR4RGVzYyhwQWQsIHBOdWxsQ29udGV4dCwgMCwKKwkJCSh1c2JfY29tcGxldGVfdCkgUlRVU0JCdWxrT3V0TnVsbEZyYW1lQ29tcGxldGUpOwogCiAJcFVyYiA9IHBOdWxsQ29udGV4dC0+cFVyYjsKLQlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCi0JeworCWlmICgocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkgIT0gMCkgewogCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CiAJCXBBZC0+QnVsa091dFBlbmRpbmdbMF0gPSBGQUxTRTsKIAkJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFswXSA9IDA7CiAJCXBOdWxsQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOwogCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKIAotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtPdXROdWxsRnJhbWU6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJSVFVTQkJ1bGtPdXROdWxsRnJhbWU6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLAorCQkJICByZXQpKTsKIAkJcmV0dXJuOwogCX0KIAogfQogCi0vLyBOVUxMIGZyYW1lIHVzZSBCdWxrT3V0UGlwZUlkID0gMAotVk9JRCBSVFVTQkJ1bGtPdXROdWxsRnJhbWVDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQorLyogTlVMTCBmcmFtZSB1c2UgQnVsa091dFBpcGVJZCA9IDAgKi8KK3ZvaWQgUlRVU0JCdWxrT3V0TnVsbEZyYW1lQ29tcGxldGUoc3RydWN0IHVyYiAqcFVyYiwgc3RydWN0IHB0X3JlZ3MgKiBwdF9yZWdzKQogewotCVBSVE1QX0FEQVBURVIJCXBBZDsKLQlQVFhfQ09OVEVYVAkJCXBOdWxsQ29udGV4dDsKLQlOVFNUQVRVUwkJCVN0YXR1czsKLQlQT1NfQ09PS0lFCQkJcE9iajsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBOdWxsQ29udGV4dDsKKwlpbnQgU3RhdHVzOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CiAKKwlwTnVsbENvbnRleHQgPSAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKilwVXJiLT5jb250ZXh0OworCXBBZCA9IHBOdWxsQ29udGV4dC0+cEFkOworCVN0YXR1cyA9IHBVcmItPnN0YXR1czsKIAotCXBOdWxsQ29udGV4dAk9IChQVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OwotCXBBZCAJCQk9IHBOdWxsQ29udGV4dC0+cEFkOwotCVN0YXR1cyAJCQk9IHBVcmItPnN0YXR1czsKLQotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CiAJcE9iai0+bnVsbF9mcmFtZV9jb21wbGV0ZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOwogCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPm51bGxfZnJhbWVfY29tcGxldGVfdGFzayk7CiB9CkBAIC01NzcsMzQgKzYxOCwzMCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVFVTQkJ1bGtPdXRNTE1FUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJSW5kZXgpCit2b2lkIFJUVVNCQnVsa091dE1MTUVQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBJbmRleCkKIHsKLQlQVFhfQ09OVEVYVAkJcE1MTUVDb250ZXh0OwotCVBVUkIJCQlwVXJiOwotCWludAkJCQlyZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBNTE1FQ29udGV4dDsKKwlQVVJCIHBVcmI7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKIAotCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVClwQWQtPk1nbXRSaW5nLkNlbGxbcEFkLT5NZ210UmluZy5UeERtYUlkeF0uQWxsb2NWYTsKKwlwTUxNRUNvbnRleHQgPQorCSAgICAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKilwQWQtPk1nbXRSaW5nLkNlbGxbcEFkLT5NZ210UmluZy5UeERtYUlkeF0uQWxsb2NWYTsKIAlwVXJiID0gcE1MTUVDb250ZXh0LT5wVXJiOwogCiAJaWYgKChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID49IE1HTVRfUklOR19TSVpFKSB8fAotCQkocE1MTUVDb250ZXh0LT5JblVzZSA9PSBGQUxTRSkgfHwKLQkJKHBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID09IEZBTFNFKSkKLQl7CisJICAgIChwTUxNRUNvbnRleHQtPkluVXNlID09IEZBTFNFKSB8fAorCSAgICAocE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPT0gRkFMU0UpKSB7CiAKLQotCQkvLyBDbGVhciBNTE1FIGJ1bGsgZmxhZworCQkvKiBDbGVhciBNTE1FIGJ1bGsgZmxhZyAqLwogCQlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfTUxNRSk7CiAKIAkJcmV0dXJuOwogCX0KIAotCiAJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKLQlpZiAoKHBBZC0+QnVsa091dFBlbmRpbmdbTUdNVFBJUEVJRFhdID09IFRSVUUpIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpKQotCXsKKwlpZiAoKHBBZC0+QnVsa091dFBlbmRpbmdbTUdNVFBJUEVJRFhdID09IFRSVUUpCisJICAgIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpKSB7CiAJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKIAkJcmV0dXJuOwogCX0KQEAgLTYxNSwyMyArNjUyLDI1IEBACiAJcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBGQUxTRTsKIAlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdLCBJcnFGbGFncyk7CiAKLQkvLyBJbmNyZWFzZSBUb3RhbCB0cmFuc21pdCBieXRlIGNvdW50ZXIKLQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICBwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplOworCS8qIEluY3JlYXNlIFRvdGFsIHRyYW5zbWl0IGJ5dGUgY291bnRlciAqLworCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gcE1MTUVDb250ZXh0LT5CdWxrT3V0U2l6ZTsKIAotCS8vIENsZWFyIE1MTUUgYnVsayBmbGFnCisJLyogQ2xlYXIgTUxNRSBidWxrIGZsYWcgKi8KIAlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfTUxNRSk7CiAKLQkvLyBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvcgotCVJUVVNCSW5pdFR4RGVzYyhwQWQsIHBNTE1FQ29udGV4dCwgTUdNVFBJUEVJRFgsICh1c2JfY29tcGxldGVfdClSVFVTQkJ1bGtPdXRNTE1FUGFja2V0Q29tcGxldGUpOworCS8qIEluaXQgVHggY29udGV4dCBkZXNjcmlwdG9yICovCisJUlRVU0JJbml0VHhEZXNjKHBBZCwgcE1MTUVDb250ZXh0LCBNR01UUElQRUlEWCwKKwkJCSh1c2JfY29tcGxldGVfdCkgUlRVU0JCdWxrT3V0TUxNRVBhY2tldENvbXBsZXRlKTsKIAotCS8vRm9yIG1nbXQgdXJiIGJ1ZmZlciwgYmVjYXVzZSB3ZSB1c2Ugc2tfYnVmZiwgc28gd2UgbmVlZCB0byBub3RpZnkgdGhlIFVTQiBjb250cm9sbGVyIGRvIGRtYSBtYXBwaW5nLgotCXBVcmItPnRyYW5zZmVyX2RtYQk9IDA7CisJLypGb3IgbWdtdCB1cmIgYnVmZmVyLCBiZWNhdXNlIHdlIHVzZSBza19idWZmLCBzbyB3ZSBuZWVkIHRvIG5vdGlmeSB0aGUgVVNCIGNvbnRyb2xsZXIgZG8gZG1hIG1hcHBpbmcuICovCisJcFVyYi0+dHJhbnNmZXJfZG1hID0gMDsKIAlwVXJiLT50cmFuc2Zlcl9mbGFncyAmPSAoflVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQKTsKIAogCXBVcmIgPSBwTUxNRUNvbnRleHQtPnBVcmI7Ci0JaWYoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JCdWxrT3V0TUxNRVBhY2tldDogU3VibWl0IE1MTUUgVVJCIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJaWYgKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSAhPSAwKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiUlRVU0JCdWxrT3V0TUxNRVBhY2tldDogU3VibWl0IE1MTUUgVVJCIGZhaWxlZCAlZFxuIiwKKwkJCSAgcmV0KSk7CiAJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdLCBJcnFGbGFncyk7CiAJCXBBZC0+QnVsa091dFBlbmRpbmdbTUdNVFBJUEVJRFhdID0gRkFMU0U7CiAJCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbTUdNVFBJUEVJRFhdID0gMDsKQEAgLTY0MSwzMiArNjgwLDI5IEBACiAKIAkJcmV0dXJuOwogCX0KLQotCS8vREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiPC0tLVJUVVNCQnVsa091dE1MTUVQYWNrZXQgXG4iKSk7Ci0vLwlwcmludGsoIjwtLS1SVFVTQkJ1bGtPdXRNTE1FUGFja2V0LENwdT0lZCEsIERtYT0lZCwgU3dJZHg9JWQhXG4iLCBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4LCBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4KTsKKwkvKkRCR1BSSU5UX1JBVyhSVF9ERUJVR19JTkZPLCAoIjwtLS1SVFVTQkJ1bGtPdXRNTE1FUGFja2V0IFxuIikpOyAqLworLyogICAgICBwcmludGsoIjwtLS1SVFVTQkJ1bGtPdXRNTE1FUGFja2V0LENwdT0lZCEsIERtYT0lZCwgU3dJZHg9JWQhXG4iLCBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4LCBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4KTsgKi8KIH0KIAotCi1WT0lEIFJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQordm9pZCBSVFVTQkJ1bGtPdXRNTE1FUGFja2V0Q29tcGxldGUoc3RydWN0IHVyYiAqcFVyYiwgc3RydWN0IHB0X3JlZ3MgKiBwdF9yZWdzKQogewotCVBUWF9DT05URVhUCQkJcE1MTUVDb250ZXh0OwotCVBSVE1QX0FEQVBURVIJCXBBZDsKLQlOVFNUQVRVUwkJCVN0YXR1czsKLQlQT1NfQ09PS0lFIAkJCXBPYmo7Ci0JaW50CQkJCQlpbmRleDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcE1MTUVDb250ZXh0OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlpbnQgU3RhdHVzOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisJaW50IGluZGV4OwogCi0JLy9EQkdQUklOVF9SQVcoUlRfREVCVUdfSU5GTywgKCItLS0+UlRVU0JCdWxrT3V0TUxNRVBhY2tldENvbXBsZXRlXG4iKSk7Ci0JcE1MTUVDb250ZXh0CT0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7Ci0JcEFkIAkJCT0gcE1MTUVDb250ZXh0LT5wQWQ7Ci0JcE9iaiAJCQk9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCVN0YXR1cwkJCT0gcFVyYi0+c3RhdHVzOwotCWluZGV4IAkJCT0gcE1MTUVDb250ZXh0LT5TZWxmSWR4OworCS8qREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiLS0tPlJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZVxuIikpOyAqLworCXBNTE1FQ29udGV4dCA9IChzdHJ1Y3QgcnRfdHhfY29udGV4dCAqKXBVcmItPmNvbnRleHQ7CisJcEFkID0gcE1MTUVDb250ZXh0LT5wQWQ7CisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisJU3RhdHVzID0gcFVyYi0+c3RhdHVzOworCWluZGV4ID0gcE1MTUVDb250ZXh0LT5TZWxmSWR4OwogCiAJcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOwogCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzayk7CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtNjgwLDE3ICs3MTYsMTYgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRVU0JCdWxrT3V0UHNQb2xsKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVFVTQkJ1bGtPdXRQc1BvbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVBUWF9DT05URVhUCQlwUHNQb2xsQ29udGV4dCA9ICYocEFkLT5Qc1BvbGxDb250ZXh0KTsKLQlQVVJCCQkJcFVyYjsKLQlpbnQJCQkJcmV0ID0gMDsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwUHNQb2xsQ29udGV4dCA9ICYocEFkLT5Qc1BvbGxDb250ZXh0KTsKKwlQVVJCIHBVcmI7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKIAogCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKLQlpZiAoKHBBZC0+QnVsa091dFBlbmRpbmdbMF0gPT0gVFJVRSkgfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWCkpCi0JeworCWlmICgocEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9PSBUUlVFKQorCSAgICB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYKSkgewogCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKIAkJcmV0dXJuOwogCX0KQEAgLTY5OSw1NyArNzM0LDU3IEBACiAJcFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOwogCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOwogCi0KLQkvLyBDbGVhciBQUy1Qb2xsIGJ1bGsgZmxhZworCS8qIENsZWFyIFBTLVBvbGwgYnVsayBmbGFnICovCiAJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX1BTUE9MTCk7CiAKLQkvLyBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvcgotCVJUVVNCSW5pdFR4RGVzYyhwQWQsIHBQc1BvbGxDb250ZXh0LCBNR01UUElQRUlEWCwgKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa091dFBzUG9sbENvbXBsZXRlKTsKKwkvKiBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvciAqLworCVJUVVNCSW5pdFR4RGVzYyhwQWQsIHBQc1BvbGxDb250ZXh0LCBNR01UUElQRUlEWCwKKwkJCSh1c2JfY29tcGxldGVfdCkgUlRVU0JCdWxrT3V0UHNQb2xsQ29tcGxldGUpOwogCiAJcFVyYiA9IHBQc1BvbGxDb250ZXh0LT5wVXJiOwotCWlmKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSE9MCkKLQl7CisJaWYgKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSAhPSAwKSB7CiAJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKIAkJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IEZBTFNFOwogCQlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250WzBdID0gMDsKIAkJcFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKIAkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CiAKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JCdWxrT3V0UHNQb2xsOiBTdWJtaXQgVHggVVJCIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiUlRVU0JCdWxrT3V0UHNQb2xsOiBTdWJtaXQgVHggVVJCIGZhaWxlZCAlZFxuIiwKKwkJCSAgcmV0KSk7CiAJCXJldHVybjsKIAl9CiAKIH0KIAotLy8gUFMtUG9sbCBmcmFtZSB1c2UgQnVsa091dFBpcGVJZCA9IDAKLVZPSUQgUlRVU0JCdWxrT3V0UHNQb2xsQ29tcGxldGUocHVyYmJfdCBwVXJiLHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQorLyogUFMtUG9sbCBmcmFtZSB1c2UgQnVsa091dFBpcGVJZCA9IDAgKi8KK3ZvaWQgUlRVU0JCdWxrT3V0UHNQb2xsQ29tcGxldGUoc3RydWN0IHVyYiAqcFVyYiwgc3RydWN0IHB0X3JlZ3MgKiBwdF9yZWdzKQogewotCVBSVE1QX0FEQVBURVIJCXBBZDsKLQlQVFhfQ09OVEVYVAkJCXBQc1BvbGxDb250ZXh0OwotCU5UU1RBVFVTCQkJU3RhdHVzOwotCVBPU19DT09LSUUJCQlwT2JqOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcFBzUG9sbENvbnRleHQ7CisJaW50IFN0YXR1czsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOwogCi0KLQlwUHNQb2xsQ29udGV4dD0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcFBzUG9sbENvbnRleHQgPSAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKilwVXJiLT5jb250ZXh0OwogCXBBZCA9IHBQc1BvbGxDb250ZXh0LT5wQWQ7CiAJU3RhdHVzID0gcFVyYi0+c3RhdHVzOwogCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKIAlwT2JqLT5wc3BvbGxfZnJhbWVfY29tcGxldGVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKIAl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5wc3BvbGxfZnJhbWVfY29tcGxldGVfdGFzayk7CiB9CiAKLVZPSUQgRG9CdWxrSW4oSU4gUlRNUF9BREFQVEVSICpwQWQpCit2b2lkIERvQnVsa0luKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKLQlQVVJCCQkJcFVyYjsKLQlpbnQJCQkJcmV0ID0gMDsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCXN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0OworCVBVUkIgcFVyYjsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzOwogCiAJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CiAJcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbcEFkLT5OZXh0UnhCdWxrSW5JbmRleF0pOwotCWlmICgocEFkLT5QZW5kaW5nUnggPiAwKSB8fCAocFJ4Q29udGV4dC0+UmVhZGFibGUgPT0gVFJVRSkgfHwgKHBSeENvbnRleHQtPkluVXNlID09IFRSVUUpKQotCXsKKwlpZiAoKHBBZC0+UGVuZGluZ1J4ID4gMCkgfHwgKHBSeENvbnRleHQtPlJlYWRhYmxlID09IFRSVUUpCisJICAgIHx8IChwUnhDb250ZXh0LT5JblVzZSA9PSBUUlVFKSkgewogCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwogCQlyZXR1cm47CiAJfQpAQCAtNzU5LDEzICs3OTQsMTIgQEAKIAlwQWQtPkJ1bGtJblJlcSsrOwogCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CiAKLQkvLyBJbml0IFJ4IGNvbnRleHQgZGVzY3JpcHRvcgorCS8qIEluaXQgUnggY29udGV4dCBkZXNjcmlwdG9yICovCiAJTmRpc1plcm9NZW1vcnkocFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXIsIHBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCk7CiAJUlRVU0JJbml0UnhEZXNjKHBBZCwgcFJ4Q29udGV4dCk7CiAKIAlwVXJiID0gcFJ4Q29udGV4dC0+cFVyYjsKLQlpZiAoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQotCXsJLy8gZmFpbAorCWlmICgocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkgIT0gMCkgewkvKiBmYWlsICovCiAKIAkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CiAJCXBSeENvbnRleHQtPkluVXNlID0gRkFMU0U7CkBAIC03NzMsMTYgKzgwNywxNCBAQAogCQlwQWQtPlBlbmRpbmdSeC0tOwogCQlwQWQtPkJ1bGtJblJlcS0tOwogCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtSZWNlaXZlOiBTdWJtaXQgUnggVVJCIGZhaWxlZCAlZFxuIiwgcmV0KSk7Ci0JfQotCWVsc2UKLQl7CS8vIHN1Y2Nlc3MKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJSVFVTQkJ1bGtSZWNlaXZlOiBTdWJtaXQgUnggVVJCIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJfSBlbHNlIHsJCS8qIHN1Y2Nlc3MgKi8KIAkJQVNTRVJUKChwUnhDb250ZXh0LT5JblVzZSA9PSBwUnhDb250ZXh0LT5JUlBQZW5kaW5nKSk7Ci0JCS8vcHJpbnRrKCJCSURvbmUsIFBlbmQ9JWQsQklJZHg9JWQsQklSSWR4PSVkIVxuIiwgcEFkLT5QZW5kaW5nUngsIHBBZC0+TmV4dFJ4QnVsa0luSW5kZXgsIHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4KTsKKwkJLypwcmludGsoIkJJRG9uZSwgUGVuZD0lZCxCSUlkeD0lZCxCSVJJZHg9JWQhXG4iLCBwQWQtPlBlbmRpbmdSeCwgcEFkLT5OZXh0UnhCdWxrSW5JbmRleCwgcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgpOyAqLwogCX0KIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC04MTMsNDQgKzg0NSw0MCBAQAogCQkgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgXAogCQkgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpCiAKLVZPSUQJUlRVU0JCdWxrUmVjZWl2ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgUlRVU0JCdWxrUmVjZWl2ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JUFJYX0NPTlRFWFQJCXBSeENvbnRleHQ7Ci0JdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKLQorCXN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0OworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CiAKIAkvKiBzYW5pdHkgY2hlY2sgKi8KIAlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9IQU5ETEVfUlgpKQogCQlyZXR1cm47CiAKLQl3aGlsZSgxKQotCXsKKwl3aGlsZSAoMSkgewogCiAJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwogCQlwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleF0pOwotCQlpZiAoKChwUnhDb250ZXh0LT5JblVzZSA9PSBGQUxTRSkgJiYgKHBSeENvbnRleHQtPlJlYWRhYmxlID09IFRSVUUpKSAmJgotCQkJKHBSeENvbnRleHQtPmJSeEhhbmRsaW5nID09IEZBTFNFKSkKLQkJeworCQlpZiAoKChwUnhDb250ZXh0LT5JblVzZSA9PSBGQUxTRSkKKwkJICAgICAmJiAocFJ4Q29udGV4dC0+UmVhZGFibGUgPT0gVFJVRSkpCisJCSAgICAmJiAocFJ4Q29udGV4dC0+YlJ4SGFuZGxpbmcgPT0gRkFMU0UpKSB7CiAJCQlwUnhDb250ZXh0LT5iUnhIYW5kbGluZyA9IFRSVUU7CiAJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwogCi0JCQkvLyByZWFkIFJ4Q29udGV4dCwgU2luY2Ugbm90CisJCQkvKiByZWFkIFJ4Q29udGV4dCwgU2luY2Ugbm90ICovCiAJCQlTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUocEFkLCBUUlVFKTsKIAotCQkJLy8gRmluaXNoIHRvIGhhbmRsZSB0aGlzIGJ1bGtJbiBidWZmZXIuCisJCQkvKiBGaW5pc2ggdG8gaGFuZGxlIHRoaXMgYnVsa0luIGJ1ZmZlci4gKi8KIAkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwogCQkJcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0ID0gMDsKIAkJCXBSeENvbnRleHQtPlJlYWRhYmxlID0gRkFMU0U7CiAJCQlwUnhDb250ZXh0LT5iUnhIYW5kbGluZyA9IEZBTFNFOwogCQkJcEFkLT5SZWFkUG9zaXRpb24gPSAwOwogCQkJcEFkLT5UcmFuc2ZlckJ1ZmZlckxlbmd0aCA9IDA7Ci0JCQlJTkNfUklOR19JTkRFWChwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCwgUlhfUklOR19TSVpFKTsKKwkJCUlOQ19SSU5HX0lOREVYKHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LAorCQkJCSAgICAgICBSWF9SSU5HX1NJWkUpOwogCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKIAotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKIAkJCWJyZWFrOwogCQl9CkBAIC04NjEsNyArODg5LDYgQEAKIAogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTg4NSwyNyArOTEyLDI0IEBACiAJCUFsd2F5cyByZXR1cm5zIFNUQVRVU19NT1JFX1BST0NFU1NJTkdfUkVRVUlSRUQKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIFJUVVNCQnVsa1J4Q29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncykKK3ZvaWQgUlRVU0JCdWxrUnhDb21wbGV0ZShzdHJ1Y3QgdXJiICpwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncykKIHsKLQkvLyB1c2UgYSByZWNlaXZlIHRhc2tsZXQgdG8gaGFuZGxlIHJlY2VpdmVkIHBhY2tldHM7Ci0JLy8gb3Igc29tZXRpbWVzIGhhcmR3YXJlIElSUSB3aWxsIGJlIGRpc2FibGVkIGhlcmUsIHNvIHdlIGNhbiBub3QKLQkvLyB1c2Ugc3Bpbl9sb2NrX2JoKCkvc3Bpbl91bmxvY2tfYmgoKSBhZnRlciBJUlEgaXMgZGlzYWJsZWQuIDo8Ci0JUFJYX0NPTlRFWFQJCXBSeENvbnRleHQ7Ci0JUFJUTVBfQURBUFRFUglwQWQ7Ci0JUE9TX0NPT0tJRSAJCXBPYmo7CisJLyogdXNlIGEgcmVjZWl2ZSB0YXNrbGV0IHRvIGhhbmRsZSByZWNlaXZlZCBwYWNrZXRzOyAqLworCS8qIG9yIHNvbWV0aW1lcyBoYXJkd2FyZSBJUlEgd2lsbCBiZSBkaXNhYmxlZCBoZXJlLCBzbyB3ZSBjYW4gbm90ICovCisJLyogdXNlIHNwaW5fbG9ja19iaCgpL3NwaW5fdW5sb2NrX2JoKCkgYWZ0ZXIgSVJRIGlzIGRpc2FibGVkLiA6PCAqLworCXN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOwogCi0KLQlwUnhDb250ZXh0CT0gKFBSWF9DT05URVhUKXBVcmItPmNvbnRleHQ7Ci0JcEFkIAkJPSBwUnhDb250ZXh0LT5wQWQ7Ci0JcE9iaiAJCT0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCXBSeENvbnRleHQgPSAoc3RydWN0IHJ0X3J4X2NvbnRleHQgKilwVXJiLT5jb250ZXh0OworCXBBZCA9IHBSeENvbnRleHQtPnBBZDsKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKIAogCXBPYmotPnJ4X2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKIAl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5yeF9kb25lX3Rhc2spOwogCiB9CiAKLQotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC05MTksODYgKzk0Myw3OCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVFVTQktpY2tCdWxrT3V0KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBSVFVTQktpY2tCdWxrT3V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQkvLyBCdWxrSW4gUmVzZXQgd2lsbCByZXNldCB3aG9sZSBVU0IgUEhZLiBTbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCBub3QgZmxhZ2VkLgotCWlmICghUlRNUF9URVNUX0ZMQUcocEFkICxmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWCkKLQkJKQotCXsKLQkJLy8gMi4gUFMtUG9sbCBmcmFtZSBpcyBuZXh0Ci0JCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9QU1BPTEwpKQotCQl7CisJLyogQnVsa0luIFJlc2V0IHdpbGwgcmVzZXQgd2hvbGUgVVNCIFBIWS4gU28gd2UgbmVlZCB0byBtYWtlIHN1cmUgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQgbm90IGZsYWdlZC4gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpCisJICAgICkgeworCQkvKiAyLiBQUy1Qb2xsIGZyYW1lIGlzIG5leHQgKi8KKwkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX1BTUE9MTCkpIHsKIAkJCVJUVVNCQnVsa091dFBzUG9sbChwQWQpOwogCQl9Ci0KLQkJLy8gNS4gTWxtZSBmcmFtZSBpcyBuZXh0Ci0JCWVsc2UgaWYgKChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKSkgJiYKLQkJCQkgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPCBNR01UX1JJTkdfU0laRSkpCi0JCXsKKwkJLyogNS4gTWxtZSBmcmFtZSBpcyBuZXh0ICovCisJCWVsc2UgaWYgKChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKSkgfHwKKwkJCSAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA8IE1HTVRfUklOR19TSVpFKSkgewogCQkJUlRVU0JCdWxrT3V0TUxNRVBhY2tldChwQWQsIHBBZC0+TWdtdFJpbmcuVHhEbWFJZHgpOwogCQl9Ci0KLQkJLy8gNi4gRGF0YSBmcmFtZSBub3JtYWwgaXMgbmV4dAotCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwpKQotCQl7Ci0JCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKLQkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCQkpKQotCQkJewotCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAwLCBwQWQtPk5leHRCdWxrT3V0SW5kZXhbMF0pOworCQkvKiA2LiBEYXRhIGZyYW1lIG5vcm1hbCBpcyBuZXh0ICovCisJCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCkpIHsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRworCQkJICAgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQkgICAgIHx8CisJCQkgICAgICghT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkgICAgICAocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkgICAgKSkgeworCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAwLAorCQkJCQkJICAgICAgIHBBZC0+CisJCQkJCQkgICAgICAgTmV4dEJ1bGtPdXRJbmRleFswXSk7CiAJCQl9CiAJCX0KLQkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzIpKQotCQl7Ci0JCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKLQkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCQkpKQotCQkJewotCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAxLCBwQWQtPk5leHRCdWxrT3V0SW5kZXhbMV0pOworCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfMikpIHsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRworCQkJICAgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQkgICAgIHx8CisJCQkgICAgICghT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkgICAgICAocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkgICAgKSkgeworCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAxLAorCQkJCQkJICAgICAgIHBBZC0+CisJCQkJCQkgICAgICAgTmV4dEJ1bGtPdXRJbmRleFsxXSk7CiAJCQl9CiAJCX0KLQkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzMpKQotCQl7Ci0JCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKLQkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCQkpKQotCQkJewotCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAyLCBwQWQtPk5leHRCdWxrT3V0SW5kZXhbMl0pOworCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfMykpIHsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRworCQkJICAgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQkgICAgIHx8CisJCQkgICAgICghT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkgICAgICAocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkgICAgKSkgeworCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAyLAorCQkJCQkJICAgICAgIHBBZC0+CisJCQkJCQkgICAgICAgTmV4dEJ1bGtPdXRJbmRleFsyXSk7CiAJCQl9CiAJCX0KLQkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzQpKQotCQl7Ci0JCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKLQkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCQkpKQotCQkJewotCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAzLCBwQWQtPk5leHRCdWxrT3V0SW5kZXhbM10pOworCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfNCkpIHsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRworCQkJICAgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQkgICAgIHx8CisJCQkgICAgICghT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkgICAgICAocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkgICAgKSkgeworCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAzLAorCQkJCQkJICAgICAgIHBBZC0+CisJCQkJCQkgICAgICAgTmV4dEJ1bGtPdXRJbmRleFszXSk7CiAJCQl9CiAJCX0KLQotCQkvL1BTIHBhY2tldHMgdXNlIEhDQ0EgcXVldWUgd2hlbiBkZXF1ZXVlIGZyb20gUFMgdW5pY2FzdCBxdWV1ZSAoV2lGaSBXUEEyIE1BOV9EVDEgZm9yIE1hcnZlbGwgQiBTVEEpCi0JCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF81KSkKLQkJewotCQkJaWYgKCgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpIHx8Ci0JCQkJKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JCQkJKSkKLQkJCXsKLQkJCX0KLQkJfQotCi0JCS8vIDcuIE51bGwgZnJhbWUgaXMgdGhlIGxhc3QKLQkJZWxzZSBpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OVUxMKSkKLQkJewotCQkJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotCQkJeworCQkvKiA3LiBOdWxsIGZyYW1lIGlzIHRoZSBsYXN0ICovCisJCWVsc2UgaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTlVMTCkpIHsKKwkJCWlmICghUlRNUF9URVNUX0ZMQUcKKwkJCSAgICAocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgewogCQkJCVJUVVNCQnVsa091dE51bGxGcmFtZShwQWQpOwogCQkJfQogCQl9Ci0KLQkJLy8gOC4gTm8gZGF0YSBhdmFsaWFibGUKLQkJZWxzZQotCQl7CisJCS8qIDguIE5vIGRhdGEgYXZhbGlhYmxlICovCisJCWVsc2UgewogCiAJCX0KIAl9CkBAIC0xMDE3LDE2ICsxMDMzLDE0IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUVVNCQ2xlYW5VcERhdGFCdWxrT3V0UXVldWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUVVNCQ2xlYW5VcERhdGFCdWxrT3V0UXVldWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVVDSEFSCQkJSWR4OwotCVBIVF9UWF9DT05URVhUCXBUeENvbnRleHQ7CisJdTggSWR4OworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwVHhDb250ZXh0OwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkNsZWFuVXBEYXRhQnVsa091dFF1ZXVlXG4iKSk7CiAKLQlmb3IgKElkeCA9IDA7IElkeCA8IDQ7IElkeCsrKQotCXsKKwlmb3IgKElkeCA9IDA7IElkeCA8IDQ7IElkeCsrKSB7CiAJCXBUeENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbSWR4XTsKIAogCQlwVHhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID0gcFR4Q29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbjsKQEAgLTEwNTIsMTQgKzEwNjYsMTIgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRVU0JDbGVhblVwTUxNRUJ1bGtPdXRRdWV1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgUlRVU0JDbGVhblVwTUxNRUJ1bGtPdXRRdWV1ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7CiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkNsZWFuVXBNTE1FQnVsa091dFF1ZXVlXG4iKSk7CiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLUNsZWFuVXBNTE1FQnVsa091dFF1ZXVlXG4iKSk7CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMTA2OSwxMyArMTA4MSwxMSBAQAogCiAJUmV0dXJuIFZhbHVlOgogCi0KIAlOb3RlOgogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVFVTQkNhbmNlbFBlbmRpbmdJUlBzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVFVTQkNhbmNlbFBlbmRpbmdJUlBzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKIAlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAocEFkKTsKIAlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7CkBAIC0xMDk0LDI5ICsxMTA0LDI1IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKLQlVSU5UCQkJaTsKKwlzdHJ1Y3QgcnRfcnhfY29udGV4dCAqcFJ4Q29udGV4dDsKKwl1MzIgaTsKIAogCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCItLS0+UlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQXG4iKSk7Ci0JZm9yICggaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykgewogCQlwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7Ci0JCWlmKHBSeENvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkKLQkJeworCQlpZiAocFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKSB7CiAJCQlSVFVTQl9VTkxJTktfVVJCKHBSeENvbnRleHQtPnBVcmIpOwogCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOwogCQkJcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKLQkJCS8vTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7Ci0JCQkvL3BBZC0+UGVuZGluZ1J4LS07CisJCQkvKk5kaXNJbnRlcmxvY2tlZERlY3JlbWVudCgmcEFkLT5QZW5kaW5nUngpOyAqLworCQkJLypwQWQtPlBlbmRpbmdSeC0tOyAqLwogCQl9CiAJfQogCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCI8LS0tUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQXG4iKSk7CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMTEzMCw4MyArMTEzNiw3NCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OwotCVBUWF9DT05URVhUCQkJcE1MTUVDb250ZXh0OwotCVBUWF9DT05URVhUCQkJcEJlYWNvbkNvbnRleHQ7Ci0JUFRYX0NPTlRFWFQJCQlwTnVsbENvbnRleHQ7Ci0JUFRYX0NPTlRFWFQJCQlwUHNQb2xsQ29udGV4dDsKLQlQVFhfQ09OVEVYVAkJCXBSVFNDb250ZXh0OwotCVVJTlQJCQkJaSwgSWR4OwotLy8JdW5zaWduZWQgaW50IAkJSXJxRmxhZ3M7Ci0vLwlORElTX1NQSU5fTE9DSwkJKnBMb2NrOwotLy8JQk9PTEVBTgkJCQkqcFBlbmRpbmc7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcE1MTUVDb250ZXh0OworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwQmVhY29uQ29udGV4dDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcE51bGxDb250ZXh0OworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwUHNQb2xsQ29udGV4dDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcFJUU0NvbnRleHQ7CisJdTMyIGksIElkeDsKKy8qICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgSXJxRmxhZ3M7ICovCisvKiAgICAgIHNwaW5sb2NrX3QgICAgICAgICAgKnBMb2NrOyAqLworLyogICAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICpwUGVuZGluZzsgKi8KIAorLyogICAgICBwTG9jayA9ICZwQWQtPkJ1bGtPdXRMb2NrW01HTVRQSVBFSURYXTsgKi8KKy8qICAgICAgcFBlbmRpbmcgPSAmcEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF07ICovCiAKLS8vCXBMb2NrID0gJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdOwotLy8JcFBlbmRpbmcgPSAmcEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF07Ci0KLQlmb3IgKElkeCA9IDA7IElkeCA8IDQ7IElkeCsrKQotCXsKKwlmb3IgKElkeCA9IDA7IElkeCA8IDQ7IElkeCsrKSB7CiAJCXBIVFRYQ29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbSWR4XSk7CiAKLQkJaWYgKHBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKQotCQl7CisJCWlmIChwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkgewogCi0JCQkvLyBHZXQgdGhlIFVTQl9DT05URVhUIGFuZCBjYW5jZWwgaXQncyBJUlA7IHRoZSBjb21wbGV0aW9uIHJvdXRpbmUgd2lsbCBpdHNlbGYKLQkJCS8vIHJlbW92ZSBpdCBmcm9tIHRoZSBIZWFkUGVuZGluZ1NlbmRMaXN0IGFuZCBOVUxMIG91dCBIZWFkUGVuZGluZ1NlbmRMaXN0Ci0JCQkvLwl3aGVuIHRoZSBsYXN0IElSUCBvbiB0aGUgbGlzdCBoYXMgYmVlbgljYW5jZWxsZWQ7IHRoYXQncyBob3cgd2UgZXhpdCB0aGlzIGxvb3AKLQkJCS8vCisJCQkvKiBHZXQgdGhlIFVTQl9DT05URVhUIGFuZCBjYW5jZWwgaXQncyBJUlA7IHRoZSBjb21wbGV0aW9uIHJvdXRpbmUgd2lsbCBpdHNlbGYgKi8KKwkJCS8qIHJlbW92ZSBpdCBmcm9tIHRoZSBIZWFkUGVuZGluZ1NlbmRMaXN0IGFuZCBOVUxMIG91dCBIZWFkUGVuZGluZ1NlbmRMaXN0ICovCisJCQkvKiAgICAgIHdoZW4gdGhlIGxhc3QgSVJQIG9uIHRoZSBsaXN0IGhhcyBiZWVuICBjYW5jZWxsZWQ7IHRoYXQncyBob3cgd2UgZXhpdCB0aGlzIGxvb3AgKi8KKwkJCS8qICovCiAKIAkJCVJUVVNCX1VOTElOS19VUkIocEhUVFhDb250ZXh0LT5wVXJiKTsKIAotCQkJLy8gU2xlZXAgMjAwIG1pY3Jvc2Vjb25kcyB0byBnaXZlIGNhbmNlbGxhdGlvbiB0aW1lIHRvIHdvcmsKKwkJCS8qIFNsZWVwIDIwMCBtaWNyb3NlY29uZHMgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrICovCiAJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CiAJCX0KIAogCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0lkeF0gPSBGQUxTRTsKIAl9CiAKLQkvL1JUTVBfSVJRX0xPQ0socExvY2ssIElycUZsYWdzKTsKLQlmb3IgKGkgPSAwOyBpIDwgTUdNVF9SSU5HX1NJWkU7IGkrKykKLQl7Ci0JCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVClwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKLQkJaWYocE1MTUVDb250ZXh0ICYmIChwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkpCi0JCXsKKwkvKlJUTVBfSVJRX0xPQ0socExvY2ssIElycUZsYWdzKTsgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUdNVF9SSU5HX1NJWkU7IGkrKykgeworCQlwTUxNRUNvbnRleHQgPSAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKilwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKKwkJaWYgKHBNTE1FQ29udGV4dCAmJiAocE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpKSB7CiAKLQkJCS8vIEdldCB0aGUgVVNCX0NPTlRFWFQgYW5kIGNhbmNlbCBpdCdzIElSUDsgdGhlIGNvbXBsZXRpb24gcm91dGluZSB3aWxsIGl0c2VsZgotCQkJLy8gcmVtb3ZlIGl0IGZyb20gdGhlIEhlYWRQZW5kaW5nU2VuZExpc3QgYW5kIE5VTEwgb3V0IEhlYWRQZW5kaW5nU2VuZExpc3QKLQkJCS8vCXdoZW4gdGhlIGxhc3QgSVJQIG9uIHRoZSBsaXN0IGhhcyBiZWVuCWNhbmNlbGxlZDsgdGhhdCdzIGhvdyB3ZSBleGl0IHRoaXMgbG9vcAotCQkJLy8KKwkJCS8qIEdldCB0aGUgVVNCX0NPTlRFWFQgYW5kIGNhbmNlbCBpdCdzIElSUDsgdGhlIGNvbXBsZXRpb24gcm91dGluZSB3aWxsIGl0c2VsZiAqLworCQkJLyogcmVtb3ZlIGl0IGZyb20gdGhlIEhlYWRQZW5kaW5nU2VuZExpc3QgYW5kIE5VTEwgb3V0IEhlYWRQZW5kaW5nU2VuZExpc3QgKi8KKwkJCS8qICAgICAgd2hlbiB0aGUgbGFzdCBJUlAgb24gdGhlIGxpc3QgaGFzIGJlZW4gIGNhbmNlbGxlZDsgdGhhdCdzIGhvdyB3ZSBleGl0IHRoaXMgbG9vcCAqLworCQkJLyogKi8KIAogCQkJUlRVU0JfVU5MSU5LX1VSQihwTUxNRUNvbnRleHQtPnBVcmIpOwogCQkJcE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CiAKLQkJCS8vIFNsZWVwIDIwMCBtaWNyb3NlY3MgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrCisJCQkvKiBTbGVlcCAyMDAgbWljcm9zZWNzIHRvIGdpdmUgY2FuY2VsbGF0aW9uIHRpbWUgdG8gd29yayAqLwogCQkJUlRNUHVzZWNEZWxheSgyMDApOwogCQl9CiAJfQogCXBBZC0+QnVsa091dFBlbmRpbmdbTUdNVFBJUEVJRFhdID0gRkFMU0U7Ci0JLy9SVE1QX0lSUV9VTkxPQ0socExvY2ssIElycUZsYWdzKTsKKwkvKlJUTVBfSVJRX1VOTE9DSyhwTG9jaywgSXJxRmxhZ3MpOyAqLwogCi0KLQlmb3IgKGkgPSAwOyBpIDwgQkVBQ09OX1JJTkdfU0laRTsgaSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgQkVBQ09OX1JJTkdfU0laRTsgaSsrKSB7CiAJCXBCZWFjb25Db250ZXh0ID0gJihwQWQtPkJlYWNvbkNvbnRleHRbaV0pOwogCi0JCWlmKHBCZWFjb25Db250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpCi0JCXsKKwkJaWYgKHBCZWFjb25Db250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpIHsKIAotCQkJLy8gR2V0IHRoZSBVU0JfQ09OVEVYVCBhbmQgY2FuY2VsIGl0J3MgSVJQOyB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdpbGwgaXRzZWxmCi0JCQkvLyByZW1vdmUgaXQgZnJvbSB0aGUgSGVhZFBlbmRpbmdTZW5kTGlzdCBhbmQgTlVMTCBvdXQgSGVhZFBlbmRpbmdTZW5kTGlzdAotCQkJLy8Jd2hlbiB0aGUgbGFzdCBJUlAgb24gdGhlIGxpc3QgaGFzIGJlZW4JY2FuY2VsbGVkOyB0aGF0J3MgaG93IHdlIGV4aXQgdGhpcyBsb29wCi0JCQkvLworCQkJLyogR2V0IHRoZSBVU0JfQ09OVEVYVCBhbmQgY2FuY2VsIGl0J3MgSVJQOyB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdpbGwgaXRzZWxmICovCisJCQkvKiByZW1vdmUgaXQgZnJvbSB0aGUgSGVhZFBlbmRpbmdTZW5kTGlzdCBhbmQgTlVMTCBvdXQgSGVhZFBlbmRpbmdTZW5kTGlzdCAqLworCQkJLyogICAgICB3aGVuIHRoZSBsYXN0IElSUCBvbiB0aGUgbGlzdCBoYXMgYmVlbiAgY2FuY2VsbGVkOyB0aGF0J3MgaG93IHdlIGV4aXQgdGhpcyBsb29wICovCisJCQkvKiAqLwogCiAJCQlSVFVTQl9VTkxJTktfVVJCKHBCZWFjb25Db250ZXh0LT5wVXJiKTsKIAotCQkJLy8gU2xlZXAgMjAwIG1pY3Jvc2VjcyB0byBnaXZlIGNhbmNlbGxhdGlvbiB0aW1lIHRvIHdvcmsKKwkJCS8qIFNsZWVwIDIwMCBtaWNyb3NlY3MgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrICovCiAJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CiAJCX0KIAl9CkBAIC0xMjIzLDExICsxMjIwLDExIEBACiAJaWYgKHBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpCiAJCVJUVVNCX1VOTElOS19VUkIocFBzUG9sbENvbnRleHQtPnBVcmIpOwogCi0JZm9yIChJZHggPSAwOyBJZHggPCA0OyBJZHgrKykKLQl7CisJZm9yIChJZHggPSAwOyBJZHggPCA0OyBJZHgrKykgewogCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW0lkeF0pOwogCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0lkeF0gPSBGQUxTRTsKIAkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1tJZHhdKTsKIAl9CiB9CiAKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2RhdGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2RhdGEuYwppbmRleCA2YjAwM2Y2Li40NTgzNzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9kYXRhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfZGF0YS5jCkBAIC0zNiw4MiArMzYsMTAyIEBACiAJSmFuICAgICAgICAgICAgMDMtMjUtMjAwNiAgICBjcmVhdGVkCiAKICovCisKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogCi1leHRlcm4gIFVDSEFSIFBoeTExQkdOZXh0UmF0ZVVwd2FyZFtdOyAvLyBkZWZpbmVkIGluIG1sbWUuYwotZXh0ZXJuIFVDSEFSCUVwVG9RdWV1ZVtdOworZXh0ZXJuIHU4IFBoeTExQkdOZXh0UmF0ZVVwd2FyZFtdOwkvKiBkZWZpbmVkIGluIG1sbWUuYyAqLworZXh0ZXJuIHU4IEVwVG9RdWV1ZVtdOwogCi1WT0lEIFJFUE9SVF9BTVNEVV9GUkFNRVNfVE9fTExDKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGF0YVNpemUpCit2b2lkIFJFUE9SVF9BTVNEVV9GUkFNRVNfVE9fTExDKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQl1OCAqcERhdGEsIHVuc2lnbmVkIGxvbmcgRGF0YVNpemUpCiB7Ci0JUE5ESVNfUEFDS0VUCXBQYWNrZXQ7Ci0JVUlOVAkJCW5NU0RVOwotCXN0cnVjdAkJCXNrX2J1ZmYgKnBTa2I7CisJdm9pZCAqcFBhY2tldDsKKwl1MzIgbk1TRFU7CisJc3RydWN0IHNrX2J1ZmYgKnBTa2I7CiAKIAluTVNEVSA9IDA7CiAJLyogYWxsb2NhdGUgYSByeCBwYWNrZXQgKi8KIAlwU2tiID0gZGV2X2FsbG9jX3NrYihSWF9CVUZGRVJfQUdHUkVTSVpFKTsKLQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVClPU1BLVF9UT19SVFBLVChwU2tiKTsKLQlpZiAocFNrYikKLQl7CisJcFBhY2tldCA9ICh2b2lkICopT1NQS1RfVE9fUlRQS1QocFNrYik7CisJaWYgKHBTa2IpIHsKIAogCQkvKiBjb252ZXJ0IDgwMi4xMSB0byA4MDIuMyBwYWNrZXQgKi8KIAkJcFNrYi0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgQlNTMCk7CiAJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFBhY2tldCwgUEtUU1JDX05ESVMpOwogCQlkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShwQWQsIHBQYWNrZXQsIHBEYXRhLCBEYXRhU2l6ZSk7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQ2FuJ3QgYWxsb2NhdGUgc2tiXG4iKSk7CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ2FuJ3QgYWxsb2NhdGUgc2tiXG4iKSk7CiAJfQogfQogCi1ORElTX1NUQVRVUwlSVFVTQkZyZWVEZXNjcmlwdG9yUmVxdWVzdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQsCi0JSU4JVUlOVDMyCQkJTnVtYmVyUmVxdWlyZWQpCi17Ci0vLwlVQ0hBUgkJCUZyZWVOdW1iZXIgPSAwOwotLy8JVUlOVAkJCUluZGV4OwotCU5ESVNfU1RBVFVTCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCXVuc2lnbmVkIGxvbmcgICBJcnFGbGFnczsKLQlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7CisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhpcyBzdWJyb3V0aW5lIHdpbGwgc2NhbiB0aHJvdWdoIHJlbGVhdGl2ZSByaW5nIGRlc2NyaXB0b3IgdG8gZmluZAorCQlvdXQgYXZhbGlhYmxlIGZyZWUgcmluZyBkZXNjcmlwdG9yIGFuZCBjb21wYXJlIHdpdGggcmVxdWVzdCBzaXplLgorCisJQXJndW1lbnRzOgorCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCQlSaW5nVHlwZQlTZWxlY3RlZCBSaW5nCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUJCU5vdCBlbm91Z2ggZnJlZSBkZXNjcmlwdG9yCisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MJCUVub3VnaCBmcmVlIGRlc2NyaXB0b3IKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgUlRVU0JGcmVlRGVzY3JpcHRvclJlcXVlc3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgICAgICB1OCBCdWxrT3V0UGlwZUlkLAorCQkJCSAgICAgICB1MzIgTnVtYmVyUmVxdWlyZWQpCit7CisvKiAgICAgIHU4ICAgICAgICAgICAgICAgICAgIEZyZWVOdW1iZXIgPSAwOyAqLworLyogICAgICB1MzIgICAgICAgICAgICAgICAgICAgIEluZGV4OyAqLworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKIAogCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKIAlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwotCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uIDwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSAmJiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIE51bWJlclJlcXVpcmVkICsgTE9DQUxfVFhCVUZfU0laRSkgPiBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pKQotCXsKKwlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA8IHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikKKwkgICAgJiYKKwkgICAgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyBOdW1iZXJSZXF1aXJlZCArCisJICAgICAgTE9DQUxfVFhCVUZfU0laRSkgPiBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pKSB7CiAKLQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgQnVsa091dFBpcGVJZCkpOwotCX0KLQllbHNlIGlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID09IDgpICYmIChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPCAoTnVtYmVyUmVxdWlyZWQgKyBMT0NBTF9UWEJVRl9TSVpFKSkpCi0JewotCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBCdWxrT3V0UGlwZUlkKSk7Ci0JfQotCWVsc2UgaWYgKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRVU0JGcmVlRCBjMyAtLT4gUXVlSWR4PSVkLCBDV1Bvcz0lbGQsIE5CT3V0UG9zPSVsZCFcbiIsIEJ1bGtPdXRQaXBlSWQsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSk7Ci0JCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKLQl9Ci0JZWxzZQotCXsKKwkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsCisJCQkJICAgIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwKKwkJCQkgICAgIEJ1bGtPdXRQaXBlSWQpKTsKKwl9IGVsc2UgaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPT0gOCkKKwkJICAgJiYgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA8CisJCSAgICAgICAoTnVtYmVyUmVxdWlyZWQgKyBMT0NBTF9UWEJVRl9TSVpFKSkpIHsKKwkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsCisJCQkJICAgIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwKKwkJCQkgICAgIEJ1bGtPdXRQaXBlSWQpKTsKKwl9IGVsc2UgaWYgKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJUVVNCRnJlZUQgYzMgLS0+IFF1ZUlkeD0lZCwgQ1dQb3M9JWxkLCBOQk91dFBvcz0lbGQhXG4iLAorCQkJICBCdWxrT3V0UGlwZUlkLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sCisJCQkgIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikpOworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwKKwkJCQkgICAgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PAorCQkJCSAgICAgQnVsa091dFBpcGVJZCkpOworCX0gZWxzZSB7CiAJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJfQogCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKIAotCiAJcmV0dXJuIChTdGF0dXMpOwogfQogCi1ORElTX1NUQVRVUyBSVFVTQkZyZWVEZXNjcmlwdG9yUmVsZWFzZSgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBVQ0hBUgkJQnVsa091dFBpcGVJZCkKK2ludCBSVFVTQkZyZWVEZXNjcmlwdG9yUmVsZWFzZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgICAgIHU4IEJ1bGtPdXRQaXBlSWQpCiB7Ci0JdW5zaWduZWQgbG9uZyAgIElycUZsYWdzOwotCUhUX1RYX0NPTlRFWFQJKnBIVFRYQ29udGV4dDsKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzOworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CiAKIAlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF07CiAJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKQEAgLTEyMSwyOCArMTQxLDMyIEBACiAJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKIH0KIAotCi1CT09MRUFOCVJUVVNCTmVlZFF1ZXVlQmFja0ZvckFnZygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBVQ0hBUgkJQnVsa091dFBpcGVJZCkKK0JPT0xFQU4gUlRVU0JOZWVkUXVldWVCYWNrRm9yQWdnKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQnVsa091dFBpcGVJZCkKIHsKLQl1bnNpZ25lZCBsb25nICAgSXJxRmxhZ3M7Ci0JSFRfVFhfQ09OVEVYVAkqcEhUVFhDb250ZXh0OwotCUJPT0xFQU4JCQluZWVkUXVlQmFjayA9IEZBTFNFOworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKKwlCT09MRUFOIG5lZWRRdWVCYWNrID0gRkFMU0U7CiAKIAlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF07CiAKIAlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwotCWlmICgocEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpICAvKiYmIChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPT0gMCkgKi8pCi0JewotCQlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA8IHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24pICYmCi0JCQkoKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uK01BWF9BR0dSRUdBVElPTl9TSVpFKSA8IE1BWF9UWEJVTEtfTElNSVQpIHx8IChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiBNQVhfQUdHUkVHQVRJT05fU0laRSkpKQotCQl7CisJaWYgKChwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPT0KKwkgICAgIFRSVUUpIC8qJiYgKHBBZC0+VHhTd1F1ZXVlW0J1bGtPdXRQaXBlSWRdLk51bWJlciA9PSAwKSAqLyApIHsKKwkJaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPAorCQkgICAgIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24pCisJCSAgICAmJgorCQkgICAgKCgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiArCisJCSAgICAgICBNQVhfQUdHUkVHQVRJT05fU0laRSkgPCBNQVhfVFhCVUxLX0xJTUlUKQorCQkgICAgIHx8IChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPgorCQkJIE1BWF9BR0dSRUdBVElPTl9TSVpFKSkpIHsKIAkJCW5lZWRRdWVCYWNrID0gVFJVRTsKLQkJfQotCQllbHNlIGlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbikgJiYKLQkJCQkgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICsgTUFYX0FHR1JFR0FUSU9OX1NJWkUpIDwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkKLQkJeworCQl9IGVsc2UKKwkJICAgIGlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4KKwkJCSBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uKQorCQkJJiYKKwkJCSgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiArCisJCQkgIE1BWF9BR0dSRUdBVElPTl9TSVpFKSA8CisJCQkgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkgewogCQkJbmVlZFF1ZUJhY2sgPSBUUlVFOwogCQl9CiAJfQpAQCAtMTUyLDcgKzE3Niw2IEBACiAKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0xNjgsMjEgKzE5MSwxNyBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVFVTQlJlamVjdFBlbmRpbmdQYWNrZXRzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVFVTQlJlamVjdFBlbmRpbmdQYWNrZXRzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlVQ0hBUgkJCUluZGV4OwotCVBRVUVVRV9FTlRSWQlwRW50cnk7Ci0JUE5ESVNfUEFDS0VUCXBQYWNrZXQ7Ci0JUFFVRVVFX0hFQURFUglwUXVldWU7CisJdTggSW5kZXg7CisJc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICpwRW50cnk7CisJdm9pZCAqcFBhY2tldDsKKwlzdHJ1Y3QgcnRfcXVldWVfaGVhZGVyICpwUXVldWU7CiAKLQotCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IDQ7IEluZGV4KyspCi0JeworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IDQ7IEluZGV4KyspIHsKIAkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5UeFN3UXVldWVMb2NrW0luZGV4XSk7Ci0JCXdoaWxlIChwQWQtPlR4U3dRdWV1ZVtJbmRleF0uSGVhZCAhPSBOVUxMKQotCQl7Ci0JCQlwUXVldWUgPSAoUFFVRVVFX0hFQURFUikgJihwQWQtPlR4U3dRdWV1ZVtJbmRleF0pOworCQl3aGlsZSAocEFkLT5UeFN3UXVldWVbSW5kZXhdLkhlYWQgIT0gTlVMTCkgeworCQkJcFF1ZXVlID0gKHN0cnVjdCBydF9xdWV1ZV9oZWFkZXIgKikmIChwQWQtPlR4U3dRdWV1ZVtJbmRleF0pOwogCQkJcEVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKHBRdWV1ZSk7CiAJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7CiAJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CkBAIC0xOTMsMjAgKzIxMiw0NiBAQAogCiB9CiAKLVZPSUQgUlRNUFdyaXRlVHhJbmZvKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBUWElORk9fU1RSVUMgCXBUeEluZm8sCi0JSU4JICBVU0hPUlQJCVVTQkRNQXBrdExlbiwKLQlJTgkgIEJPT0xFQU4JCWJXaXYsCi0JSU4JICBVQ0hBUgkJCVF1ZXVlU2VsLAotCUlOCSAgVUNIQVIJCQlOZXh0VmFsaWQsCi0JSU4JICBVQ0hBUgkJCVR4QnVyc3QpCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gdHJhbnNtaXQgb3V0IGZyYW1lcworCXdpdGggZ2l2ZW4gc2l6ZSBhbmQgc3BlY2lmaWVkIHJhdGUuCisKKwlBcmd1bWVudHM6CisJCXBUeEQJCVBvaW50ZXIgdG8gdHJhbnNtaXQgZGVzY3JpcHRvcgorCQlBY2sJCQlTZXR0aW5nIGZvciBBY2sgcmVxdWlyZW1lbnQgYml0CisJCUZyYWdtZW50CVNldHRpbmcgZm9yIEZyYWdtZW50IGJpdAorCQlSZXRyeU1vZGUJU2V0dGluZyBmb3IgcmV0cnkgbW9kZQorCQlJZnMJCQlTZXR0aW5nIGZvciBJRlMgZ2FwCisJCVJhdGUJCVNldHRpbmcgZm9yIHRyYW5zbWl0IHJhdGUKKwkJU2VydmljZQkJU2V0dGluZyBmb3Igc2VydmljZQorCQlMZW5ndGgJCUZyYW1lIGxlbmd0aAorCQlUeFByZWFtYmxlICBTaG9ydCBvciBMb25nIHByZWFtYmxlIHdoZW4gdXNpbmcgQ0NLIHJhdGVzCisJCVF1ZUlkeCAtIDAtMywgYWNjb3JkaW5nIHRvIDgwMi4xMWUvZDQuNCBKdW5lLzIwMDMKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKwordm9pZCBSVE1QV3JpdGVUeEluZm8oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgIHN0cnVjdCBydF90eGluZm8gKnBUeEluZm8sCisJCSAgICAgdTE2IFVTQkRNQXBrdExlbiwKKwkJICAgICBJTiBCT09MRUFOIGJXaXYsCisJCSAgICAgdTggUXVldWVTZWwsIHU4IE5leHRWYWxpZCwgdTggVHhCdXJzdCkKIHsKIAlwVHhJbmZvLT5VU0JETUFUeFBrdExlbiA9IFVTQkRNQXBrdExlbjsKIAlwVHhJbmZvLT5RU0VMID0gUXVldWVTZWw7CiAJaWYgKFF1ZXVlU2VsICE9IEZJRk9fRURDQSkKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gUXVldWVTZWwgIT0gRklGT19FRENBPD09PT09PT09PT09PVxuIikpOwotCXBUeEluZm8tPlVTQkRNQU5leHRWTEQgPSBGQUxTRTsgLy9OZXh0VmFsaWQ7ICAvLyBOZWVkIHRvIGNoZWNrIHdpdGggSmFuIGFib3V0IHRoaXMuCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiPT09PT4gUXVldWVTZWwgIT0gRklGT19FRENBPD09PT09PT09PT09PVxuIikpOworCXBUeEluZm8tPlVTQkRNQU5leHRWTEQgPSBGQUxTRTsJLypOZXh0VmFsaWQ7ICAvLyBOZWVkIHRvIGNoZWNrIHdpdGggSmFuIGFib3V0IHRoaXMuICovCiAJcFR4SW5mby0+VVNCRE1BVHhidXJzdCA9IFR4QnVyc3Q7CiAJcFR4SW5mby0+V0lWID0gYldpdjsKIAlwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9IDA7CkBAIC0yMTQsMyArMjU5LDQgQEAKIAlwVHhJbmZvLT5yc3YyID0gMDsKIH0KIAorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2lvLmMKaW5kZXggMWQ2OTU5MC4uMzQ0NDNmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9pby5jCkBAIC0zNiw4ICszNiw5IEBACiAJUGF1bCBMaW4gICAgMDYtMjUtMjAwNCAgY3JlYXRlZAogKi8KIAotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorI2lmZGVmIFJUTVBfTUFDX1VTQgogCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC01NSwyNiArNTYsMTggQEAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCiAKLU5UU1RBVFVTCVJUVVNCRmlybXdhcmVSdW4oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCitzdGF0aWMgaW50IFJUVVNCRmlybXdhcmVSdW4oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCU5UU1RBVFVTCVN0YXR1czsKKwlpbnQgU3RhdHVzOwogCi0JU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKLQkJcEFkLAotCQlVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCi0JCURFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQsCi0JCTB4MDEsCi0JCTB4OCwKLQkJMCwKLQkJTlVMTCwKLQkJMCk7CisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdChwQWQsCisJCQkJICAgICBVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCisJCQkJICAgICBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkJCSAgICAgMHgwMSwgMHg4LCAwLCBOVUxMLCAwKTsKIAogCXJldHVybiBTdGF0dXM7CiB9CiAKLQotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC05MCwxOSArODMsMTYgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5UU1RBVFVTIFJUVVNCRmlybXdhcmVXcml0ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIJCXBGd0ltYWdlLAotCUlOIFVMT05HCQlGd0xlbikKK2ludCBSVFVTQkZpcm13YXJlV3JpdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHU4ICpwRndJbWFnZSwgdW5zaWduZWQgbG9uZyBGd0xlbikKIHsKLQlVSU5UMzIJCU1hY1JlZzsKLQlOVFNUQVRVUyAJU3RhdHVzOwotLy8JVUxPTkcgCQlpOwotCVVTSE9SVAkJd3JpdGVMZW47CisJdTMyIE1hY1JlZzsKKwlpbnQgU3RhdHVzOworLyogICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBpOyAqLworCXUxNiB3cml0ZUxlbjsKIAogCVN0YXR1cyA9IFJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgTUFDX0NTUjAsICZNYWNSZWcpOwogCi0KIAl3cml0ZUxlbiA9IEZ3TGVuOwogCVJUVVNCTXVsdGlXcml0ZShwQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UsIHBGd0ltYWdlLCB3cml0ZUxlbik7CiAKQEAgLTExMCw2NiArMTAwLDI4IEBACiAJU3RhdHVzID0gUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg3MDFjLCAweGZmZmZmZmZmKTsKIAlTdGF0dXMgPSBSVFVTQkZpcm13YXJlUnVuKHBBZCk7CiAKKwkvKjIwMDgvMTEvMjg6S0ggYWRkIHRvIGZpeCB0aGUgZGVhZCByZiBmcmVxdWVuY3kgb2Zmc2V0IGJ1ZzwtLSAqLwogCVJUTVB1c2VjRGVsYXkoMTAwMDApOwotCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsSDJNX01BSUxCT1hfQ1NSLDApOwotCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg3MiwgMHgwMCwgMHgwMCwgMHgwMCk7Ly9yZXNldCByZiBieSBNQ1Ugc3VwcG9ydGVkIGJ5IG5ldyBmaXJtd2FyZQorCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgMCk7CisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDcyLCAweDAwLCAweDAwLCAweDAwKTsJLypyZXNldCByZiBieSBNQ1Ugc3VwcG9ydGVkIGJ5IG5ldyBmaXJtd2FyZSAqLworCS8qMjAwOC8xMS8yODpLSCBhZGQgdG8gZml4IHRoZSBkZWFkIHJmIGZyZXF1ZW5jeSBvZmZzZXQgYnVnLS0+ICovCiAKIAlyZXR1cm4gU3RhdHVzOwogfQogCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOiBHZXQgY3VycmVudCBmaXJtd2FyZSBvcGVyYXRpb24gbW9kZSAoUmV0dXJuIFZhbHVlKQotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCQkwIG9yIDEgPSBEb3dubG9hZGVkIGJ5IGhvc3QgZHJpdmVyCi0JCW90aGVycyA9IERyaXZlciBkb2Vzbid0IGRvd25sb2FkIGZpcm13YXJlCi0KLQlJUlFMID0KLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1OVFNUQVRVUwlSVFVTQkZpcm13YXJlT3Btb2RlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUlOVDMyCQkJcFZhbHVlKQoraW50IFJUVVNCVmVuZGVyUmVzZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCU5UU1RBVFVTCVN0YXR1czsKLQotCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCi0JCXBBZCwKLQkJKFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOIHwgVVNCRF9TSE9SVF9UUkFOU0ZFUl9PSyksCi0JCURFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiwKLQkJMHgxLAotCQkweDExLAotCQkwLAotCQlwVmFsdWUsCi0JCTQpOwotCXJldHVybiBTdGF0dXM7Ci19Ci1OVFNUQVRVUwlSVFVTQlZlbmRlclJlc2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCU5UU1RBVFVTCVN0YXR1czsKKwlpbnQgU3RhdHVzOwogCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCItLT5SVFVTQlZlbmRlclJlc2V0XG4iKSk7Ci0JU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKLQkJcEFkLAotCQlVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCi0JCURFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQsCi0JCTB4MDEsCi0JCTB4MSwKLQkJMCwKLQkJTlVMTCwKLQkJMCk7CisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdChwQWQsCisJCQkJICAgICBVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCisJCQkJICAgICBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkJCSAgICAgMHgwMSwgMHgxLCAwLCBOVUxMLCAwKTsKIAogCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCI8LS1SVFVTQlZlbmRlclJlc2V0XG4iKSk7CiAJcmV0dXJuIFN0YXR1czsKIH0KKwogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMTg1LDIzICsxMzcsMTYgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5UU1RBVFVTCVJUVVNCTXVsdGlSZWFkKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlPVVQJUFVDSEFSCQkJcERhdGEsCi0JSU4JVVNIT1JUCQkJbGVuZ3RoKQoraW50IFJUVVNCTXVsdGlSZWFkKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXUxNiBPZmZzZXQsIHU4ICpwRGF0YSwgdTE2IGxlbmd0aCkKIHsKLQlOVFNUQVRVUwlTdGF0dXM7CisJaW50IFN0YXR1czsKIAotCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCi0JCXBBZCwKLQkJKFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOIHwgVVNCRF9TSE9SVF9UUkFOU0ZFUl9PSyksCi0JCURFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiwKLQkJMHg3LAotCQkwLAotCQlPZmZzZXQsCi0JCXBEYXRhLAotCQlsZW5ndGgpOworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QocEFkLAorCQkJCSAgICAgKFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOIHwKKwkJCQkgICAgICBVU0JEX1NIT1JUX1RSQU5TRkVSX09LKSwKKwkJCQkgICAgIERFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiwgMHg3LCAwLCBPZmZzZXQsCisJCQkJICAgICBwRGF0YSwgbGVuZ3RoKTsKIAogCXJldHVybiBTdGF0dXM7CiB9CkBAIC0yMjEsNzcgKzE2Niw1NiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTlRTVEFUVVMJUlRVU0JNdWx0aVdyaXRlX09uZUJ5dGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhKQoraW50IFJUVVNCTXVsdGlXcml0ZV9PbmVCeXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgdTE2IE9mZnNldCwgdTggKnBEYXRhKQogewotCU5UU1RBVFVTCVN0YXR1czsKKwlpbnQgU3RhdHVzOwogCi0JLy8gVE9ETzogSW4gMjg3MCwgdXNlIHRoaXMgZnVuY2l0b24gY2FyZWZ1bGx5IGNhdXNlIGl0J3Mgbm90IHN0YWJsZS4KLQlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KAotCQlwQWQsCi0JCVVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX09VVCwKLQkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCwKLQkJMHg2LAotCQkwLAotCQlPZmZzZXQsCi0JCXBEYXRhLAotCQkxKTsKKwkvKiBUT0RPOiBJbiAyODcwLCB1c2UgdGhpcyBmdW5jaXRvbiBjYXJlZnVsbHkgY2F1c2UgaXQncyBub3Qgc3RhYmxlLiAqLworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QocEFkLAorCQkJCSAgICAgVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAorCQkJCSAgICAgREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCwKKwkJCQkgICAgIDB4NiwgMCwgT2Zmc2V0LCBwRGF0YSwgMSk7CiAKIAlyZXR1cm4gU3RhdHVzOwogfQogCi1OVFNUQVRVUwlSVFVTQk11bHRpV3JpdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVTSE9SVAkJCWxlbmd0aCkKK2ludCBSVFVTQk11bHRpV3JpdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHUxNiBPZmZzZXQsIHU4ICpwRGF0YSwgdTE2IGxlbmd0aCkKIHsKLQlOVFNUQVRVUwlTdGF0dXM7CisJaW50IFN0YXR1czsKIAorCXUxNiBpbmRleCA9IDAsIFZhbHVlOworCXU4ICpwU3JjID0gcERhdGE7CisJdTE2IHJlc3VkZSA9IDA7CiAKLSAgICAgICAgVVNIT1JUICAgICAgICAgIGluZGV4ID0gMCxWYWx1ZTsKLSAgICAgICAgUFVDSEFSICAgICAgICAgIHBTcmMgPSBwRGF0YTsKLSAgICAgICAgVVNIT1JUICAgICAgICAgIHJlc3VkZSA9IDA7Ci0KLSAgICAgICAgcmVzdWRlID0gbGVuZ3RoICUgMjsKLQkJbGVuZ3RoICArPSByZXN1ZGU7Ci0JCWRvCi0JCXsKLQkJCVZhbHVlID0oVVNIT1JUKSggKnBTcmMgIHwgKCoocFNyYyArIDEpIDw8IDgpKTsKLQkJU3RhdHVzID0gUlRVU0JTaW5nbGVXcml0ZShwQWQsT2Zmc2V0ICsgaW5kZXgsVmFsdWUpOwotICAgICAgICAgICAgaW5kZXggKz0yOwotICAgICAgICAgICAgbGVuZ3RoIC09IDI7Ci0gICAgICAgICAgICBwU3JjID0gcFNyYyArIDI7Ci0gICAgICAgIH13aGlsZShsZW5ndGggPiAwKTsKKwlyZXN1ZGUgPSBsZW5ndGggJSAyOworCWxlbmd0aCArPSByZXN1ZGU7CisJZG8geworCQlWYWx1ZSA9ICh1MTYpKCpwU3JjIHwgKCoocFNyYyArIDEpIDw8IDgpKTsKKwkJU3RhdHVzID0gUlRVU0JTaW5nbGVXcml0ZShwQWQsIE9mZnNldCArIGluZGV4LCBWYWx1ZSk7CisJCWluZGV4ICs9IDI7CisJCWxlbmd0aCAtPSAyOworCQlwU3JjID0gcFNyYyArIDI7CisJfSB3aGlsZSAobGVuZ3RoID4gMCk7CiAKIAlyZXR1cm4gU3RhdHVzOwogfQogCi0KLU5UU1RBVFVTIFJUVVNCU2luZ2xlV3JpdGUoCi0JSU4gCVJUTVBfQURBUFRFUiAJKnBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JSU4JVVNIT1JUCQkJVmFsdWUpCitpbnQgUlRVU0JTaW5nbGVXcml0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHUxNiBPZmZzZXQsIHUxNiBWYWx1ZSkKIHsKLQlOVFNUQVRVUwlTdGF0dXM7CisJaW50IFN0YXR1czsKIAotCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCi0JCXBBZCwKLQkJVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAotCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAotCQkweDIsCi0JCVZhbHVlLAotCQlPZmZzZXQsCi0JCU5VTEwsCi0JCTApOworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QocEFkLAorCQkJCSAgICAgVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAorCQkJCSAgICAgREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCwKKwkJCQkgICAgIDB4MiwgVmFsdWUsIE9mZnNldCwgTlVMTCwgMCk7CiAKIAlyZXR1cm4gU3RhdHVzOwogCiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMzA3LDM0ICsyMzEsMjYgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5UU1RBVFVTCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlPVVQJUFVJTlQzMgkJCXBWYWx1ZSkKK2ludCBSVFVTQlJlYWRNQUNSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICB1MTYgT2Zmc2V0LCB1MzIgKnBWYWx1ZSkKIHsKLQlOVFNUQVRVUwlTdGF0dXM7Ci0JVUlOVDMyCQlsb2NhbFZhbDsKKwlpbnQgU3RhdHVzID0gMDsKKwl1MzIgbG9jYWxWYWw7CiAKLQlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KAotCQlwQWQsCi0JCShVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9JTiB8IFVTQkRfU0hPUlRfVFJBTlNGRVJfT0spLAotCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4sCi0JCTB4NywKLQkJMCwKLQkJT2Zmc2V0LAotCQkmbG9jYWxWYWwsCi0JCTQpOworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QocEFkLAorCQkJCSAgICAgKFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOIHwKKwkJCQkgICAgICBVU0JEX1NIT1JUX1RSQU5TRkVSX09LKSwKKwkJCQkgICAgIERFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiwgMHg3LCAwLCBPZmZzZXQsCisJCQkJICAgICAmbG9jYWxWYWwsIDQpOwogCiAJKnBWYWx1ZSA9IGxlMmNwdTMyKGxvY2FsVmFsKTsKIAotCiAJaWYgKFN0YXR1cyA8IDApCiAJCSpwVmFsdWUgPSAweGZmZmZmZmZmOwogCiAJcmV0dXJuIFN0YXR1czsKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0zNTAsMjUgKzI2NiwyMiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTlRTVEFUVVMJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlJTglVSU5UMzIJCQlWYWx1ZSkKK2ludCBSVFVTQldyaXRlTUFDUmVnaXN0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIHUxNiBPZmZzZXQsIHUzMiBWYWx1ZSkKIHsKLQlOVFNUQVRVUwlTdGF0dXM7Ci0JVUlOVDMyCQlsb2NhbFZhbDsKKwlpbnQgU3RhdHVzOworCXUzMiBsb2NhbFZhbDsKIAogCWxvY2FsVmFsID0gVmFsdWU7CiAKLQlTdGF0dXMgPSBSVFVTQlNpbmdsZVdyaXRlKHBBZCwgT2Zmc2V0LCAoVVNIT1JUKShsb2NhbFZhbCAmIDB4ZmZmZikpOwotCVN0YXR1cyA9IFJUVVNCU2luZ2xlV3JpdGUocEFkLCBPZmZzZXQgKyAyLCAoVVNIT1JUKSgobG9jYWxWYWwgJiAweGZmZmYwMDAwKSA+PiAxNikpOworCVN0YXR1cyA9IFJUVVNCU2luZ2xlV3JpdGUocEFkLCBPZmZzZXQsICh1MTYpKGxvY2FsVmFsICYgMHhmZmZmKSk7CisJU3RhdHVzID0KKwkgICAgUlRVU0JTaW5nbGVXcml0ZShwQWQsIE9mZnNldCArIDIsCisJCQkgICAgICh1MTYpKChsb2NhbFZhbCAmIDB4ZmZmZjAwMDApID4+IDE2KSk7CiAKIAlyZXR1cm4gU3RhdHVzOwogfQogCi0KLQotI2lmIDEKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTM4NCwxMzkgKzI5Nyw3NyBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTlRTVEFUVVMJUlRVU0JSZWFkQkJQUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlJZCwKLQlJTglQVUNIQVIJCQlwVmFsdWUpCitpbnQgUlRVU0JSZWFkQkJQUmVnaXN0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTggSWQsIHU4ICpwVmFsdWUpCiB7Ci0JQkJQX0NTUl9DRkdfU1RSVUMJQmJwQ3NyOwotCVVJTlQJCQlpID0gMDsKLQlOVFNUQVRVUwkJc3RhdHVzOworCUJCUF9DU1JfQ0ZHX1NUUlVDIEJicENzcjsKKwl1MzIgaSA9IDA7CisJaW50IHN0YXR1czsKIAotCS8vIFZlcmlmeSB0aGUgYnVzeSBjb25kaXRpb24KLQlkbwotCXsKKwkvKiBWZXJpZnkgdGhlIGJ1c3kgY29uZGl0aW9uICovCisJZG8gewogCQlzdGF0dXMgPSBSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIEJCUF9DU1JfQ0ZHLCAmQmJwQ3NyLndvcmQpOwotCQlpZihzdGF0dXMgPj0gMCkKLQkJewotCQlpZiAoIShCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSkKLQkJCWJyZWFrOworCQlpZiAoc3RhdHVzID49IDApIHsKKwkJCWlmICghKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpKQorCQkJCWJyZWFrOwogCQl9Ci0JCXByaW50aygiUlRVU0JSZWFkQkJQUmVnaXN0ZXIoQkJQX0NTUl9DRkdfMSk6cmV0cnkgY291bnQ9JWQhXG4iLCBpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSVFVTQlJlYWRCQlBSZWdpc3RlcihCQlBfQ1NSX0NGR18xKTpyZXRyeSBjb3VudD0lZCFcbiIsCisJCQkgIGkpKTsKIAkJaSsrOwotCX0KLQl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKwl9IHdoaWxlICgoaSA8IFJFVFJZX0xJTUlUKQorCQkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKIAotCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JewotCQkvLwotCQkvLyBSZWFkIGZhaWxlZCB0aGVuIFJldHVybiBEZWZhdWx0IHZhbHVlLgotCQkvLworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkKKwkgICAgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpIHsKKwkJLyogKi8KKwkJLyogUmVhZCBmYWlsZWQgdGhlbiBSZXR1cm4gRGVmYXVsdCB2YWx1ZS4gKi8KKwkJLyogKi8KIAkJKnBWYWx1ZSA9IHBBZC0+QmJwV3JpdGVMYXRjaFtJZF07CiAKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJldHJ5IGNvdW50IGV4aGF1c3RlZCBvciBkZXZpY2UgcmVtb3ZlZCEhIVxuIikpOworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkgICAgICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CiAJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOwogCX0KLQotCS8vIFByZXBhcmUgZm9yIHdyaXRlIG1hdGVyaWFsCi0JQmJwQ3NyLndvcmQgCQkJCT0gMDsKLQlCYnBDc3IuZmllbGQuZlJlYWQJCQk9IDE7Ci0JQmJwQ3NyLmZpZWxkLkJ1c3kJCQk9IDE7Ci0JQmJwQ3NyLmZpZWxkLlJlZ051bSAJCT0gSWQ7CisJLyogUHJlcGFyZSBmb3Igd3JpdGUgbWF0ZXJpYWwgKi8KKwlCYnBDc3Iud29yZCA9IDA7CisJQmJwQ3NyLmZpZWxkLmZSZWFkID0gMTsKKwlCYnBDc3IuZmllbGQuQnVzeSA9IDE7CisJQmJwQ3NyLmZpZWxkLlJlZ051bSA9IElkOwogCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIEJCUF9DU1JfQ0ZHLCBCYnBDc3Iud29yZCk7CiAKIAlpID0gMDsKLQkvLyBWZXJpZnkgdGhlIGJ1c3kgY29uZGl0aW9uCi0JZG8KLQl7CisJLyogVmVyaWZ5IHRoZSBidXN5IGNvbmRpdGlvbiAqLworCWRvIHsKIAkJc3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsKLQkJaWYgKHN0YXR1cyA+PSAwKQotCQl7Ci0JCWlmICghKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpKQotCQl7Ci0JCQkqcFZhbHVlID0gKFVDSEFSKUJicENzci5maWVsZC5WYWx1ZTsKLQkJCWJyZWFrOwotCQl9Ci0JCX0KLQkJcHJpbnRrKCJSVFVTQlJlYWRCQlBSZWdpc3RlcihCQlBfQ1NSX0NGR18yKTpyZXRyeSBjb3VudD0lZCFcbiIsIGkpOwotCQlpKys7Ci0JfQotCXdoaWxlICgoaSA8IFJFVFJZX0xJTUlUKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpOwotCi0JaWYgKChpID09IFJFVFJZX0xJTUlUKSB8fCAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKLQl7Ci0JCS8vCi0JCS8vIFJlYWQgZmFpbGVkIHRoZW4gUmV0dXJuIERlZmF1bHQgdmFsdWUuCi0JCS8vCi0JCSpwVmFsdWUgPSBwQWQtPkJicFdyaXRlTGF0Y2hbSWRdOwotCi0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSZXRyeSBjb3VudCBleGhhdXN0ZWQgb3IgZGV2aWNlIHJlbW92ZWQhISFcbiIpKTsKLQkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7Ci0JfQotCi0JcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQotI2Vsc2UKLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOiBSZWFkIDgtYml0IEJCUCByZWdpc3RlciB2aWEgZmlybXdhcmUKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCUlSUUwgPQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5UU1RBVFVTCVJUVVNCUmVhZEJCUFJlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJSWQsCi0JSU4JUFVDSEFSCQkJcFZhbHVlKQotewotCUJCUF9DU1JfQ0ZHX1NUUlVDCUJicENzcjsKLQlpbnQJCQkJCWksIGs7Ci0JZm9yIChpPTA7IGk8TUFYX0JVU1lfQ09VTlQ7IGkrKykKLQl7Ci0JCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsKLQkJaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpCi0JCXsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCUJicENzci53b3JkID0gMDsKLQkJQmJwQ3NyLmZpZWxkLmZSZWFkID0gMTsKLQkJQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsKLQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOwotCQlCYnBDc3IuZmllbGQuUmVnTnVtID0gSWQ7Ci0JCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsKLQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDgwLCAweGZmLCAweDAsIDB4MCk7Ci0JCWZvciAoaz0wOyBrPE1BWF9CVVNZX0NPVU5UOyBrKyspCi0JCXsKLQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsKLQkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKQorCQlpZiAoc3RhdHVzID49IDApIHsKKwkJCWlmICghKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpKSB7CisJCQkJKnBWYWx1ZSA9ICh1OClCYnBDc3IuZmllbGQuVmFsdWU7CiAJCQkJYnJlYWs7CisJCQl9CiAJCX0KLQkJaWYgKChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAmJgotCQkJKEJicENzci5maWVsZC5SZWdOdW0gPT0gSWQpKQotCQl7Ci0JCQkqcFZhbHVlID0gKFVDSEFSKUJicENzci5maWVsZC5WYWx1ZTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiQkJQIHJlYWQgUiVkPTB4JXggZmFpbFxuIiwgSWQsIEJicENzci53b3JkKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUlRVU0JSZWFkQkJQUmVnaXN0ZXIoQkJQX0NTUl9DRkdfMik6cmV0cnkgY291bnQ9JWQhXG4iLAorCQkJICBpKSk7CisJCWkrKzsKKwl9IHdoaWxlICgoaSA8IFJFVFJZX0xJTUlUKQorCQkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkKKwkgICAgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpIHsKKwkJLyogKi8KKwkJLyogUmVhZCBmYWlsZWQgdGhlbiBSZXR1cm4gRGVmYXVsdCB2YWx1ZS4gKi8KKwkJLyogKi8KIAkJKnBWYWx1ZSA9IHBBZC0+QmJwV3JpdGVMYXRjaFtJZF07CisKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJICAgICAoIlJldHJ5IGNvdW50IGV4aGF1c3RlZCBvciBkZXZpY2UgcmVtb3ZlZCEhIVxuIikpOwogCQlyZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKIAl9CisKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9Ci0jZW5kaWYKIAotI2lmIDEKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTUzMiw5NSArMzgzLDQ2IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1OVFNUQVRVUwlSVFVTQldyaXRlQkJQUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlJZCwKLQlJTglVQ0hBUgkJCVZhbHVlKQoraW50IFJUVVNCV3JpdGVCQlBSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdTggSWQsIHU4IFZhbHVlKQogewotCUJCUF9DU1JfQ0ZHX1NUUlVDCUJicENzcjsKLQlVSU5UCQkJaSA9IDA7Ci0JTlRTVEFUVVMJCXN0YXR1czsKLQkvLyBWZXJpZnkgdGhlIGJ1c3kgY29uZGl0aW9uCi0JZG8KLQl7CisJQkJQX0NTUl9DRkdfU1RSVUMgQmJwQ3NyOworCXUzMiBpID0gMDsKKwlpbnQgc3RhdHVzOworCS8qIFZlcmlmeSB0aGUgYnVzeSBjb25kaXRpb24gKi8KKwlkbyB7CiAJCXN0YXR1cyA9IFJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7Ci0JCWlmIChzdGF0dXMgPj0gMCkKLQkJewotCQlpZiAoIShCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSkKLQkJCWJyZWFrOworCQlpZiAoc3RhdHVzID49IDApIHsKKwkJCWlmICghKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpKQorCQkJCWJyZWFrOwogCQl9Ci0JCXByaW50aygiUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKEJCUF9DU1JfQ0ZHKTpyZXRyeSBjb3VudD0lZCFcbiIsIGkpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJUVVNCV3JpdGVCQlBSZWdpc3RlcihCQlBfQ1NSX0NGRyk6cmV0cnkgY291bnQ9JWQhXG4iLAorCQkJICBpKSk7CiAJCWkrKzsKIAl9Ci0Jd2hpbGUgKChpIDwgUkVUUllfTElNSVQpICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSk7CisJd2hpbGUgKChpIDwgUkVUUllfTElNSVQpCisJICAgICAgICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSk7CiAKLQlpZiAoKGkgPT0gUkVUUllfTElNSVQpIHx8IChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQotCXsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJldHJ5IGNvdW50IGV4aGF1c3RlZCBvciBkZXZpY2UgcmVtb3ZlZCEhIVxuIikpOworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkKKwkgICAgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpIHsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJICAgICAoIlJldHJ5IGNvdW50IGV4aGF1c3RlZCBvciBkZXZpY2UgcmVtb3ZlZCEhIVxuIikpOwogCQlyZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKIAl9Ci0KLQkvLyBQcmVwYXJlIGZvciB3cml0ZSBtYXRlcmlhbAotCUJicENzci53b3JkIAkJCQk9IDA7Ci0JQmJwQ3NyLmZpZWxkLmZSZWFkCQkJPSAwOwotCUJicENzci5maWVsZC5WYWx1ZQkJCT0gVmFsdWU7Ci0JQmJwQ3NyLmZpZWxkLkJ1c3kJCQk9IDE7Ci0JQmJwQ3NyLmZpZWxkLlJlZ051bSAJCT0gSWQ7CisJLyogUHJlcGFyZSBmb3Igd3JpdGUgbWF0ZXJpYWwgKi8KKwlCYnBDc3Iud29yZCA9IDA7CisJQmJwQ3NyLmZpZWxkLmZSZWFkID0gMDsKKwlCYnBDc3IuZmllbGQuVmFsdWUgPSBWYWx1ZTsKKwlCYnBDc3IuZmllbGQuQnVzeSA9IDE7CisJQmJwQ3NyLmZpZWxkLlJlZ051bSA9IElkOwogCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIEJCUF9DU1JfQ0ZHLCBCYnBDc3Iud29yZCk7CiAKIAlwQWQtPkJicFdyaXRlTGF0Y2hbSWRdID0gVmFsdWU7CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9Ci0jZWxzZQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotCVJvdXRpbmUgRGVzY3JpcHRpb246IFdyaXRlIDgtYml0IEJCUCByZWdpc3RlciB2aWEgZmlybXdhcmUKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCUlSUUwgPQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLQotTlRTVEFUVVMJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJSWQsCi0JSU4JVUNIQVIJCQlWYWx1ZSkKLQotewotCUJCUF9DU1JfQ0ZHX1NUUlVDCUJicENzcjsKLQlpbnQJCQkJCUJ1c3lDbnQ7Ci0JZm9yIChCdXN5Q250PTA7IEJ1c3lDbnQ8TUFYX0JVU1lfQ09VTlQ7IEJ1c3lDbnQrKykKLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsKLQkJaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpCi0JCQljb250aW51ZTsKLQkJQmJwQ3NyLndvcmQgPSAwOwotCQlCYnBDc3IuZmllbGQuZlJlYWQgPSAwOwotCQlCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOwotCQlCYnBDc3IuZmllbGQuQnVzeSA9IDE7Ci0JCUJicENzci5maWVsZC5WYWx1ZSA9IFZhbHVlOwotCQlCYnBDc3IuZmllbGQuUmVnTnVtID0gSWQ7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsKLQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDgwLCAweGZmLCAweDAsIDB4MCk7Ci0JCXBBZC0+QmJwV3JpdGVMYXRjaFtJZF0gPSBWYWx1ZTsKLQkJYnJlYWs7Ci0JfQotCWlmIChCdXN5Q250ID09IE1BWF9CVVNZX0NPVU5UKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiQkJQIHdyaXRlIFIlZD0weCV4IGZhaWxcbiIsIElkLCBCYnBDc3Iud29yZCkpOwotCQlyZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKLQl9Ci0JcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQotI2VuZGlmCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC02MzYsMzEgKzQzOCwzMSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTlRTVEFUVVMJUlRVU0JXcml0ZVJGUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUlOVDMyCQkJVmFsdWUpCitpbnQgUlRVU0JXcml0ZVJGUmVnaXN0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MzIgVmFsdWUpCiB7Ci0JUEhZX0NTUjRfU1RSVUMJUGh5Q3NyNDsKLQlVSU5UCQkJaSA9IDA7Ci0JTlRTVEFUVVMJCXN0YXR1czsKKwlQSFlfQ1NSNF9TVFJVQyBQaHlDc3I0OworCXUzMiBpID0gMDsKKwlpbnQgc3RhdHVzOwogCiAJTmRpc1plcm9NZW1vcnkoJlBoeUNzcjQsIHNpemVvZihQSFlfQ1NSNF9TVFJVQykpOwotCWRvCi0JeworCWRvIHsKIAkJc3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBSRl9DU1JfQ0ZHMCwgJlBoeUNzcjQud29yZCk7Ci0JCWlmIChzdGF0dXMgPj0gMCkKLQkJewotCQlpZiAoIShQaHlDc3I0LmZpZWxkLkJ1c3kpKQotCQkJYnJlYWs7CisJCWlmIChzdGF0dXMgPj0gMCkgeworCQkJaWYgKCEoUGh5Q3NyNC5maWVsZC5CdXN5KSkKKwkJCQlicmVhazsKIAkJfQotCQlwcmludGsoIlJUVVNCV3JpdGVSRlJlZ2lzdGVyKFJGX0NTUl9DRkcwKTpyZXRyeSBjb3VudD0lZCFcbiIsIGkpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJUVVNCV3JpdGVSRlJlZ2lzdGVyKFJGX0NTUl9DRkcwKTpyZXRyeSBjb3VudD0lZCFcbiIsCisJCQkgIGkpKTsKIAkJaSsrOwogCX0KLQl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKwl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkKKwkgICAgICAgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKIAotCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CisJaWYgKChpID09IFJFVFJZX0xJTUlUKQorCSAgICB8fCAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkgeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkgICAgICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CiAJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOwogCX0KIApAQCAtNjcyLDExNSArNDc0LDYgQEAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLQlSb3V0aW5lIERlc2NyaXB0aW9uOiBXcml0ZSBSVDMweHggUkYgcmVnaXN0ZXIgdGhyb3VnaCBNQUMKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCUlSUUwgPQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5UU1RBVFVTIFJUMzB4eFdyaXRlUkZSZWdpc3RlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVJlZ0lELAotCUlOCVVDSEFSCQkJVmFsdWUpCi17Ci0JUkZfQ1NSX0NGR19TVFJVQwlyZmNzcjsKLQlVSU5UCQkJCWkgPSAwOwotCi0JZG8KLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgUkZfQ1NSX0NGRywgJnJmY3NyLndvcmQpOwotCi0JCWlmICghcmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0spCi0JCQlicmVhazsKLQkJaSsrOwotCX0KLQl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKLQotCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7Ci0JCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOwotCX0KLQotCXJmY3NyLmZpZWxkLlJGX0NTUl9XUiA9IDE7Ci0JcmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPSAxOwotCXJmY3NyLmZpZWxkLlRFU1RDU1JfUkZBQ0NfUkVHTlVNID0gUmVnSUQ7Ci0JcmZjc3IuZmllbGQuUkZfQ1NSX0RBVEEgPSBWYWx1ZTsKLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJGX0NTUl9DRkcsIHJmY3NyLndvcmQpOwotCi0JcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOiBSZWFkIFJUMzB4eCBSRiByZWdpc3RlciB0aHJvdWdoIE1BQwotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTlRTVEFUVVMgUlQzMHh4UmVhZFJGUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlSZWdJRCwKLQlJTglQVUNIQVIJCQlwVmFsdWUpCi17Ci0JUkZfQ1NSX0NGR19TVFJVQwlyZmNzcjsKLQlVSU5UCQkJCWk9MCwgaz0wOwotCi0JZm9yIChpPTA7IGk8TUFYX0JVU1lfQ09VTlQ7IGkrKykKLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgUkZfQ1NSX0NGRywgJnJmY3NyLndvcmQpOwotCi0JCWlmIChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBCVVNZKQotCQl7Ci0JCQljb250aW51ZTsKLQkJfQotCQlyZmNzci53b3JkID0gMDsKLQkJcmZjc3IuZmllbGQuUkZfQ1NSX1dSID0gMDsKLQkJcmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPSAxOwotCQlyZmNzci5maWVsZC5URVNUQ1NSX1JGQUNDX1JFR05VTSA9IFJlZ0lEOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSRl9DU1JfQ0ZHLCByZmNzci53b3JkKTsKLQkJZm9yIChrPTA7IGs8TUFYX0JVU1lfQ09VTlQ7IGsrKykKLQkJewotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBSRl9DU1JfQ0ZHLCAmcmZjc3Iud29yZCk7Ci0KLQkJCWlmIChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBJRExFKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmICgocmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPT0gSURMRSkgJiYKLQkJCShyZmNzci5maWVsZC5URVNUQ1NSX1JGQUNDX1JFR05VTSA9PSBSZWdJRCkpCi0JCXsKLQkJCSpwVmFsdWUgPSAoVUNIQVIpcmZjc3IuZmllbGQuUkZfQ1NSX0RBVEE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAocmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPT0gQlVTWSkKLQl7Ci0JCURCR1BSSU5UX0VSUigoIlJGIHJlYWQgUiVkPTB4JXggZmFpbCwgaVslZF0sIGtbJWRdXG4iLCBSZWdJRCwgcmZjc3Iud29yZCxpLGspKTsKLQkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7Ci0JfQotCi0JcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCiAJUm91dGluZSBEZXNjcmlwdGlvbjoKIAogCUFyZ3VtZW50czoKQEAgLTc5MywyOCArNDg2LDE2IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1OVFNUQVRVUwlSVFVTQlJlYWRFRVBST00oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCU9VVAlQVUNIQVIJCQlwRGF0YSwKLQlJTglVU0hPUlQJCQlsZW5ndGgpCitpbnQgUlRVU0JSZWFkRUVQUk9NKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSB1MTYgT2Zmc2V0LCB1OCAqcERhdGEsIHUxNiBsZW5ndGgpCiB7Ci0JTlRTVEFUVVMJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisJaW50IFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCi0JaWYocEFkLT5iVXNlRWZ1c2UpCi0JCVN0YXR1cyA9ZUZ1c2VSZWFkKHBBZCwgT2Zmc2V0LCBwRGF0YSwgbGVuZ3RoKTsKLQllbHNlCi0JewotCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCi0JCXBBZCwKLQkJKFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOIHwgVVNCRF9TSE9SVF9UUkFOU0ZFUl9PSyksCi0JCURFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiwKLQkJMHg5LAotCQkwLAotCQlPZmZzZXQsCi0JCXBEYXRhLAotCQlsZW5ndGgpOwotCX0KKwlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KHBBZCwKKwkJCQkgICAgIChVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9JTiB8CisJCQkJICAgICAgVVNCRF9TSE9SVF9UUkFOU0ZFUl9PSyksCisJCQkJICAgICBERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4sIDB4OSwgMCwgT2Zmc2V0LAorCQkJCSAgICAgcERhdGEsIGxlbmd0aCk7CiAKIAlyZXR1cm4gU3RhdHVzOwogfQpAQCAtODM0LDMyICs1MTUsMzMgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5UU1RBVFVTCVJUVVNCV3JpdGVFRVBST00oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVTSE9SVAkJCWxlbmd0aCkKK2ludCBSVFVTQldyaXRlRUVQUk9NKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgdTE2IE9mZnNldCwgdTggKnBEYXRhLCB1MTYgbGVuZ3RoKQogewotCU5UU1RBVFVTCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCWludCBTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKIAotCWlmKHBBZC0+YlVzZUVmdXNlKQotCQlTdGF0dXMgPSBlRnVzZVdyaXRlKHBBZCwgT2Zmc2V0LCBwRGF0YSwgbGVuZ3RoKTsKLQllbHNlCi0JewotCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCi0JCXBBZCwKLQkJVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAotCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAotCQkweDgsCi0JCTAsCi0JCU9mZnNldCwKLQkJcERhdGEsCi0JCWxlbmd0aCk7Ci0JfQorCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QocEFkLAorCQkJCSAgICAgVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAorCQkJCSAgICAgREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCwKKwkJCQkgICAgIDB4OCwgMCwgT2Zmc2V0LCBwRGF0YSwgbGVuZ3RoKTsKIAogCXJldHVybiBTdGF0dXM7CiB9CiAKK2ludCBSVFVTQlJlYWRFRVBST00xNihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1MTYgb2Zmc2V0LCB1MTYgKnBEYXRhKQoreworCWludCBzdGF0dXM7CisJdTE2IGxvY2FsRGF0YTsKKworCXN0YXR1cyA9IFJUVVNCUmVhZEVFUFJPTShwQWQsIG9mZnNldCwgKHU4ICopKCZsb2NhbERhdGEpLCAyKTsKKwlpZiAoc3RhdHVzID09IFNUQVRVU19TVUNDRVNTKQorCQkqcERhdGEgPSBsZTJjcHUxNihsb2NhbERhdGEpOworCisJcmV0dXJuIHN0YXR1czsKKworfQorCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC04NzUsMTYgKzU1NywxNSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBSVFVTQlB1dFRvU2xlZXAoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUVVNCUHV0VG9TbGVlcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JVUlOVDMyCQl2YWx1ZTsKKwl1MzIgdmFsdWU7CiAKLQkvLyBUaW1lb3V0IDB4NDAgeCA1MHVzCi0JdmFsdWUgPSAoU0xFRVBDSUQ8PDE2KSsoT1dORVJNQ1U8PDI0KSsgKDB4NDA8PDgpKzE7CisJLyogVGltZW91dCAweDQwIHggNTB1cyAqLworCXZhbHVlID0gKFNMRUVQQ0lEIDw8IDE2KSArIChPV05FUk1DVSA8PCAyNCkgKyAoMHg0MCA8PCA4KSArIDE7CiAJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg3MDEwLCB2YWx1ZSk7CiAJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg0MDQsIDB4MzApOwotCS8vUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJLypSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsgKi8KIAlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiU2xlZXAgTWFpbGJveCB0ZXN0dmFsdWUgJXhcbiIsIHZhbHVlKSk7CiAKIH0KQEAgLTkwNCwyMCArNTg1LDE0IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1OVFNUQVRVUyBSVFVTQldha2VVcCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK2ludCBSVFVTQldha2VVcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JTlRTVEFUVVMJU3RhdHVzOworCWludCBTdGF0dXM7CiAKLQlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KAotCQlwQWQsCi0JCVVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX09VVCwKLQkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCwKLQkJMHgwMSwKLQkJMHgwOSwKLQkJMCwKLQkJTlVMTCwKLQkJMCk7CisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdChwQWQsCisJCQkJICAgICBVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCisJCQkJICAgICBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkJCSAgICAgMHgwMSwgMHgwOSwgMCwgTlVMTCwgMCk7CiAKIAlyZXR1cm4gU3RhdHVzOwogfQpAQCAtOTM3LDEzICs2MTIsMTIgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRVU0JJbml0aWFsaXplQ21kUSgKLQlJTglQQ21kUQljbWRxKQordm9pZCBSVFVTQkluaXRpYWxpemVDbWRRKHN0cnVjdCBydF9jbWRxICpjbWRxKQogewogCWNtZHEtPmhlYWQgPSBOVUxMOwogCWNtZHEtPnRhaWwgPSBOVUxMOwogCWNtZHEtPnNpemUgPSAwOwotCWNtZHEtPkNtZFFTdGF0ZSA9IFJUMjg3MF9USFJFQURfSU5JVEVEOworCWNtZHEtPkNtZFFTdGF0ZSA9IFJUTVBfVEFTS19TVEFUX0lOSVRFRDsKIH0KIAogLyoKQEAgLTk2MSw0MSArNjM1LDQ1IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1ORElTX1NUQVRVUwlSVFVTQkVucXVldWVDbWRGcm9tTmRpcygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglORElTX09JRAkJT2lkLAotCUlOCUJPT0xFQU4JCQlTZXRJbmZvcm1hdGlvbiwKLQlJTglQVk9JRAkJCXBJbmZvcm1hdGlvbkJ1ZmZlciwKLQlJTglVSU5UMzIJCQlJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCkKK2ludCBSVFVTQkVucXVldWVDbWRGcm9tTmRpcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgIElOIE5ESVNfT0lEIE9pZCwKKwkJCQkgICAgSU4gQk9PTEVBTiBTZXRJbmZvcm1hdGlvbiwKKwkJCQkgICAgdm9pZCAqcEluZm9ybWF0aW9uQnVmZmVyLAorCQkJCSAgICB1MzIgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpCiB7Ci0JTkRJU19TVEFUVVMJc3RhdHVzOwotCVBDbWRRRWxtdAljbWRxZWxtdCA9IE5VTEw7Ci0JUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCWludCBzdGF0dXM7CisJc3RydWN0IHJ0X2NtZHFlbG10ICpjbWRxZWxtdCA9IE5VTEw7CisJc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqcFRhc2sgPSAmcEFkLT5jbWRRVGFzazsKIAotCWlmIChwaWRfbnIocE9iai0+UlRVU0JDbWRUaHJfcGlkKSA+IDApCi0JCXJldHVybiAoTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKKyNpZmRlZiBLVEhSRUFEX1NVUFBPUlQKKwlpZiAocFRhc2stPmt0aHJlYWRfdGFzayA9PSBOVUxMKQorI2Vsc2UKKwlDSEVDS19QSURfTEVHQUxJVFkocFRhc2stPnRhc2tQSUQpIHsKKwl9CisJZWxzZQorI2VuZGlmCisJcmV0dXJuIChORElTX1NUQVRVU19SRVNPVVJDRVMpOwogCi0Jc3RhdHVzID0gUlRNUEFsbG9jYXRlTWVtb3J5KChQVk9JRCAqKSZjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSk7CisJc3RhdHVzID0gb3NfYWxsb2NfbWVtKHBBZCwgKHU4ICoqKSAoJmNtZHFlbG10KSwgc2l6ZW9mKHN0cnVjdCBydF9jbWRxZWxtdCkpOwogCWlmICgoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHx8IChjbWRxZWxtdCA9PSBOVUxMKSkKIAkJcmV0dXJuIChORElTX1NUQVRVU19SRVNPVVJDRVMpOwogCi0JCWNtZHFlbG10LT5idWZmZXIgPSBOVUxMOwotCQlpZiAocEluZm9ybWF0aW9uQnVmZmVyICE9IE5VTEwpCi0JCXsKLQkJCXN0YXR1cyA9IFJUTVBBbGxvY2F0ZU1lbW9yeSgoUFZPSUQgKikmY21kcWVsbXQtPmJ1ZmZlciwgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOwotCQkJaWYgKChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgfHwgKGNtZHFlbG10LT5idWZmZXIgPT0gTlVMTCkpCi0JCQl7Ci0JCQkJa2ZyZWUoY21kcWVsbXQpOwotCQkJCXJldHVybiAoTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeShjbWRxZWxtdC0+YnVmZmVyLCBwSW5mb3JtYXRpb25CdWZmZXIsIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKLQkJCQljbWRxZWxtdC0+YnVmZmVybGVuZ3RoID0gSW5mb3JtYXRpb25CdWZmZXJMZW5ndGg7Ci0JCQl9CisJY21kcWVsbXQtPmJ1ZmZlciA9IE5VTEw7CisJaWYgKHBJbmZvcm1hdGlvbkJ1ZmZlciAhPSBOVUxMKSB7CisJCXN0YXR1cyA9CisJCSAgICBvc19hbGxvY19tZW0ocEFkLCAodTggKiopICYgY21kcWVsbXQtPmJ1ZmZlciwKKwkJCQkgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOworCQlpZiAoKHN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkgICAgfHwgKGNtZHFlbG10LT5idWZmZXIgPT0gTlVMTCkpIHsKKwkJCWtmcmVlKGNtZHFlbG10KTsKKwkJCXJldHVybiAoTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKKwkJfSBlbHNlIHsKKwkJCU5kaXNNb3ZlTWVtb3J5KGNtZHFlbG10LT5idWZmZXIsIHBJbmZvcm1hdGlvbkJ1ZmZlciwKKwkJCQkgICAgICAgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOworCQkJY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCA9IEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoOwogCQl9Ci0JCWVsc2UKLQkJCWNtZHFlbG10LT5idWZmZXJsZW5ndGggPSAwOworCX0gZWxzZQorCQljbWRxZWxtdC0+YnVmZmVybGVuZ3RoID0gMDsKIAogCWNtZHFlbG10LT5jb21tYW5kID0gT2lkOwogCWNtZHFlbG10LT5DbWRGcm9tTmRpcyA9IFRSVUU7CkBAIC0xMDA1LDI4ICs2ODMsMjIgQEAKIAkJY21kcWVsbXQtPlNldE9wZXJhdGlvbiA9IEZBTFNFOwogCiAJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7Ci0JaWYgKHBBZC0+Q21kUS5DbWRRU3RhdGUgJiBSVDI4NzBfVEhSRUFEX0NBTl9ET19JTlNFUlQpCi0JeworCWlmIChwQWQtPkNtZFEuQ21kUVN0YXRlICYgUlRNUF9UQVNLX0NBTl9ET19JTlNFUlQpIHsKIAkJRW5xdWV1ZUNtZCgoJnBBZC0+Q21kUSksIGNtZHFlbG10KTsKIAkJc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlzdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwogCX0KIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKIAotCWlmIChzdGF0dXMgPT0gTkRJU19TVEFUVVNfRkFJTFVSRSkKLQl7CisJaWYgKHN0YXR1cyA9PSBORElTX1NUQVRVU19GQUlMVVJFKSB7CiAJCWlmIChjbWRxZWxtdC0+YnVmZmVyKQotCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQtPmJ1ZmZlciwgY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCwgMCk7Ci0JCU5kaXNGcmVlTWVtb3J5KGNtZHFlbG10LCBzaXplb2YoQ21kUUVsbXQpLCAwKTsKLQl9Ci0JZWxzZQotCVJUVVNCQ01EVXAocEFkKTsKKwkJCW9zX2ZyZWVfbWVtKHBBZCwgY21kcWVsbXQtPmJ1ZmZlcik7CisJCW9zX2ZyZWVfbWVtKHBBZCwgY21kcWVsbXQpOworCX0gZWxzZQorCQlSVFVTQkNNRFVwKHBBZCk7CiAKLQotICAgIHJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKKwlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwogfQogCiAvKgpAQCAtMTA0NCwzNyArNzE2LDMzIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1ORElTX1NUQVRVUyBSVFVTQkVucXVldWVJbnRlcm5hbENtZCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBORElTX09JRAkJCU9pZCwKLQlJTiBQVk9JRAkJCXBJbmZvcm1hdGlvbkJ1ZmZlciwKLQlJTiBVSU5UMzIJCQlJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCkKK2ludCBSVFVTQkVucXVldWVJbnRlcm5hbENtZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgIElOIE5ESVNfT0lEIE9pZCwKKwkJCQkgICAgdm9pZCAqcEluZm9ybWF0aW9uQnVmZmVyLAorCQkJCSAgICB1MzIgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpCiB7Ci0JTkRJU19TVEFUVVMJc3RhdHVzOwotCVBDbWRRRWxtdAljbWRxZWxtdCA9IE5VTEw7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgcnRfY21kcWVsbXQgKmNtZHFlbG10ID0gTlVMTDsKIAotCi0Jc3RhdHVzID0gUlRNUEFsbG9jYXRlTWVtb3J5KChQVk9JRCAqKSZjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSk7CisJc3RhdHVzID0gb3NfYWxsb2NfbWVtKHBBZCwgKHU4ICoqKSAmIGNtZHFlbG10LCBzaXplb2Yoc3RydWN0IHJ0X2NtZHFlbG10KSk7CiAJaWYgKChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgfHwgKGNtZHFlbG10ID09IE5VTEwpKQogCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1JFU09VUkNFUyk7Ci0JTmRpc1plcm9NZW1vcnkoY21kcWVsbXQsIHNpemVvZihDbWRRRWxtdCkpOworCU5kaXNaZXJvTWVtb3J5KGNtZHFlbG10LCBzaXplb2Yoc3RydWN0IHJ0X2NtZHFlbG10KSk7CiAKLQlpZihJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCA+IDApCi0JewotCQlzdGF0dXMgPSBSVE1QQWxsb2NhdGVNZW1vcnkoKFBWT0lEICopJmNtZHFlbG10LT5idWZmZXIsIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKLQkJaWYgKChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgfHwgKGNtZHFlbG10LT5idWZmZXIgPT0gTlVMTCkpCi0JCXsKLQkJCU5kaXNGcmVlTWVtb3J5KGNtZHFlbG10LCBzaXplb2YoQ21kUUVsbXQpLCAwKTsKKwlpZiAoSW5mb3JtYXRpb25CdWZmZXJMZW5ndGggPiAwKSB7CisJCXN0YXR1cyA9CisJCSAgICBvc19hbGxvY19tZW0ocEFkLCAodTggKiopICYgY21kcWVsbXQtPmJ1ZmZlciwKKwkJCQkgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOworCQlpZiAoKHN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkgICAgfHwgKGNtZHFlbG10LT5idWZmZXIgPT0gTlVMTCkpIHsKKwkJCW9zX2ZyZWVfbWVtKHBBZCwgY21kcWVsbXQpOwogCQkJcmV0dXJuIChORElTX1NUQVRVU19SRVNPVVJDRVMpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJTmRpc01vdmVNZW1vcnkoY21kcWVsbXQtPmJ1ZmZlciwgcEluZm9ybWF0aW9uQnVmZmVyLCBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCk7CisJCX0gZWxzZSB7CisJCQlOZGlzTW92ZU1lbW9yeShjbWRxZWxtdC0+YnVmZmVyLCBwSW5mb3JtYXRpb25CdWZmZXIsCisJCQkJICAgICAgIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKIAkJCWNtZHFlbG10LT5idWZmZXJsZW5ndGggPSBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aDsKIAkJfQotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCWNtZHFlbG10LT5idWZmZXIgPSBOVUxMOwogCQljbWRxZWxtdC0+YnVmZmVybGVuZ3RoID0gMDsKIAl9CkBAIC0xMDgyLDMwICs3NTAsMjQgQEAKIAljbWRxZWxtdC0+Y29tbWFuZCA9IE9pZDsKIAljbWRxZWxtdC0+Q21kRnJvbU5kaXMgPSBGQUxTRTsKIAotCWlmIChjbWRxZWxtdCAhPSBOVUxMKQotCXsKKwlpZiAoY21kcWVsbXQgIT0gTlVMTCkgewogCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKLQkJaWYgKHBBZC0+Q21kUS5DbWRRU3RhdGUgJiBSVDI4NzBfVEhSRUFEX0NBTl9ET19JTlNFUlQpCi0JCXsKKwkJaWYgKHBBZC0+Q21kUS5DbWRRU3RhdGUgJiBSVE1QX1RBU0tfQ0FOX0RPX0lOU0VSVCkgewogCQkJRW5xdWV1ZUNtZCgoJnBBZC0+Q21kUSksIGNtZHFlbG10KTsKIAkJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlzdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwogCQl9CiAJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOwogCi0JCWlmIChzdGF0dXMgPT0gTkRJU19TVEFUVVNfRkFJTFVSRSkKLQkJeworCQlpZiAoc3RhdHVzID09IE5ESVNfU1RBVFVTX0ZBSUxVUkUpIHsKIAkJCWlmIChjbWRxZWxtdC0+YnVmZmVyKQotCQkJCU5kaXNGcmVlTWVtb3J5KGNtZHFlbG10LT5idWZmZXIsIGNtZHFlbG10LT5idWZmZXJsZW5ndGgsIDApOwotCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQsIHNpemVvZihDbWRRRWxtdCksIDApOwotCQl9Ci0JCWVsc2UKLQkJUlRVU0JDTURVcChwQWQpOworCQkJCW9zX2ZyZWVfbWVtKHBBZCwgY21kcWVsbXQtPmJ1ZmZlcik7CisJCQlvc19mcmVlX21lbShwQWQsIGNtZHFlbG10KTsKKwkJfSBlbHNlCisJCQlSVFVTQkNNRFVwKHBBZCk7CiAJfQotCXJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKKwlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwogfQogCiAvKgpAQCAtMTEyMywxNCArNzg1LDExIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUVVNCRGVxdWV1ZUNtZCgKLQlJTglQQ21kUQkJY21kcSwKLQlPVVQJUENtZFFFbG10CSpwY21kcWVsbXQpCit2b2lkIFJUVVNCRGVxdWV1ZUNtZChzdHJ1Y3QgcnRfY21kcSAqY21kcSwgc3RydWN0IHJ0X2NtZHFlbG10ICogKiBwY21kcWVsbXQpCiB7CiAJKnBjbWRxZWxtdCA9IGNtZHEtPmhlYWQ7CiAKLQlpZiAoKnBjbWRxZWxtdCAhPSBOVUxMKQotCXsKKwlpZiAoKnBjbWRxZWxtdCAhPSBOVUxMKSB7CiAJCWNtZHEtPmhlYWQgPSBjbWRxLT5oZWFkLT5uZXh0OwogCQljbWRxLT5zaXplLS07CiAJCWlmIChjbWRxLT5zaXplID09IDApCkBAIC0xMTY0LDcgKzgyMyw2IEBACiAJICBtZXRob2QgY2FuIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlLiAgU2luY2UgeW91IGRvbid0IGhhdmUgYSBoYW5kbGUgb24KIAkgIHRoZSBVUkIgdXNlZCwgeW91IGNhbid0IGNhbmNlbCB0aGUgcmVxdWVzdC4KIAotCiAJUm91dGluZSBEZXNjcmlwdGlvbjoKIAogCUFyZ3VtZW50czoKQEAgLTExNzUsNjggKzgzMywxMDkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5UU1RBVFVTICAgIFJUVVNCX1ZlbmRvclJlcXVlc3QoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUlOVDMyCQkJVHJhbnNmZXJGbGFncywKLQlJTglVQ0hBUgkJCVJlcXVlc3RUeXBlLAotCUlOCVVDSEFSCQkJUmVxdWVzdCwKLQlJTglVU0hPUlQJCQlWYWx1ZSwKLQlJTglVU0hPUlQJCQlJbmRleCwKLQlJTglQVk9JRAkJCVRyYW5zZmVyQnVmZmVyLAotCUlOCVVJTlQzMgkJCVRyYW5zZmVyQnVmZmVyTGVuZ3RoKQoraW50IFJUVVNCX1ZlbmRvclJlcXVlc3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1MzIgVHJhbnNmZXJGbGFncywKKwkJCSAgICAgdTggUmVxdWVzdFR5cGUsCisJCQkgICAgIHU4IFJlcXVlc3QsCisJCQkgICAgIHUxNiBWYWx1ZSwKKwkJCSAgICAgdTE2IEluZGV4LAorCQkJICAgICB2b2lkICpUcmFuc2ZlckJ1ZmZlciwKKwkJCSAgICAgdTMyIFRyYW5zZmVyQnVmZmVyTGVuZ3RoKQogewotCWludAkJCQlyZXQ7Ci0JUE9TX0NPT0tJRQkJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKIAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JeworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpIHsKIAkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiZGV2aWNlIGRpc2Nvbm5lY3RlZFxuIikpOwogCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UgaWYgKGluX2ludGVycnVwdCgpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiaW5faW50ZXJydXB0LCBSVFVTQl9WZW5kb3JSZXF1ZXN0IFJlcXVlc3QlMDJ4IFZhbHVlJTA0eCBPZmZzZXQlMDR4XG4iLFJlcXVlc3QsVmFsdWUsSW5kZXgpKTsKKwl9IGVsc2UgaWYgKGluX2ludGVycnVwdCgpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiaW5faW50ZXJydXB0LCBSVFVTQl9WZW5kb3JSZXF1ZXN0IFJlcXVlc3QlMDJ4IFZhbHVlJTA0eCBPZmZzZXQlMDR4XG4iLAorCQkJICBSZXF1ZXN0LCBWYWx1ZSwgSW5kZXgpKTsKIAogCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKICNkZWZpbmUgTUFYX1JFVFJZX0NPVU5UICAxMAogCiAJCWludCByZXRyeUNvdW50ID0gMDsKLQkJdm9pZAkqdG1wQnVmID0gVHJhbnNmZXJCdWZmZXI7CisJCXZvaWQgKnRtcEJ1ZiA9IFRyYW5zZmVyQnVmZmVyOwogCi0JCS8vIEFjcXVpcmUgQ29udHJvbCB0b2tlbgotCQlkbyB7Ci0JCWlmKCBSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUKQotCQkJcmV0PXVzYl9jb250cm9sX21zZyhwT2JqLT5wVXNiX0RldiwgdXNiX3NuZGN0cmxwaXBlKCBwT2JqLT5wVXNiX0RldiwgMCApLCBSZXF1ZXN0LCBSZXF1ZXN0VHlwZSwgVmFsdWUsSW5kZXgsIHRtcEJ1ZiwgVHJhbnNmZXJCdWZmZXJMZW5ndGgsIENPTlRST0xfVElNRU9VVF9KSUZGSUVTKTsKLQkJZWxzZSBpZihSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4pCi0JCQlyZXQ9dXNiX2NvbnRyb2xfbXNnKHBPYmotPnBVc2JfRGV2LCB1c2JfcmN2Y3RybHBpcGUoIHBPYmotPnBVc2JfRGV2LCAwICksIFJlcXVlc3QsIFJlcXVlc3RUeXBlLCBWYWx1ZSxJbmRleCwgdG1wQnVmLCBUcmFuc2ZlckJ1ZmZlckxlbmd0aCwgQ09OVFJPTF9USU1FT1VUX0pJRkZJRVMpOwotCQllbHNlCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInZlbmRvciByZXF1ZXN0IGRpcmVjdGlvbiBpcyBmYWlsZWRcbiIpKTsKLQkJCXJldCA9IC0xOworCQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJihwQWQtPlVzYlZlbmRvclJlcV9zZW1hcGhvcmUpKTsKKwkJaWYgKHBBZC0+VXNiVmVuZG9yUmVxQnVmKSB7CisJCQlBU1NFUlQoVHJhbnNmZXJCdWZmZXJMZW5ndGggPCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOworCisJCQl0bXBCdWYgPSAodm9pZCAqKXBBZC0+VXNiVmVuZG9yUmVxQnVmOworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5Vc2JWZW5kb3JSZXFCdWYsCisJCQkJICAgICAgIFRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKKworCQkJaWYgKFJlcXVlc3RUeXBlID09IERFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQpCisJCQkJTmRpc01vdmVNZW1vcnkodG1wQnVmLCBUcmFuc2ZlckJ1ZmZlciwKKwkJCQkJICAgICAgIFRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKIAkJfQogCisJCWRvIHsKKwkJCWlmIChSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUKQorCQkJCXJldCA9CisJCQkJICAgIHVzYl9jb250cm9sX21zZyhwT2JqLT5wVXNiX0RldiwKKwkJCQkJCSAgICB1c2Jfc25kY3RybHBpcGUocE9iai0+CisJCQkJCQkJCSAgICBwVXNiX0RldiwKKwkJCQkJCQkJICAgIDApLCBSZXF1ZXN0LAorCQkJCQkJICAgIFJlcXVlc3RUeXBlLCBWYWx1ZSwgSW5kZXgsCisJCQkJCQkgICAgdG1wQnVmLAorCQkJCQkJICAgIFRyYW5zZmVyQnVmZmVyTGVuZ3RoLAorCQkJCQkJICAgIENPTlRST0xfVElNRU9VVF9KSUZGSUVTKTsKKwkJCWVsc2UgaWYgKFJlcXVlc3RUeXBlID09IERFVklDRV9WRU5ET1JfUkVRVUVTVF9JTikKKwkJCQlyZXQgPQorCQkJCSAgICB1c2JfY29udHJvbF9tc2cocE9iai0+cFVzYl9EZXYsCisJCQkJCQkgICAgdXNiX3JjdmN0cmxwaXBlKHBPYmotPgorCQkJCQkJCQkgICAgcFVzYl9EZXYsCisJCQkJCQkJCSAgICAwKSwgUmVxdWVzdCwKKwkJCQkJCSAgICBSZXF1ZXN0VHlwZSwgVmFsdWUsIEluZGV4LAorCQkJCQkJICAgIHRtcEJ1ZiwKKwkJCQkJCSAgICBUcmFuc2ZlckJ1ZmZlckxlbmd0aCwKKwkJCQkJCSAgICBDT05UUk9MX1RJTUVPVVRfSklGRklFUyk7CisJCQllbHNlIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJICgidmVuZG9yIHJlcXVlc3QgZGlyZWN0aW9uIGlzIGZhaWxlZFxuIikpOworCQkJCXJldCA9IC0xOworCQkJfQorCiAJCQlyZXRyeUNvdW50Kys7CiAJCQlpZiAocmV0IDwgMCkgewotCQkJCXByaW50aygiI1xuIik7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiNcbiIpKTsKIAkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOwogCQkJfQotCQl9IHdoaWxlKChyZXQgPCAwKSAmJiAocmV0cnlDb3VudCA8IE1BWF9SRVRSWV9DT1VOVCkpOworCQl9IHdoaWxlICgocmV0IDwgMCkgJiYgKHJldHJ5Q291bnQgPCBNQVhfUkVUUllfQ09VTlQpKTsKIAotICAgICAgICBpZiAocmV0IDwgMCkgewotLy8JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJVU0JWZW5kb3JSZXF1ZXN0IGZhaWxlZCByZXQ9JWQgXG4iLHJldCkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JfVmVuZG9yUmVxdWVzdCBmYWlsZWQoJWQpLFR4RmxhZ3M9MHgleCwgUmVxVHlwZT0lcywgUmVxPTB4JXgsIEluZGV4PTB4JXhcbiIsCi0JCQkJCQlyZXQsIFRyYW5zZmVyRmxhZ3MsIChSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUID8gIk9VVCIgOiAiSU4iKSwgUmVxdWVzdCwgSW5kZXgpKTsKKwkJaWYgKChwQWQtPlVzYlZlbmRvclJlcUJ1ZikKKwkJICAgICYmIChSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4pKQorCQkJTmRpc01vdmVNZW1vcnkoVHJhbnNmZXJCdWZmZXIsIHRtcEJ1ZiwKKwkJCQkgICAgICAgVHJhbnNmZXJCdWZmZXJMZW5ndGgpOworCQl1cCgmKHBBZC0+VXNiVmVuZG9yUmVxX3NlbWFwaG9yZSkpOworCisJCWlmIChyZXQgPCAwKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCJSVFVTQl9WZW5kb3JSZXF1ZXN0IGZhaWxlZCglZCksVHhGbGFncz0weCV4LCBSZXFUeXBlPSVzLCBSZXE9MHgleCwgSW5kZXg9MHgleFxuIiwKKwkJCQkgIHJldCwgVHJhbnNmZXJGbGFncywKKwkJCQkgIChSZXF1ZXN0VHlwZSA9PQorCQkJCSAgIERFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQgPyAiT1VUIiA6ICJJTiIpLAorCQkJCSAgUmVxdWVzdCwgSW5kZXgpKTsKIAkJCWlmIChSZXF1ZXN0ID09IDB4MikKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJcdFJlcXVlc3QgVmFsdWU9MHglMDR4IVxuIiwgVmFsdWUpKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJICgiXHRSZXF1ZXN0IFZhbHVlPTB4JTA0eCFcbiIsIFZhbHVlKSk7CiAKLQkJCWlmICgoVHJhbnNmZXJCdWZmZXIhPSBOVUxMKSAmJiAoVHJhbnNmZXJCdWZmZXJMZW5ndGggPiAwKSkKLQkJCQloZXhfZHVtcCgiRmFpbGVkIFRyYW5zZmVyQnVmZmVyIHZhbHVlIiwgVHJhbnNmZXJCdWZmZXIsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKLSAgICAgICAgfQorCQkJaWYgKChUcmFuc2ZlckJ1ZmZlciAhPSBOVUxMKQorCQkJICAgICYmIChUcmFuc2ZlckJ1ZmZlckxlbmd0aCA+IDApKQorCQkJCWhleF9kdW1wKCJGYWlsZWQgVHJhbnNmZXJCdWZmZXIgdmFsdWUiLAorCQkJCQkgVHJhbnNmZXJCdWZmZXIsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKKwkJfQorCiAJfQotCXJldHVybiByZXQ7CisKKwlpZiAocmV0ICE9IC0xKQorCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisJZWxzZQorCQlyZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKIH0KIAogLyoKQEAgLTEyNTUsMjggKzk1NCwyNSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTlRTVEFUVVMJUlRVU0JfUmVzZXREZXZpY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCitpbnQgUlRVU0JfUmVzZXREZXZpY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCU5UU1RBVFVTCQlTdGF0dXMgPSBUUlVFOworCWludCBTdGF0dXMgPSBUUlVFOwogCiAJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5VU0JfUmVzZXREZXZpY2VcbiIpKTsKLQkvL1JUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKTsKKwkvKlJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKTsgKi8KIAlyZXR1cm4gU3RhdHVzOwogfQogCi1WT0lEIENNREhhbmRsZXIoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIENNREhhbmRsZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVBDbWRRRWxtdAkJY21kcWVsbXQ7Ci0JUFVDSEFSCQkJcERhdGE7Ci0JTkRJU19TVEFUVVMJCU5kaXNTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotLy8JVUxPTkcJCQlOb3cgPSAwOwotCU5UU1RBVFVTCQludFN0YXR1czsKLS8vCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisJc3RydWN0IHJ0X2NtZHFlbG10ICpjbWRxZWxtdDsKKwl1OCAqcERhdGE7CisJaW50IE5kaXNTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworLyogICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgIE5vdyA9IDA7ICovCisJaW50IG50U3RhdHVzOworLyogICAgICB1bnNpZ25lZCBsb25nICAgSXJxRmxhZ3M7ICovCiAKLQl3aGlsZSAocEFkLT5DbWRRLnNpemUgPiAwKQotCXsKKwl3aGlsZSAocEFkICYmIHBBZC0+Q21kUS5zaXplID4gMCkgewogCQlOZGlzU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAogCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKQEAgLTEyODgsNTkxICs5ODQsMTEyOSBAQAogCiAJCXBEYXRhID0gY21kcWVsbXQtPmJ1ZmZlcjsKIAotCQlpZighKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpKQotCQl7Ci0JCQlzd2l0Y2ggKGNtZHFlbG10LT5jb21tYW5kKQotCQkJewotCQkJCWNhc2UgQ01EVEhSRUFEX0NIRUNLX0dQSU86CisJCWlmICghCisJCSAgICAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpCisJCSAgICAgfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSkgeworCQkJc3dpdGNoIChjbWRxZWxtdC0+Y29tbWFuZCkgeworCQkJY2FzZSBDTURUSFJFQURfQ0hFQ0tfR1BJTzoKKwkJCQl7CisJCQkJCXUzMiBkYXRhOworCiAJCQkJCXsKLQkJCQkJCVVJTlQzMiBkYXRhOworCQkJCQkJLyogUmVhZCBHUElPIHBpbjIgYXMgSGFyZHdhcmUgY29udHJvbGxlZCByYWRpbyBzdGF0ZSAqLwogCi0JCQkJCQl7Ci0JCQkJCQkJLy8gUmVhZCBHUElPIHBpbjIgYXMgSGFyZHdhcmUgY29udHJvbGxlZCByYWRpbyBzdGF0ZQorCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLAorCQkJCQkJCQkgICAgIEdQSU9fQ1RSTF9DRkcsCisJCQkJCQkJCSAgICAgJmRhdGEpOwogCi0JCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIoIHBBZCwgR1BJT19DVFJMX0NGRywgJmRhdGEpOworCQkJCQkJaWYgKGRhdGEgJiAweDA0KSB7CisJCQkJCQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gPQorCQkJCQkJCSAgICBUUlVFOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9CisJCQkJCQkJICAgIEZBTFNFOworCQkJCQkJfQogCi0JCQkJCQkJaWYgKGRhdGEgJiAweDA0KQotCQkJCQkJCXsKLQkJCQkJCQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gPSBUUlVFOworCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPQorCQkJCQkJICAgIChwQWQtPlN0YUNmZy5iSHdSYWRpbworCQkJCQkJICAgICAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpIHsKKwkJCQkJCQlwQWQtPlN0YUNmZy5iUmFkaW8gPQorCQkJCQkJCSAgICAocEFkLT5TdGFDZmcuCisJCQkJCQkJICAgICBiSHdSYWRpbworCQkJCQkJCSAgICAgJiYgcEFkLT5TdGFDZmcuCisJCQkJCQkJICAgICBiU3dSYWRpbyk7CisJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgICBiUmFkaW8gPT0gVFJVRSkgeworCQkJCQkJCQlEQkdQUklOVF9SQVcKKwkJCQkJCQkJICAgIChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkJICAgICAoIiEhISBSYWRpbyBPbiAhISFcbiIpKTsKKworCQkJCQkJCQlNbG1lUmFkaW9PbgorCQkJCQkJCQkgICAgKHBBZCk7CisJCQkJCQkJCS8qIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiAqLworCQkJCQkJCQlwQWQtPkV4dHJhSW5mbyA9CisJCQkJCQkJCSAgICBFWFRSQV9JTkZPX0NMRUFSOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCURCR1BSSU5UX1JBVworCQkJCQkJCQkgICAgKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJCQkgICAgICgiISEhIFJhZGlvIE9mZiAhISFcbiIpKTsKKworCQkJCQkJCQlNbG1lUmFkaW9PZmYKKwkJCQkJCQkJICAgIChwQWQpOworCQkJCQkJCQkvKiBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gKi8KKwkJCQkJCQkJcEFkLT5FeHRyYUluZm8gPQorCQkJCQkJCQkgICAgSFdfUkFESU9fT0ZGOwogCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJewotCQkJCQkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IEZBTFNFOwotCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKIAotCQkJCQkJCWlmKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQotCQkJCQkJCXsKLQkJCQkJCQkJcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKLQkJCQkJCQkJaWYocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCIhISEgUmFkaW8gT24gISEhXG4iKSk7CisJCQljYXNlIENNRFRIUkVBRF9RS0VSSU9ESUNfRVhFQ1VUOgorCQkJCXsKKwkJCQkJU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYyhOVUxMLCBwQWQsCisJCQkJCQkJCSAgICAgTlVMTCwKKwkJCQkJCQkJICAgICBOVUxMKTsKKwkJCQl9CisJCQkJYnJlYWs7CiAKLQkJCQkJCQkJCU1sbWVSYWRpb09uKHBBZCk7Ci0JCQkJCQkJCQkvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KLQkJCQkJCQkJCXBBZC0+RXh0cmFJbmZvID0gRVhUUkFfSU5GT19DTEVBUjsKKwkJCWNhc2UgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUOgorCQkJCXsKKwkJCQkJdTMyIE1BQ1ZhbHVlOworCQkJCQl1OCBJbmRleDsKKwkJCQkJaW50IHJldCA9IDA7CisJCQkJCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcnRfcnRtcF90eF9yaW5nICpwVHhSaW5nOyAqLworCQkJCQl1bnNpZ25lZCBsb25nIElycUZsYWdzOworCisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAgICAgKCJDbWRUaHJlYWQgOiBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQoUmVzZXRQaXBlaWQ9MHglMHgpPT09PlxuIiwKKwkJCQkJCSAgICAgIHBBZC0+YnVsa1Jlc2V0UGlwZWlkKSk7CisJCQkJCS8qIEFsbCB0cmFuc2ZlcnMgbXVzdCBiZSBhYm9ydGVkIG9yIGNhbmNlbGxlZCBiZWZvcmUgYXR0ZW1wdGluZyB0byByZXNldCB0aGUgcGlwZS4gKi8KKwkJCQkJLypSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7ICovCisJCQkJCS8qIFdhaXQgMTBtcyB0byBsZXQgcHJldmlvdXMgcGFja2V0IHRoYXQgYXJlIGFscmVhZHkgaW4gSFcgRklGTyB0byBjbGVhci4gYnkgTUFYTEVFIDEyLTI1LTIwMDcgKi8KKwkJCQkJSW5kZXggPSAwOworCQkJCQlkbyB7CisJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsCisJCQkJCQkJCSAgICAgVFhSWFFfUENOVCwKKwkJCQkJCQkJICAgICAmTUFDVmFsdWUpOworCQkJCQkJaWYgKChNQUNWYWx1ZSAmIDB4ZjAwMDAwCisJCQkJCQkgICAgIC8qMHg4MDAwMDAgKi8gKSA9PSAwKQorCQkJCQkJCWJyZWFrOworCQkJCQkJSW5kZXgrKzsKKwkJCQkJCVJUTVB1c2VjRGVsYXkoMTAwMDApOworCQkJCQl9IHdoaWxlIChJbmRleCA8IDEwMCk7CisJCQkJCU1BQ1ZhbHVlID0gMDsKKwkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBVU0JfRE1BX0NGRywKKwkJCQkJCQkgICAgICZNQUNWYWx1ZSk7CisJCQkJCS8qIFRvIHByZXZlbnQgUmVhZCBSZWdpc3RlciBlcnJvciwgd2UgMm5kIGNoZWNrIHRoZSB2YWxpZGl0eS4gKi8KKwkJCQkJaWYgKChNQUNWYWx1ZSAmIDB4YzAwMDAwKSA9PSAwKQorCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLAorCQkJCQkJCQkgICAgIFVTQl9ETUFfQ0ZHLAorCQkJCQkJCQkgICAgICZNQUNWYWx1ZSk7CisJCQkJCS8qIFRvIHByZXZlbnQgUmVhZCBSZWdpc3RlciBlcnJvciwgd2UgM3JkIGNoZWNrIHRoZSB2YWxpZGl0eS4gKi8KKwkJCQkJaWYgKChNQUNWYWx1ZSAmIDB4YzAwMDAwKSA9PSAwKQorCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLAorCQkJCQkJCQkgICAgIFVTQl9ETUFfQ0ZHLAorCQkJCQkJCQkgICAgICZNQUNWYWx1ZSk7CisJCQkJCU1BQ1ZhbHVlIHw9IDB4ODAwMDA7CisJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFVTQl9ETUFfQ0ZHLAorCQkJCQkJCSAgICAgIE1BQ1ZhbHVlKTsKKworCQkJCQkvKiBXYWl0IDFtcyB0byBwcmV2ZW50IG5leHQgVVJCIHRvIGJ1bGtvdXQgYmVmb3JlIEhXIHJlc2V0LiBieSBNQVhMRUUgMTItMjUtMjAwNyAqLworCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCisJCQkJCU1BQ1ZhbHVlICY9ICh+MHg4MDAwMCk7CisJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFVTQl9ETUFfQ0ZHLAorCQkJCQkJCSAgICAgIE1BQ1ZhbHVlKTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICAgICAoIlx0U2V0IDB4MmEwIGJpdDE5LiBDbGVhciBVU0IgRE1BIFRYIHBhdGhcbiIpKTsKKworCQkJCQkvKiBXYWl0IDVtcyB0byBwcmV2ZW50IG5leHQgVVJCIHRvIGJ1bGtvdXQgYmVmb3JlIEhXIHJlc2V0LiBieSBNQVhMRUUgMTItMjUtMjAwNyAqLworCQkJCQkvKlJUTVB1c2VjRGVsYXkoNTAwMCk7ICovCisKKwkJCQkJaWYgKChwQWQtPgorCQkJCQkgICAgIGJ1bGtSZXNldFBpcGVpZCAmCisJCQkJCSAgICAgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpID09CisJCQkJCSAgICBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRykgeworCQkJCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCQkJCWlmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4IDwKKwkJCQkJCSAgICBNR01UX1JJTkdfU0laRQorCQkJCQkJICAgIC8qIHBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID09IFRSVUUgKi8KKwkJCQkJCSAgICApIHsKKwkJCQkJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwKKwkJCQkJCQkJCSAgICBmUlRVU0JfQlVMS19PVVRfTUxNRSk7CisJCQkJCQl9CisJCQkJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisKKwkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkgICAgICgiXHRUWCBNR01UIFJFQ09WRVIgRG9uZSFcbiIpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXBIVFRYQ29udGV4dCA9CisJCQkJCQkgICAgJihwQWQtPgorCQkJCQkJICAgICAgVHhDb250ZXh0W3BBZC0+CisJCQkJCQkJCWJ1bGtSZXNldFBpcGVpZF0pOworCQkJCQkJLypOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSk7ICovCisJCQkJCQlSVE1QX0lOVF9MT0NLKCZwQWQtPgorCQkJCQkJCSAgICAgIEJ1bGtPdXRMb2NrW3BBZC0+CisJCQkJCQkJCQkgIGJ1bGtSZXNldFBpcGVpZF0sCisJCQkJCQkJICAgICAgSXJxRmxhZ3MpOworCQkJCQkJaWYgKHBBZC0+CisJCQkJCQkgICAgQnVsa091dFBlbmRpbmdbcEFkLT4KKwkJCQkJCQkJICAgYnVsa1Jlc2V0UGlwZWlkXQorCQkJCQkJICAgID09IEZBTFNFKSB7CisJCQkJCQkJcEFkLT4KKwkJCQkJCQkgICAgQnVsa091dFBlbmRpbmdbcEFkLT4KKwkJCQkJCQkJCSAgIGJ1bGtSZXNldFBpcGVpZF0KKwkJCQkJCQkgICAgPSBUUlVFOworCQkJCQkJCXBIVFRYQ29udGV4dC0+CisJCQkJCQkJICAgIElSUFBlbmRpbmcgPSBUUlVFOworCQkJCQkJCXBBZC0+CisJCQkJCQkJICAgIHdhdGNoRG9nVHhQZW5kaW5nQ250CisJCQkJCQkJICAgIFtwQWQtPgorCQkJCQkJCSAgICAgYnVsa1Jlc2V0UGlwZWlkXSA9CisJCQkJCQkJICAgIDE7CisKKwkJCQkJCQkvKiBubyBtYXR0ZXIgd2hhdCwgY2xlYW4gdGhlIGZsYWcgKi8KKwkJCQkJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKworCQkJCQkJCS8qTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0pOyAqLworCQkJCQkJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT4KKwkJCQkJCQkJCUJ1bGtPdXRMb2NrCisJCQkJCQkJCQlbcEFkLT4KKwkJCQkJCQkJCSBidWxrUmVzZXRQaXBlaWRdLAorCQkJCQkJCQkJSXJxRmxhZ3MpOworCQkJCQkJCXsKKwkJCQkJCQkJUlRVU0JJbml0SFRUeERlc2MKKwkJCQkJCQkJICAgIChwQWQsCisJCQkJCQkJCSAgICAgcEhUVFhDb250ZXh0LAorCQkJCQkJCQkgICAgIHBBZC0+CisJCQkJCQkJCSAgICAgYnVsa1Jlc2V0UGlwZWlkLAorCQkJCQkJCQkgICAgIHBIVFRYQ29udGV4dC0+CisJCQkJCQkJCSAgICAgQnVsa091dFNpemUsCisJCQkJCQkJCSAgICAgKHVzYl9jb21wbGV0ZV90KQorCQkJCQkJCQkgICAgIFJUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZSk7CisKKwkJCQkJCQkJaWYgKChyZXQgPQorCQkJCQkJCQkgICAgIFJUVVNCX1NVQk1JVF9VUkIKKwkJCQkJCQkJICAgICAocEhUVFhDb250ZXh0LT4KKwkJCQkJCQkJICAgICAgcFVyYikpICE9CisJCQkJCQkJCSAgICAwKSB7CisJCQkJCQkJCQlSVE1QX0lOVF9MT0NLCisJCQkJCQkJCQkgICAgKCZwQWQtPgorCQkJCQkJCQkJICAgICBCdWxrT3V0TG9jaworCQkJCQkJCQkJICAgICBbcEFkLT4KKwkJCQkJCQkJCSAgICAgIGJ1bGtSZXNldFBpcGVpZF0sCisJCQkJCQkJCQkgICAgIElycUZsYWdzKTsKKwkJCQkJCQkJCXBBZC0+CisJCQkJCQkJCQkgICAgQnVsa091dFBlbmRpbmcKKwkJCQkJCQkJCSAgICBbcEFkLT4KKwkJCQkJCQkJCSAgICAgYnVsa1Jlc2V0UGlwZWlkXQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBGQUxTRTsKKwkJCQkJCQkJCXBIVFRYQ29udGV4dC0+CisJCQkJCQkJCQkgICAgSVJQUGVuZGluZworCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBGQUxTRTsKKwkJCQkJCQkJCXBBZC0+CisJCQkJCQkJCQkgICAgd2F0Y2hEb2dUeFBlbmRpbmdDbnQKKwkJCQkJCQkJCSAgICBbcEFkLT4KKwkJCQkJCQkJCSAgICAgYnVsa1Jlc2V0UGlwZWlkXQorCQkJCQkJCQkJICAgID0gMDsKKwkJCQkJCQkJCVJUTVBfSU5UX1VOTE9DSworCQkJCQkJCQkJICAgICgmcEFkLT4KKwkJCQkJCQkJCSAgICAgQnVsa091dExvY2sKKwkJCQkJCQkJCSAgICAgW3BBZC0+CisJCQkJCQkJCQkgICAgICBidWxrUmVzZXRQaXBlaWRdLAorCQkJCQkJCQkJICAgICBJcnFGbGFncyk7CisKKwkJCQkJCQkJCURCR1BSSU5UCisJCQkJCQkJCQkgICAgKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJCQkJICAgICAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVDogU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsCisJCQkJCQkJCQkgICAgICByZXQpKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCVJUTVBfSVJRX0xPQ0sKKwkJCQkJCQkJCSAgICAoJnBBZC0+CisJCQkJCQkJCQkgICAgIEJ1bGtPdXRMb2NrCisJCQkJCQkJCQkgICAgIFtwQWQtPgorCQkJCQkJCQkJICAgICAgYnVsa1Jlc2V0UGlwZWlkXSwKKwkJCQkJCQkJCSAgICAgSXJxRmxhZ3MpOworCQkJCQkJCQkJREJHUFJJTlRfUkFXCisJCQkJCQkJCQkgICAgKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJCQkJICAgICAoIlx0Q01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUOiBUeENvbnRleHRbJWRdOkNXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCwgcGVuZGluZz0lZCFcbiIsCisJCQkJCQkJCQkgICAgICBwQWQtPgorCQkJCQkJCQkJICAgICAgYnVsa1Jlc2V0UGlwZWlkLAorCQkJCQkJCQkJICAgICAgcEhUVFhDb250ZXh0LT4KKwkJCQkJCQkJCSAgICAgIEN1cldyaXRlUG9zaXRpb24sCisJCQkJCQkJCQkgICAgICBwSFRUWENvbnRleHQtPgorCQkJCQkJCQkJICAgICAgTmV4dEJ1bGtPdXRQb3NpdGlvbiwKKwkJCQkJCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+CisJCQkJCQkJCQkgICAgICBFTmV4dEJ1bGtPdXRQb3NpdGlvbiwKKwkJCQkJCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+CisJCQkJCQkJCQkgICAgICBiQ29weVNhdmVQYWQsCisJCQkJCQkJCQkgICAgICBwQWQtPgorCQkJCQkJCQkJICAgICAgQnVsa091dFBlbmRpbmcKKwkJCQkJCQkJCSAgICAgIFtwQWQtPgorCQkJCQkJCQkJICAgICAgIGJ1bGtSZXNldFBpcGVpZF0pKTsKKwkJCQkJCQkJCURCR1BSSU5UX1JBVworCQkJCQkJCQkJICAgIChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkJCSAgICAgKCJcdFx0QnVsa091dCBSZXE9MHglbHgsIENvbXBsZXRlPTB4JWx4LCBPdGhlcj0weCVseFxuIiwKKwkJCQkJCQkJCSAgICAgIHBBZC0+CisJCQkJCQkJCQkgICAgICBCdWxrT3V0UmVxLAorCQkJCQkJCQkJICAgICAgcEFkLT4KKwkJCQkJCQkJCSAgICAgIEJ1bGtPdXRDb21wbGV0ZSwKKwkJCQkJCQkJCSAgICAgIHBBZC0+CisJCQkJCQkJCQkgICAgICBCdWxrT3V0Q29tcGxldGVPdGhlcikpOworCQkJCQkJCQkJUlRNUF9JUlFfVU5MT0NLCisJCQkJCQkJCQkgICAgKCZwQWQtPgorCQkJCQkJCQkJICAgICBCdWxrT3V0TG9jaworCQkJCQkJCQkJICAgICBbcEFkLT4KKwkJCQkJCQkJCSAgICAgIGJ1bGtSZXNldFBpcGVpZF0sCisJCQkJCQkJCQkgICAgIElycUZsYWdzKTsKKwkJCQkJCQkJCURCR1BSSU5UX1JBVworCQkJCQkJCQkJICAgIChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkJCSAgICAgKCJcdENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVDogU3VibWl0IFR4IERBVEEgVVJCIGZvciBmYWlsZWQgQnVsa1JlcSgweCVseCkgRG9uZSwgc3RhdHVzPSVkIVxuIiwKKwkJCQkJCQkJCSAgICAgIHBBZC0+CisJCQkJCQkJCQkgICAgICBidWxrUmVzZXRSZXEKKwkJCQkJCQkJCSAgICAgIFtwQWQtPgorCQkJCQkJCQkJICAgICAgIGJ1bGtSZXNldFBpcGVpZF0sCisJCQkJCQkJCQkgICAgICBwSFRUWENvbnRleHQtPgorCQkJCQkJCQkJICAgICAgcFVyYi0+CisJCQkJCQkJCQkgICAgICBzdGF0dXMpKTsKKwogCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvKk5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdKTsgKi8KKwkJCQkJCQkvKlJUTVBfSU5UX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsgKi8KKworCQkJCQkJCURCR1BSSU5UX1JBVworCQkJCQkJCSAgICAoUlRfREVCVUdfRVJST1IsCisJCQkJCQkJICAgICAoIkNtZFRocmVhZCA6IFRYIERBVEEgUkVDT1ZFUiBGQUlMIGZvciBCdWxrUmVxKDB4JWx4KSBiZWNhdXNlIEJ1bGtPdXRQZW5kaW5nWyVkXSBpcyBUUlVFIVxuIiwKKwkJCQkJCQkgICAgICBwQWQtPgorCQkJCQkJCSAgICAgIGJ1bGtSZXNldFJlcVtwQWQtPgorCQkJCQkJCQkJICAgYnVsa1Jlc2V0UGlwZWlkXSwKKwkJCQkJCQkgICAgICBwQWQtPgorCQkJCQkJCSAgICAgIGJ1bGtSZXNldFBpcGVpZCkpOworCQkJCQkJCWlmIChwQWQtPgorCQkJCQkJCSAgICBidWxrUmVzZXRQaXBlaWQgPT0KKwkJCQkJCQkgICAgMCkgeworCQkJCQkJCQl1OAorCQkJCQkJCQkgICAgcGVuZGluZ0NvbnRleHQKKwkJCQkJCQkJICAgID0gMDsKKwkJCQkJCQkJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKgorCQkJCQkJCQkgICAgcEhUVFhDb250ZXh0CisJCQkJCQkJCSAgICA9CisJCQkJCQkJCSAgICAoc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKikKKwkJCQkJCQkJICAgICgmcEFkLT4KKwkJCQkJCQkJICAgICBUeENvbnRleHQKKwkJCQkJCQkJICAgICBbcEFkLT4KKwkJCQkJCQkJICAgICAgYnVsa1Jlc2V0UGlwZWlkXSk7CisJCQkJCQkJCXN0cnVjdCBydF90eF9jb250ZXh0ICoKKwkJCQkJCQkJICAgIHBNTE1FQ29udGV4dAorCQkJCQkJCQkgICAgPQorCQkJCQkJCQkgICAgKHN0cnVjdCBydF90eF9jb250ZXh0ICopCisJCQkJCQkJCSAgICAocEFkLT4KKwkJCQkJCQkJICAgICBNZ210UmluZy4KKwkJCQkJCQkJICAgICBDZWxsW3BBZC0+CisJCQkJCQkJCQkgIE1nbXRSaW5nLgorCQkJCQkJCQkJICBUeERtYUlkeF0uCisJCQkJCQkJCSAgICAgQWxsb2NWYSk7CisJCQkJCQkJCXN0cnVjdCBydF90eF9jb250ZXh0ICoKKwkJCQkJCQkJICAgIHBOVUxMQ29udGV4dAorCQkJCQkJCQkgICAgPQorCQkJCQkJCQkgICAgKHN0cnVjdCBydF90eF9jb250ZXh0ICopCisJCQkJCQkJCSAgICAoJnBBZC0+CisJCQkJCQkJCSAgICAgUHNQb2xsQ29udGV4dCk7CisJCQkJCQkJCXN0cnVjdCBydF90eF9jb250ZXh0ICoKKwkJCQkJCQkJICAgIHBQc1BvbGxDb250ZXh0CisJCQkJCQkJCSAgICA9CisJCQkJCQkJCSAgICAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKikKKwkJCQkJCQkJICAgICgmcEFkLT4KKwkJCQkJCQkJICAgICBOdWxsQ29udGV4dCk7CisKKwkJCQkJCQkJaWYgKHBIVFRYQ29udGV4dC0+SVJQUGVuZGluZykKKwkJCQkJCQkJCXBlbmRpbmdDb250ZXh0CisJCQkJCQkJCQkgICAgfD0KKwkJCQkJCQkJCSAgICAxOworCQkJCQkJCQllbHNlIGlmCisJCQkJCQkJCSAgICAocE1MTUVDb250ZXh0LT4KKwkJCQkJCQkJICAgICBJUlBQZW5kaW5nKQorCQkJCQkJCQkJcGVuZGluZ0NvbnRleHQKKwkJCQkJCQkJCSAgICB8PQorCQkJCQkJCQkJICAgIDI7CisJCQkJCQkJCWVsc2UgaWYKKwkJCQkJCQkJICAgIChwTlVMTENvbnRleHQtPgorCQkJCQkJCQkgICAgIElSUFBlbmRpbmcpCisJCQkJCQkJCQlwZW5kaW5nQ29udGV4dAorCQkJCQkJCQkJICAgIHw9CisJCQkJCQkJCQkgICAgNDsKKwkJCQkJCQkJZWxzZSBpZgorCQkJCQkJCQkgICAgKHBQc1BvbGxDb250ZXh0LT4KKwkJCQkJCQkJICAgICBJUlBQZW5kaW5nKQorCQkJCQkJCQkJcGVuZGluZ0NvbnRleHQKKwkJCQkJCQkJCSAgICB8PQorCQkJCQkJCQkJICAgIDg7CiAJCQkJCQkJCWVsc2UKLQkJCQkJCQkJewotCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIiEhISBSYWRpbyBPZmYgISEhXG4iKSk7CisJCQkJCQkJCQlwZW5kaW5nQ29udGV4dAorCQkJCQkJCQkJICAgID0gMDsKIAotCQkJCQkJCQkJTWxtZVJhZGlvT2ZmKHBBZCk7Ci0JCQkJCQkJCQkvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KLQkJCQkJCQkJCXBBZC0+RXh0cmFJbmZvID0gSFdfUkFESU9fT0ZGOwotCQkJCQkJCQl9CisJCQkJCQkJCURCR1BSSU5UX1JBVworCQkJCQkJCQkgICAgKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJCQkgICAgICgiXHRUWCBPY2N1cGllZCBieSAlZCFcbiIsCisJCQkJCQkJCSAgICAgIHBlbmRpbmdDb250ZXh0KSk7CiAJCQkJCQkJfQorCQkJCQkJCS8qIG5vIG1hdHRlciB3aGF0LCBjbGVhbiB0aGUgZmxhZyAqLworCQkJCQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsCisJCQkJCQkJCQlmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCisJCQkJCQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPgorCQkJCQkJCQkJQnVsa091dExvY2sKKwkJCQkJCQkJCVtwQWQtPgorCQkJCQkJCQkJIGJ1bGtSZXNldFBpcGVpZF0sCisJCQkJCQkJCQlJcnFGbGFncyk7CisKKwkJCQkJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwKKwkJCQkJCQkJCSAgICAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIHBBZC0+CisJCQkJCQkJCQkgICAgIGJ1bGtSZXNldFBpcGVpZCkpOwogCQkJCQkJfQorCisJCQkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLAorCQkJCQkJCQkgIE5VTV9PRl9UWF9SSU5HLAorCQkJCQkJCQkgIE1BWF9UWF9QUk9DRVNTKTsKKwkJCQkJCS8qUlRVU0JLaWNrQnVsa091dChwQWQpOyAqLwogCQkJCQl9Ci0JCQkJCWJyZWFrOwogCi0JCQkJY2FzZSBDTURUSFJFQURfUUtFUklPRElDX0VYRUNVVDoKKwkJCQl9CisJCQkJLyoKKwkJCQkgICAvLyBEb24ndCBjYW5jZWwgQlVMS0lOLgorCQkJCSAgIHdoaWxlICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApICYmCisJCQkJICAgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQorCQkJCSAgIHsKKwkJCQkgICBpZiAoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApCisJCQkJICAgeworCQkJCSAgIERCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrSW4gSVJQIFBlbmRpbmchIWNhbmNlbCBpdCFcbiIpKTsKKwkJCQkgICBSVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAocEFkKTsKKwkJCQkgICB9CisJCQkJICAgUlRNUHVzZWNEZWxheSgxMDAwMDApOworCQkJCSAgIH0KKworCQkJCSAgIGlmICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA9PSAwKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkpCisJCQkJICAgeworCQkJCSAgIHU4ICAgICAgICBpOworCQkJCSAgIFJUVVNCUnhQYWNrZXQocEFkKTsKKwkJCQkgICBwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCA9IDA7ICAgICAgLy8gTmV4dCBSeCBSZWFkIGluZGV4CisJCQkJICAgcEFkLT5OZXh0UnhCdWxrSW5JbmRleCAgICAgICAgICAgICAgID0gMDsgICAgLy8gUnggQnVsayBwb2ludGVyCisJCQkJICAgZm9yIChpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspCisJCQkJICAgeworCQkJCSAgIHN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CisKKwkJCQkgICBwUnhDb250ZXh0LT5wQWQgICAgICA9IHBBZDsKKwkJCQkgICBwUnhDb250ZXh0LT5JblVzZSAgICAgICAgICAgID0gRkFMU0U7CisJCQkJICAgcFJ4Q29udGV4dC0+SVJQUGVuZGluZyAgICAgICA9IEZBTFNFOworCQkJCSAgIHBSeENvbnRleHQtPlJlYWRhYmxlID0gRkFMU0U7CisJCQkJICAgcFJ4Q29udGV4dC0+UmVvcmRlckluVXNlID0gRkFMU0U7CisKKwkJCQkgICB9CisJCQkJICAgUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCQkJCSAgIERCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtSZWNlaXZlXG4iKSk7CisJCQkJICAgfSAqLworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJICAgICAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVDw9PT1cbiIpKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBDTURUSFJFQURfUkVTRVRfQlVMS19JTjoKKwkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAgICAgKCJDbWRUaHJlYWQgOiBDTURUSFJFQURfUkVTRVRfQlVMS19JTiA9PT0gPlxuIikpOworCisJCQkJLyogQWxsIHRyYW5zZmVycyBtdXN0IGJlIGFib3J0ZWQgb3IgY2FuY2VsbGVkIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlc2V0IHRoZSBwaXBlLiAqLworCQkJCXsKKwkJCQkJdTMyIE1BQ1ZhbHVlOworCiAJCQkJCXsKLQkJCQkJCVN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoTlVMTCwgcEFkLCBOVUxMLCBOVUxMKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUOgotCQkJCQl7Ci0JCQkJCQlVSU5UMzIJCU1BQ1ZhbHVlOwotCQkJCQkJVUNIQVIJCUluZGV4OwotCQkJCQkJaW50CQkJcmV0PTA7Ci0JCQkJCQlQSFRfVFhfQ09OVEVYVAlwSFRUWENvbnRleHQ7Ci0vLwkJCQkJCVJUTVBfVFhfUklORyAqcFR4UmluZzsKLQkJCQkJCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7Ci0KLQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJDbWRUaHJlYWQgOiBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQoUmVzZXRQaXBlaWQ9MHglMHgpPT09PlxuIiwgcEFkLT5idWxrUmVzZXRQaXBlaWQpKTsKLQkJCQkJCS8vIEFsbCB0cmFuc2ZlcnMgbXVzdCBiZSBhYm9ydGVkIG9yIGNhbmNlbGxlZCBiZWZvcmUgYXR0ZW1wdGluZyB0byByZXNldCB0aGUgcGlwZS4KLQkJCQkJCS8vUlRVU0JDYW5jZWxQZW5kaW5nQnVsa091dElSUChwQWQpOwotCQkJCQkJLy8gV2FpdCAxMG1zIHRvIGxldCBwcmV2aW91cyBwYWNrZXQgdGhhdCBhcmUgYWxyZWFkeSBpbiBIVyBGSUZPIHRvIGNsZWFyLiBieSBNQVhMRUUgMTItMjUtMjAwNwotCQkJCQkJSW5kZXggPSAwOwotCQkJCQkJZG8KKwkJCQkJCS8qd2hpbGUgKChhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID4gMCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSAqLworCQkJCQkJaWYgKChwQWQtPlBlbmRpbmdSeCA+IDApCisJCQkJCQkgICAgJiYKKwkJCQkJCSAgICAoIVJUTVBfVEVTVF9GTEFHCisJCQkJCQkgICAgIChwQWQsCisJCQkJCQkgICAgICBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKIAkJCQkJCXsKLQkJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIFRYUlhRX1BDTlQsICZNQUNWYWx1ZSk7Ci0JCQkJCQkJaWYgKChNQUNWYWx1ZSAmIDB4ZjAwMDAwLyoweDgwMDAwMCovKSA9PSAwKQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQlJbmRleCsrOwotCQkJCQkJCVJUTVB1c2VjRGVsYXkoMTAwMDApOwotCQkJCQkJfXdoaWxlKEluZGV4IDwgMTAwKTsKLQkJCQkJCU1BQ1ZhbHVlID0gMDsKLQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgVVNCX0RNQV9DRkcsICZNQUNWYWx1ZSk7Ci0JCQkJCQkvLyBUbyBwcmV2ZW50IFJlYWQgUmVnaXN0ZXIgZXJyb3IsIHdlIDJuZCBjaGVjayB0aGUgdmFsaWRpdHkuCi0JCQkJCQlpZiAoKE1BQ1ZhbHVlICYgMHhjMDAwMDApID09IDApCi0JCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBVU0JfRE1BX0NGRywgJk1BQ1ZhbHVlKTsKLQkJCQkJCS8vIFRvIHByZXZlbnQgUmVhZCBSZWdpc3RlciBlcnJvciwgd2UgM3JkIGNoZWNrIHRoZSB2YWxpZGl0eS4KLQkJCQkJCWlmICgoTUFDVmFsdWUgJiAweGMwMDAwMCkgPT0gMCkKLQkJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIFVTQl9ETUFfQ0ZHLCAmTUFDVmFsdWUpOwotCQkJCQkJTUFDVmFsdWUgfD0gMHg4MDAwMDsKLQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFVTQl9ETUFfQ0ZHLCBNQUNWYWx1ZSk7Ci0KLQkJCQkJCS8vIFdhaXQgMW1zIHRvIHByZXZlbnQgbmV4dCBVUkIgdG8gYnVsa291dCBiZWZvcmUgSFcgcmVzZXQuIGJ5IE1BWExFRSAxMi0yNS0yMDA3Ci0JCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCi0JCQkJCQlNQUNWYWx1ZSAmPSAofjB4ODAwMDApOwotCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgVVNCX0RNQV9DRkcsIE1BQ1ZhbHVlKTsKLQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJcdFNldCAweDJhMCBiaXQxOS4gQ2xlYXIgVVNCIERNQSBUWCBwYXRoXG4iKSk7Ci0KLQkJCQkJCS8vIFdhaXQgNW1zIHRvIHByZXZlbnQgbmV4dCBVUkIgdG8gYnVsa291dCBiZWZvcmUgSFcgcmVzZXQuIGJ5IE1BWExFRSAxMi0yNS0yMDA3Ci0JCQkJCQkvL1JUTVB1c2VjRGVsYXkoNTAwMCk7Ci0KLQkJCQkJCWlmICgocEFkLT5idWxrUmVzZXRQaXBlaWQgJiBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRykgPT0gQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpCi0JCQkJCQl7Ci0JCQkJCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKLQkJCQkJCQlpZiAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA8IE1HTVRfUklOR19TSVpFIC8qIHBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID09IFRSVUUgKi8pCi0JCQkJCQkJewotCQkJCQkJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX01MTUUpOwotCQkJCQkJCX0KLQkJCQkJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Ci0KLQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXHRUWCBNR01UIFJFQ09WRVIgRG9uZSFcbiIpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlwSFRUWENvbnRleHQgPSAmKHBBZC0+VHhDb250ZXh0W3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSk7Ci0JCQkJCQkJLy9OZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSk7Ci0JCQkJCQkJUlRNUF9JTlRfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKLQkJCQkJCQlpZiAoIHBBZC0+QnVsa091dFBlbmRpbmdbcEFkLT5idWxrUmVzZXRQaXBlaWRdID09IEZBTFNFKQotCQkJCQkJCXsKLQkJCQkJCQkJcEFkLT5CdWxrT3V0UGVuZGluZ1twQWQtPmJ1bGtSZXNldFBpcGVpZF0gPSBUUlVFOwotCQkJCQkJCQlwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOwotCQkJCQkJCQlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSA9IDE7Ci0KLQkJCQkJCQkJLy8gbm8gbWF0dGVyIHdoYXQsIGNsZWFuIHRoZSBmbGFnCi0JCQkJCQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7Ci0KLQkJCQkJCQkJLy9OZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSk7Ci0JCQkJCQkJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JCQkJCQkJCXsKLQkJCQkJCQkJUlRVU0JJbml0SFRUeERlc2MocEFkLCBwSFRUWENvbnRleHQsIHBBZC0+YnVsa1Jlc2V0UGlwZWlkLCBwSFRUWENvbnRleHQtPkJ1bGtPdXRTaXplLCAodXNiX2NvbXBsZXRlX3QpUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKTsKLQotCQkJCQkJCQlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwSFRUWENvbnRleHQtPnBVcmIpKSE9MCkKLQkJCQkJCQkJewotCQkJCQkJCQkJCVJUTVBfSU5UX0xPQ0soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdLCBJcnFGbGFncyk7Ci0JCQkJCQkJCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSA9IEZBTFNFOwotCQkJCQkJCQkJcEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7Ci0JCQkJCQkJCQkJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtwQWQtPmJ1bGtSZXNldFBpcGVpZF0gPSAwOwotCQkJCQkJCQkJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKLQotCQkJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVDogU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlCi0JCQkJCQkJCQl7Ci0JCQkJCQkJCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKLQkJCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJcdENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVDogVHhDb250ZXh0WyVkXTpDV1Bvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQsIHBlbmRpbmc9JWQhXG4iLAotCQkJCQkJCQkJCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLAotCQkJCQkJCQkJCQkJCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQsIHBBZC0+QnVsa091dFBlbmRpbmdbcEFkLT5idWxrUmVzZXRQaXBlaWRdKSk7Ci0JCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiXHRcdEJ1bGtPdXQgUmVxPTB4JWx4LCBDb21wbGV0ZT0weCVseCwgT3RoZXI9MHglbHhcbiIsCi0JCQkJCQkJCQkJCQkJCQlwQWQtPkJ1bGtPdXRSZXEsIHBBZC0+QnVsa091dENvbXBsZXRlLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKSk7Ci0JCQkJCQkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOwotCQkJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJcdENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVDogU3VibWl0IFR4IERBVEEgVVJCIGZvciBmYWlsZWQgQnVsa1JlcSgweCVseCkgRG9uZSwgc3RhdHVzPSVkIVxuIiwgcEFkLT5idWxrUmVzZXRSZXFbcEFkLT5idWxrUmVzZXRQaXBlaWRdLCBwSFRUWENvbnRleHQtPnBVcmItPnN0YXR1cykpOwotCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJLy9OZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSk7Ci0JCQkJCQkJCS8vUlRNUF9JTlRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOwotCi0JCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJDbWRUaHJlYWQgOiBUWCBEQVRBIFJFQ09WRVIgRkFJTCBmb3IgQnVsa1JlcSgweCVseCkgYmVjYXVzZSBCdWxrT3V0UGVuZGluZ1slZF0gaXMgVFJVRSFcbiIsIHBBZC0+YnVsa1Jlc2V0UmVxW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgcEFkLT5idWxrUmVzZXRQaXBlaWQpKTsKLQkJCQkJCQkJaWYgKHBBZC0+YnVsa1Jlc2V0UGlwZWlkID09IDApCi0JCQkJCQkJCXsKLQkJCQkJCQkJCVVDSEFSCXBlbmRpbmdDb250ZXh0ID0gMDsKLQkJCQkJCQkJCVBIVF9UWF9DT05URVhUIHBIVFRYQ29udGV4dCA9IChQSFRfVFhfQ09OVEVYVCkoJnBBZC0+VHhDb250ZXh0W3BBZC0+YnVsa1Jlc2V0UGlwZWlkIF0pOwotCQkJCQkJCQkJUFRYX0NPTlRFWFQgcE1MTUVDb250ZXh0ID0gKFBUWF9DT05URVhUKShwQWQtPk1nbXRSaW5nLkNlbGxbcEFkLT5NZ210UmluZy5UeERtYUlkeF0uQWxsb2NWYSk7Ci0JCQkJCQkJCQlQVFhfQ09OVEVYVCBwTlVMTENvbnRleHQgPSAoUFRYX0NPTlRFWFQpKCZwQWQtPlBzUG9sbENvbnRleHQpOwotCQkJCQkJCQkJUFRYX0NPTlRFWFQgcFBzUG9sbENvbnRleHQgPSAoUFRYX0NPTlRFWFQpKCZwQWQtPk51bGxDb250ZXh0KTsKLQotCQkJCQkJCQkJaWYgKHBIVFRYQ29udGV4dC0+SVJQUGVuZGluZykKLQkJCQkJCQkJCQlwZW5kaW5nQ29udGV4dCB8PSAxOwotCQkJCQkJCQkJZWxzZSBpZiAocE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nKQotCQkJCQkJCQkJCXBlbmRpbmdDb250ZXh0IHw9IDI7Ci0JCQkJCQkJCQllbHNlIGlmIChwTlVMTENvbnRleHQtPklSUFBlbmRpbmcpCi0JCQkJCQkJCQkJcGVuZGluZ0NvbnRleHQgfD0gNDsKLQkJCQkJCQkJCWVsc2UgaWYgKHBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nKQotCQkJCQkJCQkJCXBlbmRpbmdDb250ZXh0IHw9IDg7Ci0JCQkJCQkJCQllbHNlCi0JCQkJCQkJCQkJcGVuZGluZ0NvbnRleHQgPSAwOwotCi0JCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiXHRUWCBPY2N1cGllZCBieSAlZCFcbiIsIHBlbmRpbmdDb250ZXh0KSk7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCS8vIG5vIG1hdHRlciB3aGF0LCBjbGVhbiB0aGUgZmxhZwotCQkJCQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7Ci0KLQkJCQkJCQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOwotCi0JCQkJCQkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IHBBZC0+YnVsa1Jlc2V0UGlwZWlkKSk7Ci0JCQkJCQkJfQotCi0JCQkJCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKLQkJCQkJCQkvL1JUVVNCS2lja0J1bGtPdXQocEFkKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCQkvLyBEb24ndCBjYW5jZWwgQlVMS0lOLgotCQkJCQkJd2hpbGUgKChhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID4gMCkgJiYKLQkJCQkJCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQotCQkJCQkJewotCQkJCQkJCWlmIChhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID4gMCkKLQkJCQkJCQl7Ci0JCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrSW4gSVJQIFBlbmRpbmchIWNhbmNlbCBpdCFcbiIpKTsKLQkJCQkJCQkJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHBBZCk7Ci0JCQkJCQkJfQotCQkJCQkJCVJUTVB1c2VjRGVsYXkoMTAwMDAwKTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKChhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID09IDApICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSkKLQkJCQkJCXsKLQkJCQkJCQlVQ0hBUglpOwotCQkJCQkJCVJUVVNCUnhQYWNrZXQocEFkKTsKLQkJCQkJCQlwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCA9IDA7CS8vIE5leHQgUnggUmVhZCBpbmRleAotCQkJCQkJCXBBZC0+TmV4dFJ4QnVsa0luSW5kZXgJCT0gMDsJLy8gUnggQnVsayBwb2ludGVyCi0JCQkJCQkJZm9yIChpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspCi0JCQkJCQkJewotCQkJCQkJCQlQUlhfQ09OVEVYVCAgcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbaV0pOwotCi0JCQkJCQkJCXBSeENvbnRleHQtPnBBZAk9IHBBZDsKLQkJCQkJCQkJcFJ4Q29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7Ci0JCQkJCQkJCXBSeENvbnRleHQtPklSUFBlbmRpbmcJPSBGQUxTRTsKLQkJCQkJCQkJcFJ4Q29udGV4dC0+UmVhZGFibGUJPSBGQUxTRTsKLQkJCQkJCQkJcFJ4Q29udGV4dC0+UmVvcmRlckluVXNlID0gRkFMU0U7Ci0KLQkJCQkJCQl9Ci0JCQkJCQkJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOwotCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtSZWNlaXZlXG4iKSk7Ci0JCQkJCQl9Ki8KLQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVDw9PT1cbiIpKTsKLSAgICAJICAgCQkJYnJlYWs7Ci0KLQkJCQljYXNlIENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOOgotCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQ21kVGhyZWFkIDogQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU4gPT09ID5cbiIpKTsKLQotCQkJCQkvLyBBbGwgdHJhbnNmZXJzIG11c3QgYmUgYWJvcnRlZCBvciBjYW5jZWxsZWQgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVzZXQgdGhlIHBpcGUuCi0JCQkJCXsKLQkJCQkJCVVJTlQzMgkJTUFDVmFsdWU7Ci0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCQkJCQkJewotCQkJCQkJLy93aGlsZSAoKGF0b21pY19yZWFkKCZwQWQtPlBlbmRpbmdSeCkgPiAwKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JCQkJCQlpZigocEFkLT5QZW5kaW5nUnggPiAwKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JCQkJCQl7Ci0JCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGtJbiBJUlAgUGVuZGluZyEhIVxuIikpOwotCQkJCQkJCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOworCQkJCQkJCURCR1BSSU5UX1JBVworCQkJCQkJCSAgICAoUlRfREVCVUdfRVJST1IsCisJCQkJCQkJICAgICAoIkJ1bGtJbiBJUlAgUGVuZGluZyEhIVxuIikpOworCQkJCQkJCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUAorCQkJCQkJCSAgICAocEFkKTsKIAkJCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDAwMCk7CiAJCQkJCQkJcEFkLT5QZW5kaW5nUnggPSAwOwogCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJLyogV2FpdCAxMG1zIGJlZm9yZSByZWFkaW5nIHJlZ2lzdGVyLiAqLworCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDAwKTsKKwkJCQkJbnRTdGF0dXMgPQorCQkJCQkgICAgUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBNQUNfQ1NSMCwKKwkJCQkJCQkJICZNQUNWYWx1ZSk7CisKKwkJCQkJaWYgKChOVF9TVUNDRVNTKG50U3RhdHVzKSA9PSBUUlVFKSAmJgorCQkJCQkgICAgKCEoUlRNUF9URVNUX0ZMQUcKKwkJCQkJICAgICAgIChwQWQsCisJCQkJCQkoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUworCQkJCQkJIHwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJCQkJIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUworCQkJCQkJIHwKKwkJCQkJCSBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpKQorCQkJCQl7CisJCQkJCQl1OCBpOworCisJCQkJCQlpZiAoUlRNUF9URVNUX0ZMQUcKKwkJCQkJCSAgICAocEFkLAorCQkJCQkJICAgICAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUworCQkJCQkJICAgICAgfCBmUlRNUF9BREFQVEVSX1JBRElPX09GRgorCQkJCQkJICAgICAgfAorCQkJCQkJICAgICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTCisJCQkJCQkgICAgICB8CisJCQkJCQkgICAgICBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJCQkJCQlicmVhazsKKwkJCQkJCXBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gPQorCQkJCQkJICAgIHBBZC0+UnhDb250ZXh0W3BBZC0+CisJCQkJCQkJCSAgIE5leHRSeEJ1bGtJbkluZGV4XS4KKwkJCQkJCSAgICBCdWxrSW5PZmZzZXQ7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkgKCJCVUxLX0lOX1JFU0VUOiBOQklJZHg9MHgleCxOQklSSWR4PTB4JXgsIEJJUlBvcz0weCVseC4gQklSZXE9eCVseCwgQklDb21wbGV0ZT0weCVseCwgQklDRmFpbDB4JWx4XG4iLAorCQkJCQkJCSAgcEFkLT4KKwkJCQkJCQkgIE5leHRSeEJ1bGtJbkluZGV4LAorCQkJCQkJCSAgcEFkLT4KKwkJCQkJCQkgIE5leHRSeEJ1bGtJblJlYWRJbmRleCwKKwkJCQkJCQkgIHBBZC0+CisJCQkJCQkJICBOZXh0UnhCdWxrSW5Qb3NpdGlvbiwKKwkJCQkJCQkgIHBBZC0+QnVsa0luUmVxLAorCQkJCQkJCSAgcEFkLT5CdWxrSW5Db21wbGV0ZSwKKwkJCQkJCQkgIHBBZC0+CisJCQkJCQkJICBCdWxrSW5Db21wbGV0ZUZhaWwpKTsKKwkJCQkJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7CisJCQkJCQkgICAgIGkrKykgeworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJCQkgKCJcdFJ4Q29udGV4dFslZF06IElSUFBlbmRpbmc9JWQsIEluVXNlPSVkLCBSZWFkYWJsZT0lZCFcbiIsCisJCQkJCQkJCSAgaSwKKwkJCQkJCQkJICBwQWQtPgorCQkJCQkJCQkgIFJ4Q29udGV4dFtpXS4KKwkJCQkJCQkJICBJUlBQZW5kaW5nLAorCQkJCQkJCQkgIHBBZC0+CisJCQkJCQkJCSAgUnhDb250ZXh0W2ldLgorCQkJCQkJCQkgIEluVXNlLAorCQkJCQkJCQkgIHBBZC0+CisJCQkJCQkJCSAgUnhDb250ZXh0W2ldLgorCQkJCQkJCQkgIFJlYWRhYmxlKSk7CiAJCQkJCQl9CisJCQkJCQkvKgogCi0JCQkJCQkvLyBXYWl0IDEwbXMgYmVmb3JlIHJlYWRpbmcgcmVnaXN0ZXIuCi0JCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDAwKTsKLQkJCQkJCW50U3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBNQUNfQ1NSMCwgJk1BQ1ZhbHVlKTsKKwkJCQkJCSAgIERCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpKTsKIAotCQkJCQkJaWYgKChOVF9TVUNDRVNTKG50U3RhdHVzKSA9PSBUUlVFKSAmJgotCQkJCQkJCSghKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8Ci0JCQkJCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKSkKLQkJCQkJCXsKLQkJCQkJCQlVQ0hBUglpOworCQkJCQkJICAgcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXggPSAwOyAgICAgIC8vIE5leHQgUnggUmVhZCBpbmRleAorCQkJCQkJICAgcEFkLT5OZXh0UnhCdWxrSW5JbmRleCAgICAgICAgICAgICAgID0gMDsgICAgLy8gUnggQnVsayBwb2ludGVyCisJCQkJCQkgICBmb3IgKGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKKwkJCQkJCSAgIHsKKwkJCQkJCSAgIHN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CiAKLQkJCQkJCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKLQkJCQkJCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJCQkJCQkgICBwUnhDb250ZXh0LT5wQWQgICAgICA9IHBBZDsKKwkJCQkJCSAgIHBSeENvbnRleHQtPkluVXNlICAgICAgICAgICAgPSBGQUxTRTsKKwkJCQkJCSAgIHBSeENvbnRleHQtPklSUFBlbmRpbmcgICAgICAgPSBGQUxTRTsKKwkJCQkJCSAgIHBSeENvbnRleHQtPlJlYWRhYmxlID0gRkFMU0U7CisJCQkJCQkgICBwUnhDb250ZXh0LT5SZW9yZGVySW5Vc2UgPSBGQUxTRTsKKworCQkJCQkJICAgfSAqLworCQkJCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQpOworCQkJCQkJZm9yIChpID0gMDsKKwkJCQkJCSAgICAgaSA8CisJCQkJCQkgICAgIHBBZC0+Q29tbW9uQ2ZnLgorCQkJCQkJICAgICBOdW1PZkJ1bGtJbklSUDsgaSsrKSB7CisJCQkJCQkJLypSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7ICovCisJCQkJCQkJc3RydWN0IHJ0X3J4X2NvbnRleHQgKnBSeENvbnRleHQ7CisJCQkJCQkJUFVSQiBwVXJiOworCQkJCQkJCWludCByZXQgPSAwOworCQkJCQkJCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisKKwkJCQkJCQlSVE1QX0lSUV9MT0NLKCZwQWQtPgorCQkJCQkJCQkgICAgICBCdWxrSW5Mb2NrLAorCQkJCQkJCQkgICAgICBJcnFGbGFncyk7CisJCQkJCQkJcFJ4Q29udGV4dCA9CisJCQkJCQkJICAgICYocEFkLT4KKwkJCQkJCQkgICAgICBSeENvbnRleHRbcEFkLT4KKwkJCQkJCQkJCU5leHRSeEJ1bGtJbkluZGV4XSk7CisJCQkJCQkJaWYgKChwQWQtPlBlbmRpbmdSeCA+IDApCisJCQkJCQkJICAgIHx8IChwUnhDb250ZXh0LT4KKwkJCQkJCQkJUmVhZGFibGUgPT0KKwkJCQkJCQkJVFJVRSkKKwkJCQkJCQkgICAgfHwgKHBSeENvbnRleHQtPgorCQkJCQkJCQlJblVzZSA9PQorCQkJCQkJCQlUUlVFKSkgeworCQkJCQkJCQlSVE1QX0lSUV9VTkxPQ0sKKwkJCQkJCQkJICAgICgmcEFkLT4KKwkJCQkJCQkJICAgICBCdWxrSW5Mb2NrLAorCQkJCQkJCQkgICAgIElycUZsYWdzKTsKIAkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IHBBZC0+UnhDb250ZXh0W3BBZC0+TmV4dFJ4QnVsa0luSW5kZXhdLkJ1bGtJbk9mZnNldDsKLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCVUxLX0lOX1JFU0VUOiBOQklJZHg9MHgleCxOQklSSWR4PTB4JXgsIEJJUlBvcz0weCVseC4gQklSZXE9eCVseCwgQklDb21wbGV0ZT0weCVseCwgQklDRmFpbDB4JWx4XG4iLAotCQkJCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5JbmRleCwgIHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uLCBwQWQtPkJ1bGtJblJlcSwgcEFkLT5CdWxrSW5Db21wbGV0ZSwgcEFkLT5CdWxrSW5Db21wbGV0ZUZhaWwpKTsKLQkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCi0JCQkJCQkJewotIAkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXHRSeENvbnRleHRbJWRdOiBJUlBQZW5kaW5nPSVkLCBJblVzZT0lZCwgUmVhZGFibGU9JWQhXG4iCi0JCQkJCQkJCQksIGksIHBBZC0+UnhDb250ZXh0W2ldLklSUFBlbmRpbmcsIHBBZC0+UnhDb250ZXh0W2ldLkluVXNlLCBwQWQtPlJ4Q29udGV4dFtpXS5SZWFkYWJsZSkpOwogCQkJCQkJCX0KLSAJCQkJCQkJLyoKKwkJCQkJCQlwUnhDb250ZXh0LT5JblVzZSA9CisJCQkJCQkJICAgIFRSVUU7CisJCQkJCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9CisJCQkJCQkJICAgIFRSVUU7CisJCQkJCQkJcEFkLT5QZW5kaW5nUngrKzsKKwkJCQkJCQlwQWQtPkJ1bGtJblJlcSsrOworCQkJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT4KKwkJCQkJCQkJCUJ1bGtJbkxvY2ssCisJCQkJCQkJCQlJcnFGbGFncyk7CiAKLQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKSk7CisJCQkJCQkJLyogSW5pdCBSeCBjb250ZXh0IGRlc2NyaXB0b3IgKi8KKwkJCQkJCQlSVFVTQkluaXRSeERlc2MocEFkLAorCQkJCQkJCQkJcFJ4Q29udGV4dCk7CisJCQkJCQkJcFVyYiA9IHBSeENvbnRleHQtPnBVcmI7CisJCQkJCQkJaWYgKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSAhPSAwKSB7CS8qIGZhaWwgKi8KIAotCQkJCQkJCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4ID0gMDsJLy8gTmV4dCBSeCBSZWFkIGluZGV4Ci0JCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5JbmRleAkJPSAwOwkvLyBSeCBCdWxrIHBvaW50ZXIKLQkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKLQkJCQkJCQl7Ci0JCQkJCQkJCVBSWF9DT05URVhUICBwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7Ci0KLQkJCQkJCQkJcFJ4Q29udGV4dC0+cEFkCT0gcEFkOwotCQkJCQkJCQlwUnhDb250ZXh0LT5JblVzZQkJPSBGQUxTRTsKLQkJCQkJCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZwk9IEZBTFNFOwotCQkJCQkJCQlwUnhDb250ZXh0LT5SZWFkYWJsZQk9IEZBTFNFOwotCQkJCQkJCQlwUnhDb250ZXh0LT5SZW9yZGVySW5Vc2UgPSBGQUxTRTsKLQotCQkJCQkJCX0qLwotCQkJCQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUKTsKLQkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5Db21tb25DZmcuTnVtT2ZCdWxrSW5JUlA7IGkrKykKLQkJCQkJCQl7Ci0JCQkJCQkJCS8vUlRVU0JCdWxrUmVjZWl2ZShwQWQpOwotCQkJCQkJCQlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKLQkJCQkJCQkJUFVSQgkJCXBVcmI7Ci0JCQkJCQkJCWludAkJCQlyZXQgPSAwOwotCQkJCQkJCQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOwotCi0KLQkJCQkJCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7Ci0JCQkJCQkJCXBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W3BBZC0+TmV4dFJ4QnVsa0luSW5kZXhdKTsKLQkJCQkJCQkJaWYgKChwQWQtPlBlbmRpbmdSeCA+IDApIHx8IChwUnhDb250ZXh0LT5SZWFkYWJsZSA9PSBUUlVFKSB8fCAocFJ4Q29udGV4dC0+SW5Vc2UgPT0gVFJVRSkpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCQlwUnhDb250ZXh0LT5JblVzZSA9IFRSVUU7Ci0JCQkJCQkJCXBSeENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOwotCQkJCQkJCQlwQWQtPlBlbmRpbmdSeCsrOwotCQkJCQkJCQlwQWQtPkJ1bGtJblJlcSsrOwotCQkJCQkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwotCi0JCQkJCQkJCS8vIEluaXQgUnggY29udGV4dCBkZXNjcmlwdG9yCi0JCQkJCQkJCVJUVVNCSW5pdFJ4RGVzYyhwQWQsIHBSeENvbnRleHQpOwotCQkJCQkJCQlwVXJiID0gcFJ4Q29udGV4dC0+cFVyYjsKLQkJCQkJCQkJaWYgKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSE9MCkKLQkJCQkJCQkJewkvLyBmYWlsCi0KLQkJCQkJCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwotCQkJCQkJCQkJcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKLQkJCQkJCQkJCXBSeENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKLQkJCQkJCQkJCXBBZC0+UGVuZGluZ1J4LS07Ci0JCQkJCQkJCQlwQWQtPkJ1bGtJblJlcS0tOwotCQkJCQkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKLQkJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNNRFRIUkVBRF9SRVNFVF9CVUxLX0lOOiBTdWJtaXQgUnggVVJCIGZhaWxlZCglZCksIHN0YXR1cz0lZFxuIiwgcmV0LCBwVXJiLT5zdGF0dXMpKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlCi0JCQkJCQkJCXsJLy8gc3VjY2VzcwotCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNNRFRIUkVBRF9SRVNFVF9CVUxLX0lOOiBTdWJtaXQgUnggVVJCIERvbmUsIHN0YXR1cz0lZCFcbiIsIHBVcmItPnN0YXR1cykpOwotCQkJCQkJCQkJQVNTRVJUKChwUnhDb250ZXh0LT5JblVzZSA9PSBwUnhDb250ZXh0LT5JUlBQZW5kaW5nKSk7Ci0JCQkJCQkJCX0KKwkJCQkJCQkJUlRNUF9JUlFfTE9DSworCQkJCQkJCQkgICAgKCZwQWQtPgorCQkJCQkJCQkgICAgIEJ1bGtJbkxvY2ssCisJCQkJCQkJCSAgICAgSXJxRmxhZ3MpOworCQkJCQkJCQlwUnhDb250ZXh0LT4KKwkJCQkJCQkJICAgIEluVXNlID0KKwkJCQkJCQkJICAgIEZBTFNFOworCQkJCQkJCQlwUnhDb250ZXh0LT4KKwkJCQkJCQkJICAgIElSUFBlbmRpbmcgPQorCQkJCQkJCQkgICAgRkFMU0U7CisJCQkJCQkJCXBBZC0+CisJCQkJCQkJCSAgICBQZW5kaW5nUngtLTsKKwkJCQkJCQkJcEFkLT4KKwkJCQkJCQkJICAgIEJ1bGtJblJlcS0tOworCQkJCQkJCQlSVE1QX0lSUV9VTkxPQ0sKKwkJCQkJCQkJICAgICgmcEFkLT4KKwkJCQkJCQkJICAgICBCdWxrSW5Mb2NrLAorCQkJCQkJCQkgICAgIElycUZsYWdzKTsKKwkJCQkJCQkJREJHUFJJTlQKKwkJCQkJCQkJICAgIChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkJICAgICAoIkNNRFRIUkVBRF9SRVNFVF9CVUxLX0lOOiBTdWJtaXQgUnggVVJCIGZhaWxlZCglZCksIHN0YXR1cz0lZFxuIiwKKwkJCQkJCQkJICAgICAgcmV0LAorCQkJCQkJCQkgICAgICBwVXJiLT4KKwkJCQkJCQkJICAgICAgc3RhdHVzKSk7CisJCQkJCQkJfSBlbHNlIHsJLyogc3VjY2VzcyAqLworCQkJCQkJCQkvKkRCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJJRG9uZSwgUGVuZD0lZCxCSUlkeD0lZCxCSVJJZHg9JWQhXG4iLCAqLworCQkJCQkJCQkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+UGVuZGluZ1J4LCBwQWQtPk5leHRSeEJ1bGtJbkluZGV4LCBwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCkpOyAqLworCQkJCQkJCQlEQkdQUklOVF9SQVcKKwkJCQkJCQkJICAgIChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkJICAgICAoIkNNRFRIUkVBRF9SRVNFVF9CVUxLX0lOOiBTdWJtaXQgUnggVVJCIERvbmUsIHN0YXR1cz0lZCFcbiIsCisJCQkJCQkJCSAgICAgIHBVcmItPgorCQkJCQkJCQkgICAgICBzdGF0dXMpKTsKKwkJCQkJCQkJQVNTRVJUKChwUnhDb250ZXh0LT5JblVzZSA9PSBwUnhDb250ZXh0LT5JUlBQZW5kaW5nKSk7CiAJCQkJCQkJfQotCiAJCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJLy8gQ2FyZCBtdXN0IGJlIHJlbW92ZWQKLQkJCQkJCQlpZiAoTlRfU1VDQ0VTUyhudFN0YXR1cykgIT0gVFJVRSkKLQkJCQkJCQl7Ci0JCQkJCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCk7Ci0JCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJDTURUSFJFQURfUkVTRVRfQlVMS19JTjogUmVhZCBSZWdpc3RlciBGYWlsZWQhQ2FyZCBtdXN0IGJlIHJlbW92ZWQhIVxuXG4iKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UKLQkJCQkJCQl7Ci0JCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJDTURUSFJFQURfUkVTRVRfQlVMS19JTjogQ2Fubm90IGRvIGJ1bGsgaW4gYmVjYXVzZSBmbGFncygweCVseCkgb24gIVxuIiwgcEFkLT5GbGFncykpOworCisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiBDYXJkIG11c3QgYmUgcmVtb3ZlZCAqLworCQkJCQkJaWYgKE5UX1NVQ0NFU1MobnRTdGF0dXMpICE9CisJCQkJCQkgICAgVFJVRSkgeworCQkJCQkJCVJUTVBfU0VUX0ZMQUcocEFkLAorCQkJCQkJCQkgICAgICBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpOworCQkJCQkJCURCR1BSSU5UX1JBVworCQkJCQkJCSAgICAoUlRfREVCVUdfRVJST1IsCisJCQkJCQkJICAgICAoIkNNRFRIUkVBRF9SRVNFVF9CVUxLX0lOOiBSZWFkIFJlZ2lzdGVyIEZhaWxlZCFDYXJkIG11c3QgYmUgcmVtb3ZlZCEhXG5cbiIpKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJREJHUFJJTlRfUkFXCisJCQkJCQkJICAgIChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkgICAgICgiQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU46IENhbm5vdCBkbyBidWxrIGluIGJlY2F1c2UgZmxhZ3MoMHglbHgpIG9uICFcbiIsCisJCQkJCQkJICAgICAgcEFkLT5GbGFncykpOwogCQkJCQkJfQogCQkJCQl9Ci0JCQkJCX0KLQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOIDw9PT1cbiIpKTsKLQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJICAgICAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOIDw9PT1cbiIpKTsKKwkJCQlicmVhazsKIAotCQkJCWNhc2UgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSUQ6CisJCQljYXNlIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEOgorCQkJCXsKKwkJCQkJc3RydWN0IHJ0X3NldF9hc2ljX3djaWQgU2V0QXNpY1djaWQ7CisJCQkJCXUxNiBvZmZzZXQ7CisJCQkJCXUzMiBNQUNWYWx1ZSwgTUFDUlZhbHVlID0gMDsKKwkJCQkJU2V0QXNpY1djaWQgPQorCQkJCQkgICAgKigoc3RydWN0IHJ0X3NldF9hc2ljX3djaWQgKikocERhdGEpKTsKKworCQkJCQlpZiAoU2V0QXNpY1djaWQuV0NJRCA+PQorCQkJCQkgICAgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCQkJCQlyZXR1cm47CisKKwkJCQkJb2Zmc2V0ID0KKwkJCQkJICAgIE1BQ19XQ0lEX0JBU0UgKworCQkJCQkgICAgKCh1OClTZXRBc2ljV2NpZC5XQ0lEKSAqCisJCQkJCSAgICBIV19XQ0lEX0VOVFJZX1NJWkU7CisKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICAgICAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEIDogV0NJRCA9ICVsZCwgU2V0VGlkICA9ICVseCwgRGVsZXRlVGlkID0gJWx4LlxuIiwKKwkJCQkJCSAgICAgIFNldEFzaWNXY2lkLldDSUQsCisJCQkJCQkgICAgICBTZXRBc2ljV2NpZC5TZXRUaWQsCisJCQkJCQkgICAgICBTZXRBc2ljV2NpZC5EZWxldGVUaWQpKTsKKwkJCQkJTUFDVmFsdWUgPQorCQkJCQkgICAgKHBBZC0+TWFjVGFiLgorCQkJCQkgICAgIENvbnRlbnRbU2V0QXNpY1djaWQuV0NJRF0uCisJCQkJCSAgICAgQWRkclszXSA8PCAyNCkgKworCQkJCQkgICAgKHBBZC0+TWFjVGFiLgorCQkJCQkgICAgIENvbnRlbnRbU2V0QXNpY1djaWQuV0NJRF0uCisJCQkJCSAgICAgQWRkclsyXSA8PCAxNikgKworCQkJCQkgICAgKHBBZC0+TWFjVGFiLgorCQkJCQkgICAgIENvbnRlbnRbU2V0QXNpY1djaWQuV0NJRF0uCisJCQkJCSAgICAgQWRkclsxXSA8PCA4KSArCisJCQkJCSAgICAocEFkLT5NYWNUYWIuCisJCQkJCSAgICAgQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS5BZGRyWzBdKTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICAgICAoIjEtTUFDVmFsdWU9ICV4LFxuIiwKKwkJCQkJCSAgICAgIE1BQ1ZhbHVlKSk7CisJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwKKwkJCQkJCQkgICAgICBNQUNWYWx1ZSk7CisJCQkJCS8qIFJlYWQgYml0bWFzayAqLworCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIG9mZnNldCArIDQsCisJCQkJCQkJICAgICAmTUFDUlZhbHVlKTsKKwkJCQkJaWYgKFNldEFzaWNXY2lkLkRlbGV0ZVRpZCAhPSAweGZmZmZmZmZmKQorCQkJCQkJTUFDUlZhbHVlICY9CisJCQkJCQkgICAgKH5TZXRBc2ljV2NpZC5EZWxldGVUaWQpOworCQkJCQlpZiAoU2V0QXNpY1djaWQuU2V0VGlkICE9IDB4ZmZmZmZmZmYpCisJCQkJCQlNQUNSVmFsdWUgfD0KKwkJCQkJCSAgICAoU2V0QXNpY1djaWQuU2V0VGlkKTsKKwkJCQkJTUFDUlZhbHVlICY9IDB4ZmZmZjAwMDA7CisKKwkJCQkJTUFDVmFsdWUgPQorCQkJCQkgICAgKHBBZC0+TWFjVGFiLgorCQkJCQkgICAgIENvbnRlbnRbU2V0QXNpY1djaWQuV0NJRF0uCisJCQkJCSAgICAgQWRkcls1XSA8PCA4KSArCisJCQkJCSAgICBwQWQtPk1hY1RhYi5Db250ZW50W1NldEFzaWNXY2lkLgorCQkJCQkJCQlXQ0lEXS5BZGRyWzRdOworCQkJCQlNQUNWYWx1ZSB8PSBNQUNSVmFsdWU7CisJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCArIDQsCisJCQkJCQkJICAgICAgTUFDVmFsdWUpOworCisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAgICAgKCIyLU1BQ1ZhbHVlPSAleCxcbiIsCisJCQkJCQkgICAgICBNQUNWYWx1ZSkpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBDTURUSFJFQURfU0VUX0FTSUNfV0NJRF9DSVBIRVI6CisJCQkJeworCQkJCQlzdHJ1Y3QgcnRfc2V0X2FzaWNfd2NpZF9hdHRyaSBTZXRBc2ljV2NpZEF0dHJpOworCQkJCQl1MTYgb2Zmc2V0OworCQkJCQl1MzIgTUFDUlZhbHVlID0gMDsKKwkJCQkJU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKKwkJCQkJU2V0QXNpY1djaWRBdHRyaSA9CisJCQkJCSAgICAqKChzdHJ1Y3QgcnRfc2V0X2FzaWNfd2NpZF9hdHRyaSAqKQorCQkJCQkgICAgICAocERhdGEpKTsKKworCQkJCQlpZiAoU2V0QXNpY1djaWRBdHRyaS5XQ0lEID49CisJCQkJCSAgICBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJCQkJCXJldHVybjsKKworCQkJCQlvZmZzZXQgPQorCQkJCQkgICAgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKworCQkJCQkgICAgKCh1OClTZXRBc2ljV2NpZEF0dHJpLldDSUQpICoKKwkJCQkJICAgIEhXX1dDSURfQVRUUklfU0laRTsKKworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgICAgICgiQ21kIDogQ01EVEhSRUFEX1NFVF9BU0lDX1dDSURfQ0lQSEVSIDogV0NJRCA9ICVsZCwgQ2lwaGVyID0gJWx4LlxuIiwKKwkJCQkJCSAgICAgIFNldEFzaWNXY2lkQXR0cmkuV0NJRCwKKwkJCQkJCSAgICAgIFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyKSk7CisJCQkJCS8qIFJlYWQgYml0bWFzayAqLworCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwKKwkJCQkJCQkgICAgICZNQUNSVmFsdWUpOworCQkJCQlNQUNSVmFsdWUgPSAwOworCQkJCQlNQUNSVmFsdWUgfD0KKwkJCQkJICAgICgoKHU4KVNldEFzaWNXY2lkQXR0cmkuCisJCQkJCSAgICAgIENpcGhlcikgPDwgMSk7CisKKwkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LAorCQkJCQkJCSAgICAgIE1BQ1JWYWx1ZSk7CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAgICAgKCIyLW9mZnNldCA9ICV4ICwgTUFDVmFsdWU9ICV4LFxuIiwKKwkJCQkJCSAgICAgIG9mZnNldCwgTUFDUlZhbHVlKSk7CisKKwkJCQkJb2Zmc2V0ID0KKwkJCQkJICAgIFBBSVJXSVNFX0lWRUlWX1RBQkxFX0JBU0UgKworCQkJCQkgICAgKCh1OClTZXRBc2ljV2NpZEF0dHJpLldDSUQpICoKKwkJCQkJICAgIEhXX0lWRUlWX0VOVFJZX1NJWkU7CisJCQkJCU1BQ1JWYWx1ZSA9IDA7CisJCQkJCWlmICgoU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIgPD0KKwkJCQkJICAgICBDSVBIRVJfV0VQMTI4KSkKKwkJCQkJCU1BQ1JWYWx1ZSB8PQorCQkJCQkJICAgIChwQWQtPlN0YUNmZy4KKwkJCQkJCSAgICAgRGVmYXVsdEtleUlkIDw8IDMwKTsKKwkJCQkJZWxzZQorCQkJCQkJTUFDUlZhbHVlIHw9ICgweDIwMDAwMDAwKTsKKwkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LAorCQkJCQkJCSAgICAgIE1BQ1JWYWx1ZSk7CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAgICAgKCIyLW9mZnNldCA9ICV4ICwgTUFDVmFsdWU9ICV4LFxuIiwKKwkJCQkJCSAgICAgIG9mZnNldCwgTUFDUlZhbHVlKSk7CisKKwkJCQkJLyogKi8KKwkJCQkJLyogVXBkYXRlIGNpcGhlciBhbGdvcml0aG0uIFdTVEEgYWx3YXlzIHVzZSBCU1MwICovCisJCQkJCS8qICovCisJCQkJCS8qIGZvciBhZGhvYyBtb2RlIG9ubHkgLGJlY2F1c2Ugd2VwIHN0YXR1cyBzbG93IHRoYW4gYWRkIGtleSwgd2hlbiB1c2UgemVybyBjb25maWcgKi8KKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKSB7CisJCQkJCQlvZmZzZXQgPQorCQkJCQkJICAgIE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFOworCisJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsCisJCQkJCQkJCSAgICAgb2Zmc2V0LAorCQkJCQkJCQkgICAgICZNQUNSVmFsdWUpOworCQkJCQkJTUFDUlZhbHVlICY9ICh+MHhlKTsKKwkJCQkJCU1BQ1JWYWx1ZSB8PQorCQkJCQkJICAgICgoKHU4KVNldEFzaWNXY2lkQXR0cmkuCisJCQkJCQkgICAgICBDaXBoZXIpIDw8IDEpOworCisJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLAorCQkJCQkJCQkgICAgICBvZmZzZXQsCisJCQkJCQkJCSAgICAgIE1BQ1JWYWx1ZSk7CisKKwkJCQkJCS8qVXBkYXRlIGdyb3VwIGtleSBjaXBoZXIsLGJlY2F1c2Ugd2VwIHN0YXR1cyBzbG93IHRoYW4gYWRkIGtleSwgd2hlbiB1c2UgemVybyBjb25maWcgKi8KKwkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwKKwkJCQkJCQkJICAgICBTSEFSRURfS0VZX01PREVfQkFTRQorCQkJCQkJCQkgICAgICsKKwkJCQkJCQkJICAgICA0ICogKDAgLworCQkJCQkJCQkJICAyKSwKKwkJCQkJCQkJICAgICAmY3NyMS4KKwkJCQkJCQkJICAgICB3b3JkKTsKKworCQkJCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9CisJCQkJCQkgICAgU2V0QXNpY1djaWRBdHRyaS5DaXBoZXI7CisJCQkJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0KKwkJCQkJCSAgICBTZXRBc2ljV2NpZEF0dHJpLkNpcGhlcjsKKworCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwKKwkJCQkJCQkJICAgICAgU0hBUkVEX0tFWV9NT0RFX0JBU0UKKwkJCQkJCQkJICAgICAgKworCQkJCQkJCQkgICAgICA0ICogKDAgLworCQkJCQkJCQkJICAgMiksCisJCQkJCQkJCSAgICAgIGNzcjEuCisJCQkJCQkJCSAgICAgIHdvcmQpOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCisvKkJlbnNvbiBtb2RpZmllZCBmb3IgVVNCIGludGVyZmFjZSwgYXZvaWQgaW4gaW50ZXJydXB0IHdoZW4gd3JpdGUga2V5LCAyMDA4MDcyNCAtLT4gKi8KKwkJCWNhc2UgUlRfQ01EX1NFVF9LRVlfVEFCTEU6CS8qR2VuZXJhbCBjYWxsIGZvciBBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgpICovCisJCQkJeworCQkJCQlzdHJ1Y3QgcnRfYWRkX3BhaXJ3aXNlX2tleV9lbnRyeSBLZXlJbmZvOworCQkJCQlLZXlJbmZvID0KKwkJCQkJICAgICooKHN0cnVjdCBydF9hZGRfcGFpcndpc2Vfa2V5X2VudHJ5ICopCisJCQkJCSAgICAgIChwRGF0YSkpOworCQkJCQlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeShwQWQsCisJCQkJCQkJCUtleUluZm8uTWFjQWRkciwKKwkJCQkJCQkJKHU4KUtleUluZm8uCisJCQkJCQkJCU1hY1RhYk1hdGNoV0NJRCwKKwkJCQkJCQkJJktleUluZm8uCisJCQkJCQkJCUNpcGhlcktleSk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFJUX0NNRF9TRVRfUlhfV0NJRF9UQUJMRToJLypHZW5lcmFsIGNhbGwgZm9yIFJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoKSAqLworCQkJCXsKKwkJCQkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5OworCQkJCQl1OCBLZXlJZHggPSAwOworCQkJCQl1OCBDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCQkJdTggQXBJZHggPSBCU1MwOworCisJCQkJCXBFbnRyeSA9IChzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICopKHBEYXRhKTsKKworCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkJICBBcElkeCwKKwkJCQkJCQkJICBLZXlJZHgsCisJCQkJCQkJCSAgQ2lwaGVyQWxnLAorCQkJCQkJCQkgIHBFbnRyeSk7CisJCQkJfQorCQkJCWJyZWFrOworLypCZW5zb24gbW9kaWZpZWQgZm9yIFVTQiBpbnRlcmZhY2UsIGF2b2lkIGluIGludGVycnVwdCB3aGVuIHdyaXRlIGtleSwgMjAwODA3MjQgPC0tICovCisKKwkJCWNhc2UgQ01EVEhSRUFEX1NFVF9DTElFTlRfTUFDX0VOVFJZOgorCQkJCXsKKwkJCQkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5OworCQkJCQlwRW50cnkgPSAoc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqKXBEYXRhOworCiAJCQkJCXsKLQkJCQkJCVJUX1NFVF9BU0lDX1dDSUQJU2V0QXNpY1djaWQ7Ci0JCQkJCQlVU0hPUlQJCW9mZnNldDsKLQkJCQkJCVVJTlQzMgkJTUFDVmFsdWUsIE1BQ1JWYWx1ZSA9IDA7Ci0JCQkJCQlTZXRBc2ljV2NpZCA9ICooKFBSVF9TRVRfQVNJQ19XQ0lEKShwRGF0YSkpOwotCi0JCQkJCQlpZiAoU2V0QXNpY1djaWQuV0NJRCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQkJCQkJCQlyZXR1cm47Ci0KLQkJCQkJCW9mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyAoKFVDSEFSKVNldEFzaWNXY2lkLldDSUQpKkhXX1dDSURfRU5UUllfU0laRTsKLQotCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEIDogV0NJRCA9ICVsZCwgU2V0VGlkICA9ICVseCwgRGVsZXRlVGlkID0gJWx4LlxuIiwgU2V0QXNpY1djaWQuV0NJRCwgU2V0QXNpY1djaWQuU2V0VGlkLCBTZXRBc2ljV2NpZC5EZWxldGVUaWQpKTsKLQkJCQkJCU1BQ1ZhbHVlID0gKHBBZC0+TWFjVGFiLkNvbnRlbnRbU2V0QXNpY1djaWQuV0NJRF0uQWRkclszXTw8MjQpKyhwQWQtPk1hY1RhYi5Db250ZW50W1NldEFzaWNXY2lkLldDSURdLkFkZHJbMl08PDE2KSsocEFkLT5NYWNUYWIuQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS5BZGRyWzFdPDw4KSsocEFkLT5NYWNUYWIuQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS5BZGRyWzBdKTsKLQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIxLU1BQ1ZhbHVlPSAleCxcbiIsIE1BQ1ZhbHVlKSk7Ci0JCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIE1BQ1ZhbHVlKTsKLQkJCQkJCS8vIFJlYWQgYml0bWFzawotCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQrNCwgJk1BQ1JWYWx1ZSk7Ci0JCQkJCQlpZiAoIFNldEFzaWNXY2lkLkRlbGV0ZVRpZCAhPSAweGZmZmZmZmZmKQotCQkJCQkJCU1BQ1JWYWx1ZSAmPSAoflNldEFzaWNXY2lkLkRlbGV0ZVRpZCk7Ci0JCQkJCQlpZiAoU2V0QXNpY1djaWQuU2V0VGlkICE9IDB4ZmZmZmZmZmYpCi0JCQkJCQkJTUFDUlZhbHVlIHw9IChTZXRBc2ljV2NpZC5TZXRUaWQpOwotCQkJCQkJTUFDUlZhbHVlICY9IDB4ZmZmZjAwMDA7Ci0KLQkJCQkJCU1BQ1ZhbHVlID0gKHBBZC0+TWFjVGFiLkNvbnRlbnRbU2V0QXNpY1djaWQuV0NJRF0uQWRkcls1XTw8OCkrcEFkLT5NYWNUYWIuQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS5BZGRyWzRdOwotCQkJCQkJTUFDVmFsdWUgfD0gTUFDUlZhbHVlOwotCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0KzQsIE1BQ1ZhbHVlKTsKLQotCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjItTUFDVmFsdWU9ICV4LFxuIiwgTUFDVmFsdWUpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSURfQ0lQSEVSOgotCQkJCQl7Ci0JCQkJCQlSVF9TRVRfQVNJQ19XQ0lEX0FUVFJJCVNldEFzaWNXY2lkQXR0cmk7Ci0JCQkJCQlVU0hPUlQJCW9mZnNldDsKLQkJCQkJCVVJTlQzMgkJTUFDUlZhbHVlID0gMDsKLQkJCQkJCVNIQVJFREtFWV9NT0RFX1NUUlVDIGNzcjE7Ci0JCQkJCQlTZXRBc2ljV2NpZEF0dHJpID0gKigoUFJUX1NFVF9BU0lDX1dDSURfQVRUUkkpKHBEYXRhKSk7Ci0KLQkJCQkJCWlmIChTZXRBc2ljV2NpZEF0dHJpLldDSUQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JCQkJCQkJcmV0dXJuOwotCi0JCQkJCQlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArICgoVUNIQVIpU2V0QXNpY1djaWRBdHRyaS5XQ0lEKSpIV19XQ0lEX0FUVFJJX1NJWkU7Ci0KLQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJDbWQgOiBDTURUSFJFQURfU0VUX0FTSUNfV0NJRF9DSVBIRVIgOiBXQ0lEID0gJWxkLCBDaXBoZXIgPSAlbHguXG4iLCBTZXRBc2ljV2NpZEF0dHJpLldDSUQsIFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyKSk7Ci0JCQkJCQkvLyBSZWFkIGJpdG1hc2sKLQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LCAmTUFDUlZhbHVlKTsKLQkJCQkJCU1BQ1JWYWx1ZSA9IDA7Ci0JCQkJCQlNQUNSVmFsdWUgfD0gKCgoVUNIQVIpU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIpIDw8IDEpOwotCi0JCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIE1BQ1JWYWx1ZSk7Ci0JCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMi1vZmZzZXQgPSAleCAsIE1BQ1ZhbHVlPSAleCxcbiIsIG9mZnNldCwgTUFDUlZhbHVlKSk7Ci0KLQkJCQkJCW9mZnNldCA9IFBBSVJXSVNFX0lWRUlWX1RBQkxFX0JBU0UgKyAoKFVDSEFSKVNldEFzaWNXY2lkQXR0cmkuV0NJRCkqSFdfSVZFSVZfRU5UUllfU0laRTsKLQkJCQkJCU1BQ1JWYWx1ZSA9IDA7Ci0JCQkJCQlpZiAoIChTZXRBc2ljV2NpZEF0dHJpLkNpcGhlciA8PSBDSVBIRVJfV0VQMTI4KSkKLQkJCQkJCQlNQUNSVmFsdWUgfD0gKCBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPDwgMzApOwotCQkJCQkJZWxzZQotCQkJCQkJCU1BQ1JWYWx1ZSB8PSAoMHgyMDAwMDAwMCk7Ci0JCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIE1BQ1JWYWx1ZSk7Ci0JCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMi1vZmZzZXQgPSAleCAsIE1BQ1ZhbHVlPSAleCxcbiIsIG9mZnNldCwgTUFDUlZhbHVlKSk7Ci0KLQkJCQkJCS8vCi0JCQkJCQkvLyBVcGRhdGUgY2lwaGVyIGFsZ29yaXRobS4gV1NUQSBhbHdheXMgdXNlIEJTUzAKLQkJCQkJCS8vCi0JCQkJCQkvLyBmb3IgYWRob2MgbW9kZSBvbmx5ICxiZWNhdXNlIHdlcCBzdGF0dXMgc2xvdyB0aGFuIGFkZCBrZXksIHdoZW4gdXNlIHplcm8gY29uZmlnCi0JCQkJCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MgKQorCQkJCQkJQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLAorCQkJCQkJCQkJICAgcEVudHJ5LT4KKwkJCQkJCQkJCSAgIGFwaWR4LAorCQkJCQkJCQkJICAgKHU4KQorCQkJCQkJCQkJICAgcEVudHJ5LT4KKwkJCQkJCQkJCSAgIEFpZCk7CisJCQkJCQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPD0KKwkJCQkJCSAgICAgTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkKKwkJCQkJCSAgICAmJiAocEVudHJ5LT5XZXBTdGF0dXMgPT0KKwkJCQkJCQlOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSkKIAkJCQkJCXsKLQkJCQkJCQlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRTsKKwkJCQkJCQl1MzIgdUlWID0gMTsKKwkJCQkJCQl1OCAqcHRyOwogCi0JCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsICZNQUNSVmFsdWUpOwotCQkJCQkJCU1BQ1JWYWx1ZSAmPSAofjB4ZSk7Ci0JCQkJCQkJTUFDUlZhbHVlIHw9ICgoKFVDSEFSKVNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyKSA8PCAxKTsKKwkJCQkJCQlwdHIgPSAodTggKikmIHVJVjsKKwkJCQkJCQkqKHB0ciArIDMpID0KKwkJCQkJCQkgICAgKHBBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgICAgRGVmYXVsdEtleUlkIDw8IDYpOworCQkJCQkJCUFzaWNVcGRhdGVXQ0lESVZFSVYocEFkLAorCQkJCQkJCQkJICAgIHBFbnRyeS0+CisJCQkJCQkJCQkgICAgQWlkLAorCQkJCQkJCQkJICAgIHVJViwKKwkJCQkJCQkJCSAgICAwKTsKKwkJCQkJCQlBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZQorCQkJCQkJCSAgICAocEFkLCBwRW50cnktPkFpZCwKKwkJCQkJCQkgICAgIEJTUzAsCisJCQkJCQkJICAgICBwQWQtPgorCQkJCQkJCSAgICAgU2hhcmVkS2V5W0JTUzBdCisJCQkJCQkJICAgICBbcEFkLT5TdGFDZmcuCisJCQkJCQkJICAgICAgRGVmYXVsdEtleUlkXS4KKwkJCQkJCQkgICAgIENpcGhlckFsZywgRkFMU0UpOworCQkJCQkJfSBlbHNlIGlmIChwRW50cnktPkF1dGhNb2RlID09CisJCQkJCQkJICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJCQkJCXsKKwkJCQkJCQl1MzIgdUlWID0gMTsKKwkJCQkJCQl1OCAqcHRyOwogCi0JCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LCBNQUNSVmFsdWUpOwotCi0JCQkJCQkJLy9VcGRhdGUgZ3JvdXAga2V5IGNpcGhlciwsYmVjYXVzZSB3ZXAgc3RhdHVzIHNsb3cgdGhhbiBhZGQga2V5LCB3aGVuIHVzZSB6ZXJvIGNvbmZpZwotCQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooMC8yKSwgJmNzcjEud29yZCk7Ci0KLQkJCQkJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gU2V0QXNpY1djaWRBdHRyaS5DaXBoZXI7Ci0JCQkJCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyOwotCi0JCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooMC8yKSwgY3NyMS53b3JkKTsKKwkJCQkJCQlwdHIgPSAodTggKikmIHVJVjsKKwkJCQkJCQkqKHB0ciArIDMpID0KKwkJCQkJCQkgICAgKHBBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgICAgRGVmYXVsdEtleUlkIDw8IDYpOworCQkJCQkJCUFzaWNVcGRhdGVXQ0lESVZFSVYocEFkLAorCQkJCQkJCQkJICAgIHBFbnRyeS0+CisJCQkJCQkJCQkgICAgQWlkLAorCQkJCQkJCQkJICAgIHVJViwKKwkJCQkJCQkJCSAgICAwKTsKKwkJCQkJCQlBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZQorCQkJCQkJCSAgICAocEFkLCBwRW50cnktPkFpZCwKKwkJCQkJCQkgICAgIEJTUzAsCisJCQkJCQkJICAgICBwQWQtPgorCQkJCQkJCSAgICAgU2hhcmVkS2V5W0JTUzBdCisJCQkJCQkJICAgICBbcEFkLT5TdGFDZmcuCisJCQkJCQkJICAgICAgRGVmYXVsdEtleUlkXS4KKwkJCQkJCQkgICAgIENpcGhlckFsZywgRkFMU0UpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvKiAqLworCQkJCQkJCS8qIE90aGVyIGNhc2UsIGRpc2FibGUgZW5naW5lLiAqLworCQkJCQkJCS8qIERvbid0IHdvcnJ5IFdQQSBrZXksIHdlIHdpbGwgYWRkIFdQQSBLZXkgYWZ0ZXIgNC1XYXkgaGFuZHNoYWtpbmcuICovCisJCQkJCQkJLyogKi8KKwkJCQkJCQl1MTYgb2Zmc2V0OworCQkJCQkJCW9mZnNldCA9CisJCQkJCQkJICAgIE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFCisJCQkJCQkJICAgICsKKwkJCQkJCQkgICAgKHBFbnRyeS0+QWlkICoKKwkJCQkJCQkgICAgIEhXX1dDSURfQVRUUklfU0laRSk7CisJCQkJCQkJLyogUlhfUEtFWV9NT0RFOjAgZm9yIG5vIHNlY3VyaXR5OyBSWF9LRVlfVEFCOjAgZm9yIHNoYXJlZCBrZXkgdGFibGU7IEJTU19JRFg6MCAqLworCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcgorCQkJCQkJCSAgICAocEFkLCBvZmZzZXQsIDApOwogCQkJCQkJfQogCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ01EVEhSRUFEX1NFVF9DTElFTlRfTUFDX0VOVFJZOgotCQkJCQl7Ci0JCQkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQkJCQkJCXBFbnRyeSA9IChNQUNfVEFCTEVfRU5UUlkgKilwRGF0YTsKIAotCQkJCQkJewotCQkJCQkJCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgcEVudHJ5LT5hcGlkeCwgKFVDSEFSKXBFbnRyeS0+QWlkKTsKLQkJCQkJCQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPD0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkgJiYgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpKQotCQkJCQkJCXsKLQkJCQkJCQkJVUlOVDMyIHVJViA9IDA7Ci0JCQkJCQkJCVBVQ0hBUiAgcHRyOworCQkJCQlBc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCBwRW50cnktPkFpZCwKKwkJCQkJCQkgICAgICBwRW50cnktPkFkZHIpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIlVwZGF0ZVJ4V0NJRFRhYmxlKCk6IEFpZD0lZCwgQWRkcj0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCFcbiIsCisJCQkJCQkgIHBFbnRyeS0+QWlkLCBwRW50cnktPkFkZHJbMF0sCisJCQkJCQkgIHBFbnRyeS0+QWRkclsxXSwKKwkJCQkJCSAgcEVudHJ5LT5BZGRyWzJdLAorCQkJCQkJICBwRW50cnktPkFkZHJbM10sCisJCQkJCQkgIHBFbnRyeS0+QWRkcls0XSwKKwkJCQkJCSAgcEVudHJ5LT5BZGRyWzVdKSk7CisJCQkJfQorCQkJCWJyZWFrOwogCi0JCQkJCQkJCXB0ciA9IChQVUNIQVIpICZ1SVY7Ci0JCQkJCQkJCSoocHRyICsgMykgPSAocEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkIDw8IDYpOwotCQkJCQkJCQlBc2ljVXBkYXRlV0NJRElWRUlWKHBBZCwgcEVudHJ5LT5BaWQsIHVJViwgMCk7Ci0JCQkJCQkJCUFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKHBBZCwgcEVudHJ5LT5BaWQsIEJTUzAsIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLCBGQUxTRSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQkJCQkJCQl7Ci0JCQkJCQkJCVVJTlQzMiB1SVYgPSAwOwotCQkJCQkJCQlQVUNIQVIgIHB0cjsKKy8qIGFkZCBieSBqb2hubGksIGZpeCAiaW5faW50ZXJydXB0IiBlcnJvciB3aGVuIGNhbGwgIk1hY1RhYmxlRGVsZXRlRW50cnkiIGluIFJ4IHRhc2tsZXQgKi8KKwkJCWNhc2UgQ01EVEhSRUFEX1VQREFURV9QUk9URUNUOgorCQkJCXsKKwkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwLAorCQkJCQkJCSAgKEFMTE5fU0VUUFJPVEVDVCksCisJCQkJCQkJICBUUlVFLCAwKTsKKwkJCQl9CisJCQkJYnJlYWs7CisvKiBlbmQgam9obmxpICovCiAKLQkJCQkJCQkJcHRyID0gKFBVQ0hBUikgJnVJVjsKLQkJCQkJCQkJKihwdHIgKyAzKSA9IChwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPDwgNik7Ci0JCQkJCQkJCUFzaWNVcGRhdGVXQ0lESVZFSVYocEFkLCBwRW50cnktPkFpZCwgdUlWLCAwKTsKLQkJCQkJCQkJQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUocEFkLCBwRW50cnktPkFpZCwgQlNTMCwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsIEZBTFNFKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJLy8KLQkJCQkJCQkJLy8gT3RoZXIgY2FzZSwgZGlzYWJsZSBlbmdpbmUuCi0JCQkJCQkJCS8vIERvbid0IHdvcnJ5IFdQQSBrZXksIHdlIHdpbGwgYWRkIFdQQSBLZXkgYWZ0ZXIgNC1XYXkgaGFuZHNoYWtpbmcuCi0JCQkJCQkJCS8vCi0JCQkJCQkJCVVTSE9SVCAgIG9mZnNldDsKLQkJCQkJCQkJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAocEVudHJ5LT5BaWQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOwotCQkJCQkJCQkvLyBSWF9QS0VZX01PREU6MCBmb3Igbm8gc2VjdXJpdHk7IFJYX0tFWV9UQUI6MCBmb3Igc2hhcmVkIGtleSB0YWJsZTsgQlNTX0lEWDowCi0JCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgMCk7Ci0JCQkJCQkJfQorCQkJY2FzZSBPSURfODAyXzExX0FERF9XRVA6CisJCQkJeworCQkJCQl1MzIgaTsKKwkJCQkJdTMyIEtleUlkeDsKKwkJCQkJc3RydWN0IHJ0X25kaXNfODAyXzExX3dlcCAqcFdlcEtleTsKKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIkNtZFRocmVhZDo6T0lEXzgwMl8xMV9BRERfV0VQICBcbiIpKTsKKworCQkJCQlwV2VwS2V5ID0gKHN0cnVjdCBydF9uZGlzXzgwMl8xMV93ZXAgKilwRGF0YTsKKwkJCQkJS2V5SWR4ID0gcFdlcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOworCisJCQkJCS8qIGl0IGlzIGEgc2hhcmVkIGtleSAqLworCQkJCQlpZiAoKEtleUlkeCA+PSA0KQorCQkJCQkgICAgfHwgKChwV2VwS2V5LT5LZXlMZW5ndGggIT0gNSkKKwkJCQkJCSYmIChwV2VwS2V5LT5LZXlMZW5ndGggIT0KKwkJCQkJCSAgICAxMykpKSB7CisJCQkJCQlOZGlzU3RhdHVzID0KKwkJCQkJCSAgICBORElTX1NUQVRVU19JTlZBTElEX0RBVEE7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkgKCJDbWRUaHJlYWQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgSU5WQUxJRF9EQVRBISFcbiIpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXU4IENpcGhlckFsZzsKKwkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uCisJCQkJCQkgICAgS2V5TGVuID0KKwkJCQkJCSAgICAodTgpcFdlcEtleS0+S2V5TGVuZ3RoOworCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT4KKwkJCQkJCQkgICAgICAgU2hhcmVkS2V5W0JTUzBdCisJCQkJCQkJICAgICAgIFtLZXlJZHhdLktleSwKKwkJCQkJCQkgICAgICAgJnBXZXBLZXktPgorCQkJCQkJCSAgICAgICBLZXlNYXRlcmlhbCwKKwkJCQkJCQkgICAgICAgcFdlcEtleS0+CisJCQkJCQkJICAgICAgIEtleUxlbmd0aCk7CisJCQkJCQlDaXBoZXJBbGcgPQorCQkJCQkJICAgIChwQWQtPgorCQkJCQkJICAgICBTaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS4KKwkJCQkJCSAgICAgS2V5TGVuID09CisJCQkJCQkgICAgIDUpID8gQ0lQSEVSX1dFUDY0IDoKKwkJCQkJCSAgICBDSVBIRVJfV0VQMTI4OworCisJCQkJCQkvKiAqLworCQkJCQkJLyogQ2hhbmdlIHRoZSBXRVAgY2lwaGVyIHRvIENLSVAgY2lwaGVyIGlmIENLSVAgS1Agb24uICovCisJCQkJCQkvKiBGdW5rIFVJIG9yIE1lZXRpbmdob3VzZSBVSSB3aWxsIGFkZCBja2lwIGtleSBmcm9tIHRoaXMgcGF0aC4gKi8KKwkJCQkJCS8qICovCisKKwkJCQkJCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSB7CisJCQkJCQkJcEFkLT5NYWNUYWIuCisJCQkJCQkJICAgIENvbnRlbnRbQlNTSURfV0NJRF0uCisJCQkJCQkJICAgIFBhaXJ3aXNlS2V5LgorCQkJCQkJCSAgICBDaXBoZXJBbGcgPQorCQkJCQkJCSAgICBwQWQtPgorCQkJCQkJCSAgICBTaGFyZWRLZXlbQlNTMF0KKwkJCQkJCQkgICAgW0tleUlkeF0uQ2lwaGVyQWxnOworCQkJCQkJCXBBZC0+TWFjVGFiLgorCQkJCQkJCSAgICBDb250ZW50W0JTU0lEX1dDSURdLgorCQkJCQkJCSAgICBQYWlyd2lzZUtleS5LZXlMZW4gPQorCQkJCQkJCSAgICBwQWQtPgorCQkJCQkJCSAgICBTaGFyZWRLZXlbQlNTMF0KKwkJCQkJCQkgICAgW0tleUlkeF0uS2V5TGVuOwogCQkJCQkJfQorCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS4KKwkJCQkJCSAgICBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQkJCQlpZiAocFdlcEtleS0+CisJCQkJCQkgICAgS2V5SW5kZXggJiAweDgwMDAwMDAwKSB7CisJCQkJCQkJLyogRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KSAqLworCQkJCQkJCXU4IElWRUlWWzhdOworCQkJCQkJCXUzMiBXQ0lEQXR0cmksIFZhbHVlOworCQkJCQkJCXUxNiBvZmZzZXQsIG9mZnNldDI7CisJCQkJCQkJTmRpc1plcm9NZW1vcnkoSVZFSVYsCisJCQkJCQkJCSAgICAgICA4KTsKKwkJCQkJCQlwQWQtPlN0YUNmZy4KKwkJCQkJCQkgICAgRGVmYXVsdEtleUlkID0KKwkJCQkJCQkgICAgKHU4KUtleUlkeDsKKwkJCQkJCQkvKiBBZGQgQlNTSUQgdG8gV0NUYWJsZS4gYmVjYXVzZSB0aGlzIGlzIFR4IHdlcCBrZXkuICovCisJCQkJCQkJLyogV0NJRCBBdHRyaWJ1dGUgVURGOjMsIEJTU0lkeDozLCBBbGc6MywgS2V5dGFibGU6MT1QQUlSV0lTRSBLRVksIEJTU0lkeCBpcyAwICovCisJCQkJCQkJV0NJREF0dHJpID0KKwkJCQkJCQkgICAgKENpcGhlckFsZyA8PCAxKSB8CisJCQkJCQkJICAgIFNIQVJFREtFWVRBQkxFOwogCi0JCQkJCQlBc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCBwRW50cnktPkFpZCwgcEVudHJ5LT5BZGRyKTsKLQkJCQkJCXByaW50aygiVXBkYXRlUnhXQ0lEVGFibGUoKTogQWlkPSVkLCBBZGRyPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IVxuIiwgcEVudHJ5LT5BaWQsCi0JCQkJCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sIHBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ01EVEhSRUFEX1VQREFURV9QUk9URUNUOgotCQkJCQl7Ci0JCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAsIChBTExOX1NFVFBST1RFQ1QpLCBUUlVFLCAwKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE9JRF84MDJfMTFfQUREX1dFUDoKLQkJCQkJewotCQkJCQkJVUlOVAlpOwotCQkJCQkJVUlOVDMyCUtleUlkeDsKLQkJCQkJCVBORElTXzgwMl8xMV9XRVAJcFdlcEtleTsKLQotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ21kVGhyZWFkOjpPSURfODAyXzExX0FERF9XRVAgIFxuIikpOwotCi0JCQkJCQlwV2VwS2V5ID0gKFBORElTXzgwMl8xMV9XRVApcERhdGE7Ci0JCQkJCQlLZXlJZHggPSBwV2VwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7Ci0KLQkJCQkJCS8vIGl0IGlzIGEgc2hhcmVkIGtleQotCQkJCQkJaWYgKChLZXlJZHggPj0gNCkgfHwgKChwV2VwS2V5LT5LZXlMZW5ndGggIT0gNSkgJiYgKHBXZXBLZXktPktleUxlbmd0aCAhPSAxMykpKQotCQkJCQkJewotCQkJCQkJCU5kaXNTdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0RBVEE7Ci0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ21kVGhyZWFkOjpPSURfODAyXzExX0FERF9XRVAsIElOVkFMSURfREFUQSEhXG4iKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJVUNIQVIgQ2lwaGVyQWxnOwotCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwV2VwS2V5LT5LZXlMZW5ndGg7Ci0JCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksICZwV2VwS2V5LT5LZXlNYXRlcmlhbCwgcFdlcEtleS0+S2V5TGVuZ3RoKTsKLQkJCQkJCQlDaXBoZXJBbGcgPSAocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPT0gNSk/IENJUEhFUl9XRVA2NCA6IENJUEhFUl9XRVAxMjg7Ci0KLQkJCQkJCQkvLwotCQkJCQkJCS8vIENoYW5nZSB0aGUgV0VQIGNpcGhlciB0byBDS0lQIGNpcGhlciBpZiBDS0lQIEtQIG9uLgotCQkJCQkJCS8vIEZ1bmsgVUkgb3IgTWVldGluZ2hvdXNlIFVJIHdpbGwgYWRkIGNraXAga2V5IGZyb20gdGhpcyBwYXRoLgotCQkJCQkJCS8vCi0KLQkJCQkJCQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQkJCQkJCSAJewotCQkJCQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnOwotCQkJCQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LktleUxlbiA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuOwotCQkJCQkJIAl9Ci0JCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCQkJCQkJaWYgKHBXZXBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKLQkJCQkJCQl7Ci0JCQkJCQkJCS8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKLQkJCQkJCQkJVUNIQVIJSVZFSVZbOF07Ci0JCQkJCQkJCVVJTlQzMglXQ0lEQXR0cmksIFZhbHVlOwotCQkJCQkJCQlVU0hPUlQJb2Zmc2V0LCBvZmZzZXQyOwotCQkJCQkJCQlOZGlzWmVyb01lbW9yeShJVkVJViwgOCk7Ci0JCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OwotCQkJCQkJCQkvLyBBZGQgQlNTSUQgdG8gV0NUYWJsZS4gYmVjYXVzZSB0aGlzIGlzIFR4IHdlcCBrZXkuCi0JCQkJCQkJCS8vIFdDSUQgQXR0cmlidXRlIFVERjozLCBCU1NJZHg6MywgQWxnOjMsIEtleXRhYmxlOjE9UEFJUldJU0UgS0VZLCBCU1NJZHggaXMgMAotCQkJCQkJCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKXxTSEFSRURLRVlUQUJMRTsKLQotCQkJCQkJCQlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChCU1NJRF9XQ0lEKiBIV19XQ0lEX0FUVFJJX1NJWkUpOwotCQkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Ci0JCQkJCQkJCS8vIDEuIElWL0VJVgotCQkJCQkJCQkvLyBTcGVjaWZ5IGtleSBpbmRleCB0byBmaW5kIHNoYXJlZCBrZXkuCi0JCQkJCQkJCUlWRUlWWzNdID0gKFVDSEFSKShLZXlJZHg8PCA2KTsJLy9XRVAgRWl2IGJpdCBvZmYuIGdyb3Vwa2V5IGluZGV4IGlzIG5vdCAwCi0JCQkJCQkJCW9mZnNldCA9IFBBSVJXSVNFX0lWRUlWX1RBQkxFX0JBU0UgKyAoQlNTME1jYXN0X1dDSUQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKLQkJCQkJCQkJb2Zmc2V0MiA9IFBBSVJXSVNFX0lWRUlWX1RBQkxFX0JBU0UgKyAoQlNTSURfV0NJRCogSFdfSVZFSVZfRU5UUllfU0laRSk7Ci0JCQkJCQkJCWZvciAoaT0wOyBpPDg7KQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlWYWx1ZSA9IElWRUlWW2ldOwotCQkJCQkJCQkJVmFsdWUgKz0gKElWRUlWW2krMV08PDgpOwotCQkJCQkJCQkJVmFsdWUgKz0gKElWRUlWW2krMl08PDE2KTsKLQkJCQkJCQkJCVZhbHVlICs9IChJVkVJVltpKzNdPDwyNCk7Ci0JCQkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQraSwgVmFsdWUpOwotCQkJCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0MitpLCBWYWx1ZSk7Ci0JCQkJCQkJCQlpKz00OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJLy8gMi4gV0NJRCBBdHRyaWJ1dGUgVURGOjMsIEJTU0lkeDozLCBBbGc6MywgS2V5dGFibGU6dXNlIHNoYXJlIGtleSwgQlNTSWR4IGlzIDAKLQkJCQkJCQkJV0NJREF0dHJpID0gKHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnPDwxKXxTSEFSRURLRVlUQUJMRTsKLQkJCQkJCQkJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoQlNTME1jYXN0X1dDSUQqIEhXX1dDSURfQVRUUklfU0laRSk7Ci0JCQkJCQkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCU1MwTWNhc3RfV0NJRCA6IG9mZnNldCA9ICV4LCBXQ0lEQXR0cmkgPSAleFxuIiwgb2Zmc2V0LCBXQ0lEQXR0cmkpKTsKLQkJCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOwotCisJCQkJCQkJb2Zmc2V0ID0KKwkJCQkJCQkgICAgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UKKwkJCQkJCQkgICAgKworCQkJCQkJCSAgICAoQlNTSURfV0NJRCAqCisJCQkJCQkJICAgICBIV19XQ0lEX0FUVFJJX1NJWkUpOworCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcgorCQkJCQkJCSAgICAocEFkLCBvZmZzZXQsCisJCQkJCQkJICAgICBXQ0lEQXR0cmkpOworCQkJCQkJCS8qIDEuIElWL0VJViAqLworCQkJCQkJCS8qIFNwZWNpZnkga2V5IGluZGV4IHRvIGZpbmQgc2hhcmVkIGtleS4gKi8KKwkJCQkJCQlJVkVJVlszXSA9ICh1OCkoS2V5SWR4IDw8IDYpOwkvKldFUCBFaXYgYml0IG9mZi4gZ3JvdXBrZXkgaW5kZXggaXMgbm90IDAgKi8KKwkJCQkJCQlvZmZzZXQgPQorCQkJCQkJCSAgICBQQUlSV0lTRV9JVkVJVl9UQUJMRV9CQVNFCisJCQkJCQkJICAgICsKKwkJCQkJCQkgICAgKEJTUzBNY2FzdF9XQ0lEICoKKwkJCQkJCQkgICAgIEhXX0lWRUlWX0VOVFJZX1NJWkUpOworCQkJCQkJCW9mZnNldDIgPQorCQkJCQkJCSAgICBQQUlSV0lTRV9JVkVJVl9UQUJMRV9CQVNFCisJCQkJCQkJICAgICsKKwkJCQkJCQkgICAgKEJTU0lEX1dDSUQgKgorCQkJCQkJCSAgICAgSFdfSVZFSVZfRU5UUllfU0laRSk7CisJCQkJCQkJZm9yIChpID0gMDsgaSA8IDg7KSB7CisJCQkJCQkJCVZhbHVlID0KKwkJCQkJCQkJICAgIElWRUlWW2ldOworCQkJCQkJCQlWYWx1ZSArPQorCQkJCQkJCQkgICAgKElWRUlWCisJCQkJCQkJCSAgICAgW2kgKworCQkJCQkJCQkgICAgICAxXSA8PCA4KTsKKwkJCQkJCQkJVmFsdWUgKz0KKwkJCQkJCQkJICAgIChJVkVJVgorCQkJCQkJCQkgICAgIFtpICsKKwkJCQkJCQkJICAgICAgMl0gPDwgMTYpOworCQkJCQkJCQlWYWx1ZSArPQorCQkJCQkJCQkgICAgKElWRUlWCisJCQkJCQkJCSAgICAgW2kgKworCQkJCQkJCQkgICAgICAzXSA8PCAyNCk7CisJCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcgorCQkJCQkJCQkgICAgKHBBZCwKKwkJCQkJCQkJICAgICBvZmZzZXQgKyBpLAorCQkJCQkJCQkgICAgIFZhbHVlKTsKKwkJCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyCisJCQkJCQkJCSAgICAocEFkLAorCQkJCQkJCQkgICAgIG9mZnNldDIgKworCQkJCQkJCQkgICAgIGksIFZhbHVlKTsKKwkJCQkJCQkJaSArPSA0OwogCQkJCQkJCX0KLQkJCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCAoVUNIQVIpS2V5SWR4LCBDaXBoZXJBbGcsIHBXZXBLZXktPktleU1hdGVyaWFsLCBOVUxMLCBOVUxMKTsKLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbWRUaHJlYWQ6Ok9JRF84MDJfMTFfQUREX1dFUCAoS2V5SWR4PSVkLCBMZW49JWQtYnl0ZSlcbiIsIEtleUlkeCwgcFdlcEtleS0+S2V5TGVuZ3RoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7CiAKLQkJCQljYXNlIENNRFRIUkVBRF84MDJfMTFfQ09VTlRFUl9NRUFTVVJFOgotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gQ29udHJvbCBUaHJlYWQgISEgRVJST1IgISEgVW5rbm93bihjbWRxZWxtdC0+Y29tbWFuZD0weCV4KSAhISBcbiIsIGNtZHFlbG10LT5jb21tYW5kKSk7Ci0JCQkJCWJyZWFrOworCQkJCQkJCS8qIDIuIFdDSUQgQXR0cmlidXRlIFVERjozLCBCU1NJZHg6MywgQWxnOjMsIEtleXRhYmxlOnVzZSBzaGFyZSBrZXksIEJTU0lkeCBpcyAwICovCisJCQkJCQkJV0NJREF0dHJpID0KKwkJCQkJCQkgICAgKHBBZC0+CisJCQkJCQkJICAgICBTaGFyZWRLZXlbQlNTMF0KKwkJCQkJCQkgICAgIFtLZXlJZHhdLgorCQkJCQkJCSAgICAgQ2lwaGVyQWxnIDw8IDEpIHwKKwkJCQkJCQkgICAgU0hBUkVES0VZVEFCTEU7CisJCQkJCQkJb2Zmc2V0ID0KKwkJCQkJCQkgICAgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UKKwkJCQkJCQkgICAgKworCQkJCQkJCSAgICAoQlNTME1jYXN0X1dDSUQgKgorCQkJCQkJCSAgICAgSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkJICgiQlNTME1jYXN0X1dDSUQgOiBvZmZzZXQgPSAleCwgV0NJREF0dHJpID0gJXhcbiIsCisJCQkJCQkJCSAgb2Zmc2V0LAorCQkJCQkJCQkgIFdDSURBdHRyaSkpOworCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcgorCQkJCQkJCSAgICAocEFkLCBvZmZzZXQsCisJCQkJCQkJICAgICBXQ0lEQXR0cmkpOworCisJCQkJCQl9CisJCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLAorCQkJCQkJCQkgICAgICAodTgpCisJCQkJCQkJCSAgICAgIEtleUlkeCwKKwkJCQkJCQkJICAgICAgQ2lwaGVyQWxnLAorCQkJCQkJCQkgICAgICBwV2VwS2V5LT4KKwkJCQkJCQkJICAgICAgS2V5TWF0ZXJpYWwsCisJCQkJCQkJCSAgICAgIE5VTEwsCisJCQkJCQkJCSAgICAgIE5VTEwpOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkJICgiQ21kVGhyZWFkOjpPSURfODAyXzExX0FERF9XRVAgKEtleUlkeD0lZCwgTGVuPSVkLWJ5dGUpXG4iLAorCQkJCQkJCSAgS2V5SWR4LAorCQkJCQkJCSAgcFdlcEtleS0+S2V5TGVuZ3RoKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ01EVEhSRUFEXzgwMl8xMV9DT1VOVEVSX01FQVNVUkU6CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ01EVEhSRUFEX1NFVF9HUk9VUF9LRVk6CisJCQkJV3BhU3RhR3JvdXBLZXlTZXR0aW5nKHBBZCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ01EVEhSRUFEX1NFVF9QQUlSV0lTRV9LRVk6CisJCQkJV3BhU3RhUGFpcndpc2VLZXlTZXR0aW5nKHBBZCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ01EVEhSRUFEX1NFVF9QU01fQklUOgorCQkJCXsKKwkJCQkJdTE2ICpwUHNtID0gKHUxNiAqKSBwRGF0YTsKKwkJCQkJTWxtZVNldFBzbUJpdChwQWQsICpwUHNtKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIENNRFRIUkVBRF9GT1JDRV9XQUtFX1VQOgorCQkJCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgKCItLT4gQ29udHJvbCBUaHJlYWQgISEgRVJST1IgISEgVW5rbm93bihjbWRxZWxtdC0+Y29tbWFuZD0weCV4KSAhISBcbiIsCisJCQkJCSAgY21kcWVsbXQtPmNvbW1hbmQpKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJfQogCi0JCWlmIChjbWRxZWxtdC0+Q21kRnJvbU5kaXMgPT0gVFJVRSkKLQkJewotCQkJCWlmIChjbWRxZWxtdC0+YnVmZmVyICE9IE5VTEwpCi0JCQkJCU5kaXNGcmVlTWVtb3J5KGNtZHFlbG10LT5idWZmZXIsIGNtZHFlbG10LT5idWZmZXJsZW5ndGgsIDApOwotCi0JCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7CisJCWlmIChjbWRxZWxtdC0+Q21kRnJvbU5kaXMgPT0gVFJVRSkgeworCQkJaWYgKGNtZHFlbG10LT5idWZmZXIgIT0gTlVMTCkKKwkJCQlvc19mcmVlX21lbShwQWQsIGNtZHFlbG10LT5idWZmZXIpOworCQkJb3NfZnJlZV9tZW0ocEFkLCBjbWRxZWxtdCk7CisJCX0gZWxzZSB7CisJCQlpZiAoKGNtZHFlbG10LT5idWZmZXIgIT0gTlVMTCkKKwkJCSAgICAmJiAoY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCAhPSAwKSkKKwkJCQlvc19mcmVlX21lbShwQWQsIGNtZHFlbG10LT5idWZmZXIpOworCQkJb3NfZnJlZV9tZW0ocEFkLCBjbWRxZWxtdCk7CiAJCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoKGNtZHFlbG10LT5idWZmZXIgIT0gTlVMTCkgJiYgKGNtZHFlbG10LT5idWZmZXJsZW5ndGggIT0gMCkpCi0JCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQtPmJ1ZmZlciwgY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCwgMCk7Ci0gICAgICAgICAgICB7Ci0JCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQsIHNpemVvZihDbWRRRWxtdCksIDApOwotCQkJfQotCQl9Ci0JfQkvKiBlbmQgb2Ygd2hpbGUgKi8KKwl9CQkJLyogZW5kIG9mIHdoaWxlICovCiB9CiAKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnQyODcwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0Mjg3MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzY3YmFmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnQyODcwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ODMgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfX1JUMjg3MF9IX18KLSNkZWZpbmUgX19SVDI4NzBfSF9fCi0KLS8vdXNiIGhlYWRlciBmaWxlcwotI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotCi0vKiBydG1wX2RlZi5oICovCi0vLwotI2RlZmluZSBCVUxLQUdHUkVfWklTRSAgICAgICAgICAxMDAKLSNkZWZpbmUgUlQyOFhYX0RSVkRBVEFfU0VUKF9hKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9zZXRfaW50ZmRhdGEoX2EsIHBBZCk7Ci0jZGVmaW5lIFJUMjhYWF9QVVRfREVWSUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2JfcHV0X2RldgotI2RlZmluZSBSVFVTQl9BTExPQ19VUkIoaXNvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX2FsbG9jX3VyYihpc28sIEdGUF9BVE9NSUMpCi0jZGVmaW5lIFJUVVNCX1NVQk1JVF9VUkIocFVyYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Jfc3VibWl0X3VyYihwVXJiLCBHRlBfQVRPTUlDKQotI2RlZmluZQlSVFVTQl9VUkJfQUxMT0NfQlVGRkVSKHBVc2JfRGV2LCBCdWZTaXplLCBwRG1hX2FkZHIpICAgICAgICAgICAgICAgdXNiX2J1ZmZlcl9hbGxvYyhwVXNiX0RldiwgQnVmU2l6ZSwgR0ZQX0FUT01JQywgcERtYV9hZGRyKQotI2RlZmluZQlSVFVTQl9VUkJfRlJFRV9CVUZGRVIocFVzYl9EZXYsIEJ1ZlNpemUsIHBUcmFuc2ZlckJ1ZiwgRG1hX2FkZHIpICAgdXNiX2J1ZmZlcl9mcmVlKHBVc2JfRGV2LCBCdWZTaXplLCBwVHJhbnNmZXJCdWYsIERtYV9hZGRyKQotCi0jZGVmaW5lIFJYQlVMS0FHR1JFX1pJU0UgICAgICAgIDEyCi0jZGVmaW5lIE1BWF9UWEJVTEtfTElNSVQgICAgICAgIChMT0NBTF9UWEJVRl9TSVpFKihCVUxLQUdHUkVfWklTRS0xKSkKLSNkZWZpbmUgTUFYX1RYQlVMS19TSVpFICAgICAgICAgKExPQ0FMX1RYQlVGX1NJWkUqQlVMS0FHR1JFX1pJU0UpCi0jZGVmaW5lIE1BWF9SWEJVTEtfU0laRSAgICAgICAgIChMT0NBTF9UWEJVRl9TSVpFKlJYQlVMS0FHR1JFX1pJU0UpCi0jZGVmaW5lIE1BWF9NTE1FX0hBTkRMRVJfTUVNT1JZIDIwCi0jZGVmaW5lCVJFVFJZX0xJTUlUICAgICAgICAgICAgIDEwCi0jZGVmaW5lIEJVRkZFUl9TSVpFCQkJCTI0MDAJLy8yMDQ4Ci0jZGVmaW5lCVRYX1JJTkcJCQkJCTB4YQotI2RlZmluZQlQUklPX1JJTkcJCQkJMHhjCi0KLQotLy8gRmxhZ3MgZm9yIEJ1bGtmbGFncyBjb250cm9sIGZvciBidWxrIG91dCBkYXRhCi0vLwotI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OVUxMCQkJCTB4MDAwMDAwMDEKLSNkZWZpbmUgZlJUVVNCX0JVTEtfT1VUX1JUUwkJCQkJCTB4MDAwMDAwMDIKLSNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX01MTUUJCQkJCTB4MDAwMDAwMDQKLQotI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwJCQkJMHgwMDAxMDAwMAotI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfMgkJCTB4MDAwMjAwMDAKLSNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzMJCQkweDAwMDQwMDAwCi0jZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF80CQkJMHgwMDA4MDAwMAotI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfNQkJCTB4MDAxMDAwMDAKLQotI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfUFNQT0xMCQkJCQkweDAwMDAwMDIwCi0jZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUcJCQkJMHgwMDAwMDA0MAotI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHXzIJCQkJMHgwMDAwMDA4MAotI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHXzMJCQkJMHgwMDAwMDEwMAotI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHXzQJCQkJMHgwMDAwMDIwMAotCi0jZGVmaW5lCUZSRUVfSFRUWF9SSU5HKF9wLCBfYiwgX3QpCQkJXAotewkJCQkJCQkJCQlcCi0JaWYgKChfdCktPkVOZXh0QnVsa091dFBvc2l0aW9uID09IChfdCktPkN1cldyaXRlUG9zaXRpb24pCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JCShfdCktPmJSaW5nRW1wdHkgPSBUUlVFOwkJCVwKLQl9CQkJCQkJCQkJCQkJCQkJCQlcCi0JLypOZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQoJihfcCktPlR4Q291bnQpOyAqL1wKLX0KLQotLy8KLS8vIFJYSU5GTyBhcHBlbmRzIGF0IHRoZSBlbmQgb2YgZWFjaCByeCBwYWNrZXQuCi0vLwotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWElORk9fU1RSVUMgewotCVVJTlQzMgkJQkE6MTsKLQlVSU5UMzIJCURBVEE6MTsKLQlVSU5UMzIJCU5VTExEQVRBOjE7Ci0JVUlOVDMyCQlGUkFHOjE7Ci0JVUlOVDMyCQlVMk06MTsgICAgICAgICAgICAgIC8vIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZQotCVVJTlQzMgkJTWNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgbXVsdGljYXN0IGZyYW1lCi0JVUlOVDMyCQlCY2FzdDoxOyAgICAgICAgICAgIC8vIDE6IHRoaXMgaXMgYSBicm9hZGNhc3QgZnJhbWUKLQlVSU5UMzIJCU15QnNzOjE7ICAJLy8gMTogdGhpcyBmcmFtZSBiZWxvbmdzIHRvIHRoZSBzYW1lIEJTU0lECi0JVUlOVDMyCQlDcmM6MTsgICAgICAgICAgICAgIC8vIDE6IENSQyBlcnJvcgotCVVJTlQzMgkJQ2lwaGVyRXJyOjI7ICAgICAgICAvLyAwOiBkZWNyeXB0aW9uIG9rYXksIDE6SUNWIGVycm9yLCAyOk1JQyBlcnJvciwgMzpLRVkgbm90IHZhbGlkCi0JVUlOVDMyCQlBTVNEVToxOwkJLy8gcnggd2l0aCA4MDIuMyBoZWFkZXIsIG5vdCA4MDIuMTEgaGVhZGVyLgotCVVJTlQzMgkJSFRDOjE7Ci0JVUlOVDMyCQlSU1NJOjE7Ci0JVUlOVDMyCQlMMlBBRDoxOwotCVVJTlQzMgkJQU1QRFU6MTsJCS8vIFRvIGJlIG1vdmVkCi0JVUlOVDMyCQlEZWNyeXB0ZWQ6MTsKLQlVSU5UMzIJCVBsY3BSc3NpbDoxOwotCVVJTlQzMgkJQ2lwaGVyQWxnOjE7Ci0JVUlOVDMyCQlMYXN0QU1TRFU6MTsKLQlVSU5UMzIJCVBsY3BTaWduYWw6MTI7Ci19CVJYSU5GT19TVFJVQywgKlBSWElORk9fU1RSVUMsIFJUMjhYWF9SWERfU1RSVUMsICpQUlQyOFhYX1JYRF9TVFJVQzsKLQotLy8KLS8vIFRYSU5GTwotLy8KLXR5cGVkZWYJc3RydWN0CV9UWElORk9fU1RSVUMgewotCS8vIFdvcmQJMAotCVVJTlQzMgkJVVNCRE1BVHhQa3RMZW46MTY7CS8vdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlZ2F0aW9uLCAgVG90YWwgYnl0ZSBjb3VudHMgb2YgYWxsIHN1Yi1mcmFtZS4KLQlVSU5UMzIJCXJzdjo4OwotCVVJTlQzMgkJV0lWOjE7CS8vIFdpcmVsZXNzIEluZm8gVmFsaWQuIDEgaWYgRHJpdmVyIGFscmVhZHkgZmlsbCBXSSwgIG8gaWYgRE1BIG5lZWRzIHRvIGNvcHkgV0kgdG8gY29ycmVjdHBvc2l0aW9uCi0JVUlOVDMyCQlRU0VMOjI7CS8vIHNlbGVjdCBvbi1jaGlwIEZJRk8gSUQgZm9yIDJuZC1zdGFnZSBvdXRwdXQgc2NoZWR1bGVyLjA6TUdNVCwgMTpIQ0NBIDI6RURDQQotCVVJTlQzMgkJU3dVc2VMYXN0Um91bmQ6MTsgLy8gU29mdHdhcmUgdXNlLgotCVVJTlQzMgkJcnN2MjoyOyAgLy8gU29mdHdhcmUgdXNlLgotCVVJTlQzMgkJVVNCRE1BTmV4dFZMRDoxOwkvL3VzZWQgT05MWSBpbiBVU0IgYnVsayBBZ2dyZWdhdGlvbiwgTmV4dFZhbGlkCi0JVUlOVDMyCQlVU0JETUFUeGJ1cnN0OjE7Ly91c2VkIE9OTFkgaW4gVVNCIGJ1bGsgQWdncmUuIEZvcmNlIFVTQiBETUEgdHJhbnNtaXQgZnJhbWUgZnJvbSBjdXJyZW50IHNlbGVjdGVkIGVuZHBvaW50Ci19CVRYSU5GT19TVFJVQywgKlBUWElORk9fU1RSVUM7Ci0KLSNkZWZpbmUgVFhJTkZPX1NJWkUJCQkJNAotI2RlZmluZSBSWElORk9fU0laRQkJCQk0Ci0jZGVmaW5lIFRYUEFERElOR19TSVpFCQkJMTEKLQotLy8KLS8vIE1hbmFnZW1lbnQgcmluZyBidWZmZXIgZm9ybWF0Ci0vLwotdHlwZWRlZglzdHJ1Y3QJX01HTVRfU1RSVUMJewotCUJPT0xFQU4JCVZhbGlkOwotCVBVQ0hBUgkJcEJ1ZmZlcjsKLQlVTE9ORwkJTGVuZ3RoOwotfQlNR01UX1NUUlVDLCAqUE1HTVRfU1RSVUM7Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gRUVQUk9NIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBvZmZzZXQsIHZhcikJCQkJCVwKLQlkbyB7CQkJCQkJCQkJCQkJCQlcCi0JCVJUVVNCUmVhZEVFUFJPTShwQWQsIG9mZnNldCwgKFBVQ0hBUikmKHZhciksIDIpOwkJXAotCQlpZighcEFkLT5iVXNlRWZ1c2UpCQkJCQkJCQkJCVwKLQkJdmFyID0gbGUyY3B1MTYodmFyKTsJCQkJCQkJCQlcCi0JfXdoaWxlKDApCi0KLSNkZWZpbmUgUlQyOHh4X0VFUFJPTV9XUklURTE2KHBBZCwgb2Zmc2V0LCB2YXIpCQkJCQlcCi0JZG97CQkJCQkJCQkJCQkJCQkJXAotCQlVU0hPUlQgX3RtcFZhcj12YXI7CQkJCQkJCQkJCVwKLQkJaWYoIXBBZC0+YlVzZUVmdXNlKQkJCQkJCQkJCVwKLQkJX3RtcFZhciA9IGNwdTJsZTE2KHZhcik7CQkJCQkJCQlcCi0JCVJUVVNCV3JpdGVFRVBST00ocEFkLCBvZmZzZXQsIChQVUNIQVIpJihfdG1wVmFyKSwgMik7CVwKLQl9d2hpbGUoMCkKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gVEFTSy9USFJFQUQgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVDI4WFhfVEFTS19USFJFQURfSU5JVChwQWQsIFN0YXR1cykJCVwKLQlTdGF0dXMgPSBDcmVhdGVUaHJlYWRzKG5ldF9kZXYpOwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIEZyaW13YXJlIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgUlQyOFhYX1dSSVRFX0ZJUk1XQVJFKF9wQWQsIF9wRndJbWFnZSwgX0Z3TGVuKQkJXAotCVJUVVNCRmlybXdhcmVXcml0ZShfcEFkLCBfcEZ3SW1hZ2UsIF9Gd0xlbikKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gVFggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVDI4WFhfU1RBUlRfREVRVUVVRShwQWQsIFF1ZUlkeCwgaXJxRmxhZ3MpCQkJCVwKLQkJCXsJCQkJCQkJCQkJCQkJXAotCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+RGVRdWV1ZUxvY2tbUXVlSWR4XSwgaXJxRmxhZ3MpOwkJXAotCQkJCWlmIChwQWQtPkRlUXVldWVSdW5uaW5nW1F1ZUlkeF0pCQkJCQkJXAotCQkJCXsJCQkJCQkJCQkJCQkJCVwKLQkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTtcCi0JCQkJCXByaW50aygiRGVRdWV1ZVJ1bm5pbmdbJWRdPSBUUlVFIVxuIiwgUXVlSWR4KTsJCVwKLQkJCQkJY29udGludWU7CQkJCQkJCQkJCQlcCi0JCQkJfQkJCQkJCQkJCQkJCQkJXAotCQkJCWVsc2UJCQkJCQkJCQkJCQkJXAotCQkJCXsJCQkJCQkJCQkJCQkJCVwKLQkJCQkJcEFkLT5EZVF1ZXVlUnVubmluZ1tRdWVJZHhdID0gVFJVRTsJCQkJCVwKLQkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTtcCi0JCQkJfQkJCQkJCQkJCQkJCQkJXAotCQkJfQotI2RlZmluZSBSVDI4WFhfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBpcnFGbGFncykJCQkJCQlcCi0JCQlkb3sJCQkJCQkJCQkJCQkJCQlcCi0JCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5EZVF1ZXVlTG9ja1tRdWVJZHhdLCBpcnFGbGFncyk7CQlcCi0JCQkJcEFkLT5EZVF1ZXVlUnVubmluZ1tRdWVJZHhdID0gRkFMU0U7CQkJCQlcCi0JCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTsJXAotCQkJfXdoaWxlKDApCi0KLQotI2RlZmluZQlSVDI4WFhfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLCBwVHhCbGssIGZyZWVOdW0sIHBQYWNrZXQpIFwKLQkJKFJUVVNCRnJlZURlc2NyaXB0b3JSZXF1ZXN0KHBBZCwgcFR4QmxrLT5RdWVJZHgsIChwVHhCbGstPlRvdGFsRnJhbWVMZW4gKyBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSkpID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0KLSNkZWZpbmUgUlQyOFhYX1JFTEVBU0VfREVTQ19SRVNPVVJDRShwQWQsIFF1ZUlkeCkJCQlcCi0JCWRve313aGlsZSgwKQotCi0jZGVmaW5lIE5FRURfUVVFVUVfQkFDS19GT1JfQUdHKF9wQWQsIF9RdWVJZHgsIF9mcmVlTnVtLCBfVHhGcmFtZVR5cGUpIAkJXAotCQkoKF9UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpICYmIChSVFVTQk5lZWRRdWV1ZUJhY2tGb3JBZ2coX3BBZCwgX1F1ZUlkeCkpKQotCi0KLQotI2RlZmluZSBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWAkJXAotCQkoZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwJXAotCQkgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCB8IFwKLQkJIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpCi0KLQotI2RlZmluZSBIQUxfV3JpdGVTdWJUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikJXAotCQkJUnRtcFVTQl9Xcml0ZVN1YlR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKQotCi0jZGVmaW5lIEhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKLQkJCVJ0bXBVU0JfV3JpdGVTaW5nbGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLGJJc0xhc3QsIHBGcmVlTnVtYmVyKQotCi0jZGVmaW5lIEhBTF9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCBwRnJlZU51bWJlcikgXAotCQkJUnRtcFVTQl9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCBwRnJlZU51bWJlcikKLQotI2RlZmluZSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssZnJhbWVOdW0sIHBGcmVlTnVtYmVyKQlcCi0JCQlSdG1wVVNCX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLGZyYW1lTnVtLCBwRnJlZU51bWJlcikKLQotI2RlZmluZSBIQUxfRmluYWxXcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIHRvdGFsTVBEVVNpemUsIFR4SWR4KQlcCi0JCQlSdG1wVVNCX0ZpbmFsV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCB0b3RhbE1QRFVTaXplLCBUeElkeCkKLQotI2RlZmluZSBIQUxfTGFzdFR4SWR4KHBBZCwgUXVlSWR4LFR4SWR4KSBcCi0JCQkvKlJ0bXBVU0JEYXRhTGFzdFR4SWR4KHBBZCwgUXVlSWR4LFR4SWR4KSovCi0KLSNkZWZpbmUgSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgUXVlSWR4KQlcCi0JCQlSdG1wVVNCRGF0YUtpY2tPdXQocEFkLCBwVHhCbGssIFF1ZUlkeCkKLQotCi0jZGVmaW5lIEhBTF9LaWNrT3V0TWdtdFR4KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1ZkxlbikJXAotCQkJUnRtcFVTQk1nbXRLaWNrT3V0KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1ZkxlbikKLQotI2RlZmluZSBIQUxfS2lja091dE51bGxGcmFtZVR4KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCVwKLQkJCVJ0bXBVU0JOdWxsRnJhbWVLaWNrT3V0KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCi0KLSNkZWZpbmUgUlRNUF9QS1RfVEFJTF9QQURESU5HIAkxMSAvLyAzKG1heCA0IGJ5dGUgcGFkZGluZykgKyA0IChsYXN0IHBhY2tldCBwYWRkaW5nKSArIDQgKE1heEJ1bGtPdXRzaXplIGFsaWduIHBhZGRpbmcpCi0KLWV4dGVybiBVQ0hBUiBFcFRvUXVldWVbNl07Ci0KLQotI2lmZGVmIFJUMjg3MAotI2RlZmluZSBHRVRfVFhSSU5HX0ZSRUVOTyhfcEFkLCBfUXVlSWR4KSAJKF9RdWVJZHgpIC8vKF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeFN3RnJlZUlkeCkKLSNkZWZpbmUgR0VUX01HTVRSSU5HX0ZSRUVOTyhfcEFkKSAJCQkoX3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgpCi0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gUlggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotLy8jZGVmaW5lIFJUMjhYWF9SWF9FUlJPUl9DSEVDSwkJCQlSVE1QQ2hlY2tSeFdJCi0KLSNkZWZpbmUgUlQyOFhYX1JWX0FMTF9CVUZfRU5EKGJCdWxrUmVjZWl2ZSkJCVwKLQkvKiBXZSByZXR1cm4gU1RBVFVTX01PUkVfUFJPQ0VTU0lOR19SRVFVSVJFRCBzbyB0aGF0IHRoZSBjb21wbGV0aW9uICovCVwKLQkvKiByb3V0aW5lIChJb2ZDb21wbGV0ZVJlcXVlc3QpIHdpbGwgc3RvcCB3b3JraW5nIG9uIHRoZSBpcnAuICovCQlcCi0JaWYgKGJCdWxrUmVjZWl2ZSA9PSBUUlVFKQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gQVNJQyBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8vIHJlc2V0IE1BQyBvZiBhIHN0YXRpb24gZW50cnkgdG8gMHhGRkZGRkZGRkZGRkYKLSNkZWZpbmUgUlQyOFhYX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCBXY2lkKQkJCQkJXAotCXsJUlRfU0VUX0FTSUNfV0NJRAlTZXRBc2ljV2NpZDsJCQkJCQlcCi0JCVNldEFzaWNXY2lkLldDSUQgPSBXY2lkOwkJCQkJCQkJXAotCQlTZXRBc2ljV2NpZC5TZXRUaWQgPSAweGZmZmZmZmZmOwkJCQkJCVwKLQkJU2V0QXNpY1djaWQuRGVsZXRlVGlkID0gMHhmZmZmZmZmZjsJCQkJCQlcCi0JCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSUQsIAlcCi0JCQkJJlNldEFzaWNXY2lkLCBzaXplb2YoUlRfU0VUX0FTSUNfV0NJRCkpOwl9Ci0KLS8vIGFkZCB0aGlzIGVudHJ5IGludG8gQVNJQyBSWCBXQ0lEIHNlYXJjaCB0YWJsZQotI2RlZmluZSBSVDI4WFhfU1RBX0VOVFJZX0FERChwQWQsIHBFbnRyeSkJCQkJCQkJXAotCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1NFVF9DTElFTlRfTUFDX0VOVFJZLCAJXAotCQkJCQkJCXBFbnRyeSwgc2l6ZW9mKE1BQ19UQUJMRV9FTlRSWSkpOwotCi0vLyByZW1vdmUgUGFpci13aXNlIGtleSBtYXRlcmlhbCBmcm9tIEFTSUMKLS8vIHlldCBpbXBsZW1lbnQKLSNkZWZpbmUgUlQyOFhYX1NUQV9FTlRSWV9LRVlfREVMKHBBZCwgQnNzSWR4LCBXY2lkKQotCi0vLyBhZGQgQ2xpZW50IHNlY3VyaXR5IGluZm9ybWF0aW9uIGludG8gQVNJQyBXQ0lEIHRhYmxlIGFuZCBJVkVJViB0YWJsZQotI2RlZmluZSBSVDI4WFhfU1RBX1NFQ1VSSVRZX0lORk9fQUREKHBBZCwgYXBpZHgsIEtleUlELCBwRW50cnkpCQkJCQkJXAotCXsJUlQyOFhYX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCBwRW50cnktPkFpZCk7CQkJCQkJCQlcCi0JCWlmIChwRW50cnktPkFpZCA+PSAxKSB7CQkJCQkJCQkJCQkJCQlcCi0JCQlSVF9TRVRfQVNJQ19XQ0lEX0FUVFJJCVNldEFzaWNXY2lkQXR0cmk7CQkJCQkJCQlcCi0JCQlTZXRBc2ljV2NpZEF0dHJpLldDSUQgPSBwRW50cnktPkFpZDsJCQkJCQkJCQlcCi0JCQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPD0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkgJiYJCQkJXAotCQkJCShwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSkJCQkJXAotCQkJewkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlTZXRBc2ljV2NpZEF0dHJpLkNpcGhlciA9IHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uQ2lwaGVyQWxnOwlcCi0JCQl9CQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJZWxzZSBpZiAocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQkJCQkJXAotCQkJewkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlTZXRBc2ljV2NpZEF0dHJpLkNpcGhlciA9IHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uQ2lwaGVyQWxnOwlcCi0JCQl9CQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJZWxzZSBTZXRBc2ljV2NpZEF0dHJpLkNpcGhlciA9IDA7CQkJCQkJCQkJCVwKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImFpZCBjaXBoZXIgPSAlbGRcbiIsU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIpKTsgICAgICAgXAotCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfU0VUX0FTSUNfV0NJRF9DSVBIRVIsIAkJCVwKLQkJCQkJCQkmU2V0QXNpY1djaWRBdHRyaSwgc2l6ZW9mKFJUX1NFVF9BU0lDX1dDSURfQVRUUkkpKTsgfSB9Ci0KLS8vIEluc2VydCB0aGUgQkEgYml0bWFwIHRvIEFTSUMgZm9yIHRoZSBXY2lkIGVudHJ5Ci0jZGVmaW5lIFJUMjhYWF9BRERfQkFfU0VTU0lPTl9UT19BU0lDKF9wQWQsIF9BaWQsIF9USUQpCQkJCQlcCi0JCWRvewkJCQkJCQkJCQkJCQkJCQlcCi0JCQlSVF9TRVRfQVNJQ19XQ0lECVNldEFzaWNXY2lkOwkJCQkJCQlcCi0JCQlTZXRBc2ljV2NpZC5XQ0lEID0gKF9BaWQpOwkJCQkJCQkJCVwKLQkJCVNldEFzaWNXY2lkLlNldFRpZCA9ICgweDEwMDAwPDwoX1RJRCkpOwkJCQkJCVwKLQkJCVNldEFzaWNXY2lkLkRlbGV0ZVRpZCA9IDB4ZmZmZmZmZmY7CQkJCQkJCVwKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKChfcEFkKSwgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSUQsICZTZXRBc2ljV2NpZCwgc2l6ZW9mKFJUX1NFVF9BU0lDX1dDSUQpKTsJXAotCQl9d2hpbGUoMCkKLQotLy8gUmVtb3ZlIHRoZSBCQSBiaXRtYXAgZnJvbSBBU0lDIGZvciB0aGUgV2NpZCBlbnRyeQotI2RlZmluZSBSVDI4WFhfREVMX0JBX1NFU1NJT05fRlJPTV9BU0lDKF9wQWQsIF9XY2lkLCBfVElEKQkJCQlcCi0JCWRvewkJCQkJCQkJCQkJCQkJCQlcCi0JCQlSVF9TRVRfQVNJQ19XQ0lECVNldEFzaWNXY2lkOwkJCQkJCQlcCi0JCQlTZXRBc2ljV2NpZC5XQ0lEID0gKF9XY2lkKTsJCQkJCQkJCQlcCi0JCQlTZXRBc2ljV2NpZC5TZXRUaWQgPSAoMHhmZmZmZmZmZik7CQkJCQkJCVwKLQkJCVNldEFzaWNXY2lkLkRlbGV0ZVRpZCA9ICgweDEwMDAwPDwoX1RJRCkgKTsJCQkJCVwKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKChfcEFkKSwgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSUQsICZTZXRBc2ljV2NpZCwgc2l6ZW9mKFJUX1NFVF9BU0lDX1dDSUQpKTsJXAotCQl9d2hpbGUoMCkKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBQQ0kvVVNCIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgUlQyOFhYX0hBTkRMRV9ERVZfQVNTSUdOKGhhbmRsZSwgZGV2X3ApCQkJXAotCSgoUE9TX0NPT0tJRSloYW5kbGUpLT5wVXNiX0RldiA9IGRldl9wOwotCi0vLyBubyB1c2UKLSNkZWZpbmUgUlQyOFhYX1VOTUFQKCkKLSNkZWZpbmUgUlQyOFhYX0lSUV9SRVFVRVNUKG5ldF9kZXYpCi0jZGVmaW5lIFJUMjhYWF9JUlFfUkVMRUFTRShuZXRfZGV2KQotI2RlZmluZSBSVDI4WFhfSVJRX0lOSVQocEFkKQotI2RlZmluZSBSVDI4WFhfSVJRX0VOQUJMRShwQWQpCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gTUxNRSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCi0jZGVmaW5lIFJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKQkJCVJUVVNCTWxtZVVwKHBBZCkKLQotI2RlZmluZSBSVDI4WFhfTUxNRV9QUkVfU0FOSVRZX0NIRUNLKHBBZCkJCQkJCQkJCVwKLQl7CWlmICgocEFkLT5Db21tb25DZmcuYkhhcmR3YXJlUmFkaW8gPT0gVFJVRSkgJiYgCQkJCQlcCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgJiYJCVwKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSkgewlcCi0JCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9DSEVDS19HUElPLCBOVUxMLCAwKTsgfSB9Ci0KLSNkZWZpbmUgUlQyOFhYX01MTUVfU1RBX1FVSUNLX1JTUF9XQUtFX1VQKHBBZCkJXAotCXsJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUUtFUklPRElDX0VYRUNVVCwgTlVMTCwgMCk7CVwKLQkJUlRVU0JNbG1lVXAocEFkKTsgfQotCi0jZGVmaW5lIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkKQlcCi0JCSAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFU0VUX0NPTkYsIDAsIE5VTEwpOwlcCi0JCSAgICAgICAgUlRVU0JNbG1lVXAocEFkKTsKLQotI2RlZmluZSBSVDI4WFhfSEFORExFX0NPVU5URVJfTUVBU1VSRShfcEFkLCBfcEVudHJ5KQkJXAotCXsJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQoX3BBZCwgQ01EVEhSRUFEXzgwMl8xMV9DT1VOVEVSX01FQVNVUkUsIF9wRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsJXAotCQlSVFVTQk1sbWVVcChfcEFkKTsJCQkJCQkJCQlcCi0JfQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIFBvd2VyIFNhdmUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVDI4WFhfUFNfUE9MTF9FTlFVRVVFKHBBZCkJCQkJCQlcCi0JewlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX1BTUE9MTCk7CVwKLQkJUlRVU0JLaWNrQnVsa091dChwQWQpOyB9Ci0KLSNkZWZpbmUgUlQyOHh4X0NISVBfTkFNRSAgICAgICAgICAgICJSVHh4NzAiCi0KLSNkZWZpbmUgVVNCX0NZQ19DRkcgICAgICAgICAgICAgICAgIDB4MDJhNAotI2RlZmluZSBTVEFUVVNfU1VDQ0VTUwkJCQkweDAwCi0jZGVmaW5lIFNUQVRVU19VTlNVQ0NFU1NGVUwgCQkweDAxCi0jZGVmaW5lIE5UX1NVQ0NFU1Moc3RhdHVzKQkJCSgoKHN0YXR1cykgPiAwKSA/ICgxKTooMCkpCi0jZGVmaW5lIEludGVybG9ja2VkSW5jcmVtZW50IAkgCWF0b21pY19pbmMKLSNkZWZpbmUgTmRpc0ludGVybG9ja2VkSW5jcmVtZW50IAlhdG9taWNfaW5jCi0jZGVmaW5lIEludGVybG9ja2VkRGVjcmVtZW50CQlhdG9taWNfZGVjCi0jZGVmaW5lIE5kaXNJbnRlcmxvY2tlZERlY3JlbWVudCAJYXRvbWljX2RlYwotI2RlZmluZSBJbnRlcmxvY2tlZEV4Y2hhbmdlCQkJYXRvbWljX3NldAotLy8jZGVmaW5lIE5kaXNNU2VuZENvbXBsZXRlCQkJUlRNUF9TZW5kQ29tcGxldGUKLSNkZWZpbmUgTmRpc01DYW5jZWxUaW1lcgkJCVJUTVBDYW5jZWxUaW1lcgotI2RlZmluZSBOZGlzQWxsb2NNZW1vcnkoX3B0ciwgX3NpemUsIF9mbGFnKQlcCi0JCQkJCQkJCQlkb3tfcHRyID0ga21hbGxvYygoX3NpemUpLChfZmxhZykpO313aGlsZSgwKQotI2RlZmluZSBOZGlzRnJlZU1lbW9yeShhLCBiLCBjKSAJa2ZyZWUoKGEpKQotI2RlZmluZSBOZGlzTVNsZWVwCQkJCQlSVE1QdXNlY0RlbGF5CQkvKiB1bml0OiBtaWNyb3NlY29uZCAqLwotCi0KLSNkZWZpbmUgVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VUCQkwCi0jZGVmaW5lIFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOCQkwCi0jZGVmaW5lIFVTQkRfU0hPUlRfVFJBTlNGRVJfT0sJCQkwCi0jZGVmaW5lIFBVUkIJCQlwdXJiYl90Ci0KLSNkZWZpbmUgUlRVU0JfRlJFRV9VUkIocFVyYikJdXNiX2ZyZWVfdXJiKHBVcmIpCi0KLS8vI3VuZGVmIE1sbWVBbGxvY2F0ZU1lbW9yeQotLy8jdW5kZWYgTWxtZUZyZWVNZW1vcnkKLQotdHlwZWRlZiBzdHJ1Y3QgdXNiX2RldmljZQkqIFBVU0JfREVWOwotCi0vKiBNQUNSTyBmb3IgbGludXggdXNiICovCi10eXBlZGVmIHN0cnVjdCB1cmIgKnB1cmJiX3Q7Ci10eXBlZGVmIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgZGV2Y3RybHJlcXVlc3Q7Ci0jZGVmaW5lIFBJUlAJCVBWT0lECi0jZGVmaW5lIFBNREwJCVBWT0lECi0jZGVmaW5lIE5ESVNfT0lECVVJTlQKLSNpZm5kZWYgVVNCX1NUX05PRVJST1IKLSNkZWZpbmUgVVNCX1NUX05PRVJST1IgICAgIDAKLSNlbmRpZgotCi0vLyB2ZW5kb3Itc3BlY2lmaWMgY29udHJvbCBvcGVyYXRpb25zCi0jZGVmaW5lIENPTlRST0xfVElNRU9VVF9KSUZGSUVTICggKDEwMCAqIEhaKSAvIDEwMDApCi0jZGVmaW5lIFVOTElOS19USU1FT1VUX01TCQkzCi0KLS8qIHVubGluayB1cmIJKi8KLSNkZWZpbmUgUlRVU0JfVU5MSU5LX1VSQihwVXJiKQkJdXNiX2tpbGxfdXJiKHBVcmIpCi0KLS8vIFByb3RvdHlwZXMgb2YgY29tcGxldGlvbiBmdW51Yy4KLVZPSUQgUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKHB1cmJiX3QgcHVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOwotVk9JRCBSVFVTQkJ1bGtPdXRNTE1FUGFja2V0Q29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7Ci1WT0lEIFJUVVNCQnVsa091dE51bGxGcmFtZUNvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOwotVk9JRCBSVFVTQkJ1bGtPdXRSVFNGcmFtZUNvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOwotVk9JRCBSVFVTQkJ1bGtPdXRQc1BvbGxDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKTsKLVZPSUQgUlRVU0JCdWxrUnhDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKTsKLQotI2RlZmluZSBSVFVTQk1sbWVVcChwQWQpCSAgICAgICAgXAotewkJCQkJCQkJICAgIFwKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CVwKLQlpZiAocGlkX25yKHBPYmotPk1MTUVUaHJfcGlkKSA+IDApIFwKLSAgICAgICAgdXAoJihwQWQtPm1sbWVfc2VtYXBob3JlKSk7IFwKLX0KLQotI2RlZmluZSBSVFVTQkNNRFVwKHBBZCkJICAgICAgICAgICAgICAgIFwKLXsJCQkJCQkJCQkgICAgXAotCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsJXAotCWlmIChwaWRfbnIocE9iai0+UlRVU0JDbWRUaHJfcGlkKSA+IDApIFwKLQkgICAgdXAoJihwQWQtPlJUVVNCQ21kX3NlbWFwaG9yZSkpOyBcCi19Ci0KLXN0YXRpYyBpbmxpbmUgTkRJU19TVEFUVVMgUlRNUEFsbG9jYXRlTWVtb3J5KAotCU9VVCBQVk9JRCAqcHRyLAotCUlOIHNpemVfdCBzaXplKQotewotCSpwdHIgPSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwotCWlmKCpwdHIpCi0JCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotCWVsc2UKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLX0KLQotLyogcnRtcC5oICovCi0jZGVmaW5lCUJFQUNPTl9SSU5HX1NJWkUgICAgICAgICAgICAgICAgMgotI2RlZmluZSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUICAgICAgIDB4NDAKLSNkZWZpbmUgREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOICAgICAgICAweGMwCi0jZGVmaW5lIElOVEVSRkFDRV9WRU5ET1JfUkVRVUVTVF9PVVQgICAgMHg0MQotI2RlZmluZSBJTlRFUkZBQ0VfVkVORE9SX1JFUVVFU1RfSU4gICAgIDB4YzEKLSNkZWZpbmUgTUdNVFBJUEVJRFgJCQkJCQkwCS8vIEVQNiBpcyBoaWdoZXN0IHByaW9yaXR5Ci0KLSNkZWZpbmUgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcJCQkJMHg4MAotCi0jZGVmaW5lIFJUVVNCX1NFVF9CVUxLX0ZMQUcoX00sIF9GKQkJCQkoKF9NKS0+QnVsa0ZsYWdzIHw9IChfRikpCi0jZGVmaW5lIFJUVVNCX0NMRUFSX0JVTEtfRkxBRyhfTSwgX0YpCQkJKChfTSktPkJ1bGtGbGFncyAmPSB+KF9GKSkKLSNkZWZpbmUgUlRVU0JfVEVTVF9CVUxLX0ZMQUcoX00sIF9GKQkJCSgoKF9NKS0+QnVsa0ZsYWdzICYgKF9GKSkgIT0gMCkKLQotI2RlZmluZSBFbnF1ZXVlQ21kKGNtZHEsIGNtZHFlbG10KQkJXAotewkJCQkJCQkJCQlcCi0JaWYgKGNtZHEtPnNpemUgPT0gMCkJCQkJXAotCQljbWRxLT5oZWFkID0gY21kcWVsbXQ7CQkJXAotCWVsc2UJCQkJCQkJCVwKLQkJY21kcS0+dGFpbC0+bmV4dCA9IGNtZHFlbG10OwlcCi0JY21kcS0+dGFpbCA9IGNtZHFlbG10OwkJCQlcCi0JY21kcWVsbXQtPm5leHQgPSBOVUxMOwkJCQlcCi0JY21kcS0+c2l6ZSsrOwkJCQkJCVwKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgICBfUlRfU0VUX0FTSUNfV0NJRCB7Ci0JVUxPTkcgV0NJRDsgICAgICAgICAgLy8gbWVjaGFuaXNtIGZvciByZWtleWluZzogMDpkaXNhYmxlLCAxOiB0aW1lLWJhc2VkLCAyOiBwYWNrZXQtYmFzZWQKLQlVTE9ORyBTZXRUaWQ7ICAgICAgICAvLyB0aW1lLWJhc2VkOiBzZWNvbmRzLCBwYWNrZXQtYmFzZWQ6IGtpbG8tcGFja2V0cwotCVVMT05HIERlbGV0ZVRpZDsgICAgICAgIC8vIHRpbWUtYmFzZWQ6IHNlY29uZHMsIHBhY2tldC1iYXNlZDoga2lsby1wYWNrZXRzCi0JVUNIQVIgQWRkcltNQUNfQUREUl9MRU5dOwkvLyBhdm9pZCBpbiBpbnRlcnJ1cHQgd2hlbiB3cml0ZSBrZXkKLX0gUlRfU0VUX0FTSUNfV0NJRCwqUFJUX1NFVF9BU0lDX1dDSUQ7Ci0KLXR5cGVkZWYgc3RydWN0ICAgX1JUX1NFVF9BU0lDX1dDSURfQVRUUkkgewotCVVMT05HCVdDSUQ7ICAgICAgICAgIC8vIG1lY2hhbmlzbSBmb3IgcmVrZXlpbmc6IDA6ZGlzYWJsZSwgMTogdGltZS1iYXNlZCwgMjogcGFja2V0LWJhc2VkCi0JVUxPTkcJQ2lwaGVyOyAgICAgICAgLy8gQVNJQyBDaXBoZXIgZGVmaW5pdGlvbgotCVVDSEFSCUFkZHJbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKLX0gUlRfU0VUX0FTSUNfV0NJRF9BVFRSSSwqUFJUX1NFVF9BU0lDX1dDSURfQVRUUkk7Ci0KLXR5cGVkZWYgc3RydWN0IF9NTE1FX01FTU9SWV9TVFJVQ1QgewotCVBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NWYTsgICAgLy9Qb2ludGVyIHRvIHRoZSBiYXNlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeQotCXN0cnVjdCBfTUxNRV9NRU1PUllfU1RSVUNUICAgICAgKk5leHQ7ICAgICAgLy9Qb2ludGVyIHRvIHRoZSBuZXh0IHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeQotfSAgIE1MTUVfTUVNT1JZX1NUUlVDVCwgKlBNTE1FX01FTU9SWV9TVFJVQ1Q7Ci0KLXR5cGVkZWYgc3RydWN0ICBfTUxNRV9NRU1PUllfSEFORExFUiB7Ci0JQk9PTEVBTiAgICAgICAgICAgICAgICAgTWVtUnVubmluZzsgICAgICAgICAvL1RoZSBmbGFnIG9mIHRoZSBNbG1lIG1lbW9yeSBoYW5kbGVyJ3Mgc3RhdHVzCi0JVUlOVCAgICAgICAgICAgICAgICAgICAgTWVtb3J5Q291bnQ7ICAgICAgICAvL1RvdGFsIG5vbnBhZ2VkIHN5c3RlbS1zcGFjZSBtZW1vcnkgbm90IHNpemUKLQlVSU5UICAgICAgICAgICAgICAgICAgICBJblVzZUNvdW50OyAgICAgICAgIC8vTm9ucGFnZWQgc3lzdGVtLXNwYWNlIG1lbW9yeSBpbiB1c2VkIGNvdW50cwotCVVJTlQgICAgICAgICAgICAgICAgICAgIFVuVXNlQ291bnQ7ICAgICAgICAgLy9Ob25wYWdlZCBzeXN0ZW0tc3BhY2UgbWVtb3J5IGF2YWlsYWJsZSBjb3VudHMKLQlJTlQgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdDb3VudDsgICAgICAgLy9Ob25wYWdlZCBzeXN0ZW0tc3BhY2UgbWVtb3J5IGZvciBmcmVlIGNvdW50cwotCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBJblVzZUhlYWQ7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBmaXJzdCBub25wYWVkIG1lbW9yeSBub3QgdXNlZAotCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBJblVzZVRhaWw7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBsYXN0IG5vbnBhZ2VkIG1lbW9yeSBub3QgdXNlZAotCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBVblVzZUhlYWQ7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBmaXJzdCBub25wYWdlZCBtZW1vcnkgaW4gdXNlZAotCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBVblVzZVRhaWw7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBsYXN0IG5vbnBhZ2VkIG1lbW9yeSBpbiB1c2VkCi0JUFVMT05HICAgICAgICAgICAgICAgICAgTWVtRnJlZVBlbmRpbmdbTUFYX01MTUVfSEFORExFUl9NRU1PUlldOyAgIC8vYW4gYXJyYXkgdG8ga2VlcCBwZW5kaW5nIGZyZWUtbWVtb3J5J3MgcG9pbnRlciAoMzJiaXRzKQotfSAgIE1MTUVfTUVNT1JZX0hBTkRMRVIsICpQTUxNRV9NRU1PUllfSEFORExFUjsKLQotdHlwZWRlZglzdHJ1Y3QgX0NtZFFFbG10CXsKLQlVSU5UCQkJCWNvbW1hbmQ7Ci0JUFZPSUQJCQkJYnVmZmVyOwotCVVMT05HCQkJCWJ1ZmZlcmxlbmd0aDsKLQlCT09MRUFOCQkJCUNtZEZyb21OZGlzOwotCUJPT0xFQU4JCQkJU2V0T3BlcmF0aW9uOwotCXN0cnVjdCBfQ21kUUVsbXQJKm5leHQ7Ci19CUNtZFFFbG10LCAqUENtZFFFbG10OwotCi10eXBlZGVmCXN0cnVjdAlfQ21kUQl7Ci0JVUlOVAkJc2l6ZTsKLQlDbWRRRWxtdAkqaGVhZDsKLQlDbWRRRWxtdAkqdGFpbDsKLQlVSU5UMzIJCUNtZFFTdGF0ZTsKLX1DbWRRLCAqUENtZFE7Ci0KLS8qIG9pZC5oICovCi0vLyBDaXBoZXIgc3VpdGUgdHlwZSBmb3IgbWl4ZWQgbW9kZSBncm91cCBjaXBoZXIsIFA4MDIuMTFpLTIwMDQKLXR5cGVkZWYgZW51bSBfUlRfODAyXzExX0NJUEhFUl9TVUlURV9UWVBFIHsKLQlDaXBoZXJfVHlwZV9OT05FLAotCUNpcGhlcl9UeXBlX1dFUDQwLAotCUNpcGhlcl9UeXBlX1RLSVAsCi0JQ2lwaGVyX1R5cGVfUlNWRCwKLQlDaXBoZXJfVHlwZV9DQ01QLAotCUNpcGhlcl9UeXBlX1dFUDEwNAotfSBSVF84MDJfMTFfQ0lQSEVSX1NVSVRFX1RZUEUsICpQUlRfODAyXzExX0NJUEhFUl9TVUlURV9UWVBFOwotCi0vL0NNRFRIUkVBRF9NVUxUSV9SRUFEX01BQwotLy9DTURUSFJFQURfTVVMVElfV1JJVEVfTUFDCi0vL0NNRFRIUkVBRF9WRU5ET1JfRUVQUk9NX1JFQUQKLS8vQ01EVEhSRUFEX1ZFTkRPUl9FRVBST01fV1JJVEUKLXR5cGVkZWYJc3RydWN0CV9DTURIYW5kbGVyX1RMVgl7Ci0JVVNIT1JUCQlPZmZzZXQ7Ci0JVVNIT1JUCQlMZW5ndGg7Ci0JVUNIQVIJCURhdGFGaXJzdDsKLX0JQ01ESGFuZGxlcl9UTFYsICpQQ01ESGFuZGxlcl9UTFY7Ci0KLS8vIE5ldyBmb3IgTWVldGluZ0hvdXNlIEFwaSBzdXBwb3J0Ci0jZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDEwMQkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9VTlBMVUcgICAgICAgICAgICAgICAgICAgICAweDBENzMwMTAyCS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1NXSVRDSF9GVU5DVElPTiAgICAgICAgICAgIDB4MEQ3MzAxMDMJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9NVUxUSV9XUklURV9NQUMgICAgICAgICAgICAgICAgICAgMHgwRDczMDEwNwkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX01VTFRJX1JFQURfTUFDICAgICAgICAgICAgICAgICAgICAweDBENzMwMTA4CS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfVkVORE9SX0VFUFJPTV9XUklURSAgICAgICAgICAgICAgIDB4MEQ3MzAxMEEJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfRUVQUk9NX1JFQUQgICAgICAgICAgICAgICAgMHgwRDczMDEwQgkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9FTlRFUl9URVNUTU9ERSAgICAgICAgICAgICAweDBENzMwMTBDCS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfVkVORE9SX0VYSVRfVEVTVE1PREUgICAgICAgICAgICAgIDB4MEQ3MzAxMEQJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfV1JJVEVfQkJQICAgICAgICAgICAgICAgICAgMHgwRDczMDExOQkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9SRUFEX0JCUCAgICAgICAgICAgICAgICAgICAweDBENzMwMTE4CS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1dSSVRFX1JGICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMUEJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfRkxJUF9JUSAgICAgICAgICAgICAgICAgICAgMHgwRDczMDExRAkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUICAgICAgICAgICAgICAgICAgICAweDBENzMwMjEwCS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfUkVTRVRfQlVMS19JTiAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTEJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9TRVRfUFNNX0JJVF9TQVZFICAgICAgICAgICAgICAgICAgMHgwRDczMDIxMgkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1NFVF9SQURJTyAgICAgICAgICAgICAgICAgICAgICAgICAweDBENzMwMjE0CS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfVVBEQVRFX1RYX1JBVEUgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTYJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF84MDJfMTFfQUREX0tFWV9XRVAgICAgICAgICAgICAgICAgMHgwRDczMDIxOAkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1JFU0VUX0ZST01fRVJST1IgICAgICAgICAgICAgICAgICAweDBENzMwMjFBCS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfTElOS19ET1dOICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMUIJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9SRVNFVF9GUk9NX05ESVMgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxQwkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX0NIRUNLX0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAweDBENzMwMjE1CS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfRk9SQ0VfV0FLRV9VUCAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMjIJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9TRVRfQlcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIyNQkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSUQgICAgICAgICAgICAgICAgICAgICAweDBENzMwMjI2CS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfU0VUX0FTSUNfV0NJRF9DSVBIRVIgICAgICAgICAgICAgIDB4MEQ3MzAyMjcJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9RS0VSSU9ESUNfRVhFQ1VUICAgICAgICAgICAgICAgICAgMHgwRDczMDIzRAkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1NFVF9DTElFTlRfTUFDX0VOVFJZICAgICAgICAgICAgICAweDBENzMwMjNFCS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfODAyXzExX1FVRVJZX0hBUkRXQVJFX1JFR0lTVEVSICAgIDB4MEQ3MTAxMDUJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF84MDJfMTFfU0VUX1BIWV9NT0RFICAgICAgICAgICAgICAgMHgwRDc5MDEwQwkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9TRVRfU1RBX0NPTkZJRyAgICAgICAgICAgICAweDBENzkwMTExCS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfODAyXzExX1NFVF9QUkVBTUJMRSAgICAgICAgICAgICAgIDB4MEQ3OTAxMDEJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF84MDJfMTFfQ09VTlRFUl9NRUFTVVJFCQkJMHgwRDc5MDEwMgkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1VQREFURV9QUk9URUNUCQkJCQkweDBENzkwMTAzCS8vIGNtZAotCi0jZGVmaW5lIFdQQTFBS01CSVQJICAgIDB4MDEKLSNkZWZpbmUgV1BBMkFLTUJJVAkgICAgMHgwMgotI2RlZmluZSBXUEExUFNLQUtNQklUICAgMHgwNAotI2RlZmluZSBXUEEyUFNLQUtNQklUICAgMHgwOAotI2RlZmluZSBUS0lQQklUICAgICAgICAgMHgwMQotI2RlZmluZSBDQ01QQklUICAgICAgICAgMHgwMgotCi0KLSNkZWZpbmUgUlQyOFhYX1NUQV9GT1JDRV9XQUtFVVAocEFkLCBiRnJvbVR4KSBcCi0gICAgUlQyOHh4VXNiU3RhQXNpY0ZvcmNlV2FrZXVwKHBBZCwgYkZyb21UeCk7Ci0KLSNkZWZpbmUgUlQyOFhYX1NUQV9TTEVFUF9USEVOX0FVVE9fV0FLRVVQKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCkgXAotICAgIFJUMjh4eFVzYlN0YUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7Ci0KLSNkZWZpbmUgUlQyOFhYX01MTUVfUkFESU9fT04ocEFkKSBcCi0gICAgUlQyOHh4VXNiTWxtZVJhZGlvT24ocEFkKTsKLQotI2RlZmluZSBSVDI4WFhfTUxNRV9SQURJT19PRkYocEFkKSBcCi0gICAgUlQyOHh4VXNiTWxtZVJhZGlvT0ZGKHBBZCk7Ci0KLSNlbmRpZiAvL19fUlQyODcwX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUwMmQ0YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfdXNiLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uL3J0Mjg2MC9ydF91c2IuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvdXNiX21haW5fZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3VzYl9tYWluX2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNjNiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3VzYl9tYWluX2Rldi5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi9ydDI4NjAvdXNiX21haW5fZGV2LmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDcwL2Zpcm13YXJlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDcwL2Zpcm13YXJlLmgKaW5kZXggYjA3NzgzZS4uNWNmOWNiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA3MC9maXJtd2FyZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwNzAvZmlybXdhcmUuaApAQCAtNDMsNyArNDMsNyBAQAogLyogQVVUTyBHRU4gUExFQVNFIERPIE5PVCBNT0RJRlkgSVQgKi8KIAogCi1VQ0hBUiBGaXJtd2FyZUltYWdlIFtdID0gewordTggRmlybXdhcmVJbWFnZV8yODcwIFtdID0gewogMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgxMCwgMHgyOCwgMHgwMiwgMHgxMCwgMHgzMiwgMHgwMiwgMHgxMCwgMHg3OCwgMHgwMiwgMHgxMiwgMHg2NywgMHgwMiwKIDB4MTIsIDB4NjgsIDB4MDIsIDB4MTIsIDB4ODcsIDB4MDIsIDB4MTIsIDB4OGMsIDB4MTIsIDB4MTIsIDB4ODgsIDB4MjIsIDB4MDIsIDB4MTYsIDB4NDksIDB4MDIsCiAweDE3LCAweDFmLCAweDAyLCAweDEzLCAweDc3LCAweDAyLCAweDEyLCAweDhkLCAweDMwLCAweDA1LCAweDA2LCAweDIwLCAweDBkLCAweDAzLCAweDEyLCAweDE3LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA3MC9tZDQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwNzAvbWQ0LmgKaW5kZXggZjFlNWI1Mi4uYTljYzdiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA3MC9tZDQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDcwL21kNC5oCkBAIC0zMCwxMyArMzAsMTMgQEAKIAogLyogTUQ0IGNvbnRleHQuICovCiB0eXBlZGVmCXN0cnVjdAlfTUQ0X0NUWF8JewotCVVMT05HCXN0YXRlWzRdOyAgICAgICAgLyogc3RhdGUgKEFCQ0QpICovCi0JVUxPTkcJY291bnRbMl07ICAgICAgICAvKiBudW1iZXIgb2YgYml0cywgbW9kdWxvIDJeNjQgKGxzYiBmaXJzdCkgKi8KLQlVQ0hBUglidWZmZXJbNjRdOyAgICAgIC8qIGlucHV0IGJ1ZmZlciAqLworCXVuc2lnbmVkIGxvbmcJc3RhdGVbNF07ICAgICAgICAvKiBzdGF0ZSAoQUJDRCkgKi8KKwl1bnNpZ25lZCBsb25nCWNvdW50WzJdOyAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMsIG1vZHVsbyAyXjY0IChsc2IgZmlyc3QpICovCisJdTgJYnVmZmVyWzY0XTsgICAgICAvKiBpbnB1dCBidWZmZXIgKi8KIH0JTUQ0X0NUWDsKIAotVk9JRCBNRDRJbml0IChNRDRfQ1RYICopOwotVk9JRCBNRDRVcGRhdGUgKE1ENF9DVFggKiwgUFVDSEFSLCBVSU5UKTsKLVZPSUQgTUQ0RmluYWwgKFVDSEFSIFsxNl0sIE1ENF9DVFggKik7Cit2b2lkIE1ENEluaXQgKE1ENF9DVFggKik7Cit2b2lkIE1ENFVwZGF0ZSAoTUQ0X0NUWCAqLCB1OCAqLCBVSU5UKTsKK3ZvaWQgTUQ0RmluYWwgKHU4IFsxNl0sIE1ENF9DVFggKik7CiAKICNlbmRpZiAvL19fTUQ0X0hfXwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzZjc0NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWNvbmZpZyBSVDMwOTAKLQl0cmlzdGF0ZSAiUmFsaW5rIDMwOTAgd2lyZWxlc3Mgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBDSSAmJiBYODYgJiYgV0xBTgotCS0tLWhlbHAtLS0KLQkgIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGRyaXZlciBmb3IgdGhlIFJhbGluayAzMDkwIHdpcmVsZXNzIGNoaXAuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1NDkxYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotb2JqLSQoQ09ORklHX1JUMzA5MCkJKz0gcnQzMDkwc3RhLm8KLQotaW5jbHVkZSBkcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbmZpZy5tawotCi1ydDMwOTBzdGEtb2JqcyA6PSBcCi0JY29tbW9uL2NyeXB0X21kNS5vIFwKLQljb21tb24vY3J5cHRfc2hhMi5vIFwKLQljb21tb24vY3J5cHRfaG1hYy5vIFwKLQljb21tb24vbWxtZS5vIFwKLQljb21tb24vY21tX3dlcC5vIFwKLQljb21tb24vYWN0aW9uLm8gXAotCWNvbW1vbi9jbW1fZGF0YS5vIFwKLQljb21tb24vcnRtcF9pbml0Lm8gXAotCWNvbW1vbi9jbW1fdGtpcC5vIFwKLQljb21tb24vY21tX2Flcy5vIFwKLQljb21tb24vY21tX3N5bmMubyBcCi0JY29tbW9uL2VlcHJvbS5vIFwKLQljb21tb24vY21tX3Nhbml0eS5vIFwKLQljb21tb24vY21tX2luZm8ubyBcCi0JY29tbW9uL2NtbV9jZmcubyBcCi0JY29tbW9uL2NtbV93cGEubyBcCi0JY29tbW9uL2Rmcy5vIFwKLQljb21tb24vc3BlY3RydW0ubyBcCi0JY29tbW9uL3J0bXBfdGltZXIubyBcCi0JY29tbW9uL3J0X2NoYW5uZWwubyBcCi0JY29tbW9uL2NtbV9wcm9maWxlLm8gXAotCWNvbW1vbi9jbW1fYXNpYy5vIFwKLQlzdGEvYXNzb2MubyBcCi0Jc3RhL2F1dGgubyBcCi0Jc3RhL2F1dGhfcnNwLm8gXAotCXN0YS9zeW5jLm8gXAotCXN0YS9zYW5pdHkubyBcCi0Jc3RhL3J0bXBfZGF0YS5vIFwKLQlzdGEvY29ubmVjdC5vIFwKLQlzdGEvd3BhLm8gXAotCXJ0X2xpbnV4Lm8gXAotCXJ0X3Byb2ZpbGUubyBcCi0JcnRfbWFpbl9kZXYubyBcCi0Jc3RhX2lvY3RsLm8KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotaWZlcSAoJChIQVNfRE9UMTFfTl9TVVBQT1JUKSx5KQotcnQzMDkwc3RhLW9ianMgKz0gXAotCWNvbW1vbi9iYV9hY3Rpb24ubwotZW5kaWYKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIEVUSF9DT05WRVJUCi1pZmVxICgkKEhBU19FVEhfQ09OVkVSVF9TVVBQT1JUKSwgeSkKLXJ0MzA5MHN0YS1vYmpzICs9IFwKLQljb21tb24vY21tX21hdC5vIFwKLQljb21tb24vY21tX21hdF9pcGFycC5vIFwKLQljb21tb24vY21tX21hdF9wcHBvZS5vIFwKLQljb21tb24vY21tX21hdF9pcHY2Lm8KLWVuZGlmCi0jZW5kaWYgLy8gRVRIX0NPTlZFUlQgLy8KLQotaWZlcSAoJChIQVNfQkxPQ0tfTkVUX0lGKSx5KQotcnQzMDkwc3RhLW9ianMgKz0gY29tbW9uL25ldGlmX2Jsb2NrLm8KLWVuZGlmCi0KLWlmZXEgKCQoSEFTX1FPU19ETFNfU1VQUE9SVCkseSkKLXJ0MzA5MHN0YS1vYmpzICs9IHN0YS9kbHMubwotZW5kaWYKLQotcnQzMDkwc3RhLW9ianMgKz0gXAotCXBjaV9tYWluX2Rldi5vIFwKLQlydF9wY2lfcmJ1cy5vIFwKLQljb21tb24vY21tX21hY19wY2kubyBcCi0JY29tbW9uL2NtbV9kYXRhX3BjaS5vIFwKLQljb21tb24vZWVfcHJvbS5vIFwKLQljb21tb24vZWVfZWZ1c2UubyBcCi0JY29tbW9uL3J0bXBfbWN1Lm8gXAotCWNoaXBzL3J0MzB4eC5vIFwKLQljb21tb24vcnRfcmYubyBcCi0JY2hpcHMvcnQzMDkwLm8KLQotaWZlcSAoJChIQVNfQVRFKSx5KQotcnQzMDkwc3RhLW9ianMgKz0gcnRfYXRlLm8KLWVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FjdGlvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hY3Rpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMwYTBhMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FjdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlhaXJvbmV0LmgKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKLQlQYXVsIExpbgkwNC0wNi0xNQkJSW5pdGlhbAotKi8KLQotI2lmbmRlZglfX0FDVElPTl9IX18KLSNkZWZpbmUJX19BQ1RJT05fSF9fCi0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfX0hUX0lORk9fT0NURVQKLXsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JVUNIQVIJUmVzZXJ2ZWQ6NTsKLQlVQ0hBUglTVEFfQ2hhbm5lbF9XaWR0aDoxOwotCVVDSEFSCUZvcnR5X01Iel9JbnRvbGVyYW50OjE7Ci0JVUNIQVIJUmVxdWVzdDoxOwotI2Vsc2UKLQlVQ0hBUglSZXF1ZXN0OjE7Ci0JVUNIQVIJRm9ydHlfTUh6X0ludG9sZXJhbnQ6MTsKLQlVQ0hBUglTVEFfQ2hhbm5lbF9XaWR0aDoxOwotCVVDSEFSCVJlc2VydmVkOjU7Ci0jZW5kaWYKLX0gSFRfSU5GT1JNQVRJT05fT0NURVQ7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9fRlJBTUVfSFRfSU5GTwotewotCUhFQURFUl84MDJfMTEJCQlIZHI7Ci0JVUNIQVIJCQkJCUNhdGVnb3J5OwotCVVDSEFSCQkJCQlBY3Rpb247Ci0JSFRfSU5GT1JNQVRJT05fT0NURVQJSFRfSW5mbzsKLX0gICBGUkFNRV9IVF9JTkZPLCAqUEZSQU1FX0hUX0lORk87Ci0KLSNlbmRpZiAvKiBfX0FDVElPTl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5NDMwMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MTIgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBhcC5oCi0KLSAgICBBYnN0cmFjdDoKLSAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgUGF1bCBMaW4gICAgMDgtMDEtMjAwMiAgICBjcmVhdGVkCi0gICAgSmFtZXMgVGFuICAgMDktMDYtMjAwMiAgICBtb2RpZmllZCAoUmV2aXNlIE5UQ1JlZ1RhYmxlKQotICAgIEpvaG4gQ2hhbmcgIDEyLTIyLTIwMDQgICAgbW9kaWZpZWQgZm9yIFJUMjU2MS8yNjYxLiBtZXJnZSB3aXRoIFNUQSBkcml2ZXIKLSovCi0jaWZuZGVmIF9fQVBfSF9fCi0jZGVmaW5lIF9fQVBfSF9fCi0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gICAgICBGdW5jdGlvbiBQcm90b3R5cGVzCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIGFwX2RhdGEuYwotCi1CT09MRUFOIEFQQnJpZGdlVG9XaXJlbGVzc1N0YSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIHBIZWFkZXIsCi0gICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKLSAgICBJTiAgVUlOVCAgICAgICAgICAgIERhdGFMZW4sCi0gICAgSU4gIFVMT05HICAgICAgICAgICBmcm9td2RzaWR4KTsKLQotCi1WT0lECUFQU2VuZFBhY2tldHMoCi0JSU4JTkRJU19IQU5ETEUJCU1pbmlwb3J0QWRhcHRlckNvbnRleHQsCi0JSU4JUFBORElTX1BBQ0tFVAlwcFBhY2tldEFycmF5LAotCUlOCVVJTlQJCQlOdW1iZXJPZlBhY2tldHMpOwotCi1ORElTX1NUQVRVUyBBUFNlbmRQYWNrZXQoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKLQotCi1ORElTX1NUQVRVUyBBUEhhcmRUcmFuc21pdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVDSEFSCQkJUXVlSWR4KTsKLQotVk9JRCBBUFJ4RUFQT0xGcmFtZUluZGljYXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLU5ESVNfU1RBVFVTIEFQQ2hlY2tSeEVycm9yKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBSVDI4WFhfUlhEX1NUUlVDCQlwUnhELAotCUlOCVVDSEFSCQkJV2NpZCk7Ci0KLUJPT0xFQU4gQVBDaGVja0NsYXNzMkNsYXNzM0Vycm9yKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIFVMT05HIFdjaWQsCi0JSU4gIFBIRUFERVJfODAyXzExICBwSGVhZGVyKTsKLQotVk9JRCBBUEhhbmRsZVJ4UHNQb2xsKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBBZGRyLAotCUlOCVVTSE9SVAkJCUFpZCwKLSAgICBJTglCT09MRUFOCQkJaXNBY3RpdmUpOwotCi1WT0lEICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKAotICAgIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCi0gICAgSU4gIFVMT05HICAgICAgICAgICBEZXNjcmlwdG9yVHlwZSk7Ci0KLVZPSUQgICAgUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCi0gICAgSU4gIFVMT05HICAgICAgICAgICBEaXIsCi0gICAgSU4gIEJPT0xFQU4gICAgICAgICBGcm9tUnhEb25lSW50KTsKLQotLy8gYXBfYXNzb2MuYwotCi1WT0lEIEFQQXNzb2NTdGF0ZU1hY2hpbmVJbml0KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBTVEFURV9NQUNISU5FICpTLAotICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7Ci0KLVZPSUQgIEFQUGVlckFzc29jUmVxQWN0aW9uKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEICBBUFBlZXJSZWFzc29jUmVxQWN0aW9uKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEICBBUFBlZXJEaXNhc3NvY1JlcUFjdGlvbigKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBNYnNzS2lja091dFN0YXMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gSU5UIGFwaWR4LAotCUlOIFVTSE9SVCBSZWFzb24pOwotCi1WT0lEIEFQTWxtZUtpY2tPdXRTdGEoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBTdGFBZGRyLAotCUlOIFVDSEFSIFdjaWQsCi0JSU4gVVNIT1JUIFJlYXNvbik7Ci0KLVZPSUQgQVBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCAgQVBDbHMzZXJyQWN0aW9uKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVMT05HIFdjaWQsCi0gICAgSU4JUEhFQURFUl84MDJfMTEJcEhlYWRlcik7Ci0KLQotVVNIT1JUIEFQQnVpbGRBc3NvY2lhdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKLSAgICBJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCi0gICAgSU4gVUNIQVIgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMsCi0gICAgSU4gVUNIQVIgICpSU04sCi0gICAgSU4gVUNIQVIgICpwUlNOTGVuLAotICAgIElOIEJPT0xFQU4gYldtbUNhcGFibGUsCi0gICAgSU4gVUxPTkcgIFJhbGlua0llLAotI2lmZGVmIERPVDExTl9EUkFGVDMKLSAgICBJTiBFWFRfQ0FQX0lORk9fRUxFTUVOVCBFeHRDYXBJbmZvLAotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLQlJTiBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKLQlJTiBVQ0hBUgkJIEh0Q2FwYWJpbGl0eUxlbiwKLSAgICBPVVQgVVNIT1JUICpwQWlkKTsKLQotLyoKLVZPSUQJUlRNUEFkZENsaWVudFNlYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUglCc3NJZHgsCi0JSU4gVUNIQVIJCSBLZXlJZHgsCi0JSU4gVUNIQVIJCSBDaXBoZXJBbGcsCi0JSU4gUFVDSEFSCQkgcEtleSwKLQlJTiBQVUNIQVIJCSBwVHhNaWMsCi0JSU4gUFVDSEFSCQkgcFJ4TWljLAotCUlOIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KTsKLSovCi0KLS8vIGFwX2F1dGguYwotCi12b2lkIEFQQXV0aFN0YXRlTWFjaGluZUluaXQoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gU1RBVEVfTUFDSElORSAqU20sCi0gICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKLQotVk9JRCBBUENsczJlcnJBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcgV2NpZCwKLSAgICBJTglQSEVBREVSXzgwMl8xMQlwSGVhZGVyKTsKLQotLy8gYXBfY29ubmVjdC5jCi0KLQotVk9JRCBBUE1ha2VCc3NCZWFjb24oCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JSU5UCQkJCWFwaWR4KTsKLQotVk9JRCAgQVBVcGRhdGVCZWFjb25GcmFtZSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglJTlQJCQkJYXBpZHgpOwotCi1WT0lEIEFQTWFrZUFsbEJzc0JlYWNvbigKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgIEFQVXBkYXRlQWxsQmVhY29uRnJhbWUoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi0KLS8vIGFwX3N5bmMuYwotCi1WT0lEIEFQU3luY1N0YXRlTWFjaGluZUluaXQoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gU1RBVEVfTUFDSElORSAqU20sCi0gICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKLQotVk9JRCBBUFNjYW5UaW1lb3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KLVZPSUQgQVBJbnZhbGlkU3RhdGVXaGVuU2NhbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIEFQU2NhblRpbWVvdXRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBBUFBlZXJQcm9iZVJlcUFjdGlvbigKLSAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgQVBQZWVyQmVhY29uQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgQVBNbG1lU2NhblJlcUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIEFQUGVlckJlYWNvbkF0U2NhbkFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIEFQU2NhbkNuY2xBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBBcFNpdGVTdXJ2ZXkoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCVBORElTXzgwMl8xMV9TU0lECXBTc2lkLAotCUlOCVVDSEFSCQkJCVNjYW5UeXBlKTsKLQotVk9JRCBTdXBwb3J0UmF0ZSgKLQlJTiBQVUNIQVIgU3VwUmF0ZSwKLQlJTiBVQ0hBUiBTdXBSYXRlTGVuLAotCUlOIFBVQ0hBUiBFeHRSYXRlLAotCUlOIFVDSEFSIEV4dFJhdGVMZW4sCi0JT1VUIFBVQ0hBUiAqUmF0ZXMsCi0JT1VUIFBVQ0hBUiBSYXRlc0xlbiwKLQlPVVQgUFVDSEFSIHBNYXhTdXBwb3J0UmF0ZSk7Ci0KLQotQk9PTEVBTiBBcFNjYW5SdW5uaW5nKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotI2lmZGVmIERPVDExTl9EUkFGVDMKLVZPSUQgQVBPdmVybGFwcGluZ0JTU1NjYW4oCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLQotLy8gYXBfd3BhLmMKLVZPSUQgV3BhU3RhdGVNYWNoaW5lSW5pdCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgU1RBVEVfTUFDSElORSAqU20sCi0gICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKLQotLy8gYXBfbWxtZS5jCi1WT0lEIEFQTWxtZVBlcmlvZGljRXhlYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgQVBNbG1lU2VsZWN0VHhSYXRlVGFibGUoCi0JSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKLQlJTiBQVUNIQVIJCQkJKnBwVGFibGUsCi0JSU4gUFVDSEFSCQkJCXBUYWJsZVNpemUsCi0JSU4gUFVDSEFSCQkJCXBJbml0VHhSYXRlSWR4KTsKLQotVk9JRCBBUE1sbWVTZXRUeFJhdGUoCi0JSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKLQlJTiBQUlRNUF9UWF9SQVRFX1NXSVRDSAlwVHhSYXRlKTsKLQotVk9JRCBBUE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBBUFF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotQk9PTEVBTiBBUE1zZ1R5cGVTdWJzdCgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBQRlJBTUVfODAyXzExIHBGcmFtZSwKLSAgICBPVVQgSU5UICpNYWNoaW5lLAotICAgIE9VVCBJTlQgKk1zZ1R5cGUpOwotCi1WT0lEIEFQUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYygKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi0KLVZPSUQgUlRNUFNldFBpZ2d5QmFjaygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBCT09MRUFOCQkJYlBpZ2d5QmFjayk7Ci0KLVZPSUQgQVBBc2ljRXZhbHVhdGVSeEFudCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgQVBBc2ljUnhBbnRFdmFsVGltZW91dCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLS8vIGFwLmMKLQotVk9JRCBBUFN3aXRjaENoYW5uZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gSU5UIENoYW5uZWwpOwotCi1ORElTX1NUQVRVUyBBUEluaXRpYWxpemUoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIEFQU2h1dGRvd24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQpOwotCi1WT0lEIEFQU3RhcnRVcCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgQVBTdG9wKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBBUENsZWFudXBQc1F1ZXVlKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQUVVFVUVfSEVBREVSICAgcFF1ZXVlKTsKLQotVk9JRCBNYWNUYWJsZVJlc2V0KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUluc2VydEVudHJ5KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIsCi0JSU4JVUNIQVIJCQlhcGlkeCwKLQlJTiBCT09MRUFOCUNsZWFuQWxsKTsKLQotQk9PTEVBTiBNYWNUYWJsZURlbGV0ZUVudHJ5KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIFVTSE9SVCB3Y2lkLAotICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIpOwotCi1NQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlTG9va3VwKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIpOwotCi1WT0lEIE1hY1RhYmxlTWFpbnRlbmFuY2UoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1VSU5UMzIgTWFjVGFibGVBc3NvY1N0YU51bUdldCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLU1BQ19UQUJMRV9FTlRSWSAqQVBTc1BzSW5xdWlyeSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyLAotICAgIE9VVCBTU1QgICAgICAgICAgICAgKlNzdCwKLSAgICBPVVQgVVNIT1JUICAgICAgICAgICpBaWQsCi0gICAgT1VUIFVDSEFSICAgICAgICAgICAqUHNNb2RlLAotICAgIE9VVCBVQ0hBUiAgICAgICAgICAgKlJhdGUpOwotCi1CT09MRUFOIEFQUHNJbmRpY2F0ZSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyLAotCUlOIFVMT05HIFdjaWQsCi0gICAgSU4gIFVDSEFSICAgICAgICAgICBQc20pOwotCi1WT0lEIEFwTG9nRXZlbnQoCi0gICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0gICAgSU4gUFVDSEFSICAgICAgICAgICBwQWRkciwKLSAgICBJTiBVU0hPUlQgICAgICAgICAgIEV2ZW50KTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVk9JRCBBUFVwZGF0ZU9wZXJhdGlvbk1vZGUoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1WT0lEIEFQVXBkYXRlQ2FwYWJpbGl0eUFuZEVycEllKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotQk9PTEVBTiBBcENoZWNrQWNjZXNzQ29udHJvbExpc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSICAgICAgICBwQWRkciwKLQlJTiBVQ0hBUiAgICAgICAgIEFwaWR4KTsKLQotVk9JRCBBcFVwZGF0ZUFjY2Vzc0NvbnRyb2xMaXN0KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFVDSEFSICAgICAgICAgQXBpZHgpOwotCi1WT0lEIEFwRW5xdWV1ZU51bGxGcmFtZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgICAgICAgIHBBZGRyLAotCUlOIFVDSEFSICAgICAgICAgVHhSYXRlLAotCUlOIFVDSEFSICAgICAgICAgUElELAotCUlOIFVDSEFSICAgICAgICAgYXBpZHgsCi0gICAgSU4gQk9PTEVBTiAgICAgICBiUW9zTnVsbCwKLSAgICBJTiBCT09MRUFOICAgICAgIGJFT1NQLAotICAgIElOIFVDSEFSICAgICAgICAgT2xkVVApOwotCi1WT0lEIEFwU2VuZEZyYW1lKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQVk9JRCAgICAgICAgICAgcEJ1ZmZlciwKLSAgICBJTiAgVUxPTkcgICAgICAgICAgIExlbmd0aCwKLSAgICBJTiAgVUNIQVIgICAgICAgICAgIFR4UmF0ZSwKLSAgICBJTiAgVUNIQVIgICAgICAgICAgIFBJRCk7Ci0KLVZPSUQgQXBFbnF1ZXVlQWNrRnJhbWUoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gUFVDSEFSICAgICAgICBwQWRkciwKLSAgICBJTiBVQ0hBUiAgICAgICAgIFR4UmF0ZSwKLQlJTiBVQ0hBUiAgICAgICAgIGFwaWR4KTsKLQotLy8gYXBfc2FuaXR5LmMKLQotCi1CT09MRUFOIFBlZXJBc3NvY1JlcUNtbVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOIGlzUmVzc29jLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwQWRkcjIsCi0gICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAotICAgIE9VVCBVU0hPUlQgKnBMaXN0ZW5JbnRlcnZhbCwKLSAgICBPVVQgUFVDSEFSIHBBcEFkZHIsCi0gICAgT1VUIFVDSEFSICpwU3NpZExlbiwKLSAgICBPVVQgY2hhciAqU3NpZCwKLSAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKLSAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKLSAgICBPVVQgVUNIQVIgKlJTTiwKLSAgICBPVVQgVUNIQVIgKnBSU05MZW4sCi0gICAgT1VUIEJPT0xFQU4gKnBiV21tQ2FwYWJsZSwKLSAgICBPVVQgVUxPTkcgICpwUmFsaW5rSWUsCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotICAgIE9VVCBFWFRfQ0FQX0lORk9fRUxFTUVOVAkqcEV4dENhcEluZm8sCi0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotICAgIE9VVCBVQ0hBUgkJICpwSHRDYXBhYmlsaXR5TGVuLAotICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5KTsKLQotCi1CT09MRUFOIFBlZXJEaXNhc3NvY1JlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBVU0hPUlQgKlJlYXNvbik7Ci0KLUJPT0xFQU4gUGVlckRlYXV0aFJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBVU0hPUlQgKlJlYXNvbik7Ci0KLUJPT0xFQU4gQVBQZWVyQXV0aFNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotCU9VVCBQVUNIQVIgcEFkZHIxLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBVU0hPUlQgKkFsZywKLSAgICBPVVQgVVNIT1JUICpTZXEsCi0gICAgT1VUIFVTSE9SVCAqU3RhdHVzLAotICAgIE9VVCBDSEFSICpDaGxnVGV4dAotCSk7Ci0KLUJPT0xFQU4gQVBQZWVyUHJvYmVSZXFTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMiwKLSAgICBPVVQgQ0hBUiBTc2lkW10sCi0gICAgT1VUIFVDSEFSICpTc2lkTGVuKTsKLQotQk9PTEVBTiBBUFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBQVUNIQVIgcEJzc2lkLAotICAgIE9VVCBDSEFSIFNzaWRbXSwKLSAgICBPVVQgVUNIQVIgKlNzaWRMZW4sCi0gICAgT1VUIFVDSEFSICpCc3NUeXBlLAotICAgIE9VVCBVU0hPUlQgKkJlYWNvblBlcmlvZCwKLSAgICBPVVQgVUNIQVIgKkNoYW5uZWwsCi0gICAgT1VUIExBUkdFX0lOVEVHRVIgKlRpbWVzdGFtcCwKLSAgICBPVVQgVVNIT1JUICpDYXBhYmlsaXR5SW5mbywKLSAgICBPVVQgVUNIQVIgUmF0ZVtdLAotICAgIE9VVCBVQ0hBUiAqUmF0ZUxlbiwKLSAgICBPVVQgQk9PTEVBTiAqRXh0ZW5kZWRSYXRlSWVFeGlzdCwKLSAgICBPVVQgVUNIQVIgKkVycCk7Ci0jaWYgZGVmaW5lZChSVDMweHgpIHx8IGRlZmluZWQoUlQzMDV4KQotVk9JRCBFbmFibGVBUE1JTU9QUygKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgRGlzYWJsZUFQTUlNT1BTKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKTsKLSNlbmRpZgotI2VuZGlmICAvLyBfX0FQX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF9hcGNsaS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF9hcGNsaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzYzYzM2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfYXBjbGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIGFwX2FwY2xpLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBTaGlhbmcsIEZvbmNoaSAgICAwMi0xMy0yMDA3ICAgICAgY3JlYXRlZAotKi8KLQotI2lmbmRlZiBfQVBfQVBDTElfSF8KLSNkZWZpbmUgX0FQX0FQQ0xJX0hfCi0KLSNpZmRlZiBBUENMSV9TVVBQT1JUCi0KLSNpbmNsdWRlICJydG1wLmgiCi0KLSNkZWZpbmUgQVVUSF9USU1FT1VUCTMwMCAgICAgICAgIC8vIHVuaXQ6IG1zZWMKLSNkZWZpbmUgQVNTT0NfVElNRU9VVAkzMDAgICAgICAgICAvLyB1bml0OiBtc2VjCi0vLyNkZWZpbmUgSk9JTl9USU1FT1VUCTIwMDAgICAgICAgIC8vIHVuaXQ6IG1zZWMgLy8gbm90IHVzZWQgaW4gQXAtY2xpZW50IG1vZGUsIHJlbW92ZSBpdAotI2RlZmluZSBQUk9CRV9USU1FT1VUCTEwMDAgICAgICAgIC8vIHVuaXQ6IG1zZWMKLQotI2RlZmluZSBBUENMSV9ST09UX0JTU0lEX0dFVChwQWQsIHdjaWQpICgocEFkKS0+TWFjVGFiLkNvbnRlbnRbKHdjaWQpXS5BZGRyKQotI2RlZmluZSBBUENMSV9JRl9VUF9DSEVDSyhwQWQsIGlmaWR4KSAoKHBBZCktPkFwQ2ZnLkFwQ2xpVGFiWyhpZmlkeCldLmRldi0+ZmxhZ3MgJiBJRkZfVVApCi0KLS8qIHNhbml0eSBjaGVjayBmb3IgYXBpZHggKi8KLSNkZWZpbmUgQVBDTElfTVJfQVBJRFhfU0FOSVRZX0NIRUNLKGlkeCkgXAoteyBcCi0JaWYgKChpZHgpID49IE1BWF9BUENMSV9OVU0pIFwKLQl7IFwKLQkJKGlkeCkgPSAwOyBcCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzPiBFcnJvciEgYXBjbGktaWR4ID4gTUFYX0FQQ0xJX05VTSFcbiIsIF9fRlVOQ1RJT05fXykpOyBcCi0JfSBcCi19Ci0KLXR5cGVkZWYgc3RydWN0IF9BUENMSV9NTE1FX0pPSU5fUkVRX1NUUlVDVCB7Ci0JVUNIQVIJQnNzaWRbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUglTc2lkTGVuOwotCVVDSEFSCVNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKLX0gQVBDTElfTUxNRV9KT0lOX1JFUV9TVFJVQ1Q7Ci0KLXR5cGVkZWYgc3RydWN0IF9TVEFfQ1RSTF9KT0lOX1JFUV9TVFJVQ1QgewotCVVTSE9SVAlTdGF0dXM7Ci19IEFQQ0xJX0NUUkxfTVNHX1NUUlVDVCwgKlBTVEFfQ1RSTF9NU0dfU1RSVUNUOwotCi1CT09MRUFOIGlzVmFsaWRBcENsaUlmKAotCVNIT1JUIGlmSW5kZXgpOwotCi0vLwotLy8gUHJpdmF0ZSByb3V0aW5lcyBpbiBhcGNsaV9jdHJsLmMKLS8vCi1WT0lEIEFwQ2xpQ3RybFN0YXRlTWFjaGluZUluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gU1RBVEVfTUFDSElORV9FWCAqU20sCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQ19FWCBUcmFuc1tdKTsKLQotLy8KLS8vIFByaXZhdGUgcm91dGluZXMgaW4gYXBjbGlfc3luYy5jCi0vLwotVk9JRCBBcENsaVN5bmNTdGF0ZU1hY2hpbmVJbml0KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFNUQVRFX01BQ0hJTkVfRVggKlNtLAotICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkNfRVggVHJhbnNbXSk7Ci0KLS8vCi0vLyBQcml2YXRlIHJvdXRpbmVzIGluIGFwY2xpX2F1dGguYwotLy8KLVZPSUQgQXBDbGlBdXRoU3RhdGVNYWNoaW5lSW5pdCgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBTVEFURV9NQUNISU5FX0VYICpTbSwKLSAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DX0VYIFRyYW5zW10pOwotCi0vLwotLy8gUHJpdmF0ZSByb3V0aW5lcyBpbiBhcGNsaV9hc3NvYy5jCi0vLwotVk9JRCBBcENsaUFzc29jU3RhdGVNYWNoaW5lSW5pdCgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBTVEFURV9NQUNISU5FX0VYICpTbSwKLSAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DX0VYIFRyYW5zW10pOwotCi1NQUNfVEFCTEVfRU5UUlkgKkFwQ2xpVGFibGVMb29rVXBCeVdjaWQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgd2NpZCwKLQlJTiBQVUNIQVIgcEFkZHJzKTsKLQotCi1CT09MRUFOIEFwQ2xpQWxsb3dUb1NlbmRQYWNrZXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUE5ESVNfUEFDS0VUIHBQYWNrZXQsCi0JT1VUIFVDSEFSCQkqcFdjaWQpOwotCi1CT09MRUFOCQlBcENsaVZhbGlkYXRlUlNOSUUoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCQlQRUlEX1NUUlVDVAlwRWlkX3B0ciwKLQlJTgkJVVNIT1JUCQkJZWlkX2xlbiwKLQlJTgkJVVNIT1JUCQkJaWR4KTsKLQotVk9JRCBSVDI4eHhfQXBDbGlfSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBQTkVUX0RFVgkJCXBQaHlOZXREZXYpOwotCi1WT0lEIFJUMjh4eF9BcENsaV9DbG9zZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgUlQyOHh4X0FwQ2xpX1JlbW92ZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLQotVk9JRCBSVDI4eHhfQXBDbGlfUmVtb3ZlKAotCUlOIFBSVE1QX0FEQVBURVIgYWRfcCk7Ci0KLUlOVCBBcENsaUlmTG9va1VwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwQWRkcik7Ci0KLUlOVCBBcENsaV9WaXJ0dWFsSUZfT3BlbigKLQlJTglQTkVUX0RFVglkZXZfcCk7Ci0KLUlOVCBBcENsaV9WaXJ0dWFsSUZfQ2xvc2UoCi0JSU4JUE5FVF9ERVYJZGV2X3ApOwotCi1JTlQgQXBDbGlfVmlydHVhbElGX1BhY2tldFNlbmQoCi0JSU4gUE5ESVNfUEFDS0VUCQlza2JfcCwKLQlJTiBQTkVUX0RFVgkJCWRldl9wKTsKLQotSU5UIEFwQ2xpX1ZpcnR1YWxJRl9Jb2N0bCgKLQlJTiBQTkVUX0RFVgkJCQlkZXZfcCwKLQlJTiBPVVQgc3RydWN0IGlmcmVxCSpycV9wLAotCUlOIElOVCBjbWQpOwotCi0KLVZPSUQgQXBDbGlNZ3RNYWNIZWFkZXJJbml0KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCi0gICAgSU4gVUNIQVIgU3ViVHlwZSwKLSAgICBJTiBVQ0hBUiBUb0RzLAotICAgIElOIFBVQ0hBUiBwREEsCi0gICAgSU4gUFVDSEFSIHBCc3NpZCwKLSAgICBJTiBVU0hPUlQgaWZJbmRleCk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLUJPT0xFQU4gQXBDbGlDaGVja0h0KAotCUlOCQlQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JCVVTSE9SVAkJCQlJZkluZGV4LAotCUlOIE9VVAlIVF9DQVBBQklMSVRZX0lFCSpwSHRDYXBhYmlsaXR5LAotCUlOIE9VVAlBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1CT09MRUFOIEFwQ2xpTGlua1VwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSIGlmSW5kZXgpOwotCi1WT0lEIEFwQ2xpTGlua0Rvd24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgaWZJbmRleCk7Ci0KLVZPSUQgQXBDbGlJZlVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBBcENsaUlmRG93bigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgQXBDbGlJZk1vbml0b3IoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1CT09MRUFOIEFwQ2xpTXNnVHlwZVN1YnN0KAotCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKLQlJTiBQRlJBTUVfODAyXzExIHBGcmFtZSwKLQlPVVQgSU5UICpNYWNoaW5lLAotCU9VVCBJTlQgKk1zZ1R5cGUpOwotCi1CT09MRUFOIHByZUNoZWNrTXNnVHlwZVN1YnNldCgKLQlJTiBQUlRNUF9BREFQVEVSICBwQWQsCi0JSU4gUEZSQU1FXzgwMl8xMSBwRnJhbWUsCi0JT1VUIElOVCAqTWFjaGluZSwKLQlPVVQgSU5UICpNc2dUeXBlKTsKLQotQk9PTEVBTiBBcENsaVBlZXJBc3NvY1JzcFNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpwTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMiwKLSAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCi0gICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKLSAgICBPVVQgVVNIT1JUICpwQWlkLAotICAgIE9VVCBVQ0hBUiBTdXBSYXRlW10sCi0gICAgT1VUIFVDSEFSICpwU3VwUmF0ZUxlbiwKLSAgICBPVVQgVUNIQVIgRXh0UmF0ZVtdLAotICAgIE9VVCBVQ0hBUiAqcEV4dFJhdGVMZW4sCi0gICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0gICAgT1VUIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLSAgICBPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCi0gICAgT1VUIFVDSEFSICpwQWRkSHRJbmZvTGVuLAotICAgIE9VVCBVQ0hBUiAqcE5ld0V4dENoYW5uZWxPZmZzZXQsCi0gICAgT1VUIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotICAgIE9VVCBVQ0hBUiAqcENraXBGbGFnKTsKLQotVk9JRAlBcENsaVBlZXJQYWlyTXNnMUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7Ci0KLVZPSUQJQXBDbGlQZWVyUGFpck1zZzNBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0gICAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOwotCi1WT0lECUFwQ2xpUGVlckdyb3VwTXNnMUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7Ci0KLUJPT0xFQU4gQXBDbGlDaGVja1JTTklFKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCi0JSU4gIFVDSEFSICAgICAgICAgICBEYXRhTGVuLAotCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKLQlPVVQJVUNIQVIJCQkqT2Zmc2V0KTsKLQotQk9PTEVBTiBBcENsaVBhcnNlS2V5RGF0YSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBLZXlEYXRhLAotCUlOICBVQ0hBUiAgICAgICAgICAgS2V5RGF0YUxlbiwKLQlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCi0JSU4JVUNIQVIJCQlJZklkeCwKLQlJTglVQ0hBUgkJCWJQYWlyZXdpc2UpOwotCi1CT09MRUFOICBBcENsaUhhbmRsZVJ4QnJvYWRjYXN0RnJhbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLVZPSUQgQVBDbGlVcGRhdGVQYWlyd2lzZUtleVRhYmxlKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJKktleVJzYywKLQlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpOwotCi1CT09MRUFOIEFQQ2xpVXBkYXRlU2hhcmVkS2V5VGFibGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5LAotCUlOICBVQ0hBUiAgICAgICAgICAgS2V5TGVuLAotCUlOCVVDSEFSCQkJRGVmYXVsdEtleUlkeCwKLQlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpOwotCi0jZW5kaWYgLy8gQVBDTElfU1VQUE9SVCAvLwotCi0jZW5kaWYgLyogX0FQX0FQQ0xJX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX2F1dG9DaFNlbC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF9hdXRvQ2hTZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY4ODFmZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX2F1dG9DaFNlbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBhcF9hdXRvQ2hTZWwuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotI2luY2x1ZGUgImFwX2F1dG9DaFNlbF9jbW0uaCIKLQotI2lmbmRlZiBfX0FVVE9DSFNFTEVDVF9IX18KLSNkZWZpbmUgX19BVVRPQ0hTRUxFQ1RfSF9fCi0KLSNpZmRlZiBBVVRPX0NIX1NFTEVDVF9FTkhBTkNFCi0jZGVmaW5lIEFQX0FVVE9fQ0hfU0VMKF9fUCwgX19PKQlOZXdfQVBBdXRvU2VsZWN0Q2hhbm5lbCgoX19QKSwgKF9fTykpCi0jZWxzZQotI2RlZmluZSBBUF9BVVRPX0NIX1NFTChfX1AsIF9fTykJQVBBdXRvU2VsZWN0Q2hhbm5lbCgoX19QKSwgKF9fTykpCi0jZW5kaWYKLQotCi1VTE9ORyBBdXRvQ2hCc3NJbnNlcnRFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcEJzc2lkLAotCUlOIENIQVIgU3NpZFtdLAotCUlOIFVDSEFSIFNzaWRMZW4sCi0JSU4gVUNIQVIgQ2hhbm5lbE5vLAotCUlOIFVDSEFSIEV4dENoT2Zmc2V0LAotCUlOIENIQVIgUnNzaSk7Ci0KLXZvaWQgQXV0b0NoQnNzVGFibGVJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotdm9pZCBDaGFubmVsSW5mb0luaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi12b2lkIEF1dG9DaEJzc1RhYmxlRGVzdHJveSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLXZvaWQgQ2hhbm5lbEluZm9EZXN0cm95KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVUNIQVIgTmV3X0FQQXV0b1NlbGVjdENoYW5uZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gQk9PTEVBTiBPcHRpbWFsKTsKLQotVUNIQVIgQVBBdXRvU2VsZWN0Q2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOIE9wdGltYWwpOwotCi0jZW5kaWYgLy8gX19BVVRPQ0hTRUxFQ1RfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX2F1dG9DaFNlbF9jbW0uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfYXV0b0NoU2VsX2NtbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDc3ZWMxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfYXV0b0NoU2VsX2NtbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBhcF9hdXRvQ2hTZWxfY21tLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLQotI2lmbmRlZiBfX0FVVE9DSFNFTEVDVF9DTU1fSF9fCi0jZGVmaW5lIF9fQVVUT0NIU0VMRUNUX0NNTV9IX18KLQotI2RlZmluZSBSU1NJX1RPX0RCTV9PRkZTRVQgMTIwIC8vIFJTU0ktMTE1ID0gZEJtCi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCVVMT05HIGRpcnR5bmVzc1tNQVhfTlVNX09GX0NIQU5ORUxTKzFdOwotCVVMT05HIG1heF9yc3NpW01BWF9OVU1fT0ZfQ0hBTk5FTFMrMV07Ci0JVUxPTkcgdG90YWxfcnNzaVtNQVhfTlVNX09GX0NIQU5ORUxTKzFdOwotCVVJTlQzMiBGYWxzZUNDQVtNQVhfTlVNX09GX0NIQU5ORUxTKzFdOwotfSBDSEFOTkVMSU5GTywgKlBDSEFOTkVMSU5GTzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCVVDSEFSIEJzc2lkW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgU3NpZExlbjsKLQlDSEFSIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKLQlVQ0hBUiBDaGFubmVsOwotCVVDSEFSIEV4dENoT2Zmc2V0OwotCVVDSEFSIFJzc2k7Ci19IEJTU0VOVFJZLCAqUEJTU0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JVUNIQVIgQnNzTnI7Ci0JQlNTRU5UUlkgQnNzRW50cnlbTUFYX0xFTl9PRl9CU1NfVEFCTEVdOwotfSBCU1NJTkZPLCAqUEJTU0lORk87Ci0KLSNlbmRpZiAvLyBfX0FVVE9DSFNFTEVDVF9DTU1fSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX2NmZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF9jZmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5OTQyMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX2NmZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgYXBfY2ZnLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0jaWZuZGVmIF9fQVBfQ0ZHX0hfXwotI2RlZmluZSBfX0FQX0NGR19IX18KLQotCi0jaW5jbHVkZSAicnRfY29uZmlnLmgiCi0KLUlOVCBSVE1QQVBQcml2SW9jdGxTZXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gc3RydWN0IGl3cmVxICpwSW9jdGxDbWRTdHIpOwotCi1JTlQgUlRNUEFQUHJpdklvY3RsU2hvdygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBzdHJ1Y3QgaXdyZXEgKnBJb2N0bENtZFN0cik7Ci0KLUlOVCBSVE1QQVBTZXRJbmZvcm1hdGlvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglPVVQJc3RydWN0IGl3cmVxCSpycSwKLQlJTglJTlQJCQkJY21kKTsKLQotSU5UIFJUTVBBUFF1ZXJ5SW5mb3JtYXRpb24oCi0JSU4JUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCi0JSU4JT1VUCXN0cnVjdCBpd3JlcSAgICAqcnEsCi0JSU4JSU5UICAgICAgICAgICAgICAgICBjbWQpOwotCi1WT0lEIFJUTVBJb2N0bFN0YXRpc3RpY3MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gc3RydWN0IGl3cmVxICp3cnEpOwotCi1WT0lEIFJUTVBJb2N0bEdldE1hY1RhYmxlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIHN0cnVjdCBpd3JlcSAqd3JxKTsKLQotI2lmZGVmIERCRwotVk9JRCBSVE1QQVBJb2N0bEJCUCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBzdHJ1Y3QgaXdyZXEgICAgKndycSk7Ci0KLVZPSUQgUlRNUEFQSW9jdGxNQUMoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgc3RydWN0IGl3cmVxICAgICp3cnEpOwotCi1WT0lEIFJUTVBBUElvY3RsRTJQUk9NKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIHN0cnVjdCBpd3JlcSAgICAqd3JxKTsKLQotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotVk9JRCBSVE1QQVBJb2N0bFJGKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEpOwotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCi0jZW5kaWYgLy8gREJHIC8vCi0KLVZPSUQgUlQyOFhYX0lPQ1RMX01heFJhdGVHZXQoCi0JSU4JUlRNUF9BREFQVEVSCQkJKnBBZCwKLQlJTglQSFRUUkFOU01JVF9TRVRUSU5HCXBIdFBoeU1vZGUsCi0JT1VUCVVJTlQzMgkJCQkJKnBSYXRlKTsKLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1WT0lEIFJUTVBJb2N0bFF1ZXJ5QmFUYWJsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLVZPSUQgUlRNUElvY3RsU3RhdGljV2VwQ29weSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0KLVZPSUQgUlRNUElvY3RsUmFkaXVzRGF0YSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBzdHJ1Y3QgaXdyZXEJCSp3cnEpOwotCi1WT0lEIFJUTVBJb2N0bEFkZFdQQUtleSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0KLVZPSUQgUlRNUElvY3RsQWRkUE1LSURDYWNoZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0KLSNlbmRpZiAvLyBfX0FQX0NGR19IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfaWRzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX2lkcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjg3OTdmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfaWRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIGFwX2lkcy5oCi0KLSAgICBBYnN0cmFjdDoKLSAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi1WT0lEIFJUTVBJZHNQZXJpb2RpY0V4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotQk9PTEVBTiBSVE1QU3Bvb2ZlZE1nbXREZXRlY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUEhFQURFUl84MDJfMTEJcEhlYWRlciwKLQlJTiBDSEFSCQkJCVJzc2kwLAotCUlOIENIQVIJCQkJUnNzaTEsCi0JSU4gQ0hBUgkJCQlSc3NpMik7Ci0KLVZPSUQgUlRNUENvbmZsaWN0U3NpZERldGVjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBQVUNIQVIJCQlwU3NpZCwKLQlJTiBVQ0hBUgkJCVNzaWRMZW4sCi0JSU4gQ0hBUgkJCQlSc3NpMCwKLQlJTiBDSEFSCQkJCVJzc2kxLAotCUlOIENIQVIJCQkJUnNzaTIpOwotCi1CT09MRUFOIFJUTVBSZXBsYXlBdHRhY2tEZXRlY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUFVDSEFSCQkJcEFkZHIyLAotCUlOIENIQVIJCQkJUnNzaTAsCi0JSU4gQ0hBUgkJCQlSc3NpMSwKLQlJTiBDSEFSCQkJCVJzc2kyKTsKLQotVk9JRCBSVE1QVXBkYXRlU3RhTWdtdENvdW50ZXIoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVVNIT1JUCQkJdHlwZSk7Ci0KLVZPSUQgUlRNUENsZWFyQWxsSWRzQ291bnRlcigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgUlRNUElkc1N0YXJ0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBSVE1QSWRzU3RvcCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgcnRtcF9yZWFkX2lkc19mcm9tX2ZpbGUoCi0JCQlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCi0JCQljaGFyICp0bXBidWYsCi0JCQljaGFyICpidWZmZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF9tYnNzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX21ic3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc4NTU2Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX21ic3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgYXBfbWJzcy5oCi0KLSAgICBBYnN0cmFjdDoKLSAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaWZuZGVmIE1PRFVMRV9NQlNTCi0KLSNkZWZpbmUgTUJTU19FWFRFUk4gICAgZXh0ZXJuCi0KLSNlbHNlCi0KLSNkZWZpbmUgTUJTU19FWFRFUk4KLQotI2VuZGlmIC8vIE1PRFVMRV9NQlNTIC8vCi0KLQotLyogUHVibGljIGZ1bmN0aW9uIGxpc3QgKi8KLU1CU1NfRVhURVJOIFZPSUQgUlQyOHh4X01CU1NfSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIGFkX3AsCi0JSU4gUE5FVF9ERVYgbWFpbl9kZXZfcCk7Ci0KLU1CU1NfRVhURVJOIFZPSUQgUlQyOHh4X01CU1NfQ2xvc2UoCi0JSU4gUFJUTVBfQURBUFRFUiBhZF9wKTsKLQotTUJTU19FWFRFUk4gVk9JRCBSVDI4eHhfTUJTU19SZW1vdmUoCi0JSU4gUFJUTVBfQURBUFRFUiBhZF9wKTsKLQotSU5UIE1CU1NfVmlydHVhbElGX09wZW4oCi0JSU4JUE5FVF9ERVYJCQlkZXZfcCk7Ci1JTlQgTUJTU19WaXJ0dWFsSUZfQ2xvc2UoCi0JSU4JUE5FVF9ERVYJCQlkZXZfcCk7Ci1JTlQgTUJTU19WaXJ0dWFsSUZfUGFja2V0U2VuZCgKLQlJTiBQTkRJU19QQUNLRVQJCQlza2JfcCwKLQlJTiBQTkVUX0RFVgkJCQlkZXZfcCk7Ci1JTlQgTUJTU19WaXJ0dWFsSUZfSW9jdGwoCi0JSU4gUE5FVF9ERVYJCQkJZGV2X3AsCi0JSU4gT1VUIHN0cnVjdCBpZnJlcQkqcnFfcCwKLQlJTiBJTlQgY21kKTsKLQotLyogRW5kIG9mIGFwX21ic3MuaCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF91YXBzZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF91YXBzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDlhOWU3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfdWFwc2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzNiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIGFwX3VhcHNkLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLS8qIG9ubHkgZm9yIFVBUFNEX1RJTUlOR19SRUNPUkQgKi8KLQotLy8jZGVmaW5lIFVBUFNEX1RJTUlOR19SRUNPUkRfRlVOQwotCi0jZGVmaW5lIFVBUFNEX1RJTUlOR19SRUNPUkRfTUFYCQkJCTEwMDAKLSNkZWZpbmUgVUFQU0RfVElNSU5HX1JFQ09SRF9ESVNQTEFZX1RJTUVTCTEwCi0KLSNkZWZpbmUgVUFQU0RfVElNSU5HX1JFQ09SRF9JU1IJCQkJMQotI2RlZmluZSBVQVBTRF9USU1JTkdfUkVDT1JEX1RBU0tMRVQJCQkyCi0jZGVmaW5lIFVBUFNEX1RJTUlOR19SRUNPUkRfVFJHX1JDVgkJCTMKLSNkZWZpbmUgVUFQU0RfVElNSU5HX1JFQ09SRF9NT1ZFMlRYCQkJNAotI2RlZmluZSBVQVBTRF9USU1JTkdfUkVDT1JEX1RYMkFJUgkJCTUKLQotI2RlZmluZSBVQVBTRF9USU1JTkdfQ1RSTF9TVE9QCQkJCTAKLSNkZWZpbmUgVUFQU0RfVElNSU5HX0NUUkxfU1RBUlQJCQkJMQotI2RlZmluZSBVQVBTRF9USU1JTkdfQ1RSTF9TVVNQRU5ECQkJMgotCi0jZGVmaW5lIFVBUFNEX1RJTUVTVEFNUF9HRVQoX19wQWQsIF9fVGltZVN0YW1wKQkJCVwKLQl7CQkJCQkJCQkJCQkJCVwKLQkJVUlOVDMyIF9fQ1NSPTA7CVVJTlQ2NCBfX1ZhbHVlNjQ7CQkJCVwKLQkJUlRNUF9JT19SRUFEMzIoKF9fcEFkKSwgVFNGX1RJTUVSX0RXMCwgJl9fQ1NSKTsJXAotCQlfX1RpbWVTdGFtcCA9IChVSU5UNjQpX19DU1I7CQkJCQlcCi0JCVJUTVBfSU9fUkVBRDMyKChfX3BBZCksIFRTRl9USU1FUl9EVzEsICZfX0NTUik7CVwKLQkJX19WYWx1ZTY0ID0gKFVJTlQ2NClfX0NTUjsJCQkJCQlcCi0JCV9fVGltZVN0YW1wIHw9IChfX1ZhbHVlNjQgPDwgMzIpOwkJCQlcCi0JfQotCi0jaWZkZWYgTElOVVgKLSNkZWZpbmUgVUFQU0RfVElNRV9HRVQoX19wQWQsIF9fVGltZSkJCQkJCVwKLQkJX19UaW1lID0gamlmZmllcwotI2VuZGlmIC8vIExJTlVYIC8vCi0KLQotI2lmZGVmIFVBUFNEX1RJTUlOR19SRUNPUkRfRlVOQwotI2RlZmluZSBVQVBTRF9USU1JTkdfUkVDT1JEX1NUQVJUKCkJCQkJXAotCVVBUFNEX1RpbWluZ1JlY29yZEN0cmwoVUFQU0RfVElNSU5HX0NUUkxfU1RBUlQpOwotI2RlZmluZSBVQVBTRF9USU1JTkdfUkVDT1JEX1NUT1AoKQkJCQlcCi0JVUFQU0RfVGltaW5nUmVjb3JkQ3RybChVQVBTRF9USU1JTkdfQ1RSTF9TVE9QKTsKLSNkZWZpbmUgVUFQU0RfVElNSU5HX1JFQ09SRChfX3BBZCwgX19UeXBlKQkJXAotCVVBUFNEX1RpbWluZ1JlY29yZChfX3BBZCwgX19UeXBlKTsKLSNkZWZpbmUgVUFQU0RfVElNSU5HX1JFQ09SRF9JTkRFWChfX0xvb3BJbmRleCkJXAotCVVBUFNEX1RpbWVpbmdSZWNvcmRMb29wSW5kZXgoX19Mb29wSW5kZXgpOwotI2Vsc2UKLQotI2RlZmluZSBVQVBTRF9USU1JTkdfUkVDT1JEX1NUQVJUKCkKLSNkZWZpbmUgVUFQU0RfVElNSU5HX1JFQ09SRF9TVE9QKCkKLSNkZWZpbmUgVUFQU0RfVElNSU5HX1JFQ09SRChfX3BBZCwgX190eXBlKQotI2RlZmluZSBVQVBTRF9USU1JTkdfUkVDT1JEX0lOREVYKF9fTG9vcEluZGV4KQotI2VuZGlmIC8vIFVBUFNEX1RJTUlOR19SRUNPUkRfRlVOQyAvLwotCi0KLSNpZm5kZWYgTU9EVUxFX1dNTV9VQVBTRAotCi0jZGVmaW5lIFVBUFNEX0VYVEVSTgkJCWV4dGVybgotCi0vKiBQdWJsaWMgTWFyY28gbGlzdCAqLwotCi0vKgotCUluaXQgc29tZSBwYXJhbWV0ZXJzIGluIHBhY2tldCBzdHJ1Y3R1cmUgZm9yIFFvUyBOdWxsIGZyYW1lOwotCXB1cnBvc2U6IGlzIGZvciBtYW5hZ2VtZW50IGZyYW1lIHR4IGRvbmUgdXNlCi0qLwotI2RlZmluZSBVQVBTRF9NUl9RT1NfTlVMTF9IQU5ETEUoX19wQWQsIF9fcERhdGEsIF9fcFBhY2tldCkJCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJCQkJXAotCQlQSEVBREVSXzgwMl8xMSBfX3BIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpKF9fcERhdGEpOwkJCQlcCi0JCU1BQ19UQUJMRV9FTlRSWSAqX19wRW50cnk7CQkJCQkJCQkJCQlcCi0JCWlmIChfX3BIZWFkZXItPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9RT1NfTlVMTCkJCQkJCQlcCi0JCXsJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCVJUTVBfU0VUX1BBQ0tFVF9RT1NfTlVMTCgoX19wUGFja2V0KSk7CQkJCQkJCVwKLQkJCV9fcEVudHJ5ID0gTWFjVGFibGVMb29rdXAoKF9fcEFkKSwgX19wSGVhZGVyLT5BZGRyMSk7CQkJXAotCQkJaWYgKF9fcEVudHJ5ICE9IE5VTEwpCQkJCQkJCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRCgoX19wUGFja2V0KSwgX19wRW50cnktPkFpZCk7CQkJXAotCQkJfQkJCQkJCQkJCQkJCQkJCQlcCi0JCX0JCQkJCQkJCQkJCQkJCQkJCVwKLQkJZWxzZQkJCQkJCQkJCQkJCQkJCQlcCi0JCXsJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCVJUTVBfU0VUX1BBQ0tFVF9OT05fUU9TX05VTEwoKF9fcFBhY2tldCkpOwkJCQkJCVwKLQkJfQkJCQkJCQkJCQkJCQkJCQkJXAotCX0KLQotLyoKLQlJbml0IE1BQyBlbnRyeSBVQVBTRCBwYXJhbWV0ZXJzOwotCXB1cnBvc2U6IGluaXRpYWxpemUgVUFQU0QgUFMgcXVldWUgYW5kIGNvbnRyb2wgcGFyYW1ldGVycwotKi8KLSNkZWZpbmUgVUFQU0RfTVJfRU5UUllfSU5JVChfX3BFbnRyeSkJCQkJCQkJCQkJXAotCXsJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCVVJTlQxNglfX0lkQWM7CQkJCQkJCQkJCQkJCQlcCi0JCWZvcihfX0lkQWM9MDsgX19JZEFjPFdNTV9OVU1fT0ZfQUM7IF9fSWRBYysrKQkJCQkJCVwKLQkJCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmKF9fcEVudHJ5KS0+VUFQU0RRdWV1ZVtfX0lkQWNdKTsJCQlcCi0JCShfX3BFbnRyeSktPlVBUFNEVHhOdW0gPSAwOwkJCQkJCQkJCQkJXAotCQkoX19wRW50cnkpLT5wVUFQU0RFT1NQRnJhbWUgPSBOVUxMOwkJCQkJCQkJCVwKLQkJKF9fcEVudHJ5KS0+YkFQU0RGbGFnU1BTdGFydCA9IDA7CQkJCQkJCQkJXAotCQkoX19wRW50cnkpLT5iQVBTREZsYWdFT1NQT0sgPSAwOwkJCQkJCQkJCVwKLQkJKF9fcEVudHJ5KS0+TWF4U1BMZW5ndGggPSAwOwkJCQkJCQkJCQlcCi0JfQotCi0vKgotCVJlc2V0IE1BQyBlbnRyeSBVQVBTRCBwYXJhbWV0ZXJzOwotICAgcHVycG9zZTogY2xlYW4gYWxsIFVBUFNEIFBTIHF1ZXVlOyByZWxlYXNlIHRoZSBFT1NQIGZyYW1lIGlmIGV4aXN0czsKLQkJCXJlc2V0IGNvbnRyb2wgcGFyYW1ldGVycwotKi8KLSNkZWZpbmUgVUFQU0RfTVJfRU5UUllfUkVTRVQoX19wQWQsIF9fcEVudHJ5KQkJCQkJCQkJXAotCXsJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCU1BQ19UQUJMRV9FTlRSWSAqX19wU3RhOwkJCQkJCQkJCQkJXAotCQlVSU5UMzIgX19JZEFjOwkJCQkJCQkJCQkJCQkJXAotCQlfX3BTdGEgPSAoX19wRW50cnkpOwkJCQkJCQkJCQkJCVwKLQkJLyogY2xlYXIgYWxsIFUtQVBTRCBxdWV1ZXMgKi8JCQkJCQkJCQkJXAotCQlmb3IoX19JZEFjPTA7IF9fSWRBYzxXTU1fTlVNX09GX0FDOyBfX0lkQWMrKykJCQkJCQlcCi0JCQlBUENsZWFudXBQc1F1ZXVlKChfX3BBZCksICZfX3BTdGEtPlVBUFNEUXVldWVbX19JZEFjXSk7CQlcCi0JCS8qIGNsZWFyIEVPU1AgZnJhbWUgKi8JCQkJCQkJCQkJCQlcCi0JCV9fcFN0YS0+VUFQU0RUeE51bSA9IDA7CQkJCQkJCQkJCQkJXAotCQlpZiAoX19wU3RhLT5wVUFQU0RFT1NQRnJhbWUgIT0gTlVMTCkgewkJCQkJCQkJXAotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVCgoX19wQWQpLAkJCQkJCQkJCVwKLQkJCQkJCQlRVUVVRV9FTlRSWV9UT19QQUNLRVQoX19wU3RhLT5wVUFQU0RFT1NQRnJhbWUpLAlcCi0JCQkJCQkJTkRJU19TVEFUVVNfRkFJTFVSRSk7CQkJCQkJCVwKLQkJCV9fcFN0YS0+cFVBUFNERU9TUEZyYW1lID0gTlVMTDsgfQkJCQkJCQkJXAotCQlfX3BTdGEtPmJBUFNERmxhZ1NQU3RhcnQgPSAwOwkJCQkJCQkJCQlcCi0JCV9fcFN0YS0+YkFQU0RGbGFnRU9TUE9LID0gMDsgfQotCi0vKgotCUVuYWJsZSBvciBkaXNhYmxlIFVBUFNEIGZsYWcgaW4gV01NIGVsZW1lbnQgaW4gYmVhY29uIGZyYW1lOwotCXB1cnBvc2U6IHNldCBVQVBTRCBlbmFibGUvZGlzYWJsZSBiaXQKLSovCi0jZGVmaW5lIFVBUFNEX01SX0lFX0ZJTEwoX19Rb3NDdHJsRmllbGQsIF9fcEFkKQkJCQkJCQkJXAotCQkoX19Rb3NDdHJsRmllbGQpIHw9ICgoX19wQWQpLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlKSA/IDB4ODAgOiAweDAwOwotCi0vKgotCUNoZWNrIGlmIHdlIGRvIE5PVCBuZWVkIHRvIGNvbnRyb2wgVElNIGJpdCBmb3IgdGhlIHN0YXRpb247Ci0Jbm90ZTogd2UgY29udHJvbCBUSU0gYml0IG9ubHkgd2hlbiBhbGwgQUMgYXJlIFVBUFNEIEFDCi0qLwotI2RlZmluZSBVQVBTRF9NUl9JU19OT1RfVElNX0JJVF9ORUVERURfSEFORExFRChfX3BNYWNFbnRyeSwgX19RdWVJZHgpCQlcCi0JCShDTElFTlRfU1RBVFVTX1RFU1RfRkxBRygoX19wTWFjRW50cnkpLCBmQ0xJRU5UX1NUQVRVU19BUFNEX0NBUEFCTEUpICYmIFwKLQkJCSghKF9fcE1hY0VudHJ5KS0+YkFQU0REZWxpdmVyRW5hYmxlZFBlckFDW1FJRF9BQ19WT10gfHwJCQlcCi0JCQkhKF9fcE1hY0VudHJ5KS0+YkFQU0REZWxpdmVyRW5hYmxlZFBlckFDW1FJRF9BQ19WSV0gfHwJCQlcCi0JCQkhKF9fcE1hY0VudHJ5KS0+YkFQU0REZWxpdmVyRW5hYmxlZFBlckFDW1FJRF9BQ19CRV0gfHwJCQlcCi0JCQkhKF9fcE1hY0VudHJ5KS0+YkFQU0REZWxpdmVyRW5hYmxlZFBlckFDW1FJRF9BQ19CS10pICYmCQkJXAotCQkoX19wTWFjRW50cnkpLT5iQVBTRERlbGl2ZXJFbmFibGVkUGVyQUNbX19RdWVJZHhdKQotCi0vKiBjaGVjayBpZiB0aGUgQUMgaXMgVUFQU0QgZGVsaXZlcnktZW5hYmxlZCBBQyAqLwotI2RlZmluZSBVQVBTRF9NUl9JU19VQVBTRF9BQyhfX3BNYWNFbnRyeSwgX19BY0lkKQkJCQkJCQlcCi0JCShDTElFTlRfU1RBVFVTX1RFU1RfRkxBRygoX19wTWFjRW50cnkpLCBmQ0xJRU5UX1NUQVRVU19BUFNEX0NBUEFCTEUpICYmCVwKLQkJCSgoMCA8PSAoX19BY0lkKSkgJiYgKChfX0FjSWQpIDwgV01NX05VTV9PRl9BQykpICYmIC8qIDAgfiAzICovCVwKLQkJCShfX3BNYWNFbnRyeSktPmJBUFNERGVsaXZlckVuYWJsZWRQZXJBQ1soX19BY0lkKV0pCi0KLS8qIGNoZWNrIGlmIGFsbCBBQyBhcmUgVUFQU0QgZGVsaXZlcnktZW5hYmxlZCBBQyAqLwotI2RlZmluZSBVQVBTRF9NUl9JU19BTExfQUNfVUFQU0QoX19GbGdJc0FjdGl2ZSwgX19wTWFjRW50cnkpCQkJCVwKLQkJKCgoX19GbGdJc0FjdGl2ZSkgPT0gRkFMU0UpICYmICgoX19wTWFjRW50cnkpLT5iQVBTREFsbEFDID09IDEpKQotCi0vKiBzdXNwZW5kIFNQICovCi0jZGVmaW5lIFVBUFNEX01SX1NQX1NVU1BFTkQoX19wQWQpCQkJCQkJCQkJCQlcCi0JCShfX3BBZCktPmJBUFNERmxhZ1NQU3VzcGVuZCA9IDE7Ci0KLS8qIHJlc3VtZSBTUCAqLwotI2RlZmluZSBVQVBTRF9NUl9TUF9SRVNVTUUoX19wQWQpCQkJCQkJCQkJCQlcCi0JCShfX3BBZCktPmJBUFNERmxhZ1NQU3VzcGVuZCA9IDA7Ci0KLS8qIG1hcmsgUFMgcG9sbCBmcmFtZSBzZW50IGluIG1peCBtb2RlICovCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0vKgotCU5vdGU6Ci0JKDEpIFdoZW4gU1AgaXMgbm90IHN0YXJ0ZWQsIHRyeSB0byBtYXJrIGEgZmxhZyB0byByZWNvcmQgaWYgdGhlIGxlZ2FjeSBwcwotCQlwYWNrZXQgaXMgaGFuZGxlZCBpbiBzdGF0aXN0aWNzIGhhbmRsZXI7Ci0JKDIpIFdoZW4gU1AgaXMgc3RhcnRlZCwgaW5jcmVhc2UgdGhlIFVBUFNEIGNvdW50IG51bWJlciBmb3IgdGhlIGxlZ2FjeSBQUy4KLSovCi0jZGVmaW5lIFVBUFNEX01SX01JWF9QU19QT0xMX1JDVihfX3BBZCwgX19wTWFjRW50cnkpCQkJCQkJXAotCQlpZiAoKF9fcE1hY0VudHJ5KS0+YkFQU0RGbGFnU3BSb3VnaFVzZSA9PSAwKQkJCQkJCVwKLQkJewkJCQkJCQkJCQkJCQkJCQkJXAotCQkJaWYgKChfX3BNYWNFbnRyeSktPmJBUFNERmxhZ1NQU3RhcnQgPT0gMCkJCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlpZiAoKF9fcE1hY0VudHJ5KS0+YkFQU0RGbGFnTGVnYWN5U2VudCA9PSAxKQkJCQlcCi0JCQkJCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycygoX19wQWQpKTsJCQkJCQlcCi0JCQkJKF9fcE1hY0VudHJ5KS0+YkFQU0RGbGFnTGVnYWN5U2VudCA9IDE7CQkJCQkJXAotCQkJfQkJCQkJCQkJCQkJCQkJCQlcCi0JCQllbHNlCQkJCQkJCQkJCQkJCQkJXAotCQkJewkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJKF9fcE1hY0VudHJ5KS0+VUFQU0RUeE51bSArKzsJCQkJCQkJCVwKLQkJCX0JCQkJCQkJCQkJCQkJCQkJXAotCQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotI2Vsc2UKLQotI2RlZmluZSBVQVBTRF9FWFRFUk4KLSNkZWZpbmUgVUFQU0RfUU9TX05VTExfUVVFX0lECTB4N2YKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotLyoKLQlJbiBSVDI4NzAsIEZJRk8gY291bnRlciBpcyBmb3IgYWxsIHN0YXRpb25zLCBub3QgZm9yIHBlci1lbnRyeSwKLQlzbyB3ZSBjYW4gbm90IHVzZSBhY2N1cmF0ZSBtZXRob2QgaW4gUlQyODcwCi0qLwotCi0vKgotCU5vdGUgZm9yIFNQIEFDQ1VSQVRFIE1lY2hhbmlzbToKLQkxLiBXaGVuIHRyYWZmaWMgaXMgYnVzeSBmb3IgdGhlIFBTIHN0YXRpb24KLQkJU3RhdGlzdGljcyBGSUZPIGNvdW50ZXIgbWF5YmUgb3ZlcmZsb3cgYmVmb3JlIHdlIHJlYWQgaXQsIHNvIFVBUFNECi0JCWNvdW50aW5nIG1lY2hhbmlzbSB3aWxsIG5vdCBhY2N1cmF0ZWx5LgotCi0JCVNvbHV0aW9uOgotCQlXZSBuZWVkIHRvIGF2b2lkIHRoZSB3b3JzZSBjYXNlIHNvIHdlIHN1Z2dlc3QgYSBtYXhpbXVtIGludGVydmFsIGZvcgotCQlhIFNQIHRoYXQgdGhlIGludGVydmFsIGJldHdlZW4gbGFzdCBmcmFtZSBmcm9tIFFBUCBhbmQgZGF0YSBmcmFtZSBmcm9tCi0JCVFTVEEgaXMgbGFyZ2VyIHRoYW4gVUFQU0RfRVBUX1NQX0lOVC4KLQotCTIuIFdoZW4gdHJhZmZpYyB1c2UgQ0NLLzFNYnBzIGZyb20gUUFQCi0JCVN0YXRpc3RpY3MgRklGTyB3aWxsIG5vdCBjb3VudCB0aGUgcGFja2V0LiBUaGVyZSBhcmUgMiBjYXNlczoKLQkJKDEpIFdlIGZvcmNlIHRvIGRvd25ncmFnZSBBUlAgcmVzcG9uc2UgJiBESENQIHBhY2tldCB0byAxTWJwczsKLQkJKDIpIEFmdGVyIHJhdGUgc3dpdGNoIG1lY2hhbmlzbSwgdHggcmF0ZSBpcyBmaXhlZCB0byAxTWJwcy4KLQotCQlTb2x1dGlvbjoKLQkJVXNlIG9sZCBETUEgVUFQU0QgbWVjaGFuaXNtLgotCi0JMy4gV2hlbiBwYXJ0IG9mIEFDIHVzZXMgbGVnYWN5IFBTIG1vZGUKLQkJU3RhdGlzdGljcyBjb3VudCB3aWxsIGluY2x1ZSBwYWNrZXQgc3RhdGlzdGljcyBmb3IgbGVnYWN5IFBTIHBhY2tldHMKLQkJc28gd2UgY2FuIG5vdCBrbm93IHdoaWNoIG9uZSBpcyBVQVBTRCwgd2hpY2ggb25lIGlzIGxlZ2FjeS4KLQotCQlTb2x1dGlvbjoKLQkJQ291bmQgdGhlIGxlZ2FjeSBQUyBwYWNrZXQuCi0KLQk0LiBDaGVjayBGSUZPIHN0YXRpc3RpY3MgY291bnQgaW4gUnggRG9uZSBmdW5jdGlvbgotCQlXZSBjYW4gbm90IHRvIGNoZWNrIFRYIEZJRk8gc3RhdGlzdGljcyBjb3VudCBpbiBSeCBEb25lIGZ1bmN0aW9uIG9yCi0JCXRoZSByZWFsIHBhY2tldCB0eC9yeCBzZXF1ZW5jZSB3aWxsIGJlIGRpc2FycmFuZ2VkLgotCi0JCVNvbHV0aW9uOgotCQlTdXNwZW5kIFNQIGhhbmRsZSBiZWZvcmUgcnggZG9uZSBhbmQgcmVzdW1lIFNQIGhhbmRsZSBhZnRlciByeCBkb25lLgotKi8KLSNkZWZpbmUgVUFQU0RfU1BfQUNDVVJBVEUJCS8qIHVzZSBtb3JlIGFjY3VyYXRlIG1ldGhvZCB0byBzZW5kIEVPU1AgKi8KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotI2RlZmluZSBVQVBTRF9FUFRfU1BfSU5UCQkoMTAwMDAwLygxMDAwMDAwL09TX0haKSkgLyogMTAwbXMgKi8KLQotI2VuZGlmIC8vIE1PRFVMRV9XTU1fVUFQU0QgLy8KLQotCi0vKiBtYXggVUFQU0QgYnVmZmVyIHF1ZXVlIHNpemUgKi8KLSNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fVUFQU0RfUVVFVUUJMTYJLyogZm9yIGVhY2ggQUMgPSAxNio0ID0gNjQgKi8KLQotCi0vKiBQdWJsaWMgZnVuY3Rpb24gbGlzdCAqLwotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLQlVQVBTRCBNb2R1bGUgSW5pdC4KLQotQXJndW1lbnRzOgotCXBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUFQU0RfRVhURVJOIFZPSUQgVUFQU0RfSW5pdCgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQpOwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JVUFQU0QgTW9kdWxlIFJlbGVhc2UuCi0KLUFyZ3VtZW50czoKLQlwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVBUFNEX0VYVEVSTiBWT0lEIFVBUFNEX1JlbGVhc2UoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkKTsKLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotCUZyZWUgYWxsIEVPU1AgZnJhbWVzIGFuZCBjbG9zZSBhbGwgU1AuCi0KLUFyZ3VtZW50czoKLQlwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVBUFNEX0VYVEVSTiBWT0lEIFVBUFNEX0ZyZWVBbGwoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkKTsKLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotCUNsb3NlIGN1cnJlbnQgU2VydmljZSBQZXJpb2QuCi0KLUFyZ3VtZW50czoKLQlwQWQJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCXBFbnRyeQkJCUNsb3NlIHRoZSBTUCBvZiB0aGUgZW50cnkKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVBUFNEX0VYVEVSTiBWT0lEIFVBUFNEX1NQX0Nsb3NlKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJCSpwRW50cnkpOwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JRGVsaXZlciBhbGwgcXVldWVkIHBhY2tldHMuCi0KLUFyZ3VtZW50czoKLQlwQWQgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JKnBFbnRyeSAgICAgICAgU1RBVElPTgotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotCVNNUCBwcm90ZWN0aW9uIGJ5IGNhbGxlciBmb3IgcGFja2V0IGVucXVldWUuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQVBTRF9FWFRFUk4gVk9JRCBVQVBTRF9BbGxQYWNrZXREZWxpdmVyKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJCSpwRW50cnkpOwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JUGFyc2UgdGhlIFVBUFNEIGZpZWxkIGluIFdNTSBlbGVtZW50IGluIChyZSlhc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lLgotCi1Bcmd1bWVudHM6Ci0JcEFkCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkqcEVudHJ5CQkJU1RBVElPTgotCSpwRWxtCQkJUW9TIGluZm9ybWF0aW9uIGZpZWxkCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci0JTm8gcHJvdGVjdGlvbiBpcyBuZWVkZWQuCi0KLQkxLiBBc3NvY2lhdGlvbiAtPiBUU1BFQzoKLQkJdXNlIHN0YXRpYyBVQVBTRCBzZXR0aW5ncyBpbiBBc3NvY2lhdGlvbgotCQl1cGRhdGUgVUFQU0Qgc2V0dGluZ3MgaW4gVFNQRUMKLQotCTIuIEFzc29jaWF0aW9uIC0+IFRTUEVDKDExcikgLT4gUmVhc3NvY2lhdGlvbjoKLQkJdXBkYXRlIFVBUFNEIHNldHRpbmdzIGluIFRTUEVDCi0JCWJhY2t1cCBzdGF0aWMgVUFQU0Qgc2V0dGluZ3MgaW4gUmVhc3NvY2lhdGlvbgotCi0JMy4gQXNzb2NpYXRpb24gLT4gUmVhc3NvY2lhdGlvbjoKLQkJdXBkYXRlIFVBUFNEIHNldHRpbmdzIGluIFRTUEVDCi0JCWJhY2t1cCBzdGF0aWMgVUFQU0Qgc2V0dGluZ3MgaW4gUmVhc3NvY2lhdGlvbgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUFQU0RfRVhURVJOIFZPSUQgVUFQU0RfQXNzb2NQYXJzZSgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCQkqcEVudHJ5LAotCUlOCVVDSEFSCQkJCSpwRWxtKTsKLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotCUVucXVldWUgYSBVQVBTRCBwYWNrZXQuCi0KLUFyZ3VtZW50czoKLQlwQWQJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCSpwRW50cnkJCQlTVEFUSU9OCi0JcFBhY2tldAkJCVVBUFNEIGRubGluayBwYWNrZXQKLQlJZEFjCQkJVUFQU0QgQUMgSUQgKDAgfiAzKQotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUFQU0RfRVhURVJOIFZPSUQgVUFQU0RfUGFja2V0RW5xdWV1ZSgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCQkqcEVudHJ5LAotCUlOCVBORElTX1BBQ0tFVAkJcFBhY2tldCwKLQlJTglVSU5UMzIJCQkJSWRBYyk7Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLQlIYW5kbGUgUW9TIE51bGwgRnJhbWUgVHggRG9uZSBvciBNYW5hZ2VtZW50IFR4IERvbmUgaW50ZXJydXB0LgotCi1Bcmd1bWVudHM6Ci0JcEFkCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQlwUGFja2V0CQkJQ29tcGxldGVkIFRYIHBhY2tldAotCXBEc3RNYWMJCQlEZXN0aW5hdGVkIE1BQyBhZGRyZXNzCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQVBTRF9FWFRFUk4gVk9JRCBVQVBTRF9Rb1NOdWxsVHhNZ210VHhEb25lSGFuZGxlKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJCXBQYWNrZXQsCi0JSU4JVUNIQVIJCQkJKnBEc3RNYWMpOwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JTWFpbnRlbmFuY2Ugb3VyIFVBUFNEIFBTIHF1ZXVlLiAgUmVsZWFzZSBhbGwgcXVldWVkIHBhY2tldCBpZiB0aW1lb3V0LgotCi1Bcmd1bWVudHM6Ci0JcEFkCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkqcEVudHJ5CQkJU1RBVElPTgotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotCUlmIGluIFJUMjg3MCwgcEVudHJ5IGNhbiBub3QgYmUgcmVtb3ZlZCBkdXJpbmcgVUFQU0RfUXVldWVNYWludGVuYW5jZSgpCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQVBTRF9FWFRFUk4gVk9JRCBVQVBTRF9RdWV1ZU1haW50ZW5hbmNlKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJCSpwRW50cnkpOwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JQ2xvc2UgU1AgaW4gVHggRG9uZSwgbm90IFR4IERNQSBEb25lLgotCi1Bcmd1bWVudHM6Ci0JcEFkICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCXBFbnRyeQkJCWRlc3RpbmF0aW9uIGVudHJ5Ci0JRmxnU3VjY2VzcwkJMDp0eCBzdWNjZXNzLCAxOnR4IGZhaWwKLQotUmV0dXJuIFZhbHVlOgotICAgIE5vbmUKLQotTm90ZToKLQlGb3IgUlQyOHh4IHNlcmllcywgZm9yIHBhY2tldElEPTAgb3IgbXVsdGljYXN0IGZyYW1lLCBubyBzdGF0aXN0aWNzCi0JY291bnQgY2FuIGJlIGdvdCwgZXg6IEFSUCByZXNwb25zZSBvciBESENQIHBhY2tldHMsIHdlIHdpbGwgdXNlCi0JbG93IHJhdGUgdG8gc2V0IChDQ0ssIE1DUz0wPXBhY2tldElEKS4KLQlTbyBTUCB3aWxsIG5vdCBiZSBjbG9zZSB1bnRpbCBVQVBTRF9FUFRfU1BfSU5UIHRpbWVvdXQuCi0KLQlTbyBpZiB0aGUgdHggcmF0ZSBpcyAxTWJwcyBmb3IgYSBlbnRyeSwgd2Ugd2lsbCB1c2UgRE1BIGRvbmUsIG5vdAotCXVzZSBVQVBTRF9TUF9BVUVfSGFuZGxlKCkuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQVBTRF9FWFRFUk4gVk9JRCBVQVBTRF9TUF9BVUVfSGFuZGxlKAotCUlOIFJUTVBfQURBUFRFUgkJKnBBZCwKLSAgICBJTiBNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKLQlJTiBVQ0hBUgkJCUZsZ1N1Y2Nlc3MpOwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JQ2xvc2UgY3VycmVudCBTZXJ2aWNlIFBlcmlvZC4KLQotQXJndW1lbnRzOgotCXBBZAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci0JV2hlbiB3ZSByZWNlaXZlIEVPU1AgZnJhbWUgdHggZG9uZSBpbnRlcnJ1cHQgYW5kIGEgdXBsaW5rIHBhY2tldAotCWZyb20gdGhlIHN0YXRpb24gc2ltdWx0YW5lb3VzbHksIHdlIHdpbGwgcmVnYXJkIGl0IGFzIGEgbmV3IHRyaWdnZXIKLQlmcmFtZSBiZWNhdXNlIHRoZSBwYWNrZXQgaXMgcmVjZWl2ZWQgd2hlbiBFT1NQIGZyYW1lIHR4IGRvbmUgaW50ZXJydXB0LgotCi0JV2UgY2FuIG5vdCBzdXJlIHRoZSB1cGxpbmsgcGFja2V0IGlzIHNlbnQgYWZ0ZXIgb2xkIFNQIG9yIGluIHRoZSBvbGQgU1AuCi0JU28gd2UgbXVzdCBjbG9zZSB0aGUgb2xkIFNQIGluIHJlY2VpdmUgZG9uZSBJU1IgdG8gYXZvaWQgdGhlIHByb2JsZW0uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQVBTRF9FWFRFUk4gVk9JRCBVQVBTRF9TUF9DbG9zZUluUlZEb25lKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCk7Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLQlDaGVjayBpZiB3ZSBuZWVkIHRvIGNsb3NlIGN1cnJlbnQgU1AuCi0KLUFyZ3VtZW50czoKLQlwQWQJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCXBQYWNrZXQJCQlDb21wbGV0ZWQgVFggcGFja2V0Ci0JcERzdE1hYwkJCURlc3RpbmF0ZWQgTUFDIGFkZHJlc3MKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLQkxLiBXZSBuZWVkIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIGluIFR4RG9uZSBJU1IuCi0JMi4gU01QIHByb3RlY3Rpb24gYnkgY2FsbGVyIGZvciBwYWNrZXQgZW5xdWV1ZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVBUFNEX0VYVEVSTiBWT0lEIFVBUFNEX1NQX1BhY2tldENoZWNrKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJCXBQYWNrZXQsCi0JSU4JVUNIQVIJCQkJKnBEc3RNYWMpOwotCi0KLSNpZmRlZiBVQVBTRF9USU1JTkdfUkVDT1JEX0ZVTkMKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JRW5hYmxlL0Rpc2FibGUgVGltaW5nIFJlY29yZCBGdW5jdGlvbi4KLQotQXJndW1lbnRzOgotCXBBZAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JRmxhZwkJCTEgKEVuYWJsZSkgb3IgMCAoRGlzYWJsZSkKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVBUFNEX0VYVEVSTiBWT0lEIFVBUFNEX1RpbWluZ1JlY29yZEN0cmwoCi0JSU4JVUlOVDMyCQkJCUZsYWcpOwotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotCVJlY29yZCBzb21lIHRpbWluZ3MuCi0KLUFyZ3VtZW50czoKLQlwQWQJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCVR5cGUJCQlUaGUgdGltaW5nIGlzIGZvciB3aGF0IHR5cGUKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLQlVQVBTRF9USU1JTkdfUkVDT1JEX0lTUgotCVVBUFNEX1RJTUlOR19SRUNPUkRfVEFTS0xFVAotCVVBUFNEX1RJTUlOR19SRUNPUkRfVFJHX1JDVgotCVVBUFNEX1RJTUlOR19SRUNPUkRfTU9WRTJUWAotCVVBUFNEX1RJTUlOR19SRUNPUkRfVFgyQUlSCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQVBTRF9FWFRFUk4gVk9JRCBVQVBTRF9UaW1pbmdSZWNvcmQoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCVVJTlQzMgkJCQlUeXBlKTsKLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLQlSZWNvcmQgdGhlIGxvb3AgaW5kZXggZm9yIHJlY2VpdmVkIHBhY2tldCBoYW5kbGUuCi0KLUFyZ3VtZW50czoKLQlwQWQJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCUxvb3BJbmRleAkJVGhlIFJ4UHJvY2Vzc2VkIGluIEFQUnhEb25lSW50ZXJydXB0SGFuZGxlKCkKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVBUFNEX0VYVEVSTiBWT0lEIFVBUFNEX1RpbWVpbmdSZWNvcmRMb29wSW5kZXgoCi0JSU4JVUlOVDMyCQkJCUxvb3BJbmRleCk7Ci0jZW5kaWYgLy8gVUFQU0RfVElNSU5HX1JFQ09SRF9GVU5DIC8vCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLQlIYW5kbGUgVUFQU0QgVHJpZ2dlciBGcmFtZS4KLQotQXJndW1lbnRzOgotCXBBZAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JKnBFbnRyeQkJCXRoZSBzb3VyY2UgU1RBVElPTgotCVVwT2ZGcmFtZQkJdGhlIFVQIG9mIHRoZSB0cmlnZ2VyIGZyYW1lCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQVBTRF9FWFRFUk4gVk9JRCBVQVBTRF9UcmlnZ2VyRnJhbWVIYW5kbGUoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkJKnBFbnRyeSwKLQlJTglVQ0hBUgkJCQlVcE9mRnJhbWUpOwotCi0KLQotLyogRW5kIG9mIGFwX3VhcHNkLmggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfd2RzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX3dkcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmNiMTA3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfd2RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBhcF9jZmcuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEZvbmNoaSAgICAwMi0xMy0yMDA3ICAgICAgY3JlYXRlZAotKi8KLQotI2lmbmRlZiBfQVBfV0RTX0hfCi0jZGVmaW5lIF9BUF9XRFNfSF8KLQotI2RlZmluZSBXRFNfRU5UUllfUkVUUllfSU5URVJWQUwJKDEwMCAqIE9TX0haIC8gMTAwMCkKLQotCi1zdGF0aWMgaW5saW5lIEJPT0xFQU4gV0RTX0lGX1VQX0NIRUNLKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVTE9ORyBpZmlkeCkKLXsKLQlpZiAoKHBBZC0+ZmxnX3dkc19pbml0ICE9IFRSVUUpIHx8Ci0JCShpZmlkeCA+PSBNQVhfV0RTX0VOVFJZKSkKLQkJcmV0dXJuIEZBTFNFOwotCi0vLwlpZiAocEFkLT5XZHNUYWIuV2RzRW50cnlbaWZpZHhdLmRldi0+ZmxhZ3MgJiBJRkZfVVApCi0vLyBQYXRjaCBmb3Igd2RzICx3aGVuIGRpcnZlciBjYWxsIGFwbWxtZXBlcmlvZCA9PiBBUE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nIGNoZWNrIGlmIHdkcyBkZXZpY2UgcmVhZHkKLWlmICgocEFkLT5XZHNUYWIuV2RzRW50cnlbaWZpZHhdLmRldiAhPSBOVUxMKSAmJiAocEFkLT5XZHNUYWIuV2RzRW50cnlbaWZpZHhdLmRldi0+ZmxhZ3MgJiBJRkZfVVApKQotCQlyZXR1cm4gVFJVRTsKLQotCXJldHVybiBGQUxTRTsKLX0KLQotTE9ORyBXZHNFbnRyeUFsbG9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwQWRkcik7Ci0KLVZPSUQgV2RzRW50cnlEZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBBZGRyKTsKLQotTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUluc2VydFdEU0VudHJ5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgcEFkZHIsCi0JVUlOVCBXZHNUYWJJZHgpOwotCi1CT09MRUFOIE1hY1RhYmxlRGVsZXRlV0RTRW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIHdjaWQsCi0JSU4gUFVDSEFSIHBBZGRyKTsKLQotCi1CT09MRUFOIEFwV2RzQWxsb3dUb1NlbmRQYWNrZXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUE5ESVNfUEFDS0VUIHBQYWNrZXQsCi0JT1VUCVVDSEFSCQkqcFdjaWQpOwotCi1NQUNfVEFCTEVfRU5UUlkgKldkc1RhYmxlTG9va3VwQnlXY2lkKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIFVDSEFSIHdjaWQsCi0JSU4gUFVDSEFSIHBBZGRyLAotCUlOIEJPT0xFQU4gYlJlc2V0SWRlbENvdW50KTsKLQotTUFDX1RBQkxFX0VOVFJZICpXZHNUYWJsZUxvb2t1cCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyLAotCUlOIEJPT0xFQU4gYlJlc2V0SWRlbENvdW50KTsKLQotTUFDX1RBQkxFX0VOVFJZICpGaW5kV2RzRW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlXY2lkLAotCUlOIFBVQ0hBUgkJCXBBZGRyLAotCUlOIFVJTlQzMgkJCVBoeU1vZGUpOwotCi1WT0lEIFdkc1RhYmxlTWFpbnRlbmFuY2UoCi0gICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQpOwotCi1WT0lEIFJUMjh4eF9XRFNfSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQTkVUX0RFViBuZXRfZGV2KTsKLQotVk9JRCBSVDI4eHhfV0RTX0Nsb3NlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBSVDI4eHhfV0RTX1JlbW92ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgV2RzRG93bigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgQXNpY1VwZGF0ZVdkc1J4V0NJRFRhYmxlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBBc2ljVXBkYXRlV2RzRW5jcnlwdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiB3Y2lkKTsKLQotVk9JRCBXZHNQZWVyQmVhY29uUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSwKLQlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCi0JSU4gVUNIQVIgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywKLQlJTiBVQ0hBUiBNYXhTdXBwb3J0ZWRSYXRlTGVuLAotCUlOIEJPT0xFQU4gYldtbUNhcGFibGUsCi0JSU4gVUxPTkcgQ2xpZW50UmFsaW5rSWUsCi0JSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKLQlJTiBVQ0hBUiBIdENhcGFiaWxpdHlMZW4pOwotCi1WT0lEIEFQV2RzSW5pdGlhbGl6ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLUlOVAlTaG93X1dkc1RhYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLVZPSUQgcnRtcF9yZWFkX3dkc19mcm9tX2ZpbGUoCi0JCQlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCi0JCQlQU1RSSU5HIHRtcGJ1ZiwKLQkJCVBTVFJJTkcgYnVmZmVyKTsKLQotVk9JRCBXZHNQcmVwYXJlV2VwS2V5RnJvbU1haW5Cc3MoCi0JSU4gIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotSU5UIFdkc1ZpcnR1YWxJRlNlbmRQYWNrZXRzKAotCUlOIFBORElTX1BBQ0tFVCBwU2tiLAotCUlOIFBORVRfREVWIGRldik7Ci0KLUlOVCBXZHNWaXJ0dWFsSUZfb3BlbigKLQlJTiBQTkVUX0RFViBkZXYpOwotCi1JTlQgV2RzVmlydHVhbElGX2Nsb3NlKAotCUlOIFBORVRfREVWIGRldik7Ci0KLUlOVCBXZHNWaXJ0dWFsSUZfaW9jdGwoCi0JSU4gUE5FVF9ERVYgbmV0X2RldiwKLQlJTiBPVVQgc3RydWN0IGlmcmVxICpycSwKLQlJTiBJTlQgY21kKTsKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlDaGVjayB0aGUgV0RTIEVudHJ5IGlzIHZhbGlkIG9yIG5vdC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1zdGF0aWMgaW5saW5lIEJPT0xFQU4gVmFsaWRXZHNFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBXZHNJbmRleCkKLXsKLQlCT09MRUFOIHJlc3VsdDsKLQlQTUFDX1RBQkxFX0VOVFJZIHBNYWNFbnRyeTsKLQotCWRvCi0JewotCQlpZiAoV2RzSW5kZXggPj0gTUFYX1dEU19FTlRSWSkKLQkJewotCQkJcmVzdWx0ID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChwQWQtPldkc1RhYi5XZHNFbnRyeVtXZHNJbmRleF0uVmFsaWQgIT0gVFJVRSkKLQkJewotCQkJcmVzdWx0ID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmICgocEFkLT5XZHNUYWIuV2RzRW50cnlbV2RzSW5kZXhdLk1hY1RhYk1hdGNoV0NJRD09MCkKLQkJCXx8IChwQWQtPldkc1RhYi5XZHNFbnRyeVtXZHNJbmRleF0uTWFjVGFiTWF0Y2hXQ0lEID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSkKLQkJewotCQkJcmVzdWx0ID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJfQotCi0JCXBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BBZC0+V2RzVGFiLldkc0VudHJ5W1dkc0luZGV4XS5NYWNUYWJNYXRjaFdDSURdOwotCQlpZiAocE1hY0VudHJ5LT5WYWxpZEFzV0RTICE9IFRSVUUpCi0JCXsKLQkJCXJlc3VsdCA9IEZBTFNFOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXN1bHQgPSBUUlVFOwotCX0gd2hpbGUoRkFMU0UpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLSNlbmRpZiAvLyBfQVBfV0RTX0hfIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NoaXBzL3J0MzA5MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jaGlwcy9ydDMwOTAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjNTQ5ZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NoaXBzL3J0MzA5MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JcnQzMDkwLmMKLQotCUFic3RyYWN0OgotCVNwZWNpZmljIGZ1bmNpdG9ucyBhbmQgdmFyaWFibGVzIGZvciBSVDMwNzAKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0JLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaWZkZWYgUlQzMDkwCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0jaWZuZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotI2Vycm9yICJZb3UgU2hvdWxkIEVuYWJsZSBjb21waWxlIGZsYWcgUlRNUF9SRl9SV19TVVBQT1JUIGZvciB0aGlzIGNoaXAiCi0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCi0KLQotVk9JRCBOSUNJbml0UlQzMDkwUkZSZWdpc3RlcnMoSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JCUlOVCBpOwotCS8vIERyaXZlciBtdXN0IHJlYWQgRUVQUk9NIHRvIGdldCBSZkljVHlwZSBiZWZvcmUgaW5pdGlhbCBSRiByZWdpc3RlcnMKLQkvLyBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKLQlpZiAoSVNfUlQzMDkwKHBBZCkpCi0JewotCQkvLyBJbml0IFJGIGNhbGlicmF0aW9uCi0JCS8vIERyaXZlciBzaG91bGQgdG9nZ2xlIFJGIFIzMCBiaXQ3IGJlZm9yZSBpbml0IFJGIHJlZ2lzdGVycwotCQlVSU5UMzIgUmZSZWcgPSAwLCBkYXRhOwotCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoUFVDSEFSKSZSZlJlZyk7Ci0JCVJmUmVnIHw9IDB4ODA7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKFVDSEFSKVJmUmVnKTsKLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJUmZSZWcgJj0gMHg3RjsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoVUNIQVIpUmZSZWcpOwotCi0JCS8vIGluaXQgUjI0LCBSMzEKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCAweDBGKTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCAweDBGKTsKLQotCQkvLyBSVDMwOXggdmVyc2lvbiBFIGhhcyBmaXhlZCB0aGlzIGlzc3VlCi0JCWlmICgocEFkLT5OaWNDb25maWcyLmZpZWxkLkRBQ1Rlc3RCaXQgPT0gMSkgJiYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKSkKLQkJewotCQkJLy8gcGF0Y2ggdHggRVZNIGlzc3VlIHRlbXBvcmFyaWx5Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIExET19DRkcwLCAmZGF0YSk7Ci0JCQlkYXRhID0gKChkYXRhICYgMHhFMEZGRkZGRikgfCAweDBEMDAwMDAwKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIExET19DRkcwLCBkYXRhKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTERPX0NGRzAsICZkYXRhKTsKLQkJCWRhdGEgPSAoKGRhdGEgJiAweEUwRkZGRkZGKSB8IDB4MDEwMDAwMDApOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTERPX0NGRzAsIGRhdGEpOwotCQl9Ci0KLQkJLy8gcGF0Y2ggTE5BX1BFX0cxIGZhaWxlZCBpc3N1ZQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fU1dJVENILCAmZGF0YSk7Ci0JCWRhdGEgJj0gfigweDIwKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgR1BJT19TV0lUQ0gsIGRhdGEpOwotCi0JCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JGX1JFR19QQVJNUzsgaSsrKQotCQl7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSVDMweHhfUkZSZWdUYWJsZVtpXS5SZWdpc3RlciwgUlQzMHh4X1JGUmVnVGFibGVbaV0uVmFsdWUpOwotCQl9Ci0KLQkJLy8gRHJpdmVyIHNob3VsZCBzZXQgUkYgUjYgYml0NiBvbiBiZWZvcmUgY2FsaWJyYXRpb24KLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDYsIChQVUNIQVIpJlJmUmVnKTsKLQkJUmZSZWcgfD0gMHg0MDsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA2LCAoVUNIQVIpUmZSZWcpOwotCi0JCS8vRm9yIFJGIGZpbHRlciBDYWxpYnJhdGlvbgotCQlSVE1QRmlsdGVyQ2FsaWJyYXRpb24ocEFkKTsKLQotCQkvLyBJbml0aWFsaXplIFJGIFIyNyByZWdpc3Rlciwgc2V0IFJGIFIyNyBtdXN0IGJlIGJlaGluZCBSVE1QRmlsdGVyQ2FsaWJyYXRpb24oKQotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpCi0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIDB4Myk7Ci0KLQkJLy8gc2V0IGxlZCBvcGVuIGRyYWluIGVuYWJsZQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE9QVF8xNCwgJmRhdGEpOwotCQlkYXRhIHw9IDB4MDE7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE9QVF8xNCwgZGF0YSk7Ci0KLQkJLy8gc2V0IGRlZmF1bHQgYW50ZW5uYSBhcyBtYWluCi0JCWlmIChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCkKLQkJCUFzaWNTZXRSeEFudChwQWQsIHBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQpOwotCi0JCS8vIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwLCBsb2FkIFJGIG5vcm1hbCBvcGVyYXRpb24tbW9kZSBzZXR1cAotCQlSVDMweHhMb2FkUkZOb3JtYWxNb2RlU2V0dXAocEFkKTsKLQl9Ci0KLX0KLQotI2VuZGlmIC8vIFJUMzA5MCAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jaGlwcy9ydDMweHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY2hpcHMvcnQzMHh4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOGFlMDAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jaGlwcy9ydDMweHguYworKysgL2Rldi9udWxsCkBAIC0xLDUyNSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXJ0MzB4eC5jCi0KLQlBYnN0cmFjdDoKLQlTcGVjaWZpYyBmdW5jaXRvbnMgYW5kIHZhcmlhYmxlcyBmb3IgUlQzMHh4LgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLQktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLQotI2lmZGVmIFJUMzB4eAotCi0KLSNpZm5kZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0jZXJyb3IgIllvdSBTaG91bGQgRW5hYmxlIGNvbXBpbGUgZmxhZyBSVE1QX1JGX1JXX1NVUFBPUlQgZm9yIHRoaXMgY2hpcCIKLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLS8vCi0vLyBSRiByZWdpc3RlciBpbml0aWFsaXphdGlvbiBzZXQKLS8vCi1SRUdfUEFJUiAgIFJUMzB4eF9SRlJlZ1RhYmxlW10gPSB7Ci0gICAgICAgIHtSRl9SMDQsICAgICAgICAgIDB4NDB9LAotICAgICAgICB7UkZfUjA1LCAgICAgICAgICAweDAzfSwKLSAgICAgICAge1JGX1IwNiwgICAgICAgICAgMHgwMn0sCi0gICAgICAgIHtSRl9SMDcsICAgICAgICAgIDB4NzB9LAotICAgICAgICB7UkZfUjA5LCAgICAgICAgICAweDBGfSwKLSAgICAgICAge1JGX1IxMCwgICAgICAgICAgMHg0MX0sCi0gICAgICAgIHtSRl9SMTEsICAgICAgICAgIDB4MjF9LAotICAgICAgICB7UkZfUjEyLCAgICAgICAgICAweDdCfSwKLSAgICAgICAge1JGX1IxNCwgICAgICAgICAgMHg5MH0sCi0gICAgICAgIHtSRl9SMTUsICAgICAgICAgIDB4NTh9LAotICAgICAgICB7UkZfUjE2LCAgICAgICAgICAweEIzfSwKLSAgICAgICAge1JGX1IxNywgICAgICAgICAgMHg5Mn0sCi0gICAgICAgIHtSRl9SMTgsICAgICAgICAgIDB4MkN9LAotICAgICAgICB7UkZfUjE5LCAgICAgICAgICAweDAyfSwKLSAgICAgICAge1JGX1IyMCwgICAgICAgICAgMHhCQX0sCi0gICAgICAgIHtSRl9SMjEsICAgICAgICAgIDB4REJ9LAotICAgICAgICB7UkZfUjI0LCAgICAgICAgICAweDE2fSwKLSAgICAgICAge1JGX1IyNSwgICAgICAgICAgMHgwMX0sCi0gICAgICAgIHtSRl9SMjksICAgICAgICAgIDB4MUZ9LAotfTsKLQotVUNIQVIgTlVNX1JGX1JFR19QQVJNUyA9IChzaXplb2YoUlQzMHh4X1JGUmVnVGFibGUpIC8gc2l6ZW9mKFJFR19QQUlSKSk7Ci0KLQotCi0vLyBBbnRlbm5hIGRpdmVzaXR5IHVzZSBHUElPMyBhbmQgRUVTSyBwaW4gZm9yIGNvbnRyb2wKLS8vIEFudGVubmEgYW5kIEVFUFJPTSBhY2Nlc3MgYXJlIGJvdGggdXNpbmcgRUVTSyBwaW4sCi0vLyBUaGVyZWZvciB3ZSBzaG91bGQgYXZvaWQgYWNjZXNzaW5nIEVFU0sgYXQgdGhlIHNhbWUgdGltZQotLy8gVGhlbiByZXN0b3JlIGFudGVubmEgYWZ0ZXIgRUVQUk9NIGFjY2VzcwotLy8gVGhlIG9yaWdpbmFsIG5hbWUgb2YgdGhpcyBmdW5jdGlvbiBpcyBBc2ljU2V0UnhBbnQoKSwgbm93IGNoYW5nZSB0bwotLy9WT0lEIEFzaWNTZXRSeEFudCgKLVZPSUQgUlQzMHh4U2V0UnhBbnQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlBbnQpCi17Ci0JVUlOVDMyCVZhbHVlOwotCVVJTlQzMgl4OwotCi0JaWYgKChwQWQtPkVlcHJvbUFjY2VzcykgfHwKLQkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpCXx8Ci0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCXx8Ci0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkgfHwKLQkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JewotCQlyZXR1cm47Ci0JfQotCi0JLy8gdGhlIGFudGVubmEgc2VsZWN0aW9uIGlzIHRocm91Z2ggZmlybXdhcmUgYW5kIE1BQyByZWdpc3RlcihHUElPMykKLQlpZiAoQW50ID09IDApCi0JewotCQkvLyBNYWluIGFudGVubmEKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0JCXggfD0gKEVFU0spOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLSNlbHNlCi0JCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg3MywgMHhGRiwgMHgxLCAweDApOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJlZhbHVlKTsKLQkJVmFsdWUgJj0gfigweDA4MDgpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCBWYWx1ZSk7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBc2ljU2V0UnhBbnQsIHN3aXRjaCB0byBtYWluIGFudGVubmFcbiIpKTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gQXV4IGFudGVubmEKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0JCXggJj0gfihFRVNLKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Ci0jZWxzZQotCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NzMsIDB4RkYsIDB4MCwgMHgwKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSB+KDB4MDgwOCk7Ci0JCVZhbHVlIHw9IDB4MDg7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEdQSU9fQ1RSTF9DRkcsIFZhbHVlKTsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNTZXRSeEFudCwgc3dpdGNoIHRvIGF1eCBhbnRlbm5hXG4iKSk7Ci0JfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlGb3IgUkYgZmlsdGVyIGNhbGlicmF0aW9uIHB1cnBvc2UKLQotCUFyZ3VtZW50czoKLQkJcEFkICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBGaWx0ZXJDYWxpYnJhdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVQ0hBUglSNTV4ID0gMCwgdmFsdWUsIEZpbHRlclRhcmdldCA9IDB4MUUsIEJCUFZhbHVlPTA7Ci0JVUlOVAlsb29wID0gMCwgY291bnQgPSAwLCBsb29wY250ID0gMCwgUmVUcnkgPSAwOwotCVVDSEFSCVJGX1IyNF9WYWx1ZSA9IDA7Ci0KLQkvLyBHaXZlIGJicCBmaWx0ZXIgaW5pdGlhbCB2YWx1ZQotCXBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0ID0gMHgxRjsKLQlwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNCA9IDB4MkY7IC8vQml0WzVdIG11c3QgYmUgMSBmb3IgQlcgNDAKLQotCWRvCi0JewotCQlpZiAobG9vcCA9PSAxKQkvL0JhbmRXaWR0aCA9IDQwIE1IegotCQl7Ci0JCQkvLyBXcml0ZSAweDI3IHRvIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlcgotCQkJUkZfUjI0X1ZhbHVlID0gMHgyNzsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKLQkJCWlmIChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKXx8IElTX1JUMzM5MChwQWQpKQotCQkJCUZpbHRlclRhcmdldCA9IDB4MTU7Ci0JCQllbHNlCi0JCQkJRmlsdGVyVGFyZ2V0ID0gMHgxOTsKLQotCQkJLy8gd2hlbiBjYWxpYnJhdGUgQlc0MCwgQkJQIG1hc2sgbXVzdCBzZXQgdG8gQlc0MC4KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKLQkJCUJCUFZhbHVlJj0gKH4weDE4KTsKLQkJCUJCUFZhbHVlfD0gKDB4MTApOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOwotCi0JCQkvLyBzZXQgdG8gQlc0MAotCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsICZ2YWx1ZSk7Ci0JCQl2YWx1ZSB8PSAweDIwOwotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCB2YWx1ZSk7Ci0JCX0KLQkJZWxzZQkJCS8vQmFuZFdpZHRoID0gMjAgTUh6Ci0JCXsKLQkJCS8vIFdyaXRlIDB4MDcgdG8gUkZfUjI0IHRvIHByb2dyYW0gZmlsdGVyCi0JCQlSRl9SMjRfVmFsdWUgPSAweDA3OwotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOwotCQkJaWYgKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpfHwgSVNfUlQzMzkwKHBBZCkpCi0JCQkJRmlsdGVyVGFyZ2V0ID0gMHgxMzsKLQkJCWVsc2UKLQkJCQlGaWx0ZXJUYXJnZXQgPSAweDE2OwotCi0JCQkvLyBzZXQgdG8gQlcyMAotCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsICZ2YWx1ZSk7Ci0JCQl2YWx1ZSAmPSAofjB4MjApOwotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCB2YWx1ZSk7Ci0JCX0KLQotCQkvLyBXcml0ZSAweDAxIHRvIFJGX1IyMiB0byBlbmFibGUgYmFzZWJhbmQgbG9vcGJhY2sgbW9kZQotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgJnZhbHVlKTsKLQkJdmFsdWUgfD0gMHgwMTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIyLCB2YWx1ZSk7Ci0KLQkJLy8gV3JpdGUgMHgwMCB0byBCQlBfUjI0IHRvIHNldCBwb3dlciAmIGZyZXF1ZW5jeSBvZiBwYXNzYmFuZCB0ZXN0IHRvbmUKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIDApOwotCi0JCWRvCi0JCXsKLQkJCS8vIFdyaXRlIDB4OTAgdG8gQkJQX1IyNSB0byB0cmFuc21pdCB0ZXN0IHRvbmUKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI1LCAweDkwKTsKLQotCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJCS8vIFJlYWQgQkJQX1I1NVs2OjBdIGZvciByZWNlaXZlZCBwb3dlciwgc2V0IFI1NXggPSBCQlBfUjU1WzY6MF0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNTUsICZ2YWx1ZSk7Ci0JCQlSNTV4ID0gdmFsdWUgJiAweEZGOwotCi0JCX0gd2hpbGUgKChSZVRyeSsrIDwgMTAwKSAmJiAoUjU1eCA9PSAwKSk7Ci0KLQkJLy8gV3JpdGUgMHgwNiB0byBCQlBfUjI0IHRvIHNldCBwb3dlciAmIGZyZXF1ZW5jeSBvZiBzdG9wYmFuZCB0ZXN0IHRvbmUKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIDB4MDYpOwotCi0JCXdoaWxlKFRSVUUpCi0JCXsKLQkJCS8vIFdyaXRlIDB4OTAgdG8gQkJQX1IyNSB0byB0cmFuc21pdCB0ZXN0IHRvbmUKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI1LCAweDkwKTsKLQotCQkJLy9XZSBuZWVkIHRvIHdhaXQgZm9yIGNhbGlicmF0aW9uCi0JCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1NSwgJnZhbHVlKTsKLQkJCXZhbHVlICY9IDB4RkY7Ci0JCQlpZiAoKFI1NXggLSB2YWx1ZSkgPCBGaWx0ZXJUYXJnZXQpCi0JCQl7Ci0JCQkJUkZfUjI0X1ZhbHVlICsrOwotCQkJfQotCQkJZWxzZSBpZiAoKFI1NXggLSB2YWx1ZSkgPT0gRmlsdGVyVGFyZ2V0KQotCQkJewotCQkJCVJGX1IyNF9WYWx1ZSArKzsKLQkJCQljb3VudCArKzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLy8gcHJldmVudCBpbmZpbml0ZSBsb29wIGNhdXNlIGRyaXZlciBoYW5nLgotCQkJaWYgKGxvb3BjbnQrKyA+IDEwMCkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVE1QRmlsdGVyQ2FsaWJyYXRpb24gLSBjYW4ndCBmaW5kIGEgdmFsaWQgdmFsdWUsIGxvb3BjbnQ9JWQgc3RvcCBjYWxpYnJhdGluZyIsIGxvb3BjbnQpKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLy8gV3JpdGUgUkZfUjI0IHRvIHByb2dyYW0gZmlsdGVyCi0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7Ci0JCX0KLQotCQlpZiAoY291bnQgPiAwKQotCQl7Ci0JCQlSRl9SMjRfVmFsdWUgPSBSRl9SMjRfVmFsdWUgLSAoKGNvdW50KSA/ICgxKSA6ICgwKSk7Ci0JCX0KLQotCQkvLyBTdG9yZSBmb3IgZnV0dXJlIHVzYWdlCi0JCWlmIChsb29wY250IDwgMTAwKQotCQl7Ci0JCQlpZiAobG9vcCsrID09IDApCi0JCQl7Ci0JCQkJLy9CYW5kV2lkdGggPSAyMCBNSHoKLQkJCQlwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNCA9IChVQ0hBUilSRl9SMjRfVmFsdWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy9CYW5kV2lkdGggPSA0MCBNSHoKLQkJCQlwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNCA9IChVQ0hBUilSRl9SMjRfVmFsdWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJYnJlYWs7Ci0KLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOwotCi0JCS8vIHJlc2V0IGNvdW50Ci0JCWNvdW50ID0gMDsKLQl9IHdoaWxlKFRSVUUpOwotCi0JLy8KLQkvLyBTZXQgYmFjayB0byBpbml0aWFsIHN0YXRlCi0JLy8KLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgMCk7Ci0KLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgJnZhbHVlKTsKLQl2YWx1ZSAmPSB+KDB4MDEpOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgdmFsdWUpOwotCi0JLy8gc2V0IEJCUCBiYWNrIHRvIEJXMjAKLQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7Ci0JQkJQVmFsdWUmPSAofjB4MTgpOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBGaWx0ZXJDYWxpYnJhdGlvbiAtIENhbGlCVzIwUmZSMjQ9MHgleCwgQ2FsaUJXNDBSZlIyND0weCV4XG4iLCBwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNCwgcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQpKTsKLX0KLQotCi0vLyBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cAotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JTG9hZCBSRiBub3JtYWwgb3BlcmF0aW9uLW1vZGUgc2V0dXAKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUlQzMHh4TG9hZFJGTm9ybWFsTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVDSEFSIFJGVmFsdWU7Ci0KLQkvLyBSWDBfUEQgJiBUWDBfUEQsIFJGIFIxIHJlZ2lzdGVyIEJpdCAyICYgQml0IDMgdG8gMCBhbmQgUkZfQkxPQ0tfZW4sUlgxX1BEICYgVFgxX1BELCBCaXQwLCBCaXQgNCAmIEJpdDUgdG8gMQotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDBDKSkgfCAweDMxOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgUkZWYWx1ZSk7Ci0KLQkvLyBUWF9MTzJfZW4sIFJGIFIxNSByZWdpc3RlciBCaXQgMyB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMTUsICZSRlZhbHVlKTsKLQlSRlZhbHVlICY9ICh+MHgwOCk7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjE1LCBSRlZhbHVlKTsKLQotCS8qIG1vdmUgdG8gTklDSW5pdFJUMzB4eFJGUmVnaXN0ZXJzCi0JLy8gVFhfTE8xX2VuLCBSRiBSMTcgcmVnaXN0ZXIgQml0IDMgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjE3LCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSAmPSAofjB4MDgpOwotCS8vIHRvIGZpeCByeCBsb25nIHJhbmdlIGlzc3VlCi0JaWYgKCgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA+PSAweDAyMTEpICYmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHID09IDApKQotCXsKLQkJUkZWYWx1ZSB8PSAweDIwOwotCX0KLQkvLyBzZXQgUkZfUjE3X2JpdFsyOjBdIGVxdWFsIHRvIEVFUFJPTSBzZXR0aW5nIGF0IDB4NDhoCi0JaWYgKHBBZC0+VHhNaXhlckdhaW4yNEcgPj0gMikKLQl7Ci0JCVJGVmFsdWUgJj0gKH4weDcpOyAgLy8gY2xlYW4gYml0IFsyOjBdCi0JCVJGVmFsdWUgfD0gcEFkLT5UeE1peGVyR2FpbjI0RzsKLQl9Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjE3LCBSRlZhbHVlKTsKLQkqLwotCi0JLy8gUlhfTE8xX2VuLCBSRiBSMjAgcmVnaXN0ZXIgQml0IDMgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIwLCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSAmPSAofjB4MDgpOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMCwgUkZWYWx1ZSk7Ci0KLQkvLyBSWF9MTzJfZW4sIFJGIFIyMSByZWdpc3RlciBCaXQgMyB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsICZSRlZhbHVlKTsKLQlSRlZhbHVlICY9ICh+MHgwOCk7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCBSRlZhbHVlKTsKLQotCS8qIGFkZCBieSBqb2hubGksIHJlc2V0IFJGX1IyNyB3aGVuIGludGVyZmFjZSBkb3duICYgdXAgdG8gZml4IHRocm91Z2hwdXQgcHJvYmxlbSovCi0JLy8gTERPUkZfVkMsIFJGIFIyNyByZWdpc3RlciBCaXQgMiB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsICZSRlZhbHVlKTsKLQkvLyBUWCB0byBSWCBJUSBnbGl0Y2goUkZfUjI3KSBoYXMgYmVlbiBmaXhlZCBpbiBSVDMwNzAoRikuCi0JLy8gUmFpc2luZyBSRiB2b2x0YWdlIGlzIG5vIGxvbmdlciBuZWVkZWQgZm9yIFJUMzA3MChGKQotCWlmIChJU19SVDMwOTAocEFkKSkJLy8gUlQzMDl4IGFuZCBSVDMwNzEvNzIKLQl7Ci0JCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkKLQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHg3NykpIHwgMHgzOwotCQllbHNlCi0JCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAofjB4NzcpKTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCBSRlZhbHVlKTsKLQl9Ci0JLyogZW5kIGpvaG5saSAqLwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlMb2FkIFJGIHNsZWVwLW1vZGUgc2V0dXAKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUlQzMHh4TG9hZFJGU2xlZXBNb2RlU2V0dXAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JVUNIQVIgUkZWYWx1ZTsKLQlVSU5UMzIgTUFDVmFsdWU7Ci0KLQotCXsKLQkJLy8gUkZfQkxPQ0tfZW4uIFJGIFIxIHJlZ2lzdGVyIEJpdCAwIHRvIDAKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsICZSRlZhbHVlKTsKLQkJUkZWYWx1ZSAmPSAofjB4MDEpOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsIFJGVmFsdWUpOwotCi0JCS8vIFZDT19JQywgUkYgUjcgcmVnaXN0ZXIgQml0IDQgJiBCaXQgNSB0byAwCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCAmUkZWYWx1ZSk7Ci0JCVJGVmFsdWUgJj0gKH4weDMwKTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCBSRlZhbHVlKTsKLQotCQkvLyBJZG9oLCBSRiBSOSByZWdpc3RlciBCaXQgMSwgQml0IDIgJiBCaXQgMyB0byAwCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA5LCAmUkZWYWx1ZSk7Ci0JCVJGVmFsdWUgJj0gKH4weDBFKTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA5LCBSRlZhbHVlKTsKLQotCQkvLyBSWF9DVEJfZW4sIFJGIFIyMSByZWdpc3RlciBCaXQgNyB0byAwCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCAmUkZWYWx1ZSk7Ci0JCVJGVmFsdWUgJj0gKH4weDgwKTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCBSRlZhbHVlKTsKLQl9Ci0KLQlpZiAoSVNfUlQzMDkwKHBBZCkgfHwJLy8gSVNfUlQzMDkwIGluY2x1ZGluZyBSVDMwOXggYW5kIFJUMzA3MS83MgotCQlJU19SVDM1NzIocEFkKSB8fAotCQkoSVNfUlQzMDcwKHBBZCkgJiYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjAxKSkpCi0JewotCQl7Ci0JCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgJlJGVmFsdWUpOwotCQkJUkZWYWx1ZSB8PSAweDc3OwotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCBSRlZhbHVlKTsKLQkJfQotCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTERPX0NGRzAsICZNQUNWYWx1ZSk7Ci0JCU1BQ1ZhbHVlIHw9IDB4MUQwMDAwMDA7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIExET19DRkcwLCBNQUNWYWx1ZSk7Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlSZXZlcnNlIFJGIHNsZWVwLW1vZGUgc2V0dXAKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUlQzMHh4UmV2ZXJzZVJGU2xlZXBNb2RlU2V0dXAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JVUNIQVIgUkZWYWx1ZTsKLQlVSU5UMzIgTUFDVmFsdWU7Ci0KLQl7Ci0JCS8vIFJGX0JMT0NLX2VuLCBSRiBSMSByZWdpc3RlciBCaXQgMCB0byAxCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCAmUkZWYWx1ZSk7Ci0JCVJGVmFsdWUgfD0gMHgwMTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCBSRlZhbHVlKTsKLQotCQkvLyBWQ09fSUMsIFJGIFI3IHJlZ2lzdGVyIEJpdCA0ICYgQml0IDUgdG8gMQotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgJlJGVmFsdWUpOwotCQlSRlZhbHVlIHw9IDB4MzA7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgUkZWYWx1ZSk7Ci0KLQkJLy8gSWRvaCwgUkYgUjkgcmVnaXN0ZXIgQml0IDEsIEJpdCAyICYgQml0IDMgdG8gMQotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwOSwgJlJGVmFsdWUpOwotCQlSRlZhbHVlIHw9IDB4MEU7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwOSwgUkZWYWx1ZSk7Ci0KLQkJLy8gUlhfQ1RCX2VuLCBSRiBSMjEgcmVnaXN0ZXIgQml0IDcgdG8gMQotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgJlJGVmFsdWUpOwotCQlSRlZhbHVlIHw9IDB4ODA7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgUkZWYWx1ZSk7Ci0JfQotCi0JaWYgKElTX1JUMzA5MChwQWQpIHx8CS8vIElTX1JUMzA5MCBpbmNsdWRpbmcgUlQzMDl4IGFuZCBSVDMwNzEvNzIKLQkJSVNfUlQzNTcyKHBBZCkgfHwKLQkJSVNfUlQzMzkwKHBBZCkgfHwKLQkJKElTX1JUMzA3MChwQWQpICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIwMSkpKQotCXsKLQkJewotCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsICZSRlZhbHVlKTsKLQkJCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkKLQkJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAofjB4NzcpKSB8IDB4MzsKLQkJCWVsc2UKLQkJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAofjB4NzcpKTsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgUkZWYWx1ZSk7Ci0JCX0KLQotCQkvLyBSVDMwNzEgdmVyc2lvbiBFIGhhcyBmaXhlZCB0aGlzIGlzc3VlCi0JCWlmICgocEFkLT5OaWNDb25maWcyLmZpZWxkLkRBQ1Rlc3RCaXQgPT0gMSkgJiYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKSkKLQkJewotCQkJLy8gcGF0Y2ggdHggRVZNIGlzc3VlIHRlbXBvcmFyaWx5Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIExET19DRkcwLCAmTUFDVmFsdWUpOwotCQkJTUFDVmFsdWUgPSAoKE1BQ1ZhbHVlICYgMHhFMEZGRkZGRikgfCAweDBEMDAwMDAwKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIExET19DRkcwLCBNQUNWYWx1ZSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIExET19DRkcwLCAmTUFDVmFsdWUpOwotCQkJTUFDVmFsdWUgPSAoKE1BQ1ZhbHVlICYgMHhFMEZGRkZGRikgfCAweDAxMDAwMDAwKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIExET19DRkcwLCBNQUNWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlpZihJU19SVDM1NzIocEFkKSkKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA4LCAweDgwKTsKLX0KLS8vIGVuZCBqb2hubGkKLQotVk9JRCBSVDMweHhIYWx0QWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVJTlQzMgkJVHhQaW5DZmcgPSAweDAwMDUwRjBGOwotCi0JLy8KLQkvLyBUdXJuIG9mZiBMTkFfUEUgb3IgVFJTV19QT0wKLQkvLwotCWlmIChJU19SVDMwNzAocEFkKSB8fCBJU19SVDMwNzEocEFkKSB8fCBJU19SVDM1NzIocEFkKSkKLQl7Ci0JCWlmICgoSVNfUlQzMDcxKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkpCi0jaWZkZWYgUlRNUF9FRlVTRV9TVVBQT1JUCi0JCQkmJiAocEFkLT5iVXNlRWZ1c2UpCi0jZW5kaWYgLy8gUlRNUF9FRlVTRV9TVVBQT1JUIC8vCi0JCQkpCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGQkYwRjA7IC8vIGJpdDE4IG9mZgotCQl9Ci0JCWVsc2UKLQkJewotCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjBGMDsKLQkJfQotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKLQl9Ci19Ci0KLSNlbmRpZiAvLyBSVDMweHggLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY2hpcHMvcnQzMzcwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NoaXBzL3J0MzM3MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGVjYjA2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY2hpcHMvcnQzMzcwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlydDMzNzAuYwotCi0JQWJzdHJhY3Q6Ci0JU3BlY2lmaWMgZnVuY2l0b25zIGFuZCB2YXJpYWJsZXMgZm9yIFJUMzB4eC4KLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0JLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaWZkZWYgUlQzMzcwCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0jaWZuZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotI2Vycm9yICJZb3UgU2hvdWxkIEVuYWJsZSBjb21waWxlIGZsYWcgUlRNUF9SRl9SV19TVVBQT1JUIGZvciB0aGlzIGNoaXAiCi0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCi0KLQotVk9JRCBOSUNJbml0UlQzMzcwUkZSZWdpc3RlcnMoSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JCUlOVCBpOwotCS8vIERyaXZlciBtdXN0IHJlYWQgRUVQUk9NIHRvIGdldCBSZkljVHlwZSBiZWZvcmUgaW5pdGlhbCBSRiByZWdpc3RlcnMKLQkvLyBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKLQlpZiAoSVNfUlQzMDkwKHBBZCl8fElTX1JUMzM5MChwQWQpfHxJU19SVDM1NzIocEFkKSkKLQl7Ci0JCS8vIEluaXQgUkYgY2FsaWJyYXRpb24KLQkJLy8gRHJpdmVyIHNob3VsZCB0b2dnbGUgUkYgUjMwIGJpdDcgYmVmb3JlIGluaXQgUkYgcmVnaXN0ZXJzCi0JCVVJTlQzMiBSZlJlZyA9IDAsIGRhdGE7Ci0KLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMzAsIChQVUNIQVIpJlJmUmVnKTsKLQkJUmZSZWcgfD0gMHg4MDsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoVUNIQVIpUmZSZWcpOwotCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCQlSZlJlZyAmPSAweDdGOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzAsIChVQ0hBUilSZlJlZyk7Ci0KLQkJLy8gaW5pdCBSMjQsIFIzMQotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIDB4MEYpOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsIDB4MEYpOwotCi0JCWlmIChJU19SVDMzOTAocEFkKSkKLQkJewotCQkJLy8gcGF0Y2ggTE5BX1BFX0cxIGZhaWxlZCBpc3N1ZQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBHUElPX1NXSVRDSCwgJmRhdGEpOwotCQkJZGF0YSAmPSB+KDB4MjApOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgR1BJT19TV0lUQ0gsIGRhdGEpOwotCi0JCQkvLyBSRiByZWdpc3RlcnMgaW5pdGlhbGl6YXRpb24KLQkJCWZvciAoaSA9IDA7IGkgPCBOVU1fUkZfUkVHX1BBUk1TX09WRVJfUlQzMzkwOyBpKyspCi0JCQl7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZSZWdUYWJsZU92ZXJSVDMzOTBbaV0uUmVnaXN0ZXIsIFJGUmVnVGFibGVPdmVyUlQzMzkwW2ldLlZhbHVlKTsKLQkJCX0KLQkJfQotCi0JCS8vIHBhdGNoIExOQV9QRV9HMSBmYWlsZWQgaXNzdWUKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBHUElPX1NXSVRDSCwgJmRhdGEpOwotCQlkYXRhICY9IH4oMHgyMCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEdQSU9fU1dJVENILCBkYXRhKTsKLQotCQkvLyBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKLQkJZm9yIChpID0gMDsgaSA8IE5VTV9SRl9SRUdfUEFSTVNfT1ZFUl9SVDMzOTA7IGkrKykKLQkJewotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUlQzMHh4X1JGUmVnVGFibGVbaV0uUmVnaXN0ZXIsIFJUMzB4eF9SRlJlZ1RhYmxlW2ldLlZhbHVlKTsKLQkJfQotCi0JCS8vIERyaXZlciBzaG91bGQgc2V0IFJGIFI2IGJpdDYgb24gYmVmb3JlIGNhbGlicmF0aW9uCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA2LCAoUFVDSEFSKSZSZlJlZyk7Ci0JCVJmUmVnIHw9IDB4NDA7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKFVDSEFSKVJmUmVnKTsKLQotCQkvL0ZvciBSRiBmaWx0ZXIgQ2FsaWJyYXRpb24KLQkJUlRNUEZpbHRlckNhbGlicmF0aW9uKHBBZCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBSRiBSMjcgcmVnaXN0ZXIsIHNldCBSRiBSMjcgbXVzdCBiZSBiZWhpbmQgUlRNUEZpbHRlckNhbGlicmF0aW9uKCkKLQkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKQotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCAweDMpOwotCi0JCS8vIHNldCBsZWQgb3BlbiBkcmFpbiBlbmFibGUKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBPUFRfMTQsICZkYXRhKTsKLQkJZGF0YSB8PSAweDAxOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBPUFRfMTQsIGRhdGEpOwotCi0JCS8vIHNldCBkZWZhdWx0IGFudGVubmEgYXMgbWFpbgotCQlpZiAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApCi0JCQlBc2ljU2V0UnhBbnQocEFkLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50KTsKLQotCQkvLyBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cCwgbG9hZCBSRiBub3JtYWwgb3BlcmF0aW9uLW1vZGUgc2V0dXAKLQkJUlQzMHh4TG9hZFJGTm9ybWFsTW9kZVNldHVwKHBBZCk7Ci0JfQotCi19Ci0jZW5kaWYgLy8gUlQzMDcwIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NoaXBzL3J0MzM5MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jaGlwcy9ydDMzOTAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlZDllNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NoaXBzL3J0MzM5MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JcnQzMzkwLmMKLQotCUFic3RyYWN0OgotCVNwZWNpZmljIGZ1bmNpdG9ucyBhbmQgdmFyaWFibGVzIGZvciBSVDMweHguCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotI2lmZGVmIFJUMzM5MAotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotI2lmbmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLSNlcnJvciAiWW91IFNob3VsZCBFbmFibGUgY29tcGlsZSBmbGFnIFJUTVBfUkZfUldfU1VQUE9SVCBmb3IgdGhpcyBjaGlwIgotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCi0KLVZPSUQgTklDSW5pdFJUMzM5MFJGUmVnaXN0ZXJzKElOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCQlJTlQgaTsKLQkvLyBEcml2ZXIgbXVzdCByZWFkIEVFUFJPTSB0byBnZXQgUmZJY1R5cGUgYmVmb3JlIGluaXRpYWwgUkYgcmVnaXN0ZXJzCi0JLy8gSW5pdGlhbGl6ZSBSRiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCi0JaWYgKElTX1JUMzA5MChwQWQpfHxJU19SVDMzOTAocEFkKXx8SVNfUlQzNTcyKHBBZCkpCi0JewotCQkvLyBJbml0IFJGIGNhbGlicmF0aW9uCi0JCS8vIERyaXZlciBzaG91bGQgdG9nZ2xlIFJGIFIzMCBiaXQ3IGJlZm9yZSBpbml0IFJGIHJlZ2lzdGVycwotCQlVSU5UMzIgUmZSZWcgPSAwLCBkYXRhOwotCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoUFVDSEFSKSZSZlJlZyk7Ci0JCVJmUmVnIHw9IDB4ODA7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKFVDSEFSKVJmUmVnKTsKLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJUmZSZWcgJj0gMHg3RjsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoVUNIQVIpUmZSZWcpOwotCi0JCS8vIGluaXQgUjI0LCBSMzEKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCAweDBGKTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCAweDBGKTsKLQotCQlpZiAoSVNfUlQzMzkwKHBBZCkpCi0JCXsKLQkJCS8vIHBhdGNoIExOQV9QRV9HMSBmYWlsZWQgaXNzdWUKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19TV0lUQ0gsICZkYXRhKTsKLQkJCWRhdGEgJj0gfigweDIwKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEdQSU9fU1dJVENILCBkYXRhKTsKLQotCQkJLy8gUkYgcmVnaXN0ZXJzIGluaXRpYWxpemF0aW9uCi0JCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JGX1JFR19QQVJNU19PVkVSX1JUMzM5MDsgaSsrKQotCQkJewotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGUmVnVGFibGVPdmVyUlQzMzkwW2ldLlJlZ2lzdGVyLCBSRlJlZ1RhYmxlT3ZlclJUMzM5MFtpXS5WYWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBwYXRjaCBMTkFfUEVfRzEgZmFpbGVkIGlzc3VlCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19TV0lUQ0gsICZkYXRhKTsKLQkJZGF0YSAmPSB+KDB4MjApOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBHUElPX1NXSVRDSCwgZGF0YSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBSRiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCi0JCWZvciAoaSA9IDA7IGkgPCBOVU1fUkZfUkVHX1BBUk1TX09WRVJfUlQzMzkwOyBpKyspCi0JCXsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGUmVnVGFibGVPdmVyUlQzMzkwW2ldLlJlZ2lzdGVyLCBSRlJlZ1RhYmxlT3ZlclJUMzM5MFtpXS5WYWx1ZSk7Ci0JCX0KLQotCQkvLyBEcml2ZXIgc2hvdWxkIHNldCBSRiBSNiBiaXQ2IG9uIGJlZm9yZSBjYWxpYnJhdGlvbgotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKFBVQ0hBUikmUmZSZWcpOwotCQlSZlJlZyB8PSAweDQwOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDYsIChVQ0hBUilSZlJlZyk7Ci0KLQkJLy9Gb3IgUkYgZmlsdGVyIENhbGlicmF0aW9uCi0JCVJUTVBGaWx0ZXJDYWxpYnJhdGlvbihwQWQpOwotCi0JCS8vIEluaXRpYWxpemUgUkYgUjI3IHJlZ2lzdGVyLCBzZXQgUkYgUjI3IG11c3QgYmUgYmVoaW5kIFJUTVBGaWx0ZXJDYWxpYnJhdGlvbigpCi0JCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgMHgzKTsKLQotCQkvLyBzZXQgbGVkIG9wZW4gZHJhaW4gZW5hYmxlCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgT1BUXzE0LCAmZGF0YSk7Ci0JCWRhdGEgfD0gMHgwMTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgT1BUXzE0LCBkYXRhKTsKLQotCQkvLyBzZXQgZGVmYXVsdCBhbnRlbm5hIGFzIG1haW4KLQkJaWYgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwKQotCQkJQXNpY1NldFJ4QW50KHBBZCwgcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudCk7Ci0KLQkJLy8gYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAsIGxvYWQgUkYgbm9ybWFsIG9wZXJhdGlvbi1tb2RlIHNldHVwCi0JCVJUMzN4eExvYWRSRk5vcm1hbE1vZGVTZXR1cChwQWQpOwotCX0KLQotfQotCi0jZW5kaWYgLy8gUlQzMzkwIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NoaXBzL3J0MzN4eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jaGlwcy9ydDMzeHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmMzc2Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NoaXBzL3J0MzN4eC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM2ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JcnQzM3h4LmMKLQotCUFic3RyYWN0OgotCVNwZWNpZmljIGZ1bmNpdG9ucyBhbmQgdmFyaWFibGVzIGZvciBSVDMweHguCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotCi0jaWZkZWYgUlQzM3h4Ci0KLQotI2lmbmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLSNlcnJvciAiWW91IFNob3VsZCBFbmFibGUgY29tcGlsZSBmbGFnIFJUTVBfUkZfUldfU1VQUE9SVCBmb3IgdGhpcyBjaGlwIgotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotLy8KLS8vIFJGIHJlZ2lzdGVyIGluaXRpYWxpemF0aW9uIHNldAotLy8KLVJFR19QQUlSIFJGUmVnVGFibGVPdmVyUlQzMzkwW10gPSB7Ci0Je1JGX1IwMCwJCTB4QTB9LAotCXtSRl9SMDEsCQkweEUxfSwKLQl7UkZfUjAyLAkJMHhGMX0sCi0Je1JGX1IwMywJCTB4NjJ9LAotCXtSRl9SMDQsCQkweDQwfSwKLQl7UkZfUjA1LAkJMHg4Qn0sCi0Je1JGX1IwNiwJCTB4NDJ9LAotCXtSRl9SMDcsCQkweDM0fSwKLQl7UkZfUjA4LAkJMHgwMH0sIC8vIFJlYWQgb25seQotCXtSRl9SMDksCQkweEMwfSwKLQotCXtSRl9SMTAsCQkweDYxfSwKLQl7UkZfUjExLAkJMHgyMX0sCi0Je1JGX1IxMiwJCTB4M0J9LAotCXtSRl9SMTMsCQkweEUwfSwKLQl7UkZfUjE0LAkJMHg5MH0sCi0Je1JGX1IxNSwJCTB4NTN9LAotCXtSRl9SMTYsCQkweDBFfSwKLQl7UkZfUjE3LAkJMHg5NH0sCi0Je1JGX1IxOCwJCTB4NUN9LAotCXtSRl9SMTksCQkweDRBfSwKLQotCXtSRl9SMjAsCQkweEIyfSwKLQl7UkZfUjIxLAkJMHhGNn0sCi0Je1JGX1IyMiwJCTB4MDB9LAotCXtSRl9SMjMsCQkweDE0fSwKLQl7UkZfUjI0LAkJMHgwOH0sCi0Je1JGX1IyNSwJCTB4M0R9LAotCXtSRl9SMjYsCQkweDg1fSwKLQl7UkZfUjI3LAkJMHgwMH0sCi0Je1JGX1IyOCwJCTB4NDF9LAotCXtSRl9SMjksCQkweDhGfSwKLQl7UkZfUjMwLAkJMHgyMH0sCi0Je1JGX1IzMSwJCTB4MEZ9LAotfTsKLQotVUNIQVIgTlVNX1JGX1JFR19QQVJNU19PVkVSX1JUMzM5MD0oc2l6ZW9mKFJGUmVnVGFibGVPdmVyUlQzMzkwKSAvIHNpemVvZihSRUdfUEFJUikpOwotCi0KLQotLy8gQW50ZW5uYSBkaXZlc2l0eSB1c2UgR1BJTzMgYW5kIEVFU0sgcGluIGZvciBjb250cm9sCi0vLyBBbnRlbm5hIGFuZCBFRVBST00gYWNjZXNzIGFyZSBib3RoIHVzaW5nIEVFU0sgcGluLAotLy8gVGhlcmVmb3Igd2Ugc2hvdWxkIGF2b2lkIGFjY2Vzc2luZyBFRVNLIGF0IHRoZSBzYW1lIHRpbWUKLS8vIFRoZW4gcmVzdG9yZSBhbnRlbm5hIGFmdGVyIEVFUFJPTSBhY2Nlc3MKLS8vIFRoZSBvcmlnaW5hbCBuYW1lIG9mIHRoaXMgZnVuY3Rpb24gaXMgQXNpY1NldFJ4QW50KCksIG5vdyBjaGFuZ2UgdG8KLS8vVk9JRCBBc2ljU2V0UnhBbnQoCi0KLVZPSUQgUlQzM3h4U2V0UnhBbnQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlBbnQpCi17Ci0JVUlOVDMyCVZhbHVlOwotCVVJTlQzMgl4OwotCi0JaWYgKChwQWQtPkVlcHJvbUFjY2VzcykgfHwKLQkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpCXx8Ci0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCXx8Ci0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkgfHwKLQkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JewotCQlyZXR1cm47Ci0JfQotCi0JLy8gdGhlIGFudGVubmEgc2VsZWN0aW9uIGlzIHRocm91Z2ggZmlybXdhcmUgYW5kIE1BQyByZWdpc3RlcihHUElPMykKLQlpZiAoQW50ID09IDApCi0JewotCQkvLyBNYWluIGFudGVubmEKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0JCXggfD0gKEVFU0spOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZWYWx1ZSk7Ci0JCVZhbHVlICY9IH4oMHgwODA4KTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgR1BJT19DVFJMX0NGRywgVmFsdWUpOwotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1NldFJ4QW50LCBzd2l0Y2ggdG8gbWFpbiBhbnRlbm5hXG4iKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIEF1eCBhbnRlbm5hCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCQl4ICY9IH4oRUVTSyk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJlZhbHVlKTsKLQkJVmFsdWUgJj0gfigweDA4MDgpOwotCQlWYWx1ZSB8PSAweDA4OwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCBWYWx1ZSk7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBc2ljU2V0UnhBbnQsIHN3aXRjaCB0byBhdXggYW50ZW5uYVxuIikpOwotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJRm9yIFJGIGZpbHRlciBjYWxpYnJhdGlvbiBwdXJwb3NlCi0KLQlBcmd1bWVudHM6Ci0JCXBBZCAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QRmlsdGVyQ2FsaWJyYXRpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUNIQVIJUjU1eCA9IDAsIHZhbHVlLCBGaWx0ZXJUYXJnZXQgPSAweDFFLCBCQlBWYWx1ZT0wOwotCVVJTlQJbG9vcCA9IDAsIGNvdW50ID0gMCwgbG9vcGNudCA9IDAsIFJlVHJ5ID0gMDsKLQlVQ0hBUglSRl9SMjRfVmFsdWUgPSAwOwotCi0JLy8gR2l2ZSBiYnAgZmlsdGVyIGluaXRpYWwgdmFsdWUKLQlwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNCA9IDB4MUY7Ci0JcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQgPSAweDJGOyAvL0JpdFs1XSBtdXN0IGJlIDEgZm9yIEJXIDQwCi0KLQlkbwotCXsKLQkJaWYgKGxvb3AgPT0gMSkJLy9CYW5kV2lkdGggPSA0MCBNSHoKLQkJewotCQkJLy8gV3JpdGUgMHgyNyB0byBSRl9SMjQgdG8gcHJvZ3JhbSBmaWx0ZXIKLQkJCVJGX1IyNF9WYWx1ZSA9IDB4Mjc7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7Ci0JCQlpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCl8fCBJU19SVDMzOTAocEFkKSkKLQkJCQlGaWx0ZXJUYXJnZXQgPSAweDE1OwotCQkJZWxzZQotCQkJCUZpbHRlclRhcmdldCA9IDB4MTk7Ci0KLQkJCS8vIHdoZW4gY2FsaWJyYXRlIEJXNDAsIEJCUCBtYXNrIG11c3Qgc2V0IHRvIEJXNDAuCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7Ci0JCQlCQlBWYWx1ZSY9ICh+MHgxOCk7Ci0JCQlCQlBWYWx1ZXw9ICgweDEwKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKLQotCQkJLy8gc2V0IHRvIEJXNDAKLQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCAmdmFsdWUpOwotCQkJdmFsdWUgfD0gMHgyMDsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgdmFsdWUpOwotCQl9Ci0JCWVsc2UJCQkvL0JhbmRXaWR0aCA9IDIwIE1IegotCQl7Ci0JCQkvLyBXcml0ZSAweDA3IHRvIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlcgotCQkJUkZfUjI0X1ZhbHVlID0gMHgwNzsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKLQkJCWlmIChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKXx8IElTX1JUMzM5MChwQWQpKQotCQkJCUZpbHRlclRhcmdldCA9IDB4MTM7Ci0JCQllbHNlCi0JCQkJRmlsdGVyVGFyZ2V0ID0gMHgxNjsKLQotCQkJLy8gc2V0IHRvIEJXMjAKLQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCAmdmFsdWUpOwotCQkJdmFsdWUgJj0gKH4weDIwKTsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgdmFsdWUpOwotCQl9Ci0KLQkJLy8gV3JpdGUgMHgwMSB0byBSRl9SMjIgdG8gZW5hYmxlIGJhc2ViYW5kIGxvb3BiYWNrIG1vZGUKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjIsICZ2YWx1ZSk7Ci0JCXZhbHVlIHw9IDB4MDE7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgdmFsdWUpOwotCi0JCS8vIFdyaXRlIDB4MDAgdG8gQkJQX1IyNCB0byBzZXQgcG93ZXIgJiBmcmVxdWVuY3kgb2YgcGFzc2JhbmQgdGVzdCB0b25lCi0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCAwKTsKLQotCQlkbwotCQl7Ci0JCQkvLyBXcml0ZSAweDkwIHRvIEJCUF9SMjUgdG8gdHJhbnNtaXQgdGVzdCB0b25lCi0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNSwgMHg5MCk7Ci0KLQkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JCQkvLyBSZWFkIEJCUF9SNTVbNjowXSBmb3IgcmVjZWl2ZWQgcG93ZXIsIHNldCBSNTV4ID0gQkJQX1I1NVs2OjBdCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjU1LCAmdmFsdWUpOwotCQkJUjU1eCA9IHZhbHVlICYgMHhGRjsKLQotCQl9IHdoaWxlICgoUmVUcnkrKyA8IDEwMCkgJiYgKFI1NXggPT0gMCkpOwotCi0JCS8vIFdyaXRlIDB4MDYgdG8gQkJQX1IyNCB0byBzZXQgcG93ZXIgJiBmcmVxdWVuY3kgb2Ygc3RvcGJhbmQgdGVzdCB0b25lCi0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCAweDA2KTsKLQotCQl3aGlsZShUUlVFKQotCQl7Ci0JCQkvLyBXcml0ZSAweDkwIHRvIEJCUF9SMjUgdG8gdHJhbnNtaXQgdGVzdCB0b25lCi0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNSwgMHg5MCk7Ci0KLQkJCS8vV2UgbmVlZCB0byB3YWl0IGZvciBjYWxpYnJhdGlvbgotCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNTUsICZ2YWx1ZSk7Ci0JCQl2YWx1ZSAmPSAweEZGOwotCQkJaWYgKChSNTV4IC0gdmFsdWUpIDwgRmlsdGVyVGFyZ2V0KQotCQkJewotCQkJCVJGX1IyNF9WYWx1ZSArKzsKLQkJCX0KLQkJCWVsc2UgaWYgKChSNTV4IC0gdmFsdWUpID09IEZpbHRlclRhcmdldCkKLQkJCXsKLQkJCQlSRl9SMjRfVmFsdWUgKys7Ci0JCQkJY291bnQgKys7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIHByZXZlbnQgaW5maW5pdGUgbG9vcCBjYXVzZSBkcml2ZXIgaGFuZy4KLQkJCWlmIChsb29wY250KysgPiAxMDApCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUEZpbHRlckNhbGlicmF0aW9uIC0gY2FuJ3QgZmluZCBhIHZhbGlkIHZhbHVlLCBsb29wY250PSVkIHN0b3AgY2FsaWJyYXRpbmciLCBsb29wY250KSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIFdyaXRlIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlcgotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOwotCQl9Ci0KLQkJaWYgKGNvdW50ID4gMCkKLQkJewotCQkJUkZfUjI0X1ZhbHVlID0gUkZfUjI0X1ZhbHVlIC0gKChjb3VudCkgPyAoMSkgOiAoMCkpOwotCQl9Ci0KLQkJLy8gU3RvcmUgZm9yIGZ1dHVyZSB1c2FnZQotCQlpZiAobG9vcGNudCA8IDEwMCkKLQkJewotCQkJaWYgKGxvb3ArKyA9PSAwKQotCQkJewotCQkJCS8vQmFuZFdpZHRoID0gMjAgTUh6Ci0JCQkJcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQgPSAoVUNIQVIpUkZfUjI0X1ZhbHVlOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vQmFuZFdpZHRoID0gNDAgTUh6Ci0JCQkJcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQgPSAoVUNIQVIpUkZfUjI0X1ZhbHVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCWJyZWFrOwotCi0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKLQotCQkvLyByZXNldCBjb3VudAotCQljb3VudCA9IDA7Ci0JfSB3aGlsZShUUlVFKTsKLQotCS8vCi0JLy8gU2V0IGJhY2sgdG8gaW5pdGlhbCBzdGF0ZQotCS8vCi0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIDApOwotCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjIsICZ2YWx1ZSk7Ci0JdmFsdWUgJj0gfigweDAxKTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjIsIHZhbHVlKTsKLQotCS8vIHNldCBCQlAgYmFjayB0byBCVzIwCi0JUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwotCUJCUFZhbHVlJj0gKH4weDE4KTsKLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QRmlsdGVyQ2FsaWJyYXRpb24gLSBDYWxpQlcyMFJmUjI0PTB4JXgsIENhbGlCVzQwUmZSMjQ9MHgleFxuIiwgcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQsIHBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0KSk7Ci19Ci0KLQotLy8gYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAKLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUxvYWQgUkYgbm9ybWFsIG9wZXJhdGlvbi1tb2RlIHNldHVwCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFJUMzN4eExvYWRSRk5vcm1hbE1vZGVTZXR1cCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVQ0hBUiBSRlZhbHVlOwotCi0JLy8gUlgwX1BEICYgVFgwX1BELCBSRiBSMSByZWdpc3RlciBCaXQgMiAmIEJpdCAzIHRvIDAgYW5kIFJGX0JMT0NLX2VuLFJYMV9QRCAmIFRYMV9QRCwgQml0MCwgQml0IDQgJiBCaXQ1IHRvIDEKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgJlJGVmFsdWUpOwotCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHgwQykpIHwgMHgzMTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsIFJGVmFsdWUpOwotCi0JLy8gVFhfTE8yX2VuLCBSRiBSMTUgcmVnaXN0ZXIgQml0IDMgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjE1LCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSAmPSAofjB4MDgpOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxNSwgUkZWYWx1ZSk7Ci0KLQkvKiBtb3ZlIHRvIE5JQ0luaXRSVDMweHhSRlJlZ2lzdGVycwotCS8vIFRYX0xPMV9lbiwgUkYgUjE3IHJlZ2lzdGVyIEJpdCAzIHRvIDAKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IxNywgJlJGVmFsdWUpOwotCVJGVmFsdWUgJj0gKH4weDA4KTsKLQkvLyB0byBmaXggcnggbG9uZyByYW5nZSBpc3N1ZQotCWlmICgoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPj0gMHgwMjExKSAmJiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRyA9PSAwKSkKLQl7Ci0JCVJGVmFsdWUgfD0gMHgyMDsKLQl9Ci0JLy8gc2V0IFJGX1IxN19iaXRbMjowXSBlcXVhbCB0byBFRVBST00gc2V0dGluZyBhdCAweDQ4aAotCWlmIChwQWQtPlR4TWl4ZXJHYWluMjRHID49IDIpCi0JewotCQlSRlZhbHVlICY9ICh+MHg3KTsgIC8vIGNsZWFuIGJpdCBbMjowXQotCQlSRlZhbHVlIHw9IHBBZC0+VHhNaXhlckdhaW4yNEc7Ci0JfQotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxNywgUkZWYWx1ZSk7Ci0JKi8KLQotCS8vIFJYX0xPMV9lbiwgUkYgUjIwIHJlZ2lzdGVyIEJpdCAzIHRvIDAKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMCwgJlJGVmFsdWUpOwotCVJGVmFsdWUgJj0gKH4weDA4KTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjAsIFJGVmFsdWUpOwotCi0JLy8gUlhfTE8yX2VuLCBSRiBSMjEgcmVnaXN0ZXIgQml0IDMgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSAmPSAofjB4MDgpOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgUkZWYWx1ZSk7Ci0KLQkvKiBhZGQgYnkgam9obmxpLCByZXNldCBSRl9SMjcgd2hlbiBpbnRlcmZhY2UgZG93biAmIHVwIHRvIGZpeCB0aHJvdWdocHV0IHByb2JsZW0qLwotCS8vIExET1JGX1ZDLCBSRiBSMjcgcmVnaXN0ZXIgQml0IDIgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCAmUkZWYWx1ZSk7Ci0JLy8gVFggdG8gUlggSVEgZ2xpdGNoKFJGX1IyNykgaGFzIGJlZW4gZml4ZWQgaW4gUlQzMDcwKEYpLgotCS8vIFJhaXNpbmcgUkYgdm9sdGFnZSBpcyBubyBsb25nZXIgbmVlZGVkIGZvciBSVDMwNzAoRikKLQlpZiAoSVNfUlQzMDkwKHBBZCkpCS8vIFJUMzA5eCBhbmQgUlQzMDcxLzcyCi0JewotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpCi0JCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAofjB4NzcpKSB8IDB4MzsKLQkJZWxzZQotCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSk7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgUkZWYWx1ZSk7Ci0JfQotCS8qIGVuZCBqb2hubGkgKi8KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JTG9hZCBSRiBzbGVlcC1tb2RlIHNldHVwCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFJUMzN4eExvYWRSRlNsZWVwTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVDSEFSIFJGVmFsdWU7Ci0JVUlOVDMyIE1BQ1ZhbHVlOwotCi0KLQl7Ci0JCS8vIFJGX0JMT0NLX2VuLiBSRiBSMSByZWdpc3RlciBCaXQgMCB0byAwCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCAmUkZWYWx1ZSk7Ci0JCVJGVmFsdWUgJj0gKH4weDAxKTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCBSRlZhbHVlKTsKLQotCQkvLyBWQ09fSUMsIFJGIFI3IHJlZ2lzdGVyIEJpdCA0ICYgQml0IDUgdG8gMAotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgJlJGVmFsdWUpOwotCQlSRlZhbHVlICY9ICh+MHgzMCk7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgUkZWYWx1ZSk7Ci0KLQkJLy8gSWRvaCwgUkYgUjkgcmVnaXN0ZXIgQml0IDEsIEJpdCAyICYgQml0IDMgdG8gMAotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwOSwgJlJGVmFsdWUpOwotCQlSRlZhbHVlICY9ICh+MHgwRSk7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwOSwgUkZWYWx1ZSk7Ci0KLQkJLy8gUlhfQ1RCX2VuLCBSRiBSMjEgcmVnaXN0ZXIgQml0IDcgdG8gMAotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgJlJGVmFsdWUpOwotCQlSRlZhbHVlICY9ICh+MHg4MCk7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgUkZWYWx1ZSk7Ci0JfQotCi0JaWYgKElTX1JUMzA5MChwQWQpIHx8CS8vIElTX1JUMzA5MCBpbmNsdWRpbmcgUlQzMDl4IGFuZCBSVDMwNzEvNzIKLQkJSVNfUlQzNTcyKHBBZCkgfHwKLQkJSVNfUlQzMzkwKHBBZCkgfHwKLQkJKElTX1JUMzA3MChwQWQpICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIwMSkpKQotCXsKLQkJewotCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsICZSRlZhbHVlKTsKLQkJCVJGVmFsdWUgfD0gMHg3NzsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgUkZWYWx1ZSk7Ci0JCX0KLQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIExET19DRkcwLCAmTUFDVmFsdWUpOwotCQlNQUNWYWx1ZSB8PSAweDFEMDAwMDAwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgTUFDVmFsdWUpOwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JUmV2ZXJzZSBSRiBzbGVlcC1tb2RlIHNldHVwCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFJUMzN4eFJldmVyc2VSRlNsZWVwTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVDSEFSIFJGVmFsdWU7Ci0JVUlOVDMyIE1BQ1ZhbHVlOwotCi0JewotCQkvLyBSRl9CTE9DS19lbiwgUkYgUjEgcmVnaXN0ZXIgQml0IDAgdG8gMQotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgJlJGVmFsdWUpOwotCQlSRlZhbHVlIHw9IDB4MDE7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgUkZWYWx1ZSk7Ci0KLQkJLy8gVkNPX0lDLCBSRiBSNyByZWdpc3RlciBCaXQgNCAmIEJpdCA1IHRvIDEKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsICZSRlZhbHVlKTsKLQkJUkZWYWx1ZSB8PSAweDMwOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsIFJGVmFsdWUpOwotCi0JCS8vIElkb2gsIFJGIFI5IHJlZ2lzdGVyIEJpdCAxLCBCaXQgMiAmIEJpdCAzIHRvIDEKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDksICZSRlZhbHVlKTsKLQkJUkZWYWx1ZSB8PSAweDBFOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDksIFJGVmFsdWUpOwotCi0JCS8vIFJYX0NUQl9lbiwgUkYgUjIxIHJlZ2lzdGVyIEJpdCA3IHRvIDEKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsICZSRlZhbHVlKTsKLQkJUkZWYWx1ZSB8PSAweDgwOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsIFJGVmFsdWUpOwotCX0KLQotCWlmIChJU19SVDMwOTAocEFkKSB8fAkvLyBJU19SVDMwOTAgaW5jbHVkaW5nIFJUMzA5eCBhbmQgUlQzMDcxLzcyCi0JCUlTX1JUMzU3MihwQWQpIHx8Ci0JCUlTX1JUMzM5MChwQWQpIHx8Ci0JCShJU19SVDMwNzAocEFkKSAmJiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMDEpKSkKLQl7Ci0JCXsKLQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCAmUkZWYWx1ZSk7Ci0JCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpCi0JCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSkgfCAweDM7Ci0JCQllbHNlCi0JCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSk7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIFJGVmFsdWUpOwotCQl9Ci0KLQkJLy8gUlQzMDcxIHZlcnNpb24gRSBoYXMgZml4ZWQgdGhpcyBpc3N1ZQotCQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5EQUNUZXN0Qml0ID09IDEpICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkpCi0JCXsKLQkJCS8vIHBhdGNoIHR4IEVWTSBpc3N1ZSB0ZW1wb3JhcmlseQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJk1BQ1ZhbHVlKTsKLQkJCU1BQ1ZhbHVlID0gKChNQUNWYWx1ZSAmIDB4RTBGRkZGRkYpIHwgMHgwRDAwMDAwMCk7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgTUFDVmFsdWUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJk1BQ1ZhbHVlKTsKLQkJCU1BQ1ZhbHVlID0gKChNQUNWYWx1ZSAmIDB4RTBGRkZGRkYpIHwgMHgwMTAwMDAwMCk7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgTUFDVmFsdWUpOwotCQl9Ci0JfQotCi0JaWYoSVNfUlQzNTcyKHBBZCkpCi0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwOCwgMHg4MCk7Ci19Ci0vLyBlbmQgam9obmxpCi0KLVZPSUQgUlQzM3h4SGFsdEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVSU5UMzIJCVR4UGluQ2ZnID0gMHgwMDA1MEYwRjsKLQotCS8vCi0JLy8gVHVybiBvZmYgTE5BX1BFIG9yIFRSU1dfUE9MCi0JLy8KLQlpZiAoSVNfUlQzMDcwKHBBZCkgfHwgSVNfUlQzMDcxKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCl8fElTX1JUMzU3MihwQWQpKQotCXsKLQkvL0tIPyBCb3RoIHN1cHBvcnQgMzM5MCB1c2IgYW5kICBQQ0kKLQkJaWYgKChJU19SVDMwNzEocEFkKSB8fCBJU19SVDM1NzIocEFkKXx8SVNfUlQzMzkwKHBBZCkpCi0jaWZkZWYgUlRNUF9FRlVTRV9TVVBQT1JUCi0JCQkmJiAocEFkLT5iVXNlRWZ1c2UpCi0jZW5kaWYgLy8gUlRNUF9FRlVTRV9TVVBQT1JUIC8vCi0JCQkpCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGQkYwRjA7IC8vIGJpdDE4IG9mZgotCQl9Ci0JCWVsc2UKLQkJewotCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjBGMDsKLQkJfQotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKLQl9Ci19Ci0KLSNlbmRpZiAvLyBSVDMweHggLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY2hsaXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NobGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDNjYjQ3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY2hsaXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBjaGxpc3QuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUZvbmNoaSBXdSAgIDIwMDctMTItMTkgICAgY3JlYXRlZAotKi8KLQotI2lmbmRlZiBfX0NITElTVF9IX18KLSNkZWZpbmUgX19DSExJU1RfSF9fCi0KLSNpbmNsdWRlICJydG1wX3R5cGUuaCIKLSNpbmNsdWRlICJydG1wX2RlZi5oIgotCi0KLSNkZWZpbmUgT0RPUgkJCTAKLSNkZWZpbmUgSURPUgkJCTEKLSNkZWZpbmUgQk9USAkJCTIKLQotI2RlZmluZSBCQU5EXzVHICAgICAgICAgMAotI2RlZmluZSBCQU5EXzI0RyAgICAgICAgMQotI2RlZmluZSBCQU5EX0JPVEggICAgICAgMgotCi10eXBlZGVmIHN0cnVjdCBfQ0hfREVTUCB7Ci0JVUNIQVIgRmlyc3RDaGFubmVsOwotCVVDSEFSIE51bU9mQ2g7Ci0JQ0hBUiBNYXhUeFB3cjsJCQkvLyBkQm0KLQlVQ0hBUiBHZW9ncmFwaHk7CQkJLy8gMDpvdXQgZG9vciwgMTppbiBkb29yLCAyOmJvdGgKLQlCT09MRUFOIERmc1JlcTsJCQkvLyBEZnMgcmVxdWlyZSwgMDogTm8sIDE6IHllcy4KLX0gQ0hfREVTUCwgKlBDSF9ERVNQOwotCi10eXBlZGVmIHN0cnVjdCBfQ0hfUkVHSU9OIHsKLQlVQ0hBUiBDb3VudFJlZ1szXTsKLQlVQ0hBUiBEZnNUeXBlOwkJCS8vIDA6IENFLCAxOiBGQ0MsIDI6IEpBUCwgMzpKQVBfVzUzLCBKQVBfVzU2Ci0JQ0hfREVTUCBDaERlc3BbMTBdOwotfSBDSF9SRUdJT04sICpQQ0hfUkVHSU9OOwotCi1leHRlcm4gQ0hfUkVHSU9OIENoUmVnaW9uW107Ci0KLXR5cGVkZWYgc3RydWN0IF9DSF9GUkVRX01BUF97Ci0JVUlOVDE2CQljaGFubmVsOwotCVVJTlQxNgkJZnJlcUtIejsKLX1DSF9GUkVRX01BUDsKLQotZXh0ZXJuIENIX0ZSRVFfTUFQIENIX0haX0lEX01BUFtdOwotZXh0ZXJuIGludCBDSF9IWl9JRF9NQVBfTlVNOwotCi0KLSNkZWZpbmUgICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihfY2gsIF9raHopCQkJCQlcCi0JCWRvewkJCQkJCQkJCQkJCQlcCi0JCQlpbnQgX2NoSWR4OwkJCQkJCQkJCQkJXAotCQkJZm9yIChfY2hJZHggPSAwOyBfY2hJZHggPCBDSF9IWl9JRF9NQVBfTlVNOyBfY2hJZHgrKylcCi0JCQl7CQkJCQkJCQkJCQkJCVwKLQkJCQlpZiAoKF9jaCkgPT0gQ0hfSFpfSURfTUFQW19jaElkeF0uY2hhbm5lbCkJCQlcCi0JCQkJewkJCQkJCQkJCQkJCVwKLQkJCQkJKF9raHopID0gQ0hfSFpfSURfTUFQW19jaElkeF0uZnJlcUtIeiAqIDEwMDA7CVwKLQkJCQkJYnJlYWs7CQkJCQkJCQkJCVwKLQkJCQl9CQkJCQkJCQkJCQkJXAotCQkJfQkJCQkJCQkJCQkJCQlcCi0JCQlpZiAoX2NoSWR4ID09IENIX0haX0lEX01BUF9OVU0pCQkJCQlcCi0JCQkJKF9raHopID0gMjQxMjAwMDsJCQkJCQkJCQlcCi0gICAgICAgICAgICB9d2hpbGUoMCkKLQotI2RlZmluZSAgICAgTUFQX0tIWl9UT19DSEFOTkVMX0lEKF9raHosIF9jaCkgICAgICAgICAgICAgICAgIFwKLQkJZG97CQkJCQkJCQkJCQkJCVwKLQkJCWludCBfY2hJZHg7CQkJCQkJCQkJCQlcCi0JCQlmb3IgKF9jaElkeCA9IDA7IF9jaElkeCA8IENIX0haX0lEX01BUF9OVU07IF9jaElkeCsrKVwKLQkJCXsJCQkJCQkJCQkJCQkJXAotCQkJCWlmICgoX2toeikgPT0gQ0hfSFpfSURfTUFQW19jaElkeF0uZnJlcUtIeikJCQlcCi0JCQkJewkJCQkJCQkJCQkJCVwKLQkJCQkJKF9jaCkgPSBDSF9IWl9JRF9NQVBbX2NoSWR4XS5jaGFubmVsOwkJCVwKLQkJCQkJYnJlYWs7CQkJCQkJCQkJCVwKLQkJCQl9CQkJCQkJCQkJCQkJXAotCQkJfQkJCQkJCQkJCQkJCQlcCi0JCQlpZiAoX2NoSWR4ID09IENIX0haX0lEX01BUF9OVU0pCQkJCQlcCi0JCQkJKF9jaCkgPSAxOwkJCQkJCQkJCQkJXAotCQl9d2hpbGUoMCkKLQotCi1WT0lEIEJ1aWxkQ2hhbm5lbExpc3RFeCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgQnVpbGRCZWFjb25DaExpc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwQnVmLAotCU9VVAlQVUxPTkcgcEJ1Zkxlbik7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLVZPSUQgTl9DaGFubmVsQ2hlY2soCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIE5fU2V0Q2VuQ2goCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1VSU5UOCBHZXRDdW50cnlNYXhUeFB3cigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVSU5UOCBjaGFubmVsKTsKLQotI2VuZGlmIC8vIF9fQ0hMSVNUX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vYWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9hY3Rpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUzYjBhMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9hY3Rpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDEwNTcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLQlhY3Rpb24uYwotCi0gICAgQWJzdHJhY3Q6Ci0gICAgSGFuZGxlIGFzc29jaWF0aW9uIHJlbGF0ZWQgcmVxdWVzdHMgZWl0aGVyIGZyb20gV1NUQSBvciBmcm9tIGxvY2FsIE1MTUUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JSmFuIExlZQkJMjAwNgkJY3JlYXRlZCBmb3IgcnQyODYwCi0gKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotI2luY2x1ZGUgIi4uL2FjdGlvbi5oIgotCi0KLXN0YXRpYyBWT0lEIFJlc2VydmVkQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0Ci0gICAgUGFyYW1ldGVyczoKLSAgICAgICAgUyAtIHBvaW50ZXIgdG8gdGhlIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKLSAgICBOb3RlOgotICAgICAgICBUaGUgc3RhdGUgbWFjaGluZSBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTT0NfSURMRQotICAgICAgICBNVDJfTUxNRV9ESVNBU1NPQ19SRVEgICAgbWxtZV9kaXNhc3NvY19yZXFfYWN0aW9uCi0gICAgICAgIE1UMl9QRUVSX0RJU0FTU09DX1JFUSAgICBwZWVyX2Rpc2Fzc29jX2FjdGlvbgotICAgICAgICBNVDJfUEVFUl9BU1NPQ19SRVEgICAgICAgZHJvcAotICAgICAgICBNVDJfUEVFUl9SRUFTU09DX1JFUSAgICAgZHJvcAotICAgICAgICBNVDJfQ0xTM0VSUiAgICAgICAgICAgICAgY2xzM2Vycl9hY3Rpb24KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFjdGlvblN0YXRlTWFjaGluZUluaXQoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gICAgSU4gIFNUQVRFX01BQ0hJTkUgKlMsCi0gICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQotewotCVN0YXRlTWFjaGluZUluaXQoUywgKFNUQVRFX01BQ0hJTkVfRlVOQyAqKVRyYW5zLCBNQVhfQUNUX1NUQVRFLCBNQVhfQUNUX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBBQ1RfSURMRSwgQUNUX01BQ0hJTkVfQkFTRSk7Ci0KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1NQRUNUUlVNX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclNwZWN0cnVtQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1FPU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJRT1NBY3Rpb24pOwotCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9ETFNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylSZXNlcnZlZEFjdGlvbik7Ci0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfRExTX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRMU0FjdGlvbik7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX0JBX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJBQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX0hUX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckhUQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX0FERF9CQV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVBRERCQUFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9PUklfREVMQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lREVMQkFBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfUkVDX0RFTEJBX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURFTEJBQWN0aW9uKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfUFVCTElDX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclB1YmxpY0FjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9STV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJSTUFjdGlvbik7Ci0KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX1FPU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVRT1NBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfRExTX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURMU0FjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfQUNUX0lOVkFMSUQsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUludmFsaWRBY3Rpb24pOwotCi0KLX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVk9JRCBNbG1lQUREQkFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotCi17Ci0JTUxNRV9BRERCQV9SRVFfU1RSVUNUICpwSW5mbzsKLQlVQ0hBUiAgICAgICAgICAgQWRkcls2XTsKLQlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKLQlVTE9ORwkJSWR4OwotCUZSQU1FX0FEREJBX1JFUSAgRnJhbWU7Ci0JVUxPTkcJCUZyYW1lTGVuOwotCUJBX09SSV9FTlRSWQkJCSpwQkFFbnRyeSA9IE5VTEw7Ci0KLQlwSW5mbyA9IChNTE1FX0FEREJBX1JFUV9TVFJVQ1QgKilFbGVtLT5Nc2c7Ci0JTmRpc1plcm9NZW1vcnkoJkZyYW1lLCBzaXplb2YoRlJBTUVfQUREQkFfUkVRKSk7Ci0KLQlpZihNbG1lQWRkQkFSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcikpCi0JewotCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIDEuIGZpbmQgZW50cnkKLQkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQkFPcmlXY2lkQXJyYXlbcEluZm8tPlRJRF07Ci0JCWlmIChJZHggPT0gMCkKLQkJewotCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBjYW4ndCBmaW5kIEJBT3JpRW50cnkgXG4iKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07Ci0JCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQlpZiAoQURIT0NfT04ocEFkKSkKLQkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEluZm8tPnBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQllbHNlCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uVmFsaWRBc0RscykKLQkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEluZm8tPnBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQllbHNlCi0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBJbmZvLT5wQWRkcik7Ci0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfQkE7Ci0JCUZyYW1lLkFjdGlvbiA9IEFEREJBX1JFUTsKLQkJRnJhbWUuQmFQYXJtLkFNU0RVU3VwcG9ydGVkID0gMDsKLQkJRnJhbWUuQmFQYXJtLkJBUG9saWN5ID0gSU1NRURfQkE7Ci0JCUZyYW1lLkJhUGFybS5USUQgPSBwSW5mby0+VElEOwotCQlGcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IHBJbmZvLT5CYUJ1ZlNpemU7Ci0JCUZyYW1lLlRva2VuID0gcEluZm8tPlRva2VuOwotCQlGcmFtZS5UaW1lT3V0VmFsdWUgPSBwSW5mby0+VGltZU91dFZhbHVlOwotCQlGcmFtZS5CYVN0YXJ0U2VxLmZpZWxkLkZyYWdOdW0gPSAwOwotCQlGcmFtZS5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxID0gcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uVHhTZXFbcEluZm8tPlRJRF07Ci0KLQkJKihVU0hPUlQgKikoJkZyYW1lLkJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmRnJhbWUuQmFQYXJtKSk7Ci0JCUZyYW1lLlRpbWVPdXRWYWx1ZSA9IGNwdTJsZTE2KEZyYW1lLlRpbWVPdXRWYWx1ZSk7Ci0JCUZyYW1lLkJhU3RhcnRTZXEud29yZCA9IGNwdTJsZTE2KEZyYW1lLkJhU3RhcnRTZXEud29yZCk7Ci0KLQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCSAgICZGcmFtZUxlbiwKLQkJICAgICAgICAgICAgICBzaXplb2YoRlJBTUVfQUREQkFfUkVRKSwgJkZyYW1lLAotCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLQotCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIChNR01UX1VTRV9RVUVVRV9GTEFHIHwgTWFwVXNlclByaW9yaXR5VG9BY2Nlc3NDYXRlZ29yeVtwSW5mby0+VElEXSksIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQotCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBIC0gU2VuZCBBRERCQSByZXF1ZXN0LiBTdGFydFNlcSA9ICV4LCAgRnJhbWVMZW4gPSAlbGQuIEJ1ZlNpemUgPSAlZFxuIiwgRnJhbWUuQmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSwgRnJhbWVMZW4sIEZyYW1lLkJhUGFybS5CdWZTaXplKSk7Ci0gICAgfQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIHNlbmQgREVMQkEgYW5kIGRlbGV0ZSBCYUVudHJ5IGlmIGFueQotICAgIFBhcmFtZXRyczoKLSAgICAgICAgRWxlbSAtIE1MTUUgbWVzc2FnZSBNTE1FX0RFTEJBX1JFUV9TVFJVQ1QKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lREVMQkFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAqcEluZm87Ci0JUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JUFVDSEFSCQkgICBwT3V0QnVmZmVyMiA9IE5VTEw7Ci0JTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7Ci0JVUxPTkcJCUlkeDsKLQlGUkFNRV9ERUxCQV9SRVEgIEZyYW1lOwotCVVMT05HCQlGcmFtZUxlbjsKLQlGUkFNRV9CQVIJRnJhbWVCYXI7Ci0KLQlwSW5mbyA9IChNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgKilFbGVtLT5Nc2c7Ci0JLy8gbXVzdCBzZW5kIGJhY2sgREVMQkEKLQlOZGlzWmVyb01lbW9yeSgmRnJhbWUsIHNpemVvZihGUkFNRV9ERUxCQV9SRVEpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZURFTEJBQWN0aW9uKCksIEluaXRpYXRvciglZCkgXG4iLCBwSW5mby0+SW5pdGlhdG9yKSk7Ci0KLQlpZihNbG1lRGVsQkFSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCi0JewotCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIDEuIFxuIikpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyMik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkJBIC0gTWxtZURFTEJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCAyLiBcbiIpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFNFTkQgQkFSIChTZW5kIEJBUiB0byByZWZyZXNoIHBlZXIgcmVvcmRlcmluZyBidWZmZXIuKQotCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5CQU9yaVdjaWRBcnJheVtwSW5mby0+VElEXTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJQmFySGVhZGVySW5pdChwQWQsICZGcmFtZUJhciwgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlR4U2VxW3BJbmZvLT5USURdOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQkJRnJhbWVCYXIuQmFyQ29udHJvbC5USUQgPSBwSW5mby0+VElEOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQkJRnJhbWVCYXIuQmFyQ29udHJvbC5BQ0tQb2xpY3kgPSBJTU1FRF9CQTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCi0JCUZyYW1lQmFyLkJhckNvbnRyb2wuQ29tcHJlc3NlZCA9IDE7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCQlGcmFtZUJhci5CYXJDb250cm9sLk1USUQgPSAwOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyMiwJCQkJJkZyYW1lTGVuLAotCQkJCQkgIHNpemVvZihGUkFNRV9CQVIpLAkgICZGcmFtZUJhciwKLQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyMiwgRnJhbWVMZW4pOwotCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIyKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIC4gU2VuZCBCQVIgdG8gcmVmcmVzaCBwZWVyIHJlb3JkZXJpbmcgYnVmZmVyIFxuIikpOwotCi0JCS8vIFNFTkQgREVMQkEgRlJBTUUKLQkJRnJhbWVMZW4gPSAwOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQlpZiAoQURIT0NfT04ocEFkKSkKLQkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQkJZWxzZQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlZhbGlkQXNEbHMpCi0JCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCWVsc2UKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCAgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIpOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfQkE7Ci0JCUZyYW1lLkFjdGlvbiA9IERFTEJBOwotCQlGcmFtZS5EZWxiYVBhcm0uSW5pdGlhdG9yID0gcEluZm8tPkluaXRpYXRvcjsKLQkJRnJhbWUuRGVsYmFQYXJtLlRJRCA9IHBJbmZvLT5USUQ7Ci0JCUZyYW1lLlJlYXNvbkNvZGUgPSAzOTsgLy8gVGltZSBPdXQKLQkJKihVU0hPUlQgKikoJkZyYW1lLkRlbGJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmRnJhbWUuRGVsYmFQYXJtKSk7Ci0JCUZyYW1lLlJlYXNvbkNvZGUgPSBjcHUybGUxNihGcmFtZS5SZWFzb25Db2RlKTsKLQotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJICAgICAgICAgICAgICBzaXplb2YoRlJBTUVfREVMQkFfUkVRKSwgICAgJkZyYW1lLAotCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSAuIDMgREVMQkEgc2VudC4gSW5pdGlhdG9yKCVkKVxuIiwgcEluZm8tPkluaXRpYXRvcikpOwotCX0KLX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotVk9JRCBNbG1lUU9TQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLX0KLQotVk9JRCBNbG1lRExTQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLX0KLQotVk9JRCBNbG1lSW52YWxpZEFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JLy9QVUNIQVIJCSAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCS8vUmV0dXJuIHRoZSByZWNlaXZpbmcgZnJhbWUgZXhjZXB0IHRoZSBNU0Igb2YgY2F0ZWdvcnkgZmlsZWQgc2V0IHRvIDEuICA3LjMuMS4xMQotfQotCi1WT0lEIFBlZXJRT1NBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotfQotCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi1WT0lEIFBlZXJETFNBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVDSEFSCUFjdGlvbiA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzFdOwotCi0Jc3dpdGNoKEFjdGlvbikKLQl7Ci0JCWNhc2UgQUNUSU9OX0RMU19SRVFVRVNUOgotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCVBlZXJEbHNSZXFBY3Rpb24ocEFkLCBFbGVtKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNUSU9OX0RMU19SRVNQT05TRToKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQlQZWVyRGxzUnNwQWN0aW9uKHBBZCwgRWxlbSk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQlicmVhazsKLQotCQljYXNlIEFDVElPTl9ETFNfVEVBUkRPV046Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJUGVlckRsc1RlYXJEb3duQWN0aW9uKHBBZCwgRWxlbSk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQlicmVhazsKLQl9Ci19Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1WT0lEIFBlZXJCQUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07Ci0KLQlzd2l0Y2goQWN0aW9uKQotCXsKLQkJY2FzZSBBRERCQV9SRVE6Ci0JCQlQZWVyQWRkQkFSZXFBY3Rpb24ocEFkLEVsZW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUREQkFfUkVTUDoKLQkJCVBlZXJBZGRCQVJzcEFjdGlvbihwQWQsRWxlbSk7Ci0JCQlicmVhazsKLQkJY2FzZSBERUxCQToKLQkJCVBlZXJEZWxCQUFjdGlvbihwQWQsRWxlbSk7Ci0JCQlicmVhazsKLQl9Ci19Ci0KLQotI2lmZGVmIERPVDExTl9EUkFGVDMKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotVk9JRCBTdGFQdWJsaWNBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgQnNzMjA0MENvZXhpc3QpCi17Ci0JQlNTXzIwNDBfQ09FWElTVF9JRQkJQnNzQ29leGlzdDsKLQlNTE1FX1NDQU5fUkVRX1NUUlVDVAkJCVNjYW5SZXE7Ci0KLQlCc3NDb2V4aXN0LndvcmQgPSBCc3MyMDQwQ29leGlzdDsKLQkvLyBBUCBhc2tzIFN0YXRpb24gdG8gcmV0dXJuIGEgMjAvNDAgQlNTIENvZXhpc3RlbmNlIG1nbXQgZnJhbWUuICBTbyB3ZSBmaXJzdCBzdGFydHMgYSBzY2FuLCB0aGVuIHNlbmQgYmFjayAyMC80MCBCU1MgQ29leGlzdGVuY2UgbWdtdCBmcmFtZQotCWlmICgoQnNzQ29leGlzdC5maWVsZC5JbmZvUmVxID09IDEpICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NDQU5fMjA0MCkpKQotCXsKLQkJLy8gQ2xlYXIgcmVjb3JkIGZpcnN0LiAgQWZ0ZXIgc2NhbiAsIHdpbGwgdXBkYXRlIHRob3NlIGJpdCBhbmQgc2VuZCBiYWNrIHRvIHRyYW5zbWl0ZXIuCi0JCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkluZm9SZXEgPSAxOwotCQlwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5JbnRvbGVyYW50NDAgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5CU1MyMFdpZHRoUmVxID0gMDsKLQkJLy8gRmlsbCBvdXQgc3R1ZmYgZm9yIHNjYW4gcmVxdWVzdAotCQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgWmVyb1NzaWQsIDAsIEJTU19BTlksIFNDQU5fMjA0MF9CU1NfQ09FWElTVCk7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOwotCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47Ci0JfQotfQotCi0KLS8qCi1EZXNjcmlwdGlvbiA6IEJ1aWxkIEludG9sZXJhbnQgQ2hhbm5lbCBSZXJwb3QgZnJvbSBUcmlnZ2VyIGV2ZW50IHRhYmxlLgotcmV0dXJuIDogaG93IG1hbnkgYnl0ZXMgY29waWVkLgotKi8KLVVMT05HIEJ1aWxkSW50b2xlcmFudENoYW5uZWxSZXAoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gICAgUFVDSEFSICBwRGVzdCkKLXsKLQlVTE9ORwkJCUZyYW1lTGVuID0gMDsKLQlVTE9ORwkJCVJlYWRPZmZzZXQgPSAwOwotCVVDSEFSCQkJaTsKLQlVQ0hBUgkJCUxhc3RSZWdDbGFzcyA9IDB4ZmY7Ci0JUFVDSEFSCQkJcExlbjsKLQotCWZvciAoIGkgPSAwO2kgPCBNQVhfVFJJR0dFUl9FVkVOVDtpKyspCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5iVmFsaWQgPT0gVFJVRSkKLQkJewotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uUmVnQ2xhc3MgPT0gTGFzdFJlZ0NsYXNzKQotCQkJewotCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0KSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNoYW5uZWw7Ci0JCQkJKnBMZW4rKzsKLQkJCQlSZWFkT2Zmc2V0Kys7Ci0JCQkJRnJhbWVMZW4rKzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkqKHBEZXN0ICsgUmVhZE9mZnNldCkgPSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVDsgIC8vIElFCi0JCQkJKihwRGVzdCArIFJlYWRPZmZzZXQgKyAxKSA9IDI7CS8vIExlbiA9IFJlZ0NsYXNzIGJ5dGUgKyBjaGFubmVsIGJ5dGUuCi0JCQkJcExlbiA9IHBEZXN0ICsgUmVhZE9mZnNldCArIDE7Ci0JCQkJTGFzdFJlZ0NsYXNzID0gcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5SZWdDbGFzczsKLQkJCQkqKHBEZXN0ICsgUmVhZE9mZnNldCArIDIpID0gTGFzdFJlZ0NsYXNzOwkvLyBMZW4gPSBSZWdDbGFzcyBieXRlICsgY2hhbm5lbCBieXRlLgotCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0ICsgMykgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5DaGFubmVsOwotCQkJCUZyYW1lTGVuICs9IDQ7Ci0JCQkJUmVhZE9mZnNldCArPSA0OwotCQkJfQotCi0JCX0KLQl9Ci0JcmV0dXJuIEZyYW1lTGVuOwotfQotCi0KLS8qCi1EZXNjcmlwdGlvbiA6IFNlbmQgMjAvNDAgQlNTIENvZXhpc3RlbmNlIEFjdGlvbiBmcmFtZSBJZiBvbmUgdHJpZ2dlciBldmVudCBpcyB0cmlnZ2VyZWQuCi0qLwotVk9JRCBTZW5kMjA0MENvZXhpc3RBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gICAgVUNIQVIgIFdjaWQsCi0JSU4JQk9PTEVBTgliQWRkSW50b2xlcmFudENoYSkKLXsKLQlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUwlOU3RhdHVzOwotCUZSQU1FX0FDVElPTl9IRFIJRnJhbWU7Ci0JVUxPTkcJCQlGcmFtZUxlbjsKLQlVTE9ORwkJCUludG9sZXJhbnRDaGFSZXBMZW47Ci0KLQlJbnRvbGVyYW50Q2hhUmVwTGVuID0gMDsKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQUNUIC0gU2VuZDIwNDBDb2V4aXN0QWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9QVUJMSUM7Ci0JRnJhbWUuQWN0aW9uID0gQUNUSU9OX0JTU18yMDQwX0NPRVhJU1Q7Ci0KLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCi0JCQkJICBzaXplb2YoRlJBTUVfQUNUSU9OX0hEUiksCSAgJkZyYW1lLAotCQkJCSAgRU5EX09GX0FSR1MpOwotCi0JKihwT3V0QnVmZmVyICsgRnJhbWVMZW4pID0gcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZDsKLQlGcmFtZUxlbisrOwotCi0JaWYgKGJBZGRJbnRvbGVyYW50Q2hhID09IFRSVUUpCi0JCUludG9sZXJhbnRDaGFSZXBMZW4gPSBCdWlsZEludG9sZXJhbnRDaGFubmVsUmVwKHBBZCwgcE91dEJ1ZmZlciArIEZyYW1lTGVuKTsKLQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiArIEludG9sZXJhbnRDaGFSZXBMZW4pOwotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQUNUIC0gU2VuZDIwNDBDb2V4aXN0QWN0aW9uKCBCU1NDb2V4aXN0MjA0MCA9IDB4JXggKSAgXG4iLCBwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkKSk7Ci0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JQWZ0ZXIgc2NhbiwgVXBkYXRlIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBJRSBhbmQgc2VuZCBvdXQuCi0JQWNjb3JkaW5nIHRvIDgwMi4xMW4gRDMuMDMgMTEuMTQuMTAKLQotCVBhcmFtZXRlcnM6Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBVcGRhdGUyMDQwQ29leGlzdEZyYW1lQW5kTm90aWZ5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgIFVDSEFSICBXY2lkLAotCUlOCUJPT0xFQU4JYkFkZEludG9sZXJhbnRDaGEpCi17Ci0JQlNTXzIwNDBfQ09FWElTVF9JRQlPbGRWYWx1ZTsKLQotCU9sZFZhbHVlLndvcmQgPSBwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkOwotCWlmICgocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QU5vID4gMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24gPiAwKSkKLQkJcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAuZmllbGQuQlNTMjBXaWR0aFJlcSA9IDE7Ci0KLQkvLyBOZWVkIHRvIGNoZWNrICEhISEKLQkvLyBIb3cgU1RBIHdpbGwgc2V0IEludG9sZXJhbnQ0MCBpZiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuIE5vdyB3ZSBkb24ndCBzZXQgdGhpcyBiaXQgZmlyc3QuISEhISEKLQkvLyBTbyBPbmx5IGNoZWNrIEJTUzIwV2lkdGhSZXEgY2hhbmdlLgotCWlmIChPbGRWYWx1ZS5maWVsZC5CU1MyMFdpZHRoUmVxICE9IHBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkJTUzIwV2lkdGhSZXEpCi0JewotCQlTZW5kMjA0MENvZXhpc3RBY3Rpb24ocEFkLCBXY2lkLCBiQWRkSW50b2xlcmFudENoYSk7Ci0JfQotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLUJPT0xFQU4gQ2hhbm5lbFN3aXRjaFNhbml0eUNoZWNrKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgIFVDSEFSICBXY2lkLAotCUlOICAgIFVDSEFSICBOZXdDaGFubmVsLAotCUlOICAgIFVDSEFSICBTZWNvbmRhcnkpCi17Ci0JVUNIQVIJCWk7Ci0KLQlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JaWYgKChOZXdDaGFubmVsID4gNykgJiYgKFNlY29uZGFyeSA9PSAxKSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JaWYgKChOZXdDaGFubmVsIDwgNSkgJiYgKFNlY29uZGFyeSA9PSAzKSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JLy8gMC4gQ2hlY2sgaWYgbmV3IGNoYW5uZWwgaXMgaW4gdGhlIGNoYW5uZWxsaXN0LgotCWZvciAoaSA9IDA7aSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07aSsrKQotCXsKLQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBOZXdDaGFubmVsKQotCQl7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChpID09IHBBZC0+Q2hhbm5lbExpc3ROdW0pCi0JCXJldHVybiBGQUxTRTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLVZPSUQgQ2hhbm5lbFN3aXRjaEFjdGlvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgICBVQ0hBUiAgV2NpZCwKLQlJTiAgICBVQ0hBUiAgTmV3Q2hhbm5lbCwKLQlJTiAgICBVQ0hBUiAgU2Vjb25kYXJ5KQotewotCVVDSEFSCQlCQlBWYWx1ZSA9IDA7Ci0JVUxPTkcJCU1BQ1ZhbHVlOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTUEVDVFJVTSAtIENoYW5uZWxTd2l0Y2hBY3Rpb24oTmV3Q2hhbm5lbCA9ICVkICwgU2Vjb25kYXJ5ID0gJWQpICBcbiIsIE5ld0NoYW5uZWwsIFNlY29uZGFyeSkpOwotCi0JaWYgKENoYW5uZWxTd2l0Y2hTYW5pdHlDaGVjayhwQWQsIFdjaWQsIE5ld0NoYW5uZWwsIFNlY29uZGFyeSkgPT0gRkFMU0UpCi0JCXJldHVybjsKLQotCS8vIDEuICBTd2l0Y2hlcyB0byBCVyA9IDIwLgotCWlmIChTZWNvbmRhcnkgPT0gMCkKLQl7Ci0JCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKLQkJQkJQVmFsdWUmPSAofjB4MTgpOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7Ci0JCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKLQkJewotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MTYpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MDgpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTEpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOwotCQl9Ci0JCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOwotCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gTmV3Q2hhbm5lbDsKLQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsRkFMU0UpOwotCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5IVFBoeU1vZGUuZmllbGQuQlcgPSAwOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEyME1IeiAgICEhISBcbiIgKSk7Ci0JfQotCS8vIDEuICBTd2l0Y2hlcyB0byBCVyA9IDQwIEFuZCBTdGF0aW9uIHN1cHBvcnRzIEJXID0gNDAuCi0JZWxzZSBpZiAoKChTZWNvbmRhcnkgPT0gMSkgfHwgKFNlY29uZGFyeSA9PSAzKSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IDEpKQotCXsKLQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7Ci0KLQkJaWYgKFNlY29uZGFyeSA9PSAxKQotCQl7Ci0JCQkvLyBTZWNvbmRhcnkgYWJvdmUuCi0JCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOwotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJk1BQ1ZhbHVlKTsKLQkJCU1BQ1ZhbHVlICY9IDB4ZmU7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgTUFDVmFsdWUpOwotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwotCQkJQkJQVmFsdWUmPSAofjB4MTgpOwotCQkJQkJQVmFsdWV8PSAoMHgxMCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7Ci0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBWYWx1ZSk7Ci0JCQlCQlBWYWx1ZSY9ICh+MHgyMCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBWYWx1ZSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBMb3dlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgQmVsb3cuIENlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gU2Vjb25kYXJ5IGJlbG93LgotCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZNQUNWYWx1ZSk7Ci0JCQlNQUNWYWx1ZSAmPSAweGZlOwotCQkJTUFDVmFsdWUgfD0gMHgxOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIE1BQ1ZhbHVlKTsKLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKLQkJCUJCUFZhbHVlJj0gKH4weDE4KTsKLQkJCUJCUFZhbHVlfD0gKDB4MTApOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOwotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQVmFsdWUpOwotCQkJQkJQVmFsdWUmPSAofjB4MjApOwotCQkJQkJQVmFsdWV8PSAoMHgyMCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBWYWx1ZSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBVcHBlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgVXBwZXJDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKLQkJfQotCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKLQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwotCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRQaHlNb2RlLmZpZWxkLkJXID0gMTsKLQl9Ci19Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1WT0lEIFBlZXJQdWJsaWNBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotI2lmZGVmIERPVDExTl9EUkFGVDMKLQlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JCXJldHVybjsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotI2lmZGVmIERPVDExTl9EUkFGVDMKLQlzd2l0Y2goQWN0aW9uKQotCXsKLQkJY2FzZSBBQ1RJT05fQlNTXzIwNDBfQ09FWElTVDoJLy8gRm9ybWF0IGRlZmluZWQgaW4gSUVFRSA3LjQuN2EuMSBpbiAxMW4gRHJhZjMuMDMKLQkJCXsKLQkJCQkvL1VDSEFSCUJzc0NvZXhpc3Q7Ci0JCQkJQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UCQkqcENvZXhpc3RJbmZvOwotCQkJCUJTU18yMDQwX0NPRVhJU1RfSUUJCQkqcEJzc0NvZXhpc3RJZTsKLQkJCQlCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVAkqcEludG9sZXJhbnRSZXBvcnQgPSBOVUxMOwotCi0JCQkJaWYgKEVsZW0tPk1zZ0xlbiA8PSAoTEVOR1RIXzgwMl8xMSArIHNpemVvZihCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQpKSApCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBQ1RJT04gLSAyMC80MCBCU1MgQ29leGlzdGVuY2UgTWFuYWdlbWVudCBGcmFtZSBsZW5ndGggdG9vIHNob3J0ISBsZW4gPSAlbGQhXG4iLCBFbGVtLT5Nc2dMZW4pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFDVElPTiAtIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBNYW5hZ2VtZW50IGFjdGlvbi0tLS0+IFxuIikpOwotCQkJCWhleF9kdW1wKCJDb2V4aXN0ZW5jZU1nbXRGcmFtZSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsKLQotCi0JCQkJcENvZXhpc3RJbmZvID0gKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCAqKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl07Ci0JCQkJLy9oZXhfZHVtcCgiQ29leGlzdEluZm8iLCAoUFVDSEFSKXBDb2V4aXN0SW5mbywgc2l6ZW9mKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCkpOwotCQkJCWlmIChFbGVtLT5Nc2dMZW4gPj0gKExFTkdUSF84MDJfMTEgKyBzaXplb2YoQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UKSArIHNpemVvZihCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVCkpKQotCQkJCXsKLQkJCQkJcEludG9sZXJhbnRSZXBvcnQgPSAoQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQgKikoKFBVQ0hBUilwQ29leGlzdEluZm8gKyBzaXplb2YoQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UKSk7Ci0JCQkJfQotCQkJCS8vaGV4X2R1bXAoIkludG9sZXJhbnRSZXBvcnQgIiwgKFBVQ0hBUilwSW50b2xlcmFudFJlcG9ydCwgc2l6ZW9mKEJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUKSk7Ci0KLQkJCQlwQnNzQ29leGlzdEllID0gKEJTU18yMDQwX0NPRVhJU1RfSUUgKikoJnBDb2V4aXN0SW5mby0+QnNzQ29leGlzdEllKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQkJewotCQkJCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJCQkJewotCQkJCQkJU3RhUHVibGljQWN0aW9uKHBBZCwgcENvZXhpc3RJbmZvKTsKLQkJCQkJfQotCQkJCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCQkJfQotCQkJYnJlYWs7Ci0JfQotCi0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi19Ci0KLQotc3RhdGljIFZPSUQgUmVzZXJ2ZWRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVDSEFSIENhdGVnb3J5OwotCi0JaWYgKEVsZW0tPk1zZ0xlbiA8PSBMRU5HVEhfODAyXzExKQotCXsKLQkJcmV0dXJuOwotCX0KLQotCUNhdGVnb3J5ID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTFdOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmN2IHJlc2VydmVkIGNhdGVnb3J5KCVkKSBBY3Rpb24gRnJhbWVcbiIsIENhdGVnb3J5KSk7Ci0JaGV4X2R1bXAoIlJlc2VydmVkIEFjdGlvbiBGcmFtZSIsICZFbGVtLT5Nc2dbMF0sIEVsZW0tPk1zZ0xlbik7Ci19Ci0KLVZPSUQgUGVlclJNQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLQotewotCXJldHVybjsKLX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotc3RhdGljIFZPSUQgcmVzcG9uZF9odF9pbmZvcm1hdGlvbl9leGNoYW5nZV9hY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTCQlOU3RhdHVzOwotCVVMT05HCQkJRnJhbWVMZW47Ci0JRlJBTUVfSFRfSU5GTwlIVElORk9mcmFtZSwgKnBGcmFtZTsKLQlVQ0hBUgkJCSpwQWRkcjsKLQotCi0JLy8gMi4gQWx3YXlzIHNlbmQgYmFjayBBRERCQSBSZXNwb25zZQotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CSAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0KLQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSByZXNwb25kX2h0X2luZm9ybWF0aW9uX2V4Y2hhbmdlX2FjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBnZXQgUkEKLQlwRnJhbWUgPSAoRlJBTUVfSFRfSU5GTyAqKSAmRWxlbS0+TXNnWzBdOwotCXBBZGRyID0gcEZyYW1lLT5IZHIuQWRkcjI7Ci0KLQlOZGlzWmVyb01lbW9yeSgmSFRJTkZPZnJhbWUsIHNpemVvZihGUkFNRV9IVF9JTkZPKSk7Ci0JLy8gMi0xLiBQcmVwYXJlIEFEREJBIFJlc3BvbnNlIGZyYW1lLgotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlpZiAoQURIT0NfT04ocEFkKSkKLQkJCUFjdEhlYWRlckluaXQocEFkLCAmSFRJTkZPZnJhbWUuSGRyLCBwQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQllbHNlCi0JCUFjdEhlYWRlckluaXQocEFkLCAmSFRJTkZPZnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkZHIpOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCUhUSU5GT2ZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfSFQ7Ci0JSFRJTkZPZnJhbWUuQWN0aW9uID0gSFRfSU5GT19FWENIQU5HRTsKLQlIVElORk9mcmFtZS5IVF9JbmZvLlJlcXVlc3QgPSAwOwotCUhUSU5GT2ZyYW1lLkhUX0luZm8uRm9ydHlfTUh6X0ludG9sZXJhbnQgPSBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkZvcnR5X01oel9JbnRvbGVyYW50OwotCUhUSU5GT2ZyYW1lLkhUX0luZm8uU1RBX0NoYW5uZWxfV2lkdGgJID0gcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoOwotCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJCSZGcmFtZUxlbiwKLQkJCQkJICBzaXplb2YoRlJBTUVfSFRfSU5GTyksCSZIVElORk9mcmFtZSwKLQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0KLQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci19Ci0KLQotI2lmZGVmIERPVDExTl9EUkFGVDMKLVZPSUQgU2VuZE5vdGlmeUJXQWN0aW9uRnJhbWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgIFdjaWQsCi0JSU4gVUNIQVIgYXBpZHgpCi17Ci0JUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMJTlN0YXR1czsKLQlGUkFNRV9BQ1RJT05fSERSCUZyYW1lOwotCVVMT05HCQkJRnJhbWVMZW47Ci0JUFVDSEFSCQkJcEFkZHIxOwotCi0KLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQUNUIC0gU2VuZE5vdGlmeUJXQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChXY2lkID09IE1DQVNUX1dDSUQpCi0JCXBBZGRyMSA9ICZCUk9BRENBU1RfQUREUlswXTsKLQllbHNlCi0JCXBBZGRyMSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcjsKLQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkZHIxLCBwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uQnNzaWQsIHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5Cc3NpZCk7Ci0KLQlGcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0hUOwotCUZyYW1lLkFjdGlvbiA9IE5PVElGWV9CV19BQ1RJT047Ci0KLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCi0JCQkJICBzaXplb2YoRlJBTUVfQUNUSU9OX0hEUiksCSAgJkZyYW1lLAotCQkJCSAgRU5EX09GX0FSR1MpOwotCi0JKihwT3V0QnVmZmVyICsgRnJhbWVMZW4pID0gcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoOwotCUZyYW1lTGVuKys7Ci0KLQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1QgLSBTZW5kTm90aWZ5QldBY3Rpb24oTm90aWZ5Qlc9ICVkKSFcbiIsIHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCkpOwotCi19Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotCi0KLVZPSUQgUGVlckhUQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKLQotCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCQlyZXR1cm47Ci0KLQlzd2l0Y2goQWN0aW9uKQotCXsKLQkJY2FzZSBOT1RJRllfQldfQUNUSU9OOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBIVCBOb3RpZnkgQ2hhbm5lbCBiYW5kd2lkdGggYWN0aW9uLS0tLT4gXG4iKSk7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlpZihwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkKLQkJCXsKLQkJCQkvLyBOb3RlLCB0aGlzIGlzIHRvIHBhdGNoIERJUi0xMzUzIEFQLiBXaGVuIHRoZSBBUCBzZXQgdG8gV2VwLCBpdCB3aWxsIHVzZSBsZWdhY3kgbW9kZS4gQnV0IEFQIHN0aWxsIGtlZXBzCi0JCQkJLy8gc2VuZGluZyBCV19Ob3RpZnkgQWN0aW9uIGZyYW1lLCBhbmQgY2F1c2UgdXMgdG8gbGlua3VwIGFuZCBsaW5rZG93bi4KLQkJCQkvLyBJbiBsZWdhY3kgbW9kZSwgZG9uJ3QgbmVlZCB0byBwYXJzZSBIVCBhY3Rpb24gZnJhbWUuCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLUlnbm9yZSBIVCBOb3RpZnkgQ2hhbm5lbCBCVyB3aGVuIGxpbmsgYXMgbGVnYWN5IG1vZGUuIEJXID0gJWQtLS0+IFxuIiwKLQkJCQkJCQkJRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0gKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJCWlmIChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsyXSA9PSAwKQkvLyA3LjQuOC4yLiBpZiB2YWx1ZSBpcyAxLCBrZWVwIHRoZSBzYW1lIGFzIHN1cHBvcnRlZCBjaGFubmVsIGJhbmR3aWR0aC4KLQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLkhUUGh5TW9kZS5maWVsZC5CVyA9IDA7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgU01QU19BQ1RJT046Ci0JCQkvLyA3LjMuMS4yNQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBTTVBTIGFjdGlvbi0tLS0+IFxuIikpOwotCQkJaWYgKCgoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0mMHgxKSA9PSAwKSkKLQkJCXsKLQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlID0gTU1QU19FTkFCTEU7Ci0JCQl9Ci0JCQllbHNlIGlmICgoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdJjB4MikgPT0gMCkpCi0JCQl7Ci0JCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSA9IE1NUFNfU1RBVElDOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUgPSBNTVBTX0RZTkFNSUM7Ci0JCQl9Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQWlkKCVkKSBNSU1PIFBTID0gJWRcbiIsIEVsZW0tPldjaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUpKTsKLQkJCS8vIHJ0Mjg2MGMgOiBhZGQgc29tZXRoaW5nIGZvciBzbXBzIGNoYW5nZS4KLQkJCWJyZWFrOwotCi0JCWNhc2UgU0VUUENPX0FDVElPTjoKLQkJCWJyZWFrOwotCi0JCWNhc2UgTUlNT19DSEFfTUVBU1VSRV9BQ1RJT046Ci0JCQlicmVhazsKLQotCQljYXNlIEhUX0lORk9fRVhDSEFOR0U6Ci0JCQl7Ci0JCQkJSFRfSU5GT1JNQVRJT05fT0NURVQJKnBIVF9pbmZvOwotCi0JCQkJcEhUX2luZm8gPSAoSFRfSU5GT1JNQVRJT05fT0NURVQgKikgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdOwotCQkJCS8vIDcuNC44LjEwCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBIVCBJbmZvcm1hdGlvbiBFeGNoYW5nZSBhY3Rpb24tLS0tPiBcbiIpKTsKLQkJCQlpZiAocEhUX2luZm8tPlJlcXVlc3QpCi0JCQkJewotCQkJCQlyZXNwb25kX2h0X2luZm9ybWF0aW9uX2V4Y2hhbmdlX2FjdGlvbihwQWQsIEVsZW0pOwotCQkJCX0KLQkJCX0KLQkJYnJlYWs7Ci0JfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJUmV0cnkgc2VuZGluZyBBRERCQSBSZXFlc3QuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCVBhcmFtZXRyczoKLQlwODAyM0hlYWRlcjogaWYgdGhpcyBpcyBhbHJlYWR5IDgwMi4zIGZvcm1hdCwgcDgwMjNIZWFkZXIgaXMgTlVMTAotCi0JUmV0dXJuCTogVFJVRSBpZiBwdXQgaW50byByeCByZW9yZGVyaW5nIGJ1ZmZlciwgc2hvdWxkbid0IGluZGljYXRlcnhoZXJlLgotCQkJCUZBTFNFICwgdGhlbiBjb250aW51ZSBpbmRpY2F0ZXJ4IGF0IHRoaXMgbW9tZW50LgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgT1JJQkFUaW1lclRpbWVvdXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnk7Ci0JSU5UCQkJaSwgdG90YWw7Ci0vLwlGUkFNRV9CQVIJCQlGcmFtZUJhcjsKLS8vCVVMT05HCQkJRnJhbWVMZW47Ci0vLwlORElTX1NUQVRVUwlOU3RhdHVzOwotLy8JUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0vLwlVU0hPUlQJCQlTZXF1ZW5jZTsKLQlVQ0hBUgkJCVRJRDsKLQotI2lmZGVmIFJBTElOS19BVEUKLQlpZiAoQVRFX09OKHBBZCkpCi0JCXJldHVybjsKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQl0b3RhbCA9IHBBZC0+TWFjVGFiLlNpemUgKiBOVU1fT0ZfVElEOwotCi0JZm9yIChpID0gMTsgKChpIDxNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkgJiYgKHRvdGFsID4gMCkpIDsgaSsrKQotCXsKLQkJaWYgIChwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkKLQkJewotCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV0uV2NpZF07Ci0JCQlUSUQgPSBwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5USUQ7Ci0KLQkJCUFTU0VSVChwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5XY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpOwotCQl9Ci0JCXRvdGFsIC0tOwotCX0KLX0KLQotCi1WT0lEIFNlbmRSZWZyZXNoQkFSKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5KQotewotCUZSQU1FX0JBUgkJRnJhbWVCYXI7Ci0JVUxPTkcJCQlGcmFtZUxlbjsKLQlORElTX1NUQVRVUwlOU3RhdHVzOwotCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCVVTSE9SVAkJCVNlcXVlbmNlOwotCVVDSEFSCQkJaSwgVElEOwotCVVTSE9SVAkJCWlkeDsKLQlCQV9PUklfRU5UUlkJKnBCQUVudHJ5OwotCi0JZm9yIChpID0gMDsgaSA8TlVNX09GX1RJRDsgaSsrKQotCXsKLQkJaWR4ID0gcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtpXTsKLQkJaWYgKGlkeCA9PSAwKQotCQl7Ci0JCQljb250aW51ZTsKLQkJfQotCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpZHhdOwotCi0JCWlmICAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQotCQl7Ci0JCQlUSUQgPSBwQkFFbnRyeS0+VElEOwotCi0JCQlBU1NFUlQocEJBRW50cnktPldjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSk7Ci0KLQkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlTZXF1ZW5jZSA9IHBFbnRyeS0+VHhTZXFbVElEXTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCUJhckhlYWRlckluaXQocEFkLCAmRnJhbWVCYXIsIHBFbnRyeS0+QWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLkZyYWdOdW0gPSAwOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jdGlvbi4KLQkJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID0gU2VxdWVuY2U7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCQkJRnJhbWVCYXIuQmFyQ29udHJvbC5USUQgPSBUSUQ7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCi0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCi0JCQkJCQkJICBzaXplb2YoRlJBTUVfQkFSKSwJICAmRnJhbWVCYXIsCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQkvL2lmICghKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpKSkKLQkJCWlmICgxKQkvLyBOb3cgd2UgYWx3YXlzIHNlbmQgQkFSLgotCQkJewotCQkJCS8vTWluaXBvcnRNTVJlcXVlc3RVbmxvY2socEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAoTUdNVF9VU0VfUVVFVUVfRkxBRyB8IE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbVElEXSksIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQotCQkJfQotCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJfQotCX0KLX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotVk9JRCBBY3RIZWFkZXJJbml0KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCi0gICAgSU4gUFVDSEFSIEFkZHIxLAotICAgIElOIFBVQ0hBUiBBZGRyMiwKLSAgICBJTiBQVUNIQVIgQWRkcjMpCi17Ci0gICAgTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotICAgIHBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX01HTVQ7Ci0gICAgcEhkcjgwMjExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9BQ1RJT047Ci0KLSAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIEFkZHIxKTsKLQlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjIsIEFkZHIyKTsKLSAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIEFkZHIzKTsKLX0KLQotVk9JRCBCYXJIZWFkZXJJbml0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE9VVCBQRlJBTUVfQkFSIHBDbnRsQmFyLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gUFVDSEFSIHBTQSkKLXsKLS8vCVVTSE9SVAlEdXJhdGlvbjsKLQotCU5kaXNaZXJvTWVtb3J5KHBDbnRsQmFyLCBzaXplb2YoRlJBTUVfQkFSKSk7Ci0JcENudGxCYXItPkZDLlR5cGUgPSBCVFlQRV9DTlRMOwotCXBDbnRsQmFyLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9CTE9DS19BQ0tfUkVROwotCXBDbnRsQmFyLT5CYXJDb250cm9sLk1USUQgPSAwOwotCXBDbnRsQmFyLT5CYXJDb250cm9sLkNvbXByZXNzZWQgPSAxOwotCXBDbnRsQmFyLT5CYXJDb250cm9sLkFDS1BvbGljeSA9IDA7Ci0KLQotCXBDbnRsQmFyLT5EdXJhdGlvbiA9IDE2ICsgUlRNUENhbGNEdXJhdGlvbihwQWQsIFJBVEVfMSwgc2l6ZW9mKEZSQU1FX0JBKSk7Ci0KLQlDT1BZX01BQ19BRERSKHBDbnRsQmFyLT5BZGRyMSwgcERBKTsKLQlDT1BZX01BQ19BRERSKHBDbnRsQmFyLT5BZGRyMiwgcFNBKTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUluc2VydCBDYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUgaW50byB0aGUgYWN0aW9uIGZyYW1lLgotCi0JUGFyYW1ldHJzOgotCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KLQkJMi4gZnJhbWUgbGVuZ3RoLgotCQkzLiBjYXRlZ29yeSBjb2RlIG9mIHRoZSBmcmFtZS4KLQkJNC4gYWN0aW9uIGNvZGUgb2YgdGhlIGZyYW1lLgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEluc2VydEFjdEZpZWxkKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFVJTlQ4IENhdGVnb3J5LAotCUlOIFVJTlQ4IEFjdENvZGUpCi17Ci0JVUxPTkcgVGVtcExlbjsKLQotCU1ha2VPdXRnb2luZ0ZyYW1lKAlwRnJhbWVCdWYsCQkmVGVtcExlbiwKLQkJCQkJCTEsCQkJCSZDYXRlZ29yeSwKLQkJCQkJCTEsCQkJCSZBY3RDb2RlLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCi0JKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwotCi0JcmV0dXJuOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vYmFfYWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9iYV9hY3Rpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczMjQ4OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9iYV9hY3Rpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDE3NzkgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0jZGVmaW5lIEJBX09SSV9JTklUX1NFUQkJKHBFbnRyeS0+VHhTZXFbVElEXSkgLy8xCQkJLy8gaW5pdGFsIHNlcXVlbmNlIG51bWJlciBvZiBCQSBzZXNzaW9uCi0KLSNkZWZpbmUgT1JJX1NFU1NJT05fTUFYX1JFVFJZCTgKLSNkZWZpbmUgT1JJX0JBX1NFU1NJT05fVElNRU9VVAkoMjAwMCkJLy8gbXMKLSNkZWZpbmUgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUCSgxMDAwKQkvLyBtcwotCi0jZGVmaW5lIFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJCSgoMTAwICogT1NfSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKLSNkZWZpbmUgTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJKCgzMDAwICogT1NfSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKLQotI2RlZmluZSBSRVNFVF9SQ1ZfU0VRCQkoMHhGRkZGKQotCi1zdGF0aWMgdm9pZCBiYV9tcGR1X2Jsa19mcmVlKFBSVE1QX0FEQVBURVIgcEFkLCBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2Jsayk7Ci0KLQotQkFfT1JJX0VOVFJZICpCQVRhYmxlQWxsb2NPcmlFbnRyeSgKLQkJCQkJCQkJICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQkJCQkJCQkJICBPVVQgVVNIT1JUICAgICAgICAgICpJZHgpOwotCi1CQV9SRUNfRU5UUlkgKkJBVGFibGVBbGxvY1JlY0VudHJ5KAotCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCk7Ci0KLVZPSUQgQkFPcmlTZXNzaW9uU2V0dXBUaW1lb3V0KAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KLVZPSUQgQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotCi1CVUlMRF9USU1FUl9GVU5DVElPTihCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQpOwotCi0jZGVmaW5lIEFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKF9wQWQsIF9tcGR1X2JsaykJXAotCQkJQW5ub3VuY2VfUmVvcmRlcmluZ19QYWNrZXQoX3BBZCwgX21wZHVfYmxrKTsKLQotVk9JRCBCQV9NYXhXaW5TaXplUmVhc2lnbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnlQZWVyLAotCU9VVCBVQ0hBUgkJCSpwV2luU2l6ZSkKLXsKLQlVQ0hBUiBNYXhTaXplOwotCi0KLQlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgzX1ZFUlNJT04pIC8vIDMqMwotCXsKLQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMzA3MF9WRVJTSU9OKQotCQl7Ci0JCQlpZiAocEVudHJ5UGVlci0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCi0JCQkJTWF4U2l6ZSA9IDc7IC8vIGZvciBub24tb3BlbiBtb2RlCi0JCQllbHNlCi0JCQkJTWF4U2l6ZSA9IDEzOwotCQl9Ci0JCWVsc2UKLQkJCU1heFNpemUgPSAzMTsKLQl9Ci0JZWxzZSBpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgwRV9WRVJTSU9OKSAvLyAyODgwIGUKLQl7Ci0JCWlmIChwRW50cnlQZWVyLT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKLQkJCU1heFNpemUgPSA3OyAvLyBmb3Igbm9uLW9wZW4gbW9kZQotCQllbHNlCi0JCQlNYXhTaXplID0gMTM7Ci0JfQotCWVsc2UKLQkJTWF4U2l6ZSA9IDc7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJiYT4gV2luIFNpemUgPSAlZCwgTWF4IFNpemUgPSAlZFxuIiwKLQkJCSpwV2luU2l6ZSwgTWF4U2l6ZSkpOwotCi0JaWYgKCgqcFdpblNpemUpID4gTWF4U2l6ZSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImJhPiByZWFzc2lnbiBtYXggd2luIHNpemUgZnJvbSAlZCB0byAlZFxuIiwKLQkJCQkqcFdpblNpemUsIE1heFNpemUpKTsKLQotCQkqcFdpblNpemUgPSBNYXhTaXplOwotCX0KLX0KLQotdm9pZCBBbm5vdW5jZV9SZW9yZGVyaW5nX1BhY2tldChJTiBQUlRNUF9BREFQVEVSCQkJcEFkLAotCQkJCQkJCQlJTiBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1CSptcGR1KQotewotCVBORElTX1BBQ0tFVCAgICBwUGFja2V0OwotCi0JcFBhY2tldCA9IG1wZHUtPnBQYWNrZXQ7Ci0KLQlpZiAobXBkdS0+YkFNU0RVKQotCXsKLQkJQVNTRVJUKDApOwotCQlCQV9SZW9yZGVyX0FNU0RVX0Fubm5vdW5jZShwQWQsIHBQYWNrZXQpOwotCX0KLQllbHNlCi0JewotCQkvLwotCQkvLyBwYXNzIHRoaXMgODAyLjMgcGFja2V0IHRvIHVwcGVyIGxheWVyIG9yIGZvcndhcmQgdGhpcyBwYWNrZXQgdG8gV00gZGlyZWN0bHkKLQkJLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUGFja2V0LCBSVE1QX0dFVF9QQUNLRVRfSUYocFBhY2tldCkpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLX0KLQotLyoKLSAqIEluc2VydCBhIHJlb3JkZXJpbmcgbXBkdSBpbnRvIHNvcnRlZCBsaW5rZWQgbGlzdCBieSBzZXF1ZW5jZSBuby4KLSAqLwotQk9PTEVBTiBiYV9yZW9yZGVyaW5nX21wZHVfaW5zZXJ0c29ydGVkKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHUpCi17Ci0KLQlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICoqcHBTY2FuID0gJmxpc3QtPm5leHQ7Ci0KLQl3aGlsZSAoKnBwU2NhbiAhPSBOVUxMKQotCXsKLQkJaWYgKFNFUV9TTUFMTEVSKCgqcHBTY2FuKS0+U2VxdWVuY2UsIG1wZHUtPlNlcXVlbmNlLCBNQVhTRVEpKQotCQl7Ci0JCQlwcFNjYW4gPSAmKCpwcFNjYW4pLT5uZXh0OwotCQl9Ci0JCWVsc2UgaWYgKCgqcHBTY2FuKS0+U2VxdWVuY2UgPT0gbXBkdS0+U2VxdWVuY2UpCi0JCXsKLQkJCS8qIGdpdmUgdXAgdGhpcyBkdXBsaWNhdGVkIGZyYW1lICovCi0JCQlyZXR1cm4oRkFMU0UpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLyogZmluZCBwb3NpdGlvbiAqLwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQltcGR1LT5uZXh0ID0gKnBwU2NhbjsKLQkqcHBTY2FuID0gbXBkdTsKLQlsaXN0LT5xbGVuKys7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIGNhbGxlciBsb2NrIGNyaXRpY2FsIHNlY3Rpb24gaWYgbmVjZXNzYXJ5Ci0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBiYV9lbnF1ZXVlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrKQotewotCWxpc3QtPnFsZW4rKzsKLQltcGR1X2Jsay0+bmV4dCA9IGxpc3QtPm5leHQ7Ci0JbGlzdC0+bmV4dCA9IG1wZHVfYmxrOwotfQotCi0vKgotICogY2FsbGVyIGxvY2sgY3JpdGljYWwgc2VjdGlvbiBpZiBuZWNlc3NhcnkKLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICogYmFfZGVxdWV1ZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0KQotewotCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrID0gTlVMTDsKLQotCUFTU0VSVChsaXN0KTsKLQotCQlpZiAobGlzdC0+cWxlbikKLQkJewotCQkJbGlzdC0+cWxlbi0tOwotCQkJbXBkdV9ibGsgPSBsaXN0LT5uZXh0OwotCQkJaWYgKG1wZHVfYmxrKQotCQkJewotCQkJCWxpc3QtPm5leHQgPSBtcGR1X2Jsay0+bmV4dDsKLQkJCQltcGR1X2Jsay0+bmV4dCA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQlyZXR1cm4gbXBkdV9ibGs7Ci19Ci0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICAqYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCkKLXsKLQlyZXR1cm4oYmFfZGVxdWV1ZShsaXN0KSk7Ci19Ci0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICAqYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QpCi0JewotCUFTU0VSVChsaXN0KTsKLQotCQlyZXR1cm4obGlzdC0+bmV4dCk7Ci0JfQotCi0KLS8qCi0gKiBmcmVlIGFsbCByZXNvdXJjZSBmb3IgcmVvcmRlcmluZyBtZWNoYW5pc20KLSAqLwotdm9pZCBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JQkFfVEFCTEUgICAgICAgICpUYWI7Ci0JUEJBX1JFQ19FTlRSWSAgIHBCQUVudHJ5OwotCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwotCWludCBpOwotCi0JVGFiID0gJnBBZC0+QkFUYWJsZTsKLQotCS8qIEkuICByZWxlYXNlIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgcGFja2V0ICovCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKQotCXsKLQkJcEJBRW50cnkgPSAmVGFiLT5CQVJlY0VudHJ5W2ldOwotCQlpZiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgIT0gUmVjaXBpZW50X05PTkUpCi0JCXsKLQkJCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpKSkKLQkJCXsKLQkJCQlBU1NFUlQobXBkdV9ibGstPnBQYWNrZXQpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBtcGR1X2Jsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKLQkJCX0KLQkJfQotCX0KLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0KLQlBU1NFUlQocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKTsKLQkvKiBJSS4gZnJlZSBtZW1vcnkgb2YgcmVvcmRlcmluZyBtcGR1IHRhYmxlICovCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOwotCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5tcGR1X2Jsa19wb29sLm1lbSk7Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOwotfQotCi0KLQotLyoKLSAqIEFsbG9jYXRlIGFsbCByZXNvdXJjZSBmb3IgcmVvcmRlcmluZyBtZWNoYW5pc20KLSAqLwotQk9PTEVBTiBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQoUFJUTVBfQURBUFRFUiBwQWQsIGludCBudW0pCi17Ci0JaW50ICAgICBpOwotCVBVQ0hBUiAgbWVtOwotCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwotCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmZyZWVsaXN0OwotCi0JLyogYWxsb2NhdGUgc3BpbmxvY2sgKi8KLQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOwotCi0JLyogaW5pdGlhbGl6ZSBmcmVlbGlzdCAqLwotCWZyZWVsaXN0ID0gJnBBZC0+bXBkdV9ibGtfcG9vbC5mcmVlbGlzdDsKLQlmcmVlbGlzdC0+bmV4dCA9IE5VTEw7Ci0JZnJlZWxpc3QtPnFsZW4gPSAwOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWxsb2NhdGUgJWQgbWVtb3J5IGZvciBCQSByZW9yZGVyaW5nXG4iLCAoVUlOVDMyKShudW0qc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKSkpOwotCi0JLyogYWxsb2NhdGUgbnVtYmVyIG9mIG1wZHVfYmxrIG1lbW9yeSAqLwotCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbWVtLCAobnVtKnNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KSkpOwotCi0JcEFkLT5tcGR1X2Jsa19wb29sLm1lbSA9IG1lbTsKLQotCWlmIChtZW0gPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNhbid0IEFsbG9jYXRlIE1lbW9yeSBmb3IgQkEgUmVvcmRlcmluZ1xuIikpOwotCQlyZXR1cm4oRkFMU0UpOwotCX0KLQotCS8qIGJ1aWxkIG1wZHVfYmxrIGZyZWUgbGlzdCAqLwotCWZvciAoaT0wOyBpPG51bTsgaSsrKQotCXsKLQkJLyogZ2V0IG1wZHVfYmxrICovCi0JCW1wZHVfYmxrID0gKHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKikgbWVtOwotCQkvKiBpbml0aWFsIG1wZHVfYmxrICovCi0JCU5kaXNaZXJvTWVtb3J5KG1wZHVfYmxrLCBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpOwotCQkvKiBuZXh0IG1wZHVfYmxrICovCi0JCW1lbSArPSBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSk7Ci0JCS8qIGluc2VydCBtcGR1X2JsayBpbnRvIGZyZWVsaXN0ICovCi0JCWJhX2VucXVldWUoZnJlZWxpc3QsIG1wZHVfYmxrKTsKLQl9Ci0KLQlyZXR1cm4oVFJVRSk7Ci19Ci0KLS8vc3RhdGljIGludCBibGtfY291bnQ9MDsgLy8gc2FtcGxlIHRha2Ugb2ZmLCBubyB1c2UKLQotc3RhdGljIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKmJhX21wZHVfYmxrX2FsbG9jKFBSVE1QX0FEQVBURVIgcEFkKQotewotCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOwotCW1wZHVfYmxrID0gYmFfZGVxdWV1ZSgmcEFkLT5tcGR1X2Jsa19wb29sLmZyZWVsaXN0KTsKLQlpZiAobXBkdV9ibGspCi0JewotLy8JCWJsa19jb3VudCsrOwotCQkvKiByZXNldCBtcGR1X2JsayAqLwotCQlOZGlzWmVyb01lbW9yeShtcGR1X2Jsaywgc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKTsKLQl9Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOwotCXJldHVybiBtcGR1X2JsazsKLX0KLQotc3RhdGljIHZvaWQgYmFfbXBkdV9ibGtfZnJlZShQUlRNUF9BREFQVEVSIHBBZCwgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGspCi17Ci0JQVNTRVJUKG1wZHVfYmxrKTsKLQotCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKLS8vCWJsa19jb3VudC0tOwotCWJhX2VucXVldWUoJnBBZC0+bXBkdV9ibGtfcG9vbC5mcmVlbGlzdCwgbXBkdV9ibGspOwotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKLX0KLQotCi1zdGF0aWMgVVNIT1JUIGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIoCi0JCQkJCQkJCQkJCQkgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQkJCQkJCQkJCQkJCSAgIElOIFBCQV9SRUNfRU5UUlkgICAgcEJBRW50cnksCi0JCQkJCQkJCQkJCQkgICBJTiBVU0hPUlQgICAgICAgICAgIFN0YXJ0U2VxKQotewotCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwotCVVTSE9SVCAgTGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7Ci0KLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKLQotCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfcHJvYmUoJnBCQUVudHJ5LT5saXN0KSkpCi0JCXsKLQkJCS8qIGZpbmQgaW4tb3JkZXIgZnJhbWUgKi8KLQkJaWYgKCFTRVFfU1RFUE9ORShtcGR1X2Jsay0+U2VxdWVuY2UsIFN0YXJ0U2VxLCBNQVhTRVEpKQotCQkJewotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogZGVxdWV1ZSBpbi1vcmRlciBmcmFtZSBmcm9tIHJlb2RlcmluZyBsaXN0ICovCi0JCQltcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCk7Ci0JCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KLQkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7Ci0JCS8qIG1vdmUgdG8gbmV4dCBzZXF1ZW5jZSAqLwotCQkJU3RhcnRTZXEgPSBtcGR1X2Jsay0+U2VxdWVuY2U7Ci0JCUxhc3RJbmRTZXEgPSBTdGFydFNlcTsKLQkJLyogZnJlZSBtcGR1X2JsayAqLwotCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKLQl9Ci0KLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKLQotCS8qIHVwZGF0ZSBsYXN0IGluZGljYXRlZCBzZXF1ZW5jZSAqLwotCXJldHVybiBMYXN0SW5kU2VxOwotfQotCi1zdGF0aWMgdm9pZCBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcSgKLQkJCQkJCQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JCQkJCQkJCQkJCSAgIElOIFBCQV9SRUNfRU5UUlkgICAgcEJBRW50cnksCi0JCQkJCQkJCQkJCSAgIElOIFVTSE9SVCAgICAgICAgICAgU2VxdWVuY2UpCi17Ci0Jc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7Ci0KLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKLQl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKCZwQkFFbnRyeS0+bGlzdCkpKQotCQl7Ci0JCQkvKiBmaW5kIGluLW9yZGVyIGZyYW1lICovCi0JCWlmICgobXBkdV9ibGstPlNlcXVlbmNlID09IFNlcXVlbmNlKSB8fCBTRVFfU01BTExFUihtcGR1X2Jsay0+U2VxdWVuY2UsIFNlcXVlbmNlLCBNQVhTRVEpKQotCQl7Ci0JCQkvKiBkZXF1ZXVlIGluLW9yZGVyIGZyYW1lIGZyb20gcmVvZGVyaW5nIGxpc3QgKi8KLQkJCW1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KTsKLQkJCS8qIHBhc3MgdGhpcyBmcmFtZSB1cCAqLwotCQkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7Ci0JCQkvKiBmcmVlIG1wZHVfYmxrICovCi0JCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOwotCQl9Ci0JCWVsc2UKLQkJCXsKLQkJCQlicmVhazsKLQkJCX0KLQl9Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Ci19Ci0KLQotc3RhdGljIHZvaWQgYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKAotCQkJCQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JCQkJCQkJCQkgICBQQkFfUkVDX0VOVFJZICAgICAgIHBCQUVudHJ5KQotewotCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Ci0KLQkJCS8qIGRlcXVldWUgaW4tb3JkZXIgZnJhbWUgZnJvbSByZW9kZXJpbmcgbGlzdCAqLwotCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpKSkKLQl7Ci0JCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KLQkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7Ci0KLQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBtcGR1X2Jsay0+U2VxdWVuY2U7Ci0JCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOwotCi0JCS8qIHVwZGF0ZSBsYXN0IGluZGljYXRlZCBzZXF1ZW5jZSAqLwotCX0KLQlBU1NFUlQocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKTsKLQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Ci19Ci0KLQotLy9zdGF0aWMKLXZvaWQgYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKAotCQkJCQkJCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JCQkJCQkJCQlJTiBQQkFfUkVDX0VOVFJZICAgIHBCQUVudHJ5LAotCQkJCQkJCQkJSU4gVUxPTkcgICAgICAgICAgICBOb3czMikKLQotewotCVVTSE9SVCBTZXF1ZW5jZTsKLQotLy8JaWYgKChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpICYmCi0vLwkJIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gKChwQkFFbnRyeS0+QkFXaW5TaXplKjcpLzgpKSkgLy98fAotLy8JCShSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrKDEwKlJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSkgJiYKLS8vCQkgKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAocEJBRW50cnktPkJBV2luU2l6ZS84KSkpCi0JaWYgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQvNikpKQotCQkgJiYocEJBRW50cnktPmxpc3QucWxlbiA+IDEpCi0JCSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidGltZW91dFslZF0gKCUwOGx4LSUwOGx4ID0gJWQgPiAlZCk6ICV4LCBmbHVzaCBhbGwhXG4gIiwgcEJBRW50cnktPmxpc3QucWxlbiwgTm93MzIsIChwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpLAotCQkJICAgKGludCkoKGxvbmcpIE5vdzMyIC0gKGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcikpLCBNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCwKLQkJCSAgIHBCQUVudHJ5LT5MYXN0SW5kU2VxKSk7Ci0JCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKLQkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7Ci0JfQotCWVsc2UKLQlpZiAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKyhSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkpCi0JCSYmIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gMCkKLQkgICApCi0JCXsKLS8vCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgidGltZW91dFslZF0gKCVseC0lbHggPSAlZCA+ICVkKTogJXgsICIsIHBCQUVudHJ5LT5saXN0LnFsZW4sIE5vdzMyLCAocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKSwKLS8vCQkJICAgKGludCkoKGxvbmcpIE5vdzMyIC0gKGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcikpLCBSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VULAotLy8JCQkgICBwQkFFbnRyeS0+TGFzdEluZFNlcSkpOwotCQkvLwotCQkvLyBmb3JjZSBMYXN0SW5kU2VxIHRvIHNoaWZ0IHRvIExhc3RJbmRTZXErMQotCQkvLwotCQlTZXF1ZW5jZSA9IChwQkFFbnRyeS0+TGFzdEluZFNlcSsxKSAmIE1BWFNFUTsKLQkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwgU2VxdWVuY2UpOwotCQlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKLQkJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7Ci0JCS8vCi0JCS8vIGluZGljYXRlIGluLW9yZGVyIG1wZHVzCi0JCS8vCi0JCVNlcXVlbmNlID0gYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihwQWQsIHBCQUVudHJ5LCBTZXF1ZW5jZSk7Ci0JCWlmIChTZXF1ZW5jZSAhPSBSRVNFVF9SQ1ZfU0VRKQotCQl7Ci0JCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiV4LCBmbHVzaCBvbmUhXG4iLCBwQkFFbnRyeS0+TGFzdEluZFNlcSkpOwotCi0JfQotfQotCi0KLS8qCi0gKiBnZW5lcmF0ZSBBRERCQSByZXF1ZXN0IHRvCi0gKiBzZXQgdXAgQkEgYWdyZWVtZW50Ci0gKi8KLVZPSUQgQkFPcmlTZXNzaW9uU2V0VXAoCi0JCQkJCSAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JCQkJCSAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotCQkJCQkgIElOIFVDSEFSICAgICAgICAgICAgVElELAotCQkJCQkgIElOIFVTSE9SVCAgICAgICAgICAgVGltZU91dCwKLQkJCQkJICBJTiBVTE9ORyAgICAgICAgICAgIERlbGF5VGltZSwKLQkJCQkJICBJTiBCT09MRUFOICAgICAgICAgIGlzRm9yY2VkKQotCi17Ci0JLy9NTE1FX0FEREJBX1JFUV9TVFJVQ1QJQWRkYmFSZXE7Ci0JQkFfT1JJX0VOVFJZICAgICAgICAgICAgKnBCQUVudHJ5ID0gTlVMTDsKLQlVU0hPUlQgICAgICAgICAgICAgICAgICBJZHg7Ci0JQk9PTEVBTiAgICAgICAgICAgICAgICAgQ2FuY2VsbGVkOwotCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBICE9IFRSVUUpICAmJiAgKGlzRm9yY2VkID09IEZBTFNFKSkKLQkJcmV0dXJuOwotCi0JLy8gaWYgdGhpcyBlbnRyeSBpcyBsaW1pdGVkIHRvIHVzZSBsZWdhY3kgdHggbW9kZSwgaXQgZG9lc24ndCBnZW5lcmF0ZSBCQS4KLQlpZiAoUlRNUFN0YUZpeGVkVHhNb2RlKHBBZCwgcEVudHJ5KSAhPSBGSVhFRF9UWE1PREVfSFQpCi0JCXJldHVybjsKLQotCWlmICgocEVudHJ5LT5CQURlY2xpbmVCaXRtYXAgJiAoMTw8VElEKSkgJiYgKGlzRm9yY2VkID09IEZBTFNFKSkKLQl7Ci0JCS8vIHRyeSBhZ2FpbiBhZnRlciAzIHNlY3MKLQkJRGVsYXlUaW1lID0gMzAwMDsKLS8vCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZUNsaW5lIEJBIGZyb20gUGVlclxuIikpOwotLy8JCXJldHVybjsKLQl9Ci0KLQotCUlkeCA9IHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbVElEXTsKLQlpZiAoSWR4ID09IDApCi0JewotCQkvLyBhbGxvY2F0ZSBhIEJBIHNlc3Npb24KLQkJcEJBRW50cnkgPSBCQVRhYmxlQWxsb2NPcmlFbnRyeShwQWQsICZJZHgpOwotCQlpZiAocEJBRW50cnkgPT0gTlVMTCkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBRERCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIEJBIHNlc3Npb24gZmFpbGVkIFxuIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKLQl9Ci0KLQlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPj0gT3JpZ2luYXRvcl9XYWl0UmVzKQotCXsKLQkJcmV0dXJuOwotCX0KLQotCXBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbVElEXSA9IElkeDsKLQotCS8vIEluaXRpYWxpemUgQkEgc2Vzc2lvbgotCXBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9XYWl0UmVzOwotCXBCQUVudHJ5LT5XY2lkID0gcEVudHJ5LT5BaWQ7Ci0JcEJBRW50cnktPkJBV2luU2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQ7Ci0JcEJBRW50cnktPlNlcXVlbmNlID0gQkFfT1JJX0lOSVRfU0VROwotCXBCQUVudHJ5LT5Ub2tlbiA9IDE7CS8vICgyMDA4LTAxLTIxKSBKYW4gTGVlIHJlY29tbWVuZHMgaXQgLSB0aGlzIHRva2VuIGNhbid0IGJlIDAKLQlwQkFFbnRyeS0+VElEID0gVElEOwotCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBUaW1lT3V0OwotCXBCQUVudHJ5LT5wQWRhcHRlciA9IHBBZDsKLQotCWlmICghKHBFbnRyeS0+VFhCQWJpdG1hcCAmICgxPDxUSUQpKSkKLQl7Ci0JCVJUTVBJbml0VGltZXIocEFkLCAmcEJBRW50cnktPk9SSUJBVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQpLCBwQkFFbnRyeSwgRkFMU0UpOwotCX0KLQllbHNlCi0JCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsICZDYW5jZWxsZWQpOwotCi0JLy8gc2V0IHRpbWVyIHRvIHNlbmQgQUREQkEgcmVxdWVzdAotCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsIERlbGF5VGltZSk7Ci19Ci0KLVZPSUQgQkFPcmlTZXNzaW9uQWRkKAotCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JCQkJCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLQkJCUlOIFBGUkFNRV9BRERCQV9SU1AgcEZyYW1lKQotewotCUJBX09SSV9FTlRSWSAgKnBCQUVudHJ5ID0gTlVMTDsKLQlCT09MRUFOICAgICAgIENhbmNlbGxlZDsKLQlVQ0hBUiAgICAgICAgIFRJRDsKLQlVU0hPUlQgICAgICAgIElkeDsKLQlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlcjIgPSBOVUxMOwotCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOwotCVVMT05HICAgICAgICAgICBGcmFtZUxlbjsKLQlGUkFNRV9CQVIgICAgICAgRnJhbWVCYXI7Ci0KLQlUSUQgPSBwRnJhbWUtPkJhUGFybS5USUQ7Ci0JSWR4ID0gcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtUSURdOwotCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKLQotCS8vIFN0YXJ0IGZpbGwgaW4gcGFyYW1ldGVycy4KLQlpZiAoKElkeCAhPTApICYmIChwQkFFbnRyeS0+VElEID09IFRJRCkgJiYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfV2FpdFJlcykpCi0JewotCQlwQkFFbnRyeS0+QkFXaW5TaXplID0gbWluKHBCQUVudHJ5LT5CQVdpblNpemUsICgoVUNIQVIpcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSkpOwotCQlCQV9NYXhXaW5TaXplUmVhc2lnbihwQWQsIHBFbnRyeSwgJnBCQUVudHJ5LT5CQVdpblNpemUpOwotCi0JCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBwRnJhbWUtPlRpbWVPdXRWYWx1ZTsKLQkJcEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX0RvbmU7Ci0JCXBBZC0+QkFUYWJsZS5udW1Eb25lT3JpZ2luYXRvciArKzsKLQotCQkvLyByZXNldCBzZXF1ZW5jZSBudW1iZXIKLQkJcEJBRW50cnktPlNlcXVlbmNlID0gQkFfT1JJX0lOSVRfU0VROwotCQkvLyBTZXQgQml0bWFwIGZsYWcuCi0JCXBFbnRyeS0+VFhCQWJpdG1hcCB8PSAoMTw8VElEKTsKLQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKLQotCQlwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlID0gMDsJLy9wRnJhbWUtPlRpbWVPdXRWYWx1ZTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzIDogVFhCQWJpdG1hcCA9ICV4LCBCQVdpblNpemUgPSAlZCwgVGltZU91dCA9ICVsZFxuIiwgX19GVU5DVElPTl9fLCBwRW50cnktPlRYQkFiaXRtYXAsCi0JCQkJCQkJCSBwQkFFbnRyeS0+QkFXaW5TaXplLCBwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlKSk7Ci0KLQkJLy8gU0VORCBCQVIgOwotCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIEJBT3JpU2Vzc2lvbkFkZCgpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQlCYXJIZWFkZXJJbml0KHBBZCwgJkZyYW1lQmFyLCBwQWQtPk1hY1RhYi5Db250ZW50W3BCQUVudHJ5LT5XY2lkXS5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5GcmFnTnVtID0gMDsJLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY3Rpb24uCi0JCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID0gcEJBRW50cnktPlNlcXVlbmNlOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQkJRnJhbWVCYXIuQmFyQ29udHJvbC5USUQgPSBwQkFFbnRyeS0+VElEOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcjIsICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0JCQkJCQkgIHNpemVvZihGUkFNRV9CQVIpLCAgICAgICZGcmFtZUJhciwKLQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyMiwgRnJhbWVMZW4pOwotCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIyKTsKLQotCi0JCWlmIChwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlKQotCQkJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSk7IC8vIGluIG1TZWMKLQl9Ci19Ci0KLUJPT0xFQU4gQkFSZWNTZXNzaW9uQWRkKAotCQkJCQkgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQkJCQkJICAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotCQkJCQkgICBJTiBQRlJBTUVfQUREQkFfUkVRIHBGcmFtZSkKLXsKLQlCQV9SRUNfRU5UUlkgICAgICAgICAgICAqcEJBRW50cnkgPSBOVUxMOwotCUJPT0xFQU4gICAgICAgICAgICAgICAgIFN0YXR1cyA9IFRSVUU7Ci0JQk9PTEVBTiAgICAgICAgICAgICAgICAgQ2FuY2VsbGVkOwotCVVTSE9SVCAgICAgICAgICAgICAgICAgIElkeDsKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBUSUQ7Ci0JVUNIQVIgICAgICAgICAgICAgICAgICAgQkFXaW5TaXplOwotCS8vVUlOVDMyICAgICAgICAgICAgICAgICAgVmFsdWU7Ci0JLy9VSU5UICAgICAgICAgICAgICAgICAgICBvZmZzZXQ7Ci0KLQotCUFTU0VSVChwRW50cnkpOwotCi0JLy8gZmluZCBUSUQKLQlUSUQgPSBwRnJhbWUtPkJhUGFybS5USUQ7Ci0KLQlCQVdpblNpemUgPSBtaW4oKChVQ0hBUilwRnJhbWUtPkJhUGFybS5CdWZTaXplKSwgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpOwotCi0JLy8gSW50ZWwgcGF0Y2gKLQlpZiAoQkFXaW5TaXplID09IDApCi0JewotCQlCQVdpblNpemUgPSA2NDsKLQl9Ci0KLQlJZHggPSBwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF07Ci0KLQotCWlmIChJZHggPT0gMCkKLQl7Ci0JCXBCQUVudHJ5ID0gQkFUYWJsZUFsbG9jUmVjRW50cnkocEFkLCAmSWR4KTsKLQl9Ci0JZWxzZQotCXsKLQkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKLQkJLy8gZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cwotCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyglbGQpOiBJZHggPSAlZCwgQkFXaW5TaXplKHJlcSAlZCkgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQsIElkeCwKLQkJCQkJCQkgcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSwgQkFXaW5TaXplKSk7Ci0KLQkvLyBTdGFydCBmaWxsIGluIHBhcmFtZXRlcnMuCi0JaWYgKHBCQUVudHJ5ICE9IE5VTEwpCi0JewotCQlBU1NFUlQocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKTsKLQotCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9IYW5kbGVSZXM7Ci0JCXBCQUVudHJ5LT5CQVdpblNpemUgPSBCQVdpblNpemU7Ci0JCXBCQUVudHJ5LT5XY2lkID0gcEVudHJ5LT5BaWQ7Ci0JCXBCQUVudHJ5LT5USUQgPSBUSUQ7Ci0JCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBwRnJhbWUtPlRpbWVPdXRWYWx1ZTsKLQkJcEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPSBSZWNpcGllbnRfQWNjZXB0OwotCQkvLyBpbml0aWFsIHNlcXVlbmNlIG51bWJlcgotCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7IC8vcEZyYW1lLT5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJTdGFydCBTZXEgPSAlMDh4XG4iLCAgcEZyYW1lLT5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxKSk7Ci0KLQkJaWYgKHBFbnRyeS0+UlhCQWJpdG1hcCAmICgxPDxUSUQpKQotCQl7Ci0JCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5SRUNCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBJbml0VGltZXIocEFkLCAmcEJBRW50cnktPlJFQ0JBVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCQVJlY1Nlc3Npb25JZGxlVGltZW91dCksIHBCQUVudHJ5LCBUUlVFKTsKLQkJfQotCi0KLQkJLy8gU2V0IEJpdG1hcCBmbGFnLgotCQlwRW50cnktPlJYQkFiaXRtYXAgfD0gKDE8PFRJRCk7Ci0JCXBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbVElEXSA9IElkeDsKLQotCQlwRW50cnktPkJBRGVjbGluZUJpdG1hcCAmPSB+KDE8PFRJRCk7Ci0KLQkJLy8gU2V0IEJBIHNlc3Npb24gbWFzayBpbiBXQ0lEIHRhYmxlLgotCQlSVE1QX0FERF9CQV9TRVNTSU9OX1RPX0FTSUMocEFkLCBwRW50cnktPkFpZCwgVElEKTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1BQ0VudHJ5WyVkXVJYQkFiaXRtYXAgPSAweCV4LiBCQVJlY1djaWRBcnJheT0lZFxuIiwKLQkJCQlwRW50cnktPkFpZCwgcEVudHJ5LT5SWEJBYml0bWFwLCBwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF0pKTsKLQl9Ci0JZWxzZQotCXsKLQkJU3RhdHVzID0gRkFMU0U7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ2FuJ3QgQWNjZXB0IEFEREJBIGZvciAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBUSUQgPSAlZFxuIiwKLQkJCQlQUklOVF9NQUMocEVudHJ5LT5BZGRyKSwgVElEKSk7Ci0JfQotCXJldHVybihTdGF0dXMpOwotfQotCi0KLUJBX1JFQ19FTlRSWSAqQkFUYWJsZUFsbG9jUmVjRW50cnkoCi0JCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KQotewotCWludCAgICAgICAgICAgICBpOwotCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOwotCi0KLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0KLQlpZiAocEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50ID49IE1BWF9CQVJFQ0lfU0VTU0lPTikKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJCQSBSZWNpcGVpbnQgU2Vzc2lvbiAoJWxkKSA+ICVkXG4iLAotCQkJCQkJCXBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCwgTUFYX0JBUkVDSV9TRVNTSU9OKSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvLyByZXNlcnZlIGlkeCAwIHRvIGlkZW50aWZ5IEJBV2NpZEFycmF5W1RJRF0gYXMgZW1wdHkKLQlmb3IgKGk9MTsgaSA8IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBpKyspCi0JewotCQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W2ldOwotCQlpZiAoKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID09IFJlY2lwaWVudF9OT05FKSkKLQkJewotCQkJLy8gZ2V0IG9uZQotCQkJcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50Kys7Ci0JCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9VU0VEOwotCQkJKklkeCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotZG9uZToKLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0JcmV0dXJuIHBCQUVudHJ5OwotfQotCi1CQV9PUklfRU5UUlkgKkJBVGFibGVBbGxvY09yaUVudHJ5KAotCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCkKLXsKLQlpbnQgICAgICAgICAgICAgaTsKLQlCQV9PUklfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKLQotCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKLQotCWlmIChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yID49IChNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkpCi0JewotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLy8gcmVzZXJ2ZSBpZHggMCB0byBpZGVudGlmeSBCQVdjaWRBcnJheVtUSURdIGFzIGVtcHR5Ci0JZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9CQV9PUklfVEFCTEU7IGkrKykKLQl7Ci0JCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV07Ci0JCWlmICgocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9OT05FKSkKLQkJewotCQkJLy8gZ2V0IG9uZQotCQkJcEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvcisrOwotCQkJcEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX1VTRUQ7Ci0JCQlwQkFFbnRyeS0+cEFkYXB0ZXIgPSBwQWQ7Ci0JCQkqSWR4ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi1kb25lOgotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKLQlyZXR1cm4gcEJBRW50cnk7Ci19Ci0KLQotVk9JRCBCQVRhYmxlRnJlZU9yaUVudHJ5KAotCQkJCQkJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JCQkJCQlJTiAgVUxPTkcgICAgICAgICAgIElkeCkKLXsKLQlCQV9PUklfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKLQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQotCi0JaWYgKChJZHggPT0gMCkgfHwgKElkeCA+PSBNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkpCi0JCXJldHVybjsKLQotCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKLQotCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyAhPSBPcmlnaW5hdG9yX05PTkUpCi0JewotCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF07Ci0JCXBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbcEJBRW50cnktPlRJRF0gPSAwOwotCi0KLQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwotCQlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQotCQl7Ci0JCQlwQWQtPkJBVGFibGUubnVtRG9uZU9yaWdpbmF0b3IgLT0gMTsKLQkJCXBFbnRyeS0+VFhCQWJpdG1hcCAmPSAofigxPDwocEJBRW50cnktPlRJRCkgKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQVRhYmxlRnJlZU9yaUVudHJ5IG51bUFzT3JpZ2luYXRvcj0gJWxkXG4iLCBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQpKTsKLQkJCS8vIEVyYXNlIEJpdG1hcCBmbGFnLgotCQl9Ci0KLQkJQVNTRVJUKHBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgIT0gMCk7Ci0KLQkJcEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvciAtPSAxOwotCi0JCXBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9OT05FOwotCQlwQkFFbnRyeS0+VG9rZW4gPSAwOwotCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0JfQotfQotCi0KLVZPSUQgQkFUYWJsZUZyZWVSZWNFbnRyeSgKLQkJCQkJCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCQkJCQkJSU4gIFVMT05HICAgICAgICAgICBJZHgpCi17Ci0JQkFfUkVDX0VOVFJZICAgICpwQkFFbnRyeSA9IE5VTEw7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7Ci0KLQotCWlmICgoSWR4ID09IDApIHx8IChJZHggPj0gTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEUpKQotCQlyZXR1cm47Ci0KLQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07Ci0KLQlpZiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgIT0gUmVjaXBpZW50X05PTkUpCi0JewotCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF07Ci0JCXBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbcEJBRW50cnktPlRJRF0gPSAwOwotCi0JCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKLQotCQlBU1NFUlQocEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50ICE9IDApOwotCi0JCXBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCAtPSAxOwotCi0JCXBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X05PTkU7Ci0JCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKLQl9Ci19Ci0KLQotVk9JRCBCQU9yaVNlc3Npb25UZWFyRG93bigKLQkJCQkJCSBJTiBPVVQgIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JCQkJCQkgSU4gICAgICBVQ0hBUiAgICAgICAgICAgV2NpZCwKLQkJCQkJCSBJTiAgICAgIFVDSEFSICAgICAgICAgICBUSUQsCi0JCQkJCQkgSU4gICAgICBCT09MRUFOICAgICAgICAgYlBhc3NpdmUsCi0JCQkJCQkgSU4gICAgICBCT09MRUFOICAgICAgICAgYkZvcmNlU2VuZCkKLXsKLQlVTE9ORyAgICAgICAgICAgSWR4ID0gMDsKLQlCQV9PUklfRU5UUlkgICAgKnBCQUVudHJ5OwotCUJPT0xFQU4gICAgICAgICBDYW5jZWxsZWQ7Ci0KLQlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQl7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLwotCS8vIExvY2F0ZSBjb3JyZXNwb25kaW5nIEJBIE9yaWdpbmF0b3IgRW50cnkgaW4gQkEgVGFibGUgd2l0aCB0aGUgKHBBZGRyLFRJRCkuCi0JLy8KLQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBT3JpV2NpZEFycmF5W1RJRF07Ci0JaWYgKChJZHggPT0gMCkgfHwgKElkeCA+PSBNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkpCi0JewotCQlpZiAoYkZvcmNlU2VuZCA9PSBUUlVFKQotCQl7Ci0JCQkvLyBmb3JjZSBzZW5kIHNwZWNpZmllZCBUSUQgRGVsQkEKLQkJCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAgIERlbGJhUmVxOwotCQkJTUxNRV9RVUVVRV9FTEVNICpFbGVtID0gKE1MTUVfUVVFVUVfRUxFTSAqKSBrbWFsbG9jKHNpemVvZihNTE1FX1FVRVVFX0VMRU0pLCBNRU1fQUxMT0NfRkxBRyk7Ci0JCQlpZiAoRWxlbSAhPSBOVUxMKQotCQkJewotCQkJCU5kaXNaZXJvTWVtb3J5KCZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7Ci0JCQkJTmRpc1plcm9NZW1vcnkoRWxlbSwgc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSkpOwotCi0JCQkJQ09QWV9NQUNfQUREUihEZWxiYVJlcS5BZGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOwotCQkJCURlbGJhUmVxLldjaWQgPSBXY2lkOwotCQkJCURlbGJhUmVxLlRJRCA9IFRJRDsKLQkJCQlEZWxiYVJlcS5Jbml0aWF0b3IgPSBPUklHSU5BVE9SOwotCQkJCUVsZW0tPk1zZ0xlbiAgPSBzaXplb2YoRGVsYmFSZXEpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KEVsZW0tPk1zZywgJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKLQkJCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCQlrZnJlZShFbGVtKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyhiRm9yY2VTZW5kKTphbGxvYyBtZW1vcnkgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm47Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5XY2lkPSVkLlRJRD0lZCBcbiIsIF9fRlVOQ1RJT05fXywgV2NpZCwgVElEKSk7Ci0KLQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiXHQ9PT0+SWR4ID0gJWxkLCBXY2lkPSVkLlRJRD0lZCwgT1JJX0JBX1N0YXR1cyA9ICVkIFxuIiwgSWR4LCBXY2lkLCBUSUQsIHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzKSk7Ci0JLy8KLQkvLyBQcmVwYXJlIERlbEJBIGFjdGlvbiBmcmFtZSBhbmQgc2VuZCB0byB0aGUgcGVlci4KLQkvLwotCWlmICgoYlBhc3NpdmUgPT0gRkFMU0UpICYmIChUSUQgPT0gcEJBRW50cnktPlRJRCkgJiYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkpCi0JewotCQlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgICBEZWxiYVJlcTsKLQkJTUxNRV9RVUVVRV9FTEVNICpFbGVtID0gKE1MTUVfUVVFVUVfRUxFTSAqKSBrbWFsbG9jKHNpemVvZihNTE1FX1FVRVVFX0VMRU0pLCBNRU1fQUxMT0NfRkxBRyk7Ci0JCWlmIChFbGVtICE9IE5VTEwpCi0JCXsKLQkJCU5kaXNaZXJvTWVtb3J5KCZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7Ci0JCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSk7Ci0KLQkJCUNPUFlfTUFDX0FERFIoRGVsYmFSZXEuQWRkciwgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyKTsKLQkJCURlbGJhUmVxLldjaWQgPSBXY2lkOwotCQkJRGVsYmFSZXEuVElEID0gcEJBRW50cnktPlRJRDsKLQkJCURlbGJhUmVxLkluaXRpYXRvciA9IE9SSUdJTkFUT1I7Ci0JCQlFbGVtLT5Nc2dMZW4gID0gc2l6ZW9mKERlbGJhUmVxKTsKLQkJCU5kaXNNb3ZlTWVtb3J5KEVsZW0tPk1zZywgJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKLQkJCU1sbWVERUxCQUFjdGlvbihwQWQsIEVsZW0pOwotCQkJa2ZyZWUoRWxlbSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcygpOmFsbG9jIG1lbW9yeSBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKLQlCQVRhYmxlRnJlZU9yaUVudHJ5KHBBZCwgSWR4KTsKLQotCWlmIChiUGFzc2l2ZSkKLQl7Ci0JCS8vQkFPcmlTZXNzaW9uU2V0VXAocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgVElELCAwLCAxMDAwMCwgVFJVRSk7Ci0JfQotfQotCi1WT0lEIEJBUmVjU2Vzc2lvblRlYXJEb3duKAotCQkJCQkJIElOIE9VVCAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQkJCQkJCSBJTiAgICAgIFVDSEFSICAgICAgICAgICBXY2lkLAotCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFRJRCwKLQkJCQkJCSBJTiAgICAgIEJPT0xFQU4gICAgICAgICBiUGFzc2l2ZSkKLXsKLQlVTE9ORyAgICAgICAgICAgSWR4ID0gMDsKLQlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5OwotCi0JaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JewotCQlyZXR1cm47Ci0JfQotCi0JLy8KLQkvLyAgTG9jYXRlIGNvcnJlc3BvbmRpbmcgQkEgT3JpZ2luYXRvciBFbnRyeSBpbiBCQSBUYWJsZSB3aXRoIHRoZSAocEFkZHIsVElEKS4KLQkvLwotCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXTsKLQlpZiAoSWR4ID09IDApCi0JCXJldHVybjsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXM9PT0+V2NpZD0lZC5USUQ9JWQgXG4iLCBfX0ZVTkNUSU9OX18sIFdjaWQsIFRJRCkpOwotCi0KLQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiXHQ9PT0+SWR4ID0gJWxkLCBXY2lkPSVkLlRJRD0lZCwgUkVDX0JBX1N0YXR1cyA9ICVkIFxuIiwgSWR4LCBXY2lkLCBUSUQsIHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzKSk7Ci0JLy8KLQkvLyBQcmVwYXJlIERlbEJBIGFjdGlvbiBmcmFtZSBhbmQgc2VuZCB0byB0aGUgcGVlci4KLQkvLwotCWlmICgoVElEID09IHBCQUVudHJ5LT5USUQpICYmIChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9PSBSZWNpcGllbnRfQWNjZXB0KSkKLQl7Ci0JCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAgIERlbGJhUmVxOwotCQlCT09MRUFOCQkJCQlDYW5jZWxsZWQ7Ci0JCS8vVUxPTkcgICBvZmZzZXQ7Ci0JCS8vVUlOVDMyICBWQUxVRTsKLQotCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5SRUNCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKLQotCQkvLwotCQkvLyAxLiBTZW5kIERFTEJBIEFjdGlvbiBGcmFtZQotCQkvLwotCQlpZiAoYlBhc3NpdmUgPT0gRkFMU0UpCi0JCXsKLQkJCU1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOwotCQkJaWYgKEVsZW0gIT0gTlVMTCkKLQkJCXsKLQkJCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOwotCQkJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihNTE1FX1FVRVVFX0VMRU0pKTsKLQotCQkJCUNPUFlfTUFDX0FERFIoRGVsYmFSZXEuQWRkciwgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyKTsKLQkJCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKLQkJCQlEZWxiYVJlcS5USUQgPSBUSUQ7Ci0JCQkJRGVsYmFSZXEuSW5pdGlhdG9yID0gUkVDSVBJRU5UOwotCQkJCUVsZW0tPk1zZ0xlbiAgPSBzaXplb2YoRGVsYmFSZXEpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KEVsZW0tPk1zZywgJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKLQkJCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCQlrZnJlZShFbGVtKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcygpOmFsbG9jIG1lbW9yeSBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCi0JCS8vCi0JCS8vIDIuIEZyZWUgcmVzb3VyY2Ugb2YgQkEgc2Vzc2lvbgotCQkvLwotCQkvLyBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzCi0JCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKLQotCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0KLQkJLy8gRXJhc2UgQml0bWFwIGZsYWcuCi0JCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gUkVTRVRfUkNWX1NFUTsKLQkJcEJBRW50cnktPkJBV2luU2l6ZSA9IDA7Ci0JCS8vIEVyYXNlIEJpdG1hcCBmbGFnIGF0IHNvZnR3YXJlIG1hY3RhYmxlCi0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uUlhCQWJpdG1hcCAmPSAofigxPDwocEJBRW50cnktPlRJRCkpKTsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQVJlY1djaWRBcnJheVtUSURdID0gMDsKLQotCQlSVE1QX0RFTF9CQV9TRVNTSU9OX0ZST01fQVNJQyhwQWQsIFdjaWQsIFRJRCk7Ci0KLQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwotCi0JfQotCi0JQkFUYWJsZUZyZWVSZWNFbnRyeShwQWQsIElkeCk7Ci19Ci0KLVZPSUQgQkFTZXNzaW9uVGVhckRvd25BTEwoCi0JCQkJCQkgSU4gT1VUICBQUlRNUF9BREFQVEVSIHBBZCwKLQkJCQkJCSBJTiAgICAgIFVDSEFSIFdjaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGk9MDsgaTxOVU1fT0ZfVElEOyBpKyspCi0JewotCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIFdjaWQsIGksIEZBTFNFLCBGQUxTRSk7Ci0JCUJBUmVjU2Vzc2lvblRlYXJEb3duKHBBZCwgV2NpZCwgaSwgRkFMU0UpOwotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVJldHJ5IHNlbmRpbmcgQUREQkEgUmVxZXN0LgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlQYXJhbWV0cnM6Ci0JcDgwMjNIZWFkZXI6IGlmIHRoaXMgaXMgYWxyZWFkeSA4MDIuMyBmb3JtYXQsIHA4MDIzSGVhZGVyIGlzIE5VTEwKLQotCVJldHVybgk6IFRSVUUgaWYgcHV0IGludG8gcnggcmVvcmRlcmluZyBidWZmZXIsIHNob3VsZG4ndCBpbmRpY2F0ZXJ4aGVyZS4KLQkJCQlGQUxTRSAsIHRoZW4gY29udGludWUgaW5kaWNhdGVyeCBhdCB0aGlzIG1vbWVudC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCgKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JQkFfT1JJX0VOVFJZICAgICpwQkFFbnRyeSA9IChCQV9PUklfRU5UUlkgKilGdW5jdGlvbkNvbnRleHQ7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7Ci0JUFJUTVBfQURBUFRFUiAgIHBBZDsKLQotCWlmIChwQkFFbnRyeSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlwQWQgPSBwQkFFbnRyeS0+cEFkYXB0ZXI7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJLy8gRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24KLQkJaWYgKE1PTklUT1JfT04ocEFkKSkKLQkJCXJldHVybjsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBSQUxJTktfQVRFCi0JLy8gTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZS4KLQlpZiAoQVRFX09OKHBBZCkpCi0JCXJldHVybjsKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF07Ci0KLQlpZiAoKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfV2FpdFJlcykgJiYgKHBCQUVudHJ5LT5Ub2tlbiA8IE9SSV9TRVNTSU9OX01BWF9SRVRSWSkpCi0JewotCQlNTE1FX0FEREJBX1JFUV9TVFJVQ1QgICAgQWRkYmFSZXE7Ci0KLQkJTmRpc1plcm9NZW1vcnkoJkFkZGJhUmVxLCBzaXplb2YoQWRkYmFSZXEpKTsKLQkJQ09QWV9NQUNfQUREUihBZGRiYVJlcS5wQWRkciwgcEVudHJ5LT5BZGRyKTsKLQkJQWRkYmFSZXEuV2NpZCA9IChVQ0hBUikocEVudHJ5LT5BaWQpOwotCQlBZGRiYVJlcS5USUQgPSBwQkFFbnRyeS0+VElEOwotCQlBZGRiYVJlcS5CYUJ1ZlNpemUgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0OwotCQlBZGRiYVJlcS5UaW1lT3V0VmFsdWUgPSAwOwotCQlBZGRiYVJlcS5Ub2tlbiA9IHBCQUVudHJ5LT5Ub2tlbjsKLQkJTWxtZUVucXVldWUocEFkLCBBQ1RJT05fU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQUREX0JBX0NBVEUsIHNpemVvZihNTE1FX0FEREJBX1JFUV9TVFJVQ1QpLCAoUFZPSUQpJkFkZGJhUmVxKTsKLQkJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSBPcmkgU2Vzc2lvbiBUaW1lb3V0KCVkKSA6IFNlbmQgQUREIEJBIGFnYWluXG4iLCBwQkFFbnRyeS0+VG9rZW4pKTsKLQotCQlwQkFFbnRyeS0+VG9rZW4rKzsKLQkJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgT1JJX0JBX1NFU1NJT05fVElNRU9VVCk7Ci0JfQotCWVsc2UKLQl7Ci0JCUJBVGFibGVGcmVlT3JpRW50cnkocEFkLCBwRW50cnktPkJBT3JpV2NpZEFycmF5W3BCQUVudHJ5LT5USURdKTsKLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJUmV0cnkgc2VuZGluZyBBRERCQSBSZXFlc3QuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCVBhcmFtZXRyczoKLQlwODAyM0hlYWRlcjogaWYgdGhpcyBpcyBhbHJlYWR5IDgwMi4zIGZvcm1hdCwgcDgwMjNIZWFkZXIgaXMgTlVMTAotCi0JUmV0dXJuCTogVFJVRSBpZiBwdXQgaW50byByeCByZW9yZGVyaW5nIGJ1ZmZlciwgc2hvdWxkbid0IGluZGljYXRlcnhoZXJlLgotCQkJCUZBTFNFICwgdGhlbiBjb250aW51ZSBpbmRpY2F0ZXJ4IGF0IHRoaXMgbW9tZW50LgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCi0JQkFfUkVDX0VOVFJZICAgICpwQkFFbnRyeSA9IChCQV9SRUNfRU5UUlkgKilGdW5jdGlvbkNvbnRleHQ7Ci0JUFJUTVBfQURBUFRFUiAgIHBBZDsKLQlVTE9ORyAgICAgICAgICAgTm93MzI7Ci0KLQlpZiAocEJBRW50cnkgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JaWYgKChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9PSBSZWNpcGllbnRfQWNjZXB0KSkKLQl7Ci0JCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdzMyKTsKLQotCQlpZiAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyICsgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUKSkpCi0JCXsKLQkJCXBBZCA9IHBCQUVudHJ5LT5wQWRhcHRlcjsKLQkJCS8vIGZsdXNoIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgbXBkdXMKLQkJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlbGQ6IFJFQyBCQSBzZXNzaW9uIFRpbWVvdXRcbiIsIE5vdzMyKSk7Ci0JCX0KLQl9Ci19Ci0KLQotVk9JRCBQZWVyQWRkQkFSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotCi17Ci0JLy8JNy40LjQuMQotCS8vVUxPTkcJSWR4OwotCVVDSEFSICAgU3RhdHVzID0gMTsKLQlVQ0hBUiAgIHBBZGRyWzZdOwotCUZSQU1FX0FEREJBX1JTUCBBRERmcmFtZTsKLQlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKLQlQRlJBTUVfQUREQkFfUkVRICBwQWRkcmVxRnJhbWUgPSBOVUxMOwotCS8vVUNIQVIJCUJ1ZlNpemU7Ci0JVUxPTkcgICAgICAgRnJhbWVMZW47Ci0JUFVMT05HICAgICAgcHRlbXA7Ci0JUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA9PT4gKFdjaWQgPSAlZClcbiIsIF9fRlVOQ1RJT05fXywgRWxlbS0+V2NpZCkpOwotCi0JLy9oZXhfZHVtcCgiQWRkQkFSZXEiLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbik7Ci0KLQkvL0FEREJBIFJlcXVlc3QgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLgotCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCQlyZXR1cm47Ci0KLQlwTWFjRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gUGVlckFkZEJBUmVxQWN0aW9uLS0tLT4gXG4iKSk7Ci0JcHRlbXAgPSAoUFVMT05HKUVsZW0tPk1zZzsKLQkvL0RCR1BSSU5UX1JBVyhSVF9ERUJVR19FTVUsICgiJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4XG4iLCAqKHB0ZW1wKSwgKihwdGVtcCsxKSwgKihwdGVtcCsyKSwgKihwdGVtcCszKSwgKihwdGVtcCs0KSwgKihwdGVtcCs1KSwgKihwdGVtcCs2KSwgKihwdGVtcCs3KSwgKihwdGVtcCs4KSkpOwotCi0JaWYgKFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBwQWRkcikpCi0JewotCi0JCWlmICgocEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9PSBGQUxTRSkgJiYgSVNfSFRfU1RBKHBNYWNFbnRyeSkpCi0JCXsKLQkJCXBBZGRyZXFGcmFtZSA9IChQRlJBTUVfQUREQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJSY3YgV2NpZCglZCkgQWRkQkFSZXFcbiIsIEVsZW0tPldjaWQpKTsKLQkJCWlmIChCQVJlY1Nlc3Npb25BZGQocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXSwgcEFkZHJlcUZyYW1lKSkKLQkJCQlTdGF0dXMgPSAwOwotCQkJZWxzZQotCQkJCVN0YXR1cyA9IDM4OyAvLyBtb3JlIHBhcmFtZXRlcnMgaGF2ZSBpbnZhbGlkIHZhbHVlcwotCQl9Ci0JCWVsc2UKLQkJewotCQkJU3RhdHVzID0gMzc7IC8vIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGRlY2xpbmVkLgotCQl9Ci0JfQotCi0JaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uVmFsaWRBc0NMSSkKLQkJQVNTRVJUKHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uU3N0ID09IFNTVF9BU1NPQyk7Ci0KLQlwQWRkcmVxRnJhbWUgPSAoUEZSQU1FX0FEREJBX1JFUSkoJkVsZW0tPk1zZ1swXSk7Ci0JLy8gMi4gQWx3YXlzIHNlbmQgYmFjayBBRERCQSBSZXNwb25zZQotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CSAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gUGVlckJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCU5kaXNaZXJvTWVtb3J5KCZBRERmcmFtZSwgc2l6ZW9mKEZSQU1FX0FEREJBX1JTUCkpOwotCS8vIDItMS4gUHJlcGFyZSBBRERCQSBSZXNwb25zZSBmcmFtZS4KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJaWYgKEFESE9DX09OKHBBZCkpCi0JCQlBY3RIZWFkZXJJbml0KHBBZCwgJkFERGZyYW1lLkhkciwgcEFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJZWxzZQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5WYWxpZEFzRGxzKQotCQkJQWN0SGVhZGVySW5pdChwQWQsICZBRERmcmFtZS5IZHIsIHBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCWVsc2UKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkJQWN0SGVhZGVySW5pdChwQWQsICZBRERmcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWRkcik7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCUFERGZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfQkE7Ci0JQUREZnJhbWUuQWN0aW9uID0gQUREQkFfUkVTUDsKLQlBRERmcmFtZS5Ub2tlbiA9IHBBZGRyZXFGcmFtZS0+VG9rZW47Ci0JLy8gV2hhdCBpcyB0aGUgU3RhdHVzIGNvZGU/PyAgbmVlZCB0byBjaGVjay4KLQlBRERmcmFtZS5TdGF0dXNDb2RlID0gU3RhdHVzOwotCUFERGZyYW1lLkJhUGFybS5CQVBvbGljeSA9IElNTUVEX0JBOwotCUFERGZyYW1lLkJhUGFybS5BTVNEVVN1cHBvcnRlZCA9IDA7Ci0JQUREZnJhbWUuQmFQYXJtLlRJRCA9IHBBZGRyZXFGcmFtZS0+QmFQYXJtLlRJRDsKLQlBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IG1pbigoKFVDSEFSKXBBZGRyZXFGcmFtZS0+QmFQYXJtLkJ1ZlNpemUpLCAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7Ci0JaWYgKEFERGZyYW1lLkJhUGFybS5CdWZTaXplID09IDApCi0JewotCQlBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IDY0OwotCX0KLQlBRERmcmFtZS5UaW1lT3V0VmFsdWUgPSAwOyAvL3BBZGRyZXFGcmFtZS0+VGltZU91dFZhbHVlOwotCi0JKihVU0hPUlQgKikoJkFERGZyYW1lLkJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQUREZnJhbWUuQmFQYXJtKSk7Ci0JQUREZnJhbWUuU3RhdHVzQ29kZSA9IGNwdTJsZTE2KEFERGZyYW1lLlN0YXR1c0NvZGUpOwotCUFERGZyYW1lLlRpbWVPdXRWYWx1ZSA9IGNwdTJsZTE2KEFERGZyYW1lLlRpbWVPdXRWYWx1ZSk7Ci0KLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJICBzaXplb2YoRlJBTUVfQUREQkFfUlNQKSwgICZBRERmcmFtZSwKLQkJCSAgRU5EX09GX0FSR1MpOwotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCVkKTogVElEKCVkKSwgQnVmU2l6ZSglZCkgPD09IFxuIiwgX19GVU5DVElPTl9fLCBFbGVtLT5XY2lkLCBBRERmcmFtZS5CYVBhcm0uVElELAotCQkJCQkJCSAgQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUpKTsKLX0KLQotCi1WT0lEIFBlZXJBZGRCQVJzcEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi0KLXsKLQkvL1VDSEFSCQlJZHgsIGk7Ci0JLy9QVUNIQVIJCSAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCVBGUkFNRV9BRERCQV9SU1AgICAgcEZyYW1lID0gTlVMTDsKLQkvL1BCQV9PUklfRU5UUlkJCXBCQUVudHJ5OwotCi0JLy9BRERCQSBSZXNwb25zZSBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCi0JaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JCXJldHVybjsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzID09PiBXY2lkKCVkKVxuIiwgX19GVU5DVElPTl9fLCBFbGVtLT5XY2lkKSk7Ci0KLQkvL2hleF9kdW1wKCJQZWVyQWRkQkFSc3BBY3Rpb24oKSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsKLQotCWlmIChQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCi0JewotCQlwRnJhbWUgPSAoUEZSQU1FX0FEREJBX1JTUCkoJkVsZW0tPk1zZ1swXSk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXHRcdCBTdGF0dXNDb2RlID0gJWRcbiIsIHBGcmFtZS0+U3RhdHVzQ29kZSkpOwotCQlzd2l0Y2ggKHBGcmFtZS0+U3RhdHVzQ29kZSkKLQkJewotCQkJY2FzZSAwOgotCQkJCS8vIEkgd2FudCBhIEJBc2Vzc2lvbiB3aXRoIHRoaXMgcGVlciBhcyBhbiBvcmlnaW5hdG9yLgotCQkJCUJBT3JpU2Vzc2lvbkFkZChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLCBwRnJhbWUpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvLyBjaGVjayBzdGF0dXMgPT0gVVNFRCA/Pz8KLQkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIEVsZW0tPldjaWQsIHBGcmFtZS0+QmFQYXJtLlRJRCwgVFJVRSwgRkFMU0UpOwotCQkJCWJyZWFrOwotCQl9Ci0JCS8vIFJjdiBEZWNsaW5lIFN0YXR1c0NvZGUKLQkJaWYgKChwRnJhbWUtPlN0YXR1c0NvZGUgPT0gMzcpCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0gICAgICAgICAgICB8fCAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIFNUQV9UR05fV0lGSV9PTihwQWQpICYmIChwRnJhbWUtPlN0YXR1c0NvZGUgIT0gMCkpCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0gICAgICAgICAgICApCi0JCXsKLQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uQkFEZWNsaW5lQml0bWFwIHw9IDE8PHBGcmFtZS0+QmFQYXJtLlRJRDsKLQkJfQotCX0KLX0KLQotVk9JRCBQZWVyRGVsQkFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotCi17Ci0JLy9VQ0hBUgkJCQlJZHg7Ci0JLy9QVUNIQVIJCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JUEZSQU1FX0RFTEJBX1JFUSAgICBwRGVsRnJhbWUgPSBOVUxMOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyA9PT5cbiIsIF9fRlVOQ1RJT05fXykpOwotCS8vREVMQkEgUmVxdWVzdCBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCi0JaWYgKFBlZXJEZWxCQUFjdGlvblNhbml0eShwQWQsIEVsZW0tPldjaWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkKLQl7Ci0JCXBEZWxGcmFtZSA9IChQRlJBTUVfREVMQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKLQkJaWYgKHBEZWxGcmFtZS0+RGVsYmFQYXJtLkluaXRpYXRvciA9PSBPUklHSU5BVE9SKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gUGVlckRlbEJBQWN0aW9uLS0tLT4gT1JJR0lOQVRPUlxuIikpOwotCQkJQkFSZWNTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQsIFRSVUUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIFBlZXJEZWxCQUFjdGlvbi0tLS0+IFJFQ0lQSUVOVCwgUmVhc29uID0gJWRcbiIsICBwRGVsRnJhbWUtPlJlYXNvbkNvZGUpKTsKLQkJCS8vaGV4X2R1bXAoIkRlbEJBIEZyYW1lIiwgcERlbEZyYW1lLCBFbGVtLT5Nc2dMZW4pOwotCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQsIFRSVUUsIEZBTFNFKTsKLQkJfQotCX0KLX0KLQotCi1CT09MRUFOIENudGxFbnF1ZXVlRm9yUmVjdigKLQkJCQkJCSAgSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCQkJCQkJICBJTiBVTE9ORwkJCQlXY2lkLAotCQkJCQkJICBJTiBVTE9ORwkJCQlNc2dMZW4sCi0JCQkJCQkgIElOIFBGUkFNRV9CQV9SRVEJCXBNc2cpCi17Ci0JUEZSQU1FX0JBX1JFUSAgIHBGcmFtZSA9IHBNc2c7Ci0JLy9QUlRNUF9SRU9SREVSQlVGCXBCdWZmZXI7Ci0JLy9QUlRNUF9SRU9SREVSQlVGCXBEbWFCdWY7Ci0JUEJBX1JFQ19FTlRSWSBwQkFFbnRyeTsKLQkvL0JPT0xFQU4JUmVzdWx0OwotCVVMT05HICAgSWR4OwotCS8vVUNIQVIJTnVtUnhQa3Q7Ci0JVUNIQVIJVElEOy8vLCBpOwotCi0JVElEID0gKFVDSEFSKXBGcmFtZS0+QkFSQ29udHJvbC5USUQ7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpOiBCQVItV2NpZCglbGQpLCBUaWQgKCVkKVxuIiwgX19GVU5DVElPTl9fLCBXY2lkLCBUSUQpKTsKLQkvL2hleF9kdW1wKCJCQVIiLCAoUENIQVIpIHBGcmFtZSwgTXNnTGVuKTsKLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKLQlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCi0JewotCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWVsc2UgaWYgKE1zZ0xlbiAhPSBzaXplb2YoRlJBTUVfQkFfUkVRKSkKLQl7Ci0JCURCR1BSSU5UX0VSUigoIkNudGxFbnF1ZXVlRm9yUmVjdjogQmxvY2tBY2sgUmVxdWVzdCBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsIE1zZ0xlbikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWVsc2UgaWYgKE1zZ0xlbiAhPSBzaXplb2YoRlJBTUVfQkFfUkVRKSkKLQl7Ci0JCURCR1BSSU5UX0VSUigoIkNudGxFbnF1ZXVlRm9yUmVjdjogQmxvY2tBY2sgUmVxdWVzdCBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsIE1zZ0xlbikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JaWYgKChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpICYmIChUSUQgPCA4KSkKLQkJewotCQkvLyBpZiB0aGlzIHJlY2VpdmluZyBwYWNrZXQgaXMgZnJvbSBTQSB0aGF0IGlzIGluIG91ciBPcmlFbnRyeS4gU2luY2UgV0NJRCA8OSBoYXMgZGlyZWN0IG1hcHBpbmcuIG5vIG5lZWQgc2VhcmNoLgotCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF07Ci0JCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQVIoJWxkKSA6IFRpZCAoJWQpIC0gJTA0eDolMDR4XG4iLCBXY2lkLCBUSUQsIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgcEJBRW50cnktPkxhc3RJbmRTZXEgKSk7Ci0KLQlpZiAoU0VRX1NNQUxMRVIocEJBRW50cnktPkxhc3RJbmRTZXEsIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgTUFYU0VRKSkKLQl7Ci0JCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFSIFNlcSA9ICV4LCBMYXN0SW5kU2VxID0gJXhcbiIsIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsKLQkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwgcEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxKTsKLQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSAocEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID09IDApID8gTUFYU0VRIDoocEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxIC0xKTsKLQl9Ci0JLy9iYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi1EZXNjcmlwdGlvbiA6IFNlbmQgUFNNUCBBY3Rpb24gZnJhbWUgSWYgUFNNUCBtb2RlIHN3aXRjaGVzLgotKi8KLVZPSUQgU2VuZFBTTVBBY3Rpb24oCi0JCQkJICAgSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCQkJCSAgIElOIFVDSEFSCQkJCVdjaWQsCi0JCQkJICAgSU4gVUNIQVIJCQkJUHNtcCkKLXsKLQlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7Ci0JLy9VTE9ORyAgICAgICAgICAgSWR4OwotCUZSQU1FX1BTTVBfQUNUSU9OICAgRnJhbWU7Ci0JVUxPTkcgICAgICAgICAgIEZyYW1lTGVuOwotCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9IVDsKLQlGcmFtZS5BY3Rpb24gPSBTTVBTX0FDVElPTjsKLQlzd2l0Y2ggKFBzbXApCi0JewotCQljYXNlIE1NUFNfRU5BQkxFOgotI2lmZGVmIFJUMzB4eAotCQkJaWYgKElTX1JUMzB4eChwQWQpCi0JCQkJJiYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aD4xfHxwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoPjEpKQotCQkJewotCQkJCVJUTVBfQVNJQ19NTVBTX0RJU0FCTEUocEFkKTsKLQkJCX0KLSNlbmRpZiAvLyBSVDMweHggLy8KLQkJCUZyYW1lLlBzbXAgPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgTU1QU19EWU5BTUlDOgotCQkJRnJhbWUuUHNtcCA9IDM7Ci0JCQlicmVhazsKLQkJY2FzZSBNTVBTX1NUQVRJQzoKLSNpZmRlZiBSVDMweHgKLQkJCWlmIChJU19SVDMweHgocEFkKQotCQkJCSYmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGg+MXx8cEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aD4xKSkKLQkJCXsKLQkJCQlSVE1QX0FTSUNfTU1QU19FTkFCTEUocEFkKTsKLQkJCX0KLSNlbmRpZiAvLyBSVDMweHggLy8KLQkJCUZyYW1lLlBzbXAgPSAxOwotCQkJYnJlYWs7Ci0JfQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkgIHNpemVvZihGUkFNRV9QU01QX0FDVElPTiksICAgICAgJkZyYW1lLAotCQkJCQkgIEVORF9PRl9BUkdTKTsKLQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJIVCAtIFNlbmRQU01QQWN0aW9uKCAlZCApICBcbiIsIEZyYW1lLlBzbXApKTsKLX0KLQotCi0jZGVmaW5lIFJBRElPX01FQVNVUkVNRU5UX1JFUVVFU1RfQUNUSU9OCTAKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VECi17Ci0JVUNIQVIJUmVndWxhdG9yeUNsYXNzOwotCVVDSEFSCUNoYW5uZWxOdW1iZXI7Ci0JVVNIT1JUCVJhbmRvbUludGVydmFsOwotCVVTSE9SVAlNZWFzdXJlbWVudER1cmF0aW9uOwotCVVDSEFSCU1lYXN1cmVtZW50TW9kZTsKLQlVQ0hBUiAgIEJTU0lEW01BQ19BRERSX0xFTl07Ci0JVUNIQVIJUmVwb3J0aW5nQ29uZGl0aW9uOwotCVVDSEFSCVRocmVzaG9sZDsKLQlVQ0hBUiAgIFNTSURJRVsyXTsJCQkvLyAyIGJ5dGUKLX0gQkVBQ09OX1JFUVVFU1Q7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRAotewotCVVDSEFSCUlEOwotCVVDSEFSCUxlbmd0aDsKLQlVQ0hBUglUb2tlbjsKLQlVQ0hBUglSZXF1ZXN0TW9kZTsKLQlVQ0hBUglUeXBlOwotfSBNRUFTVVJFTUVOVF9SRVE7Ci0KLQotCi0KLXZvaWQgY29udmVydF9yZW9yZGVyaW5nX3BhY2tldF90b19wcmVBTVNEVV9vcl84MDJfM19wYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKLXsKLQlQTkRJU19QQUNLRVQJcFJ4UGt0OwotCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKLQotCS8vIDEuIGdldCA4MDIuMyBIZWFkZXIKLQkvLyAyLiByZW1vdmUgTExDCi0JLy8JCWEuIHBvaW50ZXIgcFJ4QmxrLT5wRGF0YSB0byBwYXlsb2FkCi0JLy8gICAgICBiLiBtb2RpZnkgcFJ4QmxrLT5EYXRhU2l6ZQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJUlRNUF84MDJfMTFfUkVNT1ZFX0xMQ19BTkRfQ09OVkVSVF9UT184MDJfMyhwUnhCbGssIEhlYWRlcjgwMl8zKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7Ci0JcFJ4UGt0ID0gUlRQS1RfVE9fT1NQS1QocFJ4QmxrLT5wUnhQYWNrZXQpOwotCi0JU0VUX09TX1BLVF9ORVRERVYocFJ4UGt0LCBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCkpOwotCVNFVF9PU19QS1RfREFUQVBUUihwUnhQa3QsIHBSeEJsay0+cERhdGEpOwotCVNFVF9PU19QS1RfTEVOKHBSeFBrdCwgcFJ4QmxrLT5EYXRhU2l6ZSk7Ci0JU0VUX09TX1BLVF9EQVRBVEFJTChwUnhQa3QsIHBSeEJsay0+cERhdGEsIHBSeEJsay0+RGF0YVNpemUpOwotCi0JLy8KLQkvLyBjb3B5IDgwMi4zIGhlYWRlciwgaWYgbmVjZXNzYXJ5Ci0JLy8KLQlpZiAoIVJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1TRFUpKQotCXsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0jaWZkZWYgTElOVVgKLQkJCU5kaXNNb3ZlTWVtb3J5KHNrYl9wdXNoKHBSeFBrdCwgTEVOR1RIXzgwMl8zKSwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMyk7Ci0jZW5kaWYKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLX0KLQotCi0jZGVmaW5lIElORElDQVRFX0xFR0FDWV9PUl9BTVNEVShfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpCQlcCi0JZG8JCQkJCQkJCQkJCQkJCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JaWYgKFJYX0JMS19URVNUX0ZMQUcoX3BSeEJsaywgZlJYX0FNU0RVKSkJCQkJCQlcCi0JewkJCQkJCQkJCQkJCQkJCQlcCi0JCUluZGljYXRlX0FNU0RVX1BhY2tldChfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpOwkJXAotCX0JCQkJCQkJCQkJCQkJCQkJXAotCQllbHNlIGlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9FQVApKQkJCQkJXAotCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCUluZGljYXRlX0VBUE9MX1BhY2tldChfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpOwkJXAotCQl9CQkJCQkJCQkJCQkJCQkJCVwKLQllbHNlCQkJCQkJCQkJCQkJCQkJXAotCXsJCQkJCQkJCQkJCQkJCQkJXAotCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KF9wQWQsIF9wUnhCbGssIF9mcm9tV2hpY2hCU1NJRCk7CQlcCi0JfQkJCQkJCQkJCQkJCQkJCQlcCi0JfSB3aGlsZSAoMCk7Ci0KLQotCi1zdGF0aWMgVk9JRCBiYV9lbnF1ZXVlX3Jlb3JkZXJpbmdfcGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBCQV9SRUNfRU5UUlkJcEJBRW50cnksCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQotewotCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwotCVVJTlQxNglTZXF1ZW5jZSA9IChVSU5UMTYpIHBSeEJsay0+cEhlYWRlci0+U2VxdWVuY2U7Ci0KLQltcGR1X2JsayA9IGJhX21wZHVfYmxrX2FsbG9jKHBBZCk7Ci0JaWYgKChtcGR1X2JsayAhPSBOVUxMKSAmJgotCQkoIVJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfRUFQKSkpCi0JewotCQkvLyBXcml0ZSBSeEQgYnVmZmVyIGFkZHJlc3MgJiBhbGxvY2F0ZWQgYnVmZmVyIGxlbmd0aAotCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKLQotCQltcGR1X2Jsay0+U2VxdWVuY2UgPSBTZXF1ZW5jZTsKLQotCQltcGR1X2Jsay0+YkFNU0RVID0gUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSk7Ci0KLQkJY29udmVydF9yZW9yZGVyaW5nX3BhY2tldF90b19wcmVBTVNEVV9vcl84MDJfM19wYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQotCQlTVEFUU19JTkNfUlhfUEFDS0VUUyhwQWQsIEZyb21XaGljaEJTU0lEKTsKLQotICAgICAgICAvLwotCQkvLyBpdCBpcyBuZWNlc3NhcnkgZm9yIHJlb3JkZXJpbmcgcGFja2V0IHRvIHJlY29yZAotCQkvLyB3aGljaCBCU1MgaXQgY29tZSBmcm9tCi0JCS8vCi0JCVJUTVBfU0VUX1BBQ0tFVF9JRihwUnhCbGstPnBSeFBhY2tldCwgRnJvbVdoaWNoQlNTSUQpOwotCi0JCW1wZHVfYmxrLT5wUGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7Ci0KLQkJaWYgKGJhX3Jlb3JkZXJpbmdfbXBkdV9pbnNlcnRzb3J0ZWQoJnBCQUVudHJ5LT5saXN0LCBtcGR1X2JsaykgPT0gRkFMU0UpCi0JCXsKLQkJCS8vIGhhZCBiZWVuIGFscmVhZHkgd2l0aGluIHJlb3JkZXJpbmcgbGlzdAotCQkJLy8gZG9uJ3QgaW5kaWNhdGUKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOwotCQl9Ci0KLQkJQVNTRVJUKCgwPD0gcEJBRW50cnktPmxpc3QucWxlbikgICYmIChwQkFFbnRyeS0+bGlzdC5xbGVuIDw9IHBCQUVudHJ5LT5CQVdpblNpemUpKTsKLQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAgKCIhISEgKCVkKSBDYW4ndCBhbGxvY2F0ZSByZW9yZGVyaW5nIG1wZHUgYmxrXG4iLAotCQkJCQkJCQkgICBwQkFFbnRyeS0+bGlzdC5xbGVuKSk7Ci0JCS8qCi0JCSAqIGZsdXNoIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgbXBkdXMKLQkJICogYW5kIHJlY2V2aW5nIG1wZHUgdG8gdXBwZXIgbGF5ZXIKLQkJICogbWFrZSB0Y3AvaXAgdG8gdGFrZSBjYXJlIHJlb3JkZXJpbmcgbWVjaGFuaXNtCi0JCSAqLwotCQkvL2JhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKLQkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwgU2VxdWVuY2UpOwotCi0JCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7Ci0JCUlORElDQVRFX0xFR0FDWV9PUl9BTVNEVShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUluZGljYXRlIHRoaXMgcGFja2V0IHRvIHVwcGVyIGxheWVyIG9yIHB1dCBpdCBpbnRvIHJlb3JkZXJpbmcgYnVmZmVyCi0KLQlQYXJhbWV0cnM6Ci0JCXBSeEJsayAgICAgICAgIDogY2FycnkgbmVjZXNzYXJ5IHBhY2tldCBpbmZvIDgwMi4xMSBmb3JtYXQKLQkJRnJvbVdoaWNoQlNTSUQgOiB0aGUgcGFja2V0IHJlY2VpdmVkIGZyb20gd2hpY2ggQlNTCi0KLQlSZXR1cm4JOgotCQkJICBub25lCi0KLQlOb3RlICAgIDoKLQkgICAgICAgICAgdGhlIHBhY2tldCBxdWV1ZWQgaW50byByZW9yZGVyaW5nIGJ1ZmZlciBuZWVkIHRvIGNvdmVyIHRvIDgwMi4zIGZvcm1hdAotCQkJICBvciBwcmVfQU1TRFUgZm9ybWF0Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotCi1WT0lEIEluZGljYXRlX0FNUERVX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0JVVNIT1JUCQkJCUlkeDsKLQlQQkFfUkVDX0VOVFJZCQlwQkFFbnRyeSA9IE5VTEw7Ci0JVUlOVDE2CQkJCVNlcXVlbmNlID0gcFJ4QmxrLT5wSGVhZGVyLT5TZXF1ZW5jZTsKLQlVTE9ORwkJCQlOb3czMjsKLQlVQ0hBUgkJCQlXY2lkID0gcFJ4QmxrLT5wUnhXSS0+V2lyZWxlc3NDbGlJRDsKLQlVQ0hBUgkJCQlUSUQgPSBwUnhCbGstPnBSeFdJLT5USUQ7Ci0KLQotCWlmICghUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSkgJiYgIChwUnhCbGstPkRhdGFTaXplID4gTUFYX1JYX1BLVF9MRU4pKQotCXsKLQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJcmV0dXJuOwotCX0KLQotCi0KLQlpZiAoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCXsKLQkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQVJlY1djaWRBcnJheVtUSURdOwotCQlpZiAoSWR4ID09IDApCi0JCXsKLQkJCS8qIFJlYyBCQSBTZXNzaW9uIGhhZCBiZWVuIHRvcm4gZG93biAqLwotCQkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gaW1wb3NzaWJsZSAhISEKLQkJQVNTRVJUKDApOwotCQkvLyByZWxlYXNlIHBhY2tldAotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQlyZXR1cm47Ci0JfQotCi0JQVNTRVJUKHBCQUVudHJ5KTsKLQotCS8vIHVwZGF0ZSBsYXN0IHJ4IHRpbWUKLQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3czMik7Ci0KLQlwQkFFbnRyeS0+cmN2U2VxID0gU2VxdWVuY2U7Ci0KLQotCWJhX2ZsdXNoX3Jlb3JkZXJpbmdfdGltZW91dF9tcGR1cyhwQWQsIHBCQUVudHJ5LCBOb3czMik7Ci0JcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7Ci0KLQkvLwotCS8vIFJlc2V0IExhc3QgSW5kaWNhdGUgU2VxdWVuY2UKLQkvLwotCWlmIChwQkFFbnRyeS0+TGFzdEluZFNlcSA9PSBSRVNFVF9SQ1ZfU0VRKQotCXsKLQkJQVNTRVJUKChwQkFFbnRyeS0+bGlzdC5xbGVuID09IDApICYmIChwQkFFbnRyeS0+bGlzdC5uZXh0ID09IE5VTEwpKTsKLQotCQkvLyByZXNldCByY3Ygc2VxdWVuY2Ugb2YgQkEgc2Vzc2lvbgotCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOwotCQlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKLQkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLwotCS8vIEkuIENoZWNrIGlmIGluIG9yZGVyLgotCS8vCi0JaWYgKFNFUV9TVEVQT05FKFNlcXVlbmNlLCBwQkFFbnRyeS0+TGFzdEluZFNlcSwgTUFYU0VRKSkKLQl7Ci0JCVVTSE9SVCAgTGFzdEluZFNlcTsKLQotCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOwotCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQkJTGFzdEluZFNlcSA9IGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIocEFkLCBwQkFFbnRyeSwgcEJBRW50cnktPkxhc3RJbmRTZXEpOwotCQlpZiAoTGFzdEluZFNlcSAhPSBSRVNFVF9SQ1ZfU0VRKQotCQl7Ci0JCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IExhc3RJbmRTZXE7Ci0JCX0KLQkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7Ci0JfQotCS8vCi0JLy8gSUkuIERyb3AgRHVwbGljYXRlZCBQYWNrZXQKLQkvLwotCWVsc2UgaWYgKFNlcXVlbmNlID09IHBCQUVudHJ5LT5MYXN0SW5kU2VxKQotCXsKLQotCQkvLyBkcm9wIGFuZCByZWxlYXNlIHBhY2tldAotCQlwQkFFbnRyeS0+bkRyb3BQYWNrZXQrKzsKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQl9Ci0JLy8KLQkvLyBJSUkuIERyb3AgT2xkIFJlY2VpdmVkIFBhY2tldAotCS8vCi0JZWxzZSBpZiAoU0VRX1NNQUxMRVIoU2VxdWVuY2UsIHBCQUVudHJ5LT5MYXN0SW5kU2VxLCBNQVhTRVEpKQotCXsKLQotCQkvLyBkcm9wIGFuZCByZWxlYXNlIHBhY2tldAotCQlwQkFFbnRyeS0+bkRyb3BQYWNrZXQrKzsKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQl9Ci0JLy8KLQkvLyBJVi4gUmVjZWl2ZSBTZXF1ZW5jZSB3aXRoaW4gV2luZG93IFNpemUKLQkvLwotCWVsc2UgaWYgKFNFUV9TTUFMTEVSKFNlcXVlbmNlLCAoKChwQkFFbnRyeS0+TGFzdEluZFNlcStwQkFFbnRyeS0+QkFXaW5TaXplKzEpKSAmIE1BWFNFUSksIE1BWFNFUSkpCi0JewotCQliYV9lbnF1ZXVlX3Jlb3JkZXJpbmdfcGFja2V0KHBBZCwgcEJBRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCX0KLQkvLwotCS8vIFYuIFJlY2VpdmUgc2VxIHN1cnBhc3NlcyBXaW4obGFzdHNlcSArIG5NU0RVKS4gU28gcmVmcmVzaCBhbGwgcmVvcmRlciBidWZmZXIKLQkvLwotCWVsc2UKLQl7Ci0JCUxPTkcgV2luU3RhcnRTZXEsIFRtcFNlcTsKLQotCi0JCVRtcFNlcSA9IFNlcXVlbmNlIC0gKHBCQUVudHJ5LT5CQVdpblNpemUpIC0xOwotCQlpZiAoVG1wU2VxIDwgMCkKLQkJewotCQkJVG1wU2VxID0gKE1BWFNFUSsxKSArIFRtcFNlcTsKLQkJfQotCQlXaW5TdGFydFNlcSA9IChUbXBTZXErMSkgJiBNQVhTRVE7Ci0JCWJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHBBZCwgcEJBRW50cnksIFdpblN0YXJ0U2VxKTsKLQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBXaW5TdGFydFNlcTsgLy9UbXBTZXE7Ci0KLQkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7Ci0KLQkJYmFfZW5xdWV1ZV9yZW9yZGVyaW5nX3BhY2tldChwQWQsIHBCQUVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQotCQlUbXBTZXEgPSBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKHBBZCwgcEJBRW50cnksIHBCQUVudHJ5LT5MYXN0SW5kU2VxKTsKLQkJaWYgKFRtcFNlcSAhPSBSRVNFVF9SQ1ZfU0VRKQotCQl7Ci0JCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFRtcFNlcTsKLQkJfQotCX0KLX0KLQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2Flcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2Flcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2NiYmJmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9hZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NjAgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQljbW1fYWVzLmMKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlQYXVsIFd1CQkwMi0yNS0wMgkJSW5pdGlhbAotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLXR5cGVkZWYJc3RydWN0Ci17Ci0gICAgVUlOVDMyIGVya1s2NF07ICAgICAvKiBlbmNyeXB0aW9uIHJvdW5kIGtleXMgKi8KLSAgICBVSU5UMzIgZHJrWzY0XTsgICAgIC8qIGRlY3J5cHRpb24gcm91bmQga2V5cyAqLwotICAgIGludCBucjsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHJvdW5kcyAqLwotfQotYWVzX2NvbnRleHQ7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKiBTQk9YIFRhYmxlICoqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotVUNIQVIgU2JveFRhYmxlWzI1Nl0gPQotewotCTB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUsCi0JMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3NiwKLQkweGNhLCAweDgyLCAweGM5LCAweDdkLCAweGZhLCAweDU5LCAweDQ3LCAweGYwLAotCTB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzAsCi0JMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYywKLQkweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4LCAweDMxLCAweDE1LAotCTB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEsCi0JMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NSwKLQkweDA5LCAweDgzLCAweDJjLCAweDFhLCAweDFiLCAweDZlLCAweDVhLCAweGEwLAotCTB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQsCi0JMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1YiwKLQkweDZhLCAweGNiLCAweGJlLCAweDM5LCAweDRhLCAweDRjLCAweDU4LCAweGNmLAotCTB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUsCi0JMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCwKLQkweDUxLCAweGEzLCAweDQwLCAweDhmLCAweDkyLCAweDlkLCAweDM4LCAweGY1LAotCTB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIsCi0JMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNywKLQkweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkLCAweDE5LCAweDczLAotCTB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgsCi0JMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYiwKLQkweGUwLCAweDMyLCAweDNhLCAweDBhLCAweDQ5LCAweDA2LCAweDI0LCAweDVjLAotCTB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzksCi0JMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSwKLQkweDZjLCAweDU2LCAweGY0LCAweGVhLCAweDY1LCAweDdhLCAweGFlLCAweDA4LAotCTB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYsCi0JMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YSwKLQkweDcwLCAweDNlLCAweGI1LCAweDY2LCAweDQ4LCAweDAzLCAweGY2LCAweDBlLAotCTB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUsCi0JMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NCwKLQkweDliLCAweDFlLCAweDg3LCAweGU5LCAweGNlLCAweDU1LCAweDI4LCAweGRmLAotCTB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgsCi0JMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNgotfTsKLQotVk9JRCB4b3JfMzIoCi0JSU4gIFBVQ0hBUiAgYSwKLQlJTiAgUFVDSEFSICBiLAotCU9VVCBQVUNIQVIgIG91dCkKLXsKLQlJTlQgaTsKLQotCWZvciAoaT0wO2k8NDsgaSsrKQotCXsKLQkJb3V0W2ldID0gYVtpXSBeIGJbaV07Ci0JfQotfQotCi1WT0lEIHhvcl8xMjgoCi0JSU4gIFBVQ0hBUiAgYSwKLQlJTiAgUFVDSEFSICBiLAotCU9VVCBQVUNIQVIgIG91dCkKLXsKLQlJTlQgaTsKLQotCWZvciAoaT0wO2k8MTY7IGkrKykKLQl7Ci0JCW91dFtpXSA9IGFbaV0gXiBiW2ldOwotCX0KLX0KLQotVUNIQVIgUlRNUENraXBTYm94KAotCUlOICBVQ0hBUiAgIGEpCi17Ci0JcmV0dXJuIFNib3hUYWJsZVsoaW50KWFdOwotfQotCi1WT0lEIG5leHRfa2V5KAotCUlOICBQVUNIQVIgIGtleSwKLQlJTiAgSU5UICAgICByb3VuZCkKLXsKLQlVQ0hBUiAgICAgICByY29uOwotCVVDSEFSICAgICAgIHNib3hfa2V5WzRdOwotCVVDSEFSICAgICAgIHJjb25fdGFibGVbMTJdID0KLQl7Ci0JCTB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsCi0JCTB4MWIsIDB4MzYsIDB4MzYsIDB4MzYKLQl9OwotCi0Jc2JveF9rZXlbMF0gPSBSVE1QQ2tpcFNib3goa2V5WzEzXSk7Ci0Jc2JveF9rZXlbMV0gPSBSVE1QQ2tpcFNib3goa2V5WzE0XSk7Ci0Jc2JveF9rZXlbMl0gPSBSVE1QQ2tpcFNib3goa2V5WzE1XSk7Ci0Jc2JveF9rZXlbM10gPSBSVE1QQ2tpcFNib3goa2V5WzEyXSk7Ci0KLQlyY29uID0gcmNvbl90YWJsZVtyb3VuZF07Ci0KLQl4b3JfMzIoJmtleVswXSwgc2JveF9rZXksICZrZXlbMF0pOwotCWtleVswXSA9IGtleVswXSBeIHJjb247Ci0KLQl4b3JfMzIoJmtleVs0XSwgJmtleVswXSwgJmtleVs0XSk7Ci0JeG9yXzMyKCZrZXlbOF0sICZrZXlbNF0sICZrZXlbOF0pOwotCXhvcl8zMigma2V5WzEyXSwgJmtleVs4XSwgJmtleVsxMl0pOwotfQotCi1WT0lEIGJ5dGVfc3ViKAotCUlOICBQVUNIQVIgIGluLAotCU9VVCBQVUNIQVIgIG91dCkKLXsKLQlJTlQgaTsKLQotCWZvciAoaT0wOyBpPCAxNjsgaSsrKQotCXsKLQkJb3V0W2ldID0gUlRNUENraXBTYm94KGluW2ldKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBiaXR3aXNlX3hvcigpICAgICAgICAgICAgICAgICAgICAqLwotLyogQSAxMjggYml0LCBiaXR3aXNlIGV4Y2x1c2l2ZSBvciAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYml0d2lzZV94b3IodW5zaWduZWQgY2hhciAqaW5hLCB1bnNpZ25lZCBjaGFyICppbmIsIHVuc2lnbmVkIGNoYXIgKm91dCkKLXsKLQlpbnQgaTsKLQlmb3IgKGk9MDsgaTwxNjsgaSsrKQotCXsKLQkJb3V0W2ldID0gaW5hW2ldIF4gaW5iW2ldOwotCX0KLX0KLQotVk9JRCBzaGlmdF9yb3coCi0JSU4gIFBVQ0hBUiAgaW4sCi0JT1VUIFBVQ0hBUiAgb3V0KQotewotCW91dFswXSA9ICBpblswXTsKLQlvdXRbMV0gPSAgaW5bNV07Ci0Jb3V0WzJdID0gIGluWzEwXTsKLQlvdXRbM10gPSAgaW5bMTVdOwotCW91dFs0XSA9ICBpbls0XTsKLQlvdXRbNV0gPSAgaW5bOV07Ci0Jb3V0WzZdID0gIGluWzE0XTsKLQlvdXRbN10gPSAgaW5bM107Ci0Jb3V0WzhdID0gIGluWzhdOwotCW91dFs5XSA9ICBpblsxM107Ci0Jb3V0WzEwXSA9IGluWzJdOwotCW91dFsxMV0gPSBpbls3XTsKLQlvdXRbMTJdID0gaW5bMTJdOwotCW91dFsxM10gPSBpblsxXTsKLQlvdXRbMTRdID0gaW5bNl07Ci0Jb3V0WzE1XSA9IGluWzExXTsKLX0KLQotVk9JRCBtaXhfY29sdW1uKAotCUlOICBQVUNIQVIgIGluLAotCU9VVCBQVUNIQVIgIG91dCkKLXsKLQlJTlQgICAgICAgICBpOwotCVVDSEFSICAgICAgIGFkZDFiWzRdOwotCVVDSEFSICAgICAgIGFkZDFiZjdbNF07Ci0JVUNIQVIgICAgICAgcm90bFs0XTsKLQlVQ0hBUiAgICAgICBzd2FwX2hhbGZzWzRdOwotCVVDSEFSICAgICAgIGFuZGY3WzRdOwotCVVDSEFSICAgICAgIHJvdHJbNF07Ci0JVUNIQVIgICAgICAgdGVtcFs0XTsKLQlVQ0hBUiAgICAgICB0ZW1wYls0XTsKLQotCWZvciAoaT0wIDsgaTw0OyBpKyspCi0JewotCQlpZiAoKGluW2ldICYgMHg4MCk9PSAweDgwKQotCQkJYWRkMWJbaV0gPSAweDFiOwotCQllbHNlCi0JCQlhZGQxYltpXSA9IDB4MDA7Ci0JfQotCi0Jc3dhcF9oYWxmc1swXSA9IGluWzJdOyAgICAvKiBTd2FwIGhhbGZzICovCi0Jc3dhcF9oYWxmc1sxXSA9IGluWzNdOwotCXN3YXBfaGFsZnNbMl0gPSBpblswXTsKLQlzd2FwX2hhbGZzWzNdID0gaW5bMV07Ci0KLQlyb3RsWzBdID0gaW5bM107ICAgICAgICAvKiBSb3RhdGUgbGVmdCA4IGJpdHMgKi8KLQlyb3RsWzFdID0gaW5bMF07Ci0Jcm90bFsyXSA9IGluWzFdOwotCXJvdGxbM10gPSBpblsyXTsKLQotCWFuZGY3WzBdID0gaW5bMF0gJiAweDdmOwotCWFuZGY3WzFdID0gaW5bMV0gJiAweDdmOwotCWFuZGY3WzJdID0gaW5bMl0gJiAweDdmOwotCWFuZGY3WzNdID0gaW5bM10gJiAweDdmOwotCi0JZm9yIChpID0gMzsgaT4wOyBpLS0pICAgIC8qIGxvZ2ljYWwgc2hpZnQgbGVmdCAxIGJpdCAqLwotCXsKLQkJYW5kZjdbaV0gPSBhbmRmN1tpXSA8PCAxOwotCQlpZiAoKGFuZGY3W2ktMV0gJiAweDgwKSA9PSAweDgwKQotCQl7Ci0JCQlhbmRmN1tpXSA9IChhbmRmN1tpXSB8IDB4MDEpOwotCQl9Ci0JfQotCWFuZGY3WzBdID0gYW5kZjdbMF0gPDwgMTsKLQlhbmRmN1swXSA9IGFuZGY3WzBdICYgMHhmZTsKLQotCXhvcl8zMihhZGQxYiwgYW5kZjcsIGFkZDFiZjcpOwotCi0JeG9yXzMyKGluLCBhZGQxYmY3LCByb3RyKTsKLQotCXRlbXBbMF0gPSByb3RyWzBdOyAgICAgICAgIC8qIFJvdGF0ZSByaWdodCA4IGJpdHMgKi8KLQlyb3RyWzBdID0gcm90clsxXTsKLQlyb3RyWzFdID0gcm90clsyXTsKLQlyb3RyWzJdID0gcm90clszXTsKLQlyb3RyWzNdID0gdGVtcFswXTsKLQotCXhvcl8zMihhZGQxYmY3LCByb3RyLCB0ZW1wKTsKLQl4b3JfMzIoc3dhcF9oYWxmcywgcm90bCx0ZW1wYik7Ci0JeG9yXzMyKHRlbXAsIHRlbXBiLCBvdXQpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjEoKSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQnVpbGRzIHRoZSBmaXJzdCBNSUMgaGVhZGVyIGJsb2NrIGZyb20gICAgICAgKi8KLS8qIGhlYWRlciBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGNvbnN0cnVjdF9taWNfaGVhZGVyMSgKLQl1bnNpZ25lZCBjaGFyICptaWNfaGVhZGVyMSwKLQlpbnQgaGVhZGVyX2xlbmd0aCwKLQl1bnNpZ25lZCBjaGFyICptcGR1KQotewotCW1pY19oZWFkZXIxWzBdID0gKHVuc2lnbmVkIGNoYXIpKChoZWFkZXJfbGVuZ3RoIC0gMikgLyAyNTYpOwotCW1pY19oZWFkZXIxWzFdID0gKHVuc2lnbmVkIGNoYXIpKChoZWFkZXJfbGVuZ3RoIC0gMikgJSAyNTYpOwotCW1pY19oZWFkZXIxWzJdID0gbXBkdVswXSAmIDB4Y2Y7ICAgIC8qIE11dGUgQ0YgcG9sbCAmIENGIGFjayBiaXRzICovCi0JbWljX2hlYWRlcjFbM10gPSBtcGR1WzFdICYgMHhjNzsgICAgLyogTXV0ZSByZXRyeSwgbW9yZSBkYXRhIGFuZCBwd3IgbWd0IGJpdHMgKi8KLQltaWNfaGVhZGVyMVs0XSA9IG1wZHVbNF07ICAgICAgIC8qIEExICovCi0JbWljX2hlYWRlcjFbNV0gPSBtcGR1WzVdOwotCW1pY19oZWFkZXIxWzZdID0gbXBkdVs2XTsKLQltaWNfaGVhZGVyMVs3XSA9IG1wZHVbN107Ci0JbWljX2hlYWRlcjFbOF0gPSBtcGR1WzhdOwotCW1pY19oZWFkZXIxWzldID0gbXBkdVs5XTsKLQltaWNfaGVhZGVyMVsxMF0gPSBtcGR1WzEwXTsgICAgIC8qIEEyICovCi0JbWljX2hlYWRlcjFbMTFdID0gbXBkdVsxMV07Ci0JbWljX2hlYWRlcjFbMTJdID0gbXBkdVsxMl07Ci0JbWljX2hlYWRlcjFbMTNdID0gbXBkdVsxM107Ci0JbWljX2hlYWRlcjFbMTRdID0gbXBkdVsxNF07Ci0JbWljX2hlYWRlcjFbMTVdID0gbXBkdVsxNV07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoKSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQnVpbGRzIHRoZSBsYXN0IE1JQyBoZWFkZXIgYmxvY2sgZnJvbSAgICAgICAgKi8KLS8qIGhlYWRlciBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGNvbnN0cnVjdF9taWNfaGVhZGVyMigKLQl1bnNpZ25lZCBjaGFyICptaWNfaGVhZGVyMiwKLQl1bnNpZ25lZCBjaGFyICptcGR1LAotCWludCBhNF9leGlzdHMsCi0JaW50IHFjX2V4aXN0cykKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGk8MTY7IGkrKykgbWljX2hlYWRlcjJbaV09MHgwMDsKLQotCW1pY19oZWFkZXIyWzBdID0gbXBkdVsxNl07ICAgIC8qIEEzICovCi0JbWljX2hlYWRlcjJbMV0gPSBtcGR1WzE3XTsKLQltaWNfaGVhZGVyMlsyXSA9IG1wZHVbMThdOwotCW1pY19oZWFkZXIyWzNdID0gbXBkdVsxOV07Ci0JbWljX2hlYWRlcjJbNF0gPSBtcGR1WzIwXTsKLQltaWNfaGVhZGVyMls1XSA9IG1wZHVbMjFdOwotCi0JLy8gSW4gU2VxdWVuY2UgQ29udHJvbCBmaWVsZCwgbXV0ZSBzZXF1ZW5jZSBudW1lciBiaXRzICgxMi1iaXQpCi0JbWljX2hlYWRlcjJbNl0gPSBtcGR1WzIyXSAmIDB4MGY7ICAgLyogU0MgKi8KLQltaWNfaGVhZGVyMls3XSA9IDB4MDA7IC8qIG1wZHVbMjNdOyAqLwotCi0JaWYgKCghcWNfZXhpc3RzKSAmIGE0X2V4aXN0cykKLQl7Ci0JCWZvciAoaT0wO2k8NjtpKyspIG1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAgIC8qIEE0ICovCi0KLQl9Ci0KLQlpZiAocWNfZXhpc3RzICYmICghYTRfZXhpc3RzKSkKLQl7Ci0JCW1pY19oZWFkZXIyWzhdID0gbXBkdVsyNF0gJiAweDBmOyAvKiBtdXRlIGJpdHMgMTUgLSA0ICovCi0JCW1pY19oZWFkZXIyWzldID0gbXBkdVsyNV0gJiAweDAwOwotCX0KLQotCWlmIChxY19leGlzdHMgJiYgYTRfZXhpc3RzKQotCXsKLQkJZm9yIChpPTA7aTw2O2krKykgbWljX2hlYWRlcjJbOCtpXSA9IG1wZHVbMjQraV07ICAgLyogQTQgKi8KLQotCQltaWNfaGVhZGVyMlsxNF0gPSBtcGR1WzMwXSAmIDB4MGY7Ci0JCW1pY19oZWFkZXIyWzE1XSA9IG1wZHVbMzFdICYgMHgwMDsKLQl9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGNvbnN0cnVjdF9taWNfaXYoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBCdWlsZHMgdGhlIE1JQyBJViBmcm9tIGhlYWRlciBmaWVsZHMgYW5kIFBOICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBjb25zdHJ1Y3RfbWljX2l2KAotCXVuc2lnbmVkIGNoYXIgKm1pY19pdiwKLQlpbnQgcWNfZXhpc3RzLAotCWludCBhNF9leGlzdHMsCi0JdW5zaWduZWQgY2hhciAqbXBkdSwKLQl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW5ndGgsCi0JdW5zaWduZWQgY2hhciAqcG5fdmVjdG9yKQotewotCWludCBpOwotCi0JbWljX2l2WzBdID0gMHg1OTsKLQlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKLQkJbWljX2l2WzFdID0gbXBkdVszMF0gJiAweDBmOyAgICAvKiBRb1NfVEMgICAgICAgICAgICovCi0JaWYgKHFjX2V4aXN0cyAmJiAhYTRfZXhpc3RzKQotCQltaWNfaXZbMV0gPSBtcGR1WzI0XSAmIDB4MGY7ICAgLyogbXV0ZSBiaXRzIDctNCAgICAqLwotCWlmICghcWNfZXhpc3RzKQotCQltaWNfaXZbMV0gPSAweDAwOwotCWZvciAoaSA9IDI7IGkgPCA4OyBpKyspCi0JCW1pY19pdltpXSA9IG1wZHVbaSArIDhdOyAgICAgICAgICAgICAgICAgICAgLyogbWljX2l2WzI6N10gPSBBMlswOjVdID0gbXBkdVsxMDoxNV0gKi8KLSNpZmRlZiBDT05TSVNURU5UX1BOX09SREVSCi0JCWZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQotCQkJbWljX2l2W2ldID0gcG5fdmVjdG9yW2kgLSA4XTsgICAgICAgICAgIC8qIG1pY19pdls4OjEzXSA9IFBOWzA6NV0gKi8KLSNlbHNlCi0JCWZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQotCQkJbWljX2l2W2ldID0gcG5fdmVjdG9yWzEzIC0gaV07ICAgICAgICAgIC8qIG1pY19pdls4OjEzXSA9IFBOWzU6MF0gKi8KLSNlbmRpZgotCWkgPSAocGF5bG9hZF9sZW5ndGggLyAyNTYpOwotCWkgPSAocGF5bG9hZF9sZW5ndGggJSAyNTYpOwotCW1pY19pdlsxNF0gPSAodW5zaWduZWQgY2hhcikgKHBheWxvYWRfbGVuZ3RoIC8gMjU2KTsKLQltaWNfaXZbMTVdID0gKHVuc2lnbmVkIGNoYXIpIChwYXlsb2FkX2xlbmd0aCAlIDI1Nik7Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBhZXMxMjhrMTI4ZCgpICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBlcmZvcm1zIGEgMTI4IGJpdCBBRVMgZW5jcnlwdCB3aXRoICAqLwotLyogMTI4IGJpdCBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYWVzMTI4azEyOGQodW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBjaGFyICpjaXBoZXJ0ZXh0KQotewotCWludCByb3VuZDsKLQlpbnQgaTsKLQl1bnNpZ25lZCBjaGFyIGludGVybWVkaWF0ZWFbMTZdOwotCXVuc2lnbmVkIGNoYXIgaW50ZXJtZWRpYXRlYlsxNl07Ci0JdW5zaWduZWQgY2hhciByb3VuZF9rZXlbMTZdOwotCi0JZm9yKGk9MDsgaTwxNjsgaSsrKSByb3VuZF9rZXlbaV0gPSBrZXlbaV07Ci0KLQlmb3IgKHJvdW5kID0gMDsgcm91bmQgPCAxMTsgcm91bmQrKykKLQl7Ci0JCWlmIChyb3VuZCA9PSAwKQotCQl7Ci0JCQl4b3JfMTI4KHJvdW5kX2tleSwgZGF0YSwgY2lwaGVydGV4dCk7Ci0JCQluZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKLQkJfQotCQllbHNlIGlmIChyb3VuZCA9PSAxMCkKLQkJewotCQkJYnl0ZV9zdWIoY2lwaGVydGV4dCwgaW50ZXJtZWRpYXRlYSk7Ci0JCQlzaGlmdF9yb3coaW50ZXJtZWRpYXRlYSwgaW50ZXJtZWRpYXRlYik7Ci0JCQl4b3JfMTI4KGludGVybWVkaWF0ZWIsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7Ci0JCX0KLQkJZWxzZSAgICAvKiAxIC0gOSAqLwotCQl7Ci0JCQlieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKLQkJCXNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKLQkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbMF0sICZpbnRlcm1lZGlhdGVhWzBdKTsKLQkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbNF0sICZpbnRlcm1lZGlhdGVhWzRdKTsKLQkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbOF0sICZpbnRlcm1lZGlhdGVhWzhdKTsKLQkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbMTJdLCAmaW50ZXJtZWRpYXRlYVsxMl0pOwotCQkJeG9yXzEyOChpbnRlcm1lZGlhdGVhLCByb3VuZF9rZXksIGNpcGhlcnRleHQpOwotCQkJbmV4dF9rZXkocm91bmRfa2V5LCByb3VuZCk7Ci0JCX0KLQl9Ci0KLX0KLQotdm9pZCBjb25zdHJ1Y3RfY3RyX3ByZWxvYWQoCi0JdW5zaWduZWQgY2hhciAqY3RyX3ByZWxvYWQsCi0JaW50IGE0X2V4aXN0cywKLQlpbnQgcWNfZXhpc3RzLAotCXVuc2lnbmVkIGNoYXIgKm1wZHUsCi0JdW5zaWduZWQgY2hhciAqcG5fdmVjdG9yLAotCWludCBjKQotewotCi0JaW50IGkgPSAwOwotCWZvciAoaT0wOyBpPDE2OyBpKyspIGN0cl9wcmVsb2FkW2ldID0gMHgwMDsKLQlpID0gMDsKLQotCWN0cl9wcmVsb2FkWzBdID0gMHgwMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZyAqLwotCWlmIChxY19leGlzdHMgJiYgYTRfZXhpc3RzKSBjdHJfcHJlbG9hZFsxXSA9IG1wZHVbMzBdICYgMHgwZjsgICAvKiBRb0NfQ29udHJvbCAgKi8KLQlpZiAocWNfZXhpc3RzICYmICFhNF9leGlzdHMpIGN0cl9wcmVsb2FkWzFdID0gbXBkdVsyNF0gJiAweDBmOwotCi0JZm9yIChpID0gMjsgaSA8IDg7IGkrKykKLQkJY3RyX3ByZWxvYWRbaV0gPSBtcGR1W2kgKyA4XTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGN0cl9wcmVsb2FkWzI6N10gPSBBMlswOjVdID0gbXBkdVsxMDoxNV0gKi8KLSNpZmRlZiBDT05TSVNURU5UX1BOX09SREVSCi0JICBmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKLQkJCWN0cl9wcmVsb2FkW2ldID0gICAgcG5fdmVjdG9yW2kgLSA4XTsgICAgICAgICAgIC8qIGN0cl9wcmVsb2FkWzg6MTNdID0gUE5bMDo1XSAqLwotI2Vsc2UKLQkgIGZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQotCQkJY3RyX3ByZWxvYWRbaV0gPSAgICBwbl92ZWN0b3JbMTMgLSBpXTsgICAgICAgICAgLyogY3RyX3ByZWxvYWRbODoxM10gPSBQTls1OjBdICovCi0jZW5kaWYKLQljdHJfcHJlbG9hZFsxNF0gPSAgKHVuc2lnbmVkIGNoYXIpIChjIC8gMjU2KTsgLy8gQ3RyCi0JY3RyX3ByZWxvYWRbMTVdID0gICh1bnNpZ25lZCBjaGFyKSAoYyAlIDI1Nik7Ci0KLX0KLQotQk9PTEVBTiBSVE1QU29mdERlY3J5cHRBRVMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSCXBEYXRhLAotCUlOIFVMT05HCURhdGFCeXRlQ250LAotCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpCi17Ci0JVUNIQVIJCQlLZXlJRDsKLQlVSU5UCQkJSGVhZGVyTGVuOwotCVVDSEFSCQkJUE5bNl07Ci0JVUlOVAkJCXBheWxvYWRfbGVuOwotCVVJTlQJCQludW1fYmxvY2tzOwotCVVJTlQJCQlwYXlsb2FkX3JlbWFpbmRlcjsKLQlVU0hPUlQJCQlmYzsKLQlVQ0hBUgkJCWZjMDsKLQlVQ0hBUgkJCWZjMTsKLQlVSU5UCQkJZnJhbWVfdHlwZTsKLQlVSU5UCQkJZnJhbWVfc3VidHlwZTsKLQlVSU5UCQkJZnJvbV9kczsKLQlVSU5UCQkJdG9fZHM7Ci0JSU5UCQkJCWE0X2V4aXN0czsKLQlJTlQJCQkJcWNfZXhpc3RzOwotCVVDSEFSCQkJYWVzX291dFsxNl07Ci0JaW50CQkJcGF5bG9hZF9pbmRleDsKLQlVSU5UCQkJaTsKLQlVQ0hBUgkJCWN0cl9wcmVsb2FkWzE2XTsKLQlVQ0hBUgkJCWNoYWluX2J1ZmZlclsxNl07Ci0JVUNIQVIJCQlwYWRkZWRfYnVmZmVyWzE2XTsKLQlVQ0hBUgkJCW1pY19pdlsxNl07Ci0JVUNIQVIJCQltaWNfaGVhZGVyMVsxNl07Ci0JVUNIQVIJCQltaWNfaGVhZGVyMlsxNl07Ci0JVUNIQVIJCQlNSUNbOF07Ci0JVUNIQVIJCQlUcmFpbE1JQ1s4XTsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBEYXRhLCBESVJfUkVBRCwgRkFMU0UpOwotI2VuZGlmCi0KLQlmYzAgPSAqcERhdGE7Ci0JZmMxID0gKihwRGF0YSArIDEpOwotCi0JZmMgPSAqKChQVVNIT1JUKXBEYXRhKTsKLQotCWZyYW1lX3R5cGUgPSAoKGZjMCA+PiAyKSAmIDB4MDMpOwotCWZyYW1lX3N1YnR5cGUgPSAoKGZjMCA+PiA0KSAmIDB4MGYpOwotCi0JZnJvbV9kcyA9IChmYzEgJiAweDIpID4+IDE7Ci0JdG9fZHMgPSAoZmMxICYgMHgxKTsKLQotCWE0X2V4aXN0cyA9IChmcm9tX2RzICYgdG9fZHMpOwotCXFjX2V4aXN0cyA9ICgoZnJhbWVfc3VidHlwZSA9PSAweDA4KSB8fCAgICAvKiBBc3N1bWVkIFFvUyBzdWJ0eXBlcyAqLwotCQkJCSAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwOSkgfHwgICAvKiBMaWtlbHkgdG8gY2hhbmdlLiAgICAqLwotCQkJCSAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYSkgfHwKLQkJCQkgIChmcmFtZV9zdWJ0eXBlID09IDB4MGIpCi0JCQkJICk7Ci0KLQlIZWFkZXJMZW4gPSAyNDsKLQlpZiAoYTRfZXhpc3RzKQotCQlIZWFkZXJMZW4gKz0gNjsKLQotCUtleUlEID0gKigoUFVDSEFSKShwRGF0YSsgSGVhZGVyTGVuICsgMykpOwotCUtleUlEID0gS2V5SUQgPj4gNjsKLQotCWlmIChwV3BhS2V5W0tleUlEXS5LZXlMZW4gPT0gMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTb2Z0RGVjcnlwdEFFUyBmYWlsZWQhKEtleUlEWyVkXSBMZW5ndGggY2FuIG5vdCBiZSAwKVxuIiwgS2V5SUQpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCVBOWzBdID0gKihwRGF0YSsgSGVhZGVyTGVuKTsKLQlQTlsxXSA9ICoocERhdGErIEhlYWRlckxlbiArIDEpOwotCVBOWzJdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgNCk7Ci0JUE5bM10gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyA1KTsKLQlQTls0XSA9ICoocERhdGErIEhlYWRlckxlbiArIDYpOwotCVBOWzVdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgNyk7Ci0KLQlwYXlsb2FkX2xlbiA9IERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCAtIDg7CS8vIDggYnl0ZXMgZm9yIENDTVAgaGVhZGVyICwgOCBieXRlcyBmb3IgTUlDCi0JcGF5bG9hZF9yZW1haW5kZXIgPSAocGF5bG9hZF9sZW4pICUgMTY7Ci0JbnVtX2Jsb2NrcyA9IChwYXlsb2FkX2xlbikgLyAxNjsKLQotCi0KLQkvLyBGaW5kIHN0YXJ0IG9mIHBheWxvYWQKLQlwYXlsb2FkX2luZGV4ID0gSGVhZGVyTGVuICsgODsgLy9JVitFSVYKLQotCWZvciAoaT0wOyBpPCBudW1fYmxvY2tzOyBpKyspCi0JewotCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsCi0JCQkJCQkJCWE0X2V4aXN0cywKLQkJCQkJCQkJcWNfZXhpc3RzLAotCQkJCQkJCQlwRGF0YSwKLQkJCQkJCQkJUE4sCi0JCQkJCQkJCWkrMSApOwotCi0JCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwotCi0JCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgY2hhaW5fYnVmZmVyKTsKLQkJTmRpc01vdmVNZW1vcnkocERhdGEgKyBwYXlsb2FkX2luZGV4IC0gOCwgY2hhaW5fYnVmZmVyLCAxNik7Ci0JCXBheWxvYWRfaW5kZXggKz0gMTY7Ci0JfQotCi0JLy8KLQkvLyBJZiB0aGVyZSBpcyBhIHNob3J0IGZpbmFsIGJsb2NrLCB0aGVuIHBhZCBpdAotCS8vIGVuY3J5cHQgaXQgYW5kIGNvcHkgdGhlIHVucGFkZGVkIHBhcnQgYmFjawotCS8vCi0JaWYgKHBheWxvYWRfcmVtYWluZGVyID4gMCkKLQl7Ci0JCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwKLQkJCQkJCQkJYTRfZXhpc3RzLAotCQkJCQkJCQlxY19leGlzdHMsCi0JCQkJCQkJCXBEYXRhLAotCQkJCQkJCQlQTiwKLQkJCQkJCQkJbnVtX2Jsb2NrcyArIDEpOwotCi0JCU5kaXNaZXJvTWVtb3J5KHBhZGRlZF9idWZmZXIsIDE2KTsKLQkJTmRpc01vdmVNZW1vcnkocGFkZGVkX2J1ZmZlciwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBwYXlsb2FkX3JlbWFpbmRlcik7Ci0KLQkJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7Ci0KLQkJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKLQkJTmRpc01vdmVNZW1vcnkocERhdGEgKyBwYXlsb2FkX2luZGV4IC0gOCwgY2hhaW5fYnVmZmVyLCBwYXlsb2FkX3JlbWFpbmRlcik7Ci0JCXBheWxvYWRfaW5kZXggKz0gcGF5bG9hZF9yZW1haW5kZXI7Ci0JfQotCi0JLy8KLQkvLyBEZXNjcnlwdCB0aGUgTUlDCi0JLy8KLQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsCi0JCQkJCQkJYTRfZXhpc3RzLAotCQkJCQkJCXFjX2V4aXN0cywKLQkJCQkJCQlwRGF0YSwKLQkJCQkJCQlQTiwKLQkJCQkJCQkwKTsKLQlOZGlzWmVyb01lbW9yeShwYWRkZWRfYnVmZmVyLCAxNik7Ci0JTmRpc01vdmVNZW1vcnkocGFkZGVkX2J1ZmZlciwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCA4KTsKLQotCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwotCi0JYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKLQotCU5kaXNNb3ZlTWVtb3J5KFRyYWlsTUlDLCBjaGFpbl9idWZmZXIsIDgpOwotCi0KLQkvLwotCS8vIENhbGN1bGF0ZSBNSUMKLQkvLwotCi0JLy9Gb3JjZSB0aGUgcHJvdGVjdGVkIGZyYW1lIGJpdCBvbgotCSoocERhdGEgKyAxKSA9ICoocERhdGEgKyAxKSB8IDB4NDA7Ci0KLQkvLyBGaW5kIHN0YXJ0IG9mIHBheWxvYWQKLQkvLyBCZWNhdXNlIHRoZSBDQ01QIGhlYWRlciBoYXMgYmVlbiByZW1vdmVkCi0JcGF5bG9hZF9pbmRleCA9IEhlYWRlckxlbjsKLQotCWNvbnN0cnVjdF9taWNfaXYoCi0JCQkJCW1pY19pdiwKLQkJCQkJcWNfZXhpc3RzLAotCQkJCQlhNF9leGlzdHMsCi0JCQkJCXBEYXRhLAotCQkJCQlwYXlsb2FkX2xlbiwKLQkJCQkJUE4pOwotCi0JY29uc3RydWN0X21pY19oZWFkZXIxKAotCQkJCQkJbWljX2hlYWRlcjEsCi0JCQkJCQlIZWFkZXJMZW4sCi0JCQkJCQlwRGF0YSk7Ci0KLQljb25zdHJ1Y3RfbWljX2hlYWRlcjIoCi0JCQkJCQltaWNfaGVhZGVyMiwKLQkJCQkJCXBEYXRhLAotCQkJCQkJYTRfZXhpc3RzLAotCQkJCQkJcWNfZXhpc3RzKTsKLQotCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgbWljX2l2LCBhZXNfb3V0KTsKLQliaXR3aXNlX3hvcihhZXNfb3V0LCBtaWNfaGVhZGVyMSwgY2hhaW5fYnVmZmVyKTsKLQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7Ci0JYml0d2lzZV94b3IoYWVzX291dCwgbWljX2hlYWRlcjIsIGNoYWluX2J1ZmZlcik7Ci0JYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOwotCi0JLy8gaXRlcmF0ZSB0aHJvdWdoIGVhY2ggMTYgYnl0ZSBwYXlsb2FkIGJsb2NrCi0JZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykKLQl7Ci0JCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgY2hhaW5fYnVmZmVyKTsKLQkJcGF5bG9hZF9pbmRleCArPSAxNjsKLQkJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOwotCX0KLQotCS8vIEFkZCBvbiB0aGUgZmluYWwgcGF5bG9hZCBibG9jayBpZiBpdCBuZWVkcyBwYWRkaW5nCi0JaWYgKHBheWxvYWRfcmVtYWluZGVyID4gMCkKLQl7Ci0JCU5kaXNaZXJvTWVtb3J5KHBhZGRlZF9idWZmZXIsIDE2KTsKLQkJTmRpc01vdmVNZW1vcnkocGFkZGVkX2J1ZmZlciwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBwYXlsb2FkX3JlbWFpbmRlcik7Ci0KLQkJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKLQkJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOwotCX0KLQotCS8vIGFlc19vdXQgY29udGFpbnMgcGFkZGVkIG1pYywgZGlzY2FyZCBtb3N0IHNpZ25pZmljYW50Ci0JLy8gOCBieXRlcyB0byBnZW5lcmF0ZSA2NCBiaXQgTUlDCi0JZm9yIChpID0gMCA7IGkgPCA4OyBpKyspIE1JQ1tpXSA9IGFlc19vdXRbaV07Ci0KLQlpZiAoIU5kaXNFcXVhbE1lbW9yeShNSUMsIFRyYWlsTUlDLCA4KSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTb2Z0RGVjcnlwdEFFUywgTUlDIEVycm9yICFcbiIpKTsJIC8vTUlDIGVycm9yLgotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcERhdGEsIERJUl9SRUFELCBGQUxTRSk7Ci0jZW5kaWYKLQotCXJldHVybiBUUlVFOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09ICBBRVMgRW4vRGVjcnlwdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2lmbmRlZgl1aW50OAotI2RlZmluZQl1aW50OCAgdW5zaWduZWQJY2hhcgotI2VuZGlmCi0KLSNpZm5kZWYJdWludDMyCi0jZGVmaW5lCXVpbnQzMiB1bnNpZ25lZAlpbnQKLSNlbmRpZgotCi0vKiBmb3J3YXJkIFMtYm94ICovCi1zdGF0aWMgdWludDMyIEZTYlsyNTZdID0KLXsKLQkweDYzLCAweDdDLAkweDc3LCAweDdCLAkweEYyLCAweDZCLAkweDZGLCAweEM1LAotCTB4MzAsIDB4MDEsCTB4NjcsIDB4MkIsCTB4RkUsIDB4RDcsCTB4QUIsIDB4NzYsCi0JMHhDQSwgMHg4MiwJMHhDOSwgMHg3RCwJMHhGQSwgMHg1OSwJMHg0NywgMHhGMCwKLQkweEFELCAweEQ0LAkweEEyLCAweEFGLAkweDlDLCAweEE0LAkweDcyLCAweEMwLAotCTB4QjcsIDB4RkQsCTB4OTMsIDB4MjYsCTB4MzYsIDB4M0YsCTB4RjcsIDB4Q0MsCi0JMHgzNCwgMHhBNSwJMHhFNSwgMHhGMSwJMHg3MSwgMHhEOCwJMHgzMSwgMHgxNSwKLQkweDA0LCAweEM3LAkweDIzLCAweEMzLAkweDE4LCAweDk2LAkweDA1LCAweDlBLAotCTB4MDcsIDB4MTIsCTB4ODAsIDB4RTIsCTB4RUIsIDB4MjcsCTB4QjIsIDB4NzUsCi0JMHgwOSwgMHg4MywJMHgyQywgMHgxQSwJMHgxQiwgMHg2RSwJMHg1QSwgMHhBMCwKLQkweDUyLCAweDNCLAkweEQ2LCAweEIzLAkweDI5LCAweEUzLAkweDJGLCAweDg0LAotCTB4NTMsIDB4RDEsCTB4MDAsIDB4RUQsCTB4MjAsIDB4RkMsCTB4QjEsIDB4NUIsCi0JMHg2QSwgMHhDQiwJMHhCRSwgMHgzOSwJMHg0QSwgMHg0QywJMHg1OCwgMHhDRiwKLQkweEQwLCAweEVGLAkweEFBLCAweEZCLAkweDQzLCAweDRELAkweDMzLCAweDg1LAotCTB4NDUsIDB4RjksCTB4MDIsIDB4N0YsCTB4NTAsIDB4M0MsCTB4OUYsIDB4QTgsCi0JMHg1MSwgMHhBMywJMHg0MCwgMHg4RiwJMHg5MiwgMHg5RCwJMHgzOCwgMHhGNSwKLQkweEJDLCAweEI2LAkweERBLCAweDIxLAkweDEwLCAweEZGLAkweEYzLCAweEQyLAotCTB4Q0QsIDB4MEMsCTB4MTMsIDB4RUMsCTB4NUYsIDB4OTcsCTB4NDQsIDB4MTcsCi0JMHhDNCwgMHhBNywJMHg3RSwgMHgzRCwJMHg2NCwgMHg1RCwJMHgxOSwgMHg3MywKLQkweDYwLCAweDgxLAkweDRGLCAweERDLAkweDIyLCAweDJBLAkweDkwLCAweDg4LAotCTB4NDYsIDB4RUUsCTB4QjgsIDB4MTQsCTB4REUsIDB4NUUsCTB4MEIsIDB4REIsCi0JMHhFMCwgMHgzMiwJMHgzQSwgMHgwQSwJMHg0OSwgMHgwNiwJMHgyNCwgMHg1QywKLQkweEMyLCAweEQzLAkweEFDLCAweDYyLAkweDkxLCAweDk1LAkweEU0LCAweDc5LAotCTB4RTcsIDB4QzgsCTB4MzcsIDB4NkQsCTB4OEQsIDB4RDUsCTB4NEUsIDB4QTksCi0JMHg2QywgMHg1NiwJMHhGNCwgMHhFQSwJMHg2NSwgMHg3QSwJMHhBRSwgMHgwOCwKLQkweEJBLCAweDc4LAkweDI1LCAweDJFLAkweDFDLCAweEE2LAkweEI0LCAweEM2LAotCTB4RTgsIDB4REQsCTB4NzQsIDB4MUYsCTB4NEIsIDB4QkQsCTB4OEIsIDB4OEEsCi0JMHg3MCwgMHgzRSwJMHhCNSwgMHg2NiwJMHg0OCwgMHgwMywJMHhGNiwgMHgwRSwKLQkweDYxLCAweDM1LAkweDU3LCAweEI5LAkweDg2LCAweEMxLAkweDFELCAweDlFLAotCTB4RTEsIDB4RjgsCTB4OTgsIDB4MTEsCTB4NjksIDB4RDksCTB4OEUsIDB4OTQsCi0JMHg5QiwgMHgxRSwJMHg4NywgMHhFOSwJMHhDRSwgMHg1NSwJMHgyOCwgMHhERiwKLQkweDhDLCAweEExLAkweDg5LCAweDBELAkweEJGLCAweEU2LAkweDQyLCAweDY4LAotCTB4NDEsIDB4OTksCTB4MkQsIDB4MEYsCTB4QjAsIDB4NTQsCTB4QkIsIDB4MTYKLX07Ci0KLS8qIGZvcndhcmQgdGFibGUgKi8KLSNkZWZpbmUJRlQgXAotXAotCVYoQzYsNjMsNjMsQTUpLAlWKEY4LDdDLDdDLDg0KSwJVihFRSw3Nyw3Nyw5OSksCVYoRjYsN0IsN0IsOEQpLAlcCi0JVihGRixGMixGMiwwRCksCVYoRDYsNkIsNkIsQkQpLAlWKERFLDZGLDZGLEIxKSwJVig5MSxDNSxDNSw1NCksCVwKLQlWKDYwLDMwLDMwLDUwKSwJVigwMiwwMSwwMSwwMyksCVYoQ0UsNjcsNjcsQTkpLAlWKDU2LDJCLDJCLDdEKSwJXAotCVYoRTcsRkUsRkUsMTkpLAlWKEI1LEQ3LEQ3LDYyKSwJVig0RCxBQixBQixFNiksCVYoRUMsNzYsNzYsOUEpLAlcCi0JVig4RixDQSxDQSw0NSksCVYoMUYsODIsODIsOUQpLAlWKDg5LEM5LEM5LDQwKSwJVihGQSw3RCw3RCw4NyksCVwKLQlWKEVGLEZBLEZBLDE1KSwJVihCMiw1OSw1OSxFQiksCVYoOEUsNDcsNDcsQzkpLAlWKEZCLEYwLEYwLDBCKSwJXAotCVYoNDEsQUQsQUQsRUMpLAlWKEIzLEQ0LEQ0LDY3KSwJVig1RixBMixBMixGRCksCVYoNDUsQUYsQUYsRUEpLAlcCi0JVigyMyw5Qyw5QyxCRiksCVYoNTMsQTQsQTQsRjcpLAlWKEU0LDcyLDcyLDk2KSwJVig5QixDMCxDMCw1QiksCVwKLQlWKDc1LEI3LEI3LEMyKSwJVihFMSxGRCxGRCwxQyksCVYoM0QsOTMsOTMsQUUpLAlWKDRDLDI2LDI2LDZBKSwJXAotCVYoNkMsMzYsMzYsNUEpLAlWKDdFLDNGLDNGLDQxKSwJVihGNSxGNyxGNywwMiksCVYoODMsQ0MsQ0MsNEYpLAlcCi0JVig2OCwzNCwzNCw1QyksCVYoNTEsQTUsQTUsRjQpLAlWKEQxLEU1LEU1LDM0KSwJVihGOSxGMSxGMSwwOCksCVwKLQlWKEUyLDcxLDcxLDkzKSwJVihBQixEOCxEOCw3MyksCVYoNjIsMzEsMzEsNTMpLAlWKDJBLDE1LDE1LDNGKSwJXAotCVYoMDgsMDQsMDQsMEMpLAlWKDk1LEM3LEM3LDUyKSwJVig0NiwyMywyMyw2NSksCVYoOUQsQzMsQzMsNUUpLAlcCi0JVigzMCwxOCwxOCwyOCksCVYoMzcsOTYsOTYsQTEpLAlWKDBBLDA1LDA1LDBGKSwJVigyRiw5QSw5QSxCNSksCVwKLQlWKDBFLDA3LDA3LDA5KSwJVigyNCwxMiwxMiwzNiksCVYoMUIsODAsODAsOUIpLAlWKERGLEUyLEUyLDNEKSwJXAotCVYoQ0QsRUIsRUIsMjYpLAlWKDRFLDI3LDI3LDY5KSwJVig3RixCMixCMixDRCksCVYoRUEsNzUsNzUsOUYpLAlcCi0JVigxMiwwOSwwOSwxQiksCVYoMUQsODMsODMsOUUpLAlWKDU4LDJDLDJDLDc0KSwJVigzNCwxQSwxQSwyRSksCVwKLQlWKDM2LDFCLDFCLDJEKSwJVihEQyw2RSw2RSxCMiksCVYoQjQsNUEsNUEsRUUpLAlWKDVCLEEwLEEwLEZCKSwJXAotCVYoQTQsNTIsNTIsRjYpLAlWKDc2LDNCLDNCLDREKSwJVihCNyxENixENiw2MSksCVYoN0QsQjMsQjMsQ0UpLAlcCi0JVig1MiwyOSwyOSw3QiksCVYoREQsRTMsRTMsM0UpLAlWKDVFLDJGLDJGLDcxKSwJVigxMyw4NCw4NCw5NyksCVwKLQlWKEE2LDUzLDUzLEY1KSwJVihCOSxEMSxEMSw2OCksCVYoMDAsMDAsMDAsMDApLAlWKEMxLEVELEVELDJDKSwJXAotCVYoNDAsMjAsMjAsNjApLAlWKEUzLEZDLEZDLDFGKSwJVig3OSxCMSxCMSxDOCksCVYoQjYsNUIsNUIsRUQpLAlcCi0JVihENCw2QSw2QSxCRSksCVYoOEQsQ0IsQ0IsNDYpLAlWKDY3LEJFLEJFLEQ5KSwJVig3MiwzOSwzOSw0QiksCVwKLQlWKDk0LDRBLDRBLERFKSwJVig5OCw0Qyw0QyxENCksCVYoQjAsNTgsNTgsRTgpLAlWKDg1LENGLENGLDRBKSwJXAotCVYoQkIsRDAsRDAsNkIpLAlWKEM1LEVGLEVGLDJBKSwJVig0RixBQSxBQSxFNSksCVYoRUQsRkIsRkIsMTYpLAlcCi0JVig4Niw0Myw0MyxDNSksCVYoOUEsNEQsNEQsRDcpLAlWKDY2LDMzLDMzLDU1KSwJVigxMSw4NSw4NSw5NCksCVwKLQlWKDhBLDQ1LDQ1LENGKSwJVihFOSxGOSxGOSwxMCksCVYoMDQsMDIsMDIsMDYpLAlWKEZFLDdGLDdGLDgxKSwJXAotCVYoQTAsNTAsNTAsRjApLAlWKDc4LDNDLDNDLDQ0KSwJVigyNSw5Riw5RixCQSksCVYoNEIsQTgsQTgsRTMpLAlcCi0JVihBMiw1MSw1MSxGMyksCVYoNUQsQTMsQTMsRkUpLAlWKDgwLDQwLDQwLEMwKSwJVigwNSw4Riw4Riw4QSksCVwKLQlWKDNGLDkyLDkyLEFEKSwJVigyMSw5RCw5RCxCQyksCVYoNzAsMzgsMzgsNDgpLAlWKEYxLEY1LEY1LDA0KSwJXAotCVYoNjMsQkMsQkMsREYpLAlWKDc3LEI2LEI2LEMxKSwJVihBRixEQSxEQSw3NSksCVYoNDIsMjEsMjEsNjMpLAlcCi0JVigyMCwxMCwxMCwzMCksCVYoRTUsRkYsRkYsMUEpLAlWKEZELEYzLEYzLDBFKSwJVihCRixEMixEMiw2RCksCVwKLQlWKDgxLENELENELDRDKSwJVigxOCwwQywwQywxNCksCVYoMjYsMTMsMTMsMzUpLAlWKEMzLEVDLEVDLDJGKSwJXAotCVYoQkUsNUYsNUYsRTEpLAlWKDM1LDk3LDk3LEEyKSwJVig4OCw0NCw0NCxDQyksCVYoMkUsMTcsMTcsMzkpLAlcCi0JVig5MyxDNCxDNCw1NyksCVYoNTUsQTcsQTcsRjIpLAlWKEZDLDdFLDdFLDgyKSwJVig3QSwzRCwzRCw0NyksCVwKLQlWKEM4LDY0LDY0LEFDKSwJVihCQSw1RCw1RCxFNyksCVYoMzIsMTksMTksMkIpLAlWKEU2LDczLDczLDk1KSwJXAotCVYoQzAsNjAsNjAsQTApLAlWKDE5LDgxLDgxLDk4KSwJVig5RSw0Riw0RixEMSksCVYoQTMsREMsREMsN0YpLAlcCi0JVig0NCwyMiwyMiw2NiksCVYoNTQsMkEsMkEsN0UpLAlWKDNCLDkwLDkwLEFCKSwJVigwQiw4OCw4OCw4MyksCVwKLQlWKDhDLDQ2LDQ2LENBKSwJVihDNyxFRSxFRSwyOSksCVYoNkIsQjgsQjgsRDMpLAlWKDI4LDE0LDE0LDNDKSwJXAotCVYoQTcsREUsREUsNzkpLAlWKEJDLDVFLDVFLEUyKSwJVigxNiwwQiwwQiwxRCksCVYoQUQsREIsREIsNzYpLAlcCi0JVihEQixFMCxFMCwzQiksCVYoNjQsMzIsMzIsNTYpLAlWKDc0LDNBLDNBLDRFKSwJVigxNCwwQSwwQSwxRSksCVwKLQlWKDkyLDQ5LDQ5LERCKSwJVigwQywwNiwwNiwwQSksCVYoNDgsMjQsMjQsNkMpLAlWKEI4LDVDLDVDLEU0KSwJXAotCVYoOUYsQzIsQzIsNUQpLAlWKEJELEQzLEQzLDZFKSwJVig0MyxBQyxBQyxFRiksCVYoQzQsNjIsNjIsQTYpLAlcCi0JVigzOSw5MSw5MSxBOCksCVYoMzEsOTUsOTUsQTQpLAlWKEQzLEU0LEU0LDM3KSwJVihGMiw3OSw3OSw4QiksCVwKLQlWKEQ1LEU3LEU3LDMyKSwJVig4QixDOCxDOCw0MyksCVYoNkUsMzcsMzcsNTkpLAlWKERBLDZELDZELEI3KSwJXAotCVYoMDEsOEQsOEQsOEMpLAlWKEIxLEQ1LEQ1LDY0KSwJVig5Qyw0RSw0RSxEMiksCVYoNDksQTksQTksRTApLAlcCi0JVihEOCw2Qyw2QyxCNCksCVYoQUMsNTYsNTYsRkEpLAlWKEYzLEY0LEY0LDA3KSwJVihDRixFQSxFQSwyNSksCVwKLQlWKENBLDY1LDY1LEFGKSwJVihGNCw3QSw3QSw4RSksCVYoNDcsQUUsQUUsRTkpLAlWKDEwLDA4LDA4LDE4KSwJXAotCVYoNkYsQkEsQkEsRDUpLAlWKEYwLDc4LDc4LDg4KSwJVig0QSwyNSwyNSw2RiksCVYoNUMsMkUsMkUsNzIpLAlcCi0JVigzOCwxQywxQywyNCksCVYoNTcsQTYsQTYsRjEpLAlWKDczLEI0LEI0LEM3KSwJVig5NyxDNixDNiw1MSksCVwKLQlWKENCLEU4LEU4LDIzKSwJVihBMSxERCxERCw3QyksCVYoRTgsNzQsNzQsOUMpLAlWKDNFLDFGLDFGLDIxKSwJXAotCVYoOTYsNEIsNEIsREQpLAlWKDYxLEJELEJELERDKSwJVigwRCw4Qiw4Qiw4NiksCVYoMEYsOEEsOEEsODUpLAlcCi0JVihFMCw3MCw3MCw5MCksCVYoN0MsM0UsM0UsNDIpLAlWKDcxLEI1LEI1LEM0KSwJVihDQyw2Niw2NixBQSksCVwKLQlWKDkwLDQ4LDQ4LEQ4KSwJVigwNiwwMywwMywwNSksCVYoRjcsRjYsRjYsMDEpLAlWKDFDLDBFLDBFLDEyKSwJXAotCVYoQzIsNjEsNjEsQTMpLAlWKDZBLDM1LDM1LDVGKSwJVihBRSw1Nyw1NyxGOSksCVYoNjksQjksQjksRDApLAlcCi0JVigxNyw4Niw4Niw5MSksCVYoOTksQzEsQzEsNTgpLAlWKDNBLDFELDFELDI3KSwJVigyNyw5RSw5RSxCOSksCVwKLQlWKEQ5LEUxLEUxLDM4KSwJVihFQixGOCxGOCwxMyksCVYoMkIsOTgsOTgsQjMpLAlWKDIyLDExLDExLDMzKSwJXAotCVYoRDIsNjksNjksQkIpLAlWKEE5LEQ5LEQ5LDcwKSwJVigwNyw4RSw4RSw4OSksCVYoMzMsOTQsOTQsQTcpLAlcCi0JVigyRCw5Qiw5QixCNiksCVYoM0MsMUUsMUUsMjIpLAlWKDE1LDg3LDg3LDkyKSwJVihDOSxFOSxFOSwyMCksCVwKLQlWKDg3LENFLENFLDQ5KSwJVihBQSw1NSw1NSxGRiksCVYoNTAsMjgsMjgsNzgpLAlWKEE1LERGLERGLDdBKSwJXAotCVYoMDMsOEMsOEMsOEYpLAlWKDU5LEExLEExLEY4KSwJVigwOSw4OSw4OSw4MCksCVYoMUEsMEQsMEQsMTcpLAlcCi0JVig2NSxCRixCRixEQSksCVYoRDcsRTYsRTYsMzEpLAlWKDg0LDQyLDQyLEM2KSwJVihEMCw2OCw2OCxCOCksCVwKLQlWKDgyLDQxLDQxLEMzKSwJVigyOSw5OSw5OSxCMCksCVYoNUEsMkQsMkQsNzcpLAlWKDFFLDBGLDBGLDExKSwJXAotCVYoN0IsQjAsQjAsQ0IpLAlWKEE4LDU0LDU0LEZDKSwJVig2RCxCQixCQixENiksCVYoMkMsMTYsMTYsM0EpCi0KLSNkZWZpbmUJVihhLGIsYyxkKSAweCMjYSMjYiMjYyMjZAotc3RhdGljIHVpbnQzMiBGVDBbMjU2XSA9IHsgRlQgfTsKLSN1bmRlZiBWCi0KLSNkZWZpbmUJVihhLGIsYyxkKSAweCMjZCMjYSMjYiMjYwotc3RhdGljIHVpbnQzMiBGVDFbMjU2XSA9IHsgRlQgfTsKLSN1bmRlZiBWCi0KLSNkZWZpbmUJVihhLGIsYyxkKSAweCMjYyMjZCMjYSMjYgotc3RhdGljIHVpbnQzMiBGVDJbMjU2XSA9IHsgRlQgfTsKLSN1bmRlZiBWCi0KLSNkZWZpbmUJVihhLGIsYyxkKSAweCMjYiMjYyMjZCMjYQotc3RhdGljIHVpbnQzMiBGVDNbMjU2XSA9IHsgRlQgfTsKLSN1bmRlZiBWCi0KLSN1bmRlZiBGVAotCi0vKiByZXZlcnNlIFMtYm94ICovCi0KLXN0YXRpYyB1aW50MzIgUlNiWzI1Nl0gPQotewotCTB4NTIsIDB4MDksCTB4NkEsIDB4RDUsCTB4MzAsIDB4MzYsCTB4QTUsIDB4MzgsCi0JMHhCRiwgMHg0MCwJMHhBMywgMHg5RSwJMHg4MSwgMHhGMywJMHhENywgMHhGQiwKLQkweDdDLCAweEUzLAkweDM5LCAweDgyLAkweDlCLCAweDJGLAkweEZGLCAweDg3LAotCTB4MzQsIDB4OEUsCTB4NDMsIDB4NDQsCTB4QzQsIDB4REUsCTB4RTksIDB4Q0IsCi0JMHg1NCwgMHg3QiwJMHg5NCwgMHgzMiwJMHhBNiwgMHhDMiwJMHgyMywgMHgzRCwKLQkweEVFLCAweDRDLAkweDk1LCAweDBCLAkweDQyLCAweEZBLAkweEMzLCAweDRFLAotCTB4MDgsIDB4MkUsCTB4QTEsIDB4NjYsCTB4MjgsIDB4RDksCTB4MjQsIDB4QjIsCi0JMHg3NiwgMHg1QiwJMHhBMiwgMHg0OSwJMHg2RCwgMHg4QiwJMHhEMSwgMHgyNSwKLQkweDcyLCAweEY4LAkweEY2LCAweDY0LAkweDg2LCAweDY4LAkweDk4LCAweDE2LAotCTB4RDQsIDB4QTQsCTB4NUMsIDB4Q0MsCTB4NUQsIDB4NjUsCTB4QjYsIDB4OTIsCi0JMHg2QywgMHg3MCwJMHg0OCwgMHg1MCwJMHhGRCwgMHhFRCwJMHhCOSwgMHhEQSwKLQkweDVFLCAweDE1LAkweDQ2LCAweDU3LAkweEE3LCAweDhELAkweDlELCAweDg0LAotCTB4OTAsIDB4RDgsCTB4QUIsIDB4MDAsCTB4OEMsIDB4QkMsCTB4RDMsIDB4MEEsCi0JMHhGNywgMHhFNCwJMHg1OCwgMHgwNSwJMHhCOCwgMHhCMywJMHg0NSwgMHgwNiwKLQkweEQwLCAweDJDLAkweDFFLCAweDhGLAkweENBLCAweDNGLAkweDBGLCAweDAyLAotCTB4QzEsIDB4QUYsCTB4QkQsIDB4MDMsCTB4MDEsIDB4MTMsCTB4OEEsIDB4NkIsCi0JMHgzQSwgMHg5MSwJMHgxMSwgMHg0MSwJMHg0RiwgMHg2NywJMHhEQywgMHhFQSwKLQkweDk3LCAweEYyLAkweENGLCAweENFLAkweEYwLCAweEI0LAkweEU2LCAweDczLAotCTB4OTYsIDB4QUMsCTB4NzQsIDB4MjIsCTB4RTcsIDB4QUQsCTB4MzUsIDB4ODUsCi0JMHhFMiwgMHhGOSwJMHgzNywgMHhFOCwJMHgxQywgMHg3NSwJMHhERiwgMHg2RSwKLQkweDQ3LCAweEYxLAkweDFBLCAweDcxLAkweDFELCAweDI5LAkweEM1LCAweDg5LAotCTB4NkYsIDB4QjcsCTB4NjIsIDB4MEUsCTB4QUEsIDB4MTgsCTB4QkUsIDB4MUIsCi0JMHhGQywgMHg1NiwJMHgzRSwgMHg0QiwJMHhDNiwgMHhEMiwJMHg3OSwgMHgyMCwKLQkweDlBLCAweERCLAkweEMwLCAweEZFLAkweDc4LCAweENELAkweDVBLCAweEY0LAotCTB4MUYsIDB4REQsCTB4QTgsIDB4MzMsCTB4ODgsIDB4MDcsCTB4QzcsIDB4MzEsCi0JMHhCMSwgMHgxMiwJMHgxMCwgMHg1OSwJMHgyNywgMHg4MCwJMHhFQywgMHg1RiwKLQkweDYwLCAweDUxLAkweDdGLCAweEE5LAkweDE5LCAweEI1LAkweDRBLCAweDBELAotCTB4MkQsIDB4RTUsCTB4N0EsIDB4OUYsCTB4OTMsIDB4QzksCTB4OUMsIDB4RUYsCi0JMHhBMCwgMHhFMCwJMHgzQiwgMHg0RCwJMHhBRSwgMHgyQSwJMHhGNSwgMHhCMCwKLQkweEM4LCAweEVCLAkweEJCLCAweDNDLAkweDgzLCAweDUzLAkweDk5LCAweDYxLAotCTB4MTcsIDB4MkIsCTB4MDQsIDB4N0UsCTB4QkEsIDB4NzcsCTB4RDYsIDB4MjYsCi0JMHhFMSwgMHg2OSwJMHgxNCwgMHg2MywJMHg1NSwgMHgyMSwJMHgwQywgMHg3RAotfTsKLQotLyogcmV2ZXJzZSB0YWJsZSAqLwotCi0jZGVmaW5lCVJUIFwKLVwKLQlWKDUxLEY0LEE3LDUwKSwJVig3RSw0MSw2NSw1MyksCVYoMUEsMTcsQTQsQzMpLAlWKDNBLDI3LDVFLDk2KSwJXAotCVYoM0IsQUIsNkIsQ0IpLAlWKDFGLDlELDQ1LEYxKSwJVihBQyxGQSw1OCxBQiksCVYoNEIsRTMsMDMsOTMpLAlcCi0JVigyMCwzMCxGQSw1NSksCVYoQUQsNzYsNkQsRjYpLAlWKDg4LENDLDc2LDkxKSwJVihGNSwwMiw0QywyNSksCVwKLQlWKDRGLEU1LEQ3LEZDKSwJVihDNSwyQSxDQixENyksCVYoMjYsMzUsNDQsODApLAlWKEI1LDYyLEEzLDhGKSwJXAotCVYoREUsQjEsNUEsNDkpLAlWKDI1LEJBLDFCLDY3KSwJVig0NSxFQSwwRSw5OCksCVYoNUQsRkUsQzAsRTEpLAlcCi0JVihDMywyRiw3NSwwMiksCVYoODEsNEMsRjAsMTIpLAlWKDhELDQ2LDk3LEEzKSwJVig2QixEMyxGOSxDNiksCVwKLQlWKDAzLDhGLDVGLEU3KSwJVigxNSw5Miw5Qyw5NSksCVYoQkYsNkQsN0EsRUIpLAlWKDk1LDUyLDU5LERBKSwJXAotCVYoRDQsQkUsODMsMkQpLAlWKDU4LDc0LDIxLEQzKSwJVig0OSxFMCw2OSwyOSksCVYoOEUsQzksQzgsNDQpLAlcCi0JVig3NSxDMiw4OSw2QSksCVYoRjQsOEUsNzksNzgpLAlWKDk5LDU4LDNFLDZCKSwJVigyNyxCOSw3MSxERCksCVwKLQlWKEJFLEUxLDRGLEI2KSwJVihGMCw4OCxBRCwxNyksCVYoQzksMjAsQUMsNjYpLAlWKDdELENFLDNBLEI0KSwJXAotCVYoNjMsREYsNEEsMTgpLAlWKEU1LDFBLDMxLDgyKSwJVig5Nyw1MSwzMyw2MCksCVYoNjIsNTMsN0YsNDUpLAlcCi0JVihCMSw2NCw3NyxFMCksCVYoQkIsNkIsQUUsODQpLAlWKEZFLDgxLEEwLDFDKSwJVihGOSwwOCwyQiw5NCksCVwKLQlWKDcwLDQ4LDY4LDU4KSwJVig4Riw0NSxGRCwxOSksCVYoOTQsREUsNkMsODcpLAlWKDUyLDdCLEY4LEI3KSwJXAotCVYoQUIsNzMsRDMsMjMpLAlWKDcyLDRCLDAyLEUyKSwJVihFMywxRiw4Riw1NyksCVYoNjYsNTUsQUIsMkEpLAlcCi0JVihCMixFQiwyOCwwNyksCVYoMkYsQjUsQzIsMDMpLAlWKDg2LEM1LDdCLDlBKSwJVihEMywzNywwOCxBNSksCVwKLQlWKDMwLDI4LDg3LEYyKSwJVigyMyxCRixBNSxCMiksCVYoMDIsMDMsNkEsQkEpLAlWKEVELDE2LDgyLDVDKSwJXAotCVYoOEEsQ0YsMUMsMkIpLAlWKEE3LDc5LEI0LDkyKSwJVihGMywwNyxGMixGMCksCVYoNEUsNjksRTIsQTEpLAlcCi0JVig2NSxEQSxGNCxDRCksCVYoMDYsMDUsQkUsRDUpLAlWKEQxLDM0LDYyLDFGKSwJVihDNCxBNixGRSw4QSksCVwKLQlWKDM0LDJFLDUzLDlEKSwJVihBMixGMyw1NSxBMCksCVYoMDUsOEEsRTEsMzIpLAlWKEE0LEY2LEVCLDc1KSwJXAotCVYoMEIsODMsRUMsMzkpLAlWKDQwLDYwLEVGLEFBKSwJVig1RSw3MSw5RiwwNiksCVYoQkQsNkUsMTAsNTEpLAlcCi0JVigzRSwyMSw4QSxGOSksCVYoOTYsREQsMDYsM0QpLAlWKERELDNFLDA1LEFFKSwJVig0RCxFNixCRCw0NiksCVwKLQlWKDkxLDU0LDhELEI1KSwJVig3MSxDNCw1RCwwNSksCVYoMDQsMDYsRDQsNkYpLAlWKDYwLDUwLDE1LEZGKSwJXAotCVYoMTksOTgsRkIsMjQpLAlWKEQ2LEJELEU5LDk3KSwJVig4OSw0MCw0MyxDQyksCVYoNjcsRDksOUUsNzcpLAlcCi0JVihCMCxFOCw0MixCRCksCVYoMDcsODksOEIsODgpLAlWKEU3LDE5LDVCLDM4KSwJVig3OSxDOCxFRSxEQiksCVwKLQlWKEExLDdDLDBBLDQ3KSwJVig3Qyw0MiwwRixFOSksCVYoRjgsODQsMUUsQzkpLAlWKDAwLDAwLDAwLDAwKSwJXAotCVYoMDksODAsODYsODMpLAlWKDMyLDJCLEVELDQ4KSwJVigxRSwxMSw3MCxBQyksCVYoNkMsNUEsNzIsNEUpLAlcCi0JVihGRCwwRSxGRixGQiksCVYoMEYsODUsMzgsNTYpLAlWKDNELEFFLEQ1LDFFKSwJVigzNiwyRCwzOSwyNyksCVwKLQlWKDBBLDBGLEQ5LDY0KSwJVig2OCw1QyxBNiwyMSksCVYoOUIsNUIsNTQsRDEpLAlWKDI0LDM2LDJFLDNBKSwJXAotCVYoMEMsMEEsNjcsQjEpLAlWKDkzLDU3LEU3LDBGKSwJVihCNCxFRSw5NixEMiksCVYoMUIsOUIsOTEsOUUpLAlcCi0JVig4MCxDMCxDNSw0RiksCVYoNjEsREMsMjAsQTIpLAlWKDVBLDc3LDRCLDY5KSwJVigxQywxMiwxQSwxNiksCVwKLQlWKEUyLDkzLEJBLDBBKSwJVihDMCxBMCwyQSxFNSksCVYoM0MsMjIsRTAsNDMpLAlWKDEyLDFCLDE3LDFEKSwJXAotCVYoMEUsMDksMEQsMEIpLAlWKEYyLDhCLEM3LEFEKSwJVigyRCxCNixBOCxCOSksCVYoMTQsMUUsQTksQzgpLAlcCi0JVig1NyxGMSwxOSw4NSksCVYoQUYsNzUsMDcsNEMpLAlWKEVFLDk5LERELEJCKSwJVihBMyw3Riw2MCxGRCksCVwKLQlWKEY3LDAxLDI2LDlGKSwJVig1Qyw3MixGNSxCQyksCVYoNDQsNjYsM0IsQzUpLAlWKDVCLEZCLDdFLDM0KSwJXAotCVYoOEIsNDMsMjksNzYpLAlWKENCLDIzLEM2LERDKSwJVihCNixFRCxGQyw2OCksCVYoQjgsRTQsRjEsNjMpLAlcCi0JVihENywzMSxEQyxDQSksCVYoNDIsNjMsODUsMTApLAlWKDEzLDk3LDIyLDQwKSwJVig4NCxDNiwxMSwyMCksCVwKLQlWKDg1LDRBLDI0LDdEKSwJVihEMixCQiwzRCxGOCksCVYoQUUsRjksMzIsMTEpLAlWKEM3LDI5LEExLDZEKSwJXAotCVYoMUQsOUUsMkYsNEIpLAlWKERDLEIyLDMwLEYzKSwJVigwRCw4Niw1MixFQyksCVYoNzcsQzEsRTMsRDApLAlcCi0JVigyQixCMywxNiw2QyksCVYoQTksNzAsQjksOTkpLAlWKDExLDk0LDQ4LEZBKSwJVig0NyxFOSw2NCwyMiksCVwKLQlWKEE4LEZDLDhDLEM0KSwJVihBMCxGMCwzRiwxQSksCVYoNTYsN0QsMkMsRDgpLAlWKDIyLDMzLDkwLEVGKSwJXAotCVYoODcsNDksNEUsQzcpLAlWKEQ5LDM4LEQxLEMxKSwJVig4QyxDQSxBMixGRSksCVYoOTgsRDQsMEIsMzYpLAlcCi0JVihBNixGNSw4MSxDRiksCVYoQTUsN0EsREUsMjgpLAlWKERBLEI3LDhFLDI2KSwJVigzRixBRCxCRixBNCksCVwKLQlWKDJDLDNBLDlELEU0KSwJVig1MCw3OCw5MiwwRCksCVYoNkEsNUYsQ0MsOUIpLAlWKDU0LDdFLDQ2LDYyKSwJXAotCVYoRjYsOEQsMTMsQzIpLAlWKDkwLEQ4LEI4LEU4KSwJVigyRSwzOSxGNyw1RSksCVYoODIsQzMsQUYsRjUpLAlcCi0JVig5Riw1RCw4MCxCRSksCVYoNjksRDAsOTMsN0MpLAlWKDZGLEQ1LDJELEE5KSwJVihDRiwyNSwxMixCMyksCVwKLQlWKEM4LEFDLDk5LDNCKSwJVigxMCwxOCw3RCxBNyksCVYoRTgsOUMsNjMsNkUpLAlWKERCLDNCLEJCLDdCKSwJXAotCVYoQ0QsMjYsNzgsMDkpLAlWKDZFLDU5LDE4LEY0KSwJVihFQyw5QSxCNywwMSksCVYoODMsNEYsOUEsQTgpLAlcCi0JVihFNiw5NSw2RSw2NSksCVYoQUEsRkYsRTYsN0UpLAlWKDIxLEJDLENGLDA4KSwJVihFRiwxNSxFOCxFNiksCVwKLQlWKEJBLEU3LDlCLEQ5KSwJVig0QSw2RiwzNixDRSksCVYoRUEsOUYsMDksRDQpLAlWKDI5LEIwLDdDLEQ2KSwJXAotCVYoMzEsQTQsQjIsQUYpLAlWKDJBLDNGLDIzLDMxKSwJVihDNixBNSw5NCwzMCksCVYoMzUsQTIsNjYsQzApLAlcCi0JVig3NCw0RSxCQywzNyksCVYoRkMsODIsQ0EsQTYpLAlWKEUwLDkwLEQwLEIwKSwJVigzMyxBNyxEOCwxNSksCVwKLQlWKEYxLDA0LDk4LDRBKSwJVig0MSxFQyxEQSxGNyksCVYoN0YsQ0QsNTAsMEUpLAlWKDE3LDkxLEY2LDJGKSwJXAotCVYoNzYsNEQsRDYsOEQpLAlWKDQzLEVGLEIwLDREKSwJVihDQyxBQSw0RCw1NCksCVYoRTQsOTYsMDQsREYpLAlcCi0JVig5RSxEMSxCNSxFMyksCVYoNEMsNkEsODgsMUIpLAlWKEMxLDJDLDFGLEI4KSwJVig0Niw2NSw1MSw3RiksCVwKLQlWKDlELDVFLEVBLDA0KSwJVigwMSw4QywzNSw1RCksCVYoRkEsODcsNzQsNzMpLAlWKEZCLDBCLDQxLDJFKSwJXAotCVYoQjMsNjcsMUQsNUEpLAlWKDkyLERCLEQyLDUyKSwJVihFOSwxMCw1NiwzMyksCVYoNkQsRDYsNDcsMTMpLAlcCi0JVig5QSxENyw2MSw4QyksCVYoMzcsQTEsMEMsN0EpLAlWKDU5LEY4LDE0LDhFKSwJVihFQiwxMywzQyw4OSksCVwKLQlWKENFLEE5LDI3LEVFKSwJVihCNyw2MSxDOSwzNSksCVYoRTEsMUMsRTUsRUQpLAlWKDdBLDQ3LEIxLDNDKSwJXAotCVYoOUMsRDIsREYsNTkpLAlWKDU1LEYyLDczLDNGKSwJVigxOCwxNCxDRSw3OSksCVYoNzMsQzcsMzcsQkYpLAlcCi0JVig1MyxGNyxDRCxFQSksCVYoNUYsRkQsQUEsNUIpLAlWKERGLDNELDZGLDE0KSwJVig3OCw0NCxEQiw4NiksCVwKLQlWKENBLEFGLEYzLDgxKSwJVihCOSw2OCxDNCwzRSksCVYoMzgsMjQsMzQsMkMpLAlWKEMyLEEzLDQwLDVGKSwJXAotCVYoMTYsMUQsQzMsNzIpLAlWKEJDLEUyLDI1LDBDKSwJVigyOCwzQyw0OSw4QiksCVYoRkYsMEQsOTUsNDEpLAlcCi0JVigzOSxBOCwwMSw3MSksCVYoMDgsMEMsQjMsREUpLAlWKEQ4LEI0LEU0LDlDKSwJVig2NCw1NixDMSw5MCksCVwKLQlWKDdCLENCLDg0LDYxKSwJVihENSwzMixCNiw3MCksCVYoNDgsNkMsNUMsNzQpLAlWKEQwLEI4LDU3LDQyKQotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2EjI2IjI2MjI2QKLXN0YXRpYyB1aW50MzIgUlQwWzI1Nl0gPSB7IFJUIH07Ci0jdW5kZWYgVgotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2QjI2EjI2IjI2MKLXN0YXRpYyB1aW50MzIgUlQxWzI1Nl0gPSB7IFJUIH07Ci0jdW5kZWYgVgotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2MjI2QjI2EjI2IKLXN0YXRpYyB1aW50MzIgUlQyWzI1Nl0gPSB7IFJUIH07Ci0jdW5kZWYgVgotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2IjI2MjI2QjI2EKLXN0YXRpYyB1aW50MzIgUlQzWzI1Nl0gPSB7IFJUIH07Ci0jdW5kZWYgVgotCi0jdW5kZWYgUlQKLQotLyogcm91bmQgY29uc3RhbnRzICovCi0KLXN0YXRpYyB1aW50MzIgUkNPTlsxMF0gPQotewotCTB4MDEwMDAwMDAsCTB4MDIwMDAwMDAsCTB4MDQwMDAwMDAsCTB4MDgwMDAwMDAsCi0JMHgxMDAwMDAwMCwJMHgyMDAwMDAwMCwJMHg0MDAwMDAwMCwJMHg4MDAwMDAwMCwKLQkweDFCMDAwMDAwLAkweDM2MDAwMDAwCi19OwotCi0vKiBrZXkgc2NoZWR1bGUJdGFibGVzICovCi0KLXN0YXRpYyBpbnQgS1RfaW5pdCA9IDE7Ci0KLXN0YXRpYyB1aW50MzIgS1QwWzI1Nl07Ci1zdGF0aWMgdWludDMyIEtUMVsyNTZdOwotc3RhdGljIHVpbnQzMiBLVDJbMjU2XTsKLXN0YXRpYyB1aW50MzIgS1QzWzI1Nl07Ci0KLS8qIHBsYXRmb3JtLWluZGVwZW5kYW50CTMyLWJpdCBpbnRlZ2VyIG1hbmlwdWxhdGlvbgltYWNyb3MgKi8KLQotI2RlZmluZQlHRVRfVUlOVDMyKG4sYixpKQkJCQkJCVwKLXsJCQkJCQkJCQkJCQlcCi0JKG4pCT0gKAkodWludDMyKSAoYilbKGkpCV0gPDwgMjQJKQkJXAotCQl8ICgJKHVpbnQzMikgKGIpWyhpKSArIDFdIDw8IDE2CSkJCVwKLQkJfCAoCSh1aW50MzIpIChiKVsoaSkgKyAyXSA8PCAgOAkpCQlcCi0JCXwgKAkodWludDMyKSAoYilbKGkpICsgM10JCSk7CQlcCi19Ci0KLSNkZWZpbmUJUFVUX1VJTlQzMihuLGIsaSkJCQkJCQlcCi17CQkJCQkJCQkJCQkJXAotCShiKVsoaSkJICAgXSA9ICh1aW50OCkgKCAobikgPj4JMjQgKTsJCVwKLQkoYilbKGkpCSsgMV0gPSAodWludDgpICggKG4pID4+CTE2ICk7CQlcCi0JKGIpWyhpKQkrIDJdID0gKHVpbnQ4KSAoIChuKSA+PgkgOCApOwkJXAotCShiKVsoaSkJKyAzXSA9ICh1aW50OCkgKCAobikJICAgKTsJCVwKLX0KLQotCi1pbnQJcnRfYWVzX3NldF9rZXkoIGFlc19jb250ZXh0ICpjdHgsIHVpbnQ4ICprZXksIGludCBuYml0cyApCi17Ci0JaW50CWk7Ci0JdWludDMyICpSSywJKlNLOwotCi0Jc3dpdGNoKAluYml0cyApCi0JewotCQljYXNlIDEyODogY3R4LT5uciA9CTEwOwlicmVhazsKLQkJY2FzZSAxOTI6IGN0eC0+bnIgPQkxMjsJYnJlYWs7Ci0JCWNhc2UgMjU2OiBjdHgtPm5yID0JMTQ7CWJyZWFrOwotCQlkZWZhdWx0CTogcmV0dXJuKCAxCSk7Ci0JfQotCi0JUksgPSAodWludDMyICopIGN0eC0+ZXJrOwotCi0JZm9yKCBpID0gMDsJaSA8CShuYml0cyA+PiA1KTsgaSsrICkKLQl7Ci0JCUdFVF9VSU5UMzIoCVJLW2ldLCBrZXksCWkgKgk0ICk7Ci0JfQotCi0JLyogc2V0dXAgZW5jcnlwdGlvbglyb3VuZCBrZXlzICovCi0KLQlzd2l0Y2goCW5iaXRzICkKLQl7Ci0JY2FzZSAxMjg6Ci0KLQkJZm9yKCBpID0gMDsJaSA8CTEwOwlpKyssIFJLCSs9IDQgKQotCQl7Ci0JCQlSS1s0XSAgPSBSS1swXSBeIFJDT05baV0gXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1szXSA+PiAxNiApIF0gPDwJMjQgKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+ICA4ICkgXSA8PAkxNiApIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbM10JCSApIF0gPDwJIDggKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+IDI0ICkgXQkgICApOwotCi0JCQlSS1s1XSAgPSBSS1sxXSBeIFJLWzRdOwotCQkJUktbNl0gID0gUktbMl0gXiBSS1s1XTsKLQkJCVJLWzddICA9IFJLWzNdIF4gUktbNl07Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIDE5MjoKLQotCQlmb3IoIGkgPSAwOwlpIDwJODsgaSsrLAlSSyArPSA2CSkKLQkJewotCQkJUktbNl0gID0gUktbMF0gXiBSQ09OW2ldIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbNV0gPj4gMTYgKSBdIDw8CTI0ICkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAgOCApIF0gPDwJMTYgKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzVdCQkgKSBdIDw8CSA4ICkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAyNCApIF0JICAgKTsKLQotCQkJUktbN10gID0gUktbMV0gXiBSS1s2XTsKLQkJCVJLWzhdICA9IFJLWzJdIF4gUktbN107Ci0JCQlSS1s5XSAgPSBSS1szXSBeIFJLWzhdOwotCQkJUktbMTBdID0gUktbNF0gXiBSS1s5XTsKLQkJCVJLWzExXSA9IFJLWzVdIF4gUktbMTBdOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSAyNTY6Ci0KLQkJZm9yKCBpID0gMDsJaSA8CTc7IGkrKywJUksgKz0gOAkpCi0JCXsKLQkJCVJLWzhdICA9IFJLWzBdIF4gUkNPTltpXSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzddID4+IDE2ICkgXSA8PAkyNCApIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbN10gPj4gIDggKSBdIDw8CTE2ICkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s3XQkJICkgXSA8PAkgOCApIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbN10gPj4gMjQgKSBdCSAgICk7Ci0KLQkJCVJLWzldICA9IFJLWzFdIF4gUktbOF07Ci0JCQlSS1sxMF0gPSBSS1syXSBeIFJLWzldOwotCQkJUktbMTFdID0gUktbM10gXiBSS1sxMF07Ci0KLQkJCVJLWzEyXSA9IFJLWzRdIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+IDI0ICkJXSA8PCAyNAkpIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+IDE2ICkJXSA8PCAxNgkpIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+CTggKQldIDw8ICA4CSkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1sxMV0JCSAgKQldCQkpOwotCi0JCQlSS1sxM10gPSBSS1s1XSBeIFJLWzEyXTsKLQkJCVJLWzE0XSA9IFJLWzZdIF4gUktbMTNdOwotCQkJUktbMTVdID0gUktbN10gXiBSS1sxNF07Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JLyogc2V0dXAgZGVjcnlwdGlvbglyb3VuZCBrZXlzICovCi0KLQlpZigJS1RfaW5pdAkpCi0JewotCQlmb3IoIGkgPSAwOwlpIDwJMjU2OyBpKysgKQotCQl7Ci0JCQlLVDBbaV0gPSBSVDBbIEZTYltpXSBdOwotCQkJS1QxW2ldID0gUlQxWyBGU2JbaV0gXTsKLQkJCUtUMltpXSA9IFJUMlsgRlNiW2ldIF07Ci0JCQlLVDNbaV0gPSBSVDNbIEZTYltpXSBdOwotCQl9Ci0KLQkJS1RfaW5pdAk9IDA7Ci0JfQotCi0JU0sgPSAodWludDMyICopIGN0eC0+ZHJrOwotCi0JKlNLKysgPQkqUksrKzsKLQkqU0srKyA9CSpSSysrOwotCSpTSysrID0JKlJLKys7Ci0JKlNLKysgPQkqUksrKzsKLQotCWZvciggaSA9IDE7CWkgPAljdHgtPm5yOyBpKysgKQotCXsKLQkJUksgLT0gODsKLQotCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgotCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgotCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgotCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKLQotCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgotCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgotCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgotCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKLQotCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgotCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgotCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgotCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKLQotCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgotCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgotCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgotCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKLQl9Ci0KLQlSSyAtPSA4OwotCi0JKlNLKysgPQkqUksrKzsKLQkqU0srKyA9CSpSSysrOwotCSpTSysrID0JKlJLKys7Ci0JKlNLKysgPQkqUksrKzsKLQotCXJldHVybigJMCApOwotfQotCi0vKiBBRVMgMTI4LWJpdCBibG9jayBlbmNyeXB0aW9uCXJvdXRpbmUJKi8KLQotdm9pZCBydF9hZXNfZW5jcnlwdChhZXNfY29udGV4dCAqY3R4LCB1aW50OCBpbnB1dFsxNl0sCXVpbnQ4IG91dHB1dFsxNl0gKQotewotCXVpbnQzMiAqUkssCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMzsKLQotCVJLID0gKHVpbnQzMiAqKSBjdHgtPmVyazsKLQlHRVRfVUlOVDMyKAlYMCwJaW5wdXQsCTAgKTsgWDAJXj0gUktbMF07Ci0JR0VUX1VJTlQzMigJWDEsCWlucHV0LAk0ICk7IFgxCV49IFJLWzFdOwotCUdFVF9VSU5UMzIoCVgyLAlpbnB1dCwJOCApOyBYMglePSBSS1syXTsKLQlHRVRfVUlOVDMyKAlYMywJaW5wdXQsIDEyICk7IFgzCV49IFJLWzNdOwotCi0jZGVmaW5lCUFFU19GUk9VTkQoWDAsWDEsWDIsWDMsWTAsWTEsWTIsWTMpCQlcCi17CQkJCQkJCQkJCQkJXAotCVJLICs9IDQ7CQkJCQkJCQkJXAotCQkJCQkJCQkJCQkJXAotCVgwID0gUktbMF0gXiBGVDBbICh1aW50OCkgKAlZMCA+PiAyNCApIF0gXglcCi0JCQkJIEZUMVsgKHVpbnQ4KSAoCVkxID4+IDE2ICkgXSBeCVwKLQkJCQkgRlQyWyAodWludDgpICgJWTIgPj4gIDggKSBdIF4JXAotCQkJCSBGVDNbICh1aW50OCkgKAlZMwkJICkgXTsJXAotCQkJCQkJCQkJCQkJXAotCVgxID0gUktbMV0gXiBGVDBbICh1aW50OCkgKAlZMSA+PiAyNCApIF0gXglcCi0JCQkJIEZUMVsgKHVpbnQ4KSAoCVkyID4+IDE2ICkgXSBeCVwKLQkJCQkgRlQyWyAodWludDgpICgJWTMgPj4gIDggKSBdIF4JXAotCQkJCSBGVDNbICh1aW50OCkgKAlZMAkJICkgXTsJXAotCQkJCQkJCQkJCQkJXAotCVgyID0gUktbMl0gXiBGVDBbICh1aW50OCkgKAlZMiA+PiAyNCApIF0gXglcCi0JCQkJIEZUMVsgKHVpbnQ4KSAoCVkzID4+IDE2ICkgXSBeCVwKLQkJCQkgRlQyWyAodWludDgpICgJWTAgPj4gIDggKSBdIF4JXAotCQkJCSBGVDNbICh1aW50OCkgKAlZMQkJICkgXTsJXAotCQkJCQkJCQkJCQkJXAotCVgzID0gUktbM10gXiBGVDBbICh1aW50OCkgKAlZMyA+PiAyNCApIF0gXglcCi0JCQkJIEZUMVsgKHVpbnQ4KSAoCVkwID4+IDE2ICkgXSBeCVwKLQkJCQkgRlQyWyAodWludDgpICgJWTEgPj4gIDggKSBdIF4JXAotCQkJCSBGVDNbICh1aW50OCkgKAlZMgkJICkgXTsJXAotfQotCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAxICovCi0JQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCAyICovCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAzICovCi0JQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA0ICovCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA1ICovCi0JQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA2ICovCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA3ICovCi0JQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA4ICovCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA5ICovCi0KLQlpZigJY3R4LT5ucgk+IDEwICkKLQl7Ci0JCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMAkqLwotCQlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTEJKi8KLQl9Ci0KLQlpZigJY3R4LT5ucgk+IDEyICkKLQl7Ci0JCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMgkqLwotCQlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTMJKi8KLQl9Ci0KLQkvKiBsYXN0CXJvdW5kICovCi0KLQlSSyArPSA0OwotCi0JWDAgPSBSS1swXSBeICggRlNiWwkodWludDgpCSggWTAgPj4JMjQgKSBdIDw8IDI0ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkxID4+CTE2ICkgXSA8PCAxNiApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMiA+PgkgOCApIF0gPDwgIDggKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTMJICAgKSBdCQkgKTsKLQotCVgxID0gUktbMV0gXiAoIEZTYlsJKHVpbnQ4KQkoIFkxID4+CTI0ICkgXSA8PCAyNCApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMiA+PgkxNiApIF0gPDwgMTYgKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTMgPj4JIDggKSBdIDw8ICA4ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkwCSAgICkgXQkJICk7Ci0KLQlYMiA9IFJLWzJdIF4gKCBGU2JbCSh1aW50OCkJKCBZMiA+PgkyNCApIF0gPDwgMjQgKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTMgPj4JMTYgKSBdIDw8IDE2ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkwID4+CSA4ICkgXSA8PCAgOCApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMQkgICApIF0JCSApOwotCi0JWDMgPSBSS1szXSBeICggRlNiWwkodWludDgpCSggWTMgPj4JMjQgKSBdIDw8IDI0ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkwID4+CTE2ICkgXSA8PCAxNiApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMSA+PgkgOCApIF0gPDwgIDggKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTIJICAgKSBdCQkgKTsKLQotCVBVVF9VSU5UMzIoCVgwLAlvdXRwdXQsCSAwICk7Ci0JUFVUX1VJTlQzMigJWDEsCW91dHB1dCwJIDQgKTsKLQlQVVRfVUlOVDMyKAlYMiwJb3V0cHV0LAkgOCApOwotCVBVVF9VSU5UMzIoCVgzLAlvdXRwdXQsCTEyICk7Ci19Ci0KLS8qIEFFUyAxMjgtYml0IGJsb2NrIGRlY3J5cHRpb24Jcm91dGluZQkqLwotCi12b2lkIHJ0X2Flc19kZWNyeXB0KCBhZXNfY29udGV4dCAqY3R4LAl1aW50OCBpbnB1dFsxNl0sIHVpbnQ4IG91dHB1dFsxNl0gKQotewotCXVpbnQzMiAqUkssCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMzsKLQotCVJLID0gKHVpbnQzMiAqKSBjdHgtPmRyazsKLQotCUdFVF9VSU5UMzIoCVgwLAlpbnB1dCwJMCApOyBYMAlePSBSS1swXTsKLQlHRVRfVUlOVDMyKAlYMSwJaW5wdXQsCTQgKTsgWDEJXj0gUktbMV07Ci0JR0VUX1VJTlQzMigJWDIsCWlucHV0LAk4ICk7IFgyCV49IFJLWzJdOwotCUdFVF9VSU5UMzIoCVgzLAlpbnB1dCwgMTIgKTsgWDMJXj0gUktbM107Ci0KLSNkZWZpbmUJQUVTX1JST1VORChYMCxYMSxYMixYMyxZMCxZMSxZMixZMykJCVwKLXsJCQkJCQkJCQkJCQlcCi0JUksgKz0gNDsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JWDAgPSBSS1swXSBeIFJUMFsgKHVpbnQ4KSAoCVkwID4+IDI0ICkgXSBeCVwKLQkJCQkgUlQxWyAodWludDgpICgJWTMgPj4gMTYgKSBdIF4JXAotCQkJCSBSVDJbICh1aW50OCkgKAlZMiA+PiAgOCApIF0gXglcCi0JCQkJIFJUM1sgKHVpbnQ4KSAoCVkxCQkgKSBdOwlcCi0JCQkJCQkJCQkJCQlcCi0JWDEgPSBSS1sxXSBeIFJUMFsgKHVpbnQ4KSAoCVkxID4+IDI0ICkgXSBeCVwKLQkJCQkgUlQxWyAodWludDgpICgJWTAgPj4gMTYgKSBdIF4JXAotCQkJCSBSVDJbICh1aW50OCkgKAlZMyA+PiAgOCApIF0gXglcCi0JCQkJIFJUM1sgKHVpbnQ4KSAoCVkyCQkgKSBdOwlcCi0JCQkJCQkJCQkJCQlcCi0JWDIgPSBSS1syXSBeIFJUMFsgKHVpbnQ4KSAoCVkyID4+IDI0ICkgXSBeCVwKLQkJCQkgUlQxWyAodWludDgpICgJWTEgPj4gMTYgKSBdIF4JXAotCQkJCSBSVDJbICh1aW50OCkgKAlZMCA+PiAgOCApIF0gXglcCi0JCQkJIFJUM1sgKHVpbnQ4KSAoCVkzCQkgKSBdOwlcCi0JCQkJCQkJCQkJCQlcCi0JWDMgPSBSS1szXSBeIFJUMFsgKHVpbnQ4KSAoCVkzID4+IDI0ICkgXSBeCVwKLQkJCQkgUlQxWyAodWludDgpICgJWTIgPj4gMTYgKSBdIF4JXAotCQkJCSBSVDJbICh1aW50OCkgKAlZMSA+PiAgOCApIF0gXglcCi0JCQkJIFJUM1sgKHVpbnQ4KSAoCVkwCQkgKSBdOwlcCi19Ci0KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDEgKi8KLQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDIgKi8KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDMgKi8KLQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDQgKi8KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDUgKi8KLQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDYgKi8KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDcgKi8KLQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDggKi8KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDkgKi8KLQotCWlmKAljdHgtPm5yCT4gMTAgKQotCXsKLQkJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CS8qIHJvdW5kIDEwCSovCi0JCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkvKiByb3VuZCAxMQkqLwotCX0KLQotCWlmKAljdHgtPm5yCT4gMTIgKQotCXsKLQkJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CS8qIHJvdW5kIDEyCSovCi0JCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkvKiByb3VuZCAxMwkqLwotCX0KLQotCS8qIGxhc3QJcm91bmQgKi8KLQotCVJLICs9IDQ7Ci0KLQlYMCA9IFJLWzBdIF4gKCBSU2JbCSh1aW50OCkJKCBZMCA+PgkyNCApIF0gPDwgMjQgKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTMgPj4JMTYgKSBdIDw8IDE2ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkyID4+CSA4ICkgXSA8PCAgOCApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMQkgICApIF0JCSApOwotCi0JWDEgPSBSS1sxXSBeICggUlNiWwkodWludDgpCSggWTEgPj4JMjQgKSBdIDw8IDI0ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkwID4+CTE2ICkgXSA8PCAxNiApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMyA+PgkgOCApIF0gPDwgIDggKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTIJICAgKSBdCQkgKTsKLQotCVgyID0gUktbMl0gXiAoIFJTYlsJKHVpbnQ4KQkoIFkyID4+CTI0ICkgXSA8PCAyNCApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMSA+PgkxNiApIF0gPDwgMTYgKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTAgPj4JIDggKSBdIDw8ICA4ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkzCSAgICkgXQkJICk7Ci0KLQlYMyA9IFJLWzNdIF4gKCBSU2JbCSh1aW50OCkJKCBZMyA+PgkyNCApIF0gPDwgMjQgKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTIgPj4JMTYgKSBdIDw8IDE2ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkxID4+CSA4ICkgXSA8PCAgOCApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMAkgICApIF0JCSApOwotCi0JUFVUX1VJTlQzMigJWDAsCW91dHB1dCwJIDAgKTsKLQlQVVRfVUlOVDMyKAlYMSwJb3V0cHV0LAkgNCApOwotCVBVVF9VSU5UMzIoCVgyLAlvdXRwdXQsCSA4ICk7Ci0JUFVUX1VJTlQzMigJWDMsCW91dHB1dCwJMTIgKTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBFTkNSWVBUIEFFUyBHVEsgYmVmb3JlIHNlbmRpbmcgaW4gRUFQT0wgZnJhbWUuCi0gICAgICAgIEFFUyBHVEsgbGVuZ3RoID0gMTI4IGJpdCwgIHNvIGZpeCBibG9ja3MgZm9yIGFlcy1rZXktd3JhcCBhcyAyIGluIHRoaXMgZnVuY3Rpb24uCi0gICAgICAgIFRoaXMgZnVuY3Rpb24gcmVmZXJlbmNlcyB0byBSRkMgMzM5NCBmb3IgYWVzIGtleSB3cmFwIGFsZ29yaXRobS4KLSAgICBSZXR1cm46Ci0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFFU19HVEtfS0VZX1dSQVAoCi0gICAgSU4gVUNIQVIgICAgKmtleSwKLSAgICBJTiBVQ0hBUiAgICAqcGxhaW50ZXh0LAotICAgIElOIFVJTlQzMiAgICBwX2xlbiwKLSAgICBPVVQgVUNIQVIgICAqY2lwaGVydGV4dCkKLXsKLSAgICBVQ0hBUiAgICAgICBBWzhdLCBCSU5bMTZdLCBCT1VUWzE2XTsKLSAgICBVQ0hBUiAgICAgICBSWzUxMl07Ci0gICAgSU5UICAgICAgICAgbnVtX2Jsb2NrcyA9IHBfbGVuLzg7ICAgLy8gdW5pdDo2NGJpdHMKLSAgICBJTlQgICAgICAgICBpLCBqOwotICAgIGFlc19jb250ZXh0IGFlc2N0eDsKLSAgICBVQ0hBUiAgICAgICB4b3I7Ci0KLSAgICBydF9hZXNfc2V0X2tleSgmYWVzY3R4LCBrZXksIDEyOCk7Ci0KLSAgICAvLyBJbml0IElBCi0gICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLSAgICAgICAgQVtpXSA9IDB4YTY7Ci0KLSAgICAvL0lucHV0IHBsYWludGV4dAotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspCi0gICAgewotICAgICAgICBmb3IgKGogPSAwIDsgaiA8IDg7IGorKykKLSAgICAgICAgICAgIFJbOCAqIChpICsgMSkgKyBqXSA9IHBsYWludGV4dFs4ICogaSArIGpdOwotICAgIH0KLQotICAgIC8vIEtleSBNaXgKLSAgICBmb3IgKGogPSAwOyBqIDwgNjsgaisrKQotICAgIHsKLSAgICAgICAgZm9yKGkgPSAxOyBpIDw9IG51bV9ibG9ja3M7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLy9waGFzZSAxCi0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShCSU4sIEEsIDgpOwotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJkJJTls4XSwgJlJbOCAqIGldLCA4KTsKLSAgICAgICAgICAgIHJ0X2Flc19lbmNyeXB0KCZhZXNjdHgsIEJJTiwgQk9VVCk7Ci0KLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEEsICZCT1VUWzBdLCA4KTsKLSAgICAgICAgICAgIHhvciA9IG51bV9ibG9ja3MgKiBqICsgaTsKLSAgICAgICAgICAgIEFbN10gPSBCT1VUWzddIF4geG9yOwotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlJbOCAqIGldLCAmQk9VVFs4XSwgOCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBPdXRwdXQgY2lwaGVydGV4dAotICAgIE5kaXNNb3ZlTWVtb3J5KGNpcGhlcnRleHQsIEEsIDgpOwotCi0gICAgZm9yIChpID0gMTsgaSA8PSBudW1fYmxvY2tzOyBpKyspCi0gICAgewotICAgICAgICBmb3IgKGogPSAwIDsgaiA8IDg7IGorKykKLSAgICAgICAgICAgIGNpcGhlcnRleHRbOCAqIGkgKyBqXSA9IFJbOCAqIGkgKyBqXTsKLSAgICB9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlNaXNjIGZ1bmN0aW9uIHRvIGRlY3J5cHQgQUVTIGJvZHkKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0JCVRoaXMgZnVuY3Rpb24gcmVmZXJlbmNlcyB0bwlSRkMJMzM5NCBmb3IgYWVzIGtleSB1bndyYXAgYWxnb3JpdGhtLgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlBRVNfR1RLX0tFWV9VTldSQVAoCi0JSU4JVUNIQVIJKmtleSwKLQlPVVQJVUNIQVIJKnBsYWludGV4dCwKLQlJTglVSU5UMzIgICBjX2xlbiwKLQlJTglVQ0hBUgkqY2lwaGVydGV4dCkKLQotewotCVVDSEFSICAgICAgIEFbOF0sIEJJTlsxNl0sIEJPVVRbMTZdOwotCVVDSEFSICAgICAgIHhvcjsKLQlJTlQgICAgICAgICBpLCBqOwotCWFlc19jb250ZXh0IGFlc2N0eDsKLQlVQ0hBUiAgICAgICAqUjsKLQlJTlQgICAgICAgICBudW1fYmxvY2tzID0gY19sZW4vODsJLy8gdW5pdDo2NGJpdHMKLQotCi0Jb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmUiwgNTEyKTsKLQotCWlmIChSID09IE5VTEwpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIhISFBRVNfR1RLX0tFWV9VTldSQVA6IG5vIG1lbW9yeSEhIVxuIikpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotCS8vIEluaXRpYWxpemUKLQlOZGlzTW92ZU1lbW9yeShBLCBjaXBoZXJ0ZXh0LCA4KTsKLQkvL0lucHV0IHBsYWludGV4dAotCWZvcihpID0gMDsgaSA8IChjX2xlbi04KTsgaSsrKQotCXsKLQkJUlsgaV0gPSBjaXBoZXJ0ZXh0W2kgKyA4XTsKLQl9Ci0KLQlydF9hZXNfc2V0X2tleSgmYWVzY3R4LCBrZXksIDEyOCk7Ci0KLQlmb3IoaiA9IDU7IGogPj0gMDsgai0tKQotCXsKLQkJZm9yKGkgPSAobnVtX2Jsb2Nrcy0xKTsgaSA+IDA7IGktLSkKLQkJewotCQkJeG9yID0gKG51bV9ibG9ja3MgLTEgKSogaiArIGk7Ci0JCQlOZGlzTW92ZU1lbW9yeShCSU4sIEEsIDgpOwotCQkJQklOWzddID0gQVs3XSBeIHhvcjsKLQkJCU5kaXNNb3ZlTWVtb3J5KCZCSU5bOF0sICZSWyhpLTEpKjhdLCA4KTsKLQkJCXJ0X2Flc19kZWNyeXB0KCZhZXNjdHgsIEJJTiwgQk9VVCk7Ci0JCQlOZGlzTW92ZU1lbW9yeShBLCAmQk9VVFswXSwgOCk7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmUlsoaS0xKSo4XSwgJkJPVVRbOF0sIDgpOwotCQl9Ci0JfQotCi0JLy8gT1VUUFVUCi0JZm9yKGkgPSAwOyBpIDwgY19sZW47IGkrKykKLQl7Ci0JCXBsYWludGV4dFtpXSA9IFJbaV07Ci0JfQotCi0KLQlvc19mcmVlX21lbShOVUxMLCBSKTsKLX0KLQotCi0vKiA9PT09PT09ICBUaGUgcmVsYXRlZCBmdW5jdGlvbiBvZiBBRVMtMTI4LUNNQUMgID09PT09PT0gKi8KLVZPSUQgbGVmdHNoaWZ0X29uZWJpdCgKLQlJTiAgUFVDSEFSCWlucHV0LAotCU9VVCBQVUNIQVIJb3V0cHV0KQotewotCUlOVCBpOwotCVVDSEFSIG92ZXJmbG93ID0gMDsKLQotCWZvciAoaT0xNTsgaT49MDsgaS0tKQotCXsKLQkJb3V0cHV0W2ldID0gaW5wdXRbaV0gPDwgMTsKLQkJb3V0cHV0W2ldIHw9IG92ZXJmbG93OwotCQlvdmVyZmxvdyA9IChpbnB1dFtpXSAmIDB4ODApID8gMSA6IDA7Ci0JfQotfQotCi1WT0lEIGRvX3BhZGRpbmcoCi0JSU4JUFVDSEFSCWxhc3RiLAotCU9VVAlQVUNIQVIJcGFkLAotCUlOICBJTlQJCWxlbikKLXsKLQlJTlQJajsKLQotCWZvciAoaj0wOyBqPDE2OyBqKyspCi0JewotCQlpZiAoaiA8IGxlbikKLQkJCXBhZFtqXSA9IGxhc3RiW2pdOwotCQllbHNlIGlmIChqID09IGxlbikKLQkJCXBhZFtqXSA9IDB4ODA7Ci0JCWVsc2UKLQkJCXBhZFtqXSA9IDB4MDA7Ci0JfQotCi0KLX0KLQotLyoKLSAqCVRoZSBTdWJrZXkgR2VuZXJhdGlvbiBBbGdvcml0aG0KLSAqLwotVk9JRCBnZW5lcmF0ZV9zdWJrZXkoCi0JSU4JUFVDSEFSIGtleSwKLQlPVVQJUFVDSEFSIEsxLAotCU9VVCBQVUNIQVIgSzIpCi17Ci0JYWVzX2NvbnRleHQgYWVzY3R4OwotCVVDSEFSIGFlc18xMjhfa2V5WzE2XTsKLQlVQ0hBUiBjb25zdF9aZXJvWzE2XTsKLQlVQ0hBUiB0bXBbMTZdOwotCVVDSEFSIGNvbnN0X1JiWzE2XSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCQkJCQkgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg3fTsKLQotCS8vIGluaXRpYWwgdGhlIGtleSBtYXRlcmlhbAotCW1lbXNldChjb25zdF9aZXJvLCAwLCAxNik7Ci0JbWVtc2V0KGFlc18xMjhfa2V5LCAwLCAxNik7Ci0KLQkvLyBBRVMtMTI4IHdpdGgga2V5IGlzIGFwcGxpZWQgdG8gYW4gYWxsLXplcm8gaW5wdXQgYmxvY2sKLQlydF9hZXNfc2V0X2tleSgmYWVzY3R4LCBrZXksIDEyOCk7Ci0JcnRfYWVzX2VuY3J5cHQoJmFlc2N0eCwgY29uc3RfWmVybywgYWVzXzEyOF9rZXkpOwotCi0JLy8gZGVyaXZlIEsxKDEyOC1iaXQgZmlyc3Qgc3Via2V5KSBhbmQgSzIoMTI4LWJpdCBzZWNvbmQgc3Via2V5KSwgcmVmZXIgdG8gcmZjLTQ0OTMgY2ggMi4zCi0JaWYgKChhZXNfMTI4X2tleVswXSAmIDB4ODApID09IDApCi0JewotCQlsZWZ0c2hpZnRfb25lYml0KGFlc18xMjhfa2V5LCBLMSk7Ci0JfQotCWVsc2UKLQl7Ci0JCWxlZnRzaGlmdF9vbmViaXQoYWVzXzEyOF9rZXksIHRtcCk7Ci0JCXhvcl8xMjgodG1wLCBjb25zdF9SYiwgSzEpOwotCX0KLQotCWlmICgoSzFbMF0gJiAweDgwKSA9PSAwKQotCXsKLQkJbGVmdHNoaWZ0X29uZWJpdChLMSwgSzIpOwotCX0KLQllbHNlCi0JewotCQlsZWZ0c2hpZnRfb25lYml0KEsxLCB0bXApOwotCQl4b3JfMTI4KHRtcCwgY29uc3RfUmIsIEsyKTsKLQl9Ci0KLX0KLQotLyoKLSAqCUFFUy1DTUFDIEFsZ29yaXRobS4gKHJlZmVyIHRvIHJmYy00NDkzIGFuZCBTUDgwMC0zOEIpCi0gKgotICoJSW5wdXQgOiBrZXkJCSgxMjgtYml0IGtleSkKLSAqCQkJaW5wdXQJCShtZXNzYWdlIHRvIGJlIGF1dGhlbnRpY2F0ZWQpCi0gKgkJCWxlbgkJCShsZW5ndGggb2YgdGhlIG1lc3NhZ2UgaW4gb2N0ZXRzKQotICoKLSAqCW91dHB1dDogbWFjCQkJKG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZSkKLSAqLwotVk9JRCBBRVNfMTI4X0NNQUMoCi0JSU4JUFVDSEFSCWtleSwKLQlJTglQVUNIQVIJaW5wdXQsCi0JSU4JSU5UCQlsZW4sCi0JT1VUCVBVQ0hBUgltYWMpCi17Ci0JVUNIQVIJWFsxNl0sIFlbMTZdLCBNX2xhc3RbMTZdLCBwYWRkZWRbMTZdOwotCVVDSEFSCUsxWzE2XSwgSzJbMTZdOwotCWFlc19jb250ZXh0IGFlc2N0eDsKLQlJTlQJCW4sIGksIGZsYWc7Ci0KLQlnZW5lcmF0ZV9zdWJrZXkoa2V5LCBLMSwgSzIpOwotCi0JbiA9IChsZW4rMTUpIC8gMTY7CQkvLyBuIGlzIG51bWJlciBvZiByb3VuZHMKLQotCWlmIChuID09IDApCi0JewotCQluID0gMTsKLQkJZmxhZyA9IDA7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmICgobGVuJTE2KSA9PSAwKQotCQkJZmxhZyA9IDE7CQkJLy8gaW5kaWNhdGUgdGhhdCBsYXN0IGJsb2NrIGlzIGEgY29tcGxldGUgYmxvY2sKLQkJZWxzZQotCQkJZmxhZyA9IDA7CQkJLy8gaW5kaWNhdGUgdGhhdCBsYXN0IGJsb2NrIGlzIG5vdCBhIGNvbXBsZXRlIGJsb2NrCi0JfQotCi0JaWYgKGZsYWcpCi0JewotCQl4b3JfMTI4KCZpbnB1dFsxNioobi0xKV0sIEsxLCBNX2xhc3QpOwotCX0KLQllbHNlCi0JewotCQlkb19wYWRkaW5nKCZpbnB1dFsxNioobi0xKV0sIHBhZGRlZCwgbGVuJTE2KTsKLQkJeG9yXzEyOChwYWRkZWQsIEsyLCBNX2xhc3QpOwotCX0KLQotCW1lbXNldChYLCAwLCAxNik7Ci0JZm9yIChpPTA7IGk8bi0xOyBpKyspCi0JewotCQl4b3JfMTI4KFgsICZpbnB1dFsxNippXSwgWSk7Ci0JCXJ0X2Flc19zZXRfa2V5KCZhZXNjdHgsIGtleSwgMTI4KTsKLQkJcnRfYWVzX2VuY3J5cHQoJmFlc2N0eCwgWSwgWCk7Ci0JfQotCi0JeG9yXzEyOChYLCBNX2xhc3QsIFkpOwotCXJ0X2Flc19zZXRfa2V5KCZhZXNjdHgsIGtleSwgMTI4KTsKLQlydF9hZXNfZW5jcnlwdCgmYWVzY3R4LCBZLCBYKTsKLQotCWZvciAoaT0wOyBpPDE2OyBpKyspCi0JewotCQltYWNbaV0gPSBYW2ldOwotCX0KLQotfQotLyogPT09PT09PSAgVGhlIHJlbGF0ZWQgZnVuY3Rpb24gb2YgQUVTLTEyOC1DTUFDICA9PT09PT09ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fYXNpYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2FzaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxYzgwOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fYXNpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc1MyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCWNtbV9hc2ljLmMKLQotCUFic3RyYWN0OgotCUZ1bmN0aW9ucyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggQVNJQwotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0vLyBSZXNldCB0aGUgUkZJQyBzZXR0aW5nIHRvIG5ldyBzZXJpZXMKLVJUTVBfUkZfUkVHUyBSRjI4NTBSZWdUYWJsZVtdID0gewotLy8JCWNoCSBSMQkJIFIyCQkgUjMoVFgwfjQ9MCkgUjQKLQkJezEsICAweDk4NDAyZWNjLCAweDk4NGMwNzg2LCAweDk4MTZiNDU1LCAweDk4MDA1MTBifSwKLQkJezIsICAweDk4NDAyZWNjLCAweDk4NGMwNzg2LCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKLQkJezMsICAweDk4NDAyZWNjLCAweDk4NGMwNzhhLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKLQkJezQsICAweDk4NDAyZWNjLCAweDk4NGMwNzhhLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKLQkJezUsICAweDk4NDAyZWNjLCAweDk4NGMwNzhlLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKLQkJezYsICAweDk4NDAyZWNjLCAweDk4NGMwNzhlLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKLQkJezcsICAweDk4NDAyZWNjLCAweDk4NGMwNzkyLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKLQkJezgsICAweDk4NDAyZWNjLCAweDk4NGMwNzkyLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKLQkJezksICAweDk4NDAyZWNjLCAweDk4NGMwNzk2LCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKLQkJezEwLCAweDk4NDAyZWNjLCAweDk4NGMwNzk2LCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKLQkJezExLCAweDk4NDAyZWNjLCAweDk4NGMwNzlhLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKLQkJezEyLCAweDk4NDAyZWNjLCAweDk4NGMwNzlhLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKLQkJezEzLCAweDk4NDAyZWNjLCAweDk4NGMwNzllLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKLQkJezE0LCAweDk4NDAyZWNjLCAweDk4NGMwN2EyLCAweDk4MTY4YTU1LCAweDk4MDA1MTkzfSwKLQotCQkvLyA4MDIuMTEgVU5JIC8gSHlwZXJMYW4gMgotCQl7MzYsIDB4OTg0MDJlY2MsIDB4OTg0YzA5OWEsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAotCQl7MzgsIDB4OTg0MDJlY2MsIDB4OTg0YzA5OWUsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAotCQl7NDAsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODIsIDB4OTgxNThhNTUsIDB4OTgwZWQxODN9LAotCQl7NDQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODIsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAotCQl7NDYsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODYsIDB4OTgxNThhNTUsIDB4OTgwZWQxOGJ9LAotCQl7NDgsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODYsIDB4OTgxNThhNTUsIDB4OTgwZWQxOWJ9LAotCQl7NTIsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGEsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAotCQl7NTQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGEsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAotCQl7NTYsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGUsIDB4OTgxNThhNTUsIDB4OTgwZWQxOGJ9LAotCQl7NjAsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxODN9LAotCQl7NjIsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAotCQl7NjQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LCAvLyBQbHVnZmVzdCM0LCBEYXk0LCBjaGFuZ2UgUkZSMyBsZWZ0NHRoIDktPjUuCi0KLQkJLy8gODAyLjExIEh5cGVyTGFuIDIKLQkJezEwMCwgMHg5ODQwMmVjOCwgMHg5ODRjMDZiMiwgMHg5ODE3OGE1NSwgMHg5ODBlZDc4M30sCi0KLQkJLy8gMjAwOC4wNC4zMCBtb2RpZmllZAotCQkvLyBUaGUgc3lzdGVtIHRlYW0gaGFzIEFOIHRvIGltcHJvdmUgdGhlIEVWTSB2YWx1ZQotCQkvLyBmb3IgY2hhbm5lbCAxMDIgdG8gMTA4IGZvciB0aGUgUlQyODUwL1JUMjc1MCBkdWFsIGJhbmQgc29sdXRpb24uCi0JCXsxMDIsIDB4OTg0MDJlYzgsIDB4OTg1YzA2YjIsIDB4OTg1NzhhNTUsIDB4OTgwZWQ3OTN9LAotCQl7MTA0LCAweDk4NDAyZWM4LCAweDk4NWMwNmIyLCAweDk4NTc4YTU1LCAweDk4MGVkMWEzfSwKLQkJezEwOCwgMHg5ODQwMmVjYywgMHg5ODVjMGEzMiwgMHg5ODU3OGE1NSwgMHg5ODBlZDE5M30sCi0KLQkJezExMCwgMHg5ODQwMmVjYywgMHg5ODRjMGEzNiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCi0JCXsxMTIsIDB4OTg0MDJlY2MsIDB4OTg0YzBhMzYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOWJ9LAotCQl7MTE2LCAweDk4NDAyZWNjLCAweDk4NGMwYTNhLCAweDk4MTc4YTU1LCAweDk4MGVkMWEzfSwKLQkJezExOCwgMHg5ODQwMmVjYywgMHg5ODRjMGEzZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5M30sCi0JCXsxMjAsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODN9LAotCQl7MTI0LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMTkzfSwKLQkJezEyNiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE1Yn0sIC8vIDB4OTgwZWQxYmItPjB4OTgwZWQxNWIgcmVxdWlyZWQgYnkgUm9yeSAyMDA3MDkyNwotCQl7MTI4LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMWEzfSwKLQkJezEzMiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4NiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4Yn0sCi0JCXsxMzQsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9LAotCQl7MTM2LCAweDk4NDAyZWM0LCAweDk4NGMwMzg2LCAweDk4MTc4YTU1LCAweDk4MGVkMTlifSwKLQkJezE0MCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4YSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCi0KLQkJLy8gODAyLjExIFVOSUkKLQkJezE0OSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4YSwgMHg5ODE3OGE1NSwgMHg5ODBlZDFhN30sCi0JCXsxNTEsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODd9LAotCQl7MTUzLCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMThmfSwKLQkJezE1NywgMHg5ODQwMmVjNCwgMHg5ODRjMDM4ZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5Zn0sCi0JCXsxNTksIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTd9LAotCQl7MTYxLCAweDk4NDAyZWM0LCAweDk4NGMwMzkyLCAweDk4MTc4YTU1LCAweDk4MGVkMTg3fSwKLQkJezE2NSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM5MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5N30sCi0JCXsxNjcsIDB4OTg0MDJlYzQsIDB4OTg0YzAzZDIsIDB4OTgxNzk4NTUsIDB4OTgxNTUzMWZ9LAotCQl7MTY5LCAweDk4NDAyZWM0LCAweDk4NGMwM2QyLCAweDk4MTc5ODU1LCAweDk4MTU1MzI3fSwKLQkJezE3MSwgMHg5ODQwMmVjNCwgMHg5ODRjMDNkNiwgMHg5ODE3OTg1NSwgMHg5ODE1NTMwN30sCi0JCXsxNzMsIDB4OTg0MDJlYzQsIDB4OTg0YzAzZDYsIDB4OTgxNzk4NTUsIDB4OTgxNTUzMGZ9LAotCi0JCS8vIEphcGFuCi0JCXsxODQsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5MWUsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMGJ9LAotCQl7MTg4LCAweDk1MDAyY2NjLCAweDk1MDA0OTIyLCAweDk1MDliZTU1LCAweDk1MGMwYTEzfSwKLQkJezE5MiwgMHg5NTAwMmNjYywgMHg5NTAwNDkyNiwgMHg5NTA5YmU1NSwgMHg5NTBjMGExYn0sCi0JCXsxOTYsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5MmEsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMjN9LAotCQl7MjA4LCAweDk1MDAyY2NjLCAweDk1MDA0OTNhLCAweDk1MDliZTU1LCAweDk1MGMwYTEzfSwKLQkJezIxMiwgMHg5NTAwMmNjYywgMHg5NTAwNDkzZSwgMHg5NTA5YmU1NSwgMHg5NTBjMGExYn0sCi0JCXsyMTYsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5ODIsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMjN9LAotCi0JCS8vIHN0aWxsIGxhY2sgb2YgTU1BQyhKYXBhbikgY2ggMzQsMzgsNDIsNDYKLX07Ci1VQ0hBUglOVU1fT0ZfMjg1MF9DSE5MID0gKHNpemVvZihSRjI4NTBSZWdUYWJsZSkgLyBzaXplb2YoUlRNUF9SRl9SRUdTKSk7Ci0KLUZSRVFVRU5DWV9JVEVNIEZyZXFJdGVtczMwMjBbXSA9Ci17Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8vIElTTSA6IDIuNCB0byAyLjQ4MyBHSHogICAgICAgICAgICAgICAgICAgICAgICAgLy8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLy8gMTFnCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8vLUNILS0tTi0tLS0tLS1SLS0tSy0tLS0tLS0tLS0tCi0JezEsICAgIDI0MSwgIDIsICAyfSwKLQl7MiwgICAgMjQxLAkgMiwgIDd9LAotCXszLCAgICAyNDIsCSAyLCAgMn0sCi0JezQsICAgIDI0MiwJIDIsICA3fSwKLQl7NSwgICAgMjQzLAkgMiwgIDJ9LAotCXs2LCAgICAyNDMsCSAyLCAgN30sCi0JezcsICAgIDI0NCwJIDIsICAyfSwKLQl7OCwgICAgMjQ0LAkgMiwgIDd9LAotCXs5LCAgICAyNDUsCSAyLCAgMn0sCi0JezEwLCAgIDI0NSwJIDIsICA3fSwKLQl7MTEsICAgMjQ2LAkgMiwgIDJ9LAotCXsxMiwgICAyNDYsCSAyLCAgN30sCi0JezEzLCAgIDI0NywJIDIsICAyfSwKLQl7MTQsICAgMjQ4LAkgMiwgIDR9LAotfTsKLVVDSEFSCU5VTV9PRl8zMDIwX0NITkwgPSAoc2l6ZW9mKEZyZXFJdGVtczMwMjApIC8gc2l6ZW9mKEZSRVFVRU5DWV9JVEVNKSk7Ci0KLQotVk9JRCBBc2ljVXBkYXRlQXV0b0ZhbGxCYWNrVGFibGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcFJhdGVUYWJsZSkKLXsKLQlVQ0hBUgkJCQkJaTsKLQlIVF9GQktfQ0ZHMF9TVFJVQwkJSHRDZmcwOwotCUhUX0ZCS19DRkcxX1NUUlVDCQlIdENmZzE7Ci0JTEdfRkJLX0NGRzBfU1RSVUMJCUxnQ2ZnMDsKLQlMR19GQktfQ0ZHMV9TVFJVQwkJTGdDZmcxOwotCVBSVE1QX1RYX1JBVEVfU1dJVENICXBDdXJyVHhSYXRlLCBwTmV4dFR4UmF0ZTsKLQotCS8vIHNldCB0byBpbml0aWFsIHZhbHVlCi0JSHRDZmcwLndvcmQgPSAweDY1NDMyMTAwOwotCUh0Q2ZnMS53b3JkID0gMHhlZGNiYTk4ODsKLQlMZ0NmZzAud29yZCA9IDB4ZWRjYmE5ODg7Ci0JTGdDZmcxLndvcmQgPSAweDAwMDAyMTAwOwotCi0JcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpcFJhdGVUYWJsZSsxOwotCWZvciAoaSA9IDE7IGkgPCAqKChQVUNIQVIpIHBSYXRlVGFibGUpOyBpKyspCi0JewotCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSClwUmF0ZVRhYmxlKzEraTsKLQkJc3dpdGNoIChwQ3VyclR4UmF0ZS0+TW9kZSkKLQkJewotCQkJY2FzZSAwOgkJLy9DQ0sKLQkJCQlicmVhazsKLQkJCWNhc2UgMToJCS8vT0ZETQotCQkJCXsKLQkJCQkJc3dpdGNoKHBDdXJyVHhSYXRlLT5DdXJyTUNTKQotCQkJCQl7Ci0JCQkJCQljYXNlIDA6Ci0JCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MwRkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAxOgotCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTMUZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMjoKLQkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzJGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDM6Ci0JCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MzRkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA0OgotCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTNEZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgNToKLQkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzVGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDY6Ci0JCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1M2RkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA3OgotCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTN0ZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCWNhc2UgMjoJCS8vSFQtTUlYCi0JCQljYXNlIDM6CQkvL0hULUdGCi0JCQkJewotCQkJCQlpZiAoKHBOZXh0VHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpICYmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyAhPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUykpCi0JCQkJCXsKLQkJCQkJCXN3aXRjaChwQ3VyclR4UmF0ZS0+Q3Vyck1DUykKLQkJCQkJCXsKLQkJCQkJCQljYXNlIDA6Ci0JCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzBGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAxOgotCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MxRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMjoKLQkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTMkZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDM6Ci0JCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzNGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSA0OgotCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M0RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgNToKLQkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTNUZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDY6Ci0JCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzZGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSA3OgotCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M3RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgODoKLQkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTOEZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDk6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzlGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAxMDoKLQkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTBGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAxMToKLQkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTFGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAxMjoKLQkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTJGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAxMzoKLQkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTNGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAxNDoKLQkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTRGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAxNToKLQkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTVGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlOiBub3Qgc3VwcG9ydCBDdXJyTUNTPSVkXG4iLCBwQ3VyclR4UmF0ZS0+Q3Vyck1DUykpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQl9Ci0KLQkJcE5leHRUeFJhdGUgPSBwQ3VyclR4UmF0ZTsKLQl9Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIVF9GQktfQ0ZHMCwgSHRDZmcwLndvcmQpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEhUX0ZCS19DRkcxLCBIdENmZzEud29yZCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgTEdfRkJLX0NGRzAsIExnQ2ZnMC53b3JkKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMR19GQktfQ0ZHMSwgTGdDZmcxLndvcmQpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJU2V0IE1BQyByZWdpc3RlciB2YWx1ZSBhY2NvcmRpbmcgb3BlcmF0aW9uIG1vZGUuCi0JCU9wZXJhdGlvbk1vZGUgQU5EIGJOb25HRkV4aXN0IGFyZSBmb3IgTU0gYW5kIEdGIFByb3RlY2l0b24uCi0JCUlmIE1NIG9yIEdGIG1hc2sgaXMgbm90IHNldCwgdGhvc2UgcGFzc2luZyBhcmd1bWVudCBkb2Vzbid0IG5vdCB0YWtlIGVmZmVjdC4KLQotCQlPcGVyYXRpb24gbW9kZSBtZWFuaW5nOgotCQk9IDAgOiBQdXJlIEhULCBubyBwcmVvdGVjdGlvbi4KLQkJPSAweDAxOyB0aGVyZSBtYXkgYmUgbm9uLUhUIGRldmljZXMgaW4gYm90aCB0aGUgY29udHJvbCBhbmQgZXh0ZW5zaW9uIGNoYW5uZWwsIHByb3RlY3Rpb24gaXMgb3B0aW9uYWwgaW4gQlNTLgotCQk9IDB4MTA6IE5vIFRyYW5zbWlzc2lvbiBpbiA0ME0gaXMgcHJvdGVjdGVkLgotCQk9IDB4MTE6IFRyYW5zbWlzc2lvbiBpbiBib3RoIDQwTSBhbmQgMjBNIHNoYWxsIGJlIHByb3RlY3RlZAotCQlpZiAoYk5vbkdGRXhpc3QpCi0JCQl3ZSBzaG91bGQgY2hvb3NlIG5vdCB0byB1c2UgR0YuIEJ1dCBzdGlsbCBzZXQgY29ycmVjdCBBU0lDIHJlZ2lzdGVycy4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUFzaWNVcGRhdGVQcm90ZWN0KAotCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKLQlJTgkJVVNIT1JUCQkJT3BlcmF0aW9uTW9kZSwKLQlJTgkJVUNIQVIJCQlTZXRNYXNrLAotCUlOCQlCT09MRUFOCQkJYkRpc2FibGVCR1Byb3RlY3QsCi0JSU4JCUJPT0xFQU4JCQliTm9uR0ZFeGlzdCkKLXsKLQlQUk9UX0NGR19TVFJVQwlQcm90Q2ZnLCBQcm90Q2ZnNDsKLQlVSU5UMzIgUHJvdGVjdFs2XTsKLQlVU0hPUlQJCQlvZmZzZXQ7Ci0JVUNIQVIJCQlpOwotCVVJTlQzMiBNYWNSZWcgPSAwOwotCi0jaWZkZWYgUkFMSU5LX0FURQotCWlmIChBVEVfT04ocEFkKSkKLQkJcmV0dXJuOwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCWlmICghKHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QpICYmIChPcGVyYXRpb25Nb2RlICE9IDgpKQotCXsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwQWQtPkJBVGFibGUubnVtRG9uZU9yaWdpbmF0b3IpCi0JewotCQkvLwotCQkvLyBlbmFibGUgdGhlIFJUUy9DVFMgdG8gYXZvaWQgY2hhbm5lbCBjb2xsaXNpb24KLQkJLy8KLQkJU2V0TWFzayA9IEFMTE5fU0VUUFJPVEVDVDsKLQkJT3BlcmF0aW9uTW9kZSA9IDg7Ci0JfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JLy8gQ29uZmlnIEFTSUMgUlRTIHRocmVzaG9sZCByZWdpc3RlcgotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfUlRTX0NGRywgJk1hY1JlZyk7Ci0JTWFjUmVnICY9IDB4RkYwMDAwRkY7Ci0JLy8gSWYgdGhlIHVzZXIgd2FudCBkaXNhYmxlIFJ0c1RocmVzaG9sZCBhbmQgZW5iYWxlIEFtc2R1L1JhbGluay1BZ2dyZWdhdGlvbiwgc2V0IHRoZSBSdHNUaHJlc2hvbGQgYXMgNDA5NgotICAgICAgICBpZiAoKAotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSkgfHwKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCShwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID09IFRSVUUpKQotICAgICAgICAgICAgJiYgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID09IE1BWF9SVFNfVEhSRVNIT0xEKQotICAgICAgICB7Ci0JCQlNYWNSZWcgfD0gKDB4MTAwMCA8PCA4KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQkJCU1hY1JlZyB8PSAocEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkIDw8IDgpOwotICAgICAgICB9Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFNfQ0ZHLCBNYWNSZWcpOwotCi0JLy8gSW5pdGlhbCBjb21tb24gcHJvdGVjdGlvbiBzZXR0aW5ncwotCVJUTVBaZXJvTWVtb3J5KFByb3RlY3QsIHNpemVvZihQcm90ZWN0KSk7Ci0JUHJvdENmZzQud29yZCA9IDA7Ci0JUHJvdENmZy53b3JkID0gMDsKLQlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0dGNDAgPSAxOwotCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0YyMCA9IDE7Ci0JUHJvdENmZy5maWVsZC5UeG9wQWxsb3dNTTQwID0gMTsKLQlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NMjAgPSAxOwotCVByb3RDZmcuZmllbGQuVHhvcEFsbG93T2ZkbSA9IDE7Ci0JUHJvdENmZy5maWVsZC5UeG9wQWxsb3dDY2sgPSAxOwotCVByb3RDZmcuZmllbGQuUlRTVGhFbiA9IDE7Ci0JUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKLQotCS8vIHVwZGF0ZSBQSFkgbW9kZSBhbmQgcmF0ZQotCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JCVByb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSAweDQwMDA7Ci0JUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSB8PSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOwotCi0JLy8gSGFuZGxlIGxlZ2FjeShCL0cpIHByb3RlY3Rpb24KLQlpZiAoYkRpc2FibGVCR1Byb3RlY3QpCi0JewotCQkvL1Byb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOwotCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsKLQkJUHJvdGVjdFswXSA9IFByb3RDZmcud29yZDsKLQkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKLQkJcEFkLT5GbGdDdHNFbmFibGVkID0gMDsgLyogQ1RTLXNlbGYgaXMgbm90IHVzZWQgKi8KLQl9Ci0JZWxzZQotCXsKLQkJLy9Qcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKLQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IDA7CQkJLy8gQ0NLIGRvIG5vdCBuZWVkIHRvIGJlIHByb3RlY3RlZAotCQlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOwotCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19DVFM7CS8vIE9GRE0gbmVlZHMgdXNpbmcgQ0NLIHRvIHByb3RlY3QKLQkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKLQkJcEFkLT5GbGdDdHNFbmFibGVkID0gMTsgLyogQ1RTLXNlbGYgaXMgdXNlZCAqLwotCX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCS8vIERlY2lkZSBIVCBmcmFtZSBwcm90ZWN0aW9uLgotCWlmICgoU2V0TWFzayAmIEFMTE5fU0VUUFJPVEVDVCkgIT0gMCkKLQl7Ci0JCXN3aXRjaChPcGVyYXRpb25Nb2RlKQotCQl7Ci0JCQljYXNlIDB4MDoKLQkJCQkvLyBOTyBQUk9URUNUCi0JCQkJLy8gMS5BbGwgU1RBcyBpbiB0aGUgQlNTIGFyZSAyMC80MCBNSHogSFQKLQkJCQkvLyAyLiBpbiBhaSAyMC80ME1IeiBCU1MKLQkJCQkvLyAzLiBhbGwgU1RBcyBhcmUgMjBNSHogaW4gYSAyME1IeiBCU1MKLQkJCQkvLyBQdXJlIEhULiBubyBwcm90ZWN0aW9uLgotCi0JCQkJLy8gTU0yMF9QUk9UX0NGRwotCQkJCS8vCVJlc2VydmVkICgzMToyNykKLQkJCQkvLwlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQotCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQotCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQotCQkJCS8vCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKLQkJCQlQcm90ZWN0WzJdID0gMHgwMTc0NDAwNDsKLQotCQkJCS8vIE1NNDBfUFJPVF9DRkcKLQkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCi0JCQkJLy8JUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEKLQkJCQkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKLQkJCQkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKLQkJCQkvLwlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQotCQkJCVByb3RlY3RbM10gPSAweDAzZjQ0MDg0OwotCi0JCQkJLy8gQ0YyMF9QUk9UX0NGRwotCQkJCS8vCVJlc2VydmVkICgzMToyNykKLQkJCQkvLwlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQotCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQotCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQotCQkJCS8vCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKLQkJCQlQcm90ZWN0WzRdID0gMHgwMTc0NDAwNDsKLQotCQkJCS8vIENGNDBfUFJPVF9DRkcKLQkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCi0JCQkJLy8JUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEKLQkJCQkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKLQkJCQkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKLQkJCQkvLwlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQotCQkJCVByb3RlY3RbNV0gPSAweDAzZjQ0MDg0OwotCi0JCQkJaWYgKGJOb25HRkV4aXN0KQotCQkJCXsKLQkJCQkJLy8gUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3RpaW9uKQotCQkJCQkvLyBQUk9UX0NUUkwoMTc6MTYpIC0tIDAxIChSVFMvQ1RTKQotCQkJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKLQkJCQkJUHJvdGVjdFs1XSA9IDB4MDNmNTQwODQ7Ci0JCQkJfQotCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAxOgotCQkJCS8vIFRoaXMgaXMgIkhUIG5vbi1tZW1iZXIgcHJvdGVjdGlvbiBtb2RlLiIKLQkJCQkvLyBJZiB0aGVyZSBtYXkgYmUgbm9uLUhUIFNUQXMgbXkgQlNTCi0JCQkJUHJvdENmZy53b3JkID0gMHgwMTc0NDAwNDsJLy8gUFJPVF9DVFJMKDE3OjE2KSA6IDAgKE5vbmUpCi0JCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7IC8vIGR1cGxpY2FldCBsZWdhY3kgMjRNLiBCVyBzZXQgMS4KLQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCkpCi0JCQkJewotCQkJCQlQcm90Q2ZnLndvcmQgPSAweDAxNzQwMDAzOwkvL0VSUCB1c2UgUHJvdGVjdGlvbiBiaXQgaXMgc2V0LCB1c2UgcHJvdGVjdGlvbiByYXRlIGF0IENsYXVzZSAxOC4uCi0JCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQwMDAzOyAvLyBEb24ndCBkdXBsaWNhdGUgUlRTL0NUUyBpbiBDQ0sgbW9kZS4gMHgwM2Y0MDA4MzsKLQkJCQl9Ci0JCQkJLy9Bc3NpZ24gUHJvdGVjdGlvbiBtZXRob2QgZm9yIDIwJjQwIE1IeiBwYWNrZXRzCi0JCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOwotCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7Ci0JCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKLQkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKLQkJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOwotCQkJCVByb3RlY3RbM10gPSBQcm90Q2ZnNC53b3JkOwotCQkJCVByb3RlY3RbNF0gPSBQcm90Q2ZnLndvcmQ7Ci0JCQkJUHJvdGVjdFs1XSA9IFByb3RDZmc0LndvcmQ7Ci0JCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IFRSVUU7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgMjoKLQkJCQkvLyBJZiBvbmx5IEhUIFNUQXMgYXJlIGluIEJTUy4gYXQgbGVhc3Qgb25lIGlzIDIwTUh6LiBPbmx5IHByb3RlY3QgNDBNSHogcGFja2V0cwotCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7ICAvLyBQUk9UX0NUUkwoMTc6MTYpIDogMCAoTm9uZSkKLQkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0NDA4NDsgLy8gZHVwbGljYWV0IGxlZ2FjeSAyNE0uIEJXIHNldCAxLgotCi0JCQkJLy9Bc3NpZ24gUHJvdGVjdGlvbiBtZXRob2QgZm9yIDQwTUh6IHBhY2tldHMKLQkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOwotCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOwotCQkJCVByb3RlY3RbMl0gPSBQcm90Q2ZnLndvcmQ7Ci0JCQkJUHJvdGVjdFszXSA9IFByb3RDZmc0LndvcmQ7Ci0JCQkJaWYgKGJOb25HRkV4aXN0KQotCQkJCXsKLQkJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOwotCQkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOwotCQkJCX0KLQkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOwotCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOwotCi0JCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IEZBTFNFOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIDM6Ci0JCQkJLy8gSFQgbWl4ZWQgbW9kZS4JIFBST1RFQ1QgQUxMIQotCQkJCS8vIEFzc2lnbiBSYXRlCi0JCQkJUHJvdENmZy53b3JkID0gMHgwMTc0NDAwNDsJLy9kdXBsaWNhZXQgbGVnYWN5IDI0TS4gQlcgc2V0IDEuCi0JCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7Ci0JCQkJLy8gYm90aCAyME1IeiBhbmQgNDBNSHogYXJlIHByb3RlY3RlZC4gV2hldGhlciB1c2UgUlRTIG9yIENUUy10by1zZWxmIGRlcGVuZHMgb24gdGhlCi0JCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKQotCQkJCXsKLQkJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0MDAwMzsJLy9FUlAgdXNlIFByb3RlY3Rpb24gYml0IGlzIHNldCwgdXNlIHByb3RlY3Rpb24gcmF0ZSBhdCBDbGF1c2UgMTguLgotCQkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0MDAwMzsgLy8gRG9uJ3QgZHVwbGljYXRlIFJUUy9DVFMgaW4gQ0NLIG1vZGUuIDB4MDNmNDAwODMKLQkJCQl9Ci0JCQkJLy9Bc3NpZ24gUHJvdGVjdGlvbiBtZXRob2QgZm9yIDIwJjQwIE1IeiBwYWNrZXRzCi0JCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOwotCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7Ci0JCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKLQkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKLQkJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOwotCQkJCVByb3RlY3RbM10gPSBQcm90Q2ZnNC53b3JkOwotCQkJCVByb3RlY3RbNF0gPSBQcm90Q2ZnLndvcmQ7Ci0JCQkJUHJvdGVjdFs1XSA9IFByb3RDZmc0LndvcmQ7Ci0JCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IFRSVUU7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgODoKLQkJCQkvLyBTcGVjaWFsIG9uIGZvciBBdGhlcm9zIHByb2JsZW0gbiBjaGlwLgotCQkJCVByb3RlY3RbMl0gPSAweDAxNzU0MDA0OwotCQkJCVByb3RlY3RbM10gPSAweDAzZjU0MDg0OwotCQkJCVByb3RlY3RbNF0gPSAweDAxNzU0MDA0OwotCQkJCVByb3RlY3RbNV0gPSAweDAzZjU0MDg0OwotCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0Jb2Zmc2V0ID0gQ0NLX1BST1RfQ0ZHOwotCWZvciAoaSA9IDA7aSA8IDY7aSsrKQotCXsKLQkJCWlmICgoU2V0TWFzayAmICgxPDwgaSkpKQotCQl7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCArIGkqNCwgUHJvdGVjdFtpXSk7Ci0JfQotfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNTd2l0Y2hDaGFubmVsKAotCQkJCQkgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVDSEFSCQkJQ2hhbm5lbCwKLQlJTglCT09MRUFOCQkJYlNjYW4pCi17Ci0JVUxPTkcJCQlSMiA9IDAsIFIzID0gREVGQVVMVF9SRl9UWF9QT1dFUiwgUjQgPSAwOwotCUNIQVIgICAgVHhQd2VyID0gMCwgVHhQd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7IC8vQmJwOTQgPSBCQlBSOTRfREVGQVVMVCwgVHhQd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JVUNIQVIJaW5kZXg7Ci0JVUlOVDMyCVZhbHVlID0gMDsgLy9CYnBSZWcsIFZhbHVlOwotCVJUTVBfUkZfUkVHUyAqUkZSZWdUYWJsZTsKLQlVQ0hBUglSRlZhbHVlOwotCi0JUkZWYWx1ZSA9IDA7Ci0JLy8gU2VhcmNoIFR4IHBvd2VyIHZhbHVlCi0JLy8gV2UgY2FuJ3QgdXNlIENoYW5uZWxMaXN0IHRvIHNlYXJjaCBjaGFubmVsLCBzaW5jZSBzb21lIGNlbnRyYWwgY2hhbm5sJ3MgdHhwb3dyIGRvZXNuJ3QgbGlzdAotCS8vIGluIENoYW5uZWxMaXN0LCBzbyB1c2UgVHhQb3dlciBhcnJheSBpbnN0ZWFkLgotCS8vCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX05VTV9PRl9DSEFOTkVMUzsgaW5kZXgrKykKLQl7Ci0JCWlmIChDaGFubmVsID09IHBBZC0+VHhQb3dlcltpbmRleF0uQ2hhbm5lbCkKLQkJewotCQkJVHhQd2VyID0gcEFkLT5UeFBvd2VyW2luZGV4XS5Qb3dlcjsKLQkJCVR4UHdlcjIgPSBwQWQtPlR4UG93ZXJbaW5kZXhdLlBvd2VyMjsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGluZGV4ID09IE1BWF9OVU1fT0ZfQ0hBTk5FTFMpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogQ2FuJ3QgZmluZCB0aGUgQ2hhbm5lbCMlZCBcbiIsIENoYW5uZWwpKTsKLQl9Ci0KLSNpZmRlZiBSVDMweHgKLQkvLyBUaGUgUkYgcHJvZ3JhbW1pbmcgc2VxdWVuY2UgaXMgZGlmZmVyZW5jZSBiZXR3ZWVuIDN4eHggYW5kIDJ4eHgKLQlpZiAoKElTX1JUMzA3MChwQWQpIHx8IElTX1JUMzA5MChwQWQpfHxJU19SVDMzOTAocEFkKSkgJiYgKChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCkgfHwgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18yMDIwKSB8fAotCQkocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjEpIHx8IChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMikpKQotCXsKLQkJLyogbW9kaWZ5IGJ5IFdZIGZvciBSZWFkIFJGIFJlZy4gZXJyb3IgKi8KLQotCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMzAyMF9DSE5MOyBpbmRleCsrKQotCQl7Ci0JCQlpZiAoQ2hhbm5lbCA9PSBGcmVxSXRlbXMzMDIwW2luZGV4XS5DaGFubmVsKQotCQkJewotCQkJCS8vIFByb2dyYW1taW5nIGNoYW5uZWwgcGFyYW1ldGVycwotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMiwgRnJlcUl0ZW1zMzAyMFtpbmRleF0uTik7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAzLCBGcmVxSXRlbXMzMDIwW2luZGV4XS5LKTsKLQkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgJlJGVmFsdWUpOwotCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4RkMpIHwgRnJlcUl0ZW1zMzAyMFtpbmRleF0uUjsKLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDYsIFJGVmFsdWUpOwotCi0JCQkJLy8gU2V0IFR4MCBQb3dlcgotCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjEyLCAmUkZWYWx1ZSk7Ci0JCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgMHhFMCkgfCBUeFB3ZXI7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjEyLCBSRlZhbHVlKTsKLQotCQkJCS8vIFNldCBUeDEgUG93ZXIKLQkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IxMywgJlJGVmFsdWUpOwotCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4RTApIHwgVHhQd2VyMjsKLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMTMsIFJGVmFsdWUpOwotCi0JCQkJLy8gVHgvUnggU3RyZWFtIHNldHRpbmcKLQkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgJlJGVmFsdWUpOwotCQkJCS8vaWYgKElTX1JUMzA5MChwQWQpKQotCQkJCS8vCVJGVmFsdWUgfD0gMHgwMTsgLy8gRW5hYmxlIFJGIGJsb2NrLgotCQkJCVJGVmFsdWUgJj0gMHgwMzsJLy9jbGVhciBiaXRbN34yXQotCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCQkJCVJGVmFsdWUgfD0gMHhBMDsKLQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpCi0JCQkJCVJGVmFsdWUgfD0gMHg4MDsKLQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCQkJCQlSRlZhbHVlIHw9IDB4NTA7Ci0JCQkJZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQotCQkJCQlSRlZhbHVlIHw9IDB4NDA7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCBSRlZhbHVlKTsKLQotCQkJCS8vIFNldCBSRiBvZmZzZXQKLQkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMywgJlJGVmFsdWUpOwotCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4ODApIHwgcEFkLT5SZkZyZXFPZmZzZXQ7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIzLCBSRlZhbHVlKTsKLQotCQkJCS8vIFNldCBCVwotCQkJCWlmICghYlNjYW4gJiYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkpCi0JCQkJewotCQkJCQlSRlZhbHVlID0gcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQ7Ci0JCQkJCS8vRElTQUJMRV8xMU5fQ0hFQ0socEFkKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJUkZWYWx1ZSA9IHBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0OwotCQkJCX0KLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGVmFsdWUpOwotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgUkZWYWx1ZSk7Ci0KLQkJCQkvLyBFbmFibGUgUkYgdHVuaW5nCi0JCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsICZSRlZhbHVlKTsKLQkJCQlSRlZhbHVlID0gUkZWYWx1ZSB8IDB4MTsKLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsIFJGVmFsdWUpOwotCi0JCQkJLy8gbGF0Y2ggY2hhbm5lbCBmb3IgZnV0dXJlIHVzYWdlLgotCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IENoYW5uZWw7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3dpdGNoQ2hhbm5lbCMlZChSRj0lZCwgUHdyMD0lZCwgUHdyMT0lZCwgJWRUKSwgTj0weCUwMlgsIEs9MHglMDJYLCBSPTB4JTAyWFxuIiwKLQkJCUNoYW5uZWwsCi0JCQlwQWQtPlJmSWNUeXBlLAotCQkJVHhQd2VyLAotCQkJVHhQd2VyMiwKLQkJCXBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgsCi0JCQlGcmVxSXRlbXMzMDIwW2luZGV4XS5OLAotCQkJRnJlcUl0ZW1zMzAyMFtpbmRleF0uSywKLQkJCUZyZXFJdGVtczMwMjBbaW5kZXhdLlIpKTsKLQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBSVDMweHggLy8KLQl7Ci0JCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKLQkJc3dpdGNoIChwQWQtPlJmSWNUeXBlKQotCQl7Ci0JCQljYXNlIFJGSUNfMjgyMDoKLQkJCWNhc2UgUkZJQ18yODUwOgotCQkJY2FzZSBSRklDXzI3MjA6Ci0JCQljYXNlIFJGSUNfMjc1MDoKLQotCQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspCi0JCQkJewotCQkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKQotCQkJCQl7Ci0JCQkJCQlSMiA9IFJGUmVnVGFibGVbaW5kZXhdLlIyOwotCQkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKLQkJCQkJCXsKLQkJCQkJCQlSMiB8PSAweDQwMDA7CS8vIElmIFRYcGF0aCBpcyAxLCBiaXQgMTQgPSAxOwotCQkJCQkJfQotCi0JCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQotCQkJCQkJewotCQkJCQkJCVIyIHw9IDB4NDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4cGF0aC4KLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQkJCQkJCXsKLQkJCQkJCQlSMiB8PSAweDIwMDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeFBhdGgKLQkJCQkJCX0KLQotCQkJCQkJaWYgKENoYW5uZWwgPiAxNCkKLQkJCQkJCXsKLQkJCQkJCQkvLyBpbml0aWFsaXplIFIzLCBSNAotCQkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZik7Ci0JCQkJCQkJUjQgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjQgJiAofjB4MDAxZjg3YzApKSB8IChwQWQtPlJmRnJlcU9mZnNldCA8PCAxNSk7Ci0KLQkJCQkJCQkvLyA1RyBiYW5kIHBvd2VyIHJhbmdlOiAweEY5fjBYMEYsIFRYMCBSZWczIGJpdDkvVFgxIFJlZzQgYml0Nj0iMCIgbWVhbnMgdGhlIFRYIHBvd2VyIHJlZHVjZSA3ZEIKLQkJCQkJCQkvLyBSMwotCQkJCQkJCWlmICgoVHhQd2VyID49IC03KSAmJiAoVHhQd2VyIDwgMCkpCi0JCQkJCQkJewotCQkJCQkJCQlUeFB3ZXIgPSAoNytUeFB3ZXIpOwotCQkJCQkJCQlUeFB3ZXIgPSAoVHhQd2VyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcik7Ci0JCQkJCQkJCVIzIHw9IChUeFB3ZXIgPDwgMTApOwotCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyPSVkIFxuIiwgVHhQd2VyKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UKLQkJCQkJCQl7Ci0JCQkJCQkJCVR4UHdlciA9IChUeFB3ZXIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyKTsKLQkJCQkJCQkJUjMgfD0gKFR4UHdlciA8PCAxMCkgfCAoMSA8PCA5KTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQkvLyBSNAotCQkJCQkJCWlmICgoVHhQd2VyMiA+PSAtNykgJiYgKFR4UHdlcjIgPCAwKSkKLQkJCQkJCQl7Ci0JCQkJCQkJCVR4UHdlcjIgPSAoNytUeFB3ZXIyKTsKLQkJCQkJCQkJVHhQd2VyMiA9IChUeFB3ZXIyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcjIpOwotCQkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KTsKLQkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQXNpY1N3aXRjaENoYW5uZWw6IFR4UHdlcjI9JWQgXG4iLCBUeFB3ZXIyKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UKLQkJCQkJCQl7Ci0JCQkJCQkJCVR4UHdlcjIgPSAoVHhQd2VyMiA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIyKTsKLQkJCQkJCQkJUjQgfD0gKFR4UHdlcjIgPDwgNykgfCAoMSA8PCA2KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJUjMgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZmZjMWZmKSB8IChUeFB3ZXIgPDwgOSk7IC8vIHNldCBUWCBwb3dlcjAKLQkJCQkJCVI0ID0gKFJGUmVnVGFibGVbaW5kZXhdLlI0ICYgKH4weDAwMWY4N2MwKSkgfCAocEFkLT5SZkZyZXFPZmZzZXQgPDwgMTUpIHwgKFR4UHdlcjIgPDw2KTsvLyBTZXQgZnJlcSBPZmZzZXQgJiBUeFB3cjEKLQkJCQkJCX0KLQotCQkJCQkJLy8gQmFzZWQgb24gQkJQIGN1cnJlbnQgbW9kZSBiZWZvcmUgY2hhbmdpbmcgUkYgY2hhbm5lbC4KLQkJCQkJCWlmICghYlNjYW4gJiYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkpCi0JCQkJCQl7Ci0JCQkJCQkJUjQgfD0weDIwMDAwMDsKLQkJCQkJCX0KLQotCQkJCQkJLy8gVXBkYXRlIHZhcmlhYmxlcwotCQkJCQkJcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID0gQ2hhbm5lbDsKLQkJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMTsKLQkJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjIgPSBSMjsKLQkJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSMzsKLQkJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSNDsKLQotI2lmZGVmIERGU19ERUJVRwotI2lmZGVmIERGU19GQ0NfQlc0MF9GSVgKLQkJCQkJCWlmIChwQWQtPmluZlR5cGUgPT0gUlRNUF9ERVZfSU5GX1BDSSkgLy8gUlQyODgwIFBDSQotCQkJCQkJewotCQkJCQkJCS8qIG9ubHkgZm9yIFJUMjg4MCAqLwotCQkJCQkJCS8vIEZDQyBERlMgdGVzdAotCQkJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjEgfD0gMHgxMDA7Ci0JCQkJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCB8PSAweDAwNDAwMDAwOwotCQkJCQkJfQotI2VuZGlmIC8vIERGU19GQ0NfQlc0MF9GSVggLy8KLSNlbmRpZiAvLyBERlNfREVCVUcgLy8KLQotCQkJCQkJLy8gU2V0IFJGIHZhbHVlIDEncyBzZXQgUjNbYml0Ml0gPSBbMF0KLQkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOwotCQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7Ci0JCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyAmICh+MHgwNCkpKTsKLQkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOwotCi0JCQkJCQlSVE1QdXNlY0RlbGF5KDIwMCk7Ci0KLQkJCQkJCS8vIFNldCBSRiB2YWx1ZSAyJ3Mgc2V0IFIzW2JpdDJdID0gWzFdCi0JCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKLQkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOwotCQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgfCAweDA0KSk7Ci0JCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKLQotCQkJCQkJUlRNUHVzZWNEZWxheSgyMDApOwotCi0JCQkJCQkvLyBTZXQgUkYgdmFsdWUgMydzIHNldCBSM1tiaXQyXSA9IFswXQotCQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7Ci0JCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKLQkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOwotCQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7Ci0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3dpdGNoQ2hhbm5lbCMlZChSRj0lZCwgUHdyMD0lbHUsIFB3cjE9JWx1LCAlZFQpIHRvICwgUjE9MHglMDhseCwgUjI9MHglMDhseCwgUjM9MHglMDhseCwgUjQ9MHglMDhseFxuIiwKLQkJCQkJCQkgIENoYW5uZWwsCi0JCQkJCQkJICBwQWQtPlJmSWNUeXBlLAotCQkJCQkJCSAgKFIzICYgMHgwMDAwM2UwMCkgPj4gOSwKLQkJCQkJCQkgIChSNCAmIDB4MDAwMDA3YzApID4+IDYsCi0JCQkJCQkJICBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAotCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMSwKLQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjIsCi0JCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIzLAotCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SNCkpOwotCX0KLQotCS8vIENoYW5nZSBCQlAgc2V0dGluZyBkdXJpbmcgc2l3dGNoIGZyb20gYS0+ZywgZy0+YQotCWlmIChDaGFubmVsIDw9IDE0KQotCXsKLQkJVUxPTkcJVHhQaW5DZmcgPSAweDAwMDUwRjBBOy8vR2FyeSAyMDA3LzA4LzA5IDB4MDUwQTBBCi0KLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjIsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjQsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDApOy8vKDB4NDQgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOwkvLyBBY2NvcmRpbmcgdGhlIFJvcnkncyBzdWdnZXN0aW9uIHRvIHNvbHZlIHRoZSBtaWRkbGUgcmFuZ2UgaXNzdWUuCi0JCS8vUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4NjIpOwotCi0JCS8vIFJ4IEhpZ2ggcG93ZXIgVkdBIG9mZnNldCBmb3IgTE5BIHNlbGVjdAotCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRykKLQkJewotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4NjIpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NDYpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4ODQpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NTApOwotCQl9Ci0KLQkJLy8gNUcgYmFuZCBzZWxlY3Rpb24gUElOLCBiaXQxIGFuZCBiaXQyIGFyZSBjb21wbGVtZW50Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7Ci0JCVZhbHVlICY9ICh+MHg2KTsKLQkJVmFsdWUgfD0gKDB4MDQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOwotCi0JCS8vIFR1cm4gb2ZmIHVudXNlZCBQQSBvciBMTkEgd2hlbiBvbmx5IDFUIG9yIDFSCi0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjM7Ci0JCX0KLQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQkJewotCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjNGRjsKLQkJfQotCi0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOwotCi0jaWYgZGVmaW5lZChSVDMwOTApIHx8IGRlZmluZWQoUlQzMzkwKQotCQkvLyBQQ0llIFBIWSBUcmFuc21pdCBhdHRlbnVhdGlvbiBhZGp1c3RtZW50Ci0JCWlmIChJU19SVDMwOTBBKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCi0JCXsKLQkJCVRYX0FUVEVOVUFUSU9OX0NUUkxfU1RSVUMgVHhBdHRlbnVhdGlvbkN0cmwgPSB7MH07Ci0KLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUENJRV9QSFlfVFhfQVRURU5VQVRJT05fQ1RSTCwgJlR4QXR0ZW51YXRpb25DdHJsLndvcmQpOwotCi0JCQlpZiAoQ2hhbm5lbCA9PSAxNCkgLy8gQ2hhbm5lbCAjMTQKLQkJCXsKLQkJCQlUeEF0dGVudWF0aW9uQ3RybC5maWVsZC5QQ0lFX1BIWV9UWF9BVFRFTl9FTiA9IDE7IC8vIEVuYWJsZSBQQ0llIFBIWSBUeCBhdHRlbnVhdGlvbgotCQkJCVR4QXR0ZW51YXRpb25DdHJsLmZpZWxkLlBDSUVfUEhZX1RYX0FUVEVOX1ZBTFVFID0gNDsgLy8gOS8xNiBmdWxsIGRyaXZlIGxldmVsCi0JCQl9Ci0JCQllbHNlIC8vIENoYW5uZWwgIzF+IzEzCi0JCQl7Ci0JCQkJVHhBdHRlbnVhdGlvbkN0cmwuZmllbGQuUENJRV9QSFlfVFhfQVRURU5fRU4gPSAwOyAvLyBEaXNhYmxlIFBDSWUgUEhZIFR4IGF0dGVudWF0aW9uCi0JCQkJVHhBdHRlbnVhdGlvbkN0cmwuZmllbGQuUENJRV9QSFlfVFhfQVRURU5fVkFMVUUgPSAwOyAvLyBuL2EKLQkJCX0KLQotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgUENJRV9QSFlfVFhfQVRURU5VQVRJT05fQ1RSTCwgVHhBdHRlbnVhdGlvbkN0cmwud29yZCk7Ci0JCX0KLSNlbmRpZgotCX0KLQllbHNlCi0JewotCQlVTE9ORwlUeFBpbkNmZyA9IDB4MDAwNTBGMDU7Ly9HYXJ5IDIwMDcvOC85IDB4MDUwNTA1Ci0KLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjIsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjQsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDApOy8vKDB4NDQgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOyAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweEYyKTsKLQotCQkvLyBSeCBIaWdoIHBvd2VyIFZHQSBvZmZzZXQgZm9yIExOQSBzZWxlY3QKLQkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckEpCi0JCXsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDQ2KTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDUwKTsKLQkJfQotCi0JCS8vIDVHIGJhbmQgc2VsZWN0aW9uIFBJTiwgYml0MSBhbmQgYml0MiBhcmUgY29tcGxlbWVudAotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSAofjB4Nik7Ci0JCVZhbHVlIHw9ICgweDAyKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKLQotCQkvLyBUdXJuIG9mZiB1bnVzZWQgUEEgb3IgTE5BIHdoZW4gb25seSAxVCBvciAxUgotCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQotCQl7Ci0JCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOwotCQl9Ci0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7Ci0JCX0KLQotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKLQotCX0KLQotCS8vIFI2NiBzaG91bGQgYmUgc2V0IGFjY29yZGluZyB0byBDaGFubmVsIGFuZCB1c2UgMjBNSHogd2hlbiBzY2FubmluZwotCS8vUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQlpZiAoYlNjYW4pCi0JCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBCV18yMCk7Ci0JZWxzZQotCQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXKTsKLQotCS8vCi0JLy8gT24gMTFBLCBXZSBzaG91bGQgZGVsYXkgYW5kIHdhaXQgUkYvQkJQIHRvIGJlIHN0YWJsZQotCS8vIGFuZCB0aGUgYXBwcm9wcmlhdGUgdGltZSBzaG91bGQgYmUgMTAwMCBtaWNybyBzZWNvbmRzCi0JLy8gMjAwNS8wNi8wNSAtIE9uIDExRywgV2UgYWxzbyBuZWVkIHRoaXMgZGVsYXkgdGltZS4gT3RoZXJ3aXNlIGl0J3MgZGlmZmljdWx0IHRvIHBhc3MgdGhlIFdIUUwuCi0JLy8KLQlSVE1QdXNlY0RlbGF5KDEwMDApOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIDI0MjEgb25seSwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBkdXJpbmcKLQkJc2l0ZSBzdXJ2ZXkuIEl0J3Mgb25seSByZXF1aXJlZCBhZnRlciBOSUMgZGVjaWRlZCB0byBzdGF5IGF0IGEgY2hhbm5lbAotCQlmb3IgYSBsb25nZXIgcGVyaW9kLgotCQlXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBpdCdzIGFsd2F5cyBhZnRlciBBc2ljU3dpdGNoQ2hhbm5lbCgpLgotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY0xvY2tDaGFubmVsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSIENoYW5uZWwpCi17Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi1WT0lECUFzaWNBbnRlbm5hU2VsZWN0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJQ2hhbm5lbCkKLXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDIgPT0gMSkKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl7Ci0JCS8vIHBhdGNoIGZvciBBc2ljU2V0UnhBbnQgZmFpbGVkCi0JCXBBZC0+UnhBbnQuRXZhbHVhdGVQZXJpb2QgPSAwOwotCi0JCS8vIGNoZWNrIGV2ZXJ5IDIgc2Vjb25kLiBJZiByY3YtYmVhY29uIGxlc3MgdGhhbiA1IGluIHRoZSBwYXN0IDIgc2Vjb25kLCB0aGVuIEF2Z1JTU0kgaXMgbm8gbG9uZ2VyIGEKLQkJLy8gdmFsaWQgaW5kaWNhdGlvbiBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGlzIEFQIGFuZCBpdHMgY2xpZW50cy4KLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJewotCQkJU0hPUlQJcmVhbGF2Z3Jzc2kxOwotCi0JCQkvLyBpZiBubyB0cmFmZmljIHRoZW4gcmVzZXQgYXZlcmFnZSByc3NpIHRvIHRyaWdnZXIgZXZhbHVhdGlvbgotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJaWYgKHBBZC0+U3RhQ2ZnLk51bU9mQXZnUnNzaVNhbXBsZSA8IDUpCi0JCQl7Ci0JCQkJcEFkLT5SeEFudC5QYWlyMUxhc3RBdmdSc3NpID0gKC05OSk7Ci0JCQkJcEFkLT5SeEFudC5QYWlyMkxhc3RBdmdSc3NpID0gKC05OSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVBlcmlvZGljRXhlYzogbm8gdHJhZmZpYy9iZWFjb24sIHJlc2V0IFJTU0lcbiIpKTsKLQkJCX0KLQotCQkJcEFkLT5TdGFDZmcuTnVtT2ZBdmdSc3NpU2FtcGxlID0gMDsKLQkJCXJlYWxhdmdyc3NpMSA9IChwQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50XSA+PiAzKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBbnQtcmVhbHJzc2kwKCVkKSwgTGFzdHJzc2kwKCVkKSwgRXZhbHVhdGVTdGFibGVDbnQ9JWRcbiIsIHJlYWxhdmdyc3NpMSwgcEFkLT5SeEFudC5QYWlyMUxhc3RBdmdSc3NpLCBwQWQtPlJ4QW50LkV2YWx1YXRlU3RhYmxlQ250KSk7Ci0KLQkJCS8vIGlmIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHJzc2kgaXMgbGFyZ2VyIG9yIGxlc3MgdGhhbiA1LCB0aGVuIGV2YWx1YXRlIHRoZSBvdGhlciBhbnRlbm5hCi0JCQlpZiAoKHBBZC0+UnhBbnQuRXZhbHVhdGVTdGFibGVDbnQgPCAyKSB8fCAocmVhbGF2Z3Jzc2kxID4gKHBBZC0+UnhBbnQuUGFpcjFMYXN0QXZnUnNzaSArIDUpKSB8fCAocmVhbGF2Z3Jzc2kxIDwgKHBBZC0+UnhBbnQuUGFpcjFMYXN0QXZnUnNzaSAtIDUpKSkKLQkJCQlBc2ljRXZhbHVhdGVSeEFudChwQWQpOwotCi0JCQkJcEFkLT5SeEFudC5QYWlyMUxhc3RBdmdSc3NpID0gcmVhbGF2Z3Jzc2kxOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gaWYgbm90IGNvbm5lY3RlZCwgYWx3YXlzIHN3aXRjaCBhbnRlbm5hIHRvIHRyeSB0byBjb25uZWN0Ci0JCQlVQ0hBUgl0ZW1wOwotCi0JCQl0ZW1wID0gcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudDsKLQkJCXBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQgPSBwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQ7Ci0JCQlwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQgPSB0ZW1wOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lUGVyaW9kaWNFeGVjOiBubyBjb25uZWN0LCBzd2l0Y2ggdG8gYW5vdGhlciBvbmUgdG8gdHJ5IGNvbm5lY3Rpb25cbiIpKTsKLQotCQkJQXNpY1NldFJ4QW50KHBBZCwgcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudCk7Ci0JCX0KLQl9Ci19Ci0jZW5kaWYgLy8gQU5UX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlBbnRlbm5hIG1pc2NlbGxhbmVvdXMgc2V0dGluZy4KLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlCYW5kU3RhdGUJCQkJSW5kaWNhdGUgY3VycmVudCBCYW5kIFN0YXRlLgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMIDw9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCQkxLikgRnJhbWUgRW5kIHR5cGUgY29udHJvbAotCQkJb25seSB2YWxpZCBmb3IgRyBvbmx5IChSRl8yNTI3ICYgUkZfMjUyOSkKLQkJCTA6IG1lYW5zIERQRFQsIHNldCBCQlAgUjQgYml0IDUgdG8gMQotCQkJMTogbWVhbnMgU1BEVCwgc2V0IEJCUCBSNCBiaXQgNSB0byAwCi0KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJQXNpY0FudGVubmFTZXR0aW5nKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCUFCR0JBTkRfU1RBVEUJQmFuZFN0YXRlKQotewotfQotCi1WT0lEIEFzaWNSZlR1bmluZ0V4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUdpdmVzIENDSyBUWCByYXRlIDIgbW9yZSBkQiBUWCBwb3dlci4KLQkJVGhpcyByb3V0aW5lIHdvcmtzIG9ubHkgaW4gTElOSyBVUCBpbiBJTkZSQVNUUlVDVFVSRSBtb2RlLgotCi0JCWNhbGN1bGF0ZSBkZXNpcmVkIFR4IHBvd2VyIGluIFJGIFIzLlR4MH41LAlzaG91bGQgY29uc2lkZXIgLQotCQkwLiBpZiBjdXJyZW50IHJhZGlvIGlzIGEgbm9pc3kgZW52aXJvbm1lbnQgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpCi0JCTEuIFR4UG93ZXJQZXJjZW50YWdlCi0JCTIuIGF1dG8gY2FsaWJyYXRpb24gYmFzZWQgb24gVFNTSSBmZWVkYmFjawotCQkzLiBleHRyYSAyIGRiIGZvciBDQ0sKLQkJNC4gLTEwIGRiIHVwb24gdmVyeS1zaG9ydCBkaXN0YW5jZSAoQXZnUlNTSSA+PSAtNDBkYikgdG8gQVAKLQotCU5PVEU6IFNpbmNlIHRoaXMgcm91dGluZSByZXF1aXJlcyB0aGUgdmFsdWUgb2YgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpLAotCQlpdCBzaG91bGQgYmUgY2FsbGVkIEFGVEVSIE1sbWVEeW5hbWljVHhSYXRTd2l0Y2hpbmcoKQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY0FkanVzdFR4UG93ZXIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JSU5UCQkJaSwgajsKLQlDSEFSCQlEZWx0YVB3ciA9IDA7Ci0JQk9PTEVBTgkJYkF1dG9UeEFnYyA9IEZBTFNFOwotCVVDSEFSCQlUc3NpUmVmLCAqcFRzc2lNaW51c0JvdW5kYXJ5LCAqcFRzc2lQbHVzQm91bmRhcnksIFR4QWdjU3RlcDsKLQlVQ0hBUgkJQmJwUjEgPSAwLCBCYnBSNDkgPSAwLCBpZHg7Ci0JUENIQVIJCXBUeEFnY0NvbXBlbnNhdGU7Ci0JVUxPTkcJCVR4UHdyWzVdOwotCUNIQVIJCVZhbHVlOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUNIQVIJCVJzc2kgPSAtMTI3OwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2lmZGVmIENBUlJJRVJfU0VOU0VfTkVXX0FMR08KLQl1bnNpZ25lZCBsb25nIGZsYWdzOyAvL0tIIEFkZCB0byBGaXggUENJZSBQb3dlci1TYXZpbmcgYnVnCi0jZW5kaWYgLy8gQ0FSUklFUl9TRU5TRV9ORVdfQUxHTyAvLwotCi0KLSNpZmRlZiBDQVJSSUVSX1NFTlNFX05FV19BTEdPCi0JLy9LSCBBZGQgdG8gRml4IFBDSWUgUG93ZXItU2F2aW5nIGJ1ZzwtLQotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkvL0tIIEFkZCB0byBGaXggUENJZSBQb3dlci1TYXZpbmcgYnVnLS0+Ci0jZW5kaWYgLy8gQ0FSUklFUl9TRU5TRV9ORVdfQUxHTyAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkgfHwKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJKHBBZC0+YlBDSWNsa09mZiA9PSBUUlVFKSB8fAotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpIHx8Ci0JCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi17Ci0KLSNpZmRlZiBDQVJSSUVSX1NFTlNFX05FV19BTEdPCi0JLy9LSCBBZGQgdG8gRml4IFBDSWUgUG93ZXItU2F2aW5nIGJ1ZzwtLQotCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCS8vS0ggYWRkIHRvIGZpeCBQQ0llLVBvd2VyIFNhdmluZyAtLT4KLSNlbmRpZiAvLyBDQVJSSUVSX1NFTlNFX05FV19BTEdPIC8vCi0JCXJldHVybjsKLX0KLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAotCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCwKLQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEsCi0JCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiAxNCkKLQkJewotCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMF07Ci0JCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsxXTsKLQkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzJdOwotCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbM107Ci0JCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFs0XTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbNF07Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLQkJewotCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMF07Ci0JCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsxXTsKLQkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzJdOwotCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbM107Ci0JCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFs0XTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbNF07Ci0JCX0KLQl9Ci0KLQkvLyBUWCBwb3dlciBjb21wZW5zYXRpb24gZm9yIHRlbXBlcmF0dXJlIHZhcmlhdGlvbiBiYXNlZCBvbiBUU1NJLiB0cnkgZXZlcnkgNCBzZWNvbmQKLQlpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSA0ID09IDApCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkKLQkJewotCQkJLyogYmcgY2hhbm5lbCAqLwotCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjRzsKLQkJCVRzc2lSZWYgICAgICAgICAgICA9IHBBZC0+VHNzaVJlZkc7Ci0JCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMF07Ci0JCQlwVHNzaVBsdXNCb3VuZGFyeSAgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1swXTsKLQkJCVR4QWdjU3RlcCAgICAgICAgICA9IHBBZC0+VHhBZ2NTdGVwRzsKLQkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUc7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvKiBhIGNoYW5uZWwgKi8KLQkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0E7Ci0JCQlUc3NpUmVmICAgICAgICAgICAgPSBwQWQtPlRzc2lSZWZBOwotCQkJcFRzc2lNaW51c0JvdW5kYXJ5ID0gJnBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzBdOwotCQkJcFRzc2lQbHVzQm91bmRhcnkgID0gJnBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMF07Ci0JCQlUeEFnY1N0ZXAgICAgICAgICAgPSBwQWQtPlR4QWdjU3RlcEE7Ci0JCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOwotCQl9Ci0KLQkJaWYgKGJBdXRvVHhBZ2MpCi0JCXsKLQkJCS8qIEJicFIxIGlzIHVuc2lnbmVkIGNoYXIgKi8KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNDksICZCYnBSNDkpOwotCi0JCQkvKiAocCkgVHNzaVBsdXNCb3VuZGFyeUdbMF0gPSAwID0gKG0pIFRzc2lNaW51c0JvdW5kYXJ5R1swXSAqLwotCQkJLyogY29tcGVuc2F0ZTogKzQgICAgICszICAgKzIgICArMSAgICAwICAgLTEgICAtMiAgIC0zICAgLTQgKiBzdGVwcyAqLwotCQkJLyogc3RlcCB2YWx1ZSBpcyBkZWZpbmVkIGluIHBBZC0+VHhBZ2NTdGVwRyBmb3IgdHggcG93ZXIgdmFsdWUgKi8KLQotCQkJLyogWzRdKzErWzRdICAgcDQgICAgIHAzICAgcDIgICBwMSAgIG8xICAgbTEgICBtMiAgIG0zICAgbTQgKi8KLQkJCS8qIGV4OiAgICAgICAgIDB4MDAgMHgxNSAweDI1IDB4NDUgMHg4OCAweEEwIDB4QjUgMHhEMCAweEYwCi0JCQkgICBhYm92ZSB2YWx1ZSBhcmUgZXhhbWluZWQgaW4gbWFzcyBmYWN0b3J5IHByb2R1Y3Rpb24gKi8KLQkJCS8qICAgICAgICAgICAgIFs0XSAgICBbM10gIFsyXSAgWzFdICBbMF0gIFsxXSAgWzJdICBbM10gIFs0XSAqLwotCi0JCQkvKiBwbHVzICgrKSBpcyAweDAwIH4gMHg0NSwgbWludXMgKC0pIGlzIDB4YTAgfiAweGYwICovCi0JCQkvKiBpZiB2YWx1ZSBpcyBiZXR3ZWVuIHAxIH4gbzEgb3IgbzEgfiBzMSwgbm8gbmVlZCB0byBhZGp1c3QgdHggcG93ZXIgKi8KLQkJCS8qIGlmIHZhbHVlIGlzIDB4YTUsIHR4IHBvd2VyIHdpbGwgYmUgLT0gVHhBZ2NTdGVwKigyLTEpICovCi0KLQkJCWlmIChCYnBSNDkgPiBwVHNzaU1pbnVzQm91bmRhcnlbMV0pCi0JCQl7Ci0JCQkJLy8gUmVhZGluZyBpcyBsYXJnZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlCi0JCQkJLy8gY2hlY2sgZm9yIGhvdyBsYXJnZSB3ZSBuZWVkIHRvIGRlY3JlYXNlIHRoZSBUeCBwb3dlcgotCQkJCWZvciAoaWR4ID0gMTsgaWR4IDwgNTsgaWR4KyspCi0JCQkJewotCQkJCQlpZiAoQmJwUjQ5IDw9IHBUc3NpTWludXNCb3VuZGFyeVtpZHhdKSAgLy8gRm91bmQgdGhlIHJhbmdlCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy8gVGhlIGluZGV4IGlzIHRoZSBzdGVwIHdlIHNob3VsZCBkZWNyZWFzZSwgaWR4ID0gMCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbXBlbnNhdGUKLS8vCQkJCWlmIChSMyA+IChVTE9ORykgKFR4QWdjU3RlcCAqIChpZHgtMSkpKQotCQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oVHhBZ2NTdGVwICogKGlkeC0xKSk7Ci0vLwkJCQllbHNlCi0vLwkJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAtKChVQ0hBUilSMyk7Ci0KLQkJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9IC0lZFxuIiwKLQkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIGlkeC0xKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChCYnBSNDkgPCBwVHNzaVBsdXNCb3VuZGFyeVsxXSkKLQkJCXsKLQkJCQkvLyBSZWFkaW5nIGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlCi0JCQkJLy8gY2hlY2sgZm9yIGhvdyBsYXJnZSB3ZSBuZWVkIHRvIGluY3JlYXNlIHRoZSBUeCBwb3dlcgotCQkJCWZvciAoaWR4ID0gMTsgaWR4IDwgNTsgaWR4KyspCi0JCQkJewotCQkJCQlpZiAoQmJwUjQ5ID49IHBUc3NpUGx1c0JvdW5kYXJ5W2lkeF0pICAgLy8gRm91bmQgdGhlIHJhbmdlCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy8gVGhlIGluZGV4IGlzIHRoZSBzdGVwIHdlIHNob3VsZCBpbmNyZWFzZSwgaWR4ID0gMCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbXBlbnNhdGUKLQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IFR4QWdjU3RlcCAqIChpZHgtMSk7Ci0JCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIrKyBUeCBQb3dlciwgQkJQIFIxPSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSArJWRcbiIsCi0JCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCBpZHgtMSkpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gMDsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgICBUeCBQb3dlciwgQkJQIFI0OT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAotCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgMCkpOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQotCQl7Ci0JCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOwotCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0E7Ci0JCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOwotCQl9Ci0KLQkJaWYgKGJBdXRvVHhBZ2MpCi0JCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOwotCX0KLQotCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJicFIxKTsKLQlCYnBSMSAmPSAweEZDOwotCi0jaWZkZWYgU0lOR0xFX1NLVQotCS8vIEhhbmRsZSByZWd1bGF0b3J5IG1heCB0eCBwb3dlciBjb25zdHJhaW4KLQlkbwotCXsKLQkJVUNIQVIgICAgVHhQd3JJbkVFUFJPTSA9IDB4RkYsIENvdW50cnlUeFB3ciA9IDB4RkYsIGNyaXRlcmlvbjsKLQkJVUNIQVIgICAgQWRqdXN0TWF4VHhQd3JbNDBdOwotCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpIC8vIDVHIGJhbmQKLQkJCVR4UHdySW5FRVBST00gPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlZmluZU1heFR4UHdyICYgMHhGRjAwKSA+PiA4KTsKLQkJZWxzZSAvLyAyLjRHIGJhbmQKLQkJCVR4UHdySW5FRVBST00gPSAocEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IgJiAweDAwRkYpOwotCQlDb3VudHJ5VHhQd3IgPSBHZXRDdW50cnlNYXhUeFB3cihwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCi0JCS8vIGVycm9yIGhhbmRsaW5nLCByYW5nZSBjaGVjawotCQlpZiAoKFR4UHdySW5FRVBST00gPiAweDUwKSB8fCAoQ291bnRyeVR4UHdyID4gMHg1MCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQXNpY0FkanVzdFR4UG93ZXIgLSBJbnZhbGlkIG1heCB0eCBwb3dlciAoPTB4JTAyeCksIENvdW50cnlUeFB3cj0lZFxuIiwgVHhQd3JJbkVFUFJPTSwgQ291bnRyeVR4UHdyKSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWNyaXRlcmlvbiA9ICooKFBVQ0hBUilUeFB3ciArIDIpICYgMHhGOyAgICAgICAgLy8gRkFFIHVzZSBPRkRNIDZNIGFzIGNyaXRlcmlvbgotCi0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChjcml0ZXJpb249JWQsIFR4UHdySW5FRVBST009JWQsIENvdW50cnlUeFB3cj0lZClcbiIsIGNyaXRlcmlvbiwgVHhQd3JJbkVFUFJPTSwgQ291bnRyeVR4UHdyKSk7Ci0KLQkJLy8gQWRqdXN0IG1heCB0eCBwb3dlciBhY2NvcmRpbmcgdG8gdGhlIHJlbGF0aW9uc2hpcCBvZiB0eCBwb3dlciBpbiBFMlBST00KLQkJZm9yIChpPTA7IGk8NTsgaSsrKQotCQl7Ci0JCQkvLyBDQ0sgd2lsbCBoYXZlIDRkQm0gbGFyZ2VyIHRoYW4gT0ZETQotCQkJLy8gVGhlcmVmb3JlLCB3ZSBzaG91bGQgc2VwYXJhdGUgdG8gcGFyc2UgdGhlIHR4IHBvd2VyIGZpZWxkCi0JCQlpZiAoaSA9PSAwKQotCQkJewotCQkJCWZvciAoaj0wOyBqPDg7IGorKykKLQkJCQl7Ci0JCQkJCVZhbHVlID0gKENIQVIpKChUeFB3cltpXSA+PiBqKjQpICYgMHgwRik7Ci0KLQkJCQkJaWYgKGogPCA0KQotCQkJCQl7Ci0JCQkJCQkvLyBDQ0sgd2lsbCBoYXZlIDRkQm0gbGFyZ2VyIHRoYW4gT0ZETQotCQkJCQkJQWRqdXN0TWF4VHhQd3JbaSo4K2pdID0gVHhQd3JJbkVFUFJPTSArIChWYWx1ZSAtIGNyaXRlcmlvbikgKyA0OwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJQWRqdXN0TWF4VHhQd3JbaSo4K2pdID0gVHhQd3JJbkVFUFJPTSArIChWYWx1ZSAtIGNyaXRlcmlvbik7Ci0JCQkJCX0KLQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkanVzdFR4UG93ZXIgKGkvaj0lZC8lZCwgVmFsdWU9JWQsICVkKVxuIiwgaSwgaiwgVmFsdWUsIEFkanVzdE1heFR4UHdyW2kqOCtqXSkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlmb3IgKGo9MDsgajw4OyBqKyspCi0JCQkJewotCQkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOwotCi0JCQkJCUFkanVzdE1heFR4UHdyW2kqOCtqXSA9IFR4UHdySW5FRVBST00gKyAoVmFsdWUgLSBjcml0ZXJpb24pOwotCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRqdXN0VHhQb3dlciAoaS9qPSVkLyVkLCBWYWx1ZT0lZCwgJWQpXG4iLCBpLCBqLCBWYWx1ZSwgQWRqdXN0TWF4VHhQd3JbaSo4K2pdKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gQWRqdXN0IHR4IHBvd2VyIGFjY29yZGluZyB0byB0aGUgcmVsYXRpb25zaGlwCi0JCWZvciAoaT0wOyBpPDU7IGkrKykKLQkJewotCQkJaWYgKFR4UHdyW2ldICE9IDB4ZmZmZmZmZmYpCi0JCQl7Ci0JCQkJZm9yIChqPTA7IGo8ODsgaisrKQotCQkJCXsKLQkJCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsKLQotCQkJCQkvLyBUaGUgc3lzdGVtIHR4IHBvd2VyIGlzIGxhcmdlciB0aGFuIHRoZSByZWd1bGF0b3J5LCB0aGUgcG93ZXIgc2hvdWxkIGJlIHJlc3RyYWluCi0JCQkJCWlmIChBZGp1c3RNYXhUeFB3cltpKjgral0gPiBDb3VudHJ5VHhQd3IpCi0JCQkJCXsKLQkJCQkJCS8vIGRlY3JlYXNlIHRvIHplcm8gYW5kIGRvbid0IG5lZWQgdG8gdGFrZSBjYXJlIEJCUFIxCi0JCQkJCQlpZiAoKFZhbHVlIC0gKEFkanVzdE1heFR4UHdyW2kqOCtqXSAtIENvdW50cnlUeFB3cikpID4gMCkKLQkJCQkJCQlWYWx1ZSAtPSAoQWRqdXN0TWF4VHhQd3JbaSo4K2pdIC0gQ291bnRyeVR4UHdyKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlWYWx1ZSA9IDA7Ci0KLQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChpL2o9JWQvJWQsIFZhbHVlPSVkLCAlZClcbiIsIGksIGosIFZhbHVlLCBBZGp1c3RNYXhUeFB3cltpKjgral0pKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRqdXN0VHhQb3dlciAoaS9qPSVkLyVkLCBWYWx1ZT0lZCwgJWQsIG5vIGNoYW5nZSlcbiIsIGksIGosIFZhbHVlLCBBZGp1c3RNYXhUeFB3cltpKjgral0pKTsKLQotCQkJCQkJVHhQd3JbaV0gPSAoVHhQd3JbaV0gJiB+KDB4MDAwMDAwMEYgPDwgaio0KSkgfCAoVmFsdWUgPDwgaio0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IHdoaWxlIChGQUxTRSk7Ci0jZW5kaWYgLy8gU0lOR0xFX1NLVSAvLwotCi0JLyogY2FsY3VsYXRlIGRlbHRhIHBvd2VyIGJhc2VkIG9uIHRoZSBwZXJjZW50YWdlIHNwZWNpZmllZCBmcm9tIFVJICovCi0JLy8gRTJQUk9NIHNldHRpbmcgaXMgY2FsaWJyYXRlZCBmb3IgbWF4aW11bSBUWCBwb3dlciAoaS5lLiAxMDAlKQotCS8vIFdlIGxvd2VyIFRYIHBvd2VyIGhlcmUgYWNjb3JkaW5nIHRvIHRoZSBwZXJjZW50YWdlIHNwZWNpZmllZCBmcm9tIFVJCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID09IDB4ZmZmZmZmZmYpICAgICAgIC8vIEFVVE8gVFggUE9XRVIgY29udHJvbAotCXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJLy8gdG8gcGF0Y2ggaGlnaCBwb3dlciBpc3N1ZSB3aXRoIHNvbWUgQVBzLCBsaWtlIEJlbGtpbiBOMS4KLQkJCWlmIChSc3NpID4gLTM1KQotCQkJewotCQkJCUJicFIxIHw9IDB4MDI7CQkvLyBEZWx0YVB3ciAtPSAxMjsKLQkJCX0KLQkJCWVsc2UgaWYgKFJzc2kgPiAtNDApCi0JCQl7Ci0JCQkJQmJwUjEgfD0gMHgwMTsJCS8vIERlbHRhUHdyIC09IDY7Ci0JCQl9Ci0JCQllbHNlCi0JCTsKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkwKSAgLy8gOTEgfiAxMDAlICYgQVVUTywgdHJlYXQgYXMgMTAwJSBpbiB0ZXJtcyBvZiBtVwotCQk7Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA2MCkgIC8vIDYxIH4gOTAlLCB0cmVhdCBhcyA3NSUgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDE7Ci0JewotCQlEZWx0YVB3ciAtPSAxOwotCX0KLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDMwKSAgLy8gMzEgfiA2MCUsIHRyZWF0IGFzIDUwJSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gMzsKLQl7Ci0JCURlbHRhUHdyIC09IDM7Ci0JfQotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMTUpICAvLyAxNiB+IDMwJSwgdHJlYXQgYXMgMjUlIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSA2OwotCXsKLQkJQmJwUjEgfD0gMHgwMTsKLQl9Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5KSAgIC8vIDEwIH4gMTUlLCB0cmVhdCBhcyAxMi41JSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gOTsKLQl7Ci0JCUJicFIxIHw9IDB4MDE7Ci0JCURlbHRhUHdyIC09IDM7Ci0JfQotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMCB+IDkgJSwgdHJlYXQgYXMgTUlOKH4zJSkgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDEyOwotCXsKLQkJQmJwUjEgfD0gMHgwMjsKLQl9Ci0KLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBSMSk7Ci0KLQkvKiByZXNldCBkaWZmZXJlbnQgbmV3IHR4IHBvd2VyIGZvciBkaWZmZXJlbnQgVFggcmF0ZSAqLwotCWZvcihpPTA7IGk8NTsgaSsrKQotCXsKLQkJaWYgKFR4UHdyW2ldICE9IDB4ZmZmZmZmZmYpCi0JCXsKLQkJCWZvciAoaj0wOyBqPDg7IGorKykKLQkJCXsKLQkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOyAvKiAwIH4gMTUgKi8KLQotCQkJCWlmICgoVmFsdWUgKyBEZWx0YVB3cikgPCAwKQotCQkJCXsKLQkJCQkJVmFsdWUgPSAwOyAvKiBtaW4gKi8KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKFZhbHVlICsgRGVsdGFQd3IpID4gMHhGKQotCQkJCXsKLQkJCQkJVmFsdWUgPSAweEY7IC8qIG1heCAqLwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlWYWx1ZSArPSBEZWx0YVB3cjsgLyogdGVtcGVyYXR1cmUgY29tcGVuc2F0aW9uICovCi0JCQkJfQotCi0JCQkJLyogZmlsbCBuZXcgdmFsdWUgdG8gQ1NSIG9mZnNldCAqLwotCQkJCVR4UHdyW2ldID0gKFR4UHdyW2ldICYgfigweDAwMDAwMDBGIDw8IGoqNCkpIHwgKFZhbHVlIDw8IGoqNCk7Ci0JCQl9Ci0KLQkJCS8qIHdyaXRlIHR4IHBvd2VyIHZhbHVlIHRvIENTUiAqLwotCQkJLyogVFhfUFdSX0NGR18wICg4IHR4IHJhdGUpIGZvcglUWCBwb3dlciBmb3IgT0ZETSAxMk0vMThNCi0JCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBPRkRNIDZNLzlNCi0JCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBDQ0s1LjVNLzExTQotCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLMU0vMk0gKi8KLQkJCS8qIFRYX1BXUl9DRkdfMSB+IFRYX1BXUl9DRkdfNCAqLwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBUeFB3cltpXSk7Ci0JCX0KLQl9Ci0KLSNpZmRlZiBDQVJSSUVSX1NFTlNFX05FV19BTEdPCi0JLy9LSCBBZGQgdG8gRml4IFBDSWUgUG93ZXItU2F2aW5nIGJ1ZzwtLQotCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCS8vS0ggYWRkIHRvIGZpeCBQQ0llLVBvd2VyIFNhdmluZyAtLT4KLSNlbmRpZiAvLyBDQVJSSUVSX1NFTlNFX05FV19BTEdPIC8vCi0KLX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1WT0lEIEFzaWNSZXNldEJCUEFnZW50KAotSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JQkJQX0NTUl9DRkdfU1RSVUMJQmJwQ3NyOwotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJlc2V0IEJCUCBBZ2VudCBidXN5IGJpdC4hISBcbiIpKTsKLQkvLyBTdGlsbCBuZWVkIHRvIGZpbmQgd2h5IEJCUCBhZ2VudCBrZWVwcyBidXN5LCBidXQgaW4gZmFjdCwgaGFyZHdhcmUgc3RpbGwgZnVuY3Rpb24gb2suIE5vdyBjbGVhciBidXN5IGZpcnN0LgotCVJUTVBfSU9fUkVBRDMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsKLQlCYnBDc3IuZmllbGQuQnVzeSA9IDA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOwotfQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlwdXQgUEhZIHRvIHNsZWVwIGhlcmUsIGFuZCBzZXQgbmV4dCB3YWtldXAgdGltZXIuIFBIWSBkb2Vzbid0IG5vdCB3YWtldXAKLQkJYXV0b21hdGljYWxseS4gSW5zdGVhZCwgTUNVIHdpbGwgaXNzdWUgYSBUd2FrZVVwSW50ZXJydXB0IHRvIGhvc3QgYWZ0ZXIKLQkJdGhlIHdha2V1cCB0aW1lciB0aW1lb3V0LiBEcml2ZXIgaGFzIHRvIGlzc3VlIGEgc2VwYXJhdGUgY29tbWFuZCB0byB3YWtlCi0JCVBIWSB1cC4KLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCkKLXsKLQlSVE1QX1NUQV9TTEVFUF9USEVOX0FVVE9fV0FLRVVQKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJQXNpY0ZvcmNlV2FrZXVwKCkgaXMgdXNlZCB3aGVuZXZlciBtYW51YWwgd2FrZXVwIGlzIHJlcXVpcmVkCi0JCUFzaWNGb3JjZVNsZWVwKCkgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIG5vdCBpbiBJTkZSQSBCU1MuIFdoZW4KLQkJaW4gSU5GUkEgQlNTLCB3ZSBzaG91bGQgdXNlIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKCkgaW5zdGVhZC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNGb3JjZVNsZWVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJQXNpY0ZvcmNlV2FrZXVwKCkgaXMgdXNlZCB3aGVuZXZlciBUd2FrZXVwIHRpbWVyIChzZXQgdmlhIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKQotCQlleHBpcmVkLgotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNGb3JjZVdha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOICAgIGJGcm9tVHgpCi17Ci0gICAgREJHUFJJTlQoUlRfREVCVUdfSU5GTywgKCItLT4gQXNpY0ZvcmNlV2FrZXVwIFxuIikpOwotICAgIFJUTVBfU1RBX0ZPUkNFX1dBS0VVUChwQWQsIGJGcm9tVHgpOwotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJU2V0IE15IEJTU0lECi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY1NldEJzc2lkKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwQnNzaWQpCi17Ci0JVUxPTkcJCSAgQWRkcjQ7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT09PT09PT09PT0+IEFzaWNTZXRCc3NpZCAleDoleDoleDoleDoleDoleFxuIiwKLQkJcEJzc2lkWzBdLHBCc3NpZFsxXSxwQnNzaWRbMl0scEJzc2lkWzNdLCBwQnNzaWRbNF0scEJzc2lkWzVdKSk7Ci0KLQlBZGRyNCA9IChVTE9ORykocEJzc2lkWzBdKQkJIHwKLQkJCShVTE9ORykocEJzc2lkWzFdIDw8IDgpICB8Ci0JCQkoVUxPTkcpKHBCc3NpZFsyXSA8PCAxNikgfAotCQkJKFVMT05HKShwQnNzaWRbM10gPDwgMjQpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19CU1NJRF9EVzAsIEFkZHI0KTsKLQotCUFkZHI0ID0gMDsKLQkvLyBhbHdheXMgb25lIEJTU0lEIGluIFNUQSBtb2RlCi0JQWRkcjQgPSAoVUxPTkcpKHBCc3NpZFs0XSkgfCAoVUxPTkcpKHBCc3NpZFs1XSA8PCA4KTsKLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19CU1NJRF9EVzEsIEFkZHI0KTsKLX0KLQotVk9JRCBBc2ljU2V0TWNhc3RXQygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdOwotCVVTSE9SVAkJb2Zmc2V0OwotCi0JcEVudHJ5LT5Tc3QgICAgICAgID0gU1NUX0FTU09DOwotCXBFbnRyeS0+QWlkICAgICAgICA9IE1DQVNUX1dDSUQ7CS8vIFNvZnRhcCBzdXBwb3J0cyAxIEJTU0lEIGFuZCB1c2UgV0NJRD0wIGFzIG11bHRpY2FzdCBXY2lkIGluZGV4Ci0JcEVudHJ5LT5Qc01vZGUgICAgID0gUFdSX0FDVElWRTsKLQlwRW50cnktPkN1cnJUeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKLQlvZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgQlNTME1jYXN0X1dDSUQgKiBIV19XQ0lEX0VOVFJZX1NJWkU7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljRGVsV2NpZFRhYigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUglXY2lkKQotewotCVVMT05HCQkgIEFkZHIwID0gMHgwLCBBZGRyMSA9IDB4MDsKLQlVTE9ORwkJb2Zmc2V0OwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0RlbFdjaWRUYWI9PT5XY2lkID0gMHgleFxuIixXY2lkKSk7Ci0Jb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIFdjaWQgKiBIV19XQ0lEX0VOVFJZX1NJWkU7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyMCk7Ci0Jb2Zmc2V0ICs9IDQ7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyMSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljRW5hYmxlUkRHKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVRYX0xJTktfQ0ZHX1NUUlVDCVR4TGlua0NmZzsKLQlVSU5UMzIJCQkJRGF0YSA9IDA7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0xJTktfQ0ZHLCAmVHhMaW5rQ2ZnLndvcmQpOwotCVR4TGlua0NmZy5maWVsZC5UeFJER0VuID0gMTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9MSU5LX0NGRywgVHhMaW5rQ2ZnLndvcmQpOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKLQlEYXRhICAmPSAweEZGRkZGRjAwOwotCURhdGEgIHw9IDB4ODA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKLQotCS8vT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNEaXNhYmxlUkRHKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVRYX0xJTktfQ0ZHX1NUUlVDCVR4TGlua0NmZzsKLQlVSU5UMzIJCQkJRGF0YSA9IDA7Ci0KLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTElOS19DRkcsICZUeExpbmtDZmcud29yZCk7Ci0JVHhMaW5rQ2ZnLmZpZWxkLlR4UkRHRW4gPSAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOwotCi0JRGF0YSAgJj0gMHhGRkZGRkYwMDsKLQkvL0RhdGEgIHw9IDB4MjA7Ci0jaWZuZGVmIFdJRklfVEVTVAotCS8vaWYgKCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCApCi0JLy8JRGF0YSB8PSAweDYwOyAvLyBmb3IgcGVyZm9ybWFuY2UgaXNzdWUgbm90IHNldCB0aGUgVFhPUCB0byAwCi0jZW5kaWYKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0RZTkFNSUNfQkVfVFhPUF9BQ1RJVkUpCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCSYmIChwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk1JTU9QU0R5bmFtaWMgPT0gRkFMU0UpCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JKQotCXsKLQkJLy8gRm9yIENXQyB0ZXN0LCBjaGFuZ2UgdHhvcCBmcm9tIDB4MzAgdG8gMHgyMCBpbiBUeEJ1cnN0IG1vZGUKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQotCQlEYXRhIHw9IDB4MjA7Ci0JfQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNEaXNhYmxlU3luYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkRpc2FibGUgVFNGIHN5bmNocm9uaXphdGlvblxuIikpOwotCi0JLy8gMjAwMy0xMi0yMCBkaXNhYmxlIFRTRiBhbmQgVEJUVCB3aGlsZSBOSUMgaW4gcG93ZXItc2F2aW5nIGhhdmUgc2lkZSBlZmZlY3QKLQkvLwkJCSAgdGhhdCBOSUMgd2lsbCBuZXZlciB3YWtlcyB1cCBiZWNhdXNlIFRTRiBzdG9wcyBhbmQgbm8gbW9yZQotCS8vCQkJICBUQlRUIGludGVycnVwdHMKLQlwQWQtPlRidHRUaWNrQ291bnQgPSAwOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOwotCWNzci5maWVsZC5iQmVhY29uR2VuID0gMDsKLQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAwOwotCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDA7Ci0JY3NyLmZpZWxkLmJUc2ZUaWNraW5nID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY0VuYWJsZUJzc1N5bmMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5Bc2ljRW5hYmxlQnNzU3luYyhJTkZSQSBtb2RlKVxuIikpOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7Ci0vLwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIDB4MDAwMDAwMDApOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCi0JCWNzci5maWVsZC5iVHNmVGlja2luZyA9IDE7Ci0JCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDE7IC8vIHN5bmMgVFNGIGluIElORlJBU1RSVUNUVVJFIG1vZGUKLQkJY3NyLmZpZWxkLmJCZWFjb25HZW4gID0gMDsgLy8gZG8gTk9UIGdlbmVyYXRlIEJFQUNPTgotCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAxOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCU5vdGU6Ci0JCUJFQUNPTiBmcmFtZSBpbiBzaGFyZWQgbWVtb3J5IHNob3VsZCBiZSBidWlsdCBvayBiZWZvcmUgdGhpcyByb3V0aW5lCi0JCWNhbiBiZSBjYWxsZWQuIE90aGVyd2lzZSwgYSBnYXJiYWdlIGZyYW1lIG1heWJlIHRyYW5zbWl0dGVkIG91dCBldmVyeQotCQlCZWFjb24gcGVyaW9kLgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNFbmFibGVJYnNzU3luYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOTsKLQlQVUNIQVIJCQlwdHI7Ci0JVUlOVCBpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkFzaWNFbmFibGVJYnNzU3luYyhBREhPQyBtb2RlLiBNUERVdG90YWxCeXRlQ291bnQgPSAlZClcbiIsIHBBZC0+QmVhY29uVHhXSS5NUERVdG90YWxCeXRlQ291bnQpKTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyOS53b3JkKTsKLQljc3I5LmZpZWxkLmJCZWFjb25HZW4gPSAwOwotCWNzcjkuZmllbGQuYlRCVFRFbmFibGUgPSAwOwotCWNzcjkuZmllbGQuYlRzZlRpY2tpbmcgPSAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyOS53b3JkKTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCS8vIG1vdmUgQkVBQ09OIFRYRCBhbmQgZnJhbWUgY29udGVudCB0byBvbi1jaGlwIG1lbW9yeQotCXB0ciA9IChQVUNIQVIpJnBBZC0+QmVhY29uVHhXSTsKLQlmb3IgKGk9MDsgaTxUWFdJX1NJWkU7IGkrPTQpICAvLyAxNi1ieXRlIFRYV0kgZmllbGQKLQl7Ci0JCVVJTlQzMiBsb25ncHRyID0gICpwdHIgKyAoKihwdHIrMSk8PDgpICsgKCoocHRyKzIpPDwxNikgKyAoKihwdHIrMyk8PDI0KTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgaSwgbG9uZ3B0cik7Ci0JCXB0ciArPSA0OwotCX0KLQotCS8vIHN0YXJ0IHJpZ2h0IGFmdGVyIHRoZSAxNi1ieXRlIFRYV0kgZmllbGQKLQlwdHIgPSBwQWQtPkJlYWNvbkJ1ZjsKLQlmb3IgKGk9MDsgaTwgcEFkLT5CZWFjb25UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudDsgaSs9NCkKLQl7Ci0JCVVJTlQzMiBsb25ncHRyID0gICpwdHIgKyAoKihwdHIrMSk8PDgpICsgKCoocHRyKzIpPDwxNikgKyAoKihwdHIrMyk8PDI0KTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgVFhXSV9TSVpFICsgaSwgbG9uZ3B0cik7Ci0JCXB0ciArPTQ7Ci0JfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0KLQkvLwotCS8vIEZvciBXaS1GaSBmYWlseSBnZW5lcmF0ZWQgYmVhY29ucyBiZXR3ZWVuIHBhcnRpY2lwYXRpbmcgc3RhdGlvbnMuCi0JLy8gU2V0IFRCVFQgcGhhc2UgYWRhcHRpdmUgYWRqdXN0bWVudCBzdGVwIHRvIDh1cyAoZGVmYXVsdCAxNnVzKQotCS8vIGRvbid0IGNoYW5nZSBzZXR0aW5ncyAyMDA2LTUtIGJ5IEplcnJ5Ci0JLy9SVE1QX0lPX1dSSVRFMzIocEFkLCBUQlRUX1NZTkNfQ0ZHLCAweDAwMDAxMDEwKTsKLQotCS8vIHN0YXJ0IHNlbmRpbmcgQkVBQ09OCi0JY3NyOS5maWVsZC5CZWFjb25JbnRlcnZhbCA9IHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCA0OyAvLyBBU0lDIHJlZ2lzdGVyIGluIHVuaXRzIG9mIDEvMTYgVFUKLQljc3I5LmZpZWxkLmJUc2ZUaWNraW5nID0gMTsKLQljc3I5LmZpZWxkLlRzZlN5bmNNb2RlID0gMjsgLy8gc3luYyBUU0YgaW4gSUJTUyBtb2RlCi0JY3NyOS5maWVsZC5iVEJUVEVuYWJsZSA9IDE7Ci0JY3NyOS5maWVsZC5iQmVhY29uR2VuID0gMTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzcjkud29yZCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNTZXRFZGNhUGFybSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQRURDQV9QQVJNCSBwRWRjYVBhcm0pCi17Ci0JRURDQV9BQ19DRkdfU1RSVUMgICBBYzBDZmcsIEFjMUNmZywgQWMyQ2ZnLCBBYzNDZmc7Ci0JQUNfVFhPUF9DU1IwX1NUUlVDIGNzcjA7Ci0JQUNfVFhPUF9DU1IxX1NUUlVDIGNzcjE7Ci0JQUlGU05fQ1NSX1NUUlVDICAgIEFpZnNuQ3NyOwotCUNXTUlOX0NTUl9TVFJVQyAgICBDd21pbkNzcjsKLQlDV01BWF9DU1JfU1RSVUMgICAgQ3dtYXhDc3I7Ci0JaW50IGk7Ci0KLQlBYzBDZmcud29yZCA9IDA7Ci0JQWMxQ2ZnLndvcmQgPSAwOwotCUFjMkNmZy53b3JkID0gMDsKLQlBYzNDZmcud29yZCA9IDA7Ci0JaWYgKChwRWRjYVBhcm0gPT0gTlVMTCkgfHwgKHBFZGNhUGFybS0+YlZhbGlkID09IEZBTFNFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY1NldEVkY2FQYXJtXG4iKSk7Ci0JCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpOwotCQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCQl7Ci0JCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJIHx8IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0FwQ2xpKQotCQkJCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtpXSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOwotCQl9Ci0KLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkvLyAgICAgIE1BQyBSZWdpc3RlciBoYXMgYSBjb3B5IC4KLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8jaWZuZGVmIFdJRklfVEVTVAotCQlpZiggcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgKQotCQl7Ci0JCQkvLyBGb3IgQ1dDIHRlc3QsIGNoYW5nZSB0eG9wIGZyb20gMHgzMCB0byAweDIwIGluIFR4QnVyc3QgbW9kZQotCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IDB4MjA7IC8vIFN1Z2dlc3QgYnkgSm9obiBmb3IgVHhCdXJzdCBpbiBIVCBNb2RlCi0JCX0KLQkJZWxzZQotCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IDA7CS8vIFFJRF9BQ19CRQotLy8jZWxzZQotLy8JCUFjMENmZy5maWVsZC5BY1R4b3AgPSAwOwkvLyBRSURfQUNfQkUKLS8vI2VuZGlmCi0JCUFjMENmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOwotCQlBYzBDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKLQkJQWMwQ2ZnLmZpZWxkLkFpZnNuID0gMjsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBBYzBDZmcud29yZCk7Ci0KLQkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9IDA7CS8vIFFJRF9BQ19CSwotCQlBYzFDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKLQkJQWMxQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7Ci0JCUFjMUNmZy5maWVsZC5BaWZzbiA9IDI7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMxX0NGRywgQWMxQ2ZnLndvcmQpOwotCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCi0JCXsKLQkJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSAxOTI7CS8vIEFDX1ZJOiAxOTIqMzJ1cyB+PSA2bXMKLQkJCUFjM0NmZy5maWVsZC5BY1R4b3AgPSA5NjsJLy8gQUNfVk86IDk2KjMydXMgIH49IDNtcwotCQl9Ci0JCWVsc2UKLQkJewotCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IDk2OwkvLyBBQ19WSTogOTYqMzJ1cyB+PSAzbXMKLQkJCUFjM0NmZy5maWVsZC5BY1R4b3AgPSA0ODsJLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKLQkJfQotCQlBYzJDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKLQkJQWMyQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7Ci0JCUFjMkNmZy5maWVsZC5BaWZzbiA9IDI7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMyX0NGRywgQWMyQ2ZnLndvcmQpOwotCQlBYzNDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKLQkJQWMzQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7Ci0JCUFjM0NmZy5maWVsZC5BaWZzbiA9IDI7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMzX0NGRywgQWMzQ2ZnLndvcmQpOwotCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJLy8gICAgICBETUEgUmVnaXN0ZXIgaGFzIGEgY29weSB0b28uCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJY3NyMC5maWVsZC5BYzBUeG9wID0gMDsJCS8vIFFJRF9BQ19CRQotCQljc3IwLmZpZWxkLkFjMVR4b3AgPSAwOwkJLy8gUUlEX0FDX0JLCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMF9DRkcsIGNzcjAud29yZCk7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCi0JCXsKLQkJCWNzcjEuZmllbGQuQWMyVHhvcCA9IDE5MjsJCS8vIEFDX1ZJOiAxOTIqMzJ1cyB+PSA2bXMKLQkJCWNzcjEuZmllbGQuQWMzVHhvcCA9IDk2OwkJLy8gQUNfVk86IDk2KjMydXMgIH49IDNtcwotCQl9Ci0JCWVsc2UKLQkJewotCQkJY3NyMS5maWVsZC5BYzJUeG9wID0gOTY7CQkvLyBBQ19WSTogOTYqMzJ1cyB+PSAzbXMKLQkJCWNzcjEuZmllbGQuQWMzVHhvcCA9IDQ4OwkJLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKLQkJfQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IxLndvcmQpOwotCi0JCUN3bWluQ3NyLndvcmQgPSAwOwotCQlDd21pbkNzci5maWVsZC5Dd21pbjAgPSBDV19NSU5fSU5fQklUUzsKLQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4xID0gQ1dfTUlOX0lOX0JJVFM7Ci0JCUN3bWluQ3NyLmZpZWxkLkN3bWluMiA9IENXX01JTl9JTl9CSVRTOwotCQlDd21pbkNzci5maWVsZC5Dd21pbjMgPSBDV19NSU5fSU5fQklUUzsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0NXTUlOX0NGRywgQ3dtaW5Dc3Iud29yZCk7Ci0KLQkJQ3dtYXhDc3Iud29yZCA9IDA7Ci0JCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MCA9IENXX01BWF9JTl9CSVRTOwotCQlDd21heENzci5maWVsZC5Dd21heDEgPSBDV19NQVhfSU5fQklUUzsKLQkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgyID0gQ1dfTUFYX0lOX0JJVFM7Ci0JCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MyA9IENXX01BWF9JTl9CSVRTOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNQVhfQ0ZHLCBDd21heENzci53b3JkKTsKLQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQUlGU05fQ0ZHLCAweDAwMDAyMjIyKTsKLQotCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOwotCX0KLQllbHNlCi0JewotCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCk7Ci0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJLy8gICAgICBNQUMgUmVnaXN0ZXIgaGFzIGEgY29weS4KLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkvLwotCQkvLyBNb2RpZnkgQ3dtaW4vQ3dtYXgvVHhvcCBvbiBxdWV1ZVtRSURfQUNfVkldLCBSZWNvbW1lbmQgYnkgSmVycnkgMjAwNS8wNy8yNwotCQkvLyBUbyBkZWdyYWRlIG91ciBWSURPIFF1ZXVlJ3MgdGhyb3VnaHB1dCBmb3IgV2lGaSBXTU0gUzNUMDcgSXNzdWUuCi0JCS8vCi0JCS8vcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXSAqIDcgLyAxMDsgLy8gcnQyODYwYyBuZWVkIHRoaXMKLQotCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdOwotCQlBYzBDZmcuZmllbGQuQ3dtaW49IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JFXTsKLQkJQWMwQ2ZnLmZpZWxkLkN3bWF4ID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQkVdOwotCQlBYzBDZmcuZmllbGQuQWlmc24gPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CRV07IC8vKzE7Ci0KLQkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9ICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JLXTsKLQkJQWMxQ2ZnLmZpZWxkLkN3bWluID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQktdOyAvLysyOwotCQlBYzFDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS107Ci0JCUFjMUNmZy5maWVsZC5BaWZzbiA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsgLy8rMTsKLQotCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gKHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldICogNikgLyAxMDsKLQkJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQotCQl7Ci0JCQlBYzJDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WSV0gKyAxOwotCQkJQWMyQ2ZnLmZpZWxkLkN3bWF4ID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVkldICsgMTsKLQkJfQotCQllbHNlCi0JCXsKLQkJQWMyQ2ZnLmZpZWxkLkN3bWluID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldOwotCQlBYzJDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WSV07Ci0JCX0KLQkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldICsgMTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIElORl9BTUFaT05fU0UKLSNlbmRpZiAvLyBJTkZfQU1BWk9OX1NFIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJLy8gVHVuaW5nIGZvciBXaS1GaSBXTU0gUzA2Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpRmlUZXN0ICYmCi0JCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKQotCQkJCUFjMkNmZy5maWVsZC5BaWZzbiAtPSAxOwotCi0JCQkvLyBUdW5pbmcgZm9yIFRHbiBXaS1GaSA1LjIuMzIKLQkJCS8vIFNUQSBUZXN0QmVkIGNoYW5nZXMgaW4gdGhpcyBpdGVtOiBjb25leGFudCBsZWdhY3kgc3RhID09PiBicm9hZGNvbSAxMW4gc3RhCi0JCQlpZiAoU1RBX1RHTl9XSUZJX09OKHBBZCkgJiYKLQkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCi0JCQl7Ci0JCQkJQWMwQ2ZnLmZpZWxkLkFpZnNuID0gMzsKLQkJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gNTsKLQkJCX0KLQotI2lmZGVmIFJUMzB4eAotCQkJaWYgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwIHx8IHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18yMDIwKQotCQkJewotCQkJCS8vIFR1bmluZyBmb3IgV2lGaSBXTU0gUzMtVDA3OiBjb25uZXhhbnQgbGVnYWN5IHN0YSA9PT4gYnJvYWRjb20gMTFuIHN0YS4KLQkJCQlBYzJDZmcuZmllbGQuQWlmc24gPSA1OwotCQkJfQotI2VuZGlmIC8vIFJUMzB4eCAvLwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVk9dOwotCQlBYzNDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WT107Ci0JCUFjM0NmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZPXTsKLQkJQWMzQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dOwotCi0vLyNpZmRlZiBXSUZJX1RFU1QKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCkKLQkJewotCQkJaWYgKEFjM0NmZy5maWVsZC5BY1R4b3AgPT0gMTAyKQotCQkJewotCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdID8gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV0gOiAxMDsKLQkJCQlBYzBDZmcuZmllbGQuQWlmc24gID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdLTE7IC8qIEFJRlNOIG11c3QgPj0gMSAqLwotCQkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdOwotCQkJCUFjMUNmZy5maWVsZC5BaWZzbiAgPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS107Ci0JCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV07Ci0JCQl9IC8qIEVuZCBvZiBpZiAqLwotCQl9Ci0vLyNlbmRpZiAvLyBXSUZJX1RFU1QgLy8KLQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIEFjMENmZy53b3JkKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzFfQ0ZHLCBBYzFDZmcud29yZCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMyX0NGRywgQWMyQ2ZnLndvcmQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDM19DRkcsIEFjM0NmZy53b3JkKTsKLQotCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJLy8gICAgICBETUEgUmVnaXN0ZXIgaGFzIGEgY29weSB0b28uCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJY3NyMC5maWVsZC5BYzBUeG9wID0gQWMwQ2ZnLmZpZWxkLkFjVHhvcDsKLQkJY3NyMC5maWVsZC5BYzFUeG9wID0gQWMxQ2ZnLmZpZWxkLkFjVHhvcDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKLQotCQljc3IxLmZpZWxkLkFjMlR4b3AgPSBBYzJDZmcuZmllbGQuQWNUeG9wOwotCQljc3IxLmZpZWxkLkFjM1R4b3AgPSBBYzNDZmcuZmllbGQuQWNUeG9wOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IxLndvcmQpOwotCi0JCUN3bWluQ3NyLndvcmQgPSAwOwotCQlDd21pbkNzci5maWVsZC5Dd21pbjAgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV07Ci0JCUN3bWluQ3NyLmZpZWxkLkN3bWluMSA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXTsKLQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4yID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4zID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dIC0gMTsgLy9mb3IgVEduIHdpZmkgdGVzdAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNSU5fQ0ZHLCBDd21pbkNzci53b3JkKTsKLQotCQlDd21heENzci53b3JkID0gMDsKLQkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgwID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQkVdOwotCQlDd21heENzci5maWVsZC5Dd21heDEgPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS107Ci0JCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MiA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXTsKLQkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgzID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNQVhfQ0ZHLCBDd21heENzci53b3JkKTsKLQotCQlBaWZzbkNzci53b3JkID0gMDsKLQkJQWlmc25Dc3IuZmllbGQuQWlmc24wID0gQWMwQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXTsKLQkJQWlmc25Dc3IuZmllbGQuQWlmc24xID0gQWMxQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsKLQkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gQWMyQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXTsKLSNpZmRlZiBJTkZfQU1BWk9OX1NFCi0jZW5kaWYgLy8gSU5GX0FNQVpPTl9TRSAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCS8vIFR1bmluZyBmb3IgV2ktRmkgV01NIFMwNgotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCAmJgotCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKLQkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjIgPSBBYzJDZmcuZmllbGQuQWlmc24gLSA0OwotCi0JCQkvLyBUdW5pbmcgZm9yIFRHbiBXaS1GaSA1LjIuMzIKLQkJCS8vIFNUQSBUZXN0QmVkIGNoYW5nZXMgaW4gdGhpcyBpdGVtOiBjb25uZXhhbnQgbGVnYWN5IHN0YSA9PT4gYnJvYWRjb20gMTFuIHN0YQotCQkJaWYgKFNUQV9UR05fV0lGSV9PTihwQWQpICYmCi0JCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKQotCQkJewotCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMCA9IDM7Ci0JCQkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gNzsKLQkJCX0KLQotCQkJaWYgKElORlJBX09OKHBBZCkpCi0JCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJQWlmc25Dc3IuZmllbGQuQWlmc24zID0gQWMzQ2ZnLmZpZWxkLkFpZnNuIC0gMTsgLy9wRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WT107IC8vZm9yIFRHbiB3aWZpIHRlc3QKLSNpZmRlZiBSVDMweHgKLQkJCS8vIFRPRE86IFNoaWFuZywgdGhpcyBtb2RpZmljYXRpb24gYWxzbyBzdWl0YWJsZSBmb3IgUlQzMDUyL1JUMzA1MCA/Pz8KLQkJCWlmIChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCB8fCBwQWQtPlJmSWNUeXBlID09IFJGSUNfMjAyMCkKLQkJCXsKLQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjIgPSAweDI7IC8vcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldOyAvL2ZvciBXaUZpIFdNTSBTNC1UMDQuCi0JCQl9Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0FJRlNOX0NGRywgQWlmc25Dc3Iud29yZCk7Ci0KLQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0sIHBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOwotCQlpZiAoIUFESE9DX09OKHBBZCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRURDQSBbIyVkXTogQUlGU04gQ1dtaW4gQ1dtYXggIFRYT1AodXMpICBBQ01cbiIsIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50KSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfQkUgICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzBdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bMF0sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFswXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbMF08PDUsCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzBdKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfQksgICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzFdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bMV0sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFsxXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbMV08PDUsCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzFdKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfVkkgICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzJdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bMl0sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFsyXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbMl08PDUsCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzJdKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfVk8gICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzNdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bM10sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFszXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbM108PDUsCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzNdKSk7Ci0JCX0KLQl9Ci0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQJQXNpY1NldFNsb3RUaW1lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIEJPT0xFQU4gYlVzZVNob3J0U2xvdFRpbWUpCi17Ci0JVUxPTkcJU2xvdFRpbWU7Ci0JVUlOVDMyCVJlZ1ZhbHVlID0gMDsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JCWJVc2VTaG9ydFNsb3RUaW1lID0gVFJVRTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCWlmIChiVXNlU2hvcnRTbG90VGltZSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKSkKLQkJcmV0dXJuOwotCWVsc2UgaWYgKCghYlVzZVNob3J0U2xvdFRpbWUpICYmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCkpKQotCQlyZXR1cm47Ci0KLQlpZiAoYlVzZVNob3J0U2xvdFRpbWUpCi0JCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7Ci0JZWxzZQotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7Ci0KLQlTbG90VGltZSA9IChiVXNlU2hvcnRTbG90VGltZSk/IDkgOiAyMDsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQkvLyBmb3JjZSB1c2luZyBzaG9ydCBTTE9UIHRpbWUgZm9yIEZBRSB0byBkZW1vIHBlcmZvcm1hbmNlIHdoZW4gVHhCdXJzdCBpcyBPTgotCQlpZiAoKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkgJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkpKQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJfHwgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSAmJiAocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9PSBCQV9OT1RVU0UpKQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJKQotCQl7Ci0JCQkvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgdGhpbmsgaXQgaXMgZG9pbmcgV2ktRmkgdGVzdAotCQkJLy8gQW5kIHdlIHdpbGwgbm90IHNldCB0byBzaG9ydCBzbG90IHdoZW4gYkVuYWJsZVR4QnVyc3QgaXMgVFJVRS4KLQkJfQotCQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkKLQkJewotCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKTsKLQkJCVNsb3RUaW1lID0gOTsKLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vCi0JLy8gRm9yIHNvbWUgcmVhc29ucywgYWx3YXlzIHNldCBpdCB0byBzaG9ydCBzbG90IHRpbWUuCi0JLy8KLQkvLyBUb0RvOiBTaG91bGQgY29uc2lkZXIgY2FwYWJpbGl0eSB3aXRoIDExQgotCS8vCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKLQkJewotCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQpOwotCQkJU2xvdFRpbWUgPSAyMDsKLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgQktPRkZfU0xPVF9DRkcsICZSZWdWYWx1ZSk7Ci0JUmVnVmFsdWUgPSBSZWdWYWx1ZSAmIDB4RkZGRkZGMDA7Ci0KLQlSZWdWYWx1ZSB8PSBTbG90VGltZTsKLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJLT0ZGX1NMT1RfQ0ZHLCBSZWdWYWx1ZSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUFkZCBTaGFyZWQga2V5IGluZm9ybWF0aW9uIGludG8gQVNJQy4KLQkJVXBkYXRlIHNoYXJlZCBrZXksIFR4TWljIGFuZCBSeE1pYyB0byBBc2ljIFNoYXJlZCBrZXkgdGFibGUKLQkJVXBkYXRlIGl0cyBjaXBoZXJBbGcgdG8gQXNpYyBTaGFyZWQga2V5IE1vZGUuCi0KLSAgICBSZXR1cm46Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBc2ljQWRkU2hhcmVkS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCSBCc3NJbmRleCwKLQlJTiBVQ0hBUgkJIEtleUlkeCwKLQlJTiBVQ0hBUgkJIENpcGhlckFsZywKLQlJTiBQVUNIQVIJCSBwS2V5LAotCUlOIFBVQ0hBUgkJIHBUeE1pYywKLQlJTiBQVUNIQVIJCSBwUnhNaWMpCi17Ci0JVUxPTkcgb2Zmc2V0OyAvLywgY3NyMDsKLQlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOwotI2lmZGVmIFJUTVBfTUFDX1BDSQotCUlOVCAgIGk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljQWRkU2hhcmVkS2V5RW50cnkgQnNzSW5kZXg9JWQsIEtleUlkeD0lZFxuIiwgQnNzSW5kZXgsS2V5SWR4KSk7Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGRTaGFyZWRLZXlFbnRyeTogJXMga2V5ICMlZFxuIiwgQ2lwaGVyTmFtZVtDaXBoZXJBbGddLCBCc3NJbmRleCo0ICsgS2V5SWR4KSk7Ci0JREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIgkJS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJcEtleVswXSxwS2V5WzFdLHBLZXlbMl0scEtleVszXSxwS2V5WzRdLHBLZXlbNV0scEtleVs2XSxwS2V5WzddLHBLZXlbOF0scEtleVs5XSxwS2V5WzEwXSxwS2V5WzExXSxwS2V5WzEyXSxwS2V5WzEzXSxwS2V5WzE0XSxwS2V5WzE1XSkpOwotCWlmIChwUnhNaWMpCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiCQlSeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJcFJ4TWljWzBdLHBSeE1pY1sxXSxwUnhNaWNbMl0scFJ4TWljWzNdLHBSeE1pY1s0XSxwUnhNaWNbNV0scFJ4TWljWzZdLHBSeE1pY1s3XSkpOwotCX0KLQlpZiAocFR4TWljKQotCXsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIgkJVHggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCXBUeE1pY1swXSxwVHhNaWNbMV0scFR4TWljWzJdLHBUeE1pY1szXSxwVHhNaWNbNF0scFR4TWljWzVdLHBUeE1pY1s2XSxwVHhNaWNbN10pKTsKLQl9Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JLy8KLQkvLyBmaWxsIGtleSBtYXRlcmlhbCAtIGtleSArIFRYIE1JQyArIFJYIE1JQwotCS8vCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0Jb2Zmc2V0ID0gU0hBUkVEX0tFWV9UQUJMRV9CQVNFICsgKDQqQnNzSW5kZXggKyBLZXlJZHgpKkhXX0tFWV9FTlRSWV9TSVpFOwotCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfU0hBUkVfS0VZOyBpKyspCi0JewotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBLZXlbaV0pOwotCX0KLQotCW9mZnNldCArPSBNQVhfTEVOX09GX1NIQVJFX0tFWTsKLQlpZiAocFR4TWljKQotCXsKLQkJZm9yIChpPTA7IGk8ODsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBUeE1pY1tpXSk7Ci0JCX0KLQl9Ci0KLQlvZmZzZXQgKz0gODsKLQlpZiAocFJ4TWljKQotCXsKLQkJZm9yIChpPTA7IGk8ODsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBSeE1pY1tpXSk7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCS8vCi0JLy8gVXBkYXRlIGNpcGhlciBhbGdvcml0aG0uIFdTVEEgYWx3YXlzIHVzZSBCU1MwCi0JLy8KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCAmY3NyMS53b3JkKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJlYWQ6IFNIQVJFRF9LRVlfTU9ERV9CQVNFIGF0IHRoaXMgQnNzWyVkXSBLZXlJZHhbJWRdPSAweCV4IFxuIiwgQnNzSW5kZXgsS2V5SWR4LCBjc3IxLndvcmQpKTsKLQlpZiAoKEJzc0luZGV4JTIpID09IDApCi0JewotCQlpZiAoS2V5SWR4ID09IDApCi0JCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQllbHNlIGlmIChLZXlJZHggPT0gMSkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCWVsc2UgaWYgKEtleUlkeCA9PSAyKQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJZWxzZQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKEtleUlkeCA9PSAwKQotCQkJY3NyMS5maWVsZC5Cc3MxS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCi0JCQljc3IxLmZpZWxkLkJzczFLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQllbHNlIGlmIChLZXlJZHggPT0gMikKLQkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCWVsc2UKLQkJCWNzcjEuZmllbGQuQnNzMUtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JfQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiV3JpdGU6IFNIQVJFRF9LRVlfTU9ERV9CQVNFIGF0IHRoaXMgQnNzWyVkXSA9IDB4JXggXG4iLCBCc3NJbmRleCwgY3NyMS53b3JkKSk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooQnNzSW5kZXgvMiksIGNzcjEud29yZCk7Ci0KLX0KLQotLy8JSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIEFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJIEJzc0luZGV4LAotCUlOIFVDSEFSCQkgS2V5SWR4KQotewotCS8vVUxPTkcgU2VjQ3NyMDsKLQlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnk6ICMlZCBcbiIsIEJzc0luZGV4KjQgKyBLZXlJZHgpKTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooQnNzSW5kZXgvMiksICZjc3IxLndvcmQpOwotCWlmICgoQnNzSW5kZXglMikgPT0gMCkKLQl7Ci0JCWlmIChLZXlJZHggPT0gMCkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSAwOwotCQllbHNlIGlmIChLZXlJZHggPT0gMSkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSAwOwotCQllbHNlIGlmIChLZXlJZHggPT0gMikKLQkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSAwOwotCQllbHNlCi0JCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gMDsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKEtleUlkeCA9PSAwKQotCQkJY3NyMS5maWVsZC5Cc3MxS2V5MENpcGhlckFsZyA9IDA7Ci0JCWVsc2UgaWYgKEtleUlkeCA9PSAxKQotCQkJY3NyMS5maWVsZC5Cc3MxS2V5MUNpcGhlckFsZyA9IDA7Ci0JCWVsc2UgaWYgKEtleUlkeCA9PSAyKQotCQkJY3NyMS5maWVsZC5Cc3MxS2V5MkNpcGhlckFsZyA9IDA7Ci0JCWVsc2UKLQkJCWNzcjEuZmllbGQuQnNzMUtleTNDaXBoZXJBbGcgPSAwOwotCX0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIldyaXRlOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gPSAweCV4IFxuIiwgQnNzSW5kZXgsIGNzcjEud29yZCkpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCBjc3IxLndvcmQpOwotCUFTU0VSVChCc3NJbmRleCA8IDQpOwotCUFTU0VSVChLZXlJZHggPCA0KTsKLQotfQotCi0KLVZPSUQgQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUCQlXQ0lELAotCUlOIFVDSEFSCQlCc3NJbmRleCwKLQlJTiBVQ0hBUiAgICAgICAgQ2lwaGVyQWxnLAotCUlOIEJPT0xFQU4JCWJVc2VQYWlyZXdpc2VLZXlUYWJsZSkKLXsKLQlVTE9ORyAgIFdDSURBdHRyaSA9IDAsIG9mZnNldDsKLQotCS8vCi0JLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlLgotCS8vIE9ubHkgVHhLZXkgY291bGQgdXBkYXRlIFdDSUQgYXR0cmlidXRlLgotCS8vCi0Jb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoV0NJRCAqIEhXX1dDSURfQVRUUklfU0laRSk7Ci0JV0NJREF0dHJpID0gKEJzc0luZGV4IDw8IDQpIHwgKENpcGhlckFsZyA8PCAxKSB8IChiVXNlUGFpcmV3aXNlS2V5VGFibGUpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKLX0KLQotVk9JRCBBc2ljVXBkYXRlV0NJRElWRUlWKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVAkJV0NJRCwKLQlJTiBVTE9ORyAgICAgICAgdUlWLAotCUlOIFVMT05HICAgICAgICB1RUlWKQotewotCVVMT05HCW9mZnNldDsKLQotCW9mZnNldCA9IE1BQ19JVkVJVl9UQUJMRV9CQVNFICsgKFdDSUQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgdUlWKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyA0LCB1RUlWKTsKLX0KLQotVk9JRCBBc2ljVXBkYXRlUnhXQ0lEVGFibGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUCQlXQ0lELAotCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIpCi17Ci0JVUxPTkcgb2Zmc2V0OwotCVVMT05HIEFkZHI7Ci0KLQlvZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgKFdDSUQgKiBIV19XQ0lEX0VOVFJZX1NJWkUpOwotCUFkZHIgPSBwQWRkclswXSArIChwQWRkclsxXSA8PCA4KSArKHBBZGRyWzJdIDw8IDE2KSArKHBBZGRyWzNdIDw8IDI0KTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIEFkZHIpOwotCUFkZHIgPSBwQWRkcls0XSArIChwQWRkcls1XSA8PCA4KTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyA0LCBBZGRyKTsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IENpcGhlciBLZXksIENpcGhlciBhbGdvcml0aG0sIElWL0VJViB0byBBc2ljCi0KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIHBBZCAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAgICAgICAgV0NJRCAgICAgICAgICAgICAgICAgICAgV0NJRCBFbnRyeSBudW1iZXIuCi0gICAgICAgIEJzc0luZGV4ICAgICAgICAgICAgICAgIEJTU0lEIGluZGV4LCBzdGF0aW9uIG9yIG5vbmUgbXVsdGlwbGUgQlNTSUQgc3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHZhbHVlIHNob3VsZCBiZSAwLgotICAgICAgICBLZXlJZHggICAgICAgICAgICAgICAgICBUaGlzIEtleUlkeCB3aWxsIHNldCB0byBJVidzIEtleUlEIGlmIGJUeEtleSBlbmFibGVkCi0gICAgICAgIHBDaXBoZXJLZXkgICAgICAgICAgICAgIFBvaW50ZXIgdG8gQ2lwaGVyIEtleS4KLSAgICAgICAgYlVzZVBhaXJld2lzZUtleVRhYmxlICAgVFJVRSBtZWFucyBzYXZlZCB0aGUga2V5IGluIFNoYXJlZEtleSB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIFBhaXJld2lzZUtleSB0YWJsZQotICAgICAgICBiVHhLZXkgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSB0cmFuc21pdCBrZXkgaWYgZW5hYmxlZC4KLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgTm9uZQotCi0gICAgTm90ZToKLSAgICAgICAgVGhpcyByb3V0aW5lIHdpbGwgc2V0IHRoZSByZWxhdGl2ZSBrZXkgc3R1ZmYgdG8gQXNpYyBpbmNsdWRpbmcgV0NJRCBhdHRyaWJ1dGUsCi0gICAgICAgIENpcGhlciBLZXksIENpcGhlciBhbGdvcml0aG0gYW5kIElWL0VJVi4KLQotICAgICAgICBJVi9FSVYgd2lsbCBiZSB1cGRhdGUgaWYgdGhpcyBDaXBoZXJLZXkgaXMgdGhlIHRyYW5zbWlzc2lvbiBrZXkgYmVjYXVzZQotICAgICAgICBBU0lDIHdpbGwgYmFzZSBvbiBJVidzIEtleUlEIHZhbHVlIHRvIHNlbGVjdCBDaXBoZXIgS2V5LgotCi0gICAgICAgIElmIGJUeEtleSBzZXRzIHRvIEZBTFNFLCB0aGlzIGlzIG5vdCB0aGUgVFgga2V5LCBidXQgaXQgY291bGQgYmUKLSAgICAgICAgUlgga2V5Ci0KLQlGb3IgQVAgbW9kZSBiVHhLZXkgbXVzdCBiZSBhbHdheXMgc2V0IHRvIFRSVUUuCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBc2ljQWRkS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUCQlXQ0lELAotCUlOIFVDSEFSCQlCc3NJbmRleCwKLQlJTiBVQ0hBUgkJS2V5SWR4LAotCUlOIFBDSVBIRVJfS0VZCXBDaXBoZXJLZXksCi0JSU4gQk9PTEVBTgkJYlVzZVBhaXJld2lzZUtleVRhYmxlLAotCUlOIEJPT0xFQU4JCWJUeEtleSkKLXsKLQlVTE9ORwlvZmZzZXQ7Ci0vLwlVTE9ORyAgIFdDSURBdHRyaSA9IDA7Ci0JVUNIQVIJSVY0ID0gMDsKLQlQVUNIQVIJCXBLZXkgPSBwQ2lwaGVyS2V5LT5LZXk7Ci0vLwlVTE9ORwkJS2V5TGVuID0gcENpcGhlcktleS0+S2V5TGVuOwotCVBVQ0hBUgkJcFR4TWljID0gcENpcGhlcktleS0+VHhNaWM7Ci0JUFVDSEFSCQlwUnhNaWMgPSBwQ2lwaGVyS2V5LT5SeE1pYzsKLQlQVUNIQVIJCXBUeHRzYyA9IHBDaXBoZXJLZXktPlR4VHNjOwotCVVDSEFSCQlDaXBoZXJBbGcgPSBwQ2lwaGVyS2V5LT5DaXBoZXJBbGc7Ci0JU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlVQ0hBUgkJaTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotLy8JQVNTRVJUKEtleUxlbiA8PSBNQVhfTEVOX09GX1BFRVJfS0VZKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBBc2ljQWRkS2V5RW50cnlcbiIpKTsKLQkvLwotCS8vIDEuKSBkZWNpZGUga2V5IHRhYmxlIG9mZnNldAotCS8vCi0JaWYgKGJVc2VQYWlyZXdpc2VLZXlUYWJsZSkKLQkJb2Zmc2V0ID0gUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0tFWV9FTlRSWV9TSVpFKTsKLQllbHNlCi0JCW9mZnNldCA9IFNIQVJFRF9LRVlfVEFCTEVfQkFTRSArICg0ICogQnNzSW5kZXggKyBLZXlJZHgpICogSFdfS0VZX0VOVFJZX1NJWkU7Ci0KLQkvLwotCS8vIDIuKSBTZXQgS2V5IHRvIEFzaWMKLQkvLwotCS8vZm9yIChpID0gMDsgaSA8IEtleUxlbjsgaSsrKQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX1BFRVJfS0VZOyBpKyspCi0JewotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBLZXlbaV0pOwotCX0KLQlvZmZzZXQgKz0gTUFYX0xFTl9PRl9QRUVSX0tFWTsKLQotCS8vCi0JLy8gMy4pIFNldCBNSUMga2V5IGlmIGF2YWlsYWJsZQotCS8vCi0JaWYgKHBUeE1pYykKLQl7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFR4TWljW2ldKTsKLQkJfQotCX0KLQlvZmZzZXQgKz0gTEVOX1RLSVBfVFhNSUNLOwotCi0JaWYgKHBSeE1pYykKLQl7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFJ4TWljW2ldKTsKLQkJfQotCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0JLy8KLQkvLyA0LikgTW9kaWZ5IElWL0VJViBpZiBuZWVkcwotCS8vICAgICBUaGlzIHdpbGwgZm9yY2UgQXNpYyB0byB1c2UgdGhpcyBrZXkgSUQgYnkgc2V0dGluZyBJVi4KLQkvLwotCWlmIChiVHhLZXkpCi0JewotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQlvZmZzZXQgPSBNQUNfSVZFSVZfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfSVZFSVZfRU5UUllfU0laRSk7Ci0JCS8vCi0JCS8vIFdyaXRlIElWCi0JCS8vCi0JCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0LCBwVHh0c2NbMV0pOwotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIDEsICgocFR4dHNjWzFdIHwgMHgyMCkgJiAweDdmKSk7Ci0JCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgMiwgcFR4dHNjWzBdKTsKLQotCQlJVjQgPSAoS2V5SWR4IDw8IDYpOwotCQlpZiAoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpIHx8KENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSkKLQkJCUlWNCB8PSAweDIwOyAgLy8gdHVybiBvbiBleHRlbnNpb24gYml0IG1lYW5zIEVJViBleGlzdGVuY2UKLQotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIDMsIElWNCk7Ci0KLQkJLy8KLQkJLy8gV3JpdGUgRUlWCi0JCS8vCi0JCW9mZnNldCArPSA0OwotCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBUeHRzY1tpICsgMl0pOwotCQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQkJQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUocEFkLCBXQ0lELCBCc3NJbmRleCwgQ2lwaGVyQWxnLCBiVXNlUGFpcmV3aXNlS2V5VGFibGUpOwotCX0KLQotCWlmICghYlVzZVBhaXJld2lzZUtleVRhYmxlKQotCXsKLQkJLy8KLQkJLy8gT25seSB1cGRhdGUgdGhlIHNoYXJlZCBrZXkgc2VjdXJpdHkgbW9kZQotCQkvLwotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCAqIChCc3NJbmRleCAvIDIpLCAmY3NyMS53b3JkKTsKLQkJaWYgKChCc3NJbmRleCAlIDIpID09IDApCi0JCXsKLQkJCWlmIChLZXlJZHggPT0gMCkKLQkJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCi0JCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQotCQkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCQllbHNlCi0JCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChLZXlJZHggPT0gMCkKLQkJCQljc3IxLmZpZWxkLkJzczFLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCi0JCQkJY3NyMS5maWVsZC5Cc3MxS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQotCQkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCQllbHNlCi0JCQkJY3NyMS5maWVsZC5Cc3MxS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJfQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQgKiAoQnNzSW5kZXggLyAyKSwgY3NyMS53b3JkKTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gQXNpY0FkZEtleUVudHJ5XG4iKSk7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJQWRkIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgaW50byBBU0lDLgotCQlVcGRhdGUgcGFpcndpc2Uga2V5LCBUeE1pYyBhbmQgUnhNaWMgdG8gQXNpYyBQYWlyLXdpc2Uga2V5IHRhYmxlCi0KLSAgICBSZXR1cm46Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgICAgICAgIHBBZGRyLAotCUlOIFVDSEFSCQlXQ0lELAotCUlOIENJUEhFUl9LRVkJCSAqcENpcGhlcktleSkKLXsKLQlJTlQgaTsKLQlVTE9ORwkJb2Zmc2V0OwotCVBVQ0hBUgkJIHBLZXkgPSBwQ2lwaGVyS2V5LT5LZXk7Ci0JUFVDSEFSCQkgcFR4TWljID0gcENpcGhlcktleS0+VHhNaWM7Ci0JUFVDSEFSCQkgcFJ4TWljID0gcENpcGhlcktleS0+UnhNaWM7Ci0jaWZkZWYgREJHCi0JVUNIQVIJCUNpcGhlckFsZyA9IHBDaXBoZXJLZXktPkNpcGhlckFsZzsKLSNlbmRpZiAvLyBEQkcgLy8KLQotCS8vIEVLRVkKLQlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfS0VZX0VOVFJZX1NJWkUpOwotI2lmZGVmIFJUTVBfTUFDX1BDSQotCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfUEVFUl9LRVk7IGkrKykKLQl7Ci0JCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcEtleVtpXSk7Ci0JfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfUEVFUl9LRVk7IGkrPTQpCi0JewotCQlVSU5UMzIgVmFsdWU7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgb2Zmc2V0ICsgaSwgJlZhbHVlKTsKLQl9Ci0KLQlvZmZzZXQgKz0gTUFYX0xFTl9PRl9QRUVSX0tFWTsKLQotCS8vICBNSUMgS0VZCi0JaWYgKHBUeE1pYykKLQl7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCWZvciAoaT0wOyBpPDg7IGkrKykKLQkJewotCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQraSwgcFR4TWljW2ldKTsKLQkJfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCX0KLQlvZmZzZXQgKz0gODsKLQlpZiAocFJ4TWljKQotCXsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJZm9yIChpPTA7IGk8ODsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCtpLCBwUnhNaWNbaV0pOwotCQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRkUGFpcndpc2VLZXlFbnRyeTogV0NJRCAjJWQgQWxnPSVzXG4iLFdDSUQsIENpcGhlck5hbWVbQ2lwaGVyQWxnXSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiCUtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCXBLZXlbMF0scEtleVsxXSxwS2V5WzJdLHBLZXlbM10scEtleVs0XSxwS2V5WzVdLHBLZXlbNl0scEtleVs3XSxwS2V5WzhdLHBLZXlbOV0scEtleVsxMF0scEtleVsxMV0scEtleVsxMl0scEtleVsxM10scEtleVsxNF0scEtleVsxNV0pKTsKLQlpZiAocFJ4TWljKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCVJ4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQlwUnhNaWNbMF0scFJ4TWljWzFdLHBSeE1pY1syXSxwUnhNaWNbM10scFJ4TWljWzRdLHBSeE1pY1s1XSxwUnhNaWNbNl0scFJ4TWljWzddKSk7Ci0JfQotCWlmIChwVHhNaWMpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIJVHggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCXBUeE1pY1swXSxwVHhNaWNbMV0scFR4TWljWzJdLHBUeE1pY1szXSxwVHhNaWNbNF0scFR4TWljWzVdLHBUeE1pY1s2XSxwVHhNaWNbN10pKTsKLQl9Ci19Ci0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlSZW1vdmUgUGFpci13aXNlIGtleSBtYXRlcmlhbCBmcm9tIEFTSUMuCi0KLSAgICBSZXR1cm46Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJIEJzc0lkeCwKLQlJTiBVQ0hBUgkJIFdjaWQpCi17Ci0JVUxPTkcJCVdDSURBdHRyaTsKLQlVU0hPUlQJCW9mZnNldDsKLQotCS8vIHJlLXNldCB0aGUgZW50cnkncyBXQ0lEIGF0dHJpYnV0ZSBhcyBPUEVOLU5PTkUuCi0Jb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoV2NpZCAqIEhXX1dDSURfQVRUUklfU0laRSk7Ci0JV0NJREF0dHJpID0gKEJzc0lkeDw8NCkgfCBQQUlSV0lTRUtFWVRBQkxFOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKLX0KLQotQk9PTEVBTiBBc2ljU2VuZENvbW1hbmRUb01jdSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJIENvbW1hbmQsCi0JSU4gVUNIQVIJCSBUb2tlbiwKLQlJTiBVQ0hBUgkJIEFyZzAsCi0JSU4gVUNIQVIJCSBBcmcxKQotewotCi0KLQlpZiAocEFkLT5jaGlwT3BzLnNlbmRDb21tYW5kVG9NY3UpCi0JCXBBZC0+Y2hpcE9wcy5zZW5kQ29tbWFuZFRvTWN1KHBBZCwgQ29tbWFuZCwgVG9rZW4sIEFyZzAsIEFyZzEpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotVk9JRCBBc2ljU2V0UnhBbnQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlBbnQpCi17Ci0jaWZkZWYgUlQzM3h4Ci0JUlQzM3h4U2V0UnhBbnQocEFkLCBBbnQpOwotI2Vsc2UKLSNpZmRlZiBSVDMweHgKLQkvKiBSVDM1NzIgQVRFIG5lZWQgbm90IHRvIGRvIHRoaXMuICovCi0JUlQzMHh4U2V0UnhBbnQocEFkLCBBbnQpOwotI2VuZGlmIC8vIFJUMzB4eCAvLwotI2VuZGlmIC8vIFJUMzN4eCAvLwotfQotCi0KLVZPSUQgQXNpY1R1cm5PZmZSRkNsaygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVQ0hBUgkJQ2hhbm5lbCkKLXsKLQlpZiAocEFkLT5jaGlwT3BzLkFzaWNSZlR1cm5PZmYpCi0JewotCQlwQWQtPmNoaXBPcHMuQXNpY1JmVHVybk9mZihwQWQpOwotCX0KLQllbHNlCi0JewotCQkvLyBSRiBSMiBiaXQgMTggPSAwCi0JCVVJTlQzMgkJCVIxID0gMCwgUjIgPSAwLCBSMyA9IDA7Ci0JCVVDSEFSCQkJaW5kZXg7Ci0JCVJUTVBfUkZfUkVHUwkqUkZSZWdUYWJsZTsKLQotCQlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7Ci0KLQkJc3dpdGNoIChwQWQtPlJmSWNUeXBlKQotCQl7Ci0JCQljYXNlIFJGSUNfMjgyMDoKLQkJCWNhc2UgUkZJQ18yODUwOgotCQkJY2FzZSBSRklDXzI3MjA6Ci0JCQljYXNlIFJGSUNfMjc1MDoKLQotCQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspCi0JCQkJewotCQkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKQotCQkJCQl7Ci0JCQkJCQlSMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxICYgMHhmZmZmZGZmZjsKLQkJCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjIgJiAweGZmZmJmZmZmOwotCQkJCQkJUjMgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMyAmIDB4ZmZmM2ZmZmY7Ci0KLQkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKLQkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIyKTsKLQotCQkJCQkJLy8gUHJvZ3JhbSBSMWIxMyB0byAxLCBSMy9iMTgsMTkgdG8gMCwgUjJiMTggdG8gMC4KLQkJCQkJCS8vIFNldCBSRiBSMiBiaXQxOD0wLCBSMyBiaXRbMTg6MTldPTAKLQkJCQkJCS8vaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKLQkJCQkJCWlmICgxKQotCQkJCQkJewotCQkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIzKTsKLQotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNUdXJuT2ZmUkZDbGsjJWQoUkY9JWQsICkgLCBSMj0weCUwOHgsICBSMyA9IDB4JTA4eCBcbiIsCi0JCQkJCQkJCUNoYW5uZWwsIHBBZC0+UmZJY1R5cGUsIFIyLCBSMykpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNUdXJuT2ZmUkZDbGsjJWQoUkY9JWQsICkgLCBSMj0weCUwOHggXG4iLAotCQkJCQkJCQlDaGFubmVsLCBwQWQtPlJmSWNUeXBlLCBSMikpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLQotVk9JRCBBc2ljVHVybk9uUkZDbGsoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUNIQVIJCQlDaGFubmVsKQotewotCS8vIFJGIFIyIGJpdCAxOCA9IDAKLQlVSU5UMzIJCQlSMSA9IDAsIFIyID0gMCwgUjMgPSAwOwotCVVDSEFSCQkJaW5kZXg7Ci0JUlRNUF9SRl9SRUdTCSpSRlJlZ1RhYmxlOwotCi0jaWZkZWYgUENJRV9QU19TVVBQT1JUCi0JLy8gVGhlIFJGIHByb2dyYW1taW5nIHNlcXVlbmNlIGlzIGRpZmZlcmVuY2UgYmV0d2VlbiAzeHh4IGFuZCAyeHh4Ci0JaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkpCi0JewotCQlyZXR1cm47Ci0JfQotI2VuZGlmIC8vIFBDSUVfUFNfU1VQUE9SVCAvLwotCi0JUkZSZWdUYWJsZSA9IFJGMjg1MFJlZ1RhYmxlOwotCi0Jc3dpdGNoIChwQWQtPlJmSWNUeXBlKQotCXsKLQkJY2FzZSBSRklDXzI4MjA6Ci0JCWNhc2UgUkZJQ18yODUwOgotCQljYXNlIFJGSUNfMjcyMDoKLQkJY2FzZSBSRklDXzI3NTA6Ci0KLQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspCi0JCQl7Ci0JCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkKLQkJCQl7Ci0JCQkJCVIzID0gcEFkLT5MYXRjaFJmUmVncy5SMzsKLQkJCQkJUjMgJj0gMHhmZmYzZmZmZjsKLQkJCQkJUjMgfD0gMHgwMDA4MDAwMDsKLQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjMpOwotCi0JCQkJCVIxID0gUkZSZWdUYWJsZVtpbmRleF0uUjE7Ci0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKLQotCQkJCQlSMiA9IFJGUmVnVGFibGVbaW5kZXhdLlIyOwotCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQotCQkJCQl7Ci0JCQkJCQlSMiB8PSAweDQwMDA7CS8vIElmIFRYcGF0aCBpcyAxLCBiaXQgMTQgPSAxOwotCQkJCQl9Ci0KLQkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKLQkJCQkJewotCQkJCQkJUjIgfD0gMHg0MDsJLy8gd3JpdGUgMSB0byBvZmYgUnhwYXRoLgotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQkJCQkJewotCQkJCQkJUjIgfD0gMHgyMDA0MDsJLy8gd3JpdGUgMSB0byBvZmYgUnhQYXRoCi0JCQkJCX0KLQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjIpOwotCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljVHVybk9uUkZDbGsjJWQoUkY9JWQsICkgLCBSMj0weCUwOHhcbiIsCi0JCUNoYW5uZWwsCi0JCXBBZC0+UmZJY1R5cGUsCi0JCVIyKSk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fY2ZnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fY2ZnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YmU5NzkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2NmZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0JY21tX2NmZy5jCi0KLSAgICBBYnN0cmFjdDoKLSAgICBSYWxpbmsgV2lGaSBEcml2ZXIgY29uZmlndXJhdGlvbiByZWxhdGVkIHN1YnJvdXRpbmVzCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotY2hhciogR2V0UGh5TW9kZSgKLQlpbnQgTW9kZSkKLXsKLQlzd2l0Y2goTW9kZSkKLQl7Ci0JCWNhc2UgTU9ERV9DQ0s6Ci0JCQlyZXR1cm4gIkNDSyI7Ci0KLQkJY2FzZSBNT0RFX09GRE06Ci0JCQlyZXR1cm4gIk9GRE0iOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQljYXNlIE1PREVfSFRNSVg6Ci0JCQlyZXR1cm4gIkhUTUlYIjsKLQotCQljYXNlIE1PREVfSFRHUkVFTkZJRUxEOgotCQkJcmV0dXJuICJHUkVFTiI7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gIk4vQSI7Ci0JfQotfQotCi0KLWNoYXIqIEdldEJXKAotCWludCBCVykKLXsKLQlzd2l0Y2goQlcpCi0JewotCQljYXNlIEJXXzEwOgotCQkJcmV0dXJuICIxME0iOwotCi0JCWNhc2UgQldfMjA6Ci0JCQlyZXR1cm4gIjIwTSI7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgQldfNDA6Ci0JCQlyZXR1cm4gIjQwTSI7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gIk4vQSI7Ci0JfQotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IENvdW50cnkgUmVnaW9uIHRvIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24uCi0gICAgICAgIFRoaXMgY29tbWFuZCB3aWxsIG5vdCB3b3JrLCBpZiB0aGUgZmllbGQgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZC4KLQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFJUX0NmZ1NldENvdW50cnlSZWdpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUFNUUklORwkJCWFyZywKLQlJTiBJTlQJCQkJYmFuZCkKLXsKLQlMT05HIHJlZ2lvbiwgcmVnaW9uTWF4OwotCVVDSEFSICpwQ291bnRyeVJlZ2lvbjsKLQotCXJlZ2lvbiA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoYmFuZCA9PSBCQU5EXzI0RykKLQl7Ci0JCXBDb3VudHJ5UmVnaW9uID0gJnBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb247Ci0JCXJlZ2lvbk1heCA9IFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQ7Ci0JfQotCWVsc2UKLQl7Ci0JCXBDb3VudHJ5UmVnaW9uID0gJnBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZDsKLQkJcmVnaW9uTWF4ID0gUkVHSU9OX01BWElNVU1fQV9CQU5EOwotCX0KLQotCS8vIFRPRE86IElzIGl0IG5lY2Nlc2F5IGZvciBmb2xsb3dpbmcgY2hlY2s/Pz8KLQkvLyBDb3VudHJ5IGNhbiBiZSBzZXQgb25seSB3aGVuIEVFUFJPTSBub3QgcHJvZ3JhbW1lZAotCWlmICgqcENvdW50cnlSZWdpb24gJiAweDgwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ2ZnU2V0Q291bnRyeVJlZ2lvbigpOkNvdW50cnlSZWdpb24gaW4gZWVwcm9tIHdhcyBwcm9ncmFtbWVkXG4iKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlpZigocmVnaW9uID49IDApICYmIChyZWdpb24gPD0gUkVHSU9OX01BWElNVU1fQkdfQkFORCkpCi0JewotCQkqcENvdW50cnlSZWdpb249IChVQ0hBUikgcmVnaW9uOwotCX0KLQllbHNlIGlmICgocmVnaW9uID09IFJFR0lPTl8zMV9CR19CQU5EKSAmJiAoYmFuZCA9PSBCQU5EXzI0RykpCi0JewotCQkqcENvdW50cnlSZWdpb24gPSAoVUNIQVIpIHJlZ2lvbjsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ2ZnU2V0Q291bnRyeVJlZ2lvbigpOnJlZ2lvbiglbGQpIG91dCBvZiByYW5nZSFcbiIsIHJlZ2lvbikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci0KLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBXaXJlbGVzcyBNb2RlCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgUlRfQ2ZnU2V0V2lyZWxlc3NNb2RlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JSU5UCQlNYXhQaHlNb2RlID0gUEhZXzExRzsKLQlMT05HCVdpcmVsZXNzTW9kZTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCU1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JV2lyZWxlc3NNb2RlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoV2lyZWxlc3NNb2RlIDw9IE1heFBoeU1vZGUpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gV2lyZWxlc3NNb2RlOwotCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkUGh5TW9kZSA9IFdpcmVsZXNzTW9kZTsKLQkJcmV0dXJuIFRSVUU7Ci0JfQotCi0JcmV0dXJuIEZBTFNFOwotCi19Ci0KLQotSU5UIFJUX0NmZ1NldFNob3J0U2xvdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCUxPTkcgU2hvcnRTbG90OwotCi0JU2hvcnRTbG90ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChTaG9ydFNsb3QgPT0gMSkKLQkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOwotCWVsc2UgaWYgKFNob3J0U2xvdCA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IEZBTFNFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBXRVAgS0VZIGJhc2Ugb24gS2V5SWR4Ci0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJUlRfQ2ZnU2V0V2VwS2V5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlrZXlTdHJpbmcsCi0JSU4JQ0lQSEVSX0tFWQkJKnBTaGFyZWRLZXksCi0JSU4JSU5UCQkJCWtleUlkeCkKLXsKLQlJTlQJCQkJS2V5TGVuOwotCUlOVAkJCQlpOwotCVVDSEFSCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JQk9PTEVBTgkJCWJLZXlJc0hleCA9IEZBTFNFOwotCi0JLy8gVE9ETzogU2hhbGwgd2UgZG8gbWVtc2V0IGZvciB0aGUgb3JpZ2luYWwga2V5IGluZm8/PwotCW1lbXNldChwU2hhcmVkS2V5LCAwLCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotCUtleUxlbiA9IHN0cmxlbihrZXlTdHJpbmcpOwotCXN3aXRjaCAoS2V5TGVuKQotCXsKLQkJY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCi0JCWNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCi0JCQliS2V5SXNIZXggPSBGQUxTRTsKLQkJCXBTaGFyZWRLZXktPktleUxlbiA9IEtleUxlbjsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPktleSwga2V5U3RyaW5nLCBLZXlMZW4pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKLQkJY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCi0JCQlmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCi0JCQl7Ci0JCQkJaWYoICFpc3hkaWdpdCgqKGtleVN0cmluZytpKSkgKQotCQkJCQlyZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7Ci0JCQl9Ci0JCQliS2V5SXNIZXggPSBUUlVFOwotCQkJcFNoYXJlZEtleS0+S2V5TGVuID0gS2V5TGVuLzIgOwotCQkJQXRvSChrZXlTdHJpbmcsIHBTaGFyZWRLZXktPktleSwgcFNoYXJlZEtleS0+S2V5TGVuKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRfQ2ZnU2V0V2VwS2V5KGtleUlkeD0lZCk6SW52YWxpZCBhcmd1bWVudCAoYXJnPSVzKVxuIiwga2V5SWR4LCBrZXlTdHJpbmcpKTsKLQkJCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSAoKEtleUxlbiAlIDUpID8gQ0lQSEVSX1dFUDEyOCA6IENJUEhFUl9XRVA2NCk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRfQ2ZnU2V0V2VwS2V5OihLZXlJZHg9JWQsdHlwZT0lcywgQWxnPSVzKVxuIiwKLQkJCQkJCWtleUlkeCwgKGJLZXlJc0hleCA9PSBGQUxTRSA/ICJBc2NpaSIgOiAiSGV4IiksIENpcGhlck5hbWVbQ2lwaGVyQWxnXSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgV1BBIFBTSyBrZXkKLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgcEFkYXB0ZXIJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotICAgICAgICBrZXlTdHJpbmcJV1BBIHByZS1zaGFyZWQga2V5IHN0cmluZwotICAgICAgICBwSGFzaFN0cglTdHJpbmcgdXNlZCBmb3IgcGFzc3dvcmQgaGFzaCBmdW5jdGlvbgotICAgICAgICBoYXNoU3RyTGVuCUxlbmdodCBvZiB0aGUgaGFzaCBzdHJpbmcKLSAgICAgICAgcFBNS0J1ZgkJT3V0cHV0IGJ1ZmZlciBvZiBXUEFQU0sga2V5Ci0KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBSVF9DZmdTZXRXUEFQU0tLZXkoCi0JSU4gUlRNUF9BREFQVEVSCSpwQWQsCi0JSU4gUFNUUklORwkJa2V5U3RyaW5nLAotCUlOIFVDSEFSCQkqcEhhc2hTdHIsCi0JSU4gSU5UCQkJaGFzaFN0ckxlbiwKLQlPVVQgUFVDSEFSCQlwUE1LQnVmKQotewotCWludCBrZXlMZW47Ci0JVUNIQVIga2V5TWF0ZXJpYWxbNDBdOwotCi0Ja2V5TGVuID0gc3RybGVuKGtleVN0cmluZyk7Ci0JaWYgKChrZXlMZW4gPCA4KSB8fCAoa2V5TGVuID4gNjQpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV1BBUFNLIEtleSBsZW5ndGgoJWQpIGVycm9yLCByZXF1aXJlZCA4IH4gNjQgY2hhcmFjdGVycyEoa2V5U3RyPSVzKVxuIiwKLQkJCQkJCQkJCWtleUxlbiwga2V5U3RyaW5nKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQltZW1zZXQocFBNS0J1ZiwgMCwgMzIpOwotCWlmIChrZXlMZW4gPT0gNjQpCi0JewotCSAgICBBdG9IKGtleVN0cmluZywgcFBNS0J1ZiwgMzIpOwotCX0KLQllbHNlCi0JewotCSAgICBQYXNzd29yZEhhc2goa2V5U3RyaW5nLCBwSGFzaFN0ciwgaGFzaFN0ckxlbiwga2V5TWF0ZXJpYWwpOwotCSAgICBOZGlzTW92ZU1lbW9yeShwUE1LQnVmLCBrZXlNYXRlcmlhbCwgMzIpOwotCX0KLQotCXJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2RhdGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9kYXRhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNDAwNzEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2RhdGEuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NjMgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLQljbW1fZGF0YS5jCi0KLSAgICBBYnN0cmFjdDoKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotVUNIQVIJU05BUF84MDJfMUhbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKLVVDSEFSCVNOQVBfQlJJREdFX1RVTk5FTFtdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4Zjh9OwotLy8gQWRkIENpc2NvIEFpcm9uZXQgU05BUCBoZWFkZSBmb3IgQ0NYMiBzdXBwb3J0Ci1VQ0hBUglTTkFQX0FJUk9ORVRbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAwfTsKLVVDSEFSCUNLSVBfTExDX1NOQVBbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAyfTsKLVVDSEFSCUVBUE9MX0xMQ19TTkFQW109IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDhlfTsKLVVDSEFSCUVBUE9MW10gPSB7MHg4OCwgMHg4ZX07Ci1VQ0hBUiAgIFRQSURbXSA9IHsweDgxLCAweDAwfTsgLyogVkxBTiByZWxhdGVkICovCi0KLVVDSEFSCUlQWFtdID0gezB4ODEsIDB4Mzd9OwotVUNIQVIJQVBQTEVfVEFMS1tdID0gezB4ODAsIDB4ZjN9OwotVUNIQVIJUmF0ZUlkVG9QbGNwU2lnbmFsWzEyXSA9IHsKLQkgMCwgLyogUkFURV8xICovCTEsIC8qIFJBVEVfMiAqLwkJMiwgLyogUkFURV81XzUgKi8JMywgLyogUkFURV8xMSAqLwkvLyBzZWUgQkJQIHNwZWMKLQkxMSwgLyogUkFURV82ICovICAgMTUsIC8qIFJBVEVfOSAqLyAgICAxMCwgLyogUkFURV8xMiAqLyAgIDE0LCAvKiBSQVRFXzE4ICovCS8vIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQKLQkgOSwgLyogUkFURV8yNCAqLyAgMTMsIC8qIFJBVEVfMzYgKi8JOCwgLyogUkFURV80OCAqLyAgIDEyICAvKiBSQVRFXzU0ICovIH07IC8vIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQKLQotVUNIQVIJIE9mZG1TaWduYWxUb1JhdGVJZFsxNl0gPSB7Ci0JUkFURV81NCwgIFJBVEVfNTQsCVJBVEVfNTQsICBSQVRFXzU0LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gMCwgIDEsICAyLCAgMyByZXNwZWN0aXZlbHkKLQlSQVRFXzU0LCAgUkFURV81NCwJUkFURV81NCwgIFJBVEVfNTQsCS8vIE9GRE0gUExDUCBTaWduYWwgPSA0LCAgNSwgIDYsICA3IHJlc3BlY3RpdmVseQotCVJBVEVfNDgsICBSQVRFXzI0LAlSQVRFXzEyLCAgUkFURV82LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gOCwgIDksICAxMCwgMTEgcmVzcGVjdGl2ZWx5Ci0JUkFURV81NCwgIFJBVEVfMzYsCVJBVEVfMTgsICBSQVRFXzksCS8vIE9GRE0gUExDUCBTaWduYWwgPSAxMiwgMTMsIDE0LCAxNSByZXNwZWN0aXZlbHkKLX07Ci0KLVVDSEFSCSBPZmRtUmF0ZVRvUnh3aU1DU1sxMl0gPSB7Ci0JMCwgIDAsCTAsICAwLAotCTAsICAxLAkyLCAgMywJLy8gT0ZETSByYXRlIDYsOSwxMiwxOCA9IHJ4d2kgbWNzIDAsMSwyLDMKLQk0LCAgNSwJNiwgIDcsCS8vIE9GRE0gcmF0ZSAyNCwzNiw0OCw1NCA9IHJ4d2kgbWNzIDQsNSw2LDcKLX07Ci1VQ0hBUgkgUnh3aU1DU1RvT2ZkbVJhdGVbMTJdID0gewotCVJBVEVfNiwgIFJBVEVfOSwJUkFURV8xMiwgIFJBVEVfMTgsCi0JUkFURV8yNCwgIFJBVEVfMzYsCVJBVEVfNDgsICBSQVRFXzU0LAkvLyBPRkRNIHJhdGUgNiw5LDEyLDE4ID0gcnh3aSBtY3MgMCwxLDIsMwotCTQsICA1LAk2LCAgNywJLy8gT0ZETSByYXRlIDI0LDM2LDQ4LDU0ID0gcnh3aSBtY3MgNCw1LDYsNwotfTsKLQotY2hhciogICBNQ1NUb01icHNbXSA9IHsiMU1icHMiLCIyTWJwcyIsIjUuNU1icHMiLCIxMU1icHMiLCIwNk1icHMiLCIwOU1icHMiLCIxMk1icHMiLCIxOE1icHMiLCIyNE1icHMiLCIzNk1icHMiLCI0OE1icHMiLCI1NE1icHMiLCJNTS0wIiwiTU0tMSIsIk1NLTIiLCJNTS0zIiwiTU0tNCIsIk1NLTUiLCJNTS02IiwiTU0tNyIsIk1NLTgiLCJNTS05IiwiTU0tMTAiLCJNTS0xMSIsIk1NLTEyIiwiTU0tMTMiLCJNTS0xNCIsIk1NLTE1IiwiTU0tMzIiLCJlZTEiLCJlZTIiLCJlZTMifTsKLQotVUNIQVIgZGVmYXVsdF9jd21pbltdPXtDV19NSU5fSU5fQklUUywgQ1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLTEsIENXX01JTl9JTl9CSVRTLTJ9OwotLy9VQ0hBUiBkZWZhdWx0X2N3bWF4W109e0NXX01BWF9JTl9CSVRTLCBDV19NQVhfSU5fQklUUywgQ1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLTF9OwotVUNIQVIgZGVmYXVsdF9zdGFfYWlmc25bXT17Myw3LDIsMn07Ci0KLVVDSEFSIE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbOF0gPSB7UUlEX0FDX0JFLCBRSURfQUNfQkssIFFJRF9BQ19CSywgUUlEX0FDX0JFLCBRSURfQUNfVkksIFFJRF9BQ19WSSwgUUlEX0FDX1ZPLCBRSURfQUNfVk99OwotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlBUEkgZm9yIE1MTUUgdG8gdHJhbnNtaXQgbWFuYWdlbWVudCBmcmFtZSB0byBBUCAoQlNTIE1vZGUpCi0Jb3Igc3RhdGlvbiAoSUJTUyBNb2RlKQotCi0JQXJndW1lbnRzOgotCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwRGF0YQkJUG9pbnRlciB0byB0aGUgb3V0Z29pbmcgODAyLjExIGZyYW1lCi0JCUxlbmd0aAkJU2l6ZSBvZiBvdXRnb2luZyBtYW5hZ2VtZW50IGZyYW1lCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX0ZBSUxVUkUKLQkJTkRJU19TVEFUVVNfUEVORElORwotCQlORElTX1NUQVRVU19TVUNDRVNTCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfU1RBVFVTIE1pbmlwb3J0TU1SZXF1ZXN0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJUXVlSWR4LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVJTlQJCQlMZW5ndGgpCi17Ci0JUE5ESVNfUEFDS0VUCXBQYWNrZXQ7Ci0JTkRJU19TVEFUVVMJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlVTE9ORwkJCUZyZWVOdW07Ci0JVUNIQVIJCQlydG1wSHdIZHJbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOyAvL1JUTVBfSFdfSERSX0xFTl07Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JdW5zaWduZWQgbG9uZwlJcnFGbGFncyA9IDA7Ci0JVUNIQVIJCQlJcnFTdGF0ZTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQlCT09MRUFOCQkJYlVzZURhdGFRID0gRkFMU0U7Ci0JaW50CQkJcmV0cnlDbnQgPSAwOwotCi0JQVNTRVJUKExlbmd0aCA8PSBNR01UX0RNQV9CVUZGRVJfU0laRSk7Ci0KLQlpZiAoKFF1ZUlkeCAmIE1HTVRfVVNFX1FVRVVFX0ZMQUcpID09IE1HTVRfVVNFX1FVRVVFX0ZMQUcpCi0JewotCQliVXNlRGF0YVEgPSBUUlVFOwotCQlRdWVJZHggJj0gKH5NR01UX1VTRV9RVUVVRV9GTEFHKTsKLQl9Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkvLyAyODYwQyB1c2UgVHggUmluZwotCUlycVN0YXRlID0gcEFkLT5pcnFfZGlzYWJsZWQ7Ci0JaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQotCXsKLQkJUXVlSWR4ID0gKGJVc2VEYXRhUSA9PVRSVUUgPyBRdWVJZHggOiAzKTsKLQkJYlVzZURhdGFRID0gVFJVRTsKLQl9Ci0JaWYgKGJVc2VEYXRhUSAmJiAoIUlycVN0YXRlKSkKLQkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JZG8KLQl7Ci0JCS8vIFJlc2V0IGlzIGluIHByb2dyZXNzLCBzdG9wIGltbWVkaWF0ZWx5Ci0JCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpIHx8Ci0JCQkgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpfHwKLQkJCSAhUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKSkKLQkJewotCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gQ2hlY2sgRnJlZSBwcmlvcml0eSBxdWV1ZQotCQkvLyBTaW5jZSB3ZSB1c2UgUEJGIFF1ZXVlMiBmb3IgbWFuYWdlbWVudCBmcmFtZS4gIEl0cyBjb3JyZXNwb25kaW5nIERNQSByaW5nIHNob3VsZCBiZSB1c2luZyBUeFJpbmcuCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCWlmIChiVXNlRGF0YVEpCi0JCXsKLQkJCXJldHJ5Q250ID0gTUFYX0RBVEFNTV9SRVRSWTsKLQkJCS8vIGZyZWUgVHgoUXVlSWR4KSByZXNvdXJjZXMKLQkJCVJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZShwQWQsIFF1ZUlkeCk7Ci0JCQlGcmVlTnVtID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOwotCQl9Ci0JCWVsc2UKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJewotCQkJRnJlZU51bSA9IEdFVF9NR01UUklOR19GUkVFTk8ocEFkKTsKLQkJfQotCi0JCWlmICgoRnJlZU51bSA+IDApKQotCQl7Ci0JCQkvLyBXZSBuZWVkIHRvIHJlc2VydmUgc3BhY2UgZm9yIHJ0bXAgaGFyZHdhcmUgaGVhZGVyLiBpLmUuLCBUeFdJIGZvciBSVDI4NjAgYW5kIFR4SW5mbytUeFdJIGZvciBSVDI4NzAKLQkJCU5kaXNaZXJvTWVtb3J5KCZydG1wSHdIZHIsIChUWElORk9fU0laRSArIFRYV0lfU0laRSkpOwotCQkJU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwUGFja2V0LCAoUFVDSEFSKSZydG1wSHdIZHIsIChUWElORk9fU0laRSArIFRYV0lfU0laRSksIHBEYXRhLCBMZW5ndGgpOwotCQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiTWluaXBvcnRNTVJlcXVlc3QgKGVycm9yOjogY2FuJ3QgYWxsb2NhdGUgTkRJUyBQQUNLRVQpXG4iKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCS8vcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzI7Ci0KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQkJaWYgKGJVc2VEYXRhUSkKLQkJCXsKLQkJCQlTdGF0dXMgPSBNbG1lRGF0YUhhcmRUcmFuc21pdChwQWQsIFF1ZUlkeCwgcFBhY2tldCk7Ci0JCQkJcmV0cnlDbnQtLTsKLQkJCX0KLQkJCWVsc2UKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJCQlTdGF0dXMgPSBNbG1lSGFyZFRyYW5zbWl0KHBBZCwgUXVlSWR4LCBwUGFja2V0KTsKLQkJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCQlyZXRyeUNudCA9IDA7Ci0JCQllbHNlCi0JCQkJUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgcFBhY2tldCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50Kys7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCQlpZiAoYlVzZURhdGFRKQotCQkJewotCQkJCXJldHJ5Q250LS07Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicmV0cnlDbnQgJWRcbiIsIHJldHJ5Q250KSk7Ci0JCQkJaWYgKHJldHJ5Q250ID09IDApCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJRaWR4KCVkKSwgbm90IGVub3VnaCBzcGFjZSBpbiBEYXRhUmluZywgTWdtdFJpbmdGdWxsQ291bnQ9JWxkIVxuIiwKLQkJCQkJCQkJCQkJUXVlSWR4LCBwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50KSk7Ci0JCQkJfQotCQkJfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUWlkeCglZCksIG5vdCBlbm91Z2ggc3BhY2UgaW4gTWdtdFJpbmcsIE1nbXRSaW5nRnVsbENvdW50PSVsZCFcbiIsCi0JCQkJCQkJCQkJUXVlSWR4LCBwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50KSk7Ci0KLQotCi0JCX0KLQl9IHdoaWxlIChyZXRyeUNudCA+IDApOwotCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlpZiAoYlVzZURhdGFRICYmICghSXJxU3RhdGUpKQotCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCXJldHVybiBTdGF0dXM7Ci19Ci0KLQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKLQlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgdHJhbnNtaXQgZnVuY3Rpb24KLQotCUFyZ3VtZW50czoKLQkJcEFkIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcEJ1ZmZlcgkJUG9pbnRlciB0bwltZW1vcnkgb2Ygb3V0Z29pbmcgZnJhbWUKLQkJTGVuZ3RoCQlTaXplIG9mIG91dGdvaW5nIG1hbmFnZW1lbnQgZnJhbWUKLQotCVJldHVybiBWYWx1ZToKLQkJTkRJU19TVEFUVVNfRkFJTFVSRQotCQlORElTX1NUQVRVU19QRU5ESU5HCi0JCU5ESVNfU1RBVFVTX1NVQ0NFU1MKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKLXsKLQlQQUNLRVRfSU5GTwlQYWNrZXRJbmZvOwotCVBVQ0hBUgkJCXBTcmNCdWZWQTsKLQlVSU5UCQkJU3JjQnVmTGVuOwotCVBIRUFERVJfODAyXzExCXBIZWFkZXJfODAyXzExOwotCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpCi0jaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAotI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KLQkJKQotCXsKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwU3JjQnVmVkEsICZTcmNCdWZMZW4pOwotCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0KLQlwSGVhZGVyXzgwMl8xMSA9IChQSEVBREVSXzgwMl8xMSkgKHBTcmNCdWZWQSArIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKTsKLQotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JaWYgKCBwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCApCi0JCXJldHVybiBNbG1lSGFyZFRyYW5zbWl0VHhSaW5nKHBBZCxRdWVJZHgscFBhY2tldCk7Ci0JZWxzZQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQlyZXR1cm4gTWxtZUhhcmRUcmFuc21pdE1nbXRSaW5nKHBBZCxRdWVJZHgscFBhY2tldCk7Ci0KLX0KLQotCi1ORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0TWdtdFJpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJUXVlSWR4LAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQotewotCVBBQ0tFVF9JTkZPCVBhY2tldEluZm87Ci0JUFVDSEFSCQkJcFNyY0J1ZlZBOwotCVVJTlQJCQlTcmNCdWZMZW47Ci0JUEhFQURFUl84MDJfMTEJcEhlYWRlcl84MDJfMTE7Ci0JQk9PTEVBTgkJCWJBY2tSZXF1aXJlZCwgYkluc2VydFRpbWVzdGFtcDsKLQlVQ0hBUgkJCU1sbWVSYXRlOwotCVBUWFdJX1NUUlVDCXBGaXJzdFR4V0k7Ci0JTUFDX1RBQkxFX0VOVFJZCSpwTWFjRW50cnkgPSBOVUxMOwotCVVDSEFSCQkJUElEOwotCi0JUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwU3JjQnVmVkEsICZTcmNCdWZMZW4pOwotCi0JLy8gTWFrZSBzdXJlIE1HTVQgcmluZyByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMKLQlSVE1QX1NFTV9MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7Ci0JaWYgKHBTcmNCdWZWQSA9PSBOVUxMKQotCXsKLQkJLy8gVGhlIGJ1ZmZlciBzaG91bGRuJ3QgYmUgTlVMTAotCQkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7Ci0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQkvLyBvdXRnb2luZyBmcmFtZSBhbHdheXMgd2FrZXVwIFBIWSB0byBwcmV2ZW50IGZyYW1lIGxvc3QKLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlwRmlyc3RUeFdJID0gKFBUWFdJX1NUUlVDKShwU3JjQnVmVkEgKyAgVFhJTkZPX1NJWkUpOwotCXBIZWFkZXJfODAyXzExID0gKFBIRUFERVJfODAyXzExKSAocFNyY0J1ZlZBICsgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpOyAvL1RYV0lfU0laRSk7Ci0KLQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkKLQl7Ci0JCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKLQl9Ci0JZWxzZQotCXsKLQkJTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKLQl9Ci0KLQkvLyBWZXJpZnkgTWxtZSByYXRlIGZvciBhIC8gZyBiYW5kcy4KLQlpZiAoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSAmJiAoTWxtZVJhdGUgPCBSQVRFXzYpKSAvLyAxMUEgYmFuZAotCQlNbG1lUmF0ZSA9IFJBVEVfNjsKLQotCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkgJiYKLQkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUU9TX05VTEwpKQotCXsKLQkJcE1hY0VudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyXzgwMl8xMS0+QWRkcjEpOwotCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQkvLyBGaXhlZCBXNTIgd2l0aCBBY3Rpdml0eSBzY2FuIGlzc3VlIGluIEFCR19NSVhFRCBhbmQgQUJHTl9NSVhFRCBtb2RlLgotCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCXx8IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRAotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkpCi0JCXsKLQkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IDE7Ci0JCQllbHNlCi0JCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSAwOwotCQl9Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JLy8KLQkvLyBTaG91bGQgbm90IGJlIGhhcmQgY29kZSB0byBzZXQgUHdyTWdtdCB0byAwIChQV1JfQUNUSVZFKQotCS8vIFNuaWNlIGl0J3MgYmVlbiBzZXQgdG8gMCB3aGlsZSBvbiBNZ3RNYWNIZWFkZXJJbml0Ci0JLy8gQnkgdGhlIHdheSB0aGlzIHdpbGwgY2F1c2UgZnJhbWUgdG8gYmUgc2VuZCBvbiBQV1JfU0FWRSBmYWlsZWQuCi0JLy8KLQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9BQ1RJVkU7IC8vIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JLy8KLQkvLyBJbiBXTU0tVUFQU0QsIG1sbWUgZnJhbWUgc2hvdWxkIGJlIHNldCBwc20gYXMgcG93ZXIgc2F2aW5nIGJ1dCBwcm9iZSByZXF1ZXN0IGZyYW1lCi0JLy8gRGF0YS1OdWxsIHBhY2tldHMgYWxzZSBwYXNzIHRocm91Z2ggTU1SZXF1ZXN0IGluIFJUMjg2MCwgaG93ZXZlciwgd2UgaG9wZSBjb250cm9sIHRoZSBwc20gYml0IHRvIHBhc3MgQVBTRAotLy8JaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSAhPSBCVFlQRV9EQVRBKSAmJiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgIT0gQlRZUEVfQ05UTCkpCi0JewotCQlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQUNUSU9OKSB8fAotCQkJKChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBKSAmJgotCQkJKChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1FPU19OVUxMKSB8fAotCQkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfTlVMTF9GVU5DKSkpKQotCQl7Ci0JCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQotCQkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7Ci0JCQllbHNlCi0JCQkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlOwotCQl9Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQotCi0KLQliSW5zZXJ0VGltZXN0YW1wID0gRkFMU0U7Ci0JaWYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0NOVEwpIC8vIG11c3QgYmUgUFMtUE9MTAotCXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJLy9TZXQgUE0gYml0IGluIHBzLXBvbGwsIHRvIGZpeCBXTEsgMS4yICBQb3dlclNhdmVNb2RlX2V4dCBmYWlsdXJlIGlzc3VlLgotCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BTX1BPTEwpKQotCQl7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCWJBY2tSZXF1aXJlZCA9IEZBTFNFOwotCX0KLQllbHNlIC8vIEJUWVBFX01HTVQgb3IgQlRZUEVfREFUQShtdXN0IGJlIE5VTEwgZnJhbWUpCi0JewotCQkvL3BBZC0+U2VxdWVuY2UrKzsKLQkJLy9wSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlNlcXVlbmNlOwotCi0JCWlmIChwSGVhZGVyXzgwMl8xMS0+QWRkcjFbMF0gJiAweDAxKSAvLyBNVUxUSUNBU1QsIEJST0FEQ0FTVAotCQl7Ci0JCQliQWNrUmVxdWlyZWQgPSBGQUxTRTsKLQkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IDA7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQliQWNrUmVxdWlyZWQgPSBUUlVFOwotCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gUlRNUENhbGNEdXJhdGlvbihwQWQsIE1sbWVSYXRlLCAxNCk7Ci0JCQlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUlNQKSAmJiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfTUdNVCkpCi0JCQl7Ci0JCQkJYkluc2VydFRpbWVzdGFtcCA9IFRSVUU7Ci0JCQkJYkFja1JlcXVpcmVkID0gRkFMU0U7IC8vIERpc2FibGUgQUNLIHRvIHByZXZlbnQgcmV0cnkgMHgxZiBmb3IgUHJvYmUgUmVzcG9uc2UKLQkJCX0KLQkJCWVsc2UgaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BST0JFX1JFUSkgJiYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX01HTVQpKQotCQkJewotCQkJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOyAvLyBEaXNhYmxlIEFDSyB0byBwcmV2ZW50IHJldHJ5IDB4MWYgZm9yIFByb2JlIFJlcXVlc3QKLQkJCX0KLQkJfQotCX0KLQotCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2UrKzsKLQlpZiAocEFkLT5TZXF1ZW5jZSA+MHhmZmYpCi0JCXBBZC0+U2VxdWVuY2UgPSAwOwotCi0JLy8gQmVmb3JlIHJhZGFyIGRldGVjdGlvbiBkb25lLCBtZ210IGZyYW1lIGNhbiBub3QgYmUgc2VudCBidXQgcHJvYmUgcmVxCi0JLy8gQmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSBwcm9iZSByZXEgdG8gdHJpZ2dlciBkcml2ZXIgdG8gc2VuZCBwcm9iZSByZXEgaW4gcGFzc2l2ZSBzY2FuCi0JaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSAhPSBTVUJUWVBFX1BST0JFX1JFUSkKLQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCi0JCSYmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJNbG1lSGFyZFRyYW5zbWl0IC0tPiByYWRhciBkZXRlY3Qgbm90IGluIG5vcm1hbCBtb2RlICEhIVxuIikpOwotLy8JCWlmICghSXJxU3RhdGUpCi0JCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NZ210UmluZ0xvY2spOwotCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBIZWFkZXJfODAyXzExLCBESVJfV1JJVEUsIEZBTFNFKTsKLSNlbmRpZgotCi0JLy8KLQkvLyBmaWxsIHNjYXR0ZXItYW5kLWdhdGhlciBidWZmZXIgbGlzdCBpbnRvIFRYRC4gSW50ZXJuYWxseSBjcmVhdGVkIE5ESVMgUEFDS0VUCi0JLy8gc2hvdWxkIGFsd2F5cyBoYXMgb25seSBvbmUgcGh5c2ljYWwgYnVmZmVyLCBhbmQgdGhlIHdob2xlIGZyYW1lIHNpemUgZXF1YWxzCi0JLy8gdG8gdGhlIGZpcnN0IHNjYXR0ZXIgYnVmZmVyIHNpemUKLQkvLwotCi0JLy8gSW5pdGlhbGl6ZSBUWCBEZXNjcmlwdG9yCi0JLy8gRm9yIGludGVyLWZyYW1lIGdhcCwgdGhlIG51bWJlciBpcyBmb3IgdGhpcyBmcmFtZSBhbmQgbmV4dCBmcmFtZQotCS8vIEZvciBNTE1FIHJhdGUsIHdlIHdpbGwgZml4IGFzIDJNYiB0byBtYXRjaCBvdGhlciB2ZW5kb3IncyBpbXBsZW1lbnQKLS8vCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gMTsKLQotLy8gbWFuYWdlbWVudCBmcmFtZSBkb2Vzbid0IG5lZWQgZW5jcnlwdGlvbi4gc28gdXNlIFJFU0VSVkVEX1dDSUQgbm8gbWF0dGVyIHUgYXJlIHNlbmRpbmcgdG8gc3BlY2lmaWMgd2NpZCBvciBub3QuCi0JUElEID0gUElEX01HTVQ7Ci0KLQotCWlmIChwTWFjRW50cnkgPT0gTlVMTCkKLQl7Ci0JCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsIGJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAotCQkwLCBSRVNFUlZFRF9XQ0lELCAoU3JjQnVmTGVuIC0gVFhJTkZPX1NJWkUgLSBUWFdJX1NJWkUpLCBQSUQsIDAsICAoVUNIQVIpcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUywgSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKLQl9Ci0JZWxzZQotCXsKLQkJLyogZG9udCB1c2UgbG93IHJhdGUgdG8gc2VuZCBRb1MgTnVsbCBkYXRhIGZyYW1lICovCi0JCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsCi0JCQkJCWJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAotCQkJCQkwLCBwTWFjRW50cnktPkFpZCwgKFNyY0J1ZkxlbiAtIFRYSU5GT19TSVpFIC0gVFhXSV9TSVpFKSwKLQkJCQkJcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLCAwLAotCQkJCQkoVUNIQVIpcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLAotCQkJCQlJRlNfQkFDS09GRiwgRkFMU0UsICZwTWFjRW50cnktPk1heEhUUGh5TW9kZSk7Ci0JfQotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBGaXJzdFR4V0ksIFRZUEVfVFhXSSk7Ci0jZW5kaWYKLQotCS8vIE5vdyBkbyBoYXJkd2FyZS1kZXBlbmVkIGtpY2sgb3V0LgotCUhBTF9LaWNrT3V0TWdtdFR4KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1Zkxlbik7Ci0KLQkvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBNR01UIHJpbmcgcmVzb3VyY2UKLS8vCWlmICghSXJxU3RhdGUpCi0JCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NZ210UmluZ0xvY2spOwotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTmV3IERlUXVldWUgUHJvY2VkdXJlcy4KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIERFUVVFVUVfTE9DSyhsb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpCQkJCVwKLQkJCWRvewkJCQkJCQkJCQkJCQlcCi0JCQkJaWYgKGJJbnRDb250ZXh0ID09IEZBTFNFKQkJCQkJCVwKLQkJCQlSVE1QX0lSUV9MT0NLKChsb2NrKSwgSXJxRmxhZ3MpOwkJXAotCQkJfXdoaWxlKDApCi0KLSNkZWZpbmUgREVRVUVVRV9VTkxPQ0sobG9jaywgYkludENvbnRleHQsIElycUZsYWdzKQkJCQlcCi0JCQlkb3sJCQkJCQkJCQkJCQkJXAotCQkJCWlmIChiSW50Q29udGV4dCA9PSBGQUxTRSkJCQkJCQlcCi0JCQkJCVJUTVBfSVJRX1VOTE9DSygobG9jayksIElycUZsYWdzKTsJXAotCQkJfXdoaWxlKDApCi0KLQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JVHggUGF0aCBkZXNpZ24gYWxnb3JpdGhtOgotCQlCYXNpY2FsbHksIHdlIGRpdmlkZSB0aGUgcGFja2V0cyBpbnRvIGZvdXIgdHlwZXMsIEJyb2FkY2FzdC9NdWx0aWNhc3QsIDExTiBSYXRlKEFNUERVLCBBTVNEVSwgTm9ybWFsKSwgQi9HIFJhdGUoQVJBTElOSywgTm9ybWFsKSwKLQkJU3BlY2lmaWMgUGFja2V0IFR5cGUuIEZvbGxvd2luZyBzaG93IHRoZSBjbGFzc2lmaWNhdGlvbiBydWxlIGFuZCBwb2xpY3kgZm9yIGVhY2gga2luZHMgb2YgcGFja2V0cy4KLQkJCQlDbGFzc2lmaWNhdGlvbiBSdWxlPT4KLQkJCQkJTXVsdGljYXN0OiAoKmFkZHIxICYgMHgwMSkgPT0gMHgwMQotCQkJCQlTcGVjaWZpYyA6IGJESENQRnJhbWUsIGJBUlBGcmFtZSwgYkVBUE9MRnJhbWUsIGV0Yy4KLQkJCQkJMTFOIFJhdGUgOiBJZiBwZWVyIHN1cHBvcnQgSFQKLQkJCQkJCQkJKDEpLkFNUERVICAtLSBJZiBUWEJBIGlzIG5lZ290aWF0ZWQuCi0JCQkJCQkJCSgyKS5BTVNEVSAgLS0gSWYgQU1TRFUgaXMgY2FwYWJsZSBmb3IgYm90aCBwZWVyIGFuZCBvdXJzZWxmLgotCQkJCQkJCQkJCQkqKS4gQU1TRFUgY2FuIGVtYmVkZGVkIGluIGEgQU1QRFUsIGJ1dCBub3cgd2UgZGlkbid0IHN1cHBvcnQgaXQuCi0JCQkJCQkJCSgzKS5Ob3JtYWwgLS0gT3RoZXIgcGFja2V0cyB3aGljaCBzZW5kIGFzIDExbiByYXRlLgotCi0JCQkJCUIvRyBSYXRlIDogSWYgcGVlciBpcyBiL2cgb25seS4KLQkJCQkJCQkJKDEpLkFSQUxJTkstLSBJZiBib3RoIG9mIHBlZXIvdXMgc3VwcHJvdCBSYWxpbmsgcHJvcHJpZXRhcnkgQWdncmVnYXRpb24gYW5kIHRoZSBUeFJhdGUgaXMgbGFyZ2UgdGhhbiBSQVRFXzYKLQkJCQkJCQkJKDIpLk5vcm1hbCAtLSBPdGhlciBwYWNrZXRzIHdoaWNoIHNlbmQgYXMgYi9nIHJhdGUuCi0JCQkJCUZyYWdtZW50OgotCQkJCQkJCQlUaGUgcGFja2V0IG11c3QgYmUgdW5pY2FzdCwgTk9UIEEtUkFMSU5LLCBOT1QgQS1NU0RVLCBOT1QgMTFuLCB0aGVuIGNhbiBjb25zaWRlciBhYm91dCBmcmFnbWVudC4KLQotCQkJCUNsYXNzaWZpZWQgUGFja2V0IEhhbmRsZSBSdWxlPT4KLQkJCQkJTXVsdGljYXN0OgotCQkJCQkJCQlObyBBQ0ssCQkJLy9wVHhCbGstPmJBY2tSZXF1aXJlZCA9IEZBTFNFOwotCQkJCQkJCQlObyBXTU0sCQkJLy9wVHhCbGstPmJXTU0gPSBGQUxTRTsKLQkJCQkJCQkJTm8gcGlnZ3liYWNrLCAgIC8vcFR4QmxrLT5iUGlnZ3lCYWNrID0gRkFMU0U7Ci0JCQkJCQkJCUZvcmNlIExvd1JhdGUsICAvL3BUeEJsay0+YkZvcmNlTG93UmF0ZSA9IFRSVUU7Ci0JCQkJCVNwZWNpZmljIDoJQmFzaWNhbGx5LCBmb3Igc3BlY2lmaWMgcGFja2V0LCB3ZSBzaG91bGQgaGFuZGxlIGl0IHNwZWNpZmljYWxseSwgYnV0IG5vdyBhbGwgc3BlY2lmaWMgcGFja2V0cyBhcmUgdXNlCi0JCQkJCQkJCQl0aGUgc2FtZSBwb2xpY3kgdG8gaGFuZGxlIGl0LgotCQkJCQkJCQlGb3JjZSBMb3dSYXRlLCAgLy9wVHhCbGstPmJGb3JjZUxvd1JhdGUgPSBUUlVFOwotCi0JCQkJCTExTiBSYXRlIDoKLQkJCQkJCQkJTm8gcGlnZ3liYWNrLAkvL3BUeEJsay0+YlBpZ2d5QmFjayA9IEZBTFNFOwotCi0JCQkJCQkJCSgxKS5BTVNEVQotCQkJCQkJCQkJcFR4QmxrLT5iV01NID0gVFJVRTsKLQkJCQkJCQkJKDIpLkFNUERVCi0JCQkJCQkJCQlwVHhCbGstPmJXTU0gPSBUUlVFOwotCQkJCQkJCQkoMykuTm9ybWFsCi0KLQkJCQkJQi9HIFJhdGUgOgotCQkJCQkJCQkoMSkuQVJBTElOSwotCi0JCQkJCQkJCSgyKS5Ob3JtYWwKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgVUNIQVIgVHhQa3RDbGFzc2lmaWNhdGlvbigKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBQTkRJU19QQUNLRVQgIHBQYWNrZXQpCi17Ci0JVUNIQVIJCQlUeEZyYW1lVHlwZSA9IFRYX1VOS09XTl9GUkFNRTsKLQlVQ0hBUgkJCVdjaWQ7Ci0JTUFDX1RBQkxFX0VOVFJZCSpwTWFjRW50cnkgPSBOVUxMOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCUJPT0xFQU4JCQliSFRSYXRlID0gRkFMU0U7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlXY2lkID0gUlRNUF9HRVRfUEFDS0VUX1dDSUQocFBhY2tldCk7Ci0JaWYgKFdjaWQgPT0gTUNBU1RfV0NJRCkKLQl7CS8vIEhhbmRsZSBmb3IgUkEgaXMgQnJvYWRjYXN0L011bHRpY2FzdCBBZGRyZXNzLgotCQlyZXR1cm4gVFhfTUNBU1RfRlJBTUU7Ci0JfQotCi0JLy8gSGFuZGxlIGZvciB1bmljYXN0IHBhY2tldHMKLQlwTWFjRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXTsKLQlpZiAoUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUocFBhY2tldCkpCi0JewkvLyBJdCdzIGEgc3BlY2lmaWMgcGFja2V0IG5lZWQgdG8gZm9yY2UgbG93IHJhdGUsIGkuZS4sIGJESENQRnJhbWUsIGJFQVBPTEZyYW1lLCBiV0FJRnJhbWUKLQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7Ci0JfQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCWVsc2UgaWYgKElTX0hUX1JBVEUocE1hY0VudHJ5KSkKLQl7CS8vIGl0J3MgYSAxMW4gY2FwYWJsZSBwYWNrZXQKLQotCQkvLyBEZXBlbmRzIG9uIEhUUGh5TW9kZSB0byBjaGVjayBpZiB0aGUgcGVlciBzdXBwb3J0IHRoZSBIVFJhdGUgdHJhbnNtaXNzaW9uLgotCQkvLwlDdXJyZW50bHkgZGlkbid0IHN1cHBvcnQgQS1NU0RVIGVtYmVkZGVkIGluIEEtTVBEVQotCQliSFRSYXRlID0gVFJVRTsKLQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSB8fCAocE1hY0VudHJ5LT5Qc01vZGUgPT0gUFdSX1NBVkUpKQotCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7Ci0jaWZkZWYgVUFQU0RfQVBfU1VQUE9SVAotCQllbHNlIGlmIChSVE1QX0dFVF9QQUNLRVRfRU9TUChwUGFja2V0KSkKLQkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOwotI2VuZGlmIC8vIFVBUFNEX0FQX1NVUFBPUlQgLy8KLQkJZWxzZSBpZigocE1hY0VudHJ5LT5UWEJBYml0bWFwICYgKDE8PChSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCkpKSkgIT0gMCkKLQkJCXJldHVybiBUWF9BTVBEVV9GUkFNRTsKLQkJZWxzZSBpZihDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCkpCi0JCQlyZXR1cm4gVFhfQU1TRFVfRlJBTUU7Ci0JCWVsc2UKLQkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOwotCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQllbHNlCi0JewkvLyBpdCdzIGEgbGVnYWN5IGIvZyBwYWNrZXQuCi0JCWlmICgoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKSAmJiBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSAmJgotCQkJKFJUTVBfR0VUX1BBQ0tFVF9UWFJBVEUocFBhY2tldCkgPj0gUkFURV82KSAmJgotCQkJKCEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkpKQotCQl7CS8vIGlmIHBlZXIgc3VwcG9ydCBSYWxpbmsgQWdncmVnYXRpb24sIHdlIHVzZSBpdC4KLQkJCVR4RnJhbWVUeXBlID0gVFhfUkFMSU5LX0ZSQU1FOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7Ci0JCX0KLQl9Ci0KLQkvLyBDdXJyZW50bHksIG91ciBmcmFnbWVudCBvbmx5IHN1cHBvcnQgd2hlbiBhIHVuaWNhc3QgcGFja2V0IHNlbmQgYXMgTk9ULUFSQUxJTkssIE5PVC1BTVNEVSBhbmQgTk9ULUFNUERVLgotCWlmICgoUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KSA+IDEpICYmIChUeEZyYW1lVHlwZSA9PSBUWF9MRUdBQ1lfRlJBTUUpKQotCQlUeEZyYW1lVHlwZSA9IFRYX0ZSQUdfRlJBTUU7Ci0KLQlyZXR1cm4gVHhGcmFtZVR5cGU7Ci19Ci0KLQotQk9PTEVBTiBSVE1QX0ZpbGxUeEJsa0luZm8oCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVFhfQkxLICpwVHhCbGspCi17Ci0JUEFDS0VUX0lORk8JCQlQYWNrZXRJbmZvOwotCVBORElTX1BBQ0tFVAkJcFBhY2tldDsKLQlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeSA9IE5VTEw7Ci0KLQlwUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OwotCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAmcFR4QmxrLT5TcmNCdWZMZW4pOwotCi0JcFR4QmxrLT5XY2lkCQkJCT0gUlRNUF9HRVRfUEFDS0VUX1dDSUQocFBhY2tldCk7Ci0JcFR4QmxrLT5hcGlkeAkJCQk9IFJUTVBfR0VUX1BBQ0tFVF9JRihwUGFja2V0KTsKLQlwVHhCbGstPlVzZXJQcmlvcml0eQkJPSBSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCk7Ci0JcFR4QmxrLT5GcmFtZUdhcCA9IElGU19IVFRYT1A7CQkvLyBBU0lDIGRldGVybWluZSBGcmFtZSBHYXAKLQotCWlmIChSVE1QX0dFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBUeEJsay0+cFBhY2tldCkpCi0JCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iQ2xlYXJFQVBGcmFtZSk7Ci0JZWxzZQotCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQ2xlYXJFQVBGcmFtZSk7Ci0KLQkvLyBEZWZhdWx0IHRvIGNsZWFyIHRoaXMgZmxhZwotCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JGb3JjZU5vblFvUyk7Ci0KLQotCWlmIChwVHhCbGstPldjaWQgPT0gTUNBU1RfV0NJRCkKLQl7Ci0JCXBUeEJsay0+cE1hY0VudHJ5ID0gTlVMTDsKLQkJewotI2lmZGVmIE1DQVNUX1JBVEVfU1BFQ0lGSUMKLQkJCVBVQ0hBUiBwREEgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7Ci0JCQlpZiAoKCgqcERBICYgMHgwMSkgPT0gMHgwMSkgJiYgKCpwREEgIT0gMHhmZikpCi0JCQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcEFkLT5Db21tb25DZmcuTUNhc3RQaHlNb2RlOwotCQkJZWxzZQotI2VuZGlmIC8vIE1DQVNUX1JBVEVfU1BFQ0lGSUMgLy8KLQkJCQlwVHhCbGstPnBUcmFuc21pdCA9ICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZTsKLQkJfQotCi0JCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CS8vIEFja1JlcXVpcmVkID0gRkFMU0UsIHdoZW4gYnJvYWRjYXN0IHBhY2tldCBpbiBBZGhvYyBtb2RlLgotCQkvL1RYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VMb3dSYXRlKTsKLQkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkFsbG93RnJhZyk7Ci0JCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JXTU0pOwotCQlpZiAoUlRNUF9HRVRfUEFDS0VUX01PUkVEQVRBKHBQYWNrZXQpKQotCQl7Ci0JCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYk1vcmVEYXRhKTsKLQkJfQotCi0JfQotCWVsc2UKLQl7Ci0JCXBUeEJsay0+cE1hY0VudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcFR4QmxrLT5XY2lkXTsKLQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcFR4QmxrLT5wTWFjRW50cnktPkhUUGh5TW9kZTsKLQotCQlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKLQotCi0JCS8vIEZvciBhbGwgdW5pY2FzdCBwYWNrZXRzLCBuZWVkIEFjayB1bmxlc3MgdGhlIEFjayBQb2xpY3kgaXMgbm90IHNldCBhcyBOT1JNQUxfQUNLLgotCQlpZiAocEFkLT5Db21tb25DZmcuQWNrUG9saWN5W3BUeEJsay0+UXVlSWR4XSAhPSBOT1JNQUxfQUNLKQotCQkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkFja1JlcXVpcmVkKTsKLQkJZWxzZQotCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgotCQkJKEFESE9DX09OKHBBZCkpICYmCi0JCQkoUlhfRklMVEVSX1RFU1RfRkxBRyhwQWQsIGZSWF9GSUxURVJfQUNDRVBUX1BST01JU0NVT1VTKSkpCi0JCXsKLQkJCWlmKHBBZC0+Q29tbW9uQ2ZnLlBTUFhsaW5rKQotCQkJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCQl7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQl7Ci0KLQkJCQkvLyBJZiBzdXBwb3J0IFdNTSwgZW5hYmxlIGl0LgotCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmCi0JCQkJCUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKQotCQkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSk7Ci0KLS8vCQkJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCkKLS8vCQkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfQXV0b1JhdGVTd2l0Y2gpOwotCQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQl9Ci0KLQkJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfTEVHQUNZX0ZSQU1FKQotCQl7Ci0JCQlpZiAoIChSVE1QX0dFVF9QQUNLRVRfTE9XUkFURShwUGFja2V0KSkgfHwKLSAgICAgICAgICAgICAgICAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgJiYgKHBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9DQ0spICYmIChwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gUkFURV8xKSkpCi0JCQl7CS8vIFNwZWNpZmljIHBhY2tldCwgaS5lLiwgYkRIQ1BGcmFtZSwgYkVBUE9MRnJhbWUsIGJXQUlGcmFtZSwgbmVlZCBmb3JjZSBsb3cgcmF0ZS4KLQkJCQlwVHhCbGstPnBUcmFuc21pdCA9ICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCQkvLyBNb2RpZnkgdGhlIFdNTSBiaXQgZm9yIElDViBpc3N1ZS4gSWYgd2UgaGF2ZSBhIHBhY2tldCB3aXRoIEVPU1AgZmllbGQgbmVlZCB0byBzZXQgYXMgMSwgaG93IHRvIGhhbmRsZSBpdD8/PwotCQkJCWlmIChJU19IVF9TVEEocFR4QmxrLT5wTWFjRW50cnkpICYmCi0JCQkJCShDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKSkgJiYKLQkJCQkJKChwQWQtPkNvbW1vbkNmZy5iUmRnID09IFRSVUUpICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpKSkKLQkJCQl7Ci0JCQkJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JXTU0pOwotCQkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTm9uUW9TKTsKLQkJCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQl9Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCWlmICggKElTX0hUX1JBVEUocE1hY0VudHJ5KSA9PSBGQUxTRSkgJiYKLQkJCQkoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19QSUdHWUJBQ0tfQ0FQQUJMRSkpKQotCQkJewkvLyBDdXJyZW50bHkgcGlnZ3ktYmFjayBvbmx5IHN1cHBvcnQgd2hlbiBwZWVyIGlzIG9wZXJhdGUgaW4gYi9nIG1vZGUuCi0JCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JQaWdneUJhY2spOwotCQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCQlpZiAoUlRNUF9HRVRfUEFDS0VUX01PUkVEQVRBKHBQYWNrZXQpKQotCQkJewotCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iTW9yZURhdGEpOwotCQkJfQotI2lmZGVmIFVBUFNEX0FQX1NVUFBPUlQKLQkJCWlmIChSVE1QX0dFVF9QQUNLRVRfRU9TUChwUGFja2V0KSkKLQkJCXsKLQkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYldNTV9VQVBTRF9FT1NQKTsKLQkJCX0KLSNlbmRpZiAvLyBVQVBTRF9BUF9TVVBQT1JUIC8vCi0JCX0KLQkJZWxzZSBpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9GUkFHX0ZSQU1FKQotCQl7Ci0JCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkFsbG93RnJhZyk7Ci0JCX0KLQotCQlwTWFjRW50cnktPkRlYnVnVHhDb3VudCsrOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLUJPT0xFQU4gQ2FuRG9BZ2dyZWdhdGVUcmFuc21pdCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBORElTX1BBQ0tFVCAqcFBhY2tldCwKLQlJTiBUWF9CTEsJCSpwVHhCbGspCi17Ci0KLQkvL0RCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoZWNrIGlmIGNhbiBkbyBhZ2dyZWdhdGlvbiEgVHhGcmFtZVR5cGU9JWQhXG4iLCBwVHhCbGstPlR4RnJhbWVUeXBlKSk7Ci0KLQlpZiAoUlRNUF9HRVRfUEFDS0VUX1dDSUQocFBhY2tldCkgPT0gTUNBU1RfV0NJRCkKLQkJcmV0dXJuIEZBTFNFOwotCi0JaWYgKFJUTVBfR0VUX1BBQ0tFVF9ESENQKHBQYWNrZXQpIHx8Ci0JCVJUTVBfR0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0KSB8fAotCQlSVE1QX0dFVF9QQUNLRVRfV0FJKHBQYWNrZXQpKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlpZiAoKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1TRFVfRlJBTUUpICYmCi0JCSgocFR4QmxrLT5Ub3RhbEZyYW1lTGVuICsgR0VUX09TX1BLVF9MRU4ocFBhY2tldCkpPiAoUlhfQlVGRkVSX0FHR1JFU0laRSAtIDEwMCkpKQotCXsJLy8gRm9yIEFNU0RVLCBhbGxvdyB0aGUgcGFja2V0cyB3aXRoIHRvdGFsIGxlbmd0aCA8IG1heC1hbXNkdSBzaXplCi0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlpZiAoKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfUkFMSU5LX0ZSQU1FKSAmJgotCQkocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyID09IDIpKQotCXsJLy8gRm9yIFJBTElOSy1BZ2dyZWdhdGlvbiwgYWxsb3cgdHdvIGZyYW1lcyBpbiBvbmUgYmF0Y2guCi0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlpZiAoKElORlJBX09OKHBBZCkpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkgLy8gbXVzdCBiZSB1bmljYXN0IHRvIEFQCi0JCXJldHVybiBUUlVFOwotCWVsc2UKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJcmV0dXJuIEZBTFNFOwotCi19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVRvIGRvIHRoZSBlbnF1ZXVlIG9wZXJhdGlvbiBhbmQgZXh0cmFjdCB0aGUgZmlyc3QgaXRlbSBvZiB3YWl0aW5nCi0JCWxpc3QuIElmIGEgbnVtYmVyIG9mIGF2YWlsYWJsZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnRzIGNvdWxkIG1lZXQKLQkJdGhlIHJlcXVlc3Qgb2YgZXh0cmFjdGVkIGl0ZW0sIHRoZSBleHRyYWN0ZWQgaXRlbSB3aWxsIGJlIGZyYWdtZW50ZWQKLQkJaW50byBzaGFyZWQgbWVtb3J5IHNlZ21lbnRzLgotCi0JQXJndW1lbnRzOgotCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwUXVldWUJCVBvaW50ZXIgdG8gV2FpdGluZyBRdWV1ZQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBEZVF1ZXVlUGFja2V0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBCT09MRUFOICAgICAgICAgYkludENvbnRleHQsCi0JSU4gIFVDSEFSCQkJUUlkeCwgLyogQnVsa091dFBpcGVJZCAqLwotCUlOICBVQ0hBUiAgICAgICAgICAgTWF4X1R4X1BhY2tldHMpCi17Ci0JUFFVRVVFX0VOVFJZICAgIHBFbnRyeSA9IE5VTEw7Ci0JUE5ESVNfUEFDS0VUCXBQYWNrZXQ7Ci0JTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JVUNIQVIgICAgICAgICAgIENvdW50PTA7Ci0JUFFVRVVFX0hFQURFUiAgIHBRdWV1ZTsKLQlVTE9ORyAgICAgICAgICAgRnJlZU51bWJlcltOVU1fT0ZfVFhfUklOR107Ci0JVUNIQVIJCQlRdWVJZHgsIHNRSWR4LCBlUUlkeDsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzID0gMDsKLQlCT09MRUFOCQkJaGFzVHhEZXNjID0gRkFMU0U7Ci0JVFhfQkxLCQkJVHhCbGs7Ci0JVFhfQkxLCQkJKnBUeEJsazsKLQotI2lmZGVmIERCR19ESUFHTk9TRQotCUJPT0xFQU4JCQlmaXJzdFJvdW5kOwotCVJ0bXBEaWFnU3RydWN0CSpwRGlhZ1N0cnVjdCA9ICZwQWQtPkRpYWdTdHJ1Y3Q7Ci0jZW5kaWYKLQotCi0JaWYgKFFJZHggPT0gTlVNX09GX1RYX1JJTkcpCi0JewotCQlzUUlkeCA9IDA7Ci0JCWVRSWR4ID0gMzsJLy8gNCBBQ3MsIHN0YXJ0IGZyb20gMC4KLQl9Ci0JZWxzZQotCXsKLQkJc1FJZHggPSBlUUlkeCA9IFFJZHg7Ci0JfQotCi0JZm9yIChRdWVJZHg9c1FJZHg7IFF1ZUlkeCA8PSBlUUlkeDsgUXVlSWR4KyspCi0JewotCQlDb3VudD0wOwotCi0JCVJUTVBfU1RBUlRfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOwotCi0jaWZkZWYgREJHX0RJQUdOT1NFCi0JCWZpcnN0Um91bmQgPSAoKFF1ZUlkeCA9PSAwKSA/IFRSVUUgOiBGQUxTRSk7Ci0jZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCi0KLQkJd2hpbGUgKDEpCi0JCXsKLQkJCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAotCQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKQotCQkJewotCQkJCVJUTVBfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBJcnFGbGFncyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoQ291bnQgPj0gTWF4X1R4X1BhY2tldHMpCi0JCQkJYnJlYWs7Ci0KLQkJCURFUVVFVUVfTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKLQkJCWlmICgmcEFkLT5UeFN3UXVldWVbUXVlSWR4XSA9PSBOVUxMKQotCQkJewotI2lmZGVmIERCR19ESUFHTk9TRQotCQkJCWlmIChmaXJzdFJvdW5kID09IFRSVUUpCi0JCQkJCXBEaWFnU3RydWN0LT5UeFNXUXVlQ250W3BEaWFnU3RydWN0LT5BcnJheUN1cklkeF1bMF0rKzsKLSNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KLQkJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKLQkJCQlicmVhazsKLQkJCX0KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQkJRnJlZU51bWJlcltRdWVJZHhdID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOwotCi0jaWZkZWYgREJHX0RJQUdOT1NFCi0JCQlpZiAoZmlyc3RSb3VuZCA9PSBUUlVFKQotCQkJewotCQkJCVVDSEFSCXR4RGVzY051bUxldmVsLCB0eFN3UU51bUxldmVsOwotCi0JCQkJdHhEZXNjTnVtTGV2ZWwgPSAoVFhfUklOR19TSVpFIC0gRnJlZU51bWJlcltRdWVJZHhdKTsgLy8gTnVtYmVyIG9mIG9jY3VwaWVkIGh3IGRlc2MuCi0JCQkJdHhEZXNjTnVtTGV2ZWwgPSAoKHR4RGVzY051bUxldmVsIDw9MTUpID8gdHhEZXNjTnVtTGV2ZWwgOiAxNSk7Ci0JCQkJcERpYWdTdHJ1Y3QtPlR4RGVzY0NudFtwRGlhZ1N0cnVjdC0+QXJyYXlDdXJJZHhdW3R4RGVzY051bUxldmVsXSsrOwotCi0JCQkJdHhTd1FOdW1MZXZlbCA9ICgocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPD03KSA/IHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyIDogOCk7Ci0JCQkJcERpYWdTdHJ1Y3QtPlR4U1dRdWVDbnRbcERpYWdTdHJ1Y3QtPkFycmF5Q3VySWR4XVt0eFN3UU51bUxldmVsXSsrOwotCi0JCQkJZmlyc3RSb3VuZCA9IEZBTFNFOwotCQkJfQotI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLwotCi0JCQlpZiAoRnJlZU51bWJlcltRdWVJZHhdIDw9IDUpCi0JCQl7Ci0JCQkJLy8gZnJlZSBUeChRdWVJZHgpIHJlc291cmNlcwotCQkJCVJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZShwQWQsIFF1ZUlkeCk7Ci0JCQkJRnJlZU51bWJlcltRdWVJZHhdID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOwotCQkJfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JCQkvLyBwcm9iZSB0aGUgUXVldWUgSGVhZAotCQkJcFF1ZXVlID0gJnBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF07Ci0JCQlpZiAoKHBFbnRyeSA9IHBRdWV1ZS0+SGVhZCkgPT0gTlVMTCkKLQkJCXsKLQkJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJcFR4QmxrID0gJlR4QmxrOwotCQkJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUilwVHhCbGssIHNpemVvZihUWF9CTEspKTsKLQkJCS8vSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CQkvLyBEaWRuJ3QgbmVlZCBpdCBiZWNhdXNlIHdlIGFscmVhZHkgbWVtemVybyBpdC4KLQkJCXBUeEJsay0+UXVlSWR4ID0gUXVlSWR4OwotCi0JCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7Ci0KLQotCQkJLy8gRWFybHkgY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhdmUgZW5vZ3VoIFR4IFJlc291cmNlLgotCQkJaGFzVHhEZXNjID0gUlRNUF9IQVNfRU5PVUdIX0ZSRUVfREVTQyhwQWQsIHBUeEJsaywgRnJlZU51bWJlcltRdWVJZHhdLCBwUGFja2V0KTsKLQkJCWlmICghaGFzVHhEZXNjKQotCQkJewotCQkJCXBBZC0+UHJpdmF0ZUluZm8uVHhSaW5nRnVsbENudCsrOwotCi0JCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7Ci0KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJcFR4QmxrLT5UeEZyYW1lVHlwZSA9IFR4UGt0Q2xhc3NpZmljYXRpb24ocEFkLCBwUGFja2V0KTsKLQkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZShwUXVldWUpOwotCQkJcFR4QmxrLT5Ub3RhbEZyYW1lTnVtKys7Ci0JCQlwVHhCbGstPlRvdGFsRnJhZ051bSArPSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpOwkvLyBUaGUgcmVhbCBmcmFnbWVudCBudW1iZXIgbWF5YmUgdmFyeQotCQkJcFR4QmxrLT5Ub3RhbEZyYW1lTGVuICs9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwotCQkJcFR4QmxrLT5wUGFja2V0ID0gcFBhY2tldDsKLQkJCUluc2VydFRhaWxRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7Ci0KLQkJCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRSB8fCBwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKQotCQkJewotCQkJCS8vIEVuaGFuY2UgU1cgQWdncmVnYXRpb24gTWVjaGFuaXNtCi0JCQkJaWYgKE5FRURfUVVFVUVfQkFDS19GT1JfQUdHKHBBZCwgUXVlSWR4LCBGcmVlTnVtYmVyW1F1ZUlkeF0sIHBUeEJsay0+VHhGcmFtZVR5cGUpKQotCQkJCXsKLQkJCQkJSW5zZXJ0SGVhZFF1ZXVlKHBRdWV1ZSwgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpKTsKLQkJCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWRvewotCQkJCQlpZigocEVudHJ5ID0gcFF1ZXVlLT5IZWFkKSA9PSBOVUxMKQotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJLy8gRm9yIFRYX0FNU0RVX0ZSQU1FL1RYX1JBTElOS19GUkFNRSwgTmVlZCB0byBjaGVjayBpZiBuZXh0IHBha2NldCBjYW4gZG8gYWdncmVnYXRpb24uCi0JCQkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KTsKLQkJCQkJRnJlZU51bWJlcltRdWVJZHhdID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOwotCQkJCQloYXNUeERlc2MgPSBSVE1QX0hBU19FTk9VR0hfRlJFRV9ERVNDKHBBZCwgcFR4QmxrLCBGcmVlTnVtYmVyW1F1ZUlkeF0sIHBQYWNrZXQpOwotCQkJCQlpZiAoKGhhc1R4RGVzYyA9PSBGQUxTRSkgfHwgKENhbkRvQWdncmVnYXRlVHJhbnNtaXQocEFkLCBwUGFja2V0LCBwVHhCbGspID09IEZBTFNFKSkKLQkJCQkJCWJyZWFrOwotCi0JCQkJCS8vUmVtb3ZlIHRoZSBwYWNrZXQgZnJvbSB0aGUgVHhTd1F1ZXVlIGFuZCBpbnNlcnQgaW50byBwVHhCbGsKLQkJCQkJcEVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKHBRdWV1ZSk7Ci0JCQkJCUFTU0VSVChwRW50cnkpOwotCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7Ci0JCQkJCXBUeEJsay0+VG90YWxGcmFtZU51bSsrOwotCQkJCQlwVHhCbGstPlRvdGFsRnJhZ051bSArPSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpOwkvLyBUaGUgcmVhbCBmcmFnbWVudCBudW1iZXIgbWF5YmUgdmFyeQotCQkJCQlwVHhCbGstPlRvdGFsRnJhbWVMZW4gKz0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7Ci0JCQkJCUluc2VydFRhaWxRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7Ci0JCQkJfXdoaWxlKDEpOwotCi0JCQkJaWYgKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA9PSAxKQotCQkJCQlwVHhCbGstPlR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOwotCQkJfQotCi0KLQkJCUNvdW50ICs9IHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcjsKLQotCi0JCQkJLy8gRG8gSGFyZFRyYW5zbWl0IG5vdy4KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQkJU3RhdHVzID0gU1RBSGFyZFRyYW5zbWl0KHBBZCwgcFR4QmxrLCBRdWVJZHgpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKLQkJCS8vIHN0YXRpYyByYXRlIGFsc28gbmVlZCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoKSBmdW5jdGlvbi4KLQkJCS8vaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkpCi0JCQkJTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKHBBZCk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQkJfQotCi0JCVJUTVBfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBJcnFGbGFncyk7Ci0KLQotI2lmZGVmIEJMT0NLX05FVF9JRgotCQlpZiAoKHBBZC0+YmxvY2tRdWV1ZVRhYltRdWVJZHhdLlN3VHhRdWV1ZUJsb2NrRmxhZyA9PSBUUlVFKQotCQkJJiYgKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyIDwgMSkpCi0JCXsKLQkJCXJlbGVhc2VOZXRJZigmcEFkLT5ibG9ja1F1ZXVlVGFiW1F1ZUlkeF0pOwotCQl9Ci0jZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCi0KLQl9Ci0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gdHJhbnNtaXQgb3V0IGZyYW1lcwotCXdpdGggZ2l2ZW4gc2l6ZSBhbmQgc3BlY2lmaWVkIHJhdGUuCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCVJhdGUJCQlUcmFuc21pdCByYXRlCi0JCVNpemUJCQlGcmFtZSBzaXplIGluIHVuaXRzIG9mIGJ5dGUKLQotCVJldHVybiBWYWx1ZToKLQkJRHVyYXRpb24gbnVtYmVyIGluIHVuaXRzIG9mIHVzZWMKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVVNIT1JUCVJUTVBDYWxjRHVyYXRpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlSYXRlLAotCUlOCVVMT05HCQkJU2l6ZSkKLXsKLQlVTE9ORwlEdXJhdGlvbiA9IDA7Ci0KLQlpZiAoUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKSAvLyBDQ0sKLQl7Ci0JCWlmICgoUmF0ZSA+IFJBVEVfMSkgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpKQotCQkJRHVyYXRpb24gPSA5NjsJLy8gNzIrMjQgcHJlYW1ibGUrcGxjcAotCQllbHNlCi0JCQlEdXJhdGlvbiA9IDE5MjsgLy8gMTQ0KzQ4IHByZWFtYmxlK3BsY3AKLQotCQlEdXJhdGlvbiArPSAoVVNIT1JUKSgoU2l6ZSA8PCA0KSAvIFJhdGVJZFRvNTAwS2Jwc1tSYXRlXSk7Ci0JCWlmICgoU2l6ZSA8PCA0KSAlIFJhdGVJZFRvNTAwS2Jwc1tSYXRlXSkKLQkJCUR1cmF0aW9uICsrOwotCX0KLQllbHNlIGlmIChSYXRlIDw9IFJBVEVfTEFTVF9PRkRNX1JBVEUpLy8gT0ZETSByYXRlcwotCXsKLQkJRHVyYXRpb24gPSAyMCArIDY7CQkvLyAxNis0IHByZWFtYmxlK3BsY3AgKyBTaWduYWwgRXh0ZW5zaW9uCi0JCUR1cmF0aW9uICs9IDQgKiAoVVNIT1JUKSgoMTEgKyBTaXplICogNCkgLyBSYXRlSWRUbzUwMEticHNbUmF0ZV0pOwotCQlpZiAoKDExICsgU2l6ZSAqIDQpICUgUmF0ZUlkVG81MDBLYnBzW1JhdGVdKQotCQkJRHVyYXRpb24gKz0gNDsKLQl9Ci0JZWxzZQkvL21pbW8gcmF0ZQotCXsKLQkJRHVyYXRpb24gPSAyMCArIDY7CQkvLyAxNis0IHByZWFtYmxlK3BsY3AgKyBTaWduYWwgRXh0ZW5zaW9uCi0JfQotCi0JcmV0dXJuIChVU0hPUlQpRHVyYXRpb247Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNhbGN1bGF0ZXMgdGhlIGR1cmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHRyYW5zbWl0IG91dCBmcmFtZXMKLQl3aXRoIGdpdmVuIHNpemUgYW5kIHNwZWNpZmllZCByYXRlLgotCi0JQXJndW1lbnRzOgotCQlwVHhXSQkJUG9pbnRlciB0byBoZWFkIG9mIGVhY2ggTVBEVSB0byBIVy4KLQkJQWNrCQlTZXR0aW5nIGZvciBBY2sgcmVxdWlyZW1lbnQgYml0Ci0JCUZyYWdtZW50CVNldHRpbmcgZm9yIEZyYWdtZW50IGJpdAotCQlSZXRyeU1vZGUJU2V0dGluZyBmb3IgcmV0cnkgbW9kZQotCQlJZnMJCVNldHRpbmcgZm9yIElGUyBnYXAKLQkJUmF0ZQkJU2V0dGluZyBmb3IgdHJhbnNtaXQgcmF0ZQotCQlTZXJ2aWNlCQlTZXR0aW5nIGZvciBzZXJ2aWNlCi0JCUxlbmd0aAkJRnJhbWUgbGVuZ3RoCi0JCVR4UHJlYW1ibGUJU2hvcnQgb3IgTG9uZyBwcmVhbWJsZSB3aGVuIHVzaW5nIENDSyByYXRlcwotCQlRdWVJZHggLSAwLTMsIGFjY29yZGluZyB0byA4MDIuMTFlL2Q0LjQgSnVuZS8yMDAzCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICBTZWUgYWxzbyA6IEJBU21hcnRIYXJkVHJhbnNtaXQoKSAgICAhISEKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUFdyaXRlVHhXSSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVFhXSV9TVFJVQwlwT3V0VHhXSSwKLQlJTglCT09MRUFOCQkJRlJBRywKLQlJTglCT09MRUFOCQkJQ0ZBQ0ssCi0JSU4JQk9PTEVBTgkJCUluc1RpbWVzdGFtcCwKLQlJTglCT09MRUFOCQkJQU1QRFUsCi0JSU4JQk9PTEVBTgkJCUFjaywKLQlJTglCT09MRUFOCQkJTlNlcSwJCS8vIEhXIG5ldyBhIHNlcXVlbmNlLgotCUlOCVVDSEFSCQkJQkFTaXplLAotCUlOCVVDSEFSCQkJV0NJRCwKLQlJTglVTE9ORwkJCUxlbmd0aCwKLQlJTglVQ0hBUgkJCVBJRCwKLQlJTglVQ0hBUgkJCVRJRCwKLQlJTglVQ0hBUgkJCVR4UmF0ZSwKLQlJTglVQ0hBUgkJCVR4b3Btb2RlLAotCUlOCUJPT0xFQU4JCQlDZkFjaywKLQlJTglIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdCkKLXsKLQlQTUFDX1RBQkxFX0VOVFJZCXBNYWMgPSBOVUxMOwotCVRYV0lfU1RSVUMJCVR4V0k7Ci0JUFRYV0lfU1RSVUMJcFR4V0k7Ci0KLQlpZiAoV0NJRCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCQlwTWFjID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbV0NJRF07Ci0KLQkvLwotCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgotCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcwotCS8vCi0JT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKLQlOZGlzWmVyb01lbW9yeSgmVHhXSSwgVFhXSV9TSVpFKTsKLQlwVHhXSSA9ICZUeFdJOwotCi0JcFR4V0ktPkZSQUc9IEZSQUc7Ci0KLQlwVHhXSS0+Q0ZBQ0sgPSBDRkFDSzsKLQlwVHhXSS0+VFM9IEluc1RpbWVzdGFtcDsKLQlwVHhXSS0+QU1QRFUgPSBBTVBEVTsKLQlwVHhXSS0+QUNLID0gQWNrOwotCXBUeFdJLT50eG9wPSBUeG9wbW9kZTsKLQotCXBUeFdJLT5OU0VRID0gTlNlcTsKLQkvLyBKb2huIHR1bmUgdGhlIHBlcmZvcm1hY2Ugd2l0aCBJbnRlbCBDbGllbnQgaW4gMjAgTUh6IHBlcmZvcm1hbmNlCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JQkFTaXplID0gcEFkLT5Db21tb25DZmcuVHhCQVNpemU7Ci0JaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NzIwMjAwKQotCXsKLQkJaWYoIEJBU2l6ZSA+MTMgKQotCQkJQkFTaXplID0xMzsKLQl9Ci0JZWxzZQotCXsKLQkJaWYoIEJBU2l6ZSA+NyApCi0JCQlCQVNpemUgPTc7Ci0JfQotCXBUeFdJLT5CQVdpblNpemUgPSBCQVNpemU7Ci0JcFR4V0ktPlNob3J0R0kgPSBwVHJhbnNtaXQtPmZpZWxkLlNob3J0R0k7Ci0JcFR4V0ktPlNUQkMgPSBwVHJhbnNtaXQtPmZpZWxkLlNUQkM7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlwVHhXSS0+V2lyZWxlc3NDbGlJRCA9IFdDSUQ7Ci0JcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IExlbmd0aDsKLQlwVHhXSS0+UGFja2V0SWQgPSBQSUQ7Ci0KLQkvLyBJZiBDQ0sgb3IgT0ZETSwgQlcgbXVzdCBiZSAyMAotCXBUeFdJLT5CVyA9IChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotCWlmIChwVHhXSS0+QlcpCi0JCXBUeFdJLT5CVyA9IChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGggPT0gMCkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCXBUeFdJLT5NQ1MgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKLQlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKLQlwVHhXSS0+Q0ZBQ0sgPSBDZkFjazsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCWlmIChwTWFjKQotCXsKLSAgICAgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUpCi0gICAgICAgIHsKLQkJaWYgKChwTWFjLT5NbXBzTW9kZSA9PSBNTVBTX0RZTkFNSUMpICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKQotCQkJewotCQkJCS8vIER5bmFtaWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKLQkJCQlwVHhXSS0+TUlNT3BzID0gMTsKLQkJCX0KLQkJCWVsc2UgaWYgKHBNYWMtPk1tcHNNb2RlID09IE1NUFNfU1RBVElDKQotCQkJewotCQkJCS8vIFN0YXRpYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQotCQkJCWlmIChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCAmJiBwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpCi0JCQkJewotCQkJCQlwVHhXSS0+TUNTID0gNzsKLQkJCQkJcFR4V0ktPk1JTU9wcyA9IDA7Ci0JCQkJfQotCQkJfQotICAgICAgICB9Ci0JCS8vcFR4V0ktPk1JTU9wcyA9IChwTWFjLT5Qc01vZGUgPT0gUFdSX01NUFMpPyAxOjA7Ci0JCWlmIChwTWFjLT5iSUFtQmFkQXRoZXJvcyAmJiAocE1hYy0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpCi0JCXsKLQkJCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDc7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCXBUeFdJLT5NcGR1RGVuc2l0eSA9IHBNYWMtPk1wZHVEZW5zaXR5OwotCX0KLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlwVHhXSS0+UGFja2V0SWQgPSBwVHhXSS0+TUNTOwotCU5kaXNNb3ZlTWVtb3J5KHBPdXRUeFdJLCAmVHhXSSwgc2l6ZW9mKFRYV0lfU1RSVUMpKTsKLX0KLQotCi1WT0lEIFJUTVBXcml0ZVR4V0lfRGF0YSgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JT1VUIFBUWFdJX1NUUlVDCQlwVHhXSSwKLQlJTglUWF9CTEsJCQkJKnBUeEJsaykKLXsKLQlIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdDsKLQlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlVQ0hBUgkJCQlCQVNpemU7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQotCUFTU0VSVChwVHhXSSk7Ci0KLQlwVHJhbnNtaXQgPSBwVHhCbGstPnBUcmFuc21pdDsKLQlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKLQotCi0JLy8KLQkvLyBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4KLQkvLyBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MKLQkvLwotCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7Ci0JTmRpc1plcm9NZW1vcnkocFR4V0ksIFRYV0lfU0laRSk7Ci0KLQlwVHhXSS0+RlJBRwkJPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpOwotCXBUeFdJLT5BQ0sJCT0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOwotCXBUeFdJLT50eG9wCQk9IHBUeEJsay0+RnJhbWVHYXA7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQlpZiAocE1hY0VudHJ5ICYmCi0JCShwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkgJiYKLQkJKHBNYWNFbnRyeS0+VmFsaWRBc0RscyA9PSBUUlVFKSkKLQkJcFR4V0ktPldpcmVsZXNzQ2xpSUQgPSBCU1NJRF9XQ0lEOwotCWVsc2UKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlwVHhXSS0+V2lyZWxlc3NDbGlJRAkJPSBwVHhCbGstPldjaWQ7Ci0KLQlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50CT0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47Ci0JcFR4V0ktPkNGQUNLCQkJCT0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iUGlnZ3lCYWNrKTsKLQotCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCi0JcFR4V0ktPkJXID0gKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0JaWYgKHBUeFdJLT5CVykKLQkJcFR4V0ktPkJXID0gKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9PSAwKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotCXBUeFdJLT5BTVBEVQk9ICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVBEVV9GUkFNRSkgPyBUUlVFIDogRkFMU0UpOwotCi0JLy8gSm9obiB0dW5lIHRoZSBwZXJmb3JtYWNlIHdpdGggSW50ZWwgQ2xpZW50IGluIDIwIE1IeiBwZXJmb3JtYW5jZQotCUJBU2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplOwotCWlmKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNUERVX0ZSQU1FKSAmJiAocE1hY0VudHJ5KSkKLQl7Ci0JCVVDSEFSCQlSQUJBT3JpSWR4ID0gMDsJLy9UaGUgUkEncyBCQSBPcmlnaW5hdG9yIHRhYmxlIGluZGV4LgotCi0JCVJBQkFPcmlJZHggPSBwVHhCbGstPnBNYWNFbnRyeS0+QkFPcmlXY2lkQXJyYXlbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOwotCQlCQVNpemUgPSBwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtSQUJBT3JpSWR4XS5CQVdpblNpemU7Ci0JfQotCi0KLQlwVHhXSS0+VHhCRiA9IHBUcmFuc21pdC0+ZmllbGQuVHhCRjsKLQlwVHhXSS0+QkFXaW5TaXplID0gQkFTaXplOwotCXBUeFdJLT5TaG9ydEdJID0gcFRyYW5zbWl0LT5maWVsZC5TaG9ydEdJOwotCXBUeFdJLT5TVEJDID0gcFRyYW5zbWl0LT5maWVsZC5TVEJDOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JcFR4V0ktPk1DUyA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOwotCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOwotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlpZiAocE1hY0VudHJ5KQotCXsKLQkJaWYgKChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfRFlOQU1JQykgJiYgKHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykpCi0JCXsKLQkJCS8vIER5bmFtaWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKLQkJCXBUeFdJLT5NSU1PcHMgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19TVEFUSUMpCi0JCXsKLQkJCS8vIFN0YXRpYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQotCQkJaWYgKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYICYmIHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykKLQkJCXsKLQkJCQlwVHhXSS0+TUNTID0gNzsKLQkJCQlwVHhXSS0+TUlNT3BzID0gMDsKLQkJCX0KLQkJfQotCi0JCWlmIChwTWFjRW50cnktPmJJQW1CYWRBdGhlcm9zICYmIChwTWFjRW50cnktPldlcFN0YXR1cyAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpKQotCQl7Ci0JCQlwVHhXSS0+TXBkdURlbnNpdHkgPSA3OwotCQl9Ci0JCWVsc2UKLQkJewotCQlwVHhXSS0+TXBkdURlbnNpdHkgPSBwTWFjRW50cnktPk1wZHVEZW5zaXR5OwotCX0KLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBEQkdfRElBR05PU0UKLQkJaWYgKHBUeEJsay0+UXVlSWR4PT0gMCkKLQkJewotCQkJcEFkLT5EaWFnU3RydWN0LlR4RGF0YUNudFtwQWQtPkRpYWdTdHJ1Y3QuQXJyYXlDdXJJZHhdKys7Ci0JCQlwQWQtPkRpYWdTdHJ1Y3QuVHhNY3NDbnRbcEFkLT5EaWFnU3RydWN0LkFycmF5Q3VySWR4XVtwVHhXSS0+TUNTXSsrOwotCQl9Ci0jZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCi0KLQkvLyBmb3IgcmF0ZSBhZGFwYXRpb24KLQlwVHhXSS0+UGFja2V0SWQgPSBwVHhXSS0+TUNTOwotI2lmZGVmIElORl9BTUFaT05fU0UKLS8qSXZlcnNvbiBwYXRjaCBmb3IgV01NIEE1LVQwNyAsV2lyZWxlc3NTdGFUb1dpcmVsZXNzU3RhIGRvIG5vdCBidWxrIG91dCBhZ2dyZWdhdGUgKi8KLQlpZiggUlRNUF9HRVRfUEFDS0VUX05PQlVMS09VVChwVHhCbGstPnBQYWNrZXQpKQotCXsKLQkJaWYocFR4V0ktPlBIWU1PREUgPT0gTU9ERV9DQ0spCi0JCXsKLQkJCXBUeFdJLT5QYWNrZXRJZCA9IDY7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gSU5GX0FNQVpPTl9TRSAvLwotfQotCi0KLVZPSUQgUlRNUFdyaXRlVHhXSV9DYWNoZSgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JT1VUIFBUWFdJX1NUUlVDCQlwVHhXSSwKLQlJTglUWF9CTEsJCQkJKnBUeEJsaykKLXsKLQlQSFRUUkFOU01JVF9TRVRUSU5HCS8qcFR4SFRQaHlNb2RlLCovIHBUcmFuc21pdDsKLQlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeTsKLQotCS8vCi0JLy8gdXBkYXRlIFRYV0kKLQkvLwotCXBNYWNFbnRyeSA9IHBUeEJsay0+cE1hY0VudHJ5OwotCXBUcmFuc21pdCA9IHBUeEJsay0+cFRyYW5zbWl0OwotCi0JLy9pZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkKLQkvL2lmIChSVE1QQ2hlY2tFbnRyeUVuYWJsZUF1dG9SYXRlU3dpdGNoKHBBZCwgcE1hY0VudHJ5KSkKLQkvL2lmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX0F1dG9SYXRlU3dpdGNoKSkKLQlpZiAocE1hY0VudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCkKLQl7Ci0JCXBUeFdJLT50eG9wID0gSUZTX0hUVFhPUDsKLQotCQkvLyBJZiBDQ0sgb3IgT0ZETSwgQlcgbXVzdCBiZSAyMAotCQlwVHhXSS0+QlcgPSAocFRyYW5zbWl0LT5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOwotCQlwVHhXSS0+U2hvcnRHSSA9IHBUcmFuc21pdC0+ZmllbGQuU2hvcnRHSTsKLQkJcFR4V0ktPlNUQkMgPSBwVHJhbnNtaXQtPmZpZWxkLlNUQkM7Ci0KLQkJcFR4V0ktPk1DUyA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOwotCQlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKLQotCQkvLyBzZXQgUElEIGZvciBUeFJhdGVTd2l0Y2hpbmcKLQkJcFR4V0ktPlBhY2tldElkID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7Ci0JfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JcFR4V0ktPkFNUERVID0gKChwTWFjRW50cnktPk5vQkFEYXRhQ291bnREb3duID09IDApID8gVFJVRTogRkFMU0UpOwotCXBUeFdJLT5NSU1PcHMgPSAwOwotCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotCWlmIChwVHhXSS0+QlcpCi0JCXBUeFdJLT5CVyA9IChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGggPT0gMCkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLQotICAgIGlmIChwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlKQotICAgIHsKLQkJLy8gTUlNTyBQb3dlciBTYXZlIE1vZGUKLQkJaWYgKChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfRFlOQU1JQykgJiYgKHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykpCi0JCXsKLQkJCS8vIER5bmFtaWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKLQkJCXBUeFdJLT5NSU1PcHMgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19TVEFUSUMpCi0JCXsKLQkJCS8vIFN0YXRpYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQotCQkJaWYgKChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkgJiYgKHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykpCi0JCQl7Ci0JCQkJcFR4V0ktPk1DUyA9IDc7Ci0JCQkJcFR4V0ktPk1JTU9wcyA9IDA7Ci0JCQl9Ci0JCX0KLSAgICB9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBEQkdfRElBR05PU0UKLQlpZiAocFR4QmxrLT5RdWVJZHg9PSAwKQotCXsKLQkJcEFkLT5EaWFnU3RydWN0LlR4RGF0YUNudFtwQWQtPkRpYWdTdHJ1Y3QuQXJyYXlDdXJJZHhdKys7Ci0JCXBBZC0+RGlhZ1N0cnVjdC5UeE1jc0NudFtwQWQtPkRpYWdTdHJ1Y3QuQXJyYXlDdXJJZHhdW3BUeFdJLT5NQ1NdKys7Ci0JfQotI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLwotCi0JcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOwotCi19Ci0KLQotLy8gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gLQotLy8gMS4gTUVBRElBX0NPTk5FQ1RFRAotLy8gMi4gQUdHUkVHQVRJT05fSU5fVVNFRAotLy8gMy4gRnJhZ21lbnRhdGlvbiBub3QgaW4gdXNlZAotLy8gNC4gZWl0aGVyIG5vIHByZXZpb3VzIGZyYW1lIChwUHJldkFkZHIxPU5VTEwpIC5PUi4gcHJldmlvdWQgZnJhbWUgaXMgYWdncmVnYXRpYmxlCi1CT09MRUFOIFR4RnJhbWVJc0FnZ3JlZ2F0aWJsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwUHJldkFkZHIxLAotCUlOCVBVQ0hBUgkJCXA4MDIzaGRyKQotewotCi0JLy8gY2FuJ3QgYWdncmVnYXRlIEVBUE9MICg4MDIuMXgpIGZyYW1lCi0JaWYgKChwODAyM2hkclsxMl0gPT0gMHg4OCkgJiYgKHA4MDIzaGRyWzEzXSA9PSAweDhlKSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JLy8gY2FuJ3QgYWdncmVnYXRlIG11bHRpY2FzdC9icm9hZGNhc3QgZnJhbWUKLQlpZiAocDgwMjNoZHJbMF0gJiAweDAxKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlpZiAoSU5GUkFfT04ocEFkKSkgLy8gbXVzdCBiZSB1bmljYXN0IHRvIEFQCi0JCXJldHVybiBUUlVFOwotCWVsc2UgaWYgKChwUHJldkFkZHIxID09IE5VTEwpIHx8IE1BQ19BRERSX0VRVUFMKHBQcmV2QWRkcjEsIHA4MDIzaGRyKSkgLy8gdW5pY2FzdCB0byBzYW1lIFNUQQotCQlyZXR1cm4gVFJVRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkgICBDaGVjayB0aGUgTVNEVSBBZ2dyZWdhdGlvbiBwb2xpY3kKLQkxLkhUIGFnZ3JlZ2F0aW9uIGlzIEEtTVNEVQotCTIubGVnYWFjeSByYXRlIGFnZ3JlZ2F0aW9uIGlzIHNvZnR3YXJlIGFnZ3JlZ2F0aW9uIGJ5IFJhbGluay4KLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOIFBlZXJJc0FnZ3JlT24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUxPTkcJCSAgIFR4UmF0ZSwKLQlJTglQTUFDX1RBQkxFX0VOVFJZIHBNYWNFbnRyeSkKLXsKLQlVTE9ORwlBRmxhZ3MgPSAoZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEIHwgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSk7Ci0KLQlpZiAocE1hY0VudHJ5ICE9IE5VTEwgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBBRmxhZ3MpKQotCXsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJaWYgKHBNYWNFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKLQkJewotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLQkJaWYgKFR4UmF0ZSA+PSBSQVRFXzYgJiYgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSAmJiAoIShPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKSkpCi0JCXsJLy8gbGVnYWN5ICBSYWxpbmsgQWdncmVnYXRpb24gc3VwcG9ydAotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLSNlbmRpZiAvLyBBR0dSRUdBVElPTl9TVVBQT1JUIC8vCi0JfQotCi0JcmV0dXJuIEZBTFNFOwotCi19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNoZWNrIGFuZCBmaW5lIHRoZSBwYWNrZXQgd2FpdGluZyBpbiBTVyBxdWV1ZSB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkKLQotCUFyZ3VtZW50czoKLQkJcEFkIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJcFF1ZXVlCQlQb2ludGVyIHRvIFdhaXRpbmcgUXVldWUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVBRVUVVRV9IRUFERVIJUlRNUENoZWNrVHhTd1F1ZXVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVCBQVUNIQVIJCQlwUXVlSWR4KQotewotCi0JVUxPTkcJTnVtYmVyOwotCS8vIDIwMDQtMTEtMTUgdG8gYmUgcmVtb3ZlZC4gdGVzdCBhZ2dyZWdhdGlvbiBvbmx5Ci0vLwlpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKSkgJiYgKCpwTnVtYmVyIDwgMikpCi0vLwkJIHJldHVybiBOVUxMOwotCi0JTnVtYmVyID0gcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXS5OdW1iZXIKLQkJCSArIHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uTnVtYmVyCi0JCQkgKyBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldLk51bWJlcgotCQkJICsgcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZPXS5OdW1iZXI7Ci0JCQkgLyorIHBBZC0+VHhTd1F1ZXVlW1FJRF9IQ0NBXS5OdW1iZXI7Ki8KLQotCWlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLkhlYWQgIT0gTlVMTCkKLQl7Ci0JCSpwUXVlSWR4ID0gUUlEX0FDX1ZPOwotCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dKTsKLQl9Ci0JZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5IZWFkICE9IE5VTEwpCi0JewotCQkqcFF1ZUlkeCA9IFFJRF9BQ19WSTsKLQkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXSk7Ci0JfQotCWVsc2UgaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uSGVhZCAhPSBOVUxMKQotCXsKLQkJKnBRdWVJZHggPSBRSURfQUNfQkU7Ci0JCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0pOwotCX0KLQllbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLkhlYWQgIT0gTlVMTCkKLQl7Ci0JCSpwUXVlSWR4ID0gUUlEX0FDX0JLOwotCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdKTsKLQl9Ci0JLyoKLQllbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfSENDQV0uSGVhZCAhPSBOVUxMKQotCXsKLQkJKnBRdWVJZHggPSBRSURfSENDQTsKLQkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdKTsKLQl9Ci0JKi8KLQotCS8vIE5vIHBhY2tldCBwZW5kaW5nIGluIFR4IFN3IHF1ZXVlCi0JKnBRdWVJZHggPSBRSURfQUNfQks7Ci0KLQlyZXR1cm4gKE5VTEwpOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlTdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNDQU5OSU5HLCBzdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uIC4uLlxuIikpOwotCi0KLQkvLwotCS8vIEJlZm9yZSBCU1NfU0NBTl9JTl9QUk9HUkVTUywgd2UgbmVlZCB0byBrZWVwIEN1cnJlbnQgUjY2IHZhbHVlIGFuZAotCS8vIHVzZSBMb3dib3VuZCBhcyBSNjYgdmFsdWUgb24gU2Nhbk5leHRDaGFubmVsKC4uLikKLQkvLwotCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICZwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUpOwotCi0JLy8gc2V0IEJCUF9SNjYgdG8gMHgzMC8weDQwIHdoZW4gc2Nhbm5pbmcgKEFzaWNTd2l0Y2hDaGFubmVsIHdpbGwgc2V0IFI2NiBhY2NvcmRpbmcgdG8gY2hhbm5lbCB3aGVuIHNjYW5uaW5nKQotCS8vUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICgweDI2ICsgR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgQldfMjApOwotCi0JUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOwotCS8vUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ05UTF9DU1IsIDB4MDAwZjAwMDApOwkJLy8gYWJvcnQgYWxsIFRYIHJpbmdzCi19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJlc3VtZSBNU0RVIHRyYW5zbWlzc2lvbgotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotLy8gICAgVUNIQVIJCQlJcnFTdGF0ZTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU0NBTiBkb25lLCByZXN1bWUgTVNEVSB0cmFuc21pc3Npb24gLi4uXG4iKSk7Ci0KLQotCS8vIEFmdGVyIGZpbmlzaCBCU1NfU0NBTl9JTl9QUk9HUkVTUywgd2UgbmVlZCB0byByZXN0b3JlIEN1cnJlbnQgUjY2IHZhbHVlCi0JLy8gUjY2IHNob3VsZCBub3QgYmUgMAotCWlmIChwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgPT0gMCkKLQl7Ci0JCXBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSA9IDB4Mzg7Ci0JCURCR1BSSU5UX0VSUigoIlJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uLCBSNjZDdXJyZW50VmFsdWU9MC4uLlxuIikpOwotCX0KLQotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKLQotCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOwotLy8gc2FtcGxlLCBmb3IgSVJRIExPQ0sgdG8gU0VNIExPQ0sKLS8vICAgIElycVN0YXRlID0gcEFkLT5pcnFfZGlzYWJsZWQ7Ci0vLwlpZiAoSXJxU3RhdGUpCi0vLwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBUUlVFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOwotLy8gICAgZWxzZQotCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7Ci19Ci0KLQotVUlOVCBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlQTkRJU19QQUNLRVQJCXBQYWNrZXQsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVUxPTkcJCQlEYXRhU2l6ZSkKLXsKLQlVU0hPUlQJCQlQYXlsb2FkU2l6ZTsKLQlVU0hPUlQJCQlTdWJGcmFtZVNpemU7Ci0JUEhFQURFUl84MDJfMwlwQU1TRFVzdWJoZWFkZXI7Ci0JVUlOVAkJCW5NU0RVOwotICAgIFVDSEFSCQkJSGVhZGVyODAyXzNbMTRdOwotCi0JUFVDSEFSCQkJcFBheWxvYWQsIHBEQSwgcFNBLCBwUmVtb3ZlZExMQ1NOQVA7Ci0JUE5ESVNfUEFDS0VUCXBDbG9uZVBhY2tldDsKLQotCi0KLQluTVNEVSA9IDA7Ci0KLQl3aGlsZSAoRGF0YVNpemUgPiBMRU5HVEhfODAyXzMpCi0JewotCi0JCW5NU0RVKys7Ci0KLQkJLy9oZXhfZHVtcCgic3ViaGVhZGVyIiwgcERhdGEsIDY0KTsKLQkJcEFNU0RVc3ViaGVhZGVyID0gKFBIRUFERVJfODAyXzMpcERhdGE7Ci0JCS8vcERhdGEgKz0gTEVOR1RIXzgwMl8zOwotCQlQYXlsb2FkU2l6ZSA9IHBBTVNEVXN1YmhlYWRlci0+T2N0ZXRbMV0gKyAocEFNU0RVc3ViaGVhZGVyLT5PY3RldFswXTw8OCk7Ci0JCVN1YkZyYW1lU2l6ZSA9IFBheWxvYWRTaXplICsgTEVOR1RIXzgwMl8zOwotCi0KLQkJaWYgKChEYXRhU2l6ZSA8IFN1YkZyYW1lU2l6ZSkgfHwgKFBheWxvYWRTaXplID4gMTUxOCApKQotCQl7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlZCBzdWJmcmFtZTogU2l6ZSA9ICVkXG4iLCAgbk1TRFUsIFBheWxvYWRTaXplKSk7Ci0KLQkJcFBheWxvYWQgPSBwRGF0YSArIExFTkdUSF84MDJfMzsKLQkJcERBID0gcERhdGE7Ci0JCXBTQSA9IHBEYXRhICsgTUFDX0FERFJfTEVOOwotCi0JCS8vIGNvbnZlcnQgdG8gODAyLjMgaGVhZGVyCi0gICAgICAgIENPTlZFUlRfVE9fODAyXzMoSGVhZGVyODAyXzMsIHBEQSwgcFNBLCBwUGF5bG9hZCwgUGF5bG9hZFNpemUsIHBSZW1vdmVkTExDU05BUCk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJaWYgKChIZWFkZXI4MDJfM1sxMl0gPT0gMHg4OCkgJiYgKEhlYWRlcjgwMl8zWzEzXSA9PSAweDhFKSApCi0JCXsKLQkJCS8qIGF2b2lkIGxvY2FsIGhlYXAgb3ZlcmZsb3csIHVzZSBkeWFuYW1pYyBhbGxvY2F0aW9uICovCi0JCSAgIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOwotCQkJaWYgKEVsZW0gIT0gTlVMTCkKLQkJCXsKLQkJCQltZW1tb3ZlKEVsZW0tPk1zZysoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IKSwgcFBheWxvYWQsIFBheWxvYWRTaXplKTsKLQkJCQlFbGVtLT5Nc2dMZW4gPSBMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyBQYXlsb2FkU2l6ZTsKLQkJCQkvL1dwYUVBUE9MS2V5QWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShwQWQsIEJTU0lEX1dDSUQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAwLCAwLCAwLCAwKTsKLQkJCQlrZnJlZShFbGVtKTsKLQkJCX0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCWlmIChwUmVtb3ZlZExMQ1NOQVApCi0JCQl7Ci0JCQkJcFBheWxvYWQgLT0gTEVOR1RIXzgwMl8zOwotCQkJCVBheWxvYWRTaXplICs9IExFTkdUSF84MDJfMzsKLQkJCQlOZGlzTW92ZU1lbW9yeShwUGF5bG9hZCwgJkhlYWRlcjgwMl8zWzBdLCBMRU5HVEhfODAyXzMpOwotCQkJfQotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJcENsb25lUGFja2V0ID0gQ2xvbmVQYWNrZXQocEFkLCBwUGFja2V0LCBwUGF5bG9hZCwgUGF5bG9hZFNpemUpOwotCQlpZiAocENsb25lUGFja2V0KQotCQl7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCUFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKHBBZCwgcENsb25lUGFja2V0LCBSVE1QX0dFVF9QQUNLRVRfSUYocFBhY2tldCkpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQl9Ci0KLQotCQkvLyBBLU1TRFUgaGFzIHBhZGRpbmcgdG8gbXVsdGlwbGUgb2YgNCBpbmNsdWRpbmcgc3ViZnJhbWUgaGVhZGVyLgotCQkvLyBhbGlnbiBTdWJGcmFtZVNpemUgdXAgdG8gbXVsdGlwbGUgb2YgNAotCQlTdWJGcmFtZVNpemUgPSAoU3ViRnJhbWVTaXplKzMpJih+MHgzKTsKLQotCi0JCWlmIChTdWJGcmFtZVNpemUgPiAxNTI4IHx8IFN1YkZyYW1lU2l6ZSA8IDMyKQotCQl7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChEYXRhU2l6ZSA+IFN1YkZyYW1lU2l6ZSkKLQkJewotCQkJcERhdGEgKz0gU3ViRnJhbWVTaXplOwotCQkJRGF0YVNpemUgLT0gU3ViRnJhbWVTaXplOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gZW5kIG9mIEEtTVNEVQotCQkJRGF0YVNpemUgPSAwOwotCQl9Ci0JfQotCi0JLy8gZmluYWxseSByZWxlYXNlIG9yaWdpbmFsIHJ4IHBhY2tldAotCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBuTVNEVTsKLX0KLQotCi1VSU5UIEJBX1Jlb3JkZXJfQU1TRFVfQW5ubm91bmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQotewotCVBVQ0hBUgkJCXBEYXRhOwotCVVTSE9SVAkJCURhdGFTaXplOwotCVVJTlQJCQluTVNEVSA9IDA7Ci0KLQlwRGF0YSA9IChQVUNIQVIpIEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKLQlEYXRhU2l6ZSA9IChVU0hPUlQpIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwotCi0Jbk1TRFUgPSBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShwQWQsIHBQYWNrZXQsIHBEYXRhLCBEYXRhU2l6ZSk7Ci0KLQlyZXR1cm4gbk1TRFU7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlMb29rIHVwIHRoZSBNQUMgYWRkcmVzcyBpbiB0aGUgTUFDIHRhYmxlLiBSZXR1cm4gTlVMTCBpZiBub3QgZm91bmQuCi0JUmV0dXJuOgotCQlwRW50cnkgLSBwb2ludGVyIHRvIHRoZSBNQUMgZW50cnk7IE5VTEwgaXMgbm90IGZvdW5kCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1NQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlTG9va3VwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCVBVQ0hBUiBwQWRkcikKLXsKLQlVTE9ORyBIYXNoSWR4OwotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKLQotCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKLQlwRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOwotCi0Jd2hpbGUgKHBFbnRyeSAmJiAocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc1dEUyB8fCBwRW50cnktPlZhbGlkQXNBcENsaSB8fCBwRW50cnktPlZhbGlkQXNNZXNoKSkKLQl7Ci0JCWlmIChNQUNfQUREUl9FUVVBTChwRW50cnktPkFkZHIsIHBBZGRyKSkKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZQotCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKLQl9Ci0KLQlyZXR1cm4gcEVudHJ5OwotfQotCi1NQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlSW5zZXJ0RW50cnkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUgkJCXBBZGRyLAotCUlOCVVDSEFSCQkJYXBpZHgsCi0JSU4gQk9PTEVBTglDbGVhbkFsbCkKLXsKLQlVQ0hBUiBIYXNoSWR4OwotCWludCBpLCBGaXJzdFdjaWQ7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMLCAqcEN1cnJFbnRyeTsKLS8vCVVTSE9SVAlvZmZzZXQ7Ci0vLwlVTE9ORwlhZGRyOwotCi0JLy8gaWYgRlVMTCwgcmV0dXJuCi0JaWYgKHBBZC0+TWFjVGFiLlNpemUgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JCXJldHVybiBOVUxMOwotCi0JRmlyc3RXY2lkID0gMTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKLQkJRmlyc3RXY2lkID0gMjsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vIGFsbG9jYXRlIG9uZSBNQUMgZW50cnkKLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCWZvciAoaSA9IEZpcnN0V2NpZDsgaTwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykgICAvLyBza2lwIGVudHJ5IzAgc28gdGhhdCAiZW50cnkgaW5kZXggPT0gQUlEIiBmb3IgZmFzdCBsb29rdXAKLQl7Ci0JCS8vIHBpY2sgdXAgdGhlIGZpcnN0IGF2YWlsYWJsZSB2YWNhbmN5Ci0JCWlmICgocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID09IEZBTFNFKSAmJgotCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc1dEUyA9PSBGQUxTRSkgJiYKLQkJCShwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNBcENsaT09IEZBTFNFKSAmJgotCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc01lc2ggPT0gRkFMU0UpCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCQkmJiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzRGxzID09IEZBTFNFKQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJKQotCQl7Ci0JCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKLQkJCWlmIChDbGVhbkFsbCA9PSBUUlVFKQotCQkJewotCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7Ci0JCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gUkFURV8xMTsKLQkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKLQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9IDA7Ci0JCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQkJCX0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJCWlmIChhcGlkeCA+PSBNSU5fTkVUX0RFVklDRV9GT1JfRExTKQotCQkJewotCQkJCXBFbnRyeS0+VmFsaWRBc0NMSSA9IEZBTFNFOwotCQkJCXBFbnRyeS0+VmFsaWRBc1dEUyA9IEZBTFNFOwotCQkJCXBFbnRyeS0+VmFsaWRBc0FwQ2xpID0gRkFMU0U7Ci0JCQkJcEVudHJ5LT5WYWxpZEFzTWVzaCA9IEZBTFNFOwotCQkJCXBFbnRyeS0+VmFsaWRBc0RscyA9IFRSVUU7Ci0JCQkJcEVudHJ5LT5pc0NhY2hlZCA9IEZBTFNFOwotCQkJfQotCQkJZWxzZQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJewotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCQl7Ci0JCQkJCXBFbnRyeS0+VmFsaWRBc0NMSSA9IFRSVUU7Ci0JCQkJCXBFbnRyeS0+VmFsaWRBc1dEUyA9IEZBTFNFOwotCQkJCQlwRW50cnktPlZhbGlkQXNBcENsaSA9IEZBTFNFOwotCQkJCQlwRW50cnktPlZhbGlkQXNNZXNoID0gRkFMU0U7Ci0JCQkJCXBFbnRyeS0+VmFsaWRBc0RscyA9IEZBTFNFOwotCQkJCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJCX0KLQotCQkJcEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9IEZBTFNFOwotCQkJcEVudHJ5LT5wQWQgPSBwQWQ7Ci0JCQlwRW50cnktPkNNVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0JCQlwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKLQkJCXBFbnRyeS0+UlNOSUVfTGVuID0gMDsKLQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLCBzaXplb2YocEVudHJ5LT5SX0NvdW50ZXIpKTsKLQkJCXBFbnRyeS0+UmVUcnlDb3VudGVyID0gUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUjsKLQotCQkJaWYgKHBFbnRyeS0+VmFsaWRBc01lc2gpCi0JCQkJcEVudHJ5LT5hcGlkeCA9IChhcGlkeCAtIE1JTl9ORVRfREVWSUNFX0ZPUl9NRVNIKTsKLQkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc0FwQ2xpKQotCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpOwotCQkJZWxzZSBpZiAocEVudHJ5LT5WYWxpZEFzV0RTKQotCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc0RscykKLQkJCQlwRW50cnktPmFwaWR4ID0gKGFwaWR4IC0gTUlOX05FVF9ERVZJQ0VfRk9SX0RMUyk7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQllbHNlCi0JCQkJcEVudHJ5LT5hcGlkeCA9IGFwaWR4OwotCi0KLQkJCXsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQkJewotCQkJCQlwRW50cnktPkF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7Ci0JCQkJCXBFbnRyeS0+V2VwU3RhdHVzID0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOwotCQkJCQlwRW50cnktPlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJCQkJQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBwRW50cnktPmFwaWR4LCAoVUNIQVIpaSk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJfQotCi0JCQlwRW50cnktPkdUS1N0YXRlID0gUkVLRVlfTkVHT1RJQVRJTkc7Ci0JCQlwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9IDA7Ci0JCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQkJaWYgKHBFbnRyeS0+VmFsaWRBc0RscyA9PSBUUlVFKQotCQkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQkJCWVsc2UKLSNlbmRpZiAvL1FPU19ETFNfU1VQUE9SVAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0KLQkJCXBFbnRyeS0+UE1LSURfQ2FjaGVJZHggPSBFTlRSWV9OT1RfRk9VTkQ7Ci0JCQlDT1BZX01BQ19BRERSKHBFbnRyeS0+QWRkciwgcEFkZHIpOwotCQkJcEVudHJ5LT5Tc3QgPSBTU1RfTk9UX0FVVEg7Ci0JCQlwRW50cnktPkF1dGhTdGF0ZSA9IEFTX05PVF9BVVRIOwotCQkJcEVudHJ5LT5BaWQgPSAoVVNIT1JUKWk7ICAvLzA7Ci0JCQlwRW50cnktPkNhcGFiaWxpdHlJbmZvID0gMDsKLQkJCXBFbnRyeS0+UHNNb2RlID0gUFdSX0FDVElWRTsKLQkJCXBFbnRyeS0+UHNRSWRsZUNvdW50ID0gMDsKLQkJCXBFbnRyeS0+Tm9EYXRhSWRsZUNvdW50ID0gMDsKLQkJCXBFbnRyeS0+QXNzb2NEZWFkTGluZSA9IE1BQ19UQUJMRV9BU1NPQ19USU1FT1VUOwotCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCA9IDA7Ci0jaWZkZWYgV0RTX1NVUFBPUlQKLQkJCXBFbnRyeS0+TG9ja0VudHJ5VHggPSBGQUxTRTsKLQkJCXBFbnRyeS0+VGltZVN0YW1wX3RvVHhSaW5nID0gMDsKLSNlbmRpZiAvLyBXRFNfU1VQUE9SVCAvLwotCQkJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwRW50cnktPlBzUXVldWUpOwotCi0KLQkJCXBBZC0+TWFjVGFiLlNpemUgKys7Ci0JCQkvLyBBZGQgdGhpcyBlbnRyeSBpbnRvIEFTSUMgUlggV0NJRCBzZWFyY2ggdGFibGUKLQkJCVJUTVBfU1RBX0VOVFJZX0FERChwQWQsIHBFbnRyeSk7Ci0KLQotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZUluc2VydEVudHJ5IC0gYWxsb2NhdGUgZW50cnkgIyVkLCBUb3RhbD0gJWRcbiIsaSwgcEFkLT5NYWNUYWIuU2l6ZSkpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvLyBhZGQgdGhpcyBNQUMgZW50cnkgaW50byBIQVNIIHRhYmxlCi0JaWYgKHBFbnRyeSkKLQl7Ci0JCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKLQkJaWYgKHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKLQkJewotCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBDdXJyRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOwotCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCi0JCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OwotCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7Ci0JCX0KLQl9Ci0KLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCXJldHVybiBwRW50cnk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJRGVsZXRlIGEgc3BlY2lmaWVkIGNsaWVudCBmcm9tIE1BQyB0YWJsZQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gTWFjVGFibGVEZWxldGVFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgd2NpZCwKLQlJTiBQVUNIQVIgcEFkZHIpCi17Ci0JVVNIT1JUIEhhc2hJZHg7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnksICpwUHJldkVudHJ5LCAqcFByb2JlRW50cnk7Ci0JQk9PTEVBTiBDYW5jZWxsZWQ7Ci0JLy9VU0hPUlQJb2Zmc2V0OwkvLyB1bnVzZWQgdmFyaWFibGUKLQkvL1VDSEFSCWo7CQkJLy8gdW51c2VkIHZhcmlhYmxlCi0KLQlpZiAod2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLQotCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKLQkvL3BFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07Ci0JcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbd2NpZF07Ci0KLQlpZiAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkgfHwgcEVudHJ5LT5WYWxpZEFzV0RTIHx8IHBFbnRyeS0+VmFsaWRBc01lc2gKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJfHwgcEVudHJ5LT5WYWxpZEFzRGxzCi0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCSkpCi0JewotCQlpZiAoTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwQWRkcikpCi0JCXsKLQotCQkJLy8gRGVsZXRlIHRoaXMgZW50cnkgZnJvbSBBU0lDIG9uLWNoaXAgV0NJRCBUYWJsZQotCQkJUlRNUF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgd2NpZCk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCS8vIGZyZWUgcmVzb3VyY2VzIG9mIEJBCi0JCQlCQVNlc3Npb25UZWFyRG93bkFMTChwQWQsIHBFbnRyeS0+QWlkKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCi0JCQlwUHJldkVudHJ5ID0gTlVMTDsKLQkJCXBQcm9iZUVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKLQkJCUFTU0VSVChwUHJvYmVFbnRyeSk7Ci0KLQkJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKLQkJCWRvCi0JCQl7Ci0JCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKLQkJCQl7Ci0JCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpCi0JCQkJCXsKLQkJCQkJCXBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKLQkJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKLQkJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKLQotCQkJLy8gbm90IGZvdW5kICEhIQotCQkJQVNTRVJUKHBQcm9iZUVudHJ5ICE9IE5VTEwpOwotCi0JCQlSVE1QX1NUQV9FTlRSWV9LRVlfREVMKHBBZCwgQlNTMCwgd2NpZCk7Ci0KLQotCQlpZiAocEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyAhPSBFQVBPTF9TVEFSVF9ESVNBQkxFKQotCQl7Ci0gICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBFbnRyeS0+RW5xdWV1ZVN0YXJ0Rm9yUFNLVGltZXIsICZDYW5jZWxsZWQpOwotCQkJcEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyA9IEVBUE9MX1NUQVJUX0RJU0FCTEU7Ci0gICAgICAgIH0KLQotCi0JCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKLQkJCXBBZC0+TWFjVGFiLlNpemUgLS07Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZURlbGV0ZUVudHJ5MSAtIFRvdGFsPSAlZFxuIiwgcEFkLT5NYWNUYWIuU2l6ZSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlxuJXM6IEltcG9zc2libGUgV2NpZCA9ICVkICEhISEhXG4iLCBfX0ZVTkNUSU9OX18sIHdjaWQpKTsKLQkJfQotCX0KLQotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0KLQkvL1Jlc2V0IG9wZXJhdGluZyBtb2RlIHdoZW4gbm8gU3RhLgotCWlmIChwQWQtPk1hY1RhYi5TaXplID09IDApCi0JewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgPSAwOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkvL0FzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCAvKnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSovLCAoQUxMTl9TRVRQUk9URUNUKSwgVFJVRSwgMCAvKnBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YqLyk7Ci0JCVJUTVBfVVBEQVRFX1BST1RFQ1QocEFkKTsgIC8vIGVkaXQgYnkgam9obmxpLCBmaXggImluX2ludGVycnVwdCIgZXJyb3Igd2hlbiBjYWxsICJNYWNUYWJsZURlbGV0ZUVudHJ5IiBpbiBSeCB0YXNrbGV0Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlUaGlzIHJvdXRpbmUgcmVzZXQgdGhlIGVudGlyZSBNQUMgdGFibGUuIEFsbCBwYWNrZXRzIHBlbmRpbmcgaW4KLQkJdGhlIHBvd2VyLXNhdmluZyBxdWV1ZXMgYXJlIGZyZWVkIGhlcmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNYWNUYWJsZVJlc2V0KAotCUlOICBQUlRNUF9BREFQVEVSICBwQWQpCi17Ci0JaW50ICAgICAgICAgaTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY1RhYmxlUmVzZXRcbiIpKTsKLQkvL05kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0KLQotCWZvciAoaT0xOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCi0JewotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQlSVE1QX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCBpKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9PSBUUlVFKQotCSAgIHsKLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkvLyBmcmVlIHJlc291cmNlcyBvZiBCQQotCQkJQkFTZXNzaW9uVGVhckRvd25BTEwocEFkLCBpKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCQkJcEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID0gRkFMU0U7Ci0KLQotCi0KLQkJCS8vQXNpY0RlbFdjaWRUYWIocEFkLCBpKTsKLQkJfQotCX0KLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQXNzb2NQYXJtRmlsbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBPVVQgTUxNRV9BU1NPQ19SRVFfU1RSVUNUICpBc3NvY1JlcSwKLQlJTiBQVUNIQVIgICAgICAgICAgICAgICAgICAgICBwQWRkciwKLQlJTiBVU0hPUlQgICAgICAgICAgICAgICAgICAgICBDYXBhYmlsaXR5SW5mbywKLQlJTiBVTE9ORyAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0LAotCUlOIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIExpc3RlbkludHYpCi17Ci0JQ09QWV9NQUNfQUREUihBc3NvY1JlcS0+QWRkciwgcEFkZHIpOwotCS8vIEFkZCBtYXNrIHRvIHN1cHBvcnQgODAyLjExYiBtb2RlIG9ubHkKLQlBc3NvY1JlcS0+Q2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87IC8vIG5vdCBjZi1wb2xsYWJsZSwgbm90IGNmLXBvbGwtcmVxdWVzdAotCUFzc29jUmVxLT5UaW1lb3V0ID0gVGltZW91dDsKLQlBc3NvY1JlcS0+TGlzdGVuSW50diA9IExpc3RlbkludHY7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgRGlzYXNzb2NQYXJtRmlsbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBPVVQgTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICpEaXNhc3NvY1JlcSwKLQlJTiBQVUNIQVIgcEFkZHIsCi0JSU4gVVNIT1JUIFJlYXNvbikKLXsKLQlDT1BZX01BQ19BRERSKERpc2Fzc29jUmVxLT5BZGRyLCBwQWRkcik7Ci0JRGlzYXNzb2NSZXEtPlJlYXNvbiA9IFJlYXNvbjsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQ2hlY2sgdGhlIG91dCBnb2luZyBmcmFtZSwgaWYgdGhpcyBpcyBhbiBESENQIG9yIEFSUCBkYXRhZ3JhbQotCXdpbGwgYmUgZHVwbGljYXRlIGFub3RoZXIgZnJhbWUgYXQgbG93IGRhdGEgcmF0ZSB0cmFuc21pdC4KLQotCUFyZ3VtZW50czoKLQkJcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBQYWNrZXQJCVBvaW50ZXIgdG8gb3V0Z29pbmcgTmRpcyBmcmFtZQotCi0JUmV0dXJuIFZhbHVlOgotCQlUUlVFCQlUbyBiZSBkdXBsaWNhdGUgYXQgTG93IGRhdGEgcmF0ZSB0cmFuc21pdC4gKDFtYikKLQkJRkFMU0UJCURvIG5vdGhpbmcuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQkJTUFDIGhlYWRlciArIElQIEhlYWRlciArIFVEUCBIZWFkZXIKLQkJICAxNCBCeXRlcwkgIDIwIEJ5dGVzCi0KLQkJVURQIEhlYWRlcgotCQkwMHwwMXwwMnwwM3wwNHwwNXwwNnwwN3wwOHwwOXwxMHwxMXwxMnwxM3wxNHwxNXwKLQkJCQkJCVNvdXJjZSBQb3J0Ci0JCTE2fDE3fDE4fDE5fDIwfDIxfDIyfDIzfDI0fDI1fDI2fDI3fDI4fDI5fDMwfDMxfAotCQkJCQlEZXN0aW5hdGlvbiBQb3J0Ci0KLQkJcG9ydCAweDQzIG1lYW5zIEJvb3RzdHJhcCBQcm90b2NvbCwgc2VydmVyLgotCQlQb3J0IDB4NDQgbWVhbnMgQm9vdHN0cmFwIFByb3RvY29sLCBjbGllbnQuCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0KLUJPT0xFQU4gUlRNUENoZWNrREhDUEZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQotewotCVBBQ0tFVF9JTkZPCVBhY2tldEluZm87Ci0JVUxPTkcJCQlOdW1iZXJPZkJ5dGVzUmVhZCA9IDA7Ci0JVUxPTkcJCQlDdXJyZW50T2Zmc2V0ID0gMDsKLQlQVk9JRAkJCXBWaXJ0dWFsQWRkcmVzcyA9IE5VTEw7Ci0JVUlOVAkJCU5kaXNCdWZmZXJMZW5ndGg7Ci0JUFVDSEFSCQkJcFNyYzsKLQlVU0hPUlQJCQlQcm90b2NvbDsKLQlVQ0hBUgkJCUJ5dGVPZmZzZXQzNiA9IDA7Ci0JVUNIQVIJCQlCeXRlT2Zmc2V0MzggPSAwOwotCUJPT0xFQU4JCQlSZWFkRmlyc3RQYXJtID0gVFJVRTsKLQotCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAoUFVDSEFSICopJnBWaXJ0dWFsQWRkcmVzcywgJk5kaXNCdWZmZXJMZW5ndGgpOwotCi0JTnVtYmVyT2ZCeXRlc1JlYWQgKz0gTmRpc0J1ZmZlckxlbmd0aDsKLQlwU3JjID0gKFBVQ0hBUikgcFZpcnR1YWxBZGRyZXNzOwotCVByb3RvY29sID0gKihwU3JjICsgMTIpICogMjU2ICsgKihwU3JjICsgMTMpOwotCi0JLy8KLQkvLyBDaGVjayBESENQICYgQk9PVFAgcHJvdG9jb2wKLQkvLwotCXdoaWxlIChOdW1iZXJPZkJ5dGVzUmVhZCA8PSBQYWNrZXRJbmZvLlRvdGFsUGFja2V0TGVuZ3RoKQotCXsKLQkJaWYgKChOdW1iZXJPZkJ5dGVzUmVhZCA+PSAzNSkgJiYgKFJlYWRGaXJzdFBhcm0gPT0gVFJVRSkpCi0JCXsKLQkJCUN1cnJlbnRPZmZzZXQgPSAzNSAtIChOdW1iZXJPZkJ5dGVzUmVhZCAtIE5kaXNCdWZmZXJMZW5ndGgpOwotCQkJQnl0ZU9mZnNldDM2ID0gKihwU3JjICsgQ3VycmVudE9mZnNldCk7Ci0JCQlSZWFkRmlyc3RQYXJtID0gRkFMU0U7Ci0JCX0KLQotCQlpZiAoTnVtYmVyT2ZCeXRlc1JlYWQgPj0gMzcpCi0JCXsKLQkJCUN1cnJlbnRPZmZzZXQgPSAzNyAtIChOdW1iZXJPZkJ5dGVzUmVhZCAtIE5kaXNCdWZmZXJMZW5ndGgpOwotCQkJQnl0ZU9mZnNldDM4ID0gKihwU3JjICsgQ3VycmVudE9mZnNldCk7Ci0JCQkvL0VuZCBvZiBSZWFkCi0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JLy8gQ2hlY2sgZm9yIERIQ1AgJiBCT09UUCBwcm90b2NvbAotCWlmICgoQnl0ZU9mZnNldDM2ICE9IDB4NDQpIHx8IChCeXRlT2Zmc2V0MzggIT0gMHg0MykpCi0JCXsKLQkJLy8KLQkJLy8gMjA1NCAoaGV4IDA4MDYpIGZvciBBUlAgZGF0YWdyYW1zCi0JCS8vIGlmIHRoaXMgcGFja2V0IGlzIG5vdCBBUlAgZGF0YWdyYW1zLCB0aGVuIGRvIG5vdGhpbmcKLQkJLy8gQVJQIGRhdGFncmFtcyB3aWxsIGFsc28gYmUgZHVwbGljYXRlIGF0IDFtYiBicm9hZGNhc3QgZnJhbWVzCi0JCS8vCi0JCWlmIChQcm90b2NvbCAhPSAweDA4MDYgKQotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1CT09MRUFOIFJUTVBDaGVja0V0aGVyVHlwZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKLXsKLQlVU0hPUlQJVHlwZUxlbjsKLQlVQ0hBUglCeXRlMCwgQnl0ZTE7Ci0JUFVDSEFSCXBTcmNCdWY7Ci0JVUlOVDMyCXBrdExlbjsKLQlVSU5UMTYJc3JjUG9ydCwgZHN0UG9ydDsKLQlCT09MRUFOCXN0YXR1cyA9IFRSVUU7Ci0KLQotCXBTcmNCdWYgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7Ci0JcGt0TGVuID0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7Ci0KLQlBU1NFUlQocFNyY0J1Zik7Ci0KLQlSVE1QX1NFVF9QQUNLRVRfU1BFQ0lGSUMocFBhY2tldCwgMCk7Ci0KLQkvLyBnZXQgRXRoZXJuZXQgcHJvdG9jb2wgZmllbGQKLQlUeXBlTGVuID0gKHBTcmNCdWZbMTJdIDw8IDgpICsgcFNyY0J1ZlsxM107Ci0KLQlwU3JjQnVmICs9IExFTkdUSF84MDJfMzsJLy8gU2tpcCB0aGUgRXRoZXJuZXQgSGVhZGVyLgotCi0JaWYgKFR5cGVMZW4gPD0gMTUwMCkKLQl7CS8vIDgwMi4zLCA4MDIuMyBMTEMKLQkJLyoKLQkJCURlc3RNQUMoNikgKyBTcmNNQUMoNikgKyBMZW5naHQoMikgKwotCQkJRFNBUCgxKSArIFNTQVAoMSkgKyBDb250cm9sKDEpICsKLQkJCWlmIHRoZSBEU0FQID0gMHhBQSwgU1NBUD0weEFBLCBDb250b3JsID0gMHgwMywgaXQgaGFzIGEgNS1ieXRlcyBTTkFQIGhlYWRlci4KLQkJCQk9PiArIFNOQVAgKDUsIE9yaWdpbmF0aW9uSUQoMykgKyBldGhlclR5cGUoMikpCi0JCSovCi0JCWlmIChwU3JjQnVmWzBdID09IDB4QUEgJiYgcFNyY0J1ZlsxXSA9PSAweEFBICYmIHBTcmNCdWZbMl0gPT0gMHgwMykKLQkJewotCQkJU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcigoUE5ESVNfQlVGRkVSKXBTcmNCdWYsIDYsICZCeXRlMCwgJkJ5dGUxKTsKLQkJCVJUTVBfU0VUX1BBQ0tFVF9MTENTTkFQKHBQYWNrZXQsIDEpOwotCQkJVHlwZUxlbiA9IChVU0hPUlQpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKLQkJCXBTcmNCdWYgKz0gODsgLy8gU2tpcCB0aGlzIExMQy9TTkFQIGhlYWRlcgotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy9JdCBqdXN0IGhhcyAzLWJ5dGUgTExDIGhlYWRlciwgbWF5YmUgYSBsZWdhY3kgZXRoZXIgdHlwZSBmcmFtZS4gd2UgZGlkbid0IGhhbmRsZSBpdC4KLQkJfQotCX0KLQotCS8vIElmIGl0J3MgYSBWTEFOIHBhY2tldCwgZ2V0IHRoZSByZWFsIFR5cGUvTGVuZ3RoIGZpZWxkLgotCWlmIChUeXBlTGVuID09IDB4ODEwMCkKLQl7Ci0JCS8qIDB4ODEwMCBtZWFucyBWTEFOIHBhY2tldHMgKi8KLQotCQkvKiBEZXN0LiBNQUMgQWRkcmVzcyAoNi1ieXRlcykgKwotCQkgICBTb3VyY2UgTUFDIEFkZHJlc3MgKDYtYnl0ZXMpICsKLQkJICAgTGVuZ3RoL1R5cGUgPSA4MDIuMVEgVGFnIFR5cGUgKDItYnl0ZSkgKwotCQkgICBUYWcgQ29udHJvbCBJbmZvcm1hdGlvbiAoMi1ieXRlcykgKwotCQkgICBMZW5ndGggLyBUeXBlICgyLWJ5dGVzKSArCi0JCSAgIGRhdGEgcGF5bG9hZCAoMC1uIGJ5dGVzKSArCi0JCSAgIFBhZCAoMC1wIGJ5dGVzKSArCi0JCSAgIEZyYW1lIENoZWNrIFNlcXVlbmNlICg0LWJ5dGVzKSAqLwotCi0JCVJUTVBfU0VUX1BBQ0tFVF9WTEFOKHBQYWNrZXQsIDEpOwotCQlTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKChQTkRJU19CVUZGRVIpcFNyY0J1ZiwgMiwgJkJ5dGUwLCAmQnl0ZTEpOwotCQlUeXBlTGVuID0gKFVTSE9SVCkoKEJ5dGUwIDw8IDgpICsgQnl0ZTEpOwotCi0JCXBTcmNCdWYgKz0gNDsgLy8gU2tpcCB0aGUgVkxBTiBIZWFkZXIuCi0JfQotCi0Jc3dpdGNoIChUeXBlTGVuKQotCXsKLQkJY2FzZSAweDA4MDA6Ci0JCQl7Ci0JCQkJQVNTRVJUKChwa3RMZW4gPiAzNCkpOwotCQkJCWlmICgqKHBTcmNCdWYgKyA5KSA9PSAweDExKQotCQkJCXsJLy8gdWRwIHBhY2tldAotCQkJCQlBU1NFUlQoKHBrdExlbiA+IDM0KSk7CS8vIDE0IGZvciBldGhlcm5ldCBoZWFkZXIsIDIwIGZvciBJUCBoZWFkZXIKLQotCQkJCQlwU3JjQnVmICs9IDIwOwkvLyBTa2lwIHRoZSBJUCBoZWFkZXIKLQkJCQkJc3JjUG9ydCA9IE9TX05UT0hTKGdldF91bmFsaWduZWQoKFBVSU5UMTYpKHBTcmNCdWYpKSk7Ci0JCQkJCWRzdFBvcnQgPSBPU19OVE9IUyhnZXRfdW5hbGlnbmVkKChQVUlOVDE2KShwU3JjQnVmKzIpKSk7Ci0KLQkJCQkJaWYgKChzcmNQb3J0PT0weDQ0ICYmIGRzdFBvcnQ9PTB4NDMpIHx8IChzcmNQb3J0PT0weDQzICYmIGRzdFBvcnQ9PTB4NDQpKQotCQkJCQl7CS8vSXQncyBhIEJPT1RQL0RIQ1AgcGFja2V0Ci0JCQkJCQlSVE1QX1NFVF9QQUNLRVRfREhDUChwUGFja2V0LCAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDB4MDgwNjoKLQkJCXsKLQkJCQkvL0FSUCBQYWNrZXQuCi0JCQkJUlRNUF9TRVRfUEFDS0VUX0RIQ1AocFBhY2tldCwgMSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAweDg4OGU6Ci0JCQl7Ci0JCQkJLy8gRUFQT0wgUGFja2V0LgotCQkJCVJUTVBfU0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0LCAxKTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3RhdHVzID0gRkFMU0U7Ci0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotCi19Ci0KLQotCi1WT0lEIFVwZGF0ZV9Sc3NpX1NhbXBsZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBSU1NJX1NBTVBMRQkJKnBSc3NpLAotCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSkKLQkJewotCUNIQVIJcnNzaTAgPSBwUnhXSS0+UlNTSTA7Ci0JQ0hBUglyc3NpMSA9IHBSeFdJLT5SU1NJMTsKLQlDSEFSCXJzc2kyID0gcFJ4V0ktPlJTU0kyOwotCi0JaWYgKHJzc2kwICE9IDApCi0JewotCQlwUnNzaS0+TGFzdFJzc2kwCT0gQ29udmVydFRvUnNzaShwQWQsIChDSEFSKXJzc2kwLCBSU1NJXzApOwotCQlwUnNzaS0+QXZnUnNzaTBYOAk9IChwUnNzaS0+QXZnUnNzaTBYOCAtIHBSc3NpLT5BdmdSc3NpMCkgKyBwUnNzaS0+TGFzdFJzc2kwOwotCQlwUnNzaS0+QXZnUnNzaTAJPSBwUnNzaS0+QXZnUnNzaTBYOCA+PiAzOwotCX0KLQotCWlmIChyc3NpMSAhPSAwKQotCXsKLQkJcFJzc2ktPkxhc3RSc3NpMQk9IENvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUilyc3NpMSwgUlNTSV8xKTsKLQkJcFJzc2ktPkF2Z1Jzc2kxWDgJPSAocFJzc2ktPkF2Z1Jzc2kxWDggLSBwUnNzaS0+QXZnUnNzaTEpICsgcFJzc2ktPkxhc3RSc3NpMTsKLQkJcFJzc2ktPkF2Z1Jzc2kxCT0gcFJzc2ktPkF2Z1Jzc2kxWDggPj4gMzsKLQl9Ci0KLQlpZiAocnNzaTIgIT0gMCkKLQl7Ci0JCXBSc3NpLT5MYXN0UnNzaTIJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpcnNzaTIsIFJTU0lfMik7Ci0JCXBSc3NpLT5BdmdSc3NpMlg4ICA9IChwUnNzaS0+QXZnUnNzaTJYOCAtIHBSc3NpLT5BdmdSc3NpMikgKyBwUnNzaS0+TGFzdFJzc2kyOwotCQlwUnNzaS0+QXZnUnNzaTIgPSBwUnNzaS0+QXZnUnNzaTJYOCA+PiAzOwotCX0KLX0KLQotCi0KLS8vIE5vcm1hbCBsZWdhY3kgUnggcGFja2V0IGluZGljYXRpb24KLVZPSUQgSW5kaWNhdGVfTGVnYWN5X1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0JUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OwotCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKLQotCS8vIDEuIGdldCA4MDIuMyBIZWFkZXIKLQkvLyAyLiByZW1vdmUgTExDCi0JLy8JCWEuIHBvaW50ZXIgcFJ4QmxrLT5wRGF0YSB0byBwYXlsb2FkCi0JLy8gICAgICBiLiBtb2RpZnkgcFJ4QmxrLT5EYXRhU2l6ZQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCVJUTVBfODAyXzExX1JFTU9WRV9MTENfQU5EX0NPTlZFUlRfVE9fODAyXzMocFJ4QmxrLCBIZWFkZXI4MDJfMyk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlpZiAocFJ4QmxrLT5EYXRhU2l6ZSA+IE1BWF9SWF9QS1RfTEVOKQotCXsKLQotCQkvLyByZWxlYXNlIHBhY2tldAotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJcmV0dXJuOwotCX0KLQotCi0JU1RBVFNfSU5DX1JYX1BBQ0tFVFMocEFkLCBGcm9tV2hpY2hCU1NJRCk7Ci0KLQotCXdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldChwQWQsIHBSeEJsaywgSGVhZGVyODAyXzMsIEZyb21XaGljaEJTU0lEKTsKLQotCS8vCi0JLy8gcGFzcyB0aGlzIDgwMi4zIHBhY2tldCB0byB1cHBlciBsYXllciBvciBmb3J3YXJkIHRoaXMgcGFja2V0IHRvIFdNIGRpcmVjdGx5Ci0JLy8KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgRnJvbVdoaWNoQlNTSUQpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi19Ci0KLQotLy8gTm9ybWFsLCBBTVBEVSBvciBBTVNEVQotVk9JRCBDbW1SeG5vblJhbGlua0ZyYW1lSW5kaWNhdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQotewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNUERVKSAmJiAocEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID09IDApKQotCXsKLQkJSW5kaWNhdGVfQU1QRFVfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQl7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSkKLQkJewotCQkJLy8gaGFuZGxlIEEtTVNEVQotCQkJSW5kaWNhdGVfQU1TRFVfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCX0KLQkJZWxzZQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQl7Ci0JCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCX0KLQl9Ci19Ci0KLQotVk9JRCBDbW1SeFJhbGlua0ZyYW1lSW5kaWNhdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQotewotCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKLQlVSU5UMTYJCQlNc2R1MlNpemU7Ci0JVUlOVDE2CQkJUGF5bG9hZDFTaXplLCBQYXlsb2FkMlNpemU7Ci0JUFVDSEFSCQkJcERhdGEyOwotCVBORElTX1BBQ0tFVAlwUGFja2V0MiA9IE5VTEw7Ci0KLQotCi0JTXNkdTJTaXplID0gKihwUnhCbGstPnBEYXRhKSArICgqKHBSeEJsay0+cERhdGErMSkgPDwgOCk7Ci0KLQlpZiAoKE1zZHUyU2l6ZSA8PSAxNTM2KSAmJiAoTXNkdTJTaXplIDwgcFJ4QmxrLT5EYXRhU2l6ZSkpCi0JewotCQkvKiBza2lwIHR3byBieXRlIE1TRFUyIGxlbiAqLwotCQlwUnhCbGstPnBEYXRhICs9IDI7Ci0JCXBSeEJsay0+RGF0YVNpemUgLT0gMjsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vIGdldCA4MDIuMyBIZWFkZXIgYW5kICByZW1vdmUgTExDCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJUlRNUF84MDJfMTFfUkVNT1ZFX0xMQ19BTkRfQ09OVkVSVF9UT184MDJfMyhwUnhCbGssIEhlYWRlcjgwMl8zKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0JQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKLQotCS8vIFJhbGluayBBZ2dyZWdhdGlvbiBmcmFtZQotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhBZ2dyZWdhdGlvbkNvdW50ICsrOwotCVBheWxvYWQxU2l6ZSA9IHBSeEJsay0+RGF0YVNpemUgLSBNc2R1MlNpemU7Ci0JUGF5bG9hZDJTaXplID0gTXNkdTJTaXplIC0gTEVOR1RIXzgwMl8zOwotCi0JcERhdGEyID0gcFJ4QmxrLT5wRGF0YSArIFBheWxvYWQxU2l6ZSArIExFTkdUSF84MDJfMzsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlwUGFja2V0MiA9IGR1cGxpY2F0ZV9wa3QocEFkLCAocERhdGEyLUxFTkdUSF84MDJfMyksIExFTkdUSF84MDJfMywgcERhdGEyLCBQYXlsb2FkMlNpemUsIEZyb21XaGljaEJTU0lEKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCWlmICghcFBhY2tldDIpCi0JewotCQkvLyByZWxlYXNlIHBhY2tldAotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gdXBkYXRlIHBheWxvYWQgc2l6ZSBvZiAxc3QgcGFja2V0Ci0JcFJ4QmxrLT5EYXRhU2l6ZSA9IFBheWxvYWQxU2l6ZTsKLQl3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQocEFkLCBwUnhCbGssIEhlYWRlcjgwMl8zLCBGcm9tV2hpY2hCU1NJRCk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlpZiAocFBhY2tldDIpCi0JewotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUGFja2V0MiwgRnJvbVdoaWNoQlNTSUQpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLX0KLQotCi0jZGVmaW5lIFJFU0VUX0ZSQUdGUkFNRShfZnJhZ0ZyYW1lKSBcCi0JewkJCQkJCQkJXAotCQlfZnJhZ0ZyYW1lLlJ4U2l6ZSA9IDA7CQlcCi0JCV9mcmFnRnJhbWUuU2VxdWVuY2UgPSAwOwlcCi0JCV9mcmFnRnJhbWUuTGFzdEZyYWcgPSAwOwlcCi0JCV9mcmFnRnJhbWUuRmxhZ3MgPSAwOwkJXAotCX0KLQotCi1QTkRJU19QQUNLRVQgUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaykKLXsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOwotCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKLQlVQ0hBUgkJCSpwRGF0YSA9IHBSeEJsay0+cERhdGE7Ci0JVVNIT1JUCQkJRGF0YVNpemUgPSBwUnhCbGstPkRhdGFTaXplOwotCVBORElTX1BBQ0tFVAlwUmV0UGFja2V0ID0gTlVMTDsKLQlVQ0hBUgkJCSpwRnJhZ0J1ZmZlciA9IE5VTEw7Ci0JQk9PTEVBTgkJCWJSZWFzc0RvbmUgPSBGQUxTRTsKLQlVQ0hBUgkJCUhlYWRlclJvb20gPSAwOwotCi0KLQlBU1NFUlQocEhlYWRlcik7Ci0KLQlIZWFkZXJSb29tID0gcERhdGEgLSAoVUNIQVIgKilwSGVhZGVyOwotCi0JLy8gUmUtYXNzZW1ibGUgdGhlIGZyYWdtZW50ZWQgcGFja2V0cwotCWlmIChwSGVhZGVyLT5GcmFnID09IDApCQkvLyBGcmFnLiBOdW1iZXIgaXMgMCA6IEZpcnN0IGZyYWcgb3Igb25seSBvbmUgcGt0Ci0JewotCQkvLyB0aGUgZmlyc3QgcGt0IG9mIGZyYWdtZW50LCByZWNvcmQgaXQuCi0JCWlmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZykKLQkJewotCQkJQVNTRVJUKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KTsKLQkJCXBGcmFnQnVmZmVyID0gR0VUX09TX1BLVF9EQVRBUFRSKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KTsKLQkJCXBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSAgID0gRGF0YVNpemUgKyBIZWFkZXJSb29tOwotCQkJTmRpc01vdmVNZW1vcnkocEZyYWdCdWZmZXIsCSBwSGVhZGVyLCBwQWQtPkZyYWdGcmFtZS5SeFNpemUpOwotCQkJcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UgPSBwSGVhZGVyLT5TZXF1ZW5jZTsKLQkJCXBBZC0+RnJhZ0ZyYW1lLkxhc3RGcmFnID0gcEhlYWRlci0+RnJhZzsJICAgLy8gU2hvdWxkIGJlIDAKLQkJCUFTU0VSVChwQWQtPkZyYWdGcmFtZS5MYXN0RnJhZyA9PSAwKTsKLQkJCWdvdG8gZG9uZTsJLy8gZW5kIG9mIHByb2Nlc3NpbmcgdGhpcyBmcmFtZQotCQl9Ci0JfQotCWVsc2UJLy9NaWRkbGUgJiBFbmQgb2YgZnJhZ21lbnQKLQl7Ci0JCWlmICgocEhlYWRlci0+U2VxdWVuY2UgIT0gcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UpIHx8Ci0JCQkocEhlYWRlci0+RnJhZyAhPSAocEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgKyAxKSkpCi0JCXsKLQkJCS8vIEZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyCi0JCQkvLyBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsawotCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyLlxuIikpOwotCQkJZ290byBkb25lOyAvLyBnaXZlIHVwIHRoaXMgZnJhbWUKLQkJfQotCQllbHNlIGlmICgocEFkLT5GcmFnRnJhbWUuUnhTaXplICsgRGF0YVNpemUpID4gTUFYX0ZSQU1FX1NJWkUpCi0JCXsKLQkJCS8vIEZyYWdtZW50IGZyYW1lIGlzIHRvbyBsYXJnZSwgaXQgZXhlZWRzIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUuCi0JCQkvLyBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsawotCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZyYWdtZW50IGZyYW1lIGlzIHRvbyBsYXJnZSwgaXQgZXhlZWRzIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUuXG4iKSk7Ci0JCQlnb3RvIGRvbmU7IC8vIGdpdmUgdXAgdGhpcyBmcmFtZQotCQl9Ci0KLSAgICAgICAgLy8KLQkJLy8gQnJvYWRjb20gQVAoQkNNOTQ3MDRBR1IpIHdpbGwgc2VuZCBvdXQgTExDIGluIGZyYWdtZW50J3MgcGFja2V0LCBMTEMgb25seSBjYW4gYWNjcGV0IGF0IGZpcnN0IGZyYWdtZW50LgotCQkvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgZHJvcHQgaXQuCi0JCS8vCi0JCWlmIChOZGlzRXF1YWxNZW1vcnkocERhdGEsIFNOQVBfODAyXzFILCBzaXplb2YoU05BUF84MDJfMUgpKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRmluZCBhbm90aGVyIExMQyBhdCBNaWRkbGUgb3IgRW5kIGZyYWdtZW50KFNOPSVkLCBGcmFnPSVkKVxuIiwgcEhlYWRlci0+U2VxdWVuY2UsIHBIZWFkZXItPkZyYWcpKTsKLQkJCWdvdG8gZG9uZTsgLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCi0JCX0KLQotCQlwRnJhZ0J1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCk7Ci0KLQkJLy8gY29uY2F0ZW5hdGUgdGhpcyBmcmFnbWVudCBpbnRvIHRoZSByZS1hc3NlbWJseSBidWZmZXIKLQkJTmRpc01vdmVNZW1vcnkoKHBGcmFnQnVmZmVyICsgcEFkLT5GcmFnRnJhbWUuUnhTaXplKSwgcERhdGEsIERhdGFTaXplKTsKLQkJcEFkLT5GcmFnRnJhbWUuUnhTaXplICArPSBEYXRhU2l6ZTsKLQkJcEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgPSBwSGVhZGVyLT5GcmFnOwkgICAvLyBVcGRhdGUgZnJhZ21lbnQgbnVtYmVyCi0KLQkJLy8gTGFzdCBmcmFnbWVudAotCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcgPT0gRkFMU0UpCi0JCXsKLQkJCWJSZWFzc0RvbmUgPSBUUlVFOwotCQl9Ci0JfQotCi1kb25lOgotCS8vIGFsd2F5cyByZWxlYXNlIHJ4IGZyYWdtZW50ZWQgcGFja2V0Ci0JUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0KLQkvLyByZXR1cm4gZGVmcmFnbWVudGVkIHBhY2tldCBpZiBwYWNrZXQgaXMgcmVhc3NlbWJsZWQgY29tcGxldGVseQotCS8vIG90aGVyd2lzZSByZXR1cm4gTlVMTAotCWlmIChiUmVhc3NEb25lKQotCXsKLQkJUE5ESVNfUEFDS0VUIHBOZXdGcmFnUGFja2V0OwotCi0JCS8vIGFsbG9jYXRlIGEgbmV3IHBhY2tldCBidWZmZXIgZm9yIGZyYWdtZW50Ci0JCXBOZXdGcmFnUGFja2V0ID0gUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfTk9STVNJWkUpOwotCQlpZiAocE5ld0ZyYWdQYWNrZXQpCi0JCXsKLQkJCS8vIHVwZGF0ZSBSeEJsawotCQkJcFJldFBhY2tldCA9IHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0OwotCQkJcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPSBwTmV3RnJhZ1BhY2tldDsKLQkJCXBSeEJsay0+cEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgR0VUX09TX1BLVF9EQVRBUFRSKHBSZXRQYWNrZXQpOwotCQkJcFJ4QmxrLT5wRGF0YSA9IChVQ0hBUiAqKXBSeEJsay0+cEhlYWRlciArIEhlYWRlclJvb207Ci0JCQlwUnhCbGstPkRhdGFTaXplID0gcEFkLT5GcmFnRnJhbWUuUnhTaXplIC0gSGVhZGVyUm9vbTsKLQkJCXBSeEJsay0+cFJ4UGFja2V0ID0gcFJldFBhY2tldDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJFU0VUX0ZSQUdGUkFNRShwQWQtPkZyYWdGcmFtZSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcFJldFBhY2tldDsKLX0KLQotCi1WT0lEIEluZGljYXRlX0FNU0RVX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0JVUlOVAkJCW5NU0RVOwotCi0JdXBkYXRlX29zX3BhY2tldF9pbmZvKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JUlRNUF9TRVRfUEFDS0VUX0lGKHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7Ci0Jbk1TRFUgPSBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplKTsKLX0KLQotVk9JRCBJbmRpY2F0ZV9FQVBPTF9QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQotewotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOwotCQlTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZShwQWQsIHBFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlpZiAocEVudHJ5ID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIkluZGljYXRlX0VBUE9MX1BhY2tldDogZHJvcCBhbmQgcmVsZWFzZSB0aGUgaW52YWxpZCBwYWNrZXQuXG4iKSk7Ci0JCS8vIHJlbGVhc2UgcGFja2V0Ci0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCXJldHVybjsKLQl9Ci19Ci0KLSNkZWZpbmUgQkNOX1RCVFRfT0ZGU0VUCQk2NAkvL2RlZmVyIDY0IHVzCi1WT0lEIFJlU3luY0JlYWNvblRpbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCi17Ci0KLQlVSU5UMzIgIE9mZnNldDsKLQotCi0JT2Zmc2V0ID0gKHBBZC0+VGJ0dFRpY2tDb3VudCkgJSAoQkNOX1RCVFRfT0ZGU0VUKTsKLQotCXBBZC0+VGJ0dFRpY2tDb3VudCsrOwotCi0JLy8KLQkvLyBUaGUgdXBkYXRlZCBCZWFjb25JbnRlcnZhbCBWYWx1ZSB3aWxsIGFmZmVjdCBCZWFjb24gSW50ZXJ2YWwgYWZ0ZXIgdHdvIFRCVFQKLQkvLyBiZWFjYXN1ZSB0aGUgb3JpZ2luYWwgQmVhY29uSW50ZXJ2YWwgaGFkIGJlZW4gbG9hZGVkIGludG8gbmV4dCBUQlRUX1RJTUVSCi0JLy8KLQlpZiAoT2Zmc2V0ID09IChCQ05fVEJUVF9PRkZTRVQtMikpCi0JewotCQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOwotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKLQkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCA0KSAtIDEgOwkvLyBBU0lDIHJlZ2lzdGVyIGluIHVuaXRzIG9mIDEvMTYgVFUgPSA2NHVzCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOwotCX0KLQllbHNlCi0JewotCQlpZiAoT2Zmc2V0ID09IChCQ05fVEJUVF9PRkZTRVQtMSkpCi0JCXsKLQkJCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7Ci0KLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOwotCQkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCkgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCi0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9kYXRhX3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2RhdGFfcGNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NGY4MTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2RhdGFfcGNpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTc2ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoKLSAgIEFsbCBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIG11c3QgYmUgUENJLWRlcGVuZGVkLCBvciB5b3Ugc2hvdWxkIG91dCB5b3VyIGZ1bmN0aW9uCi0JaW4gb3RoZXIgZmlsZXMuCi0KLSovCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JQk9PTEVBTgkJCWJJc0xhc3QsCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQotewotCi0JVUNIQVIJCQkqcERNQUhlYWRlckJ1ZlZBOwotCVVTSE9SVAkJCVR4SWR4LCBSZXRUeElkeDsKLQlQVFhEX1NUUlVDCQlwVHhEOwotCVVJTlQzMgkJCUJ1ZkJhc2VQYUxvdzsKLQlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7Ci0JVVNIT1JUCQkJaHdIZWFkZXJMZW47Ci0KLQkvLwotCS8vIGdldCBUeCBSaW5nIFJlc291cmNlCi0JLy8KLQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKLQlUeElkeCA9IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeDsKLQlwRE1BSGVhZGVyQnVmVkEgPSAoUFVDSEFSKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKLQlCdWZCYXNlUGFMb3cgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7Ci0KLQkvLyBjb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCi0JaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1TRFVfRlJBTUUpCi0JewotCQkvL2h3SGVhZGVyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLUxFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQsIDQpK0xFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7Ci0JCWh3SGVhZGVyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuIC0gTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHBUeEJsay0+SGRyUGFkTGVuICsgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKLQl9Ci0JZWxzZQotCXsKLQkJLy9od0hlYWRlckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7Ci0JCWh3SGVhZGVyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47Ci0JfQotCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW4pOwotCi0JcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7Ci0JcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQotCS8vCi0JLy8gYnVpbGQgVHggRGVzY3JpcHRvcgotCS8vCi0KLQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0JTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOwotCi0JcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OwotCXBUeEQtPlNETGVuMCA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW47IC8vIGluY2x1ZGUgcGFkZGluZwotCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQlwVHhELT5TRExlbjEgPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQlwVHhELT5MYXN0U2VjMCA9IDA7Ci0JcFR4RC0+TGFzdFNlYzEgPSAoYklzTGFzdCkgPyAxIDogMDsKLQotCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIEZBTFNFLCBGSUZPX0VEQ0EpOwotCi0JUmV0VHhJZHggPSBUeElkeDsKLQkvLwotCS8vIFVwZGF0ZSBUeCBpbmRleAotCS8vCi0JSU5DX1JJTkdfSU5ERVgoVHhJZHgsIFRYX1JJTkdfU0laRSk7Ci0JcFR4UmluZy0+VHhDcHVJZHggPSBUeElkeDsKLQotCSpGcmVlTnVtYmVyIC09IDE7Ci0KLQlyZXR1cm4gUmV0VHhJZHg7Ci19Ci0KLQotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVTaW5nbGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JQk9PTEVBTgkJCWJJc0xhc3QsCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQotewotCi0JVUNIQVIJCQkqcERNQUhlYWRlckJ1ZlZBOwotCVVTSE9SVAkJCVR4SWR4LCBSZXRUeElkeDsKLQlQVFhEX1NUUlVDCQlwVHhEOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7Ci0gICAgVFhEX1NUUlVDICAgICAgIFR4RDsKLSNlbmRpZgotCVVJTlQzMgkJCUJ1ZkJhc2VQYUxvdzsKLQlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7Ci0JVVNIT1JUCQkJaHdIZWFkZXJMZW47Ci0KLQkvLwotCS8vIGdldCBUeCBSaW5nIFJlc291cmNlCi0JLy8KLQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKLQlUeElkeCA9IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeDsKLQlwRE1BSGVhZGVyQnVmVkEgPSAoUFVDSEFSKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKLQlCdWZCYXNlUGFMb3cgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7Ci0KLQkvLyBjb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCi0JLy9od0hlYWRlckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7Ci0JaHdIZWFkZXJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKLQotCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW4pOwotCi0JcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7Ci0JcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQotCS8vCi0JLy8gYnVpbGQgVHggRGVzY3JpcHRvcgotCS8vCi0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0jZWxzZQotCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0JVHhEID0gKnBEZXN0VHhEOwotCXBUeEQgPSAmVHhEOwotI2VuZGlmCi0JTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOwotCi0JcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OwotCXBUeEQtPlNETGVuMCA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW47IC8vIGluY2x1ZGUgcGFkZGluZwotCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTs7Ci0JcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47Ci0JcFR4RC0+TGFzdFNlYzAgPSAwOwotCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7Ci0KLQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpKHBETUFIZWFkZXJCdWZWQSArIFRYSU5GT19TSVpFKSwgVFlQRV9UWFdJKTsKLQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKShwRE1BSGVhZGVyQnVmVkEgKyBUWElORk9fU0laRSArIFRYV0lfU0laRSksIERJUl9XUklURSwgRkFMU0UpOwotCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotCVdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIEZBTFNFLCBUWVBFX1RYRCk7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCi0JUmV0VHhJZHggPSBUeElkeDsKLQkvLwotCS8vIFVwZGF0ZSBUeCBpbmRleAotCS8vCi0JSU5DX1JJTkdfSU5ERVgoVHhJZHgsIFRYX1JJTkdfU0laRSk7Ci0JcFR4UmluZy0+VHhDcHVJZHggPSBUeElkeDsKLQotCSpGcmVlTnVtYmVyIC09IDE7Ci0KLQlyZXR1cm4gUmV0VHhJZHg7Ci19Ci0KLQotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVNdWx0aVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYW1lTnVtLAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKLXsKLQlCT09MRUFOIGJJc0xhc3Q7Ci0JVUNIQVIJCQkqcERNQUhlYWRlckJ1ZlZBOwotCVVTSE9SVAkJCVR4SWR4LCBSZXRUeElkeDsKLQlQVFhEX1NUUlVDCQlwVHhEOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7Ci0gICAgVFhEX1NUUlVDICAgICAgIFR4RDsKLSNlbmRpZgotCVVJTlQzMgkJCUJ1ZkJhc2VQYUxvdzsKLQlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7Ci0JVVNIT1JUCQkJaHdIZHJMZW47Ci0JVUlOVDMyCQkJZmlyc3RETUFMZW47Ci0KLQliSXNMYXN0ID0gKChmcmFtZU51bSA9PSAocFR4QmxrLT5Ub3RhbEZyYW1lTnVtIC0gMSkpID8gMSA6IDApOwotCi0JLy8KLQkvLyBnZXQgVHggUmluZyBSZXNvdXJjZQotCS8vCi0JcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07Ci0JVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7Ci0JcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7Ci0JQnVmQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOwotCi0JaWYgKGZyYW1lTnVtID09IDApCi0JewotCQkvLyBjb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCi0JCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKQotCQkJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFELCA0KStMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOwotCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gLSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsgcFR4QmxrLT5IZHJQYWRMZW4gKyBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOwotCQllbHNlIGlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRSkKLQkJCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxELCA0KStMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQ7Ci0JCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiAtIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRCArIHBUeEJsay0+SGRyUGFkTGVuICsgTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxEOwotCQllbHNlCi0JCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsKLQkJCWh3SGRyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47Ci0KLQkJZmlyc3RETUFMZW4gPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuOwotCX0KLQllbHNlCi0JewotCQlmaXJzdERNQUxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKLQl9Ci0KLQlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkEsIHBUeEJsay0+SGVhZGVyQnVmLCBmaXJzdERNQUxlbik7Ci0KLQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IHBUeEJsay0+cFBhY2tldDsKLQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JLy8KLQkvLyBidWlsZCBUeCBEZXNjcmlwdG9yCi0JLy8KLSNpZm5kZWYgUlRfQklHX0VORElBTgotCXBUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLSNlbHNlCi0JcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLQlUeEQgPSAqcERlc3RUeEQ7Ci0JcFR4RCA9ICZUeEQ7Ci0jZW5kaWYKLQlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7Ci0KLQlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7Ci0JcFR4RC0+U0RMZW4wID0gZmlyc3RETUFMZW47IC8vIGluY2x1ZGUgcGFkZGluZwotCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTs7Ci0JcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47Ci0JcFR4RC0+TGFzdFNlYzAgPSAwOwotCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7Ci0KLQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlpZiAoZnJhbWVOdW0gPT0gMCkKLQkJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUikocERNQUhlYWRlckJ1ZlZBKyBUWElORk9fU0laRSArIFRYV0lfU0laRSksIERJUl9XUklURSwgRkFMU0UpOwotCi0JaWYgKGZyYW1lTnVtICE9IDApCi0JCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKShwRE1BSGVhZGVyQnVmVkEgKyBUWElORk9fU0laRSksIFRZUEVfVFhXSSk7Ci0KLQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQotCVJldFR4SWR4ID0gVHhJZHg7Ci0JLy8KLQkvLyBVcGRhdGUgVHggaW5kZXgKLQkvLwotCUlOQ19SSU5HX0lOREVYKFR4SWR4LCBUWF9SSU5HX1NJWkUpOwotCXBUeFJpbmctPlR4Q3B1SWR4ID0gVHhJZHg7Ci0KLQkqRnJlZU51bWJlciAtPSAxOwotCi0JcmV0dXJuIFJldFR4SWR4OwotCi19Ci0KLQotVk9JRCBSdG1wUENJX0ZpbmFsV3JpdGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVVNIT1JUCQkJdG90YWxNUERVU2l6ZSwKLQlJTglVU0hPUlQJCQlGaXJzdFR4SWR4KQotewotCi0JUFRYV0lfU1RSVUMJCXBUeFdJOwotCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKLQotCS8vCi0JLy8gZ2V0IFR4IFJpbmcgUmVzb3VyY2UKLQkvLwotCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdOwotCXBUeFdJID0gKFBUWFdJX1NUUlVDKSBwVHhSaW5nLT5DZWxsW0ZpcnN0VHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOwotCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSB0b3RhbE1QRFVTaXplOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhXSSwgVFlQRV9UWFdJKTsKLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi0KLX0KLQotCi1WT0lEIFJ0bXBQQ0lEYXRhTGFzdFR4SWR4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJUXVlSWR4LAotCUlOCVVTSE9SVAkJCUxhc3RUeElkeCkKLXsKLQlQVFhEX1NUUlVDCQlwVHhEOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7Ci0gICAgVFhEX1NUUlVDICAgICAgIFR4RDsKLSNlbmRpZgotCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKLQotCS8vCi0JLy8gZ2V0IFR4IFJpbmcgUmVzb3VyY2UKLQkvLwotCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUXVlSWR4XTsKLQotCS8vCi0JLy8gYnVpbGQgVHggRGVzY3JpcHRvcgotCS8vCi0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbTGFzdFR4SWR4XS5BbGxvY1ZhOwotI2Vsc2UKLQlwRGVzdFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW0xhc3RUeElkeF0uQWxsb2NWYTsKLQlUeEQgPSAqcERlc3RUeEQ7Ci0JcFR4RCA9ICZUeEQ7Ci0jZW5kaWYKLQotCXBUeEQtPkxhc3RTZWMxID0gMTsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQotfQotCi0KLVVTSE9SVAlSdG1wUENJX1dyaXRlRnJhZ1R4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYWdOdW0sCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQotewotCVVDSEFSCQkJKnBETUFIZWFkZXJCdWZWQTsKLQlVU0hPUlQJCQlUeElkeCwgUmV0VHhJZHg7Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOwotICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7Ci0jZW5kaWYKLQlVSU5UMzIJCQlCdWZCYXNlUGFMb3c7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nOwotCVVTSE9SVAkJCWh3SGVhZGVyTGVuOwotCVVJTlQzMgkJCWZpcnN0RE1BTGVuOwotCi0JLy8KLQkvLyBHZXQgVHggUmluZyBSZXNvdXJjZQotCS8vCi0JcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07Ci0JVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7Ci0JcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7Ci0JQnVmQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOwotCi0JLy8KLQkvLyBDb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCi0JLy8KLQkvL2h3SGVhZGVyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsKLQlod0hlYWRlckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOwotCi0JZmlyc3RETUFMZW4gPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuOwotCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsIGZpcnN0RE1BTGVuKTsKLQotCi0JLy8KLQkvLyBCdWlsZCBUeCBEZXNjcmlwdG9yCi0JLy8KLSNpZm5kZWYgUlRfQklHX0VORElBTgotCXBUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLSNlbHNlCi0JcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLQlUeEQgPSAqcERlc3RUeEQ7Ci0JcFR4RCA9ICZUeEQ7Ci0jZW5kaWYKLQlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7Ci0KLQlpZiAoZnJhZ051bSA9PSBwVHhCbGstPlRvdGFsRnJhZ051bSkKLQl7Ci0JCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OwotCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCX0KLQotCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKLQlwVHhELT5TRExlbjAgPSBmaXJzdERNQUxlbjsgLy8gaW5jbHVkZSBwYWRkaW5nCi0JcFR4RC0+U0RQdHIxID0gUENJX01BUF9TSU5HTEUocEFkLCBwVHhCbGssIDAsIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOwotCXBUeEQtPkxhc3RTZWMwID0gMDsKLQlwVHhELT5MYXN0U2VjMSA9IDE7Ci0KLQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUikocERNQUhlYWRlckJ1ZlZBICsgVFhJTkZPX1NJWkUpLCBUWVBFX1RYV0kpOwotCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpKHBETUFIZWFkZXJCdWZWQSArIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKSwgRElSX1dSSVRFLCBGQUxTRSk7Ci0JUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0gICAgV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi0KLQlSZXRUeElkeCA9IFR4SWR4OwotCXBUeEJsay0+UHJpdiArPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQotCS8vCi0JLy8gVXBkYXRlIFR4IGluZGV4Ci0JLy8KLQlJTkNfUklOR19JTkRFWChUeElkeCwgVFhfUklOR19TSVpFKTsKLQlwVHhSaW5nLT5UeENwdUlkeCA9IFR4SWR4OwotCi0JKkZyZWVOdW1iZXIgLT0gMTsKLQotCXJldHVybiBSZXRUeElkeDsKLQotfQotCi0KLS8qCi0JTXVzdCBiZSBydW4gaW4gSW50ZXJydXB0IGNvbnRleHQKLQlUaGlzIGZ1bmN0aW9uIGhhbmRsZSBQQ0kgc3BlY2lmaWMgVHhEZXNjIGFuZCBjcHUgaW5kZXggdXBkYXRlIGFuZCBraWNrIHRoZSBwYWNrZXQgb3V0LgotICovCi1pbnQgUnRtcFBDSU1nbXRLaWNrT3V0KAotCUlOIFJUTVBfQURBUFRFUgkJKnBBZCwKLQlJTiBVQ0hBUgkJCVF1ZUlkeCwKLQlJTiBQTkRJU19QQUNLRVQJCXBQYWNrZXQsCi0JSU4gUFVDSEFSCQkJcFNyY0J1ZlZBLAotCUlOIFVJTlQJCQkJU3JjQnVmTGVuKQotewotCVBUWERfU1RSVUMJCXBUeEQ7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotICAgIFBUWERfU1RSVUMgICAgICBwRGVzdFR4RDsKLSAgICBUWERfU1RSVUMgICAgICAgVHhEOwotI2VuZGlmCi0JVUxPTkcJCQlTd0lkeCA9IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHg7Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgcERlc3RUeEQgID0gKFBUWERfU1RSVUMpcEFkLT5NZ210UmluZy5DZWxsW1N3SWR4XS5BbGxvY1ZhOwotICAgIFR4RCA9ICpwRGVzdFR4RDsKLSAgICBwVHhEID0gJlR4RDsKLSAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLSNlbHNlCi0JcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW1N3SWR4XS5BbGxvY1ZhOwotI2VuZGlmCi0KLQlwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKLQlwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0KLQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBUUlVFLCBGSUZPX01HTVQpOwotCXBUeEQtPkxhc3RTZWMwID0gMTsKLQlwVHhELT5MYXN0U2VjMSA9IDE7Ci0JcFR4RC0+RE1BRE9ORSA9IDA7Ci0JcFR4RC0+U0RMZW4xID0gMDsKLQlwVHhELT5TRFB0cjAgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBTcmNCdWZWQSwgU3JjQnVmTGVuLCAwLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQlwVHhELT5TRExlbjAgPSBTcmNCdWZMZW47Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0gICAgV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKLSNlbmRpZgotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLyoJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIk1MTUVIYXJkVHJhbnNtaXRcbiIpKTsKLQlmb3IgKGkgPSAwOyBpIDwgKFRYV0lfU0laRSsyNCk7IGkrKykKLQl7Ci0KLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiV4OiIsICoocFNyY0J1ZlZBK2kpKSk7Ci0JCWlmICggaSU0ID09IDMpCi0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiIDo6ICIpKTsKLQkJaWYgKCBpJTE2ID09IDE1KQotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlxuICAgICAgIikpOwotCX0KLQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXG4gICAgICAiKSk7Ki8KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7Ci0KLQkvLyBJbmNyZWFzZSBUWF9DVFhfSURYLCBidXQgd3JpdGUgdG8gcmVnaXN0ZXIgbGF0ZXIuCi0JSU5DX1JJTkdfSU5ERVgocEFkLT5NZ210UmluZy5UeENwdUlkeCwgTUdNVF9SSU5HX1NJWkUpOwotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUdNVENUWF9JRFgsICBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KTsKLQotCXJldHVybiAwOwotfQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDaGVjayBSeCBkZXNjcmlwdG9yLCByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBpZiBhbnkgZXJyb3IgZG91bmQKLQotCUFyZ3VtZW50czoKLQkJcFJ4RAkJUG9pbnRlciB0byB0aGUgUnggZGVzY3JpcHRvcgotCi0JUmV0dXJuIFZhbHVlOgotCQlORElTX1NUQVRVU19TVUNDRVNTCU5vIGVycgotCQlORElTX1NUQVRVU19GQUlMVVJFCUVycm9yCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMgUlRNUENoZWNrUnhFcnJvcigKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JUEhFQURFUl84MDJfMTEJCXBIZWFkZXIsCi0JSU4JUFJYV0lfU1RSVUMJCXBSeFdJLAotCUlOICBQUlQyOFhYX1JYRF9TVFJVQwlwUnhEKQotewotCVBDSVBIRVJfS0VZIHBXcGFLZXk7Ci0JSU5UIGRCbTsKLQotCS8vIFBoeSBlcnJvcnMgJiBDUkMgZXJyb3JzCi0JaWYgKC8qKHBSeEQtPlBoeUVycikgfHwqLyAocFJ4RC0+Q3JjKSkKLQl7Ci0JCS8vIENoZWNrIFJTU0kgZm9yIE5vaXNlIEhpc3Qgc3RhdGlzdGljIGNvbGxlY3Rpb24uCi0JCWRCbSA9IChJTlQpIChwUnhXSS0+UlNTSTApIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKLQkJaWYgKGRCbSA8PSAtODcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzBdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtODIpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzFdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNzcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzJdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNzIpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzNdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNjcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzRdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNjIpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzVdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNTcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzZdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA+IC01NykKLQkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbN10gKz0gMTsKLQotCQlyZXR1cm4oTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JfQotCi0JLy8gQWRkIFJ4IHNpemUgdG8gY2hhbm5lbCBsb2FkIGNvdW50ZXIsIHdlIHNob3VsZCBpZ25vcmUgZXJyb3IgY291bnRzCi0JcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgKz0gKHBSeEQtPlNETDAgKyAxNCk7Ci0KLQkvLyBEcm9wIFRvRHMgcHJvbWlzY291cyBmcmFtZSwgaXQgaXMgb3BlbmVkIGR1ZSB0byBDQ1ggMiBjaGFubmVsIGxvYWQgc3RhdGlzdGljcwotCWlmIChwSGVhZGVyICE9IE5VTEwpCi0JewotCQlpZiAocEhlYWRlci0+RkMuVG9EcykKLQkJewotCQkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQl9Ci0JfQotCi0JLy8gRHJvcCBub3QgVTJNIGZyYW1lcywgY2FudCdzIGRyb3AgaGVyZSBiZWNhdXNlIHdlIHdpbGwgZHJvcCBiZWFjb24gaW4gdGhpcyBjYXNlCi0JLy8gSSBhbSBraW5kIG9mIGRvdWJ0aW5nIHRoZSBVMk0gYml0IG9wZXJhdGlvbgotCS8vIGlmIChwUnhELT5VMk0gPT0gMCkKLQkvLwlyZXR1cm4oTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0KLQkvLyBkcm9wIGRlY3lwdGlvbiBmYWlsIGZyYW1lCi0JaWYgKHBSeEQtPkNpcGhlckVycikKLQl7Ci0JCWlmIChwUnhELT5DaXBoZXJFcnIgPT0gMikKLQkJCXtEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJwUnhEIEVSUk9SOiBJQ1Ygb2sgYnV0IE1JQ0VyciAiKSk7fQotCQllbHNlIGlmIChwUnhELT5DaXBoZXJFcnIgPT0gMSkKLQkJCXtEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJwUnhEIEVSUk9SOiBJQ1YgRXJyICIpKTt9Ci0JCWVsc2UgaWYgKHBSeEQtPkNpcGhlckVyciA9PSAzKQotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgicFJ4RCBFUlJPUjogS2V5IG5vdCB2YWxpZCAiKSk7Ci0KLSAgICAgICAgaWYgKCgocFJ4RC0+Q2lwaGVyRXJyICYgMSkgPT0gMSkgJiYgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgJiYgSU5GUkFfT04ocEFkKSkKLSAgICAgICAgICAgIFJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0lDVl9FUlJPUl9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotCi0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIiAlZCAobGVuPSVkLCBNY2FzdD0lZCwgTXlCc3M9JWQsIFdjaWQ9JWQsIEtleUlkPSVkKVxuIiwKLQkJCXBSeEQtPkNpcGhlckVyciwKLQkJCXBSeEQtPlNETDAsCi0JCQlwUnhELT5NY2FzdCB8IHBSeEQtPkJjYXN0LAotCQkJcFJ4RC0+TXlCc3MsCi0JCQlwUnhXSS0+V2lyZWxlc3NDbGlJRCwKLS8vCQkJQ2lwaGVyTmFtZVtwUnhELT5DaXBoZXJBbGddLAotCQkJcFJ4V0ktPktleUluZGV4KSk7Ci0KLQkJLy8KLQkJLy8gTUlDIEVycm9yCi0JCS8vCi0JCWlmIChwUnhELT5DaXBoZXJFcnIgPT0gMikKLQkJewotCQkJcFdwYUtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVtwUnhXSS0+S2V5SW5kZXhdOwotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCi0gICAgICAgICAgICAgICAgV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQocEFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFdwYUtleS0+VHlwZSA9PSBQQUlSV0lTRUtFWSkgPyBUUlVFOkZBTFNFKTsKLSAgICAgICAgICAgIGVsc2UKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0JCQkgICAgUlRNUFJlcG9ydE1pY0Vycm9yKHBBZCwgcFdwYUtleSk7Ci0KLSAgICAgICAgICAgIGlmICgoKHBSeEQtPkNpcGhlckVyciAmIDIpID09IDIpICYmIHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ICYmIElORlJBX09OKHBBZCkpCi0gICAgICAgICAgICAgICAgUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfTUlDX0VSUk9SX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7Ci0KLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIlJ4IE1JQyBWYWx1ZSBlcnJvclxuIikpOwotCQl9Ci0KLQkJaWYgKHBIZWFkZXIgPT0gTlVMTCkKLQkJCXJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJLyppZiAoKHBSeEQtPkNpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSAmJgotCQkJKHBIZWFkZXItPlNlcXVlbmNlID09IHBBZC0+RnJhZ0ZyYW1lLlNlcXVlbmNlKSkKLQkJewotCQkJLy8KLQkJCS8vIEFjY2VwdGFibGUgc2luY2UgdGhlIEZpcnN0IEZyYWdGcmFtZSBubyBDaXBoZXJFcnIgcHJvYmxlbS4KLQkJCS8vCi0JCQlyZXR1cm4oTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCX0qLwotCi0JCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKLQl9Ci0KLQlyZXR1cm4oTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci19Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotQk9PTEVBTiAgUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJUXVlSWR4KQotewotCVBSVE1QX1RYX1JJTkcgcFR4UmluZzsKLQlQVFhEX1NUUlVDCSAgcFR4RDsKLSNpZmRlZglSVF9CSUdfRU5ESUFOCi0gICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOwotI2VuZGlmCi0JUE5ESVNfUEFDS0VUICBwUGFja2V0OwotCVVDSEFSCUZSRUUgPSAwOwotCVRYRF9TVFJVQwlUeEQsICpwT3JpVHhEOwotCS8vVUxPTkcJCUlycUZsYWdzOwotCUJPT0xFQU4JCQliUmVzY2hlZHVsZSA9IEZBTFNFOwotCi0KLQlBU1NFUlQoUXVlSWR4IDwgTlVNX09GX1RYX1JJTkcpOwotCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUXVlSWR4XTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRdWVJZHggKiBSSU5HUkVHX0RJRkYsICZwVHhSaW5nLT5UeERtYUlkeCk7Ci0Jd2hpbGUgKHBUeFJpbmctPlR4U3dGcmVlSWR4ICE9IHBUeFJpbmctPlR4RG1hSWR4KQotCXsKLS8vCQlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0jaWZkZWYgUkFMSU5LX0FURQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JCVBIRUFERVJfODAyXzExCXBIZWFkZXI4MDIxMTsKLQotCQlpZiAoKEFURV9PTihwQWQpKSAmJiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSkKLQkJewotCQkJaWYgKHBBZC0+YXRlLlFJRCA9PSBRdWVJZHgpCi0JCQl7Ci0JCQkJcEFkLT5hdGUuVHhEb25lQ291bnQrKzsKLQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7Ci0KLQkJCQkvKiBhbHdheXMgdXNlIFFJRF9BQ19CRSBhbmQgRklGT19FRENBICovCi0JCQkJQVNTRVJUKHBBZC0+YXRlLlFJRCA9PSAwKTsKLQkJCQlwQWQtPmF0ZS5UeEFjMCsrOwotCi0JCQkJRlJFRSsrOwotI2lmbmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkJcFR4RCA9IChQVFhEX1NUUlVDKSAocFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0uQWxsb2NWYSk7Ci0JCQkJcE9yaVR4RCA9IHBUeEQ7Ci0JCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJlR4RCwgcFR4RCwgc2l6ZW9mKFRYRF9TVFJVQykpOwotCQkJCXBUeEQgPSAmVHhEOwotI2Vsc2UKLQkJICAgICAgICBwRGVzdFR4RCA9IChQVFhEX1NUUlVDKSAocFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0uQWxsb2NWYSk7Ci0JCSAgICAgICAgcE9yaVR4RCA9IHBEZXN0VHhEIDsKLQkJICAgICAgICBUeEQgPSAqcERlc3RUeEQ7Ci0JCSAgICAgICAgcFR4RCA9ICZUeEQ7Ci0JCSAgICAgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0jZW5kaWYKLQkJCQlwVHhELT5ETUFET05FID0gMDsKLQotCQkJCXBIZWFkZXI4MDIxMSA9IHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLkRtYUJ1Zi5BbGxvY1ZhICsgc2l6ZW9mKFRYV0lfU1RSVUMpOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQkJCQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBIZWFkZXI4MDIxMSwgRElSX1JFQUQsIEZBTFNFKTsKLSNlbmRpZgotCQkJCXBIZWFkZXI4MDIxMS0+U2VxdWVuY2UgPSArK3BBZC0+YXRlLnNlcTsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwSGVhZGVyODAyMTEsIERJUl9XUklURSwgRkFMU0UpOwotI2VuZGlmCi0KLQkJCQlpZiAgKChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpICYmIChwQWQtPmF0ZS5Nb2RlICYgQVRFX1RYRlJBTUUpICYmIChwQWQtPmF0ZS5UeERvbmVDb3VudCA8IHBBZC0+YXRlLlR4Q291bnQpKQotCQkJCXsKLQkJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudCArPSAgKHBUeEQtPlNETGVuMSArIHBUeEQtPlNETGVuMCk7Ci0JCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gKHBUeEQtPlNETGVuMSArIHBUeEQtPlNETGVuMCk7Ci0JCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRG1hRG9uZUNvdW50W1F1ZUlkeF0gKys7Ci0JCQkJCUlOQ19SSU5HX0lOREVYKHBUeFJpbmctPlR4U3dGcmVlSWR4LCBUWF9SSU5HX1NJWkUpOwotCi0JCQkJCS8qIGdldCBUWF9EVFhfSURYIGFnYWluICovCi0JCQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRdWVJZHggKiBSSU5HUkVHX0RJRkYgLCAgJnBUeFJpbmctPlR4RG1hSWR4KTsKLQkJCQkJZ290byBraWNrX291dDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHBBZC0+YXRlLlR4U3RhdHVzID09IDEpLyogb3IgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkgPz8/ICovICYmIChwQWQtPmF0ZS5UeERvbmVDb3VudCA9PSBwQWQtPmF0ZS5UeENvdW50KSkKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiYWxsIFR4IGlzIGRvbmVcbiIpKTsKLQotCQkJCQkvLyBUeCBzdGF0dXMgZW50ZXJzIGlkbGUgbW9kZS4KLQkJCQkJcEFkLT5hdGUuVHhTdGF0dXMgPSAwOwotCQkJCX0KLQkJCQllbHNlIGlmICghKHBBZC0+YXRlLk1vZGUgJiBBVEVfVFhGUkFNRSkpCi0JCQkJewotCQkJCQkvKiBub3QgY29tcGxldGUgc2VuZGluZyB5ZXQsIGJ1dCBzb21lb25lIHByZXNzIHRoZSBTdG9wIFRYIGJvdHRvbiAqLwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIm5vdCBjb21wbGV0ZSBzZW5kaW5nIHlldCwgYnV0IHNvbWVvbmUgcHJlc3NlZCB0aGUgU3RvcCBUWCBib3R0b21cbiIpKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQWQtPmF0ZS5Nb2RlID0gMHglMDJ4XG4iLCBwQWQtPmF0ZS5Nb2RlKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwoInBUeFJpbmctPlR4U3dGcmVlSWR4ID0gJWRcbiIsIHBUeFJpbmctPlR4U3dGcmVlSWR4KSk7Ci0JCQkJfQotCi0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQkJCU5kaXNNb3ZlTWVtb3J5KHBPcmlUeEQsIHBUeEQsIHNpemVvZihUWERfU1RSVUMpKTsKLSNlbHNlCi0JCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLQkJCSpwRGVzdFR4RCA9IFR4RDsKLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi0KLQkJCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeFN3RnJlZUlkeCwgVFhfUklOR19TSVpFKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0JCS8vIHN0YXRpYyByYXRlIGFsc28gbmVlZCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoKSBmdW5jdGlvbi4KLQkJLy9pZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkKLQkJCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOwotCi0JCS8qIE5vdGUgOiBJZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSwgd2Ugd2lsbCBuZXZlciByZWFjaCBoZXJlLiAqLwotCQlGUkVFKys7Ci0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLSAgICAgICAgICAgICAgICBwVHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5BbGxvY1ZhKTsKLQkJcE9yaVR4RCA9IHBUeEQ7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlR4RCwgcFR4RCwgc2l6ZW9mKFRYRF9TVFJVQykpOwotCQlwVHhEID0gJlR4RDsKLSNlbHNlCi0gICAgICAgIHBEZXN0VHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5BbGxvY1ZhKTsKLSAgICAgICAgcE9yaVR4RCA9IHBEZXN0VHhEIDsKLSAgICAgICAgVHhEID0gKnBEZXN0VHhEOwotICAgICAgICBwVHhEID0gJlR4RDsKLSAgICAgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0jZW5kaWYKLQotCQlwVHhELT5ETUFET05FID0gMDsKLQotCi0jaWZkZWYgUkFMSU5LX0FURQotCQkvKiBFeGVjdXRpb24gb2YgdGhpcyBibG9jayBpcyBub3QgYWxsb3dlZCB3aGVuIEFURSBpcyBydW5uaW5nLiAqLwotCQlpZiAoIShBVEVfT04ocEFkKSkpCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCQl7Ci0JCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0ucE5kaXNQYWNrZXQ7Ci0JCQlpZiAocFBhY2tldCkKLQkJCXsKLSNpZmRlZiBDT05GSUdfNVZUX0VOSEFOQ0UKLQkJCQlpZiAoUlRNUF9HRVRfUEFDS0VUXzVWVChwUGFja2V0KSkKLQkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgMTYsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCWVsc2UKLSNlbmRpZiAvLyBDT05GSUdfNVZUX0VOSEFOQ0UgLy8KLQkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQl9Ci0JCQkvL0Fsd2F5cyBhc3NpZ24gcE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJcFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0OwotCi0JCQlBU1NFUlQocFBhY2tldCA9PSBOVUxMKTsKLQkJCWlmIChwUGFja2V0KQotCQkJewotI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQotCQkJCWlmIChSVE1QX0dFVF9QQUNLRVRfNVZUKHBQYWNrZXQpKQotCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCAxNiwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJZWxzZQotI2VuZGlmIC8vIENPTkZJR181VlRfRU5IQU5DRSAvLwotCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCX0KLQkJCS8vQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJcFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQkJfQotCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIChwVHhELT5TRExlbjEgKyBwVHhELT5TRExlbjApOwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRdWVJZHhdICsrOwotCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeFN3RnJlZUlkeCwgVFhfUklOR19TSVpFKTsKLQkJLyogZ2V0IHR4X3RkeF9pZHggYWdhaW4gKi8KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFF1ZUlkeCAqIFJJTkdSRUdfRElGRiAsICAmcFR4UmluZy0+VHhEbWFJZHgpOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICAgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0gICAgICAgICpwRGVzdFR4RCA9IFR4RDsKLSNlbHNlCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBPcmlUeEQsIHBUeEQsIHNpemVvZihUWERfU1RSVUMpKTsKLSNlbmRpZgotCi0jaWZkZWYgUkFMSU5LX0FURQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi1raWNrX291dDoKLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCi0JCS8qCi0JCQlBVEVfVFhDT05UIG1vZGUgYWxzbyBuZWVkIHRvIHNlbmQgc29tZSBub3JtYWwgZnJhbWVzLCBzbyBsZXQgaXQgaW4uCi0JCQlBVEVfU1RPUCBtdXN0IGJlIGNoYW5nZWQgbm90IHRvIGJlIDB4ZmYKLQkJCXRvIHByZXZlbnQgaXQgZnJvbSBydW5uaW5nIGludG8gdGhpcyBibG9jay4KLQkJKi8KLQkJaWYgKChwQWQtPmF0ZS5Nb2RlICYgQVRFX1RYRlJBTUUpICYmIChwQWQtPmF0ZS5RSUQgPT0gUXVlSWR4KSkKLQkJewotCQkJLy8gVHhEb25lQ291bnQrKyBoYXMgYmVlbiBkb25lIGlmIFFBIGlzIHVzZWQuCi0JCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBGQUxTRSkKLQkJCXsKLQkJCQlwQWQtPmF0ZS5UeERvbmVDb3VudCsrOwotCQkJfQotCQkJaWYgKCgocEFkLT5hdGUuVHhDb3VudCAtIHBBZC0+YXRlLlR4RG9uZUNvdW50ICsgMSkgPj0gVFhfUklOR19TSVpFKSkKLQkJCXsKLQkJCQkvKiBOb3RlIDogV2UgaW5jcmVhc2UgVHhDcHVJZHggaGVyZSwgbm90IFR4U3dGcmVlSWR4ICEgKi8KLQkJCQlJTkNfUklOR19JTkRFWChwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4LCBUWF9SSU5HX1NJWkUpOwotI2lmbmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkJcFR4RCA9IChQVFhEX1NUUlVDKSAocFR4UmluZy0+Q2VsbFtwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4XS5BbGxvY1ZhKTsKLQkJCQlwT3JpVHhEID0gcFR4RDsKLQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmVHhELCBwVHhELCBzaXplb2YoVFhEX1NUUlVDKSk7Ci0JCQkJcFR4RCA9ICZUeEQ7Ci0jZWxzZQotCQkgICAgICAgIHBEZXN0VHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW3BBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHhdLkFsbG9jVmEpOwotCQkgICAgICAgIHBPcmlUeEQgPSBwRGVzdFR4RCA7Ci0JCSAgICAgICAgVHhEID0gKnBEZXN0VHhEOwotCQkgICAgICAgIHBUeEQgPSAmVHhEOwotCQkgICAgICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotI2VuZGlmCi0JCQkJcFR4RC0+RE1BRE9ORSA9IDA7Ci0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQkJCU5kaXNNb3ZlTWVtb3J5KHBPcmlUeEQsIHBUeEQsIHNpemVvZihUWERfU1RSVUMpKTsKLSNlbHNlCi0JCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLQkJCSpwRGVzdFR4RCA9IFR4RDsKLSNlbmRpZgotCQkJCS8vIGtpY2sgVHgtUmluZwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NUWF9JRFgwICsgUXVlSWR4ICogUklOR1JFR19ESUZGLCBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4KTsKLQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7Ci0JCQl9Ci0JCX0KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0vLyAgICAgICAgIFJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCX0KLQotCi0JcmV0dXJuICBiUmVzY2hlZHVsZTsKLQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlQcm9jZXNzIFRYIFJpbmdzIERNQSBEb25lIGludGVycnVwdCwgcnVubmluZyBpbiBEUEMgbGV2ZWwKLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4JUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JSU5UX1NPVVJDRV9DU1JfU1RSVUMgVHhSaW5nQml0bWFwKQotewotLy8JVUNIQVIJCQlDb3VudCA9IDA7Ci0gICAgdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKLQlCT09MRUFOCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKLQotCS8vIE1ha2Ugc3VyZSBUeCByaW5nIHJlc291cmNlIHdvbid0IGJlIHVzZWQgYnkgb3RoZXIgdGhyZWFkcwotCS8vTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsKLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQotCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuQWMwRG1hRG9uZSkKLQkJYlJlc2NoZWR1bGUgPSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfQkUpOwotLyoKLQlpZiAoVHhSaW5nQml0bWFwLmZpZWxkLkhjY2FEbWFEb25lKQotCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfSENDQSk7Ci0qLwotCi0JaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzNEbWFEb25lKQotCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfVk8pOwotCi0JaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzJEbWFEb25lKQotCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfVkkpOwotCi0JaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzFEbWFEb25lKQotCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfQkspOwotCi0JLy8gTWFrZSBzdXJlIHRvIHJlbGVhc2UgVHggcmluZyByZXNvdXJjZQotCS8vTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsKLQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQotCS8vIERlcXVldWUgb3V0Z29pbmcgZnJhbWVzIGZyb20gVHhTd1F1ZXVlW10gYW5kIHByb2Nlc3MgaXQKLQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOwotCi0JcmV0dXJuICBiUmVzY2hlZHVsZTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUHJvY2VzcyBNR01UIHJpbmcgRE1BIGRvbmUgaW50ZXJydXB0LCBydW5uaW5nIGluIERQQyBsZXZlbAotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBIYW5kbGVNZ210UmluZ0RtYURvbmVJbnRlcnJ1cHQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JUFRYRF9TVFJVQwkgcFR4RDsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOwotICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7Ci0jZW5kaWYKLQlQTkRJU19QQUNLRVQgcFBhY2tldDsKLS8vCWludAkJIGk7Ci0JVUNIQVIJRlJFRSA9IDA7Ci0JUFJUTVBfTUdNVF9SSU5HIHBNZ210UmluZyA9ICZwQWQtPk1nbXRSaW5nOwotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9NR01URFRYX0lEWCwgJnBNZ210UmluZy0+VHhEbWFJZHgpOwotCXdoaWxlIChwTWdtdFJpbmctPlR4U3dGcmVlSWR4IT0gcE1nbXRSaW5nLT5UeERtYUlkeCkKLQl7Ci0JCUZSRUUrKzsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgICAgIHBEZXN0VHhEID0gKFBUWERfU1RSVUMpIChwTWdtdFJpbmctPkNlbGxbcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeF0uQWxsb2NWYSk7Ci0gICAgICAgIFR4RCA9ICpwRGVzdFR4RDsKLSAgICAgICAgcFR4RCA9ICZUeEQ7Ci0JCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotI2Vsc2UKLQkJcFR4RCA9IChQVFhEX1NUUlVDKSAocE1nbXRSaW5nLT5DZWxsW3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHhdLkFsbG9jVmEpOwotI2VuZGlmCi0JCXBUeEQtPkRNQURPTkUgPSAwOwotCQlwUGFja2V0ID0gcE1nbXRSaW5nLT5DZWxsW3BNZ210UmluZy0+VHhTd0ZyZWVJZHhdLnBOZGlzUGFja2V0OwotCi0KLQkJaWYgKHBQYWNrZXQpCi0JCXsKLQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCX0KLQkJcE1nbXRSaW5nLT5DZWxsW3BNZ210UmluZy0+VHhTd0ZyZWVJZHhdLnBOZGlzUGFja2V0ID0gTlVMTDsKLQotCQlwUGFja2V0ID0gcE1nbXRSaW5nLT5DZWxsW3BNZ210UmluZy0+VHhTd0ZyZWVJZHhdLnBOZXh0TmRpc1BhY2tldDsKLQkJaWYgKHBQYWNrZXQpCi0JCXsKLQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCX0KLQkJcE1nbXRSaW5nLT5DZWxsW3BNZ210UmluZy0+VHhTd0ZyZWVJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0JCUlOQ19SSU5HX0lOREVYKHBNZ210UmluZy0+VHhTd0ZyZWVJZHgsIE1HTVRfUklOR19TSVpFKTsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICAgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0gICAgICAgIFdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIFRSVUUsIFRZUEVfVFhEKTsKLSNlbmRpZgotCX0KLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIuIERlcXVldWUgYWxsIHBvd2VyIHNhZmUgZGVsYXllZCBicmFvZGNhc3QgZnJhbWVzIGFmdGVyIGJlYWNvbi4KLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QSGFuZGxlVEJUVEludGVycnVwdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQl7Ci0JCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotCQl7Ci0JCX0KLQl9Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JQXJndW1lbnRzOgotCQlwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIuIFJld3JpdGUgYmVhY29uIGNvbnRlbnQgYmVmb3JlIG5leHQgc2VuZC1vdXQuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JewotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQuLi5cbiIpKTsKLQkJfQotCX0KLQotCi19Ci0KLVZPSUQJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7Ci0KLQlpZiAocEFkID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBwQWQgaXMgTlVMTCwgcmV0dXJuLlxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0IFxuIikpOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHICwgJkdsb0NmZy53b3JkKTsKLQotCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAwOwotCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDA7Ci0JR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7Ci0KLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CSyk7Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOwotCS8qUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0hDQ0EpOyovCi0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX01HTVQpOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9SWCk7Ci0KLQlSVE1QRW5hYmxlUnhUeChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0IFxuIikpOwotfQotCi0KLQotCi1WT0lEIERCR1BSSU5UX1RYX1JJTkcoCi0JSU4gUFJUTVBfQURBUFRFUiAgcEFkLAotCUlOIFVDSEFSICAgICAgICAgIFF1ZUlkeCkKLXsKLQlVSU5UMzIJCUFjMEJhc2U7Ci0JVUlOVDMyCQlBYzBId0lkeCA9IDAsIEFjMFN3SWR4ID0gMCwgQUMwZnJlZUlkeDsKLQlpbnQJCQlpOwotLy8JUFVMT05HCQlwVHhEOwotCVBVTE9ORwlwdGVtcDsKLQotCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICIgICkpOwotCXN3aXRjaCAoUXVlSWR4KQotCXsKLQkJY2FzZSBRSURfQUNfQkU6Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBU0VfUFRSMCwgJkFjMEJhc2UpOwotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9DVFhfSURYMCwgJkFjMFN3SWR4KTsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAsICZBYzBId0lkeCk7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQWxsIFFJRF9BQ19CRSBERVNDUklQVE9SICBcbiAiICApKTsKLQkJCWZvciAoaT0wO2k8VFhfUklOR19TSVpFO2krKykKLQkJCXsKLQkJCQlwdGVtcD0gKFBVTE9ORylwQWQtPlR4UmluZ1tRSURfQUNfQkVdLkNlbGxbaV0uQWxsb2NWYTsKLQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiWyUwMmRdICAlMDhseDogJTA4bHg6ICUwOGx4OiAlMDhseFxuICIgLCBpLCAqcHRlbXAsKihwdGVtcCsxKSwqKHB0ZW1wKzIpLCoocHRlbXArMykpKTsKLQkJCX0KLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgIFxuICIgICkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUUlEX0FDX0JLOgotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQVNFX1BUUjEsICZBYzBCYXNlKTsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQ1RYX0lEWDEsICZBYzBTd0lkeCk7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgxLCAmQWMwSHdJZHgpOwotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFsbCBRSURfQUNfQksgREVTQ1JJUFRPUiAgXG4gIiAgKSk7Ci0JCQlmb3IgKGk9MDtpPFRYX1JJTkdfU0laRTtpKyspCi0JCQl7Ci0JCQkJcHRlbXA9IChQVUxPTkcpcEFkLT5UeFJpbmdbUUlEX0FDX0JLXS5DZWxsW2ldLkFsbG9jVmE7Ci0JCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4bHg6ICUwOGx4OiAlMDhseDogJTA4bHhcbiAiICwgaSwgKnB0ZW1wLCoocHRlbXArMSksKihwdGVtcCsyKSwqKHB0ZW1wKzMpKSk7Ci0JCQl9Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiICBcbiAiICApKTsKLQkJCWJyZWFrOwotCQljYXNlIFFJRF9BQ19WSToKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFTRV9QVFIyLCAmQWMwQmFzZSk7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0NUWF9JRFgyLCAmQWMwU3dJZHgpOwotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMiwgJkFjMEh3SWR4KTsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBbGwgUUlEX0FDX1ZJIERFU0NSSVBUT1IgXG4gIiAgKSk7Ci0JCQlmb3IgKGk9MDtpPFRYX1JJTkdfU0laRTtpKyspCi0JCQl7Ci0JCQkJcHRlbXA9IChQVUxPTkcpcEFkLT5UeFJpbmdbUUlEX0FDX1ZJXS5DZWxsW2ldLkFsbG9jVmE7Ci0JCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4bHg6ICUwOGx4OiAlMDhseDogJTA4bHhcbiAiICwgaSwgKnB0ZW1wLCoocHRlbXArMSksKihwdGVtcCsyKSwqKHB0ZW1wKzMpKSk7Ci0JCQl9Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiICBcbiAiICApKTsKLQkJCWJyZWFrOwotCQljYXNlIFFJRF9BQ19WTzoKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFTRV9QVFIzLCAmQWMwQmFzZSk7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0NUWF9JRFgzLCAmQWMwU3dJZHgpOwotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMywgJkFjMEh3SWR4KTsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBbGwgUUlEX0FDX1ZPIERFU0NSSVBUT1IgXG4gIiAgKSk7Ci0JCQlmb3IgKGk9MDtpPFRYX1JJTkdfU0laRTtpKyspCi0JCQl7Ci0JCQkJcHRlbXA9IChQVUxPTkcpcEFkLT5UeFJpbmdbUUlEX0FDX1ZPXS5DZWxsW2ldLkFsbG9jVmE7Ci0JCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4bHg6ICUwOGx4OiAlMDhseDogJTA4bHhcbiAiICwgaSwgKnB0ZW1wLCoocHRlbXArMSksKihwdGVtcCsyKSwqKHB0ZW1wKzMpKSk7Ci0JCQl9Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiICBcbiAiICApKTsKLQkJCWJyZWFrOwotCQljYXNlIFFJRF9NR01UOgotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQVNFX1BUUjUsICZBYzBCYXNlKTsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQ1RYX0lEWDUsICZBYzBTd0lkeCk7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFg1LCAmQWMwSHdJZHgpOwotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiBBbGwgUUlEX01HTVQgIERFU0NSSVBUT1IgXG4gIiAgKSk7Ci0JCQlmb3IgKGk9MDtpPE1HTVRfUklOR19TSVpFO2krKykKLQkJCXsKLQkJCQlwdGVtcD0gKFBVTE9ORylwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKLQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiWyUwMmRdICAlMDhseDogJTA4bHg6ICUwOGx4OiAlMDhseFxuICIgLCBpLCAqcHRlbXAsKihwdGVtcCsxKSwqKHB0ZW1wKzIpLCoocHRlbXArMykpKTsKLQkJCX0KLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgIFxuICIgICkpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UX0VSUigoIkRCR1BSSU5UX1RYX1JJTkcoUmluZyAlZCkgbm90IHN1cHBvcnRlZFxuIiwgUXVlSWR4KSk7Ci0JCQlicmVhazsKLQl9Ci0JQUMwZnJlZUlkeCA9IHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhTd0ZyZWVJZHg7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlR4UmluZyVkLCBUWF9EVFhfSURYPSVkLCBUWF9DVFhfSURYPSVkXG4iLCBRdWVJZHgsIEFjMEh3SWR4LCBBYzBTd0lkeCkpOwotCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIglUeFN3RnJlZUlkeFslZF0iLCBBQzBmcmVlSWR4KSk7Ci0JREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiCXBlbmRpbmctTkRJUz0lbGRcbiIsIHBBZC0+UmFsaW5rQ291bnRlcnMuUGVuZGluZ05kaXNQYWNrZXRDb3VudCkpOwotCi0KLX0KLQotCi1WT0lEIERCR1BSSU5UX1JYX1JJTkcoCi0JSU4gUFJUTVBfQURBUFRFUiAgcEFkKQotewotCVVJTlQzMgkJQWMwQmFzZTsKLQlVSU5UMzIJCUFjMEh3SWR4ID0gMCwgQWMwU3dJZHggPSAwLCBBQzBmcmVlSWR4OwotLy8JUFVMT05HCSBwVHhEOwotCWludAkJCWk7Ci0JVUlOVDMyCSpwdGVtcDsKLS8vCVBSWERfU1RSVUMJCXBSeEQ7Ci0KLQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAiICApKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0JBU0VfUFRSLCAmQWMwQmFzZSk7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBSWF9DUlhfSURYLCAmQWMwU3dJZHgpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfRFJYX0lEWCwgJkFjMEh3SWR4KTsKLQlBQzBmcmVlSWR4ID0gcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHg7Ci0KLQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQWxsIFJYIERTUCAgXG4gIiAgKSk7Ci0JZm9yIChpPTA7aTxSWF9SSU5HX1NJWkU7aSsrKQotCXsKLQkJcHRlbXAgPSAoVUlOVDMyICopcEFkLT5SeFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOwotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiWyUwMmRdICAlMDh4OiAlMDh4OiAlMDh4OiAlMDh4XG4gIiAsIGksICpwdGVtcCwqKHB0ZW1wKzEpLCoocHRlbXArMiksKihwdGVtcCszKSkpOwotCX0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJ4UmluZywgUlhfRFJYX0lEWD0lZCwgUlhfQ1JYX0lEWD0lZCBcbiIsIEFjMEh3SWR4LCBBYzBTd0lkeCkpOwotCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIglSeFN3UmVhZElkeCBbJWRdPSIsIEFDMGZyZWVJZHgpKTsKLQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIJcGVuZGluZy1ORElTPSVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5QZW5kaW5nTmRpc1BhY2tldENvdW50KSk7Ci19Ci0KLQotUE5ESVNfUEFDS0VUIEdldFBhY2tldEZyb21SeFJpbmcoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAkJUFJUMjhYWF9SWERfU1RSVUMJcFNhdmVSeEQsCi0JT1VUCQlCT09MRUFOCQkJKnBiUmVzY2hlZHVsZSwKLQlJTiBPVVQJVUlOVDMyCQkJKnBSeFBlbmRpbmcpCi17Ci0JUFJYRF9TVFJVQwkJCQlwUnhEOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlQUlhEX1NUUlVDCQkJCXBEZXN0UnhEOwotCVJYRF9TVFJVQwkJCQlSeEQ7Ci0jZW5kaWYKLQlQTkRJU19QQUNLRVQJCQlwUnhQYWNrZXQgPSBOVUxMOwotCVBORElTX1BBQ0tFVAkJCXBOZXdQYWNrZXQ7Ci0JUFZPSUQJCQkJCUFsbG9jVmE7Ci0JTkRJU19QSFlTSUNBTF9BRERSRVNTCUFsbG9jUGE7Ci0JQk9PTEVBTgkJCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKLQotCVJUTVBfU0VNX0xPQ0soJnBBZC0+UnhSaW5nTG9jayk7Ci0KLQlpZiAoKnBSeFBlbmRpbmcgPT0gMCkKLQl7Ci0JCS8vIEdldCBob3cgbWF5IHBhY2tldHMgaGFkIGJlZW4gcmVjZWl2ZWQKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9EUlhfSURYICwgJnBBZC0+UnhSaW5nLlJ4RG1hSWR4KTsKLQotCQlpZiAocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPT0gcEFkLT5SeFJpbmcuUnhEbWFJZHgpCi0JCXsKLQkJCS8vIG5vIG1vcmUgcnggcGFja2V0cwotCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCS8vIGdldCByeCBwZW5kaW5nIGNvdW50Ci0JCWlmIChwQWQtPlJ4UmluZy5SeERtYUlkeCA+IHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4KQotCQkJKnBSeFBlbmRpbmcgPSBwQWQtPlJ4UmluZy5SeERtYUlkeCAtIHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4OwotCQllbHNlCi0JCQkqcFJ4UGVuZGluZwk9IHBBZC0+UnhSaW5nLlJ4RG1hSWR4ICsgUlhfUklOR19TSVpFIC0gcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHg7Ci0KLQl9Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JcERlc3RSeEQgPSAoUFJYRF9TVFJVQykgcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uQWxsb2NWYTsKLQlSeEQgPSAqcERlc3RSeEQ7Ci0JcFJ4RCA9ICZSeEQ7Ci0JUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwUnhELCBUWVBFX1JYRCk7Ci0jZWxzZQotCS8vIFBvaW50IHRvIFJ4IGluZGV4ZWQgcnggcmluZyBkZXNjcmlwdG9yCi0JcFJ4RCA9IChQUlhEX1NUUlVDKSBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5BbGxvY1ZhOwotI2VuZGlmCi0KLQlpZiAocFJ4RC0+RERPTkUgPT0gMCkKLQl7Ci0JCSpwUnhQZW5kaW5nID0gMDsKLQkJLy8gRE1BSW5keCBoYWQgZG9uZSBidXQgRERPTkUgYml0IG5vdCByZWFkeQotCQliUmVzY2hlZHVsZSA9IFRSVUU7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQotCS8vIHJldHVybiByeCBkZXNjcmlwdG9yCi0JTmRpc01vdmVNZW1vcnkocFNhdmVSeEQsIHBSeEQsIFJYRF9TSVpFKTsKLQotCXBOZXdQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfQUdHUkVTSVpFLCBGQUxTRSwgJkFsbG9jVmEsICZBbGxvY1BhKTsKLQotCWlmIChwTmV3UGFja2V0KQotCXsKLQkJLy8gdW5tYXAgdGhlIHJ4IGJ1ZmZlcgotCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uRG1hQnVmLkFsbG9jUGEsCi0JCQkJCSBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NTaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQlwUnhQYWNrZXQgPSBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5wTmRpc1BhY2tldDsKLQotCQlwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NTaXplCT0gUlhfQlVGRkVSX0FHR1JFU0laRTsKLQkJcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0ucE5kaXNQYWNrZXQJCT0gKFBORElTX1BBQ0tFVCkgcE5ld1BhY2tldDsKLQkJcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uRG1hQnVmLkFsbG9jVmEJPSBBbGxvY1ZhOwotCQlwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NQYQk9IEFsbG9jUGE7Ci0JCS8qIHVwZGF0ZSBTRFAwIHRvIG5ldyBidWZmZXIgb2YgcnggcGFja2V0ICovCi0JCXBSeEQtPlNEUDAgPSBBbGxvY1BhOwotCX0KLQllbHNlCi0JewotCQkvL0RCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiTm8gUnggQnVmZmVyXG4iKSk7Ci0JCXBSeFBhY2tldCA9IE5VTEw7Ci0JCWJSZXNjaGVkdWxlID0gVFJVRTsKLQl9Ci0KLQlwUnhELT5ERE9ORSA9IDA7Ci0KLQkvLyBoYWQgaGFuZGxlZCBvbmUgcnggcGFja2V0Ci0JKnBSeFBlbmRpbmcgPSAqcFJ4UGVuZGluZyAtIDE7Ci0KLQkvLyB1cGRhdGUgcnggZGVzY3JpcHRvciBhbmQga2ljayByeAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBSeEQsIFRZUEVfUlhEKTsKLQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFJ4RCwgKFBVQ0hBUilwUnhELCBGQUxTRSwgVFlQRV9SWEQpOwotI2VuZGlmCi0JSU5DX1JJTkdfSU5ERVgocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHgsIFJYX1JJTkdfU0laRSk7Ci0KLQlwQWQtPlJ4UmluZy5SeENwdUlkeCA9IChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCA9PSAwKSA/IChSWF9SSU5HX1NJWkUtMSkgOiAocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHgtMSk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgUlhfQ1JYX0lEWCwgcEFkLT5SeFJpbmcuUnhDcHVJZHgpOwotCi1kb25lOgotCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5SeFJpbmdMb2NrKTsKLQkqcGJSZXNjaGVkdWxlID0gYlJlc2NoZWR1bGU7Ci0JcmV0dXJuIHBSeFBhY2tldDsKLX0KLQotCi1ORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0VHhSaW5nKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCVF1ZUlkeCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKLXsKLQlQQUNLRVRfSU5GTwlQYWNrZXRJbmZvOwotCVBVQ0hBUgkJCXBTcmNCdWZWQTsKLQlVSU5UCQkJU3JjQnVmTGVuOwotCVBUWERfU1RSVUMJCXBUeEQ7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotICAgIFBUWERfU1RSVUMgICAgICBwRGVzdFR4RDsKLSAgICBUWERfU1RSVUMgICAgICAgVHhEOwotI2VuZGlmCi0JUEhFQURFUl84MDJfMTEJcEhlYWRlcl84MDJfMTE7Ci0JQk9PTEVBTgkJCWJBY2tSZXF1aXJlZCwgYkluc2VydFRpbWVzdGFtcDsKLQlVTE9ORwkJCVNyY0J1ZlBBOwotCS8vVUNIQVIJCQlUeEJ1ZklkeDsKLQlVQ0hBUgkJCU1sbWVSYXRlOwotCVVMT05HCQkJU3dJZHggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4OwotCVBUWFdJX1NUUlVDCXBGaXJzdFR4V0k7Ci0JLy9VTE9ORwlpOwotCS8vSFRUUkFOU01JVF9TRVRUSU5HCU1sbWVUcmFuc21pdDsgICAvL1JhdGUgZm9yIHRoaXMgTUdNVCBmcmFtZS4KLQlVTE9ORwkgRnJlZU51bTsKLQlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7Ci0KLQotCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKLQotCi0JaWYgKHBTcmNCdWZWQSA9PSBOVUxMKQotCXsKLQkJLy8gVGhlIGJ1ZmZlciBzaG91bGRuJ3QgYmUgTlVMTAotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQkvLyBNYWtlIHN1cmUgTUdNVCByaW5nIHJlc291cmNlIHdvbid0IGJlIHVzZWQgYnkgb3RoZXIgdGhyZWFkcwotCS8vTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsKLQotCUZyZWVOdW0gPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7Ci0KLQlpZiAoRnJlZU51bSA9PSAwKQotCXsKLQkJLy9OZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPlR4UmluZ0xvY2spOwotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQlTd0lkeCA9IHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHg7Ci0KLSNpZm5kZWYgUlRfQklHX0VORElBTgotCXBUeEQgID0gKFBUWERfU1RSVUMpIHBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0uQWxsb2NWYTsKLSNlbHNlCi0gICAgcERlc3RUeEQgID0gKFBUWERfU1RSVUMpcEFkLT5UeFJpbmdbUXVlSWR4XS5DZWxsW1N3SWR4XS5BbGxvY1ZhOwotICAgIFR4RCA9ICpwRGVzdFR4RDsKLSAgICBwVHhEID0gJlR4RDsKLSAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLSNlbmRpZgotCi0JaWYgKHBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5kaXNQYWNrZXQpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiTWxtZUhhcmRUcmFuc21pdCBFcnJvclxuIikpOwotCQkvL05kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+VHhSaW5nTG9jayk7Ci0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCS8vIG91dGdvaW5nIGZyYW1lIGFsd2F5cyB3YWtldXAgUEhZIHRvIHByZXZlbnQgZnJhbWUgbG9zdAotCQkvLyBpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlwRmlyc3RUeFdJCT0oUFRYV0lfU1RSVUMpcFNyY0J1ZlZBOwotCi0JcEhlYWRlcl84MDJfMTEgPSAoUEhFQURFUl84MDJfMTEpIChwU3JjQnVmVkEgKyBUWFdJX1NJWkUpOwotCWlmIChwSGVhZGVyXzgwMl8xMS0+QWRkcjFbMF0gJiAweDAxKQotCXsKLQkJTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlOwotCX0KLQllbHNlCi0JewotCQlNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOwotCX0KLQotCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkgJiYKLQkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUU9TX05VTEwpKQotCXsKLQkJcE1hY0VudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyXzgwMl8xMS0+QWRkcjEpOwotCX0KLQotCS8vIFZlcmlmeSBNbG1lIHJhdGUgZm9yIGEgLyBnIGJhbmRzLgotCWlmICgocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpICYmIChNbG1lUmF0ZSA8IFJBVEVfNikpIC8vIDExQSBiYW5kCi0JCU1sbWVSYXRlID0gUkFURV82OwotCi0JLy8KLQkvLyBTaG91bGQgbm90IGJlIGhhcmQgY29kZSB0byBzZXQgUHdyTWdtdCB0byAwIChQV1JfQUNUSVZFKQotCS8vIFNuaWNlIGl0J3MgYmVlbiBzZXQgdG8gMCB3aGlsZSBvbiBNZ3RNYWNIZWFkZXJJbml0Ci0JLy8gQnkgdGhlIHdheSB0aGlzIHdpbGwgY2F1c2UgZnJhbWUgdG8gYmUgc2VuZCBvbiBQV1JfU0FWRSBmYWlsZWQuCi0JLy8KLQkvLwotCS8vIEluIFdNTS1VQVBTRCwgbWxtZSBmcmFtZSBzaG91bGQgYmUgc2V0IHBzbSBhcyBwb3dlciBzYXZpbmcgYnV0IHByb2JlIHJlcXVlc3QgZnJhbWUKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSAgICAvLyBEYXRhLU51bGwgcGFja2V0cyBhbHNlIHBhc3MgdGhyb3VnaCBNTVJlcXVlc3QgaW4gUlQyODYwLCBob3dldmVyLCB3ZSBob3BlIGNvbnRyb2wgdGhlIHBzbSBiaXQgdG8gcGFzcyBBUFNECi0JaWYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlICE9IEJUWVBFX0RBVEEpCi0gICAgewotCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9QUk9CRV9SRVEpIHx8ICEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSkKLQl7Ci0JCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX0FDVElWRTsKLQl9Ci0JZWxzZQotCXsKLQkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlOwotCX0KLSAgICB9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQliSW5zZXJ0VGltZXN0YW1wID0gRkFMU0U7Ci0JaWYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0NOVEwpIC8vIG11c3QgYmUgUFMtUE9MTAotCXsKLQkJYkFja1JlcXVpcmVkID0gRkFMU0U7Ci0JfQotCWVsc2UgLy8gQlRZUEVfTUdNVCBvciBCVFlQRV9EQVRBKG11c3QgYmUgTlVMTCBmcmFtZSkKLQl7Ci0JCWlmIChwSGVhZGVyXzgwMl8xMS0+QWRkcjFbMF0gJiAweDAxKSAvLyBNVUxUSUNBU1QsIEJST0FEQ0FTVAotCQl7Ci0JCQliQWNrUmVxdWlyZWQgPSBGQUxTRTsKLQkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IDA7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQliQWNrUmVxdWlyZWQgPSBUUlVFOwotCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gUlRNUENhbGNEdXJhdGlvbihwQWQsIE1sbWVSYXRlLCAxNCk7Ci0JCQlpZiAocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9QUk9CRV9SU1ApCi0JCQl7Ci0JCQkJYkluc2VydFRpbWVzdGFtcCA9IFRSVUU7Ci0JCQl9Ci0JCX0KLQl9Ci0JcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZSsrOwotCWlmIChwQWQtPlNlcXVlbmNlID4gMHhmZmYpCi0JCXBBZC0+U2VxdWVuY2UgPSAwOwotCS8vIEJlZm9yZSByYWRhciBkZXRlY3Rpb24gZG9uZSwgbWdtdCBmcmFtZSBjYW4gbm90IGJlIHNlbnQgYnV0IHByb2JlIHJlcQotCS8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgcHJvYmUgcmVxIHRvIHRyaWdnZXIgZHJpdmVyIHRvIHNlbmQgcHJvYmUgcmVxIGluIHBhc3NpdmUgc2NhbgotCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgIT0gU1VCVFlQRV9QUk9CRV9SRVEpCi0JCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQotCQkmJiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiTWxtZUhhcmRUcmFuc21pdCAtLT4gcmFkYXIgZGV0ZWN0IG5vdCBpbiBub3JtYWwgbW9kZSAhISFcbiIpKTsKLQkJLy9OZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPlR4UmluZ0xvY2spOwotCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBIZWFkZXJfODAyXzExLCBESVJfV1JJVEUsIEZBTFNFKTsKLSNlbmRpZgotCS8vCi0JLy8gZmlsbCBzY2F0dGVyLWFuZC1nYXRoZXIgYnVmZmVyIGxpc3QgaW50byBUWEQuIEludGVybmFsbHkgY3JlYXRlZCBORElTIFBBQ0tFVAotCS8vIHNob3VsZCBhbHdheXMgaGFzIG9ubHkgb25lIG9oeXNpY2FsIGJ1ZmZlciwgYW5kIHRoZSB3aG9sZSBmcmFtZSBzaXplIGVxdWFscwotCS8vIHRvIHRoZSBmaXJzdCBzY2F0dGVyIGJ1ZmZlciBzaXplCi0JLy8KLQotCS8vIEluaXRpYWxpemUgVFggRGVzY3JpcHRvcgotCS8vIEZvciBpbnRlci1mcmFtZSBnYXAsIHRoZSBudW1iZXIgaXMgZm9yIHRoaXMgZnJhbWUgYW5kIG5leHQgZnJhbWUKLQkvLyBGb3IgTUxNRSByYXRlLCB3ZSB3aWxsIGZpeCBhcyAyTWIgdG8gbWF0Y2ggb3RoZXIgdmVuZG9yJ3MgaW1wbGVtZW50Ci0vLwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IDE7Ci0KLS8vIG1hbmFnZW1lbnQgZnJhbWUgZG9lc24ndCBuZWVkIGVuY3J5cHRpb24uIHNvIHVzZSBSRVNFUlZFRF9XQ0lEIG5vIG1hdHRlciB1IGFyZSBzZW5kaW5nIHRvIHNwZWNpZmljIHdjaWQgb3Igbm90LgotCS8vIE9ubHkgYmVhY29uIHVzZSBOc2VxPVRSVUUuIFNvIGhlcmUgd2UgdXNlIE5zZXE9RkFMU0UuCi0JaWYgKHBNYWNFbnRyeSA9PSBOVUxMKQotCXsKLQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLCBiSW5zZXJ0VGltZXN0YW1wLCBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwKLQkJMCwgUkVTRVJWRURfV0NJRCwgKFNyY0J1ZkxlbiAtIFRYV0lfU0laRSksIFBJRF9NR01ULCAwLCAgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7Ci0JfQotCWVsc2UKLQl7Ci0JCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsCi0JCQkJCWJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAotCQkJCQkwLCBwTWFjRW50cnktPkFpZCwgKFNyY0J1ZkxlbiAtIFRYV0lfU0laRSksCi0JCQkJCXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywgMCwKLQkJCQkJKFVDSEFSKXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywKLQkJCQkJSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUpOwotCX0KLQotCXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OwotCXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLS8vCXBGaXJzdFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IFNyY0J1ZkxlbiAtIFRYV0lfU0laRTsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcEZpcnN0VHhXSSwgVFlQRV9UWFdJKTsKLSNlbmRpZgotCVNyY0J1ZlBBID0gUENJX01BUF9TSU5HTEUocEFkLCBwU3JjQnVmVkEsIFNyY0J1ZkxlbiwgMCwgUENJX0RNQV9UT0RFVklDRSk7Ci0KLQotCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIFRSVUUsIEZJRk9fRURDQSk7Ci0JcFR4RC0+TGFzdFNlYzAgPSAxOwotCXBUeEQtPkxhc3RTZWMxID0gMTsKLQlwVHhELT5TRExlbjAgPSBTcmNCdWZMZW47Ci0JcFR4RC0+U0RMZW4xID0gMDsKLQlwVHhELT5TRFB0cjAgPSBTcmNCdWZQQTsKLQlwVHhELT5ETUFET05FID0gMDsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLSAgICBXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOwotI2VuZGlmCi0KLQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOwotCi0JLy8gSW5jcmVhc2UgVFhfQ1RYX0lEWCwgYnV0IHdyaXRlIHRvIHJlZ2lzdGVyIGxhdGVyLgotCUlOQ19SSU5HX0lOREVYKHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHgsIFRYX1JJTkdfU0laRSk7Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFF1ZUlkeCoweDEwLCAgcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCk7Ci0KLQkvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBNR01UIHJpbmcgcmVzb3VyY2UKLS8vCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+VHhSaW5nTG9jayk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1ORElTX1NUQVRVUyBNbG1lRGF0YUhhcmRUcmFuc21pdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUglRdWVJZHgsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCi17Ci0JaWYgKChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpCi0JCSkKLQl7Ci0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCXJldHVybiBNbG1lSGFyZFRyYW5zbWl0VHhSaW5nKHBBZCxRdWVJZHgscFBhY2tldCk7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNhbGN1bGF0ZXMgdGhlIGR1cmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHRyYW5zbWl0IG91dCBmcmFtZXMKLQl3aXRoIGdpdmVuIHNpemUgYW5kIHNwZWNpZmllZCByYXRlLgotCi0JQXJndW1lbnRzOgotCQlwVHhECQlQb2ludGVyIHRvIHRyYW5zbWl0IGRlc2NyaXB0b3IKLQkJQWNrCQlTZXR0aW5nIGZvciBBY2sgcmVxdWlyZW1lbnQgYml0Ci0JCUZyYWdtZW50CVNldHRpbmcgZm9yIEZyYWdtZW50IGJpdAotCQlSZXRyeU1vZGUJU2V0dGluZyBmb3IgcmV0cnkgbW9kZQotCQlJZnMJCVNldHRpbmcgZm9yIElGUyBnYXAKLQkJUmF0ZQkJU2V0dGluZyBmb3IgdHJhbnNtaXQgcmF0ZQotCQlTZXJ2aWNlCQlTZXR0aW5nIGZvciBzZXJ2aWNlCi0JCUxlbmd0aAkJRnJhbWUgbGVuZ3RoCi0JCVR4UHJlYW1ibGUJU2hvcnQgb3IgTG9uZyBwcmVhbWJsZSB3aGVuIHVzaW5nIENDSyByYXRlcwotCQlRdWVJZHggLSAwLTMsIGFjY29yZGluZyB0byA4MDIuMTFlL2Q0LjQgSnVuZS8yMDAzCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBXcml0ZVR4RGVzY3JpcHRvcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVFhEX1NUUlVDCQlwVHhELAotCUlOCUJPT0xFQU4JCQliV0lWLAotCUlOCVVDSEFSCQkJUXVldWVTRUwpCi17Ci0JLy8KLQkvLyBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4KLQkvLyBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MKLQkvLwotCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7Ci0KLQlwVHhELT5XSVYJPSAoYldJVikgPyAxOiAwOwotCXBUeEQtPlFTRUw9IChRdWV1ZVNFTCk7Ci0JLy9SVDI4NjBjPz8gIGZpeGVkIHVzaW5nIEVEQ0EgcXVldWUgZm9yIHRlc3QuLi4gIFdlIGRvdWJ0IFF1ZXVlMSBoYXMgcHJvYmxlbS4gIDIwMDYtMDktMjYgSmFuCi0JLy9wVHhELT5RU0VMPSBGSUZPX0VEQ0E7Ci0JLyoKLQlpZiAocEFkLT5iR2VuT25lSENDQSA9PSBUUlVFKQotCQlwVHhELT5RU0VMPSBGSUZPX0hDQ0E7Ci0JKi8KLQlwVHhELT5ETUFET05FID0gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9pbmZvLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1faW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTUxZTk4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9pbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzE4ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0JY21tX2luZm8uYwotCi0gICAgQWJzdHJhY3Q6Ci0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotSU5UCVNob3dfU1NJRF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X1dpcmVsZXNzTW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X1R4QnVyc3RfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19UeFByZWFtYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfVHhQb3dlcl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0NoYW5uZWxfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19CR1Byb3RlY3Rpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19SVFNUaHJlc2hvbGRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19GcmFnVGhyZXNob2xkX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotSU5UCVNob3dfSHRCd19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0h0TWNzX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRHaV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0h0T3BNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRFeHRjaGFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19IdE1wZHVEZW5zaXR5X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRCYVdpblNpemVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19IdFJkZ19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0h0QW1zZHVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19IdEF1dG9CYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLUlOVAlTaG93X0NvdW50cnlSZWdpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19Db3VudHJ5Q29kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLSNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCi1JTlQJU2hvd19Qa3RBZ2dyZWdhdGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIFdNTV9TVVBQT1JUCi1JTlQJU2hvd19XbW1DYXBhYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLSNlbmRpZiAvLyBXTU1fU1VQUE9SVCAvLwotCi1JTlQJU2hvd19JRUVFODAyMTFIX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotSU5UCVNob3dfTmV0d29ya1R5cGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLUlOVAlTaG93X0F1dGhNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfRW5jcnlwVHlwZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0RlZmF1bHRLZXlJRF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0tleTFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19LZXkyX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfS2V5M19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0tleTRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19XUEFQU0tfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1zdGF0aWMgc3RydWN0IHsKLQlQU1RSSU5HIG5hbWU7Ci0JSU5UICgqc2hvd19wcm9jKShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLCBQU1RSSU5HIGFyZyk7Ci19ICpQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLCBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0NbXSA9IHsKLQl7IlNTSUQiLAkJCQkJU2hvd19TU0lEX1Byb2N9LAotCXsiV2lyZWxlc3NNb2RlIiwJCQlTaG93X1dpcmVsZXNzTW9kZV9Qcm9jfSwKLQl7IlR4QnVyc3QiLAkJCQkJU2hvd19UeEJ1cnN0X1Byb2N9LAotCXsiVHhQcmVhbWJsZSIsCQkJCVNob3dfVHhQcmVhbWJsZV9Qcm9jfSwKLQl7IlR4UG93ZXIiLAkJCQkJU2hvd19UeFBvd2VyX1Byb2N9LAotCXsiQ2hhbm5lbCIsCQkJCQlTaG93X0NoYW5uZWxfUHJvY30sCi0JeyJCR1Byb3RlY3Rpb24iLAkJCVNob3dfQkdQcm90ZWN0aW9uX1Byb2N9LAotCXsiUlRTVGhyZXNob2xkIiwJCQlTaG93X1JUU1RocmVzaG9sZF9Qcm9jfSwKLQl7IkZyYWdUaHJlc2hvbGQiLAkJCVNob3dfRnJhZ1RocmVzaG9sZF9Qcm9jfSwKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQl7Ikh0QnciLAkJCQkJU2hvd19IdEJ3X1Byb2N9LAotCXsiSHRNY3MiLAkJCQkJU2hvd19IdE1jc19Qcm9jfSwKLQl7Ikh0R2kiLAkJCQkJU2hvd19IdEdpX1Byb2N9LAotCXsiSHRPcE1vZGUiLAkJCQlTaG93X0h0T3BNb2RlX1Byb2N9LAotCXsiSHRFeHRjaGEiLAkJCQlTaG93X0h0RXh0Y2hhX1Byb2N9LAotCXsiSHRNcGR1RGVuc2l0eSIsCQkJU2hvd19IdE1wZHVEZW5zaXR5X1Byb2N9LAotCXsiSHRCYVdpblNpemUiLAkJICAgICAgICBTaG93X0h0QmFXaW5TaXplX1Byb2N9LAotCXsiSHRSZGciLAkJCQlTaG93X0h0UmRnX1Byb2N9LAotCXsiSHRBbXNkdSIsCQkJCVNob3dfSHRBbXNkdV9Qcm9jfSwKLQl7Ikh0QXV0b0JhIiwJCSAgICAgICAgU2hvd19IdEF1dG9CYV9Qcm9jfSwKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQl7IkNvdW50cnlSZWdpb24iLAkJCVNob3dfQ291bnRyeVJlZ2lvbl9Qcm9jfSwKLQl7IkNvdW50cnlSZWdpb25BQmFuZCIsCQlTaG93X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jfSwKLQl7IkNvdW50cnlDb2RlIiwJCQkJU2hvd19Db3VudHJ5Q29kZV9Qcm9jfSwKLSNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCi0JeyJQa3RBZ2dyZWdhdGUiLAkJCVNob3dfUGt0QWdncmVnYXRlX1Byb2N9LAotI2VuZGlmCi0KLSNpZmRlZiBXTU1fU1VQUE9SVAotCXsiV21tQ2FwYWJsZSIsCQkJCVNob3dfV21tQ2FwYWJsZV9Qcm9jfSwKLSNlbmRpZgotCXsiSUVFRTgwMjExSCIsCQkJCVNob3dfSUVFRTgwMjExSF9Qcm9jfSwKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSAgICB7Ik5ldHdvcmtUeXBlIiwJCQkJU2hvd19OZXR3b3JrVHlwZV9Qcm9jfSwKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl7IkF1dGhNb2RlIiwJCQkJU2hvd19BdXRoTW9kZV9Qcm9jfSwKLQl7IkVuY3J5cFR5cGUiLAkJCQlTaG93X0VuY3J5cFR5cGVfUHJvY30sCi0JeyJEZWZhdWx0S2V5SUQiLAkJCVNob3dfRGVmYXVsdEtleUlEX1Byb2N9LAotCXsiS2V5MSIsCQkJCQlTaG93X0tleTFfUHJvY30sCi0JeyJLZXkyIiwJCQkJCVNob3dfS2V5Ml9Qcm9jfSwKLQl7IktleTMiLAkJCQkJU2hvd19LZXkzX1Byb2N9LAotCXsiS2V5NCIsCQkJCQlTaG93X0tleTRfUHJvY30sCi0JeyJXUEFQU0siLAkJCQkJU2hvd19XUEFQU0tfUHJvY30sCi0Je05VTEwsIE5VTEx9Ci19OwotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIEdldCBEcml2ZXIgdmVyc2lvbi4KLQotICAgIFJldHVybjoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfRHJpdmVyVmVyc2lvbl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEcml2ZXIgdmVyc2lvbi0lc1xuIiwgU1RBX0RSSVZFUl9WRVJTSU9OKSk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBDb3VudHJ5IFJlZ2lvbi4KLSAgICAgICAgVGhpcyBjb21tYW5kIHdpbGwgbm90IHdvcmssIGlmIHRoZSBmaWVsZCBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkLgotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9Db3VudHJ5UmVnaW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlpbnQgcmV0dmFsOwotCi0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotCXJldHVybiAtRU9QTk9UU1VQUDsKLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0KLQlyZXR2YWwgPSBSVF9DZmdTZXRDb3VudHJ5UmVnaW9uKHBBZCwgYXJnLCBCQU5EXzI0Ryk7Ci0JaWYgKHJldHZhbCA9PSBGQUxTRSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JLy8gaWYgc2V0IGNvdW50cnkgcmVnaW9uLCBkcml2ZXIgbmVlZHMgdG8gYmUgcmVzZXQKLQlCdWlsZENoYW5uZWxMaXN0KHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jOjooQ291bnRyeVJlZ2lvbj0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IENvdW50cnkgUmVnaW9uIGZvciBBIGJhbmQuCi0gICAgICAgIFRoaXMgY29tbWFuZCB3aWxsIG5vdCB3b3JrLCBpZiB0aGUgZmllbGQgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZC4KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlpbnQgcmV0dmFsOwotCi0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotCXJldHVybiAtRU9QTk9UU1VQUDsKLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0KLQlyZXR2YWwgPSBSVF9DZmdTZXRDb3VudHJ5UmVnaW9uKHBBZCwgYXJnLCBCQU5EXzVHKTsKLQlpZiAocmV0dmFsID09IEZBTFNFKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQkvLyBpZiBzZXQgY291bnRyeSByZWdpb24sIGRyaXZlciBuZWVkcyB0byBiZSByZXNldAotCUJ1aWxkQ2hhbm5lbExpc3QocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYzo6KENvdW50cnlSZWdpb249JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdpcmVsZXNzIE1vZGUKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfV2lyZWxlc3NNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlJTlQJc3VjY2VzcyA9IFRSVUU7Ci0KLQlzdWNjZXNzID0gUlRfQ2ZnU2V0V2lyZWxlc3NNb2RlKHBBZCwgYXJnKTsKLQlpZiAoc3VjY2VzcykKLQl7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJTE9ORwlXaXJlbGVzc01vZGUgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOwotCi0JCQlSVE1QU2V0UGh5TW9kZShwQWQsIFdpcmVsZXNzTW9kZSk7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQlpZiAoV2lyZWxlc3NNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7Ci0JCQkJcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKLQkJCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCS8vIFNldCBBZGhvY01vZGUgcmF0ZXMKLQkJCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKLQkJCXsKLQkJCQlNbG1lVXBkYXRlVHhSYXRlcyhwQWQsIEZBTFNFLCAwKTsKLQkJCQlNYWtlSWJzc0JlYWNvbihwQWQpOyAgICAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCi0JCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7ICAgICAgIC8vIGNvcHkgdG8gb24tY2hpcCBtZW1vcnkKLQkJCX0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCS8vIGl0IGlzIG5lZWRlZCB0byBzZXQgU1NJRCB0byB0YWtlIGVmZmVjdAotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQlTZXRDb21tb25IVChwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV2lyZWxlc3NNb2RlX1Byb2M6Oig9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9XaXJlbGVzc01vZGVfUHJvYzo6cGFyYW1ldGVycyBvdXQgb2YgcmFuZ2VcbiIpKTsKLQl9Ci0KLQlyZXR1cm4gc3VjY2VzczsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQ2hhbm5lbAotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9DaGFubmVsX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlJTlQJCXN1Y2Nlc3MgPSBUUlVFOwotCVVDSEFSCUNoYW5uZWw7Ci0KLQlDaGFubmVsID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JLy8gY2hlY2sgaWYgdGhpcyBjaGFubmVsIGlzIHZhbGlkCi0JaWYgKENoYW5uZWxTYW5pdHkocEFkLCBDaGFubmVsKSA9PSBUUlVFKQotCXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IENoYW5uZWw7Ci0KLQkJCWlmIChNT05JVE9SX09OKHBBZCkpCi0JCQl7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkJTl9DaGFubmVsQ2hlY2socEFkKTsKLQkJCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkKLQkJCQl7Ci0JCQkJCU5fU2V0Q2VuQ2gocEFkKTsKLQkJCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKLQkJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfNDAsIGNvbnRyb2xfY2hhbm5lbCglZCksIENlbnRyYWxDaGFubmVsKCVkKSBcbiIsCi0JCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7Ci0JCQkJfQotCQkJCWVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCQl7Ci0JCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfMjAsIENoYW5uZWwoJWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCXN1Y2Nlc3MgPSBUUlVFOwotCX0KLQllbHNlCi0JewotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQlzdWNjZXNzID0gRkFMU0U7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JfQotCi0KLQlpZiAoc3VjY2VzcyA9PSBUUlVFKQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQ2hhbm5lbF9Qcm9jOjooQ2hhbm5lbD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKLQotCXJldHVybiBzdWNjZXNzOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFNob3J0IFNsb3QgVGltZSBFbmFibGUgb3IgRGlzYWJsZQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9TaG9ydFNsb3RfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCWludCByZXR2YWw7Ci0KLQlyZXR2YWwgPSBSVF9DZmdTZXRTaG9ydFNsb3QocEFkLCBhcmcpOwotCWlmIChyZXR2YWwgPT0gVFJVRSkKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1Nob3J0U2xvdF9Qcm9jOjooU2hvcnRTbG90PSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUpKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgVHggcG93ZXIKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfVHhQb3dlcl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JTE9ORyBUeFBvd2VyOwotCUlOVCAgIHN1Y2Nlc3MgPSBGQUxTRTsKLQotCVR4UG93ZXIgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChUeFBvd2VyIDw9IDEwMCkKLQl7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSBUeFBvd2VyOwotCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQlzdWNjZXNzID0gVFJVRTsKLQl9Ci0JZWxzZQotCQlzdWNjZXNzID0gRkFMU0U7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfVHhQb3dlcl9Qcm9jOjooVHhQb3dlclBlcmNlbnRhZ2U9JWxkKVxuIiwgcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKLQotCXJldHVybiBzdWNjZXNzOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCAxMUIvMTFHIFByb3RlY3Rpb24KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQkdQcm90ZWN0aW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkpCi0JewotCQljYXNlIDA6IC8vQVVUTwotCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIDE6IC8vQWx3YXlzIE9uCi0JCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjogLy9BbHdheXMgT0ZGCi0JCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAyOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6ICAvL0ludmFsaWQgYXJndW1lbnQKLQkJCXJldHVybiBGQUxTRTsKLQl9Ci0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9CR1Byb3RlY3Rpb25fUHJvYzo6KEJHUHJvdGVjdGlvbj0lbGQpXG4iLCBwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24pKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBUeFByZWFtYmxlCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X1R4UHJlYW1ibGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVJUXzgwMl8xMV9QUkVBTUJMRQlQcmVhbWJsZTsKLQotCVByZWFtYmxlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCi0Jc3dpdGNoIChQcmVhbWJsZSkKLQl7Ci0JCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZVNob3J0OgotCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQlicmVhazsKLQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlQXV0bzoKLQkJCS8vIGlmIHVzZXIgd2FudHMgQVVUTywgaW5pdGlhbGl6ZSB0byBMT05HIGhlcmUsIHRoZW4gY2hhbmdlIGFjY29yZGluZyB0byBBUCdzCi0JCQkvLyBjYXBhYmlsaXR5IHVwb24gYXNzb2NpYXRpb24uCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCU1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZUxvbmcpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAotCQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9UeFByZWFtYmxlX1Byb2M6OihUeFByZWFtYmxlPSVsZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBSVFMgVGhyZXNob2xkCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X1JUU1RocmVzaG9sZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgIFJ0c1RocmVzaDsKLQotCVJ0c1RocmVzaCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZigoUnRzVGhyZXNoID4gMCkgJiYgKFJ0c1RocmVzaCA8PSBNQVhfUlRTX1RIUkVTSE9MRCkpCi0JCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCAgPSAoVVNIT1JUKVJ0c1RocmVzaDsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQllbHNlIGlmIChSdHNUaHJlc2ggPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gTUFYX1JUU19USFJFU0hPTEQ7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1JUU1RocmVzaG9sZF9Qcm9jOjooUlRTVGhyZXNob2xkPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgRnJhZ21lbnQgVGhyZXNob2xkCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0ZyYWdUaHJlc2hvbGRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCSBORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCAgICAgRnJhZ1RocmVzaDsKLQotCUZyYWdUaHJlc2ggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKEZyYWdUaHJlc2ggPiBNQVhfRlJBR19USFJFU0hPTEQgfHwgRnJhZ1RocmVzaCA8IE1JTl9GUkFHX1RIUkVTSE9MRCkKLQl7Ci0JCS8vSWxsZWdhbCBGcmFnVGhyZXNoIHNvIHdlIHNldCBpdCB0byBkZWZhdWx0Ci0JCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gTUFYX0ZSQUdfVEhSRVNIT0xEOwotCX0KLQllbHNlIGlmIChGcmFnVGhyZXNoICUgMiA9PSAxKQotCXsKLQkJLy8gVGhlIGxlbmd0aCBvZiBlYWNoIGZyYWdtZW50IHNoYWxsIGFsd2F5cyBiZSBhbiBldmVuIG51bWJlciBvZiBvY3RldHMsIGV4Y2VwdCBmb3IgdGhlIGxhc3QgZnJhZ21lbnQKLQkJLy8gb2YgYW4gTVNEVSBvciBNTVBEVSwgd2hpY2ggbWF5IGJlIGVpdGhlciBhbiBldmVuIG9yIGFuIG9kZCBudW1iZXIgb2Ygb2N0ZXRzLgotCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpKEZyYWdUaHJlc2ggLSAxKTsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKUZyYWdUaHJlc2g7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9PSBNQVhfRlJBR19USFJFU0hPTEQpCi0JCQlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gVFJVRTsKLQkJZWxzZQotCQkJcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9GcmFnVGhyZXNob2xkX1Byb2M6OihGcmFnVGhyZXNob2xkPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBUeEJ1cnN0Ci0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X1R4QnVyc3RfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCUxPTkcgVHhCdXJzdDsKLQotCVR4QnVyc3QgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChUeEJ1cnN0ID09IDEpCi0JCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gVFJVRTsKLQllbHNlIGlmIChUeEJ1cnN0ID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gRkFMU0U7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9UeEJ1cnN0X1Byb2M6OihUeEJ1cnN0PSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0jaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgVHhCdXJzdAotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9Qa3RBZ2dyZWdhdGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCUxPTkcgYWdncmU7Ci0KLQlhZ2dyZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoYWdncmUgPT0gMSkKLQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IFRSVUU7Ci0JZWxzZSBpZiAoYWdncmUgPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IEZBTFNFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Qa3RBZ2dyZWdhdGVfUHJvYzo6KEFHR1JFPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0jZW5kaWYKLQotCi0jaWZkZWYgSU5GX0FNQVpPTl9QUEEKLUlOVAlTZXRfSU5GX0FNQVpPTl9TRV9QUEFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgYWdncmU7Ci0JVUlOVCBzdGF0dXM7Ci0KLQlhZ2dyZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoYWdncmUgPT0gMSkKLQl7Ci0JCWlmKHBBZC0+UFBBRW5hYmxlPT1UUlVFKQotCQl7Ci0JCQlwcmludGsoIklORl9BTUFaT05fU0VfUFBBIGFscmVhZHkgZW5hYmxlZCBcbiIpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKHBwYV9ob29rX2RpcmVjdHBhdGhfcmVnaXN0ZXJfZGV2X2ZuKQotCQkJewotCQkJCVVJTlQzMiBnX2lmX2lkOwotCi0JCQkJaWYgKHBBZC0+cERpcmVjdHBhdGhDYiA9PSBOVUxMKQotCQkJCXsKLQkJCQkJIHBBZC0+cERpcmVjdHBhdGhDYiA9IChQUEFfRElSRUNUUEFUSF9DQiAqKSBrbWFsbG9jIChzaXplb2YoUFBBX0RJUkVDVFBBVEhfQ0IpLCBHRlBfQVRPTUlDKTsKLQkJCQkgICAgICAgIHByaW50aygiUmVhbGxvYyBtZW1vcnkgZm9yICBwRGlyZWN0cGF0aENiID8/XG4iKTsKLQkJCQl9Ci0KLQkJCQkvKiByZWdpc3RlciBjYWxsYmFjayAqLwotCQkJCXBBZC0+cERpcmVjdHBhdGhDYi0+cnhfZm4gPSBOVUxMOwotCQkJCXBBZC0+cERpcmVjdHBhdGhDYi0+c3RvcF90eF9mbiA9IE5VTEw7Ci0JCQkJcEFkLT5wRGlyZWN0cGF0aENiLT5zdGFydF90eF9mbiA9IE5VTEw7Ci0KLQkJCQlzdGF0dXMgPSBwcGFfaG9va19kaXJlY3RwYXRoX3JlZ2lzdGVyX2Rldl9mbigmZ19pZl9pZCwgcEFkLT5uZXRfZGV2LCBwQWQtPnBEaXJlY3RwYXRoQ2IsIFBQQV9GX0RJUkVDVFBBVEhfRVRIX0lGKTsKLQotCQkJCWlmKHN0YXR1cz09MSkKLQkJCQl7Ci0JCQkJCXBBZC0+Z19pZl9pZD1nX2lmX2lkOwotCQkJCQlwcmludGsoInJlZ2lzdGVyIElORl9BTUFaT05fU0VfUFBBIHN1Y2Nlc3MgOnJldDolZCBpZDolZDolZFxuIixzdGF0dXMscEFkLT5nX2lmX2lkLGdfaWZfaWQpOwotCQkJCQlwQWQtPlBQQUVuYWJsZT1UUlVFOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlwcmludGsoInJlZ2lzdGVyIElORl9BTUFaT05fU0VfUFBBIGZhaWwgOnJldDolZFxuIixzdGF0dXMpOwotCQkJCX0KLQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXByaW50aygiSU5GX0FNQVpPTl9TRV9QUEEgZW5hYmxlIGZhaWwgOiB0aGVyZSBpcyBubyBJTkZfQU1BWk9OX1NFX1BQQSBtb2R1bGUgLiBcbiIpOwotCQkJfQotCQl9Ci0KLQotCX0KLQllbHNlIGlmIChhZ2dyZSA9PSAwKQotCXsKLQkJaWYocEFkLT5QUEFFbmFibGU9PUZBTFNFKQotCQl7Ci0KLXByaW50aygiSU5GX0FNQVpPTl9TRV9QUEEgYWxyZWFkeSBkaXNhYmxlIFxuIik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAocHBhX2hvb2tfZGlyZWN0cGF0aF9yZWdpc3Rlcl9kZXZfZm4pCi0JCQl7Ci0JCQkJVUlOVDMyIGdfaWZfaWQ7Ci0JCQkJZ19pZl9pZD1wQWQtPmdfaWZfaWQ7Ci0JCQkJcHJpbnRrKCJnX2lmX2lkPSVkIFxuIixwQWQtPmdfaWZfaWQpOwotCQkJCXN0YXR1cz1wcGFfaG9va19kaXJlY3RwYXRoX3JlZ2lzdGVyX2Rldl9mbigmZ19pZl9pZCwgcEFkLT5uZXRfZGV2LCBOVUxMLCBQUEFfRl9ESVJFQ1RQQVRIX0RFUkVHSVNURVIpOwotCi0JCQkJaWYoc3RhdHVzPT0xKQotCQkJCXsKLQkJCQkJcEFkLT5nX2lmX2lkPTA7Ci0JCQkJCXByaW50aygidW5yZWdpc3RlciBJTkZfQU1BWk9OX1NFX1BQQSBzdWNjZXNzIDpyZXQ6JWRcbiIsc3RhdHVzKTsKLQkJCQkJcEFkLT5QUEFFbmFibGU9RkFMU0U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXByaW50aygidW5yZWdpc3RlciBJTkZfQU1BWk9OX1NFX1BQQSBmYWlsIDpyZXQ6JWRcbiIsc3RhdHVzKTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwcmludGsoIklORl9BTUFaT05fU0VfUFBBIGVuYWJsZSBmYWlsIDogdGhlcmUgaXMgbm8gSU5GX0FNQVpPTl9TRV9QUEEgbW9kdWxlIC4gXG4iKTsKLQkJCX0KLQkJfQotCi0JfQotCWVsc2UKLQl7Ci0JCXByaW50aygiSW52YWxpZCBhcmd1bWVudCAlZCBcbiIsYWdncmUpOwotCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLQotfQotI2VuZGlmIC8vIElORl9BTUFaT05fUFBBIC8vCi0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgSUVFRTgwMjExSC4KLSAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgMSB3aGVuIG5lZWRzIHJhZGFyIGRldGVjdGlvbiwgb3RoZXJ3aXNlIDAKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfSUVFRTgwMjExSF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0gICAgTE9ORyBpZWVlODAyMTFoOwotCi0JaWVlZTgwMjExaCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoaWVlZTgwMjExaCA9PSAxKQotCQlwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9IFRSVUU7Ci0JZWxzZSBpZiAoaWVlZTgwMjExaCA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9IEZBTFNFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSUVFRTgwMjExSF9Qcm9jOjooSUVFRTgwMjExSD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0jaWZkZWYgREJHCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIEZvciBEZWJ1ZyBpbmZvcm1hdGlvbgotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9EZWJ1Z19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFNldF9EZWJ1Z19Qcm9jICoqKioqKioqKioqKioqKioqKipcbiIpKTsKLQotICAgIGlmKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPD0gUlRfREVCVUdfTE9VRCkKLSAgICAgICAgUlREZWJ1Z0xldmVsID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBTZXRfRGVidWdfUHJvYyhSVERlYnVnTGV2ZWwgPSAlbGQpXG4iLCBSVERlYnVnTGV2ZWwpKTsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmCi0KLUlOVAlTaG93X0Rlc2NJbmZvX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlJTlQgaSwgUXVlSWR4PTA7Ci0vLyAgVUxPTkcJUmVnVmFsdWU7Ci0gICAgICAgIFBSVDI4WFhfUlhEX1NUUlVDIHBSeEQ7Ci0gICAgICAgIFBUWERfU1RSVUMgcFR4RDsKLQlQUlRNUF9UWF9SSU5HCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUXVlSWR4XTsKLQlQUlRNUF9NR01UX1JJTkcJcE1nbXRSaW5nID0gJnBBZC0+TWdtdFJpbmc7Ci0JUFJUTVBfUlhfUklORwlwUnhSaW5nID0gJnBBZC0+UnhSaW5nOwotCi0JZm9yKGk9MDtpPFRYX1JJTkdfU0laRTtpKyspCi0JewotCSAgICBwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbaV0uQWxsb2NWYTsKLQkgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIkRlc2MgIyVkXG4iLGkpKTsKLQkgICAgaGV4X2R1bXAoIlR4IERlc2NyaXB0b3IiLCAoUFVDSEFSKXBUeEQsIDE2KTsKLQkgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoInBUeEQtPkRNQURPTkUgPSAleFxuIiwgcFR4RC0+RE1BRE9ORSkpOwotCX0KLQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKSk7Ci0JZm9yKGk9MDtpPE1HTVRfUklOR19TSVpFO2krKykKLQl7Ci0JICAgIHBUeEQgPSAoUFRYRF9TVFJVQykgcE1nbXRSaW5nLT5DZWxsW2ldLkFsbG9jVmE7Ci0JICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJEZXNjICMlZFxuIixpKSk7Ci0JICAgIGhleF9kdW1wKCJNZ210IERlc2NyaXB0b3IiLCAoUFVDSEFSKXBUeEQsIDE2KTsKLQkgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoInBNZ210LT5ETUFET05FID0gJXhcbiIsIHBUeEQtPkRNQURPTkUpKTsKLQl9Ci0JREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIikpOwotCWZvcihpPTA7aTxSWF9SSU5HX1NJWkU7aSsrKQotCXsKLQkgICAgcFJ4RCA9IChQUlQyOFhYX1JYRF9TVFJVQykgcFJ4UmluZy0+Q2VsbFtpXS5BbGxvY1ZhOwotCSAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiRGVzYyAjJWRcbiIsaSkpOwotCSAgICBoZXhfZHVtcCgiUnggRGVzY3JpcHRvciIsIChQVUNIQVIpcFJ4RCwgMTYpOwotCSAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgicFJ4RC0+RERPTkUgPSAleFxuIiwgcFJ4RC0+RERPTkUpKTsKLQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBSZXNldCBzdGF0aXN0aWNzIGNvdW50ZXIKLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgcEFkYXB0ZXIgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgICAgIGFyZwotCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCS8vVUNIQVIgICAgICAgICAgIGk7Ci0JLy9NQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PlNldF9SZXNldFN0YXRDb3VudGVyX1Byb2NcbiIpKTsKLQotCS8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSBjb3VudGVycwotCU5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCk7Ci0KLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5XbGFuQ291bnRlcnMsIHNpemVvZihDT1VOVEVSXzgwMl8xMSkpOwotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvdW50ZXJzODAyMywgc2l6ZW9mKENPVU5URVJfODAyXzMpKTsKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5SYWxpbmtDb3VudGVycywgc2l6ZW9mKENPVU5URVJfUkFMSU5LKSk7Ci0KLQkvLyBSZXNldCBIb3RTcG90IGNvdW50ZXIKLQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlBZGQgV1BBIGtleSBwcm9jZXNzLgotCQlJbiBBZGhvYyBXUEFOT05FLCBiUGFpcndpc2UgPSAwOyAgS2V5SWR4ID0gMDsKLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBCdWYJCQkJCQkJUG9pbnRlciB0byB0aGUgd2hlcmUgdGhlIGtleSBzdG9yZWQKLQotCVJldHVybiBWYWx1ZToKLQkJTkRJU19TVUNDRVNTCQkJCQlBZGQga2V5IHN1Y2Nlc3NmdWxseQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotCi1CT09MRUFOIFJUTVBDaGVja1N0clByaW50QWJsZSgKLSAgICBJTiAgQ0hBUiAqcEluUHV0U3RyLAotICAgIElOICBVQ0hBUiBzdHJMZW4pCi17Ci0gICAgVUNIQVIgaT0wOwotCi0gICAgZm9yIChpPTA7IGk8c3RyTGVuOyBpKyspCi0gICAgewotICAgICAgICBpZiAoKHBJblB1dFN0cltpXSA8IDB4MjEpIHx8Ci0gICAgICAgICAgICAocEluUHV0U3RyW2ldID4gMHg3RSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlSZW1vdmUgV1BBIEtleSBwcm9jZXNzCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwQnVmCQkJCQkJCVBvaW50ZXIgdG8gdGhlIHdoZXJlIHRoZSBrZXkgc3RvcmVkCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1VDQ0VTUwkJCQkJQWRkIGtleSBzdWNjZXNzZnVsbHkKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLVZPSUQgICAgUlRNUFNldERlc2lyZWRSYXRlcygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBMT05HICAgICAgICAgICAgUmF0ZXMpCi17Ci0gICAgTkRJU184MDJfMTFfUkFURVMgYXJ5UmF0ZXM7Ci0KLSAgICBtZW1zZXQoJmFyeVJhdGVzLCAweDAwLCBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKTsKLSAgICBzd2l0Y2ggKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgUEhZXzExQTogLy8gQSBvbmx5Ci0gICAgICAgICAgICBzd2l0Y2ggKFJhdGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgNjAwMDAwMDogLy82TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MGM7IC8vIDZNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA5MDAwMDAwOiAvLzlNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgxMjsgLy8gOU0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDEyMDAwMDAwOiAvLzEyTQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTg7IC8vIDEyTQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMTgwMDAwMDA6IC8vMThNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgyNDsgLy8gMThNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDAwMDAwMDogLy8yNE0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDMwOyAvLyAyNE0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU180OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDM2MDAwMDAwOiAvLzM2TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NDg7IC8vIDM2TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDgwMDAwMDA6IC8vNDhNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2MDsgLy8gNDhNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA1NDAwMDAwMDogLy81NE0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU183OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIC0xOiAvL0F1dG8KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NmM7IC8vIDU0TWJwcwotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1sxXSA9IDB4NjA7IC8vIDQ4TWJwcwotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4NDg7IC8vIDM2TWJwcwotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1szXSA9IDB4MzA7IC8vIDI0TWJwcwotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s0XSA9IDB4MjQ7IC8vIDE4TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s1XSA9IDB4MTg7IC8vIDEyTQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s2XSA9IDB4MTI7IC8vIDlNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzddID0gMHgwYzsgLy8gNk0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBIWV8xMUJHX01JWEVEOiAvLyBCL0cgTWl4ZWQKLSAgICAgICAgY2FzZSBQSFlfMTFCOiAvLyBCIG9ubHkKLSAgICAgICAgY2FzZSBQSFlfMTFBQkdfTUlYRUQ6IC8vIEEvQi9HIE1peGVkCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBzd2l0Y2ggKFJhdGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgMTAwMDAwMDogLy8xTQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MDI7Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDAwMDAwOiAvLzJNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgwNDsKLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDUwMDAwMDA6IC8vNS41TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MGI7IC8vIDUuNU0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDExMDAwMDAwOiAvLzExTQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTY7IC8vIDExTQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNjAwMDAwMDogLy82TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MGM7IC8vIDZNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA5MDAwMDAwOiAvLzlNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgxMjsgLy8gOU0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDEyMDAwMDAwOiAvLzEyTQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTg7IC8vIDEyTQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMTgwMDAwMDA6IC8vMThNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgyNDsgLy8gMThNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDAwMDAwMDogLy8yNE0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDMwOyAvLyAyNE0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU180OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDM2MDAwMDAwOiAvLzM2TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NDg7IC8vIDM2TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDgwMDAwMDA6IC8vNDhNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2MDsgLy8gNDhNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA1NDAwMDAwMDogLy81NE0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU183OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIC0xOiAvL0F1dG8KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCi0gICAgICAgICAgICAgICAgICAgIHsgLy9CIE9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgxNjsgLy8gMTFNYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1sxXSA9IDB4MGI7IC8vIDUuNU1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzJdID0gMHgwNDsgLy8gMk1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzNdID0gMHgwMjsgLy8gMU1icHMKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsgLy8oQi9HKSBNaXhlZCBvciAoQS9CL0cpIE1peGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NmM7IC8vIDU0TWJwcwotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDYwOyAvLyA0OE1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzJdID0gMHg0ODsgLy8gMzZNYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1szXSA9IDB4MzA7IC8vIDI0TWJwcwotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNF0gPSAweDE2OyAvLyAxMU1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzVdID0gMHgwYjsgLy8gNS41TWJwcwotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNl0gPSAweDA0OyAvLyAyTWJwcwotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbN10gPSAweDAyOyAvLyAxTWJwcwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLSAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsICZhcnlSYXRlcywgc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSk7Ci0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIFJUTVBTZXREZXNpcmVkUmF0ZXMgKCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeClcbiIsCi0gICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0sCi0gICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10sCi0gICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs0XSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0sCi0gICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs2XSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbN10gKSk7Ci0gICAgLy8gQ2hhbmdpbmcgRGVzaXJlZFJhdGUgbWF5IGFmZmVjdCB0aGUgTUFYIFRYIHJhdGUgd2UgdXNlZCB0byBUWCBmcmFtZXMgb3V0Ci0gICAgTWxtZVVwZGF0ZVR4UmF0ZXMocEFkYXB0ZXIsIEZBTFNFLCAwKTsKLX0KLQotTkRJU19TVEFUVVMgUlRNUFdQQVJlbW92ZUtleVByb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFZPSUQJCQlwQnVmKQotewotCVBORElTXzgwMl8xMV9SRU1PVkVfS0VZIHBLZXk7Ci0JVUxPTkcJCQkJCUtleUlkeDsKLQlORElTX1NUQVRVUwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JQk9PTEVBTgkJYlR4S2V5OwkJCS8vIFNldCB0aGUga2V5IGFzIHRyYW5zbWl0IGtleQotCUJPT0xFQU4JCWJQYWlyd2lzZTsJCS8vIEluZGljYXRlIHRoZSBrZXkgaXMgcGFpcndpc2Uga2V5Ci0JQk9PTEVBTgkJYktleVJTQzsJCS8vIGluZGljYXRlIHRoZSByZWNlaXZlICBTQyBzZXQgYnkgS2V5UlNDIHZhbHVlLgotCQkJCQkJCQkvLyBPdGhlcndpc2UsIGl0IHdpbGwgc2V0IGJ5IHRoZSBOSUMuCi0JQk9PTEVBTgkJYkF1dGhlbnRpY2F0b3I7IC8vIGluZGljYXRlIGtleSBpcyBzZXQgYnkgYXV0aGVudGljYXRvci4KLQlJTlQJCWk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tLT4gUlRNUFdQQVJlbW92ZUtleVByb2NcbiIpKTsKLQotCXBLZXkgPSAoUE5ESVNfODAyXzExX1JFTU9WRV9LRVkpIHBCdWY7Ci0JS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweGZmOwotCS8vIEJpdCAzMSBvZiBBZGQta2V5LCBUeCBLZXkKLQliVHhLZXkJCSAgID0gKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7Ci0JLy8gQml0IDMwIG9mIEFkZC1rZXkgUGFpcndpc2VLZXkKLQliUGFpcndpc2UJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDQwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKLQkvLyBCaXQgMjkgb2YgQWRkLWtleSBLZXlSU0MKLQliS2V5UlNDCQkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4MjAwMDAwMDApID8gVFJVRSA6IEZBTFNFOwotCS8vIEJpdCAyOCBvZiBBZGQta2V5IEF1dGhlbnRpY2F0b3IKLQliQXV0aGVudGljYXRvciA9IChwS2V5LT5LZXlJbmRleCAmIDB4MTAwMDAwMDApID8gVFJVRSA6IEZBTFNFOwotCi0JLy8gMS4gSWYgYlR4IGlzIFRSVUUsIHJldHVybiBmYWlsdXJlIGluZm9ybWF0aW9uCi0JaWYgKGJUeEtleSA9PSBUUlVFKQotCQlyZXR1cm4oTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBKTsKLQotCS8vIDIuIENoZWNrIFBhaXJ3aXNlIEtleQotCWlmIChiUGFpcndpc2UpCi0JewotCQkvLyBhLiBJZiBCU1NJRCBpcyBicm9hZGNhc3QsIHJlbW92ZSBhbGwgcGFpcndpc2Uga2V5cy4KLQkJLy8gYi4gSWYgbm90IGJyb2FkY2FzdCwgcmVtb3ZlIHRoZSBwYWlyd2lzZSBzcGVjaWZpZWQgYnkgQlNTSUQKLQkJZm9yIChpID0gMDsgaSA8IFNIQVJFX0tFWV9OVU07IGkrKykKLQkJewotCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkJzc0lkLCBwS2V5LT5CU1NJRCkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QV1BBUmVtb3ZlS2V5UHJvYyhLZXlJZHg9JWQpXG4iLCBpKSk7Ci0JCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uS2V5TGVuID0gMDsKLQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQkJCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCAoVUNIQVIpaSk7Ci0JCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQkvLyAzLiBHcm91cCBLZXkKLQllbHNlCi0JewotCQkvLyBhLiBJZiBCU1NJRCBpcyBicm9hZGNhc3QsIHJlbW92ZSBhbGwgZ3JvdXAga2V5cyBpbmRleGVkCi0JCS8vIGIuIElmIEJTU0lEIG1hdGNoZWQsIGRlbGV0ZSB0aGUgZ3JvdXAga2V5IGluZGV4ZWQuCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQVJlbW92ZUtleVByb2MoS2V5SWR4PSVsZClcbiIsIEtleUlkeCkpOwotCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7Ci0JCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIChVQ0hBUilLZXlJZHgpOwotCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCX0KLQotCXJldHVybiAoU3RhdHVzKTsKLX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUmVtb3ZlIEFsbCBXUEEgS2V5cwotCi0JQXJndW1lbnRzOgotCQlwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QV1BBUmVtb3ZlQWxsS2V5cygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQotCVVDSEFSCWk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBXUEFSZW1vdmVBbGxLZXlzKEF1dGhNb2RlPSVkLCBXZXBTdGF0dXM9JWQpXG4iLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzKSk7Ci0JUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwotCS8vIEZvciBXRVAvQ0tJUCwgdGhlcmUgaXMgbm8gbmVlZCB0byByZW1vdmUgaXQsIHNpbmNlIFdpblhQIHdvbid0IHNldCBpdCBhZ2FpbiBhZnRlcgotCS8vIExpbmsgdXAuIEFuZCBpdCB3aWxsIGJlIHJlcGxhY2VkIGlmIHVzZXIgY2hhbmdlZCBpdC4KLQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JCXJldHVybjsKLQotCS8vIEZvciBXUEEtTm9uZSwgdGhlcmUgaXMgbm8gbmVlZCB0byByZW1vdmUgaXQsIHNpbmNlIFdpblhQIHdvbid0IHNldCBpdCBhZ2FpbiBhZnRlcgotCS8vIExpbmsgdXAuIEFuZCBpdCB3aWxsIGJlIHJlcGxhY2VkIGlmIHVzZXIgY2hhbmdlZCBpdC4KLQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQkJcmV0dXJuOwotCi0JLy8gc2V0IEJTU0lEIHdjaWQgZW50cnkgb2YgdGhlIFBhaXItd2lzZSBLZXkgdGFibGUgYXMgbm8tc2VjdXJpdHkgbW9kZQotCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgQlNTMCwgQlNTSURfV0NJRCk7Ci0KLQkvLyBzZXQgYWxsIHNoYXJlZCBrZXkgbW9kZSBhcyBuby1zZWN1cml0eS4KLQlmb3IgKGkgPSAwOyBpIDwgU0hBUkVfS0VZX05VTTsgaSsrKQotICAgIHsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJyZW1vdmUgJXMga2V5ICMlZFxuIiwgQ2lwaGVyTmFtZVtwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGddLCBpKSk7Ci0JCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtpXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLQotCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpKTsKLQl9Ci0JUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLQotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlBcyBTVEEncyBCU1NJRCBpcyBhIFdDIHRvbywgaXQgdXNlcyBzaGFyZWQga2V5IHRhYmxlLgotCQlUaGlzIGZ1bmN0aW9uIHdyaXRlIGNvcnJlY3QgdW5pY2FzdCBUWCBrZXkgdG8gQVNJQyBXQ0lELgotCQlBbmQgd2Ugc3RpbGwgbWFrZSBhIGNvcHkgaW4gb3VyIE1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LgotCQlDYWxsZXIgZ3VhcmFudGVlIFRLSVAvQUVTIGFsd2F5cyBoYXMga2V5aWR4ID0gMC4gKHBhaXJ3aXNlIGtleSkKLQkJQ2FsbGVyIGd1YXJhbnRlZSBXRVAgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGVuIHNldCBUeGtleSwgIGRlZmF1bHQga2V5IGluZGV4PTB+My4KLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBLZXkJCQkJCQkJUG9pbnRlciB0byB0aGUgd2hlcmUgdGhlIGtleSBzdG9yZWQKLQotCVJldHVybiBWYWx1ZToKLQkJTkRJU19TVUNDRVNTCQkJCQlBZGQga2V5IHN1Y2Nlc3NmdWxseQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDaGFuZ2UgTklDIFBIWSBtb2RlLiBSZS1hc3NvY2lhdGlvbiBtYXkgYmUgbmVjZXNzYXJ5LiBwb3NzaWJsZSBzZXR0aW5ncwotCQlpbmNsdWRlIC0gUEhZXzExQiwgUEhZXzExQkdfTUlYRUQsIFBIWV8xMUEsIGFuZCBQSFlfMTFBQkdfTUlYRUQKLQotCUFyZ3VtZW50czoKLQkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwaHltb2RlICAtCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QU2V0UGh5TW9kZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVTE9ORyBwaHltb2RlKQotewotCUlOVCBpOwotCS8vIHRoZSBzZWxlY3RlZCBwaHltb2RlIG11c3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBSRiBJQyBlbmNvZGVkIGluIEUyUFJPTQotCi0JLy8gaWYgbm8gY2hhbmdlLCBkbyBub3RoaW5nCi0JLyogYnVnIGZpeAotCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IHBoeW1vZGUpCi0JCXJldHVybjsKLSAgICAqLwotCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAoVUNIQVIpcGh5bW9kZTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFNldFBoeU1vZGUgOiBQaHlNb2RlPSVkLCBjaGFubmVsPSVkIFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwotI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKLQlCdWlsZENoYW5uZWxMaXN0RXgocEFkKTsKLSNlbHNlCi0JQnVpbGRDaGFubmVsTGlzdChwQWQpOwotI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KLQotCS8vIHNhbml0eSBjaGVjayB1c2VyIHNldHRpbmcKLQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKLQl7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gRmlyc3RDaGFubmVsKHBBZCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTZXRQaHlNb2RlOiBjaGFubmVsIGlzIG91dCBvZiByYW5nZSwgdXNlIGZpcnN0IGNoYW5uZWw9JWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7Ci0JfQotCi0JTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwotCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7Ci0Jc3dpdGNoIChwaHltb2RlKSB7Ci0JCWNhc2UgUEhZXzExQjoKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4MjsJICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4ODQ7CSAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDhCOwkgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVszXSAgPSAweDk2OwkgIC8vIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuICA9IDQ7Ci0JCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuICA9IDA7Ci0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdICA9IDI7CSAgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0gID0gNDsJICAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSAgPSAxMTsgICAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdICA9IDIyOyAgICAvLyAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOyAvLyBUaGlzIE1PREUgaXMgb25seSBGWUkuIG5vdCB1c2UKLQkJCWJyZWFrOwotCi0JCWNhc2UgUEhZXzExRzoKLQkJY2FzZSBQSFlfMTFCR19NSVhFRDoKLQkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgUEhZXzExTl8yXzRHOgotCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6Ci0JCWNhc2UgUEhZXzExQkdOX01JWEVEOgotCQljYXNlIFBIWV8xMUdOX01JWEVEOgotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVswXSAgPSAweDgyOwkgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMV0gID0gMHg4NDsJICAvLyAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzJdICA9IDB4OEI7CSAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdICA9IDB4OTY7CSAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNF0gID0gMHgxMjsJICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzVdICA9IDB4MjQ7CSAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNl0gID0gMHg0ODsJICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs3XSAgPSAweDZjOwkgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuICA9IDg7Ci0JCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzBdICA9IDB4MEM7CSAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVsxXSAgPSAweDE4OwkgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzJdICA9IDB4MzA7CSAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbM10gID0gMHg2MDsJICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSA0OwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAyOwkgICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdICA9IDQ7CSAgIC8vIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0gID0gMTE7ICAgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSAgPSAyMjsgICAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0gID0gMTI7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0gID0gMTg7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gID0gMjQ7ICAgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICA9IDM2OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs4XSAgPSA0ODsgICAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbOV0gID0gNzI7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzEwXSA9IDk2OyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxMV0gPSAxMDg7ICAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCWJyZWFrOwotCi0JCWNhc2UgUEhZXzExQToKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6Ci0JCWNhc2UgUEhZXzExTl81RzoKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4QzsJICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4MTI7CSAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDk4OwkgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdICA9IDB4MjQ7CSAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNF0gID0gMHhiMDsJICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs1XSAgPSAweDQ4OwkgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzZdICA9IDB4NjA7CSAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbN10gID0gMHg2YzsJICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiAgPSA4OwotCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSAwOwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAxMjsgICAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSAgPSAxODsgICAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSAgPSAyNDsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gID0gMzY7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdICA9IDQ4OyAgICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSAgPSA3MjsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gID0gOTY7ICAgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICA9IDEwODsgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsgLy8gVGhpcyBNT0RFIGlzIG9ubHkgRllJLiBub3QgdXNlCi0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotCi0KLQlwQWQtPkNvbW1vbkNmZy5CYW5kU3RhdGUgPSBVTktOT1dOX0JBTkQ7Ci19Ci0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDYWxsZXIgZW5zdXJlcyB3ZSBoYXMgODAyLjExbiBzdXBwb3J0LgotCQlDYWxscyBhdCBzZXR0aW5nIEhUIGZyb20gQVAvU1RBU2V0aW5mb3JtYXRpb24KLQotCUFyZ3VtZW50czoKLQkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwaHltb2RlICAtCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBTZXRIVCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglPSURfU0VUX0hUX1BIWU1PREUgKnBIVFBoeU1vZGUpCi17Ci0JLy9VTE9ORwkqcG1jczsKLQlVSU5UMzIJVmFsdWUgPSAwOwotCVVDSEFSCUJCUFZhbHVlID0gMDsKLQlVQ0hBUglCQlAzVmFsdWUgPSAwOwotCVVDSEFSCVJ4U3RyZWFtID0gcEFkLT5Db21tb25DZmcuUnhTdHJlYW07Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBIVF9tb2RlKCVkKSwgRXh0T2Zmc2V0KCVkKSwgTUNTKCVkKSwgQlcoJWQpLCBTVEJDKCVkKSwgU0hPUlRHSSglZClcbiIsCi0JCQkJCQkJCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQsCi0JCQkJCQkJCQkJcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywKLQkJCQkJCQkJCQlwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5TSE9SVEdJKSk7Ci0KLQkvLyBEb24ndCB6ZXJvIHN1cHBvcnRlZEh5UGh5IHN0cnVjdHVyZS4KLQlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KSk7Ci0JUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbykpOwotCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5OZXdFeHRDaGFuT2Zmc2V0LCBzaXplb2YocEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCkpOwotCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHksIHNpemVvZihwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkpKTsKLQotCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnKQotCXsKLQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gMTsKLQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gMTsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gMDsKLQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gMDsKLQl9Ci0KLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvciA9IDM7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvciA9IDM7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBSeEJBV2luTGltaXQgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCkpOwotCi0JLy8gTWltbyBwb3dlciBzYXZlLCBBLU1TRFUgc2l6ZSwKLQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZTsKLQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdVNpemU7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKLQotCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOwotCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7Ci0JcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBBTXNkdVNpemUgPSAlZCwgTWltb1BzID0gJWQsIE1wZHVEZW5zaXR5ID0gJWQsIE1heFJBbXBkdUZhY3RvciA9ICVkXG4iLAotCQkJCQkJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUsCi0JCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcywKLQkJCQkJCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHksCi0JCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvcikpOwotCi0JaWYocEhUUGh5TW9kZS0+SHRNb2RlID09IEhUTU9ERV9HRikKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YgPSAxOwotCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YgPSAxOwotCX0KLQllbHNlCi0JCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRiA9IDA7Ci0KLQkvLyBEZWNpZGUgUnggTUNTU2V0Ci0Jc3dpdGNoIChSeFN0cmVhbSkKLQl7Ci0JCWNhc2UgMToKLQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAgMHhmZjsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAgMHgwMDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgMjoKLQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAgMHhmZjsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAgMHhmZjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgMzogLy8gMyozCi0JCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gIDB4ZmY7Ci0JCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gIDB4ZmY7Ci0JCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gIDB4ZmY7Ci0JCQlicmVhazsKLQl9Ci0KLQlpZiAocEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50ICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSAmJiAocEhUUGh5TW9kZS0+QlcgPT0gQldfNDApICkKLQl7Ci0JCXBIVFBoeU1vZGUtPkJXID0gQldfMjA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uRm9ydHlfTWh6X0ludG9sZXJhbnQgPSAxOwotCX0KLQotCWlmKHBIVFBoeU1vZGUtPkJXID09IEJXXzQwKQotCXsKLQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFs0XSA9IDB4MTsgLy8gTUNTIDMyCi0JCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gMTsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCi0JCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNDS21vZGVpbjQwID0gMTsKLQotCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gMTsKLQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID0gMTsKLQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID0gKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQkVMT1cpPyAoRVhUQ0hBX0JFTE9XKTogRVhUQ0hBX0FCT1ZFOwotCQkvLyBTZXQgUmVnc2l0ZXIgZm9yIGV4dGVuc2lvbiBjaGFubmVsIHBvc2l0aW9uLgotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOwotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlAzVmFsdWUpOwotCQlpZiAoKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQkVMT1cpKQotCQl7Ci0JCQlWYWx1ZSB8PSAweDE7Ci0JCQlCQlAzVmFsdWUgfD0gKDB4MjApOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKLQkJfQotCQllbHNlIGlmICgocEhUUGh5TW9kZS0+RXh0T2Zmc2V0ID09IEVYVENIQV9BQk9WRSkpCi0JCXsKLQkJCVZhbHVlICY9IDB4ZmU7Ci0JCQlCQlAzVmFsdWUgJj0gKH4weDIwKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7Ci0JCX0KLQotCQkvLyBUdXJuIG9uIEJCUCA0ME1IeiBtb2RlIG5vdyBvbmx5IGFzIEFQIC4KLQkJLy8gU3RhIGNhbiB0dXJuIG9uIEJCUCA0ME1IeiBhZnRlciBjb25uZWN0aW9uIHdpdGggNDBNSHogQVAuIFN0YSBvbmx5IGJyb2FkY2FzdCA0ME1IeiBjYXBhYmlsaXR5IGJlZm9yZSBjb25uZWN0aW9uLgotCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgfHwgSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpCi0JCQkpCi0JCXsKLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKLQkJCUJCUFZhbHVlICY9ICh+MHgxOCk7Ci0JCQlCQlBWYWx1ZSB8PSAweDEwOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOwotCi0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlAzVmFsdWUpOwotCQkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gMDsKLQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID0gMDsKLQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID0gRVhUQ0hBX05PTkU7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQkJLy8gVHVybiBvbiBCQlAgMjBNSHogbW9kZSBieSByZXF1ZXN0IGhlcmUuCi0JCXsKLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKLQkJCUJCUFZhbHVlICY9ICh+MHgxOCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7Ci0JCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKLQkJfQotCX0KLQotCWlmKHBIVFBoeU1vZGUtPlNUQkMgPT0gU1RCQ19VU0UpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQyA9IDE7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMgPSAxOwotCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyA9IDE7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5SeFNUQkMgPSAxOwotCX0KLQllbHNlCi0JewotCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDID0gMDsKLQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlJ4U1RCQyA9IDA7Ci0JfQotCi0JaWYocEhUUGh5TW9kZS0+U0hPUlRHSSA9PSBHSV80MDApCi0JewotCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IDE7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gMTsKLQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCA9IDE7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSAxOwotCX0KLQllbHNlCi0JewotCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IDA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gMDsKLQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCA9IDA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSAwOwotCX0KLQotCS8vIFdlIHN1cHBvcnQgbGluayBhZGFwdGF0aW9uIGZvciB1bnNvbGljaXQgTUNTIGZlZWRiYWNrLCBzZXQgdG8gMi4KLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID0gTUNTRkJLX05PTkU7IC8vTUNTRkJLX1VOU09MSUNJVDsKLQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQ29udHJvbENoYW4gPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCS8vIDEsIHRoZSBleHRlbnNpb24gY2hhbm5lbCBhYm92ZSB0aGUgY29udHJvbCBjaGFubmVsLgotCi0JLy8gRURDQSBwYXJhbWV0ZXJzIHVzZWQgZm9yIEFQJ3Mgb3duIHRyYW5zbWlzc2lvbgotCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9PSBGQUxTRSkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID0gVFJVRTsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblswXSA9IDM7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMV0gPSA3OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzJdID0gMTsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblszXSA9IDE7Ci0KLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblswXSA9IDQ7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMV0gPSA0OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzJdID0gMzsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblszXSA9IDI7Ci0KLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFswXSA9IDY7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMV0gPSAxMDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsyXSA9IDQ7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbM10gPSAzOwotCi0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFswXSAgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMV0gID0gMDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdICA9IDk0OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbM10gID0gNDc7Ci0JfQotCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQlSVE1QU2V0SW5kaXZpZHVhbEhUKHBBZCwgMCk7Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNhbGxlciBlbnN1cmVzIHdlIGhhcyA4MDIuMTFuIHN1cHBvcnQuCi0JCUNhbGxzIGF0IHNldHRpbmcgSFQgZnJvbSBBUC9TVEFTZXRpbmZvcm1hdGlvbgotCi0JQXJndW1lbnRzOgotCQlwQWQgLSBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBoeW1vZGUgIC0KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFNldEluZGl2aWR1YWxIVCgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JVUNIQVIJCQkJYXBpZHgpCi17Ci0JUFJUX0hUX1BIWV9JTkZPCQlwRGVzaXJlZF9odF9waHkgPSBOVUxMOwotCVVDSEFSCVR4U3RyZWFtID0gcEFkLT5Db21tb25DZmcuVHhTdHJlYW07Ci0JVUNIQVIJRGVzaXJlZE1jcwk9IE1DU19BVVRPOwotCi0JZG8KLQl7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJcERlc2lyZWRfaHRfcGh5ID0gJnBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm87Ci0JCQlEZXNpcmVkTWNzID0gcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1M7Ci0JCQkvL3BBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gKERlc2lyZWRNY3MgPT0gTUNTX0FVVE8pID8gVFJVRSA6IEZBTFNFOwotCQkJCWJyZWFrOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JfSB3aGlsZSAoRkFMU0UpOwotCi0JaWYgKHBEZXNpcmVkX2h0X3BoeSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUFNldEluZGl2aWR1YWxIVDogaW52YWxpZCBhcGlkeCglZClcbiIsIGFwaWR4KSk7Ci0JCXJldHVybjsKLQl9Ci0JUlRNUFplcm9NZW1vcnkocERlc2lyZWRfaHRfcGh5LCBzaXplb2YoUlRfSFRfUEhZX0lORk8pKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQgOiBEZXNpcmVkIE1DUyA9ICVkXG4iLCBEZXNpcmVkTWNzKSk7Ci0JLy8gQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIE1DUwotCWlmICgoVHhTdHJlYW0gPT0gMSkgJiYgKChEZXNpcmVkTWNzID49IE1DU184KSAmJiAoRGVzaXJlZE1jcyA8PSBNQ1NfMTUpKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldEluZGl2aWR1YWxIVDogTUNTKCVkKSBpcyBpbnZhbGlkIGluIDFTLCByZXNldCBpdCBhcyBNQ1NfN1xuIiwgRGVzaXJlZE1jcykpOwotCQlEZXNpcmVkTWNzID0gTUNTXzc7Ci0JfQotCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID09IEJXXzIwKSAmJiAoRGVzaXJlZE1jcyA9PSBNQ1NfMzIpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJSVE1QU2V0SW5kaXZpZHVhbEhUOiBNQ1NfMzIgaXMgb25seSBzdXBwb3J0ZWQgaW4gNDAtTUh6LCByZXNldCBpdCBhcyBNQ1NfMFxuIikpOwotCQlEZXNpcmVkTWNzID0gTUNTXzA7Ci0JfQotCi0JcERlc2lyZWRfaHRfcGh5LT5iSHRFbmFibGUgPSBUUlVFOwotCi0JLy8gRGVjaWRlIGRlc2lyZWQgVHggTUNTCi0Jc3dpdGNoIChUeFN0cmVhbSkKLQl7Ci0JCWNhc2UgMToKLQkJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKQotCQkJewotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdPSAweGZmOwotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdPSAweDAwOwotCQkJfQotCQkJZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfNykKLQkJCXsKLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMTw8RGVzaXJlZE1jczsKLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHgwMDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgMjoKLQkJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKQotCQkJewotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdPSAweGZmOwotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdPSAweGZmOwotCQkJfQotCQkJZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfMTUpCi0JCQl7Ci0JCQkJVUxPTkcgbW9kZTsKLQotCQkJCW1vZGUgPSBEZXNpcmVkTWNzIC8gODsKLQkJCQlpZiAobW9kZSA8IDIpCi0JCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0W21vZGVdID0gKDEgPDwgKERlc2lyZWRNY3MgLSBtb2RlICogOCkpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSAzOiAvLyAzKjMKLQkJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKQotCQkJewotCQkJCS8qIE1DUzAgfiBNQ1MyMywgMyBieXRlcyAqLwotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdPSAweGZmOwotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdPSAweGZmOwotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzJdPSAweGZmOwotCQkJfQotCQkJZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfMjMpCi0JCQl7Ci0JCQkJVUxPTkcgbW9kZTsKLQotCQkJCW1vZGUgPSBEZXNpcmVkTWNzIC8gODsKLQkJCQlpZiAobW9kZSA8IDMpCi0JCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0W21vZGVdID0gKDEgPDwgKERlc2lyZWRNY3MgLSBtb2RlICogOCkpOwotCQkJfQotCQkJYnJlYWs7Ci0JfQotCi0JaWYocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9PSBCV180MCkKLQl7Ci0JCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPIHx8IERlc2lyZWRNY3MgPT0gTUNTXzMyKQotCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbNF0gPSAweDE7Ci0JfQotCi0JLy8gdXBkYXRlIEhUIFJhdGUgc2V0dGluZwotICAgIGlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQotICAgICAgICBNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgQlNTMCk7Ci0gICAgZWxzZQotCSAgICBNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgYXBpZHgpOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJVXBkYXRlIEhUIElFIGZyb20gb3VyIGNhcGFiaWxpdHkuCi0KLQlBcmd1bWVudHM6Ci0JCVNlbmQgYWxsIEhUIElFIGluIGJlYWNvbi9wcm9iZSByc3AvYXNzb2MgcnNwL2FjdGlvbiBmcmFtZS4KLQotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QVXBkYXRlSFRJRSgKLQlJTglSVF9IVF9DQVBBQklMSVRZCSpwUnRIdCwKLQlJTgkJVUNIQVIJCQkJKnBNY3NTZXQsCi0JT1VUCQlIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAotCU9VVAkJQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvKQotewotCVJUTVBaZXJvTWVtb3J5KHBIdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7Ci0JUlRNUFplcm9NZW1vcnkocEFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7Ci0KLQkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IHBSdEh0LT5DaGFubmVsV2lkdGg7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHMgPSBwUnRIdC0+TWltb1BzOwotCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YgPSBwUnRIdC0+R0Y7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjAgPSBwUnRIdC0+U2hvcnRHSWZvcjIwOwotCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gcFJ0SHQtPlNob3J0R0lmb3I0MDsKLQkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQyA9IHBSdEh0LT5UeFNUQkM7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5SeFNUQkMgPSBwUnRIdC0+UnhTVEJDOwotCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQU1zZHVTaXplID0gcFJ0SHQtPkFtc2R1U2l6ZTsKLQkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvciA9IHBSdEh0LT5NYXhSQW1wZHVGYWN0b3I7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IHBSdEh0LT5NcGR1RGVuc2l0eTsKLQotCQlwQWRkSHRJbmZvLT5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9IHBSdEh0LT5FeHRDaGFuT2Zmc2V0IDsKLQkJcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGggPSBwUnRIdC0+UmVjb21XaWR0aDsKLQkJcEFkZEh0SW5mby0+QWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgPSBwUnRIdC0+T3BlcmFpb25Nb2RlOwotCQlwQWRkSHRJbmZvLT5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IHBSdEh0LT5Ob25HZlByZXNlbnQ7Ci0JCVJUTVBNb3ZlTWVtb3J5KHBBZGRIdEluZm8tPk1DU1NldCwgLypwUnRIdC0+TUNTU2V0Ki9wTWNzU2V0LCA0KTsgLy8gcnQyODYwIG9ubHkgc3VwcG9ydCBNQ1MgbWF4PTMyLCBubyBuZWVkIHRvIGNvcHkgYWxsIDE2IHVjaGFyLgotCi0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFVwZGF0ZUhUSUUgPD09IFxuIikpOwotfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlBZGQgQ2xpZW50IHNlY3VyaXR5IGluZm9ybWF0aW9uIGludG8gQVNJQyBXQ0lEIHRhYmxlIGFuZCBJVkVJViB0YWJsZS4KLSAgICBSZXR1cm46Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJQnNzSWR4LAotCUlOCVVDSEFSCQkJS2V5SWR4LAotCUlOCVVDSEFSCQkJQ2lwaGVyQWxnLAotCUlOCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KQotewotCVVJTlQzMgkJV0NJREF0dHJpID0gMDsKLQlVU0hPUlQJCW9mZnNldDsKLQlVQ0hBUgkJSVZFSVYgPSAwOwotCVVTSE9SVAkJV2NpZCA9IDA7Ci0KLQl7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCWlmIChCc3NJZHggPiBCU1MwKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnk6IFRoZSBCU1MtaW5kZXgoJWQpIGlzIG91dCBvZiByYW5nZSBmb3IgSW5mcmEgbGluay4gXG4iLCBCc3NJZHgpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIDEuCUluIEFESE9DIG1vZGUsIHRoZSBBSUQgaXMgd2NpZCBudW1iZXIuIEFuZCBOTyBtZXNoIGxpbmsgZXhpc3RzLgotCQkJLy8gMi4JSW4gSW5mcmEgbW9kZSwgdGhlIEFJRDoxIE1VU1QgYmUgd2NpZCBvZiBpbmZyYSBTVEEuCi0JCQkvLwkJCQkJICAgdGhlIEFJRDoyfiBhc3NpZ24gdG8gbWVzaCBsaW5rIGVudHJ5LgotCQkJaWYgKHBFbnRyeSkKLQkJCQlXY2lkID0gcEVudHJ5LT5BaWQ7Ci0JCQllbHNlCi0JCQkJV2NpZCA9IE1DQVNUX1dDSUQ7Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl9Ci0KLQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUKLQlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChXY2lkICogSFdfV0NJRF9BVFRSSV9TSVpFKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlpZiAocEVudHJ5ICYmIHBFbnRyeS0+VmFsaWRBc01lc2gpCi0JCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKSB8IFBBSVJXSVNFS0VZVEFCTEU7Ci0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCWVsc2UgaWYgKChwRW50cnkpICYmIChwRW50cnktPlZhbGlkQXNEbHMpICYmCi0JCQkJCSgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKSB8fAotCQkJCQkoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwKLQkJCQkJKENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSB8fAotCQkJCQkoQ2lwaGVyQWxnID09IENJUEhFUl9OT05FKSkpCi0JCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKSB8IFBBSVJXSVNFS0VZVEFCTEU7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JCWVsc2UKLQkJV0NJREF0dHJpID0gKENpcGhlckFsZzw8MSkgfCBTSEFSRURLRVlUQUJMRTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Ci0KLQotCS8vIFVwZGF0ZSBJVi9FSVYgdGFibGUKLQlvZmZzZXQgPSBNQUNfSVZFSVZfVEFCTEVfQkFTRSArIChXY2lkICogSFdfSVZFSVZfRU5UUllfU0laRSk7Ci0KLQkvLyBXUEEgbW9kZQotCWlmICgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKSB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSkKLQl7Ci0JCS8vIEVpdiBiaXQgb24uIGtleWlkIGFsd2F5cyBpcyAwIGZvciBwYWlyd2lzZSBrZXkKLQkJSVZFSVYgPSAoS2V5SWR4IDw8NikgfCAweDIwOwotCX0KLQllbHNlCi0JewotCQkvLyBXRVAgS2V5SWR4IGlzIGRlZmF1bHQgdHgga2V5LgotCQlJVkVJViA9IChLZXlJZHggPDwgNik7Ci0JfQotCi0JLy8gRm9yIGtleSBpbmRleCBhbmQgZXh0IElWIGJpdCwgc28gb25seSBuZWVkIHRvIHVwZGF0ZSB0aGUgcG9zaXRpb24ob2Zmc2V0KzMpLgotI2lmZGVmIFJUTVBfTUFDX1BDSQotCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0KzMsIElWRUlWKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeTogV0NJRCAjJWQsIEtleUluZGV4ICMlZCwgQWxnPSVzXG4iLFdjaWQsIEtleUlkeCwgQ2lwaGVyTmFtZVtDaXBoZXJBbGddKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIJV0NJREF0dHJpID0gMHgleCBcbiIsICBXQ0lEQXR0cmkpKTsKLQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFBhcnNlIGVuY3J5cHRpb24gdHlwZQotQXJndW1lbnRzOgotICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50Ci0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5vbmUKLQotICAgIE5vdGU6Ci0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1QU1RSSU5HIEdldEVuY3J5cHRUeXBlKENIQVIgZW5jKQotewotICAgIGlmKGVuYyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0gICAgICAgIHJldHVybiAiTk9ORSI7Ci0gICAgaWYoZW5jID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQotCXJldHVybiAiV0VQIjsKLSAgICBpZihlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQlyZXR1cm4gIlRLSVAiOwotICAgIGlmKGVuYyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXJldHVybiAiQUVTIjsKLQlpZihlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZCkKLQlyZXR1cm4gIlRLSVBBRVMiOwotICAgIGVsc2UKLQlyZXR1cm4gIlVOS05PVyI7Ci19Ci0KLVBTVFJJTkcgR2V0QXV0aE1vZGUoQ0hBUiBhdXRoKQotewotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLQlyZXR1cm4gIk9QRU4iOwotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQotCXJldHVybiAiU0hBUkVEIjsKLQlpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpCi0JcmV0dXJuICJBVVRPV0VQIjsKLSAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLQlyZXR1cm4gIldQQSI7Ci0gICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCi0JcmV0dXJuICJXUEFQU0siOwotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQlyZXR1cm4gIldQQU5PTkUiOwotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKLQlyZXR1cm4gIldQQTIiOwotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKLQlyZXR1cm4gIldQQTJQU0siOwotCWlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTIpCi0JcmV0dXJuICJXUEExV1BBMiI7Ci0JaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykKLQlyZXR1cm4gIldQQTFQU0tXUEEyUFNLIjsKLQotCXJldHVybiAiVU5LTk9XIjsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIEdldCBzaXRlIHN1cnZleSByZXN1bHRzCi0JQXJndW1lbnRzOgotCSAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCSAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgTm9uZQotCi0gICAgTm90ZToKLSAgICAgICAgVXNhZ2U6Ci0JCQkxLikgVUkgbmVlZHMgdG8gd2FpdCA0IHNlY29uZHMgYWZ0ZXIgaXNzdWUgYSBzaXRlIHN1cnZleSBjb21tYW5kCi0JCQkyLikgaXdwcml2IHJhMCBnZXRfc2l0ZV9zdXJ2ZXkKLQkJCTMuKSBVSSBuZWVkcyB0byBwcmVwYXJlIGF0IGxlYXN0IDQwOTZieXRlcyB0byBnZXQgdGhlIHJlc3VsdHMKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLSNkZWZpbmUJTElORV9MRU4JKDQrMzMrMjArMjMrOSs3KzMpCS8vIENoYW5uZWwrU1NJRCtCc3NpZCtTZWN1cml0eStTaWduYWwrV2lyZXNzTW9kZStOZXR3b3JrVHlwZQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotVk9JRAlSVE1QQ29tbVNpdGVTdXJ2ZXlEYXRhKAotCUlOICBQU1RSSU5HCQltc2csCi0JSU4gIFBCU1NfRU5UUlkJcEJzcykKLXsKLQlJTlQgICAgICAgICBSc3NpID0gMDsKLQlVSU5UICAgICAgICBSc3NpX1F1YWxpdHkgPSAwOwotCU5ESVNfODAyXzExX05FVFdPUktfVFlQRSAgICB3aXJlbGVzc19tb2RlOwotCUNIQVIJCVNzaWRbTUFYX0xFTl9PRl9TU0lEICsxXTsKLQlTVFJJTkcJCVNlY3VyaXR5U3RyWzMyXSA9IHswfTsKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlhcF9jaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOwotCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJYXBfYXV0aF9tb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQotCW1lbXNldChTc2lkLCAwICwoTUFYX0xFTl9PRl9TU0lEICsxKSk7Ci0KLQkJLy9DaGFubmVsCi0JCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRkIiwgcEJzcy0+Q2hhbm5lbCk7Ci0JCS8vU1NJRAotCQltZW1jcHkoU3NpZCwgcEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbik7Ci0JCVNzaWRbcEJzcy0+U3NpZExlbl0gPSAnXDAnOwotCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0zM3MiLCBTc2lkKTsKLQkJLy9CU1NJRAotCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggICAiLAotCQkJcEJzcy0+QnNzaWRbMF0sCi0JCQlwQnNzLT5Cc3NpZFsxXSwKLQkJCXBCc3MtPkJzc2lkWzJdLAotCQkJcEJzcy0+QnNzaWRbM10sCi0JCQlwQnNzLT5Cc3NpZFs0XSwKLQkJCXBCc3MtPkJzc2lkWzVdKTsKLQotCS8vU2VjdXJpdHkKLQlpZiAoKE5kaXM4MDJfMTFBdXRoTW9kZVdQQSA8PSBwQnNzLT5BdXRoTW9kZSkgJiYKLQkJKHBCc3MtPkF1dGhNb2RlIDw9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLKSkKLQl7Ci0JCWlmIChwQnNzLT5BdXRoTW9kZUF1eCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQl7Ci0JCQlhcF9hdXRoX21vZGUgPSBwQnNzLT5BdXRoTW9kZTsKLQkJCWlmIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JCQkJYXBfY2lwaGVyID0gcEJzcy0+V1BBLlBhaXJDaXBoZXI7Ci0JCQllbHNlCi0JCQkJYXBfY2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDsKLQkJfQotCQllbHNlIGlmIChwQnNzLT5BdXRoTW9kZUF1eCA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQotCQl7Ci0JCQlhcF9hdXRoX21vZGUgPSBwQnNzLT5BdXRoTW9kZTsKLQkJCWlmICgoYXBfYXV0aF9tb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKLQkJCQkoYXBfYXV0aF9tb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCi0JCQl7Ci0JCQkJaWYgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLQkJCQkJYXBfY2lwaGVyID0gcEJzcy0+V1BBLlBhaXJDaXBoZXI7Ci0JCQkJZWxzZQotCQkJCQlhcF9jaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOwotCQkJfQotCQkJZWxzZSBpZiAoKGFwX2F1dGhfbW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAotCQkJCQkgKGFwX2F1dGhfbW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJCXsKLQkJCQlpZiAocEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4ID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLQkJCQkJYXBfY2lwaGVyID0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyOwotCQkJCWVsc2UKLQkJCQkJYXBfY2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDsKLQkJCX0KLQkJfQotCQllbHNlIGlmICgocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAotCQkJCSAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0JCXsKLQkJCWlmICgocEJzcy0+QXV0aE1vZGVBdXggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAotCQkJCShwQnNzLT5BdXRoTW9kZUF1eCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJCQlhcF9hdXRoX21vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSzsKLQkJCWVsc2UKLQkJCQlhcF9hdXRoX21vZGUgPSBwQnNzLT5BdXRoTW9kZTsKLQotCQkJaWYgKHBCc3MtPldQQS5QYWlyQ2lwaGVyICE9IHBCc3MtPldQQTIuUGFpckNpcGhlcikKLQkJCQlhcF9jaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOwotCQkJZWxzZSBpZiAoKHBCc3MtPldQQS5QYWlyQ2lwaGVyID09IHBCc3MtPldQQTIuUGFpckNpcGhlcikgJiYKLQkJCQkJIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCAhPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQotCQkJCWFwX2NpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ7Ci0JCQllbHNlIGlmICgocEJzcy0+V1BBLlBhaXJDaXBoZXIgPT0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyKSAmJgotCQkJCQkgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IHBCc3MtPldQQTIuUGFpckNpcGhlckF1eCkgJiYKLQkJCQkJIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpKQotCQkJCWFwX2NpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ7Ci0JCQllbHNlIGlmICgocEJzcy0+V1BBLlBhaXJDaXBoZXIgPT0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyKSAmJgotCQkJCQkgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IHBCc3MtPldQQTIuUGFpckNpcGhlckF1eCkgJiYKLQkJCQkJIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpKQotCQkJCWFwX2NpcGhlciA9IHBCc3MtPldQQS5QYWlyQ2lwaGVyOwotCQl9Ci0JCWVsc2UgaWYgKChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8Ci0JCQkJIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSkKLQkJewotCQkJaWYgKChwQnNzLT5BdXRoTW9kZUF1eCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8Ci0JCQkJKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpKQotCQkJCWFwX2F1dGhfbW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyOwotCQkJZWxzZQotCQkJCWFwX2F1dGhfbW9kZSA9IHBCc3MtPkF1dGhNb2RlOwotCi0JCQlpZiAocEJzcy0+V1BBLlBhaXJDaXBoZXIgIT0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyKQotCQkJCWFwX2NpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ7Ci0JCQllbHNlIGlmICgocEJzcy0+V1BBLlBhaXJDaXBoZXIgPT0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyKSAmJgotCQkJCQkgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ICE9IHBCc3MtPldQQTIuUGFpckNpcGhlckF1eCkpCi0JCQkJYXBfY2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDsKLQkJCWVsc2UgaWYgKChwQnNzLT5XUEEuUGFpckNpcGhlciA9PSBwQnNzLT5XUEEyLlBhaXJDaXBoZXIpICYmCi0JCQkJCSAocEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPT0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4KSAmJgotCQkJCQkgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpCi0JCQkJYXBfY2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDsKLQkJCWVsc2UgaWYgKChwQnNzLT5XUEEuUGFpckNpcGhlciA9PSBwQnNzLT5XUEEyLlBhaXJDaXBoZXIpICYmCi0JCQkJCSAocEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPT0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4KSAmJgotCQkJCQkgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpCi0JCQkJYXBfY2lwaGVyID0gcEJzcy0+V1BBLlBhaXJDaXBoZXI7Ci0JCX0KLQotCQlzcHJpbnRmKFNlY3VyaXR5U3RyLCAiJXMvJXMiLCBHZXRBdXRoTW9kZSgoQ0hBUilhcF9hdXRoX21vZGUpLCBHZXRFbmNyeXB0VHlwZSgoQ0hBUilhcF9jaXBoZXIpKTsKLQl9Ci0JZWxzZQotCXsKLQkJYXBfYXV0aF9tb2RlID0gcEJzcy0+QXV0aE1vZGU7Ci0JCWFwX2NpcGhlciA9IHBCc3MtPldlcFN0YXR1czsKLQkJaWYgKGFwX2NpcGhlciA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JCQlzcHJpbnRmKFNlY3VyaXR5U3RyLCAiTk9ORSIpOwotCQllbHNlIGlmIChhcF9jaXBoZXIgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpCi0JCQlzcHJpbnRmKFNlY3VyaXR5U3RyLCAiV0VQIik7Ci0JCWVsc2UKLQkJCXNwcmludGYoU2VjdXJpdHlTdHIsICIlcy8lcyIsIEdldEF1dGhNb2RlKChDSEFSKWFwX2F1dGhfbW9kZSksIEdldEVuY3J5cHRUeXBlKChDSEFSKWFwX2NpcGhlcikpOwotCX0KLQotCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiJS0yM3MiLCBTZWN1cml0eVN0cik7Ci0KLQkJLy8gUnNzaQotCQlSc3NpID0gKElOVClwQnNzLT5Sc3NpOwotCQlpZiAoUnNzaSA+PSAtNTApCi0JCQlSc3NpX1F1YWxpdHkgPSAxMDA7Ci0JCWVsc2UgaWYgKFJzc2kgPj0gLTgwKSAgICAvLyBiZXR3ZWVuIC01MCB+IC04MGRibQotCQkJUnNzaV9RdWFsaXR5ID0gKFVJTlQpKDI0ICsgKChSc3NpICsgODApICogMjYpLzEwKTsKLQkJZWxzZSBpZiAoUnNzaSA+PSAtOTApICAgLy8gYmV0d2VlbiAtODAgfiAtOTBkYm0KLQkJCVJzc2lfUXVhbGl0eSA9IChVSU5UKSgoKFJzc2kgKyA5MCkgKiAyNikvMTApOwotCQllbHNlICAgIC8vIDwgLTg0IGRibQotCQkJUnNzaV9RdWFsaXR5ID0gMDsKLQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtOWQiLCBSc3NpX1F1YWxpdHkpOwotCQkvLyBXaXJlbGVzcyBNb2RlCi0JCXdpcmVsZXNzX21vZGUgPSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KHBCc3MpOwotCQlpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExRkggfHwKLQkJCXdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMURTKQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFiIik7Ci0JCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE01KQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFhIik7Ci0JCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE01X04pCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWEvbiIpOwotCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNMjQpCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWIvZyIpOwotCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNMjRfTikKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYi9nL24iKTsKLQkJZWxzZQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAidW5rbm93Iik7Ci0JCS8vTmV0d29yayBUeXBlCi0JCWlmIChwQnNzLT5Cc3NUeXBlID09IEJTU19BREhPQykKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTNzIiwgIiBBZCIpOwotCQllbHNlCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0zcyIsICIgSW4iKTsKLQotICAgICAgICBzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiXG4iKTsKLQotCXJldHVybjsKLX0KLQotVk9JRCBSVE1QSW9jdGxHZXRTaXRlU3VydmV5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEpCi17Ci0JUFNUUklORwkJbXNnOwotCUlOVAkJaT0wOwotCUlOVAkJCVdhaXRDbnQ7Ci0JSU5UCQlTdGF0dXM9MDsKLSAgICBJTlQgICAgICAgICBtYXhfbGVuID0gTElORV9MRU47Ci0JUEJTU19FTlRSWQlwQnNzOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlvc19hbGxvY19tZW0oTlVMTCwgKFBVQ0hBUiAqKSZtc2csIHNpemVvZihDSEFSKSooKE1BWF9MRU5fT0ZfQlNTX1RBQkxFKSptYXhfbGVuKSk7Ci0KLQlpZiAobXNnID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QSW9jdGxHZXRTaXRlU3VydmV5IC0gbXNnIG1lbW9yeSBhbGxvYyBmYWlsLlxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JbWVtc2V0KG1zZywgMCAsKE1BWF9MRU5fT0ZfQlNTX1RBQkxFKSptYXhfbGVuICk7Ci0Jc3ByaW50Zihtc2csIiVzIiwiXG4iKTsKLQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS00cyUtMzNzJS0yMHMlLTIzcyUtOXMlLTdzJS0zc1xuIiwKLQkgICAgIkNoIiwgIlNTSUQiLCAiQlNTSUQiLCAiU2VjdXJpdHkiLCAiU2lnYW5sKCUpIiwgIlctTW9kZSIsICIgTlQiKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlXYWl0Q250ID0gMDsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOwotCXdoaWxlICgoU2NhblJ1bm5pbmcocEFkYXB0ZXIpID09IFRSVUUpICYmIChXYWl0Q250KysgPCAyMDApKQotCQlPU19XQUlUKDUwMCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlmb3IoaT0wOyBpPHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yIDtpKyspCi0JewotCQlwQnNzID0gJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldOwotCi0JCWlmKCBwQnNzLT5DaGFubmVsPT0wKQotCQkJYnJlYWs7Ci0KLQkJaWYoKHN0cmxlbihtc2cpK21heF9sZW4gKSA+PSBJV19TQ0FOX01BWF9EQVRBKQotCQkJYnJlYWs7Ci0KLQotCQlSVE1QQ29tbVNpdGVTdXJ2ZXlEYXRhKG1zZywgcEJzcyk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOwotCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QSW9jdGxHZXRTaXRlU3VydmV5IC0gd3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOwotCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpbXNnKTsKLX0KLQotI2RlZmluZQlNQUNfTElORV9MRU4JKDE0KzQrNCsxMCsxMCsxMCs2KzYpCS8vIEFkZHIrYWlkK3BzbStkYXRhdGltZStyeGJ5dGUrdHhieXRlK2N1cnJlbnQgdHggcmF0ZStsYXN0IHR4IHJhdGUKLVZPSUQgUlRNUElvY3RsR2V0TWFjVGFibGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gc3RydWN0IGl3cmVxICp3cnEpCi17Ci0JSU5UIGk7Ci0JUlRfODAyXzExX01BQ19UQUJMRSBNYWNUYWI7Ci0JY2hhciAqbXNnOwotCi0JTWFjVGFiLk51bSA9IDA7Ci0JZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQl7Ci0JCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgJiYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uU3N0ID09IFNTVF9BU1NPQykpCi0JCXsKLQkJCUNPUFlfTUFDX0FERFIoTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkFkZHIsICZwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFkZHIpOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkFpZCA9IChVQ0hBUilwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFpZDsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5Qc20gPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlBzTW9kZTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5NaW1vUHMgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLk1tcHNNb2RlOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCQkvLyBGaWxsIGluIFJTU0kgcGVyIGVudHJ5Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTAgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTA7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTEgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTE7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTIgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTI7Ci0KLQkJCS8vIHRoZSBjb25uZWN0ZWQgdGltZSBwZXIgZW50cnkKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5Db25uZWN0ZWRUaW1lID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5TdGFDb25uZWN0VGltZTsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuTUNTID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuTUNTOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5CVyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLkJXOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5TaG9ydEdJID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuU1RCQyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLlNUQkM7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLnJzdiA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLnJzdjsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuTU9ERSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLk1PREU7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLndvcmQgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS53b3JkOwotCi0JCQlNYWNUYWIuTnVtICs9IDE7Ci0JCX0KLQl9Ci0Jd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9NQUNfVEFCTEUpOwotCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk1hY1RhYiwgd3JxLT51LmRhdGEubGVuZ3RoKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBjb3B5X3RvX3VzZXIoKSBmYWlsXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQl9Ci0KLQltc2cgPSBrbWFsbG9jKHNpemVvZihDSEFSKSooTUFYX0xFTl9PRl9NQUNfVEFCTEUqTUFDX0xJTkVfTEVOKSwgTUVNX0FMTE9DX0ZMQUcpOwotCWlmIChtc2cgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzKCk6QWxsb2MgbWVtb3J5IGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybjsKLQl9Ci0JbWVtc2V0KG1zZywgMCAsTUFYX0xFTl9PRl9NQUNfVEFCTEUqTUFDX0xJTkVfTEVOICk7Ci0Jc3ByaW50Zihtc2csIiVzIiwiXG4iKTsKLQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xNHMlLTRzJS00cyUtMTBzJS0xMHMlLTEwcyUtNnMlLTZzXG4iLAotCQkiTUFDIiwgIkFJRCIsICJQU00iLCAiTERUIiwgIlJ4QiIsICJUeEIiLCJDVHhSIiwgIkxUeFIiKTsKLQotCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCi0JewotCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOwotCQlpZiAocEVudHJ5LT5WYWxpZEFzQ0xJICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQotCQl7Ci0JCQlpZigoc3RybGVuKG1zZykrTUFDX0xJTkVfTEVOICkgPj0gKE1BWF9MRU5fT0ZfTUFDX1RBQkxFKk1BQ19MSU5FX0xFTikgKQotCQkJCWJyZWFrOwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAgIiwKLQkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAotCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0pOwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNGQiLCAoaW50KXBFbnRyeS0+QWlkKTsKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRkIiwgKGludClwRW50cnktPlBzTW9kZSk7Ci0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMGQiLDAvKnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFNDb3VudGVyLkxhc3REYXRhUGFja2V0VGltZSovKTsgLy8gVG9EbwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBkIiwwLypwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5Ub3RhbFJ4Qnl0ZUNvdW50Ki8pOyAvLyBUb0RvCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMGQiLDAvKnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFNDb3VudGVyLlRvdGFsVHhCeXRlQ291bnQqLyk7IC8vIFRvRG8KLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTZkIixSYXRlSWRUb01icHNbcEFkLT5NYWNUYWIuQ29udGVudFtpXS5DdXJyVHhSYXRlXSk7Ci0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS02ZFxuIiwwLypSYXRlSWRUb01icHNbcEFkLT5NYWNUYWIuQ29udGVudFtpXS5MYXN0VHhSYXRlXSovKTsgLy8gVG9EbwotCQl9Ci0JfQotCS8vIGZvciBjb21wYXRpYmxlIHdpdGggb2xkIEFQSSBqdXN0IGRvIHRoZSBwcmludGsgdG8gY29uc29sZQotCS8vd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7Ci0JLy9pZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIiwgbXNnKSk7Ci0JfQotCi0Ja2ZyZWUobXNnKTsKLX0KLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1JTlQJU2V0X0JBU2V0dXBfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotICAgIFVDSEFSIG1hY1s2XSwgdGlkOwotCVBTVFJJTkcgdG9rZW47Ci0JU1RSSU5HIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7Ci0JSU5UIGk7Ci0gICAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7Ci0KLS8qCi0JVGhlIEJBU2V0dXAgaW51cHQgc3RyaW5nIGZvcm1hdCBzaG91bGQgYmUgeHg6eHg6eHg6eHg6eHg6eHgtZCwKLQkJPT5UaGUgc2l4IDIgZGlnaXQgaGV4LWRlY2ltYWwgbnVtYmVyIHByZXZpb3VzIGFyZSB0aGUgTWFjIGFkZHJlc3MsCi0JCT0+VGhlIHNldmVudGggZGVjaW1hbCBudW1iZXIgaXMgdGhlIHRpZCB2YWx1ZS4KLSovCi0JLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlxuJXNcbiIsIGFyZykpOwotCi0JaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgdGlkIHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgotCQlyZXR1cm4gRkFMU0U7Ci0KLQl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOwotCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCi0JewotCQl0aWQgPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7Ci0JCWlmICh0aWQgPiAxNSkKLQkJCXJldHVybiBGQUxTRTsKLQotCQkqdG9rZW4gPSAnXDAnOwotCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKLQkJewotCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQlBdG9IKHRva2VuLCAoJm1hY1tpXSksIDEpOwotCQl9Ci0JCWlmKGkgIT0gNikKLQkJCXJldHVybiBGQUxTRTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lMDJ4XG4iLAotCQkJCQkJCQltYWNbMF0sIG1hY1sxXSwgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCB0aWQpKTsKLQotCSAgICBwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIChQVUNIQVIpIG1hYyk7Ci0KLQlpZiAocEVudHJ5KSB7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJcblNldHVwIEJBIFNlc3Npb246IFRpZCA9ICVkXG4iLCB0aWQpKTsKLQkgICAgICAgIEJBT3JpU2Vzc2lvblNldFVwKHBBZCwgcEVudHJ5LCB0aWQsIDAsIDEwMCwgVFJVRSk7Ci0JfQotCi0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKLQotfQotCi1JTlQJU2V0X0JBRGVjbGluZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUxPTkcgYkJBRGVjbGluZTsKLQotCWJCQURlY2xpbmUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKGJCQURlY2xpbmUgPT0gMCkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBGQUxTRTsKLQl9Ci0JZWxzZSBpZiAoYkJBRGVjbGluZSA9PSAxKQotCXsKLQkJcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IFRSVUU7Ci0JfQotCWVsc2UKLQl7Ci0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0JBRGVjbGluZV9Qcm9jOjooQkFEZWNsaW5lPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfQkFPcmlUZWFyRG93bl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0gICAgVUNIQVIgbWFjWzZdLCB0aWQ7Ci0JUFNUUklORyB0b2tlbjsKLQlTVFJJTkcgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKLQlJTlQgaTsKLSAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQotICAgIC8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJcbiVzXG4iLCBhcmcpKTsKLS8qCi0JVGhlIEJBT3JpVGVhckRvd24gaW51cHQgc3RyaW5nIGZvcm1hdCBzaG91bGQgYmUgeHg6eHg6eHg6eHg6eHg6eHgtZCwKLQkJPT5UaGUgc2l4IDIgZGlnaXQgaGV4LWRlY2ltYWwgbnVtYmVyIHByZXZpb3VzIGFyZSB0aGUgTWFjIGFkZHJlc3MsCi0JCT0+VGhlIHNldmVudGggZGVjaW1hbCBudW1iZXIgaXMgdGhlIHRpZCB2YWx1ZS4KLSovCi0gICAgaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgdGlkIHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgotCQlyZXR1cm4gRkFMU0U7Ci0KLQl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOwotCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCi0JewotCQl0aWQgPSBzaW1wbGVfc3RydG9sKCh0b2tlbisxKSwgMCwgMTApOwotCQlpZiAodGlkID4gTlVNX09GX1RJRCkKLQkJCXJldHVybiBGQUxTRTsKLQotCQkqdG9rZW4gPSAnXDAnOwotCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKLQkJewotCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQlBdG9IKHRva2VuLCAoJm1hY1tpXSksIDEpOwotCQl9Ci0JCWlmKGkgIT0gNikKLQkJCXJldHVybiBGQUxTRTsKLQotCSAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lMDJ4IiwKLQkJCQkJCQkJbWFjWzBdLCBtYWNbMV0sIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgdGlkKSk7Ci0KLQkgICAgcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCAoUFVDSEFSKSBtYWMpOwotCi0JICAgIGlmIChwRW50cnkpIHsKLQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJcblRlYXIgZG93biBPcmkgQkEgU2Vzc2lvbjogVGlkID0gJWRcbiIsIHRpZCkpOwotCSAgICAgICAgQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBwRW50cnktPkFpZCwgdGlkLCBGQUxTRSwgVFJVRSk7Ci0JICAgIH0KLQotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlyZXR1cm4gRkFMU0U7Ci0KLX0KLQotSU5UCVNldF9CQVJlY1RlYXJEb3duX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLSAgICBVQ0hBUiBtYWNbNl0sIHRpZDsKLQlQU1RSSU5HIHRva2VuOwotCVNUUklORyBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOwotCUlOVCBpOwotICAgIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCi0gICAgLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlxuJXNcbiIsIGFyZykpOwotLyoKLQlUaGUgQkFSZWNUZWFyRG93biBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAotCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKLQkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgdGlkIHZhbHVlLgotKi8KLSAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aWQgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCi0JCXJldHVybiBGQUxTRTsKLQotCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7Ci0JaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKLQl7Ci0JCXRpZCA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7Ci0JCWlmICh0aWQgPiBOVU1fT0ZfVElEKQotCQkJcmV0dXJuIEZBTFNFOwotCi0JCSp0b2tlbiA9ICdcMCc7Ci0JCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQotCQl7Ci0JCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQotCQkJCXJldHVybiBGQUxTRTsKLQkJCUF0b0godG9rZW4sICgmbWFjW2ldKSwgMSk7Ci0JCX0KLQkJaWYoaSAhPSA2KQotCQkJcmV0dXJuIEZBTFNFOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSUwMngiLAotCQkJCQkJCQltYWNbMF0sIG1hY1sxXSwgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCB0aWQpKTsKLQotCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIChQVUNIQVIpIG1hYyk7Ci0KLQkJaWYgKHBFbnRyeSkgewotCQkgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlxuVGVhciBkb3duIFJlYyBCQSBTZXNzaW9uOiBUaWQgPSAlZFxuIiwgdGlkKSk7Ci0JCSAgICBCQVJlY1Nlc3Npb25UZWFyRG93bihwQWQsIHBFbnRyeS0+QWlkLCB0aWQsIEZBTFNFKTsKLQkJfQotCi0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKLQotfQotCi1JTlQJU2V0X0h0QndfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVMT05HIEh0Qnc7Ci0KLQlIdEJ3ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoSHRCdyA9PSBCV180MCkKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzQwOwotCWVsc2UgaWYgKEh0QncgPT0gQldfMjApCi0JCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEJ3X1Byb2M6OihIdEJ3PSVkKVxuIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldF9IdE1jc19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUxPTkcgSHRNY3MsIE1jc190bXA7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0gICAgQk9PTEVBTiBiQXV0b1JhdGUgPSBGQUxTRTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCU1jc190bXAgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKE1jc190bXAgPD0gMTUgfHwgTWNzX3RtcCA9PSAzMikKLQkJSHRNY3MgPSBNY3NfdG1wOwotCWVsc2UKLQkJSHRNY3MgPSBNQ1NfQVVUTzsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IEh0TWNzOwotCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IChIdE1jcyA9PSBNQ1NfQVVUTykgPyBUUlVFOkZBTFNFOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNY3NfUHJvYzo6KEh0TWNzPSVkLCBiQXV0b1R4UmF0ZVN3aXRjaCA9ICVkKVxuIiwKLQkJCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTLCBwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCkpOwotCi0JCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8IFBIWV8xMUFCR05fTUlYRUQpIHx8Ci0JCQkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8IE1PREVfSFRNSVgpKQotCQl7Ci0JICAgICAgICBpZiAoKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKSAmJgotCQkJCShIdE1jcyA+PSAwICYmIEh0TWNzIDw9IDMpICYmCi0JICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUgPT0gRklYRURfVFhNT0RFX0NDSykpCi0JCQl7Ci0JCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIChMT05HKSAoUmF0ZUlkVG9NYnBzW0h0TWNzXSAqIDEwMDAwMDApKTsKLQkJCX0KLQkgICAgICAgIGVsc2UgaWYgKChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykgJiYKLQkJCQkJKEh0TWNzID49IDAgJiYgSHRNY3MgPD0gNykgJiYKLQkJCShwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlID09IEZJWEVEX1RYTU9ERV9PRkRNKSkKLQkJCXsKLQkJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgKExPTkcpIChSYXRlSWRUb01icHNbSHRNY3MrNF0gKiAxMDAwMDAwKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJYkF1dG9SYXRlID0gVFJVRTsKLQotCQkJaWYgKGJBdXRvUmF0ZSkKLQkJCXsKLQkgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOwotCQkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAtMSk7Ci0JCQl9Ci0JICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNY3NfUHJvYzo6KEZpeGVkVHhNb2RlPSVkKVxuIixwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlKSk7Ci0JCX0KLSAgICAgICAgaWYgKEFESE9DX09OKHBBZCkpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRHaV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUxPTkcgSHRHaTsKLQotCUh0R2kgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKCBIdEdpID09IEdJXzQwMCkKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV80MDA7Ci0JZWxzZSBpZiAoIEh0R2kgPT0gR0lfODAwICkKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEdpX1Byb2M6OihTaG9ydEdJPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UCVNldF9IdFR4QkFTaXplX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVQ0hBUiBTaXplOwotCi0JU2l6ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoU2l6ZSA8PTAgfHwgU2l6ZSA+PTY0KQotCXsKLQkJU2l6ZSA9IDg7Ci0JfQotCXBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplID0gU2l6ZS0xOwotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9IdFR4QkFTaXplIDo6KFR4QkFTaXplPSAlZClcbiIsIFNpemUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0RGlzYWxsb3dUS0lQX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChWYWx1ZSA9PSAxKQotCXsKLQkJcEFkLT5Db21tb25DZmcuSFRfRGlzYWxsb3dUS0lQID0gVFJVRTsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5Db21tb25DZmcuSFRfRGlzYWxsb3dUS0lQID0gRkFMU0U7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0RGlzYWxsb3dUS0lQX1Byb2MgOjolc1xuIiwKLQkJCQkocEFkLT5Db21tb25DZmcuSFRfRGlzYWxsb3dUS0lQID09IFRSVUUpID8gImVuYWJsZWQiIDogImRpc2FibGVkIikpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRPcE1vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCi0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoVmFsdWUgPT0gSFRNT0RFX0dGKQotCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFICA9IEhUTU9ERV9HRjsKLQllbHNlIGlmICggVmFsdWUgPT0gSFRNT0RFX01NICkKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfTU07Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE9wTW9kZV9Qcm9jOjooSHRPcE1vZGU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUpKTsKLQotCXJldHVybiBUUlVFOwotCi19Ci0KLUlOVAlTZXRfSHRTdGJjX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKFZhbHVlID09IFNUQkNfVVNFKQotCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQyA9IFNUQkNfVVNFOwotCWVsc2UgaWYgKCBWYWx1ZSA9PSBTVEJDX05PTkUgKQotCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1N0YmNfUHJvYzo6KEh0U3RiYz0lZClcbiIscEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0SHRjX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChWYWx1ZSA9PSAwKQotCQlwQWQtPkhUQ0VuYWJsZSA9IEZBTFNFOwotCWVsc2UgaWYgKCBWYWx1ZSA9PTEgKQotICAgICAgICBwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0SHRjX1Byb2M6OihIdEh0Yz0lZClcbiIscEFkLT5IVENFbmFibGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0RXh0Y2hhX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKFZhbHVlID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgID0gRVhUQ0hBX0JFTE9XOwotCWVsc2UgaWYgKCBWYWx1ZSA9PTEgKQotICAgICAgICBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0FCT1ZFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRFeHRjaGFfUHJvYzo6KEh0RXh0Y2hhPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldF9IdE1wZHVEZW5zaXR5X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChWYWx1ZSA8PTcgJiYgVmFsdWUgPj0gMCkKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gVmFsdWU7Ci0JZWxzZQotCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSA0OwotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1wZHVEZW5zaXR5X1Byb2M6OihIdE1wZHVEZW5zaXR5PSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0QmFXaW5TaXplX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCi0JaWYgKFZhbHVlID49MSAmJiBWYWx1ZSA8PSA2NCkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBWYWx1ZTsKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOwotCX0KLQllbHNlCi0JewotICAgICAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKLQl9Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QmFXaW5TaXplX1Byb2M6OihIdEJhV2luU2l6ZT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRSZGdfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKFZhbHVlID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBGQUxTRTsKLQllbHNlIGlmICggVmFsdWUgPT0xICkKLQl7Ci0JCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKLSAgICAgICAgcEFkLT5Db21tb25DZmcuYlJkZyA9IFRSVUU7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRSZGdfUHJvYzo6KEh0UmRnPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5iUmRnKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldF9IdExpbmtBZGFwdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0JaWYgKFZhbHVlID09IDApCi0JCXBBZC0+YkxpbmtBZGFwdCA9IEZBTFNFOwotCWVsc2UgaWYgKCBWYWx1ZSA9PTEgKQotCXsKLQkJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKLQkJCXBBZC0+YkxpbmtBZGFwdCA9IFRSVUU7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdExpbmtBZGFwdF9Qcm9jOjooSHRMaW5rQWRhcHQ9JWQpXG4iLHBBZC0+YkxpbmtBZGFwdCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRBbXNkdV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0JaWYgKFZhbHVlID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IEZBTFNFOwotCWVsc2UgaWYgKCBWYWx1ZSA9PSAxICkKLSAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID0gVFJVRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QW1zZHVfUHJvYzo6KEh0QW1zZHU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRBdXRvQmFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChWYWx1ZSA9PSAwKQotCXsKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOwotCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gQkFfTk9UVVNFOwotCX0KLSAgICBlbHNlIGlmIChWYWx1ZSA9PSAxKQotICAgIHsKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBJTU1FRF9CQTsKLSAgICB9Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0gICAgcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkE7Ci0JcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3k7Ci0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEF1dG9CYV9Qcm9jOjooSHRBdXRvQmE9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEpKTsKLQotCXJldHVybiBUUlVFOwotCi19Ci0KLUlOVAlTZXRfSHRQcm90ZWN0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IEZBTFNFOwotICAgIGVsc2UgaWYgKFZhbHVlID09IDEpCi0JCXBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBUUlVFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdFByb3RlY3RfUHJvYzo6KEh0UHJvdGVjdD0lZClcbiIscEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfU2VuZFBTTVBBY3Rpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotICAgIFVDSEFSIG1hY1s2XSwgbW9kZTsKLQlQU1RSSU5HIHRva2VuOwotCVNUUklORyBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOwotCUlOVCBpOwotICAgIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCi0gICAgLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlxuJXNcbiIsIGFyZykpOwotLyoKLQlUaGUgQkFSZWNUZWFyRG93biBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAotCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKLQkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgbW9kZSB2YWx1ZS4KLSovCi0gICAgaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgbW9kZSB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KLQkJcmV0dXJuIEZBTFNFOwotCi0JdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKLQlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQotCXsKLQkJbW9kZSA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7Ci0JCWlmIChtb2RlID4gTU1QU19FTkFCTEUpCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkJKnRva2VuID0gJ1wwJzsKLQkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCi0JCXsKLQkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCi0JCQkJcmV0dXJuIEZBTFNFOwotCQkJQXRvSCh0b2tlbiwgKCZtYWNbaV0pLCAxKTsKLQkJfQotCQlpZihpICE9IDYpCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJTAyeCIsCi0JCQkJCQkJCW1hY1swXSwgbWFjWzFdLCBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0sIG1vZGUpKTsKLQotCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7Ci0KLQkJaWYgKHBFbnRyeSkgewotCQkgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlxuU2VuZFBTTVBBY3Rpb24gTUlQUyBtb2RlID0gJWRcbiIsIG1vZGUpKTsKLQkJICAgIFNlbmRQU01QQWN0aW9uKHBBZCwgcEVudHJ5LT5BaWQsIG1vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIFRSVUU7Ci0JfQotCi0JcmV0dXJuIEZBTFNFOwotCi0KLX0KLQotSU5UCVNldF9IdE1JTU9QU21vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKFZhbHVlIDw9MyAmJiBWYWx1ZSA+PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBWYWx1ZTsKLQllbHNlCi0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IDM7Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TUlNT1BTbW9kZV9Qcm9jOjooTUlNT1BTIG1vZGU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UCVNldF9Gb3JjZVNob3J0R0lfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChWYWx1ZSA9PSAwKQotCQlwQWQtPldJRkl0ZXN0YmVkLmJTaG9ydEdJID0gRkFMU0U7Ci0JZWxzZSBpZiAoVmFsdWUgPT0gMSkKLQkJcEFkLT5XSUZJdGVzdGJlZC5iU2hvcnRHSSA9IFRSVUU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Gb3JjZVNob3J0R0lfUHJvYzo6KEZvcmNlU2hvcnRHST0lZClcbiIsIHBBZC0+V0lGSXRlc3RiZWQuYlNob3J0R0kpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLQotSU5UCVNldF9Gb3JjZUdGX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5XSUZJdGVzdGJlZC5iR3JlZW5GaWVsZCA9IEZBTFNFOwotCWVsc2UgaWYgKFZhbHVlID09IDEpCi0JCXBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQgPSBUUlVFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRm9yY2VHRl9Qcm9jOjooRm9yY2VHRj0lZClcbiIsIHBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0TWltb1BzX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IEZBTFNFOwotCWVsc2UgaWYgKFZhbHVlID09IDEpCi0JCXBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBUUlVFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1pbW9Qc19Qcm9jOjooSHRNaW1vUHM9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLUlOVAlTZXRDb21tb25IVCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlPSURfU0VUX0hUX1BIWU1PREUJCVNldEhUOwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPCBQSFlfMTFBQkdOX01JWEVEKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlTZXRIVC5QaHlNb2RlID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKLQlTZXRIVC5UcmFuc21pdE5vID0gKChVQ0hBUilwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoKTsKLQlTZXRIVC5IdE1vZGUgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERTsKLQlTZXRIVC5FeHRPZmZzZXQgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQTsKLQlTZXRIVC5NQ1MgPSBNQ1NfQVVUTzsKLQlTZXRIVC5CVyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlc7Ci0JU2V0SFQuU1RCQyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQzsKLQlTZXRIVC5TSE9SVEdJID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJOwotCi0JUlRNUFNldEhUKHBBZCwgJlNldEhUKTsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1JTlQJU2V0X0ZpeGVkVHhNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVQ0hBUglmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKLQotCWlmIChzdHJjbXAoYXJnLCAiT0ZETSIpID09IDAgfHwgc3RyY21wKGFyZywgIm9mZG0iKSA9PSAwKQotCXsKLQkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfT0ZETTsKLQl9Ci0JZWxzZSBpZiAoc3RyY21wKGFyZywgIkNDSyIpID09IDAgfHwgc3RyY21wKGFyZywgImNjayIpID09IDApCi0JewotICAgICAgICBmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9DQ0s7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9IGZpeF90eF9tb2RlOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0ZpeGVkVHhNb2RlX1Byb2M6OihGaXhlZFR4TW9kZT0lZClcbiIsIGZpeF90eF9tb2RlKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCi1JTlQJU2V0X09wTW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ2FuIG5vdCBzd2l0Y2ggb3BlcmF0ZSBtb2RlIG9uIGludGVyZmFjZSB1cCAhISBcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCWlmIChWYWx1ZSA9PSAwKQotCQlwQWQtPk9wTW9kZSA9IE9QTU9ERV9TVEE7Ci0JZWxzZSBpZiAoVmFsdWUgPT0gMSkKLQkJcEFkLT5PcE1vZGUgPSBPUE1PREVfQVA7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X09wTW9kZV9Qcm9jOjooT3BNb2RlPSVzKVxuIiwgcEFkLT5PcE1vZGUgPT0gMSA/ICJBUCBNb2RlIiA6ICJTVEEgTW9kZSIpKTsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCi0KLQotCi1JTlQgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVRYX1JUWV9DRkdfU1RSVUMJdHhfcnR5X2NmZzsKLQlVQ0hBUgkJCQlMb25nUmV0cnlMaW1pdCA9IChVQ0hBUilzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOwotCXR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0ID0gTG9uZ1JldHJ5TGltaXQ7Ci0JUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jOjoodHhfcnR5X2NmZz0weCV4KVxuIiwgdHhfcnR5X2NmZy53b3JkKSk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVCBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVRYX1JUWV9DRkdfU1RSVUMJdHhfcnR5X2NmZzsKLQlVQ0hBUgkJCQlTaG9ydFJldHJ5TGltaXQgPSAoVUNIQVIpc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKLQl0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQgPSBTaG9ydFJldHJ5TGltaXQ7Ci0JUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYzo6KHR4X3J0eV9jZmc9MHgleClcbiIsIHR4X3J0eV9jZmcud29yZCkpOwotCXJldHVybiBUUlVFOwotfQotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVBTVFJJTkcgUlRNUEdldFJhbGlua0F1dGhNb2RlU3RyKAotICAgIElOICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIGF1dGhNb2RlKQotewotCXN3aXRjaChhdXRoTW9kZSkKLQl7Ci0JCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlT3BlbjoKLQkJCXJldHVybiAiT1BFTiI7Ci0JCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOgotCQkJcmV0dXJuICJXUEFQU0siOwotCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDoKLQkJCXJldHVybiAiU0hBUkVEIjsKLQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEE6Ci0JCQlyZXR1cm4gIldQQSI7Ci0JCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMjoKLQkJCXJldHVybiAiV1BBMiI7Ci0JCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzoKLQkJCXJldHVybiAiV1BBMlBTSyI7Ci0gICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0s6Ci0JCQlyZXR1cm4gIldQQVBTS1dQQTJQU0siOwotICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyOgotCQkJcmV0dXJuICJXUEExV1BBMiI7Ci0JCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZToKLQkJCXJldHVybiAiV1BBTk9ORSI7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gIlVOS05PVyI7Ci0JfQotfQotCi1QU1RSSU5HIFJUTVBHZXRSYWxpbmtFbmNyeU1vZGVTdHIoCi0gICAgSU4gIFVTSE9SVCBlbmNyeU1vZGUpCi17Ci0Jc3dpdGNoKGVuY3J5TW9kZSkKLQl7Ci0JCWNhc2UgTmRpczgwMl8xMVdFUERpc2FibGVkOgotCQkJcmV0dXJuICJOT05FIjsKLQkJY2FzZSBOZGlzODAyXzExV0VQRW5hYmxlZDoKLQkJCXJldHVybiAiV0VQIjsKLQkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgotCQkJcmV0dXJuICJUS0lQIjsKLQkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgotCQkJcmV0dXJuICJBRVMiOwotICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ6Ci0JCQlyZXR1cm4gIlRLSVBBRVMiOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuICJVTktOT1ciOwotCX0KLX0KLQotSU5UIFJUTVBTaG93Q2ZnVmFsdWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCXBOYW1lLAotCUlOCVBTVFJJTkcJCQlwQnVmKQotewotCUlOVAlTdGF0dXMgPSAwOwotCi0JZm9yIChQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DID0gUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DOyBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5uYW1lOyBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DKyspCi0JewotCQlpZiAoIXN0cmNtcChwTmFtZSwgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZSkpCi0JCXsKLQkJCWlmKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPnNob3dfcHJvYyhwQWQsIHBCdWYpKQotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQlicmVhazsgIC8vRXhpdCBmb3IgbG9vcC4KLQkJfQotCX0KLQotCWlmKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWUgPT0gTlVMTCkKLQl7Ci0JCXNwcmludGYocEJ1ZiwgIlxuIik7Ci0JCWZvciAoUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQyA9IFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQzsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZTsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQysrKQotCQkJc3ByaW50ZihwQnVmLCAiJXMlc1xuIiwgcEJ1ZiwgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZSk7Ci0JfQotCi0JcmV0dXJuIFN0YXR1czsKLX0KLQotSU5UCVNob3dfU1NJRF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5Tc2lkKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfV2lyZWxlc3NNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKQotCXsKLQkJY2FzZSBQSFlfMTFCR19NSVhFRDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFCL0ciKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUI6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExQiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQToKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFBIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExQS9CL0ciKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUc6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExRyIpOwotCQkJYnJlYWs7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgUEhZXzExQUJHTl9NSVhFRDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFBL0IvRy9OIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFOXzJfNEc6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExTiBvbmx5IHdpdGggMi40RyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExR05fTUlYRUQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExRy9OIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFBL04iKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUJHTl9NSVhFRDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFCL0cvTiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQUdOX01JWEVEOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEvRy9OIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFOXzVHOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMU4gb25seSB3aXRoIDVHIik7Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJZGVmYXVsdDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLUlOVAlTaG93X1R4QnVyc3RfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID8gIlRSVUUiOiJGQUxTRSIpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19UeFByZWFtYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlKQotCXsKLQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlU2hvcnQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFNob3J0Iik7Ci0JCQlicmVhazsKLQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKLQkJCXNwcmludGYocEJ1ZiwgIlx0TG9uZyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUF1dG86Ci0JCQlzcHJpbnRmKHBCdWYsICJcdEF1dG8iKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWx1KSIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X1R4UG93ZXJfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlbHUiLCBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0NoYW5uZWxfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlZCIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19CR1Byb3RlY3Rpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0Jc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikKLQl7Ci0JCWNhc2UgMTogLy9BbHdheXMgT24KLQkJCXNwcmludGYocEJ1ZiwgIlx0T04iKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6IC8vQWx3YXlzIE9GRgotCQkJc3ByaW50ZihwQnVmLCAiXHRPRkYiKTsKLQkJCWJyZWFrOwotCQljYXNlIDA6IC8vQVVUTwotCQkJc3ByaW50ZihwQnVmLCAiXHRBdXRvIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVsdSkiLCBwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24pOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19SVFNUaHJlc2hvbGRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQldSIsIHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0ZyYWdUaHJlc2hvbGRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQldSIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotSU5UCVNob3dfSHRCd19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlpZiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKQotCXsKLQkJc3ByaW50ZihwQnVmLCAiXHQ0MCBNSHoiKTsKLQl9Ci0JZWxzZQotCXsKLSAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQyMCBNSHoiKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0h0TWNzX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJc3ByaW50ZihwQnVmLCAiXHQldSIsIHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfSHRHaV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kpCi0JewotCQljYXNlIEdJXzQwMDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0R0lfNDAwIik7Ci0JCQlicmVhazsKLQkJY2FzZSBHSV84MDA6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdEdJXzgwMCIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSgldSkiLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSk7Ci0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0h0T3BNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFKQotCXsKLQkJY2FzZSBIVE1PREVfR0Y6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdEdGIik7Ci0JCQlicmVhazsKLQkJY2FzZSBIVE1PREVfTU06Ci0JCQlzcHJpbnRmKHBCdWYsICJcdE1NIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCV1KSIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUpOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19IdEV4dGNoYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSkKLQl7Ci0JCWNhc2UgRVhUQ0hBX0JFTE9XOgotCQkJc3ByaW50ZihwQnVmLCAiXHRCZWxvdyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRVhUQ0hBX0FCT1ZFOgotCQkJc3ByaW50ZihwQnVmLCAiXHRBYm92ZSIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSgldSkiLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBKTsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi1JTlQJU2hvd19IdE1wZHVEZW5zaXR5X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19IdEJhV2luU2l6ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0h0UmRnX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iUmRnID8gIlRSVUUiOiJGQUxTRSIpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19IdEFtc2R1X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPyAiVFJVRSI6IkZBTFNFIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0h0QXV0b0JhX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID8gIlRSVUUiOiJGQUxTRSIpOwotCXJldHVybiAwOwotfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1JTlQJU2hvd19Db3VudHJ5UmVnaW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19Db3VudHJ5Q29kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOwotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAotSU5UCVNob3dfUGt0QWdncmVnYXRlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID8gIlRSVUUiOiJGQUxTRSIpOwotCXJldHVybiAwOwotfQotI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIFdNTV9TVVBQT1JUCi1JTlQJU2hvd19XbW1DYXBhYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID8gIlRSVUUiOiJGQUxTRSIpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KLQotSU5UCVNob3dfSUVFRTgwMjExSF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPyAiVFJVRSI6IkZBTFNFIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLUlOVAlTaG93X05ldHdvcmtUeXBlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXN3aXRjaChwQWQtPlN0YUNmZy5Cc3NUeXBlKQotCXsKLQkJY2FzZSBCU1NfQURIT0M6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdEFkaG9jIik7Ci0JCQlicmVhazsKLQkJY2FzZSBCU1NfSU5GUkE6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdEluZnJhIik7Ci0JCQlicmVhazsKLQkJY2FzZSBCU1NfQU5ZOgotCQkJc3ByaW50ZihwQnVmLCAiXHRBbnkiKTsKLQkJCWJyZWFrOwotCQljYXNlIEJTU19NT05JVE9SOgotCQkJc3ByaW50ZihwQnVmLCAiXHRNb25pdG9yIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIHBBZC0+U3RhQ2ZnLkJzc1R5cGUpOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotSU5UCVNob3dfQXV0aE1vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0JTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQlBdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlBdXRoTW9kZSA9IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JaWYgKChBdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKSAmJgotCQkoQXV0aE1vZGUgPD0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQotCQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgUlRNUEdldFJhbGlua0F1dGhNb2RlU3RyKEF1dGhNb2RlKSk7Ci0JZWxzZQotCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBBdXRoTW9kZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfRW5jcnlwVHlwZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlORElTXzgwMl8xMV9XRVBfU1RBVFVTCVdlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCVdlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCWlmICgoV2VwU3RhdHVzID49IE5kaXM4MDJfMTFXRVBFbmFibGVkKSAmJgotCQkoV2VwU3RhdHVzIDw9IE5kaXM4MDJfMTFFbmNyeXB0aW9uNEtleUFic2VudCkpCi0JCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBSVE1QR2V0UmFsaW5rRW5jcnlNb2RlU3RyKFdlcFN0YXR1cykpOwotCWVsc2UKLQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWQpIiwgV2VwU3RhdHVzKTsKLQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19EZWZhdWx0S2V5SURfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0JVUNIQVIgRGVmYXVsdEtleUlkID0gMDsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCURlZmF1bHRLZXlJZCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBEZWZhdWx0S2V5SWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X1dlcEtleV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICBJTlQJCQkJS2V5SWR4LAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlVQ0hBUiAgIEtleVsxNl0gPSB7MH0sIEtleUxlbmd0aCA9IDA7Ci0JSU5UCQlpbmRleCA9IEJTUzA7Ci0KLQlLZXlMZW5ndGggPSBwQWQtPlNoYXJlZEtleVtpbmRleF1bS2V5SWR4XS5LZXlMZW47Ci0JTmRpc01vdmVNZW1vcnkoS2V5LCBwQWQtPlNoYXJlZEtleVtpbmRleF1bS2V5SWR4XS5LZXksIEtleUxlbmd0aCk7Ci0KLQkvL2NoZWNrIGtleSBzdHJpbmcgaXMgQVNDSUkgb3Igbm90Ci0gICAgaWYgKFJUTVBDaGVja1N0clByaW50QWJsZSgoUENIQVIpS2V5LCBLZXlMZW5ndGgpKQotICAgICAgICBzcHJpbnRmKHBCdWYsICJcdCVzIiwgS2V5KTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBpbnQgaWR4OwotICAgICAgICBzcHJpbnRmKHBCdWYsICJcdCIpOwotICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IEtleUxlbmd0aDsgaWR4KyspCi0gICAgICAgICAgICBzcHJpbnRmKHBCdWYrc3RybGVuKHBCdWYpLCAiJTAyWCIsIEtleVtpZHhdKTsKLSAgICB9Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0tleTFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0JU2hvd19XZXBLZXlfUHJvYyhwQWQsIDAsIHBCdWYpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19LZXkyX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCVNob3dfV2VwS2V5X1Byb2MocEFkLCAxLCBwQnVmKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfS2V5M19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlTaG93X1dlcEtleV9Qcm9jKHBBZCwgMiwgcEJ1Zik7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0tleTRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0JU2hvd19XZXBLZXlfUHJvYyhwQWQsIDMsIHBCdWYpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19XUEFQU0tfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0JSU5UCWlkeDsKLQlVQ0hBUglQTUtbMzJdID0gezB9OwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlOZGlzTW92ZU1lbW9yeShQTUssIHBBZC0+U3RhQ2ZnLlBNSywgMzIpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0gICAgc3ByaW50ZihwQnVmLCAiXHRQTUsgPSAiKTsKLSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IDMyOyBpZHgrKykKLSAgICAgICAgc3ByaW50ZihwQnVmK3N0cmxlbihwQnVmKSwgIiUwMlgiLCBQTUtbaWR4XSk7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9tYWNfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fbWFjX3BjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTE2MzYzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9tYWNfcGNpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzU3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUFsbG9jYXRlIERNQSBtZW1vcnkgYmxvY2tzIGZvciBzZW5kLCByZWNlaXZlCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTkRJU19TVEFUVVNfU1VDQ0VTUwotCQlORElTX1NUQVRVU19GQUlMVVJFCi0JCU5ESVNfU1RBVFVTX1JFU09VUkNFUwotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUwlSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlVTE9ORwkJCVJpbmdCYXNlUGFIaWdoOwotCVVMT05HCQkJUmluZ0Jhc2VQYUxvdzsKLQlQVk9JRAkJCVJpbmdCYXNlVmE7Ci0JSU5UCQkJCWluZGV4LCBudW07Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLQlQUlhEX1NUUlVDCQlwUnhEOwotCVVMT05HCQkJRXJyb3JWYWx1ZSA9IDA7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nOwotCVBSVE1QX0RNQUJVRglwRG1hQnVmOwotCVBORElTX1BBQ0tFVAlwUGFja2V0OwotLy8JUFJUTVBfUkVPUkRFUkJVRglwUmVvcmRlckJ1ZjsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeVxuIikpOwotCWRvCi0JewotCQkvLwotCQkvLyBBbGxvY2F0ZSBhbGwgcmluZyBkZXNjcmlwdG9ycywgaW5jbHVkZSBUeEQsIFJ4RCwgTWdtdEQuCi0JCS8vIEFsdGhvdWdoIGVhY2ggc2l6ZSBpcyBkaWZmZXJlbnQsIHRvIHByZXZlbnQgY2FjaGVsaW5lIGFuZCBhbGlnbm1lbnQKLQkJLy8gaXNzdWUsIEkgaW50ZW50aW9uYWwgc2V0IHRoZW0gYWxsIHRvIDY0IGJ5dGVzLgotCQkvLwotCQlmb3IgKG51bT0wOyBudW08TlVNX09GX1RYX1JJTkc7IG51bSsrKQotCQl7Ci0JCQlVTE9ORyAgQnVmQmFzZVBhSGlnaDsKLQkJCVVMT05HICBCdWZCYXNlUGFMb3c7Ci0JCQlQVk9JRCAgQnVmQmFzZVZhOwotCi0JCQkvLwotCQkJLy8gQWxsb2NhdGUgVHggcmluZyBkZXNjcmlwdG9yJ3MgbWVtb3J5ICg1IFRYIHJpbmdzID0gNCBBQ3MgKyAxIEhDQ0EpCi0JCQkvLwotCQkJcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplID0gVFhfUklOR19TSVpFICogVFhEX1NJWkU7Ci0JCQlSVE1QX0FsbG9jYXRlVHhEZXNjTWVtb3J5KAotCQkJCXBBZCwKLQkJCQludW0sCi0JCQkJcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplLAotCQkJCUZBTFNFLAotCQkJCSZwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhLAotCQkJCSZwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKLQotCQkJaWYgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEgPT0gTlVMTCkKLQkJCXsKLQkJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOwotCQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKLQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIFplcm8gaW5pdCB0aGlzIG1lbW9yeSBibG9jawotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYSwgcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplKTsKLQotCQkJLy8gU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbgotCQkJUmluZ0Jhc2VQYUhpZ2ggPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NQYSk7Ci0JCQlSaW5nQmFzZVBhTG93ICA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKLQkJCVJpbmdCYXNlVmEgICAgID0gcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYTsKLQotCQkJLy8KLQkJCS8vIEFsbG9jYXRlIGFsbCAxc3QgVFhCdWYncyBtZW1vcnkgZm9yIHRoaXMgVHhSaW5nCi0JCQkvLwotCQkJcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NTaXplID0gVFhfUklOR19TSVpFICogVFhfRE1BXzFTVF9CVUZGRVJfU0laRTsKLQkJCVJUTVBfQWxsb2NhdGVGaXJzdFR4QnVmZmVyKAotCQkJCXBBZCwKLQkJCQludW0sCi0JCQkJcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NTaXplLAotCQkJCUZBTFNFLAotCQkJCSZwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhLAotCQkJCSZwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1BhKTsKLQotCQkJaWYgKHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEgPT0gTlVMTCkKLQkJCXsKLQkJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOwotCQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKLQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIFplcm8gaW5pdCB0aGlzIG1lbW9yeSBibG9jawotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSwgcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NTaXplKTsKLQotCQkJLy8gU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbgotCQkJQnVmQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1BhKTsKLQkJCUJ1ZkJhc2VQYUxvdyAgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NQYSk7Ci0JCQlCdWZCYXNlVmEgICAgID0gcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYTsKLQotCQkJLy8KLQkJCS8vIEluaXRpYWxpemUgVHggUmluZyBEZXNjcmlwdG9yIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlciBtZW1vcnkKLQkJCS8vCi0JCQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW251bV07Ci0JCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBUWF9SSU5HX1NJWkU7IGluZGV4KyspCi0JCQl7Ci0JCQkJcFR4UmluZy0+Q2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCQkJCXBUeFJpbmctPkNlbGxbaW5kZXhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0JCQkJLy8gSW5pdCBUeCBSaW5nIFNpemUsIFZhLCBQYSB2YXJpYWJsZXMKLQkJCQlwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1NpemUgPSBUWERfU0laRTsKLQkJCQlwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1ZhID0gUmluZ0Jhc2VWYTsKLQkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2gocFR4UmluZy0+Q2VsbFtpbmRleF0uQWxsb2NQYSwgUmluZ0Jhc2VQYUhpZ2gpOwotCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93IChwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhTG93KTsKLQotCQkJCS8vIFNldHVwIFR4IEJ1ZmZlciBzaXplICYgYWRkcmVzcy4gb25seSA4MDIuMTEgaGVhZGVyIHdpbGwgc3RvcmUgaW4gdGhpcyBzcGFjZQotCQkJCXBEbWFCdWYgPSAmcFR4UmluZy0+Q2VsbFtpbmRleF0uRG1hQnVmOwotCQkJCXBEbWFCdWYtPkFsbG9jU2l6ZSA9IFRYX0RNQV8xU1RfQlVGRkVSX1NJWkU7Ci0JCQkJcERtYUJ1Zi0+QWxsb2NWYSA9IEJ1ZkJhc2VWYTsKLQkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2gocERtYUJ1Zi0+QWxsb2NQYSwgQnVmQmFzZVBhSGlnaCk7Ci0JCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3cocERtYUJ1Zi0+QWxsb2NQYSwgQnVmQmFzZVBhTG93KTsKLQotCQkJCS8vIGxpbmsgdGhlIHByZS1hbGxvY2F0ZWQgVHhCdWYgdG8gVFhECi0JCQkJcFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1ZhOwotCQkJCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKLQkJCQkvLyBhZHZhbmNlIHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MKLQkJCQlwVHhELT5ETUFET05FID0gMTsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0jZW5kaWYKLQkJCQlSaW5nQmFzZVBhTG93ICs9IFRYRF9TSVpFOwotCQkJCVJpbmdCYXNlVmEgPSAoUFVDSEFSKSBSaW5nQmFzZVZhICsgVFhEX1NJWkU7Ci0KLQkJCQkvLyBhZHZhbmNlIHRvIG5leHQgVHhCdWYgYWRkcmVzcwotCQkJCUJ1ZkJhc2VQYUxvdyArPSBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFOwotCQkJCUJ1ZkJhc2VWYSA9IChQVUNIQVIpIEJ1ZkJhc2VWYSArIFRYX0RNQV8xU1RfQlVGRkVSX1NJWkU7Ci0JCQl9Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeFJpbmdbJWRdOiB0b3RhbCAlZCBlbnRyeSBhbGxvY2F0ZWRcbiIsIG51bSwgaW5kZXgpKTsKLQkJfQotCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1JFU09VUkNFUykKLQkJCWJyZWFrOwotCi0JCS8vCi0JCS8vIEFsbG9jYXRlIE1HTVQgcmluZyBkZXNjcmlwdG9yJ3MgbWVtb3J5IGV4Y2VwdCBUeCByaW5nIHdoaWNoIGFsbG9jYXRlZCBlYXJpbGVyCi0JCS8vCi0JCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSA9IE1HTVRfUklOR19TSVpFICogVFhEX1NJWkU7Ci0JCVJUTVBfQWxsb2NhdGVNZ210RGVzY01lbW9yeSgKLQkJCXBBZCwKLQkJCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSwKLQkJCUZBTFNFLAotCQkJJnBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsCi0JCQkmcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NQYSk7Ci0KLQkJaWYgKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEgPT0gTlVMTCkKLQkJewotCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKLQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKLQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCi0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSk7Ci0KLQkJLy8gU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbgotCQlSaW5nQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKLQkJUmluZ0Jhc2VQYUxvdyAgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NQYSk7Ci0JCVJpbmdCYXNlVmEgICAgID0gcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYTsKLQotCQkvLwotCQkvLyBJbml0aWFsaXplIE1HTVQgUmluZyBhbmQgYXNzb2NpYXRlZCBidWZmZXIgbWVtb3J5Ci0JCS8vCi0JCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1HTVRfUklOR19TSVpFOyBpbmRleCsrKQotCQl7Ci0JCQlwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0ID0gTlVMTDsKLQkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQkJCS8vIEluaXQgTUdNVCBSaW5nIFNpemUsIFZhLCBQYSB2YXJpYWJsZXMKLQkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NTaXplID0gVFhEX1NJWkU7Ci0JCQlwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmEgPSBSaW5nQmFzZVZhOwotCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NQYSwgUmluZ0Jhc2VQYUhpZ2gpOwotCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NQYSwgUmluZ0Jhc2VQYUxvdyk7Ci0KLQkJCS8vIE9mZnNldCB0byBuZXh0IHJpbmcgZGVzY3JpcHRvciBhZGRyZXNzCi0JCQlSaW5nQmFzZVBhTG93ICs9IFRYRF9TSVpFOwotCQkJUmluZ0Jhc2VWYSA9IChQVUNIQVIpIFJpbmdCYXNlVmEgKyBUWERfU0laRTsKLQotCQkJLy8gbGluayB0aGUgcHJlLWFsbG9jYXRlZCBUeEJ1ZiB0byBUWEQKLQkJCXBUeEQgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1ZhOwotCQkJcFR4RC0+RE1BRE9ORSA9IDE7Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLSNlbmRpZgotCQkJLy8gbm8gcHJlLWFsbG9jYXRlZCBidWZmZXIgcmVxdWlyZWQgaW4gTWdtdFJpbmcgZm9yIHNjYXR0ZXItZ2F0aGVyIGNhc2UKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNR01UIFJpbmc6IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgaW5kZXgpKTsKLQotCQkvLwotCQkvLyBBbGxvY2F0ZSBSWCByaW5nIGRlc2NyaXB0b3IncyBtZW1vcnkgZXhjZXB0IFR4IHJpbmcgd2hpY2ggYWxsb2NhdGVkIGVhcmlsZXIKLQkJLy8KLQkJcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSA9IFJYX1JJTkdfU0laRSAqIFJYRF9TSVpFOwotCQlSVE1QX0FsbG9jYXRlUnhEZXNjTWVtb3J5KAotCQkJcEFkLAotCQkJcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSwKLQkJCUZBTFNFLAotCQkJJnBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhLAotCQkJJnBBZC0+UnhEZXNjUmluZy5BbGxvY1BhKTsKLQotCQlpZiAocEFkLT5SeERlc2NSaW5nLkFsbG9jVmEgPT0gTlVMTCkKLQkJewotCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKLQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKLQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCi0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplKTsKLQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX09GRiwKLQkJCQkJKCJSWCBERVNDICVwICBzaXplID0gJWxkXG4iLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSkpOwotCi0JCS8vIFNhdmUgUEEgJiBWQSBmb3IgZnVydGhlciBvcGVyYXRpb24KLQkJUmluZ0Jhc2VQYUhpZ2ggPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOwotCQlSaW5nQmFzZVBhTG93ICA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPlJ4RGVzY1JpbmcuQWxsb2NQYSk7Ci0JCVJpbmdCYXNlVmEgICAgID0gcEFkLT5SeERlc2NSaW5nLkFsbG9jVmE7Ci0KLQkJLy8KLQkJLy8gSW5pdGlhbGl6ZSBSeCBSaW5nIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlciBtZW1vcnkKLQkJLy8KLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgUlhfUklOR19TSVpFOyBpbmRleCsrKQotCQl7Ci0JCQkvLyBJbml0IFJYIFJpbmcgU2l6ZSwgVmEsIFBhIHZhcmlhYmxlcwotCQkJcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NTaXplID0gUlhEX1NJWkU7Ci0JCQlwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1ZhID0gUmluZ0Jhc2VWYTsKLQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhSGlnaCk7Ci0JCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NQYSwgUmluZ0Jhc2VQYUxvdyk7Ci0KLQkJCS8vTmRpc1plcm9NZW1vcnkoUmluZ0Jhc2VWYSwgUlhEX1NJWkUpOwotCi0JCQkvLyBPZmZzZXQgdG8gbmV4dCByaW5nIGRlc2NyaXB0b3IgYWRkcmVzcwotCQkJUmluZ0Jhc2VQYUxvdyArPSBSWERfU0laRTsKLQkJCVJpbmdCYXNlVmEgPSAoUFVDSEFSKSBSaW5nQmFzZVZhICsgUlhEX1NJWkU7Ci0KLQkJCS8vIFNldHVwIFJ4IGFzc29jaWF0ZWQgQnVmZmVyIHNpemUgJiBhbGxvY2F0ZSBzaGFyZSBtZW1vcnkKLQkJCXBEbWFCdWYgPSAmcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uRG1hQnVmOwotCQkJcERtYUJ1Zi0+QWxsb2NTaXplID0gUlhfQlVGRkVSX0FHR1JFU0laRTsKLQkJCXBQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIoCi0JCQkJcEFkLAotCQkJCXBEbWFCdWYtPkFsbG9jU2l6ZSwKLQkJCQlGQUxTRSwKLQkJCQkmcERtYUJ1Zi0+QWxsb2NWYSwKLQkJCQkmcERtYUJ1Zi0+QWxsb2NQYSk7Ci0KLQkJCS8qIGtlZXAgYWxsb2NhdGVkIHJ4IHBhY2tldCAqLwotCQkJcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OwotCi0JCQkvLyBFcnJvciBoYW5kbGluZwotCQkJaWYgKHBEbWFCdWYtPkFsbG9jVmEgPT0gTlVMTCkKLQkJCXsKLQkJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOwotCQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBSeFJpbmcncyAxc3QgYnVmZmVyXG4iKSk7Ci0JCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvLyBaZXJvIGluaXQgdGhpcyBtZW1vcnkgYmxvY2sKLQkJCU5kaXNaZXJvTWVtb3J5KHBEbWFCdWYtPkFsbG9jVmEsIHBEbWFCdWYtPkFsbG9jU2l6ZSk7Ci0KLQkJCS8vIFdyaXRlIFJ4RCBidWZmZXIgYWRkcmVzcyAmIGFsbG9jYXRlZCBidWZmZXIgbGVuZ3RoCi0JCQlwUnhEID0gKFBSWERfU1RSVUMpIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmE7Ci0JCQlwUnhELT5TRFAwID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocERtYUJ1Zi0+QWxsb2NQYSk7Ci0JCQlwUnhELT5ERE9ORSA9IDA7Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBSeEQsIFRZUEVfUlhEKTsKLSNlbmRpZgotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnggUmluZzogdG90YWwgJWQgZW50cnkgYWxsb2NhdGVkXG4iLCBpbmRleCkpOwotCi0JfQl3aGlsZSAoRkFMU0UpOwotCi0KLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5GcmFnRnJhbWUsIHNpemVvZihGUkFHTUVOVF9GUkFNRSkpOwotCXBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0ID0gIFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKHBBZCwgUlhfQlVGRkVSX05PUk1TSVpFKTsKLQotCWlmIChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9PSBOVUxMKQotCXsKLQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwotCX0KLQotCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCS8vIExvZyBlcnJvciBpbmZvcmFtdGlvbgotCQlOZGlzV3JpdGVFcnJvckxvZ0VudHJ5KAotCQkJcEFkLT5BZGFwdGVySGFuZGxlLAotCQkJTkRJU19FUlJPUl9DT0RFX09VVF9PRl9SRVNPVVJDRVMsCi0JCQkxLAotCQkJRXJyb3JWYWx1ZSk7Ci0JfQotCi0JLy8gRm9sbG93aW5nIGNvZGUgc2VnbWVudCBnZXQgZnJvbSBvcmlnaW5hbCBmdW5jOk5JQ0luaXRUeFJ4UmluZ0FuZEJhY2tsb2dRdWV1ZSgpLCBub3cgc2hvdWxkIGludGVncmF0ZSBpdCB0byBoZXJlLgotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0luaXRUeFJ4UmluZ0FuZEJhY2tsb2dRdWV1ZVxuIikpOwotCi0vKgotCQkvLyBEaXNhYmxlIERNQS4KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwotCQlHbG9DZmcud29yZCAmPSAweGZmMDsKLQkJR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9MTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOwotKi8KLQotCQkvLyBJbml0aWFsaXplIGFsbCB0cmFuc21pdCByZWxhdGVkIHNvZnR3YXJlIHF1ZXVlcwotCQlmb3IoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKQotCQl7Ci0JCQlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+VHhTd1F1ZXVlW2luZGV4XSk7Ci0JCQkvLyBJbml0IFRYIHJpbmdzIGluZGV4IHBvaW50ZXIKLQkJCXBBZC0+VHhSaW5nW2luZGV4XS5UeFN3RnJlZUlkeCA9IDA7Ci0JCQlwQWQtPlR4UmluZ1tpbmRleF0uVHhDcHVJZHggPSAwOwotCQkJLy9SVE1QX0lPX1dSSVRFMzIocEFkLCAoVFhfQ1RYX0lEWDAgKyBpICogMHgxMCkgLCAgcEFkLT5UeFJpbmdbaV0uVFhfQ1RYX0lEWCk7Ci0JCX0KLQotCQkvLyBJbml0IFJYIFJpbmcgaW5kZXggcG9pbnRlcgotCQlwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCA9IDA7Ci0JCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gUlhfUklOR19TSVpFIC0gMTsKLQkJLy9SVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9DUlhfSURYLCBwQWQtPlJ4UmluZy5SWF9DUlhfSURYMCk7Ci0KLQotCQkvLyBpbml0IE1HTVQgcmluZyBpbmRleCBwb2ludGVyCi0JCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPSAwOwotCQlwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4ID0gMDsKLQotCQlwQWQtPlByaXZhdGVJbmZvLlR4UmluZ0Z1bGxDbnQgPSAwOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0VHhSeFJpbmdBbmRCYWNrbG9nUXVldWVcbiIpKTsKLQl9Ci0KLQlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnksIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7Ci0JcmV0dXJuIFN0YXR1czsKLX0KLQotCi0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJlc2V0IE5JQyBBc2ljcy4gQ2FsbCBhZnRlciByZXN0IERNQS4gU28gcmVzZXQgVFhfQ1RYX0lEWCB0byB6ZXJvLgotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQkJUmVzZXQgTklDIHRvIGluaXRpYWwgc3RhdGUgQVMgSVMgc3lzdGVtIGJvb3QgdXAgdGltZS4KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFJpbmdDbGVhblVwKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJUmluZ1R5cGUpCi17Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLQlQUlhEX1NUUlVDCQlwUnhEOwotCVBRVUVVRV9FTlRSWQlwRW50cnk7Ci0JUE5ESVNfUEFDS0VUCXBQYWNrZXQ7Ci0JaW50CQkJCWk7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nOwotCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7Ci0JLy9VSU5UMzIJCQlSeFN3UmVhZElkeDsKLQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QUmluZ0NsZWFuVXAoUmluZ0lkeD0lZCwgUGVuZGluZy1ORElTPSVsZClcbiIsIFJpbmdUeXBlLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBlbmRpbmdOZGlzUGFja2V0Q291bnQpKTsKLQlzd2l0Y2ggKFJpbmdUeXBlKQotCXsKLQkJY2FzZSBRSURfQUNfQks6Ci0JCWNhc2UgUUlEX0FDX0JFOgotCQljYXNlIFFJRF9BQ19WSToKLQkJY2FzZSBRSURfQUNfVk86Ci0JCS8qY2FzZSBRSURfSENDQToqLwotCi0JCQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1JpbmdUeXBlXTsKLQotCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCQkJLy8gV2UgaGF2ZSB0byBjbGVhbiBhbGwgZGVzY3JpcHRvcnMgaW4gY2FzZSBzb21lIGVycm9yIGhhcHBlbmVkIHdpdGggcmVzZXQKLQkJCWZvciAoaT0wOyBpPFRYX1JJTkdfU0laRTsgaSsrKSAvLyBXZSBoYXZlIHRvIHNjYW4gYWxsIFRYIHJpbmcKLQkJCXsKLQkJCQlwVHhEICA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW2ldLkFsbG9jVmE7Ci0KLQkJCQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgcFR4UmluZy0+Q2VsbFtpXS5wTmRpc1BhY2tldDsKLQkJCQkvLyByZWxlYXNlIHNjYXR0ZXItYW5kLWdhdGhlciBORElTX1BBQ0tFVAotCQkJCWlmIChwUGFja2V0KQotCQkJCXsKLQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKLQkJCQl9Ci0KLQkJCQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQ7Ci0JCQkJLy8gcmVsZWFzZSBzY2F0dGVyLWFuZC1nYXRoZXIgTkRJU19QQUNLRVQKLQkJCQlpZiAocFBhY2tldCkKLQkJCQl7Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCQkJcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCQkJCX0KLQkJCX0KLQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFJpbmdUeXBlICogMHgxMCwgJnBUeFJpbmctPlR4RG1hSWR4KTsKLQkJCXBUeFJpbmctPlR4U3dGcmVlSWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7Ci0JCQlwVHhSaW5nLT5UeENwdUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBSaW5nVHlwZSAqIDB4MTAsIHBUeFJpbmctPlR4Q3B1SWR4KTsKLQotCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0KLQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQkJCXdoaWxlIChwQWQtPlR4U3dRdWV1ZVtSaW5nVHlwZV0uSGVhZCAhPSBOVUxMKQotCQkJewotCQkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcEFkLT5UeFN3UXVldWVbUmluZ1R5cGVdKTsKLQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7Ci0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmVsZWFzZSAxIE5ESVMgcGFja2V0IGZyb20gcy93IGJhY2tsb2cgcXVldWVcbiIpKTsKLQkJCX0KLQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBRSURfTUdNVDoKLQkJCS8vIFdlIGhhdmUgdG8gY2xlYW4gYWxsIGRlc2NyaXB0b3JzIGluIGNhc2Ugc29tZSBlcnJvciBoYXBwZW5lZCB3aXRoIHJlc2V0Ci0JCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7Ci0KLQkJCWZvciAoaT0wOyBpPE1HTVRfUklOR19TSVpFOyBpKyspCi0JCQl7Ci0JCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7Ci0KLQkJCQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0OwotCQkJCS8vIHJsZWFzZSBzY2F0dGVyLWFuZC1nYXRoZXIgTkRJU19QQUNLRVQKLQkJCQlpZiAocFBhY2tldCkKLQkJCQl7Ci0JCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCQl9Ci0JCQkJcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKLQotCQkJCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5leHROZGlzUGFja2V0OwotCQkJCS8vIHJlbGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIE5ESVNfUEFDS0VUCi0JCQkJaWYgKHBQYWNrZXQpCi0JCQkJewotCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQl9Ci0JCQkJcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJCX0KLQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9NR01URFRYX0lEWCwgJnBBZC0+TWdtdFJpbmcuVHhEbWFJZHgpOwotCQkJcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA9IHBBZC0+TWdtdFJpbmcuVHhEbWFJZHg7Ci0JCQlwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4ID0gcEFkLT5NZ210UmluZy5UeERtYUlkeDsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01HTVRDVFhfSURYLCBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KTsKLQotCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOwotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCA9IDA7Ci0JCQlicmVhazsKLQotCQljYXNlIFFJRF9SWDoKLQkJCS8vIFdlIGhhdmUgdG8gY2xlYW4gYWxsIGRlc2NyaXB0b3JzIGluIGNhc2Ugc29tZSBlcnJvciBoYXBwZW5lZCB3aXRoIHJlc2V0Ci0JCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPlJ4UmluZ0xvY2spOwotCi0JCQlmb3IgKGk9MDsgaTxSWF9SSU5HX1NJWkU7IGkrKykKLQkJCXsKLQkJCQlwUnhEICA9IChQUlhEX1NUUlVDKSBwQWQtPlJ4UmluZy5DZWxsW2ldLkFsbG9jVmE7Ci0gICAgICAgICAgICAgICAgcFJ4RC0+RERPTkUgPSAwIDsKLQkJCX0KLQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9EUlhfSURYLCAmcEFkLT5SeFJpbmcuUnhEbWFJZHgpOwotCQkJcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPSBwQWQtPlJ4UmluZy5SeERtYUlkeDsKLQkJCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gKChwQWQtPlJ4UmluZy5SeERtYUlkeCA9PSAwKSA/IChSWF9SSU5HX1NJWkUtMSkgOiAocEFkLT5SeFJpbmcuUnhEbWFJZHgtMSkpOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfQ1JYX0lEWCwgcEFkLT5SeFJpbmcuUnhDcHVJZHgpOwotCi0JCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPlJ4UmluZ0xvY2spOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KLX0KLQotCi1WT0lEIFJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCi17Ci0JaW50IGluZGV4LCBudW0gLCBqOwotCVBSVE1QX1RYX1JJTkcgcFR4UmluZzsKLQlQVFhEX1NUUlVDCSAgcFR4RDsKLQlQTkRJU19QQUNLRVQgIHBQYWNrZXQ7Ci0JdW5zaWduZWQgaW50ICBJcnFGbGFnczsKLQotCS8vUE9TX0NPT0tJRSBwT2JqID0oUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gUlRNUEZyZWVUeFJ4UmluZ01lbW9yeVxuIikpOwotCi0JLy8gRnJlZSBUeFN3UXVldWUgUGFja2V0Ci0JZm9yIChpbmRleD0wOyBpbmRleCA8TlVNX09GX1RYX1JJTkc7IGluZGV4KyspCi0JewotCQlQUVVFVUVfRU5UUlkgcEVudHJ5OwotCQlQTkRJU19QQUNLRVQgcFBhY2tldDsKLQkJUFFVRVVFX0hFQURFUiAgIHBRdWV1ZTsKLQotCQlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0JCXBRdWV1ZSA9ICZwQWQtPlR4U3dRdWV1ZVtpbmRleF07Ci0JCXdoaWxlIChwUXVldWUtPkhlYWQpCi0JCXsKLQkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZShwUXVldWUpOwotCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpOwotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQl9Ci0JCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCX0KLQotCS8vIEZyZWUgVHggUmluZyBQYWNrZXQKLQlmb3IgKGluZGV4PTA7aW5kZXg8IE5VTV9PRl9UWF9SSU5HO2luZGV4KyspCi0JewotCQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW2luZGV4XTsKLQotCQlmb3IgKGo9MDsgajwgVFhfUklOR19TSVpFOyBqKyspCi0JCXsKLQkJCXBUeEQgPSAoUFRYRF9TVFJVQykgKHBUeFJpbmctPkNlbGxbal0uQWxsb2NWYSk7Ci0JCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtqXS5wTmRpc1BhY2tldDsKLQotCQkJaWYgKHBQYWNrZXQpCi0JCQl7Ci0JCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMCwgcFR4RC0+U0RMZW4wLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQl9Ci0JCQkvL0Fsd2F5cyBhc3NpZ24gcE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJcFR4UmluZy0+Q2VsbFtqXS5wTmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW2pdLnBOZXh0TmRpc1BhY2tldDsKLQotCQkJaWYgKHBQYWNrZXQpCi0JCQl7Ci0JCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQl9Ci0JCQkvL0Fsd2F5cyBhc3NpZ24gcE5leHROZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKLQkJCXBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJfQotCX0KLQotCWZvciAoaW5kZXggPSBSWF9SSU5HX1NJWkUgLSAxIDsgaW5kZXggPj0gMDsgaW5kZXgtLSkKLQl7Ci0JCWlmICgocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uRG1hQnVmLkFsbG9jVmEpICYmIChwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCkpCi0JCXsKLQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5EbWFCdWYuQWxsb2NQYSwgcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uRG1hQnVmLkFsbG9jU2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCX0KLQl9Ci0JTmRpc1plcm9NZW1vcnkocEFkLT5SeFJpbmcuQ2VsbCwgUlhfUklOR19TSVpFICogc2l6ZW9mKFJUTVBfRE1BQ0IpKTsKLQotCWlmIChwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSkKLSAgICB7Ci0JCVJUTVBfRnJlZURlc2NNZW1vcnkocEFkLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOwotICAgIH0KLSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5SeERlc2NSaW5nLCBzaXplb2YoUlRNUF9ETUFCVUYpKTsKLQotCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKQotCXsKLQkJUlRNUF9GcmVlRGVzY01lbW9yeShwQWQsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NQYSk7Ci0JfQotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1nbXREZXNjUmluZywgc2l6ZW9mKFJUTVBfRE1BQlVGKSk7Ci0KLQlmb3IgKG51bSA9IDA7IG51bSA8IE5VTV9PRl9UWF9SSU5HOyBudW0rKykKLQl7Ci0JaWYgKHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEpCi0JCXsKLQkJCVJUTVBfRnJlZUZpcnN0VHhCdWZmZXIocEFkLCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUsIEZBTFNFLCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1BhKTsKLQkgICAgfQotCSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5UeEJ1ZlNwYWNlW251bV0sIHNpemVvZihSVE1QX0RNQUJVRikpOwotCi0JaWYgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEpCi0JCXsKLQkJCVJUTVBfRnJlZURlc2NNZW1vcnkocEFkLCBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1NpemUsIHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEsIHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jUGEpOwotCSAgICB9Ci0JICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlR4RGVzY1JpbmdbbnVtXSwgc2l6ZW9mKFJUTVBfRE1BQlVGKSk7Ci0JfQotCi0JaWYgKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KQotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIFJUTVBGcmVlVHhSeFJpbmdNZW1vcnlcbiIpKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKglyZWdpc3RlciByZWxhdGVkIHByb2NlZHVyZXMuCi0gICoKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIERpc2FibGUgRE1BLgotCi1Bcmd1bWVudHM6Ci0JKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUMjhYWERNQURpc2FibGUoCi0JSU4gUlRNUF9BREFQVEVSCQkJKnBBZCkKLXsKLQlXUERNQV9HTE9fQ0ZHX1NUUlVDICAgICBHbG9DZmc7Ci0KLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKLQlHbG9DZmcud29yZCAmPSAweGZmMDsKLQlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0xOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEVuYWJsZSBETUEuCi0KLUFyZ3VtZW50czoKLQkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlQyOFhYRE1BRW5hYmxlKAotCUlOIFJUTVBfQURBUFRFUgkJCSpwQWQpCi17Ci0JV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7Ci0JaW50IGkgPSAwOwotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDQpOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7Ci0JCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSAgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCi0JCQlicmVhazsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gIERNQUJ1c3lcbiIpKTsKLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJaSsrOwotCX13aGlsZSAoIGkgPDIwMCk7Ci0KLQlSVE1QdXNlY0RlbGF5KDUwKTsKLQotCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAxOwotCUdsb0NmZy5maWVsZC5XUERNQUJ1cnN0U0laRSA9IDI7Ci0JR2xvQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gMTsKLQlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFdSSVRFIERNQSBvZmZzZXQgMHgyMDggPSAweCV4XG4iLCBHbG9DZmcud29yZCkpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKLQotfQotCi0KLUJPT0xFQU4gQXNpY0NoZWNrQ29tbWFuT2soCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCSBDb21tYW5kKQotewotCVVJTlQzMglDbWRTdGF0dXMgPSAwLCBDSUQgPSAwLCBpOwotCVVJTlQzMglUaGlzQ0lETWFzayA9IDA7Ci0KLQlpID0gMDsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fTUFJTEJPWF9DSUQsICZDSUQpOwotCQkvLyBGaW5kIHdoZXJlIHRoZSBjb21tYW5kIGlzLiBCZWNhdXNlIHRoaXMgaXMgcmFuZG9tbHkgc3BlY2lmaWVkIGJ5IGZpcm13YXJlLgotCQlpZiAoKENJRCAmIENJRDBNQVNLKSA9PSBDb21tYW5kKQotCQl7Ci0JCQlUaGlzQ0lETWFzayA9IENJRDBNQVNLOwotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZSBpZiAoKCgoQ0lEICYgQ0lEMU1BU0spPj44KSAmIDB4ZmYpID09IENvbW1hbmQpCi0JCXsKLQkJCVRoaXNDSURNYXNrID0gQ0lEMU1BU0s7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlIGlmICgoKChDSUQgJiBDSUQyTUFTSyk+PjE2KSAmIDB4ZmYpID09IENvbW1hbmQpCi0JCXsKLQkJCVRoaXNDSURNYXNrID0gQ0lEMk1BU0s7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlIGlmICgoKChDSUQgJiBDSUQzTUFTSyk+PjI0KSAmIDB4ZmYpID09IENvbW1hbmQpCi0JCXsKLQkJCVRoaXNDSURNYXNrID0gQ0lEM01BU0s7Ci0JCQlicmVhazsKLQkJfQotCi0JCVJUTVB1c2VjRGVsYXkoMTAwKTsKLQkJaSsrOwotCX13aGlsZSAoaSA8IDIwMCk7Ci0KLQkvLyBHZXQgQ29tbWFuZFN0YXR1cyBWYWx1ZQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgSDJNX01BSUxCT1hfU1RBVFVTLCAmQ21kU3RhdHVzKTsKLQotCS8vIFRoaXMgY29tbWFuZCdzIHN0YXR1cyBpcyBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyBjb21tYW5kLiBTbyBBTkQgY29tbWFuZCBwb3NpdGlvbidzIGJpdG1hc2sgdG8gcmVhZCBzdGF0dXMuCi0JaWYgKGkgPCAyMDApCi0JewotCQkvLyBJZiBTdGF0dXMgaXMgMSwgdGhlIGNvbWFtbmQgaXMgc3VjY2Vzcy4KLQkJaWYgKCgoQ21kU3RhdHVzICYgVGhpc0NJRE1hc2spID09IDB4MSkgfHwgKChDbWRTdGF0dXMgJiBUaGlzQ0lETWFzaykgPT0gMHgxMDApCi0JCQl8fCAoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEwMDAwKSB8fCAoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEwMDAwMDApKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gQXNpY0NoZWNrQ29tbWFuT2sgQ0lEID0gMHgleCwgQ21kU3RhdHVzPSAweCV4IFxuIiwgQ0lELCBDbWRTdGF0dXMpKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX1NUQVRVUywgMHhmZmZmZmZmZik7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DSUQsIDB4ZmZmZmZmZmYpOwotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEFzaWNDaGVja0NvbW1hbkZhaWwxIENJRCA9IDB4JXgsIENtZFN0YXR1cz0gMHgleCBcbiIsIENJRCwgQ21kU3RhdHVzKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBBc2ljQ2hlY2tDb21tYW5GYWlsMiBUaW1lb3V0IENvbW1hbmQgPSAlZCwgQ21kU3RhdHVzPSAweCV4IFxuIiwgQ29tbWFuZCwgQ21kU3RhdHVzKSk7Ci0JfQotCS8vIENsZWFyIENvbW1hbmQgYW5kIFN0YXR1cy4KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9TVEFUVVMsIDB4ZmZmZmZmZmYpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgMHhmZmZmZmZmZik7Ci0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBXcml0ZSBCZWFjb24gYnVmZmVyIHRvIEFzaWMuCi0KLUFyZ3VtZW50czoKLQkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlQyOHh4X1VwZGF0ZUJlYWNvblRvQXNpYygKLQlJTiBSVE1QX0FEQVBURVIJCSpwQWQsCi0JSU4gSU5UCQkJCWFwaWR4LAotCUlOIFVMT05HCQkJRnJhbWVMZW4sCi0JSU4gVUxPTkcJCQlVcGRhdGVQb3MpCi17Ci0JVUxPTkcJCQkJQ2FwSW5mb1BvcyA9IDA7Ci0JVUNIQVIJCQkqcHRyLCAqcHRyX3VwZGF0ZSwgKnB0cl9jYXBpbmZvOwotCVVJTlQJCQlpOwotCUJPT0xFQU4JCQliQmNuUmVxID0gRkFMU0U7Ci0JVUNIQVIJCQliY25faWR4ID0gMDsKLQotCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcygpIDogTm8gdmFsaWQgSW50ZXJmYWNlIGJlIGZvdW5kLlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvL2lmICgocEFkLT5XZHNUYWIuTW9kZSA9PSBXRFNfQlJJREdFX01PREUpCi0JLy8JfHwgKChwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uTVNTSUREZXYgPT0gTlVMTCkKLQkvLwkJfHwgIShwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uTVNTSUREZXYtPmZsYWdzICYgSUZGX1VQKSkKLQkvLwkpCi0JaWYgKGJCY25SZXEgPT0gRkFMU0UpCi0JewotCQkvKiB3aGVuIHRoZSByYSBpbnRlcmZhY2UgaXMgZG93biwgZG8gbm90IHNlbmQgaXRzIGJlYWNvbiBmcmFtZSAqLwotCQkvKiBjbGVhciBhbGwgemVybyAqLwotCQlmb3IoaT0wOyBpPFRYV0lfU0laRTsgaSs9NCkKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgaSwgMHgwMCk7Ci0JfQotCWVsc2UKLQl7Ci0JCXB0ciA9IChQVUNIQVIpJnBBZC0+QmVhY29uVHhXSTsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCVJUTVBXSUVuZGlhbkNoYW5nZShwdHIsIFRZUEVfVFhXSSk7Ci0jZW5kaWYKLQkJZm9yIChpPTA7IGk8VFhXSV9TSVpFOyBpKz00KSAgLy8gMTYtYnl0ZSBUWFdJIGZpZWxkCi0JCXsKLQkJCVVJTlQzMiBsb25ncHRyID0gICpwdHIgKyAoKihwdHIrMSk8PDgpICsgKCoocHRyKzIpPDwxNikgKyAoKihwdHIrMyk8PDI0KTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgaSwgbG9uZ3B0cik7Ci0JCQlwdHIgKz0gNDsKLQkJfQotCi0JCS8vIFVwZGF0ZSBDYXBhYmlsaXR5SW5mbyBpbiBCZWFjb24KLQkJZm9yIChpID0gQ2FwSW5mb1BvczsgaSA8IChDYXBJbmZvUG9zKzIpOyBpKyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBUWFdJX1NJWkUgKyBpLCAqcHRyX2NhcGluZm8pOwotCQkJcHRyX2NhcGluZm8gKys7Ci0JCX0KLQotCQlpZiAoRnJhbWVMZW4gPiBVcGRhdGVQb3MpCi0JCXsKLQkJCWZvciAoaT0gVXBkYXRlUG9zOyBpPCAoRnJhbWVMZW4pOyBpKyspCi0JCQl7Ci0JCQkJUlRNUF9JT19XUklURTgocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIFRYV0lfU0laRSArIGksICpwdHJfdXBkYXRlKTsKLQkJCQlwdHJfdXBkYXRlICsrOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1WT0lEIFJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOICAgICAgIGJGcm9tVHgpCi17Ci0gICAgQVVUT19XQUtFVVBfU1RSVUMJQXV0b1dha2V1cENmZzsKLQotICAgIGlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVykpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3YWtpbmcgdXAgbm93IVxuIikpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dBS0VVUF9OT1cpOwotCi0gICAgUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cpOwotCi0gICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCi0JCSYmcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCi0gICAgewotICAgICAgICAvLyBTdXBwb3J0IFBDSWUgQWR2YW5jZSBQb3dlciBTYXZlCi0JaWYgKGJGcm9tVHggPT0gVFJVRQotCQkJJiYocEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPT0gVFJVRSkpCi0JewotICAgICAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLQkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfV0FLRVVQKTsKLQkJUlRNUHVzZWNEZWxheSgzMDAwKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT09PT1Bc2ljRm9yY2VXYWtldXA9PT1iRnJvbVR4XG4iKSk7Ci0JfQotCi0JCUF1dG9XYWtldXBDZmcud29yZCA9IDA7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKLQotICAgICAgICBpZiAoUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBET1QxMVBPV0VSU0FWRSkpCi0gICAgICAgIHsKLSNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKLQkJCS8vIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwLCBsb2FkIFJGIG5vcm1hbCBvcGVyYXRpb24tbW9kZSBzZXR1cAotCQkJaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpCi0JCQl7Ci0JCQkJUlRNUF9DSElQX09QICpwQ2hpcE9wcyA9ICZwQWQtPmNoaXBPcHM7Ci0KLQkJCQlpZiAocENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKQotCQkJCQlwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUocEFkKTsKLQkJCX0KLQkJCWVsc2UKLSNlbmRpZiAvLyBQQ0lFX1BTX1NVUFBPUlQgLy8KLQkJCXsKLQkJCS8vIGVuZCBqb2hubGkKLQkJCQkvLyBJbiBSYWRpbyBPZmYsIHdlIHR1cm4gb2ZmIFJGIGNsaywgU28gbm93IG5lZWQgdG8gY2FsbCBBU0lDU3dpdGNoQ2hhbm5lbCBhZ2Fpbi4KLQkJCQlpZiAoSU5GUkFfT04ocEFkKSAmJiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJCQkJJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JCQkJewotCQkJCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgotCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8gTXVzdCB1c2luZyAyME1Iei4KLQkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCQkJCX0KLQkJCX0KLSAgICAgICAgfQotI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAotCQkvLyAzMDkwIE1DVSBXYWtldXAgY29tbWFuZCBuZWVkcyBtb3JlIHRpbWUgdG8gYmUgc3RhYmxlLgotCQkvLyBCZWZvcmUgc3RhYmxlLCBkb24ndCBpc3N1ZSBvdGhlciBNQ1UgY29tbWFuZCB0byBwcmV2ZW50IGZyb20gZmlybXdhcmUgZXJyb3IuCi0JCWlmICgoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKLQkJCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCi0JCQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKQotCQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09UlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwOjpSZWxlYXNlIHRoZSBNQ1UgTG9jaygzMDkwKVxuIikpOwotCQkJUlRNUF9TRU1fTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKLQkJCXBBZC0+YnJ0MzB4eEJhbk1jdUNtZCA9IEZBTFNFOwotCQkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1jdUNtZExvY2spOwotCQkJfQotI2VuZGlmIC8vIFBDSUVfUFNfU1VQUE9SVCAvLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvLyBQQ0ksIDI4NjAtUENJZQotICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09UlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwOjpPcmlnaW5hbCBQQ0kgUG93ZXIgU2F2aW5nXG4iKSk7Ci0gICAgICAgIEFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgMHhmZiwgMHgwMCwgMHgwMik7Ci0gICAgICAgIEF1dG9XYWtldXBDZmcud29yZCA9IDA7Ci0JICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKLSAgICB9Ci0KLSAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKLSAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKTsKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09PT09PVJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cFxuIikpOwotfQotCi0KLVZPSUQgUlQyOHh4UGNpU3RhQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApCi17Ci0JQk9PTEVBTiBicmM7Ci0KLQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQotCXsKLQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCi0JCSYmcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCi0JewotCQlVTE9ORwlOb3cgPSAwOwotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid2FraW5nIHVwIG5vdyFcbiIpKTsKLQkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKLQkJLy8gSWYgbGFzdCBzZW5kIE5VTEwgZnJhbSB0aW1lIGlzIHRvbyBjbG9zZSB0byB0aGlzIHJlY2VpdmluZyBiZWFjb24gKHdpdGhpbiA4bXMpLCBkb24ndCBnbyB0byBzbGVlcCBmb3IgdGhpcyBEVE0uCi0JCS8vIEJlY2F1c2UgU29tZSBBUCBjYW4ndCBxdWV1aW5nIG91dGdvaW5nIGZyYW1lcyBpbW1lZGlhdGVseS4KLQkJaWYgKCgocEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUgKyA4KSA+PSBOb3cpICYmIChwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSA8PSBOb3cpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb3cgPSAlbHUsIExhc3RTZW5kTlVMTHBzbVRpbWU9JWx1IDogIFJ4Q291bnRTaW5jZUxhc3ROVUxMID0gJWx1LiBcbiIsIE5vdywgcEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUsIHBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwpKTsKLQkJCXJldHVybjsKLQkJfQotCQllbHNlIGlmICgocEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCA+IDApICYmICgocEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUgKyBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QpID49IE5vdykpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vdyA9ICVsdSwgTGFzdFNlbmROVUxMcHNtVGltZT0lbHU6IFJ4Q291bnRTaW5jZUxhc3ROVUxMID0gJWx1ID4gMCBcbiIsIE5vdywgcEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUsICBwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlicmMgPSBSVDI4eHhQY2lBc2ljUmFkaW9PZmYocEFkLCBET1QxMVBPV0VSU0FWRSwgVGJ0dE51bVRvTmV4dFdha2VVcCk7Ci0JCWlmIChicmM9PVRSVUUpCi0JCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci0JfQotCWVsc2UKLQl7Ci0JCUFVVE9fV0FLRVVQX1NUUlVDCUF1dG9XYWtldXBDZmc7Ci0JCS8vIHdlIGhhdmUgZGVjaWRlZCB0byBTTEVFUCwgc28gYXQgbGVhc3QgZG8gaXQgZm9yIGEgQkVBQ09OIHBlcmlvZC4KLQkJaWYgKFRidHROdW1Ub05leHRXYWtlVXAgPT0gMCkKLQkJCVRidHROdW1Ub05leHRXYWtlVXAgPSAxOwotCi0JCS8vUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCBBdXRvV2FrZXVwSW50KTsKLQotCQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0JCUF1dG9XYWtldXBDZmcuZmllbGQuTnVtb2ZTbGVlcGluZ1RidHQgPSBUYnR0TnVtVG9OZXh0V2FrZVVwIC0gMTsKLQkJQXV0b1dha2V1cENmZy5maWVsZC5FbmFibGVBdXRvV2FrZXVwID0gMTsKLQkJQXV0b1dha2V1cENmZy5maWVsZC5BdXRvTGVhZFRpbWUgPSA1OwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0JCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgMHhmZiwgMHhmZiwgMHgwMCk7ICAgLy8gc2VuZCBQT1dFUi1TQVZFIGNvbW1hbmQgdG8gTUNVLiBUaW1lb3V0IDQwdXMuCi0JCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tICVzLCBUYnR0TnVtVG9OZXh0V2FrZVVwPSVkIFxuIiwgX19GVU5DVElPTl9fLCBUYnR0TnVtVG9OZXh0V2FrZVVwKSk7Ci0JfQotCi19Ci0KLQotVk9JRCBQc1BvbGxXYWtlRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tPlBzUG9sbFdha2VFeGVjIFxuIikpOwotCi0JUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotICAgIGlmIChwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZykKLSAgICB7Ci0JICAgIFJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7Ci0gICAgfQotICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0JUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0jaWZkZWYgUENJRV9QU19TVVBQT1JUCi0JLy8gRm9yIHJ0MzB4eCBwb3dlciBzb2x1dGlvbiAzLCBVc2Ugc29mdHdhcmUgdGltZXIgdG8gd2FrZSB1cCBpbiBwc20uIFNvIGNhbGwKLQkvLyBBc2ljRm9yY2VXYWtldXAgaGVyZSBpbnN0ZWFkIG9mIGhhbmRsaW5nIHR3YWtldXAgaW50ZXJydXB0LgotCWlmICgoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKSkKLQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQotCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIjwtLVBzUG9sbFdha2VFeGVjOjozMDkwIGNhbGxzIEFzaWNGb3JjZVdha2V1cChwQWQsIERPVDExUE9XRVJTQVZFKSBpbiBhZHZhbmNlIFxuIikpOwotCQlBc2ljRm9yY2VXYWtldXAocEFkLCBET1QxMVBPV0VSU0FWRSk7Ci0JfQotCi0jZW5kaWYgLy8gUENJRV9QU19TVVBQT1JUIC8vCi19Ci0KLVZPSUQgIFJhZGlvT25FeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLQlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7Ci0JUlRNUF9DSElQX09QICpwQ2hpcE9wcyA9ICZwQWQtPmNoaXBPcHM7Ci0JV1BETUFfR0xPX0NGR19TVFJVQwlEbWFDZmc7Ci0JQk9PTEVBTgkJCQlDYW5jZWxsZWQ7Ci0KLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiLS0+UmFkaW9PbkV4ZWMoKSByZXR1cm4gb24gZk9QX1NUQVRVU19ET1pFID09IFRSVUU7IFxuIikpOwotLy9LSCBEZWJ1ZzogQWRkIHRoZSBjb21waWxlIGZsYWcgIlJUMjg2MCBhbmQgY29uZGl0aW9uCi0jaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkKLQkJCSYmcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCi0JCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwgMTApOwotI2VuZGlmIC8vIFJUTVBfUENJX1NVUFBPUlQgLy8KLQkJcmV0dXJuOwotCX0KLQotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCItLT5SYWRpb09uRXhlYygpIHJldHVybiBvbiBTQ0FOX0lOX1BST0dSRVNTOyBcbiIpKTsKLQotCi0jaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAotaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCi0JJiZwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkKLQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAxMCk7Ci0jZW5kaWYgLy8gUlRNUF9QQ0lfU1VQUE9SVCAvLwotCQlyZXR1cm47Ci0JfQotLy9LSCBEZWJ1ZzogbmVlZCB0byBjaGVjay4gSSBhZGQgdGhlIGNvbXBpbGUgZmxhZyAiQ09ORklHX1NUQV9TVVBQT1JUIiB0byBlbmNsb3NlIHRoZSBmb2xsb3dpbmcgY29kZXMuCi0jaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAotaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCi0JJiZwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkKLQl7Ci0JcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwJJkNhbmNlbGxlZCk7Ci0JfQotI2VuZGlmIC8vIFJUTVBfUENJX1NVUFBPUlQgLy8KLQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCi0JewotCQlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JFKTsKLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKLQkJLypSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfSENDQSk7Ki8KLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX01HTVQpOwotCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfUlgpOwotCi0JCS8vIDIuIFNlbmQgd2FrZSB1cCBjb21tYW5kLgotCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIFBvd2VyV2FrZUNJRCwgMHgwMCwgMHgwMik7Ci0JCS8vIDItMS4gd2FpdCBjb21tYW5kIG9rLgotCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyV2FrZUNJRCk7Ci0KLQkJLy8gV2hlbiBQQ0kgY2xvY2sgaXMgb2ZmLCBkb24ndCB3YW50IHRvIHNlcnZpY2UgaW50ZXJydXB0LiBTbyB3aGVuIGJhY2sgdG8gY2xvY2sgb24sIGVuYWJsZSBpbnRlcnJ1cHQuCi0JCS8vUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCAoREVMQVlJTlRNQVNLfFJ4SU5UKSk7Ci0JCVJUTVBfQVNJQ19JTlRFUlJVUFRfRU5BQkxFKHBBZCk7Ci0KLQkJLy8gMy4gRW5hYmxlIFR4IERNQS4KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmRG1hQ2ZnLndvcmQpOwotCQlEbWFDZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBEbWFDZmcud29yZCk7Ci0KLQkJLy8gSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uCi0JCWlmIChJTkZSQV9PTihwQWQpICYmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQkJJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JCXsKLQkJCS8vIE11c3QgdXNpbmcgNDBNSHouCi0JCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBNdXN0IHVzaW5nIDIwTUh6LgotCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJfQotLy9LSCBEZWJ1ZzpUaGUgZm9sbG93aW5nIGNvZGVzIHNob3VsZCBiZSBlbmNsb3NlZCBieSBSVDMwOTAgY29tcGlsZSBmbGFnCi0JCWlmIChwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUpCi0JCQlwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUocEFkKTsKLSNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLS8vIDMwOTAgTUNVIFdha2V1cCBjb21tYW5kIG5lZWRzIG1vcmUgdGltZSB0byBiZSBzdGFibGUuCi0vLyBCZWZvcmUgc3RhYmxlLCBkb24ndCBpc3N1ZSBvdGhlciBNQ1UgY29tbWFuZCB0byBwcmV2ZW50IGZyb20gZmlybXdhcmUgZXJyb3IuCi1pZiAoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQotCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCi0JJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkKLQl7Ci0JUlRNUF9TRU1fTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKLQlwQWQtPmJydDMweHhCYW5NY3VDbWQgPSBGQUxTRTsKLQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWN1Q21kTG9jayk7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFBDSUVfUFNfU1VQUE9SVCAvLwotCQkvLyBDbGVhciBSYWRpbyBvZmYgZmxhZwotCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7Ci0KLQkJLy8gU2V0IExFRAotCQlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09OKTsKLQotICAgICAgICBpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9BQ1RJVkUpCi0gICAgICAgIHsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOwotICAgICAgICB9Ci0JfQotCWVsc2UKLQl7Ci0JCVJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIEdVSVJBRElPX09GRiwgMCk7Ci0JfQotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyByb3V0aW5lIHNlbmRzIGNvbW1hbmQgdG8gZmlybXdhcmUgYW5kIHR1cm4gb3VyIGNoaXAgdG8gd2FrZSB1cCBtb2RlIGZyb20gcG93ZXIgc2F2ZSBtb2RlLgotCQlCb3RoIFJhZGlvT24gYW5kIC4xMSBwb3dlciBzYXZlIGZ1bmN0aW9uIG5lZWRzIHRvIGNhbGwgdGhpcyByb3V0aW5lLgotCUlucHV0OgotCQlMZXZlbCA9IEdVSVJBRElPX09GRiA6IGNhbGwgdGhpcyBmdW5jdGlvbiBpcyBmcm9tIFJhZGlvIE9mZiB0byBSYWRpbyBPbi4gIE5lZWQgdG8gcmVzdG9yZSBQQ0kgaG9zdCB2YWx1ZS4KLQkJTGV2ZWwgPSBvdGhlciB2YWx1ZSA6IG5vcm1hbCB3YWtlIHVwIGZ1bmN0aW9uLgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBSVDI4eHhQY2lBc2ljUmFkaW9PbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiAgICAgTGV2ZWwpCi17Ci0gICAgLy9XUERNQV9HTE9fQ0ZHX1NUUlVDCURtYUNmZzsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlCT09MRUFOCQkJCUNhbmNlbGxlZDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSAgICAvL1VJTlQzMgkJCSAgICBNQUNWYWx1ZTsKLQotCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVAgJiYgTGV2ZWw9PURPVDExUE9XRVJTQVZFKQotCQlyZXR1cm4gRkFMU0U7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpCi0JewotCQlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCi0JCXsKLQkgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOwotCQl9Ci0JCWlmICgocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpJiYKLQkJKChMZXZlbCA9PSBHVUlSQURJT19PRkYpIHx8IChMZXZlbCA9PSBHVUlfSURMRV9QT1dFUl9TQVZFKSkKLQkJfHwoUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX1NFVF9QQ0lfQ0xLX09GRl9DT01NQU5EKSkpCi0JCXsKLQkJCS8vIFNvbWUgY2hpcHMgZG9uJ3QgbmVlZCB0byBkZWxheSA2bXMsIHNvIGNvcHkgUlRNUFBDSWVQb3dlckxpbmtDdHJsUmVzdG9yZQotCQkJLy8gcmV0dXJuIGNvbmRpdGlvbiBoZXJlLgotCQkJLyoKLQkJCWlmICgoKHBBZC0+TUFDVmVyc2lvbiYweGZmZmYwMDAwKSAhPSAweDI4NjAwMDAwKQotCQkJCSYmICgocEFkLT5EZXZpY2VJRCA9PSBOSUMyODYwX1BDSWVfREVWSUNFX0lEKQotCQkJCXx8KHBBZC0+RGV2aWNlSUQgPT0gTklDMjc5MF9QQ0llX0RFVklDRV9JRCkpKQotCQkJKi8KLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlQyOHh4UGNpQXNpY1JhZGlvT24gKClcbiIpKTsKLQkJCS8vIDEuIFNldCBQQ0kgTGluayBDb250cm9sIGluIENvbmZpZ3VyYXRpb24gU3BhY2UuCi0JCQlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9XQUtFVVApOwotCQkJUlRNUHVzZWNEZWxheSg2MDAwKTsKLQkJfQotCX0KLQl9Ci0KLSNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKLWlmICghKCgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpCi0JJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykKLQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKSkpCi0jZW5kaWYgLy8gUENJRV9QU19TVVBQT1JUIC8vCi0JewotICAgIHBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQU00gOjMwOXhiUENJY2xrT2ZmID09ICVkXG4iLCBwQWQtPmJQQ0ljbGtPZmYpKTsKLQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkvLyAyLiBTZW5kIHdha2UgdXAgY29tbWFuZC4KLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIFBvd2VyV2FrZUNJRCwgMHgwMCwgMHgwMik7Ci0JcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7Ci0JLy8gMi0xLiB3YWl0IGNvbW1hbmQgb2suCi0JQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlcldha2VDSUQpOwotCVJUTVBfQVNJQ19JTlRFUlJVUFRfRU5BQkxFKHBBZCk7Ci0KLQotCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpOwotCWlmIChMZXZlbCA9PSBHVUlfSURMRV9QT1dFUl9TQVZFKQotCXsKLSNpZmRlZiAgUENJRV9QU19TVVBQT1JUCi0KLQkJCS8vIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwLCBsb2FkIFJGIG5vcm1hbCBvcGVyYXRpb24tbW9kZSBzZXR1cAotCQkJaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkpCi0JCQl7Ci0JCQkJUlRNUF9DSElQX09QICpwQ2hpcE9wcyA9ICZwQWQtPmNoaXBPcHM7Ci0KLQkJCQlpZiAocENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKQotCQkJCQlwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUocEFkKTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCQkvLyAzMDkwIE1DVSBXYWtldXAgY29tbWFuZCBuZWVkcyBtb3JlIHRpbWUgdG8gYmUgc3RhYmxlLgotCQkJCS8vIEJlZm9yZSBzdGFibGUsIGRvbid0IGlzc3VlIG90aGVyIE1DVSBjb21tYW5kIHRvIHByZXZlbnQgZnJvbSBmaXJtd2FyZSBlcnJvci4KLQkJCQlpZiAoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQotCQkJCQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQotCQkJCQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKQotCQkJCQl7Ci0JCQkJCQlSVE1QX1NFTV9MT0NLKCZwQWQtPk1jdUNtZExvY2spOwotCQkJCQkJcEFkLT5icnQzMHh4QmFuTWN1Q21kID0gRkFMU0U7Ci0JCQkJCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWN1Q21kTG9jayk7Ci0JCQkJCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJCX0KLQkJCWVsc2UKLQkJCS8vIGVuZCBqb2hubGkKLSNlbmRpZiAvLyBQQ0lFX1BTX1NVUFBPUlQgLy8KLQkJCXsKLQkJCS8vIEluIFJhZGlvIE9mZiwgd2UgdHVybiBvZmYgUkYgY2xrLCBTbyBub3cgbmVlZCB0byBjYWxsIEFTSUNTd2l0Y2hDaGFubmVsIGFnYWluLgotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCQl7Ci0JCQkJaWYgKElORlJBX09OKHBBZCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCi0JCQkJCSYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotCQkJCXsKLQkJCQkJLy8gTXVzdCB1c2luZyA0ME1Iei4KLQkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwotCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vIE11c3QgdXNpbmcgMjBNSHouCi0JCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJCQl9Ci0JCQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJfQotCX0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgcm91dGluZSBzZW5kcyBjb21tYW5kIHRvIGZpcm13YXJlIGFuZCB0dXJuIG91ciBjaGlwIHRvIHBvd2VyIHNhdmUgbW9kZS4KLQkJQm90aCBSYWRpb09mZiBhbmQgLjExIHBvd2VyIHNhdmUgZnVuY3Rpb24gbmVlZHMgdG8gY2FsbCB0aGlzIHJvdXRpbmUuCi0JSW5wdXQ6Ci0JCUxldmVsID0gR1VJUkFESU9fT0ZGICA6IEdVSSBSYWRpbyBPZmYgbW9kZQotCQlMZXZlbCA9IERPVDExUE9XRVJTQVZFICA6IDgwMi4xMSBwb3dlciBzYXZlIG1vZGUKLQkJTGV2ZWwgPSBSVE1QX0hBTFQgIDogV2hlbiBEaXNhYmxlIGRldmljZS4KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCUlOIFVDSEFSICAgICAgICAgICAgTGV2ZWwsCi0JSU4gVVNIT1JUICAgICAgICAgICBUYnR0TnVtVG9OZXh0V2FrZVVwKQotewotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCVdQRE1BX0dMT19DRkdfU1RSVUMJRG1hQ2ZnOwotCVVDSEFSCQlpLCB0ZW1wQkJQX1IzID0gMDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlCT09MRUFOCQlicmMgPSBGQUxTRSwgQ2FuY2VsbGVkOwotICAgIFVJTlQzMgkJVGJUVFRpbWUgPSAwOwotCVVJTlQzMgkJUHNQb2xsVGltZSA9IDAvKiwgTUFDVmFsdWUqLzsKLSAgICBVTE9ORwkJQmVhY29uUGVyaW9kVGltZTsKLSAgICBVSU5UMzIJCVJ4RG1hSWR4LCBSeENwdUlkeDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljUmFkaW9PZmYgPT09PiBMdj0gJWQsIFR4Q3B1SWR4ID0gJWQsIFR4RG1hSWR4ID0gJWQuIFJ4Q3B1SWR4ID0gJWQsIFJ4RG1hSWR4ID0gJWQuXG4iLCBMZXZlbCxwQWQtPlR4UmluZ1swXS5UeENwdUlkeCwgcEFkLT5UeFJpbmdbMF0uVHhEbWFJZHgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4LCBwQWQtPlJ4UmluZy5SeERtYUlkeCkpOwotCi0JaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCAmJiBMZXZlbD09RE9UMTFQT1dFUlNBVkUpCi0JCXJldHVybiBGQUxTRTsKLQotICAgIC8vIENoZWNrIFJ4IERNQSBidXN5IHN0YXR1cywgaWYgbW9yZSB0aGFuIGhhbGYgaXMgb2NjdXBpZWQsIGdpdmUgdXAgdGhpcyByYWRpbyBvZmYuCi0JUlRNUF9JT19SRUFEMzIocEFkLCBSWF9EUlhfSURYICwgJlJ4RG1hSWR4KTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0NSWF9JRFggLCAmUnhDcHVJZHgpOwotCWlmICgoUnhEbWFJZHggPiBSeENwdUlkeCkgJiYgKChSeERtYUlkeCAtIFJ4Q3B1SWR4KSA+IFJYX1JJTkdfU0laRS8zKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNSYWRpb09mZiA9PT0+IHJldHVybjEuIFJ4RG1hSWR4ID0gJWQgLCAgUnhDcHVJZHggPSAlZC4gXG4iLCBSeERtYUlkeCwgUnhDcHVJZHgpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQllbHNlIGlmICgoUnhDcHVJZHggPj0gUnhEbWFJZHgpICYmICgoUnhDcHVJZHggLSBSeERtYUlkeCkgPCBSWF9SSU5HX1NJWkUvMykpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljUmFkaW9PZmYgPT09PiByZXR1cm4yLiAgUnhDcHVJZHggPSAlZC4gUnhEbWFJZHggPSAlZCAsICBcbiIsIFJ4Q3B1SWR4LCBSeERtYUlkeCkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0gICAgLy8gT25jZSBnbyBpbnRvIHRoaXMgZnVuY3Rpb24sIGRpc2FibGUgdHggYmVjYXVzZSBkb24ndCB3YW50IHRvbyBtYW55IHBhY2tldHMgaW4gcXVldWUgdG8gcHJldmVudCBIVyBzdG9wcy4KLQkvL3BBZC0+YlBDSWNsa09mZkRpc2FibGVUeCA9IFRSVUU7Ci0JUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCk7Ci0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCi0JCSYmIHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJJiZwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkpCi0JewotCi0JICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwJJkNhbmNlbGxlZCk7Ci0JICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKLQotCSAgICBpZiAoTGV2ZWwgPT0gRE9UMTFQT1dFUlNBVkUpCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVEJUVF9USU1FUiwgJlRiVFRUaW1lKTsKLQkJCVRiVFRUaW1lICY9IDB4MWZmZmY7Ci0JCQkvLyAwMC4gY2hlY2sgaWYgbmVlZCB0byBkbyBzbGVlcCBpbiB0aGlzIERUSU0gcGVyaW9kLiAgIElmIG5leHQgYmVhY29uIHdpbGwgYXJyaXZlIHdpdGhpbiAzMG1zICwgLi4uZG9lc24ndCBuZWNlc3NhcmlseSBzbGVlcC4KLQkJCS8vIFRiVFRUaW1lIHVpbnQgPSA2NHVzLCBMRUFEX1RJTUUgdW5pdCA9IDEwMjR1cywgUHNQb2xsVGltZSB1bml0ID0gMW1zCi0JICAgICAgICBpZiAgKCgoNjQqVGJUVFRpbWUpIDwoKExFQURfVElNRSoxMDI0KSArIDQwMDAwKSkgJiYgKFRidHROdW1Ub05leHRXYWtlVXAgPT0gMCkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGJUVFRpbWUgPSAweCV4ICwgZ2l2ZSB1cCB0aGlzIHNsZWVwLiBcbiIsIFRiVFRUaW1lKSk7Ci0JICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci0JICAgICAgICAgICAgLy9wQWQtPmJQQ0ljbGtPZmZEaXNhYmxlVHggPSBGQUxTRTsKLQkgICAgICAgICAgICBSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpOwotCQkJCXJldHVybiBGQUxTRTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlQc1BvbGxUaW1lID0gKDY0KlRiVFRUaW1lLSBMRUFEX1RJTUUqMTAyNCkvMTAwMDsKLSNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCQlpZiAoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQotCQkJCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCi0JCQkJJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkKLQkJCQl7Ci0JCQkJCQkJUHNQb2xsVGltZSAtPSA1OwotCQkJCX0KLQkJCQllbHNlCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUENJRV9QU19TVVBQT1JUIC8vCi0JCQkJUHNQb2xsVGltZSAtPSAzOwotCi0JICAgICAgICAgICAgQmVhY29uUGVyaW9kVGltZSA9IHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCoxMDIvMTAwOwotCQkJCWlmIChUYnR0TnVtVG9OZXh0V2FrZVVwID4gMCkKLQkJCQkJUHNQb2xsVGltZSArPSAoKFRidHROdW1Ub05leHRXYWtlVXAgLTEpICogQmVhY29uUGVyaW9kVGltZSk7Ci0KLQkgICAgICAgICAgICBwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IFRSVUU7Ci0JCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsIFBzUG9sbFRpbWUpOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUMjh4eFBjaUFzaWNSYWRpb09mZjo6TGV2ZWwhPURPVDExUE9XRVJTQVZFIFxuIikpOwotCX0KLQotCXBBZC0+YlBDSWNsa09mZkRpc2FibGVUeCA9IEZBTFNFOwotICAgIFJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotICAgIC8vIFNldCB0byAxUi4KLQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+IDEgJiYgcEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQl7Ci0gICAgdGVtcEJCUF9SMyA9IChwQWQtPlN0YUNmZy5CQlBSMyAmIDB4RTcpOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIHRlbXBCQlBfUjMpOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vIEluIFJhZGlvIE9mZiwgd2UgdHVybiBvZmYgUkYgY2xrLCBTbyBub3cgbmVlZCB0byBjYWxsIEFTSUNTd2l0Y2hDaGFubmVsIGFnYWluLgotCWlmICgoSU5GUkFfT04ocEFkKSB8fCBwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApICYmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQkmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLQl7Ci0JCS8vIE11c3QgdXNpbmcgNDBNSHouCi0JCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIE11c3QgdXNpbmcgMjBNSHouCi0JCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQl9Ci0KLQlpZiAoTGV2ZWwgIT0gUlRNUF9IQUxUKQotCXsKLQkJLy8gQ2hhbmdlIEludGVycnVwdCBiaXRtYXNrLgotICAgIC8vIFdoZW4gUENJIGNsb2NrIGlzIG9mZiwgZG9uJ3Qgd2FudCB0byBzZXJ2aWNlIGludGVycnVwdC4KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIEF1dG9XYWtldXBJbnQpOwotCX0KLQllbHNlCi0JewotCQlSVE1QX0FTSUNfSU5URVJSVVBUX0RJU0FCTEUocEFkKTsKLQl9Ci0KLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKLQkvLyAgMi4gU2VuZCBTbGVlcCBjb21tYW5kCi0JUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfU1RBVFVTLCAweGZmZmZmZmZmKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DSUQsIDB4ZmZmZmZmZmYpOwotCS8vIHNlbmQgUE9XRVItU0FWRSBjb21tYW5kIHRvIE1DVS4gaGlnaC1ieXRlID0gMSBzYXZlIHBvd2VyIGFzIG11Y2ggYXMgcG9zc2libGUuIGhpZ2ggYnl0ZSA9IDAgc2F2ZSBsZXNzIHBvd2VyCi0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCBQb3dlclNhZmVDSUQsIDB4ZmYsIDB4MSk7Ci0JLy8gIDItMS4gV2FpdCBjb21tYW5kIHN1Y2Nlc3MKLQkvLyBTdGF0dXMgPSAxIDogc3VjY2VzcywgU3RhdHVzID0gMiwgYWxyZWFkeSBzbGVlcCwgU3RhdHVzID0gMywgTWF5YmUgTUFDIGlzIGJ1c3kgc28gY2FuJ3QgZmluaXNoIHRoaXMgdGFzay4KLQlicmMgPSBBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyU2FmZUNJRCk7Ci0KLQkvLyAgMy4gQWZ0ZXIgMHgzMCBjb21tYW5kIGlzIG9rLCBzZW5kIHJhZGlvIG9mZiBjb21tYW5kLiBsb3dieXRlID0gMCBmb3IgcG93ZXIgc2FmZS4KLQkvLyBJZiAweDMwIGNvbW1hbmQgaXMgbm90IG9rIHRoaXMgdGltZSwgd2UgY2FuIGlnbm9yZSAweDM1IGNvbW1hbmQuIEl0IHdpbGwgbWFrZSBzdXJlIG5vdCBjYXVzZSBmaXJtd2FyZSdyIHByb2JsZW0uCi0JaWYgKChMZXZlbCA9PSBET1QxMVBPV0VSU0FWRSkgJiYgKGJyYyA9PSBUUlVFKSkKLQl7Ci0JCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzNSwgUG93ZXJSYWRpb09mZkNJRCwgMCwgMHgwMCk7CS8vIGxvd2J5dGUgPSAwIG1lYW5zIHRvIGRvIHBvd2VyIHNhZmUsIE5PVCB0dXJuIG9mZiByYWRpby4KLQkJLy8gIDMtMS4gV2FpdCBjb21tYW5kIHN1Y2Nlc3MKLQkJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclJhZGlvT2ZmQ0lEKTsKLQl9Ci0JZWxzZSBpZiAoYnJjID09IFRSVUUpCi0JewotCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzUsIFBvd2VyUmFkaW9PZmZDSUQsIDEsIDB4MDApOwkvLyBsb3dieXRlID0gMCBtZWFucyB0byBkbyBwb3dlciBzYWZlLCBOT1QgdHVybiBvZmYgcmFkaW8uCi0JCS8vICAzLTEuIFdhaXQgY29tbWFuZCBzdWNjZXNzCi0JCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJSYWRpb09mZkNJRCk7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JLy8gMS4gV2FpdCBETUEgbm90IGJ1c3kKLQlpID0gMDsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmRG1hQ2ZnLndvcmQpOwotCQlpZiAoKERtYUNmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkgJiYgKERtYUNmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkpCi0JCQlicmVhazsKLQkJUlRNUHVzZWNEZWxheSgyMCk7Ci0JCWkrKzsKLQl9d2hpbGUoaSA8IDUwKTsKLQotCS8qCi0JaWYgKGkgPj0gNTApCi0JewotCQlwQWQtPkNoZWNrRG1hQnVzeUNvdW50Kys7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRNQSBSeCBrZWVwcyBidXN5LiAgcmV0dXJuIG9uIEFzaWNSYWRpb09mZiAoKSBDaGVja0RtYUJ1c3lDb3VudCA9ICVkIFxuIiwgcEFkLT5DaGVja0RtYUJ1c3lDb3VudCkpOwotCX0KLQllbHNlCi0JewotCQlwQWQtPkNoZWNrRG1hQnVzeUNvdW50ID0gMDsKLQl9Ci0JKi8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLS8vS0ggRGVidWc6TXkgb3JpZ2luYWwgY29kZXMgaGF2ZSB0aGUgZm9sbHdvaW5nIGNvZGVzLCBidXQgY3VycmVjbnQgY29kZXMgZG8gbm90IGhhdmUgaXQuCi0vLyBEaXNhYmxlIGZvciBzdGFiaWxpdHkuIElmIFBDSUUgTGluayBDb250cm9sIGlzIG1vZGlmaWVkIGZvciBhZHZhbmNlIHBvd2VyIHNhdmUsIHJlLWNvdmVyeSB0aGlzIGNvZGUgc2VnbWVudC4KLVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHgxMjgwKTsKLS8vT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0NMS1NFTEVDVF80ME1IWik7Ci0KLSNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLWlmICgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpCi0JJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykKLQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKQotCXsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVDI4eHhQY2lBc2ljUmFkaW9PZmY6OjMwOTAgcmV0dXJuIHRvIHNraXAgdGhlIGZvbGxvd2luZyBUYnR0TnVtVG9OZXh0V2FrZVVwIHNldHRpbmcgZm9yIDI3OXhcbiIpKTsKLQlwQWQtPmJQQ0ljbGtPZmYgPSBUUlVFOwotCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCk7Ci0JLy8gRm9yIHRoaXMgY2FzZSwgZG9lc24ndCBuZWVkIHRvIGJlbG93IGFjdGlvbnMsIHNvIHJldHVybiBoZXJlLgotCXJldHVybiBicmM7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFBDSUVfUFNfU1VQUE9SVCAvLwotCWlmIChMZXZlbCA9PSBET1QxMVBPV0VSU0FWRSkKLQl7Ci0JCUFVVE9fV0FLRVVQX1NUUlVDCUF1dG9XYWtldXBDZmc7Ci0JCS8vUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsIDkwKTsKLQotCQkvLyB3ZSBoYXZlIGRlY2lkZWQgdG8gU0xFRVAsIHNvIGF0IGxlYXN0IGRvIGl0IGZvciBhIEJFQUNPTiBwZXJpb2QuCi0JCWlmIChUYnR0TnVtVG9OZXh0V2FrZVVwID09IDApCi0JCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gMTsKLQotCQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0KLQkJLy8gMS4gU2V0IGF1dG8gd2FrZSB1cCB0aW1lci4KLQkJQXV0b1dha2V1cENmZy5maWVsZC5OdW1vZlNsZWVwaW5nVGJ0dCA9IFRidHROdW1Ub05leHRXYWtlVXAgLSAxOwotCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkVuYWJsZUF1dG9XYWtldXAgPSAxOwotCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkF1dG9MZWFkVGltZSA9IExFQURfVElNRTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOwotCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCS8vICA0LTEuIElmIGl0J3MgdG8gZGlzYWJsZSBvdXIgZGV2aWNlLiBOZWVkIHRvIHJlc3RvcmUgUENJIENvbmZpZ3VyYXRpb24gU3BhY2UgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLgotCWlmIChMZXZlbCA9PSBSVE1QX0hBTFQgJiYgcEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQl7Ci0JCWlmICgoYnJjID09IFRSVUUpICYmIChpIDwgNTApKQotCQkJUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcocEFkLCAxKTsKLQl9Ci0JLy8gIDQuIFNldCBQQ0kgY29uZmlndXJhdGlvbiBTcGFjZSBMaW5rIENvbXRyb2wgZmllbGRzLiAgT25seSBSYWRpbyBPZmYgbmVlZHMgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uCi0JZWxzZSBpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQl7Ci0JCWlmICgoYnJjID09IFRSVUUpICYmIChpIDwgNTApKQotCQkJUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcocEFkLCAzKTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkvL3BBZC0+YlBDSWNsa09mZkRpc2FibGVUeCA9IEZBTFNFOwotCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotCi0KLVZPSUQgUlQyOHh4UGNpTWxtZVJhZGlvT24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0gICAgaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKLQkJcmV0dXJuOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5cbiIsIF9fRlVOQ1RJT05fXykpOwotCi0gICAgaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApIHx8Ci0gICAgICAgICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLSAgICAgICAgJiYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotICAgICAgICB8fHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBGQUxTRQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotICAgICAgICApKSkKLSAgICB7Ci0JUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFKTsKLQkvL05JQ1Jlc2V0RnJvbUVycm9yKHBBZCk7Ci0KLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkspOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CRSk7Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOwotCS8qUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0hDQ0EpOyovCi0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX01HTVQpOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9SWCk7Ci0KLQkvLyBFbmFibGUgVHgvUngKLQlSVE1QRW5hYmxlUnhUeChwQWQpOwotCi0JLy8gQ2xlYXIgUmFkaW8gb2ZmIGZsYWcKLQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7Ci0JUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRik7Ci0JICAgIC8vIFNldCBMRUQKLQkgICAgUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7Ci0gICAgfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0gICAgaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgotICAgICAgICAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpCi0gICAgICAgICYmKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkKLSAgICB7Ci0gICAgICAgIEJPT0xFQU4JCUNhbmNlbGxlZDsKLQotCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7Ci0KLSAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwJJkNhbmNlbGxlZCk7Ci0JUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLAkmQ2FuY2VsbGVkKTsKLQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsIDQwKTsKLSAgICB9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi19Ci0KLQotVk9JRCBSVDI4eHhQY2lNbG1lUmFkaW9PRkYoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JQk9PTEVBTiBicmM9VFJVRTsKLQotICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKLQlyZXR1cm47Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkvLyBMaW5rIGRvd24gZmlyc3QgaWYgYW55IGFzc29jaWF0aW9uIGV4aXN0cwotCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCXsKLQkJaWYgKElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKSkKLQkJewotCQkJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUIERpc1JlcTsKLQkJCU1MTUVfUVVFVUVfRUxFTSAqcE1zZ0VsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKLQotCQkJaWYgKHBNc2dFbGVtKQotCQkJewotCQkJCUNPUFlfTUFDX0FERFIoJkRpc1JlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQkJRGlzUmVxLlJlYXNvbiA9ICBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkc7Ci0KLQkJCQlwTXNnRWxlbS0+TWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7Ci0JCQkJcE1zZ0VsZW0tPk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7Ci0JCQkJcE1zZ0VsZW0tPk1zZ0xlbiA9IHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KHBNc2dFbGVtLT5Nc2csICZEaXNSZXEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKTsKLQotCQkJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsIHBNc2dFbGVtKTsKLQkJCQlrZnJlZShwTXNnRWxlbSk7Ci0KLQkJCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCQkJfQotCQl9Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5cbiIsIF9fRlVOQ1RJT05fXykpOwotCi0JLy8gU2V0IExFRAotCS8vUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOwotCS8vIFNldCBSYWRpbyBvZmYgZmxhZwotCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotICAgIHsKLQlCT09MRUFOCQlDYW5jZWxsZWQ7Ci0JaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKQotCQl7Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0JewotCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAmQ2FuY2VsbGVkKTsKLQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOwotCX0KLQkJCS8vIElmIGR1cmluZyBwb3dlciBzYWZlIG1vZGUuCi0JCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCItLT5NbG1lUmFkaW9PZmYoKSByZXR1cm4gb24gYlJhZGlvID09IFRSVUU7IFxuIikpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vIEFsd2F5cyByYWRpbyBvbiBzaW5jZSB0aGUgTklDIG5lZWRzIHRvIHNldCB0aGUgTUNVIGNvbW1hbmQgKExFRF9SQURJT19PRkYpLgotCQkJaWYgKElETEVfT04ocEFkKSAmJgotCQkJCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkKLQkJCXsKLQkJCQlSVDI4eHhQY2lBc2ljUmFkaW9PbihwQWQsIEdVSV9JRExFX1BPV0VSX1NBVkUpOwotCQkJfQotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJPT0xFQU4gQ2FuY2VsbGVkOwotICAgICAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLSAgICAgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKLQkgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwJJkNhbmNlbGxlZCk7Ci0gICAgICAgIH0KLQkJfQotCi0gICAgICAgIC8vIExpbmsgZG93biBmaXJzdCBpZiBhbnkgYXNzb2NpYXRpb24gZXhpc3RzCi0gICAgICAgIGlmIChJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkpCi0gICAgICAgICAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKLSAgICAgICAgUlRNUHVzZWNEZWxheSgxMDAwMCk7Ci0gICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIC8vIENsZWFuIHVwIG9sZCBic3MgdGFibGUKLSAgICAgICAgQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOwotCi0gICAgICAgIC8qCi0gICAgICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKLSAgICAgICAgewotICAgICAgICAgICAgUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAxMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLSAgICB9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JLy8gU2V0IExFRC5Nb3ZlIHRvIGhlcmUgZm9yIGZpeGluZyBMRUQgYnVnLiBUaGlzIGZsYWcgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgTGlua0Rvd24KLQlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09GRik7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLS8vS0ggRGVidWc6QWxsIFBDSWUgZGV2aWNlcyBuZWVkIHRvIHVzZSB0aW1lciB0byBleGVjdXRlIHJhZGlvIG9mZiBmdW5jdGlvbiwgb3IgdGhlIFBDSWUmJkVuYWJsZU5ld1BTIG5lZWRzLgotLy9LSCBBbnM6SXQgaXMgcmlnaHQsIGJlY2F1c2Ugb25seSB3aGVuIHRoZSBQQ0llIGFuZCBFbmFibGVOZXdQcyBpcyB0cnVlLCB3ZSBuZWVkIHRvIGRlbGF5IHRoZSBSYWRpb09mZlRpbWVyCi0vL3RvIGF2b2lkIHRoZSBkZWFkbG9jayB3aXRoIFBDSWUgUG93ZXIgc2F2aW5nIGZ1bmN0aW9uLgotaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEmJgotCU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpJiYKLQlwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkKLQl7Ci0JUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAxMCk7Ci0JfQotZWxzZQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotewotCi0KLQlicmM9UlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHBBZCwgR1VJUkFESU9fT0ZGLCAwKTsKLQotCWlmIChicmM9PUZBTFNFKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCIlcyBjYWxsIFJUMjh4eFBjaUFzaWNSYWRpb09mZiBmYWlsICEhXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQl9Ci19Ci0vKgotCS8vIERpc2FibGUgVHgvUnggRE1BCi0JUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwkgICAvLyBkaXNhYmxlIERNQQotCUdsb0NmZy5maWVsZC5FbmFibGVUeERNQSA9IDA7Ci0JR2xvQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CSAgIC8vIGFib3J0IGFsbCBUWCByaW5ncwotCi0KLQkvLyBNQUNfU1lTX0NUUkwgPT4gdmFsdWUgPSAweDAgPT4gNDBtQQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMCk7Ci0KLQkvLyBQV1JfUElOX0NGRyA9PiB2YWx1ZSA9IDB4MCA9PiA0MG1BCi0JUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDApOwotCi0JLy8gVFhfUElOX0NGRyA9PiB2YWx1ZSA9IDB4MCA9PiAyMG1BCi0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgMCk7Ci0KLQlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQotCXsKLQkJLy8gTXVzdCB1c2luZyA0ME1Iei4KLQkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gTXVzdCB1c2luZyAyME1Iei4KLQkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCX0KLQotCS8vIFdhaXRpbmcgZm9yIERNQSBpZGxlCi0JaSA9IDA7Ci0JZG8KLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKLQkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQotCQkJYnJlYWs7Ci0KLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQl9d2hpbGUgKGkrKyA8IDEwMCk7Ci0qLwotfQotCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fcHJvZmlsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3Byb2ZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgwM2Y0Mi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fcHJvZmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMyMSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotCWNtbV9wcm9maWxlLmMKLQotICAgIEFic3RyYWN0OgotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0jZGVmaW5lIEVUSF9NQUNfQUREUl9TVFJfTEVOIDE3ICAvLyBpbiBmb3JtYXQgb2YgeHg6eHg6eHg6eHg6eHg6eHgKLQotLy8gV2UgYXNzdW1lIHRoZSBzMSBpcyBhIHN0aW5nLCBzMiBpcyBhIG1lbW9yeSBzcGFjZSB3aXRoIDYgYnl0ZXMuIGFuZCBjb250ZW50IG9mIHMxIHdpbGwgYmUgY2hhbmdlZC4KLUJPT0xFQU4gcnRzdHJtYWN0b2hleChQU1RSSU5HIHMxLCBQU1RSSU5HIHMyKQotewotCWludCBpID0gMDsKLQlQU1RSSU5HIHB0b2tTID0gczEsIHB0b2tFID0gczE7Ci0KLQlpZiAoc3RybGVuKHMxKSAhPSBFVEhfTUFDX0FERFJfU1RSX0xFTikKLQkJcmV0dXJuIEZBTFNFOwotCi0Jd2hpbGUoKCpwdG9rUykgIT0gJ1wwJykKLQl7Ci0JCWlmKChwdG9rRSA9IHN0cmNocihwdG9rUywgJzonKSkgIT0gTlVMTCkKLQkJCSpwdG9rRSsrID0gJ1wwJzsKLQkJaWYgKChzdHJsZW4ocHRva1MpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnB0b2tTKSkgfHwgKCFpc3hkaWdpdCgqKHB0b2tTKzEpKSkpCi0JCQlicmVhazsgLy8gZmFpbAotCQlBdG9IKHB0b2tTLCAoUFVDSEFSKSZzMltpKytdLCAxKTsKLQkJcHRva1MgPSBwdG9rRTsKLQkJaWYgKGkgPT0gNikKLQkJCWJyZWFrOyAvLyBwYXJzaW5nIGZpbmlzaGVkCi0JfQotCi0JcmV0dXJuICggaSA9PSA2ID8gVFJVRSA6IEZBTFNFKTsKLQotfQotCi0KLS8vIHdlIGFzc3VtZSB0aGUgczEgYW5kIHMyIGJvdGggYXJlIHN0cmluZ3MuCi1CT09MRUFOIHJ0c3RyY2FzZWNtcChQU1RSSU5HIHMxLCBQU1RSSU5HIHMyKQotewotCVBTVFJJTkcgcDEgPSBzMSwgcDIgPSBzMjsKLQotCWlmIChzdHJsZW4oczEpICE9IHN0cmxlbihzMikpCi0JCXJldHVybiBGQUxTRTsKLQotCXdoaWxlKCpwMSAhPSAnXDAnKQotCXsKLQkJaWYoKCpwMSAhPSAqcDIpICYmICgoKnAxIF4gKnAyKSAhPSAweDIwKSkKLQkJCXJldHVybiBGQUxTRTsKLQkJcDErKzsKLQkJcDIrKzsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLy8gd2UgYXNzdW1lIHRoZSBzMSAoYnVmZmVyKSBhbmQgczIgKGtleSkgYm90aCBhcmUgc3RyaW5ncy4KLVBTVFJJTkcgcnRzdHJzdHJ1bmNhc2VjbXAoUFNUUklORyBzMSwgUFNUUklORyBzMikKLXsKLQlJTlQgbDEsIGwyLCBpOwotCWNoYXIgdGVtcDEsIHRlbXAyOwotCi0JbDIgPSBzdHJsZW4oczIpOwotCWlmICghbDIpCi0JCXJldHVybiAoY2hhciAqKSBzMTsKLQotCWwxID0gc3RybGVuKHMxKTsKLQotCXdoaWxlIChsMSA+PSBsMikKLQl7Ci0JCWwxLS07Ci0KLQkJZm9yKGk9MDsgaTxsMjsgaSsrKQotCQl7Ci0JCQl0ZW1wMSA9ICooczEraSk7Ci0JCQl0ZW1wMiA9ICooczIraSk7Ci0KLQkJCWlmICgoJ2EnIDw9IHRlbXAxKSAmJiAodGVtcDEgPD0gJ3onKSkKLQkJCQl0ZW1wMSA9ICdBJysodGVtcDEtJ2EnKTsKLQkJCWlmICgoJ2EnIDw9IHRlbXAyKSAmJiAodGVtcDIgPD0gJ3onKSkKLQkJCQl0ZW1wMiA9ICdBJysodGVtcDItJ2EnKTsKLQotCQkJaWYgKHRlbXAxICE9IHRlbXAyKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGkgPT0gbDIpCi0JCQlyZXR1cm4gKGNoYXIgKikgczE7Ci0KLQkJczErKzsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsgLy8gbm90IGZvdW5kCi19Ci0KLS8vYWRkIGJ5IGthdGh5Ci0KLSAvKioKLSAgKiBzdHJzdHIgLSBGaW5kIHRoZSBmaXJzdCBzdWJzdHJpbmcgaW4gYSAlTlVMIHRlcm1pbmF0ZWQgc3RyaW5nCi0gICogQHMxOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCi0gICogQHMyOiBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IKLSAgKi8KLVBTVFJJTkcgcnRzdHJzdHIoUFNUUklORyBzMSxjb25zdCBQU1RSSU5HIHMyKQotewotCUlOVCBsMSwgbDI7Ci0KLQlsMiA9IHN0cmxlbihzMik7Ci0JaWYgKCFsMikKLQkJcmV0dXJuIHMxOwotCi0JbDEgPSBzdHJsZW4oczEpOwotCi0Jd2hpbGUgKGwxID49IGwyKQotCXsKLQkJbDEtLTsKLQkJaWYgKCFtZW1jbXAoczEsczIsbDIpKQotCQkJcmV0dXJuIHMxOwotCQlzMSsrOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi0vKioKLSAqIHJzdHJ0b2sgLSBTcGxpdCBhIHN0cmluZyBpbnRvIHRva2VucwotICogQHM6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQKLSAqIEBjdDogVGhlIGNoYXJhY3RlcnMgdG8gc2VhcmNoIGZvcgotICogKiBXQVJOSU5HOiBzdHJ0b2sgaXMgZGVwcmVjYXRlZCwgdXNlIHN0cnNlcCBpbnN0ZWFkLiBIb3dldmVyIHN0cnNlcCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG9sZCBhcmNoaXRlY3R1cmUuCi0gKi8KLVBTVFJJTkcgX19yc3RydG9rOwotUFNUUklORyByc3RydG9rKFBTVFJJTkcgcyxjb25zdCBQU1RSSU5HIGN0KQotewotCVBTVFJJTkcgc2JlZ2luLCBzZW5kOwotCi0Jc2JlZ2luICA9IHMgPyBzIDogX19yc3RydG9rOwotCWlmICghc2JlZ2luKQotCXsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jc2JlZ2luICs9IHN0cnNwbihzYmVnaW4sY3QpOwotCWlmICgqc2JlZ2luID09ICdcMCcpCi0JewotCQlfX3JzdHJ0b2sgPSBOVUxMOwotCQlyZXR1cm4oIE5VTEwgKTsKLQl9Ci0KLQlzZW5kID0gc3RycGJyayggc2JlZ2luLCBjdCk7Ci0JaWYgKHNlbmQgJiYgKnNlbmQgIT0gJ1wwJykKLQkJKnNlbmQrKyA9ICdcMCc7Ci0KLQlfX3JzdHJ0b2sgPSBzZW5kOwotCi0JcmV0dXJuIChzYmVnaW4pOwotfQotCi0vKioKLSAqIGRlbGltaXRjbnQgLSByZXR1cm4gdGhlIGNvdW50IG9mIGEgZ2l2ZW4gZGVsaW1pdGVyIGluIGEgZ2l2ZW4gc3RyaW5nLgotICogQHM6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQuCi0gKiBAY3Q6IFRoZSBkZWxpbWl0ZXIgdG8gc2VhcmNoIGZvci4KLSAqIE5vdGljZSA6IFdlIHN1cHBvc2UgdGhlIGRlbGltaXRlciBpcyBhIHNpbmdsZS1jaGFyIHN0cmluZyhmb3IgZXhhbXBsZSA6ICI7IikuCi0gKi8KLUlOVCBkZWxpbWl0Y250KFBTVFJJTkcgcyxQU1RSSU5HIGN0KQotewotCUlOVCBjb3VudCA9IDA7Ci0JLyogcG9pbnQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAqLwotCVBTVFJJTkcgdG9rZW4gPSBzOwotCi0JZm9yICggOzsgKQotCXsKLQkJdG9rZW4gPSBzdHJwYnJrKHRva2VuLCBjdCk7IC8qIHNlYXJjaCBmb3IgZGVsaW1pdGVycyAqLwotCi0gICAgICAgIGlmICggdG9rZW4gPT0gTlVMTCApCi0JCXsKLQkJCS8qIGFkdmFuY2VkIHRvIHRoZSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3RlciAqLwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogc2tpcCB0aGUgZGVsaW1pdGVyICovCi0JICAgICsrdG9rZW47Ci0KLQkJLyoKLQkJICogUHJpbnQgdGhlIGZvdW5kIHRleHQ6IHVzZSBsZW4gd2l0aCAlLipzIHRvIHNwZWNpZnkgZmllbGQgd2lkdGguCi0JCSAqLwotCi0JCS8qIGFjY3VtdWxhdGUgZGVsaW1pdGVyIGNvdW50ICovCi0JICAgICsrY291bnQ7Ci0JfQotICAgIHJldHVybiBjb3VudDsKLX0KLQotLyoKLSAgKiBjb252ZXJ0cyB0aGUgSW50ZXJuZXQgaG9zdCBhZGRyZXNzIGZyb20gdGhlIHN0YW5kYXJkIG51bWJlcnMtYW5kLWRvdHMgbm90YXRpb24KLSAgKiBpbnRvIGJpbmFyeSBkYXRhLgotICAqIHJldHVybnMgbm9uemVybyBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZCwgemVybyBpZiBub3QuCi0gICovCi1pbnQgcnRpbmV0X2F0b24oUFNUUklORyBjcCwgdW5zaWduZWQgaW50ICphZGRyKQotewotCXVuc2lnbmVkIGludAl2YWw7Ci0JaW50CQliYXNlLCBuOwotCVNUUklORwkJYzsKLQl1bnNpZ25lZCBpbnQgICAgcGFydHNbNF07Ci0JdW5zaWduZWQgaW50ICAgICpwcCA9IHBhcnRzOwotCi0JZm9yICg7OykKLSAgICB7Ci0gICAgICAgICAvKgotICAgICAgICAgICogQ29sbGVjdCBudW1iZXIgdXAgdG8gYGAuJycuCi0gICAgICAgICAgKiBWYWx1ZXMgYXJlIHNwZWNpZmllZCBhcyBmb3IgQzoKLSAgICAgICAgICAqCTB4PWhleCwgMD1vY3RhbCwgb3RoZXI9ZGVjaW1hbC4KLSAgICAgICAgICAqLwotICAgICAgICAgdmFsID0gMDsKLSAgICAgICAgIGJhc2UgPSAxMDsKLSAgICAgICAgIGlmICgqY3AgPT0gJzAnKQotICAgICAgICAgewotICAgICAgICAgICAgIGlmICgqKytjcCA9PSAneCcgfHwgKmNwID09ICdYJykKLSAgICAgICAgICAgICAgICAgYmFzZSA9IDE2LCBjcCsrOwotICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgYmFzZSA9IDg7Ci0gICAgICAgICB9Ci0gICAgICAgICB3aGlsZSAoKGMgPSAqY3ApICE9ICdcMCcpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpIGMpKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgdmFsID0gKHZhbCAqIGJhc2UpICsgKGMgLSAnMCcpOwotICAgICAgICAgICAgICAgICBjcCsrOwotICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaWYgKGJhc2UgPT0gMTYgJiYgaXN4ZGlnaXQoKHVuc2lnbmVkIGNoYXIpIGMpKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgdmFsID0gKHZhbCA8PCA0KSArCi0gICAgICAgICAgICAgICAgICAgICAoYyArIDEwIC0gKGlzbG93ZXIoKHVuc2lnbmVkIGNoYXIpIGMpID8gJ2EnIDogJ0EnKSk7Ci0gICAgICAgICAgICAgICAgIGNwKys7Ci0gICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgqY3AgPT0gJy4nKQotICAgICAgICAgewotICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICogSW50ZXJuZXQgZm9ybWF0OiBhLmIuYy5kIGEuYi5jICAgKHdpdGggYyB0cmVhdGVkIGFzIDE2LWJpdHMpCi0gICAgICAgICAgICAgICogYS5iICAgICAod2l0aCBiIHRyZWF0ZWQgYXMgMjQgYml0cykKLSAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICBpZiAocHAgPj0gcGFydHMgKyAzIHx8IHZhbCA+IDB4ZmYpCi0gICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICpwcCsrID0gdmFsLCBjcCsrOwotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgIGJyZWFrOwotICAgICB9Ci0KLSAgICAgLyoKLSAgICAgICogQ2hlY2sgZm9yIHRyYWlsaW5nIGp1bmsuCi0gICAgICAqLwotICAgICB3aGlsZSAoKmNwKQotICAgICAgICAgaWYgKCFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqY3ArKykpCi0gICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgLyoKLSAgICAgICogQ29uY29jdCB0aGUgYWRkcmVzcyBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBwYXJ0cyBzcGVjaWZpZWQuCi0gICAgICAqLwotICAgICBuID0gcHAgLSBwYXJ0cyArIDE7Ci0gICAgIHN3aXRjaCAobikKLSAgICAgewotCi0gICAgICAgICBjYXNlIDE6ICAgICAgICAgLyogYSAtLSAzMiBiaXRzICovCi0gICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgIGNhc2UgMjogICAgICAgICAvKiBhLmIgLS0gOC4yNCBiaXRzICovCi0gICAgICAgICAgICAgaWYgKHZhbCA+IDB4ZmZmZmZmKQotICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICB2YWwgfD0gcGFydHNbMF0gPDwgMjQ7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgIGNhc2UgMzogICAgICAgICAvKiBhLmIuYyAtLSA4LjguMTYgYml0cyAqLwotICAgICAgICAgICAgIGlmICh2YWwgPiAweGZmZmYpCi0gICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgIHZhbCB8PSAocGFydHNbMF0gPDwgMjQpIHwgKHBhcnRzWzFdIDw8IDE2KTsKLSAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgY2FzZSA0OiAgICAgICAgIC8qIGEuYi5jLmQgLS0gOC44LjguOCBiaXRzICovCi0gICAgICAgICAgICAgaWYgKHZhbCA+IDB4ZmYpCi0gICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgIHZhbCB8PSAocGFydHNbMF0gPDwgMjQpIHwgKHBhcnRzWzFdIDw8IDE2KSB8IChwYXJ0c1syXSA8PCA4KTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgfQotCi0gICAgICphZGRyID0gaHRvbmwodmFsKTsKLSAgICAgcmV0dXJuIDE7Ci0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIEZpbmQga2V5IHNlY3Rpb24gZm9yIEdldCBrZXkgcGFyYW1ldGVyLgotCi0gICAgQXJndW1lbnRzOgotICAgICAgICBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHN0YXJ0IGZpbmQgdGhlIGtleSBzZWN0aW9uCi0gICAgICAgIHNlY3Rpb24gICAgICAgICAgICAgICAgICAgICB0aGUga2V5IG9mIHRoZSBzZWNpb24gdG8gYmUgZmluZAotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgRmFpbAotICAgICAgICBPdGhlcnMgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcwotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVBTVFJJTkcgUlRNUEZpbmRTZWN0aW9uKAotICAgIElOICBQU1RSSU5HICAgYnVmZmVyKQotewotICAgIFNUUklORyB0ZW1wX2J1ZlszMl07Ci0gICAgUFNUUklORyAgcHRyOwotCi0gICAgc3RyY3B5KHRlbXBfYnVmLCAiRGVmYXVsdCIpOwotCi0gICAgaWYoKHB0ciA9IHJ0c3Ryc3RyKGJ1ZmZlciwgdGVtcF9idWYpKSAhPSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIChwdHIrc3RybGVuKCJcbiIpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgotICAgICAgICBHZXQga2V5IHBhcmFtZXRlci4KLQotICAgIEFyZ3VtZW50czoKLQlrZXkJCQlQb2ludGVyIHRvIGtleSBzdHJpbmcKLQlkZXN0CQkJUG9pbnRlciB0byBkZXN0aW5hdGlvbgotCWRlc3RzaXplCQlUaGUgZGF0YXNpemUgb2YgdGhlIGRlc3RpbmF0aW9uCi0JYnVmZmVyCQlQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RhcnQgZmluZCB0aGUga2V5Ci0JYlRyaW1TcGFjZQlTZXQgdHJ1ZSBpZiB5b3Ugd2FudCB0byBzdHJpcCB0aGUgc3BhY2UgY2hhcmFjdGVyIG9mIHRoZSByZXN1bHQgcGF0dGVybgotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBUUlVFICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcwotICAgICAgICBGQUxTRSAgICAgICAgICAgICAgICAgICAgICAgRmFpbAotCi0gICAgTm90ZToKLQlUaGlzIHJvdXRpbmUgZ2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBtYXRjaGVkIGtleSAoY2FzZSBjYXNlLXNlbnNpdGl2ZSkKLQlGb3IgU1NJRCBhbmQgc2VjdXJpdHkga2V5IHJlbGF0ZWQgcGFyYW1ldGVycywgd2UgU0hBTEwgTk9UIHRyaW0gdGhlIHNwYWNlKCcgJykgY2hhcmFjdGVyLgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBSVE1QR2V0S2V5UGFyYW1ldGVyKAotICAgIElOIFBTVFJJTkcga2V5LAotICAgIE9VVCBQU1RSSU5HIGRlc3QsCi0gICAgSU4gSU5UIGRlc3RzaXplLAotICAgIElOIFBTVFJJTkcgYnVmZmVyLAotICAgIElOIEJPT0xFQU4gYlRyaW1TcGFjZSkKLXsKLQlQU1RSSU5HIHBNZW1CdWYsIHRlbXBfYnVmMSA9IE5VTEwsIHRlbXBfYnVmMiA9IE5VTEw7Ci0JUFNUUklORyBzdGFydF9wdHIsIGVuZF9wdHI7Ci0JUFNUUklORyBwdHI7Ci0JUFNUUklORyBvZmZzZXQgPSBOVUxMOwotCUlOVCAgbGVuLCBrZXlMZW47Ci0KLQotCWtleUxlbiA9IHN0cmxlbihrZXkpOwotCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJnBNZW1CdWYsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSAgKiAyKTsKLQlpZiAocE1lbUJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4gKEZBTFNFKTsKLQotCW1lbXNldChwTWVtQnVmLCAwLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUgKiAyKTsKLQl0ZW1wX2J1ZjEgPSBwTWVtQnVmOwotCXRlbXBfYnVmMiA9IChQU1RSSU5HKShwTWVtQnVmICsgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKLQotCi0JLy9maW5kIHNlY3Rpb24KLQlpZigob2Zmc2V0ID0gUlRNUEZpbmRTZWN0aW9uKGJ1ZmZlcikpID09IE5VTEwpCi0JewotCQlvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKXBNZW1CdWYpOwotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0KLQlzdHJjcHkodGVtcF9idWYxLCAiXG4iKTsKLQlzdHJjYXQodGVtcF9idWYxLCBrZXkpOwotCXN0cmNhdCh0ZW1wX2J1ZjEsICI9Iik7Ci0KLQkvL3NlYXJjaCBrZXkKLQlpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKG9mZnNldCwgdGVtcF9idWYxKSkgPT0gTlVMTCkKLQl7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpcE1lbUJ1Zik7Ci0JCXJldHVybiAoRkFMU0UpOwotCX0KLQotCXN0YXJ0X3B0ciArPSBzdHJsZW4oIlxuIik7Ci0JaWYoKGVuZF9wdHIgPSBydHN0cnN0cihzdGFydF9wdHIsICJcbiIpKT09TlVMTCkKLQkJZW5kX3B0ciA9IHN0YXJ0X3B0citzdHJsZW4oc3RhcnRfcHRyKTsKLQotCWlmIChlbmRfcHRyPHN0YXJ0X3B0cikKLQl7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpcE1lbUJ1Zik7Ci0JCXJldHVybiAoRkFMU0UpOwotCX0KLQotCU5kaXNNb3ZlTWVtb3J5KHRlbXBfYnVmMiwgc3RhcnRfcHRyLCBlbmRfcHRyLXN0YXJ0X3B0cik7Ci0JdGVtcF9idWYyW2VuZF9wdHItc3RhcnRfcHRyXT0nXDAnOwotCWlmKChzdGFydF9wdHI9cnRzdHJzdHIodGVtcF9idWYyLCAiPSIpKSA9PSBOVUxMKQotCXsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgKFBVQ0hBUilwTWVtQnVmKTsKLQkJcmV0dXJuIChGQUxTRSk7Ci0JfQotCXB0ciA9IChzdGFydF9wdHIgKzEpOwotCS8vdHJpbSBzcGVjaWFsIGNoYXJhY3RlcnMsIGkuZS4sICBUQUIgb3Igc3BhY2UKLQl3aGlsZSgqc3RhcnRfcHRyICE9IDB4MDApCi0JewotCQlpZiggKCgqcHRyID09ICcgJykgJiYgYlRyaW1TcGFjZSkgfHwgKCpwdHIgPT0gJ1x0JykgKQotCQkJcHRyKys7Ci0JCWVsc2UKLQkJCWJyZWFrOwotCX0KLQlsZW4gPSBzdHJsZW4oc3RhcnRfcHRyKTsKLQotCW1lbXNldChkZXN0LCAweDAwLCBkZXN0c2l6ZSk7Ci0Jc3RybmNweShkZXN0LCBwdHIsICgobGVuID49IGRlc3RzaXplKSA/IGRlc3RzaXplOiBsZW4pKTsKLQotCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpcE1lbUJ1Zik7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICAgICAgR2V0IG11bHRpcGxlIGtleSBwYXJhbWV0ZXIuCi0KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIGtleSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGtleSBzdHJpbmcKLSAgICAgICAgZGVzdCAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gZGVzdGluYXRpb24KLSAgICAgICAgZGVzdHNpemUgICAgICAgICAgICAgICAgICAgIFRoZSBkYXRhc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24KLSAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdGFydCBmaW5kIHRoZSBrZXkKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKLSAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKLQotICAgIE5vdGU6Ci0gICAgICAgIFRoaXMgcm91dGluZSBnZXQgdGhlIHZhbHVlIHdpdGggdGhlIG1hdGNoZWQga2V5IChjYXNlIGNhc2Utc2Vuc2l0aXZlKQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBSVE1QR2V0S2V5UGFyYW1ldGVyV2l0aE9mZnNldCgKLSAgICBJTiAgUFNUUklORyAgIGtleSwKLSAgICBPVVQgUFNUUklORyAgIGRlc3QsCi0gICAgT1VUCVVTSE9SVAkqZW5kX29mZnNldCwKLSAgICBJTiAgSU5UICAgICBkZXN0c2l6ZSwKLSAgICBJTiAgUFNUUklORyAgIGJ1ZmZlciwKLSAgICBJTglCT09MRUFOCWJUcmltU3BhY2UpCi17Ci0gICAgUFNUUklORyB0ZW1wX2J1ZjEgPSBOVUxMOwotICAgIFBTVFJJTkcgdGVtcF9idWYyID0gTlVMTDsKLSAgICBQU1RSSU5HIHN0YXJ0X3B0cjsKLSAgICBQU1RSSU5HIGVuZF9wdHI7Ci0gICAgUFNUUklORyBwdHI7Ci0gICAgUFNUUklORyBvZmZzZXQgPSAwOwotICAgIElOVCAgbGVuOwotCi0JaWYgKCplbmRfb2Zmc2V0ID49IE1BWF9JTklfQlVGRkVSX1NJWkUpCi0JCXJldHVybiAoRkFMU0UpOwotCi0Jb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmdGVtcF9idWYxLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOwotCi0JaWYodGVtcF9idWYxID09IE5VTEwpCi0gICAgICAgIHJldHVybiAoRkFMU0UpOwotCi0Jb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmdGVtcF9idWYyLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOwotCWlmKHRlbXBfYnVmMiA9PSBOVUxMKQotCXsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgKFBVQ0hBUil0ZW1wX2J1ZjEpOwotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLQl9Ci0KLSAgICAvL2ZpbmQgc2VjdGlvbgotCWlmKCplbmRfb2Zmc2V0ID09IDApCi0gICAgewotCQlpZiAoKG9mZnNldCA9IFJUTVBGaW5kU2VjdGlvbihidWZmZXIpKSA9PSBOVUxMKQotCQl7Ci0JCQlvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKXRlbXBfYnVmMSk7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpdGVtcF9idWYyKTsKLQkgICAgcmV0dXJuIChGQUxTRSk7Ci0JCX0KLSAgICB9Ci0JZWxzZQotCQlvZmZzZXQgPSBidWZmZXIgKyAoKmVuZF9vZmZzZXQpOwotCi0gICAgc3RyY3B5KHRlbXBfYnVmMSwgIlxuIik7Ci0gICAgc3RyY2F0KHRlbXBfYnVmMSwga2V5KTsKLSAgICBzdHJjYXQodGVtcF9idWYxLCAiPSIpOwotCi0gICAgLy9zZWFyY2gga2V5Ci0gICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cihvZmZzZXQsIHRlbXBfYnVmMSkpPT1OVUxMKQotICAgIHsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgKFBVQ0hBUil0ZW1wX2J1ZjEpOwotCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpdGVtcF9idWYyKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0gICAgfQotCi0gICAgc3RhcnRfcHRyKz1zdHJsZW4oIlxuIik7Ci0gICAgaWYoKGVuZF9wdHI9cnRzdHJzdHIoc3RhcnRfcHRyLCAiXG4iKSk9PU5VTEwpCi0gICAgICAgZW5kX3B0cj1zdGFydF9wdHIrc3RybGVuKHN0YXJ0X3B0cik7Ci0KLSAgICBpZiAoZW5kX3B0cjxzdGFydF9wdHIpCi0gICAgewotCQlvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKXRlbXBfYnVmMSk7Ci0Jb3NfZnJlZV9tZW0oTlVMTCwgKFBVQ0hBUil0ZW1wX2J1ZjIpOwotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLSAgICB9Ci0KLQkqZW5kX29mZnNldCA9IGVuZF9wdHIgLSBidWZmZXI7Ci0KLSAgICBOZGlzTW92ZU1lbW9yeSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0ciwgZW5kX3B0ci1zdGFydF9wdHIpOwotICAgIHRlbXBfYnVmMltlbmRfcHRyLXN0YXJ0X3B0cl09J1wwJzsKLSAgICBsZW4gPSBzdHJsZW4odGVtcF9idWYyKTsKLSAgICBzdHJjcHkodGVtcF9idWYxLCB0ZW1wX2J1ZjIpOwotICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIodGVtcF9idWYxLCAiPSIpKSA9PSBOVUxMKQotICAgIHsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgKFBVQ0hBUil0ZW1wX2J1ZjEpOwotCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpdGVtcF9idWYyKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0gICAgfQotCi0gICAgc3RyY3B5KHRlbXBfYnVmMiwgc3RhcnRfcHRyKzEpOwotICAgIHB0ciA9IHRlbXBfYnVmMjsKLSAgICAvL3RyaW0gc3BhY2Ugb3IgdGFiCi0gICAgd2hpbGUoKnB0ciAhPSAweDAwKQotICAgIHsKLSAgICAgICAgaWYoKGJUcmltU3BhY2UgJiYgKCpwdHIgPT0gJyAnKSkgfHwgKCpwdHIgPT0gJ1x0JykgKQotICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgbGVuID0gc3RybGVuKHB0cik7Ci0gICAgbWVtc2V0KGRlc3QsIDB4MDAsIGRlc3RzaXplKTsKLSAgICBzdHJuY3B5KGRlc3QsIHB0ciwgbGVuID49IGRlc3RzaXplID8gIGRlc3RzaXplOiBsZW4pOwotCi0Jb3NfZnJlZV9tZW0oTlVMTCwgKFBVQ0hBUil0ZW1wX2J1ZjEpOwotICAgIG9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpdGVtcF9idWYyKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi1zdGF0aWMgaW50IHJ0bXBfcGFyc2Vfa2V5X2J1ZmZlcl9mcm9tX2ZpbGUoSU4gIFBSVE1QX0FEQVBURVIgcEFkLElOICBQU1RSSU5HIGJ1ZmZlcixJTiAgVUxPTkcgS2V5VHlwZSxJTiAgSU5UIEJTU0lkeCxJTiAgSU5UIEtleUlkeCkKLXsKLQlQU1RSSU5HCQlrZXlidWZmOwotCS8vSU5UCQkJaSA9IEJTU0lkeCwgaWR4ID0gS2V5SWR4LCByZXRWYWw7Ci0JVUxPTkcJCUtleUxlbjsKLQkvL1VDSEFSCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0JQ0lQSEVSX0tFWQkqcFNoYXJlZEtleTsKLQotCWtleWJ1ZmYgPSBidWZmZXI7Ci0JS2V5TGVuID0gc3RybGVuKGtleWJ1ZmYpOwotCXBTaGFyZWRLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTSWR4XVtLZXlJZHhdOwotCi0JaWYoKChLZXlUeXBlICE9IDApICYmIChLZXlUeXBlICE9IDEpKSB8fAotCSAgICAoKEtleVR5cGUgPT0gMCkgJiYgKEtleUxlbiAhPSAxMCkgJiYgKEtleUxlbiAhPSAyNikpIHx8Ci0JICAgICgoS2V5VHlwZT09IDEpICYmIChLZXlMZW4gIT0gNSkgJiYgKEtleUxlbiAhPSAxMykpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiS2V5JWRTdHIgaXMgSW52YWxpZCBrZXkgbGVuZ3RoKCVsZCkgb3IgVHlwZSglbGQpXG4iLAotCQkJCQkJCQlLZXlJZHgrMSwgS2V5TGVuLCBLZXlUeXBlKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JZWxzZQotCXsKLQkJcmV0dXJuIFJUX0NmZ1NldFdlcEtleShwQWQsIGJ1ZmZlciwgcFNoYXJlZEtleSwgS2V5SWR4KTsKLQl9Ci0KLX0KLQotCi1zdGF0aWMgdm9pZCBydG1wX3JlYWRfa2V5X3Bhcm1zX2Zyb21fZmlsZShJTiAgUFJUTVBfQURBUFRFUiBwQWQsIFBTVFJJTkcgdG1wYnVmLCBQU1RSSU5HIGJ1ZmZlcikKLXsKLQlTVFJJTkcJCXRva19zdHJbMTZdOwotCVBTVFJJTkcJCW1hY3B0cjsKLQlJTlQJCQlpID0gMCwgaWR4OwotCVVMT05HCQlLZXlUeXBlW01BWF9NQlNTSURfTlVNXTsKLQlVTE9ORwkJS2V5SWR4OwotCi0JTmRpc1plcm9NZW1vcnkoS2V5VHlwZSwgc2l6ZW9mKEtleVR5cGUpKTsKLQotCS8vRGVmYXVsdEtleUlECi0JaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRGVmYXVsdEtleUlEIiwgdG1wYnVmLCAyNSwgYnVmZmVyLCBUUlVFKSkKLQl7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJS2V5SWR4ID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCWlmKChLZXlJZHggPj0gMSApICYmIChLZXlJZHggPD0gNCkpCi0JCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSAoS2V5SWR4IC0gMSk7Ci0JCQllbHNlCi0JCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gMDsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGVmYXVsdEtleUlEKDB+Myk9JWRcbiIsIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JfQotCi0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IDQ7IGlkeCsrKQotCXsKLQkJc3ByaW50Zih0b2tfc3RyLCAiS2V5JWRUeXBlIiwgaWR4ICsgMSk7Ci0JCS8vS2V5MVR5cGUKLQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIodG9rX3N0ciwgdG1wYnVmLCAxMjgsIGJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJICAgIGZvciAoaSA9IDAsIG1hY3B0ciA9IHJzdHJ0b2sodG1wYnVmLCI7Iik7IG1hY3B0cjsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKLQkJICAgIHsKLQkJCQkvKgotCQkJCQlkbyBzYW5pdHkgY2hlY2sgZm9yIEtleVR5cGUgbGVuZ3RoOwotCQkJCQlvciBpbiBzdGF0aW9uIG1vZGUsIHRoZSBLZXlUeXBlIGxlbmd0aCA+IDEsCi0JCQkJCXRoZSBjb2RlIHdpbGwgb3ZlcndyaXRlIHRoZSBzdGFjayBvZiBjYWxsZXIKLQkJCQkJKFJUTVBTZXRQcm9maWxlUGFyYW1ldGVycykgYW5kIGNhdXNlIHNyY2J1ZiA9IE5VTEwKLQkJCQkqLwotCQkJCWlmIChpIDwgTUFYX01CU1NJRF9OVU0pCi0JCQkJCUtleVR5cGVbaV0gPSBzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApOwotCQkgICAgfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJewotCQkJCXNwcmludGYodG9rX3N0ciwgIktleSVkU3RyIiwgaWR4ICsgMSk7Ci0JCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIodG9rX3N0ciwgdG1wYnVmLCAxMjgsIGJ1ZmZlciwgRkFMU0UpKQotCQkJCXsKLQkJCQkJcnRtcF9wYXJzZV9rZXlfYnVmZmVyX2Zyb21fZmlsZShwQWQsIHRtcGJ1ZiwgS2V5VHlwZVtCU1MwXSwgQlNTMCwgaWR4KTsKLQkJCQl9Ci0JCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCX0KLQl9Ci19Ci0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1zdGF0aWMgdm9pZCBydG1wX3JlYWRfc3RhX3dtbV9wYXJtc19mcm9tX2ZpbGUoSU4gIFBSVE1QX0FEQVBURVIgcEFkLCBjaGFyICp0bXBidWYsIGNoYXIgKmJ1ZmZlcikKLXsKLQlQU1RSSU5HCQkJCQltYWNwdHI7Ci0JSU5UCQkJCQkJaT0wOwotCUJPT0xFQU4JCQkJCWJXbW1FbmFibGUgPSBGQUxTRTsKLQotCS8vV21tQ2FwYWJsZQotCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIldtbUNhcGFibGUiLCB0bXBidWYsIDMyLCBidWZmZXIsIFRSVUUpKQotCXsKLQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAvL0VuYWJsZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IFRSVUU7Ci0JCQliV21tRW5hYmxlID0gVFJVRTsKLQkJfQotCQllbHNlIC8vRGlzYWJsZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IEZBTFNFOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV21tQ2FwYWJsZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKLQl9Ci0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkvL0RMU0NhcGFibGUKLQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJETFNDYXBhYmxlIiwgdG1wYnVmLCAzMiwgYnVmZmVyLCBUUlVFKSkKLQl7Ci0JCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlID0gVFJVRTsKLQkJfQotCQllbHNlIC8vRGlzYWJsZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSA9IEZBTFNFOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiYkRMU0NhcGFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKSk7Ci0JfQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0JLy9BY2tQb2xpY3kgZm9yIEFDX0JLLCBBQ19CRSwgQUNfVkksIEFDX1ZPCi0JaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQWNrUG9saWN5IiwgdG1wYnVmLCAzMiwgYnVmZmVyLCBUUlVFKSkKLQl7Ci0JCWZvciAoaSA9IDAsIG1hY3B0ciA9IHJzdHJ0b2sodG1wYnVmLCI7Iik7IG1hY3B0cjsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKLQkJewotCQkJcEFkLT5Db21tb25DZmcuQWNrUG9saWN5W2ldID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2wobWFjcHRyLCAwLCAxMCk7Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFja1BvbGljeVslZF09JWRcbiIsIGksIHBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtpXSkpOwotCQl9Ci0JfQotCi0JaWYgKGJXbW1FbmFibGUpCi0JewotCQkvL0FQU0RDYXBhYmxlCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkFQU0RDYXBhYmxlIiwgdG1wYnVmLCAxMCwgYnVmZmVyLCBUUlVFKSkKLQkJewotCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKLQkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSBUUlVFOwotCQkJZWxzZQotCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSA9IEZBTFNFOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBUFNEQ2FwYWJsZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlKSk7Ci0JCX0KLQotCQkvL01heFNQTGVuZ3RoCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIk1heFNQTGVuZ3RoIiwgdG1wYnVmLCAxMCwgYnVmZmVyLCBUUlVFKSkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYXhTUExlbmd0aD0lZFxuIiwgcEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGgpKTsKLQkJfQotCi0JCS8vQVBTREFDIGZvciBBQ19CRSwgQUNfQkssIEFDX1ZJLCBBQ19WTwotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBUFNEQUMiLCB0bXBidWYsIDMyLCBidWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlCT09MRUFOIGFwc2RfYWNbNF07Ci0KLQkJCWZvciAoaSA9IDAsIG1hY3B0ciA9IHJzdHJ0b2sodG1wYnVmLCI7Iik7IG1hY3B0cjsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKLQkJCXsKLQkJCQlhcHNkX2FjW2ldID0gKEJPT0xFQU4pc2ltcGxlX3N0cnRvbChtYWNwdHIsIDAsIDEwKTsKLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFQU0RBQyVkICAlZFxuIiwgaSwgIGFwc2RfYWNbaV0pKTsKLQkJCX0KLQotCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSA9IGFwc2RfYWNbMF07Ci0JCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLID0gYXBzZF9hY1sxXTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPSBhcHNkX2FjWzJdOwotCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTyA9IGFwc2RfYWNbM107Ci0KLQkJCXBBZC0+Q29tbW9uQ2ZnLmJBQ01BUFNEVHJbMF0gPSBhcHNkX2FjWzBdOwotCQkJcEFkLT5Db21tb25DZmcuYkFDTUFQU0RUclsxXSA9IGFwc2RfYWNbMV07Ci0JCQlwQWQtPkNvbW1vbkNmZy5iQUNNQVBTRFRyWzJdID0gYXBzZF9hY1syXTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJBQ01BUFNEVHJbM10gPSBhcHNkX2FjWzNdOwotCQl9Ci0JfQotCi19Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotc3RhdGljIHZvaWQgSFRQYXJhbWV0ZXJzSG9vaygKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglQU1RSSU5HCQkgIHBWYWx1ZVN0ciwKLQlJTglQU1RSSU5HCQkgIHBJbnB1dCkKLXsKLQotCWxvbmcgVmFsdWU7Ci0KLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfUFJPVEVDVCIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0gICAgewotICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0gICAgICAgIGlmIChWYWx1ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogUHJvdGVjdGlvbiAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7Ci0gICAgfQotCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX01JTU9QU0VuYWJsZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0gICAgewotICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0gICAgICAgIGlmIChWYWx1ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTUlNT1BTRW5hYmxlICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKLSAgICB9Ci0KLQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NSU1PUFNNb2RlIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLSAgICB7Ci0gICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLSAgICAgICAgaWYgKFZhbHVlID4gTU1QU19FTkFCTEUpCi0gICAgICAgIHsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE1NUFNfRU5BQkxFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy9UT0RPOiBhZGQgbWltbyBwb3dlciBzYXZpbmcgbWVjaGFuaXNtCi0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBNTVBTX0VOQUJMRTsKLQkJCS8vcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gVmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1JTU9QUyBNb2RlICA9ICVkXG4iLCAoSU5UKSBWYWx1ZSkpOwotICAgIH0KLQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9CQURlY2xpbmUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQsIFRSVUUpKQotICAgIHsKLSAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotICAgICAgICBpZiAoVmFsdWUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEJBIERlY2xpbmUgID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOwotICAgIH0KLQotCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0Rpc2FibGVSZW9yZGVyaW5nIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLSAgICB7Ci0gICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLSAgICAgICAgaWYgKFZhbHVlID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogRGlzYWJsZVJlb3JkZXJpbmcgID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOwotICAgIH0KLQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9BdXRvQkEiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQsIFRSVUUpKQotICAgIHsKLSAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotICAgICAgICBpZiAoVmFsdWUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOwotCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IEJBX05PVFVTRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOwotCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IElNTUVEX0JBOwotICAgICAgICB9Ci0gICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBOwotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQXV0byBCQSAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7Ci0gICAgfQotCi0JLy8gVHhfK0hUQyBmcmFtZQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9IVEMiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQsIFRSVUUpKQotCXsKLQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCQlpZiAoVmFsdWUgPT0gMCkKLQkJewotCQkJcEFkLT5IVENFbmFibGUgPSBGQUxTRTsKLQkJfQotCQllbHNlCi0JCXsKLSAgICAgICAgICAgIHBBZC0+SFRDRW5hYmxlID0gVFJVRTsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogVHggK0hUQyBmcmFtZSA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKLQl9Ci0KLQkvLyBFbmFibGUgSFQgTGluayBBZGFwdGF0aW9uIENvbnRyb2wKLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTGlua0FkYXB0IiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQkJaWYgKFZhbHVlID09IDApCi0JCXsKLQkJCXBBZC0+YkxpbmtBZGFwdCA9IEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEFkLT5IVENFbmFibGUgPSBUUlVFOwotCQkJcEFkLT5iTGlua0FkYXB0ID0gVFJVRTsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTGluayBBZGFwdGF0aW9uIENvbnRyb2wgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUoK0hUQykiKSk7Ci0JfQotCi0JLy8gUmV2ZXJzZSBEaXJlY3Rpb24gTWVjaGFuaXNtCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1JERyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCWlmIChWYWx1ZSA9PSAwKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iUmRnID0gRkFMU0U7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iUmRnID0gVFJVRTsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogUkRHID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlKCtIVEMpIikpOwotCX0KLQotCi0KLQotCS8vIFR4IEEtTVNVRCA/Ci0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0FNU0RVIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQkJaWYgKFZhbHVlID09IDApCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID0gVFJVRTsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogVHggQS1NU0RVID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOwotCX0KLQotCS8vIE1QRFUgRGVuc2l0eQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NcGR1RGVuc2l0eSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCWlmIChWYWx1ZSA8PTcgJiYgVmFsdWUgPj0gMCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gVmFsdWU7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTVBEVSBEZW5zaXR5ID0gJWRcbiIsIChJTlQpIFZhbHVlKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSA0OwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1QRFUgRGVuc2l0eSA9ICVkIChEZWZhdWx0KVxuIiwgNCkpOwotCQl9Ci0JfQotCi0JLy8gTWF4IFJ4IEJBIFdpbmRvdyBTaXplCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0JBV2luU2l6ZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0KLQkJaWYgKFZhbHVlID49MSAmJiBWYWx1ZSA8PSA2NCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOwotCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEJBIFdpbmR3IFNpemUgPSAlZFxuIiwgKElOVCkgVmFsdWUpKTsKLQkJfQotCQllbHNlCi0JCXsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBCQSBXaW5kdyBTaXplID0gNjQgKERlZnVhbHQpXG4iKSk7Ci0JCX0KLQotCX0KLQotCS8vIEd1YXJkIEludGVydmFsCi0JaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0dJIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQotCQlpZiAoVmFsdWUgPT0gR0lfNDAwKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSA9IEdJXzQwMDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJID0gR0lfODAwOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEd1YXJkIEludGVydmFsID0gJXNcbiIsIChWYWx1ZT09R0lfNDAwKSA/ICI0MDAiIDogIjgwMCIgKSk7Ci0JfQotCi0JLy8gSFQgT3BlcmF0aW9uIE1vZGUgOiBNaXhlZCBNb2RlICwgR3JlZW4gRmllbGQKLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfT3BNb2RlIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQotCQlpZiAoVmFsdWUgPT0gSFRNT0RFX0dGKQotCQl7Ci0KLQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUgID0gSFRNT0RFX0dGOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfTU07Ci0JCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogT3BlcmF0ZSBNb2RlID0gJXNcbiIsIChWYWx1ZT09SFRNT0RFX0dGKSA/ICJHcmVlbiBGaWVsZCIgOiAiTWl4ZWQgTW9kZSIgKSk7Ci0JfQotCi0JLy8gRml4ZWQgVHggbW9kZSA6IENDSywgT0ZETQotCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJGaXhlZFR4TW9kZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlVQ0hBUglmaXhfdHhfbW9kZTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQlmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKLQotCQkJaWYgKHN0cmNtcChwVmFsdWVTdHIsICJPRkRNIikgPT0gMCB8fCBzdHJjbXAocFZhbHVlU3RyLCAib2ZkbSIpID09IDApCi0JCQl7Ci0JCQkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfT0ZETTsKLQkJCX0KLQkJCWVsc2UgaWYgKHN0cmNtcChwVmFsdWVTdHIsICJDQ0siKSA9PSAwIHx8IHN0cmNtcChwVmFsdWVTdHIsICJjY2siKSA9PSAwKQotCQkJewotCQkgICAgICAgIGZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0NDSzsKLQkJCX0KLQkJCWVsc2UgaWYgKHN0cmNtcChwVmFsdWVTdHIsICJIVCIpID09IDAgfHwgc3RyY21wKHBWYWx1ZVN0ciwgImh0IikgPT0gMCkKLQkJCXsKLQkJICAgICAgICBmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCQkJLy8gMSA6IENDSwotCQkJCS8vIDIgOiBPRkRNCi0JCQkJLy8gb3RoZXJ3aXNlIDogSFQKLQkJCQlpZiAoVmFsdWUgPT0gRklYRURfVFhNT0RFX0NDSyB8fCBWYWx1ZSA9PSBGSVhFRF9UWE1PREVfT0ZETSkKLQkJCQkJZml4X3R4X21vZGUgPSBWYWx1ZTsKLQkJCQllbHNlCi0JCQkJCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOwotCQl9Ci0KLQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUgPSBmaXhfdHhfbW9kZTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZpeGVkIFR4IE1vZGUgPSAlZFxuIiwgZml4X3R4X21vZGUpKTsKLQotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JfQotCi0KLQkvLyBDaGFubmVsIFdpZHRoCi0JaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0JXIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQotCQlpZiAoVmFsdWUgPT0gQldfNDApCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV180MDsKLQkJfQotCQllbHNlCi0JCXsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKLQkJfQotCi0jaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQwotCQlwQWQtPkNvbW1vbkNmZy5NQ2FzdFBoeU1vZGUuZmllbGQuQlcgPSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlc7Ci0jZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBDaGFubmVsIFdpZHRoID0gJXNcbiIsIChWYWx1ZT09QldfNDApID8gIjQwIE1IeiIgOiAiMjAgTUh6IiApKTsKLQl9Ci0KLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfRVhUQ0hBIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQotCQlpZiAoVmFsdWUgPT0gMCkKLQkJewotCi0JCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBICA9IEVYVENIQV9CRUxPVzsKLQkJfQotCQllbHNlCi0JCXsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQUJPVkU7Ci0JCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogRXh0IENoYW5uZWwgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJCRUxPVyIgOiAiQUJPVkUiICkpOwotCX0KLQotCS8vIE1TQwotCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NQ1MiLCBwVmFsdWVTdHIsIDUwLCBwSW5wdXQsIFRSVUUpKQotCXsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0KLS8vCQkJaWYgKChWYWx1ZSA+PSAwICYmIFZhbHVlIDw9IDE1KSB8fCAoVmFsdWUgPT0gMzIpKQotCQkJaWYgKChWYWx1ZSA+PSAwICYmIFZhbHVlIDw9IDIzKSB8fCAoVmFsdWUgPT0gMzIpKSAvLyAzKjMKLQkJewotCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICA9IFZhbHVlOwotCQkJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1DUyA9ICVkXG4iLCBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUykpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICA9IE1DU19BVVRPOwotCQkJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTUNTID0gQVVUT1xuIikpOwotCQl9Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLQotCS8vIFNUQkMKLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfU1RCQyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCWlmIChWYWx1ZSA9PSBTVEJDX1VTRSkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDID0gU1RCQ19OT05FOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBTVEJDID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDKSk7Ci0JfQotCi0JLy8gNDBfTWh6X0ludG9sZXJhbnQKLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfNDBNSFpfSU5UT0xFUkFOVCIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCWlmIChWYWx1ZSA9PSAwKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iRm9ydHlfTWh6X0ludG9sZXJhbnQgPSBGQUxTRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJGb3J0eV9NaHpfSW50b2xlcmFudCA9IFRSVUU7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IDQwTUhaIElOVE9MRVJBTlQgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50KSk7Ci0JfQotCS8vSFRfVHhTdHJlYW0KLQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9UeFN0cmVhbSIsIHBWYWx1ZVN0ciwgMTAsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCkpCi0JCXsKLQkJCWNhc2UgMToKLQkJCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAyOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOiAvLyAzKjMKLQkJCWRlZmF1bHQ6Ci0JCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAzOwotCi0JCQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18yODgzX1ZFUlNJT04pCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gMjsgLy8gb25seSAyIHR4IHN0cmVhbXMgZm9yIFJUMjg2MCBzZXJpZXMKLQkJCQlicmVhazsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogVHggU3RyZWFtID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtKSk7Ci0JfQotCS8vSFRfUnhTdHJlYW0KLQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9SeFN0cmVhbSIsIHBWYWx1ZVN0ciwgMTAsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCkpCi0JCXsKLQkJCWNhc2UgMToKLQkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOgotCQkJZGVmYXVsdDoKLQkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDM7Ci0KLQkJCQlpZiAocEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzI4ODNfVkVSU0lPTikKLQkJCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOyAvLyBvbmx5IDIgcnggc3RyZWFtcyBmb3IgUlQyODYwIHNlcmllcwotCQkJCWJyZWFrOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBSeCBTdHJlYW0gPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUnhTdHJlYW0pKTsKLQl9Ci0JLy8yMDA4LzExLzA1OiBLSCBhZGQgdG8gc3VwcG9ydCBBbnRlbm5hIHBvd2VyLXNhdmluZyBvZiBBUDwtLQotCS8vR3JlZW4gQVAKLQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJHcmVlbkFQIiwgcFZhbHVlU3RyLCAxMCwgcElucHV0LCBUUlVFKSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQkJaWYgKFZhbHVlID09IDApCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJHcmVlbkFQRW5hYmxlID0gRkFMU0U7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iR3JlZW5BUEVuYWJsZSA9IFRSVUU7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEdyZWVuIEFQPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuYkdyZWVuQVBFbmFibGUpKTsKLQl9Ci0KLQkvLyBIVF9EaXNhbGxvd1RLSVAKLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfRGlzYWxsb3dUS0lQIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQotCQlpZiAoVmFsdWUgPT0gMSkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuSFRfRGlzYWxsb3dUS0lQID0gVFJVRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkhUX0Rpc2FsbG93VEtJUCA9IEZBTFNFOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IERpc2FsbG93IFRLSVAgbW9kZSA9ICVzXG4iLCAocEFkLT5Db21tb25DZmcuSFRfRGlzYWxsb3dUS0lQID09IFRSVUUpID8gIk9OIiA6ICJPRkYiICkpOwotCX0KLQotCi0JLy8yMDA4LzExLzA1OktIIGFkZCB0byBzdXBwb3J0IEFudGVubmEgcG93ZXItc2F2aW5nIG9mIEFQLS0+Ci19Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQotTkRJU19TVEFUVVMJUlRNUFNldFByb2ZpbGVQYXJhbWV0ZXJzKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFBTVFJJTkcJcEJ1ZmZlcikKLXsKLQlQU1RSSU5HCQkJCQl0bXBidWY7Ci0JVUxPTkcJCQkJCVJ0c1RocmVzaDsKLQlVTE9ORwkJCQkJRnJhZ1RocmVzaDsKLQlQU1RSSU5HCQkJCQltYWNwdHI7Ci0JSU5UCQkJCQkJaSA9IDAsIHJldHZhbDsKLQl0bXBidWYgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOwotCWlmKHRtcGJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQotCWRvCi0JewotCQkvLyBzZXQgZmlsZSBwYXJhbWV0ZXIgdG8gcG9ydGNmZwotCQkvL0NvdW50cnlSZWdpb24KLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ291bnRyeVJlZ2lvbiIsIHRtcGJ1ZiwgMjUsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlyZXR2YWwgPSBSVF9DZmdTZXRDb3VudHJ5UmVnaW9uKHBBZCwgdG1wYnVmLCBCQU5EXzI0Ryk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDb3VudHJ5UmVnaW9uPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKSk7Ci0JCX0KLQkJLy9Db3VudHJ5UmVnaW9uQUJhbmQKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ291bnRyeVJlZ2lvbkFCYW5kIiwgdG1wYnVmLCAyNSwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCXJldHZhbCA9IFJUX0NmZ1NldENvdW50cnlSZWdpb24ocEFkLCB0bXBidWYsIEJBTkRfNUcpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ291bnRyeVJlZ2lvbkFCYW5kPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpKTsKLQkJfQotI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAotI2lmZGVmIFJUMzB4eAotCQkvL0VmdXNlQnVmZmVyTW9kZQotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJFZnVzZUJ1ZmZlck1vZGUiLCB0bXBidWYsIDI1LCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJcEFkLT5iRUVQUk9NRmlsZSA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkVmdXNlQnVmZmVyTW9kZT0lZFxuIiwgcEFkLT5iVXNlRWZ1c2UpKTsKLQkJfQotI2VuZGlmIC8vIFJUMzB4eCAvLwotI2VuZGlmIC8vIFJUTVBfRUZVU0VfU1VQUE9SVCAvLwotCQkvL0NvdW50cnlDb2RlCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNvdW50cnlDb2RlIiwgdG1wYnVmLCAyNSwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlLCB0bXBidWYgLCAyKTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlN0YU9yaUNvdW50cnlDb2RlLCB0bXBidWYgLCAyKTsKLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQlpZiAoc3RybGVuKChQU1RSSU5HKSBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSkgIT0gMCkKLQkJCXsKLQkJCQlwQWQtPkNvbW1vbkNmZy5iQ291bnRyeUZsYWcgPSBUUlVFOwotCQkJfQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ291bnRyeUNvZGU9JXNcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlKSk7Ci0JCX0KLQkJLy9DaGFubmVsR2VvZ3JhcGh5Ci0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNoYW5uZWxHZW9ncmFwaHkiLCB0bXBidWYsIDI1LCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJVUNIQVIgR2VvZ3JhcGh5ID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJaWYgKEdlb2dyYXBoeSA8PSBCT1RIKQotCQkJewotCQkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IEdlb2dyYXBoeTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZVsyXSA9Ci0JCQkJCShwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPT0gQk9USCkgPyAnICcgOiAoKHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9PSBJRE9SKSA/ICdJJyA6ICdPJyk7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQkJCXBBZC0+U3RhQ2ZnLlN0YU9yaUdlb2dyYXBoeSA9IHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeTsKLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbEdlb2dyYXBoeT0lZFxuIiwgcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBCT1RIOwotCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMl0gPSAnICc7Ci0JCX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCS8vU1NJRAotCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlNTSUQiLCB0bXBidWYsIDI1NiwgcEJ1ZmZlciwgRkFMU0UpKQotCQkJewotCQkJCWlmIChzdHJsZW4odG1wYnVmKSA8PSAzMikKLQkJCQl7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuID0gKFVDSEFSKSBzdHJsZW4odG1wYnVmKTsKLQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgTkRJU184MDJfMTFfTEVOR1RIX1NTSUQpOwotCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5Tc2lkLCB0bXBidWYsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pOwotCQkJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuOwotCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCB0bXBidWYsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7Ci0JCQkJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gcEFkLT5Db21tb25DZmcuU3NpZExlbjsKLQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHRtcGJ1ZiwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KFNTSUQ9JXMpXG4iLCBfX0ZVTkNUSU9OX18sIHRtcGJ1ZikpOwotCQkJCX0KLQkJCX0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCS8vTmV0d29ya1R5cGUKLQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJOZXR3b3JrVHlwZSIsIHRtcGJ1ZiwgMjUsIHBCdWZmZXIsIFRSVUUpKQotCQkJewotCQkJCXBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOwotCQkJCWlmIChzdHJjbXAodG1wYnVmLCAiQWRob2MiKSA9PSAwKQotCQkJCQlwQWQtPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0FESE9DOwotCQkJCWVsc2UgLy9EZWZhdWx0IEluZnJhc3RydWN0dXJlIG1vZGUKLQkJCQkJcEFkLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKLQkJCQkvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5Ci0JCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihOZXR3b3JrVHlwZT0lZClcbiIsIF9fRlVOQ1RJT05fXywgcEFkLT5TdGFDZmcuQnNzVHlwZSkpOwotCQkJfQotCQl9Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCS8vTmV3UENJZVBTCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIk5ld1BDSWVQUyIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlVQ0hBUiB0ZW1wX2J1ZmZlciA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCWlmKHRlbXBfYnVmZmVyPjApCi0JCQkJcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTPVRSVUU7Ci0JCQkJZWxzZQotCQkJCQlwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFM9RkFMU0U7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOZXdQQ0llUFM9JWRcbiIsIHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUykpOwotCQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0jaWZkZWYgUlQzMDkwCi0JCS8vUENJZVBvd2VyTGV2ZWwKLQotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJQQ0llUG93ZXJMZXZlbCIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUENJZVBvd2VyTGV2ZWw9JWRcbiIsIHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUpKTsKLQkJfQotCQkvL0ZvbGxvd0hvc3RBU1BNCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkZvbGxvd0hvc3RBU1BNIiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCVVDSEFSIHRlbXBfYnVmZmVyID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCi0JCQlpZih0ZW1wX2J1ZmZlcj4wKQotCQkJCXBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb2xsb3dIb3N0QVNQTT1UUlVFOwotCQkJCWVsc2UKLQkJCQkJcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvbGxvd0hvc3RBU1BNPUZBTFNFOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnQzMHh4Rm9sbG93SG9zdEFTUE09JWRcbiIsIHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb2xsb3dIb3N0QVNQTSkpOwotCQl9Ci0JCS8vRm9yY2VUZXN0QVNQTQotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJGb3JjZVRlc3RBU1BNIiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCVVDSEFSIHRlbXBfYnVmZmVyID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCi0JCQlpZih0ZW1wX2J1ZmZlcj4wKQotCQkJCXBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb3JjZUFTUE1UZXN0PVRSVUU7Ci0JCQkJZWxzZQotCQkJCQlwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4Rm9yY2VBU1BNVGVzdD1GQUxTRTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0MzB4eEZvcmNlQVNQTT0lZFxuIiwgcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvcmNlQVNQTVRlc3QpKTsKLQkJfQotI2VuZGlmIC8vIFJUMzA5MCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkvL0NoYW5uZWwKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ2hhbm5lbCIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbD0lZFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwotCQl9Ci0JCS8vV2lyZWxlc3NNb2RlCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIldpcmVsZXNzTW9kZSIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlSVF9DZmdTZXRXaXJlbGVzc01vZGUocEFkLCB0bXBidWYpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGh5TW9kZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOwotCQl9Ci0JICAgIC8vQmFzaWNSYXRlCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkJhc2ljUmF0ZSIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPSAoVUxPTkcpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCYXNpY1JhdGU9JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXApKTsKLQkJfQotCQkvL0JlYWNvblBlcmlvZAotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCZWFjb25QZXJpb2QiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gKFVTSE9SVCkgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblBlcmlvZD0lZFxuIiwgcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kKSk7Ci0JCX0KLQkgICAgLy9UeFBvd2VyCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlR4UG93ZXIiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSAoVUxPTkcpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0ID0gcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2U7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeFBvd2VyPSVsZFxuIiwgcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKLQkJfQotCQkvL0JHUHJvdGVjdGlvbgotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCR1Byb3RlY3Rpb24iLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCS8vI2lmIDAJLy8jaWZuZGVmIFdJRklfVEVTVAotCS8vCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAyOy8vIGRpc2FibGUgYi9nIHByb3RlY3Rpb24gZm9yIHRocm91Z2hwdXQgdGVzdAotCS8vI2Vsc2UKLQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKLQkJCXsKLQkJCQljYXNlIDE6IC8vQWx3YXlzIE9uCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjogLy9BbHdheXMgT0ZGCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMDogLy9BVVRPCi0JCQkJZGVmYXVsdDoKLQkJCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMDsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JLy8jZW5kaWYKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJHUHJvdGVjdGlvbj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikpOwotCQl9Ci0JCS8vT0xCQ0RldGVjdGlvbgotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJEaXNhYmxlT0xCQyIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkpCi0JCQl7Ci0JCQkJY2FzZSAxOiAvL2Rpc2FibGUgT0xCQyBEZXRlY3Rpb24KLQkJCQkJcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3QgPSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDA6IC8vZW5hYmxlIE9MQkMgRGV0ZWN0aW9uCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLkRpc2FibGVPTEJDRGV0ZWN0ID0gMDsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3Q9IDA7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiT0xCQ0RldGVjdGlvbj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkRpc2FibGVPTEJDRGV0ZWN0KSk7Ci0JCX0KLQkJLy9UeFByZWFtYmxlCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlR4UHJlYW1ibGUiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApKQotCQkJewotCQkJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZVNob3J0OgotCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0OwotCQkJCQlicmVhazsKLQkJCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVMb25nOgotCQkJCWRlZmF1bHQ6Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBSdDgwMl8xMVByZWFtYmxlTG9uZzsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeFByZWFtYmxlPSVsZFxuIiwgcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSkpOwotCQl9Ci0JCS8vUlRTVGhyZXNob2xkCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlJUU1RocmVzaG9sZCIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlSdHNUaHJlc2ggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJaWYoIChSdHNUaHJlc2ggPj0gMSkgJiYgKFJ0c1RocmVzaCA8PSBNQVhfUlRTX1RIUkVTSE9MRCkgKQotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCAgPSAoVVNIT1JUKVJ0c1RocmVzaDsKLQkJCWVsc2UKLQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSBNQVhfUlRTX1RIUkVTSE9MRDsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRTVGhyZXNob2xkPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpKTsKLQkJfQotCQkvL0ZyYWdUaHJlc2hvbGQKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRnJhZ1RocmVzaG9sZCIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlGcmFnVGhyZXNoID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKLQotCQkJaWYgKEZyYWdUaHJlc2ggPiBNQVhfRlJBR19USFJFU0hPTEQgfHwgRnJhZ1RocmVzaCA8IE1JTl9GUkFHX1RIUkVTSE9MRCkKLQkJCXsgLy9pbGxlZ2FsIEZyYWdUaHJlc2ggc28gd2Ugc2V0IGl0IHRvIGRlZmF1bHQKLQkJCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKLQkJCQlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gVFJVRTsKLQkJCX0KLQkJCWVsc2UgaWYgKEZyYWdUaHJlc2ggJSAyID09IDEpCi0JCQl7Ci0JCQkJLy8gVGhlIGxlbmd0aCBvZiBlYWNoIGZyYWdtZW50IHNoYWxsIGFsd2F5cyBiZSBhbiBldmVuIG51bWJlciBvZiBvY3RldHMsIGV4Y2VwdCBmb3IgdGhlIGxhc3QgZnJhZ21lbnQKLQkJCQkvLyBvZiBhbiBNU0RVIG9yIE1NUERVLCB3aGljaCBtYXkgYmUgZWl0aGVyIGFuIGV2ZW4gb3IgYW4gb2RkIG51bWJlciBvZiBvY3RldHMuCi0JCQkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKShGcmFnVGhyZXNoIC0gMSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKUZyYWdUaHJlc2g7Ci0JCQl9Ci0JCQkvL3BBZC0+Q29tbW9uQ2ZnLkFsbG93RnJhZ1NpemUgPSAocEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQpIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF9DUkM7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFnVGhyZXNob2xkPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkpOwotCQl9Ci0JCS8vVHhCdXJzdAotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJUeEJ1cnN0IiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkvLyNpZmRlZiBXSUZJX1RFU1QKLQkvLwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gRkFMU0U7Ci0JLy8jZWxzZQotCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKLQkJCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IFRSVUU7Ci0JCQllbHNlIC8vRGlzYWJsZQotCQkJCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gRkFMU0U7Ci0JLy8jZW5kaWYKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4QnVyc3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KSk7Ci0JCX0KLQotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLQkJLy9Qa3RBZ2dyZWdhdGUKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiUGt0QWdncmVnYXRlIiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCi0JCQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IFRSVUU7Ci0JCQllbHNlIC8vRGlzYWJsZQotCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPSBGQUxTRTsKLSNpZmRlZiBQSUdHWUJBQ0tfU1VQUE9SVAotCQkJcEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUgPSBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlOwotI2VuZGlmIC8vIFBJR0dZQkFDS19TVVBQT1JUIC8vCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQa3RBZ2dyZWdhdGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpKTsKLQkJfQotI2Vsc2UKLQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IEZBTFNFOwotCQlwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSA9IEZBTFNFOwotI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KLQotCQkvLyBXbW1DYXBhYmxlCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCXJ0bXBfcmVhZF9zdGFfd21tX3Bhcm1zX2Zyb21fZmlsZShwQWQsIHRtcGJ1ZiwgcEJ1ZmZlcik7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJLy9TaG9ydFNsb3QKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiU2hvcnRTbG90IiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCVJUX0NmZ1NldFNob3J0U2xvdChwQWQsIHRtcGJ1Zik7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTaG9ydFNsb3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lKSk7Ci0JCX0KLQkJLy9JRUVFODAyMTFICi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIklFRUU4MDIxMUgiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkgICAgZm9yIChpID0gMCwgbWFjcHRyID0gcnN0cnRvayh0bXBidWYsIjsiKTsgbWFjcHRyOyBtYWNwdHIgPSByc3RydG9rKE5VTEwsIjsiKSwgaSsrKQotCQkgICAgewotCQkJCWlmKHNpbXBsZV9zdHJ0b2wobWFjcHRyLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gVFJVRTsKLQkJCQllbHNlIC8vRGlzYWJsZQotCQkJCQlwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9IEZBTFNFOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUVFRTgwMjExSD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUgpKTsKLQkJICAgIH0KLQkJfQotCQkvL0NTUGVyaW9kCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNTUGVyaW9kIiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU1BlcmlvZCA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQllbHNlCi0JCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NQZXJpb2QgPSAwOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ1NQZXJpb2Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kKSk7Ci0JCX0KLQotI2lmZGVmIE1FUkdFX0FSQ0hfVEVBTQotCQkvLyBEZnNMb3dlckxpbWl0Ci0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkRmc0xvd2VyTGltaXQiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKQotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc0xvd2VyTGltaXQgPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZnNMb3dlckxpbWl0PSVsZFxuIiwgcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzTG93ZXJMaW1pdCkpOwotCQl9Ci0KLQkJLy8gRGZzVXBwZXJMaW1pdAotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJEZnNVcHBlckxpbWl0IiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNVcHBlckxpbWl0ID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGZzVXBwZXJMaW1pdD0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1VwcGVyTGltaXQpKTsKLQkJfQotCi0JCS8vIEZpeERmc0xpbWl0Ci0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkZpeERmc0xpbWl0IiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5GaXhEZnNMaW1pdCA9IFRSVUU7Ci0JCQllbHNlCi0JCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRml4RGZzTGltaXQgPSBGQUxTRTsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRml4RGZzTGltaXQ9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkZpeERmc0xpbWl0KSk7Ci0JCX0KLQotCQkvLyBMb25nUHVsc2VSYWRhclRoCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkxvbmdQdWxzZVJhZGFyVGgiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkgICAgaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKQotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMb25nUHVsc2VSYWRhclRoPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5Mb25nUHVsc2VSYWRhclRoKSk7Ci0JCX0KLQotCQkvLyBBdmdSc3NpUmVxCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkF2Z1Jzc2lSZXEiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKQotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkF2Z1Jzc2lSZXEgPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBdmdSc3NpUmVxPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5BdmdSc3NpUmVxKSk7Ci0JCX0KLQotI2VuZGlmIC8vIE1FUkdFX0FSQ0hfVEVBTSAvLwotCi0JCS8vUkRSZWdpb24KLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiUkRSZWdpb24iLCB0bXBidWYsIDEyOCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCQkJCVJBREFSX0RFVEVDVF9TVFJVQ1QJKnBSYWRhckRldGVjdCA9ICZwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdDsKLQkJCWlmICgoc3RybmNtcCh0bXBidWYsICJKQVBfVzUzIiwgNykgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiamFwX3c1MyIsIDcpID09IDApKQotCQkJewotCQkJCQkJCXBSYWRhckRldGVjdC0+UkREdXJSZWdpb24gPSBKQVBfVzUzOwotCQkJCQkJCXBSYWRhckRldGVjdC0+RGZzU2Vzc2lvblRpbWUgPSAxNTsKLQkJCX0KLQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIkpBUF9XNTYiLCA3KSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJqYXBfdzU2IiwgNykgPT0gMCkpCi0JCQl7Ci0JCQkJCQkJcFJhZGFyRGV0ZWN0LT5SRER1clJlZ2lvbiA9IEpBUF9XNTY7Ci0JCQkJCQkJcFJhZGFyRGV0ZWN0LT5EZnNTZXNzaW9uVGltZSA9IDEzOwotCQkJfQotCQkJZWxzZSBpZiAoKHN0cm5jbXAodG1wYnVmLCAiSkFQIiwgMykgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiamFwIiwgMykgPT0gMCkpCi0JCQl7Ci0JCQkJCQkJcFJhZGFyRGV0ZWN0LT5SRER1clJlZ2lvbiA9IEpBUDsKLQkJCQkJCQlwUmFkYXJEZXRlY3QtPkRmc1Nlc3Npb25UaW1lID0gNTsKLQkJCX0KLQkJCWVsc2UgIGlmICgoc3RybmNtcCh0bXBidWYsICJGQ0MiLCAzKSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJmY2MiLCAzKSA9PSAwKSkKLQkJCXsKLQkJCQkJCQlwUmFkYXJEZXRlY3QtPlJERHVyUmVnaW9uID0gRkNDOwotCQkJCQkJCXBSYWRhckRldGVjdC0+RGZzU2Vzc2lvblRpbWUgPSA1OwotI2lmZGVmIERGU19GQ0NfQlc0MF9GSVgKLQkJCQkJCQlwUmFkYXJEZXRlY3QtPkRmc1Nlc3Npb25GY2NPZmYgPSAwOwotI2VuZGlmIC8vIERGU19GQ0NfQlc0MF9GSVggLy8KLQkJCX0KLQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIkNFIiwgMikgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiY2UiLCAyKSA9PSAwKSkKLQkJCXsKLQkJCQkJCQlwUmFkYXJEZXRlY3QtPlJERHVyUmVnaW9uID0gQ0U7Ci0JCQkJCQkJcFJhZGFyRGV0ZWN0LT5EZnNTZXNzaW9uVGltZSA9IDEzOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCQkJCXBSYWRhckRldGVjdC0+UkREdXJSZWdpb24gPSBDRTsKLQkJCQkJCQlwUmFkYXJEZXRlY3QtPkRmc1Nlc3Npb25UaW1lID0gMTM7Ci0JCQl9Ci0KLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJEUmVnaW9uPSVkXG4iLCBwUmFkYXJEZXRlY3QtPlJERHVyUmVnaW9uKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IENFOwotCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKLQkJfQotCi0JCS8vV2lyZWxlc3NFdmVudAotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaXJlbGVzc0V2ZW50IiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLSNpZiBXSVJFTEVTU19FWFQgPj0gMTUKLQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQllbHNlCi0JCQkJcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgPSAwOwkvLyBkaXNhYmxlCi0jZWxzZQotCQkJcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgPSAwOwkvLyBkaXNhYmxlCi0jZW5kaWYKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXaXJlbGVzc0V2ZW50PSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkpOwotCQl9Ci0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIldpRmlUZXN0IiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3Q9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQllbHNlCi0JCQkJcEFkLT5Db21tb25DZmcuYldpRmlUZXN0ID0gMDsJLy8gZGlzYWJsZQotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV2lGaVRlc3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCkpOwotCQl9Ci0JCS8vQXV0aE1vZGUKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQXV0aE1vZGUiLCB0bXBidWYsIDEyOCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQl7Ci0JCQkJaWYgKChzdHJjbXAodG1wYnVmLCAiV0VQQVVUTyIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid2VwYXV0byIpID09IDApKQotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2g7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJTSEFSRUQiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgInNoYXJlZCIpID09IDApKQotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKLQkgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQVBTSyIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3BhcHNrIikgPT0gMCkpCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOwotCSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBTk9ORSIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3Bhbm9uZSIpID09IDApKQotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEEyUFNLIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGEycHNrIikgPT0gMCkpCi0JCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEEiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYSIpID09IDApKQotCQkJICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKLQkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQTIiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYTIiKSA9PSAwKSkKLQkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQkgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQotCSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihFbmNyeXBUeXBlPSVkKVxuIiwgX19GVU5DVElPTl9fLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKLQkJCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJfQotCQkvL0VuY3J5cFR5cGUKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRW5jcnlwVHlwZSIsIHRtcGJ1ZiwgMTI4LCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJewotCQkJCWlmICgoc3RyY21wKHRtcGJ1ZiwgIldFUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid2VwIikgPT0gMCkpCi0JCQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cwk9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwotCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiVEtJUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAidGtpcCIpID09IDApKQotCQkJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMJPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiQUVTIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJhZXMiKSA9PSAwKSkKLQkJCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzCT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLQkJCQllbHNlCi0JCQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cwk9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQotCQkJCS8vIFVwZGF0ZSBhbGwgd2Vwc3RhdHVzIHJlbGF0ZWQKLQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyCQk9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKLQkJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlcgkJPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7Ci0JCQkJcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cwk9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKLQkJCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyCQk9IEZBTFNFOwotCi0JCQkJLy9SVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgMCk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihFbmNyeXBUeXBlPSVkKVxuIiwgX19GVU5DVElPTl9fLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKLQkJCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJfQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiV1BBUFNLIiwgdG1wYnVmLCA1MTIsIHBCdWZmZXIsIEZBTFNFKSkKLQkJCXsKLQkJCQlpbnQgICAgIHJldCA9IFRSVUU7Ci0KLQkJCQl0bXBidWZbc3RybGVuKHRtcGJ1ZildID0gJ1wwJzsgLy8gbWFrZSBTVEEgY2FuIHByb2Nlc3MgLiReJiBmb3IgV1BBUFNLIGlucHV0Ci0KLQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKLQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCi0JCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQkJCQkpCi0JCQkJewotCQkJCQlyZXQgPSBGQUxTRTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcmV0ID0gUlRfQ2ZnU2V0V1BBUFNLS2V5KHBBZCwgdG1wYnVmLCAoUFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sIHBBZC0+U3RhQ2ZnLlBNSyk7Ci0JCQkJfQotCi0JCQkJaWYgKHJldCA9PSBUUlVFKQotCQkJCXsKLQkJCVJUTVBaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLldwYVBhc3NQaHJhc2UsIDY0KTsKLQkJCVJUTVBNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLldwYVBhc3NQaHJhc2UsIHRtcGJ1Ziwgc3RybGVuKHRtcGJ1ZikpOwotCQkJCQlwQWQtPlN0YUNmZy5XcGFQYXNzUGhyYXNlTGVuPSBzdHJsZW4odG1wYnVmKTsKLQotCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKLQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJCQkJewotCQkJCQkJLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQotCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQkJCQl7Ci0JCQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKLQkJCQkJfQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KFdQQVBTSz0lcylcbiIsIF9fRlVOQ1RJT05fXywgdG1wYnVmKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJLy9EZWZhdWx0S2V5SUQsIEtleVR5cGUsIEtleVN0cgotCQlydG1wX3JlYWRfa2V5X3Bhcm1zX2Zyb21fZmlsZShwQWQsIHRtcGJ1ZiwgcEJ1ZmZlcik7Ci0KLQotCQkvL0hTQ291bnRlcgotCQkvKmlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhTQ291bnRlciIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkpCi0JCQl7Ci0JCQkJY2FzZSAxOiAvL0VuYWJsZQotCQkJCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlSFNDb3VudGVyID0gVFJVRTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAwOiAvL0Rpc2FibGUKLQkJCQlkZWZhdWx0OgotCQkJCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlSFNDb3VudGVyID0gRkFMU0U7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICJIU0NvdW50ZXI9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVIU0NvdW50ZXIpOwotCQl9Ki8KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQlIVFBhcmFtZXRlcnNIb29rKHBBZCwgdG1wYnVmLCBwQnVmZmVyKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCi0jaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAotCQkJLy9DYXJyaWVyRGV0ZWN0Ci0JCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDYXJyaWVyRGV0ZWN0IiwgdG1wYnVmLCAxMjgsIHBCdWZmZXIsIFRSVUUpKQotCQkJewotCQkJCWlmICgoc3RybmNtcCh0bXBidWYsICIwIiwgMSkgPT0gMCkpCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gRkFMU0U7Ci0JCQkJZWxzZSBpZiAoKHN0cm5jbXAodG1wYnVmLCAiMSIsIDEpID09IDApKQotCQkJCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IFRSVUU7Ci0JCQkJZWxzZQotCQkJCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IEZBTFNFOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2FycmllckRldGVjdC5FbmFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBGQUxTRTsKLSNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJLy9QU01vZGUKLQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJQU01vZGUiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJCXsKLQkJCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCi0JCQkJewotCQkJCQlpZiAoKHN0cmNtcCh0bXBidWYsICJNQVhfUFNQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJtYXhfcHNwIikgPT0gMCkpCi0JCQkJCXsKLQkJCQkJCS8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQotCQkJCQkJLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCi0JCQkJCQkvLwkgICBNbG1lU2V0UHNtKHBBZCwgUFdSX1NBVkUpOwotCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7Ci0JCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKLQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7Ci0JCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOwotCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gNTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIkZhc3RfUFNQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJmYXN0X3BzcCIpID09IDApCi0JCQkJCQl8fCAoc3RyY21wKHRtcGJ1ZiwgIkZBU1RfUFNQIikgPT0gMCkpCi0JCQkJCXsKLQkJCQkJCS8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQotCQkJCQkJLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCi0JCQkJCQkvLwkgICBNbG1lU2V0UHNtQml0KHBBZCwgUFdSX1NBVkUpOwotCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7Ci0JCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKLQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOwotCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7Ci0JCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiTGVnYWN5X1BTUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAibGVnYWN5X3BzcCIpID09IDApCi0JCQkJCQl8fCAoc3RyY21wKHRtcGJ1ZiwgIkxFR0FDWV9QU1AiKSA9PSAwKSkKLQkJCQkJewotCQkJCQkJLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCi0JCQkJCQkvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KLQkJCQkJCS8vCSAgIE1sbWVTZXRQc21CaXQocEFkLCBQV1JfU0FWRSk7Ci0JCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLQkJCQkJCWlmIChwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQotCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUDsKLQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7Ci0JCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJeyAvL0RlZmF1bHQgTmRpczgwMl8xMVBvd2VyTW9kZUNBTQotCQkJCQkJLy8gY2xlYXIgUFNNIGJpdCBpbW1lZGlhdGVseQotCQkJCQkJUlRNUF9TRVRfUFNNX0JJVChwQWQsIFBXUl9BQ1RJVkUpOwotCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7Ci0JCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKLQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKLQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKLQkJCQkJfQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQU01vZGU9JWxkXG4iLCBwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlKSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gQXV0b1JvYW1pbmcgYnkgUlNTSQotCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkF1dG9Sb2FtaW5nIiwgdG1wYnVmLCAzMiwgcEJ1ZmZlciwgVFJVRSkpCi0JCQl7Ci0JCQkJaWYgKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgPT0gMCkKLQkJCQkJcEFkLT5TdGFDZmcuYkF1dG9Sb2FtaW5nID0gRkFMU0U7Ci0JCQkJZWxzZQotCQkJCQlwQWQtPlN0YUNmZy5iQXV0b1JvYW1pbmcgPSBUUlVFOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXV0b1JvYW1pbmc9JWRcbiIsIHBBZC0+U3RhQ2ZnLmJBdXRvUm9hbWluZykpOwotCQkJfQotCQkJLy8gUm9hbVRocmVzaG9sZAotCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlJvYW1UaHJlc2hvbGQiLCB0bXBidWYsIDMyLCBwQnVmZmVyLCBUUlVFKSkKLQkJCXsKLQkJCQlsb25nIGxJbmZvID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQotCQkJCWlmIChsSW5mbyA+IDkwIHx8IGxJbmZvIDwgNjApCi0JCQkJCXBBZC0+U3RhQ2ZnLmRCbVRvUm9hbSA9IC03MDsKLQkJCQllbHNlCi0JCQkJCXBBZC0+U3RhQ2ZnLmRCbVRvUm9hbSA9IChDSEFSKSgtMSkqbEluZm87Ci0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSb2FtVGhyZXNob2xkPSVkICBkQm1cbiIsIHBBZC0+U3RhQ2ZnLmRCbVRvUm9hbSkpOwotCQkJfQotCi0JCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJUR25XaWZpVGVzdCIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQkJewotCQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgPT0gMCkKLQkJCQkJcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gRkFMU0U7Ci0JCQkJZWxzZQotCQkJCQlwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBUUlVFOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUR25XaWZpVGVzdD0lZFxuIiwgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0KSk7Ci0JCQl9Ci0KLQkJCS8vIEJlYWNvbiBMb3N0IFRpbWUKLQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJCZWFjb25Mb3N0VGltZSIsIHRtcGJ1ZiwgMzIsIHBCdWZmZXIsIFRSVUUpKQotCQkJewotCQkJCVVMT05HIGxJbmZvID0gKFVMT05HKXNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0KLQkJCQlpZiAoKGxJbmZvICE9IDApICYmIChsSW5mbyA8PSA2MCkpCi0JCQkJCXBBZC0+U3RhQ2ZnLkJlYWNvbkxvc3RUaW1lID0gKGxJbmZvICogT1NfSFopOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvbkxvc3RUaW1lPSVsZCBcbiIsIHBBZC0+U3RhQ2ZnLkJlYWNvbkxvc3RUaW1lKSk7Ci0JCQl9Ci0KLQotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCi0jaWZkZWYgUlQzMHh4Ci0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkFudERpdmVyc2l0eSIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQkJewotCQkJCWZvciAoaSA9IDAsIG1hY3B0ciA9IHJzdHJ0b2sodG1wYnVmLCI7Iik7IG1hY3B0cjsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKLQkJCQl7Ci0JCQkJCVVDSEFSIEFudCA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQkJCWlmKEFudCA8IDMpCi0JCQkJCQlwQWQtPkNvbW1vbkNmZy5iUnhBbnREaXZlcnNpdHkgPSBBbnQ7Ci0JCQkJCWVsc2UKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJSeEFudERpdmVyc2l0eSA9IEFOVF9ESVZFUlNJVFlfRElTQUJMRTsKLQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBbnREaXZlcnNpdHk9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJSeEFudERpdmVyc2l0eSkpOwotCQkJCX0KLQkJCX0KLQkJfQotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0JfXdoaWxlKDApOwotCi0KLQlrZnJlZSh0bXBidWYpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0KLX0KLQotCi0jaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCi0vLyByZWNvcmQgd2hldGhlciB0aGUgY2FyZCBpbiB0aGUgY2FyZCBsaXN0IGlzIHVzZWQgaW4gdGhlIGNhcmQgZmlsZQotVUlOVDggIE1DX0NhcmRVc2VkW01BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRF07Ci0vLyByZWNvcmQgdXNlZCBjYXJkIG1hYyBhZGRyZXNzIGluIHRoZSBjYXJkIGxpc3QKLXN0YXRpYyBVSU5UOCAgTUNfQ2FyZE1hY1tNQVhfTlVNX09GX01VTFRJUExFX0NBUkRdWzZdOwotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEdldCBjYXJkIHByb2ZpbGUgcGF0aC4KLQotQXJndW1lbnRzOgotICAgIHBBZAotCi1SZXR1cm4gVmFsdWU6Ci0gICAgVFJVRQkJLSBGaW5kIGEgY2FyZCBwcm9maWxlCi0JRkFMU0UJCS0gdXNlIGRlZmF1bHQgcHJvZmlsZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBSVE1QX0NhcmRJbmZvUmVhZCgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCkKLXsKLSNkZWZpbmUgTUNfU0VMRUNUX0NBUkRJRAkJMAkvKiB1c2UgQ0FSRCBJRCAoMCB+IDMxKSB0byBpZGVudGlmeSBkaWZmZXJlbnQgY2FyZHMgKi8KLSNkZWZpbmUgTUNfU0VMRUNUX01BQwkJCTEJLyogdXNlIENBUkQgTUFDIHRvIGlkZW50aWZ5IGRpZmZlcmVudCBjYXJkcyAqLwotI2RlZmluZSBNQ19TRUxFQ1RfQ0FSRFRZUEUJCTIJLyogdXNlIENBUkQgdHlwZSAoYWJnbiBvciBiZ24pIHRvIGlkZW50aWZ5IGRpZmZlcmVudCBjYXJkcyAqLwotCi0jZGVmaW5lIExFVFRFUl9DQVNFX1RSQU5TTEFURSh0eHRfcCwgY2FyZF9pZCkJCQlcCi0JewlVSU5UMzIgX2xlbjsgY2hhciBfY2hhcjsJCQkJCQlcCi0JCWZvcihfbGVuPTA7IF9sZW48c3RybGVuKGNhcmRfaWQpOyBfbGVuKyspIHsJCVwKLQkJCV9jaGFyID0gKih0eHRfcCArIF9sZW4pOwkJCQkJXAotCQkJaWYgKCgnQScgPD0gX2NoYXIpICYmIChfY2hhciA8PSAnWicpKQkJXAotCQkJCSoodHh0X3ArX2xlbikgPSAnYScrKF9jaGFyLSdBJyk7CQlcCi0JCX0gfQotCi0JUlRNUF9PU19GRCBzcmNmOwotCUlOVCByZXR2YWw7Ci0JUFNUUklORyBidWZmZXIsIHRtcGJ1ZjsKLQlTVFJJTkcgY2FyZF9pZF9idWZbMzBdLCBSRklDX3dvcmRbMzBdOwotCUJPT0xFQU4gZmxnX21hdGNoX29rID0gRkFMU0U7Ci0JSU5UMzIgY2FyZF9zZWxlY3RfbWV0aG9kOwotCUlOVDMyIGNhcmRfZnJlZV9pZCwgY2FyZF9ub3VzZV9pZCwgY2FyZF9zYW1lX21hY19pZCwgY2FyZF9tYXRjaF9pZDsKLQlFRVBST01fQU5URU5OQV9TVFJVQyBhbnRlbm5hOwotCVVTSE9SVCBhZGRyMDEsIGFkZHIyMywgYWRkcjQ1OwotCVVJTlQ4IG1hY1s2XTsKLQlVSU5UMzIgZGF0YSwgY2FyZF9pbmRleDsKLQlVQ0hBUiAqc3RhcnRfcHRyOwotCVJUTVBfT1NfRlNfSU5GTyBvc0ZTSW5mbzsKLQotCS8vIGluaXQKLQlidWZmZXIgPSBrbWFsbG9jKE1BWF9JTklfQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKLQlpZiAoYnVmZmVyID09IE5VTEwpCi0JCXJldHVybiBGQUxTRTsKLQotCXRtcGJ1ZiA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7Ci0JaWYodG1wYnVmID09IE5VTEwpCi0JewotCQlrZnJlZShidWZmZXIpOwotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQkvLyBnZXQgUkYgSUMgdHlwZQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJmRhdGEpOwotCi0JaWYgKChkYXRhICYgMHgzMCkgPT0gMCkKLQkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gNjsJLy8gOTNDNDYKLQllbHNlIGlmICgoZGF0YSAmIDB4MzApID09IDB4MTApCi0JCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7CS8vIDkzQzY2Ci0JZWxzZQotCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA4OwkvLyA5M0M4NgotCi0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMV9PRkZTRVQsIGFudGVubmEud29yZCk7Ci0KLQlpZiAoKGFudGVubmEuZmllbGQuUmZJY1R5cGUgPT0gUkZJQ18yODUwKSB8fAotCQkoYW50ZW5uYS5maWVsZC5SZkljVHlwZSA9PSBSRklDXzI3NTApKQotCXsKLQkJLyogQUJHTiBjYXJkICovCi0JCXN0cmNweShSRklDX3dvcmQsICJhYmduIik7Ci0JfQotCWVsc2UKLQl7Ci0JCS8qIEJHTiBjYXJkICovCi0JCXN0cmNweShSRklDX3dvcmQsICJiZ24iKTsKLQl9Ci0KLQkvLyBnZXQgTUFDIGFkZHJlc3MKLQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDQsIGFkZHIwMSk7Ci0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA2LCBhZGRyMjMpOwotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwOCwgYWRkcjQ1KTsKLQotCW1hY1swXSA9IChVQ0hBUikoYWRkcjAxICYgMHhmZik7Ci0JbWFjWzFdID0gKFVDSEFSKShhZGRyMDEgPj4gOCk7Ci0JbWFjWzJdID0gKFVDSEFSKShhZGRyMjMgJiAweGZmKTsKLQltYWNbM10gPSAoVUNIQVIpKGFkZHIyMyA+PiA4KTsKLQltYWNbNF0gPSAoVUNIQVIpKGFkZHI0NSAmIDB4ZmYpOwotCW1hY1s1XSA9IChVQ0hBUikoYWRkcjQ1ID4+IDgpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibWFjIGFkZHI9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnghXG4iLCBQUklOVF9NQUMobWFjKSkpOwotCi0JUnRtcE9TRlNJbmZvQ2hhbmdlKCZvc0ZTSW5mbywgVFJVRSk7Ci0JLy8gb3BlbiBjYXJkIGluZm9ybWF0aW9uIGZpbGUKLQlzcmNmID0gUnRtcE9TRmlsZU9wZW4oQ0FSRF9JTkZPX1BBVEgsIE9fUkRPTkxZLCAwKTsKLQlpZiAoSVNfRklMRV9PUEVOX0VSUihzcmNmKSkKLQl7Ci0JCS8qIGNhcmQgaW5mb3JtYXRpb24gZmlsZSBkb2VzIG5vdCBleGlzdCAqLwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCi0JCQkJKCItLT4gRXJyb3Igb3BlbmluZyAlc1xuIiwgQ0FSRF9JTkZPX1BBVEgpKTsKLQkJZ290byAgZnJlZV9yZXNvdXJjZTsKLQl9Ci0KLQkvKiBjYXJkIGluZm9ybWF0aW9uIGZpbGUgZXhpc3RzIHNvIHJlYWRpbmcgdGhlIGNhcmQgaW5mb3JtYXRpb24gKi8KLQltZW1zZXQoYnVmZmVyLCAweDAwLCBNQVhfSU5JX0JVRkZFUl9TSVpFKTsKLQlyZXR2YWwgPSBSdG1wT1NGaWxlUmVhZChzcmNmLCBidWZmZXIsIE1BWF9JTklfQlVGRkVSX1NJWkUpOwotCWlmIChyZXR2YWwgPCAwKQotCXsKLQkJLyogcmVhZCBmYWlsICovCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKLQkJCQkoIi0tPiBSZWFkICVzIGVycm9yICVkXG4iLCBDQVJEX0lORk9fUEFUSCwgLXJldHZhbCkpOwotCX0KLQllbHNlCi0JewotCQkvKiBnZXQgY2FyZCBzZWxlY3Rpb24gbWV0aG9kICovCi0JCW1lbXNldCh0bXBidWYsIDB4MDAsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7Ci0JCWNhcmRfc2VsZWN0X21ldGhvZCA9IE1DX1NFTEVDVF9DQVJEVFlQRTsgLy8gZGVmYXVsdAotCi0JCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJTRUxFQ1QiLCB0bXBidWYsIDI1NiwgYnVmZmVyLCBUUlVFKSkKLQkJewotCQkJaWYgKHN0cmNtcCh0bXBidWYsICJDQVJESUQiKSA9PSAwKQotCQkJCWNhcmRfc2VsZWN0X21ldGhvZCA9IE1DX1NFTEVDVF9DQVJESUQ7Ci0JCQllbHNlIGlmIChzdHJjbXAodG1wYnVmLCAiTUFDIikgPT0gMCkKLQkJCQljYXJkX3NlbGVjdF9tZXRob2QgPSBNQ19TRUxFQ1RfTUFDOwotCQkJZWxzZSBpZiAoc3RyY21wKHRtcGJ1ZiwgIkNBUkRUWVBFIikgPT0gMCkKLQkJCQljYXJkX3NlbGVjdF9tZXRob2QgPSBNQ19TRUxFQ1RfQ0FSRFRZUEU7Ci0JCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKLQkJCQkoIk1DPiBDYXJkIFNlbGVjdGlvbiA9ICVkXG4iLCBjYXJkX3NlbGVjdF9tZXRob2QpKTsKLQotCQkvLyBpbml0Ci0JCWNhcmRfZnJlZV9pZCA9IC0xOwotCQljYXJkX25vdXNlX2lkID0gLTE7Ci0JCWNhcmRfc2FtZV9tYWNfaWQgPSAtMTsKLQkJY2FyZF9tYXRjaF9pZCA9IC0xOwotCi0JCS8vIHNlYXJjaCBjdXJyZW50IGNhcmQgaW5mb3JtYXRpb24gcmVjb3JkcwotCQlmb3IoY2FyZF9pbmRleD0wOwotCQkJY2FyZF9pbmRleDxNQVhfTlVNX09GX01VTFRJUExFX0NBUkQ7Ci0JCQljYXJkX2luZGV4KyspCi0JCXsKLQkJCWlmICgoKihVSU5UMzIgKikmTUNfQ2FyZE1hY1tjYXJkX2luZGV4XVswXSA9PSAwKSAmJgotCQkJCSgqKFVJTlQxNiAqKSZNQ19DYXJkTWFjW2NhcmRfaW5kZXhdWzRdID09IDApKQotCQkJewotCQkJCS8vIE1BQyBpcyBhbGwtMCBzbyB0aGUgZW50cnkgaXMgYXZhaWxhYmxlCi0JCQkJTUNfQ2FyZFVzZWRbY2FyZF9pbmRleF0gPSAwOwotCi0JCQkJaWYgKGNhcmRfZnJlZV9pZCA8IDApCi0JCQkJCWNhcmRfZnJlZV9pZCA9IGNhcmRfaW5kZXg7IC8vIDFzdCBmcmVlIGVudHJ5Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKG1lbWNtcChNQ19DYXJkTWFjW2NhcmRfaW5kZXhdLCBtYWMsIDYpID09IDApCi0JCQkJewotCQkJCQkvLyB3ZSBmaW5kIHRoZSBlbnRyeSB3aXRoIHNhbWUgTUFDCi0JCQkJCWlmIChjYXJkX3NhbWVfbWFjX2lkIDwgMCkKLQkJCQkJCWNhcmRfc2FtZV9tYWNfaWQgPSBjYXJkX2luZGV4OyAvLyAxc3Qgc2FtZSBlbnRyeQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyBNQUMgaXMgbm90IGFsbC0wIGJ1dCB1c2VkIGZsYWcgPT0gMAotCQkJCQlpZiAoKE1DX0NhcmRVc2VkW2NhcmRfaW5kZXhdID09IDApICYmCi0JCQkJCQkoY2FyZF9ub3VzZV9pZCA8IDApKQotCQkJCQl7Ci0JCQkJCQljYXJkX25vdXNlX2lkID0gY2FyZF9pbmRleDsgLy8gMXN0IGF2YWlsYWJsZSBlbnRyeQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCi0JCQkJKCJNQz4gRnJlZSA9ICVkLCBTYW1lID0gJWQsIE5PVVNFID0gJWRcbiIsCi0JCQkJY2FyZF9mcmVlX2lkLCBjYXJkX3NhbWVfbWFjX2lkLCBjYXJkX25vdXNlX2lkKSk7Ci0KLQkJaWYgKChjYXJkX3NhbWVfbWFjX2lkID49IDApICYmCi0JCQkoKGNhcmRfc2VsZWN0X21ldGhvZCA9PSBNQ19TRUxFQ1RfQ0FSRElEKSB8fAotCQkJKGNhcmRfc2VsZWN0X21ldGhvZCA9PSBNQ19TRUxFQ1RfQ0FSRFRZUEUpKSkKLQkJewotCQkJLy8gc2FtZSBNQUMgZW50cnkgaXMgZm91bmQKLQkJCWNhcmRfbWF0Y2hfaWQgPSBjYXJkX3NhbWVfbWFjX2lkOwotCi0JCQlpZiAoY2FyZF9zZWxlY3RfbWV0aG9kID09IE1DX1NFTEVDVF9DQVJEVFlQRSkKLQkJCXsKLQkJCQkvLyBmb3IgQ0FSRFRZUEUKLQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLCAiJTAyZENBUkRUWVBFJXMiLAotCQkJCQkJY2FyZF9tYXRjaF9pZCwgUkZJQ193b3JkKTsKLQotCQkJCWlmICgoc3RhcnRfcHRyID0gKFBVQ0hBUilydHN0cnN0cnVuY2FzZWNtcChidWZmZXIsIGNhcmRfaWRfYnVmKSkgIT0gTlVMTCkKLQkJCQl7Ci0JCQkJCS8vIHdlIGZvdW5kIHRoZSBjYXJkIElECi0JCQkJCUxFVFRFUl9DQVNFX1RSQU5TTEFURShzdGFydF9wdHIsIGNhcmRfaWRfYnVmKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyB0aGUgY2FyZCBpcyAxc3QgcGx1Zy1pbiwgdHJ5IHRvIGZpbmQgdGhlIG1hdGNoIGNhcmQgcHJvZmlsZQotCQkJc3dpdGNoKGNhcmRfc2VsZWN0X21ldGhvZCkKLQkJCXsKLQkJCQljYXNlIE1DX1NFTEVDVF9DQVJESUQ6IC8vIENBUkRJRAotCQkJCWRlZmF1bHQ6Ci0JCQkJCWlmIChjYXJkX2ZyZWVfaWQgPj0gMCkKLQkJCQkJCWNhcmRfbWF0Y2hfaWQgPSBjYXJkX2ZyZWVfaWQ7Ci0JCQkJCWVsc2UKLQkJCQkJCWNhcmRfbWF0Y2hfaWQgPSBjYXJkX25vdXNlX2lkOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgTUNfU0VMRUNUX01BQzogLy8gTUFDCi0JCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICJNQUMlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCi0JCQkJCQkJbWFjWzBdLCBtYWNbMV0sIG1hY1syXSwKLQkJCQkJCQltYWNbM10sIG1hY1s0XSwgbWFjWzVdKTsKLQotCQkJCQkvKiB0cnkgdG8gZmluZCB0aGUga2V5IHdvcmQgaW4gdGhlIGNhcmQgZmlsZSAqLwotCQkJCQlpZiAoKHN0YXJ0X3B0ciA9IChQVUNIQVIpcnRzdHJzdHJ1bmNhc2VjbXAoYnVmZmVyLCBjYXJkX2lkX2J1ZikpICE9IE5VTEwpCi0JCQkJCXsKLQkJCQkJCUxFVFRFUl9DQVNFX1RSQU5TTEFURShzdGFydF9wdHIsIGNhcmRfaWRfYnVmKTsKLQotCQkJCQkJLyogZ2V0IHRoZSByb3cgSUQgKDIgQVNDSUkgY2hhcmFjdGVycykgKi8KLQkJCQkJCXN0YXJ0X3B0ciAtPSAyOwotCQkJCQkJY2FyZF9pZF9idWZbMF0gPSAqKHN0YXJ0X3B0cik7Ci0JCQkJCQljYXJkX2lkX2J1ZlsxXSA9ICooc3RhcnRfcHRyKzEpOwotCQkJCQkJY2FyZF9pZF9idWZbMl0gPSAweDAwOwotCi0JCQkJCQljYXJkX21hdGNoX2lkID0gc2ltcGxlX3N0cnRvbChjYXJkX2lkX2J1ZiwgMCwgMTApOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBNQ19TRUxFQ1RfQ0FSRFRZUEU6IC8vIENBUkRUWVBFCi0JCQkJCWNhcmRfbm91c2VfaWQgPSAtMTsKLQotCQkJCQlmb3IoY2FyZF9pbmRleD0wOwotCQkJCQkJY2FyZF9pbmRleDxNQVhfTlVNX09GX01VTFRJUExFX0NBUkQ7Ci0JCQkJCQljYXJkX2luZGV4KyspCi0JCQkJCXsKLQkJCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICIlMDJkQ0FSRFRZUEUlcyIsCi0JCQkJCQkJCWNhcmRfaW5kZXgsIFJGSUNfd29yZCk7Ci0KLQkJCQkJCWlmICgoc3RhcnRfcHRyID0gKFBVQ0hBUilydHN0cnN0cnVuY2FzZWNtcChidWZmZXIsCi0JCQkJCQkJCQkJCQkJY2FyZF9pZF9idWYpKSAhPSBOVUxMKQotCQkJCQkJewotCQkJCQkJCUxFVFRFUl9DQVNFX1RSQU5TTEFURShzdGFydF9wdHIsIGNhcmRfaWRfYnVmKTsKLQotCQkJCQkJCWlmIChNQ19DYXJkVXNlZFtjYXJkX2luZGV4XSA9PSAwKQotCQkJCQkJCXsKLQkJCQkJCQkJLyogY3VycmVudCB0aGUgY2FyZCBwcm9maWxlIGlzIG5vdCB1c2VkICovCi0JCQkJCQkJCWlmICgoKihVSU5UMzIgKikmTUNfQ2FyZE1hY1tjYXJkX2luZGV4XVswXSA9PSAwKSAmJgotCQkJCQkJCQkJKCooVUlOVDE2ICopJk1DX0NhcmRNYWNbY2FyZF9pbmRleF1bNF0gPT0gMCkpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCS8vIGZpbmQgaXQgYW5kIG5vIHByZXZpb3VzIGNhcmQgdXNlIGl0Ci0JCQkJCQkJCQljYXJkX21hdGNoX2lkID0gY2FyZF9pbmRleDsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UKLQkJCQkJCQkJewotCQkJCQkJCQkJLy8gZXZlciBhIGNhcmQgdXNlIGl0Ci0JCQkJCQkJCQlpZiAoY2FyZF9ub3VzZV9pZCA8IDApCi0JCQkJCQkJCQkJY2FyZF9ub3VzZV9pZCA9IGNhcmRfaW5kZXg7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyBpZiBub3QgZmluZCBhIGZyZWUgb25lLCB1c2UgdGhlIGF2YWlsYWJsZSBvbmUKLQkJCQkJaWYgKGNhcmRfbWF0Y2hfaWQgPCAwKQotCQkJCQkJY2FyZF9tYXRjaF9pZCA9IGNhcmRfbm91c2VfaWQ7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNhcmRfbWF0Y2hfaWQgPj0gMCkKLQkJewotCQkJLy8gbWFrZSB1cCBzZWFyY2gga2V5d29yZAotCQkJc3dpdGNoKGNhcmRfc2VsZWN0X21ldGhvZCkKLQkJCXsKLQkJCQljYXNlIE1DX1NFTEVDVF9DQVJESUQ6IC8vIENBUkRJRAotCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLCAiJTAyZENBUkRJRCIsIGNhcmRfbWF0Y2hfaWQpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgTUNfU0VMRUNUX01BQzogLy8gTUFDCi0JCQkJCXNwcmludGYoY2FyZF9pZF9idWYsCi0JCQkJCQkJIiUwMmRtYWMlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCi0JCQkJCQkJY2FyZF9tYXRjaF9pZCwKLQkJCQkJCQltYWNbMF0sIG1hY1sxXSwgbWFjWzJdLAotCQkJCQkJCW1hY1szXSwgbWFjWzRdLCBtYWNbNV0pOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgTUNfU0VMRUNUX0NBUkRUWVBFOiAvLyBDQVJEVFlQRQotCQkJCWRlZmF1bHQ6Ci0JCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICIlMDJkY2FyZHR5cGUlcyIsCi0JCQkJCQkJY2FyZF9tYXRjaF9pZCwgUkZJQ193b3JkKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlYXJjaCBLZXl3b3JkID0gJXNcbiIsIGNhcmRfaWRfYnVmKSk7Ci0KLQkJCS8vIHJlYWQgY2FyZCBmaWxlIHBhdGgKLQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKGNhcmRfaWRfYnVmLCB0bXBidWYsIDI1NiwgYnVmZmVyLCBUUlVFKSkKLQkJCXsKLQkJCQlpZiAoc3RybGVuKHRtcGJ1ZikgPCBzaXplb2YocEFkLT5NQ19GaWxlTmFtZSkpCi0JCQkJewotCQkJCQkvLyBiYWNrdXAgY2FyZCBpbmZvcm1hdGlvbgotCQkJCQlwQWQtPk1DX1Jvd0lEID0gY2FyZF9tYXRjaF9pZDsgLyogYmFzZSAwICovCi0JCQkJCU1DX0NhcmRVc2VkW2NhcmRfbWF0Y2hfaWRdID0gMTsKLQkJCQkJbWVtY3B5KE1DX0NhcmRNYWNbY2FyZF9tYXRjaF9pZF0sIG1hYywgc2l6ZW9mKG1hYykpOwotCi0JCQkJCS8vIGJhY2t1cCBjYXJkIGZpbGUgcGF0aAotCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1DX0ZpbGVOYW1lLCB0bXBidWYgLCBzdHJsZW4odG1wYnVmKSk7Ci0JCQkJCXBBZC0+TUNfRmlsZU5hbWVbc3RybGVuKHRtcGJ1ZildID0gJ1wwJzsKLQkJCQkJZmxnX21hdGNoX29rID0gVFJVRTsKLQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKLQkJCQkJCQkoIkNhcmQgUHJvZmlsZSBOYW1lID0gJXNcbiIsIHBBZC0+TUNfRmlsZU5hbWUpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCi0JCQkJCQkJKCJDYXJkIFByb2ZpbGUgTmFtZSBsZW5ndGggdG9vIGxhcmdlIVxuIikpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKLQkJCQkJCSgiQ2FuIG5vdCBmaW5kIHNlYXJjaCBrZXkgd29yZCBpbiBjYXJkLmRhdCFcbiIpKTsKLQkJCX0KLQotCQkJaWYgKChmbGdfbWF0Y2hfb2sgIT0gVFJVRSkgJiYKLQkJCQkoY2FyZF9tYXRjaF9pZCA8IE1BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRCkpCi0JCQl7Ci0JCQkJTUNfQ2FyZFVzZWRbY2FyZF9tYXRjaF9pZF0gPSAwOwotCQkJCW1lbXNldChNQ19DYXJkTWFjW2NhcmRfbWF0Y2hfaWRdLCAwLCBzaXplb2YobWFjKSk7Ci0JCQl9Ci0JCX0gLy8gaWYgKGNhcmRfbWF0Y2hfaWQgPj0gMCkKLQl9Ci0KLQotCS8vIGNsb3NlIGZpbGUKLQlyZXR2YWwgPSBSdG1wT1NGaWxlQ2xvc2Uoc3JjZik7Ci0KLWZyZWVfcmVzb3VyY2U6Ci0JUnRtcE9TRlNJbmZvQ2hhbmdlKCZvc0ZTSW5mbywgRkFMU0UpOwotCWtmcmVlKGJ1ZmZlcik7Ci0Ja2ZyZWUodG1wYnVmKTsKLQotCXJldHVybiBmbGdfbWF0Y2hfb2s7Ci19Ci0jZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fc2FuaXR5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fc2FuaXR5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNjMxYzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3Nhbml0eS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcxOCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXNhbml0eS5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JSm9obiBDaGFuZyAgMjAwNC0wOS0wMSAgICAgIGFkZCBXTU0gc3VwcG9ydAotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLWV4dGVybiBVQ0hBUglDSVNDT19PVUlbXTsKLQotZXh0ZXJuIFVDSEFSCVdQQV9PVUlbXTsKLWV4dGVybiBVQ0hBUglSU05fT1VJW107Ci1leHRlcm4gVUNIQVIJV01FX0lORk9fRUxFTVtdOwotZXh0ZXJuIFVDSEFSCVdNRV9QQVJNX0VMRU1bXTsKLWV4dGVybiBVQ0hBUglDY3gyUW9zSW5mb1tdOwotZXh0ZXJuIFVDSEFSCVJBTElOS19PVUlbXTsKLWV4dGVybiBVQ0hBUglCUk9BRENPTV9PVUlbXTsKLWV4dGVybiBVQ0hBUiAgICBXUFNfT1VJW107Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjawotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIE1sbWVBZGRCQVJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyKQotewotICAgIFBNTE1FX0FEREJBX1JFUV9TVFJVQ1QgICBwSW5mbzsKLQotICAgIHBJbmZvID0gKE1MTUVfQUREQkFfUkVRX1NUUlVDVCAqKU1zZzsKLQotICAgIGlmICgoTXNnTGVuICE9IHNpemVvZihNTE1FX0FEREJBX1JFUV9TVFJVQ1QpKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVBZGRCQVJlcVNhbml0eSBmYWlsIC0gbWVzc2FnZSBsZW5naHQgbm90IGNvcnJlY3QuXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoKHBJbmZvLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVBZGRCQVJlcVNhbml0eSBmYWlsIC0gVGhlIHBlZXIgTWFjIGlzIG5vdCBhc3NvY2lhdGVkIHlldC5cbiIpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotCS8qCi0gICAgaWYgKChwSW5mby0+QmFCdWZTaXplID4gTUFYX1JYX1JFT1JERVJCVUYpIHx8IChwSW5mby0+QmFCdWZTaXplIDwgMikpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIFJ4IFJlb3JkZXJpbmcgYnVmZmVyIHRvbyBiaWcgb3IgdG9vIHNtYWxsXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0JKi8KLQotICAgIGlmICgocEluZm8tPnBBZGRyWzBdJjB4MDEpID09IDB4MDEpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIGJyb2FkY2FzdCBhZGRyZXNzIG5vdCBzdXBwb3J0IEJBXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gTWxtZURlbEJBUmVxU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4pCi17Ci0JTUxNRV9ERUxCQV9SRVFfU1RSVUNUICpwSW5mbzsKLQlwSW5mbyA9IChNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgKilNc2c7Ci0KLSAgICBpZiAoKE1zZ0xlbiAhPSBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIG1lc3NhZ2UgbGVuZ2h0IG5vdCBjb3JyZWN0LlxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKChwSW5mby0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIE1hYyBpcyBub3QgYXNzb2NpYXRlZCB5ZXQuXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoKHBJbmZvLT5USUQgJiAweGYwKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1sbWVEZWxCQVJlcVNhbml0eSBmYWlsIC0gVGhlIHBlZXIgVElEIGlzIGluY29ycmVjdC5cbiIpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotCWlmIChOZGlzRXF1YWxNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQWRkciwgcEluZm8tPkFkZHIsIE1BQ19BRERSX0xFTikgPT0gMCkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1sbWVEZWxCQVJlcVNhbml0eSBmYWlsIC0gdGhlIHBlZXIgYWRkciBkb3Nlbid0IGV4aXN0LlxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUJPT0xFQU4gUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKnBNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotCU9VVCBQVUNIQVIgcEFkZHIyKQotewotCVBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKLQlQRlJBTUVfQUREQkFfUkVRIHBBZGRGcmFtZTsKLQlwQWRkRnJhbWUgPSAoUEZSQU1FX0FEREJBX1JFUSkocE1zZyk7Ci0JaWYgKE1zZ0xlbiA8IChzaXplb2YoRlJBTUVfQUREQkFfUkVRKSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsIE1zZ0xlbikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCS8vIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLgotI2lmZGVmIFVOQUxJR05NRU5UX1NVUFBPUlQKLQl7Ci0JCUJBX1BBUk0JCXRtcEJhUGFybTsKLQotCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSgmdG1wQmFQYXJtKSwgKFBVQ0hBUikoJnBBZGRGcmFtZS0+QmFQYXJtKSwgc2l6ZW9mKEJBX1BBUk0pKTsKLQkJKihVU0hPUlQgKikoJnRtcEJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmdG1wQmFQYXJtKSk7Ci0JCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZwQWRkRnJhbWUtPkJhUGFybSksIChQVUNIQVIpKCZ0bXBCYVBhcm0pLCBzaXplb2YoQkFfUEFSTSkpOwotCX0KLSNlbHNlCi0JKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkpOwotI2VuZGlmCi0JcEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlRpbWVPdXRWYWx1ZSk7Ci0JcEFkZEZyYW1lLT5CYVN0YXJ0U2VxLndvcmQgPSBjcHUybGUxNihwQWRkRnJhbWUtPkJhU3RhcnRTZXEud29yZCk7Ci0KLQlpZiAocEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kgIT0gSU1NRURfQkEpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBCYSBQb2xpY3lbJWRdIG5vdCBzdXBwb3J0XG4iLCBwQWRkRnJhbWUtPkJhUGFybS5CQVBvbGljeSkpOwotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFEREJBIFJlcXVlc3QuIHRpZD0leCwgQnVmc2l6ZT0leCwgQU1TRFVTdXBwb3J0ZWQ9JXggXG4iLCBwQWRkRnJhbWUtPkJhUGFybS5USUQsIHBBZGRGcmFtZS0+QmFQYXJtLkJ1ZlNpemUsIHBBZGRGcmFtZS0+QmFQYXJtLkFNU0RVU3VwcG9ydGVkKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KLQlpZiAocEFkZEZyYW1lLT5CYVBhcm0uVElEICYweGZmZjApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBpbmNvcnJlY3QgVElEID0gJWRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLlRJRCkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCUNPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLUJPT0xFQU4gUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKnBNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuKQotewotCS8vUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOwotCVBGUkFNRV9BRERCQV9SU1AgcEFkZEZyYW1lOwotCi0JcEFkZEZyYW1lID0gKFBGUkFNRV9BRERCQV9SU1ApKHBNc2cpOwotCWlmIChNc2dMZW4gPCAoc2l6ZW9mKEZSQU1FX0FEREJBX1JTUCkpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHk6IEFEREJBIFJlc3BvbnNlIGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JLy8gd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuCi0jaWZkZWYgVU5BTElHTk1FTlRfU1VQUE9SVAotCXsKLQkJQkFfUEFSTQkJdG1wQmFQYXJtOwotCi0JCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZ0bXBCYVBhcm0pLCAoUFVDSEFSKSgmcEFkZEZyYW1lLT5CYVBhcm0pLCBzaXplb2YoQkFfUEFSTSkpOwotCQkqKFVTSE9SVCAqKSgmdG1wQmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZ0bXBCYVBhcm0pKTsKLQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikoJnBBZGRGcmFtZS0+QmFQYXJtKSwgKFBVQ0hBUikoJnRtcEJhUGFybSksIHNpemVvZihCQV9QQVJNKSk7Ci0JfQotI2Vsc2UKLQkqKFVTSE9SVCAqKSgmcEFkZEZyYW1lLT5CYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSk7Ci0jZW5kaWYKLQlwQWRkRnJhbWUtPlN0YXR1c0NvZGUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlN0YXR1c0NvZGUpOwotCXBBZGRGcmFtZS0+VGltZU91dFZhbHVlID0gY3B1MmxlMTYocEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUpOwotCi0JaWYgKHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5ICE9IElNTUVEX0JBKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlc3BvbnNlIEJhIFBvbGljeVslZF0gbm90IHN1cHBvcnRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5KSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KLQlpZiAocEFkZEZyYW1lLT5CYVBhcm0uVElEICYweGZmZjApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJzcEFjdGlvblNhbml0eTogQUREQkEgUmVzcG9uc2UgaW5jb3JyZWN0IFRJRCA9ICVkXG4iLCBwQWRkRnJhbWUtPkJhUGFybS5USUQpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQlyZXR1cm4gVFJVRTsKLQotfQotCi1CT09MRUFOIFBlZXJEZWxCQUFjdGlvblNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBVQ0hBUiBXY2lkLAotICAgIElOIFZPSUQgKnBNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuICkKLXsKLQkvL1BGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKLQlQRlJBTUVfREVMQkFfUkVRICBwRGVsRnJhbWU7Ci0JaWYgKE1zZ0xlbiAhPSAoc2l6ZW9mKEZSQU1FX0RFTEJBX1JFUSkpKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JcERlbEZyYW1lID0gKFBGUkFNRV9ERUxCQV9SRVEpKHBNc2cpOwotCi0JKihVU0hPUlQgKikoJnBEZWxGcmFtZS0+RGVsYmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwRGVsRnJhbWUtPkRlbGJhUGFybSkpOwotCXBEZWxGcmFtZS0+UmVhc29uQ29kZSA9IGNwdTJsZTE2KHBEZWxGcmFtZS0+UmVhc29uQ29kZSk7Ci0KLQlpZiAocERlbEZyYW1lLT5EZWxiYVBhcm0uVElEICYweGZmZjApCi0JCXJldHVybiBGQUxTRTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBJTiBVQ0hBUiAgTXNnQ2hhbm5lbCwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMiwKLSAgICBPVVQgUFVDSEFSIHBCc3NpZCwKLSAgICBPVVQgQ0hBUiBTc2lkW10sCi0gICAgT1VUIFVDSEFSICpwU3NpZExlbiwKLSAgICBPVVQgVUNIQVIgKnBCc3NUeXBlLAotICAgIE9VVCBVU0hPUlQgKnBCZWFjb25QZXJpb2QsCi0gICAgT1VUIFVDSEFSICpwQ2hhbm5lbCwKLSAgICBPVVQgVUNIQVIgKnBOZXdDaGFubmVsLAotICAgIE9VVCBMQVJHRV9JTlRFR0VSICpwVGltZXN0YW1wLAotICAgIE9VVCBDRl9QQVJNICpwQ2ZQYXJtLAotICAgIE9VVCBVU0hPUlQgKnBBdGltV2luLAotICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKLSAgICBPVVQgVUNIQVIgKnBFcnAsCi0gICAgT1VUIFVDSEFSICpwRHRpbUNvdW50LAotICAgIE9VVCBVQ0hBUiAqcER0aW1QZXJpb2QsCi0gICAgT1VUIFVDSEFSICpwQmNhc3RGbGFnLAotICAgIE9VVCBVQ0hBUiAqcE1lc3NhZ2VUb01lLAotICAgIE9VVCBVQ0hBUiBTdXBSYXRlW10sCi0gICAgT1VUIFVDSEFSICpwU3VwUmF0ZUxlbiwKLSAgICBPVVQgVUNIQVIgRXh0UmF0ZVtdLAotICAgIE9VVCBVQ0hBUiAqcEV4dFJhdGVMZW4sCi0gICAgT1VUCVVDSEFSICpwQ2tpcEZsYWcsCi0gICAgT1VUCVVDSEFSICpwQWlyb25ldENlbGxQb3dlckxpbWl0LAotICAgIE9VVCBQRURDQV9QQVJNICAgICAgIHBFZGNhUGFybSwKLSAgICBPVVQgUFFCU1NfTE9BRF9QQVJNICBwUWJzc0xvYWQsCi0gICAgT1VUIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAotICAgIE9VVCBVTE9ORyAqcFJhbGlua0llLAotICAgIE9VVCBVQ0hBUgkJICpwSHRDYXBhYmlsaXR5TGVuLAotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotICAgIE9VVCBVQ0hBUgkJICpwUHJlTkh0Q2FwYWJpbGl0eUxlbiwKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKLQlPVVQgVUNIQVIJCSAqQWRkSHRJbmZvTGVuLAotCU9VVCBBRERfSFRfSU5GT19JRSAqQWRkSHRJbmZvLAotCU9VVCBVQ0hBUiAqTmV3RXh0Q2hhbm5lbE9mZnNldCwJCS8vIEh0IGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldChhYm92ZSBvciBiZWxvdykKLSAgICBPVVQgVVNIT1JUICpMZW5ndGhWSUUsCi0gICAgT1VUCVBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSkKLXsKLSAgICBVQ0hBUgkJCQkqUHRyOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCVVDSEFSCQkJCVRpbUxlbjsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSAgICBQRlJBTUVfODAyXzExCQlwRnJhbWU7Ci0gICAgUEVJRF9TVFJVQ1QgICAgICAgICBwRWlkOwotICAgIFVDSEFSCQkJCVN1YlR5cGU7Ci0gICAgVUNIQVIJCQkJU2FuaXR5OwotICAgIC8vVUNIQVIJCQkJRUNXTWluLCBFQ1dNYXg7Ci0gICAgLy9NQUNfQ1NSOV9TVFJVQwkJQ3NyOTsKLSAgICBVTE9ORwkJCQlMZW5ndGggPSAwOwotCi0JLy8gRm9yIHNvbWUgMTFhIEFQIHdoaWNoIGRpZG4ndCBoYXZlIERTX0lFLCB3ZSB1c2UgdHdvIGNvbmRpdGlvbnMgdG8gZGVjaWRlIHRoZSBjaGFubmVsCi0JLy8JMS4gSWYgdGhlIEFQIGlzIDExbiBlbmFibGVkLCB0aGVuIGNoZWNrIHRoZSBjb250cm9sIGNoYW5uZWwuCi0JLy8JMi4gSWYgdGhlIEFQIGRpZG4ndCBoYXZlIGFueSBpbmZvIGFib3V0IGNoYW5uZWwsIHVzZSB0aGUgY2hhbm5lbCB3ZSByZWNlaXZlZCB0aGlzIGZyYW1lIGFzIHRoZSBjaGFubmVsLiAoTWF5IGluYWNjdXJhY3khISkKLQlVQ0hBUgkJCUN0cmxDaGFubmVsID0gMDsKLQotICAgIC8vIEFkZCBmb3IgMyBuZWNlc3NhcnkgRUlEIGZpZWxkIGNoZWNrCi0gICAgU2FuaXR5ID0gMDsKLQotICAgICpwQXRpbVdpbiA9IDA7Ci0gICAgKnBFcnAgPSAwOwotICAgICpwRHRpbUNvdW50ID0gMDsKLSAgICAqcER0aW1QZXJpb2QgPSAwOwotICAgICpwQmNhc3RGbGFnID0gMDsKLSAgICAqcE1lc3NhZ2VUb01lID0gMDsKLSAgICAqcEV4dFJhdGVMZW4gPSAwOwotICAgICpwQ2tpcEZsYWcgPSAwOwkJCSAgICAgICAgLy8gRGVmYXVsdCBvZiBDa2lwRmxhZyBpcyAwCi0gICAgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPSAweEZGOyAgLy8gRGVmYXVsdCBvZiBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgaXMgMHhGRgotICAgICpMZW5ndGhWSUUgPSAwOwkJCQkJLy8gU2V0IHRoZSBsZW5ndGggb2YgVklFIHRvIGluaXQgdmFsdWUgMAotICAgICpwSHRDYXBhYmlsaXR5TGVuID0gMDsJCQkJCS8vIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQkJKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsJCQkJCS8vIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSAgICAqQWRkSHRJbmZvTGVuID0gMDsJCQkJCS8vIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAKLSAgICAqcFJhbGlua0llID0gMDsKLSAgICAqcE5ld0NoYW5uZWwgPSAwOwotICAgICpOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsJLy9EZWZhdWx0IDB4ZmYgbWVhbnMgbm8gc3VjaCBJRQotICAgIHBDZlBhcm0tPmJWYWxpZCA9IEZBTFNFOyAgICAgICAgLy8gZGVmYXVsdDogbm8gSUVfQ0YgZm91bmQKLSAgICBwUWJzc0xvYWQtPmJWYWxpZCA9IEZBTFNFOyAgICAgIC8vIGRlZmF1bHQ6IG5vIElFX1FCU1NfTE9BRCBmb3VuZAotICAgIHBFZGNhUGFybS0+YlZhbGlkID0gRkFMU0U7ICAgICAgLy8gZGVmYXVsdDogbm8gSUVfRURDQV9QQVJBTUVURVIgZm91bmQKLSAgICBwUW9zQ2FwYWJpbGl0eS0+YlZhbGlkID0gRkFMU0U7IC8vIGRlZmF1bHQ6IG5vIElFX1FPU19DQVBBQklMSVRZIGZvdW5kCi0KLSAgICBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7Ci0KLSAgICAvLyBnZXQgc3VidHlwZSBmcm9tIGhlYWRlcgotICAgIFN1YlR5cGUgPSAoVUNIQVIpcEZyYW1lLT5IZHIuRkMuU3ViVHlwZTsKLQotICAgIC8vIGdldCBBZGRyMiBhbmQgQlNTSUQgZnJvbSBoZWFkZXIKLSAgICBDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOwotICAgIENPUFlfTUFDX0FERFIocEJzc2lkLCBwRnJhbWUtPkhkci5BZGRyMyk7Ci0KLS8vCWhleF9kdW1wKCJCZWFjb24iLCBNc2csIE1zZ0xlbik7Ci0KLSAgICBQdHIgPSBwRnJhbWUtPk9jdGV0OwotICAgIExlbmd0aCArPSBMRU5HVEhfODAyXzExOwotCi0gICAgLy8gZ2V0IHRpbWVzdGFtcCBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLSAgICBOZGlzTW92ZU1lbW9yeShwVGltZXN0YW1wLCBQdHIsIFRJTUVTVEFNUF9MRU4pOwotCi0JcFRpbWVzdGFtcC0+dS5Mb3dQYXJ0ID0gY3B1MmxlMzIocFRpbWVzdGFtcC0+dS5Mb3dQYXJ0KTsKLQlwVGltZXN0YW1wLT51LkhpZ2hQYXJ0ID0gY3B1MmxlMzIocFRpbWVzdGFtcC0+dS5IaWdoUGFydCk7Ci0KLSAgICBQdHIgKz0gVElNRVNUQU1QX0xFTjsKLSAgICBMZW5ndGggKz0gVElNRVNUQU1QX0xFTjsKLQotICAgIC8vIGdldCBiZWFjb24gaW50ZXJ2YWwgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocEJlYWNvblBlcmlvZCwgUHRyLCAyKTsKLSAgICBQdHIgKz0gMjsKLSAgICBMZW5ndGggKz0gMjsKLQotICAgIC8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocENhcGFiaWxpdHlJbmZvLCBQdHIsIDIpOwotICAgIFB0ciArPSAyOwotICAgIExlbmd0aCArPSAyOwotCi0gICAgaWYgKENBUF9JU19FU1NfT04oKnBDYXBhYmlsaXR5SW5mbykpCi0gICAgICAgICpwQnNzVHlwZSA9IEJTU19JTkZSQTsKLSAgICBlbHNlCi0gICAgICAgICpwQnNzVHlwZSA9IEJTU19BREhPQzsKLQotICAgIHBFaWQgPSAoUEVJRF9TVFJVQ1QpIFB0cjsKLQotICAgIC8vIGdldCB2YXJpYWJsZSBmaWVsZHMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgd2hpbGUgKChMZW5ndGggKyAyICsgcEVpZC0+TGVuKSA8PSBNc2dMZW4pCi0gICAgewotICAgICAgICAvLwotICAgICAgICAvLyBTZWN1cmUgY29weSBWSUUgdG8gVmFySUVbTUFYX1ZJRV9MRU5dIGRpZG4ndCBvdmVyZmxvdy4KLSAgICAgICAgLy8KLSAgICAgICAgaWYgKCgqTGVuZ3RoVklFICsgcEVpZC0+TGVuICsgMikgPj0gTUFYX1ZJRV9MRU4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gVmFyaWFibGUgSUVzIG91dCBvZiByZXNvdXJjZSBbbGVuKD0lZCkgPiBNQVhfVklFX0xFTig9JWQpXVxuIiwKLSAgICAgICAgICAgICAgICAgICAgKCpMZW5ndGhWSUUgKyBwRWlkLT5MZW4gKyAyKSwgTUFYX1ZJRV9MRU4pKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoKHBFaWQtPkVpZCkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBJRV9TU0lEOgotICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgaGFzIG9uZSBTU0lEIEVJRCBpbiB0aGlzIGJlYWNvbiwgaWdub3JlIHRoZSBzZWNvbmQgb25lCi0gICAgICAgICAgICAgICAgaWYgKFNhbml0eSAmIDB4MSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1NJRCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOwotICAgICAgICAgICAgICAgICAgICAqcFNzaWRMZW4gPSBwRWlkLT5MZW47Ci0gICAgICAgICAgICAgICAgICAgIFNhbml0eSB8PSAweDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NTSUQgKGxlbj0lZClcbiIscEVpZC0+TGVuKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSUVfU1VQUF9SQVRFUzoKLSAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTYW5pdHkgfD0gMHgyOwotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShTdXBSYXRlLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKLSAgICAgICAgICAgICAgICAgICAgKnBTdXBSYXRlTGVuID0gcEVpZC0+TGVuOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IDIwMDQtMDktMTQgbm90IGEgZ29vZCBkZXNpZ24gaGVyZSwgY2F1c2UgaXQgZXhjbHVkZSBleHRyYSByYXRlcwotICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIFNjYW5UYWIuIFdlIHNob3VsZCByZXBvcnQgYXMgaXMuIEFuZCBmaWx0ZXIgb3V0IHVuc3VwcG9ydGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIHJhdGVzIGluIE1sbWVBdXguCi0gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGFnYWluc3QgdGhlIHN1cHBvcnRlZCByYXRlcwotICAgICAgICAgICAgICAgICAgICAvLyBSVE1QQ2hlY2tSYXRlcyhwQWQsIFN1cFJhdGUsIHBTdXBSYXRlTGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfU1VQUF9SQVRFUyAobGVuPSVkKVxuIixwRWlkLT5MZW4pKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBJRV9IVF9DQVA6Ci0JCQlpZiAocEVpZC0+TGVuID49IFNJWkVfSFRfQ0FQX0lFKSAgLy9Ob3RlOiBhbGxvdyBleHRlbnNpb24uISEKLQkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBwRWlkLT5PY3RldCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLQkJCQkqcEh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOwkvLyBObm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KLQotCQkJCSooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykpOwotI2lmZGVmIFVOQUxJR05NRU5UX1NVUFBPUlQKLQkJCQl7Ci0JCQkJCUVYVF9IVF9DQVBfSU5GTyBleHRIdENhcEluZm87Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZleHRIdENhcEluZm8pLCAoUFVDSEFSKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSwgc2l6ZW9mKEVYVF9IVF9DQVBfSU5GTykpOwotCQkJCQkqKFVTSE9SVCAqKSgmZXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZleHRIdENhcEluZm8pKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbyksIChQVUNIQVIpKCZleHRIdENhcEluZm8pLCBzaXplb2YoRVhUX0hUX0NBUF9JTkZPKSk7Ci0JCQkJfQotI2Vsc2UKLQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKLSNlbmRpZiAvLyBVTkFMSUdOTUVOVF9TVVBQT1JUIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCXsKLQkJCQkJKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsJLy8gTm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KLQotCQkJCQlQdHIgPSAoUFVDSEFSKSBwVklFOwotCQkJCQlOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKLQkJCQkJKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7Ci0JCQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfSFRfQ0FQLiBwRWlkLT5MZW4gPSAlZFxuIiwgcEVpZC0+TGVuKSk7Ci0JCQl9Ci0KLQkJYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElFX0FERF9IVDoKLQkJCWlmIChwRWlkLT5MZW4gPj0gc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSkKLQkJCXsKLQkJCQkvLyBUaGlzIElFIGFsbG93cyBleHRlbnNpb24sIGJ1dCB3ZSBjYW4gaWdub3JlIGV4dHJhIGJ5dGVzIGJleW9uZCBvdXIga25vd2xlZGdlICwgc28gb25seQotCQkJCS8vIGNvcHkgZmlyc3Qgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKQotCQkJCU5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywgcEVpZC0+T2N0ZXQsIHNpemVvZihBRERfSFRfSU5GT19JRSkpOwotCQkJCSpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOwotCi0JCQkJQ3RybENoYW5uZWwgPSBBZGRIdEluZm8tPkNvbnRyb2xDaGFuOwotCi0JCQkJKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMikgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8yKSk7Ci0JCQkJKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8zKSk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCXsKLQkJCSAgICAgICAgICAgICAgICBQdHIgPSAoUFVDSEFSKSBwVklFOwotCQkJICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOwotCQkJICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOwotCQkJCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0FERF9IVC4gXG4iKSk7Ci0JCQl9Ci0KLQkJYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElFX1NFQ09OREFSWV9DSF9PRkZTRVQ6Ci0JCQlpZiAocEVpZC0+TGVuID09IDEpCi0JCQl7Ci0JCQkJKk5ld0V4dENoYW5uZWxPZmZzZXQgPSBwRWlkLT5PY3RldFswXTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NFQ09OREFSWV9DSF9PRkZTRVQuIFxuIikpOwotCQkJfQotCi0JCWJyZWFrOwotICAgICAgICAgICAgY2FzZSBJRV9GSF9QQVJNOgotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eShJRV9GSF9QQVJNKSBcbiIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBJRV9EU19QQVJNOgotICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKnBDaGFubmVsID0gKnBFaWQtPk9jdGV0OwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCQl7Ci0JCQkJCQlpZiAoQ2hhbm5lbFNhbml0eShwQWQsICpwQ2hhbm5lbCkgPT0gMCkKLQkJCQkJCXsKLQotCQkJCQkJCXJldHVybiBGQUxTRTsKLQkJCQkJCX0KLQkJCQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotICAgICAgICAgICAgICAgICAgICBTYW5pdHkgfD0gMHg0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9EU19QQVJNIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIElFX0NGX1BBUk06Ci0gICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuID09IDYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5iVmFsaWQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBDb3VudCA9IHBFaWQtPk9jdGV0WzBdOwotICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBQZXJpb2QgPSBwRWlkLT5PY3RldFsxXTsKLSAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwTWF4RHVyYXRpb24gPSBwRWlkLT5PY3RldFsyXSArIDI1NiAqIHBFaWQtPk9jdGV0WzNdOwotICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBEdXJSZW1haW5pbmcgPSBwRWlkLT5PY3RldFs0XSArIDI1NiAqIHBFaWQtPk9jdGV0WzVdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9DRl9QQVJNXG4iKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSUVfSUJTU19QQVJNOgotICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSAyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEF0aW1XaW4sIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9JQlNTX1BBUk1cbiIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotICAgICAgICAgICAgY2FzZSBJRV9USU06Ci0gICAgICAgICAgICAgICAgaWYoSU5GUkFfT04ocEFkKSAmJiBTdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgR2V0VGltQml0KChQQ0hBUilwRWlkLCBwQWQtPlN0YUFjdGl2ZS5BaWQsICZUaW1MZW4sIHBCY2FzdEZsYWcsIHBEdGltQ291bnQsIHBEdGltUGVyaW9kLCBwTWVzc2FnZVRvTWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSAgICAgICAgICAgIGNhc2UgSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UOgotICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSAzKQotICAgICAgICAgICAgICAgIHsKLQkJCSpwTmV3Q2hhbm5lbCA9IHBFaWQtPk9jdGV0WzFdOwkvL2V4dHJhY3QgbmV3IGNoYW5uZWwgbnVtYmVyCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvLyBOZXcgZm9yIFdQQQotICAgICAgICAgICAgLy8gQ0NYIHYyIGhhcyB0aGUgc2FtZSBJRSwgd2UgbmVlZCB0byBwYXJzZSB0aGF0IHRvbwotICAgICAgICAgICAgLy8gV2lmaSBXTU0gdXNlIHRoZSBzYW1lIElFIHZhbGUsIG5lZWQgdG8gcGFyc2UgdGhhdCB0b28KLSAgICAgICAgICAgIC8vIGNhc2UgSUVfV1BBOgotICAgICAgICAgICAgY2FzZSBJRV9WRU5ET1JfU1BFQ0lGSUM6Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgQnJvYWRjb20vQXRoZXJvcyA4MDIuMTFuIE9VSSB2ZXJzaW9uLCBmb3IgSFQgQ2FwYWJpbGl0eSBJRS4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIEhUIElFIGlzIGJlZm9yZSBJRUVFIGRyYWZ0IHNldCBIVCBJRSB2YWx1ZS4yMDA2LTA5LTI4IGJ5IEphbi4KLSAgICAgICAgICAgICAgICAvKmlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIEJST0FEQ09NX09VSSwgMykgJiYgKHBFaWQtPkxlbiA+PSA0KSkKLSAgICAgICAgICAgICAgICB7Ci0JCQlpZiAoKHBFaWQtPk9jdGV0WzNdID09IE9VSV9CUk9BRENPTV9IVCkgJiYgKHBFaWQtPkxlbiA+PSAzMCkpCi0JCQl7Ci0JCQkJewotCQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCAmcEVpZC0+T2N0ZXRbNF0sIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7Ci0JCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CS8vIE5ub3cgd2Ugb25seSBzdXBwb3J0IDI2IGJ5dGVzLgotCQkJCX0KLQkJCX0KLQkJCWlmICgocEVpZC0+T2N0ZXRbM10gPT0gT1VJX0JST0FEQ09NX0hUKSAmJiAocEVpZC0+TGVuID49IDI2KSkKLQkJCXsKLQkJCQl7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKLQkJCQkJKkFkZEh0SW5mb0xlbiA9IFNJWkVfQUREX0hUX0lORk9fSUU7CS8vIE5ub3cgd2Ugb25seSBzdXBwb3J0IDI2IGJ5dGVzLgotCQkJCX0KLQkJCX0KLSAgICAgICAgICAgICAgICB9Ci0JCQkJKi8KLSAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgT1VJIHZlcnNpb24sIGZpbHRlciBvdXQgbm9uLXN0YW5kYXJkIHVzYWdlCi0gICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgUkFMSU5LX09VSSwgMykgJiYgKHBFaWQtPkxlbiA9PSA3KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vKnBSYWxpbmtJZSA9IHBFaWQtPk9jdGV0WzNdOwotICAgICAgICAgICAgICAgICAgICBpZiAocEVpZC0+T2N0ZXRbM10gIT0gMCkKLQkJCQkJKnBSYWxpbmtJZSA9IHBFaWQtPk9jdGV0WzNdOwotCQkJCWVsc2UKLQkJCQkJKnBSYWxpbmtJZSA9IDB4ZjAwMDAwMDA7IC8vIFNldCB0byBub24temVybyB2YWx1ZSAoY2FuJ3Qgc2V0IGJpdDAtMikgdG8gcmVwcmVzZW50IHRoaXMgaXMgUmFsaW5rIENoaXAuIFNvIGF0IGxpbmt1cCwgd2Ugd2lsbCBzZXQgcmFsaW5rY2hpcCBmbGFnLgotICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJLy8gVGhpcyBIVCBJRSBpcyBiZWZvcmUgSUVFRSBkcmFmdCBzZXQgSFQgSUUgdmFsdWUuMjAwNi0wOS0yOCBieSBKYW4uCi0KLSAgICAgICAgICAgICAgICAvLyBPdGhlciB2ZW5kb3JzIGhhZCBwcm9kdWN0aW9uIGJlZm9yZSBJRV9IVF9DQVAgdmFsdWUgaXMgYXNzaWduZWQuIFRvIGJhY2t3YXJkIHN1cHBvcnQgdGhvc2Ugb2xkLWZpcm13YXJlIEFQLAotICAgICAgICAgICAgICAgIC8vIENoZWNrIGJyb2FkY29tLWRlZmllbmQgcHJlLTgwMi4xMW5EMS4wIE9VSSBmb3IgSFQgcmVsYXRlZCBJRSwgaW5jbHVkaW5nIEhUIENhcGF0aWxpdGllcyBJRSBhbmQgSFQgSW5mb3JtYXRpb24gSUUKLSAgICAgICAgICAgICAgICBlbHNlIGlmICgoKnBIdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYgTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBQUkVfTl9IVF9PVUksIDMpICYmIChwRWlkLT5MZW4gPj0gNCkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChwRWlkLT5PY3RldFszXSA9PSBPVUlfUFJFTl9IVF9DQVApICYmIChwRWlkLT5MZW4gPj0gMzApICYmICgqcEh0Q2FwYWJpbGl0eUxlbiA9PSAwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoKHBFaWQtPk9jdGV0WzNdID09IE9VSV9QUkVOX0FERF9IVCkgJiYgKHBFaWQtPkxlbiA+PSAyNikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRvIHBWSUUgd2hpY2ggd2lsbCByZXBvcnQgdG8gbWljcm9zb2Z0IGJzc2lkIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgIFB0ciA9IChQVUNIQVIpIHBWSUU7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOwotICAgICAgICAgICAgICAgICAgICAqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfUEFSTV9FTEVNLCA2KSAmJiAocEVpZC0+TGVuID09IDI0KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBVQ0hBUiBwdHI7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHBhcnNpbmcgRURDQSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlZhbGlkICAgICAgICAgID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUUFjayAgICAgICAgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDEwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRdWV1ZVJlcXVlc3QgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MjA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlR4b3BSZXF1ZXN0ICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg0MDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQgPSBwRWlkLT5PY3RldFs2XSAmIDB4MGY7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFQU0RDYXBhYmxlICAgID0gKHBFaWQtPk9jdGV0WzZdICYgMHg4MCkgPyAxIDogMDsKLSAgICAgICAgICAgICAgICAgICAgcHRyID0gJnBFaWQtPk9jdGV0WzhdOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFjaSA9ICgqcHRyICYgMHg2MCkgPj4gNTsgLy8gYjV+NiBpcyBBQyBJTkRFWAotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW2FjaV0gID0gKCgoKnB0cikgJiAweDEwKSA9PSAweDEwKTsgICAvLyBiNSBpcyBBQ00KLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bYWNpXSA9ICgqcHRyKSAmIDB4MGY7ICAgICAgICAgICAgICAgLy8gYjB+MyBpcyBBSUZTTgotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pblthY2ldID0gKihwdHIrMSkgJiAweDBmOyAgICAgICAgICAgICAvLyBiMH40IGlzIEN3bWluCi0gICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W2FjaV0gPSAqKHB0cisxKSA+PiA0OyAgICAgICAgICAgICAgIC8vIGI1fjggaXMgQ3dtYXgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFthY2ldICA9ICoocHRyKzIpICsgMjU2ICogKCoocHRyKzMpKTsgLy8gaW4gdW5pdCBvZiAzMi11cwotICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IDQ7IC8vIHBvaW50IHRvIG5leHQgQUMKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdNRV9JTkZPX0VMRU0sIDYpICYmIChwRWlkLT5MZW4gPT0gNykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBwYXJzaW5nIEVEQ0EgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJWYWxpZCAgICAgICAgICA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlFBY2sgICAgICAgICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgxMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUXVldWVSZXF1ZXN0ICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDIwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJUeG9wUmVxdWVzdCAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4NDA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50ID0gcEVpZC0+T2N0ZXRbNl0gJiAweDBmOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBUFNEQ2FwYWJsZSAgICA9IChwRWlkLT5PY3RldFs2XSAmIDB4ODApID8gMSA6IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGRlZmF1bHQgRURDQSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19CRV0gID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdID0gMzsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQkVdID0gQ1dfTUlOX0lOX0JJVFM7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JFXSA9IENXX01BWF9JTl9CSVRTOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JFXSAgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVtRSURfQUNfQktdICA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXSA9IDc7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXSA9IENXX01JTl9JTl9CSVRTOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS10gPSBDV19NQVhfSU5fQklUUzsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CS10gID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX1ZJXSAgPSAwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPSAyOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WSV0gPSBDV19NSU5fSU5fQklUUy0xOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WSV0gPSBDV19NQVhfSU5fQklUUzsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gID0gOTY7ICAgLy8gQUNfVkk6IDk2KjMydXMgfj0gM21zCi0KLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19WT10gID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dID0gMjsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dID0gQ1dfTUlOX0lOX0JJVFMtMjsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dID0gQ1dfTUFYX0lOX0JJVFMtMTsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WT10gID0gNDg7ICAgLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIElFX0VYVF9TVVBQX1JBVEVTOgotICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShFeHRSYXRlLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKLSAgICAgICAgICAgICAgICAgICAgKnBFeHRSYXRlTGVuID0gcEVpZC0+TGVuOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IDIwMDQtMDktMTQgbm90IGEgZ29vZCBkZXNpZ24gaGVyZSwgY2F1c2UgaXQgZXhjbHVkZSBleHRyYSByYXRlcwotICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIFNjYW5UYWIuIFdlIHNob3VsZCByZXBvcnQgYXMgaXMuIEFuZCBmaWx0ZXIgb3V0IHVuc3VwcG9ydGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIHJhdGVzIGluIE1sbWVBdXguCi0gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGFnYWluc3QgdGhlIHN1cHBvcnRlZCByYXRlcwotICAgICAgICAgICAgICAgICAgICAvLyBSVE1QQ2hlY2tSYXRlcyhwQWQsIEV4dFJhdGUsIHBFeHRSYXRlTGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSUVfRVJQOgotICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPT0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpwRXJwID0gKFVDSEFSKXBFaWQtPk9jdGV0WzBdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBJRV9BSVJPTkVUX0NLSVA6Ci0gICAgICAgICAgICAgICAgLy8gMC4gQ2hlY2sgQWlyb25ldCBJRSBsZW5ndGgsIGl0IG11c3QgYmUgbGFyZ2VyIG9yIGVxdWFsIHRvIDI4Ci0gICAgICAgICAgICAgICAgLy8gQ2lzY28gQVAzNTAgdXNlZCBsZW5ndGggYXMgMjgKLSAgICAgICAgICAgICAgICAvLyBDaXNjbyBBUDEyWFggdXNlZCBsZW5ndGggYXMgMzAKLSAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDwgKENLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMikpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgLy8gMS4gQ29weSBDS0lQIGZsYWcgYnl0ZSB0byBidWZmZXIgZm9yIHByb2Nlc3MKLSAgICAgICAgICAgICAgICAqcENraXBGbGFnID0gKihwRWlkLT5PY3RldCArIDgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIElFX0FQX1RYX1BPV0VSOgotICAgICAgICAgICAgICAgIC8vIEFQIENvbnRyb2wgb2YgQ2xpZW50IFRyYW5zbWl0IFBvd2VyCi0gICAgICAgICAgICAgICAgLy8wLiBDaGVjayBBaXJvbmV0IElFIGxlbmd0aCwgaXQgbXVzdCBiZSA2Ci0gICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiAhPSAweDA2KQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIC8vIEdldCBjZWxsIHBvd2VyIGxpbWl0IGluIGRCbQotICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIENJU0NPX09VSSwgMykgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPSAqKHBFaWQtPk9jdGV0ICsgNCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8vIFdQQTIgJiA4MDIuMTFpIFJTTgotICAgICAgICAgICAgY2FzZSBJRV9SU046Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gT1VJIGZvciB2ZXJzaW9uIGFueW1vcmUsIGNoZWNrIHRoZSBncm91cCBjaXBoZXIgT1VJIGJlZm9yZSBjb3B5aW5nCi0gICAgICAgICAgICAgICAgaWYgKFJUTVBFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29weSB0byBwVklFIHdoaWNoIHdpbGwgcmVwb3J0IHRvIG1pY3Jvc29mdCBic3NpZCBsaXN0LgotICAgICAgICAgICAgICAgICAgICBQdHIgPSAoUFVDSEFSKSBwVklFOwotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKLSAgICAgICAgICAgICAgICAgICAgKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKLQkJCWNhc2UgSUVfQ09VTlRSWToKLQkJCQlQdHIgPSAoUFVDSEFSKSBwVklFOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOwotICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOwotCQkJCWJyZWFrOwotI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgTGVuZ3RoID0gTGVuZ3RoICsgMiArIHBFaWQtPkxlbjsgIC8vIEVpZFsxXSArIExlblsxXSsgY29udGVudFtMZW5dCi0gICAgICAgIHBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOwotICAgIH0KLQotICAgIC8vIEZvciBzb21lIDExYSBBUC4gaXQgZGlkIG5vdCBoYXZlIHRoZSBjaGFubmVsIEVJRCwgcGF0Y2ggaGVyZQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlVQ0hBUiBMYXRjaFJmQ2hhbm5lbCA9IE1zZ0NoYW5uZWw7Ci0JCWlmICgocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpICYmICgoU2FuaXR5ICYgMHg0KSA9PSAwKSkKLQkJewotCQkJaWYgKEN0cmxDaGFubmVsICE9IDApCi0JCQkJKnBDaGFubmVsID0gQ3RybENoYW5uZWw7Ci0JCQllbHNlCi0JCQkJKnBDaGFubmVsID0gTGF0Y2hSZkNoYW5uZWw7Ci0JCQlTYW5pdHkgfD0gMHg0OwotCQl9Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JaWYgKFNhbml0eSAhPSAweDcpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19MT1VELCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIG1pc3NpbmcgZmllbGQsIFNhbml0eT0weCUwMnhcbiIsIFNhbml0eSkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWVsc2UKLQl7Ci0JCXJldHVybiBUUlVFOwotCX0KLQotfQotCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrIGZvciBzb21lIElFIGFkZHJlc3NlZCAgaW4gODAyLjExbiBkMy4wMy4KLQlSZXR1cm46Ci0JCVRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkyKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFZPSUQgKk1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFVDSEFSCSpSZWdDbGFzcykKLXsKLQlDSEFSCQkJCSpQdHI7Ci0JUEZSQU1FXzgwMl8xMQkJcEZyYW1lOwotCVBFSURfU1RSVUNUCQkJcEVpZDsKLQlVTE9ORwkJCQlMZW5ndGggPSAwOwotCi0JcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOwotCi0JKlJlZ0NsYXNzID0gMDsKLQlQdHIgPSAoUENIQVIpIHBGcmFtZS0+T2N0ZXQ7Ci0JTGVuZ3RoICs9IExFTkdUSF84MDJfMTE7Ci0KLQkvLyBnZXQgdGltZXN0YW1wIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotCVB0ciArPSBUSU1FU1RBTVBfTEVOOwotCUxlbmd0aCArPSBUSU1FU1RBTVBfTEVOOwotCi0JLy8gZ2V0IGJlYWNvbiBpbnRlcnZhbCBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLQlQdHIgKz0gMjsKLQlMZW5ndGggKz0gMjsKLQotCS8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0JUHRyICs9IDI7Ci0JTGVuZ3RoICs9IDI7Ci0KLQlwRWlkID0gKFBFSURfU1RSVUNUKSBQdHI7Ci0KLQkvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotCXdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQotCXsKLQkJc3dpdGNoKHBFaWQtPkVpZCkKLQkJewotCQkJY2FzZSBJRV9TVVBQX1JFR19DTEFTUzoKLQkJCQlpZihwRWlkLT5MZW4gPiAwKQotCQkJCXsKLQkJCQkJKlJlZ0NsYXNzID0gKnBFaWQtPk9jdGV0OwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TU0lEIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOwotCQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJTGVuZ3RoID0gTGVuZ3RoICsgMiArIHBFaWQtPkxlbjsgIC8vIEVpZFsxXSArIExlblsxXSsgY29udGVudFtMZW5dCi0JCXBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOwotCX0KLQotCXJldHVybiBUUlVFOwotCi19Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIE1sbWVTY2FuUmVxU2FuaXR5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFZPSUQgKk1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFVDSEFSICpwQnNzVHlwZSwKLQlPVVQgQ0hBUiBTc2lkW10sCi0JT1VUIFVDSEFSICpwU3NpZExlbiwKLQlPVVQgVUNIQVIgKnBTY2FuVHlwZSkKLXsKLQlNTE1FX1NDQU5fUkVRX1NUUlVDVCAqSW5mbzsKLQotCUluZm8gPSAoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKikoTXNnKTsKLQkqcEJzc1R5cGUgPSBJbmZvLT5Cc3NUeXBlOwotCSpwU3NpZExlbiA9IEluZm8tPlNzaWRMZW47Ci0JTmRpc01vdmVNZW1vcnkoU3NpZCwgSW5mby0+U3NpZCwgKnBTc2lkTGVuKTsKLQkqcFNjYW5UeXBlID0gSW5mby0+U2NhblR5cGU7Ci0KLQlpZiAoKCpwQnNzVHlwZSA9PSBCU1NfSU5GUkEgfHwgKnBCc3NUeXBlID09IEJTU19BREhPQyB8fCAqcEJzc1R5cGUgPT0gQlNTX0FOWSkKLQkJJiYgKCpwU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUgfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX1BBU1NJVkUKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJKSkKLQl7Ci0JCXJldHVybiBUUlVFOwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2NhblJlcVNhbml0eSBmYWlsIC0gd3JvbmcgQnNzVHlwZSBvciBTY2FuVHlwZVxuIikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotfQotCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVVDSEFSIENoYW5uZWxTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVUNIQVIgY2hhbm5lbCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpICsrKQotICAgIHsKLSAgICAgICAgaWYgKGNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBQZWVyRGVhdXRoU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwQWRkcjIsCi0gICAgT1VUIFVTSE9SVCAqcFJlYXNvbikKLXsKLSAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKLQotICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7Ci0gICAgTmRpc01vdmVNZW1vcnkocFJlYXNvbiwgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjawotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIFBlZXJBdXRoU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwQWRkciwKLSAgICBPVVQgVVNIT1JUICpwQWxnLAotICAgIE9VVCBVU0hPUlQgKnBTZXEsCi0gICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKLSAgICBDSEFSICpwQ2hsZ1RleHQpCi17Ci0gICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7Ci0KLSAgICBDT1BZX01BQ19BRERSKHBBZGRyLCAgIHBGcmFtZS0+SGRyLkFkZHIyKTsKLSAgICBOZGlzTW92ZU1lbW9yeShwQWxnLCAgICAmcEZyYW1lLT5PY3RldFswXSwgMik7Ci0gICAgTmRpc01vdmVNZW1vcnkocFNlcSwgICAgJnBGcmFtZS0+T2N0ZXRbMl0sIDIpOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsICZwRnJhbWUtPk9jdGV0WzRdLCAyKTsKLQotICAgIGlmICgqcEFsZyA9PSBBVVRIX01PREVfT1BFTikKLSAgICB7Ci0gICAgICAgIGlmICgqcFNlcSA9PSAxIHx8ICpwU2VxID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckF1dGhTYW5pdHkgZmFpbCAtIHdyb25nIFNlZyNcbiIpKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICgqcEFsZyA9PSBBVVRIX01PREVfS0VZKQotICAgIHsKLSAgICAgICAgaWYgKCpwU2VxID09IDEgfHwgKnBTZXEgPT0gNCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKnBTZXEgPT0gMiB8fCAqcFNlcSA9PSAzKQotICAgICAgICB7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ2hsZ1RleHQsICZwRnJhbWUtPk9jdGV0WzhdLCBDSVBIRVJfVEVYVF9MRU4pOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXV0aFNhbml0eSBmYWlsIC0gd3JvbmcgU2VnI1xuIikpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBhbGdvcml0aG1cbiIpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBNbG1lQXV0aFJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIsCi0gICAgT1VUIFVMT05HICpwVGltZW91dCwKLSAgICBPVVQgVVNIT1JUICpwQWxnKQotewotICAgIE1MTUVfQVVUSF9SRVFfU1RSVUNUICpwSW5mbzsKLQotICAgIHBJbmZvICA9IChNTE1FX0FVVEhfUkVRX1NUUlVDVCAqKU1zZzsKLSAgICBDT1BZX01BQ19BRERSKHBBZGRyLCBwSW5mby0+QWRkcik7Ci0gICAgKnBUaW1lb3V0ID0gcEluZm8tPlRpbWVvdXQ7Ci0gICAgKnBBbGcgPSBwSW5mby0+QWxnOwotCi0gICAgaWYgKCgoKnBBbGcgPT0gQVVUSF9NT0RFX0tFWSkgfHwoKnBBbGcgPT0gQVVUSF9NT0RFX09QRU4pCi0JKSAmJgotICAgICAgICAoKCpwQWRkciAmIDB4MDEpID09IDApKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVBdXRoUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBhbGdvcml0aG1cbiIpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gTWxtZUFzc29jUmVxU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwQXBBZGRyLAotICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKLSAgICBPVVQgVUxPTkcgKnBUaW1lb3V0LAotICAgIE9VVCBVU0hPUlQgKnBMaXN0ZW5JbnR2KQotewotICAgIE1MTUVfQVNTT0NfUkVRX1NUUlVDVCAqcEluZm87Ci0KLSAgICBwSW5mbyA9IChNTE1FX0FTU09DX1JFUV9TVFJVQ1QgKilNc2c7Ci0gICAgKnBUaW1lb3V0ID0gcEluZm8tPlRpbWVvdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lb3V0Ci0gICAgQ09QWV9NQUNfQUREUihwQXBBZGRyLCBwSW5mby0+QWRkcik7ICAgICAgICAgICAgICAgICAgIC8vIEFQIGFkZHJlc3MKLSAgICAqcENhcGFiaWxpdHlJbmZvID0gcEluZm8tPkNhcGFiaWxpdHlJbmZvOyAgICAgICAgICAgICAgIC8vIGNhcGFiaWxpdHkgaW5mbwotICAgICpwTGlzdGVuSW50diA9IHBJbmZvLT5MaXN0ZW5JbnR2OwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjawotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIFBlZXJEaXNhc3NvY1Nhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBVU0hPUlQgKnBSZWFzb24pCi17Ci0gICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7Ci0KLSAgICBDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBSZWFzb24sICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVNhbml0eSBjaGVjayBOZXR3b3JrVHlwZSAoMTFiLCAxMWcgb3IgMTFhKQotCi0JQXJndW1lbnRzOgotCQlwQnNzIC0gUG9pbnRlciB0byBCU1MgdGFibGUuCi0KLQlSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5kaXM4MDJfMTFEUyAuLi4uLi4uKDExYikKLSAgICAgICAgTmRpczgwMl8xMU9GRE0yNC4uLi4oMTFnKQotICAgICAgICBOZGlzODAyXzExT0ZETTUuLi4uLigxMWEpCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfODAyXzExX05FVFdPUktfVFlQRSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KAotICAgIElOIFBCU1NfRU5UUlkgcEJzcykKLXsKLQlORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUJTmV0V29ya1R5cGU7Ci0JVUNIQVIJCQkJCQlyYXRlLCBpOwotCi0JTmV0V29ya1R5cGUgPSBOZGlzODAyXzExRFM7Ci0KLQlpZiAocEJzcy0+Q2hhbm5lbCA8PSAxNCkKLQl7Ci0JCS8vCi0JCS8vIEZpcnN0IGNoZWNrIHN1cHBvcnQgUmF0ZS4KLQkJLy8KLQkJZm9yIChpID0gMDsgaSA8IHBCc3MtPlN1cFJhdGVMZW47IGkrKykKLQkJewotCQkJcmF0ZSA9IHBCc3MtPlN1cFJhdGVbaV0gJiAweDdmOyAvLyBNYXNrIG91dCBiYXNpYyByYXRlIHNldCBiaXQKLQkJCWlmICgocmF0ZSA9PSAyKSB8fCAocmF0ZSA9PSA0KSB8fCAocmF0ZSA9PSAxMSkgfHwgKHJhdGUgPT0gMjIpKQotCQkJewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vCi0JCQkJLy8gT3RoZXJ3aXNlIChldmVuIHJhdGUgPiAxMDgpIG1lYW5zIE5kaXM4MDJfMTFPRkRNMjQKLQkJCQkvLwotCQkJCU5ldFdvcmtUeXBlID0gTmRpczgwMl8xMU9GRE0yNDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vCi0JCS8vIFNlY29uZCBjaGVjayBFeHRlbmQgUmF0ZS4KLQkJLy8KLQkJaWYgKE5ldFdvcmtUeXBlICE9IE5kaXM4MDJfMTFPRkRNMjQpCi0JCXsKLQkJCWZvciAoaSA9IDA7IGkgPCBwQnNzLT5FeHRSYXRlTGVuOyBpKyspCi0JCQl7Ci0JCQkJcmF0ZSA9IHBCc3MtPlN1cFJhdGVbaV0gJiAweDdmOyAvLyBNYXNrIG91dCBiYXNpYyByYXRlIHNldCBiaXQKLQkJCQlpZiAoKHJhdGUgPT0gMikgfHwgKHJhdGUgPT0gNCkgfHwgKHJhdGUgPT0gMTEpIHx8IChyYXRlID09IDIyKSkKLQkJCQl7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLwotCQkJCQkvLyBPdGhlcndpc2UgKGV2ZW4gcmF0ZSA+IDEwOCkgbWVhbnMgTmRpczgwMl8xMU9GRE0yNAotCQkJCQkvLwotCQkJCQlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNMjQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNNTsKLQl9Ci0KLSAgICBpZiAocEJzcy0+SHRDYXBhYmlsaXR5TGVuICE9IDApCi0gICAgewotICAgICAgICBpZiAoTmV0V29ya1R5cGUgPT0gTmRpczgwMl8xMU9GRE01KQotICAgICAgICAgICAgTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTVfTjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTI0X047Ci0gICAgfQotCi0JcmV0dXJuIE5ldFdvcmtUeXBlOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIENoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgcmVjZWl2ZWQgRUFQb0wgZnJhbWUKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLAotICAgICAgICBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIFBlZXJXcGFNZXNzYWdlU2FuaXR5KAotICAgIElOCVBSVE1QX0FEQVBURVIJCXBBZCwKLSAgICBJTglQRUFQT0xfUEFDS0VUCQlwTXNnLAotICAgIElOCVVMT05HCQkJCU1zZ0xlbiwKLSAgICBJTglVQ0hBUgkJCQlNc2dUeXBlLAotICAgIElOCU1BQ19UQUJMRV9FTlRSWQkJKnBFbnRyeSkKLXsKLQlVQ0hBUgkJCW1pY1tMRU5fS0VZX0RFU0NfTUlDXSwgZGlnZXN0WzgwXSwgS0VZREFUQVtNQVhfTEVOX09GX1JTTklFXTsKLQlCT09MRUFOCQkJYlJlcGxheURpZmYgPSBGQUxTRTsKLQlCT09MRUFOCQkJYldQQTIgPSBGQUxTRTsKLQlLRVlfSU5GTwkJRWFwb2xLZXlJbmZvOwotCVVDSEFSCQkJR3JvdXBLZXlJbmRleCA9IDA7Ci0KLQotCU5kaXNaZXJvTWVtb3J5KG1pYywgc2l6ZW9mKG1pYykpOwotCU5kaXNaZXJvTWVtb3J5KGRpZ2VzdCwgc2l6ZW9mKGRpZ2VzdCkpOwotCU5kaXNaZXJvTWVtb3J5KEtFWURBVEEsIHNpemVvZihLRVlEQVRBKSk7Ci0JTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmRWFwb2xLZXlJbmZvLCBzaXplb2YoRWFwb2xLZXlJbmZvKSk7Ci0KLQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZFYXBvbEtleUluZm8sIChQVUNIQVIpJnBNc2ctPktleURlc2MuS2V5SW5mbywgc2l6ZW9mKEtFWV9JTkZPKSk7Ci0KLQkqKChVU0hPUlQgKikmRWFwb2xLZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZFYXBvbEtleUluZm8pKTsKLQotCS8vIENob29zZSBXUEEyIG9yIG5vdAotCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJYldQQTIgPSBUUlVFOwotCi0JLy8gMC4gQ2hlY2sgTXNnVHlwZQotCWlmICgoTXNnVHlwZSA+IEVBUE9MX0dST1VQX01TR18yKSB8fCAoTXNnVHlwZSA8IEVBUE9MX1BBSVJfTVNHXzEpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiVGhlIG1lc3NhZ2UgdHlwZSBpcyBpbnZhbGlkKCVkKSEgXG4iLCBNc2dUeXBlKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQkvLyAxLiBSZXBsYXkgY291bnRlciBjaGVjawotCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zIHx8IE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCS8vIEZvciBzdXBwbGljYW50Ci0gICAgewotCS8vIEZpcnN0IHZhbGlkYXRlIHJlcGxheSBjb3VudGVyLCBvbmx5IGFjY2VwdCBtZXNzYWdlIHdpdGggbGFyZ2VyIHJlcGxheSBjb3VudGVyLgotCQkvLyBMZXQgZXF1YWwgcGFzcywgc29tZSBBUCBzdGFydCB3aXRoIGFsbCB6ZXJvIHJlcGxheSBjb3VudGVyCi0JCVVDSEFSCVplcm9SZXBsYXlbTEVOX0tFWV9ERVNDX1JFUExBWV07Ci0KLSAgICAgICAgTmRpc1plcm9NZW1vcnkoWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0JCWlmICgoUlRNUENvbXBhcmVNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwRW50cnktPlJfQ291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkgJiYKLQkJCShSVE1QQ29tcGFyZU1lbW9yeShwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDApKQotCXsKLQkJCWJSZXBsYXlEaWZmID0gVFJVRTsKLQl9Ci0JfQotCWVsc2UgaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMiB8fCBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzQgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMikJLy8gRm9yIGF1dGhlbnRpY2F0b3IKLQl7Ci0JCS8vIGNoZWNrIFJlcGxheSBDb3VudGVyIGNvcmVzcG9uZHMgdG8gTVNHIGZyb20gYXV0aGVudGljYXRvciwgb3RoZXJ3aXNlIGRpc2NhcmQKLQlpZiAoIU5kaXNFcXVhbE1lbW9yeShwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBFbnRyeS0+Ul9Db3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSkKLQl7Ci0JCQliUmVwbGF5RGlmZiA9IFRSVUU7Ci0JfQotCX0KLQotCS8vIFJlcGxheSBDb3VudGVyIGRpZmZlcmVudCBjb25kaXRpb24KLQlpZiAoYlJlcGxheURpZmYpCi0JewotCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHJlcGxheSBjb3VudGVyIGRpZmZlcmVudAotCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19SRVBMQVlfQ09VTlRFUl9ESUZGX0VWRU5UX0ZMQUcsIHBFbnRyeS0+QWRkciwgcEVudHJ5LT5hcGlkeCwgMCk7Ci0KLQkJaWYgKE1zZ1R5cGUgPCBFQVBPTF9HUk9VUF9NU0dfMSkKLQkJewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSZXBsYXkgQ291bnRlciBEaWZmZXJlbnQgaW4gcGFpcndpc2UgbXNnICVkIG9mIDQtd2F5IGhhbmRzaGFrZSFcbiIsIE1zZ1R5cGUpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJlcGxheSBDb3VudGVyIERpZmZlcmVudCBpbiBncm91cCBtc2cgJWQgb2YgMi13YXkgaGFuZHNoYWtlIVxuIiwgKE1zZ1R5cGUgLSBFQVBPTF9QQUlSX01TR180KSkpOwotCQl9Ci0KLQkJaGV4X2R1bXAoIlJlY2VpdmUgcmVwbGF5IGNvdW50ZXIgIiwgcE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLQkJaGV4X2R1bXAoIkN1cnJlbnQgcmVwbGF5IGNvdW50ZXIgIiwgcEVudHJ5LT5SX0NvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0JfQotCi0JLy8gMi4gVmVyaWZ5IE1JQyBleGNlcHQgUGFpcndpc2UgTXNnMQotCWlmIChNc2dUeXBlICE9IEVBUE9MX1BBSVJfTVNHXzEpCi0JewotCQlVQ0hBUgkJCXJjdmRfbWljW0xFTl9LRVlfREVTQ19NSUNdOwotCi0JCS8vIFJlY29yZCB0aGUgcmVjZWl2ZWQgTUlDIGZvciBjaGVjayBsYXRlcgotCQlOZGlzTW92ZU1lbW9yeShyY3ZkX21pYywgcE1zZy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCQlOZGlzWmVyb01lbW9yeShwTXNnLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7Ci0KLSAgICAgICAgaWYgKEVhcG9sS2V5SW5mby5LZXlEZXNjVmVyID09IERFU0NfVFlQRV9US0lQKQkvLyBUS0lQCi0gICAgICAgIHsKLSAgICAgICAgICAgIEhNQUNfTUQ1KHBFbnRyeS0+UFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpcE1zZywgTXNnTGVuLCBtaWMsIE1ENV9ESUdFU1RfU0laRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoRWFwb2xLZXlJbmZvLktleURlc2NWZXIgPT0gREVTQ19UWVBFX0FFUykJLy8gQUVTCi0gICAgICAgIHsKLSAgICAgICAgICAgIEhNQUNfU0hBMShwRW50cnktPlBUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKXBNc2csIE1zZ0xlbiwgZGlnZXN0LCBTSEExX0RJR0VTVF9TSVpFKTsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KG1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghTmRpc0VxdWFsTWVtb3J5KHJjdmRfbWljLCBtaWMsIExFTl9LRVlfREVTQ19NSUMpKQotICAgICAgICB7Ci0JCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIE1JQyBkaWZmZXJlbnQKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19NSUNfRElGRl9FVkVOVF9GTEFHLCBwRW50cnktPkFkZHIsIHBFbnRyeS0+YXBpZHgsIDApOwotCi0JCQlpZiAoTXNnVHlwZSA8IEVBUE9MX0dST1VQX01TR18xKQotCQkJewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNSUMgRGlmZmVyZW50IGluIHBhaXJ3aXNlIG1zZyAlZCBvZiA0LXdheSBoYW5kc2hha2UhXG4iLCBNc2dUeXBlKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTUlDIERpZmZlcmVudCBpbiBncm91cCBtc2cgJWQgb2YgMi13YXkgaGFuZHNoYWtlIVxuIiwgKE1zZ1R5cGUgLSBFQVBPTF9QQUlSX01TR180KSkpOwotCQkJfQotCi0JCQloZXhfZHVtcCgiUmVjZWl2ZWQgTUlDIiwgcmN2ZF9taWMsIExFTl9LRVlfREVTQ19NSUMpOwotCQkJaGV4X2R1bXAoIkRlc2lyZWQgIE1JQyIsIG1pYywgTEVOX0tFWV9ERVNDX01JQyk7Ci0KLQkJCXJldHVybiBGQUxTRTsKLSAgICAgICAgfQotCX0KLQotCS8vIDEuIERlY3J5cHQgdGhlIEtleSBEYXRhIGZpZWxkIGlmIEdUSyBpcyBpbmNsdWRlZC4KLQkvLyAyLiBFeHRyYWN0IHRoZSBjb250ZXh0IG9mIHRoZSBLZXkgRGF0YSBmaWVsZCBpZiBpdCBleGlzdC4KLQkvLyBUaGUgZmllbGQgaW4gcGFpcndpc2VfbXNnXzJfV1BBMShXUEEyKSAmIHBhaXJ3aXNlX21zZ18zX1dQQTEgaXMgY2xlYXIuCi0JLy8gVGhlIGZpZWxkIGluIGdyb3VwX21zZ18xX1dQQTEoV1BBMikgJiBwYWlyd2lzZV9tc2dfM19XUEEyIGlzIGVuY3J5cHRlZC4KLQlpZiAoQ09OVl9BUlJBUllfVE9fVUlOVDE2KHBNc2ctPktleURlc2MuS2V5RGF0YUxlbikgPiAwKQotCXsKLQkJLy8gRGVjcnlwdCB0aGlzIGZpZWxkCi0JCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCi0JCXsKLQkJCWlmKAotCQkJCShFYXBvbEtleUluZm8uS2V5RGVzY1ZlciA9PSBERVNDX1RZUEVfQUVTKSkKLQkJCXsKLQkJCQkvLyBBRVMKLQkJCQlBRVNfR1RLX0tFWV9VTldSQVAoJnBFbnRyeS0+UFRLWzE2XSwgS0VZREFUQSwKLQkJCQkJCQkJCUNPTlZfQVJSQVJZX1RPX1VJTlQxNihwTXNnLT5LZXlEZXNjLktleURhdGFMZW4pLAotCQkJCQkJCQkJcE1zZy0+S2V5RGVzYy5LZXlEYXRhKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlJTlQJaTsKLQkJCQlVQ0hBUiAgIEtleVszMl07Ci0JCQkJLy8gRGVjcnlwdCBUS0lQIEdUSwotCQkJCS8vIENvbnN0cnVjdCAzMiBieXRlcyBSQzQgS2V5Ci0JCQkJTmRpc01vdmVNZW1vcnkoS2V5LCBwTXNnLT5LZXlEZXNjLktleUl2LCAxNik7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJktleVsxNl0sICZwRW50cnktPlBUS1sxNl0sIDE2KTsKLQkJCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS2V5LCAzMik7Ci0JCQkJLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcwotCQkJCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQotCQkJCQlBUkNGT1VSX0JZVEUoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCk7Ci0JCQkJLy8gRGVjcnlwdCBHVEsuIEJlY2FyZWZ1bCwgdGhlcmUgaXMgbm8gSUNWIHRvIGNoZWNrIHRoZSByZXN1bHQgaXMgY29ycmVjdCBvciBub3QKLQkJCQlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS0VZREFUQSwKLQkJCQkJCQkJcE1zZy0+S2V5RGVzYy5LZXlEYXRhLAotCQkJCQkJCQlDT05WX0FSUkFSWV9UT19VSU5UMTYocE1zZy0+S2V5RGVzYy5LZXlEYXRhTGVuKSk7Ci0JCQl9Ci0KLQkJCWlmICghYldQQTIgJiYgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQotCQkJCUdyb3VwS2V5SW5kZXggPSBFYXBvbEtleUluZm8uS2V5SW5kZXg7Ci0KLQkJfQotCQllbHNlIGlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18yKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmICFiV1BBMikpCi0JCXsKLQkJCU5kaXNNb3ZlTWVtb3J5KEtFWURBVEEsIHBNc2ctPktleURlc2MuS2V5RGF0YSwgQ09OVl9BUlJBUllfVE9fVUlOVDE2KHBNc2ctPktleURlc2MuS2V5RGF0YUxlbikpOwotCQl9Ci0JCWVsc2UKLQkJewotCi0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCi0JCS8vIFBhcnNlIEtleSBEYXRhIGZpZWxkIHRvCi0JCS8vIDEuIHZlcmlmeSBSU04gSUUgZm9yIHBhaXJ3aXNlX21zZ18yX1dQQTEoV1BBMikgLHBhaXJ3aXNlX21zZ18zX1dQQTEoV1BBMikKLQkJLy8gMi4gdmVyaWZ5IEtERSBmb3JtYXQgZm9yIHBhaXJ3aXNlX21zZ18zX1dQQTIsIGdyb3VwX21zZ18xX1dQQTIKLQkJLy8gMy4gdXBkYXRlIHNoYXJlZCBrZXkgZm9yIHBhaXJ3aXNlX21zZ18zX1dQQTIsIGdyb3VwX21zZ18xX1dQQTEoV1BBMikKLQkJaWYgKCFSVE1QUGFyc2VFYXBvbEtleURhdGEocEFkLCBLRVlEQVRBLAotCQkJCQkJCQkgIENPTlZfQVJSQVJZX1RPX1VJTlQxNihwTXNnLT5LZXlEZXNjLktleURhdGFMZW4pLAotCQkJCQkJCQkgIEdyb3VwS2V5SW5kZXgsIE1zZ1R5cGUsIGJXUEEyLCBwRW50cnkpKQotCQl7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLQotfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi1CT09MRUFOIE1sbWVEbHNSZXFTYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFJUXzgwMl8xMV9ETFMgKnBETFMsCi0gICAgT1VUIFBVU0hPUlQgcFJlYXNvbikKLXsKLQlNTE1FX0RMU19SRVFfU1RSVUNUICpwSW5mbzsKLQotICAgIHBJbmZvID0gKE1MTUVfRExTX1JFUV9TVFJVQ1QgKilNc2c7Ci0KLQkqcERMUyA9IHBJbmZvLT5wRExTOwotCSpwUmVhc29uID0gcEluZm8tPlJlYXNvbjsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi1CT09MRUFOIFBlZXJEbHNSZXFTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBEQSwKLSAgICBPVVQgUFVDSEFSIHBTQSwKLSAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCi0gICAgT1VUIFVTSE9SVCAqcERsc1RpbWVvdXQsCi0gICAgT1VUIFVDSEFSICpwUmF0ZXNMZW4sCi0gICAgT1VUIFVDSEFSIFJhdGVzW10sCi0JT1VUIFVDSEFSICpwSHRDYXBhYmlsaXR5TGVuLAotICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5KQotewotCUNIQVIgICAgICAgICAgICAqUHRyOwotICAgIFBGUkFNRV84MDJfMTEJRnIgPSAoUEZSQU1FXzgwMl8xMSlNc2c7Ci0JUEVJRF9TVFJVQ1QgIGVpZF9wdHI7Ci0KLSAgICAvLyB0byBwcmV2ZW50IGNhbGxlciBmcm9tIHVzaW5nIGdhcmJhZ2Ugb3V0cHV0IHZhbHVlCi0gICAgKnBDYXBhYmlsaXR5SW5mbwk9IDA7Ci0gICAgKnBEbHNUaW1lb3V0CT0gMDsKLQkqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7Ci0KLSAgICBQdHIgPSAoUENIQVIpRnItPk9jdGV0OwotCi0JLy8gb2Zmc2V0IHRvIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIChDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkKQotICAgIFB0ciArPSAyOwotCi0gICAgLy8gZ2V0IERBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIE5kaXNNb3ZlTWVtb3J5KHBEQSwgUHRyLCBNQUNfQUREUl9MRU4pOwotICAgIFB0ciArPSBNQUNfQUREUl9MRU47Ci0KLSAgICAvLyBnZXQgU0EgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocFNBLCBQdHIsIE1BQ19BRERSX0xFTik7Ci0gICAgUHRyICs9IE1BQ19BRERSX0xFTjsKLQotICAgIC8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocENhcGFiaWxpdHlJbmZvLCBQdHIsIDIpOwotICAgIFB0ciArPSAyOwotCi0gICAgLy8gZ2V0IGNhcGFiaWxpdHkgaW5mbyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLSAgICBOZGlzTW92ZU1lbW9yeShwRGxzVGltZW91dCwgUHRyLCAyKTsKLSAgICBQdHIgKz0gMjsKLQotCS8vIENhdGVnb3J5IGFuZCBBY3Rpb24gZmllbGQgKyBEQSArIFNBICsgY2FwYWJpbGl0eSArIFRpbWVvdXQKLQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSAmRnItPk9jdGV0WzE4XTsKLQotCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFVDSEFSKilGciArIE1zZ0xlbikpCi0JewotCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQotCQl7Ci0JCQljYXNlIElFX1NVUFBfUkFURVM6Ci0gICAgICAgICAgICAgICAgaWYgKChlaWRfcHRyLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpICYmIChlaWRfcHRyLT5MZW4gPiAwKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFJhdGVzLCBlaWRfcHRyLT5PY3RldCwgZWlkX3B0ci0+TGVuKTsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JlcVNhbml0eSAtIElFX1NVUFBfUkFURVMuLCBMZW49JWQuIFJhdGVzWzBdPSV4XG4iLGVpZF9wdHItPkxlbiwgUmF0ZXNbMF0pKTsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmF0ZXNbMV09JXggJXggJXggJXggJXggJXggJXhcbiIsIFJhdGVzWzFdLCBSYXRlc1syXSwgUmF0ZXNbM10sIFJhdGVzWzRdLCBSYXRlc1s1XSwgUmF0ZXNbNl0sIFJhdGVzWzddKSk7Ci0gICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSBlaWRfcHRyLT5MZW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSA4OwotCQkJCQlSYXRlc1swXSA9IDB4ODI7Ci0JCQkJCVJhdGVzWzFdID0gMHg4NDsKLQkJCQkJUmF0ZXNbMl0gPSAweDhiOwotCQkJCQlSYXRlc1szXSA9IDB4OTY7Ci0JCQkJCVJhdGVzWzRdID0gMHgxMjsKLQkJCQkJUmF0ZXNbNV0gPSAweDI0OwotCQkJCQlSYXRlc1s2XSA9IDB4NDg7Ci0JCQkJCVJhdGVzWzddID0gMHg2YzsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JlcVNhbml0eSAtIHdyb25nIElFX1NVUFBfUkFURVMuLCBMZW49JWRcbiIsZWlkX3B0ci0+TGVuKSk7Ci0gICAgICAgICAgICAgICAgfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIElFX0VYVF9TVVBQX1JBVEVTOgotICAgICAgICAgICAgICAgIGlmIChlaWRfcHRyLT5MZW4gKyAqcFJhdGVzTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlJhdGVzWypwUmF0ZXNMZW5dLCBlaWRfcHRyLT5PY3RldCwgZWlkX3B0ci0+TGVuKTsKLSAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9ICgqcFJhdGVzTGVuKSArIGVpZF9wdHItPkxlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlJhdGVzWypwUmF0ZXNMZW5dLCBlaWRfcHRyLT5PY3RldCwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMgLSAoKnBSYXRlc0xlbikpOwotICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7Ci0gICAgICAgICAgICAgICAgfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIElFX0hUX0NBUDoKLQkJCQlpZiAoZWlkX3B0ci0+TGVuID49IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSkKLQkJCQl7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksIGVpZF9wdHItPk9jdGV0LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOwotCi0JCQkJCSooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykpOwotI2lmZGVmIFVOQUxJR05NRU5UX1NVUFBPUlQKLQkJCQkJewotCQkJCQkJRVhUX0hUX0NBUF9JTkZPIGV4dEh0Q2FwSW5mbzsKLQotCQkJCQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikoJmV4dEh0Q2FwSW5mbyksIChQVUNIQVIpKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pLCBzaXplb2YoRVhUX0hUX0NBUF9JTkZPKSk7Ci0JCQkJCQkqKFVTSE9SVCAqKSgmZXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZleHRIdENhcEluZm8pKTsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pLCAoUFVDSEFSKSgmZXh0SHRDYXBJbmZvKSwgc2l6ZW9mKEVYVF9IVF9DQVBfSU5GTykpOwotCQkJCQl9Ci0jZWxzZQotCQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKLSNlbmRpZiAvLyBVTkFMSUdOTUVOVF9TVVBQT1JUIC8vCi0JCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOwotCi0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSBJRV9IVF9DQVBcbiIpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JlcVNhbml0eSAtIHdyb25nIElFX0hUX0NBUC5laWRfcHRyLT5MZW4gPSAlZFxuIiwgZWlkX3B0ci0+TGVuKSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0KLQkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7Ci0JfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUJPT0xFQU4gUGVlckRsc1JzcFNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcERBLAotICAgIE9VVCBQVUNIQVIgcFNBLAotICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKLSAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAotICAgIE9VVCBVQ0hBUiAqcFJhdGVzTGVuLAotICAgIE9VVCBVQ0hBUiBSYXRlc1tdLAotICAgIE9VVCBVQ0hBUiAqcEh0Q2FwYWJpbGl0eUxlbiwKLSAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSkKLXsKLSAgICBDSEFSICAgICAgICAgICAgKlB0cjsKLSAgICBQRlJBTUVfODAyXzExCUZyID0gKFBGUkFNRV84MDJfMTEpTXNnOwotCVBFSURfU1RSVUNUICBlaWRfcHRyOwotCi0gICAgLy8gdG8gcHJldmVudCBjYWxsZXIgZnJvbSB1c2luZyBnYXJiYWdlIG91dHB1dCB2YWx1ZQotICAgICpwU3RhdHVzCQk9IDA7Ci0gICAgKnBDYXBhYmlsaXR5SW5mbwk9IDA7Ci0JKnBIdENhcGFiaWxpdHlMZW4gPSAwOwotCi0gICAgUHRyID0gKFBDSEFSKUZyLT5PY3RldDsKLQotCS8vIG9mZnNldCB0byBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAoQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCkKLSAgICBQdHIgKz0gMjsKLQotCS8vIGdldCBzdGF0dXMgY29kZSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLSAgICBOZGlzTW92ZU1lbW9yeShwU3RhdHVzLCBQdHIsIDIpOwotICAgIFB0ciArPSAyOwotCi0gICAgLy8gZ2V0IERBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIE5kaXNNb3ZlTWVtb3J5KHBEQSwgUHRyLCBNQUNfQUREUl9MRU4pOwotICAgIFB0ciArPSBNQUNfQUREUl9MRU47Ci0KLSAgICAvLyBnZXQgU0EgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocFNBLCBQdHIsIE1BQ19BRERSX0xFTik7Ci0gICAgUHRyICs9IE1BQ19BRERSX0xFTjsKLQotCWlmIChwU3RhdHVzID09IDApCi0JewotCSAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotCSAgICBOZGlzTW92ZU1lbW9yeShwQ2FwYWJpbGl0eUluZm8sIFB0ciwgMik7Ci0JICAgIFB0ciArPSAyOwotCX0KLQotCS8vIENhdGVnb3J5IGFuZCBBY3Rpb24gZmllbGQgKyBzdGF0dXMgY29kZSArIERBICsgU0EgKyBjYXBhYmlsaXR5Ci0JZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkgJkZyLT5PY3RldFsxOF07Ci0KLQl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChVQ0hBUiopRnIgKyBNc2dMZW4pKQotCXsKLQkJc3dpdGNoKGVpZF9wdHItPkVpZCkKLQkJewotCQkJY2FzZSBJRV9TVVBQX1JBVEVTOgotICAgICAgICAgICAgICAgIGlmICgoZWlkX3B0ci0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSAmJiAoZWlkX3B0ci0+TGVuID4gMCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShSYXRlcywgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSc3BTYW5pdHkgLSBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkLiBSYXRlc1swXT0leFxuIixlaWRfcHRyLT5MZW4sIFJhdGVzWzBdKSk7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhdGVzWzFdPSV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLCBSYXRlc1sxXSwgUmF0ZXNbMl0sIFJhdGVzWzNdLCBSYXRlc1s0XSwgUmF0ZXNbNV0sIFJhdGVzWzZdLCBSYXRlc1s3XSkpOwotICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gZWlkX3B0ci0+TGVuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gODsKLQkJCQkJUmF0ZXNbMF0gPSAweDgyOwotCQkJCQlSYXRlc1sxXSA9IDB4ODQ7Ci0JCQkJCVJhdGVzWzJdID0gMHg4YjsKLQkJCQkJUmF0ZXNbM10gPSAweDk2OwotCQkJCQlSYXRlc1s0XSA9IDB4MTI7Ci0JCQkJCVJhdGVzWzVdID0gMHgyNDsKLQkJCQkJUmF0ZXNbNl0gPSAweDQ4OwotCQkJCQlSYXRlc1s3XSA9IDB4NmM7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSc3BTYW5pdHkgLSB3cm9uZyBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkXG4iLGVpZF9wdHItPkxlbikpOwotICAgICAgICAgICAgICAgIH0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKLSAgICAgICAgICAgICAgICBpZiAoZWlkX3B0ci0+TGVuICsgKnBSYXRlc0xlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7Ci0gICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSAoKnBSYXRlc0xlbikgKyBlaWRfcHRyLT5MZW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTIC0gKCpwUmF0ZXNMZW4pKTsKLSAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOwotICAgICAgICAgICAgICAgIH0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBJRV9IVF9DQVA6Ci0JCQkJaWYgKGVpZF9wdHItPkxlbiA+PSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpCi0JCQkJewotCQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBlaWRfcHRyLT5PY3RldCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLQotCQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKLSNpZmRlZiBVTkFMSUdOTUVOVF9TVVBQT1JUCi0JCQkJCXsKLQkJCQkJCUVYVF9IVF9DQVBfSU5GTyBleHRIdENhcEluZm87Ci0KLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZleHRIdENhcEluZm8pLCAoUFVDSEFSKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSwgc2l6ZW9mKEVYVF9IVF9DQVBfSU5GTykpOwotCQkJCQkJKihVU0hPUlQgKikoJmV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmZXh0SHRDYXBJbmZvKSk7Ci0JCQkJCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSwgKFBVQ0hBUikoJmV4dEh0Q2FwSW5mbyksIHNpemVvZihFWFRfSFRfQ0FQX0lORk8pKTsKLQkJCQkJfQotI2Vsc2UKLQkJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7Ci0jZW5kaWYgLy8gVU5BTElHTk1FTlRfU1VQUE9SVCAvLwotCQkJCQkqcEh0Q2FwYWJpbGl0eUxlbiA9IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKTsKLQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUnNwU2FuaXR5IC0gSUVfSFRfQ0FQXG4iKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSc3BTYW5pdHkgLSB3cm9uZyBJRV9IVF9DQVAuZWlkX3B0ci0+TGVuID0gJWRcbiIsIGVpZF9wdHItPkxlbikpOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCi0JCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOwotCX0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi1CT09MRUFOIFBlZXJEbHNUZWFyRG93blNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcERBLAotICAgIE9VVCBQVUNIQVIgcFNBLAotICAgIE9VVCBVU0hPUlQgKnBSZWFzb24pCi17Ci0gICAgQ0hBUiAgICAgICAgICAgICpQdHI7Ci0gICAgUEZSQU1FXzgwMl8xMQlGciA9IChQRlJBTUVfODAyXzExKU1zZzsKLQotICAgIC8vIHRvIHByZXZlbnQgY2FsbGVyIGZyb20gdXNpbmcgZ2FyYmFnZSBvdXRwdXQgdmFsdWUKLSAgICAqcFJlYXNvbgk9IDA7Ci0KLSAgICBQdHIgPSAoUENIQVIpRnItPk9jdGV0OwotCi0JLy8gb2Zmc2V0IHRvIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIChDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkKQotICAgIFB0ciArPSAyOwotCi0gICAgLy8gZ2V0IERBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIE5kaXNNb3ZlTWVtb3J5KHBEQSwgUHRyLCBNQUNfQUREUl9MRU4pOwotICAgIFB0ciArPSBNQUNfQUREUl9MRU47Ci0KLSAgICAvLyBnZXQgU0EgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocFNBLCBQdHIsIE1BQ19BRERSX0xFTik7Ci0gICAgUHRyICs9IE1BQ19BRERSX0xFTjsKLQotCS8vIGdldCByZWFzb24gY29kZSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLSAgICBOZGlzTW92ZU1lbW9yeShwUmVhc29uLCBQdHIsIDIpOwotICAgIFB0ciArPSAyOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fc3luYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3N5bmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ3Yjk3NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fc3luYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzM0ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JY21tX3N5bmMuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4gQ2hhbmcJMjAwNC0wOS0wMSAgICAgIG1vZGlmaWVkIGZvciBydDI1NjEvMjY2MQotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLS8vIDIuNCBHaHogY2hhbm5lbCBwbGFuIGluZGV4IGluIHRoZSBUeFBvd2VyIGFycmF5cy4KLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fMF9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fMF9TSVpFCTExCi0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzFfU1RBUlQJMAkJCS8vIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzCi0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzFfU0laRQkxMwotI2RlZmluZQlCR19CQU5EX1JFR0lPTl8yX1NUQVJUCTkJCQkvLyAxMCwxMQotI2RlZmluZQlCR19CQU5EX1JFR0lPTl8yX1NJWkUJMgotI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zX1NUQVJUCTkJCQkvLyAxMCwxMSwxMiwxMwotI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zX1NJWkUJNAotI2RlZmluZQlCR19CQU5EX1JFR0lPTl80X1NUQVJUCTEzCQkJLy8gMTQKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fNF9TSVpFCTEKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fNV9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fNV9TSVpFCTE0Ci0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzZfU1RBUlQJMgkJCS8vIDMsNCw1LDYsNyw4LDkKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fNl9TSVpFCTcKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fN19TVEFSVAk0CQkJLy8gNSw2LDcsOCw5LDEwLDExLDEyLDEzCi0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzdfU0laRQk5Ci0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzMxX1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNAotI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zMV9TSVpFCTE0Ci0KLS8vIDUgR2h6IGNoYW5uZWwgcGxhbiBpbmRleCBpbiB0aGUgVHhQb3dlciBhcnJheXMuCi1VQ0hBUiBBX0JBTkRfUkVHSU9OXzBfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl8xX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKLVVDSEFSIEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0fTsKLVVDSEFSIEFfQkFORF9SRUdJT05fM19DSEFOTkVMX0xJU1RbXT17NTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MX07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzRfQ0hBTk5FTF9MSVNUW109ezE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKLVVDSEFSIEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1RbXT17MTQ5LCAxNTMsIDE1NywgMTYxfTsKLVVDSEFSIEFfQkFORF9SRUdJT05fNl9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDh9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl83X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NSwgMTY5LCAxNzN9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl84X0NIQU5ORUxfTElTVFtdPXs1MiwgNTYsIDYwLCA2NH07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzlfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKLVVDSEFSIEFfQkFORF9SRUdJT05fMTBfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzExX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDE0OSwgMTUzLCAxNTcsIDE2MX07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzEyX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKLVVDSEFSIEFfQkFORF9SRUdJT05fMTNfQ0hBTk5FTF9MSVNUW109ezUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxfTsKLVVDSEFSIEFfQkFORF9SRUdJT05fMTRfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzE1X0NIQU5ORUxfTElTVFtdPXsxNDksIDE1MywgMTU3LCAxNjEsIDE2NSwgMTY5LCAxNzN9OwotCi0KLS8vQmFTaXplQXJyYXkgZm9sbG93cyB0aGUgODAyLjExbiBkZWZpbml0aW9uIGFzIE1heFJ4RmFjdG9yLiAgMl4oMTMrZmFjdG9yKSBieXRlcy4gV2hlbiBmYWN0b3IgPTAsIGl0J3MgYWJvdXQgQmEgYnVmZmVyIHNpemUgPTguCi1VQ0hBUiBCYVNpemVBcnJheVs0XSA9IHs4LDE2LDMyLDY0fTsKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlVcGRhdGUgU3RhQ2ZnLT5DaGFubmVsTGlzdFtdIGFjY29yZGluZyB0byAxKSBDb3VudHJ5IFJlZ2lvbiAyKSBSRiBJQyB0eXBlLAotCQlhbmQgMykgUEhZLW1vZGUgdXNlciBzZWxlY3RlZC4KLQkJVGhlIG91dGNvbWUgaXMgdXNlZCBieSBkcml2ZXIgd2hlbiBkb2luZyBzaXRlIHN1cnZleS4KLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEJ1aWxkQ2hhbm5lbExpc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUNIQVIgaSwgaiwgaW5kZXg9MCwgbnVtPTA7Ci0JUFVDSEFSCXBDaGFubmVsTGlzdCA9IE5VTEw7Ci0KLQlOZGlzWmVyb01lbW9yeShwQWQtPkNoYW5uZWxMaXN0LCBNQVhfTlVNX09GX0NIQU5ORUxTICogc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpKTsKLQotCS8vIGlmIG5vdCAxMWEtb25seSBtb2RlLCBjaGFubmVsIGxpc3Qgc3RhcnRzIGZyb20gMi40R2h6IGJhbmQKLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgIT0gUEhZXzExQSkKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgIT0gUEhZXzExQU5fTUlYRUQpICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFBIWV8xMU5fNUcpCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JKQotCXsKLQkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICAmIDB4N2YpCi0JCXsKLQkJCWNhc2UgUkVHSU9OXzBfQkdfQkFORDoJLy8gMSAtMTEKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMF9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzBfU0laRSk7Ci0JCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMF9TSVpFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fMV9CR19CQU5EOgkvLyAxIC0gMTMKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMV9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzFfU0laRSk7Ci0JCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMV9TSVpFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fMl9CR19CQU5EOgkvLyAxMCAtIDExCi0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzJfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8yX1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzJfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzNfQkdfQkFORDoJLy8gMTAgLSAxMwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8zX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fM19TSVpFKTsKLQkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8zX1NJWkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl80X0JHX0JBTkQ6CS8vIDE0Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzRfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl80X1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzRfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzVfQkdfQkFORDoJLy8gMSAtIDE0Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzVfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl81X1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzVfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzZfQkdfQkFORDoJLy8gMyAtIDkKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fNl9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzZfU0laRSk7Ci0JCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fNl9TSVpFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fN19CR19CQU5EOiAgLy8gNSAtIDEzCi0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzdfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl83X1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzdfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzMxX0JHX0JBTkQ6CS8vIDEgLSAxNAotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8zMV9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzMxX1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzMxX1NJWkU7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OiAgICAgICAgICAgIC8vIEVycm9yLiBzaG91bGQgbmV2ZXIgaGFwcGVuCi0JCQkJYnJlYWs7Ci0JCX0KLQkJZm9yIChpPTA7IGk8aW5kZXg7IGkrKykKLQkJCXBBZC0+Q2hhbm5lbExpc3RbaV0uTWF4VHhQd3IgPSAyMDsKLQl9Ci0KLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQSkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHX01JWEVEKQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQl8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkKLQkJfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUdOX01JWEVEKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCSkKLQl7Ci0JCXN3aXRjaCAocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kICYgMHg3ZikKLQkJewotCQkJY2FzZSBSRUdJT05fMF9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8wX0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzFfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMV9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl8yX0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzJfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fM19BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fM19DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8zX0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzRfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzRfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fNF9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl81X0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzVfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fNl9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fNl9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl82X0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzdfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fN19DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl84X0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl84X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzhfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fOV9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fOV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl85X0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzEwX0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl8xMV9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMTFfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMTFfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fMTJfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzEyX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzEyX0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzEzX0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xM19DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xM19DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl8xNF9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMTRfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMTRfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fMTVfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzE1X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzE1X0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6ICAgICAgICAgICAgLy8gRXJyb3IuIHNob3VsZCBuZXZlciBoYXBwZW4KLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiY291bnRyeXJlZ2lvbj0lZCBub3Qgc3VwcG9ydCIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCkpOwotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKG51bSAhPSAwKQotCQl7Ci0JCQlVQ0hBUiBSYWRhckNoWzE1XT17NTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKLQkJCWZvciAoaT0wOyBpPG51bTsgaSsrKQotCQkJewotCQkJCWZvciAoaj0wOyBqPE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGorKykKLQkJCQl7Ci0JCQkJCWlmIChwQ2hhbm5lbExpc3RbaV0gPT0gcEFkLT5UeFBvd2VyW2pdLkNoYW5uZWwpCi0JCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleCtpXSwgJnBBZC0+VHhQb3dlcltqXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpKTsKLQkJCQkJfQotCQkJCWZvciAoaj0wOyBqPDE1OyBqKyspCi0JCQkJewotCQkJCQlpZiAocENoYW5uZWxMaXN0W2ldID09IFJhZGFyQ2hbal0pCi0JCQkJCQlwQWQtPkNoYW5uZWxMaXN0W2luZGV4K2ldLkRmc1JlcSA9IFRSVUU7Ci0JCQkJfQotCQkJCXBBZC0+Q2hhbm5lbExpc3RbaW5kZXgraV0uTWF4VHhQd3IgPSAyMDsKLQkJCX0KLQkJCWluZGV4ICs9IG51bTsKLQkJfQotCX0KLQotCXBBZC0+Q2hhbm5lbExpc3ROdW0gPSBpbmRleDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImNvdW50cnkgY29kZT0lZC8lZCwgUkZJQz0lZCwgUEhZIG1vZGU9JWQsIHN1cHBvcnQgJWQgY2hhbm5lbHNcbiIsCi0JCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24sIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCwgcEFkLT5SZkljVHlwZSwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSwgcEFkLT5DaGFubmVsTGlzdE51bSkpOwotI2lmZGVmIERCRwotCWZvciAoaT0wO2k8cEFkLT5DaGFubmVsTGlzdE51bTtpKyspCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJCdWlsZENoYW5uZWwgIyAlZCA6OiBQd3IwID0gJWQsIFB3cjEgPSVkLCBcbiAiLCBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIyKSk7Ci0JfQotI2VuZGlmCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyByb3V0aW5lIHJldHVybiB0aGUgZmlyc3QgY2hhbm5lbCBudW1iZXIgYWNjb3JkaW5nIHRvIHRoZSBjb3VudHJ5Ci0JCWNvZGUgc2VsZWN0aW9uIGFuZCBSRiBJQyBzZWxlY3Rpb24gKHNpZ25hbCBiYW5kIG9yIGR1YWwgYmFuZCkuIEl0IGlzIGNhbGxlZAotCQl3aGVuZXZlciBkcml2ZXIgbmVlZCB0byBzdGFydCBhIHNpdGUgc3VydmV5IG9mIGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMuCi0JUmV0dXJuOgotCQljaCAtIHRoZSBmaXJzdCBjaGFubmVsIG51bWJlciBvZiBjdXJyZW50IGNvdW50cnkgY29kZSBzZXR0aW5nCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVUNIQVIgRmlyc3RDaGFubmVsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCXJldHVybiBwQWQtPkNoYW5uZWxMaXN0WzBdLkNoYW5uZWw7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIG5leHQgY2hhbm5lbCBudW1iZXIuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQKLQkJZHVyaW5nIGRyaXZlciBuZWVkIHRvIHN0YXJ0IGEgc2l0ZSBzdXJ2ZXkgb2YgYWxsIHN1cHBvcnRlZCBjaGFubmVscy4KLQlSZXR1cm46Ci0JCW5leHRfY2hhbm5lbCAtIHRoZSBuZXh0IGNoYW5uZWwgbnVtYmVyIHZhbGlkIGluIGN1cnJlbnQgY291bnRyeSBjb2RlIHNldHRpbmcuCi0JTm90ZToKLQkJcmV0dXJuIDAgaWYgbm8gbW9yZSBuZXh0IGNoYW5uZWwKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1VQ0hBUiBOZXh0Q2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBjaGFubmVsKQotewotCWludCBpOwotCVVDSEFSIG5leHRfY2hhbm5lbCA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKHBBZC0+Q2hhbm5lbExpc3ROdW0gLSAxKTsgaSsrKQotCQlpZiAoY2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCi0JCXsKLQkJCW5leHRfY2hhbm5lbCA9IHBBZC0+Q2hhbm5lbExpc3RbaSsxXS5DaGFubmVsOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiBuZXh0X2NoYW5uZWw7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyByb3V0aW5lIGlzIGZvciBDaXNjbyBDb21wYXRpYmxlIEV4dGVuc2lvbnMgMi5YCi0JCVNwZWMzMS4gQVAgQ29udHJvbCBvZiBDbGllbnQgVHJhbnNtaXQgUG93ZXIKLQlSZXR1cm46Ci0JCU5vbmUKLQlOb3RlOgotCSAgIFJlcXVpcmVkIGJ5IEFpcm9uZXQgZEJtKG1XKQotCQkgICAwZEJtKDFtVyksICAgMWRCbSg1bVcpLCAxM2RCbSgyMG1XKSwgMTVkQm0oMzBtVyksCi0JCSAgMTdkQm0oNTBtdyksIDIwZEJtKDEwMG1XKQotCi0JICAgV2Ugc3VwcG9ydGVkCi0JCSAgIDNkQm0oTG93ZXN0KSwgNmRCbSgxMCUpLCA5ZEJtKDI1JSksIDEyZEJtKDUwJSksCi0JCSAgMTRkQm0oNzUlKSwgICAxNWRCbSgxMDAlKQotCi0JCVRoZSBjbGllbnQgc3RhdGlvbidzIGFjdHVhbCB0cmFuc21pdCBwb3dlciBzaGFsbCBiZSB3aXRoaW4gKy8tIDVkQiBvZgotCQl0aGUgbWluaW11bSB2YWx1ZSBvciBuZXh0IGxvd2VyIHZhbHVlLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCkKLXsKLQkvL3ZhbHVkIDB4RkYgbWVhbnMgdGhhdCBoYXNuJ3QgZm91bmQgcG93ZXIgbGltaXQgaW5mb3JtYXRpb24KLQkvL2Zyb20gdGhlIEFQJ3MgQmVhY29uL1Byb2JlIHJlc3BvbnNlLgotCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPT0gMHhGRikKLQkJcmV0dXJuOwotCi0JaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDYpIC8vVXNlZCBMb3dlc3QgUG93ZXIgUGVyY2VudGFnZS4KLQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSA2OwotCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDkpCi0JCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMTA7Ci0JZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTIpCi0JCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMjU7Ci0JZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTQpCi0JCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNTA7Ci0JZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTUpCi0JCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNzU7Ci0JZWxzZQotCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDEwMDsgLy9lbHNlIHVzZWQgbWF4aW11bQotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQpCi0JCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7Ci0KLX0KLQotQ0hBUglDb252ZXJ0VG9Sc3NpKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIENIQVIJCQkJUnNzaSwKLQlJTiBVQ0hBUgkJCVJzc2lOdW1iZXIpCi17Ci0JVUNIQVIJUnNzaU9mZnNldCwgTE5BR2FpbjsKLQotCS8vIFJzc2kgZXF1YWxzIHRvIHplcm8gc2hvdWxkIGJlIGFuIGludmFsaWQgdmFsdWUKLQlpZiAoUnNzaSA9PSAwKQotCQlyZXR1cm4gLTk5OwotCi0JTE5BR2FpbiA9IEdFVF9MTkFfR0FJTihwQWQpOwotICAgIGlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKLSAgICB7Ci0gICAgICAgIGlmIChSc3NpTnVtYmVyID09IDApCi0JCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDA7Ci0JCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKLQkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MTsKLQkJZWxzZQotCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoUnNzaU51bWJlciA9PSAwKQotCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MDsKLQkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQotCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MTsKLQkJZWxzZQotCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MjsKLSAgICB9Ci0KLSAgICByZXR1cm4gKC0xMiAtIFJzc2lPZmZzZXQgLSBMTkFHYWluIC0gUnNzaSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJU2NhbiBuZXh0IGNoYW5uZWwKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFNjYW5OZXh0Q2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlIRUFERVJfODAyXzExICAgSGRyODAyMTE7Ci0JUFVDSEFSICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOwotCVVMT05HICAgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JVUNIQVIgICAgICAgICAgIFNzaWRMZW4gPSAwLCBTY2FuVHlwZSA9IHBBZC0+TWxtZUF1eC5TY2FuVHlwZSwgQkJQVmFsdWUgPSAwOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCVVTSE9SVCAgICAgICAgICBTdGF0dXM7Ci0JUEhFQURFUl84MDJfMTEgIHBIZHI4MDIxMTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlVSU5UCQkJU2NhblRpbWVJbjVnQ2hhbm5lbCA9IFNIT1JUX0NIQU5ORUxfVElNRTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlpZiAoTU9OSVRPUl9PTihwQWQpKQotCQkJcmV0dXJuOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIFJBTElOS19BVEUKLQkvLyBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlLgotCWlmIChBVEVfT04ocEFkKSkKLQkJcmV0dXJuOwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA9PSAwKQotCXsKLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQkmJiAoSU5GUkFfT04ocEFkKQotCQkJCXx8IChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApKQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJKQotCQl7Ci0JCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7Ci0JCQlCQlBWYWx1ZSAmPSAofjB4MTgpOwotCQkJQkJQVmFsdWUgfD0gMHgxMDsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byA0ME1IeiBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5TY2FuVGFiLkJzc05yKSk7Ci0JCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQkvLwotCQkJLy8gVG8gcHJldmVudCBkYXRhIGxvc3QuCi0JCQkvLyBTZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9uIHRvIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCBiZWZvcmUgU0NBTiBwcm9ncmVzcy4KLQkJCS8vIE5vdywgd2UgbmVlZCB0byBzZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9mZiB0byBBUCwgd2hlbiBzY2FuIHByb2dyZXNzIGRvbmUKLQkJCS8vCi0JCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmIChJTkZSQV9PTihwQWQpKSkKLQkJCXsKLQkJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsKLQkJCQlpZiAoTlN0YXR1cwk9PSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJCXsKLQkJCQkJcEhkcjgwMjExID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOwotCQkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcEhkcjgwMjExLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCQkJcEhkcjgwMjExLT5EdXJhdGlvbiA9IDA7Ci0JCQkJCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7Ci0JCQkJCXBIZHI4MDIxMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOwotCi0JCQkJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKLQkJCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2NhblJlcUFjdGlvbiAtLSBTZW5kIFBTTSBEYXRhIGZyYW1lXG4iKSk7Ci0JCQkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0JCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwotCQkJU3RhdHVzID0gTUxNRV9TVUNDRVNTOwotCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0JCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOwotCX0KLQllbHNlCi0JewotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCS8vIEJCUCBhbmQgUkYgYXJlIG5vdCBhY2Nlc3NpYmxlIGluIFBTIG1vZGUsIHdlIGhhcyB0byB3YWtlIHRoZW0gdXAgZmlyc3QKLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKLQotCQkJLy8gbGVhdmUgUFNNIGR1cmluZyBzY2FubmluZy4gb3RoZXJ3aXNlIHdlIG1heSBsb3N0IFByb2JlUnNwICYgQkVBQ09OCi0JCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQotCQkJCVJUTVBfU0VUX1BTTV9CSVQocEFkLCBQV1JfQUNUSVZFKTsKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwsIFRSVUUpOwotCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsID4gMTQpCi0JCQl7Ci0JCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKSkKLQkJCQl7Ci0JCQkJCVNjYW5UeXBlID0gU0NBTl9QQVNTSVZFOwotCQkJCQlTY2FuVGltZUluNWdDaGFubmVsID0gTUlOX0NIQU5ORUxfVElNRTsKLQkJCQl9Ci0JCQl9Ci0KLSNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgotCQkJLy8gY2FycmllciBkZXRlY3Rpb24KLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKQotCQkJewotCQkJCVNjYW5UeXBlID0gU0NBTl9QQVNTSVZFOwotCQkJCVNjYW5UaW1lSW41Z0NoYW5uZWwgPSBNSU5fQ0hBTk5FTF9USU1FOwotCQkJfQotI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KLQkJfQotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJLy9HbG9iYWwgY291bnRyeSBkb21haW4oY2gxLTExOmFjdGl2ZSBzY2FuLCBjaDEyLTE0IHBhc3NpdmUgc2NhbikKLQkJaWYgKChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkgJiYgKHBBZC0+TWxtZUF1eC5DaGFubmVsID49IDEyKSAmJiAoKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gJiAweDdmKSA9PSBSRUdJT05fMzFfQkdfQkFORCkpCi0JCXsKLQkJCVNjYW5UeXBlID0gU0NBTl9QQVNTSVZFOwotCQl9Ci0KLQkJLy8gV2UgbmVlZCB0byBzaG9ydGVuIGFjdGl2ZSBzY2FuIHRpbWUgaW4gb3JkZXIgZm9yIFdaQyBjb25uZWN0IGlzc3VlCi0JCS8vIENobmFnZSB0aGUgY2hhbm5lbCBzY2FuIHRpbWUgZm9yIENJU0NPIHN0dWZmIGJhc2VkIG9uIGl0cyBJQVBQIGFubm91bmNlbWVudAotCQlpZiAoU2NhblR5cGUgPT0gRkFTVF9TQ0FOX0FDVElWRSkKLQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgRkFTVF9BQ1RJVkVfU0NBTl9USU1FKTsKLQkJZWxzZSAvLyBtdXN0IGJlIFNDQU5fUEFTU0lWRSBvciBTQ0FOX0FDVElWRQotCQl7Ci0JCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHX01JWEVEKQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJCXx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR05fTUlYRUQpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCSkKLQkJCXsKLQkJCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkKLQkJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBTY2FuVGltZUluNWdDaGFubmVsKTsKLQkJCQllbHNlCi0JCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBNSU5fQ0hBTk5FTF9USU1FKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIE1BWF9DSEFOTkVMX1RJTUUpOwotCQl9Ci0KLQkJaWYgKChTY2FuVHlwZSA9PSBTQ0FOX0FDVElWRSkKLQkJCXx8IChTY2FuVHlwZSA9PSBGQVNUX1NDQU5fQUNUSVZFKQotCQkJKQotCQl7Ci0JCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gU2Nhbk5leHRDaGFubmVsKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCXsKLQkJCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKLQkJCQkJU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOwotCQkJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9DT05GLCAyLCAmU3RhdHVzKTsKLQkJCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2VuZCBicm9hZGNhc3QgcHJvYmUgcmVxdWVzdCBpZiBhY3RpdmUgc2NhbiBpcyBpbiBlZmZlY3QuCi0JCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQUNUSVZFKSB8fCAoU2NhblR5cGUgPT0gRkFTVF9TQ0FOX0FDVElWRSkKLQkJCQkpCi0JCQkJU3NpZExlbiA9IHBBZC0+TWxtZUF1eC5Tc2lkTGVuOwotCQkJZWxzZQotCQkJCVNzaWRMZW4gPSAwOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBCUk9BRENBU1RfQUREUiwgQlJPQURDQVNUX0FERFIpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmSGRyODAyMTEsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkTGVuLAotCQkJCQkJCSAgU3NpZExlbiwJCQkgICAgICAgIHBBZC0+TWxtZUF1eC5Tc2lkLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiwKLQkJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4sICBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCi0JCQlpZiAocEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbikKLQkJCXsKLQkJCQlVTE9ORyBUbXA7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXAsCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuLAotCQkJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4sICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGUsCi0JCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJCUZyYW1lTGVuICs9IFRtcDsKLQkJCX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKLQkJCXsKLQkJCQlVTE9ORwlUbXA7Ci0JCQkJVUNIQVIJSHRMZW47Ci0JCQkJVUNIQVIJQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkJSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHlUbXA7Ci0jZW5kaWYKLQkJCQlpZiAocEFkLT5iQnJvYWRDb21IVCA9PSBUUlVFKQotCQkJCXsKLQkJCQkJSHRMZW4gPSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuICsgNDsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBTSVpFX0hUX0NBUF9JRSk7Ci0JCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykpOwotI2lmZGVmIFVOQUxJR05NRU5UX1NVUFBPUlQKLQkJCQkJewotCQkJCQkJRVhUX0hUX0NBUF9JTkZPIGV4dEh0Q2FwSW5mbzsKLQotCQkJCQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikoJmV4dEh0Q2FwSW5mbyksIChQVUNIQVIpKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSwgc2l6ZW9mKEVYVF9IVF9DQVBfSU5GTykpOwotCQkJCQkJKihVU0hPUlQgKikoJmV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmZXh0SHRDYXBJbmZvKSk7Ci0JCQkJCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbyksIChQVUNIQVIpKCZleHRIdENhcEluZm8pLCBzaXplb2YoRVhUX0hUX0NBUF9JTkZPKSk7Ci0JCQkJCX0KLSNlbHNlCi0JCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7Ci0jZW5kaWYgLy8gVU5BTElHTk1FTlRfU1VQUE9SVCAvLwotCi0JCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgJlRtcCwKLQkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCi0JCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAotCQkJCQkJCQkJNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKLQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAmSHRDYXBhYmlsaXR5VG1wLAotCQkJCQkJCQkJRU5EX09GX0FSR1MpOwotI2Vsc2UKLQkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAotCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKLQkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCi0JCQkJCQkJCQk0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAotCQkJCQkJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAotCQkJCQkJCQkJRU5EX09GX0FSR1MpOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJSHRMZW4gPSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQkJCQkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOwotCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKLSNpZmRlZiBVTkFMSUdOTUVOVF9TVVBQT1JUCi0JCQkJCXsKLQkJCQkJCUVYVF9IVF9DQVBfSU5GTyBleHRIdENhcEluZm87Ci0KLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZleHRIdENhcEluZm8pLCAoUFVDSEFSKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbyksIHNpemVvZihFWFRfSFRfQ0FQX0lORk8pKTsKLQkJCQkJCSooVVNIT1JUICopKCZleHRIdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJmV4dEh0Q2FwSW5mbykpOwotCQkJCQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pLCAoUFVDSEFSKSgmZXh0SHRDYXBJbmZvKSwgc2l6ZW9mKEVYVF9IVF9DQVBfSU5GTykpOwotCQkJCQl9Ci0jZWxzZQotCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOwotI2VuZGlmIC8vIFVOQUxJR05NRU5UX1NVUFBPUlQgLy8KLQotCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICZUbXAsCi0JCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCi0JCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAotCQkJCQkJCQkJSHRMZW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcGFiaWxpdHlUbXAsCi0JCQkJCQkJCQlFTkRfT0ZfQVJHUyk7Ci0jZWxzZQotCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICZUbXAsCi0JCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCi0JCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAotCQkJCQkJCQkJSHRMZW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCi0JCQkJCQkJCQlFTkRfT0ZfQVJHUyk7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCQkJCX0KLQkJCQlGcmFtZUxlbiArPSBUbXA7Ci0KLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0JCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5iMjA0MENvZXhpc3RTY2FuU3VwID09IDEpCi0JCQkJewotCQkJCQlVTE9ORwkJVG1wOwotCQkJCQlIdExlbiA9IDE7Ci0JCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wLAotCQkJCQkJCQkJICAxLAkJCQkJJkV4dEh0Q2FwSWUsCi0JCQkJCQkJCQkgIDEsCQkJCQkmSHRMZW4sCi0JCQkJCQkJCQkgIDEsCQkJCSZwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkLAotCQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0KLQkJCQkJRnJhbWVMZW4gKz0gVG1wOwotCQkJCX0KLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0JCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQotCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCQl9Ci0KLQkJLy8gRm9yIFNDQU5fQ0lTQ09fUEFTU0lWRSwgZG8gbm90aGluZyBhbmQgc2lsZW50bHkgd2FpdCBmb3IgYmVhY29uIG9yIG90aGVyIHByb2JlIHJlcG9uc2UKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNDQU5fTElTVEVOOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JfQotfQotCi1WT0lEIE1ndFByb2JSZXFNYWNIZWFkZXJJbml0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCi0JSU4gVUNIQVIgU3ViVHlwZSwKLQlJTiBVQ0hBUiBUb0RzLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gUFVDSEFSIHBCc3NpZCkKLXsKLQlOZGlzWmVyb01lbW9yeShwSGRyODAyMTEsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0KLQlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9NR01UOwotCXBIZHI4MDIxMS0+RkMuU3ViVHlwZSA9IFN1YlR5cGU7Ci0JaWYgKFN1YlR5cGUgPT0gU1VCVFlQRV9BQ0spCi0JCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0NOVEw7Ci0JcEhkcjgwMjExLT5GQy5Ub0RzID0gVG9EczsKLQlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIHBEQSk7Ci0JQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLQlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIHBCc3NpZCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3RraXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI0NzRmMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fdGtpcC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTY2ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JY21tX3RraXAuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVBhdWwgV3UJCTAyLTI1LTAyCQlJbml0aWFsCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotLy8gUm90YXRpb24gZnVuY3Rpb25zIG9uIDMyIGJpdCB2YWx1ZXMKLSNkZWZpbmUgUk9MMzIoIEEsIG4gKSBcCi0JKCAoKEEpIDw8IChuKSkgfCAoICgoQSk+PigzMi0obikpKSAmICggKDFVTCA8PCAobikpIC0gMSApICkgKQotI2RlZmluZSBST1IzMiggQSwgbiApIFJPTDMyKCAoQSksIDMyLShuKSApCi0KLVVJTlQgVGtpcF9TYm94X0xvd2VyWzI1Nl0gPQotewotCTB4QTUsMHg4NCwweDk5LDB4OEQsMHgwRCwweEJELDB4QjEsMHg1NCwKLQkweDUwLDB4MDMsMHhBOSwweDdELDB4MTksMHg2MiwweEU2LDB4OUEsCi0JMHg0NSwweDlELDB4NDAsMHg4NywweDE1LDB4RUIsMHhDOSwweDBCLAotCTB4RUMsMHg2NywweEZELDB4RUEsMHhCRiwweEY3LDB4OTYsMHg1QiwKLQkweEMyLDB4MUMsMHhBRSwweDZBLDB4NUEsMHg0MSwweDAyLDB4NEYsCi0JMHg1QywweEY0LDB4MzQsMHgwOCwweDkzLDB4NzMsMHg1MywweDNGLAotCTB4MEMsMHg1MiwweDY1LDB4NUUsMHgyOCwweEExLDB4MEYsMHhCNSwKLQkweDA5LDB4MzYsMHg5QiwweDNELDB4MjYsMHg2OSwweENELDB4OUYsCi0JMHgxQiwweDlFLDB4NzQsMHgyRSwweDJELDB4QjIsMHhFRSwweEZCLAotCTB4RjYsMHg0RCwweDYxLDB4Q0UsMHg3QiwweDNFLDB4NzEsMHg5NywKLQkweEY1LDB4NjgsMHgwMCwweDJDLDB4NjAsMHgxRiwweEM4LDB4RUQsCi0JMHhCRSwweDQ2LDB4RDksMHg0QiwweERFLDB4RDQsMHhFOCwweDRBLAotCTB4NkIsMHgyQSwweEU1LDB4MTYsMHhDNSwweEQ3LDB4NTUsMHg5NCwKLQkweENGLDB4MTAsMHgwNiwweDgxLDB4RjAsMHg0NCwweEJBLDB4RTMsCi0JMHhGMywweEZFLDB4QzAsMHg4QSwweEFELDB4QkMsMHg0OCwweDA0LAotCTB4REYsMHhDMSwweDc1LDB4NjMsMHgzMCwweDFBLDB4MEUsMHg2RCwKLQkweDRDLDB4MTQsMHgzNSwweDJGLDB4RTEsMHhBMiwweENDLDB4MzksCi0JMHg1NywweEYyLDB4ODIsMHg0NywweEFDLDB4RTcsMHgyQiwweDk1LAotCTB4QTAsMHg5OCwweEQxLDB4N0YsMHg2NiwweDdFLDB4QUIsMHg4MywKLQkweENBLDB4MjksMHhEMywweDNDLDB4NzksMHhFMiwweDFELDB4NzYsCi0JMHgzQiwweDU2LDB4NEUsMHgxRSwweERCLDB4MEEsMHg2QywweEU0LAotCTB4NUQsMHg2RSwweEVGLDB4QTYsMHhBOCwweEE0LDB4MzcsMHg4QiwKLQkweDMyLDB4NDMsMHg1OSwweEI3LDB4OEMsMHg2NCwweEQyLDB4RTAsCi0JMHhCNCwweEZBLDB4MDcsMHgyNSwweEFGLDB4OEUsMHhFOSwweDE4LAotCTB4RDUsMHg4OCwweDZGLDB4NzIsMHgyNCwweEYxLDB4QzcsMHg1MSwKLQkweDIzLDB4N0MsMHg5QywweDIxLDB4REQsMHhEQywweDg2LDB4ODUsCi0JMHg5MCwweDQyLDB4QzQsMHhBQSwweEQ4LDB4MDUsMHgwMSwweDEyLAotCTB4QTMsMHg1RiwweEY5LDB4RDAsMHg5MSwweDU4LDB4MjcsMHhCOSwKLQkweDM4LDB4MTMsMHhCMywweDMzLDB4QkIsMHg3MCwweDg5LDB4QTcsCi0JMHhCNiwweDIyLDB4OTIsMHgyMCwweDQ5LDB4RkYsMHg3OCwweDdBLAotCTB4OEYsMHhGOCwweDgwLDB4MTcsMHhEQSwweDMxLDB4QzYsMHhCOCwKLQkweEMzLDB4QjAsMHg3NywweDExLDB4Q0IsMHhGQywweEQ2LDB4M0EKLX07Ci0KLVVJTlQgVGtpcF9TYm94X1VwcGVyWzI1Nl0gPQotewotCTB4QzYsMHhGOCwweEVFLDB4RjYsMHhGRiwweEQ2LDB4REUsMHg5MSwKLQkweDYwLDB4MDIsMHhDRSwweDU2LDB4RTcsMHhCNSwweDRELDB4RUMsCi0JMHg4RiwweDFGLDB4ODksMHhGQSwweEVGLDB4QjIsMHg4RSwweEZCLAotCTB4NDEsMHhCMywweDVGLDB4NDUsMHgyMywweDUzLDB4RTQsMHg5QiwKLQkweDc1LDB4RTEsMHgzRCwweDRDLDB4NkMsMHg3RSwweEY1LDB4ODMsCi0JMHg2OCwweDUxLDB4RDEsMHhGOSwweEUyLDB4QUIsMHg2MiwweDJBLAotCTB4MDgsMHg5NSwweDQ2LDB4OUQsMHgzMCwweDM3LDB4MEEsMHgyRiwKLQkweDBFLDB4MjQsMHgxQiwweERGLDB4Q0QsMHg0RSwweDdGLDB4RUEsCi0JMHgxMiwweDFELDB4NTgsMHgzNCwweDM2LDB4REMsMHhCNCwweDVCLAotCTB4QTQsMHg3NiwweEI3LDB4N0QsMHg1MiwweERELDB4NUUsMHgxMywKLQkweEE2LDB4QjksMHgwMCwweEMxLDB4NDAsMHhFMywweDc5LDB4QjYsCi0JMHhENCwweDhELDB4NjcsMHg3MiwweDk0LDB4OTgsMHhCMCwweDg1LAotCTB4QkIsMHhDNSwweDRGLDB4RUQsMHg4NiwweDlBLDB4NjYsMHgxMSwKLQkweDhBLDB4RTksMHgwNCwweEZFLDB4QTAsMHg3OCwweDI1LDB4NEIsCi0JMHhBMiwweDVELDB4ODAsMHgwNSwweDNGLDB4MjEsMHg3MCwweEYxLAotCTB4NjMsMHg3NywweEFGLDB4NDIsMHgyMCwweEU1LDB4RkQsMHhCRiwKLQkweDgxLDB4MTgsMHgyNiwweEMzLDB4QkUsMHgzNSwweDg4LDB4MkUsCi0JMHg5MywweDU1LDB4RkMsMHg3QSwweEM4LDB4QkEsMHgzMiwweEU2LAotCTB4QzAsMHgxOSwweDlFLDB4QTMsMHg0NCwweDU0LDB4M0IsMHgwQiwKLQkweDhDLDB4QzcsMHg2QiwweDI4LDB4QTcsMHhCQywweDE2LDB4QUQsCi0JMHhEQiwweDY0LDB4NzQsMHgxNCwweDkyLDB4MEMsMHg0OCwweEI4LAotCTB4OUYsMHhCRCwweDQzLDB4QzQsMHgzOSwweDMxLDB4RDMsMHhGMiwKLQkweEQ1LDB4OEIsMHg2RSwweERBLDB4MDEsMHhCMSwweDlDLDB4NDksCi0JMHhEOCwweEFDLDB4RjMsMHhDRiwweENBLDB4RjQsMHg0NywweDEwLAotCTB4NkYsMHhGMCwweDRBLDB4NUMsMHgzOCwweDU3LDB4NzMsMHg5NywKLQkweENCLDB4QTEsMHhFOCwweDNFLDB4OTYsMHg2MSwweDBELDB4MEYsCi0JMHhFMCwweDdDLDB4NzEsMHhDQywweDkwLDB4MDYsMHhGNywweDFDLAotCTB4QzIsMHg2QSwweEFFLDB4NjksMHgxNywweDk5LDB4M0EsMHgyNywKLQkweEQ5LDB4RUIsMHgyQiwweDIyLDB4RDIsMHhBOSwweDA3LDB4MzMsCi0JMHgyRCwweDNDLDB4MTUsMHhDOSwweDg3LDB4QUEsMHg1MCwweEE1LAotCTB4MDMsMHg1OSwweDA5LDB4MUEsMHg2NSwweEQ3LDB4ODQsMHhEMCwKLQkweDgyLDB4MjksMHg1QSwweDFFLDB4N0IsMHhBOCwweDZELDB4MkMKLX07Ci0KLS8vCi0vLyBFeHBhbmRlZCBJViBmb3IgVEtJUCBmdW5jdGlvbi4KLS8vCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX0lWX0NPTlRST0xfCi17Ci0JdW5pb24gUEFDS0VECi0JewotCQlzdHJ1Y3QgUEFDS0VECi0JCXsKLQkJCVVDSEFSCQlyYzA7Ci0JCQlVQ0hBUgkJcmMxOwotCQkJVUNIQVIJCXJjMjsKLQotCQkJdW5pb24gUEFDS0VECi0JCQl7Ci0JCQkJc3RydWN0IFBBQ0tFRAotCQkJCXsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkJCVVDSEFSCUtleUlEOjI7Ci0JCQkJCVVDSEFSCUV4dElWOjE7Ci0JCQkJCVVDSEFSCVJzdmQ6NTsKLSNlbHNlCi0JCQkJCVVDSEFSCVJzdmQ6NTsKLQkJCQkJVUNIQVIJRXh0SVY6MTsKLQkJCQkJVUNIQVIJS2V5SUQ6MjsKLSNlbmRpZgotCQkJCX0JZmllbGQ7Ci0JCQkJVUNIQVIJCUJ5dGU7Ci0JCQl9CUNPTlRST0w7Ci0JCX0JZmllbGQ7Ci0KLQkJVUxPTkcJd29yZDsKLQl9CUlWMTY7Ci0KLQlVTE9ORwlJVjMyOwotfQlUS0lQX0lWLCAqUFRLSVBfSVY7Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUNvbnZlcnQgZnJvbSBVQ0hBUltdIHRvIFVMT05HIGluIGEgcG9ydGFibGUgd2F5Ci0KLQlBcmd1bWVudHM6Ci0gICAgICBwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVMT05HCVJUTVBUa2lwR2V0VUludDMyKAotCUlOCVBVQ0hBUglwTUlDS2V5KQotewotCVVMT05HCXJlcyA9IDA7Ci0JSU5UCQlpOwotCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQl7Ci0JCXJlcyB8PSAoKnBNSUNLZXkrKykgPDwgKDggKiBpKTsKLQl9Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJQ29udmVydCBmcm9tIFVMT05HIHRvIFVDSEFSW10gaW4gYSBwb3J0YWJsZSB3YXkKLQotCUFyZ3VtZW50czoKLSAgICAgIHBEc3QJCQlwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGZvciBjb252ZXJ0IFVMT05HIHRvIFVDSEFSW10KLSAgICAgIHZhbAkJCXRoZSB2YWx1ZSBmb3IgY29udmVydAotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBUa2lwUHV0VUludDMyKAotCUlOIE9VVAlQVUNIQVIJCXBEc3QsCi0JSU4JCVVMT05HCQl2YWwpCi17Ci0JSU5UIGk7Ci0KLQlmb3IoaSA9IDA7IGkgPCA0OyBpKyspCi0JewotCQkqcERzdCsrID0gKFVDSEFSKSAodmFsICYgMHhmZik7Ci0JCXZhbCA+Pj0gODsKLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlTZXQgdGhlIE1JQyBLZXkuCi0KLQlBcmd1bWVudHM6Ci0gICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAgICAgIHBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBUa2lwU2V0TUlDS2V5KAotCUlOCVBUS0lQX0tFWV9JTkZPCXBUa2lwLAotCUlOCVBVQ0hBUgkJCXBNSUNLZXkpCi17Ci0JLy8gU2V0IHRoZSBrZXkKLQlwVGtpcC0+SzAgPSBSVE1QVGtpcEdldFVJbnQzMihwTUlDS2V5KTsKLQlwVGtpcC0+SzEgPSBSVE1QVGtpcEdldFVJbnQzMihwTUlDS2V5ICsgNCk7Ci0JLy8gYW5kIHJlc2V0IHRoZSBtZXNzYWdlCi0JcFRraXAtPkwgPSBwVGtpcC0+SzA7Ci0JcFRraXAtPlIgPSBwVGtpcC0+SzE7Ci0JcFRraXAtPm5CeXRlc0luTSA9IDA7Ci0JcFRraXAtPk0gPSAwOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJQ2FsY3VsYXRlIHRoZSBNSUMgVmFsdWUuCi0KLQlBcmd1bWVudHM6Ci0gICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAgICAgIHVDaGFyCQkJQXBwZW5kIHRoaXMgdUNoYXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QVGtpcEFwcGVuZEJ5dGUoCi0JSU4JUFRLSVBfS0VZX0lORk8JcFRraXAsCi0JSU4JVUNIQVIJCQl1Q2hhcikKLXsKLQkvLyBBcHBlbmQgdGhlIGJ5dGUgdG8gb3VyIHdvcmQtc2l6ZWQgYnVmZmVyCi0JcFRraXAtPk0gfD0gKHVDaGFyIDw8ICg4KiBwVGtpcC0+bkJ5dGVzSW5NKSk7Ci0JcFRraXAtPm5CeXRlc0luTSsrOwotCS8vIFByb2Nlc3MgdGhlIHdvcmQgaWYgaXQgaXMgZnVsbC4KLQlpZiggcFRraXAtPm5CeXRlc0luTSA+PSA0ICkKLQl7Ci0JCXBUa2lwLT5MIF49IHBUa2lwLT5NOwotCQlwVGtpcC0+UiBePSBST0wzMiggcFRraXAtPkwsIDE3ICk7Ci0JCXBUa2lwLT5MICs9IHBUa2lwLT5SOwotCQlwVGtpcC0+UiBePSAoKHBUa2lwLT5MICYgMHhmZjAwZmYwMCkgPj4gOCkgfCAoKHBUa2lwLT5MICYgMHgwMGZmMDBmZikgPDwgOCk7Ci0JCXBUa2lwLT5MICs9IHBUa2lwLT5SOwotCQlwVGtpcC0+UiBePSBST0wzMiggcFRraXAtPkwsIDMgKTsKLQkJcFRraXAtPkwgKz0gcFRraXAtPlI7Ci0JCXBUa2lwLT5SIF49IFJPUjMyKCBwVGtpcC0+TCwgMiApOwotCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKLQkJLy8gQ2xlYXIgdGhlIGJ1ZmZlcgotCQlwVGtpcC0+TSA9IDA7Ci0JCXBUa2lwLT5uQnl0ZXNJbk0gPSAwOwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUNhbGN1bGF0ZSB0aGUgTUlDIFZhbHVlLgotCi0JQXJndW1lbnRzOgotICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgICBwU3JjCQkJUG9pbnRlciB0byBzb3VyY2UgZGF0YSBmb3IgQ2FsY3VsYXRlIE1JQyBWYWx1ZQotICAgICAgTGVuCQkJSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlIGRhdGEKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QVGtpcEFwcGVuZCgKLQlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKLQlJTglQVUNIQVIJCQlwU3JjLAotCUlOCVVJTlQJCQluQnl0ZXMpCi17Ci0JLy8gVGhpcyBpcyBzaW1wbGUKLQl3aGlsZShuQnl0ZXMgPiAwKQotCXsKLQkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAqcFNyYysrKTsKLQkJbkJ5dGVzLS07Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJR2V0IHRoZSBNSUMgVmFsdWUuCi0KLQlBcmd1bWVudHM6Ci0gICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCQl0aGUgTUlDIFZhbHVlIGlzIHN0b3JlIGluIHBBZC0+UHJpdmF0ZUluZm8uTUlDCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QVGtpcEdldE1JQygKLQlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCkKLXsKLQkvLyBBcHBlbmQgdGhlIG1pbmltdW0gcGFkZGluZwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMHg1YSApOwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOwotCS8vIGFuZCB0aGVuIHplcm9lcyB1bnRpbCB0aGUgbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgNAotCXdoaWxlKCBwVGtpcC0+bkJ5dGVzSW5NICE9IDAgKQotCXsKLQkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7Ci0JfQotCS8vIFRoZSBhcHBlbmRCeXRlIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGNvbXB1dGVkIHRoZSByZXN1bHQuCi0JUlRNUFRraXBQdXRVSW50MzIocFRraXAtPk1JQywgcFRraXAtPkwpOwotCVJUTVBUa2lwUHV0VUludDMyKHBUa2lwLT5NSUMgKyA0LCBwVGtpcC0+Uik7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlJbml0IFRraXAgZnVuY3Rpb24uCi0KLQlBcmd1bWVudHM6Ci0gICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCi0JCUtleUlkCQlUSyBLZXkgSUQKLQkJcFRBCQkJUG9pbnRlciB0byB0cmFuc21pdHRlciBhZGRyZXNzCi0JCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBJbml0VGtpcEVuZ2luZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwS2V5LAotCUlOCVVDSEFSCQkJS2V5SWQsCi0JSU4JUFVDSEFSCQkJcFRBLAotCUlOCVBVQ0hBUgkJCXBNSUNLZXksCi0JSU4JUFVDSEFSCQkJcFRTQywKLQlPVVQJUFVMT05HCQkJcElWMTYsCi0JT1VUCVBVTE9ORwkJCXBJVjMyKQotewotCVRLSVBfSVYJdGtpcEl2OwotCi0JLy8gUHJlcGFyZSA4IGJ5dGVzIFRLSVAgZW5jYXBzdWxhdGlvbiBmb3IgTVBEVQotCU5kaXNaZXJvTWVtb3J5KCZ0a2lwSXYsIHNpemVvZihUS0lQX0lWKSk7Ci0JdGtpcEl2LklWMTYuZmllbGQucmMwID0gKihwVFNDICsgMSk7Ci0JdGtpcEl2LklWMTYuZmllbGQucmMxID0gKHRraXBJdi5JVjE2LmZpZWxkLnJjMCB8IDB4MjApICYgMHg3ZjsKLQl0a2lwSXYuSVYxNi5maWVsZC5yYzIgPSAqcFRTQzsKLQl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLkV4dElWID0gMTsgIC8vIDA6IG5vbi1leHRlbmRlZCBJViwgMTogYW4gZXh0ZW5kZWQgSVYKLQl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLktleUlEID0gS2V5SWQ7Ci0vLwl0a2lwSXYuSVYzMiA9ICooUFVMT05HKShwVFNDICsgMik7Ci0JTmRpc01vdmVNZW1vcnkoJnRraXBJdi5JVjMyLCAocFRTQyArIDIpLCA0KTsgICAvLyBDb3B5IElWCi0KLQkqcElWMTYgPSB0a2lwSXYuSVYxNi53b3JkOwotCSpwSVYzMiA9IHRraXBJdi5JVjMyOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJSW5pdCBNSUMgVmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24gd2hpY2ggaW5jbHVkZSBzZXQgTUlDIGtleSAmCi0JCWNhbGN1bGF0ZSBmaXJzdCAxNiBieXRlcyAoREEgKyBTQSArIHByaW9yaXR5ICsgIDApCi0KLQlBcmd1bWVudHM6Ci0gICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCi0JCXBEQQkJCVBvaW50ZXIgdG8gREEgYWRkcmVzcwotCQlwU0EJCQlQb2ludGVyIHRvIFNBIGFkZHJlc3MKLQkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBJbml0TUlDRW5naW5lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBLZXksCi0JSU4JUFVDSEFSCQkJcERBLAotCUlOCVBVQ0hBUgkJCXBTQSwKLQlJTiAgVUNIQVIgICAgICAgICAgIFVzZXJQcmlvcml0eSwKLQlJTglQVUNIQVIJCQlwTUlDS2V5KQotewotCVVMT05HIFByaW9yaXR5ID0gVXNlclByaW9yaXR5OwotCi0JLy8gSW5pdCBNSUMgdmFsdWUgY2FsY3VsYXRpb24KLQlSVE1QVGtpcFNldE1JQ0tleSgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcE1JQ0tleSk7Ci0JLy8gREEKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcERBLCBNQUNfQUREUl9MRU4pOwotCS8vIFNBCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBTQSwgTUFDX0FERFJfTEVOKTsKLQkvLyBQcmlvcml0eSArIDMgYnl0ZXMgb2YgMAotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCAoUFVDSEFSKSZQcmlvcml0eSwgNCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDb21wYXJlIE1JQyB2YWx1ZSBvZiByZWNlaXZlZCBNU0RVCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIFBsYWluIHRleHQgZGF0YQotCQlwREEJCQlQb2ludGVyIHRvIERBIGFkZHJlc3MKLQkJcFNBCQkJUG9pbnRlciB0byBTQSBhZGRyZXNzCi0JCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQotCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBwbGFpbiB0ZXh0IGRhdGEgZXhjbHVkZSBNSUMgdmFsdWUKLQotCVJldHVybiBWYWx1ZToKLQkJVFJVRSAgICAgICAgTUlDIHZhbHVlIG1hdGNoZWQKLQkJRkFMU0UgICAgICAgTUlDIHZhbHVlIG1pc21hdGNoZWQKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4JUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglQVUNIQVIJCQlwREEsCi0JSU4JUFVDSEFSCQkJcFNBLAotCUlOCVBVQ0hBUgkJCXBNSUNLZXksCi0JSU4JVUNIQVIJCQlVc2VyUHJpb3JpdHksCi0JSU4JVUlOVAkJCUxlbikKLXsKLQlVQ0hBUglPbGRNaWNbOF07Ci0JVUxPTkcJUHJpb3JpdHkgPSBVc2VyUHJpb3JpdHk7Ci0KLQkvLyBJbml0IE1JQyB2YWx1ZSBjYWxjdWxhdGlvbgotCVJUTVBUa2lwU2V0TUlDS2V5KCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwTUlDS2V5KTsKLQkvLyBEQQotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwREEsIE1BQ19BRERSX0xFTik7Ci0JLy8gU0EKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNBLCBNQUNfQUREUl9MRU4pOwotCS8vIFByaW9yaXR5ICsgMyBieXRlcyBvZiAwCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIChQVUNIQVIpJlByaW9yaXR5LCA0KTsKLQotCS8vIENhbGN1bGF0ZSBNSUMgdmFsdWUgZnJvbSBwbGFpbiB0ZXh0IGRhdGEKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNyYywgTGVuKTsKLQotCS8vIEdldCBNSUMgdmFsdWRlIGZyb20gcmVjZWl2ZWQgZnJhbWUKLQlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBTcmMgKyBMZW4sIDgpOwotCi0JLy8gR2V0IE1JQyB2YWx1ZSBmcm9tIGRlY3J5cHRlZCBwbGFpbiBkYXRhCi0JUlRNUFRraXBHZXRNSUMoJnBBZC0+UHJpdmF0ZUluZm8uUngpOwotCi0JLy8gTW92ZSBNSUMgdmFsdWUgZnJvbSBNU0RVLCB0aGlzIHN0ZXBzIHNob3VsZCBtb3ZlIHRvIGRhdGEgcGF0aC4KLQkvLyBTaW5jZSB0aGUgTUlDIHZhbHVlIG1pZ2h0IGNyb3NzIE1QRFVzLgotCWlmKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5Qcml2YXRlSW5mby5SeC5NSUMsIE9sZE1pYywgOCkpCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoKTogVEtJUCBNSUMgRXJyb3IgIVxuIikpOyAgLy9NSUMgZXJyb3IuCi0KLQotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0JcmV0dXJuIChUUlVFKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUNvbXBhcmUgTUlDIHZhbHVlIG9mIHJlY2VpdmVkIE1TRFUKLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcExMQwkJTExDIGhlYWRlcgotCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBQbGFpbiB0ZXh0IGRhdGEKLQkJcERBCQkJUG9pbnRlciB0byBEQSBhZGRyZXNzCi0JCXBTQQkJCVBvaW50ZXIgdG8gU0EgYWRkcmVzcwotCQlwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKLQkJTGVuICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgcGxhaW4gdGV4dCBkYXRhIGV4Y2x1ZGUgTUlDIHZhbHVlCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCVRSVUUgICAgICAgIE1JQyB2YWx1ZSBtYXRjaGVkCi0JCUZBTFNFICAgICAgIE1JQyB2YWx1ZSBtaXNtYXRjaGVkCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOCVJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlV2l0aExMQygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwTExDLAotCUlOCVBVQ0hBUgkJCXBTcmMsCi0JSU4JUFVDSEFSCQkJcERBLAotCUlOCVBVQ0hBUgkJCXBTQSwKLQlJTglQVUNIQVIJCQlwTUlDS2V5LAotCUlOCVVJTlQJCQlMZW4pCi17Ci0JVUNIQVIJT2xkTWljWzhdOwotCVVMT05HCVByaW9yaXR5ID0gMDsKLQotCS8vIEluaXQgTUlDIHZhbHVlIGNhbGN1bGF0aW9uCi0JUlRNUFRraXBTZXRNSUNLZXkoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBNSUNLZXkpOwotCS8vIERBCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBEQSwgTUFDX0FERFJfTEVOKTsKLQkvLyBTQQotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU0EsIE1BQ19BRERSX0xFTik7Ci0JLy8gUHJpb3JpdHkgKyAzIGJ5dGVzIG9mIDAKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgKFBVQ0hBUikmUHJpb3JpdHksIDQpOwotCi0JLy8gU3RhcnQgd2l0aCBMTEMgaGVhZGVyCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBMTEMsIDgpOwotCi0JLy8gQ2FsY3VsYXRlIE1JQyB2YWx1ZSBmcm9tIHBsYWluIHRleHQgZGF0YQotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU3JjLCBMZW4pOwotCi0JLy8gR2V0IE1JQyB2YWx1ZGUgZnJvbSByZWNlaXZlZCBmcmFtZQotCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcFNyYyArIExlbiwgOCk7Ci0KLQkvLyBHZXQgTUlDIHZhbHVlIGZyb20gZGVjcnlwdGVkIHBsYWluIGRhdGEKLQlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5SeCk7Ci0KLQkvLyBNb3ZlIE1JQyB2YWx1ZSBmcm9tIE1TRFUsIHRoaXMgc3RlcHMgc2hvdWxkIG1vdmUgdG8gZGF0YSBwYXRoLgotCS8vIFNpbmNlIHRoZSBNSUMgdmFsdWUgbWlnaHQgY3Jvc3MgTVBEVXMuCi0JaWYoIU5kaXNFcXVhbE1lbW9yeShwQWQtPlByaXZhdGVJbmZvLlJ4Lk1JQywgT2xkTWljLCA4KSkKLQl7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZVdpdGhMTEMoKTogVEtJUCBNSUMgRXJyb3IgIVxuIikpOyAgLy9NSUMgZXJyb3IuCi0KLQotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0JcmV0dXJuIChUUlVFKTsKLX0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKLQlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgdHJhbnNtaXQgZnVuY3Rpb24KLQotCUFyZ3VtZW50czoKLQkJcEFkCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0JCVBORElTX1BBQ0tFVAlQb2ludGVyIHRvIE5kaXMgUGFja2V0IGZvciBNSUMgY2FsY3VsYXRpb24KLQkJcEVuY2FwCQkJUG9pbnRlciB0byBMTEMgZW5jYXAgZGF0YQotCQlMZW5FbmNhcAkJVG90YWwgZW5jYXAgbGVuZ3RoLCBtaWdodCBiZSAwIHdoaWNoIGluZGljYXRlcyBubyBlbmNhcAotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBDYWxjdWxhdGVNSUNWYWx1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglQVUNIQVIJCQlwRW5jYXAsCi0JSU4JUENJUEhFUl9LRVkJCXBLZXksCi0JSU4JVUNIQVIJCQlhcGlkeCkKLXsKLQlQQUNLRVRfSU5GTwkJUGFja2V0SW5mbzsKLQlQVUNIQVIJCQlwU3JjQnVmVkE7Ci0JVUlOVAkJCVNyY0J1ZkxlbjsKLQlQVUNIQVIJCQlwU3JjOwotICAgIFVDSEFSICAgICAgICAgICBVc2VyUHJpb3JpdHk7Ci0JVUNIQVIJCQl2bGFuX29mZnNldCA9IDA7Ci0KLQlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7Ci0KLQlVc2VyUHJpb3JpdHkgPSBSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCk7Ci0JcFNyYyA9IHBTcmNCdWZWQTsKLQotCS8vIGRldGVybWluZSBpZiB0aGlzIGlzIGEgdmxhbiBwYWNrZXQKLQlpZiAoKCgqKHBTcmMgKyAxMikgPDwgOCkgKyAqKHBTcmMgKyAxMykpID09IDB4ODEwMCkKLQkJdmxhbl9vZmZzZXQgPSA0OwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JewotCQlSVE1QSW5pdE1JQ0VuZ2luZSgKLQkJCXBBZCwKLQkJCXBLZXktPktleSwKLQkJCXBTcmMsCi0JCQlwU3JjICsgNiwKLQkJCVVzZXJQcmlvcml0eSwKLQkJCXBLZXktPlR4TWljKTsKLQl9Ci0KLQotCWlmIChwRW5jYXAgIT0gTlVMTCkKLQl7Ci0JCS8vIExMQyBlbmNhcHN1bGF0aW9uCi0JCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwRW5jYXAsIDYpOwotCQkvLyBQcm90b2NvbCBUeXBlCi0JCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwU3JjICsgMTIgKyB2bGFuX29mZnNldCwgMik7Ci0JfQotCVNyY0J1ZkxlbiAtPSAoMTQgKyB2bGFuX29mZnNldCk7Ci0JcFNyYyArPSAoMTQgKyB2bGFuX29mZnNldCk7Ci0JZG8KLQl7Ci0JCWlmIChTcmNCdWZMZW4gPiAwKQotCQl7Ci0JCQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcFNyYywgU3JjQnVmTGVuKTsKLQkJfQotCi0JCWJyZWFrOwkvLyBObyBuZWVkIGhhbmRsZSBuZXh0IHBhY2tldAotCi0JfQl3aGlsZSAoVFJVRSk7CQkvLyBFbmQgb2YgY29weWluZyBwYXlsb2FkCi0KLQkvLyBDb21wdXRlIHRoZSBmaW5hbCBNSUMgVmFsdWUKLQlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIHRraXBfc2JveCgpCQkJCQkJCQkJCQkJCQkJCSovCi0vKiBSZXR1cm5zIGEgMTYgYml0IHZhbHVlIGZyb20gYSA2NEsgZW50cnkgdGFibGUuIFRoZSBUYWJsZSAqLwotLyogaXMgc3ludGhlc2l6ZWQgZnJvbSB0d28gMjU2IGVudHJ5IGJ5dGUgd2lkZSB0YWJsZXMuCQkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotVUlOVCB0a2lwX3Nib3goVUlOVCBpbmRleCkKLXsKLQlVSU5UIGluZGV4X2xvdzsKLQlVSU5UIGluZGV4X2hpZ2g7Ci0JVUlOVCBsZWZ0LCByaWdodDsKLQotCWluZGV4X2xvdyA9IChpbmRleCAlIDI1Nik7Ci0JaW5kZXhfaGlnaCA9ICgoaW5kZXggPj4gOCkgJSAyNTYpOwotCi0JbGVmdCA9IFRraXBfU2JveF9Mb3dlcltpbmRleF9sb3ddICsgKFRraXBfU2JveF9VcHBlcltpbmRleF9sb3ddICogMjU2KTsKLQlyaWdodCA9IFRraXBfU2JveF9VcHBlcltpbmRleF9oaWdoXSArIChUa2lwX1Nib3hfTG93ZXJbaW5kZXhfaGlnaF0gKiAyNTYpOwotCi0JcmV0dXJuIChsZWZ0IF4gcmlnaHQpOwotfQotCi1VSU5UIHJvdHIxKFVJTlQgYSkKLXsKLQl1bnNpZ25lZCBpbnQgYjsKLQotCWlmICgoYSAmIDB4MDEpID09IDB4MDEpCi0JewotCQliID0gKGEgPj4gMSkgfCAweDgwMDA7Ci0JfQotCWVsc2UKLQl7Ci0JCWIgPSAoYSA+PiAxKSAmIDB4N2ZmZjsKLQl9Ci0JYiA9IGIgJSA2NTUzNjsKLQlyZXR1cm4gYjsKLX0KLQotVk9JRCBSVE1QVGtpcE1peEtleSgKLQlVQ0hBUiAqa2V5LAotCVVDSEFSICp0YSwKLQlVTE9ORyBwbmwsIC8qIExlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgb2YgUE4gKi8KLQlVTE9ORyBwbmgsIC8qIE1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBQTiAqLwotCVVDSEFSICpyYzRrZXksCi0JVUlOVCAqcDFrKQotewotCi0JVUlOVCB0c2MwOwotCVVJTlQgdHNjMTsKLQlVSU5UIHRzYzI7Ci0KLQlVSU5UIHBwazA7Ci0JVUlOVCBwcGsxOwotCVVJTlQgcHBrMjsKLQlVSU5UIHBwazM7Ci0JVUlOVCBwcGs0OwotCVVJTlQgcHBrNTsKLQotCUlOVCBpOwotCUlOVCBqOwotCi0JdHNjMCA9ICh1bnNpZ25lZCBpbnQpKChwbmggPj4gMTYpICUgNjU1MzYpOyAvKiBtc2IgKi8KLQl0c2MxID0gKHVuc2lnbmVkIGludCkocG5oICUgNjU1MzYpOwotCXRzYzIgPSAodW5zaWduZWQgaW50KShwbmwgJSA2NTUzNik7IC8qIGxzYiAqLwotCi0JLyogUGhhc2UgMSwgc3RlcCAxICovCi0JcDFrWzBdID0gdHNjMTsKLQlwMWtbMV0gPSB0c2MwOwotCXAxa1syXSA9IChVSU5UKSh0YVswXSArICh0YVsxXSoyNTYpKTsKLQlwMWtbM10gPSAoVUlOVCkodGFbMl0gKyAodGFbM10qMjU2KSk7Ci0JcDFrWzRdID0gKFVJTlQpKHRhWzRdICsgKHRhWzVdKjI1NikpOwotCi0JLyogUGhhc2UgMSwgc3RlcCAyICovCi0JZm9yIChpPTA7IGk8ODsgaSsrKQotCXsKLQkJaiA9IDIqKGkgJiAxKTsKLQkJcDFrWzBdID0gKHAxa1swXSArIHRraXBfc2JveCggKHAxa1s0XSBeICgoMjU2KmtleVsxK2pdKSArIGtleVtqXSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKLQkJcDFrWzFdID0gKHAxa1sxXSArIHRraXBfc2JveCggKHAxa1swXSBeICgoMjU2KmtleVs1K2pdKSArIGtleVs0K2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OwotCQlwMWtbMl0gPSAocDFrWzJdICsgdGtpcF9zYm94KCAocDFrWzFdIF4gKCgyNTYqa2V5Wzkral0pICsga2V5Wzgral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7Ci0JCXAxa1szXSA9IChwMWtbM10gKyB0a2lwX3Nib3goIChwMWtbMl0gXiAoKDI1NiprZXlbMTMral0pICsga2V5WzEyK2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OwotCQlwMWtbNF0gPSAocDFrWzRdICsgdGtpcF9zYm94KCAocDFrWzNdIF4gKCgoMjU2KmtleVsxK2pdKSArIGtleVtqXSkpKSAlIDY1NTM2ICkpICUgNjU1MzY7Ci0JCXAxa1s0XSA9IChwMWtbNF0gKyBpKSAlIDY1NTM2OwotCX0KLQotCS8qIFBoYXNlIDIsIFN0ZXAgMSAqLwotCXBwazAgPSBwMWtbMF07Ci0JcHBrMSA9IHAxa1sxXTsKLQlwcGsyID0gcDFrWzJdOwotCXBwazMgPSBwMWtbM107Ci0JcHBrNCA9IHAxa1s0XTsKLQlwcGs1ID0gKHAxa1s0XSArIHRzYzIpICUgNjU1MzY7Ci0KLQkvKiBQaGFzZTIsIFN0ZXAgMiAqLwotCXBwazAgPSBwcGswICsgdGtpcF9zYm94KCAocHBrNSBeICgoMjU2KmtleVsxXSkgKyBrZXlbMF0pKSAlIDY1NTM2KTsKLQlwcGsxID0gcHBrMSArIHRraXBfc2JveCggKHBwazAgXiAoKDI1NiprZXlbM10pICsga2V5WzJdKSkgJSA2NTUzNik7Ci0JcHBrMiA9IHBwazIgKyB0a2lwX3Nib3goIChwcGsxIF4gKCgyNTYqa2V5WzVdKSArIGtleVs0XSkpICUgNjU1MzYpOwotCXBwazMgPSBwcGszICsgdGtpcF9zYm94KCAocHBrMiBeICgoMjU2KmtleVs3XSkgKyBrZXlbNl0pKSAlIDY1NTM2KTsKLQlwcGs0ID0gcHBrNCArIHRraXBfc2JveCggKHBwazMgXiAoKDI1NiprZXlbOV0pICsga2V5WzhdKSkgJSA2NTUzNik7Ci0JcHBrNSA9IHBwazUgKyB0a2lwX3Nib3goIChwcGs0IF4gKCgyNTYqa2V5WzExXSkgKyBrZXlbMTBdKSkgJSA2NTUzNik7Ci0KLQlwcGswID0gcHBrMCArIHJvdHIxKHBwazUgXiAoKDI1NiprZXlbMTNdKSArIGtleVsxMl0pKTsKLQlwcGsxID0gcHBrMSArIHJvdHIxKHBwazAgXiAoKDI1NiprZXlbMTVdKSArIGtleVsxNF0pKTsKLQlwcGsyID0gcHBrMiArIHJvdHIxKHBwazEpOwotCXBwazMgPSBwcGszICsgcm90cjEocHBrMik7Ci0JcHBrNCA9IHBwazQgKyByb3RyMShwcGszKTsKLQlwcGs1ID0gcHBrNSArIHJvdHIxKHBwazQpOwotCi0JLyogUGhhc2UgMiwgU3RlcCAzICovCi0gICAgLyogUGhhc2UgMiwgU3RlcCAzICovCi0KLQl0c2MwID0gKHVuc2lnbmVkIGludCkoKHBuaCA+PiAxNikgJSA2NTUzNik7IC8qIG1zYiAqLwotCXRzYzEgPSAodW5zaWduZWQgaW50KShwbmggJSA2NTUzNik7Ci0JdHNjMiA9ICh1bnNpZ25lZCBpbnQpKHBubCAlIDY1NTM2KTsgLyogbHNiICovCi0KLQlyYzRrZXlbMF0gPSAodHNjMiA+PiA4KSAlIDI1NjsKLQlyYzRrZXlbMV0gPSAoKCh0c2MyID4+IDgpICUgMjU2KSB8IDB4MjApICYgMHg3ZjsKLQlyYzRrZXlbMl0gPSB0c2MyICUgMjU2OwotCXJjNGtleVszXSA9ICgocHBrNSBeICgoMjU2KmtleVsxXSkgKyBrZXlbMF0pKSA+PiAxKSAlIDI1NjsKLQotCXJjNGtleVs0XSA9IHBwazAgJSAyNTY7Ci0JcmM0a2V5WzVdID0gKHBwazAgPj4gOCkgJSAyNTY7Ci0KLQlyYzRrZXlbNl0gPSBwcGsxICUgMjU2OwotCXJjNGtleVs3XSA9IChwcGsxID4+IDgpICUgMjU2OwotCi0JcmM0a2V5WzhdID0gcHBrMiAlIDI1NjsKLQlyYzRrZXlbOV0gPSAocHBrMiA+PiA4KSAlIDI1NjsKLQotCXJjNGtleVsxMF0gPSBwcGszICUgMjU2OwotCXJjNGtleVsxMV0gPSAocHBrMyA+PiA4KSAlIDI1NjsKLQotCXJjNGtleVsxMl0gPSBwcGs0ICUgMjU2OwotCXJjNGtleVsxM10gPSAocHBrNCA+PiA4KSAlIDI1NjsKLQotCXJjNGtleVsxNF0gPSBwcGs1ICUgMjU2OwotCXJjNGtleVsxNV0gPSAocHBrNSA+PiA4KSAlIDI1NjsKLX0KLQotCi0vLwotLy8gVFJVRTogU3VjY2VzcyEKLS8vIEZBTFNFOiBEZWNyeXB0IEVycm9yIQotLy8KLUJPT0xFQU4gUlRNUFNvZnREZWNyeXB0VEtJUCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIJcERhdGEsCi0JSU4gVUxPTkcJRGF0YUJ5dGVDbnQsCi0JSU4gVUNIQVIgICAgVXNlclByaW9yaXR5LAotCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpCi17Ci0JVUNIQVIJCQlLZXlJRDsKLQlVSU5UCQkJSGVhZGVyTGVuOwotICAgIFVDSEFSCQkJZmMwOwotCVVDSEFSCQkJZmMxOwotCVVTSE9SVAkJCWZjOwotCVVJTlQJCQlmcmFtZV90eXBlOwotCVVJTlQJCQlmcmFtZV9zdWJ0eXBlOwotICAgIFVJTlQJCQlmcm9tX2RzOwotICAgIFVJTlQJCQl0b19kczsKLQlJTlQJCQkJYTRfZXhpc3RzOwotCUlOVAkJCQlxY19leGlzdHM7Ci0JVVNIT1JUCQkJZHVyYXRpb247Ci0JVVNIT1JUCQkJc2VxX2NvbnRyb2w7Ci0JVVNIT1JUCQkJcW9zX2NvbnRyb2w7Ci0JVUNIQVIJCQlUQVtNQUNfQUREUl9MRU5dOwotCVVDSEFSCQkJREFbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUgkJCVNBW01BQ19BRERSX0xFTl07Ci0JVUNIQVIJCQlSQzRLZXlbMTZdOwotCVVJTlQJCQlwMWtbNV07IC8vZm9yIG1peF9rZXk7Ci0JVUxPTkcJCQlwbmw7LyogTGVhc3Qgc2lnbmlmaWNhbnQgMTYgYml0cyBvZiBQTiAqLwotCVVMT05HCQkJcG5oOy8qIE1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBQTiAqLwotCVVJTlQJCQludW1fYmxvY2tzOwotCVVJTlQJCQlwYXlsb2FkX3JlbWFpbmRlcjsKLQlBUkNGT1VSQ09OVEVYVAlBcmNGb3VyQ29udGV4dDsKLQlVSU5UCQkJY3JjMzIgPSAwOwotCVVJTlQJCQl0cmFpbGZjcyA9IDA7Ci0JVUNIQVIJCQlNSUNbOF07Ci0JVUNIQVIJCQlUcmFpbE1JQ1s4XTsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBEYXRhLCBESVJfUkVBRCwgRkFMU0UpOwotI2VuZGlmCi0KLQlmYzAgPSAqcERhdGE7Ci0JZmMxID0gKihwRGF0YSArIDEpOwotCi0JZmMgPSAqKChQVVNIT1JUKXBEYXRhKTsKLQotCWZyYW1lX3R5cGUgPSAoKGZjMCA+PiAyKSAmIDB4MDMpOwotCWZyYW1lX3N1YnR5cGUgPSAoKGZjMCA+PiA0KSAmIDB4MGYpOwotCi0gICAgZnJvbV9kcyA9IChmYzEgJiAweDIpID4+IDE7Ci0gICAgdG9fZHMgPSAoZmMxICYgMHgxKTsKLQotICAgIGE0X2V4aXN0cyA9IChmcm9tX2RzICYgdG9fZHMpOwotICAgIHFjX2V4aXN0cyA9ICgoZnJhbWVfc3VidHlwZSA9PSAweDA4KSB8fCAgICAvKiBBc3N1bWVkIFFvUyBzdWJ0eXBlcyAqLwotICAgICAgICAgICAgICAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwOSkgfHwgICAvKiBMaWtlbHkgdG8gY2hhbmdlLiAgICAqLwotICAgICAgICAgICAgICAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYSkgfHwKLSAgICAgICAgICAgICAgICAgIChmcmFtZV9zdWJ0eXBlID09IDB4MGIpCi0gICAgICAgICAgICAgICAgICk7Ci0KLQlIZWFkZXJMZW4gPSAyNDsKLQlpZiAoYTRfZXhpc3RzKQotCQlIZWFkZXJMZW4gKz0gNjsKLQotCUtleUlEID0gKigoUFVDSEFSKShwRGF0YSsgSGVhZGVyTGVuICsgMykpOwotCUtleUlEID0gS2V5SUQgPj4gNjsKLQotCWlmIChwV3BhS2V5W0tleUlEXS5LZXlMZW4gPT0gMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTb2Z0RGVjcnlwdFRLSVAgZmFpbGVkIShLZXlJRFslZF0gTGVuZ3RoIGNhbiBub3QgYmUgMClcbiIsIEtleUlEKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlkdXJhdGlvbiA9ICooKFBVU0hPUlQpKHBEYXRhKzIpKTsKLQotCXNlcV9jb250cm9sID0gKigoUFVTSE9SVCkocERhdGErMjIpKTsKLQotCWlmIChxY19leGlzdHMpCi0JewotCQlpZiAoYTRfZXhpc3RzKQotCQl7Ci0JCQlxb3NfY29udHJvbCA9ICooKFBVU0hPUlQpKHBEYXRhKzMwKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlxb3NfY29udHJvbCA9ICooKFBVU0hPUlQpKHBEYXRhKzI0KSk7Ci0JCX0KLQl9Ci0KLQlpZiAodG9fZHMgPT0gMCAmJiBmcm9tX2RzID09IDEpCi0JewotCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGErNCwgTUFDX0FERFJfTEVOKTsKLQkJTmRpc01vdmVNZW1vcnkoU0EsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOwotCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7ICAvL0JTU0lECi0JfQotCWVsc2UgaWYgKHRvX2RzID09IDAgJiYgZnJvbV9kcyA9PSAwICkKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKLQkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzQsIE1BQ19BRERSX0xFTik7Ci0JCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKLQl9Ci0JZWxzZSBpZiAodG9fZHMgPT0gMSAmJiBmcm9tX2RzID09IDApCi0JewotCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7Ci0JCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKLQkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOwotCX0KLQllbHNlIGlmICh0b19kcyA9PSAxICYmIGZyb21fZHMgPT0gMSkKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKLQkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOwotCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMjIsIE1BQ19BRERSX0xFTik7Ci0JfQotCi0JbnVtX2Jsb2NrcyA9IChEYXRhQnl0ZUNudCAtIDE2KSAvIDE2OwotCXBheWxvYWRfcmVtYWluZGVyID0gKERhdGFCeXRlQ250IC0gMTYpICUgMTY7Ci0KLQlwbmwgPSAoKihwRGF0YSArIEhlYWRlckxlbikpICogMjU2ICsgKihwRGF0YSArIEhlYWRlckxlbiArIDIpOwotCXBuaCA9ICooKFBVTE9ORykocERhdGEgKyBIZWFkZXJMZW4gKyA0KSk7Ci0JcG5oID0gY3B1MmxlMzIocG5oKTsKLQlSVE1QVGtpcE1peEtleShwV3BhS2V5W0tleUlEXS5LZXksIFRBLCBwbmwsIHBuaCwgUkM0S2V5LCBwMWspOwotCi0JQVJDRk9VUl9JTklUKCZBcmNGb3VyQ29udGV4dCwgUkM0S2V5LCAxNik7Ci0KLQlBUkNGT1VSX0RFQ1JZUFQoJkFyY0ZvdXJDb250ZXh0LCBwRGF0YSArIEhlYWRlckxlbiwgcERhdGEgKyBIZWFkZXJMZW4gKyA4LCBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDgpOwotCU5kaXNNb3ZlTWVtb3J5KCZ0cmFpbGZjcywgcERhdGEgKyBEYXRhQnl0ZUNudCAtIDggLSA0LCA0KTsKLQljcmMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihQUFBJTklURkNTMzIsIHBEYXRhICsgSGVhZGVyTGVuLCBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSA0KTsgIC8vU2tpcCBJVitFSVYgOCBieXRlcyAmIFNraXAgbGFzdCA0IGJ5dGVzKEZDUykuCi0JY3JjMzIgXj0gMHhmZmZmZmZmZjsgICAgICAgICAgICAgLyogY29tcGxlbWVudCAqLwotCi0gICAgaWYoY3JjMzIgIT0gY3B1MmxlMzIodHJhaWxmY3MpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNvZnREZWNyeXB0VEtJUCwgV0VQIERhdGEgSUNWIEVycm9yICFcbiIpKTsJIC8vSUNWIGVycm9yLgotCi0JCXJldHVybiAoRkFMU0UpOwotCX0KLQotCU5kaXNNb3ZlTWVtb3J5KFRyYWlsTUlDLCBwRGF0YSArIERhdGFCeXRlQ250IC0gOCAtIDggLSA0LCA4KTsKLQlSVE1QSW5pdE1JQ0VuZ2luZShwQWQsIHBXcGFLZXlbS2V5SURdLktleSwgREEsIFNBLCBVc2VyUHJpb3JpdHksIHBXcGFLZXlbS2V5SURdLlJ4TWljKTsKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcERhdGEgKyBIZWFkZXJMZW4sIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCAtIDEyKTsKLQlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7Ci0JTmRpc01vdmVNZW1vcnkoTUlDLCBwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQywgOCk7Ci0KLQlpZiAoIU5kaXNFcXVhbE1lbW9yeShNSUMsIFRyYWlsTUlDLCA4KSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTb2Z0RGVjcnlwdFRLSVAsIFdFUCBEYXRhIE1JQyBFcnJvciAhXG4iKSk7CSAvL01JQyBlcnJvci4KLQkJLy9SVE1QUmVwb3J0TWljRXJyb3IocEFkLCAmcFdwYUtleVtLZXlJRF0pOwkvLyBtYXJrZWQgYnkgQWxiZXJ0WSBAIDIwMDYwNjMwCi0JCXJldHVybiAoRkFMU0UpOwotCX0KLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBEYXRhLCBESVJfUkVBRCwgRkFMU0UpOwotI2VuZGlmCi0JLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgIlJUTVBTb2Z0RGVjcnlwdFRLSVAgRGVjcmlwdCBkb25lISFcbiIpOwotCXJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3dlcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3dlcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGRkZmIyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV93ZXAuYworKysgL2Rldi9udWxsCkBAIC0xLDUwMCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXJ0bXBfd2VwLmMKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlQYXVsIFd1CQkxMC0yOC0wMgkJSW5pdGlhbAotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLVVJTlQgRkNTVEFCXzMyWzI1Nl0gPQotewotCTB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4ZWUwZTYxMmMsIDB4OTkwOTUxYmEsCi0JMHgwNzZkYzQxOSwgMHg3MDZhZjQ4ZiwgMHhlOTYzYTUzNSwgMHg5ZTY0OTVhMywKLQkweDBlZGI4ODMyLCAweDc5ZGNiOGE0LCAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LAotCTB4MDliNjRjMmIsIDB4N2ViMTdjYmQsIDB4ZTdiODJkMDcsIDB4OTBiZjFkOTEsCi0JMHgxZGI3MTA2NCwgMHg2YWIwMjBmMiwgMHhmM2I5NzE0OCwgMHg4NGJlNDFkZSwKLQkweDFhZGFkNDdkLCAweDZkZGRlNGViLCAweGY0ZDRiNTUxLCAweDgzZDM4NWM3LAotCTB4MTM2Yzk4NTYsIDB4NjQ2YmE4YzAsIDB4ZmQ2MmY5N2EsIDB4OGE2NWM5ZWMsCi0JMHgxNDAxNWM0ZiwgMHg2MzA2NmNkOSwgMHhmYTBmM2Q2MywgMHg4ZDA4MGRmNSwKLQkweDNiNmUyMGM4LCAweDRjNjkxMDVlLCAweGQ1NjA0MWU0LCAweGEyNjc3MTcyLAotCTB4M2MwM2U0ZDEsIDB4NGIwNGQ0NDcsIDB4ZDIwZDg1ZmQsIDB4YTUwYWI1NmIsCi0JMHgzNWI1YThmYSwgMHg0MmIyOTg2YywgMHhkYmJiYzlkNiwgMHhhY2JjZjk0MCwKLQkweDMyZDg2Y2UzLCAweDQ1ZGY1Yzc1LCAweGRjZDYwZGNmLCAweGFiZDEzZDU5LAotCTB4MjZkOTMwYWMsIDB4NTFkZTAwM2EsIDB4YzhkNzUxODAsIDB4YmZkMDYxMTYsCi0JMHgyMWI0ZjRiNSwgMHg1NmIzYzQyMywgMHhjZmJhOTU5OSwgMHhiOGJkYTUwZiwKLQkweDI4MDJiODllLCAweDVmMDU4ODA4LCAweGM2MGNkOWIyLCAweGIxMGJlOTI0LAotCTB4MmY2ZjdjODcsIDB4NTg2ODRjMTEsIDB4YzE2MTFkYWIsIDB4YjY2NjJkM2QsCi0JMHg3NmRjNDE5MCwgMHgwMWRiNzEwNiwgMHg5OGQyMjBiYywgMHhlZmQ1MTAyYSwKLQkweDcxYjE4NTg5LCAweDA2YjZiNTFmLCAweDlmYmZlNGE1LCAweGU4YjhkNDMzLAotCTB4NzgwN2M5YTIsIDB4MGYwMGY5MzQsIDB4OTYwOWE4OGUsIDB4ZTEwZTk4MTgsCi0JMHg3ZjZhMGRiYiwgMHgwODZkM2QyZCwgMHg5MTY0NmM5NywgMHhlNjYzNWMwMSwKLQkweDZiNmI1MWY0LCAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLAotCTB4NmMwNjk1ZWQsIDB4MWIwMWE1N2IsIDB4ODIwOGY0YzEsIDB4ZjUwZmM0NTcsCi0JMHg2NWIwZDljNiwgMHgxMmI3ZTk1MCwgMHg4YmJlYjhlYSwgMHhmY2I5ODg3YywKLQkweDYyZGQxZGRmLCAweDE1ZGEyZDQ5LCAweDhjZDM3Y2YzLCAweGZiZDQ0YzY1LAotCTB4NGRiMjYxNTgsIDB4M2FiNTUxY2UsIDB4YTNiYzAwNzQsIDB4ZDRiYjMwZTIsCi0JMHg0YWRmYTU0MSwgMHgzZGQ4OTVkNywgMHhhNGQxYzQ2ZCwgMHhkM2Q2ZjRmYiwKLQkweDQzNjllOTZhLCAweDM0NmVkOWZjLCAweGFkNjc4ODQ2LCAweGRhNjBiOGQwLAotCTB4NDQwNDJkNzMsIDB4MzMwMzFkZTUsIDB4YWEwYTRjNWYsIDB4ZGQwZDdjYzksCi0JMHg1MDA1NzEzYywgMHgyNzAyNDFhYSwgMHhiZTBiMTAxMCwgMHhjOTBjMjA4NiwKLQkweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmLAotCTB4NWVkZWY5MGUsIDB4MjlkOWM5OTgsIDB4YjBkMDk4MjIsIDB4YzdkN2E4YjQsCi0JMHg1OWIzM2QxNywgMHgyZWI0MGQ4MSwgMHhiN2JkNWMzYiwgMHhjMGJhNmNhZCwKLQkweGVkYjg4MzIwLCAweDlhYmZiM2I2LCAweDAzYjZlMjBjLCAweDc0YjFkMjlhLAotCTB4ZWFkNTQ3MzksIDB4OWRkMjc3YWYsIDB4MDRkYjI2MTUsIDB4NzNkYzE2ODMsCi0JMHhlMzYzMGIxMiwgMHg5NDY0M2I4NCwgMHgwZDZkNmEzZSwgMHg3YTZhNWFhOCwKLQkweGU0MGVjZjBiLCAweDkzMDlmZjlkLCAweDBhMDBhZTI3LCAweDdkMDc5ZWIxLAotCTB4ZjAwZjkzNDQsIDB4ODcwOGEzZDIsIDB4MWUwMWYyNjgsIDB4NjkwNmMyZmUsCi0JMHhmNzYyNTc1ZCwgMHg4MDY1NjdjYiwgMHgxOTZjMzY3MSwgMHg2ZTZiMDZlNywKLQkweGZlZDQxYjc2LCAweDg5ZDMyYmUwLCAweDEwZGE3YTVhLCAweDY3ZGQ0YWNjLAotCTB4ZjliOWRmNmYsIDB4OGViZWVmZjksIDB4MTdiN2JlNDMsIDB4NjBiMDhlZDUsCi0JMHhkNmQ2YTNlOCwgMHhhMWQxOTM3ZSwgMHgzOGQ4YzJjNCwgMHg0ZmRmZjI1MiwKLQkweGQxYmI2N2YxLCAweGE2YmM1NzY3LCAweDNmYjUwNmRkLCAweDQ4YjIzNjRiLAotCTB4ZDgwZDJiZGEsIDB4YWYwYTFiNGMsIDB4MzYwMzRhZjYsIDB4NDEwNDdhNjAsCi0JMHhkZjYwZWZjMywgMHhhODY3ZGY1NSwgMHgzMTZlOGVlZiwgMHg0NjY5YmU3OSwKLQkweGNiNjFiMzhjLCAweGJjNjY4MzFhLCAweDI1NmZkMmEwLCAweDUyNjhlMjM2LAotCTB4Y2MwYzc3OTUsIDB4YmIwYjQ3MDMsIDB4MjIwMjE2YjksIDB4NTUwNTI2MmYsCi0JMHhjNWJhM2JiZSwgMHhiMmJkMGIyOCwgMHgyYmI0NWE5MiwgMHg1Y2IzNmEwNCwKLQkweGMyZDdmZmE3LCAweGI1ZDBjZjMxLCAweDJjZDk5ZThiLCAweDViZGVhZTFkLAotCTB4OWI2NGMyYjAsIDB4ZWM2M2YyMjYsIDB4NzU2YWEzOWMsIDB4MDI2ZDkzMGEsCi0JMHg5YzA5MDZhOSwgMHhlYjBlMzYzZiwgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMywKLQkweDk1YmY0YTgyLCAweGUyYjg3YTE0LCAweDdiYjEyYmFlLCAweDBjYjYxYjM4LAotCTB4OTJkMjhlOWIsIDB4ZTVkNWJlMGQsIDB4N2NkY2VmYjcsIDB4MGJkYmRmMjEsCi0JMHg4NmQzZDJkNCwgMHhmMWQ0ZTI0MiwgMHg2OGRkYjNmOCwgMHgxZmRhODM2ZSwKLQkweDgxYmUxNmNkLCAweGY2YjkyNjViLCAweDZmYjA3N2UxLCAweDE4Yjc0Nzc3LAotCTB4ODgwODVhZTYsIDB4ZmYwZjZhNzAsIDB4NjYwNjNiY2EsIDB4MTEwMTBiNWMsCi0JMHg4ZjY1OWVmZiwgMHhmODYyYWU2OSwgMHg2MTZiZmZkMywgMHgxNjZjY2Y0NSwKLQkweGEwMGFlMjc4LCAweGQ3MGRkMmVlLCAweDRlMDQ4MzU0LCAweDM5MDNiM2MyLAotCTB4YTc2NzI2NjEsIDB4ZDA2MDE2ZjcsIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsCi0JMHhhZWQxNmE0YSwgMHhkOWQ2NWFkYywgMHg0MGRmMGI2NiwgMHgzN2Q4M2JmMCwKLQkweGE5YmNhZTUzLCAweGRlYmI5ZWM1LCAweDQ3YjJjZjdmLCAweDMwYjVmZmU5LAotCTB4YmRiZGYyMWMsIDB4Y2FiYWMyOGEsIDB4NTNiMzkzMzAsIDB4MjRiNGEzYTYsCi0JMHhiYWQwMzYwNSwgMHhjZGQ3MDY5MywgMHg1NGRlNTcyOSwgMHgyM2Q5NjdiZiwKLQkweGIzNjY3YTJlLCAweGM0NjE0YWI4LCAweDVkNjgxYjAyLCAweDJhNmYyYjk0LAotCTB4YjQwYmJlMzcsIDB4YzMwYzhlYTEsIDB4NWEwNWRmMWIsIDB4MmQwMmVmOGQKLX07Ci0KLS8qCi1VQ0hBUiAgIFdFUEtFWVtdID0gewotCQkvL0lWCi0JCTB4MDAsIDB4MTEsIDB4MjIsCi0JCS8vV0VQIEtFWQotCQkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweENDCi0JfTsKLSAqLwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJSW5pdCBXRVAgZnVuY3Rpb24uCi0KLQlBcmd1bWVudHM6Ci0gICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcEtleSAgICAgICAgUG9pbnRlciB0byB0aGUgV0VQIEtFWQotCQlLZXlJZAkJICAgV0VQIEtleSBJRAotCQlLZXlMZW4gICAgICB0aGUgbGVuZ3RoIG9mIFdFUCBLRVkKLQkJcERlc3QgICAgICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gd2hpY2ggRW5jcnlwdGlvbiBkYXRhIHdpbGwgc3RvcmUgaW4uCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUEluaXRXZXBFbmdpbmUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcEtleSwKLQlJTglVQ0hBUgkJCUtleUlkLAotCUlOCVVDSEFSCQkJS2V5TGVuLAotCUlOIE9VVAlQVUNIQVIJCXBEZXN0KQotewotCVVJTlQgaTsKLQlVQ0hBUiAgIFdFUEtFWVtdID0gewotCQkvL0lWCi0JCTB4MDAsIDB4MTEsIDB4MjIsCi0JCS8vV0VQIEtFWQotCQkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweENDCi0JfTsKLQotCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPSBQUFBJTklURkNTMzI7ICAgLy9Jbml0IGNyYzMyLgotCi0gICAgewotCQlOZGlzTW92ZU1lbW9yeShXRVBLRVkgKyAzLCBwS2V5LCBLZXlMZW4pOwotCi0gICAgICAgIGZvcihpID0gMDsgaSA8IDM7IGkrKykKLQkJCVdFUEtFWVtpXSA9IFJhbmRvbUJ5dGUocEFkKTsgICAvL0NhbGwgbWxtZSBSYW5kb21CeXRlKCkgZnVuY3Rpb24uCi0JCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBXRVBLRVksIEtleUxlbiArIDMpOyAgLy9JTklUIFNCT1gsIEtFWUxFTiszKElWKQotCi0JCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBXRVBLRVksIDMpOyAgLy9BcHBlbmQgSW5pdCBWZWN0b3IKLSAgICB9Ci0JKihwRGVzdCszKSA9IChLZXlJZCA8PCA2KTsgICAgICAgLy9BcHBlbmQgS0VZSUQKLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJRW5jcnlwdCB0cmFuc2ltaXR0ZWQgZGF0YQotCi0JQXJndW1lbnRzOgotICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSB0cmFuc2ltaXR0ZWQgc291cmNlIGRhdGEgdGhhdCB3aWxsIGJlIGVuY3J5cHQKLSAgICAgIHBEZXN0ICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHdoZXJlIGVudHJ5cHRpb24gZGF0YSB3aWxsIGJlIHN0b3JlIGluLgotICAgICAgTGVuCQkJSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlIGRhdGEKLQotCVJldHVybiBWYWx1ZToKLSAgICAgIE5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUEVuY3J5cHREYXRhKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBTcmMsCi0JSU4JUFVDSEFSCQkJcERlc3QsCi0JSU4JVUlOVAkJCUxlbikKLXsKLQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gUlRNUF9DQUxDX0ZDUzMyKHBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIsIHBTcmMsIExlbik7Ci0JQVJDRk9VUl9FTkNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIHBEZXN0LCBwU3JjLCBMZW4pOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlEZWNyeXB0IHJlY2VpdmVkIFdFUCBkYXRhCi0KLQlBcmd1bWVudHM6Ci0JCXBBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIGRhdGEKLQkJTGVuICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgZGF0YQotCi0JUmV0dXJuIFZhbHVlOgotCQlUUlVFICAgICAgICBEZWNyeXB0IFdFUCBkYXRhIHN1Y2Nlc3MKLQkJRkFMU0UgICAgICAgRGVjcnlwdCBXRVAgZGF0YSBmYWlsZWQKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOCVJUTVBTb2Z0RGVjcnlwdFdFUCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBQVUNIQVIJCQlwRGF0YSwKLQlJTiBVTE9ORwkJCURhdGFCeXRlQ250LAotCUlOIFBDSVBIRVJfS0VZCQlwR3JvdXBLZXkpCi17Ci0JVUlOVAl0cmFpbGZjczsKLQlVSU5UICAgIGNyYzMyOwotCVVDSEFSCUtleUlkeDsKLQlVQ0hBUiAgIFdFUEtFWVtdID0gewotCQkvL0lWCi0JCTB4MDAsIDB4MTEsIDB4MjIsCi0JCS8vV0VQIEtFWQotCQkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweENDCi0JfTsKLQlVQ0hBUgkqcFBheWxvYWQgPSAoVUNIQVIgKilwRGF0YSArIExFTkdUSF84MDJfMTE7Ci0JVUxPTkcJcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIExFTkdUSF84MDJfMTE7Ci0KLQlOZGlzTW92ZU1lbW9yeShXRVBLRVksIHBQYXlsb2FkLCAzKTsgICAgLy9HZXQgV0VQIElWCi0KLQlLZXlJZHggPSAoKihwUGF5bG9hZCArIDMpICYgMHhjMCkgPj4gNjsKLQlpZiAocEdyb3VwS2V5W0tleUlkeF0uS2V5TGVuID09IDApCi0JCXJldHVybiAoRkFMU0UpOwotCi0JTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEdyb3VwS2V5W0tleUlkeF0uS2V5LCBwR3JvdXBLZXlbS2V5SWR4XS5LZXlMZW4pOwotCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBXRVBLRVksIHBHcm91cEtleVtLZXlJZHhdLktleUxlbiArIDMpOwotCUFSQ0ZPVVJfREVDUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBwUGF5bG9hZCwgcFBheWxvYWQgKyA0LCBwYXlsb2FkX2xlbiAtIDQpOwotCU5kaXNNb3ZlTWVtb3J5KCZ0cmFpbGZjcywgcFBheWxvYWQgKyBwYXlsb2FkX2xlbiAtIDgsIDQpOwotCWNyYzMyID0gUlRNUF9DQUxDX0ZDUzMyKFBQUElOSVRGQ1MzMiwgcFBheWxvYWQsIHBheWxvYWRfbGVuIC0gOCk7ICAvL1NraXAgbGFzdCA0IGJ5dGVzKEZDUykuCi0JY3JjMzIgXj0gMHhmZmZmZmZmZjsgICAgICAgICAgICAgLyogY29tcGxlbWVudCAqLwotCi0gICAgaWYoY3JjMzIgIT0gY3B1MmxlMzIodHJhaWxmY3MpKQotICAgIHsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISBXRVAgRGF0YSBDUkMgRXJyb3IgIVxuIikpOwkgLy9DUkMgZXJyb3IuCi0JCXJldHVybiAoRkFMU0UpOwotCX0KLQlyZXR1cm4gKFRSVUUpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0gIkFSQ0ZPVVIiIGluaXRpYWxpemUKLQotCUFyZ3VtZW50czoKLQkgICBDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKLQkJcEtleSAgICAgICAgUG9pbnRlciB0byB0aGUgV0VQIEtFWQotCQlLZXlMZW4gICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIGZvIHRoZSBXRVAgS0VZCi0KLQlSZXR1cm4gVmFsdWU6Ci0JICAgTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlBUkNGT1VSX0lOSVQoCi0JSU4JUEFSQ0ZPVVJDT05URVhUCUN0eCwKLQlJTglQVUNIQVIJCQlwS2V5LAotCUlOCVVJTlQJCQlLZXlMZW4pCi17Ci0JVUNIQVIJdCwgdTsKLQlVSU5UCWtleWluZGV4OwotCVVJTlQJc3RhdGVpbmRleDsKLQlQVUNIQVIJc3RhdGU7Ci0JVUlOVAljb3VudGVyOwotCi0Jc3RhdGUgPSBDdHgtPlNUQVRFOwotCUN0eC0+WCA9IDA7Ci0JQ3R4LT5ZID0gMDsKLQlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMjU2OyBjb3VudGVyKyspCi0JCXN0YXRlW2NvdW50ZXJdID0gKFVDSEFSKWNvdW50ZXI7Ci0Ja2V5aW5kZXggPSAwOwotCXN0YXRlaW5kZXggPSAwOwotCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCAyNTY7IGNvdW50ZXIrKykKLQl7Ci0JCXQgPSBzdGF0ZVtjb3VudGVyXTsKLQkJc3RhdGVpbmRleCA9IChzdGF0ZWluZGV4ICsgcEtleVtrZXlpbmRleF0gKyB0KSAmIDB4ZmY7Ci0JCXUgPSBzdGF0ZVtzdGF0ZWluZGV4XTsKLQkJc3RhdGVbc3RhdGVpbmRleF0gPSB0OwotCQlzdGF0ZVtjb3VudGVyXSA9IHU7Ci0JCWlmICgrK2tleWluZGV4ID49IEtleUxlbikKLQkJCWtleWluZGV4ID0gMDsKLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlHZXQgYnl0ZXMgZnJvbSBBUkNGT1VSIENPTlRFWFQgKFMtQk9YKQotCi0JQXJndW1lbnRzOgotCSAgIEN0eCAgICAgICAgIFBvaW50ZXIgdG8gQVJDRk9VUiBDT05URVhUIChTQk9YKQotCi0JUmV0dXJuIFZhbHVlOgotCSAgIFVDSEFSICAtIHRoZSB2YWx1ZSBvZiB0aGUgQVJDRk9VUiBDT05URVhUIChTLUJPWCkKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQ0hBUglBUkNGT1VSX0JZVEUoCi0JSU4JUEFSQ0ZPVVJDT05URVhUCQlDdHgpCi17Ci0gIFVJTlQgeDsKLSAgVUlOVCB5OwotICBVQ0hBUiBzeCwgc3k7Ci0gIFBVQ0hBUiBzdGF0ZTsKLQotICBzdGF0ZSA9IEN0eC0+U1RBVEU7Ci0gIHggPSAoQ3R4LT5YICsgMSkgJiAweGZmOwotICBzeCA9IHN0YXRlW3hdOwotICB5ID0gKHN4ICsgQ3R4LT5ZKSAmIDB4ZmY7Ci0gIHN5ID0gc3RhdGVbeV07Ci0gIEN0eC0+WCA9IHg7Ci0gIEN0eC0+WSA9IHk7Ci0gIHN0YXRlW3ldID0gc3g7Ci0gIHN0YXRlW3hdID0gc3k7Ci0KLSAgcmV0dXJuKHN0YXRlWyhzeCArIHN5KSAmIDB4ZmZdKTsKLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJVGhlIFN0cmVhbSBDaXBoZXIgRGVjcnlwdGlvbiBBbGdvcml0aG0KLQotCUFyZ3VtZW50czoKLQkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCi0JCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KLQkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKLQkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGRhdGEKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJQVJDRk9VUl9ERUNSWVBUKAotCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCi0JSU4JUFVDSEFSCQkJcERlc3QsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglVSU5UCQkJTGVuKQotewotCVVJTlQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKLQkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobQotCi0JQXJndW1lbnRzOgotCQlDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKLQkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgotCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSBTb3VyY2UgZGF0YQotCQlMZW4gICAgICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBTb3VyY2UgZHRhCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJQVJDRk9VUl9FTkNSWVBUKAotCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCi0JSU4JUFVDSEFSCQkJcERlc3QsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglVSU5UCQkJTGVuKQotewotCVVJTlQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKLQkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobSB3aGljaCBjb25mb3JtIHRvIHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50IHRvIGVuY3J5cHQgIEdUSy4KLQotCUFyZ3VtZW50czoKLQkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCi0JCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KLQkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKLQkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGR0YQotCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0KLVZPSUQJV1BBQVJDRk9VUl9FTkNSWVBUKAotCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCi0JSU4JUFVDSEFSCQkJcERlc3QsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglVSU5UCQkJTGVuKQotewotCVVJTlQgaTsKLSAgICAgICAgLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcwotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICAgICAgICAgIEFSQ0ZPVVJfQllURShDdHgpOwotCi0JZm9yIChpID0gMDsgaSA8IExlbjsgaSsrKQotCQlwRGVzdFtpXSA9IHBTcmNbaV0gXiBBUkNGT1VSX0JZVEUoQ3R4KTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJQ2FsY3VsYXRlIGEgbmV3IEZDUyBnaXZlbiB0aGUgY3VycmVudCBGQ1MgYW5kIHRoZSBuZXcgZGF0YS4KLQotCUFyZ3VtZW50czoKLQkJRmNzCSAgICAgIHRoZSBvcmlnaW5hbCBGQ1MgdmFsdWUKLQkJQ3AgICAgICAgICAgcG9pbnRlciB0byB0aGUgZGF0YSB3aGljaCB3aWxsIGJlIGNhbGN1bGF0ZSB0aGUgRkNTCi0JCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEKLQotCVJldHVybiBWYWx1ZToKLQkJVUlOVCAtIEZDUyAzMiBiaXRzCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VSU5UCVJUTVBfQ0FMQ19GQ1MzMigKLQlJTglVSU5UCUZjcywKLQlJTglQVUNIQVIJQ3AsCi0JSU4JSU5UCQlMZW4pCi17Ci0Jd2hpbGUgKExlbi0tKQotCSAgIEZjcyA9ICgoKEZjcykgPj4gOCkgXiBGQ1NUQUJfMzJbKChGY3MpIF4gKCpDcCsrKSkgJiAweGZmXSk7Ci0KLQlyZXR1cm4gKEZjcyk7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUdldCBsYXN0IEZDUyBhbmQgZW5jcnlwdCBpdCB0byB0aGUgZGVzdGluYXRpb24KLQotCUFyZ3VtZW50czoKLQkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QU2V0SUNWKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUglwRGVzdCkKLXsKLQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyIF49IDB4ZmZmZmZmZmY7ICAgICAgICAgICAgIC8qIGNvbXBsZW1lbnQgKi8KLQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gY3B1MmxlMzIocEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMik7Ci0KLQlBUkNGT1VSX0VOQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcERlc3QsIChQVUNIQVIpICZwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCA0KTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV93cGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV93cGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY2OGFkOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fd3BhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQ5ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0Jd3BhLmMKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlKYW4JTGVlCQkwMy0wNy0yMgkJSW5pdGlhbAotCVBhdWwgTGluCTAzLTExLTI4CQlNb2RpZnkgZm9yIHN1cHBsaWNhbnQKLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0vLyBXUEEgT1VJCi1VQ0hBUgkJT1VJX1dQQV9OT05FX0FLTVs0XQkJPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMH07Ci1VQ0hBUiAgICAgICBPVUlfV1BBX1ZFUlNJT05bNF0gICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDAxfTsKLVVDSEFSICAgICAgIE9VSV9XUEFfV0VQNDBbNF0gICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDAxfTsKLVVDSEFSICAgICAgIE9VSV9XUEFfVEtJUFs0XSAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMn07Ci1VQ0hBUiAgICAgICBPVUlfV1BBX0NDTVBbNF0gICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDR9OwotVUNIQVIgICAgICAgT1VJX1dQQV9XRVAxMDRbNF0gICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDA1fTsKLVVDSEFSICAgICAgIE9VSV9XUEFfODAyMVhfQUtNWzRdCT0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDF9OwotVUNIQVIgICAgICAgT1VJX1dQQV9QU0tfQUtNWzRdICAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMn07Ci0vLyBXUEEyIE9VSQotVUNIQVIgICAgICAgT1VJX1dQQTJfV0VQNDBbNF0gICA9IHsweDAwLCAweDBGLCAweEFDLCAweDAxfTsKLVVDSEFSICAgICAgIE9VSV9XUEEyX1RLSVBbNF0gICAgICAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDJ9OwotVUNIQVIgICAgICAgT1VJX1dQQTJfQ0NNUFs0XSAgICAgICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNH07Ci1VQ0hBUiAgICAgICBPVUlfV1BBMl84MDIxWF9BS01bNF0gICA9IHsweDAwLCAweDBGLCAweEFDLCAweDAxfTsKLVVDSEFSICAgICAgIE9VSV9XUEEyX1BTS19BS01bNF0JCT0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDJ9OwotVUNIQVIgICAgICAgT1VJX1dQQTJfV0VQMTA0WzRdICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNX07Ci0KLQotCi1zdGF0aWMgVk9JRAlDb25zdHJ1Y3RFYXBvbEtleURhdGEoCi0JSU4JUE1BQ19UQUJMRV9FTlRSWQlwRW50cnksCi0JSU4JVUNIQVIJCQlHcm91cEtleVdlcFN0YXR1cywKLQlJTglVQ0hBUgkJCWtleURlc2NWZXIsCi0JSU4JVUNIQVIJCQlNc2dUeXBlLAotCUlOCVVDSEFSCQkJRGVmYXVsdEtleUlkeCwKLQlJTglVQ0hBUgkJCSpHVEssCi0JSU4JVUNIQVIJCQkqUlNOSUUsCi0JSU4JVUNIQVIJCQlSU05JRV9MRU4sCi0JT1VUIFBFQVBPTF9QQUNLRVQgICBwTXNnKTsKLQotc3RhdGljIFZPSUQJQ2FsY3VsYXRlTUlDKAotCUlOCVVDSEFSCQkJS2V5RGVzY1ZlciwKLQlJTglVQ0hBUgkJCSpQVEssCi0JT1VUIFBFQVBPTF9QQUNLRVQgICBwTXNnKTsKLQotc3RhdGljIFZPSUQgV3BhRUFQUGFja2V0QWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLXN0YXRpYyBWT0lEIFdwYUVBUE9MQVNGQWxlcnRBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotc3RhdGljIFZPSUQgV3BhRUFQT0xMb2dvZmZBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotc3RhdGljIFZPSUQgV3BhRUFQT0xTdGFydEFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKLQotc3RhdGljIFZPSUQgV3BhRUFQT0xLZXlBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZSBpbml0LCBpbmNsdWRpbmcgc3RhdGUgdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAotICAgIFBhcmFtZXRlcnM6Ci0gICAgICAgIFMgLSBwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBXcGFTdGF0ZU1hY2hpbmVJbml0KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBTVEFURV9NQUNISU5FICpTLAotICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKLXsKLSAgICBTdGF0ZU1hY2hpbmVJbml0KFMsIChTVEFURV9NQUNISU5FX0ZVTkMgKilUcmFucywgTUFYX1dQQV9QVEtfU1RBVEUsIE1BWF9XUEFfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIFdQQV9QVEssIFdQQV9NQUNISU5FX0JBU0UpOwotCi0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFdQQV9QVEssIE1UMl9FQVBQYWNrZXQsIChTVEFURV9NQUNISU5FX0ZVTkMpV3BhRUFQUGFja2V0QWN0aW9uKTsKLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgV1BBX1BUSywgTVQyX0VBUE9MU3RhcnQsIChTVEFURV9NQUNISU5FX0ZVTkMpV3BhRUFQT0xTdGFydEFjdGlvbik7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFdQQV9QVEssIE1UMl9FQVBPTExvZ29mZiwgKFNUQVRFX01BQ0hJTkVfRlVOQylXcGFFQVBPTExvZ29mZkFjdGlvbik7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFdQQV9QVEssIE1UMl9FQVBPTEtleSwgKFNUQVRFX01BQ0hJTkVfRlVOQylXcGFFQVBPTEtleUFjdGlvbik7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFdQQV9QVEssIE1UMl9FQVBPTEFTRkFsZXJ0LCAoU1RBVEVfTUFDSElORV9GVU5DKVdwYUVBUE9MQVNGQWxlcnRBY3Rpb24pOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIHRoaXMgaXMgc3RhdGUgbWFjaGluZSBmdW5jdGlvbi4KLSAgICAgICAgV2hlbiByZWNlaXZpbmcgRUFQIHBhY2tldHMgd2hpY2ggaXMgIGZvciA4MDIuMXggYXV0aGVudGljYXRpb24gdXNlLgotICAgICAgICBOb3QgdXNlIGluIFBTSyBjYXNlCi0gICAgUmV0dXJuOgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBXcGFFQVBQYWNrZXRBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotfQotCi1WT0lEIFdwYUVBUE9MQVNGQWxlcnRBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotfQotCi1WT0lEIFdwYUVBUE9MTG9nb2ZmQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgIFN0YXJ0IDQtd2F5IEhTIHdoZW4gcmN2IEVBUE9MX1NUQVJUIHdoaWNoIG1heSBjcmVhdGUgYnkgb3VyIGRyaXZlciBpbiBhc3NvYy5jCi0gICAgUmV0dXJuOgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBXcGFFQVBPTFN0YXJ0QWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pCi17Ci0gICAgTUFDX1RBQkxFX0VOVFJZICAgICAqcEVudHJ5OwotICAgIFBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYUVBUE9MU3RhcnRBY3Rpb24gPT09PiBcbiIpKTsKLQotICAgIHBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpRWxlbS0+TXNnOwotCi0gICAgLy9Gb3Igbm9ybWFvbCBQU0ssIHdlIGVucXVldWUgYW4gRUFQT0wtU3RhcnQgY29tbWFuZCB0byB0cmlnZ2VyIHRoZSBwcm9jZXNzLgotICAgIGlmIChFbGVtLT5Nc2dMZW4gPT0gNikKLSAgICAgICAgcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBFbGVtLT5Nc2cpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEhlYWRlci0+QWRkcjIpOwotICAgIH0KLQotICAgIGlmIChwRW50cnkpCi0gICAgewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgUG9ydFNlY3VyZWQoJWQpLCBXcGFTdGF0ZSglZCksIEF1dGhNb2RlKCVkKSwgUE1LSURfQ2FjaGVJZHgoJWQpIFxuIiwgcEVudHJ5LT5Qb3J0U2VjdXJlZCwgcEVudHJ5LT5XcGFTdGF0ZSwgcEVudHJ5LT5BdXRoTW9kZSwgcEVudHJ5LT5QTUtJRF9DYWNoZUlkeCkpOwotCi0gICAgICAgIGlmICgocEVudHJ5LT5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpCi0JCQkmJiAocEVudHJ5LT5XcGFTdGF0ZSA8IEFTX1BUS1NUQVJUKQotICAgICAgICAgICAgJiYgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpICYmIChwRW50cnktPlBNS0lEX0NhY2hlSWR4ICE9IEVOVFJZX05PVF9GT1VORCkpKSkKLSAgICAgICAgewotICAgICAgICAgICAgcEVudHJ5LT5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKLSAgICAgICAgICAgIHBFbnRyeS0+V3BhU3RhdGUgPSBBU19JTklUUFNLOwotICAgICAgICAgICAgcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKLSAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLCBzaXplb2YocEVudHJ5LT5SX0NvdW50ZXIpKTsKLSAgICAgICAgICAgIHBFbnRyeS0+UmVUcnlDb3VudGVyID0gUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUjsKLQotICAgICAgICAgICAgV1BBU3RhcnQ0V2F5SFMocEFkLCBwRW50cnksIFBFRVJfTVNHMV9SRVRSWV9FWEVDX0lOVFYpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFRoaXMgaXMgc3RhdGUgbWFjaGluZSBmdW5jdGlvbi4KLSAgICAgICAgV2hlbiByZWNlaXZpbmcgRUFQT0wgcGFja2V0cyB3aGljaCBpcyAgZm9yIDgwMi4xeCBrZXkgbWFuYWdlbWVudC4KLSAgICAgICAgVXNlIGJvdGggaW4gV1BBLCBhbmQgV1BBUFNLIGNhc2UuCi0gICAgICAgIEluIHRoaXMgZnVuY3Rpb24sIGZ1cnRoZXIgZGlzcGF0Y2ggdG8gZGlmZmVyZW50IGZ1bmN0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIHJlY2VpdmVkIHBhY2tldC4gIDMgY2F0ZWdvcmllcyBhcmUgOgotICAgICAgICAgIDEuICBub3JtYWwgNC13YXkgcGFpcndpc2VrZXkgYW5kIDItd2F5IGdyb3Vwa2V5IGhhbmRzaGFrZQotICAgICAgICAgIDIuICBNSUMgZXJyb3IgKENvdW50ZXJtZWFzdXJlcyBhdHRhY2spICByZXBvcnQgcGFja2V0IGZyb20gU1RBLgotICAgICAgICAgIDMuICBSZXF1ZXN0IGZvciBwYWlyd2lzZS9ncm91cCBrZXkgdXBkYXRlIGZyb20gU1RBCi0gICAgUmV0dXJuOgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBXcGFFQVBPTEtleUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKQotewotICAgIE1BQ19UQUJMRV9FTlRSWSAgICAgKnBFbnRyeTsKLSAgICBQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7Ci0gICAgUEVBUE9MX1BBQ0tFVCAgICAgICBwRWFwb2xfcGFja2V0OwotCUtFWV9JTkZPCQkJcGVlcktleUluZm87Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFFQVBPTEtleUFjdGlvbiA9PT0+XG4iKSk7Ci0KLSAgICBwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKUVsZW0tPk1zZzsKLSAgICBwRWFwb2xfcGFja2V0ID0gKFBFQVBPTF9QQUNLRVQpJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOwotCi0JTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIHNpemVvZihwZWVyS2V5SW5mbykpOwotCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCAoUFVDSEFSKSZwRWFwb2xfcGFja2V0LT5LZXlEZXNjLktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOwotCi0JaGV4X2R1bXAoIlJlY2VpdmVkIEVhcG9sIGZyYW1lIiwgKHVuc2lnbmVkIGNoYXIgKilwRWFwb2xfcGFja2V0LCAoRWxlbS0+TXNnTGVuIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF84MDJfMV9IKSk7Ci0KLQkqKChVU0hPUlQgKikmcGVlcktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJnBlZXJLZXlJbmZvKSk7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyLT5BZGRyMik7Ci0KLQkJaWYgKCFwRW50cnkgfHwgKCghcEVudHJ5LT5WYWxpZEFzQ0xJKSAmJiAoIXBFbnRyeS0+VmFsaWRBc0FwQ2xpKSkpCi0gICAgICAgICAgICBicmVhazsKLQotCQlpZiAocEVudHJ5LT5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLQkJCQlicmVhazsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUG9MLUtleSBmcmFtZSBmcm9tIFNUQSAlMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWFxuIiwgUFJJTlRfTUFDKHBFbnRyeS0+QWRkcikpKTsKLQotICAgICAgICBpZiAoKChwRWFwb2xfcGFja2V0LT5Qcm9WZXIgIT0gRUFQT0xfVkVSKSAmJiAocEVhcG9sX3BhY2tldC0+UHJvVmVyICE9IEVBUE9MX1ZFUjIpKSB8fAotCQkJKChwRWFwb2xfcGFja2V0LT5LZXlEZXNjLlR5cGUgIT0gV1BBMV9LRVlfREVTQykgJiYgKHBFYXBvbF9wYWNrZXQtPktleURlc2MuVHlwZSAhPSBXUEEyX0tFWV9ERVNDKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIktleSBkZXNjcmlwdGVyIGRvZXMgbm90IG1hdGNoIHdpdGggV1BBIHJ1bGVcbiIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLQkJLy8gVGhlIHZhbHVlIDEgc2hhbGwgYmUgdXNlZCBmb3IgYWxsIEVBUE9MLUtleSBmcmFtZXMgdG8gYW5kIGZyb20gYSBTVEEgd2hlbgotCQkvLyBuZWl0aGVyIHRoZSBncm91cCBub3IgcGFpcndpc2UgY2lwaGVycyBhcmUgQ0NNUCBmb3IgS2V5IERlc2NyaXB0b3IgMS4KLQkJaWYgKChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSBERVNDX1RZUEVfVEtJUCkpCi0gICAgICAgIHsKLQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIktleSBkZXNjcmlwdGVyIHZlcnNpb24gbm90IG1hdGNoKFRLSVApIFxuIikpOwotCSAgICBicmVhazsKLQl9Ci0JCS8vIFRoZSB2YWx1ZSAyIHNoYWxsIGJlIHVzZWQgZm9yIGFsbCBFQVBPTC1LZXkgZnJhbWVzIHRvIGFuZCBmcm9tIGEgU1RBIHdoZW4KLQkJLy8gZWl0aGVyIHRoZSBwYWlyd2lzZSBvciB0aGUgZ3JvdXAgY2lwaGVyIGlzIEFFUy1DQ01QIGZvciBLZXkgRGVzY3JpcHRvciAyLgotCWVsc2UgaWYgKChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSBERVNDX1RZUEVfQUVTKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIktleSBkZXNjcmlwdGVyIHZlcnNpb24gbm90IG1hdGNoKEFFUykgXG4iKSk7Ci0JCWJyZWFrOwotCX0KLQotCQkvLyBDaGVjayBpZiB0aGlzIFNUQSBpcyBpbiBjbGFzcyAzIHN0YXRlIGFuZCB0aGUgV1BBIHN0YXRlIGlzIHN0YXJ0ZWQKLSAgICAgICAgaWYgKChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpICYmIChwRW50cnktPldwYVN0YXRlID49IEFTX0lOSVRQU0spKQotICAgICAgICB7Ci0JCQkvLyBDaGVjayB0aGUgS2V5IEFjayAoYml0IDcpIG9mIHRoZSBLZXkgSW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHRoZSBBdXRoZW50aWNhdG9yCi0JCQkvLyBvciBub3QuCi0JCQkvLyBBbiBFQVBPTC1LZXkgZnJhbWUgdGhhdCBpcyBzZW50IGJ5IHRoZSBTdXBwbGljYW50IGluIHJlc3BvbnNlIHRvIGFuIEVBUE9MLQotCQkJLy8gS2V5IGZyYW1lIGZyb20gdGhlIEF1dGhlbnRpY2F0b3IgbXVzdCBub3QgaGF2ZSB0aGUgQWNrIGJpdCBzZXQuCi0JCQlpZiAocGVlcktleUluZm8uS2V5QWNrID09IDEpCi0JCQl7Ci0JCQkJLy8gVGhlIGZyYW1lIGlzIHNuZXQgYnkgQXV0aGVudGljYXRvci4KLQkJCQkvLyBTbyB0aGUgU3VwcGxpY2FudCBzaWRlIHNoYWxsIGhhbmRsZSB0aGlzLgotCi0JCQkJaWYgKChwZWVyS2V5SW5mby5TZWN1cmUgPT0gMCkgJiYgKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkgJiYKLQkJCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmIChwZWVyS2V5SW5mby5LZXlUeXBlID09IFBBSVJXSVNFS0VZKSkKLQkJCQl7Ci0JCQkJCS8vIFByb2Nlc3MgMS4gdGhlIG1lc3NhZ2UgMSBvZiA0LXdheSBIUyBpbiBXUEEgb3IgV1BBMgotCQkJCQkvLwkJCSAgRUFQT0wtS2V5KDAsMCwxLDAsUCwwLDAsQU5vbmNlLDAsRGF0YUtEX00xKQotCQkJCQkvLwkJICAgMi4gdGhlIG1lc3NhZ2UgMyBvZiA0LXdheSBIUyBpbiBXUEEKLQkJCQkJLy8JCQkgIEVBUE9MLUtleSgwLDEsMSwxLFAsMCxLZXlSU0MsQU5vbmNlLE1JQyxEYXRhS0RfTTMpCi0JCQkJCWlmIChwZWVyS2V5SW5mby5LZXlNaWMgPT0gMCkKLQkJCVBlZXJQYWlyTXNnMUFjdGlvbihwQWQsIHBFbnRyeSwgRWxlbSk7Ci0JICAgICAgICAgICAgICAgIGVsc2UKLQkgICAgICAgICAgICAgICAgUGVlclBhaXJNc2czQWN0aW9uKHBBZCwgcEVudHJ5LCBFbGVtKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAxKSAmJgotCQkJCQkJIChwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkgJiYKLQkJCQkJCSAocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSAmJgotCQkJCQkJIChwZWVyS2V5SW5mby5FcnJvciA9PSAwKSkKLQkJCQl7Ci0JCQkJCS8vIFByb2Nlc3MgMS4gdGhlIG1lc3NhZ2UgMyBvZiA0LXdheSBIUyBpbiBXUEEyCi0JCQkJCS8vCQkJICBFQVBPTC1LZXkoMSwxLDEsMSxQLDAsS2V5UlNDLEFOb25jZSxNSUMsRGF0YUtEX00zKQotCQkJCQkvLwkJICAgMi4gdGhlIG1lc3NhZ2UgMSBvZiBncm91cCBLUyBpbiBXUEEgb3IgV1BBMgotCQkJCQkvLwkJCSAgRUFQT0wtS2V5KDEsMSwxLDAsRywwLEtleSBSU0MsMCwgTUlDLEdUS1tOXSkKLQkJCQkJaWYgKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gUEFJUldJU0VLRVkpCi0JCQkJCQlQZWVyUGFpck1zZzNBY3Rpb24ocEFkLCBwRW50cnksIEVsZW0pOwotCQkJCQllbHNlCi0JCQkJCQlQZWVyR3JvdXBNc2cxQWN0aW9uKHBBZCwgcEVudHJ5LCBFbGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gVGhlIGZyYW1lIGlzIHNuZXQgYnkgU3VwcGxpY2FudC4KLQkJCQkvLyBTbyB0aGUgQXV0aGVudGljYXRvciBzaWRlIHNoYWxsIGhhbmRsZSB0aGlzLgotCQkJCWlmICgocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSAmJgotCQkJCQkJIChwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgotCQkJCQkJIChwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkpCi0JCQkJewotCQkJCQlpZiAocGVlcktleUluZm8uU2VjdXJlID09IDAgJiYgcGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkKLQkJCQkJewotCQkJCQkJLy8gRUFQT0wtS2V5KDAsMSwwLDAsUCwwLDAsU05vbmNlLE1JQyxEYXRhKQotCQkJCQkJLy8gUHJvY2VzcyAxLiBtZXNzYWdlIDIgb2YgNC13YXkgSFMgaW4gV1BBIG9yIFdQQTIKLQkJCQkJCS8vCQkgICAyLiBtZXNzYWdlIDQgb2YgNC13YXkgSFMgaW4gV1BBCi0JCQkJCQlpZiAoQ09OVl9BUlJBUllfVE9fVUlOVDE2KHBFYXBvbF9wYWNrZXQtPktleURlc2MuS2V5RGF0YUxlbikgPT0gMCkKLQkJCQkJCXsKLQkJCQkJCQlQZWVyUGFpck1zZzRBY3Rpb24ocEFkLCBwRW50cnksIEVsZW0pOwotCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCVBlZXJQYWlyTXNnMkFjdGlvbihwQWQsIHBFbnRyeSwgRWxlbSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocGVlcktleUluZm8uU2VjdXJlID09IDEgJiYgcGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkKLQkJCQkJewotCQkJCQkJLy8gRUFQT0wtS2V5KDEsMSwwLDAsUCwwLDAsMCxNSUMsMCkKLQkJCQkJCS8vIFByb2Nlc3MgbWVzc2FnZSA0IG9mIDQtd2F5IEhTIGluIFdQQTIKLQkJCQkJCVBlZXJQYWlyTXNnNEFjdGlvbihwQWQsIHBFbnRyeSwgRWxlbSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocGVlcktleUluZm8uU2VjdXJlID09IDEgJiYgcGVlcktleUluZm8uS2V5VHlwZSA9PSBHUk9VUEtFWSkKLQkJCQkJewotCQkJCQkJLy8gRUFQT0wtS2V5KDEsMSwwLDAsRywwLDAsMCxNSUMsMCkKLQkJCQkJCS8vIFByb2Nlc3MgbWVzc2FnZSAyIG9mIEdyb3VwIGtleSBIUyBpbiBXUEEgb3IgV1BBMgotCQkJCQkJUGVlckdyb3VwTXNnMkFjdGlvbihwQWQsIHBFbnRyeSwgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExXSwgKEVsZW0tPk1zZ0xlbiAtIExFTkdUSF84MDJfMTEpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLSAgICAgICAgfQotICAgIH13aGlsZShGQUxTRSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKLQlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgZW5jcnlwdGlvbiBiZWZvcmUgcmVhbGx5Ci0Jc2VudCBvdXQgdG8gYWlyLgotCi0JQXJndW1lbnRzOgotCQlwQWQJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKLQkJUE5ESVNfUEFDS0VUCVBvaW50ZXIgdG8gb3V0Z29pbmcgTmRpcyBmcmFtZQotCQlOdW1iZXJPZkZyYWcJTnVtYmVyIG9mIGZyYWdtZW50IHJlcXVpcmVkCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEICAgIFJUTVBUb1dpcmVsZXNzU3RhKAotICAgIElOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0gICAgSU4gIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAotICAgIElOICBQVUNIQVIJCQlwSGVhZGVyODAyXzMsCi0gICAgSU4gIFVJTlQJCQlIZHJMZW4sCi0gICAgSU4gIFBVQ0hBUgkJCXBEYXRhLAotICAgIElOICBVSU5UCQkJRGF0YUxlbiwKLSAgICBJTglCT09MRUFOCQkJCWJDbGVhckZyYW1lKQotewotICAgIFBORElTX1BBQ0tFVCAgICBwUGFja2V0OwotICAgIE5ESVNfU1RBVFVTICAgICBTdGF0dXM7Ci0KLQlpZiAoKCFwRW50cnkpIHx8ICgoIXBFbnRyeS0+VmFsaWRBc0NMSSkgJiYgKCFwRW50cnktPlZhbGlkQXNBcENsaSkpKQotCQlyZXR1cm47Ci0KLSAgICBkbyB7Ci0JCS8vIGJ1aWxkIGEgTkRJUyBwYWNrZXQKLQkJU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwUGFja2V0LCBwSGVhZGVyODAyXzMsIEhkckxlbiwgcERhdGEsIERhdGFMZW4pOwotCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCWJyZWFrOwotCi0KLQkJCWlmIChiQ2xlYXJGcmFtZSkKLQkJCQlSVE1QX1NFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBQYWNrZXQsIDEpOwotCQkJZWxzZQotCQkJCVJUTVBfU0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUocFBhY2tldCwgMCk7Ci0JCXsKLQkJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFBhY2tldCwgUEtUU1JDX05ESVMpOwotCi0JCQlSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQocFBhY2tldCwgTUFJTl9NQlNTSUQpOwkvLyBzZXQgYSBkZWZhdWx0IHZhbHVlCi0JCQlpZihwRW50cnktPmFwaWR4ICE9IDApCi0JCQlSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQocFBhY2tldCwgcEVudHJ5LT5hcGlkeCk7Ci0KLQkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgKFVDSEFSKXBFbnRyeS0+QWlkKTsKLQkJCVJUTVBfU0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0LCBGQUxTRSk7Ci0JCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCSAgICAvLyBzZW5kIG91dCB0aGUgcGFja2V0Ci0JICAgICAgICBTdGF0dXMgPSBTVEFTZW5kUGFja2V0KHBBZCwgcFBhY2tldCk7Ci0JICAgIGlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCXsKLQkJCQlVQ0hBUiAgIEluZGV4OwotCi0JCQkJLy8gRGVxdWV1ZSBvbmUgZnJhbWUgZnJvbSBUeFN3UXVldWUwLi4zIHF1ZXVlIGFuZCBwcm9jZXNzIGl0Ci0JCQkJLy8gVGhlcmUgYXJlIHRocmVlIHBsYWNlIGNhbGxpbmcgZGVxdWV1ZSBmb3IgVFggcmluZy4KLQkJCQkvLyAxLiBIZXJlLCByaWdodCBhZnRlciBxdWV1ZWluZyB0aGUgZnJhbWUuCi0JCQkJLy8gMi4gQXQgdGhlIGVuZCBvZiBUeFJpbmdUeERvbmUgc2VydmljZSByb3V0aW5lLgotCQkJCS8vIDMuIFVwb24gTkRJUyBjYWxsIFJUTVBTZW5kUGFja2V0cwotCQkJCWlmKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgJiYKLQkJCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSkKLQkJCQl7Ci0JCQkJCWZvcihJbmRleCA9IDA7IEluZGV4IDwgNTsgSW5kZXggKyspCi0JCQkJCQlpZihwQWQtPlR4U3dRdWV1ZVtJbmRleF0uTnVtYmVyID4gMCkKLQkJCQkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBJbmRleCwgTUFYX1RYX1BST0NFU1MpOwotCQkJCX0KLQkJCX0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0gICAgfSB3aGlsZSAoRkFMU0UpOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFRoaXMgaXMgYSBmdW5jdGlvbiB0byBpbml0aWxpemUgNC13YXkgaGFuZHNoYWtlCi0KLSAgICBSZXR1cm46Ci0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgV1BBU3RhcnQ0V2F5SFMoCi0gICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0gICAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotICAgIElOIFVMT05HCQkJVGltZUludGVydmFsKQotewotICAgIFVDSEFSICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07Ci0gICAgRUFQT0xfUEFDS0VUCUVBUE9MUEtUOwotCVBVSU5UOAkJCXBCc3NpZCA9IE5VTEw7Ci0JVUNIQVIJCQlncm91cF9jaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IFdQQVN0YXJ0NFdheUhTXG4iKSk7Ci0KLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIltFUlJPUl1XUEFTdGFydDRXYXlIUyA6IFRoZSBpbnRlcmZhY2UgaXMgY2xvc2VkLi4uXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQotCWlmIChwQnNzaWQgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIltFUlJPUl1XUEFTdGFydDRXYXlIUyA6IE5vIGNvcnJlc3BvbmRpbmcgQXV0aGVudGljYXRvci5cbiIpKTsKLQkJcmV0dXJuOwotICAgIH0KLQotCS8vIENoZWNrIHRoZSBzdGF0dXMKLSAgICBpZiAoKHBFbnRyeS0+V3BhU3RhdGUgPiBBU19QVEtTVEFSVCkgfHwgKHBFbnRyeS0+V3BhU3RhdGUgPCBBU19JTklUUE1LKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIltFUlJPUl1XUEFTdGFydDRXYXlIUyA6IE5vdCBleHBlY3QgY2FsbGluZ1xuIikpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0KLQkvLyBJbmNyZW1lbnQgcmVwbGF5IGNvdW50ZXIgYnkgMQotCUFERF9PTkVfVG9fNjRCSVRfVkFSKHBFbnRyeS0+Ul9Db3VudGVyKTsKLQotCS8vIFJhbmRvbWx5IGdlbmVyYXRlIEFOb25jZQotCUdlblJhbmRvbShwQWQsIChVQ0hBUiAqKXBCc3NpZCwgcEVudHJ5LT5BTm9uY2UpOwotCi0JLy8gQ29uc3RydWN0IEVBUG9MIG1lc3NhZ2UgLSBQYWlyd2lzZSBNc2cgMQotCS8vIEVBUE9MLUtleSgwLDAsMSwwLFAsMCwwLEFOb25jZSwwLERhdGFLRF9NMSkKLQlOZGlzWmVyb01lbW9yeSgmRUFQT0xQS1QsIHNpemVvZihFQVBPTF9QQUNLRVQpKTsKLQlDb25zdHJ1Y3RFYXBvbE1zZyhwRW50cnksCi0JCQkJCSAgZ3JvdXBfY2lwaGVyLAotCQkJCQkgIEVBUE9MX1BBSVJfTVNHXzEsCi0JCQkJCSAgMCwJCQkJCS8vIERlZmF1bHQga2V5IGluZGV4Ci0JCQkJCSAgcEVudHJ5LT5BTm9uY2UsCi0JCQkJCSAgTlVMTCwJCQkJCS8vIFR4UlNDCi0JCQkJCSAgTlVMTCwJCQkJCS8vIEdUSwotCQkJCQkgIE5VTEwsCQkJCQkvLyBSU05JRQotCQkJCQkgIDAsCQkJCQkvLyBSU05JRSBsZW5ndGgKLQkJCQkJICAmRUFQT0xQS1QpOwotCi0KLQkvLyBNYWtlIG91dGdvaW5nIGZyYW1lCi0gICAgTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBFbnRyeS0+QWRkciwgcEJzc2lkLCBFQVBPTCk7Ci0gICAgUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBwRW50cnksIEhlYWRlcjgwMl8zLAotCQkJCQkgIExFTkdUSF84MDJfMywgKFBVQ0hBUikmRUFQT0xQS1QsCi0JCQkJCSAgQ09OVl9BUlJBUllfVE9fVUlOVDE2KEVBUE9MUEtULkJvZHlfTGVuKSArIDQsCi0JCQkJCSAgKHBFbnRyeS0+UG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpID8gRkFMU0UgOiBUUlVFKTsKLQotCS8vIFRyaWdnZXIgUmV0cnkgVGltZXIKLSAgICBSVE1QTW9kVGltZXIoJnBFbnRyeS0+UmV0cnlUaW1lciwgVGltZUludGVydmFsKTsKLQotCS8vIFVwZGF0ZSBTdGF0ZQotICAgIHBFbnRyeS0+V3BhU3RhdGUgPSBBU19QVEtTVEFSVDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gV1BBU3RhcnQ0V2F5SFM6IHNlbmQgTXNnMSBvZiA0LXdheSBcbiIpKTsKLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUHJvY2VzcyBQYWlyd2lzZSBrZXkgTXNnLTEgb2YgNC13YXkgaGFuZHNoYWtpbmcgYW5kIHNlbmQgTXNnLTIKLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgotCQlFbGVtCQlNZXNzYWdlIGJvZHkKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUGVlclBhaXJNc2cxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKQotewotCVVDSEFSCQkJCVBUS1s4MF07Ci0JVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07Ci0JUEVBUE9MX1BBQ0tFVAkJcE1zZzE7Ci0JVUlOVAkJCU1zZ0xlbjsKLQlFQVBPTF9QQUNLRVQJCUVBUE9MUEtUOwotCVBVSU5UOAkJCQlwQ3VycmVudEFkZHIgPSBOVUxMOwotCVBVSU5UOAkJCQlwbWtfcHRyID0gTlVMTDsKLQlVQ0hBUgkJCQlncm91cF9jaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0JUFVJTlQ4CQkJCXJzbmllX3B0ciA9IE5VTEw7Ci0JVUNIQVIJCQkJcnNuaWVfbGVuID0gMDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlclBhaXJNc2cxQWN0aW9uIFxuIikpOwotCi0JaWYgKCghcEVudHJ5KSB8fCAoKCFwRW50cnktPlZhbGlkQXNDTEkpICYmICghcEVudHJ5LT5WYWxpZEFzQXBDbGkpKSkKLQkJcmV0dXJuOwotCi0gICAgaWYgKEVsZW0tPk1zZ0xlbiA8IChMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyBMRU5HVEhfRUFQT0xfSCArIHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFIC0gMikpCi0gICAgICAgIHJldHVybjsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlwQ3VycmVudEFkZHIgPSBwQWQtPkN1cnJlbnRBZGRyZXNzOwotCQlwbWtfcHRyID0gcEFkLT5TdGFDZmcuUE1LOwotCQlncm91cF9jaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKLQkJcnNuaWVfcHRyID0gcEFkLT5TdGFDZmcuUlNOX0lFOwotCQlyc25pZV9sZW4gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JLy8gU3RvcmUgdGhlIHJlY2VpdmVkIGZyYW1lCi0JcE1zZzEgPSAoUEVBUE9MX1BBQ0tFVCkgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOwotCU1zZ0xlbiA9IEVsZW0tPk1zZ0xlbiAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfODAyXzFfSDsKLQotCS8vIFNhbml0eSBDaGVjayBwZWVyIFBhaXJ3aXNlIG1lc3NhZ2UgMSAtIFJlcGxheSBDb3VudGVyCi0JaWYgKFBlZXJXcGFNZXNzYWdlU2FuaXR5KHBBZCwgcE1zZzEsIE1zZ0xlbiwgRUFQT0xfUEFJUl9NU0dfMSwgcEVudHJ5KSA9PSBGQUxTRSkKLQkJcmV0dXJuOwotCi0JLy8gU3RvcmUgUmVwbGF5IGNvdW50ZXIsIGl0IHdpbGwgdXNlIHRvIHZlcmlmeSBtZXNzYWdlIDMgYW5kIGNvbnN0cnVjdCBtZXNzYWdlIDIKLQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlJfQ291bnRlciwgcE1zZzEtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0KLQkvLyBTdG9yZSBBTm9uY2UKLQlOZGlzTW92ZU1lbW9yeShwRW50cnktPkFOb25jZSwgcE1zZzEtPktleURlc2MuS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7Ci0KLQkvLyBHZW5lcmF0ZSByYW5kb20gU05vbmNlCi0JR2VuUmFuZG9tKHBBZCwgKFVDSEFSICopcEN1cnJlbnRBZGRyLCBwRW50cnktPlNOb25jZSk7Ci0KLQl7Ci0JICAgIC8vIENhbGN1bGF0ZSBQVEsoQU5vbmNlLCBTTm9uY2UpCi0JICAgIFdwYURlcml2ZVBUSyhwQWQsCi0JCQkJcG1rX3B0ciwKLQkJCQlwRW50cnktPkFOb25jZSwKLQkJCQkJcEVudHJ5LT5BZGRyLAotCQkJCQlwRW50cnktPlNOb25jZSwKLQkJCQkJcEN1cnJlbnRBZGRyLAotCQkJCSAgICBQVEssCi0JCQkJICAgIExFTl9QVEspOwotCi0JCS8vIFNhdmUga2V5IHRvIFBUSyBlbnRyeQotCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBUSywgUFRLLCBMRU5fUFRLKTsKLQl9Ci0KLQkvLyBVcGRhdGUgV3BhU3RhdGUKLQlwRW50cnktPldwYVN0YXRlID0gQVNfUFRLSU5JVF9ORUdPVElBVElORzsKLQotCS8vIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gUGFpcndpc2UgTXNnIDIKLQkvLyAgRUFQT0wtS2V5KDAsMSwwLDAsUCwwLDAsU05vbmNlLE1JQyxEYXRhS0RfTTIpCi0JTmRpc1plcm9NZW1vcnkoJkVBUE9MUEtULCBzaXplb2YoRUFQT0xfUEFDS0VUKSk7Ci0JQ29uc3RydWN0RWFwb2xNc2cocEVudHJ5LAotCQkJCQkgIGdyb3VwX2NpcGhlciwKLQkJCQkJICBFQVBPTF9QQUlSX01TR18yLAotCQkJCQkgIDAsCQkJCS8vIERlZmF1bHRLZXlJZHgKLQkJCQkJICBwRW50cnktPlNOb25jZSwKLQkJCQkJICBOVUxMLAkJCQkvLyBUeFJzYwotCQkJCQkgIE5VTEwsCQkJCS8vIEdUSwotCQkJCQkgIChVQ0hBUiAqKXJzbmllX3B0ciwKLQkJCQkJICByc25pZV9sZW4sCi0JCQkJCSAgJkVBUE9MUEtUKTsKLQotCS8vIE1ha2Ugb3V0Z29pbmcgZnJhbWUKLQlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEVudHJ5LT5BZGRyLCBwQ3VycmVudEFkZHIsIEVBUE9MKTsKLQotCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgcEVudHJ5LAotCQkJCQkgIEhlYWRlcjgwMl8zLCBzaXplb2YoSGVhZGVyODAyXzMpLCAoUFVDSEFSKSZFQVBPTFBLVCwKLQkJCQkJICBDT05WX0FSUkFSWV9UT19VSU5UMTYoRUFQT0xQS1QuQm9keV9MZW4pICsgNCwgVFJVRSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IFBlZXJQYWlyTXNnMUFjdGlvbjogc2VuZCBNc2cyIG9mIDQtd2F5IFxuIikpOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgV2hlbiByZWNlaXZpbmcgdGhlIHNlY29uZCBwYWNrZXQgb2YgNC13YXkgcGFpcndpc2VrZXkgaGFuZHNoYWtlLgotICAgIFJldHVybjoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUGVlclBhaXJNc2cyQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKQotewotCVVDSEFSCQkJCVBUS1s4MF07Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBDYW5jZWxsZWQ7Ci0gICAgUEhFQURFUl84MDJfMTEgICAgICBwSGVhZGVyOwotCUVBUE9MX1BBQ0tFVCAgICAgICAgRUFQT0xQS1Q7Ci0JUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnMjsKLQlVSU5UCQkJTXNnTGVuOwotICAgIFVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKLQlVQ0hBUgkJCQlUeFRzY1s2XTsKLQlQVUlOVDgJCQkJcEJzc2lkID0gTlVMTDsKLQlQVUlOVDgJCQkJcG1rX3B0ciA9IE5VTEw7Ci0JUFVJTlQ4CQkJCWd0a19wdHIgPSBOVUxMOwotCVVDSEFSCQkJCWRlZmF1bHRfa2V5ID0gMDsKLQlVQ0hBUgkJCQlncm91cF9jaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0JUFVJTlQ4CQkJCXJzbmllX3B0ciA9IE5VTEw7Ci0JVUNIQVIJCQkJcnNuaWVfbGVuID0gMDsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlclBhaXJNc2cyQWN0aW9uIFxuIikpOwotCi0gICAgaWYgKCghcEVudHJ5KSB8fCAoIXBFbnRyeS0+VmFsaWRBc0NMSSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChFbGVtLT5Nc2dMZW4gPCAoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0ggKyBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSAtIDIpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBjaGVjayBFbnRyeSBpbiB2YWxpZCBTdGF0ZQotICAgIGlmIChwRW50cnktPldwYVN0YXRlIDwgQVNfUFRLU1RBUlQpCi0gICAgICAgIHJldHVybjsKLQotCi0KLSAgICAvLyBwb2ludGVyIHRvIDgwMi4xMSBoZWFkZXIKLQlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKUVsZW0tPk1zZzsKLQotCS8vIHNraXAgODAyLjExX2hlYWRlcigyNC1ieXRlKSBhbmQgTExDX2hlYWRlcig4KQotCXBNc2cyID0gKFBFQVBPTF9QQUNLRVQpJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOwotCU1zZ0xlbiA9IEVsZW0tPk1zZ0xlbiAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfODAyXzFfSDsKLQotCS8vIFN0b3JlIFNOb25jZQotCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+U05vbmNlLCBwTXNnMi0+S2V5RGVzYy5LZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKTsKLQotCXsKLQkJLy8gRGVyaXZlIFBUSwotCQlXcGFEZXJpdmVQVEsocEFkLAotCQkJCQkoVUNIQVIgKilwbWtfcHRyLAotCQkJCQlwRW50cnktPkFOb25jZSwJCQkvLyBBTk9OQ0UKLQkJCQkJKFVDSEFSICopcEJzc2lkLAotCQkJCQlwRW50cnktPlNOb25jZSwJCQkvLyBTTk9OQ0UKLQkJCQkJcEVudHJ5LT5BZGRyLAotCQkJCQlQVEssCi0JCQkJCUxFTl9QVEspOwotCi0JTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QVEssIFBUSywgTEVOX1BUSyk7Ci0JfQotCi0JLy8gU2FuaXR5IENoZWNrIHBlZXIgUGFpcndpc2UgbWVzc2FnZSAyIC0gUmVwbGF5IENvdW50ZXIsIE1JQywgUlNOSUUKLQlpZiAoUGVlcldwYU1lc3NhZ2VTYW5pdHkocEFkLCBwTXNnMiwgTXNnTGVuLCBFQVBPTF9QQUlSX01TR18yLCBwRW50cnkpID09IEZBTFNFKQotCQlyZXR1cm47Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgLy8gZGVsZXRlIHJldHJ5IHRpbWVyCi0JCVJUTVBDYW5jZWxUaW1lcigmcEVudHJ5LT5SZXRyeVRpbWVyLCAmQ2FuY2VsbGVkKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUKLSAgICAgICAgcEVudHJ5LT5XcGFTdGF0ZSA9IEFTX1BUS0lOSVRfTkVHT1RJQVRJTkc7Ci0KLQkJLy8gSW5jcmVtZW50IHJlcGxheSBjb3VudGVyIGJ5IDEKLQkJQUREX09ORV9Ub182NEJJVF9WQVIocEVudHJ5LT5SX0NvdW50ZXIpOwotCi0JCS8vIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gUGFpcndpc2UgTXNnIDMKLQkJTmRpc1plcm9NZW1vcnkoJkVBUE9MUEtULCBzaXplb2YoRUFQT0xfUEFDS0VUKSk7Ci0JCUNvbnN0cnVjdEVhcG9sTXNnKHBFbnRyeSwKLQkJCQkJCSAgZ3JvdXBfY2lwaGVyLAotCQkJCQkJICBFQVBPTF9QQUlSX01TR18zLAotCQkJCQkJICBkZWZhdWx0X2tleSwKLQkJCQkJCSAgcEVudHJ5LT5BTm9uY2UsCi0JCQkJCQkgIFR4VHNjLAotCQkJCQkJICAoVUNIQVIgKilndGtfcHRyLAotCQkJCQkJICAoVUNIQVIgKilyc25pZV9wdHIsCi0JCQkJCQkgIHJzbmllX2xlbiwKLQkJCQkJCSAgJkVBUE9MUEtUKTsKLQotICAgICAgICAvLyBNYWtlIG91dGdvaW5nIGZyYW1lCi0gICAgICAgIE1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwRW50cnktPkFkZHIsIHBCc3NpZCwgRUFQT0wpOwotICAgICAgICBSVE1QVG9XaXJlbGVzc1N0YShwQWQsIHBFbnRyeSwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywKLQkJCQkJCSAgKFBVQ0hBUikmRUFQT0xQS1QsCi0JCQkJCQkgIENPTlZfQVJSQVJZX1RPX1VJTlQxNihFQVBPTFBLVC5Cb2R5X0xlbikgKyA0LAotCQkJCQkJICAocEVudHJ5LT5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkgPyBGQUxTRSA6IFRSVUUpOwotCi0gICAgICAgIHBFbnRyeS0+UmVUcnlDb3VudGVyID0gUEVFUl9NU0czX1JFVFJZX1RJTUVSX0NUUjsKLQkJUlRNUFNldFRpbWVyKCZwRW50cnktPlJldHJ5VGltZXIsIFBFRVJfTVNHM19SRVRSWV9FWEVDX0lOVFYpOwotCi0JCS8vIFVwZGF0ZSBTdGF0ZQotICAgICAgICBwRW50cnktPldwYVN0YXRlID0gQVNfUFRLSU5JVF9ORUdPVElBVElORzsKLSAgICB9d2hpbGUoRkFMU0UpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBQZWVyUGFpck1zZzJBY3Rpb246IHNlbmQgTXNnMyBvZiA0LXdheSBcbiIpKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVByb2Nlc3MgUGFpcndpc2Uga2V5IE1zZyAzIG9mIDQtd2F5IGhhbmRzaGFraW5nIGFuZCBzZW5kIE1zZyA0Ci0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0JCUVsZW0JCU1lc3NhZ2UgYm9keQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBQZWVyUGFpck1zZzNBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0gICAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pCi17Ci0JUEhFQURFUl84MDJfMTEJCXBIZWFkZXI7Ci0JVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07Ci0JRUFQT0xfUEFDS0VUCQlFQVBPTFBLVDsKLQlQRUFQT0xfUEFDS0VUCQlwTXNnMzsKLQlVSU5UCQkJTXNnTGVuOwotCVBVSU5UOAkJCQlwQ3VycmVudEFkZHIgPSBOVUxMOwotCVVDSEFSCQkJCWdyb3VwX2NpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlclBhaXJNc2czQWN0aW9uIFxuIikpOwotCi0JaWYgKCghcEVudHJ5KSB8fCAoKCFwRW50cnktPlZhbGlkQXNDTEkpICYmICghcEVudHJ5LT5WYWxpZEFzQXBDbGkpKSkKLQkJcmV0dXJuOwotCi0gICAgaWYgKEVsZW0tPk1zZ0xlbiA8IChMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyBMRU5HVEhfRUFQT0xfSCArIHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFIC0gMikpCi0JCXJldHVybjsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlwQ3VycmVudEFkZHIgPSBwQWQtPkN1cnJlbnRBZGRyZXNzOwotCQlncm91cF9jaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKLQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vIFJlY29yZCA4MDIuMTEgaGVhZGVyICYgdGhlIHJlY2VpdmVkIEVBUE9MIHBhY2tldCBNc2czCi0JcEhlYWRlcgk9IChQSEVBREVSXzgwMl8xMSkgRWxlbS0+TXNnOwotCXBNc2czID0gKFBFQVBPTF9QQUNLRVQpICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKLQlNc2dMZW4gPSBFbGVtLT5Nc2dMZW4gLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIXzgwMl8xX0g7Ci0KLQkvLyBTYW5pdHkgQ2hlY2sgcGVlciBQYWlyd2lzZSBtZXNzYWdlIDMgLSBSZXBsYXkgQ291bnRlciwgTUlDLCBSU05JRQotCWlmIChQZWVyV3BhTWVzc2FnZVNhbml0eShwQWQsIHBNc2czLCBNc2dMZW4sIEVBUE9MX1BBSVJfTVNHXzMsIHBFbnRyeSkgPT0gRkFMU0UpCi0JCXJldHVybjsKLQotCS8vIFNhdmUgUmVwbGF5IGNvdW50ZXIsIGl0IHdpbGwgdXNlIGNvbnN0cnVjdCBtZXNzYWdlIDQKLQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlJfQ291bnRlciwgcE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0KLQkvLyBEb3VibGUgY2hlY2sgQU5vbmNlCi0JaWYgKCFOZGlzRXF1YWxNZW1vcnkocEVudHJ5LT5BTm9uY2UsIHBNc2czLT5LZXlEZXNjLktleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpKQotCXsKLQkJcmV0dXJuOwotCX0KLQotCS8vIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gUGFpcndpc2UgTXNnIDQKLQlOZGlzWmVyb01lbW9yeSgmRUFQT0xQS1QsIHNpemVvZihFQVBPTF9QQUNLRVQpKTsKLQlDb25zdHJ1Y3RFYXBvbE1zZyhwRW50cnksCi0JCQkJCSAgZ3JvdXBfY2lwaGVyLAotCQkJCQkgIEVBUE9MX1BBSVJfTVNHXzQsCi0JCQkJCSAgMCwJCQkJCS8vIGdyb3VwIGtleSBpbmRleCBub3QgdXNlZCBpbiBtZXNzYWdlIDQKLQkJCQkJICBOVUxMLAkJCQkJLy8gTm9uY2Ugbm90IHVzZWQgaW4gbWVzc2FnZSA0Ci0JCQkJCSAgTlVMTCwJCQkJCS8vIFR4UlNDIG5vdCB1c2VkIGluIG1lc3NhZ2UgNAotCQkJCQkgIE5VTEwsCQkJCQkvLyBHVEsgbm90IHVzZWQgaW4gbWVzc2FnZSA0Ci0JCQkJCSAgTlVMTCwJCQkJCS8vIFJTTiBJRSBub3QgdXNlZCBpbiBtZXNzYWdlIDQKLQkJCQkJICAwLAotCQkJCQkgICZFQVBPTFBLVCk7Ci0KLQkvLyBVcGRhdGUgV3BhU3RhdGUKLQlwRW50cnktPldwYVN0YXRlID0gQVNfUFRLSU5JVERPTkU7Ci0KLQkvLyBVcGRhdGUgcGFpcndpc2Uga2V5Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCVBDSVBIRVJfS0VZIHBTaGFyZWRLZXk7Ci0KLQkJcFNoYXJlZEtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVswXTsKLQotCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QVEssIHBFbnRyeS0+UFRLLCBMRU5fUFRLKTsKLQotCQkvLyBQcmVwYXJlIHBhaXItd2lzZSBrZXkgaW5mb3JtYXRpb24gaW50byBzaGFyZWQga2V5IHRhYmxlCi0JCU5kaXNaZXJvTWVtb3J5KHBTaGFyZWRLZXksIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0JCXBTaGFyZWRLZXktPktleUxlbiA9IExFTl9US0lQX0VLOwotCSAgICBOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKLQkJTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+VHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKLQotCQkvLyBEZWNpZGUgaXRzIENoaXBlckFsZwotCQlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotCQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7Ci0JCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0JCWVsc2UKLQkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotCi0JCS8vIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIE1BQ19UQUJMRV9FTlRSWQotCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKLQkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLCBMRU5fVEtJUF9SWE1JQ0spOwotCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4K0xFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7Ci0JCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcFNoYXJlZEtleS0+Q2lwaGVyQWxnOwotCi0JCS8vIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCi0JCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCi0JCQkJCQkJICBCU1MwLAotCQkJCQkJCSAgMCwKLQkJCQkJCQkgIHBTaGFyZWRLZXktPkNpcGhlckFsZywKLQkJCQkJCQkgIHBTaGFyZWRLZXktPktleSwKLQkJCQkJCQkgIHBTaGFyZWRLZXktPlR4TWljLAotCQkJCQkJCSAgcFNoYXJlZEtleS0+UnhNaWMpOwotCi0JCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQotCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLQkJCQkJCQkJICBCU1MwLAotCQkJCQkJCQkgIDAsCi0JCQkJCQkJCSAgcFNoYXJlZEtleS0+Q2lwaGVyQWxnLAotCQkJCQkJCQkgIHBFbnRyeSk7Ci0KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkvLyBvcGVuIDgwMi4xeCBwb3J0IGNvbnRyb2wgYW5kIHByaXZhY3kgZmlsdGVyCi0JaWYgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSyB8fAotCQlwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCi0JewotCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0JCXBFbnRyeS0+UHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKLQkgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKLQkgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlclBhaXJNc2czQWN0aW9uOiBBdXRoTW9kZSglcykgUGFpcndpc2VDaXBoZXIoJXMpIEdyb3VwQ2lwaGVyKCVzKSBcbiIsCi0JCQkJCQkJCQlHZXRBdXRoTW9kZShwRW50cnktPkF1dGhNb2RlKSwKLQkJCQkJCQkJCUdldEVuY3J5cHRUeXBlKHBFbnRyeS0+V2VwU3RhdHVzKSwKLQkJCQkJCQkJCUdldEVuY3J5cHRUeXBlKGdyb3VwX2NpcGhlcikpKTsKLQl9Ci0JZWxzZQotCXsKLQl9Ci0KLQkvLyBJbml0IDgwMi4zIGhlYWRlciBhbmQgc2VuZCBvdXQKLQlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEVudHJ5LT5BZGRyLCBwQ3VycmVudEFkZHIsIEVBUE9MKTsKLQlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIHBFbnRyeSwKLQkJCQkJICBIZWFkZXI4MDJfMywgc2l6ZW9mKEhlYWRlcjgwMl8zKSwKLQkJCQkJICAoUFVDSEFSKSZFQVBPTFBLVCwKLQkJCQkJICBDT05WX0FSUkFSWV9UT19VSU5UMTYoRUFQT0xQS1QuQm9keV9MZW4pICsgNCwgVFJVRSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IFBlZXJQYWlyTXNnM0FjdGlvbjogc2VuZCBNc2c0IG9mIDQtd2F5IFxuIikpOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFdoZW4gcmVjZWl2aW5nIHRoZSBsYXN0IHBhY2tldCBvZiA0LXdheSBwYWlyd2lzZWtleSBoYW5kc2hha2UuCi0gICAgICAgIEluaXRpbGl6ZSAyLXdheSBncm91cGtleSBoYW5kc2hha2UgZm9sbG93aW5nLgotICAgIFJldHVybjoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUGVlclBhaXJNc2c0QWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKQotewotCVBFQVBPTF9QQUNLRVQJCXBNc2c0OwotICAgIFBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKLSAgICBVSU5UCQlNc2dMZW47Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBDYW5jZWxsZWQ7Ci0JVUNIQVIJCQkJZ3JvdXBfY2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBQZWVyUGFpck1zZzRBY3Rpb25cbiIpKTsKLQotICAgIGRvCi0gICAgewotICAgICAgICBpZiAoKCFwRW50cnkpIHx8ICghcEVudHJ5LT5WYWxpZEFzQ0xJKSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmIChFbGVtLT5Nc2dMZW4gPCAoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0ggKyBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSAtIDIgKSApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAocEVudHJ5LT5XcGFTdGF0ZSA8IEFTX1BUS0lOSVRfTkVHT1RJQVRJTkcpCi0gICAgICAgICAgICBicmVhazsKLQotCi0gICAgICAgIC8vIHBvaW50ZXIgdG8gODAyLjExIGhlYWRlcgotICAgICAgICBwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKUVsZW0tPk1zZzsKLQotCQkvLyBza2lwIDgwMi4xMV9oZWFkZXIoMjQtYnl0ZSkgYW5kIExMQ19oZWFkZXIoOCkKLQkJcE1zZzQgPSAoUEVBUE9MX1BBQ0tFVCkmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07Ci0JCU1zZ0xlbiA9IEVsZW0tPk1zZ0xlbiAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfODAyXzFfSDsKLQotICAgICAgICAvLyBTYW5pdHkgQ2hlY2sgcGVlciBQYWlyd2lzZSBtZXNzYWdlIDQgLSBSZXBsYXkgQ291bnRlciwgTUlDCi0JCWlmIChQZWVyV3BhTWVzc2FnZVNhbml0eShwQWQsIHBNc2c0LCBNc2dMZW4sIEVBUE9MX1BBSVJfTVNHXzQsIHBFbnRyeSkgPT0gRkFMU0UpCi0JCQlicmVhazsKLQotICAgICAgICAvLyAzLiB1c2VzIHRoZSBNTE1FLlNFVEtFWVMucmVxdWVzdCB0byBjb25maWd1cmUgUFRLIGludG8gTUFDCi0gICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotCi0JCS8vIHJlc2V0IElWRUlWIGluIEFzaWMKLQkJQXNpY1VwZGF0ZVdDSURJVkVJVihwQWQsIHBFbnRyeS0+QWlkLCAxLCAwKTsKLQotICAgICAgICBwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9IExFTl9US0lQX0VLOwotICAgICAgICBOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBFbnRyeS0+UFRLWzMyXSwgTEVOX1RLSVBfRUspOwotICAgICAgICBOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLCAmcEVudHJ5LT5QVEtbVEtJUF9BUF9SWE1JQ0tfT0ZGU0VUXSwgTEVOX1RLSVBfUlhNSUNLKTsKLSAgICAgICAgTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5UeE1pYywgJnBFbnRyeS0+UFRLW1RLSVBfQVBfVFhNSUNLX09GRlNFVF0sIExFTl9US0lQX1RYTUlDSyk7Ci0KLQkJLy8gU2V0IHBhaXJ3aXNlIGtleSB0byBBc2ljCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0gICAgICAgICAgICBpZiAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLSAgICAgICAgICAgICAgICBwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9US0lQOwotICAgICAgICAgICAgZWxzZSBpZiAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLSAgICAgICAgICAgICAgICBwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0KLQkJCS8vIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMKLSAgICAgICAgICAgIEFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KAotICAgICAgICAgICAgICAgIHBBZCwKLSAgICAgICAgICAgICAgICBwRW50cnktPkFkZHIsCi0gICAgICAgICAgICAgICAgKFVDSEFSKXBFbnRyeS0+QWlkLAotICAgICAgICAgICAgICAgICZwRW50cnktPlBhaXJ3aXNlS2V5KTsKLQotCQkJLy8gdXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBlbnRyeQotCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKLQkJCQlwQWQsCi0JCQkJcEVudHJ5LT5hcGlkeCwKLQkJCQkwLAotCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnLAotCQkJCXBFbnRyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyA0LiB1cGdyYWRlIHN0YXRlCi0gICAgICAgIHBFbnRyeS0+UHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsOwotICAgICAgICBwRW50cnktPldwYVN0YXRlID0gQVNfUFRLSU5JVERPTkU7Ci0JCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQotCi0JCWlmIChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwKLQkJCXBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKLQkJewotCQkJcEVudHJ5LT5HVEtTdGF0ZSA9IFJFS0VZX0VTVEFCTElTSEVEOwotCQkJUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPlJldHJ5VGltZXIsICZDYW5jZWxsZWQpOwotCi0KLQkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3Igc2V0IGtleSBkb25lIFdQQTIKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHLCBwRW50cnktPkFkZHIsIHBFbnRyeS0+YXBpZHgsIDApOwotCi0JICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiQVAgU0VUS0VZUyBET05FIC0gV1BBMiwgQXV0aE1vZGUoJWQpPSVzLCBXZXBTdGF0dXMoJWQpPSVzLCBHcm91cFdlcFN0YXR1cyglZCk9JXNcblxuIiwKLQkJCQkJCQkJCXBFbnRyeS0+QXV0aE1vZGUsIEdldEF1dGhNb2RlKHBFbnRyeS0+QXV0aE1vZGUpLAotCQkJCQkJCQkJcEVudHJ5LT5XZXBTdGF0dXMsIEdldEVuY3J5cHRUeXBlKHBFbnRyeS0+V2VwU3RhdHVzKSwKLQkJCQkJCQkJCWdyb3VwX2NpcGhlciwKLQkJCQkJCQkJCUdldEVuY3J5cHRUeXBlKGdyb3VwX2NpcGhlcikpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJLy8gNS4gaW5pdCBHcm91cCAyLXdheSBoYW5kc2hha2UgaWYgbmVjZXNzYXJ5LgotCSAgICAgICAgV1BBU3RhcnQyV2F5R3JvdXBIUyhwQWQsIHBFbnRyeSk7Ci0KLQkJcEVudHJ5LT5SZVRyeUNvdW50ZXIgPSBHUk9VUF9NU0cxX1JFVFJZX1RJTUVSX0NUUjsKLQkJCVJUTVBNb2RUaW1lcigmcEVudHJ5LT5SZXRyeVRpbWVyLCBQRUVSX01TRzNfUkVUUllfRVhFQ19JTlRWKTsKLQkJfQotICAgIH13aGlsZShGQUxTRSk7Ci0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBUaGlzIGlzIGEgZnVuY3Rpb24gdG8gc2VuZCB0aGUgZmlyc3QgcGFja2V0IG9mIDItd2F5IGdyb3Vwa2V5IGhhbmRzaGFrZQotICAgIFJldHVybjoKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBXUEFTdGFydDJXYXlHcm91cEhTKAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSkKLXsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKLQlVQ0hBUgkJCQlUeFRzY1s2XTsKLSAgICBFQVBPTF9QQUNLRVQJRUFQT0xQS1Q7Ci0JVUNIQVIJCQkJZ3JvdXBfY2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCVVDSEFSCQkJCWRlZmF1bHRfa2V5ID0gMDsKLQlQVUlOVDgJCQkJZ25vbmNlX3B0ciA9IE5VTEw7Ci0JUFVJTlQ4CQkJCWd0a19wdHIgPSBOVUxMOwotCVBVSU5UOAkJCQlwQnNzaWQgPSBOVUxMOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBXUEFTdGFydDJXYXlHcm91cEhTXG4iKSk7Ci0KLSAgICBpZiAoKCFwRW50cnkpIHx8ICghcEVudHJ5LT5WYWxpZEFzQ0xJKSkKLSAgICAgICAgcmV0dXJuOwotCi0KLSAgICBkbwotICAgIHsKLSAgICAgICAgLy8gSW5jcmVtZW50IHJlcGxheSBjb3VudGVyIGJ5IDEKLQkJQUREX09ORV9Ub182NEJJVF9WQVIocEVudHJ5LT5SX0NvdW50ZXIpOwotCi0JCS8vIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gR3JvdXAgTXNnIDEKLQkJTmRpc1plcm9NZW1vcnkoJkVBUE9MUEtULCBzaXplb2YoRUFQT0xfUEFDS0VUKSk7Ci0JCUNvbnN0cnVjdEVhcG9sTXNnKHBFbnRyeSwKLQkJCQkJCSAgZ3JvdXBfY2lwaGVyLAotCQkJCQkJICBFQVBPTF9HUk9VUF9NU0dfMSwKLQkJCQkJCSAgZGVmYXVsdF9rZXksCi0JCQkJCQkgIChVQ0hBUiAqKWdub25jZV9wdHIsCi0JCQkJCQkgIFR4VHNjLAotCQkJCQkJICAoVUNIQVIgKilndGtfcHRyLAotCQkJCQkJICBOVUxMLAotCQkJCQkJICAwLAotCQkJCQkJICAmRUFQT0xQS1QpOwotCi0JCS8vIE1ha2Ugb3V0Z29pbmcgZnJhbWUKLSAgICAgICAgTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBFbnRyeS0+QWRkciwgcEJzc2lkLCBFQVBPTCk7Ci0gICAgICAgIFJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgcEVudHJ5LAotCQkJCQkJICBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLAotCQkJCQkJICAoUFVDSEFSKSZFQVBPTFBLVCwKLQkJCQkJCSAgQ09OVl9BUlJBUllfVE9fVUlOVDE2KEVBUE9MUEtULkJvZHlfTGVuKSArIDQsIEZBTFNFKTsKLQotCi0KLSAgICB9d2hpbGUgKEZBTFNFKTsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gV1BBU3RhcnQyV2F5R3JvdXBIUyA6IHNlbmQgb3V0IEdyb3VwIE1lc3NhZ2UgMSBcbiIpKTsKLQotICAgIHJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVByb2Nlc3MgR3JvdXAga2V5IDItd2F5IGhhbmRzaGFraW5nCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0JCUVsZW0JCU1lc3NhZ2UgYm9keQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlQZWVyR3JvdXBNc2cxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKQotewotICAgIFVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOwotCUVBUE9MX1BBQ0tFVAkJRUFQT0xQS1Q7Ci0JUEVBUE9MX1BBQ0tFVAkJcEdyb3VwOwotCVVJTlQJCQlNc2dMZW47Ci0JQk9PTEVBTiAgICAgICAgICAgICBDYW5jZWxsZWQ7Ci0JVUNIQVIJCQkJZGVmYXVsdF9rZXkgPSAwOwotCVVDSEFSCQkJCWdyb3VwX2NpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQlQVUlOVDgJCQkJcEN1cnJlbnRBZGRyID0gTlVMTDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlckdyb3VwTXNnMUFjdGlvbiBcbiIpKTsKLQotCWlmICgoIXBFbnRyeSkgfHwgKCghcEVudHJ5LT5WYWxpZEFzQ0xJKSAmJiAoIXBFbnRyeS0+VmFsaWRBc0FwQ2xpKSkpCi0gICAgICAgIHJldHVybjsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlwQ3VycmVudEFkZHIgPSBwQWQtPkN1cnJlbnRBZGRyZXNzOwotCQlncm91cF9jaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKLQkJZGVmYXVsdF9rZXkgPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JLy8gUHJvY2VzcyBHcm91cCBNZXNzYWdlIDEgZnJhbWUuIHNraXAgODAyLjExIGhlYWRlcigyNCkgJiBMTENfU05BUCBoZWFkZXIoOCkKLQlwR3JvdXAgPSAoUEVBUE9MX1BBQ0tFVCkgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOwotCU1zZ0xlbiA9IEVsZW0tPk1zZ0xlbiAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfODAyXzFfSDsKLQotCS8vIFNhbml0eSBDaGVjayBwZWVyIGdyb3VwIG1lc3NhZ2UgMSAtIFJlcGxheSBDb3VudGVyLCBNSUMsIFJTTklFCi0JaWYgKFBlZXJXcGFNZXNzYWdlU2FuaXR5KHBBZCwgcEdyb3VwLCBNc2dMZW4sIEVBUE9MX0dST1VQX01TR18xLCBwRW50cnkpID09IEZBTFNFKQotCQlyZXR1cm47Ci0KLQkvLyBkZWxldGUgcmV0cnkgdGltZXIKLQlSVE1QQ2FuY2VsVGltZXIoJnBFbnRyeS0+UmV0cnlUaW1lciwgJkNhbmNlbGxlZCk7Ci0KLQkvLyBTYXZlIFJlcGxheSBjb3VudGVyLCBpdCB3aWxsIHVzZSB0byBjb25zdHJ1Y3QgbWVzc2FnZSAyCi0JTmRpc01vdmVNZW1vcnkocEVudHJ5LT5SX0NvdW50ZXIsIHBHcm91cC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLQotCS8vIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gR3JvdXAgTXNnIDIKLQlOZGlzWmVyb01lbW9yeSgmRUFQT0xQS1QsIHNpemVvZihFQVBPTF9QQUNLRVQpKTsKLQlDb25zdHJ1Y3RFYXBvbE1zZyhwRW50cnksCi0JCQkJCSAgZ3JvdXBfY2lwaGVyLAotCQkJCQkgIEVBUE9MX0dST1VQX01TR18yLAotCQkJCQkgIGRlZmF1bHRfa2V5LAotCQkJCQkgIE5VTEwsCQkJCQkvLyBOb25jZSBub3QgdXNlZAotCQkJCQkgIE5VTEwsCQkJCQkvLyBUeFJTQyBub3QgdXNlZAotCQkJCQkgIE5VTEwsCQkJCQkvLyBHVEsgbm90IHVzZWQKLQkJCQkJICBOVUxMLAkJCQkJLy8gUlNOIElFIG5vdCB1c2VkCi0JCQkJCSAgMCwKLQkJCQkJICAmRUFQT0xQS1QpOwotCi0gICAgLy8gb3BlbiA4MDIuMXggcG9ydCBjb250cm9sIGFuZCBwcml2YWN5IGZpbHRlcgotCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQlwRW50cnktPlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKLSAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQotICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyR3JvdXBNc2cxQWN0aW9uOiBBdXRoTW9kZSglcykgUGFpcndpc2VDaXBoZXIoJXMpIEdyb3VwQ2lwaGVyKCVzKSBcbiIsCi0JCQkJCQkJCQlHZXRBdXRoTW9kZShwRW50cnktPkF1dGhNb2RlKSwKLQkJCQkJCQkJCUdldEVuY3J5cHRUeXBlKHBFbnRyeS0+V2VwU3RhdHVzKSwKLQkJCQkJCQkJCUdldEVuY3J5cHRUeXBlKGdyb3VwX2NpcGhlcikpKTsKLQotCS8vIGluaXQgaGVhZGVyIGFuZCBGaWxsIFBhY2tldCBhbmQgc2VuZCBNc2cgMiB0byBhdXRoZW50aWNhdG9yCi0JTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBFbnRyeS0+QWRkciwgcEN1cnJlbnRBZGRyLCBFQVBPTCk7Ci0JUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBwRW50cnksCi0JCQkJCSAgSGVhZGVyODAyXzMsIHNpemVvZihIZWFkZXI4MDJfMyksCi0JCQkJCSAgKFBVQ0hBUikmRUFQT0xQS1QsCi0JCQkJCSAgQ09OVl9BUlJBUllfVE9fVUlOVDE2KEVBUE9MUEtULkJvZHlfTGVuKSArIDQsIEZBTFNFKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gUGVlckdyb3VwTXNnMUFjdGlvbjogc25lZCBncm91cCBtZXNzYWdlIDJcbiIpKTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBXaGVuIHJlY2VpdmluZyB0aGUgbGFzdCBwYWNrZXQgb2YgMi13YXkgZ3JvdXBrZXkgaGFuZHNoYWtlLgotICAgIFJldHVybjoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUGVlckdyb3VwTXNnMkFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCi0gICAgSU4gVk9JRCAgICAgICAgICAgICAqTXNnLAotICAgIElOIFVJTlQgICAgICAgICAgICAgTXNnTGVuKQotewotICAgIFVJTlQJCUxlbjsKLSAgICBQVUNIQVIJCXBEYXRhOwotICAgIEJPT0xFQU4JCUNhbmNlbGxlZDsKLQlQRUFQT0xfUEFDS0VUICAgICAgIHBNc2cyOwotCVVDSEFSCQkJCWdyb3VwX2NpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlckdyb3VwTXNnMkFjdGlvbiBcbiIpKTsKLQotICAgIGRvCi0gICAgewotICAgICAgICBpZiAoKCFwRW50cnkpIHx8ICghcEVudHJ5LT5WYWxpZEFzQ0xJKSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmIChNc2dMZW4gPCAoTEVOR1RIXzgwMl8xX0ggKyBMRU5HVEhfRUFQT0xfSCArIHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFIC0gMikpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAocEVudHJ5LT5XcGFTdGF0ZSAhPSBBU19QVEtJTklURE9ORSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgcERhdGEgPSAoUFVDSEFSKU1zZzsKLQkJcE1zZzIgPSAoUEVBUE9MX1BBQ0tFVCkgKHBEYXRhICsgTEVOR1RIXzgwMl8xX0gpOwotICAgICAgICBMZW4gPSBNc2dMZW4gLSBMRU5HVEhfODAyXzFfSDsKLQotCQkvLyBTYW5pdHkgQ2hlY2sgcGVlciBncm91cCBtZXNzYWdlIDIgLSBSZXBsYXkgQ291bnRlciwgTUlDCi0JCWlmIChQZWVyV3BhTWVzc2FnZVNhbml0eShwQWQsIHBNc2cyLCBMZW4sIEVBUE9MX0dST1VQX01TR18yLCBwRW50cnkpID09IEZBTFNFKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLy8gMy4gIHVwZ3JhZGUgc3RhdGUKLQotCQlSVE1QQ2FuY2VsVGltZXIoJnBFbnRyeS0+UmV0cnlUaW1lciwgJkNhbmNlbGxlZCk7Ci0gICAgICAgIHBFbnRyeS0+R1RLU3RhdGUgPSBSRUtFWV9FU1RBQkxJU0hFRDsKLQotCQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0JCXsKLQkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3Igc2V0IGtleSBkb25lIFdQQTIKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHLCBwRW50cnktPkFkZHIsIHBFbnRyeS0+YXBpZHgsIDApOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiQVAgU0VUS0VZUyBET05FIC0gV1BBMiwgQXV0aE1vZGUoJWQpPSVzLCBXZXBTdGF0dXMoJWQpPSVzLCBHcm91cFdlcFN0YXR1cyglZCk9JXNcblxuIiwKLQkJCQkJCQkJCQlwRW50cnktPkF1dGhNb2RlLCBHZXRBdXRoTW9kZShwRW50cnktPkF1dGhNb2RlKSwKLQkJCQkJCQkJCQlwRW50cnktPldlcFN0YXR1cywgR2V0RW5jcnlwdFR5cGUocEVudHJ5LT5XZXBTdGF0dXMpLAotCQkJCQkJCQkJCWdyb3VwX2NpcGhlciwgR2V0RW5jcnlwdFR5cGUoZ3JvdXBfY2lwaGVyKSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBzZXQga2V5IGRvbmUgV1BBCi0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU0VUX0tFWV9ET05FX1dQQTFfRVZFTlRfRkxBRywgcEVudHJ5LT5BZGRyLCBwRW50cnktPmFwaWR4LCAwKTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiQVAgU0VUS0VZUyBET05FIC0gV1BBMSwgQXV0aE1vZGUoJWQpPSVzLCBXZXBTdGF0dXMoJWQpPSVzLCBHcm91cFdlcFN0YXR1cyglZCk9JXNcblxuIiwKLQkJCQkJCQkJCQlwRW50cnktPkF1dGhNb2RlLCBHZXRBdXRoTW9kZShwRW50cnktPkF1dGhNb2RlKSwKLQkJCQkJCQkJCQlwRW50cnktPldlcFN0YXR1cywgR2V0RW5jcnlwdFR5cGUocEVudHJ5LT5XZXBTdGF0dXMpLAotCQkJCQkJCQkJCWdyb3VwX2NpcGhlciwgR2V0RW5jcnlwdFR5cGUoZ3JvdXBfY2lwaGVyKSkpOwotCQl9Ci0gICAgfXdoaWxlKEZBTFNFKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNsYXNzaWZ5IFdQQSBFQVAgbWVzc2FnZSB0eXBlCi0KLQlBcmd1bWVudHM6Ci0JCUVBUFR5cGUJCVZhbHVlIG9mIEVBUCBtZXNzYWdlIHR5cGUKLQkJTXNnVHlwZQkJSW50ZXJuYWwgTWVzc2FnZSBkZWZpbml0aW9uIGZvciBNTE1FIHN0YXRlIG1hY2hpbmUKLQotCVJldHVybiBWYWx1ZToKLQkJVFJVRQkJRm91bmQgYXBwcm9wcmlhdGUgbWVzc2FnZSB0eXBlCi0JCUZBTFNFCQlObyBhcHByb3ByaWF0ZSBtZXNzYWdlIHR5cGUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQkJQWxsIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiB3cGEuaAotCQlGb3Igc3VwcGxpY2FudCwgdGhlcmUgaXMgb25seSBFQVBPTCBLZXkgbWVzc2FnZSBhdmFsaWFibGUKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4JV3BhTXNnVHlwZVN1YnN0KAotCUlOCVVDSEFSCUVBUFR5cGUsCi0JT1VUCUlOVAkJKk1zZ1R5cGUpCi17Ci0Jc3dpdGNoIChFQVBUeXBlKQotCXsKLQkJY2FzZSBFQVBQYWNrZXQ6Ci0JCQkqTXNnVHlwZSA9IE1UMl9FQVBQYWNrZXQ7Ci0JCQlicmVhazsKLQkJY2FzZSBFQVBPTFN0YXJ0OgotCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xTdGFydDsKLQkJCWJyZWFrOwotCQljYXNlIEVBUE9MTG9nb2ZmOgotCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xMb2dvZmY7Ci0JCQlicmVhazsKLQkJY2FzZSBFQVBPTEtleToKLQkJCSpNc2dUeXBlID0gTVQyX0VBUE9MS2V5OwotCQkJYnJlYWs7Ci0JCWNhc2UgRUFQT0xBU0ZBbGVydDoKLQkJCSpNc2dUeXBlID0gTVQyX0VBUE9MQVNGQWxlcnQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBGQUxTRTsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlUaGUgcHNldWRvLXJhbmRvbSBmdW5jdGlvbihQUkYpIHRoYXQgaGFzaGVzIHZhcmlvdXMgaW5wdXRzIHRvCi0JCWRlcml2ZSBhIHBzZXVkby1yYW5kb20gdmFsdWUuIFRvIGFkZCBsaXZlbmVzcyB0byB0aGUgcHNldWRvLXJhbmRvbQotCQl2YWx1ZSwgYSBub25jZSBzaG91bGQgYmUgb25lIG9mIHRoZSBpbnB1dHMuCi0KLQkJSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBQVEssIEdUSyBvciBzb21lIHNwZWNpZmljIHJhbmRvbSB2YWx1ZS4KLQotCUFyZ3VtZW50czoKLQkJVUNIQVIJKmtleSwJCS0JdGhlIGtleSBtYXRlcmlhbCBmb3IgSE1BQ19TSEExIHVzZQotCQlJTlQJCWtleV9sZW4JCS0JdGhlIGxlbmd0aCBvZiBrZXkKLQkJVUNIQVIJKnByZWZpeAkJLQlhIHByZWZpeCBsYWJlbAotCQlJTlQJCXByZWZpeF9sZW4JLQl0aGUgbGVuZ3RoIG9mIHRoZSBsYWJlbAotCQlVQ0hBUgkqZGF0YQkJLQlhIHNwZWNpZmljIGRhdGEgd2l0aCB2YXJpYWJsZSBsZW5ndGgKLQkJSU5UCQlkYXRhX2xlbgktCXRoZSBsZW5ndGggb2YgYSBzcGVjaWZpYyBkYXRhCi0JCUlOVAkJbGVuCQkJLQl0aGUgb3V0cHV0IGxlbmdodAotCi0JUmV0dXJuIFZhbHVlOgotCQlVQ0hBUgkqb3V0cHV0CQktCXRoZSBjYWxjdWxhdGVkIHJlc3VsdAotCi0JTm90ZToKLQkJODAyLjExaS0yMDA0CUFubmV4IEguMwotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlQUkYoCi0JSU4JVUNIQVIJKmtleSwKLQlJTglJTlQJCWtleV9sZW4sCi0JSU4JVUNIQVIJKnByZWZpeCwKLQlJTglJTlQJCXByZWZpeF9sZW4sCi0JSU4JVUNIQVIJKmRhdGEsCi0JSU4JSU5UCQlkYXRhX2xlbiwKLQlPVVQJVUNIQVIJKm91dHB1dCwKLQlJTglJTlQJCWxlbikKLXsKLQlJTlQJCWk7Ci0gICAgVUNIQVIgICAqaW5wdXQ7Ci0JSU5UCQljdXJyZW50aW5kZXggPSAwOwotCUlOVAkJdG90YWxfbGVuOwotCi0JLy8gQWxsb2NhdGUgbWVtb3J5IGZvciBpbnB1dAotCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJmlucHV0LCAxMDI0KTsKLQotICAgIGlmIChpbnB1dCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiISEhUFJGOiBubyBtZW1vcnkhISFcbiIpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotCS8vIEdlbmVyYXRlIGNvbmNhdGVuYXRpb24gaW5wdXQKLQlOZGlzTW92ZU1lbW9yeShpbnB1dCwgcHJlZml4LCBwcmVmaXhfbGVuKTsKLQotCS8vIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMAotCWlucHV0W3ByZWZpeF9sZW5dID0JMDsKLQotCS8vIENvbmNhdGVuYXRlIHNwZWNpZmljIGRhdGEKLQlOZGlzTW92ZU1lbW9yeSgmaW5wdXRbcHJlZml4X2xlbiArIDFdLCBkYXRhLCBkYXRhX2xlbik7Ci0JdG90YWxfbGVuID0JcHJlZml4X2xlbiArIDEgKyBkYXRhX2xlbjsKLQotCS8vIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMAotCS8vIFRoaXMgb2N0ZXQgc2hhbGwgYmUgdXBkYXRlIGxhdGVyCi0JaW5wdXRbdG90YWxfbGVuXSA9IDA7Ci0JdG90YWxfbGVuKys7Ci0KLQkvLyBJdGVyYXRlIHRvIGNhbGN1bGF0ZSB0aGUgcmVzdWx0IGJ5IGhtYWMtc2hhLTEKLQkvLyBUaGVuIGNvbmNhdGVuYXRlIHRvIGxhc3QgcmVzdWx0Ci0JZm9yCShpID0gMDsJaSA8CShsZW4gKyAxOSkgLyAyMDsgaSsrKQotCXsKLQkJSE1BQ19TSEExKGtleSwga2V5X2xlbiwgaW5wdXQsIHRvdGFsX2xlbiwgJm91dHB1dFtjdXJyZW50aW5kZXhdLCBTSEExX0RJR0VTVF9TSVpFKTsKLQkJY3VycmVudGluZGV4ICs9CTIwOwotCi0JCS8vIHVwZGF0ZSB0aGUgbGFzdCBvY3RldAotCQlpbnB1dFt0b3RhbF9sZW4gLSAxXSsrOwotCX0KLSAgICBvc19mcmVlX21lbShOVUxMLCBpbnB1dCk7Ci19Ci0KLS8qCi0qIEYoUCwgUywgYywgaSkgPSBVMSB4b3IgVTIgeG9yIC4uLiBVYwotKiBVMSA9IFBSRihQLCBTIHx8IEludChpKSkKLSogVTIgPSBQUkYoUCwgVTEpCi0qIFVjID0gUFJGKFAsIFVjLTEpCi0qLwotCi1zdGF0aWMgdm9pZCBGKGNoYXIgKnBhc3N3b3JkLCB1bnNpZ25lZCBjaGFyICpzc2lkLCBpbnQgc3NpZGxlbmd0aCwgaW50IGl0ZXJhdGlvbnMsIGludCBjb3VudCwgdW5zaWduZWQgY2hhciAqb3V0cHV0KQotewotICAgIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzM2XSwgZGlnZXN0MVtTSEExX0RJR0VTVF9TSVpFXTsKLSAgICBpbnQgaSwgajsKLQotICAgIC8qIFUxID0gUFJGKFAsIFMgfHwgaW50KGkpKSAqLwotICAgIG1lbWNweShkaWdlc3QsIHNzaWQsIHNzaWRsZW5ndGgpOwotICAgIGRpZ2VzdFtzc2lkbGVuZ3RoXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQ+PjI0KSAmIDB4ZmYpOwotICAgIGRpZ2VzdFtzc2lkbGVuZ3RoKzFdID0gKHVuc2lnbmVkIGNoYXIpKChjb3VudD4+MTYpICYgMHhmZik7Ci0gICAgZGlnZXN0W3NzaWRsZW5ndGgrMl0gPSAodW5zaWduZWQgY2hhcikoKGNvdW50Pj44KSAmIDB4ZmYpOwotICAgIGRpZ2VzdFtzc2lkbGVuZ3RoKzNdID0gKHVuc2lnbmVkIGNoYXIpKGNvdW50ICYgMHhmZik7Ci0gICAgSE1BQ19TSEExKCh1bnNpZ25lZCBjaGFyKikgcGFzc3dvcmQsIChpbnQpIHN0cmxlbihwYXNzd29yZCksIGRpZ2VzdCwgc3NpZGxlbmd0aCs0LCBkaWdlc3QxLCBTSEExX0RJR0VTVF9TSVpFKTsgLy8gZm9yIFdQQSB1cGRhdGUKLQotICAgIC8qIG91dHB1dCA9IFUxICovCi0gICAgbWVtY3B5KG91dHB1dCwgZGlnZXN0MSwgU0hBMV9ESUdFU1RfU0laRSk7Ci0KLSAgICBmb3IgKGkgPSAxOyBpIDwgaXRlcmF0aW9uczsgaSsrKQotICAgIHsKLSAgICAgICAgLyogVW4gPSBQUkYoUCwgVW4tMSkgKi8KLSAgICAgICAgSE1BQ19TSEExKCh1bnNpZ25lZCBjaGFyKikgcGFzc3dvcmQsIChpbnQpIHN0cmxlbihwYXNzd29yZCksIGRpZ2VzdDEsIFNIQTFfRElHRVNUX1NJWkUsIGRpZ2VzdCwgU0hBMV9ESUdFU1RfU0laRSk7IC8vIGZvciBXUEEgdXBkYXRlCi0gICAgICAgIG1lbWNweShkaWdlc3QxLCBkaWdlc3QsIFNIQTFfRElHRVNUX1NJWkUpOwotCi0gICAgICAgIC8qIG91dHB1dCA9IG91dHB1dCB4b3IgVW4gKi8KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IFNIQTFfRElHRVNUX1NJWkU7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0W2pdIF49IGRpZ2VzdFtqXTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoKLSogcGFzc3dvcmQgLSBhc2NpaSBzdHJpbmcgdXAgdG8gNjMgY2hhcmFjdGVycyBpbiBsZW5ndGgKLSogc3NpZCAtIG9jdGV0IHN0cmluZyB1cCB0byAzMiBvY3RldHMKLSogc3NpZGxlbmd0aCAtIGxlbmd0aCBvZiBzc2lkIGluIG9jdGV0cwotKiBvdXRwdXQgbXVzdCBiZSA0MCBvY3RldHMgaW4gbGVuZ3RoIGFuZCBvdXRwdXRzIDI1NiBiaXRzIG9mIGtleQotKi8KLWludCBQYXNzd29yZEhhc2goUFNUUklORyBwYXNzd29yZCwgUFVDSEFSIHNzaWQsIElOVCBzc2lkbGVuZ3RoLCBQVUNIQVIgb3V0cHV0KQotewotICAgIGlmICgoc3RybGVuKHBhc3N3b3JkKSA+IDYzKSB8fCAoc3NpZGxlbmd0aCA+IDMyKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBGKHBhc3N3b3JkLCBzc2lkLCBzc2lkbGVuZ3RoLCA0MDk2LCAxLCBvdXRwdXQpOwotICAgIEYocGFzc3dvcmQsIHNzaWQsIHNzaWRsZW5ndGgsIDQwOTYsIDIsICZvdXRwdXRbU0hBMV9ESUdFU1RfU0laRV0pOwotICAgIHJldHVybiAxOwotfQotCi0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUl0IHV0aWxpemVzIFBSRi0zODQgb3IgUFJGLTUxMiB0byBkZXJpdmUgc2Vzc2lvbi1zcGVjaWZpYyBrZXlzIGZyb20gYSBQTUsuCi0JCUl0IHNoYWxsIGJlIGNhbGxlZCBieSA0LXdheSBoYW5kc2hha2UgcHJvY2Vzc2luZy4KLQotCUFyZ3VtZW50czoKLQkJcEFkCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAotCQlQTUsJCS0JcG9pbnRlciB0byBQTUsKLQkJQU5vbmNlCS0JcG9pbnRlciB0byBBTm9uY2UKLQkJQUEJCS0JcG9pbnRlciB0byBBdXRoZW50aWNhdG9yIEFkZHJlc3MKLQkJU05vbmNlCS0JcG9pbnRlciB0byBTTm9uY2UKLQkJU0EJCS0JcG9pbnRlciB0byBTdXBwbGljYW50IEFkZHJlc3MKLQkJbGVuCQktCWluZGljYXRlIHRoZSBsZW5ndGggb2YgUFRLIChvY3RldCkKLQotCVJldHVybiBWYWx1ZToKLQkJT3V0cHV0CQlwb2ludGVyIHRvIHRoZSBQVEsKLQotCU5vdGU6Ci0JCVJlZmVyIHRvIElFRUUgODAyLjExaS0yMDA0IDguNS4xLjIKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgV3BhRGVyaXZlUFRLKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCSpQTUssCi0JSU4JVUNIQVIJKkFOb25jZSwKLQlJTglVQ0hBUgkqQUEsCi0JSU4JVUNIQVIJKlNOb25jZSwKLQlJTglVQ0hBUgkqU0EsCi0JT1VUCVVDSEFSCSpvdXRwdXQsCi0JSU4JVUlOVAlsZW4pCi17Ci0JVUNIQVIJY29uY2F0ZW5hdGlvbls3Nl07Ci0JVUlOVAlDdXJyUG9zID0gMDsKLQlVQ0hBUgl0ZW1wWzMyXTsKLQlVQ0hBUglQcmVmaXhbXSA9IHsnUCcsICdhJywgJ2knLCAncicsICd3JywgJ2knLCAncycsICdlJywgJyAnLCAnaycsICdlJywgJ3knLCAnICcsCi0JCQkJCQknZScsICd4JywgJ3AnLCAnYScsICduJywgJ3MnLCAnaScsICdvJywgJ24nfTsKLQotCS8vIGluaXRpYXRlIHRoZSBjb25jYXRlbmF0aW9uIGlucHV0Ci0JTmRpc1plcm9NZW1vcnkodGVtcCwgc2l6ZW9mKHRlbXApKTsKLQlOZGlzWmVyb01lbW9yeShjb25jYXRlbmF0aW9uLCA3Nik7Ci0KLQkvLyBHZXQgc21hbGxlciBhZGRyZXNzCi0JaWYgKFJUTVBDb21wYXJlTWVtb3J5KFNBLCBBQSwgNikgPT0gMSkKLQkJTmRpc01vdmVNZW1vcnkoY29uY2F0ZW5hdGlvbiwgQUEsIDYpOwotCWVsc2UKLQkJTmRpc01vdmVNZW1vcnkoY29uY2F0ZW5hdGlvbiwgU0EsIDYpOwotCUN1cnJQb3MgKz0gNjsKLQotCS8vIEdldCBsYXJnZXIgYWRkcmVzcwotCWlmIChSVE1QQ29tcGFyZU1lbW9yeShTQSwgQUEsIDYpID09IDEpCi0JCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBTQSwgNik7Ci0JZWxzZQotCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgQUEsIDYpOwotCi0JLy8gc3RvcmUgdGhlIGxhcmdlciBtYWMgYWRkcmVzcyBmb3IgYmFja3dhcmQgY29tcGF0aWJsZSBvZgotCS8vIHJhbGluayBwcm9wcmlldGFyeSBTVEEta2V5IGlzc3VlCi0JTmRpc01vdmVNZW1vcnkodGVtcCwgJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIE1BQ19BRERSX0xFTik7Ci0JQ3VyclBvcyArPSA2OwotCi0JLy8gR2V0IHNtYWxsZXIgTm9uY2UKLQlpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAwKQotCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgdGVtcCwgMzIpOwkvLyBwYXRjaCBmb3IgcmFsaW5rIHByb3ByaWV0YXJ5IFNUQS1rZXkgaXNzdWUKLQllbHNlIGlmIChSVE1QQ29tcGFyZU1lbW9yeShBTm9uY2UsIFNOb25jZSwgMzIpID09IDEpCi0JCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBTTm9uY2UsIDMyKTsKLQllbHNlCi0JCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBBTm9uY2UsIDMyKTsKLQlDdXJyUG9zICs9IDMyOwotCi0JLy8gR2V0IGxhcmdlciBOb25jZQotCWlmIChSVE1QQ29tcGFyZU1lbW9yeShBTm9uY2UsIFNOb25jZSwgMzIpID09IDApCi0JCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCB0ZW1wLCAzMik7CS8vIHBhdGNoIGZvciByYWxpbmsgcHJvcHJpZXRhcnkgU1RBLWtleSBpc3N1ZQotCWVsc2UgaWYgKFJUTVBDb21wYXJlTWVtb3J5KEFOb25jZSwgU05vbmNlLCAzMikgPT0gMSkKLQkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIEFOb25jZSwgMzIpOwotCWVsc2UKLQkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIFNOb25jZSwgMzIpOwotCUN1cnJQb3MgKz0gMzI7Ci0KLQloZXhfZHVtcCgiY29uY2F0ZW5hdGlvbj0iLCBjb25jYXRlbmF0aW9uLCA3Nik7Ci0KLQkvLyBVc2UgUFJGIHRvIGdlbmVyYXRlIFBUSwotCVBSRihQTUssIExFTl9NQVNURVJfS0VZLCBQcmVmaXgsIDIyLCBjb25jYXRlbmF0aW9uLCA3Niwgb3V0cHV0LCBsZW4pOwotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlHZW5lcmF0ZSByYW5kb20gbnVtYmVyIGJ5IHNvZnR3YXJlLgotCi0JQXJndW1lbnRzOgotCQlwQWQJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAotCQltYWNBZGRyCS0JcG9pbnRlciB0byBsb2NhbCBNQUMgYWRkcmVzcwotCi0JUmV0dXJuIFZhbHVlOgotCi0JTm90ZToKLQkJODAyLjFpaS0yMDA0ICBBbm5leCBILjUKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJR2VuUmFuZG9tKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJKm1hY0FkZHIsCi0JT1VUCVVDSEFSCQkJKnJhbmRvbSkKLXsKLQlJTlQJCWksIGN1cnI7Ci0JVUNIQVIJbG9jYWxbODBdLCBLZXlDb3VudGVyWzMyXTsKLQlVQ0hBUglyZXN1bHRbODBdOwotCVVMT05HCUN1cnJlbnRUaW1lOwotCVVDSEFSCXByZWZpeFtdID0geydJJywgJ24nLCAnaScsICd0JywgJyAnLCAnQycsICdvJywgJ3UnLCAnbicsICd0JywgJ2UnLCAncid9OwotCi0JLy8gWmVybyB0aGUgcmVsYXRlZCBpbmZvcm1hdGlvbgotCU5kaXNaZXJvTWVtb3J5KHJlc3VsdCwgODApOwotCU5kaXNaZXJvTWVtb3J5KGxvY2FsLCA4MCk7Ci0JTmRpc1plcm9NZW1vcnkoS2V5Q291bnRlciwgMzIpOwotCi0JZm9yCShpID0gMDsJaSA8CTMyOwlpKyspCi0JewotCQkvLyBjb3B5IHRoZSBsb2NhbCBNQUMgYWRkcmVzcwotCQlDT1BZX01BQ19BRERSKGxvY2FsLCBtYWNBZGRyKTsKLQkJY3VyciA9CU1BQ19BRERSX0xFTjsKLQotCQkvLyBjb25jYXRlbmF0ZSB0aGUgY3VycmVudCB0aW1lCi0JCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJkN1cnJlbnRUaW1lKTsKLQkJTmRpc01vdmVNZW1vcnkoJmxvY2FsW2N1cnJdLCAgJkN1cnJlbnRUaW1lLAlzaXplb2YoQ3VycmVudFRpbWUpKTsKLQkJY3VyciArPQlzaXplb2YoQ3VycmVudFRpbWUpOwotCi0JCS8vIGNvbmNhdGVuYXRlIHRoZSBsYXN0IHJlc3VsdAotCQlOZGlzTW92ZU1lbW9yeSgmbG9jYWxbY3Vycl0sICByZXN1bHQsIDMyKTsKLQkJY3VyciArPQkzMjsKLQotCQkvLyBjb25jYXRlbmF0ZSBhIHZhcmlhYmxlCi0JCU5kaXNNb3ZlTWVtb3J5KCZsb2NhbFtjdXJyXSwgICZpLCAgMik7Ci0JCWN1cnIgKz0JMjsKLQotCQkvLyBjYWxjdWxhdGUgdGhlIHJlc3VsdAotCQlQUkYoS2V5Q291bnRlciwgMzIsIHByZWZpeCwxMiwgbG9jYWwsIGN1cnIsIHJlc3VsdCwgMzIpOwotCX0KLQotCU5kaXNNb3ZlTWVtb3J5KHJhbmRvbSwgcmVzdWx0LAkzMik7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlCdWlsZCBjaXBoZXIgc3VpdGUgaW4gUlNOLUlFLgotCQlJdCBvbmx5IHNoYWxsIGJlIGNhbGxlZCBieSBSVE1QTWFrZVJTTklFLgotCi0JQXJndW1lbnRzOgotCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKLQlFbGVtZW50SUQJLQlpbmRpY2F0ZSB0aGUgV1BBMSBvciBXUEEyCi0JV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQotCQliTWl4Q2lwaGVyCS0JYSBib29sZWFuIHRvIGluZGljYXRlIHRoZSBwYWlyd2lzZSBjaXBoZXIgYW5kIGdyb3VwCi0JCQkJCQljaXBoZXIgYXJlIHRoZSBzYW1lIG9yIG5vdAotCi0JUmV0dXJuIFZhbHVlOgotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBWT0lEIFJUTVBNYWtlUnNuSWVDaXBoZXIoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JVUNIQVIJCQlFbGVtZW50SUQsCi0JSU4JVUlOVAkJCVdlcFN0YXR1cywKLQlJTglCT09MRUFOCQkJYk1peENpcGhlciwKLQlJTglVQ0hBUgkJCUZsZXhpYmxlQ2lwaGVyLAotCU9VVAlQVUNIQVIJCQlwUnNuSWUsCi0JT1VUCVVDSEFSCQkJKnJzbl9sZW4pCi17Ci0JVUNIQVIJUGFpcndpc2VDbnQ7Ci0KLQkqcnNuX2xlbiA9IDA7Ci0KLQkvLyBkZWNpZGUgV1BBMiBvciBXUEExCi0JaWYgKEVsZW1lbnRJRCA9PSBXcGEySWUpCi0JewotCQlSU05JRTIJKnBSc25pZV9jaXBoZXIgPSAoUlNOSUUyKilwUnNuSWU7Ci0KLQkJLy8gQXNzaWduIHRoZSB2ZXJzb24gYXMgMQotCQlwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gMTsKLQotICAgICAgICBzd2l0Y2ggKFdlcFN0YXR1cykKLSAgICAgICAgewotCQkvLyBUS0lQIG1vZGUKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfVEtJUCwgNCk7Ci0gICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gMTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEEyX1RLSVAsIDQpOwotICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFMik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJCS8vIEFFUyBtb2RlCi0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6Ci0JCQkJaWYgKGJNaXhDaXBoZXIpCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9US0lQLCA0KTsKLQkJCQllbHNlCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9DQ01QLCA0KTsKLSAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfQ0NNUCwgNCk7Ci0gICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotCQkJLy8gVEtJUC1BRVMgbWl4IG1vZGUKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDoKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfVEtJUCwgNCk7Ci0KLQkJCQlQYWlyd2lzZUNudCA9IDE7Ci0JCQkJLy8gSW5zZXJ0IFdQQTIgVEtJUCBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCi0JCQkJaWYgKE1JWF9DSVBIRVJfV1BBMl9US0lQX09OKEZsZXhpYmxlQ2lwaGVyKSkKLQkJCQl7Ci0JCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEEyX1RLSVAsIDQpOwotCQkJCQkvLyBJbnNlcnQgV1BBMiBBRVMgYXMgdGhlIHNlY29uZGFyeSBwYWlyd2lzZSBjaXBoZXIKLQkJCQkJaWYgKE1JWF9DSVBIRVJfV1BBMl9BRVNfT04oRmxleGlibGVDaXBoZXIpKQotCQkJCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpICsgNCwgT1VJX1dQQTJfQ0NNUCwgNCk7Ci0JCQkJCQlQYWlyd2lzZUNudCA9IDI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8gSW5zZXJ0IFdQQTIgQUVTIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKLQkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBMl9DQ01QLCA0KTsKLQkJCQl9Ci0KLSAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBQYWlyd2lzZUNudDsKLSAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRTIpICsgKDQgKiAoUGFpcndpc2VDbnQgLSAxKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmCi0JCQkocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgJiYKLQkJCShwQWQtPlN0YUNmZy5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKLQkJewotCQkJVUlOVAlHcm91cENpcGhlciA9IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyOwotCQkJc3dpdGNoKEdyb3VwQ2lwaGVyKQotCQkJewotCQkJCWNhc2UgTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkOgotCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfV0VQNDAsIDQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQ6Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9XRVAxMDQsIDQpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCS8vIHN3YXAgZm9yIGJpZy1lbmRpYW4gcGxhdGZvcm0KLQkJcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnZlcnNpb24pOwotCSAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBjcHUybGUxNihwUnNuaWVfY2lwaGVyLT51Y291bnQpOwotCX0KLQllbHNlCi0JewotCQlSU05JRQkqcFJzbmllX2NpcGhlciA9IChSU05JRSopcFJzbkllOwotCi0JCS8vIEFzc2lnbiBPVUkgYW5kIHZlcnNpb24KLQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+b3VpLCBPVUlfV1BBX1ZFUlNJT04sIDQpOwotICAgICAgICBwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gMTsKLQotCQlzd2l0Y2ggKFdlcFN0YXR1cykKLQkJewotCQkJLy8gVEtJUCBtb2RlCi0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfVEtJUCwgNCk7Ci0gICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gMTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEFfVEtJUCwgNCk7Ci0gICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JCQkvLyBBRVMgbW9kZQotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgotCQkJCWlmIChiTWl4Q2lwaGVyKQotCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9US0lQLCA0KTsKLQkJCQllbHNlCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX0NDTVAsIDQpOwotICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX0NDTVAsIDQpOwotICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotCQkJLy8gVEtJUC1BRVMgbWl4IG1vZGUKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDoKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9US0lQLCA0KTsKLQotCQkJCVBhaXJ3aXNlQ250ID0gMTsKLQkJCQkvLyBJbnNlcnQgV1BBIFRLSVAgYXMgdGhlIGZpcnN0IHBhaXJ3aXNlIGNpcGhlcgotCQkJCWlmIChNSVhfQ0lQSEVSX1dQQV9US0lQX09OKEZsZXhpYmxlQ2lwaGVyKSkKLQkJCQl7Ci0JCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEFfVEtJUCwgNCk7Ci0JCQkJCS8vIEluc2VydCBXUEEgQUVTIGFzIHRoZSBzZWNvbmRhcnkgcGFpcndpc2UgY2lwaGVyCi0JCQkJCWlmIChNSVhfQ0lQSEVSX1dQQV9BRVNfT04oRmxleGlibGVDaXBoZXIpKQotCQkJCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpICsgNCwgT1VJX1dQQV9DQ01QLCA0KTsKLQkJCQkJCVBhaXJ3aXNlQ250ID0gMjsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyBJbnNlcnQgV1BBIEFFUyBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQV9DQ01QLCA0KTsKLQkJCQl9Ci0KLSAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBQYWlyd2lzZUNudDsKLSAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRSkgKyAoNCAqIChQYWlyd2lzZUNudCAtIDEpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYKLQkJCShwQWQtPlN0YUNmZy5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgotCQkJKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKQotCQl7Ci0JCQlVSU5UCUdyb3VwQ2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7Ci0JCQlzd2l0Y2goR3JvdXBDaXBoZXIpCi0JCQl7Ci0JCQkJY2FzZSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQ6Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1dFUDQwLCA0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkOgotCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9XRVAxMDQsIDQpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCS8vIHN3YXAgZm9yIGJpZy1lbmRpYW4gcGxhdGZvcm0KLQkJcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnZlcnNpb24pOwotCSAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBjcHUybGUxNihwUnNuaWVfY2lwaGVyLT51Y291bnQpOwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUJ1aWxkIEFLTSBzdWl0ZSBpbiBSU04tSUUuCi0JCUl0IG9ubHkgc2hhbGwgYmUgY2FsbGVkIGJ5IFJUTVBNYWtlUlNOSUUuCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAotCUVsZW1lbnRJRAktCWluZGljYXRlIHRoZSBXUEExIG9yIFdQQTIKLQlBdXRoTW9kZQktCWluZGljYXRlIHRoZSBhdXRoZW50aWNhdGlvbiBtb2RlCi0JCWFwaWR4CQktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgVk9JRCBSVE1QTWFrZVJzbkllQUtNKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJRWxlbWVudElELAotCUlOCVVJTlQJCQlBdXRoTW9kZSwKLQlJTglVQ0hBUgkJCWFwaWR4LAotCU9VVAlQVUNIQVIJCQlwUnNuSWUsCi0JT1VUCVVDSEFSCQkJKnJzbl9sZW4pCi17Ci0JUlNOSUVfQVVUSAkJKnBSc25pZV9hdXRoOwotCVVDSEFSCQkJQWttQ250ID0gMTsJCS8vIGRlZmF1bHQgYXMgMQotCi0JcFJzbmllX2F1dGggPSAoUlNOSUVfQVVUSCopKHBSc25JZSArICgqcnNuX2xlbikpOwotCi0JLy8gZGVjaWRlIFdQQTIgb3IgV1BBMQotCWlmIChFbGVtZW50SUQgPT0gV3BhMkllKQotCXsKLQotCQlzd2l0Y2ggKEF1dGhNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI6Ci0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyOgotCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBMl84MDIxWF9BS00sIDQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s6Ci0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLOgotCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBMl9QU0tfQUtNLCA0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJQWttQ250ID0gMDsKLQkJCQlicmVhazsKLQotICAgICAgICB9Ci0JfQotCWVsc2UKLQl7Ci0JCXN3aXRjaCAoQXV0aE1vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBOgotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEFfODAyMVhfQUtNLCA0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s6Ci0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLOgotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQV9QU0tfQUtNLCA0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotCQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOgotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQV9OT05FX0FLTSwgNCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCUFrbUNudCA9IDA7Ci0JCQkJYnJlYWs7Ci0gICAgICAgIH0KLQl9Ci0KLQlwUnNuaWVfYXV0aC0+YWNvdW50ID0gQWttQ250OwotCXBSc25pZV9hdXRoLT5hY291bnQgPSBjcHUybGUxNihwUnNuaWVfYXV0aC0+YWNvdW50KTsKLQotCS8vIHVwZGF0ZSBjdXJyZW50IFJTTklFIGxlbmd0aAotCSgqcnNuX2xlbikgKz0gKHNpemVvZihSU05JRV9BVVRIKSArICg0ICogKEFrbUNudCAtIDEpKSk7Ci0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUJ1aWxkIGNhcGFiaWxpdHkgaW4gUlNOLUlFLgotCQlJdCBvbmx5IHNoYWxsIGJlIGNhbGxlZCBieSBSVE1QTWFrZVJTTklFLgotCi0JQXJndW1lbnRzOgotCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKLQlFbGVtZW50SUQJLQlpbmRpY2F0ZSB0aGUgV1BBMSBvciBXUEEyCi0JCWFwaWR4CQktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgVk9JRCBSVE1QTWFrZVJzbkllQ2FwKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJRWxlbWVudElELAotCUlOCVVDSEFSCQkJYXBpZHgsCi0JT1VUCVBVQ0hBUgkJCXBSc25JZSwKLQlPVVQJVUNIQVIJCQkqcnNuX2xlbikKLXsKLQlSU05fQ0FQQUJJTElUSUVTICAgICpwUlNOX0NhcDsKLQotCS8vIGl0IGNvdWxkIGJlIGlnbm9yZWQgaW4gV1BBMSBtb2RlCi0JaWYgKEVsZW1lbnRJRCA9PSBXcGFJZSkKLQkJcmV0dXJuOwotCi0JcFJTTl9DYXAgPSAoUlNOX0NBUEFCSUxJVElFUyopKHBSc25JZSArICgqcnNuX2xlbikpOwotCi0KLQlwUlNOX0NhcC0+d29yZCA9IGNwdTJsZTE2KHBSU05fQ2FwLT53b3JkKTsKLQotCSgqcnNuX2xlbikgKz0gc2l6ZW9mKFJTTl9DQVBBQklMSVRJRVMpOwkvLyB1cGRhdGUgY3VycmVudCBSU05JRSBsZW5ndGgKLQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlCdWlsZCBSU04gSUUgY29udGV4dC4gSXQgaXMgbm90IGluY2x1ZGVkIGVsZW1lbnQtSUQgYW5kIGxlbmd0aC4KLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0Ci0JQXV0aE1vZGUJLQlpbmRpY2F0ZSB0aGUgYXV0aGVudGljYXRpb24gbW9kZQotCVdlcFN0YXR1cwktCWluZGljYXRlIHRoZSBlbmNyeXB0aW9uIHR5cGUKLQkJYXBpZHgJCS0JaW5kaWNhdGUgdGhlIGludGVyZmFjZSBpbmRleAotCi0JUmV0dXJuIFZhbHVlOgotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUE1ha2VSU05JRSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgVUlOVCAgICAgICAgICAgIEF1dGhNb2RlLAotICAgIElOICBVSU5UICAgICAgICAgICAgV2VwU3RhdHVzLAotCUlOCVVDSEFSCQkJYXBpZHgpCi17Ci0JUFVDSEFSCQlwUnNuSWUgPSBOVUxMOwkJCS8vIHByaW1hcnkgUlNOSUUKLQlVQ0hBUgkJKnJzbmllbGVuX2N1cl9wID0gMDsJLy8gdGhlIGxlbmd0aCBvZiB0aGUgcHJpbWFyeSBSU05JRQotCVVDSEFSCQkqcnNuaWVsZW5fZXhfY3VyX3AgPSAwOwkvLyB0aGUgbGVuZ3RoIG9mIHRoZSBzZWNvbmRhcnkgUlNOSUUKLQlVQ0hBUgkJUHJpbWFyeVJzbmllOwotCUJPT0xFQU4JCWJNaXhDaXBoZXIgPSBGQUxTRTsJLy8gaW5kaWNhdGUgdGhlIHBhaXJ3aXNlIGFuZCBncm91cCBjaXBoZXIgYXJlIGRpZmZlcmVudAotCVVDSEFSCQlwX29mZnNldDsKLQlXUEFfTUlYX1BBSVJfQ0lQSEVSCQlGbGV4aWJsZUNpcGhlciA9IFdQQV9US0lQQUVTX1dQQTJfVEtJUEFFUzsJLy8gaXQgcHJvdmlkZSB0aGUgbW9yZSBmbGV4aWJsZSBjaXBoZXIgY29tYmluYXRpb24gaW4gV1BBLVdQQTIgYW5kIFRLSVBBRVMgbW9kZQotCi0JcnNuaWVsZW5fY3VyX3AgPSBOVUxMOwotCXJzbmllbGVuX2V4X2N1cl9wID0gTlVMTDsKLQotCXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKLQkJCXsKLQkJCQlpZiAoQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0JCQl7Ci0JCQkJLy8gU3VwcG9ydCBXUEFQU0sgb3IgV1BBMlBTSyBpbiBTVEEtSW5mcmEgbW9kZQotCQkJCS8vIFN1cHBvcnQgV1BBTm9uZSBpbiBTVEEtQWRob2MgbW9kZQotCQkJCWlmICgoQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgotCQkJCQkoQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKLQkJCQkJKEF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0JCQkJCSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIj09PiBSVE1QTWFrZVJTTklFKFNUQSlcbiIpKTsKLQotCQkJLy8gWmVybyBSU05JRSBjb250ZXh0Ci0JCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gPSAwOwotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUlNOX0lFLCBNQVhfTEVOX09GX1JTTklFKTsKLQotCQkJLy8gUG9pbnRlciB0byBSU05JRQotCQkJcnNuaWVsZW5fY3VyX3AgPSAmcEFkLT5TdGFDZmcuUlNOSUVfTGVuOwotCQkJcFJzbkllID0gcEFkLT5TdGFDZmcuUlNOX0lFOwotCi0JCQliTWl4Q2lwaGVyID0gcEFkLT5TdGFDZmcuYk1peENpcGhlcjsKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLQotCS8vIGluZGljYXRlIHByaW1hcnkgUlNOSUUgYXMgV1BBIG9yIFdQQTIKLQlpZiAoKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKLQkJKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKLQkJKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpIHx8Ci0JCShBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMikgfHwKLQkJKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLKSkKLQkJUHJpbWFyeVJzbmllID0gV3BhSWU7Ci0JZWxzZQotCQlQcmltYXJ5UnNuaWUgPSBXcGEySWU7Ci0KLQl7Ci0JCS8vIEJ1aWxkIHRoZSBwcmltYXJ5IFJTTklFCi0JCS8vIDEuIGluc2VydCBjaXBoZXIgc3VpdGUKLQkJUlRNUE1ha2VSc25JZUNpcGhlcihwQWQsIFByaW1hcnlSc25pZSwgV2VwU3RhdHVzLCBiTWl4Q2lwaGVyLCBGbGV4aWJsZUNpcGhlciwgcFJzbkllLCAmcF9vZmZzZXQpOwotCi0JCS8vIDIuIGluc2VydCBBS00KLQkJUlRNUE1ha2VSc25JZUFLTShwQWQsIFByaW1hcnlSc25pZSwgQXV0aE1vZGUsIGFwaWR4LCBwUnNuSWUsICZwX29mZnNldCk7Ci0KLQkJLy8gMy4gaW5zZXJ0IGNhcGFiaWxpdHkKLQkJUlRNUE1ha2VSc25JZUNhcChwQWQsIFByaW1hcnlSc25pZSwgYXBpZHgsIHBSc25JZSwgJnBfb2Zmc2V0KTsKLQl9Ci0KLQkvLyA0LiB1cGRhdGUgdGhlIFJTTklFIGxlbmd0aAotCSpyc25pZWxlbl9jdXJfcCA9IHBfb2Zmc2V0OwotCi0JaGV4X2R1bXAoIlRoZSBwcmltYXJ5IFJTTklFIiwgcFJzbkllLCAoKnJzbmllbGVuX2N1cl9wKSk7Ci0KLQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0JCUNoZWNrIHdoZXRoZXIgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIEVBUCBmcmFtZS4KLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAotCQlwRW50cnkJCQktCXBvaW50ZXIgdG8gYWN0aXZlIGVudHJ5Ci0JCXBEYXRhCQkJLQl0aGUgcmVjZWl2ZWQgZnJhbWUKLQkJRGF0YUJ5dGVDb3VudAktCXRoZSByZWNlaXZlZCBmcmFtZSdzIGxlbmd0aAotCQlGcm9tV2hpY2hCU1NJRAktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKLQotICAgIFJldHVybjoKLSAgICAgICAgIFRSVUUJCQktCVRoaXMgZnJhbWUgaXMgRUFQIGZyYW1lCi0gICAgICAgICBGQUxTRQkJCS0Jb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOIFJUTVBDaGVja1dQQWZyYW1lKAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAotICAgIElOIFBVQ0hBUiAgICAgICAgICAgcERhdGEsCi0gICAgSU4gVUxPTkcgICAgICAgICAgICBEYXRhQnl0ZUNvdW50LAotCUlOIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0JVUxPTkcJQm9keV9sZW47Ci0JQk9PTEVBTiBDYW5jZWxsZWQ7Ci0KLQotICAgIGlmKERhdGFCeXRlQ291bnQgPCAoTEVOR1RIXzgwMl8xX0ggKyBMRU5HVEhfRUFQT0xfSCkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotCi0JLy8gU2tpcCBMTEMgaGVhZGVyCi0gICAgaWYgKE5kaXNFcXVhbE1lbW9yeShTTkFQXzgwMl8xSCwgcERhdGEsIDYpIHx8Ci0gICAgICAgIC8vIENpc2NvIDEyMDAgQVAgbWF5IHNlbmQgcGFja2V0IHdpdGggU05BUF9CUklER0VfVFVOTkVMCi0gICAgICAgIE5kaXNFcXVhbE1lbW9yeShTTkFQX0JSSURHRV9UVU5ORUwsIHBEYXRhLCA2KSkKLSAgICB7Ci0gICAgICAgIHBEYXRhICs9IDY7Ci0gICAgfQotCS8vIFNraXAgMi1ieXRlcyBFQVBvTCB0eXBlCi0gICAgaWYgKE5kaXNFcXVhbE1lbW9yeShFQVBPTCwgcERhdGEsIDIpKQotLy8JaWYgKCooVUlOVDE2ICopRUFQT0wgPT0gKihVSU5UMTYgKilwRGF0YSkKLSAgICB7Ci0gICAgICAgIHBEYXRhICs9IDI7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgc3dpdGNoICgqKHBEYXRhKzEpKQotICAgIHsKLSAgICAgICAgY2FzZSBFQVBQYWNrZXQ6Ci0JCQlCb2R5X2xlbiA9ICgqKHBEYXRhKzIpPDw4KSB8ICgqKHBEYXRhKzMpKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQLVBhY2tldCBmcmFtZSwgVFlQRSA9IDAsIExlbmd0aCA9ICVsZFxuIiwgQm9keV9sZW4pKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVBUE9MU3RhcnQ6Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MLVN0YXJ0IGZyYW1lLCBUWVBFID0gMSBcbiIpKTsKLQkJCWlmIChwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nICE9IEVBUE9MX1NUQVJUX0RJU0FCTEUpCi0gICAgICAgICAgICB7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNhbmNlbCB0aGUgRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgXG4iKSk7Ci0gICAgICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPkVucXVldWVTdGFydEZvclBTS1RpbWVyLCAmQ2FuY2VsbGVkKTsKLSAgICAgICAgICAgICAgICBwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVBUE9MTG9nb2ZmOgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTExvZ29mZiBmcmFtZSwgVFlQRSA9IDIgXG4iKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFQVBPTEtleToKLQkJCUJvZHlfbGVuID0gKCoocERhdGErMik8PDgpIHwgKCoocERhdGErMykpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTC1LZXkgZnJhbWUsIFRZUEUgPSAzLCBMZW5ndGggPSAlbGRcbiIsIEJvZHlfbGVuKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFQVBPTEFTRkFsZXJ0OgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTEFTRkFsZXJ0IGZyYW1lLCBUWVBFID0gNCBcbiIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0JCVJlcG9ydCB0aGUgRUFQIG1lc3NhZ2UgdHlwZQotCi0JQXJndW1lbnRzOgotCQltc2cJCS0JRUFQT0xfUEFJUl9NU0dfMQotCQkJCQlFQVBPTF9QQUlSX01TR18yCi0JCQkJCUVBUE9MX1BBSVJfTVNHXzMKLQkJCQkJRUFQT0xfUEFJUl9NU0dfNAotCQkJCQlFQVBPTF9HUk9VUF9NU0dfMQotCQkJCQlFQVBPTF9HUk9VUF9NU0dfMgotCi0gICAgUmV0dXJuOgotICAgICAgICAgbWVzc2FnZSB0eXBlIHN0cmluZwotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1QU1RSSU5HIEdldEVhcG9sTXNnVHlwZShDSEFSIG1zZykKLXsKLSAgICBpZihtc2cgPT0gRUFQT0xfUEFJUl9NU0dfMSkKLSAgICAgICAgcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDEiOwotICAgIGVsc2UgaWYobXNnID09IEVBUE9MX1BBSVJfTVNHXzIpCi0gICAgICAgIHJldHVybiAiUGFpcndpc2UgTWVzc2FnZSAyIjsKLQllbHNlIGlmKG1zZyA9PSBFQVBPTF9QQUlSX01TR18zKQotICAgICAgICByZXR1cm4gIlBhaXJ3aXNlIE1lc3NhZ2UgMyI7Ci0JZWxzZSBpZihtc2cgPT0gRUFQT0xfUEFJUl9NU0dfNCkKLSAgICAgICAgcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDQiOwotCWVsc2UgaWYobXNnID09IEVBUE9MX0dST1VQX01TR18xKQotICAgICAgICByZXR1cm4gIkdyb3VwIE1lc3NhZ2UgMSI7Ci0JZWxzZSBpZihtc2cgPT0gRUFQT0xfR1JPVVBfTVNHXzIpCi0gICAgICAgIHJldHVybiAiR3JvdXAgTWVzc2FnZSAyIjsKLSAgICBlbHNlCi0JcmV0dXJuICJJbnZhbGlkIE1lc3NhZ2UiOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIENoZWNrIFNhbml0eSBSU04gSUUgb2YgRUFQb0wgbWVzc2FnZQotCi0gICAgQXJndW1lbnRzOgotCi0gICAgUmV0dXJuIFZhbHVlOgotCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOIFJUTVBDaGVja1JTTklFKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCi0JSU4gIFVDSEFSICAgICAgICAgICBEYXRhTGVuLAotCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKLQlPVVQJVUNIQVIJCQkqT2Zmc2V0KQotewotCVBVQ0hBUiAgICAgICAgICAgICAgcFZJRTsKLQlVQ0hBUiAgICAgICAgICAgICAgIGxlbjsKLQlQRUlEX1NUUlVDVCAgICAgICAgIHBFaWQ7Ci0JQk9PTEVBTgkJCQlyZXN1bHQgPSBGQUxTRTsKLQotCXBWSUUgPSBwRGF0YTsKLQlsZW4JID0gRGF0YUxlbjsKLQkqT2Zmc2V0ID0gMDsKLQotCXdoaWxlIChsZW4gPiBzaXplb2YoUlNOSUUyKSkKLQl7Ci0JCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBWSUU7Ci0JCS8vIFdQQSBSU04gSUUKLQkJaWYgKChwRWlkLT5FaWQgPT0gSUVfV1BBKSAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkpCi0JCXsKLQkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEgfHwgcEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCi0JCQkJKE5kaXNFcXVhbE1lbW9yeShwVklFLCBwRW50cnktPlJTTl9JRSwgcEVudHJ5LT5SU05JRV9MZW4pKSAmJgotCQkJCShwRW50cnktPlJTTklFX0xlbiA9PSAocEVpZC0+TGVuICsgMikpKQotCQkJewotCQkJCQlyZXN1bHQgPSBUUlVFOwotCQkJfQotCi0JCQkqT2Zmc2V0ICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJfQotCQkvLyBXUEEyIFJTTiBJRQotCQllbHNlIGlmICgocEVpZC0+RWlkID09IElFX1JTTikgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKSkKLQkJewotCQkJaWYgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwgcEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgotCQkJCShwRWlkLT5FaWQgPT0gcEVudHJ5LT5SU05fSUVbMF0pICYmCi0JCQkJKChwRWlkLT5MZW4gKyAyKSA+PSBwRW50cnktPlJTTklFX0xlbikgJiYKLQkJCQkoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCAmcEVudHJ5LT5SU05fSUVbMl0sIHBFbnRyeS0+UlNOSUVfTGVuIC0gMikpKQotCQkJewotCi0JCQkJCXJlc3VsdCA9IFRSVUU7Ci0JCQl9Ci0KLQkJCSpPZmZzZXQgKz0gKHBFaWQtPkxlbiArIDIpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQotCQlwVklFICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJbGVuICAtPSAocEVpZC0+TGVuICsgMik7Ci0JfQotCi0KLQlyZXR1cm4gcmVzdWx0OwotCi19Ci0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgUGFyc2UgS0VZREFUQSBmaWVsZC4gIEtFWURBVEFbXSBNYXkgY29udGFpbiAyIFJTTiBJRSBhbmQgb3B0aW9uYWxseSBHVEsuCi0gICAgR1RLICBpcyBlbmNhcHR1bGF0ZWQgaW4gS0RFIGZvcm1hdCBhdCAgcC44MyA4MDIuMTFpIEQxMAotCi0gICAgQXJndW1lbnRzOgotCi0gICAgUmV0dXJuIFZhbHVlOgotCi0gICAgTm90ZToKLSAgICAgICAgODAyLjExaSBEMTAKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4gUlRNUFBhcnNlRWFwb2xLZXlEYXRhKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcEtleURhdGEsCi0JSU4gIFVDSEFSICAgICAgICAgICBLZXlEYXRhTGVuLAotCUlOCVVDSEFSCQkJR3JvdXBLZXlJbmRleCwKLQlJTglVQ0hBUgkJCU1zZ1R5cGUsCi0JSU4JQk9PTEVBTgkJCWJXUEEyLAotCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSkKLXsKLSAgICBQS0RFX0VOQ0FQICAgICAgICAgIHBLREUgPSBOVUxMOwotICAgIFBVQ0hBUiAgICAgICAgICAgICAgcE15S2V5RGF0YSA9IHBLZXlEYXRhOwotICAgIFVDSEFSICAgICAgICAgICAgICAgS2V5RGF0YUxlbmd0aCA9IEtleURhdGFMZW47Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBHVEtMRU4gPSAwOwotCVVDSEFSCQkJCURlZmF1bHRJZHggPSAwOwotCVVDSEFSCQkJCXNraXBfb2Zmc2V0OwotCi0JLy8gVmVyaWZ5IFRoZSBSU04gSUUgY29udGFpbmVkIGluIHBhaXJld2lzZV9tc2dfMiAmJiBwYWlyZXdpc2VfbXNnXzMgYW5kIHNraXAgaXQKLQlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18yIHx8IE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKLSAgICB7Ci0JCS8vIENoZWNrIFJTTiBJRSB3aGV0aGVyIGl0IGlzIFdQQTIvV1BBMlBTSwotCQlpZiAoIVJUTVBDaGVja1JTTklFKHBBZCwgcEtleURhdGEsIEtleURhdGFMZW4sIHBFbnRyeSwgJnNraXBfb2Zmc2V0KSkKLQkJewotCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBSU04gSUUgZGlmZmVyZW50Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfUlNOSUVfRElGRl9FVkVOVF9GTEFHLCBwRW50cnktPkFkZHIsIHBFbnRyeS0+YXBpZHgsIDApOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJTTl9JRSBEaWZmZXJlbnQgaW4gbXNnICVkIG9mIDQtd2F5IGhhbmRzaGFrZSFcbiIsIE1zZ1R5cGUpKTsKLQkJCWhleF9kdW1wKCJSZWNlaXZlIFJTTl9JRSAiLCBwS2V5RGF0YSwgS2V5RGF0YUxlbik7Ci0JCQloZXhfZHVtcCgiRGVzaXJlZCBSU05fSUUgIiwgcEVudHJ5LT5SU05fSUUsIHBFbnRyeS0+UlNOSUVfTGVuKTsKLQotCQkJcmV0dXJuIEZBTFNFOwotCX0KLQllbHNlCi0JCXsKLQkJCWlmIChiV1BBMiAmJiBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCi0JCQl7Ci0JCQkJV3BhU2hvd0FsbHN1aXRlKHBNeUtleURhdGEsIHNraXBfb2Zmc2V0KTsKLQotCQkJCS8vIHNraXAgUlNOIElFCi0JCQkJcE15S2V5RGF0YSArPSBza2lwX29mZnNldDsKLQkJCQlLZXlEYXRhTGVuZ3RoIC09IHNraXBfb2Zmc2V0OwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBQYXJzZUVhcG9sS2V5RGF0YSA9PT4gV1BBMi9XUEEyUFNLIFJTTiBJRSBtYXRjaGVkIGluIE1zZyAzLCBMZW5ndGgoJWQpIFxuIiwgc2tpcF9vZmZzZXQpKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlyZXR1cm4gVFJVRTsKLQkJfQotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFBhcnNlRWFwb2xLZXlEYXRhID09PiBLZXlEYXRhTGVuZ3RoICVkIHdpdGhvdXQgUlNOX0lFIFxuIiwgS2V5RGF0YUxlbmd0aCkpOwotCS8vaGV4X2R1bXAoInJlbWFpbiBkYXRhIiwgcE15S2V5RGF0YSwgS2V5RGF0YUxlbmd0aCk7Ci0KLQotCS8vIFBhcnNlIEVLRCBmb3JtYXQgaW4gcGFpcndpc2VfbXNnXzNfV1BBMiAmJiBncm91cF9tc2dfMV9XUEEyCi0JaWYgKGJXUEEyICYmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCi0JewotCQlpZiAoS2V5RGF0YUxlbmd0aCA+PSA4KQkvLyBLREUgZm9ybWF0IGV4Y2x1ZGUgR1RLIGxlbmd0aAotCXsKLQkJcEtERSA9IChQS0RFX0VOQ0FQKSBwTXlLZXlEYXRhOwotCi0KLQkJCURlZmF1bHRJZHggPSBwS0RFLT5HVEtFbmNhcC5LaWQ7Ci0KLQkJCS8vIFNhbml0eSBjaGVjayAtIEtFRCBsZW5ndGgKLQkJCWlmIChLZXlEYXRhTGVuZ3RoIDwgKHBLREUtPkxlbiArIDIpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogVGhlIGxlbiBmcm9tIEtERSBpcyB0b28gc2hvcnQgXG4iKSk7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQotCQkJLy8gR2V0IEdUSyBsZW5ndGggLSByZWZlciB0byBJRUVFIDgwMi4xMWktMjAwNCBwLjgyCi0JCQlHVEtMRU4gPSBwS0RFLT5MZW4gLTY7Ci0JCQlpZiAoR1RLTEVOIDwgTEVOX0FFU19LRVkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgbGVuZ3RoIGlzIHRvbyBzaG9ydCAoJWQpIFxuIiwgR1RLTEVOKSk7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCQl9Ci0KLQl9Ci0JCWVsc2UKLQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogS0RFIGZvcm1hdCBsZW5ndGggaXMgdG9vIHNob3J0IFxuIikpOwotCSAgICAgICAgcmV0dXJuIEZBTFNFOwotCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHVEsgaW4gS0RFIGZvcm1hdCAsRGVmYXVsdEtleUlEPSVkLCBLZXlMZW49JWQgXG4iLCBEZWZhdWx0SWR4LCBHVEtMRU4pKTsKLQkJLy8gc2tpcCBpdAotCQlwTXlLZXlEYXRhICs9IDg7Ci0JCUtleURhdGFMZW5ndGggLT0gODsKLQotCX0KLQllbHNlIGlmICghYldQQTIgJiYgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkKLQl7Ci0JCURlZmF1bHRJZHggPSBHcm91cEtleUluZGV4OwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHVEsgRGVmYXVsdEtleUlEPSVkIFxuIiwgRGVmYXVsdElkeCkpOwotCX0KLQotCS8vIFNhbml0eSBjaGVjayAtIHNoYXJlZCBrZXkgaW5kZXggbXVzdCBiZSAxIH4gMwotCWlmIChEZWZhdWx0SWR4IDwgMSB8fCBEZWZhdWx0SWR4ID4gMykKLSAgICB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgaW5kZXgoJWQpIGlzIGludmFsaWQgaW4gJXMgJXMgXG4iLCBEZWZhdWx0SWR4LCAoKGJXUEEyKSA/ICJXUEEyIiA6ICJXUEEiKSwgR2V0RWFwb2xNc2dUeXBlKE1zZ1R5cGUpKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlQQ0lQSEVSX0tFWSBwU2hhcmVkS2V5OwotCi0JCS8vIHNldCBrZXkgbWF0ZXJpYWwsIFR4TWljIGFuZCBSeE1pYwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5HVEssIHBNeUtleURhdGEsIDMyKTsKLQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gRGVmYXVsdElkeDsKLQotCQlwU2hhcmVkS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF07Ci0KLQkJLy8gUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZQotCQlOZGlzWmVyb01lbW9yeShwU2hhcmVkS2V5LCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotCQlwU2hhcmVkS2V5LT5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKLQkJTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+S2V5LCBwQWQtPlN0YUNmZy5HVEssIExFTl9US0lQX0VLKTsKLQkJTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+UnhNaWMsICZwQWQtPlN0YUNmZy5HVEtbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOwotCQlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5UeE1pYywgJnBBZC0+U3RhQ2ZnLkdUS1syNF0sIExFTl9US0lQX1RYTUlDSyk7Ci0KLQkJLy8gVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnCi0JCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotCQlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9US0lQOwotCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKLQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkKQotCQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkKQotCQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLQotCi0JCS8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCi0JCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCi0JCQkJCQkJICBCU1MwLAotCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAotCQkJCQkJCSAgcFNoYXJlZEtleS0+Q2lwaGVyQWxnLAotCQkJCQkJCSAgcFNoYXJlZEtleS0+S2V5LAotCQkJCQkJCSAgcFNoYXJlZEtleS0+VHhNaWMsCi0JCQkJCQkJICBwU2hhcmVkS2V5LT5SeE1pYyk7Ci0KLQkJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0JCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAotCQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAotCQkJCQkJCQkgIHBTaGFyZWRLZXktPkNpcGhlckFsZywKLQkJCQkJCQkJICBOVUxMKTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlyZXR1cm4gVFJVRTsKLQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDb25zdHJ1Y3QgRUFQb0wgbWVzc2FnZSBmb3IgV1BBIGhhbmRzaGFraW5nCi0JCUl0cyBmb3JtYXQgaXMgYmVsb3csCi0KLQkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCQl8IFByb3RvY29sIFZlcnNpb24JIHwgIDEgb2N0ZXQKLQkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCQl8IFByb3RvY29sIFR5cGUJCSB8CTEgb2N0ZXQKLQkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCQl8IEJvZHkgTGVuZ3RoCQkgfCAgMiBvY3RldHMKLQkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCQl8IERlc2NyaXB0b3IgVHlwZQkgfAkxIG9jdGV0Ci0JCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkJfCBLZXkgSW5mb3JtYXRpb24gICAgfAkyIG9jdGV0cwotCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JCXwgS2V5IExlbmd0aAkgICAgIHwgIDEgb2N0ZXQKLQkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCQl8IEtleSBSZXBhbHkgQ291bnRlciB8CTggb2N0ZXRzCi0JCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkJfCBLZXkgTm9uY2UJCSAgICAgfCAgMzIgb2N0ZXRzCi0JCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkJfCBLZXkgSVYJCQkgfCAgMTYgb2N0ZXRzCi0JCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkJfCBLZXkgUlNDCQkJIHwgIDggb2N0ZXRzCi0JCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkJfCBLZXkgSUQgb3IgUmVzZXJ2ZWQgfAk4IG9jdGV0cwotCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JCXwgS2V5IE1JQwkJCSB8CTE2IG9jdGV0cwotCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JCXwgS2V5IERhdGEgTGVuZ3RoCSB8CTIgb2N0ZXRzCi0JCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkJfCBLZXkgRGF0YQkJCSB8CW4gb2N0ZXRzCi0JCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQotCi0JQXJndW1lbnRzOgotCQlwQWQJCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUNvbnN0cnVjdEVhcG9sTXNnKAotCUlOCVBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAotICAgIElOCVVDSEFSCQkJCUdyb3VwS2V5V2VwU3RhdHVzLAotICAgIElOCVVDSEFSCQkJCU1zZ1R5cGUsCi0gICAgSU4JVUNIQVIJCQkJRGVmYXVsdEtleUlkeCwKLQlJTglVQ0hBUgkJCQkqS2V5Tm9uY2UsCi0JSU4JVUNIQVIJCQkJKlR4UlNDLAotCUlOCVVDSEFSCQkJCSpHVEssCi0JSU4JVUNIQVIJCQkJKlJTTklFLAotCUlOCVVDSEFSCQkJCVJTTklFX0xlbiwKLSAgICBPVVQgUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnKQotewotCUJPT0xFQU4JYldQQTIgPSBGQUxTRTsKLQlVQ0hBUglLZXlEZXNjVmVyOwotCi0JLy8gQ2hvb3NlIFdQQTIgb3Igbm90Ci0JaWYgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8Ci0JCShwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQliV1BBMiA9IFRSVUU7Ci0KLSAgICAvLyBJbml0IFBhY2tldCBhbmQgRmlsbCBoZWFkZXIKLSAgICBwTXNnLT5Qcm9WZXIgPSBFQVBPTF9WRVI7Ci0gICAgcE1zZy0+UHJvVHlwZSA9IEVBUE9MS2V5OwotCi0JLy8gRGVmYXVsdCA5NSBieXRlcywgdGhlIEVBUG9MLUtleSBkZXNjcmlwdG9yIGV4Y2x1ZGUgS2V5LWRhdGEgZmllbGQKLQlTRVRfVUlOVDE2X1RPX0FSUkFSWShwTXNnLT5Cb2R5X0xlbiwgTEVOX0VBUE9MX0tFWV9NU0cpOwotCi0JLy8gRmlsbCBpbiBFQVBvTCBkZXNjcmlwdG9yCi0JaWYgKGJXUEEyKQotCQlwTXNnLT5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOwotCWVsc2UKLQkJcE1zZy0+S2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKLQotCS8vIEtleSBEZXNjcmlwdG9yIFZlcnNpb24gKGJpdHMgMC0yKSBzcGVjaWZpZXMgdGhlIGtleSBkZXNjcmlwdG9yIHZlcnNpb24gdHlwZQotCXsKLQkJLy8gRmlsbCBpbiBLZXkgaW5mb3JtYXRpb24sIHJlZmVyIHRvIElFRUUgU3RkIDgwMi4xMWktMjAwNCBwYWdlIDc4Ci0JCS8vIFdoZW4gZWl0aGVyIHRoZSBwYWlyd2lzZSBvciB0aGUgZ3JvdXAgY2lwaGVyIGlzIEFFUywgdGhlIERFU0NfVFlQRV9BRVMoMikgc2hhbGwgYmUgdXNlZC4KLQkJS2V5RGVzY1ZlciA9ICgoKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHx8Ci0JCQkJCShHcm91cEtleVdlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgPyAoREVTQ19UWVBFX0FFUykgOiAoREVTQ19UWVBFX1RLSVApKTsKLQl9Ci0KLQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IEtleURlc2NWZXI7Ci0KLQkvLyBTcGVjaWZ5IEtleSBUeXBlIGFzIEdyb3VwKDApIG9yIFBhaXJ3aXNlKDEpCi0JaWYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpCi0JCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gR1JPVVBLRVk7Ci0JZWxzZQotCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IFBBSVJXSVNFS0VZOwotCi0JLy8gU3BlY2lmeSBLZXkgSW5kZXgsIG9ubHkgZ3JvdXBfbXNnMV9XUEExCi0JaWYgKCFiV1BBMiAmJiAoTXNnVHlwZSA+PSBFQVBPTF9HUk9VUF9NU0dfMSkpCi0JCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlJbmRleCA9IERlZmF1bHRLZXlJZHg7Ci0KLQlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQotCQlwTXNnLT5LZXlEZXNjLktleUluZm8uSW5zdGFsbCA9IDE7Ci0KLQlpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQotCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5QWNrID0gMTsKLQotCWlmIChNc2dUeXBlICE9IEVBUE9MX1BBSVJfTVNHXzEpCi0JCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlNaWMgPSAxOwotCi0JaWYgKChiV1BBMiAmJiAoTXNnVHlwZSA+PSBFQVBPTF9QQUlSX01TR18zKSkgfHwKLQkJKCFiV1BBMiAmJiAoTXNnVHlwZSA+PSBFQVBPTF9HUk9VUF9NU0dfMSkpKQotICAgIHsKLQlwTXNnLT5LZXlEZXNjLktleUluZm8uU2VjdXJlID0gMTsKLSAgICB9Ci0KLQlpZiAoYldQQTIgJiYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpIHx8Ci0JCShNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkpCi0gICAgewotICAgICAgICBwTXNnLT5LZXlEZXNjLktleUluZm8uRUtEX0RMID0gMTsKLSAgICB9Ci0KLQkvLyBrZXkgSW5mb3JtYXRpb24gZWxlbWVudCBoYXMgZG9uZS4KLQkqKFVTSE9SVCAqKSgmcE1zZy0+S2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwTXNnLT5LZXlEZXNjLktleUluZm8pKTsKLQotCS8vIEZpbGwgaW4gS2V5IExlbmd0aAotCXsKLQkJaWYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpCi0JCXsKLQkJCS8vIHRoZSBsZW5ndGggb2YgZ3JvdXAga2V5IGNpcGhlcgotCQkJcE1zZy0+S2V5RGVzYy5LZXlMZW5ndGhbMV0gPSAoKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpID8gVEtJUF9HVEtfTEVOR1RIIDogTEVOX0FFU19LRVkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gdGhlIGxlbmd0aCBvZiBwYWlyd2lzZSBrZXkgY2lwaGVyCi0JCQlwTXNnLT5LZXlEZXNjLktleUxlbmd0aFsxXSA9ICgocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgPyBMRU5fVEtJUF9LRVkgOiBMRU5fQUVTX0tFWSk7Ci0JCX0KLQl9Ci0KLQkvLyBGaWxsIGluIHJlcGxheSBjb3VudGVyCi0gICAgTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwRW50cnktPlJfQ291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0KLQkvLyBGaWxsIEtleSBOb25jZSBmaWVsZAotCS8vIEFOb25jZSA6IHBhaXJ3aXNlX21zZzEgJiBwYWlyd2lzZV9tc2czCi0JLy8gU05vbmNlIDogcGFpcndpc2VfbXNnMgotCS8vIEdOb25jZSA6IGdyb3VwX21zZzFfd3BhMQotCWlmICgoTXNnVHlwZSA8PSBFQVBPTF9QQUlSX01TR18zKSB8fCAoKCFiV1BBMiAmJiAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpKSkKLQlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleU5vbmNlLCBLZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKTsKLQotCS8vIEZpbGwga2V5IElWIC0gV1BBMiBhcyAwLCBXUEExIGFzIHJhbmRvbQotCWlmICghYldQQTIgJiYgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQotCXsKLQkJLy8gU3VnZ2VzdCBJViBiZSByYW5kb20gbnVtYmVyIHBsdXMgc29tZSBudW1iZXIsCi0JCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5SXYsICZLZXlOb25jZVsxNl0sIExFTl9LRVlfREVTQ19JVik7Ci0gICAgICAgIHBNc2ctPktleURlc2MuS2V5SXZbMTVdICs9IDI7Ci0JfQotCi0gICAgLy8gRmlsbCBLZXkgUlNDIGZpZWxkCi0gICAgLy8gSXQgY29udGFpbnMgdGhlIFJTQyBmb3IgdGhlIEdUSyBiZWluZyBpbnN0YWxsZWQuCi0JaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgJiYgYldQQTIpIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKLQl7Ci0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5UnNjLCBUeFJTQywgNik7Ci0JfQotCi0JLy8gQ2xlYXIgS2V5IE1JQyBmaWVsZCBmb3IgTUlDIGNhbGN1bGF0aW9uIGxhdGVyCi0gICAgTmRpc1plcm9NZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCi0JQ29uc3RydWN0RWFwb2xLZXlEYXRhKHBFbnRyeSwKLQkJCQkJCSAgR3JvdXBLZXlXZXBTdGF0dXMsCi0JCQkJCQkgIEtleURlc2NWZXIsCi0JCQkJCQkgIE1zZ1R5cGUsCi0JCQkJCQkgIERlZmF1bHRLZXlJZHgsCi0JCQkJCQkgIEdUSywKLQkJCQkJCSAgUlNOSUUsCi0JCQkJCQkgIFJTTklFX0xlbiwKLQkJCQkJCSAgcE1zZyk7Ci0KLQkvLyBDYWxjdWxhdGUgTUlDIGFuZCBmaWxsIGluIEtleU1pYyBGaWVsZCBleGNlcHQgUGFpcndpc2UgTXNnIDEuCi0JaWYgKE1zZ1R5cGUgIT0gRUFQT0xfUEFJUl9NU0dfMSkKLQl7Ci0JCUNhbGN1bGF0ZU1JQyhLZXlEZXNjVmVyLCBwRW50cnktPlBUSywgcE1zZyk7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBDb25zdHJ1Y3RFYXBvbE1zZyBmb3IgJXMgJXNcbiIsICgoYldQQTIpID8gIldQQTIiIDogIldQQSIpLCBHZXRFYXBvbE1zZ1R5cGUoTXNnVHlwZSkpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIJICAgICBCb2R5IGxlbmd0aCA9ICVkIFxuIiwgQ09OVl9BUlJBUllfVE9fVUlOVDE2KHBNc2ctPkJvZHlfTGVuKSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIgkgICAgIEtleSBsZW5ndGggID0gJWQgXG4iLCBDT05WX0FSUkFSWV9UT19VSU5UMTYocE1zZy0+S2V5RGVzYy5LZXlMZW5ndGgpKSk7Ci0KLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQ29uc3RydWN0IHRoZSBLZXkgRGF0YSBmaWVsZCBvZiBFQVBvTCBtZXNzYWdlCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKLQkJRWxlbQkJTWVzc2FnZSBib2R5Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUNvbnN0cnVjdEVhcG9sS2V5RGF0YSgKLQlJTglQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKLQlJTglVQ0hBUgkJCUdyb3VwS2V5V2VwU3RhdHVzLAotCUlOCVVDSEFSCQkJa2V5RGVzY1ZlciwKLQlJTglVQ0hBUgkJCU1zZ1R5cGUsCi0JSU4JVUNIQVIJCQlEZWZhdWx0S2V5SWR4LAotCUlOCVVDSEFSCQkJKkdUSywKLQlJTglVQ0hBUgkJCSpSU05JRSwKLQlJTglVQ0hBUgkJCVJTTklFX0xFTiwKLQlPVVQgUEVBUE9MX1BBQ0tFVCAgIHBNc2cpCi17Ci0JVUNIQVIJCSptcG9vbCwgKktleV9EYXRhLCAqUmM0R1RLOwotCVVDSEFSICAgICAgIGVrZXlbKExFTl9LRVlfREVTQ19JVitMRU5fRUFQX0VLKV07Ci0JVUxPTkcJCWRhdGFfb2Zmc2V0OwotCUJPT0xFQU4JCWJXUEEyQ2FwYWJsZSA9IEZBTFNFOwotCVBSVE1QX0FEQVBURVIJcEFkID0gcEVudHJ5LT5wQWQ7Ci0JQk9PTEVBTgkJR1RLX0luY2x1ZGVkID0gRkFMU0U7Ci0KLQkvLyBDaG9vc2UgV1BBMiBvciBub3QKLQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKLQkJKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0JCWJXUEEyQ2FwYWJsZSA9IFRSVUU7Ci0KLQlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xIHx8Ci0JCU1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfNCB8fAotCQlNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18yKQotCQlyZXR1cm47Ci0KLQkvLyBhbGxvY2F0ZSBtZW1vcnkgcG9vbAotCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJm1wb29sLCAxNTAwKTsKLQotICAgIGlmIChtcG9vbCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQkvKiBSYzRHVEsgTGVuID0gNTEyICovCi0JUmM0R1RLID0gKFVDSEFSICopIFJPVU5EX1VQKG1wb29sLCA0KTsKLQkvKiBLZXlfRGF0YSBMZW4gPSA1MTIgKi8KLQlLZXlfRGF0YSA9IChVQ0hBUiAqKSBST1VORF9VUChSYzRHVEsgKyA1MTIsIDQpOwotCi0JTmRpc1plcm9NZW1vcnkoS2V5X0RhdGEsIDUxMik7Ci0JU0VUX1VJTlQxNl9UT19BUlJBUlkocE1zZy0+S2V5RGVzYy5LZXlEYXRhTGVuLCAwKTsKLQlkYXRhX29mZnNldCA9IDA7Ci0KLQkvLyBFbmNhcHN1bGF0ZSBSU05JRSBpbiBwYWlyd2lzZV9tc2cyICYgcGFpcndpc2VfbXNnMwotCWlmIChSU05JRV9MRU4gJiYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIpIHx8IChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpKSkKLQl7Ci0JCVBVSU5UOAlwbWtpZF9wdHIgPSBOVUxMOwotCQlVSU5UOAlwbWtpZF9sZW4gPSAwOwotCi0KLQkJUlRNUEluc2VydFJTTklFKCZLZXlfRGF0YVtkYXRhX29mZnNldF0sCi0JCQkJCQkoUFVMT05HKSZkYXRhX29mZnNldCwKLQkJCQkJCVJTTklFLAotCQkJCQkJUlNOSUVfTEVOLAotCQkJCQkJcG1raWRfcHRyLAotCQkJCQkJcG1raWRfbGVuKTsKLQl9Ci0KLQotCS8vIEVuY2Fwc3VsYXRlIEtERSBmb3JtYXQgaW4gcGFpcndpc2VfbXNnM19XUEEyICYgZ3JvdXBfbXNnMV9XUEEyCi0JaWYgKGJXUEEyQ2FwYWJsZSAmJiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKSkKLQl7Ci0JCS8vIEtleSBEYXRhIEVuY2Fwc3VsYXRpb24gKEtERSkgZm9ybWF0IC0gODAyLjExaS0yMDA0ICBGaWd1cmUtNDN3IGFuZCBUYWJsZS0yMGgKLSAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAwXSA9IDB4REQ7Ci0KLQkJaWYgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JCXsKLQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMV0gPSAweDE2Oy8vIDQrMisxNihPVUkrRGF0YVR5cGUrRGF0YUZpZWxkKQotCQl9Ci0JCWVsc2UKLQkJewotCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAxXSA9IDB4MjY7Ly8gNCsyKzMyKE9VSStEYXRhVHlwZStEYXRhRmllbGQpCi0JCX0KLQotICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDJdID0gMHgwMDsKLSAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAzXSA9IDB4MEY7Ci0gICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNF0gPSAweEFDOwotICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDVdID0gMHgwMTsKLQotCQkvLyBHVEsgS0RFIGZvcm1hdCAtIDgwMi4xMWktMjAwNCAgRmlndXJlLTQzeAotICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDZdID0gKERlZmF1bHRLZXlJZHggJiAweDAzKTsKLSAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyA3XSA9IDB4MDA7CS8vIFJlc2VydmVkIEJ5dGUKLQotCQlkYXRhX29mZnNldCArPSA4OwotCX0KLQotCi0JLy8gRW5jYXBzdWxhdGUgR1RLCi0JLy8gT25seSBmb3IgcGFpcndpc2VfbXNnM19XUEEyIGFuZCBncm91cF9tc2cxCi0JaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgJiYgYldQQTJDYXBhYmxlKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCi0JewotCQkvLyBGaWxsIGluIEdUSwotCQlpZiAoR3JvdXBLZXlXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQkJewotCQkJTmRpc01vdmVNZW1vcnkoJktleV9EYXRhW2RhdGFfb2Zmc2V0XSwgR1RLLCBMRU5fQUVTX0tFWSk7Ci0JCQlkYXRhX29mZnNldCArPSBMRU5fQUVTX0tFWTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlfRGF0YVtkYXRhX29mZnNldF0sIEdUSywgVEtJUF9HVEtfTEVOR1RIKTsKLQkJCWRhdGFfb2Zmc2V0ICs9IFRLSVBfR1RLX0xFTkdUSDsKLQkJfQotCi0JCUdUS19JbmNsdWRlZCA9IFRSVUU7Ci0JfQotCi0KLQkvLyBUaGlzIHdob2xlIGtleS1kYXRhIGZpZWxkIHNoYWxsIGJlIGVuY3J5cHRlZCBpZiBhIEdUSyBpcyBpbmNsdWRlZC4KLQkvLyBFbmNyeXB0IHRoZSBkYXRhIG1hdGVyaWFsIGluIGtleSBkYXRhIGZpZWxkIHdpdGggS0VLCi0JaWYgKEdUS19JbmNsdWRlZCkKLQl7Ci0JCS8vaGV4X2R1bXAoIkdUS19JbmNsdWRlZCIsIEtleV9EYXRhLCBkYXRhX29mZnNldCk7Ci0KLQkJaWYgKAotCQkJKGtleURlc2NWZXIgPT0gREVTQ19UWVBFX0FFUykpCi0JCXsKLQkJCVVDSEFSCXJlbWFpbmRlciA9IDA7Ci0JCQlVQ0hBUglwYWRfbGVuID0gMDsKLQotCQkJLy8gS2V5IERlc2NyaXB0b3IgVmVyc2lvbiAyIG9yIDM6IEFFUyBrZXkgd3JhcCwgZGVmaW5lZCBpbiBJRVRGIFJGQyAzMzk0LAotCQkJLy8gc2hhbGwgYmUgdXNlZCB0byBlbmNyeXB0IHRoZSBLZXkgRGF0YSBmaWVsZCB1c2luZyB0aGUgS0VLIGZpZWxkIGZyb20KLQkJCS8vIHRoZSBkZXJpdmVkIFBUSy4KLQotCQkJLy8gSWYgdGhlIEtleSBEYXRhIGZpZWxkIHVzZXMgdGhlIE5JU1QgQUVTIGtleSB3cmFwLCB0aGVuIHRoZSBLZXkgRGF0YSBmaWVsZAotCQkJLy8gc2hhbGwgYmUgcGFkZGVkIGJlZm9yZSBlbmNyeXB0aW5nIGlmIHRoZSBrZXkgZGF0YSBsZW5ndGggaXMgbGVzcyB0aGFuIDE2Ci0JCQkvLyBvY3RldHMgb3IgaWYgaXQgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gVGhlIHBhZGRpbmcgY29uc2lzdHMgb2YgYXBwZW5kaW5nCi0JCQkvLyBhIHNpbmdsZSBvY3RldCAweGRkIGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSAweDAwIG9jdGV0cy4KLQkJCWlmICgocmVtYWluZGVyID0gZGF0YV9vZmZzZXQgJiAweDA3KSAhPSAwKQotCQkJewotCQkJCUlOVAkJaTsKLQotCQkJCXBhZF9sZW4gPSAoOCAtIHJlbWFpbmRlcik7Ci0JCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXRdID0gMHhERDsKLQkJCQlmb3IgKGkgPSAxOyBpIDwgcGFkX2xlbjsgaSsrKQotCQkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIGldID0gMDsKLQotCQkJCWRhdGFfb2Zmc2V0ICs9IHBhZF9sZW47Ci0JCQl9Ci0KLQkJCUFFU19HVEtfS0VZX1dSQVAoJnBFbnRyeS0+UFRLWzE2XSwgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0LCBSYzRHVEspOwotICAgICAgICAgICAgLy8gQUVTIHdyYXAgZnVuY3Rpb24gd2lsbCBncm93IDggYnl0ZXMgaW4gbGVuZ3RoCi0gICAgICAgICAgICBkYXRhX29mZnNldCArPSA4OwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLyoJS2V5IERlc2NyaXB0b3IgVmVyc2lvbiAxOiBBUkM0IGlzIHVzZWQgdG8gZW5jcnlwdCB0aGUgS2V5IERhdGEgZmllbGQKLQkJCQl1c2luZyB0aGUgS0VLIGZpZWxkIGZyb20gdGhlIGRlcml2ZWQgUFRLLiAqLwotCi0JCQkvLyBQUkVQQVJFIEVuY3J5cHRlZCAgIktleSBEQVRBIiBmaWVsZC4gIChFbmNyeXB0IEdUSyB3aXRoIFJDNCwgdXNpbmYgUFRLWzE2XS0+WzMxXSBhcyBLZXksIElWLWZpZWxkIGFzIElWKQotCQkJLy8gcHV0IFR4VHNjIGluIEtleSBSU0MgZmllbGQKLQkJCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPSBQUFBJTklURkNTMzI7ICAgLy9Jbml0IGNyYzMyLgotCi0JCQkvLyBla2V5IGlzIHRoZSBjb250YW5ldGlvbiBvZiBJVi1maWVsZCwgYW5kIFBUS1sxNl0tPlBUS1szMV0KLQkJCU5kaXNNb3ZlTWVtb3J5KGVrZXksIHBNc2ctPktleURlc2MuS2V5SXYsIExFTl9LRVlfREVTQ19JVik7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmZWtleVtMRU5fS0VZX0RFU0NfSVZdLCAmcEVudHJ5LT5QVEtbMTZdLCBMRU5fRUFQX0VLKTsKLQkJCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBla2V5LCBzaXplb2YoZWtleSkpOyAgLy9JTklUIFNCT1gsIEtFWUxFTiszKElWKQotCQkJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCBLZXlfRGF0YSwgZGF0YV9vZmZzZXQpOwotCQkJV1BBQVJDRk9VUl9FTkNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIFJjNEdUSywgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0KTsKLQkJfQotCi0JCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5RGF0YSwgUmM0R1RLLCBkYXRhX29mZnNldCk7Ci0JfQotCWVsc2UKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5RGF0YSwgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0KTsKLQl9Ci0KLQkvLyBVcGRhdGUga2V5IGRhdGEgbGVuZ3RoIGZpZWxkIGFuZCB0b3RhbCBib2R5IGxlbmd0aAotCVNFVF9VSU5UMTZfVE9fQVJSQVJZKHBNc2ctPktleURlc2MuS2V5RGF0YUxlbiwgZGF0YV9vZmZzZXQpOwotCUlOQ19VSU5UMTZfVE9fQVJSQVJZKHBNc2ctPkJvZHlfTGVuLCBkYXRhX29mZnNldCk7Ci0KLQlvc19mcmVlX21lbShOVUxMLCBtcG9vbCk7Ci0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNhbGNhdWxhdGUgTUlDLiBJdCBpcyB1c2VkIGR1cmluZyA0LXdheXMgaGFuZHNoYXJraW5nLgotCi0JQXJndW1lbnRzOgotCQlwQWQJCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0Ci0JUGVlcldlcFN0YXR1cwktCWluZGljYXRlIHRoZSBlbmNyeXB0aW9uIHR5cGUKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgVk9JRAlDYWxjdWxhdGVNSUMoCi0JSU4JVUNIQVIJCQlLZXlEZXNjVmVyLAotCUlOCVVDSEFSCQkJKlBUSywKLQlPVVQgUEVBUE9MX1BBQ0tFVCAgIHBNc2cpCi17Ci0gICAgVUNIQVIgICAqT3V0QnVmZmVyOwotCVVMT05HCUZyYW1lTGVuID0gMDsKLQlVQ0hBUgltaWNbTEVOX0tFWV9ERVNDX01JQ107Ci0JVUNIQVIJZGlnZXN0WzgwXTsKLQotCS8vIGFsbG9jYXRlIG1lbW9yeSBmb3IgTUlDIGNhbGN1bGF0aW9uCi0Jb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmT3V0QnVmZmVyLCA1MTIpOwotCi0gICAgaWYgKE91dEJ1ZmZlciA9PSBOVUxMKQotICAgIHsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiISEhQ2FsY3VsYXRlTUlDOiBubyBtZW1vcnkhISFcbiIpKTsKLQkJcmV0dXJuOwotICAgIH0KLQotCS8vIG1ha2UgYSBmcmFtZSBmb3IgY2FsY3VsYXRpbmcgTUlDLgotICAgIE1ha2VPdXRnb2luZ0ZyYW1lKE91dEJ1ZmZlciwJCSZGcmFtZUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICBDT05WX0FSUkFSWV9UT19VSU5UMTYocE1zZy0+Qm9keV9MZW4pICsgNCwJcE1zZywKLSAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0KLQlOZGlzWmVyb01lbW9yeShtaWMsIHNpemVvZihtaWMpKTsKLQotCS8vIENhbGN1bGF0ZSBNSUMKLSAgICBpZiAoS2V5RGVzY1ZlciA9PSBERVNDX1RZUEVfQUVTKQotCXsKLQkJSE1BQ19TSEExKFBUSywgTEVOX0VBUF9NSUNLLCBPdXRCdWZmZXIsICBGcmFtZUxlbiwgZGlnZXN0LCBTSEExX0RJR0VTVF9TSVpFKTsKLQkJTmRpc01vdmVNZW1vcnkobWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOwotCX0KLQllbHNlCi0JewotCQlITUFDX01ENShQVEssICBMRU5fRUFQX01JQ0ssIE91dEJ1ZmZlciwgRnJhbWVMZW4sIG1pYywgTUQ1X0RJR0VTVF9TSVpFKTsKLQl9Ci0KLQkvLyBzdG9yZSB0aGUgY2FsY3VsYXRlZCBNSUMKLQlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleU1pYywgbWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQotCW9zX2ZyZWVfbWVtKE5VTEwsIE91dEJ1ZmZlcik7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlTb21lIHJlY2VpdmVkIGZyYW1lcyBjYW4ndCBkZWNyeXB0IGJ5IEFzaWMsIHNvIGRlY3J5cHQgdGhlbSBieSBzb2Z0d2FyZS4KLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAotCVBlZXJXZXBTdGF0dXMJLQlpbmRpY2F0ZSB0aGUgZW5jcnlwdGlvbiB0eXBlCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX1NVQ0NFU1MJCS0JZGVjcnlwdGlvbiBzdWNjZXNzZnVsCi0JCU5ESVNfU1RBVFVTX0ZBSUxVUkUJCS0JZGVjcnlwdGlvbiBmYWlsdXJlCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUwlSVE1QU29mdERlY3J5cHRCcm9hZENhc3REYXRhKAotCUlOCVBSVE1QX0FEQVBURVIJCQkJCXBBZCwKLQlJTglSWF9CTEsJCQkJCQkJKnBSeEJsaywKLQlJTiAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJR3JvdXBDaXBoZXIsCi0JSU4gIFBDSVBIRVJfS0VZCQkJCQkJcFNoYXJkX2tleSkKLXsKLQlQUlhXSV9TVFJVQwkJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKLQotCi0KLQkvLyBoYW5kbGUgV0VQIGRlY3J5cHRpb24KLQlpZiAoR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkKLSAgICB7Ci0JCWlmIChSVE1QU29mdERlY3J5cHRXRVAocEFkLCBwUnhCbGstPnBEYXRhLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LCBwU2hhcmRfa2V5KSkKLQkJewotCi0JCQkvL01pbnVzIElWWzRdICYgSUNWWzRdCi0JCQlwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IC09IDg7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUiA6IFNvZnR3YXJlIGRlY3J5cHQgV0VQIGRhdGEgZmFpbHMuXG4iKSk7Ci0JCQkvLyBnaXZlIHVwIHRoaXMgZnJhbWUKLQkJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCQl9Ci0JfQotCS8vIGhhbmRsZSBUS0lQIGRlY3J5cHRpb24KLQllbHNlIGlmIChHcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotCXsKLQkJaWYgKFJUTVBTb2Z0RGVjcnlwdFRLSVAocEFkLCBwUnhCbGstPnBEYXRhLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LCAwLCBwU2hhcmRfa2V5KSkKLQkJewotCi0JCQkvL01pbnVzIDggYnl0ZXMgTUlDLCA4IGJ5dGVzIElWL0VJViwgNCBieXRlcyBJQ1YKLQkJCXBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgLT0gMjA7Ci0JCX0KLSAgICAgICAgZWxzZQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUiA6IFJUTVBTb2Z0RGVjcnlwdFRLSVAgRmFpbGVkXG4iKSk7Ci0JCQkvLyBnaXZlIHVwIHRoaXMgZnJhbWUKLQkJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotICAgICAgICB9Ci0JfQotCS8vIGhhbmRsZSBBRVMgZGVjcnlwdGlvbgotCWVsc2UgaWYgKEdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JewotCQlpZiAoUlRNUFNvZnREZWNyeXB0QUVTKHBBZCwgcFJ4QmxrLT5wRGF0YSwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAsIHBTaGFyZF9rZXkpKQotCQl7Ci0KLQkJCS8vOCBieXRlcyBNSUMsIDggYnl0ZXMgSVYvRUlWIChDQ01QIEhlYWRlcikKLQkJCXBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgLT0gMTY7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUiA6IFJUTVBTb2Z0RGVjcnlwdEFFUyBGYWlsZWRcbiIpKTsKLQkJCS8vIGdpdmUgdXAgdGhpcyBmcmFtZQotCQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCi0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotCi19Ci0KLQotUFVJTlQ4CUdldFN1aXRlRnJvbVJTTklFKAotCQlJTglQVUlOVDgJcnNuaWUsCi0JCUlOCVVJTlQJcnNuaWVfbGVuLAotCQlJTglVSU5UOAl0eXBlLAotCQlPVVQJVUlOVDgJKmNvdW50KQotewotCVBFSURfU1RSVUNUIHBFaWQ7Ci0JSU5UCQkJbGVuOwotCVBVSU5UOAkJcEJ1ZjsKLQlJTlQJCQlvZmZzZXQgPSAwOwotCVBSU05JRV9BVVRICXBBa207Ci0JVUlOVDE2CQlhY291bnQ7Ci0JQk9PTEVBTgkJaXNXUEEyID0gRkFMU0U7Ci0KLQlwRWlkID0gKFBFSURfU1RSVUNUKXJzbmllOwotCWxlbiA9IHJzbmllX2xlbiAtIDI7CS8vIGV4Y2x1ZGUgSUUgYW5kIGxlbmd0aAotCXBCdWYgPSAoUFVJTlQ4KSZwRWlkLT5PY3RldFswXTsKLQotCi0KLQkvLyBzZXQgZGVmYXVsdCB2YWx1ZQotCSpjb3VudCA9IDA7Ci0KLQkvLyBDaGVjayBsZW5ndGgKLQlpZiAoKGxlbiA8PSAwKSB8fCAocEVpZC0+TGVuICE9IGxlbikpCi0JewotCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBsZW5ndGggaXMgaW52YWxpZFxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8vIENoZWNrIFdQQSBvciBXUEEyCi0JaWYgKHBFaWQtPkVpZCA9PSBJRV9XUEEpCi0JewotCQlQUlNOSUUJcFJzbmllID0gKFBSU05JRSlwQnVmOwotCQlVSU5UMTYgdWNvdW50OwotCi0JCWlmIChsZW4gPCBzaXplb2YoUlNOSUUpKQotCQl7Ci0JCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBsZW5ndGggaXMgdG9vIHNob3J0IGZvciBXUEFcbiIsIF9fRlVOQ1RJT05fXykpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQotCQkvLyBHZXQgdGhlIGNvdW50IG9mIHBhaXJ3aXNlIGNpcGhlcgotCQl1Y291bnQgPSBjcHUybGUxNihwUnNuaWUtPnVjb3VudCk7Ci0JCWlmICh1Y291bnQgPiAyKQotCQl7Ci0JCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBjb3VudCglZCkgb2YgcGFpcndpc2UgY2lwaGVyIGlzIGludmxhaWRcbiIsCi0JCQkJCQkJCQkJCV9fRlVOQ1RJT05fXywgdWNvdW50KSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCi0JCS8vIEdldCB0aGUgZ3JvdXAgY2lwaGVyCi0JCWlmICh0eXBlID09IEdST1VQX1NVSVRFKQotCQl7Ci0JCQkqY291bnQgPSAxOwotCQkJcmV0dXJuIHBSc25pZS0+bWNhc3Q7Ci0JCX0KLQkJLy8gR2V0IHRoZSBwYWlyd2lzZSBjaXBoZXIgc3VpdGUKLQkJZWxzZSBpZiAodHlwZSA9PSBQQUlSV0lTRV9TVUlURSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgOiBUaGUgY291bnQgb2YgcGFpcndpc2UgY2lwaGVyIGlzICVkXG4iLAotCQkJCQkJCQkJCV9fRlVOQ1RJT05fXywgdWNvdW50KSk7Ci0JCQkqY291bnQgPSB1Y291bnQ7Ci0JCQlyZXR1cm4gcFJzbmllLT51Y2FzdFswXS5vdWk7Ci0JCX0KLQotCQlvZmZzZXQgPSBzaXplb2YoUlNOSUUpICsgKDQgKiAodWNvdW50IC0gMSkpOwotCi0JfQotCWVsc2UgaWYgKHBFaWQtPkVpZCA9PSBJRV9SU04pCi0JewotCQlQUlNOSUUyCXBSc25pZSA9IChQUlNOSUUyKXBCdWY7Ci0JCVVJTlQxNiB1Y291bnQ7Ci0KLQkJaXNXUEEyID0gVFJVRTsKLQotCQlpZiAobGVuIDwgc2l6ZW9mKFJTTklFMikpCi0JCXsKLQkJCURCR1BSSU5UX0VSUigoIiVzIDogVGhlIGxlbmd0aCBpcyB0b28gc2hvcnQgZm9yIFdQQTJcbiIsIF9fRlVOQ1RJT05fXykpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQotCQkvLyBHZXQgdGhlIGNvdW50IG9mIHBhaXJ3aXNlIGNpcGhlcgotCQl1Y291bnQgPSBjcHUybGUxNihwUnNuaWUtPnVjb3VudCk7Ci0JCWlmICh1Y291bnQgPiAyKQotCQl7Ci0JCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBjb3VudCglZCkgb2YgcGFpcndpc2UgY2lwaGVyIGlzIGludmxhaWRcbiIsCi0JCQkJCQkJCQkJCV9fRlVOQ1RJT05fXywgdWNvdW50KSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCi0JCS8vIEdldCB0aGUgZ3JvdXAgY2lwaGVyCi0JCWlmICh0eXBlID09IEdST1VQX1NVSVRFKQotCQl7Ci0JCQkqY291bnQgPSAxOwotCQkJcmV0dXJuIHBSc25pZS0+bWNhc3Q7Ci0JCX0KLQkJLy8gR2V0IHRoZSBwYWlyd2lzZSBjaXBoZXIgc3VpdGUKLQkJZWxzZSBpZiAodHlwZSA9PSBQQUlSV0lTRV9TVUlURSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgOiBUaGUgY291bnQgb2YgcGFpcndpc2UgY2lwaGVyIGlzICVkXG4iLAotCQkJCQkJCQkJCV9fRlVOQ1RJT05fXywgdWNvdW50KSk7Ci0JCQkqY291bnQgPSB1Y291bnQ7Ci0JCQlyZXR1cm4gcFJzbmllLT51Y2FzdFswXS5vdWk7Ci0JCX0KLQotCQlvZmZzZXQgPSBzaXplb2YoUlNOSUUyKSArICg0ICogKHVjb3VudCAtIDEpKTsKLQotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVF9FUlIoKCIlcyA6IFVua25vd24gSUUgKCVkKVxuIiwgX19GVU5DVElPTl9fLCBwRWlkLT5FaWQpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLy8gc2tpcCBncm91cCBjaXBoZXIgYW5kIHBhaXJ3aXNlIGNpcGhlciBzdWl0ZQotCXBCdWYgKz0gb2Zmc2V0OwotCWxlbiAtPSBvZmZzZXQ7Ci0KLQlpZiAobGVuIDwgc2l6ZW9mKFJTTklFX0FVVEgpKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgbGVuZ3RoIG9mIFJTTklFIGlzIHRvbyBzaG9ydFxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8vIHBvaW50ZXIgdG8gQUtNIGNvdW50Ci0JcEFrbSA9IChQUlNOSUVfQVVUSClwQnVmOwotCi0JLy8gR2V0IHRoZSBjb3VudCBvZiBwYWlyd2lzZSBjaXBoZXIKLQlhY291bnQgPSBjcHUybGUxNihwQWttLT5hY291bnQpOwotCWlmIChhY291bnQgPiAyKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgY291bnQoJWQpIG9mIEFLTSBpcyBpbnZsYWlkXG4iLAotCQkJCQkJCQkJCV9fRlVOQ1RJT05fXywgYWNvdW50KSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8vIEdldCB0aGUgQUtNIHN1aXRlCi0JaWYgKHR5cGUgPT0gQUtNX1NVSVRFKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgOiBUaGUgY291bnQgb2YgQUtNIGlzICVkXG4iLAotCQkJCQkJCQkJX19GVU5DVElPTl9fLCBhY291bnQpKTsKLQkJKmNvdW50ID0gYWNvdW50OwotCQlyZXR1cm4gcEFrbS0+YXV0aFswXS5vdWk7Ci0JfQotCW9mZnNldCA9IHNpemVvZihSU05JRV9BVVRIKSArICg0ICogKGFjb3VudCAtIDEpKTsKLQotCXBCdWYgKz0gb2Zmc2V0OwotCWxlbiAtPSBvZmZzZXQ7Ci0KLQkvLyBUaGUgcmVtYWluaW5nIGxlbmd0aCBtdXN0IGxhcmdlciB0aGFuIChSU04tQ2FwYWJpbGl0eSgyKSArIFBNS0lELUNvdW50KDIpICsgUE1LSUQoMTZ+KSkKLQlpZiAobGVuID49IChzaXplb2YoUlNOX0NBUEFCSUxJVElFUykgKyAyICsgTEVOX1BNS0lEKSkKLQl7Ci0JCS8vIFNraXAgUlNOIGNhcGFiaWxpdHkgYW5kIFBNS0lELUNvdW50Ci0JCXBCdWYgKz0gKHNpemVvZihSU05fQ0FQQUJJTElUSUVTKSArIDIpOwotCQlsZW4gLT0gKHNpemVvZihSU05fQ0FQQUJJTElUSUVTKSArIDIpOwotCi0JCS8vIEdldCBQTUtJRAotCQlpZiAodHlwZSA9PSBQTUtJRF9MSVNUKQotCQl7Ci0JCQkqY291bnQgPSAxOwotCQkJcmV0dXJuIHBCdWY7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlRfRVJSKCgiJXMgOiBpdCBjYW4ndCBnZXQgYW55IG1vcmUgaW5mb3JtYXRpb24gYmV5b25kIEFLTSBcbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkqY291bnQgPSAwOwotCS8vREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgdHlwZSglZCkgZG9lc24ndCBzdXBwb3J0IFxuIiwgX19GVU5DVElPTl9fLCB0eXBlKSk7Ci0JcmV0dXJuIE5VTEw7Ci0KLX0KLQotVk9JRCBXcGFTaG93QWxsc3VpdGUoCi0JSU4JUFVJTlQ4CXJzbmllLAotCUlOCVVJTlQJcnNuaWVfbGVuKQotewotCVBVSU5UOCBwU3VpdGUgPSBOVUxMOwotCVVJTlQ4IGNvdW50OwotCi0JaGV4X2R1bXAoIlJTTklFIiwgcnNuaWUsIHJzbmllX2xlbik7Ci0KLQkvLyBncm91cCBjaXBoZXIKLQlpZiAoKHBTdWl0ZSA9IEdldFN1aXRlRnJvbVJTTklFKHJzbmllLCByc25pZV9sZW4sIEdST1VQX1NVSVRFLCAmY291bnQpKSAhPSBOVUxMKQotCXsKLQkJaGV4X2R1bXAoImdyb3VwIGNpcGhlciIsIHBTdWl0ZSwgNCpjb3VudCk7Ci0JfQotCi0JLy8gcGFpcndpc2UgY2lwaGVyCi0JaWYgKChwU3VpdGUgPSBHZXRTdWl0ZUZyb21SU05JRShyc25pZSwgcnNuaWVfbGVuLCBQQUlSV0lTRV9TVUlURSwgJmNvdW50KSkgIT0gTlVMTCkKLQl7Ci0JCWhleF9kdW1wKCJwYWlyd2lzZSBjaXBoZXIiLCBwU3VpdGUsIDQqY291bnQpOwotCX0KLQotCS8vIEFLTQotCWlmICgocFN1aXRlID0gR2V0U3VpdGVGcm9tUlNOSUUocnNuaWUsIHJzbmllX2xlbiwgQUtNX1NVSVRFLCAmY291bnQpKSAhPSBOVUxMKQotCXsKLQkJaGV4X2R1bXAoIkFLTSBzdWl0ZSIsIHBTdWl0ZSwgNCpjb3VudCk7Ci0JfQotCi0JLy8gUE1LSUQKLQlpZiAoKHBTdWl0ZSA9IEdldFN1aXRlRnJvbVJTTklFKHJzbmllLCByc25pZV9sZW4sIFBNS0lEX0xJU1QsICZjb3VudCkpICE9IE5VTEwpCi0JewotCQloZXhfZHVtcCgiUE1LSUQiLCBwU3VpdGUsIExFTl9QTUtJRCk7Ci0JfQotCi19Ci0KLVZPSUQgUlRNUEluc2VydFJTTklFKAotCUlOIFBVQ0hBUiBwRnJhbWVCdWYsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4sCi0JSU4gUFVJTlQ4IHJzbmllX3B0ciwKLQlJTiBVSU5UOCAgcnNuaWVfbGVuLAotCUlOIFBVSU5UOCBwbWtpZF9wdHIsCi0JSU4gVUlOVDggIHBta2lkX2xlbikKLXsKLQlQVUNIQVIJcFRtcEJ1ZjsKLQlVTE9ORwlUZW1wTGVuID0gMDsKLQlVSU5UOAlleHRyYV9sZW4gPSAwOwotCVVJTlQxNglwbWtfY291bnQgPSAwOwotCVVDSEFSCWllX251bTsKLQlVSU5UOAl0b3RhbF9sZW4gPSAwOwotICAgIFVDSEFSCVdQQTJfT1VJWzNdPXsweDAwLDB4MEYsMHhBQ307Ci0KLQlwVG1wQnVmID0gcEZyYW1lQnVmOwotCi0JLyogUE1LSUQtTGlzdCBNdXN0IGxhcmdlciB0aGFuIDAgYW5kIHRoZSBtdWx0aXBsZSBvZiAxNi4gKi8KLQlpZiAocG1raWRfbGVuID4gMCAmJiAoKHBta2lkX2xlbiAmIDB4MGYpID09IDApKQotCXsKLQkJZXh0cmFfbGVuID0gc2l6ZW9mKFVJTlQxNikgKyBwbWtpZF9sZW47Ci0KLQkJcG1rX2NvdW50ID0gKHBta2lkX2xlbiA+PiA0KTsKLQkJcG1rX2NvdW50ID0gY3B1MmxlMTYocG1rX2NvdW50KTsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCIlcyA6IFRoZSBsZW5ndGggaXMgUE1LSUQtTGlzdCBpcyBpbnZhbGlkICglZCksIHNvIGRvbid0IGluc2VydCBpdC5cbiIsCi0JCQkJCQkJCQlfX0ZVTkNUSU9OX18sIHBta2lkX2xlbikpOwotCX0KLQotCWlmIChyc25pZV9sZW4gIT0gMCkKLQl7Ci0JCWllX251bSA9IElFX1dQQTsKLQkJdG90YWxfbGVuID0gcnNuaWVfbGVuOwotCi0JCWlmIChOZGlzRXF1YWxNZW1vcnkocnNuaWVfcHRyICsgMiwgV1BBMl9PVUksIHNpemVvZihXUEEyX09VSSkpKQotCQl7Ci0JCQlpZV9udW0gPSBJRV9SU047Ci0JCQl0b3RhbF9sZW4gKz0gZXh0cmFfbGVuOwotCQl9Ci0KLQkJLyogY29uc3RydWN0IFJTTklFIGJvZHkgKi8KLQkJTWFrZU91dGdvaW5nRnJhbWUocFRtcEJ1ZiwJCQkmVGVtcExlbiwKLQkJCQkJCSAgMSwJCQkJJmllX251bSwKLQkJCQkJCSAgMSwJCQkJJnRvdGFsX2xlbiwKLQkJCQkJCSAgcnNuaWVfbGVuLAkJcnNuaWVfcHRyLAotCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0KLQkJcFRtcEJ1ZiArPSBUZW1wTGVuOwotCQkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47Ci0KLQkJaWYgKGllX251bSA9PSBJRV9SU04pCi0JCXsKLQkJCS8qIEluc2VydCBQTUtJRC1MaXN0IGZpZWxkICovCi0JCQlpZiAoZXh0cmFfbGVuID4gMCkKLQkJCXsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwVG1wQnVmLAkJCQkJJlRlbXBMZW4sCi0JCQkJCQkJCSAgMiwJCQkJCQkmcG1rX2NvdW50LAotCQkJCQkJCQkgIHBta2lkX2xlbiwJCQkJcG1raWRfcHRyLAotCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQotCQkJCXBUbXBCdWYgKz0gVGVtcExlbjsKLQkJCQkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm47Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9hZXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X2Flcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDAwZjFlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X2Flcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAwNyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCWNyeXB0X2Flcy5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIEVkZHkgICAgICAgIDIwMDkvMDEvMTkgICAgICBDcmVhdGUgQUVTLTEyOCwgQUVTLTE5MiwgQUVTLTI1NiwgQUVTLUNCQwotKi8KLQotI2luY2x1ZGUgImNyeXB0X2Flcy5oIgotCi0vKiBUaGUgdmFsdWUgZ2l2ZW4gYnkgW3heKGktMSksezAwfSx7MDB9LHswMH1dLCB3aXRoIHheKGktMSkgYmVpbmcgcG93ZXJzIG9mIHggaW4gdGhlIGZpZWxkIEdGKDJeOCkuICovCi1zdGF0aWMgY29uc3QgVUlOVDMyIGFlc19yY29uW10gPSB7Ci0JMHgwMDAwMDAwMCwgMHgwMTAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwNDAwMDAwMCwKLSAgICAweDA4MDAwMDAwLCAweDEwMDAwMDAwLCAweDIwMDAwMDAwLCAweDQwMDAwMDAwLAotICAgIDB4ODAwMDAwMDAsIDB4MUIwMDAwMDAsIDB4MzYwMDAwMDB9OwotCi1zdGF0aWMgY29uc3QgVUlOVDggYWVzX3Nib3hfZW5jW10gPSB7Ci0gIC8qICAwICAgICAxICAgICAyICAgICAzICAgICA0ICAgICA1ICAgICA2ICAgICA3ICAgICA4ICAgICA5ICAgICBhICAgICBiICAgICBjICAgICBkICAgICBlICAgICBmICAgICovCi0gICAgMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSwgMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNyAsMHhhYiwgMHg3NiwgLyogMCAqLwotICAgIDB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAsIDB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQgLDB4NzIsIDB4YzAsIC8qIDEgKi8KLSAgICAweGI3LCAweGZkLCAweDkzLCAweDI2LCAweDM2LCAweDNmLCAweGY3LCAweGNjLCAweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4ICwweDMxLCAweDE1LCAvKiAyICovCi0gICAgMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YSwgMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNyAsMHhiMiwgMHg3NSwgLyogMyAqLwotICAgIDB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTAsIDB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMgLDB4MmYsIDB4ODQsIC8qIDQgKi8KLSAgICAweDUzLCAweGQxLCAweDAwLCAweGVkLCAweDIwLCAweGZjLCAweGIxLCAweDViLCAweDZhLCAweGNiLCAweGJlLCAweDM5LCAweDRhLCAweDRjICwweDU4LCAweGNmLCAvKiA1ICovCi0gICAgMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NSwgMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYyAsMHg5ZiwgMHhhOCwgLyogNiAqLwotICAgIDB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUsIDB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYgLDB4ZjMsIDB4ZDIsIC8qIDcgKi8KLSAgICAweGNkLCAweDBjLCAweDEzLCAweGVjLCAweDVmLCAweDk3LCAweDQ0LCAweDE3LCAweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkICwweDE5LCAweDczLCAvKiA4ICovCi0gICAgMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCwgMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSAsMHgwYiwgMHhkYiwgLyogOSAqLwotICAgIDB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMsIDB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUgLDB4ZTQsIDB4NzksIC8qIGEgKi8KLSAgICAweGU3LCAweGM4LCAweDM3LCAweDZkLCAweDhkLCAweGQ1LCAweDRlLCAweGE5LCAweDZjLCAweDU2LCAweGY0LCAweGVhLCAweDY1LCAweDdhICwweGFlLCAweDA4LCAvKiBiICovCi0gICAgMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNiwgMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCAsMHg4YiwgMHg4YSwgLyogYyAqLwotICAgIDB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUsIDB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEgLDB4MWQsIDB4OWUsIC8qIGQgKi8KLSAgICAweGUxLCAweGY4LCAweDk4LCAweDExLCAweDY5LCAweGQ5LCAweDhlLCAweDk0LCAweDliLCAweDFlLCAweDg3LCAweGU5LCAweGNlLCAweDU1ICwweDI4LCAweGRmLCAvKiBlICovCi0gICAgMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OCwgMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCAsMHhiYiwgMHgxNiwgLyogZiAqLwotfTsKLQotc3RhdGljIGNvbnN0IFVJTlQ4IGFlc19zYm94X2RlY1tdID0gewotICAvKiAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAgICAgOCAgICAgOSAgICAgYSAgICAgYiAgICAgYyAgICAgZCAgICAgZSAgICAgZiAgICAqLwotICAgIDB4NTIsIDB4MDksIDB4NmEsIDB4ZDUsIDB4MzAsIDB4MzYsIDB4YTUsIDB4MzgsIDB4YmYsIDB4NDAsIDB4YTMsIDB4OWUsIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIsIC8qIDAgKi8KLSAgICAweDdjLCAweGUzLCAweDM5LCAweDgyLCAweDliLCAweDJmLCAweGZmLCAweDg3LCAweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiLCAvKiAxICovCi0gICAgMHg1NCwgMHg3YiwgMHg5NCwgMHgzMiwgMHhhNiwgMHhjMiwgMHgyMywgMHgzZCwgMHhlZSwgMHg0YywgMHg5NSwgMHgwYiwgMHg0MiwgMHhmYSwgMHhjMywgMHg0ZSwgLyogMiAqLwotICAgIDB4MDgsIDB4MmUsIDB4YTEsIDB4NjYsIDB4MjgsIDB4ZDksIDB4MjQsIDB4YjIsIDB4NzYsIDB4NWIsIDB4YTIsIDB4NDksIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUsIC8qIDMgKi8KLSAgICAweDcyLCAweGY4LCAweGY2LCAweDY0LCAweDg2LCAweDY4LCAweDk4LCAweDE2LCAweGQ0LCAweGE0LCAweDVjLCAweGNjLCAweDVkLCAweDY1LCAweGI2LCAweDkyLCAvKiA0ICovCi0gICAgMHg2YywgMHg3MCwgMHg0OCwgMHg1MCwgMHhmZCwgMHhlZCwgMHhiOSwgMHhkYSwgMHg1ZSwgMHgxNSwgMHg0NiwgMHg1NywgMHhhNywgMHg4ZCwgMHg5ZCwgMHg4NCwgLyogNSAqLwotICAgIDB4OTAsIDB4ZDgsIDB4YWIsIDB4MDAsIDB4OGMsIDB4YmMsIDB4ZDMsIDB4MGEsIDB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsIDB4YjgsIDB4YjMsIDB4NDUsIDB4MDYsIC8qIDYgKi8KLSAgICAweGQwLCAweDJjLCAweDFlLCAweDhmLCAweGNhLCAweDNmLCAweDBmLCAweDAyLCAweGMxLCAweGFmLCAweGJkLCAweDAzLCAweDAxLCAweDEzLCAweDhhLCAweDZiLCAvKiA3ICovCi0gICAgMHgzYSwgMHg5MSwgMHgxMSwgMHg0MSwgMHg0ZiwgMHg2NywgMHhkYywgMHhlYSwgMHg5NywgMHhmMiwgMHhjZiwgMHhjZSwgMHhmMCwgMHhiNCwgMHhlNiwgMHg3MywgLyogOCAqLwotICAgIDB4OTYsIDB4YWMsIDB4NzQsIDB4MjIsIDB4ZTcsIDB4YWQsIDB4MzUsIDB4ODUsIDB4ZTIsIDB4ZjksIDB4MzcsIDB4ZTgsIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUsIC8qIDkgKi8KLSAgICAweDQ3LCAweGYxLCAweDFhLCAweDcxLCAweDFkLCAweDI5LCAweGM1LCAweDg5LCAweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiLCAvKiBhICovCi0gICAgMHhmYywgMHg1NiwgMHgzZSwgMHg0YiwgMHhjNiwgMHhkMiwgMHg3OSwgMHgyMCwgMHg5YSwgMHhkYiwgMHhjMCwgMHhmZSwgMHg3OCwgMHhjZCwgMHg1YSwgMHhmNCwgLyogYiAqLwotICAgIDB4MWYsIDB4ZGQsIDB4YTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4YzcsIDB4MzEsIDB4YjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYsIC8qIGMgKi8KLSAgICAweDYwLCAweDUxLCAweDdmLCAweGE5LCAweDE5LCAweGI1LCAweDRhLCAweDBkLCAweDJkLCAweGU1LCAweDdhLCAweDlmLCAweDkzLCAweGM5LCAweDljLCAweGVmLCAvKiBkICovCi0gICAgMHhhMCwgMHhlMCwgMHgzYiwgMHg0ZCwgMHhhZSwgMHgyYSwgMHhmNSwgMHhiMCwgMHhjOCwgMHhlYiwgMHhiYiwgMHgzYywgMHg4MywgMHg1MywgMHg5OSwgMHg2MSwgLyogZSAqLwotICAgIDB4MTcsIDB4MmIsIDB4MDQsIDB4N2UsIDB4YmEsIDB4NzcsIDB4ZDYsIDB4MjYsIDB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MGMsIDB4N2QsIC8qIGYgKi8KLX07Ci0KLS8qIEFycmF5SW5kZXgqezAyfSAqLwotc3RhdGljIGNvbnN0IFVJTlQ4IGFlc19tdWxfMltdID0gewotICAvKiAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAgICAgOCAgICAgOSAgICAgYSAgICAgYiAgICAgYyAgICAgZCAgICAgZSAgICAgZiAgICAqLwotICAgIDB4MDAsIDB4MDIsIDB4MDQsIDB4MDYsIDB4MDgsIDB4MGEsIDB4MGMsIDB4MGUsIDB4MTAsIDB4MTIsIDB4MTQsIDB4MTYsIDB4MTgsIDB4MWEsIDB4MWMsIDB4MWUsIC8qIDAgKi8KLSAgICAweDIwLCAweDIyLCAweDI0LCAweDI2LCAweDI4LCAweDJhLCAweDJjLCAweDJlLCAweDMwLCAweDMyLCAweDM0LCAweDM2LCAweDM4LCAweDNhLCAweDNjLCAweDNlLCAvKiAxICovCi0gICAgMHg0MCwgMHg0MiwgMHg0NCwgMHg0NiwgMHg0OCwgMHg0YSwgMHg0YywgMHg0ZSwgMHg1MCwgMHg1MiwgMHg1NCwgMHg1NiwgMHg1OCwgMHg1YSwgMHg1YywgMHg1ZSwgLyogMiAqLwotICAgIDB4NjAsIDB4NjIsIDB4NjQsIDB4NjYsIDB4NjgsIDB4NmEsIDB4NmMsIDB4NmUsIDB4NzAsIDB4NzIsIDB4NzQsIDB4NzYsIDB4NzgsIDB4N2EsIDB4N2MsIDB4N2UsIC8qIDMgKi8KLSAgICAweDgwLCAweDgyLCAweDg0LCAweDg2LCAweDg4LCAweDhhLCAweDhjLCAweDhlLCAweDkwLCAweDkyLCAweDk0LCAweDk2LCAweDk4LCAweDlhLCAweDljLCAweDllLCAvKiA0ICovCi0gICAgMHhhMCwgMHhhMiwgMHhhNCwgMHhhNiwgMHhhOCwgMHhhYSwgMHhhYywgMHhhZSwgMHhiMCwgMHhiMiwgMHhiNCwgMHhiNiwgMHhiOCwgMHhiYSwgMHhiYywgMHhiZSwgLyogNSAqLwotICAgIDB4YzAsIDB4YzIsIDB4YzQsIDB4YzYsIDB4YzgsIDB4Y2EsIDB4Y2MsIDB4Y2UsIDB4ZDAsIDB4ZDIsIDB4ZDQsIDB4ZDYsIDB4ZDgsIDB4ZGEsIDB4ZGMsIDB4ZGUsIC8qIDYgKi8KLSAgICAweGUwLCAweGUyLCAweGU0LCAweGU2LCAweGU4LCAweGVhLCAweGVjLCAweGVlLCAweGYwLCAweGYyLCAweGY0LCAweGY2LCAweGY4LCAweGZhLCAweGZjLCAweGZlLCAvKiA3ICovCi0gICAgMHgxYiwgMHgxOSwgMHgxZiwgMHgxZCwgMHgxMywgMHgxMSwgMHgxNywgMHgxNSwgMHgwYiwgMHgwOSwgMHgwZiwgMHgwZCwgMHgwMywgMHgwMSwgMHgwNywgMHgwNSwgLyogOCAqLwotICAgIDB4M2IsIDB4MzksIDB4M2YsIDB4M2QsIDB4MzMsIDB4MzEsIDB4MzcsIDB4MzUsIDB4MmIsIDB4MjksIDB4MmYsIDB4MmQsIDB4MjMsIDB4MjEsIDB4MjcsIDB4MjUsIC8qIDkgKi8KLSAgICAweDViLCAweDU5LCAweDVmLCAweDVkLCAweDUzLCAweDUxLCAweDU3LCAweDU1LCAweDRiLCAweDQ5LCAweDRmLCAweDRkLCAweDQzLCAweDQxLCAweDQ3LCAweDQ1LCAvKiBhICovCi0gICAgMHg3YiwgMHg3OSwgMHg3ZiwgMHg3ZCwgMHg3MywgMHg3MSwgMHg3NywgMHg3NSwgMHg2YiwgMHg2OSwgMHg2ZiwgMHg2ZCwgMHg2MywgMHg2MSwgMHg2NywgMHg2NSwgLyogYiAqLwotICAgIDB4OWIsIDB4OTksIDB4OWYsIDB4OWQsIDB4OTMsIDB4OTEsIDB4OTcsIDB4OTUsIDB4OGIsIDB4ODksIDB4OGYsIDB4OGQsIDB4ODMsIDB4ODEsIDB4ODcsIDB4ODUsIC8qIGMgKi8KLSAgICAweGJiLCAweGI5LCAweGJmLCAweGJkLCAweGIzLCAweGIxLCAweGI3LCAweGI1LCAweGFiLCAweGE5LCAweGFmLCAweGFkLCAweGEzLCAweGExLCAweGE3LCAweGE1LCAvKiBkICovCi0gICAgMHhkYiwgMHhkOSwgMHhkZiwgMHhkZCwgMHhkMywgMHhkMSwgMHhkNywgMHhkNSwgMHhjYiwgMHhjOSwgMHhjZiwgMHhjZCwgMHhjMywgMHhjMSwgMHhjNywgMHhjNSwgLyogZSAqLwotICAgIDB4ZmIsIDB4ZjksIDB4ZmYsIDB4ZmQsIDB4ZjMsIDB4ZjEsIDB4ZjcsIDB4ZjUsIDB4ZWIsIDB4ZTksIDB4ZWYsIDB4ZWQsIDB4ZTMsIDB4ZTEsIDB4ZTcsIDB4ZTUsIC8qIGYgKi8KLX07Ci0KLS8qIEFycmF5SW5kZXgqezAzfSAqLwotc3RhdGljIGNvbnN0IFVJTlQ4IGFlc19tdWxfM1tdID0gewotICAvKiAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAgICAgOCAgICAgOSAgICAgYSAgICAgYiAgICAgYyAgICAgZCAgICAgZSAgICAgZiAgICAqLwotICAgIDB4MDAsIDB4MDMsIDB4MDYsIDB4MDUsIDB4MGMsIDB4MGYsIDB4MGEsIDB4MDksIDB4MTgsIDB4MWIsIDB4MWUsIDB4MWQsIDB4MTQsIDB4MTcsIDB4MTIsIDB4MTEsIC8qIDAgKi8KLSAgICAweDMwLCAweDMzLCAweDM2LCAweDM1LCAweDNjLCAweDNmLCAweDNhLCAweDM5LCAweDI4LCAweDJiLCAweDJlLCAweDJkLCAweDI0LCAweDI3LCAweDIyLCAweDIxLCAvKiAxICovCi0gICAgMHg2MCwgMHg2MywgMHg2NiwgMHg2NSwgMHg2YywgMHg2ZiwgMHg2YSwgMHg2OSwgMHg3OCwgMHg3YiwgMHg3ZSwgMHg3ZCwgMHg3NCwgMHg3NywgMHg3MiwgMHg3MSwgLyogMiAqLwotICAgIDB4NTAsIDB4NTMsIDB4NTYsIDB4NTUsIDB4NWMsIDB4NWYsIDB4NWEsIDB4NTksIDB4NDgsIDB4NGIsIDB4NGUsIDB4NGQsIDB4NDQsIDB4NDcsIDB4NDIsIDB4NDEsIC8qIDMgKi8KLSAgICAweGMwLCAweGMzLCAweGM2LCAweGM1LCAweGNjLCAweGNmLCAweGNhLCAweGM5LCAweGQ4LCAweGRiLCAweGRlLCAweGRkLCAweGQ0LCAweGQ3LCAweGQyLCAweGQxLCAvKiA0ICovCi0gICAgMHhmMCwgMHhmMywgMHhmNiwgMHhmNSwgMHhmYywgMHhmZiwgMHhmYSwgMHhmOSwgMHhlOCwgMHhlYiwgMHhlZSwgMHhlZCwgMHhlNCwgMHhlNywgMHhlMiwgMHhlMSwgLyogNSAqLwotICAgIDB4YTAsIDB4YTMsIDB4YTYsIDB4YTUsIDB4YWMsIDB4YWYsIDB4YWEsIDB4YTksIDB4YjgsIDB4YmIsIDB4YmUsIDB4YmQsIDB4YjQsIDB4YjcsIDB4YjIsIDB4YjEsIC8qIDYgKi8KLSAgICAweDkwLCAweDkzLCAweDk2LCAweDk1LCAweDljLCAweDlmLCAweDlhLCAweDk5LCAweDg4LCAweDhiLCAweDhlLCAweDhkLCAweDg0LCAweDg3LCAweDgyLCAweDgxLCAvKiA3ICovCi0gICAgMHg5YiwgMHg5OCwgMHg5ZCwgMHg5ZSwgMHg5NywgMHg5NCwgMHg5MSwgMHg5MiwgMHg4MywgMHg4MCwgMHg4NSwgMHg4NiwgMHg4ZiwgMHg4YywgMHg4OSwgMHg4YSwgLyogOCAqLwotICAgIDB4YWIsIDB4YTgsIDB4YWQsIDB4YWUsIDB4YTcsIDB4YTQsIDB4YTEsIDB4YTIsIDB4YjMsIDB4YjAsIDB4YjUsIDB4YjYsIDB4YmYsIDB4YmMsIDB4YjksIDB4YmEsIC8qIDkgKi8KLSAgICAweGZiLCAweGY4LCAweGZkLCAweGZlLCAweGY3LCAweGY0LCAweGYxLCAweGYyLCAweGUzLCAweGUwLCAweGU1LCAweGU2LCAweGVmLCAweGVjLCAweGU5LCAweGVhLCAvKiBhICovCi0gICAgMHhjYiwgMHhjOCwgMHhjZCwgMHhjZSwgMHhjNywgMHhjNCwgMHhjMSwgMHhjMiwgMHhkMywgMHhkMCwgMHhkNSwgMHhkNiwgMHhkZiwgMHhkYywgMHhkOSwgMHhkYSwgLyogYiAqLwotICAgIDB4NWIsIDB4NTgsIDB4NWQsIDB4NWUsIDB4NTcsIDB4NTQsIDB4NTEsIDB4NTIsIDB4NDMsIDB4NDAsIDB4NDUsIDB4NDYsIDB4NGYsIDB4NGMsIDB4NDksIDB4NGEsIC8qIGMgKi8KLSAgICAweDZiLCAweDY4LCAweDZkLCAweDZlLCAweDY3LCAweDY0LCAweDYxLCAweDYyLCAweDczLCAweDcwLCAweDc1LCAweDc2LCAweDdmLCAweDdjLCAweDc5LCAweDdhLCAvKiBkICovCi0gICAgMHgzYiwgMHgzOCwgMHgzZCwgMHgzZSwgMHgzNywgMHgzNCwgMHgzMSwgMHgzMiwgMHgyMywgMHgyMCwgMHgyNSwgMHgyNiwgMHgyZiwgMHgyYywgMHgyOSwgMHgyYSwgLyogZSAqLwotICAgIDB4MGIsIDB4MDgsIDB4MGQsIDB4MGUsIDB4MDcsIDB4MDQsIDB4MDEsIDB4MDIsIDB4MTMsIDB4MTAsIDB4MTUsIDB4MTYsIDB4MWYsIDB4MWMsIDB4MTksIDB4MWEsIC8qIGYgKi8KLX07Ci0KLS8qIEFycmF5SW5kZXgqezA5fSAqLwotc3RhdGljIGNvbnN0IFVJTlQ4IGFlc19tdWxfOVtdID0gewotICAvKiAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAgICAgOCAgICAgOSAgICAgYSAgICAgYiAgICAgYyAgICAgZCAgICAgZSAgICAgZiAgICAqLwotICAgIDB4MDAsIDB4MDksIDB4MTIsIDB4MWIsIDB4MjQsIDB4MmQsIDB4MzYsIDB4M2YsIDB4NDgsIDB4NDEsIDB4NWEsIDB4NTMsIDB4NmMsIDB4NjUsIDB4N2UsIDB4NzcsIC8qIDAgKi8KLSAgICAweDkwLCAweDk5LCAweDgyLCAweDhiLCAweGI0LCAweGJkLCAweGE2LCAweGFmLCAweGQ4LCAweGQxLCAweGNhLCAweGMzLCAweGZjLCAweGY1LCAweGVlLCAweGU3LCAvKiAxICovCi0gICAgMHgzYiwgMHgzMiwgMHgyOSwgMHgyMCwgMHgxZiwgMHgxNiwgMHgwZCwgMHgwNCwgMHg3MywgMHg3YSwgMHg2MSwgMHg2OCwgMHg1NywgMHg1ZSwgMHg0NSwgMHg0YywgLyogMiAqLwotICAgIDB4YWIsIDB4YTIsIDB4YjksIDB4YjAsIDB4OGYsIDB4ODYsIDB4OWQsIDB4OTQsIDB4ZTMsIDB4ZWEsIDB4ZjEsIDB4ZjgsIDB4YzcsIDB4Y2UsIDB4ZDUsIDB4ZGMsIC8qIDMgKi8KLSAgICAweDc2LCAweDdmLCAweDY0LCAweDZkLCAweDUyLCAweDViLCAweDQwLCAweDQ5LCAweDNlLCAweDM3LCAweDJjLCAweDI1LCAweDFhLCAweDEzLCAweDA4LCAweDAxLCAvKiA0ICovCi0gICAgMHhlNiwgMHhlZiwgMHhmNCwgMHhmZCwgMHhjMiwgMHhjYiwgMHhkMCwgMHhkOSwgMHhhZSwgMHhhNywgMHhiYywgMHhiNSwgMHg4YSwgMHg4MywgMHg5OCwgMHg5MSwgLyogNSAqLwotICAgIDB4NGQsIDB4NDQsIDB4NWYsIDB4NTYsIDB4NjksIDB4NjAsIDB4N2IsIDB4NzIsIDB4MDUsIDB4MGMsIDB4MTcsIDB4MWUsIDB4MjEsIDB4MjgsIDB4MzMsIDB4M2EsIC8qIDYgKi8KLSAgICAweGRkLCAweGQ0LCAweGNmLCAweGM2LCAweGY5LCAweGYwLCAweGViLCAweGUyLCAweDk1LCAweDljLCAweDg3LCAweDhlLCAweGIxLCAweGI4LCAweGEzLCAweGFhLCAvKiA3ICovCi0gICAgMHhlYywgMHhlNSwgMHhmZSwgMHhmNywgMHhjOCwgMHhjMSwgMHhkYSwgMHhkMywgMHhhNCwgMHhhZCwgMHhiNiwgMHhiZiwgMHg4MCwgMHg4OSwgMHg5MiwgMHg5YiwgLyogOCAqLwotICAgIDB4N2MsIDB4NzUsIDB4NmUsIDB4NjcsIDB4NTgsIDB4NTEsIDB4NGEsIDB4NDMsIDB4MzQsIDB4M2QsIDB4MjYsIDB4MmYsIDB4MTAsIDB4MTksIDB4MDIsIDB4MGIsIC8qIDkgKi8KLSAgICAweGQ3LCAweGRlLCAweGM1LCAweGNjLCAweGYzLCAweGZhLCAweGUxLCAweGU4LCAweDlmLCAweDk2LCAweDhkLCAweDg0LCAweGJiLCAweGIyLCAweGE5LCAweGEwLCAvKiBhICovCi0gICAgMHg0NywgMHg0ZSwgMHg1NSwgMHg1YywgMHg2MywgMHg2YSwgMHg3MSwgMHg3OCwgMHgwZiwgMHgwNiwgMHgxZCwgMHgxNCwgMHgyYiwgMHgyMiwgMHgzOSwgMHgzMCwgLyogYiAqLwotICAgIDB4OWEsIDB4OTMsIDB4ODgsIDB4ODEsIDB4YmUsIDB4YjcsIDB4YWMsIDB4YTUsIDB4ZDIsIDB4ZGIsIDB4YzAsIDB4YzksIDB4ZjYsIDB4ZmYsIDB4ZTQsIDB4ZWQsIC8qIGMgKi8KLSAgICAweDBhLCAweDAzLCAweDE4LCAweDExLCAweDJlLCAweDI3LCAweDNjLCAweDM1LCAweDQyLCAweDRiLCAweDUwLCAweDU5LCAweDY2LCAweDZmLCAweDc0LCAweDdkLCAvKiBkICovCi0gICAgMHhhMSwgMHhhOCwgMHhiMywgMHhiYSwgMHg4NSwgMHg4YywgMHg5NywgMHg5ZSwgMHhlOSwgMHhlMCwgMHhmYiwgMHhmMiwgMHhjZCwgMHhjNCwgMHhkZiwgMHhkNiwgLyogZSAqLwotICAgIDB4MzEsIDB4MzgsIDB4MjMsIDB4MmEsIDB4MTUsIDB4MWMsIDB4MDcsIDB4MGUsIDB4NzksIDB4NzAsIDB4NmIsIDB4NjIsIDB4NWQsIDB4NTQsIDB4NGYsIDB4NDYsIC8qIGYgKi8KLX07Ci0KLS8qIEFycmF5SW5kZXgqezBifSAqLwotc3RhdGljIGNvbnN0IFVJTlQ4IGFlc19tdWxfYltdID0gewotICAvKiAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAgICAgOCAgICAgOSAgICAgYSAgICAgYiAgICAgYyAgICAgZCAgICAgZSAgICAgZiAgICAqLwotICAgIDB4MDAsIDB4MGIsIDB4MTYsIDB4MWQsIDB4MmMsIDB4MjcsIDB4M2EsIDB4MzEsIDB4NTgsIDB4NTMsIDB4NGUsIDB4NDUsIDB4NzQsIDB4N2YsIDB4NjIsIDB4NjksIC8qIDAgKi8KLSAgICAweGIwLCAweGJiLCAweGE2LCAweGFkLCAweDljLCAweDk3LCAweDhhLCAweDgxLCAweGU4LCAweGUzLCAweGZlLCAweGY1LCAweGM0LCAweGNmLCAweGQyLCAweGQ5LCAvKiAxICovCi0gICAgMHg3YiwgMHg3MCwgMHg2ZCwgMHg2NiwgMHg1NywgMHg1YywgMHg0MSwgMHg0YSwgMHgyMywgMHgyOCwgMHgzNSwgMHgzZSwgMHgwZiwgMHgwNCwgMHgxOSwgMHgxMiwgLyogMiAqLwotICAgIDB4Y2IsIDB4YzAsIDB4ZGQsIDB4ZDYsIDB4ZTcsIDB4ZWMsIDB4ZjEsIDB4ZmEsIDB4OTMsIDB4OTgsIDB4ODUsIDB4OGUsIDB4YmYsIDB4YjQsIDB4YTksIDB4YTIsIC8qIDMgKi8KLSAgICAweGY2LCAweGZkLCAweGUwLCAweGViLCAweGRhLCAweGQxLCAweGNjLCAweGM3LCAweGFlLCAweGE1LCAweGI4LCAweGIzLCAweDgyLCAweDg5LCAweDk0LCAweDlmLCAvKiA0ICovCi0gICAgMHg0NiwgMHg0ZCwgMHg1MCwgMHg1YiwgMHg2YSwgMHg2MSwgMHg3YywgMHg3NywgMHgxZSwgMHgxNSwgMHgwOCwgMHgwMywgMHgzMiwgMHgzOSwgMHgyNCwgMHgyZiwgLyogNSAqLwotICAgIDB4OGQsIDB4ODYsIDB4OWIsIDB4OTAsIDB4YTEsIDB4YWEsIDB4YjcsIDB4YmMsIDB4ZDUsIDB4ZGUsIDB4YzMsIDB4YzgsIDB4ZjksIDB4ZjIsIDB4ZWYsIDB4ZTQsIC8qIDYgKi8KLSAgICAweDNkLCAweDM2LCAweDJiLCAweDIwLCAweDExLCAweDFhLCAweDA3LCAweDBjLCAweDY1LCAweDZlLCAweDczLCAweDc4LCAweDQ5LCAweDQyLCAweDVmLCAweDU0LCAvKiA3ICovCi0gICAgMHhmNywgMHhmYywgMHhlMSwgMHhlYSwgMHhkYiwgMHhkMCwgMHhjZCwgMHhjNiwgMHhhZiwgMHhhNCwgMHhiOSwgMHhiMiwgMHg4MywgMHg4OCwgMHg5NSwgMHg5ZSwgLyogOCAqLwotICAgIDB4NDcsIDB4NGMsIDB4NTEsIDB4NWEsIDB4NmIsIDB4NjAsIDB4N2QsIDB4NzYsIDB4MWYsIDB4MTQsIDB4MDksIDB4MDIsIDB4MzMsIDB4MzgsIDB4MjUsIDB4MmUsIC8qIDkgKi8KLSAgICAweDhjLCAweDg3LCAweDlhLCAweDkxLCAweGEwLCAweGFiLCAweGI2LCAweGJkLCAweGQ0LCAweGRmLCAweGMyLCAweGM5LCAweGY4LCAweGYzLCAweGVlLCAweGU1LCAvKiBhICovCi0gICAgMHgzYywgMHgzNywgMHgyYSwgMHgyMSwgMHgxMCwgMHgxYiwgMHgwNiwgMHgwZCwgMHg2NCwgMHg2ZiwgMHg3MiwgMHg3OSwgMHg0OCwgMHg0MywgMHg1ZSwgMHg1NSwgLyogYiAqLwotICAgIDB4MDEsIDB4MGEsIDB4MTcsIDB4MWMsIDB4MmQsIDB4MjYsIDB4M2IsIDB4MzAsIDB4NTksIDB4NTIsIDB4NGYsIDB4NDQsIDB4NzUsIDB4N2UsIDB4NjMsIDB4NjgsIC8qIGMgKi8KLSAgICAweGIxLCAweGJhLCAweGE3LCAweGFjLCAweDlkLCAweDk2LCAweDhiLCAweDgwLCAweGU5LCAweGUyLCAweGZmLCAweGY0LCAweGM1LCAweGNlLCAweGQzLCAweGQ4LCAvKiBkICovCi0gICAgMHg3YSwgMHg3MSwgMHg2YywgMHg2NywgMHg1NiwgMHg1ZCwgMHg0MCwgMHg0YiwgMHgyMiwgMHgyOSwgMHgzNCwgMHgzZiwgMHgwZSwgMHgwNSwgMHgxOCwgMHgxMywgLyogZSAqLwotICAgIDB4Y2EsIDB4YzEsIDB4ZGMsIDB4ZDcsIDB4ZTYsIDB4ZWQsIDB4ZjAsIDB4ZmIsIDB4OTIsIDB4OTksIDB4ODQsIDB4OGYsIDB4YmUsIDB4YjUsIDB4YTgsIDB4YTMsIC8qIGYgKi8KLX07Ci0KLS8qIEFycmF5SW5kZXgqezBkfSAqLwotc3RhdGljIGNvbnN0IFVJTlQ4IGFlc19tdWxfZFtdID0gewotICAvKiAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAgICAgOCAgICAgOSAgICAgYSAgICAgYiAgICAgYyAgICAgZCAgICAgZSAgICAgZiAgICAqLwotICAgIDB4MDAsIDB4MGQsIDB4MWEsIDB4MTcsIDB4MzQsIDB4MzksIDB4MmUsIDB4MjMsIDB4NjgsIDB4NjUsIDB4NzIsIDB4N2YsIDB4NWMsIDB4NTEsIDB4NDYsIDB4NGIsIC8qIDAgKi8KLSAgICAweGQwLCAweGRkLCAweGNhLCAweGM3LCAweGU0LCAweGU5LCAweGZlLCAweGYzLCAweGI4LCAweGI1LCAweGEyLCAweGFmLCAweDhjLCAweDgxLCAweDk2LCAweDliLCAvKiAxICovCi0gICAgMHhiYiwgMHhiNiwgMHhhMSwgMHhhYywgMHg4ZiwgMHg4MiwgMHg5NSwgMHg5OCwgMHhkMywgMHhkZSwgMHhjOSwgMHhjNCwgMHhlNywgMHhlYSwgMHhmZCwgMHhmMCwgLyogMiAqLwotICAgIDB4NmIsIDB4NjYsIDB4NzEsIDB4N2MsIDB4NWYsIDB4NTIsIDB4NDUsIDB4NDgsIDB4MDMsIDB4MGUsIDB4MTksIDB4MTQsIDB4MzcsIDB4M2EsIDB4MmQsIDB4MjAsIC8qIDMgKi8KLSAgICAweDZkLCAweDYwLCAweDc3LCAweDdhLCAweDU5LCAweDU0LCAweDQzLCAweDRlLCAweDA1LCAweDA4LCAweDFmLCAweDEyLCAweDMxLCAweDNjLCAweDJiLCAweDI2LCAvKiA0ICovCi0gICAgMHhiZCwgMHhiMCwgMHhhNywgMHhhYSwgMHg4OSwgMHg4NCwgMHg5MywgMHg5ZSwgMHhkNSwgMHhkOCwgMHhjZiwgMHhjMiwgMHhlMSwgMHhlYywgMHhmYiwgMHhmNiwgLyogNSAqLwotICAgIDB4ZDYsIDB4ZGIsIDB4Y2MsIDB4YzEsIDB4ZTIsIDB4ZWYsIDB4ZjgsIDB4ZjUsIDB4YmUsIDB4YjMsIDB4YTQsIDB4YTksIDB4OGEsIDB4ODcsIDB4OTAsIDB4OWQsIC8qIDYgKi8KLSAgICAweDA2LCAweDBiLCAweDFjLCAweDExLCAweDMyLCAweDNmLCAweDI4LCAweDI1LCAweDZlLCAweDYzLCAweDc0LCAweDc5LCAweDVhLCAweDU3LCAweDQwLCAweDRkLCAvKiA3ICovCi0gICAgMHhkYSwgMHhkNywgMHhjMCwgMHhjZCwgMHhlZSwgMHhlMywgMHhmNCwgMHhmOSwgMHhiMiwgMHhiZiwgMHhhOCwgMHhhNSwgMHg4NiwgMHg4YiwgMHg5YywgMHg5MSwgLyogOCAqLwotICAgIDB4MGEsIDB4MDcsIDB4MTAsIDB4MWQsIDB4M2UsIDB4MzMsIDB4MjQsIDB4MjksIDB4NjIsIDB4NmYsIDB4NzgsIDB4NzUsIDB4NTYsIDB4NWIsIDB4NGMsIDB4NDEsIC8qIDkgKi8KLSAgICAweDYxLCAweDZjLCAweDdiLCAweDc2LCAweDU1LCAweDU4LCAweDRmLCAweDQyLCAweDA5LCAweDA0LCAweDEzLCAweDFlLCAweDNkLCAweDMwLCAweDI3LCAweDJhLCAvKiBhICovCi0gICAgMHhiMSwgMHhiYywgMHhhYiwgMHhhNiwgMHg4NSwgMHg4OCwgMHg5ZiwgMHg5MiwgMHhkOSwgMHhkNCwgMHhjMywgMHhjZSwgMHhlZCwgMHhlMCwgMHhmNywgMHhmYSwgLyogYiAqLwotICAgIDB4YjcsIDB4YmEsIDB4YWQsIDB4YTAsIDB4ODMsIDB4OGUsIDB4OTksIDB4OTQsIDB4ZGYsIDB4ZDIsIDB4YzUsIDB4YzgsIDB4ZWIsIDB4ZTYsIDB4ZjEsIDB4ZmMsIC8qIGMgKi8KLSAgICAweDY3LCAweDZhLCAweDdkLCAweDcwLCAweDUzLCAweDVlLCAweDQ5LCAweDQ0LCAweDBmLCAweDAyLCAweDE1LCAweDE4LCAweDNiLCAweDM2LCAweDIxLCAweDJjLCAvKiBkICovCi0gICAgMHgwYywgMHgwMSwgMHgxNiwgMHgxYiwgMHgzOCwgMHgzNSwgMHgyMiwgMHgyZiwgMHg2NCwgMHg2OSwgMHg3ZSwgMHg3MywgMHg1MCwgMHg1ZCwgMHg0YSwgMHg0NywgLyogZSAqLwotICAgIDB4ZGMsIDB4ZDEsIDB4YzYsIDB4Y2IsIDB4ZTgsIDB4ZTUsIDB4ZjIsIDB4ZmYsIDB4YjQsIDB4YjksIDB4YWUsIDB4YTMsIDB4ODAsIDB4OGQsIDB4OWEsIDB4OTcsIC8qIGYgKi8KLX07Ci0KLS8qIEFycmF5SW5kZXgqezBlfSAqLwotc3RhdGljIGNvbnN0IFVJTlQ4IGFlc19tdWxfZVtdID0gewotICAvKiAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAgICAgOCAgICAgOSAgICAgYSAgICAgYiAgICAgYyAgICAgZCAgICAgZSAgICAgZiAgICAqLwotICAgIDB4MDAsIDB4MGUsIDB4MWMsIDB4MTIsIDB4MzgsIDB4MzYsIDB4MjQsIDB4MmEsIDB4NzAsIDB4N2UsIDB4NmMsIDB4NjIsIDB4NDgsIDB4NDYsIDB4NTQsIDB4NWEsIC8qIDAgKi8KLSAgICAweGUwLCAweGVlLCAweGZjLCAweGYyLCAweGQ4LCAweGQ2LCAweGM0LCAweGNhLCAweDkwLCAweDllLCAweDhjLCAweDgyLCAweGE4LCAweGE2LCAweGI0LCAweGJhLCAvKiAxICovCi0gICAgMHhkYiwgMHhkNSwgMHhjNywgMHhjOSwgMHhlMywgMHhlZCwgMHhmZiwgMHhmMSwgMHhhYiwgMHhhNSwgMHhiNywgMHhiOSwgMHg5MywgMHg5ZCwgMHg4ZiwgMHg4MSwgLyogMiAqLwotICAgIDB4M2IsIDB4MzUsIDB4MjcsIDB4MjksIDB4MDMsIDB4MGQsIDB4MWYsIDB4MTEsIDB4NGIsIDB4NDUsIDB4NTcsIDB4NTksIDB4NzMsIDB4N2QsIDB4NmYsIDB4NjEsIC8qIDMgKi8KLSAgICAweGFkLCAweGEzLCAweGIxLCAweGJmLCAweDk1LCAweDliLCAweDg5LCAweDg3LCAweGRkLCAweGQzLCAweGMxLCAweGNmLCAweGU1LCAweGViLCAweGY5LCAweGY3LCAvKiA0ICovCi0gICAgMHg0ZCwgMHg0MywgMHg1MSwgMHg1ZiwgMHg3NSwgMHg3YiwgMHg2OSwgMHg2NywgMHgzZCwgMHgzMywgMHgyMSwgMHgyZiwgMHgwNSwgMHgwYiwgMHgxOSwgMHgxNywgLyogNSAqLwotICAgIDB4NzYsIDB4NzgsIDB4NmEsIDB4NjQsIDB4NGUsIDB4NDAsIDB4NTIsIDB4NWMsIDB4MDYsIDB4MDgsIDB4MWEsIDB4MTQsIDB4M2UsIDB4MzAsIDB4MjIsIDB4MmMsIC8qIDYgKi8KLSAgICAweDk2LCAweDk4LCAweDhhLCAweDg0LCAweGFlLCAweGEwLCAweGIyLCAweGJjLCAweGU2LCAweGU4LCAweGZhLCAweGY0LCAweGRlLCAweGQwLCAweGMyLCAweGNjLCAvKiA3ICovCi0gICAgMHg0MSwgMHg0ZiwgMHg1ZCwgMHg1MywgMHg3OSwgMHg3NywgMHg2NSwgMHg2YiwgMHgzMSwgMHgzZiwgMHgyZCwgMHgyMywgMHgwOSwgMHgwNywgMHgxNSwgMHgxYiwgLyogOCAqLwotICAgIDB4YTEsIDB4YWYsIDB4YmQsIDB4YjMsIDB4OTksIDB4OTcsIDB4ODUsIDB4OGIsIDB4ZDEsIDB4ZGYsIDB4Y2QsIDB4YzMsIDB4ZTksIDB4ZTcsIDB4ZjUsIDB4ZmIsIC8qIDkgKi8KLSAgICAweDlhLCAweDk0LCAweDg2LCAweDg4LCAweGEyLCAweGFjLCAweGJlLCAweGIwLCAweGVhLCAweGU0LCAweGY2LCAweGY4LCAweGQyLCAweGRjLCAweGNlLCAweGMwLCAvKiBhICovCi0gICAgMHg3YSwgMHg3NCwgMHg2NiwgMHg2OCwgMHg0MiwgMHg0YywgMHg1ZSwgMHg1MCwgMHgwYSwgMHgwNCwgMHgxNiwgMHgxOCwgMHgzMiwgMHgzYywgMHgyZSwgMHgyMCwgLyogYiAqLwotICAgIDB4ZWMsIDB4ZTIsIDB4ZjAsIDB4ZmUsIDB4ZDQsIDB4ZGEsIDB4YzgsIDB4YzYsIDB4OWMsIDB4OTIsIDB4ODAsIDB4OGUsIDB4YTQsIDB4YWEsIDB4YjgsIDB4YjYsIC8qIGMgKi8KLSAgICAweDBjLCAweDAyLCAweDEwLCAweDFlLCAweDM0LCAweDNhLCAweDI4LCAweDI2LCAweDdjLCAweDcyLCAweDYwLCAweDZlLCAweDQ0LCAweDRhLCAweDU4LCAweDU2LCAvKiBkICovCi0gICAgMHgzNywgMHgzOSwgMHgyYiwgMHgyNSwgMHgwZiwgMHgwMSwgMHgxMywgMHgxZCwgMHg0NywgMHg0OSwgMHg1YiwgMHg1NSwgMHg3ZiwgMHg3MSwgMHg2MywgMHg2ZCwgLyogZSAqLwotICAgIDB4ZDcsIDB4ZDksIDB4Y2IsIDB4YzUsIDB4ZWYsIDB4ZTEsIDB4ZjMsIDB4ZmQsIDB4YTcsIDB4YTksIDB4YmIsIDB4YjUsIDB4OWYsIDB4OTEsIDB4ODMsIDB4OGQsIC8qIGYgKi8KLX07Ci0KLQotLyogRm9yIEFFU19DTUFDICovCi0jZGVmaW5lIEFFU19NQUNfTEVOR1RIIDE2IC8qIDEyOC1iaXQgc3RyaW5nICovCi1zdGF0aWMgVUlOVDggQ29uc3RfWmVyb1sxNl0gPSB7Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci1zdGF0aWMgVUlOVDggQ29uc3RfUmJbMTZdID0gewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODd9OwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgQUVTIGtleSBleHBhbnNpb24gKGtleSBzY2hlZHVsZSkKLQotQXJndW1lbnRzOgotICAgIEtleSAgICAgICAgICAgICAgQ2lwaGVyIGtleSwgaXQgbWF5IGJlIDE2LCAyNCwgb3IgMzIgYnl0ZXMgKDEyOCwgMTkyLCBvciAyNTYgYml0cykKLSAgICBLZXlMZW5ndGggICAgICAgIFRoZSBsZW5ndGggb2YgY2lwaGVyIGtleSBpbiBieXRlcwotICAgIHBhZXNfY3R4ICAgICAgICAgUG9pbnRlciB0byBBRVNfQ1RYX1NUUlVDCi0KLVJldHVybiBWYWx1ZToKLSAgICBwYWVzX2N0eCAgICAgICAgIFJldHJ1biB0aGUgS2V5V29yZEV4cGFuc2lvbiBvZiBBRVNfQ1RYX1NUUlVDCi0KLU5vdGU6Ci0gICAgUHNldWRvIGNvZGUgZm9yIGtleSBleHBhbnNpb24KLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICBOayA9IChrZXkgbGVuZ3RoLzQpOwotCi0gICAgICAgd2hpbGUgKGkgPCBOaykKLSAgICAgICAgICAgS2V5V29yZEV4cGFuc2lvbltpXSA9IHdvcmQoa2V5WzQqaV0sIGtleVs0KmkgKyAxXSwga2V5WzQqaSArIDJdLCBrZXlbNCppICsgM10pOwotICAgICAgICAgICBpKys7Ci0gICAgICAgZW5kIHdoaWxlCi0KLSAgICAgICB3aGlsZSAoaSA8ICgoa2V5IGxlbmd0aC80ICsgNiArIDEpKjQpICkKLSAgICAgICAgICAgdGVtcCA9IEtleVdvcmRFeHBhbnNpb25baSAtIDFdOwotICAgICAgICAgICBpZiAoaSAlIE5rID09MCkKLSAgICAgICAgICAgICAgIHRlbXAgPSBTdWJXb3JkKFJvdFdvcmQodGVtcCkpIF4gUmNvbltpL05rXTsKLSAgICAgICAgICAgZWxzZSBpZiAoKE5rID4gNikgJiYgKGkgJSA0ID09IDQpKQotICAgICAgICAgICAgICAgdGVtcCA9IFN1YldvcmQodGVtcCk7Ci0gICAgICAgICAgIGVuZCBpZgotCi0gICAgICAgICAgIEtleVdvcmRFeHBhbnNpb25baV0gPSBLZXlXb3JkRXhwYW5zaW9uW2kgLSBOa11eIHRlbXA7Ci0gICAgICAgICAgIGkrKzsKLSAgICAgICBlbmQgd2hpbGUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQUVTX0tleUV4cGFuc2lvbiAoCi0gICAgSU4gVUlOVDggS2V5W10sCi0gICAgSU4gVUlOVCBLZXlMZW5ndGgsCi0gICAgSU5PVVQgQUVTX0NUWF9TVFJVQyAqcGFlc19jdHgpCi17Ci0gICAgVUlOVCBLZXlJbmRleCA9IDA7Ci0gICAgVUlOVCBOdW1iZXJPZldvcmRPZktleSwgTnVtYmVyT2ZXb3JkT2ZLZXlFeHBhbnNpb247Ci0gICAgVUlOVDggIFRlbXBXb3JkW0FFU19LRVlfUk9XU10sIFRlbXA7Ci0gICAgVUlOVDMyIFRlbXByY29uOwotCi0gICAgTnVtYmVyT2ZXb3JkT2ZLZXkgPSBLZXlMZW5ndGggPj4gMjsKLSAgICB3aGlsZSAoS2V5SW5kZXggPCBOdW1iZXJPZldvcmRPZktleSkKLSAgICB7Ci0gICAgICAgIHBhZXNfY3R4LT5LZXlXb3JkRXhwYW5zaW9uWzBdW0tleUluZGV4XSA9IEtleVs0KktleUluZGV4XTsKLSAgICAgICAgcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bMV1bS2V5SW5kZXhdID0gS2V5WzQqS2V5SW5kZXggKyAxXTsKLSAgICAgICAgcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bMl1bS2V5SW5kZXhdID0gS2V5WzQqS2V5SW5kZXggKyAyXTsKLSAgICAgICAgcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bM11bS2V5SW5kZXhdID0gS2V5WzQqS2V5SW5kZXggKyAzXTsKLSAgICAgICAgS2V5SW5kZXgrKzsKLSAgICB9IC8qIEVuZCBvZiB3aGlsZSAqLwotCi0gICAgTnVtYmVyT2ZXb3JkT2ZLZXlFeHBhbnNpb24gPSAoKFVJTlQpIEFFU19LRVlfUk9XUykgKiAoKEtleUxlbmd0aCA+PiAyKSArIDYgKyAxKTsKLSAgICB3aGlsZSAoS2V5SW5kZXggPCBOdW1iZXJPZldvcmRPZktleUV4cGFuc2lvbikKLSAgICB7Ci0gICAgICAgIFRlbXBXb3JkWzBdID0gcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bMF1bS2V5SW5kZXggLSAxXTsKLSAgICAgICAgVGVtcFdvcmRbMV0gPSBwYWVzX2N0eC0+S2V5V29yZEV4cGFuc2lvblsxXVtLZXlJbmRleCAtIDFdOwotICAgICAgICBUZW1wV29yZFsyXSA9IHBhZXNfY3R4LT5LZXlXb3JkRXhwYW5zaW9uWzJdW0tleUluZGV4IC0gMV07Ci0gICAgICAgIFRlbXBXb3JkWzNdID0gcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bM11bS2V5SW5kZXggLSAxXTsKLSAgICAgICAgaWYgKChLZXlJbmRleCAlIE51bWJlck9mV29yZE9mS2V5KSA9PSAwKSB7Ci0gICAgICAgICAgICBUZW1wcmNvbiA9IGFlc19yY29uW0tleUluZGV4L051bWJlck9mV29yZE9mS2V5XTsKLSAgICAgICAgICAgIFRlbXAgPSBhZXNfc2JveF9lbmNbVGVtcFdvcmRbMV1dXigoVGVtcHJjb24gPj4gMjQpICYgMHhmZik7Ci0gICAgICAgICAgICBUZW1wV29yZFsxXSA9IGFlc19zYm94X2VuY1tUZW1wV29yZFsyXV1eKChUZW1wcmNvbiA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgIFRlbXBXb3JkWzJdID0gYWVzX3Nib3hfZW5jW1RlbXBXb3JkWzNdXV4oKFRlbXByY29uID4+ICA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgVGVtcFdvcmRbM10gPSBhZXNfc2JveF9lbmNbVGVtcFdvcmRbMF1dXigoVGVtcHJjb24gICAgICApICYgMHhmZik7Ci0gICAgICAgICAgICBUZW1wV29yZFswXSA9IFRlbXA7Ci0gICAgICAgIH0gZWxzZSBpZiAoKE51bWJlck9mV29yZE9mS2V5ID4gNikgJiYgKChLZXlJbmRleCAlIE51bWJlck9mV29yZE9mS2V5KSA9PSA0KSkgewotICAgICAgICAgICAgVGVtcCA9IGFlc19zYm94X2VuY1tUZW1wV29yZFswXV07Ci0gICAgICAgICAgICBUZW1wV29yZFsxXSA9IGFlc19zYm94X2VuY1tUZW1wV29yZFsxXV07Ci0gICAgICAgICAgICBUZW1wV29yZFsyXSA9IGFlc19zYm94X2VuY1tUZW1wV29yZFsyXV07Ci0gICAgICAgICAgICBUZW1wV29yZFszXSA9IGFlc19zYm94X2VuY1tUZW1wV29yZFszXV07Ci0gICAgICAgICAgICBUZW1wV29yZFswXSA9IFRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bMF1bS2V5SW5kZXhdID0gcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bMF1bS2V5SW5kZXggLSBOdW1iZXJPZldvcmRPZktleV1eVGVtcFdvcmRbMF07Ci0gICAgICAgIHBhZXNfY3R4LT5LZXlXb3JkRXhwYW5zaW9uWzFdW0tleUluZGV4XSA9IHBhZXNfY3R4LT5LZXlXb3JkRXhwYW5zaW9uWzFdW0tleUluZGV4IC0gTnVtYmVyT2ZXb3JkT2ZLZXldXlRlbXBXb3JkWzFdOwotICAgICAgICBwYWVzX2N0eC0+S2V5V29yZEV4cGFuc2lvblsyXVtLZXlJbmRleF0gPSBwYWVzX2N0eC0+S2V5V29yZEV4cGFuc2lvblsyXVtLZXlJbmRleCAtIE51bWJlck9mV29yZE9mS2V5XV5UZW1wV29yZFsyXTsKLSAgICAgICAgcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bM11bS2V5SW5kZXhdID0gcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bM11bS2V5SW5kZXggLSBOdW1iZXJPZldvcmRPZktleV1eVGVtcFdvcmRbM107Ci0gICAgICAgIEtleUluZGV4Kys7Ci0gICAgfSAvKiBFbmQgb2Ygd2hpbGUgKi8KLX0gLyogRW5kIG9mIEFFU19LZXlFeHBhbnNpb24gKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEFFUyBlbmNyeXB0aW9uCi0KLUFyZ3VtZW50czoKLSAgICBQbGFpbkJsb2NrICAgICAgIFRoZSBibG9jayBvZiBwbGFpbiB0ZXh0LCAxNiBieXRlcygxMjggYml0cykgZWFjaCBibG9jawotICAgIFBsYWluQmxvY2tTaXplICAgVGhlIGxlbmd0aCBvZiBibG9jayBvZiBwbGFpbiB0ZXh0IGluIGJ5dGVzCi0gICAgS2V5ICAgICAgICAgICAgICBDaXBoZXIga2V5LCBpdCBtYXkgYmUgMTYsIDI0LCBvciAzMiBieXRlcyAoMTI4LCAxOTIsIG9yIDI1NiBiaXRzKQotICAgIEtleUxlbmd0aCAgICAgICAgVGhlIGxlbmd0aCBvZiBjaXBoZXIga2V5IGluIGJ5dGVzCi0gICAgQ2lwaGVyQmxvY2tTaXplICBUaGUgbGVuZ3RoIG9mIGFsbG9jYXRlZCBjaXBoZXIgYmxvY2sgaW4gYnl0ZXMKLQotUmV0dXJuIFZhbHVlOgotICAgIENpcGhlckJsb2NrICAgICAgUmV0dXJuIGNpcGhlciB0ZXh0Ci0gICAgQ2lwaGVyQmxvY2tTaXplICBSZXR1cm4gdGhlIGxlbmd0aCBvZiByZWFsIHVzZWQgY2lwaGVyIGJsb2NrIGluIGJ5dGVzCi0KLU5vdGU6Ci0gICAgUmVmZXJlbmNlIHRvIEZJUFMtUFVCIDE5NwotICAgIDEuIENoZWNrIGlmIGJsb2NrIHNpemUgaXMgMTYgYnl0ZXMoMTI4IGJpdHMpIGFuZCBpZiBrZXkgbGVuZ3RoIGlzIDE2LCAyNCwgb3IgMzIgYnl0ZXMoMTI4LCAxOTIsIG9yIDI1NiBiaXRzKQotICAgIDIuIFRyYW5zZmVyIHRoZSBwbGFpbiBibG9jayB0byBzdGF0ZSBibG9jawotICAgIDMuIE1haW4gZW5jcnlwdGlvbiByb3VuZHMKLSAgICA0LiBUcmFuc2ZlciB0aGUgc3RhdGUgYmxvY2sgdG8gY2lwaGVyIGJsb2NrCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgTnVtYmVyT2ZSb3VuZCA9IChrZXkgbGVuZ3RoIC8gNCkgKyA2OwotICAgICAgIHN0YXRlIGJsb2NrID0gcGxhaW4gYmxvY2s7Ci0KLSAgICAgICBBZGRSb3VuZEtleShzdGF0ZSBibG9jaywga2V5KTsKLSAgICAgICBmb3Igcm91bmQgPSAxIHRvIE51bWJlck9mUm91bmQKLSAgICAgICAgICAgU3ViQnl0ZXMoc3RhdGUgYmxvY2spCi0gICAgICAgICAgIFNoaWZ0Um93cyhzdGF0ZSBibG9jaykKLSAgICAgICAgICAgTWl4Q29sdW1ucyhzdGF0ZSBibG9jaykKLSAgICAgICAgICAgQWRkUm91bmRLZXkoc3RhdGUgYmxvY2ssIGtleSk7Ci0gICAgICAgZW5kIGZvcgotCi0gICAgICAgU3ViQnl0ZXMoc3RhdGUgYmxvY2spCi0gICAgICAgU2hpZnRSb3dzKHN0YXRlIGJsb2NrKQotICAgICAgIEFkZFJvdW5kS2V5KHN0YXRlIGJsb2NrLCBrZXkpOwotCi0gICAgICAgY2lwaGVyIGJsb2NrID0gc3RhdGUgYmxvY2s7Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFFU19FbmNyeXB0ICgKLSAgICBJTiBVSU5UOCBQbGFpbkJsb2NrW10sCi0gICAgSU4gVUlOVCBQbGFpbkJsb2NrU2l6ZSwKLSAgICBJTiBVSU5UOCBLZXlbXSwKLSAgICBJTiBVSU5UIEtleUxlbmd0aCwKLSAgICBPVVQgVUlOVDggQ2lwaGVyQmxvY2tbXSwKLSAgICBJTk9VVCBVSU5UICpDaXBoZXJCbG9ja1NpemUpCi17Ci0gICAgQUVTX0NUWF9TVFJVQyBhZXNfY3R4OwotICAgIFVJTlQgUm93SW5kZXgsIENvbHVtbkluZGV4OwotICAgIFVJTlQgUm91bmRJbmRleCwgTnVtYmVyT2ZSb3VuZCA9IDA7Ci0gICAgVUlOVDggVGVtcCwgUm93MCwgUm93MSwgUm93MiwgUm93MzsKLQotICAgIC8qCi0gICAgICogMS4gQ2hlY2sgaWYgYmxvY2sgc2l6ZSBpcyAxNiBieXRlcygxMjggYml0cykgYW5kIGlmIGtleSBsZW5ndGggaXMgMTYsIDI0LCBvciAzMiBieXRlcygxMjgsIDE5Miwgb3IgMjU2IGJpdHMpCi0gICAgICovCi0gICAgaWYgKFBsYWluQmxvY2tTaXplICE9IEFFU19CTE9DS19TSVpFUykgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFFU19FbmNyeXB0OiBwbGFpbiBibG9jayBzaXplIGlzICVkIGJ5dGVzLCBpdCBtdXN0IGJlICVkIGJ5dGVzKDEyOCBiaXRzKS5cbiIsCi0gICAgICAgICAgICBQbGFpbkJsb2NrU2l6ZSwgQUVTX0JMT0NLX1NJWkVTKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIGlmICgoS2V5TGVuZ3RoICE9IEFFU19LRVkxMjhfTEVOR1RIKSAmJiAoS2V5TGVuZ3RoICE9IEFFU19LRVkxOTJfTEVOR1RIKSAmJiAoS2V5TGVuZ3RoICE9IEFFU19LRVkyNTZfTEVOR1RIKSkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFFU19FbmNyeXB0OiBrZXkgbGVuZ3RoIGlzICVkIGJ5dGVzLCBpdCBtdXN0IGJlICVkLCAlZCwgb3IgJWQgYnl0ZXMoMTI4LCAxOTIsIG9yIDI1NiBiaXRzKS5cbiIsCi0gICAgICAgICAgICBLZXlMZW5ndGgsIEFFU19LRVkxMjhfTEVOR1RILCBBRVNfS0VZMTkyX0xFTkdUSCwgQUVTX0tFWTI1Nl9MRU5HVEgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgaWYgKCpDaXBoZXJCbG9ja1NpemUgPCBBRVNfQkxPQ0tfU0laRVMpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBRVNfRW5jcnlwdDogY2lwaGVyIGJsb2NrIHNpemUgaXMgJWQgYnl0ZXMsIGl0IG11c3QgYmUgJWQgYnl0ZXMoMTI4IGJpdHMpLlxuIiwKLSAgICAgICAgICAgICpDaXBoZXJCbG9ja1NpemUsIEFFU19CTE9DS19TSVpFUykpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qCi0gICAgICogMi4gVHJhbnNmZXIgdGhlIHBsYWluIGJsb2NrIHRvIHN0YXRlIGJsb2NrCi0gICAgICovCi0gICAgZm9yIChSb3dJbmRleCA9IDA7IFJvd0luZGV4IDwgQUVTX1NUQVRFX1JPV1M7Um93SW5kZXgrKykKLSAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbUm93SW5kZXhdW0NvbHVtbkluZGV4XSA9IFBsYWluQmxvY2tbUm93SW5kZXggKyA0KkNvbHVtbkluZGV4XTsKLQotICAgIC8qCi0gICAgICogIDMuIE1haW4gZW5jcnlwdGlvbiByb3VuZHMKLSAgICAgKi8KLSAgICBBRVNfS2V5RXhwYW5zaW9uKEtleSwgS2V5TGVuZ3RoLCAmYWVzX2N0eCk7Ci0gICAgTnVtYmVyT2ZSb3VuZCA9IChLZXlMZW5ndGggPj4gMikgKyA2OwotCi0gICAgLyogQUVTX0FkZFJvdW5kS2V5ICovCi0gICAgUm91bmRJbmRleCA9IDA7Ci0gICAgZm9yIChSb3dJbmRleCA9IDA7IFJvd0luZGV4IDwgQUVTX1NUQVRFX1JPV1M7Um93SW5kZXgrKykKLSAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbUm93SW5kZXhdW0NvbHVtbkluZGV4XSBePSBhZXNfY3R4LktleVdvcmRFeHBhbnNpb25bUm93SW5kZXhdWyhSb3VuZEluZGV4KigoVUlOVCkgQUVTX1NUQVRFX0NPTFVNTlMpKSArIENvbHVtbkluZGV4XTsKLQotICAgIGZvciAoUm91bmRJbmRleCA9IDE7IFJvdW5kSW5kZXggPCBOdW1iZXJPZlJvdW5kO1JvdW5kSW5kZXgrKykKLSAgICB7Ci0gICAgICAgIC8qIEFFU19TdWJCeXRlcyAqLwotICAgICAgICBmb3IgKFJvd0luZGV4ID0gMDsgUm93SW5kZXggPCBBRVNfU1RBVEVfUk9XUztSb3dJbmRleCsrKQotICAgICAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgICAgICBhZXNfY3R4LlN0YXRlW1Jvd0luZGV4XVtDb2x1bW5JbmRleF0gPSBhZXNfc2JveF9lbmNbYWVzX2N0eC5TdGF0ZVtSb3dJbmRleF1bQ29sdW1uSW5kZXhdXTsKLQotICAgICAgICAvKiBBRVNfU2hpZnRSb3dzICovCi0gICAgICAgIFRlbXAgPSBhZXNfY3R4LlN0YXRlWzFdWzBdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzFdWzBdID0gYWVzX2N0eC5TdGF0ZVsxXVsxXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVsxXVsxXSA9IGFlc19jdHguU3RhdGVbMV1bMl07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbMV1bMl0gPSBhZXNfY3R4LlN0YXRlWzFdWzNdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzFdWzNdID0gVGVtcDsKLSAgICAgICAgVGVtcCA9IGFlc19jdHguU3RhdGVbMl1bMF07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbMl1bMF0gPSBhZXNfY3R4LlN0YXRlWzJdWzJdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzJdWzJdID0gVGVtcDsKLSAgICAgICAgVGVtcCA9IGFlc19jdHguU3RhdGVbMl1bMV07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbMl1bMV0gPSBhZXNfY3R4LlN0YXRlWzJdWzNdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzJdWzNdID0gVGVtcDsKLSAgICAgICAgVGVtcCA9IGFlc19jdHguU3RhdGVbM11bM107Ci0gICAgICAgIGFlc19jdHguU3RhdGVbM11bM10gPSBhZXNfY3R4LlN0YXRlWzNdWzJdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzNdWzJdID0gYWVzX2N0eC5TdGF0ZVszXVsxXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVszXVsxXSA9IGFlc19jdHguU3RhdGVbM11bMF07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbM11bMF0gPSBUZW1wOwotCi0gICAgICAgIC8qIEFFU19NaXhDb2x1bW5zICovCi0gICAgICAgIGZvciAoQ29sdW1uSW5kZXggPSAwOyBDb2x1bW5JbmRleCA8IEFFU19TVEFURV9DT0xVTU5TO0NvbHVtbkluZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvdzAgPSBhZXNfY3R4LlN0YXRlWzBdW0NvbHVtbkluZGV4XTsKLSAgICAgICAgICAgIFJvdzEgPSBhZXNfY3R4LlN0YXRlWzFdW0NvbHVtbkluZGV4XTsKLSAgICAgICAgICAgIFJvdzIgPSBhZXNfY3R4LlN0YXRlWzJdW0NvbHVtbkluZGV4XTsKLSAgICAgICAgICAgIFJvdzMgPSBhZXNfY3R4LlN0YXRlWzNdW0NvbHVtbkluZGV4XTsKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbMF1bQ29sdW1uSW5kZXhdID0gYWVzX211bF8yW1JvdzBdXmFlc19tdWxfM1tSb3cxXV5Sb3cyXlJvdzM7Ci0gICAgICAgICAgICBhZXNfY3R4LlN0YXRlWzFdW0NvbHVtbkluZGV4XSA9IFJvdzBeYWVzX211bF8yW1JvdzFdXmFlc19tdWxfM1tSb3cyXV5Sb3czOwotICAgICAgICAgICAgYWVzX2N0eC5TdGF0ZVsyXVtDb2x1bW5JbmRleF0gPSBSb3cwXlJvdzFeYWVzX211bF8yW1JvdzJdXmFlc19tdWxfM1tSb3czXTsKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbM11bQ29sdW1uSW5kZXhdID0gYWVzX211bF8zW1JvdzBdXlJvdzFeUm93Ml5hZXNfbXVsXzJbUm93M107Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBRVNfQWRkUm91bmRLZXkgKi8KLSAgICAgICAgZm9yIChSb3dJbmRleCA9IDA7IFJvd0luZGV4IDwgQUVTX1NUQVRFX1JPV1M7Um93SW5kZXgrKykKLSAgICAgICAgICAgIGZvciAoQ29sdW1uSW5kZXggPSAwOyBDb2x1bW5JbmRleCA8IEFFU19TVEFURV9DT0xVTU5TO0NvbHVtbkluZGV4KyspCi0gICAgICAgICAgICAgICAgYWVzX2N0eC5TdGF0ZVtSb3dJbmRleF1bQ29sdW1uSW5kZXhdIF49IGFlc19jdHguS2V5V29yZEV4cGFuc2lvbltSb3dJbmRleF1bKFJvdW5kSW5kZXgqKChVSU5UKSBBRVNfU1RBVEVfQ09MVU1OUykpICsgQ29sdW1uSW5kZXhdOwotICAgIH0gLyogRW5kIG9mIGZvciAqLwotCi0gICAgLyogQUVTX1N1YkJ5dGVzICovCi0gICAgZm9yIChSb3dJbmRleCA9IDA7IFJvd0luZGV4IDwgQUVTX1NUQVRFX1JPV1M7Um93SW5kZXgrKykKLSAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbUm93SW5kZXhdW0NvbHVtbkluZGV4XSA9IGFlc19zYm94X2VuY1thZXNfY3R4LlN0YXRlW1Jvd0luZGV4XVtDb2x1bW5JbmRleF1dOwotICAgIC8qIEFFU19TaGlmdFJvd3MgKi8KLSAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVsxXVswXTsKLSAgICBhZXNfY3R4LlN0YXRlWzFdWzBdID0gYWVzX2N0eC5TdGF0ZVsxXVsxXTsKLSAgICBhZXNfY3R4LlN0YXRlWzFdWzFdID0gYWVzX2N0eC5TdGF0ZVsxXVsyXTsKLSAgICBhZXNfY3R4LlN0YXRlWzFdWzJdID0gYWVzX2N0eC5TdGF0ZVsxXVszXTsKLSAgICBhZXNfY3R4LlN0YXRlWzFdWzNdID0gVGVtcDsKLSAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVsyXVswXTsKLSAgICBhZXNfY3R4LlN0YXRlWzJdWzBdID0gYWVzX2N0eC5TdGF0ZVsyXVsyXTsKLSAgICBhZXNfY3R4LlN0YXRlWzJdWzJdID0gVGVtcDsKLSAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVsyXVsxXTsKLSAgICBhZXNfY3R4LlN0YXRlWzJdWzFdID0gYWVzX2N0eC5TdGF0ZVsyXVszXTsKLSAgICBhZXNfY3R4LlN0YXRlWzJdWzNdID0gVGVtcDsKLSAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVszXVszXTsKLSAgICBhZXNfY3R4LlN0YXRlWzNdWzNdID0gYWVzX2N0eC5TdGF0ZVszXVsyXTsKLSAgICBhZXNfY3R4LlN0YXRlWzNdWzJdID0gYWVzX2N0eC5TdGF0ZVszXVsxXTsKLSAgICBhZXNfY3R4LlN0YXRlWzNdWzFdID0gYWVzX2N0eC5TdGF0ZVszXVswXTsKLSAgICBhZXNfY3R4LlN0YXRlWzNdWzBdID0gVGVtcDsKLSAgICAvKiBBRVNfQWRkUm91bmRLZXkgKi8KLSAgICBmb3IgKFJvd0luZGV4ID0gMDsgUm93SW5kZXggPCBBRVNfU1RBVEVfUk9XUztSb3dJbmRleCsrKQotICAgICAgICBmb3IgKENvbHVtbkluZGV4ID0gMDsgQ29sdW1uSW5kZXggPCBBRVNfU1RBVEVfQ09MVU1OUztDb2x1bW5JbmRleCsrKQotICAgICAgICAgICAgYWVzX2N0eC5TdGF0ZVtSb3dJbmRleF1bQ29sdW1uSW5kZXhdIF49IGFlc19jdHguS2V5V29yZEV4cGFuc2lvbltSb3dJbmRleF1bKFJvdW5kSW5kZXgqKChVSU5UKSBBRVNfU1RBVEVfQ09MVU1OUykpICsgQ29sdW1uSW5kZXhdOwotCi0gICAgLyoKLSAgICAgKiA0LiBUcmFuc2ZlciB0aGUgc3RhdGUgYmxvY2sgdG8gY2lwaGVyIGJsb2NrCi0gICAgICovCi0gICAgZm9yIChSb3dJbmRleCA9IDA7IFJvd0luZGV4IDwgQUVTX1NUQVRFX1JPV1M7Um93SW5kZXgrKykKLSAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgIENpcGhlckJsb2NrW1Jvd0luZGV4ICsgNCpDb2x1bW5JbmRleF0gPSBhZXNfY3R4LlN0YXRlW1Jvd0luZGV4XVtDb2x1bW5JbmRleF07Ci0KLSAgICAqQ2lwaGVyQmxvY2tTaXplID0gKChVSU5UKSBBRVNfU1RBVEVfUk9XUykqKChVSU5UKSBBRVNfU1RBVEVfQ09MVU1OUyk7Ci19IC8qIEVuZCBvZiBBRVNfRW5jcnlwdCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgQUVTIGRlY3J5cHRpb24KLQotQXJndW1lbnRzOgotICAgIENpcGhlckJsb2NrICAgICAgVGhlIGJsb2NrIG9mIGNpcGhlciB0ZXh0LCAxNiBieXRlcygxMjggYml0cykgZWFjaCBibG9jawotICAgIENpcGhlckJsb2NrU2l6ZSAgVGhlIGxlbmd0aCBvZiBibG9jayBvZiBjaXBoZXIgdGV4dCBpbiBieXRlcwotICAgIEtleSAgICAgICAgICAgICAgQ2lwaGVyIGtleSwgaXQgbWF5IGJlIDE2LCAyNCwgb3IgMzIgYnl0ZXMgKDEyOCwgMTkyLCBvciAyNTYgYml0cykKLSAgICBLZXlMZW5ndGggICAgICAgIFRoZSBsZW5ndGggb2YgY2lwaGVyIGtleSBpbiBieXRlcwotICAgIFBsYWluQmxvY2tTaXplICAgVGhlIGxlbmd0aCBvZiBhbGxvY2F0ZWQgcGxhaW4gYmxvY2sgaW4gYnl0ZXMKLQotUmV0dXJuIFZhbHVlOgotICAgIFBsYWluQmxvY2sgICAgICAgUmV0dXJuIHBsYWluIHRleHQKLSAgICBQbGFpbkJsb2NrU2l6ZSAgUmV0dXJuIHRoZSBsZW5ndGggb2YgcmVhbCB1c2VkIHBsYWluIGJsb2NrIGluIGJ5dGVzCi0KLU5vdGU6Ci0gICAgUmVmZXJlbmNlIHRvIEZJUFMtUFVCIDE5NwotICAgIDEuIENoZWNrIGlmIGJsb2NrIHNpemUgaXMgMTYgYnl0ZXMoMTI4IGJpdHMpIGFuZCBpZiBrZXkgbGVuZ3RoIGlzIDE2LCAyNCwgb3IgMzIgYnl0ZXMoMTI4LCAxOTIsIG9yIDI1NiBiaXRzKQotICAgIDIuIFRyYW5zZmVyIHRoZSBjaXBoZXIgYmxvY2sgdG8gc3RhdGUgYmxvY2sKLSAgICAzLiBNYWluIGRlY3J5cHRpb24gcm91bmRzCi0gICAgNC4gVHJhbnNmZXIgdGhlIHN0YXRlIGJsb2NrIHRvIHBsYWluIGJsb2NrCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgTnVtYmVyT2ZSb3VuZCA9IChrZXkgbGVuZ3RoIC8gNCkgKyA2OwotICAgICAgIHN0YXRlIGJsb2NrID0gY2lwaGVyIGJsb2NrOwotCi0gICAgICAgQWRkUm91bmRLZXkoc3RhdGUgYmxvY2ssIGtleSk7Ci0gICAgICAgZm9yIHJvdW5kID0gTnVtYmVyT2ZSb3VuZCB0byAxCi0gICAgICAgICAgIEludlN1YkJ5dGVzKHN0YXRlIGJsb2NrKQotICAgICAgICAgICBJbnZTaGlmdFJvd3Moc3RhdGUgYmxvY2spCi0gICAgICAgICAgIEludk1peENvbHVtbnMoc3RhdGUgYmxvY2spCi0gICAgICAgICAgIEFkZFJvdW5kS2V5KHN0YXRlIGJsb2NrLCBrZXkpOwotICAgICAgIGVuZCBmb3IKLQotICAgICAgIEludlN1YkJ5dGVzKHN0YXRlIGJsb2NrKQotICAgICAgIEludlNoaWZ0Um93cyhzdGF0ZSBibG9jaykKLSAgICAgICBBZGRSb3VuZEtleShzdGF0ZSBibG9jaywga2V5KTsKLQotICAgICAgIHBsYWluIGJsb2NrID0gc3RhdGUgYmxvY2s7Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFFU19EZWNyeXB0ICgKLSAgICBJTiBVSU5UOCBDaXBoZXJCbG9ja1tdLAotICAgIElOIFVJTlQgQ2lwaGVyQmxvY2tTaXplLAotICAgIElOIFVJTlQ4IEtleVtdLAotICAgIElOIFVJTlQgS2V5TGVuZ3RoLAotICAgIE9VVCBVSU5UOCBQbGFpbkJsb2NrW10sCi0gICAgSU5PVVQgVUlOVCAqUGxhaW5CbG9ja1NpemUpCi17Ci0gICAgQUVTX0NUWF9TVFJVQyBhZXNfY3R4OwotICAgIFVJTlQgUm93SW5kZXgsIENvbHVtbkluZGV4OwotICAgIFVJTlQgUm91bmRJbmRleCwgTnVtYmVyT2ZSb3VuZCA9IDA7Ci0gICAgVUlOVDggVGVtcCwgUm93MCwgUm93MSwgUm93MiwgUm93MzsKLQotICAgIC8qCi0gICAgICogMS4gQ2hlY2sgaWYgYmxvY2sgc2l6ZSBpcyAxNiBieXRlcygxMjggYml0cykgYW5kIGlmIGtleSBsZW5ndGggaXMgMTYsIDI0LCBvciAzMiBieXRlcygxMjgsIDE5Miwgb3IgMjU2IGJpdHMpCi0gICAgICovCi0gICAgaWYgKCpQbGFpbkJsb2NrU2l6ZSA8IEFFU19CTE9DS19TSVpFUykgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFFU19EZWNyeXB0OiBwbGFpbiBibG9jayBzaXplIGlzICVkIGJ5dGVzLCBpdCBtdXN0IGJlICVkIGJ5dGVzKDEyOCBiaXRzKS5cbiIsCi0gICAgICAgICAgICAqUGxhaW5CbG9ja1NpemUsIEFFU19CTE9DS19TSVpFUykpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAoKEtleUxlbmd0aCAhPSBBRVNfS0VZMTI4X0xFTkdUSCkgJiYgKEtleUxlbmd0aCAhPSBBRVNfS0VZMTkyX0xFTkdUSCkgJiYgKEtleUxlbmd0aCAhPSBBRVNfS0VZMjU2X0xFTkdUSCkpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBRVNfRGVjcnlwdDoga2V5IGxlbmd0aCBpcyAlZCBieXRlcywgaXQgbXVzdCBiZSAlZCwgJWQsIG9yICVkIGJ5dGVzKDEyOCwgMTkyLCBvciAyNTYgYml0cykuXG4iLAotICAgICAgICAgICAgS2V5TGVuZ3RoLCBBRVNfS0VZMTI4X0xFTkdUSCwgQUVTX0tFWTE5Ml9MRU5HVEgsIEFFU19LRVkyNTZfTEVOR1RIKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIGlmIChDaXBoZXJCbG9ja1NpemUgIT0gQUVTX0JMT0NLX1NJWkVTKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQUVTX0RlY3J5cHQ6IGNpcGhlciBibG9jayBzaXplIGlzICVkIGJ5dGVzLCBpdCBtdXN0IGJlICVkIGJ5dGVzKDEyOCBiaXRzKS5cbiIsCi0gICAgICAgICAgICBDaXBoZXJCbG9ja1NpemUsIEFFU19CTE9DS19TSVpFUykpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qCi0gICAgICogMi4gVHJhbnNmZXIgdGhlIGNpcGhlciBibG9jayB0byBzdGF0ZSBibG9jawotICAgICAqLwotICAgIGZvciAoUm93SW5kZXggPSAwOyBSb3dJbmRleCA8IEFFU19TVEFURV9ST1dTO1Jvd0luZGV4KyspCi0gICAgICAgIGZvciAoQ29sdW1uSW5kZXggPSAwOyBDb2x1bW5JbmRleCA8IEFFU19TVEFURV9DT0xVTU5TO0NvbHVtbkluZGV4KyspCi0gICAgICAgICAgICBhZXNfY3R4LlN0YXRlW1Jvd0luZGV4XVtDb2x1bW5JbmRleF0gPSBDaXBoZXJCbG9ja1tSb3dJbmRleCArIDQqQ29sdW1uSW5kZXhdOwotCi0gICAgLyoKLSAgICAgKiAgMy4gTWFpbiBkZWNyeXB0aW9uIHJvdW5kcwotICAgICAqLwotICAgIEFFU19LZXlFeHBhbnNpb24oS2V5LCBLZXlMZW5ndGgsICZhZXNfY3R4KTsKLSAgICBOdW1iZXJPZlJvdW5kID0gKEtleUxlbmd0aCA+PiAyKSArIDY7Ci0KLSAgICAvKiBBRVNfQWRkUm91bmRLZXkgKi8KLSAgICBSb3VuZEluZGV4ID0gTnVtYmVyT2ZSb3VuZDsKLSAgICBmb3IgKFJvd0luZGV4ID0gMDsgUm93SW5kZXggPCBBRVNfU1RBVEVfUk9XUztSb3dJbmRleCsrKQotICAgICAgICBmb3IgKENvbHVtbkluZGV4ID0gMDsgQ29sdW1uSW5kZXggPCBBRVNfU1RBVEVfQ09MVU1OUztDb2x1bW5JbmRleCsrKQotICAgICAgICAgICAgYWVzX2N0eC5TdGF0ZVtSb3dJbmRleF1bQ29sdW1uSW5kZXhdIF49IGFlc19jdHguS2V5V29yZEV4cGFuc2lvbltSb3dJbmRleF1bKFJvdW5kSW5kZXgqKChVSU5UKSBBRVNfU1RBVEVfQ09MVU1OUykpICsgQ29sdW1uSW5kZXhdOwotCi0gICAgZm9yIChSb3VuZEluZGV4ID0gKE51bWJlck9mUm91bmQgLSAxKTsgUm91bmRJbmRleCA+IDAgO1JvdW5kSW5kZXgtLSkKLSAgICB7Ci0gICAgICAgIC8qIEFFU19JbnZTaGlmdFJvd3MgKi8KLSAgICAgICAgVGVtcCA9IGFlc19jdHguU3RhdGVbMV1bM107Ci0gICAgICAgIGFlc19jdHguU3RhdGVbMV1bM10gPSBhZXNfY3R4LlN0YXRlWzFdWzJdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzFdWzJdID0gYWVzX2N0eC5TdGF0ZVsxXVsxXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVsxXVsxXSA9IGFlc19jdHguU3RhdGVbMV1bMF07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbMV1bMF0gPSBUZW1wOwotICAgICAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVsyXVswXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVsyXVswXSA9IGFlc19jdHguU3RhdGVbMl1bMl07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbMl1bMl0gPSBUZW1wOwotICAgICAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVsyXVsxXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVsyXVsxXSA9IGFlc19jdHguU3RhdGVbMl1bM107Ci0gICAgICAgIGFlc19jdHguU3RhdGVbMl1bM10gPSBUZW1wOwotICAgICAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVszXVswXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVszXVswXSA9IGFlc19jdHguU3RhdGVbM11bMV07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbM11bMV0gPSBhZXNfY3R4LlN0YXRlWzNdWzJdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzNdWzJdID0gYWVzX2N0eC5TdGF0ZVszXVszXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVszXVszXSA9IFRlbXA7Ci0KLSAgICAgICAgLyogQUVTX0ludlN1YkJ5dGVzICovCi0gICAgICAgIGZvciAoUm93SW5kZXggPSAwOyBSb3dJbmRleCA8IEFFU19TVEFURV9ST1dTO1Jvd0luZGV4KyspCi0gICAgICAgICAgICBmb3IgKENvbHVtbkluZGV4ID0gMDsgQ29sdW1uSW5kZXggPCBBRVNfU1RBVEVfQ09MVU1OUztDb2x1bW5JbmRleCsrKQotICAgICAgICAgICAgICAgIGFlc19jdHguU3RhdGVbUm93SW5kZXhdW0NvbHVtbkluZGV4XSA9IGFlc19zYm94X2RlY1thZXNfY3R4LlN0YXRlW1Jvd0luZGV4XVtDb2x1bW5JbmRleF1dOwotCi0gICAgICAgIC8qIEFFU19BZGRSb3VuZEtleSAqLwotICAgICAgICBmb3IgKFJvd0luZGV4ID0gMDsgUm93SW5kZXggPCBBRVNfU1RBVEVfUk9XUztSb3dJbmRleCsrKQotICAgICAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgICAgICBhZXNfY3R4LlN0YXRlW1Jvd0luZGV4XVtDb2x1bW5JbmRleF0gXj0gYWVzX2N0eC5LZXlXb3JkRXhwYW5zaW9uW1Jvd0luZGV4XVsoUm91bmRJbmRleCooKFVJTlQpIEFFU19TVEFURV9DT0xVTU5TKSkgKyBDb2x1bW5JbmRleF07Ci0KLSAgICAgICAgLyogQUVTX0ludk1peENvbHVtbnMgKi8KLSAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgUm93MCA9IGFlc19jdHguU3RhdGVbMF1bQ29sdW1uSW5kZXhdOwotICAgICAgICAgICAgUm93MSA9IGFlc19jdHguU3RhdGVbMV1bQ29sdW1uSW5kZXhdOwotICAgICAgICAgICAgUm93MiA9IGFlc19jdHguU3RhdGVbMl1bQ29sdW1uSW5kZXhdOwotICAgICAgICAgICAgUm93MyA9IGFlc19jdHguU3RhdGVbM11bQ29sdW1uSW5kZXhdOwotICAgICAgICAgICAgYWVzX2N0eC5TdGF0ZVswXVtDb2x1bW5JbmRleF0gPSBhZXNfbXVsX2VbUm93MF1eYWVzX211bF9iW1JvdzFdXmFlc19tdWxfZFtSb3cyXV5hZXNfbXVsXzlbUm93M107Ci0gICAgICAgICAgICBhZXNfY3R4LlN0YXRlWzFdW0NvbHVtbkluZGV4XSA9IGFlc19tdWxfOVtSb3cwXV5hZXNfbXVsX2VbUm93MV1eYWVzX211bF9iW1JvdzJdXmFlc19tdWxfZFtSb3czXTsKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbMl1bQ29sdW1uSW5kZXhdID0gYWVzX211bF9kW1JvdzBdXmFlc19tdWxfOVtSb3cxXV5hZXNfbXVsX2VbUm93Ml1eYWVzX211bF9iW1JvdzNdOwotICAgICAgICAgICAgYWVzX2N0eC5TdGF0ZVszXVtDb2x1bW5JbmRleF0gPSBhZXNfbXVsX2JbUm93MF1eYWVzX211bF9kW1JvdzFdXmFlc19tdWxfOVtSb3cyXV5hZXNfbXVsX2VbUm93M107Ci0gICAgICAgIH0KLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIC8qIEFFU19JbnZTaGlmdFJvd3MgKi8KLSAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVsxXVszXTsKLSAgICBhZXNfY3R4LlN0YXRlWzFdWzNdID0gYWVzX2N0eC5TdGF0ZVsxXVsyXTsKLSAgICBhZXNfY3R4LlN0YXRlWzFdWzJdID0gYWVzX2N0eC5TdGF0ZVsxXVsxXTsKLSAgICBhZXNfY3R4LlN0YXRlWzFdWzFdID0gYWVzX2N0eC5TdGF0ZVsxXVswXTsKLSAgICBhZXNfY3R4LlN0YXRlWzFdWzBdID0gVGVtcDsKLSAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVsyXVswXTsKLSAgICBhZXNfY3R4LlN0YXRlWzJdWzBdID0gYWVzX2N0eC5TdGF0ZVsyXVsyXTsKLSAgICBhZXNfY3R4LlN0YXRlWzJdWzJdID0gVGVtcDsKLSAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVsyXVsxXTsKLSAgICBhZXNfY3R4LlN0YXRlWzJdWzFdID0gYWVzX2N0eC5TdGF0ZVsyXVszXTsKLSAgICBhZXNfY3R4LlN0YXRlWzJdWzNdID0gVGVtcDsKLSAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVszXVswXTsKLSAgICBhZXNfY3R4LlN0YXRlWzNdWzBdID0gYWVzX2N0eC5TdGF0ZVszXVsxXTsKLSAgICBhZXNfY3R4LlN0YXRlWzNdWzFdID0gYWVzX2N0eC5TdGF0ZVszXVsyXTsKLSAgICBhZXNfY3R4LlN0YXRlWzNdWzJdID0gYWVzX2N0eC5TdGF0ZVszXVszXTsKLSAgICBhZXNfY3R4LlN0YXRlWzNdWzNdID0gVGVtcDsKLSAgICAvKiBBRVNfSW52U3ViQnl0ZXMgKi8KLSAgICBmb3IgKFJvd0luZGV4ID0gMDsgUm93SW5kZXggPCBBRVNfU1RBVEVfUk9XUztSb3dJbmRleCsrKQotICAgICAgICBmb3IgKENvbHVtbkluZGV4ID0gMDsgQ29sdW1uSW5kZXggPCBBRVNfU1RBVEVfQ09MVU1OUztDb2x1bW5JbmRleCsrKQotICAgICAgICAgICAgYWVzX2N0eC5TdGF0ZVtSb3dJbmRleF1bQ29sdW1uSW5kZXhdID0gYWVzX3Nib3hfZGVjW2Flc19jdHguU3RhdGVbUm93SW5kZXhdW0NvbHVtbkluZGV4XV07Ci0gICAgLyogQUVTX0FkZFJvdW5kS2V5ICovCi0gICAgZm9yIChSb3dJbmRleCA9IDA7IFJvd0luZGV4IDwgQUVTX1NUQVRFX1JPV1M7Um93SW5kZXgrKykKLSAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbUm93SW5kZXhdW0NvbHVtbkluZGV4XSBePSBhZXNfY3R4LktleVdvcmRFeHBhbnNpb25bUm93SW5kZXhdWyhSb3VuZEluZGV4KigoVUlOVCkgQUVTX1NUQVRFX0NPTFVNTlMpKSArIENvbHVtbkluZGV4XTsKLQotICAgIC8qCi0gICAgICogNC4gVHJhbnNmZXIgdGhlIHN0YXRlIGJsb2NrIHRvIHBsYWluIGJsb2NrCi0gICAgICovCi0gICAgZm9yIChSb3dJbmRleCA9IDA7IFJvd0luZGV4IDwgQUVTX1NUQVRFX1JPV1M7Um93SW5kZXgrKykKLSAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgIFBsYWluQmxvY2tbUm93SW5kZXggKyA0KkNvbHVtbkluZGV4XSA9IGFlc19jdHguU3RhdGVbUm93SW5kZXhdW0NvbHVtbkluZGV4XTsKLQotICAgICpQbGFpbkJsb2NrU2l6ZSA9ICgoVUlOVCkgQUVTX1NUQVRFX1JPV1MpKigoVUlOVCkgQUVTX1NUQVRFX0NPTFVNTlMpOwotfSAvKiBFbmQgb2YgQUVTX0RlY3J5cHQgKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEFFUy1DQkMgZW5jcnlwdGlvbgotCi1Bcmd1bWVudHM6Ci0gICAgUGxhaW5UZXh0ICAgICAgICBQbGFpbiB0ZXh0Ci0gICAgUGxhaW5UZXh0TGVuZ3RoICBUaGUgbGVuZ3RoIG9mIHBsYWluIHRleHQgaW4gYnl0ZXMKLSAgICBLZXkgICAgICAgICAgICAgIENpcGhlciBrZXksIGl0IG1heSBiZSAxNiwgMjQsIG9yIDMyIGJ5dGVzICgxMjgsIDE5Miwgb3IgMjU2IGJpdHMpCi0gICAgS2V5TGVuZ3RoICAgICAgICBUaGUgbGVuZ3RoIG9mIGNpcGhlciBrZXkgaW4gYnl0ZXMKLSAgICBJViAgICAgICAgICAgICAgIEluaXRpYWxpemF0aW9uIHZlY3RvciwgaXQgbWF5IGJlIDE2IGJ5dGVzICgxMjggYml0cykKLSAgICBJVkxlbmd0aCAgICAgICAgIFRoZSBsZW5ndGggb2YgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGluIGJ5dGVzCi0gICAgQ2lwaGVyVGV4dExlbmd0aCBUaGUgbGVuZ3RoIG9mIGFsbG9jYXRlZCBjaXBoZXIgdGV4dCBpbiBieXRlcwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgQ2lwaGVyVGV4dCAgICAgICBSZXR1cm4gY2lwaGVyIHRleHQKLSAgICBDaXBoZXJUZXh0TGVuZ3RoIFJldHVybiB0aGUgbGVuZ3RoIG9mIHJlYWwgdXNlZCBjaXBoZXIgdGV4dCBpbiBieXRlcwotCi1Ob3RlOgotICAgIFJlZmVyZW5jZSB0byBSRkMgMzYwMiBhbmQgTklTVCA4MDAtMzhBCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFFU19DQkNfRW5jcnlwdCAoCi0gICAgSU4gVUlOVDggUGxhaW5UZXh0W10sCi0gICAgSU4gVUlOVCBQbGFpblRleHRMZW5ndGgsCi0gICAgSU4gVUlOVDggS2V5W10sCi0gICAgSU4gVUlOVCBLZXlMZW5ndGgsCi0gICAgSU4gVUlOVDggSVZbXSwKLSAgICBJTiBVSU5UIElWTGVuZ3RoLAotICAgIE9VVCBVSU5UOCBDaXBoZXJUZXh0W10sCi0gICAgSU5PVVQgVUlOVCAqQ2lwaGVyVGV4dExlbmd0aCkKLXsKLSAgICBVSU5UIFBhZGRpbmdTaXplLCBQbGFpbkJsb2NrU3RhcnQsIENpcGhlckJsb2NrU3RhcnQsIENpcGhlckJsb2NrU2l6ZTsKLSAgICBVSU5UIEluZGV4OwotICAgIFVJTlQ4IEJsb2NrW0FFU19CTE9DS19TSVpFU107Ci0KLSAgICAvKgotICAgICAqIDEuIENoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgICogICAgLSBDaXBoZXJUZXh0TGVuZ3RoID4gKFBsYWluVGV4dExlbmd0aCArIFBhZGRpbmcgc2l6ZSksIFBhZGRpbmcgc2l6ZSA9IGJsb2NrIHNpemUgLSAoUGxhaW5UZXh0TGVuZ3RoICUgYmxvY2sgc2l6ZSkKLSAgICAgKiAgICAtIEtleSBsZW5ndGggbXVzdCBiZSAxNiwgMjQsIG9yIDMyIGJ5dGVzKDEyOCwgMTkyLCBvciAyNTYgYml0cykKLSAgICAgKiAgICAtIElWIGxlbmd0aCBtdXN0IGJlIDE2IGJ5dGVzKDEyOCBiaXRzKQotICAgICAqLwotICAgIFBhZGRpbmdTaXplID0gKChVSU5UKSBBRVNfQkxPQ0tfU0laRVMpIC0gKFBsYWluVGV4dExlbmd0aCAlICgoVUlOVClBRVNfQkxPQ0tfU0laRVMpKTsKLSAgICBpZiAoKkNpcGhlclRleHRMZW5ndGggPCAoUGxhaW5UZXh0TGVuZ3RoICsgUGFkZGluZ1NpemUpKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQUVTX0NCQ19FbmNyeXB0OiBjaXBoZXIgdGV4dCBsZW5ndGggaXMgJWQgYnl0ZXMgPCAocGxhaW4gdGV4dCBsZW5ndGggJWQgYnl0ZXMgKyBwYWRkaW5nIHNpemUgJWQgYnl0ZXMpLlxuIiwKLSAgICAgICAgICAgICpDaXBoZXJUZXh0TGVuZ3RoLCBQbGFpblRleHRMZW5ndGgsIFBhZGRpbmdTaXplKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIGlmICgoS2V5TGVuZ3RoICE9IEFFU19LRVkxMjhfTEVOR1RIKSAmJiAoS2V5TGVuZ3RoICE9IEFFU19LRVkxOTJfTEVOR1RIKSAmJiAoS2V5TGVuZ3RoICE9IEFFU19LRVkyNTZfTEVOR1RIKSkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFFU19DQkNfRW5jcnlwdDoga2V5IGxlbmd0aCBpcyAlZCBieXRlcywgaXQgbXVzdCBiZSAlZCwgJWQsIG9yICVkIGJ5dGVzKDEyOCwgMTkyLCBvciAyNTYgYml0cykuXG4iLAotICAgICAgICAgICAgS2V5TGVuZ3RoLCBBRVNfS0VZMTI4X0xFTkdUSCwgQUVTX0tFWTE5Ml9MRU5HVEgsIEFFU19LRVkyNTZfTEVOR1RIKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIGlmIChJVkxlbmd0aCAhPSBBRVNfQ0JDX0lWX0xFTkdUSCkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFFU19DQkNfRW5jcnlwdDogSVYgbGVuZ3RoIGlzICVkIGJ5dGVzLCBpdCBtdXN0IGJlICVkIGJ5dGVzKDEyOGJpdHMpLlxuIiwKLSAgICAgICAgICAgIElWTGVuZ3RoLCBBRVNfQ0JDX0lWX0xFTkdUSCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotCi0gICAgLyoKLSAgICAgKiAyLiBNYWluIGFsZ29yaXRobQotICAgICAqICAgIC0gUGxhaW4gdGV4dCBkaXZpZGUgaW50byBzZXJ2ZXJhbCBibG9ja3MgKDE2IGJ5dGVzL2Jsb2NrKQotICAgICAqICAgIC0gSWYgcGxhaW4gdGV4dCBpcyBkaXZpZGVkIHdpdGggbm8gcmVtYWluZGVyIGJ5IGJsb2NrLCBhZGQgYSBuZXcgYmxvY2sgYW5kIHBhZGRpbmcgc2l6ZSA9IGJsb2NrKDE2IGJ5dGVzKQotICAgICAqICAgIC0gSWYgcGxhaW4gdGV4dCBpcyBub3QgZGl2aWRlZCB3aXRoIG5vIHJlbWFpbmRlciBieSBibG9jaywgcGFkZGluZyBzaXplID0gKGJsb2NrIC0gcmVtYWluZGVyIHBsYWluIHRleHQpCi0gICAgICogICAgLSBFeGVjdXRlIEFFU19FbmNyeXB0IHByb2NlZHVyZS4KLSAgICAgKgotICAgICAqICAgIC0gUGFkZGluZyBtZXRob2Q6IFRoZSByZW1haW5kZXIgYnl0ZXMgd2lsbCBiZSBmaWxsZWQgd2l0aCBwYWRkaW5nIHNpemUgKDEgYnl0ZSkKLSAgICAgKi8KLSAgICBQbGFpbkJsb2NrU3RhcnQgPSAwOwotICAgIENpcGhlckJsb2NrU3RhcnQgPSAwOwotICAgIHdoaWxlICgoUGxhaW5UZXh0TGVuZ3RoIC0gUGxhaW5CbG9ja1N0YXJ0KSA+PSBBRVNfQkxPQ0tfU0laRVMpCi0gICAgewotICAgICAgICBpZiAoQ2lwaGVyQmxvY2tTdGFydCA9PSAwKSB7Ci0gICAgICAgICAgICBmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBBRVNfQkxPQ0tfU0laRVM7IEluZGV4KyspCi0gICAgICAgICAgICAgICAgQmxvY2tbSW5kZXhdID0gUGxhaW5UZXh0W1BsYWluQmxvY2tTdGFydCArIEluZGV4XV5JVltJbmRleF07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBBRVNfQkxPQ0tfU0laRVM7IEluZGV4KyspCi0gICAgICAgICAgICAgICAgQmxvY2tbSW5kZXhdID0gUGxhaW5UZXh0W1BsYWluQmxvY2tTdGFydCArIEluZGV4XV5DaXBoZXJUZXh0W0NpcGhlckJsb2NrU3RhcnQgLSAoKFVJTlQpIEFFU19CTE9DS19TSVpFUykgKyBJbmRleF07Ci0gICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAgICAgQ2lwaGVyQmxvY2tTaXplID0gKkNpcGhlclRleHRMZW5ndGggLSBDaXBoZXJCbG9ja1N0YXJ0OwotICAgICAgICBBRVNfRW5jcnlwdChCbG9jaywgQUVTX0JMT0NLX1NJWkVTICwgS2V5LCBLZXlMZW5ndGgsIENpcGhlclRleHQgKyBDaXBoZXJCbG9ja1N0YXJ0LCAmQ2lwaGVyQmxvY2tTaXplKTsKLQotICAgICAgICBQbGFpbkJsb2NrU3RhcnQgKz0gKChVSU5UKSBBRVNfQkxPQ0tfU0laRVMpOwotICAgICAgICBDaXBoZXJCbG9ja1N0YXJ0ICs9IENpcGhlckJsb2NrU2l6ZTsKLSAgICB9IC8qIEVuZCBvZiB3aGlsZSAqLwotCi0gICAgTmRpc01vdmVNZW1vcnkoQmxvY2ssICgmUGxhaW5UZXh0WzBdICsgUGxhaW5CbG9ja1N0YXJ0KSwgKFBsYWluVGV4dExlbmd0aCAtIFBsYWluQmxvY2tTdGFydCkpOwotICAgIE5kaXNGaWxsTWVtb3J5KChCbG9jayArICgoKFVJTlQpIEFFU19CTE9DS19TSVpFUykgLVBhZGRpbmdTaXplKSksIFBhZGRpbmdTaXplLCAoVUlOVDgpIFBhZGRpbmdTaXplKTsKLSAgICBpZiAoQ2lwaGVyQmxvY2tTdGFydCA9PSAwKSB7Ci0gICAgICAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgQUVTX0JMT0NLX1NJWkVTOyBJbmRleCsrKQotICAgICAgICAgICBCbG9ja1tJbmRleF0gXj0gSVZbSW5kZXhdOwotICAgIH0gZWxzZSB7Ci0gICAgICAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgQUVTX0JMT0NLX1NJWkVTOyBJbmRleCsrKQotICAgICAgICAgICBCbG9ja1tJbmRleF0gXj0gQ2lwaGVyVGV4dFtDaXBoZXJCbG9ja1N0YXJ0IC0gKChVSU5UKSBBRVNfQkxPQ0tfU0laRVMpICsgSW5kZXhdOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgQ2lwaGVyQmxvY2tTaXplID0gKkNpcGhlclRleHRMZW5ndGggLSBDaXBoZXJCbG9ja1N0YXJ0OwotICAgIEFFU19FbmNyeXB0KEJsb2NrLCBBRVNfQkxPQ0tfU0laRVMgLCBLZXksIEtleUxlbmd0aCwgQ2lwaGVyVGV4dCArIENpcGhlckJsb2NrU3RhcnQsICZDaXBoZXJCbG9ja1NpemUpOwotICAgIENpcGhlckJsb2NrU3RhcnQgKz0gQ2lwaGVyQmxvY2tTaXplOwotICAgICpDaXBoZXJUZXh0TGVuZ3RoID0gQ2lwaGVyQmxvY2tTdGFydDsKLX0gLyogRW5kIG9mIEFFU19DQkNfRW5jcnlwdCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgQUVTLUNCQyBkZWNyeXB0aW9uCi0KLUFyZ3VtZW50czoKLSAgICBDaXBoZXJUZXh0ICAgICAgIENpcGhlciB0ZXh0Ci0gICAgQ2lwaGVyVGV4dExlbmd0aCBUaGUgbGVuZ3RoIG9mIGNpcGhlciB0ZXh0IGluIGJ5dGVzCi0gICAgS2V5ICAgICAgICAgICAgICBDaXBoZXIga2V5LCBpdCBtYXkgYmUgMTYsIDI0LCBvciAzMiBieXRlcyAoMTI4LCAxOTIsIG9yIDI1NiBiaXRzKQotICAgIEtleUxlbmd0aCAgICAgICAgVGhlIGxlbmd0aCBvZiBjaXBoZXIga2V5IGluIGJ5dGVzCi0gICAgSVYgICAgICAgICAgICAgICBJbml0aWFsaXphdGlvbiB2ZWN0b3IsIGl0IG1heSBiZSAxNiBieXRlcyAoMTI4IGJpdHMpCi0gICAgSVZMZW5ndGggICAgICAgICBUaGUgbGVuZ3RoIG9mIGluaXRpYWxpemF0aW9uIHZlY3RvciBpbiBieXRlcwotICAgIFBsYWluVGV4dExlbmd0aCAgVGhlIGxlbmd0aCBvZiBhbGxvY2F0ZWQgcGxhaW4gdGV4dCBpbiBieXRlcwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgUGxhaW5UZXh0ICAgICAgICBSZXR1cm4gcGxhaW4gdGV4dAotICAgIFBsYWluVGV4dExlbmd0aCAgUmV0dXJuIHRoZSBsZW5ndGggb2YgcmVhbCB1c2VkIHBsYWluIHRleHQgaW4gYnl0ZXMKLQotTm90ZToKLSAgICBSZWZlcmVuY2UgdG8gUkZDIDM2MDIgYW5kIE5JU1QgODAwLTM4QQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBRVNfQ0JDX0RlY3J5cHQgKAotICAgIElOIFVJTlQ4IENpcGhlclRleHRbXSwKLSAgICBJTiBVSU5UIENpcGhlclRleHRMZW5ndGgsCi0gICAgSU4gVUlOVDggS2V5W10sCi0gICAgSU4gVUlOVCBLZXlMZW5ndGgsCi0gICAgSU4gVUlOVDggSVZbXSwKLSAgICBJTiBVSU5UIElWTGVuZ3RoLAotICAgIE9VVCBVSU5UOCBQbGFpblRleHRbXSwKLSAgICBJTk9VVCBVSU5UICpQbGFpblRleHRMZW5ndGgpCi17Ci0gICAgVUlOVCBQYWRkaW5nU2l6ZSwgUGxhaW5CbG9ja1N0YXJ0LCBDaXBoZXJCbG9ja1N0YXJ0LCBQbGFpbkJsb2NrU2l6ZTsKLSAgICBVSU5UIEluZGV4OwotCi0gICAgLyoKLSAgICAgKiAxLiBDaGVjayB0aGUgaW5wdXQgcGFyYW1ldGVycwotICAgICAqICAgIC0gQ2lwaGVyVGV4dExlbmd0aCBtdXN0IGJlIGRpdmlkZWQgd2l0aCBubyByZW1haW5kZXIgYnkgYmxvY2sKLSAgICAgKiAgICAtIEtleSBsZW5ndGggbXVzdCBiZSAxNiwgMjQsIG9yIDMyIGJ5dGVzKDEyOCwgMTkyLCBvciAyNTYgYml0cykKLSAgICAgKiAgICAtIElWIGxlbmd0aCBtdXN0IGJlIDE2IGJ5dGVzKDEyOCBiaXRzKQotICAgICAqLwotICAgIGlmICgoQ2lwaGVyVGV4dExlbmd0aCAlIEFFU19CTE9DS19TSVpFUykgIT0gMCkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFFU19DQkNfRGVjcnlwdDogY2lwaGVyIHRleHQgbGVuZ3RoIGlzICVkIGJ5dGVzLCBpdCBjYW4ndCBiZSBkaXZpZGVkIHdpdGggbm8gcmVtYWluZGVyIGJ5IGJsb2NrIHNpemUoJWQpLlxuIiwKLSAgICAgICAgICAgIENpcGhlclRleHRMZW5ndGgsIEFFU19CTE9DS19TSVpFUykpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAoKEtleUxlbmd0aCAhPSBBRVNfS0VZMTI4X0xFTkdUSCkgJiYgKEtleUxlbmd0aCAhPSBBRVNfS0VZMTkyX0xFTkdUSCkgJiYgKEtleUxlbmd0aCAhPSBBRVNfS0VZMjU2X0xFTkdUSCkpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBRVNfQ0JDX0RlY3J5cHQ6IGtleSBsZW5ndGggaXMgJWQgYnl0ZXMsIGl0IG11c3QgYmUgJWQsICVkLCBvciAlZCBieXRlcygxMjgsIDE5Miwgb3IgMjU2IGJpdHMpLlxuIiwKLSAgICAgICAgICAgIEtleUxlbmd0aCwgQUVTX0tFWTEyOF9MRU5HVEgsIEFFU19LRVkxOTJfTEVOR1RILCBBRVNfS0VZMjU2X0xFTkdUSCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAoSVZMZW5ndGggIT0gQUVTX0NCQ19JVl9MRU5HVEgpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBRVNfQ0JDX0RlY3J5cHQ6IElWIGxlbmd0aCBpcyAlZCBieXRlcywgaXQgbXVzdCBiZSAlZCBieXRlcygxMjhiaXRzKS5cbiIsCi0gICAgICAgICAgICBJVkxlbmd0aCwgQUVTX0NCQ19JVl9MRU5HVEgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLQotICAgIC8qCi0gICAgICogMi4gTWFpbiBhbGdvcml0aG0KLSAgICAgKiAgICAtIEN5cGhlciB0ZXh0IGRpdmlkZSBpbnRvIHNlcnZlcmFsIGJsb2NrcyAoMTYgYnl0ZXMvYmxvY2spCi0gICAgICogICAgLSBFeGVjdXRlIEFFU19EZWNyeXB0IHByb2NlZHVyZS4KLSAgICAgKiAgICAtIFJlbW92ZSBwYWRkaW5nIGJ5dGVzLCBwYWRkaW5nIHNpemUgaXMgdGhlIGxhc3QgYnl0ZSBvZiBwbGFpbiB0ZXh0Ci0gICAgICovCi0gICAgQ2lwaGVyQmxvY2tTdGFydCA9IDA7Ci0gICAgUGxhaW5CbG9ja1N0YXJ0ID0gMDsKLSAgICB3aGlsZSAoKENpcGhlclRleHRMZW5ndGggLSBDaXBoZXJCbG9ja1N0YXJ0KSA+PSBBRVNfQkxPQ0tfU0laRVMpCi0gICAgewotICAgICAgICBQbGFpbkJsb2NrU2l6ZSA9ICpQbGFpblRleHRMZW5ndGggLSBQbGFpbkJsb2NrU3RhcnQ7Ci0gICAgICAgIEFFU19EZWNyeXB0KENpcGhlclRleHQgKyBDaXBoZXJCbG9ja1N0YXJ0LCBBRVNfQkxPQ0tfU0laRVMgLCBLZXksIEtleUxlbmd0aCwgUGxhaW5UZXh0ICsgUGxhaW5CbG9ja1N0YXJ0LCAmUGxhaW5CbG9ja1NpemUpOwotCi0gICAgICAgIGlmIChQbGFpbkJsb2NrU3RhcnQgPT0gMCkgewotICAgICAgICAgICAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgQUVTX0JMT0NLX1NJWkVTOyBJbmRleCsrKQotICAgICAgICAgICAgICAgIFBsYWluVGV4dFtQbGFpbkJsb2NrU3RhcnQgKyBJbmRleF0gXj0gSVZbSW5kZXhdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgQUVTX0JMT0NLX1NJWkVTOyBJbmRleCsrKQotICAgICAgICAgICAgICAgIFBsYWluVGV4dFtQbGFpbkJsb2NrU3RhcnQgKyBJbmRleF0gXj0gQ2lwaGVyVGV4dFtDaXBoZXJCbG9ja1N0YXJ0ICsgSW5kZXggLSAoKFVJTlQpIEFFU19CTE9DS19TSVpFUyldOwotICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgICAgIENpcGhlckJsb2NrU3RhcnQgKz0gQUVTX0JMT0NLX1NJWkVTOwotICAgICAgICBQbGFpbkJsb2NrU3RhcnQgKz0gUGxhaW5CbG9ja1NpemU7Ci0gICAgfSAvKiBFbmQgb2Ygd2hpbGUgKi8KLQotICAgIFBhZGRpbmdTaXplID0gKFVJTlQ4KSBQbGFpblRleHRbUGxhaW5CbG9ja1N0YXJ0IC0xXTsKLSAgICAqUGxhaW5UZXh0TGVuZ3RoID0gUGxhaW5CbG9ja1N0YXJ0IC0gUGFkZGluZ1NpemU7Ci0KLX0gLyogRW5kIG9mIEFFU19DQkNfRW5jcnlwdCAqLwotCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBBRVMtQ01BQyBnZW5lcmF0ZSBzdWJrZXkKLQotQXJndW1lbnRzOgotICAgIEtleSAgICAgICAgQ2lwaGVyIGtleSAxMjggYml0cwotICAgIEtleUxlbmd0aCAgVGhlIGxlbmd0aCBvZiBDaXBoZXIga2V5IGluIGJ5dGVzCi0KLVJldHVybiBWYWx1ZToKLSAgICBTdWJLZXkxICAgIFN1YktleSAxIDEyOCBiaXRzCi0gICAgU3ViS2V5MiAgICBTdWJLZXkgMiAxMjggYml0cwotCi1Ob3RlOgotICAgIFJlZmVyZW5jZSB0byBSRkMgNDQ5MwotCi0gICAgU3RlcCAxLiAgTCA6PSBBRVMtMTI4KEssIGNvbnN0X1plcm8pOwotICAgIFN0ZXAgMi4gIGlmIE1TQihMKSBpcyBlcXVhbCB0byAwCi0gICAgICAgICAgICAgICAgdGhlbiAgICBLMSA6PSBMIDw8IDE7Ci0gICAgICAgICAgICAgICAgZWxzZSAgICBLMSA6PSAoTCA8PCAxKSBYT1IgY29uc3RfUmI7Ci0gICAgU3RlcCAzLiAgaWYgTVNCKEsxKSBpcyBlcXVhbCB0byAwCi0gICAgICAgICAgICAgICAgdGhlbiAgICBLMiA6PSBLMSA8PCAxOwotICAgICAgICAgICAgICAgIGVsc2UgICAgSzIgOj0gKEsxIDw8IDEpIFhPUiBjb25zdF9SYjsKLSAgICBTdGVwIDQuICByZXR1cm4gSzEsIEsyOwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBRVNfQ01BQ19HZW5lcmF0ZVN1YktleSAoCi0gICAgSU4gVUlOVDggS2V5W10sCi0gICAgSU4gVUlOVCBLZXlMZW5ndGgsCi0gICAgT1VUIFVJTlQ4IFN1YktleTFbXSwKLSAgICBPVVQgVUlOVDggU3ViS2V5MltdKQotewotICAgIFVJTlQ4IE1TQl9MID0gMCwgTVNCX0sxID0gMCwgVG9wX0JpdCA9IDA7Ci0gICAgVUlOVCAgU3ViS2V5MV9MZW5ndGggPSAwOwotICAgIElOVCAgIEluZGV4ID0gMDsKLQotICAgIGlmIChLZXlMZW5ndGggIT0gQUVTX0tFWTEyOF9MRU5HVEgpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBRVNfQ01BQ19HZW5lcmF0ZVN1YktleToga2V5IGxlbmd0aCBpcyAlZCBieXRlcywgaXQgbXVzdCBiZSAlZCBieXRlcygxMjggYml0cykuXG4iLAotICAgICAgICAgICAgS2V5TGVuZ3RoLCBBRVNfS0VZMTI4X0xFTkdUSCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qIFN0ZXAgMTogTCA6PSBBRVMtMTI4KEssIGNvbnN0X1plcm8pOyAqLwotICAgIFN1YktleTFfTGVuZ3RoID0gMTY7Ci0gICAgQUVTX0VuY3J5cHQoQ29uc3RfWmVybywgc2l6ZW9mKENvbnN0X1plcm8pLCBLZXksIEtleUxlbmd0aCwgU3ViS2V5MSwgJlN1YktleTFfTGVuZ3RoKTsKLQotICAgIC8qCi0gICAgICogU3RlcCAyLiAgaWYgTVNCKEwpIGlzIGVxdWFsIHRvIDAKLSAgICAgKiAgICAgICAgICAgdGhlbiAgICBLMSA6PSBMIDw8IDE7Ci0gICAgICogICAgICAgICAgIGVsc2UgICAgSzEgOj0gKEwgPDwgMSkgWE9SIGNvbnN0X1JiOwotICAgICAqLwotICAgIE1TQl9MID0gU3ViS2V5MVswXSAmIDB4ODA7Ci0gICAgZm9yKEluZGV4ID0gMDsgSW5kZXggPCAxNTsgSW5kZXgrKykgewotICAgICAgICBUb3BfQml0ID0gKFN1YktleTFbSW5kZXggKyAxXSAmIDB4ODApPzE6MDsKLSAgICAgICAgU3ViS2V5MVtJbmRleF0gPDw9IDE7Ci0gICAgICAgIFN1YktleTFbSW5kZXhdIHw9IFRvcF9CaXQ7Ci0gICAgfQotICAgIFN1YktleTFbMTVdIDw8PSAxOwotICAgIGlmIChNU0JfTCA+IDApIHsKLSAgICAgICAgZm9yKEluZGV4ID0gMDsgSW5kZXggPCAxNjsgSW5kZXgrKykKLSAgICAgICAgICAgIFN1YktleTFbSW5kZXhdIF49IENvbnN0X1JiW0luZGV4XTsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgLyoKLSAgICAgKiBTdGVwIDMuICBpZiBNU0IoSzEpIGlzIGVxdWFsIHRvIDAKLSAgICAgKiAgICAgICAgICAgdGhlbiAgICBLMiA6PSBLMSA8PCAxOwotICAgICAqICAgICAgICAgICBlbHNlICAgIEsyIDo9IChLMSA8PCAxKSBYT1IgY29uc3RfUmI7Ci0gICAgICovCi0gICAgTVNCX0sxID0gU3ViS2V5MVswXSAmIDB4ODA7Ci0gICAgZm9yKEluZGV4ID0gMDsgSW5kZXggPCAxNTsgSW5kZXgrKykgewotICAgICAgICBUb3BfQml0ID0gKFN1YktleTFbSW5kZXggKyAxXSAmIDB4ODApPzE6MDsKLSAgICAgICAgU3ViS2V5MltJbmRleF0gPSBTdWJLZXkxW0luZGV4XSA8PCAxOwotICAgICAgICBTdWJLZXkyW0luZGV4XSB8PSBUb3BfQml0OwotICAgIH0KLSAgICBTdWJLZXkyWzE1XSA9IFN1YktleTFbMTVdIDw8IDE7Ci0gICAgaWYgKE1TQl9LMSA+IDApIHsKLSAgICAgICAgZm9yKEluZGV4ID0gMDsgSW5kZXggPCAxNjsgSW5kZXgrKykKLSAgICAgICAgICAgIFN1YktleTJbSW5kZXhdIF49IENvbnN0X1JiW0luZGV4XTsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotfSAvKiBFbmQgb2YgQUVTX0NNQUNfR2VuZXJhdGVTdWJLZXkgKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEFFUy1DTUFDCi0KLUFyZ3VtZW50czoKLSAgICBQbGFpblRleHQgICAgICAgIFBsYWluIHRleHQKLSAgICBQbGFpblRleHRMZW5ndGggIFRoZSBsZW5ndGggb2YgcGxhaW4gdGV4dCBpbiBieXRlcwotICAgIEtleSAgICAgICAgICAgICAgQ2lwaGVyIGtleSwgaXQgbWF5IGJlIDE2LCAyNCwgb3IgMzIgYnl0ZXMgKDEyOCwgMTkyLCBvciAyNTYgYml0cykKLSAgICBLZXlMZW5ndGggICAgICAgIFRoZSBsZW5ndGggb2YgY2lwaGVyIGtleSBpbiBieXRlcwotICAgIE1BQ1RleHRMZW5ndGggICAgVGhlIGxlbmd0aCBvZiBhbGxvY2F0ZWQgbWVtb3J5IHNwYWNlcyBpbiBieXRlcwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTUFDVGV4dCAgICAgICBNZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUgKDEyOC1iaXQgc3RyaW5nKQotICAgIE1BQ1RleHRMZW5ndGggUmV0dXJuIHRoZSBsZW5ndGggb2YgTWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlIGluIGJ5dGVzCi0KLU5vdGU6Ci0gICAgUmVmZXJlbmNlIHRvIFJGQyA0NDkzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFFU19DTUFDICgKLSAgICBJTiBVSU5UOCBQbGFpblRleHRbXSwKLSAgICBJTiBVSU5UIFBsYWluVGV4dExlbmd0aCwKLSAgICBJTiBVSU5UOCBLZXlbXSwKLSAgICBJTiBVSU5UIEtleUxlbmd0aCwKLSAgICBPVVQgVUlOVDggTUFDVGV4dFtdLAotICAgIElOT1VUIFVJTlQgKk1BQ1RleHRMZW5ndGgpCi17Ci0gICAgVUlOVCAgUGxhaW5CbG9ja1N0YXJ0OwotICAgIFVJTlQ4IFhbQUVTX0JMT0NLX1NJWkVTXSwgWVtBRVNfQkxPQ0tfU0laRVNdOwotICAgIFVJTlQ4IFN1YktleTFbMTZdOwotICAgIFVJTlQ4IFN1YktleTJbMTZdOwotICAgIElOVCBYX0xlbmd0aCwgSW5kZXg7Ci0KLSAgICBpZiAoKk1BQ1RleHRMZW5ndGggPCBBRVNfTUFDX0xFTkdUSCkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFFU19DTUFDOiBNQUMgdGV4dCBsZW5ndGggaXMgbGVzcyB0aGFuICVkIGJ5dGVzKS5cbiIsCi0gICAgICAgICAgICBBRVNfTUFDX0xFTkdUSCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAoS2V5TGVuZ3RoICE9IEFFU19LRVkxMjhfTEVOR1RIKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQUVTX0NNQUM6IGtleSBsZW5ndGggaXMgJWQgYnl0ZXMsIGl0IG11c3QgYmUgJWQgYnl0ZXMoMTI4IGJpdHMpLlxuIiwKLSAgICAgICAgICAgIEtleUxlbmd0aCwgQUVTX0tFWTEyOF9MRU5HVEgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAvKiBTdGVwIDEuICAoSzEsSzIpIDo9IEdlbmVyYXRlX1N1YmtleShLKTsgKi8KLSAgICBOZGlzWmVyb01lbW9yeShTdWJLZXkxLCAxNik7Ci0gICAgTmRpc1plcm9NZW1vcnkoU3ViS2V5MiwgMTYpOwotICAgIEFFU19DTUFDX0dlbmVyYXRlU3ViS2V5KEtleSwgS2V5TGVuZ3RoLCBTdWJLZXkxLCBTdWJLZXkyKTsKLQotICAgIC8qCi0gICAgICogMi4gTWFpbiBhbGdvcml0aG0KLSAgICAgKiAgICAtIFBsYWluIHRleHQgZGl2aWRlIGludG8gc2VydmVyYWwgYmxvY2tzICgxNiBieXRlcy9ibG9jaykKLSAgICAgKiAgICAtIElmIHBsYWluIHRleHQgaXMgbm90IGRpdmlkZWQgd2l0aCBubyByZW1haW5kZXIgYnkgYmxvY2ssIHBhZGRpbmcgc2l6ZSA9IChibG9jayAtIHJlbWFpbmRlciBwbGFpbiB0ZXh0KQotICAgICAqICAgIC0gRXhlY3V0ZSBBRVNfRW5jcnlwdCBwcm9jZWR1cmUuCi0gICAgICovCi0gICAgUGxhaW5CbG9ja1N0YXJ0ID0gMDsKLSAgICBOZGlzTW92ZU1lbW9yeShYLCBDb25zdF9aZXJvLCBBRVNfQkxPQ0tfU0laRVMpOwotICAgIHdoaWxlICgoUGxhaW5UZXh0TGVuZ3RoIC0gUGxhaW5CbG9ja1N0YXJ0KSA+IEFFU19CTE9DS19TSVpFUykKLSAgICB7Ci0gICAgICAgIGZvciAoSW5kZXggPSAwOyBJbmRleCA8IEFFU19CTE9DS19TSVpFUzsgSW5kZXgrKykKLSAgICAgICAgICAgICAgICBZW0luZGV4XSA9IFBsYWluVGV4dFtQbGFpbkJsb2NrU3RhcnQgKyBJbmRleF1eWFtJbmRleF07Ci0KLSAgICAgICAgWF9MZW5ndGggPSBzaXplb2YoWCk7Ci0gICAgICAgIEFFU19FbmNyeXB0KFksIHNpemVvZihZKSAsIEtleSwgS2V5TGVuZ3RoLCBYLCAmWF9MZW5ndGgpOwotICAgICAgICBQbGFpbkJsb2NrU3RhcnQgKz0gKChVSU5UKSBBRVNfQkxPQ0tfU0laRVMpOwotICAgIH0gLyogRW5kIG9mIHdoaWxlICovCi0gICAgaWYgKChQbGFpblRleHRMZW5ndGggLSBQbGFpbkJsb2NrU3RhcnQpID09IEFFU19CTE9DS19TSVpFUykgewotICAgICAgICBmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBBRVNfQkxPQ0tfU0laRVM7IEluZGV4KyspCi0gICAgICAgICAgICAgICAgWVtJbmRleF0gPSBQbGFpblRleHRbUGxhaW5CbG9ja1N0YXJ0ICsgSW5kZXhdXlhbSW5kZXhdXlN1YktleTFbSW5kZXhdOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE5kaXNaZXJvTWVtb3J5KFksIEFFU19CTE9DS19TSVpFUyk7Ci0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KFksICZQbGFpblRleHRbUGxhaW5CbG9ja1N0YXJ0XSwgKFBsYWluVGV4dExlbmd0aCAtIFBsYWluQmxvY2tTdGFydCkpOwotICAgICAgICBZWyhQbGFpblRleHRMZW5ndGggLSBQbGFpbkJsb2NrU3RhcnQpXSA9IDB4ODA7Ci0gICAgICAgIGZvciAoSW5kZXggPSAwOyBJbmRleCA8IEFFU19CTE9DS19TSVpFUzsgSW5kZXgrKykKLSAgICAgICAgICAgICAgICBZW0luZGV4XSA9IFlbSW5kZXhdXlhbSW5kZXhdXlN1YktleTJbSW5kZXhdOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgQUVTX0VuY3J5cHQoWSwgc2l6ZW9mKFkpICwgS2V5LCBLZXlMZW5ndGgsIE1BQ1RleHQsIE1BQ1RleHRMZW5ndGgpOwotfSAvKiBFbmQgb2YgQUVTX0NNQUMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X2JpZ2ludGVnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X2JpZ2ludGVnZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM0NmM1Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9iaWdpbnRlZ2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTE5ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0JY21tX3Byb2ZpbGUuYwotCi0gICAgQWJzdHJhY3Q6Ci0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotI2luY2x1ZGUgImNyeXB0X2JpZ2ludGVnZXIuaCIKLQotI2lmZGVmIF9fS0VSTkVMX18KLSNkZWZpbmUgREVCVUdQUklOVChmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiBmbXQsICMjIGFyZ3MpCi0jZWxzZQotI2RlZmluZSBERUJVR1BSSU5UKGZtdCwgYXJncy4uLikgcHJpbnRmKGZtdCwgIyMgYXJncykKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KLSNkZWZpbmUgVUlOVDMyX0hCSVRTKHZhbHVlKQkoKCh2YWx1ZSkgPj4gMHgxMCkgJiAweGZmZmYpCi0jZGVmaW5lIFVJTlQzMl9MQklUUyh2YWx1ZSkJKCh2YWx1ZSkgJiAweGZmZmYpCi0jZGVmaW5lIFVJTlQzMl9HRVRCWVRFKHZhbHVlLCBpbmRleCkJKCgodmFsdWUpID4+ICgoaW5kZXgpKjgpKSAmIDB4ZmYpCi0jZGVmaW5lIFVJTlQ2NF9IQklUUyh2YWx1ZSkJKCgodmFsdWUpID4+IDB4MjApICYgMHhmZmZmZmZmZikKLSNkZWZpbmUgVUlOVDY0X0xCSVRTKHZhbHVlKQkoKHZhbHVlKSAmIDB4ZmZmZmZmZmYpCi0KLXN0YXRpYyBVSU5UOCBXUFNfREhfUF9WQUxVRVsxOTJdID0KLXsKLSAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAotICAgIDB4QzksIDB4MEYsIDB4REEsIDB4QTIsIDB4MjEsIDB4NjgsIDB4QzIsIDB4MzQsCi0gICAgMHhDNCwgMHhDNiwgMHg2MiwgMHg4QiwgMHg4MCwgMHhEQywgMHgxQywgMHhEMSwKLSAgICAweDI5LCAweDAyLCAweDRFLCAweDA4LCAweDhBLCAweDY3LCAweENDLCAweDc0LAotICAgIDB4MDIsIDB4MEIsIDB4QkUsIDB4QTYsIDB4M0IsIDB4MTMsIDB4OUIsIDB4MjIsCi0gICAgMHg1MSwgMHg0QSwgMHgwOCwgMHg3OSwgMHg4RSwgMHgzNCwgMHgwNCwgMHhERCwKLSAgICAweEVGLCAweDk1LCAweDE5LCAweEIzLCAweENELCAweDNBLCAweDQzLCAweDFCLAotICAgIDB4MzAsIDB4MkIsIDB4MEEsIDB4NkQsIDB4RjIsIDB4NUYsIDB4MTQsIDB4MzcsCi0gICAgMHg0RiwgMHhFMSwgMHgzNSwgMHg2RCwgMHg2RCwgMHg1MSwgMHhDMiwgMHg0NSwKLSAgICAweEU0LCAweDg1LCAweEI1LCAweDc2LCAweDYyLCAweDVFLCAweDdFLCAweEM2LAotICAgIDB4RjQsIDB4NEMsIDB4NDIsIDB4RTksIDB4QTYsIDB4MzcsIDB4RUQsIDB4NkIsCi0gICAgMHgwQiwgMHhGRiwgMHg1QywgMHhCNiwgMHhGNCwgMHgwNiwgMHhCNywgMHhFRCwKLSAgICAweEVFLCAweDM4LCAweDZCLCAweEZCLCAweDVBLCAweDg5LCAweDlGLCAweEE1LAotICAgIDB4QUUsIDB4OUYsIDB4MjQsIDB4MTEsIDB4N0MsIDB4NEIsIDB4MUYsIDB4RTYsCi0gICAgMHg0OSwgMHgyOCwgMHg2NiwgMHg1MSwgMHhFQywgMHhFNCwgMHg1QiwgMHgzRCwKLSAgICAweEMyLCAweDAwLCAweDdDLCAweEI4LCAweEExLCAweDYzLCAweEJGLCAweDA1LAotICAgIDB4OTgsIDB4REEsIDB4NDgsIDB4MzYsIDB4MUMsIDB4NTUsIDB4RDMsIDB4OUEsCi0gICAgMHg2OSwgMHgxNiwgMHgzRiwgMHhBOCwgMHhGRCwgMHgyNCwgMHhDRiwgMHg1RiwKLSAgICAweDgzLCAweDY1LCAweDVELCAweDIzLCAweERDLCAweEEzLCAweEFELCAweDk2LAotICAgIDB4MUMsIDB4NjIsIDB4RjMsIDB4NTYsIDB4MjAsIDB4ODUsIDB4NTIsIDB4QkIsCi0gICAgMHg5RSwgMHhENSwgMHgyOSwgMHgwNywgMHg3MCwgMHg5NiwgMHg5NiwgMHg2RCwKLSAgICAweDY3LCAweDBDLCAweDM1LCAweDRFLCAweDRBLCAweEJDLCAweDk4LCAweDA0LAotICAgIDB4RjEsIDB4NzQsIDB4NkMsIDB4MDgsIDB4Q0EsIDB4MjMsIDB4NzMsIDB4MjcsCi0gICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKLX07Ci0KLXN0YXRpYyBVSU5UOCBXUFNfREhfUl9WQUxVRVsxOTNdID0KLXsKLSAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLAotfTsKLQotc3RhdGljIFVJTlQ4IFdQU19ESF9YX1ZBTFVFWzE4NF0gPQotewotICAgIDB4MzYsIDB4ZjAsIDB4MjUsIDB4NWQsIDB4ZGUsIDB4OTcsIDB4M2QsIDB4Y2IsCi0gICAgMHgzYiwgMHgzOSwgMHg5ZCwgMHg3NCwgMHg3ZiwgMHgyMywgMHhlMywgMHgyZSwKLSAgICAweGQ2LCAweGZkLCAweGIxLCAweGY3LCAweDc1LCAweDk4LCAweDMzLCAweDhiLAotICAgIDB4ZmQsIDB4ZjQsIDB4NDEsIDB4NTksIDB4YzQsIDB4ZWMsIDB4NjQsIDB4ZGQsCi0gICAgMHhhZSwgMHhiNSwgMHhmNywgMHg4NiwgMHg3MSwgMHhjYiwgMHhmYiwgMHgyMiwKLSAgICAweDEwLCAweDZhLCAweGU2LCAweDRjLCAweDMyLCAweGM1LCAweGJjLCAweGU0LAotICAgIDB4Y2YsIDB4ZDQsIDB4ZjUsIDB4OTIsIDB4MGQsIDB4YTAsIDB4ZWIsIDB4YzgsCi0gICAgMHhiMCwgMHgxZSwgMHhjYSwgMHg5MiwgMHg5MiwgMHhhZSwgMHgzZCwgMHhiYSwKLSAgICAweDFiLCAweDdhLCAweDRhLCAweDg5LCAweDlkLCAweGExLCAweDgxLCAweDM5LAotICAgIDB4MGIsIDB4YjMsIDB4YmQsIDB4MTYsIDB4NTksIDB4YzgsIDB4MTIsIDB4OTQsCi0gICAgMHhmNCwgMHgwMCwgMHhhMywgMHg0OSwgMHgwYiwgMHhmOSwgMHg0OCwgMHgxMiwKLSAgICAweDExLCAweGM3LCAweDk0LCAweDA0LCAweGE1LCAweDc2LCAweDYwLCAweDVhLAotICAgIDB4NTEsIDB4NjAsIDB4ZGIsIDB4ZWUsIDB4ODMsIDB4YjQsIDB4ZTAsIDB4MTksCi0gICAgMHhiNiwgMHhkNywgMHg5OSwgMHhhZSwgMHgxMywgMHgxYiwgMHhhNCwgMHhjMiwKLSAgICAweDNkLCAweGZmLCAweDgzLCAweDQ3LCAweDVlLCAweDljLCAweDQwLCAweGZhLAotICAgIDB4NjcsIDB4MjUsIDB4YjcsIDB4YzksIDB4ZTMsIDB4YWEsIDB4MmMsIDB4NjUsCi0gICAgMHg5NiwgMHhlOSwgMHhjMCwgMHg1NywgMHgwMiwgMHhkYiwgMHgzMCwgMHhhMCwKLSAgICAweDdjLCAweDlhLCAweGEyLCAweGRjLCAweDIzLCAweDVjLCAweDUyLCAweDY5LAotICAgIDB4ZTMsIDB4OWQsIDB4MGMsIDB4YTksIDB4ZGYsIDB4N2EsIDB4YWQsIDB4NDQsCi0gICAgMHg2MSwgMHgyYSwgMHhkNiwgMHhmOCwgMHg4ZiwgMHg2OSwgMHg2OSwgMHg5MiwKLSAgICAweDk4LCAweGYzLCAweGNhLCAweGIxLCAweGI1LCAweDQzLCAweDY3LCAweGZiLAotICAgIDB4MGUsIDB4OGIsIDB4OTMsIDB4ZjcsIDB4MzUsIDB4ZGMsIDB4OGMsIDB4ZDgsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLX07Ci0KLXN0YXRpYyBVSU5UOCBXUFNfREhfUlJNb2RQX1ZBTFVFWzE5Ml0gPQotewotCTB4ZTMsIDB4YjMsIDB4M2MsIDB4NzIsIDB4NTksIDB4NTQsIDB4MWMsIDB4MDEsCi0JMHhlZSwgMHg5YywgMHg5YSwgMHgyMSwgMHg2YywgMHhjMSwgMHhlYiwgMHhkMiwKLQkweGFlLCAweDU5LCAweDQxLCAweDA0LCAweDc5LCAweDI5LCAweGExLCAweGM3LAotCTB4ZTksIDB4YzMsIDB4ZmEsIDB4MDIsIDB4Y2MsIDB4MjQsIDB4NTYsIDB4ZWYsCi0JMHgxMCwgMHgyNiwgMHgzMCwgMHhmYSwgMHg5YSwgMHgzNiwgMHhhNSwgMHgxZiwKLQkweDU3LCAweGI1LCAweDkzLCAweDQ4LCAweDY3LCAweDk4LCAweDQ0LCAweDYwLAotCTB4MGIsIDB4ZTQsIDB4OTYsIDB4NDcsIDB4YTgsIDB4N2MsIDB4N2IsIDB4MzcsCi0JMHhmOCwgMHgwNSwgMHg2NSwgMHg2NCwgMHg5NiwgMHg5YiwgMHg3ZiwgMHgwMiwKLQkweGRjLCAweDU0LCAweDFhLCAweDRlLCAweGQ0LCAweDA1LCAweDNmLCAweDU0LAotCTB4ZDYsIDB4MmEsIDB4MGUsIDB4ZWEsIDB4YjIsIDB4NzAsIDB4NTIsIDB4MWIsCi0JMHgyMiwgMHhjMiwgMHg5NiwgMHhlOSwgMHhkNCwgMHg2ZiwgMHhlYywgMHgyMywKLQkweDhlLCAweDFhLCAweGJkLCAweDc4LCAweDAyLCAweDIzLCAweGI3LCAweDZiLAotCTB4YjgsIDB4ZmUsIDB4NjEsIDB4MjEsIDB4MTksIDB4NmIsIDB4N2UsIDB4ODgsCi0JMHgxYywgMHg3MiwgMHg5YywgMHg3ZSwgMHgwNCwgMHhiOSwgMHhmNywgMHg5NiwKLQkweDA3LCAweGNkLCAweDBhLCAweDYyLCAweDhlLCAweDQzLCAweDQxLCAweDMwLAotCTB4MDQsIDB4YTUsIDB4NDEsIDB4ZmYsIDB4OTMsIDB4YWUsIDB4MWMsIDB4ZWIsCi0JMHhiMCwgMHgwNCwgMHhhNywgMHg1MCwgMHhkYiwgMHgxMCwgMHgyZCwgMHgzOSwKLQkweGI5LCAweDA1LCAweDJiLCAweGI0LCAweDdhLCAweDU4LCAweGYxLCAweDcwLAotCTB4N2UsIDB4OGMsIDB4ZDIsIDB4YWMsIDB4OTgsIDB4YjUsIDB4ZmIsIDB4NjIsCi0JMHg4ZiwgMHgyMywgMHgzMSwgMHhiMSwgMHgzYiwgMHgwMSwgMHhlMCwgMHgxOCwKLQkweGY0LCAweDY2LCAweGVlLCAweDVmLCAweGJjLCAweGQ0LCAweDlkLCAweDY4LAotCTB4ZDAsIDB4YWIsIDB4OTIsIDB4ZTEsIDB4ODMsIDB4OTcsIDB4ZjIsIDB4NDUsCi0JMHg4ZSwgMHgwZSwgMHgzZSwgMHgyMSwgMHg2NywgMHg0NywgMHg4YywgMHg3MywKLQkweGYxLCAweDE1LCAweGQyLCAweDdkLCAweDMyLCAweGM2LCAweDk1LCAweGUwLAotfTsKLQotc3RhdGljIFVJTlQ4IFZhbHVlXzBbMV0gPSB7MHgwMH07Ci1zdGF0aWMgVUlOVDggVmFsdWVfMVsxXSA9IHsweDAxfTsKLXN0YXRpYyBQQklHX0lOVEVHRVIgcEJJX1UgPSBOVUxMLCBwQklfUyA9IE5VTEwsIHBCSV9PID0gTlVMTDsKLXN0YXRpYyBVSU5UIEJpdHNfT2ZfUiA9IDA7Ci0KLQotVk9JRCBCaWdJbnRlZ2VyX1ByaW50ICgKLSAgICBJTiBQQklHX0lOVEVHRVIgcEJJKQotewotICAgIGludCBpID0gMCwgaiA9IDA7Ci0KLSAgICBpZiAoKHBCSSA9PSBOVUxMKSB8fCAocEJJLT5wSW50ZWdlckFycmF5ID09IE5VTEwpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoc3RybGVuKHBCSS0+TmFtZSkgIT0gMCkKLSAgICAgICAgREVCVUdQUklOVCgiTmFtZT0lc1xuIiwgcEJJLT5OYW1lKTsKLSAgICBERUJVR1BSSU5UKCJBbGxvY1NpemU9JWQsIEFycmF5TGVuZ3RoPSVkLCBJbnRlZ2VyTGVuZ3RoPSVkLCBTaWduZWQ9JWRcbiIsIHBCSS0+QWxsb2NTaXplLCBwQkktPkFycmF5TGVuZ3RoLCBwQkktPkludGVnZXJMZW5ndGgsIHBCSS0+U2lnbmVkKTsKLSAgICBmb3IgKGkgPSAocEJJLT5BcnJheUxlbmd0aCAtIDEpLCBqID0gMDtpID49MDtpLS0saisrKSB7Ci0gICAgICAgIERFQlVHUFJJTlQoIiUwOHgsICIsIHBCSS0+cEludGVnZXJBcnJheVtpXSk7Ci0gICAgICAgIGlmICgoaiU4KSA9PSA3KQotICAgICAgICAgICAgREVCVUdQUklOVCgiXG4iKTsKLSAgICB9IC8qIEVuZCBvZCBmb3IgKi8KLSAgICBERUJVR1BSSU5UKCJcblxuIik7Ci19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX1ByaW50ICovCi0KLQotVk9JRCBCaWdJbnRlZ2VyX0luaXQgKAotICAgIElOT1VUIFBCSUdfSU5URUdFUiAqcEJJKQotewotICAgIGlmICgqcEJJICE9IE5VTEwpCi0gICAgICAgIEJpZ0ludGVnZXJfRnJlZShwQkkpOwotCi0gICAgaWYgKCgqcEJJID0gKFBCSUdfSU5URUdFUikga21hbGxvYyhzaXplb2YoQklHX0lOVEVHRVIpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgewotICAgICAgICBERUJVR1BSSU5UKCJCaWdJbnRlZ2VyX0luaXQ6IGFsbG9jYXRlICVkIGJ5dGVzIG1lbW9yeSBmYWlsdXJlLlxuIiwgKHNpemVvZihCSUdfSU5URUdFUikpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICBOZGlzWmVyb01lbW9yeSgqcEJJLCBzaXplb2YoQklHX0lOVEVHRVIpKTsKLSAgICAoKnBCSSktPnBJbnRlZ2VyQXJyYXkgPSBOVUxMOwotICAgICgqcEJJKS0+U2lnbmVkID0gMTsKLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfSW5pdCAqLwotCi0KLVZPSUQgQmlnSW50ZWdlcl9GcmVlX0FsbG9jU2l6ZSAoCi0gICAgSU4gUEJJR19JTlRFR0VSICpwQkkpCi17Ci0gICAgaWYgKCgqcEJJICE9IE5VTEwpICYmICgoKnBCSSktPnBJbnRlZ2VyQXJyYXkgIT0gTlVMTCkpIHsKLSAgICAgICAga2ZyZWUoKCpwQkkpLT5wSW50ZWdlckFycmF5KTsKLSAgICAgICAgTmRpc1plcm9NZW1vcnkoKnBCSSwgc2l6ZW9mKEJJR19JTlRFR0VSKSk7Ci0gICAgICAgICgqcEJJKS0+cEludGVnZXJBcnJheSA9IE5VTEw7Ci0gICAgICAgICgqcEJJKS0+U2lnbmVkID0gMTsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotfSAvKiBFbmQgb2YgQmlnSW50ZWdlcl9GcmVlX0FsbG9jU2l6ZSAqLwotCi0KLVZPSUQgQmlnSW50ZWdlcl9GcmVlICgKLSAgICBJTiBQQklHX0lOVEVHRVIgKnBCSSkKLXsKLSAgICBpZiAoKnBCSSAhPSBOVUxMKSB7Ci0gICAgICAgIEJpZ0ludGVnZXJfRnJlZV9BbGxvY1NpemUocEJJKTsKLSAgICAgICAga2ZyZWUoKnBCSSk7Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgICpwQkkgPSBOVUxMOwotfSAvKiBFbmQgb2YgQmlnSW50ZWdlcl9GcmVlICovCi0KLQotVk9JRCBCaWdJbnRlZ2VyX0FsbG9jU2l6ZSAoCi0gICAgSU4gUEJJR19JTlRFR0VSICpwQkksCi0gICAgSU4gVUlOVCBMZW5ndGgpCi17Ci0gICAgVUlOVCBBcnJheUxlbmd0aCA9IDA7Ci0KLSAgICBpZiAoTGVuZ3RoID09IDApCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmICgqcEJJID09IE5VTEwpCi0gICAgICAgIEJpZ0ludGVnZXJfSW5pdChwQkkpOwotCi0gICAgLyogQ2FjdWxhdGUgYXJyYXkgc2l6ZSAqLwotICAgIEFycmF5TGVuZ3RoID0gTGVuZ3RoID4+IDB4MjsKLSAgICBpZiAoKExlbmd0aCAmIDB4MykgIT0gMCkKLSAgICAgICAgQXJyYXlMZW5ndGgrKzsKLQotICAgIGlmICgoKCpwQkkpLT5wSW50ZWdlckFycmF5ICE9IE5VTEwpICYmICgoKnBCSSktPkFsbG9jU2l6ZSA8IChzaXplb2YoVUlOVDMyKSpBcnJheUxlbmd0aCkpKQotICAgICAgICBCaWdJbnRlZ2VyX0ZyZWVfQWxsb2NTaXplKHBCSSk7Ci0KLSAgICBpZiAoKCpwQkkpLT5wSW50ZWdlckFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgaWYgKCgoKnBCSSktPnBJbnRlZ2VyQXJyYXkgPSAoVUlOVDMyICopIGttYWxsb2Moc2l6ZW9mKFVJTlQzMikqQXJyYXlMZW5ndGgsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBERUJVR1BSSU5UKCJCaWdJbnRlZ2VyX0FsbG9jU2l6ZTogYWxsb2NhdGUgJWQgYnl0ZXMgbWVtb3J5IGZhaWx1cmUuXG4iLCAoc2l6ZW9mKFVJTlQzMikqQXJyYXlMZW5ndGgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICAgICAgKCpwQkkpLT5BbGxvY1NpemUgPSBzaXplb2YoVUlOVDMyKSpBcnJheUxlbmd0aDsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgTmRpc1plcm9NZW1vcnkoKCpwQkkpLT5wSW50ZWdlckFycmF5LCAoKnBCSSktPkFsbG9jU2l6ZSk7Ci0gICAgKCpwQkkpLT5BcnJheUxlbmd0aCA9IEFycmF5TGVuZ3RoOwotICAgICgqcEJJKS0+SW50ZWdlckxlbmd0aCA9IExlbmd0aDsKLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfQWxsb2NTaXplICovCi0KLQotVk9JRCBCaWdJbnRlZ2VyX0NsZWFySGlnaEJpdHMgKAotICAgIElOIFBCSUdfSU5URUdFUiBwQkkpCi17Ci0gICAgSU5UIEJJQXJyYXlJbmRleCwgU2hpZnRJbmRleCA9IDA7Ci0gICAgVUlOVDggdmFsdWU7Ci0KLSAgICBpZiAoKHBCSSA9PSBOVUxMKSB8fCAocEJJLT5wSW50ZWdlckFycmF5ID09IE5VTEwpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBCSUFycmF5SW5kZXggPSBwQkktPkFycmF5TGVuZ3RoIC0gMTsKLSAgICB3aGlsZSAoKEJJQXJyYXlJbmRleCA+PSAwKSAmJiAocEJJLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF0gPT0gMCkpCi0JQklBcnJheUluZGV4LS07Ci0KLSAgICBpZiAoQklBcnJheUluZGV4ID49IDApIHsKLSAgICAgICAgdmFsdWUgPSAwOwotICAgICAgICBTaGlmdEluZGV4ID0gNDsKLSAgICAgICAgd2hpbGUgKHZhbHVlID09IDApIHsKLSAgICAgICAgICAgIFNoaWZ0SW5kZXgtLTsKLSAgICAgICAgICAgIHZhbHVlID0gVUlOVDMyX0dFVEJZVEUocEJJLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF0sIFNoaWZ0SW5kZXgpOwotCX0gLyogRW5kIG9mIHdoaWxlICovCi0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIGlmICgoQklBcnJheUluZGV4ID09IC0xKSAmJiAoU2hpZnRJbmRleCA9PSAtMSkpIHsKLSAgICAgICAgcEJJLT5JbnRlZ2VyTGVuZ3RoID0gMTsKLSAgICAgICAgcEJJLT5BcnJheUxlbmd0aCA9IDE7Ci0gICAgICAgIHBCSS0+U2lnbmVkID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgICBwQkktPkludGVnZXJMZW5ndGggPSAoQklBcnJheUluZGV4KjQpICsgU2hpZnRJbmRleCArIDE7Ci0gICAgICAgIHBCSS0+QXJyYXlMZW5ndGggPSBCSUFycmF5SW5kZXggKyAxOwotICAgIH0gLyogRW5kIG9mIGlmICovCi19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX0NsZWFySGlnaEJpdHMgKi8KLQotCi1WT0lEIEJpZ0ludGVnZXJfQkkyQmluICgKLSAgICBJTiBQQklHX0lOVEVHRVIgcEJJLAotICAgIE9VVCBVSU5UOCAqcFZhbHVlLAotICAgIE9VVCBVSU5UICpMZW5ndGgpCi17Ci0gICAgSU5UICBWYWx1ZUluZGV4LCBCSUFycmF5SW5kZXgsIFNoaWZ0SW5kZXg7Ci0gICAgVUlOVDMyICBOdW1iZXI7Ci0KLSAgICBpZiAocEJJID09IE5VTEwpIHsKLSAgICAgICAgREVCVUdQUklOVCgiQmlnSW50ZWdlcl9CSTJCaW46IHBCSSBpcyBOVWxsXG4iKTsKLSAgICAgICAgKkxlbmd0aCA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgaWYgKCpMZW5ndGggPCAoc2l6ZW9mKFVJTlQ4KSAqIHBCSS0+SW50ZWdlckxlbmd0aCkpIHsKLSAgICAgICAgREVCVUdQUklOVCgiQmlnSW50ZWdlcl9CSTJCaW46IGxlbmd0aCglZCkgaXMgbm90IGVub3VnaC5cbiIsICpMZW5ndGgpOwotICAgICAgICAqTGVuZ3RoID0gMDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICBpZiAocEJJLT5wSW50ZWdlckFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgKkxlbmd0aCA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgQmlnSW50ZWdlcl9DbGVhckhpZ2hCaXRzKHBCSSk7Ci0gICAgaWYgKChTaGlmdEluZGV4ID0gcEJJLT5JbnRlZ2VyTGVuZ3RoICYgMHgzKSA9PSAwKQotICAgICAgIFNoaWZ0SW5kZXggPSA0OwotICAgIEJJQXJyYXlJbmRleCA9IHBCSS0+QXJyYXlMZW5ndGggLSAxOwotICAgIFZhbHVlSW5kZXggPSAwOwotCi0gICAgTnVtYmVyID0gcEJJLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF07Ci0gICAgd2hpbGUgKFZhbHVlSW5kZXggPCBwQkktPkludGVnZXJMZW5ndGgpCi0gICAgewotICAgICAgICBwVmFsdWVbVmFsdWVJbmRleCsrXSA9IChVSU5UOCkgVUlOVDMyX0dFVEJZVEUoTnVtYmVyLCBTaGlmdEluZGV4IC0gMSk7Ci0gICAgICAgIGlmICgoLS1TaGlmdEluZGV4KSA9PSAwKSB7Ci0gICAgICAgICAgICBTaGlmdEluZGV4ID0gNDsKLSAgICAgICAgICAgIEJJQXJyYXlJbmRleC0tOwotICAgICAgICAgICAgTnVtYmVyID0gcEJJLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF07Ci0gICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgfSAvKiBFbmQgb2Ygd2hpbGUgKi8KLSAgICAqTGVuZ3RoID0gcEJJLT5JbnRlZ2VyTGVuZ3RoOwotfSAvKiBFbmQgb2YgQmlnSW50ZWdlcl9CSTJCaW4gKi8KLQotCi1WT0lEIEJpZ0ludGVnZXJfQmluMkJJICgKLSAgICBJTiBVSU5UOCAqcFZhbHVlLAotICAgIElOIFVJTlQgTGVuZ3RoLAotICAgIE9VVCBQQklHX0lOVEVHRVIgKnBCSSkKLXsKLSAgICBJTlQgIFZhbHVlSW5kZXgsIEJJQXJyYXlJbmRleCwgU2hpZnRJbmRleDsKLSAgICBVSU5UMzIgIE51bWJlcjsKLQotICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKHBCSSwgTGVuZ3RoKTsKLQotICAgIGlmICgoKnBCSSktPnBJbnRlZ2VyQXJyYXkgIT0gTlVMTCkgewotICAgICAgICBOdW1iZXIgPSAwOwotICAgICAgICBpZiAoKFNoaWZ0SW5kZXggPSBMZW5ndGggJiAweDMpID09IDApCi0gICAgICAgICAgICBTaGlmdEluZGV4ID0gNDsKLSAgICAgICAgQklBcnJheUluZGV4ID0gKCpwQkkpLT5BcnJheUxlbmd0aCAtIDE7Ci0gICAgICAgIFZhbHVlSW5kZXggPSAwOwotICAgICAgICB3aGlsZSAoVmFsdWVJbmRleCA8IExlbmd0aCkKLSAgICAgICAgewotICAgICAgICAgICAgTnVtYmVyID0gKE51bWJlciA8PCA4KSB8IChVSU5UOCkgcFZhbHVlW1ZhbHVlSW5kZXgrK107Ci0gICAgICAgICAgICBpZiAoKC0tU2hpZnRJbmRleCkgPT0gMCkgewotICAgICAgICAgICAgICAgICgqcEJJKS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdID0gTnVtYmVyOwotICAgICAgICAgICAgICAgIFNoaWZ0SW5kZXggPSA0OwotICAgICAgICAgICAgICAgIEJJQXJyYXlJbmRleC0tOwotICAgICAgICAgICAgICAgIE51bWJlciA9IDA7Ci0gICAgICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgICAgICB9IC8qIEVuZCBvZiB3aGlsZSAqLwotICAgIH0gLyogRW5kIG9mIGlmICovCi19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX0JpbjJCSSAqLwotCi0KLS8qIENhbGN1bGF0ZSB0aGUgYml0cyBvZiBCaWdJbnRlZ2VyLCB0aGUgaGlnaGVzdCBiaXQgaXMgMSAqLwotVk9JRCBCaWdJbnRlZ2VyX0JpdHNPZkJJICgKLSAgICBJTiBQQklHX0lOVEVHRVIgcEJJLAotICAgIE9VVCBVSU5UICpCaXRzX09mX1ApCi17Ci0gICAgVUlOVDMyIE51bWJlciwgSW5kZXg7Ci0KLSAgICBOdW1iZXIgPSBwQkktPnBJbnRlZ2VyQXJyYXlbcEJJLT5BcnJheUxlbmd0aCAtIDFdOwotICAgIEluZGV4ID0gMDsKLSAgICB3aGlsZSAoKCEoTnVtYmVyICYgMHg4MDAwMDAwMCkpICYmIChJbmRleCA8IDMyKSkgewotICAgICAgICBOdW1iZXIgPDw9IDE7Ci0gICAgICAgIEluZGV4Kys7Ci0gICAgfSAvKiBFbmQgb2Ygd2hpbGUgKi8KLSAgICAqQml0c19PZl9QID0gKHBCSS0+QXJyYXlMZW5ndGgqc2l6ZW9mKFVJTlQzMikpIC0gSW5kZXg7Ci19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX0JpdHNPZkJOICovCi0KLQotSU5UIEJpZ0ludGVnZXJfR2V0Qml0VmFsdWUgKAotICAgIElOIFBCSUdfSU5URUdFUiBwQkksCi0gICAgSU4gVUlOVCBJbmRleCkKLXsKLSAgICBVSU5UIEFycmF5ID0gMDsKLSAgICBVSU5UIFNoaWZ0ID0gMDsKLQotICAgIGlmIChJbmRleCA+IDApIHsKLSAgICAgICAgQXJyYXkgPSAoSW5kZXggLSAxKSA+PiAweDU7Ci0gICAgICAgIFNoaWZ0ID0gKEluZGV4IC0gMSkgJiAweDFGOwotICAgIH0KLSAgICBpZiAoQXJyYXkgPiBwQkktPkFycmF5TGVuZ3RoKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiAoKHBCSS0+cEludGVnZXJBcnJheVtBcnJheV0gPj4gU2hpZnQpICYgMHgxKTsKLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfR2V0Qml0VmFsdWUgKi8KLQotCi1VSU5UOCBCaWdJbnRlZ2VyX0dldEJ5dGVWYWx1ZSAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBCSSwKLSAgICBJTiBVSU5UIEluZGV4KQotewotICAgIFVJTlQgQXJyYXkgPSAwOwotICAgIFVJTlQgU2hpZnQgPSAwOwotCi0gICAgaWYgKEluZGV4ID4gMCkgewotICAgICAgICBBcnJheSA9IChJbmRleCAtIDEpID4+IDB4MjsKLSAgICAgICAgU2hpZnQgPSAoSW5kZXggLSAxKSAmIDB4MzsKLSAgICB9Ci0gICAgaWYgKChBcnJheSA+IHBCSS0+QXJyYXlMZW5ndGgpIHx8IChJbmRleCA+IHBCSS0+SW50ZWdlckxlbmd0aCkpCi0gICAgICAgIHJldHVybiAwOwotCi0KLSAgICByZXR1cm4gKFVJTlQ4KSBVSU5UMzJfR0VUQllURShwQkktPnBJbnRlZ2VyQXJyYXlbQXJyYXldLCBTaGlmdCAtIDEpOwotfSAvKiBFbmQgb2YgQmlnSW50ZWdlcl9HZXRCeXRlVmFsdWUgKi8KLQotCi1WT0lEIEJpZ0ludGVnZXJfQ29weSAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBCSV9Db3BpZWQsCi0gICAgT1VUIFBCSUdfSU5URUdFUiAqcEJJX1Jlc3VsdCkKLXsKLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQklfUmVzdWx0LCBwQklfQ29waWVkLT5JbnRlZ2VyTGVuZ3RoKTsKLSAgICBOZGlzQ29weU1lbW9yeSgoKnBCSV9SZXN1bHQpLT5wSW50ZWdlckFycmF5LCBwQklfQ29waWVkLT5wSW50ZWdlckFycmF5LCAoc2l6ZW9mKFVJTlQzMikqKCpwQklfUmVzdWx0KS0+QXJyYXlMZW5ndGgpKTsKLSAgICAoKnBCSV9SZXN1bHQpLT5BcnJheUxlbmd0aCA9IHBCSV9Db3BpZWQtPkFycmF5TGVuZ3RoOwotICAgICgqcEJJX1Jlc3VsdCktPkludGVnZXJMZW5ndGggPSBwQklfQ29waWVkLT5JbnRlZ2VyTGVuZ3RoOwotICAgICgqcEJJX1Jlc3VsdCktPlNpZ25lZCA9IHBCSV9Db3BpZWQtPlNpZ25lZDsKLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfQ29weSAqLwotCi0KLUlOVCBCaWdJbnRlZ2VyX1Vuc2lnbmVkQ29tcGFyZSAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBGaXJzdE9wZXJhbmQsCi0gICAgSU4gUEJJR19JTlRFR0VSIHBTZWNvbmRPcGVyYW5kKQotewotICAgIElOVCBCSUFycmF5SW5kZXg7Ci0KLSAgICBpZiAocEZpcnN0T3BlcmFuZC0+SW50ZWdlckxlbmd0aCA+IHBTZWNvbmRPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIGlmIChwRmlyc3RPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoIDwgcFNlY29uZE9wZXJhbmQtPkludGVnZXJMZW5ndGgpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGlmIChwRmlyc3RPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoID09IHBTZWNvbmRPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoKSB7Ci0gICAgICAgIGZvcihCSUFycmF5SW5kZXggPSAocEZpcnN0T3BlcmFuZC0+QXJyYXlMZW5ndGggLSAxKTtCSUFycmF5SW5kZXggPj0gMCA7IEJJQXJyYXlJbmRleC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocEZpcnN0T3BlcmFuZC0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdID4gcFNlY29uZE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHBGaXJzdE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XSA8IHBTZWNvbmRPcGVyYW5kLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF0pCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgcmV0dXJuIDA7Ci19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX0NvbXBhcmUgKi8KLQotCi1WT0lEIEJpZ0ludGVnZXJfQWRkICgKLSAgICBJTiBQQklHX0lOVEVHRVIgcEZpcnN0T3BlcmFuZCwKLSAgICBJTiBQQklHX0lOVEVHRVIgcFNlY29uZE9wZXJhbmQsCi0gICAgT1VUIFBCSUdfSU5URUdFUiAqcEJJX1Jlc3VsdCkKLXsKLSAgICBJTlQgQ29tcGFyZVJlc3VsdDsKLSAgICBVSU5UMzIgQklBcnJheUluZGV4OwotICAgIFVJTlQ2NCBTdW0sIENhcnJ5OwotICAgIFBCSUdfSU5URUdFUiBwVGVtcEJJID0gTlVMTDsKLQotICAgIGlmICAoKHBGaXJzdE9wZXJhbmQgPT0gTlVMTCkgfHwgKHBGaXJzdE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXkgPT0gTlVMTCkKLSAgICAgIHx8IChwU2Vjb25kT3BlcmFuZCA9PSBOVUxMKSB8fCAocFNlY29uZE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXkgPT0gTlVMTCkpIHsKLSAgICAgICAgREVCVUdQUklOVCgiQmlnSW50ZWdlcl9BZGQ6IGZpcnN0IG9yIHNlY29uZCBvcGVyYW5kIGlzIE5VTEwuXG4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICBpZiAoKnBCSV9SZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgQmlnSW50ZWdlcl9Jbml0KHBCSV9SZXN1bHQpOwotCi0gICAgQ29tcGFyZVJlc3VsdCA9IEJpZ0ludGVnZXJfVW5zaWduZWRDb21wYXJlKHBGaXJzdE9wZXJhbmQsIHBTZWNvbmRPcGVyYW5kKTsKLSAgICBpZiAoKENvbXBhcmVSZXN1bHQgPT0gMCkgJiAoKHBGaXJzdE9wZXJhbmQtPlNpZ25lZCAqIHBTZWNvbmRPcGVyYW5kLT5TaWduZWQpIDwgMCkpIHsKLSAgICAgICAgQmlnSW50ZWdlcl9BbGxvY1NpemUocEJJX1Jlc3VsdCwgMSk7Ci0gICAgICAgIHJldHVybiA7Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qCi0gICAgICogIFNpbmdlZCB0YWJsZQotICAgICAqICBBICsgQiB8fCBBID4gQiB8fCBBIDwgQgotICAgICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgKyAgICsgfHwgICArICAgfHwgICArCi0gICAgICogICsgICAtIHx8ICAgKyAgIHx8ICAgLQotICAgICAqICAtICAgKyB8fCAgIC0gICB8fCAgICsKLSAgICAgKiAgLSAgIC0gfHwgICAtICAgfHwgICAtCi0gICAgICovCi0gICAgaWYgKChwRmlyc3RPcGVyYW5kLT5TaWduZWQgKiBwU2Vjb25kT3BlcmFuZC0+U2lnbmVkKSA+IDApIHsKLSAgICAgICAgaWYgKHBGaXJzdE9wZXJhbmQtPkludGVnZXJMZW5ndGggPiBwU2Vjb25kT3BlcmFuZC0+SW50ZWdlckxlbmd0aCkgewotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKHBCSV9SZXN1bHQsIHBGaXJzdE9wZXJhbmQtPkludGVnZXJMZW5ndGggKyAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQklfUmVzdWx0LCBwU2Vjb25kT3BlcmFuZC0+SW50ZWdlckxlbmd0aCArIDEpOwotICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgICAgIENhcnJ5ID0gMDsKLSAgICAgICAgZm9yIChCSUFycmF5SW5kZXg9MDsgQklBcnJheUluZGV4IDwgKCpwQklfUmVzdWx0KS0+QXJyYXlMZW5ndGg7IEJJQXJyYXlJbmRleCsrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIFN1bSA9IDA7Ci0gICAgICAgICAgICBpZiAoQklBcnJheUluZGV4IDwgcEZpcnN0T3BlcmFuZC0+QXJyYXlMZW5ndGgpCi0gICAgICAgICAgICAgICAgU3VtICs9IChVSU5UNjQpIHBGaXJzdE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XTsKLQotICAgICAgICAgICAgaWYgKEJJQXJyYXlJbmRleCA8IHBTZWNvbmRPcGVyYW5kLT5BcnJheUxlbmd0aCkKLSAgICAgICAgICAgICAgICBTdW0gKz0gKFVJTlQ2NCkgcFNlY29uZE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XTsKLQotICAgICAgICAgICAgU3VtICs9IENhcnJ5OwotICAgICAgICAgICAgQ2FycnkgPSBTdW0gID4+IDMyOwotICAgICAgICAgICAgKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdID0gKFVJTlQzMikgKFN1bSAmIDB4ZmZmZmZmZmZVTCk7Ci0gICAgICAgIH0gLyogRW5kIG9mIGZvciAqLwotICAgICAgICAoKnBCSV9SZXN1bHQpLT5TaWduZWQgPSBwRmlyc3RPcGVyYW5kLT5TaWduZWQ7Ci0gICAgICAgIEJpZ0ludGVnZXJfQ2xlYXJIaWdoQml0cygqcEJJX1Jlc3VsdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgICgocEZpcnN0T3BlcmFuZC0+U2lnbmVkID09IDEpICYgKHBTZWNvbmRPcGVyYW5kLT5TaWduZWQgPT0gLTEpKSB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX0NvcHkocFNlY29uZE9wZXJhbmQsICZwVGVtcEJJKTsKLSAgICAgICAgICAgIHBUZW1wQkktPlNpZ25lZCA9IDE7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX1N1YihwRmlyc3RPcGVyYW5kLCBwVGVtcEJJLCBwQklfUmVzdWx0KTsKLSAgICAgICAgfSBlbHNlIGlmICgocEZpcnN0T3BlcmFuZC0+U2lnbmVkID09IC0xKSAmIChwU2Vjb25kT3BlcmFuZC0+U2lnbmVkID09IDEpKSB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX0NvcHkocEZpcnN0T3BlcmFuZCwgJnBUZW1wQkkpOwotICAgICAgICAgICAgcFRlbXBCSS0+U2lnbmVkID0gMTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXJfU3ViKHBTZWNvbmRPcGVyYW5kLCBwVGVtcEJJLCBwQklfUmVzdWx0KTsKLSAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgQmlnSW50ZWdlcl9GcmVlKCZwVGVtcEJJKTsKLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfQWRkICovCi0KLQotVk9JRCBCaWdJbnRlZ2VyX1N1YiAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBGaXJzdE9wZXJhbmQsCi0gICAgSU4gUEJJR19JTlRFR0VSIHBTZWNvbmRPcGVyYW5kLAotICAgIE9VVCBQQklHX0lOVEVHRVIgKnBCSV9SZXN1bHQpCi17Ci0gICAgSU5UIENvbXBhcmVSZXN1bHQ7Ci0gICAgVUlOVDMyIEJJQXJyYXlJbmRleCwgQ2Fycnk7Ci0gICAgUEJJR19JTlRFR0VSIHBUZW1wQkkgPSBOVUxMLCBwVGVtcEJJMiA9IE5VTEw7Ci0KLSAgICBpZiAgKChwRmlyc3RPcGVyYW5kID09IE5VTEwpIHx8IChwRmlyc3RPcGVyYW5kLT5wSW50ZWdlckFycmF5ID09IE5VTEwpCi0gICAgICB8fCAocFNlY29uZE9wZXJhbmQgPT0gTlVMTCkgfHwgKHBTZWNvbmRPcGVyYW5kLT5wSW50ZWdlckFycmF5ID09IE5VTEwpKSB7Ci0gICAgICAgIERFQlVHUFJJTlQoIkJpZ0ludGVnZXJfU3ViOiBmaXJzdCBvciBzZWNvbmQgb3BlcmFuZCBpcyBOVUxMLlxuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgaWYgKCpwQklfUmVzdWx0ID09IE5VTEwpCi0gICAgICAgIEJpZ0ludGVnZXJfSW5pdChwQklfUmVzdWx0KTsKLQotICAgIENvbXBhcmVSZXN1bHQgPSBCaWdJbnRlZ2VyX1Vuc2lnbmVkQ29tcGFyZShwRmlyc3RPcGVyYW5kLCBwU2Vjb25kT3BlcmFuZCk7Ci0gICAgaWYgKChDb21wYXJlUmVzdWx0ID09IDApICYgKChwRmlyc3RPcGVyYW5kLT5TaWduZWQgKiBwU2Vjb25kT3BlcmFuZC0+U2lnbmVkKSA+IDApKSB7Ci0gICAgICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKHBCSV9SZXN1bHQsIDEpOwotICAgICAgICByZXR1cm4gOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICBCaWdJbnRlZ2VyX0luaXQoJnBUZW1wQkkpOwotICAgIEJpZ0ludGVnZXJfSW5pdCgmcFRlbXBCSTIpOwotCi0gICAgLyoKLSAgICAgKiAgU2luZ2VkIHRhYmxlCi0gICAgICogIEEgLSBCIHx8IEEgPiBCIHx8IEEgPCBCCi0gICAgICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICArICAgKyB8fCAgICsgICB8fCAgIC0KLSAgICAgKiAgKyAgIC0gfHwgICArICAgfHwgICArCi0gICAgICogIC0gICArIHx8ICAgLSAgIHx8ICAgLQotICAgICAqICAtICAgLSB8fCAgIC0gICB8fCAgICsKLSAgICAgKi8KLSAgICBpZiAoKHBGaXJzdE9wZXJhbmQtPlNpZ25lZCAqIHBTZWNvbmRPcGVyYW5kLT5TaWduZWQpID4gMCkgewotICAgICAgICBpZiAoQ29tcGFyZVJlc3VsdCA9PSAxKSB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX0NvcHkocEZpcnN0T3BlcmFuZCwgJnBUZW1wQkkpOwotICAgICAgICAgICAgQmlnSW50ZWdlcl9Db3B5KHBTZWNvbmRPcGVyYW5kLCAmcFRlbXBCSTIpOwotICAgICAgICB9IGVsc2UgaWYgKENvbXBhcmVSZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXJfQ29weShwU2Vjb25kT3BlcmFuZCwgJnBUZW1wQkkpOwotICAgICAgICAgICAgQmlnSW50ZWdlcl9Db3B5KHBGaXJzdE9wZXJhbmQsICZwVGVtcEJJMik7Ci0gICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAgICAgQmlnSW50ZWdlcl9Db3B5KHBUZW1wQkksIHBCSV9SZXN1bHQpOwotICAgICAgICBDYXJyeSA9IDA7Ci0gICAgICAgIGZvciAoQklBcnJheUluZGV4PTA7IEJJQXJyYXlJbmRleCA8ICgqcEJJX1Jlc3VsdCktPkFycmF5TGVuZ3RoOyBCSUFycmF5SW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKEJJQXJyYXlJbmRleCA8IHBUZW1wQkkyLT5BcnJheUxlbmd0aCkgewotICAgICAgICAgICAgICAgIGlmICgoKnBCSV9SZXN1bHQpLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF0gPj0gKHBUZW1wQkkyLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF0gLSBDYXJyeSkpIHsKLSAgICAgICAgICAgICAgICAgICAgKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdID0gKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdIC0gcFRlbXBCSTItPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XSAtIENhcnJ5OwotICAgICAgICAgICAgICAgICAgICBDYXJyeSA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdID0gMHhmZmZmZmZmZlVMIC0gcFRlbXBCSTItPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XSAtIENhcnJ5ICsgKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdICsgMTsKLSAgICAgICAgICAgICAgICAgICAgQ2FycnkgPSAxOwotICAgICAgICAgICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICgoKnBCSV9SZXN1bHQpLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF0gPj0gQ2FycnkpIHsKLSAgICAgICAgICAgICAgICAgICAgKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdIC09IENhcnJ5OwotICAgICAgICAgICAgICAgICAgICBDYXJyeSA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdID0gMHhmZmZmZmZmZlVMIC0gQ2Fycnk7Ci0gICAgICAgICAgICAgICAgICAgIENhcnJ5ID0gMTsKLSAgICAgICAgICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgICAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICAgICAgfSAvKiBFbmQgb2YgZm9yICovCi0KLSAgICAgICAgaWYgICgoKHBGaXJzdE9wZXJhbmQtPlNpZ25lZCA9PSAxKSAmIChwU2Vjb25kT3BlcmFuZC0+U2lnbmVkID09IDEpICYgKENvbXBhcmVSZXN1bHQgPT0gLTEpKQotICAgICAgICAgIHx8ICgocEZpcnN0T3BlcmFuZC0+U2lnbmVkID09IC0xKSAmIChwU2Vjb25kT3BlcmFuZC0+U2lnbmVkID09IC0xKSAmIChDb21wYXJlUmVzdWx0ID09IDEpKSkKLSAgICAgICAgICAgICgqcEJJX1Jlc3VsdCktPlNpZ25lZCA9IC0xOwotCi0gICAgICAgIEJpZ0ludGVnZXJfQ2xlYXJIaWdoQml0cygqcEJJX1Jlc3VsdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgICgocEZpcnN0T3BlcmFuZC0+U2lnbmVkID09IDEpICYgKHBTZWNvbmRPcGVyYW5kLT5TaWduZWQgPT0gLTEpKSB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX0NvcHkocFNlY29uZE9wZXJhbmQsICZwVGVtcEJJKTsKLSAgICAgICAgICAgIHBUZW1wQkktPlNpZ25lZCA9IDE7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX0FkZChwRmlyc3RPcGVyYW5kLCBwVGVtcEJJLCBwQklfUmVzdWx0KTsKLSAgICAgICAgfSBlbHNlIGlmICgocEZpcnN0T3BlcmFuZC0+U2lnbmVkID09IC0xKSAmIChwU2Vjb25kT3BlcmFuZC0+U2lnbmVkID09IDEpKSB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX0NvcHkocEZpcnN0T3BlcmFuZCwgJnBUZW1wQkkpOwotICAgICAgICAgICAgcFRlbXBCSS0+U2lnbmVkID0gMTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXJfQWRkKHBUZW1wQkksIHBTZWNvbmRPcGVyYW5kLCBwQklfUmVzdWx0KTsKLSAgICAgICAgICAgICgqcEJJX1Jlc3VsdCktPlNpZ25lZCA9IC0xOwotICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBUZW1wQkkpOwotICAgIEJpZ0ludGVnZXJfRnJlZSgmcFRlbXBCSTIpOwotfSAvKiBFbmQgb2YgQmlnSW50ZWdlcl9TdWIgKi8KLQotCi1WT0lEIEJpZ0ludGVnZXJfTXVsICgKLSAgICBJTiBQQklHX0lOVEVHRVIgcEZpcnN0T3BlcmFuZCwKLSAgICBJTiBQQklHX0lOVEVHRVIgcFNlY29uZE9wZXJhbmQsCi0gICAgT1VUIFBCSUdfSU5URUdFUiAqcEJJX1Jlc3VsdCkKLXsKLQotICAgIFVJTlQzMiBCSUZpcnN0SW5kZXgsIEJJU2Vjb25kSW5kZXg7Ci0gICAgVUlOVDY0IEZpcnN0VmFsdWUsIFNlY29uZFZhbHVlLCBTdW0sIENhcnJ5OwotCi0gICAgaWYgICgocEZpcnN0T3BlcmFuZCA9PSBOVUxMKSB8fCAocEZpcnN0T3BlcmFuZC0+cEludGVnZXJBcnJheSA9PSBOVUxMKQotICAgICAgfHwgKHBTZWNvbmRPcGVyYW5kID09IE5VTEwpIHx8IChwU2Vjb25kT3BlcmFuZC0+cEludGVnZXJBcnJheSA9PSBOVUxMKSkgewotICAgICAgICBERUJVR1BSSU5UKCJCaWdJbnRlZ2VyX011bDogZmlyc3Qgb3Igc2Vjb25kIG9wZXJhbmQgaXMgTlVMTC5cbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qIFRoZSBmaXJzdCBvciBzZWNvbmQgb3BlcmFuZCBpcyB6ZXJvICovCi0gICAgaWYgICgoKHBGaXJzdE9wZXJhbmQtPkludGVnZXJMZW5ndGggID09IDEpICYmIChwRmlyc3RPcGVyYW5kLT5wSW50ZWdlckFycmF5WzBdICA9PSAwKSkKLSAgICAgICB8fCgocFNlY29uZE9wZXJhbmQtPkludGVnZXJMZW5ndGggPT0gMSkgJiYgKHBTZWNvbmRPcGVyYW5kLT5wSW50ZWdlckFycmF5WzBdID09IDApKSkgewotICAgICAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQklfUmVzdWx0LCAxKTsKLSAgICAgICAgZ290byBvdXRwdXQ7Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qIFRoZSBmaXJzdCBvciBzZWNvbmQgb3BlcmFuZCBpcyBvbmUgKi8KLSAgICBpZiAgKChwRmlyc3RPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoICA9PSAxKSAmJiAocEZpcnN0T3BlcmFuZC0+cEludGVnZXJBcnJheVswXSAgPT0gMSkpIHsKLSAgICAgICAgQmlnSW50ZWdlcl9Db3B5KHBTZWNvbmRPcGVyYW5kLCBwQklfUmVzdWx0KTsKLSAgICAgICAgZ290byBvdXRwdXQ7Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAgKChwU2Vjb25kT3BlcmFuZC0+SW50ZWdlckxlbmd0aCAgPT0gMSkgJiYgKHBTZWNvbmRPcGVyYW5kLT5wSW50ZWdlckFycmF5WzBdICA9PSAxKSkgewotICAgICAgICBCaWdJbnRlZ2VyX0NvcHkocEZpcnN0T3BlcmFuZCwgcEJJX1Jlc3VsdCk7Ci0gICAgICAgIGdvdG8gb3V0cHV0OwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQklfUmVzdWx0LCBwRmlyc3RPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoICsgcFNlY29uZE9wZXJhbmQtPkludGVnZXJMZW5ndGgpOwotCi0gICAgZm9yIChCSUZpcnN0SW5kZXg9MDsgQklGaXJzdEluZGV4IDwgcEZpcnN0T3BlcmFuZC0+QXJyYXlMZW5ndGg7IEJJRmlyc3RJbmRleCsrKQotICAgIHsKLSAgICAgICAgQ2FycnkgPSAwOwotICAgICAgICBGaXJzdFZhbHVlID0gKFVJTlQ2NCkgcEZpcnN0T3BlcmFuZC0+cEludGVnZXJBcnJheVtCSUZpcnN0SW5kZXhdOwotICAgICAgICBpZiAoRmlyc3RWYWx1ZSA9PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoQklTZWNvbmRJbmRleD0wOyBCSVNlY29uZEluZGV4IDwgcFNlY29uZE9wZXJhbmQtPkFycmF5TGVuZ3RoOyBCSVNlY29uZEluZGV4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2Vjb25kVmFsdWUgPSAoKFVJTlQ2NCkgcFNlY29uZE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXlbQklTZWNvbmRJbmRleF0pKkZpcnN0VmFsdWU7Ci0gICAgICAgICAgICAgICAgU3VtID0gKFVJTlQ2NCkgKCgqcEJJX1Jlc3VsdCktPnBJbnRlZ2VyQXJyYXlbQklGaXJzdEluZGV4ICsgQklTZWNvbmRJbmRleF0gKyBTZWNvbmRWYWx1ZSArIENhcnJ5KTsKLSAgICAgICAgICAgICAgICBDYXJyeSA9IFN1bSA+PiAzMjsKLSAgICAgICAgICAgICAgICAoKnBCSV9SZXN1bHQpLT5wSW50ZWdlckFycmF5W0JJRmlyc3RJbmRleCArIEJJU2Vjb25kSW5kZXhdID0gKFVJTlQzMikgKFN1bSAmIDB4ZmZmZmZmZmZVTCk7Ci0gICAgICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLSAgICAgICAgICAgIHdoaWxlIChDYXJyeSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgU3VtID0gKFVJTlQ2NCkgKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUZpcnN0SW5kZXggKyBCSVNlY29uZEluZGV4XTsKLSAgICAgICAgICAgICAgICBTdW0gKz0gQ2Fycnk7Ci0KLSAgICAgICAgICAgICAgICBDYXJyeSA9IFN1bSA+PiAzMjsKLSAgICAgICAgICAgICAgICAoKnBCSV9SZXN1bHQpLT5wSW50ZWdlckFycmF5W0JJRmlyc3RJbmRleCArIEJJU2Vjb25kSW5kZXhdID0gKFVJTlQzMikgKFN1bSAmIDB4ZmZmZmZmZmZVTCk7Ci0gICAgICAgICAgICAgICAgQklTZWNvbmRJbmRleCsrOwotICAgICAgICAgICAgfSAvKiBFbmQgb2Ygd2hpbGUgKi8KLSAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLQotb3V0cHV0OgotICAgICgqcEJJX1Jlc3VsdCktPlNpZ25lZCA9IHBGaXJzdE9wZXJhbmQtPlNpZ25lZCAqIHBTZWNvbmRPcGVyYW5kLT5TaWduZWQ7Ci0gICAgQmlnSW50ZWdlcl9DbGVhckhpZ2hCaXRzKCpwQklfUmVzdWx0KTsKLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfTXVsICovCi0KLQotVk9JRCBCaWdJbnRlZ2VyX1NxdWFyZSAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBCSSwKLSAgICBPVVQgUEJJR19JTlRFR0VSICpwQklfUmVzdWx0KQotewotICAgIElOVCBCSUZpcnN0SW5kZXgsIEJJU2Vjb25kSW5kZXg7Ci0JVUlOVDMyIEhCSVRTX1ZhbHVlLCBMQklUU19WYWx1ZSwgVGVtcDFfVmFsdWUsIFRlbXAyX1ZhbHVlLCBDYXJyeTMyOwotCVVJTlQzMiAqUG9pbnRfT2ZfUywgKlBvaW50X09mX1Jlc3VsdCwgKlBvaW50X09mX0JJOwotICAgIFVJTlQ2NCBSZXN1bHQ2NF8xLCBSZXN1bHQ2NF8yLCBDYXJyeTY0LCBUZW1wVmFsdWU2NDsKLQotICAgIGlmICgocEJJID09IE5VTEwpIHx8IChwQkktPnBJbnRlZ2VyQXJyYXkgPT0gTlVMTCkpIHsKLSAgICAgICAgREVCVUdQUklOVCgiXHRCaWdJbnRlZ2VyX1NxdWFyZTogdGhlIG9wZXJhbmQgaXMgTlVMTC5cbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qIFRoZSBvcGVyYW5kIGlzIHplcm8gKi8KLSAgICBpZiAgKChwQkktPkludGVnZXJMZW5ndGggID09IDEpICYmIChwQkktPnBJbnRlZ2VyQXJyYXlbMF0gID09ICAwKSkgewotICAgICAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQklfUmVzdWx0LCAxKTsKLSAgICAgICAgZ290byBvdXRwdXQ7Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKHBCSV9SZXN1bHQsIChwQkktPkludGVnZXJMZW5ndGgqMikgKyAyMCk7Ci0gICAgQmlnSW50ZWdlcl9BbGxvY1NpemUoJnBCSV9TLCAocEJJLT5JbnRlZ2VyTGVuZ3RoKjIpICsgMjApOwotICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKCZwQklfTywgKHBCSS0+SW50ZWdlckxlbmd0aCoyKSArIDIwKTsKLQotICAgIC8qCi0gICAgICogSW5wdXQ6IHBCSSA9IHthXzAsIGFfMSwgYV8yLCBhXzMsIC4uLiwgYV9ufQotICAgICAqIFN0ZXAxLiBjYWxjdWxhdGUgYV8wXjIsIGFfMV4yLCBhXzJeMiwgYV8zXjIgLi4uIGFfbl4yCi0gICAgICovCi0JUG9pbnRfT2ZfUyA9IHBCSV9TLT5wSW50ZWdlckFycmF5OwotICAgIGZvciAoQklGaXJzdEluZGV4PTA7IEJJRmlyc3RJbmRleCA8IHBCSS0+QXJyYXlMZW5ndGg7IEJJRmlyc3RJbmRleCsrKQotICAgIHsKLQlIQklUU19WYWx1ZSA9IFVJTlQzMl9IQklUUyhwQkktPnBJbnRlZ2VyQXJyYXlbQklGaXJzdEluZGV4XSk7Ci0JCUxCSVRTX1ZhbHVlID0gVUlOVDMyX0xCSVRTKHBCSS0+cEludGVnZXJBcnJheVtCSUZpcnN0SW5kZXhdKTsKLQkJVGVtcDFfVmFsdWUgPSBIQklUU19WYWx1ZSpMQklUU19WYWx1ZTsKLQkJVGVtcDJfVmFsdWUgPSAoVGVtcDFfVmFsdWUgJiAweDdmZmYpIDw8IDB4MTE7Ci0JCVBvaW50X09mX1NbMF0gPSAoTEJJVFNfVmFsdWUqTEJJVFNfVmFsdWUpICsgVGVtcDJfVmFsdWU7Ci0JCVBvaW50X09mX1NbMV0gPSAoSEJJVFNfVmFsdWUqSEJJVFNfVmFsdWUpICsgKChUZW1wMV9WYWx1ZSA+PiAweGYpICYgMHgxZmZmZik7Ci0JCWlmIChQb2ludF9PZl9TWzBdIDwgVGVtcDJfVmFsdWUpCi0JCQlQb2ludF9PZl9TWzFdICs9IDE7Ci0KLQkJUG9pbnRfT2ZfUyArPSAyOwotICAgIH0gLyogRW5kIG9mIGZvciAqLwotCi0gICAgLyoKLSAgICAgKiBTdGVwMi4gY2FsY3VsYXRlIGFfMCp7YV8xLCBhXzIsIGFfMywgYV80LCAuLi4sIGFfbn0KLSAgICAgKi8KLSAgICBQb2ludF9PZl9CSSA9IHBCSS0+cEludGVnZXJBcnJheTsKLSAgICBQb2ludF9PZl9SZXN1bHQgPSAoKnBCSV9SZXN1bHQpLT5wSW50ZWdlckFycmF5OwotICAgIFBvaW50X09mX1Jlc3VsdFswXSA9IDA7Ci0gICAgVGVtcFZhbHVlNjQgPSAoVUlOVDY0KSBQb2ludF9PZl9CSVswXTsKLSAgICBQb2ludF9PZl9SZXN1bHQrKzsKLSAgICBDYXJyeTY0ID0gMDsKLSAgICBmb3IgKEJJRmlyc3RJbmRleD0xOyBCSUZpcnN0SW5kZXggPCBwQkktPkFycmF5TGVuZ3RoOyBCSUZpcnN0SW5kZXgrKykKLSAgICB7Ci0gICAgICAgIFJlc3VsdDY0XzEgPSAgKFVJTlQ2NCkgUG9pbnRfT2ZfQklbQklGaXJzdEluZGV4XSpUZW1wVmFsdWU2NDsKLSAgICAgICAgUmVzdWx0NjRfMSArPSBDYXJyeTY0OwotICAgICAgICBDYXJyeTY0ID0gKFJlc3VsdDY0XzEgPj4gMzIpOwotICAgICAgICBQb2ludF9PZl9SZXN1bHRbMF0gPSAoVUlOVDMyKSAoUmVzdWx0NjRfMSAmIDB4ZmZmZmZmZmZVTCk7Ci0gICAgICAgIFBvaW50X09mX1Jlc3VsdCsrOwotICAgIH0gLyogRW5kIG9mIGZvciAqLwotICAgIGlmIChDYXJyeTY0ID4gMCkKLSAgICAgICAgUG9pbnRfT2ZfUmVzdWx0WzBdID0gKFVJTlQzMikgKENhcnJ5NjQgJiAweGZmZmZmZmZmVUwpOwotCi0gICAgLyoKLSAgICAgKiBTdGVwMy4gY2FsY3VsYXRlCi0gICAgICogICAgICAgICAgIGFfMSp7YV8yLCBhXzMsIGFfNCwgLi4uLCBhX259Ci0gICAgICogICAgICAgICAgIGFfMip7YV8zLCBhXzQsIGFfNSwgLi4uLCBhX259Ci0gICAgICogICAgICAgICAgIGFfMyp7YV80LCBhXzUsIGFfNiwgLi4uLCBhX259Ci0gICAgICogICAgICAgICAgIGFfNCp7YV81LCBhXzYsIGFfNywgLi4uLCBhX259Ci0gICAgICogICAgICAgICAgIC4uLgotICAgICAqICAgICAgICAgICBhX24tMSp7YV9ufQotICAgICAqLwotICAgIFBvaW50X09mX0JJID0gcEJJLT5wSW50ZWdlckFycmF5OwotICAgIGZvciAoQklGaXJzdEluZGV4PTE7IEJJRmlyc3RJbmRleCA8IChwQkktPkFycmF5TGVuZ3RoIC0gMSk7IEJJRmlyc3RJbmRleCsrKQotICAgIHsKLSAgICAgICAgUG9pbnRfT2ZfUmVzdWx0ID0gKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheTsKLSAgICAgICAgUG9pbnRfT2ZfUmVzdWx0ICs9IChCSUZpcnN0SW5kZXgqMikgKyAxOwotICAgICAgICBUZW1wVmFsdWU2NCA9IChVSU5UNjQpIFBvaW50X09mX0JJW0JJRmlyc3RJbmRleF07Ci0gICAgICAgIENhcnJ5NjQgPSAwOwotICAgICAgICBmb3IgKEJJU2Vjb25kSW5kZXg9KEJJRmlyc3RJbmRleCArIDEpOyBCSVNlY29uZEluZGV4IDwgcEJJLT5BcnJheUxlbmd0aDsgQklTZWNvbmRJbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXN1bHQ2NF8xID0gKChVSU5UNjQpIFBvaW50X09mX1Jlc3VsdFswXSkgKyBDYXJyeTY0OwotICAgICAgICAgICAgUmVzdWx0NjRfMiA9IChVSU5UNjQpIFBvaW50X09mX0JJW0JJU2Vjb25kSW5kZXhdKlRlbXBWYWx1ZTY0OwotICAgICAgICAgICAgQ2Fycnk2NCA9IChSZXN1bHQ2NF8xID4+IDMyKTsKLSAgICAgICAgICAgIFJlc3VsdDY0XzEgPSAoUmVzdWx0NjRfMSAmIDB4ZmZmZmZmZmZVTCk7Ci0gICAgICAgICAgICBSZXN1bHQ2NF8xID0gUmVzdWx0NjRfMSArIFJlc3VsdDY0XzI7Ci0gICAgICAgICAgICBDYXJyeTY0ICs9IChSZXN1bHQ2NF8xID4+IDMyKTsKLSAgICAgICAgICAgIFBvaW50X09mX1Jlc3VsdFswXSA9IChVSU5UMzIpIChSZXN1bHQ2NF8xICYgMHhmZmZmZmZmZlVMKTsKLSAgICAgICAgICAgIFBvaW50X09mX1Jlc3VsdCsrOwotICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLSAgICAgICAgaWYgKENhcnJ5NjQgPiAwKQotICAgICAgICAgICAgUG9pbnRfT2ZfUmVzdWx0WzBdICs9IChVSU5UMzIpIChDYXJyeTY0ICYgMHhmZmZmZmZmZlVMKTsKLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIEJpZ0ludGVnZXJfQ2xlYXJIaWdoQml0cygqcEJJX1Jlc3VsdCk7Ci0gICAgQmlnSW50ZWdlcl9Db3B5KCpwQklfUmVzdWx0LCAmcEJJX08pOwotCi0gICAgQ2FycnkzMiA9IDA7Ci0JZm9yIChCSUZpcnN0SW5kZXg9MDsgQklGaXJzdEluZGV4IDwgcEJJX08tPkFycmF5TGVuZ3RoOyBCSUZpcnN0SW5kZXgrKykgewotICAgICAgICBwQklfTy0+cEludGVnZXJBcnJheVtCSUZpcnN0SW5kZXhdID0gKHBCSV9PLT5wSW50ZWdlckFycmF5W0JJRmlyc3RJbmRleF0gPDwgMSkgfCBDYXJyeTMyOwotICAgICAgICBpZiAocEJJX08tPnBJbnRlZ2VyQXJyYXlbQklGaXJzdEluZGV4XSA8ICgqcEJJX1Jlc3VsdCktPnBJbnRlZ2VyQXJyYXlbQklGaXJzdEluZGV4XSkKLSAgICAgICAgICAgIENhcnJ5MzIgPSAxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBDYXJyeTMyID0gMDsKLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLSAgICBwQklfTy0+cEludGVnZXJBcnJheVtCSUZpcnN0SW5kZXhdID0gQ2FycnkzMjsKLSAgICBwQklfTy0+SW50ZWdlckxlbmd0aCsrOwotICAgIHBCSV9PLT5BcnJheUxlbmd0aCsrOwotICAgIEJpZ0ludGVnZXJfQ2xlYXJIaWdoQml0cyhwQklfTyk7Ci0KLSAgICBCaWdJbnRlZ2VyX0FkZChwQklfTywgcEJJX1MsIHBCSV9SZXN1bHQpOwotb3V0cHV0OgotICAgICgqcEJJX1Jlc3VsdCktPlNpZ25lZCA9IDE7Ci0gICAgQmlnSW50ZWdlcl9DbGVhckhpZ2hCaXRzKCpwQklfUmVzdWx0KTsKLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfU3F1YXJlICovCi0KLQotVk9JRCBCaWdJbnRlZ2VyX0RpdiAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBGaXJzdE9wZXJhbmQsCi0gICAgSU4gUEJJR19JTlRFR0VSIHBTZWNvbmRPcGVyYW5kLAotICAgIE9VVCBQQklHX0lOVEVHRVIgKnBCSV9SZXN1bHQsCi0gICAgT1VUIFBCSUdfSU5URUdFUiAqcEJJX1JlbWFpbmRlcikKLXsKLSAgICBJTlQgQ29tcGFyZVJlc3VsdDsKLSAgICBJTlQgSW5kZXgsIE11bEluZGV4LCBDb21wdXRlU2l6ZTsKLSAgICBVSU5UMzIgTXVsU3RhcnQ7Ci0gICAgVUlOVCBBbGxvY0xlbmd0aCwgQXJyYXlJbmRleCwgU2hpZnRJbmRleDsKLSAgICBQQklHX0lOVEVHRVIgcFRlbXBCSSA9IE5VTEwsIHBUZW1wQkkyID0gTlVMTCwgcE11bEJJID0gTlVMTDsKLSAgICBVSU5UOCBTZWNvbmRIaWdoQnl0ZTsKLQotICAgIGlmICAoKHBGaXJzdE9wZXJhbmQgPT0gTlVMTCkgfHwgKHBGaXJzdE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXkgPT0gTlVMTCkKLSAgICAgIHx8IChwU2Vjb25kT3BlcmFuZCA9PSBOVUxMKSB8fCAocFNlY29uZE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXkgPT0gTlVMTCkpIHsKLSAgICAgICAgREVCVUdQUklOVCgiQmlnSW50ZWdlcl9EaXY6IGZpcnN0IG9yIHNlY29uZCBvcGVyYW5kIGlzIE5VTEwuXG4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAvKiBUaGUgc2Vjb25kIG9wZXJhbmQgaXMgemVybyAqLwotICAgIGlmICgocFNlY29uZE9wZXJhbmQtPkludGVnZXJMZW5ndGggPT0gMSkgJiYgKHBTZWNvbmRPcGVyYW5kLT5wSW50ZWdlckFycmF5WzBdID09IDApKSB7Ci0gICAgICAgIERFQlVHUFJJTlQoIkJpZ0ludGVnZXJfRGl2OiBzZWNvbmQgb3BlcmFuZCBpcyB6ZXJvLlxuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgaWYgKCpwQklfUmVzdWx0ID09IE5VTEwpCi0gICAgICAgIEJpZ0ludGVnZXJfSW5pdChwQklfUmVzdWx0KTsKLSAgICBpZiAoKnBCSV9SZW1haW5kZXIgPT0gTlVMTCkKLSAgICAgICAgQmlnSW50ZWdlcl9Jbml0KHBCSV9SZW1haW5kZXIpOwotCi0gICAgLyogVGhlIHNlY29uZCBvcGVyYW5kIGlzIG9uZSAqLwotICAgIGlmICAoKHBTZWNvbmRPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoICA9PSAxKSAmJiAocFNlY29uZE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXlbMF0gID09IDEpKSB7Ci0gICAgICAgIEJpZ0ludGVnZXJfQ29weShwRmlyc3RPcGVyYW5kLCBwQklfUmVzdWx0KTsKLSAgICAgICAgQmlnSW50ZWdlcl9CaW4yQkkoVmFsdWVfMCwgMSwgcEJJX1JlbWFpbmRlcik7Ci0gICAgICAgIGdvdG8gb3V0cHV0OwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICBDb21wYXJlUmVzdWx0ID0gQmlnSW50ZWdlcl9VbnNpZ25lZENvbXBhcmUocEZpcnN0T3BlcmFuZCwgcFNlY29uZE9wZXJhbmQpOwotICAgIGlmIChDb21wYXJlUmVzdWx0ID09IDApIHsKLSAgICAgICAgQmlnSW50ZWdlcl9CaW4yQkkoVmFsdWVfMSwgMSwgcEJJX1Jlc3VsdCk7Ci0gICAgICAgIEJpZ0ludGVnZXJfQmluMkJJKFZhbHVlXzAsIDEsIHBCSV9SZW1haW5kZXIpOwotICAgICAgICBnb3RvIG91dHB1dDsKLSAgICB9IGVsc2UgaWYgKENvbXBhcmVSZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgQmlnSW50ZWdlcl9CaW4yQkkoVmFsdWVfMCwgMSwgcEJJX1Jlc3VsdCk7Ci0gICAgICAgIEJpZ0ludGVnZXJfQ29weShwRmlyc3RPcGVyYW5kLCBwQklfUmVtYWluZGVyKTsKLSAgICAgICAgZ290byBvdXRwdXQ7Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQklfUmVzdWx0LCBwRmlyc3RPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoIC0gcFNlY29uZE9wZXJhbmQtPkludGVnZXJMZW5ndGggKyAxKTsKLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQklfUmVtYWluZGVyLCBwU2Vjb25kT3BlcmFuZC0+SW50ZWdlckxlbmd0aCk7Ci0KLSAgICBBbGxvY0xlbmd0aCA9IChVSU5UKSAocEZpcnN0T3BlcmFuZC0+SW50ZWdlckxlbmd0aCA8PCAxKTsKLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZSgmcFRlbXBCSSwgQWxsb2NMZW5ndGgpOwotICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKCZwVGVtcEJJMiwgQWxsb2NMZW5ndGgpOwotICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKCZwTXVsQkksIEFsbG9jTGVuZ3RoKTsKLQotICAgIEJpZ0ludGVnZXJfQ29weShwRmlyc3RPcGVyYW5kLCBwQklfUmVtYWluZGVyKTsKLSAgICBTZWNvbmRIaWdoQnl0ZSA9IEJpZ0ludGVnZXJfR2V0Qnl0ZVZhbHVlKHBTZWNvbmRPcGVyYW5kLCBwU2Vjb25kT3BlcmFuZC0+SW50ZWdlckxlbmd0aCk7Ci0gICAgQ29tcHV0ZVNpemUgPSAoSU5UKSBwRmlyc3RPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoIC0gcFNlY29uZE9wZXJhbmQtPkludGVnZXJMZW5ndGggKyAxOwotICAgIGZvciAoSW5kZXggPSAoSU5UKSBDb21wdXRlU2l6ZTtJbmRleCA+PSAwO0luZGV4LS0pIHsKLSAgICAgICAgaWYgKEJpZ0ludGVnZXJfVW5zaWduZWRDb21wYXJlKCpwQklfUmVtYWluZGVyLCBwU2Vjb25kT3BlcmFuZCkgPT0gLTEpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoKChwU2Vjb25kT3BlcmFuZC0+SW50ZWdlckxlbmd0aCArIEluZGV4KSAtICgqcEJJX1JlbWFpbmRlciktPkludGVnZXJMZW5ndGgpIDw9IDEpIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKCZwTXVsQkksIEluZGV4ICsgMSk7Ci0gICAgICAgICAgICBBcnJheUluZGV4ID0gMDsKLSAgICAgICAgICAgIGlmIChJbmRleCA+IDApCi0gICAgICAgICAgICAgICAgQXJyYXlJbmRleCA9IChVSU5UKSAoSW5kZXggLSAxKSA+PiAyIDsKLSAgICAgICAgICAgIFNoaWZ0SW5kZXggPSAoSW5kZXggJiAweDAzKTsKLSAgICAgICAgICAgIGlmIChTaGlmdEluZGV4ID09IDApCi0gICAgICAgICAgICAgICAgU2hpZnRJbmRleCA9IDQ7Ci0gICAgICAgICAgICBTaGlmdEluZGV4LS07Ci0gICAgICAgICAgICBNdWxTdGFydCA9IDA7Ci0gICAgICAgICAgICBNdWxTdGFydCA9IChCaWdJbnRlZ2VyX0dldEJ5dGVWYWx1ZSgoKnBCSV9SZW1haW5kZXIpLCBwRmlyc3RPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoICsgSW5kZXggLSBDb21wdXRlU2l6ZSArIDEpICYgMHhGRikgPDwgODsKLSAgICAgICAgICAgIE11bFN0YXJ0ID0gTXVsU3RhcnQgfCAoQmlnSW50ZWdlcl9HZXRCeXRlVmFsdWUoKCpwQklfUmVtYWluZGVyKSwgcEZpcnN0T3BlcmFuZC0+SW50ZWdlckxlbmd0aCArIEluZGV4IC0gQ29tcHV0ZVNpemUpICYgMHhGRik7Ci0gICAgICAgICAgICBpZiAoTXVsU3RhcnQgPCAoVUlOVDMyKSBTZWNvbmRIaWdoQnl0ZSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgTXVsU3RhcnQgPSBNdWxTdGFydCAvIChVSU5UMzIpIFNlY29uZEhpZ2hCeXRlOwotCi0gICAgICAgICAgICBpZiAoTXVsU3RhcnQgPiAweEZGKQotICAgICAgICAgICAgICAgIE11bFN0YXJ0ID0gMHgxMDA7Ci0KLSAgICAgICAgICAgIGZvciAoTXVsSW5kZXggPSAoSU5UKSBNdWxTdGFydDtNdWxJbmRleCA8PSAweDEwMTtNdWxJbmRleCsrKSB7IC8qIDB4RkZGRiAvIDB4RkYgPSAweDEwMSAqLwotICAgICAgICAgICAgICAgIGlmICgoTXVsSW5kZXggPiAweEZGKSAmJiAoU2hpZnRJbmRleCA9PSAzKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBNdWxCSS0+cEludGVnZXJBcnJheVtBcnJheUluZGV4ICsgMV0gPSAweDAxOwotICAgICAgICAgICAgICAgIHBNdWxCSS0+cEludGVnZXJBcnJheVtBcnJheUluZGV4XSA9ICgoVUlOVCkgTXVsSW5kZXggPDwgKDgqU2hpZnRJbmRleCkpOwotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXJfTXVsKHBTZWNvbmRPcGVyYW5kLCBwTXVsQkkgLCAmcFRlbXBCSSk7Ci0gICAgICAgICAgICAgICAgQ29tcGFyZVJlc3VsdCA9IEJpZ0ludGVnZXJfVW5zaWduZWRDb21wYXJlKCpwQklfUmVtYWluZGVyLCBwVGVtcEJJKTsKLSAgICAgICAgICAgICAgICBpZiAoQ29tcGFyZVJlc3VsdCA8IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE11bEluZGV4ID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbXBhcmVSZXN1bHQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoTXVsSW5kZXggPT0gMHgxMDApICYmIChTaGlmdEluZGV4ID09IDMpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTXVsQkktPnBJbnRlZ2VyQXJyYXlbQXJyYXlJbmRleCArIDFdID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTXVsQkktPnBJbnRlZ2VyQXJyYXlbQXJyYXlJbmRleF0gPSAoKFVJTlQpIChNdWxJbmRleCAtIDEpIDw8ICg4KlNoaWZ0SW5kZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXJfTXVsKHBTZWNvbmRPcGVyYW5kLCBwTXVsQkksICZwVGVtcEJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXJfU3ViKCpwQklfUmVtYWluZGVyLCBwVGVtcEJJLCAmcFRlbXBCSTIpOwotICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlcl9Db3B5KHBUZW1wQkkyLCBwQklfUmVtYWluZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXJfQWRkKCpwQklfUmVzdWx0LCBwTXVsQkksICZwVGVtcEJJMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyX0NvcHkocFRlbXBCSTIsIHBCSV9SZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgICAgICAgICAgICAgaWYgKChNdWxJbmRleCA+PSAweDEwMCkgJiYgKFNoaWZ0SW5kZXggPT0gMykpCi0gICAgICAgICAgICAgICAgICAgcE11bEJJLT5wSW50ZWdlckFycmF5W0FycmF5SW5kZXgrK10gPSAwOwotICAgICAgICAgICAgICAgIHBNdWxCSS0+cEludGVnZXJBcnJheVtBcnJheUluZGV4XSA9IDA7Ci0gICAgICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLSAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIEJpZ0ludGVnZXJfRnJlZSgmcFRlbXBCSSk7Ci0gICAgQmlnSW50ZWdlcl9GcmVlKCZwVGVtcEJJMik7Ci0gICAgQmlnSW50ZWdlcl9GcmVlKCZwTXVsQkkpOwotb3V0cHV0OgotICAgICgqcEJJX1Jlc3VsdCktPlNpZ25lZCA9IHBGaXJzdE9wZXJhbmQtPlNpZ25lZCAqIHBTZWNvbmRPcGVyYW5kLT5TaWduZWQ7Ci0gICAgKCpwQklfUmVtYWluZGVyKS0+U2lnbmVkID0gcEZpcnN0T3BlcmFuZC0+U2lnbmVkICogcFNlY29uZE9wZXJhbmQtPlNpZ25lZDsKLSAgICBCaWdJbnRlZ2VyX0NsZWFySGlnaEJpdHMoKnBCSV9SZXN1bHQpOwotICAgIEJpZ0ludGVnZXJfQ2xlYXJIaWdoQml0cygqcEJJX1JlbWFpbmRlcik7Ci19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX0RpdiAqLwotCi0KLVZPSUQgQmlnSW50ZWdlcl9Nb250Z29tZXJ5X1JlZHVjdGlvbiAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBCSV9BLAotICAgIElOIFBCSUdfSU5URUdFUiBwQklfUCwKLSAgICAgSU4gUEJJR19JTlRFR0VSIHBCSV9SLAotICAgIE9VVCBQQklHX0lOVEVHRVIgKnBCSV9SZXN1bHQpCi17Ci0gICAgVUlOVDMyICpQb2ludF9QLCAqUG9pbnRfUmVzdWx0OwotICAgIFVJTlQzMiBMb29wQ291bnQ7Ci0gICAgVUlOVDY0IFJlc3VsdDY0XzEsIFJlc3VsdDY0XzIsIENhcnJ5NjQsIFRlbXBWYWx1ZTY0OwotICAgIElOVCBGaXJzdExvb3AsIFNlY29uZExvb3A7Ci0KLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQklfUmVzdWx0LCBwQklfQS0+SW50ZWdlckxlbmd0aCsgcEJJX1AtPkludGVnZXJMZW5ndGggKyAyMCk7Ci0gICAgQmlnSW50ZWdlcl9Db3B5KHBCSV9BLCBwQklfUmVzdWx0KTsKLQotICAgIFBvaW50X1AgPSBwQklfUC0+cEludGVnZXJBcnJheTsKLSAgICBQb2ludF9SZXN1bHQgPSAoKnBCSV9SZXN1bHQpLT5wSW50ZWdlckFycmF5OwotCi0gICAgTG9vcENvdW50ID0gQml0c19PZl9SID4+IDB4NTsKLSAgICBmb3IgKEZpcnN0TG9vcCA9IDA7Rmlyc3RMb29wIDwgTG9vcENvdW50O0ZpcnN0TG9vcCsrKSB7Ci0gICAgICAgIENhcnJ5NjQgPSAwOwotICAgICAgICBUZW1wVmFsdWU2NCA9IChVSU5UNjQpIFBvaW50X1Jlc3VsdFswXTsKLSAgICAgICAgZm9yIChTZWNvbmRMb29wID0gMDtTZWNvbmRMb29wIDwgcEJJX1AtPkFycmF5TGVuZ3RoO1NlY29uZExvb3ArKykgewotICAgICAgICAgICAgUmVzdWx0NjRfMSA9ICgoVUlOVDY0KSBQb2ludF9SZXN1bHRbU2Vjb25kTG9vcF0pICsgQ2Fycnk2NDsKLSAgICAgICAgICAgIFJlc3VsdDY0XzIgPSAoVUlOVDY0KSBQb2ludF9QW1NlY29uZExvb3BdKlRlbXBWYWx1ZTY0OwotICAgICAgICAgICAgQ2Fycnk2NCA9IChSZXN1bHQ2NF8xID4+IDMyKTsKLSAgICAgICAgICAgIFJlc3VsdDY0XzEgPSAoUmVzdWx0NjRfMSAmIDB4ZmZmZmZmZmZVTCk7Ci0gICAgICAgICAgICBSZXN1bHQ2NF8xID0gUmVzdWx0NjRfMSArIFJlc3VsdDY0XzI7Ci0gICAgICAgICAgICBDYXJyeTY0ICs9IChSZXN1bHQ2NF8xID4+IDMyKTsKLSAgICAgICAgICAgIFBvaW50X1Jlc3VsdFtTZWNvbmRMb29wXSA9IChVSU5UMzIpIChSZXN1bHQ2NF8xICYgMHhmZmZmZmZmZlVMKTsKLSAgICAgICAgfSAvKiBFbmQgb2YgZm9yICovCi0gICAgICAgIHdoaWxlIChDYXJyeTY0ICE9IDApIHsKLSAgICAgICAgICBSZXN1bHQ2NF8xID0gKChVSU5UNjQpIFBvaW50X1Jlc3VsdFtTZWNvbmRMb29wXSkgKyBDYXJyeTY0OwotICAgICAgICAgIENhcnJ5NjQgPSBSZXN1bHQ2NF8xID4+IDMyOwotICAgICAgICAgIFBvaW50X1Jlc3VsdFtTZWNvbmRMb29wXSA9IChVSU5UMzIpIChSZXN1bHQ2NF8xICYgMHhmZmZmZmZmZlVMKTsKLSAgICAgICAgICBTZWNvbmRMb29wKys7Ci0gICAgICAgIH0gLyogRW5kIG9mIHdoaWxlICovCi0gICAgICAgIFBvaW50X1Jlc3VsdCsrOwotICAgIH0gLyogRW5kIG9mIGZvciAqLwotCi0gICAgZm9yIChGaXJzdExvb3AgPSAwO0ZpcnN0TG9vcCA8PSBMb29wQ291bnQ7Rmlyc3RMb29wKyspIHsKLSAgICAgICAgKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtGaXJzdExvb3BdID0gKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtGaXJzdExvb3AgKyBMb29wQ291bnRdOwotICAgIH0gLyogRW5kIG9mIGZvciAqLwotICAgIGlmICgoKnBCSV9SZXN1bHQpLT5wSW50ZWdlckFycmF5W0xvb3BDb3VudF0gIT0gMCkKLSAgICAgICAgKCpwQklfUmVzdWx0KS0+QXJyYXlMZW5ndGggPSBMb29wQ291bnQgKyAxOwotICAgIGVsc2UKLSAgICAgICAgKCpwQklfUmVzdWx0KS0+QXJyYXlMZW5ndGggPSBMb29wQ291bnQ7Ci0KLSAgICAoKnBCSV9SZXN1bHQpLT5JbnRlZ2VyTGVuZ3RoID0gKCpwQklfUmVzdWx0KS0+QXJyYXlMZW5ndGgqNDsKLSAgICBCaWdJbnRlZ2VyX0NsZWFySGlnaEJpdHMoKnBCSV9SZXN1bHQpOwotCi0gICAgaWYgKEJpZ0ludGVnZXJfVW5zaWduZWRDb21wYXJlKCpwQklfUmVzdWx0LCBwQklfUCkgPj0gMCkgewotICAgICAgICBCaWdJbnRlZ2VyX1N1YigqcEJJX1Jlc3VsdCwgcEJJX1AsICZwQklfVSk7Ci0gICAgICAgIEJpZ0ludGVnZXJfQ29weShwQklfVSwgcEJJX1Jlc3VsdCk7Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBCaWdJbnRlZ2VyX0NsZWFySGlnaEJpdHMoKnBCSV9SZXN1bHQpOwotfSAvKiBFbmQgb2YgQmlnSW50ZWdlcl9Nb250Z29tZXJ5X1JlZHVjdGlvbiAqLwotCi0KLVZPSUQgQmlnSW50ZWdlcl9Nb250Z29tZXJ5X0V4cE1vZCAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBCSV9HLAotICAgIElOIFBCSUdfSU5URUdFUiBwQklfRSwKLSAgICBJTiBQQklHX0lOVEVHRVIgcEJJX1AsCi0gICAgT1VUIFBCSUdfSU5URUdFUiAqcEJJX1Jlc3VsdCkKLXsKLSAgICBVSU5UIEJpdHNfT2ZfUDsKLSAgICBVSU5UMzIgSW5kZXgsIEluZGV4MiwgQWxsb2NMZW5ndGg7Ci0JVUlOVDMyIFNsaWRpbmdfVmFsdWUgLCBTbGlkaW5nX0hpZ2hWYWx1ZSwgU2xpZGluZ19Mb3dWYWx1ZTsKLSAgICBQQklHX0lOVEVHRVIgcEJJX1RlbXAxID0gTlVMTCwgcEJJX1RlbXAyID0gTlVMTDsKLSAgICBQQklHX0lOVEVHRVIgcEJJX1ggPSBOVUxMLCBwQklfUiA9IE5VTEwsIHBCSV9SUiA9IE5VTEwsIHBCSV8xID0gTlVMTDsKLSAgICBCSUdfSU5URUdFUiAqcEJJX0FbU0xJRElOR19XSU5ET1ddOwotICAgIFVJTlQ4ICpwUlZhbHVlID0gTlVMTDsKLQotICAgIEFsbG9jTGVuZ3RoID0gKHBCSV9HLT5JbnRlZ2VyTGVuZ3RoICsgcEJJX0UtPkludGVnZXJMZW5ndGggKyBwQklfUC0+SW50ZWdlckxlbmd0aCArIDMwMCk7Ci0gICAgQmlnSW50ZWdlcl9BbGxvY1NpemUoJnBCSV9UZW1wMSwgQWxsb2NMZW5ndGgpOwotICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKCZwQklfVGVtcDIsIEFsbG9jTGVuZ3RoKTsKLQotICAgIC8qIENhbGN1bGF0ZSB0aGUgYml0cyBvZiBQIGFuZCBFLCB0aGUgaGlnaGVzdCBiaXQgaXMgMSAqLwotICAgIEJpZ0ludGVnZXJfQml0c09mQkkocEJJX1AsICZCaXRzX09mX1ApOwotCi0gICAgaWYgKChwQklfRS0+SW50ZWdlckxlbmd0aCA9PSAxKSAmJiAocEJJX0UtPnBJbnRlZ2VyQXJyYXlbMF0gPT0gMSkpIHsKLSAgICAgICAgQmlnSW50ZWdlcl9EaXYocEJJX0csIHBCSV9QLCAmcEJJX1RlbXAxLCBwQklfUmVzdWx0KTsKLSAgICAgICAgZ290byBtZW1vcnlfZnJlZTsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgaWYgKChwQklfRS0+SW50ZWdlckxlbmd0aCA9PSAxKSAmJiAocEJJX0UtPnBJbnRlZ2VyQXJyYXlbMF0gPT0gMikpIHsKLSAgICAgICAgQmlnSW50ZWdlcl9NdWwocEJJX0csIHBCSV9HLCAmcEJJX1RlbXAxKTsKLSAgICAgICAgQmlnSW50ZWdlcl9EaXYocEJJX1RlbXAxLCBwQklfUCwgJnBCSV9UZW1wMiwgcEJJX1Jlc3VsdCk7Ci0gICAgICAgIGdvdG8gbWVtb3J5X2ZyZWU7Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qCi0gICAgICogTWFpbiBhbGdvcml0aG0KLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyX0luaXQoJnBCSV9SKTsKLSAgICBCaWdJbnRlZ2VyX0luaXQoJnBCSV9SUik7Ci0gICAgQmlnSW50ZWdlcl9CaW4yQkkoVmFsdWVfMSwgMSwgJnBCSV8xKTsKLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZSgmcEJJX1gsIEFsbG9jTGVuZ3RoKTsKLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZSgmcEJJX1UsIEFsbG9jTGVuZ3RoKTsgLy8gZm9yIEJpZ0ludGVnZXJfTW9udGdvbWVyeV9SZWR1Y3Rpb24KLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZSgmcEJJX1MsIEFsbG9jTGVuZ3RoKTsgLy8gZm9yIEJpZ0ludGVnZXJfU3F1YXJlCi0gICAgQmlnSW50ZWdlcl9BbGxvY1NpemUoJnBCSV9PLCBBbGxvY0xlbmd0aCk7IC8vIGZvciBCaWdJbnRlZ2VyX1NxdWFyZQotCi0gICAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgU0xJRElOR19XSU5ET1c7IEluZGV4KyspIHsKLSAgICAgICAgcEJJX0FbSW5kZXhdID0gTlVMTDsKLQkJQmlnSW50ZWdlcl9BbGxvY1NpemUoJnBCSV9BW0luZGV4XSwgMTkzKTsKLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLSAgICBCaWdJbnRlZ2VyX0JpbjJCSShXUFNfREhfUF9WQUxVRSwgMTkyLCAmcEJJX1RlbXAxKTsKLSAgICBpZiAoTmRpc0NtcE1lbW9yeShwQklfUC0+cEludGVnZXJBcnJheSwgcEJJX1RlbXAxLT5wSW50ZWdlckFycmF5LCBwQklfUC0+SW50ZWdlckxlbmd0aCkgPT0gMCkgewotICAgICAgICBCaWdJbnRlZ2VyX0JpbjJCSShXUFNfREhfWF9WQUxVRSwgMTg0LCAmcEJJX1gpOwotICAgICAgICBCaWdJbnRlZ2VyX0JpbjJCSShXUFNfREhfUl9WQUxVRSwgMTkzLCAmcEJJX1IpOwotICAgICAgICBCaWdJbnRlZ2VyX0JpbjJCSShXUFNfREhfUlJNb2RQX1ZBTFVFLCAxOTIsICZwQklfUlIpOwotICAgICAgICBCaXRzX09mX1IgPSAxNTM3OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICgoQml0c19PZl9QICUgOCkgPT0gMCkgewotICAgICAgICAgICAgQWxsb2NMZW5ndGggPSBwQklfUC0+SW50ZWdlckxlbmd0aCArIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBbGxvY0xlbmd0aCA9IHBCSV9QLT5JbnRlZ2VyTGVuZ3RoOwotICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgICAgICBwUlZhbHVlID0gKFVJTlQ4ICopIGttYWxsb2Moc2l6ZW9mKFVJTlQ4KSpBbGxvY0xlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JaWYgKHBSVmFsdWUgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzKCk6QWxsb2MgbWVtb3J5IGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCWdvdG8gbWVtb3J5X2ZyZWU7Ci0JfQotICAgICAgICBOZGlzWmVyb01lbW9yeShwUlZhbHVlLCBzaXplb2YoVUlOVDgpKkFsbG9jTGVuZ3RoKTsKLSAgICAgICAgcFJWYWx1ZVswXSA9IChVSU5UOCkgKDEgPDwgKEJpdHNfT2ZfUCAmIDB4NykpOwotICAgICAgICBCaWdJbnRlZ2VyX0JpbjJCSShwUlZhbHVlLCBBbGxvY0xlbmd0aCAsICZwQklfUik7Ci0KLSAgICAgICAgQmlnSW50ZWdlcl9NdWwocEJJX1IsIHBCSV9SLCAmcEJJX1RlbXAxKTsKLSAgICAgICAgQmlnSW50ZWdlcl9EaXYocEJJX1RlbXAxLCBwQklfUCwgJnBCSV9BWzFdLCAmcEJJX1JSKTsKLQotICAgICAgICAvKiBYID0gMSpSIChtb2QgUCkgKi8KLSAgICAgICAgQmlnSW50ZWdlcl9EaXYocEJJX1IsIHBCSV9QLCAmcEJJX1RlbXAyLCAmcEJJX1gpOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAvKiBBID0gRypSIChtb2QgUCkgPT4gQSA9IE1vbk1vZChHLCBSXjIgbW9kIFApICovCi0gICAgQmlnSW50ZWdlcl9NdWwocEJJX0csIHBCSV9SUiwgJnBCSV9UZW1wMSk7Ci0gICAgQmlnSW50ZWdlcl9Nb250Z29tZXJ5X1JlZHVjdGlvbihwQklfVGVtcDEsIHBCSV9QICwgcEJJX1IsICZwQklfQVsxXSk7Ci0gICAgZm9yIChJbmRleCA9IDI7IEluZGV4IDwgU0xJRElOR19XSU5ET1c7IEluZGV4KyspIHsKLSAgICAgICAgQmlnSW50ZWdlcl9NdWwocEJJX0FbSW5kZXggLSAxXSwgcEJJX0FbMV0sICZwQklfVGVtcDEpOwotCSAgICBCaWdJbnRlZ2VyX01vbnRnb21lcnlfUmVkdWN0aW9uKHBCSV9UZW1wMSwgcEJJX1AsIHBCSV9SLCAmcEJJX0FbSW5kZXhdKTsKLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIGZvciAoSW5kZXggPSBwQklfRS0+SW50ZWdlckxlbmd0aCA7IEluZGV4ID4gMCA7IEluZGV4LS0pIHsKLSAgICAgICAgZm9yIChJbmRleDIgPSAwOyBJbmRleDIgPCA0IDsgSW5kZXgyKyspIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXJfU3F1YXJlKHBCSV9YLCAmcEJJX1RlbXAxKTsKLQkJCUJpZ0ludGVnZXJfTW9udGdvbWVyeV9SZWR1Y3Rpb24ocEJJX1RlbXAxLCBwQklfUCwgcEJJX1IsICZwQklfWCk7Ci0JICAgIH0gLyogRW5kIG9mIGZvciAqLwotCi0JCVNsaWRpbmdfVmFsdWUgPSBCaWdJbnRlZ2VyX0dldEJ5dGVWYWx1ZShwQklfRSwgSW5kZXgpOwotCQlTbGlkaW5nX0hpZ2hWYWx1ZSA9IChTbGlkaW5nX1ZhbHVlID4+IDQpOwotCQlpZiAoU2xpZGluZ19IaWdoVmFsdWUgIT0gMCkgewotICAgICAgICAgICAgQmlnSW50ZWdlcl9NdWwocEJJX0FbU2xpZGluZ19IaWdoVmFsdWVdLCBwQklfWCwgJnBCSV9UZW1wMSk7Ci0JCQlCaWdJbnRlZ2VyX01vbnRnb21lcnlfUmVkdWN0aW9uKHBCSV9UZW1wMSwgcEJJX1AsIHBCSV9SLCAmcEJJX1gpOwotCQl9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgICAgIGZvciAoSW5kZXgyID0gMDsgSW5kZXgyIDwgNCA7IEluZGV4MisrKSB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX1NxdWFyZShwQklfWCwgJnBCSV9UZW1wMSk7Ci0JCQlCaWdJbnRlZ2VyX01vbnRnb21lcnlfUmVkdWN0aW9uKHBCSV9UZW1wMSwgcEJJX1AsIHBCSV9SLCAmcEJJX1gpOwotCSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLQotCQlTbGlkaW5nX0xvd1ZhbHVlID0gU2xpZGluZ19WYWx1ZSAmIDB4MGY7Ci0JCWlmIChTbGlkaW5nX0xvd1ZhbHVlICE9IDApIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXJfTXVsKHBCSV9BW1NsaWRpbmdfTG93VmFsdWVdLCBwQklfWCwgJnBCSV9UZW1wMSk7Ci0JCQlCaWdJbnRlZ2VyX01vbnRnb21lcnlfUmVkdWN0aW9uKHBCSV9UZW1wMSwgcEJJX1AsIHBCSV9SLCAmcEJJX1gpOwotCQl9IC8qIEVuZCBvZiBpZiAqLwotICAgIH0gLyogRW5kIG9mIGZvciAqLwotICAgIEJpZ0ludGVnZXJfTW9udGdvbWVyeV9SZWR1Y3Rpb24ocEJJX1gsIHBCSV9QICwgcEJJX1IsIHBCSV9SZXN1bHQpOwotCi0gICAgQmlnSW50ZWdlcl9GcmVlKCZwQklfWCk7Ci0gICAgQmlnSW50ZWdlcl9GcmVlKCZwQklfUik7Ci0gICAgQmlnSW50ZWdlcl9GcmVlKCZwQklfUlIpOwotICAgIEJpZ0ludGVnZXJfRnJlZSgmcEJJXzEpOwotICAgIEJpZ0ludGVnZXJfRnJlZSgmcEJJX1UpOwotICAgIEJpZ0ludGVnZXJfRnJlZSgmcEJJX1MpOwotICAgIEJpZ0ludGVnZXJfRnJlZSgmcEJJX08pOwotICAgIGZvcihJbmRleCA9IDA7IEluZGV4IDwgU0xJRElOR19XSU5ET1c7IEluZGV4KyspCi0JCQlCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9BW0luZGV4XSk7Ci0gICAgaWYgKHBSVmFsdWUgIT0gTlVMTCkKLSAgICAgICAga2ZyZWUocFJWYWx1ZSk7Ci0KLW1lbW9yeV9mcmVlOgotICAgIEJpZ0ludGVnZXJfRnJlZSgmcEJJX1RlbXAxKTsKLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9UZW1wMik7Ci19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX01vbnRnb21lcnlfRXhwTW9kICovCi0KLS8qIEVuZCBvZiBjcnlwdF9iaWdpbnRlZ2VyLmMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X2RoLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9kaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjY5ZjJhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X2RoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQljcnlwdF9kaC5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JRWRkeSAgICAgICAgMjAwOS8wMS8xOSAgICAgIENyZWF0ZSBBRVMtMTI4LCBBRVMtMTkyLCBBRVMtMjU2LCBBRVMtQ0JDCi0qLwotCi0jaW5jbHVkZSAiY3J5cHRfZGguaCIKLSNpbmNsdWRlICJjcnlwdF9iaWdpbnRlZ2VyLmgiCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgRGlmZmllLUhlbGxtYW4gcHVibGljIGtleSBnZW5lcmF0aW9uCi0KLUFyZ3VtZW50czoKLSAgICBHVmFsdWUgICAgICAgICAgIEFycmF5IGluIFVJTlQ4Ci0gICAgR1ZhbHVlTGVuZ3RoICAgICBUaGUgbGVuZ3RoIG9mIEcgaW4gYnl0ZXMKLSAgICBQVmFsdWUgICAgICAgICAgIEFycmF5IGluIFVJTlQ4Ci0gICAgUFZhbHVlTGVuZ3RoICAgICBUaGUgbGVuZ3RoIG9mIFAgaW4gYnl0ZXMKLSAgICBQcml2YXRlS2V5ICAgICAgIFByaXZhdGUga2V5Ci0gICAgUHJpdmF0ZUtleUxlbmd0aCBUaGUgbGVuZ3RoIG9mIFByaXZhdGUga2V5IGluIGJ5dGVzCi0KLVJldHVybiBWYWx1ZToKLSAgICBQdWJsaWNLZXkgICAgICAgUHVibGljIGtleQotICAgIFB1YmxpY0tleUxlbmd0aCBUaGUgbGVuZ3RoIG9mIHB1YmxpYyBrZXkgaW4gYnl0ZXMKLQotTm90ZToKLSAgICBSZWZlcmVuY2UgdG8gUkZDMjYzMQotICAgIFB1YmxpY0tleSA9IEdeUHJpdmF0ZUtleSAobW9kIFApCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi12b2lkIERIX1B1YmxpY0tleV9HZW5lcmF0ZSAoCi0gICAgSU4gVUlOVDggR1ZhbHVlW10sCi0gICAgSU4gVUlOVCBHVmFsdWVMZW5ndGgsCi0gICAgSU4gVUlOVDggUFZhbHVlW10sCi0gICAgSU4gVUlOVCBQVmFsdWVMZW5ndGgsCi0gICAgSU4gVUlOVDggUHJpdmF0ZUtleVtdLAotICAgIElOIFVJTlQgUHJpdmF0ZUtleUxlbmd0aCwKLSAgICBPVVQgVUlOVDggUHVibGljS2V5W10sCi0gICAgSU5PVVQgVUlOVCAqUHVibGljS2V5TGVuZ3RoKQotewotICAgIFBCSUdfSU5URUdFUiBwQklfRyA9IE5VTEw7Ci0gICAgUEJJR19JTlRFR0VSIHBCSV9QID0gTlVMTDsKLSAgICBQQklHX0lOVEVHRVIgcEJJX1ByaXZhdGVLZXkgPSBOVUxMOwotICAgIFBCSUdfSU5URUdFUiBwQklfUHVibGljS2V5ID0gTlVMTDsKLQotICAgIC8qCi0gICAgICogMS4gQ2hlY2sgdGhlIGlucHV0IHBhcmFtZXRlcnMKLSAgICAgKiAgICAtIEdWYWx1ZUxlbmd0aCwgUFZhbHVlTGVuZ3RoIGFuZCBQcml2YXRlTGVuZ3RoIG11c3QgYmUgbGFyZ2UgdGhhbiB6ZXJvCi0gICAgICogICAgLSBQdWJsaWNLZXlMZW5ndGggbXVzdCBiZSBsYXJnZSBvciBlcXVhbCB0aGFuIFBWYWx1ZUxlbmd0aAotICAgICAqICAgIC0gUFZhbHVlIG11c3QgYmUgb2RkCi0gICAgICoKLSAgICAgKiAgICAtIFBWYWx1ZSBtdXN0IGJlIHByaW1lIG51bWJlciAobm8gaW1wbGVtZW50KQotICAgICAqICAgIC0gR1ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgYnV0IGxlc3MgdGhhbiB0aGUgUFZhbHVlIChubyBpbXBsZW1lbnQpCi0gICAgICovCi0gICAgaWYgKEdWYWx1ZUxlbmd0aCA9PSAwKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiREhfUHVibGljS2V5X0dlbmVyYXRlOiBHIGxlbmd0aCBpcyAoJWQpXG4iLCBHVmFsdWVMZW5ndGgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgaWYgKFBWYWx1ZUxlbmd0aCA9PSAwKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiREhfUHVibGljS2V5X0dlbmVyYXRlOiBQIGxlbmd0aCBpcyAoJWQpXG4iLCBQVmFsdWVMZW5ndGgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgaWYgKFByaXZhdGVLZXlMZW5ndGggPT0gMCkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkRIX1B1YmxpY0tleV9HZW5lcmF0ZTogcHJpdmF0ZSBrZXkgbGVuZ3RoIGlzICglZClcbiIsIFByaXZhdGVLZXlMZW5ndGgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgaWYgKCpQdWJsaWNLZXlMZW5ndGggPCBQVmFsdWVMZW5ndGgpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJESF9QdWJsaWNLZXlfR2VuZXJhdGU6IHB1YmxpYyBrZXkgbGVuZ3RoKCVkKSBtdXN0IGJlIGxhcmdlIG9yIGVxdWFsIHRoYW4gUCBsZW5ndGgoJWQpXG4iLAotICAgICAgICAgICAgKlB1YmxpY0tleUxlbmd0aCwgUFZhbHVlTGVuZ3RoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIGlmICghKFBWYWx1ZVtQVmFsdWVMZW5ndGggLSAxXSAmIDB4MSkpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJESF9QdWJsaWNLZXlfR2VuZXJhdGU6IFAgdmFsdWUgbXVzdCBiZSBvZGRcbiIpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAvKgotICAgICAqIDIuIFRyYW5zZmVyIHBhcmFtZXRlcnMgdG8gQmlnSW50ZWdlciBzdHJ1Y3R1cmUKLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyX0luaXQoJnBCSV9HKTsKLSAgICBCaWdJbnRlZ2VyX0luaXQoJnBCSV9QKTsKLSAgICBCaWdJbnRlZ2VyX0luaXQoJnBCSV9Qcml2YXRlS2V5KTsKLSAgICBCaWdJbnRlZ2VyX0luaXQoJnBCSV9QdWJsaWNLZXkpOwotICAgIEJpZ0ludGVnZXJfQmluMkJJKEdWYWx1ZSwgR1ZhbHVlTGVuZ3RoLCAmcEJJX0cpOwotICAgIEJpZ0ludGVnZXJfQmluMkJJKFBWYWx1ZSwgUFZhbHVlTGVuZ3RoLCAmcEJJX1ApOwotICAgIEJpZ0ludGVnZXJfQmluMkJJKFByaXZhdGVLZXksIFByaXZhdGVLZXlMZW5ndGgsICZwQklfUHJpdmF0ZUtleSk7Ci0KLSAgICAvKgotICAgICAqIDMuIENhbGN1bGF0ZSBQdWJsaWNLZXkgPSBHXlByaXZhdGVLZXkgKG1vZCBQKQotICAgICAqICAgIC0gQmlnSW50ZWdlciBPcGVyYXRpb24KLSAgICAgKiAgICAtIE1vbnRnb21lcnkgcmVkdWN0aW9uCi0gICAgICovCi0gICAgQmlnSW50ZWdlcl9Nb250Z29tZXJ5X0V4cE1vZChwQklfRywgcEJJX1ByaXZhdGVLZXksIHBCSV9QLCAmcEJJX1B1YmxpY0tleSk7Ci0KLSAgICAvKgotICAgICAqIDQuIFRyYW5zZmVyIEJpZ0ludGVnZXIgc3RydWN0dXJlIHRvIGNoYXIgYXJyYXkKLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyX0JJMkJpbihwQklfUHVibGljS2V5LCBQdWJsaWNLZXksIFB1YmxpY0tleUxlbmd0aCk7Ci0KLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9HKTsKLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9QKTsKLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9Qcml2YXRlS2V5KTsKLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9QdWJsaWNLZXkpOwotfSAvKiBFbmQgb2YgREhfUHVibGljS2V5X0dlbmVyYXRlICovCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBEaWZmaWUtSGVsbG1hbiBzZWNyZXQga2V5IGdlbmVyYXRpb24KLQotQXJndW1lbnRzOgotICAgIFB1YmxpY0tleSAgICAgICAgUHVibGljIGtleQotICAgIFB1YmxpY0tleUxlbmd0aCAgVGhlIGxlbmd0aCBvZiBQdWJsaWMga2V5IGluIGJ5dGVzCi0gICAgUFZhbHVlICAgICAgICAgICBBcnJheSBpbiBVSU5UOAotICAgIFBWYWx1ZUxlbmd0aCAgICAgVGhlIGxlbmd0aCBvZiBQIGluIGJ5dGVzCi0gICAgUHJpdmF0ZUtleSAgICAgICBQcml2YXRlIGtleQotICAgIFByaXZhdGVLZXlMZW5ndGggVGhlIGxlbmd0aCBvZiBQcml2YXRlIGtleSBpbiBieXRlcwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgU2VjcmV0S2V5ICAgICAgICBTZWNyZXQga2V5Ci0gICAgU2VjcmV0S2V5TGVuZ3RoICBUaGUgbGVuZ3RoIG9mIHNlY3JldCBrZXkgaW4gYnl0ZXMKLQotTm90ZToKLSAgICBSZWZlcmVuY2UgdG8gUkZDMjYzMQotICAgIFNlY3JldEtleSA9IFB1YmxpY0tleV5Qcml2YXRlS2V5IChtb2QgUCkKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXZvaWQgREhfU2VjcmV0S2V5X0dlbmVyYXRlICgKLSAgICBJTiBVSU5UOCBQdWJsaWNLZXlbXSwKLSAgICBJTiBVSU5UIFB1YmxpY0tleUxlbmd0aCwKLSAgICBJTiBVSU5UOCBQVmFsdWVbXSwKLSAgICBJTiBVSU5UIFBWYWx1ZUxlbmd0aCwKLSAgICBJTiBVSU5UOCBQcml2YXRlS2V5W10sCi0gICAgSU4gVUlOVCBQcml2YXRlS2V5TGVuZ3RoLAotICAgIE9VVCBVSU5UOCBTZWNyZXRLZXlbXSwKLSAgICBJTk9VVCBVSU5UICpTZWNyZXRLZXlMZW5ndGgpCi17Ci0gICAgUEJJR19JTlRFR0VSIHBCSV9QID0gTlVMTDsKLSAgICBQQklHX0lOVEVHRVIgcEJJX1NlY3JldEtleSA9IE5VTEw7Ci0gICAgUEJJR19JTlRFR0VSIHBCSV9Qcml2YXRlS2V5ID0gTlVMTDsKLSAgICBQQklHX0lOVEVHRVIgcEJJX1B1YmxpY0tleSA9IE5VTEw7Ci0KLSAgICAvKgotICAgICAqIDEuIENoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgICogICAgLSBQdWJsaWNLZXlMZW5ndGgsIFBWYWx1ZUxlbmd0aCBhbmQgUHJpdmF0ZUxlbmd0aCBtdXN0IGJlIGxhcmdlIHRoYW4gemVybwotICAgICAqICAgIC0gU2VjcmV0S2V5TGVuZ3RoIG11c3QgYmUgbGFyZ2Ugb3IgZXF1YWwgdGhhbiBQVmFsdWVMZW5ndGgKLSAgICAgKiAgICAtIFBWYWx1ZSBtdXN0IGJlIG9kZAotICAgICAqCi0gICAgICogICAgLSBQVmFsdWUgbXVzdCBiZSBwcmltZSBudW1iZXIgKG5vIGltcGxlbWVudCkKLSAgICAgKi8KLSAgICBpZiAoUHVibGljS2V5TGVuZ3RoID09IDApIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJESF9TZWNyZXRLZXlfR2VuZXJhdGU6IHB1YmxpYyBrZXkgbGVuZ3RoIGlzICglZClcbiIsIFB1YmxpY0tleUxlbmd0aCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAoUFZhbHVlTGVuZ3RoID09IDApIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJESF9TZWNyZXRLZXlfR2VuZXJhdGU6IFAgbGVuZ3RoIGlzICglZClcbiIsIFBWYWx1ZUxlbmd0aCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAoUHJpdmF0ZUtleUxlbmd0aCA9PSAwKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiREhfU2VjcmV0S2V5X0dlbmVyYXRlOiBwcml2YXRlIGtleSBsZW5ndGggaXMgKCVkKVxuIiwgUHJpdmF0ZUtleUxlbmd0aCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAoKlNlY3JldEtleUxlbmd0aCA8IFBWYWx1ZUxlbmd0aCkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkRIX1NlY3JldEtleV9HZW5lcmF0ZTogc2VjcmV0IGtleSBsZW5ndGgoJWQpIG11c3QgYmUgbGFyZ2Ugb3IgZXF1YWwgdGhhbiBQIGxlbmd0aCglZClcbiIsCi0gICAgICAgICAgICAqU2VjcmV0S2V5TGVuZ3RoLCBQVmFsdWVMZW5ndGgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgaWYgKCEoUFZhbHVlW1BWYWx1ZUxlbmd0aCAtIDFdICYgMHgxKSkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkRIX1NlY3JldEtleV9HZW5lcmF0ZTogUCB2YWx1ZSBtdXN0IGJlIG9kZFxuIikpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qCi0gICAgICogMi4gVHJhbnNmZXIgcGFyYW1ldGVycyB0byBCaWdJbnRlZ2VyIHN0cnVjdHVyZQotICAgICAqLwotICAgIEJpZ0ludGVnZXJfSW5pdCgmcEJJX1ApOwotICAgIEJpZ0ludGVnZXJfSW5pdCgmcEJJX1ByaXZhdGVLZXkpOwotICAgIEJpZ0ludGVnZXJfSW5pdCgmcEJJX1B1YmxpY0tleSk7Ci0gICAgQmlnSW50ZWdlcl9Jbml0KCZwQklfU2VjcmV0S2V5KTsKLQotICAgIEJpZ0ludGVnZXJfQmluMkJJKFB1YmxpY0tleSwgUHVibGljS2V5TGVuZ3RoLCAmcEJJX1B1YmxpY0tleSk7Ci0gICAgQmlnSW50ZWdlcl9CaW4yQkkoUFZhbHVlLCBQVmFsdWVMZW5ndGgsICZwQklfUCk7Ci0gICAgQmlnSW50ZWdlcl9CaW4yQkkoUHJpdmF0ZUtleSwgUHJpdmF0ZUtleUxlbmd0aCwgJnBCSV9Qcml2YXRlS2V5KTsKLQotICAgIC8qCi0gICAgICogMy4gQ2FsY3VsYXRlIFNlY3JldEtleSA9IFB1YmxpY0tleV5Qcml2YXRlS2V5IChtb2QgUCkKLSAgICAgKiAgICAtIEJpZ0ludGVnZXIgT3BlcmF0aW9uCi0gICAgICogICAgLSBNb250Z29tZXJ5IHJlZHVjdGlvbgotICAgICAqLwotICAgIEJpZ0ludGVnZXJfTW9udGdvbWVyeV9FeHBNb2QocEJJX1B1YmxpY0tleSwgcEJJX1ByaXZhdGVLZXksIHBCSV9QLCAmcEJJX1NlY3JldEtleSk7Ci0KLSAgICAvKgotICAgICAqIDQuIFRyYW5zZmVyIEJpZ0ludGVnZXIgc3RydWN0dXJlIHRvIGNoYXIgYXJyYXkKLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyX0JJMkJpbihwQklfU2VjcmV0S2V5LCBTZWNyZXRLZXksIFNlY3JldEtleUxlbmd0aCk7Ci0KLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9QKTsKLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9Qcml2YXRlS2V5KTsKLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9QdWJsaWNLZXkpOwotICAgIEJpZ0ludGVnZXJfRnJlZSgmcEJJX1NlY3JldEtleSk7Ci19IC8qIEVuZCBvZiBESF9TZWNyZXRLZXlfR2VuZXJhdGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X2htYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X2htYWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4NTQwOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9obWFjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiLi4vY3J5cHRfaG1hYy5oIgotCi0KLSNpZmRlZiBITUFDX1NIQTFfU1VQUE9SVAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBITUFDIHVzaW5nIFNIQTEgaGFzaCBmdW5jdGlvbgotCi1Bcmd1bWVudHM6Ci0gICAga2V5ICAgICAgICAgICAgIFNlY3JldCBrZXkKLSAgICBrZXlfbGVuICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUga2V5IGluIGJ5dGVzCi0gICAgbWVzc2FnZSAgICAgICAgIE1lc3NhZ2UgY29udGV4dAotICAgIG1lc3NhZ2VfbGVuICAgICBUaGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gYnl0ZXMKLSAgICBtYWNMZW4gICAgICAgICAgUmVxdWVzdCB0aGUgbGVuZ3RoIG9mIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZQotCi1SZXR1cm4gVmFsdWU6Ci0gICAgbWFjICAgICAgICAgICAgIE1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgSE1BQ19TSEExICgKLSAgICBJTiAgY29uc3QgVUlOVDggS2V5W10sCi0gICAgSU4gIFVJTlQgS2V5TGVuLAotICAgIElOICBjb25zdCBVSU5UOCBNZXNzYWdlW10sCi0gICAgSU4gIFVJTlQgTWVzc2FnZUxlbiwKLSAgICBPVVQgVUlOVDggTUFDW10sCi0gICAgSU4gIFVJTlQgTUFDTGVuKQotewotICAgIFNIQTFfQ1RYX1NUUlVDIHNoYV9jdHgxOwotICAgIFNIQTFfQ1RYX1NUUlVDIHNoYV9jdHgyOwotICAgIFVJTlQ4IEswW1NIQTFfQkxPQ0tfU0laRV07Ci0gICAgVUlOVDggRGlnZXN0W1NIQTFfRElHRVNUX1NJWkVdOwotICAgIFVJTlQgaW5kZXg7Ci0KLSAgICBOZGlzWmVyb01lbW9yeSgmc2hhX2N0eDEsIHNpemVvZihTSEExX0NUWF9TVFJVQykpOwotICAgIE5kaXNaZXJvTWVtb3J5KCZzaGFfY3R4Miwgc2l6ZW9mKFNIQTFfQ1RYX1NUUlVDKSk7Ci0gICAgLyoKLSAgICAgKiBJZiB0aGUgbGVuZ3RoIG9mIEsgPSBCKEJsb2NrIHNpemUpOiBLMCA9IEsuCi0gICAgICogSWYgdGhlIGxlbmd0aCBvZiBLID4gQjogaGFzaCBLIHRvIG9idGFpbiBhbiBMIGJ5dGUgc3RyaW5nLAotICAgICAqIHRoZW4gYXBwZW5kIChCLUwpIHplcm9zIHRvIGNyZWF0ZSBhIEItYnl0ZSBzdHJpbmcgSzAgKGkuZS4sIEswID0gSChLKSB8fCAwMC4uLjAwKS4KLSAgICAgKiBJZiB0aGUgbGVuZ3RoIG9mIEsgPCBCOiBhcHBlbmQgemVyb3MgdG8gdGhlIGVuZCBvZiBLIHRvIGNyZWF0ZSBhIEItYnl0ZSBzdHJpbmcgSzAKLSAgICAgKi8KLSAgICBOZGlzWmVyb01lbW9yeShLMCwgU0hBMV9CTE9DS19TSVpFKTsKLSAgICBpZiAoS2V5TGVuIDw9IFNIQTFfQkxPQ0tfU0laRSkKLSAgICAgICAgTmRpc01vdmVNZW1vcnkoSzAsIEtleSwgS2V5TGVuKTsKLSAgICBlbHNlCi0gICAgICAgIFJUX1NIQTEoS2V5LCBLZXlMZW4sIEswKTsKLSAgICAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qIEV4Y2x1c2l2ZS1PciBLMCB3aXRoIGlwYWQgKi8KLSAgICAvKiBpcGFkOiBJbm5lciBwYWQ7IHRoZSBieXRlIHjvv73vv70zNu+/ve+/vSByZXBlYXRlZCBCIHRpbWVzLiAqLwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNIQTFfQkxPQ0tfU0laRTsgaW5kZXgrKykKLSAgICAgICAgSzBbaW5kZXhdIF49IDB4MzY7Ci0gICAgICAgIC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIFNIQTFfSW5pdCgmc2hhX2N0eDEpOwotICAgIC8qIEgoSzBeaXBhZCkgKi8KLSAgICBTSEExX0FwcGVuZCgmc2hhX2N0eDEsIEswLCBzaXplb2YoSzApKTsKLSAgICAvKiBIKChLMF5pcGFkKXx8dGV4dCkgKi8KLSAgICBTSEExX0FwcGVuZCgmc2hhX2N0eDEsIE1lc3NhZ2UsIE1lc3NhZ2VMZW4pOwotICAgIFNIQTFfRW5kKCZzaGFfY3R4MSwgRGlnZXN0KTsKLQotICAgIC8qIEV4Y2x1c2l2ZS1PciBLMCB3aXRoIG9wYWQgYW5kIHJlbW92ZSBpcGFkICovCi0gICAgLyogb3BhZDogT3V0ZXIgcGFkOyB0aGUgYnl0ZSB477+977+9NWPvv73vv70gcmVwZWF0ZWQgQiB0aW1lcy4gKi8KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTSEExX0JMT0NLX1NJWkU7IGluZGV4KyspCi0gICAgICAgIEswW2luZGV4XSBePSAweDM2XjB4NWM7Ci0gICAgICAgIC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIFNIQTFfSW5pdCgmc2hhX2N0eDIpOwotICAgIC8qIEgoSzBeb3BhZCkgKi8KLSAgICBTSEExX0FwcGVuZCgmc2hhX2N0eDIsIEswLCBzaXplb2YoSzApKTsKLSAgICAvKiBIKCAoSzBeb3BhZCkgfHwgSCgoSzBeaXBhZCl8fHRleHQpICkgKi8KLSAgICBTSEExX0FwcGVuZCgmc2hhX2N0eDIsIERpZ2VzdCwgU0hBMV9ESUdFU1RfU0laRSk7Ci0gICAgU0hBMV9FbmQoJnNoYV9jdHgyLCBEaWdlc3QpOwotCi0gICAgaWYgKE1BQ0xlbiA+IFNIQTFfRElHRVNUX1NJWkUpCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KE1BQywgRGlnZXN0LCBTSEExX0RJR0VTVF9TSVpFKTsKLSAgICBlbHNlCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KE1BQywgRGlnZXN0LCBNQUNMZW4pOwotfSAvKiBFbmQgb2YgSE1BQ19TSEExICovCi0jZW5kaWYgLyogSE1BQ19TSEExX1NVUFBPUlQgKi8KLQotCi0jaWZkZWYgSE1BQ19TSEEyNTZfU1VQUE9SVAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBITUFDIHVzaW5nIFNIQTI1NiBoYXNoIGZ1bmN0aW9uCi0KLUFyZ3VtZW50czoKLSAgICBrZXkgICAgICAgICAgICAgU2VjcmV0IGtleQotICAgIGtleV9sZW4gICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBrZXkgaW4gYnl0ZXMKLSAgICBtZXNzYWdlICAgICAgICAgTWVzc2FnZSBjb250ZXh0Ci0gICAgbWVzc2FnZV9sZW4gICAgIFRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiBieXRlcwotICAgIG1hY0xlbiAgICAgICAgICBSZXF1ZXN0IHRoZSBsZW5ndGggb2YgbWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlCi0KLVJldHVybiBWYWx1ZToKLSAgICBtYWMgICAgICAgICAgICAgTWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlCi0KLU5vdGU6Ci0gICAgTm9uZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBITUFDX1NIQTI1NiAoCi0gICAgSU4gIGNvbnN0IFVJTlQ4IEtleVtdLAotICAgIElOICBVSU5UIEtleUxlbiwKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4sCi0gICAgT1VUIFVJTlQ4IE1BQ1tdLAotICAgIElOICBVSU5UIE1BQ0xlbikKLXsKLSAgICBTSEEyNTZfQ1RYX1NUUlVDIHNoYV9jdHgxOwotICAgIFNIQTI1Nl9DVFhfU1RSVUMgc2hhX2N0eDI7Ci0gICAgVUlOVDggSzBbU0hBMjU2X0JMT0NLX1NJWkVdOwotICAgIFVJTlQ4IERpZ2VzdFtTSEEyNTZfRElHRVNUX1NJWkVdOwotICAgIFVJTlQgaW5kZXg7Ci0KLSAgICBOZGlzWmVyb01lbW9yeSgmc2hhX2N0eDEsIHNpemVvZihTSEEyNTZfQ1RYX1NUUlVDKSk7Ci0gICAgTmRpc1plcm9NZW1vcnkoJnNoYV9jdHgyLCBzaXplb2YoU0hBMjU2X0NUWF9TVFJVQykpOwotICAgIC8qCi0gICAgICogSWYgdGhlIGxlbmd0aCBvZiBLID0gQihCbG9jayBzaXplKTogSzAgPSBLLgotICAgICAqIElmIHRoZSBsZW5ndGggb2YgSyA+IEI6IGhhc2ggSyB0byBvYnRhaW4gYW4gTCBieXRlIHN0cmluZywKLSAgICAgKiB0aGVuIGFwcGVuZCAoQi1MKSB6ZXJvcyB0byBjcmVhdGUgYSBCLWJ5dGUgc3RyaW5nIEswIChpLmUuLCBLMCA9IEgoSykgfHwgMDAuLi4wMCkuCi0gICAgICogSWYgdGhlIGxlbmd0aCBvZiBLIDwgQjogYXBwZW5kIHplcm9zIHRvIHRoZSBlbmQgb2YgSyB0byBjcmVhdGUgYSBCLWJ5dGUgc3RyaW5nIEswCi0gICAgICovCi0gICAgTmRpc1plcm9NZW1vcnkoSzAsIFNIQTI1Nl9CTE9DS19TSVpFKTsKLSAgICBpZiAoS2V5TGVuIDw9IFNIQTI1Nl9CTE9DS19TSVpFKSB7Ci0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KEswLCBLZXksIEtleUxlbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgUlRfU0hBMjU2KEtleSwgS2V5TGVuLCBLMCk7Ci0gICAgfQotCi0gICAgLyogRXhjbHVzaXZlLU9yIEswIHdpdGggaXBhZCAqLwotICAgIC8qIGlwYWQ6IElubmVyIHBhZDsgdGhlIGJ5dGUgeO+/ve+/vTM277+977+9IHJlcGVhdGVkIEIgdGltZXMuICovCi0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0hBMjU2X0JMT0NLX1NJWkU7IGluZGV4KyspCi0gICAgICAgIEswW2luZGV4XSBePSAweDM2OwotICAgICAgICAvKiBFbmQgb2YgZm9yICovCi0KLSAgICBTSEEyNTZfSW5pdCgmc2hhX2N0eDEpOwotICAgIC8qIEgoSzBeaXBhZCkgKi8KLSAgICBTSEEyNTZfQXBwZW5kKCZzaGFfY3R4MSwgSzAsIHNpemVvZihLMCkpOwotICAgIC8qIEgoKEswXmlwYWQpfHx0ZXh0KSAqLwotICAgIFNIQTI1Nl9BcHBlbmQoJnNoYV9jdHgxLCBNZXNzYWdlLCBNZXNzYWdlTGVuKTsKLSAgICBTSEEyNTZfRW5kKCZzaGFfY3R4MSwgRGlnZXN0KTsKLQotICAgIC8qIEV4Y2x1c2l2ZS1PciBLMCB3aXRoIG9wYWQgYW5kIHJlbW92ZSBpcGFkICovCi0gICAgLyogb3BhZDogT3V0ZXIgcGFkOyB0aGUgYnl0ZSB477+977+9NWPvv73vv70gcmVwZWF0ZWQgQiB0aW1lcy4gKi8KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTSEEyNTZfQkxPQ0tfU0laRTsgaW5kZXgrKykKLSAgICAgICAgSzBbaW5kZXhdIF49IDB4MzZeMHg1YzsKLSAgICAgICAgLyogRW5kIG9mIGZvciAqLwotCi0gICAgU0hBMjU2X0luaXQoJnNoYV9jdHgyKTsKLSAgICAvKiBIKEswXm9wYWQpICovCi0gICAgU0hBMjU2X0FwcGVuZCgmc2hhX2N0eDIsIEswLCBzaXplb2YoSzApKTsKLSAgICAvKiBIKCAoSzBeb3BhZCkgfHwgSCgoSzBeaXBhZCl8fHRleHQpICkgKi8KLSAgICBTSEEyNTZfQXBwZW5kKCZzaGFfY3R4MiwgRGlnZXN0LCBTSEEyNTZfRElHRVNUX1NJWkUpOwotICAgIFNIQTI1Nl9FbmQoJnNoYV9jdHgyLCBEaWdlc3QpOwotCi0gICAgaWYgKE1BQ0xlbiA+IFNIQTI1Nl9ESUdFU1RfU0laRSkKLSAgICAgICAgTmRpc01vdmVNZW1vcnkoTUFDLCBEaWdlc3QsU0hBMjU2X0RJR0VTVF9TSVpFKTsKLSAgICBlbHNlCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KE1BQywgRGlnZXN0LCBNQUNMZW4pOwotCi19IC8qIEVuZCBvZiBITUFDX1NIQTI1NiAqLwotI2VuZGlmIC8qIEhNQUNfU0hBMjU2X1NVUFBPUlQgKi8KLQotCi0jaWZkZWYgSE1BQ19NRDVfU1VQUE9SVAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBITUFDIHVzaW5nIE1ENSBoYXNoIGZ1bmN0aW9uCi0KLUFyZ3VtZW50czoKLSAgICBrZXkgICAgICAgICAgICAgU2VjcmV0IGtleQotICAgIGtleV9sZW4gICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBrZXkgaW4gYnl0ZXMKLSAgICBtZXNzYWdlICAgICAgICAgTWVzc2FnZSBjb250ZXh0Ci0gICAgbWVzc2FnZV9sZW4gICAgIFRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiBieXRlcwotICAgIG1hY0xlbiAgICAgICAgICBSZXF1ZXN0IHRoZSBsZW5ndGggb2YgbWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlCi0KLVJldHVybiBWYWx1ZToKLSAgICBtYWMgICAgICAgICAgICAgTWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlCi0KLU5vdGU6Ci0gICAgTm9uZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBITUFDX01ENSgKLSAgICBJTiAgY29uc3QgVUlOVDggS2V5W10sCi0gICAgSU4gIFVJTlQgS2V5TGVuLAotICAgIElOICBjb25zdCBVSU5UOCBNZXNzYWdlW10sCi0gICAgSU4gIFVJTlQgTWVzc2FnZUxlbiwKLSAgICBPVVQgVUlOVDggTUFDW10sCi0gICAgSU4gIFVJTlQgTUFDTGVuKQotewotICAgIE1ENV9DVFhfU1RSVUMgbWQ1X2N0eDE7Ci0gICAgTUQ1X0NUWF9TVFJVQyBtZDVfY3R4MjsKLSAgICBVSU5UOCBLMFtNRDVfQkxPQ0tfU0laRV07Ci0gICAgVUlOVDggRGlnZXN0W01ENV9ESUdFU1RfU0laRV07Ci0gICAgVUlOVCBpbmRleDsKLQotICAgIE5kaXNaZXJvTWVtb3J5KCZtZDVfY3R4MSwgc2l6ZW9mKE1ENV9DVFhfU1RSVUMpKTsKLSAgICBOZGlzWmVyb01lbW9yeSgmbWQ1X2N0eDIsIHNpemVvZihNRDVfQ1RYX1NUUlVDKSk7Ci0gICAgLyoKLSAgICAgKiBJZiB0aGUgbGVuZ3RoIG9mIEsgPSBCKEJsb2NrIHNpemUpOiBLMCA9IEsuCi0gICAgICogSWYgdGhlIGxlbmd0aCBvZiBLID4gQjogaGFzaCBLIHRvIG9idGFpbiBhbiBMIGJ5dGUgc3RyaW5nLAotICAgICAqIHRoZW4gYXBwZW5kIChCLUwpIHplcm9zIHRvIGNyZWF0ZSBhIEItYnl0ZSBzdHJpbmcgSzAgKGkuZS4sIEswID0gSChLKSB8fCAwMC4uLjAwKS4KLSAgICAgKiBJZiB0aGUgbGVuZ3RoIG9mIEsgPCBCOiBhcHBlbmQgemVyb3MgdG8gdGhlIGVuZCBvZiBLIHRvIGNyZWF0ZSBhIEItYnl0ZSBzdHJpbmcgSzAKLSAgICAgKi8KLSAgICBOZGlzWmVyb01lbW9yeShLMCwgTUQ1X0JMT0NLX1NJWkUpOwotICAgIGlmIChLZXlMZW4gPD0gTUQ1X0JMT0NLX1NJWkUpIHsKLSAgICAgICAgTmRpc01vdmVNZW1vcnkoSzAsIEtleSwgS2V5TGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgICBSVF9NRDUoS2V5LCBLZXlMZW4sIEswKTsKLSAgICB9Ci0KLSAgICAvKiBFeGNsdXNpdmUtT3IgSzAgd2l0aCBpcGFkICovCi0gICAgLyogaXBhZDogSW5uZXIgcGFkOyB0aGUgYnl0ZSB477+977+9Mzbvv73vv70gcmVwZWF0ZWQgQiB0aW1lcy4gKi8KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNRDVfQkxPQ0tfU0laRTsgaW5kZXgrKykKLSAgICAgICAgSzBbaW5kZXhdIF49IDB4MzY7Ci0gICAgICAgIC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIE1ENV9Jbml0KCZtZDVfY3R4MSk7Ci0gICAgLyogSChLMF5pcGFkKSAqLwotICAgIE1ENV9BcHBlbmQoJm1kNV9jdHgxLCBLMCwgc2l6ZW9mKEswKSk7Ci0gICAgLyogSCgoSzBeaXBhZCl8fHRleHQpICovCi0gICAgTUQ1X0FwcGVuZCgmbWQ1X2N0eDEsIE1lc3NhZ2UsIE1lc3NhZ2VMZW4pOwotICAgIE1ENV9FbmQoJm1kNV9jdHgxLCBEaWdlc3QpOwotCi0gICAgLyogRXhjbHVzaXZlLU9yIEswIHdpdGggb3BhZCBhbmQgcmVtb3ZlIGlwYWQgKi8KLSAgICAvKiBvcGFkOiBPdXRlciBwYWQ7IHRoZSBieXRlIHjvv73vv701Y++/ve+/vSByZXBlYXRlZCBCIHRpbWVzLiAqLwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1ENV9CTE9DS19TSVpFOyBpbmRleCsrKQotICAgICAgICBLMFtpbmRleF0gXj0gMHgzNl4weDVjOwotICAgICAgICAvKiBFbmQgb2YgZm9yICovCi0KLSAgICBNRDVfSW5pdCgmbWQ1X2N0eDIpOwotICAgIC8qIEgoSzBeb3BhZCkgKi8KLSAgICBNRDVfQXBwZW5kKCZtZDVfY3R4MiwgSzAsIHNpemVvZihLMCkpOwotICAgIC8qIEgoIChLMF5vcGFkKSB8fCBIKChLMF5pcGFkKXx8dGV4dCkgKSAqLwotICAgIE1ENV9BcHBlbmQoJm1kNV9jdHgyLCBEaWdlc3QsIE1ENV9ESUdFU1RfU0laRSk7Ci0gICAgTUQ1X0VuZCgmbWQ1X2N0eDIsIERpZ2VzdCk7Ci0KLSAgICBpZiAoTUFDTGVuID4gTUQ1X0RJR0VTVF9TSVpFKQotICAgICAgICBOZGlzTW92ZU1lbW9yeShNQUMsIERpZ2VzdCwgTUQ1X0RJR0VTVF9TSVpFKTsKLSAgICBlbHNlCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KE1BQywgRGlnZXN0LCBNQUNMZW4pOwotfSAvKiBFbmQgb2YgSE1BQ19TSEEyNTYgKi8KLSNlbmRpZiAvKiBITUFDX01ENV9TVVBQT1JUICovCi0KLS8qIEVuZCBvZiBjcnlwdF9obWFjLmMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X21kNS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY3J5cHRfbWQ1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOTMyNjUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY3J5cHRfbWQ1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiLi4vY3J5cHRfbWQ1LmgiCi0KLQotI2lmZGVmIE1ENV9TVVBQT1JUCi0vKgotICogRiwgRywgSCBhbmQgSSBhcmUgYmFzaWMgTUQ1IGZ1bmN0aW9ucy4KLSAqLwotI2RlZmluZSBGKHgsIHksIHopICgoKHgpICYgKHkpKSB8ICgofngpICYgKHopKSkKLSNkZWZpbmUgRyh4LCB5LCB6KSAoKCh4KSAmICh6KSkgfCAoKHkpICYgKH56KSkpCi0jZGVmaW5lIEgoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKLSNkZWZpbmUgSSh4LCB5LCB6KSAoKHkpIF4gKCh4KSB8ICh+eikpKQotCi0jZGVmaW5lIFJPVEwoeCxuLHcpICgoeCA8PCBuKSB8ICh4ID4+ICh3IC0gbikpKQotI2RlZmluZSBST1RMMzIoeCxuKSBST1RMKHgsbiwzMikgLyogMzIgYml0cyB3b3JkICovCi0KLSNkZWZpbmUgUk9VTkQxKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7ICAgICAgICAgIFwKLSAgICAoYSkgKz0gRigoYiksKGMpLChkKSkgKyAoeCkgKyAoVUlOVDMyKShhYyk7IFwKLSAgICAoYSkgID0gUk9UTDMyKChhKSwocykpOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoYSkgKz0gKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLSNkZWZpbmUgUk9VTkQyKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7ICAgICAgICAgIFwKLSAgICAoYSkgKz0gRygoYiksKGMpLChkKSkgKyAoeCkgKyAoVUlOVDMyKShhYyk7IFwKLSAgICAoYSkgID0gUk9UTDMyKChhKSwocykpOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoYSkgKz0gKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLSNkZWZpbmUgUk9VTkQzKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7ICAgICAgICAgIFwKLSAgICAoYSkgKz0gSCgoYiksKGMpLChkKSkgKyAoeCkgKyAoVUlOVDMyKShhYyk7IFwKLSAgICAoYSkgID0gUk9UTDMyKChhKSwocykpOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoYSkgKz0gKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLSNkZWZpbmUgUk9VTkQ0KGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7ICAgICAgICAgIFwKLSAgICAoYSkgKz0gSSgoYiksKGMpLChkKSkgKyAoeCkgKyAoVUlOVDMyKShhYyk7IFwKLSAgICAoYSkgID0gUk9UTDMyKChhKSwocykpOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoYSkgKz0gKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLXN0YXRpYyBjb25zdCBVSU5UMzIgTUQ1X0RlZmF1bHRIYXNoVmFsdWVbNF0gPSB7Ci0gICAgMHg2NzQ1MjMwMVVMLCAweGVmY2RhYjg5VUwsIDB4OThiYWRjZmVVTCwgMHgxMDMyNTQ3NlVMCi19OwotI2VuZGlmIC8qIE1ENV9TVVBQT1JUICovCi0KLQotI2lmZGVmIE1ENV9TVVBQT1JUCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEluaXRpYWwgTWQ1X0NUWF9TVFJVQwotCi1Bcmd1bWVudHM6Ci0gICAgcE1ENV9DVFggICAgICAgIFBvaW50ZXIgdG8gTWQ1X0NUWF9TVFJVQwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTm9uZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgTUQ1X0luaXQgKAotICAgIElOICBNRDVfQ1RYX1NUUlVDICpwTUQ1X0NUWCkKLXsKLSAgICBOZGlzTW92ZU1lbW9yeShwTUQ1X0NUWC0+SGFzaFZhbHVlLCBNRDVfRGVmYXVsdEhhc2hWYWx1ZSwKLSAgICAgICAgc2l6ZW9mKE1ENV9EZWZhdWx0SGFzaFZhbHVlKSk7Ci0gICAgTmRpc1plcm9NZW1vcnkocE1ENV9DVFgtPkJsb2NrLCBNRDVfQkxPQ0tfU0laRSk7Ci0gICAgcE1ENV9DVFgtPkJsb2NrTGVuICAgPSAwOwotICAgIHBNRDVfQ1RYLT5NZXNzYWdlTGVuID0gMDsKLX0gLyogRW5kIG9mIE1ENV9Jbml0ICovCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBNRDUgY29tcHV0YXRpb24gZm9yIG9uZSBibG9jayAoNTEyIGJpdHMpCi0KLUFyZ3VtZW50czoKLSAgICBwTUQ1X0NUWCAgICAgICAgUG9pbnRlciB0byBNZDVfQ1RYX1NUUlVDCi0KLVJldHVybiBWYWx1ZToKLSAgICBOb25lCi0KLU5vdGU6Ci0gICAgVFtpXSA6PSBmbG9vcihhYnMoc2luKGkgKyAxKSkgKiAoMiBwb3cgMzIpKSwgaSBpcyBudW1iZXIgb2Ygcm91bmQKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgTUQ1X0hhc2ggKAotICAgIElOICBNRDVfQ1RYX1NUUlVDICpwTUQ1X0NUWCkKLXsKLSAgICBVSU5UMzIgWF9pOwotICAgIFVJTlQzMiBYWzE2XTsKLSAgICBVSU5UMzIgYSxiLGMsZDsKLQotICAgIC8qIFByZXBhcmUgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUsIHtYX2l9ICovCi0gICAgTmRpc01vdmVNZW1vcnkoWCwgcE1ENV9DVFgtPkJsb2NrLCBNRDVfQkxPQ0tfU0laRSk7Ci0gICAgZm9yIChYX2kgPSAwOyBYX2kgPCAxNjsgWF9pKyspCi0gICAgICAgIFhbWF9pXSA9IGNwdTJsZTMyKFhbWF9pXSk7IC8qIEVuZGlhbiBTd2FwICovCi0gICAgICAgIC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIC8qIE1ENSBoYXNoIGNvbXB1dGF0aW9uICovCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgd29ya2luZyB2YXJpYWJsZXMgKi8KLSAgICBhID0gcE1ENV9DVFgtPkhhc2hWYWx1ZVswXTsKLSAgICBiID0gcE1ENV9DVFgtPkhhc2hWYWx1ZVsxXTsKLSAgICBjID0gcE1ENV9DVFgtPkhhc2hWYWx1ZVsyXTsKLSAgICBkID0gcE1ENV9DVFgtPkhhc2hWYWx1ZVszXTsKLQotICAgIC8qCi0gICAgICogIFJvdW5kIDEKLSAgICAgKiAgTGV0IFthYmNkIGsgcyBpXSBkZW5vdGUgdGhlIG9wZXJhdGlvbgotICAgICAqICBhID0gYiArICgoYSArIEYoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKQotICAgICAqLwotICAgIFJPVU5EMShhLCBiLCBjLCBkLCBYWyAwXSwgIDcsIDB4ZDc2YWE0NzgpOyAvKiAxICovCi0gICAgUk9VTkQxKGQsIGEsIGIsIGMsIFhbIDFdLCAxMiwgMHhlOGM3Yjc1Nik7IC8qIDIgKi8KLSAgICBST1VORDEoYywgZCwgYSwgYiwgWFsgMl0sIDE3LCAweDI0MjA3MGRiKTsgLyogMyAqLwotICAgIFJPVU5EMShiLCBjLCBkLCBhLCBYWyAzXSwgMjIsIDB4YzFiZGNlZWUpOyAvKiA0ICovCi0gICAgUk9VTkQxKGEsIGIsIGMsIGQsIFhbIDRdLCAgNywgMHhmNTdjMGZhZik7IC8qIDUgKi8KLSAgICBST1VORDEoZCwgYSwgYiwgYywgWFsgNV0sIDEyLCAweDQ3ODdjNjJhKTsgLyogNiAqLwotICAgIFJPVU5EMShjLCBkLCBhLCBiLCBYWyA2XSwgMTcsIDB4YTgzMDQ2MTMpOyAvKiA3ICovCi0gICAgUk9VTkQxKGIsIGMsIGQsIGEsIFhbIDddLCAyMiwgMHhmZDQ2OTUwMSk7IC8qIDggKi8KLSAgICBST1VORDEoYSwgYiwgYywgZCwgWFsgOF0sICA3LCAweDY5ODA5OGQ4KTsgLyogOSAqLwotICAgIFJPVU5EMShkLCBhLCBiLCBjLCBYWyA5XSwgMTIsIDB4OGI0NGY3YWYpOyAvKiAxMCAqLwotICAgIFJPVU5EMShjLCBkLCBhLCBiLCBYWzEwXSwgMTcsIDB4ZmZmZjViYjEpOyAvKiAxMSAqLwotICAgIFJPVU5EMShiLCBjLCBkLCBhLCBYWzExXSwgMjIsIDB4ODk1Y2Q3YmUpOyAvKiAxMiAqLwotICAgIFJPVU5EMShhLCBiLCBjLCBkLCBYWzEyXSwgIDcsIDB4NmI5MDExMjIpOyAvKiAxMyAqLwotICAgIFJPVU5EMShkLCBhLCBiLCBjLCBYWzEzXSwgMTIsIDB4ZmQ5ODcxOTMpOyAvKiAxNCAqLwotICAgIFJPVU5EMShjLCBkLCBhLCBiLCBYWzE0XSwgMTcsIDB4YTY3OTQzOGUpOyAvKiAxNSAqLwotICAgIFJPVU5EMShiLCBjLCBkLCBhLCBYWzE1XSwgMjIsIDB4NDliNDA4MjEpOyAvKiAxNiAqLwotCi0gICAgLyoKLSAgICAgKiAgUm91bmQgMgotICAgICAqICBMZXQgW2FiY2QgayBzIGldIGRlbm90ZSB0aGUgb3BlcmF0aW9uCi0gICAgICogIGEgPSBiICsgKChhICsgRyhiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpCi0gICAgICovCi0gICAgUk9VTkQyKGEsIGIsIGMsIGQsIFhbIDFdLCAgNSwgMHhmNjFlMjU2Mik7IC8qIDE3ICovCi0gICAgUk9VTkQyKGQsIGEsIGIsIGMsIFhbIDZdLCAgOSwgMHhjMDQwYjM0MCk7IC8qIDE4ICovCi0gICAgUk9VTkQyKGMsIGQsIGEsIGIsIFhbMTFdLCAxNCwgMHgyNjVlNWE1MSk7IC8qIDE5ICovCi0gICAgUk9VTkQyKGIsIGMsIGQsIGEsIFhbIDBdLCAyMCwgMHhlOWI2YzdhYSk7IC8qIDIwICovCi0gICAgUk9VTkQyKGEsIGIsIGMsIGQsIFhbIDVdLCAgNSwgMHhkNjJmMTA1ZCk7IC8qIDIxICovCi0gICAgUk9VTkQyKGQsIGEsIGIsIGMsIFhbMTBdLCAgOSwgIDB4MjQ0MTQ1Myk7IC8qIDIyICovCi0gICAgUk9VTkQyKGMsIGQsIGEsIGIsIFhbMTVdLCAxNCwgMHhkOGExZTY4MSk7IC8qIDIzICovCi0gICAgUk9VTkQyKGIsIGMsIGQsIGEsIFhbIDRdLCAyMCwgMHhlN2QzZmJjOCk7IC8qIDI0ICovCi0gICAgUk9VTkQyKGEsIGIsIGMsIGQsIFhbIDldLCAgNSwgMHgyMWUxY2RlNik7IC8qIDI1ICovCi0gICAgUk9VTkQyKGQsIGEsIGIsIGMsIFhbMTRdLCAgOSwgMHhjMzM3MDdkNik7IC8qIDI2ICovCi0gICAgUk9VTkQyKGMsIGQsIGEsIGIsIFhbIDNdLCAxNCwgMHhmNGQ1MGQ4Nyk7IC8qIDI3ICovCi0gICAgUk9VTkQyKGIsIGMsIGQsIGEsIFhbIDhdLCAyMCwgMHg0NTVhMTRlZCk7IC8qIDI4ICovCi0gICAgUk9VTkQyKGEsIGIsIGMsIGQsIFhbMTNdLCAgNSwgMHhhOWUzZTkwNSk7IC8qIDI5ICovCi0gICAgUk9VTkQyKGQsIGEsIGIsIGMsIFhbIDJdLCAgOSwgMHhmY2VmYTNmOCk7IC8qIDMwICovCi0gICAgUk9VTkQyKGMsIGQsIGEsIGIsIFhbIDddLCAxNCwgMHg2NzZmMDJkOSk7IC8qIDMxICovCi0gICAgUk9VTkQyKGIsIGMsIGQsIGEsIFhbMTJdLCAyMCwgMHg4ZDJhNGM4YSk7IC8qIDMyICovCi0KLSAgICAvKgotICAgICAqICBSb3VuZCAzCi0gICAgICogIExldCBbYWJjZCBrIHMgdF0gZGVub3RlIHRoZSBvcGVyYXRpb24KLSAgICAgKiAgYSA9IGIgKyAoKGEgKyBIKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykKLSAgICAgKi8KLSAgICBST1VORDMoYSwgYiwgYywgZCwgWFsgNV0sICA0LCAweGZmZmEzOTQyKTsgLyogMzMgKi8KLSAgICBST1VORDMoZCwgYSwgYiwgYywgWFsgOF0sIDExLCAweDg3NzFmNjgxKTsgLyogMzQgKi8KLSAgICBST1VORDMoYywgZCwgYSwgYiwgWFsxMV0sIDE2LCAweDZkOWQ2MTIyKTsgLyogMzUgKi8KLSAgICBST1VORDMoYiwgYywgZCwgYSwgWFsxNF0sIDIzLCAweGZkZTUzODBjKTsgLyogMzYgKi8KLSAgICBST1VORDMoYSwgYiwgYywgZCwgWFsgMV0sICA0LCAweGE0YmVlYTQ0KTsgLyogMzcgKi8KLSAgICBST1VORDMoZCwgYSwgYiwgYywgWFsgNF0sIDExLCAweDRiZGVjZmE5KTsgLyogMzggKi8KLSAgICBST1VORDMoYywgZCwgYSwgYiwgWFsgN10sIDE2LCAweGY2YmI0YjYwKTsgLyogMzkgKi8KLSAgICBST1VORDMoYiwgYywgZCwgYSwgWFsxMF0sIDIzLCAweGJlYmZiYzcwKTsgLyogNDAgKi8KLSAgICBST1VORDMoYSwgYiwgYywgZCwgWFsxM10sICA0LCAweDI4OWI3ZWM2KTsgLyogNDEgKi8KLSAgICBST1VORDMoZCwgYSwgYiwgYywgWFsgMF0sIDExLCAweGVhYTEyN2ZhKTsgLyogNDIgKi8KLSAgICBST1VORDMoYywgZCwgYSwgYiwgWFsgM10sIDE2LCAweGQ0ZWYzMDg1KTsgLyogNDMgKi8KLSAgICBST1VORDMoYiwgYywgZCwgYSwgWFsgNl0sIDIzLCAgMHg0ODgxZDA1KTsgLyogNDQgKi8KLSAgICBST1VORDMoYSwgYiwgYywgZCwgWFsgOV0sICA0LCAweGQ5ZDRkMDM5KTsgLyogNDUgKi8KLSAgICBST1VORDMoZCwgYSwgYiwgYywgWFsxMl0sIDExLCAweGU2ZGI5OWU1KTsgLyogNDYgKi8KLSAgICBST1VORDMoYywgZCwgYSwgYiwgWFsxNV0sIDE2LCAweDFmYTI3Y2Y4KTsgLyogNDcgKi8KLSAgICBST1VORDMoYiwgYywgZCwgYSwgWFsgMl0sIDIzLCAweGM0YWM1NjY1KTsgLyogNDggKi8KLQotICAgIC8qCi0gICAgICogIFJvdW5kIDQKLSAgICAgKiAgTGV0IFthYmNkIGsgcyB0XSBkZW5vdGUgdGhlIG9wZXJhdGlvbgotICAgICAqICBhID0gYiArICgoYSArIEkoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKQotICAgICAqLwotICAgIFJPVU5ENChhLCBiLCBjLCBkLCBYWyAwXSwgIDYsIDB4ZjQyOTIyNDQpOyAvKiA0OSAqLwotICAgIFJPVU5ENChkLCBhLCBiLCBjLCBYWyA3XSwgMTAsIDB4NDMyYWZmOTcpOyAvKiA1MCAqLwotICAgIFJPVU5ENChjLCBkLCBhLCBiLCBYWzE0XSwgMTUsIDB4YWI5NDIzYTcpOyAvKiA1MSAqLwotICAgIFJPVU5ENChiLCBjLCBkLCBhLCBYWyA1XSwgMjEsIDB4ZmM5M2EwMzkpOyAvKiA1MiAqLwotICAgIFJPVU5ENChhLCBiLCBjLCBkLCBYWzEyXSwgIDYsIDB4NjU1YjU5YzMpOyAvKiA1MyAqLwotICAgIFJPVU5ENChkLCBhLCBiLCBjLCBYWyAzXSwgMTAsIDB4OGYwY2NjOTIpOyAvKiA1NCAqLwotICAgIFJPVU5ENChjLCBkLCBhLCBiLCBYWzEwXSwgMTUsIDB4ZmZlZmY0N2QpOyAvKiA1NSAqLwotICAgIFJPVU5ENChiLCBjLCBkLCBhLCBYWyAxXSwgMjEsIDB4ODU4NDVkZDEpOyAvKiA1NiAqLwotICAgIFJPVU5ENChhLCBiLCBjLCBkLCBYWyA4XSwgIDYsIDB4NmZhODdlNGYpOyAvKiA1NyAqLwotICAgIFJPVU5ENChkLCBhLCBiLCBjLCBYWzE1XSwgMTAsIDB4ZmUyY2U2ZTApOyAvKiA1OCAqLwotICAgIFJPVU5ENChjLCBkLCBhLCBiLCBYWyA2XSwgMTUsIDB4YTMwMTQzMTQpOyAvKiA1OSAqLwotICAgIFJPVU5ENChiLCBjLCBkLCBhLCBYWzEzXSwgMjEsIDB4NGUwODExYTEpOyAvKiA2MCAqLwotICAgIFJPVU5ENChhLCBiLCBjLCBkLCBYWyA0XSwgIDYsIDB4Zjc1MzdlODIpOyAvKiA2MSAqLwotICAgIFJPVU5ENChkLCBhLCBiLCBjLCBYWzExXSwgMTAsIDB4YmQzYWYyMzUpOyAvKiA2MiAqLwotICAgIFJPVU5ENChjLCBkLCBhLCBiLCBYWyAyXSwgMTUsIDB4MmFkN2QyYmIpOyAvKiA2MyAqLwotICAgIFJPVU5ENChiLCBjLCBkLCBhLCBYWyA5XSwgMjEsIDB4ZWI4NmQzOTEpOyAvKiA2NCAqLwotCi0gICAgLyogQ29tcHV0ZSB0aGUgaV50aCBpbnRlcm1lZGlhdGUgaGFzaCB2YWx1ZSBIXihpKSAqLwotICAgIHBNRDVfQ1RYLT5IYXNoVmFsdWVbMF0gKz0gYTsKLSAgICBwTUQ1X0NUWC0+SGFzaFZhbHVlWzFdICs9IGI7Ci0gICAgcE1ENV9DVFgtPkhhc2hWYWx1ZVsyXSArPSBjOwotICAgIHBNRDVfQ1RYLT5IYXNoVmFsdWVbM10gKz0gZDsKLQotICAgIE5kaXNaZXJvTWVtb3J5KHBNRDVfQ1RYLT5CbG9jaywgTUQ1X0JMT0NLX1NJWkUpOwotICAgIHBNRDVfQ1RYLT5CbG9ja0xlbiA9IDA7Ci19IC8qIEVuZCBvZiBNRDVfSGFzaCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgVGhlIG1lc3NhZ2UgaXMgYXBwZW5kZWQgdG8gYmxvY2suIElmIGJsb2NrIHNpemUgPiA2NCBieXRlcywgdGhlIE1ENV9IYXNoCi13aWxsIGJlIGNhbGxlZC4KLQotQXJndW1lbnRzOgotICAgIHBNRDVfQ1RYICAgICAgICBQb2ludGVyIHRvIE1ENV9DVFhfU1RSVUMKLSAgICBtZXNzYWdlICAgICAgICAgTWVzc2FnZSBjb250ZXh0Ci0gICAgbWVzc2FnZUxlbiAgICAgIFRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiBieXRlcwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTm9uZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgTUQ1X0FwcGVuZCAoCi0gICAgSU4gIE1ENV9DVFhfU1RSVUMgKnBNRDVfQ1RYLAotICAgIElOICBjb25zdCBVSU5UOCBNZXNzYWdlW10sCi0gICAgSU4gIFVJTlQgTWVzc2FnZUxlbikKLXsKLSAgICBVSU5UIGFwcGVuZExlbiA9IDA7Ci0gICAgVUlOVCBkaWZmTGVuID0gMDsKLQotICAgIHdoaWxlIChhcHBlbmRMZW4gIT0gTWVzc2FnZUxlbikgewotICAgICAgICBkaWZmTGVuID0gTWVzc2FnZUxlbiAtIGFwcGVuZExlbjsKLSAgICAgICAgaWYgKChwTUQ1X0NUWC0+QmxvY2tMZW4gKyBkaWZmTGVuKSA8IE1ENV9CTE9DS19TSVpFKSB7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwTUQ1X0NUWC0+QmxvY2sgKyBwTUQ1X0NUWC0+QmxvY2tMZW4sCi0gICAgICAgICAgICAgICAgTWVzc2FnZSArIGFwcGVuZExlbiwgZGlmZkxlbik7Ci0gICAgICAgICAgICBwTUQ1X0NUWC0+QmxvY2tMZW4gKz0gZGlmZkxlbjsKLSAgICAgICAgICAgIGFwcGVuZExlbiArPSBkaWZmTGVuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocE1ENV9DVFgtPkJsb2NrICsgcE1ENV9DVFgtPkJsb2NrTGVuLAotICAgICAgICAgICAgICAgIE1lc3NhZ2UgKyBhcHBlbmRMZW4sIE1ENV9CTE9DS19TSVpFIC0gcE1ENV9DVFgtPkJsb2NrTGVuKTsKLSAgICAgICAgICAgIGFwcGVuZExlbiArPSAoTUQ1X0JMT0NLX1NJWkUgLSBwTUQ1X0NUWC0+QmxvY2tMZW4pOwotICAgICAgICAgICAgcE1ENV9DVFgtPkJsb2NrTGVuID0gTUQ1X0JMT0NLX1NJWkU7Ci0gICAgICAgICAgICBNRDVfSGFzaChwTUQ1X0NUWCk7Ci0gICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgfSAvKiBFbmQgb2Ygd2hpbGUgKi8KLSAgICBwTUQ1X0NUWC0+TWVzc2FnZUxlbiArPSBNZXNzYWdlTGVuOwotfSAvKiBFbmQgb2YgTUQ1X0FwcGVuZCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgMS4gQXBwZW5kIGJpdCAxIHRvIGVuZCBvZiB0aGUgbWVzc2FnZQotICAgIDIuIEFwcGVuZCB0aGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gcmlnaHRtb3N0IDY0IGJpdHMKLSAgICAzLiBUcmFuc2Zvcm0gdGhlIEhhc2ggVmFsdWUgdG8gZGlnZXN0IG1lc3NhZ2UKLQotQXJndW1lbnRzOgotICAgIHBNRDVfQ1RYICAgICAgICBQb2ludGVyIHRvIE1ENV9DVFhfU1RSVUMKLQotUmV0dXJuIFZhbHVlOgotICAgIGRpZ2VzdE1lc3NhZ2UgICBEaWdlc3QgbWVzc2FnZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgTUQ1X0VuZCAoCi0gICAgSU4gIE1ENV9DVFhfU1RSVUMgKnBNRDVfQ1RYLAotICAgIE9VVCBVSU5UOCBEaWdlc3RNZXNzYWdlW10pCi17Ci0gICAgVUlOVCBpbmRleDsKLSAgICBVSU5UNjQgbWVzc2FnZV9sZW5ndGhfYml0czsKLQotICAgIC8qIGFwcGVuZCAxIGJpdHMgdG8gZW5kIG9mIHRoZSBtZXNzYWdlICovCi0gICAgTmRpc0ZpbGxNZW1vcnkocE1ENV9DVFgtPkJsb2NrICsgcE1ENV9DVFgtPkJsb2NrTGVuLCAxLCAweDgwKTsKLQotICAgIC8qIDU1ID0gNjQgLSA4IC0gMTogYXBwZW5kIDEgYml0KDEgYnl0ZSkgYW5kIG1lc3NhZ2UgbGVuZ3RoICg4IGJ5dGVzKSAqLwotICAgIGlmIChwTUQ1X0NUWC0+QmxvY2tMZW4gPiA1NSkKLSAgICAgICAgTUQ1X0hhc2gocE1ENV9DVFgpOwotICAgICAgICAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qIEFwcGVuZCB0aGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gcmlnaHRtb3N0IDY0IGJpdHMgKi8KLSAgICBtZXNzYWdlX2xlbmd0aF9iaXRzID0gcE1ENV9DVFgtPk1lc3NhZ2VMZW4qODsKLSAgICBtZXNzYWdlX2xlbmd0aF9iaXRzID0gY3B1MmxlNjQobWVzc2FnZV9sZW5ndGhfYml0cyk7Ci0gICAgTmRpc01vdmVNZW1vcnkoJnBNRDVfQ1RYLT5CbG9ja1s1Nl0sICZtZXNzYWdlX2xlbmd0aF9iaXRzLCA4KTsKLSAgICBNRDVfSGFzaChwTUQ1X0NUWCk7Ci0KLSAgICAvKiBSZXR1cm4gbWVzc2FnZSBkaWdlc3QsIHRyYW5zZm9ybSB0aGUgVUlOVDMyIGhhc2ggdmFsdWUgdG8gYnl0ZXMgKi8KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA0O2luZGV4KyspCi0gICAgICAgIHBNRDVfQ1RYLT5IYXNoVmFsdWVbaW5kZXhdID0gY3B1MmxlMzIocE1ENV9DVFgtPkhhc2hWYWx1ZVtpbmRleF0pOwotICAgICAgICAvKiBFbmQgb2YgZm9yICovCi0gICAgTmRpc01vdmVNZW1vcnkoRGlnZXN0TWVzc2FnZSwgcE1ENV9DVFgtPkhhc2hWYWx1ZSwgTUQ1X0RJR0VTVF9TSVpFKTsKLX0gLyogRW5kIG9mIE1ENV9FbmQgKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIE1ENSBhbGdvcml0aG0KLQotQXJndW1lbnRzOgotICAgIG1lc3NhZ2UgICAgICAgICBNZXNzYWdlIGNvbnRleHQKLSAgICBtZXNzYWdlTGVuICAgICAgVGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIGJ5dGVzCi0KLVJldHVybiBWYWx1ZToKLSAgICBkaWdlc3RNZXNzYWdlICAgRGlnZXN0IG1lc3NhZ2UKLQotTm90ZToKLSAgICBOb25lCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUX01ENSAoCi0gICAgSU4gIGNvbnN0IFVJTlQ4IE1lc3NhZ2VbXSwKLSAgICBJTiAgVUlOVCBNZXNzYWdlTGVuLAotICAgIE9VVCBVSU5UOCBEaWdlc3RNZXNzYWdlW10pCi17Ci0gICAgTUQ1X0NUWF9TVFJVQyBtZDVfY3R4OwotCi0gICAgTmRpc1plcm9NZW1vcnkoJm1kNV9jdHgsIHNpemVvZihNRDVfQ1RYX1NUUlVDKSk7Ci0gICAgTUQ1X0luaXQoJm1kNV9jdHgpOwotICAgIE1ENV9BcHBlbmQoJm1kNV9jdHgsIE1lc3NhZ2UsIE1lc3NhZ2VMZW4pOwotICAgIE1ENV9FbmQoJm1kNV9jdHgsIERpZ2VzdE1lc3NhZ2UpOwotfSAvKiBFbmQgb2YgUlRfTUQ1ICovCi0KLSNlbmRpZiAvKiBNRDVfU1VQUE9SVCAqLwotCi0vKiBFbmQgb2YgY3J5cHRfbWQ1LmMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X3NoYTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X3NoYTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0OTBkMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9zaGEyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzYgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiLi4vY3J5cHRfc2hhMi5oIgotCi0KLS8qIEJhc2ljIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgU0hSKHgsbikgKHggPj4gbikgLyogU0hSKHgpXm4sIHJpZ2h0IHNoaWZ0IG4gYml0cyAsIHggaXMgdy1iaXQgd29yZCwgMCA8PSBuIDw9IHcgKi8KLSNkZWZpbmUgUk9UUih4LG4sdykgKCh4ID4+IG4pIHwgKHggPDwgKHcgLSBuKSkpIC8qIFJPVFIoeClebiwgY2lyY3VsYXIgcmlnaHQgc2hpZnQgbiBiaXRzICwgeCBpcyB3LWJpdCB3b3JkLCAwIDw9IG4gPD0gdyAqLwotI2RlZmluZSBST1RMKHgsbix3KSAoKHggPDwgbikgfCAoeCA+PiAodyAtIG4pKSkgLyogUk9UTCh4KV5uLCBjaXJjdWxhciBsZWZ0IHNoaWZ0IG4gYml0cyAsIHggaXMgdy1iaXQgd29yZCwgMCA8PSBuIDw9IHcgKi8KLSNkZWZpbmUgUk9UUjMyKHgsbikgUk9UUih4LG4sMzIpIC8qIDMyIGJpdHMgd29yZCAqLwotI2RlZmluZSBST1RMMzIoeCxuKSBST1RMKHgsbiwzMikgLyogMzIgYml0cyB3b3JkICovCi0KLS8qIEJhc2ljIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBDaCh4LHkseikgKCh4ICYgeSkgXiAoKH54KSAmIHopKQotI2RlZmluZSBNYWooeCx5LHopICgoeCAmIHkpIF4gKHggJiB6KSBeICh5ICYgeikpCi0jZGVmaW5lIFBhcml0eSh4LHkseikgKHggXiB5IF4geikKLQotI2lmZGVmIFNIQTFfU1VQUE9SVAotLyogU0hBMSBjb25zdGFudHMgKi8KLSNkZWZpbmUgU0hBMV9NQVNLIDB4MDAwMDAwMGYKLXN0YXRpYyBjb25zdCBVSU5UMzIgU0hBMV9LWzRdID0gewotICAgIDB4NWE4Mjc5OTlVTCwgMHg2ZWQ5ZWJhMVVMLCAweDhmMWJiY2RjVUwsIDB4Y2E2MmMxZDZVTAotfTsKLXN0YXRpYyBjb25zdCBVSU5UMzIgU0hBMV9EZWZhdWx0SGFzaFZhbHVlWzVdID0gewotICAgIDB4Njc0NTIzMDFVTCwgMHhlZmNkYWI4OVVMLCAweDk4YmFkY2ZlVUwsIDB4MTAzMjU0NzZVTCwgMHhjM2QyZTFmMFVMCi19OwotI2VuZGlmIC8qIFNIQTFfU1VQUE9SVCAqLwotCi0KLSNpZmRlZiBTSEEyNTZfU1VQUE9SVAotLyogU0hBMjU2IGZ1bmN0aW9ucyAqLwotI2RlZmluZSBac2lnbWFfMjU2XzAoeCkgKFJPVFIzMih4LDIpIF4gUk9UUjMyKHgsMTMpIF4gUk9UUjMyKHgsMjIpKQotI2RlZmluZSBac2lnbWFfMjU2XzEoeCkgKFJPVFIzMih4LDYpIF4gUk9UUjMyKHgsMTEpIF4gUk9UUjMyKHgsMjUpKQotI2RlZmluZSBTaWdtYV8yNTZfMCh4KSAgKFJPVFIzMih4LDcpIF4gUk9UUjMyKHgsMTgpIF4gU0hSKHgsMykpCi0jZGVmaW5lIFNpZ21hXzI1Nl8xKHgpICAoUk9UUjMyKHgsMTcpIF4gUk9UUjMyKHgsMTkpIF4gU0hSKHgsMTApKQotLyogU0hBMjU2IGNvbnN0YW50cyAqLwotc3RhdGljIGNvbnN0IFVJTlQzMiBTSEEyNTZfS1s2NF0gPSB7Ci0gICAgMHg0MjhhMmY5OFVMLCAweDcxMzc0NDkxVUwsIDB4YjVjMGZiY2ZVTCwgMHhlOWI1ZGJhNVVMLAotICAgIDB4Mzk1NmMyNWJVTCwgMHg1OWYxMTFmMVVMLCAweDkyM2Y4MmE0VUwsIDB4YWIxYzVlZDVVTCwKLSAgICAweGQ4MDdhYTk4VUwsIDB4MTI4MzViMDFVTCwgMHgyNDMxODViZVVMLCAweDU1MGM3ZGMzVUwsCi0gICAgMHg3MmJlNWQ3NFVMLCAweDgwZGViMWZlVUwsIDB4OWJkYzA2YTdVTCwgMHhjMTliZjE3NFVMLAotICAgIDB4ZTQ5YjY5YzFVTCwgMHhlZmJlNDc4NlVMLCAweDBmYzE5ZGM2VUwsIDB4MjQwY2ExY2NVTCwKLSAgICAweDJkZTkyYzZmVUwsIDB4NGE3NDg0YWFVTCwgMHg1Y2IwYTlkY1VMLCAweDc2Zjk4OGRhVUwsCi0gICAgMHg5ODNlNTE1MlVMLCAweGE4MzFjNjZkVUwsIDB4YjAwMzI3YzhVTCwgMHhiZjU5N2ZjN1VMLAotICAgIDB4YzZlMDBiZjNVTCwgMHhkNWE3OTE0N1VMLCAweDA2Y2E2MzUxVUwsIDB4MTQyOTI5NjdVTCwKLSAgICAweDI3YjcwYTg1VUwsIDB4MmUxYjIxMzhVTCwgMHg0ZDJjNmRmY1VMLCAweDUzMzgwZDEzVUwsCi0gICAgMHg2NTBhNzM1NFVMLCAweDc2NmEwYWJiVUwsIDB4ODFjMmM5MmVVTCwgMHg5MjcyMmM4NVVMLAotICAgIDB4YTJiZmU4YTFVTCwgMHhhODFhNjY0YlVMLCAweGMyNGI4YjcwVUwsIDB4Yzc2YzUxYTNVTCwKLSAgICAweGQxOTJlODE5VUwsIDB4ZDY5OTA2MjRVTCwgMHhmNDBlMzU4NVVMLCAweDEwNmFhMDcwVUwsCi0gICAgMHgxOWE0YzExNlVMLCAweDFlMzc2YzA4VUwsIDB4Mjc0ODc3NGNVTCwgMHgzNGIwYmNiNVVMLAotICAgIDB4MzkxYzBjYjNVTCwgMHg0ZWQ4YWE0YVVMLCAweDViOWNjYTRmVUwsIDB4NjgyZTZmZjNVTCwKLSAgICAweDc0OGY4MmVlVUwsIDB4NzhhNTYzNmZVTCwgMHg4NGM4NzgxNFVMLCAweDhjYzcwMjA4VUwsCi0gICAgMHg5MGJlZmZmYVVMLCAweGE0NTA2Y2ViVUwsIDB4YmVmOWEzZjdVTCwgMHhjNjcxNzhmMlVMCi19Owotc3RhdGljIGNvbnN0IFVJTlQzMiBTSEEyNTZfRGVmYXVsdEhhc2hWYWx1ZVs4XSA9IHsKLSAgICAweDZhMDllNjY3VUwsIDB4YmI2N2FlODVVTCwgMHgzYzZlZjM3MlVMLCAweGE1NGZmNTNhVUwsCi0gICAgMHg1MTBlNTI3ZlVMLCAweDliMDU2ODhjVUwsIDB4MWY4M2Q5YWJVTCwgMHg1YmUwY2QxOVVMCi19OwotI2VuZGlmIC8qIFNIQTI1Nl9TVVBQT1JUICovCi0KLQotI2lmZGVmIFNIQTFfU1VQUE9SVAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBJbml0aWFsIFNIQTFfQ1RYX1NUUlVDCi0KLUFyZ3VtZW50czoKLSAgICBwU0hBX0NUWCAgICAgICAgUG9pbnRlciB0byBTSEExX0NUWF9TVFJVQwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTm9uZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgU0hBMV9Jbml0ICgKLSAgICBJTiAgU0hBMV9DVFhfU1RSVUMgKnBTSEFfQ1RYKQotewotICAgIE5kaXNNb3ZlTWVtb3J5KHBTSEFfQ1RYLT5IYXNoVmFsdWUsIFNIQTFfRGVmYXVsdEhhc2hWYWx1ZSwKLSAgICAgICAgc2l6ZW9mKFNIQTFfRGVmYXVsdEhhc2hWYWx1ZSkpOwotICAgIE5kaXNaZXJvTWVtb3J5KHBTSEFfQ1RYLT5CbG9jaywgU0hBMV9CTE9DS19TSVpFKTsKLSAgICBwU0hBX0NUWC0+TWVzc2FnZUxlbiA9IDA7Ci0gICAgcFNIQV9DVFgtPkJsb2NrTGVuICAgPSAwOwotfSAvKiBFbmQgb2YgU0hBMV9Jbml0ICovCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBTSEExIGNvbXB1dGF0aW9uIGZvciBvbmUgYmxvY2sgKDUxMiBiaXRzKQotCi1Bcmd1bWVudHM6Ci0gICAgcFNIQV9DVFggICAgICAgIFBvaW50ZXIgdG8gU0hBMV9DVFhfU1RSVUMKLQotUmV0dXJuIFZhbHVlOgotICAgIE5vbmUKLQotTm90ZToKLSAgICBOb25lCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFNIQTFfSGFzaCAoCi0gICAgSU4gIFNIQTFfQ1RYX1NUUlVDICpwU0hBX0NUWCkKLXsKLSAgICBVSU5UMzIgV19pLHQsczsKLSAgICBVSU5UMzIgV1sxNl07Ci0gICAgVUlOVDMyIGEsYixjLGQsZSxULGZfdCA9IDA7Ci0KLSAgICAvKiBQcmVwYXJlIHRoZSBtZXNzYWdlIHNjaGVkdWxlLCB7V19pfSwgMCA8IHQgPCAxNSAqLwotICAgIE5kaXNNb3ZlTWVtb3J5KFcsIHBTSEFfQ1RYLT5CbG9jaywgU0hBMV9CTE9DS19TSVpFKTsKLSAgICBmb3IgKFdfaSA9IDA7IFdfaSA8IDE2OyBXX2krKykKLSAgICAgICAgV1tXX2ldID0gY3B1MmJlMzIoV1tXX2ldKTsgLyogRW5kaWFuIFN3YXAgKi8KLSAgICAgICAgLyogRW5kIG9mIGZvciAqLwotCi0gICAgLyogU0hBMjU2IGhhc2ggY29tcHV0YXRpb24gKi8KLSAgICAvKiBJbml0aWFsaXplIHRoZSB3b3JraW5nIHZhcmlhYmxlcyAqLwotICAgIGEgPSBwU0hBX0NUWC0+SGFzaFZhbHVlWzBdOwotICAgIGIgPSBwU0hBX0NUWC0+SGFzaFZhbHVlWzFdOwotICAgIGMgPSBwU0hBX0NUWC0+SGFzaFZhbHVlWzJdOwotICAgIGQgPSBwU0hBX0NUWC0+SGFzaFZhbHVlWzNdOwotICAgIGUgPSBwU0hBX0NUWC0+SGFzaFZhbHVlWzRdOwotCi0gICAgLyogODAgcm91bmRzICovCi0gICAgZm9yICh0ID0gMDt0IDwgODA7dCsrKSB7Ci0gICAgICAgIHMgPSB0ICYgU0hBMV9NQVNLOwotICAgICAgICBpZiAodCA+IDE1KSB7IC8qIFByZXBhcmUgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUsIHtXX2l9LCAxNiA8IHQgPCA3OSAqLwotICAgICAgICAgICAgV1tzXSA9IChXWyhzKzEzKSAmIFNIQTFfTUFTS10pIF4gKFdbKHMrOCkgJiBTSEExX01BU0tdKSBeIChXWyhzKzIpICYgU0hBMV9NQVNLXSkgXiBXW3NdOwotICAgICAgICAgICAgV1tzXSA9IFJPVEwzMihXW3NdLDEpOwotICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgICAgICBzd2l0Y2ggKHQgLyAyMCkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICBmX3QgPSBDaChiLGMsZCk7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICBmX3QgPSBQYXJpdHkoYixjLGQpOwotICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgZl90ID0gTWFqKGIsYyxkKTsKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgIGZfdCA9IFBhcml0eShiLGMsZCk7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IC8qIEVuZCBvZiBzd2l0Y2ggKi8KLSAgICAgICAgVCA9IFJPVEwzMihhLDUpICsgZl90ICsgZSArIFNIQTFfS1t0IC8gMjBdICsgV1tzXTsKLSAgICAgICAgZSA9IGQ7Ci0gICAgICAgIGQgPSBjOwotICAgICAgICBjID0gUk9UTDMyKGIsMzApOwotICAgICAgICBiID0gYTsKLSAgICAgICAgYSA9IFQ7Ci0gICAgIH0gLyogRW5kIG9mIGZvciAqLwotCi0gICAgIC8qIENvbXB1dGUgdGhlIGledGggaW50ZXJtZWRpYXRlIGhhc2ggdmFsdWUgSF4oaSkgKi8KLSAgICAgcFNIQV9DVFgtPkhhc2hWYWx1ZVswXSArPSBhOwotICAgICBwU0hBX0NUWC0+SGFzaFZhbHVlWzFdICs9IGI7Ci0gICAgIHBTSEFfQ1RYLT5IYXNoVmFsdWVbMl0gKz0gYzsKLSAgICAgcFNIQV9DVFgtPkhhc2hWYWx1ZVszXSArPSBkOwotICAgICBwU0hBX0NUWC0+SGFzaFZhbHVlWzRdICs9IGU7Ci0KLSAgICBOZGlzWmVyb01lbW9yeShwU0hBX0NUWC0+QmxvY2ssIFNIQTFfQkxPQ0tfU0laRSk7Ci0gICAgcFNIQV9DVFgtPkJsb2NrTGVuID0gMDsKLX0gLyogRW5kIG9mIFNIQTFfSGFzaCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgVGhlIG1lc3NhZ2UgaXMgYXBwZW5kZWQgdG8gYmxvY2suIElmIGJsb2NrIHNpemUgPiA2NCBieXRlcywgdGhlIFNIQTFfSGFzaAotd2lsbCBiZSBjYWxsZWQuCi0KLUFyZ3VtZW50czoKLSAgICBwU0hBX0NUWCAgICAgICAgUG9pbnRlciB0byBTSEExX0NUWF9TVFJVQwotICAgIG1lc3NhZ2UgICAgICAgICBNZXNzYWdlIGNvbnRleHQKLSAgICBtZXNzYWdlTGVuICAgICAgVGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIGJ5dGVzCi0KLVJldHVybiBWYWx1ZToKLSAgICBOb25lCi0KLU5vdGU6Ci0gICAgTm9uZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBTSEExX0FwcGVuZCAoCi0gICAgSU4gIFNIQTFfQ1RYX1NUUlVDICpwU0hBX0NUWCwKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4pCi17Ci0gICAgVUlOVCBhcHBlbmRMZW4gPSAwOwotICAgIFVJTlQgZGlmZkxlbiAgID0gMDsKLQotICAgIHdoaWxlIChhcHBlbmRMZW4gIT0gTWVzc2FnZUxlbikgewotICAgICAgICBkaWZmTGVuID0gTWVzc2FnZUxlbiAtIGFwcGVuZExlbjsKLSAgICAgICAgaWYgKChwU0hBX0NUWC0+QmxvY2tMZW4gKyBkaWZmTGVuKSA8ICBTSEExX0JMT0NLX1NJWkUpIHsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBTSEFfQ1RYLT5CbG9jayArIHBTSEFfQ1RYLT5CbG9ja0xlbiwKLSAgICAgICAgICAgICAgICBNZXNzYWdlICsgYXBwZW5kTGVuLCBkaWZmTGVuKTsKLSAgICAgICAgICAgIHBTSEFfQ1RYLT5CbG9ja0xlbiArPSBkaWZmTGVuOwotICAgICAgICAgICAgYXBwZW5kTGVuICs9IGRpZmZMZW47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwU0hBX0NUWC0+QmxvY2sgKyBwU0hBX0NUWC0+QmxvY2tMZW4sCi0gICAgICAgICAgICAgICAgTWVzc2FnZSArIGFwcGVuZExlbiwgU0hBMV9CTE9DS19TSVpFIC0gcFNIQV9DVFgtPkJsb2NrTGVuKTsKLSAgICAgICAgICAgIGFwcGVuZExlbiArPSAoU0hBMV9CTE9DS19TSVpFIC0gcFNIQV9DVFgtPkJsb2NrTGVuKTsKLSAgICAgICAgICAgIHBTSEFfQ1RYLT5CbG9ja0xlbiA9IFNIQTFfQkxPQ0tfU0laRTsKLSAgICAgICAgICAgIFNIQTFfSGFzaChwU0hBX0NUWCk7Ci0gICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgfSAvKiBFbmQgb2Ygd2hpbGUgKi8KLSAgICBwU0hBX0NUWC0+TWVzc2FnZUxlbiArPSBNZXNzYWdlTGVuOwotfSAvKiBFbmQgb2YgU0hBMV9BcHBlbmQgKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIDEuIEFwcGVuZCBiaXQgMSB0byBlbmQgb2YgdGhlIG1lc3NhZ2UKLSAgICAyLiBBcHBlbmQgdGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIHJpZ2h0bW9zdCA2NCBiaXRzCi0gICAgMy4gVHJhbnNmb3JtIHRoZSBIYXNoIFZhbHVlIHRvIGRpZ2VzdCBtZXNzYWdlCi0KLUFyZ3VtZW50czoKLSAgICBwU0hBX0NUWCAgICAgICAgUG9pbnRlciB0byBTSEExX0NUWF9TVFJVQwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgZGlnZXN0TWVzc2FnZSAgIERpZ2VzdCBtZXNzYWdlCi0KLU5vdGU6Ci0gICAgTm9uZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBTSEExX0VuZCAoCi0gICAgSU4gIFNIQTFfQ1RYX1NUUlVDICpwU0hBX0NUWCwKLSAgICBPVVQgVUlOVDggRGlnZXN0TWVzc2FnZVtdKQotewotICAgIFVJTlQgaW5kZXg7Ci0gICAgVUlOVDY0IG1lc3NhZ2VfbGVuZ3RoX2JpdHM7Ci0KLSAgICAvKiBBcHBlbmQgYml0IDEgdG8gZW5kIG9mIHRoZSBtZXNzYWdlICovCi0gICAgTmRpc0ZpbGxNZW1vcnkocFNIQV9DVFgtPkJsb2NrICsgcFNIQV9DVFgtPkJsb2NrTGVuLCAxLCAweDgwKTsKLQotICAgIC8qIDU1ID0gNjQgLSA4IC0gMTogYXBwZW5kIDEgYml0KDEgYnl0ZSkgYW5kIG1lc3NhZ2UgbGVuZ3RoICg4IGJ5dGVzKSAqLwotICAgIGlmIChwU0hBX0NUWC0+QmxvY2tMZW4gPiA1NSkKLSAgICAgICAgU0hBMV9IYXNoKHBTSEFfQ1RYKTsKLSAgICAgICAgLyogRW5kIG9mIGlmICovCi0KLSAgICAvKiBBcHBlbmQgdGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIHJpZ2h0bW9zdCA2NCBiaXRzICovCi0gICAgbWVzc2FnZV9sZW5ndGhfYml0cyA9IHBTSEFfQ1RYLT5NZXNzYWdlTGVuKjg7Ci0gICAgbWVzc2FnZV9sZW5ndGhfYml0cyA9IGNwdTJiZTY0KG1lc3NhZ2VfbGVuZ3RoX2JpdHMpOwotICAgIE5kaXNNb3ZlTWVtb3J5KCZwU0hBX0NUWC0+QmxvY2tbNTZdLCAmbWVzc2FnZV9sZW5ndGhfYml0cywgOCk7Ci0gICAgU0hBMV9IYXNoKHBTSEFfQ1RYKTsKLQotICAgIC8qIFJldHVybiBtZXNzYWdlIGRpZ2VzdCwgdHJhbnNmb3JtIHRoZSBVSU5UMzIgaGFzaCB2YWx1ZSB0byBieXRlcyAqLwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDU7aW5kZXgrKykKLSAgICAgICAgcFNIQV9DVFgtPkhhc2hWYWx1ZVtpbmRleF0gPSBjcHUyYmUzMihwU0hBX0NUWC0+SGFzaFZhbHVlW2luZGV4XSk7Ci0gICAgICAgIC8qIEVuZCBvZiBmb3IgKi8KLSAgICBOZGlzTW92ZU1lbW9yeShEaWdlc3RNZXNzYWdlLCBwU0hBX0NUWC0+SGFzaFZhbHVlLCBTSEExX0RJR0VTVF9TSVpFKTsKLX0gLyogRW5kIG9mIFNIQTFfRW5kICovCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBTSEExIGFsZ29yaXRobQotCi1Bcmd1bWVudHM6Ci0gICAgbWVzc2FnZSAgICAgICAgIE1lc3NhZ2UgY29udGV4dAotICAgIG1lc3NhZ2VMZW4gICAgICBUaGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gYnl0ZXMKLQotUmV0dXJuIFZhbHVlOgotICAgIGRpZ2VzdE1lc3NhZ2UgICBEaWdlc3QgbWVzc2FnZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRfU0hBMSAoCi0gICAgSU4gIGNvbnN0IFVJTlQ4IE1lc3NhZ2VbXSwKLSAgICBJTiAgVUlOVCBNZXNzYWdlTGVuLAotICAgIE9VVCBVSU5UOCBEaWdlc3RNZXNzYWdlW10pCi17Ci0KLSAgICBTSEExX0NUWF9TVFJVQyBzaGFfY3R4OwotCi0gICAgTmRpc1plcm9NZW1vcnkoJnNoYV9jdHgsIHNpemVvZihTSEExX0NUWF9TVFJVQykpOwotICAgIFNIQTFfSW5pdCgmc2hhX2N0eCk7Ci0gICAgU0hBMV9BcHBlbmQoJnNoYV9jdHgsIE1lc3NhZ2UsIE1lc3NhZ2VMZW4pOwotICAgIFNIQTFfRW5kKCZzaGFfY3R4LCBEaWdlc3RNZXNzYWdlKTsKLX0gLyogRW5kIG9mIFJUX1NIQTEgKi8KLSNlbmRpZiAvKiBTSEExX1NVUFBPUlQgKi8KLQotCi0jaWZkZWYgU0hBMjU2X1NVUFBPUlQKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgSW5pdGlhbCBTSEEyNTZfQ1RYX1NUUlVDCi0KLUFyZ3VtZW50czoKLSAgICBwU0hBX0NUWCAgICBQb2ludGVyIHRvIFNIQTI1Nl9DVFhfU1RSVUMKLQotUmV0dXJuIFZhbHVlOgotICAgIE5vbmUKLQotTm90ZToKLSAgICBOb25lCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFNIQTI1Nl9Jbml0ICgKLSAgICBJTiAgU0hBMjU2X0NUWF9TVFJVQyAqcFNIQV9DVFgpCi17Ci0gICAgTmRpc01vdmVNZW1vcnkocFNIQV9DVFgtPkhhc2hWYWx1ZSwgU0hBMjU2X0RlZmF1bHRIYXNoVmFsdWUsCi0gICAgICAgIHNpemVvZihTSEEyNTZfRGVmYXVsdEhhc2hWYWx1ZSkpOwotICAgIE5kaXNaZXJvTWVtb3J5KHBTSEFfQ1RYLT5CbG9jaywgU0hBMjU2X0JMT0NLX1NJWkUpOwotICAgIHBTSEFfQ1RYLT5NZXNzYWdlTGVuID0gMDsKLSAgICBwU0hBX0NUWC0+QmxvY2tMZW4gICA9IDA7Ci19IC8qIEVuZCBvZiBTSEEyNTZfSW5pdCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgU0hBMjU2IGNvbXB1dGF0aW9uIGZvciBvbmUgYmxvY2sgKDUxMiBiaXRzKQotCi1Bcmd1bWVudHM6Ci0gICAgcFNIQV9DVFggICAgUG9pbnRlciB0byBTSEEyNTZfQ1RYX1NUUlVDCi0KLVJldHVybiBWYWx1ZToKLSAgICBOb25lCi0KLU5vdGU6Ci0gICAgTm9uZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBTSEEyNTZfSGFzaCAoCi0gICAgSU4gIFNIQTI1Nl9DVFhfU1RSVUMgKnBTSEFfQ1RYKQotewotICAgIFVJTlQzMiBXX2ksdDsKLSAgICBVSU5UMzIgV1s2NF07Ci0gICAgVUlOVDMyIGEsYixjLGQsZSxmLGcsaCxUMSxUMjsKLQotICAgIC8qIFByZXBhcmUgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUsIHtXX2l9LCAwIDwgdCA8IDE1ICovCi0gICAgTmRpc01vdmVNZW1vcnkoVywgcFNIQV9DVFgtPkJsb2NrLCBTSEEyNTZfQkxPQ0tfU0laRSk7Ci0gICAgZm9yIChXX2kgPSAwOyBXX2kgPCAxNjsgV19pKyspCi0gICAgICAgIFdbV19pXSA9IGNwdTJiZTMyKFdbV19pXSk7IC8qIEVuZGlhbiBTd2FwICovCi0gICAgICAgIC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIC8qIFNIQTI1NiBoYXNoIGNvbXB1dGF0aW9uICovCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgd29ya2luZyB2YXJpYWJsZXMgKi8KLSAgICBhID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVswXTsKLSAgICBiID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVsxXTsKLSAgICBjID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVsyXTsKLSAgICBkID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVszXTsKLSAgICBlID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVs0XTsKLSAgICBmID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVs1XTsKLSAgICBnID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVs2XTsKLSAgICBoID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVs3XTsKLQotICAgIC8qIDY0IHJvdW5kcyAqLwotICAgIGZvciAodCA9IDA7dCA8IDY0O3QrKykgewotICAgICAgICBpZiAodCA+IDE1KSAvKiBQcmVwYXJlIHRoZSBtZXNzYWdlIHNjaGVkdWxlLCB7V19pfSwgMTYgPCB0IDwgNjMgKi8KLSAgICAgICAgICAgIFdbdF0gPSBTaWdtYV8yNTZfMShXW3QtMl0pICsgV1t0LTddICsgU2lnbWFfMjU2XzAoV1t0LTE1XSkgKyBXW3QtMTZdOwotICAgICAgICAgICAgLyogRW5kIG9mIGlmICovCi0gICAgICAgIFQxID0gaCArIFpzaWdtYV8yNTZfMShlKSArIENoKGUsZixnKSArIFNIQTI1Nl9LW3RdICsgV1t0XTsKLSAgICAgICAgVDIgPSBac2lnbWFfMjU2XzAoYSkgKyBNYWooYSxiLGMpOwotICAgICAgICBoID0gZzsKLSAgICAgICAgZyA9IGY7Ci0gICAgICAgIGYgPSBlOwotICAgICAgICBlID0gZCArIFQxOwotICAgICAgICBkID0gYzsKLSAgICAgICAgYyA9IGI7Ci0gICAgICAgIGIgPSBhOwotICAgICAgICBhID0gVDEgKyBUMjsKLSAgICAgfSAvKiBFbmQgb2YgZm9yICovCi0KLSAgICAgLyogQ29tcHV0ZSB0aGUgaV50aCBpbnRlcm1lZGlhdGUgaGFzaCB2YWx1ZSBIXihpKSAqLwotICAgICBwU0hBX0NUWC0+SGFzaFZhbHVlWzBdICs9IGE7Ci0gICAgIHBTSEFfQ1RYLT5IYXNoVmFsdWVbMV0gKz0gYjsKLSAgICAgcFNIQV9DVFgtPkhhc2hWYWx1ZVsyXSArPSBjOwotICAgICBwU0hBX0NUWC0+SGFzaFZhbHVlWzNdICs9IGQ7Ci0gICAgIHBTSEFfQ1RYLT5IYXNoVmFsdWVbNF0gKz0gZTsKLSAgICAgcFNIQV9DVFgtPkhhc2hWYWx1ZVs1XSArPSBmOwotICAgICBwU0hBX0NUWC0+SGFzaFZhbHVlWzZdICs9IGc7Ci0gICAgIHBTSEFfQ1RYLT5IYXNoVmFsdWVbN10gKz0gaDsKLQotICAgIE5kaXNaZXJvTWVtb3J5KHBTSEFfQ1RYLT5CbG9jaywgU0hBMjU2X0JMT0NLX1NJWkUpOwotICAgIHBTSEFfQ1RYLT5CbG9ja0xlbiA9IDA7Ci19IC8qIEVuZCBvZiBTSEEyNTZfSGFzaCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgVGhlIG1lc3NhZ2UgaXMgYXBwZW5kZWQgdG8gYmxvY2suIElmIGJsb2NrIHNpemUgPiA2NCBieXRlcywgdGhlIFNIQTI1Nl9IYXNoCi13aWxsIGJlIGNhbGxlZC4KLQotQXJndW1lbnRzOgotICAgIHBTSEFfQ1RYICAgIFBvaW50ZXIgdG8gU0hBMjU2X0NUWF9TVFJVQwotICAgIG1lc3NhZ2UgICAgIE1lc3NhZ2UgY29udGV4dAotICAgIG1lc3NhZ2VMZW4gIFRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiBieXRlcwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTm9uZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgU0hBMjU2X0FwcGVuZCAoCi0gICAgSU4gIFNIQTI1Nl9DVFhfU1RSVUMgKnBTSEFfQ1RYLAotICAgIElOICBjb25zdCBVSU5UOCBNZXNzYWdlW10sCi0gICAgSU4gIFVJTlQgTWVzc2FnZUxlbikKLXsKLSAgICBVSU5UIGFwcGVuZExlbiA9IDA7Ci0gICAgVUlOVCBkaWZmTGVuICAgPSAwOwotCi0gICAgd2hpbGUgKGFwcGVuZExlbiAhPSBNZXNzYWdlTGVuKSB7Ci0gICAgICAgIGRpZmZMZW4gPSBNZXNzYWdlTGVuIC0gYXBwZW5kTGVuOwotICAgICAgICBpZiAoKHBTSEFfQ1RYLT5CbG9ja0xlbiArIGRpZmZMZW4pIDwgIFNIQTI1Nl9CTE9DS19TSVpFKSB7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwU0hBX0NUWC0+QmxvY2sgKyBwU0hBX0NUWC0+QmxvY2tMZW4sCi0gICAgICAgICAgICAgICAgTWVzc2FnZSArIGFwcGVuZExlbiwgZGlmZkxlbik7Ci0gICAgICAgICAgICBwU0hBX0NUWC0+QmxvY2tMZW4gKz0gZGlmZkxlbjsKLSAgICAgICAgICAgIGFwcGVuZExlbiArPSBkaWZmTGVuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFNIQV9DVFgtPkJsb2NrICsgcFNIQV9DVFgtPkJsb2NrTGVuLAotICAgICAgICAgICAgICAgIE1lc3NhZ2UgKyBhcHBlbmRMZW4sIFNIQTI1Nl9CTE9DS19TSVpFIC0gcFNIQV9DVFgtPkJsb2NrTGVuKTsKLSAgICAgICAgICAgIGFwcGVuZExlbiArPSAoU0hBMjU2X0JMT0NLX1NJWkUgLSBwU0hBX0NUWC0+QmxvY2tMZW4pOwotICAgICAgICAgICAgcFNIQV9DVFgtPkJsb2NrTGVuID0gU0hBMjU2X0JMT0NLX1NJWkU7Ci0gICAgICAgICAgICBTSEEyNTZfSGFzaChwU0hBX0NUWCk7Ci0gICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgfSAvKiBFbmQgb2Ygd2hpbGUgKi8KLSAgICBwU0hBX0NUWC0+TWVzc2FnZUxlbiArPSBNZXNzYWdlTGVuOwotfSAvKiBFbmQgb2YgU0hBMjU2X0FwcGVuZCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgMS4gQXBwZW5kIGJpdCAxIHRvIGVuZCBvZiB0aGUgbWVzc2FnZQotICAgIDIuIEFwcGVuZCB0aGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gcmlnaHRtb3N0IDY0IGJpdHMKLSAgICAzLiBUcmFuc2Zvcm0gdGhlIEhhc2ggVmFsdWUgdG8gZGlnZXN0IG1lc3NhZ2UKLQotQXJndW1lbnRzOgotICAgIHBTSEFfQ1RYICAgICAgICBQb2ludGVyIHRvIFNIQTI1Nl9DVFhfU1RSVUMKLQotUmV0dXJuIFZhbHVlOgotICAgIGRpZ2VzdE1lc3NhZ2UgICBEaWdlc3QgbWVzc2FnZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgU0hBMjU2X0VuZCAoCi0gICAgSU4gIFNIQTI1Nl9DVFhfU1RSVUMgKnBTSEFfQ1RYLAotICAgIE9VVCBVSU5UOCBEaWdlc3RNZXNzYWdlW10pCi17Ci0gICAgVUlOVCBpbmRleDsKLSAgICBVSU5UNjQgbWVzc2FnZV9sZW5ndGhfYml0czsKLQotICAgIC8qIEFwcGVuZCBiaXQgMSB0byBlbmQgb2YgdGhlIG1lc3NhZ2UgKi8KLSAgICBOZGlzRmlsbE1lbW9yeShwU0hBX0NUWC0+QmxvY2sgKyBwU0hBX0NUWC0+QmxvY2tMZW4sIDEsIDB4ODApOwotCi0gICAgLyogNTUgPSA2NCAtIDggLSAxOiBhcHBlbmQgMSBiaXQoMSBieXRlKSBhbmQgbWVzc2FnZSBsZW5ndGggKDggYnl0ZXMpICovCi0gICAgaWYgKHBTSEFfQ1RYLT5CbG9ja0xlbiA+IDU1KQotICAgICAgICBTSEEyNTZfSGFzaChwU0hBX0NUWCk7Ci0gICAgICAgIC8qIEVuZCBvZiBpZiAqLwotCi0gICAgLyogQXBwZW5kIHRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiByaWdodG1vc3QgNjQgYml0cyAqLwotICAgIG1lc3NhZ2VfbGVuZ3RoX2JpdHMgPSBwU0hBX0NUWC0+TWVzc2FnZUxlbio4OwotICAgIG1lc3NhZ2VfbGVuZ3RoX2JpdHMgPSBjcHUyYmU2NChtZXNzYWdlX2xlbmd0aF9iaXRzKTsKLSAgICBOZGlzTW92ZU1lbW9yeSgmcFNIQV9DVFgtPkJsb2NrWzU2XSwgJm1lc3NhZ2VfbGVuZ3RoX2JpdHMsIDgpOwotICAgIFNIQTI1Nl9IYXNoKHBTSEFfQ1RYKTsKLQotICAgIC8qIFJldHVybiBtZXNzYWdlIGRpZ2VzdCwgdHJhbnNmb3JtIHRoZSBVSU5UMzIgaGFzaCB2YWx1ZSB0byBieXRlcyAqLwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDg7aW5kZXgrKykKLSAgICAgICAgcFNIQV9DVFgtPkhhc2hWYWx1ZVtpbmRleF0gPSBjcHUyYmUzMihwU0hBX0NUWC0+SGFzaFZhbHVlW2luZGV4XSk7Ci0gICAgICAgIC8qIEVuZCBvZiBmb3IgKi8KLSAgICBOZGlzTW92ZU1lbW9yeShEaWdlc3RNZXNzYWdlLCBwU0hBX0NUWC0+SGFzaFZhbHVlLCBTSEEyNTZfRElHRVNUX1NJWkUpOwotfSAvKiBFbmQgb2YgU0hBMjU2X0VuZCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgU0hBMjU2IGFsZ29yaXRobQotCi1Bcmd1bWVudHM6Ci0gICAgbWVzc2FnZSAgICAgICAgIE1lc3NhZ2UgY29udGV4dAotICAgIG1lc3NhZ2VMZW4gICAgICBUaGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gYnl0ZXMKLQotUmV0dXJuIFZhbHVlOgotICAgIGRpZ2VzdE1lc3NhZ2UgICBEaWdlc3QgbWVzc2FnZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRfU0hBMjU2ICgKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4sCi0gICAgT1VUIFVJTlQ4IERpZ2VzdE1lc3NhZ2VbXSkKLXsKLSAgICBTSEEyNTZfQ1RYX1NUUlVDIHNoYV9jdHg7Ci0KLSAgICBOZGlzWmVyb01lbW9yeSgmc2hhX2N0eCwgc2l6ZW9mKFNIQTI1Nl9DVFhfU1RSVUMpKTsKLSAgICBTSEEyNTZfSW5pdCgmc2hhX2N0eCk7Ci0gICAgU0hBMjU2X0FwcGVuZCgmc2hhX2N0eCwgTWVzc2FnZSwgTWVzc2FnZUxlbik7Ci0gICAgU0hBMjU2X0VuZCgmc2hhX2N0eCwgRGlnZXN0TWVzc2FnZSk7Ci19IC8qIEVuZCBvZiBSVF9TSEEyNTYgKi8KLSNlbmRpZiAvKiBTSEEyNTZfU1VQUE9SVCAqLwotCi0vKiBFbmQgb2YgY3J5cHRfc2hhMi5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9kZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2Rmcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTU3MDRhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2Rmcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDgxICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgYXBfZGZzLmMKLQotICAgIEFic3RyYWN0OgotICAgIFN1cHBvcnQgREZTIGZ1bmN0aW9uLgotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi10eXBlZGVmIHN0cnVjdCBfUkFEQVJfRFVSQVRJT05fVEFCTEUKLXsKLQlVTE9ORyBSRER1clJlZ2lvbjsKLQlVTE9ORyBSYWRhclNpZ25hbER1cmF0aW9uOwotCVVMT05HIFRvbGVyYW5jZTsKLX0gUkFEQVJfRFVSQVRJT05fVEFCTEUsICpQUkFEQVJfRFVSQVRJT05fVEFCTEU7Ci0KLQotCi1VQ0hBUiBSZElkbGVUaW1lVGFibGVbTUFYX1JEX1JFR0lPTl1bNF0gPQotewotCXs5LCAyNTAsIDI1MCwgMjUwfSwJCS8vIENFCi0jaWZkZWYgREZTX0ZDQ19CVzQwX0ZJWAotCXsxLCAyNTAsIDI1MCwgMjUwfSwJCS8vIEZDQwotI2Vsc2UKLQl7NCwgMjUwLCAyNTAsIDI1MH0sCQkvLyBGQ0MKLSNlbmRpZgotCXs0LCAyNTAsIDI1MCwgMjUwfSwJCS8vIEpBUAotCXsxNSwgMjUwLCAyNTAsIDI1MH0sCS8vIEpBUF9XNTMKLQl7NCwgMjUwLCAyNTAsIDI1MH0JCS8vIEpBUF9XNTYKLX07Ci0KLSNpZmRlZiBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUCi1zdGF0aWMgdm9pZCBUb25lUmFkYXJQcm9ncmFtKFBSVE1QX0FEQVBURVIgcEFkKTsKLXN0YXRpYyB2b2lkIFRvbmVSYWRhckVuYWJsZShQUlRNUF9BREFQVEVSIHBBZCk7Ci0jZW5kaWYgLy8gVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVCAvLwotCi0jaWZkZWYgREZTX1NVUFBPUlQKLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlCYnAgUmFkYXIgZGV0ZWN0aW9uIHJvdXRpbmUKLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQmJwUmFkYXJEZXRlY3Rpb25TdGFydCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVSU5UOCBSYWRhclBlcmlvZDsKLQotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMTQsIDB4MDIpOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjEsIDB4MjApOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjIsIDB4MDApOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjMsIDB4MDgvKjB4ODAqLyk7Ci0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyNCwgMHgyOCk7Ci0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyNSwgMHhmZik7Ci0KLSNpZmRlZiBNRVJHRV9BUkNIX1RFQU0KLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID09IEpBUCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID09IEpBUF9XNTMpIHx8IChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9PSBKQVBfVzU2KSkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gSkFQOwotCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEphcFJhZGFyVHlwZShwQWQpOwotCQlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPT0gSkFQX1c1NikKLQkJewotCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKLQkJfQotCQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9PSBKQVBfVzUzKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDE1OwotCQl9Ci0jaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAotCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IDE7Ci0jZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLwotCX0KLSNlbmRpZiAvLyBNRVJHRV9BUkNIX1RFQU0gLy8KLQotCVJhZGFyUGVyaW9kID0gKChVSU5UKVJkSWRsZVRpbWVUYWJsZVtwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbl1bMF0gKyAoVUlOVClwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSkgPCAyNTAgPwotCQkJKFJkSWRsZVRpbWVUYWJsZVtwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbl1bMF0gKyBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSkgOiAyNTA7Ci0KLSNpZmRlZiBNRVJHRV9BUkNIX1RFQU0KLQotCi0jZWxzZSAvLyBPcmlnaW5hbCBSVDI4eHggc291cmNlIGNvZGUuCi0JUlRNUF9JT19XUklURTgocEFkLCAweDcwMjAsIDB4MWQpOwotCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIxLCAweDQwKTsKLSNlbmRpZiAvLyBNRVJHRV9BUkNIX1RFQU0gLy8KLQotCVJhZGFyRGV0ZWN0aW9uU3RhcnQocEFkLCAwLCBSYWRhclBlcmlvZCk7Ci0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQmJwIFJhZGFyIGRldGVjdGlvbiByb3V0aW5lCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEJicFJhZGFyRGV0ZWN0aW9uU3RvcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlSVE1QX0lPX1dSSVRFOChwQWQsIDB4NzAyMCwgMHgxZCk7Ci0JUlRNUF9JT19XUklURTgocEFkLCAweDcwMjEsIDB4NjApOwotCi0JUmFkYXJEZXRlY3Rpb25TdG9wKHBBZCk7Ci0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUmFkYXIgZGV0ZWN0aW9uIHJvdXRpbmUKLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUmFkYXJEZXRlY3Rpb25TdGFydCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOIENUU1Byb3RlY3QsCi0JSU4gVUlOVDggQ1RTUGVyaW9kKQotewotCVVJTlQ4IERmc0FjdGl2ZVRpbWUgPSAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgJiAweDFmKTsKLQlVSU5UOCBDdHNQcm90ZWN0ID0gKENUU1Byb3RlY3QgPT0gMSkgPyAweDAyIDogMHgwMTsgLy8gQ1RTIHByb3RlY3QuCi0KLQlpZiAoQ1RTUHJvdGVjdCAhPSAwKQotCXsKLQkJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uKQotCQl7Ci0JCWNhc2UgRkNDOgotCQljYXNlIEpBUF9XNTY6Ci0JCQlDdHNQcm90ZWN0ID0gMHgwMzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSkFQOgotCQkJewotCQkJCVVDSEFSIFJERHVyUmVnaW9uOwotCQkJCVJERHVyUmVnaW9uID0gSmFwUmFkYXJUeXBlKHBBZCk7Ci0JCQkJaWYgKFJERHVyUmVnaW9uID09IEpBUF9XNTYpCi0JCQkJCUN0c1Byb3RlY3QgPSAweDAzOwotCQkJCWVsc2UKLQkJCQkJQ3RzUHJvdGVjdCA9IDB4MDI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJY2FzZSBDRToKLQkJY2FzZSBKQVBfVzUzOgotCQlkZWZhdWx0OgotCQkJQ3RzUHJvdGVjdCA9IDB4MDI7Ci0JCQlicmVhazsKLQkJfQotCX0KLQllbHNlCi0JCUN0c1Byb3RlY3QgPSAweDAxOwotCi0KLQkvLyBzZW5kIHN0YXJ0LVJEIHdpdGggQ1RTIHByb3RlY3Rpb24gY29tbWFuZCB0byBNQ1UKLQkvLyBoaWdoYnl0ZSBbN10JCXJlc2VydmUKLQkvLyBoaWdoYnl0ZSBbNjo1XQkweDogc3RvcCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbgotCS8vIGhpZ2hieXRlIFsxMF06CVN0YXJ0IENhcnJpZXIvUmFkYXIgZGV0ZWN0aW9uIHdpdGhvdXQgQ1RTIHByb3RlY3Rpb24sIDExOiBTdGFydCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbiB3aXRoIENUUyBwcm90ZWN0aW9uCi0JLy8gaGlnaGJ5dGUgWzQ6MF0JUmFkYXIvY2FycmllciBkZXRlY3Rpb24gZHVyYXRpb24uIEluIDFtcy4KLQotCS8vIGxvd2J5dGUgWzc6MF0JUmFkYXIvY2FycmllciBkZXRlY3Rpb24gcGVyaW9kLCBpbiAxbXMuCi0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDYwLCAweGZmLCBDVFNQZXJpb2QsIERmc0FjdGl2ZVRpbWUgfCAoQ3RzUHJvdGVjdCA8PCA1KSk7Ci0JLy9Bc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NjMsIDB4ZmYsIDEwLCAwKTsKLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJhZGFyIGRldGVjdGlvbiByb3V0aW5lCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCVRSVUUJRm91bmQgcmFkYXIgc2lnbmFsCi0JCUZBTFNFCU5vdCBmb3VuZCByYWRhciBzaWduYWwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUmFkYXJEZXRlY3Rpb25TdG9wKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmFkYXJEZXRlY3Rpb25TdG9wLlxuIikpOwotCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg2MCwgMHhmZiwgMHgwMCwgMHgwMCk7CS8vIHNlbmQgc3RhcnQtUkQgd2l0aCBDVFMgcHJvdGVjdGlvbiBjb21tYW5kIHRvIE1DVQotCi0JcmV0dXJuOwotfQotI2VuZGlmIC8vIERGU19TVVBQT1JUIC8vCi0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJhZGFyIGNoYW5uZWwgY2hlY2sgcm91dGluZQotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlUUlVFCW5lZWQgdG8gZG8gcmFkYXIgZGV0ZWN0Ci0JCUZBTFNFCW5lZWQgbm90IHRvIGRvIHJhZGFyIGRldGVjdAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBSYWRhckNoYW5uZWxDaGVjaygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVQ0hBUgkJCUNoKQotewotCUlOVAkJaTsKLQlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOwotCi0JZm9yIChpPTA7IGk8cEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQotCXsKLQkJaWYgKENoID09IHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCkKLQkJewotCQkJcmVzdWx0ID0gcEFkLT5DaGFubmVsTGlzdFtpXS5EZnNSZXE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLSNpZmRlZiBERlNfU1VQUE9SVAotCi1VTE9ORyBKYXBSYWRhclR5cGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUxPTkcJCWk7Ci0JY29uc3QgVUNIQVIJQ2hhbm5lbFsxNV09ezUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH07Ci0KLQlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gIT0gSkFQKQotCXsKLQkJcmV0dXJuIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uOwotCX0KLQotCWZvciAoaT0wOyBpPDE1OyBpKyspCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9PSBDaGFubmVsW2ldKQotCQl7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChpIDwgNCkKLQkJcmV0dXJuIEpBUF9XNTM7Ci0JZWxzZSBpZiAoaSA8IDE1KQotCQlyZXR1cm4gSkFQX1c1NjsKLQllbHNlCi0JCXJldHVybiBKQVA7IC8vIFc1MgotCi19Ci0KLVVMT05HIFJUTVBCYnBSZWFkUmFkYXJEdXJhdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVSU5UOCBieXRlVmFsdWUgPSAwOwotCVVMT05HIHJlc3VsdDsKLQotCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExNSwgJmJ5dGVWYWx1ZSk7Ci0KLQlyZXN1bHQgPSAwOwotCXN3aXRjaCAoYnl0ZVZhbHVlKQotCXsKLQljYXNlIDE6IC8vIHJhZGFyIHNpZ25hbCBkZXRlY3RlZCBieSBwdWxzZSBtb2RlLgotCWNhc2UgMjogLy8gcmFkYXIgc2lnbmFsIGRldGVjdGVkIGJ5IHdpZHRoIG1vZGUuCi0JCXJlc3VsdCA9IFJUTVBSZWFkUmFkYXJEdXJhdGlvbihwQWQpOwotCQlicmVhazsKLQotCWNhc2UgMDogLy8gTm8gcmFkYXIgc2lnbmFsLgotCWRlZmF1bHQ6Ci0KLQkJcmVzdWx0ID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotVUxPTkcgUlRNUFJlYWRSYWRhckR1cmF0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVMT05HIHJlc3VsdCA9IDA7Ci0KLSNpZmRlZiBERlNfU1VQUE9SVAotCVVJTlQ4IGR1cmF0aW9uMSA9IDAsIGR1cmF0aW9uMiA9IDAsIGR1cmF0aW9uMyA9IDA7Ci0KLQotCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExNiwgJmR1cmF0aW9uMSk7Ci0JQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMTE3LCAmZHVyYXRpb24yKTsKLQlCQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxMTgsICZkdXJhdGlvbjMpOwotCXJlc3VsdCA9IChkdXJhdGlvbjEgPDwgMTYpICsgKGR1cmF0aW9uMiA8PCA4KSArIGR1cmF0aW9uMzsKLSNlbmRpZiAvLyBERlNfU1VQUE9SVCAvLwotCi0JcmV0dXJuIHJlc3VsdDsKLQotfQotCi1WT0lEIFJUTVBDbGVhblJhZGFyRHVyYXRpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JcmV0dXJuOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIFJhZGFyIHdhdmUgZGV0ZWN0aW9uLiBUaGUgQVBJIHNob3VsZCBiZSBpbnZva2UgZWFjaCBzZWNvbmQuCi0KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIHBBZCAgICAgICAgIC0gQWRhcHRlciBwb2ludGVyCi0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5vbmUKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQXBSYWRhckRldGVjdFBlcmlvZGljKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCUlOVAlpOwotCi0JcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuSW5TZXJ2aWNlTW9uaXRvckNvdW50Kys7Ci0KLQlmb3IgKGk9MDsgaTxwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCi0JewotCi0JCWlmIChwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgPiAwKQotCQl7Ci0JCQlwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgLS07Ci0JCQlpZiAoKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kJTUpID09IDApCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFkYXJEZXRlY3RQZXJpb2RpYyAtIGNoPSVkLCBSZW1haW5pbmdUaW1lRm9yVXNlPSVkXG4iLCBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLy9yYWRhciBkZXRlY3QKLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCi0JCSYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCi0JewotCQlSYWRhckRldGVjdFBlcmlvZGljKHBBZCk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vLyBQZXJpb2RpYyBSYWRhciBkZXRlY3Rpb24sIHN3aXRjaCBjaGFubmVsIHdpbGwgb2NjdXIgaW4gUlRNUEhhbmRsZVRCVFRJbnRlcnJ1cHQoKQotLy8gQmVmb3JlIHN3aXRjaCBjaGFubmVsLCBkcml2ZXIgbmVlZHMgZG9pbmcgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50LgotVk9JRCBSYWRhckRldGVjdFBlcmlvZGljKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCi0JLy8gbmVlZCB0byBjaGVjayBjaGFubmVsIGF2YWlsYWJpbGl0eSwgYWZ0ZXIgc3dpdGNoIGNoYW5uZWwKLQlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX1NJTEVOQ0VfTU9ERSkKLQkJCXJldHVybjsKLQotCi0KLQkvLyBjaGFubmVsIGF2YWlsYWJpbGl0eSBjaGVjayB0aW1lIGlzIDYwc2VjLCB1c2UgNjUgZm9yIGFzc3VyYW5jZQotCWlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRENvdW50KysgPiBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DaE1vdmluZ1RpbWUpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb3QgZm91bmQgcmFkYXIgc2lnbmFsLCBzdGFydCBzZW5kIGJlYWNvbiBhbmQgcmFkYXIgZGV0ZWN0aW9uIGluIHNlcnZpY2UgbW9uaXRvclxuXG4iKSk7Ci0JCUJicFJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOwotCi0KLQkJQXNpY0VuYWJsZUJzc1N5bmMocEFkKTsKLQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfTk9STUFMX01PREU7Ci0KLQotCi0JCXJldHVybjsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0jZW5kaWYgLy8gREZTX1NVUFBPUlQgLy8KLQotI2lmZGVmIERGU19TVVBQT1JUCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0JCWNoYW5nZSBjaGFubmVsIG1vdmluZyB0aW1lIGZvciBERlMgdGVzdGluZy4KLQotCUFyZ3VtZW50czoKLQkgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50Ci0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5vbmUKLQotICAgIE5vdGU6Ci0gICAgICAgIFVzYWdlOgotICAgICAgICAgICAgICAgMS4pIGl3cHJpdiByYTAgc2V0IENoTW92VGltZT1bdmFsdWVdCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0NoTW92aW5nVGltZV9Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBTVFJJTkcgYXJnKQotewotCVVJTlQ4IFZhbHVlOwotCi0JVmFsdWUgPSAoVUlOVDgpIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DaE1vdmluZ1RpbWUgPSBWYWx1ZTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjogJWRcbiIsIF9fRlVOQ1RJT05fXywKLQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UIFNldF9Mb25nUHVsc2VSYWRhclRoX1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFNUUklORyBhcmcpCi17Ci0JVUlOVDggVmFsdWU7Ci0KLQlWYWx1ZSA9IChVSU5UOCkgc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA+IDEwID8gMTAgOiBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCA9IFZhbHVlOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiAlZFxuIiwgX19GVU5DVElPTl9fLAotCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5Mb25nUHVsc2VSYWRhclRoKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZiAvLyBERlNfU1VQUE9SVCAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vZWVfZWZ1c2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2VlX2VmdXNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MWUzMDUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vZWVfZWZ1c2UuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NDggKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQllZV9lZnVzZS5jCi0KLQlBYnN0cmFjdDoKLQlNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0JLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotI2RlZmluZSBFRlVTRV9VU0FHRV9NQVBfU1RBUlQJMHgyZDAKLSNkZWZpbmUgRUZVU0VfVVNBR0VfTUFQX0VORAkJMHgyZmMKLSNkZWZpbmUgRUZVU0VfVVNBR0VfTUFQX1NJWkUJNDUKLQotCi0KLSNkZWZpbmUgRUZVU0VfRUVQUk9NX0RFRlVMVF9GSUxFCSJSVDMweHhFRVBST00uYmluIgotI2RlZmluZSBNQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUJMTAyNAotCi0KLQotI2RlZmluZSBFRlVTRV9UQUcJCQkJMHgyZmUKLQotCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfRUZVU0VfQ1RSTF9TVFJVQyB7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyICAgICAgICAgICAgU0VMX0VGVVNFOjE7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9LSUNLOjE7Ci0JCVVJTlQzMiAgICAgICAgICAgIFJFU0VSVkVEOjQ7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9BSU46MTA7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9MRE9fT05fVElNRToyOwotCQlVSU5UMzIgICAgICAgICAgICBFRlNST01fTERPX09GRl9USU1FOjY7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9NT0RFOjI7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9BT1VUOjY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlFRlVTRV9DVFJMX1NUUlVDLCAqUEVGVVNFX0NUUkxfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfRUZVU0VfQ1RSTF9TVFJVQyB7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX0FPVVQ6NjsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX01PREU6MjsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX0xET19PRkZfVElNRTo2OwotCQlVSU5UMzIgICAgICAgICAgICBFRlNST01fTERPX09OX1RJTUU6MjsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX0FJTjoxMDsKLQkJVUlOVDMyICAgICAgICAgICAgUkVTRVJWRUQ6NDsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX0tJQ0s6MTsKLQkJVUlOVDMyICAgICAgICAgICAgU0VMX0VGVVNFOjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlFRlVTRV9DVFJMX1NUUlVDLCAqUEVGVVNFX0NUUkxfU1RSVUM7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCi1zdGF0aWMgVUNIQVIgZUZ1c2VSZWFkUmVnaXN0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlPVVQJVVNIT1JUKiBwRGF0YSk7Ci0KLXN0YXRpYyBWT0lEIGVGdXNlUmVhZFBoeXNpY2FsKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVU0hPUlQgbHBJbkJ1ZmZlciwKLQlJTglVTE9ORyBuSW5CdWZmZXJTaXplLAotCU9VVAlQVVNIT1JUIGxwT3V0QnVmZmVyLAotCUlOCVVMT05HIG5PdXRCdWZmZXJTaXplKTsKLQotc3RhdGljIFZPSUQgZUZ1c2VQaHlzaWNhbFdyaXRlUmVnaXN0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlPVVQJVVNIT1JUKiBwRGF0YSk7Ci0KLXN0YXRpYyBOVFNUQVRVUyBlRnVzZVdyaXRlUmVnaXN0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlJTglVU0hPUlQqIHBEYXRhKTsKLQotc3RhdGljIFZPSUQgZUZ1c2VXcml0ZVBoeXNpY2FsKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCVBVU0hPUlQgbHBJbkJ1ZmZlciwKLQlVTE9ORyBuSW5CdWZmZXJTaXplLAotCVBVQ0hBUiBscE91dEJ1ZmZlciwKLQlVTE9ORyBuT3V0QnVmZmVyU2l6ZSk7Ci0KLQotc3RhdGljIE5UU1RBVFVTIGVGdXNlV3JpdGVSZWdpc3RlcnNGcm9tQmluKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlJTglVU0hPUlQqIHBEYXRhKTsKLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JTm90ZToKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUNIQVIgZUZ1c2VSZWFkUmVnaXN0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlPVVQJVVNIT1JUKiBwRGF0YSkKLXsKLQlFRlVTRV9DVFJMX1NUUlVDCQllRnVzZUN0cmxTdHJ1YzsKLQlpbnQJaTsKLQlVU0hPUlQJZWZ1c2VEYXRhT2Zmc2V0OwotCVVJTlQzMglkYXRhOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsU3RydWMud29yZCk7Ci0KLQkvL1N0ZXAwLiBXcml0ZSAxMC1iaXQgb2YgYWRkcmVzcyB0byBFRlNST01fQUlOICgweDU4MCwgYml0MjU6Yml0MTYpLiBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25tZW50LgotCS8vVXNlIHRoZSBlZXByb20gbG9naWNhbCBhZGRyZXNzIGFuZCBjb3ZlcnQgdG8gYWRkcmVzcyB0byBibG9jayBudW1iZXIKLQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fQUlOID0gT2Zmc2V0ICYgMHhmZmYwOwotCi0JLy9TdGVwMS4gV3JpdGUgRUZTUk9NX01PREUgKDB4NTgwLCBiaXQ3OmJpdDYpIHRvIDAuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX01PREUgPSAwOwotCi0JLy9TdGVwMi4gV3JpdGUgRUZTUk9NX0tJQ0sgKDB4NTgwLCBiaXQzMCkgdG8gMSB0byBraWNrLW9mZiBwaHlzaWNhbCByZWFkIHByb2NlZHVyZS4KLQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9IDE7Ci0KLQlOZGlzTW92ZU1lbW9yeSgmZGF0YSwgJmVGdXNlQ3RybFN0cnVjLCA0KTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRlVTRV9DVFJMLCBkYXRhKTsKLQotCS8vU3RlcDMuIFBvbGxpbmcgRUZTUk9NX0tJQ0soMHg1ODAsIGJpdDMwKSB1bnRpbCBpdCBiZWNvbWUgMCBhZ2Fpbi4KLQlpID0gMDsKLQl3aGlsZShpIDwgNTAwKQotCXsKLQkJLy9ydG1wLkh3TWVtb3J5UmVhZER3b3JkKEVGVVNFX0NUUkwsIChEV09SRCAqKSAmZUZ1c2VDdHJsU3RydWMsIDQpOwotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsICZlRnVzZUN0cmxTdHJ1Yy53b3JkKTsKLQkJaWYoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPT0gMCkKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQkJUlRNUHVzZWNEZWxheSgyKTsKLQkJaSsrOwotCX0KLQotCS8vaWYgRUZTUk9NX0FPVVQgaXMgbm90IGZvdW5kIGluIHBoeXNpY2FsIGFkZHJlc3MsIHdyaXRlIDB4ZmZmZgotCWlmIChlRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fQU9VVCA9PSAweDNmKQotCXsKLQkJZm9yKGk9MDsgaTxMZW5ndGgvMjsgaSsrKQotCQkJKihwRGF0YSsyKmkpID0gMHhmZmZmOwotCX0KLQllbHNlCi0JewotCQkvL1N0ZXA0LiBSZWFkIDE2LWJ5dGUgb2YgZGF0YSBmcm9tIEVGVVNFX0RBVEEwLTMgKDB4NTkwLTB4NTlDKQotCQllZnVzZURhdGFPZmZzZXQgPSAgRUZVU0VfREFUQTMgLSAoT2Zmc2V0ICYgMHhDKTsKLQkJLy9kYXRhIGhvbGQgNCBieXRlcyBkYXRhLgotCQkvL0luIFJUTVBfSU9fUkVBRDMyIHdpbGwgYXV0b21hdGljYWxseSBleGVjdXRlIDMyLWJ5dGVzIHN3YXBwaW5nCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgZWZ1c2VEYXRhT2Zmc2V0LCAmZGF0YSk7Ci0JCS8vRGVjaWRlIHRoZSB1cHBlciAyIGJ5dGVzIG9yIHRoZSBib3R0b20gMiBieXRlcy4KLQkJLy8gTGl0dGxlLWVuZGlhbgkJUwl8CVMJQmlnLWVuZGlhbgotCQkvLyBhZGRyCTMJMgkxCTAJfAkwCTEJMgkzCi0JCS8vIE9yaS1WCUQJQwlCCUEJfAlBCUIJQwlECi0JCS8vQWZ0ZXIgc3dhcHBpbmcKLQkJLy8JCUQJQwlCCUEJfAlECUMJQglBCi0JCS8vUmV0dXJuIDItYnl0ZXMKLQkJLy9UaGUgcmV0dXJuIGJ5dGUgc3RhdHJzIGZyb20gUy4gVGhlcmVmb3JlLCB0aGUgbGl0dGxlLWVuZGlhbiB3aWxsIHJldHVybiBCQSwgdGhlIEJpZy1lbmRpYW4gd2lsbCByZXR1cm4gREMuCi0JCS8vRm9yIHJldHVybmluZyB0aGUgYm90dG9tIDIgYnl0ZXMsIHRoZSBCaWctZW5kaWFuIHNob3VsZCBzaGlmdCByaWdodCAyLWJ5dGVzLgotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQkJZGF0YSA9IGRhdGEgPDwgKDgqKChPZmZzZXQgJiAweDMpXjB4MikpOwotI2Vsc2UKLQkJZGF0YSA9IGRhdGEgPj4gKDgqKE9mZnNldCAmIDB4MykpOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQotCQlOZGlzTW92ZU1lbW9yeShwRGF0YSwgJmRhdGEsIExlbmd0aCk7Ci0JfQotCi0JcmV0dXJuIChVQ0hBUikgZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FPVVQ7Ci0KLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUIE9mZnNldCwKLQlJTglVU0hPUlQgTGVuZ3RoLAotCU9VVAlVU0hPUlQqIHBEYXRhKQotewotCUVGVVNFX0NUUkxfU1RSVUMJCWVGdXNlQ3RybFN0cnVjOwotCWludAlpOwotCVVTSE9SVAllZnVzZURhdGFPZmZzZXQ7Ci0JVUlOVDMyCWRhdGE7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsICZlRnVzZUN0cmxTdHJ1Yy53b3JkKTsKLQotCS8vU3RlcDAuIFdyaXRlIDEwLWJpdCBvZiBhZGRyZXNzIHRvIEVGU1JPTV9BSU4gKDB4NTgwLCBiaXQyNTpiaXQxNikuIFRoZSBhZGRyZXNzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbm1lbnQuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FJTiA9IE9mZnNldCAmIDB4ZmZmMDsKLQotCS8vU3RlcDEuIFdyaXRlIEVGU1JPTV9NT0RFICgweDU4MCwgYml0NzpiaXQ2KSB0byAxLgotCS8vUmVhZCBpbiBwaHlzaWNhbCB2aWV3Ci0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX01PREUgPSAxOwotCi0JLy9TdGVwMi4gV3JpdGUgRUZTUk9NX0tJQ0sgKDB4NTgwLCBiaXQzMCkgdG8gMSB0byBraWNrLW9mZiBwaHlzaWNhbCByZWFkIHByb2NlZHVyZS4KLQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9IDE7Ci0KLQlOZGlzTW92ZU1lbW9yeSgmZGF0YSwgJmVGdXNlQ3RybFN0cnVjLCA0KTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRlVTRV9DVFJMLCBkYXRhKTsKLQotCS8vU3RlcDMuIFBvbGxpbmcgRUZTUk9NX0tJQ0soMHg1ODAsIGJpdDMwKSB1bnRpbCBpdCBiZWNvbWUgMCBhZ2Fpbi4KLQlpID0gMDsKLQl3aGlsZShpIDwgNTAwKQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsU3RydWMud29yZCk7Ci0JCWlmKGVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID09IDApCi0JCQlicmVhazsKLQkJUlRNUHVzZWNEZWxheSgyKTsKLQkJaSsrOwotCX0KLQotCS8vU3RlcDQuIFJlYWQgMTYtYnl0ZSBvZiBkYXRhIGZyb20gRUZVU0VfREFUQTAtMyAoMHg1OUMtMHg1OTApCi0JLy9CZWNhdXNlIHRoZSBzaXplIG9mIGVhY2ggRUZVU0VfREFUQSBpcyA0IEJ5dGVzLCB0aGUgc2l6ZSBvZiBhZGRyZXNzIG9mIGVhY2ggaXMgMiBiaXRzLgotCS8vVGhlIHByZXZpb3VzIDIgYml0cyBpcyB0aGUgRUZVU0VfREFUQSBudW1iZXIsIHRoZSBsYXN0IDIgYml0cyBpcyB1c2VkIHRvIGRlY2lkZSB3aGljaCBieXRlcwotCS8vRGVjaWRlIHdoaWNoIEVGVVNFX0RBVEEgdG8gcmVhZAotCS8vNTkwOkYgRSBEIEMKLQkvLzU5NDpCIEEgOSA4Ci0JLy81OTg6NyA2IDUgNAotCS8vNTlDOjMgMiAxIDAKLQllZnVzZURhdGFPZmZzZXQgPSAgRUZVU0VfREFUQTMgLSAoT2Zmc2V0ICYgMHhDKSAgOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBlZnVzZURhdGFPZmZzZXQsICZkYXRhKTsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQkJZGF0YSA9IGRhdGEgPDwgKDgqKChPZmZzZXQgJiAweDMpXjB4MikpOwotI2Vsc2UKLQlkYXRhID0gZGF0YSA+PiAoOCooT2Zmc2V0ICYgMHgzKSk7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCi0JTmRpc01vdmVNZW1vcnkocERhdGEsICZkYXRhLCBMZW5ndGgpOwotCi19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlOb3RlOgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgVk9JRCBlRnVzZVJlYWRQaHlzaWNhbCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVVNIT1JUIGxwSW5CdWZmZXIsCi0JSU4JVUxPTkcgbkluQnVmZmVyU2l6ZSwKLQlPVVQJUFVTSE9SVCBscE91dEJ1ZmZlciwKLQlJTglVTE9ORyBuT3V0QnVmZmVyU2l6ZQotKQotewotCVVTSE9SVCogcEluQnVmID0gKFVTSE9SVCopbHBJbkJ1ZmZlcjsKLQlVU0hPUlQqIHBPdXRCdWYgPSAoVVNIT1JUKilscE91dEJ1ZmZlcjsKLQotCVVTSE9SVCBPZmZzZXQgPSBwSW5CdWZbMF07CQkJCQkvL2FkZHIKLQlVU0hPUlQgTGVuZ3RoID0gcEluQnVmWzFdOwkJCQkJLy9sZW5ndGgKLQlpbnQJCWk7Ci0KLQlmb3IoaT0wOyBpPExlbmd0aDsgaSs9MikKLQl7Ci0JCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCxPZmZzZXQraSwgMiwgJnBPdXRCdWZbaS8yXSk7Ci0JfQotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JTm90ZToKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTlRTVEFUVVMgZUZ1c2VSZWFkKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlPVVQJUFVDSEFSCQkJcERhdGEsCi0JSU4JVVNIT1JUCQkJTGVuZ3RoKQotewotCVVTSE9SVCogcE91dEJ1ZiA9IChVU0hPUlQqKXBEYXRhOwotCU5UU1RBVFVTIFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCVVDSEFSCUVGU1JPTV9BT1VUOwotCWludAlpOwotCi0JZm9yKGk9MDsgaTxMZW5ndGg7IGkrPTIpCi0JewotCQlFRlNST01fQU9VVCA9IGVGdXNlUmVhZFJlZ2lzdGVycyhwQWQsIE9mZnNldCtpLCAyLCAmcE91dEJ1ZltpLzJdKTsKLQl9Ci0JcmV0dXJuIFN0YXR1czsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBWT0lEIGVGdXNlUGh5c2ljYWxXcml0ZVJlZ2lzdGVycygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQgT2Zmc2V0LAotCUlOCVVTSE9SVCBMZW5ndGgsCi0JT1VUCVVTSE9SVCogcERhdGEpCi17Ci0JRUZVU0VfQ1RSTF9TVFJVQwkJZUZ1c2VDdHJsU3RydWM7Ci0JaW50CWk7Ci0JVVNIT1JUCWVmdXNlRGF0YU9mZnNldDsKLQlVSU5UMzIJZGF0YSwgZUZ1c2VEYXRhQnVmZmVyWzRdOwotCi0JLy9TdGVwMC4gV3JpdGUgMTYtYnl0ZSBvZiBkYXRhIHRvIEVGVVNFX0RBVEEwLTMgKDB4NTkwLTB4NTlDKSwgd2hlcmUgRUZVU0VfREFUQTAgaXMgdGhlIExTQiBEVywgRUZVU0VfREFUQTMgaXMgdGhlIE1TQiBEVy4KLQotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy9yZWFkIGN1cnJlbnQgdmFsdWVzIG9mIDE2LWJ5dGUgYmxvY2sKLQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsICAmZUZ1c2VDdHJsU3RydWMud29yZCk7Ci0KLQkvL1N0ZXAwLiBXcml0ZSAxMC1iaXQgb2YgYWRkcmVzcyB0byBFRlNST01fQUlOICgweDU4MCwgYml0MjU6Yml0MTYpLiBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25tZW50LgotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9BSU4gPSBPZmZzZXQgJiAweGZmZjA7Ci0KLQkvL1N0ZXAxLiBXcml0ZSBFRlNST01fTU9ERSAoMHg1ODAsIGJpdDc6Yml0NikgdG8gMS4KLQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fTU9ERSA9IDE7Ci0KLQkvL1N0ZXAyLiBXcml0ZSBFRlNST01fS0lDSyAoMHg1ODAsIGJpdDMwKSB0byAxIHRvIGtpY2stb2ZmIHBoeXNpY2FsIHJlYWQgcHJvY2VkdXJlLgotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID0gMTsKLQotCU5kaXNNb3ZlTWVtb3J5KCZkYXRhLCAmZUZ1c2VDdHJsU3RydWMsIDQpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVGVVNFX0NUUkwsIGRhdGEpOwotCi0JLy9TdGVwMy4gUG9sbGluZyBFRlNST01fS0lDSygweDU4MCwgYml0MzApIHVudGlsIGl0IGJlY29tZSAwIGFnYWluLgotCWkgPSAwOwotCXdoaWxlKGkgPCA1MDApCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsICZlRnVzZUN0cmxTdHJ1Yy53b3JkKTsKLQotCQlpZihlRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9PSAwKQotCQkJYnJlYWs7Ci0JCVJUTVB1c2VjRGVsYXkoMik7Ci0JCWkrKzsKLQl9Ci0KLQkvL1N0ZXA0LiBSZWFkIDE2LWJ5dGUgb2YgZGF0YSBmcm9tIEVGVVNFX0RBVEEwLTMgKDB4NTlDLTB4NTkwKQotCWVmdXNlRGF0YU9mZnNldCA9ICBFRlVTRV9EQVRBMzsKLQlmb3IoaT0wOyBpPCA0OyBpKyspCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIGVmdXNlRGF0YU9mZnNldCwgKFBVSU5UMzIpICZlRnVzZURhdGFCdWZmZXJbaV0pOwotCQllZnVzZURhdGFPZmZzZXQgLT0gIDQ7Ci0JfQotCi0JLy9VcGRhdGUgdGhlIHZhbHVlLCB0aGUgb2Zmc2V0IGlzIG11bHRpcGxlIG9mIDIsIGxlbmd0aCBpcyAyCi0JZWZ1c2VEYXRhT2Zmc2V0ID0gKE9mZnNldCAmIDB4YykgPj4gMjsKLQlkYXRhID0gcERhdGFbMF0gJiAweGZmZmY7Ci0JLy9UaGUgb2Zmc2V0IHNob3VsZCBiZSAweCoqKjEwIG9yIDB4KioqMDAKLQlpZigoT2Zmc2V0ICUgNCkgIT0gMCkKLQl7Ci0JCWVGdXNlRGF0YUJ1ZmZlcltlZnVzZURhdGFPZmZzZXRdID0gKGVGdXNlRGF0YUJ1ZmZlcltlZnVzZURhdGFPZmZzZXRdICYgMHhmZmZmKSB8IChkYXRhIDw8IDE2KTsKLQl9Ci0JZWxzZQotCXsKLQkJZUZ1c2VEYXRhQnVmZmVyW2VmdXNlRGF0YU9mZnNldF0gPSAoZUZ1c2VEYXRhQnVmZmVyW2VmdXNlRGF0YU9mZnNldF0gJiAweGZmZmYwMDAwKSB8IGRhdGE7Ci0JfQotCi0JZWZ1c2VEYXRhT2Zmc2V0ID0gIEVGVVNFX0RBVEEzOwotCWZvcihpPTA7IGk8IDQ7IGkrKykKLQl7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIGVmdXNlRGF0YU9mZnNldCwgZUZ1c2VEYXRhQnVmZmVyW2ldKTsKLQkJZWZ1c2VEYXRhT2Zmc2V0IC09IDQ7Ci0JfQotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQkvL1N0ZXAxLiBXcml0ZSAxMC1iaXQgb2YgYWRkcmVzcyB0byBFRlNST01fQUlOICgweDU4MCwgYml0MjU6Yml0MTYpLiBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25tZW50LgotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsU3RydWMud29yZCk7Ci0KLQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fQUlOID0gT2Zmc2V0ICYgMHhmZmYwOwotCi0JLy9TdGVwMi4gV3JpdGUgRUZTUk9NX01PREUgKDB4NTgwLCBiaXQ3OmJpdDYpIHRvIDMuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX01PREUgPSAzOwotCi0JLy9TdGVwMy4gV3JpdGUgRUZTUk9NX0tJQ0sgKDB4NTgwLCBiaXQzMCkgdG8gMSB0byBraWNrLW9mZiBwaHlzaWNhbCB3cml0ZSBwcm9jZWR1cmUuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPSAxOwotCi0JTmRpc01vdmVNZW1vcnkoJmRhdGEsICZlRnVzZUN0cmxTdHJ1YywgNCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRUZVU0VfQ1RSTCwgZGF0YSk7Ci0KLQkvL1N0ZXA0LiBQb2xsaW5nIEVGU1JPTV9LSUNLKDB4NTgwLCBiaXQzMCkgdW50aWwgaXQgYmVjb21lIDAgYWdhaW4uIEl077+977+9cyBkb25lLgotCWkgPSAwOwotCi0Jd2hpbGUoaSA8IDUwMCkKLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgJmVGdXNlQ3RybFN0cnVjLndvcmQpOwotCi0JCWlmKGVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID09IDApCi0JCQlicmVhazsKLQotCQlSVE1QdXNlY0RlbGF5KDIpOwotCQlpKys7Ci0JfQotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JTm90ZToKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIE5UU1RBVFVTIGVGdXNlV3JpdGVSZWdpc3RlcnMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUIE9mZnNldCwKLQlJTglVU0hPUlQgTGVuZ3RoLAotCUlOCVVTSE9SVCogcERhdGEpCi17Ci0JVVNIT1JUCWksTG9vcD0wOwotCVVTSE9SVAllRnVzZURhdGE7Ci0JVVNIT1JUCUxvZ2ljYWxBZGRyZXNzLCBCbGtOdW0gPSAweGZmZmY7Ci0JVUNIQVIJRUZTUk9NX0FPVVQ7Ci0KLQlVU0hPUlQgYWRkcix0bXBhZGRyLCBJbkJ1ZlszXSwgdG1wT2Zmc2V0OwotCVVTSE9SVCBidWZmZXJbOF07Ci0JQk9PTEVBTgkJYldyaXRlU3VjY2VzcyA9IFRSVUU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzIE9mZnNldD0leCwgcERhdGE9JXhcbiIsIE9mZnNldCwgKnBEYXRhKSk7Ci0KLQkvL1N0ZXAgMC4gZmluZCB0aGUgZW50cnkgaW4gdGhlIG1hcHBpbmcgdGFibGUKLQkvL1RoZSBhZGRyZXNzIG9mIEVFUFJPTSBpcyAyLWJ5dGVzIGFsaWdubWVudC4KLQkvL1RoZSBsYXN0IGJpdCBpcyB1c2VkIGZvciBhbGlnbm1lbnQsIHNvIGl0IG11c3QgYmUgMC4KLQl0bXBPZmZzZXQgPSBPZmZzZXQgJiAweGZmZmU7Ci0JRUZTUk9NX0FPVVQgPSBlRnVzZVJlYWRSZWdpc3RlcnMocEFkLCB0bXBPZmZzZXQsIDIsICZlRnVzZURhdGEpOwotCi0JaWYoIEVGU1JPTV9BT1VUID09IDB4M2YpCi0JewkvL2ZpbmQgYXZhaWxhYmxlIGxvZ2ljYWwgYWRkcmVzcyBwb2ludGVyCi0JCS8vdGhlIGxvZ2ljYWwgYWRkcmVzcyBkb2VzIG5vdCBleGlzdCwgZmluZCBhbiBlbXB0eSBvbmUKLQkJLy9mcm9tIHRoZSBmaXJzdCBhZGRyZXNzIG9mIGJsb2NrIDQ1PTE2KjQ1PTB4MmQwIHRvIHRoZSBsYXN0IGFkZHJlc3Mgb2YgYmxvY2sgNDcKLQkJLy89PT40OCoxNi0zKHJlc2VydmVkKT0yRkMKLQkJZm9yIChpPUVGVVNFX1VTQUdFX01BUF9TVEFSVDsgaTw9RUZVU0VfVVNBR0VfTUFQX0VORDsgaSs9MikKLQkJewotCQkJLy9SZXRyaXZlIHRoZSBsb2dpY2FsIGJsb2NrIG51Ym1lciBmb3JtIGVhY2ggbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIKLQkJCS8vSXQgd2lsbCBhY2Nlc3MgdHdvIGxvZ2ljYWwgYWRkcmVzcyBwb2ludGVyIGVhY2ggdGltZS4KLQkJCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCwgaSwgMiwgJkxvZ2ljYWxBZGRyZXNzKTsKLQkJCWlmKCAoTG9naWNhbEFkZHJlc3MgJiAweGZmKSA9PSAwKQotCQkJey8vTm90IHVzZWQgbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIKLQkJCQlCbGtOdW0gPSBpLUVGVVNFX1VTQUdFX01BUF9TVEFSVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYoKCAoTG9naWNhbEFkZHJlc3MgPj4gOCkgJiAweGZmKSA9PSAwKQotCQkJey8vTm90IHVzZWQgbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIKLQkJCQlpZiAoaSAhPSBFRlVTRV9VU0FHRV9NQVBfRU5EKQotCQkJCXsKLQkJCQkJQmxrTnVtID0gaS1FRlVTRV9VU0FHRV9NQVBfU1RBUlQrMTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJQmxrTnVtID0gRUZTUk9NX0FPVVQ7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZUZ1c2VXcml0ZVJlZ2lzdGVycyBCbGtOdW0gPSAlZCBcbiIsIEJsa051bSkpOwotCi0JaWYoQmxrTnVtID09IDB4ZmZmZikKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnM6IG91dCBvZiBmcmVlIEUtZnVzZSBzcGFjZSEhIVxuIikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JLy9TdGVwIDEuIFNhdmUgZGF0YSBvZiB0aGlzIGJsb2NrCXdoaWNoIGlzIHBvaW50ZWQgYnkgdGhlIGF2YWlibGUgbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIKLQkvLyByZWFkIGFuZCBzYXZlIHRoZSBvcmlnaW5hbCBibG9jayBkYXRhCi0JZm9yKGkgPTA7IGk8ODsgaSsrKQotCXsKLQkJYWRkciA9IEJsa051bSAqIDB4MTAgOwotCi0JCUluQnVmWzBdID0gYWRkcisyKmk7Ci0JCUluQnVmWzFdID0gMjsKLQkJSW5CdWZbMl0gPSAweDA7Ci0KLQkJZUZ1c2VSZWFkUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDQsICZJbkJ1ZlsyXSwgMik7Ci0KLQkJYnVmZmVyW2ldID0gSW5CdWZbMl07Ci0JfQotCi0JLy9TdGVwIDIuIFVwZGF0ZSB0aGUgZGF0YSBpbiBidWZmZXIsIGFuZCB3cml0ZSB0aGUgZGF0YSB0byBFZnVzZQotCWJ1ZmZlclsgKE9mZnNldCA+PiAxKSAlIDhdID0gcERhdGFbMF07Ci0KLQlkbwotCXsJTG9vcCsrOwotCQkvL1N0ZXAgMy4gV3JpdGUgdGhlIGRhdGEgdG8gRWZ1c2UKLQkJaWYoIWJXcml0ZVN1Y2Nlc3MpCi0JCXsKLQkJCWZvcihpID0wOyBpPDg7IGkrKykKLQkJCXsKLQkJCQlhZGRyID0gQmxrTnVtICogMHgxMCA7Ci0KLQkJCQlJbkJ1ZlswXSA9IGFkZHIrMippOwotCQkJCUluQnVmWzFdID0gMjsKLQkJCQlJbkJ1ZlsyXSA9IGJ1ZmZlcltpXTsKLQotCQkJCWVGdXNlV3JpdGVQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNiwgTlVMTCwgMik7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkJYWRkciA9IEJsa051bSAqIDB4MTAgOwotCi0JCQkJSW5CdWZbMF0gPSBhZGRyKyhPZmZzZXQgJSAxNik7Ci0JCQkJSW5CdWZbMV0gPSAyOwotCQkJCUluQnVmWzJdID0gcERhdGFbMF07Ci0KLQkJCQllRnVzZVdyaXRlUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDYsIE5VTEwsIDIpOwotCQl9Ci0KLQkJLy9TdGVwIDQuIFdyaXRlIG1hcHBpbmcgdGFibGUKLQkJYWRkciA9IEVGVVNFX1VTQUdFX01BUF9TVEFSVCtCbGtOdW07Ci0KLQkJdG1wYWRkciA9IGFkZHI7Ci0KLQkJaWYoYWRkciAlIDIgIT0gMCkKLQkJCWFkZHIgPSBhZGRyIC0xOwotCQlJbkJ1ZlswXSA9IGFkZHI7Ci0JCUluQnVmWzFdID0gMjsKLQotCQkvL2NvbnZlcnQgdGhlIGFkZHJlc3MgZnJvbSAxMCB0byA4IGJpdCAoIGJpdDcsIDYgPSBwYXJpdHkgYW5kIGJpdDUgfiAwID0gYml0OX40KSwgYW5kIHdyaXRlIHRvIGxvZ2ljYWwgbWFwIGVudHJ5Ci0JCXRtcE9mZnNldCA9IE9mZnNldDsKLQkJdG1wT2Zmc2V0ID4+PSA0OwotCQl0bXBPZmZzZXQgfD0gKCh+KCh0bXBPZmZzZXQgJiAweDAxKSBeICggdG1wT2Zmc2V0ID4+IDEgJiAweDAxKSBeICAodG1wT2Zmc2V0ID4+IDIgJiAweDAxKSBeICAodG1wT2Zmc2V0ID4+IDMgJiAweDAxKSkpIDw8IDYpICYgMHg0MDsKLQkJdG1wT2Zmc2V0IHw9ICgofiggKHRtcE9mZnNldCA+PiAyICYgMHgwMSkgXiAodG1wT2Zmc2V0ID4+IDMgJiAweDAxKSBeICh0bXBPZmZzZXQgPj4gNCAmIDB4MDEpIF4gKCB0bXBPZmZzZXQgPj4gNSAmIDB4MDEpKSkgPDwgNykgJiAweDgwOwotCi0JCS8vIHdyaXRlIHRoZSBsb2dpY2FsIGFkZHJlc3MKLQkJaWYodG1wYWRkciUyICE9IDApCi0JCQlJbkJ1ZlsyXSA9IHRtcE9mZnNldDw8ODsKLQkJZWxzZQotCQkJSW5CdWZbMl0gPSB0bXBPZmZzZXQ7Ci0KLQkJZUZ1c2VXcml0ZVBoeXNpY2FsKHBBZCwmSW5CdWZbMF0sIDYsIE5VTEwsIDApOwotCi0JCS8vU3RlcCA1LiBDb21wYXJlIGRhdGEgaWYgbm90IHRoZSBzYW1lLCBpbnZhbGlkYXRlIHRoZSBtYXBwaW5nIGVudHJ5LCB0aGVuIHJlLXdyaXRlIHRoZSBkYXRhIHVudGlsIEUtZnVzZSBpcyBleGhhdXN0ZWQKLQkJYldyaXRlU3VjY2VzcyA9IFRSVUU7Ci0JCWZvcihpID0wOyBpPDg7IGkrKykKLQkJewotCQkJYWRkciA9IEJsa051bSAqIDB4MTAgOwotCi0JCQlJbkJ1ZlswXSA9IGFkZHIrMippOwotCQkJSW5CdWZbMV0gPSAyOwotCQkJSW5CdWZbMl0gPSAweDA7Ci0KLQkJCWVGdXNlUmVhZFBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA0LCAmSW5CdWZbMl0sIDIpOwotCi0JCQlpZihidWZmZXJbaV0gIT0gSW5CdWZbMl0pCi0JCQl7Ci0JCQkJYldyaXRlU3VjY2VzcyA9IEZBTFNFOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLy9TdGVwIDYuIGludmxpZGF0ZSBtYXBwaW5nIGVudHJ5IGFuZCBmaW5kIGEgZnJlZSBtYXBwaW5nIGVudHJ5IGlmIG5vdCBzdWNjZWVkCi0JCWlmICghYldyaXRlU3VjY2VzcykKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm90IGJXcml0ZVN1Y2Nlc3MgQmxrTnVtID0gJWRcbiIsIEJsa051bSkpOwotCi0JCQkvLyB0aGUgb2Zmc2V0IG9mIGN1cnJlbnQgbWFwcGluZyBlbnRyeQotCQkJYWRkciA9IEVGVVNFX1VTQUdFX01BUF9TVEFSVCtCbGtOdW07Ci0KLQkJCS8vZmluZCBhIG5ldyBtYXBwaW5nIGVudHJ5Ci0JCQlCbGtOdW0gPSAweGZmZmY7Ci0JCQlmb3IgKGk9RUZVU0VfVVNBR0VfTUFQX1NUQVJUOyBpPD1FRlVTRV9VU0FHRV9NQVBfRU5EOyBpKz0yKQotCQkJewotCQkJCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCwgaSwgMiwgJkxvZ2ljYWxBZGRyZXNzKTsKLQkJCQlpZiggKExvZ2ljYWxBZGRyZXNzICYgMHhmZikgPT0gMCkKLQkJCQl7Ci0JCQkJCUJsa051bSA9IGktRUZVU0VfVVNBR0VfTUFQX1NUQVJUOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZSBpZigoIChMb2dpY2FsQWRkcmVzcyA+PiA4KSAmIDB4ZmYpID09IDApCi0JCQkJewotCQkJCQlpZiAoaSAhPSBFRlVTRV9VU0FHRV9NQVBfRU5EKQotCQkJCQl7Ci0JCQkJCQlCbGtOdW0gPSBpKzEtRUZVU0VfVVNBR0VfTUFQX1NUQVJUOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vdCBiV3JpdGVTdWNjZXNzIG5ldyBCbGtOdW0gPSAlZFxuIiwgQmxrTnVtKSk7Ci0JCQlpZihCbGtOdW0gPT0gMHhmZmZmKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnM6IG91dCBvZiBmcmVlIEUtZnVzZSBzcGFjZSEhIVxuIikpOwotCQkJCXJldHVybiBGQUxTRTsKLQkJCX0KLQotCQkJLy9pbnZhbGlkYXRlIHRoZSBvcmlnaW5hbCBtYXBwaW5nIGVudHJ5IGlmIG5ldyBlbnRyeSBpcyBub3QgZm91bmQKLQkJCXRtcGFkZHIgPSBhZGRyOwotCi0JCQlpZihhZGRyICUgMiAhPSAwKQotCQkJCWFkZHIgPSBhZGRyIC0xOwotCQkJSW5CdWZbMF0gPSBhZGRyOwotCQkJSW5CdWZbMV0gPSAyOwotCi0JCQllRnVzZVJlYWRQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNCwgJkluQnVmWzJdLCAyKTsKLQotCQkJLy8gd3JpdGUgdGhlIGxvZ2ljYWwgYWRkcmVzcwotCQkJaWYodG1wYWRkciUyICE9IDApCi0JCQl7Ci0JCQkJLy8gSW52YWxpZGF0ZSB0aGUgaGlnaCBieXRlCi0JCQkJZm9yIChpPTg7IGk8MTU7IGkrKykKLQkJCQl7Ci0JCQkJCWlmKCAoIChJbkJ1ZlsyXSA+PiBpKSAmIDB4MDEpID09IDApCi0JCQkJCXsKLQkJCQkJCUluQnVmWzJdIHw9ICgweDEgPDxpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIGludmFsaWRhdGUgdGhlIGxvdyBieXRlCi0JCQkJZm9yIChpPTA7IGk8ODsgaSsrKQotCQkJCXsKLQkJCQkJaWYoICggKEluQnVmWzJdID4+IGkpICYgMHgwMSkgPT0gMCkKLQkJCQkJewotCQkJCQkJSW5CdWZbMl0gfD0gKDB4MSA8PGkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllRnVzZVdyaXRlUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDYsIE5VTEwsIDApOwotCQl9Ci0JfQotCXdoaWxlICghYldyaXRlU3VjY2VzcyYmTG9vcDwyKTsKLQlpZighYldyaXRlU3VjY2VzcykKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJFZnN1ZSBXcml0ZSBGYWlsZWQhIVxuIikpOwotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlOb3RlOgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgVk9JRCBlRnVzZVdyaXRlUGh5c2ljYWwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JUFVTSE9SVCBscEluQnVmZmVyLAotCVVMT05HIG5JbkJ1ZmZlclNpemUsCi0JUFVDSEFSIGxwT3V0QnVmZmVyLAotCVVMT05HIG5PdXRCdWZmZXJTaXplCi0pCi17Ci0JVVNIT1JUKiBwSW5CdWYgPSAoVVNIT1JUKilscEluQnVmZmVyOwotCWludAkJaTsKLQkvL1VTSE9SVCogcE91dEJ1ZiA9IChVU0hPUlQqKWlvQnVmZmVyOwotCVVTSE9SVCBPZmZzZXQgPSBwSW5CdWZbMF07CQkJCQkvLyBhZGRyCi0JVVNIT1JUIExlbmd0aCA9IHBJbkJ1ZlsxXTsJCQkJCS8vIGxlbmd0aAotCVVTSE9SVCogcFZhbHVlWCA9ICZwSW5CdWZbMl07CQkJCS8vIHZhbHVlIC4uLgotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZUZ1c2VXcml0ZVBoeXNpY2FsIE9mZnNldD0weCV4LCBsZW5ndGg9JWRcbiIsIE9mZnNldCwgTGVuZ3RoKSk7Ci0KLQl7Ci0JCS8vIExpdHRsZS1lbmRpYW4JCVMJfAlTCUJpZy1lbmRpYW4KLQkJLy8gYWRkcgkzCTIJMQkwCXwJMAkxCTIJMwotCQkvLyBPcmktVglECUMJQglBCXwJQQlCCUMJRAotCQkvLyBBZnRlciBzd2FwcGluZwotCQkvLwkJRAlDCUIJQQl8CUQJQwlCCUEKLQkJLy8gQm90aCB0aGUgbGl0dGxlIGFuZCBiaWctZW5kaWFuIHVzZSB0aGUgc2FtZSBzZXF1ZW5jZSB0byB3cml0ZSAgZGF0YS4KLQkJLy8gVGhlcmVmb3JlLCB3ZSBvbmx5IG5lZWQgc3dhcCBkYXRhIHdoZW4gcmVhZCB0aGUgZGF0YS4KLQkJZm9yIChpPTA7IGk8TGVuZ3RoOyBpKz0yKQotCQl7Ci0JCQllRnVzZVBoeXNpY2FsV3JpdGVSZWdpc3RlcnMocEFkLCBPZmZzZXQraSwgMiwgJnBWYWx1ZVhbaS8yXSk7Ci0JCX0KLQl9Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5UU1RBVFVTIGVGdXNlV3JpdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVTSE9SVAkJCWxlbmd0aCkKLXsKLQlpbnQgaTsKLQlVU0hPUlQqIHBWYWx1ZVggPSAoUFVTSE9SVCkgcERhdGE7CQkJCS8vdmFsdWUgLi4uCi0KLQkvLyBUaGUgaW5wdXQgdmFsdWU9MzA3MCB3aWxsIGJlIHN0b3JlZCBhcyBmb2xsb3dpbmcKLQkvLyBMaXR0bGUtZW5kaWFuCQlTCXwJUwlCaWctZW5kaWFuCi0JLy8gYWRkcgkJCTEJMAl8CTAJMQotCS8vIE9yaS1WCQkJMzAJNzAJfAkzMAk3MAotCS8vIEFmdGVyIHN3YXBwaW5nCi0JLy8JCQkJMzAJNzAJfAk3MAkzMAotCS8vIENhc3RpbmcKLQkvLwkJCQkzMDcwCXwJNzAzMCAoeCkKLQkvLyBUaGUgc3dhcHBpbmcgc2hvdWxkIGJlIHJlbW92ZWQgZm9yIGJpZy1lbmRpYW4KLQlmb3IoaT0wOyBpPGxlbmd0aDsgaSs9MikKLQl7Ci0JCWVGdXNlV3JpdGVSZWdpc3RlcnMocEFkLCBPZmZzZXQraSwgMiwgJnBWYWx1ZVhbaS8yXSk7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlOb3RlOgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgc2V0X2VGdXNlR2V0RnJlZUJsb2NrQ291bnRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVTSE9SVCBpOwotCVVTSE9SVAlMb2dpY2FsQWRkcmVzczsKLQlVU0hPUlQgZWZ1c2VmcmVlbnVtPTA7Ci0JaWYoIXBBZC0+YlVzZUVmdXNlKQotCQlyZXR1cm4gRkFMU0U7Ci0JZm9yIChpID0gRUZVU0VfVVNBR0VfTUFQX1NUQVJUOyBpIDw9IEVGVVNFX1VTQUdFX01BUF9FTkQ7IGkrPTIpCi0JewotCQllRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycyhwQWQsIGksIDIsICZMb2dpY2FsQWRkcmVzcyk7Ci0JCWlmKCAoTG9naWNhbEFkZHJlc3MgJiAweGZmKSA9PSAwKQotCQl7Ci0JCQllZnVzZWZyZWVudW09IChVQ0hBUikgKEVGVVNFX1VTQUdFX01BUF9FTkQtaSsxKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UgaWYoKCAoTG9naWNhbEFkZHJlc3MgPj4gOCkgJiAweGZmKSA9PSAwKQotCQl7Ci0JCQllZnVzZWZyZWVudW0gPSAoVUNIQVIpIChFRlVTRV9VU0FHRV9NQVBfRU5ELWkpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZihpID09IEVGVVNFX1VTQUdFX01BUF9FTkQpCi0JCQllZnVzZWZyZWVudW0gPSAwOwotCX0KLQlwcmludGsoImVmdXNlRnJlZU51bWJlciBpcyAlZFxuIixlZnVzZWZyZWVudW0pOwotCXJldHVybiBUUlVFOwotfQotCi0KLUlOVCBzZXRfZUZ1c2VkdW1wX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLVVTSE9SVCBJbkJ1ZlszXTsKLQlJTlQgaT0wOwotCWlmKCFwQWQtPmJVc2VFZnVzZSkKLQkJcmV0dXJuIEZBTFNFOwotCWZvcihpID0wOyBpPEVGVVNFX1VTQUdFX01BUF9FTkQvMjsgaSsrKQotCXsKLQkJSW5CdWZbMF0gPSAyKmk7Ci0JCUluQnVmWzFdID0gMjsKLQkJSW5CdWZbMl0gPSAweDA7Ci0KLQkJZUZ1c2VSZWFkUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDQsICZJbkJ1ZlsyXSwgMik7Ci0JCWlmKGklND09MCkKLQkJcHJpbnRrKCJcbkJsb2NrICV4OiIsaS84KTsKLQkJcHJpbnRrKCIlMDR4ICIsSW5CdWZbMl0pOwotCX0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1JTlQJc2V0X2VGdXNlTG9hZEZyb21CaW5fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVBTVFJJTkcJCQkJCXNyYzsKLQlSVE1QX09TX0ZECQkJCXNyY2Y7Ci0JUlRNUF9PU19GU19JTkZPCQkJb3Nmc0luZm87Ci0JSU5UCQkJCQkJcmV0dmFsLCBtZW1TaXplOwotCVBTVFJJTkcJCQkJCWJ1ZmZlciwgbWVtUHRyOwotCUlOVAkJCQkJCWkgPSAwLGo9MCxrPTE7Ci0JVVNIT1JUCQkJCQkqUERBVEE7Ci0JVVNIT1JUCQkJCQlEQVRBOwotCi0JbWVtU2l6ZSA9IDEyOCArIE1BWF9FRVBST01fQklOX0ZJTEVfU0laRSArIHNpemVvZihVU0hPUlQpICogODsKLQltZW1QdHIgPSBrbWFsbG9jKG1lbVNpemUsIE1FTV9BTExPQ19GTEFHKTsKLQlpZiAobWVtUHRyID09IE5VTEwpCi0JCXJldHVybiBGQUxTRTsKLQotCU5kaXNaZXJvTWVtb3J5KG1lbVB0ciwgbWVtU2l6ZSk7Ci0Jc3JjID0gbWVtUHRyOyAvLyBrbWFsbG9jKDEyOCwgTUVNX0FMTE9DX0ZMQUcpOwotCWJ1ZmZlciA9IHNyYyArIDEyODsJCS8vIGttYWxsb2MoTUFYX0VFUFJPTV9CSU5fRklMRV9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7Ci0JUERBVEEgPSAoVVNIT1JUKikoYnVmZmVyICsgTUFYX0VFUFJPTV9CSU5fRklMRV9TSVpFKTsJLy8ga21hbGxvYyhzaXplb2YoVVNIT1JUKSo4LE1FTV9BTExPQ19GTEFHKTsKLQotCWlmKHN0cmxlbihhcmcpPjApCi0JCU5kaXNNb3ZlTWVtb3J5KHNyYywgYXJnLCBzdHJsZW4oYXJnKSk7Ci0JZWxzZQotCQlOZGlzTW92ZU1lbW9yeShzcmMsIEVGVVNFX0VFUFJPTV9ERUZVTFRfRklMRSwgc3RybGVuKEVGVVNFX0VFUFJPTV9ERUZVTFRfRklMRSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZpbGVOYW1lPSVzXG4iLHNyYykpOwotCi0JUnRtcE9TRlNJbmZvQ2hhbmdlKCZvc2ZzSW5mbywgVFJVRSk7Ci0KLQlzcmNmID0gUnRtcE9TRmlsZU9wZW4oc3JjLCBPX1JET05MWSwgMCk7Ci0JaWYgKElTX0ZJTEVfT1BFTl9FUlIoc3JjZikpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3Igb3BlbmluZyBmaWxlICVzXG4iLCBzcmMpKTsKLQkJcmV0dmFsID0gRkFMU0U7Ci0JCWdvdG8gcmVjb3ZlckZTOwotCX0KLQllbHNlCi0JewotCQkvLyBUaGUgb2JqZWN0IG11c3QgaGF2ZSBhIHJlYWQgbWV0aG9kCi0JCXdoaWxlKFJ0bXBPU0ZpbGVSZWFkKHNyY2YsICZidWZmZXJbaV0sIDEpPT0xKQotCQl7Ci0JCWkrKzsKLQkJCWlmKGk+TUFYX0VFUFJPTV9CSU5fRklMRV9TSVpFKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIi0tPiBFcnJvciByZWFkaW5nIGZpbGUgJXMsIGZpbGUgc2l6ZSB0b28gbGFyZ2VbPiVkXVxuIiwgc3JjLCBNQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUpKTsKLQkJCQlyZXR2YWwgPSBGQUxTRTsKLQkJCQlnb3RvIGNsb3NlRmlsZTsKLQkJCX0KLQkJfQotCi0JCXJldHZhbCA9IFJ0bXBPU0ZpbGVDbG9zZShzcmNmKTsKLQkJaWYgKHJldHZhbCkKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBFcnJvciBjbG9zaW5nIGZpbGUgJXNcbiIsIHNyYykpOwotCX0KLQotCi0JUnRtcE9TRlNJbmZvQ2hhbmdlKCZvc2ZzSW5mbywgRkFMU0UpOwotCi0JZm9yKGo9MDtqPGk7aisrKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJTAyWCAiLGJ1ZmZlcltqXSYweGZmKSk7Ci0JCWlmKChqKzEpJTI9PTApCi0JCQlQREFUQVtqLzIlOF09KChidWZmZXJbal08PDgpJjB4ZmYwMCl8KGJ1ZmZlcltqLTFdJjB4ZmYpOwotCQlpZihqJTE2PT0wKQotCQl7Ci0JCQlrPWJ1ZmZlcltqXTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWsmPWJ1ZmZlcltqXTsKLQkJCWlmKChqKzEpJTE2PT0wKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiByZXN1bHQ9JTAyWCxibGs9JTAyeFxuIixrLGovMTYpKTsKLQkJCQlpZihrIT0weGZmKQotCQkJCQllRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbihwQWQsKFVTSE9SVClqLTE1LCAxNiwgUERBVEEpOwotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWlmKGVGdXNlUmVhZFJlZ2lzdGVycyhwQWQsaiwgMiwoUFVTSE9SVCkmREFUQSkhPTB4M2YpCi0JCQkJCQllRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbihwQWQsKFVTSE9SVClqLTE1LCAxNiwgUERBVEEpOwotCQkJCX0KLQkJCQkvKgotCQkJCWZvcihsPTA7bDw4O2wrKykKLQkJCQkJcHJpbnRrKCIlMDR4ICIsUERBVEFbbF0pOwotCQkJCXByaW50aygiXG4iKTsKLQkJCQkqLwotCQkJCU5kaXNaZXJvTWVtb3J5KFBEQVRBLDE2KTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBUUlVFOwotCi1jbG9zZUZpbGU6Ci0JaWYgKHNyY2YpCi0JCVJ0bXBPU0ZpbGVDbG9zZShzcmNmKTsKLQotcmVjb3ZlckZTOgotCVJ0bXBPU0ZTSW5mb0NoYW5nZSgmb3Nmc0luZm8sIEZBTFNFKTsKLQotCi0JaWYgKG1lbVB0cikKLQkJa2ZyZWUobWVtUHRyKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLQotc3RhdGljIE5UU1RBVFVTIGVGdXNlV3JpdGVSZWdpc3RlcnNGcm9tQmluKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlJTglVU0hPUlQqIHBEYXRhKQotewotCVVTSE9SVAlpOwotCVVTSE9SVAllRnVzZURhdGE7Ci0JVVNIT1JUCUxvZ2ljYWxBZGRyZXNzLCBCbGtOdW0gPSAweGZmZmY7Ci0JVUNIQVIJRUZTUk9NX0FPVVQsTG9vcD0wOwotCUVGVVNFX0NUUkxfU1RSVUMJCWVGdXNlQ3RybFN0cnVjOwotCVVTSE9SVAllZnVzZURhdGFPZmZzZXQ7Ci0JVUlOVDMyCWRhdGEsdGVtcGJ1ZmZlcjsKLQlVU0hPUlQgYWRkcix0bXBhZGRyLCBJbkJ1ZlszXSwgdG1wT2Zmc2V0OwotCVVJTlQzMiBidWZmZXJbNF07Ci0JQk9PTEVBTgkJYldyaXRlU3VjY2VzcyA9IFRSVUU7Ci0JQk9PTEVBTgkJYk5vdFdyaXRlPVRSVUU7Ci0JQk9PTEVBTgkJYkFsbG9jYXRlTmV3QmxrPVRSVUU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbiBPZmZzZXQ9JXgsIHBEYXRhPSUwNHg6JTA0eDolMDR4OiUwNHhcbiIsIE9mZnNldCwgKnBEYXRhLCoocERhdGErMSksKihwRGF0YSsyKSwqKHBEYXRhKzMpKSk7Ci0KLQlkbwotCXsKLQkvL1N0ZXAgMC4gZmluZCB0aGUgZW50cnkgaW4gdGhlIG1hcHBpbmcgdGFibGUKLQkvL1RoZSBhZGRyZXNzIG9mIEVFUFJPTSBpcyAyLWJ5dGVzIGFsaWdubWVudC4KLQkvL1RoZSBsYXN0IGJpdCBpcyB1c2VkIGZvciBhbGlnbm1lbnQsIHNvIGl0IG11c3QgYmUgMC4KLQlMb29wKys7Ci0JdG1wT2Zmc2V0ID0gT2Zmc2V0ICYgMHhmZmZlOwotCUVGU1JPTV9BT1VUID0gZUZ1c2VSZWFkUmVnaXN0ZXJzKHBBZCwgdG1wT2Zmc2V0LCAyLCAmZUZ1c2VEYXRhKTsKLQotCWlmKCBFRlNST01fQU9VVCA9PSAweDNmKQotCXsJLy9maW5kIGF2YWlsYWJsZSBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkvL3RoZSBsb2dpY2FsIGFkZHJlc3MgZG9lcyBub3QgZXhpc3QsIGZpbmQgYW4gZW1wdHkgb25lCi0JCS8vZnJvbSB0aGUgZmlyc3QgYWRkcmVzcyBvZiBibG9jayA0NT0xNio0NT0weDJkMCB0byB0aGUgbGFzdCBhZGRyZXNzIG9mIGJsb2NrIDQ3Ci0JCS8vPT0+NDgqMTYtMyhyZXNlcnZlZCk9MkZDCi0JCWJBbGxvY2F0ZU5ld0Jsaz1UUlVFOwotCQlmb3IgKGk9RUZVU0VfVVNBR0VfTUFQX1NUQVJUOyBpPD1FRlVTRV9VU0FHRV9NQVBfRU5EOyBpKz0yKQotCQl7Ci0JCQkvL1JldHJpdmUgdGhlIGxvZ2ljYWwgYmxvY2sgbnVibWVyIGZvcm0gZWFjaCBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkJLy9JdCB3aWxsIGFjY2VzcyB0d28gbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIgZWFjaCB0aW1lLgotCQkJZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMocEFkLCBpLCAyLCAmTG9naWNhbEFkZHJlc3MpOwotCQkJaWYoIChMb2dpY2FsQWRkcmVzcyAmIDB4ZmYpID09IDApCi0JCQl7Ly9Ob3QgdXNlZCBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkJCUJsa051bSA9IGktRUZVU0VfVVNBR0VfTUFQX1NUQVJUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZigoIChMb2dpY2FsQWRkcmVzcyA+PiA4KSAmIDB4ZmYpID09IDApCi0JCQl7Ly9Ob3QgdXNlZCBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkJCWlmIChpICE9IEVGVVNFX1VTQUdFX01BUF9FTkQpCi0JCQkJewotCQkJCQlCbGtOdW0gPSBpLUVGVVNFX1VTQUdFX01BUF9TVEFSVCsxOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQliQWxsb2NhdGVOZXdCbGs9RkFMU0U7Ci0JCUJsa051bSA9IEVGU1JPTV9BT1VUOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnMgQmxrTnVtID0gJWQgXG4iLCBCbGtOdW0pKTsKLQotCWlmKEJsa051bSA9PSAweGZmZmYpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzOiBvdXQgb2YgZnJlZSBFLWZ1c2Ugc3BhY2UhISFcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQkvL1N0ZXAgMS4xLjAKLQkvL0lmIHRoZSBibG9jayBpcyBub3QgZXhpc3RpbmcgaW4gbWFwcGluZyB0YWJsZSwgY3JlYXRlIG9uZQotCS8vYW5kIHdyaXRlIGRvd24gdGhlIDE2LWJ5dGVzIGRhdGEgdG8gdGhlIG5ldyBibG9jawotCWlmKGJBbGxvY2F0ZU5ld0JsaykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFsbG9jYXRlIE5ldyBCbGtcbiIpKTsKLQkJZWZ1c2VEYXRhT2Zmc2V0ID0gIEVGVVNFX0RBVEEzOwotCQlmb3IoaT0wOyBpPCA0OyBpKyspCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFsbG9jYXRlIE5ldyBCbGssIERhdGElZD0lMDR4JTA0eFxuIiwzLWkscERhdGFbMippKzFdLHBEYXRhWzIqaV0pKTsKLQkJCXRlbXBidWZmZXI9KChwRGF0YVsyKmkrMV08PDE2KSYweGZmZmYwMDAwKXxwRGF0YVsyKmldOwotCi0KLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIGVmdXNlRGF0YU9mZnNldCx0ZW1wYnVmZmVyKTsKLQkJCWVmdXNlRGF0YU9mZnNldCAtPSA0OwotCi0JCX0KLQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCQkvL1N0ZXAxLjEuMS4gV3JpdGUgMTAtYml0IG9mIGFkZHJlc3MgdG8gRUZTUk9NX0FJTiAoMHg1ODAsIGJpdDI1OmJpdDE2KS4gVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWdubWVudC4KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsU3RydWMud29yZCk7Ci0JCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9BSU4gPSBCbGtOdW0qIDB4MTAgOwotCi0JCS8vU3RlcDEuMS4yLiBXcml0ZSBFRlNST01fTU9ERSAoMHg1ODAsIGJpdDc6Yml0NikgdG8gMy4KLQkJZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX01PREUgPSAzOwotCi0JCS8vU3RlcDEuMS4zLiBXcml0ZSBFRlNST01fS0lDSyAoMHg1ODAsIGJpdDMwKSB0byAxIHRvIGtpY2stb2ZmIHBoeXNpY2FsIHdyaXRlIHByb2NlZHVyZS4KLQkJZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPSAxOwotCi0JCU5kaXNNb3ZlTWVtb3J5KCZkYXRhLCAmZUZ1c2VDdHJsU3RydWMsIDQpOwotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVGVVNFX0NUUkwsIGRhdGEpOwotCi0JCS8vU3RlcDEuMS40LiBQb2xsaW5nIEVGU1JPTV9LSUNLKDB4NTgwLCBiaXQzMCkgdW50aWwgaXQgYmVjb21lIDAgYWdhaW4uIEl077+977+9cyBkb25lLgotCQlpID0gMDsKLQkJd2hpbGUoaSA8IDEwMCkKLQkJewotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAoUFVJTlQzMikgJmVGdXNlQ3RybFN0cnVjKTsKLQotCQkJaWYoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPT0gMCkKLQkJCQlicmVhazsKLQotCQkJUlRNUHVzZWNEZWxheSgyKTsKLQkJCWkrKzsKLQkJfQotCi0JfQotCWVsc2UKLQl7CS8vU3RlcDEuMi4KLQkJLy9JZiB0aGUgc2FtZSBsb2dpY2FsIG51bWJlciBpcyBleGlzdGluZywgY2hlY2sgaWYgdGhlIHdyaXR0aW5nIGRhdGEgYW5kIHRoZSBkYXRhCi0JCS8vc2F2aW5nIGluIHRoaXMgYmxvY2sgYXJlIHRoZSBzYW1lLgotCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvL3JlYWQgY3VycmVudCB2YWx1ZXMgb2YgMTYtYnl0ZSBibG9jawotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsICZlRnVzZUN0cmxTdHJ1Yy53b3JkKTsKLQotCQkvL1N0ZXAxLjIuMC4gV3JpdGUgMTAtYml0IG9mIGFkZHJlc3MgdG8gRUZTUk9NX0FJTiAoMHg1ODAsIGJpdDI1OmJpdDE2KS4gVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWdubWVudC4KLQkJZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FJTiA9IE9mZnNldCAmIDB4ZmZmMDsKLQotCQkvL1N0ZXAxLjIuMS4gV3JpdGUgRUZTUk9NX01PREUgKDB4NTgwLCBiaXQ3OmJpdDYpIHRvIDEuCi0JCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9NT0RFID0gMDsKLQotCQkvL1N0ZXAxLjIuMi4gV3JpdGUgRUZTUk9NX0tJQ0sgKDB4NTgwLCBiaXQzMCkgdG8gMSB0byBraWNrLW9mZiBwaHlzaWNhbCByZWFkIHByb2NlZHVyZS4KLQkJZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPSAxOwotCi0JCU5kaXNNb3ZlTWVtb3J5KCZkYXRhLCAmZUZ1c2VDdHJsU3RydWMsIDQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRlVTRV9DVFJMLCBkYXRhKTsKLQotCQkvL1N0ZXAxLjIuMy4gUG9sbGluZyBFRlNST01fS0lDSygweDU4MCwgYml0MzApIHVudGlsIGl0IGJlY29tZSAwIGFnYWluLgotCQlpID0gMDsKLQkJd2hpbGUoaSA8IDUwMCkKLQkJewotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAoUFVJTlQzMikgJmVGdXNlQ3RybFN0cnVjKTsKLQotCQkJaWYoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPT0gMCkKLQkJCQlicmVhazsKLQkJCVJUTVB1c2VjRGVsYXkoMik7Ci0JCQlpKys7Ci0JCX0KLQotCQkvL1N0ZXAxLjIuNC4gUmVhZCAxNi1ieXRlIG9mIGRhdGEgZnJvbSBFRlVTRV9EQVRBMC0zICgweDU5Qy0weDU5MCkKLQkJZWZ1c2VEYXRhT2Zmc2V0ID0gIEVGVVNFX0RBVEEzOwotCQlmb3IoaT0wOyBpPCA0OyBpKyspCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgZWZ1c2VEYXRhT2Zmc2V0LCAoUFVJTlQzMikgJmJ1ZmZlcltpXSk7Ci0JCQllZnVzZURhdGFPZmZzZXQgLT0gIDQ7Ci0JCX0KLQkJLy9TdGVwMS4yLjUuIENoZWNrIGlmIHRoZSBkYXRhIG9mIGVmdXNlIGFuZCB0aGUgd3JpdGluZyBkYXRhIGFyZSB0aGUgc2FtZS4KLQkJZm9yKGkgPTA7IGk8NDsgaSsrKQotCQl7Ci0JCQl0ZW1wYnVmZmVyPSgocERhdGFbMippKzFdPDwxNikmMHhmZmZmMDAwMCl8cERhdGFbMippXTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImJ1ZmZlclslZF09JXgscERhdGFbJWRdPSV4LHBEYXRhWyVkXT0leCx0ZW1wYnVmZmVyPSV4XG4iLGksYnVmZmVyW2ldLDIqaSxwRGF0YVsyKmldLDIqaSsxLHBEYXRhWzIqaSsxXSx0ZW1wYnVmZmVyKSk7Ci0KLQkJCWlmKCgoYnVmZmVyW2ldJjB4ZmZmZjAwMDApPT0ocERhdGFbMippKzFdPDwxNikpJiYoKGJ1ZmZlcltpXSYweGZmZmYpPT1wRGF0YVsyKmldKSkKLQkJCQliTm90V3JpdGUmPVRSVUU7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJYk5vdFdyaXRlJj1GQUxTRTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZighYk5vdFdyaXRlKQotCQl7Ci0JCXByaW50aygiVGhlIGRhdGEgaXMgbm90IHRoZSBzYW1lXG4iKTsKLQotCQkJZm9yKGkgPTA7IGk8ODsgaSsrKQotCQkJewotCQkJCWFkZHIgPSBCbGtOdW0gKiAweDEwIDsKLQotCQkJCUluQnVmWzBdID0gYWRkcisyKmk7Ci0JCQkJSW5CdWZbMV0gPSAyOwotCQkJCUluQnVmWzJdID0gcERhdGFbaV07Ci0KLQkJCQllRnVzZVdyaXRlUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDYsIE5VTEwsIDIpOwotCQkJfQotCi0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIFRSVUU7Ci0JICAgICB9Ci0KLQotCi0JCS8vU3RlcCAyLiBXcml0ZSBtYXBwaW5nIHRhYmxlCi0JCWFkZHIgPSBFRlVTRV9VU0FHRV9NQVBfU1RBUlQrQmxrTnVtOwotCi0JCXRtcGFkZHIgPSBhZGRyOwotCi0JCWlmKGFkZHIgJSAyICE9IDApCi0JCQlhZGRyID0gYWRkciAtMTsKLQkJSW5CdWZbMF0gPSBhZGRyOwotCQlJbkJ1ZlsxXSA9IDI7Ci0KLQkJLy9jb252ZXJ0IHRoZSBhZGRyZXNzIGZyb20gMTAgdG8gOCBiaXQgKCBiaXQ3LCA2ID0gcGFyaXR5IGFuZCBiaXQ1IH4gMCA9IGJpdDl+NCksIGFuZCB3cml0ZSB0byBsb2dpY2FsIG1hcCBlbnRyeQotCQl0bXBPZmZzZXQgPSBPZmZzZXQ7Ci0JCXRtcE9mZnNldCA+Pj0gNDsKLQkJdG1wT2Zmc2V0IHw9ICgofigodG1wT2Zmc2V0ICYgMHgwMSkgXiAoIHRtcE9mZnNldCA+PiAxICYgMHgwMSkgXiAgKHRtcE9mZnNldCA+PiAyICYgMHgwMSkgXiAgKHRtcE9mZnNldCA+PiAzICYgMHgwMSkpKSA8PCA2KSAmIDB4NDA7Ci0JCXRtcE9mZnNldCB8PSAoKH4oICh0bXBPZmZzZXQgPj4gMiAmIDB4MDEpIF4gKHRtcE9mZnNldCA+PiAzICYgMHgwMSkgXiAodG1wT2Zmc2V0ID4+IDQgJiAweDAxKSBeICggdG1wT2Zmc2V0ID4+IDUgJiAweDAxKSkpIDw8IDcpICYgMHg4MDsKLQotCQkvLyB3cml0ZSB0aGUgbG9naWNhbCBhZGRyZXNzCi0JCWlmKHRtcGFkZHIlMiAhPSAwKQotCQkJSW5CdWZbMl0gPSB0bXBPZmZzZXQ8PDg7Ci0JCWVsc2UKLQkJCUluQnVmWzJdID0gdG1wT2Zmc2V0OwotCi0JCWVGdXNlV3JpdGVQaHlzaWNhbChwQWQsJkluQnVmWzBdLCA2LCBOVUxMLCAwKTsKLQotCQkvL1N0ZXAgMy4gQ29tcGFyZSBkYXRhIGlmIG5vdCB0aGUgc2FtZSwgaW52YWxpZGF0ZSB0aGUgbWFwcGluZyBlbnRyeSwgdGhlbiByZS13cml0ZSB0aGUgZGF0YSB1bnRpbCBFLWZ1c2UgaXMgZXhoYXVzdGVkCi0JCWJXcml0ZVN1Y2Nlc3MgPSBUUlVFOwotCQlmb3IoaSA9MDsgaTw4OyBpKyspCi0JCXsKLQkJCWFkZHIgPSBCbGtOdW0gKiAweDEwIDsKLQotCQkJSW5CdWZbMF0gPSBhZGRyKzIqaTsKLQkJCUluQnVmWzFdID0gMjsKLQkJCUluQnVmWzJdID0gMHgwOwotCi0JCQllRnVzZVJlYWRQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNCwgJkluQnVmWzJdLCAyKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImFkZHI9JXgsIGJ1ZmZlcltpXT0leCxJbkJ1ZlsyXT0leFxuIixJbkJ1ZlswXSxwRGF0YVtpXSxJbkJ1ZlsyXSkpOwotCQkJaWYocERhdGFbaV0gIT0gSW5CdWZbMl0pCi0JCQl7Ci0JCQkJYldyaXRlU3VjY2VzcyA9IEZBTFNFOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLy9TdGVwIDQuIGludmxpZGF0ZSBtYXBwaW5nIGVudHJ5IGFuZCBmaW5kIGEgZnJlZSBtYXBwaW5nIGVudHJ5IGlmIG5vdCBzdWNjZWVkCi0KLQkJaWYgKCFiV3JpdGVTdWNjZXNzJiZMb29wPDIpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnNGcm9tQmluOjpOb3QgYldyaXRlU3VjY2VzcyBCbGtOdW0gPSAlZFxuIiwgQmxrTnVtKSk7Ci0KLQkJCS8vIHRoZSBvZmZzZXQgb2YgY3VycmVudCBtYXBwaW5nIGVudHJ5Ci0JCQlhZGRyID0gRUZVU0VfVVNBR0VfTUFQX1NUQVJUK0Jsa051bTsKLQotCQkJLy9maW5kIGEgbmV3IG1hcHBpbmcgZW50cnkKLQkJCUJsa051bSA9IDB4ZmZmZjsKLQkJCWZvciAoaT1FRlVTRV9VU0FHRV9NQVBfU1RBUlQ7IGk8PUVGVVNFX1VTQUdFX01BUF9FTkQ7IGkrPTIpCi0JCQl7Ci0JCQkJZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMocEFkLCBpLCAyLCAmTG9naWNhbEFkZHJlc3MpOwotCQkJCWlmKCAoTG9naWNhbEFkZHJlc3MgJiAweGZmKSA9PSAwKQotCQkJCXsKLQkJCQkJQmxrTnVtID0gaS1FRlVTRV9VU0FHRV9NQVBfU1RBUlQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQllbHNlIGlmKCggKExvZ2ljYWxBZGRyZXNzID4+IDgpICYgMHhmZikgPT0gMCkKLQkJCQl7Ci0JCQkJCWlmIChpICE9IEVGVVNFX1VTQUdFX01BUF9FTkQpCi0JCQkJCXsKLQkJCQkJCUJsa051bSA9IGkrMS1FRlVTRV9VU0FHRV9NQVBfU1RBUlQ7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZUZ1c2VXcml0ZVJlZ2lzdGVyc0Zyb21CaW46Ok5vdCBiV3JpdGVTdWNjZXNzIG5ldyBCbGtOdW0gPSAlZFxuIiwgQmxrTnVtKSk7Ci0JCQlpZihCbGtOdW0gPT0gMHhmZmZmKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnNGcm9tQmluOiBvdXQgb2YgZnJlZSBFLWZ1c2Ugc3BhY2UhISFcbiIpKTsKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQl9Ci0KLQkJCS8vaW52YWxpZGF0ZSB0aGUgb3JpZ2luYWwgbWFwcGluZyBlbnRyeSBpZiBuZXcgZW50cnkgaXMgbm90IGZvdW5kCi0JCQl0bXBhZGRyID0gYWRkcjsKLQotCQkJaWYoYWRkciAlIDIgIT0gMCkKLQkJCQlhZGRyID0gYWRkciAtMTsKLQkJCUluQnVmWzBdID0gYWRkcjsKLQkJCUluQnVmWzFdID0gMjsKLQotCQkJZUZ1c2VSZWFkUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDQsICZJbkJ1ZlsyXSwgMik7Ci0KLQkJCS8vIHdyaXRlIHRoZSBsb2dpY2FsIGFkZHJlc3MKLQkJCWlmKHRtcGFkZHIlMiAhPSAwKQotCQkJewotCQkJCS8vIEludmFsaWRhdGUgdGhlIGhpZ2ggYnl0ZQotCQkJCWZvciAoaT04OyBpPDE1OyBpKyspCi0JCQkJewotCQkJCQlpZiggKCAoSW5CdWZbMl0gPj4gaSkgJiAweDAxKSA9PSAwKQotCQkJCQl7Ci0JCQkJCQlJbkJ1ZlsyXSB8PSAoMHgxIDw8aSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBpbnZhbGlkYXRlIHRoZSBsb3cgYnl0ZQotCQkJCWZvciAoaT0wOyBpPDg7IGkrKykKLQkJCQl7Ci0JCQkJCWlmKCAoIChJbkJ1ZlsyXSA+PiBpKSAmIDB4MDEpID09IDApCi0JCQkJCXsKLQkJCQkJCUluQnVmWzJdIHw9ICgweDEgPDxpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZUZ1c2VXcml0ZVBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA2LCBOVUxMLCAwKTsKLQkJfQotCi0JfQotCXdoaWxlKCFiV3JpdGVTdWNjZXNzJiZMb29wPDIpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotaW50IHJ0bXBfZWVfZWZ1c2VfcmVhZDE2KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFVTSE9SVCBPZmZzZXQsCi0JT1VUIFVTSE9SVCAqcFZhbHVlKQotewotCWlmKHBBZC0+YkZyb2NlRUVQUk9NQnVmZmVyIHx8IHBBZC0+YkVFUFJPTUZpbGUpCi0JewotCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgICgiUmVhZCBmcm9tIEVFUFJPTSBCdWZmZXJcbiIpKTsKLQkgICAgTmRpc01vdmVNZW1vcnkocFZhbHVlLCAmKHBBZC0+RUVQUk9NSW1hZ2VbT2Zmc2V0XSksIDIpOwotCX0KLQllbHNlCi0JICAgIGVGdXNlUmVhZFJlZ2lzdGVycyhwQWQsIE9mZnNldCwgMiwgcFZhbHVlKTsKLQlyZXR1cm4gKCpwVmFsdWUpOwotfQotCi0KLWludCBydG1wX2VlX2VmdXNlX3dyaXRlMTYoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVVNIT1JUIE9mZnNldCwKLQlJTiBVU0hPUlQgZGF0YSkKLXsKLSAgICBpZihwQWQtPmJGcm9jZUVFUFJPTUJ1ZmZlcnx8cEFkLT5iRUVQUk9NRmlsZSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAgKCJXcml0ZSB0byBFRVBST00gQnVmZmVyXG4iKSk7Ci0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KCYocEFkLT5FRVBST01JbWFnZVtPZmZzZXRdKSwgJmRhdGEsIDIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGVGdXNlV3JpdGVSZWdpc3RlcnMocEFkLCBPZmZzZXQsIDIsICZkYXRhKTsKLQlyZXR1cm4gMDsKLX0KLQotCi1pbnQgUnRtcEVmdXNlU3VwcG9ydENoZWNrKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKQotewotCVVTSE9SVCB2YWx1ZTsKLQotCWlmIChJU19SVDMweHgocEFkKSkKLQl7Ci0JCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCwgRUZVU0VfVEFHLCAyLCAmdmFsdWUpOwotCQlwQWQtPkVGdXNlVGFnID0gKHZhbHVlICYgMHhmZik7Ci0JfQotCXJldHVybiAwOwotfQotCi1JTlQgc2V0X2VGdXNlQnVmZmVyTW9kZVdyaXRlQmFja19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUlOVCBFbmFibGU7Ci0KLQotCWlmKHN0cmxlbihhcmcpPjApCi0JewotCQlFbmFibGU9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOwotCWlmKEVuYWJsZT09MSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInNldF9lRnVzZUJ1ZmZlck1vZGVfUHJvYzo6IENhbGwgV1JJVEVFRVBST01CVUYiKSk7Ci0JCWVGdXNlV3JpdGVFZWVwcHJvbUJ1ZihwQWQpOwotCX0KLQllbHNlCi0JCXJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJTG9hZCBFRVBST00gZnJvbSBiaW4gZmlsZSBmb3IgZUZ1c2UgbW9kZQotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgZmlybXdhcmUgaW1hZ2UgbG9hZCBvawotCQlORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgaW1hZ2Ugbm90IGZvdW5kCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIGVGdXNlTG9hZEVFUFJPTSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlQU1RSSU5HCQkJCQlzcmMgPSBOVUxMOwotCUlOVAkJCQkJCXJldHZhbDsKLQlSVE1QX09TX0ZECQkJCXNyY2Y7Ci0JUlRNUF9PU19GU19JTkZPCQkJb3NGU0luZm87Ci0KLQotCXNyYz1FRlVTRV9CVUZGRVJfUEFUSDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGaWxlTmFtZT0lc1xuIixzcmMpKTsKLQotCi0JUnRtcE9TRlNJbmZvQ2hhbmdlKCZvc0ZTSW5mbywgVFJVRSk7Ci0KLQlpZiAoc3JjICYmICpzcmMpCi0JewotCQlzcmNmID0gUnRtcE9TRmlsZU9wZW4oc3JjLCBPX1JET05MWSwgMCk7Ci0JCWlmIChJU19GSUxFX09QRU5fRVJSKHNyY2YpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIC1QVFJfRVJSKHNyY2YpLHNyYykpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotCi0JCQkJbWVtc2V0KHBBZC0+RUVQUk9NSW1hZ2UsIDB4MDAsIE1BWF9FRVBST01fQklOX0ZJTEVfU0laRSk7Ci0KLQotCQkJcmV0dmFsID1SdG1wT1NGaWxlUmVhZChzcmNmLCAoUFNUUklORylwQWQtPkVFUFJPTUltYWdlLCBNQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUpOwotCQkJaWYgKHJldHZhbCA+IDApCi0JCQkJCQkJewotCQkJCVJUTVBTZXRQcm9maWxlUGFyYW1ldGVycyhwQWQsIChQU1RSSU5HKXBBZC0+RUVQUk9NSW1hZ2UpOwotCQkJCXJldHZhbCA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUmVhZCBmaWxlIFwiJXNcIiBmYWlsZWQoZXJyQ29kZT0lZCkhXG4iLCBzcmMsIHJldHZhbCkpOwotCi0JCX0KLQotCi0JfQotCWVsc2UKLQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3Igc3JjICBvciBzcmNmIGlzIG51bGxcbiIpKTsKLQkJCQkJcmV0dXJuIEZBTFNFOwotCi0JCX0KLQotCXJldHZhbD1SdG1wT1NGaWxlQ2xvc2Uoc3JjZik7Ci0KLQlpZiAocmV0dmFsKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEVycm9yICVkIGNsb3NpbmcgJXNcbiIsIC1yZXR2YWwsIHNyYykpOwotCX0KLQotCi0JUnRtcE9TRlNJbmZvQ2hhbmdlKCZvc0ZTSW5mbywgRkFMU0UpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVCBlRnVzZVdyaXRlRWVlcHByb21CdWYoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0KLQlQU1RSSU5HCQkJCQlzcmMgPSBOVUxMOwotCUlOVAkJCQkJCXJldHZhbDsKLQlSVE1QX09TX0ZECQkJCXNyY2Y7Ci0JUlRNUF9PU19GU19JTkZPCQkJb3NGU0luZm87Ci0KLQotCXNyYz1FRlVTRV9CVUZGRVJfUEFUSDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGaWxlTmFtZT0lc1xuIixzcmMpKTsKLQotCVJ0bXBPU0ZTSW5mb0NoYW5nZSgmb3NGU0luZm8sIFRSVUUpOwotCi0KLQotCWlmIChzcmMgJiYgKnNyYykKLQl7Ci0JCXNyY2YgPSBSdG1wT1NGaWxlT3BlbihzcmMsIE9fV1JPTkxZfE9fQ1JFQVQsIDApOwotCi0JCWlmIChJU19GSUxFX09QRU5fRVJSKHNyY2YpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIC1QVFJfRVJSKHNyY2YpLHNyYykpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotLyoKLQkJCS8vIFRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QKLQkJCWlmIChzcmNmLT5mX29wICYmIHNyY2YtPmZfb3AtPndyaXRlKQotCQkJewotCQkJCS8vIFRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY2YtPmZfb3AtPndyaXRlKHNyY2YsIHBBZC0+RUVQUk9NSW1hZ2UsIDEwMjQsICZzcmNmLT5mX3Bvcyk7Ci0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIi0tPiBFcnJvciEhIFN5c3RlbSBkb2VzdCBub3Qgc3VwcG9ydCByZWFkIGZ1bmN0aW9uXG4iKSk7Ci0JCQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQl9Ci0qLwotCi0JCQlSdG1wT1NGaWxlV3JpdGUoc3JjZiwgKFBTVFJJTkcpcEFkLT5FRVBST01JbWFnZSxNQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUpOwotCi0JCX0KLQotCi0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIi0tPiBFcnJvciBzcmMgIG9yIHNyY2YgaXMgbnVsbFxuIikpOwotCQlyZXR1cm4gRkFMU0U7Ci0KLQl9Ci0KLQlyZXR2YWw9UnRtcE9TRmlsZUNsb3NlKHNyY2YpOwotCi0JaWYgKHJldHZhbCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBFcnJvciAlZCBjbG9zaW5nICVzXG4iLCAtcmV0dmFsLCBzcmMpKTsKLQl9Ci0KLQlSdG1wT1NGU0luZm9DaGFuZ2UoJm9zRlNJbmZvLCBGQUxTRSk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotVk9JRCBlRnVzZUdldEZyZWVCbG9ja0NvdW50KElOIFBSVE1QX0FEQVBURVIgcEFkLAotCVBVSU5UIEVmdXNlRnJlZUJsb2NrKQotewotCVVTSE9SVCBpOwotCVVTSE9SVAlMb2dpY2FsQWRkcmVzczsKLQlpZighcEFkLT5iVXNlRWZ1c2UpCi0JCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJlRnVzZUdldEZyZWVCbG9ja0NvdW50IE9ubHkgc3VwcG9ydHMgZWZ1c2UgTW9kZVxuIikpOwotCQlyZXR1cm4gOwotCQl9Ci0JZm9yIChpID0gRUZVU0VfVVNBR0VfTUFQX1NUQVJUOyBpIDw9IEVGVVNFX1VTQUdFX01BUF9FTkQ7IGkrPTIpCi0JewotCQllRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycyhwQWQsIGksIDIsICZMb2dpY2FsQWRkcmVzcyk7Ci0JCWlmKCAoTG9naWNhbEFkZHJlc3MgJiAweGZmKSA9PSAwKQotCQl7Ci0JCQkqRWZ1c2VGcmVlQmxvY2s9IChVQ0hBUikgKEVGVVNFX1VTQUdFX01BUF9FTkQtaSsxKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UgaWYoKCAoTG9naWNhbEFkZHJlc3MgPj4gOCkgJiAweGZmKSA9PSAwKQotCQl7Ci0JCQkqRWZ1c2VGcmVlQmxvY2sgPSAoVUNIQVIpIChFRlVTRV9VU0FHRV9NQVBfRU5ELWkpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZihpID09IEVGVVNFX1VTQUdFX01BUF9FTkQpCi0JCQkqRWZ1c2VGcmVlQmxvY2sgPSAwOwotCX0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImVGdXNlR2V0RnJlZUJsb2NrQ291bnQgaXMgMHgleFxuIiwqRWZ1c2VGcmVlQmxvY2spKTsKLX0KLQotSU5UIGVGdXNlX2luaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUlOVAlFZnVzZUZyZWVCbG9jaz0wOwotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk5WTSBpcyBFZnVzZSBhbmQgaXRzIHNpemUgPSV4WyV4LSV4XSBcbiIsRUZVU0VfVVNBR0VfTUFQX1NJWkUsRUZVU0VfVVNBR0VfTUFQX1NUQVJULEVGVVNFX1VTQUdFX01BUF9FTkQpKTsKLQllRnVzZUdldEZyZWVCbG9ja0NvdW50KHBBZCwgJkVmdXNlRnJlZUJsb2NrKTsKLQkvL0lmIHRoZSB1c2VkIGJsb2NrIG9mIGVmdXNlIGlzIGxlc3MgdGhhbiA1LiBXZSBhc3N1bWUgdGhlIGRlZmF1bHQgdmFsdWUKLQkvLyBvZiB0aGlzIGVmdXNlIGlzIGVtcHR5IGFuZCBjaGFuZ2UgdG8gdGhlIGJ1ZmZlciBtb2RlIGluIG9kcmRlciB0bwotCS8vYnJpbmcgdXAgaW50ZXJmYWNlcyBzdWNjZXNzZnVsbHkuCi0JaWYoRWZ1c2VGcmVlQmxvY2sgPiAoRUZVU0VfVVNBR0VfTUFQX0VORC01KSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk5WTSBpcyBFZnVzZSBhbmQgdGhlIGluZm9ybWF0aW9uIGlzIHRvbyBsZXNzIHRvIGJyaW5nIHVwIGludGVyZmFjZS4gRm9yY2UgdG8gdXNlIEVFUFJPTSBCdWZmZXIgTW9kZVxuIikpOwotCQlwQWQtPmJGcm9jZUVFUFJPTUJ1ZmZlciA9IFRSVUU7Ci0JCWVGdXNlTG9hZEVFUFJPTShwQWQpOwotCX0KLQllbHNlCi0JCXBBZC0+YkZyb2NlRUVQUk9NQnVmZmVyID0gRkFMU0U7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTlZNIGlzIEVmdXNlIGFuZCBmb3JjZSB0byB1c2UgRUVQUk9NIEJ1ZmZlciBNb2RlPSV4XG4iLHBBZC0+YkZyb2NlRUVQUk9NQnVmZmVyKSk7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2VlX3Byb20uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2VlX3Byb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUxY2ZkZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9lZV9wcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQllZV9wcm9tLmMKLQotCUFic3RyYWN0OgotCU1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLQktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotc3RhdGljIGlubGluZSBWT0lEIFJhaXNlQ2xvY2soCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gICAgSU4gIFVJTlQzMiAqeCkKLXsKLQkqeCA9ICp4IHwgRUVTSzsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCAqeCk7Ci0JUlRNUHVzZWNEZWxheSgxKTsJCQkJLy8gTWF4IGZyZXF1ZW5jeSA9IDFNSHogaW4gU3BlYy4gZGVmaW5pdGlvbgotfQotCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotc3RhdGljIGlubGluZSBWT0lEIExvd2VyQ2xvY2soCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gICAgSU4gIFVJTlQzMiAqeCkKLXsKLQkqeCA9ICp4ICYgfkVFU0s7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgKngpOwotCVJUTVB1c2VjRGVsYXkoMSk7Ci19Ci0KLS8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCi1zdGF0aWMgaW5saW5lIFVTSE9SVCBTaGlmdEluQml0cygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVSU5UMzIJCXgsaTsKLQlVU0hPUlQgICAgICBkYXRhPTA7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLQotCXggJj0gfiggRUVETyB8IEVFREkpOwotCi0JZm9yKGk9MDsgaTwxNjsgaSsrKQotCXsKLQkJZGF0YSA9IGRhdGEgPDwgMTsKLQkJUmFpc2VDbG9jayhwQWQsICZ4KTsKLQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLQkJTG93ZXJDbG9jayhwQWQsICZ4KTsgLy9wcmV2ZW50IHJlYWQgZmFpbGVkCi0KLQkJeCAmPSB+KEVFREkpOwotCQlpZih4ICYgRUVETykKLQkJICAgIGRhdGEgfD0gMTsKLQl9Ci0KLQlyZXR1cm4gZGF0YTsKLX0KLQotCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotc3RhdGljIGlubGluZSBWT0lEIFNoaWZ0T3V0Qml0cygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVU0hPUlQJCQlkYXRhLAotCUlOIFVTSE9SVAkJCWNvdW50KQotewotCVVJTlQzMiAgICAgICB4LG1hc2s7Ci0KLQltYXNrID0gMHgwMSA8PCAoY291bnQgLSAxKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLQotCXggJj0gfihFRURPIHwgRUVESSk7Ci0KLQlkbwotCXsKLQkgICAgeCAmPSB+RUVESTsKLQkgICAgaWYoZGF0YSAmIG1hc2spCQl4IHw9IEVFREk7Ci0KLQkgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Ci0KLQkgICAgUmFpc2VDbG9jayhwQWQsICZ4KTsKLQkgICAgTG93ZXJDbG9jayhwQWQsICZ4KTsKLQotCSAgICBtYXNrID0gbWFzayA+PiAxOwotCX0gd2hpbGUobWFzayk7Ci0KLQl4ICY9IH5FRURJOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotfQotCi0KLS8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCi1zdGF0aWMgaW5saW5lIFZPSUQgRUVwcm9tQ2xlYW51cCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVSU5UMzIgeDsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCi0JeCAmPSB+KEVFQ1MgfCBFRURJKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLQotCVJhaXNlQ2xvY2socEFkLCAmeCk7Ci0JTG93ZXJDbG9jayhwQWQsICZ4KTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIFZPSUQgRVdFTigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVSU5UMzIJeDsKLQotCS8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0JeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7Ci0JeCB8PSBFRUNTOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotCi0JLy8ga2ljayBhIHB1bHNlCi0JUmFpc2VDbG9jayhwQWQsICZ4KTsKLQlMb3dlckNsb2NrKHBBZCwgJngpOwotCi0JLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgc2l4IHB1bHNlIGluIHRoYXQgb3JkZXIKLQlTaGlmdE91dEJpdHMocEFkLCBFRVBST01fRVdFTl9PUENPREUsIDUpOwotCVNoaWZ0T3V0Qml0cyhwQWQsIDAsIDYpOwotCi0JRUVwcm9tQ2xlYW51cChwQWQpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgVk9JRCBFV0RTKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVJTlQzMgl4OwotCi0JLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKLQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLQl4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKLQl4IHw9IEVFQ1M7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Ci0KLQkvLyBraWNrIGEgcHVsc2UKLQlSYWlzZUNsb2NrKHBBZCwgJngpOwotCUxvd2VyQ2xvY2socEFkLCAmeCk7Ci0KLQkvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCBzaXggcHVsc2UgaW4gdGhhdCBvcmRlcgotCVNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9FV0RTX09QQ09ERSwgNSk7Ci0JU2hpZnRPdXRCaXRzKHBBZCwgMCwgNik7Ci0KLQlFRXByb21DbGVhbnVwKHBBZCk7Ci19Ci0KLQotLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLWludCBydG1wX2VlX3Byb21fcmVhZDE2KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVTSE9SVAkJCU9mZnNldCwKLQlPVVQgVVNIT1JUCQkJKnBWYWx1ZSkKLXsKLQlVSU5UMzIJCXg7Ci0JVVNIT1JUCQlkYXRhOwotCi0jaWZkZWYgUlQzMHh4Ci0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi0JaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpCi0JewotCQlwQWQtPkVlcHJvbUFjY2VzcyA9IFRSVUU7Ci0JfQotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0JT2Zmc2V0IC89IDI7Ci0JLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKLQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLQl4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKLQl4IHw9IEVFQ1M7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Ci0KLQkvLyBwYXRjaCBjYW4gbm90IGFjY2VzcyBlLUZ1c2UgaXNzdWUKLQlpZiAoIShJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkpCi0JewotCQkvLyBraWNrIGEgcHVsc2UKLQkJUmFpc2VDbG9jayhwQWQsICZ4KTsKLQkJTG93ZXJDbG9jayhwQWQsICZ4KTsKLQl9Ci0KLQkvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCByZWdpc3RlciBudW1iZXIgaW4gdGhhdCBvcmRlcgotCVNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9SRUFEX09QQ09ERSwgMyk7Ci0JU2hpZnRPdXRCaXRzKHBBZCwgT2Zmc2V0LCBwQWQtPkVFUFJPTUFkZHJlc3NOdW0pOwotCi0JLy8gTm93IHJlYWQgdGhlIGRhdGEgKDE2IGJpdHMpIGluIGZyb20gdGhlIHNlbGVjdGVkIEVFUFJPTSB3b3JkCi0JZGF0YSA9IFNoaWZ0SW5CaXRzKHBBZCk7Ci0KLQlFRXByb21DbGVhbnVwKHBBZCk7Ci0KLSNpZmRlZiBSVDMweHgKLSNpZmRlZiBBTlRfRElWRVJTSVRZX1NVUFBPUlQKLQkvLyBBbnRlbm5hIGFuZCBFRVBST00gYWNjZXNzIGFyZSBib3RoIHVzaW5nIEVFU0sgcGluLAotCS8vIFRoZXJlZm9yIHdlIHNob3VsZCBhdm9pZCBhY2Nlc3NpbmcgRUVTSyBhdCB0aGUgc2FtZSB0aW1lCi0JLy8gVGhlbiByZXN0b3JlIGFudGVubmEgYWZ0ZXIgRUVQUk9NIGFjY2VzcwotCWlmICgocEFkLT5OaWNDb25maWcyLmZpZWxkLkFudERpdmVyc2l0eSkvKiB8fCAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApKi8pCi0JewotCQlwQWQtPkVlcHJvbUFjY2VzcyA9IEZBTFNFOwotCQlBc2ljU2V0UnhBbnQocEFkLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50KTsKLQl9Ci0jZW5kaWYgLy8gQU5UX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQkqcFZhbHVlID0gZGF0YTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLWludCBydG1wX2VlX3Byb21fd3JpdGUxNigKLSAgICBJTiAgUFJUTVBfQURBUFRFUglwQWQsCi0gICAgSU4gIFVTSE9SVCBPZmZzZXQsCi0gICAgSU4gIFVTSE9SVCBEYXRhKQotewotCVVJTlQzMiB4OwotCi0jaWZkZWYgUlQzMHh4Ci0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi0JaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpCi0JewotCQlwQWQtPkVlcHJvbUFjY2VzcyA9IFRSVUU7Ci0JfQotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0JT2Zmc2V0IC89IDI7Ci0KLQlFV0VOKHBBZCk7Ci0KLQkvLyByZXNldCBiaXRzIGFuZCBzZXQgRUVDUwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCXggJj0gfihFRURJIHwgRUVETyB8IEVFU0spOwotCXggfD0gRUVDUzsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLQotCS8vIHBhdGNoIGNhbiBub3QgYWNjZXNzIGUtRnVzZSBpc3N1ZQotCWlmICghKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSkKLQl7Ci0JCS8vIGtpY2sgYSBwdWxzZQotCQlSYWlzZUNsb2NrKHBBZCwgJngpOwotCQlMb3dlckNsb2NrKHBBZCwgJngpOwotCX0KLQotCS8vIG91dHB1dCB0aGUgcmVhZF9vcGNvZGUgLHJlZ2lzdGVyIG51bWJlciBhbmQgZGF0YSBpbiB0aGF0IG9yZGVyCi0JU2hpZnRPdXRCaXRzKHBBZCwgRUVQUk9NX1dSSVRFX09QQ09ERSwgMyk7Ci0JU2hpZnRPdXRCaXRzKHBBZCwgT2Zmc2V0LCBwQWQtPkVFUFJPTUFkZHJlc3NOdW0pOwotCVNoaWZ0T3V0Qml0cyhwQWQsIERhdGEsIDE2KTsJCS8vIDE2LWJpdCBhY2Nlc3MKLQotCS8vIHJlYWQgRE8gc3RhdHVzCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0KLQlFRXByb21DbGVhbnVwKHBBZCk7Ci0KLQlSVE1QdXNlY0RlbGF5KDEwMDAwKTsJLy9kZWxheSBmb3IgdHdwKE1BWCk9MTBtcwotCi0JRVdEUyhwQWQpOwotCi0JRUVwcm9tQ2xlYW51cChwQWQpOwotCi0jaWZkZWYgUlQzMHh4Ci0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi0JLy8gQW50ZW5uYSBhbmQgRUVQUk9NIGFjY2VzcyBhcmUgYm90aCB1c2luZyBFRVNLIHBpbiwKLQkvLyBUaGVyZWZvciB3ZSBzaG91bGQgYXZvaWQgYWNjZXNzaW5nIEVFU0sgYXQgdGhlIHNhbWUgdGltZQotCS8vIFRoZW4gcmVzdG9yZSBhbnRlbm5hIGFmdGVyIEVFUFJPTSBhY2Nlc3MKLQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpIC8qfHwgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwKSovKQotCXsKLQkJcEFkLT5FZXByb21BY2Nlc3MgPSBGQUxTRTsKLQkJQXNpY1NldFJ4QW50KHBBZCwgcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudCk7Ci0JfQotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2VlcHJvbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vZWVwcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlODM3NDkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vZWVwcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCWVlcHJvbS5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotSU5UIFJ0bXBDaGlwT3BzRWVwcm9tSG9vaygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBJTlQJCQlpbmZUeXBlKQotewotCVJUTVBfQ0hJUF9PUAkqcENoaXBPcHMgPSAmcEFkLT5jaGlwT3BzOwotI2lmZGVmIFJUMzB4eAotI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAotCVVJTlQzMgkJCWVGdXNlQ3RybCwgTWFjQ3NyMDsKLQlpbnQgaW5kZXg7Ci0KLQlpbmRleCA9IDA7Ci0JZG8KLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX0NTUjAsICZNYWNDc3IwKTsKLQkJcEFkLT5NQUNWZXJzaW9uID0gTWFjQ3NyMDsKLQotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAhPSAweDAwKSAmJiAocEFkLT5NQUNWZXJzaW9uICE9IDB4RkZGRkZGRkYpKQotCQkJYnJlYWs7Ci0KLQkJUlRNUHVzZWNEZWxheSgxMCk7Ci0JfSB3aGlsZSAoaW5kZXgrKyA8IDEwMCk7Ci0KLQlwQWQtPmJVc2VFZnVzZT1GQUxTRTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsICZlRnVzZUN0cmwpOwotCXBBZC0+YlVzZUVmdXNlID0gKCAoZUZ1c2VDdHJsICYgMHg4MDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkgPyAxIDogMDsKLQlpZihwQWQtPmJVc2VFZnVzZSkKLQl7Ci0JCXBDaGlwT3BzLT5lZWluaXQgPSBlRnVzZV9pbml0OwotCQlwQ2hpcE9wcy0+ZWVyZWFkID0gcnRtcF9lZV9lZnVzZV9yZWFkMTY7Ci0JCXBDaGlwT3BzLT5lZXdyaXRlID0gcnRtcF9lZV9lZnVzZV93cml0ZTE2OwotCQlyZXR1cm4gMCA7Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+YkZyb2NlRUVQUk9NQnVmZmVyID0gRkFMU0U7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5WTSBpcyBFRVBST01cbiIpKTsKLQl9Ci0jZW5kaWYgLy8gUlRNUF9FRlVTRV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQlzd2l0Y2goaW5mVHlwZSkKLQl7Ci0jaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAotCQljYXNlIFJUTVBfREVWX0lORl9QQ0k6Ci0JCQlwQ2hpcE9wcy0+ZWVpbml0ID0gTlVMTDsKLQkJCXBDaGlwT3BzLT5lZXJlYWQgPSBydG1wX2VlX3Byb21fcmVhZDE2OwotCQkJcENoaXBPcHMtPmVld3JpdGUgPSBydG1wX2VlX3Byb21fd3JpdGUxNjsKLQkJCWJyZWFrOwotI2VuZGlmIC8vIFJUTVBfUENJX1NVUFBPUlQgLy8KLQotCi0JCWRlZmF1bHQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSdG1wQ2hpcE9wc0VlcHJvbUhvb2soKSBmYWlsZWQhXG4iKSk7Ci0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2lnbXBfc25vb3AuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2lnbXBfc25vb3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwNjU4Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9pZ21wX3Nub29wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzY1ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLQotI2lmZGVmIElHTVBfU05PT1BfU1VQUE9SVAotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0jaW5jbHVkZSAiLi4vaXB2Ni5oIgotI2luY2x1ZGUgIi4uL2lnbXBfc25vb3AuaCIKLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5pdEZyZWVFbnRyeUxpc3QoCi0JSU4gUE1VTFRJQ0FTVF9GSUxURVJfVEFCTEUgcE11bHRpY2FzdEZpbHRlclRhYmxlLAotCUlOIFBMSVNUX0hFQURFUiBwTGlzdCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBGUkVFX01FTUJFUl9QT09MX1NJWkU7IGkrKykKLQkJaW5zZXJ0VGFpbExpc3QocExpc3QsIChQTElTVF9FTlRSWSkmKHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+ZnJlZU1lbWJlclBvb2xbaV0pKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIGlubGluZSBQTUVNQkVSX0VOVFJZIEFsbG9jYUdycE1lbWJlckVudHJ5KAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFIHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSkKLXsKLQlQTUVNQkVSX0VOVFJZIHBNZW1iZXJFbnRyeTsKLQotCVJUTVBfU0VNX0xPQ0soJnBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+RnJlZU1lbWJlclBvb2xUYWJMb2NrKTsKLQotCXBNZW1iZXJFbnRyeSA9IChQTUVNQkVSX0VOVFJZKXJlbW92ZUhlYWRMaXN0KCZwTXVsdGljYXN0RmlsdGVyVGFibGUtPmZyZWVFbnRyeUxpc3QpOwotCi0JUlRNUF9TRU1fVU5MT0NLKCZwTXVsdGljYXN0RmlsdGVyVGFibGUtPkZyZWVNZW1iZXJQb29sVGFiTG9jayk7Ci0KLQlyZXR1cm4gKFBNRU1CRVJfRU5UUlkpcE1lbWJlckVudHJ5OwotfQotCi1zdGF0aWMgaW5saW5lIFZPSUQgRnJlZUdycE1lbWJlckVudHJ5KAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFIHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwKLQlJTiBQTUVNQkVSX0VOVFJZIHBFbnRyeSkKLXsKLQlSVE1QX1NFTV9MT0NLKCZwTXVsdGljYXN0RmlsdGVyVGFibGUtPkZyZWVNZW1iZXJQb29sVGFiTG9jayk7Ci0KLQlpbnNlcnRUYWlsTGlzdCgmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5mcmVlRW50cnlMaXN0LCAoUExJU1RfRU5UUlkpcEVudHJ5KTsKLQotCVJUTVBfU0VNX1VOTE9DSygmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5GcmVlTWVtYmVyUG9vbFRhYkxvY2spOwotfQotCi1zdGF0aWMgVk9JRCBJR01QVGFibGVEaXNwbGF5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotc3RhdGljIEJPT0xFQU4gaXNJZ21wTWFjQWRkcigKLQlJTiBQVUNIQVIgcE1hY0FkZHIpOwotCi1zdGF0aWMgVk9JRCBJbnNlcnRJZ21wTWVtYmVyKAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFIHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwKLQlJTiBQTElTVF9IRUFERVIgcExpc3QsCi0JSU4gUFVDSEFSIHBNZW1iZXJBZGRyKTsKLQotc3RhdGljIFZPSUQgRGVsZXRlSWdtcE1lbWJlcigKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUsCi0JSU4gUExJU1RfSEVBREVSIHBMaXN0LAotCUlOIFBVQ0hBUiBwTWVtYmVyQWRkcik7Ci0KLXN0YXRpYyBWT0lEIERlbGV0ZUlnbXBNZW1iZXJMaXN0KAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFIHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwKLQlJTiBQTElTVF9IRUFERVIgcExpc3QpOwotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgVGhpcyByb3V0aW5lIGluaXQgdGhlIGVudGlyZSBJR01QIHRhYmxlLgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTXVsdGljYXN0RmlsdGVyVGFibGVJbml0KAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFICpwcE11bHRpY2FzdEZpbHRlclRhYmxlKQotewotCS8vIEluaXRpYWxpemUgTUFDIHRhYmxlIGFuZCBhbGxvY2F0ZSBzcGluIGxvY2sKLQkqcHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSA9IGttYWxsb2Moc2l6ZW9mKE1VTFRJQ0FTVF9GSUxURVJfVEFCTEUpLCBNRU1fQUxMT0NfRkxBRyk7Ci0JaWYgKCpwcE11bHRpY2FzdEZpbHRlclRhYmxlID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyB1bmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciBNdWx0aWNhc2UgZmlsdGVyIHRhYmxlLCBzaXplPSVkXG4iLAotCQkJX19GVU5DVElPTl9fLCBzaXplb2YoTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSkpKTsKLQkJcmV0dXJuOwotCX0KLQotCU5kaXNaZXJvTWVtb3J5KCpwcE11bHRpY2FzdEZpbHRlclRhYmxlLCBzaXplb2YoTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSkpOwotCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCYoKCpwcE11bHRpY2FzdEZpbHRlclRhYmxlKS0+TXVsdGljYXN0RmlsdGVyVGFiTG9jaykpOwotCi0JTmRpc0FsbG9jYXRlU3BpbkxvY2soJigoKnBwTXVsdGljYXN0RmlsdGVyVGFibGUpLT5GcmVlTWVtYmVyUG9vbFRhYkxvY2spKTsKLQlpbml0TGlzdCgmKCgqcHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSktPmZyZWVFbnRyeUxpc3QpKTsKLQlpbml0RnJlZUVudHJ5TGlzdCgqcHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgJigoKnBwTXVsdGljYXN0RmlsdGVyVGFibGUpLT5mcmVlRW50cnlMaXN0KSk7Ci0JcmV0dXJuOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFRoaXMgcm91dGluZSByZXNldCB0aGUgZW50aXJlIElHTVAgdGFibGUuCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNdWx0aUNhc3RGaWx0ZXJUYWJsZVJlc2V0KAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFICpwcE11bHRpY2FzdEZpbHRlclRhYmxlKQotewotCWlmKCpwcE11bHRpY2FzdEZpbHRlclRhYmxlID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyBNdWx0aWNhc2UgZmlsdGVyIHRhYmxlIGlzIG5vdCByZWFkeS5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm47Ci0JfQotCi0JTmRpc0ZyZWVTcGluTG9jaygmKCgqcHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSktPkZyZWVNZW1iZXJQb29sVGFiTG9jaykpOwotCU5kaXNGcmVlU3BpbkxvY2soJigoKnBwTXVsdGljYXN0RmlsdGVyVGFibGUpLT5NdWx0aWNhc3RGaWx0ZXJUYWJMb2NrKSk7Ci0Ja2ZyZWUoKnBwTXVsdGljYXN0RmlsdGVyVGFibGUpOwotCSpwcE11bHRpY2FzdEZpbHRlclRhYmxlID0gTlVMTDsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBEaXNwbGF5IGFsbCBlbnRyeXMgaW4gSUdNUCB0YWJsZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLXN0YXRpYyBWT0lEIElHTVBUYWJsZURpc3BsYXkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JaW50IGk7Ci0JTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKLQlQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUgPSBwQWQtPnBNdWx0aWNhc3RGaWx0ZXJUYWJsZTsKLQotCWlmIChwTXVsdGljYXN0RmlsdGVyVGFibGUgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlcyBNdWx0aWNhc2UgZmlsdGVyIHRhYmxlIGlzIG5vdCByZWFkeS5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gaWYgRlVMTCwgcmV0dXJuCi0JaWYgKHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+U2l6ZSA9PSAwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiVGFibGUgZW1wdHkuXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBhbGxvY2F0ZSBvbmUgTUFDIGVudHJ5Ci0JUlRNUF9TRU1fTE9DSygmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5NdWx0aWNhc3RGaWx0ZXJUYWJMb2NrKTsKLQotCWZvciAoaSA9IDA7IGk8IE1BWF9MRU5fT0ZfTVVMVElDQVNUX0ZJTFRFUl9UQUJMRTsgaSsrKQotCXsKLQkJLy8gcGljayB1cCB0aGUgZmlyc3QgYXZhaWxhYmxlIHZhY2FuY3kKLQkJaWYgKHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+Q29udGVudFtpXS5WYWxpZCA9PSBUUlVFKQotCQl7Ci0JCQlQTUVNQkVSX0VOVFJZIHBNZW1iZXJFbnRyeSA9IE5VTEw7Ci0JCQlwRW50cnkgPSAmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5Db250ZW50W2ldOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiSUYoJXMpIGVudHJ5ICMlZCwgdHlwZT0lcywgR3JwSWQ9KCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KSBtZW1iZXJDbnQ9JWRcbiIsCi0JCQkJUlRNUF9PU19ORVRERVZfR0VUX0RFVk5BTUUocEVudHJ5LT5uZXRfZGV2KSwgaSwgKHBFbnRyeS0+dHlwZT09MCA/ICJzdGF0aWMiOiJkeW5hbWljIiksCi0JCQkJUFJJTlRfTUFDKHBFbnRyeS0+QWRkciksIElnbXBNZW1iZXJDbnQoJnBFbnRyeS0+TWVtYmVyTGlzdCkpKTsKLQotCQkJcE1lbWJlckVudHJ5ID0gKFBNRU1CRVJfRU5UUlkpcEVudHJ5LT5NZW1iZXJMaXN0LnBIZWFkOwotCQkJd2hpbGUgKHBNZW1iZXJFbnRyeSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgibWVtYmVyIG1hYz0oJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngpXG4iLAotCQkJCQkJCQkJCVBSSU5UX01BQyhwTWVtYmVyRW50cnktPkFkZHIpKSk7Ci0KLQkJCQlwTWVtYmVyRW50cnkgPSBwTWVtYmVyRW50cnktPnBOZXh0OwotCQkJfQotCQl9Ci0JfQotCi0JUlRNUF9TRU1fVU5MT0NLKCZwTXVsdGljYXN0RmlsdGVyVGFibGUtPk11bHRpY2FzdEZpbHRlclRhYkxvY2spOwotCi0JcmV0dXJuOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIEFkZCBhbmQgbmV3IGVudHJ5IGludG8gTUFDIHRhYmxlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBNdWx0aWNhc3RGaWx0ZXJUYWJsZUluc2VydEVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwR3JwSWQsCi0JSU4gUFVDSEFSIHBNZW1iZXJBZGRyLAotCUlOIFBORVRfREVWIGRldiwKLQlJTiBNdWx0aWNhc3RGaWx0ZXJFbnRyeVR5cGUgdHlwZSkKLXsKLQlVQ0hBUiBIYXNoSWR4OwotCWludCBpOwotCU1VTFRJQ0FTVF9GSUxURVJfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5LCAqcFByZXZFbnRyeTsKLQlQTUVNQkVSX0VOVFJZIHBNZW1iZXJFbnRyeTsKLQlQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUgPSBwQWQtPnBNdWx0aWNhc3RGaWx0ZXJUYWJsZTsKLQotCWlmIChwTXVsdGljYXN0RmlsdGVyVGFibGUgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIE11bHRpY2FzZSBmaWx0ZXIgdGFibGUgaXMgbm90IHJlYWR5LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQkvLyBpZiBGVUxMLCByZXR1cm4KLQlpZiAocE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplID49IE1BWF9MRU5fT0ZfTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIE11bHRpY2FzZSBmaWx0ZXIgdGFibGUgZnVsbC4gbWF4LWVudHJpZXMgPSAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgTUFYX0xFTl9PRl9NVUxUSUNBU1RfRklMVEVSX1RBQkxFKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQkvLyBjaGVjayB0aGUgcnVsZSBpcyBpbiB0YWJsZSBhbHJlYWR5IG9yIG5vdC4KLQlpZiAoKHBFbnRyeSA9IE11bHRpY2FzdEZpbHRlclRhYmxlTG9va3VwKHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgcEdycElkLCBkZXYpKSkKLQl7Ci0JCS8vIGRvZXNuJ3QgaW5kaWNhdGUgbWVtYmVyIG1hYyBhZGRyZXNzLgotCQlpZihwTWVtYmVyQWRkciA9PSBOVUxMKQotCQl7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQotCQlwTWVtYmVyRW50cnkgPSAoUE1FTUJFUl9FTlRSWSlwRW50cnktPk1lbWJlckxpc3QucEhlYWQ7Ci0KLQkJd2hpbGUgKHBNZW1iZXJFbnRyeSkKLQkJewotCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBNZW1iZXJBZGRyLCBwTWVtYmVyRW50cnktPkFkZHIpKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBhbHJlYWR5IGluIE1lbWJlcnMgbGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQkJCXJldHVybiBGQUxTRTsKLQkJCX0KLQotCQkJcE1lbWJlckVudHJ5ID0gcE1lbWJlckVudHJ5LT5wTmV4dDsKLQkJfQotCX0KLQotCVJUTVBfU0VNX0xPQ0soJnBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+TXVsdGljYXN0RmlsdGVyVGFiTG9jayk7Ci0JZG8KLQl7Ci0JCVVMT05HIE5vdzsKLQkJLy8gdGhlIG11bHRpY2FzdCBlbnRyeSBhbHJlYWR5IGV4aXN0IGJ1dCBkb2Vzbid0IGluY2x1ZGUgdGhlIG1lbWJlciB5ZXQuCi0JCWlmIChwRW50cnkgIT0gTlVMTCAmJiBwTWVtYmVyQWRkciAhPSBOVUxMKQotCQl7Ci0JCQlJbnNlcnRJZ21wTWVtYmVyKHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgJnBFbnRyeS0+TWVtYmVyTGlzdCwgcE1lbWJlckFkZHIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvLyBhbGxvY2F0ZSBvbmUgTUFDIGVudHJ5Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX01VTFRJQ0FTVF9GSUxURVJfVEFCTEU7IGkrKykKLQkJewotCQkJLy8gcGljayB1cCB0aGUgZmlyc3QgYXZhaWxhYmxlIHZhY2FuY3kKLQkJCXBFbnRyeSA9ICZwTXVsdGljYXN0RmlsdGVyVGFibGUtPkNvbnRlbnRbaV07Ci0JCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCQkJaWYgKChwRW50cnktPlZhbGlkID09IFRSVUUpICYmIChwRW50cnktPnR5cGUgPT0gTUNBVF9GSUxURVJfRFlOQU1JQykKLQkJCQkmJiAoKE5vdyAtIHBFbnRyeS0+bGFzdFRpbWUpID4gSUdNUE1BQ19UQl9FTlRSWV9BR0VPVVRfVElNRSkpCi0JCQl7Ci0JCQkJUE1VTFRJQ0FTVF9GSUxURVJfVEFCTEVfRU5UUlkgcEhhc2hFbnRyeTsKLQotCQkJCUhhc2hJZHggPSBNVUxUSUNBU1RfQUREUl9IQVNIX0lOREVYKHBFbnRyeS0+QWRkcik7Ci0JCQkJcEhhc2hFbnRyeSA9IHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+SGFzaFtIYXNoSWR4XTsKLQotCQkJCWlmICgocEVudHJ5LT5uZXRfZGV2ID09IHBIYXNoRW50cnktPm5ldF9kZXYpCi0JCQkJCSYmIE1BQ19BRERSX0VRVUFMKHBFbnRyeS0+QWRkciwgcEhhc2hFbnRyeS0+QWRkcikpCi0JCQkJewotCQkJCQlwTXVsdGljYXN0RmlsdGVyVGFibGUtPkhhc2hbSGFzaElkeF0gPSBwSGFzaEVudHJ5LT5wTmV4dDsKLQkJCQkJcE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplIC0tOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNQ2FzdEZpbHRlclRhYmxlRGVsZXRlRW50cnkgMSAtIFRvdGFsPSAlZFxuIiwgcE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplKSk7Ci0JCQkJfSBlbHNlCi0JCQkJewotCQkJCQl3aGlsZSAocEhhc2hFbnRyeS0+cE5leHQpCi0JCQkJCXsKLQkJCQkJCXBQcmV2RW50cnkgPSBwSGFzaEVudHJ5OwotCQkJCQkJcEhhc2hFbnRyeSA9IHBIYXNoRW50cnktPnBOZXh0OwotCQkJCQkJaWYgKChwRW50cnktPm5ldF9kZXYgPT0gcEhhc2hFbnRyeS0+bmV0X2RldikKLQkJCQkJCQkmJiBNQUNfQUREUl9FUVVBTChwRW50cnktPkFkZHIsIHBIYXNoRW50cnktPkFkZHIpKQotCQkJCQkJewotCQkJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEhhc2hFbnRyeS0+cE5leHQ7Ci0JCQkJCQkJcE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplIC0tOwotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1DYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeSAyIC0gVG90YWw9ICVkXG4iLCBwTXVsdGljYXN0RmlsdGVyVGFibGUtPlNpemUpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlwRW50cnktPlZhbGlkID0gRkFMU0U7Ci0JCQkJRGVsZXRlSWdtcE1lbWJlckxpc3QocE11bHRpY2FzdEZpbHRlclRhYmxlLCAmcEVudHJ5LT5NZW1iZXJMaXN0KTsKLQkJCX0KLQotCQkJaWYgKHBFbnRyeS0+VmFsaWQgPT0gRkFMU0UpCi0JCQl7Ci0JCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSkpOwotCQkJCXBFbnRyeS0+VmFsaWQgPSBUUlVFOwotCi0JCQkJQ09QWV9NQUNfQUREUihwRW50cnktPkFkZHIsIHBHcnBJZCk7Ci0JCQkJcEVudHJ5LT5uZXRfZGV2ID0gZGV2OwotCQkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7Ci0JCQkJcEVudHJ5LT5sYXN0VGltZSA9IE5vdzsKLQkJCQlwRW50cnktPnR5cGUgPSB0eXBlOwotCQkJCWluaXRMaXN0KCZwRW50cnktPk1lbWJlckxpc3QpOwotCQkJCWlmIChwTWVtYmVyQWRkciAhPSBOVUxMKQotCQkJCQlJbnNlcnRJZ21wTWVtYmVyKHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgJnBFbnRyeS0+TWVtYmVyTGlzdCwgcE1lbWJlckFkZHIpOwotCi0JCQkJcE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplICsrOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTXVsdGljYXN0RmlsdGVyVGFibGVJbnNlcnRFbnRyeSAtSUYoJXMpIGFsbG9jYXRlIGVudHJ5ICMlZCwgVG90YWw9ICVkXG4iLCBSVE1QX09TX05FVERFVl9HRVRfREVWTkFNRShkZXYpLCBpLCBwTXVsdGljYXN0RmlsdGVyVGFibGUtPlNpemUpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCB0aGlzIE1BQyBlbnRyeSBpbnRvIEhBU0ggdGFibGUKLQkJaWYgKHBFbnRyeSkKLQkJewotCQkJSGFzaElkeCA9IE1VTFRJQ0FTVF9BRERSX0hBU0hfSU5ERVgocEdycElkKTsKLQkJCWlmIChwTXVsdGljYXN0RmlsdGVyVGFibGUtPkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKLQkJCXsKLQkJCQlwTXVsdGljYXN0RmlsdGVyVGFibGUtPkhhc2hbSGFzaElkeF0gPSBwRW50cnk7Ci0JCQl9IGVsc2UKLQkJCXsKLQkJCQlwQ3VyckVudHJ5ID0gcE11bHRpY2FzdEZpbHRlclRhYmxlLT5IYXNoW0hhc2hJZHhdOwotCQkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQotCQkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7Ci0JCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7Ci0JCQl9Ci0JCX0KLQl9d2hpbGUoRkFMU0UpOwotCi0JUlRNUF9TRU1fVU5MT0NLKCZwTXVsdGljYXN0RmlsdGVyVGFibGUtPk11bHRpY2FzdEZpbHRlclRhYkxvY2spOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgRGVsZXRlIGEgc3BlY2lmaWVkIGNsaWVudCBmcm9tIE1BQyB0YWJsZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gTXVsdGljYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcEdycElkLAotCUlOIFBVQ0hBUiBwTWVtYmVyQWRkciwKLQlJTiBQTkVUX0RFViBkZXYpCi17Ci0JVVNIT1JUIEhhc2hJZHg7Ci0JTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSAqcEVudHJ5LCAqcFByZXZFbnRyeTsKLQlQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUgPSBwQWQtPnBNdWx0aWNhc3RGaWx0ZXJUYWJsZTsKLQlVU0hPUlQgQWlkID0gTUNBU1RfV0NJRDsKLQlTU1QJU3N0ID0gU1NUX0FTU09DOwotCVVDSEFSIFBzTW9kZSA9IFBXUl9BQ1RJVkUsIFJhdGU7Ci0KLQlpZiAocE11bHRpY2FzdEZpbHRlclRhYmxlID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyBNdWx0aWNhc2UgZmlsdGVyIHRhYmxlIGlzIG5vdCByZWFkeS5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JUlRNUF9TRU1fTE9DSygmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5NdWx0aWNhc3RGaWx0ZXJUYWJMb2NrKTsKLQotCWRvCi0JewotCQlIYXNoSWR4ID0gTVVMVElDQVNUX0FERFJfSEFTSF9JTkRFWChwR3JwSWQpOwotCQlwUHJldkVudHJ5ID0gcEVudHJ5ID0gcE11bHRpY2FzdEZpbHRlclRhYmxlLT5IYXNoW0hhc2hJZHhdOwotCi0JCXdoaWxlIChwRW50cnkgJiYgcEVudHJ5LT5WYWxpZCkKLQkJewotCQkJaWYgKChwRW50cnktPm5ldF9kZXYgPT0gIGRldikKLQkJCQkmJiBNQUNfQUREUl9FUVVBTChwRW50cnktPkFkZHIsIHBHcnBJZCkpCi0JCQkJYnJlYWs7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcFByZXZFbnRyeSA9IHBFbnRyeTsKLQkJCQlwRW50cnkgPSBwRW50cnktPnBOZXh0OwotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgdGhlIHJ1bGUgaXMgaW4gdGFibGUgYWxyZWFkeSBvciBub3QuCi0JCWlmIChwRW50cnkgJiYgKHBNZW1iZXJBZGRyICE9IE5VTEwpKQotCQl7Ci0JCQlpZihBUFNzUHNJbnF1aXJ5KHBBZCwgcE1lbWJlckFkZHIsICZTc3QsICZBaWQsICZQc01vZGUsICZSYXRlKSkKLQkJCQlEZWxldGVJZ21wTWVtYmVyKHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgJnBFbnRyeS0+TWVtYmVyTGlzdCwgcE1lbWJlckFkZHIpOwotCQkJaWYgKElnbXBNZW1iZXJDbnQoJnBFbnRyeS0+TWVtYmVyTGlzdCkgPiAwKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHBFbnRyeSkKLQkJewotCQkJaWYgKHBFbnRyeSA9PSBwTXVsdGljYXN0RmlsdGVyVGFibGUtPkhhc2hbSGFzaElkeF0pCi0JCQl7Ci0JCQkJcE11bHRpY2FzdEZpbHRlclRhYmxlLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKLQkJCQlEZWxldGVJZ21wTWVtYmVyTGlzdChwTXVsdGljYXN0RmlsdGVyVGFibGUsICZwRW50cnktPk1lbWJlckxpc3QpOwotCQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKE1VTFRJQ0FTVF9GSUxURVJfVEFCTEVfRU5UUlkpKTsKLQkJCQlwTXVsdGljYXN0RmlsdGVyVGFibGUtPlNpemUgLS07Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUNhc3RGaWx0ZXJUYWJsZURlbGV0ZUVudHJ5IDEgLSBUb3RhbD0gJWRcbiIsIHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+U2l6ZSkpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKLQkJCQlEZWxldGVJZ21wTWVtYmVyTGlzdChwTXVsdGljYXN0RmlsdGVyVGFibGUsICZwRW50cnktPk1lbWJlckxpc3QpOwotCQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKE1VTFRJQ0FTVF9GSUxURVJfVEFCTEVfRU5UUlkpKTsKLQkJCQlwTXVsdGljYXN0RmlsdGVyVGFibGUtPlNpemUgLS07Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUNhc3RGaWx0ZXJUYWJsZURlbGV0ZUVudHJ5IDIgLSBUb3RhbD0gJWRcbiIsIHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+U2l6ZSkpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHRoZSBHcm91cCBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCX0KLQl9IHdoaWxlKEZBTFNFKTsKLQotCVJUTVBfU0VNX1VOTE9DSygmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5NdWx0aWNhc3RGaWx0ZXJUYWJMb2NrKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIExvb2sgdXAgdGhlIE1BQyBhZGRyZXNzIGluIHRoZSBJR01QIHRhYmxlLiBSZXR1cm4gTlVMTCBpZiBub3QgZm91bmQuCi0gICAgUmV0dXJuOgotICAgICAgICBwRW50cnkgLSBwb2ludGVyIHRvIHRoZSBNQUMgZW50cnk7IE5VTEwgaXMgbm90IGZvdW5kCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1QTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSBNdWx0aWNhc3RGaWx0ZXJUYWJsZUxvb2t1cCgKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUsCi0JSU4gUFVDSEFSIHBBZGRyLAotCUlOIFBORVRfREVWIGRldikKLXsKLQlVTE9ORyBIYXNoSWR4LCBOb3c7Ci0JUE1VTFRJQ0FTVF9GSUxURVJfVEFCTEVfRU5UUlkgcEVudHJ5ID0gTlVMTCwgcFByZXYgPSBOVUxMOwotCi0JaWYgKHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgTXVsdGljYXNlIGZpbHRlciB0YWJsZSBpcyBub3QgcmVhZHkuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JUlRNUF9TRU1fTE9DSygmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5NdWx0aWNhc3RGaWx0ZXJUYWJMb2NrKTsKLQotCUhhc2hJZHggPSBNVUxUSUNBU1RfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKLQlwRW50cnkgPSBwUHJldiA9IHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+SGFzaFtIYXNoSWR4XTsKLQotCXdoaWxlIChwRW50cnkgJiYgcEVudHJ5LT5WYWxpZCkKLQl7Ci0JCWlmICgocEVudHJ5LT5uZXRfZGV2ID09ICBkZXYpCi0JCQkmJiBNQUNfQUREUl9FUVVBTChwRW50cnktPkFkZHIsIHBBZGRyKSkKLQkJewotCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKLQkJCXBFbnRyeS0+bGFzdFRpbWUgPSBOb3c7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlCi0JCXsKLQkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7Ci0JCQlpZiAoKHBFbnRyeS0+VmFsaWQgPT0gVFJVRSkgJiYgKHBFbnRyeS0+dHlwZSA9PSBNQ0FUX0ZJTFRFUl9EWU5BTUlDKQotCQkJCSYmIFJUTVBfVElNRV9BRlRFUihOb3csIHBFbnRyeS0+bGFzdFRpbWUrSUdNUE1BQ19UQl9FTlRSWV9BR0VPVVRfVElNRSkpCi0JCQl7Ci0JCQkJLy8gUmVtb3ZlIHRoZSBhZ2VkIGVudHJ5Ci0JCQkJaWYgKHBFbnRyeSA9PSBwTXVsdGljYXN0RmlsdGVyVGFibGUtPkhhc2hbSGFzaElkeF0pCi0JCQkJewotCQkJCQlwTXVsdGljYXN0RmlsdGVyVGFibGUtPkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OwotCQkJCQlwUHJldiA9IHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+SGFzaFtIYXNoSWR4XTsKLQkJCQkJRGVsZXRlSWdtcE1lbWJlckxpc3QocE11bHRpY2FzdEZpbHRlclRhYmxlLCAmcEVudHJ5LT5NZW1iZXJMaXN0KTsKLQkJCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSkpOwotCQkJCQlwTXVsdGljYXN0RmlsdGVyVGFibGUtPlNpemUgLS07Ci0JCQkJCXBFbnRyeSA9IHBQcmV2OwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNQ2FzdEZpbHRlclRhYmxlRGVsZXRlRW50cnkgMiAtIFRvdGFsPSAlZFxuIiwgcE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXBQcmV2LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7Ci0JCQkJCURlbGV0ZUlnbXBNZW1iZXJMaXN0KHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgJnBFbnRyeS0+TWVtYmVyTGlzdCk7Ci0JCQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKE1VTFRJQ0FTVF9GSUxURVJfVEFCTEVfRU5UUlkpKTsKLQkJCQkJcE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplIC0tOwotCQkJCQlwRW50cnkgPSAocFByZXYgPT0gTlVMTCA/IE5VTEw6IHBQcmV2LT5wTmV4dCk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1DYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeSAyIC0gVG90YWw9ICVkXG4iLCBwTXVsdGljYXN0RmlsdGVyVGFibGUtPlNpemUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcFByZXYgPSBwRW50cnk7Ci0JCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKLQkJCX0KLQkJfQotCX0KLQotCVJUTVBfU0VNX1VOTE9DSygmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5NdWx0aWNhc3RGaWx0ZXJUYWJMb2NrKTsKLQotCXJldHVybiBwRW50cnk7Ci19Ci0KLVZPSUQgSUdNUFNub29waW5nKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwRHN0TWFjQWRkciwKLQlJTiBQVUNIQVIgcFNyY01hY0FkZHIsCi0JSU4gUFVDSEFSIHBJcEhlYWRlciwKLQlJTiBQTkVUX0RFViBwRGV2KQotewotCUlOVCBpOwotCUlOVCBJcEhlYWRlckxlbjsKLQlVQ0hBUiBHcm91cFR5cGU7Ci0JVUlOVDE2IG51bU9mR3JvdXA7Ci0JVUNIQVIgSWdtcFZlclR5cGU7Ci0JUFVDSEFSIHBJZ21wSGVhZGVyOwotCVBVQ0hBUiBwR3JvdXA7Ci0JVUNIQVIgQXV4RGF0YUxlbjsKLQlVSU5UMTYgbnVtT2ZTb3VyY2VzOwotCVBVQ0hBUiBwR3JvdXBJcEFkZHI7Ci0JVUNIQVIgR3JvdXBNYWNBZGRyWzZdOwotCVBVQ0hBUiBwR3JvdXBNYWNBZGRyID0gKFBVQ0hBUikmR3JvdXBNYWNBZGRyOwotCi0JaWYoaXNJZ21wUGt0KHBEc3RNYWNBZGRyLCBwSXBIZWFkZXIpKQotCXsKLQkJSXBIZWFkZXJMZW4gPSAoKihwSXBIZWFkZXIgKyAyKSAmIDB4MGYpICogNDsKLQkJcElnbXBIZWFkZXIgPSBwSXBIZWFkZXIgKyAyICsgSXBIZWFkZXJMZW47Ci0JCUlnbXBWZXJUeXBlID0gKFVDSEFSKSgqKHBJZ21wSGVhZGVyKSk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUdNUCB0eXBlPSUweFxuIiwgSWdtcFZlclR5cGUpKTsKLQotCQlzd2l0Y2goSWdtcFZlclR5cGUpCi0JCXsKLQkJY2FzZSBJR01QX1YxX01FTUJFUlNISVBfUkVQT1JUOiAvLyBJR01QIHZlcnNpb24gMSBtZW1iZXJzaGlwIHJlcG9ydC4KLQkJY2FzZSBJR01QX1YyX01FTUJFUlNISVBfUkVQT1JUOiAvLyBJR01QIHZlcnNpb24gMiBtZW1iZXJzaGlwIHJlcG9ydC4KLQkJCXBHcm91cElwQWRkciA9IChQVUNIQVIpKHBJZ21wSGVhZGVyICsgNCk7Ci0JCQkJQ29udmVydE11bHRpY2FzdElQMk1BQyhwR3JvdXBJcEFkZHIsIChQVUNIQVIgKikmcEdyb3VwTWFjQWRkciwgRVRIX1BfSVApOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUdNUCBHcm91cD0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCQlHcm91cE1hY0FkZHJbMF0sIEdyb3VwTWFjQWRkclsxXSwgR3JvdXBNYWNBZGRyWzJdLCBHcm91cE1hY0FkZHJbM10sIEdyb3VwTWFjQWRkcls0XSwgR3JvdXBNYWNBZGRyWzVdKSk7Ci0JCQlNdWx0aWNhc3RGaWx0ZXJUYWJsZUluc2VydEVudHJ5KHBBZCwgR3JvdXBNYWNBZGRyLCBwU3JjTWFjQWRkciwgcERldiwgTUNBVF9GSUxURVJfRFlOQU1JQyk7Ci0JCQlicmVhazsKLQotCQljYXNlIElHTVBfTEVBVkVfR1JPVVA6IC8vIElHTVAgdmVyc2lvbiAxIGFuZCB2ZXJzaW9uIDIgbGVhdmUgZ3JvdXAuCi0JCQlwR3JvdXBJcEFkZHIgPSAoUFVDSEFSKShwSWdtcEhlYWRlciArIDQpOwotCQkJCUNvbnZlcnRNdWx0aWNhc3RJUDJNQUMocEdyb3VwSXBBZGRyLCAoUFVDSEFSICopJnBHcm91cE1hY0FkZHIsIEVUSF9QX0lQKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklHTVAgR3JvdXA9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQkJR3JvdXBNYWNBZGRyWzBdLCBHcm91cE1hY0FkZHJbMV0sIEdyb3VwTWFjQWRkclsyXSwgR3JvdXBNYWNBZGRyWzNdLCBHcm91cE1hY0FkZHJbNF0sIEdyb3VwTWFjQWRkcls1XSkpOwotCQkJTXVsdGljYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeShwQWQsIEdyb3VwTWFjQWRkciwgcFNyY01hY0FkZHIsIHBEZXYpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJR01QX1YzX01FTUJFUlNISVBfUkVQT1JUOiAvLyBJR01QIHZlcnNpb24gMyBtZW1iZXJzaGlwIHJlcG9ydC4KLQkJCW51bU9mR3JvdXAgPSBudG9ocygqKChVSU5UMTYgKikocElnbXBIZWFkZXIgKyA2KSkpOwotCQkJcEdyb3VwID0gKFBVQ0hBUikocElnbXBIZWFkZXIgKyA4KTsKLQkJCWZvciAoaT0wOyBpIDwgbnVtT2ZHcm91cDsgaSsrKQotCQkJewotCQkJCUdyb3VwVHlwZSA9IChVQ0hBUikoKnBHcm91cCk7Ci0JCQkJQXV4RGF0YUxlbiA9IChVQ0hBUikoKihwR3JvdXAgKyAxKSk7Ci0JCQkJbnVtT2ZTb3VyY2VzID0gbnRvaHMoKigoVUlOVDE2ICopKHBHcm91cCArIDIpKSk7Ci0JCQkJcEdyb3VwSXBBZGRyID0gKFBVQ0hBUikocEdyb3VwICsgNCk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUdNUHYzIFR5cGU9JWQsIEFETD0lZCwgbnVtT2ZTb3VyY2U9JWRcbiIsIEdyb3VwVHlwZSwgQXV4RGF0YUxlbiwgbnVtT2ZTb3VyY2VzKSk7Ci0JCQkJCUNvbnZlcnRNdWx0aWNhc3RJUDJNQUMocEdyb3VwSXBBZGRyLCAoUFVDSEFSICopJnBHcm91cE1hY0FkZHIsIEVUSF9QX0lQKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJR01QIEdyb3VwPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJCQlHcm91cE1hY0FkZHJbMF0sIEdyb3VwTWFjQWRkclsxXSwgR3JvdXBNYWNBZGRyWzJdLCBHcm91cE1hY0FkZHJbM10sIEdyb3VwTWFjQWRkcls0XSwgR3JvdXBNYWNBZGRyWzVdKSk7Ci0KLQkJCQlkbwotCQkJCXsKLQkJCQkJaWYoKEdyb3VwVHlwZSA9PSBNT0RFX0lTX0VYQ0xVREUpIHx8IChHcm91cFR5cGUgPT0gQ0hBTkdFX1RPX0VYQ0xVREVfTU9ERSkgfHwgKEdyb3VwVHlwZSA9PSBBTExPV19ORVdfU09VUkNFUykpCi0JCQkJCXsKLQkJCQkJCU11bHRpY2FzdEZpbHRlclRhYmxlSW5zZXJ0RW50cnkocEFkLCBHcm91cE1hY0FkZHIsIHBTcmNNYWNBZGRyLCBwRGV2LCBNQ0FUX0ZJTFRFUl9EWU5BTUlDKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJaWYoKEdyb3VwVHlwZSA9PSBNT0RFX0lTX0lOQ0xVREUpIHx8IChHcm91cFR5cGUgPT0gQkxPQ0tfT0xEX1NPVVJDRVMpKQotCQkJCQl7Ci0JCQkJCQlNdWx0aWNhc3RGaWx0ZXJUYWJsZURlbGV0ZUVudHJ5KHBBZCwgR3JvdXBNYWNBZGRyLCBwU3JjTWFjQWRkciwgcERldik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCi0JCQkJCWlmKChHcm91cFR5cGUgPT0gQ0hBTkdFX1RPX0lOQ0xVREVfTU9ERSkpCi0JCQkJCXsKLQkJCQkJCWlmKG51bU9mU291cmNlcyA9PSAwKQotCQkJCQkJCU11bHRpY2FzdEZpbHRlclRhYmxlRGVsZXRlRW50cnkocEFkLCBHcm91cE1hY0FkZHIsIHBTcmNNYWNBZGRyLCBwRGV2KTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlNdWx0aWNhc3RGaWx0ZXJUYWJsZUluc2VydEVudHJ5KHBBZCwgR3JvdXBNYWNBZGRyLCBwU3JjTWFjQWRkciwgcERldiwgTUNBVF9GSUxURVJfRFlOQU1JQyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0gd2hpbGUoRkFMU0UpOwotCQkJCXBHcm91cCArPSAoOCArIChudW1PZlNvdXJjZXMgKiA0KSArIEF1eERhdGFMZW4pOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInVua25vdyBJR01QIFR5cGU9JWRcbiIsIElnbXBWZXJUeXBlKSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybjsKLX0KLQotCi1zdGF0aWMgQk9PTEVBTiBpc0lnbXBNYWNBZGRyKAotCUlOIFBVQ0hBUiBwTWFjQWRkcikKLXsKLQlpZigocE1hY0FkZHJbMF0gPT0gMHgwMSkKLQkJJiYgKHBNYWNBZGRyWzFdID09IDB4MDApCi0JCSYmIChwTWFjQWRkclsyXSA9PSAweDVlKSkKLQkJcmV0dXJuIFRSVUU7Ci0JcmV0dXJuIEZBTFNFOwotfQotCi1CT09MRUFOIGlzSWdtcFBrdCgKLQlJTiBQVUNIQVIgcERzdE1hY0FkZHIsCi0JSU4gUFVDSEFSIHBJcEhlYWRlcikKLXsKLQlVSU5UMTYgSXBQcm90b2NvbCA9IG50b2hzKCooKFVJTlQxNiAqKShwSXBIZWFkZXIpKSk7Ci0JVUNIQVIgSWdtcFByb3RvY29sOwotCi0JaWYoIWlzSWdtcE1hY0FkZHIocERzdE1hY0FkZHIpKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlpZihJcFByb3RvY29sID09IEVUSF9QX0lQKQotCXsKLQkJSWdtcFByb3RvY29sID0gKFVDSEFSKSoocElwSGVhZGVyICsgMTEpOwotCQlpZihJZ21wUHJvdG9jb2wgPT0gSUdNUF9QUk9UT0NPTF9ERVNDUklQVE9SKQotCQkJCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKLX0KLQotc3RhdGljIFZPSUQgSW5zZXJ0SWdtcE1lbWJlcigKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUsCi0JSU4gUExJU1RfSEVBREVSIHBMaXN0LAotCUlOIFBVQ0hBUiBwTWVtYmVyQWRkcikKLXsKLQlQTUVNQkVSX0VOVFJZIHBNZW1iZXJFbnRyeTsKLQotCWlmKHBMaXN0ID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogbWVtYmVydCBsaXN0IGRvZXNuJ3QgZXhpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwTWVtYmVyQWRkciA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IGludmFsaWQgbWVtYmVyLlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZigocE1lbWJlckVudHJ5ID0gKFBNRU1CRVJfRU5UUlkpQWxsb2NhR3JwTWVtYmVyRW50cnkocE11bHRpY2FzdEZpbHRlclRhYmxlKSkgIT0gTlVMTCkKLQl7Ci0JCU5kaXNaZXJvTWVtb3J5KHBNZW1iZXJFbnRyeSwgc2l6ZW9mKE1FTUJFUl9FTlRSWSkpOwotCQlDT1BZX01BQ19BRERSKHBNZW1iZXJFbnRyeS0+QWRkciwgcE1lbWJlckFkZHIpOwotCQlpbnNlcnRUYWlsTGlzdChwTGlzdCwgKFBMSVNUX0VOVFJZKXBNZW1iZXJFbnRyeSk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgTWVtYmVyIE1hYz0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgX19GVU5DVElPTl9fLAotCQkJcE1lbWJlckVudHJ5LT5BZGRyWzBdLCBwTWVtYmVyRW50cnktPkFkZHJbMV0sIHBNZW1iZXJFbnRyeS0+QWRkclsyXSwKLQkJCXBNZW1iZXJFbnRyeS0+QWRkclszXSwgcE1lbWJlckVudHJ5LT5BZGRyWzRdLCBwTWVtYmVyRW50cnktPkFkZHJbNV0pKTsKLQl9Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgVk9JRCBEZWxldGVJZ21wTWVtYmVyKAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFIHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwKLQlJTiBQTElTVF9IRUFERVIgcExpc3QsCi0JSU4gUFVDSEFSIHBNZW1iZXJBZGRyKQotewotCVBNRU1CRVJfRU5UUlkgcEN1ckVudHJ5OwotCi0JaWYoKHBMaXN0ID09IE5VTEwpIHx8IChwTGlzdC0+cEhlYWQgPT0gTlVMTCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogbWVtYmVydCBsaXN0IGRvZXNuJ3QgZXhpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwTWVtYmVyQWRkciA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IGludmFsaWQgbWVtYmVyLlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwQ3VyRW50cnkgPSAoUE1FTUJFUl9FTlRSWSlwTGlzdC0+cEhlYWQ7Ci0Jd2hpbGUgKHBDdXJFbnRyeSkKLQl7Ci0JCWlmKE1BQ19BRERSX0VRVUFMKHBNZW1iZXJBZGRyLCBwQ3VyRW50cnktPkFkZHIpKQotCQl7Ci0JCQlkZWxFbnRyeUxpc3QocExpc3QsIChQTElTVF9FTlRSWSlwQ3VyRW50cnkpOwotCQkJRnJlZUdycE1lbWJlckVudHJ5KHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgcEN1ckVudHJ5KTsKLQkJCWJyZWFrOwotCQl9Ci0JCXBDdXJFbnRyeSA9IHBDdXJFbnRyeS0+cE5leHQ7Ci0JfQotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgVk9JRCBEZWxldGVJZ21wTWVtYmVyTGlzdCgKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUsCi0JSU4gUExJU1RfSEVBREVSIHBMaXN0KQotewotCVBNRU1CRVJfRU5UUlkgcEN1ckVudHJ5LCBwUHJ2RW50cnk7Ci0KLQlpZigocExpc3QgPT0gTlVMTCkgfHwgKHBMaXN0LT5wSGVhZCA9PSBOVUxMKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBtZW1iZXJ0IGxpc3QgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm47Ci0JfQotCi0JcFBydkVudHJ5ID0gcEN1ckVudHJ5ID0gKFBNRU1CRVJfRU5UUlkpcExpc3QtPnBIZWFkOwotCXdoaWxlIChwQ3VyRW50cnkpCi0JewotCQlkZWxFbnRyeUxpc3QocExpc3QsIChQTElTVF9FTlRSWSlwQ3VyRW50cnkpOwotCQlwUHJ2RW50cnkgPSBwQ3VyRW50cnk7Ci0JCXBDdXJFbnRyeSA9IHBDdXJFbnRyeS0+cE5leHQ7Ci0JCUZyZWVHcnBNZW1iZXJFbnRyeShwTXVsdGljYXN0RmlsdGVyVGFibGUsIHBQcnZFbnRyeSk7Ci0JfQotCi0JaW5pdExpc3QocExpc3QpOwotCXJldHVybjsKLX0KLQotCi1VQ0hBUiBJZ21wTWVtYmVyQ250KAotCUlOIFBMSVNUX0hFQURFUiBwTGlzdCkKLXsKLQlpZihwTGlzdCA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IG1lbWJlcnQgbGlzdCBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiBnZXRMaXN0U2l6ZShwTGlzdCk7Ci19Ci0KLVZPSUQgSWdtcEdyb3VwRGVsTWVtYmVycygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcE1lbWJlckFkZHIsCi0JSU4gUE5FVF9ERVYgcERldikKLXsKLQlJTlQgaTsKLQlNVUxUSUNBU1RfRklMVEVSX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOwotCVBNVUxUSUNBU1RfRklMVEVSX1RBQkxFIHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSA9IHBBZC0+cE11bHRpY2FzdEZpbHRlclRhYmxlOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfTVVMVElDQVNUX0ZJTFRFUl9UQUJMRTsgaSsrKQotCXsKLQkJLy8gcGljayB1cCB0aGUgZmlyc3QgYXZhaWxhYmxlIHZhY2FuY3kKLQkJcEVudHJ5ID0gJnBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+Q29udGVudFtpXTsKLQkJaWYgKHBFbnRyeS0+VmFsaWQgPT0gVFJVRSkKLQkJewotCQkJaWYocE1lbWJlckFkZHIgIT0gTlVMTCkKLQkJCXsKLQkJCQlSVE1QX1NFTV9MT0NLKCZwTXVsdGljYXN0RmlsdGVyVGFibGUtPk11bHRpY2FzdEZpbHRlclRhYkxvY2spOwotCQkJCURlbGV0ZUlnbXBNZW1iZXIocE11bHRpY2FzdEZpbHRlclRhYmxlLCAmcEVudHJ5LT5NZW1iZXJMaXN0LCBwTWVtYmVyQWRkcik7Ci0JCQkJUlRNUF9TRU1fVU5MT0NLKCZwTXVsdGljYXN0RmlsdGVyVGFibGUtPk11bHRpY2FzdEZpbHRlclRhYkxvY2spOwotCQkJfQotCi0JCQlpZigocEVudHJ5LT50eXBlID09IE1DQVRfRklMVEVSX0RZTkFNSUMpCi0JCQkJJiYgKElnbXBNZW1iZXJDbnQoJnBFbnRyeS0+TWVtYmVyTGlzdCkgPT0gMCkpCi0JCQkJTXVsdGljYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeShwQWQsIHBFbnRyeS0+QWRkciwgcE1lbWJlckFkZHIsIHBEZXYpOwotCQl9Ci0JfQotfQotCi1JTlQgU2V0X0lnbXBTbl9FbmFibGVfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQU1RSSU5HIGFyZykKLXsKLQlVSU5UIEVuYWJsZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0JVUNIQVIgaWZJbmRleDsKLQlQTkVUX0RFViBwRGV2OwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQlpZkluZGV4ID0gcE9iai0+aW9jdGxfaWY7Ci0KLQlwRGV2ID0gKGlmSW5kZXggPT0gTUFJTl9NQlNTSUQpID8gKHBBZC0+bmV0X2RldikgOiAocEFkLT5BcENmZy5NQlNTSURbaWZJbmRleF0uTVNTSUREZXYpOwotCUVuYWJsZSA9IChVSU5UKSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JcEFkLT5BcENmZy5NQlNTSURbaWZJbmRleF0uSWdtcFNub29wRW5hYmxlID0gKEJPT0xFQU4pKEVuYWJsZSA9PSAwID8gMCA6IDEpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooJXMpICVzXG4iLCBfX0ZVTkNUSU9OX18sIFJUTVBfT1NfTkVUREVWX0dFVF9ERVZOQU1FKHBEZXYpLCBFbmFibGUgPT0gVFJVRSA/ICJFbmFibGUgSUdNUCBTbm9vcGluZyI6IkRpc2FibGUgSUdNUCBTbm9vcGluZyIpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQgU2V0X0lnbXBTbl9BZGRFbnRyeV9Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBTVFJJTkcgYXJnKQotewotCUlOVCBpOwotCUJPT0xFQU4gYkdyb3VwSWQgPSAxOwotCVBTVFJJTkcgdmFsdWU7Ci0JUFNUUklORyB0aGlzQ2hhcjsKLQlVQ0hBUiBJcEFkZHJbNF07Ci0JVUNIQVIgQWRkcltFVEhfTEVOR1RIX09GX0FERFJFU1NdOwotCVVDSEFSIEdyb3VwSWRbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKLQlQVUNIQVIgKnBBZGRyID0gKFBVQ0hBUiAqKSZBZGRyOwotCVBORVRfREVWIHBEZXY7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCVVDSEFSIGlmSW5kZXg7Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCWlmSW5kZXggPSBwT2JqLT5pb2N0bF9pZjsKLQotCXBEZXYgPSAoaWZJbmRleCA9PSBNQUlOX01CU1NJRCkgPyAocEFkLT5uZXRfZGV2KSA6IChwQWQtPkFwQ2ZnLk1CU1NJRFtpZkluZGV4XS5NU1NJRERldik7Ci0KLQl3aGlsZSAoKHRoaXNDaGFyID0gc3Ryc2VwKChjaGFyICoqKSZhcmcsICItIikpICE9IE5VTEwpCi0JewotCQkvLyByZWZ1c2UgdGhlIE1lbWJlciBpZiBpdCdzIG5vdCBhIE1BQyBhZGRyZXNzLgotCQlpZigoYkdyb3VwSWQgPT0gMCkgJiYgKHN0cmxlbih0aGlzQ2hhcikgIT0gMTcpKQotCQkJY29udGludWU7Ci0KLQkJaWYoc3RybGVuKHRoaXNDaGFyKSA9PSAxNykgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3Ci0JCXsKLQkJCWZvciAoaT0wLCB2YWx1ZSA9IHJzdHJ0b2sodGhpc0NoYXIsIjoiKTsgdmFsdWU7IHZhbHVlID0gcnN0cnRvayhOVUxMLCI6IikpCi0JCQl7Ci0JCQkJaWYoKHN0cmxlbih2YWx1ZSkgIT0gMikgfHwgKCFpc3hkaWdpdCgqdmFsdWUpKSB8fCAoIWlzeGRpZ2l0KCoodmFsdWUrMSkpKSApCi0JCQkJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAotCi0JCQkJQXRvSCh2YWx1ZSwgJkFkZHJbaSsrXSwgMSk7Ci0JCQl9Ci0KLQkJCWlmKGkgIT0gNikKLQkJCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKLQkJfQotCQllbHNlCi0JCXsKLQkJCWZvciAoaT0wLCB2YWx1ZSA9IHJzdHJ0b2sodGhpc0NoYXIsIi4iKTsgdmFsdWU7IHZhbHVlID0gcnN0cnRvayhOVUxMLCIuIikpCi0JCQl7Ci0JCQkJaWYoKHN0cmxlbih2YWx1ZSkgPiAwKSAmJiAoc3RybGVuKHZhbHVlKSA8PSAzKSkKLQkJCQl7Ci0JCQkJCWludCBpaTsKLQkJCQkJZm9yKGlpPTA7IGlpPHN0cmxlbih2YWx1ZSk7IGlpKyspCi0JCQkJCQlpZiAoIWlzeGRpZ2l0KCoodmFsdWUgKyBpaSkpKQotCQkJCQkJCXJldHVybiBGQUxTRTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKLQotCQkJCUlwQWRkcltpXSA9IChVQ0hBUilzaW1wbGVfc3RydG9sKHZhbHVlLCBOVUxMLCAxMCk7Ci0JCQkJaSsrOwotCQkJfQotCi0JCQlpZihpICE9IDQpCi0JCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCi0KLQkJCUNvbnZlcnRNdWx0aWNhc3RJUDJNQUMoSXBBZGRyLCAoUFVDSEFSICopJnBBZGRyLCBFVEhfUF9JUCk7Ci0JCX0KLQotCQlpZihiR3JvdXBJZCA9PSAxKQotCQkJQ09QWV9NQUNfQUREUihHcm91cElkLCBBZGRyKTsKLQotCQkvLyBHcm91cC1JZCBtdXN0IGJlIGEgTUNBU1QgYWRkcmVzcy4KLQkJaWYoKGJHcm91cElkID09IDEpICYmIElTX01VTFRJQ0FTVF9NQUNfQUREUihBZGRyKSkKLQkJCU11bHRpY2FzdEZpbHRlclRhYmxlSW5zZXJ0RW50cnkocEFkLCBHcm91cElkLCBOVUxMLCBwRGV2LCBNQ0FUX0ZJTFRFUl9TVEFUSUMpOwotCQkvLyBHcm91cC1NZW1iZXIgbXVzdCBiZSBhIFVDQVNUIGFkZHJlc3MuCi0JCWVsc2UgaWYgKChiR3JvdXBJZCA9PSAwKSAmJiAhSVNfTVVMVElDQVNUX01BQ19BRERSKEFkZHIpKQotCQkJTXVsdGljYXN0RmlsdGVyVGFibGVJbnNlcnRFbnRyeShwQWQsIEdyb3VwSWQsIEFkZHIsIHBEZXYsIE1DQVRfRklMVEVSX1NUQVRJQyk7Ci0JCWVsc2UKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgKCUyWDolMlg6JTJYOiUyWDolMlg6JTJYKSBpcyBub3QgYSBhY2NlcHRhYmxlIGFkZHJlc3MuXG4iLAotCQkJCV9fRlVOQ1RJT05fXywgQWRkclswXSwgQWRkclsxXSwgQWRkclsyXSwgQWRkclszXSwgQWRkcls0XSwgQWRkcls1XSkpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0KLQkJYkdyb3VwSWQgPSAwOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLAotCQkJX19GVU5DVElPTl9fLCBBZGRyWzBdLCBBZGRyWzFdLCBBZGRyWzJdLCBBZGRyWzNdLCBBZGRyWzRdLCBBZGRyWzVdKSk7Ci0KLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UIFNldF9JZ21wU25fRGVsRW50cnlfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQU1RSSU5HIGFyZykKLXsKLQlJTlQgaSwgbWVtYmVyQ250ID0gMDsKLQlCT09MRUFOIGJHcm91cElkID0gMTsKLQlQU1RSSU5HIHZhbHVlOwotCVBTVFJJTkcgdGhpc0NoYXI7Ci0JVUNIQVIgSXBBZGRyWzRdOwotCVVDSEFSIEFkZHJbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKLQlVQ0hBUiBHcm91cElkW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107Ci0JUFVDSEFSICpwQWRkciA9IChQVUNIQVIgKikmQWRkcjsKLQlQTkVUX0RFViBwRGV2OwotCVBPU19DT09LSUUgcE9iajsKLQlVQ0hBUiBpZkluZGV4OwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQlpZkluZGV4ID0gcE9iai0+aW9jdGxfaWY7Ci0KLQlwRGV2ID0gKGlmSW5kZXggPT0gTUFJTl9NQlNTSUQpID8gKHBBZC0+bmV0X2RldikgOiAocEFkLT5BcENmZy5NQlNTSURbaWZJbmRleF0uTVNTSUREZXYpOwotCi0Jd2hpbGUgKCh0aGlzQ2hhciA9IHN0cnNlcCgoY2hhciAqKikmYXJnLCAiLSIpKSAhPSBOVUxMKQotCXsKLQkJLy8gcmVmdXNlIHRoZSBNZW1iZXIgaWYgaXQncyBub3QgYSBNQUMgYWRkcmVzcy4KLQkJaWYoKGJHcm91cElkID09IDApICYmIChzdHJsZW4odGhpc0NoYXIpICE9IDE3KSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmKHN0cmxlbih0aGlzQ2hhcikgPT0gMTcpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNwotCQl7Ci0JCQlmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKHRoaXNDaGFyLCI6Iik7IHZhbHVlOyB2YWx1ZSA9IHJzdHJ0b2soTlVMTCwiOiIpKQotCQkJewotCQkJCWlmKChzdHJsZW4odmFsdWUpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnZhbHVlKSkgfHwgKCFpc3hkaWdpdCgqKHZhbHVlKzEpKSkgKQotCQkJCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKLQotCQkJCUF0b0godmFsdWUsICZBZGRyW2krK10sIDEpOwotCQkJfQotCi0JCQlpZihpICE9IDYpCi0JCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCi0JCX0KLQkJZWxzZQotCQl7Ci0JCQlmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKHRoaXNDaGFyLCIuIik7IHZhbHVlOyB2YWx1ZSA9IHJzdHJ0b2soTlVMTCwiLiIpKQotCQkJewotCQkJCWlmKChzdHJsZW4odmFsdWUpID4gMCkgJiYgKHN0cmxlbih2YWx1ZSkgPD0gMykpCi0JCQkJewotCQkJCQlpbnQgaWk7Ci0JCQkJCWZvcihpaT0wOyBpaTxzdHJsZW4odmFsdWUpOyBpaSsrKQotCQkJCQkJaWYgKCFpc3hkaWdpdCgqKHZhbHVlICsgaWkpKSkKLQkJCQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCi0KLQkJCQlJcEFkZHJbaV0gPSAoVUNIQVIpc2ltcGxlX3N0cnRvbCh2YWx1ZSwgTlVMTCwgMTApOwotCQkJCWkrKzsKLQkJCX0KLQotCQkJaWYoaSAhPSA0KQotCQkJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAotCi0JCQlDb252ZXJ0TXVsdGljYXN0SVAyTUFDKElwQWRkciwgKFBVQ0hBUiAqKSZwQWRkciwgRVRIX1BfSVApOwotCQl9Ci0KLQkJaWYoYkdyb3VwSWQgPT0gMSkKLQkJCUNPUFlfTUFDX0FERFIoR3JvdXBJZCwgQWRkcik7Ci0JCWVsc2UKLQkJCW1lbWJlckNudCsrOwotCi0JCWlmIChtZW1iZXJDbnQgPiAwICkKLQkJCU11bHRpY2FzdEZpbHRlclRhYmxlRGVsZXRlRW50cnkocEFkLCAoUFVDSEFSKUdyb3VwSWQsIEFkZHIsIHBEZXYpOwotCi0JCWJHcm91cElkID0gMDsKLQl9Ci0KLQlpZihtZW1iZXJDbnQgPT0gMCkKLQkJTXVsdGljYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeShwQWQsIChQVUNIQVIpR3JvdXBJZCwgTlVMTCwgcERldik7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLAotCQlfX0ZVTkNUSU9OX18sIEFkZHJbMF0sIEFkZHJbMV0sIEFkZHJbMl0sIEFkZHJbM10sIEFkZHJbNF0sIEFkZHJbNV0pKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQgU2V0X0lnbXBTbl9UYWJEaXNwbGF5X1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFNUUklORyBhcmcpCi17Ci0JSUdNUFRhYmxlRGlzcGxheShwQWQpOwotCXJldHVybiBUUlVFOwotfQotCi12b2lkIHJ0bXBfcmVhZF9pZ21wX3Nub29wX2Zyb21fZmlsZSgKLQlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCi0JUFNUUklORyB0bXBidWYsCi0JUFNUUklORyBidWZmZXIpCi17Ci0JUFNUUklORwkJbWFjcHRyOwotCUlOVAkJCWk9MDsKLQotCS8vSWdtcFNuRW5hYmxlCi0JaWYoUlRNUEdldEtleVBhcmFtZXRlcigiSWdtcFNuRW5hYmxlIiwgdG1wYnVmLCAxMjgsIGJ1ZmZlciwgVFJVRSkpCi0JewotCQlmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyAobWFjcHRyICYmIGkgPCBwQWQtPkFwQ2ZnLkJzc2lkTnVtKTsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKLQkJewotCQkJaWYgKChzdHJuY21wKG1hY3B0ciwgIjAiLCAxKSA9PSAwKSkKLQkJCQlwQWQtPkFwQ2ZnLk1CU1NJRFtpXS5JZ21wU25vb3BFbmFibGUgPSBGQUxTRTsKLQkJCWVsc2UgaWYgKChzdHJuY21wKG1hY3B0ciwgIjEiLCAxKSA9PSAwKSkKLQkJCQlwQWQtPkFwQ2ZnLk1CU1NJRFtpXS5JZ21wU25vb3BFbmFibGUgPSBUUlVFOwotCSAgICAgICAgZWxzZQotCQkJCXBBZC0+QXBDZmcuTUJTU0lEW2ldLklnbXBTbm9vcEVuYWJsZSA9IEZBTFNFOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNQlNTSURbJWRdLkVuYWJsZT0lZFxuIiwgaSwgcEFkLT5BcENmZy5NQlNTSURbaV0uSWdtcFNub29wRW5hYmxlKSk7Ci0JICAgIH0KLQl9Ci19Ci0KLU5ESVNfU1RBVFVTIElnbXBQa3RJbmZvUXVlcnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBTcmNCdWZWQSwKLQlJTiBQTkRJU19QQUNLRVQgcFBhY2tldCwKLQlJTiBVQ0hBUiBhcGlkeCwKLQlPVVQgQk9PTEVBTiAqcEluSWdtcEdyb3VwLAotCU9VVCBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSAqcHBHcm91cEVudHJ5KQotewotCWlmKElTX01VTFRJQ0FTVF9NQUNfQUREUihwU3JjQnVmVkEpKQotCXsKLQkJQk9PTEVBTiBJZ21wTWxkUGt0ID0gRkFMU0U7Ci0JCVBVQ0hBUiBwSXBIZWFkZXIgPSBwU3JjQnVmVkEgKyAxMjsKLQotCQlpZihudG9ocygqKChVSU5UMTYgKikocElwSGVhZGVyKSkpID09IEVUSF9QX0lQVjYpCi0JCQlJZ21wTWxkUGt0ID0gaXNNbGRQa3QocFNyY0J1ZlZBLCBwSXBIZWFkZXIsIE5VTEwsIE5VTEwpOwotCQllbHNlCi0JCQlJZ21wTWxkUGt0ID0gaXNJZ21wUGt0KHBTcmNCdWZWQSwgcElwSGVhZGVyKTsKLQotCQlpZiAoSWdtcE1sZFBrdCkKLQkJewotCQkJKnBwR3JvdXBFbnRyeSA9IE5VTEw7Ci0JCX0KLQkJZWxzZSBpZiAoKCpwcEdyb3VwRW50cnkgPSBNdWx0aWNhc3RGaWx0ZXJUYWJsZUxvb2t1cChwQWQtPnBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgcFNyY0J1ZlZBLAotCQkJCQkJCQkJcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLk1TU0lERGV2KSkgPT0gTlVMTCkKLQkJewotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JCX0KLQkJKnBJbklnbXBHcm91cCA9IFRSVUU7Ci0JfQotCWVsc2UgaWYgKElTX0JST0FEQ0FTVF9NQUNfQUREUihwU3JjQnVmVkEpKQotCXsKLQkJUFVDSEFSIHBEc3RJcEFkZHIgPSBwU3JjQnVmVkEgKyAzMDsgLy8gcG9pbnQgdG8gRGVzdGluYXRpb24gb2YgSXAgYWRkcmVzcyBvZiBJUCBoZWFkZXIuCi0JCVVDSEFSIEdyb3VwTWFjQWRkcls2XTsKLQkJUFVDSEFSIHBHcm91cE1hY0FkZHIgPSAoUFVDSEFSKSZHcm91cE1hY0FkZHI7Ci0KLQkJQ29udmVydE11bHRpY2FzdElQMk1BQyhwRHN0SXBBZGRyLCAoUFVDSEFSICopJnBHcm91cE1hY0FkZHIsIEVUSF9QX0lQKTsKLQkJaWYgKCgqcHBHcm91cEVudHJ5ID0gTXVsdGljYXN0RmlsdGVyVGFibGVMb29rdXAocEFkLT5wTXVsdGljYXN0RmlsdGVyVGFibGUsIHBHcm91cE1hY0FkZHIsCi0JCQkJCQkJCXBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5NU1NJRERldikpICE9IE5VTEwpCi0JCXsKLQkJCSpwSW5JZ21wR3JvdXAgPSBUUlVFOwotCQl9Ci0JfQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi1ORElTX1NUQVRVUyBJZ21wUGt0Q2xvbmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUE5ESVNfUEFDS0VUIHBQYWNrZXQsCi0JSU4gVUNIQVIgUXVlSWR4LAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFX0VOVFJZIHBHcm91cEVudHJ5KQotewotCVBORElTX1BBQ0tFVCBwU2tiQ2xvbmUgPSBOVUxMOwotCVBNRU1CRVJfRU5UUlkgcE1lbWJlckVudHJ5ID0gKFBNRU1CRVJfRU5UUlkpcEdyb3VwRW50cnktPk1lbWJlckxpc3QucEhlYWQ7Ci0JTUFDX1RBQkxFX0VOVFJZICpwTWFjRW50cnkgPSBOVUxMOwotCVVTSE9SVCBBaWQ7Ci0JU1NUCVNzdCA9IFNTVF9BU1NPQzsKLQlVQ0hBUiBQc01vZGUgPSBQV1JfQUNUSVZFOwotCVVDSEFSIFJhdGU7Ci0JdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKLQotCS8vIGNoZWNrIGFsbCBtZW1iZXJzIG9mIHRoZSBJR01QIGdyb3VwLgotCXdoaWxlKHBNZW1iZXJFbnRyeSAhPSBOVUxMKQotCXsKLQkJcE1hY0VudHJ5ID0gQVBTc1BzSW5xdWlyeShwQWQsIHBNZW1iZXJFbnRyeS0+QWRkciwgJlNzdCwgJkFpZCwgJlBzTW9kZSwgJlJhdGUpOwotCi0JCWlmIChwTWFjRW50cnkgJiYgKFNzdCA9PSBTU1RfQVNTT0MpICYmIChQc01vZGUgIT0gUFdSX1NBVkUpKQotCQl7Ci0JCXBTa2JDbG9uZSA9IHNrYl9jbG9uZShSVFBLVF9UT19PU1BLVChwUGFja2V0KSwgTUVNX0FMTE9DX0ZMQUcpOwotCQlpZihwU2tiQ2xvbmUpCi0JCXsKLQkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwU2tiQ2xvbmUsIChVQ0hBUilBaWQpOwotCQkJCS8vIFBrdCB0eXBlIG11c3Qgc2V0IHRvIFBLVFNSQ19ORElTLgotCQkJCS8vIEl0IGNhdXNlIG9mIHRoZSBkZWFzb24gdGhhdCBBUEhhcmRUcmFuc21pdCgpCi0JCQkJLy8gZG9lc24ndCBoYW5kbGUgUEtUU1JDX0RSSVZFUiBwa3QgdHlwZSBpbiB2ZXJzaW9uIDEuMy4wLjAuCi0JCQkJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShwU2tiQ2xvbmUsIFBLVFNSQ19ORElTKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwTWVtYmVyRW50cnkgPSBwTWVtYmVyRW50cnktPnBOZXh0OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvLyBpbnNlcnQgdGhlIHBrdCB0byBUeFN3UXVldWUuCi0JCQlpZiAocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPj0gTUFYX1BBQ0tFVFNfSU5fUVVFVUUpCi0JCQl7Ci0jaWZkZWYgQkxPQ0tfTkVUX0lGCi0JCQkJU3RvcE5ldElmUXVldWUocEFkLCBRdWVJZHgsIHBTa2JDbG9uZSk7Ci0jZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCi0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBTa2JDbG9uZSwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCQkJCUluc2VydFRhaWxRdWV1ZUFjKHBBZCwgcE1hY0VudHJ5LCAmcEFkLT5UeFN3UXVldWVbUXVlSWR4XSwgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBTa2JDbG9uZSkpOwotCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCQkJfQotCQl9Ci0JCXBNZW1iZXJFbnRyeSA9IHBNZW1iZXJFbnRyeS0+cE5leHQ7Ci0JfQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW5saW5lIEJPT0xFQU4gaXNNbGRNYWNBZGRyKAotCUlOIFBVQ0hBUiBwTWFjQWRkcikKLXsKLQlyZXR1cm4gKChwTWFjQWRkclswXSA9PSAweDMzKSAmJiAocE1hY0FkZHJbMV0gPT0gMHgzMykpID8gVFJVRSA6IEZBTFNFOwotfQotCi1zdGF0aWMgaW5saW5lIEJPT0xFQU4gSXNTdXBwb3J0ZWRNbGRNc2coCi0JSU4gVUlOVDggTXNnVHlwZSkKLXsKLQlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOwotCXN3aXRjaChNc2dUeXBlKQotCXsKLQkJY2FzZSBNTERfVjFfTElTVEVORVJfUkVQT1JUOgotCQljYXNlIE1MRF9WMV9MSVNURU5FUl9ET05FOgotCQljYXNlIE1MRF9WMl9MSVNURVJORVJfUkVQT1JUOgotCQkJcmVzdWx0ID0gVFJVRTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmVzdWx0ID0gRkFMU0U7Ci0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi1CT09MRUFOIGlzTWxkUGt0KAotCUlOIFBVQ0hBUiBwRHN0TWFjQWRkciwKLQlJTiBQVUNIQVIgcElwSGVhZGVyLAotCU9VVCBVSU5UOCAqcFByb3RvVHlwZSwKLQlPVVQgUFVDSEFSICpwTWxkSGVhZGVyKQotewotCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7Ci0JVUlOVDE2IElwUHJvdG9jb2wgPSBudG9ocygqKChVSU5UMTYgKikocElwSGVhZGVyKSkpOwotCi0JaWYoIWlzTWxkTWFjQWRkcihwRHN0TWFjQWRkcikpCi0JCXJldHVybiBGQUxTRTsKLQotCWlmKElwUHJvdG9jb2wgIT0gRVRIX1BfSVBWNikKLQkJcmV0dXJuIEZBTFNFOwotCi0JLy8gc2tpcCBwcm90b2NvbCAoMiBCeXRlcykuCi0JcElwSGVhZGVyICs9IDI7Ci0JZG8KLQl7Ci0JCVBSVF9JUFY2X0hEUiBwSXB2NkhkciA9IChQUlRfSVBWNl9IRFIpKHBJcEhlYWRlcik7Ci0JCVVJTlQ4IG5leHRQcm90b2NvbCA9IHBJcHY2SGRyLT5uZXh0SGRyOwotCQlVSU5UMzIgb2Zmc2V0ID0gSVBWNl9IRFJfTEVOOwotCi0JCXdoaWxlKG5leHRQcm90b2NvbCAhPSBJUFY2X05FWFRfSEVBREVSX0lDTVBWNikKLQkJewotCQkJaWYoSVB2NkV4dEhkckhhbmRsZSgoUlRfSVBWNl9FWFRfSERSICopKHBJcEhlYWRlciArIG9mZnNldCksICZuZXh0UHJvdG9jb2wsICZvZmZzZXQpID09IEZBTFNFKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYobmV4dFByb3RvY29sID09IElQVjZfTkVYVF9IRUFERVJfSUNNUFY2KQotCQl7Ci0JCQlQUlRfSUNNUFY2X0hEUiBwSUNNUHY2SGRyID0gKFBSVF9JQ01QVjZfSERSKShwSXBIZWFkZXIgKyBvZmZzZXQpOwotCQkJaWYgKElzU3VwcG9ydGVkTWxkTXNnKHBJQ01QdjZIZHItPnR5cGUpID09IFRSVUUpCi0JCQl7Ci0JCQkJaWYgKHBQcm90b1R5cGUgIT0gTlVMTCkKLQkJCQkJKnBQcm90b1R5cGUgPSBwSUNNUHY2SGRyLT50eXBlOwotCQkJCWlmIChwTWxkSGVhZGVyICE9IE5VTEwpCi0JCQkJCSpwTWxkSGVhZGVyID0gKFBVQ0hBUilwSUNNUHY2SGRyOwotCQkJCXJlc3VsdCA9IFRSVUU7Ci0JCQl9Ci0JCX0KLQl9d2hpbGUoRkFMU0UpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogIE1MRCB2MSBtZXNzYWdlcyBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgotCTAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKLQkwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLQkrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotCXwgICAgIFR5cGUgICAgICB8ICAgICBDb2RlICAgICAgfCAgICAgICAgICBDaGVja3N1bSAgICAgICAgICAgICB8Ci0JKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLQl8ICAgICBNYXhpbXVtIFJlc3BvbnNlIERlbGF5ICAgIHwgICAgICAgICAgUmVzZXJ2ZWQgICAgICAgICAgICAgfAotCSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0JfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKwotCXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JKyAgICAgICAgICAgICAgICAgICAgICAgTXVsdGljYXN0IEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICsKLQl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotCSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArCi0JfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotKi8KLQotLyoJVmVyc2lvbiAzIE1lbWJlcnNoaXAgUmVwb3J0IE1lc3NhZ2UKLQkwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCi0JMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCi0JKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLQl8ICBUeXBlID0gMTQzICAgfCAgICBSZXNlcnZlZCAgIHwgICAgICAgICAgIENoZWNrc3VtICAgICAgICAgICAgfAotCSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0JfCAgICAgICAgICAgUmVzZXJ2ZWQgICAgICAgICAgICB8ICBOdW1iZXIgb2YgR3JvdXAgUmVjb3JkcyAoTSkgIHwKLQkrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotCXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLQkuICAgICAgICAgICAgICAgTXVsdGljYXN0IEFkZHJlc3MgUmVjb3JkIFsxXSAgICAgICAgICAgICAgICAgICAgLgotCS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0JfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotCXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLQkuICAgICAgICAgICAgICAgTXVsdGljYXN0IEFkZHJlc3MgUmVjb3JkIFsyXSAgICAgICAgICAgICAgICAgICAgLgotCS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0JfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotCXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLQl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotCSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0JfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgotCS4gICAgICAgICAgICAgICBNdWx0aWNhc3QgQWRkcmVzcyBSZWNvcmQgW01dICAgICAgICAgICAgICAgICAgICAuCi0JLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLQl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotCSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0KLQotCXdoZXJlIGVhY2ggR3JvdXAgUmVjb3JkIGhhcyB0aGUgZm9sbG93aW5nIGludGVybmFsIGZvcm1hdDoKLQkrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotCXwgIFJlY29yZCBUeXBlICB8ICBBdXggRGF0YSBMZW4gfCAgICAgTnVtYmVyIG9mIFNvdXJjZXMgKE4pICAgICB8Ci0JKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICBNdWx0aWNhc3QgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgKgotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotCSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgU291cmNlIEFkZHJlc3MgWzFdICAgICAgICAgICAgICAgICAgICAgICoKLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICArLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKwotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICogICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSBBZGRyZXNzIFsyXSAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgKy0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSsKLSAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgotICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0gICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLSAgICArLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKwotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICogICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSBBZGRyZXNzIFtOXSAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0gICAgLiAgICAgICAgICAgICAgICAgICAgICAgICBBdXhpbGlhcnkgRGF0YSAgICAgICAgICAgICAgICAgICAgICAgIC4KLSAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSovCi0KLVZPSUQgTUxEU25vb3BpbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEc3RNYWNBZGRyLAotCUlOIFBVQ0hBUiBwU3JjTWFjQWRkciwKLQlJTiBQVUNIQVIgcElwSGVhZGVyLAotCUlOIFBORVRfREVWIHBEZXYpCi17Ci0JSU5UIGk7Ci0JVUNIQVIgR3JvdXBUeXBlOwotCVVJTlQxNiBudW1PZkdyb3VwOwotCVBVQ0hBUiBwR3JvdXA7Ci0JVUNIQVIgQXV4RGF0YUxlbjsKLQlVSU5UMTYgbnVtT2ZTb3VyY2VzOwotCVBVQ0hBUiBwR3JvdXBJcEFkZHI7Ci0JVUNIQVIgR3JvdXBNYWNBZGRyWzZdOwotCVBVQ0hBUiBwR3JvdXBNYWNBZGRyID0gKFBVQ0hBUikmR3JvdXBNYWNBZGRyOwotCi0JVUlOVDggTWxkVHlwZTsKLQlQVUNIQVIgcE1sZEhlYWRlcjsKLQotCWlmKGlzTWxkUGt0KHBEc3RNYWNBZGRyLCBwSXBIZWFkZXIsICZNbGRUeXBlLCAmcE1sZEhlYWRlcikgPT0gVFJVRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1MRCB0eXBlPSUweFxuIiwgTWxkVHlwZSkpOwotCi0JCXN3aXRjaChNbGRUeXBlKQotCQl7Ci0JCQljYXNlIE1MRF9WMV9MSVNURU5FUl9SRVBPUlQ6Ci0JCQkJLy8gc2tpcCBUeXBlKDEgQnl0ZSksIGNvZGUoMSBCeXRlKSwgY2hlY2tzdW0oMiBCeXRlcyksIE1heGltdW0gUnNwIERlbGF5KDIgQnl0ZXMpLCBSZXNlcnZlKDIgQnl0ZXMpLgotCQkJCXBHcm91cElwQWRkciA9IChQVUNIQVIpKHBNbGRIZWFkZXIgKyA4KTsKLQkJCQlDb252ZXJ0TXVsdGljYXN0SVAyTUFDKHBHcm91cElwQWRkciwgKFBVQ0hBUiAqKSZwR3JvdXBNYWNBZGRyLCBFVEhfUF9JUFY2KTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHcm91cCBJZD0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCQkJCUdyb3VwTWFjQWRkclswXSwgR3JvdXBNYWNBZGRyWzFdLCBHcm91cE1hY0FkZHJbMl0sIEdyb3VwTWFjQWRkclszXSwgR3JvdXBNYWNBZGRyWzRdLCBHcm91cE1hY0FkZHJbNV0pKTsKLQkJCQlNdWx0aWNhc3RGaWx0ZXJUYWJsZUluc2VydEVudHJ5KHBBZCwgR3JvdXBNYWNBZGRyLCBwU3JjTWFjQWRkciwgcERldiwgTUNBVF9GSUxURVJfRFlOQU1JQyk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgTUxEX1YxX0xJU1RFTkVSX0RPTkU6Ci0JCQkJLy8gc2tpcCBUeXBlKDEgQnl0ZSksIGNvZGUoMSBCeXRlKSwgY2hlY2tzdW0oMiBCeXRlcyksIE1heGltdW0gUnNwIERlbGF5KDIgQnl0ZXMpLCBSZXNlcnZlKDIgQnl0ZXMpLgotCQkJCXBHcm91cElwQWRkciA9IChQVUNIQVIpKHBNbGRIZWFkZXIgKyA4KTsKLQkJCQlDb252ZXJ0TXVsdGljYXN0SVAyTUFDKHBHcm91cElwQWRkciwgKFBVQ0hBUiAqKSZwR3JvdXBNYWNBZGRyLCBFVEhfUF9JUFY2KTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHcm91cCBJZD0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCQkJCUdyb3VwTWFjQWRkclswXSwgR3JvdXBNYWNBZGRyWzFdLCBHcm91cE1hY0FkZHJbMl0sIEdyb3VwTWFjQWRkclszXSwgR3JvdXBNYWNBZGRyWzRdLCBHcm91cE1hY0FkZHJbNV0pKTsKLQkJCQlNdWx0aWNhc3RGaWx0ZXJUYWJsZURlbGV0ZUVudHJ5KHBBZCwgR3JvdXBNYWNBZGRyLCBwU3JjTWFjQWRkciwgcERldik7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgTUxEX1YyX0xJU1RFUk5FUl9SRVBPUlQ6IC8vIElHTVAgdmVyc2lvbiAzIG1lbWJlcnNoaXAgcmVwb3J0LgotCQkJCW51bU9mR3JvdXAgPSBudG9ocygqKChVSU5UMTYgKikocE1sZEhlYWRlciArIDYpKSk7Ci0JCQkJcEdyb3VwID0gKFBVQ0hBUikocE1sZEhlYWRlciArIDgpOwotCQkJCWZvciAoaT0wOyBpIDwgbnVtT2ZHcm91cDsgaSsrKQotCQkJCXsKLQkJCQkJR3JvdXBUeXBlID0gKFVDSEFSKSgqcEdyb3VwKTsKLQkJCQkJQXV4RGF0YUxlbiA9IChVQ0hBUikoKihwR3JvdXAgKyAxKSk7Ci0JCQkJCW51bU9mU291cmNlcyA9IG50b2hzKCooKFVJTlQxNiAqKShwR3JvdXAgKyAyKSkpOwotCQkJCQlwR3JvdXBJcEFkZHIgPSAoUFVDSEFSKShwR3JvdXAgKyA0KTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUxEdjIgVHlwZT0lZCwgQURMPSVkLCBudW1PZlNvdXJjZT0lZFxuIiwgR3JvdXBUeXBlLCBBdXhEYXRhTGVuLCBudW1PZlNvdXJjZXMpKTsKLQkJCQkJQ29udmVydE11bHRpY2FzdElQMk1BQyhwR3JvdXBJcEFkZHIsIChQVUNIQVIgKikmcEdyb3VwTWFjQWRkciwgRVRIX1BfSVBWNik7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1MRCBHcm91cD0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCQkJCQlHcm91cE1hY0FkZHJbMF0sIEdyb3VwTWFjQWRkclsxXSwgR3JvdXBNYWNBZGRyWzJdLCBHcm91cE1hY0FkZHJbM10sIEdyb3VwTWFjQWRkcls0XSwgR3JvdXBNYWNBZGRyWzVdKSk7Ci0KLQkJCQkJZG8KLQkJCQkJewotCQkJCQkJaWYoKEdyb3VwVHlwZSA9PSBNT0RFX0lTX0VYQ0xVREUpIHx8IChHcm91cFR5cGUgPT0gQ0hBTkdFX1RPX0VYQ0xVREVfTU9ERSkgfHwgKEdyb3VwVHlwZSA9PSBBTExPV19ORVdfU09VUkNFUykpCi0JCQkJCQl7Ci0JCQkJCQkJTXVsdGljYXN0RmlsdGVyVGFibGVJbnNlcnRFbnRyeShwQWQsIEdyb3VwTWFjQWRkciwgcFNyY01hY0FkZHIsIHBEZXYsIE1DQVRfRklMVEVSX0RZTkFNSUMpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCi0JCQkJCQlpZigoR3JvdXBUeXBlID09IE1PREVfSVNfSU5DTFVERSkgfHwgKEdyb3VwVHlwZSA9PSBCTE9DS19PTERfU09VUkNFUykpCi0JCQkJCQl7Ci0JCQkJCQkJTXVsdGljYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeShwQWQsIEdyb3VwTWFjQWRkciwgcFNyY01hY0FkZHIsIHBEZXYpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCi0JCQkJCQlpZigoR3JvdXBUeXBlID09IENIQU5HRV9UT19JTkNMVURFX01PREUpKQotCQkJCQkJewotCQkJCQkJCWlmKG51bU9mU291cmNlcyA9PSAwKQotCQkJCQkJCQlNdWx0aWNhc3RGaWx0ZXJUYWJsZURlbGV0ZUVudHJ5KHBBZCwgR3JvdXBNYWNBZGRyLCBwU3JjTWFjQWRkciwgcERldik7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlNdWx0aWNhc3RGaWx0ZXJUYWJsZUluc2VydEVudHJ5KHBBZCwgR3JvdXBNYWNBZGRyLCBwU3JjTWFjQWRkciwgcERldiwgTUNBVF9GSUxURVJfRFlOQU1JQyk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0gd2hpbGUoRkFMU0UpOwotCQkJCQkvLyBza2lwIDQgQnl0ZXMgKFJlY29yZCBUeXBlLCBBdXggRGF0YSBMZW4sIE51bWJlciBvZiBTb3VyY2VzKSArIGEgSVB2NiBhZGRyZXNzLgotCQkJCQlwR3JvdXAgKz0gKDQgKyBJUFY2X0FERFJfTEVOICsgKG51bU9mU291cmNlcyAqIDE2KSArIEF1eERhdGFMZW4pOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ1bmtub3cgTUxEIFR5cGU9JWRcbiIsIE1sZFR5cGUpKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybjsKLX0KLQotCi0jZW5kaWYgLy8gSUdNUF9TTk9PUF9TVVBQT1JUIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9tbG1lLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9tbG1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MTNjMDQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vbWxtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjU1MCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCW1sbWUuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4gQ2hhbmcJMjAwNC0wOC0yNQkJTW9kaWZ5IGZyb20gUlQyNTAwIGNvZGUgYmFzZQotCUpvaG4gQ2hhbmcJMjAwNC0wOS0wNgkJbW9kaWZpZWQgZm9yIFJUMjYwMAotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi1VQ0hBUglDSVNDT19PVUlbXSA9IHsweDAwLCAweDQwLCAweDk2fTsKLQotVUNIQVIJV1BBX09VSVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDF9OwotVUNIQVIJUlNOX09VSVtdID0gezB4MDAsIDB4MGYsIDB4YWN9OwotVUNIQVIJV0FQSV9PVUlbXSA9IHsweDAwLCAweDE0LCAweDcyfTsKLVVDSEFSICAgV01FX0lORk9fRUxFTVtdICA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxfTsKLVVDSEFSICAgV01FX1BBUk1fRUxFTVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDEsIDB4MDF9OwotVUNIQVIJQ2N4MlFvc0luZm9bXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDA0fTsKLVVDSEFSICAgUkFMSU5LX09VSVtdICA9IHsweDAwLCAweDBjLCAweDQzfTsKLVVDSEFSICAgQlJPQURDT01fT1VJW10gID0gezB4MDAsIDB4OTAsIDB4NGN9OwotVUNIQVIgICBXUFNfT1VJW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwNH07Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1VQ0hBUglQUkVfTl9IVF9PVUlbXQk9IHsweDAwLCAweDkwLCAweDRjfTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgxMSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAotICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCi0gICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKLSAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAotICAgIDB4MDQsIDB4MjEsICAwLCAzMCwgNTAsCi0gICAgMHgwNSwgMHgyMSwgIDEsIDIwLCA1MCwKLSAgICAweDA2LCAweDIxLCAgMiwgMjAsIDUwLAotICAgIDB4MDcsIDB4MjEsICAzLCAxNSwgNTAsCi0gICAgMHgwOCwgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA5LCAweDIxLCAgNSwgMTAsIDI1LAotICAgIDB4MGEsIDB4MjEsICA2LCAgOCwgMjUsCi0gICAgMHgwYiwgMHgyMSwgIDcsICA4LCAyNSwKLSAgICAweDBjLCAweDIwLCAxMiwgIDE1LCAzMCwKLSAgICAweDBkLCAweDIwLCAxMywgIDgsIDIwLAotICAgIDB4MGUsIDB4MjAsIDE0LCAgOCwgMjAsCi0gICAgMHgwZiwgMHgyMCwgMTUsICA4LCAyNSwKLSAgICAweDEwLCAweDIyLCAxNSwgIDgsIDI1LAotICAgIDB4MTEsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxMiwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDEzLCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MTQsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxNSwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDE2LCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MTcsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxOCwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDE5LCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MWEsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxYiwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDFjLCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MWQsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxZSwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDFmLCAweDAwLCAgMCwgIDAsICAwLAotfTsKLQotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwNCwgMHgwMywgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAotICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCi0gICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKLSAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAotfTsKLQotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR1tdID0gewotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKLSAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAotICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCi0gICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKLSAgICAweDA0LCAweDEwLCAgMiwgMjAsIDM1LAotICAgIDB4MDUsIDB4MTAsICAzLCAxNiwgMzUsCi0gICAgMHgwNiwgMHgxMCwgIDQsIDEwLCAyNSwKLSAgICAweDA3LCAweDEwLCAgNSwgMTYsIDI1LAotICAgIDB4MDgsIDB4MTAsICA2LCAxMCwgMjUsCi0gICAgMHgwOSwgMHgxMCwgIDcsIDEwLCAxMywKLX07Ci0KLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExR1tdID0gewotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MDgsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDEwLCAgMCwgMjAsIDEwMSwKLSAgICAweDAxLCAweDEwLCAgMSwgMjAsIDM1LAotICAgIDB4MDIsIDB4MTAsICAyLCAyMCwgMzUsCi0gICAgMHgwMywgMHgxMCwgIDMsIDE2LCAzNSwKLSAgICAweDA0LCAweDEwLCAgNCwgMTAsIDI1LAotICAgIDB4MDUsIDB4MTAsICA1LCAxNiwgMjUsCi0gICAgMHgwNiwgMHgxMCwgIDYsIDEwLCAyNSwKLSAgICAweDA3LCAweDEwLCAgNywgMTAsIDEzLAotfTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOMVNbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBjLCAweDBhLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgwMCwgIDAsIDQwLCAxMDEsCi0gICAgMHgwMSwgMHgwMCwgIDEsIDQwLCA1MCwKLSAgICAweDAyLCAweDAwLCAgMiwgMjUsIDQ1LAotICAgIDB4MDMsIDB4MjEsICAwLCAyMCwgMzUsCi0gICAgMHgwNCwgMHgyMSwgIDEsIDIwLCAzNSwKLSAgICAweDA1LCAweDIxLCAgMiwgMjAsIDM1LAotICAgIDB4MDYsIDB4MjEsICAzLCAxNSwgMzUsCi0gICAgMHgwNywgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA4LCAweDIxLCAgNSwgMTAsIDI1LAotICAgIDB4MDksIDB4MjEsICA2LCAgOCwgMTQsCi0gICAgMHgwYSwgMHgyMSwgIDcsICA4LCAxNCwKLSAgICAweDBiLCAweDIzLCAgNywgIDgsIDE0LAotfTsKLQotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOMlNbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBlLCAweDBjLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgwMCwgIDAsIDQwLCAxMDEsCi0gICAgMHgwMSwgMHgwMCwgIDEsIDQwLCA1MCwKLSAgICAweDAyLCAweDAwLCAgMiwgMjUsIDQ1LAotICAgIDB4MDMsIDB4MjEsICAwLCAyMCwgMzUsCi0gICAgMHgwNCwgMHgyMSwgIDEsIDIwLCAzNSwKLSAgICAweDA1LCAweDIxLCAgMiwgMjAsIDM1LAotICAgIDB4MDYsIDB4MjEsICAzLCAxNSwgMzUsCi0gICAgMHgwNywgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA4LCAweDIwLCAxMSwgMTUsIDMwLAotICAgIDB4MDksIDB4MjAsIDEyLCAxNSwgMzAsCi0gICAgMHgwYSwgMHgyMCwgMTMsICA4LCAyMCwKLSAgICAweDBiLCAweDIwLCAxNCwgIDgsIDIwLAotICAgIDB4MGMsIDB4MjAsIDE1LCAgOCwgMjUsCi0gICAgMHgwZCwgMHgyMiwgMTUsICA4LCAxNSwKLX07Ci0KLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjNTW10gPSB7Ci0vLyBJdGVtIE5vLglNb2RlCUN1cnItTUNTCVRyYWluVXAJVHJhaW5Eb3duCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYiwgMHgwMCwgIDAsICAwLCAgMCwJLy8gMHgwYSwgMHgwMCwgIDAsICAwLCAgMCwgICAgICAvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAotICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCi0gICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKLSAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAotICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCi0gICAgMHgwNSwgMHgyMCwgMTEsIDE1LCAzMCwJLy8gUmVxdWlyZWQgYnkgU3lzdGVtLUFsYW4gQCAyMDA4MDgxMgotICAgIDB4MDYsIDB4MjAsIDEyLCAxNSwgMzAsCS8vIDB4MDUsIDB4MjAsIDEyLCAxNSwgMzAsCi0gICAgMHgwNywgMHgyMCwgMTMsICA4LCAyMCwJLy8gMHgwNiwgMHgyMCwgMTMsICA4LCAyMCwKLSAgICAweDA4LCAweDIwLCAxNCwgIDgsIDIwLAkvLyAweDA3LCAweDIwLCAxNCwgIDgsIDIwLAotICAgIDB4MDksIDB4MjAsIDE1LCAgOCwgMjUsCS8vIDB4MDgsIDB4MjAsIDE1LCAgOCwgMjUsCi0gICAgMHgwYSwgMHgyMiwgMTUsICA4LCAyNSwJLy8gMHgwOSwgMHgyMiwgMTUsICA4LCAyNSwKLX07Ci0KLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBiLCAweDA5LCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCi0gICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKLSAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAotICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCi0gICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA1LCAweDIxLCAgNSwgMTUsIDMwLAotICAgIDB4MDYsIDB4MjAsIDEyLCAgMTUsIDMwLAotICAgIDB4MDcsIDB4MjAsIDEzLCAgOCwgMjAsCi0gICAgMHgwOCwgMHgyMCwgMTQsICA4LCAyMCwKLSAgICAweDA5LCAweDIwLCAxNSwgIDgsIDI1LAotICAgIDB4MGEsIDB4MjIsIDE1LCAgOCwgMjUsCi19OwotCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMU4zU0ZvckFCYW5kW10gPSB7IC8vIDMqMwotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MGIsIDB4MDksICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDIxLCAgMCwgMzAsIDEwMSwKLSAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAotICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCi0gICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKLSAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAotICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCi0gICAgMHgwNiwgMHgyMCwgMTIsICAxNSwgMzAsCi0gICAgMHgwNywgMHgyMCwgMTMsICA4LCAyMCwKLSAgICAweDA4LCAweDIwLCAxNCwgIDgsIDIwLAotICAgIDB4MDksIDB4MjAsIDE1LCAgOCwgMjUsCi0gICAgMHgwYSwgMHgyMiwgMTUsICA4LCAyNSwKLX07Ci0KLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBjLCAweDBhLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgwMCwgIDAsIDQwLCAxMDEsCi0gICAgMHgwMSwgMHgwMCwgIDEsIDQwLCA1MCwKLSAgICAweDAyLCAweDAwLCAgMiwgMjUsIDQ1LAotICAgIDB4MDMsIDB4MjEsICAwLCAyMCwgMzUsCi0gICAgMHgwNCwgMHgyMSwgIDEsIDIwLCAzNSwKLSAgICAweDA1LCAweDIxLCAgMiwgMjAsIDM1LAotICAgIDB4MDYsIDB4MjEsICAzLCAxNSwgMzUsCi0gICAgMHgwNywgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA4LCAweDIxLCAgNSwgMTAsIDI1LAotICAgIDB4MDksIDB4MjEsICA2LCAgOCwgMTQsCi0gICAgMHgwYSwgMHgyMSwgIDcsICA4LCAxNCwKLSAgICAweDBiLCAweDIzLCAgNywgIDgsIDE0LAotfTsKLQotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1tdID0gewotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MGUsIDB4MGMsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKLSAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAotICAgIDB4MDIsIDB4MDAsICAyLCAyNSwgNDUsCi0gICAgMHgwMywgMHgyMSwgIDAsIDIwLCAzNSwKLSAgICAweDA0LCAweDIxLCAgMSwgMjAsIDM1LAotICAgIDB4MDUsIDB4MjEsICAyLCAyMCwgMzUsCi0gICAgMHgwNiwgMHgyMSwgIDMsIDE1LCAzNSwKLSAgICAweDA3LCAweDIxLCAgNCwgMTUsIDMwLAotICAgIDB4MDgsIDB4MjAsIDExLCAxNSwgMzAsCi0gICAgMHgwOSwgMHgyMCwgMTIsIDE1LCAzMCwKLSAgICAweDBhLCAweDIwLCAxMywgIDgsIDIwLAotICAgIDB4MGIsIDB4MjAsIDE0LCAgOCwgMjAsCi0gICAgMHgwYywgMHgyMCwgMTUsICA4LCAyNSwKLSAgICAweDBkLCAweDIyLCAxNSwgIDgsIDE1LAotfTsKLQotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04zU1tdID0geyAvLyAzKjMKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgyMSwgIDAsIDMwLDEwMSwJLy81MAotICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCi0gICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKLSAgICAweDAzLCAweDIxLCAgMywgMjAsIDUwLAotICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgNTAsCi0gICAgMHgwNSwgMHgyMCwgMjAsIDE1LCAzMCwKLSAgICAweDA2LCAweDIwLCAyMSwgIDgsIDIwLAotICAgIDB4MDcsIDB4MjAsIDIyLCAgOCwgMjAsCi0gICAgMHgwOCwgMHgyMCwgMjMsICA4LCAyNSwKLSAgICAweDA5LCAweDIyLCAyMywgIDgsIDI1LAotfTsKLQotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYiwgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKLSAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAotICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCi0gICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKLSAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAotICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCi0gICAgMHgwNiwgMHgyMCwgMTIsIDE1LCAzMCwKLSAgICAweDA3LCAweDIwLCAxMywgIDgsIDIwLAotICAgIDB4MDgsIDB4MjAsIDE0LCAgOCwgMjAsCi0gICAgMHgwOSwgMHgyMCwgMTUsICA4LCAyNSwKLSAgICAweDBhLCAweDIyLCAxNSwgIDgsIDI1LAotfTsKLQotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04zU0ZvckFCYW5kW10gPSB7IC8vIDMqMwotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MGMsIDB4MDksICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCi0gICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKLSAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAotICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCi0gICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA1LCAweDIxLCAgNSwgMTUsIDMwLAotICAgIDB4MDYsIDB4MjEsIDEyLCAxNSwgMzAsCi0gICAgMHgwNywgMHgyMCwgMjAsIDE1LCAzMCwKLSAgICAweDA4LCAweDIwLCAyMSwgIDgsIDIwLAotICAgIDB4MDksIDB4MjAsIDIyLCAgOCwgMjAsCi0gICAgMHgwYSwgMHgyMCwgMjMsICA4LCAyNSwKLSAgICAweDBiLCAweDIyLCAyMywgIDgsIDI1LAotfTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCi1leHRlcm4gVUNIQVIJIE9mZG1SYXRlVG9SeHdpTUNTW107Ci0vLyBzaW5jZSBSVDYxIGhhcyBiZXR0ZXIgUlggc2Vuc2liaWxpdHksIHdlIGhhdmUgdG8gbGltaXQgVFggQUNLIHJhdGUgbm90IHRvIGV4Y2VlZCBvdXIgbm9ybWFsIGRhdGEgVFggcmF0ZS4KLS8vIG90aGVyd2lzZSB0aGUgV0xBTiBwZWVyIG1heSBub3QgYmUgYWJsZSB0byByZWNlaXZlIHRoZSBBQ0sgdGh1cyBkb3duZ3JhZGUgaXRzIGRhdGEgVFggcmF0ZQotVUxPTkcgQmFzaWNSYXRlTWFza1sxMl0JCQkJPSB7MHhmZmZmZjAwMSAvKiAxLU1icHMgKi8sIDB4ZmZmZmYwMDMgLyogMiBNYnBzICovLCAweGZmZmZmMDA3IC8qIDUuNSAqLywgMHhmZmZmZjAwZiAvKiAxMSAqLywKLQkJCQkJCQkJCSAgMHhmZmZmZjAxZiAvKiA2ICovCSAsIDB4ZmZmZmYwM2YgLyogOSAqLwkgICwgMHhmZmZmZjA3ZiAvKiAxMiAqLyAsIDB4ZmZmZmYwZmYgLyogMTggKi8sCi0JCQkJCQkJCQkgIDB4ZmZmZmYxZmYgLyogMjQgKi8JICwgMHhmZmZmZjNmZiAvKiAzNiAqLwkgICwgMHhmZmZmZjdmZiAvKiA0OCAqLyAsIDB4ZmZmZmZmZmYgLyogNTQgKi99OwotCi1VQ0hBUiBCUk9BRENBU1RfQUREUltNQUNfQUREUl9MRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotVUNIQVIgWkVST19NQUNfQUREUltNQUNfQUREUl9MRU5dICA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLQotLy8gZS5nLiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW1JBVEVfMzZdIiBtZWFucyBpZiB0aGUgY3VycmVudCBSU1NJIGlzIGdyZWF0ZXIgdGhhbgotLy8JCXRoaXMgdmFsdWUsIHRoZW4gaXQncyBxdWFyYW50ZWVkIGNhcGFibGUgb2Ygb3BlcmF0aW5nIGluIDM2IG1icHMgVFggcmF0ZSBpbgotLy8JCWNsZWFuIGVudmlyb25tZW50LgotLy8JCQkJCQkJCSAgVHhSYXRlOiAxICAgMiAgIDUuNQkxMQkgNgkgIDkgICAgMTIJMTgJIDI0ICAgMzYgICA0OAk1NAkgNzIgIDEwMAotQ0hBUiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW10gPXsgIC05MiwgLTkxLCAtOTAsIC04NywgLTg4LCAtODYsIC04NSwgLTgzLCAtODEsIC03OCwgLTcyLCAtNzEsIC00MCwgLTQwIH07Ci0KLVVDSEFSICBSYXRlSWRUb01icHNbXQkgPSB7IDEsIDIsIDUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0LCA3MiwgMTAwfTsKLVVTSE9SVCBSYXRlSWRUbzUwMEticHNbXSA9IHsgMiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4LCAxNDQsIDIwMH07Ci0KLVVDSEFSICBTc2lkSWUJID0gSUVfU1NJRDsKLVVDSEFSICBTdXBSYXRlSWUgPSBJRV9TVVBQX1JBVEVTOwotVUNIQVIgIEV4dFJhdGVJZSA9IElFX0VYVF9TVVBQX1JBVEVTOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVUNIQVIgIEh0Q2FwSWUgPSBJRV9IVF9DQVA7Ci1VQ0hBUiAgQWRkSHRJbmZvSWUgPSBJRV9BRERfSFQ7Ci1VQ0hBUiAgTmV3RXh0Q2hhbkllID0gSUVfU0VDT05EQVJZX0NIX09GRlNFVDsKLSNpZmRlZiBET1QxMU5fRFJBRlQzCi1VQ0hBUiAgRXh0SHRDYXBJZSA9IElFX0VYVF9DQVBBQklMSVRZOwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLVVDSEFSICBFcnBJZQkgPSBJRV9FUlA7Ci1VQ0hBUiAgRHNJZQkgPSBJRV9EU19QQVJNOwotVUNIQVIgIFRpbUllCSA9IElFX1RJTTsKLVVDSEFSICBXcGFJZQkgPSBJRV9XUEE7Ci1VQ0hBUiAgV3BhMkllCSA9IElFX1dQQTI7Ci1VQ0hBUiAgSWJzc0llCSA9IElFX0lCU1NfUEFSTTsKLVVDSEFSICBDY3gySWUJID0gSUVfQ0NYX1YyOwotVUNIQVIgIFdhcGlJZQkgPSBJRV9XQVBJOwotCi1leHRlcm4gVUNIQVIJV1BBX09VSVtdOwotCi1VQ0hBUglTRVNfT1VJW10gPSB7MHgwMCwgMHg5MCwgMHg0Y307Ci0KLVVDSEFSCVplcm9Tc2lkWzMyXSA9IHsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9OwotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJaW5pdGlhbGl6ZSB0aGUgTUxNRSB0YXNrIGFuZCBpdHMgZGF0YSBzdHJ1Y3R1cmUgKHF1ZXVlLCBzcGlubG9jaywKLQkJdGltZXIsIHN0YXRlIG1hY2hpbmVzKS4KLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlSZXR1cm46Ci0JCWFsd2F5cyByZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUwotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUyBNbG1lSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlORElTX1NUQVRVUyBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE1MTUUgSW5pdGlhbGl6ZVxuIikpOwotCi0JZG8KLQl7Ci0JCVN0YXR1cyA9IE1sbWVRdWV1ZUluaXQoJnBBZC0+TWxtZS5RdWV1ZSk7Ci0JCWlmKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJYnJlYWs7Ci0KLQkJcEFkLT5NbG1lLmJSdW5uaW5nID0gRkFMU0U7Ci0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKLQotCQkJLy8gaW5pdCBTVEEgc3RhdGUgbWFjaGluZXMKLQkJCUFzc29jU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLCBwQWQtPk1sbWUuQXNzb2NGdW5jKTsKLQkJCUF1dGhTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BdXRoTWFjaGluZSwgcEFkLT5NbG1lLkF1dGhGdW5jKTsKLQkJCUF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BdXRoUnNwTWFjaGluZSwgcEFkLT5NbG1lLkF1dGhSc3BGdW5jKTsKLQkJCVN5bmNTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5TeW5jTWFjaGluZSwgcEFkLT5NbG1lLlN5bmNGdW5jKTsKLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQkJRGxzU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuRGxzTWFjaGluZSwgcEFkLT5NbG1lLkRsc0Z1bmMpOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0KLQotCQkJLy8gU2luY2Ugd2UgYXJlIHVzaW5nIHN3aXRjaC9jYXNlIHRvIGltcGxlbWVudCBpdCwgdGhlIGluaXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIGFib3ZlCi0JCQkvLyBzdGF0ZSBtYWNoaW5lIGluaXQKLQkJCU1sbWVDbnRsSW5pdChwQWQsICZwQWQtPk1sbWUuQ250bE1hY2hpbmUsIE5VTEwpOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCQlXcGFTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5XcGFNYWNoaW5lLCBwQWQtPk1sbWUuV3BhRnVuYyk7Ci0KLQotCQlBY3Rpb25TdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BY3RNYWNoaW5lLCBwQWQtPk1sbWUuQWN0RnVuYyk7Ci0KLQkJLy8gSW5pdCBtbG1lIHBlcmlvZGljIHRpbWVyCi0JCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKSwgcEFkLCBUUlVFKTsKLQotCQkvLyBTZXQgbWxtZSBwZXJpb2RpYyB0aW1lcgotCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLCBNTE1FX1RBU0tfRVhFQ19JTlRWKTsKLQotCQkvLyBzb2Z0d2FyZS1iYXNlZCBSWCBBbnRlbm5hIGRpdmVyc2l0eQotCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEFzaWNSeEFudEV2YWxUaW1lb3V0KSwgcEFkLCBGQUxTRSk7Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0jaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAotCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQotCQkJewotCQkJICAgIC8vIG9ubHkgUENJZSBjYXJkcyBuZWVkIHRoZXNlIHR3byB0aW1lcnMKLQkJCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFBzUG9sbFdha2VFeGVjKSwgcEFkLCBGQUxTRSk7Ci0JCQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oUmFkaW9PbkV4ZWMpLCBwQWQsIEZBTFNFKTsKLQkJCX0KLSNlbmRpZiAvLyBSVE1QX1BDSV9TVVBQT1JUIC8vCi0KLQkJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lLkxpbmtEb3duVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihMaW5rRG93bkV4ZWMpLCBwQWQsIEZBTFNFKTsKLQotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQl9IHdoaWxlIChGQUxTRSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTUxNRSBJbml0aWFsaXplXG4iKSk7Ci0KLQlyZXR1cm4gU3RhdHVzOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCW1haW4gbG9vcCBvZiB0aGUgTUxNRQotCVByZToKLQkJTWxtZSBoYXMgdG8gYmUgaW5pdGlhbGl6ZWQsIGFuZCB0aGVyZSBhcmUgc29tZXRoaW5nIGluc2lkZSB0aGUgcXVldWUKLQlOb3RlOgotCQlUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgZnJvbSBNUFNldEluZm9ybWF0aW9uIGFuZCBNUFJlY2VpdmU7Ci0JCVRoaXMgdGFzayBndWFyYW50ZWUgb25seSBvbmUgTWxtZUhhbmRsZXIgd2lsbCBydW4uCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWxtZUhhbmRsZXIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JTUxNRV9RVUVVRV9FTEVNCQkgICAqRWxlbSA9IE5VTEw7Ci0jaWZkZWYgQVBDTElfU1VQUE9SVAotCVNIT1JUIGFwY2xpSWZJbmRleDsKLSNlbmRpZiAvLyBBUENMSV9TVVBQT1JUIC8vCi0KLQkvLyBPbmx5IGFjY2VwdCBNTE1FIGFuZCBGcmFtZSBmcm9tIHBlZXIgc2lkZSwgbm8gb3RoZXIgKGNvbnRyb2wvZGF0YSkgZnJhbWUgc2hvdWxkCi0JLy8gZ2V0IGludG8gdGhpcyBzdGF0ZSBtYWNoaW5lCi0KLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwotCWlmKHBBZC0+TWxtZS5iUnVubmluZykKLQl7Ci0JCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5NbG1lLmJSdW5uaW5nID0gVFJVRTsKLQl9Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKLQotCXdoaWxlICghTWxtZVF1ZXVlRW1wdHkoJnBBZC0+TWxtZS5RdWV1ZSkpCi0JewotCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01MTUVfUkVTRVRfSU5fUFJPR1JFU1MpIHx8Ci0JCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykgfHwKLQkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGV2aWNlIEhhbHRlZCBvciBSZW1vdmVkIG9yIE1sbWVSZXN0LCBleGl0IE1sbWVIYW5kbGVyISAocXVldWUgbnVtID0gJWxkKVxuIiwgcEFkLT5NbG1lLlF1ZXVlLk51bSkpOwotCQkJYnJlYWs7Ci0JCX0KLQotI2lmZGVmIFJBTElOS19BVEUKLQkJaWYoQVRFX09OKHBBZCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93IGluIE1sbWVIYW5kbGVyXG4iKSk7Ci0JCQlicmVhazsKLQkJfQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCQkvL0Zyb20gbWVzc2FnZSB0eXBlLCBkZXRlcm1pbmUgd2hpY2ggc3RhdGUgbWFjaGluZSBJIHNob3VsZCBkcml2ZQotCQlpZiAoTWxtZURlcXVldWUoJnBBZC0+TWxtZS5RdWV1ZSwgJkVsZW0pKQotCQl7Ci0KLQkJCS8vIGlmIGRlcXVldWUgc3VjY2VzcwotCQkJc3dpdGNoIChFbGVtLT5NYWNoaW5lKQotCQkJewotCQkJCS8vIFNUQSBzdGF0ZSBtYWNoaW5lcwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJCWNhc2UgQVNTT0NfU1RBVEVfTUFDSElORToKLQkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLCBFbGVtKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBVVRIX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkF1dGhNYWNoaW5lLCBFbGVtKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBVVRIX1JTUF9TVEFURV9NQUNISU5FOgotCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5BdXRoUnNwTWFjaGluZSwgRWxlbSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1lOQ19TVEFURV9NQUNISU5FOgotCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5TeW5jTWFjaGluZSwgRWxlbSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCU1sbWVDbnRsTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkNudGxNYWNoaW5lLCBFbGVtKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBXUEFfUFNLX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLldwYVBza01hY2hpbmUsIEVsZW0pOwotCQkJCQlicmVhazsKLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQkJCWNhc2UgRExTX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkRsc01hY2hpbmUsIEVsZW0pOwotCQkJCQlicmVhazsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCQkJY2FzZSBBQ1RJT05fU1RBVEVfTUFDSElORToKLQkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQWN0TWFjaGluZSwgRWxlbSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBXUEFfU1RBVEVfTUFDSElORToKLQkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuV3BhTWFjaGluZSwgRWxlbSk7Ci0JCQkJCWJyZWFrOwotCi0KLQkJCQlkZWZhdWx0OgotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFUlJPUjogSWxsZWdhbCBtYWNoaW5lICVsZCBpbiBNbG1lSGFuZGxlcigpXG4iLCBFbGVtLT5NYWNoaW5lKSk7Ci0JCQkJCWJyZWFrOwotCQkJfSAvLyBlbmQgb2Ygc3dpdGNoCi0KLQkJCS8vIGZyZWUgTUxNRSBlbGVtZW50Ci0JCQlFbGVtLT5PY2N1cGllZCA9IEZBTFNFOwotCQkJRWxlbS0+TXNnTGVuID0gMDsKLQotCQl9Ci0JCWVsc2UgewotCQkJREJHUFJJTlRfRVJSKCgiTWxtZUhhbmRsZXI6IE1sbWVRdWV1ZSBlbXB0eVxuIikpOwotCQl9Ci0JfQotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKLQlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBGQUxTRTsKLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCURlc3RydWN0b3Igb2YgTUxNRSAoRGVzdHJveSBxdWV1ZSwgc3RhdGUgbWFjaGluZSwgc3BpbiBsb2NrIGFuZCB0aW1lcikKLQlQYXJhbWV0ZXJzOgotCQlBZGFwdGVyIC0gTklDIEFkYXB0ZXIgcG9pbnRlcgotCVBvc3Q6Ci0JCVRoZSBNTE1FIHRhc2sgd2lsbCBubyBsb25nZXIgd29yayBwcm9wZXJseQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWxtZUhhbHQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JQk9PTEVBTgkJICBDYW5jZWxsZWQ7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZUhhbHRcbiIpKTsKLQotCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCXsKLQkJLy8gZGlzYWJsZSBCRUFDT04gZ2VuZXJhdGlvbiBhbmQgb3RoZXIgQkVBQ09OIHJlbGF0ZWQgaGFyZHdhcmUgdGltZXJzCi0JCUFzaWNEaXNhYmxlU3luYyhwQWQpOwotCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQlVQ0hBUgkJaTsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkJLy8gQ2FuY2VsIHBlbmRpbmcgdGltZXJzCi0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLAkJJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsCSZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAkJJkNhbmNlbGxlZCk7Ci0KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCSAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkKLQkJCSYmKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkKLQkgICAgewotCQkgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQkJICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwJCSZDYW5jZWxsZWQpOwotCQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKLQkJewotCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJkNhbmNlbGxlZCk7Ci0JCX0KLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuTGlua0Rvd25UaW1lciwJCSZDYW5jZWxsZWQpOwotCi0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwJCSZDYW5jZWxsZWQpOwotCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLAkJJkNhbmNlbGxlZCk7Ci0KLQotCi0JaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JewotCQlSVE1QX0NISVBfT1AgKnBDaGlwT3BzID0gJnBBZC0+Y2hpcE9wczsKLQotCQkvLyBTZXQgTEVECi0JCVJUTVBTZXRMRUQocEFkLCBMRURfSEFMVCk7Ci0JCVJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLy8gRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBmaXJtd2FyZSBpcyBub3QgZG9uZSBpdC4KLQotCQlpZiAocENoaXBPcHMtPkFzaWNIYWx0QWN0aW9uKQotCQkJcENoaXBPcHMtPkFzaWNIYWx0QWN0aW9uKHBBZCk7Ci0JfQotCi0JUlRNUHVzZWNEZWxheSg1MDAwKTsgICAgLy8gIDUgbXNlYyB0byBndXJhbnRlZSBBbnQgRGl2ZXJzaXR5IHRpbWVyIGNhbmNlbGVkCi0KLQlNbG1lUXVldWVEZXN0cm95KCZwQWQtPk1sbWUuUXVldWUpOwotCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUhhbHRcbiIpKTsKLX0KLQotVk9JRCBNbG1lUmVzZXRSYWxpbmtDb3VudGVycygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKLXsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNSeE9rRGF0YUNudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0RhdGFDbnQ7Ci0JLy8gY2xlYXIgYWxsIE9uZVNlY3h4eCBjb3VudGVycy4KLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0JlYWNvblNlbnRDbnQgPSAwOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRmFsc2VDQ0FDbnQgPSAwOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQgPSAwOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudCA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID0gMDsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ID0gMDsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tEYXRhQ250ID0gMDsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1JlY2VpdmVkQnl0ZUNvdW50ID0gMDsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50ID0gMDsKLQotCS8vIFRPRE86IGZvciBkZWJ1ZyBvbmx5LiB0byBiZSByZW1vdmVkCi0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX0JFXSA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX0JLXSA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX1ZJXSA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX1ZPXSA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX0JFXSA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX0JLXSA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX1ZJXSA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX1ZPXSA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeENvdW50ID0gMDsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4QWdncmVnYXRpb25Db3VudCA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEFnZ3JlZ2F0aW9uQ291bnQgPSAwOwotCi0JcmV0dXJuOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyByb3V0aW5lIGlzIGV4ZWN1dGVkIHBlcmlvZGljYWxseSB0byAtCi0JCTEuIERlY2lkZSBpZiBpdCdzIGEgcmlnaHQgdGltZSB0byB0dXJuIG9uIFB3ck1nbXQgYml0IG9mIGFsbAotCQkgICBvdXRnb2lpbmcgZnJhbWVzCi0JCTIuIENhbGN1bGF0ZSBDaGFubmVsUXVhbGl0eSBiYXNlZCBvbiBzdGF0aXN0aWNzIG9mIHRoZSBsYXN0Ci0JCSAgIHBlcmlvZCwgc28gdGhhdCBUWCByYXRlIHdvbid0IHRvZ2dsaW5nIHZlcnkgZnJlcXVlbnRseSBiZXR3ZWVuIGEKLQkJICAgc3VjY2Vzc2Z1bCBUWCBhbmQgYSBmYWlsZWQgVFguCi0JCTMuIElmIHRoZSBjYWxjdWxhdGVkIENoYW5uZWxRdWFsaXR5IGluZGljYXRlZCBjdXJyZW50IGNvbm5lY3Rpb24gbm90Ci0JCSAgIGhlYWx0aHksIHRoZW4gYSBST0FNaW5nIGF0dGVtcHQgaXMgdHJpZWQgaGVyZS4KLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotI2RlZmluZSBBREhPQ19CRUFDT05fTE9TVF9USU1FCQkoOCpPU19IWikgIC8vIDggc2VjCi1WT0lEIE1sbWVQZXJpb2RpY0V4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCVVMT05HCQkJVHhUb3RhbENudDsKLQlQUlRNUF9BREFQVEVSCXBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7Ci0JU0hPUlQJcmVhbGF2Z3Jzc2k7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkgICAgLy8gSWYgSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkLCB3ZSBoYXZlIHRvIGNoZWNrIEdQSU8gcGluMiBldmVyeSAyIHNlY29uZC4KLQkJLy8gTW92ZSBjb2RlIHRvIGhlcmUsIGJlY2F1c2UgZm9sbG93aW5nIGNvZGUgd2lsbCByZXR1cm4gd2hlbiByYWRpbyBpcyBvZmYKLQkJaWYgKChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlIChNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAqIDIpID09IDApICYmIChwQWQtPlN0YUNmZy5iSGFyZHdhcmVSYWRpbyA9PSBUUlVFKSAmJgotCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKLQkJCS8qJiYocEFkLT5iUENJY2xrT2ZmID09IEZBTFNFKSovKQotCQl7Ci0JCQlVSU5UMzIJCQkJZGF0YSA9IDA7Ci0KLQkJCS8vIFJlYWQgR1BJTyBwaW4yIGFzIEhhcmR3YXJlIGNvbnRyb2xsZWQgcmFkaW8gc3RhdGUKLSNpZm5kZWYgUlQzMDkwCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZkYXRhKTsKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLS8vS0goUENJRSBQUyk6QWRkZWQgYmFzZWQgb24gSmFuZTwtLQotI2lmZGVmIFJUMzA5MAotLy8gUmVhZCBHUElPIHBpbjIgYXMgSGFyZHdhcmUgY29udHJvbGxlZCByYWRpbyBzdGF0ZQotLy8gV2UgbmVlZCB0byBSZWFkIEdQSU8gaWYgSFcgc2FpZCBzbyBubyBtYXRlciB3aGF0IGFkdmFuY2UgcG93ZXIgc2F2aW5nCi1pZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIChJRExFX09OKHBBZCkpCi0JJiYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikpCi0JJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVQU2luSWRsZSA9PSBUUlVFKSkKLQl7Ci0JLy8gV2FudCB0byBtYWtlIHN1cmUgZGV2aWNlIGdvZXMgdG8gTDAgc3RhdGUgYmVmb3JlIHJlYWRpbmcgcmVnaXN0ZXIuCi0JUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIDApOwotCVJUTVBfSU9fRk9SQ0VfUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJmRhdGEpOwotCVJUTVBQQ0llTGlua0N0cmxTZXR0aW5nKHBBZCwgMyk7Ci0JfQotZWxzZQotCVJUTVBfSU9fRk9SQ0VfUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJmRhdGEpOwotI2VuZGlmIC8vIFJUMzA5MCAvLwotLy9LSChQQ0lFIFBTKTpBZGRlZCBiYXNlZCBvbiBKYW5lLS0+Ci0KLQkJCWlmIChkYXRhICYgMHgwNCkKLQkJCXsKLQkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IFRSVUU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gPSBGQUxTRTsKLQkJCX0KLQkJCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gIT0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKSkKLQkJCXsKLQkJCQlwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOwotCQkJCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKLQkJCQl7Ci0JCQkJCU1sbWVSYWRpb09uKHBBZCk7Ci0JCQkJCS8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgotCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCU1sbWVSYWRpb09mZihwQWQpOwotCQkJCQkvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KLQkJCQkJcEFkLT5FeHRyYUluZm8gPSBIV19SQURJT19PRkY7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8Ci0JCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkpKQotCQlyZXR1cm47Ci0KLQlSVE1QX01MTUVfUFJFX1NBTklUWV9DSEVDSyhwQWQpOwotCi0jaWZkZWYgUkFMSU5LX0FURQotCS8qIERvIG5vdCBzaG93IFJTU0kgdW50aWwgIk5vcm1hbCAxIHNlY29uZCBNbG1lIFBlcmlvZGljRXhlYyIuICovCi0JaWYgKEFURV9PTihwQWQpKQotCXsKLQkJaWYgKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICUgTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgIT0gKE1MTUVfVEFTS19FWEVDX01VTFRJUExFIC0gMSkpCi0JewotCQkJcEFkLT5NbG1lLlBlcmlvZGljUm91bmQgKys7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCS8vIERvIG5vdGhpbmcgaWYgbW9uaXRvciBtb2RlIGlzIG9uCi0JCWlmIChNT05JVE9SX09OKHBBZCkpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICYgMHgxKQotCQl7Ci0JCQkvLyBUaGlzIGlzIHRoZSBmaXggZm9yIHdpZmkgMTFuIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIHRlc3QgY2FzZS4gIGZvciAyODYwRAotCQkJaWYgKCgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA9PSAweDAxMDEpICYmCi0JCQkJKFNUQV9UR05fV0lGSV9PTihwQWQpKSAmJgotCQkJCShwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJUb2dnbGUgPT0gRkFMU0UpKQotCi0JCQkJewotCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWE9QX0NUUkxfQ0ZHLCAweDI0QmYpOwotCQkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJUb2dnbGUgPSBUUlVFOwotCQkJCX0KLQkJCQllbHNlIGlmICgoU1RBX1RHTl9XSUZJX09OKHBBZCkpICYmCi0JCQkJCQkoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPT0gMHgwMTAxKSkKLQkJCQl7Ci0JCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYT1BfQ1RSTF9DRkcsIDB4MjQzZik7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlRvZ2dsZSA9IEZBTFNFOwotCQkJCX0KLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCXBBZC0+YlVwZGF0ZUJjbkNudERvbmUgPSBGQUxTRTsKLQotLy8JUkVDQkFUaW1lclRpbWVvdXQoU3lzdGVtU3BlY2lmaWMxLEZ1bmN0aW9uQ29udGV4dCxTeXN0ZW1TcGVjaWZpYzIsU3lzdGVtU3BlY2lmaWMzKTsKLQlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCArKzsKLQotCi0JLy8gZXhlY3V0ZSBldmVyeSA1MDBtcwotCWlmICgocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJSA1ID09IDApICYmIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKHBBZCkvKihPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpKSovKQotCXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJLy8gcGVyZm9ybSBkeW5hbWljIHR4IHJhdGUgc3dpdGNoaW5nIGJhc2VkIG9uIHBhc3QgVFggaGlzdG9yeQotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQlpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQotCQkJCQkpCi0JCQkJJiYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKSkKLQkJCQlNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZyhwQWQpOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JfQotCi0JLy8gTm9ybWFsIDEgc2Vjb25kIE1sbWUgUGVyaW9kaWNFeGVjLgotCWlmIChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgPT0gMCkKLQl7Ci0gICAgICAgICAgICAgICAgcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgKys7Ci0KLSNpZmRlZiBSQUxJTktfQVRFCi0JaWYgKEFURV9PTihwQWQpKQotCXsKLQkJCS8qIHJlcXVlc3QgZnJvbSBCYXJvbiA6IG1vdmUgdGhpcyByb3V0aW5lIGZyb20gbGF0ZXIgdG8gaGVyZSAqLwotCQkJLyogZm9yIHNob3dpbmcgUnggZXJyb3IgY291bnQgaW4gQVRFIFJYRlJBTUUgKi8KLSAgICAgICAgICAgIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCk7Ci0JCQlpZiAocEFkLT5hdGUuYlJ4RkVSID09IDEpCi0JCQl7Ci0JCQkJcEFkLT5hdGUuUnhUb3RhbENudCArPSBwQWQtPmF0ZS5SeENudFBlclNlYzsKLQkJCSAgICBhdGVfcHJpbnQoS0VSTl9FTUVSRyAiTWxtZVBlcmlvZGljRXhlYzogUnggcGFja2V0IGNudCA9ICVkLyVkXG4iLCBwQWQtPmF0ZS5SeENudFBlclNlYywgcEFkLT5hdGUuUnhUb3RhbENudCk7Ci0JCQkJcEFkLT5hdGUuUnhDbnRQZXJTZWMgPSAwOwotCi0JCQkJaWYgKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9PSAwKQotCQkJCQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiTWxtZVBlcmlvZGljRXhlYzogUnggQXZnUnNzaTA9JWQsIEF2Z1Jzc2kxPSVkLCBBdmdSc3NpMj0lZFxuXG4iLAotCQkJCQkJcEFkLT5hdGUuQXZnUnNzaTAsIHBBZC0+YXRlLkF2Z1Jzc2kxLCBwQWQtPmF0ZS5BdmdSc3NpMik7Ci0JCQkJZWxzZQotCQkJCQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiTWxtZVBlcmlvZGljRXhlYzogUnggQXZnUnNzaT0lZFxuXG4iLCBwQWQtPmF0ZS5BdmdSc3NpMCk7Ci0JCQl9Ci0JCQlNbG1lUmVzZXRSYWxpbmtDb3VudGVycyhwQWQpOwotCi0KLQotCQkJcmV0dXJuOwotCX0KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQotCi0JCS8vT1JJQkFUaW1lclRpbWVvdXQocEFkKTsKLQotCQkvLyBNZWRpYSBzdGF0dXMgY2hhbmdlZCwgcmVwb3J0IHRvIE5ESVMKLQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UpKQotCQl7Ci0JCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX0NIQU5HRSk7Ci0JCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQotCQkJewotCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0JCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOwotCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0JCQl9Ci0JCX0KLQotCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPk1sbWUuTm93MzIpOwotCi0JCS8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSB2YXJpYWJsZSwgc28gdGhhdAotCQkvLyB0aGUgZHluYW1pYyB0dW5pbmcgbWVjaGFuaXNtIGJlbG93IGFyZSBiYXNlZCBvbiBtb3N0IHVwLXRvLWRhdGUgaW5mb3JtYXRpb24KLQkJTklDVXBkYXRlUmF3Q291bnRlcnMocEFkKTsKLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCS8vIE5lZWQgc3RhdGlzdGljcyBhZnRlciByZWFkIGNvdW50ZXIuIFNvIHB1dCBhZnRlciBOSUNVcGRhdGVSYXdDb3VudGVycwotCQlPUklCQVRpbWVyVGltZW91dChwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCS8vIGlmIE1HTVQgUklORyBpcyBmdWxsIG1vcmUgdGhhbiB0d2ljZSB3aXRoaW4gMSBzZWNvbmQsIHdlIGNvbnNpZGVyIHRoZXJlJ3MKLQkJLy8gYSBoYXJkd2FyZSBwcm9ibGVtIHN0dWNraW5nIHRoZSBUWCBwYXRoLiBJbiB0aGlzIGNhc2UsIHRyeSBhIGhhcmR3YXJlIHJlc2V0Ci0JCS8vIHRvIHJlY292ZXIgdGhlIHN5c3RlbQotCS8vCWlmIChwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50ID49IDIpCi0JLy8JCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBUkRXQVJFX0VSUk9SKTsKLQkvLwllbHNlCi0JLy8JCXBBZC0+UmFsaW5rQ291bnRlcnMuTWdtdFJpbmdGdWxsQ291bnQgPSAwOwotCi0JCS8vIFRoZSB0aW1lIHBlcmlvZCBmb3IgY2hlY2tpbmcgYW50ZW5uYSBpcyBhY2NvcmRpbmcgdG8gdHJhZmZpYwotI2lmZGVmIEFOVF9ESVZFUlNJVFlfU1VQUE9SVAotCQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpICYmCi0JCQkocEFkLT5Db21tb25DZmcuYlJ4QW50RGl2ZXJzaXR5ID09IEFOVF9ESVZFUlNJVFlfRU5BQkxFKSAmJgotCQkJKCFwQWQtPkVlcHJvbUFjY2VzcykpCi0JCQlBc2ljQW50ZW5uYVNlbGVjdChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKLQkJZWxzZSBpZihwQWQtPkNvbW1vbkNmZy5iUnhBbnREaXZlcnNpdHkgPT0gQU5UX0ZJWF9BTlQxIHx8IHBBZC0+Q29tbW9uQ2ZnLmJSeEFudERpdmVyc2l0eSA9PSBBTlRfRklYX0FOVDIpCi0JCXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCXJlYWxhdmdyc3NpID0gKHBBZC0+UnhBbnQuUGFpcjFBdmdSc3NpW3BBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnRdID4+IDMpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBbnQtcmVhbHJzc2kwKCVkKSwgTGFzdHJzc2kwKCVkKSwgRXZhbHVhdGVTdGFibGVDbnQ9JWRcbiIsIHJlYWxhdmdyc3NpLCBwQWQtPlJ4QW50LlBhaXIxTGFzdEF2Z1Jzc2ksIHBBZC0+UnhBbnQuRXZhbHVhdGVTdGFibGVDbnQpKTsKLQkJfQotCQllbHNlCi0jZW5kaWYgLy8gQU5UX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0JCXsKLQkJCWlmIChwQWQtPk1sbWUuYkVuYWJsZUF1dG9BbnRlbm5hQ2hlY2spCi0JCQl7Ci0JCQkJVHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCi0JCQkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKLQkJCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7Ci0KLQkJCQkvLyBkeW5hbWljIGFkanVzdCBhbnRlbm5hIGV2YWx1YXRpb24gcGVyaW9kIGFjY29yZGluZyB0byB0aGUgdHJhZmZpYwotCQkJCWlmIChUeFRvdGFsQ250ID4gNTApCi0JCQkJewotCQkJCQlpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSAxMCA9PSAwKQotCQkJCQl7Ci0JCQkJCQlBc2ljRXZhbHVhdGVSeEFudChwQWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDMgPT0gMCkKLQkJCQkJewotCQkJCQkJQXNpY0V2YWx1YXRlUnhBbnQocEFkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQlTVEFNbG1lUGVyaW9kaWNFeGVjKHBBZCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMocEFkKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCQlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSAmJiAocEFkLT5iUENJY2xrT2ZmID09IEZBTFNFKSkKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJCXsKLQkJCS8vIFdoZW4gQWRob2MgYmVhY29uIGlzIGVuYWJsZWQgYW5kIFJUUy9DVFMgaXMgZW5hYmxlZCwgdGhlcmUgaXMgYSBjaGFuY2UgdGhhdCBoYXJkd2FyZSBNQUMgRlNNIHdpbGwgcnVuIGludG8gYSBkZWFkbG9jawotCQkJLy8gYW5kIHNlbmRpbmcgQ1RTLXRvLXNlbGYgb3ZlciBhbmQgb3Zlci4KLQkJCS8vIFNvZnR3YXJlIFBhdGNoIFNvbHV0aW9uOgotCQkJLy8gMS4gUG9sbGluZyBkZWJ1ZyBzdGF0ZSByZWdpc3RlciAweDEwRjQgZXZlcnkgb25lIHNlY29uZC4KLQkJCS8vIDIuIElmIGluIDB4MTBGNCB0aGUgKChiaXQyOT09MSkgJiYgKGJpdDc9PTEpKSBPUiAoKGJpdDI5PT0xKSAmJiAoYml0NT09MSkpLCBpdCBtZWFucyB0aGUgZGVhZGxvY2sgaGFzIG9jY3VycmVkLgotCQkJLy8gMy4gSWYgdGhlIGRlYWRsb2NrIG9jY3VycmVkLCByZXNldCBNQUMvQkJQIGJ5IHNldHRpbmcgMHgxMDA0IHRvIDB4MDAwMSBmb3IgYSB3aGlsZSB0aGVuIHNldHRpbmcgaXQgYmFjayB0byAweDAwMEMgYWdhaW4uCi0KLQkJCVVJTlQzMglNYWNSZWcgPSAwOwotCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTBGNCwgJk1hY1JlZyk7Ci0JCQlpZiAoKChNYWNSZWcgJiAweDIwMDAwMDAwKSAmJiAoTWFjUmVnICYgMHg4MCkpIHx8ICgoTWFjUmVnICYgMHgyMDAwMDAwMCkgJiYgKE1hY1JlZyAmIDB4MjApKSkKLQkJCXsKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MSk7Ci0JCQkJUlRNUHVzZWNEZWxheSgxKTsKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4Qyk7Ci0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiV2FybmluZywgTUFDIHNwZWNpZmljIGNvbmRpdGlvbiBvY2N1cnMgXG4iKSk7Ci0JCQl9Ci0JCX0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7Ci0JfQotCi0KLQlwQWQtPmJVcGRhdGVCY25DbnREb25lID0gRkFMU0U7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVZhbGlkYXRlIFNTSUQgZm9yIGNvbm5lY3Rpb24gdHJ5IGFuZCByZXNjYW4gcHVycG9zZQotCVZhbGlkIFNTSUQgd2lsbCBoYXZlIHZpc2libGUgY2hhcnMgb25seS4KLQlUaGUgdmFsaWQgbGVuZ3RoIGlzIGZyb20gMCB0byAzMi4KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIE1sbWVWYWxpZGF0ZVNTSUQoCi0JSU4gUFVDSEFSCXBTc2lkLAotCUlOIFVDSEFSCVNzaWRMZW4pCi17Ci0JaW50CWluZGV4OwotCi0JaWYgKFNzaWRMZW4gPiBNQVhfTEVOX09GX1NTSUQpCi0JCXJldHVybiAoRkFMU0UpOwotCi0JLy8gQ2hlY2sgZWFjaCBjaGFyYWN0ZXIgdmFsdWUKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTc2lkTGVuOyBpbmRleCsrKQotCXsKLQkJaWYgKHBTc2lkW2luZGV4XSA8IDB4MjApCi0JCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0KLQkvLyBBbGwgY2hlY2tlZAotCXJldHVybiAoVFJVRSk7Ci19Ci0KLVZPSUQgTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKAotCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCi0JSU4gUFVDSEFSCQkJCSpwcFRhYmxlLAotCUlOIFBVQ0hBUgkJCQlwVGFibGVTaXplLAotCUlOIFBVQ0hBUgkJCQlwSW5pdFR4UmF0ZUlkeCkKLXsKLQlkbwotCXsKLQkJLy8gZGVjaWRlIHRoZSByYXRlIHRhYmxlIGZvciB0dW5pbmcKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZVRhYmxlU2l6ZSA+IDApCi0JCXsKLQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlOwotCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGVbMF07Ci0JCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGVbMV07Ci0KLQkJCWJyZWFrOwotCQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiBBREhPQ19PTihwQWQpKQotCQl7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYKLQkJCQkocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmCi0JCQkJKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkpKQotCQkJey8vIDExTiAxUyBBZGhvYwotCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVM7Ci0JCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4xU1swXTsKLQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKLQotCQkJfQotCQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYKLQkJCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgotCQkJCQkocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmCi0JCQkJCShwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQotCQkJey8vIDExTiAyUyBBZGhvYwotCQkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCi0JCQkJewotCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTOwotCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzBdOwotCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU1sxXTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kOwotCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMF07Ci0JCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMV07Ci0JCQkJfQotCi0JCQl9Ci0JCQllbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkJaWYgKChwRW50cnktPlJhdGVMZW4gPT0gNCkKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCQkJJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkJCSkKLQkJCXsKLQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQjsKLQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQlswXTsKLQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJbMV07Ci0KLQkJCX0KLQkJCWVsc2UgaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKLQkJCXsKLQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkc7Ci0JCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHWzBdOwotCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMV07Ci0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExRzsKLQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExR1swXTsKLQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUdbMV07Ci0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJLy9pZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDEyKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKLQkJLy8JKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSkpCi0JCWlmICgoKHBFbnRyeS0+UmF0ZUxlbiA9PSAxMikgfHwgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmCi0JCQkoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkpKQotCQl7Ly8gMTFCR04gMVMgQVAKLQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04xUzsKLQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04xU1swXTsKLQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbMV07Ci0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiArIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPT0gMTIpICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAweGZmKSAmJgotCQkvLwkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMHhmZikgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCi0JCWlmICgoKHBFbnRyeS0+UmF0ZUxlbiA9PSAxMikgfHwgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmCi0JCQkocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSkKLQkJey8vIDExQkdOIDJTIEFQCi0JCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQotCQkJewotCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yUzsKLQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbMF07Ci0JCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1sxXTsKLQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kOwotCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kWzBdOwotCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZFsxXTsKLQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAweGZmKSAmJiAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpKSkKLQkJaWYgKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpKSkKLQkJey8vIDExTiAxUyBBUAotCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4xUzsKLQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMF07Ci0JCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKLQotCQkJYnJlYWs7Ci0JCX0KLQotCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAweGZmKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMHhmZikgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCi0JCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHhmZikgJiYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDIpKQotCQl7Ly8gMTFOIDJTIEFQCi0JCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQotCQkJewotCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yUzsKLQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMF07Ci0JCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU1sxXTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQ7Ci0JCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOwotCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMV07Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPT0gNCkgJiYgKHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKLQkJaWYgKChwRW50cnktPlJhdGVMZW4gPT0gNCB8fCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlPT1QSFlfMTFCKQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkvL0l2ZXJzb24gbWFyayBmb3IgQWRob2MgYiBtb2RlLHN0YSB3aWxsIHVzZSByYXRlIDU0ICBNYnBzIHdoZW4gY29ubmVjdCB3aXRoIHN0YSBiL2cvbiBtb2RlCi0JCS8qICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKSovCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkpCi0JCXsvLyBCIG9ubHkgQVAKLQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCOwotCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJbMF07Ci0JCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJbMV07Ci0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiArIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPiA4KSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDApKQotCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA+IDgpCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCSkKLQkJey8vIEIvRyAgbWl4ZWQgQVAKLQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCRzsKLQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1swXTsKLQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMV07Ci0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiArIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPT0gOCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKLQkJaWYgKChwRW50cnktPlJhdGVMZW4gPT0gOCkKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCSYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJKQotCQl7Ly8gRyBvbmx5IEFQCi0JCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExRzsKLQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzBdOwotCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzFdOwotCi0JCQlicmVhazsKLQkJfQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKLQkJCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkpCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQl7CS8vIExlZ2FjeSBtb2RlCi0JCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA8PSBSQVRFXzExKQotCQkJCXsKLQkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUI7Ci0JCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzBdOwotCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJbMV07Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPiBSQVRFXzExKSAmJiAocEFkLT5Db21tb25DZmcuTWluVHhSYXRlID4gUkFURV8xMSkpCi0JCQkJewotCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExRzsKLQkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUdbMF07Ci0JCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExR1sxXTsKLQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkc7Ci0JCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1swXTsKLQkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1sxXTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQotCQkJewotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKQotCQkJCXsKLQkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4xUzsKLQkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4xU1swXTsKLQkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMV07Ci0JCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDFTIEFQIFxuIikpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTOwotCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzBdOwotCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU1sxXTsKLQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMlMgQVAgXG4iKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKQotCQkJCXsKLQkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4xUzsKLQkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4xU1swXTsKLQkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMV07Ci0JCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDFTIEFQIFxuIikpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQ7Ci0JCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFswXTsKLQkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFsxXTsKLQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMlMgQVAgXG4iKSk7Ci0JCQkJfQotCQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSAoU3VwUmF0ZUxlbj0lZCwgRXh0UmF0ZUxlbj0lZCwgTUNTU2V0WzBdPTB4JXgsIE1DU1NldFsxXT0weCV4KVxuIiwKLQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLCBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuLCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSwgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0pKTsKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0gd2hpbGUoRkFMU0UpOwotfQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLVZPSUQgU1RBTWxtZVBlcmlvZGljRXhlYygKLQlQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVTE9ORwkJCSAgICBUeFRvdGFsQ250OwotCWludAlpOwotCi0KLQotCi0JLyoKLQkJV2UgcmV0dXJuIGhlcmUgaW4gQVRFIG1vZGUsIGJlY2F1c2UgdGhlIHN0YXRpc3RpY3MKLQkJdGhhdCBBVEUgbmVlZCBhcmUgbm90IGNvbGxlY3RlZCB2aWEgdGhpcyByb3V0aW5lLgotCSovCi0jaWZkZWYgUkFMSU5LX0FURQotCWlmIChBVEVfT04ocEFkKSkKLQlyZXR1cm47Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0jaWZkZWYgUkFMSU5LX0FURQotCS8vIEl0IGlzIHN1cHBvc2VkIHRoYXQgd2Ugd2lsbCBuZXZlciByZWFjaCBoZXJlIGluIEFURSBtb2RlLgotCUFTU0VSVCghKEFURV9PTihwQWQpKSk7Ci0JaWYgKEFURV9PTihwQWQpKQotCQlyZXR1cm47Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0jaWZkZWYgUENJRV9QU19TVVBQT1JUCi0vLyBkb24ndCBwZXJmb3JtIGlkbGUtcG93ZXItc2F2ZSBtZWNoYW5pc20gd2l0aGluIDMgbWluIGFmdGVyIGRyaXZlciBpbml0aWFsaXphdGlvbi4KLS8vIFRoaXMgY2FuIG1ha2UgcmVib290ZXIgdGVzdCBtb3JlIHJvYnVzdAotaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQotCXsKLQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIChJRExFX09OKHBBZCkpCi0JCSYmIChwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID09IFNZTkNfSURMRSkKLQkJJiYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKQotCQkmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikpKQotCQl7Ci0JCWlmIChJU19SVDMwOTAocEFkKXx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQotCQkJewotCQkJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKQotCQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6JWRcbiIsX19GVU5DVElPTl9fLF9fTElORV9fKSk7Ci0KLQkJCQlSVDI4eHhQY2lBc2ljUmFkaW9PZmYocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFLCAwKTsKLQkJCQl9Ci0JCQllbHNlCi0JCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjolZFxuIixfX0ZVTkNUSU9OX18sX19MSU5FX18pKTsKLQkJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIFBvd2VyU2FmZUNJRCwgMHhmZiwgMHgyKTsKLQkJCQkvLyBXYWl0IGNvbW1hbmQgc3VjY2VzcwotCQkJCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJTYWZlQ0lEKTsKLQkJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRik7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUFNNIC0gcnQzMHh4IElzc3VlIFNsZWVwIGNvbW1hbmQpXG4iKSk7Ci0JCQkJfQotCQkJfQotCQllbHNlIGlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCA+IDE4MCkKLQkJCXsKLQkJCWlmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkKLQkJCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiVkXG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXykpOwotCQkJCVJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIEdVSV9JRExFX1BPV0VSX1NBVkUsIDApOwotCQkJCX0KLQkJCWVsc2UKLQkJCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiVkXG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXykpOwotCQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgUG93ZXJTYWZlQ0lELCAweGZmLCAweDAyKTsKLQkJCQkvLyBXYWl0IGNvbW1hbmQgc3VjY2VzcwotCQkJCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJTYWZlQ0lEKTsKLQkJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRik7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUFNNIC0gIHJ0Mjh4eCBJc3N1ZSBTbGVlcCBjb21tYW5kKVxuIikpOwotCQkJCX0KLQkJCX0KLQkJfQotCWVsc2UKLQkJewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQU1sbWVQZXJpb2RpY0V4ZWMgTU1DSEsgLSBDb21tb25DZmcuU3NpZFslZF09JWMlYyVjJWMuLi4gTWxtZUF1eC5Tc2lkWyVkXT0lYyVjJWMlYy4uLlxuIiwKLQkJCXBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWRbMF0sIHBBZC0+Q29tbW9uQ2ZnLlNzaWRbMV0sIHBBZC0+Q29tbW9uQ2ZnLlNzaWRbMl0sIHBBZC0+Q29tbW9uQ2ZnLlNzaWRbM10sCi0JCQlwQWQtPk1sbWVBdXguU3NpZExlbiwgcEFkLT5NbG1lQXV4LlNzaWRbMF0sIHBBZC0+TWxtZUF1eC5Tc2lkWzFdLCBwQWQtPk1sbWVBdXguU3NpZFsyXSwgcEFkLT5NbG1lQXV4LlNzaWRbM10pKTsKLQkJfQotCX0KLSNlbmRpZiAvLyBQQ0lFX1BTX1NVUFBPUlQgLy8KLQotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0gICAgewotCS8vIFdQQSBNSUMgZXJyb3Igc2hvdWxkIGJsb2NrIGFzc29jaWF0aW9uIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMKLQkJaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jICYmCi0JCQlSVE1QX1RJTUVfQUZURVIocEFkLT5NbG1lLk5vdzMyLCBwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lICsgKDYwKk9TX0haKSkpCi0JCXBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKChwQWQtPlByZU1lZGlhU3RhdGUgIT0gcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUpICYmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkpCi0JewotCQlpZiAocEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpCi0JCXsKLQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NUQV9MSU5LVVBfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQkJfQotCQlwQWQtPlByZU1lZGlhU3RhdGUgPSBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZTsKLQl9Ci0KLQotCi0KLQlpZiAocEFkLT5Db21tb25DZmcuUFNQWGxpbmsgJiYgQURIT0NfT04ocEFkKSkKLQl7Ci0JfQotCWVsc2UKLQl7Ci0JQXNpY1N0YUJicFR1bmluZyhwQWQpOwotCX0KLQotCVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKwotCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCi0JCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OwotCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQl7Ci0JCS8vIHVwZGF0ZSBjaGFubmVsIHF1YWxpdHkgZm9yIFJvYW1pbmcgYW5kIFVJIExpbmtRdWFsaXR5IGRpc3BsYXkKLQkJTWxtZUNhbGN1bGF0ZUNoYW5uZWxRdWFsaXR5KHBBZCwgTlVMTCwgcEFkLT5NbG1lLk5vdzMyKTsKLQl9Ci0KLQkvLyBtdXN0IGJlIEFGVEVSIE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKCkgYmVjYXVzZSBpdCBuZWVkcyB0byBrbm93IGlmCi0JLy8gUmFkaW8gaXMgY3VycmVudGx5IGluIG5vaXN5IGVudmlyb25tZW50Ci0JaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotCUFzaWNBZGp1c3RUeFBvd2VyKHBBZCk7Ci0KLQlpZiAoSU5GUkFfT04ocEFkKSkKLQl7Ci0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCS8vIENoZWNrIERMUyB0aW1lIG91dCwgdGhlbiB0ZWFyIGRvd24gdGhvc2Ugc2Vzc2lvbgotCQlSVE1QQ2hlY2tETFNUaW1lT3V0KHBBZCk7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQkJLy8gSXMgUFNNIGJpdCBjb25zaXN0ZW50IHdpdGggdXNlciBwb3dlciBtYW5hZ2VtZW50IHBvbGljeT8KLQkJLy8gVGhpcyBpcyB0aGUgb25seSBwbGFjZSB0aGF0IHdpbGwgc2V0IFBTTSBiaXQgT04uCi0JCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJTWxtZUNoZWNrUHNtQ2hhbmdlKHBBZCwgcEFkLT5NbG1lLk5vdzMyKTsKLQotCQlwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQgPSBUeFRvdGFsQ250OwotCi0JCWlmICgoUlRNUF9USU1FX0FGVEVSKHBBZC0+TWxtZS5Ob3czMiwgcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArICgxKk9TX0haKSkpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpICYmCi0JCQkoKChUeFRvdGFsQ250ICsgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rQ250KSA8IDYwMCkpKQotCQl7Ci0JCQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgQldfMjApOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBObyBCRUFDT04uIHJlc3RvcmUgUjY2IHRvIHRoZSBsb3cgYm91bmQoJWQpIFxuIiwgKDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKSkpKTsKLQkJfQotCi0gICAgICAgIC8vaWYgKChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPT0gMCkgJiYKLSAgICAgICAgLy8gICAgKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgPT0gMCkpCi0gICAgICAgIHsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkKLQkJewotCQkgICAgLy8gV2hlbiBBUFNEIGlzIGVuYWJsZWQsIHRoZSBwZXJpb2QgY2hhbmdlcyBhcyAyMCBzZWMKLQkJCWlmICgocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSAyMCkgPT0gOCkKLQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCSAgICAvLyBTZW5kIG91dCBhIE5VTEwgZnJhbWUgZXZlcnkgMTAgc2VjIHRvIGluZm9ybSBBUCB0aGF0IFNUQSBpcyBzdGlsbCBhbGl2ZSAoQXZvaWQgYmVpbmcgYWdlIG91dCkKLQkJCWlmICgocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSAxMCkgPT0gOCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkKLQkJCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0JCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgRkFMU0UpOwotICAgICAgICAgICAgICAgIH0KLQkJfQotICAgICAgICB9Ci0KLQkJaWYgKENRSV9JU19ERUFEKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSkpCi0JCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIE5vIEJFQUNPTi4gRGVhZCBDUUkuIEF1dG8gUmVjb3ZlcnkgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50KSk7Ci0KLQkJCS8vIExvc3QgQVAsIHNlbmQgZGlzY29ubmVjdCAmIGxpbmsgZG93biBldmVudAotCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0jaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JCS8vc2VuZCBkaXNhc3NvY2lhdGUgZXZlbnQgdG8gd3BhX3N1cHBsaWNhbnQKLQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkgewotCQkJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBJV0VWQ1VTVE9NLCBSVF9ESVNBU1NPQ19FVkVOVF9GTEFHLCBOVUxMLCBOVUxMLCAwKTsKLQkJfQotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0jaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBTSU9DR0lXQVAsIC0xLCBOVUxMLCBOVUxMLCAwKTsKLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0JCQkvLyBSVE1QUGF0Y2hNYWNCYnBCdWcocEFkKTsKLQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKLQkJfQotCQllbHNlIGlmIChDUUlfSVNfQkFEKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSkpCi0JCXsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuQmFkQ1FJQXV0b1JlY292ZXJ5Q291bnQgKys7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIEJhZCBDUUkuIEF1dG8gUmVjb3ZlcnkgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50KSk7Ci0JCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7Ci0JCX0KLQotCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9Sb2FtaW5nKQotCQl7Ci0JCQlCT09MRUFOCXJ2ID0gRkFMU0U7Ci0JCQlDSEFSCWRCbVRvUm9hbSA9IHBBZC0+U3RhQ2ZnLmRCbVRvUm9hbTsKLQkJCUNIQVIJTWF4UnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKLQkJCQkJCQkJCQkgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLAotCQkJCQkJCQkJCSAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsCi0JCQkJCQkJCQkJICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMik7Ci0KLQkJCS8vIFNjYW5uaW5nLCBpZ25vcmUgUm9hbWluZwotCQkJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpICYmCi0JCQkJKHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPT0gU1lOQ19JRExFKSAmJgotCQkJCShNYXhSc3NpIDw9IGRCbVRvUm9hbSkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnNzaT0lZCwgZEJtVG9Sb2FtPSVkXG4iLCBNYXhSc3NpLCAoQ0hBUilkQm1Ub1JvYW0pKTsKLQotCi0JCQkJLy8gQWRkIGF1dG8gc2VhbWxlc3Mgcm9hbWluZwotCQkJCWlmIChydiA9PSBGQUxTRSkKLQkJCQkJcnYgPSBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZyhwQWQpOwotCi0JCQkJaWYgKHJ2ID09IEZBTFNFKQotCQkJCXsKLQkJCQkJaWYgKChwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgKyAxMCAqIE9TX0haKSA8IHBBZC0+TWxtZS5Ob3czMikKLQkJCQkJewotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBSb2FtaW5nLCBObyBlbGlnYWJsZSBlbnRyeSwgdHJ5IG5ldyBzY2FuIVxuIikpOwotCQkJCQkJcEFkLT5TdGFDZmcuU2NhbkNudCA9IDI7Ci0JCQkJCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBwQWQtPk1sbWUuTm93MzI7Ci0JCQkJCQlNbG1lQXV0b1NjYW4ocEFkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQllbHNlIGlmIChBREhPQ19PTihwQWQpKQotCXsKLQotCQkvLyBJZiBhbGwgcGVlcnMgbGVhdmUsIGFuZCB0aGlzIFNUQSBiZWNvbWVzIHRoZSBsYXN0IG9uZSBpbiB0aGlzIElCU1MsIHRoZW4gY2hhbmdlIE1lZGlhU3RhdGUKLQkJLy8gdG8gRElTQ09OTkVDVEVELiBCdXQgc3RpbGwgaG9sZGluZyB0aGlzIElCU1MgKGkuZS4gc2VuZGluZyBCRUFDT04pIHNvIHRoYXQgb3RoZXIgU1RBcyBjYW4KLQkJLy8gam9pbiBsYXRlci4KLQkJaWYgKFJUTVBfVElNRV9BRlRFUihwQWQtPk1sbWUuTm93MzIsIHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgKyBBREhPQ19CRUFDT05fTE9TVF9USU1FKSAmJgotCQkJT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQotCQl7Ci0JCQlNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgICAgIFN0YXJ0UmVxOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIGV4Y2Vzc2l2ZSBCRUFDT04gbG9zdCwgbGFzdCBTVEEgaW4gdGhpcyBJQlNTLCBNZWRpYVN0YXRlPURpc2Nvbm5lY3RlZFxuIikpOwotCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0KLQkJCVN0YXJ0UGFybUZpbGwocEFkLCAmU3RhcnRSZXEsIChDSEFSICopcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOwotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9TVEFSVDsKLQkJfQotCi0JCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCQl7Ci0JCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOwotCi0JCQlpZiAocEVudHJ5LT5WYWxpZEFzQ0xJID09IEZBTFNFKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoUlRNUF9USU1FX0FGVEVSKHBBZC0+TWxtZS5Ob3czMiwgcEVudHJ5LT5MYXN0QmVhY29uUnhUaW1lICsgQURIT0NfQkVBQ09OX0xPU1RfVElNRSkpCi0JCQkJTWFjVGFibGVEZWxldGVFbnRyeShwQWQsIHBFbnRyeS0+QWlkLCBwRW50cnktPkFkZHIpOwotCQl9Ci0JfQotCWVsc2UgLy8gbm8gSU5GUkEgbm9yIEFESE9DIGNvbm5lY3Rpb24KLQl7Ci0KLQkJaWYgKHBBZC0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgJiYKLQkJCVJUTVBfVElNRV9CRUZPUkUocEFkLT5NbG1lLk5vdzMyLCBwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgKyAoMzAgKiBPU19IWikpKQotCQkJZ290byBTS0lQX0FVVE9fU0NBTl9DT05OOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7Ci0KLQkJaWYgKChwQWQtPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9PSBUUlVFKQotCQkJJiYgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKQotCQkJJiYgKE1sbWVWYWxpZGF0ZVNTSUQocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pID09IFRSVUUpKQotCQl7Ci0JCQlpZiAoKHBBZC0+U2NhblRhYi5Cc3NOcj09MCkgJiYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSkKLQkJCXsKLQkJCQlNTE1FX1NDQU5fUkVRX1NUUlVDVAkgICBTY2FuUmVxOwotCi0JCQkJaWYgKFJUTVBfVElNRV9BRlRFUihwQWQtPk1sbWUuTm93MzIsIHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArICgxMCAqIE9TX0haKSkpCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTVEFNbG1lUGVyaW9kaWNFeGVjKCk6Q05UTCAtIFNjYW5UYWIuQnNzTnI9PTAsIHN0YXJ0IGEgbmV3IEFDVElWRSBzY2FuIFNTSURbJXNdXG4iLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQpKTsKLQkJCQkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIChQU1RSSU5HKSBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOwotCQkJCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKLQkJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOwotCQkJCQkvLyBSZXNldCBNaXNzZWQgc2NhbiBudW1iZXIKLQkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gcEFkLT5NbG1lLk5vdzMyOwotCQkJCX0KLQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykJLy8gUXVpdCB0aGUgZm9yZXZlciBzY2FuIHdoZW4gaW4gYSB2ZXJ5IGNsZWFuIHJvb20KLQkJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOwotCQkJfQotCQkJZWxzZSBpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCi0JCQl7Ci0JCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDcpID09IDApCi0JCQkJCXsKLQkJCQkJCU1sbWVBdXRvU2NhbihwQWQpOwotCQkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gcEFkLT5NbG1lLk5vdzMyOwotCQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLSNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgotCQkJCQlpZiAocEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPT0gVFJVRSkKLQkJCQkJewotCQkJCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDUpID09IDEpCi0JCQkJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLSNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCi0JCQkJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi1TS0lQX0FVVE9fU0NBTl9DT05OOgotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0gICAgaWYgKChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlRYQkFiaXRtYXAgIT0wKSAmJiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9PSBGQUxTRSkpCi0JewotCQlwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID0gVFJVRTsKLQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9GT1JDRVJUU0NUUywgIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKLQl9Ci0JZWxzZSBpZiAoKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uVFhCQWJpdG1hcCA9PTApICYmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID09IFRSVUUpKQotCXsKLQkJcEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9IEZBTFNFOwotCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsICBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBGQUxTRSk7Ci0JfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0NBTl8yMDQwKSkKLQkJVHJpRXZlbnRDb3VudGVyTWFpbnRlbmFuY2UocEFkKTsKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlyZXR1cm47Ci19Ci0KLS8vIExpbmsgZG93biByZXBvcnQKLVZPSUQgTGlua0Rvd25FeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLQlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7Ci0KLQlpZiAocEFkICE9IE5VTEwpCi0JewotCQlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICBEaXNhc3NvY1JlcTsKLQotCQlpZiAoKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkgJiYKLQkJCShJTkZSQV9PTihwQWQpKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTGlua0Rvd25FeGVjKCk6IGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAuLi5cbiIpKTsKLQkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOwotCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCi0JCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7Ci0KLQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7Ci0JCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotCQkgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKLQkJfQotCX0KLX0KLQotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIE1sbWVBdXRvU2NhbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAotCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gRHJpdmVyIGF1dG8gc2NhblxuIikpOwotCQlNbG1lRW5xdWV1ZShwQWQsCi0JCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotCQkJCQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKLQkJCQkJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuLAotCQkJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQpOwotCQlSVE1QX01MTUVfSEFORExFUihwQWQpOwotCX0KLX0KLQotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIE1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvQ29ubmVjdEJ5QnNzaWQpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEcml2ZXIgYXV0byByZWNvbm5lY3QgdG8gbGFzdCBPSURfODAyXzExX0JTU0lEIHNldHRpbmcgLSAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKLQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5Cc3NpZFswXSwKLQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5Cc3NpZFsxXSwKLQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5Cc3NpZFsyXSwKLQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5Cc3NpZFszXSwKLQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5Cc3NpZFs0XSwKLQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5Cc3NpZFs1XSkpOwotCi0JCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQkJTWxtZUVucXVldWUocEFkLAotCQkJIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotCQkJIE9JRF84MDJfMTFfQlNTSUQsCi0JCQkgTUFDX0FERFJfTEVOLAotCQkJIHBBZC0+TWxtZUF1eC5Cc3NpZCk7Ci0KLQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQotCQlSVE1QX01MTUVfSEFORExFUihwQWQpOwotCX0KLQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAotCWVsc2UgaWYgKChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkgJiYKLQkJKE1sbWVWYWxpZGF0ZVNTSUQocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pID09IFRSVUUpKQotCXsKLQkJTkRJU184MDJfMTFfU1NJRCBPaWRTc2lkOwotCQlPaWRTc2lkLlNzaWRMZW5ndGggPSBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW47Ci0JCU5kaXNNb3ZlTWVtb3J5KE9pZFNzaWQuU3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRyaXZlciBhdXRvIHJlY29ubmVjdCB0byBsYXN0IE9JRF84MDJfMTFfU1NJRCBzZXR0aW5nIC0gJXMsIGxlbiAtICVkXG4iLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbikpOwotCQlNbG1lRW5xdWV1ZShwQWQsCi0JCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotCQkJCQlPSURfODAyXzExX1NTSUQsCi0JCQkJCXNpemVvZihORElTXzgwMl8xMV9TU0lEKSwKLQkJCQkJJk9pZFNzaWQpOwotCQlSVE1QX01MTUVfSEFORExFUihwQWQpOwotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgcm91dGluZSBjaGVja3MgaWYgdGhlcmUncmUgb3RoZXIgQVBzIG91dCB0aGVyZSBjYXBhYmxlIGZvcgotCQlyb2FtaW5nLiBDYWxsZXIgc2hvdWxkIGNhbGwgdGhpcyByb3V0aW5lIG9ubHkgd2hlbiBMaW5rIHVwIGluIElORlJBIG1vZGUKLQkJYW5kIGNoYW5uZWwgcXVhbGl0eSBpcyBiZWxvdyBDUUlfR09PRF9USFJFU0hPTEQuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU91dHB1dDoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE1sbWVDaGVja0ZvclJvYW1pbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUxPTkcJTm93MzIpCi17Ci0JVVNIT1JUCSAgIGk7Ci0JQlNTX1RBQkxFICAqcFJvYW1UYWIgPSAmcEFkLT5NbG1lQXV4LlJvYW1UYWI7Ci0JQlNTX0VOVFJZICAqcEJzczsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lQ2hlY2tGb3JSb2FtaW5nXG4iKSk7Ci0JLy8gcHV0IGFsbCByb2FtaW5nIGNhbmRpZGF0ZXMgaW50byBSb2FtVGFiLCBhbmQgc29ydCBpbiBSU1NJIG9yZGVyCi0JQnNzVGFibGVJbml0KHBSb2FtVGFiKTsKLQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5TY2FuVGFiLkJzc05yOyBpKyspCi0JewotCQlwQnNzID0gJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXTsKLQotCQlpZiAoKHBCc3MtPkxhc3RCZWFjb25SeFRpbWUgKyBwQWQtPlN0YUNmZy5CZWFjb25Mb3N0VGltZSkgPCBOb3czMikKLQkJCWNvbnRpbnVlOwkgLy8gQVAgZGlzYXBwZWFyCi0JCWlmIChwQnNzLT5Sc3NpIDw9IFJTU0lfVEhSRVNIT0xEX0ZPUl9ST0FNSU5HKQotCQkJY29udGludWU7CSAvLyBSU1NJIHRvbyB3ZWFrLiBmb3JnZXQgaXQuCi0JCWlmIChNQUNfQUREUl9FUVVBTChwQnNzLT5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpKQotCQkJY29udGludWU7CSAvLyBza2lwIGN1cnJlbnQgQVAKLQkJaWYgKHBCc3MtPlJzc2kgPCAocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAgKyBSU1NJX0RFTFRBKSkKLQkJCWNvbnRpbnVlOwkgLy8gb25seSBBUCB3aXRoIHN0cm9uZ2VyIFJTU0kgaXMgZWxpZ2libGUgZm9yIHJvYW1pbmcKLQotCQkvLyBBUCBwYXNzaW5nIGFsbCBhYm92ZSBydWxlcyBpcyBwdXQgaW50byByb2FtaW5nIGNhbmRpZGF0ZSB0YWJsZQotCQlOZGlzTW92ZU1lbW9yeSgmcFJvYW1UYWItPkJzc0VudHJ5W3BSb2FtVGFiLT5Cc3NOcl0sIHBCc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKLQkJcFJvYW1UYWItPkJzc05yICs9IDE7Ci0JfQotCi0JaWYgKHBSb2FtVGFiLT5Cc3NOciA+IDApCi0JewotCQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAotCQlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCi0JCXsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCArKzsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gUm9hbWluZyBhdHRlbXB0ICMlbGRcbiIsIHBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCkpOwotCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfUk9BTUlOR19SRVEsIDAsIE5VTEwpOwotCQkJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKLQkJfQotCX0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUNoZWNrRm9yUm9hbWluZygjIG9mIGNhbmRpZGF0ZT0gJWQpXG4iLHBSb2FtVGFiLT5Cc3NOcikpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgcm91dGluZSBjaGVja3MgaWYgdGhlcmUncmUgb3RoZXIgQVBzIG91dCB0aGVyZSBjYXBhYmxlIGZvcgotCQlyb2FtaW5nLiBDYWxsZXIgc2hvdWxkIGNhbGwgdGhpcyByb3V0aW5lIG9ubHkgd2hlbiBsaW5rIHVwIGluIElORlJBIG1vZGUKLQkJYW5kIGNoYW5uZWwgcXVhbGl0eSBpcyBiZWxvdyBDUUlfR09PRF9USFJFU0hPTEQuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU91dHB1dDoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCVVTSE9SVAkJaTsKLQlCU1NfVEFCTEUJKnBSb2FtVGFiID0gJnBBZC0+TWxtZUF1eC5Sb2FtVGFiOwotCUJTU19FTlRSWQkqcEJzczsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZ1xuIikpOwotCS8vIHB1dCBhbGwgcm9hbWluZyBjYW5kaWRhdGVzIGludG8gUm9hbVRhYiwgYW5kIHNvcnQgaW4gUlNTSSBvcmRlcgotCUJzc1RhYmxlSW5pdChwUm9hbVRhYik7Ci0JZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKQotCXsKLQkJcEJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07Ci0KLSAgICAgICAgaWYgKChwQnNzLT5Sc3NpIDw9IC01MCkgJiYgKHBCc3MtPkNoYW5uZWwgPT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCi0JCQljb250aW51ZTsJIC8vIFJTU0kgdG9vIHdlYWsuIGZvcmdldCBpdC4KLQkJaWYgKE1BQ19BRERSX0VRVUFMKHBCc3MtPkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCkpCi0JCQljb250aW51ZTsJIC8vIHNraXAgY3VycmVudCBBUAotCQlpZiAoIVNTSURfRVFVQUwocEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpCi0JCQljb250aW51ZTsJIC8vIHNraXAgZGlmZmVyZW50IFNTSUQKLSAgICAgICAgaWYgKHBCc3MtPlJzc2kgPCAoUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSArIFJTU0lfREVMVEEpKQotCQkJY29udGludWU7CSAvLyBza2lwIEFQIHdpdGhvdXQgYmV0dGVyIFJTU0kKLQotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMYXN0UnNzaTAgPSAlZCwgcEJzcy0+UnNzaSA9ICVkXG4iLCBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpLCBwQnNzLT5Sc3NpKSk7Ci0JCS8vIEFQIHBhc3NpbmcgYWxsIGFib3ZlIHJ1bGVzIGlzIHB1dCBpbnRvIHJvYW1pbmcgY2FuZGlkYXRlIHRhYmxlCi0JCU5kaXNNb3ZlTWVtb3J5KCZwUm9hbVRhYi0+QnNzRW50cnlbcFJvYW1UYWItPkJzc05yXSwgcEJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOwotCQlwUm9hbVRhYi0+QnNzTnIgKz0gMTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcgKEJzc05yPSVkKVxuIiwgcFJvYW1UYWItPkJzc05yKSk7Ci0JaWYgKHBSb2FtVGFiLT5Cc3NOciA+IDApCi0JewotCQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAotCQlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCi0JCXsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCArKzsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gUm9hbWluZyBhdHRlbXB0ICMlbGRcbiIsIHBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCkpOwotCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfUk9BTUlOR19SRVEsIDAsIE5VTEwpOwotCQkJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JfQotCi0JcmV0dXJuIEZBTFNFOwotfQotCi1WT0lEIE1sbWVTZXRUeFJhdGUoCi0JSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKLQlJTiBQUlRNUF9UWF9SQVRFX1NXSVRDSAlwVHhSYXRlKQotewotCVVDSEFSCU1heE1vZGUgPSBNT0RFX09GRE07Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlNYXhNb2RlID0gTU9ERV9IVEdSRUVORklFTEQ7Ci0KLQlpZiAocFR4UmF0ZS0+U1RCQyAmJiAocEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQotCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfVVNFOwotCWVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7Ci0KLQlpZiAocFR4UmF0ZS0+Q3Vyck1DUyA8IE1DU19BVVRPKQotCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTID0gcFR4UmF0ZS0+Q3Vyck1DUzsKLQotCWlmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTID4gNykKLQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7Ci0KLQlpZiAoQURIT0NfT04ocEFkKSkKLQl7Ci0JCS8vIElmIHBlZXIgYWRob2MgaXMgYi1vbmx5IG1vZGUsIHdlIGNhbid0IHNlbmQgMTFnIHJhdGUuCi0JCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOwotCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDCT0gU1RCQ19OT05FOwotCi0JCS8vCi0JCS8vIEZvciBBZGhvYyBNT0RFX0NDSywgZHJpdmVyIHdpbGwgdXNlIEFkaG9jQk9ubHlKb2luZWQgZmxhZyB0byByb2xsIGJhY2sgdG8gQiBvbmx5IGlmIG5lY2Vzc2FyeQotCQkvLwotCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFCT0gcFR4UmF0ZS0+TW9kZTsKLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJOwotCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQotCQkvLyBQYXRjaCBzcGVlZCBlcnJvciBpbiBzdGF0dXMgcGFnZQotCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREU7Ci0JfQotCWVsc2UKLSAgICB7Ci0JCWlmIChwVHhSYXRlLT5Nb2RlIDw9IE1heE1vZGUpCi0JCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gcFR4UmF0ZS0+TW9kZTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgICAgICBpZiAocFR4UmF0ZS0+U2hvcnRHSSAmJiAocEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kpKQotCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV80MDA7Ci0JCWVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCS8vIFJlZXhhbSBlYWNoIGJhbmR3aWR0aCdzIFNHSSBzdXBwb3J0LgotCQlpZiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPT0gR0lfNDAwKQotCQl7Ci0JCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXID09IEJXXzIwKSAmJiAoIUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSkpKQotCQkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOwotCQkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVyA9PSBCV180MCkgJiYgKCFDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpKSkKLQkJCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKLQkJfQotCi0gICAgICAgIC8vIFR1cm4gUlRTL0NUUyByYXRlIHRvIDZNYnBzLgotCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAwKSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyAhPSAwKSkKLQkJewotCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7Ci0JCQlpZiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbikKLQkJCXsKLQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX0ZPUkNFUlRTQ1RTLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDgpICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDgpKQotCQl7Ci0JCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJCWlmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uKQotCQkJewotCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gMCkgJiYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gMCkpCi0JCXsKLQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfUlRTQ1RTXzZNLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOwotCi0JCX0KLQkJZWxzZSBpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyAhPSA4KSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9PSA4KSkKLQkJewotCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9SVFNDVFNfNk0sIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7Ci0JCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkM7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSAgICAgICAgaWYgKChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUR1JFRU5GSUVMRCkgJiYKLSAgICAgICAgICAgIHBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQpCi0gICAgICAgICAgICBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0gICAgfQotCi0gICAgcEFkLT5MYXN0VHhSYXRlID0gKFVTSE9SVCkocEVudHJ5LT5IVFBoeU1vZGUud29yZCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyByb3V0aW5lIGNhbGN1bGF0ZXMgdGhlIGFjdW11bGF0ZWQgVHhQRVIgb2YgZWF4aCBUeFJhdGUuIEFuZAotCQlhY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9uIHJlc3VsdCwgY2hhbmdlIENvbW1vbkNmZy5UeFJhdGUgd2hpY2gKLQkJaXMgdGhlIHN0YWJsZSBUWCBSYXRlIHdlIGV4cGVjdCB0aGUgUmFkaW8gc2l0dWF0aW9uIGNvdWxkIHN1c3RhaW5lZC4KLQotCQlDb21tb25DZmcuVHhSYXRlIHdpbGwgY2hhbmdlIGR5bmFtaWNhbGx5IHdpdGhpbiB7UkFURV8xL1JBVEVfNiwgTWF4VHhSYXRlfQotCU91dHB1dDoKLQkJQ29tbW9uQ2ZnLlR4UmF0ZSAtCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5PVEU6Ci0JCWNhbGwgdGhpcyByb3V0aW5lIGV2ZXJ5IHNlY29uZAotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUNIQVIJCQkJCVVwUmF0ZUlkeCA9IDAsIERvd25SYXRlSWR4ID0gMCwgQ3VyclJhdGVJZHg7Ci0JVUxPTkcJCQkJCWksIEFjY3VUeFRvdGFsQ250ID0gMCwgVHhUb3RhbENudDsKLQlVTE9ORwkJCQkJVHhFcnJvclJhdGlvID0gMDsKLQlCT09MRUFOCQkJCQliVHhSYXRlQ2hhbmdlZCA9IEZBTFNFLCBiVXBncmFkZVF1YWxpdHkgPSBGQUxTRTsKLQlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGUgPSBOVUxMOwotCVBVQ0hBUgkJCQkJcFRhYmxlOwotCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOwotCVVDSEFSCQkJCQlJbml0VHhSYXRlSWR4ID0gMCwgVHJhaW5VcCwgVHJhaW5Eb3duOwotCUNIQVIJCQkJCVJzc2ksIFJzc2lPZmZzZXQgPSAwOwotCVRYX1NUQV9DTlQxX1NUUlVDCQlTdGFUeDE7Ci0JVFhfU1RBX0NOVDBfU1RSVUMJCVR4U3RhQ250MDsKLQlVTE9ORwkJCQkJVHhSZXRyYW5zbWl0ID0gMCwgVHhTdWNjZXNzID0gMCwgVHhGYWlsQ291bnQgPSAwOwotCU1BQ19UQUJMRV9FTlRSWQkJCSpwRW50cnk7Ci0JUlNTSV9TQU1QTEUJCQkJKnBSc3NpID0gJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGU7Ci0KLSNpZmRlZiBSQUxJTktfQVRFCi0JaWYgKEFURV9PTihwQWQpKQotCXsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQkvLwotCS8vIHdhbGsgdGhyb3VnaCBNQUMgdGFibGUsIHNlZSBpZiBuZWVkIHRvIGNoYW5nZSBBUCdzIFRYIHJhdGUgdG93YXJkIGVhY2ggZW50cnkKLQkvLwotCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCXsKLQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07Ci0KLQkvLyBjaGVjayBpZiB0aGlzIGVudHJ5IG5lZWQgdG8gc3dpdGNoIHJhdGUgYXV0b21hdGljYWxseQotCQlpZiAoUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaChwQWQsIHBFbnRyeSkgPT0gRkFMU0UpCi0JCQljb250aW51ZTsKLQotCQlpZiAoKHBBZC0+TWFjVGFiLlNpemUgPT0gMSkgfHwgKHBFbnRyeS0+VmFsaWRBc0RscykpCi0JCXsKLQkJCVJzc2kgPSBSVE1QTWF4UnNzaShwQWQsCi0JCQkJCQkJICAgcFJzc2ktPkF2Z1Jzc2kwLAotCQkJCQkJCSAgIHBSc3NpLT5BdmdSc3NpMSwKLQkJCQkJCQkgICBwUnNzaS0+QXZnUnNzaTIpOwotCi0JCQkvLyBVcGRhdGUgc3RhdGlzdGljIGNvdW50ZXIKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDAsICZUeFN0YUNudDAud29yZCk7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmU3RhVHgxLndvcmQpOwotCQkJcEFkLT5iVXBkYXRlQmNuQ250RG9uZSA9IFRSVUU7Ci0JCQlUeFJldHJhbnNtaXQgPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OwotCQkJVHhTdWNjZXNzID0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQkJCVR4RmFpbENvdW50ID0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwotCQkJVHhUb3RhbENudCA9IFR4UmV0cmFuc21pdCArIFR4U3VjY2VzcyArIFR4RmFpbENvdW50OwotCi0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwotCQkJcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOwotCQkJcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKLQkJCXBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LnUuTG93UGFydCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7Ci0KLQkJCS8vIGlmIG5vIHRyYWZmaWMgaW4gdGhlIHBhc3QgMS1zZWMgcGVyaW9kLCBkb24ndCBjaGFuZ2UgVFggcmF0ZSwKLQkJCS8vIGJ1dCBjbGVhciBhbGwgYmFkIGhpc3RvcnkuIGJlY2F1c2UgdGhlIGJhZCBoaXN0b3J5IG1heSBhZmZlY3QgdGhlIG5leHQKLQkJCS8vIENoYXJpb3QgdGhyb3VnaHB1dCB0ZXN0Ci0JCQlBY2N1VHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCi0JCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCi0JCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKLQotCQkJaWYgKFR4VG90YWxDbnQpCi0JCQkJVHhFcnJvclJhdGlvID0gKChUeFJldHJhbnNtaXQgKyBUeEZhaWxDb3VudCkgKiAxMDApIC8gVHhUb3RhbENudDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChJTkZSQV9PTihwQWQpICYmIChpID09IDEpKQotCQkJCVJzc2kgPSBSVE1QTWF4UnNzaShwQWQsCi0JCQkJCQkJCSAgIHBSc3NpLT5BdmdSc3NpMCwKLQkJCQkJCQkJICAgcFJzc2ktPkF2Z1Jzc2kxLAotCQkJCQkJCQkgICBwUnNzaS0+QXZnUnNzaTIpOwotCQkJZWxzZQotCQkJCVJzc2kgPSBSVE1QTWF4UnNzaShwQWQsCi0JCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCwKLQkJCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLAotCQkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTIpOwotCi0JCQlUeFRvdGFsQ250ID0gcEVudHJ5LT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKLQkJCQkgcEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArCi0JCQkJIHBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQ7Ci0KLQkJCWlmIChUeFRvdGFsQ250KQotCQkJCVR4RXJyb3JSYXRpbyA9ICgocEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArIHBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQpICogMTAwKSAvIFR4VG90YWxDbnQ7Ci0JCX0KLQotCQlpZiAoVHhUb3RhbENudCkKLQkJewotCQkJLyoKLQkJCQlUaHJlZSBBZEhvYyBjb25uZWN0aW9ucyBjYW4gbm90IHdvcmsgbm9ybWFsbHkgaWYgb25lIEFkSG9jIGNvbm5lY3Rpb24gaXMgZGlzYXBwZWFyZWQgZnJvbSBhIGhlYXZ5IHRyYWZmaWMgZW52aXJvbm1lbnQgZ2VuZXJhdGVkIGJ5IHBpbmcgdG9vbAotCQkJCVdlIGZvcmNlIHRvIHNldCBMb25nUnR5TGltaXQgYW5kIFNob3J0UnR5TGltaXQgdG8gMCB0byBzdG9wIHJldHJhbnNtaXR0aW5nIHBhY2tldCwgYWZ0ZXIgYSB3aGlsZSwgcmVzb3Jpbmcgb3JpZ2luYWwgc2V0dGluZ3MKLQkJCSovCi0JCQlpZiAoVHhFcnJvclJhdGlvID09IDEwMCkKLQkJCXsKLQkJCQlUWF9SVFlfQ0ZHX1NUUlVDCVR4UnR5Q2ZnLFR4UnR5Q2ZndG1wOwotCQkJCVVMT05HCUluZGV4OwotCQkJCVVMT05HCU1BQ1ZhbHVlOwotCi0JCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9SVFlfQ0ZHLCAmVHhSdHlDZmcud29yZCk7Ci0JCQkJVHhSdHlDZmd0bXAud29yZCA9IFR4UnR5Q2ZnLndvcmQ7Ci0JCQkJVHhSdHlDZmcuZmllbGQuTG9uZ1J0eUxpbWl0ID0gMHgwOwotCQkJCVR4UnR5Q2ZnLmZpZWxkLlNob3J0UnR5TGltaXQgPSAweDA7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUlRZX0NGRywgVHhSdHlDZmcud29yZCk7Ci0KLQkJCQlSVE1QdXNlY0RlbGF5KDEpOwotCi0JCQkJSW5kZXggPSAwOwotCQkJCU1BQ1ZhbHVlID0gMDsKLQkJCQlkbwotCQkJCXsKLQkJCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWFJYUV9QQ05ULCAmTUFDVmFsdWUpOwotCQkJCQlpZiAoKE1BQ1ZhbHVlICYgMHhmZmZmZmYpID09IDApCi0JCQkJCQlicmVhazsKLQkJCQkJSW5kZXgrKzsKLQkJCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJCQl9d2hpbGUoKEluZGV4IDwgMzMwKSYmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpKTsKLQotCQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfUlRZX0NGRywgJlR4UnR5Q2ZnLndvcmQpOwotCQkJCVR4UnR5Q2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCA9IFR4UnR5Q2ZndG1wLmZpZWxkLkxvbmdSdHlMaW1pdDsKLQkJCQlUeFJ0eUNmZy5maWVsZC5TaG9ydFJ0eUxpbWl0ID0gVHhSdHlDZmd0bXAuZmllbGQuU2hvcnRSdHlMaW1pdDsKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFlfQ0ZHLCBUeFJ0eUNmZy53b3JkKTsKLQkJCX0KLQkJfQotCi0JCUN1cnJSYXRlSWR4ID0gcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXg7Ci0KLQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmSW5pdFR4UmF0ZUlkeCk7Ci0KLQkJaWYgKEN1cnJSYXRlSWR4ID49IFRhYmxlU2l6ZSkKLQkJewotCQkJQ3VyclJhdGVJZHggPSBUYWJsZVNpemUgLSAxOwotCQl9Ci0KLQkJLy8gV2hlbiBzd2l0Y2ggZnJvbSBGaXhlZCByYXRlIC0+IGF1dG8gcmF0ZSwgdGhlIFJFQUwgVFggcmF0ZSBtaWdodCBiZSBkaWZmZXJlbnQgZnJvbSBwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleC4KLQkJLy8gU28gbmVlZCB0byBzeW5jIGhlcmUuCi0JCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhDdXJyUmF0ZUlkeCsxKSo1XTsKLQkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gcEN1cnJUeFJhdGUtPkN1cnJNQ1MpCi0JCQkvLyYmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQotCQkJKQotCQl7Ci0KLQkJCS8vIE5lZWQgdG8gc3luYyBSZWFsIFR4IHJhdGUgYW5kIG91ciByZWNvcmQuCi0JCQkvLyBUaGVuIHJldHVybiBmb3IgbmV4dCBEUlMuCi0JCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoSW5pdFR4UmF0ZUlkeCsxKSo1XTsKLQkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gSW5pdFR4UmF0ZUlkeDsKLQkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBDdXJyVHhSYXRlKTsKLQotCQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCi0JCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvLyBkZWNpZGUgdGhlIG5leHQgdXBncmFkZSByYXRlIGFuZCBkb3duZ3JhZGUgcmF0ZSwgaWYgYW55Ci0JCWlmICgoQ3VyclJhdGVJZHggPiAwKSAmJiAoQ3VyclJhdGVJZHggPCAoVGFibGVTaXplIC0gMSkpKQotCQl7Ci0JCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7Ci0JCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0xOwotCQl9Ci0JCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IDApCi0JCXsKLQkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4ICsgMTsKLQkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHg7Ci0JCX0KLQkJZWxzZSBpZiAoQ3VyclJhdGVJZHggPT0gKFRhYmxlU2l6ZSAtIDEpKQotCQl7Ci0JCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeDsKLQkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHggLSAxOwotCQl9Ci0KLQkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKEN1cnJSYXRlSWR4KzEpKjVdOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWlmICgoUnNzaSA+IC02NSkgJiYgKHBDdXJyVHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpKQotCQl7Ci0JCQlUcmFpblVwCQk9IChwQ3VyclR4UmF0ZS0+VHJhaW5VcCArIChwQ3VyclR4UmF0ZS0+VHJhaW5VcCA+PiAxKSk7Ci0JCQlUcmFpbkRvd24JPSAocEN1cnJUeFJhdGUtPlRyYWluRG93biArIChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duID4+IDEpKTsKLQkJfQotCQllbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCXsKLQkJCVRyYWluVXAJCT0gcEN1cnJUeFJhdGUtPlRyYWluVXA7Ci0JCQlUcmFpbkRvd24JPSBwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duOwotCQl9Ci0KLQkJLy9wQWQtPkRyc0NvdW50ZXJzLkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID0gcEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOwotCi0JCS8vCi0JCS8vIEtlZXAgdGhlIGxhc3QgdGltZSBUeFJhdGVDaGFuZ2VBY3Rpb24gc3RhdHVzLgotCQkvLwotCQlwRW50cnktPkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID0gcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOwotCi0KLQotCQkvLwotCQkvLyBDQVNFIDEuIHdoZW4gVFggc2FtcGxlcyBhcmUgZmV3ZXIgdGhhbiAxNSwgdGhlbiBkZWNpZGUgVFggcmF0ZSBzb2xlbHkgb24gUlNTSQotCQkvLyAgICAgICAgIChjcml0ZXJpYSBjb3BpZWQgZnJvbSBSVDI1MDAgZm9yIE5ldG9waWEgY2FzZSkKLQkJLy8KLQkJaWYgKFR4VG90YWxDbnQgPD0gMTUpCi0JCXsKLQkJCUNIQVIJaWR4ID0gMDsKLQkJCVVDSEFSCVR4UmF0ZUlkeDsKLQkJCVVDSEFSCU1DUzAgPSAwLCBNQ1MxID0gMCwgTUNTMiA9IDAsIE1DUzMgPSAwLCBNQ1M0ID0gMCwgIE1DUzUgPTAsIE1DUzYgPSAwLCBNQ1M3ID0gMDsKLQkgICAgICAgIFVDSEFSCU1DUzEyID0gMCwgTUNTMTMgPSAwLCBNQ1MxNCA9IDAsIE1DUzE1ID0gMDsKLQkJCVVDSEFSCU1DUzIwID0gMCwgTUNTMjEgPSAwLCBNQ1MyMiA9IDAsIE1DUzIzID0gMDsgLy8gMyozCi0KLQkJCS8vIGNoZWNrIHRoZSBleGlzdGVuY2UgYW5kIGluZGV4IG9mIGVhY2ggbmVlZGVkIE1DUwotCQkJd2hpbGUgKGlkeCA8IHBUYWJsZVswXSkKLQkJCXsKLQkJCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoaWR4KzEpKjVdOwotCi0JCQkJaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18wKQotCQkJCXsKLQkJCQkJTUNTMCA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzEpCi0JCQkJewotCQkJCQlNQ1MxID0gaWR4OwotCQkJCX0KLQkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMikKLQkJCQl7Ci0JCQkJCU1DUzIgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18zKQotCQkJCXsKLQkJCQkJTUNTMyA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzQpCi0JCQkJewotCQkJCQlNQ1M0ID0gaWR4OwotCQkJCX0KLQkgICAgICAgICAgICBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNSkKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgIE1DUzUgPSBpZHg7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU182KQotCSAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgTUNTNiA9IGlkeDsKLQkgICAgICAgICAgICB9Ci0JCQkJLy9lbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNykKLQkJCQllbHNlIGlmICgocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzcpICYmIChwQ3VyclR4UmF0ZS0+U2hvcnRHSSA9PSBHSV84MDApKQkvLyBwcmV2ZW50IHRoZSBoaWdoZXN0IE1DUyB1c2luZyBzaG9ydCBHSSB3aGVuIDFUIGFuZCBsb3cgdGhyb3VnaHB1dAotCQkJCXsKLQkJCQkJTUNTNyA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzEyKQotCQkJCXsKLQkJCQkJTUNTMTIgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xMykKLQkJCQl7Ci0JCQkJCU1DUzEzID0gaWR4OwotCQkJCX0KLQkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTQpCi0JCQkJewotCQkJCQlNQ1MxNCA9IGlkeDsKLQkJCQl9Ci0JCQkJLy9lbHNlIGlmICgocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzE1KS8qICYmIChwQ3VyclR4UmF0ZS0+U2hvcnRHSSA9PSBHSV84MDApKi8pCS8vd2UgaG9wZSB0byB1c2UgU2hvcnRHSSBhcyBpbml0aWFsIHJhdGUKLQkJCQllbHNlIGlmICgocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzE1KSAmJiAocEN1cnJUeFJhdGUtPlNob3J0R0kgPT0gR0lfODAwKSkJLy93ZSBob3BlIHRvIHVzZSBTaG9ydEdJIGFzIGluaXRpYWwgcmF0ZSwgaG93ZXZlciBBdGhlcm9zJ3MgY2hpcCBoYXMgYnVncyB3aGVuIHNob3J0IEdJCi0JCQkJewotCQkJCQlNQ1MxNSA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIwKSAvLyAzKjMKLQkJCQl7Ci0JCQkJCU1DUzIwID0gaWR4OwotCQkJCX0KLQkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjEpCi0JCQkJewotCQkJCQlNQ1MyMSA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIyKQotCQkJCXsKLQkJCQkJTUNTMjIgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMykKLQkJCQl7Ci0JCQkJCU1DUzIzID0gaWR4OwotCQkJCX0KLQkJCQlpZHggKys7Ci0JCQl9Ci0KLQkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCi0JCQl7Ci0JCQkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcpCi0JCQkJewotCQkJCQlSc3NpT2Zmc2V0ID0gMjsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJUnNzaU9mZnNldCA9IDU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JBKQotCQkJCXsKLQkJCQkJUnNzaU9mZnNldCA9IDU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVJzc2lPZmZzZXQgPSA4OwotCQkJCX0KLQkJCX0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCS8qaWYgKE1DUzE1KSovCi0JCQlpZiAoKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjNTKSB8fAotCQkJCShwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOM1MpIHx8Ci0JCQkJKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUpKQotCQkJey8vIE4gbW9kZSB3aXRoIDMgc3RyZWFtIC8vIDMqMwotCQkJCWlmIChNQ1MyMyAmJiAoUnNzaSA+PSAtNzApKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MyMzsKLQkJCQllbHNlIGlmIChNQ1MyMiAmJiAoUnNzaSA+PSAtNzIpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MyMjsKLQkJICAgIGVsc2UgaWYgKE1DUzIxICYmIChSc3NpID49IC03NikpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzIxOwotCQkJCWVsc2UgaWYgKE1DUzIwICYmIChSc3NpID49IC03OCkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzIwOwotCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+PSAtODIpKQotCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7Ci0JCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID49IC04NCkpCi0JCQkJVHhSYXRlSWR4ID0gTUNTMzsKLQkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPj0gLTg2KSkKLQkJCQlUeFJhdGVJZHggPSBNQ1MyOwotCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+PSAtODgpKQotCQkJCVR4UmF0ZUlkeCA9IE1DUzE7Ci0JCQllbHNlCi0JCQkJVHhSYXRlSWR4ID0gTUNTMDsKLQkJfQotLy8JCWVsc2UgaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmQpIHx8KHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4yUykgfHwocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQpIHx8IChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlKSkKLQkJZWxzZSBpZiAoKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZCkgfHwocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTKSB8fChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZCkpIC8vIDMqMwotCQkJey8vIE4gbW9kZSB3aXRoIDIgc3RyZWFtCi0JCQkJaWYgKE1DUzE1ICYmIChSc3NpID49ICgtNzArUnNzaU9mZnNldCkpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MxNTsKLQkJCQllbHNlIGlmIChNQ1MxNCAmJiAoUnNzaSA+PSAoLTcyK1Jzc2lPZmZzZXQpKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMTQ7Ci0JCQkJZWxzZSBpZiAoTUNTMTMgJiYgKFJzc2kgPj0gKC03NitSc3NpT2Zmc2V0KSkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzEzOwotCQkJCWVsc2UgaWYgKE1DUzEyICYmIChSc3NpID49ICgtNzgrUnNzaU9mZnNldCkpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MxMjsKLQkJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID49ICgtODIrUnNzaU9mZnNldCkpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1M0OwotCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPj0gKC04NCtSc3NpT2Zmc2V0KSkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzM7Ci0JCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+PSAoLTg2K1Jzc2lPZmZzZXQpKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMjsKLQkJCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID49ICgtODgrUnNzaU9mZnNldCkpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MxOwotCQkJCWVsc2UKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMDsKLQkJCX0KLQkJCWVsc2UgaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04xUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4xUykpCi0JCQl7Ly8gTiBtb2RlIHdpdGggMSBzdHJlYW0KLQkJCQlpZiAoTUNTNyAmJiAoUnNzaSA+ICgtNzIrUnNzaU9mZnNldCkpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1M3OwotCQkJCWVsc2UgaWYgKE1DUzYgJiYgKFJzc2kgPiAoLTc0K1Jzc2lPZmZzZXQpKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTNjsKLQkJCQllbHNlIGlmIChNQ1M1ICYmIChSc3NpID4gKC03NytSc3NpT2Zmc2V0KSkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzU7Ci0JCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+ICgtNzkrUnNzaU9mZnNldCkpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1M0OwotCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPiAoLTgxK1Jzc2lPZmZzZXQpKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMzsKLQkJCQllbHNlIGlmIChNQ1MyICYmIChSc3NpID4gKC04MytSc3NpT2Zmc2V0KSkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzI7Ci0JCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+ICgtODYrUnNzaU9mZnNldCkpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MxOwotCQkJCWVsc2UKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMDsKLQkJCX0KLQkJCWVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCXsvLyBMZWdhY3kgbW9kZQotCQkJCWlmIChNQ1M3ICYmIChSc3NpID4gLTcwKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTNzsKLQkJCQllbHNlIGlmIChNQ1M2ICYmIChSc3NpID4gLTc0KSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTNjsKLQkJCQllbHNlIGlmIChNQ1M1ICYmIChSc3NpID4gLTc4KSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTNTsKLQkJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID4gLTgyKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTNDsKLQkJCQllbHNlIGlmIChNQ1M0ID09IDApCS8vIGZvciBCLW9ubHkgbW9kZQotCQkJCQlUeFJhdGVJZHggPSBNQ1MzOwotCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPiAtODUpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MzOwotCQkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPiAtODcpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MyOwotCQkJCWVsc2UgaWYgKE1DUzEgJiYgKFJzc2kgPiAtOTApKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MxOwotCQkJCWVsc2UKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMDsKLQkJCX0KLQotCS8vCQlpZiAoVHhSYXRlSWR4ICE9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KQotCQkJewotCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gVHhSYXRlSWR4OwotCQkJCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhwRW50cnktPkN1cnJUeFJhdGVJbmRleCsxKSo1XTsKLQkJCQlNbG1lU2V0VHhSYXRlKHBBZCwgcEVudHJ5LCBwTmV4dFR4UmF0ZSk7Ci0JCQl9Ci0KLQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+VHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKLQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+UEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwotCQkJcEVudHJ5LT5mTGFzdFNlY0FjY29yZGluZ1JTU0kgPSBUUlVFOwotCQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCi0JCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOwotCi0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChwRW50cnktPmZMYXN0U2VjQWNjb3JkaW5nUlNTSSA9PSBUUlVFKQotCQl7Ci0JCQlwRW50cnktPmZMYXN0U2VjQWNjb3JkaW5nUlNTSSA9IEZBTFNFOwotCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMDsKLQkJCS8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycwotCQkJUkVTRVRfT05FX1NFQ19UWF9DTlQocEVudHJ5KTsKLQotCQkJY29udGludWU7Ci0JCX0KLQotCQlkbwotCQl7Ci0JCQlCT09MRUFOCWJUcmFpblVwRG93biA9IEZBTFNFOwotCi0JCQlwRW50cnktPkN1cnJUeFJhdGVTdGFibGVUaW1lICsrOwotCi0JCQkvLyBkb3duZ3JhZGUgVFggcXVhbGl0eSBpZiBQRVIgPj0gUmF0ZS1Eb3duIHRocmVzaG9sZAotCQkJaWYgKFR4RXJyb3JSYXRpbyA+PSBUcmFpbkRvd24pCi0JCQl7Ci0JCQkJYlRyYWluVXBEb3duID0gVFJVRTsKLQkJCQlwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKLQkJCX0KLQkJCS8vIHVwZ3JhZGUgVFggcXVhbGl0eSBpZiBQRVIgPD0gUmF0ZS1VcCB0aHJlc2hvbGQKLQkJCWVsc2UgaWYgKFR4RXJyb3JSYXRpbyA8PSBUcmFpblVwKQotCQkJewotCQkJCWJUcmFpblVwRG93biA9IFRSVUU7Ci0JCQkJYlVwZ3JhZGVRdWFsaXR5ID0gVFJVRTsKLQkJCQlpZiAocEVudHJ5LT5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdKQotCQkJCQlwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gLS07ICAvLyBxdWFsaXR5IHZlcnkgZ29vZCBpbiBDdXJyUmF0ZQotCi0JCQkJaWYgKHBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5KQotCQkJCQlwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSAtLTsKLQkJCQllbHNlIGlmIChwRW50cnktPlR4UXVhbGl0eVtVcFJhdGVJZHhdKQotCQkJCQlwRW50cnktPlR4UXVhbGl0eVtVcFJhdGVJZHhdIC0tOyAgICAvLyBtYXkgaW1wcm92ZSBuZXh0IFVQIHJhdGUncyBxdWFsaXR5Ci0JCQl9Ci0KLQkJCXBFbnRyeS0+UEVSW0N1cnJSYXRlSWR4XSA9IChVQ0hBUilUeEVycm9yUmF0aW87Ci0KLQkJCWlmIChiVHJhaW5VcERvd24pCi0JCQl7Ci0JCQkJLy8gcGVyZm9ybSBEUlMgLSBjb25zaWRlciBUeFJhdGUgRG93biBmaXJzdCwgdGhlbiByYXRlIHVwLgotCQkJCWlmICgoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpICYmIChwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPj0gRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQpKQotCQkJCXsKLQkJCQkJcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPSBEb3duUmF0ZUlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKEN1cnJSYXRlSWR4ICE9IFVwUmF0ZUlkeCkgJiYgKHBFbnRyeS0+VHhRdWFsaXR5W1VwUmF0ZUlkeF0gPD0gMCkpCi0JCQkJewotCQkJCQlwRW50cnktPkN1cnJUeFJhdGVJbmRleCA9IFVwUmF0ZUlkeDsKLQkJCQl9Ci0JCQl9Ci0JCX0gd2hpbGUgKEZBTFNFKTsKLQotCQkvLyBpZiByYXRlLXVwIGhhcHBlbiwgY2xlYXIgYWxsIGJhZCBoaXN0b3J5IG9mIGFsbCBUWCByYXRlcwotCQlpZiAocEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPiBDdXJyUmF0ZUlkeCkKLQkJewotCQkJcEVudHJ5LT5DdXJyVHhSYXRlU3RhYmxlVGltZSA9IDA7Ci0JCQlwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSA9IDA7Ci0JCQlwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPSAxOyAvLyByYXRlIFVQCi0JCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlR4UXVhbGl0eSwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7Ci0JCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlBFUiwgc2l6ZW9mKFVDSEFSKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKLQotCQkJLy8KLQkJCS8vIEZvciBUeFJhdGUgZmFzdCB0cmFpbiB1cAotCQkJLy8KLQkJCWlmICghcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nKQotCQkJewotCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIDEwMCk7Ci0KLQkJCQlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBUUlVFOwotCQkJfQotCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOwotCQl9Ci0JCS8vIGlmIHJhdGUtZG93biBoYXBwZW4sIG9ubHkgY2xlYXIgRG93blJhdGUncyBiYWQgaGlzdG9yeQotCQllbHNlIGlmIChwRW50cnktPkN1cnJUeFJhdGVJbmRleCA8IEN1cnJSYXRlSWR4KQotCQl7Ci0JCQlwRW50cnktPkN1cnJUeFJhdGVTdGFibGVUaW1lID0gMDsKLQkJCXBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5ID0gMDsgICAgICAgICAgIC8vIG5vIHBlbmFsdHkKLQkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDI7IC8vIHJhdGUgRE9XTgotCQkJcEVudHJ5LT5UeFF1YWxpdHlbcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXhdID0gMDsKLQkJCXBFbnRyeS0+UEVSW3BFbnRyeS0+Q3VyclR4UmF0ZUluZGV4XSA9IDA7Ci0KLQkJCS8vCi0JCQkvLyBGb3IgVHhSYXRlIGZhc3QgdHJhaW4gZG93bgotCQkJLy8KLQkJCWlmICghcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nKQotCQkJewotCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIDEwMCk7Ci0KLQkJCQlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBUUlVFOwotCQkJfQotCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMDsgLy8gcmF0ZSBubyBjaGFuZ2UKLQkJCWJUeFJhdGVDaGFuZ2VkID0gRkFMU0U7Ci0JCX0KLQotCQlwRW50cnktPkxhc3RUeE9rQ291bnQgPSBUeFN1Y2Nlc3M7Ci0KLQkJewotCQkJVUNIQVIgdG1wVHhSYXRlOwotCi0JCQkvLyB0byBmaXggdGNwIGFjayBpc3N1ZQotCQkJaWYgKCFiVHhSYXRlQ2hhbmdlZCAmJiAocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSZWNlaXZlZEJ5dGVDb3VudCA+IChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50ICogNSkpKQotCQkJewotCQkJCXRtcFR4UmF0ZSA9IERvd25SYXRlSWR4OwotCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkRSUzogUngoJWQpIGlzIDUgdGltZXMgbGFyZ2VyIHRoYW4gVHgoJWQpLCB1c2UgbG93IHJhdGUgKGN1cnI9JWQsIHRtcD0lZClcbiIsCi0JCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUmVjZWl2ZWRCeXRlQ291bnQsIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHJhbnNtaXR0ZWRCeXRlQ291bnQsIHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4LCB0bXBUeFJhdGUpKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQl0bXBUeFJhdGUgPSBwRW50cnktPkN1cnJUeFJhdGVJbmRleDsKLQkJCX0KLQotCQkJcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKHRtcFR4UmF0ZSsxKSo1XTsKLQkJCWlmIChiVHhSYXRlQ2hhbmdlZCAmJiBwTmV4dFR4UmF0ZSkKLQkJCXsKLQkJCQlNbG1lU2V0VHhSYXRlKHBBZCwgcEVudHJ5LCBwTmV4dFR4UmF0ZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCi0JCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVN0YXRpb24gc2lkZSwgQXV0byBUeFJhdGUgZmFzdGVyIHRyYWluIHVwIHRpbWVyIGNhbGwgYmFjayBmdW5jdGlvbi4KLQotCUFyZ3VtZW50czoKLQkJU3lzdGVtU3BlY2lmaWMxCQkJLSBOb3QgdXNlZC4KLQkJRnVuY3Rpb25Db250ZXh0CQkJLSBQb2ludGVyIHRvIG91ciBBZGFwdGVyIGNvbnRleHQuCi0JCVN5c3RlbVNwZWNpZmljMgkJCS0gTm90IHVzZWQuCi0JCVN5c3RlbVNwZWNpZmljMwkJCS0gTm90IHVzZWQuCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JUFJUTVBfQURBUFRFUgkJCXBBZCA9IChQUlRNUF9BREFQVEVSKUZ1bmN0aW9uQ29udGV4dDsKLQlVQ0hBUgkJCQkJVXBSYXRlSWR4ID0gMCwgRG93blJhdGVJZHggPSAwLCBDdXJyUmF0ZUlkeCA9IDA7Ci0JVUxPTkcJCQkJCVR4VG90YWxDbnQ7Ci0JVUxPTkcJCQkJCVR4RXJyb3JSYXRpbyA9IDA7Ci0JQk9PTEVBTgkJCQkJYlR4UmF0ZUNoYW5nZWQ7IC8vLCBiVXBncmFkZVF1YWxpdHkgPSBGQUxTRTsKLQlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGUgPSBOVUxMOwotCVBVQ0hBUgkJCQkJcFRhYmxlOwotCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOwotCVVDSEFSCQkJCQlJbml0VHhSYXRlSWR4ID0gMCwgVHJhaW5VcCwgVHJhaW5Eb3duOwotCVRYX1NUQV9DTlQxX1NUUlVDCQlTdGFUeDE7Ci0JVFhfU1RBX0NOVDBfU1RSVUMJCVR4U3RhQ250MDsKLQlDSEFSCQkJCQlSc3NpLCByYXRpbzsKLQlVTE9ORwkJCQkJVHhSZXRyYW5zbWl0ID0gMCwgVHhTdWNjZXNzID0gMCwgVHhGYWlsQ291bnQgPSAwOwotCU1BQ19UQUJMRV9FTlRSWQkJCSpwRW50cnk7Ci0JVUxPTkcJCQkJCWk7Ci0KLQlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLQotICAgIC8vCi0gICAgLy8gd2FsayB0aHJvdWdoIE1BQyB0YWJsZSwgc2VlIGlmIG5lZWQgdG8gY2hhbmdlIEFQJ3MgVFggcmF0ZSB0b3dhcmQgZWFjaCBlbnRyeQotICAgIC8vCi0JZm9yIChpID0gMTsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCi0JewotCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKLQotCQkvLyBjaGVjayBpZiB0aGlzIGVudHJ5IG5lZWQgdG8gc3dpdGNoIHJhdGUgYXV0b21hdGljYWxseQotCQlpZiAoUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaChwQWQsIHBFbnRyeSkgPT0gRkFMU0UpCi0JCQljb250aW51ZTsKLQotCQlpZiAoSU5GUkFfT04ocEFkKSAmJiAoaSA9PSAxKSkKLQkJCVJzc2kgPSBSVE1QTWF4UnNzaShwQWQsCi0JCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCwKLQkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLAotCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIpOwotCQllbHNlCi0JCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAotCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCwKLQkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEsCi0JCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKLQotCUN1cnJSYXRlSWR4ID0gcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXg7Ci0KLQkJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJkluaXRUeFJhdGVJZHgpOwotCi0JLy8gZGVjaWRlIHRoZSBuZXh0IHVwZ3JhZGUgcmF0ZSBhbmQgZG93bmdyYWRlIHJhdGUsIGlmIGFueQotCWlmICgoQ3VyclJhdGVJZHggPiAwKSAmJiAoQ3VyclJhdGVJZHggPCAoVGFibGVTaXplIC0gMSkpKQotCXsKLQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHggKyAxOwotCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0xOwotCX0KLQllbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAwKQotCXsKLQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHggKyAxOwotCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4OwotCX0KLQllbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAoVGFibGVTaXplIC0gMSkpCi0JewotCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeDsKLQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtIDE7Ci0JfQotCi0JcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKEN1cnJSYXRlSWR4KzEpKjVdOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JaWYgKChSc3NpID4gLTY1KSAmJiAocEN1cnJUeFJhdGUtPk1vZGUgPj0gTU9ERV9IVE1JWCkpCi0JewotCQlUcmFpblVwCQk9IChwQ3VyclR4UmF0ZS0+VHJhaW5VcCArIChwQ3VyclR4UmF0ZS0+VHJhaW5VcCA+PiAxKSk7Ci0JCVRyYWluRG93bgk9IChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duICsgKHBDdXJyVHhSYXRlLT5UcmFpbkRvd24gPj4gMSkpOwotCX0KLQllbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JewotCQlUcmFpblVwCQk9IHBDdXJyVHhSYXRlLT5UcmFpblVwOwotCQlUcmFpbkRvd24JPSBwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duOwotCX0KLQotCQlpZiAocEFkLT5NYWNUYWIuU2l6ZSA9PSAxKQotCQl7Ci0JLy8gVXBkYXRlIHN0YXRpc3RpYyBjb3VudGVyCi0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJlR4U3RhQ250MC53b3JkKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmU3RhVHgxLndvcmQpOwotCi0JVHhSZXRyYW5zbWl0ID0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKLQlUeFN1Y2Nlc3MgPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOwotCVR4RmFpbENvdW50ID0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwotCVR4VG90YWxDbnQgPSBUeFJldHJhbnNtaXQgKyBUeFN1Y2Nlc3MgKyBUeEZhaWxDb3VudDsKLQotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKLQkJCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQkJCXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7Ci0JCQlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwotCi0JaWYgKFR4VG90YWxDbnQpCi0JCVR4RXJyb3JSYXRpbyA9ICgoVHhSZXRyYW5zbWl0ICsgVHhGYWlsQ291bnQpICogMTAwKSAvIFR4VG90YWxDbnQ7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlUeFRvdGFsQ250ID0gcEVudHJ5LT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKLQkJCQkgcEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArCi0JCQkJIHBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQ7Ci0KLQkJCWlmIChUeFRvdGFsQ250KQotCQkJCVR4RXJyb3JSYXRpbyA9ICgocEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArIHBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQpICogMTAwKSAvIFR4VG90YWxDbnQ7Ci0JCX0KLQotCi0JLy8KLQkvLyBDQVNFIDEuIHdoZW4gVFggc2FtcGxlcyBhcmUgZmV3ZXIgdGhhbiAxNSwgdGhlbiBkZWNpZGUgVFggcmF0ZSBzb2xlbHkgb24gUlNTSQotCS8vICAgICAgICAgKGNyaXRlcmlhIGNvcGllZCBmcm9tIFJUMjUwMCBmb3IgTmV0b3BpYSBjYXNlKQotCS8vCi0JaWYgKFR4VG90YWxDbnQgPD0gMTIpCi0JewotCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eSwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7Ci0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuUEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwotCi0JCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09IDEpICYmIChDdXJyUmF0ZUlkeCAhPSBEb3duUmF0ZUlkeCkpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gRG93blJhdGVJZHg7Ci0JCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKLQkJfQotCQllbHNlIGlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09IDIpICYmIChDdXJyUmF0ZUlkeCAhPSBVcFJhdGVJZHgpKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IFVwUmF0ZUlkeDsKLQkJfQotCi0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIlF1aWNrRFJTOiBUeFRvdGFsQ250IDw9IDE1LCB0cmFpbiBiYWNrIHRvIG9yaWdpbmFsIHJhdGUgXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlkbwotCXsKLQkJVUxPTkcgT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudDsKLQotCQlpZiAocEFkLT5EcnNDb3VudGVycy5MYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbiA9PSAwKQotCQkJcmF0aW8gPSA1OwotCQllbHNlCi0JCQlyYXRpbyA9IDQ7Ci0KLQkJLy8gZG93bmdyYWRlIFRYIHF1YWxpdHkgaWYgUEVSID49IFJhdGUtRG93biB0aHJlc2hvbGQKLQkJaWYgKFR4RXJyb3JSYXRpbyA+PSBUcmFpbkRvd24pCi0JCXsKLQkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOwotCQl9Ci0KLQkJcEFkLT5EcnNDb3VudGVycy5QRVJbQ3VyclJhdGVJZHhdID0gKFVDSEFSKVR4RXJyb3JSYXRpbzsKLQotCQlPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50ID0gKFR4U3VjY2VzcyAqIHJhdGlvKTsKLQotCQkvLyBwZXJmb3JtIERSUyAtIGNvbnNpZGVyIFR4UmF0ZSBEb3duIGZpcnN0LCB0aGVuIHJhdGUgdXAuCi0JCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09IDEpICYmIChDdXJyUmF0ZUlkeCAhPSBEb3duUmF0ZUlkeCkpCi0JCXsKLQkJCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0VHhPa0NvdW50ICsgMikgPj0gT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSBEb3duUmF0ZUlkeDsKLQkJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKLQotCQkJfQotCi0JCX0KLQkJZWxzZSBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAyKSAmJiAoQ3VyclJhdGVJZHggIT0gVXBSYXRlSWR4KSkKLQkJewotCQkJaWYgKChUeEVycm9yUmF0aW8gPj0gNTApIHx8IChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKSkKLQkJCXsKLQotCQkJfQotCQkJZWxzZSBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFR4T2tDb3VudCArIDIpID49IE9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQpCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSBVcFJhdGVJZHg7Ci0JCQl9Ci0JCX0KLQl9d2hpbGUgKEZBTFNFKTsKLQotCS8vIGlmIHJhdGUtdXAgaGFwcGVuLCBjbGVhciBhbGwgYmFkIGhpc3Rvcnkgb2YgYWxsIFRYIHJhdGVzCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID4gQ3VyclJhdGVJZHgpCi0JewotCQlwQWQtPkRyc0NvdW50ZXJzLlR4UmF0ZVVwUGVuYWx0eSA9IDA7Ci0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKLQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5QRVIsIHNpemVvZihVQ0hBUikgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7Ci0JCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7Ci0JfQotCS8vIGlmIHJhdGUtZG93biBoYXBwZW4sIG9ubHkgY2xlYXIgRG93blJhdGUncyBiYWQgaGlzdG9yeQotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4IDwgQ3VyclJhdGVJZHgpCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJRdWlja0RSUzogLS1UWCByYXRlIGZyb20gJWQgdG8gJWQgXG4iLCBDdXJyUmF0ZUlkeCwgcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXgpKTsKLQotCQlwQWQtPkRyc0NvdW50ZXJzLlR4UmF0ZVVwUGVuYWx0eSA9IDA7ICAgICAgICAgICAvLyBubyBwZW5hbHR5Ci0JCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4XSA9IDA7Ci0JCXBBZC0+RHJzQ291bnRlcnMuUEVSW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4XSA9IDA7Ci0JCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7Ci0JfQotCWVsc2UKLQl7Ci0JCWJUeFJhdGVDaGFuZ2VkID0gRkFMU0U7Ci0JfQotCi0JcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KzEpKjVdOwotCWlmIChiVHhSYXRlQ2hhbmdlZCAmJiBwTmV4dFR4UmF0ZSkKLQl7Ci0JCQlNbG1lU2V0VHhSYXRlKHBBZCwgcEVudHJ5LCBwTmV4dFR4UmF0ZSk7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyByb3V0aW5lIGlzIGV4ZWN1dGVkIHBlcmlvZGljYWxseSBpbnNpZGUgTWxtZVBlcmlvZGljRXhlYygpIGFmdGVyCi0JCWFzc29jaWF0aW9uIHdpdGggYW4gQVAuCi0JCUl0IGNoZWNrcyBpZiBTdGFDZmcuUHNtIGlzIGNvbnNpc3RlbnQgd2l0aCB1c2VyIHBvbGljeSAocmVjb3JkZWQgaW4KLQkJU3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUpLiBJZiBub3QsIGVuZm9yY2UgdXNlciBwb2xpY3kuIEhvd2V2ZXIsCi0JCXRoZXJlJ3JlIHNvbWUgY29uZGl0aW9ucyB0byBjb25zaWRlcjoKLQkJMS4gd2UgZG9uJ3Qgc3VwcG9ydCBwb3dlci1zYXZpbmcgaW4gQURIT0MgbW9kZSwgc28gUHNtPVBXUl9BQ1RJVkUgYWxsCi0JCSAgIHRoZSB0aW1lIHdoZW4gTWlic3M9PVRSVUUKLQkJMi4gV2hlbiBsaW5rIHVwIGluIElORlJBIG1vZGUsIFBzbSBzaG91bGQgbm90IGJlIHN3aXRjaCB0byBQV1JfU0FWRQotCQkgICBpZiBvdXRnb2luZyB0cmFmZmljIGF2YWlsYWJsZSBpbiBUeFJpbmcgb3IgTWdtdFJpbmcuCi0JT3V0cHV0OgotCQkxLiBjaGFuZ2UgcEFkLT5TdGFDZmcuUHNtIHRvIFBXUl9TQVZFIG9yIGxlYXZlIGl0IHVudG91Y2hlZAotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE1sbWVDaGVja1BzbUNoYW5nZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVTE9ORwlOb3czMikKLXsKLQlVTE9ORwlQb3dlck1vZGU7Ci0KLQkvLyBjb25kaXRpb24gLQotCS8vIDEuIFBzbSBtYXliZSBPTiBvbmx5IGhhcHBlbiBpbiBJTkZSQVNUUlVDVFVSRSBtb2RlCi0JLy8gMi4gdXNlciB3YW50cyBlaXRoZXIgTUFYX1BTUCBvciBGQVNUX1BTUAotCS8vIDMuIGJ1dCBjdXJyZW50IHBzbSBpcyBub3QgaW4gUFdSX1NBVkUKLQkvLyA0LiBDTlRMIHN0YXRlIG1hY2hpbmUgaXMgbm90IGRvaW5nIFNDQU5uaW5nCi0JLy8gNS4gbm8gVFggU1VDQ0VTUyBldmVudCBmb3IgdGhlIHBhc3QgMS1zZWMgcGVyaW9kCi0JUG93ZXJNb2RlID0gcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZTsKLQotCWlmIChJTkZSQV9PTihwQWQpICYmCi0JCShQb3dlck1vZGUgIT0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTSkgJiYKLQkJKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfQUNUSVZFKSAmJgotLy8JCSghIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0JCShwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkmJgotCQlSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKQotCQkgLyomJgotCQkocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID09IDApICYmCi0JCShwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ID09IDApKi8pCi0JewotCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSk7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwgPSAwOwotCQlSVE1QX1NFVF9QU01fQklUKHBBZCwgUFdSX1NBVkUpOwotCQlpZiAoIShwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUpKQotCQl7Ci0JCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgRkFMU0UpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOwotCQl9Ci0JfQotfQotCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIE1sbWVTZXRQc21CaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIHBzbSkKLXsKLQlBVVRPX1JTUF9DRkdfU1RSVUMgY3NyNDsKLQotCXBBZC0+U3RhQ2ZnLlBzbSA9IHBzbTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIEFVVE9fUlNQX0NGRywgJmNzcjQud29yZCk7Ci0JY3NyNC5maWVsZC5BY2tDdHNQc21CaXQgPSAocHNtID09IFBXUl9TQVZFKT8gMTowOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fUlNQX0NGRywgY3NyNC53b3JkKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2V0UHNtQml0ID0gJWRcbiIsIHBzbSkpOwotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgcm91dGluZSBjYWxjdWxhdGVzIFR4UEVSLCBSeFBFUiBvZiB0aGUgcGFzdCBOLXNlYyBwZXJpb2QuIEFuZAotCQlhY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9uIHJlc3VsdCwgQ2hhbm5lbFF1YWxpdHkgaXMgY2FsY3VsYXRlZCBoZXJlCi0JCXRvIGRlY2lkZSBpZiBjdXJyZW50IEFQIGlzIHN0aWxsIGRvaW5nIHRoZSBqb2IuCi0KLQkJSWYgQ2hhbm5lbFF1YWxpdHkgaXMgbm90IGdvb2QsIGEgUk9BTWluZyBhdHRlbXB0IG1heSBiZSB0cmllZCBsYXRlci4KLQlPdXRwdXQ6Ci0JCVN0YUNmZy5DaGFubmVsUXVhbGl0eSAtIDAuLjEwMAotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOT1RFOiBUaGlzIHJvdXRpbmUgZGVjaWRlIGNoYW5ubGUgcXVhbGl0eSBiYXNlZCBvbiBSWCBDUkMgZXJyb3IgcmF0aW8uCi0JCUNhbGxlciBzaG91bGQgbWFrZSBzdXJlIGEgZnVuY3Rpb24gY2FsbCB0byBOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpCi0JCWlzIHBlcmZvcm1lZCByaWdodCBiZWZvcmUgdGhpcyByb3V0aW5lLCBzbyB0aGF0IHRoaXMgcm91dGluZSBjYW4gZGVjaWRlCi0JCWNoYW5uZWwgcXVhbGl0eSBiYXNlZCBvbiB0aGUgbW9zdCB1cC10by1kYXRlIGluZm9ybWF0aW9uCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWSBwTWFjRW50cnksCi0JSU4gVUxPTkcgTm93MzIpCi17Ci0JVUxPTkcgVHhPa0NudCwgVHhDbnQsIFR4UEVSLCBUeFBSUjsKLQlVTE9ORyBSeENudCwgUnhQRVI7Ci0JVUNIQVIgTm9yUnNzaTsKLQlDSEFSICBNYXhSc3NpOwotCVJTU0lfU0FNUExFICpwUnNzaVNhbXBsZSA9IE5VTEw7Ci0JVUlOVDMyIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPSAwOwotCVVJTlQzMiBPbmVTZWNUeFJldHJ5T2tDb3VudCA9IDA7Ci0JVUlOVDMyIE9uZVNlY1R4RmFpbENvdW50ID0gMDsKLQlVSU5UMzIgT25lU2VjUnhPa0NudCA9IDA7Ci0JVUlOVDMyIE9uZVNlY1J4RmNzRXJyQ250ID0gMDsKLQlVTE9ORyBDaGFubmVsUXVhbGl0eSA9IDA7ICAvLyAwLi4xMDAsIENoYW5uZWwgUXVhbGl0eSBJbmRpY2F0aW9uIGZvciBSb2FtaW5nCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JVUxPTkcgQmVhY29uTG9zdFRpbWUgPSBwQWQtPlN0YUNmZy5CZWFjb25Mb3N0VGltZTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCi0JLy8gbG9uZ2VyIGJlYWNvbiBsb3N0IHRpbWUgd2hlbiBjYXJyaWVyIGRldGVjdGlvbiBlbmFibGVkCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpCi0JewotCQlCZWFjb25Mb3N0VGltZSA9IHBBZC0+U3RhQ2ZnLkJlYWNvbkxvc3RUaW1lICsgKHBBZC0+U3RhQ2ZnLkJlYWNvbkxvc3RUaW1lLzIpOwotCX0KLSNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQl7Ci0JCXBSc3NpU2FtcGxlID0gJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGU7Ci0JCU9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQ7Ci0JCU9uZVNlY1R4UmV0cnlPa0NvdW50ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudDsKLQkJT25lU2VjVHhGYWlsQ291bnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OwotCQlPbmVTZWNSeE9rQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rQ250OwotCQlPbmVTZWNSeEZjc0VyckNudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQ7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JTWF4UnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgcFJzc2lTYW1wbGUtPkxhc3RSc3NpMCwKLQkJCQkJCQkJcFJzc2lTYW1wbGUtPkxhc3RSc3NpMSwKLQkJCQkJCQkJcFJzc2lTYW1wbGUtPkxhc3RSc3NpMik7Ci0KLQkvLwotCS8vIGNhbGN1bGF0ZSBUWCBwYWNrZXQgZXJyb3IgcmF0aW8gYW5kIFRYIHJldHJ5IHJhdGlvIC0gaWYgdG9vIGZldyBUWCBzYW1wbGVzLCBza2lwIFRYIHJlbGF0ZWQgc3RhdGlzdGljcwotCS8vCi0JVHhPa0NudCA9IE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKyBPbmVTZWNUeFJldHJ5T2tDb3VudDsKLQlUeENudCA9IFR4T2tDbnQgKyBPbmVTZWNUeEZhaWxDb3VudDsKLQlpZiAoVHhDbnQgPCA1KQotCXsKLQkJVHhQRVIgPSAwOwotCQlUeFBSUiA9IDA7Ci0JfQotCWVsc2UKLQl7Ci0JCVR4UEVSID0gKE9uZVNlY1R4RmFpbENvdW50ICogMTAwKSAvIFR4Q250OwotCQlUeFBSUiA9ICgoVHhDbnQgLSBPbmVTZWNUeE5vUmV0cnlPa0NvdW50KSAqIDEwMCkgLyBUeENudDsKLQl9Ci0KLQkvLwotCS8vIGNhbGN1bGF0ZSBSWCBQRVIgLSBkb24ndCB0YWtlIFJ4UEVSIGludG8gY29uc2lkZXJhdGlvbiBpZiB0b28gZmV3IHNhbXBsZQotCS8vCi0JUnhDbnQgPSBPbmVTZWNSeE9rQ250ICsgT25lU2VjUnhGY3NFcnJDbnQ7Ci0JaWYgKFJ4Q250IDwgNSkKLQkJUnhQRVIgPSAwOwotCWVsc2UKLQkJUnhQRVIgPSAoT25lU2VjUnhGY3NFcnJDbnQgKiAxMDApIC8gUnhDbnQ7Ci0KLQkvLwotCS8vIGRlY2lkZSBDaGFubmVsUXVhbGl0eSBiYXNlZCBvbjogMSlsYXN0IEJFQUNPTiByZWNlaXZlZCB0aW1lLCAyKWxhc3QgUlNTSSwgMylUeFBFUiwgYW5kIDQpUnhQRVIKLQkvLwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYKLQkJSU5GUkFfT04ocEFkKSAmJgotCQkoT25lU2VjVHhOb1JldHJ5T2tDb3VudCA8IDIpICYmIC8vIG5vIGhlYXZ5IHRyYWZmaWMKLQkJKChwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lICsgQmVhY29uTG9zdFRpbWUpIDwgTm93MzIpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkVBQ09OIGxvc3QgPiAlbGQgbXNlYyB3aXRoIFR4T2tDbnQ9JWxkIC0+IENRST0wXG4iLCBCZWFjb25Mb3N0VGltZSwgVHhPa0NudCkpOwotCQlDaGFubmVsUXVhbGl0eSA9IDA7Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl7Ci0JCS8vIE5vcm1hbGl6ZSBSc3NpCi0JCWlmIChNYXhSc3NpID4gLTQwKQotCQkJTm9yUnNzaSA9IDEwMDsKLQkJZWxzZSBpZiAoTWF4UnNzaSA8IC05MCkKLQkJCU5vclJzc2kgPSAwOwotCQllbHNlCi0JCQlOb3JSc3NpID0gKE1heFJzc2kgKyA5MCkgKiAyOwotCi0JCS8vIENoYW5uZWxRdWFsaXR5ID0gVzEqUlNTSSArIFcyKlR4UFJSICsgVzMqUnhQRVIJIChSU1NJIDAuLjEwMCksIChUeFBFUiAxMDAuLjApLCAoUnhQRVIgMTAwLi4wKQotCQlDaGFubmVsUXVhbGl0eSA9IChSU1NJX1dFSUdIVElORyAqIE5vclJzc2kgKwotCQkJCQkJCQkgICBUWF9XRUlHSFRJTkcgKiAoMTAwIC0gVHhQUlIpICsKLQkJCQkJCQkJICAgUlhfV0VJR0hUSU5HKiAoMTAwIC0gUnhQRVIpKSAvIDEwMDsKLQl9Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQotCQlwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkgPSAoQ2hhbm5lbFF1YWxpdHkgPiAxMDApID8gMTAwIDogQ2hhbm5lbFF1YWxpdHk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotfQotCi0KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBNbG1lU2V0VHhQcmVhbWJsZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgVHhQcmVhbWJsZSkKLXsKLQlBVVRPX1JTUF9DRkdfU1RSVUMgY3NyNDsKLQotCS8vCi0JLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCi0JLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCi0JLy8KLQkvL1R4UHJlYW1ibGUgPSBSdDgwMl8xMVByZWFtYmxlTG9uZzsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgQVVUT19SU1BfQ0ZHLCAmY3NyNC53b3JkKTsKLQlpZiAoVHhQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlTG9uZykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTZXRUeFByZWFtYmxlICg9IExPTkcgUFJFQU1CTEUpXG4iKSk7Ci0JCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7Ci0JCWNzcjQuZmllbGQuQXV0b1Jlc3BvbmRlclByZWFtYmxlID0gMDsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gTk9URTogMU1icHMgc2hvdWxkIGFsd2F5cyB1c2UgbG9uZyBwcmVhbWJsZQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2V0VHhQcmVhbWJsZSAoPSBTSE9SVCBQUkVBTUJMRSlcbiIpKTsKLQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7Ci0JCWNzcjQuZmllbGQuQXV0b1Jlc3BvbmRlclByZWFtYmxlID0gMTsKLQl9Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1JTUF9DRkcsIGNzcjQud29yZCk7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgVXBkYXRlIGJhc2ljIHJhdGUgYml0bWFwCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotCi1WT0lEIFVwZGF0ZUJhc2ljUmF0ZUJpdG1hcCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyKQotewotICAgIElOVCAgaSwgajsKLSAgICAgICAgICAgICAgICAgIC8qIDEgIDIgIDUuNSwgMTEsICA2LCAgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCAgNTQgKi8KLSAgICBVQ0hBUiByYXRlW10gPSB7IDIsIDQsICAxMSwgMjIsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDggfTsKLSAgICBVQ0hBUiAqc3VwX3AgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlN1cFJhdGU7Ci0gICAgVUNIQVIgKmV4dF9wID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5FeHRSYXRlOwotICAgIFVMT05HIGJpdG1hcCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwOwotCi0KLSAgICAvKiBpZiBBIG1vZGUsIGFsd2F5cyB1c2UgZml4IEJhc2ljUmF0ZUJpdE1hcCAqLwotICAgIC8vaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCA9PSBQSFlfMTFBKQotCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLSAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPSAweDE1MDsgLyogNiwgMTIsIDI0TSAqLwotICAgIC8qIEVuZCBvZiBpZiAqLwotCi0gICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwID4gNDA5NSkKLSAgICB7Ci0gICAgICAgIC8qICgyIF4gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpIC0xICovCi0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgZm9yKGk9MDsgaTxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKQotICAgIHsKLSAgICAgICAgc3VwX3BbaV0gJj0gMHg3ZjsKLSAgICAgICAgZXh0X3BbaV0gJj0gMHg3ZjsKLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIGZvcihpPTA7IGk8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChiaXRtYXAgJiAoMSA8PCBpKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKGo9MDsgajxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzdXBfcFtqXSA9PSByYXRlW2ldKQotICAgICAgICAgICAgICAgICAgICBzdXBfcFtqXSB8PSAweDgwOwotICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBpZiAqLwotICAgICAgICAgICAgfSAvKiBFbmQgb2YgZm9yICovCi0KLSAgICAgICAgICAgIGZvcihqPTA7IGo8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZXh0X3Bbal0gPT0gcmF0ZVtpXSkKLSAgICAgICAgICAgICAgICAgICAgZXh0X3Bbal0gfD0gMHg4MDsKLSAgICAgICAgICAgICAgICAvKiBFbmQgb2YgaWYgKi8KLSAgICAgICAgICAgIH0gLyogRW5kIG9mIGZvciAqLwotICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIH0gLyogRW5kIG9mIGZvciAqLwotfSAvKiBFbmQgb2YgVXBkYXRlQmFzaWNSYXRlQml0bWFwICovCi0KLS8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLS8vIGJMaW5rVXAgaXMgdG8gaWRlbnRpZnkgdGhlIGluaXRhbCBsaW5rIHNwZWVkLgotLy8gVFJVRSBpbmRpY2F0ZXMgdGhlIHJhdGUgdXBkYXRlIGF0IGxpbmt1cCwgd2Ugc2hvdWxkIG5vdCB0cnkgdG8gc2V0IHRoZSByYXRlIGF0IDU0TWJwcy4KLVZPSUQgTWxtZVVwZGF0ZVR4UmF0ZXMoCi0JSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCUJPT0xFQU4JCQkJYkxpbmtVcCwKLQlJTglVQ0hBUgkJCQlhcGlkeCkKLXsKLQlpbnQgaSwgbnVtOwotCVVDSEFSIFJhdGUgPSBSQVRFXzYsIE1heERlc2lyZSA9IFJBVEVfMSwgTWF4U3VwcG9ydCA9IFJBVEVfMTsKLQlVQ0hBUiBNaW5TdXBwb3J0ID0gUkFURV81NDsKLQlVTE9ORyBCYXNpY1JhdGVCaXRtYXAgPSAwOwotCVVDSEFSIEN1cnJCYXNpY1JhdGUgPSBSQVRFXzE7Ci0JVUNIQVIgKnBTdXBSYXRlLCBTdXBSYXRlTGVuLCAqcEV4dFJhdGUsIEV4dFJhdGVMZW47Ci0JUEhUVFJBTlNNSVRfU0VUVElORwkJcEh0UGh5ID0gTlVMTDsKLQlQSFRUUkFOU01JVF9TRVRUSU5HCQlwTWF4SHRQaHkgPSBOVUxMOwotCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBNaW5IdFBoeSA9IE5VTEw7Ci0JQk9PTEVBTgkJCQkJKmF1dG9fcmF0ZV9jdXJfcDsKLQlVQ0hBUgkJCQkJSHRNY3MgPSBNQ1NfQVVUTzsKLQotCS8vIGZpbmQgbWF4IGRlc2lyZWQgcmF0ZQotCVVwZGF0ZUJhc2ljUmF0ZUJpdG1hcChwQWQpOwotCi0JbnVtID0gMDsKLQlhdXRvX3JhdGVfY3VyX3AgPSBOVUxMOwotCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspCi0JewotCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbaV0gJiAweDdmKQotCQl7Ci0JCQljYXNlIDI6ICBSYXRlID0gUkFURV8xOyAgIG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSA0OiAgUmF0ZSA9IFJBVEVfMjsgICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgMTE6IFJhdGUgPSBSQVRFXzVfNTsgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDIyOiBSYXRlID0gUkFURV8xMTsgIG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSAxMjogUmF0ZSA9IFJBVEVfNjsgICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgMTg6IFJhdGUgPSBSQVRFXzk7ICAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDI0OiBSYXRlID0gUkFURV8xMjsgIG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSAzNjogUmF0ZSA9IFJBVEVfMTg7ICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgNDg6IFJhdGUgPSBSQVRFXzI0OyAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDcyOiBSYXRlID0gUkFURV8zNjsgIG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSA5NjogUmF0ZSA9IFJBVEVfNDg7ICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgMTA4OiBSYXRlID0gUkFURV81NDsgbnVtKys7ICAgYnJlYWs7Ci0JCQkvL2RlZmF1bHQ6IFJhdGUgPSBSQVRFXzE7ICAgYnJlYWs7Ci0JCX0KLQkJaWYgKE1heERlc2lyZSA8IFJhdGUpICBNYXhEZXNpcmUgPSBSYXRlOwotCX0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJcEh0UGh5CQk9ICZwQWQtPlN0YUNmZy5IVFBoeU1vZGU7Ci0JCXBNYXhIdFBoeQk9ICZwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGU7Ci0JCXBNaW5IdFBoeQk9ICZwQWQtPlN0YUNmZy5NaW5IVFBoeU1vZGU7Ci0KLQkJYXV0b19yYXRlX2N1cl9wID0gJnBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOwotCQlIdE1jcwkJPSBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKLQotCQlpZiAoKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKSAmJgotCQkJKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikgJiYKLQkJKE1heERlc2lyZSA+IFJBVEVfMTEpKQotCQl7Ci0JCQlNYXhEZXNpcmUgPSBSQVRFXzExOwotCQl9Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JcEFkLT5Db21tb25DZmcuTWF4RGVzaXJlZFJhdGUgPSBNYXhEZXNpcmU7Ci0JcE1pbkh0UGh5LT53b3JkID0gMDsKLQlwTWF4SHRQaHktPndvcmQgPSAwOwotCXBIdFBoeS0+d29yZCA9IDA7Ci0KLQkvLyBBdXRvIHJhdGUgc3dpdGNoaW5nIGlzIGVuYWJsZWQgb25seSBpZiBtb3JlIHRoYW4gb25lIERFU0lSRUQgUkFURVMgYXJlCi0JLy8gc3BlY2lmaWVkOyBvdGhlcndpc2UgZGlzYWJsZWQKLQlpZiAobnVtIDw9IDEpCi0JewotCQkvL09QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpOwotCQkvL3BBZC0+Q29tbW9uQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoCT0gRkFMU0U7Ci0JCSphdXRvX3JhdGVfY3VyX3AgPSBGQUxTRTsKLQl9Ci0JZWxzZQotCXsKLQkJLy9PUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCk7Ci0JCS8vcEFkLT5Db21tb25DZmcuYkF1dG9UeFJhdGVTd2l0Y2gJPSBUUlVFOwotCQkqYXV0b19yYXRlX2N1cl9wID0gVFJVRTsKLQl9Ci0KLQlpZiAoSHRNY3MgIT0gTUNTX0FVVE8pCi0JewotCQkvL09QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpOwotCQkvL3BBZC0+Q29tbW9uQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoCT0gRkFMU0U7Ci0JCSphdXRvX3JhdGVfY3VyX3AgPSBGQUxTRTsKLQl9Ci0JZWxzZQotCXsKLQkJLy9PUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCk7Ci0JCS8vcEFkLT5Db21tb25DZmcuYkF1dG9UeFJhdGVTd2l0Y2gJPSBUUlVFOwotCQkqYXV0b19yYXRlX2N1cl9wID0gVFJVRTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlpZiAoKEFESE9DX09OKHBBZCkgfHwgSU5GUkFfT04ocEFkKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQotCXsKLQkJcFN1cFJhdGUgPSAmcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZVswXTsKLQkJcEV4dFJhdGUgPSAmcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZVswXTsKLQkJU3VwUmF0ZUxlbiA9IHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW47Ci0JCUV4dFJhdGVMZW4gPSBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuOwotCX0KLQllbHNlCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JewotCQlwU3VwUmF0ZSA9ICZwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzBdOwotCQlwRXh0UmF0ZSA9ICZwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzBdOwotCQlTdXBSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKLQkJRXh0UmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW47Ci0JfQotCi0JLy8gZmluZCBtYXggc3VwcG9ydGVkIHJhdGUKLQlmb3IgKGk9MDsgaTxTdXBSYXRlTGVuOyBpKyspCi0JewotCQlzd2l0Y2ggKHBTdXBSYXRlW2ldICYgMHg3ZikKLQkJewotCQkJY2FzZSAyOiAgIFJhdGUgPSBSQVRFXzE7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDE7CSBicmVhazsKLQkJCWNhc2UgNDogICBSYXRlID0gUkFURV8yOwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDAyOwkgYnJlYWs7Ci0JCQljYXNlIDExOiAgUmF0ZSA9IFJBVEVfNV81OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA0OwkgYnJlYWs7Ci0JCQljYXNlIDIyOiAgUmF0ZSA9IFJBVEVfMTE7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDg7CSBicmVhazsKLQkJCWNhc2UgMTI6ICBSYXRlID0gUkFURV82OwkvKmlmIChwU3VwUmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMTA7ICBicmVhazsKLQkJCWNhc2UgMTg6ICBSYXRlID0gUkFURV85OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDIwOwkgYnJlYWs7Ci0JCQljYXNlIDI0OiAgUmF0ZSA9IFJBVEVfMTI7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDA0MDsgIGJyZWFrOwotCQkJY2FzZSAzNjogIFJhdGUgPSBSQVRFXzE4OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDgwOwkgYnJlYWs7Ci0JCQljYXNlIDQ4OiAgUmF0ZSA9IFJBVEVfMjQ7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDEwMDsgIGJyZWFrOwotCQkJY2FzZSA3MjogIFJhdGUgPSBSQVRFXzM2OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMjAwOwkgYnJlYWs7Ci0JCQljYXNlIDk2OiAgUmF0ZSA9IFJBVEVfNDg7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDA0MDA7CSBicmVhazsKLQkJCWNhc2UgMTA4OiBSYXRlID0gUkFURV81NDsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDgwMDsJIGJyZWFrOwotCQkJZGVmYXVsdDogIFJhdGUgPSBSQVRFXzE7CWJyZWFrOwotCQl9Ci0JCWlmIChNYXhTdXBwb3J0IDwgUmF0ZSkJTWF4U3VwcG9ydCA9IFJhdGU7Ci0KLQkJaWYgKE1pblN1cHBvcnQgPiBSYXRlKSBNaW5TdXBwb3J0ID0gUmF0ZTsKLQl9Ci0KLQlmb3IgKGk9MDsgaTxFeHRSYXRlTGVuOyBpKyspCi0JewotCQlzd2l0Y2ggKHBFeHRSYXRlW2ldICYgMHg3ZikKLQkJewotCQkJY2FzZSAyOiAgIFJhdGUgPSBSQVRFXzE7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDE7CSBicmVhazsKLQkJCWNhc2UgNDogICBSYXRlID0gUkFURV8yOwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDAyOwkgYnJlYWs7Ci0JCQljYXNlIDExOiAgUmF0ZSA9IFJBVEVfNV81OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA0OwkgYnJlYWs7Ci0JCQljYXNlIDIyOiAgUmF0ZSA9IFJBVEVfMTE7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDg7CSBicmVhazsKLQkJCWNhc2UgMTI6ICBSYXRlID0gUkFURV82OwkvKmlmIChwRXh0UmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMTA7ICBicmVhazsKLQkJCWNhc2UgMTg6ICBSYXRlID0gUkFURV85OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDIwOwkgYnJlYWs7Ci0JCQljYXNlIDI0OiAgUmF0ZSA9IFJBVEVfMTI7CS8qaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDA0MDsgIGJyZWFrOwotCQkJY2FzZSAzNjogIFJhdGUgPSBSQVRFXzE4OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDgwOwkgYnJlYWs7Ci0JCQljYXNlIDQ4OiAgUmF0ZSA9IFJBVEVfMjQ7CS8qaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDEwMDsgIGJyZWFrOwotCQkJY2FzZSA3MjogIFJhdGUgPSBSQVRFXzM2OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMjAwOwkgYnJlYWs7Ci0JCQljYXNlIDk2OiAgUmF0ZSA9IFJBVEVfNDg7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDA0MDA7CSBicmVhazsKLQkJCWNhc2UgMTA4OiBSYXRlID0gUkFURV81NDsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDgwMDsJIGJyZWFrOwotCQkJZGVmYXVsdDogIFJhdGUgPSBSQVRFXzE7CWJyZWFrOwotCQl9Ci0JCWlmIChNYXhTdXBwb3J0IDwgUmF0ZSkJTWF4U3VwcG9ydCA9IFJhdGU7Ci0KLQkJaWYgKE1pblN1cHBvcnQgPiBSYXRlKSBNaW5TdXBwb3J0ID0gUmF0ZTsKLQl9Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRUdBQ1lfQkFTSUNfUkFURSwgQmFzaWNSYXRlQml0bWFwKTsKLQotCS8vIGJ1ZyBmaXgKLQkvLyBwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPSBCYXNpY1JhdGVCaXRtYXA7Ci0KLQkvLyBjYWxjdWxhdGUgdGhlIGV4cHRlY3RlZCBBQ0sgcmF0ZSBmb3IgZWFjaCBUWCByYXRlLiBUaGlzIGluZm8gaXMgdXNlZCB0byBjYWN1bGF0ZQotCS8vIHRoZSBEVVJBVElPTiBmaWVsZCBvZiBvdXRnb2luZyB1bmlpY2FzdCBEQVRBL01HTVQgZnJhbWUKLQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKQotCXsKLQkJaWYgKEJhc2ljUmF0ZUJpdG1hcCAmICgweDAxIDw8IGkpKQotCQkJQ3VyckJhc2ljUmF0ZSA9IChVQ0hBUilpOwotCQlwQWQtPkNvbW1vbkNmZy5FeHBlY3RlZEFDS1JhdGVbaV0gPSBDdXJyQmFzaWNSYXRlOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiTWxtZVVwZGF0ZVR4UmF0ZXNbTWF4U3VwcG9ydCA9ICVkXSA9IE1heERlc2lyZSAlZCBNYnBzXG4iLCBSYXRlSWRUb01icHNbTWF4U3VwcG9ydF0sIFJhdGVJZFRvTWJwc1tNYXhEZXNpcmVdKSk7Ci0JLy8gbWF4IHR4IHJhdGUgPSBtaW4ge21heCBkZXNpcmUgcmF0ZSwgbWF4IHN1cHBvcnRlZCByYXRlfQotCWlmIChNYXhTdXBwb3J0IDwgTWF4RGVzaXJlKQotCQlwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPSBNYXhTdXBwb3J0OwotCWVsc2UKLQkJcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID0gTWF4RGVzaXJlOwotCi0JcEFkLT5Db21tb25DZmcuTWluVHhSYXRlID0gTWluU3VwcG9ydDsKLQkvLyAyMDAzLTA3LTMxIGpvaG4gLSAyNTAwIGRvZXNuJ3QgaGF2ZSBnb29kIHNlbnNpdGl2aXR5IGF0IGhpZ2ggT0ZETSByYXRlcy4gdG8gaW5jcmVhc2UgdGhlIHN1Y2Nlc3MKLQkvLyByYXRpbyBvZiBpbml0aWFsIERIQ1AgcGFja2V0IGV4Y2hhbmdlLCBUWCByYXRlIHN0YXJ0cyBmcm9tIGEgbG93ZXIgcmF0ZSBkZXBlbmRpbmcKLQkvLyBvbiBhdmVyYWdlIFJTU0kKLQkvLwkgMS4gUlNTSSA+PSAtNzBkYiwgc3RhcnQgYXQgNTQgTWJwcyAoc2hvcnQgZGlzdGFuY2UpCi0JLy8JIDIuIC03MCA+IFJTU0kgPj0gLTc1LCBzdGFydCBhdCAyNCBNYnBzIChtaWQgZGlzdGFuY2UpCi0JLy8JIDMuIC03NSA+IFJTU0ksIHN0YXJ0IGF0IDExIE1icHMgKGxvbmcgZGlzdGFuY2UpCi0JLy9pZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKS8qICYmCi0JLy8JT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKi8pCi0JaWYgKCphdXRvX3JhdGVfY3VyX3ApCi0JewotCQlzaG9ydCBkYm0gPSAwOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJZGJtID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCWlmIChiTGlua1VwID09IFRSVUUpCi0JCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzI0OwotCQllbHNlCi0JCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGU7Ci0KLQkJaWYgKGRibSA8IC03NSkKLQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IFJBVEVfMTE7Ci0JCWVsc2UgaWYgKGRibSA8IC03MCkKLQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IFJBVEVfMjQ7Ci0KLQkJLy8gc2hvdWxkIG5ldmVyIGV4Y2VlZCBNYXhUeFJhdGUgKGNvbnNpZGVyIDExQi1vbmx5IG1vZGUpCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPiBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUpCi0JCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGU7Ci0KLQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSAwOwotCX0KLQllbHNlCi0JewotCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGU7Ci0JCXBIdFBoeS0+ZmllbGQuTUNTCT0gKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IDMpID8gKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSAtIDQpIDogcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlOwotCQlwSHRQaHktPmZpZWxkLk1PREUJPSAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID4gMykgPyBNT0RFX09GRE0gOiBNT0RFX0NDSzsKLQotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TVEJDCT0gcEh0UGh5LT5maWVsZC5TVEJDOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJCT0gcEh0UGh5LT5maWVsZC5TaG9ydEdJOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEh0UGh5LT5maWVsZC5NQ1M7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwSHRQaHktPmZpZWxkLk1PREU7Ci0JfQotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA8PSBSQVRFXzExKQotCXsKLQkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuVHhSYXRlOwotCQlwTWluSHRQaHktPmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZTsKLQl9Ci0JZWxzZQotCXsKLQkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZV07Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPj0gUkFURV82ICYmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPD0gUkFURV81NCkpCi0JCQl7cE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGVdO30KLQkJZWxzZQotCQkJe3BNaW5IdFBoeS0+ZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWluVHhSYXRlO30KLQl9Ci0KLQlwSHRQaHktPndvcmQgPSAocE1heEh0UGh5LT53b3JkKTsKLQlpZiAoYkxpbmtVcCAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCi0JewotCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCA9IHBIdFBoeS0+d29yZDsKLQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWF4SFRQaHlNb2RlLndvcmQgPSBwTWF4SHRQaHktPndvcmQ7Ci0JCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1pbkhUUGh5TW9kZS53b3JkID0gcE1pbkh0UGh5LT53b3JkOwotCX0KLQllbHNlCi0JewotCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpCi0JCXsKLQkJCWNhc2UgUEhZXzExQkdfTUlYRUQ6Ci0JCQljYXNlIFBIWV8xMUI6Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQljYXNlIFBIWV8xMUJHTl9NSVhFRDoKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfMTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBSQVRFXzE7Ci0KLS8vI2lmZGVmCVdJRklfVEVTVAotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzExOwotLy8jZWxzZQotLy8JCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTsKLS8vI2VuZGlmCi0JCQkJYnJlYWs7Ci0JCQljYXNlIFBIWV8xMUc6Ci0JCQljYXNlIFBIWV8xMUE6Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKLQkJCWNhc2UgUEhZXzExR05fTUlYRUQ6Ci0JCQljYXNlIFBIWV8xMU5fMl80RzoKLQkJCWNhc2UgUEhZXzExQU5fTUlYRUQ6Ci0JCQljYXNlIFBIWV8xMU5fNUc6Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzY7Ci0JCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfNjsKLQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCi0JCQkJewotCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfMTsKLQkJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTsKLQkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IFJBVEVfMTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzY7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzY7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6IC8vIGVycm9yCi0JCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzY7Ci0JCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV8xOwotCQkJCWJyZWFrOwotCQl9Ci0JCS8vCi0JCS8vIEtlZXAgQmFzaWMgTWxtZSBSYXRlLgotCQkvLwotCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS53b3JkID0gcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQ7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9PSBNT0RFX09GRE0pCi0JCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1tSQVRFXzI0XTsKLQkJZWxzZQotCQkJcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gUkFURV8xOwotCQlwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzIChNYXhEZXNpcmU9JWQsIE1heFN1cHBvcnQ9JWQsIE1heFR4UmF0ZT0lZCwgTWluUmF0ZT0lZCwgUmF0ZSBTd2l0Y2hpbmcgPSVkKVxuIiwKLQkJCSBSYXRlSWRUb01icHNbTWF4RGVzaXJlXSwgUmF0ZUlkVG9NYnBzW01heFN1cHBvcnRdLCBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlXSwgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZV0sCi0JCQkgLypPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpKi8qYXV0b19yYXRlX2N1cl9wKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzIChUeFJhdGU9JWQsIFJ0c1JhdGU9JWQsIEJhc2ljUmF0ZUJpdG1hcD0weCUwNGx4KVxuIiwKLQkJCSBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuVHhSYXRlXSwgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGVdLCBCYXNpY1JhdGVCaXRtYXApKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lVXBkYXRlVHhSYXRlcyAoTWxtZVRyYW5zbWl0PTB4JXgsIE1pbkhUUGh5TW9kZT0leCwgTWF4SFRQaHlNb2RlPTB4JXgsIEhUUGh5TW9kZT0weCV4KVxuIiwKLQkJCSBwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQud29yZCwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NaW5IVFBoeU1vZGUud29yZCAscEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NYXhIVFBoeU1vZGUud29yZCAscEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCApKTsKLX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlUaGlzIGZ1bmN0aW9uIHVwZGF0ZSBIVCBSYXRlIHNldHRpbmcuCi0JCUlucHV0IFdjaWQgdmFsdWUgaXMgdmFsaWQgZm9yIDIgY2FzZSA6Ci0JCTEuIGl0J3MgdXNlZCBmb3IgU3RhdGlvbiBpbiBpbmZyYSBtb2RlIHRoYXQgY29weSBBUCByYXRlIHRvIE1hY3RhYmxlLgotCQkyLiBPUiBTdGF0aW9uCWluIGFkaG9jIG1vZGUgdG8gY29weSBwZWVyJ3MgSFQgcmF0ZSB0byBNYWN0YWJsZS4KLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lVXBkYXRlSHRUeFJhdGVzKAotCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglVQ0hBUgkJCQlhcGlkeCkKLXsKLQlVQ0hBUglTdGJjTWNzOyAvL2osIFN0YmNNY3MsIGJpdG1hc2s7Ci0JQ0hBUglpOyAvLyAzKjMKLQlSVF9IVF9DQVBBQklMSVRZCSpwUnRIdENhcCA9IE5VTEw7Ci0JUlRfSFRfUEhZX0lORk8JCSpwQWN0aXZlSHRQaHkgPSBOVUxMOwotCVVMT05HCQlCYXNpY01DUzsKLQlVQ0hBUiBqLCBiaXRtYXNrOwotCVBSVF9IVF9QSFlfSU5GTwkJCXBEZXNpcmVIdFBoeSA9IE5VTEw7Ci0JUEhUVFJBTlNNSVRfU0VUVElORwkJcEh0UGh5ID0gTlVMTDsKLQlQSFRUUkFOU01JVF9TRVRUSU5HCQlwTWF4SHRQaHkgPSBOVUxMOwotCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBNaW5IdFBoeSA9IE5VTEw7Ci0JQk9PTEVBTgkJCQkJKmF1dG9fcmF0ZV9jdXJfcDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiTWxtZVVwZGF0ZUh0VHhSYXRlcz09PT4gXG4iKSk7Ci0KLQlhdXRvX3JhdGVfY3VyX3AgPSBOVUxMOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCXBEZXNpcmVIdFBoeQk9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOwotCQlwQWN0aXZlSHRQaHkJPSAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mbzsKLQkJcEh0UGh5CQk9ICZwQWQtPlN0YUNmZy5IVFBoeU1vZGU7Ci0JCXBNYXhIdFBoeQk9ICZwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGU7Ci0JCXBNaW5IdFBoeQk9ICZwQWQtPlN0YUNmZy5NaW5IVFBoeU1vZGU7Ci0KLQkJYXV0b19yYXRlX2N1cl9wID0gJnBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCWlmICgoQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCi0JewotCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpCi0JCQlyZXR1cm47Ci0KLQkJcFJ0SHRDYXAgPSAmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHk7Ci0JCXBBY3RpdmVIdFBoeSA9ICZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvOwotCQlTdGJjTWNzID0gKFVDSEFSKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMy5TdGJjTWNzOwotCQlCYXNpY01DUyA9cEFkLT5NbG1lQXV4LkFkZEh0SW5mby5NQ1NTZXRbMF0rKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uTUNTU2V0WzFdPDw4KSsoU3RiY01jczw8MTYpOwotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpICYmIChwUnRIdENhcC0+UnhTVEJDKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKLQkJCXBNYXhIdFBoeS0+ZmllbGQuU1RCQyA9IFNUQkNfVVNFOwotCQllbHNlCi0JCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl7Ci0JCWlmIChwRGVzaXJlSHRQaHktPmJIdEVuYWJsZSA9PSBGQUxTRSkKLQkJCXJldHVybjsKLQotCQlwUnRIdENhcCA9ICZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHk7Ci0JCVN0YmNNY3MgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzMuU3RiY01jczsKLQkJQmFzaWNNQ1MgPSBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uTUNTU2V0WzBdKyhwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uTUNTU2V0WzFdPDw4KSsoU3RiY01jczw8MTYpOwotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpICYmIChwUnRIdENhcC0+UnhTVEJDKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKLQkJCXBNYXhIdFBoeS0+ZmllbGQuU1RCQyA9IFNUQkNfVVNFOwotCQllbHNlCi0JCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7Ci0JfQotCi0JLy8gRGVjaWRlIE1BWCBodCByYXRlLgotCWlmICgocFJ0SHRDYXAtPkdGKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGKSkKLQkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7Ci0JZWxzZQotCQlwTWF4SHRQaHktPmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOwotCi0gICAgaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSAmJiAocFJ0SHRDYXAtPkNoYW5uZWxXaWR0aCkpCi0JCXBNYXhIdFBoeS0+ZmllbGQuQlcgPSBCV180MDsKLQllbHNlCi0JCXBNYXhIdFBoeS0+ZmllbGQuQlcgPSBCV18yMDsKLQotICAgIGlmIChwTWF4SHRQaHktPmZpZWxkLkJXID09IEJXXzIwKQotCQlwTWF4SHRQaHktPmZpZWxkLlNob3J0R0kgPSAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCAmIHBSdEh0Q2FwLT5TaG9ydEdJZm9yMjApOwotCWVsc2UKLQkJcE1heEh0UGh5LT5maWVsZC5TaG9ydEdJID0gKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgJiBwUnRIdENhcC0+U2hvcnRHSWZvcjQwKTsKLQotCWlmIChwRGVzaXJlSHRQaHktPk1DU1NldFs0XSAhPSAwKQotCXsKLQkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSAzMjsKLQl9Ci0KLQlmb3IgKGk9MjM7IGk+PTA7IGktLSkgLy8gMyozCi0JewotCQlqID0gaS84OwotCQliaXRtYXNrID0gKDE8PChpLShqKjgpKSk7Ci0KLQkJaWYgKChwQWN0aXZlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spICYmIChwRGVzaXJlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spKQotCQl7Ci0JCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IGk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChpPT0wKQotCQkJYnJlYWs7Ci0JfQotCi0JLy8gQ29weSBNSU4gaHQgcmF0ZS4gIHJ0Mjg2MD8/PwotCXBNaW5IdFBoeS0+ZmllbGQuQlcgPSBCV18yMDsKLQlwTWluSHRQaHktPmZpZWxkLk1DUyA9IDA7Ci0JcE1pbkh0UGh5LT5maWVsZC5TVEJDID0gMDsKLQlwTWluSHRQaHktPmZpZWxkLlNob3J0R0kgPSAwOwotCS8vSWYgU1RBIGFzc2lnbnMgZml4ZWQgcmF0ZS4gdXBkYXRlIHRvIGZpeGVkIGhlcmUuCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JaWYgKCAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzBdICE9IDB4ZmYpKQotCXsKLQkJaWYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzRdICE9IDApCi0JCXsKLQkJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gMzI7Ci0JCQlwTWluSHRQaHktPmZpZWxkLk1DUyA9IDMyOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlSHRUeFJhdGVzPD09PSBVc2UgRml4ZWQgTUNTID0gJWRcbiIscE1pbkh0UGh5LT5maWVsZC5NQ1MpKTsKLQkJfQotCi0JCWZvciAoaT0yMzsgKENIQVIpaSA+PSAwOyBpLS0pIC8vIDMqMwotCQl7Ci0JCQlqID0gaS84OwotCQkJYml0bWFzayA9ICgxPDwoaS0oaio4KSkpOwotCQkJaWYgKCAocERlc2lyZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSAmJiAocEFjdGl2ZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSkKLQkJCXsKLQkJCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IGk7Ci0JCQkJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGk9PTApCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCS8vIERlY2lkZSBodCByYXRlCi0JcEh0UGh5LT5maWVsZC5TVEJDID0gcE1heEh0UGh5LT5maWVsZC5TVEJDOwotCXBIdFBoeS0+ZmllbGQuQlcgPSBwTWF4SHRQaHktPmZpZWxkLkJXOwotCXBIdFBoeS0+ZmllbGQuTU9ERSA9IHBNYXhIdFBoeS0+ZmllbGQuTU9ERTsKLQlwSHRQaHktPmZpZWxkLk1DUyA9IHBNYXhIdFBoeS0+ZmllbGQuTUNTOwotCXBIdFBoeS0+ZmllbGQuU2hvcnRHSSA9IHBNYXhIdFBoeS0+ZmllbGQuU2hvcnRHSTsKLQotCS8vIHVzZSBkZWZhdWx0IG5vdy4gcnQyODYwCi0JaWYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzBdICE9IDB4ZmYpCi0JCSphdXRvX3JhdGVfY3VyX3AgPSBGQUxTRTsKLQllbHNlCi0JCSphdXRvX3JhdGVfY3VyX3AgPSBUUlVFOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVIdFR4UmF0ZXM8LS0tLkFNc2R1U2l6ZSA9ICVkICBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUgKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJUWDogTUNTWzBdID0gJXggKGNob29zZSAlZCksIEJXID0gJWQsIFNob3J0R0kgPSAlZCwgTU9ERSA9ICVkLCAgXG4iLCBwQWN0aXZlSHRQaHktPk1DU1NldFswXSxwSHRQaHktPmZpZWxkLk1DUywKLQkJcEh0UGh5LT5maWVsZC5CVywgcEh0UGh5LT5maWVsZC5TaG9ydEdJLCBwSHRQaHktPmZpZWxkLk1PREUpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVIdFR4UmF0ZXM8PT09IFxuIikpOwotfQotCi0KLVZPSUQgQkFUYWJsZUluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gQkFfVEFCTEUgKlRhYikKLXsKLQlpbnQgaTsKLQotCVRhYi0+bnVtQXNPcmlnaW5hdG9yID0gMDsKLQlUYWItPm51bUFzUmVjaXBpZW50ID0gMDsKLQlUYWItPm51bURvbmVPcmlnaW5hdG9yID0gMDsKLQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKQotCXsKLQkJVGFiLT5CQVJlY0VudHJ5W2ldLlJFQ19CQV9TdGF0dXMgPSBSZWNpcGllbnRfTk9ORTsKLQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJihUYWItPkJBUmVjRW50cnlbaV0uUnhSZVJpbmdMb2NrKSk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX09SSV9UQUJMRTsgaSsrKQotCXsKLQkJVGFiLT5CQU9yaUVudHJ5W2ldLk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX05PTkU7Ci0JfQotfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgTWxtZVJhZGlvT2ZmKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVJUTVBfTUxNRV9SQURJT19PRkYocEFkKTsKLX0KLQotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIE1sbWVSYWRpb09uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVJUTVBfTUxNRV9SQURJT19PTihwQWQpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBic3NfdGFibGUuYwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLS8qISBcYnJpZWYgaW5pdGlhbGl6ZSBCU1MgdGFibGUKLSAqCVxwYXJhbSBwX3RhYiBwb2ludGVyIHRvIHRoZSB0YWJsZQotICoJXHJldHVybiBub25lCi0gKglccHJlCi0gKglccG9zdAotCi0gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICovCi1WT0lEIEJzc1RhYmxlSW5pdCgKLQlJTiBCU1NfVEFCTEUgKlRhYikKLXsKLQlpbnQgaTsKLQotCVRhYi0+QnNzTnIgPSAwOwotICAgIFRhYi0+QnNzT3ZlcmxhcE5yID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CU1NfVEFCTEU7IGkrKykKLQl7Ci0JCU5kaXNaZXJvTWVtb3J5KCZUYWItPkJzc0VudHJ5W2ldLCBzaXplb2YoQlNTX0VOVFJZKSk7Ci0JCVRhYi0+QnNzRW50cnlbaV0uUnNzaSA9IC0xMjc7CS8vIGluaXRpYWwgdGhlIHJzc2kgYXMgYSBtaW5pbXVtIHZhbHVlCi0JfQotfQotCi0KLS8qISBcYnJpZWYgc2VhcmNoIHRoZSBCU1MgdGFibGUgYnkgU1NJRAotICoJXHBhcmFtIHBfdGFiIHBvaW50ZXIgdG8gdGhlIGJzcyB0YWJsZQotICoJXHBhcmFtIHNzaWQgU1NJRCBzdHJpbmcKLSAqCVxyZXR1cm4gaW5kZXggb2YgdGhlIHRhYmxlLCBCU1NfTk9UX0ZPVU5EIGlmIG5vdCBpbiB0aGUgdGFibGUKLSAqCVxwcmUKLSAqCVxwb3N0Ci0gKglcbm90ZSBzZWFyY2ggYnkgc2VxdWVudGlhbCBzZWFyY2gKLQotIElSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gKi8KLVVMT05HIEJzc1RhYmxlU2VhcmNoKAotCUlOIEJTU19UQUJMRSAqVGFiLAotCUlOIFBVQ0hBUgkgcEJzc2lkLAotCUlOIFVDSEFSCSBDaGFubmVsKQotewotCVVDSEFSIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQotCXsKLQkJLy8KLQkJLy8gU29tZSBBUCB0aGF0IHN1cHBvcnQgQS9CL0cgbW9kZSB0aGF0IG1heSB1c2VkIHRoZSBzYW1lIEJTU0lEIG9uIDExQSBhbmQgMTFCL0cuCi0JCS8vIFdlIHNob3VsZCBkaXN0aW5ndWlzaCB0aGlzIGNhc2UuCi0JCS8vCi0JCWlmICgoKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPD0gMTQpICYmIChDaGFubmVsIDw9IDE0KSkgfHwKLQkJCSAoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCi0JCQlNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpKQotCQl7Ci0JCQlyZXR1cm4gaTsKLQkJfQotCX0KLQlyZXR1cm4gKFVMT05HKUJTU19OT1RfRk9VTkQ7Ci19Ci0KLVVMT05HIEJzc1NzaWRUYWJsZVNlYXJjaCgKLQlJTiBCU1NfVEFCTEUgKlRhYiwKLQlJTiBQVUNIQVIJIHBCc3NpZCwKLQlJTiBQVUNIQVIJIHBTc2lkLAotCUlOIFVDSEFSCSBTc2lkTGVuLAotCUlOIFVDSEFSCSBDaGFubmVsKQotewotCVVDSEFSIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQotCXsKLQkJLy8KLQkJLy8gU29tZSBBUCB0aGF0IHN1cHBvcnQgQS9CL0cgbW9kZSB0aGF0IG1heSB1c2VkIHRoZSBzYW1lIEJTU0lEIG9uIDExQSBhbmQgMTFCL0cuCi0JCS8vIFdlIHNob3VsZCBkaXN0aW5ndWlzaCB0aGlzIGNhc2UuCi0JCS8vCi0JCWlmICgoKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPD0gMTQpICYmIChDaGFubmVsIDw9IDE0KSkgfHwKLQkJCSAoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCi0JCQlNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpICYmCi0JCQlTU0lEX0VRVUFMKHBTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W2ldLlNzaWQsIFRhYi0+QnNzRW50cnlbaV0uU3NpZExlbikpCi0JCXsKLQkJCXJldHVybiBpOwotCQl9Ci0JfQotCXJldHVybiAoVUxPTkcpQlNTX05PVF9GT1VORDsKLX0KLQotVUxPTkcgQnNzVGFibGVTZWFyY2hXaXRoU1NJRCgKLQlJTiBCU1NfVEFCTEUgKlRhYiwKLQlJTiBQVUNIQVIJIEJzc2lkLAotCUlOIFBVQ0hBUgkgcFNzaWQsCi0JSU4gVUNIQVIJIFNzaWRMZW4sCi0JSU4gVUNIQVIJIENoYW5uZWwpCi17Ci0JVUNIQVIgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspCi0JewotCQlpZiAoKCgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsIDw9IDE0KSAmJiAoQ2hhbm5lbCA8PSAxNCkpIHx8Ci0JCQkoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCi0JCQlNQUNfQUREUl9FUVVBTCgmKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQpLCBCc3NpZCkgJiYKLQkJCShTU0lEX0VRVUFMKHBTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W2ldLlNzaWQsIFRhYi0+QnNzRW50cnlbaV0uU3NpZExlbikgfHwKLQkJCShOZGlzRXF1YWxNZW1vcnkocFNzaWQsIFplcm9Tc2lkLCBTc2lkTGVuKSkgfHwKLQkJCShOZGlzRXF1YWxNZW1vcnkoVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLCBaZXJvU3NpZCwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkTGVuKSkpKQotCQl7Ci0JCQlyZXR1cm4gaTsKLQkJfQotCX0KLQlyZXR1cm4gKFVMT05HKUJTU19OT1RfRk9VTkQ7Ci19Ci0KLQotVUxPTkcgQnNzU3NpZFRhYmxlU2VhcmNoQnlTU0lEKAotCUlOIEJTU19UQUJMRSAqVGFiLAotCUlOIFBVQ0hBUgkgcFNzaWQsCi0JSU4gVUNIQVIJIFNzaWRMZW4pCi17Ci0JVUNIQVIgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspCi0JewotCQlpZiAoU1NJRF9FUVVBTChwU3NpZCwgU3NpZExlbiwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLCBUYWItPkJzc0VudHJ5W2ldLlNzaWRMZW4pKQotCQl7Ci0JCQlyZXR1cm4gaTsKLQkJfQotCX0KLQlyZXR1cm4gKFVMT05HKUJTU19OT1RfRk9VTkQ7Ci19Ci0KLQotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIEJzc1RhYmxlRGVsZXRlRW50cnkoCi0JSU4gT1VUCUJTU19UQUJMRSAqVGFiLAotCUlOCQlQVUNIQVIJICBwQnNzaWQsCi0JSU4JCVVDSEFSCSAgQ2hhbm5lbCkKLXsKLQlVQ0hBUiBpLCBqOwotCi0JZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKLQl7Ci0JCWlmICgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID09IENoYW5uZWwpICYmCi0JCQkoTUFDX0FERFJfRVFVQUwoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCwgcEJzc2lkKSkpCi0JCXsKLQkJCWZvciAoaiA9IGk7IGogPCBUYWItPkJzc05yIC0gMTsgaisrKQotCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KCYoVGFiLT5Cc3NFbnRyeVtqXSksICYoVGFiLT5Cc3NFbnRyeVtqICsgMV0pLCBzaXplb2YoQlNTX0VOVFJZKSk7Ci0JCQl9Ci0JCQlOZGlzWmVyb01lbW9yeSgmKFRhYi0+QnNzRW50cnlbVGFiLT5Cc3NOciAtIDFdKSwgc2l6ZW9mKEJTU19FTlRSWSkpOwotCQkJVGFiLT5Cc3NOciAtPSAxOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCURlbGV0ZSB0aGUgT3JpZ2luYXRvciBFbnRyeSBpbiBCQXRhYmxlLiBPciBkZWNyZWFzZSBudW1BcyBPcmlnaW5hdG9yIGJ5IDEgaWYgbmVlZGVkLgotCi0JQXJndW1lbnRzOgotCS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQkFUYWJsZURlbGV0ZU9SSUVudHJ5KAotCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKLQlJTgkJQkFfT1JJX0VOVFJZCSpwQkFPUklFbnRyeSkKLXsKLQotCWlmIChwQkFPUklFbnRyeS0+T1JJX0JBX1N0YXR1cyAhPSBPcmlnaW5hdG9yX05PTkUpCi0JewotCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0JCWlmIChwQkFPUklFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpCi0JCXsKLQkJCXBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgLT0gMTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBVGFibGVEZWxldGVPUklFbnRyeSBudW1Bc09yaWdpbmF0b3I9ICVsZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50KSk7Ci0JCQkvLyBFcmFzZSBCaXRtYXAgZmxhZy4KLQkJfQotCQlwQWQtPk1hY1RhYi5Db250ZW50W3BCQU9SSUVudHJ5LT5XY2lkXS5UWEJBYml0bWFwICY9ICh+KDE8PChwQkFPUklFbnRyeS0+VElEKSApKTsJLy8gSWYgU1RBIG1vZGUsICBlcmFzZSBmbGFnIGhlcmUKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtwQkFPUklFbnRyeS0+V2NpZF0uQkFPcmlXY2lkQXJyYXlbcEJBT1JJRW50cnktPlRJRF0gPSAwOwkvLyBJZiBTVEEgbW9kZSwgIGVyYXNlIGZsYWcgaGVyZQotCQlwQkFPUklFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKLQkJcEJBT1JJRW50cnktPlRva2VuID0gMTsKLQkJLy8gTm90IGNsZWFyIFNlcXVlbmNlIGhlcmUuCi0JCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKLQl9Ci19Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLS8qISBcYnJpZWYKLSAqCVxwYXJhbQotICoJXHJldHVybgotICoJXHByZQotICoJXHBvc3QKLQotIElSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gKi8KLVZPSUQgQnNzRW50cnlTZXQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUIEJTU19FTlRSWSAqcEJzcywKLQlJTiBQVUNIQVIgcEJzc2lkLAotCUlOIENIQVIgU3NpZFtdLAotCUlOIFVDSEFSIFNzaWRMZW4sCi0JSU4gVUNIQVIgQnNzVHlwZSwKLQlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAotCUlOIFBDRl9QQVJNIHBDZlBhcm0sCi0JSU4gVVNIT1JUIEF0aW1XaW4sCi0JSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAotCUlOIFVDSEFSIFN1cFJhdGVbXSwKLQlJTiBVQ0hBUiBTdXBSYXRlTGVuLAotCUlOIFVDSEFSIEV4dFJhdGVbXSwKLQlJTiBVQ0hBUiBFeHRSYXRlTGVuLAotCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAotCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAotCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKLQlJTiBVQ0hBUiBDaGFubmVsLAotCUlOIENIQVIgUnNzaSwKLQlJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKLQlJTiBVQ0hBUiBDa2lwRmxhZywKLQlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKLQlJTiBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKLQlJTiBQUUJTU19MT0FEX1BBUk0gcFFic3NMb2FkLAotCUlOIFVTSE9SVCBMZW5ndGhWSUUsCi0JSU4gUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKQotewotCUNPUFlfTUFDX0FERFIocEJzcy0+QnNzaWQsIHBCc3NpZCk7Ci0JLy8gRGVmYXVsdCBIaWRkZW4gU1NJRCB0byBiZSBUUlVFLCBpdCB3aWxsIGJlIHR1cm5lZCB0byBGQUxTRSBhZnRlciBjb3BpbmcgU1NJRAotCXBCc3MtPkhpZGRlbiA9IDE7Ci0JaWYgKFNzaWRMZW4gPiAwKQotCXsKLQkJLy8gRm9yIGhpZGRlbiBTU0lEIEFQLCBpdCBtaWdodCBzZW5kIGJlYWNvbiB3aXRoIFNTSUQgbGVuIGVxdWFsIHRvIDAKLQkJLy8gT3Igc2VuZCBiZWFjb24gL3Byb2JlIHJlc3BvbnNlIHdpdGggU1NJRCBsZW4gbWF0Y2hpbmcgcmVhbCBTU0lEIGxlbmd0aCwKLQkJLy8gYnV0IFNTSUQgaXMgYWxsIHplcm8uIHN1Y2ggYXMgIjAwLTAwLTAwLTAwIiB3aXRoIGxlbmd0aCA0LgotCQkvLyBXZSBoYXZlIHRvIHByZXZlbnQgdGhpcyBjYXNlIG92ZXJ3cml0ZSBjb3JyZWN0IHRhYmxlCi0JCWlmIChOZGlzRXF1YWxNZW1vcnkoU3NpZCwgWmVyb1NzaWQsIFNzaWRMZW4pID09IDApCi0JCXsKLQkJICAgIE5kaXNaZXJvTWVtb3J5KHBCc3MtPlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7Ci0JCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKLQkJCXBCc3MtPlNzaWRMZW4gPSBTc2lkTGVuOwotCQkJcEJzcy0+SGlkZGVuID0gMDsKLQkJfQotCX0KLQllbHNlCi0JCXBCc3MtPlNzaWRMZW4gPSAwOwotCXBCc3MtPkJzc1R5cGUgPSBCc3NUeXBlOwotCXBCc3MtPkJlYWNvblBlcmlvZCA9IEJlYWNvblBlcmlvZDsKLQlpZiAoQnNzVHlwZSA9PSBCU1NfSU5GUkEpCi0JewotCQlpZiAocENmUGFybS0+YlZhbGlkKQotCQl7Ci0JCQlwQnNzLT5DZnBDb3VudCA9IHBDZlBhcm0tPkNmcENvdW50OwotCQkJcEJzcy0+Q2ZwUGVyaW9kID0gcENmUGFybS0+Q2ZwUGVyaW9kOwotCQkJcEJzcy0+Q2ZwTWF4RHVyYXRpb24gPSBwQ2ZQYXJtLT5DZnBNYXhEdXJhdGlvbjsKLQkJCXBCc3MtPkNmcER1clJlbWFpbmluZyA9IHBDZlBhcm0tPkNmcER1clJlbWFpbmluZzsKLQkJfQotCX0KLQllbHNlCi0JewotCQlwQnNzLT5BdGltV2luID0gQXRpbVdpbjsKLQl9Ci0KLQlwQnNzLT5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvOwotCS8vIFRoZSBwcml2YWN5IGJpdCBpbmRpY2F0ZSBzZWN1cml0eSBpcyBPTiwgaXQgbWFpZ2h0IGJlIFdFUCwgVEtJUCBvciBBRVMKLQkvLyBDb21iaW5lIHdpdGggQXV0aE1vZGUsIHRoZXkgd2lsbCBkZWNpZGUgdGhlIGNvbm5lY3Rpb24gbWV0aG9kcy4KLQlwQnNzLT5Qcml2YWN5ID0gQ0FQX0lTX1BSSVZBQ1lfT04ocEJzcy0+Q2FwYWJpbGl0eUluZm8pOwotCUFTU0VSVChTdXBSYXRlTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLQlpZiAoU3VwUmF0ZUxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKLQkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7Ci0JZWxzZQotCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBSYXRlLCBTdXBSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7Ci0JcEJzcy0+U3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47Ci0JQVNTRVJUKEV4dFJhdGVMZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwotCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPkV4dFJhdGUsIEV4dFJhdGUsIEV4dFJhdGVMZW4pOwotCXBCc3MtPk5ld0V4dENoYW5PZmZzZXQgPSBOZXdFeHRDaGFuT2Zmc2V0OwotCXBCc3MtPkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOwotCXBCc3MtPkNoYW5uZWwgPSBDaGFubmVsOwotCXBCc3MtPkNlbnRyYWxDaGFubmVsID0gQ2hhbm5lbDsKLQlwQnNzLT5Sc3NpID0gUnNzaTsKLQkvLyBVcGRhdGUgQ2tpcEZsYWcuIGlmIG5vdCBleGlzdHMsIHRoZSB2YWx1ZSBpcyAweDAKLQlwQnNzLT5Da2lwRmxhZyA9IENraXBGbGFnOwotCi0JLy8gTmV3IGZvciBtaWNyb3NvZnQgRml4ZWQgSUVzCi0JTmRpc01vdmVNZW1vcnkocEJzcy0+Rml4SUVzLlRpbWVzdGFtcCwgJlRpbWVTdGFtcCwgOCk7Ci0JcEJzcy0+Rml4SUVzLkJlYWNvbkludGVydmFsID0gQmVhY29uUGVyaW9kOwotCXBCc3MtPkZpeElFcy5DYXBhYmlsaXRpZXMgPSBDYXBhYmlsaXR5SW5mbzsKLQotCS8vIE5ldyBmb3IgbWljcm9zb2Z0IFZhcmlhYmxlIElFcwotCWlmIChMZW5ndGhWSUUgIT0gMCkKLQl7Ci0JCXBCc3MtPlZhcklFTGVuID0gTGVuZ3RoVklFOwotCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5WYXJJRXMsIHBWSUUsIHBCc3MtPlZhcklFTGVuKTsKLQl9Ci0JZWxzZQotCXsKLQkJcEJzcy0+VmFySUVMZW4gPSAwOwotCX0KLQotCXBCc3MtPkFkZEh0SW5mb0xlbiA9IDA7Ci0JcEJzcy0+SHRDYXBhYmlsaXR5TGVuID0gMDsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlpZiAoSHRDYXBhYmlsaXR5TGVuPiAwKQotCXsKLQkJcEJzcy0+SHRDYXBhYmlsaXR5TGVuID0gSHRDYXBhYmlsaXR5TGVuOwotCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+SHRDYXBhYmlsaXR5LCBwSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4pOwotCQlpZiAoQWRkSHRJbmZvTGVuID4gMCkKLQkJewotCQkJcEJzcy0+QWRkSHRJbmZvTGVuID0gQWRkSHRJbmZvTGVuOwotCQkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkFkZEh0SW5mbywgcEFkZEh0SW5mbywgQWRkSHRJbmZvTGVuKTsKLQotCQkJCWlmICgocEFkZEh0SW5mby0+Q29udHJvbENoYW4gPiAyKSYmIChwQWRkSHRJbmZvLT5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQkVMT1cpICYmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLQkJCQl7Ci0JCQkJCXBCc3MtPkNlbnRyYWxDaGFubmVsID0gcEFkZEh0SW5mby0+Q29udHJvbENoYW4gLSAyOwotCQkJCX0KLQkJCQllbHNlIGlmICgocEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0FCT1ZFKSAmJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JCQkJewotCQkJCQkJcEJzcy0+Q2VudHJhbENoYW5uZWwgPSBwQWRkSHRJbmZvLT5Db250cm9sQ2hhbiArIDI7Ci0JCQkJfQotCQl9Ci0JfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JQnNzQ2lwaGVyUGFyc2UocEJzcyk7Ci0KLQkvLyBuZXcgZm9yIFFPUwotCWlmIChwRWRjYVBhcm0pCi0JCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5FZGNhUGFybSwgcEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7Ci0JZWxzZQotCQlwQnNzLT5FZGNhUGFybS5iVmFsaWQgPSBGQUxTRTsKLQlpZiAocFFvc0NhcGFiaWxpdHkpCi0JCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5Rb3NDYXBhYmlsaXR5LCBwUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKLQllbHNlCi0JCXBCc3MtPlFvc0NhcGFiaWxpdHkuYlZhbGlkID0gRkFMU0U7Ci0JaWYgKHBRYnNzTG9hZCkKLQkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPlFic3NMb2FkLCBwUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOwotCWVsc2UKLQkJcEJzcy0+UWJzc0xvYWQuYlZhbGlkID0gRkFMU0U7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJUEVJRF9TVFJVQ1QgICAgIHBFaWQ7Ci0JCVVTSE9SVCAgICAgICAgICBMZW5ndGggPSAwOwotCi0KLQkJTmRpc1plcm9NZW1vcnkoJnBCc3MtPldwYUlFLklFWzBdLCBNQVhfQ1VTVE9NX0xFTik7Ci0JCU5kaXNaZXJvTWVtb3J5KCZwQnNzLT5Sc25JRS5JRVswXSwgTUFYX0NVU1RPTV9MRU4pOwotI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKLQkJTmRpc1plcm9NZW1vcnkoJnBCc3MtPkNvdW50cnlTdHJpbmdbMF0sIDMpOwotCQlwQnNzLT5iSGFzQ291bnRyeUlFID0gRkFMU0U7Ci0jZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLwotCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOwotCQl3aGlsZSAoKExlbmd0aCArIDIgKyAoVVNIT1JUKXBFaWQtPkxlbikgPD0gTGVuZ3RoVklFKQotCQl7Ci0JCQlzd2l0Y2gocEVpZC0+RWlkKQotCQkJewotCQkJCWNhc2UgSUVfV1BBOgotCQkJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkKLQkJCQkJewotCQkJCQkJaWYgKChwRWlkLT5MZW4gKyAyKSA+IE1BWF9DVVNUT01fTEVOKQotCQkJCQkJewotCQkJCQkJCXBCc3MtPldwYUlFLklFTGVuID0gMDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCXBCc3MtPldwYUlFLklFTGVuID0gcEVpZC0+TGVuICsgMjsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPldwYUlFLklFLCBwRWlkLCBwQnNzLT5XcGFJRS5JRUxlbik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBJRV9SU046Ci0gICAgICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkKLQkJCQkJewotCQkJCQkJaWYgKChwRWlkLT5MZW4gKyAyKSA+IE1BWF9DVVNUT01fTEVOKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCQkJCQkJCXBCc3MtPlJzbklFLklFTGVuID0gMDsKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQkJcEJzcy0+UnNuSUUuSUVMZW4gPSBwRWlkLT5MZW4gKyAyOwotCQkJCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+UnNuSUUuSUUsIHBFaWQsIHBCc3MtPlJzbklFLklFTGVuKTsKLQkJCX0KLQkJCQlicmVhazsKLSNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi0JCQkJY2FzZSBJRV9DT1VOVFJZOgotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+Q291bnRyeVN0cmluZ1swXSwgcEVpZC0+T2N0ZXQsIDMpOwotCQkJCQlwQnNzLT5iSGFzQ291bnRyeUlFID0gVFJVRTsKLQkJCQkJYnJlYWs7Ci0jZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLwotICAgICAgICAgICAgfQotCQkJTGVuZ3RoID0gTGVuZ3RoICsgMiArIChVU0hPUlQpcEVpZC0+TGVuOyAgLy8gRWlkWzFdICsgTGVuWzFdKyBjb250ZW50W0xlbl0KLQkJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOwotCQl9Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotfQotCi0vKiEKLSAqCVxicmllZiBpbnNlcnQgYW4gZW50cnkgaW50byB0aGUgYnNzIHRhYmxlCi0gKglccGFyYW0gcF90YWIgVGhlIEJTUyB0YWJsZQotICoJXHBhcmFtIEJzc2lkIEJTU0lECi0gKglccGFyYW0gc3NpZCBTU0lECi0gKglccGFyYW0gc3NpZF9sZW4gTGVuZ3RoIG9mIFNTSUQKLSAqCVxwYXJhbSBic3NfdHlwZQotICoJXHBhcmFtIGJlYWNvbl9wZXJpb2QKLSAqCVxwYXJhbSB0aW1lc3RhbXAKLSAqCVxwYXJhbSBwX2NmCi0gKglccGFyYW0gYXRpbV93aW4KLSAqCVxwYXJhbSBjYXAKLSAqCVxwYXJhbSByYXRlcwotICoJXHBhcmFtIHJhdGVzX2xlbgotICoJXHBhcmFtIGNoYW5uZWxfaWR4Ci0gKglccmV0dXJuIG5vbmUKLSAqCVxwcmUKLSAqCVxwb3N0Ci0gKglcbm90ZSBJZiBTU0lEIGlzIGlkZW50aWNhbCwgdGhlIG9sZCBlbnRyeSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBuZXcgb25lCi0KLSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICovCi1VTE9ORyBCc3NUYWJsZVNldEVudHJ5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVCBCU1NfVEFCTEUgKlRhYiwKLQlJTiBQVUNIQVIgcEJzc2lkLAotCUlOIENIQVIgU3NpZFtdLAotCUlOIFVDSEFSIFNzaWRMZW4sCi0JSU4gVUNIQVIgQnNzVHlwZSwKLQlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAotCUlOIENGX1BBUk0gKkNmUGFybSwKLQlJTiBVU0hPUlQgQXRpbVdpbiwKLQlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCi0JSU4gVUNIQVIgU3VwUmF0ZVtdLAotCUlOIFVDSEFSIFN1cFJhdGVMZW4sCi0JSU4gVUNIQVIgRXh0UmF0ZVtdLAotCUlOIFVDSEFSIEV4dFJhdGVMZW4sCi0JSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKLQlJTiBBRERfSFRfSU5GT19JRSAqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCi0JSU4gVUNIQVIJCQlBZGRIdEluZm9MZW4sCi0JSU4gVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0LAotCUlOIFVDSEFSIENoYW5uZWxObywKLQlJTiBDSEFSIFJzc2ksCi0JSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCi0JSU4gVUNIQVIgQ2tpcEZsYWcsCi0JSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCi0JSU4gUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCi0JSU4gUFFCU1NfTE9BRF9QQVJNIHBRYnNzTG9hZCwKLQlJTiBVU0hPUlQgTGVuZ3RoVklFLAotCUlOIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSkKLXsKLQlVTE9ORwlJZHg7Ci0KLQlJZHggPSBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKFRhYiwgcEJzc2lkLCAgKFVDSEFSICopU3NpZCwgU3NpZExlbiwgQ2hhbm5lbE5vKTsKLQlpZiAoSWR4ID09IEJTU19OT1RfRk9VTkQpCi0JewotCQlpZiAoVGFiLT5Cc3NOciA+PSBNQVhfTEVOX09GX0JTU19UQUJMRSkKLQkgICAgewotCQkJLy8KLQkJCS8vIEl0IG1heSBoYXBwZW4gd2hlbiBCU1MgVGFibGUgd2FzIGZ1bGwuCi0JCQkvLyBUaGUgZGVzaXJlZCBBUCB3aWxsIG5vdCBiZSBhZGRlZCBpbnRvIEJTUyBUYWJsZQotCQkJLy8gSW4gdGhpcyBjYXNlLCBpZiB3ZSBmb3VuZCB0aGUgZGVzaXJlZCBBUCB0aGVuIG92ZXJ3cml0ZSBCU1MgVGFibGUuCi0JCQkvLwotCQkJaWYoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCXsKLQkJCQlpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBwQnNzaWQpIHx8Ci0JCQkJCVNTSURfRVFVQUwocEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBTc2lkLCBTc2lkTGVuKSkKLQkJCQl7Ci0JCQkJCUlkeCA9IFRhYi0+QnNzT3ZlcmxhcE5yOwotCQkJCQlCc3NFbnRyeVNldChwQWQsICZUYWItPkJzc0VudHJ5W0lkeF0sIHBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLCBDZlBhcm0sIEF0aW1XaW4sCi0JCQkJCQlDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbixwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLAotCQkJCQkJTmV3RXh0Q2hhbk9mZnNldCwgQ2hhbm5lbE5vLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCBwRWRjYVBhcm0sIHBRb3NDYXBhYmlsaXR5LCBwUWJzc0xvYWQsIExlbmd0aFZJRSwgcFZJRSk7Ci0gICAgICAgICAgICAgICAgICAgIFRhYi0+QnNzT3ZlcmxhcE5yID0gKFRhYi0+QnNzT3ZlcmxhcE5yKyspICUgTUFYX0xFTl9PRl9CU1NfVEFCTEU7Ci0JCQkJfQotCQkJCXJldHVybiBJZHg7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQlyZXR1cm4gQlNTX05PVF9GT1VORDsKLQkJCX0KLQkJfQotCQlJZHggPSBUYWItPkJzc05yOwotCQlCc3NFbnRyeVNldChwQWQsICZUYWItPkJzc0VudHJ5W0lkeF0sIHBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLCBDZlBhcm0sIEF0aW1XaW4sCi0JCQkJCUNhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8sSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sCi0JCQkJCU5ld0V4dENoYW5PZmZzZXQsIENoYW5uZWxObywgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgcEVkY2FQYXJtLCBwUW9zQ2FwYWJpbGl0eSwgcFFic3NMb2FkLCBMZW5ndGhWSUUsIHBWSUUpOwotCQlUYWItPkJzc05yKys7Ci0JfQotCWVsc2UKLQl7Ci0JCS8qIGF2b2lkICBIaWRkZW4gU1NJRCBmb3JtIGJlYWNvbiB0byBvdmVyd2lyaXRlIGNvcnJlY3QgU1NJRCBmcm9tIHByb2JlIHJlc3BvbnNlICovCi0JCWlmICgoU1NJRF9FUVVBTChTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W0lkeF0uU3NpZCwgVGFiLT5Cc3NFbnRyeVtJZHhdLlNzaWRMZW4pKSB8fAotCQkJKE5kaXNFcXVhbE1lbW9yeShUYWItPkJzc0VudHJ5W0lkeF0uU3NpZCwgWmVyb1NzaWQsIFRhYi0+QnNzRW50cnlbSWR4XS5Tc2lkTGVuKSkpCi0JCXsKLQkJCUJzc0VudHJ5U2V0KHBBZCwgJlRhYi0+QnNzRW50cnlbSWR4XSwgcEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsQ2ZQYXJtLCBBdGltV2luLAotCQkJCQkJQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4scEh0Q2FwYWJpbGl0eSwgcEFkZEh0SW5mbyxIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwKLQkJCQkJCU5ld0V4dENoYW5PZmZzZXQsIENoYW5uZWxObywgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgcEVkY2FQYXJtLCBwUW9zQ2FwYWJpbGl0eSwgcFFic3NMb2FkLCBMZW5ndGhWSUUsIHBWSUUpOwotCQl9Ci0JfQotCi0JcmV0dXJuIElkeDsKLX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIERPVDExX05fU1VQUE9SVAotI2lmZGVmIERPVDExTl9EUkFGVDMKLVZPSUQgIFRyaUV2ZW50SW5pdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVQ0hBUgkJaTsKLQotCWZvciAoaSA9IDA7aSA8IE1BWF9UUklHR0VSX0VWRU5UO2krKykKLQkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5iVmFsaWQgPSBGQUxTRTsKLQotCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFObyA9IDA7Ci0JcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QkNvdW50RG93biA9IDA7Ci19Ci0KLVVMT05HIFRyaUV2ZW50VGFibGVTZXRFbnRyeSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQgVFJJR0dFUl9FVkVOVF9UQUIgKlRhYiwKLQlJTiBQVUNIQVIgcEJzc2lkLAotCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCi0JSU4gVUNIQVIJCQlSZWdDbGFzcywKLQlJTiBVQ0hBUiBDaGFubmVsTm8pCi17Ci0JLy8gRXZlbnQgQQotCWlmIChIdENhcGFiaWxpdHlMZW4gPT0gMCkKLQl7Ci0JCWlmIChUYWItPkV2ZW50QU5vIDwgTUFYX1RSSUdHRVJfRVZFTlQpCi0JCXsKLQkJCVJUTVBNb3ZlTWVtb3J5KFRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLkJTU0lELCBwQnNzaWQsIDYpOwotCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uYlZhbGlkID0gVFJVRTsKLQkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLkNoYW5uZWwgPSBDaGFubmVsTm87Ci0JCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5DRENvdW50ZXIgPSBwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheTsKLQkJCWlmIChSZWdDbGFzcyAhPSAwKQotCQkJewotCQkJCS8vIEJlYWNvbiBoYXMgUmVndWxhdG9yeSBjbGFzcyBJRS4gU28gdXNlIGJlYWNvbidzCi0JCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uUmVnQ2xhc3MgPSBSZWdDbGFzczsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBVc2UgU3RhdGlvbidzIFJlZ3VsYXRvcnkgY2xhc3MgaW5zdGVhZC4KLQkJCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID09IFRSVUUpCi0JCQkJewotCQkJCQlpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQkJCQl7Ci0JCQkJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5SZWdDbGFzcyA9IDMyOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJCQkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLlJlZ0NsYXNzID0gMzM7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uUmVnQ2xhc3MgPSA/PzsKLQotCQkJfQotCi0JCQlUYWItPkV2ZW50QU5vICsrOwotCQl9Ci0JfQotCWVsc2UgaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5JbnRvbGVyYW50NDApCi0JewotCQlUYWItPkV2ZW50QkNvdW50RG93biA9IHBBZC0+Q29tbW9uQ2ZnLkRvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5OwotCX0KLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVRyaWdnZXIgRXZlbnQgdGFibGUgTWFpbnRhaW5lbmNlIGNhbGxlZCBvbmNlIGV2ZXJ5IHNlY29uZC4KLQotCUFyZ3VtZW50czoKLQkvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFRyaUV2ZW50Q291bnRlck1haW50ZW5hbmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCVVDSEFSCQlpOwotCUJPT0xFQU4JCQliTm90aWZ5ID0gRkFMU0U7Ci0JZm9yIChpID0gMDtpIDwgTUFYX1RSSUdHRVJfRVZFTlQ7aSsrKQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uYlZhbGlkICYmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNEQ291bnRlciA+IDApKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNEQ291bnRlci0tOwotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uQ0RDb3VudGVyID09IDApCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5iVmFsaWQgPSBGQUxTRTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBTm8gLS07Ci0JCQkJLy8gTmVlZCB0byBzZW5kIDIwLzQwIENvZXhpc3RlbmNlIE5vdGlmeSBmcmFtZSBpZiBoYXMgc3RhdHVzIGNoYW5nZS4KLQkJCQliTm90aWZ5ID0gVFJVRTsKLQkJCX0KLQkJfQotCX0KLQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QkNvdW50RG93biA+IDApCi0JewotCQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRCQ291bnREb3duLS07Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRCQ291bnREb3duID09IDApCi0JCQliTm90aWZ5ID0gVFJVRTsKLQl9Ci0KLQlpZiAoYk5vdGlmeSA9PSBUUlVFKQotCQlVcGRhdGUyMDQwQ29leGlzdEZyYW1lQW5kTm90aWZ5KHBBZCwgQlNTSURfV0NJRCwgVFJVRSk7Ci19Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgQnNzVGFibGVTc2lkU29ydCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQgQlNTX1RBQkxFICpPdXRUYWIsCi0JSU4JQ0hBUiBTc2lkW10sCi0JSU4JVUNIQVIgU3NpZExlbikKLXsKLQlJTlQgaTsKLQlCc3NUYWJsZUluaXQoT3V0VGFiKTsKLQotCWZvciAoaSA9IDA7IGkgPCBwQWQtPlNjYW5UYWIuQnNzTnI7IGkrKykKLQl7Ci0JCUJTU19FTlRSWSAqcEluQnNzID0gJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXTsKLQkJQk9PTEVBTgliSXNIaWRkZW5BcEluY2x1ZGVkID0gRkFMU0U7Ci0KLQkJaWYgKCgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYKLSAgICAgICAgICAgIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KSAmJgotICAgICAgICAgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEluQnNzLT5DaGFubmVsKSkKLSNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgotICAgICAgICAgICAgIHx8IChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKQotI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KLSAgICAgICAgICAgICkKLXsKLQkJCWlmIChwSW5Cc3MtPkhpZGRlbikKLQkJCQliSXNIaWRkZW5BcEluY2x1ZGVkID0gVFJVRTsKLX0KLQotCQlpZiAoKHBJbkJzcy0+QnNzVHlwZSA9PSBwQWQtPlN0YUNmZy5Cc3NUeXBlKSAmJgotCQkJKFNTSURfRVFVQUwoU3NpZCwgU3NpZExlbiwgcEluQnNzLT5Tc2lkLCBwSW5Cc3MtPlNzaWRMZW4pIHx8IGJJc0hpZGRlbkFwSW5jbHVkZWQpKQotCQl7Ci0JCQlCU1NfRU5UUlkgKnBPdXRCc3MgPSAmT3V0VGFiLT5Cc3NFbnRyeVtPdXRUYWItPkJzc05yXTsKLQotCi0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotCQkJLy8gSWYgbm8gQ291bnRyeSBJRSBleGlzdHMgbm8gQ29ubmVjdGlvbiB3aWxsIGJlIGVzdGFibGlzaGVkIHdoZW4gSUVFRTgwMjExZENsaWVudE1vZGUgaXMgc3RyaWN0LgotCQkJaWYgKChwQWQtPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9PSBSdDgwMl8xMV9EX1N0cmljdCkgJiYKLQkJCQkocEluQnNzLT5iSGFzQ291bnRyeUlFID09IEZBTFNFKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9PSBSdDgwMl8xMV9EX1N0cmljdCwgYnV0IHRoaXMgQVAgZG9lc24ndCBoYXZlIGNvdW50cnkgSUUuXG4iKSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0jZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkvLyAyLjRHLzVHIE4gb25seSBtb2RlCi0JCQlpZiAoKHBJbkJzcy0+SHRDYXBhYmlsaXR5TGVuID09IDApICYmCi0JCQkJKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fMl80RykgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykpKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBIGlzIGluIE4tb25seSBNb2RlLCB0aGlzIEFQIGRvbid0IGhhdmUgSHQgY2FwYWJpbGl0eSBpbiBCZWFjb24uXG4iKSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJCS8vIE5ldyBmb3IgV1BBMgotCQkJLy8gQ2hlY2sgdGhlIEF1dGhtb2RlIGZpcnN0Ci0JCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQkJewotCQkJCS8vIENoZWNrIEF1dGhNb2RlIGFuZCBBdXRoTW9kZUF1eCBmb3IgbWF0Y2hpbmcsIGluIGNhc2UgQVAgc3VwcG9ydCBkdWFsLW1vZGUKLQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGUpICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBwSW5Cc3MtPkF1dGhNb2RlQXV4KSkKLQkJCQkJLy8gTm9uZSBtYXRjaGVkCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJLy8gQ2hlY2sgY2lwaGVyIHN1aXRlLCBBUCBtdXN0IGhhdmUgbW9yZSBzZWN1cmVkIGNpcGhlciB0aGFuIHN0YXRpb24gc2V0dGluZwotCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKLQkJCQl7Ci0JCQkJCS8vIElmIGl0J3Mgbm90IG1peGVkIG1vZGUsIHdlIHNob3VsZCBvbmx5IGxldCBCU1MgcGFzcyB3aXRoIHRoZSBzYW1lIGVuY3J5cHRpb24KLQkJCQkJaWYgKHBJbkJzcy0+V1BBLmJNaXhNb2RlID09IEZBTFNFKQotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKLQkJCQkJCQljb250aW51ZTsKLQotCQkJCQkvLyBjaGVjayBncm91cCBjaXBoZXIKLQkJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikgJiYKLQkJCQkJCShwSW5Cc3MtPldQQS5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQpICYmCi0JCQkJCQkocEluQnNzLT5XUEEuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkpCi0JCQkJCQljb250aW51ZTsKLQotCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCi0JCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KLQkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAotCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyQXV4KSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQkJCXsKLQkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgotCQkJCQlpZiAocEluQnNzLT5XUEEyLmJNaXhNb2RlID09IEZBTFNFKQotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCi0JCQkJCQkJY29udGludWU7Ci0KLQkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCi0JCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpICYmCi0JCQkJCQkocEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkgJiYKLQkJCQkJCShwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkpCi0JCQkJCQljb250aW51ZTsKLQotCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCi0JCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KLQkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAotCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlcikgJiYKLQkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJLy8gQnNzIFR5cGUgbWF0Y2hlZCwgU1NJRCBtYXRjaGVkLgotCQkJLy8gV2Ugd2lsbCBjaGVjayB3ZXBzdGF0dXMgZm9yIHF1YWxpZmljYXRpb24gQnNzCi0JCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XZXBTdGF0dXMpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTdGFDZmcuV2VwU3RhdHVzPSVkLCB3aGlsZSBwSW5Cc3MtPldlcFN0YXR1cz0lZFxuIiwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCBwSW5Cc3MtPldlcFN0YXR1cykpOwotCQkJCS8vCi0JCQkJLy8gRm9yIHRoZSBTRVN2MiBjYXNlLCB3ZSB3aWxsIG5vdCBxdWFsaWZ5IFdlcFN0YXR1cy4KLQkJCQkvLwotCQkJCWlmICghcEluQnNzLT5iU0VTKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gU2luY2UgdGhlIEFQIGlzIHVzaW5nIGhpZGRlbiBTU0lELCBhbmQgd2UgYXJlIHRyeWluZyB0byBjb25uZWN0IHRvIEFOWQotCQkJLy8gSXQgZGVmaW5pdGVseSB3aWxsIGZhaWwuIFNvLCBza2lwIGl0LgotCQkJLy8gQ0NYIGFsc28gcmVxdWlyZSBub3QgZXZlbiB0cnkgdG8gY29ubmVjdCBpdCEhCi0JCQlpZiAoU3NpZExlbiA9PSAwKQotCQkJCWNvbnRpbnVlOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkvLyBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uCi0JCQkvLyBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLAotCQkJaWYgKChwSW5Cc3MtPkNlbnRyYWxDaGFubmVsICE9IHBJbkJzcy0+Q2hhbm5lbCkgJiYKLQkJCQkocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkKLQkJCXsKLQkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsIHBJbkJzcy0+Q2hhbm5lbCkgPT0gRkFMU0UpCi0JCQkJewotCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV18yMDsKLQkJCQkJU2V0Q29tbW9uSFQocEFkKTsKLQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0gQldfNDA7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID09IEJBTkRfV0lEVEhfMjApCi0JCQkJCXsKLQkJCQkJCVNldENvbW1vbkhUKHBBZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJCS8vIGNvcHkgbWF0Y2hpbmcgQlNTIGZyb20gSW5UYWIgdG8gT3V0VGFiCi0JCQlOZGlzTW92ZU1lbW9yeShwT3V0QnNzLCBwSW5Cc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKLQotCQkJT3V0VGFiLT5Cc3NOcisrOwotCQl9Ci0JCWVsc2UgaWYgKChwSW5Cc3MtPkJzc1R5cGUgPT0gcEFkLT5TdGFDZmcuQnNzVHlwZSkgJiYgKFNzaWRMZW4gPT0gMCkpCi0JCXsKLQkJCUJTU19FTlRSWSAqcE91dEJzcyA9ICZPdXRUYWItPkJzc0VudHJ5W091dFRhYi0+QnNzTnJdOwotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCS8vIDIuNEcvNUcgTiBvbmx5IG1vZGUKLQkJCWlmICgocEluQnNzLT5IdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYKLQkJCQkoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl8yXzRHKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEEgaXMgaW4gTi1vbmx5IE1vZGUsIHRoaXMgQVAgZG9uJ3QgaGF2ZSBIdCBjYXBhYmlsaXR5IGluIEJlYWNvbi5cbiIpKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCQkJLy8gTmV3IGZvciBXUEEyCi0JCQkvLyBDaGVjayB0aGUgQXV0aG1vZGUgZmlyc3QKLQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JCQl7Ci0JCQkJLy8gQ2hlY2sgQXV0aE1vZGUgYW5kIEF1dGhNb2RlQXV4IGZvciBtYXRjaGluZywgaW4gY2FzZSBBUCBzdXBwb3J0IGR1YWwtbW9kZQotCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZSkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGVBdXgpKQotCQkJCQkvLyBOb25lIG1hdGNoZWQKLQkJCQkJY29udGludWU7Ci0KLQkJCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCi0JCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQotCQkJCXsKLQkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgotCQkJCQlpZiAocEluQnNzLT5XUEEuYk1peE1vZGUgPT0gRkFMU0UpCi0JCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyKQotCQkJCQkJCWNvbnRpbnVlOwotCi0JCQkJCS8vIGNoZWNrIGdyb3VwIGNpcGhlcgotCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCi0JCQkJCQljb250aW51ZTsKLQotCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCi0JCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KLQkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAotCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyQXV4KSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQkJCXsKLQkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgotCQkJCQlpZiAocEluQnNzLT5XUEEyLmJNaXhNb2RlID09IEZBTFNFKQotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCi0JCQkJCQkJY29udGludWU7Ci0KLQkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCi0JCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCi0JCQkJCQljb250aW51ZTsKLQotCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCi0JCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KLQkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAotCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlcikgJiYKLQkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJLy8gQnNzIFR5cGUgbWF0Y2hlZCwgU1NJRCBtYXRjaGVkLgotCQkJLy8gV2Ugd2lsbCBjaGVjayB3ZXBzdGF0dXMgZm9yIHF1YWxpZmljYXRpb24gQnNzCi0JCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XZXBTdGF0dXMpCi0JCQkJCWNvbnRpbnVlOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkvLyBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uCi0JCQkvLyBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLAotCQkJaWYgKChwSW5Cc3MtPkNlbnRyYWxDaGFubmVsICE9IHBJbkJzcy0+Q2hhbm5lbCkgJiYKLQkJCQkocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkKLQkJCXsKLQkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsIHBJbkJzcy0+Q2hhbm5lbCkgPT0gRkFMU0UpCi0JCQkJewotCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV18yMDsKLQkJCQkJU2V0Q29tbW9uSFQocEFkKTsKLQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0gQldfNDA7Ci0JCQkJfQotCQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCQkvLyBjb3B5IG1hdGNoaW5nIEJTUyBmcm9tIEluVGFiIHRvIE91dFRhYgotCQkJTmRpc01vdmVNZW1vcnkocE91dEJzcywgcEluQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7Ci0KLQkJCU91dFRhYi0+QnNzTnIrKzsKLQkJfQotCi0JCWlmIChPdXRUYWItPkJzc05yID49IE1BWF9MRU5fT0ZfQlNTX1RBQkxFKQotCQkJYnJlYWs7Ci0JfQotCi0JQnNzVGFibGVTb3J0QnlSc3NpKE91dFRhYik7Ci19Ci0KLQotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIEJzc1RhYmxlU29ydEJ5UnNzaSgKLQlJTiBPVVQgQlNTX1RBQkxFICpPdXRUYWIpCi17Ci0JSU5UCSAgaSwgajsKLQlCU1NfRU5UUlkgVG1wQnNzOwotCi0JZm9yIChpID0gMDsgaSA8IE91dFRhYi0+QnNzTnIgLSAxOyBpKyspCi0JewotCQlmb3IgKGogPSBpKzE7IGogPCBPdXRUYWItPkJzc05yOyBqKyspCi0JCXsKLQkJCWlmIChPdXRUYWItPkJzc0VudHJ5W2pdLlJzc2kgPiBPdXRUYWItPkJzc0VudHJ5W2ldLlJzc2kpCi0JCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJlRtcEJzcywgJk91dFRhYi0+QnNzRW50cnlbal0sIHNpemVvZihCU1NfRU5UUlkpKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmT3V0VGFiLT5Cc3NFbnRyeVtqXSwgJk91dFRhYi0+QnNzRW50cnlbaV0sIHNpemVvZihCU1NfRU5UUlkpKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmT3V0VGFiLT5Cc3NFbnRyeVtpXSwgJlRtcEJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOwotCQkJfQotCQl9Ci0JfQotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLVZPSUQgQnNzQ2lwaGVyUGFyc2UoCi0JSU4gT1VUCVBCU1NfRU5UUlkJcEJzcykKLXsKLQlQRUlEX1NUUlVDVAkJIHBFaWQ7Ci0JUFVDSEFSCQkJCXBUbXA7Ci0JUFJTTl9JRV9IRUFERVJfU1RSVUNUCQkJcFJzbkhlYWRlcjsKLQlQQ0lQSEVSX1NVSVRFX1NUUlVDVAkJCXBDaXBoZXI7Ci0JUEFLTV9TVUlURV9TVFJVQ1QJCQkJcEFLTTsKLQlVU0hPUlQJCQkJCQkJQ291bnQ7Ci0JSU5UCQkJCQkJCQlMZW5ndGg7Ci0JTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJVG1wQ2lwaGVyOwotCi0JLy8KLQkvLyBXZXBTdGF0dXMgd2lsbCBiZSByZXNldCBsYXRlciwgaWYgQVAgYW5ub3VuY2UgVEtJUCBvciBBRVMgb24gdGhlIGJlYWNvbiBmcmFtZS4KLQkvLwotCWlmIChwQnNzLT5Qcml2YWN5KQotCXsKLQkJcEJzcy0+V2VwU3RhdHVzCQk9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwotCX0KLQllbHNlCi0JewotCQlwQnNzLT5XZXBTdGF0dXMJCT0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCX0KLQkvLyBTZXQgZGVmYXVsdCB0byBkaXNhYmxlICYgb3BlbiBhdXRoZW50aWNhdGlvbiBiZWZvcmUgcGFyc2luZyB2YXJpYWJsZSBJRQotCXBCc3MtPkF1dGhNb2RlCQk9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0JcEJzcy0+QXV0aE1vZGVBdXgJPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotCi0JLy8gSW5pdCBXUEEgc2V0dGluZwotCXBCc3MtPldQQS5QYWlyQ2lwaGVyCT0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCXBCc3MtPldQQS5Hcm91cENpcGhlcgk9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQlwQnNzLT5XUEEuUnNuQ2FwYWJpbGl0eSA9IDA7Ci0JcEJzcy0+V1BBLmJNaXhNb2RlCQk9IEZBTFNFOwotCi0JLy8gSW5pdCBXUEEyIHNldHRpbmcKLQlwQnNzLT5XUEEyLlBhaXJDaXBoZXIJID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCXBCc3MtPldQQTIuUGFpckNpcGhlckF1eCA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyCSA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQlwQnNzLT5XUEEyLlJzbkNhcGFiaWxpdHkgPSAwOwotCXBCc3MtPldQQTIuYk1peE1vZGUJID0gRkFMU0U7Ci0KLQotCUxlbmd0aCA9IChJTlQpIHBCc3MtPlZhcklFTGVuOwotCi0Jd2hpbGUgKExlbmd0aCA+IDApCi0JewotCQkvLyBQYXJzZSBjaXBoZXIgc3VpdGUgYmFzZSBvbiBXUEExICYgV1BBMiwgdGhleSBzaG91bGQgYmUgcGFyc2VkIGRpZmZlcmVudGx5Ci0JCXBUbXAgPSAoKFBVQ0hBUikgcEJzcy0+VmFySUVzKSArIHBCc3MtPlZhcklFTGVuIC0gTGVuZ3RoOwotCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVG1wOwotCQlzd2l0Y2ggKHBFaWQtPkVpZCkKLQkJewotCQkJY2FzZSBJRV9XUEE6Ci0JCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgU0VTX09VSSwgMykgJiYgKHBFaWQtPkxlbiA9PSA3KSkKLQkJCQl7Ci0JCQkJCXBCc3MtPmJTRVMgPSBUUlVFOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSAhPSAxKQotCQkJCXsKLQkJCQkJLy8gaWYgdW5zdXBwb3J0ZWQgdmVuZG9yIHNwZWNpZmljIElFCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvLyBTa2lwIE9VSSwgdmVyc2lvbiwgYW5kIG11bHRpY2FzdCBzdWl0ZQotCQkJCS8vIFRoaXMgcGFydCBzaG91bGQgYmUgaW1wcm92ZWQgaW4gdGhlIGZ1dHVyZSB3aGVuIEFQIHN1cHBvcnRlZCBtdWx0aXBsZSBjaXBoZXIgc3VpdGUuCi0JCQkJLy8gRm9yIG5vdywgaXQncyBPSyBzaW5jZSBhbG1vc3QgYWxsIEFQcyBoYXZlIGZpeGVkIGNpcGhlciBzdWl0ZSBzdXBwb3J0ZWQuCi0JCQkJLy8gcFRtcCA9IChQVUNIQVIpIHBFaWQtPk9jdGV0OwotCQkJCXBUbXAgICArPSAxMTsKLQotCQkJCS8vIENpcGhlciBTdWl0ZSBTZWxlY3RvcnMgZnJvbSBTcGVjIFA4MDIuMTFpL0QzLjIgUDI2LgotCQkJCS8vCVZhbHVlCSAgIE1lYW5pbmcKLQkJCQkvLwkwCQkJTm9uZQotCQkJCS8vCTEJCQlXRVAtNDAKLQkJCQkvLwkyCQkJVGtpcAotCQkJCS8vCTMJCQlXUkFQCi0JCQkJLy8JNAkJCUFFUwotCQkJCS8vCTUJCQlXRVAtMTA0Ci0JCQkJLy8gUGFyc2UgZ3JvdXAgY2lwaGVyCi0JCQkJc3dpdGNoICgqcFRtcCkKLQkJCQl7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDU6Ci0JCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMjoKLQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSA0OgotCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8vIG51bWJlciBvZiB1bmljYXN0IHN1aXRlCi0JCQkJcFRtcCAgICs9IDE7Ci0KLQkJCQkvLyBza2lwIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZXMKLQkJCQkvL0NvdW50ID0gKihQVVNIT1JUKSBwVG1wOwotCQkJCUNvdW50ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKLQkJCQlwVG1wICAgKz0gc2l6ZW9mKFVTSE9SVCk7Ci0KLQkJCQkvLyBQYXJzaW5nIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZQotCQkJCXdoaWxlIChDb3VudCA+IDApCi0JCQkJewotCQkJCQkvLyBTa2lwIE9VSQotCQkJCQlwVG1wICs9IDM7Ci0JCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQkJCQkJc3dpdGNoICgqcFRtcCkKLQkJCQkJewotCQkJCQkJY2FzZSAxOgotCQkJCQkJY2FzZSA1OiAvLyBBbHRob3VnaCBXRVAgaXMgbm90IGFsbG93ZWQgaW4gV1BBIHJlbGF0ZWQgYXV0aCBtb2RlLCB3ZSBwYXJzZSBpdCBhbnl3YXkKLQkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAyOgotCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDQ6Ci0JCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKFRtcENpcGhlciA+IHBCc3MtPldQQS5QYWlyQ2lwaGVyKQotCQkJCQl7Ci0JCQkJCQkvLyBNb3ZlIHRoZSBsb3dlciBjaXBoZXIgc3VpdGUgdG8gUGFpckNpcGhlckF1eAotCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEuUGFpckNpcGhlcjsKLQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyCT0gVG1wQ2lwaGVyOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBUbXBDaXBoZXI7Ci0JCQkJCX0KLQkJCQkJcFRtcCsrOwotCQkJCQlDb3VudC0tOwotCQkJCX0KLQotCQkJCS8vIDQuIGdldCBBS00gc3VpdGUgY291bnRzCi0JCQkJLy9Db3VudAk9ICooUFVTSE9SVCkgcFRtcDsKLQkJCQlDb3VudCA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07Ci0JCQkJcFRtcCAgICs9IHNpemVvZihVU0hPUlQpOwotCQkJCXBUbXAgICArPSAzOwotCi0JCQkJc3dpdGNoICgqcFRtcCkKLQkJCQl7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQS1lbnRlcnByaXNlIG1vZGUKLQkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQotCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOwotCQkJCQkJZWxzZQotCQkJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMjoKLQkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQS1QU0sgbW9kZQotCQkJCQkJaWYgKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCi0JCQkJCQkJcEJzcy0+QXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlwVG1wICAgKz0gMTsKLQotCQkJCS8vIEZpeGVkIGZvciBXUEEtTm9uZQotCQkJCWlmIChwQnNzLT5Cc3NUeXBlID09IEJTU19BREhPQykKLQkJCQl7Ci0JCQkJCXBCc3MtPkF1dGhNb2RlCSAgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOwotCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7Ci0JCQkJCXBCc3MtPldlcFN0YXR1cyAgID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOwotCQkJCQkvLyBQYXRjaGVkIGJ1Z3MgZm9yIG9sZCBkcml2ZXIKLQkJCQkJaWYgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXBCc3MtPldlcFN0YXR1cyAgID0gcEJzcy0+V1BBLlBhaXJDaXBoZXI7Ci0KLQkJCQkvLyBDaGVjayB0aGUgUGFpciAmIEdyb3VwLCBpZiBkaWZmZXJlbnQsIHR1cm4gb24gbWl4ZWQgbW9kZSBmbGFnCi0JCQkJaWYgKHBCc3MtPldQQS5Hcm91cENpcGhlciAhPSBwQnNzLT5XUEEuUGFpckNpcGhlcikKLQkJCQkJcEJzcy0+V1BBLmJNaXhNb2RlID0gVFJVRTsKLQotCQkJCWJyZWFrOwotCi0JCQljYXNlIElFX1JTTjoKLQkJCQlwUnNuSGVhZGVyID0gKFBSU05fSUVfSEVBREVSX1NUUlVDVCkgcFRtcDsKLQotCQkJCS8vIDAuIFZlcnNpb24gbXVzdCBiZSAxCi0JCQkJaWYgKGxlMmNwdTE2KHBSc25IZWFkZXItPlZlcnNpb24pICE9IDEpCi0JCQkJCWJyZWFrOwotCQkJCXBUbXAgICArPSBzaXplb2YoUlNOX0lFX0hFQURFUl9TVFJVQ1QpOwotCi0JCQkJLy8gMS4gQ2hlY2sgZ3JvdXAgY2lwaGVyCi0JCQkJcENpcGhlciA9IChQQ0lQSEVSX1NVSVRFX1NUUlVDVCkgcFRtcDsKLQkJCQlpZiAoIVJUTVBFcXVhbE1lbW9yeShwVG1wLCBSU05fT1VJLCAzKSkKLQkJCQkJYnJlYWs7Ci0KLQkJCQkvLyBQYXJzZSBncm91cCBjaXBoZXIKLQkJCQlzd2l0Y2ggKHBDaXBoZXItPlR5cGUpCi0JCQkJewotCQkJCQljYXNlIDE6Ci0JCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgNToKLQkJCQkJCXBCc3MtPldQQTIuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMjoKLQkJCQkJCXBCc3MtPldQQTIuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgNDoKLQkJCQkJCXBCc3MtPldQQTIuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy8gc2V0IHRvIGNvcnJlY3Qgb2Zmc2V0IGZvciBuZXh0IHBhcnNpbmcKLQkJCQlwVG1wICAgKz0gc2l6ZW9mKENJUEhFUl9TVUlURV9TVFJVQ1QpOwotCi0JCQkJLy8gMi4gR2V0IHBhaXJ3aXNlIGNpcGhlciBjb3VudHMKLQkJCQkvL0NvdW50ID0gKihQVVNIT1JUKSBwVG1wOwotCQkJCUNvdW50ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKLQkJCQlwVG1wICAgKz0gc2l6ZW9mKFVTSE9SVCk7Ci0KLQkJCQkvLyAzLiBHZXQgcGFpcndpc2UgY2lwaGVyCi0JCQkJLy8gUGFyc2luZyBhbGwgdW5pY2FzdCBjaXBoZXIgc3VpdGUKLQkJCQl3aGlsZSAoQ291bnQgPiAwKQotCQkJCXsKLQkJCQkJLy8gU2tpcCBPVUkKLQkJCQkJcENpcGhlciA9IChQQ0lQSEVSX1NVSVRFX1NUUlVDVCkgcFRtcDsKLQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCQkJCQlzd2l0Y2ggKHBDaXBoZXItPlR5cGUpCi0JCQkJCXsKLQkJCQkJCWNhc2UgMToKLQkJCQkJCWNhc2UgNTogLy8gQWx0aG91Z2ggV0VQIGlzIG5vdCBhbGxvd2VkIGluIFdQQSByZWxhdGVkIGF1dGggbW9kZSwgd2UgcGFyc2UgaXQgYW55d2F5Ci0JCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMjoKLQkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA0OgotCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmIChUbXBDaXBoZXIgPiBwQnNzLT5XUEEyLlBhaXJDaXBoZXIpCi0JCQkJCXsKLQkJCQkJCS8vIE1vdmUgdGhlIGxvd2VyIGNpcGhlciBzdWl0ZSB0byBQYWlyQ2lwaGVyQXV4Ci0JCQkJCQlwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXI7Ci0JCQkJCQlwQnNzLT5XUEEyLlBhaXJDaXBoZXIJID0gVG1wQ2lwaGVyOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4ID0gVG1wQ2lwaGVyOwotCQkJCQl9Ci0JCQkJCXBUbXAgKz0gc2l6ZW9mKENJUEhFUl9TVUlURV9TVFJVQ1QpOwotCQkJCQlDb3VudC0tOwotCQkJCX0KLQotCQkJCS8vIDQuIGdldCBBS00gc3VpdGUgY291bnRzCi0JCQkJLy9Db3VudAk9ICooUFVTSE9SVCkgcFRtcDsKLQkJCQlDb3VudCA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07Ci0JCQkJcFRtcCAgICs9IHNpemVvZihVU0hPUlQpOwotCi0JCQkJLy8gNS4gR2V0IEFLTSBjaXBoZXJzCi0JCQkJLy8gUGFyc2luZyBhbGwgQUtNIGNpcGhlcnMKLQkJCQl3aGlsZSAoQ291bnQgPiAwKQotCQkJCXsKLQkJCQkJcEFLTSA9IChQQUtNX1NVSVRFX1NUUlVDVCkgcFRtcDsKLQkJCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkocFRtcCwgUlNOX09VSSwgMykpCi0JCQkJCQlicmVhazsKLQotCQkJCQlzd2l0Y2ggKHBBS00tPlR5cGUpCi0JCQkJCXsKLQkJCQkJCWNhc2UgMToKLQkJCQkJCQkvLyBTZXQgQVAgc3VwcG9ydCBXUEEtZW50ZXJwcmlzZSBtb2RlCi0JCQkJCQkJaWYgKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCi0JCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMjoKLQkJCQkJCQkvLyBTZXQgQVAgc3VwcG9ydCBXUEEtUFNLIG1vZGUKLQkJCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLQkJCQkJCQkJcEJzcy0+QXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLQkJCQkJCQkJcEJzcy0+QXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVNYXg7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZU1heDsKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlwVG1wICAgKz0gKENvdW50ICogc2l6ZW9mKEFLTV9TVUlURV9TVFJVQ1QpKTsKLQkJCQkJQ291bnQtLTsKLQkJCQl9Ci0KLQkJCQkvLyBGaXhlZCBmb3IgV1BBLU5vbmUKLQkJCQlpZiAocEJzcy0+QnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCQkJewotCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7Ci0JCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKLQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXg7Ci0JCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlcgk9IHBCc3MtPldQQTIuR3JvdXBDaXBoZXI7Ci0JCQkJCXBCc3MtPldlcFN0YXR1cwkJCT0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOwotCQkJCQkvLyBQYXRjaGVkIGJ1Z3MgZm9yIG9sZCBkcml2ZXIKLQkJCQkJaWYgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOwotCQkJCX0KLQkJCQlwQnNzLT5XZXBTdGF0dXMgICA9IHBCc3MtPldQQTIuUGFpckNpcGhlcjsKLQotCQkJCS8vIDYuIEdldCBSU04gY2FwYWJpbGl0eQotCQkJCS8vcEJzcy0+V1BBMi5Sc25DYXBhYmlsaXR5ID0gKihQVVNIT1JUKSBwVG1wOwotCQkJCXBCc3MtPldQQTIuUnNuQ2FwYWJpbGl0eSA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07Ci0JCQkJcFRtcCArPSBzaXplb2YoVVNIT1JUKTsKLQotCQkJCS8vIENoZWNrIHRoZSBQYWlyICYgR3JvdXAsIGlmIGRpZmZlcmVudCwgdHVybiBvbiBtaXhlZCBtb2RlIGZsYWcKLQkJCQlpZiAocEJzcy0+V1BBMi5Hcm91cENpcGhlciAhPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXIpCi0JCQkJCXBCc3MtPldQQTIuYk1peE1vZGUgPSBUUlVFOwotCi0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0JCUxlbmd0aCAtPSAocEVpZC0+TGVuICsgMik7Ci0JfQotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBtYWNfdGFibGUuYwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vKiEgXGJyaWVmIGdlbmVyYXRlcyBhIHJhbmRvbSBtYWMgYWRkcmVzcyB2YWx1ZSBmb3IgSUJTUyBCU1NJRAotICoJXHBhcmFtIEFkZHIgdGhlIGJzc2lkIGxvY2F0aW9uCi0gKglccmV0dXJuIG5vbmUKLSAqCVxwcmUKLSAqCVxwb3N0Ci0gKi8KLVZPSUQgTWFjQWRkclJhbmRvbUJzc2lkKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEFkZHIpCi17Ci0JSU5UIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFDX0FERFJfTEVOOyBpKyspCi0JewotCQlwQWRkcltpXSA9IFJhbmRvbUJ5dGUocEFkKTsKLQl9Ci0KLQlwQWRkclswXSA9IChwQWRkclswXSAmIDB4ZmUpIHwgMHgwMjsgIC8vIHRoZSBmaXJzdCAyIGJpdHMgbXVzdCBiZSAwMXh4eHh4eHh4Ci19Ci0KLS8qISBcYnJpZWYgaW5pdCB0aGUgbWFuYWdlbWVudCBtYWMgZnJhbWUgaGVhZGVyCi0gKglccGFyYW0gcF9oZHIgbWFjIGhlYWRlcgotICoJXHBhcmFtIHN1YnR5cGUgc3VidHlwZSBvZiB0aGUgZnJhbWUKLSAqCVxwYXJhbSBwX2RzIGRlc3RpbmF0aW9uIGFkZHJlc3MsIGRvbid0IGNhcmUgaWYgaXQgaXMgYSBicm9hZGNhc3QgYWRkcmVzcwotICoJXHJldHVybiBub25lCi0gKglccHJlIHRoZSBzdGF0aW9uIGhhcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGluIHRoZSBwQWQtPlN0YUNmZwotICoJIC0gYnNzaWQKLSAqCSAtIHN0YXRpb24gYWRkcmVzcwotICoJXHBvc3QKLSAqCVxub3RlIHRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGZvbGxvd2luZyBmaWVsZAotCi0gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICovCi1WT0lEIE1ndE1hY0hlYWRlckluaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKLQlJTiBVQ0hBUiBTdWJUeXBlLAotCUlOIFVDSEFSIFRvRHMsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBQVUNIQVIgcEJzc2lkKQotewotCU5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQotCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX01HTVQ7Ci0JcEhkcjgwMjExLT5GQy5TdWJUeXBlID0gU3ViVHlwZTsKLS8vCWlmIChTdWJUeXBlID09IFNVQlRZUEVfQUNLKQkvLyBzYW1wbGUsIG5vIHVzZSwgaXQgd2lsbCBjb25mbGljdCB3aXRoIEFDVElPTiBmcmFtZSBzdWIgdHlwZQotLy8JCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0NOVEw7Ci0JcEhkcjgwMjExLT5GQy5Ub0RzID0gVG9EczsKLQlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIHBEQSk7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIHBCc3NpZCk7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIG1lbV9tZ210LmMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaGlzIHJvdXRpbmUgYnVpbGQgYW4gb3V0Z29pbmcgZnJhbWUsIGFuZCBmaWxsIGFsbCBpbmZvcm1hdGlvbiBzcGVjaWZpZWQKLSAqIGluIGFyZ3VtZW50IGxpc3QgdG8gdGhlIGZyYW1lIGJvZHkuIFRoZSBhY3R1YWwgZnJhbWUgc2l6ZSBpcyB0aGUgc3VtbWF0aW9uCi0gKiBvZiBhbGwgYXJndW1lbnRzLgotICogaW5wdXQgcGFyYW1zOgotICoJCUJ1ZmZlciAtIHBvaW50ZXIgdG8gYSBwcmUtYWxsb2NhdGVkIG1lbW9yeSBzZWdtZW50Ci0gKgkJYXJncyAtIGEgbGlzdCBvZiA8aW50IGFyZ19zaXplLCBhcmc+IHBhaXJzLgotICoJCU5PVEUgTk9URSBOT1RFISEhISB0aGUgbGFzdCBhcmd1bWVudCBtdXN0IGJlIE5VTEwsIG90aGVyd2lzZSB0aGlzCi0gKgkJCQkJCSAgIGZ1bmN0aW9uIHdpbGwgRkFJTCEhIQotICogcmV0dXJuOgotICoJCVNpemUgb2YgdGhlIGJ1ZmZlcgotICogdXNhZ2U6Ci0gKgkJTWFrZU91dGdvaW5nRnJhbWUoQnVmZmVyLCBvdXRwdXRfbGVuZ3RoLCAyLCAmZmMsIDIsICZkdXIsIDYsIHBfYWRkcjEsIDYscF9hZGRyMiwgRU5EX09GX0FSR1MpOwotCi0gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1VTE9ORyBNYWtlT3V0Z29pbmdGcmFtZSgKLQlPVVQgVUNIQVIgKkJ1ZmZlciwKLQlPVVQgVUxPTkcgKkZyYW1lTGVuLCAuLi4pCi17Ci0JVUNIQVIgICAqcDsKLQlpbnQJbGVuZzsKLQlVTE9ORwlUb3RMZW5nOwotCXZhX2xpc3QgQXJnczsKLQotCS8vIGNhbGN1bGF0ZXMgdGhlIHRvdGFsIGxlbmd0aAotCVRvdExlbmcgPSAwOwotCXZhX3N0YXJ0KEFyZ3MsIEZyYW1lTGVuKTsKLQlkbwotCXsKLQkJbGVuZyA9IHZhX2FyZyhBcmdzLCBpbnQpOwotCQlpZiAobGVuZyA9PSBFTkRfT0ZfQVJHUykKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQkJcCA9IHZhX2FyZyhBcmdzLCBQVk9JRCk7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZCdWZmZXJbVG90TGVuZ10sIHAsIGxlbmcpOwotCQlUb3RMZW5nID0gVG90TGVuZyArIGxlbmc7Ci0JfSB3aGlsZShUUlVFKTsKLQotCXZhX2VuZChBcmdzKTsgLyogY2xlYW4gdXAgKi8KLQkqRnJhbWVMZW4gPSBUb3RMZW5nOwotCXJldHVybiBUb3RMZW5nOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBtbG1lX3F1ZXVlLmMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLyohIFxicmllZglJbml0aWFsaXplIFRoZSBNTE1FIFF1ZXVlLCB1c2VkIGJ5IE1MTUUgRnVuY3Rpb25zCi0gKglccGFyYW0JKlF1ZXVlCSAgIFRoZSBNTE1FIFF1ZXVlCi0gKglccmV0dXJuIEFsd2F5cwkgICBSZXR1cm4gTkRJU19TVEFURV9TVUNDRVNTIGluIHRoaXMgaW1wbGVtZW50YXRpb24KLSAqCVxwcmUKLSAqCVxwb3N0Ci0gKglcbm90ZQlCZWNhdXNlIHRoaXMgaXMgZG9uZSBvbmx5IG9uY2UgKGF0IHRoZSBpbml0IHN0YWdlKSwgbm8gbmVlZCB0byBiZSBsb2NrZWQKLQotIElSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLSAqLwotTkRJU19TVEFUVVMgTWxtZVF1ZXVlSW5pdCgKLQlJTiBNTE1FX1FVRVVFICpRdWV1ZSkKLXsKLQlJTlQgaTsKLQotCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZRdWV1ZS0+TG9jayk7Ci0KLQlRdWV1ZS0+TnVtCT0gMDsKLQlRdWV1ZS0+SGVhZCA9IDA7Ci0JUXVldWUtPlRhaWwgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRTsgaSsrKQotCXsKLQkJUXVldWUtPkVudHJ5W2ldLk9jY3VwaWVkID0gRkFMU0U7Ci0JCVF1ZXVlLT5FbnRyeVtpXS5Nc2dMZW4gPSAwOwotCQlOZGlzWmVyb01lbW9yeShRdWV1ZS0+RW50cnlbaV0uTXNnLCBNR01UX0RNQV9CVUZGRVJfU0laRSk7Ci0JfQotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qISBcYnJpZWYJIEVucXVldWUgYSBtZXNzYWdlIGZvciBvdGhlciB0aHJlYWRzLCBpZiB0aGV5IHdhbnQgdG8gc2VuZCBtZXNzYWdlcyB0byBNTE1FIHRocmVhZAotICoJXHBhcmFtCSpRdWV1ZQkgIFRoZSBNTE1FIFF1ZXVlCi0gKglccGFyYW0JIE1hY2hpbmUgIFRoZSBTdGF0ZSBNYWNoaW5lIElkCi0gKglccGFyYW0JIE1zZ1R5cGUgIFRoZSBNZXNzYWdlIFR5cGUKLSAqCVxwYXJhbQkgTXNnTGVuICAgVGhlIE1lc3NhZ2UgbGVuZ3RoCi0gKglccGFyYW0JKk1zZwkgIFRoZSBtZXNzYWdlIHBvaW50ZXIKLSAqCVxyZXR1cm4gIFRSVUUgaWYgZW5xdWV1ZSBpcyBzdWNjZXNzZnVsLCBGQUxTRSBpZiB0aGUgcXVldWUgaXMgZnVsbAotICoJXHByZQotICoJXHBvc3QKLSAqCVxub3RlCSBUaGUgbWVzc2FnZSBoYXMgdG8gYmUgaW5pdGlhbGl6ZWQKLQotIElSUUwgPSBQQVNTSVZFX0xFVkVMCi0gSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAqLwotQk9PTEVBTiBNbG1lRW5xdWV1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVTE9ORyBNYWNoaW5lLAotCUlOIFVMT05HIE1zZ1R5cGUsCi0JSU4gVUxPTkcgTXNnTGVuLAotCUlOIFZPSUQgKk1zZykKLXsKLQlJTlQgVGFpbDsKLQlNTE1FX1FVRVVFCSpRdWV1ZSA9IChNTE1FX1FVRVVFICopJnBBZC0+TWxtZS5RdWV1ZTsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybiBGQUxTRTsKLQotCS8vIEZpcnN0IGNoZWNrIHRoZSBzaXplLCBpdCBNVVNUIG5vdCBleGNlZWQgdGhlIG1sbWUgcXVldWUgc2l6ZQotCWlmIChNc2dMZW4gPiBNR01UX0RNQV9CVUZGRVJfU0laRSkKLQl7Ci0JCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlOiBtc2cgdG9vIGxhcmdlLCBzaXplID0gJWxkIFxuIiwgTXNnTGVuKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlpZiAoTWxtZVF1ZXVlRnVsbChRdWV1ZSkpCi0JewotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7Ci0JVGFpbCA9IFF1ZXVlLT5UYWlsOwotCVF1ZXVlLT5UYWlsKys7Ci0JUXVldWUtPk51bSsrOwotCWlmIChRdWV1ZS0+VGFpbCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpCi0JewotCQlRdWV1ZS0+VGFpbCA9IDA7Ci0JfQotCi0JUXVldWUtPkVudHJ5W1RhaWxdLldjaWQgPSBSRVNFUlZFRF9XQ0lEOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5PY2N1cGllZCA9IFRSVUU7Ci0JUXVldWUtPkVudHJ5W1RhaWxdLk1hY2hpbmUgPSBNYWNoaW5lOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dUeXBlID0gTXNnVHlwZTsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnTGVuICA9IE1zZ0xlbjsKLQotCWlmIChNc2cgIT0gTlVMTCkKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KFF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2csIE1zZywgTXNnTGVuKTsKLQl9Ci0KLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotLyohIFxicmllZgkgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gUmVjdiBnZXRzIGEgTUxNRSBtZXNzYWdlCi0gKglccGFyYW0JKlF1ZXVlCQkJIFRoZSBNTE1FIFF1ZXVlCi0gKglccGFyYW0JIFRpbWVTdGFtcEhpZ2gJIFRoZSB1cHBlciAzMiBiaXQgb2YgdGltZXN0YW1wCi0gKglccGFyYW0JIFRpbWVTdGFtcExvdwkgVGhlIGxvd2VyIDMyIGJpdCBvZiB0aW1lc3RhbXAKLSAqCVxwYXJhbQkgUnNzaQkJCSBUaGUgcmVjZWl2aW5nIFJTU0kgc3RyZW5ndGgKLSAqCVxwYXJhbQkgTXNnTGVuCQkJIFRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UKLSAqCVxwYXJhbQkqTXNnCQkJIFRoZSBtZXNzYWdlIHBvaW50ZXIKLSAqCVxyZXR1cm4gIFRSVUUgaWYgZXZlcnl0aGluZyBvaywgRkFMU0Ugb3RoZXJ3aXNlIChsaWtlIFF1ZXVlIEZ1bGwpCi0gKglccHJlCi0gKglccG9zdAotCi0gSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAqLwotQk9PTEVBTiBNbG1lRW5xdWV1ZUZvclJlY3YoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUxPTkcgV2NpZCwKLQlJTiBVTE9ORyBUaW1lU3RhbXBIaWdoLAotCUlOIFVMT05HIFRpbWVTdGFtcExvdywKLQlJTiBVQ0hBUiBSc3NpMCwKLQlJTiBVQ0hBUiBSc3NpMSwKLQlJTiBVQ0hBUiBSc3NpMiwKLQlJTiBVTE9ORyBNc2dMZW4sCi0JSU4gVk9JRCAqTXNnLAotCUlOIFVDSEFSIFNpZ25hbCkKLXsKLQlJTlQJCSBUYWlsLCBNYWNoaW5lOwotCVBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOwotCUlOVAkJIE1zZ1R5cGU7Ci0JTUxNRV9RVUVVRQkqUXVldWUgPSAoTUxNRV9RVUVVRSAqKSZwQWQtPk1sbWUuUXVldWU7Ci0KLSNpZmRlZiBSQUxJTktfQVRFCi0JLyogTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZSAqLwotCWlmKEFURV9PTihwQWQpKQotCQlyZXR1cm4gRkFMU0U7Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQl7Ci0JCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlRm9yUmVjdjogZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTXG4iKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKLQlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCi0JewotCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JaWYgKE1sbWVRdWV1ZUZ1bGwoUXVldWUpKQotCXsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlpZiAoIU1zZ1R5cGVTdWJzdChwQWQsIHBGcmFtZSwgJk1hY2hpbmUsICZNc2dUeXBlKSkKLQkJewotCQkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWVGb3JSZWN2OiB1bi1yZWNvbmduaXplZCBtZ210LT5zdWJ0eXBlPSVkXG4iLHBGcmFtZS0+SGRyLkZDLlN1YlR5cGUpKTsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vIE9LLCB3ZSBnb3QgYWxsIHRoZSBpbmZvcm1hdGlvbnMsIGl0IGlzIHRpbWUgdG8gcHV0IHRoaW5ncyBpbnRvIHF1ZXVlCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7Ci0JVGFpbCA9IFF1ZXVlLT5UYWlsOwotCVF1ZXVlLT5UYWlsKys7Ci0JUXVldWUtPk51bSsrOwotCWlmIChRdWV1ZS0+VGFpbCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpCi0JewotCQlRdWV1ZS0+VGFpbCA9IDA7Ci0JfQotCVF1ZXVlLT5FbnRyeVtUYWlsXS5PY2N1cGllZCA9IFRSVUU7Ci0JUXVldWUtPkVudHJ5W1RhaWxdLk1hY2hpbmUgPSBNYWNoaW5lOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dUeXBlID0gTXNnVHlwZTsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnTGVuICA9IE1zZ0xlbjsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uVGltZVN0YW1wLnUuTG93UGFydCA9IFRpbWVTdGFtcExvdzsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uVGltZVN0YW1wLnUuSGlnaFBhcnQgPSBUaW1lU3RhbXBIaWdoOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5Sc3NpMCA9IFJzc2kwOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5Sc3NpMSA9IFJzc2kxOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5Sc3NpMiA9IFJzc2kyOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5TaWduYWwgPSBTaWduYWw7Ci0JUXVldWUtPkVudHJ5W1RhaWxdLldjaWQgPSAoVUNIQVIpV2NpZDsKLQotCVF1ZXVlLT5FbnRyeVtUYWlsXS5DaGFubmVsID0gcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsOwotCi0JaWYgKE1zZyAhPSBOVUxMKQotCXsKLQkJTmRpc01vdmVNZW1vcnkoUXVldWUtPkVudHJ5W1RhaWxdLk1zZywgTXNnLCBNc2dMZW4pOwotCX0KLQotCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOwotCi0JUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qISBcYnJpZWYJIERlcXVldWUgYSBtZXNzYWdlIGZyb20gdGhlIE1MTUUgUXVldWUKLSAqCVxwYXJhbQkqUXVldWUJICBUaGUgTUxNRSBRdWV1ZQotICoJXHBhcmFtCSpFbGVtCSAgVGhlIG1lc3NhZ2UgZGVxdWV1ZWQgZnJvbSBNTE1FIFF1ZXVlCi0gKglccmV0dXJuICBUUlVFIGlmIHRoZSBFbGVtIGNvbnRhaW5zIHNvbWV0aGluZywgRkFMU0Ugb3RoZXJ3aXNlCi0gKglccHJlCi0gKglccG9zdAotCi0gSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAqLwotQk9PTEVBTiBNbG1lRGVxdWV1ZSgKLQlJTiBNTE1FX1FVRVVFICpRdWV1ZSwKLQlPVVQgTUxNRV9RVUVVRV9FTEVNICoqRWxlbSkKLXsKLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKLQkqRWxlbSA9ICYoUXVldWUtPkVudHJ5W1F1ZXVlLT5IZWFkXSk7Ci0JUXVldWUtPk51bS0tOwotCVF1ZXVlLT5IZWFkKys7Ci0JaWYgKFF1ZXVlLT5IZWFkID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkKLQl7Ci0JCVF1ZXVlLT5IZWFkID0gMDsKLQl9Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRAlNbG1lUmVzdGFydFN0YXRlTWFjaGluZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlNTE1FX1FVRVVFX0VMRU0JCSpFbGVtID0gTlVMTDsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlCT09MRUFOCQkJCUNhbmNlbGxlZDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lIFxuIikpOwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKLQlpZihwQWQtPk1sbWUuYlJ1bm5pbmcpCi0JewotCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwotCQlyZXR1cm47Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+TWxtZS5iUnVubmluZyA9IFRSVUU7Ci0JfQotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7Ci0KLQkvLyBSZW1vdmUgYWxsIE1sbWUgcXVldWVzIGVsZW1lbnRzCi0Jd2hpbGUgKCFNbG1lUXVldWVFbXB0eSgmcEFkLT5NbG1lLlF1ZXVlKSkKLQl7Ci0JCS8vRnJvbSBtZXNzYWdlIHR5cGUsIGRldGVybWluZSB3aGljaCBzdGF0ZSBtYWNoaW5lIEkgc2hvdWxkIGRyaXZlCi0JCWlmIChNbG1lRGVxdWV1ZSgmcEFkLT5NbG1lLlF1ZXVlLCAmRWxlbSkpCi0JCXsKLQkJCS8vIGZyZWUgTUxNRSBlbGVtZW50Ci0JCQlFbGVtLT5PY2N1cGllZCA9IEZBTFNFOwotCQkJRWxlbS0+TXNnTGVuID0gMDsKLQotCQl9Ci0JCWVsc2UgewotCQkJREJHUFJJTlRfRVJSKCgiTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmU6IE1sbWVRdWV1ZSBlbXB0eVxuIikpOwotCQl9Ci0JfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCVVDSEFSIGk7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JCS8vIENhbmNlbCBhbGwgdGltZXIgZXZlbnRzCi0JCS8vIEJlIGNhcmVmdWwgdG8gY2FuY2VsIG5ldyBhZGRlZCB0aW1lcgotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLAkgICZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsICAgJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsICAmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsCSAgICZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsCSAgICZDYW5jZWxsZWQpOwotCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCi0JCXsKLQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZDYW5jZWxsZWQpOwotCQl9Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JLy8gQ2hhbmdlIGJhY2sgdG8gb3JpZ2luYWwgY2hhbm5lbCBpbiBjYXNlIG9mIGRvaW5nIHNjYW4KLQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKLQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQotCS8vIFJlc3VtZSBNU0RVIHdoaWNoIGlzIHR1cm5lZCBvZmYgZHVybmluZyBzY2FuCi0JUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24ocEFkKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQkvLyBTZXQgYWxsIHN0YXRlIG1hY2hpbmVzIGJhY2sgSURMRQotCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICAgID0gQ05UTF9JRExFOwotCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSAgID0gQVNTT0NfSURMRTsKLQkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IEFVVEhfUkVRX0lETEU7Ci0JCXBBZC0+TWxtZS5BdXRoUnNwTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JTUF9JRExFOwotCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlICAgID0gU1lOQ19JRExFOwotCQlwQWQtPk1sbWUuQWN0TWFjaGluZS5DdXJyU3RhdGUgICAgPSBBQ1RfSURMRTsKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJcEFkLT5NbG1lLkRsc01hY2hpbmUuQ3VyclN0YXRlICAgID0gRExTX0lETEU7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JLy8gUmVtb3ZlIHJ1bm5pbmcgc3RhdGUKLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwotCXBBZC0+TWxtZS5iUnVubmluZyA9IEZBTFNFOwotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi19Ci0KLS8qISBcYnJpZWYJdGVzdCBpZiB0aGUgTUxNRSBRdWV1ZSBpcyBlbXB0eQotICoJXHBhcmFtCSpRdWV1ZQkgIFRoZSBNTE1FIFF1ZXVlCi0gKglccmV0dXJuIFRSVUUgaWYgdGhlIFF1ZXVlIGlzIGVtcHR5LCBGQUxTRSBvdGhlcndpc2UKLSAqCVxwcmUKLSAqCVxwb3N0Ci0KLSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICovCi1CT09MRUFOIE1sbWVRdWV1ZUVtcHR5KAotCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKQotewotCUJPT0xFQU4gQW5zOwotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7Ci0JQW5zID0gKFF1ZXVlLT5OdW0gPT0gMCk7Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7Ci0KLQlyZXR1cm4gQW5zOwotfQotCi0vKiEgXGJyaWVmCSB0ZXN0IGlmIHRoZSBNTE1FIFF1ZXVlIGlzIGZ1bGwKLSAqCVxwYXJhbQkgKlF1ZXVlCQkgVGhlIE1MTUUgUXVldWUKLSAqCVxyZXR1cm4gIFRSVUUgaWYgdGhlIFF1ZXVlIGlzIGVtcHR5LCBGQUxTRSBvdGhlcndpc2UKLSAqCVxwcmUKLSAqCVxwb3N0Ci0KLSBJUlFMID0gUEFTU0lWRV9MRVZFTAotIElSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gKi8KLUJPT0xFQU4gTWxtZVF1ZXVlRnVsbCgKLQlJTiBNTE1FX1FVRVVFICpRdWV1ZSkKLXsKLQlCT09MRUFOIEFuczsKLQotCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOwotCUFucyA9IChRdWV1ZS0+TnVtID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSB8fCBRdWV1ZS0+RW50cnlbUXVldWUtPlRhaWxdLk9jY3VwaWVkKTsKLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKLQotCXJldHVybiBBbnM7Ci19Ci0KLS8qISBcYnJpZWYJIFRoZSBkZXN0cnVjdG9yIG9mIE1MTUUgUXVldWUKLSAqCVxwYXJhbQotICoJXHJldHVybgotICoJXHByZQotICoJXHBvc3QKLSAqCVxub3RlCUNsZWFyIE1sbWUgUXVldWUsIFNldCBRdWV1ZS0+TnVtIHRvIFplcm8uCi0KLSBJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0gKi8KLVZPSUQgTWxtZVF1ZXVlRGVzdHJveSgKLQlJTiBNTE1FX1FVRVVFICpwUXVldWUpCi17Ci0JTmRpc0FjcXVpcmVTcGluTG9jaygmKHBRdWV1ZS0+TG9jaykpOwotCXBRdWV1ZS0+TnVtICA9IDA7Ci0JcFF1ZXVlLT5IZWFkID0gMDsKLQlwUXVldWUtPlRhaWwgPSAwOwotCU5kaXNSZWxlYXNlU3BpbkxvY2soJihwUXVldWUtPkxvY2spKTsKLQlOZGlzRnJlZVNwaW5Mb2NrKCYocFF1ZXVlLT5Mb2NrKSk7Ci19Ci0KLQotLyohIFxicmllZgkgVG8gc3Vic3RpdHV0ZSB0aGUgbWVzc2FnZSB0eXBlIGlmIHRoZSBtZXNzYWdlIGlzIGNvbWluZyBmcm9tIGV4dGVybmFsCi0gKglccGFyYW0JcEZyYW1lCQkgICBUaGUgZnJhbWUgcmVjZWl2ZWQKLSAqCVxwYXJhbQkqTWFjaGluZQkgICBUaGUgc3RhdGUgbWFjaGluZQotICoJXHBhcmFtCSpNc2dUeXBlCSAgIHRoZSBtZXNzYWdlIHR5cGUgZm9yIHRoZSBzdGF0ZSBtYWNoaW5lCi0gKglccmV0dXJuIFRSVUUgaWYgdGhlIHN1YnN0aXR1dGlvbiBpcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UKLSAqCVxwcmUKLSAqCVxwb3N0Ci0KLSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICovCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1CT09MRUFOIE1zZ1R5cGVTdWJzdCgKLQlJTiBQUlRNUF9BREFQVEVSICBwQWQsCi0JSU4gUEZSQU1FXzgwMl8xMSBwRnJhbWUsCi0JT1VUIElOVCAqTWFjaGluZSwKLQlPVVQgSU5UICpNc2dUeXBlKQotewotCVVTSE9SVAlTZXEsIEFsZzsKLQlVQ0hBUglFQVBUeXBlOwotCVBVQ0hBUglwRGF0YTsKLQotCS8vIFBvaW50ZXIgdG8gc3RhcnQgb2YgZGF0YSBmcmFtZXMgaW5jbHVkaW5nIFNOQVAgaGVhZGVyCi0JcERhdGEgPSAoUFVDSEFSKSBwRnJhbWUgKyBMRU5HVEhfODAyXzExOwotCi0JLy8gVGhlIG9ubHkgZGF0YSB0eXBlIHdpbGwgcGFzcyB0byB0aGlzIGZ1bmN0aW9uIGlzIEVBUE9MIGZyYW1lCi0JaWYgKHBGcmFtZS0+SGRyLkZDLlR5cGUgPT0gQlRZUEVfREFUQSkKLQl7Ci0JCXsKLQkgICAgICAgICpNYWNoaW5lID0gV1BBX1NUQVRFX01BQ0hJTkU7Ci0JCQlFQVBUeXBlID0gKigoVUNIQVIqKXBGcmFtZSArIExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCArIDEpOwotCSAgICAgICAgcmV0dXJuIChXcGFNc2dUeXBlU3Vic3QoRUFQVHlwZSwgKElOVCAqKSBNc2dUeXBlKSk7Ci0JCX0KLQl9Ci0KLQlzd2l0Y2ggKHBGcmFtZS0+SGRyLkZDLlN1YlR5cGUpCi0JewotCQljYXNlIFNVQlRZUEVfQVNTT0NfUkVROgotCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BU1NPQ19SRVE7Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX0FTU09DX1JTUDoKLQkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVNTT0NfUlNQOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9SRUFTU09DX1JFUToKLQkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfUkVBU1NPQ19SRVE7Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX1JFQVNTT0NfUlNQOgotCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9SRUFTU09DX1JTUDsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfUFJPQkVfUkVROgotCQkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1BST0JFX1JFUTsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfUFJPQkVfUlNQOgotCQkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1BST0JFX1JTUDsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfQkVBQ09OOgotCQkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0JFQUNPTjsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfQVRJTToKLQkJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BVElNOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9ESVNBU1NPQzoKLQkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfRElTQVNTT0NfUkVROwotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9BVVRIOgotCQkJLy8gZ2V0IHRoZSBzZXF1ZW5jZSBudW1iZXIgZnJvbSBwYXlsb2FkIDI0IE1hYyBIZWFkZXIgKyAyIGJ5dGVzIGFsZ29yaXRobQotCQkJTmRpc01vdmVNZW1vcnkoJlNlcSwgJnBGcmFtZS0+T2N0ZXRbMl0sIHNpemVvZihVU0hPUlQpKTsKLQkJCU5kaXNNb3ZlTWVtb3J5KCZBbGcsICZwRnJhbWUtPk9jdGV0WzBdLCBzaXplb2YoVVNIT1JUKSk7Ci0JCQlpZiAoU2VxID09IDEgfHwgU2VxID09IDMpCi0JCQl7Ci0JCQkJKk1hY2hpbmUgPSBBVVRIX1JTUF9TVEFURV9NQUNISU5FOwotCQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVVUSF9PREQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChTZXEgPT0gMiB8fCBTZXEgPT0gNCkKLQkJCXsKLQkJCQlpZiAoQWxnID09IEFVVEhfTU9ERV9PUEVOIHx8IEFsZyA9PSBBVVRIX01PREVfS0VZKQotCQkJCXsKLQkJCQkJKk1hY2hpbmUgPSBBVVRIX1NUQVRFX01BQ0hJTkU7Ci0JCQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVVUSF9FVkVOOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX0RFQVVUSDoKLQkJCSpNYWNoaW5lID0gQVVUSF9SU1BfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfREVBVVRIOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9BQ1RJT046Ci0JCQkqTWFjaGluZSA9IEFDVElPTl9TVEFURV9NQUNISU5FOwotCQkJLy8gIFNvbWV0aW1lcyBTdGEgd2lsbCByZXR1cm4gd2l0aCBjYXRlZ29yeSBieXRlcyB3aXRoIE1TQiA9IDEsIGlmIHRoZXkgcmVjZWl2ZSBjYXRvZ29yeSBvdXQgb2YgdGhlaXIgc3VwcG9ydAotCQkJaWYgKChwRnJhbWUtPk9jdGV0WzBdJjB4N0YpID4gTUFYX1BFRVJfQ0FURV9NU0cpCi0JCQl7Ci0JCQkJKk1zZ1R5cGUgPSBNVDJfQUNUX0lOVkFMSUQ7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJKk1zZ1R5cGUgPSAocEZyYW1lLT5PY3RldFswXSYweDdGKTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIEZBTFNFOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIHN0YXRlX21hY2hpbmUuYwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vKiEgXGJyaWVmIEluaXRpYWxpemUgdGhlIHN0YXRlIG1hY2hpbmUuCi0gKglccGFyYW0gKlMJCQlwb2ludGVyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lCi0gKglccGFyYW0JVHJhbnMJCVN0YXRlIG1hY2hpbmUgdHJhbnNpdGlvbiBmdW5jdGlvbgotICoJXHBhcmFtCVN0TnIJCW51bWJlciBvZiBzdGF0ZXMKLSAqCVxwYXJhbQlNc2dOcgkJbnVtYmVyIG9mIG1lc3NhZ2VzCi0gKglccGFyYW0JRGVmRnVuYwkJZGVmYXVsdCBmdW5jdGlvbiwgd2hlbiB0aGVyZSBpcyBpbnZhbGlkIHN0YXRlL21lc3NhZ2UgY29tYmluYXRpb24KLSAqCVxwYXJhbQlJbml0U3RhdGUJaW5pdGlhbCBzdGF0ZSBvZiB0aGUgc3RhdGUgbWFjaGluZQotICoJXHBhcmFtCUJhc2UJCVN0YXRlTWFjaGluZSBiYXNlLCBpbnRlcm5hbCB1c2Ugb25seQotICoJXHByZSBwX3NtIHNob3VsZCBiZSBhIGxlZ2FsIHBvaW50ZXIKLSAqCVxwb3N0Ci0KLSBJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0gKi8KLVZPSUQgU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiBTVEFURV9NQUNISU5FICpTLAotCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdLAotCUlOIFVMT05HIFN0TnIsCi0JSU4gVUxPTkcgTXNnTnIsCi0JSU4gU1RBVEVfTUFDSElORV9GVU5DIERlZkZ1bmMsCi0JSU4gVUxPTkcgSW5pdFN0YXRlLAotCUlOIFVMT05HIEJhc2UpCi17Ci0JVUxPTkcgaSwgajsKLQotCS8vIHNldCBudW1iZXIgb2Ygc3RhdGVzIGFuZCBtZXNzYWdlcwotCVMtPk5yU3RhdGUgPSBTdE5yOwotCVMtPk5yTXNnICAgPSBNc2dOcjsKLQlTLT5CYXNlICAgID0gQmFzZTsKLQotCVMtPlRyYW5zRnVuYyAgPSBUcmFuczsKLQotCS8vIGluaXQgYWxsIHN0YXRlIHRyYW5zaXRpb24gdG8gZGVmYXVsdCBmdW5jdGlvbgotCWZvciAoaSA9IDA7IGkgPCBTdE5yOyBpKyspCi0JewotCQlmb3IgKGogPSAwOyBqIDwgTXNnTnI7IGorKykKLQkJewotCQkJUy0+VHJhbnNGdW5jW2kgKiBNc2dOciArIGpdID0gRGVmRnVuYzsKLQkJfQotCX0KLQotCS8vIHNldCB0aGUgc3RhcnRpbmcgc3RhdGUKLQlTLT5DdXJyU3RhdGUgPSBJbml0U3RhdGU7Ci19Ci0KLS8qISBcYnJpZWYgVGhpcyBmdW5jdGlvbiBmaWxscyBpbiB0aGUgZnVuY3Rpb24gcG9pbnRlciBpbnRvIHRoZSBjZWxsIGluIHRoZSBzdGF0ZSBtYWNoaW5lCi0gKglccGFyYW0gKlMJcG9pbnRlciB0byB0aGUgc3RhdGUgbWFjaGluZQotICoJXHBhcmFtIFN0CXN0YXRlCi0gKglccGFyYW0gTXNnCWluY29taW5nIG1lc3NhZ2UKLSAqCVxwYXJhbSBmCXRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIChzdGF0ZSwgbWVzc2FnZSkgY29tYmluYXRpb24gb2NjdXJzIGF0IHRoZSBzdGF0ZSBtYWNoaW5lCi0gKglccHJlICpTIHNob3VsZCBiZSBhIGxlZ2FsIHBvaW50ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUsIHN0LCBtc2csIHNob3VsZCBiZSBhbGwgd2l0aGluIHRoZSByYW5nZSwgQmFzZSBzaG91bGQgYmUgc2V0IGluIHRoZSBpbml0aWFsIHN0YXRlCi0gKglccG9zdAotCi0gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotICovCi1WT0lEIFN0YXRlTWFjaGluZVNldEFjdGlvbigKLQlJTiBTVEFURV9NQUNISU5FICpTLAotCUlOIFVMT05HIFN0LAotCUlOIFVMT05HIE1zZywKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkMgRnVuYykKLXsKLQlVTE9ORyBNc2dJZHg7Ci0KLQlNc2dJZHggPSBNc2cgLSBTLT5CYXNlOwotCi0JaWYgKFN0IDwgUy0+TnJTdGF0ZSAmJiBNc2dJZHggPCBTLT5Ock1zZykKLQl7Ci0JCS8vIGJvdW5kYXJ5IGNoZWNraW5nIGJlZm9yZSBzZXR0aW5nIHRoZSBhY3Rpb24KLQkJUy0+VHJhbnNGdW5jW1N0ICogUy0+TnJNc2cgKyBNc2dJZHhdID0gRnVuYzsKLQl9Ci19Ci0KLS8qISBcYnJpZWYJIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgc3RhdGUgdHJhbnNpdGlvbgotICoJXHBhcmFtCSAqQWRhcHRlciB0aGUgTklDIGFkYXB0ZXIgcG9pbnRlcgotICoJXHBhcmFtCSAqUwkgIHRoZSBzdGF0ZSBtYWNoaW5lCi0gKglccGFyYW0JICpFbGVtCSAgdGhlIG1lc3NhZ2UgdG8gYmUgZXhlY3V0ZWQKLSAqCVxyZXR1cm4gICBOb25lCi0KLSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICovCi1WT0lEIFN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gU1RBVEVfTUFDSElORSAqUywKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JKCooUy0+VHJhbnNGdW5jW1MtPkN1cnJTdGF0ZSAqIFMtPk5yTXNnICsgRWxlbS0+TXNnVHlwZSAtIFMtPkJhc2VdKSkocEFkLCBFbGVtKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlUaGUgZHJvcCBmdW5jdGlvbiwgd2hlbiBtYWNoaW5lIGV4ZWN1dGVzIHRoaXMsIHRoZSBtZXNzYWdlIGlzIHNpbXBseQotCQlpZ25vcmVkLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZywgdGhlIG1lc3NhZ2UgaXMgZnJlZWQgaW4KLQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbigpCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBEcm9wKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gbGZzci5jCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIExmc3JJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVMT05HIFNlZWQpCi17Ci0JaWYgKFNlZWQgPT0gMCkKLQkJcEFkLT5NbG1lLlNoaWZ0UmVnID0gMTsKLQllbHNlCi0JCXBBZC0+TWxtZS5TaGlmdFJlZyA9IFNlZWQ7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1VQ0hBUiBSYW5kb21CeXRlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVVMT05HIGk7Ci0JVUNIQVIgUiwgUmVzdWx0OwotCi0JUiA9IDA7Ci0KLQlpZiAocEFkLT5NbG1lLlNoaWZ0UmVnID09IDApCi0JTmRpc0dldFN5c3RlbVVwVGltZSgoVUxPTkcgKikmcEFkLT5NbG1lLlNoaWZ0UmVnKTsKLQotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JewotCQlpZiAocEFkLT5NbG1lLlNoaWZ0UmVnICYgMHgwMDAwMDAwMSkKLQkJewotCQkJcEFkLT5NbG1lLlNoaWZ0UmVnID0gKChwQWQtPk1sbWUuU2hpZnRSZWcgXiBMRlNSX01BU0spID4+IDEpIHwgMHg4MDAwMDAwMDsKLQkJCVJlc3VsdCA9IDE7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPk1sbWUuU2hpZnRSZWcgPSBwQWQtPk1sbWUuU2hpZnRSZWcgPj4gMTsKLQkJCVJlc3VsdCA9IDA7Ci0JCX0KLQkJUiA9IChSIDw8IDEpIHwgUmVzdWx0OwotCX0KLQotCXJldHVybiBSOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlWZXJpZnkgdGhlIHN1cHBvcnQgcmF0ZSBmb3IgZGlmZmVyZW50IFBIWSB0eXBlCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBDaGVja1JhdGVzKAotCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBPVVQJVUNIQVIJCQlTdXBSYXRlW10sCi0JSU4gT1VUCVVDSEFSCQkJKlN1cFJhdGVMZW4pCi17Ci0JVUNIQVIJUmF0ZUlkeCwgaSwgajsKLQlVQ0hBUglOZXdSYXRlWzEyXSwgTmV3UmF0ZUxlbjsKLQotCU5ld1JhdGVMZW4gPSAwOwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKLQkJUmF0ZUlkeCA9IDQ7Ci0JZWxzZQotCQlSYXRlSWR4ID0gMTI7Ci0KLQkvLyBDaGVjayBmb3Igc3VwcG9ydCByYXRlcyBleGNsdWRlIGJhc2ljIHJhdGUgYml0Ci0JZm9yIChpID0gMDsgaSA8ICpTdXBSYXRlTGVuOyBpKyspCi0JCWZvciAoaiA9IDA7IGogPCBSYXRlSWR4OyBqKyspCi0JCQlpZiAoKFN1cFJhdGVbaV0gJiAweDdmKSA9PSBSYXRlSWRUbzUwMEticHNbal0pCi0JCQkJTmV3UmF0ZVtOZXdSYXRlTGVuKytdID0gU3VwUmF0ZVtpXTsKLQotCSpTdXBSYXRlTGVuID0gTmV3UmF0ZUxlbjsKLQlOZGlzTW92ZU1lbW9yeShTdXBSYXRlLCBOZXdSYXRlLCBOZXdSYXRlTGVuKTsKLX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIERPVDExX05fU1VQUE9SVAotQk9PTEVBTiBSVE1QQ2hlY2tDaGFubmVsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCQlDZW50cmFsQ2hhbm5lbCwKLQlJTiBVQ0hBUgkJQ2hhbm5lbCkKLXsKLQlVQ0hBUgkJazsKLQlVQ0hBUgkJVXBwZXJDaGFubmVsID0gMCwgTG93ZXJDaGFubmVsID0gMDsKLQlVQ0hBUgkJTm9FZmZlY3RDaGFubmVsaW5MaXN0ID0gMDsKLQotCS8vIEZpbmQgdXBwZXIgYW5kIGxvd2VyIGNoYW5uZWwgYWNjb3JkaW5nIHRvIDQwTUh6IGN1cnJlbnQgb3BlcmF0aW9uLgotCWlmIChDZW50cmFsQ2hhbm5lbCA8IENoYW5uZWwpCi0JewotCQlVcHBlckNoYW5uZWwgPSBDaGFubmVsOwotCQlpZiAoQ2VudHJhbENoYW5uZWwgPiAyKQotCQkJTG93ZXJDaGFubmVsID0gQ2VudHJhbENoYW5uZWwgLSAyOwotCQllbHNlCi0JCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWVsc2UgaWYgKENlbnRyYWxDaGFubmVsID4gQ2hhbm5lbCkKLQl7Ci0JCVVwcGVyQ2hhbm5lbCA9IENlbnRyYWxDaGFubmVsICsgMjsKLQkJTG93ZXJDaGFubmVsID0gQ2hhbm5lbDsKLQl9Ci0KLQlmb3IgKGsgPSAwO2sgPCBwQWQtPkNoYW5uZWxMaXN0TnVtO2srKykKLQl7Ci0JCWlmIChwQWQtPkNoYW5uZWxMaXN0W2tdLkNoYW5uZWwgPT0gVXBwZXJDaGFubmVsKQotCQl7Ci0JCQlOb0VmZmVjdENoYW5uZWxpbkxpc3QgKys7Ci0JCX0KLQkJaWYgKHBBZC0+Q2hhbm5lbExpc3Rba10uQ2hhbm5lbCA9PSBMb3dlckNoYW5uZWwpCi0JCXsKLQkJCU5vRWZmZWN0Q2hhbm5lbGluTGlzdCArKzsKLQkJfQotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiVG90YWwgQ2hhbm5lbCBpbiBDaGFubmVsIExpc3QgPSBbJWRdXG4iLCBOb0VmZmVjdENoYW5uZWxpbkxpc3QpKTsKLQlpZiAoTm9FZmZlY3RDaGFubmVsaW5MaXN0ID09IDIpCi0JCXJldHVybiBUUlVFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJVmVyaWZ5IHRoZSBzdXBwb3J0IHJhdGUgZm9yIEhUIHBoeSB0eXBlCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCUZBTFNFIGlmIHBBZC0+Q29tbW9uQ2ZnLlN1cHBvcnRlZEh0UGh5IGRvZXNuJ3QgYWNjZXB0IHRoZSBwSHRDYXBhYmlsaXR5LiAgKEFQIE1vZGUpCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTgkJUlRNUENoZWNrSHQoCi0JSU4JUFJUTVBfQURBUFRFUgkJCXBBZCwKLQlJTglVQ0hBUgkJCQkJV2NpZCwKLQlJTglIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKLQlJTglBRERfSFRfSU5GT19JRQkJCSpwQWRkSHRJbmZvKQotewotCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQkvLyBJZiB1c2UgQU1TRFUsIHNldCBmbGFnLgotCWlmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUpCi0JCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCk7Ci0JLy8gU2F2ZSBQZWVyIENhcGFiaWxpdHkKLQlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKLQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7Ci0JaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCi0JCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOwotCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uVHhTVEJDKQotCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7Ci0JaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5SeFNUQkMpCi0JCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKLQlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkKLQl7Ci0JCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKLQl9Ci0KLQlpZiAoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCXsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5NcGR1RGVuc2l0eSA9IHBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKLQl9Ci0KLQkvLyBXaWxsIGNoZWNrIENoYW5uZWxXaWR0aCBmb3IgTUNTU2V0WzRdIGJlbG93Ci0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0gPSAweDE7Ci0gICAgc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSkKLQl7Ci0JCWNhc2UgMToKLQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKLQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHgwMDsKLSAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gMHgwMDsKLSAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzNdID0gMHgwMDsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7Ci0JCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4ZmY7Ci0gICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9IDB4MDA7Ci0gICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFszXSA9IDB4MDA7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOwotCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweGZmOwotICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0gPSAweGZmOwotICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10gPSAweDAwOwotCQkJYnJlYWs7Ci0JfQotCi0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGggJiBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUENoZWNrSHQ6OiBIdENhcEluZm8uQ2hhbm5lbFdpZHRoPSVkLCBSZWNvbVdpZHRoPSVkLCBEZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoPSVkLCBCVzQwTUF2YWlsRm9yQS9HPSVkLyVkLCBQaHlNb2RlPSVkIFxuIiwKLQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoLCBwQWRkSHRJbmZvLT5BZGRIdEluZm8uUmVjb21XaWR0aCwgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCwKLQkJcEFkLT5OaWNDb25maWcyLmZpZWxkLkJXNDBNQXZhaWxGb3JBLCBwQWQtPk5pY0NvbmZpZzIuZmllbGQuQlc0ME1BdmFpbEZvckcsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKLQotCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGID0gIHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5HRiAmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGOwotCi0JLy8gU2VuZCBBc3NvYyBSZXEgd2l0aCBteSBIVCBjYXBhYmlsaXR5LgotCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9ICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplOwotCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9ICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzOwotCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9ICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCkgJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCk7Ci0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSAmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwKTsKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMgPSAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpJihwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDKTsKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgPSAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5SeFNUQkMpJihwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uVHhTVEJDKTsKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IgPSBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWF4UkFtcGR1RmFjdG9yOwotICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlBsdXNIVEM7Ci0JcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5IVENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPSBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUGx1c0hUQzsKLQlpZiAocEFkLT5Db21tb25DZmcuYlJkZykKLQl7Ci0JCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQgPSBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUkRHU3VwcG9ydDsKLSAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IDE7Ci0JfQotCi0gICAgaWYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV18yMCkKLSAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0gPSAweDA7ICAvLyBCVzIwIGNhbid0IHRyYW5zbWl0IE1DUzMyCi0KLQlDT1BZX0FQX0hUU0VUVElOR1NfRlJPTV9CRUFDT04ocEFkLCBwSHRDYXBhYmlsaXR5KTsKLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVZlcmlmeSB0aGUgc3VwcG9ydCByYXRlIGZvciBkaWZmZXJlbnQgUEhZIHR5cGUKLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUFVwZGF0ZU1sbWVSYXRlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVDSEFSCU1pbmltdW1SYXRlOwotCVVDSEFSCVByb3Blck1sbWVSYXRlOyAvLz0gUkFURV81NDsKLQlVQ0hBUglpLCBqLCBSYXRlSWR4ID0gMTI7IC8vMSwgMiwgNS41LCAxMSwgNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NAotCUJPT0xFQU4JYk1hdGNoID0gRkFMU0U7Ci0KLQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpCi0JewotCQljYXNlIFBIWV8xMUI6Ci0JCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMTE7Ci0JCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUJHX01JWEVEOgotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6Ci0JCWNhc2UgUEhZXzExQkdOX01JWEVEOgotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJaWYgKChwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiA9PSA0KSAmJgotCQkJCShwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiA9PSAwKSkKLQkJCQkvLyBCIG9ubHkgQVAKLQkJCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMTE7Ci0JCQllbHNlCi0JCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzI0OwotCi0JCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpCi0JCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKLQkJCWVsc2UKLQkJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUE6Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgUEhZXzExTl8yXzRHOgkvLyBydDI4NjAgbmVlZCB0byBjaGVjayBtbG1lcmF0ZSBmb3IgODAyLjExbgotCQljYXNlIFBIWV8xMUdOX01JWEVEOgotCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFOXzVHOgotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzI0OwotCQkJTWluaW11bVJhdGUgPSBSQVRFXzY7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6Ci0JCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7Ci0JCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpCi0JCQkgICBNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKLQkJCWVsc2UKLQkJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OiAvLyBlcnJvcgotCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzE7Ci0JCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKLQkJCWJyZWFrOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbjsgaSsrKQotCXsKLQkJZm9yIChqID0gMDsgaiA8IFJhdGVJZHg7IGorKykKLQkJewotCQkJaWYgKChwQWQtPk1sbWVBdXguU3VwUmF0ZVtpXSAmIDB4N2YpID09IFJhdGVJZFRvNTAwS2Jwc1tqXSkKLQkJCXsKLQkJCQlpZiAoaiA9PSBQcm9wZXJNbG1lUmF0ZSkKLQkJCQl7Ci0JCQkJCWJNYXRjaCA9IFRSVUU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChiTWF0Y2gpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoYk1hdGNoID09IEZBTFNFKQotCXsKLQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW47IGkrKykKLQl7Ci0JCWZvciAoaiA9IDA7IGogPCBSYXRlSWR4OyBqKyspCi0JCXsKLQkJCWlmICgocEFkLT5NbG1lQXV4LkV4dFJhdGVbaV0gJiAweDdmKSA9PSBSYXRlSWRUbzUwMEticHNbal0pCi0JCQl7Ci0JCQkJCWlmIChqID09IFByb3Blck1sbWVSYXRlKQotCQkJCQl7Ci0JCQkJCQliTWF0Y2ggPSBUUlVFOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCX0KLQkJfQotCi0JCQlpZiAoYk1hdGNoKQotCQkJYnJlYWs7Ci0JfQotCX0KLQotCWlmIChiTWF0Y2ggPT0gRkFMU0UpCi0JewotCQlQcm9wZXJNbG1lUmF0ZSA9IE1pbmltdW1SYXRlOwotCX0KLQotCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gTWluaW11bVJhdGU7Ci0JcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFByb3Blck1sbWVSYXRlOwotCWlmIChwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA+PSBSQVRFXzYpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBVcGRhdGVNbG1lUmF0ZSA9PT4gICBNbG1lVHJhbnNtaXQgPSAweCV4ICBcbiIgLCBwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQud29yZCkpOwotfQotCi1DSEFSIFJUTVBNYXhSc3NpKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIENIQVIJCQkJUnNzaTAsCi0JSU4gQ0hBUgkJCQlSc3NpMSwKLQlJTiBDSEFSCQkJCVJzc2kyKQotewotCUNIQVIJbGFyZ2VyID0gLTEyNzsKLQotCWlmICgocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKSAmJiAoUnNzaTAgIT0gMCkpCi0JewotCQlsYXJnZXIgPSBSc3NpMDsKLQl9Ci0KLQlpZiAoKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMikgJiYgKFJzc2kxICE9IDApKQotCXsKLQkJbGFyZ2VyID0gbWF4KFJzc2kwLCBSc3NpMSk7Ci0JfQotCi0JaWYgKChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpICYmIChSc3NpMiAhPSAwKSkKLQl7Ci0JCWxhcmdlciA9IG1heChsYXJnZXIsIFJzc2kyKTsKLQl9Ci0KLQlpZiAobGFyZ2VyID09IC0xMjcpCi0JCWxhcmdlciA9IDA7Ci0KLQlyZXR1cm4gbGFyZ2VyOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICAgICAgUGVyaW9kaWMgZXZhbHVhdGUgYW50ZW5uYSBsaW5rIHN0YXR1cwotCi0gICAgQXJndW1lbnRzOgotICAgICAgICBwQWQgICAgICAgICAtIEFkYXB0ZXIgcG9pbnRlcgotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBOb25lCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFzaWNFdmFsdWF0ZVJ4QW50KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCVVDSEFSCUJCUFIzID0gMDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIFJBTElOS19BVEUKLQlpZiAoQVRFX09OKHBBZCkpCi0JCXJldHVybjsKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTCXwKLQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MJfAotCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGCQkJfAotCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVAkJfAotCQkJCQkJCWZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpIHx8Ci0JCQkJCQkJT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKQotI2lmZGVmIFJUMzA5MAotCQkJCQkJCXx8IChwQWQtPmJQQ0ljbGtPZmYgPT0gVFJVRSkKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLSNpZmRlZiBBTlRfRElWRVJTSVRZX1NVUFBPUlQKLQkJCQkJCQl8fCAocEFkLT5FZXByb21BY2Nlc3MpCi0jZW5kaWYgLy8gQU5UX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0JCQkJCQkJKQotCQlyZXR1cm47Ci0KLSNpZmRlZiBBTlRfRElWRVJTSVRZX1NVUFBPUlQKLQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpICYmIChwQWQtPkNvbW1vbkNmZy5iUnhBbnREaXZlcnNpdHkgPT0gQU5UX0RJVkVSU0lUWV9FTkFCTEUpKQotCXsKLQkJLy8gdHdvIGFudGVubmEgc2VsZWN0aW9uIG1lY2hhbmlzbS0gb25lIGlzIGFudGVubmEgZGl2ZXJzaXR5LCB0aGUgb3RoZXIgaXMgZmFpbGVkIGFudGVubmEgcmVtb3ZlCi0JCS8vIG9uZSBpcyBhbnRlbm5hIGRpdmVyc2l0eTp0aGVyZSBpcyBvbmx5IG9uZSBhbnRlbm5hIGNhbiByeCBhbmQgdHgKLQkJLy8gdGhlIG90aGVyIGlzIGZhaWxlZCBhbnRlbm5hIHJlbW92ZTp0d28gcGh5c2ljYWwgYW50ZW5uYSBjYW4gcnggYW5kIHR4Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFudERpdiAtIGJlZm9yZSBldmFsdWF0ZSBQYWlyMS1BbnQgKCVkLCVkKVxuIiwKLQkJCQlwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50LCBwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQpKTsKLQotCQkJQXNpY1NldFJ4QW50KHBBZCwgcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50KTsKLQotCQkJcEFkLT5SeEFudC5FdmFsdWF0ZVBlcmlvZCA9IDE7IC8vIDE6TWVhbnMgc3dpdGNoIHRvIFNlY29uZGFyeVJ4QW50LCAwOk1lYW5zIHN3aXRjaCB0byBQYWlyMVByaW1hcnlSeEFudAotCQkJcEFkLT5SeEFudC5GaXJzdFBrdEFycml2ZWRXaGVuRXZhbHVhdGUgPSBGQUxTRTsKLQkJCXBBZC0+UnhBbnQuUmN2UGt0TnVtV2hlbkV2YWx1YXRlID0gMDsKLQotCQkJLy8gYSBvbmUtc2hvdCB0aW1lciB0byBlbmQgdGhlIGV2YWx1dGlvbgotCQkJLy8gZHluYW1pYyBhZGp1c3QgYW50ZW5uYSBldmFsdWF0aW9uIHBlcmlvZCBhY2NvcmRpbmcgdG8gdGhlIHRyYWZmaWMKLQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIDEwMCk7Ci0JCQllbHNlCi0JCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIDMwMCk7Ci0JCX0KLQkJZWxzZQotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwotCXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCi0JCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQotCQkJCXJldHVybjsKLQotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQUjMpOwotCQkJQkJQUjMgJj0gKH4weDE4KTsKLQkJCWlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykKLQkJCXsKLQkJCQlCQlBSMyB8PSAoMHgxMCk7Ci0JCQl9Ci0JCQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKLQkJCXsKLQkJCQlCQlBSMyB8PSAoMHg4KTsKLQkJCX0KLQkJCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCQkJewotCQkJCUJCUFIzIHw9ICgweDApOwotCQkJfQotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQUjMpOwotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCXBBZC0+U3RhQ2ZnLkJCUFIzID0gQkJQUjM7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCi0JCQkpCi0JCQl7Ci0JCQkJVUxPTkcJVHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCi0JCQkJCQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKLQkJCQkJCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7Ci0KLQkJCQkvLyBkeW5hbWljIGFkanVzdCBhbnRlbm5hIGV2YWx1YXRpb24gcGVyaW9kIGFjY29yZGluZyB0byB0aGUgdHJhZmZpYwotCQkJCWlmIChUeFRvdGFsQ250ID4gNTApCi0JCQkJewotCQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwgMjApOwotCQkJCQlwQWQtPk1sbWUuYkxvd1Rocm91Z2hwdXQgPSBGQUxTRTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIDMwMCk7Ci0JCQkJCXBBZC0+TWxtZS5iTG93VGhyb3VnaHB1dCA9IFRSVUU7Ci0JCQkJfQotCQkJfQotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JfQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIEFmdGVyIGV2YWx1YXRpb24sIGNoZWNrIGFudGVubmEgbGluayBzdGF0dXMKLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgcEFkICAgICAgICAgLSBBZGFwdGVyIHBvaW50ZXIKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgTm9uZQotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBc2ljUnhBbnRFdmFsVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JUlRNUF9BREFQVEVSCSpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OwotCUJPT0xFQU4JCQliU3dhcEFudCA9IEZBTFNFOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCVVDSEFSCQkJQkJQUjMgPSAwOwotCUNIQVIJCQlsYXJnZXIgPSAtMTI3LCByc3NpMCwgcnNzaTEsIHJzc2kyOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgUkFMSU5LX0FURQotCWlmIChBVEVfT04ocEFkKSkKLQkJcmV0dXJuOwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MJfAotCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUwl8Ci0JCQkJCQkJZlJUTVBfQURBUFRFUl9SQURJT19PRkYJCQl8Ci0JCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSB8fAotCQkJCQkJCU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkKLSNpZmRlZiBSVDMwOTAKLQkJCQkJCQl8fCAocEFkLT5iUENJY2xrT2ZmID09IFRSVUUpCi0jZW5kaWYgLy8gUlQzMDkwIC8vCi0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi0JCQkJCQkJfHwgKHBBZC0+RWVwcm9tQWNjZXNzKQotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwotCQkJCQkJCSkKLQkJcmV0dXJuOwotCi0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi0JaWYgKChwQWQtPk5pY0NvbmZpZzIuZmllbGQuQW50RGl2ZXJzaXR5KSAmJiAocEFkLT5Db21tb25DZmcuYlJ4QW50RGl2ZXJzaXR5ID09IEFOVF9ESVZFUlNJVFlfRU5BQkxFKSkKLQl7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCWlmICgocEFkLT5SeEFudC5SY3ZQa3ROdW1XaGVuRXZhbHVhdGUgIT0gMCkgJiYgKHBBZC0+UnhBbnQuUGFpcjFBdmdSc3NpW3BBZC0+UnhBbnQuUGFpcjFTZWNvbmRhcnlSeEFudF0gPj0gcEFkLT5SeEFudC5QYWlyMUF2Z1Jzc2lbcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudF0pKQotCQkJCWJTd2FwQW50ID0gVFJVRTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJaWYgKGJTd2FwQW50ID09IFRSVUUpCi0JCQl7Ci0JCQkJVUNIQVIJCQl0ZW1wOwotCi0JCQkJLy8KLQkJCQkvLyBzZWxlY3QgUHJpbWFyeVJ4QW50UGFpcgotCQkJCS8vICAgIFJvbGUgY2hhbmdlLCBVc2VkIFBhaXIxU2Vjb25kYXJ5UnhBbnQgYXMgUHJpbWFyeVJ4QW50UGFpci4KLQkJCQkvLyAgICBTaW5jZSBQYWlyMVNlY29uZGFyeVJ4QW50IFF1YWxpdHkgZ29vZCB0aGFuIFBhaXIxUHJpbWFyeVJ4QW50Ci0JCQkJLy8KLQkJCQl0ZW1wID0gcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudDsKLQkJCQlwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50ID0gcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50OwotCQkJCXBBZC0+UnhBbnQuUGFpcjFTZWNvbmRhcnlSeEFudCA9IHRlbXA7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCQlwQWQtPlJ4QW50LlBhaXIxTGFzdEF2Z1Jzc2kgPSAocEFkLT5SeEFudC5QYWlyMUF2Z1Jzc2lbcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50XSA+PiAzKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLS8vCQkJCXBBZC0+UnhBbnQuRXZhbHVhdGVTdGFibGVDbnQgPSAwOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIGlmIHRoZSBldmFsdWF0ZWQgYW50ZW5uYSBpcyBub3QgYmV0dGVyIHRoYW4gb3JpZ2luYWwsIHN3aXRjaCBiYWNrIHRvIG9yaWdpbmFsIGFudGVubmEKLQkJCQlBc2ljU2V0UnhBbnQocEFkLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50KTsKLQkJCQlwQWQtPlJ4QW50LkV2YWx1YXRlU3RhYmxlQ250ICsrOwotCQkJfQotCi0JCQlwQWQtPlJ4QW50LkV2YWx1YXRlUGVyaW9kID0gMDsgLy8gMTpNZWFucyBzd2l0Y2ggdG8gU2Vjb25kYXJ5UnhBbnQsIDA6TWVhbnMgc3dpdGNoIHRvIFBhaXIxUHJpbWFyeVJ4QW50Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY1J4QW50RXZhbEFjdGlvbjo6QWZ0ZXIgRXZhbChmaXggaW4gIyVkKSwgPCVkLCAlZD4sIFJjdlBrdE51bVdoZW5FdmFsdWF0ZT0lbGRcbiIsCi0JCQkJCXBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQsIChwQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVswXSA+PiAzKSwgKHBBZC0+UnhBbnQuUGFpcjFBdmdSc3NpWzFdID4+IDMpLCBwQWQtPlJ4QW50LlJjdlBrdE51bVdoZW5FdmFsdWF0ZSkpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQl9Ci0JCWVsc2UKLSNlbmRpZiAvLyBBTlRfRElWRVJTSVRZX1NVUFBPUlQgLy8KLQl7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCWlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpCi0JCQkJcmV0dXJuOwotCi0KLQkJCS8vIGlmIHRoZSB0cmFmZmljIGlzIGxvdywgdXNlIGF2ZXJhZ2UgcnNzaSBhcyB0aGUgY3JpdGVyaWEKLQkJCWlmIChwQWQtPk1sbWUuYkxvd1Rocm91Z2hwdXQgPT0gVFJVRSkKLQkJCXsKLQkJCQlyc3NpMCA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwOwotCQkJCXJzc2kxID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTE7Ci0JCQkJcnNzaTIgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyc3NpMCA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTA7Ci0JCQkJcnNzaTEgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxOwotCQkJCXJzc2kyID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMjsKLQkJCX0KLQotCQkJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQotCQkJewotCQkJCWxhcmdlciA9IG1heChyc3NpMCwgcnNzaTEpOwotCi0JCQkJaWYgKGxhcmdlciA+IChyc3NpMiArIDIwKSkKLQkJCQkJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAyOwotCQkJCWVsc2UKLQkJCQkJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAzOwotCQkJfQotCQkJZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCi0JCQl7Ci0JCQkJaWYgKHJzc2kwID4gKHJzc2kxICsgMjApKQotCQkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDE7Ci0JCQkJZWxzZQotCQkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDI7Ci0JCQl9Ci0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUFIzKTsKLQkJCUJCUFIzICY9ICh+MHgxOCk7Ci0JCQlpZihwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9PSAzKQotCQkJewotCQkJCUJCUFIzIHw9ICgweDEwKTsKLQkJCX0KLQkJCWVsc2UgaWYocEFkLT5NbG1lLlJlYWxSeFBhdGggPT0gMikKLQkJCXsKLQkJCQlCQlBSMyB8PSAoMHg4KTsKLQkJCX0KLQkJCWVsc2UgaWYocEFkLT5NbG1lLlJlYWxSeFBhdGggPT0gMSkKLQkJCXsKLQkJCQlCQlBSMyB8PSAoMHgwKTsKLQkJCX0KLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJCUFIzKTsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJCXBBZC0+U3RhQ2ZnLkJCUFIzID0gQkJQUjM7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl9Ci19Ci0KLQotVk9JRCBBUFNEUGVyaW9kaWNFeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLQlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7Ci0KLQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJcmV0dXJuOwotCi0JcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQrKzsKLQotLy8gRHJpdmVyIHNob3VsZCBub3Qgc2VuZCB0cmlnZ2VyIGZyYW1lLCBpdCBzaG91bGQgYmUgc2VuZCBieSBhcHBsaWNhdGlvbiBsYXllcgotLyoKLQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlCi0JCSYmIChwQWQtPkNvbW1vbkNmZy5iTmVlZFNlbmRUcmlnZ2VyRnJhbWUgfHwKLQkJKCgocEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQlMjApID09IDE5KSAmJiAoIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8pKSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNlbmRpbmcgdHJpZ2dlciBmcmFtZSBhbmQgZW50ZXIgc2VydmljZSBwZXJpb2Qgd2hlbiBzdXBwb3J0IEFQU0RcbiIpKTsKLQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOwotCQlwQWQtPkNvbW1vbkNmZy5iTmVlZFNlbmRUcmlnZ2VyRnJhbWUgPSBGQUxTRTsKLQkJcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5iSW5TZXJ2aWNlUGVyaW9kID0gVFJVRTsKLQl9Ki8KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQvcmVzZXQgTUFDIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gYlBpZ2d5QmFjayBwYXJhbWV0ZXIKLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgcEFkICAgICAgICAgLSBBZGFwdGVyIHBvaW50ZXIKLSAgICAgICAgYlBpZ2d5QmFjayAgLSBFbmFibGUgLyBEaXNhYmxlIFBpZ2d5LUJhY2sKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgTm9uZQotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QU2V0UGlnZ3lCYWNrKAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIEJPT0xFQU4gICAgICAgICAgYlBpZ2d5QmFjaykKLXsKLQlUWF9MSU5LX0NGR19TVFJVQyAgVHhMaW5rQ2ZnOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9MSU5LX0NGRywgJlR4TGlua0NmZy53b3JkKTsKLQotCVR4TGlua0NmZy5maWVsZC5UeENGQWNrRW4gPSBiUGlnZ3lCYWNrOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICAgICAgY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkKLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgcEFkCi0gICAgICAgIHBFbnRyeQotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBUVVJFCi0gICAgICAgIEZBTFNFCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOIFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2goCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpCi17Ci0JQk9PTEVBTgkJcmVzdWx0ID0gVFJVRTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCS8vIG9ubHkgYXNzb2NpYXRlZCBTVEEgY291bnRzCi0JCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0NMSSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCi0JCXsKLQkJcmVzdWx0ID0gcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2g7Ci0JfQotCQllbHNlCi0JCQlyZXN1bHQgPSBGQUxTRTsKLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQlpZiAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNEbHMpKQotCQkJcmVzdWx0ID0gcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2g7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotQk9PTEVBTiBSVE1QQXV0b1JhdGVTd2l0Y2hDaGVjaygKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCkKLXsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2gpCi0JCQlyZXR1cm4gVFJVRTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JcmV0dXJuIEZBTFNFOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICAgICAgY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIGZpeCB0eCBsZWdhY3kgcmF0ZQotCi0gICAgQXJndW1lbnRzOgotICAgICAgICBwQWQKLSAgICAgICAgcEVudHJ5Ci0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIFRVUkUKLSAgICAgICAgRkFMU0UKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVDSEFSIFJUTVBTdGFGaXhlZFR4TW9kZSgKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSkKLXsKLQlVQ0hBUgl0eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJdHhfbW9kZSA9IChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCXJldHVybiB0eF9tb2RlOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIE92ZXJ3cml0ZSBIVCBUeCBNb2RlIGJ5IEZpeGVkIExlZ2VuY3kgVHggTW9kZSwgaWYgc3BlY2lmaWVkLgotCi0gICAgQXJndW1lbnRzOgotICAgICAgICBwQWQKLSAgICAgICAgcEVudHJ5Ci0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIFRVUkUKLSAgICAgICAgRkFMU0UKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygKLQkJVUNIQVIJCQkJZml4ZWRfdHhfbW9kZSwKLQkJUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpCi17Ci0JSFRUUkFOU01JVF9TRVRUSU5HIFRyYW5zbWl0U2V0dGluZzsKLQotCWlmIChmaXhlZF90eF9tb2RlID09IEZJWEVEX1RYTU9ERV9IVCkKLQkJcmV0dXJuOwotCi0JVHJhbnNtaXRTZXR0aW5nLndvcmQgPSAwOwotCi0JVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1PREUgPSBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFOwotCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1M7Ci0KLQlpZiAoZml4ZWRfdHhfbW9kZSA9PSBGSVhFRF9UWE1PREVfQ0NLKQotCXsKLQkJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJLy8gQ0NLIG1vZGUgYWxsb3cgTUNTIDB+MwotCQlpZiAoVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA+IE1DU18zKQotCQkJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18zOwotCX0KLQllbHNlCi0JewotCQlUcmFuc21pdFNldHRpbmcuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJLy8gT0ZETSBtb2RlIGFsbG93IE1DUyAwfjcKLQkJaWYgKFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPiBNQ1NfNykKLQkJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNzsKLQl9Ci0KLQlpZiAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBUcmFuc21pdFNldHRpbmcuZmllbGQuTU9ERSkKLQl7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBUcmFuc21pdFNldHRpbmcud29yZDsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZyA6IHdjaWQtJWQsIE1PREU9JXMsIE1DUz0lZCBcbiIsCi0JCQkJcEVudHJ5LT5BaWQsIEdldFBoeU1vZGUocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSksIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUykpOwotCX0KLX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlkeW5hbWljIHR1bmUgQkJQIFI2NiB0byBmaW5kIGEgYmFsYW5jZSBiZXR3ZWVuIHNlbnNpYmlsaXR5IGFuZAotCQlub2lzZSBpc29sYXRpb24KLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljU3RhQmJwVHVuaW5nKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVVDSEFSCU9yaWdSNjZWYWx1ZSA9IDAsIFI2NjsvLywgUjY2VXBwZXJCb3VuZCA9IDB4MzAsIFI2Nkxvd2VyQm91bmQgPSAweDMwOwotCUNIQVIJUnNzaTsKLQotCS8vIDI4NjBDIGRpZCBub3Qgc3VwcG9ydCBGYXNlIENDQSwgdGhlcmVmb3JlIGNhbid0IHR1bmUKLQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCi0JCXJldHVybjsKLQotCS8vCi0JLy8gd29yayBhcyBhIFNUQQotCS8vCi0JaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKSAgLy8gbm8gUjY2IHR1bmluZyB3aGVuIFNDQU5OSU5HCi0JCXJldHVybjsKLQotCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQkJJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQotCQkJKQotCQkmJiAhKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCSYmIChwQWQtPmJQQ0ljbGtPZmYgPT0gRkFMU0UpCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCSkKLQl7Ci0JCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICZPcmlnUjY2VmFsdWUpOwotCQlSNjYgPSBPcmlnUjY2VmFsdWU7Ci0KLQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPiAxKQotCQkJUnNzaSA9IChwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwICsgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSkgPj4gMTsKLQkJZWxzZQotCQkJUnNzaSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTA7Ci0KLQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKLQkJewkvL0JHIGJhbmQKLSNpZmRlZiBSVDMweHgKLQkJCS8vIFJUMzA3MCBpcyBhIG5vIExOQSBzb2x1dGlvbiwgaXQgc2hvdWxkIGhhdmUgZGlmZmVyZW50IGNvbnRyb2wgcmVnYXJkaW5nIHRvIEFHQyBnYWluIGNvbnRyb2wKLQkJCS8vIE90aGVyd2lzZSwgaXQgd2lsbCBoYXZlIHNvbWUgdGhyb3VnaHB1dCBzaWRlIGVmZmVjdCB3aGVuIGxvdyBSU1NJCi0KLQkJCWlmIChJU19SVDMwNzAocEFkKXx8SVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCi0JCQl7Ci0JCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKQotCQkJCXsKLQkJCQkJUjY2ID0gMHgxQyArIDIqR0VUX0xOQV9HQUlOKHBBZCkgKyAweDIwOwotCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKLQkJCQkJewotCQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVI2NiA9IDB4MUMgKyAyKkdFVF9MTkFfR0FJTihwQWQpOwotCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKLQkJCQkJewotCQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotI2VuZGlmIC8vIFJUMzB4eCAvLwotCQkJewotCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkKLQkJCQl7Ci0JCQkJCVI2NiA9ICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpICsgMHgxMDsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVI2NiA9IDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKTsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewkvL0EgYmFuZAotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV18yMCkKLQkJCXsKLQkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCi0JCQkJewotCQkJCQlSNjYgPSAweDMyICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMgKyAweDEwOwotCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKLQkJCQkJewotCQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVI2NiA9IDB4MzIgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMzsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCi0JCQkJewotCQkJCQlSNjYgPSAweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMgKyAweDEwOwotCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKLQkJCQkJewotCQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVI2NiA9IDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMzsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0KLQl9Ci19Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLVZPSUQgUlRNUFNldEFHQ0luaXRWYWx1ZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVQ0hBUgkJCUJhbmRXaWR0aCkKLXsKLQlVQ0hBUglSNjYgPSAweDMwOwotCi0JaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKLQl7CS8vIEJHIGJhbmQKLSNpZmRlZiBSVDMweHgKLQkJLyogR2FyeSB3YXMgdmVyaWZpZWQgQW1hem9uIEFQIGFuZCBmaW5kIHRoYXQgUlQzMDd4IGhhcyBCQlBfUjY2IGludmFsaWQgZGVmYXVsdCB2YWx1ZSAqLwotCi0JCWlmIChJU19SVDMwNzAocEFkKXx8SVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCi0JCXsKLQkJCVI2NiA9IDB4MUMgKyAyKkdFVF9MTkFfR0FJTihwQWQpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7Ci0JCX0KLQkJZWxzZQotI2VuZGlmIC8vIFJUMzB4eCAvLwotCQl7Ci0JCQlSNjYgPSAweDJFICsgR0VUX0xOQV9HQUlOKHBBZCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKLQkJfQotCX0KLQllbHNlCi0JewkvL0EgYmFuZAotCQl7Ci0JCQlpZiAoQmFuZFdpZHRoID09IEJXXzIwKQotCQkJewotCQkJCVI2NiA9IChVQ0hBUikoMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zKTsKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKLQkJCX0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCWVsc2UKLQkJCXsKLQkJCQlSNjYgPSAoVUNIQVIpKDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyk7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7Ci0JCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL21sbWVfZXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL21sbWVfZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdmYjdmNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9tbG1lX2V4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQltbG1lX2V4LmMKLQotCUFic3RyYWN0OgotCU1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLQktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlGb25jaGkJCTIwMDctMDYtMjUJCUV4dGVuZCBvcmlnaW5hbCBtbG1lIEFQSXMgdG8gc3VwcG9ydCBtdWx0aS1lbnRyaWVzCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0jaW5jbHVkZSAiLi4vbWxtZV9leF9kZWYuaCIKLS8vI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIHN0YXRlX21hY2hpbmUKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLyohIFxicmllZiBJbml0aWFsaXplIHRoZSBzdGF0ZSBtYWNoaW5lLgotICogIFxwYXJhbSAqUyAgICAgICAgICAgcG9pbnRlciB0byB0aGUgc3RhdGUgbWFjaGluZQotICogIFxwYXJhbSAgVHJhbnMgICAgICAgU3RhdGUgbWFjaGluZSB0cmFuc2l0aW9uIGZ1bmN0aW9uCi0gKiAgXHBhcmFtICBTdE5yICAgICAgICBudW1iZXIgb2Ygc3RhdGVzCi0gKiAgXHBhcmFtICBNc2dOciAgICAgICBudW1iZXIgb2YgbWVzc2FnZXMKLSAqICBccGFyYW0gIERlZkZ1bmMgICAgIGRlZmF1bHQgZnVuY3Rpb24sIHdoZW4gdGhlcmUgaXMgaW52YWxpZCBzdGF0ZS9tZXNzYWdlIGNvbWJpbmF0aW9uCi0gKiAgXHBhcmFtICBJbml0U3RhdGUgICBpbml0aWFsIHN0YXRlIG9mIHRoZSBzdGF0ZSBtYWNoaW5lCi0gKiAgXHBhcmFtICBCYXNlICAgICAgICBTdGF0ZU1hY2hpbmUgYmFzZSwgaW50ZXJuYWwgdXNlIG9ubHkKLSAqICBccHJlIHBfc20gc2hvdWxkIGJlIGEgbGVnYWwgcG9pbnRlcgotICogIFxwb3N0Ci0gKi8KLVZPSUQgU3RhdGVNYWNoaW5lSW5pdEV4KAotCUlOIFNUQVRFX01BQ0hJTkVfRVggKlMsCi0JSU4gU1RBVEVfTUFDSElORV9GVU5DX0VYIFRyYW5zW10sCi0JSU4gVUxPTkcgU3ROciwKLQlJTiBVTE9ORyBNc2dOciwKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkNfRVggRGVmRnVuYywKLQlJTiBVTE9ORyBJbml0U3RhdGUsCi0JSU4gVUxPTkcgQmFzZSkKLXsKLQlVTE9ORyBpLCBqOwotCi0JLy8gc2V0IG51bWJlciBvZiBzdGF0ZXMgYW5kIG1lc3NhZ2VzCi0JUy0+TnJTdGF0ZSA9IFN0TnI7Ci0JUy0+TnJNc2cgICA9IE1zZ05yOwotCVMtPkJhc2UgICAgPSBCYXNlOwotCi0JUy0+VHJhbnNGdW5jICA9IFRyYW5zOwotCi0JLy8gaW5pdCBhbGwgc3RhdGUgdHJhbnNpdGlvbiB0byBkZWZhdWx0IGZ1bmN0aW9uCi0JZm9yIChpID0gMDsgaSA8IFN0TnI7IGkrKykKLQl7Ci0JCWZvciAoaiA9IDA7IGogPCBNc2dOcjsgaisrKQotCQl7Ci0JCQlTLT5UcmFuc0Z1bmNbaSAqIE1zZ05yICsgal0gPSBEZWZGdW5jOwotCQl9Ci0JfQotCi0JLy8gc2V0IHRoZSBzdGFydGluZyBzdGF0ZQotCVMtPkN1cnJTdGF0ZSA9IEluaXRTdGF0ZTsKLQotCXJldHVybjsKLX0KLQotLyohIFxicmllZiBUaGlzIGZ1bmN0aW9uIGZpbGxzIGluIHRoZSBmdW5jdGlvbiBwb2ludGVyIGludG8gdGhlIGNlbGwgaW4gdGhlIHN0YXRlIG1hY2hpbmUKLSAqICBccGFyYW0gKlMgICBwb2ludGVyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lCi0gKiAgXHBhcmFtIFN0ICAgc3RhdGUKLSAqICBccGFyYW0gTXNnICBpbmNvbWluZyBtZXNzYWdlCi0gKiAgXHBhcmFtIGYgICAgdGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gKHN0YXRlLCBtZXNzYWdlKSBjb21iaW5hdGlvbiBvY2N1cnMgYXQgdGhlIHN0YXRlIG1hY2hpbmUKLSAqICBccHJlICpTIHNob3VsZCBiZSBhIGxlZ2FsIHBvaW50ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUsIHN0LCBtc2csIHNob3VsZCBiZSBhbGwgd2l0aGluIHRoZSByYW5nZSwgQmFzZSBzaG91bGQgYmUgc2V0IGluIHRoZSBpbml0aWFsIHN0YXRlCi0gKiAgXHBvc3QKLSAqLwotVk9JRCBTdGF0ZU1hY2hpbmVTZXRBY3Rpb25FeCgKLQlJTiBTVEFURV9NQUNISU5FX0VYICpTLAotCUlOIFVMT05HIFN0LAotCUlOIFVMT05HIE1zZywKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkNfRVggRnVuYykKLXsKLQlVTE9ORyBNc2dJZHg7Ci0KLQlNc2dJZHggPSBNc2cgLSBTLT5CYXNlOwotCi0JaWYgKFN0IDwgUy0+TnJTdGF0ZSAmJiBNc2dJZHggPCBTLT5Ock1zZykKLQl7Ci0JCS8vIGJvdW5kYXJ5IGNoZWNraW5nIGJlZm9yZSBzZXR0aW5nIHRoZSBhY3Rpb24KLQkJUy0+VHJhbnNGdW5jW1N0ICogUy0+TnJNc2cgKyBNc2dJZHhdID0gRnVuYzsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLS8qISBcYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHN0YXRlIHRyYW5zaXRpb24KLSAqICBccGFyYW0gICAqQWRhcHRlciB0aGUgTklDIGFkYXB0ZXIgcG9pbnRlcgotICogIFxwYXJhbSAgICpTICAgICAgIHRoZSBzdGF0ZSBtYWNoaW5lCi0gKiAgXHBhcmFtICAgKkVsZW0gICAgdGhlIG1lc3NhZ2UgdG8gYmUgZXhlY3V0ZWQKLSAqICBccmV0dXJuICAgTm9uZQotICovCi1WT0lEIFN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb25FeCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBTVEFURV9NQUNISU5FX0VYICpTLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSwKLQlVU0hPUlQgSWR4LAotCVBVTE9ORyBwQ3VyclN0YXRlKQotewotCWlmIChTLT5UcmFuc0Z1bmNbKCpwQ3VyclN0YXRlKSAqIFMtPk5yTXNnICsgRWxlbS0+TXNnVHlwZSAtIFMtPkJhc2VdKQotCQkoKihTLT5UcmFuc0Z1bmNbKCpwQ3VyclN0YXRlKSAqIFMtPk5yTXNnICsgRWxlbS0+TXNnVHlwZSAtIFMtPkJhc2VdKSkocEFkLCBFbGVtLCBwQ3VyclN0YXRlLCBJZHgpOwotCi0JcmV0dXJuOwotfQotCi0vKiEgXGJyaWVmICAgRW5xdWV1ZSBhIG1lc3NhZ2UgZm9yIG90aGVyIHRocmVhZHMsIGlmIHRoZXkgd2FudCB0byBzZW5kIG1lc3NhZ2VzIHRvIE1MTUUgdGhyZWFkCi0gKiAgXHBhcmFtICAqUXVldWUgICAgVGhlIE1MTUUgUXVldWUKLSAqICBccGFyYW0gICBNYWNoaW5lICBUaGUgU3RhdGUgTWFjaGluZSBJZAotICogIFxwYXJhbSAgIE1zZ1R5cGUgIFRoZSBNZXNzYWdlIFR5cGUKLSAqICBccGFyYW0gICBNc2dMZW4gICBUaGUgTWVzc2FnZSBsZW5ndGgKLSAqICBccGFyYW0gICpNc2cgICAgICBUaGUgbWVzc2FnZSBwb2ludGVyCi0gKiAgXHJldHVybiAgVFJVRSBpZiBlbnF1ZXVlIGlzIHN1Y2Nlc3NmdWwsIEZBTFNFIGlmIHRoZSBxdWV1ZSBpcyBmdWxsCi0gKiAgXHByZQotICogIFxwb3N0Ci0gKiAgXG5vdGUgICAgVGhlIG1lc3NhZ2UgaGFzIHRvIGJlIGluaXRpYWxpemVkCi0gKi8KLUJPT0xFQU4gTWxtZUVucXVldWVFeCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVTE9ORyBNYWNoaW5lLAotCUlOIFVMT05HIE1zZ1R5cGUsCi0JSU4gVUxPTkcgTXNnTGVuLAotCUlOIFZPSUQgKk1zZywKLQlJTiBVU0hPUlQgSWR4KQotewotCUlOVCBUYWlsOwotCU1MTUVfUVVFVUUgKlF1ZXVlID0gKE1MTUVfUVVFVUUgKikmcEFkLT5NbG1lLlF1ZXVlOwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKLQkJcmV0dXJuIEZBTFNFOwotCi0KLQkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKLQlpZiAoTXNnTGVuID4gTUFYX0xFTl9PRl9NTE1FX0JVRkZFUikKLQl7Ci0JCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlRXg6IG1zZyB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCWlmIChNbG1lUXVldWVGdWxsKFF1ZXVlKSkKLQl7Ci0KLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCVJUTVBfU0VNX0xPQ0soJlF1ZXVlLT5Mb2NrKTsKLQlUYWlsID0gUXVldWUtPlRhaWw7Ci0JUXVldWUtPlRhaWwrKzsKLQlRdWV1ZS0+TnVtKys7Ci0JaWYgKFF1ZXVlLT5UYWlsID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkKLQl7Ci0JCVF1ZXVlLT5UYWlsID0gMDsKLQl9Ci0JUXVldWUtPkVudHJ5W1RhaWxdLk9jY3VwaWVkID0gVFJVRTsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uTWFjaGluZSA9IE1hY2hpbmU7Ci0JUXVldWUtPkVudHJ5W1RhaWxdLk1zZ1R5cGUgPSBNc2dUeXBlOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dMZW4gPSBNc2dMZW47Ci0JUXVldWUtPkVudHJ5W1RhaWxdLklkeCA9IElkeDsKLQlpZiAoTXNnICE9IE5VTEwpCi0JCU5kaXNNb3ZlTWVtb3J5KFF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2csIE1zZywgTXNnTGVuKTsKLQotCVJUTVBfU0VNX1VOTE9DSygmUXVldWUtPkxvY2spOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgVGhlIGRyb3AgZnVuY3Rpb24sIHdoZW4gbWFjaGluZSBleGVjdXRlcyB0aGlzLCB0aGUgbWVzc2FnZSBpcyBzaW1wbHkKLSAgICAgICAgaWdub3JlZC4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcsIHRoZSBtZXNzYWdlIGlzIGZyZWVkIGluCi0gICAgICAgIFN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24oKQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgRHJvcEV4KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSwKLQlQVUxPTkcgcEN1cnJTdGF0ZSwKLQlVU0hPUlQgSWR4KQotewotCXJldHVybjsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL25ldGlmX2Jsb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9uZXRpZl9ibG9jay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTcyOTU3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL25ldGlmX2Jsb2NrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpZmRlZiBCTE9DS19ORVRfSUYKLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotI2luY2x1ZGUgIi4uL25ldGlmX2Jsb2NrLmgiCi0KLQotc3RhdGljIE5FVElGX0VOVFJZIGZyZWVOZXRJZkVudHJ5UG9vbFtGUkVFX05FVElGX1BPT0xfU0laRV07Ci1zdGF0aWMgTElTVF9IRUFERVIgZnJlZU5ldElmRW50cnlMaXN0OwotCi12b2lkIGluaXRibG9ja1F1ZXVlVGFiKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCWludCBpOwotCi0JaW5pdExpc3QoJmZyZWVOZXRJZkVudHJ5TGlzdCk7Ci0JZm9yIChpID0gMDsgaSA8IEZSRUVfTkVUSUZfUE9PTF9TSVpFOyBpKyspCi0JCWluc2VydFRhaWxMaXN0KCZmcmVlTmV0SWZFbnRyeUxpc3QsIChQTElTVF9FTlRSWSkmZnJlZU5ldElmRW50cnlQb29sW2ldKTsKLQotCWZvciAoaT0wOyBpIDwgTlVNX09GX1RYX1JJTkc7IGkrKykKLQkJaW5pdExpc3QoJnBBZC0+YmxvY2tRdWV1ZVRhYltpXS5OZXRJZkxpc3QpOwotCi0JcmV0dXJuOwotfQotCi1CT09MRUFOIGJsb2NrTmV0SWYoCi0JSU4gUEJMT0NLX1FVRVVFX0VOVFJZIHBCbG9ja1F1ZXVlRW50cnksCi0JSU4gUE5FVF9ERVYgcE5ldERldikKLXsKLQlQTkVUSUZfRU5UUlkgcE5ldElmRW50cnkgPSBOVUxMOwotCi0JaWYgKChwTmV0SWZFbnRyeSA9IChQTkVUSUZfRU5UUlkpcmVtb3ZlSGVhZExpc3QoJmZyZWVOZXRJZkVudHJ5TGlzdCkpICE9IE5VTEwpCi0JewotCQlSVE1QX09TX05FVERFVl9TVE9QX1FVRVVFKHBOZXREZXYpOwotCQlwTmV0SWZFbnRyeS0+cE5ldERldiA9IHBOZXREZXY7Ci0JCWluc2VydFRhaWxMaXN0KCZwQmxvY2tRdWV1ZUVudHJ5LT5OZXRJZkxpc3QsIChQTElTVF9FTlRSWSlwTmV0SWZFbnRyeSk7Ci0KLQkJcEJsb2NrUXVldWVFbnRyeS0+U3dUeFF1ZXVlQmxvY2tGbGFnID0gVFJVRTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUF9PU19ORVRERVZfU1RPUF9RVUVVRSglcylcbiIsIFJUTVBfT1NfTkVUREVWX0dFVF9ERVZOQU1FKHBOZXREZXYpKSk7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLVZPSUQgcmVsZWFzZU5ldElmKAotCUlOIFBCTE9DS19RVUVVRV9FTlRSWSBwQmxvY2tRdWV1ZUVudHJ5KQotewotCVBORVRJRl9FTlRSWSBwTmV0SWZFbnRyeSA9IE5VTEw7Ci0JUExJU1RfSEVBREVSIHBOZXRJZkxpc3QgPSAmcEJsb2NrUXVldWVFbnRyeS0+TmV0SWZMaXN0OwotCi0Jd2hpbGUoKHBOZXRJZkVudHJ5ID0gKFBORVRJRl9FTlRSWSlyZW1vdmVIZWFkTGlzdChwTmV0SWZMaXN0KSkgIT0gIE5VTEwpCi0JewotCQlQTkVUX0RFViBwTmV0RGV2ID0gcE5ldElmRW50cnktPnBOZXREZXY7Ci0JCVJUTVBfT1NfTkVUREVWX1dBS0VfUVVFVUUocE5ldERldik7Ci0JCWluc2VydFRhaWxMaXN0KCZmcmVlTmV0SWZFbnRyeUxpc3QsIChQTElTVF9FTlRSWSlwTmV0SWZFbnRyeSk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUF9PU19ORVRERVZfV0FLRV9RVUVVRSglcylcbiIsIFJUTVBfT1NfTkVUREVWX0dFVF9ERVZOQU1FKHBOZXREZXYpKSk7Ci0JfQotCXBCbG9ja1F1ZXVlRW50cnktPlN3VHhRdWV1ZUJsb2NrRmxhZyA9IEZBTFNFOwotCXJldHVybjsKLX0KLQotCi1WT0lEIFN0b3BOZXRJZlF1ZXVlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSIFF1ZUlkeCwKLQlJTiBQTkRJU19QQUNLRVQgcFBhY2tldCkKLXsKLQlQTkVUX0RFViBOZXREZXYgPSBOVUxMOwotCVVDSEFSIElmSWR4ID0gMDsKLQlCT09MRUFOIHZhbGlkID0gRkFMU0U7Ci0KLSNpZmRlZiBBUENMSV9TVVBQT1JUCi0JaWYgKFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKHBQYWNrZXQpID49IE1JTl9ORVRfREVWSUNFX0ZPUl9BUENMSSkKLQl7Ci0JCUlmSWR4ID0gKFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKHBQYWNrZXQpIC0gTUlOX05FVF9ERVZJQ0VfRk9SX0FQQ0xJKSAlIE1BWF9BUENMSV9OVU07Ci0JCU5ldERldiA9IHBBZC0+QXBDZmcuQXBDbGlUYWJbSWZJZHhdLmRldjsKLQl9Ci0JZWxzZQotI2VuZGlmIC8vIEFQQ0xJX1NVUFBPUlQgLy8KLSNpZmRlZiBXRFNfU1VQUE9SVAotCWlmIChSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShwUGFja2V0KSA+PSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKQotCXsKLQkJSWZJZHggPSAoUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UocFBhY2tldCkgLSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKSAlIE1BWF9XRFNfRU5UUlk7Ci0JCU5ldERldiA9IHBBZC0+V2RzVGFiLldkc0VudHJ5W0lmSWR4XS5kZXY7Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBXRFNfU1VQUE9SVCAvLwotCXsKLSNpZmRlZiBNQlNTX1NVUFBPUlQKLQkJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKLQkJewotCQkJSWZJZHggPSAoUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UocFBhY2tldCkgLSBNSU5fTkVUX0RFVklDRV9GT1JfTUJTU0lEKSAlIE1BWF9NQlNTSURfTlVNOwotCQkJTmV0RGV2ID0gcEFkLT5BcENmZy5NQlNTSURbSWZJZHhdLk1TU0lERGV2OwotCQl9Ci0JCWVsc2UKLQkJewotCQkJSWZJZHggPSBNQUlOX01CU1NJRDsKLQkJCU5ldERldiA9IHBBZC0+bmV0X2RldjsKLQkJfQotI2Vsc2UKLQkJSWZJZHggPSBNQUlOX01CU1NJRDsKLQkJTmV0RGV2ID0gcEFkLT5uZXRfZGV2OwotI2VuZGlmCi0JfQotCi0JLy8gV01NIHN1cHBvcnQgNCBzb2Z0d2FyZSBxdWV1ZXMuCi0JLy8gT25lIHNvZnR3YXJlIHF1ZXVlIGZ1bGwgZG9lc24ndCBtZWFuIGRldmljZSBoYXZlIG5vIGNhcGJpbGl0eSB0byB0cmFuc21pdCBwYWNrZXQuCi0JLy8gU28gZGlzYWJsZSBibG9jayBOZXQtSWYgcXVldWUgZnVuY3Rpb24gd2hpbGUgV01NIGVuYWJsZS4KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl2YWxpZCA9IChwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9PSBUUlVFKSA/IEZBTFNFIDogVFJVRTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCWlmICh2YWxpZCkKLQkJYmxvY2tOZXRJZigmcEFkLT5ibG9ja1F1ZXVlVGFiW1F1ZUlkeF0sIE5ldERldik7Ci0JcmV0dXJuOwotfQotCi0jZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9ydF9jaGFubmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9ydF9jaGFubmVsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjM5MWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vcnRfY2hhbm5lbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI4NyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi1DSF9GUkVRX01BUCBDSF9IWl9JRF9NQVBbXT0KLQkJewotCQkJezEsIDI0MTJ9LAotCQkJezIsIDI0MTd9LAotCQkJezMsIDI0MjJ9LAotCQkJezQsIDI0Mjd9LAotCQkJezUsIDI0MzJ9LAotCQkJezYsIDI0Mzd9LAotCQkJezcsIDI0NDJ9LAotCQkJezgsIDI0NDd9LAotCQkJezksIDI0NTJ9LAotCQkJezEwLCAyNDU3fSwKLQkJCXsxMSwgMjQ2Mn0sCi0JCQl7MTIsIDI0Njd9LAotCQkJezEzLCAyNDcyfSwKLQkJCXsxNCwgMjQ4NH0sCi0KLQkJCS8qICBVTklJICovCi0JCQl7MzYsIDUxODB9LAotCQkJezQwLCA1MjAwfSwKLQkJCXs0NCwgNTIyMH0sCi0JCQl7NDgsIDUyNDB9LAotCQkJezUyLCA1MjYwfSwKLQkJCXs1NiwgNTI4MH0sCi0JCQl7NjAsIDUzMDB9LAotCQkJezY0LCA1MzIwfSwKLQkJCXsxNDksIDU3NDV9LAotCQkJezE1MywgNTc2NX0sCi0JCQl7MTU3LCA1Nzg1fSwKLQkJCXsxNjEsIDU4MDV9LAotCQkJezE2NSwgNTgyNX0sCi0JCQl7MTY3LCA1ODM1fSwKLQkJCXsxNjksIDU4NDV9LAotCQkJezE3MSwgNTg1NX0sCi0JCQl7MTczLCA1ODY1fSwKLQotCQkJLyogSGlwZXJMQU4yICovCi0JCQl7MTAwLCA1NTAwfSwKLQkJCXsxMDQsIDU1MjB9LAotCQkJezEwOCwgNTU0MH0sCi0JCQl7MTEyLCA1NTYwfSwKLQkJCXsxMTYsIDU1ODB9LAotCQkJezEyMCwgNTYwMH0sCi0JCQl7MTI0LCA1NjIwfSwKLQkJCXsxMjgsIDU2NDB9LAotCQkJezEzMiwgNTY2MH0sCi0JCQl7MTM2LCA1NjgwfSwKLQkJCXsxNDAsIDU3MDB9LAotCi0JCQkvKiBKYXBhbiBNTUFDICovCi0JCQl7MzQsIDUxNzB9LAotCQkJezM4LCA1MTkwfSwKLQkJCXs0MiwgNTIxMH0sCi0JCQl7NDYsIDUyMzB9LAotCi0JCQkvKiAgSmFwYW4gKi8KLQkJCXsxODQsIDQ5MjB9LAotCQkJezE4OCwgNDk0MH0sCi0JCQl7MTkyLCA0OTYwfSwKLQkJCXsxOTYsIDQ5ODB9LAotCi0JCQl7MjA4LCA1MDQwfSwJLyogSmFwYW4sIG1lYW5zIEowOCAqLwotCQkJezIxMiwgNTA2MH0sCS8qIEphcGFuLCBtZWFucyBKMTIgKi8KLQkJCXsyMTYsIDUwODB9LAkvKiBKYXBhbiwgbWVhbnMgSjE2ICovCi19OwotCi1JTlQJQ0hfSFpfSURfTUFQX05VTSA9IChzaXplb2YoQ0hfSFpfSURfTUFQKS9zaXplb2YoQ0hfRlJFUV9NQVApKTsKLQotQ0hfUkVHSU9OIENoUmVnaW9uW10gPQotewotCQl7CS8vIEFudGlndWEgYW5kIEJlcmJ1ZGEKLQkJCSJBRyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEFyZ2VudGluYQotCQkJIkFSIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEFydWJhCi0JCQkiQVciLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBBdXN0cmFsaWEKLQkJCSJBVSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEF1c3RyaWEKLQkJCSJBVCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9LAkJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEJhaGFtYXMKLQkJCSJCUyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEJhcmJhZG9zCi0JCQkiQkIiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBCZXJtdWRhCi0JCQkiQk0iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBCcmF6aWwKLQkJCSJCUiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBCZWxnaXVtCi0JCQkiQkUiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMTgsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAxOCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEJ1bGdhcmlhCi0JCQkiQkciLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ2FuYWRhCi0JCQkiQ0EiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBDYXltYW4gSXNMYW5kcwotCQkJIktZIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ2hpbGUKLQkJCSJDTCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA1LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIENoaW5hCi0JCQkiQ04iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMTQ5LCA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIENvbG9tYmlhCi0JCQkiQ08iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAxNDksIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ29zdGEgUmljYQotCQkJIkNSIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ3lwcnVzCi0JCQkiQ1kiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBDemVjaF9SZXB1YmxpYwotCQkJIkNaIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjMsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBEZW5tYXJrCi0JCQkiREsiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBEb21pbmljYW4gUmVwdWJsaWMKLQkJCSJETyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAwCi0JCQkJeyAxNDksIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gRXF1YWRvcgotCQkJIkVDIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAxMDAsIDExLCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEVsIFNhbHZhZG9yCi0JCQkiU1YiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA0LCAgIDM2LCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEZpbmxhbmQKLQkJCSJGSSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gRnJhbmNlCi0JCQkiRlIiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gR2VybWFueQotCQkJIkRFIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBHcmVlY2UKLQkJCSJHUiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gR3VhbQotCQkJIkdVIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCi0JCQkJeyAzNiwgIDQsICAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDE0OSwgIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gR3VhdGVtYWxhCi0JCQkiR1QiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgICAxNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSGFpdGkKLQkJCSJIVCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBIb25kdXJhcwotCQkJIkhOIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEhvbmcgS29uZwotCQkJIkhLIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEh1bmdhcnkKLQkJCSJIVSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBJY2VsYW5kCi0JCQkiSVMiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEluZGlhCi0JCQkiSU4iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDE0OSwJNCwgIDI0LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBJbmRvbmVzaWEKLQkJCSJJRCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMTQ5LAk0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIElyZWxhbmQKLQkJCSJJRSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgT0RPUiwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBJc3JhZWwKLQkJCSJJTCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgIDMsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4zCi0JCQkJeyA0LAk2LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDR+OQotCQkJCXsgMTAsCTQsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMTB+MTMKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEl0YWx5Ci0JCQkiSVQiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSmFwYW4KLQkJCSJKUCIsCi0JCQlKQVAsCi0JCQl7Ci0JCQkJeyAxLCAgIDE0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTQKLQkJCQl7IDM2LAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBKb3JkYW4KLQkJCSJKTyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDE0OSwJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBMYXR2aWEKLQkJCSJMViIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBMaWVjaHRlbnN0ZWluCi0JCQkiTEkiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDUyLAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBMaXRodWFuaWEKLQkJCSJMVCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBMdXhlbWJ1cmcKLQkJCSJMVSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBNYWxheXNpYQotCQkJIk1ZIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMzYsCTQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksICA1LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIE1hbHRhCi0JCQkiTVQiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTWFyb2NjbwotCQkJIk1BIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwJNCwgIDI0LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTWV4aWNvCi0JCQkiTVgiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwJNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCAgNSwgIDMwLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBOZXRoZXJsYW5kcwotCQkJIk5MIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsCTQsICAyNCwgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIE5ldyBaZWFsYW5kCi0JCQkiTloiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LAk0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwJNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBOb3J3YXkKLQkJCSJOTyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsCTQsICAyNCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLAk0LCAgMjQsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBQZXJ1Ci0JCQkiUEUiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDE0OSwgIDQsICAyNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gUG9ydHVnYWwKLQkJCSJQVCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gUG9sYW5kCi0JCQkiUEwiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFJvbWFuaWEKLQkJCSJSTyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gUnVzc2lhCi0JCQkiUlUiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDE0OSwgIDQsICAyMCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gU2F1ZGkgQXJhYmlhCi0JCQkiU0EiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gU2VyYmlhX2FuZF9Nb250ZW5lZ3JvCi0JCQkiQ1MiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFNpbmdhcG9yZQotCQkJIlNHIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFNsb3Zha2lhCi0JCQkiU0siLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFNsb3ZlbmlhCi0JCQkiU0kiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gU291dGggQWZyaWNhCi0JCQkiWkEiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFNvdXRoIEtvcmVhCi0JCQkiS1IiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgIDgsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjEyOAotCQkJCXsgMTQ5LCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTcGFpbgotCQkJIkVTIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMTcsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTd2VkZW4KLQkJCSJTRSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gU3dpdHplcmxhbmQKLQkJCSJDSCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFRhaXdhbgotCQkJIlRXIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCi0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBUdXJrZXkKLQkJCSJUUiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQotCQkJCXsgMzYsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gVUsKLQkJCSJHQiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQotCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gVWtyYWluZQotCQkJIlVBIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBVbml0ZWRfQXJhYl9FbWlyYXRlcwotCQkJIkFFIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBVbml0ZWRfU3RhdGVzCi0JCQkiVVMiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDExLCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKLQkJCQl7IDM2LCAgIDQsICAxNywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDUyLCAgIDQsICAyNCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDE0OSwgIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gVmVuZXp1ZWxhCi0JCQkiVkUiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKLQkJCQl7IDE0OSwgIDQsICAyNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gRGVmYXVsdAotCQkJIiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTEsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQotCQkJCXsgMzYsICAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgNTIsICAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAxNDksICA1LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLX07Ci0KLQotc3RhdGljIFBDSF9SRUdJT04gR2V0Q2hSZWdpb24oCi0JSU4gUFVDSEFSIENudHJ5Q29kZSkKLXsKLQlJTlQgbG9vcCA9IDA7Ci0JUENIX1JFR0lPTiBwQ2hSZWdpb24gPSBOVUxMOwotCi0Jd2hpbGUgKHN0cmNtcCgoUFNUUklORykgQ2hSZWdpb25bbG9vcF0uQ291bnRSZWcsICIiKSAhPSAwKQotCXsKLQkJaWYgKHN0cm5jbXAoKFBTVFJJTkcpIENoUmVnaW9uW2xvb3BdLkNvdW50UmVnLCAoUFNUUklORykgQ250cnlDb2RlLCAyKSA9PSAwKQotCQl7Ci0JCQlwQ2hSZWdpb24gPSAmQ2hSZWdpb25bbG9vcF07Ci0JCQlicmVhazsKLQkJfQotCQlsb29wKys7Ci0JfQotCi0JaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQotCQlwQ2hSZWdpb24gPSAmQ2hSZWdpb25bbG9vcF07Ci0JcmV0dXJuIHBDaFJlZ2lvbjsKLX0KLQotc3RhdGljIFZPSUQgQ2hCYW5kQ2hlY2soCi0JSU4gVUNIQVIgUGh5TW9kZSwKLQlPVVQgUFVDSEFSIHBDaFR5cGUpCi17Ci0Jc3dpdGNoKFBoeU1vZGUpCi0JewotCQljYXNlIFBIWV8xMUE6Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgUEhZXzExQU5fTUlYRUQ6Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkqcENoVHlwZSA9IEJBTkRfNUc7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgUEhZXzExQUdOX01JWEVEOgotCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkqcENoVHlwZSA9IEJBTkRfQk9USDsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQkqcENoVHlwZSA9IEJBTkRfMjRHOwotCQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgVUNIQVIgRmlsbENoTGlzdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQQ0hfREVTUCBwQ2hEZXNwLAotCUlOIFVDSEFSIE9mZnNldCwKLQlJTiBVQ0hBUiBpbmNyZW1lbnQpCi17Ci0JSU5UIGksIGosIGw7Ci0JVUNIQVIgY2hhbm5lbDsKLQotCWogPSBPZmZzZXQ7Ci0JZm9yIChpID0gMDsgaSA8IHBDaERlc3AtPk51bU9mQ2g7IGkrKykKLQl7Ci0JCWNoYW5uZWwgPSBwQ2hEZXNwLT5GaXJzdENoYW5uZWwgKyBpICogaW5jcmVtZW50OwotCQlmb3IgKGw9MDsgbDxNQVhfTlVNX09GX0NIQU5ORUxTOyBsKyspCi0JCXsKLQkJCWlmIChjaGFubmVsID09IHBBZC0+VHhQb3dlcltsXS5DaGFubmVsKQotCQkJewotCQkJCXBBZC0+Q2hhbm5lbExpc3Rbal0uUG93ZXIgPSBwQWQtPlR4UG93ZXJbbF0uUG93ZXI7Ci0JCQkJcEFkLT5DaGFubmVsTGlzdFtqXS5Qb3dlcjIgPSBwQWQtPlR4UG93ZXJbbF0uUG93ZXIyOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChsID09IE1BWF9OVU1fT0ZfQ0hBTk5FTFMpCi0JCQljb250aW51ZTsKLQotCQlwQWQtPkNoYW5uZWxMaXN0W2pdLkNoYW5uZWwgPSBwQ2hEZXNwLT5GaXJzdENoYW5uZWwgKyBpICogaW5jcmVtZW50OwotCQlwQWQtPkNoYW5uZWxMaXN0W2pdLk1heFR4UHdyID0gcENoRGVzcC0+TWF4VHhQd3I7Ci0JCXBBZC0+Q2hhbm5lbExpc3Rbal0uRGZzUmVxID0gcENoRGVzcC0+RGZzUmVxOwotCQlqKys7Ci0JfQotCXBBZC0+Q2hhbm5lbExpc3ROdW0gPSBqOwotCi0JcmV0dXJuIGo7Ci19Ci0KLQotc3RhdGljIGlubGluZSBWT0lEIENyZWF0ZUNoTGlzdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQQ0hfUkVHSU9OIHBDaFJlZ2lvbiwKLQlJTiBVQ0hBUiBHZW9ncmFwaHkpCi17Ci0JSU5UIGk7Ci0JVUNIQVIgb2Zmc2V0ID0gMDsKLQlQQ0hfREVTUCBwQ2hEZXNwOwotCVVDSEFSIENoVHlwZTsKLQlVQ0hBUiBpbmNyZW1lbnQ7Ci0KLQlpZiAocENoUmVnaW9uID09IE5VTEwpCi0JCXJldHVybjsKLQotCUNoQmFuZENoZWNrKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsICZDaFR5cGUpOwotCi0JZm9yIChpPTA7IGk8MTA7IGkrKykKLQl7Ci0JCXBDaERlc3AgPSAmcENoUmVnaW9uLT5DaERlc3BbaV07Ci0JCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPT0gMCkKLQkJCWJyZWFrOwotCi0JCWlmIChDaFR5cGUgPT0gQkFORF81RykKLQkJewotCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA8PSAxNCkKLQkJCQljb250aW51ZTsKLQkJfQotCQllbHNlIGlmIChDaFR5cGUgPT0gQkFORF8yNEcpCi0JCXsKLQkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKLQkJCQljb250aW51ZTsKLQkJfQotCi0JCWlmICgocENoRGVzcC0+R2VvZ3JhcGh5ID09IEJPVEgpCi0JCQl8fCAocENoRGVzcC0+R2VvZ3JhcGh5ID09IEdlb2dyYXBoeSkpCi0gICAgICAgIHsKLQkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKLSAgICAgICAgICAgICAgICBpbmNyZW1lbnQgPSA0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGluY3JlbWVudCA9IDE7Ci0JCQlvZmZzZXQgPSBGaWxsQ2hMaXN0KHBBZCwgcENoRGVzcCwgb2Zmc2V0LCBpbmNyZW1lbnQpOwotICAgICAgICB9Ci0JfQotfQotCi0KLVZPSUQgQnVpbGRDaGFubmVsTGlzdEV4KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVBDSF9SRUdJT04gcENoUmVnOwotCi0JcENoUmVnID0gR2V0Q2hSZWdpb24ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOwotCUNyZWF0ZUNoTGlzdChwQWQsIHBDaFJlZywgcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KTsKLX0KLQotCi1WT0lEIEJ1aWxkQmVhY29uQ2hMaXN0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEJ1ZiwKLQlPVVQJUFVMT05HIHBCdWZMZW4pCi17Ci0JSU5UIGk7Ci0JVUxPTkcgVG1wTGVuOwotCVBDSF9SRUdJT04gcENoUmVnaW9uOwotCVBDSF9ERVNQIHBDaERlc3A7Ci0JVUNIQVIgQ2hUeXBlOwotCi0JcENoUmVnaW9uID0gR2V0Q2hSZWdpb24ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOwotCi0JaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlDaEJhbmRDaGVjayhwQWQtPkNvbW1vbkNmZy5QaHlNb2RlLCAmQ2hUeXBlKTsKLQkqcEJ1ZkxlbiA9IDA7Ci0KLQlmb3IgKGk9MDsgaTwxMDsgaSsrKQotCXsKLQkJcENoRGVzcCA9ICZwQ2hSZWdpb24tPkNoRGVzcFtpXTsKLQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKENoVHlwZSA9PSBCQU5EXzVHKQotCQl7Ci0JCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsIDw9IDE0KQotCQkJCWNvbnRpbnVlOwotCQl9Ci0JCWVsc2UgaWYgKENoVHlwZSA9PSBCQU5EXzI0RykKLQkJewotCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA+IDE0KQotCQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gQk9USCkKLQkJCXx8IChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KSkKLQkJewotCQkJTWFrZU91dGdvaW5nRnJhbWUocEJ1ZiArICpwQnVmTGVuLAkJJlRtcExlbiwKLQkJCQkJCQkJMSwJCQkmcENoRGVzcC0+Rmlyc3RDaGFubmVsLAotCQkJCQkJCQkxLAkJCSZwQ2hEZXNwLT5OdW1PZkNoLAotCQkJCQkJCQkxLAkJCSZwQ2hEZXNwLT5NYXhUeFB3ciwKLQkJCQkJCQkJRU5EX09GX0FSR1MpOwotCQkJKnBCdWZMZW4gKz0gVG1wTGVuOwotCQl9Ci0JfQotfQotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLXN0YXRpYyBCT09MRUFOIElzVmFsaWRDaGFubmVsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSIGNoYW5uZWwpCi0KLXsKLQlJTlQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCi0JewotCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsID09IGNoYW5uZWwpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoaSA9PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQotCQlyZXR1cm4gRkFMU0U7Ci0JZWxzZQotCQlyZXR1cm4gVFJVRTsKLX0KLQotCi1zdGF0aWMgVUNIQVIgR2V0RXh0Q2goCi0JSU4gVUNIQVIgQ2hhbm5lbCwKLQlJTiBVQ0hBUiBEaXJlY3Rpb24pCi17Ci0JQ0hBUiBFeHRDaDsKLQotCWlmIChEaXJlY3Rpb24gPT0gRVhUQ0hBX0FCT1ZFKQotCQlFeHRDaCA9IENoYW5uZWwgKyA0OwotCWVsc2UKLQkJRXh0Q2ggPSAoQ2hhbm5lbCAtIDQpID4gMCA/IChDaGFubmVsIC0gNCkgOiAwOwotCi0JcmV0dXJuIEV4dENoOwotfQotCi0KLVZPSUQgTl9DaGFubmVsQ2hlY2soCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JLy9VQ0hBUiBDaGFubmVsTnVtID0gcEFkLT5DaGFubmVsTGlzdE51bTsKLQlVQ0hBUiBDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQotCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSAmJiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9PSBCV180MCkpCi0JewotCQlpZiAoQ2hhbm5lbCA+IDE0KQotCQl7Ci0JCQlpZiAoKENoYW5uZWwgPT0gMzYpIHx8IChDaGFubmVsID09IDQ0KSB8fCAoQ2hhbm5lbCA9PSA1MikgfHwgKENoYW5uZWwgPT0gNjApIHx8IChDaGFubmVsID09IDEwMCkgfHwgKENoYW5uZWwgPT0gMTA4KSB8fAotCQkJICAgIChDaGFubmVsID09IDExNikgfHwgKENoYW5uZWwgPT0gMTI0KSB8fCAoQ2hhbm5lbCA9PSAxMzIpIHx8IChDaGFubmVsID09IDE0OSkgfHwgKENoYW5uZWwgPT0gMTU3KSkKLQkJCXsKLQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0FCT1ZFOwotCQkJfQotCQkJZWxzZSBpZiAoKENoYW5uZWwgPT0gNDApIHx8IChDaGFubmVsID09IDQ4KSB8fCAoQ2hhbm5lbCA9PSA1NikgfHwgKENoYW5uZWwgPT0gNjQpIHx8IChDaGFubmVsID09IDEwNCkgfHwgKENoYW5uZWwgPT0gMTEyKSB8fAotCQkJCQkoQ2hhbm5lbCA9PSAxMjApIHx8IChDaGFubmVsID09IDEyOCkgfHwgKENoYW5uZWwgPT0gMTM2KSB8fCAoQ2hhbm5lbCA9PSAxNTMpIHx8IChDaGFubmVsID09IDE2MSkpCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9CRUxPVzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlkbwotCQkJewotCQkJCVVDSEFSIEV4dENoOwotCQkJCVVDSEFSIERpciA9IHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEE7Ci0JCQkJRXh0Q2ggPSBHZXRFeHRDaChDaGFubmVsLCBEaXIpOwotCQkJCWlmIChJc1ZhbGlkQ2hhbm5lbChwQWQsIEV4dENoKSkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlEaXIgPSAoRGlyID09IEVYVENIQV9BQk9WRSkgPyBFWFRDSEFfQkVMT1cgOiBFWFRDSEFfQUJPVkU7Ci0JCQkJRXh0Q2ggPSBHZXRFeHRDaChDaGFubmVsLCBEaXIpOwotCQkJCWlmIChJc1ZhbGlkQ2hhbm5lbChwQWQsIEV4dENoKSkKLQkJCQl7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBEaXI7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7Ci0JCQl9IHdoaWxlKEZBTFNFKTsKLQotCQkJaWYgKENoYW5uZWwgPT0gMTQpCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOwotCQkJCS8vcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9OT05FOwkvLyBXZSBkaWRuJ3Qgc2V0IHRoZSBFeHRDaCBhcyBOT05FIGR1ZSB0byBpdCdsbCBzZXQgaW4gUlRNUFNldEhUKCkKLQkJCX0KLQkJfQotCX0KLQotCi19Ci0KLQotVk9JRCBOX1NldENlbkNoKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCWlmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQUJPVkUpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9PSAxNCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAxOwotCQkJZWxzZQotCQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCX0KLX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCi1VSU5UOCBHZXRDdW50cnlNYXhUeFB3cigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVSU5UOCBjaGFubmVsKQotewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCi0JewotCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsID09IGNoYW5uZWwpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoaSA9PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQotCQlyZXR1cm4gMHhmZjsKLQllbHNlCi0JCXJldHVybiBwQWQtPkNoYW5uZWxMaXN0W2ldLk1heFR4UHdyOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vcnRfcmYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL3J0X3JmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNjM4ZjcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vcnRfcmYuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXJ0X3JmLmMKLQotCUFic3RyYWN0OgotCVJhbGluayBXaXJlbGVzcyBkcml2ZXIgUkYgcmVsYXRlZCBmdW5jdGlvbnMKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0JLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246IFdyaXRlIFJUMzB4eCBSRiByZWdpc3RlciB0aHJvdWdoIE1BQwotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMgUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJcmVnSUQsCi0JSU4JVUNIQVIJCQl2YWx1ZSkKLXsKLQlSRl9DU1JfQ0ZHX1NUUlVDCXJmY3NyOwotCVVJTlQJCQkJaSA9IDA7Ci0KLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBSRl9DU1JfQ0ZHLCAmcmZjc3Iud29yZCk7Ci0KLQkJaWYgKCFyZmNzci5maWVsZC5SRl9DU1JfS0lDSykKLQkJCWJyZWFrOwotCQlpKys7Ci0JfQotCXdoaWxlICgoaSA8IFJFVFJZX0xJTUlUKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpOwotCi0JaWYgKChpID09IFJFVFJZX0xJTUlUKSB8fCAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKLQl7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSZXRyeSBjb3VudCBleGhhdXN0ZWQgb3IgZGV2aWNlIHJlbW92ZWQhISFcbiIpKTsKLQkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7Ci0JfQotCi0JcmZjc3IuZmllbGQuUkZfQ1NSX1dSID0gMTsKLQlyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9IDE7Ci0JcmZjc3IuZmllbGQuVEVTVENTUl9SRkFDQ19SRUdOVU0gPSByZWdJRDsKLQlyZmNzci5maWVsZC5SRl9DU1JfREFUQSA9IHZhbHVlOwotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgUkZfQ1NSX0NGRywgcmZjc3Iud29yZCk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjogUmVhZCBSVDMweHggUkYgcmVnaXN0ZXIgdGhyb3VnaCBNQUMKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCUlSUUwgPQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfU1RBVFVTIFJUMzB4eFJlYWRSRlJlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJcmVnSUQsCi0JSU4JUFVDSEFSCQkJcFZhbHVlKQotewotCVJGX0NTUl9DRkdfU1RSVUMJcmZjc3I7Ci0JVUlOVAkJCQlpPTAsIGs9MDsKLQotCWZvciAoaT0wOyBpPE1BWF9CVVNZX0NPVU5UOyBpKyspCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFJGX0NTUl9DRkcsICZyZmNzci53b3JkKTsKLQotCQlpZiAocmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPT0gQlVTWSkKLQkJewotCQkJY29udGludWU7Ci0JCX0KLQkJcmZjc3Iud29yZCA9IDA7Ci0JCXJmY3NyLmZpZWxkLlJGX0NTUl9XUiA9IDA7Ci0JCXJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID0gMTsKLQkJcmZjc3IuZmllbGQuVEVTVENTUl9SRkFDQ19SRUdOVU0gPSByZWdJRDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgUkZfQ1NSX0NGRywgcmZjc3Iud29yZCk7Ci0JCWZvciAoaz0wOyBrPE1BWF9CVVNZX0NPVU5UOyBrKyspCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUkZfQ1NSX0NGRywgJnJmY3NyLndvcmQpOwotCi0JCQlpZiAocmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPT0gSURMRSkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoKHJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID09IElETEUpICYmCi0JCQkocmZjc3IuZmllbGQuVEVTVENTUl9SRkFDQ19SRUdOVU0gPT0gcmVnSUQpKQotCQl7Ci0JCQkqcFZhbHVlID0gKFVDSEFSKXJmY3NyLmZpZWxkLlJGX0NTUl9EQVRBOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKHJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID09IEJVU1kpCi0JewotCQlEQkdQUklOVF9FUlIoKCJSRiByZWFkIFIlZD0weCV4IGZhaWwsIGlbJWRdLCBrWyVkXVxuIiwgcmVnSUQsIHJmY3NyLndvcmQsaSxrKSk7Ci0JCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOwotCX0KLQotCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1WT0lEIE5JQ0luaXRSRlJlZ2lzdGVycygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCkKLXsKLQlpZiAocEFkLT5jaGlwT3BzLkFzaWNSZkluaXQpCi0JCXBBZC0+Y2hpcE9wcy5Bc2ljUmZJbml0KHBBZCk7Ci19Ci0KLQotVk9JRCBSdG1wQ2hpcE9wc1JGSG9vaygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCkKLXsKLQlSVE1QX0NISVBfT1AgKnBDaGlwT3BzID0gJnBBZC0+Y2hpcE9wczsKLQotCXBDaGlwT3BzLT5wUkZSZWdUYWJsZSA9IE5VTEw7Ci0JcENoaXBPcHMtPkFzaWNSZkluaXQgPSBOVUxMOwotCXBDaGlwT3BzLT5Bc2ljUmZUdXJuT24gPSBOVUxMOwotCXBDaGlwT3BzLT5Bc2ljUmZUdXJuT2ZmID0gTlVMTDsKLQlwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUgPSBOVUxMOwotCXBDaGlwT3BzLT5Bc2ljSGFsdEFjdGlvbiA9IE5VTEw7Ci0jaWZkZWYgUlQzM3h4Ci1pZiAoSVNfUlQzMzkwKHBBZCkgJiYgKHBBZC0+aW5mVHlwZSA9PSBSVE1QX0RFVl9JTkZfUENJKSkKLQkJewotCQkJcENoaXBPcHMtPnBSRlJlZ1RhYmxlID0gUkZSZWdUYWJsZU92ZXJSVDMzOTA7Ci0JCQlwQ2hpcE9wcy0+QXNpY0hhbHRBY3Rpb24gPSBSVDMzeHhIYWx0QWN0aW9uOwotCQkJcENoaXBPcHMtPkFzaWNSZlR1cm5PZmYgPSBSVDMzeHhMb2FkUkZTbGVlcE1vZGVTZXR1cDsKLQkJCXBDaGlwT3BzLT5Bc2ljUmZJbml0ID0gTklDSW5pdFJUMzM5MFJGUmVnaXN0ZXJzOwotCQkJcENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlID0gUlQzM3h4UmV2ZXJzZVJGU2xlZXBNb2RlU2V0dXA7Ci0JCX0KLSNlbHNlIC8vIFJUMzN4eCAvLwotCS8qIFdlIGRlcGVuZHMgb24gUmZJQ1R5cGUgYW5kIE1BQ1ZlcnNpb24gdG8gYXNzaWduIHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBjYWxsYmFja3MuICovCi0KLSNpZmRlZiBSVDMweHgKLQlpZiAoSVNfUlQzMHh4KHBBZCkpCi0JewotCQlwQ2hpcE9wcy0+cFJGUmVnVGFibGUgPSBSVDMweHhfUkZSZWdUYWJsZTsKLQkJcENoaXBPcHMtPkFzaWNIYWx0QWN0aW9uID0gUlQzMHh4SGFsdEFjdGlvbjsKLSNpZmRlZiBSVDMwOTAKLQkJaWYgKElTX1JUMzA5MChwQWQpICYmIChwQWQtPmluZlR5cGUgPT0gUlRNUF9ERVZfSU5GX1BDSSkpCi0JCXsKLQkJCXBDaGlwT3BzLT5Bc2ljUmZUdXJuT2ZmID0gUlQzMHh4TG9hZFJGU2xlZXBNb2RlU2V0dXA7Ci0JCQlwQ2hpcE9wcy0+QXNpY1JmSW5pdCA9IE5JQ0luaXRSVDMwOTBSRlJlZ2lzdGVyczsKLQkJCXBDaGlwT3BzLT5Bc2ljUmV2ZXJzZVJmRnJvbVNsZWVwTW9kZSA9IFJUMzB4eFJldmVyc2VSRlNsZWVwTW9kZVNldHVwOwotCQl9Ci0jZW5kaWYgLy8gUlQzMDkwIC8vCi0JfQotI2VuZGlmIC8vIFJUMzB4eCAvLwotI2VuZGlmIC8vIFJUMzN4eCAvLwotfQotCi0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9ydG1wX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL3J0bXBfaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGI5NWI3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL3J0bXBfaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzg4MiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXJ0bXBfaW5pdC5jCi0KLQlBYnN0cmFjdDoKLQlNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0JLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotVUNIQVIgICAgQklUOFtdID0gezB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODB9OwotY2hhciogICBDaXBoZXJOYW1lW10gPSB7Im5vbmUiLCJ3ZXA2NCIsIndlcDEyOCIsIlRLSVAiLCJBRVMiLCJDS0lQNjQiLCJDS0lQMTI4In07Ci0KLS8vCi0vLyBCQlAgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0Ci0vLwotUkVHX1BBSVIgICBCQlBSZWdUYWJsZVtdID0gewotCXtCQlBfUjY1LAkJMHgyQ30sCQkvLyBmaXggcnNzaSBpc3N1ZQotCXtCQlBfUjY2LAkJMHgzOH0sCS8vIEFsc28gc2V0IHRoaXMgZGVmYXVsdCB2YWx1ZSB0byBwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgYXQgaW5pdGlhbAotCXtCQlBfUjY5LAkJMHgxMn0sCi0Je0JCUF9SNzAsCQkweGF9LAkvLyBCQlBfUjcwIHdpbGwgY2hhbmdlIHRvIDB4OCBpbiBBcFN0YXJ0VXAgYW5kIExpbmtVcCBmb3IgcnQyODYwQywgb3RoZXJ3aXNlIHZhbHVlIGlzIDB4YQotCXtCQlBfUjczLAkJMHgxMH0sCi0Je0JCUF9SODEsCQkweDM3fSwKLQl7QkJQX1I4MiwJCTB4NjJ9LAotCXtCQlBfUjgzLAkJMHg2QX0sCi0Je0JCUF9SODQsCQkweDk5fSwJLy8gMHgxOSBpcyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4gMHg5OSBpcyBmb3IgcnQyODYwRCBhbmQgYmVmb3JlCi0Je0JCUF9SODYsCQkweDAwfSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4Ci0Je0JCUF9SOTEsCQkweDA0fSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4Ci0Je0JCUF9SOTIsCQkweDAwfSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4Ci0Je0JCUF9SMTAzLAkJMHgwMH0sCS8vIG5lYXIgcmFuZ2UgaGlnaC1wb3dlciBpc3N1ZSwgcmVxdWVzdGVkIGZyb20gR2FyeSBAMjAwOC0wNTI4Ci0Je0JCUF9SMTA1LAkJMHgwNX0sCS8vIDB4MDUgaXMgZm9yIHJ0Mjg2MEUgdG8gdHVybiBvbiBGRVEgY29udHJvbC4gSXQgaXMgc2FmZSBmb3IgcnQyODYwRCBhbmQgYmVmb3JlLCBiZWNhdXNlIEJpdCA3OjIgYXJlIHJlc2VydmVkIGluIHJ0Mjg2MEQgYW5kIGJlZm9yZS4KLQl7QkJQX1IxMDYsCQkweDM1fSwgIC8vIGZvciBTaG9ydEdJIHRocm91Z2hwdXQKLX07Ci0jZGVmaW5lCU5VTV9CQlBfUkVHX1BBUk1TCShzaXplb2YoQkJQUmVnVGFibGUpIC8gc2l6ZW9mKFJFR19QQUlSKSkKLQotCi0vLwotLy8gQVNJQyByZWdpc3RlciBpbml0aWFsaXphdGlvbiBzZXRzCi0vLwotCi1SVE1QX1JFR19QQUlSCU1BQ1JlZ1RhYmxlW10gPQl7Ci0jaWYgZGVmaW5lZChIV19CRUFDT05fT0ZGU0VUKSAmJiAoSFdfQkVBQ09OX09GRlNFVCA9PSAweDIwMCkKLQl7QkNOX09GRlNFVDAsCQkJMHhmOGYwZThlMH0sIC8qIDB4MzgwMChlMCksIDB4M0EwMChlOCksIDB4M0MwMChmMCksIDB4M0UwMChmOCksIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCi0Je0JDTl9PRkZTRVQxLAkJCTB4NmY3N2QwYzh9LCAvKiAweDMyMDAoYzgpLCAweDM0MDAoZDApLCAweDFEQzAoNzcpLCAweDFCQzAoNmYpLCA1MTJCIGZvciBlYWNoIGJlYWNvbiAqLwotI2VsaWYgZGVmaW5lZChIV19CRUFDT05fT0ZGU0VUKSAmJiAoSFdfQkVBQ09OX09GRlNFVCA9PSAweDEwMCkKLQl7QkNOX09GRlNFVDAsCQkJMHhlY2U4ZTRlMH0sIC8qIDB4MzgwMCwgMHgzQTAwLCAweDNDMDAsIDB4M0UwMCwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KLQl7QkNOX09GRlNFVDEsCQkJMHhmY2Y4ZjRmMH0sIC8qIDB4MzgwMCwgMHgzQTAwLCAweDNDMDAsIDB4M0UwMCwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KLSNlbHNlCi0gICAgI2Vycm9yIFlvdSBtdXN0IHJlLWNhbGN1bGF0ZSBuZXcgdmFsdWUgZm9yIEJDTl9PRkZTRVQwICYgQkNOX09GRlNFVDEgaW4gTUFDUmVnVGFibGVbXSEhIQotI2VuZGlmIC8vIEhXX0JFQUNPTl9PRkZTRVQgLy8KLQotCXtMRUdBQ1lfQkFTSUNfUkFURSwJCTB4MDAwMDAxM2Z9LCAvLyAgQmFzaWMgcmF0ZSBzZXQgYml0bWFwCi0Je0hUX0JBU0lDX1JBVEUsCQkweDAwMDA4MDAzfSwgLy8gQmFzaWMgSFQgcmF0ZSBzZXQgLCAyME0sIE1DUz0zLCBNTS4gRm9ybWF0IGlzIHRoZSBzYW1lIGFzIGluIFRYV0kuCi0Je01BQ19TWVNfQ1RSTCwJCTB4MDB9LCAvLyAweDEwMDQsICwgZGVmYXVsdCBEaXNhYmxlIFJYCi0Je1JYX0ZJTFRSX0NGRywJCTB4MTdmOTd9LCAvLzB4MTQwMCAgLCBSWCBmaWx0ZXIgY29udHJvbCwKLQl7QktPRkZfU0xPVF9DRkcsCTB4MjA5fSwgLy8gZGVmYXVsdCBzZXQgc2hvcnQgc2xvdCB0aW1lLCBDQ19ERUxBWV9USU1FIHNob3VsZCBiZSAyCi0JLy97VFhfU1dfQ0ZHMCwJCTB4NDBhMDZ9LCAvLyBHYXJ5LDIwMDYtMDgtMjMKLQl7VFhfU1dfQ0ZHMCwJCTB4MH0sCQkvLyBHYXJ5LDIwMDgtMDUtMjEgZm9yIENXQyB0ZXN0Ci0Je1RYX1NXX0NGRzEsCQkweDgwNjA2fSwgLy8gR2FyeSwyMDA2LTA4LTIzCi0Je1RYX0xJTktfQ0ZHLAkJMHgxMDIwfSwJCS8vIEdhcnksMjAwNi0wOC0yMwotCS8ve1RYX1RJTUVPVVRfQ0ZHLAkweDAwMTgyMDkwfSwJLy8gQ0NLIGhhcyBzb21lIHByb2JsZW0uIFNvIGluY3JlYXNlIHRpbWllb3V0IHZhbHVlLiAyMDA2LTEwLTA5Ly8gTUFydmVrIFJUCi0Je1RYX1RJTUVPVVRfQ0ZHLAkweDAwMGEyMDkwfSwJLy8gQ0NLIGhhcyBzb21lIHByb2JsZW0uIFNvIGluY3JlYXNlIHRpbWllb3V0IHZhbHVlLiAyMDA2LTEwLTA5Ly8gTUFydmVrIFJUICwgTW9kaWZ5IGZvciAyODYwRSAsMjAwNy0wOC0wMQotCXtNQVhfTEVOX0NGRywJCU1BWF9BR0dSRUdBVElPTl9TSVpFIHwgMHgwMDAwMTAwMH0sCS8vIDB4MzAxOCwgTUFYIGZyYW1lIGxlbmd0aC4gTWF4IFBTRFUgPSAxNmtieXRlcy4KLQl7TEVEX0NGRywJCTB4N2YwMzFlNDZ9LCAvLyBHYXJ5LCAyMDA2LTA4LTIzCi0KLS8vI2lmZGVmIENPTkZJR19BUF9TVVBQT1JUCi0vLwl7V01NX0FJRlNOX0NGRywJCTB4MDAwMDExNzN9LAotLy8Je1dNTV9DV01JTl9DRkcsCQkweDAwMDAyMzQ0fSwKLS8vCXtXTU1fQ1dNQVhfQ0ZHLAkJMHgwMDAwMzRhNn0sCi0vLwl7V01NX1RYT1AwX0NGRywJCTB4MDAxMDAwMjB9LAotLy8Je1dNTV9UWE9QMV9DRkcsCQkweDAwMkYwMDM4fSwKLS8vI2VuZGlmIC8vIENPTkZJR19BUF9TVVBQT1JUIC8vCi0KLS8vI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotLy8Je1dNTV9BSUZTTl9DRkcsCQkweDAwMDAyMjczfSwKLS8vCXtXTU1fQ1dNSU5fQ0ZHLAkJMHgwMDAwMjM0NH0sCi0vLwl7V01NX0NXTUFYX0NGRywJCTB4MDAwMDM0YWF9LAotLy8jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0jaWZkZWYgSU5GX0FNQVpPTl9TRQotCXtQQkZfTUFYX1BDTlQsCQkJMHgxRjNGNkY2Rn0sCS8vaXZlcnNvbiBtb2RpZnkgZm9yIHVzYiBpc3N1ZSwgMjAwOC8wOS8xOQotCQkJCQkJCQkJCQkvLyA2RiArIDZGIDwgdG90YWwgcGFnZSBjb3VudCBGRQotCQkJCQkJCQkJCQkvLyBzbyB0aGF0IFJYIGRvZXNuJ3Qgb2NjdXB5IFRYJ3MgYnVmZmVyIHNwYWNlIHdoZW4gV01NIGNvbmdlc3Rpb24uCi0jZWxzZQotCXtQQkZfTUFYX1BDTlQsCQkJMHgxRjNGQkY5Rn0sCS8vMHgxRjNmN2Y5Zn0sCQkvL0phbiwgMjAwNi8wNC8yMAotI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KLQkvL3tUWF9SVFlfQ0ZHLAkJCTB4NmJiODA0MDh9LAkvLyBKYW4sIDIwMDYvMTEvMTYKLS8vIFdNTV9BQ01fU1VQUE9SVAotLy8Je1RYX1JUWV9DRkcsCQkJMHg2YmI4MDEwMX0sCS8vIHNhbXBsZQotCXtUWF9SVFlfQ0ZHLAkJCTB4NDdkMDFmMGZ9LAkvLyBKYW4sIDIwMDYvMTEvMTYsIFNldCBUeFdJLT5BQ0sgPTAgaW4gUHJvYmUgUnNwIE1vZGlmeSBmb3IgMjg2MEUgLDIwMDctMDgtMDMKLQotCXtBVVRPX1JTUF9DRkcsCQkJMHgwMDAwMDAxM30sCS8vIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlcgotCXtDQ0tfUFJPVF9DRkcsCQkJMHgwNTc0MDAwMyAvKjB4MDE3NDAwMDMqL30sCS8vIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlci4gQW5kIFJUUyB0aHJlc2hvbGQgaXMgZW5hYmxlZC4KLQl7T0ZETV9QUk9UX0NGRywJCQkweDA1NzQwMDAzIC8qMHgwMTc0MDAwMyovfSwJLy8gSW5pdGlhbCBBdXRvX1Jlc3BvbmRlciwgYmVjYXVzZSBRQSB3aWxsIHR1cm4gb2ZmIEF1dG8tUmVzcG9uZGVyLiBBbmQgUlRTIHRocmVzaG9sZCBpcyBlbmFibGVkLgotCXtHRjIwX1BST1RfQ0ZHLAkJCTB4MDE3NDQwMDR9LCAgICAvLyBzZXQgMTk6MTggLS0+IFNob3J0IE5BViBmb3IgTUlNTyBQUwotCXtHRjQwX1BST1RfQ0ZHLAkJCTB4MDNGNDQwODR9LAotCXtNTTIwX1BST1RfQ0ZHLAkJCTB4MDE3NDQwMDR9LAotI2lmZGVmIFJUTVBfTUFDX1BDSQotCXtNTTQwX1BST1RfQ0ZHLAkJCTB4MDNGNTQwODR9LAotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCXtUWE9QX0NUUkxfQ0ZHLAkJCTB4MDAwMDU4M2YsIC8qMHgwMDAwMjQzZiovIC8qMHgwMDAwMjRiZiovfSwJLy9FeHRlbnNpb24gY2hhbm5lbCBiYWNrb2ZmLgotCXtUWF9SVFNfQ0ZHLAkJCTB4MDAwOTJiMjB9LAotLy8jaWZkZWYgV0lGSV9URVNUCi0Je0VYUF9BQ0tfVElNRSwJCQkweDAwMjQwMGNhfSwJLy8gZGVmYXVsdCB2YWx1ZQotLy8jZWxzZQotLy8Je0VYUF9BQ0tfVElNRSwJCQkweDAwNTQwMGNhfSwJLy8gc3VnZ2VzdGVkIGJ5IEdyYXkgQCAyMDA3MDMyMyBmb3IgMTFuIGludGVsLXN0YSB0aHJvdWdocHV0Ci0vLyNlbmRpZiAvLyBlbmQgLSBXSUZJX1RFU1QgLy8KLS8vI2lmZGVmIENPTkZJR19BUF9TVVBQT1JUCi0vLwl7VEJUVF9TWU5DX0NGRywJCQkweDAwNDIyMDAwfSwJLy8gVEJUVF9BREpVU1QoNzowKSA9PSAwCi0vLwl7VEJUVF9TWU5DX0NGRywJCQkweDAwMDEyMDAwfSwJLy8gVEJUVF9BREpVU1QoNzowKSA9PSAwCi0vLyNlbmRpZiAvLyBDT05GSUdfQVBfU1VQUE9SVCAvLwotCXtUWE9QX0hMRFJfRVQsCQkJMHgwMDAwMDAwMn0sCi0KLQkvKiBKZXJyeSBjb21tZW50cyAyMDA4LzAxLzE2OiB3ZSB1c2UgU0lGUyA9IDEwdXMgaW4gQ0NLIGRlZmF1bHRseSwgYnV0IGl0IHNlZW1zIHRoYXQgMTB1cwotCQlpcyB0b28gc21hbGwgZm9yIElOVEVMIDIyMDBiZyBjYXJkLCBzbyBpbiBNQlNTIG1vZGUsIHRoZSBkZWx0YSB0aW1lIGJldHdlZW4gYmVhY29uMAotCQlhbmQgYmVhY29uMSBpcyBTSUZTICgxMHVzKSwgc28gaWYgSU5URUwgMjIwMGJnIGNhcmQgY29ubmVjdHMgdG8gQlNTMCwgdGhlIHBpbmcKLQkJd2lsbCBhbHdheXMgbG9zdC4gU28gd2UgY2hhbmdlIHRoZSBTSUZTIG9mIENDSyBmcm9tIDEwdXMgdG8gMTZ1cy4gKi8KLQl7WElGU19USU1FX0NGRywJCQkweDMzYTQxMDEwfSwKLQl7UFdSX1BJTl9DRkcsCQkJMHgwMDAwMDAwM30sCS8vIHBhdGNoIGZvciAyODgwLUUKLX07Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotUlRNUF9SRUdfUEFJUglTVEFNQUNSZWdUYWJsZVtdID0JewotCXtXTU1fQUlGU05fQ0ZHLAkJMHgwMDAwMjI3M30sCi0Je1dNTV9DV01JTl9DRkcsCTB4MDAwMDIzNDR9LAotCXtXTU1fQ1dNQVhfQ0ZHLAkweDAwMDAzNGFhfSwKLX07Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNkZWZpbmUJTlVNX01BQ19SRUdfUEFSTVMJCShzaXplb2YoTUFDUmVnVGFibGUpIC8gc2l6ZW9mKFJUTVBfUkVHX1BBSVIpKQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2RlZmluZQlOVU1fU1RBX01BQ19SRUdfUEFSTVMJKHNpemVvZihTVEFNQUNSZWdUYWJsZSkgLyBzaXplb2YoUlRNUF9SRUdfUEFJUikpCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUFsbG9jYXRlIFJUTVBfQURBUFRFUiBkYXRhIGJsb2NrIGFuZCBkbyBzb21lIGluaXRpYWxpemF0aW9uCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTkRJU19TVEFUVVNfU1VDQ0VTUwotCQlORElTX1NUQVRVU19GQUlMVVJFCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfU1RBVFVTCVJUTVBBbGxvY0FkYXB0ZXJCbG9jaygKLQlJTiAgUFZPSUQJaGFuZGxlLAotCU9VVAlQUlRNUF9BREFQVEVSCSpwcEFkYXB0ZXIpCi17Ci0JUFJUTVBfQURBUFRFUglwQWQ7Ci0JTkRJU19TVEFUVVMJCVN0YXR1czsKLQlJTlQJCQlpbmRleDsKLQlVQ0hBUgkJCSpwQmVhY29uQnVmID0gTlVMTDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSVE1QQWxsb2NBZGFwdGVyQmxvY2tcbiIpKTsKLQotCSpwcEFkYXB0ZXIgPSBOVUxMOwotCi0JZG8KLQl7Ci0JCS8vIEFsbG9jYXRlIFJUTVBfQURBUFRFUiBtZW1vcnkgYmxvY2sKLQkJcEJlYWNvbkJ1ZiA9IGttYWxsb2MoTUFYX0JFQUNPTl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7Ci0JCWlmIChwQmVhY29uQnVmID09IE5VTEwpCi0JCXsKLQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IC0gQmVhY29uQnVmIVxuIikpOwotCQkJYnJlYWs7Ci0JCX0KLQkJTmRpc1plcm9NZW1vcnkocEJlYWNvbkJ1ZiwgTUFYX0JFQUNPTl9TSVpFKTsKLQotCQlTdGF0dXMgPSBBZGFwdGVyQmxvY2tBbGxvY2F0ZU1lbW9yeShoYW5kbGUsIChQVk9JRCAqKSZwQWQpOwotCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBBREFQVEVSXG4iKSk7Ci0JCQlicmVhazsKLQkJfQotCQlwQWQtPkJlYWNvbkJ1ZiA9IHBCZWFjb25CdWY7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJcblxuPT09IHBBZCA9ICVwLCBzaXplID0gJWQgPT09XG5cbiIsIHBBZCwgKFVJTlQzMilzaXplb2YoUlRNUF9BREFQVEVSKSkpOwotCi0KLQkJLy8gSW5pdCBzcGluIGxvY2tzCi0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPlJ4UmluZ0xvY2spOwotI2lmZGVmIFJUMzA5MAotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1jdUNtZExvY2spOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFJUMzA5MCAvLwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JCWZvciAoaW5kZXggPTAgOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKQotCQl7Ci0JCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5UeFN3UXVldWVMb2NrW2luZGV4XSk7Ci0JCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5EZVF1ZXVlTG9ja1tpbmRleF0pOwotCQkJcEFkLT5EZVF1ZXVlUnVubmluZ1tpbmRleF0gPSBGQUxTRTsKLQkJfQotCi0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPmlycV9sb2NrKTsKLQotCi0JfSB3aGlsZSAoRkFMU0UpOwotCi0JaWYgKChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgJiYgKHBCZWFjb25CdWYpKQotCQlrZnJlZShwQmVhY29uQnVmKTsKLQotCSpwcEFkYXB0ZXIgPSBwQWQ7Ci0KLQlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gUlRNUEFsbG9jQWRhcHRlckJsb2NrLCBTdGF0dXM9JXhcbiIsIFN0YXR1cykpOwotCXJldHVybiBTdGF0dXM7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJlYWQgaW5pdGlhbCBUeCBwb3dlciBwZXIgTUNTIGFuZCBCVyBmcm9tIEVFUFJPTQotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFJlYWRUeFB3clBlclJhdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JVUxPTkcJCWRhdGEsIEFkYXRhLCBHZGF0YTsKLQlVU0hPUlQJCWksIHZhbHVlLCB2YWx1ZTI7Ci0JSU5UCQkJQXB3cmRlbHRhLCBHcHdyZGVsdGE7Ci0JVUNIQVIJCXQxLHQyLHQzLHQ0OwotCUJPT0xFQU4JCWJBcHdyZGVsdGFNaW51cyA9IFRSVUUsIGJHcHdyZGVsdGFNaW51cyA9IFRSVUU7Ci0KLQkvLwotCS8vIEdldCBwb3dlciBkZWx0YSBmb3IgMjBNSHogYW5kIDQwTUh6LgotCS8vCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhwb3dlciBwZXIgUmF0ZVxuIikpOwotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfREVMVEEsIHZhbHVlMik7Ci0JQXB3cmRlbHRhID0gMDsKLQlHcHdyZGVsdGEgPSAwOwotCi0JaWYgKCh2YWx1ZTIgJiAweGZmKSAhPSAweGZmKQotCXsKLQkJaWYgKCh2YWx1ZTIgJiAweDgwKSkKLQkJCUdwd3JkZWx0YSA9ICh2YWx1ZTImMHhmKTsKLQotCQlpZiAoKHZhbHVlMiAmIDB4NDApKQotCQkJYkdwd3JkZWx0YU1pbnVzID0gRkFMU0U7Ci0JCWVsc2UKLQkJCWJHcHdyZGVsdGFNaW51cyA9IFRSVUU7Ci0JfQotCWlmICgodmFsdWUyICYgMHhmZjAwKSAhPSAweGZmMDApCi0JewotCQlpZiAoKHZhbHVlMiAmIDB4ODAwMCkpCi0JCQlBcHdyZGVsdGEgPSAoKHZhbHVlMiYweGYwMCk+PjgpOwotCi0JCWlmICgodmFsdWUyICYgMHg0MDAwKSkKLQkJCWJBcHdyZGVsdGFNaW51cyA9IEZBTFNFOwotCQllbHNlCi0JCQliQXB3cmRlbHRhTWludXMgPSBUUlVFOwotCX0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHcHdyZGVsdGEgPSAleCwgQXB3cmRlbHRhID0gJXggLlxuIiwgR3B3cmRlbHRhLCBBcHdyZGVsdGEpKTsKLQotCS8vCi0JLy8gR2V0IFR4cG93ZXIgcGVyIE1DUyBmb3IgMjBNSHogaW4gMi40Ry4KLQkvLwotCWZvciAoaT0wOyBpPDU7IGkrKykKLQl7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzJfNEcgKyBpKjQsIHZhbHVlKTsKLQkJZGF0YSA9IHZhbHVlOwotCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQotCQl7Ci0JCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOwotCQkJaWYgKHQxID4gMHhmKQotCQkJCXQxID0gMHhmOwotCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKLQkJCWlmICh0MiA+IDB4ZikKLQkJCQl0MiA9IDB4ZjsKLQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOwotCQkJaWYgKHQzID4gMHhmKQotCQkJCXQzID0gMHhmOwotCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKLQkJCWlmICh0NCA+IDB4ZikKLQkJCQl0NCA9IDB4ZjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKLQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOwotCQkJZWxzZQotCQkJCXQxID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKLQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShBcHdyZGVsdGEpOwotCQkJZWxzZQotCQkJCXQyID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBBcHdyZGVsdGEpCi0JCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7Ci0JCQllbHNlCi0JCQkJdDMgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQotCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7Ci0JCQllbHNlCi0JCQkJdDQgPSAwOwotCQl9Ci0JCUFkYXRhID0gdDEgKyAodDI8PDQpICsgKHQzPDw4KSArICh0NDw8MTIpOwotCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQotCQl7Ci0JCQl0MSA9ICh2YWx1ZSYweGYpKyhHcHdyZGVsdGEpOwotCQkJaWYgKHQxID4gMHhmKQotCQkJCXQxID0gMHhmOwotCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoR3B3cmRlbHRhKTsKLQkJCWlmICh0MiA+IDB4ZikKLQkJCQl0MiA9IDB4ZjsKLQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhHcHdyZGVsdGEpOwotCQkJaWYgKHQzID4gMHhmKQotCQkJCXQzID0gMHhmOwotCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoR3B3cmRlbHRhKTsKLQkJCWlmICh0NCA+IDB4ZikKLQkJCQl0NCA9IDB4ZjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmICgodmFsdWUmMHhmKSA+IEdwd3JkZWx0YSkKLQkJCQl0MSA9ICh2YWx1ZSYweGYpLShHcHdyZGVsdGEpOwotCQkJZWxzZQotCQkJCXQxID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKLQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOwotCQkJZWxzZQotCQkJCXQyID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCi0JCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEdwd3JkZWx0YSk7Ci0JCQllbHNlCi0JCQkJdDMgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gR3B3cmRlbHRhKQotCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7Ci0JCQllbHNlCi0JCQkJdDQgPSAwOwotCQl9Ci0JCUdkYXRhID0gdDEgKyAodDI8PDQpICsgKHQzPDw4KSArICh0NDw8MTIpOwotCi0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzJfNEcgKyBpKjQgKyAyLCB2YWx1ZSk7Ci0JCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCi0JCXsKLQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7Ci0JCQlpZiAodDEgPiAweGYpCi0JCQkJdDEgPSAweGY7Ci0JCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOwotCQkJaWYgKHQyID4gMHhmKQotCQkJCXQyID0gMHhmOwotCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7Ci0JCQlpZiAodDMgPiAweGYpCi0JCQkJdDMgPSAweGY7Ci0JCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOwotCQkJaWYgKHQ0ID4gMHhmKQotCQkJCXQ0ID0gMHhmOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQotCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7Ci0JCQllbHNlCi0JCQkJdDEgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQotCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7Ci0JCQllbHNlCi0JCQkJdDIgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKLQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKLQkJCWVsc2UKLQkJCQl0MyA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCi0JCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKLQkJCWVsc2UKLQkJCQl0NCA9IDA7Ci0JCX0KLQkJQWRhdGEgfD0gKCh0MTw8MTYpICsgKHQyPDwyMCkgKyAodDM8PDI0KSArICh0NDw8MjgpKTsKLQkJaWYgKGJHcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKLQkJewotCQkJdDEgPSAodmFsdWUmMHhmKSsoR3B3cmRlbHRhKTsKLQkJCWlmICh0MSA+IDB4ZikKLQkJCQl0MSA9IDB4ZjsKLQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEdwd3JkZWx0YSk7Ci0JCQlpZiAodDIgPiAweGYpCi0JCQkJdDIgPSAweGY7Ci0JCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoR3B3cmRlbHRhKTsKLQkJCWlmICh0MyA+IDB4ZikKLQkJCQl0MyA9IDB4ZjsKLQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEdwd3JkZWx0YSk7Ci0JCQlpZiAodDQgPiAweGYpCi0JCQkJdDQgPSAweGY7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoKHZhbHVlJjB4ZikgPiBHcHdyZGVsdGEpCi0JCQkJdDEgPSAodmFsdWUmMHhmKS0oR3B3cmRlbHRhKTsKLQkJCWVsc2UKLQkJCQl0MSA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBHcHdyZGVsdGEpCi0JCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oR3B3cmRlbHRhKTsKLQkJCWVsc2UKLQkJCQl0MiA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gR3B3cmRlbHRhKQotCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShHcHdyZGVsdGEpOwotCQkJZWxzZQotCQkJCXQzID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEdwd3JkZWx0YSkKLQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShHcHdyZGVsdGEpOwotCQkJZWxzZQotCQkJCXQ0ID0gMDsKLQkJfQotCQlHZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOwotCQlkYXRhIHw9ICh2YWx1ZTw8MTYpOwotCi0JCS8qIEZvciAyME0vNDBNIFBvd2VyIERlbHRhIGlzc3VlICovCi0JCXBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSA9IGRhdGE7Ci0JCXBBZC0+VHgyME1Qd3JDZmdHQmFuZFtpXSA9IGRhdGE7Ci0JCXBBZC0+VHg0ME1Qd3JDZmdBQmFuZFtpXSA9IEFkYXRhOwotCQlwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbaV0gPSBHZGF0YTsKLQotCQlpZiAoZGF0YSAhPSAweGZmZmZmZmZmKQotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBkYXRhKTsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjIwTUh6IEJXLCAyLjRHIGJhbmQtJWx4LCAgQWRhdGEgPSAlbHgsICBHZGF0YSA9ICVseCBcbiIsIGRhdGEsIEFkYXRhLCBHZGF0YSkpOwotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUmVhZCBpbml0aWFsIGNoYW5uZWwgcG93ZXIgcGFyYW1ldGVycyBmcm9tIEVFUFJPTQotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFJlYWRDaGFubmVsUHdyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCVVDSEFSCQkJCWksIGNob2Zmc2V0OwotCUVFUFJPTV9UWF9QV1JfU1RSVUMJICAgIFBvd2VyOwotCUVFUFJPTV9UWF9QV1JfU1RSVUMJICAgIFBvd2VyMjsKLQotCS8vIFJlYWQgVHggcG93ZXIgdmFsdWUgZm9yIGFsbCBjaGFubmVscwotCS8vIFZhbHVlIGZyb20gMSAtIDB4N2YuIERlZmF1bHQgdmFsdWUgaXMgMjQuCi0JLy8gUG93ZXIgdmFsdWUgOiAyLjRHIDB4MDAgKDApIH4gMHgxRiAoMzEpCi0JLy8gICAgICAgICAgICAgOiA1LjVHIDB4RjkgKC03KSB+IDB4MEYgKDE1KQotCi0JLy8gMC4gMTFiL2csIGNoMSAtIGNoIDE0Ci0JZm9yIChpID0gMDsgaSA8IDc7IGkrKykKLQl7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0dfVFhfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlci53b3JkKTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fR19UWDJfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlcjIud29yZCk7Ci0JCXBBZC0+VHhQb3dlcltpICogMl0uQ2hhbm5lbCA9IGkgKiAyICsgMTsKLQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uQ2hhbm5lbCA9IGkgKiAyICsgMjsKLQotCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUwID4gMzEpIHx8IChQb3dlci5maWVsZC5CeXRlMCA8IDApKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JCWVsc2UKLQkJCXBBZC0+VHhQb3dlcltpICogMl0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKLQotCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxID4gMzEpIHx8IChQb3dlci5maWVsZC5CeXRlMSA8IDApKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQllbHNlCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUxOwotCi0JCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUwID4gMzEpIHx8IChQb3dlcjIuZmllbGQuQnl0ZTAgPCAwKSkKLQkJCXBBZC0+VHhQb3dlcltpICogMl0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJZWxzZQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTA7Ci0KLQkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTEgPiAzMSkgfHwgKFBvd2VyMi5maWVsZC5CeXRlMSA8IDApKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJZWxzZQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOwotCX0KLQotCS8vIDEuIFUtTklJIGxvd2VyL21pZGRsZSBiYW5kOiAzNiwgMzgsIDQwOyA0NCwgNDYsIDQ4OyA1MiwgNTQsIDU2OyA2MCwgNjIsIDY0IChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopCi0JLy8gMS4xIEZpbGwgdXAgY2hhbm5lbAotCWNob2Zmc2V0ID0gMTQ7Ci0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQl7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAk9IDM2ICsgaSAqIDggKyAwOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCi0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbAk9IDM2ICsgaSAqIDggKyAyOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCi0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uQ2hhbm5lbAk9IDM2ICsgaSAqIDggKyA0OwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCX0KLQotCS8vIDEuMiBGaWxsIHVwIHBvd2VyCi0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQl7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlci53b3JkKTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWDJfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlcjIud29yZCk7Ci0KLQkJaWYgKChQb3dlci5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTAgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOwotCi0JCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUxID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKLQotCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUwID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUwOwotCi0JCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTEgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7Ci0JfQotCi0JLy8gMi4gSGlwcGVyTEFOIDIgMTAwLCAxMDIgLDEwNDsgMTA4LCAxMTAsIDExMjsgMTE2LCAxMTgsIDEyMDsgMTI0LCAxMjYsIDEyODsgMTMyLCAxMzQsIDEzNjsgMTQwIChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopCi0JLy8gMi4xIEZpbGwgdXAgY2hhbm5lbAotCWNob2Zmc2V0ID0gMTQgKyAxMjsKLQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQotCXsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCT0gMTAwICsgaSAqIDggKyAwOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCi0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbAk9IDEwMCArIGkgKiA4ICsgMjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwJPSAxMDAgKyBpICogOCArIDQ7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JfQotCXBBZC0+VHhQb3dlclszICogNSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAkJPSAxNDA7Ci0JcEFkLT5UeFBvd2VyWzMgKiA1ICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCXBBZC0+VHhQb3dlclszICogNSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0KLQkvLyAyLjIgRmlsbCB1cCBwb3dlcgotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JewotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIud29yZCk7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIyLndvcmQpOwotCi0JCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKLQotCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMSA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7Ci0KLQkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKLQotCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUxID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOwotCX0KLQotCS8vIDMuIFUtTklJIHVwcGVyIGJhbmQ6IDE0OSwgMTUxLCAxNTM7IDE1NywgMTU5LCAxNjE7IDE2NSwgMTY3LCAxNjk7IDE3MSwgMTczIChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopCi0JLy8gMy4xIEZpbGwgdXAgY2hhbm5lbAotCWNob2Zmc2V0ID0gMTQgKyAxMiArIDE2OwotCS8qZm9yIChpID0gMDsgaSA8IDI7IGkrKykqLwotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0JewotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJPSAxNDkgKyBpICogOCArIDA7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0KLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5DaGFubmVsCT0gMTQ5ICsgaSAqIDggKyAyOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCi0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uQ2hhbm5lbAk9IDE0OSArIGkgKiA4ICsgNDsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQl9Ci0JcEFkLT5UeFBvd2VyWzMgKiAzICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCQk9IDE3MTsKLQlwQWQtPlR4UG93ZXJbMyAqIDMgKyBjaG9mZnNldCArIDBdLlBvd2VyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JcEFkLT5UeFBvd2VyWzMgKiAzICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQotCXBBZC0+VHhQb3dlclszICogMyArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbAkJPSAxNzM7Ci0JcEFkLT5UeFBvd2VyWzMgKiAzICsgY2hvZmZzZXQgKyAxXS5Qb3dlcgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCXBBZC0+VHhQb3dlclszICogMyArIGNob2Zmc2V0ICsgMV0uUG93ZXIyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0KLQkvLyAzLjIgRmlsbCB1cCBwb3dlcgotCS8qZm9yIChpID0gMDsgaSA8IDQ7IGkrKykqLwotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JewotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIud29yZCk7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIyLndvcmQpOwotCi0JCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKLQotCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMSA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7Ci0KLQkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKLQotCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUxID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOwotCX0KLQotCS8vIDQuIFByaW50IGFuZCBEZWJ1ZwotCS8qY2hvZmZzZXQgPSAxNCArIDEyICsgMTYgKyA3OyovCi0JY2hvZmZzZXQgPSAxNCArIDEyICsgMTYgKyAxMTsKLQotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlSZWFkIHRoZSBmb2xsb3dpbmcgZnJvbSB0aGUgcmVnaXN0cnkKLQkJMS4gQWxsIHRoZSBwYXJhbWV0ZXJzCi0JCTIuIE5ldHdvcmtBZGRyZXMKLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0CUZvciB1c2UgYnkgTmRpc09wZW5Db25maWd1cmF0aW9uCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX1NVQ0NFU1MKLQkJTkRJU19TVEFUVVNfRkFJTFVSRQotCQlORElTX1NUQVRVU19SRVNPVVJDRVMKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMJTklDUmVhZFJlZ1BhcmFtZXRlcnMoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCU5ESVNfSEFORExFCQkJV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0Ci0JKQotewotCU5ESVNfU1RBVFVTCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gTklDUmVhZFJlZ1BhcmFtZXRlcnMsIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7Ci0JcmV0dXJuIFN0YXR1czsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUmVhZCBpbml0aWFsIHBhcmFtZXRlcnMgZnJvbSBFRVBST00KLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECU5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCW1hY19hZGRyKQotewotCVVJTlQzMgkJCWRhdGEgPSAwOwotCVVTSE9SVAkJCWksIHZhbHVlLCB2YWx1ZTI7Ci0JVUNIQVIJCQlUbXBQaHk7Ci0JRUVQUk9NX1RYX1BXUl9TVFJVQwkgICAgUG93ZXI7Ci0JRUVQUk9NX1ZFUlNJT05fU1RSVUMgICAgVmVyc2lvbjsKLQlFRVBST01fQU5URU5OQV9TVFJVQwlBbnRlbm5hOwotCUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQyAgICBOaWNDb25maWcyOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzXG4iKSk7Ci0KLQlpZiAocEFkLT5jaGlwT3BzLmVlaW5pdCkKLQkJcEFkLT5jaGlwT3BzLmVlaW5pdChwQWQpOwotI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAotI2lmZGVmIFJUMzB4eAotCWlmKCFwQWQtPmJGcm9jZUVFUFJPTUJ1ZmZlciAmJiBwQWQtPmJFRVBST01GaWxlKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzOjooRWZ1c2UpTG9hZCAgdG8gRUVQUk9NIEJ1ZmZlciBNb2RlXG4iKSk7Ci0JCWVGdXNlTG9hZEVFUFJPTShwQWQpOwotCX0KLSNlbmRpZiAvLyBSVDMweHggLy8KLSNlbmRpZiAvLyBSVE1QX0VGVVNFX1NVUFBPUlQgLy8KLQotCS8vIEluaXQgRUVQUk9NIEFkZHJlc3MgTnVtYmVyLCBiZWZvcmUgYWNjZXNzIEVFUFJPTTsgaWYgOTNjNDYsIEVFUFJPTUFkZHJlc3NOdW09NiwgZWxzZSBpZiA5M2M2NiwgRUVQUk9NQWRkcmVzc051bT04Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmZGF0YSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEUyUFJPTV9DU1IgPSAweCV4XG4iLCBkYXRhKSk7Ci0KLQlpZigoZGF0YSAmIDB4MzApID09IDApCi0JCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDY7CQkvLyA5M0M0NgotCWVsc2UgaWYoKGRhdGEgJiAweDMwKSA9PSAweDEwKQotCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA4OyAgICAgLy8gOTNDNjYKLQllbHNlCi0JCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7ICAgICAvLyA5M0M4NgotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBFRVBST01BZGRyZXNzTnVtID0gJWRcbiIsIHBBZC0+RUVQUk9NQWRkcmVzc051bSApKTsKLQotCS8vIFJUMjg2MCBNQUMgbm8gbG9uZ2VyIGF1dG8gbG9hZCBNQUMgYWRkcmVzcyBmcm9tIEUyUFJPTS4gRHJpdmVyIGhhcyB0byBpbnRpYWxpemUKLQkvLyBNQUMgYWRkcmVzcyByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIEUyUFJPTSBzZXR0aW5nCi0JaWYgKG1hY19hZGRyID09IE5VTEwgfHwKLQkJc3RybGVuKChQU1RSSU5HKSBtYWNfYWRkcikgIT0gMTcgfHwKLQkJbWFjX2FkZHJbMl0gIT0gJzonICB8fCBtYWNfYWRkcls1XSAhPSAnOicgIHx8IG1hY19hZGRyWzhdICE9ICc6JyB8fAotCQltYWNfYWRkclsxMV0gIT0gJzonIHx8IG1hY19hZGRyWzE0XSAhPSAnOicpCi0JewotCQlVU0hPUlQgIEFkZHIwMSxBZGRyMjMsQWRkcjQ1IDsKLQotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDQsIEFkZHIwMSk7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNiwgQWRkcjIzKTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA4LCBBZGRyNDUpOwotCi0JCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSA9IChVQ0hBUikoQWRkcjAxICYgMHhmZik7Ci0JCXBBZC0+UGVybWFuZW50QWRkcmVzc1sxXSA9IChVQ0hBUikoQWRkcjAxID4+IDgpOwotCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMl0gPSAoVUNIQVIpKEFkZHIyMyAmIDB4ZmYpOwotCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbM10gPSAoVUNIQVIpKEFkZHIyMyA+PiA4KTsKLQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzRdID0gKFVDSEFSKShBZGRyNDUgJiAweGZmKTsKLQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdID0gKFVDSEFSKShBZGRyNDUgPj4gOCk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW5pdGlhbGl6ZSBNQUMgQWRkcmVzcyBmcm9tIEUyUFJPTSBcbiIpKTsKLQl9Ci0JZWxzZQotCXsKLQkJSU5UCQlqOwotCQlQU1RSSU5HCW1hY3B0cjsKLQotCQltYWNwdHIgPSAoUFNUUklORykgbWFjX2FkZHI7Ci0KLQkJZm9yIChqPTA7IGo8TUFDX0FERFJfTEVOOyBqKyspCi0JCXsKLQkJCUF0b0gobWFjcHRyLCAmcEFkLT5QZXJtYW5lbnRBZGRyZXNzW2pdLCAxKTsKLQkJCW1hY3B0cj1tYWNwdHIrMzsKLQkJfQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkluaXRpYWxpemUgTUFDIEFkZHJlc3MgZnJvbSBtb2R1bGUgcGFyYW1ldGVyIFxuIikpOwotCX0KLQotCi0JewotCQkvL21vcmUgY29udmVuaW5ldCB0byB0ZXN0IG1ic3NpZCwgc28gYXAncyBic3NpZCAmMHhmMQotCQlpZiAocEFkLT5QZXJtYW5lbnRBZGRyZXNzWzBdID09IDB4ZmYpCi0JCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPSBSYW5kb21CeXRlKHBBZCkmMHhmODsKLQotCQkvL2lmIChwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0gPT0gMHhmZikKLQkJLy8JcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdID0gUmFuZG9tQnl0ZShwQWQpJjB4Zjg7Ci0KLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiRTJQUk9NIE1BQzogPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzBdLCBwQWQtPlBlcm1hbmVudEFkZHJlc3NbMV0sCi0JCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMl0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1szXSwKLQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s0XSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdKSk7Ci0JCWlmIChwQWQtPmJMb2NhbEFkbWluTUFDID09IEZBTFNFKQotCQl7Ci0JCQlNQUNfRFcwX1NUUlVDIGNzcjI7Ci0JCQlNQUNfRFcxX1NUUlVDIGNzcjM7Ci0JCQlDT1BZX01BQ19BRERSKHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+UGVybWFuZW50QWRkcmVzcyk7Ci0JCQljc3IyLmZpZWxkLkJ5dGUwID0gcEFkLT5DdXJyZW50QWRkcmVzc1swXTsKLQkJCWNzcjIuZmllbGQuQnl0ZTEgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzFdOwotCQkJY3NyMi5maWVsZC5CeXRlMiA9IHBBZC0+Q3VycmVudEFkZHJlc3NbMl07Ci0JCQljc3IyLmZpZWxkLkJ5dGUzID0gcEFkLT5DdXJyZW50QWRkcmVzc1szXTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19BRERSX0RXMCwgY3NyMi53b3JkKTsKLQkJCWNzcjMud29yZCA9IDA7Ci0JCQljc3IzLmZpZWxkLkJ5dGU0ID0gcEFkLT5DdXJyZW50QWRkcmVzc1s0XTsKLQkJCWNzcjMuZmllbGQuQnl0ZTUgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzVdOwotCQkJY3NyMy5maWVsZC5VMk1lTWFzayA9IDB4ZmY7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQUREUl9EVzEsIGNzcjMud29yZCk7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJFMlBST00gTUFDOiA9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQkJCQkJUFJJTlRfTUFDKHBBZC0+UGVybWFuZW50QWRkcmVzcykpKTsKLQkJfQotCX0KLQotCS8vIGlmIG5vdCByZXR1cm4gZWFybHkuIGNhdXNlIGZhaWwgYXQgZW11bGF0aW9uLgotCS8vIEluaXQgdGhlIGNoYW5uZWwgbnVtYmVyIGZvciBUWCBjaGFubmVsIHBvd2VyCi0JUlRNUFJlYWRDaGFubmVsUHdyKHBBZCk7Ci0KLQkvLyBpZiBFMlBST00gdmVyc2lvbiBtaXNtYXRjaCB3aXRoIGRyaXZlcidzIGV4cGVjdGF0aW9uLCB0aGVuIHNraXAKLQkvLyBhbGwgc3Vic2VxdWVudCBFMlJQT00gcmV0aWV2YWwgYW5kIHNldCBhIHN5c3RlbSBlcnJvciBiaXQgdG8gbm90aWZ5IEdVSQotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1ZFUlNJT05fT0ZGU0VULCBWZXJzaW9uLndvcmQpOwotCXBBZC0+RWVwcm9tVmVyc2lvbiA9IFZlcnNpb24uZmllbGQuVmVyc2lvbiArIFZlcnNpb24uZmllbGQuRmFlUmVsZWFzZU51bWJlciAqIDI1NjsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFMlBST006IFZlcnNpb24gPSAlZCwgRkFFIHJlbGVhc2UgIyVkXG4iLCBWZXJzaW9uLmZpZWxkLlZlcnNpb24sIFZlcnNpb24uZmllbGQuRmFlUmVsZWFzZU51bWJlcikpOwotCi0JaWYgKFZlcnNpb24uZmllbGQuVmVyc2lvbiA+IFZBTElEX0VFUFJPTV9WRVJTSU9OKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiRTJQUk9NOiBXUk9ORyBWRVJTSU9OIDB4JXgsIHNob3VsZCBiZSAlZFxuIixWZXJzaW9uLmZpZWxkLlZlcnNpb24sIFZBTElEX0VFUFJPTV9WRVJTSU9OKSk7Ci0JCS8qcEFkLT5TeXN0ZW1FcnJvckJpdG1hcCB8PSAweDAwMDAwMDAxOwotCi0JCS8vIGhhcmQtY29kZSBkZWZhdWx0IHZhbHVlIHdoZW4gbm8gcHJvcGVyIEUyUFJPTSBpbnN0YWxsZWQKLQkJcEFkLT5iQXV0b1R4QWdjQSA9IEZBTFNFOwotCQlwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7Ci0KLQkJLy8gRGVmYXVsdCB0aGUgY2hhbm5lbCBwb3dlcgotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9DSEFOTkVMUzsgaSsrKQotCQkJcEFkLT5UeFBvd2VyW2ldLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQotCQkvLyBEZWZhdWx0IHRoZSBjaGFubmVsIHBvd2VyCi0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GXzExSkNIQU5ORUxTOyBpKyspCi0JCQlwQWQtPlR4UG93ZXIxMUpbaV0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCi0JCWZvcihpID0gMDsgaSA8IE5VTV9FRVBST01fQkJQX1BBUk1TOyBpKyspCi0JCQlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSA9IDB4ZmZmZjsKLQkJcmV0dXJuOyAgKi8KLQl9Ci0KLQkvLyBSZWFkIEJCUCBkZWZhdWx0IHZhbHVlIGZyb20gRUVQUk9NIGFuZCBzdG9yZSB0byBhcnJheShFRVBST01EZWZhdWx0VmFsdWUpIGluIHBBZAotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX05JQzFfT0ZGU0VULCB2YWx1ZSk7Ci0JcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMF0gPSB2YWx1ZTsKLQotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX05JQzJfT0ZGU0VULCB2YWx1ZSk7Ci0JcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMV0gPSB2YWx1ZTsKLQotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgzOCwgdmFsdWUpOwkvLyBDb3VudHJ5IFJlZ2lvbgotCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzJdID0gdmFsdWU7Ci0KLQlmb3IoaSA9IDA7IGkgPCA4OyBpKyspCi0JewotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9CQlBfQkFTRV9PRkZTRVQgKyBpKjIsIHZhbHVlKTsKLQkJcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaSszXSA9IHZhbHVlOwotCX0KLQotCS8vIFdlIGhhdmUgdG8gcGFyc2UgTklDIGNvbmZpZ3VyYXRpb24gMCBhdCBoZXJlLgotCS8vIElmIFRTU0kgZGlkIG5vdCBoYXZlIHByZWxvYWRlZCB2YWx1ZSwgaXQgc2hvdWxkIHJlc2V0IHRoZSBUeEF1dG9BZ2MgdG8gZmFsc2UKLQkvLyBUaGVyZWZvcmUsIHdlIGhhdmUgdG8gcmVhZCBUeEF1dG9BZ2MgY29udHJvbCBiZWZvcmVoYW5kLgotCS8vIFJlYWQgVHggQUdDIGNvbnRyb2wgYml0Ci0JQW50ZW5uYS53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMF07Ci0JaWYgKEFudGVubmEud29yZCA9PSAweEZGRkYpCi0JewotI2lmZGVmIFJUMzB4eAotCQlpZihJU19SVDMwOTAocEFkKXx8IElTX1JUMzM5MChwQWQpKQotCQl7Ci0JCQlBbnRlbm5hLndvcmQgPSAwOwotCQkJQW50ZW5uYS5maWVsZC5SZkljVHlwZSA9IFJGSUNfMzAyMDsKLQkJCUFudGVubmEuZmllbGQuVHhQYXRoID0gMTsKLQkJCUFudGVubmEuZmllbGQuUnhQYXRoID0gMTsKLQkJfQotCQllbHNlCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0JCXsKLQotCQkJQW50ZW5uYS53b3JkID0gMDsKLQkJCUFudGVubmEuZmllbGQuUmZJY1R5cGUgPSBSRklDXzI4MjA7Ci0JCQlBbnRlbm5hLmZpZWxkLlR4UGF0aCA9IDE7Ci0JCQlBbnRlbm5hLmZpZWxkLlJ4UGF0aCA9IDI7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIkUyUFJPTSBlcnJvciwgaGFyZCBjb2RlIGFzIDB4JTA0eFxuIiwgQW50ZW5uYS53b3JkKSk7Ci0JCX0KLQl9Ci0KLQkvLyBDaG9vc2UgdGhlIGRlc2lyZWQgVHgmUnggc3RyZWFtLgotCWlmICgocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID4gQW50ZW5uYS5maWVsZC5UeFBhdGgpKQotCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IEFudGVubmEuZmllbGQuVHhQYXRoOwotCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9PSAwKSB8fCAocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPiBBbnRlbm5hLmZpZWxkLlJ4UGF0aCkpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IEFudGVubmEuZmllbGQuUnhQYXRoOwotCi0JCWlmICgocEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzI4ODNfVkVSU0lPTikgJiYKLQkJCShwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA+IDIpKQotCQl7Ci0JCQkvLyBvbmx5IDIgUnggc3RyZWFtcyBmb3IgUlQyODYwIHNlcmllcwotCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOwotCQl9Ci0JfQotCi0JLy8gMyozCi0JLy8gcmVhZCB2YWx1ZSBmcm9tIEVFUFJPTSBhbmQgc2V0IHRoZW0gdG8gQ1NSMTc0IH4gMTc3IGluIGNoYWluMCB+IGNoYWluMgotCS8vIHlldCBpbXBsZW1lbnQKLQlmb3IoaT0wOyBpPDM7IGkrKykKLQl7Ci0JfQotCi0JTmljQ29uZmlnMi53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMV07Ci0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCWlmICgoTmljQ29uZmlnMi53b3JkICYgMHgwMGZmKSA9PSAweGZmKQotCQl7Ci0JCQlOaWNDb25maWcyLndvcmQgJj0gMHhmZjAwOwotCQl9Ci0KLQkJaWYgKChOaWNDb25maWcyLndvcmQgPj4gOCkgPT0gMHhmZikKLQkJewotCQkJTmljQ29uZmlnMi53b3JkICY9IDB4MDBmZjsKLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCWlmIChOaWNDb25maWcyLmZpZWxkLkR5bmFtaWNUeEFnY0NvbnRyb2wgPT0gMSkKLQkJcEFkLT5iQXV0b1R4QWdjQSA9IHBBZC0+YkF1dG9UeEFnY0cgPSBUUlVFOwotCWVsc2UKLQkJcEFkLT5iQXV0b1R4QWdjQSA9IHBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKLQotCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJOSUNSZWFkRUVQUk9NUGFyYW1ldGVyczogUnhQYXRoID0gJWQsIFR4UGF0aCA9ICVkXG4iLCBBbnRlbm5hLmZpZWxkLlJ4UGF0aCwgQW50ZW5uYS5maWVsZC5UeFBhdGgpKTsKLQotCS8vIFNhdmUgdGhlIGFudGVubmEgZm9yIGZ1dHVyZSB1c2UKLQlwQWQtPkFudGVubmEud29yZCA9IEFudGVubmEud29yZDsKLQotCS8vIFNldCB0aGUgUmZJQ1R5cGUgaGVyZSwgdGhlbiB3ZSBjYW4gaW5pdGlhbGl6ZSBSRklDIHJlbGF0ZWQgb3BlcmF0aW9uIGNhbGxiYWNrcwotCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gKFVDSEFSKSBBbnRlbm5hLmZpZWxkLlJ4UGF0aDsKLQlwQWQtPlJmSWNUeXBlID0gKFVDSEFSKSBBbnRlbm5hLmZpZWxkLlJmSWNUeXBlOwotCi0jaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0JUnRtcENoaXBPcHNSRkhvb2socEFkKTsKLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQotCS8vCi0JLy8gUmVzZXQgUGh5TW9kZSBpZiB3ZSBkb24ndCBzdXBwb3J0IDgwMi4xMWEKLQkvLyBPbmx5IFJGSUNfMjg1MCAmIFJGSUNfMjc1MCBzdXBwb3J0IDgwMi4xMWEKLQkvLwotCWlmICgoQW50ZW5uYS5maWVsZC5SZkljVHlwZSAhPSBSRklDXzI4NTApCi0JCSYmIChBbnRlbm5hLmZpZWxkLlJmSWNUeXBlICE9IFJGSUNfMjc1MCkKLQkJJiYgKEFudGVubmEuZmllbGQuUmZJY1R5cGUgIT0gUkZJQ18zMDUyKSkKLQl7Ci0JCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQpIHx8Ci0JCQkocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBKSkKLQkJCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSBQSFlfMTFCR19NSVhFRDsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkJfHwKLQkJCQkgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCXx8Ci0JCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkJfHwKLQkJCQkgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykpCi0JCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gUEhZXzExQkdOX01JWEVEOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCX0KLQotCS8vIFJlYWQgVFNTSSByZWZlcmVuY2UgYW5kIFRTU0kgYm91bmRhcnkgZm9yIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbi4gVGhpcyBpcyB1Z2x5Ci0JLy8gMC4gMTFiL2cKLQl7Ci0JCS8qIHRoZXNlIGFyZSB0ZW1wYXR1cmUgcmVmZXJlbmNlIHZhbHVlICgweDAwIH4gMHhGRSkKLQkJICAgZXg6IDB4MDAgMHgxNSAweDI1IDB4NDUgMHg4OCAweEEwIDB4QjUgMHhEMCAweEYwCi0JCSAgIFRzc2lQbHVzQm91bmRhcnlHIFs0XSBbM10gWzJdIFsxXSBbMF0gKHNtYWxsZXIpICsKLQkJICAgVHNzaU1pbnVzQm91bmRhcnlHWzBdIFsxXSBbMl0gWzNdIFs0XSAobGFyZ2VyKSAqLwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NkUsIFBvd2VyLndvcmQpOwotCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1s0XSA9IFBvd2VyLmZpZWxkLkJ5dGUwOwotCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1szXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzAsIFBvd2VyLndvcmQpOwotCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1syXSA9IFBvd2VyLmZpZWxkLkJ5dGUwOwotCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1sxXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzIsIFBvd2VyLndvcmQpOwotCQlwQWQtPlRzc2lSZWZHICAgPSBQb3dlci5maWVsZC5CeXRlMDsgLyogcmVmZXJlbmNlIHZhbHVlIFswXSAqLwotCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHg3NCwgUG93ZXIud29yZCk7Ci0JCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKLQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1szXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzYsIFBvd2VyLndvcmQpOwotCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzRdID0gUG93ZXIuZmllbGQuQnl0ZTA7Ci0JCXBBZC0+VHhBZ2NTdGVwRyA9IFBvd2VyLmZpZWxkLkJ5dGUxOwotCQlwQWQtPlR4QWdjQ29tcGVuc2F0ZUcgPSAwOwotCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1swXSA9IHBBZC0+VHNzaVJlZkc7Ci0JCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMF0gID0gcEFkLT5Uc3NpUmVmRzsKLQotCQkvLyBEaXNhYmxlIFR4QWdjIGlmIHRoZSBiYXNlZCB2YWx1ZSBpcyBub3QgcmlnaHQKLQkJaWYgKHBBZC0+VHNzaVJlZkcgPT0gMHhmZikKLQkJCXBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkUyUFJPTTogRyBUc3NpWy00IC4uICs0XSA9ICVkICVkICVkICVkIC0gJWQgLSVkICVkICVkICVkLCBzdGVwPSVkLCB0dW5pbmc9JWRcbiIsCi0JCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1s0XSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbM10sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzJdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1sxXSwKLQkJCXBBZC0+VHNzaVJlZkcsCi0JCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzFdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzJdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzNdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzRdLAotCQkJcEFkLT5UeEFnY1N0ZXBHLCBwQWQtPmJBdXRvVHhBZ2NHKSk7Ci0JfQotCS8vIDEuIDExYQotCXsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweEQ0LCBQb3dlci53b3JkKTsKLQkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbNF0gPSBQb3dlci5maWVsZC5CeXRlMDsKLQkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbM10gPSBQb3dlci5maWVsZC5CeXRlMTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweEQ2LCBQb3dlci53b3JkKTsKLQkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKLQkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMV0gPSBQb3dlci5maWVsZC5CeXRlMTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweEQ4LCBQb3dlci53b3JkKTsKLQkJcEFkLT5Uc3NpUmVmQSAgID0gUG93ZXIuZmllbGQuQnl0ZTA7Ci0JCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMV0gPSBQb3dlci5maWVsZC5CeXRlMTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweERBLCBQb3dlci53b3JkKTsKLQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVsyXSA9IFBvd2VyLmZpZWxkLkJ5dGUwOwotCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzNdID0gUG93ZXIuZmllbGQuQnl0ZTE7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhEQywgUG93ZXIud29yZCk7Ci0JCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbNF0gPSBQb3dlci5maWVsZC5CeXRlMDsKLQkJcEFkLT5UeEFnY1N0ZXBBID0gUG93ZXIuZmllbGQuQnl0ZTE7Ci0JCXBBZC0+VHhBZ2NDb21wZW5zYXRlQSA9IDA7Ci0JCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzBdID0gcEFkLT5Uc3NpUmVmQTsKLQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVswXSAgPSBwQWQtPlRzc2lSZWZBOwotCi0JCS8vIERpc2FibGUgVHhBZ2MgaWYgdGhlIGJhc2VkIHZhbHVlIGlzIG5vdCByaWdodAotCQlpZiAocEFkLT5Uc3NpUmVmQSA9PSAweGZmKQotCQkJcEFkLT5iQXV0b1R4QWdjQSA9IEZBTFNFOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRTJQUk9NOiBBIFRzc2lbLTQgLi4gKzRdID0gJWQgJWQgJWQgJWQgLSAlZCAtJWQgJWQgJWQgJWQsIHN0ZXA9JWQsIHR1bmluZz0lZFxuIiwKLQkJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzRdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVszXSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMl0sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzFdLAotCQkJcEFkLT5Uc3NpUmVmQSwKLQkJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMV0sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMl0sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbM10sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbNF0sCi0JCQlwQWQtPlR4QWdjU3RlcEEsIHBBZC0+YkF1dG9UeEFnY0EpKTsKLQl9Ci0JcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSA9IDB4MDsKLQotCS8vIFJlYWQgZnJlcXVlbmN5IG9mZnNldCBzZXR0aW5nIGZvciBSRgotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0ZSRVFfT0ZGU0VULCB2YWx1ZSk7Ci0JaWYgKCh2YWx1ZSAmIDB4MDBGRikgIT0gMHgwMEZGKQotCQlwQWQtPlJmRnJlcU9mZnNldCA9IChVTE9ORykgKHZhbHVlICYgMHgwMEZGKTsKLQllbHNlCi0JCXBBZC0+UmZGcmVxT2Zmc2V0ID0gMDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFMlBST006IFJGIEZyZXFPZmZzZXQ9MHglbHggXG4iLCBwQWQtPlJmRnJlcU9mZnNldCkpOwotCi0JLy9Db3VudHJ5UmVnaW9uIGJ5dGUgb2Zmc2V0ICgzOGgpCi0JdmFsdWUgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsyXSA+PiA4OwkJLy8gMi40RyBiYW5kCi0JdmFsdWUyID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gJiAweDAwRkY7CS8vIDVHIGJhbmQKLQotCWlmICgodmFsdWUgPD0gUkVHSU9OX01BWElNVU1fQkdfQkFORCkgJiYgKHZhbHVlMiA8PSBSRUdJT05fTUFYSU1VTV9BX0JBTkQpKQotCXsKLQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9ICgoVUNIQVIpIHZhbHVlKSB8IDB4ODA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCA9ICgoVUNIQVIpIHZhbHVlMikgfCAweDgwOwotCQlUbXBQaHkgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOwotCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsKLQkJUlRNUFNldFBoeU1vZGUocEFkLCBUbXBQaHkpOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQlTZXRDb21tb25IVChwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCX0KLQotCS8vCi0JLy8gR2V0IFJTU0kgT2Zmc2V0IG9uIEVFUFJPTSAweDlBaCAmIDB4OUNoLgotCS8vIFRoZSB2YWxpZCB2YWx1ZSBhcmUgKC0xMCB+IDEwKQotCS8vCi0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQsIHZhbHVlKTsKLQlwQWQtPkJHUnNzaU9mZnNldDAgPSB2YWx1ZSAmIDB4MDBmZjsKLQlwQWQtPkJHUnNzaU9mZnNldDEgPSAodmFsdWUgPj4gOCk7Ci0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQrMiwgdmFsdWUpOwotCXBBZC0+QkdSc3NpT2Zmc2V0MiA9IHZhbHVlICYgMHgwMGZmOwotCXBBZC0+QUxOQUdhaW4xID0gKHZhbHVlID4+IDgpOwotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xOQV9PRkZTRVQsIHZhbHVlKTsKLQlwQWQtPkJMTkFHYWluID0gdmFsdWUgJiAweDAwZmY7Ci0JcEFkLT5BTE5BR2FpbjAgPSAodmFsdWUgPj4gOCk7Ci0KLQkvLyBWYWxpZGF0ZSAxMWIvZyBSU1NJXzAgb2Zmc2V0LgotCWlmICgocEFkLT5CR1Jzc2lPZmZzZXQwIDwgLTEwKSB8fCAocEFkLT5CR1Jzc2lPZmZzZXQwID4gMTApKQotCQlwQWQtPkJHUnNzaU9mZnNldDAgPSAwOwotCi0JLy8gVmFsaWRhdGUgMTFiL2cgUlNTSV8xIG9mZnNldC4KLQlpZiAoKHBBZC0+QkdSc3NpT2Zmc2V0MSA8IC0xMCkgfHwgKHBBZC0+QkdSc3NpT2Zmc2V0MSA+IDEwKSkKLQkJcEFkLT5CR1Jzc2lPZmZzZXQxID0gMDsKLQotCS8vIFZhbGlkYXRlIDExYi9nIFJTU0lfMiBvZmZzZXQuCi0JaWYgKChwQWQtPkJHUnNzaU9mZnNldDIgPCAtMTApIHx8IChwQWQtPkJHUnNzaU9mZnNldDIgPiAxMCkpCi0JCXBBZC0+QkdSc3NpT2Zmc2V0MiA9IDA7Ci0KLQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9SU1NJX0FfT0ZGU0VULCB2YWx1ZSk7Ci0JcEFkLT5BUnNzaU9mZnNldDAgPSB2YWx1ZSAmIDB4MDBmZjsKLQlwQWQtPkFSc3NpT2Zmc2V0MSA9ICh2YWx1ZSA+PiA4KTsKLQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIChFRVBST01fUlNTSV9BX09GRlNFVCsyKSwgdmFsdWUpOwotCXBBZC0+QVJzc2lPZmZzZXQyID0gdmFsdWUgJiAweDAwZmY7Ci0JcEFkLT5BTE5BR2FpbjIgPSAodmFsdWUgPj4gOCk7Ci0KLQlpZiAoKChVQ0hBUilwQWQtPkFMTkFHYWluMSA9PSAweEZGKSB8fCAocEFkLT5BTE5BR2FpbjEgPT0gMHgwMCkpCi0JCXBBZC0+QUxOQUdhaW4xID0gcEFkLT5BTE5BR2FpbjA7Ci0JaWYgKCgoVUNIQVIpcEFkLT5BTE5BR2FpbjIgPT0gMHhGRikgfHwgKHBBZC0+QUxOQUdhaW4yID09IDB4MDApKQotCQlwQWQtPkFMTkFHYWluMiA9IHBBZC0+QUxOQUdhaW4wOwotCi0JLy8gVmFsaWRhdGUgMTFhIFJTU0lfMCBvZmZzZXQuCi0JaWYgKChwQWQtPkFSc3NpT2Zmc2V0MCA8IC0xMCkgfHwgKHBBZC0+QVJzc2lPZmZzZXQwID4gMTApKQotCQlwQWQtPkFSc3NpT2Zmc2V0MCA9IDA7Ci0KLQkvLyBWYWxpZGF0ZSAxMWEgUlNTSV8xIG9mZnNldC4KLQlpZiAoKHBBZC0+QVJzc2lPZmZzZXQxIDwgLTEwKSB8fCAocEFkLT5BUnNzaU9mZnNldDEgPiAxMCkpCi0JCXBBZC0+QVJzc2lPZmZzZXQxID0gMDsKLQotCS8vVmFsaWRhdGUgMTFhIFJTU0lfMiBvZmZzZXQuCi0JaWYgKChwQWQtPkFSc3NpT2Zmc2V0MiA8IC0xMCkgfHwgKHBBZC0+QVJzc2lPZmZzZXQyID4gMTApKQotCQlwQWQtPkFSc3NpT2Zmc2V0MiA9IDA7Ci0KLSNpZmRlZiBSVDMweHgKLQkvLwotCS8vIEdldCBUWCBtaXhlciBnYWluIHNldHRpbmcKLQkvLyAweGZmIGFyZSBpbnZhbGlkIHZhbHVlCi0JLy8gTm90ZTogUlQzMHhYIGRlZmF1bHQgdmFsdWUgaXMgMHgwMCBhbmQgd2lsbCBwcm9ncmFtIHRvIFJGX1IxNyBvbmx5IHdoZW4gdGhpcyB2YWx1ZSBpcyBub3QgemVyby4KLQkvLyAgICAgICBSVDM1OVggZGVmYXVsdCB2YWx1ZSBpcyAweDAyCi0JLy8KLQlpZiAoSVNfUlQzMHh4KHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkpCi0JewotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWE1JWEVSX0dBSU5fMl80RywgdmFsdWUpOwotCQlwQWQtPlR4TWl4ZXJHYWluMjRHID0gMDsKLQkJdmFsdWUgJj0gMHgwMGZmOwotCQlpZiAodmFsdWUgIT0gMHhmZikKLQkJewotCQkJdmFsdWUgJj0gMHgwNzsKLQkJCXBBZC0+VHhNaXhlckdhaW4yNEcgPSAoVUNIQVIpdmFsdWU7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQkvLwotCS8vIEdldCBMRUQgU2V0dGluZy4KLQkvLwotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgzYSwgdmFsdWUpOwotCXBBZC0+TGVkQ250bC53b3JkID0gKHZhbHVlPj44KTsKLQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MRUQxX09GRlNFVCwgdmFsdWUpOwotCXBBZC0+TGVkMSA9IHZhbHVlOwotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xFRDJfT0ZGU0VULCB2YWx1ZSk7Ci0JcEFkLT5MZWQyID0gdmFsdWU7Ci0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTEVEM19PRkZTRVQsIHZhbHVlKTsKLQlwQWQtPkxlZDMgPSB2YWx1ZTsKLQotCVJUTVBSZWFkVHhQd3JQZXJSYXRlKHBBZCk7Ci0KLSNpZmRlZiBTSU5HTEVfU0tVCi0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fREVGSU5FX01BWF9UWFBXUiwgcEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IpOwotI2VuZGlmIC8vIFNJTkdMRV9TS1UgLy8KLQotI2lmZGVmIFJUMzB4eAotI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAotCVJ0bXBFZnVzZVN1cHBvcnRDaGVjayhwQWQpOwotI2VuZGlmIC8vIFJUTVBfRUZVU0VfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzXG4iKSk7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVNldCBkZWZhdWx0IHZhbHVlIGZyb20gRUVQUk9NCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlOSUNJbml0QXNpY0Zyb21FRVBST00oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JVUlOVDMyCQkJCQlkYXRhID0gMDsKLQlVQ0hBUglCQlBSMSA9IDA7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JVVNIT1JUCQkJCQlpOwotLy8JRUVQUk9NX0FOVEVOTkFfU1RSVUMJQW50ZW5uYTsKLQlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgICAgTmljQ29uZmlnMjsKLQlVQ0hBUglCQlBSMyA9IDA7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdEFzaWNGcm9tRUVQUk9NXG4iKSk7Ci0JZm9yKGkgPSAzOyBpIDwgTlVNX0VFUFJPTV9CQlBfUEFSTVM7IGkrKykKLQl7Ci0JCVVDSEFSIEJicFJlZ0lkeCwgQmJwVmFsdWU7Ci0KLQkJaWYgKChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAweEZGRkYpICYmIChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAwKSkKLQkJewotCQkJQmJwUmVnSWR4ID0gKFVDSEFSKShwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSA+PiA4KTsKLQkJCUJicFZhbHVlICA9IChVQ0hBUikocEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gJiAweGZmKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCYnBSZWdJZHgsIEJicFZhbHVlKTsKLQkJfQotCX0KLQotCi0JTmljQ29uZmlnMi53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMV07Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlpZiAoKE5pY0NvbmZpZzIud29yZCAmIDB4MDBmZikgPT0gMHhmZikKLQkJewotCQkJTmljQ29uZmlnMi53b3JkICY9IDB4ZmYwMDsKLQkJfQotCi0JCWlmICgoTmljQ29uZmlnMi53b3JkID4+IDgpID09IDB4ZmYpCi0JCXsKLQkJCU5pY0NvbmZpZzIud29yZCAmPSAweDAwZmY7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkvLyBTYXZlIHRoZSBhbnRlbm5hIGZvciBmdXR1cmUgdXNlCi0JcEFkLT5OaWNDb25maWcyLndvcmQgPSBOaWNDb25maWcyLndvcmQ7Ci0KLSNpZmRlZiBSVDMweHgKLQkvLyBzZXQgZGVmYXVsdCBhbnRlbm5hIGFzIG1haW4KLQlpZiAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApCi0JCUFzaWNTZXRSeEFudChwQWQsIHBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQpOwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0JLy8KLQkvLyBTZW5kIExFRCBTZXR0aW5nIHRvIE1DVS4KLQkvLwotCWlmIChwQWQtPkxlZENudGwud29yZCA9PSAweEZGKQotCXsKLQkJcEFkLT5MZWRDbnRsLndvcmQgPSAweDAxOwotCQlwQWQtPkxlZDEgPSAweDU1NTU7Ci0JCXBBZC0+TGVkMiA9IDB4MjIyMTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQlwQWQtPkxlZDMgPSAweEE5Rjg7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JfQotCi0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUyLCAweGZmLCAoVUNIQVIpcEFkLT5MZWQxLCAoVUNIQVIpKHBBZC0+TGVkMSA+PiA4KSk7Ci0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUzLCAweGZmLCAoVUNIQVIpcEFkLT5MZWQyLCAoVUNIQVIpKHBBZC0+TGVkMiA+PiA4KSk7Ci0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDU0LCAweGZmLCAoVUNIQVIpcEFkLT5MZWQzLCAoVUNIQVIpKHBBZC0+TGVkMyA+PiA4KSk7Ci0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUxLCAweGZmLCAwLCBwQWQtPkxlZENudGwuZmllbGQuUG9sYXJpdHkpOwotCi0JcEFkLT5MZWRJbmRpY2F0b3JTdHJlbmd0aCA9IDB4RkY7Ci0JUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvLyBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGJlZm9yZSBsaW5rIHVwCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJLy8gUmVhZCBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIHN0YXRlIGVuYWJsZSBiaXQKLQkJaWYgKE5pY0NvbmZpZzIuZmllbGQuSGFyZHdhcmVSYWRpb0NvbnRyb2wgPT0gMSkKLQkJewotCQkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBUUlVFOwotCi0JCQkvLyBSZWFkIEdQSU8gcGluMiBhcyBIYXJkd2FyZSBjb250cm9sbGVkIHJhZGlvIHN0YXRlCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZkYXRhKTsKLQkJCWlmICgoZGF0YSAmIDB4MDQpID09IDApCi0JCQl7Ci0JCQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gPSBGQUxTRTsKLQkJCQlwQWQtPlN0YUNmZy5iUmFkaW8gPSBGQUxTRTsKLS8vCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBXUl9QSU5fQ0ZHLCAweDAwMDAxODE4KTsKLQkJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXBBZC0+U3RhQ2ZnLmJIYXJkd2FyZVJhZGlvID0gRkFMU0U7Ci0KLQkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKLQkJewotCQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0jaWZkZWYgUlQzMDkwCi0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIFBvd2VyUmFkaW9PZmZDSUQsIDB4ZmYsIDB4MDIpOwotCQkJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclJhZGlvT2ZmQ0lEKTsKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLSNpZm5kZWYgUlQzMDkwCi0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIDB4ZmYsIDB4ZmYsIDB4MDIpOwotI2VuZGlmIC8vIFJUMzA5MCAvLwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCBQb3dlcldha2VDSUQsIDB4MDAsIDB4MDApOwotCQkJLy8gMi0xLiB3YWl0IGNvbW1hbmQgb2suCi0JCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyV2FrZUNJRCk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCX0KLQl9Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0jaWZkZWYgUlQzMHh4Ci0JCWlmIChJU19SVDMwOTAocEFkKXx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQotCQl7Ci0JCQlSVE1QX0NISVBfT1AgKnBDaGlwT3BzID0gJnBBZC0+Y2hpcE9wczsKLQkJCWlmIChwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUpCi0JCQkJcENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKHBBZCk7Ci0JCX0KLQkJLy8gMzA5MCBNQ1UgV2FrZXVwIGNvbW1hbmQgbmVlZHMgbW9yZSB0aW1lIHRvIGJlIHN0YWJsZS4KLQkJLy8gQmVmb3JlIHN0YWJsZSwgZG9uJ3QgaXNzdWUgb3RoZXIgTUNVIGNvbW1hbmQgdG8gcHJldmVudCBmcm9tIGZpcm13YXJlIGVycm9yLgotCi0JCWlmICgoSVNfUlQzMDkwKHBBZCl8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKLQkJCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCi0JCQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzOjolZCxyZWxlYXNlIE1jdSBMb2NrXG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXykpOwotCQkJUlRNUF9TRU1fTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKLQkJCXBBZC0+YnJ0MzB4eEJhbk1jdUNtZCA9IEZBTFNFOwotCQkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1jdUNtZExvY2spOwotCQl9Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkvLyBUdXJuIG9mZiBwYXRjaGluZyBmb3IgY2FyZGJ1cyBjb250cm9sbGVyCi0JaWYgKE5pY0NvbmZpZzIuZmllbGQuQ2FyZGJ1c0FjY2VsZXJhdGlvbiA9PSAxKQotCXsKLS8vCQlwQWQtPmJUZXN0MSA9IFRSVUU7Ci0JfQotCi0JaWYgKE5pY0NvbmZpZzIuZmllbGQuRHluYW1pY1R4QWdjQ29udHJvbCA9PSAxKQotCQlwQWQtPmJBdXRvVHhBZ2NBID0gcEFkLT5iQXV0b1R4QWdjRyA9IFRSVUU7Ci0JZWxzZQotCQlwQWQtPmJBdXRvVHhBZ2NBID0gcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOwotCS8vCi0JLy8gU2luY2UgQkJQIGhhcyBiZWVuIHByb2dhbWVkLCB0byBtYWtlIHN1cmUgQkJQIHNldHRpbmcgd2lsbCBiZQotCS8vIHVwYXRlIGluc2lkZSBvZiBBc2ljQW50ZW5uYVNlbGVjdCwgc28gcmVzZXQgdG8gVU5LTk9XTl9CQU5EISEKLQkvLwotCXBBZC0+Q29tbW9uQ2ZnLkJhbmRTdGF0ZSA9IFVOS05PV05fQkFORDsKLQotCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUFIzKTsKLQlCQlBSMyAmPSAofjB4MTgpOwotCWlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykKLQl7Ci0JCUJCUFIzIHw9ICgweDEwKTsKLQl9Ci0JZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCi0JewotCQlCQlBSMyB8PSAoMHg4KTsKLQl9Ci0JZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCi0JewotCQlCQlBSMyB8PSAoMHgwKTsKLQl9Ci0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQUjMpOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCS8vIEhhbmRsZSB0aGUgZGlmZmVyZW5jZSB3aGVuIDFUCi0JCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJCUFIxKTsKLQkJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQotCQl7Ci0JCUJCUFIxICY9ICh+MHgxOCk7Ci0JCX0KLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQkJQUjEpOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlVzZSBIdyBSYWRpbyBDb250cm9sIFBpbj0lZDsgaWYgdXNlZCBQaW49JWQ7XG4iLAotCQkJCQlwQWQtPkNvbW1vbkNmZy5iSGFyZHdhcmVSYWRpbywgcEFkLT5Db21tb25DZmcuYkhhcmR3YXJlUmFkaW8pKTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4UGF0aCA9ICVkLCBSeFBhdGggPSAlZCwgUkZJQz0lZCwgUG9sYXIrTEVEIG1vZGU9JXhcbiIsCi0JCQkJcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwgcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCwKLQkJCQlwQWQtPlJmSWNUeXBlLCBwQWQtPkxlZENudGwud29yZCkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0QXNpY0Zyb21FRVBST01cbiIpKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUluaXRpYWxpemUgTklDIGhhcmR3YXJlCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMJTklDSW5pdGlhbGl6ZUFkYXB0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gICBCT09MRUFOICAgIGJIYXJkUmVzZXQpCi17Ci0JTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JVUlOVDMyCQkJVmFsdWU7Ci0JREVMQVlfSU5UX0NGR19TVFJVQwlJbnRDZmc7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0vLwlJTlRfTUFTS19DU1JfU1RSVUMJCUludE1hc2s7Ci0JVUxPTkcJaSA9MCwgaj0wOwotCUFDX1RYT1BfQ1NSMF9TVFJVQwljc3IwOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0luaXRpYWxpemVBZGFwdGVyXG4iKSk7Ci0KLQkvLyAzLiBTZXQgRE1BIGdsb2JhbCBjb25maWd1cmF0aW9uIGV4Y2VwdCBUWF9ETUFfRU4gYW5kIFJYX0RNQV9FTiBiaXRzOgotcmV0cnk6Ci0JaSA9IDA7Ci0JZG8KLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKLQkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKLQkJCWJyZWFrOwotCi0JCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JCWkrKzsKLQl9d2hpbGUgKCBpPDEwMCk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IERNQSBvZmZzZXQgMHgyMDggPSAweCV4XG4iLCBHbG9DZmcud29yZCkpOwotCUdsb0NmZy53b3JkICY9IDB4ZmYwOwotCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPTE7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOwotCi0JLy8gUmVjb3JkIEhXIEJlYWNvbiBvZmZzZXQKLQlwQWQtPkJlYWNvbk9mZnNldFswXSA9IEhXX0JFQUNPTl9CQVNFMDsKLQlwQWQtPkJlYWNvbk9mZnNldFsxXSA9IEhXX0JFQUNPTl9CQVNFMTsKLQlwQWQtPkJlYWNvbk9mZnNldFsyXSA9IEhXX0JFQUNPTl9CQVNFMjsKLQlwQWQtPkJlYWNvbk9mZnNldFszXSA9IEhXX0JFQUNPTl9CQVNFMzsKLQlwQWQtPkJlYWNvbk9mZnNldFs0XSA9IEhXX0JFQUNPTl9CQVNFNDsKLQlwQWQtPkJlYWNvbk9mZnNldFs1XSA9IEhXX0JFQUNPTl9CQVNFNTsKLQlwQWQtPkJlYWNvbk9mZnNldFs2XSA9IEhXX0JFQUNPTl9CQVNFNjsKLQlwQWQtPkJlYWNvbk9mZnNldFs3XSA9IEhXX0JFQUNPTl9CQVNFNzsKLQotCS8vCi0JLy8gd3JpdGUgYWxsIHNoYXJlZCBSaW5nJ3MgYmFzZSBhZGRyZXNzIGludG8gQVNJQwotCS8vCi0KLQkvLyBhc2ljIHNpbXVsYXRpb24gc2VxdWVuY2UgcHV0IHRoaXMgYWhlYWQgYmVmb3JlIGxvYWRpbmcgZmlybXdhcmUuCi0JLy8gcGJmIGhhcmR3YXJlIHJlc2V0Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfUlNUX0lEWCwgMHgxMDAzZik7CS8vIDB4MTAwMDAgZm9yIHJlc2V0IHJ4LCAweDNmIHJlc2V0cyBhbGwgNiB0eCByaW5ncy4KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4ZTFmKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4ZTAwKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCS8vIEluaXRpYWx6ZSBBU0lDIGZvciBUWCAmIFJ4IG9wZXJhdGlvbgotCWlmIChOSUNJbml0aWFsaXplQXNpYyhwQWQgLCBiSGFyZFJlc2V0KSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJaWYgKGorKyA9PSAwKQotCQl7Ci0JCQlOSUNMb2FkRmlybXdhcmUocEFkKTsKLQkJCWdvdG8gcmV0cnk7Ci0JCX0KLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkvLyBXcml0ZSBBQ19CSyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIKLQlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19CS10uQ2VsbFswXS5BbGxvY1BhKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjEsIFZhbHVlKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFIxIDogMHgleFxuIiwgVmFsdWUpKTsKLQotCS8vIFdyaXRlIEFDX0JFIGJhc2UgYWRkcmVzcyByZWdpc3RlcgotCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsWzBdLkFsbG9jUGEpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBU0VfUFRSMCwgVmFsdWUpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBUWF9CQVNFX1BUUjAgOiAweCV4XG4iLCBWYWx1ZSkpOwotCi0JLy8gV3JpdGUgQUNfVkkgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyCi0JVmFsdWUgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4UmluZ1tRSURfQUNfVkldLkNlbGxbMF0uQWxsb2NQYSk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFIyLCBWYWx1ZSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSMiA6IDB4JXhcbiIsIFZhbHVlKSk7Ci0KLQkvLyBXcml0ZSBBQ19WTyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIKLQlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19WT10uQ2VsbFswXS5BbGxvY1BhKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjMsIFZhbHVlKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFIzIDogMHgleFxuIiwgVmFsdWUpKTsKLQotCS8vIFdyaXRlIEhDQ0EgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyCi0JLyoKLQlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9IQ0NBXS5DZWxsWzBdLkFsbG9jUGEpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBU0VfUFRSNCwgVmFsdWUpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBUWF9CQVNFX1BUUjQgOiAweCV4XG4iLCBWYWx1ZSkpOwotCSovCi0KLQkvLyBXcml0ZSBNR01UX0JBU0VfQ1NSIHJlZ2lzdGVyCi0JVmFsdWUgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPk1nbXRSaW5nLkNlbGxbMF0uQWxsb2NQYSk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFI1LCBWYWx1ZSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSNSA6IDB4JXhcbiIsIFZhbHVlKSk7Ci0KLQkvLyBXcml0ZSBSWF9CQVNFX0NTUiByZWdpc3RlcgotCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5SeFJpbmcuQ2VsbFswXS5BbGxvY1BhKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9CQVNFX1BUUiwgVmFsdWUpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSWF9CQVNFX1BUUiA6IDB4JXhcbiIsIFZhbHVlKSk7Ci0KLQkvLyBJbml0IFJYIFJpbmcgaW5kZXggcG9pbnRlcgotCXBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID0gMDsKLQlwQWQtPlJ4UmluZy5SeENwdUlkeCA9IFJYX1JJTkdfU0laRS0xOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKLQotCS8vIEluaXQgVFggcmluZ3MgaW5kZXggcG9pbnRlcgotCXsKLQkJZm9yIChpPTA7IGk8TlVNX09GX1RYX1JJTkc7IGkrKykKLQkJewotCQkJcEFkLT5UeFJpbmdbaV0uVHhTd0ZyZWVJZHggPSAwOwotCQkJcEFkLT5UeFJpbmdbaV0uVHhDcHVJZHggPSAwOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgKFRYX0NUWF9JRFgwICsgaSAqIDB4MTApICwgIHBBZC0+VHhSaW5nW2ldLlR4Q3B1SWR4KTsKLQkJfQotCX0KLQotCS8vIGluaXQgTUdNVCByaW5nIGluZGV4IHBvaW50ZXIKLQlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gMDsKLQlwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4ID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgpOwotCi0JLy8KLQkvLyBzZXQgZWFjaCBSaW5nJ3MgU0laRSAgaW50byBBU0lDLiBEZXNjcmlwdG9yIFNpemUgaXMgZml4ZWQgYnkgZGVzaWduLgotCS8vCi0KLQkvLyBXcml0ZSBUWF9SSU5HX0NTUjAgcmVnaXN0ZXIKLQlWYWx1ZSA9IFRYX1JJTkdfU0laRTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NQVhfQ05UMCwgVmFsdWUpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01BWF9DTlQxLCBWYWx1ZSk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUFYX0NOVDIsIFZhbHVlKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NQVhfQ05UMywgVmFsdWUpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01BWF9DTlQ0LCBWYWx1ZSk7Ci0JVmFsdWUgPSBNR01UX1JJTkdfU0laRTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UTUFYX0NOVCwgVmFsdWUpOwotCi0JLy8gV3JpdGUgUlhfUklOR19DU1IgcmVnaXN0ZXIKLQlWYWx1ZSA9IFJYX1JJTkdfU0laRTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9NQVhfQ05ULCBWYWx1ZSk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCS8vIFdNTSBwYXJhbWV0ZXIKLQljc3IwLndvcmQgPSAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMF9DRkcsIGNzcjAud29yZCk7Ci0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKLQl7Ci0JCWNzcjAuZmllbGQuQWMwVHhvcCA9IDE5MjsJLy8gQUNfVkk6IDE5MiozMnVzIH49IDZtcwotCQljc3IwLmZpZWxkLkFjMVR4b3AgPSA5NjsJLy8gQUNfVk86IDk2KjMydXMgIH49IDNtcwotCX0KLQllbHNlCi0JewotCQljc3IwLmZpZWxkLkFjMFR4b3AgPSA5NjsJLy8gQUNfVkk6IDk2KjMydXMgfj0gM21zCi0JCWNzcjAuZmllbGQuQWMxVHhvcCA9IDQ4OwkvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcwotCX0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IwLndvcmQpOwotCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkvLyAzLiBTZXQgRE1BIGdsb2JhbCBjb25maWd1cmF0aW9uIGV4Y2VwdCBUWF9ETUFfRU4gYW5kIFJYX0RNQV9FTiBiaXRzOgotCWkgPSAwOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7Ci0JCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSAgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCi0JCQlicmVhazsKLQotCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCQlpKys7Ci0JfXdoaWxlICggaSA8IDEwMCk7Ci0KLQlHbG9DZmcud29yZCAmPSAweGZmMDsKLQlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0xOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKLQotCUludENmZy53b3JkID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBERUxBWV9JTlRfQ0ZHLCBJbnRDZmcud29yZCk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCS8vIHJlc2V0IGFjdGlvbgotCS8vIExvYWQgZmlybXdhcmUKLQkvLyAgU3RhdHVzID0gTklDTG9hZEZpcm13YXJlKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdGlhbGl6ZUFkYXB0ZXJcbiIpKTsKLQlyZXR1cm4gU3RhdHVzOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJSW5pdGlhbGl6ZSBBU0lDCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMJTklDSW5pdGlhbGl6ZUFzaWMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gIEJPT0xFQU4JCWJIYXJkUmVzZXQpCi17Ci0JVUxPTkcJCQlJbmRleCA9IDA7Ci0JVUNIQVIJCQlSMCA9IDB4ZmY7Ci0JVUlOVDMyCQkJTWFjQ3NyMTIgPSAwLCBDb3VudGVyID0gMDsKLSNpZmRlZiBSVDMweHgKLQlVQ0hBUgkJCWJicHJlZz0wOwotCVVDSEFSCQkJUkZWYWx1ZT0wOwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCVVTSE9SVAkJCUtleUlkeDsKLQlJTlQJCQkJaSxhcGlkeDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0aWFsaXplQXNpY1xuIikpOwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDB4Myk7CS8vIFRvIGZpeCBkcml2ZXIgZGlzYWJsZS9lbmFibGUgaGFuZyBpc3N1ZSB3aGVuIHJhZGlvIG9mZgotCWlmIChiSGFyZFJlc2V0ID09IFRSVUUpCi0JewotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4Myk7Ci0JfQotCWVsc2UKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDEpOwotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDApOwotCS8vIEluaXRpYWxpemUgTUFDIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKLQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fTUFDX1JFR19QQVJNUzsgSW5kZXgrKykKLQl7Ci0jaWZkZWYgUlQzMHh4Ci0JCWlmICgoTUFDUmVnVGFibGVbSW5kZXhdLlJlZ2lzdGVyID09IFRYX1NXX0NGRzApICYmICggSVNfUlQzMDkwKHBBZCkgfHwgIElTX1JUMzM5MChwQWQpKSkKLQkJewotCQkJTUFDUmVnVGFibGVbSW5kZXhdLlZhbHVlID0gMHgwMDAwMDQwMDsKLQkJfQotI2VuZGlmIC8vIFJUMzB4eCAvLwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIE1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7Ci0JfQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTlVNX1NUQV9NQUNfUkVHX1BBUk1TOyBJbmRleCsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTVEFNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIFNUQU1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotI2lmZGVmIFJUMzB4eAotCS8vIEluaXRpYWxpemUgUlQzMDcwIHNlcmlhbCBNQUMgcmVnaXN0ZXJzIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIFJUMjg3MCBzZXJpYWwKLQlpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCl8fElTX1JUMzM5MChwQWQpKQotCXsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfU1dfQ0ZHMSwgMCk7Ci0KLQkJLy8gUlQzMDcxIHZlcnNpb24gRSBoYXMgZml4ZWQgdGhpcyBpc3N1ZQotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpCi0JCXsKLQkJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuREFDVGVzdEJpdCA9PSAxKQotCQkJewotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1NXX0NGRzIsIDB4MkMpOwkvLyBUbyBmaXggdGhyb3VnaHB1dCBkcm9wIGRyYXN0aWNhbGx5Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfU1dfQ0ZHMiwgMHgwRik7CS8vIFRvIGZpeCB0aHJvdWdocHV0IGRyb3AgZHJhc3RpY2FsbHkKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1NXX0NGRzIsIDB4MCk7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoSVNfUlQzMDcwKHBBZCkpCi0JewotCQlpZiAoKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjAxKSkKLQkJewotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfU1dfQ0ZHMSwgMCk7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9TV19DRkcyLCAweDJDKTsJLy8gVG8gZml4IHRocm91Z2hwdXQgZHJvcCBkcmFzdGljYWxseQotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfU1dfQ0ZHMiwgMCk7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQkvLwotCS8vIEJlZm9yZSBwcm9ncmFtIEJCUCwgd2UgbmVlZCB0byB3YWl0IEJCUC9SRiBnZXQgd2FrZSB1cC4KLQkvLwotCUluZGV4ID0gMDsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1RBVFVTX0NGRywgJk1hY0NzcjEyKTsKLQotCQlpZiAoKE1hY0NzcjEyICYgMHgwMykgPT0gMCkJLy8gaWYgQkIuUkYgaXMgc3RhYmxlCi0JCQlicmVhazsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVjayBNQUNfU1RBVFVTX0NGRyAgPSBCdXN5ID0gJXhcbiIsIE1hY0NzcjEyKSk7Ci0JCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JfSB3aGlsZSAoSW5kZXgrKyA8IDEwMCk7Ci0KLQkvLyBUaGUgY29tbWFuZHMgdG8gZmlybXdhcmUgc2hvdWxkIGJlIGFmdGVyIHRoZXNlIGNvbW1hbmRzLCB0aGVzZSBjb21tYW5kcyB3aWxsIGluaXQgZmlybXdhcmUKLQkvLyBQQ0kgYW5kIFVTQiBhcmUgbm90IHRoZSBzYW1lIGJlY2F1c2UgUENJIGRyaXZlciBuZWVkcyB0byB3YWl0IGZvciBQQ0kgYnVzIHJlYWR5Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgMCk7CS8vIGluaXRpYWxpemUgQkJQIFIvVyBhY2Nlc3MgYWdlbnQKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIDApOwotI2lmZGVmIFJUMzA5MAotCS8vMjAwOC8xMS8yODpLSCBhZGQgdG8gZml4IHRoZSBkZWFkIHJmIGZyZXF1ZW5jeSBvZmZzZXQgYnVnPC0tCi0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDcyLCAwLCAwLCAwKTsKLQkvLzIwMDgvMTEvMjg6S0ggYWRkIHRvIGZpeCB0aGUgZGVhZCByZiBmcmVxdWVuY3kgb2Zmc2V0IGJ1Zy0tPgotI2VuZGlmIC8vIFJUMzA5MCAvLwotCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0KLQkvLyBSZWFkIEJCUCByZWdpc3RlciwgbWFrZSBzdXJlIEJCUCBpcyB1cCBhbmQgcnVubmluZyBiZWZvcmUgd3JpdGUgbmV3IGRhdGEKLQlJbmRleCA9IDA7Ci0JZG8KLQl7Ci0JCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMCwgJlIwKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkJQIHZlcnNpb24gPSAleFxuIiwgUjApKTsKLQl9IHdoaWxlICgoKytJbmRleCA8IDIwKSAmJiAoKFIwID09IDB4ZmYpIHx8IChSMCA9PSAweDAwKSkpOwotCS8vQVNTRVJUKEluZGV4IDwgMjApOyAvL3RoaXMgd2lsbCBjYXVzZSBCU09EIG9uIENoZWNrLWJ1aWxkIGRyaXZlcgotCi0JaWYgKChSMCA9PSAweGZmKSB8fCAoUjAgPT0gMHgwMCkpCi0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCi0JLy8gSW5pdGlhbGl6ZSBCQlAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9CQlBfUkVHX1BBUk1TOyBJbmRleCsrKQotCXsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUFJlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgQkJQUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKLQl9Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkvLyBUT0RPOiBzaGlhbmcsIGNoZWNrIE1BQ1ZlcnNpb24sIGN1cnJlbnRseSwgcmJ1cy1iYXNlZCBjaGlwIHVzZSB0aGlzLgotCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODcyMDIwMCkKLQl7Ci0JCS8vVUNIQVIgdmFsdWU7Ci0JCVVMT05HIHZhbHVlMjsKLQotCQkvL2Rpc2FibGUgTUxEIGJ5IEJydWNlIDIwMDgwNzA0Ci0JCS8vQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMTA1LCAmdmFsdWUpOwotCQkvL0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxMDUsIHZhbHVlIHwgNCk7Ci0KLQkJLy9NYXhpbXVtIFBTRFUgbGVuZ3RoIGZyb20gMTZLIHRvIDMySyBieXRlcwotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BWF9MRU5fQ0ZHLCAmdmFsdWUyKTsKLQkJdmFsdWUyICY9IH4oMHgzPDwxMik7Ci0JCXZhbHVlMiB8PSAoMHgyPDwxMik7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BWF9MRU5fQ0ZHLCB2YWx1ZTIpOwotCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCS8vIGZvciBydDI4NjBFIGFuZCBhZnRlciwgaW5pdCBCQlBfUjg0IHdpdGggMHgxOS4gVGhpcyBpcyBmb3IgZXh0ZW5zaW9uIGNoYW5uZWwgb3ZlcmxhcHBpbmcgSU9ULgotCS8vIFJUMzA5MCBzaG91bGQgbm90IHByb2dyYW0gQkJQIFI4NCB0byAweDE5LCBvdGhlcndpc2UgVFggd2lsbCBibG9jay4KLQkvLzMwNzAvNzEvNzIsMzA5MCwzMDkwQSggYXJlIGluY2x1ZGVkIGluIFJUMzB4eCksMzU3MiwzMzkwCi0JaWYgKCgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSAhPSAweDAxMDEpICYmICEoSVNfUlQzMHh4KHBBZCl8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkpCi0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg0LCAweDE5KTsKLQotI2lmZGVmIFJUMzB4eAotLy8gYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAKLQlpZiAoSVNfUlQzMHh4KHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCi0JewkvL3VwZGF0ZSBmb3IgUlQzMDcwLzcxLzcyLzkwLzkxLzkyLDM1NzIsMzM5MC4KLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzksIDB4MTMpOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MCwgMHgwNSk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgxLCAweDMzKTsKLQl9Ci0KLQlpZiAoSVNfUlQzMDkwKHBBZCl8fElTX1JUMzM5MChwQWQpKQkvLyBSVDMwOXgsIFJUMzA3MS83MgotCXsKLQkJLy8gZW5hYmxlIERDIGZpbHRlcgotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPj0gMHgwMjExKQotCQl7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxMDMsIDB4YzApOwotCQl9Ci0KLQkJLy8gaW1wcm92ZSBwb3dlciBjb25zdW1wdGlvbgotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEzOCwgJmJicHJlZyk7Ci0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCXsKLQkJCS8vIHR1cm4gb2ZmIHR4IERBQ18xCi0JCQliYnByZWcgPSAoYmJwcmVnIHwgMHgyMCk7Ci0JCX0KLQotCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCQl7Ci0JCQkvLyB0dXJuIG9mZiB0eCBBRENfMQotCQkJYmJwcmVnICY9ICh+MHgyKTsKLQkJfQotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxMzgsIGJicHJlZyk7Ci0KLQkJLy8gaW1wcm92ZSBwb3dlciBjb25zdW1wdGlvbiBpbiBSVDMwNzEgVmVyLkUKLQkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpID49IDB4MDIxMSkKLQkJewotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzMSwgJmJicHJlZyk7Ci0JCQliYnByZWcgJj0gKH4weDMpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMzEsIGJicHJlZyk7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoSVNfUlQzMDcwKHBBZCkpCi0JewotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPj0gMHgwMjAxKQotCQl7Ci0JCQkvLyBlbmFibGUgREMgZmlsdGVyCi0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxMDMsIDB4YzApOwotCi0JCQkvLyBpbXByb3ZlIHBvd2VyIGNvbnN1bXB0aW9uIGluIFJUMzA3MCBWZXIuRgotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzMSwgJmJicHJlZyk7Ci0JCQliYnByZWcgJj0gKH4weDMpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMzEsIGJicHJlZyk7Ci0JCX0KLQotCQkvLyBUWF9MTzFfZW4sIFJGIFIxNyByZWdpc3RlciBCaXQgMyB0byAwCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjE3LCAmUkZWYWx1ZSk7Ci0JCVJGVmFsdWUgJj0gKH4weDA4KTsKLQkJLy8gdG8gZml4IHJ4IGxvbmcgcmFuZ2UgaXNzdWUKLQkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcgPT0gMCkKLQkJewotCQkJUkZWYWx1ZSB8PSAweDIwOwotCQl9Ci0JCS8vIHNldCBSRl9SMTdfYml0WzI6MF0gZXF1YWwgdG8gRUVQUk9NIHNldHRpbmcgYXQgMHg0OGgKLQkJaWYgKHBBZC0+VHhNaXhlckdhaW4yNEcgPj0gMSkKLQkJewotCQkJUkZWYWx1ZSAmPSAofjB4Nyk7ICAvLyBjbGVhbiBiaXQgWzI6MF0KLQkJCVJGVmFsdWUgfD0gcEFkLT5UeE1peGVyR2FpbjI0RzsKLQkJfQotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMTcsIFJGVmFsdWUpOwotCX0KLS8vIGVuZCBqb2hubGkKLSNlbmRpZiAvLyBSVDMweHggLy8KLQotCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKLQl7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDE2KTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTIpOwotCX0KLQotCWlmIChwQWQtPk1BQ1ZlcnNpb24gPj0gUkFMSU5LXzI4ODBFX1ZFUlNJT04gJiYgcEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzMwNzBfVkVSU0lPTikgLy8gMyozCi0JewotCQkvLyBlbmxhcmdlIE1BWF9MRU5fQ0ZHCi0JCVVJTlQzMiBjc3I7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFYX0xFTl9DRkcsICZjc3IpOwotCQljc3IgJj0gMHhGRkY7Ci0JCWNzciB8PSAweDIwMDA7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BWF9MRU5fQ0ZHLCBjc3IpOwotCX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JLy8gQWRkIHJhZGlvIG9mZiBjb250cm9sCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpCi0JCXsKLS8vCQkJUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDB4MDAwMDE4MTgpOwotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCBSYWRpbyBPZmZcbiIpKTsKLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vIENsZWFyIHJhdyBjb3VudGVycwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDAsICZDb3VudGVyKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQxLCAmQ291bnRlcik7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMiwgJkNvdW50ZXIpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDAsICZDb3VudGVyKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmQ291bnRlcik7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMiwgJkNvdW50ZXIpOwotCi0JLy8gQVNJQyB3aWxsIGtlZXAgZ2FyYmFnZSB2YWx1ZSBhZnRlciBib290Ci0JLy8gQ2xlYXIgYWxsIHNoYXJlZCBrZXkgdGFibGUgd2hlbiBpbml0aWFsCi0JLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBpZ25vcmVkIGluIHJhZGlvLU9OL09GRiBvcGVyYXRpb24uCi0JaWYgKGJIYXJkUmVzZXQpCi0JewotCQlmb3IgKEtleUlkeCA9IDA7IEtleUlkeCA8IDQ7IEtleUlkeCsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQqS2V5SWR4LCAwKTsKLQkJfQotCi0JCS8vIENsZWFyIGFsbCBwYWlyd2lzZSBrZXkgdGFibGUgd2hlbiBpbml0aWFsCi0JCWZvciAoS2V5SWR4ID0gMDsgS2V5SWR4IDwgMjU2OyBLZXlJZHgrKykKLQkJewotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoS2V5SWR4ICogSFdfV0NJRF9BVFRSSV9TSVpFKSwgMSk7Ci0JCX0KLQl9Ci0KLQkvLyBhc3NlcnQgSE9TVCByZWFkeSBiaXQKLS8vICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMSwgMHgwKTsgLy8gMjAwNC0wOS0xNCBhc2tlZCBieSBNYXJrCi0vLyAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjEsIDB4NCk7Ci0KLQkvLyBJdCBpc24ndCBuZWNlc3NhcnkgdG8gY2xlYXIgdGhpcyBzcGFjZSB3aGVuIG5vdCBoYXJkIHJlc2V0LgotCWlmIChiSGFyZFJlc2V0ID09IFRSVUUpCi0JewotCQkvLyBjbGVhciBhbGwgb24tY2hpcCBCRUFDT04gZnJhbWUgc3BhY2UKLQkJZm9yIChhcGlkeCA9IDA7IGFwaWR4IDwgSFdfQkVBQ09OX01BWF9DT1VOVDsgYXBpZHgrKykKLQkJewotCQkJZm9yIChpID0gMDsgaSA8IEhXX0JFQUNPTl9PRkZTRVQ+PjI7IGkrPTQpCi0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYXBpZHhdICsgaSwgMHgwMCk7Ci0JCX0KLQl9Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQkvLyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIsIGluaXQgVFhPUF9DVFJMX0NGRyB3aXRoIDB4NTgzZi4gVGhpcyBpcyBmb3IgZXh0ZW5zaW9uIGNoYW5uZWwgb3ZlcmxhcHBpbmcgSU9ULgotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiYweGZmZmYpICE9IDB4MDEwMSkKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYT1BfQ1RSTF9DRkcsIDB4NTgzZik7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgUlQzMHh4Ci0jaWZkZWYgTkVXX0ZXCi0JaWYgKElTX1JUMzA3MChwQWQpIHx8ICBJU19SVDM1NzIocEFkKXx8SVNfUlQzMzkwKHBBZCl8fElTX1JUMzA5MChwQWQpKQotCXsKLQkJLy8gc2VuZCAweDM2IG1jdSBjb21tYW5kIGFmdGVyIDB4NzIgZm9yIFJUM3h4eCB0byBmaXggUmFkaW8tT2ZmIGN1cnJlbnQgbGVha2FnZSBpc3N1ZQotCQlSVE1QdXNlY0RlbGF5KDIwMCk7Ci0JCWlmIChwQWQtPmJ1c2VFZnVzZSkKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzNiwgMHhmZiwgMHhmZiwgMCk7Ci0JCWVsc2UKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzNiwgMHhmZiwgMHhmZiwgMHgwNCk7Ci0JCVJUTVB1c2VjRGVsYXkoMTApOwotCX0KLSNlbmRpZiAvLyBORVdfRlcgLy8KLSNlbmRpZiAvLyBSVDMweHggLy8KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0aWFsaXplQXNpY1xuIikpOwotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUmVzZXQgTklDIEFzaWNzCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCQlSZXNldCBOSUMgdG8gaW5pdGlhbCBzdGF0ZSBBUyBJUyBzeXN0ZW0gYm9vdCB1cCB0aW1lLgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlOSUNJc3N1ZVJlc2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCVVJTlQzMglWYWx1ZSA9IDA7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0lzc3VlUmVzZXRcbiIpKTsKLQotCS8vIEFib3J0IFR4LCBwcmV2ZW50IEFTSUMgZnJvbSB3cml0aW5nIHRvIEhvc3QgbWVtb3J5Ci0JLy9SVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DTlRMX0NTUiwgMHgwMDFmMDAwMCk7Ci0KLQkvLyBEaXNhYmxlIFJ4LCByZWdpc3RlciB2YWx1ZSBzdXBwb3NlZCB3aWxsIHJlbWFpbiBhZnRlciByZXNldAotCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCVZhbHVlICY9ICgweGZmZmZmZmYzKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQotCS8vIElzc3VlIHJlc2V0IGFuZCBjbGVhciBmcm9tIHJlc2V0IHN0YXRlCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDAzKTsgLy8gMjAwNC0wOS0xNyBjaGFuZ2UgZnJvbSAweDAxCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDAwKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJc3N1ZVJlc2V0XG4iKSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDaGVjayBBU0lDIHJlZ2lzdGVycyBhbmQgZmluZCBhbnkgcmVhc29uIHRoZSBzeXN0ZW0gbWlnaHQgaGFuZwotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4JTklDQ2hlY2tGb3JIYW5nKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCXJldHVybiAoRkFMU0UpOwotfQotCi1WT0lEIE5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlUWF9TVEFfRklGT19TVFJVQwlTdGFGaWZvOwotCU1BQ19UQUJMRV9FTlRSWQkJKnBFbnRyeTsKLQlVQ0hBUgkJCQlpID0gMDsKLQlVQ0hBUgkJCXBpZCA9IDAsIHdjaWQgPSAwOwotCUNIQVIJCQkJcmVUcnk7Ci0JVUNIQVIJCQkJc3VjY01DUzsKLQotI2lmZGVmIFJBTElOS19BVEUKLQkvKiBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlICovCi0JaWYgKEFURV9PTihwQWQpKQotCQlyZXR1cm47Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0JCWRvCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0ZJRk8sICZTdGFGaWZvLndvcmQpOwotCi0JCQlpZiAoU3RhRmlmby5maWVsZC5iVmFsaWQgPT0gMCkKLQkJCQlicmVhazsKLQotCQkJd2NpZCA9IChVQ0hBUilTdGFGaWZvLmZpZWxkLndjaWQ7Ci0KLQotCQkvKiBpZ25vcmUgTm9BQ0sgYW5kIE1HTVQgZnJhbWUgdXNlIDB4RkYgYXMgV0NJRCAqLwotCQkJaWYgKChTdGFGaWZvLmZpZWxkLlR4QWNrUmVxdWlyZWQgPT0gMCkgfHwgKHdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKQotCQkJewotCQkJCWkrKzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLyogUElEIHN0b3JlIFR4IE1DUyBSYXRlICovCi0JCQlwaWQgPSAoVUNIQVIpU3RhRmlmby5maWVsZC5QaWRUeXBlOwotCi0JCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFt3Y2lkXTsKLQotCQkJcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCsrOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQlpZiAoU3RhRmlmby5maWVsZC5UeEJGKSAvLyAzKjMKLQkJCQlwRW50cnktPlR4QkZDb3VudCsrOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0jaWZkZWYgVUFQU0RfQVBfU1VQUE9SVAotCQkJVUFQU0RfU1BfQVVFX0hhbmRsZShwQWQsIHBFbnRyeSwgU3RhRmlmby5maWVsZC5UeFN1Y2Nlc3MpOwotI2VuZGlmIC8vIFVBUFNEX0FQX1NVUFBPUlQgLy8KLQotCQkJaWYgKCFTdGFGaWZvLmZpZWxkLlR4U3VjY2VzcykKLQkJCXsKLQkJCQlwRW50cnktPkZJRk9Db3VudCsrOwotCQkJCXBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQrKzsKLQotCQkJCWlmIChwRW50cnktPkZJRk9Db3VudCA+PSAxKQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIyIpKTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCQkJcEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA9IDY0OwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCQkJCWlmKHBFbnRyeS0+UHNNb2RlID09IFBXUl9BQ1RJVkUpCi0JCQkJCXsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCQkJCWludCB0aWQ7Ci0JCQkJCQlmb3IgKHRpZD0wOyB0aWQ8TlVNX09GX1RJRDsgdGlkKyspCi0JCQkJCQl7Ci0JCQkJCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBwRW50cnktPkFpZCwgIHRpZCwgRkFMU0UsIEZBTFNFKTsKLQkJCQkJCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCQkJCQkJLy8gVXBkYXRlIHRoZSBjb250aW51b3VzIHRyYW5zbWlzc2lvbiBjb3VudGVyIGV4Y2VwdCBQUyBtb2RlCi0JCQkJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250Kys7Ci0KLSNpZmRlZiBXRFNfU1VQUE9SVAotCQkJCQkJLy8gZml4IFdEUyBKYW0gaXNzdWUKLQkJCQkJCWlmKChwRW50cnktPlZhbGlkQXNXRFMgPT0gVFJVRSkKLQkJCQkJCQkmJiAocEVudHJ5LT5Mb2NrRW50cnlUeCA9PSBGQUxTRSkKLQkJCQkJCQkmJiAocEVudHJ5LT5Db250aW51ZVR4RmFpbENudCA+PSBwQWQtPkFwQ2ZnLkVudHJ5TGlmZUNoZWNrKSkKLQkJCQkJCXsKLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFbnRyeSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBCbG9ja2VkISEgKEZhaWwgQ250ID0gJWQpXG4iLAotCQkJCQkJCQlwRW50cnktPkFkZHJbMF0scEVudHJ5LT5BZGRyWzFdLHBFbnRyeS0+QWRkclsyXSxwRW50cnktPkFkZHJbM10sCi0JCQkJCQkJCXBFbnRyeS0+QWRkcls0XSxwRW50cnktPkFkZHJbNV0scEVudHJ5LT5Db250aW51ZVR4RmFpbENudCApKTsKLQotCQkJCQkJCXBFbnRyeS0+TG9ja0VudHJ5VHggPSBUUlVFOwotCQkJCQkJfQotI2VuZGlmIC8vIFdEU19TVVBQT1JUIC8vCi0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQkvLyBDbGVhciB0aGUgRklGT0NvdW50IHdoZW4gc3RhIGluIFBvd2VyIFNhdmUgbW9kZS4gQmFzaWNhbGx5IHdlIGFzc3VtZQotCQkJCQkJLy8gICAgIHRoaXMgdHggZXJyb3IgaGFwcGVuZWQgZHVlIHRvIHN0YSBqdXN0IGdvIHRvIHNsZWVwLgotCQkJCQkJcEVudHJ5LT5GSUZPQ291bnQgPSAwOwotCQkJCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCA9IDA7Ci0JCQkJCX0KLQkJCQkJLy9wRW50cnktPkZJRk9Db3VudCA9IDA7Ci0JCQkJfQotCQkJCS8vcEVudHJ5LT5iU2VuZEJBUiA9IFRSVUU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkJaWYgKChwRW50cnktPlBzTW9kZSAhPSBQV1JfU0FWRSkgJiYgKHBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPiAwKSkKLQkJCQl7Ci0JCQkJCXBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24tLTsKLQkJCQkJaWYgKHBFbnRyeS0+Tm9CQURhdGFDb3VudERvd249PTApCi0JCQkJCXsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkBcbiIpKTsKLQkJCQkJfQotCQkJCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCQlwRW50cnktPkZJRk9Db3VudCA9IDA7Ci0JCQkJcEVudHJ5LT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50Kys7Ci0JCQkJLy8gdXBkYXRlIE5vRGF0YUlkbGVDb3VudCB3aGVuIHN1Y2Vzc2Z1bCBzZW5kIHBhY2tldCB0byBTVEEuCi0JCQkJcEVudHJ5LT5Ob0RhdGFJZGxlQ291bnQgPSAwOwotCQkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQgPSAwOwotI2lmZGVmIFdEU19TVVBQT1JUCi0JCQkJcEVudHJ5LT5Mb2NrRW50cnlUeCA9IEZBTFNFOwotI2VuZGlmIC8vIFdEU19TVVBQT1JUIC8vCi0JCQl9Ci0KLQkJCXN1Y2NNQ1MgPSBTdGFGaWZvLmZpZWxkLlN1Y2Nlc3NSYXRlICYgMHg3RjsKLQotCQkJcmVUcnkgPSBwaWQgLSBzdWNjTUNTOwotCi0JCQlpZiAoU3RhRmlmby5maWVsZC5UeFN1Y2Nlc3MpCi0JCQl7Ci0JCQkJcEVudHJ5LT5UWE1DU0V4cGVjdGVkW3BpZF0rKzsKLQkJCQlpZiAocGlkID09IHN1Y2NNQ1MpCi0JCQkJewotCQkJCQlwRW50cnktPlRYTUNTU3VjY2Vzc2Z1bFtwaWRdKys7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXBFbnRyeS0+VFhNQ1NBdXRvRmFsbEJhY2tbcGlkXVtzdWNjTUNTXSsrOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwRW50cnktPlRYTUNTRmFpbGVkW3BpZF0rKzsKLQkJCX0KLQotCQkJaWYgKHJlVHJ5ID4gMCkKLQkJCXsKLQkJCQlpZiAoKHBpZCA+PSAxMikgJiYgc3VjY01DUyA8PTcpCi0JCQkJewotCQkJCQlyZVRyeSAtPSA0OwotCQkJCX0KLQkJCQlwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICs9IHJlVHJ5OwotCQkJfQotCi0JCQlpKys7Ci0JCQkvLyBBU0lDIHN0b3JlIDE2IHN0YWNrCi0JCX0gd2hpbGUgKCBpIDwgKFRYX1JJTkdfU0laRTw8MSkgKTsKLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUmVhZCBzdGF0aXN0aWNhbCBjb3VudGVycyBmcm9tIGhhcmR3YXJlIHJlZ2lzdGVycyBhbmQgcmVjb3JkIHRoZW0KLQkJaW4gc29mdHdhcmUgdmFyaWFibGVzIGZvciBsYXRlciBvbiBxdWVyeQotCi0JQXJndW1lbnRzOgotCQlwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVVJTlQzMglPbGRWYWx1ZTsvLywgVmFsdWUyOwotCS8vVUxPTkcJUGFnZVN1bSwgT25lU2VjVHJhbnNtaXRDb3VudDsKLQkvL1VMT05HCVR4RXJyb3JSYXRpbywgUmV0cnksIEZhaWw7Ci0JUlhfU1RBX0NOVDBfU1RSVUMJIFJ4U3RhQ250MDsKLQlSWF9TVEFfQ05UMV9TVFJVQyAgIFJ4U3RhQ250MTsKLQlSWF9TVEFfQ05UMl9TVFJVQyAgIFJ4U3RhQ250MjsKLQlUWF9TVEFfQ05UMF9TVFJVQwkgVHhTdGFDbnQwOwotCVRYX1NUQV9DTlQxX1NUUlVDCSBTdGFUeDE7Ci0JVFhfU1RBX0NOVDJfU1RSVUMJIFN0YVR4MjsKLQlUWF9BR0dfQ05UX1NUUlVDCVR4QWdnQ250OwotCVRYX0FHR19DTlQwX1NUUlVDCVR4QWdnQ250MDsKLQlUWF9BR0dfQ05UMV9TVFJVQwlUeEFnZ0NudDE7Ci0JVFhfQUdHX0NOVDJfU1RSVUMJVHhBZ2dDbnQyOwotCVRYX0FHR19DTlQzX1NUUlVDCVR4QWdnQ250MzsKLQlUWF9BR0dfQ05UNF9TVFJVQwlUeEFnZ0NudDQ7Ci0JVFhfQUdHX0NOVDVfU1RSVUMJVHhBZ2dDbnQ1OwotCVRYX0FHR19DTlQ2X1NUUlVDCVR4QWdnQ250NjsKLQlUWF9BR0dfQ05UN19TVFJVQwlUeEFnZ0NudDc7Ci0JQ09VTlRFUl9SQUxJTksJCSpwUmFsaW5rQ291bnRlcnM7Ci0KLQotCXBSYWxpbmtDb3VudGVycyA9ICZwQWQtPlJhbGlua0NvdW50ZXJzOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMCwgJlJ4U3RhQ250MC53b3JkKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQyLCAmUnhTdGFDbnQyLndvcmQpOwotCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQxLCAmUnhTdGFDbnQxLndvcmQpOwotCSAgICAvLyBVcGRhdGUgUlggUExDUCBlcnJvciBjb3VudGVyCi0JICAgIHBBZC0+UHJpdmF0ZUluZm8uUGh5UnhFcnJDbnQgKz0gUnhTdGFDbnQxLmZpZWxkLlBsY3BFcnI7Ci0JCS8vIFVwZGF0ZSBGYWxzZSBDQ0EgY291bnRlcgotCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250ICs9IFJ4U3RhQ250MS5maWVsZC5GYWxzZUNjYTsKLQl9Ci0KLQkvLyBVcGRhdGUgRkNTIGNvdW50ZXJzCi0JT2xkVmFsdWU9IHBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0OwotCXBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0ICs9IChSeFN0YUNudDAuZmllbGQuQ3JjRXJyKTsgLy8gPj4gNyk7Ci0JaWYgKHBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0IDwgT2xkVmFsdWUpCi0JCXBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5IaWdoUGFydCsrOwotCi0JLy8gQWRkIEZDUyBlcnJvciBjb3VudCB0byBwcml2YXRlIGNvdW50ZXJzCi0JcFJhbGlua0NvdW50ZXJzLT5PbmVTZWNSeEZjc0VyckNudCArPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOwotCU9sZFZhbHVlID0gcFJhbGlua0NvdW50ZXJzLT5SZWFsRmNzRXJyQ291bnQudS5Mb3dQYXJ0OwotCXBSYWxpbmtDb3VudGVycy0+UmVhbEZjc0VyckNvdW50LnUuTG93UGFydCArPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOwotCWlmIChwUmFsaW5rQ291bnRlcnMtPlJlYWxGY3NFcnJDb3VudC51Lkxvd1BhcnQgPCBPbGRWYWx1ZSkKLQkJcFJhbGlua0NvdW50ZXJzLT5SZWFsRmNzRXJyQ291bnQudS5IaWdoUGFydCsrOwotCi0JLy8gVXBkYXRlIER1cGxpY2F0ZSBSY3YgY2hlY2sKLQlwUmFsaW5rQ291bnRlcnMtPkR1cGxpY2F0ZVJjdiArPSBSeFN0YUNudDIuZmllbGQuUnhEdXBsaUNvdW50OwotCXBBZC0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0ICs9IFJ4U3RhQ250Mi5maWVsZC5SeER1cGxpQ291bnQ7Ci0JLy8gVXBkYXRlIFJYIE92ZXJmbG93IGNvdW50ZXIKLQlwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyICs9IChSeFN0YUNudDIuZmllbGQuUnhGaWZvT3ZlcmZsb3dDb3VudCk7Ci0KLQkvL3BBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudCA9IDA7Ci0KLQotCS8vaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpIHx8Ci0JLy8JKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkgJiYgKHBBZC0+TWFjVGFiLlNpemUgIT0gMSkpKQotCWlmICghcEFkLT5iVXBkYXRlQmNuQ250RG9uZSkKLQl7Ci0JLy8gVXBkYXRlIEJFQUNPTiBzZW50IGNvdW50Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJlR4U3RhQ250MC53b3JkKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmU3RhVHgxLndvcmQpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDIsICZTdGFUeDIud29yZCk7Ci0JcFJhbGlua0NvdW50ZXJzLT5PbmVTZWNCZWFjb25TZW50Q250ICs9IFR4U3RhQ250MC5maWVsZC5UeEJlYWNvbkNvdW50OwotCXBSYWxpbmtDb3VudGVycy0+T25lU2VjVHhSZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKLQlwUmFsaW5rQ291bnRlcnMtPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQlwUmFsaW5rQ291bnRlcnMtPk9uZVNlY1R4RmFpbENvdW50ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKLQlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7Ci0JcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKLQlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwotCX0KLQotCi0JLy9pZiAocEFkLT5iU3RhRmlmb1Rlc3QgPT0gVFJVRSkKLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVCwgJlR4QWdnQ250LndvcmQpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVDAsICZUeEFnZ0NudDAud29yZCk7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMSwgJlR4QWdnQ250MS53b3JkKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQyLCAmVHhBZ2dDbnQyLndvcmQpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVDMsICZUeEFnZ0NudDMud29yZCk7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVDQsICZUeEFnZ0NudDQud29yZCk7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVDUsICZUeEFnZ0NudDUud29yZCk7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVDYsICZUeEFnZ0NudDYud29yZCk7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVDcsICZUeEFnZ0NudDcud29yZCk7Ci0JCXBSYWxpbmtDb3VudGVycy0+VHhBZ2dDb3VudCArPSBUeEFnZ0NudC5maWVsZC5BZ2dUeENvdW50OwotCQlwUmFsaW5rQ291bnRlcnMtPlR4Tm9uQWdnQ291bnQgKz0gVHhBZ2dDbnQuZmllbGQuTm9uQWdnVHhDb3VudDsKLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzFNUERVQ291bnQgKz0gVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUxQ291bnQ7Ci0JCXBSYWxpbmtDb3VudGVycy0+VHhBZ2cyTVBEVUNvdW50ICs9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMkNvdW50OwotCi0JCXBSYWxpbmtDb3VudGVycy0+VHhBZ2czTVBEVUNvdW50ICs9IFR4QWdnQ250MS5maWVsZC5BZ2dTaXplM0NvdW50OwotCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnNE1QRFVDb3VudCArPSBUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTRDb3VudDsKLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzVNUERVQ291bnQgKz0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU1Q291bnQ7Ci0JCXBSYWxpbmtDb3VudGVycy0+VHhBZ2c2TVBEVUNvdW50ICs9IFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNkNvdW50OwotCi0JCXBSYWxpbmtDb3VudGVycy0+VHhBZ2c3TVBEVUNvdW50ICs9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplN0NvdW50OwotCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnOE1QRFVDb3VudCArPSBUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZThDb3VudDsKLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzlNUERVQ291bnQgKz0gVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemU5Q291bnQ7Ci0JCXBSYWxpbmtDb3VudGVycy0+VHhBZ2cxME1QRFVDb3VudCArPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTEwQ291bnQ7Ci0KLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzExTVBEVUNvdW50ICs9IFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTFDb3VudDsKLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzEyTVBEVUNvdW50ICs9IFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTJDb3VudDsKLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzEzTVBEVUNvdW50ICs9IFR4QWdnQ250Ni5maWVsZC5BZ2dTaXplMTNDb3VudDsKLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzE0TVBEVUNvdW50ICs9IFR4QWdnQ250Ni5maWVsZC5BZ2dTaXplMTRDb3VudDsKLQotCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMTVNUERVQ291bnQgKz0gVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNUNvdW50OwotCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMTZNUERVQ291bnQgKz0gVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNkNvdW50OwotCi0JCS8vIENhbGN1bGF0ZSB0aGUgdHJhbnNtaXR0ZWQgQS1NUERVIGNvdW50Ci0JCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTFDb3VudDsKLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTJDb3VudCAvIDIpOwotCi0JCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemUzQ291bnQgLyAzKTsKLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTRDb3VudCAvIDQpOwotCi0JCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU1Q291bnQgLyA1KTsKLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTZDb3VudCAvIDYpOwotCi0JCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU3Q291bnQgLyA3KTsKLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZThDb3VudCAvIDgpOwotCi0JCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemU5Q291bnQgLyA5KTsKLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTEwQ291bnQgLyAxMCk7Ci0KLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTExQ291bnQgLyAxMSk7Ci0JCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMkNvdW50IC8gMTIpOwotCi0JCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxM0NvdW50IC8gMTMpOwotCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Ni5maWVsZC5BZ2dTaXplMTRDb3VudCAvIDE0KTsKLQotCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTVDb3VudCAvIDE1KTsKLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQgLyAxNik7Ci0JfQotCi0jaWZkZWYgREJHX0RJQUdOT1NFCi0JewotCQlSdG1wRGlhZ1N0cnVjdAkqcERpYWc7Ci0JCVVDSEFSCQkJQXJyYXlDdXJJZHgsIGk7Ci0KLQkJcERpYWcgPSAmcEFkLT5EaWFnU3RydWN0OwotCQlBcnJheUN1cklkeCA9IHBEaWFnLT5BcnJheUN1cklkeDsKLQotCQlpZiAocERpYWctPmluaXRlZCA9PSAwKQotCQl7Ci0JCQlOZGlzWmVyb01lbW9yeShwRGlhZywgc2l6ZW9mKHN0cnVjdCBfUnRtcERpYWdTdHJjdXRfKSk7Ci0JCQlwRGlhZy0+QXJyYXlTdGFydElkeCA9IHBEaWFnLT5BcnJheUN1cklkeCA9IDA7Ci0JCQlwRGlhZy0+aW5pdGVkID0gMTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIFR4Ci0JCQlwRGlhZy0+VHhGYWlsQ250W0FycmF5Q3VySWR4XSA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKLQkJCXBEaWFnLT5UeEFnZ0NudFtBcnJheUN1cklkeF0gPSBUeEFnZ0NudC5maWVsZC5BZ2dUeENvdW50OwotCQkJcERpYWctPlR4Tm9uQWdnQ250W0FycmF5Q3VySWR4XSA9IFR4QWdnQ250LmZpZWxkLk5vbkFnZ1R4Q291bnQ7Ci0JCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMF0gPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTFDb3VudDsKLQkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxXSA9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMkNvdW50OwotCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzJdID0gVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemUzQ291bnQ7Ci0JCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bM10gPSBUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTRDb3VudDsKLQkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs0XSA9IFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNUNvdW50OwotCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzVdID0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQ7Ci0JCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bNl0gPSBUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudDsKLQkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs3XSA9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50OwotCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzhdID0gVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemU5Q291bnQ7Ci0JCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bOV0gPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTEwQ291bnQ7Ci0JCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTBdID0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50OwotCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzExXSA9IFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTJDb3VudDsKLQkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxMl0gPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQ7Ci0JCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTNdID0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50OwotCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzE0XSA9IFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTVDb3VudDsKLQkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxNV0gPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQ7Ci0KLQkJCXBEaWFnLT5SeENyY0VyckNudFtBcnJheUN1cklkeF0gPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOwotCi0JCQlJTkNfUklOR19JTkRFWChwRGlhZy0+QXJyYXlDdXJJZHgsICBESUFHTk9TRV9USU1FKTsKLQkJCUFycmF5Q3VySWR4ID0gcERpYWctPkFycmF5Q3VySWR4OwotCQkJZm9yIChpID0wOyBpIDwgOTsgaSsrKQotCQkJewotCQkJCXBEaWFnLT5UeERlc2NDbnRbQXJyYXlDdXJJZHhdW2ldPSAwOwotCQkJCXBEaWFnLT5UeFNXUXVlQ250W0FycmF5Q3VySWR4XVtpXSA9MDsKLQkJCQlwRGlhZy0+VHhNY3NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKLQkJCQlwRGlhZy0+UnhNY3NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKLQkJCX0KLQkJCXBEaWFnLT5UeERhdGFDbnRbQXJyYXlDdXJJZHhdID0gMDsKLQkJCXBEaWFnLT5UeEZhaWxDbnRbQXJyYXlDdXJJZHhdID0gMDsKLQkJCXBEaWFnLT5SeERhdGFDbnRbQXJyYXlDdXJJZHhdID0gMDsKLQkJCXBEaWFnLT5SeENyY0VyckNudFtBcnJheUN1cklkeF0gID0gMDsKLS8vCQkJZm9yIChpID0gOTsgaSA8IDE2OyBpKyspCi0JCQlmb3IgKGkgPSA5OyBpIDwgMjQ7IGkrKykgLy8gMyozCi0JCQl7Ci0JCQkJcERpYWctPlR4RGVzY0NudFtBcnJheUN1cklkeF1baV0gPSAwOwotCQkJCXBEaWFnLT5UeE1jc0NudFtBcnJheUN1cklkeF1baV0gPSAwOwotCQkJCXBEaWFnLT5SeE1jc0NudFtBcnJheUN1cklkeF1baV0gPSAwOwotfQotCi0JCQlpZiAocERpYWctPkFycmF5Q3VySWR4ID09IHBEaWFnLT5BcnJheVN0YXJ0SWR4KQotCQkJCUlOQ19SSU5HX0lOREVYKHBEaWFnLT5BcnJheVN0YXJ0SWR4LCAgRElBR05PU0VfVElNRSk7Ci0JCX0KLQotCX0KLSNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KLQotCi19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJlc2V0IE5JQyBmcm9tIGVycm9yCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCQlSZXNldCBOSUMgZnJvbSBlcnJvciBzdGF0ZQotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlOSUNSZXNldEZyb21FcnJvcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQkvLyBSZXNldCBCQlAgKGFjY29yZGluZyB0byBhbGV4LCByZXNldCBBU0lDIHdpbGwgZm9yY2UgcmVzZXQgQkJQCi0JLy8gVGhlcmVmb3JlLCBza2lwIHRoZSByZXNldCBCQlAKLQkvLyBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMSwgMHgyKTsKLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgxKTsKLQkvLyBSZW1vdmUgQVNJQyBmcm9tIHJlc2V0IHN0YXRlCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDApOwotCi0JTklDSW5pdGlhbGl6ZUFkYXB0ZXIocEFkLCBGQUxTRSk7Ci0JTklDSW5pdEFzaWNGcm9tRUVQUk9NKHBBZCk7Ci0KLQkvLyBTd2l0Y2ggdG8gY3VycmVudCBjaGFubmVsLCBzaW5jZSBkdXJpbmcgcmVzZXQgcHJvY2VzcywgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIHJlbWFpbnMgb24uCi0JQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwotCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLX0KLQotCi1ORElTX1NUQVRVUyBOSUNMb2FkRmlybXdhcmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JTkRJU19TVEFUVVMJIHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JaWYgKHBBZC0+Y2hpcE9wcy5sb2FkRmlybXdhcmUpCi0JCXN0YXR1cyA9IHBBZC0+Y2hpcE9wcy5sb2FkRmlybXdhcmUocEFkKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCWVyYXNlIDgwNTEgZmlybXdhcmUgaW1hZ2UgaW4gTUFDIEFTSUMKLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIE5JQ0VyYXNlRmlybXdhcmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JaWYgKHBBZC0+Y2hpcE9wcy5lcmFzZUZpcm13YXJlKQotCQlwQWQtPmNoaXBPcHMuZXJhc2VGaXJtd2FyZShwQWQpOwotCi19LyogRW5kIG9mIE5JQ0VyYXNlRmlybXdhcmUgKi8KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJTG9hZCBUeCByYXRlIHN3aXRjaGluZyBwYXJhbWV0ZXJzCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX1NVQ0NFU1MgICAgICAgICBmaXJtd2FyZSBpbWFnZSBsb2FkIG9rCi0JCU5ESVNfU1RBVFVTX0ZBSUxVUkUgICAgICAgICBpbWFnZSBub3QgZm91bmQKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlSYXRlIFRhYmxlIEZvcm1hdDoKLQkJMS4gKEIwOiBWYWxpZCBJdGVtIG51bWJlcikgKEIxOkluaXRpYWwgaXRlbSBmcm9tIHplcm8pCi0JCTIuIEl0ZW0gTnVtYmVyKERlYykgICAgICBNb2RlKEhleCkgICAgIEN1cnJlbnQgTUNTKERlYykgICAgVHJhaW5VcChEZWMpICAgIFRyYWluRG93bihEZWMpCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUyBOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQ29tcGFyZSB0d28gbWVtb3J5IGJsb2NrCi0KLQlBcmd1bWVudHM6Ci0JCXBTcmMxCQlQb2ludGVyIHRvIGZpcnN0IG1lbW9yeSBhZGRyZXNzCi0JCXBTcmMyCQlQb2ludGVyIHRvIHNlY29uZCBtZW1vcnkgYWRkcmVzcwotCi0JUmV0dXJuIFZhbHVlOgotCQkwOgkJCW1lbW9yeSBpcyBlcXVhbAotCQkxOgkJCXBTcmMxIG1lbW9yeSBpcyBsYXJnZXIKLQkJMjoJCQlwU3JjMiBtZW1vcnkgaXMgbGFyZ2VyCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VTE9ORwlSVE1QQ29tcGFyZU1lbW9yeSgKLQlJTglQVk9JRAlwU3JjMSwKLQlJTglQVk9JRAlwU3JjMiwKLQlJTglVTE9ORwlMZW5ndGgpCi17Ci0JUFVDSEFSCXBNZW0xOwotCVBVQ0hBUglwTWVtMjsKLQlVTE9ORwlJbmRleCA9IDA7Ci0KLQlwTWVtMSA9IChQVUNIQVIpIHBTcmMxOwotCXBNZW0yID0gKFBVQ0hBUikgcFNyYzI7Ci0KLQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCi0JewotCQlpZiAocE1lbTFbSW5kZXhdID4gcE1lbTJbSW5kZXhdKQotCQkJcmV0dXJuICgxKTsKLQkJZWxzZSBpZiAocE1lbTFbSW5kZXhdIDwgcE1lbTJbSW5kZXhdKQotCQkJcmV0dXJuICgyKTsKLQl9Ci0KLQkvLyBFcXVhbAotCXJldHVybiAoMCk7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVplcm8gb3V0IG1lbW9yeSBibG9jawotCi0JQXJndW1lbnRzOgotCQlwU3JjMQkJUG9pbnRlciB0byBtZW1vcnkgYWRkcmVzcwotCQlMZW5ndGgJCVNpemUKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBaZXJvTWVtb3J5KAotCUlOCVBWT0lECXBTcmMsCi0JSU4JVUxPTkcJTGVuZ3RoKQotewotCVBVQ0hBUglwTWVtOwotCVVMT05HCUluZGV4ID0gMDsKLQotCXBNZW0gPSAoUFVDSEFSKSBwU3JjOwotCi0JZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQotCXsKLQkJcE1lbVtJbmRleF0gPSAweDAwOwotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQ29weSBkYXRhIGZyb20gbWVtb3J5IGJsb2NrIDEgdG8gbWVtb3J5IGJsb2NrIDIKLQotCUFyZ3VtZW50czoKLQkJcERlc3QJCVBvaW50ZXIgdG8gZGVzdGluYXRpb24gbWVtb3J5IGFkZHJlc3MKLQkJcFNyYwkJUG9pbnRlciB0byBzb3VyY2UgbWVtb3J5IGFkZHJlc3MKLQkJTGVuZ3RoCQlDb3B5IHNpemUKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBNb3ZlTWVtb3J5KAotCU9VVAlQVk9JRAlwRGVzdCwKLQlJTglQVk9JRAlwU3JjLAotCUlOCVVMT05HCUxlbmd0aCkKLXsKLQlQVUNIQVIJcE1lbTE7Ci0JUFVDSEFSCXBNZW0yOwotCVVJTlQJSW5kZXg7Ci0KLQlBU1NFUlQoKExlbmd0aD09MCkgfHwgKHBEZXN0ICYmIHBTcmMpKTsKLQotCXBNZW0xID0gKFBVQ0hBUikgcERlc3Q7Ci0JcE1lbTIgPSAoUFVDSEFSKSBwU3JjOwotCi0JZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQotCXsKLQkJcE1lbTFbSW5kZXhdID0gcE1lbTJbSW5kZXhdOwotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJSW5pdGlhbGl6ZSBwb3J0IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlVc2VyQ2ZnSW5pdCgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCkKLXsKLS8vCUVEQ0FfUEFSTSBEZWZhdWx0RWRjYVBhcm07Ci0gICAgVUlOVCBrZXlfaW5kZXgsIGJzc19pbmRleDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBVc2VyQ2ZnSW5pdFxuIikpOwotCi0JLy8KLQkvLyAgcGFydCBJLiBpbnRpYWxpemUgY29tbW9uIGNvbmZpZ3VyYXRpb24KLQkvLwotCi0JZm9yKGtleV9pbmRleD0wOyBrZXlfaW5kZXg8U0hBUkVfS0VZX05VTTsga2V5X2luZGV4KyspCi0JewotCQlmb3IoYnNzX2luZGV4ID0gMDsgYnNzX2luZGV4IDwgTUFYX01CU1NJRF9OVU07IGJzc19pbmRleCsrKQotCQl7Ci0JCQlwQWQtPlNoYXJlZEtleVtic3NfaW5kZXhdW2tleV9pbmRleF0uS2V5TGVuID0gMDsKLQkJCXBBZC0+U2hhcmVkS2V5W2Jzc19pbmRleF1ba2V5X2luZGV4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQkJfQotCX0KLQotCXBBZC0+RWVwcm9tQWNjZXNzID0gRkFMU0U7Ci0KLQlwQWQtPkFudGVubmEud29yZCA9IDA7Ci0JcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7Ci0KLQlwQWQtPkxlZENudGwud29yZCA9IDA7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JcEFkLT5MZWRJbmRpY2F0b3JTdHJlbmd0aCA9IDA7Ci0JcEFkLT5STG5rQ3RybE9mZnNldCA9IDA7Ci0JcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCA9IDA7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTPVRSVUU7Ci0JcEFkLT5DaGVja0RtYUJ1c3lDb3VudCA9IDA7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQlwQWQtPmJBdXRvVHhBZ2NBID0gRkFMU0U7CQkJLy8gRGVmYXVsdCBpcyBPRkYKLQlwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CQkJLy8gRGVmYXVsdCBpcyBPRkYKLQlwQWQtPlJmSWNUeXBlID0gUkZJQ18yODIwOwotCi0JLy8gSW5pdCB0aW1lciBmb3IgcmVzZXQgY29tcGxldGUgZXZlbnQKLQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDE7Ci0JcEFkLT5iRm9yY2VQcmludFRYID0gRkFMU0U7Ci0JcEFkLT5iRm9yY2VQcmludFJYID0gRkFMU0U7Ci0JcEFkLT5iU3RhRmlmb1Rlc3QgPSBGQUxTRTsKLQlwQWQtPmJQcm90ZWN0aW9uVGVzdCA9IEZBTFNFOwotCS8qCi0JcEFkLT5iSENDQVRlc3QgPSBGQUxTRTsKLQlwQWQtPmJHZW5PbmVIQ0NBID0gRkFMU0U7Ci0JKi8KLQlwQWQtPkNvbW1vbkNmZy5Ec2lmcyA9IDEwOyAgICAgIC8vIGluIHVuaXRzIG9mIHVzZWMKLQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyID0gMTAwOyAvL21XCi0JcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSAweGZmZmZmZmZmOyAvLyBBVVRPCi0JcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSAweGZmZmZmZmZmOyAvLyBBVVRPCi0JcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVBdXRvOyAvLyB1c2UgTG9uZyBwcmVhbWJsZSBvbiBUWCBieSBkZWZhdXQKLQlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gRkFMU0U7Ci0JcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gMjM0NzsKLQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IDIzNDY7Ci0JcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMDsgICAgLy8gMDogQVVUTwotCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gVFJVRTsgLy8wOwotCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAweGZmOyAgICAgLy8gdW5rbm93bgotCXBBZC0+Q29tbW9uQ2ZnLkJhbmRTdGF0ZSA9IFVOS05PV05fQkFORDsKLQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU1BlcmlvZCA9IDEwOwotCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTQ291bnQgPSAwOwotCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX05PUk1BTF9NT0RFOwotCi0KLQotI2lmZGVmIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQKLSNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCi0JcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5kZWx0YSA9IENBUlJJRVJfREVURUNUX0RFTFRBOwotCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuZGl2X2ZsYWcgPSBDQVJSSUVSX0RFVEVDVF9ESVZfRkxBRzsKLQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LmNyaXRlcmlhID0gQ0FSUklFUl9ERVRFQ1RfQ1JJVElSSUE7Ci0jaWZkZWYgUlQzMDkwCi0JaWYoSVNfUlQzMDkwQShwQWQpKQotCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QudGhyZXNob2xkID0gQ0FSUklFUl9ERVRFQ1RfVEhSRVNIT0xEXzMwOTBBOwotCWVsc2UKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LnRocmVzaG9sZCA9IENBUlJJRVJfREVURUNUX1RIUkVTSE9MRDsKLSNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVCAvLwotCi0JcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lID0gNjU7Ci0jaWZkZWYgTUVSR0VfQVJDSF9URUFNCi0JcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCA9IDI7Ci0JcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQXZnUnNzaVJlcSA9IC03NTsKLSNlbHNlIC8vIG9yaWdpbmFsIHJ0Mjh4eCBzb3VyY2UgY29kZQotCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGggPSAzOwotI2VuZGlmIC8vIE1FUkdFX0FSQ0hfVEVBTSAvLwotCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSA9IEZBTFNFOwotCXBBZC0+Q29tbW9uQ2ZnLmJOZWVkU2VuZFRyaWdnZXJGcmFtZSA9IEZBTFNFOwotCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJUaW1lckNvdW50ID0gMDsKLQlwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlID0gRkFMU0U7Ci0JcEFkLT5Db21tb25DZmcuYkNvdW50cnlGbGFnID0gRkFMU0U7Ci0JcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAwOwotCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMDsKLQotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkJlYWNvblR4V0ksIHNpemVvZihwQWQtPkJlYWNvblR4V0kpKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpKTsKLQlwQWQtPkhUQ0VuYWJsZSA9IEZBTFNFOwotCXBBZC0+YkJyb2FkQ29tSFQgPSBGQUxTRTsKLQlwQWQtPkNvbW1vbkNmZy5iUmRnID0gRkFMU0U7Ci0KLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0JcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhblBhc3NpdmVEd2VsbCA9IGRvdDExT0JTU1NjYW5QYXNzaXZlRHdlbGw7CS8vIFVuaXQgOiBUVS4gNX4xMDAwCi0JcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhbkFjdGl2ZUR3ZWxsID0gZG90MTFPQlNTU2NhbkFjdGl2ZUR3ZWxsOwkvLyBVbml0IDogVFUuIDEwfjEwMDAKLQlwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQgPSBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbDsJLy8gVW5pdCA6IFNlY29uZAotCXBBZC0+Q29tbW9uQ2ZnLkRvdDExT0Jzc1NjYW5QYXNzaXZlVG90YWxQZXJDaGFubmVsID0gZG90MTFPQlNTU2NhblBhc3NpdmVUb3RhbFBlckNoYW5uZWw7CS8vIFVuaXQgOiBUVS4gMjAwfjEwMDAwCi0JcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbCA9IGRvdDExT0JTU1NjYW5BY3RpdmVUb3RhbFBlckNoYW5uZWw7CS8vIFVuaXQgOiBUVS4gMjB+MTAwMDAKLQlwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3RvciA9IGRvdDExQlNTV2lkdGhDaGFubmVsVHJhbnNhY3Rpb25EZWxheUZhY3RvcjsKLQlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuQWN0aXZpdHlUaHJlID0gZG90MTFCU1NTY2FuQWN0aXZpdHlUaHJlc2hvbGQ7CS8vIFVuaXQgOiBwZXJjZW50YWdlCi0JcEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXkgPSAocEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aFRyaWdnZXJTY2FuSW50ICogcEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXlGYWN0b3IpOwotI2VuZGlmICAvLyBET1QxMU5fRFJBRlQzIC8vCi0KLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLCBzaXplb2YocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKSk7Ci0JcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gTU1QU19FTkFCTEU7Ci0JcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gMDsKLQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gSU1NRURfQkE7Ci0JcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OyAvLzMyOwotCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5UeEJBV2luTGltaXQgPSA2NDsgLy8zMjsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVXNlckNmZ0luaXQuIEJBQ2FwYWJpbGl0eSA9IDB4JXhcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkKSk7Ci0KLQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7Ci0JQkFUYWJsZUluaXQocEFkLCAmcEFkLT5CQVRhYmxlKTsKLQotCXBBZC0+Q29tbW9uQ2ZnLmJFeHRDaGFubmVsU3dpdGNoQW5ub3VuY2VtZW50ID0gMTsKLQlwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gMTsKLQlwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gVFJVRTsKLQkvLzIwMDgvMTEvMDU6S0ggYWRkIHRvIHN1cHBvcnQgQW50ZW5uYSBwb3dlci1zYXZpbmcgb2YgQVA8LS0KLQlwQWQtPkNvbW1vbkNmZy5iR3JlZW5BUEVuYWJsZT1GQUxTRTsKLQlwQWQtPkNvbW1vbkNmZy5iQmxvY2tBbnREaXZmb3JHcmVlbkFQPUZBTFNFOwotCS8vMjAwOC8xMS8wNTpLSCBhZGQgdG8gc3VwcG9ydCBBbnRlbm5hIHBvd2VyLXNhdmluZyBvZiBBUC0tPgotCXBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBGQUxTRTsKLQlwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPSBGQUxTRTsKLQotCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODcyMDIwMCkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplID0gMTM7IC8vYnkgSmVycnkgcmVjb21tZW5kCi0JfWVsc2V7Ci0JCXBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplID0gNzsKLQl9Ci0KLQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZCA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKLQkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKLQkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOwotCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7Ci0JcEFkLT5Db21tb25DZmcuVHhSYXRlID0gUkFURV82OwotCi0JcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE1DU19SQVRFXzY7Ci0JcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLkJXID0gQldfMjA7Ci0JcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0KLQlwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAxMDA7ICAgICAvLyBpbiBtU2VjCi0KLQotCS8vCi0JLy8gcGFydCBJSS4gaW50aWFsaXplIFNUQSBzcGVjaWZpYyBjb25maWd1cmF0aW9uCi0JLy8KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJUlhfRklMVEVSX1NFVF9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfRElSRUNUKTsKLQkJUlhfRklMVEVSX0NMRUFSX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9NVUxUSUNBU1QpOwotCQlSWF9GSUxURVJfU0VUX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9CUk9BRENBU1QpOwotCQlSWF9GSUxURVJfU0VUX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9BTExfTVVMVElDQVNUKTsKLQotCQlwQWQtPlN0YUNmZy5Qc20gPSBQV1JfQUNUSVZFOwotCi0JCXBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOwotCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKLQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOwotCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID0gRkFMU0U7Ci0JCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IDA7Ci0KLQkJLy8gODAyLjF4IHBvcnQgY29udHJvbAotCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKLQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0JCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSAwOwotCQlwQWQtPlN0YUNmZy5NaWNFcnJDbnQgICAgICAgID0gMDsKLQkJcEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgICAgICA9IEZBTFNFOwotCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSAgICAgICAgID0gU1NfTk9UVVNFOwotCi0JCXBBZC0+Q29tbW9uQ2ZnLk5kaXNSYWRpb1N0YXRlT2ZmID0gRkFMU0U7CQkvLyBOZXcgdG8gc3VwcG9ydCBtaWNyb3NvZnQgZGlzYWJsZSByYWRpbyB3aXRoIE9JRCBjb21tYW5kCi0KLQkJcEFkLT5TdGFDZmcuUnNzaVRyaWdnZXIgPSAwOwotCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgc2l6ZW9mKFJTU0lfU0FNUExFKSk7Ci0JCXBBZC0+U3RhQ2ZnLlJzc2lUcmlnZ2VyTW9kZSA9IFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEOwotCQlwQWQtPlN0YUNmZy5BdGltV2luID0gMDsKLQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsvL2RlZmF1bHQgbGlzdGVuIGNvdW50OwotCQlwQWQtPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOyAgLy8gQlNTX0lORlJBIG9yIEJTU19BREhPQyBvciBCU1NfTU9OSVRPUgotCQlwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7Ci0JCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOwotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKTsKLQotCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7Ci0JCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87Ci0JfQotCi0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotCXBBZC0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9Ob25lOwotI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KLSNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKLXBBZC0+YnJ0MzB4eEJhbk1jdUNtZCA9IEZBTFNFOwotcEFkLT5iMzA5MEVTcGVjaWFsQ2hpcCA9IEZBTFNFOwotLy9LSCBEZWJ1Zzp0aGUgZm9sbG93aW5nIG11c3QgYmUgcmVtb3ZlZAotcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZT0zOwotcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvcmNlQVNQTVRlc3Q9MDsKLXBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb2xsb3dIb3N0QVNQTT0xOwotI2VuZGlmIC8vIFBDSUVfUFNfU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JLy8gZ2xvYmFsIHZhcmlhYmxlcyBtWFhYWCB1c2VkIGluIE1BQyBwcm90b2NvbCBzdGF0ZSBtYWNoaW5lcwotCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOwotCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKLQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19JTkZSQV9PTik7Ci0KLQkvLyBQSFkgc3BlY2lmaWNhdGlvbgotCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSBQSFlfMTFCR19NSVhFRDsJCS8vIGRlZmF1bHQgUEhZIG1vZGUKLQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOyAgLy8gQ0NLIHVzZSBMT05HIHByZWFtYmxlCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJLy8gdXNlciBkZXNpcmVkIHBvd2VyIG1vZGUKLQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07Ci0JCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKLQkJcEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9IEZBTFNFOwotCi0JCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKSwgcEFkLCBGQUxTRSk7Ci0JCXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IEZBTFNFOwotCi0JCS8vIFBhdGNoIGZvciBOZHRlc3QKLQkJcEFkLT5TdGFDZmcuU2NhbkNudCA9IDA7Ci0KLQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gID0gVFJVRTsgLy8gRGVmYXVsdCBIYXJkd2FyZSBSYWRpbyBzdGF0dXMgaXMgT24KLQkJcEFkLT5TdGFDZmcuYlN3UmFkaW8gID0gVFJVRTsgLy8gRGVmYXVsdCBTb2Z0d2FyZSBSYWRpbyBzdGF0dXMgaXMgT24KLQkJcEFkLT5TdGFDZmcuYlJhZGlvICAgID0gVFJVRTsgLy8gYkh3UmFkaW8gJiYgYlN3UmFkaW8KLQkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBGQUxTRTsJCS8vIERlZmF1bHQgaXMgT0ZGCi0JCXBBZC0+U3RhQ2ZnLmJTaG93SGlkZGVuU1NJRCA9IEZBTFNFOwkJLy8gRGVmYXVsdCBubyBzaG93Ci0KLQkJLy8gTml0cm8gbW9kZSBjb250cm9sCi0JCXBBZC0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKLQotCQkvLyBTYXZlIHRoZSBpbml0IHRpbWUgYXMgbGFzdCBzY2FuIHRpbWUsIHRoZSBzeXN0ZW0gc2hvdWxkIGRvIHNjYW4gYWZ0ZXIgMiBzZWNvbmRzLgotCQkvLyBUaGlzIHBhdGNoIGlzIGZvciBkcml2ZXIgd2FrZSB1cCBmcm9tIHN0YW5kYnkgbW9kZSwgc3lzdGVtIHdpbGwgZG8gc2NhbiByaWdodCBhd2F5LgotCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUpOwotCQlpZiAocEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID4gMTAgKiBPU19IWikKLQkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSAtPSAoMTAgKiBPU19IWik7Ci0KLQkJTmRpc1plcm9NZW1vcnkocEFkLT5uaWNrbmFtZSwgSVdfRVNTSURfTUFYX1NJWkUrMSk7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCXNwcmludGYoKFBTVFJJTkcpIHBBZC0+bmlja25hbWUsICJSVDI4NjBTVEEiKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5XcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKSwgcEFkLCBGQUxTRSk7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCQlwQWQtPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKLQkJcEFkLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBGQUxTRTsKLQkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKLQkJcEFkLT5TdGFDZmcuYlJTTl9JRV9Gcm9tV3BhU3VwcGxpY2FudCA9IEZBTFNFOwotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JCXBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0VOQUJMRTsKLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCA4KTsKLQotCi0JCXBBZC0+U3RhQ2ZnLmJBdXRvQ29ubmVjdEJ5QnNzaWQgPSBGQUxTRTsKLQkJcEFkLT5TdGFDZmcuQmVhY29uTG9zdFRpbWUgPSBCRUFDT05fTE9TVF9USU1FOwotCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5XcGFQYXNzUGhyYXNlLCA2NCk7Ci0JCXBBZC0+U3RhQ2ZnLldwYVBhc3NQaHJhc2VMZW4gPSAwOwotCQlwQWQtPlN0YUNmZy5iQXV0b1JvYW1pbmcgPSBGQUxTRTsKLQkJcEFkLT5TdGFDZmcuYkZvcmNlVHhCdXJzdCA9IEZBTFNFOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vIERlZmF1bHQgZm9yIGV4dHJhIGluZm9ybWF0aW9uIGlzIG5vdCB2YWxpZAotCXBBZC0+RXh0cmFJbmZvID0gRVhUUkFfSU5GT19DTEVBUjsKLQotCS8vIERlZmF1bHQgQ29uZmlnIGNoYW5nZSBmbGFnCi0JcEFkLT5iQ29uZmlnQ2hhbmdlZCA9IEZBTFNFOwotCi0JLy8KLQkvLyBwYXJ0IElJSS4gQVAgY29uZmlndXJhdGlvbnMKLQkvLwotCi0KLQkvLwotCS8vIHBhcnQgSVYuIG90aGVycwotCS8vCi0JLy8gZHluYW1pYyBCQlAgUjY2OnNlbnNpYml0eSB0dW5pbmcgdG8gb3ZlcmNvbWUgYmFja2dyb3VuZCBub2lzZQotCXBBZC0+QmJwVHVuaW5nLmJFbmFibGUgICAgICAgICAgICAgICAgPSBUUlVFOwotCXBBZC0+QmJwVHVuaW5nLkZhbHNlQ2NhTG93ZXJUaHJlc2hvbGQgPSAxMDA7Ci0JcEFkLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCA9IDUxMjsKLQlwQWQtPkJicFR1bmluZy5SNjZEZWx0YSAgICAgICAgICAgICAgID0gNDsKLQlwQWQtPk1sbWUuYkVuYWJsZUF1dG9BbnRlbm5hQ2hlY2sgPSBUUlVFOwotCi0JLy8KLQkvLyBBbHNvIGluaXRpYWwgUjY2Q3VycmVudFZhbHVlLCBSVFVTQlJlc3VtZU1zZHVUcmFuc21pc3Npb24gbWlnaHQgdXNlIHRoaXMgdmFsdWUuCi0JLy8gaWYgbm90IGluaXRpYWwgdGhpcyB2YWx1ZSwgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSAwLgotCS8vCi0JcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlID0gMHgzODsKLQotCXBBZC0+QmJwOTQgPSBCQlBSOTRfREVGQVVMVDsKLQlwQWQtPkJicEZvckNDSyA9IEZBTFNFOwotCi0JLy8gRGVmYXVsdCBpcyBGQUxTRSBmb3IgdGVzdCBiaXQgMQotCS8vcEFkLT5iVGVzdDEgPSBGQUxTRTsKLQotCS8vIGluaXRpYWxpemUgTUFDIHRhYmxlIGFuZCBhbGxvY2F0ZSBzcGluIGxvY2sKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NYWNUYWIsIHNpemVvZihNQUNfVEFCTEUpKTsKLQlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+TWFjVGFiLk1jYXN0UHNRdWV1ZSk7Ci0JTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0KLQkvL1JUTVBJbml0VGltZXIocEFkLCAmcEFkLT5SRUNCQVRpbWVyLCBSRUNCQVRpbWVyVGltZW91dCwgcEFkLCBUUlVFKTsKLQkvL1JUTVBTZXRUaW1lcigmcEFkLT5SRUNCQVRpbWVyLCBSRU9SREVSX0VYRUNfSU5UVik7Ci0KLSNpZmRlZiBSQUxJTktfQVRFCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+YXRlLCBzaXplb2YoQVRFX0lORk8pKTsKLQlwQWQtPmF0ZS5Nb2RlID0gQVRFX1NUT1A7Ci0JcEFkLT5hdGUuVHhDb3VudCA9IDIwMDsvKiB0byBleGNlZWQgVFhfUklOR19TSVpFIC4uLiAqLwotCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKLQlwQWQtPmF0ZS5SRkZyZXFPZmZzZXQgPSAwOwotCXBBZC0+YXRlLlR4TGVuZ3RoID0gMTAyNDsKLQlwQWQtPmF0ZS5UeFdJLlNob3J0R0kgPSAwOy8vIExPTkcgR0kgOiA4MDAgbnMKLQlwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPSBNT0RFX0NDSzsKLQlwQWQtPmF0ZS5UeFdJLk1DUyA9IDM7Ci0JcEFkLT5hdGUuVHhXSS5CVyA9IEJXXzIwOwotCXBBZC0+YXRlLkNoYW5uZWwgPSAxOwotCXBBZC0+YXRlLlFJRCA9IFFJRF9BQ19CRTsKLQlwQWQtPmF0ZS5BZGRyMVswXSA9IDB4MDA7Ci0JcEFkLT5hdGUuQWRkcjFbMV0gPSAweDExOwotCXBBZC0+YXRlLkFkZHIxWzJdID0gMHgyMjsKLQlwQWQtPmF0ZS5BZGRyMVszXSA9IDB4QUE7Ci0JcEFkLT5hdGUuQWRkcjFbNF0gPSAweEJCOwotCXBBZC0+YXRlLkFkZHIxWzVdID0gMHhDQzsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPmF0ZS5BZGRyMiwgcEFkLT5hdGUuQWRkcjEsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5hdGUuQWRkcjMsIHBBZC0+YXRlLkFkZHIxLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOwotCXBBZC0+YXRlLmJSeEZFUiA9IDA7Ci0JcEFkLT5hdGUuYlFBVHhTdGFydCA9IEZBTFNFOwotCXBBZC0+YXRlLmJRQVJ4U3RhcnQgPSBGQUxTRTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCXBBZC0+YXRlLmJGV0xvYWRpbmcgPSBGQUxTRTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0jaWZkZWYgUkFMSU5LXzI4eHhfUUEKLQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDA7Ci0JcEFkLT5hdGUuQXRlUGlkID0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOwotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0KLQlwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QgPSBGQUxTRTsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSAgICBwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNpZmRlZiBBTlRfRElWRVJTSVRZX1NVUFBPUlQKLQkJaWYgKCBwQWQtPkNvbW1vbkNmZy5iUnhBbnREaXZlcnNpdHkgPT0gQU5UX0ZJWF9BTlQyKQotCQl7Ci0JCQlwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50ID0gMTsKLQkJCXBBZC0+UnhBbnQuUGFpcjFTZWNvbmRhcnlSeEFudCA9IDA7Ci0JCX0KLQkJZWxzZSAvLyBEZWZhdWx0Ci0JCXsKLQkJCXBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQgPSAwOwotCQkJcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50ID0gMTsKLQkJfQotCQlwQWQtPlJ4QW50LkV2YWx1YXRlUGVyaW9kID0gMDsKLQkJcEFkLT5SeEFudC5SY3ZQa3ROdW1XaGVuRXZhbHVhdGUgPSAwOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlwQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVswXSA9IHBBZC0+UnhBbnQuUGFpcjFBdmdSc3NpWzFdID0gMDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBBUF9BTlRFTk5BX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gVXNlckNmZ0luaXRcbiIpKTsKLX0KLQotLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLVVDSEFSIEJ0b0goU1RSSU5HIGNoKQotewotCWlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSByZXR1cm4gKGNoIC0gJzAnKTsgICAgICAgIC8vIEhhbmRsZSBudW1lcmFscwotCWlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSByZXR1cm4gKGNoIC0gJ0EnICsgMHhBKTsgIC8vIEhhbmRsZSBjYXBpdG9sIGhleCBkaWdpdHMKLQlpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykgcmV0dXJuIChjaCAtICdhJyArIDB4QSk7ICAvLyBIYW5kbGUgc21hbGwgaGV4IGRpZ2l0cwotCXJldHVybigyNTUpOwotfQotCi0vLwotLy8gIEZVTkNUSU9OOiBBdG9IKGNoYXIgKiwgVUNIQVIgKiwgaW50KQotLy8KLS8vICBQVVJQT1NFOiAgQ29udmVydHMgYXNjaWkgc3RyaW5nIHRvIG5ldHdvcmsgb3JkZXIgaGV4Ci0vLwotLy8gIFBBUkFNRVRFUlM6Ci0vLyAgICBzcmMgICAgLSBwb2ludGVyIHRvIGlucHV0IGFzY2lpIHN0cmluZwotLy8gICAgZGVzdCAgIC0gcG9pbnRlciB0byBvdXRwdXQgaGV4Ci0vLyAgICBkZXN0bGVuIC0gc2l6ZSBvZiBkZXN0Ci0vLwotLy8gIENPTU1FTlRTOgotLy8KLS8vICAgIDIgYXNjaWkgYnl0ZXMgbWFrZSBhIGhleCBieXRlIHNvIG11c3QgcHV0IDFzdCBhc2NpaSBieXRlIG9mIHBhaXIKLS8vICAgIGludG8gdXBwZXIgbmliYmxlIGFuZCAybmQgYXNjaWkgYnl0ZSBvZiBwYWlyIGludG8gbG93ZXIgbmliYmxlLgotLy8KLS8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLXZvaWQgQXRvSChQU1RSSU5HIHNyYywgUFVDSEFSIGRlc3QsIGludCBkZXN0bGVuKQotewotCVBTVFJJTkcgc3JjcHRyOwotCVBVQ0hBUiBkZXN0VGVtcDsKLQotCXNyY3B0ciA9IHNyYzsKLQlkZXN0VGVtcCA9IChQVUNIQVIpIGRlc3Q7Ci0KLQl3aGlsZShkZXN0bGVuLS0pCi0JewotCQkqZGVzdFRlbXAgPSBCdG9IKCpzcmNwdHIrKykgPDwgNDsgICAgLy8gUHV0IDFzdCBhc2NpaSBieXRlIGluIHVwcGVyIG5pYmJsZS4KLQkJKmRlc3RUZW1wICs9IEJ0b0goKnNyY3B0cisrKTsgICAgICAvLyBBZGQgMm5kIGFzY2lpIGJ5dGUgdG8gYWJvdmUuCi0JCWRlc3RUZW1wKys7Ci0JfQotfQotCi0KLS8vKysrTWFyayBieSBzaGlhbmcsIG5vdCB1c2Ugbm93LCBuZWVkIHRvIHJlbW92ZSBhZnRlciBjb25maXJtCi0vLy0tLU1hcmsgYnkgc2hpYW5nLCBub3QgdXNlIG5vdywgbmVlZCB0byByZW1vdmUgYWZ0ZXIgY29uZmlybQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlJbml0IHRpbWVyIG9iamVjdHMKLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwVGltZXIJCQkJVGltZXIgc3RydWN0dXJlCi0JCXBUaW1lckZ1bmMJCQlGdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGltZXIgZXhwaXJlZAotCQlSZXBlYXQJCQkJVHVyZSBmb3IgcGVyaW9kIHRpbWVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBJbml0VGltZXIoCi0JSU4JUFJUTVBfQURBUFRFUgkJCXBBZCwKLQlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCi0JSU4JUFZPSUQJCQkJCXBUaW1lckZ1bmMsCi0JSU4JUFZPSUQJCQkJCXBEYXRhLAotCUlOCUJPT0xFQU4JCQkJCVJlcGVhdCkKLXsKLQkvLwotCS8vIFNldCBWYWxpZCB0byBUUlVFIGZvciBsYXRlciB1c2VkLgotCS8vIEl0IHdpbGwgY3Jhc2ggaWYgd2UgY2FuY2VsIGEgdGltZXIgb3Igc2V0IGEgdGltZXIKLQkvLyB0aGF0IHdlIGhhdmVuJ3QgaW5pdGlhbGl6ZSBiZWZvcmUuCi0JLy8KLQlwVGltZXItPlZhbGlkICAgICAgPSBUUlVFOwotCi0JcFRpbWVyLT5QZXJpb2RpY1R5cGUgPSBSZXBlYXQ7Ci0JcFRpbWVyLT5TdGF0ZSAgICAgID0gRkFMU0U7Ci0JcFRpbWVyLT5jb29raWUgPSAoVUxPTkcpIHBEYXRhOwotCi0jaWZkZWYgUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQKLQlwVGltZXItPnBBZCA9IHBBZDsKLSNlbmRpZiAvLyBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLwotCi0JUlRNUF9PU19Jbml0X1RpbWVyKHBBZCwgJnBUaW1lci0+VGltZXJPYmosCXBUaW1lckZ1bmMsIChQVk9JRCkgcFRpbWVyKTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJSW5pdCB0aW1lciBvYmplY3RzCi0KLQlBcmd1bWVudHM6Ci0JCXBUaW1lcgkJCQlUaW1lciBzdHJ1Y3R1cmUKLQkJVmFsdWUJCQkJVGltZXIgdmFsdWUgaW4gbWlsbGlzZWNvbmRzCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0JCVRvIHVzZSB0aGlzIHJvdXRpbmUsIG11c3QgY2FsbCBSVE1QSW5pdFRpbWVyIGJlZm9yZS4KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFNldFRpbWVyKAotCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKLQlJTglVTE9ORwkJCQkJVmFsdWUpCi17Ci0JaWYgKHBUaW1lci0+VmFsaWQpCi0JewotCQlwVGltZXItPlRpbWVyVmFsdWUgPSBWYWx1ZTsKLQkJcFRpbWVyLT5TdGF0ZSAgICAgID0gRkFMU0U7Ci0JCWlmIChwVGltZXItPlBlcmlvZGljVHlwZSA9PSBUUlVFKQotCQl7Ci0JCQlwVGltZXItPlJlcGVhdCA9IFRSVUU7Ci0JCQlSVE1QX1NldFBlcmlvZGljVGltZXIoJnBUaW1lci0+VGltZXJPYmosIFZhbHVlKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBUaW1lci0+UmVwZWF0ID0gRkFMU0U7Ci0JCQlSVE1QX09TX0FkZF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgVmFsdWUpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UX0VSUigoIlJUTVBTZXRUaW1lciBmYWlsZWQsIFRpbWVyIGhhc24ndCBiZWVuIGluaXRpYWxpemUhXG4iKSk7Ci0JfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlJbml0IHRpbWVyIG9iamVjdHMKLQotCUFyZ3VtZW50czoKLQkJcFRpbWVyCQkJCVRpbWVyIHN0cnVjdHVyZQotCQlWYWx1ZQkJCQlUaW1lciB2YWx1ZSBpbiBtaWxsaXNlY29uZHMKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQkJVG8gdXNlIHRoaXMgcm91dGluZSwgbXVzdCBjYWxsIFJUTVBJbml0VGltZXIgYmVmb3JlLgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QTW9kVGltZXIoCi0JSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAotCUlOCVVMT05HCQkJCQlWYWx1ZSkKLXsKLQlCT09MRUFOCUNhbmNlbDsKLQotCWlmIChwVGltZXItPlZhbGlkKQotCXsKLQkJcFRpbWVyLT5UaW1lclZhbHVlID0gVmFsdWU7Ci0JCXBUaW1lci0+U3RhdGUgICAgICA9IEZBTFNFOwotCQlpZiAocFRpbWVyLT5QZXJpb2RpY1R5cGUgPT0gVFJVRSkKLQkJewotCQkJUlRNUENhbmNlbFRpbWVyKHBUaW1lciwgJkNhbmNlbCk7Ci0JCQlSVE1QU2V0VGltZXIocFRpbWVyLCBWYWx1ZSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QX09TX01vZF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgVmFsdWUpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UX0VSUigoIlJUTVBNb2RUaW1lciBmYWlsZWQsIFRpbWVyIGhhc24ndCBiZWVuIGluaXRpYWxpemUhXG4iKSk7Ci0JfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDYW5jZWwgdGltZXIgb2JqZWN0cwotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQkJMS4pIFRvIHVzZSB0aGlzIHJvdXRpbmUsIG11c3QgY2FsbCBSVE1QSW5pdFRpbWVyIGJlZm9yZS4KLQkJMi4pIFJlc2V0IE5JQyB0byBpbml0aWFsIHN0YXRlIEFTIElTIHN5c3RlbSBib290IHVwIHRpbWUuCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBDYW5jZWxUaW1lcigKLQlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCi0JT1VUCUJPT0xFQU4JCQkJCSpwQ2FuY2VsbGVkKQotewotCWlmIChwVGltZXItPlZhbGlkKQotCXsKLQkJaWYgKHBUaW1lci0+U3RhdGUgPT0gRkFMU0UpCi0JCQlwVGltZXItPlJlcGVhdCA9IEZBTFNFOwotCi0JCVJUTVBfT1NfRGVsX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBwQ2FuY2VsbGVkKTsKLQotCQlpZiAoKnBDYW5jZWxsZWQgPT0gVFJVRSkKLQkJCXBUaW1lci0+U3RhdGUgPSBUUlVFOwotCi0jaWZkZWYgUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQKLQkJLy8gV2UgbmVlZCB0byBnby10aHJvdWdoIHRoZSBUaW1lclEgdG8gZmluZG91dCB0aGlzIHRpbWVyIGhhbmRsZXIgYW5kIHJlbW92ZSBpdCBpZgotCQkvLwkJaXQncyBzdGlsbCB3YWl0aW5nIGZvciBleGVjdXRpb24uCi0JCVJ0bXBUaW1lclFSZW1vdmUocFRpbWVyLT5wQWQsIHBUaW1lcik7Ci0jZW5kaWYgLy8gUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQgLy8KLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlRfRVJSKCgiUlRNUENhbmNlbFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKLQl9Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVNldCBMRUQgU3RhdHVzCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJU3RhdHVzCQkJCQlMRUQgU3RhdHVzCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QU2V0TEVEKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJU3RhdHVzKQotewotCS8vVUxPTkcJCQlkYXRhOwotCVVDSEFSCQkJSGlnaEJ5dGUgPSAwOwotCVVDSEFSCQkJTG93Qnl0ZTsKLQlCT09MRUFOCQkJYklnbm9yZWQgPSBGQUxTRTsKLQotI2lmZGVmIFJBTElOS19BVEUKLQkvKgotCQlJbiBBVEUgbW9kZSBvZiBSVDI4NjAgQVAvU1RBLCB3ZSBoYXZlIGVyYXNlZCA4MDUxIGZpcm13YXJlLgotCQlTbyBMRUQgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gQVRFIGlzIHJ1bm5pbmcuCi0JKi8KLQlpZiAoIUlTX1JUMzU3MihwQWQpKQotCXsKLQkJaWYgKEFURV9PTihwQWQpKQotCQkJcmV0dXJuOwotCX0KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQlMb3dCeXRlID0gcEFkLT5MZWRDbnRsLmZpZWxkLkxlZE1vZGUmMHg3ZjsKLQlzd2l0Y2ggKFN0YXR1cykKLQl7Ci0JCWNhc2UgTEVEX0xJTktfRE9XTjoKLQkJCUhpZ2hCeXRlID0gMHgyMDsKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOwotCQkJcEFkLT5MZWRJbmRpY2F0b3JTdHJlbmd0aCA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBMRURfTElOS19VUDoKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JCQkJSGlnaEJ5dGUgPSAweGEwOwotCQkJZWxzZQotCQkJCUhpZ2hCeXRlID0gMHg2MDsKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTEVEX1JBRElPX09OOgotCQkJSGlnaEJ5dGUgPSAweDIwOwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBMRURfSEFMVDoKLQkJCUxvd0J5dGUgPSAwOyAvLyBEcml2ZXIgc2V0cyBNQUMgcmVnaXN0ZXIgYW5kIE1BQyBjb250cm9scyBMRUQKLQkJY2FzZSBMRURfUkFESU9fT0ZGOgotCQkJSGlnaEJ5dGUgPSAwOwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBMRURfV1BTOgotCQkJSGlnaEJ5dGUgPSAweDEwOwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBMRURfT05fU0lURV9TVVJWRVk6Ci0JCQlIaWdoQnl0ZSA9IDB4MDg7Ci0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIExFRF9QT1dFUl9VUDoKLQkJCUhpZ2hCeXRlID0gMHgwNDsKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOwotCQkJYnJlYWs7Ci0jaWZkZWYgUkFMSU5LX0FURQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldExFRDo6VW5rbm93biBTdGF0dXMgJWRcbiIsIFN0YXR1cykpOwotCQkJYnJlYWs7Ci0JfQotCi0gICAgLy8KLQkvLyBLZWVwIExFRCBzdGF0dXMgZm9yIExFRCBTaXRlU3VydmV5IG1vZGUuCi0JLy8gQWZ0ZXIgU2l0ZVN1cnZleSwgd2Ugd2lsbCBzZXQgdGhlIExFRCBtb2RlIHRvIHByZXZpb3VzIHN0YXR1cy4KLQkvLwotCWlmICgoU3RhdHVzICE9IExFRF9PTl9TSVRFX1NVUlZFWSkgJiYgKFN0YXR1cyAhPSBMRURfUE9XRVJfVVApICYmIChiSWdub3JlZCA9PSBGQUxTRSkpCi0JCXBBZC0+TGVkU3RhdHVzID0gU3RhdHVzOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldExFRDo6TW9kZT0lZCxIaWdoQnl0ZT0weCUwMngsTG93Qnl0ZT0weCUwMnhcbiIsIHBBZC0+TGVkQ250bC5maWVsZC5MZWRNb2RlLCBIaWdoQnl0ZSwgTG93Qnl0ZSkpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJU2V0IExFRCBTaWduYWwgU3RyZWd0aAotCi0JQXJndW1lbnRzOgotCQlwQWQJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCURibQkJCQkJCVNpZ25hbCBTdHJlZ3RoCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCQlDYW4gYmUgcnVuIG9uIGFueSBJUlFMIGxldmVsLgotCi0JCUFjY29yZGluZyB0byBNaWNyb3NvZnQgWmVybyBDb25maWcgV2lyZWxlc3MgU2lnbmFsIFN0cmVndGggZGVmaW5pdGlvbiBhcyBiZWxvd3MuCi0JCTw9IC05MCAgTm8gU2lnbmFsCi0JCTw9IC04MSAgVmVyeSBMb3cKLQkJPD0gLTcxICBMb3cKLQkJPD0gLTY3ICBHb29kCi0JCTw9IC01NyAgVmVyeSBHb29kCi0JCSA+IC01NyAgRXhjZWxsZW50Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QU2V0U2lnbmFsTEVEKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE5ESVNfODAyXzExX1JTU0kgRGJtKQotewotCVVDSEFSCQluTGVkID0gMDsKLQotCWlmIChwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSA9PSBMRURfTU9ERV9TSUdOQUxfU1RSRUdUSCkKLQl7Ci0JCWlmIChEYm0gPD0gLTkwKQotCQkJbkxlZCA9IDA7Ci0JCWVsc2UgaWYgKERibSA8PSAtODEpCi0JCQluTGVkID0gMTsKLQkJZWxzZSBpZiAoRGJtIDw9IC03MSkKLQkJCW5MZWQgPSAzOwotCQllbHNlIGlmIChEYm0gPD0gLTY3KQotCQkJbkxlZCA9IDc7Ci0JCWVsc2UgaWYgKERibSA8PSAtNTcpCi0JCQluTGVkID0gMTU7Ci0JCWVsc2UKLQkJCW5MZWQgPSAzMTsKLQotCQkvLwotCQkvLyBVcGRhdGUgU2lnbmFsIFN0cmVndGggdG8gZmlybXdhcmUgaWYgY2hhbmdlZC4KLQkJLy8KLQkJaWYgKHBBZC0+TGVkSW5kaWNhdG9yU3RyZW5ndGggIT0gbkxlZCkKLQkJewotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUxLCAweGZmLCBuTGVkLCBwQWQtPkxlZENudGwuZmllbGQuUG9sYXJpdHkpOwotCQkJcEFkLT5MZWRJbmRpY2F0b3JTdHJlbmd0aCA9IG5MZWQ7Ci0JCX0KLQl9Ci19Ci0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJRW5hYmxlIFJYCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA8PSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQkJQmVmb3JlIEVuYWJsZSBSWCwgbWFrZSBzdXJlIHlvdSBoYXZlIGVuYWJsZWQgSW50ZXJydXB0LgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUEVuYWJsZVJ4VHgoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCi17Ci0vLwlXUERNQV9HTE9fQ0ZHX1NUUlVDCUdsb0NmZzsKLS8vCVVMT05HCWkgPSAwOwotCVVJTlQzMiByeF9maWx0ZXJfZmxhZzsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBSVE1QRW5hYmxlUnhUeFxuIikpOwotCi0JLy8gRW5hYmxlIFJ4IERNQS4KLQlSVDI4WFhETUFFbmFibGUocEFkKTsKLQotCS8vIGVuYWJsZSBSWCBvZiBNQUMgYmxvY2sKLQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQotCXsKLQkJcnhfZmlsdGVyX2ZsYWcgPSBBUE5PUk1BTDsKLQotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgcnhfZmlsdGVyX2ZsYWcpOyAgICAgLy8gZW5hYmxlIFJYIG9mIERNQSBibG9jawotCX0KLQllbHNlCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuUFNQWGxpbmspCi0JCQlyeF9maWx0ZXJfZmxhZyA9IFBTUFhMSU5LOwotCQllbHNlCi0JCQlyeF9maWx0ZXJfZmxhZyA9IFNUQU5PUk1BTDsgICAgIC8vIFN0YWlvbiBub3QgZHJvcCBjb250cm9sIGZyYW1lIHdpbGwgZmFpbCBXaUZpIENlcnRpZmljYXRpb24uCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgcnhfZmlsdGVyX2ZsYWcpOwotCX0KLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHhjKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gUlRNUEVuYWJsZVJ4VHhcbiIpKTsKLX0KLQotCi0vLysrK0FkZCBieSBzaGlhbmcsIG1vdmUgZnJvbSBvcy9saW51eC9ydF9tYWluX2Rldi5jCi12b2lkIENmZ0luaXRIb29rKFBSVE1QX0FEQVBURVIgcEFkKQotewotCXBBZC0+YkJyb2FkQ29tSFQgPSBUUlVFOwotfQotCi0KLWludCBydDI4eHhfaW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQU1RSSU5HIHBEZWZhdWx0TWFjLAotCUlOIFBTVFJJTkcgcEhvc3ROYW1lKQotewotCVVJTlQJCQkJCWluZGV4OwotCVVDSEFSCQkJCQlUbXBQaHk7Ci0JTkRJU19TVEFUVVMJCQkJU3RhdHVzOwotCVVJTlQzMgkJCQkJTWFjQ3NyMCA9IDA7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkvLyBJZiBkaXJ2ZXIgZG9lc24ndCB3YWtlIHVwIGZpcm13YXJlIGhlcmUsCi0JLy8gTklDTG9hZEZpcm13YXJlIHdpbGwgaGFuZyBmb3JldmVyIHdoZW4gaW50ZXJmYWNlIGlzIHVwIGFnYWluLgotCS8vIFJUMjg2MCBQQ0kKLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSAmJgotCQlPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKLQl7Ci0JCUFVVE9fV0FLRVVQX1NUUlVDIEF1dG9XYWtldXBDZmc7Ci0JCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKLQkJQXV0b1dha2V1cENmZy53b3JkID0gMDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOwotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKLQl9Ci0JfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQkvLyByZXNldCBBZGFwdGVyIGZsYWdzCi0JUlRNUF9DTEVBUl9GTEFHUyhwQWQpOwotCi0JLy8gSW5pdCBCc3NUYWIgJiBDaGFubmVsSW5mbyB0YWJibGVzIGZvciBhdXRvIGNoYW5uZWwgc2VsZWN0LgotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JLy8gQWxsb2NhdGUgQkEgUmVvcmRlcmluZyBtZW1vcnkKLQliYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQocEFkLCBNQVhfUkVPUkRFUklOR19NUERVX05VTSk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkvLyBNYWtlIHN1cmUgTUFDIGdldHMgcmVhZHkuCi0JaW5kZXggPSAwOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19DU1IwLCAmTWFjQ3NyMCk7Ci0JCXBBZC0+TUFDVmVyc2lvbiA9IE1hY0NzcjA7Ci0KLQkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gIT0gMHgwMCkgJiYgKHBBZC0+TUFDVmVyc2lvbiAhPSAweEZGRkZGRkZGKSkKLQkJCWJyZWFrOwotCi0JCVJUTVB1c2VjRGVsYXkoMTApOwotCX0gd2hpbGUgKGluZGV4KysgPCAxMDApOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1BQ19DU1IwICBbIFZlcjpSZXY9MHglMDh4XVxuIiwgcEFkLT5NQUNWZXJzaW9uKSk7Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKLQkvKkl2ZXJzb24gcGF0Y2ggUENJRSBMMSBpc3N1ZSB0byBtYWtlIHN1cmUgdGhhdCBkcml2ZXIgY2FuIGJlIHJlYWQsd3JpdGUgLEJCUCBhbmQgUkYgcmVnaXN0ZXIgIGF0IHBjaWUgTC4xIGxldmVsICovCi0JaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkmJk9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBBVVhfQ1RSTCwgJk1hY0NzcjApOwotCQlNYWNDc3IwIHw9IDB4NDAyOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVhfQ1RSTCwgTWFjQ3NyMCk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVWF9DVFJMID0gMHgleFxuIiwgTWFjQ3NyMCkpOwotCX0KLSNlbmRpZiAvLyBQQ0lFX1BTX1NVUFBPUlQgLy8KLQotCS8vIFRvIGZpeCBkcml2ZXIgZGlzYWJsZS9lbmFibGUgaGFuZyBpc3N1ZSB3aGVuIHJhZGlvIG9mZgotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBXUl9QSU5fQ0ZHLCAweDIpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JLy8gRGlzYWJsZSBETUEKLQlSVDI4WFhETUFEaXNhYmxlKHBBZCk7Ci0KLQotCS8vIExvYWQgODA1MSBmaXJtd2FyZQotCVN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOwotCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UX0VSUigoIk5JQ0xvYWRGaXJtd2FyZSBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7Ci0JCWdvdG8gZXJyMTsKLQl9Ci0KLQlOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcyhwQWQpOwotCi0JLy8gRGlzYWJsZSBpbnRlcnJ1cHRzIGhlcmUgd2hpY2ggaXMgYXMgc29vbiBhcyBwb3NzaWJsZQotCS8vIFRoaXMgc3RhdGVtZW50IHNob3VsZCBuZXZlciBiZSB0cnVlLiBXZSBtaWdodCBjb25zaWRlciB0byByZW1vdmUgaXQgbGF0ZXIKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpKQotCXsKLQkJUlRNUF9BU0lDX0lOVEVSUlVQVF9ESVNBQkxFKHBBZCk7Ci0JfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JU3RhdHVzID0gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkocEFkKTsKLQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVF9FUlIoKCJSVE1QQWxsb2NETUFNZW1vcnkgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOwotCQlnb3RvIGVycjE7Ci0JfQotCi0JUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSk7Ci0KLQkvLyBpbml0aWFsaXplIE1MTUUKLQkvLwotCi0JU3RhdHVzID0gUnRtcE1nbXRUYXNrSW5pdChwQWQpOwotCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJZ290byBlcnIyOwotCi0JU3RhdHVzID0gTWxtZUluaXQocEFkKTsKLQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVF9FUlIoKCJNbG1lSW5pdCBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7Ci0JCWdvdG8gZXJyMjsKLQl9Ci0KLQkvLyBJbml0aWFsaXplIHBBZC0+U3RhQ2ZnLCBwQWQtPkFwQ2ZnLCBwQWQtPkNvbW1vbkNmZyB0byBtYW51ZmFjdHVyZSBkZWZhdWx0Ci0JLy8KLQlVc2VyQ2ZnSW5pdChwQWQpOwotCVN0YXR1cyA9IFJ0bXBOZXRUYXNrSW5pdChwQWQpOwotCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJZ290byBlcnIzOwotCi0vLwlDT1BZX01BQ19BRERSKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5Cc3NpZCwgbmV0aWYtPmh3YWRkcik7Ci0vLwlwQWQtPmJGb3JjZVByaW50VFggPSBUUlVFOwotCi0JQ2ZnSW5pdEhvb2socEFkKTsKLQotCi0jaWZkZWYgQkxPQ0tfTkVUX0lGCi0JaW5pdGJsb2NrUXVldWVUYWIocEFkKTsKLSNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JTWVhc3VyZVJlcVRhYkluaXQocEFkKTsKLQlUcGNSZXFUYWJJbml0KHBBZCk7Ci0KLQkvLwotCS8vIEluaXQgdGhlIGhhcmR3YXJlLCB3ZSBuZWVkIHRvIGluaXQgYXNpYyBiZWZvcmUgcmVhZCByZWdpc3RyeSwgb3RoZXJ3aXNlIG1hYyByZWdpc3RlciB3aWxsIGJlIHJlc2V0Ci0JLy8KLQlTdGF0dXMgPSBOSUNJbml0aWFsaXplQWRhcHRlcihwQWQsIFRSVUUpOwotCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UX0VSUigoIk5JQ0luaXRpYWxpemVBZGFwdGVyIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKLQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQlnb3RvIGVycjM7Ci0JfQotCi0JLy8gUmVhZCBwYXJhbWV0ZXJzIGZyb20gQ29uZmlnIEZpbGUKLQlTdGF0dXMgPSBSVE1QUmVhZFBhcmFtZXRlcnNIb29rKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiMS4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOwotCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UX0VSUigoIk5JQ1JlYWRSZWdQYXJhbWV0ZXJzIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLFN0YXR1cykpOwotCQlnb3RvIGVycjQ7Ci0JfQotCi0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCS8vSW5pdCBCYSBDYXBhYmlsaXR5IHBhcmFtZXRlcnMuCi0vLwlSVDI4WFhfQkFfSU5JVChwQWQpOwotCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGU7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKLQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7Ci0JLy8gVVBkYXRhIHRvIEhUIElFCi0JcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCS8vIGFmdGVyIHJlYWRpbmcgUmVnaXN0cnksIHdlIG5vdyBrbm93IGlmIGluIEFQIG1vZGUgb3IgU1RBIG1vZGUKLQotCS8vIExvYWQgODA1MSBmaXJtd2FyZTsgY3Jhc2ggd2hlbiBGVyBpbWFnZSBub3QgZXhpc3RlbnQKLQkvLyBTdGF0dXMgPSBOSUNMb2FkRmlybXdhcmUocEFkKTsKLQkvLyBpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JLy8gICAgYnJlYWs7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiMi4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOwotCi0JLy8gV2Ugc2hvdWxkIHJlYWQgRUVQUk9NIGZvciBhbGwgY2FzZXMuICBydDI4NjBiCi0JTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMocEFkLCAoUFVDSEFSKXBEZWZhdWx0TWFjKTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIzLiBQaHkgTW9kZSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7Ci0KLQlOSUNJbml0QXNpY0Zyb21FRVBST00ocEFkKTsgLy9ydDI4NjBiCi0KLQkvLyBTZXQgUEhZIHRvIGFwcHJvcHJpYXRlIG1vZGUKLQlUbXBQaHkgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOwotCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAweGZmOwotCVJUTVBTZXRQaHlNb2RlKHBBZCwgVG1wUGh5KTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlTZXRDb21tb25IVChwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JLy8gTm8gdmFsaWQgY2hhbm5lbHMuCi0JaWYgKHBBZC0+Q2hhbm5lbExpc3ROdW0gPT0gMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIGNvbmZpZ3VyYXRpb24uIE5vIHZhbGlkIGNoYW5uZWwgZm91bmQuIENoZWNrIFwiQ29udHJ5Q29kZVwiIGFuZCBcIkNoYW5uZWxHZW9ncmFwaHlcIiBzZXR0aW5nLlxuIikpOwotCQlnb3RvIGVycjQ7Ci0JfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIk1DUyBTZXQgPSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0sCi0gICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0sIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0sCi0gICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10sIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0pKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotCS8vSW5pdCBSVDMweHggUkZSZWdpc3RlcnMgYWZ0ZXIgcmVhZCBSRklDIHR5cGUgZnJvbSBFRVBST00KLQlOSUNJbml0UkZSZWdpc3RlcnMocEFkKTsKLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQotCi0KLS8vCQlBUEluaXRpYWxpemUocEFkKTsKLQotI2lmZGVmIElLQU5PU19WWF8xWDAKLQlWUl9JS0FOT1NfRlBfSW5pdChwQWQtPkFwQ2ZnLkJzc2lkTnVtLCBwQWQtPlBlcm1hbmVudEFkZHJlc3MpOwotI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KLQotCQkvLwotCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotCS8vCi0JQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0KLQkvLyA4MDUxIGZpcm13YXJlIHJlcXVpcmUgdGhlIHNpZ25hbCBkdXJpbmcgYm9vdGluZyB0aW1lLgotCS8vMjAwOC8xMS8yODpLSCBtYXJrZWQgdGhlIGZvbGxvd2luZyBjb2RlcyB0byBwYXRjaCBGcmVxdWVuY3kgb2Zmc2V0IGJ1ZwotCS8vQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDcyLCAweEZGLCAweDAwLCAweDAwKTsKLQotCWlmIChwQWQgJiYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSkKLQl7Ci0JCS8vCi0JCS8vIFVuZG8gZXZlcnl0aGluZyBpZiBpdCBmYWlsZWQKLQkJLy8KLQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQkJewotLy8JCQlOZGlzTURlcmVnaXN0ZXJJbnRlcnJ1cHQoJnBBZC0+SW50ZXJydXB0KTsKLQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSk7Ci0JCX0KLS8vCQlSVE1QRnJlZUFkYXB0ZXIocEFkKTsgLy8gd2Ugd2lsbCBmcmVlIGl0IGluIGRpc2Nvbm5lY3QoKQotCX0KLQllbHNlIGlmIChwQWQpCi0JewotCQkvLyBNaWNyb3NvZnQgSENUIHJlcXVpcmUgZHJpdmVyIHNlbmQgYSBkaXNjb25uZWN0IGV2ZW50IGFmdGVyIGRyaXZlciBpbml0aWFsaXphdGlvbi4KLQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKLS8vCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOwotCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UpOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQiFcbiIpKTsKLQotCi0JfS8vIGVuZCBvZiBlbHNlCi0KLQotCS8vIFNldCB1cCB0aGUgTWFjIGFkZHJlc3MKLQlSdG1wT1NOZXREZXZBZGRyU2V0KHBBZC0+bmV0X2RldiwgJnBBZC0+Q3VycmVudEFkZHJlc3NbMF0pOwotCi0JLy8gVmFyaW91cyBBUCBmdW5jdGlvbiBpbml0Ci0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50IGZvciBpbmZyb21pbmcgaW50ZXJmYWNlIHVwLgotCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZDVVNUT00sIFJUX0lOVEVSRkFDRV9VUCwgTlVMTCwgTlVMTCwgMCk7Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCi0JREJHUFJJTlRfUyhTdGF0dXMsICgiPD09PT0gcnQyOHh4X2luaXQsIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLQotCi1lcnI0OgotZXJyMzoKLQlNbG1lSGFsdChwQWQpOwotZXJyMjoKLQlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KHBBZCk7Ci1lcnIxOgotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0Jb3NfZnJlZV9tZW0ocEFkLCBwQWQtPm1wZHVfYmxrX3Bvb2wubWVtKTsgLy8gZnJlZSBCQSBwb29sCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkvLyBzaGFsbCBub3Qgc2V0IHByaXYgdG8gTlVMTCBoZXJlIGJlY2F1c2UgdGhlIHByaXYgZGlkbid0IGJlZW4gZnJlZSB5ZXQuCi0JLy9uZXRfZGV2LT5wcml2ID0gMDsKLSNpZmRlZiBJTkZfQU1BWk9OX1NFCi1lcnIwOgotI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KLSNpZmRlZiBTVAotZXJyMDoKLSNlbmRpZiAvLyBTVCAvLwotCi0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiISEhIHJ0Mjh4eCBJbml0aWFsaXplZCBmYWlsICEhIVxuIikpOwotCXJldHVybiBGQUxTRTsKLX0KLS8vLS0tQWRkIGJ5IHNoaWFuZywgbW92ZSBmcm9tIG9zL2xpbnV4L3J0X21haW5fZGV2LmMKLQotCi1zdGF0aWMgSU5UIFJ0bXBDaGlwT3BzUmVnaXN0ZXIoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gSU5UCQkJaW5mVHlwZSkKLXsKLQlSVE1QX0NISVBfT1AJKnBDaGlwT3BzID0gJnBBZC0+Y2hpcE9wczsKLQlpbnQgc3RhdHVzOwotCi0JbWVtc2V0KHBDaGlwT3BzLCAwLCBzaXplb2YoUlRNUF9DSElQX09QKSk7Ci0KLQkvKiBzZXQgZWVwcm9tIHJlbGF0ZWQgaG9vayBmdW5jdGlvbnMgKi8KLQlzdGF0dXMgPSBSdG1wQ2hpcE9wc0VlcHJvbUhvb2socEFkLCBpbmZUeXBlKTsKLQotCS8qIHNldCBtY3UgcmVsYXRlZCBob29rIGZ1bmN0aW9ucyAqLwotCXN3aXRjaChpbmZUeXBlKQotCXsKLSNpZmRlZiBSVE1QX1BDSV9TVVBQT1JUCi0JCWNhc2UgUlRNUF9ERVZfSU5GX1BDSToKLQkJCXBDaGlwT3BzLT5sb2FkRmlybXdhcmUgPSBSdG1wQXNpY0xvYWRGaXJtd2FyZTsKLQkJCXBDaGlwT3BzLT5lcmFzZUZpcm13YXJlID0gUnRtcEFzaWNFcmFzZUZpcm13YXJlOwotCQkJcENoaXBPcHMtPnNlbmRDb21tYW5kVG9NY3UgPSBSdG1wQXNpY1NlbmRDb21tYW5kVG9NY3U7Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBSVE1QX1BDSV9TVVBQT1JUIC8vCi0KLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotCi1JTlQgUnRtcFJhRGV2Q3RybEluaXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUlRNUF9JTkZfVFlQRSBpbmZUeXBlKQotewotCS8vVk9JRAkqaGFuZGxlOwotCi0JLy8gQXNzaWduIHRoZSBpbnRlcmZhY2UgdHlwZS4gV2UgbmVlZCB1c2UgaXQgd2hlbiBkbyByZWdpc3Rlci9FRVBST00gYWNjZXNzLgotCXBBZC0+aW5mVHlwZSA9IGluZlR5cGU7Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCXBBZC0+T3BNb2RlID0gT1BNT0RFX1NUQTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTVEEgRHJpdmVyIHZlcnNpb24tJXNcbiIsIFNUQV9EUklWRVJfVkVSU0lPTikpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQotCVJ0bXBDaGlwT3BzUmVnaXN0ZXIocEFkLCBpbmZUeXBlKTsKLQotI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAotewotCWV4dGVybiBCT09MRUFOIFJUTVBfQ2FyZEluZm9SZWFkKFBSVE1QX0FEQVBURVIgcEFkKTsKLQotCS8vIGZpbmQgaXRzIHByb2ZpbGUgcGF0aAotCXBBZC0+TUNfUm93SUQgPSAtMTsgLy8gdXNlIGRlZmF1bHQgcHJvZmlsZSBwYXRoCi0JUlRNUF9DYXJkSW5mb1JlYWQocEFkKTsKLQotCWlmIChwQWQtPk1DX1Jvd0lEID09IC0xKQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlzdHJjcHkocEFkLT5NQ19GaWxlTmFtZSwgU1RBX1BST0ZJTEVfUEFUSCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNQz4gUk9XID0gJWQsIFBBVEggPSAlc1xuIiwgcEFkLT5NQ19Sb3dJRCwgcEFkLT5NQ19GaWxlTmFtZSkpOwotfQotI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotQk9PTEVBTiBSdG1wUmFEZXZDdHJsRXhpdChJTiBSVE1QX0FEQVBURVIgKnBBZCkKLXsKLSNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKLWV4dGVybiBVSU5UOCAgTUNfQ2FyZFVzZWRbTUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEXTsKLQotCWlmICgocEFkLT5NQ19Sb3dJRCA+PSAwKSAmJiAocEFkLT5NQ19Sb3dJRCA8PSBNQVhfTlVNX09GX01VTFRJUExFX0NBUkQpKQotCQlNQ19DYXJkVXNlZFtwQWQtPk1DX1Jvd0lEXSA9IDA7IC8vIG5vdCBjbGVhciBNQUMgYWRkcmVzcwotI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLwotCi0KLQlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8vIG5vdCB5ZXQgc3VwcG9ydCBNQlNTCi1QTkVUX0RFViBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKLXsKLQlQTkVUX0RFViBkZXZfcCA9IE5VTEw7Ci0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCWRldl9wID0gcEFkLT5uZXRfZGV2OwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCUFTU0VSVChkZXZfcCk7Ci0JcmV0dXJuIGRldl9wOyAvKiByZXR1cm4gb25lIG9mIE1CU1MgKi8KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL3J0bXBfbWN1LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9ydG1wX21jdS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2Y3ODVhOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9ydG1wX21jdS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYwICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JcnRtcF9tY3UuYwotCi0JQWJzdHJhY3Q6Ci0JTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotI2luY2x1ZGUgIi4uL2Zpcm13YXJlLmgiCi0KLS8vI2RlZmluZSBCSU5fSU5fRklMRSAvKiB1c2UgKi5iaW4gZmlybXdhcmUgKi8KLQotCi0vLyBOZXcgOGsgYnl0ZSBmaXJtd2FyZSBzaXplIGZvciBSVDMwNzEvUlQzMDcyCi0jZGVmaW5lIEZJUk1XQVJFSU1BR0VfTUFYX0xFTkdUSAkweDIwMDAKLSNkZWZpbmUgRklSTVdBUkVJTUFHRV9MRU5HVEgJCQkoc2l6ZW9mIChGaXJtd2FyZUltYWdlKSAvIHNpemVvZihVQ0hBUikpCi0jZGVmaW5lIEZJUk1XQVJFX01BSk9SX1ZFUlNJT04JCTAKLQotI2RlZmluZSBGSVJNV0FSRUlNQUdFVjFfTEVOR1RICQkweDEwMDAKLSNkZWZpbmUgRklSTVdBUkVJTUFHRVYyX0xFTkdUSAkJMHgxMDAwCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSNkZWZpbmUgRklSTVdBUkVfTUlOT1JfVkVSU0lPTgkJMgotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi1jb25zdCB1bnNpZ25lZCBzaG9ydCBjY2l0dF8xNlRhYmxlW10gPSB7Ci0JMHgwMDAwLCAweDEwMjEsIDB4MjA0MiwgMHgzMDYzLCAweDQwODQsIDB4NTBBNSwgMHg2MEM2LCAweDcwRTcsCi0JMHg4MTA4LCAweDkxMjksIDB4QTE0QSwgMHhCMTZCLCAweEMxOEMsIDB4RDFBRCwgMHhFMUNFLCAweEYxRUYsCi0JMHgxMjMxLCAweDAyMTAsIDB4MzI3MywgMHgyMjUyLCAweDUyQjUsIDB4NDI5NCwgMHg3MkY3LCAweDYyRDYsCi0JMHg5MzM5LCAweDgzMTgsIDB4QjM3QiwgMHhBMzVBLCAweEQzQkQsIDB4QzM5QywgMHhGM0ZGLCAweEUzREUsCi0JMHgyNDYyLCAweDM0NDMsIDB4MDQyMCwgMHgxNDAxLCAweDY0RTYsIDB4NzRDNywgMHg0NEE0LCAweDU0ODUsCi0JMHhBNTZBLCAweEI1NEIsIDB4ODUyOCwgMHg5NTA5LCAweEU1RUUsIDB4RjVDRiwgMHhDNUFDLCAweEQ1OEQsCi0JMHgzNjUzLCAweDI2NzIsIDB4MTYxMSwgMHgwNjMwLCAweDc2RDcsIDB4NjZGNiwgMHg1Njk1LCAweDQ2QjQsCi0JMHhCNzVCLCAweEE3N0EsIDB4OTcxOSwgMHg4NzM4LCAweEY3REYsIDB4RTdGRSwgMHhENzlELCAweEM3QkMsCi0JMHg0OEM0LCAweDU4RTUsIDB4Njg4NiwgMHg3OEE3LCAweDA4NDAsIDB4MTg2MSwgMHgyODAyLCAweDM4MjMsCi0JMHhDOUNDLCAweEQ5RUQsIDB4RTk4RSwgMHhGOUFGLCAweDg5NDgsIDB4OTk2OSwgMHhBOTBBLCAweEI5MkIsCi0JMHg1QUY1LCAweDRBRDQsIDB4N0FCNywgMHg2QTk2LCAweDFBNzEsIDB4MEE1MCwgMHgzQTMzLCAweDJBMTIsCi0JMHhEQkZELCAweENCREMsIDB4RkJCRiwgMHhFQjlFLCAweDlCNzksIDB4OEI1OCwgMHhCQjNCLCAweEFCMUEsCi0JMHg2Q0E2LCAweDdDODcsIDB4NENFNCwgMHg1Q0M1LCAweDJDMjIsIDB4M0MwMywgMHgwQzYwLCAweDFDNDEsCi0JMHhFREFFLCAweEZEOEYsIDB4Q0RFQywgMHhERENELCAweEFEMkEsIDB4QkQwQiwgMHg4RDY4LCAweDlENDksCi0JMHg3RTk3LCAweDZFQjYsIDB4NUVENSwgMHg0RUY0LCAweDNFMTMsIDB4MkUzMiwgMHgxRTUxLCAweDBFNzAsCi0JMHhGRjlGLCAweEVGQkUsIDB4REZERCwgMHhDRkZDLCAweEJGMUIsIDB4QUYzQSwgMHg5RjU5LCAweDhGNzgsCi0JMHg5MTg4LCAweDgxQTksIDB4QjFDQSwgMHhBMUVCLCAweEQxMEMsIDB4QzEyRCwgMHhGMTRFLCAweEUxNkYsCi0JMHgxMDgwLCAweDAwQTEsIDB4MzBDMiwgMHgyMEUzLCAweDUwMDQsIDB4NDAyNSwgMHg3MDQ2LCAweDYwNjcsCi0JMHg4M0I5LCAweDkzOTgsIDB4QTNGQiwgMHhCM0RBLCAweEMzM0QsIDB4RDMxQywgMHhFMzdGLCAweEYzNUUsCi0JMHgwMkIxLCAweDEyOTAsIDB4MjJGMywgMHgzMkQyLCAweDQyMzUsIDB4NTIxNCwgMHg2Mjc3LCAweDcyNTYsCi0JMHhCNUVBLCAweEE1Q0IsIDB4OTVBOCwgMHg4NTg5LCAweEY1NkUsIDB4RTU0RiwgMHhENTJDLCAweEM1MEQsCi0JMHgzNEUyLCAweDI0QzMsIDB4MTRBMCwgMHgwNDgxLCAweDc0NjYsIDB4NjQ0NywgMHg1NDI0LCAweDQ0MDUsCi0JMHhBN0RCLCAweEI3RkEsIDB4ODc5OSwgMHg5N0I4LCAweEU3NUYsIDB4Rjc3RSwgMHhDNzFELCAweEQ3M0MsCi0JMHgyNkQzLCAweDM2RjIsIDB4MDY5MSwgMHgxNkIwLCAweDY2NTcsIDB4NzY3NiwgMHg0NjE1LCAweDU2MzQsCi0JMHhEOTRDLCAweEM5NkQsIDB4RjkwRSwgMHhFOTJGLCAweDk5QzgsIDB4ODlFOSwgMHhCOThBLCAweEE5QUIsCi0JMHg1ODQ0LCAweDQ4NjUsIDB4NzgwNiwgMHg2ODI3LCAweDE4QzAsIDB4MDhFMSwgMHgzODgyLCAweDI4QTMsCi0JMHhDQjdELCAweERCNUMsIDB4RUIzRiwgMHhGQjFFLCAweDhCRjksIDB4OUJEOCwgMHhBQkJCLCAweEJCOUEsCi0JMHg0QTc1LCAweDVBNTQsIDB4NkEzNywgMHg3QTE2LCAweDBBRjEsIDB4MUFEMCwgMHgyQUIzLCAweDNBOTIsCi0JMHhGRDJFLCAweEVEMEYsIDB4REQ2QywgMHhDRDRELCAweEJEQUEsIDB4QUQ4QiwgMHg5REU4LCAweDhEQzksCi0JMHg3QzI2LCAweDZDMDcsIDB4NUM2NCwgMHg0QzQ1LCAweDNDQTIsIDB4MkM4MywgMHgxQ0UwLCAweDBDQzEsCi0JMHhFRjFGLCAweEZGM0UsIDB4Q0Y1RCwgMHhERjdDLCAweEFGOUIsIDB4QkZCQSwgMHg4RkQ5LCAweDlGRjgsCi0JMHg2RTE3LCAweDdFMzYsIDB4NEU1NSwgMHg1RTc0LCAweDJFOTMsIDB4M0VCMiwgMHgwRUQxLCAweDFFRjAKLX07Ci0jZGVmaW5lIEJ5dGVDUkMxNih2LCBjcmMpIFwKLQkodW5zaWduZWQgc2hvcnQpKChjcmMgPDwgOCkgXiAgY2NpdHRfMTZUYWJsZVsoKGNyYyA+PiA4KSBeICh2KSkgJiAyNTVdKQotCi11bnNpZ25lZCBjaGFyIEJpdFJldmVyc2UodW5zaWduZWQgY2hhciB4KQotewotCWludCBpOwotCXVuc2lnbmVkIGNoYXIgVGVtcD0wOwotCWZvcihpPTA7IDsgaSsrKQotCXsKLQkJaWYoeCAmIDB4ODApCVRlbXAgfD0gMHg4MDsKLQkJaWYoaT09NykJCWJyZWFrOwotCQl4CTw8PSAxOwotCQlUZW1wID4+PSAxOwotCX0KLQlyZXR1cm4gVGVtcDsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJZXJhc2UgODA1MSBmaXJtd2FyZSBpbWFnZSBpbiBNQUMgQVNJQwotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBSdG1wQXNpY0VyYXNlRmlybXdhcmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUxPTkcgaTsKLQotCWZvcihpPTA7IGk8TUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkU7IGkrPTQpCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBpLCAwKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJTG9hZCA4MDUxIGZpcm13YXJlIGZpbGUgaW50byBNQUMgQVNJQwotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgZmlybXdhcmUgaW1hZ2UgbG9hZCBvawotCQlORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgaW1hZ2Ugbm90IGZvdW5kCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMgUnRtcEFzaWNMb2FkRmlybXdhcmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0jaWZkZWYgQklOX0lOX0ZJTEUKLSNkZWZpbmUgTklDTEZfREVGQVVMVF9VU0UoKQlcCi0JZmxnX2RlZmF1bHRfZmlybV91c2UgPSBUUlVFOyBcCi0JREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiVzIC0gVXNlIGRlZmF1bHQgZmlybXdhcmUhXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQotCU5ESVNfU1RBVFVTCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCVBVQ0hBUgkJCXNyYzsKLQlSVE1QX09TX0ZECQlzcmNmOwotCUlOVAkJCQlyZXR2YWwsIGk7Ci0JUFVDSEFSCQkJcEZpcm13YXJlSW1hZ2U7Ci0JSU5UCQkJCUZpbGVMZW5ndGggPSAwOwotCVVJTlQzMgkJCU1hY1JlZzsKLQlVTE9ORwkJCUluZGV4OwotCVVMT05HCQkJZmlybTsKLQlCT09MRUFOCQkJZmxnX2RlZmF1bHRfZmlybV91c2UgPSBGQUxTRTsKLQlSVE1QX09TX0ZTX0lORk8Jb3NGU0luZm87Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+ICVzXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQotCS8qIGluaXQgKi8KLQlwRmlybXdhcmVJbWFnZSA9IE5VTEw7Ci0Jc3JjID0gUlRNUF9GSVJNV0FSRV9GSUxFX05BTUU7Ci0KLQlSdG1wT1NGU0luZm9DaGFuZ2UoJm9zRlNJbmZvLCBUUlVFKTsKLQotCXBBZC0+RmlybXdhcmVWZXJzaW9uID0gKEZJUk1XQVJFX01BSk9SX1ZFUlNJT04gPDwgOCkgKyBcCi0JCQkJCQkgICBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OOwotCi0KLQkvKiBhbGxvY2F0ZSBmaXJtd2FyZSBidWZmZXIgKi8KLQlwRmlybXdhcmVJbWFnZSA9IGttYWxsb2MoTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKLQlpZiAocEZpcm13YXJlSW1hZ2UgPT0gTlVMTCkKLQl7Ci0JCS8qIGFsbG9jYXRlIGZhaWwsIHVzZSBkZWZhdWx0IGZpcm13YXJlIGFycmF5IGluIGZpcm13YXJlLmggKi8KLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgLSBBbGxvY2F0ZSBtZW1vcnkgZmFpbCFcbiIsIF9fRlVOQ1RJT05fXykpOwotCQlOSUNMRl9ERUZBVUxUX1VTRSgpOwotCX0KLQllbHNlCi0JewotCQkvKiBhbGxvY2F0ZSBvayEgemVybyB0aGUgZmlybXdhcmUgYnVmZmVyICovCi0JCW1lbXNldChwRmlybXdhcmVJbWFnZSwgMHgwMCwgTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUpOwotCX0gLyogRW5kIG9mIGlmICovCi0KLQotCS8qIGlmIG9rLCByZWFkIGZpcm13YXJlIGZpbGUgZnJvbSAqLmJpbiBmaWxlICovCi0JaWYgKGZsZ19kZWZhdWx0X2Zpcm1fdXNlID09IEZBTFNFKQotCXsKLQkJZG8KLQkJewotCQkJLyogb3BlbiB0aGUgYmluIGZpbGUgKi8KLQkJCXNyY2YgPSBSdG1wT1NGaWxlT3BlbihzcmMsIE9fUkRPTkxZLCAwKTsKLQotCQkJaWYgKElTX0ZJTEVfT1BFTl9FUlIoc3JjZikpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgLSBFcnJvciBvcGVuaW5nIGZpbGUgJXNcbiIsIF9fRlVOQ1RJT05fXywgc3JjKSk7Ci0JCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCi0JCQkvKiByZWFkIHRoZSBmaXJtd2FyZSBmcm9tIHRoZSBmaWxlICouYmluICovCi0JCQlGaWxlTGVuZ3RoID0gUnRtcE9TRmlsZVJlYWQoc3JjZiwgcEZpcm13YXJlSW1hZ2UsIE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFKTsKLQkJCWlmIChGaWxlTGVuZ3RoICE9IE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBlcnJvciBmaWxlIGxlbmd0aCAoPSVkKSBpbiBSVDI4NjBBUC5CSU5cbiIsCi0JCQkJCSAgIF9fRlVOQ1RJT05fXywgRmlsZUxlbmd0aCkpOwotCQkJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJUFVDSEFSIHB0ciA9IHBGaXJtd2FyZUltYWdlOwotCQkJCVVTSE9SVCBjcmMgPSAweGZmZmY7Ci0KLQotCQkJCS8qIGNhbGN1bGF0ZSBmaXJtd2FyZSBDUkMgKi8KLQkJCQlmb3IoaT0wOyBpPChNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0yKTsgaSsrLCBwdHIrKykKLQkJCQkJY3JjID0gQnl0ZUNSQzE2KEJpdFJldmVyc2UoKnB0ciksIGNyYyk7Ci0JCQkJLyogRW5kIG9mIGZvciAqLwotCi0JCQkJaWYgKChwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0yXSAhPSBcCi0JCQkJCQkJCShVQ0hBUilCaXRSZXZlcnNlKChVQ0hBUikoY3JjPj44KSkpIHx8Ci0JCQkJCShwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0xXSAhPSBcCi0JCQkJCQkJCShVQ0hBUilCaXRSZXZlcnNlKChVQ0hBUiljcmMpKSkKLQkJCQl7Ci0JCQkJCS8qIENSQyBmYWlsICovCi0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBDUkMgPSAweCUwMnggMHglMDJ4ICIKLQkJCQkJCSAgICJlcnJvciwgc2hvdWxkIGJlIDB4JTAyeCAweCUwMnhcbiIsCi0JCQkJCQkgICBfX0ZVTkNUSU9OX18sCi0JCQkJCQkgICBwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0yXSwKLQkJCQkJCSAgIHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTFdLAotCQkJCQkJICAgKFVDSEFSKShjcmM+PjgpLCAoVUNIQVIpKGNyYykpKTsKLQkJCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8qIGZpcm13YXJlIGlzIG9rICovCi0JCQkJCXBBZC0+RmlybXdhcmVWZXJzaW9uID0gXAotCQkJCQkJKHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTRdIDw8IDgpICsKLQkJCQkJCXBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTNdOwotCi0JCQkJCS8qIGNoZWNrIGlmIGZpcm13YXJlIHZlcnNpb24gb2YgdGhlIGZpbGUgaXMgdG9vIG9sZCAqLwotCQkJCQlpZiAoKHBBZC0+RmlybXdhcmVWZXJzaW9uKSA8IFwKLQkJCQkJCQkJCQkJKChGSVJNV0FSRV9NQUpPUl9WRVJTSU9OIDw8IDgpICsKLQkJCQkJCQkJCQkJIEZJUk1XQVJFX01JTk9SX1ZFUlNJT04pKQotCQkJCQl7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogZmlybXdhcmUgdmVyc2lvbiB0b28gb2xkIVxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCQkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gLyogRW5kIG9mIGlmICovCi0JCQkJfSAvKiBFbmQgb2YgaWYgKi8KLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAotCQkJCQkJICgiTklDTG9hZEZpcm13YXJlOiBDUkMgb2ssIHZlcj0lZC4lZFxuIiwKLQkJCQkJCSAgcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtNF0sCi0JCQkJCQkgIHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTNdKSk7Ci0JCQl9IC8qIEVuZCBvZiBpZiAoRmlsZUxlbmd0aCA9PSBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSkgKi8KLQkJCWJyZWFrOwotCQl9IHdoaWxlKFRSVUUpOwotCi0JCS8qIGNsb3NlIGZpcm13YXJlIGZpbGUgKi8KLQkJaWYgKElTX0ZJTEVfT1BFTl9FUlIoc3JjZikpCi0JCQk7Ci0JCWVsc2UKLQkJewotCQkJcmV0dmFsID0gUnRtcE9TRmlsZUNsb3NlKHNyY2YpOwotCQkJaWYgKHJldHZhbCkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IgJWQgY2xvc2luZyAlc1xuIiwgLXJldHZhbCwgc3JjKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qIHdyaXRlIGZpcm13YXJlIHRvIEFTSUMgKi8KLQlpZiAoZmxnX2RlZmF1bHRfZmlybV91c2UgPT0gVFJVRSkKLQl7Ci0JCS8qIHVzZSBkZWZhdWx0IGZpbWV3YXJlLCBmcmVlIGFsbG9jYXRlZCBidWZmZXIgKi8KLQkJaWYgKHBGaXJtd2FyZUltYWdlICE9IE5VTEwpCi0JCQlrZnJlZShwRmlybXdhcmVJbWFnZSk7Ci0JCS8qIEVuZCBvZiBpZiAqLwotCi0JCS8qIHVzZSBkZWZhdWx0ICouYmluIGFycmF5ICovCi0JCXBGaXJtd2FyZUltYWdlID0gRmlybXdhcmVJbWFnZTsKLQkJRmlsZUxlbmd0aCA9IHNpemVvZihGaXJtd2FyZUltYWdlKTsKLQl9IC8qIEVuZCBvZiBpZiAqLwotCi0JLyogZW5hYmxlIEhvc3QgcHJvZ3JhbSByYW0gd3JpdGUgc2VsZWN0aW9uICovCi0JUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCAweDEwMDAwKTsKLQotCWZvcihpPTA7IGk8RmlsZUxlbmd0aDsgaSs9NCkKLQl7Ci0JCWZpcm0gPSBwRmlybXdhcmVJbWFnZVtpXSArCi0JCQkgICAocEZpcm13YXJlSW1hZ2VbaSszXSA8PCAyNCkgKwotCQkJICAgKHBGaXJtd2FyZUltYWdlW2krMl0gPDwgMTYpICsKLQkJCSAgIChwRmlybXdhcmVJbWFnZVtpKzFdIDw8IDgpOwotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBpLCBmaXJtKTsKLQl9IC8qIEVuZCBvZiBmb3IgKi8KLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHgwMDAwMCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCAweDAwMDAxKTsKLQotCS8qIGluaXRpYWxpemUgQkJQIFIvVyBhY2Nlc3MgYWdlbnQgKi8KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fQkJQX0FHRU5ULCAwKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIDApOwotCi0JaWYgKGZsZ19kZWZhdWx0X2Zpcm1fdXNlID09IEZBTFNFKQotCXsKLQkJLyogdXNlIGZpbGUgZmlybXdhcmUsIGZyZWUgYWxsb2NhdGVkIGJ1ZmZlciAqLwotCQlpZiAocEZpcm13YXJlSW1hZ2UgIT0gTlVMTCkKLQkJCWtmcmVlKHBGaXJtd2FyZUltYWdlKTsKLQkJLyogRW5kIG9mIGlmICovCi0JfSAvKiBFbmQgb2YgaWYgKi8KLQotCVJ0bXBPU0ZTSW5mb0NoYW5nZSgmb3NGU0luZm8sIEZBTFNFKTsKLSNlbHNlCi0KLQlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlQVUNIQVIJCQlwRmlybXdhcmVJbWFnZTsKLQlVTE9ORwkJCUZpbGVMZW5ndGgsIEluZGV4OwotCS8vVUxPTkcJCQlmaXJtOwotCVVJTlQzMgkJCU1hY1JlZyA9IDA7Ci0JVUlOVDMyCQkJVmVyc2lvbiA9IChwQWQtPk1BQ1ZlcnNpb24gPj4gMTYpOwotCi0JcEZpcm13YXJlSW1hZ2UgPSBGaXJtd2FyZUltYWdlOwotCUZpbGVMZW5ndGggPSBzaXplb2YoRmlybXdhcmVJbWFnZSk7Ci0KLQkvLyBOZXcgOGsgYnl0ZSBmaXJtd2FyZSBzaXplIGZvciBSVDMwNzEvUlQzMDcyCi0JLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJVc2IgQ2hpcFxuIikpOwotCWlmIChGSVJNV0FSRUlNQUdFX0xFTkdUSCA9PSBGSVJNV0FSRUlNQUdFX01BWF9MRU5HVEgpCi0JLy9UaGUgZmlybXdhcmUgaW1hZ2UgY29uc2lzdHMgb2YgdHdvIHBhcnRzLiBPbmUgaXMgdGhlIG9yaWdpYW5sIGFuZCB0aGUgb3RoZXIgaXMgdGhlIG5ldy4KLQkvL1VzZSBTZWNvbmQgUGFydAotCXsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJaWYgKChWZXJzaW9uID09IDB4Mjg2MCkgfHwgSVNfUlQzMDkwKHBBZCl8fElTX1JUMzM5MChwQWQpKQotCQl7Ci0JCQlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2U7Ci0JCQlGaWxlTGVuZ3RoID0gRklSTVdBUkVJTUFHRV9MRU5HVEg7Ci0JCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiS0g6IGJpbiBmaWxlIHNob3VsZCBiZSA4S0IuXG4iKSk7Ci0JCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0KLQlSVE1QX1dSSVRFX0ZJUk1XQVJFKHBBZCwgcEZpcm13YXJlSW1hZ2UsIEZpbGVMZW5ndGgpOwotCi0jZW5kaWYKLQotCS8qIGNoZWNrIGlmIE1DVSBpcyByZWFkeSAqLwotCUluZGV4ID0gMDsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBQQkZfU1lTX0NUUkwsICZNYWNSZWcpOwotCi0JCWlmIChNYWNSZWcgJiAweDgwKQotCQkJYnJlYWs7Ci0KLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQl9IHdoaWxlIChJbmRleCsrIDwgMTAwMCk7Ci0KLSAgICBpZiAoSW5kZXggPj0gMTAwMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk5JQ0xvYWRGaXJtd2FyZTogTUNVIGlzIG5vdCByZWFkeVxuXG5cbiIpKTsKLQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09ICVzIChzdGF0dXM9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIFN0YXR1cykpOwotCi0gICAgcmV0dXJuIFN0YXR1czsKLX0KLQotCi1JTlQgUnRtcEFzaWNTZW5kQ29tbWFuZFRvTWN1KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCQkgQ29tbWFuZCwKLQlJTiBVQ0hBUgkJIFRva2VuLAotCUlOIFVDSEFSCQkgQXJnMCwKLQlJTiBVQ0hBUgkJIEFyZzEpCi17Ci0JSE9TVF9DTURfQ1NSX1NUUlVDCUgyTUNtZDsKLQlIMk1fTUFJTEJPWF9TVFJVQwlIMk1NYWlsYm94OwotCVVMT05HCQkJCWkgPSAwOwotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2lmZGVmIFJBTElOS19BVEUKLQlzdGF0aWMgVUlOVDMyIGogPSAwOwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLSNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkvLyAzMDkwRiBwb3dlciBzb2x1dGlvbiAzIGhhcyBodyBsaW1pdGF0aW9uIHRoYXQgbmVlZHMgdG8gYmFuIGFsbCBtY3UgY29tbWFuZAotCS8vIHdoZW4gZmlybXdhcmUgaXMgaW4gcmFkaW8gc3RhdGUuICBGb3Igb3RoZXIgY2hpcCBkb2Vzbid0IGhhdmUgdGhpcyBsaW1pdGF0aW9uLgotCWlmICgoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKLQkJJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykKLQkJJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkKLQl7Ci0JCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWN1Q21kTG9jayk7Ci0JCWlmICgocEFkLT5icnQzMHh4QmFuTWN1Q21kID09IFRSVUUpCi0JCQkmJiAoQ29tbWFuZCAhPSBXQUtFX01DVV9DTUQpICYmIChDb21tYW5kICE9IFJGT0ZGX01DVV9DTUQpKQotCQl7Ci0JCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWN1Q21kTG9jayk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgQmFuIE1jdSBDbWQgJXggaW4gc2xlZXAgbW9kZVxuIiwgIENvbW1hbmQpKTsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCQllbHNlIGlmICgoQ29tbWFuZCA9PSBTTEVFUF9NQ1VfQ01EKQotCQkJfHwoQ29tbWFuZCA9PSBSRk9GRl9NQ1VfQ01EKSkKLQkJewotCQkJcEFkLT5icnQzMHh4QmFuTWN1Q21kID0gVFJVRTsKLQkJfQotCQllbHNlIGlmIChDb21tYW5kICE9IFdBS0VfTUNVX0NNRCkKLQkJewotCQkJcEFkLT5icnQzMHh4QmFuTWN1Q21kID0gRkFMU0U7Ci0JCX0KLQotCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWN1Q21kTG9jayk7Ci0KLQl9Ci0JaWYgKCgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQotCQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQotCQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCi0JCSYmIChDb21tYW5kID09IFdBS0VfTUNVX0NNRCkpCi0JewotCi0JCWRvCi0JCXsKLQkJCVJUTVBfSU9fRk9SQ0VfUkVBRDMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCAmSDJNTWFpbGJveC53b3JkKTsKLQkJCWlmIChIMk1NYWlsYm94LmZpZWxkLk93bmVyID09IDApCi0JCQkJYnJlYWs7Ci0KLQkJCVJUTVB1c2VjRGVsYXkoMik7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19JTkZPLCAoIkFzaWNTZW5kQ29tbWFuVG9NY3U6Ok1haWwgYm94IGlzIGJ1c3lcbiIpKTsKLQkJfSB3aGlsZShpKysgPCAxMDApOwotCi0JCWlmIChpID49IDEwMCkKLQkJewotCQkJREJHUFJJTlRfRVJSKCgiSDJNX01BSUxCT1ggc3RpbGwgaG9sZCBieSBNQ1UuIGNvbW1hbmQgZmFpbFxuIikpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0KLQkJSDJNTWFpbGJveC5maWVsZC5Pd25lcgkgID0gMTsJICAgLy8gcGFzcyBvd25lcnNoaXAgdG8gTUNVCi0JCUgyTU1haWxib3guZmllbGQuQ21kVG9rZW4gPSBUb2tlbjsKLQkJSDJNTWFpbGJveC5maWVsZC5IaWdoQnl0ZSA9IEFyZzE7Ci0JCUgyTU1haWxib3guZmllbGQuTG93Qnl0ZSAgPSBBcmcwOwotCQlSVE1QX0lPX0ZPUkNFX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIEgyTU1haWxib3gud29yZCk7Ci0KLQkJSDJNQ21kLndvcmQJCQkgID0gMDsKLQkJSDJNQ21kLmZpZWxkLkhvc3RDb21tYW5kICA9IENvbW1hbmQ7Ci0JCVJUTVBfSU9fRk9SQ0VfV1JJVEUzMihwQWQsIEhPU1RfQ01EX0NTUiwgSDJNQ21kLndvcmQpOwotCi0KLQl9Ci0JZWxzZQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFBDSUVfUFNfU1VQUE9SVCAvLwotCXsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsICZIMk1NYWlsYm94LndvcmQpOwotCQlpZiAoSDJNTWFpbGJveC5maWVsZC5Pd25lciA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJUlRNUHVzZWNEZWxheSgyKTsKLQl9IHdoaWxlKGkrKyA8IDEwMCk7Ci0KLQlpZiAoaSA+PSAxMDApCi0JewotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2lmZGVmIFJBTElOS19BVEUKLQkJaWYgKHBBZC0+YXRlLmJGV0xvYWRpbmcgPT0gVFJVRSkKLQkJewotCQkJLyogcmVsb2FkaW5nIGZpcm13YXJlIHdoZW4gcmVjZWl2ZWQgaXdwcml2IGNtZCAiQVRFPUFURVNUT1AiICovCi0JCQlpZiAoaiA+IDApCi0JCQl7Ci0JCQkJaWYgKGogJSA2NCAhPSAwKQotCQkJCXsKLQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiIyIpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiXG4iKSk7Ci0JCQkJfQotCQkJCSsrajsKLQkJCX0KLQkJCWVsc2UgaWYgKGogPT0gMCkKLQkJCXsKLQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJMb2FkaW5nIGZpcm13YXJlLiBQbGVhc2Ugd2FpdCBmb3IgYSBtb21lbnQuLi5cbiIpKTsKLQkJCQkrK2o7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJewotCQlEQkdQUklOVF9FUlIoKCJIMk1fTUFJTEJPWCBzdGlsbCBob2xkIGJ5IE1DVS4gY29tbWFuZCBmYWlsXG4iKSk7Ci0JCX0KLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2lmZGVmIFJBTElOS19BVEUKLQllbHNlIGlmIChwQWQtPmF0ZS5iRldMb2FkaW5nID09IFRSVUUpCi0JewotCQkvKiByZWxvYWRpbmcgb2YgZmlybXdhcmUgaXMgY29tcGxldGVkICovCi0JCXBBZC0+YXRlLmJGV0xvYWRpbmcgPSBGQUxTRTsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiXG4iKSk7Ci0JCWogPSAwOwotCX0KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQlIMk1NYWlsYm94LmZpZWxkLk93bmVyCSAgPSAxOwkgICAvLyBwYXNzIG93bmVyc2hpcCB0byBNQ1UKLQlIMk1NYWlsYm94LmZpZWxkLkNtZFRva2VuID0gVG9rZW47Ci0JSDJNTWFpbGJveC5maWVsZC5IaWdoQnl0ZSA9IEFyZzE7Ci0JSDJNTWFpbGJveC5maWVsZC5Mb3dCeXRlICA9IEFyZzA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCBIMk1NYWlsYm94LndvcmQpOwotCi0JSDJNQ21kLndvcmQJCQkgID0gMDsKLQlIMk1DbWQuZmllbGQuSG9zdENvbW1hbmQgID0gQ29tbWFuZDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIT1NUX0NNRF9DU1IsIEgyTUNtZC53b3JkKTsKLQotCWlmIChDb21tYW5kICE9IDB4ODApCi0JewotCX0KLX0KLSNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkvLyAzMDkwIE1DVSBXYWtldXAgY29tbWFuZCBuZWVkcyBtb3JlIHRpbWUgdG8gYmUgc3RhYmxlLgotCS8vIEJlZm9yZSBzdGFibGUsIGRvbid0IGlzc3VlIG90aGVyIE1DVSBjb21tYW5kIHRvIHByZXZlbnQgZnJvbSBmaXJtd2FyZSBlcnJvci4KLQlpZiAoKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpCi0JCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCi0JCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkKLQkJJiYgKENvbW1hbmQgPT0gV0FLRV9NQ1VfQ01EKSkKLQl7Ci0JCVJUTVB1c2VjRGVsYXkoMjAwMCk7Ci0JCS8vUHV0IHRoaXMgaXMgYWZ0ZXIgUkYgcHJvZ3JhbW1pbmcuCi0JCS8vTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NY3VDbWRMb2NrKTsKLQkJLy9wQWQtPmJydDMweHhCYW5NY3VDbWQgPSBGQUxTRTsKLQkJLy9OZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1jdUNtZExvY2spOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBQQ0lFX1BTX1NVUFBPUlQgLy8KLQotCXJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vcnRtcF90aW1lci5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vcnRtcF90aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjUzZTg3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL3J0bXBfdGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIHJ0bXBfdGltZXIuYwotCi0gICAgQWJzdHJhY3Q6Ci0gICAgdGFzayBmb3IgdGltZXIgaGFuZGxpbmcKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIE5hbWUgICAgICAgICAgRGF0ZSAgICAgICAgICAgIE1vZGlmaWNhdGlvbiBsb2dzCi0gICAgU2hpYW5nIFR1CTA4LTI4LTIwMDggICBpbml0IHZlcnNpb24KLQotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKE1sbWVQZXJpb2RpY0V4ZWMpOwotLy9CVUlMRF9USU1FUl9GVU5DVElPTihNbG1lUnNzaVJlcG9ydEV4ZWMpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oQXNpY1J4QW50RXZhbFRpbWVvdXQpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oQVBTRFBlcmlvZGljRXhlYyk7Ci1CVUlMRF9USU1FUl9GVU5DVElPTihBc2ljUmZUdW5pbmdFeGVjKTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1CVUlMRF9USU1FUl9GVU5DVElPTihCZWFjb25UaW1lb3V0KTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKEFzc29jVGltZW91dCk7Ci1CVUlMRF9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCk7Ci1CVUlMRF9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oTGlua0Rvd25FeGVjKTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MpOwotI2lmZGVmIFJUTVBfTUFDX1BDSQotQlVJTERfVElNRVJfRlVOQ1RJT04oUHNQb2xsV2FrZUV4ZWMpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oUmFkaW9PbkV4ZWMpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotQlVJTERfVElNRVJfRlVOQ1RJT04oRGxzVGltZW91dEFjdGlvbik7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQotI2lmIGRlZmluZWQoQVBfTEVEKSB8fCBkZWZpbmVkKFNUQV9MRUQpCi1leHRlcm4gdm9pZCBMZWRDdHJsTWFpbigKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oTGVkQ3RybE1haW4pOwotI2VuZGlmCi0KLQotI2lmZGVmIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUCi1zdGF0aWMgdm9pZCBSdG1wVGltZXJRSGFuZGxlKFJUTVBfQURBUFRFUiAqcEFkKQotewotI2lmbmRlZiBLVEhSRUFEX1NVUFBPUlQKLQlpbnQgc3RhdHVzOwotI2VuZGlmCi0JUkFMSU5LX1RJTUVSX1NUUlVDVAkqcFRpbWVyOwotCVJUTVBfVElNRVJfVEFTS19FTlRSWQkqcEVudHJ5OwotCXVuc2lnbmVkIGxvbmcJaXJxRmxhZzsKLQlSVE1QX09TX1RBU0sgKnBUYXNrOwotCi0KLQlwVGFzayA9ICZwQWQtPnRpbWVyVGFzazsKLQl3aGlsZSghcFRhc2stPnRhc2tfa2lsbGVkKQotCXsKLQkJcFRpbWVyID0gTlVMTDsKLQotI2lmZGVmIEtUSFJFQURfU1VQUE9SVAotCQlSVE1QX1dBSVRfRVZFTlRfSU5URVJSVVBUSUJMRShwQWQsIHBUYXNrKTsKLSNlbHNlCi0JCVJUTVBfU0VNX0VWRU5UX1dBSVQoJihwVGFzay0+dGFza1NlbWEpLCBzdGF0dXMpOwotI2VuZGlmCi0KLQkJaWYgKHBBZC0+VGltZXJRLnN0YXR1cyA9PSBSVE1QX1RBU0tfU1RBVF9TVE9QRUQpCi0JCQlicmVhazsKLQotCQkvLyBldmVudCBoYXBwZW5lZC4KLQkJd2hpbGUocEFkLT5UaW1lclEucFFIZWFkKQotCQl7Ci0JCQlSVE1QX0lOVF9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWcpOwotCQkJcEVudHJ5ID0gcEFkLT5UaW1lclEucFFIZWFkOwotCQkJaWYgKHBFbnRyeSkKLQkJCXsKLQkJCQlwVGltZXIgPSBwRW50cnktPnBSYVRpbWVyOwotCi0JCQkJLy8gdXBkYXRlIHBRSGVhZAotCQkJCXBBZC0+VGltZXJRLnBRSGVhZCA9IHBFbnRyeS0+cE5leHQ7Ci0JCQkJaWYgKHBFbnRyeSA9PSBwQWQtPlRpbWVyUS5wUVRhaWwpCi0JCQkJCXBBZC0+VGltZXJRLnBRVGFpbCA9IE5VTEw7Ci0KLQkJCQkvLyByZXR1cm4gdGhpcyBxdWV1ZSBlbnRyeSB0byB0aW1lclFGcmVlTGlzdC4KLQkJCQlwRW50cnktPnBOZXh0ID0gcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3Q7Ci0JCQkJcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBwRW50cnk7Ci0JCQl9Ci0JCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZyk7Ci0KLQkJCWlmIChwVGltZXIpCi0JCQl7Ci0JCQkJaWYgKChwVGltZXItPmhhbmRsZSAhPSBOVUxMKSAmJiAoIXBBZC0+UE1fRmxnU3VzcGVuZCkpCi0JCQkJCXBUaW1lci0+aGFuZGxlKE5VTEwsIChQVk9JRCkgcFRpbWVyLT5jb29raWUsIE5VTEwsIHBUaW1lcik7Ci0JCQkJaWYgKChwVGltZXItPlJlcGVhdCkgJiYgKHBUaW1lci0+U3RhdGUgPT0gRkFMU0UpKQotCQkJCQlSVE1QX09TX0FkZF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgcFRpbWVyLT5UaW1lclZhbHVlKTsKLQkJCX0KLQkJfQotCi0jaWZuZGVmIEtUSFJFQURfU1VQUE9SVAotCQlpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJCXBBZC0+VGltZXJRLnN0YXR1cyA9IFJUTVBfVEFTS19TVEFUX1NUT1BFRDsKLQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOwotCQkJYnJlYWs7Ci0JCX0KLSNlbmRpZgotCX0KLX0KLQotCi1JTlQgUnRtcFRpbWVyUVRocmVhZCgKLQlJTiBPVVQgUFZPSUQgQ29udGV4dCkKLXsKLQlSVE1QX09TX1RBU0sJKnBUYXNrOwotCVBSVE1QX0FEQVBURVIJcEFkOwotCi0KLQlwVGFzayA9IChSVE1QX09TX1RBU0sgKilDb250ZXh0OwotCXBBZCA9IChQUlRNUF9BREFQVEVSKXBUYXNrLT5wcml2OwotCi0JUnRtcE9TVGFza0N1c3RvbWl6ZShwVGFzayk7Ci0KLQlSdG1wVGltZXJRSGFuZGxlKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoICI8LS0tJXNcbiIsX19GVU5DVElPTl9fKSk7Ci0jaWZuZGVmIEtUSFJFQURfU1VQUE9SVAotCXBUYXNrLT50YXNrUElEID0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOwotI2VuZGlmCi0JLyogbm90aWZ5IHRoZSBleGl0IHJvdXRpbmUgdGhhdCB3ZSdyZSBhY3R1YWxseSBleGl0aW5nIG5vdwotCSAqCi0JICogY29tcGxldGUoKS93YWl0X2Zvcl9jb21wbGV0aW9uKCkgaXMgc2ltaWxhciB0byB1cCgpL2Rvd24oKSwKLQkgKiBleGNlcHQgdGhhdCBjb21wbGV0ZSgpIGlzIHNhZmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHN0cnVjdHVyZQotCSAqIGlzIGdldHRpbmcgZGVsZXRlZCBpbiBhIHBhcmFsbGVsIG1vZGUgb2YgZXhlY3V0aW9uIChpLmUuIGp1c3QKLQkgKiBhZnRlciB0aGUgZG93bigpIC0tIHRoYXQncyBuZWNlc3NhcnkgZm9yIHRoZSB0aHJlYWQtc2h1dGRvd24KLQkgKiBjYXNlLgotCSAqCi0JICogY29tcGxldGVfYW5kX2V4aXQoKSBnb2VzIGV2ZW4gZnVydGhlciB0aGFuIHRoaXMgLS0gaXQgaXMgc2FmZSBpbgotCSAqIHRoZSBjYXNlIHRoYXQgdGhlIHRocmVhZCBvZiB0aGUgY2FsbGVyIGlzIGdvaW5nIGF3YXkgKG5vdCBqdXN0Ci0JICogdGhlIHN0cnVjdHVyZSkgLS0gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBtb2R1bGUtcmVtb3ZlIGNhc2UuCi0JICogVGhpcyBpcyBpbXBvcnRhbnQgaW4gcHJlZW1wdGlvbiBrZXJuZWxzLCB3aGljaCB0cmFuc2ZlciB0aGUgZmxvdwotCSAqIG9mIGV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGEgY29tcGxldGUoKS4KLQkgKi8KLQlSdG1wT1NUYXNrTm90aWZ5VG9FeGl0KHBUYXNrKTsKLQotCXJldHVybiAwOwotCi19Ci0KLQotUlRNUF9USU1FUl9UQVNLX0VOVFJZICpSdG1wVGltZXJRSW5zZXJ0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFJBTElOS19USU1FUl9TVFJVQ1QgKnBUaW1lcikKLXsKLQlSVE1QX1RJTUVSX1RBU0tfRU5UUlkgKnBRTm9kZSA9IE5VTEwsICpwUVRhaWw7Ci0JdW5zaWduZWQgbG9uZyBpcnFGbGFnczsKLQlSVE1QX09TX1RBU0sJKnBUYXNrID0gJnBBZC0+dGltZXJUYXNrOwotCi0JUlRNUF9JTlRfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7Ci0JaWYgKHBBZC0+VGltZXJRLnN0YXR1cyAmIFJUTVBfVEFTS19DQU5fRE9fSU5TRVJUKQotCXsKLQkJaWYocEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QpCi0JCXsKLQkJCXBRTm9kZSA9IHBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0OwotCQkJcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBwUU5vZGUtPnBOZXh0OwotCi0JCQlwUU5vZGUtPnBSYVRpbWVyID0gcFRpbWVyOwotCQkJcFFOb2RlLT5wTmV4dCA9IE5VTEw7Ci0KLQkJCXBRVGFpbCA9IHBBZC0+VGltZXJRLnBRVGFpbDsKLQkJCWlmIChwQWQtPlRpbWVyUS5wUVRhaWwgIT0gTlVMTCkKLQkJCQlwUVRhaWwtPnBOZXh0ID0gcFFOb2RlOwotCQkJcEFkLT5UaW1lclEucFFUYWlsID0gcFFOb2RlOwotCQkJaWYgKHBBZC0+VGltZXJRLnBRSGVhZCA9PSBOVUxMKQotCQkJCXBBZC0+VGltZXJRLnBRSGVhZCA9IHBRTm9kZTsKLQkJfQotCX0KLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOwotCi0JaWYgKHBRTm9kZSkKLQl7Ci0jaWZkZWYgS1RIUkVBRF9TVVBQT1JUCi0JCVdBS0VfVVAocFRhc2spOwotI2Vsc2UKLQkJUlRNUF9TRU1fRVZFTlRfVVAoJnBUYXNrLT50YXNrU2VtYSk7Ci0jZW5kaWYKLQl9Ci0KLQlyZXR1cm4gcFFOb2RlOwotfQotCi0KLUJPT0xFQU4gUnRtcFRpbWVyUVJlbW92ZSgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBSQUxJTktfVElNRVJfU1RSVUNUICpwVGltZXIpCi17Ci0JUlRNUF9USU1FUl9UQVNLX0VOVFJZICpwTm9kZSwgKnBQcmV2ID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGlycUZsYWdzOwotCi0JUlRNUF9JTlRfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7Ci0JaWYgKHBBZC0+VGltZXJRLnN0YXR1cyA+PSBSVE1QX1RBU0tfU1RBVF9JTklURUQpCi0JewotCQlwTm9kZSA9IHBBZC0+VGltZXJRLnBRSGVhZDsKLQkJd2hpbGUgKHBOb2RlKQotCQl7Ci0JCQlpZiAocE5vZGUtPnBSYVRpbWVyID09IHBUaW1lcikKLQkJCQlicmVhazsKLQkJCXBQcmV2ID0gcE5vZGU7Ci0JCQlwTm9kZSA9IHBOb2RlLT5wTmV4dDsKLQkJfQotCi0JCS8vIE5vdyBtb3ZlIGl0IHRvIGZyZWVMaXN0IHF1ZXVlLgotCQlpZiAocE5vZGUpCi0JCXsKLQkJCWlmIChwTm9kZSA9PSBwQWQtPlRpbWVyUS5wUUhlYWQpCi0JCQkJcEFkLT5UaW1lclEucFFIZWFkID0gcE5vZGUtPnBOZXh0OwotCQkJaWYgKHBOb2RlID09IHBBZC0+VGltZXJRLnBRVGFpbCkKLQkJCQlwQWQtPlRpbWVyUS5wUVRhaWwgPSBwUHJldjsKLQkJCWlmIChwUHJldiAhPSBOVUxMKQotCQkJCXBQcmV2LT5wTmV4dCA9IHBOb2RlLT5wTmV4dDsKLQotCQkJLy8gcmV0dXJuIHRoaXMgcXVldWUgZW50cnkgdG8gdGltZXJRRnJlZUxpc3QuCi0JCQlwTm9kZS0+cE5leHQgPSBwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdDsKLQkJCXBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0ID0gcE5vZGU7Ci0JCX0KLQl9Ci0JUlRNUF9JTlRfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLXZvaWQgUnRtcFRpbWVyUUV4aXQoUlRNUF9BREFQVEVSICpwQWQpCi17Ci0JUlRNUF9USU1FUl9UQVNLX0VOVFJZICpwVGltZXJROwotCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKLQl3aGlsZSAocEFkLT5UaW1lclEucFFIZWFkKQotCXsKLQkJcFRpbWVyUSA9IHBBZC0+VGltZXJRLnBRSGVhZDsKLQkJcEFkLT5UaW1lclEucFFIZWFkID0gcFRpbWVyUS0+cE5leHQ7Ci0JCS8vIHJlbW92ZSB0aGUgdGltZVEKLQl9Ci0JcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBOVUxMOwotCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5UaW1lclEucFRpbWVyUVBvbGwpOwotCXBBZC0+VGltZXJRLnBRVGFpbCA9IE5VTEw7Ci0JcEFkLT5UaW1lclEucFFIZWFkID0gTlVMTDsKLSNpZm5kZWYgS1RIUkVBRF9TVVBQT1JUCi0JcEFkLT5UaW1lclEuc3RhdHVzID0gUlRNUF9UQVNLX1NUQVRfU1RPUEVEOwotI2VuZGlmCi0JUlRNUF9JTlRfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKLQotfQotCi0KLXZvaWQgUnRtcFRpbWVyUUluaXQoUlRNUF9BREFQVEVSICpwQWQpCi17Ci0JaW50CWk7Ci0JUlRNUF9USU1FUl9UQVNLX0VOVFJZICpwUU5vZGUsICpwRW50cnk7Ci0JdW5zaWduZWQgbG9uZyBpcnFGbGFnczsKLQotCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPlRpbWVyUUxvY2spOwotCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+VGltZXJRLCBzaXplb2YocEFkLT5UaW1lclEpKTsKLQotCW9zX2FsbG9jX21lbShwQWQsICZwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCwgc2l6ZW9mKFJUTVBfVElNRVJfVEFTS19FTlRSWSkgKiBUSU1FUl9RVUVVRV9TSVpFX01BWCk7Ci0JaWYgKHBBZC0+VGltZXJRLnBUaW1lclFQb2xsKQotCXsKLQkJcEVudHJ5ID0gTlVMTDsKLQkJcFFOb2RlID0gKFJUTVBfVElNRVJfVEFTS19FTlRSWSAqKXBBZC0+VGltZXJRLnBUaW1lclFQb2xsOwotCQlOZGlzWmVyb01lbW9yeShwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCwgc2l6ZW9mKFJUTVBfVElNRVJfVEFTS19FTlRSWSkgKiBUSU1FUl9RVUVVRV9TSVpFX01BWCk7Ci0KLQkJUlRNUF9JTlRfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7Ci0JCWZvciAoaSA9IDAgO2kgPFRJTUVSX1FVRVVFX1NJWkVfTUFYOyBpKyspCi0JCXsKLQkJCXBRTm9kZS0+cE5leHQgPSBwRW50cnk7Ci0JCQlwRW50cnkgPSBwUU5vZGU7Ci0JCQlwUU5vZGUrKzsKLQkJfQotCQlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IHBFbnRyeTsKLQkJcEFkLT5UaW1lclEucFFIZWFkID0gTlVMTDsKLQkJcEFkLT5UaW1lclEucFFUYWlsID0gTlVMTDsKLQkJcEFkLT5UaW1lclEuc3RhdHVzID0gUlRNUF9UQVNLX1NUQVRfSU5JVEVEOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOwotCX0KLX0KLSNlbmRpZiAvLyBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vc3BlY3RydW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL3NwZWN0cnVtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZDIxMjUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vc3BlY3RydW0uYworKysgL2Rldi9udWxsCkBAIC0xLDIyMjEgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLQlhY3Rpb24uYwotCi0gICAgQWJzdHJhY3Q6Ci0gICAgSGFuZGxlIGFzc29jaWF0aW9uIHJlbGF0ZWQgcmVxdWVzdHMgZWl0aGVyIGZyb20gV1NUQSBvciBmcm9tIGxvY2FsIE1MTUUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlGb25jaGkgV3UgICAgMjAwOAkJICAgY3JlYXRlZCBmb3IgODAyLjExaAotICovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLSNpbmNsdWRlICIuLi9hY3Rpb24uaCIKLQotCi0vKiBUaGUgcmVndWxhdG9yeSBpbmZvcm1hdGlvbiBpbiB0aGUgVVNBIChVUykgKi8KLURPVDExX1JFR1VMQVRPUllfSU5GT1JNQVRJT04gVVNBUmVndWxhdG9yeUluZm9bXSA9Ci17Ci0vKiAgInJlZ3VsYXRvcnkgY2xhc3MiICAibnVtYmVyIG9mIGNoYW5uZWxzIiAgIk1heCBUeCBQd3IiICAiY2hhbm5lbCBsaXN0IiAqLwotICAgIHswLAkgICAgICAgICAgICAgICAgezAsICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICB7MH19fSwgLy8gSW52bGlkIGVudHJ5Ci0gICAgezEsICAgICAgICAgICAgICAgICB7NCwgICAgICAgICAgICAgICAgICAgMTYsICAgICAgICAgICB7MzYsIDQwLCA0NCwgNDh9fX0sCi0gICAgezIsICAgICAgICAgICAgICAgICB7NCwgICAgICAgICAgICAgICAgICAgMjMsICAgICAgICAgICB7NTIsIDU2LCA2MCwgNjR9fX0sCi0gICAgezMsICAgICAgICAgICAgICAgICB7NCwgICAgICAgICAgICAgICAgICAgMjksICAgICAgICAgICB7MTQ5LCAxNTMsIDE1NywgMTYxfX19LAotICAgIHs0LCAgICAgICAgICAgICAgICAgezExLCAgICAgICAgICAgICAgICAgIDIzLCAgICAgICAgICAgezEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfX19LAotICAgIHs1LCAgICAgICAgICAgICAgICAgezUsICAgICAgICAgICAgICAgICAgIDMwLCAgICAgICAgICAgezE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fX19LAotICAgIHs2LCAgICAgICAgICAgICAgICAgezEwLCAgICAgICAgICAgICAgICAgIDE0LCAgICAgICAgICAgezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfX19LAotICAgIHs3LCAgICAgICAgICAgICAgICAgezEwLCAgICAgICAgICAgICAgICAgIDI3LCAgICAgICAgICAgezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfX19LAotICAgIHs4LCAgICAgICAgICAgICAgICAgezUsICAgICAgICAgICAgICAgICAgIDE3LCAgICAgICAgICAgezExLCAxMywgMTUsIDE3LCAxOX19fSwKLSAgICB7OSwgICAgICAgICAgICAgICAgIHs1LCAgICAgICAgICAgICAgICAgICAzMCwgICAgICAgICAgIHsxMSwgMTMsIDE1LCAxNywgMTl9fX0sCi0gICAgezEwLCAgICAgICAgICAgICAgICB7MiwgICAgICAgICAgICAgICAgICAgMjAsICAgICAgICAgICB7MjEsIDI1fX19LAotICAgIHsxMSwgICAgICAgICAgICAgICAgezIsICAgICAgICAgICAgICAgICAgIDMzLCAgICAgICAgICAgIHsyMSwgMjV9fX0sCi0gICAgezEyLCAgICAgICAgICAgICAgICB7MTEsICAgICAgICAgICAgICAgICAgMzAsICAgICAgICAgICAgezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMX19fQotfTsKLSNkZWZpbmUgVVNBX1JFR1VMQVRPUllfSU5GT19TSVpFIChzaXplb2YoVVNBUmVndWxhdG9yeUluZm8pIC8gc2l6ZW9mKERPVDExX1JFR1VMQVRPUllfSU5GT1JNQVRJT04pKQotCi0KLS8qIFRoZSByZWd1bGF0b3J5IGluZm9ybWF0aW9uIGluIEV1cm9wZSAqLwotRE9UMTFfUkVHVUxBVE9SWV9JTkZPUk1BVElPTiBFdXJvcGVSZWd1bGF0b3J5SW5mb1tdID0KLXsKLS8qICAicmVndWxhdG9yeSBjbGFzcyIgICJudW1iZXIgb2YgY2hhbm5lbHMiICAiTWF4IFR4IFB3ciIgICJjaGFubmVsIGxpc3QiICovCi0gICAgezAsICAgICAgICAgICAgICAgICB7MCwgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIHswfX19LCAvLyBJbnZhbGlkIGVudHJ5Ci0gICAgezEsICAgICAgICAgICAgICAgICB7NCwgICAgICAgICAgICAgICAgICAgMjAsICAgICAgICAgICB7MzYsIDQwLCA0NCwgNDh9fX0sCi0gICAgezIsICAgICAgICAgICAgICAgICB7NCwgICAgICAgICAgICAgICAgICAgMjAsICAgICAgICAgICB7NTIsIDU2LCA2MCwgNjR9fX0sCi0gICAgezMsICAgICAgICAgICAgICAgICB7MTEsICAgICAgICAgICAgICAgICAgMzAsICAgICAgICAgICB7MTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9fX0sCi0gICAgezQsICAgICAgICAgICAgICAgICB7MTMsICAgICAgICAgICAgICAgICAgMjAsICAgICAgICAgICB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTN9fX0KLX07Ci0jZGVmaW5lIEVVX1JFR1VMQVRPUllfSU5GT19TSVpFIChzaXplb2YoRXVyb3BlUmVndWxhdG9yeUluZm8pIC8gc2l6ZW9mKERPVDExX1JFR1VMQVRPUllfSU5GT1JNQVRJT04pKQotCi0KLS8qIFRoZSByZWd1bGF0b3J5IGluZm9ybWF0aW9uIGluIEphcGFuICovCi1ET1QxMV9SRUdVTEFUT1JZX0lORk9STUFUSU9OIEphcGFuUmVndWxhdG9yeUluZm9bXSA9Ci17Ci0vKiAgInJlZ3VsYXRvcnkgY2xhc3MiICAibnVtYmVyIG9mIGNoYW5uZWxzIiAgIk1heCBUeCBQd3IiICAiY2hhbm5lbCBsaXN0IiAqLwotICAgIHswLCAgICAgICAgICAgICAgICAgezAsICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICB7MH19fSwgLy8gSW52YWxpZCBlbnRyeQotICAgIHsxLCAgICAgICAgICAgICAgICAgezQsICAgICAgICAgICAgICAgICAgIDIyLCAgICAgICAgICAgezM0LCAzOCwgNDIsIDQ2fX19LAotICAgIHsyLCAgICAgICAgICAgICAgICAgezMsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezgsIDEyLCAxNn19fSwKLSAgICB7MywgICAgICAgICAgICAgICAgIHszLCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHs4LCAxMiwgMTZ9fX0sCi0gICAgezQsICAgICAgICAgICAgICAgICB7MywgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7OCwgMTIsIDE2fX19LAotICAgIHs1LCAgICAgICAgICAgICAgICAgezMsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezgsIDEyLCAxNn19fSwKLSAgICB7NiwgICAgICAgICAgICAgICAgIHszLCAgICAgICAgICAgICAgICAgICAyMiwgICAgICAgICAgIHs4LCAxMiwgMTZ9fX0sCi0gICAgezcsICAgICAgICAgICAgICAgICB7NCwgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7MTg0LCAxODgsIDE5MiwgMTk2fX19LAotICAgIHs4LCAgICAgICAgICAgICAgICAgezQsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezE4NCwgMTg4LCAxOTIsIDE5Nn19fSwKLSAgICB7OSwgICAgICAgICAgICAgICAgIHs0LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHsxODQsIDE4OCwgMTkyLCAxOTZ9fX0sCi0gICAgezEwLCAgICAgICAgICAgICAgICB7NCwgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7MTg0LCAxODgsIDE5MiwgMTk2fX19LAotICAgIHsxMSwgICAgICAgICAgICAgICAgezQsICAgICAgICAgICAgICAgICAgIDIyLCAgICAgICAgICAgezE4NCwgMTg4LCAxOTIsIDE5Nn19fSwKLSAgICB7MTIsICAgICAgICAgICAgICAgIHs0LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHs3LCA4LCA5LCAxMX19fSwKLSAgICB7MTMsICAgICAgICAgICAgICAgIHs0LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHs3LCA4LCA5LCAxMX19fSwKLSAgICB7MTQsICAgICAgICAgICAgICAgIHs0LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHs3LCA4LCA5LCAxMX19fSwKLSAgICB7MTUsICAgICAgICAgICAgICAgIHs0LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHs3LCA4LCA5LCAxMX19fSwKLSAgICB7MTYsICAgICAgICAgICAgICAgIHs2LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHsxODMsIDE4NCwgMTg1LCAxODcsIDE4OCwgMTg5fX19LAotICAgIHsxNywgICAgICAgICAgICAgICAgezYsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezE4MywgMTg0LCAxODUsIDE4NywgMTg4LCAxODl9fX0sCi0gICAgezE4LCAgICAgICAgICAgICAgICB7NiwgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7MTgzLCAxODQsIDE4NSwgMTg3LCAxODgsIDE4OX19fSwKLSAgICB7MTksICAgICAgICAgICAgICAgIHs2LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHsxODMsIDE4NCwgMTg1LCAxODcsIDE4OCwgMTg5fX19LAotICAgIHsyMCwgICAgICAgICAgICAgICAgezYsICAgICAgICAgICAgICAgICAgIDE3LCAgICAgICAgICAgezE4MywgMTg0LCAxODUsIDE4NywgMTg4LCAxODl9fX0sCi0gICAgezIxLCAgICAgICAgICAgICAgICB7NiwgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7NiwgNywgOCwgOSwgMTAsIDExfX19LAotICAgIHsyMiwgICAgICAgICAgICAgICAgezYsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezYsIDcsIDgsIDksIDEwLCAxMX19fSwKLSAgICB7MjMsICAgICAgICAgICAgICAgIHs2LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHs2LCA3LCA4LCA5LCAxMCwgMTF9fX0sCi0gICAgezI0LCAgICAgICAgICAgICAgICB7NiwgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7NiwgNywgOCwgOSwgMTAsIDExfX19LAotICAgIHsyNSwgICAgICAgICAgICAgICAgezgsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezE4MiwgMTgzLCAxODQsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTg5fX19LAotICAgIHsyNiwgICAgICAgICAgICAgICAgezgsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezE4MiwgMTgzLCAxODQsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTg5fX19LAotICAgIHsyNywgICAgICAgICAgICAgICAgezgsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezE4MiwgMTgzLCAxODQsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTg5fX19LAotICAgIHsyOCwgICAgICAgICAgICAgICAgezgsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezE4MiwgMTgzLCAxODQsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTg5fX19LAotICAgIHsyOSwgICAgICAgICAgICAgICAgezgsICAgICAgICAgICAgICAgICAgIDE3LCAgICAgICAgICAgezE4MiwgMTgzLCAxODQsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTg5fX19LAotICAgIHszMCwgICAgICAgICAgICAgICAgezEzLCAgICAgICAgICAgICAgICAgIDIzLCAgICAgICAgICAgezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzfX19LAotICAgIHszMSwgICAgICAgICAgICAgICAgezEsICAgICAgICAgICAgICAgICAgIDIzLCAgICAgICAgICAgezE0fX19LAotICAgIHszMiwgICAgICAgICAgICAgICAgezQsICAgICAgICAgICAgICAgICAgIDIyLCAgICAgICAgICAgezUyLCA1NiwgNjAsIDY0fX19Ci19OwotI2RlZmluZSBKUF9SRUdVTEFUT1JZX0lORk9fU0laRSAoc2l6ZW9mKEphcGFuUmVndWxhdG9yeUluZm8pIC8gc2l6ZW9mKERPVDExX1JFR1VMQVRPUllfSU5GT1JNQVRJT04pKQotCi0KLUNIQVIgUlRNUF9HZXRUeFB3cigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBIVFRSQU5TTUlUX1NFVFRJTkcgSFRUeE1vZGUpCi17Ci10eXBlZGVmIHN0cnVjdCBfX1RYX1BXUl9DRkcKLXsKLQlVSU5UOCBNb2RlOwotCVVJTlQ4IE1DUzsKLQlVSU5UMTYgcmVxOwotCVVJTlQ4IHNoaWZ0OwotCVVJTlQzMiBCaXRNYXNrOwotfSBUWF9QV1JfQ0ZHOwotCi0JVUlOVDMyIFZhbHVlOwotCUlOVCBJZHg7Ci0JVUlOVDggUGh5TW9kZTsKLQlDSEFSIEN1clR4UHdyOwotCVVJTlQ4IFR4UHdyUmVmID0gMDsKLQlDSEFSIERhbHRhUHdyOwotCVVMT05HIFR4UHdyWzVdOwotCi0KLQlUWF9QV1JfQ0ZHIFR4UHdyQ2ZnW10gPSB7Ci0JCXtNT0RFX0NDSywgMCwgMCwgNCwgMHgwMDAwMDBmMH0sCi0JCXtNT0RFX0NDSywgMSwgMCwgMCwgMHgwMDAwMDAwZn0sCi0JCXtNT0RFX0NDSywgMiwgMCwgMTIsIDB4MDAwMGYwMDB9LAotCQl7TU9ERV9DQ0ssIDMsIDAsIDgsIDB4MDAwMDBmMDB9LAotCi0JCXtNT0RFX09GRE0sIDAsIDAsIDIwLCAweDAwZjAwMDAwfSwKLQkJe01PREVfT0ZETSwgMSwgMCwgMTYsIDB4MDAwZjAwMDB9LAotCQl7TU9ERV9PRkRNLCAyLCAwLCAyOCwgMHhmMDAwMDAwMH0sCi0JCXtNT0RFX09GRE0sIDMsIDAsIDI0LCAweDBmMDAwMDAwfSwKLQkJe01PREVfT0ZETSwgNCwgMSwgNCwgMHgwMDAwMDBmMH0sCi0JCXtNT0RFX09GRE0sIDUsIDEsIDAsIDB4MDAwMDAwMGZ9LAotCQl7TU9ERV9PRkRNLCA2LCAxLCAxMiwgMHgwMDAwZjAwMH0sCi0JCXtNT0RFX09GRE0sIDcsIDEsIDgsIDB4MDAwMDBmMDB9Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCSx7TU9ERV9IVE1JWCwgMCwgMSwgMjAsIDB4MDBmMDAwMDB9LAotCQl7TU9ERV9IVE1JWCwgMSwgMSwgMTYsIDB4MDAwZjAwMDB9LAotCQl7TU9ERV9IVE1JWCwgMiwgMSwgMjgsIDB4ZjAwMDAwMDB9LAotCQl7TU9ERV9IVE1JWCwgMywgMSwgMjQsIDB4MGYwMDAwMDB9LAotCQl7TU9ERV9IVE1JWCwgNCwgMiwgNCwgMHgwMDAwMDBmMH0sCi0JCXtNT0RFX0hUTUlYLCA1LCAyLCAwLCAweDAwMDAwMDBmfSwKLQkJe01PREVfSFRNSVgsIDYsIDIsIDEyLCAweDAwMDBmMDAwfSwKLQkJe01PREVfSFRNSVgsIDcsIDIsIDgsIDB4MDAwMDBmMDB9LAotCQl7TU9ERV9IVE1JWCwgOCwgMiwgMjAsIDB4MDBmMDAwMDB9LAotCQl7TU9ERV9IVE1JWCwgOSwgMiwgMTYsIDB4MDAwZjAwMDB9LAotCQl7TU9ERV9IVE1JWCwgMTAsIDIsIDI4LCAweGYwMDAwMDAwfSwKLQkJe01PREVfSFRNSVgsIDExLCAyLCAyNCwgMHgwZjAwMDAwMH0sCi0JCXtNT0RFX0hUTUlYLCAxMiwgMywgNCwgMHgwMDAwMDBmMH0sCi0JCXtNT0RFX0hUTUlYLCAxMywgMywgMCwgMHgwMDAwMDAwZn0sCi0JCXtNT0RFX0hUTUlYLCAxNCwgMywgMTIsIDB4MDAwMGYwMDB9LAotCQl7TU9ERV9IVE1JWCwgMTUsIDMsIDgsIDB4MDAwMDBmMDB9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JfTsKLSNkZWZpbmUgTUFYX1RYUFdSX1RBQl9TSVpFIChzaXplb2YoVHhQd3JDZmcpIC8gc2l6ZW9mKFRYX1BXUl9DRkcpKQotCi0jaWZkZWYgU0lOR0xFX1NLVQotCUN1clR4UHdyID0gcEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3I7Ci0jZWxzZQotCUN1clR4UHdyID0gMTk7Ci0jZW5kaWYKLQotCS8qIGNoZWNrIFR4IFBvd2VyIHNldHRpbmcgZnJvbSBVSS4gKi8KLQlpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5MCkKLQkJOwotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gNjApICAvKiByZWR1Y2UgUHdyIGZvciAxIGRCLiAqLwotCQlDdXJUeFB3ciAtPSAxOwotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMzApICAvKiByZWR1Y2UgUHdyIGZvciAzIGRCLiAqLwotCQlDdXJUeFB3ciAtPSAzOwotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMTUpICAvKiByZWR1Y2UgUHdyIGZvciA2IGRCLiAqLwotCQlDdXJUeFB3ciAtPSA2OwotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOSkgICAvKiByZWR1Y2UgUHdyIGZvciA5IGRCLiAqLwotCQlDdXJUeFB3ciAtPSA5OwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVkdWNlIFB3ciBmb3IgMTIgZEIuICovCi0JCUN1clR4UHdyIC09IDEyOwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKLQl7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IDE0KQotCQl7Ci0JCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFswXTsKLQkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzFdOwotCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMl07Ci0JCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFszXTsKLQkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzRdOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMF07Ci0JCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsxXTsKLQkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzJdOwotCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbM107Ci0JCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFs0XTsKLQkJfQotCX0KLQllbHNlCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQotCQl7Ci0JCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFswXTsKLQkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzFdOwotCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMl07Ci0JCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFszXTsKLQkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzRdOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMF07Ci0JCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsxXTsKLQkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzJdOwotCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbM107Ci0JCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFs0XTsKLQkJfQotCX0KLQotCi0Jc3dpdGNoKEhUVHhNb2RlLmZpZWxkLk1PREUpCi0JewotCQljYXNlIE1PREVfQ0NLOgotCQljYXNlIE1PREVfT0ZETToKLQkJCVZhbHVlID0gVHhQd3JbMV07Ci0JCQlUeFB3clJlZiA9IChWYWx1ZSAmIDB4MDAwMDBmMDApID4+IDg7Ci0KLQkJCWJyZWFrOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgTU9ERV9IVE1JWDoKLQkJY2FzZSBNT0RFX0hUR1JFRU5GSUVMRDoKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKQotCQkJewotCQkJCVZhbHVlID0gVHhQd3JbMl07Ci0JCQkJVHhQd3JSZWYgPSAoVmFsdWUgJiAweDAwMDAwZjAwKSA+PiA4OwotCQkJfQotCQkJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMikKLQkJCXsKLQkJCQlWYWx1ZSA9IFR4UHdyWzNdOwotCQkJCVR4UHdyUmVmID0gKFZhbHVlICYgMHgwMDAwMGYwMCkgPj4gODsKLQkJCX0KLQkJCWJyZWFrOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCX0KLQotCVBoeU1vZGUgPQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJCShIVFR4TW9kZS5maWVsZC5NT0RFID09IE1PREVfSFRHUkVFTkZJRUxEKQotCQkJCT8gTU9ERV9IVE1JWCA6Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkJSFRUeE1vZGUuZmllbGQuTU9ERTsKLQotCWZvciAoSWR4ID0gMDsgSWR4IDwgTUFYX1RYUFdSX1RBQl9TSVpFOyBJZHgrKykKLQl7Ci0JCWlmICgoVHhQd3JDZmdbSWR4XS5Nb2RlID09IFBoeU1vZGUpCi0JCQkmJiAoVHhQd3JDZmdbSWR4XS5NQ1MgPT0gSFRUeE1vZGUuZmllbGQuTUNTKSkKLQkJewotCQkJVmFsdWUgPSBUeFB3cltUeFB3ckNmZ1tJZHhdLnJlcV07Ci0JCQlEYWx0YVB3ciA9IFR4UHdyUmVmIC0gKENIQVIpKChWYWx1ZSAmIFR4UHdyQ2ZnW0lkeF0uQml0TWFzaykKLQkJCQkJCQkJCQkJPj4gVHhQd3JDZmdbSWR4XS5zaGlmdCk7Ci0JCQlDdXJUeFB3ciAtPSBEYWx0YVB3cjsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIEN1clR4UHdyOwotfQotCi0KLVZPSUQgTWVhc3VyZVJlcVRhYkluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKLQotCXBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiID0ga21hbGxvYyhzaXplb2YoTUVBU1VSRV9SRVFfVEFCKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKQotCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYiwgc2l6ZW9mKE1FQVNVUkVfUkVRX1RBQikpOwotCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiLlxuIiwgX19GVU5DVElPTl9fKSk7Ci0KLQlyZXR1cm47Ci19Ci0KLVZPSUQgTWVhc3VyZVJlcVRhYkV4aXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKQotCQlrZnJlZShwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYik7Ci0JcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIgPSBOVUxMOwotCi0JcmV0dXJuOwotfQotCi1QTUVBU1VSRV9SRVFfRU5UUlkgTWVhc3VyZVJlcUxvb2tVcCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQotewotCVVJTlQgSGFzaElkeDsKLQlQTUVBU1VSRV9SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKLQlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKLQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7Ci0KLQlpZiAocFRhYiA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOwotCi0JSGFzaElkeCA9IE1RX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOwotCXBFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07Ci0KLQl3aGlsZSAocEVudHJ5KQotCXsKLQkJaWYgKHBFbnRyeS0+RGlhbG9nVG9rZW4gPT0gRGlhbG9nVG9rZW4pCi0JCQlicmVhazsKLQkJZWxzZQotCQl7Ci0JCQlwUHJldkVudHJ5ID0gcEVudHJ5OwotCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKLQkJfQotCX0KLQotCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOwotCi0JcmV0dXJuIHBFbnRyeTsKLX0KLQotUE1FQVNVUkVfUkVRX0VOVFJZIE1lYXN1cmVSZXFJbnNlcnQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKLXsKLQlJTlQgaTsKLQlVTE9ORyBIYXNoSWR4OwotCVBNRUFTVVJFX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiOwotCVBNRUFTVVJFX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMLCBwQ3VyckVudHJ5OwotCVVMT05HIE5vdzsKLQotCWlmKHBUYWIgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXBFbnRyeSA9IE1lYXN1cmVSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7Ci0JaWYgKHBFbnRyeSA9PSBOVUxMKQotCXsKLQkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOwotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFOyBpKyspCi0JCXsKLQkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7Ci0JCQlwRW50cnkgPSAmcFRhYi0+Q29udGVudFtpXTsKLQotCQkJaWYgKChwRW50cnktPlZhbGlkID09IFRSVUUpCi0JCQkJJiYgUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdywgKHVuc2lnbmVkIGxvbmcpKHBFbnRyeS0+bGFzdFRpbWUgKyBNUV9SRVFfQUdFX09VVCkpKQotCQkJewotCQkJCVBNRUFTVVJFX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKLQkJCQlVTE9ORyBIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKLQkJCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOwotCi0JCQkJLy8gdXBkYXRlIEhhc2ggbGlzdAotCQkJCWRvCi0JCQkJewotCQkJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQotCQkJCQl7Ci0JCQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQotCQkJCQkJewotCQkJCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OwotCQkJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKLQkJCQl9IHdoaWxlIChwUHJvYmVFbnRyeSk7Ci0KLQkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNRUFTVVJFX1JFUV9FTlRSWSkpOwotCQkJCXBUYWItPlNpemUtLTsKLQotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAocEVudHJ5LT5WYWxpZCA9PSBGQUxTRSkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChpIDwgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFKQotCQl7Ci0JCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCQkJcEVudHJ5LT5sYXN0VGltZSA9IE5vdzsKLQkJCXBFbnRyeS0+VmFsaWQgPSBUUlVFOwotCQkJcEVudHJ5LT5EaWFsb2dUb2tlbiA9IERpYWxvZ1Rva2VuOwotCQkJcFRhYi0+U2l6ZSsrOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEVudHJ5ID0gTlVMTDsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiB0YWIgZnVsbC5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQl9Ci0KLQkJLy8gYWRkIHRoaXMgTmVpZ2hib3IgZW50cnkgaW50byBIQVNIIHRhYmxlCi0JCWlmIChwRW50cnkpCi0JCXsKLQkJCUhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKERpYWxvZ1Rva2VuKTsKLQkJCWlmIChwVGFiLT5IYXNoW0hhc2hJZHhdID09IE5VTEwpCi0JCQl7Ci0JCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwQ3VyckVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKLQkJCQl3aGlsZSAocEN1cnJFbnRyeS0+cE5leHQgIT0gTlVMTCkKLQkJCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OwotCQkJCXBDdXJyRW50cnktPnBOZXh0ID0gcEVudHJ5OwotCQkJfQotCQl9Ci0KLQkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7Ci0JfQotCi0JcmV0dXJuIHBFbnRyeTsKLX0KLQotVk9JRCBNZWFzdXJlUmVxRGVsZXRlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCi17Ci0JUE1FQVNVUkVfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWI7Ci0JUE1FQVNVUkVfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7Ci0KLQlpZihwVGFiID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gaWYgZW1wdHksIHJldHVybgotCWlmIChwVGFiLT5TaXplID09IDApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJwTWVhc3VyZVJlcVRhYiBlbXB0eS5cbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCXBFbnRyeSA9IE1lYXN1cmVSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7Ci0JaWYgKHBFbnRyeSAhPSBOVUxMKQotCXsKLQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBQcmV2RW50cnkgPSBOVUxMOwotCQlVTE9ORyBIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKLQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKLQotCQlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7Ci0JCS8vIHVwZGF0ZSBIYXNoIGxpc3QKLQkJZG8KLQkJewotCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKLQkJCXsKLQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQotCQkJCXsKLQkJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKLQkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OwotCQl9IHdoaWxlIChwUHJvYmVFbnRyeSk7Ci0KLQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUVBU1VSRV9SRVFfRU5UUlkpKTsKLQkJcFRhYi0+U2l6ZS0tOwotCi0JCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOwotCX0KLQotCXJldHVybjsKLX0KLQotVk9JRCBUcGNSZXFUYWJJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKLQotCXBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIgPSBrbWFsbG9jKHNpemVvZihUUENfUkVRX1RBQiksIEdGUF9BVE9NSUMpOwotCWlmIChwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiKQotCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiLCBzaXplb2YoVFBDX1JFUV9UQUIpKTsKLQllbHNlCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIEZhaWwgdG8gYWxsb2MgbWVtb3J5IGZvciBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiLlxuIiwgX19GVU5DVElPTl9fKSk7Ci0KLQlyZXR1cm47Ci19Ci0KLVZPSUQgVHBjUmVxVGFiRXhpdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKLQotCWlmIChwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiKQotCQlrZnJlZShwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiKTsKLQlwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiID0gTlVMTDsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIFBUUENfUkVRX0VOVFJZIFRwY1JlcUxvb2tVcCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQotewotCVVJTlQgSGFzaElkeDsKLQlQVFBDX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWI7Ci0JUFRQQ19SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKLQlQVFBDX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKLQotCWlmIChwVGFiID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOwotCi0JSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKERpYWxvZ1Rva2VuKTsKLQlwRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOwotCi0Jd2hpbGUgKHBFbnRyeSkKLQl7Ci0JCWlmIChwRW50cnktPkRpYWxvZ1Rva2VuID09IERpYWxvZ1Rva2VuKQotCQkJYnJlYWs7Ci0JCWVsc2UKLQkJewotCQkJcFByZXZFbnRyeSA9IHBFbnRyeTsKLQkJCXBFbnRyeSA9IHBFbnRyeS0+cE5leHQ7Ci0JCX0KLQl9Ci0KLQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOwotCi0JcmV0dXJuIHBFbnRyeTsKLX0KLQotCi1zdGF0aWMgUFRQQ19SRVFfRU5UUlkgVHBjUmVxSW5zZXJ0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCi17Ci0JSU5UIGk7Ci0JVUxPTkcgSGFzaElkeDsKLQlQVFBDX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWI7Ci0JUFRQQ19SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTCwgcEN1cnJFbnRyeTsKLQlVTE9ORyBOb3c7Ci0KLQlpZihwVGFiID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXBFbnRyeSA9IFRwY1JlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKTsKLQlpZiAocEVudHJ5ID09IE5VTEwpCi0JewotCQlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9UUENfUkVRX1RBQl9TSVpFOyBpKyspCi0JCXsKLQkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7Ci0JCQlwRW50cnkgPSAmcFRhYi0+Q29udGVudFtpXTsKLQotCQkJaWYgKChwRW50cnktPlZhbGlkID09IFRSVUUpCi0JCQkJJiYgUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdywgKHVuc2lnbmVkIGxvbmcpKHBFbnRyeS0+bGFzdFRpbWUgKyBUUENfUkVRX0FHRV9PVVQpKSkKLQkJCXsKLQkJCQlQVFBDX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKLQkJCQlVTE9ORyBIYXNoSWR4ID0gVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgocEVudHJ5LT5EaWFsb2dUb2tlbik7Ci0JCQkJUFRQQ19SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOwotCi0JCQkJLy8gdXBkYXRlIEhhc2ggbGlzdAotCQkJCWRvCi0JCQkJewotCQkJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQotCQkJCQl7Ci0JCQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQotCQkJCQkJewotCQkJCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OwotCQkJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKLQkJCQl9IHdoaWxlIChwUHJvYmVFbnRyeSk7Ci0KLQkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihUUENfUkVRX0VOVFJZKSk7Ci0JCQkJcFRhYi0+U2l6ZS0tOwotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChwRW50cnktPlZhbGlkID09IEZBTFNFKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGkgPCBNQVhfVFBDX1JFUV9UQUJfU0laRSkKLQkJewotCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKLQkJCXBFbnRyeS0+bGFzdFRpbWUgPSBOb3c7Ci0JCQlwRW50cnktPlZhbGlkID0gVFJVRTsKLQkJCXBFbnRyeS0+RGlhbG9nVG9rZW4gPSBEaWFsb2dUb2tlbjsKLQkJCXBUYWItPlNpemUrKzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBFbnRyeSA9IE5VTEw7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiB0YWIgZnVsbC5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQl9Ci0KLQkJLy8gYWRkIHRoaXMgTmVpZ2hib3IgZW50cnkgaW50byBIQVNIIHRhYmxlCi0JCWlmIChwRW50cnkpCi0JCXsKLQkJCUhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChEaWFsb2dUb2tlbik7Ci0JCQlpZiAocFRhYi0+SGFzaFtIYXNoSWR4XSA9PSBOVUxMKQotCQkJewotCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEN1cnJFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07Ci0JCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCi0JCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKLQkJCQlwQ3VyckVudHJ5LT5wTmV4dCA9IHBFbnRyeTsKLQkJCX0KLQkJfQotCi0JCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7Ci0JfQotCi0JcmV0dXJuIHBFbnRyeTsKLX0KLQotc3RhdGljIFZPSUQgVHBjUmVxRGVsZXRlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCi17Ci0JUFRQQ19SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiOwotCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7Ci0KLQlpZihwVGFiID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBpZiBlbXB0eSwgcmV0dXJuCi0JaWYgKHBUYWItPlNpemUgPT0gMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBUcGNSZXFUYWIgZW1wdHkuXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7Ci0JaWYgKHBFbnRyeSAhPSBOVUxMKQotCXsKLQkJUFRQQ19SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7Ci0JCVVMT05HIEhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKLQkJUFRQQ19SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOwotCi0JCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOwotCQkvLyB1cGRhdGUgSGFzaCBsaXN0Ci0JCWRvCi0JCXsKLQkJCWlmIChwUHJvYmVFbnRyeSA9PSBwRW50cnkpCi0JCQl7Ci0JCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKLQkJCQl7Ci0JCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlwUHJldkVudHJ5ID0gcFByb2JlRW50cnk7Ci0JCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKLQkJfSB3aGlsZSAocFByb2JlRW50cnkpOwotCi0JCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKFRQQ19SRVFfRU5UUlkpKTsKLQkJcFRhYi0+U2l6ZS0tOwotCi0JCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUdldCBDdXJyZW50IFRpbWVTIHRhbXAuCi0KLQlQYXJhbWV0cnM6Ci0KLQlSZXR1cm4JOiBDdXJyZW50IFRpbWUgU3RhbXAuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotc3RhdGljIFVJTlQ2NCBHZXRDdXJyZW50VGltZVN0YW1wKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCS8vIGdldCBjdXJyZW50IHRpbWUgc3RhbXAuCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJR2V0IEN1cnJlbnQgVHJhbnNtaXQgUG93ZXIuCi0KLQlQYXJhbWV0cnM6Ci0KLQlSZXR1cm4JOiBDdXJyZW50IFRpbWUgU3RhbXAuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotc3RhdGljIFVJTlQ4IEdldEN1clR4UHdyKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVJTlQ4IFdjaWQpCi17Ci0JcmV0dXJuIDE2OyAvKiAxNiBkQm0gKi8KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlHZXQgQ3VycmVudCBUcmFuc21pdCBQb3dlci4KLQotCVBhcmFtZXRyczoKLQotCVJldHVybgk6IEN1cnJlbnQgVGltZSBTdGFtcC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEluc2VydENoYW5uZWxSZXBJRSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBQU1RSSU5HIHBDb3VudHJ5LAotCUlOIFVJTlQ4IFJlZ3VsYXRvcnlDbGFzcykKLXsKLQlVTE9ORyBUZW1wTGVuOwotCVVJTlQ4IExlbjsKLQlVSU5UOCBJRUlkID0gSUVfQVBfQ0hBTk5FTF9SRVBPUlQ7Ci0JUFVDSEFSIHBDaExpc3RQdHIgPSBOVUxMOwotCi0JTGVuID0gMTsKLQlpZiAoc3RybmNtcChwQ291bnRyeSwgIlVTIiwgMikgPT0gMCkKLQl7Ci0JCWlmIChSZWd1bGF0b3J5Q2xhc3MgPj0gVVNBX1JFR1VMQVRPUllfSU5GT19TSVpFKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogVVNBIFVua25vdyBSZXF1bGF0b3J5IGNsYXNzICglZClcbiIsCi0JCQkJCQlfX0ZVTkNUSU9OX18sIFJlZ3VsYXRvcnlDbGFzcykpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGVuICs9IFVTQVJlZ3VsYXRvcnlJbmZvW1JlZ3VsYXRvcnlDbGFzc10uQ2hhbm5lbFNldC5OdW1iZXJPZkNoYW5uZWxzOwotCQlwQ2hMaXN0UHRyID0gVVNBUmVndWxhdG9yeUluZm9bUmVndWxhdG9yeUNsYXNzXS5DaGFubmVsU2V0LkNoYW5uZWxMaXN0OwotCX0KLQllbHNlIGlmIChzdHJuY21wKHBDb3VudHJ5LCAiSlAiLCAyKSA9PSAwKQotCXsKLQkJaWYgKFJlZ3VsYXRvcnlDbGFzcyA+PSBKUF9SRUdVTEFUT1JZX0lORk9fU0laRSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IEpQIFVua25vdyBSZXF1bGF0b3J5IGNsYXNzICglZClcbiIsCi0JCQkJCQlfX0ZVTkNUSU9OX18sIFJlZ3VsYXRvcnlDbGFzcykpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGVuICs9IEphcGFuUmVndWxhdG9yeUluZm9bUmVndWxhdG9yeUNsYXNzXS5DaGFubmVsU2V0Lk51bWJlck9mQ2hhbm5lbHM7Ci0JCXBDaExpc3RQdHIgPSBKYXBhblJlZ3VsYXRvcnlJbmZvW1JlZ3VsYXRvcnlDbGFzc10uQ2hhbm5lbFNldC5DaGFubmVsTGlzdDsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IFVua25vdyBDb3VudHJ5ICglcylcbiIsCi0JCQkJCV9fRlVOQ1RJT05fXywgcENvdW50cnkpKTsKLQkJcmV0dXJuOwotCX0KLQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJJlRlbXBMZW4sCi0JCQkJCTEsCQkJCSZJRUlkLAotCQkJCQkxLAkJCQkmTGVuLAotCQkJCQkxLAkJCQkmUmVndWxhdG9yeUNsYXNzLAotCQkJCQlMZW4gLTEsCQkJcENoTGlzdFB0ciwKLQkJCQkJRU5EX09GX0FSR1MpOwotCi0JKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwotCi0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUluc2VydCBEaWFsb2cgVG9rZW4gaW50byBmcmFtZS4KLQotCVBhcmFtZXRyczoKLQkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCi0JCTIuIGZyYW1lIGxlbmd0aC4KLQkJMy4gRGlhbG9nIHRva2VuLgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEluc2VydERpYWxvZ1Rva2VuKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFVJTlQ4IERpYWxvZ1Rva2VuKQotewotCVVMT05HIFRlbXBMZW47Ci0JTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkmVGVtcExlbiwKLQkJCQkJMSwJCQkJJkRpYWxvZ1Rva2VuLAotCQkJCQlFTkRfT0ZfQVJHUyk7Ci0KLQkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47Ci0KLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJSW5zZXJ0IFRQQyBSZXF1ZXN0IElFIGludG8gZnJhbWUuCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgotCQkyLiBmcmFtZSBsZW5ndGguCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLSBzdGF0aWMgVk9JRCBJbnNlcnRUcGNSZXFJRSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbikKLXsKLQlVTE9ORyBUZW1wTGVuOwotCVVMT05HIExlbiA9IDA7Ci0JVUlOVDggRWxlbWVudElEID0gSUVfVFBDX1JFUVVFU1Q7Ci0KLQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKLQkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCi0JCQkJCQkxLAkJCQkJCQkmTGVuLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCi0JKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwotCi0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUluc2VydCBUUEMgUmVwb3J0IElFIGludG8gZnJhbWUuCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgotCQkyLiBmcmFtZSBsZW5ndGguCi0JCTMuIFRyYW5zbWl0IFBvd2VyLgotCQk0LiBMaW5rIE1hcmdpbi4KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBJbnNlcnRUcGNSZXBvcnRJRSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBUeFB3ciwKLQlJTiBVSU5UOCBMaW5rTWFyZ2luKQotewotCVVMT05HIFRlbXBMZW47Ci0JVUxPTkcgTGVuID0gc2l6ZW9mKFRQQ19SRVBPUlRfSU5GTyk7Ci0JVUlOVDggRWxlbWVudElEID0gSUVfVFBDX1JFUE9SVDsKLQlUUENfUkVQT1JUX0lORk8gVHBjUmVwb3J0SUU7Ci0KLQlUcGNSZXBvcnRJRS5UeFB3ciA9IFR4UHdyOwotCVRwY1JlcG9ydElFLkxpbmtNYXJnaW4gPSBMaW5rTWFyZ2luOwotCi0JTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkJJlRlbXBMZW4sCi0JCQkJCQkxLAkJCQkJCQkmRWxlbWVudElELAotCQkJCQkJMSwJCQkJCQkJJkxlbiwKLQkJCQkJCUxlbiwJCQkJCQkmVHBjUmVwb3J0SUUsCi0JCQkJCQlFTkRfT0ZfQVJHUyk7Ci0KLQkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47Ci0KLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlJbnNlcnQgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IElFIGludG8gZnJhbWUuCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgotCQkyLiBmcmFtZSBsZW5ndGguCi0JCTMuIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBtb2RlLgotCQk0LiBuZXcgc2VsZWN0ZWQgY2hhbm5lbC4KLQkJNS4gY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGNvdW50LgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1zdGF0aWMgVk9JRCBJbnNlcnRDaFN3QW5uSUUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4sCi0JSU4gVUlOVDggQ2hTd01vZGUsCi0JSU4gVUlOVDggTmV3Q2hhbm5lbCwKLQlJTiBVSU5UOCBDaFN3Q250KQotewotCVVMT05HIFRlbXBMZW47Ci0JVUxPTkcgTGVuID0gc2l6ZW9mKENIX1NXX0FOTl9JTkZPKTsKLQlVSU5UOCBFbGVtZW50SUQgPSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQ7Ci0JQ0hfU1dfQU5OX0lORk8gQ2hTd0FubklFOwotCi0JQ2hTd0FubklFLkNoU3dNb2RlID0gQ2hTd01vZGU7Ci0JQ2hTd0FubklFLkNoYW5uZWwgPSBOZXdDaGFubmVsOwotCUNoU3dBbm5JRS5DaFN3Q250ID0gQ2hTd0NudDsKLQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJJlRlbXBMZW4sCi0JCQkJCQkxLAkJCQkJCSZFbGVtZW50SUQsCi0JCQkJCQkxLAkJCQkJCSZMZW4sCi0JCQkJCQlMZW4sCQkJCQkmQ2hTd0FubklFLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCi0JKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwotCi0KLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJSW5zZXJ0IE1lYXN1cmUgUmVxdWVzdCBJRSBpbnRvIGZyYW1lLgotCi0JUGFyYW1ldHJzOgotCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KLQkJMi4gZnJhbWUgbGVuZ3RoLgotCQkzLiBNZWFzdXJlIFRva2VuLgotCQk0LiBNZWFzdXJlIFJlcXVlc3QgTW9kZS4KLQkJNS4gTWVhc3VyZSBSZXF1ZXN0IFR5cGUuCi0JCTYuIE1lYXN1cmUgQ2hhbm5lbC4KLQkJNy4gTWVhc3VyZSBTdGFydCB0aW1lLgotCQk4LiBNZWFzdXJlIER1cmF0aW9uLgotCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLXN0YXRpYyBWT0lEIEluc2VydE1lYXN1cmVSZXFJRSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBMZW4sCi0JSU4gUE1FQVNVUkVfUkVRX0lORk8gcE1lYXN1cmVSZXFJRSkKLXsKLQlVTE9ORyBUZW1wTGVuOwotCVVJTlQ4IEVsZW1lbnRJRCA9IElFX01FQVNVUkVNRU5UX1JFUVVFU1Q7Ci0KLQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKLQkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCi0JCQkJCQkxLAkJCQkJCQkmTGVuLAotCQkJCQkJc2l6ZW9mKE1FQVNVUkVfUkVRX0lORk8pLAlwTWVhc3VyZVJlcUlFLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCi0JKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwotCi0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUluc2VydCBNZWFzdXJlIFJlcG9ydCBJRSBpbnRvIGZyYW1lLgotCi0JUGFyYW1ldHJzOgotCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KLQkJMi4gZnJhbWUgbGVuZ3RoLgotCQkzLiBNZWFzdXJlIFRva2VuLgotCQk0LiBNZWFzdXJlIFJlcXVlc3QgTW9kZS4KLQkJNS4gTWVhc3VyZSBSZXF1ZXN0IFR5cGUuCi0JCTYuIExlbmd0aCBvZiBSZXBvcnQgSW5mb21hdGlvbgotCQk3LiBQb2ludGVyIG9mIFJlcG9ydCBJbmZvbWF0aW9uIEJ1ZmZlci4KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotc3RhdGljIFZPSUQgSW5zZXJ0TWVhc3VyZVJlcG9ydElFKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFBNRUFTVVJFX1JFUE9SVF9JTkZPIHBNZWFzdXJlUmVwb3J0SUUsCi0JSU4gVUlOVDggUmVwb3J0TG5mb0xlbiwKLQlJTiBQVUlOVDggcFJlcG9ydEluZm8pCi17Ci0JVUxPTkcgVGVtcExlbjsKLQlVTE9ORyBMZW47Ci0JVUlOVDggRWxlbWVudElEID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOwotCi0JTGVuID0gc2l6ZW9mKE1FQVNVUkVfUkVQT1JUX0lORk8pICsgUmVwb3J0TG5mb0xlbjsKLQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAotCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKLQkJCQkJCTEsCQkJCQkJCSZMZW4sCi0JCQkJCQlMZW4sCQkJCQkJcE1lYXN1cmVSZXBvcnRJRSwKLQkJCQkJCUVORF9PRl9BUkdTKTsKLQotCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKLQotCWlmICgoUmVwb3J0TG5mb0xlbiA+IDApICYmIChwUmVwb3J0SW5mbyAhPSBOVUxMKSkKLQl7Ci0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiArICpwRnJhbWVMZW4sCQkmVGVtcExlbiwKLQkJCQkJCQlSZXBvcnRMbmZvTGVuLAkJCQlwUmVwb3J0SW5mbywKLQkJCQkJCQlFTkRfT0ZfQVJHUyk7Ci0KLQkJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwotCX0KLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJUHJlcGFyZSBNZWFzdXJlbWVudCByZXF1ZXN0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCi0JCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWFrZU1lYXN1cmVtZW50UmVxRnJhbWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwT3V0QnVmZmVyLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFVJTlQ4IFRvdGFsTGVuLAotCUlOIFVJTlQ4IENhdGVnb3J5LAotCUlOIFVJTlQ4IEFjdGlvbiwKLQlJTiBVSU5UOCBNZWFzdXJlVG9rZW4sCi0JSU4gVUlOVDggTWVhc3VyZVJlcU1vZGUsCi0JSU4gVUlOVDggTWVhc3VyZVJlcVR5cGUsCi0JSU4gVUlOVDggTnVtT2ZSZXBldGl0aW9ucykKLXsKLQlVTE9ORyBUZW1wTGVuOwotCU1FQVNVUkVfUkVRX0lORk8gTWVhc3VyZVJlcUlFOwotCi0JSW5zZXJ0QWN0RmllbGQocEFkLCAocE91dEJ1ZmZlciArICpwRnJhbWVMZW4pLCBwRnJhbWVMZW4sIENhdGVnb3J5LCBBY3Rpb24pOwotCi0JLy8gZmlsbCBEaWFsb2cgVG9rZW4KLQlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgKnBGcmFtZUxlbiksIHBGcmFtZUxlbiwgTWVhc3VyZVRva2VuKTsKLQotCS8qIGZpbGwgTnVtYmVyIG9mIHJlcGV0aXRpb25zLiAqLwotCWlmIChDYXRlZ29yeSA9PSBDQVRFR09SWV9STSkKLQl7Ci0JCU1ha2VPdXRnb2luZ0ZyYW1lKChwT3V0QnVmZmVyKypwRnJhbWVMZW4pLAkmVGVtcExlbiwKLQkJCQkJCTIsCQkJCQkJCSZOdW1PZlJlcGV0aXRpb25zLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCi0JCSpwRnJhbWVMZW4gKz0gVGVtcExlbjsKLQl9Ci0KLQkvLyBwcmVwYXJlIE1lYXN1cmVtZW50IElFLgotCU5kaXNaZXJvTWVtb3J5KCZNZWFzdXJlUmVxSUUsIHNpemVvZihNRUFTVVJFX1JFUV9JTkZPKSk7Ci0JTWVhc3VyZVJlcUlFLlRva2VuID0gTWVhc3VyZVRva2VuOwotCU1lYXN1cmVSZXFJRS5SZXFNb2RlLndvcmQgPSBNZWFzdXJlUmVxTW9kZTsKLQlNZWFzdXJlUmVxSUUuUmVxVHlwZSA9IE1lYXN1cmVSZXFUeXBlOwotCUluc2VydE1lYXN1cmVSZXFJRShwQWQsIChwT3V0QnVmZmVyKypwRnJhbWVMZW4pLCBwRnJhbWVMZW4sCi0JCVRvdGFsTGVuLCAmTWVhc3VyZVJlcUlFKTsKLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlQcmVwYXJlIE1lYXN1cmVtZW50IHJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgotCi0JUGFyYW1ldHJzOgotCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVJTlQ4IERpYWxvZ1Rva2VuLAotCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKLQlJTiBVSU5UOCBSZXBvcnRJbmZvTGVuLAotCUlOIFBVSU5UOCBwUmVwb3J0SW5mbykKLXsKLQlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMgTlN0YXR1czsKLQlVTE9ORyBGcmFtZUxlbjsKLQlIRUFERVJfODAyXzExIEFjdEhkcjsKLQlNRUFTVVJFX1JFUE9SVF9JTkZPIE1lYXN1cmVSZXBJRTsKLQotCS8vIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuCi0JTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCi0JCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLQotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm47Ci0JfQotCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCUZyYW1lTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOwotCi0JSW5zZXJ0QWN0RmllbGQocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBDQVRFR09SWV9TUEVDVFJVTSwgU1BFQ19NUlApOwotCi0JLy8gZmlsbCBEaWFsb2cgVG9rZW4KLQlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIERpYWxvZ1Rva2VuKTsKLQotCS8vIHByZXBhcmUgTWVhc3VyZW1lbnQgSUUuCi0JTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXBJRSwgc2l6ZW9mKE1FQVNVUkVfUkVQT1JUX0lORk8pKTsKLQlNZWFzdXJlUmVwSUUuVG9rZW4gPSBNZWFzdXJlVG9rZW47Ci0JTWVhc3VyZVJlcElFLlJlcG9ydE1vZGUgPSBNZWFzdXJlUmVxTW9kZTsKLQlNZWFzdXJlUmVwSUUuUmVwb3J0VHlwZSA9IE1lYXN1cmVSZXFUeXBlOwotCUluc2VydE1lYXN1cmVSZXBvcnRJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sICZNZWFzdXJlUmVwSUUsIFJlcG9ydEluZm9MZW4sIHBSZXBvcnRJbmZvKTsKLQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlQcmVwYXJlIFRQQyBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCi0JCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgRW5xdWV1ZVRQQ1JlcSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVDSEFSIERpYWxvZ1Rva2VuKQotewotCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyBOU3RhdHVzOwotCVVMT05HIEZyYW1lTGVuOwotCi0JSEVBREVSXzgwMl8xMSBBY3RIZHI7Ci0KLQkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgotCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAotCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0KLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuOwotCX0KLQlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKLQotCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfVFBDUlEpOwotCi0JLy8gZmlsbCBEaWFsb2cgVG9rZW4KLQlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIERpYWxvZ1Rva2VuKTsKLQotCS8vIEluc2VydCBUUEMgUmVxdWVzdCBJRS4KLQlJbnNlcnRUcGNSZXFJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4pOwotCi0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVByZXBhcmUgVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgotCi0JUGFyYW1ldHJzOgotCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEVucXVldWVUUENSZXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKLQlJTiBVSU5UOCBUeFB3ciwKLQlJTiBVSU5UOCBMaW5rTWFyZ2luKQotewotCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyBOU3RhdHVzOwotCVVMT05HIEZyYW1lTGVuOwotCi0JSEVBREVSXzgwMl8xMSBBY3RIZHI7Ci0KLQkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgotCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAotCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0KLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuOwotCX0KLQlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKLQotCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfVFBDUlApOwotCi0JLy8gZmlsbCBEaWFsb2cgVG9rZW4KLQlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIERpYWxvZ1Rva2VuKTsKLQotCS8vIEluc2VydCBUUEMgUmVxdWVzdCBJRS4KLQlJbnNlcnRUcGNSZXBvcnRJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIFR4UHdyLCBMaW5rTWFyZ2luKTsKLQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlQcmVwYXJlIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgotCi0JUGFyYW1ldHJzOgotCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgotCQkyLiBDaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgbW9kZS4KLQkJMi4gYSBOZXcgc2VsZWN0ZWQgY2hhbm5lbC4KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBFbnF1ZXVlQ2hTd0FubigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVJTlQ4IENoU3dNb2RlLAotCUlOIFVJTlQ4IE5ld0NoKQotewotCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyBOU3RhdHVzOwotCVVMT05HIEZyYW1lTGVuOwotCi0JSEVBREVSXzgwMl8xMSBBY3RIZHI7Ci0KLQkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgotCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAotCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0KLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuOwotCX0KLQlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKLQotCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfQ0hBTk5FTF9TV0lUQ0gpOwotCi0JSW5zZXJ0Q2hTd0FubklFKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ2hTd01vZGUsIE5ld0NoLCAwKTsKLQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIEJPT0xFQU4gRGZzUmVxdWlyZW1lbnRDaGVjaygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVSU5UOCBDaGFubmVsKQotewotCUJPT0xFQU4gUmVzdWx0ID0gRkFMU0U7Ci0JSU5UIGk7Ci0KLQlkbwotCXsKLQkJLy8gY2hlY2sgREZTIHByb2NlZHVyZSBpcyBydW5uaW5nLgotCQkvLyBtYWtlIHN1cmUgREZTIHByb2NlZHVyZSB3b24ndCBzdGFydCB0d2ljZS4KLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkKLQkJewotCQkJUmVzdWx0ID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8vIGNoZWNrIHRoZSBuZXcgY2hhbm5lbCBjYXJyaWVkIGZyb20gQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtbmV0IGlzIHZhbGlkLgotCQlmb3IgKGk9MDsgaTxwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCi0JCXsKLQkJCWlmICgoQ2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCi0JCQkJJiYocEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlID09IDApKQotCQkJewotCQkJCS8vIGZvdW5kIHJhZGFyIHNpZ25hbCBpbiB0aGUgY2hhbm5lbC4gdGhlIGNoYW5uZWwgY2FuJ3QgdXNlIGF0IGxlYXN0IGZvciAzMCBtaW51dGVzLgotCQkJCXBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA9IDE4MDA7Ly8zMCBtaW4gPSAxODAwIHNlYwotCQkJCVJlc3VsdCA9IFRSVUU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9IHdoaWxlKEZBTFNFKTsKLQotCXJldHVybiBSZXN1bHQ7Ci19Ci0KLVZPSUQgTm90aWZ5Q2hTd0FublRvUGVlckFQcygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcFJBLAotCUlOIFBVQ0hBUiBwVEEsCi0JSU4gVUlOVDggQ2hTd01vZGUsCi0JSU4gVUlOVDggQ2hhbm5lbCkKLXsKLSNpZmRlZiBXRFNfU1VQUE9SVAotCWlmICghKChwUkFbMF0gJiAweGZmKSA9PSAweGZmKSkgLy8gaXMgcFJBIGEgYnJvYWRjYXNlIGFkZHJlc3MuCi0JewotCQlJTlQgaTsKLQkJLy8gaW5mbyBuZWlnaGJvciBBUHMgdGhhdCBSYWRhciBzaWduYWwgZm91bmQgdGhyb2doIFdEUyBsaW5rLgotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1dEU19FTlRSWTsgaSsrKQotCQl7Ci0JCQlpZiAoVmFsaWRXZHNFbnRyeShwQWQsIGkpKQotCQkJewotCQkJCVBVQ0hBUiBwREEgPSBwQWQtPldkc1RhYi5XZHNFbnRyeVtpXS5QZWVyV2RzQWRkcjsKLQotCQkJCS8vIERBIGVxdWFsIHRvIFNBLiBoYXZlIG5vIG5lY2Vzc2FyeSBvcmlnbmFsIEFQIHdoaWNoIGZvdW5kIFJhZGFyIHNpZ25hbC4KLQkJCQlpZiAoTUFDX0FERFJfRVFVQUwocFRBLCBwREEpKQotCQkJCQljb250aW51ZTsKLQotCQkJCS8vIHNlbmQgQ2hhbm5lbCBTd2l0Y2ggQWN0aW9uIGZyYW1lIHRvIGluZm8gTmVpZ2hicm8gQVBzLgotCQkJCUVucXVldWVDaFN3QW5uKHBBZCwgcERBLCBDaFN3TW9kZSwgQ2hhbm5lbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gV0RTX1NVUFBPUlQgLy8KLX0KLQotc3RhdGljIFZPSUQgU3RhcnRERlNQcm9jZWR1cmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgQ2hhbm5lbCwKLQlJTiBVSU5UOCBDaFN3TW9kZSkKLXsKLQkvLyBzdGFydCBERlMgcHJvY2VkdXJlCi0JcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IENoYW5uZWw7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JTl9DaGFubmVsQ2hlY2socEFkKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9TV0lUQ0hJTkdfTU9ERTsKLQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU0NvdW50ID0gMDsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KLQotCVBhcmFtZXRyczoKLQkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCi0JCTIuIG1lc3NhZ2UgbGVuZ3RoLgotCQkzLiBDaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgaW5mb21hdGlvbiBidWZmZXIuCi0KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotCi0vKgotICBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgSUUuCi0gICstLS0tKy0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKLSAgfCBJRCB8IExlbiB8Q2ggU3cgTW9kZSB8IE5ldyBDaCBOdW0gfCBDaCBTdyBDbnQgfAotICArLS0tLSstLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCi0gICAgMSAgICAxICAgICAgICAxICAgICAgICAgICAxICAgICAgICAgICAgMQotKi8KLXN0YXRpYyBCT09MRUFOIFBlZXJDaFN3QW5uU2FuaXR5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFZPSUQgKnBNc2csCi0JSU4gVUxPTkcgTXNnTGVuLAotCU9VVCBQQ0hfU1dfQU5OX0lORk8gcENoU3dBbm5JbmZvKQotewotCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOwotCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7Ci0JQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKLQlQRUlEX1NUUlVDVCBlaWRfcHRyOwotCi0JLy8gc2tpcCA4MDIuMTEgaGVhZGVyLgotCU1zZ0xlbiAtPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0KLQkvLyBza2lwIGNhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4KLQlwRnJhbWVQdHIgKz0gMjsKLQlNc2dMZW4gLT0gMjsKLQotCWlmIChwQ2hTd0FubkluZm8gPT0gTlVMTCkKLQkJcmV0dXJuIHJlc3VsdDsKLQotCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpcEZyYW1lUHRyOwotCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFBVQ0hBUilwRnJhbWVQdHIgKyBNc2dMZW4pKQotCXsKLQkJc3dpdGNoKGVpZF9wdHItPkVpZCkKLQkJewotCQkJY2FzZSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQ6Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBDaFN3QW5uSW5mby0+Q2hTd01vZGUsIGVpZF9wdHItPk9jdGV0LCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcENoU3dBbm5JbmZvLT5DaGFubmVsLCBlaWRfcHRyLT5PY3RldCArIDEsIDEpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQ2hTd0FubkluZm8tPkNoU3dDbnQsIGVpZF9wdHItPk9jdGV0ICsgMiwgMSk7Ci0KLQkJCQlyZXN1bHQgPSBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0JCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOwotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJTWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb24gZnJhbWUgc2FuaXR5IGNoZWNrLgotCi0JUGFyYW1ldHJzOgotCQkxLiBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKLQkJMi4gbWVzc2FnZSBsZW5ndGguCi0JCTMuIE1lYXN1cmVtZW50IHJlcXVlc3QgaW5mb21hdGlvbiBidWZmZXIuCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLXN0YXRpYyBCT09MRUFOIFBlZXJNZWFzdXJlUmVxU2FuaXR5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFZPSUQgKnBNc2csCi0JSU4gVUxPTkcgTXNnTGVuLAotCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuLAotCU9VVCBQTUVBU1VSRV9SRVFfSU5GTyBwTWVhc3VyZVJlcUluZm8sCi0JT1VUIFBNRUFTVVJFX1JFUSBwTWVhc3VyZVJlcSkKLXsKLQlQRlJBTUVfODAyXzExIEZyID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKLQlQVUNIQVIgcEZyYW1lUHRyID0gRnItPk9jdGV0OwotCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7Ci0JUEVJRF9TVFJVQ1QgZWlkX3B0cjsKLQlQVUNIQVIgcHRyOwotCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOwotCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247Ci0KLQkvLyBza2lwIDgwMi4xMSBoZWFkZXIuCi0JTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKLQotCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgotCXBGcmFtZVB0ciArPSAyOwotCU1zZ0xlbiAtPSAyOwotCi0JaWYgKHBNZWFzdXJlUmVxSW5mbyA9PSBOVUxMKQotCQlyZXR1cm4gcmVzdWx0OwotCi0JTmRpc01vdmVNZW1vcnkocERpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOwotCXBGcmFtZVB0ciArPSAxOwotCU1zZ0xlbiAtPSAxOwotCi0JZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7Ci0Jd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCi0JewotCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQotCQl7Ci0JCQljYXNlIElFX01FQVNVUkVNRU5UX1JFUVVFU1Q6Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVxSW5mby0+VG9rZW4sIGVpZF9wdHItPk9jdGV0LCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5SZXFNb2RlLndvcmQsIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVxSW5mby0+UmVxVHlwZSwgZWlkX3B0ci0+T2N0ZXQgKyAyLCAxKTsKLQkJCQlwdHIgPSAoUFVDSEFSKShlaWRfcHRyLT5PY3RldCArIDMpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcS0+Q2hOdW0sIHB0ciwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJk1lYXN1cmVTdGFydFRpbWUsIHB0ciArIDEsIDgpOwotCQkJCXBNZWFzdXJlUmVxLT5NZWFzdXJlU3RhcnRUaW1lID0gU1dBUDY0KE1lYXN1cmVTdGFydFRpbWUpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZNZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOwotCQkJCXBNZWFzdXJlUmVxLT5NZWFzdXJlRHVyYXRpb24gPSBTV0FQMTYoTWVhc3VyZUR1cmF0aW9uKTsKLQotCQkJCXJlc3VsdCA9IFRSVUU7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlNZWFzdXJlbWVudCByZXBvcnQgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KLQotCVBhcmFtZXRyczoKLQkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCi0JCTIuIG1lc3NhZ2UgbGVuZ3RoLgotCQkzLiBNZWFzdXJlbWVudCByZXBvcnQgaW5mb21hdGlvbiBidWZmZXIuCi0JCTQuIGJhc2ljIHJlcG9ydCBpbmZvbWF0aW9uIGJ1ZmZlci4KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotCi0vKgotICBNZWFzdXJlbWVudCBSZXBvcnQgSUUuCi0gICstLS0tKy0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwotICB8IElEIHwgTGVuIHwgVG9rZW4gfCBSZXBvcnQgTW9kZSB8IE1lYXN1cmUgVHlwZSB8IE1lYXN1cmUgUmVwb3J0IHwKLSAgKy0tLS0rLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCi0gICAgMSAgICAgMSAgICAgIDEgICAgICAgICAgMSAgICAgICAgICAgICAxICAgICAgICAgICAgdmFyaWFibGUKLQotICBCYXNpYyBSZXBvcnQuCi0gICstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLSsKLSAgfCBDaCBOdW0gfCBTdGFydCBUaW1lIHwgRHVyYXRpb24gfCBNYXAgfAotICArLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0rCi0gICAgICAxICAgICAgICAgIDggICAgICAgICAgIDIgICAgICAgIDEKLQotICBNYXAgRmllbGQgQml0IEZvcm1hdC4KLSAgKy0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKLSAgfCBCc3MgfCBPRkRNIFByZWFtYmxlIHwgVW5pZGVudGlmaWVkIHNpZ25hbCB8IFJhZGFyIHwgVW5tZWFzdXJlZCB8IFJlc2VydmVkIHwKLSAgKy0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKLSAgICAgMCAgICAgICAgICAxICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgMyAgICAgICAgIDQgICAgICAgICAgNS03Ci0qLwotc3RhdGljIEJPT0xFQU4gUGVlck1lYXN1cmVSZXBvcnRTYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVk9JRCAqcE1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4sCi0JT1VUIFBNRUFTVVJFX1JFUE9SVF9JTkZPIHBNZWFzdXJlUmVwb3J0SW5mbywKLQlPVVQgUFVJTlQ4IHBSZXBvcnRCdWYpCi17Ci0JUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0JUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKLQlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOwotCVBFSURfU1RSVUNUIGVpZF9wdHI7Ci0JUFVDSEFSIHB0cjsKLQotCS8vIHNraXAgODAyLjExIGhlYWRlci4KLQlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOwotCi0JLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCi0JcEZyYW1lUHRyICs9IDI7Ci0JTXNnTGVuIC09IDI7Ci0KLQlpZiAocE1lYXN1cmVSZXBvcnRJbmZvID09IE5VTEwpCi0JCXJldHVybiByZXN1bHQ7Ci0KLQlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7Ci0JcEZyYW1lUHRyICs9IDE7Ci0JTXNnTGVuIC09IDE7Ci0KLQllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKLQl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKLQl7Ci0JCXN3aXRjaChlaWRfcHRyLT5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVQT1JUOgotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcG9ydEluZm8tPlRva2VuLCBlaWRfcHRyLT5PY3RldCwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0TW9kZSwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlLCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOwotCQkJCWlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fQkFTSUMpCi0JCQkJewotCQkJCQlQTUVBU1VSRV9CQVNJQ19SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9CQVNJQ19SRVBPUlQpcFJlcG9ydEJ1ZjsKLQkJCQkJcHRyID0gKFBVQ0hBUikoZWlkX3B0ci0+T2N0ZXQgKyAzKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWFwLCBwdHIgKyAxMSwgMSk7Ci0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAocE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlID09IFJNX0NDQSkKLQkJCQl7Ci0JCQkJCVBNRUFTVVJFX0NDQV9SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9DQ0FfUkVQT1JUKXBSZXBvcnRCdWY7Ci0JCQkJCXB0ciA9IChQVUNIQVIpKGVpZF9wdHItPk9jdGV0ICsgMyk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5DaE51bSwgcHRyLCAxKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVTdGFydFRpbWUsIHB0ciArIDEsIDgpOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZUR1cmF0aW9uLCBwdHIgKyA5LCAyKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNDQV9CdXN5X0ZyYWN0aW9uLCBwdHIgKyAxMSwgMSk7Ci0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAocE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlID09IFJNX1JQSV9ISVNUT0dSQU0pCi0JCQkJewotCQkJCQlQTUVBU1VSRV9SUElfUkVQT1JUIHBSZXBvcnQgPSAoUE1FQVNVUkVfUlBJX1JFUE9SVClwUmVwb3J0QnVmOwotCQkJCQlwdHIgPSAoUFVDSEFSKShlaWRfcHRyLT5PY3RldCArIDMpOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q2hOdW0sIHB0ciwgMSk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5SUElfRGVuc2l0eSwgcHRyICsgMTEsIDgpOwotCQkJCX0KLQkJCQlyZXN1bHQgPSBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0JCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOwotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVFBDIFJlcXVlc3QgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KLQotCVBhcmFtZXRyczoKLQkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCi0JCTIuIG1lc3NhZ2UgbGVuZ3RoLgotCQkzLiBEaWFsb2cgVG9rZW4uCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLXN0YXRpYyBCT09MRUFOIFBlZXJUcGNSZXFTYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVk9JRCAqcE1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4pCi17Ci0JUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0JUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKLQlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOwotCVBFSURfU1RSVUNUIGVpZF9wdHI7Ci0KLQlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOwotCi0JLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCi0JcEZyYW1lUHRyICs9IDI7Ci0JTXNnTGVuIC09IDI7Ci0KLQlpZiAocERpYWxvZ1Rva2VuID09IE5VTEwpCi0JCXJldHVybiByZXN1bHQ7Ci0KLQlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7Ci0JcEZyYW1lUHRyICs9IDE7Ci0JTXNnTGVuIC09IDE7Ci0KLQllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKLQl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKLQl7Ci0JCXN3aXRjaChlaWRfcHRyLT5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfVFBDX1JFUVVFU1Q6Ci0JCQkJcmVzdWx0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKLQl9Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRQQyBSZXBvcnQgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KLQotCVBhcmFtZXRyczoKLQkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCi0JCTIuIG1lc3NhZ2UgbGVuZ3RoLgotCQkzLiBEaWFsb2cgVG9rZW4uCi0JCTQuIFRQQyBSZXBvcnQgSUUuCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLXN0YXRpYyBCT09MRUFOIFBlZXJUcGNSZXBTYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVk9JRCAqcE1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4sCi0JT1VUIFBUUENfUkVQT1JUX0lORk8gcFRwY1JlcEluZm8pCi17Ci0JUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0JUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKLQlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOwotCVBFSURfU1RSVUNUIGVpZF9wdHI7Ci0KLQlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOwotCi0JLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCi0JcEZyYW1lUHRyICs9IDI7Ci0JTXNnTGVuIC09IDI7Ci0KLQlpZiAocERpYWxvZ1Rva2VuID09IE5VTEwpCi0JCXJldHVybiByZXN1bHQ7Ci0KLQlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7Ci0JcEZyYW1lUHRyICs9IDE7Ci0JTXNnTGVuIC09IDE7Ci0KLQllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKLQl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKLQl7Ci0JCXN3aXRjaChlaWRfcHRyLT5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfVFBDX1JFUE9SVDoKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcFRwY1JlcEluZm8tPlR4UHdyLCBlaWRfcHRyLT5PY3RldCwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBUcGNSZXBJbmZvLT5MaW5rTWFyZ2luLCBlaWRfcHRyLT5PY3RldCArIDEsIDEpOwotCQkJCXJlc3VsdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCi0KLQlQYXJhbWV0cnM6Ci0JCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotc3RhdGljIFZPSUQgUGVlckNoU3dBbm5BY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCUNIX1NXX0FOTl9JTkZPIENoU3dBbm5JbmZvOwotCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCVVDSEFSIGluZGV4ID0gMCwgQ2hhbm5lbCA9IDAsIE5ld0NoYW5uZWwgPSAwOwotCVVMT05HIEJzc2lkeCA9IDA7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlOZGlzWmVyb01lbW9yeSgmQ2hTd0FubkluZm8sIHNpemVvZihDSF9TV19BTk5fSU5GTykpOwotCWlmICghIFBlZXJDaFN3QW5uU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZDaFN3QW5uSW5mbykpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbnZhbGlkIENoYW5uZWwgU3dpdGNoIEFjdGlvbiBGcmFtZS5cbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0JewotCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwRnItPkhkci5BZGRyMywgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckNoU3dBbm5BY3Rpb24gLSBCc3NpZHggaXMgbm90IGZvdW5kXG4iKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJcbioqKipCc3NpZHggaXMgJWQsIENoYW5uZWwgPSAlZFxuIiwgaW5kZXgsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkNoYW5uZWwpKTsKLQkJaGV4X2R1bXAoIlNTSUQiLHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkJzc2lkICw2KTsKLQotCQlDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQkJTmV3Q2hhbm5lbCA9IENoU3dBbm5JbmZvLkNoYW5uZWw7Ci0KLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJiAoTmV3Q2hhbm5lbCAhPSAwKSAmJiAoQ2hhbm5lbCAhPSBOZXdDaGFubmVsKSkKLQkJewotCQkJLy8gU3dpdGNoaW5nIHRvIGNoYW5uZWwgMSBjYW4gcHJldmVudCBmcm9tIHJlc2Nhbm5pbmcgdGhlIGN1cnJlbnQgY2hhbm5lbCBpbW1lZGlhdGVseSAoYnkgYXV0byByZWNvbm5lY3Rpb24pLgotCQkJLy8gSW4gYWRkaXRpb24sIGNsZWFyIHRoZSBNTE1FIHF1ZXVlIGFuZCB0aGUgc2NhbiB0YWJsZSB0byBkaXNjYXJkIHRoZSBSWCBwYWNrZXRzIGFuZCBwcmV2aW91cyBzY2FubmluZyByZXN1bHRzLgotCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCAxLCBGQUxTRSk7Ci0JCQlBc2ljTG9ja0NoYW5uZWwocEFkLCAxKTsKLQkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOwotCQkJTWxtZVF1ZXVlSW5pdCgmcEFkLT5NbG1lLlF1ZXVlKTsKLQkJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKLQkJICAgIFJUTVB1c2VjRGVsYXkoMTAwMDAwMCk7CQkvLyB1c2UgZGVsYXkgdG8gcHJldmVudCBTVEEgZG8gcmVhc3NvYwotCi0JCQkvLyBjaGFubmVsIHNhbml0eSBjaGVjawotCQkJZm9yIChpbmRleCA9IDAgOyBpbmRleCA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGluZGV4KyspCi0JCQl7Ci0JCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLkNoYW5uZWwgPT0gTmV3Q2hhbm5lbCkKLQkJCQl7Ci0JCQkJCXBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkNoYW5uZWwgPSBOZXdDaGFubmVsOwotCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gTmV3Q2hhbm5lbDsKLQkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCImJiYmJiYmJiYmJiYmJiYmUGVlckNoU3dBbm5BY3Rpb24gLSBTVEEgcmVjZWl2ZSBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgSUUgKE5ldyBDaGFubmVsID0lZClcbiIsIE5ld0NoYW5uZWwpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoaW5kZXggPj0gcEFkLT5DaGFubmVsTGlzdE51bSkKLQkJCXsKLQkJCQlEQkdQUklOVF9FUlIoKCImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJlBlZXJDaFN3QW5uQWN0aW9uKGNhbiBub3QgZmluZCBOZXcgQ2hhbm5lbD0lZCBpbiBDaGFubmVsTGlzdFslZF1cbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3ROdW0pKTsKLQkJCX0KLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCXJldHVybjsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCU1lYXN1cmVtZW50IFJlcXVlc3QgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCi0KLQlQYXJhbWV0cnM6Ci0JCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotc3RhdGljIFZPSUQgUGVlck1lYXN1cmVSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOwotCVVJTlQ4IERpYWxvZ1Rva2VuOwotCU1FQVNVUkVfUkVRX0lORk8gTWVhc3VyZVJlcUluZm87Ci0JTUVBU1VSRV9SRVEJTWVhc3VyZVJlcTsKLQlNRUFTVVJFX1JFUE9SVF9NT0RFIFJlcG9ydE1vZGU7Ci0KLQlpZihQZWVyTWVhc3VyZVJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4sICZNZWFzdXJlUmVxSW5mbywgJk1lYXN1cmVSZXEpKQotCXsKLQkJUmVwb3J0TW9kZS53b3JkID0gMDsKLQkJUmVwb3J0TW9kZS5maWVsZC5JbmNhcGFibGUgPSAxOwotCQlFbnF1ZXVlTWVhc3VyZW1lbnRSZXAocEFkLCBwRnItPkhkci5BZGRyMiwgRGlhbG9nVG9rZW4sIE1lYXN1cmVSZXFJbmZvLlRva2VuLCBSZXBvcnRNb2RlLndvcmQsIE1lYXN1cmVSZXFJbmZvLlJlcVR5cGUsIDAsIE5VTEwpOwotCX0KLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlNZWFzdXJlbWVudCBSZXBvcnQgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCi0KLQlQYXJhbWV0cnM6Ci0JCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotc3RhdGljIFZPSUQgUGVlck1lYXN1cmVSZXBvcnRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCU1FQVNVUkVfUkVQT1JUX0lORk8gTWVhc3VyZVJlcG9ydEluZm87Ci0JUEZSQU1FXzgwMl8xMSBwRnIgPSAoUEZSQU1FXzgwMl8xMSlFbGVtLT5Nc2c7Ci0JVUlOVDggRGlhbG9nVG9rZW47Ci0JUFVJTlQ4IHBNZWFzdXJlUmVwb3J0SW5mbzsKLQotLy8JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIICE9IFRSVUUpCi0vLwkJcmV0dXJuOwotCi0JaWYgKChwTWVhc3VyZVJlcG9ydEluZm8gPSBrbWFsbG9jKHNpemVvZihNRUFTVVJFX1JQSV9SRVBPUlQpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIHVuYWJsZSB0byBhbGxvYyBtZW1vcnkgZm9yIG1lYXN1cmUgcmVwb3J0IGJ1ZmZlciAoc2l6ZT0lZCkuXG4iLCBfX0ZVTkNUSU9OX18sIHNpemVvZihNRUFTVVJFX1JQSV9SRVBPUlQpKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlOZGlzWmVyb01lbW9yeSgmTWVhc3VyZVJlcG9ydEluZm8sIHNpemVvZihNRUFTVVJFX1JFUE9SVF9JTkZPKSk7Ci0JTmRpc1plcm9NZW1vcnkocE1lYXN1cmVSZXBvcnRJbmZvLCBzaXplb2YoTUVBU1VSRV9SUElfUkVQT1JUKSk7Ci0JaWYgKFBlZXJNZWFzdXJlUmVwb3J0U2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbiwgJk1lYXN1cmVSZXBvcnRJbmZvLCBwTWVhc3VyZVJlcG9ydEluZm8pKQotCXsKLQkJZG8gewotCQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7Ci0KLQkJCS8vIE5vdCBhIGF1dG9ub21vdXMgbWVhc3VyZSByZXBvcnQuCi0JCQkvLyBjaGVjayB0aGUgZGlhbG9nIHRva2VuIGZpZWxkLiBkcm9wIGl0IGlmIHRoZSBkaWFsb2cgdG9rZW4gZG9lc24ndCBtYXRjaC4KLQkJCWlmICgoRGlhbG9nVG9rZW4gIT0gMCkKLQkJCQkmJiAoKHBFbnRyeSA9IE1lYXN1cmVSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbikpID09IE5VTEwpKQotCQkJCWJyZWFrOwotCi0JCQlpZiAocEVudHJ5ICE9IE5VTEwpCi0JCQkJTWVhc3VyZVJlcURlbGV0ZShwQWQsIHBFbnRyeS0+RGlhbG9nVG9rZW4pOwotCi0JCQlpZiAoTWVhc3VyZVJlcG9ydEluZm8uUmVwb3J0VHlwZSA9PSBSTV9CQVNJQykKLQkJCXsKLQkJCQlQTUVBU1VSRV9CQVNJQ19SRVBPUlQgcEJhc2ljUmVwb3J0ID0gKFBNRUFTVVJFX0JBU0lDX1JFUE9SVClwTWVhc3VyZVJlcG9ydEluZm87Ci0JCQkJaWYgKChwQmFzaWNSZXBvcnQtPk1hcC5maWVsZC5SYWRhcikKLQkJCQkJJiYgKERmc1JlcXVpcmVtZW50Q2hlY2socEFkLCBwQmFzaWNSZXBvcnQtPkNoTnVtKSA9PSBUUlVFKSkKLQkJCQl7Ci0JCQkJCU5vdGlmeUNoU3dBbm5Ub1BlZXJBUHMocEFkLCBwRnItPkhkci5BZGRyMSwgcEZyLT5IZHIuQWRkcjIsIDEsIHBCYXNpY1JlcG9ydC0+Q2hOdW0pOwotCQkJCQlTdGFydERGU1Byb2NlZHVyZShwQWQsIHBCYXNpY1JlcG9ydC0+Q2hOdW0sIDEpOwotCQkJCX0KLQkJCX0KLQkJfSB3aGlsZSAoRkFMU0UpOwotCX0KLQllbHNlCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWQgTWVhc3VyZW1lbnQgUmVwb3J0IEZyYW1lLlxuIikpOwotCi0Ja2ZyZWUocE1lYXN1cmVSZXBvcnRJbmZvKTsKLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlUUEMgUmVxdWVzdCBhY3Rpb24gZnJhbWUgaGFuZGxlci4KLQotCVBhcmFtZXRyczoKLQkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1zdGF0aWMgVk9JRCBQZWVyVHBjUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlQRlJBTUVfODAyXzExIHBGciA9IChQRlJBTUVfODAyXzExKUVsZW0tPk1zZzsKLQlQVUNIQVIgcEZyYW1lUHRyID0gcEZyLT5PY3RldDsKLQlVSU5UOCBEaWFsb2dUb2tlbjsKLQlVSU5UOCBUeFB3ciA9IEdldEN1clR4UHdyKHBBZCwgRWxlbS0+V2NpZCk7Ci0JVUlOVDggTGlua01hcmdpbiA9IDA7Ci0JQ0hBUiBSZWFsUnNzaTsKLQotCS8vIGxpbmsgbWFyZ2luOiBSYXRpbyBvZiB0aGUgcmVjZWl2ZWQgc2lnbmFsIHBvd2VyIHRvIHRoZSBtaW5pbXVtIGRlc2lyZWQgYnkgdGhlIHN0YXRpb24gKFNUQSkuIFRoZQotCS8vCQkJCVNUQSBtYXkgaW5jb3Jwb3JhdGUgcmF0ZSBpbmZvcm1hdGlvbiBhbmQgY2hhbm5lbCBjb25kaXRpb25zLCBpbmNsdWRpbmcgaW50ZXJmZXJlbmNlLCBpbnRvIGl0cyBjb21wdXRhdGlvbgotCS8vCQkJCW9mIGxpbmsgbWFyZ2luLgotCi0JUmVhbFJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKSwKLQkJCQkJCQkJQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpLAotCQkJCQkJCQlDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMikpOwotCi0JLy8gc2tpcCBDYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCi0JcEZyYW1lUHRyICs9IDI7Ci0KLQkvLyBEaWFsb2cgdG9rZW4uCi0JTmRpc01vdmVNZW1vcnkoJkRpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOwotCi0JTGlua01hcmdpbiA9IChSZWFsUnNzaSAvIE1JTl9SQ1ZfUFdSKTsKLQlpZiAoUGVlclRwY1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4pKQotCQlFbnF1ZXVlVFBDUmVwKHBBZCwgcEZyLT5IZHIuQWRkcjIsIERpYWxvZ1Rva2VuLCBUeFB3ciwgTGlua01hcmdpbik7Ci0KLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgaGFuZGxlci4KLQotCVBhcmFtZXRyczoKLQkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1zdGF0aWMgVk9JRCBQZWVyVHBjUmVwQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVSU5UOCBEaWFsb2dUb2tlbjsKLQlUUENfUkVQT1JUX0lORk8gVHBjUmVwSW5mbzsKLQlQVFBDX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOwotCi0JTmRpc1plcm9NZW1vcnkoJlRwY1JlcEluZm8sIHNpemVvZihUUENfUkVQT1JUX0lORk8pKTsKLQlpZiAoUGVlclRwY1JlcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4sICZUcGNSZXBJbmZvKSkKLQl7Ci0JCWlmICgocEVudHJ5ID0gVHBjUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pKSAhPSBOVUxMKQotCQl7Ci0JCQlUcGNSZXFEZWxldGUocEFkLCBwRW50cnktPkRpYWxvZ1Rva2VuKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBEaWFsb2dUb2tlbj0leCwgVHhQd3I9JWQsIExpbmtNYXJnaW49JWRcbiIsCi0JCQkJX19GVU5DVElPTl9fLCBEaWFsb2dUb2tlbiwgVHBjUmVwSW5mby5UeFB3ciwgVHBjUmVwSW5mby5MaW5rTWFyZ2luKSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJU3BlY3RydW4gYWN0aW9uIGZyYW1lcyBIYW5kbGVyIHN1Y2ggYXMgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQsCi0JCW1lYXN1cmVtZW50IHJlcG9ydCwgbWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb25zIGZyYW1lcy4KLQotCVBhcmFtZXRyczoKLQkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFBlZXJTcGVjdHJ1bUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0KLQlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKLQotCWlmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCAhPSBUUlVFKQotCQlyZXR1cm47Ci0KLQlzd2l0Y2goQWN0aW9uKQotCXsKLQkJY2FzZSBTUEVDX01SUToKLQkJCS8vIGN1cnJlbnQgcnQyODYwIHVuYWJsZSBkbyBzdWNoIG1lYXN1cmUgc3BlY2lmaWVkIGluIE1lYXN1cmVtZW50IFJlcXVlc3QuCi0JCQkvLyByZWplY3QgYWxsIG1lYXN1cmVtZW50IHJlcXVlc3QuCi0JCQlQZWVyTWVhc3VyZVJlcUFjdGlvbihwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTUEVDX01SUDoKLQkJCVBlZXJNZWFzdXJlUmVwb3J0QWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFNQRUNfVFBDUlE6Ci0JCQlQZWVyVHBjUmVxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFNQRUNfVFBDUlA6Ci0JCQlQZWVyVHBjUmVwQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFNQRUNfQ0hBTk5FTF9TV0lUQ0g6Ci0KLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0JCQl7Ci0JCQkJU0VDX0NIQV9PRkZTRVRfSUUJU2Vjb25kYXJ5OwotCQkJCUNIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUJQ2hhbm5lbFN3aXRjaDsKLQotCQkJCS8vIDgwMi4xMWggb25seSBoYXMgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IElFLgotCQkJCVJUTVBNb3ZlTWVtb3J5KCZDaGFubmVsU3dpdGNoLCAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErNF0sIHNpemVvZiAoQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRSkpOwotCi0JCQkJLy8gODAyLjExbiBEMy4wMyBhZGRzIHNlY29uZGFyeSBjaGFubmVsIG9mZnNldCBlbGVtZW50IGluIHRoZSBlbmQuCi0JCQkJaWYgKEVsZW0tPk1zZ0xlbiA9PSAgKExFTkdUSF84MDJfMTEgKyAyICsgc2l6ZW9mIChDSEFfU1dJVENIX0FOTk9VTkNFX0lFKSArIHNpemVvZiAoU0VDX0NIQV9PRkZTRVRfSUUpKSkKLQkJCQl7Ci0JCQkJCVJUTVBNb3ZlTWVtb3J5KCZTZWNvbmRhcnksICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSs5XSwgc2l6ZW9mIChTRUNfQ0hBX09GRlNFVF9JRSkpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlTZWNvbmRhcnkuU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9IDA7Ci0JCQkJfQotCi0JCQkJaWYgKChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsyXSA9PSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQpICYmIChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSszXSA9PSAzKSkKLQkJCQl7Ci0JCQkJCUNoYW5uZWxTd2l0Y2hBY3Rpb24ocEFkLCBFbGVtLT5XY2lkLCBDaGFubmVsU3dpdGNoLk5ld0NoYW5uZWwsIFNlY29uZGFyeS5TZWNvbmRhcnlDaGFubmVsT2Zmc2V0KTsKLQkJCQl9Ci0JCQl9Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotCi0JCQlQZWVyQ2hTd0FubkFjdGlvbihwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlQYXJhbWV0cnM6Ci0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUlOVCBTZXRfTWVhc3VyZVJlcV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUlOVCBBaWQgPSAxOwotCVVJTlQgQXJnSWR4OwotCVBTVFJJTkcgdGhpc0NoYXI7Ci0KLQlNRUFTVVJFX1JFUV9NT0RFIE1lYXN1cmVSZXFNb2RlOwotCVVJTlQ4IE1lYXN1cmVSZXFUb2tlbiA9IFJhbmRvbUJ5dGUocEFkKTsKLQlVSU5UOCBNZWFzdXJlUmVxVHlwZSA9IFJNX0JBU0lDOwotCVVJTlQ4IE1lYXN1cmVDaCA9IDE7Ci0JVUlOVDY0IE1lYXN1cmVTdGFydFRpbWUgPSBHZXRDdXJyZW50VGltZVN0YW1wKHBBZCk7Ci0JTUVBU1VSRV9SRVEgTWVhc3VyZVJlcTsKLQlVSU5UOCBUb3RhbExlbjsKLQotCUhFQURFUl84MDJfMTEgQWN0SGRyOwotCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyBOU3RhdHVzOwotCVVMT05HIEZyYW1lTGVuOwotCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCWdvdG8gRU5EX09GX01FQVNVUkVfUkVROwotCX0KLQotCUFyZ0lkeCA9IDE7Ci0Jd2hpbGUgKCh0aGlzQ2hhciA9IHN0cnNlcCgoY2hhciAqKikmYXJnLCAiLSIpKSAhPSBOVUxMKQotCXsKLQkJc3dpdGNoKEFyZ0lkeCkKLQkJewotCQkJY2FzZSAxOgkvLyBBaWQuCi0JCQkJQWlkID0gKFVJTlQ4KSBzaW1wbGVfc3RydG9sKHRoaXNDaGFyLCAwLCAxNik7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgMjogLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBUeXBlLgotCQkJCU1lYXN1cmVSZXFUeXBlID0gc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOwotCQkJCWlmIChNZWFzdXJlUmVxVHlwZSA+IDMpCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5rbm93IE1lYXN1cmVSZXFUeXBlKCVkKVxuIiwgX19GVU5DVElPTl9fLCBNZWFzdXJlUmVxVHlwZSkpOwotCQkJCQlnb3RvIEVORF9PRl9NRUFTVVJFX1JFUTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgMzogLy8gTWVhc3VyZW1lbnQgY2hhbm5lbC4KLQkJCQlNZWFzdXJlQ2ggPSAoVUlOVDgpIHNpbXBsZV9zdHJ0b2wodGhpc0NoYXIsIDAsIDE2KTsKLQkJCQlicmVhazsKLQkJfQotCQlBcmdJZHgrKzsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6QWlkID0gJWQsIE1lYXN1cmVSZXFUeXBlPSVkIE1lYXN1cmVDaD0lZFxuIiwgX19GVU5DVElPTl9fLCBBaWQsIE1lYXN1cmVSZXFUeXBlLCBNZWFzdXJlQ2gpKTsKLQlpZiAoIVZBTElEX1dDSUQoQWlkKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgc3RhIG9mIEFpZCglZClcbiIsIF9fRlVOQ1RJT05fXywgQWlkKSk7Ci0JCWdvdG8gRU5EX09GX01FQVNVUkVfUkVROwotCX0KLQotCU1lYXN1cmVSZXFNb2RlLndvcmQgPSAwOwotCU1lYXN1cmVSZXFNb2RlLmZpZWxkLkVuYWJsZSA9IDE7Ci0KLQlNZWFzdXJlUmVxSW5zZXJ0KHBBZCwgTWVhc3VyZVJlcVRva2VuKTsKLQotCS8vIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuCi0JTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uQWRkciwKLQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOwotCi0JTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0KLQlUb3RhbExlbiA9IHNpemVvZihNRUFTVVJFX1JFUV9JTkZPKSArIHNpemVvZihNRUFTVVJFX1JFUSk7Ci0KLQlNYWtlTWVhc3VyZW1lbnRSZXFGcmFtZShwQWQsIHBPdXRCdWZmZXIsICZGcmFtZUxlbiwKLQkJc2l6ZW9mKE1FQVNVUkVfUkVRX0lORk8pLCBDQVRFR09SWV9STSwgUk1fQkFTSUMsCi0JCU1lYXN1cmVSZXFUb2tlbiwgTWVhc3VyZVJlcU1vZGUud29yZCwKLQkJTWVhc3VyZVJlcVR5cGUsIDApOwotCi0JTWVhc3VyZVJlcS5DaE51bSA9IE1lYXN1cmVDaDsKLQlNZWFzdXJlUmVxLk1lYXN1cmVTdGFydFRpbWUgPSBjcHUybGU2NChNZWFzdXJlU3RhcnRUaW1lKTsKLQlNZWFzdXJlUmVxLk1lYXN1cmVEdXJhdGlvbiA9IGNwdTJsZTE2KDIwMDApOwotCi0JewotCQlVTE9ORyBUZW1wTGVuOwotCQlNYWtlT3V0Z29pbmdGcmFtZSgJcE91dEJ1ZmZlcitGcmFtZUxlbiwJJlRlbXBMZW4sCi0JCQkJCQkJc2l6ZW9mKE1FQVNVUkVfUkVRKSwJJk1lYXN1cmVSZXEsCi0JCQkJCQkJRU5EX09GX0FSR1MpOwotCQlGcmFtZUxlbiArPSBUZW1wTGVuOwotCX0KLQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCAoVUlOVClGcmFtZUxlbik7Ci0KLUVORF9PRl9NRUFTVVJFX1JFUToKLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVCBTZXRfVHBjUmVxX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVSU5UIEFpZDsKLQotCVVJTlQ4IFRwY1JlcVRva2VuID0gUmFuZG9tQnl0ZShwQWQpOwotCi0JQWlkID0gKFVJTlQpIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6QWlkID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgQWlkKSk7Ci0JaWYgKCFWQUxJRF9XQ0lEKEFpZCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5rbm93IHN0YSBvZiBBaWQoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIEFpZCkpOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlUcGNSZXFJbnNlcnQocEFkLCBUcGNSZXFUb2tlbik7Ci0KLQlFbnF1ZXVlVFBDUmVxKHBBZCwgcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLkFkZHIsIFRwY1JlcVRva2VuKTsKLQotCXJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb25maWcubWsgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbmZpZy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM5MGM0MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbmZpZy5taworKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0jIFN1cHBvcnQgQVRFIGZ1bmN0aW9uCi1IQVNfQVRFPXkKLQotIyBTdXBwb3J0IDI4eHggUUEgQVRFIGZ1bmN0aW9uCi1IQVNfMjh4eF9RQT1uCi0KLQotSEFTX05JTlRFTkRPPW4KLQotIyBTdXBwb3J0IExMVEQgZnVuY3Rpb24KLUhBU19MTFREPW4KLQotIyBTdXBwb3J0IFdEUyBmdW5jdGlvbgotSEFTX1dEUz1uCi0KLSMgU3VwcG9ydCBBUC1DbGllbnQgZnVuY3Rpb24KLUhBU19BUENMST1uCi0KLSMgU3VwcG9ydCBXcGFfU3VwcGxpY2FudAotSEFTX1dQQV9TVVBQTElDQU5UPXkKLQotIyBTdXBwb3J0IE5hdGl2ZSBXcGFTdXBwbGljYW50IGZvciBOZXR3b3JrIE1hZ2FuZ2VyCi1IQVNfTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQ9eQotCi0jU3VwcG9ydCBOZXQgaW50ZXJmYWNlIGJsb2NrIHdoaWxlIFR4LVN3IHF1ZXVlIGZ1bGwKLUhBU19CTE9DS19ORVRfSUY9bgotCi0jU3VwcG9ydCBJR01QLVNub29waW5nIGZ1bmN0aW9uLgotSEFTX0lHTVBfU05PT1BfU1VQUE9SVD1uCi0KLSNTdXBwb3J0IERGUyBmdW5jdGlvbgotSEFTX0RGU19TVVBQT1JUPW4KLQotI1N1cHBvcnQgQ2Fycmllci1TZW5zZSBmdW5jdGlvbgotSEFTX0NTX1NVUFBPUlQ9bgotCi0jIFN1cHBvcnQgZm9yIFNUQSBFdGhlcm5ldCBDb252ZXJ0ZXIKLUhBU19FVEhfQ09OVkVSVF9TVVBQT1JUPW4KLQotIyBTdXBwb3J0IHVzZXIgc3BlY2lmaWMgdHJhbnNtaXQgcmF0ZSBvZiBNdWx0aWNhc3QgcGFja2V0LgotSEFTX01DQVNUX1JBVEVfU1BFQ0lGSUNfU1VQUE9SVD1uCi0KLSMgU3VwcG9ydCBmb3IgTXVsdGlwbGUgQ2FyZHMKLUhBU19NQ19TVVBQT1JUPW4KLQotI1N1cHBvcnQgZm9yIFBDSS1NU0kKLUhBU19NU0lfU1VQUE9SVD1uCi0KLQotI1N1cHBvcnQgZm9yIElFRUU4MDIuMTFlIERMUwotSEFTX1FPU19ETFNfU1VQUE9SVD1uCi0KLSNTdXBwb3J0IGZvciBFWFRfQ0hBTk5FTAotSEFTX0VYVF9CVUlMRF9DSEFOTkVMX0xJU1Q9bgotCi0jU3VwcG9ydCBmb3IgSURTCi1IQVNfSURTX1NVUFBPUlQ9bgotCi0KLSNTdXBwb3J0IGZvciBOZXQtU05NUAotSEFTX1NOTVBfU1VQUE9SVD1uCi0KLSNTdXBwb3J0IGZlYXR1cmVzIG9mIDgwMi4xMW4gRHJhZnQzCi1IQVNfRE9UMTFOX0RSQUZUM19TVVBQT1JUPW4KLQotI1N1cHBvcnQgZmVhdHVyZXMgb2YgU2luZ2xlIFNLVS4KLUhBU19TSU5HTEVfU0tVX1NVUFBPUlQ9bgotCi0jU3VwcG9ydCBmZWF0dXJlcyBvZiA4MDIuMTFuCi1IQVNfRE9UMTFfTl9TVVBQT1JUPXkKLQotCi0KLSNTdXBwb3J0IGZvciAyODYwLzI4ODAgY28tZXhpc3QKLUhBU19SVDI4ODBfUlQyODYwX0NPRVhJU1Q9bgotCi1IQVNfS1RIUkVBRF9TVVBQT1JUPW4KLQotCi0jU3VwcG9ydCBmb3IgQXV0byBjaGFubmVsIHNlbGVjdCBlbmhhbmNlCi1IQVNfQVVUT19DSF9TRUxFQ1RfRU5IQU5DRT1uCi0KLSNTdXBwb3J0IGJ5cGFzcyBicmlkZ2UKLUhBU19CR19GVF9TVVBQT1JUPW4KLQotI1N1cHBvcnQgQW50ZW5uYSBEaXZlcnNpdHkKLUhBU19BTlRFTk5BX0RJVkVSU0lUWV9TVVBQT1JUPXkKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotV0ZMQUdTIDo9IC1EQUdHUkVHQVRJT05fU1VQUE9SVCAtRFBJR0dZQkFDS19TVVBQT1JUIC1EV01NX1NVUFBPUlQgIC1ETElOVVggLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyAtV3BvaW50ZXItc2lnbgotCi1pZmVxICgkKEhBU19LVEhSRUFEX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURLVEhSRUFEX1NVUFBPUlQKLWVuZGlmCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGNvbmZpZyBmb3IgU1RBIG1vZGUKLQotV0ZMQUdTICs9IC1EQ09ORklHX1NUQV9TVVBQT1JUIC1EREJHCi0KLWlmZXEgKCQoSEFTX1dQQV9TVVBQTElDQU5UKSx5KQotV0ZMQUdTICs9IC1EV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotaWZlcSAoJChIQVNfTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLUROQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotZW5kaWYKLWVuZGlmCi0KLQotaWZlcSAoJChIQVNfRVRIX0NPTlZFUlRfU1VQUE9SVCksIHkpCi1XRkxBR1MgKz0gLURFVEhfQ09OVkVSVF9TVVBQT1JUICAtRE1BVF9TVVBQT1JUCi1lbmRpZgotCi1pZmVxICgkKEhBU19BVEUpLHkpCi1XRkxBR1MgKz0gLURSQUxJTktfQVRFCi1pZmVxICgkKEhBU18yOHh4X1FBKSx5KQotV0ZMQUdTICs9IC1EUkFMSU5LXzI4eHhfUUEKLWVuZGlmCi1lbmRpZgotCi0KLWlmZXEgKCQoSEFTX1NOTVBfU1VQUE9SVCkseSkKLVdGTEFHUyArPSAtRFNOTVBfU1VQUE9SVAotZW5kaWYKLQotaWZlcSAoJChIQVNfUU9TX0RMU19TVVBQT1JUKSx5KQotV0ZMQUdTICs9IC1EUU9TX0RMU19TVVBQT1JUCi1lbmRpZgotCi1pZmVxICgkKEhBU19ET1QxMV9OX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURET1QxMV9OX1NVUFBPUlQKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX0NTX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCi1lbmRpZgotCi1pZmVxICgkKEhBU19BTlRFTk5BX0RJVkVSU0lUWV9TVVBQT1JUKSx5KQotV0ZMQUdTICs9IC1EQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi1lbmRpZgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBDb21tb24gY29tcGlsZXIgZmxhZwotIwotCi0KLQotCi0KLWlmZXEgKCQoSEFTX0VYVF9CVUlMRF9DSEFOTkVMX0xJU1QpLHkpCi1XRkxBR1MgKz0gLURFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi1lbmRpZgotCi1pZmVxICgkKEhBU19JRFNfU1VQUE9SVCkseSkKLVdGTEFHUyArPSAtRElEU19TVVBQT1JUCi1lbmRpZgotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ2hpcFNldCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KLSMKLVdGTEFHUyArPS1EUlRNUF9NQUNfUENJIC1EUlQzMHh4IC1EUlQzMDkwICAtRFJUTVBfUENJX1NVUFBPUlQgLURSVE1QX1JGX1JXX1NVUFBPUlQgLURSVE1QX0VGVVNFX1NVUFBPUlQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotCi1pZmVxICgkKEhBU19CTE9DS19ORVRfSUYpLHkpCi1XRkxBR1MgKz0gLURCTE9DS19ORVRfSUYKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX0RGU19TVVBQT1JUKSx5KQotV0ZMQUdTICs9IC1EREZTX1NVUFBPUlQKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX01DX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURNVUxUSVBMRV9DQVJEX1NVUFBPUlQKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX0xMVEQpLHkpCi1XRkxBR1MgKz0gLURMTFREX1NVUFBPUlQKLWVuZGlmCi0KLUVYVFJBX0NGTEFHUyA6PSAkKFdGTEFHUykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY3J5cHRfaG1hYy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jcnlwdF9obWFjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1N2NhNzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jcnlwdF9obWFjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIGNyeXB0X2htYWMuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEVkZHkgICAgICAgIDIwMDgvMTEvMjQgICAgICBDcmVhdGUgSE1BQy1TSEExLCBITUFDLVNIQTI1NgotKi8KLQotI2lmbmRlZiBfX0NSWVBUX0hNQUNfSF9fCi0jZGVmaW5lIF9fQ1JZUFRfSE1BQ19IX18KLQotI2lmZGVmIENSWVBUX1RFU1RQTEFOCi0jaW5jbHVkZSAiY3J5cHRfdGVzdHBsYW4uaCIKLSNlbHNlCi0jaW5jbHVkZSAicnRfY29uZmlnLmgiCi0jZW5kaWYgLyogQ1JZUFRfVEVTVFBMQU4gKi8KLQotI2lmZGVmIFNIQTFfU1VQUE9SVAotI2RlZmluZSBITUFDX1NIQTFfU1VQUE9SVAotVk9JRCBITUFDX1NIQTEgKAotICAgIElOICBjb25zdCBVSU5UOCBLZXlbXSwKLSAgICBJTiAgVUlOVCBLZXlMZW4sCi0gICAgSU4gIGNvbnN0IFVJTlQ4IE1lc3NhZ2VbXSwKLSAgICBJTiAgVUlOVCBNZXNzYWdlTGVuLAotICAgIE9VVCBVSU5UOCBNQUNbXSwKLSAgICBJTiAgVUlOVCBNQUNMZW4pOwotI2VuZGlmIC8qIFNIQTFfU1VQUE9SVCAqLwotCi0jaWZkZWYgU0hBMjU2X1NVUFBPUlQKLSNkZWZpbmUgSE1BQ19TSEEyNTZfU1VQUE9SVAotVk9JRCBITUFDX1NIQTI1NiAoCi0gICAgSU4gIGNvbnN0IFVJTlQ4IEtleVtdLAotICAgIElOICBVSU5UIEtleUxlbiwKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4sCi0gICAgT1VUIFVJTlQ4IE1BQ1tdLAotICAgIElOICBVSU5UIE1BQ0xlbik7Ci0jZW5kaWYgLyogU0hBMjU2X1NVUFBPUlQgKi8KLQotI2lmZGVmIE1ENV9TVVBQT1JUCi0jZGVmaW5lIEhNQUNfTUQ1X1NVUFBPUlQKLVZPSUQgSE1BQ19NRDUgKAotICAgIElOICBjb25zdCBVSU5UOCBLZXlbXSwKLSAgICBJTiAgVUlOVCBLZXlMZW4sCi0gICAgSU4gIGNvbnN0IFVJTlQ4IE1lc3NhZ2VbXSwKLSAgICBJTiAgVUlOVCBNZXNzYWdlTGVuLAotICAgIE9VVCBVSU5UOCBNQUNbXSwKLSAgICBJTiAgVUlOVCBNQUNMZW4pOwotI2VuZGlmIC8qIE1ENV9TVVBQT1JUICovCi0KLSNlbmRpZiAvKiBfX0NSWVBUX0hNQUNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NyeXB0X21kNS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jcnlwdF9tZDUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VlM2Y0Mi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NyeXB0X21kNS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBjcnlwdF9tZDUuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEVkZHkgICAgICAgIDIwMDgvMTEvMjQgICAgICBDcmVhdGUgbWQ1Ci0qLwotCi0jaWZuZGVmIF9fQ1JZUFRfTUQ1X0hfXwotI2RlZmluZSBfX0NSWVBUX01ENV9IX18KLQotI2lmZGVmIENSWVBUX1RFU1RQTEFOCi0jaW5jbHVkZSAiY3J5cHRfdGVzdHBsYW4uaCIKLSNlbHNlCi0jaW5jbHVkZSAicnRfY29uZmlnLmgiCi0jZW5kaWYgLyogQ1JZUFRfVEVTVFBMQU4gKi8KLQotLyogQWxnb3JpdGhtIG9wdGlvbnMgKi8KLSNkZWZpbmUgTUQ1X1NVUFBPUlQKLQotI2lmZGVmIE1ENV9TVVBQT1JUCi0jZGVmaW5lIE1ENV9CTE9DS19TSVpFICAgIDY0IC8qIDUxMiBiaXRzID0gNjQgYnl0ZXMgKi8KLSNkZWZpbmUgTUQ1X0RJR0VTVF9TSVpFICAgMTYgLyogMTI4IGJpdHMgPSAxNiBieXRlcyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVJTlQzMiBIYXNoVmFsdWVbNF07Ci0gICAgVUlOVDY0IE1lc3NhZ2VMZW47Ci0gICAgVUlOVDggIEJsb2NrW01ENV9CTE9DS19TSVpFXTsKLSAgICBVSU5UICAgQmxvY2tMZW47Ci19IE1ENV9DVFhfU1RSVUMsICpQTUQ1X0NUWF9TVFJVQzsKLQotVk9JRCBNRDVfSW5pdCAoCi0gICAgSU4gIE1ENV9DVFhfU1RSVUMgKnBNRDVfQ1RYKTsKLVZPSUQgTUQ1X0hhc2ggKAotICAgIElOICBNRDVfQ1RYX1NUUlVDICpwTUQ1X0NUWCk7Ci1WT0lEIE1ENV9BcHBlbmQgKAotICAgIElOICBNRDVfQ1RYX1NUUlVDICpwTUQ1X0NUWCwKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4pOwotVk9JRCBNRDVfRW5kICgKLSAgICBJTiAgTUQ1X0NUWF9TVFJVQyAqcE1ENV9DVFgsCi0gICAgT1VUIFVJTlQ4IERpZ2VzdE1lc3NhZ2VbXSk7Ci1WT0lEIFJUX01ENSAoCi0gICAgSU4gIGNvbnN0IFVJTlQ4IE1lc3NhZ2VbXSwKLSAgICBJTiAgVUlOVCBNZXNzYWdlTGVuLAotICAgIE9VVCBVSU5UOCBEaWdlc3RNZXNzYWdlW10pOwotI2VuZGlmIC8qIE1ENV9TVVBQT1JUICovCi0KLSNlbmRpZiAvKiBfX0NSWVBUX01ENV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY3J5cHRfc2hhMi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jcnlwdF9zaGEyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YzA0MDMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jcnlwdF9zaGEyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBjcnlwdF9zaGEyLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBFZGR5ICAgICAgICAyMDA4LzExLzI0ICAgICAgQ3JlYXRlIFNIQTEKLSAgICBFZGR5ICAgICAgICAyMDA4LzA3LzIzICAgICAgQ3JlYXRlIFNIQTI1NgotKi8KLQotI2lmbmRlZiBfX0NSWVBUX1NIQTJfSF9fCi0jZGVmaW5lIF9fQ1JZUFRfU0hBMl9IX18KLQotI2lmZGVmIENSWVBUX1RFU1RQTEFOCi0jaW5jbHVkZSAiY3J5cHRfdGVzdHBsYW4uaCIKLSNlbHNlCi0jaW5jbHVkZSAicnRfY29uZmlnLmgiCi0jZW5kaWYgLyogQ1JZUFRfVEVTVFBMQU4gKi8KLQotLyogQWxnb3JpdGhtIG9wdGlvbnMgKi8KLSNkZWZpbmUgU0hBMV9TVVBQT1JUCi0jZGVmaW5lIFNIQTI1Nl9TVVBQT1JUCi0KLSNpZmRlZiBTSEExX1NVUFBPUlQKLSNkZWZpbmUgU0hBMV9CTE9DS19TSVpFICAgIDY0IC8qIDUxMiBiaXRzID0gNjQgYnl0ZXMgKi8KLSNkZWZpbmUgU0hBMV9ESUdFU1RfU0laRSAgIDIwIC8qIDE2MCBiaXRzID0gMjAgYnl0ZXMgKi8KLXR5cGVkZWYgc3RydWN0IF9TSEExX0NUWF9TVFJVQyB7Ci0gICAgVUlOVDMyIEhhc2hWYWx1ZVs1XTsgIC8qIDUgPSAoU0hBMV9ESUdFU1RfU0laRSAvIDMyKSAqLwotICAgIFVJTlQ2NCBNZXNzYWdlTGVuOyAgICAvKiB0b3RhbCBzaXplICovCi0gICAgVUlOVDggIEJsb2NrW1NIQTFfQkxPQ0tfU0laRV07Ci0gICAgVUlOVCAgIEJsb2NrTGVuOwotfSBTSEExX0NUWF9TVFJVQywgKlBTSEExX0NUWF9TVFJVQzsKLQotVk9JRCBTSEExX0luaXQgKAotICAgIElOICBTSEExX0NUWF9TVFJVQyAqcFNIQV9DVFgpOwotVk9JRCBTSEExX0hhc2ggKAotICAgIElOICBTSEExX0NUWF9TVFJVQyAqcFNIQV9DVFgpOwotVk9JRCBTSEExX0FwcGVuZCAoCi0gICAgSU4gIFNIQTFfQ1RYX1NUUlVDICpwU0hBX0NUWCwKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4pOwotVk9JRCBTSEExX0VuZCAoCi0gICAgSU4gIFNIQTFfQ1RYX1NUUlVDICpwU0hBX0NUWCwKLSAgICBPVVQgVUlOVDggRGlnZXN0TWVzc2FnZVtdKTsKLVZPSUQgUlRfU0hBMSAoCi0gICAgSU4gIGNvbnN0IFVJTlQ4IE1lc3NhZ2VbXSwKLSAgICBJTiAgVUlOVCBNZXNzYWdlTGVuLAotICAgIE9VVCBVSU5UOCBEaWdlc3RNZXNzYWdlW10pOwotI2VuZGlmIC8qIFNIQTFfU1VQUE9SVCAqLwotCi0jaWZkZWYgU0hBMjU2X1NVUFBPUlQKLSNkZWZpbmUgU0hBMjU2X0JMT0NLX1NJWkUgICA2NCAvKiA1MTIgYml0cyA9IDY0IGJ5dGVzICovCi0jZGVmaW5lIFNIQTI1Nl9ESUdFU1RfU0laRSAgMzIgLyogMjU2IGJpdHMgPSAzMiBieXRlcyAqLwotdHlwZWRlZiBzdHJ1Y3QgX1NIQTI1Nl9DVFhfU1RSVUMgewotICAgIFVJTlQzMiBIYXNoVmFsdWVbOF07ICAvKiA4ID0gKFNIQTI1Nl9ESUdFU1RfU0laRSAvIDMyKSAqLwotICAgIFVJTlQ2NCBNZXNzYWdlTGVuOyAgICAvKiB0b3RhbCBzaXplICovCi0gICAgVUlOVDggIEJsb2NrW1NIQTI1Nl9CTE9DS19TSVpFXTsKLSAgICBVSU5UICAgQmxvY2tMZW47Ci19IFNIQTI1Nl9DVFhfU1RSVUMsICpQU0hBMjU2X0NUWF9TVFJVQzsKLQotVk9JRCBTSEEyNTZfSW5pdCAoCi0gICAgSU4gIFNIQTI1Nl9DVFhfU1RSVUMgKnBTSEFfQ1RYKTsKLVZPSUQgU0hBMjU2X0hhc2ggKAotICAgIElOICBTSEEyNTZfQ1RYX1NUUlVDICpwU0hBX0NUWCk7Ci1WT0lEIFNIQTI1Nl9BcHBlbmQgKAotICAgIElOICBTSEEyNTZfQ1RYX1NUUlVDICpwU0hBX0NUWCwKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4pOwotVk9JRCBTSEEyNTZfRW5kICgKLSAgICBJTiAgU0hBMjU2X0NUWF9TVFJVQyAqcFNIQV9DVFgsCi0gICAgT1VUIFVJTlQ4IERpZ2VzdE1lc3NhZ2VbXSk7Ci1WT0lEIFJUX1NIQTI1NiAoCi0gICAgSU4gIGNvbnN0IFVJTlQ4IE1lc3NhZ2VbXSwKLSAgICBJTiAgVUlOVCBNZXNzYWdlTGVuLAotICAgIE9VVCBVSU5UOCBEaWdlc3RNZXNzYWdlW10pOwotI2VuZGlmIC8qIFNIQTI1Nl9TVVBQT1JUICovCi0KLSNlbmRpZiAvKiBfX0NSWVBUX1NIQTJfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2Rmcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9kZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2NDY4ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2Rmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgZGZzLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBGb25jaGkgICAgMDMtMTItMjAwNyAgICAgIGNyZWF0ZWQKLSovCi0KLSNkZWZpbmUgUkFEQVJfUFVMU0UgMQotI2RlZmluZSBSQURBUl9XSURUSCAyCi0KLSNkZWZpbmUgV0lEVEhfUkRfSURMRSAwCi0jZGVmaW5lIFdJRFRIX1JEX0NIRUNLIDEKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKglERlMgUmFkYXIgcmVsYXRlZCBkZWZpbml0aW9ucy4KLSAgKgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyNkZWZpbmUgQ0FSUklFUl9ERVRFQ1RfVEFTS19OVU0JNgotLy8jZGVmaW5lIFJBREFSX0RFVEVDVF9UQVNLX05VTQk3Ci0KLS8vIE1jdVJhZGFyU3RhdGUgJiYgTWN1Q2FycmllclN0YXRlIGZvciAyODgwLVNXLU1DVQotI2RlZmluZSBGUkVFX0ZPUl9UWAkJCQkwCi0jZGVmaW5lIFdBSVRfQ1RTX0JFSU5HX1NFTlQJCTEKLSNkZWZpbmUgRE9fREVURUNUSU9OCQkJMgotCi0vLyBNY3VSYWRhckV2ZW50Ci0jZGVmaW5lIFJBREFSX0VWRU5UX0NUU19TRU5UCQkJMHgwMSAvLyBIb3N0IHNpZ25hbCBNQ1UgdGhhdCBDVFMgaGFzIGJlZW4gc2VudAotI2RlZmluZSBSQURBUl9FVkVOVF9DVFNfQ0FSUklFUl9TRU5UCTB4MDIgLy8gSG9zdCBzaWduYWwgTUNVIHRoYXQgQ1RTIGhhcyBiZWVuIHNlbnQgKENhcnJpZXIpCi0jZGVmaW5lIFJBREFSX0VWRU5UX1JBREFSX0RFVEVDVElORwkJMHgwNCAvLyBSYWRhciBkZXRlY3Rpb24gaXMgb24gZ29pbmcsIGNhcnJpZXIgZGV0ZWN0aW9uIGhvbGQgYmFjawotI2RlZmluZSBSQURBUl9FVkVOVF9DQVJSSUVSX0RFVEVDVElORwkweDA4IC8vIENhcnJpZXIgZGV0ZWN0aW9uIGlzIG9uIGdvaW5nLCByYWRhciBkZXRlY3Rpb24gaG9sZCBiYWNrCi0jZGVmaW5lIFJBREFSX0VWRU5UX1dJRFRIX1JBREFSCQkJMHgxMCAvLyBCQlAgPT0gMiByYWRhciBkZXRlY3RlZAotI2RlZmluZSBSQURBUl9FVkVOVF9DVFNfS0lDS0VECQkJMHgyMCAvLyBSYWRhciBkZXRlY3Rpb24gbmVlZCB0byBzZW50IGRvdWJsZSBDVFMsIGZpcnN0IENUUyBzZW50Ci0KLS8vIE1jdVJhZGFyQ21kCi0jZGVmaW5lIERFVEVDVElPTl9TVE9QCQkJMAotI2RlZmluZSBSQURBUl9ERVRFQ1RJT04JCQkxCi0jZGVmaW5lIENBUlJJRVJfREVURUNUSU9OCQkyCi0KLQotCi0jaWZkZWYgVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVAotSU5UIFNldF9DYXJyaWVyQ3JpdGVyaWFfUHJvYyhJTiBQUlRNUF9BREFQVEVSIHBBZCwgSU4gUFNUUklORyBhcmcpOwotaW50IFNldF9DYXJyaWVyUmVDaGVja19Qcm9jKElOIFBSVE1QX0FEQVBURVIgcEFkLCBJTiBQU1RSSU5HIGFyZyk7Ci1JTlQgU2V0X0NhcnJpZXJTdG9wQ2hlY2tfUHJvYyhJTiBQUlRNUF9BREFQVEVSIHBBZCwgSU4gUFNUUklORyBhcmcpOwotdm9pZCBOZXdDYXJyaWVyRGV0ZWN0aW9uU3RhcnQoUFJUTVBfQURBUFRFUiBwQWQpOwotdm9pZCBSVE1QSGFuZGxlUmFkYXJJbnRlcnJ1cHQoUFJUTVBfQURBUFRFUiAgcEFkKTsKLVZPSUQgQ1NBc2ljRGlzYWJsZVN5bmMoSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotI2VuZGlmIC8vIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQgLy8KLQotCi1WT0lEIEJicFJhZGFyRGV0ZWN0aW9uU3RhcnQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIEJicFJhZGFyRGV0ZWN0aW9uU3RvcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgUmFkYXJEZXRlY3Rpb25TdGFydCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOIENUU19Qcm90ZWN0LAotCUlOIFVJTlQ4IENUU1BlcmlvZCk7Ci0KLVZPSUQgUmFkYXJEZXRlY3Rpb25TdG9wKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBSYWRhckRldGVjdFBlcmlvZGljKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotCi1CT09MRUFOIFJhZGFyQ2hhbm5lbENoZWNrKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJQ2gpOwotCi1VTE9ORyBKYXBSYWRhclR5cGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1VTE9ORyBSVE1QQmJwUmVhZFJhZGFyRHVyYXRpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1VTE9ORyBSVE1QUmVhZFJhZGFyRHVyYXRpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFJUTVBDbGVhblJhZGFyRHVyYXRpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFJUTVBQcmVwYXJlUkRDVFNGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwREEsCi0JSU4JVUxPTkcJCQlEdXJhdGlvbiwKLQlJTiAgVUNIQVIgICAgICAgICAgIFJUU1JhdGUsCi0JSU4gIFVMT05HICAgICAgICAgICBDVFNCYXNlQWRkciwKLQlJTiAgVUNIQVIJCQlGcmFtZUdhcCk7Ci0KLVZPSUQgUlRNUFByZXBhcmVSYWRhckRldGVjdFBhcmFtcygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLQotSU5UIFNldF9DaE1vdmluZ1RpbWVfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQU1RSSU5HIGFyZyk7Ci0KLUlOVCBTZXRfTG9uZ1B1bHNlUmFkYXJUaF9Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBTVFJJTkcgYXJnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvZWVwcm9tLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2VlcHJvbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTBlODA3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvZWVwcm9tLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIGVlcHJvbS5oCi0KLSAgICBBYnN0cmFjdDoKLSAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotI2lmbmRlZiBfX0VFUFJPTV9IX18KLSNkZWZpbmUgX19FRVBST01fSF9fCi0KLQotCi0jaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKglQdWJsaWMgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGZvciBwcm9tLWJhc2VkIGNoaXBzZXQKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHJ0bXBfZWVfcHJvbV9yZWFkMTYoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVVNIT1JUCQkJT2Zmc2V0LAotCU9VVCBVU0hPUlQJCQkqcFZhbHVlKTsKLQotaW50IHJ0bXBfZWVfcHJvbV93cml0ZTE2KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVTSE9SVAkJCU9mZnNldCwKLQlJTiBVU0hPUlQJCQl2YWx1ZSk7Ci0jZW5kaWYgLy8gUlRNUF9QQ0lfU1VQUE9SVCAvLwotCi0KLQotCi0KLSNpZmRlZiBSVDMweHgKLSNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKLWludCBydG1wX2VlX2VmdXNlX3JlYWQxNigKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBVU0hPUlQgT2Zmc2V0LAotCU9VVCBVU0hPUlQgKnBWYWx1ZSk7Ci0KLWludCBydG1wX2VlX2VmdXNlX3dyaXRlMTYoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVVNIT1JUIE9mZnNldCwKLQlJTiBVU0hPUlQgZGF0YSk7Ci0jZW5kaWYgLy8gUlRNUF9FRlVTRV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoJUHVibGljIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBmb3IgcHJvbSBvcGVyYXRpb24gY2FsbGJhY2sgZnVuY3Rpb25zIHNldHRpbmcKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UIFJ0bXBDaGlwT3BzRWVwcm9tSG9vaygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBJTlQJCQlpbmZUeXBlKTsKLQotI2VuZGlmIC8vIF9fRUVQUk9NX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9maXJtd2FyZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9maXJtd2FyZS5oCmluZGV4IGYyODM2YTIuLjE3MDU2ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvZmlybXdhcmUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2Zpcm13YXJlLmgKQEAgLTIsNyArMiw3IEBACiAvKiBBVVRPIEdFTiBQTEVBU0UgRE8gTk9UIE1PRElGWSBJVCAqLwogCiAKLVVDSEFSIEZpcm13YXJlSW1hZ2UgW10gPSB7Cit1OCBGaXJtd2FyZUltYWdlXzMwOTAgW10gPSB7CiAweDAyLCAweDAyLCAweGYzLCAweDAyLCAweDAyLCAweGExLCAweDIyLCAweDIyLCAweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDAxLCAweDI3LCAweGZmLCAweGZmLAogMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgwMCwgMHgxZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgwMCwgMHhkOCwgMHhjMCwgMHhlMCwKIDB4YzAsIDB4ZjAsIDB4YzAsIDB4ODMsIDB4YzAsIDB4ODIsIDB4YzAsIDB4ZDAsIDB4NzUsIDB4ZDAsIDB4MTgsIDB4YzIsIDB4YWYsIDB4MzAsIDB4NDUsIDB4MDMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2lnbXBfc25vb3AuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvaWdtcF9zbm9vcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Y5NjkyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvaWdtcF9zbm9vcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgaWdtcF9zbm9vcC5oCi0KLSAgICBBYnN0cmFjdDoKLSAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0KLSNpZm5kZWYgX19SVE1QX0lHTVBfU05PT1BfSF9fCi0jZGVmaW5lIF9fUlRNUF9JR01QX1NOT09QX0hfXwotCi0jaW5jbHVkZSAibGlua19saXN0LmgiCi0KLSNkZWZpbmUgSUdNUF9QUk9UT0NPTF9ERVNDUklQVE9SCTB4MDIKLSNkZWZpbmUgSUdNUF9WMV9NRU1CRVJTSElQX1JFUE9SVAkweDEyCi0jZGVmaW5lIElHTVBfVjJfTUVNQkVSU0hJUF9SRVBPUlQJMHgxNgotI2RlZmluZSBJR01QX0xFQVZFX0dST1VQCQkJMHgxNwotI2RlZmluZSBJR01QX1YzX01FTUJFUlNISVBfUkVQT1JUCTB4MjIKLQotI2RlZmluZSBNTERfVjFfTElTVEVORVJfUkVQT1JUCQkxMzEKLSNkZWZpbmUgTUxEX1YxX0xJU1RFTkVSX0RPTkUJCTEzMgotI2RlZmluZSBNTERfVjJfTElTVEVSTkVSX1JFUE9SVAkJMTQzCi0KLSNkZWZpbmUgSUdNUE1BQ19UQl9FTlRSWV9BR0VPVVRfVElNRSAxMjAgKiBPU19IWgotCi0jZGVmaW5lIE1VTFRJQ0FTVF9BRERSX0hBU0hfSU5ERVgoQWRkcikgICAgICAoTUFDX0FERFJfSEFTSChBZGRyKSAlIChNQVhfTEVOX09GX01VTFRJQ0FTVF9GSUxURVJfSEFTSF9UQUJMRSkpCi0KLSNkZWZpbmUgSVNfTVVMVElDQVNUX01BQ19BRERSKEFkZHIpCQkJKCgoKEFkZHJbMF0pICYgMHgwMSkgPT0gMHgwMSkgJiYgKChBZGRyWzBdKSAhPSAweGZmKSkKLSNkZWZpbmUgSVNfQlJPQURDQVNUX01BQ19BRERSKEFkZHIpCQkJKCgoKEFkZHJbMF0pICYgMHhmZikgPT0gMHhmZikpCi0KLVZPSUQgTXVsdGljYXN0RmlsdGVyVGFibGVJbml0KAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFICpwcE11bHRpY2FzdEZpbHRlclRhYmxlKTsKLQotVk9JRCBNdWx0aUNhc3RGaWx0ZXJUYWJsZVJlc2V0KAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFICpwcE11bHRpY2FzdEZpbHRlclRhYmxlKTsKLQotQk9PTEVBTiBNdWx0aWNhc3RGaWx0ZXJUYWJsZUluc2VydEVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwR3JwSWQsCi0JSU4gUFVDSEFSIHBNZW1iZXJBZGRyLAotCUlOIFBORVRfREVWIGRldiwKLQlJTiBNdWx0aWNhc3RGaWx0ZXJFbnRyeVR5cGUgdHlwZSk7Ci0KLUJPT0xFQU4gTXVsdGljYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcEdycElkLAotCUlOIFBVQ0hBUiBwTWVtYmVyQWRkciwKLQlJTiBQTkVUX0RFViBkZXYpOwotCi1QTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSBNdWx0aWNhc3RGaWx0ZXJUYWJsZUxvb2t1cCgKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUsCi0JSU4gUFVDSEFSIHBBZGRyLAotCUlOIFBORVRfREVWIGRldik7Ci0KLUJPT0xFQU4gaXNJZ21wUGt0KAotCUlOIFBVQ0hBUiBwRHN0TWFjQWRkciwKLQlJTiBQVUNIQVIgcElwSGVhZGVyKTsKLQotVk9JRCBJR01QU25vb3BpbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEc3RNYWNBZGRyLAotCUlOIFBVQ0hBUiBwU3JjTWFjQWRkciwKLQlJTiBQVUNIQVIgcElwSGVhZGVyLAotCUlOIFBORVRfREVWIHBEZXYpOwotCi1CT09MRUFOIGlzTWxkUGt0KAotCUlOIFBVQ0hBUiBwRHN0TWFjQWRkciwKLQlJTiBQVUNIQVIgcElwSGVhZGVyLAotCU9VVCBVSU5UOCAqcFByb3RvVHlwZSwKLQlPVVQgUFVDSEFSICpwTWxkSGVhZGVyKTsKLQotVk9JRCBNTERTbm9vcGluZygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERzdE1hY0FkZHIsCi0JSU4gUFVDSEFSIHBTcmNNYWNBZGRyLAotCUlOIFBVQ0hBUiBwSXBIZWFkZXIsCi0JSU4gUE5FVF9ERVYgcERldik7Ci0KLVVDSEFSIElnbXBNZW1iZXJDbnQoCi0JSU4gUExJU1RfSEVBREVSIHBMaXN0KTsKLQotVk9JRCBJZ21wR3JvdXBEZWxNZW1iZXJzKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwTWVtYmVyQWRkciwKLQlJTiBQTkVUX0RFViBwRGV2KTsKLQotSU5UIFNldF9JZ21wU25fRW5hYmxlX1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFNUUklORyBhcmcpOwotCi1JTlQgU2V0X0lnbXBTbl9BZGRFbnRyeV9Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBTVFJJTkcgYXJnKTsKLQotSU5UIFNldF9JZ21wU25fRGVsRW50cnlfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQU1RSSU5HIGFyZyk7Ci0KLUlOVCBTZXRfSWdtcFNuX1RhYkRpc3BsYXlfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQU1RSSU5HIGFyZyk7Ci0KLXZvaWQgcnRtcF9yZWFkX2lnbXBfc25vb3BfZnJvbV9maWxlKAotCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKLQlQU1RSSU5HIHRtcGJ1ZiwKLQlQU1RSSU5HIGJ1ZmZlcik7Ci0KLU5ESVNfU1RBVFVTIElnbXBQa3RJbmZvUXVlcnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBTcmNCdWZWQSwKLQlJTiBQTkRJU19QQUNLRVQgcFBhY2tldCwKLQlJTiBVQ0hBUiBhcGlkeCwKLQlPVVQgQk9PTEVBTiAqcEluSWdtcEdyb3VwLAotCU9VVCBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSAqcHBHcm91cEVudHJ5KTsKLQotTkRJU19TVEFUVVMgSWdtcFBrdENsb25lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBORElTX1BBQ0tFVCBwUGFja2V0LAotCUlOIFVDSEFSIFF1ZUlkeCwKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSBwR3JvdXBFbnRyeSk7Ci0KLSNlbmRpZiAvKiBfX1JUTVBfSUdNUF9TTk9PUF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvaXB2Ni5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9pcHY2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNGE1ZjIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9pcHY2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBpcHY2LmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpZm5kZWYgX19JUFY2X0hEUl9IXwotI2RlZmluZSBfX0lQVjZfSERSX0hfCi0KLSNkZWZpbmUgSVBWNl9BRERSX0xFTiAxNgotI2RlZmluZSBJUFY2X0hEUl9MRU4gIDQwCi0KLS8vIElQdjYgYWRkcmVzcyBkZWZpbml0aW9uCi0jZGVmaW5lIElQVjZfTElOS19MT0NBTF9BRERSX1BSRUZJWAkJMHhGRTgKLSNkZWZpbmUgSVBWNl9TSVRFX0xPQ0FMX0FERFJfUFJFRklYCQkweEZFQwotI2RlZmluZSBJUFY2X0xPQ0FMX0FERFJfUFJFRklYCQkJMHhGRTgKLSNkZWZpbmUgSVBWNl9NVUxUSUNBU1RfQUREUl9QUkVGSVgJCTB4RkYKLSNkZWZpbmUgSVBWNl9MT09QQkFDS19BRERSCQkJCTB4MQotI2RlZmluZSBJUFY2X1VOU1BFQ0lGSUVEX0FERFIJCQkweDAKLQotLy8gZGVmaW5lZCBhcyBzZXF1ZW5jZSBpbiBJUHY2IGhlYWRlcgotI2RlZmluZSBJUFY2X05FWFRfSEVBREVSX0hPUF9CWV9IT1AJCTB4MDAJLy8gMAotI2RlZmluZSBJUFY2X05FWFRfSEVBREVSX0RFU1RJTkFUSU9OCTB4M2MJLy8gNjAKLSNkZWZpbmUgSVBWNl9ORVhUX0hFQURFUl9ST1VUSU5HCQkweDJiCS8vIDQzCi0jZGVmaW5lIElQVjZfTkVYVF9IRUFERVJfRlJBR01FTlQJCTB4MmMJLy8gNDQKLSNkZWZpbmUgSVBWNl9ORVhUX0hFQURFUl9BVVRIRU5USUNBVElPTgkweDMzCS8vIDUxCi0jZGVmaW5lIElQVjZfTkVYVF9IRUFERVJfRU5DQVBTVUxBVElPTgkweDMyCS8vIDUwLCBSRkMtMjQwNgotI2RlZmluZSBJUFY2X05FWFRfSEVBREVSX05PTkUJCQkweDNiCS8vIDU5Ci0KLSNkZWZpbmUgSVBWNl9ORVhUX0hFQURFUl9UQ1AJCQkweDA2Ci0jZGVmaW5lIElQVjZfTkVYVF9IRUFERVJfVURQCQkJMHgxMQotI2RlZmluZSBJUFY2X05FWFRfSEVBREVSX0lDTVBWNgkJCTB4M2EKLQotLy8gSUNNUHY2IG1zZyB0eXBlIGRlZmluaXRpb24KLSNkZWZpbmUgSUNNUFY2X01TR19UWVBFX1JPVVRFUl9TT0xJQ0lUQVRJT04JCQkweDg1IC8vIDEzMwotI2RlZmluZSBST1VURVJfU09MSUNJVEFUSU9OX0ZJWEVEX0xFTgkJCQk4Ci0KLSNkZWZpbmUgSUNNUFY2X01TR19UWVBFX1JPVVRFUl9BRFZFUlRJU0VNRU5UCQkweDg2IC8vIDEzNAotI2RlZmluZSBST1VURVJfQURWRVJUSVNFTUVOVF9GSVhFRF9MRU4JCQkJMTYKLQotI2RlZmluZSBJQ01QVjZfTVNHX1RZUEVfTkVJR0hCT1JfU09MSUNJVEFUSU9OCQkweDg3IC8vIDEzNQotI2RlZmluZSBORUlHSEJPUl9TT0xJQ0lUQVRJT05fRklYRURfTEVOCQkJCTI0Ci0KLSNkZWZpbmUgSUNNUFY2X01TR19UWVBFX05FSUdIQk9SX0FEVkVSVElTRU1FTlQJCTB4ODggLy8gMTM2Ci0jZGVmaW5lIE5FSUdIQk9SX0FEVkVSVElTRU1FTlRfRklYRURfTEVOCQkJMjQKLQotI2RlZmluZSBJQ01QVjZfTVNHX1RZUEVfUkVESVJFQ1QJCQkJCTB4ODkgLy8gMTM3Ci0jZGVmaW5lIFJFRElSRUNUX0ZJWEVEX0xFTgkJCQkJCQk0MAotCi0vKiBJUHY2IEFkZHJlc3MgcmVsYXRlZCBzdHJ1Y3R1cmVzICovCi10eXBlZGVmIHN0cnVjdCBydF9pcHY2X2FkZHJfCi17Ci0JdW5pb24KLQl7Ci0JCVVDSEFSCWlwdjZBZGRyOFsxNl07Ci0JCVVTSE9SVAlpcHY2QWRkcjE2WzhdOwotCQlVSU5UMzIJaXB2NkFkZHIzMls0XTsKLQl9YWRkcjsKLSNkZWZpbmUgaXB2Nl9hZGRyCQkJYWRkci5pcHY2QWRkcjgKLSNkZWZpbmUgaXB2Nl9hZGRyMTYJCQlhZGRyLmlwdjZBZGRyMTYKLSNkZWZpbmUgaXB2Nl9hZGRyMzIJCQlhZGRyLmlwdjZBZGRyMzIKLX1SVF9JUFY2X0FERFIsICpQUlRfSVBWNl9BRERSOwotCi0KLSNkZWZpbmUgUFJJTlRfSVBWNl9BRERSKGlwdjZBZGRyKQlcCi0JT1NfTlRPSFMoKGlwdjZBZGRyKS5pcHY2X2FkZHIxNlswXSksIFwKLQlPU19OVE9IUygoaXB2NkFkZHIpLmlwdjZfYWRkcjE2WzFdKSwgXAotCU9TX05UT0hTKChpcHY2QWRkcikuaXB2Nl9hZGRyMTZbMl0pLCBcCi0JT1NfTlRPSFMoKGlwdjZBZGRyKS5pcHY2X2FkZHIxNlszXSksIFwKLQlPU19OVE9IUygoaXB2NkFkZHIpLmlwdjZfYWRkcjE2WzRdKSwgXAotCU9TX05UT0hTKChpcHY2QWRkcikuaXB2Nl9hZGRyMTZbNV0pLCBcCi0JT1NfTlRPSFMoKGlwdjZBZGRyKS5pcHY2X2FkZHIxNls2XSksIFwKLQlPU19OVE9IUygoaXB2NkFkZHIpLmlwdjZfYWRkcjE2WzddKQotCi0KLS8qFBRJUHY2IEhlYWRlciByZWxhdGVkIHN0cnVjdHVyZXMgKi8KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfcnRfaXB2Nl9oZHJfCi17Ci0JVUlOVDMyCQkJdmVyOjQsCi0JCQkJCXRyYWZmaWNDbGFzczo4LAotCQkJCWZsb3dMYWJlbDoyMDsKLQlVU0hPUlQJCQlwYXlsb2FkX2xlbjsKLQlVQ0hBUgkJCW5leHRIZHI7Ci0JVUNIQVIJCQlob3BMaW1pdDsKLQlSVF9JUFY2X0FERFIJc3JjQWRkcjsKLQlSVF9JUFY2X0FERFIJZHN0QWRkcjsKLX1SVF9JUFY2X0hEUiwgKlBSVF9JUFY2X0hEUjsKLQotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX3J0X2lwdjZfZXh0X2hkcl8KLXsKLQlVQ0hBUgluZXh0UHJvdG87IC8vIEluZGljYXRlIHRoZSBwcm90b2NvbCB0eXBlIG9mIG5leHQgZXh0ZW5zaW9uIGhlYWRlci4KLQlVQ0hBUglleHRIZHJMZW47IC8vIG9wdGlvbmFsIGZpZWxkIGZvciBtc2cgbGVuZ3RoIG9mIHRoaXMgZXh0ZW5zaW9uIGhlYWRlciB3aGljaCBkaWRuJ3QgaW5jbHVkZSB0aGUgZmlyc3QgIm5leHRQcm90byIgZmllbGQuCi0JVUNIQVIJb2N0ZXRzWzFdOyAvLyBob29rIHRvIGV4dGVuZCBoZWFkZXIgbWVzc2FnZSBib2R5LgotfVJUX0lQVjZfRVhUX0hEUiwgKlBSVF9JUFY2X0VYVF9IRFI7Ci0KLQotLyogSUNNUHY2IHJlbGF0ZWQgc3RydWN0dXJlcyAqLwotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ydF9pcHY2X2ljbXB2Nl9oZHJfCi17Ci0JVUNIQVIJdHlwZTsKLQlVQ0hBUgljb2RlOwotCVVTSE9SVAljaGtzdW07Ci0JVUNIQVIJb2N0ZXRzWzFdOyAvL2hvb2sgdG8gZXh0ZW5kIGhlYWRlciBtZXNzYWdlIGJvZHkuCi19UlRfSUNNUFY2X0hEUiwgKlBSVF9JQ01QVjZfSERSOwotCi0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfcnRfaWNtcDZfb3B0aW9uX2hkcl8KLXsKLQlVQ0hBUiB0eXBlOwotCVVDSEFSIGxlbjsKLQlVQ0hBUiBvY3RldFsxXTsKLX1SVF9JQ01QVjZfT1BUSU9OX0hEUiwgKlBSVF9JQ01QVjZfT1BUSU9OX0hEUjsKLQotdHlwZWRlZiBlbnVtewotLy8gRGVmaW5lZCBJQ01QdjYgT3B0aW9uIFR5cGVzLgotCVRZUEVfU1JDX0xMX0FERFIJPSAxLAotCVRZUEVfVEdUX0xMX0FERFIJPSAyLAotCVRZUEVfUFJFRklYX0lORk8JCQk9IDMsCi0JVFlQRV9SRURJUkVDVEVEX0hEUgkJCT0gNCwKLQlUWVBFX01UVQkJCQkJPSA1LAotfUlDTVBWNl9PUFRJT05TX1RZUEVfREVGOwotCi0KLXN0YXRpYyBpbmxpbmUgQk9PTEVBTiBJUHY2RXh0SGRySGFuZGxlKAotCVJUX0lQVjZfRVhUX0hEUgkJKnBFeHRIZHIsCi0JVUNIQVIJCQkJKnBQcm90bywKLQlVSU5UMzIJCQkJKnBPZmZzZXQpCi17Ci0JVUNIQVIgbmV4dFByb3RvID0gMHhmZjsKLQlVSU5UMzIgZXh0TGVuID0gMDsKLQlCT09MRUFOIHN0YXR1cyA9IFRSVUU7Ci0KLQkvL3ByaW50aygiJXMoKTogcGFyc2luZyB0aGUgRXh0ZW5zaW9uIEhlYWRlciB3aXRoIFByb3RvY29sKDB4JXgpOlxuIiwgX19GVU5DVElPTl9fLCAqcFByb3RvKTsKLQlzd2l0Y2ggKCpwUHJvdG8pCi0JewotCQljYXNlIElQVjZfTkVYVF9IRUFERVJfSE9QX0JZX0hPUDoKLQkJCS8vIElQdjZFeHRIb3BCeUhvcEhhbmRsZSgpOwotCQkJbmV4dFByb3RvID0gcEV4dEhkci0+bmV4dFByb3RvOwotCQkJZXh0TGVuID0gKHBFeHRIZHItPmV4dEhkckxlbiArIDEpICogODsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVBWNl9ORVhUX0hFQURFUl9ERVNUSU5BVElPTjoKLQkJCS8vIElQdjZFeHREZXN0SGFuZGxlKCk7Ci0JCQluZXh0UHJvdG8gPSBwRXh0SGRyLT5uZXh0UHJvdG87Ci0JCQlleHRMZW4gPSAocEV4dEhkci0+ZXh0SGRyTGVuICsgMSkgKiA4OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJUFY2X05FWFRfSEVBREVSX1JPVVRJTkc6Ci0JCQkvLyBJUHY2RXh0Um91dGluZ0hhbmRsZSgpOwotCQkJbmV4dFByb3RvID0gcEV4dEhkci0+bmV4dFByb3RvOwotCQkJZXh0TGVuID0gKHBFeHRIZHItPmV4dEhkckxlbiArIDEpICogODsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVBWNl9ORVhUX0hFQURFUl9GUkFHTUVOVDoKLQkJCS8vIElQdjZFeHRGcmFnbWVudEhhbmRsZSgpOwotCQkJbmV4dFByb3RvID0gcEV4dEhkci0+bmV4dFByb3RvOwotCQkJZXh0TGVuID0gODsgLy8gVGhlIEZyYWdtZW50IGhlYWRlciBsZW5ndGggaXMgZml4ZWQgdG8gOCBieXRlcy4KLQkJCWJyZWFrOwotCi0JCWNhc2UgSVBWNl9ORVhUX0hFQURFUl9BVVRIRU5USUNBVElPTjoKLQkJLy8gICBJUFY2X05FWFRfSEVBREVSX0VOQ0FQU1VMQVRJT046Ci0JCQkvKgotCQkJCVRPRE86IE5vdCBzdXBwb3J0LiBGb3IgZW5jcnlwdGlvbiBpc3N1ZS4KLQkJCSovCi0JCQluZXh0UHJvdG8gPSAweEZGOwotCQkJc3RhdHVzID0gRkFMU0U7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJbmV4dFByb3RvID0gMHhGRjsKLQkJCXN0YXR1cyA9IEZBTFNFOwotCQkJYnJlYWs7Ci0JfQotCi0JKnBQcm90byA9IG5leHRQcm90bzsKLQkqcE9mZnNldCArPSBleHRMZW47Ci0JLy9wcmludGsoIiVzKCk6IG5leHRQcm90byA9IDB4JXghLCBvZmZzZXQ9MHgleCFcbiIsIF9fRlVOQ1RJT05fXywgbmV4dFByb3RvLCBvZmZzZXQpOwotCi0JcmV0dXJuIHN0YXR1czsKLQotfQotCi0jZW5kaWYgLy8gX19JUFY2X0hEUl9IXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9saW5rX2xpc3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvbGlua19saXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNWI2MTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9saW5rX2xpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9fTElOS19MSVNUX0hfXwotI2RlZmluZSBfX0xJTktfTElTVF9IX18KLQotdHlwZWRlZiBzdHJ1Y3QgX0xJU1RfRU5UUlkKLXsKLQlzdHJ1Y3QgX0xJU1RfRU5UUlkgKnBOZXh0OwotfSBMSVNUX0VOVFJZLCAqUExJU1RfRU5UUlk7Ci0KLXR5cGVkZWYgc3RydWN0IF9MSVNUX0hFQURSCi17Ci0JUExJU1RfRU5UUlkgcEhlYWQ7Ci0JUExJU1RfRU5UUlkgcFRhaWw7Ci0JVUNIQVIgc2l6ZTsKLX0gTElTVF9IRUFERVIsICpQTElTVF9IRUFERVI7Ci0KLXN0YXRpYyBpbmxpbmUgVk9JRCBpbml0TGlzdCgKLQlJTiBQTElTVF9IRUFERVIgcExpc3QpCi17Ci0JcExpc3QtPnBIZWFkID0gcExpc3QtPnBUYWlsID0gTlVMTDsKLQlwTGlzdC0+c2l6ZSA9IDA7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW5saW5lIFZPSUQgaW5zZXJ0VGFpbExpc3QoCi0JSU4gUExJU1RfSEVBREVSIHBMaXN0LAotCUlOIFBMSVNUX0VOVFJZIHBFbnRyeSkKLXsKLQlwRW50cnktPnBOZXh0ID0gTlVMTDsKLQlpZiAocExpc3QtPnBUYWlsKQotCQlwTGlzdC0+cFRhaWwtPnBOZXh0ID0gcEVudHJ5OwotCWVsc2UKLQkJcExpc3QtPnBIZWFkID0gcEVudHJ5OwotCXBMaXN0LT5wVGFpbCA9IHBFbnRyeTsKLQlwTGlzdC0+c2l6ZSsrOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW5saW5lIFBMSVNUX0VOVFJZIHJlbW92ZUhlYWRMaXN0KAotCUlOIFBMSVNUX0hFQURFUiBwTGlzdCkKLXsKLQlQTElTVF9FTlRSWSBwTmV4dDsKLQlQTElTVF9FTlRSWSBwRW50cnk7Ci0KLQlwRW50cnkgPSBwTGlzdC0+cEhlYWQ7Ci0JaWYgKHBMaXN0LT5wSGVhZCAhPSBOVUxMKQotCXsKLQkJcE5leHQgPSBwTGlzdC0+cEhlYWQtPnBOZXh0OwotCQlwTGlzdC0+cEhlYWQgPSBwTmV4dDsKLQkJaWYgKHBOZXh0ID09IE5VTEwpCi0JCQlwTGlzdC0+cFRhaWwgPSBOVUxMOwotCQlwTGlzdC0+c2l6ZS0tOwotCX0KLQlyZXR1cm4gcEVudHJ5OwotfQotCi1zdGF0aWMgaW5saW5lIGludCBnZXRMaXN0U2l6ZSgKLQlJTiBQTElTVF9IRUFERVIgcExpc3QpCi17Ci0JcmV0dXJuIHBMaXN0LT5zaXplOwotfQotCi1zdGF0aWMgaW5saW5lIFBMSVNUX0VOVFJZIGRlbEVudHJ5TGlzdCgKLQlJTiBQTElTVF9IRUFERVIgcExpc3QsCi0JSU4gUExJU1RfRU5UUlkgcEVudHJ5KQotewotCVBMSVNUX0VOVFJZIHBDdXJFbnRyeTsKLQlQTElTVF9FTlRSWSBwUHJ2RW50cnk7Ci0KLQlpZihwTGlzdC0+cEhlYWQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZihwRW50cnkgPT0gcExpc3QtPnBIZWFkKQotCXsKLQkJcEN1ckVudHJ5ID0gcExpc3QtPnBIZWFkOwotCQlwTGlzdC0+cEhlYWQgPSBwQ3VyRW50cnktPnBOZXh0OwotCi0JCWlmKHBMaXN0LT5wSGVhZCA9PSBOVUxMKQotCQkJcExpc3QtPnBUYWlsID0gTlVMTDsKLQotCQlwTGlzdC0+c2l6ZS0tOwotCQlyZXR1cm4gcEN1ckVudHJ5OwotCX0KLQotCXBQcnZFbnRyeSA9IHBMaXN0LT5wSGVhZDsKLQlwQ3VyRW50cnkgPSBwUHJ2RW50cnktPnBOZXh0OwotCXdoaWxlKHBDdXJFbnRyeSAhPSBOVUxMKQotCXsKLQkJaWYgKHBFbnRyeSA9PSBwQ3VyRW50cnkpCi0JCXsKLQkJCXBQcnZFbnRyeS0+cE5leHQgPSBwQ3VyRW50cnktPnBOZXh0OwotCi0JCQlpZihwRW50cnkgPT0gcExpc3QtPnBUYWlsKQotCQkJCXBMaXN0LT5wVGFpbCA9IHBQcnZFbnRyeTsKLQotCQkJcExpc3QtPnNpemUtLTsKLQkJCWJyZWFrOwotCQl9Ci0JCXBQcnZFbnRyeSA9IHBDdXJFbnRyeTsKLQkJcEN1ckVudHJ5ID0gcFBydkVudHJ5LT5wTmV4dDsKLQl9Ci0KLQlyZXR1cm4gcEN1ckVudHJ5OwotfQotCi0jZW5kaWYgLy8gX19fTElOS19MSVNUX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9tYWNfcGNpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL21hY19wY2kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFkMDRkNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL21hY19wY2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1NCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgICAgICBtYWNfcGNpLmgKLQotICAgIEFic3RyYWN0OgotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLSNpZm5kZWYgX19NQUNfUENJX0hfXwotI2RlZmluZSBfX01BQ19QQ0lfSF9fCi0KLSNpbmNsdWRlICJydG1wX3R5cGUuaCIKLSNpbmNsdWRlICJydG1wX21hYy5oIgotI2luY2x1ZGUgInJ0bXBfcGh5LmgiCi0jaW5jbHVkZSAicnRtcF9pZmFjZS5oIgotI2luY2x1ZGUgInJ0bXBfZG90MTEuaCIKLQotCi0vLwotLy8gRGV2aWNlIElEICYgVmVuZG9yIElEIHJlbGF0ZWQgZGVmaW5pdGlvbnMsCi0vLyBOT1RFOiB5b3Ugc2hvdWxkIG5vdCBhZGQgdGhlIG5ldyBWZW5kb3JJRC9EZXZpY2VJRCBoZXJlIHVubGVzcyB5b3Ugbm90IHN1cmUgaXQgYmVsb25ncyB0byB3aGF0IGNoaXAuCi0vLwotI2RlZmluZSBOSUNfUENJX1ZFTkRPUl9JRAkJMHgxODE0Ci0jZGVmaW5lIFBDSUJVU19JTlRFTF9WRU5ET1IJMHg4MDg2Ci0KLSNpZiAhZGVmaW5lZChQQ0lfQ0FQX0lEX0VYUCkKLSNkZWZpbmUgUENJX0NBUF9JRF9FWFAJCQkgICAgMHgxMAotI2VuZGlmCi0jaWYgIWRlZmluZWQoUENJX0VYUF9MTktDVEwpCi0jZGVmaW5lIFBDSV9FWFBfTE5LQ1RMCQkJICAgIDB4MTAKLSNlbmRpZgotI2lmICFkZWZpbmVkKFBDSV9DTEFTU19CUklER0VfUENJKQotI2RlZmluZSBQQ0lfQ0xBU1NfQlJJREdFX1BDSQkJMHgwNjA0Ci0jZW5kaWYKLQotCi0KLQotCi0jZGVmaW5lIFRYSU5GT19TSVpFCQkJCQkJMAotI2RlZmluZSBSVE1QX1BLVF9UQUlMX1BBRERJTkcJCQkwCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYCTAKLQotI2RlZmluZSBBVVhfQ1RSTCAgICAgICAgICAgMHgxMGMKLQotLy8KLS8vIFRYIGRlc2NyaXB0b3IgZm9ybWF0LCBUeAlyaW5nLCBNZ210IFJpbmcKLS8vCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9UWERfU1RSVUMgewotCS8vIFdvcmQgMAotCVVJTlQzMgkJU0RQdHIwOwotCS8vIFdvcmQgMQotCVVJTlQzMgkJRE1BRE9ORToxOwotCVVJTlQzMgkJTGFzdFNlYzA6MTsKLQlVSU5UMzIJCVNETGVuMDoxNDsKLQlVSU5UMzIJCUJ1cnN0OjE7Ci0JVUlOVDMyCQlMYXN0U2VjMToxOwotCVVJTlQzMgkJU0RMZW4xOjE0OwotCS8vIFdvcmQgMgotCVVJTlQzMgkJU0RQdHIxOwotCS8vIFdvcmQgMwotCVVJTlQzMgkJSUNPOjE7Ci0JVUlOVDMyCQlVQ086MTsKLQlVSU5UMzIJCVRDTzoxOwotCVVJTlQzMgkJcnN2OjI7Ci0JVUlOVDMyCQlRU0VMOjI7CS8vIHNlbGVjdCBvbi1jaGlwIEZJRk8gSUQgZm9yIDJuZC1zdGFnZSBvdXRwdXQgc2NoZWR1bGVyLjA6TUdNVCwgMTpIQ0NBIDI6RURDQQotCVVJTlQzMgkJV0lWOjE7CS8vIFdpcmVsZXNzIEluZm8gVmFsaWQuIDEgaWYgRHJpdmVyIGFscmVhZHkgZmlsbCBXSSwgIG8gaWYgRE1BIG5lZWRzIHRvIGNvcHkgV0kgdG8gY29ycmVjdHBvc2l0aW9uCi0JVUlOVDMyCQlyc3YyOjI0OwotfQlUWERfU1RSVUMsICpQVFhEX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJc3RydWN0CVBBQ0tFRCBfVFhEX1NUUlVDIHsKLQkvLyBXb3JkCTAKLQlVSU5UMzIJCVNEUHRyMDsKLQkvLyBXb3JkCTEKLQlVSU5UMzIJCVNETGVuMToxNDsKLQlVSU5UMzIJCUxhc3RTZWMxOjE7Ci0JVUlOVDMyCQlCdXJzdDoxOwotCVVJTlQzMgkJU0RMZW4wOjE0OwotCVVJTlQzMgkJTGFzdFNlYzA6MTsKLQlVSU5UMzIJCURNQURPTkU6MTsKLQkvL1dvcmQyCi0JVUlOVDMyCQlTRFB0cjE7Ci0JLy9Xb3JkMwotCVVJTlQzMgkJcnN2MjoyNDsKLQlVSU5UMzIJCVdJVjoxOwkvLyBXaXJlbGVzcyBJbmZvIFZhbGlkLiAxIGlmIERyaXZlciBhbHJlYWR5IGZpbGwgV0ksICBvIGlmIERNQSBuZWVkcyB0byBjb3B5IFdJIHRvIGNvcnJlY3Rwb3NpdGlvbgotCVVJTlQzMgkJUVNFTDoyOwkvLyBzZWxlY3Qgb24tY2hpcCBGSUZPIElEIGZvciAybmQtc3RhZ2Ugb3V0cHV0IHNjaGVkdWxlci4wOk1HTVQsIDE6SENDQSAyOkVEQ0EKLQlVSU5UMzIJCXJzdjoyOwotCVVJTlQzMgkJVENPOjE7CS8vCi0JVUlOVDMyCQlVQ086MTsJLy8KLQlVSU5UMzIJCUlDTzoxOwkvLwotfQlUWERfU1RSVUMsICpQVFhEX1NUUlVDOwotI2VuZGlmCi0KLQotLy8KLS8vIFJ4IGRlc2NyaXB0b3IgZm9ybWF0LCBSeCBSaW5nCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlhEX1NUUlVDewotCS8vIFdvcmQgMAotCVVJTlQzMgkJU0RQMDsKLQkvLyBXb3JkIDEKLQlVSU5UMzIJCURET05FOjE7Ci0JVUlOVDMyCQlMUzA6MTsKLQlVSU5UMzIJCVNETDA6MTQ7Ci0JVUlOVDMyCQlSc3Y6MjsKLQlVSU5UMzIJCVNETDE6MTQ7Ci0JLy8gV29yZCAyCi0JVUlOVDMyCQlTRFAxOwotCS8vIFdvcmQgMwotCVVJTlQzMgkJUnN2MToxMzsKLQlVSU5UMzIJCVBsY3BSc3NpbDoxOy8vIFRvIGJlIG1vdmVkCi0JVUlOVDMyCQlQbGNwU2lnbmFsOjE7CQkvLyBUbyBiZSBtb3ZlZAotCVVJTlQzMgkJRGVjcnlwdGVkOjE7CS8vIHRoaXMgZnJhbWUgaXMgYmVpbmcgZGVjcnlwdGVkLgotCVVJTlQzMgkJQU1QRFU6MTsKLQlVSU5UMzIJCUwyUEFEOjE7Ci0JVUlOVDMyCQlSU1NJOjE7Ci0JVUlOVDMyCQlIVEM6MTsKLQlVSU5UMzIJCUFNU0RVOjE7CQkvLyByeCB3aXRoIDgwMi4zIGhlYWRlciwgbm90IDgwMi4xMSBoZWFkZXIuIG9ic29sZXRlLgotCVVJTlQzMgkJQ2lwaGVyRXJyOjI7ICAgICAgICAvLyAwOiBkZWNyeXB0aW9uIG9rYXksIDE6SUNWIGVycm9yLCAyOk1JQyBlcnJvciwgMzpLRVkgbm90IHZhbGlkCi0JVUlOVDMyCQlDcmM6MTsgICAgICAgICAgICAgIC8vIDE6IENSQyBlcnJvcgotCVVJTlQzMgkJTXlCc3M6MTsJLy8gMTogdGhpcyBmcmFtZSBiZWxvbmdzIHRvIHRoZSBzYW1lIEJTU0lECi0JVUlOVDMyCQlCY2FzdDoxOyAgICAgICAgICAgIC8vIDE6IHRoaXMgaXMgYSBicm9hZGNhc3QgZnJhbWUKLQlVSU5UMzIJCU1jYXN0OjE7ICAgICAgICAgICAgLy8gMTogdGhpcyBpcyBhIG11bHRpY2FzdCBmcmFtZQotCVVJTlQzMgkJVTJNOjE7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKLQlVSU5UMzIJCUZSQUc6MTsKLQlVSU5UMzIJCU5VTExEQVRBOjE7Ci0JVUlOVDMyCQlEQVRBOjE7Ci0JVUlOVDMyCQlCQToxOwotCi19CVJYRF9TVFJVQywgKlBSWERfU1RSVUMsIFJUMjhYWF9SWERfU1RSVUMsICpQUlQyOFhYX1JYRF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JYRF9TVFJVQ3sKLQkvLyBXb3JkCTAKLQlVSU5UMzIJCVNEUDA7Ci0JLy8gV29yZAkxCi0JVUlOVDMyCQlTREwxOjE0OwotCVVJTlQzMgkJUnN2OjI7Ci0JVUlOVDMyCQlTREwwOjE0OwotCVVJTlQzMgkJTFMwOjE7Ci0JVUlOVDMyCQlERE9ORToxOwotCS8vIFdvcmQJMgotCVVJTlQzMgkJU0RQMTsKLQkvLyBXb3JkCTMKLQlVSU5UMzIJCUJBOjE7Ci0JVUlOVDMyCQlEQVRBOjE7Ci0JVUlOVDMyCQlOVUxMREFUQToxOwotCVVJTlQzMgkJRlJBRzoxOwotCVVJTlQzMgkJVTJNOjE7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKLQlVSU5UMzIJCU1jYXN0OjE7ICAgICAgICAgICAgLy8gMTogdGhpcyBpcyBhIG11bHRpY2FzdCBmcmFtZQotCVVJTlQzMgkJQmNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgYnJvYWRjYXN0IGZyYW1lCi0JVUlOVDMyCQlNeUJzczoxOwkvLyAxOiB0aGlzIGZyYW1lIGJlbG9uZ3MgdG8gdGhlIHNhbWUgQlNTSUQKLQlVSU5UMzIJCUNyYzoxOyAgICAgICAgICAgICAgLy8gMTogQ1JDIGVycm9yCi0JVUlOVDMyCQlDaXBoZXJFcnI6MjsgICAgICAgIC8vIDA6IGRlY3J5cHRpb24gb2theSwgMTpJQ1YgZXJyb3IsIDI6TUlDIGVycm9yLCAzOktFWSBub3QgdmFsaWQKLQlVSU5UMzIJCUFNU0RVOjE7CQkvLyByeCB3aXRoIDgwMi4zIGhlYWRlciwgbm90IDgwMi4xMSBoZWFkZXIuCi0JVUlOVDMyCQlIVEM6MTsKLQlVSU5UMzIJCVJTU0k6MTsKLQlVSU5UMzIJCUwyUEFEOjE7Ci0JVUlOVDMyCQlBTVBEVToxOwotCVVJTlQzMgkJRGVjcnlwdGVkOjE7CS8vIHRoaXMgZnJhbWUgaXMgYmVpbmcgZGVjcnlwdGVkLgotCVVJTlQzMgkJUGxjcFNpZ25hbDoxOwkJLy8gVG8gYmUgbW92ZWQKLQlVSU5UMzIJCVBsY3BSc3NpbDoxOy8vIFRvIGJlIG1vdmVkCi0JVUlOVDMyCQlSc3YxOjEzOwotfQlSWERfU1RSVUMsICpQUlhEX1NUUlVDLCBSVDI4WFhfUlhEX1NUUlVDLCAqUFJUMjhYWF9SWERfU1RSVUM7Ci0jZW5kaWYKLQotI2lmZGVmIEJJR19FTkRJQU4KLXR5cGVkZWYgdW5pb24gX1RYX0FUVEVOVUFUSU9OX0NUUkxfU1RSVUMKLXsKLQlzdHJ1Y3QKLQl7Ci0JCVVMT05HCVJlc2VydmUxOjIwOwotCQlVTE9ORwlQQ0lFX1BIWV9UWF9BVFRFTl9FTjoxOwotCQlVTE9ORwlQQ0lFX1BIWV9UWF9BVFRFTl9WQUxVRTozOwotCQlVTE9ORwlSZXNlcnZlMjo3OwotCQlVTE9ORwlSRl9JU09MQVRJT05fRU5BQkxFOjE7Ci0JfSBmaWVsZDsKLQotCVVMT05HCXdvcmQ7Ci19IFRYX0FUVEVOVUFUSU9OX0NUUkxfU1RSVUMsICpQVFhfQVRURU5VQVRJT05fQ1RSTF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmIHVuaW9uIF9UWF9BVFRFTlVBVElPTl9DVFJMX1NUUlVDIHsKLQlzdHJ1Y3QKLQl7Ci0JCVVMT05HCVJGX0lTT0xBVElPTl9FTkFCTEU6MTsKLQkJVUxPTkcJUmVzZXJ2ZTI6NzsKLQkJVUxPTkcJUENJRV9QSFlfVFhfQVRURU5fVkFMVUU6MzsKLQkJVUxPTkcJUENJRV9QSFlfVFhfQVRURU5fRU46MTsKLQkJVUxPTkcJUmVzZXJ2ZTE6MjA7Ci0JfSBmaWVsZDsKLQotCVVMT05HCXdvcmQ7Ci19IFRYX0FUVEVOVUFUSU9OX0NUUkxfU1RSVUMsICpQVFhfQVRURU5VQVRJT05fQ1RSTF9TVFJVQzsKLSNlbmRpZgotLyogLS0tLS0tLS0tLS0tLS0tLS0gRUVQUk9NIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLy8gODA1MSBmaXJtd2FyZSBpbWFnZSBmb3IgUlQyODYwIC0gYmFzZSBhZGRyZXNzID0gMHg0MDAwCi0jZGVmaW5lIEZJUk1XQVJFX0lNQUdFX0JBU0UgICAgIDB4MjAwMAotI2RlZmluZSBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSAweDIwMDAgICAgLy8gOGtieXRlCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gRnJpbXdhcmUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVE1QX1dSSVRFX0ZJUk1XQVJFKF9wQWQsIF9wRndJbWFnZSwgX0Z3TGVuKQkJCVwKLQlkb3sJCQkJCQkJCVwKLQkJVUxPTkcJX2ksIF9maXJtOwkJCQkJXAotCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgUEJGX1NZU19DVFJMLCAweDEwMDAwKTsJCVwKLQkJCQkJCQkJCVwKLQkJZm9yKF9pPTA7IF9pPF9Gd0xlbjsgX2krPTQpCQkJCVwKLQkJewkJCQkJCQlcCi0JCQlfZmlybSA9IF9wRndJbWFnZVtfaV0gKwkJCQlcCi0JCQkgICAoX3BGd0ltYWdlW19pKzNdIDw8IDI0KSArCQkJXAotCQkJICAgKF9wRndJbWFnZVtfaSsyXSA8PCAxNikgKwkJCVwKLQkJCSAgIChfcEZ3SW1hZ2VbX2krMV0gPDwgOCk7CQkJXAotCQkJUlRNUF9JT19XUklURTMyKF9wQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBfaSwgX2Zpcm0pOwlcCi0JCX0JCQkJCQkJXAotCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgUEJGX1NZU19DVFJMLCAweDAwMDAwKTsJCVwKLQkJUlRNUF9JT19XUklURTMyKF9wQWQsIFBCRl9TWVNfQ1RSTCwgMHgwMDAwMSk7CQlcCi0JCQkJCQkJCQlcCi0JCS8qIGluaXRpYWxpemUgQkJQIFIvVyBhY2Nlc3MgYWdlbnQgKi8JCQlcCi0JCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBIMk1fQkJQX0FHRU5ULCAwKTsJCVwKLQkJUlRNUF9JT19XUklURTMyKF9wQWQsIEgyTV9NQUlMQk9YX0NTUiwgMCk7CQlcCi0JfXdoaWxlKDApCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gVFggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVE1QX1NUQVJUX0RFUVVFVUUocEFkLCBRdWVJZHgsIGlycUZsYWdzKQkJZG97fXdoaWxlKDApCi0jZGVmaW5lIFJUTVBfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBpcnFGbGFncykJCWRve313aGlsZSgwKQotCi0KLSNkZWZpbmUgUlRNUF9IQVNfRU5PVUdIX0ZSRUVfREVTQyhwQWQsIHBUeEJsaywgZnJlZU51bSwgcFBhY2tldCkgXAotCQkoKGZyZWVOdW0pID49IChVTE9ORykocFR4QmxrLT5Ub3RhbEZyYWdOdW0gKyBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpICsgMykpIC8qIHJvdWdoIGVzdGltYXRlIHdlIHdpbGwgdXNlIDMgbW9yZSBkZXNjcmlwdG9yLiAqLwotI2RlZmluZSBSVE1QX1JFTEVBU0VfREVTQ19SRVNPVVJDRShwQWQsIFF1ZUlkeCkJXAotCQlkb3t9d2hpbGUoMCkKLQotI2RlZmluZSBORUVEX1FVRVVFX0JBQ0tfRk9SX0FHRyhwQWQsIFF1ZUlkeCwgZnJlZU51bSwgX1R4RnJhbWVUeXBlKSBcCi0JCSgoKGZyZWVOdW0gIT0gKFRYX1JJTkdfU0laRS0xKSkgJiYgKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyID09IDApKSB8fCAoZnJlZU51bTwzKSkKLQkJLy8oKChmcmVlTnVtKSAhPSAoVFhfUklOR19TSVpFLTEpKSAmJiAocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPT0gMSAvKjAqLykpCi0KLQotI2RlZmluZSBIQUxfS2lja091dE1nbXRUeChfcEFkLCBfUXVlSWR4LCBfcFBhY2tldCwgX3BTcmNCdWZWQSwgX1NyY0J1ZkxlbikJXAotCQkJUnRtcFBDSU1nbXRLaWNrT3V0KF9wQWQsIF9RdWVJZHgsIF9wUGFja2V0LCBfcFNyY0J1ZlZBLCBfU3JjQnVmTGVuKQotCi0jZGVmaW5lIEhBTF9Xcml0ZVN1YlR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKQlcCi0JCS8qIFJ0bXBQQ0lfV3JpdGVTdWJUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikqLwotCi0jZGVmaW5lIEhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKLQkJCVJ0bXBQQ0lfV3JpdGVTaW5nbGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikKLQotI2RlZmluZSBIQUxfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgcEZyZWVOdW1iZXIpIFwKLQkJCVJ0bXBQQ0lfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgcEZyZWVOdW1iZXIpCi0KLSNkZWZpbmUgSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLGZyYW1lTnVtLCBwRnJlZU51bWJlcikJXAotCQkJUnRtcFBDSV9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sIHBGcmVlTnVtYmVyKQotCi0jZGVmaW5lIEhBTF9GaW5hbFdyaXRlVHhSZXNvdXJjZShfcEFkLCBfcFR4QmxrLCBfVG90YWxNUERVU2l6ZSwgX0ZpcnN0VHhJZHgpCVwKLQkJCVJ0bXBQQ0lfRmluYWxXcml0ZVR4UmVzb3VyY2UoX3BBZCwgX3BUeEJsaywgX1RvdGFsTVBEVVNpemUsIF9GaXJzdFR4SWR4KQotCi0jZGVmaW5lIEhBTF9MYXN0VHhJZHgoX3BBZCwgX1F1ZUlkeCxfTGFzdFR4SWR4KSBcCi0JCQkvKlJ0bXBQQ0lEYXRhTGFzdFR4SWR4KF9wQWQsIF9RdWVJZHgsX0xhc3RUeElkeCkqLwotCi0jZGVmaW5lIEhBTF9LaWNrT3V0VHgoX3BBZCwgX3BUeEJsaywgX1F1ZUlkeCkJXAotCQkJUlRNUF9JT19XUklURTMyKChfcEFkKSwgVFhfQ1RYX0lEWDArKChfUXVlSWR4KSoweDEwKSwgKF9wQWQpLT5UeFJpbmdbKF9RdWVJZHgpXS5UeENwdUlkeCkKLS8qCQkJUnRtcFBDSURhdGFLaWNrT3V0KF9wQWQsIF9wVHhCbGssIF9RdWVJZHgpKi8KLQotI2RlZmluZSBIQUxfS2lja091dE51bGxGcmFtZVR4KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCVwKLQkJCU1pbmlwb3J0TU1SZXF1ZXN0KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCi0KLSNkZWZpbmUgR0VUX1RYUklOR19GUkVFTk8oX3BBZCwgX1F1ZUlkeCkgXAotCShfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHggPiBfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhDcHVJZHgpCT8gXAotCQkJKF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeFN3RnJlZUlkeCAtIF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeENwdUlkeCAtIDEpIFwKLQkJCSA6CVwKLQkJCShfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHggKyBUWF9SSU5HX1NJWkUgLSBfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhDcHVJZHggLSAxKTsKLQotCi0jZGVmaW5lIEdFVF9NR01UUklOR19GUkVFTk8oX3BBZCkgXAotCShfcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA+IF9wQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KQk/IFwKLQkJCShfcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCAtIF9wQWQtPk1nbXRSaW5nLlR4Q3B1SWR4IC0gMSkgXAotCQkJIDoJXAotCQkJKF9wQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ICsgTUdNVF9SSU5HX1NJWkUgLSBfcEFkLT5NZ210UmluZy5UeENwdUlkeCAtIDEpOwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIFJYIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBBU0lDIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8vIHJlc2V0IE1BQyBvZiBhIHN0YXRpb24gZW50cnkgdG8gMHgwMDAwMDAwMDAwMDAKLSNkZWZpbmUgUlRNUF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgV2NpZCkJXAotCUFzaWNEZWxXY2lkVGFiKHBBZCwgV2NpZCk7Ci0KLS8vIGFkZCB0aGlzIGVudHJ5IGludG8gQVNJQyBSWCBXQ0lEIHNlYXJjaCB0YWJsZQotI2RlZmluZSBSVE1QX1NUQV9FTlRSWV9BREQocEFkLCBwRW50cnkpCQlcCi0JQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgcEVudHJ5LT5BaWQsIHBFbnRyeS0+QWRkcik7Ci0KLS8vIGFkZCBieSBqb2hubGksIGZpeCAiaW5faW50ZXJydXB0IiBlcnJvciB3aGVuIGNhbGwgIk1hY1RhYmxlRGVsZXRlRW50cnkiIGluIFJ4IHRhc2tsZXQKLS8vIFNldCBNQUMgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIG9wZXJhdGlvbiBtb2RlCi0jZGVmaW5lIFJUTVBfVVBEQVRFX1BST1RFQ1QocEFkKQlcCi0JQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwLCAoQUxMTl9TRVRQUk9URUNUKSwgVFJVRSwgMCk7Ci0vLyBlbmQgam9obmxpCi0KLS8vIHJlbW92ZSBQYWlyLXdpc2Uga2V5IG1hdGVyaWFsIGZyb20gQVNJQwotI2RlZmluZSBSVE1QX1NUQV9FTlRSWV9LRVlfREVMKHBBZCwgQnNzSWR4LCBXY2lkKQlcCi0JQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBCc3NJZHgsIChVQ0hBUilXY2lkKTsKLQotLy8gYWRkIENsaWVudCBzZWN1cml0eSBpbmZvcm1hdGlvbiBpbnRvIEFTSUMgV0NJRCB0YWJsZSBhbmQgSVZFSVYgdGFibGUKLSNkZWZpbmUgUlRNUF9TVEFfU0VDVVJJVFlfSU5GT19BREQocEFkLCBhcGlkeCwgS2V5SUQsIHBFbnRyeSkJCVwKLQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgYXBpZHgsIEtleUlELAkJCVwKLQkJCQkJCQlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZywgcEVudHJ5KTsKLQotI2RlZmluZSBSVE1QX1NFQ1VSSVRZX0tFWV9BREQocEFkLCBhcGlkeCwgS2V5SUQsIHBFbnRyeSkJCVwKLQl7CS8qIHVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlICovCVwKLQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgYXBpZHgsIEtleUlELAkJCQkJXAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZywJCVwKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5LZXksCQkJCVwKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5UeE1pYywJCQlcCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uUnhNaWMpOwkJCVwKLQkJLyogdXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlICovCQkJXAotCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgYXBpZHgsIEtleUlELAkJCQkJXAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZywJCVwKLQkJCQkJCSAgcEVudHJ5KTsgfQotCi0KLS8vIEluc2VydCB0aGUgQkEgYml0bWFwIHRvIEFTSUMgZm9yIHRoZSBXY2lkIGVudHJ5Ci0jZGVmaW5lIFJUTVBfQUREX0JBX1NFU1NJT05fVE9fQVNJQyhfcEFkLCBfQWlkLCBfVElEKQlcCi0JCWRvewkJCQkJXAotCQkJVUlOVDMyCV9WYWx1ZSA9IDAsIF9PZmZzZXQ7CQkJCQlcCi0JCQlfT2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChfQWlkKSAqIEhXX1dDSURfRU5UUllfU0laRSArIDQ7CVwKLQkJCVJUTVBfSU9fUkVBRDMyKChfcEFkKSwgX09mZnNldCwgJl9WYWx1ZSk7XAotCQkJX1ZhbHVlIHw9ICgweDEwMDAwPDwoX1RJRCkpOwlcCi0JCQlSVE1QX0lPX1dSSVRFMzIoKF9wQWQpLCBfT2Zmc2V0LCBfVmFsdWUpO1wKLQkJfXdoaWxlKDApCi0KLQotLy8gUmVtb3ZlIHRoZSBCQSBiaXRtYXAgZnJvbSBBU0lDIGZvciB0aGUgV2NpZCBlbnRyeQotLy8JCWJpdG1hcCBmaWVsZCBzdGFydHMgYXQgMHgxMDAwMCBpbiBBU0lDIFdDSUQgdGFibGUKLSNkZWZpbmUgUlRNUF9ERUxfQkFfU0VTU0lPTl9GUk9NX0FTSUMoX3BBZCwgX1djaWQsIF9USUQpCQkJCVwKLQkJZG97CQkJCQkJCQlcCi0JCQlVSU5UMzIJX1ZhbHVlID0gMCwgX09mZnNldDsJCQkJXAotCQkJX09mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyAoX1djaWQpICogSFdfV0NJRF9FTlRSWV9TSVpFICsgNDsJXAotCQkJUlRNUF9JT19SRUFEMzIoKF9wQWQpLCBfT2Zmc2V0LCAmX1ZhbHVlKTsJCQlcCi0JCQlfVmFsdWUgJj0gKH4oMHgxMDAwMCA8PCAoX1RJRCkpKTsJCQkJXAotCQkJUlRNUF9JT19XUklURTMyKChfcEFkKSwgX09mZnNldCwgX1ZhbHVlKTsJCQlcCi0JCX13aGlsZSgwKQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIEludGVyZmFjZSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8vCi0vLyBFbmFibGUgJiBEaXNhYmxlIE5JQyBpbnRlcnJ1cHQgdmlhIHdyaXRpbmcgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIKLS8vIFNpbmNlIGl0IHVzZSBBREFQVEVSIHN0cnVjdHVyZSwgaXQgaGF2ZSB0byBiZSBwdXQgYWZ0ZXIgc3RydWN0dXJlIGRlZmluaXRpb24uCi0vLwotI2RlZmluZSBSVE1QX0FTSUNfSU5URVJSVVBUX0RJU0FCTEUoX3BBZCkJCVwKLQlkb3sJCQlcCi0JCVJUTVBfSU9fV1JJVEUzMigoX3BBZCksIElOVF9NQVNLX0NTUiwgMHgwKTsgICAgIC8qIDA6IGRpc2FibGUgKi8JXAotCQlSVE1QX0NMRUFSX0ZMQUcoKF9wQWQpLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpOwkJXAotCX13aGlsZSgwKQotCi0jZGVmaW5lIFJUTVBfQVNJQ19JTlRFUlJVUFRfRU5BQkxFKF9wQWQpXAotCWRvewkJCQlcCi0JCVJUTVBfSU9fV1JJVEUzMigoX3BBZCksIElOVF9NQVNLX0NTUiwgKF9wQWQpLT5pbnRfZW5hYmxlX3JlZyAvKkRFTEFZSU5UTUFTSyovKTsgICAgIC8qIDE6ZW5hYmxlICovCVwKLQkJUlRNUF9TRVRfRkxBRygoX3BBZCksIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSk7CVwKLQl9d2hpbGUoMCkKLQotCi0jZGVmaW5lIFJUTVBfSVJRX0lOSVQocEFkKQlcCi0JewlwQWQtPmludF9lbmFibGVfcmVnID0gKChERUxBWUlOVE1BU0spIHwJCVwKLQkJCQkJKFJ4SU5UfFR4RGF0YUludHxUeE1nbXRJbnQpKSAmIH4oMHgwMyk7CVwKLQkJcEFkLT5pbnRfZGlzYWJsZV9tYXNrID0gMDsJCQkJCQlcCi0JCXBBZC0+aW50X3BlbmRpbmcgPSAwOyB9Ci0KLSNkZWZpbmUgUlRNUF9JUlFfRU5BQkxFKHBBZCkJCQkJCVwKLQl7CS8qIGNsZWFyIGdhcmJhZ2UgaW50cyAqLwkJCVwKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsIDB4ZmZmZmZmZmYpO1wKLQkJUlRNUF9BU0lDX0lOVEVSUlVQVF9FTkFCTEUocEFkKTsgfQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIE1MTUUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVE1QX01MTUVfSEFORExFUihwQWQpCQkJTWxtZUhhbmRsZXIocEFkKQotCi0jZGVmaW5lIFJUTVBfTUxNRV9QUkVfU0FOSVRZX0NIRUNLKHBBZCkKLQotI2RlZmluZSBSVE1QX01MTUVfU1RBX1FVSUNLX1JTUF9XQUtFX1VQKHBBZCkJXAotCQlSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLCAxMDApOwotCi0jZGVmaW5lIFJUTVBfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZCkJXAotCQlNbG1lUmVzdGFydFN0YXRlTWFjaGluZShwQWQpCi0KLSNkZWZpbmUgUlRNUF9IQU5ETEVfQ09VTlRFUl9NRUFTVVJFKF9wQWQsIF9wRW50cnkpXAotCQlIYW5kbGVDb3VudGVyTWVhc3VyZShfcEFkLCBfcEVudHJ5KQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBQb3dlciBTYXZlIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgUlRNUF9QU19QT0xMX0VOUVVFVUUocEFkKQkJCQlFbnF1ZXVlUHNQb2xsKHBBZCkKLQotCi0vLyBGb3IgUlRNUFBDSWVQb3dlckxpbmtDdHJsUmVzdG9yZSAoKSBmdW5jdGlvbgotI2RlZmluZSBSRVNUT1JFX0hBTFQJCTEKLSNkZWZpbmUgUkVTVE9SRV9XQUtFVVAJCTIKLSNkZWZpbmUgUkVTVE9SRV9DTE9TRSAgICAgICAgICAgMwotCi0jZGVmaW5lIFBvd2VyU2FmZUNJRAkJMQotI2RlZmluZSBQb3dlclJhZGlvT2ZmQ0lECTIKLSNkZWZpbmUgUG93ZXJXYWtlQ0lECQkzCi0jZGVmaW5lIENJRDBNQVNLCQkweDAwMDAwMGZmCi0jZGVmaW5lIENJRDFNQVNLCQkweDAwMDBmZjAwCi0jZGVmaW5lIENJRDJNQVNLCQkweDAwZmYwMDAwCi0jZGVmaW5lIENJRDNNQVNLCQkweGZmMDAwMDAwCi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2RlZmluZSBSVE1QX1NUQV9GT1JDRV9XQUtFVVAocEFkLCBiRnJvbVR4KSBcCi0gICAgUlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwKHBBZCwgYkZyb21UeCk7Ci0KLSNkZWZpbmUgUlRNUF9TVEFfU0xFRVBfVEhFTl9BVVRPX1dBS0VVUChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApIFwKLSAgICBSVDI4eHhQY2lTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOwotCi0jZGVmaW5lIFJUTVBfU0VUX1BTTV9CSVQoX3BBZCwgX3ZhbCkgXAotCU1sbWVTZXRQc21CaXQoX3BBZCwgX3ZhbCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNkZWZpbmUgUlRNUF9NTE1FX1JBRElPX09OKHBBZCkgXAotICAgIFJUMjh4eFBjaU1sbWVSYWRpb09uKHBBZCk7Ci0KLSNkZWZpbmUgUlRNUF9NTE1FX1JBRElPX09GRihwQWQpIFwKLSAgICBSVDI4eHhQY2lNbG1lUmFkaW9PRkYocEFkKTsKLQotI2VuZGlmIC8vX19NQUNfUENJX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9tbG1lLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL21sbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzNjc0My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL21sbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNjAgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBtbG1lLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlKb2huIENoYW5nCTIwMDMtMDgtMjgJCUNyZWF0ZWQKLQlKb2huIENoYW5nICAyMDA0LTA5LTA2ICAgICAgbW9kaWZpZWQgZm9yIFJUMjYwMAotKi8KLSNpZm5kZWYgX19NTE1FX0hfXwotI2RlZmluZSBfX01MTUVfSF9fCi0KLSNpbmNsdWRlICJydG1wX2RvdDExLmgiCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0vLyBtYXhpbXVtIHN1cHBvcnRlZCBjYXBhYmlsaXR5IGluZm9ybWF0aW9uIC0KLS8vIEVTUywgSUJTUywgUHJpdmFjeSwgU2hvcnQgUHJlYW1ibGUsIFNwZWN0cnVtIG1nbXQsIFNob3J0IFNsb3QKLSNkZWZpbmUgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTyAgIDB4MDUzMwotCi0jZGVmaW5lIEVORF9PRl9BUkdTICAgICAgICAgICAgICAgICAtMQotI2RlZmluZSBMRlNSX01BU0sgICAgICAgICAgICAgICAgICAgMHg4MDAwMDA1NwotI2RlZmluZSBNTE1FX1RBU0tfRVhFQ19JTlRWICAgICAgICAgMTAwLyoyMDAqLyAgICAgICAvLwotI2RlZmluZSBMRUFEX1RJTUUgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAgICAgICAxMCAgLyo1Ki8gICAgICAgLy8gTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgKiBNTE1FX1RBU0tfRVhFQ19JTlRWID0gMSBzZWMKLSNkZWZpbmUgUkVPUkRFUl9FWEVDX0lOVFYJCTEwMCAgICAgICAvLyAwLjEgc2VjCi0vLyNkZWZpbmUgVEJUVF9QUkVMT0FEX1RJTUUgICAgICAgICAzODQgICAgICAgIC8vIHVzZWMuIExvbWdQcmVhbWJsZSArIDI0LWJ5dGUgYXQgMU1icHMKLQotLy8gVGhlIGRlZmluaXRpb24gb2YgUmFkYXIgZGV0ZWN0aW9uIGR1cmF0aW9uIHJlZ2lvbgotI2RlZmluZSBDRQkJMAotI2RlZmluZSBGQ0MJCTEKLSNkZWZpbmUgSkFQCQkyCi0jZGVmaW5lIEpBUF9XNTMJMwotI2RlZmluZSBKQVBfVzU2CTQKLSNkZWZpbmUgTUFYX1JEX1JFR0lPTiA1Ci0KLSNkZWZpbmUgQkVBQ09OX0xPU1RfVElNRSAgICAgICAgICAgIDQgKiBPU19IWiAgICAvLyAyMDQ4IG1zZWMgPSAyIHNlYwotCi0jZGVmaW5lIERMU19USU1FT1VUICAgICAgICAgICAgICAgICAxMjAwICAgICAgLy8gdW5pdDogbXNlYwotI2RlZmluZSBBVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgMzAwICAgICAgIC8vIHVuaXQ6IG1zZWMKLSNkZWZpbmUgQVNTT0NfVElNRU9VVCAgICAgICAgICAgICAgIDMwMCAgICAgICAvLyB1bml0OiBtc2VjCi0jZGVmaW5lIEpPSU5fVElNRU9VVCAgICAgICAgICAgICAgICAyMDAwICAgICAgICAvLyB1bml0OiBtc2VjCi0jZGVmaW5lIFNIT1JUX0NIQU5ORUxfVElNRSAgICAgICAgICA5MCAgICAgICAgLy8gdW5pdDogbXNlYwotI2RlZmluZSBNSU5fQ0hBTk5FTF9USU1FICAgICAgICAgICAgMTEwICAgICAgICAvLyB1bml0OiBtc2VjLCBmb3IgZHVhbCBiYW5kIHNjYW4KLSNkZWZpbmUgTUFYX0NIQU5ORUxfVElNRSAgICAgICAgICAgIDE0MCAgICAgICAvLyB1bml0OiBtc2VjLCBmb3Igc2luZ2xlIGJhbmQgc2NhbgotI2RlZmluZQlGQVNUX0FDVElWRV9TQ0FOX1RJTUUJICAgIDMwCQkgIC8vIEFjdGl2ZSBzY2FuIHdhaXRpbmcgZm9yIHByb2JlIHJlc3BvbnNlIHRpbWUKLSNkZWZpbmUgQ1dfTUlOX0lOX0JJVFMgICAgICAgICAgICAgIDQgICAgICAgICAvLyBhY3R1YWwgQ3dNaW4gPSAyXkNXX01JTl9JTl9CSVRTIC0gMQotI2RlZmluZSBMSU5LX0RPV05fVElNRU9VVCAgICAgICAgICAgMjAwMDAgICAgICAvLyB1bml0OiBtc2VjCi0jZGVmaW5lIEFVVE9fV0FLRVVQX1RJTUVPVVQJCQk3MAkJCS8vdW5pdDogbXNlYwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNkZWZpbmUgQ1dfTUFYX0lOX0JJVFMgICAgICAgICAgICAgIDEwICAgICAgICAvLyBhY3R1YWwgQ3dNYXggPSAyXkNXX01BWF9JTl9CSVRTIC0gMQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKLWV4dGVybiBVSU5UMzIgQ1dfTUFYX0lOX0JJVFM7Ci0jZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KLQotLy8gTm90ZTogUlNTSV9UT19EQk1fT0ZGU0VUIGhhcyBiZWVuIGNoYW5nZWQgdG8gdmFyaWFibGUgZm9yIG5ldyBSRiAoMjAwNC0wNzIwKS4KLS8vIFNIb3VsZCBub3QgcmVmZXIgdG8gdGhpcyBjb25zdGFudCBhbnltb3JlCi0vLyNkZWZpbmUgUlNTSV9UT19EQk1fT0ZGU0VUICAgICAgICAgIDEyMCAvLyBmb3IgUlQyNTMwIFJTU0ktMTE1ID0gZEJtCi0jZGVmaW5lIFJTU0lfRk9SX01JRF9UWF9QT1dFUiAgICAgICAtNTUgIC8vIC01NSBkYiBpcyBjb25zaWRlcmVkIG1pZC1kaXN0YW5jZQotI2RlZmluZSBSU1NJX0ZPUl9MT1dfVFhfUE9XRVIgICAgICAgLTQ1ICAvLyAtNDUgZGIgaXMgY29uc2lkZXJlZCB2ZXJ5IHNob3J0IGRpc3RhbmNlIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsaWdpYmxlIHRvIHVzZSBhIGxvd2VyIFRYIHBvd2VyCi0jZGVmaW5lIFJTU0lfRk9SX0xPV0VTVF9UWF9QT1dFUiAgICAtMzAKLS8vI2RlZmluZSBNSURfVFhfUE9XRVJfREVMVEEgICAgICAgICAgMCAgIC8vIDAgZGIgZnJvbSBmdWxsIFRYIHBvd2VyIHVwb24gbWlkLWRpc3RhbmNlIHRvIEFQCi0jZGVmaW5lIExPV19UWF9QT1dFUl9ERUxUQSAgICAgICAgICA2ICAgIC8vIC0zIGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHZlcnkgc2hvcnQgZGlzdGFuY2UuIDEgZ3JhZGUgaXMgMC41IGRiCi0jZGVmaW5lIExPV0VTVF9UWF9QT1dFUl9ERUxUQSAgICAgICAxNiAgIC8vIC04IGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHNob3J0ZXN0IGRpc3RhbmNlLiAxIGdyYWRlIGlzIDAuNSBkYgotCi0jZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEICAgICAwCi0jZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fRVhDQ0VFRF9USFJFU0hPTEQgICAxCi0jZGVmaW5lIFJTU0lfVEhSRVNIT0xEX0ZPUl9ST0FNSU5HICAgICAgICAgICAgICAyNQotI2RlZmluZSBSU1NJX0RFTFRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQotCi0vLyBDaGFubmVsIFF1YWxpdHkgSW5kaWNhdGlvbgotI2RlZmluZSBDUUlfSVNfR09PRChjcWkpICAgICAgICAgICAgKChjcWkpID49IDUwKQotLy8jZGVmaW5lIENRSV9JU19GQUlSKGNxaSkgICAgICAgICAgKCgoY3FpKSA+PSAyMCkgJiYgKChjcWkpIDwgNTApKQotI2RlZmluZSBDUUlfSVNfUE9PUihjcWkpICAgICAgICAgICAgKGNxaSA8IDUwKSAgLy8oKChjcWkpID49IDUpICYmICgoY3FpKSA8IDIwKSkKLSNkZWZpbmUgQ1FJX0lTX0JBRChjcWkpICAgICAgICAgICAgIChjcWkgPCA1KQotI2RlZmluZSBDUUlfSVNfREVBRChjcWkpICAgICAgICAgICAgKGNxaSA9PSAwKQotCi0vLyB3ZWlnaHRpbmcgZmFjdG9yIHRvIGNhbGN1bGF0ZSBDaGFubmVsIHF1YWxpdHksIHRvdGFsIHNob3VsZCBiZSAxMDAlCi0jZGVmaW5lIFJTU0lfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgIDUwCi0jZGVmaW5lIFRYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDMwCi0jZGVmaW5lIFJYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDIwCi0KLS8vI2RlZmluZSBQRUVSX0tFWV9OT1RfVVNFRCAgICAgICAgICAgICAgICAwCi0vLyNkZWZpbmUgUEVFUl9LRVlfNjRfQklUICAgICAgICAgICAgICAgICAgNjQKLS8vI2RlZmluZSBQRUVSX0tFWV8xMjhfQklUICAgICAgICAgICAgICAgICAxMjgKLQotLy8jZGVmaW5lIFBFRVJfS0VZXzY0QklUX0xFTiAgICAgICAgICAgICAgIDgKLS8vI2RlZmluZSBQRUVSX0tFWV8xMjhCSVRfTEVOICAgICAgICAgICAgICAxNgotCi0jZGVmaW5lIEJTU19OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZGVmaW5lIE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSAgICAgICAgICAgIDQwIC8vMTAKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2RlZmluZSBTQ0FOX1BBU1NJVkUgICAgICAgICAgICAgICAgICAgICAxOAkJLy8gc2NhbiB3aXRoIG5vIHByb2JlIHJlcXVlc3QsIG9ubHkgd2FpdCBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlCi0jZGVmaW5lIFNDQU5fQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDE5CQkvLyBzY2FuIHdpdGggcHJvYmUgcmVxdWVzdCwgYW5kIHdhaXQgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZQotI2RlZmluZQlTQ0FOX0NJU0NPX1BBU1NJVkUJCQkJIDIwCQkvLyBTaW5nbGUgY2hhbm5lbCBwYXNzaXZlIHNjYW4KLSNkZWZpbmUJU0NBTl9DSVNDT19BQ1RJVkUJCQkJIDIxCQkvLyBTaW5nbGUgY2hhbm5lbCBhY3RpdmUgc2NhbgotI2RlZmluZQlTQ0FOX0NJU0NPX05PSVNFCQkJCSAyMgkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuIGZvciBub2lzZSBoaXN0b2dyYW0gY29sbGVjdGlvbgotI2RlZmluZQlTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRAkJCSAyMwkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuIGZvciBjaGFubmVsIGxvYWQgY29sbGVjdGlvbgotI2RlZmluZSBGQVNUX1NDQU5fQUNUSVZFICAgICAgICAgICAgICAgICAyNAkJLy8gc2NhbiB3aXRoIHByb2JlIHJlcXVlc3QsIGFuZCB3YWl0IGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UKLQotI2lmZGVmIERPVDExTl9EUkFGVDMKLSNkZWZpbmUgU0NBTl8yMDQwX0JTU19DT0VYSVNUICAgICAgICAgICAgICAgICAgMjYKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0KLS8vI2RlZmluZSBCU1NfVEFCTEVfRU1QVFkoeCkgICAgICAgICAgICAgKCh4KS5Cc3NOciA9PSAwKQotI2RlZmluZSBNQUNfQUREUl9JU19HUk9VUChBZGRyKSAgICAgICAoKChBZGRyWzBdKSAmIDB4MDEpKQotI2RlZmluZSBNQUNfQUREUl9IQVNIKEFkZHIpICAgICAgICAgICAgKEFkZHJbMF0gXiBBZGRyWzFdIF4gQWRkclsyXSBeIEFkZHJbM10gXiBBZGRyWzRdIF4gQWRkcls1XSkKLSNkZWZpbmUgTUFDX0FERFJfSEFTSF9JTkRFWChBZGRyKSAgICAgIChNQUNfQUREUl9IQVNIKEFkZHIpICUgSEFTSF9UQUJMRV9TSVpFKQotI2RlZmluZSBUSURfTUFDX0hBU0goQWRkcixUSUQpICAgICAgICAgICAgKFRJRF5BZGRyWzBdIF4gQWRkclsxXSBeIEFkZHJbMl0gXiBBZGRyWzNdIF4gQWRkcls0XSBeIEFkZHJbNV0pCi0jZGVmaW5lIFRJRF9NQUNfSEFTSF9JTkRFWChBZGRyLFRJRCkgICAgICAoVElEX01BQ19IQVNIKEFkZHIsVElEKSAlIEhBU0hfVEFCTEVfU0laRSkKLQotLy8gTEVEIENvbnRyb2wKLS8vIGFzc29pYXRpb24gT04uIG9uZSBMRUQgT04uIGFub3RoZXIgYmxpbmtpbmcgd2hlbiBUWCwgT0ZGIHdoZW4gaWRsZQotLy8gbm8gYXNzb2NpYXRpb24sIGJvdGggTEVEIG9mZgotI2RlZmluZSBBU0lDX0xFRF9BQ1RfT04ocEFkKSAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjE0LCAweDAwMDMxZTQ2KQotI2RlZmluZSBBU0lDX0xFRF9BQ1RfT0ZGKHBBZCkgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjE0LCAweDAwMDAxZTQ2KQotCi0vLyBiaXQgZGVmaW5pdGlvbiBvZiB0aGUgMi1ieXRlIHBCRUFDT04tPkNhcGFiaWxpdHkgZmllbGQKLSNkZWZpbmUgQ0FQX0lTX0VTU19PTih4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwMDEpICE9IDApCi0jZGVmaW5lIENBUF9JU19JQlNTX09OKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHgwMDAyKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfQ0ZfUE9MTEFCTEVfT04oeCkgICAgICAgICAoKCh4KSAmIDB4MDAwNCkgIT0gMCkKLSNkZWZpbmUgQ0FQX0lTX0NGX1BPTExfUkVRX09OKHgpICAgICAgICAgKCgoeCkgJiAweDAwMDgpICE9IDApCi0jZGVmaW5lIENBUF9JU19QUklWQUNZX09OKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwMDEwKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfU0hPUlRfUFJFQU1CTEVfT04oeCkgICAgICAoKCh4KSAmIDB4MDAyMCkgIT0gMCkKLSNkZWZpbmUgQ0FQX0lTX1BCQ0NfT04oeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwNDApICE9IDApCi0jZGVmaW5lIENBUF9JU19BR0lMSVRZX09OKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwMDgwKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfU1BFQ1RSVU1fTUdNVCh4KSAgICAgICAgICAoKCh4KSAmIDB4MDEwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgQ0FQX0lTX1FPUyh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAyMDApICE9IDApICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIENBUF9JU19TSE9SVF9TTE9UKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwNDAwKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfQVBTRCh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDgwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgQ0FQX0lTX0lNTUVEX0JBKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEwMDApICE9IDApICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIENBUF9JU19EU1NTX09GRE0oeCkgICAgICAgICAgICAgICgoKHgpICYgMHgyMDAwKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfREVMQVlfQkEoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4NDAwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKLQotI2RlZmluZSBDQVBfR0VORVJBVEUoZXNzLGlic3MscHJpdixzX3ByZSxzX3Nsb3Qsc3BlY3RydW0pICAoKChlc3MpID8gMHgwMDAxIDogMHgwMDAwKSB8ICgoaWJzcykgPyAweDAwMDIgOiAweDAwMDApIHwgKChwcml2KSA/IDB4MDAxMCA6IDB4MDAwMCkgfCAoKHNfcHJlKSA/IDB4MDAyMCA6IDB4MDAwMCkgfCAoKHNfc2xvdCkgPyAweDA0MDAgOiAweDAwMDApIHwgKChzcGVjdHJ1bSkgPyAweDAxMDAgOiAweDAwMDApKQotCi0vLyNkZWZpbmUgU1RBX1FPU19DQVBBQklMSVRZICAgICAgICAgICAgICAgMCAvLyAxLWJ5dGUuIHNlZSA4MDIuMTFlIGQ5LjAgZm9yIGJpdCBkZWZpbml0aW9uCi0KLSNkZWZpbmUgRVJQX0lTX05PTl9FUlBfUFJFU0VOVCh4KSAgICAgICAgKCgoeCkgJiAweDAxKSAhPSAwKSAgICAvLyA4MDIuMTFnCi0jZGVmaW5lIEVSUF9JU19VU0VfUFJPVEVDVElPTih4KSAgICAgICAgICgoKHgpICYgMHgwMikgIT0gMCkgICAgLy8gODAyLjExZwotI2RlZmluZSBFUlBfSVNfVVNFX0JBUktFUl9QUkVBTUJMRSh4KSAgICAoKCh4KSAmIDB4MDQpICE9IDApICAgIC8vIDgwMi4xMWcKLQotI2RlZmluZSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORCAgICAgICA4Ly8gMyAgLy8ganVzdCB0ZXN0IGJ5IGdhcnkKLSNkZWZpbmUgRFJTX1BFTkFMVFkgICAgICAgICAgICAgICAgICAgICAgOAotCi0jZGVmaW5lIEJBX05PVFVTRQkyCi0vL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZQotI2RlZmluZSBJTU1FRF9CQQkxCi0jZGVmaW5lIERFTEFZX0JBCTAKLQotLy8gQkEgSW5pdGlhdG9yIHN1YmZpZWxkIGluIERFTEJBIGZyYW1lCi0jZGVmaW5lIE9SSUdJTkFUT1IJMQotI2RlZmluZSBSRUNJUElFTlQJMAotCi0vLyBBRERCQSBTdGF0dXMgQ29kZQotI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX1NVQ0NFU1MJCQkJCTAKLSNkZWZpbmUgQUREQkFfUkVTVUxUQ09ERV9SRUZVU0VECQkJCQkzNwotI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX0lOVkFMSURfUEFSQU1FVEVSUwkJCTM4Ci0KLS8vIERFTEJBIFJlYXNvbiBDb2RlCi0jZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfUVNUQV9MRUFWSU5HCQkJCTM2Ci0jZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfRU5EX0JBCQkJCQkJMzcKLSNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9VTktOT1dOX0JBCQkJCQkzOAotI2RlZmluZSBERUxCQV9SRUFTT05DT0RFX1RJTUVPVVQJCQkJCTM5Ci0KLS8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycwotI2RlZmluZSBSRVNFVF9PTkVfU0VDX1RYX0NOVChfX3BFbnRyeSkgXAotaWYgKCgoX19wRW50cnkpKSAhPSBOVUxMKSBcCi17IFwKLQkoX19wRW50cnkpLT5PbmVTZWNUeFJldHJ5T2tDb3VudCA9IDA7IFwKLQkoX19wRW50cnkpLT5PbmVTZWNUeEZhaWxDb3VudCA9IDA7IFwKLQkoX19wRW50cnkpLT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID0gMDsgXAotfQotCi0vLwotLy8gODAyLjExIGZyYW1lIGZvcm1hdHMKLS8vCi0vLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVU0hPUlQJTFNJR1R4b3BQcm9TdXA6MTsKLQlVU0hPUlQJRm9ydHlfTWh6X0ludG9sZXJhbnQ6MTsKLQlVU0hPUlQJUFNNUDoxOwotCVVTSE9SVAlDQ0ttb2RlaW40MDoxOwotCVVTSE9SVAlBTXNkdVNpemU6MTsKLQlVU0hPUlQJRGVsYXllZEJBOjE7CS8vcnQyODYwYyBub3Qgc3VwcG9ydAotCVVTSE9SVAlSeFNUQkM6MjsKLQlVU0hPUlQJVHhTVEJDOjE7Ci0JVVNIT1JUCVNob3J0R0lmb3I0MDoxOwkvL2ZvcjQwTUh6Ci0JVVNIT1JUCVNob3J0R0lmb3IyMDoxOwotCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCi0JVVNIT1JUCU1pbW9QczoyOy8vbW9taSBwb3dlciBzYWZlCi0JVVNIT1JUCUNoYW5uZWxXaWR0aDoxOwotCVVTSE9SVAlBZHZDb2Rpbmc6MTsKLSNlbHNlCi0JVVNIT1JUCUFkdkNvZGluZzoxOwotCVVTSE9SVAlDaGFubmVsV2lkdGg6MTsKLQlVU0hPUlQJTWltb1BzOjI7Ly9tb21pIHBvd2VyIHNhZmUKLQlVU0hPUlQJR0Y6MTsJLy9ncmVlbiBmaWVsZAotCVVTSE9SVAlTaG9ydEdJZm9yMjA6MTsKLQlVU0hPUlQJU2hvcnRHSWZvcjQwOjE7CS8vZm9yNDBNSHoKLQlVU0hPUlQJVHhTVEJDOjE7Ci0JVVNIT1JUCVJ4U1RCQzoyOwotCVVTSE9SVAlEZWxheWVkQkE6MTsJLy9ydDI4NjBjIG5vdCBzdXBwb3J0Ci0JVVNIT1JUCUFNc2R1U2l6ZToxOwkvLyBvbmx5IHN1cHBvcnQgYXMgemVybwotCVVTSE9SVAlDQ0ttb2RlaW40MDoxOwotCVVTSE9SVAlQU01QOjE7Ci0JVVNIT1JUCUZvcnR5X01oel9JbnRvbGVyYW50OjE7Ci0JVVNIT1JUCUxTSUdUeG9wUHJvU3VwOjE7Ci0jZW5kaWYJLyogIVJUX0JJR19FTkRJQU4gKi8KLX0gSFRfQ0FQX0lORk8sICpQSFRfQ0FQX0lORk87Ci0KLS8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCXJzdjozOy8vbW9taSBwb3dlciBzYWZlCi0JVUNIQVIJTXBkdURlbnNpdHk6MzsKLQlVQ0hBUglNYXhSQW1wZHVGYWN0b3I6MjsKLSNlbHNlCi0JVUNIQVIJTWF4UkFtcGR1RmFjdG9yOjI7Ci0JVUNIQVIJTXBkdURlbnNpdHk6MzsKLQlVQ0hBUglyc3Y6MzsvL21vbWkgcG93ZXIgc2FmZQotI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCi19IEhUX0NBUF9QQVJNLCAqUEhUX0NBUF9QQVJNOwotCi0vLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotCVVDSEFSCU1DU1NldFsxMF07Ci0JVUNIQVIJU3VwUmF0ZVsyXTsgIC8vIHVuaXQgOiAxTWJwcwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVQ0hBUglyc3Y6MzsKLQlVQ0hBUglNcGR1RGVuc2l0eToxOwotCVVDSEFSCVR4U3RyZWFtOjI7Ci0JVUNIQVIJVHhSeE5vdEVxdWFsOjE7Ci0JVUNIQVIJVHhNQ1NTZXREZWZpbmVkOjE7Ci0jZWxzZQotCVVDSEFSCVR4TUNTU2V0RGVmaW5lZDoxOwotCVVDSEFSCVR4UnhOb3RFcXVhbDoxOwotCVVDSEFSCVR4U3RyZWFtOjI7Ci0JVUNIQVIJTXBkdURlbnNpdHk6MTsKLQlVQ0hBUglyc3Y6MzsKLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi0JVUNIQVIJcnN2M1szXTsKLX0gSFRfTUNTX1NFVCwgKlBIVF9NQ1NfU0VUOwotCi0vLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVU0hPUlQJcnN2Mjo0OwotCVVTSE9SVAlSREdTdXBwb3J0OjE7CS8vcmV2ZXJzZSBEaXJlY3Rpb24gR3JhbnQgIHN1cHBvcnQKLQlVU0hPUlQJUGx1c0hUQzoxOwkvLytIVEMgY29udHJvbCBmaWVsZCBzdXBwb3J0Ci0JVVNIT1JUCU1DU0ZlZWRiYWNrOjI7CS8vMDpubyBNQ1MgZmVlZGJhY2ssIDI6dW5zb2xpY2l0ZWQgTUNTIGZlZWRiYWNrLCAzOkZ1bGwgTUNTIGZlZWRiYWNrLCAgMTpyc3YuCi0JVVNIT1JUCXJzdjo1Oy8vbW9taSBwb3dlciBzYWZlCi0JVVNIT1JUCVRyYW5UaW1lOjI7Ci0JVVNIT1JUCVBjbzoxOwotI2Vsc2UKLQlVU0hPUlQJUGNvOjE7Ci0JVVNIT1JUCVRyYW5UaW1lOjI7Ci0JVVNIT1JUCXJzdjo1Oy8vbW9taSBwb3dlciBzYWZlCi0JVVNIT1JUCU1DU0ZlZWRiYWNrOjI7CS8vMDpubyBNQ1MgZmVlZGJhY2ssIDI6dW5zb2xpY2l0ZWQgTUNTIGZlZWRiYWNrLCAzOkZ1bGwgTUNTIGZlZWRiYWNrLCAgMTpyc3YuCi0JVVNIT1JUCVBsdXNIVEM6MTsJLy8rSFRDIGNvbnRyb2wgZmllbGQgc3VwcG9ydAotCVVTSE9SVAlSREdTdXBwb3J0OjE7CS8vcmV2ZXJzZSBEaXJlY3Rpb24gR3JhbnQgIHN1cHBvcnQKLQlVU0hPUlQJcnN2Mjo0OwotI2VuZGlmIC8qIFJUX0JJR19FTkRJQU4gKi8KLX0gRVhUX0hUX0NBUF9JTkZPLCAqUEVYVF9IVF9DQVBfSU5GTzsKLQotLy8gIEhUIEJlYW1mb3JtaW5nIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0hUX0JGX0NBUHsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JVUxPTkcJcnN2OjM7Ci0JVUxPTkcJQ2hhbkVzdGltYXRpb246MjsKLQlVTE9ORwlDU0lSb3dCRlN1cDoyOwotCVVMT05HCUNvbVN0ZWVyQkZBbnRTdXA6MjsKLQlVTE9ORwlOb0NvbVN0ZWVyQkZBbnRTdXA6MjsKLQlVTE9ORwlDU0lCRkFudFN1cDoyOwotCVVMT05HCU1pbkdyb3VwaW5nOjI7Ci0JVUxPTkcJRXhwQ29tQkY6MjsKLQlVTE9ORwlFeHBOb0NvbUJGOjI7Ci0JVUxPTkcJRXhwQ1NJRmJrOjI7Ci0JVUxPTkcJRXhwQ29tU3RlZXJDYXBhYmxlOjE7Ci0JVUxPTkcJRXhwTm9Db21TdGVlckNhcGFibGU6MTsKLQlVTE9ORwlFeHBDU0lDYXBhYmxlOjE7Ci0JVUxPTkcJQ2FsaWJyYXRpb246MjsKLQlVTE9ORwlJbXBUeEJGQ2FwYWJsZToxOwotCVVMT05HCVR4TkRQQ2FwYWJsZToxOwotCVVMT05HCVJ4TkRQQ2FwYWJsZToxOwotCVVMT05HCVR4U291bmRDYXBhYmxlOjE7Ci0JVUxPTkcJUnhTb3VuZENhcGFibGU6MTsKLQlVTE9ORwlUeEJGUmVjQ2FwYWJsZToxOwotI2Vsc2UKLQlVTE9ORwlUeEJGUmVjQ2FwYWJsZToxOwotCVVMT05HCVJ4U291bmRDYXBhYmxlOjE7Ci0JVUxPTkcJVHhTb3VuZENhcGFibGU6MTsKLQlVTE9ORwlSeE5EUENhcGFibGU6MTsKLQlVTE9ORwlUeE5EUENhcGFibGU6MTsKLQlVTE9ORwlJbXBUeEJGQ2FwYWJsZToxOwotCVVMT05HCUNhbGlicmF0aW9uOjI7Ci0JVUxPTkcJRXhwQ1NJQ2FwYWJsZToxOwotCVVMT05HCUV4cE5vQ29tU3RlZXJDYXBhYmxlOjE7Ci0JVUxPTkcJRXhwQ29tU3RlZXJDYXBhYmxlOjE7Ci0JVUxPTkcJRXhwQ1NJRmJrOjI7Ci0JVUxPTkcJRXhwTm9Db21CRjoyOwotCVVMT05HCUV4cENvbUJGOjI7Ci0JVUxPTkcJTWluR3JvdXBpbmc6MjsKLQlVTE9ORwlDU0lCRkFudFN1cDoyOwotCVVMT05HCU5vQ29tU3RlZXJCRkFudFN1cDoyOwotCVVMT05HCUNvbVN0ZWVyQkZBbnRTdXA6MjsKLQlVTE9ORwlDU0lSb3dCRlN1cDoyOwotCVVMT05HCUNoYW5Fc3RpbWF0aW9uOjI7Ci0JVUxPTkcJcnN2OjM7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotfSBIVF9CRl9DQVAsICpQSFRfQkZfQ0FQOwotCi0vLyAgSFQgYW50ZW5uYSBzZWxlY3Rpb24gZmllbGQgaW4gSFQgQ2FwIElFIC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfSFRfQVNfQ0FQewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVQ0hBUglyc3Y6MTsKLQlVQ0hBUglUeFNvdW5kUFBEVToxOwotCVVDSEFSCVJ4QVNlbDoxOwotCVVDSEFSCUFudEluZEZiazoxOwotCVVDSEFSCUV4cENTSUZiazoxOwotCVVDSEFSCUFudEluZEZia1R4QVNFTDoxOwotCVVDSEFSCUV4cENTSUZia1R4QVNFTDoxOwotCVVDSEFSCUFudFNlbGVjdDoxOwotI2Vsc2UKLQlVQ0hBUglBbnRTZWxlY3Q6MTsKLQlVQ0hBUglFeHBDU0lGYmtUeEFTRUw6MTsKLQlVQ0hBUglBbnRJbmRGYmtUeEFTRUw6MTsKLQlVQ0hBUglFeHBDU0lGYms6MTsKLQlVQ0hBUglBbnRJbmRGYms6MTsKLQlVQ0hBUglSeEFTZWw6MTsKLQlVQ0hBUglUeFNvdW5kUFBEVToxOwotCVVDSEFSCXJzdjoxOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLX0gSFRfQVNfQ0FQLCAqUEhUX0FTX0NBUDsKLQotLy8gRHJhZnQgMS4wIHNldCBJRSBsZW5ndGggMjYsIGJ1dCBpcyBleHRlbnNpYmxlLi4KLSNkZWZpbmUgU0laRV9IVF9DQVBfSUUJCTI2Ci0vLyBUaGUgc3RydWN0dXJlIGZvciBIVCBDYXBhYmlsaXR5IElFLgotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9IVF9DQVBBQklMSVRZX0lFewotCUhUX0NBUF9JTkZPCQlIdENhcEluZm87Ci0JSFRfQ0FQX1BBUk0JCUh0Q2FwUGFybTsKLS8vCUhUX01DU19TRVQJCUh0TUNTU2V0OwotCVVDSEFSCQkJTUNTU2V0WzE2XTsKLQlFWFRfSFRfQ0FQX0lORk8JRXh0SHRDYXBJbmZvOwotCUhUX0JGX0NBUAkJVHhCRkNhcDsJLy8gYmVhbWZvcm1pbmcgY2FwLiBydDI4NjBjIG5vdCBzdXBwb3J0IGJlYW1mb3JtaW5nLgotCUhUX0FTX0NBUAkJQVNDYXA7CS8vYW50ZW5uYSBzZWxlY3Rpb24uCi19IEhUX0NBUEFCSUxJVFlfSUUsICpQSFRfQ0FQQUJJTElUWV9JRTsKLQotCi0vLyA4MDIuMTFuIGRyYWZ0MyByZWxhdGVkIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4KLS8vIDcuMy4yLjYwCi0jZGVmaW5lIGRvdDExT0JTU1NjYW5QYXNzaXZlRHdlbGwJCQkJCQkJMjAJLy8gaW4gVFUuIG1pbiBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgY29udGlub3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBhY3RpdmUgT0JTUyBzY2FuLgotI2RlZmluZSBkb3QxMU9CU1NTY2FuQWN0aXZlRHdlbGwJCQkJCQkJMTAJLy8gaW4gVFUubWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW5vdXNseSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGFuIHBhc3NpdmUgT0JTUyBzY2FuLgotI2RlZmluZSBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbAkJCQkJMzAwICAvLyBpbiBzZWMuIG1heCBpbnRlcnZhbCBiZXR3ZWVuIHNjYW4gb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgdG8gZGV0ZWN0IEJTUyBjaGFubmVsIHdpZHRoIHRyaWdnZXIgZXZlbnRzLgotI2RlZmluZSBkb3QxMU9CU1NTY2FuUGFzc2l2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAwCS8vIGluIFRVLiBtaW4gdG90YWwgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYSBwYXNzaXZlIE9CU1Mgc2Nhbi4KLSNkZWZpbmUgZG90MTFPQlNTU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAJLy9pbiBUVS4gbWluIHRvdGFsIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGEgYWN0aXZlIE9CU1Mgc2NhbgotI2RlZmluZSBkb3QxMUJTU1dpZHRoQ2hhbm5lbFRyYW5zYWN0aW9uRGVsYXlGYWN0b3IJCQk1CS8vIG1pbiByYXRpbyBiZXR3ZWVuIHRoZSBkZWxheSB0aW1lIGluIHBlcmZvcm1pbmcgYSBzd2l0Y2ggZnJvbSAyME1IeiBCU1MgdG8gMjAvNDAgQlNTIG9wZXJhdGlvbiBhbmQgdGhlIG1heGltdW0KLQkJCQkJCQkJCQkJCQkJCQkvLwlpbnRlcnZhbCBiZXR3ZWVuIG92ZXJsYXBwaW5nIEJTUyBzY2FuIG9wZXJhdGlvbnMuCi0jZGVmaW5lIGRvdDExQlNTU2NhbkFjdGl2aXR5VGhyZXNob2xkCQkJCQkJMjUJLy8gaW4gJSUsIG1heCB0b3RhbCB0aW1lIHRoYXQgYSBTVEEgbWF5IGJlIGFjdGl2ZSBvbiB0aGUgbWVkaXVtIGR1cmluZyBhIHBlcmlvZCBvZgotCQkJCQkJCQkJCQkJCQkJCS8vCShkb3QxMUJTU1dpZHRoQ2hhbm5lbFRyYW5zYWN0aW9uRGVsYXlGYWN0b3IgKiBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbCkgc2Vjb25kcyB3aXRob3V0Ci0JCQkJCQkJCQkJCQkJCQkJLy8JYmVpbmcgb2JsaWdhdGVkIHRvIHBlcmZvcm0gT0JTUyBTY2FuIG9wZXJhdGlvbnMuIGRlZmF1bHQgaXMgMjUoPT0gMC4yNSUpCi0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfT1ZFUkxBUF9CU1NfU0NBTl9JRXsKLQlVU0hPUlQJCVNjYW5QYXNzaXZlRHdlbGw7Ci0JVVNIT1JUCQlTY2FuQWN0aXZlRHdlbGw7Ci0JVVNIT1JUCQlUcmlnZ2VyU2NhbkludDsJCQkJLy8gVHJpZ2dlciBzY2FuIGludGVydmFsCi0JVVNIT1JUCQlQYXNzaXZlVGFsUGVyQ2hhbm5lbDsJCS8vIHBhc3NpdmUgdG90YWwgcGVyIGNoYW5uZWwKLQlVU0hPUlQJCUFjdGl2ZVRhbFBlckNoYW5uZWw7CQkvLyBhY3RpdmUgdG90YWwgcGVyIGNoYW5uZWwKLQlVU0hPUlQJCURlbGF5RmFjdG9yOwkJCQkvLyBCU1Mgd2lkdGggY2hhbm5lbCB0cmFuc2l0aW9uIGRlbGF5IGZhY3RvcgotCVVTSE9SVAkJU2NhbkFjdFRocmU7CQkJCS8vIFNjYW4gQWN0aXZpdHkgdGhyZXNob2xkCi19T1ZFUkxBUF9CU1NfU0NBTl9JRSwgKlBPVkVSTEFQX0JTU19TQ0FOX0lFOwotCi0KLS8vICA3LjMuMi41Ni4gMjAvNDAgQ29leGlzdGVuY2UgZWxlbWVudCB1c2VkIGluICBFbGVtZW50IElEID0gNzIgPSBJRV8yMDQwX0JTU19DT0VYSVNUCi10eXBlZGVmIHVuaW9uIFBBQ0tFRCBfQlNTXzIwNDBfQ09FWElTVF9JRXsKLSBzdHJ1Y3QgUEFDS0VEIHsKLSAjaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCXJzdjo1OwotCVVDSEFSCUJTUzIwV2lkdGhSZXE6MTsKLQlVQ0hBUglJbnRvbGVyYW50NDA6MTsKLQlVQ0hBUglJbmZvUmVxOjE7Ci0gI2Vsc2UKLQlVQ0hBUglJbmZvUmVxOjE7Ci0JVUNIQVIJSW50b2xlcmFudDQwOjE7CQkJLy8gSW50ZXItQlNTLiBzZXQgMSB3aGVuIHByb2hpYml0cyBhIHJlY2VpdmluZyBCU1MgZnJvbSBvcGVyYXRpbmcgYXMgYSAyMC80MCBNaHogQlNTLgotCVVDSEFSCUJTUzIwV2lkdGhSZXE6MTsJCS8vIEludHJhLUJTUyBzZXQgMSB3aGVuIHByb2hpYml0cyBhIHJlY2VpdmluZyBBUCBmcm9tIG9wZXJhdGluZyBpdHMgQlNTIGFzIGEgMjAvNDBNSHogQlNTLgotCVVDSEFSCXJzdjo1OwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLSAgICB9IGZpZWxkOwotIFVDSEFSICAgd29yZDsKLX0gQlNTXzIwNDBfQ09FWElTVF9JRSwgKlBCU1NfMjA0MF9DT0VYSVNUX0lFOwotCi0KLXR5cGVkZWYgc3RydWN0ICBfVFJJR0dFUl9FVkVOVEF7Ci0JQk9PTEVBTgkJCWJWYWxpZDsKLQlVQ0hBUglCU1NJRFs2XTsKLQlVQ0hBUglSZWdDbGFzczsJLy8gUmVndWxhdG9yeSBDbGFzcwotCVVTSE9SVAlDaGFubmVsOwotCVVMT05HCUNEQ291bnRlcjsgICAvLyBNYWludGFpbiBhIHNlcGVyYXRlIGNvdW50IGRvd24gY291bnRlciBmb3IgZWFjaCBFdmVudCBBLgotfSBUUklHR0VSX0VWRU5UQSwgKlBUUklHR0VSX0VWRU5UQTsKLQotLy8gMjAvNDAgdHJpZ2dlciBldmVudCB0YWJsZQotLy8gSWYgb25lIEV2ZW50IEEgZGVsZXRlIG9yIGNyZWF0ZWQsIG9yIGlmIEV2ZW50IEIgaXMgZGV0ZWN0ZWQgb3Igbm90IGRldGVjdGVkLCBTVEEgc2hvdWxkIHNlbmQgMjA0MEJTU0NvZXhpc3RlbmNlIHRvIEFQLgotI2RlZmluZSBNQVhfVFJJR0dFUl9FVkVOVAkJNjQKLXR5cGVkZWYgc3RydWN0ICBfVFJJR0dFUl9FVkVOVF9UQUJ7Ci0JVUNIQVIJRXZlbnRBTm87Ci0JVFJJR0dFUl9FVkVOVEEJRXZlbnRBW01BWF9UUklHR0VSX0VWRU5UXTsKLQlVTE9ORwkJCUV2ZW50QkNvdW50RG93bjsJLy8gQ291bnQgZG93biBjb3VudGVyIGZvciBFdmVudCBCLgotfSBUUklHR0VSX0VWRU5UX1RBQiwgKlBUUklHR0VSX0VWRU5UX1RBQjsKLQotLy8gNy4zLjI3IDIwLzQwIEJzcyBDb2V4aXN0ZW5jZSBNZ210IGNhcGFiaWxpdHkgdXNlZCBpbiBleHRlbmRlZCBjYXBhYmlsaXRpZXMgaW5mb3JtYXRpb24gSUUoIElEID0gMTI3ID0gSUVfRVhUX0NBUEFCSUxJVFkpLgotLy8JVGhpcyBpcyB0aGUgZmlyc3Qgb2N0ZXQgYW5kIHdhcyBkZWZpbmVkIGluIDgwMi4xMW4gRDMuMDMgYW5kIDgwMi4xMXlEOS4wCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0VYVF9DQVBfSU5GT19FTEVNRU5UewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVQ0hBUglyc3YyOjU7Ci0JVUNIQVIJRXh0ZW5kQ2hhbm5lbFN3aXRjaDoxOwotCVVDSEFSCXJzdjoxOwotCVVDSEFSCUJzc0NvZXhpc3RNZ210U3VwcG9ydDoxOwotI2Vsc2UKLQlVQ0hBUglCc3NDb2V4aXN0TWdtdFN1cHBvcnQ6MTsKLQlVQ0hBUglyc3Y6MTsKLQlVQ0hBUglFeHRlbmRDaGFubmVsU3dpdGNoOjE7Ci0JVUNIQVIJcnN2Mjo1OwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLX1FWFRfQ0FQX0lORk9fRUxFTUVOVCwgKlBFWFRfQ0FQX0lORk9fRUxFTUVOVDsKLQotCi0vLyA4MDIuMTFuIDcuMy4yLjYxCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0JTU18yMDQwX0NPRVhJU1RfRUxFTUVOVHsKLQlVQ0hBUgkJCQkJRWxlbWVudElEOwkJLy8gSUQgPSBJRV8yMDQwX0JTU19DT0VYSVNUID0gNzIKLQlVQ0hBUgkJCQkJTGVuOwotCUJTU18yMDQwX0NPRVhJU1RfSUUJCUJzc0NvZXhpc3RJZTsKLX1CU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQsICpQQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UOwotCi0KLS8vODAyLjExbiA3LjMuMi41OQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9CU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVHsKLQlVQ0hBUgkJCQlFbGVtZW50SUQ7CQkvLyBJRCA9IElFXzIwNDBfQlNTX0lOVE9MRVJBTlRfUkVQT1JUID0gNzMKLQlVQ0hBUgkJCQlMZW47Ci0JVUNIQVIJCQkJUmVndWxhdG9yeUNsYXNzOwotCVVDSEFSCQkJCUNoTGlzdFswXTsKLX1CU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVCwgKlBCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVDsKLQotCi0vLyBUaGUgc3RydWN0dXJlIGZvciBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCBJRS4gVGhpcyBpcyBpbiA4MDIuMTFuIEQzLjAzCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0NIQV9TV0lUQ0hfQU5OT1VOQ0VfSUV7Ci0JVUNIQVIJCQlTd2l0Y2hNb2RlOwkvL2NoYW5uZWwgc3dpdGNoIG1vZGUKLQlVQ0hBUgkJCU5ld0NoYW5uZWw7CS8vCi0JVUNIQVIJCQlTd2l0Y2hDb3VudDsJLy8KLX0gQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRSwgKlBDSEFfU1dJVENIX0FOTk9VTkNFX0lFOwotCi0KLS8vIFRoZSBzdHJ1Y3R1cmUgZm9yIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50IElFLiBUaGlzIGlzIGluIDgwMi4xMW4gRDMuMDMKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfU0VDX0NIQV9PRkZTRVRfSUV7Ci0JVUNIQVIJCQlTZWNvbmRhcnlDaGFubmVsT2Zmc2V0OwkgLy8gMTogU2Vjb25kYXJ5IGFib3ZlLCAzOiBTZWNvbmRhcnkgYmVsb3csIDA6IG5vIFNlY29uZGFyeQotfSBTRUNfQ0hBX09GRlNFVF9JRSwgKlBTRUNfQ0hBX09GRlNFVF9JRTsKLQotCi0vLyBUaGlzIHN0cnVjdHVyZSBpcyBleHRyYWN0ZWQgZnJvbSBzdHJ1Y3QgUlRfSFRfQ0FQQUJJTElUWQotdHlwZWRlZiBzdHJ1Y3QgewotCUJPT0xFQU4JCQliSHRFbmFibGU7CSAvLyBJZiB3ZSBzaG91bGQgdXNlIGh0IHJhdGUuCi0JQk9PTEVBTgkJCWJQcmVOSHQ7CSAvLyBJZiB3ZSBzaG91bGQgdXNlIGh0IHJhdGUuCi0JLy9TdWJzdHJhY3QgZnJvbSBIVCBDYXBhYmlsaXR5IElFCi0JVUNIQVIJCQlNQ1NTZXRbMTZdOwotfSBSVF9IVF9QSFlfSU5GTywgKlBSVF9IVF9QSFlfSU5GTzsKLQotLy9UaGlzIHN0cnVjdHVyZSBzdWJzdHJhY3RzIHJhbGluayBzdXBwb3J0cyBmcm9tIGFsbCA4MDIuMTFuLXJlbGF0ZWQgZmVhdHVyZXMuCi0vL0ZlYXR1cmVzIG5vdCBsaXN0ZWQgaGVyZSBidXQgY29udGFpbmVkIGluIDgwMi4xMW4gc3BlYyBhcmUgbm90IHN1cHBvcnRlZCBpbiBydDI4NjAuCi10eXBlZGVmIHN0cnVjdCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVTSE9SVAlyc3Y6NTsKLQlVU0hPUlQJQW1zZHVTaXplOjE7CS8vIE1heCByZWNlaXZpbmcgQS1NU0RVIHNpemUKLQlVU0hPUlQJQW1zZHVFbmFibGU6MTsJLy8gRW5hYmxlIHRvIHRyYW5zbWl0IEEtTVNEVS4gU3VnZ2VzdCBkaXNhYmxlLiBXZSBzaG91bGQgdXNlIEEtTVBEVSB0byBnYWluIGJlc3QgYmVuaWZpdCBvZiA4MDIuMTFuCi0JVVNIT1JUCVJ4U1RCQzoyOwkvLyAyIGJpdHMKLQlVU0hPUlQJVHhTVEJDOjE7Ci0JVVNIT1JUCVNob3J0R0lmb3I0MDoxOwkvL2ZvcjQwTUh6Ci0JVVNIT1JUCVNob3J0R0lmb3IyMDoxOwotCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCi0JVVNIT1JUCU1pbW9QczoyOy8vbWltbyBwb3dlciBzYWZlIE1NUFNfCi0JVVNIT1JUCUNoYW5uZWxXaWR0aDoxOwotI2Vsc2UKLQlVU0hPUlQJQ2hhbm5lbFdpZHRoOjE7Ci0JVVNIT1JUCU1pbW9QczoyOy8vbWltbyBwb3dlciBzYWZlIE1NUFNfCi0JVVNIT1JUCUdGOjE7CS8vZ3JlZW4gZmllbGQKLQlVU0hPUlQJU2hvcnRHSWZvcjIwOjE7Ci0JVVNIT1JUCVNob3J0R0lmb3I0MDoxOwkvL2ZvcjQwTUh6Ci0JVVNIT1JUCVR4U1RCQzoxOwotCVVTSE9SVAlSeFNUQkM6MjsJLy8gMiBiaXRzCi0JVVNIT1JUCUFtc2R1RW5hYmxlOjE7CS8vIEVuYWJsZSB0byB0cmFuc21pdCBBLU1TRFUuIFN1Z2dlc3QgZGlzYWJsZS4gV2Ugc2hvdWxkIHVzZSBBLU1QRFUgdG8gZ2FpbiBiZXN0IGJlbmlmaXQgb2YgODAyLjExbgotCVVTSE9SVAlBbXNkdVNpemU6MTsJLy8gTWF4IHJlY2VpdmluZyBBLU1TRFUgc2l6ZQotCVVTSE9SVAlyc3Y6NTsKLSNlbmRpZgotCi0JLy9TdWJzdHJhY3QgZnJvbSBBZGRpb250IEhUIElORk8gSUUKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JVUNIQVIJUmVjb21XaWR0aDoxOwotCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsJLy8gUGxlYXNlIG5vdCB0aGUgZGlmZmVyZW5jZSB3aXRoIGZvbGxvd2luZwlVQ0hBUglOZXdFeHRDaGFubmVsT2Zmc2V0OyBmcm9tIDgwMi4xMW4KLQlVQ0hBUglNcGR1RGVuc2l0eTozOwotCVVDSEFSCU1heFJBbXBkdUZhY3RvcjoyOwotI2Vsc2UKLQlVQ0hBUglNYXhSQW1wZHVGYWN0b3I6MjsKLQlVQ0hBUglNcGR1RGVuc2l0eTozOwotCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsJLy8gUGxlYXNlIG5vdCB0aGUgZGlmZmVyZW5jZSB3aXRoIGZvbGxvd2luZwlVQ0hBUglOZXdFeHRDaGFubmVsT2Zmc2V0OyBmcm9tIDgwMi4xMW4KLQlVQ0hBUglSZWNvbVdpZHRoOjE7Ci0jZW5kaWYKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVU0hPUlQJcnN2MjoxMTsKLQlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7Ci0JVVNIT1JUCXJzdjM6MTsKLQlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7Ci0JVVNIT1JUCU9wZXJhaW9uTW9kZToyOwotI2Vsc2UKLQlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7Ci0JVVNIT1JUCU5vbkdmUHJlc2VudDoxOwotCVVTSE9SVAlyc3YzOjE7Ci0JVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOwotCVVTSE9SVAlyc3YyOjExOwotI2VuZGlmCi0KLQkvLyBOZXcgRXh0ZW5zaW9uIENoYW5uZWwgT2Zmc2V0IElFCi0JVUNIQVIJTmV3RXh0Q2hhbm5lbE9mZnNldDsKLQkvLyBFeHRlbnNpb24gQ2FwYWJpbGl0eSBJRSA9IDEyNwotCVVDSEFSCUJTU0NvZXhpc3QyMDQwOwotfSBSVF9IVF9DQVBBQklMSVRZLCAqUFJUX0hUX0NBUEFCSUxJVFk7Ci0KLS8vICAgZmllbGQgaW4gQWRkdGlvbmFsIEhUIEluZm9ybWF0aW9uIElFIC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCVNlckludGVyR3JhbnU6MzsKLQlVQ0hBUglTX1BTTVBTdXA6MTsKLQlVQ0hBUglSaWZzTW9kZToxOwotCVVDSEFSCVJlY29tV2lkdGg6MTsKLQlVQ0hBUglFeHRDaGFuT2Zmc2V0OjI7Ci0jZWxzZQotCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsKLQlVQ0hBUglSZWNvbVdpZHRoOjE7Ci0JVUNIQVIJUmlmc01vZGU6MTsKLQlVQ0hBUglTX1BTTVBTdXA6MTsJIC8vSW5kaWNhdGUgc3VwcG9ydCBmb3Igc2NoZWR1bGVkIFBTTVAKLQlVQ0hBUglTZXJJbnRlckdyYW51OjM7CSAvL3NlcnZpY2UgaW50ZXJ2YWwgZ3JhbnVsYXJpdHkKLSNlbmRpZgotfSBBRERfSFRJTkZPLCAqUEFERF9IVElORk87Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRHsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JVVNIT1JUCXJzdjI6MTE7Ci0JVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOwotCVVTSE9SVAlyc3Y6MTsKLQlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7Ci0JVVNIT1JUCU9wZXJhaW9uTW9kZToyOwotI2Vsc2UKLQlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7Ci0JVVNIT1JUCU5vbkdmUHJlc2VudDoxOwotCVVTSE9SVAlyc3Y6MTsKLQlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7Ci0JVVNIT1JUCXJzdjI6MTE7Ci0jZW5kaWYKLX0gQUREX0hUSU5GTzIsICpQQUREX0hUSU5GTzI7Ci0KLQotLy8gVE9ETzogTmVlZCBzeW5jIHdpdGggc3BlYyBhYm91dCB0aGUgZGVmaW5pdGlvbiBvZiBTdGJjTWNzLiBJbiBEcmFmdCAzLjAzLCBpdCdzIHJlc2VydmVkLgotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVU0hPUlQJcnN2OjQ7Ci0JVVNIT1JUCVBjb1BoYXNlOjE7Ci0JVVNIT1JUCVBjb0FjdGl2ZToxOwotCVVTSE9SVAlMc2lnVHhvcFByb3Q6MTsKLQlVU0hPUlQJU1RCQ0JlYWNvbjoxOwotCVVTSE9SVAlEdWFsQ1RTUHJvdGVjdDoxOwotCVVTSE9SVAlEdWFsQmVhY29uOjE7Ci0JVVNIT1JUCVN0YmNNY3M6NjsKLSNlbHNlCi0JVVNIT1JUCVN0YmNNY3M6NjsKLQlVU0hPUlQJRHVhbEJlYWNvbjoxOwotCVVTSE9SVAlEdWFsQ1RTUHJvdGVjdDoxOwotCVVTSE9SVAlTVEJDQmVhY29uOjE7Ci0JVVNIT1JUCUxzaWdUeG9wUHJvdDoxOwkvLyBMLVNJRyBUWE9QIHByb3RlY3Rpb24gZnVsbCBzdXBwb3J0Ci0JVVNIT1JUCVBjb0FjdGl2ZToxOwotCVVTSE9SVAlQY29QaGFzZToxOwotCVVTSE9SVAlyc3Y6NDsKLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi19IEFERF9IVElORk8zLCAqUEFERF9IVElORk8zOwotCi0jZGVmaW5lIFNJWkVfQUREX0hUX0lORk9fSUUJCTIyCi10eXBlZGVmIHN0cnVjdCAgUEFDS0VEewotCVVDSEFSCQkJCUNvbnRyb2xDaGFuOwotCUFERF9IVElORk8JCQlBZGRIdEluZm87Ci0JQUREX0hUSU5GTzIJCQlBZGRIdEluZm8yOwotCUFERF9IVElORk8zCQkJQWRkSHRJbmZvMzsKLQlVQ0hBUgkJCQlNQ1NTZXRbMTZdOwkJLy8gQmFzaWMgTUNTIHNldAotfSBBRERfSFRfSU5GT19JRSwgKlBBRERfSFRfSU5GT19JRTsKLQotdHlwZWRlZiBzdHJ1Y3QgIFBBQ0tFRHsKLQlVQ0hBUgkJCQlOZXdFeHRDaGFuT2Zmc2V0OwotfSBORVdfRVhUX0NIQU5fSUUsICpQTkVXX0VYVF9DSEFOX0lFOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FXzgwMl8xMSB7Ci0gICAgSEVBREVSXzgwMl8xMSAgIEhkcjsKLSAgICBVQ0hBUiAgICAgICAgICAgIE9jdGV0WzFdOwotfSAgIEZSQU1FXzgwMl8xMSwgKlBGUkFNRV84MDJfMTE7Ci0KLS8vIFFvU051bGwgZW1iZWRkaW5nIG9mIG1hbmFnZW1lbnQgYWN0aW9uLiBXaGVuIEhUIENvbnRyb2wgTUEgZmllbGQgc2V0IHRvIDEuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01BX0JPRFkgewotICAgIFVDSEFSICAgICAgICAgICAgQ2F0ZWdvcnk7Ci0gICAgVUNIQVIgICAgICAgICAgICBBY3Rpb247Ci0gICAgVUNIQVIgICAgICAgICAgICBPY3RldFsxXTsKLX0gICBNQV9CT0RZLCAqUE1BX0JPRFk7Ci0KLXR5cGVkZWYJc3RydWN0CVBBQ0tFRCBfSEVBREVSXzgwMl8zCXsKLSAgICBVQ0hBUiAgICAgICAgICAgREFBZGRyMVtNQUNfQUREUl9MRU5dOwotICAgIFVDSEFSICAgICAgICAgICBTQUFkZHIyW01BQ19BRERSX0xFTl07Ci0gICAgVUNIQVIgICAgICAgICAgIE9jdGV0WzJdOwotfQlIRUFERVJfODAyXzMsICpQSEVBREVSXzgwMl8zOwotLy8vL0Jsb2NrIEFDSyByZWxhdGVkIGZvcm1hdAotLy8gMi1ieXRlIEJBIFBhcmFtZXRlciAgZmllbGQgIGluCURFTEJBIGZyYW1lcyB0byB0ZXJtaW5hdGUgYW4gYWxyZWFkeSBzZXQgdXAgYkEKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRHsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgVVNIT1JUICAgICAgVElEOjQ7CS8vIHZhbHVlIG9mIFRDIG9zIFRTCi0gICAgVVNIT1JUICAgICAgSW5pdGlhdG9yOjE7CS8vIDE6IG9yaWdpbmF0b3IgICAgMDpyZWNpcGllbnQKLSAgICBVU0hPUlQgICAgICBSc3Y6MTE7CS8vIGFsd2F5cyBzZXQgdG8gMAotI2Vsc2UKLSAgICBVU0hPUlQgICAgICBSc3Y6MTE7CS8vIGFsd2F5cyBzZXQgdG8gMAotICAgIFVTSE9SVCAgICAgIEluaXRpYXRvcjoxOwkvLyAxOiBvcmlnaW5hdG9yICAgIDA6cmVjaXBpZW50Ci0gICAgVVNIT1JUICAgICAgVElEOjQ7CS8vIHZhbHVlIG9mIFRDIG9zIFRTCi0jZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KLX0gREVMQkFfUEFSTSwgKlBERUxCQV9QQVJNOwotCi0vLyAyLWJ5dGUgQkEgUGFyYW1ldGVyIFNldCBmaWVsZCAgaW4gQUREQkEgZnJhbWVzIHRvIHNpZ25hbCBwYXJtIGZvciBzZXR0aW5nIHVwIGEgQkEKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotICAgIFVTSE9SVCAgICAgIEJ1ZlNpemU6MTA7CS8vIG51bWJlciBvZiBidWZmZSBvZiBzaXplIDIzMDQgb2N0ZXRzcgotICAgIFVTSE9SVCAgICAgIFRJRDo0OwkvLyB2YWx1ZSBvZiBUQyBvcyBUUwotICAgIFVTSE9SVCAgICAgIEJBUG9saWN5OjE7CS8vIDE6IGltbWVkaWF0ZWx5IEJBICAgIDA6ZGVsYXllZCBCQQotICAgIFVTSE9SVCAgICAgIEFNU0RVU3VwcG9ydGVkOjE7CS8vIDA6IG5vdCBwZXJtaXR0ZWQJCTE6IHBlcm1pdHRlZAotI2Vsc2UKLSAgICBVU0hPUlQgICAgICBBTVNEVVN1cHBvcnRlZDoxOwkvLyAwOiBub3QgcGVybWl0dGVkCQkxOiBwZXJtaXR0ZWQKLSAgICBVU0hPUlQgICAgICBCQVBvbGljeToxOwkvLyAxOiBpbW1lZGlhdGVseSBCQSAgICAwOmRlbGF5ZWQgQkEKLSAgICBVU0hPUlQgICAgICBUSUQ6NDsJLy8gdmFsdWUgb2YgVEMgb3MgVFMKLSAgICBVU0hPUlQgICAgICBCdWZTaXplOjEwOwkvLyBudW1iZXIgb2YgYnVmZmUgb2Ygc2l6ZSAyMzA0IG9jdGV0c3IKLSNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLwotfSBCQV9QQVJNLCAqUEJBX1BBUk07Ci0KLS8vIDItYnl0ZSBCQSBTdGFydGluZyBTZXEgQ09OVFJPTCBmaWVsZAotdHlwZWRlZiB1bmlvbiBQQUNLRUQgewotICAgIHN0cnVjdCBQQUNLRUQgewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBVU0hPUlQgICAgICBTdGFydFNlcToxMjsgICAvLyBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIDFzdCBNU0RVIGZvciB3aGljaCB0aGlzIEJBUiBpcyBzZW50Ci0JVVNIT1JUICAgICAgRnJhZ051bTo0OwkvLyBhbHdheXMgc2V0IHRvIDAKLSNlbHNlCi0gICAgVVNIT1JUICAgICAgRnJhZ051bTo0OwkvLyBhbHdheXMgc2V0IHRvIDAKLQlVU0hPUlQgICAgICBTdGFydFNlcToxMjsgICAvLyBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIDFzdCBNU0RVIGZvciB3aGljaCB0aGlzIEJBUiBpcyBzZW50Ci0jZW5kaWYgLyogUlRfQklHX0VORElBTiAqLwotICAgIH0gICBmaWVsZDsKLSAgICBVU0hPUlQgICAgICAgICAgIHdvcmQ7Ci19IEJBU0VRX0NPTlRST0wsICpQQkFTRVFfQ09OVFJPTDsKLQotLy9CQUNvbnRyb2wgYW5kIEJBUkNvbnRyb2wgYXJlIHRoZSBzYW1lCi0vLyAyLWJ5dGUgQkEgQ09OVFJPTCBmaWVsZCBpbiBCQSBmcmFtZQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgVVNIT1JUICAgICAgVElEOjQ7Ci0gICAgVVNIT1JUICAgICAgUnN2Ojk7Ci0gICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOwotICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vRVdDIFYxLjI0Ci0gICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7IC8vIG9ubHkgcmVsYXRlZCB0byBOLURlbGF5ZWQgQkEuIEJ1dCBub3Qgc3VwcG9ydCBpbiBSVDI4NjBiLiAwOk5vcm1hbEFDSyAgMTpObyBBQ0sKLSNlbHNlCi0gICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7IC8vIG9ubHkgcmVsYXRlZCB0byBOLURlbGF5ZWQgQkEuIEJ1dCBub3Qgc3VwcG9ydCBpbiBSVDI4NjBiLiAwOk5vcm1hbEFDSyAgMTpObyBBQ0sKLSAgICBVU0hPUlQgICAgICBNVElEOjE7CQkvL0VXQyBWMS4yNAotICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKLSAgICBVU0hPUlQgICAgICBSc3Y6OTsKLSAgICBVU0hPUlQgICAgICBUSUQ6NDsKLSNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLwotfSBCQV9DT05UUk9MLCAqUEJBX0NPTlRST0w7Ci0KLS8vIDItYnl0ZSBCQVIgQ09OVFJPTCBmaWVsZCBpbiBCQVIgZnJhbWUKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotICAgIFVTSE9SVCAgICAgIFRJRDo0OwotICAgIFVTSE9SVCAgICAgIFJzdjE6OTsKLSAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7Ci0gICAgVVNIT1JUICAgICAgTVRJRDoxOwkJLy9pZiB0aGlzIGJpdDEsIHVzZSAgRlJBTUVfTVRCQV9SRVEsICBpZiAwLCB1c2UgRlJBTUVfQkFfUkVRCi0gICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7Ci0jZWxzZQotICAgIFVTSE9SVCAgICAgIEFDS1BvbGljeToxOyAvLyAwOm5vcm1hbCBhY2ssICAxOm5vIGFjay4KLSAgICBVU0hPUlQgICAgICBNVElEOjE7CQkvL2lmIHRoaXMgYml0MSwgdXNlICBGUkFNRV9NVEJBX1JFUSwgIGlmIDAsIHVzZSBGUkFNRV9CQV9SRVEKLSAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7Ci0gICAgVVNIT1JUICAgICAgUnN2MTo5OwotICAgIFVTSE9SVCAgICAgIFRJRDo0OwotI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCi19IEJBUl9DT05UUk9MLCAqUEJBUl9DT05UUk9MOwotCi0vLyBCQVJDb250cm9sIGluIE1UQkFSIGZyYW1lCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBVU0hPUlQgICAgICBOdW1USUQ6NDsKLSAgICBVU0hPUlQgICAgICBSc3YxOjk7Ci0gICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOwotICAgIFVTSE9SVCAgICAgIE1USUQ6MTsKLSAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsKLSNlbHNlCi0gICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7Ci0gICAgVVNIT1JUICAgICAgTVRJRDoxOwotICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKLSAgICBVU0hPUlQgICAgICBSc3YxOjk7Ci0gICAgVVNIT1JUICAgICAgTnVtVElEOjQ7Ci0jZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KLX0gTVRCQVJfQ09OVFJPTCwgKlBNVEJBUl9DT05UUk9MOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBVU0hPUlQgICAgICBUSUQ6NDsKLSAgICBVU0hPUlQgICAgICBSc3YxOjEyOwotI2Vsc2UKLSAgICBVU0hPUlQgICAgICBSc3YxOjEyOwotICAgIFVTSE9SVCAgICAgIFRJRDo0OwotI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCi19IFBFUl9USURfSU5GTywgKlBQRVJfVElEX0lORk87Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlQRVJfVElEX0lORk8gICAgICBQZXJUSUQ7Ci0JQkFTRVFfQ09OVFJPTAkgQkFTdGFydGluZ1NlcTsKLX0gRUFDSF9USUQsICpQRUFDSF9USUQ7Ci0KLQotLy8gQkFSRVEgQU5EIE1UQkFSRVEgaGF2ZSB0aGUgc2FtZSBzdWJ0eXBlIEJBUiwgODAyLjExbiBCQVIgdXNlIGNvbXByZXNzZWQgYml0bWFwLgotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9CQV9SRVEgewotCUZSQU1FX0NPTlRST0wgICBGQzsKLQlVU0hPUlQgICAgICAgICAgRHVyYXRpb247Ci0JVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JQkFSX0NPTlRST0wgIEJBUkNvbnRyb2w7Ci0JQkFTRVFfQ09OVFJPTAkgQkFTdGFydGluZ1NlcTsKLX0gICBGUkFNRV9CQV9SRVEsICpQRlJBTUVfQkFfUkVROwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX01UQkFfUkVRIHsKLQlGUkFNRV9DT05UUk9MICAgRkM7Ci0JVVNIT1JUICAgICAgICAgIER1cmF0aW9uOwotCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCU1UQkFSX0NPTlRST0wgIE1UQkFSQ29udHJvbDsKLQlQRVJfVElEX0lORk8JUGVyVElESW5mbzsKLQlCQVNFUV9DT05UUk9MCSBCQVN0YXJ0aW5nU2VxOwotfSAgIEZSQU1FX01UQkFfUkVRLCAqUEZSQU1FX01UQkFfUkVROwotCi0vLyBDb21wcmVzc2VkIGZvcm1hdCBpcyBtYW5kYW50b3J5IGluIEhUIFNUQQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9NVEJBIHsKLQlGUkFNRV9DT05UUk9MICAgRkM7Ci0JVVNIT1JUICAgICAgICAgIER1cmF0aW9uOwotCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCUJBX0NPTlRST0wgIEJBQ29udHJvbDsKLQlCQVNFUV9DT05UUk9MCSBCQVN0YXJ0aW5nU2VxOwotCVVDSEFSCQlCaXRNYXBbOF07Ci19ICAgRlJBTUVfTVRCQSwgKlBGUkFNRV9NVEJBOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX1BTTVBfQUNUSU9OIHsKLQlIRUFERVJfODAyXzExICAgSGRyOwotCVVDSEFSCUNhdGVnb3J5OwotCVVDSEFSCUFjdGlvbjsKLQlVQ0hBUglQc21wOwkvLyA3LjMuMS4yNQotfSAgIEZSQU1FX1BTTVBfQUNUSU9OLCAqUEZSQU1FX1BTTVBfQUNUSU9OOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0FDVElPTl9IRFIgewotCUhFQURFUl84MDJfMTEgICBIZHI7Ci0JVUNIQVIJQ2F0ZWdvcnk7Ci0JVUNIQVIJQWN0aW9uOwotfSAgIEZSQU1FX0FDVElPTl9IRFIsICpQRlJBTUVfQUNUSU9OX0hEUjsKLQotLy9BY3Rpb24gRnJhbWUKLS8vQWN0aW9uIEZyYW1lICBDYXRlZ29yeTpTcGVjdHJ1bSwgIEFjdGlvbjpDaGFubmVsIFN3aXRjaC4gNy4zLjIuMjAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQ0hBTl9TV0lUQ0hfQU5OT1VOQ0UgewotCVVDSEFSCQkJCQlFbGVtZW50SUQ7CS8vIElEID0gSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UID0gMzcKLQlVQ0hBUgkJCQkJTGVuOwotCUNIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUJQ1NBbm5vdW5jZUllOwotfSAgIENIQU5fU1dJVENIX0FOTk9VTkNFLCAqUENIQU5fU1dJVENIX0FOTk9VTkNFOwotCi0KLS8vODAyLjExbiA6IDcuMy4yLjIwYQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9TRUNPTkRfQ0hBTl9PRkZTRVQgewotCVVDSEFSCQkJCUVsZW1lbnRJRDsJCS8vIElEID0gSUVfU0VDT05EQVJZX0NIX09GRlNFVCA9IDYyCi0JVUNIQVIJCQkJTGVuOwotCVNFQ19DSEFfT0ZGU0VUX0lFCVNlY0NoT2Zmc2V0SWU7Ci19ICAgU0VDT05EX0NIQU5fT0ZGU0VULCAqUFNFQ09ORF9DSEFOX09GRlNFVDsKLQotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX1NQRVRSVU1fQ1MgewotCUhFQURFUl84MDJfMTEgICBIZHI7Ci0JVUNIQVIJQ2F0ZWdvcnk7Ci0JVUNIQVIJQWN0aW9uOwotCUNIQU5fU1dJVENIX0FOTk9VTkNFCUNTQW5ub3VuY2U7Ci0JU0VDT05EX0NIQU5fT0ZGU0VUCQlTZWNvbmRDaGFubmVsOwotfSAgIEZSQU1FX1NQRVRSVU1fQ1MsICpQRlJBTUVfU1BFVFJVTV9DUzsKLQotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0FEREJBX1JFUSB7Ci0JSEVBREVSXzgwMl8xMSAgIEhkcjsKLQlVQ0hBUglDYXRlZ29yeTsKLQlVQ0hBUglBY3Rpb247Ci0JVUNIQVIJVG9rZW47CS8vIDEKLQlCQV9QQVJNCQlCYVBhcm07CSAgICAgIC8vICAyIC0gMTAKLQlVU0hPUlQJCVRpbWVPdXRWYWx1ZTsJLy8gMCAtIDAKLQlCQVNFUV9DT05UUk9MCUJhU3RhcnRTZXE7IC8vIDAtMAotfSAgIEZSQU1FX0FEREJBX1JFUSwgKlBGUkFNRV9BRERCQV9SRVE7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQUREQkFfUlNQIHsKLQlIRUFERVJfODAyXzExICAgSGRyOwotCVVDSEFSCUNhdGVnb3J5OwotCVVDSEFSCUFjdGlvbjsKLQlVQ0hBUglUb2tlbjsKLQlVU0hPUlQJU3RhdHVzQ29kZTsKLQlCQV9QQVJNCQlCYVBhcm07IC8vMCAtIDIKLQlVU0hPUlQJCVRpbWVPdXRWYWx1ZTsKLX0gICBGUkFNRV9BRERCQV9SU1AsICpQRlJBTUVfQUREQkFfUlNQOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0RFTEJBX1JFUSB7Ci0JSEVBREVSXzgwMl8xMSAgIEhkcjsKLQlVQ0hBUglDYXRlZ29yeTsKLQlVQ0hBUglBY3Rpb247Ci0JREVMQkFfUEFSTQkJRGVsYmFQYXJtOwotCVVTSE9SVAlSZWFzb25Db2RlOwotfSAgIEZSQU1FX0RFTEJBX1JFUSwgKlBGUkFNRV9ERUxCQV9SRVE7Ci0KLQotLy83LjIuMS43Ci10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0JBUiB7Ci0JRlJBTUVfQ09OVFJPTCAgIEZDOwotCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlCQVJfQ09OVFJPTAkJQmFyQ29udHJvbDsKLQlCQVNFUV9DT05UUk9MCVN0YXJ0aW5nU2VxOwotfSAgIEZSQU1FX0JBUiwgKlBGUkFNRV9CQVI7Ci0KLS8vNy4yLjEuNwotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9CQSB7Ci0JRlJBTUVfQ09OVFJPTCAgIEZDOwotCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlCQVJfQ09OVFJPTAkJQmFyQ29udHJvbDsKLQlCQVNFUV9DT05UUk9MCVN0YXJ0aW5nU2VxOwotCVVDSEFSCQliaXRtYXNrWzhdOwotfSAgIEZSQU1FX0JBLCAqUEZSQU1FX0JBOwotCi0KLS8vIFJhZGlvIE1lYXN1ZW1lbnQgUmVxdWVzdCBGcmFtZSBGb3JtYXQKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfUk1fUkVRX0FDVElPTiB7Ci0JSEVBREVSXzgwMl8xMSAgIEhkcjsKLQlVQ0hBUglDYXRlZ29yeTsKLQlVQ0hBUglBY3Rpb247Ci0JVUNIQVIJVG9rZW47Ci0JVVNIT1JUCVJlcGV0aXRpb247Ci0JVUNIQVIgICBkYXRhWzBdOwotfSAgIEZSQU1FX1JNX1JFUV9BQ1RJT04sICpQRlJBTUVfUk1fUkVRX0FDVElPTjsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLQlVQ0hBUgkJSUQ7Ci0JVUNIQVIJCUxlbmd0aDsKLQlVQ0hBUgkJQ2hhbm5lbFN3aXRjaE1vZGU7Ci0JVUNIQVIJCU5ld1JlZ0NsYXNzOwotCVVDSEFSCQlOZXdDaGFubmVsTnVtOwotCVVDSEFSCQlDaGFubmVsU3dpdGNoQ291bnQ7Ci19IEhUX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlRfSUUsICpQSFRfRVhUX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVF9JRTsKLQotCi0vLwotLy8gX0xpbWl0IG11c3QgYmUgdGhlIDIqKm4gLSAxCi0vLyBfU0VRMSAsIF9TRVEyIG11c3QgYmUgd2l0aGluIDAgfiBfTGltaXQKLS8vCi0jZGVmaW5lIFNFUV9TVEVQT05FKF9TRVExLCBfU0VRMiwgX0xpbWl0KQkoKF9TRVExID09ICgoX1NFUTIrMSkgJiBfTGltaXQpKSkKLSNkZWZpbmUgU0VRX1NNQUxMRVIoX1NFUTEsIF9TRVEyLCBfTGltaXQpCSgoKF9TRVExLV9TRVEyKSAmICgoX0xpbWl0KzEpPj4xKSkpCi0jZGVmaW5lIFNFUV9MQVJHRVIoX1NFUTEsIF9TRVEyLCBfTGltaXQpCSgoX1NFUTEgIT0gX1NFUTIpICYmICEoKChfU0VRMS1fU0VRMikgJiAoKF9MaW1pdCsxKT4+MSkpKSkKLSNkZWZpbmUgU0VRX1dJVEhJTl9XSU4oX1NFUTEsIF9TRVEyLCBfV0lOLCBfTGltaXQpIChTRVFfTEFSR0VSKF9TRVExLCBfU0VRMiwgX0xpbWl0KSAmJiAgXAotCQkJCQkJCQkJCQkJU0VRX1NNQUxMRVIoX1NFUTEsICgoX1NFUTIrX1dJTisxKSZfTGltaXQpLCBfTGltaXQpKQotCi0vLwotLy8gQ29udGVudGlvbi1mcmVlIHBhcmFtZXRlciAod2l0aG91dCBJRCBhbmQgTGVuZ3RoKQotLy8KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0gICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgVUNIQVIgICAgICAgQ2ZwQ291bnQ7Ci0gICAgVUNIQVIgICAgICAgQ2ZwUGVyaW9kOwotICAgIFVTSE9SVCAgICAgIENmcE1heER1cmF0aW9uOwotICAgIFVTSE9SVCAgICAgIENmcER1clJlbWFpbmluZzsKLX0gQ0ZfUEFSTSwgKlBDRl9QQVJNOwotCi10eXBlZGVmCXN0cnVjdAlfQ0lQSEVSX1NVSVRFCXsKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlQYWlyQ2lwaGVyOwkJLy8gVW5pY2FzdCBjaXBoZXIgMSwgdGhpcyBvbmUgaGFzIG1vcmUgc2VjdXJlZCBjaXBoZXIgc3VpdGUKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlQYWlyQ2lwaGVyQXV4OwkvLyBVbmljYXN0IGNpcGhlciAyIGlmIEFQIGFubm91bmNlIHR3byB1bmljYXN0IGNpcGhlciBzdWl0ZQotCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCUdyb3VwQ2lwaGVyOwkvLyBHcm91cCBjaXBoZXIKLQlVU0hPUlQJCQkJCQkJUnNuQ2FwYWJpbGl0eTsJLy8gUlNOIGNhcGFiaWxpdHkgZnJvbSBiZWFjb24KLQlCT09MRUFOCQkJCQkJCWJNaXhNb2RlOwkJLy8gSW5kaWNhdGUgUGFpciAmIEdyb3VwIGNpcGhlciBtaWdodCBiZSBkaWZmZXJlbnQKLX0JQ0lQSEVSX1NVSVRFLCAqUENJUEhFUl9TVUlURTsKLQotLy8gRURDQSBjb25maWd1cmF0aW9uIGZyb20gQVAncyBCRUFDT04vUHJvYmVSc3AKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBCT09MRUFOICAgICBiVmFsaWQ7ICAgICAgICAgLy8gMTogdmFyaWFibGUgY29udGFpbnMgdmFsaWQgdmFsdWUKLSAgICBCT09MRUFOICAgICBiQWRkOyAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgQk9PTEVBTiAgICAgYlFBY2s7Ci0gICAgQk9PTEVBTiAgICAgYlF1ZXVlUmVxdWVzdDsKLSAgICBCT09MRUFOICAgICBiVHhvcFJlcXVlc3Q7Ci0gICAgQk9PTEVBTiAgICAgYkFQU0RDYXBhYmxlOwotLy8gIEJPT0xFQU4gICAgIGJNb3JlRGF0YUFjazsKLSAgICBVQ0hBUiAgICAgICBFZGNhVXBkYXRlQ291bnQ7Ci0gICAgVUNIQVIgICAgICAgQWlmc25bNF07ICAgICAgIC8vIDA6QUNfQkssIDE6QUNfQkUsIDI6QUNfVkksIDM6QUNfVk8KLSAgICBVQ0hBUiAgICAgICBDd21pbls0XTsKLSAgICBVQ0hBUiAgICAgICBDd21heFs0XTsKLSAgICBVU0hPUlQgICAgICBUeG9wWzRdOyAgICAgIC8vIGluIHVuaXQgb2YgMzItdXMKLSAgICBCT09MRUFOICAgICBiQUNNWzRdOyAgICAgIC8vIDE6IEFkbWlzc2lvbiBDb250cm9sIG9mIEFDX0JLIGlzIG1hbmRhdHRvcnkKLX0gRURDQV9QQVJNLCAqUEVEQ0FfUEFSTTsKLQotLy8gUUJTUyBMT0FEIGluZm9ybWF0aW9uIGZyb20gUUFQJ3MgQkVBQ09OL1Byb2JlUnNwCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgVVNIT1JUICAgICAgU3RhTnVtOwotICAgIFVDSEFSICAgICAgIENoYW5uZWxVdGlsaXphdGlvbjsKLSAgICBVU0hPUlQgICAgICBSZW1haW5pbmdBZG1pc3Npb25Db250cm9sOyAgLy8gaW4gdW5pdCBvZiAzMi11cwotfSBRQlNTX0xPQURfUEFSTSwgKlBRQlNTX0xPQURfUEFSTTsKLQotLy8gUUJTUyBJbmZvIGZpZWxkIGluIFFTVEEncyBhc3NvYyByZXEKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCQlSc3YyOjE7Ci0JVUNIQVIJCU1heFNQTGVuZ3RoOjI7Ci0JVUNIQVIJCVJzdjE6MTsKLQlVQ0hBUgkJVUFQU0RfQUNfQkU6MTsKLQlVQ0hBUgkJVUFQU0RfQUNfQks6MTsKLQlVQ0hBUgkJVUFQU0RfQUNfVkk6MTsKLQlVQ0hBUgkJVUFQU0RfQUNfVk86MTsKLSNlbHNlCi0gICAgVUNIQVIJCVVBUFNEX0FDX1ZPOjE7Ci0JVUNIQVIJCVVBUFNEX0FDX1ZJOjE7Ci0JVUNIQVIJCVVBUFNEX0FDX0JLOjE7Ci0JVUNIQVIJCVVBUFNEX0FDX0JFOjE7Ci0JVUNIQVIJCVJzdjE6MTsKLQlVQ0hBUgkJTWF4U1BMZW5ndGg6MjsKLQlVQ0hBUgkJUnN2MjoxOwotI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCi19IFFCU1NfU1RBX0lORk9fUEFSTSwgKlBRQlNTX1NUQV9JTkZPX1BBUk07Ci0KLS8vIFFCU1MgSW5mbyBmaWVsZCBpbiBRQVAncyBCZWFjb24vUHJvYmVSc3AKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCQlVQVBTRDoxOwotCVVDSEFSCQlSc3Y6MzsKLSAgICBVQ0hBUgkJUGFyYW1TZXRDb3VudDo0OwotI2Vsc2UKLSAgICBVQ0hBUgkJUGFyYW1TZXRDb3VudDo0OwotCVVDSEFSCQlSc3Y6MzsKLQlVQ0hBUgkJVUFQU0Q6MTsKLSNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLwotfSBRQlNTX0FQX0lORk9fUEFSTSwgKlBRQlNTX0FQX0lORk9fUEFSTTsKLQotLy8gUU9TIENhcGFiaWxpdHkgcmVwb3J0ZWQgaW4gUUFQJ3MgQkVBQ09OL1Byb2JlUnNwCi0vLyBRT1MgQ2FwYWJpbGl0eSBzZW50IG91dCBpbiBRU1RBJ3MgQXNzb2NpYXRlUmVxL1JlQXNzb2NpYXRlUmVxCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgQk9PTEVBTiAgICAgYlFBY2s7Ci0gICAgQk9PTEVBTiAgICAgYlF1ZXVlUmVxdWVzdDsKLSAgICBCT09MRUFOICAgICBiVHhvcFJlcXVlc3Q7Ci0vLyAgQk9PTEVBTiAgICAgYk1vcmVEYXRhQWNrOwotICAgIFVDSEFSICAgICAgIEVkY2FVcGRhdGVDb3VudDsKLX0gUU9TX0NBUEFCSUxJVFlfUEFSTSwgKlBRT1NfQ0FQQUJJTElUWV9QQVJNOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVUNIQVIgICAgICAgSUVMZW47Ci0gICAgVUNIQVIgICAgICAgSUVbTUFYX0NVU1RPTV9MRU5dOwotfSBXUEFfSUVfOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBVQ0hBUiAgIEJzc2lkW01BQ19BRERSX0xFTl07Ci0gICAgVUNIQVIgICBDaGFubmVsOwotCVVDSEFSICAgQ2VudHJhbENoYW5uZWw7CS8vU3RvcmUgdGhlIHdpZGUtYmFuZCBjZW50cmFsIGNoYW5uZWwgZm9yIDQwTUh6LiAgLnVzZWQgaW4gNDBNSHogQVAuIE9yIHRoaXMgaXMgdGhlIHNhbWUgYXMgQ2hhbm5lbC4KLSAgICBVQ0hBUiAgIEJzc1R5cGU7Ci0gICAgVVNIT1JUICBBdGltV2luOwotICAgIFVTSE9SVCAgQmVhY29uUGVyaW9kOwotCi0gICAgVUNIQVIgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLSAgICBVQ0hBUiAgIFN1cFJhdGVMZW47Ci0gICAgVUNIQVIgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLSAgICBVQ0hBUiAgIEV4dFJhdGVMZW47Ci0JSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHk7Ci0JVUNIQVIJCQlIdENhcGFiaWxpdHlMZW47Ci0JQUREX0hUX0lORk9fSUUgQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKLQlVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQ7Ci0JQ0hBUiAgICBSc3NpOwotICAgIFVDSEFSICAgUHJpdmFjeTsJCQkvLyBJbmRpY2F0ZSBzZWN1cml0eSBmdW5jdGlvbiBPTi9PRkYuIERvbid0IG1lc3MgdXAgd2l0aCBhdXRoIG1vZGUuCi0JVUNIQVIJSGlkZGVuOwotCi0gICAgVVNIT1JUICBEdGltUGVyaW9kOwotICAgIFVTSE9SVCAgQ2FwYWJpbGl0eUluZm87Ci0KLSAgICBVU0hPUlQgIENmcENvdW50OwotICAgIFVTSE9SVCAgQ2ZwUGVyaW9kOwotICAgIFVTSE9SVCAgQ2ZwTWF4RHVyYXRpb247Ci0gICAgVVNIT1JUICBDZnBEdXJSZW1haW5pbmc7Ci0gICAgVUNIQVIgICBTc2lkTGVuOwotICAgIENIQVIgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOwotCi0gICAgVUxPTkcgICBMYXN0QmVhY29uUnhUaW1lOyAvLyBPUydzIHRpbWVzdGFtcAotCi0JQk9PTEVBTgliU0VTOwotCi0JLy8gTmV3IGZvciBXUEEyCi0JQ0lQSEVSX1NVSVRFCQkJCQlXUEE7CQkJLy8gQVAgYW5ub3VuY2VkIFdQQSBjaXBoZXIgc3VpdGUKLQlDSVBIRVJfU1VJVEUJCQkJCVdQQTI7CQkJLy8gQVAgYW5ub3VuY2VkIFdQQTIgY2lwaGVyIHN1aXRlCi0KLQkvLyBOZXcgZm9yIG1pY3Jvc29mdCBXUEEgc3VwcG9ydAotCU5ESVNfODAyXzExX0ZJWEVEX0lFcwlGaXhJRXM7Ci0JTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQlBdXRoTW9kZUF1eDsJLy8gQWRkaXRpb24gbW9kZSBmb3IgV1BBMiAvIFdQQSBjYXBhYmxlIEFQCi0JTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQlBdXRoTW9kZTsKLQlORElTXzgwMl8xMV9XRVBfU1RBVFVTCVdlcFN0YXR1czsJCQkJLy8gVW5pY2FzdCBFbmNyeXB0aW9uIEFsZ29yaXRobSBleHRyYWN0IGZyb20gVkFSX0lFCi0JVVNIT1JUCQkJCQlWYXJJRUxlbjsJCQkJLy8gTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoCi0JVUNIQVIJCQkJCVZhcklFc1tNQVhfVklFX0xFTl07Ci0KLQkvLyBDQ1ggQ2tpcCBpbmZvcm1hdGlvbgotICAgIFVDSEFSICAgQ2tpcEZsYWc7Ci0KLQkvLyBDQ1ggMiBUU0YKLQlVQ0hBUglQVFNGWzRdOwkJLy8gUGFyZW50IFRTRgotCVVDSEFSCVRUU0ZbOF07CQkvLyBUYXJnZXQgVFNGCi0KLSAgICAvLyA4MDIuMTFlIGQ5LCBhbmQgV01NCi0JRURDQV9QQVJNICAgICAgICAgICBFZGNhUGFybTsKLQlRT1NfQ0FQQUJJTElUWV9QQVJNIFFvc0NhcGFiaWxpdHk7Ci0JUUJTU19MT0FEX1BBUk0gICAgICBRYnNzTG9hZDsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSAgICBXUEFfSUVfICAgICBXcGFJRTsKLSAgICBXUEFfSUVfICAgICBSc25JRTsKLSNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi0JVUNIQVIJCUNvdW50cnlTdHJpbmdbM107Ci0JQk9PTEVBTgkJYkhhc0NvdW50cnlJRTsKLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLX0gQlNTX0VOVFJZLCAqUEJTU19FTlRSWTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVDSEFSICAgICAgICAgICBCc3NOcjsKLSAgICBVQ0hBUiAgICAgICAgICAgQnNzT3ZlcmxhcE5yOwotICAgIEJTU19FTlRSWSAgICAgICBCc3NFbnRyeVtNQVhfTEVOX09GX0JTU19UQUJMRV07Ci19IEJTU19UQUJMRSwgKlBCU1NfVEFCTEU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfUVVFVUVfRUxFTSB7Ci0gICAgVUxPTkcgICAgICAgICAgICAgTWFjaGluZTsKLSAgICBVTE9ORyAgICAgICAgICAgICBNc2dUeXBlOwotICAgIFVMT05HICAgICAgICAgICAgIE1zZ0xlbjsKLSAgICBVQ0hBUiAgICAgICAgICAgICBNc2dbTUdNVF9ETUFfQlVGRkVSX1NJWkVdOwotICAgIExBUkdFX0lOVEVHRVIgICAgIFRpbWVTdGFtcDsKLSAgICBVQ0hBUiAgICAgICAgICAgICBSc3NpMDsKLSAgICBVQ0hBUiAgICAgICAgICAgICBSc3NpMTsKLSAgICBVQ0hBUiAgICAgICAgICAgICBSc3NpMjsKLSAgICBVQ0hBUiAgICAgICAgICAgICBTaWduYWw7Ci0gICAgVUNIQVIgICAgICAgICAgICAgQ2hhbm5lbDsKLSAgICBVQ0hBUiAgICAgICAgICAgICBXY2lkOwotICAgIEJPT0xFQU4gICAgICAgICAgIE9jY3VwaWVkOwotI2lmZGVmIE1MTUVfRVgKLQlVU0hPUlQgICAgICAgICAgICBJZHg7Ci0jZW5kaWYgLy8gTUxNRV9FWCAvLwotfSBNTE1FX1FVRVVFX0VMRU0sICpQTUxNRV9RVUVVRV9FTEVNOwotCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9RVUVVRSB7Ci0gICAgVUxPTkcgICAgICAgICAgICAgTnVtOwotICAgIFVMT05HICAgICAgICAgICAgIEhlYWQ7Ci0gICAgVUxPTkcgICAgICAgICAgICAgVGFpbDsKLSAgICBORElTX1NQSU5fTE9DSyAgIExvY2s7Ci0gICAgTUxNRV9RVUVVRV9FTEVNICBFbnRyeVtNQVhfTEVOX09GX01MTUVfUVVFVUVdOwotfSBNTE1FX1FVRVVFLCAqUE1MTUVfUVVFVUU7Ci0KLXR5cGVkZWYgVk9JRCAoKlNUQVRFX01BQ0hJTkVfRlVOQykoVk9JRCAqQWRhcHRvciwgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotdHlwZWRlZiBzdHJ1Y3QgX1NUQVRFX01BQ0hJTkUgewotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZTsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yU3RhdGU7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBOck1zZzsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJTdGF0ZTsKLSAgICBTVEFURV9NQUNISU5FX0ZVTkMgICAgICAgICAgICAgKlRyYW5zRnVuYzsKLX0gU1RBVEVfTUFDSElORSwgKlBTVEFURV9NQUNISU5FOwotCi0KLS8vIE1MTUUgQVVYIGRhdGEgc3RydWN0dXJlIHRoYXQgaG9sZCB0ZW1wb3JhcmxpeSBzZXR0aW5ncyBkdXJpbmcgYSBjb25uZWN0aW9uIGF0dGVtcHQuCi0vLyBPbmNlIHRoaXMgYXR0ZW1wIHN1Y2NlZWRzLCBhbGwgc2V0dGluZ3Mgd2lsbCBiZSBjb3B5IHRvIHBBZC0+U3RhQWN0aXZlLgotLy8gQSBjb25uZWN0aW9uIGF0dGVtcHQgKHVzZXIgc2V0IE9JRCwgcm9hbWluZywgQ0NYIGZhc3Qgcm9hbWluZywuLikgY29uc2lzdHMgb2YKLS8vIHNldmVyYWwgc3RlcHMgKEpPSU4sIEFVVEgsIEFTU09DIG9yIFJFQVNTT0MpIGFuZCBtYXkgZmFpbCBhdCBhbnkgc3RlcC4gV2UgcHVycG9zZWx5Ci0vLyBzZXBhcmF0ZSB0aGlzIHVuZGVyLXRyaWFsIHNldHRpbmdzIGF3YXkgZnJvbSBwQWQtPlN0YUFjdGl2ZSBzbyB0aGF0IG9uY2UKLS8vIHRoaXMgbmV3IGF0dGVtcHQgZmFpbGVkLCBkcml2ZXIgY2FuIGF1dG8tcmVjb3ZlciBiYWNrIHRvIHRoZSBhY3RpdmUgc2V0dGluZ3MuCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9BVVggewotICAgIFVDSEFSICAgICAgICAgICAgICAgQnNzVHlwZTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIFNzaWRMZW47Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOwotCVVDSEFSCQkJCUF1dG9SZWNvbm5lY3RTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0JVUNIQVIJCQkJQXV0b1JlY29ubmVjdFNzaWRMZW47Ci0gICAgVVNIT1JUICAgICAgICAgICAgICBBbGc7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBTY2FuVHlwZTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIENoYW5uZWw7Ci0JVUNIQVIgICAgICAgICAgICAgICBDZW50cmFsQ2hhbm5lbDsKLSAgICBVU0hPUlQgICAgICAgICAgICAgIEFpZDsKLSAgICBVU0hPUlQgICAgICAgICAgICAgIENhcGFiaWxpdHlJbmZvOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgQmVhY29uUGVyaW9kOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgQ2ZwTWF4RHVyYXRpb247Ci0gICAgVVNIT1JUICAgICAgICAgICAgICBDZnBQZXJpb2Q7Ci0gICAgVVNIT1JUICAgICAgICAgICAgICBBdGltV2luOwotCi0JLy8gQ29weSBzdXBwb3J0ZWQgcmF0ZSBmcm9tIGRlc2lyZWQgQVAncyBiZWFjb24uIFdlIGFyZSB0cnlpbmcgdG8gbWF0Y2gKLQkvLyBBUCdzIHN1cHBvcnRlZCBhbmQgZXh0ZW5kZWQgcmF0ZSBzZXR0aW5ncy4KLQlVQ0hBUgkJICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUgkJICAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUgkJICAgICAgICBTdXBSYXRlTGVuOwotCVVDSEFSCQkgICAgICAgIEV4dFJhdGVMZW47Ci0JSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OwotCVVDSEFSCQkJCUh0Q2FwYWJpbGl0eUxlbjsKLQlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQ7Ci0JLy9SVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OwotCi0gICAgLy8gbmV3IGZvciBRT1MKLSAgICBRT1NfQ0FQQUJJTElUWV9QQVJNIEFQUW9zQ2FwYWJpbGl0eTsgICAgLy8gUU9TIGNhcGFiaWxpdHkgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAotICAgIEVEQ0FfUEFSTSAgICAgICAgICAgQVBFZGNhUGFybTsgICAgICAgICAvLyBFRENBIHBhcmFtZXRlcnMgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAotICAgIFFCU1NfTE9BRF9QQVJNICAgICAgQVBRYnNzTG9hZDsgICAgICAgICAvLyBRQlNTIGxvYWQgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAotCi0gICAgLy8gbmV3IHRvIGtlZXAgUmFsaW5rIHNwZWNpZmljIGZlYXR1cmUKLSAgICBVTE9ORyAgICAgICAgICAgICAgIEFQUmFsaW5rSWU7Ci0KLSAgICBCU1NfVEFCTEUgICAgICAgICAgIFNzaWRCc3NUYWI7ICAgICAvLyBBUCBsaXN0IGZvciB0aGUgc2FtZSBTU0lECi0gICAgQlNTX1RBQkxFICAgICAgICAgICBSb2FtVGFiOyAgICAgICAgLy8gQVAgbGlzdCBlbGlnaWJsZSBmb3Igcm9hbWluZwotICAgIFVMT05HICAgICAgICAgICAgICAgQnNzSWR4OwotICAgIFVMT05HICAgICAgICAgICAgICAgUm9hbUlkeDsKLQotCUJPT0xFQU4JCQkJQ3VyclJlcUlzRnJvbU5kaXM7Ci0KLSAgICBSQUxJTktfVElNRVJfU1RSVUNUIEJlYWNvblRpbWVyLCBTY2FuVGltZXI7Ci0gICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBdXRoVGltZXI7Ci0gICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBc3NvY1RpbWVyLCBSZWFzc29jVGltZXIsIERpc2Fzc29jVGltZXI7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLX0gTUxNRV9BVVgsICpQTUxNRV9BVVg7Ci0KLXR5cGVkZWYgc3RydWN0IF9NTE1FX0FEREJBX1JFUV9TVFJVQ1R7Ci0JVUNIQVIgICBXY2lkOwkvLwotCVVDSEFSICAgcEFkZHJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgIEJhQnVmU2l6ZTsKLQlVU0hPUlQJVGltZU91dFZhbHVlOwotCVVDSEFSICAgVElEOwotCVVDSEFSICAgVG9rZW47Ci0JVVNIT1JUCUJhU3RhcnRTZXE7Ci19IE1MTUVfQUREQkFfUkVRX1NUUlVDVCwgKlBNTE1FX0FEREJBX1JFUV9TVFJVQ1Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfREVMQkFfUkVRX1NUUlVDVHsKLQlVQ0hBUiAgIFdjaWQ7CS8vCi0JVUNIQVIgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgIFRJRDsKLQlVQ0hBUglJbml0aWF0b3I7Ci19IE1MTUVfREVMQkFfUkVRX1NUUlVDVCwgKlBNTE1FX0RFTEJBX1JFUV9TVFJVQ1Q7Ci0KLS8vIGFzc29jIHN0cnVjdCBpcyBlcXVhbCB0byByZWFzc29jCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9BU1NPQ19SRVFfU1RSVUNUewotICAgIFVDSEFSICAgICBBZGRyW01BQ19BRERSX0xFTl07Ci0gICAgVVNIT1JUICAgIENhcGFiaWxpdHlJbmZvOwotICAgIFVTSE9SVCAgICBMaXN0ZW5JbnR2OwotICAgIFVMT05HICAgICBUaW1lb3V0OwotfSBNTE1FX0FTU09DX1JFUV9TVFJVQ1QsICpQTUxNRV9BU1NPQ19SRVFfU1RSVUNULCBNTE1FX1JFQVNTT0NfUkVRX1NUUlVDVCwgKlBNTE1FX1JFQVNTT0NfUkVRX1NUUlVDVDsKLQotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfRElTQVNTT0NfUkVRX1NUUlVDVHsKLSAgICBVQ0hBUiAgICAgQWRkcltNQUNfQUREUl9MRU5dOwotICAgIFVTSE9SVCAgICBSZWFzb247Ci19IE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCwgKlBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1Q7Ci0KLXR5cGVkZWYgc3RydWN0IF9NTE1FX0FVVEhfUkVRX1NUUlVDVCB7Ci0gICAgVUNIQVIgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKLSAgICBVU0hPUlQgICAgICAgQWxnOwotICAgIFVMT05HICAgICAgICBUaW1lb3V0OwotfSBNTE1FX0FVVEhfUkVRX1NUUlVDVCwgKlBNTE1FX0FVVEhfUkVRX1NUUlVDVDsKLQotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfREVBVVRIX1JFUV9TVFJVQ1QgewotICAgIFVDSEFSICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07Ci0gICAgVVNIT1JUICAgICAgIFJlYXNvbjsKLX0gTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCwgKlBNTE1FX0RFQVVUSF9SRVFfU1RSVUNUOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVUxPTkcgICAgICBCc3NJZHg7Ci19IE1MTUVfSk9JTl9SRVFfU1RSVUNUOwotCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgewotICAgIFVDSEFSICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXTsKLSAgICBVQ0hBUiAgICAgIEJzc1R5cGU7Ci0gICAgVUNIQVIgICAgICBTY2FuVHlwZTsKLSAgICBVQ0hBUiAgICAgIFNzaWRMZW47Ci0gICAgQ0hBUiAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci19IE1MTUVfU0NBTl9SRVFfU1RSVUNULCAqUE1MTUVfU0NBTl9SRVFfU1RSVUNUOwotCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9TVEFSVF9SRVFfU1RSVUNUIHsKLSAgICBDSEFSICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0gICAgVUNIQVIgICAgICAgU3NpZExlbjsKLX0gTUxNRV9TVEFSVF9SRVFfU1RSVUNULCAqUE1MTUVfU1RBUlRfUkVRX1NUUlVDVDsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotLy8gc3RydWN0dXJlIGZvciBETFMKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRExTIHsKLQlVU0hPUlQJCQkJCQlUaW1lT3V0OwkJLy8gVXNlIHRvIHRpbWUgb3V0IHdoaWxlIHNsaWVuY2UsIHVuaXQ6IHNlY29uZCAsIHNldCBieSBVSQotCVVTSE9SVAkJCQkJCUNvdW50RG93blRpbWVyOwkvLyBVc2UgdG8gdGltZSBvdXQgd2hpbGUgc2xpZW5jZSx1bml0OiBzZWNvbmQgLCB1c2VkIGJ5IGRyaXZlciBvbmx5Ci0JTkRJU184MDJfMTFfTUFDX0FERFJFU1MJCU1hY0FkZHI7CQkvLyBzZXQgYnkgVUkKLQlVQ0hBUgkJCQkJCVN0YXR1czsJCQkvLyAwOiBub25lICwgMTogd2FpdCBTVEFrZXksIDI6IGZpbmlzaCBETFMgc2V0dXAgLCBzZXQgYnkgZHJpdmVyIG9ubHkKLQlCT09MRUFOCQkJCQkJVmFsaWQ7CQkJLy8gMTogdmFsaWQgLCAwOiBpbnZhbGlkICwgc2V0IGJ5IFVJLCB1c2UgdG8gc2V0dXAgb3IgdGVhciBkb3duIERMUyBsaW5rCi0JUkFMSU5LX1RJTUVSX1NUUlVDVAkJCVRpbWVyOwkJCS8vIFVzZSB0byB0aW1lIG91dCB3aGlsZSBoYW5kc2hha2UKLQlVU0hPUlQJCQkJCQlTZXF1ZW5jZTsKLQlVU0hPUlQJCQkJCQlNYWNUYWJNYXRjaFdDSUQ7CS8vIEFTSUMKLQlCT09MRUFOCQkJCQkJYkhUQ2FwOwotCVBWT0lECQkJCQkJcEFkOwotfSBSVF84MDJfMTFfRExTLCAqUFJUXzgwMl8xMV9ETFM7Ci0KLXR5cGVkZWYgc3RydWN0IF9NTE1FX0RMU19SRVFfU1RSVUNUIHsKLSAgICBQUlRfODAyXzExX0RMUwlwRExTOwotICAgIFVTSE9SVAkJCVJlYXNvbjsKLX0gTUxNRV9ETFNfUkVRX1NUUlVDVCwgKlBNTE1FX0RMU19SRVFfU1RSVUNUOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotICAgIFVDSEFSICAgRWlkOwotICAgIFVDSEFSICAgTGVuOwotICAgIFVDSEFSICAgT2N0ZXRbMV07Ci19IEVJRF9TVFJVQ1QsKlBFSURfU1RSVUNULCBCRUFDT05fRUlEX1NUUlVDVCwgKlBCRUFDT05fRUlEX1NUUlVDVDsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVE1QX1RYX1JBVEVfU1dJVENICi17Ci0JVUNIQVIgICBJdGVtTm87Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCVJzdjI6MjsKLQlVQ0hBUglNb2RlOjI7Ci0JVUNIQVIJUnN2MToxOwotCVVDSEFSCUJXOjE7Ci0JVUNIQVIJU2hvcnRHSToxOwotCVVDSEFSCVNUQkM6MTsKLSNlbHNlCi0JVUNIQVIJU1RCQzoxOwotCVVDSEFSCVNob3J0R0k6MTsKLQlVQ0hBUglCVzoxOwotCVVDSEFSCVJzdjE6MTsKLQlVQ0hBUglNb2RlOjI7Ci0JVUNIQVIJUnN2MjoyOwotI2VuZGlmCi0JVUNIQVIgICBDdXJyTUNTOwotCVVDSEFSICAgVHJhaW5VcDsKLQlVQ0hBUiAgIFRyYWluRG93bjsKLX0gUlJUTVBfVFhfUkFURV9TV0lUQ0gsICpQUlRNUF9UWF9SQVRFX1NXSVRDSDsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gQVAgbWxtZS5oID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNkZWZpbmUgVEJUVF9QUkVMT0FEX1RJTUUgICAgICAgMzg0ICAgICAgICAvLyB1c2VjLiBMb21nUHJlYW1ibGUgKyAyNC1ieXRlIGF0IDFNYnBzCi0jZGVmaW5lIERFRkFVTFRfRFRJTV9QRVJJT0QgICAgIDEKLQotLy8gd2VpZ2h0aW5nIGZhY3RvciB0byBjYWxjdWxhdGUgQ2hhbm5lbCBxdWFsaXR5LCB0b3RhbCBzaG91bGQgYmUgMTAwJQotLy8jZGVmaW5lIFJTU0lfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgIDAKLS8vI2RlZmluZSBUWF9XRUlHSFRJTkcgICAgICAgICAgICAgICAgICAgICA0MAotLy8jZGVmaW5lIFJYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDYwCi0KLSNkZWZpbmUgTUFDX1RBQkxFX0FHRU9VVF9USU1FCQkJMzAwCQkJLy8gdW5pdDogc2VjCi0jZGVmaW5lIE1BQ19UQUJMRV9BU1NPQ19USU1FT1VUCQkJNQkJCS8vIHVuaXQ6IHNlYwotI2RlZmluZSBNQUNfVEFCTEVfRlVMTChUYWIpCQkJCSgoVGFiKS5zaXplID09IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCi0vLyBBUCBzaGFsbCBkcm9wIHRoZSBzdGEgaWYgY29udGluZSBUeCBmYWlsIGNvdW50IHJlYWNoIGl0LgotI2RlZmluZSBNQUNfRU5UUllfTElGRV9DSEVDS19DTlQJCTIwCQkJLy8gcGFja2V0IGNudC4KLQotLy8gVmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+U3N0Ci10eXBlZGVmIGVudW0gX1NzdCB7Ci0gICAgU1NUX05PVF9BVVRILCAgIC8vIDA6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAxCi0gICAgU1NUX0FVVEgsICAgICAgIC8vIDE6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAyCi0gICAgU1NUX0FTU09DICAgICAgIC8vIDI6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAzCi19IFNTVDsKLQotLy8gdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+QXV0aFN0YXRlCi10eXBlZGVmIGVudW0gX0F1dGhTdGF0ZSB7Ci0gICAgQVNfTk9UX0FVVEgsCi0gICAgQVNfQVVUSF9PUEVOLCAgICAgICAvLyBTVEEgaGFzIGJlZW4gYXV0aGVudGljYXRlZCB1c2luZyBPUEVOIFNZU1RFTQotICAgIEFTX0FVVEhfS0VZLCAgICAgICAgLy8gU1RBIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgdXNpbmcgU0hBUkVEIEtFWQotICAgIEFTX0FVVEhFTlRJQ0FUSU5HICAgLy8gU1RBIGlzIHdhaXRpbmcgZm9yIEFVVEggc2VxIzMgdXNpbmcgU0hBUkVEIEtFWQotfSBBVVRIX1NUQVRFOwotCi0vL2Zvci13cGEgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0Ci10eXBlZGVmIGVudW0gX0FwV3BhU3RhdGUgewotICAgIEFTX05PVFVTRSwgICAgICAgICAgICAgIC8vIDAKLSAgICBBU19ESVNDT05ORUNULCAgICAgICAgICAvLyAxCi0gICAgQVNfRElTQ09OTkVDVEVELCAgICAgICAgLy8gMgotICAgIEFTX0lOSVRJQUxJWkUsICAgICAgICAgIC8vIDMKLSAgICBBU19BVVRIRU5USUNBVElPTiwgICAgICAvLyA0Ci0gICAgQVNfQVVUSEVOVElDQVRJT04yLCAgICAgLy8gNQotICAgIEFTX0lOSVRQTUssICAgICAgICAgICAgIC8vIDYKLSAgICBBU19JTklUUFNLLCAgICAgICAgICAgICAvLyA3Ci0gICAgQVNfUFRLU1RBUlQsICAgICAgICAgICAgLy8gOAotICAgIEFTX1BUS0lOSVRfTkVHT1RJQVRJTkcsIC8vIDkKLSAgICBBU19QVEtJTklURE9ORSwgICAgICAgICAvLyAxMAotICAgIEFTX1VQREFURUtFWVMsICAgICAgICAgIC8vIDExCi0gICAgQVNfSU5URUdSSVRZX0ZBSUxVUkUsICAgLy8gMTIKLSAgICBBU19LRVlVUERBVEUsICAgICAgICAgICAvLyAxMwotfSBBUF9XUEFfU1RBVEU7Ci0KLS8vIGZvci13cGEgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0Ci10eXBlZGVmIGVudW0gX0dUS1N0YXRlIHsKLSAgICBSRUtFWV9ORUdPVElBVElORywKLSAgICBSRUtFWV9FU1RBQkxJU0hFRCwKLSAgICBLRVlFUlJPUiwKLX0gR1RLX1NUQVRFOwotCi0vLyAgZm9yLXdwYSAgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0Ci10eXBlZGVmIGVudW0gX1dwYUdUS1N0YXRlIHsKLSAgICBTRVRLRVlTLAotICAgIFNFVEtFWVNfRE9ORSwKLX0gV1BBX0dUS19TVEFURTsKLS8vID09PT09PT09PT09PT09PT09PT09PT0gZW5kIG9mIEFQIG1sbWUuaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotI2VuZGlmCS8vIE1MTUVfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL21sbWVfZXguaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvbWxtZV9leC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2U5NGRjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvbWxtZV9leC5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBtbG1lX2V4LmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlGb25jaGkJCTIwMDctMDYtMjUJCUV4dGVuZCBvcmlnaW5hbCBtbG1lIEFQSXMgdG8gc3VwcG9ydCBtdWx0aS1lbnRyaWVzCi0qLwotI2lmbmRlZiBfX01MTUVfRVhfSF9fCi0jZGVmaW5lIF9fTUxNRV9FWF9IX18KLQotI2luY2x1ZGUgIm1sbWVfZXhfZGVmLmgiCi0KLQotVk9JRCBTdGF0ZU1hY2hpbmVJbml0RXgoCi0JSU4gU1RBVEVfTUFDSElORV9FWCAqUywKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkNfRVggVHJhbnNbXSwKLQlJTiBVTE9ORyBTdE5yLAotCUlOIFVMT05HIE1zZ05yLAotCUlOIFNUQVRFX01BQ0hJTkVfRlVOQ19FWCBEZWZGdW5jLAotCUlOIFVMT05HIEluaXRTdGF0ZSwKLQlJTiBVTE9ORyBCYXNlKTsKLQotVk9JRCBTdGF0ZU1hY2hpbmVTZXRBY3Rpb25FeCgKLQlJTiBTVEFURV9NQUNISU5FX0VYICpTLAotCUlOIFVMT05HIFN0LAotCUlOIFVMT05HIE1zZywKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkNfRVggRnVuYyk7Ci0KLUJPT0xFQU4gaXNWYWxpZEFwQ2xpSWYoCi0JU0hPUlQgSWR4KTsKLQotVk9JRCBTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uRXgoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gU1RBVEVfTUFDSElORV9FWCAqUywKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0sCi0JVVNIT1JUIElkeCwKLQlQVUxPTkcgcEN1cnJTdGF0ZSk7Ci0KLUJPT0xFQU4gTWxtZUVucXVldWVFeCgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVTE9ORyBNYWNoaW5lLAotCUlOIFVMT05HIE1zZ1R5cGUsCi0JSU4gVUxPTkcgTXNnTGVuLAotCUlOIFZPSUQgKk1zZywKLQlJTiBVU0hPUlQgSWR4KTsKLQotVk9JRCBEcm9wRXgoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtLAotCVBVTE9ORyBwQ3VyclN0YXRlLAotCVVTSE9SVCBJZHgpOwotCi0jZW5kaWYgLyogX19NTE1FX0VYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9tbG1lX2V4X2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9tbG1lX2V4X2RlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2Q2MGI0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvbWxtZV9leF9kZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgbWxtZV9leF9kZWYuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUZvbmNoaQkJMjAwNy0wNi0yNQkJRXh0ZW5kIG9yaWdpbmFsIG1sbWUgQVBJcyB0byBzdXBwb3J0IG11bHRpLWVudHJpZXMKLSovCi0jaWZuZGVmIF9fTUxNRV9FWF9ERUZfSF9fCi0jZGVmaW5lIF9fTUxNRV9FWF9ERUZfSF9fCi0KLQotdHlwZWRlZiBWT0lEICgqU1RBVEVfTUFDSElORV9GVU5DX0VYKShWT0lEICpBZGFwdG9yLCBNTE1FX1FVRVVFX0VMRU0gKkVsZW0sIFBVTE9ORyBwQ3VyclN0YXRlLCBVU0hPUlQgSWR4KTsKLQotdHlwZWRlZiBzdHJ1Y3QgX1NUQV9TVEFURV9NQUNISU5FX0VYCi17Ci0JVUxPTkcJCQkJCUJhc2U7Ci0JVUxPTkcJCQkJCU5yU3RhdGU7Ci0JVUxPTkcJCQkJCU5yTXNnOwotCVVMT05HCQkJCQlDdXJyU3RhdGU7Ci0JU1RBVEVfTUFDSElORV9GVU5DX0VYCSpUcmFuc0Z1bmM7Ci19IFNUQVRFX01BQ0hJTkVfRVgsICpQU1RBX1NUQVRFX01BQ0hJTkVfRVg7Ci0KLSNlbmRpZiAvLyBfX01MTUVfRVhfREVGX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9uZXRpZl9ibG9jay5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9uZXRpZl9ibG9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTc1Mzg5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvbmV0aWZfYmxvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19ORVRfSUZfQkxPQ0tfSF9fCi0jZGVmaW5lIF9fTkVUX0lGX0JMT0NLX0hfXwotCi0jaW5jbHVkZSAibGlua19saXN0LmgiCi0jaW5jbHVkZSAicnRtcC5oIgotCi0jZGVmaW5lIEZSRUVfTkVUSUZfUE9PTF9TSVpFIDMyCi0KLXR5cGVkZWYgc3RydWN0IF9ORVRJRl9FTlRSWQotewotCXN0cnVjdCBfTkVUSUZfRU5UUlkgKnBOZXh0OwotCVBORVRfREVWIHBOZXREZXY7Ci19IE5FVElGX0VOVFJZLCAqUE5FVElGX0VOVFJZOwotCi12b2lkIGluaXRibG9ja1F1ZXVlVGFiKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotQk9PTEVBTiBibG9ja05ldElmKAotCUlOIFBCTE9DS19RVUVVRV9FTlRSWSBwQmxvY2tRdWV1ZUVudHJ5LAotCUlOIFBORVRfREVWIHBOZXREZXYpOwotCi1WT0lEIHJlbGVhc2VOZXRJZigKLQlJTiBQQkxPQ0tfUVVFVUVfRU5UUlkgcEJsb2NrUXVldWVFbnRyeSk7Ci0KLVZPSUQgU3RvcE5ldElmUXVldWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgUXVlSWR4LAotCUlOIFBORElTX1BBQ0tFVCBwUGFja2V0KTsKLSNlbmRpZiAvLyBfX05FVF9JRl9CTE9DS19IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvb2lkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL29pZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWE0MzQwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvb2lkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQ0ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0Jb2lkLmgKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKLSovCi0jaWZuZGVmIF9PSURfSF8KLSNkZWZpbmUgX09JRF9IXwotCi0vLyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRQkJCQkxCi0jZW5kaWYKLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UJCQkJMAotI2VuZGlmCi0vLwotLy8gSUVFRSA4MDIuMTEgU3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMKLS8vCi0jZGVmaW5lIE1BWF9UWF9QT1dFUl9MRVZFTCAgICAgICAgICAgICAgMTAwICAgLyogbVcgKi8KLSNkZWZpbmUgTUFYX1JTU0lfVFJJR0dFUiAgICAgICAgICAgICAgICAtMTAgICAgLyogZEJtICovCi0jZGVmaW5lIE1JTl9SU1NJX1RSSUdHRVIgICAgICAgICAgICAgICAgLTIwMCAgIC8qIGRCbSAqLwotI2RlZmluZSBNQVhfRlJBR19USFJFU0hPTEQgICAgICAgICAgICAgIDIzNDYgIC8qIGJ5dGUgY291bnQgKi8KLSNkZWZpbmUgTUlOX0ZSQUdfVEhSRVNIT0xEICAgICAgICAgICAgICAyNTYgICAvKiBieXRlIGNvdW50ICovCi0jZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xEICAgICAgICAgICAgICAgMjM0NyAgLyogYnl0ZSBjb3VudCAqLwotCi0vLyBuZXcgdHlwZXMgZm9yIE1lZGlhIFNwZWNpZmljIEluZGljYXRpb25zCi0vLyBFeHRlbnNpb24gY2hhbm5lbCBvZmZzZXQKLSNkZWZpbmUgRVhUQ0hBX05PTkUJCQkwCi0jZGVmaW5lIEVYVENIQV9BQk9WRQkJMHgxCi0jZGVmaW5lIEVYVENIQV9CRUxPVwkJMHgzCi0KLS8vIEJXCi0jZGVmaW5lIEJBTkRfV0lEVEhfMjAJCTAKLSNkZWZpbmUgQkFORF9XSURUSF80MAkJMQotI2RlZmluZSBCQU5EX1dJRFRIX0JPVEgJCTIKLSNkZWZpbmUgQkFORF9XSURUSF8xMAkJMwkvLyA4MDIuMTFqIGhhcyAxME1Iei4gVGhpcyBkZWZpbml0aW9uIGlzIGZvciBpbnRlcm5hbCB1c2FnZS4gZG9lc24ndCBmaWxsIGluIHRoZSBJRSBvciBvdGhlciBmaWVsZC4KLS8vIFNIT1JUR0kKLSNkZWZpbmUgR0FQX0lOVEVSVkFMXzQwMAkxCS8vIG9ubHkgc3VwcG9ydCBpbiBIVCBtb2RlCi0jZGVmaW5lIEdBUF9JTlRFUlZBTF84MDAJMAotI2RlZmluZSBHQVBfSU5URVJWQUxfQk9USAkyCi0KLSNkZWZpbmUgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQJCQkxCi0jZGVmaW5lIE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkCQkwCi0KLSNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1NTSUQgICAgICAgICAzMgotI2RlZmluZSBORElTXzgwMl8xMV9MRU5HVEhfUkFURVMgICAgICAgIDgKLSNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYICAgICAxNgotI2RlZmluZSBNQUNfQUREUl9MRU5HVEggICAgICAgICAgICAgICAgIDYKLS8vI2RlZmluZSBNQVhfTlVNX09GX0NIUwkJCQkJNDkgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb25jCi0jZGVmaW5lIE1BWF9OVU1fT0ZfQ0hTCQkJCTU0ICAgICAgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSShsb3dlci9taWRkbGUpICsgMTZASGlwZXJMQU4yICsgMTFAVU5JSSh1cHBlcikgKyAwIEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbgotI2RlZmluZSBNQVhfTlVNQkVSX09GX0VWRU5UCQkJCTEwICAvLyBlbnRyeSAjIGluIEVWRU5UIHRhYmxlCi0jZGVmaW5lIE1BWF9OVU1CRVJfT0ZfTUFDCQkJCTMyIC8vIGlmIE1BWF9NQlNTSURfTlVNIGlzIDgsIHRoaXMgdmFsdWUgY2FuJ3QgYmUgbGFyZ2VyIHRoYW4gMjExCi0jZGVmaW5lIE1BWF9OVU1CRVJfT0ZfQUNMCQkJCTY0Ci0jZGVmaW5lIE1BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFUwkJMTIgICAgLy8gMSwgMiwgNS41LCAxMSwgNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NAotI2RlZmluZSBNQVhfTlVNQkVSX09GX0RMU19FTlRSWQkJCTQKLQotCi0jZGVmaW5lIFJUX1FVRVJZX1NJR05BTF9DT05URVhUCQkJCTB4MDQwMgotI2RlZmluZSBSVF9TRVRfSUFQUF9QSUQJCQkJMHgwNDA0Ci0jZGVmaW5lIFJUX1NFVF9BUERfUElECQkJCQkJMHgwNDA1Ci0jZGVmaW5lIFJUX1NFVF9ERUxfTUFDX0VOVFJZCQkJCTB4MDQwNgotI2RlZmluZSBSVF9RVUVSWV9FVkVOVF9UQUJMRQkJCTB4MDQwNwotLy8KLS8vIElFRUUgODAyLjExIE9JRHMKLS8vCi0jZGVmaW5lCU9JRF9HRVRfU0VUX1RPR0dMRQkJCTB4ODAwMAotI2RlZmluZQlPSURfR0VUX1NFVF9GUk9NX1VJCQkJMHg0MDAwCi0KLSNkZWZpbmUJT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVTX1NVUFBPUlRFRAkJCTB4MDEwMwotI2RlZmluZQlPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UJCQkJMHgwMTA0Ci0jZGVmaW5lCU9JRF84MDJfMTFfUlNTSV9UUklHR0VSCQkJCQkJMHgwMTA3Ci0jZGVmaW5lCVJUX09JRF84MDJfMTFfUlNTSQkJCQkJCQkweDAxMDggLy9ydDI4NjAJb25seSAsIGthdGh5Ci0jZGVmaW5lCVJUX09JRF84MDJfMTFfUlNTSV8xCQkJCQkJMHgwMTA5IC8vcnQyODYwCW9ubHkgLCBrYXRoeQotI2RlZmluZQlSVF9PSURfODAyXzExX1JTU0lfMgkJCQkJCTB4MDEwQSAvL3J0Mjg2MAlvbmx5ICwga2F0aHkKLSNkZWZpbmUJT0lEXzgwMl8xMV9OVU1CRVJfT0ZfQU5URU5OQVMJCQkJMHgwMTBCCi0jZGVmaW5lCU9JRF84MDJfMTFfUlhfQU5URU5OQV9TRUxFQ1RFRAkJCQkweDAxMEMKLSNkZWZpbmUJT0lEXzgwMl8xMV9UWF9BTlRFTk5BX1NFTEVDVEVECQkJCTB4MDEwRAotI2RlZmluZQlPSURfODAyXzExX1NVUFBPUlRFRF9SQVRFUwkJCQkJMHgwMTBFCi0jZGVmaW5lCU9JRF84MDJfMTFfQUREX1dFUAkJCQkJCQkweDAxMTIKLSNkZWZpbmUJT0lEXzgwMl8xMV9SRU1PVkVfV0VQCQkJCQkJMHgwMTEzCi0jZGVmaW5lCU9JRF84MDJfMTFfRElTQVNTT0NJQVRFCQkJCQkJMHgwMTE0Ci0jZGVmaW5lCU9JRF84MDJfMTFfUFJJVkFDWV9GSUxURVIJCQkJCTB4MDExOAotI2RlZmluZQlPSURfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OCQkJMHgwMTFFCi0jZGVmaW5lCU9JRF84MDJfMTFfVEVTVAkJCQkJCQkJMHgwMTFGCi0KLQotI2RlZmluZQlSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OCQkJCTB4MDUwNwotI2RlZmluZQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTgkJCQkJMHgwNTA4Ci0jZGVmaW5lCU9JRF84MDJfMTFfU1NJRAkJCQkJCQkJMHgwNTA5Ci0jZGVmaW5lCU9JRF84MDJfMTFfQlNTSUQJCQkJCQkJMHgwNTBBCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfUkFESU8JCQkJCQkJMHgwNTBCCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfUEhZX01PREUJCQkJCQkweDA1MEMKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHCQkJCQkweDA1MEQKLSNkZWZpbmUJT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCQkJCQkweDA1MEUKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9QUkVBTUJMRQkJCQkJCTB4MDUwRgotI2RlZmluZQlPSURfODAyXzExX1dFUF9TVEFUVVMJCQkJCQkweDA1MTAKLSNkZWZpbmUJT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCQkJCTB4MDUxMQotI2RlZmluZQlPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUJCQkJMHgwNTEyCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfUkVTRVRfQ09VTlRFUlMJCQkJMHgwNTEzCi0jZGVmaW5lCU9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRAkJCQkJMHgwNTE0Ci0jZGVmaW5lCU9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQJCQkweDA1MTUKLSNkZWZpbmUJT0lEXzgwMl8xMV9QT1dFUl9NT0RFCQkJCQkJMHgwNTE2Ci0jZGVmaW5lCU9JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUwJCQkJCTB4MDUxNwotI2RlZmluZQlSVF9PSURfODAyXzExX0FERF9XUEEJCQkJCQkweDA1MTgKLSNkZWZpbmUJT0lEXzgwMl8xMV9SRU1PVkVfS0VZCQkJCQkJMHgwNTE5Ci0jZGVmaW5lCU9JRF84MDJfMTFfQUREX0tFWQkJCQkJCQkweDA1MjAKLSNkZWZpbmUJT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OCQkJCQkweDA1MjEKLSNkZWZpbmUJT0lEXzgwMl8xMV9UWF9QQUNLRVRfQlVSU1QJCQkJCTB4MDUyMgotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX05PSVNFX0xFVkVMCQkJCTB4MDUyMwotI2RlZmluZQlSVF9PSURfODAyXzExX0VYVFJBX0lORk8JCQkJCTB4MDUyNAotI2lmZGVmCURCRwotI2RlZmluZQlSVF9PSURfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSCQkJCTB4MDUyNQotI2VuZGlmCi0jZGVmaW5lIE9JRF84MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgICAgICAgICAgICBPSURfODAyXzExX1dFUF9TVEFUVVMKLSNkZWZpbmUgT0lEXzgwMl8xMV9ERUFVVEhFTlRJQ0FUSU9OICAgICAgICAgICAgICAgICAweDA1MjYKLSNkZWZpbmUgT0lEXzgwMl8xMV9EUk9QX1VORU5DUllQVEVEICAgICAgICAgICAgICAgICAweDA1MjcKLSNkZWZpbmUgT0lEXzgwMl8xMV9NSUNfRkFJTFVSRV9SRVBPUlRfRlJBTUUgICAgICAgICAweDA1MjgKLSNkZWZpbmUgT0lEXzgwMl8xMV9FQVBfTUVUSE9ECQkJCQkJMHgwNTI5Ci0KLS8vIEZvciA4MDIuMXggZGFlbWluIHVzaW5nIHRvIHJlcXVpcmUgY3VycmVudCBkcml2ZXIgY29uZmlndXJhdGlvbgotI2RlZmluZSBPSURfODAyXzExX1JBRElVU19RVUVSWV9TRVRUSU5HCQkJCTB4MDU0MAotCi0jZGVmaW5lCVJUX09JRF9ERVZJQ0VfTkFNRQkJCQkJCQkweDA2MDcKLSNkZWZpbmUJUlRfT0lEX1ZFUlNJT05fSU5GTwkJCQkJCQkweDA2MDgKLSNkZWZpbmUJT0lEXzgwMl8xMV9CU1NJRF9MSVNUCQkJCQkJMHgwNjA5Ci0jZGVmaW5lCU9JRF84MDJfM19DVVJSRU5UX0FERFJFU1MJCQkJCTB4MDYwQQotI2RlZmluZQlPSURfR0VOX01FRElBX0NPTk5FQ1RfU1RBVFVTCQkJCTB4MDYwQgotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTCQkJCTB4MDYwQwotI2RlZmluZQlPSURfODAyXzExX1JTU0kJCQkJCQkJCTB4MDYwRAotI2RlZmluZQlPSURfODAyXzExX1NUQVRJU1RJQ1MJCQkJCQkweDA2MEUKLSNkZWZpbmUJT0lEX0dFTl9SQ1ZfT0sJCQkJCQkJCTB4MDYwRgotI2RlZmluZQlPSURfR0VOX1JDVl9OT19CVUZGRVIJCQkJCQkweDA2MTAKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9FRVBST01fVkVSU0lPTgkJCTB4MDYxMQotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0ZJUk1XQVJFX1ZFUlNJT04JCTB4MDYxMgotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURQkJCTB4MDYxMwotI2RlZmluZQlSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEJCQkJMHgwNjE0Ci0jZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfUElEVklECQkJCQkweDA2MTUKLS8vZm9yIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSNkZWZpbmUgT0lEX1NFVF9DT1VOVEVSTUVBU1VSRVMgICAgICAgICAgICAgICAgICAgICAweDA2MTYKLSNkZWZpbmUgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYICAgICAgICAgICAgICAgICAgICAweDA2MTcKLSNkZWZpbmUgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYX1JFUVVJUkVfS0VZICAgICAgICAweDA2MTgKLSNkZWZpbmUgT0lEXzgwMl8xMV9QTUtJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjAKLSNkZWZpbmUgUlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgICAgICAgICAgICAgICAweDA2MjEKLSNkZWZpbmUgUlRfT0lEX1dFX1ZFUlNJT05fQ09NUElMRUQgICAgICAgICAgICAgICAgICAweDA2MjIKLSNkZWZpbmUgUlRfT0lEX05FV19EUklWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjMKLQotI2RlZmluZQlSVF9PSURfODAyXzExX1NOUl8wCQkJCQkJCTB4MDYzMAotI2RlZmluZQlSVF9PSURfODAyXzExX1NOUl8xCQkJCQkJCTB4MDYzMQotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfVFhfUkFURQkJCTB4MDYzMgotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREUJCQkJMHgwNjMzCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfU0VUX0hUX1BIWU1PREUJCQkJMHgwNjM0Ci0jZGVmaW5lCU9JRF84MDJfMTFfUkVMT0FEX0RFRkFVTFRTCQkJCQkweDA2MzUKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1NFVFRJTkcJCQkweDA2MzYKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9TRVRUSU5HCQkJCTB4MDYzNwotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfUFNNCQkJCTB4MDYzOAotI2RlZmluZQlSVF9PSURfODAyXzExX1NFVF9BUFNEX1BTTQkJCQkJMHgwNjM5Ci0jZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfRExTCQkJCQkJMHgwNjNBCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfU0VUX0RMUwkJCQkJCTB4MDYzQgotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0RMU19QQVJBTQkJCQkweDA2M0MKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNCQkJCQkweDA2M0QKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9XTU0JCQkJMHgwNjNFCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfU0VUX1dNTQkJCQkJCTB4MDYzRgotI2RlZmluZSBSVF9PSURfODAyXzExX1FVRVJZX0lNTUVfQkFfQ0FQCQkJCTB4MDY0MAotI2RlZmluZSBSVF9PSURfODAyXzExX1NFVF9JTU1FX0JBX0NBUAkJCQkweDA2NDEKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9CQVRBQkxFCQkJCQkweDA2NDIKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQQkJCQkJMHgwNjQzCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBCQkJCQkweDA2NDQKLSNkZWZpbmUgUlRfT0lEX0RSSVZFUl9ERVZJQ0VfTkFNRSAgICAgICAgICAgICAgICAgICAweDA2NDUKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9EQVRfSFRfUEhZTU9ERSAgICAgICAgICAweDA2NDYKLSNkZWZpbmUgUlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVCAgICAgICAgICAweDA2NDcKLSNkZWZpbmUgT0lEXzgwMl8xMV9TRVRfUFNQWExJTktfTU9ERQkJCQkweDA2NDgKLS8qKysrIGFkZCBieSB3b29keSArKysqLwotI2RlZmluZSBPSURfODAyXzExX1NFVF9QQVNTUEhSQVNFCQkJCTB4MDY0OQotLy8gUmFsaW5rIGRlZmluZWQgT0lEcwotLy8gRGVubmlzIExlZSBtb3ZlIHRvIHBsYXRmb3JtIHNwZWNpZmljCi0KLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9CU1NJRAkJCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9CU1NJRCkKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TU0lECQkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1NTSUQpCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUpCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfQUREX1dFUAkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0FERF9XRVApCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfQUREX0tFWQkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0FERF9LRVkpCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfUkVNT1ZFX1dFUAkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUkVNT1ZFX1dFUCkKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SRU1PVkVfS0VZCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9SRU1PVkVfS0VZKQotI2RlZmluZQlSVF9PSURfODAyXzExX0RJU0FTU09DSUFURQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfRElTQVNTT0NJQVRFKQotI2RlZmluZQlSVF9PSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFKQotI2RlZmluZQlSVF9PSURfODAyXzExX1BSSVZBQ1lfRklMVEVSCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1BSSVZBQ1lfRklMVEVSKQotI2RlZmluZQlSVF9PSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTgkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4pCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfV0VQX1NUQVRVUwkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfV0VQX1NUQVRVUykKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SRUxPQURfREVGQVVMVFMJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUkVMT0FEX0RFRkFVTFRTKQotI2RlZmluZQlSVF9PSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFKQotI2RlZmluZQlSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMKQotI2RlZmluZQlSVF9PSURfODAyXzExX1JTU0lfVFJJR0dFUgkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUlNTSV9UUklHR0VSKQotI2RlZmluZQlSVF9PSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEKQotI2RlZmluZQlSVF9PSURfODAyXzExX1JUU19USFJFU0hPTEQJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JUU19USFJFU0hPTEQpCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfUlhfQU5URU5OQV9TRUxFQ1RFRAkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JYX0FOVEVOTkFfU0VMRUNURUQpCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfVFhfQU5URU5OQV9TRUxFQ1RFRAkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1RYX0FOVEVOTkFfU0VMRUNURUQpCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfU1VQUE9SVEVEX1JBVEVTCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1NVUFBPUlRFRF9SQVRFUykKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTKQotI2RlZmluZQlSVF9PSURfODAyXzExX0NPTkZJR1VSQVRJT04JCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0NPTkZJR1VSQVRJT04pCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfUE9XRVJfTU9ERQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUE9XRVJfTU9ERSkKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9TRVRfUFNQWExJTktfTU9ERQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9TRVRfUFNQWExJTktfTU9ERSkKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9FQVBfTUVUSE9ECQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwgT0lEXzgwMl8xMV9FQVBfTUVUSE9EKQotI2RlZmluZSBSVF9PSURfODAyXzExX1NFVF9QQVNTUEhSQVNFCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfCBPSURfODAyXzExX1NFVF9QQVNTUEhSQVNFKQotCi0KLQotdHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9TVEFUVVNfVFlQRQotewotICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlX0F1dGhlbnRpY2F0aW9uLAotICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlX01lZGlhU3RyZWFtTW9kZSwKLSAgICBOZGlzODAyXzExU3RhdHVzVHlwZV9QTUtJRF9DYW5kaWRhdGVMaXN0LAotICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlTWF4ICAgIC8vIG5vdCBhIHJlYWwgdHlwZSwgZGVmaW5lZCBhcyBhbiB1cHBlciBib3VuZAotfSBORElTXzgwMl8xMV9TVEFUVVNfVFlQRSwgKlBORElTXzgwMl8xMV9TVEFUVVNfVFlQRTsKLQotdHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTWzZdOwotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfU1RBVFVTX0lORElDQVRJT04KLXsKLSAgICBORElTXzgwMl8xMV9TVEFUVVNfVFlQRSBTdGF0dXNUeXBlOwotfSBORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTiwgKlBORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTjsKLQotLy8gbWFzayBmb3IgYXV0aGVudGljYXRpb24vaW50ZWdyaXR5IGZpZWxkcwotI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfQVVUSF9GSUVMRFMgICAgICAgIDB4MGYKLQotI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfUkVBVVRIICAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX0tFWVVQREFURSAgICAgICAgICAweDAyCi0jZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9QQUlSV0lTRV9FUlJPUiAgICAgMHgwNgotI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfR1JPVVBfRVJST1IgICAgICAgIDB4MEUKLQotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QKLXsKLSAgICBVTE9ORyBMZW5ndGg7ICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJzc2lkOwotICAgIFVMT05HIEZsYWdzOwotfSBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNULCAqUE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1Q7Ci0KLS8vQWRkZWQgbmV3IHR5cGVzIGZvciBQTUtJRCBDYW5kaWRhdGUgbGlzdHMuCi10eXBlZGVmIHN0cnVjdCBfUE1LSURfQ0FORElEQVRFIHsKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKLSAgICBVTE9ORyBGbGFnczsKLX0gUE1LSURfQ0FORElEQVRFLCAqUFBNS0lEX0NBTkRJREFURTsKLQotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1BNS0lEX0NBTkRJREFURV9MSVNUCi17Ci0gICAgVUxPTkcgVmVyc2lvbjsgICAgICAgLy8gVmVyc2lvbiBvZiB0aGUgc3RydWN0dXJlCi0gICAgVUxPTkcgTnVtQ2FuZGlkYXRlczsgLy8gTm8uIG9mIHBta2lkIGNhbmRpZGF0ZXMKLSAgICBQTUtJRF9DQU5ESURBVEUgQ2FuZGlkYXRlTGlzdFsxXTsKLX0gTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX0xJU1QsICpQTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX0xJU1Q7Ci0KLS8vRmxhZ3MgZm9yIFBNS0lEIENhbmRpZGF0ZSBsaXN0IHN0cnVjdHVyZQotI2RlZmluZSBORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfUFJFQVVUSF9FTkFCTEVECTB4MDEKLQotLy8gQWRkZWQgbmV3IHR5cGVzIGZvciBPRkRNIDVHIGFuZCAyLjRHCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX05FVFdPUktfVFlQRQotewotICAgTmRpczgwMl8xMUZILAotICAgTmRpczgwMl8xMURTLAotICAgIE5kaXM4MDJfMTFPRkRNNSwKLSAgICBOZGlzODAyXzExT0ZETTI0LAotCU5kaXM4MDJfMTFBdXRvbW9kZSwKLSAgICBOZGlzODAyXzExT0ZETTVfTiwKLSAgICBOZGlzODAyXzExT0ZETTI0X04sCi0gICAgTmRpczgwMl8xMU5ldHdvcmtUeXBlTWF4ICAgIC8vIG5vdCBhIHJlYWwgdHlwZSwgZGVmaW5lZCBhcyBhbiB1cHBlciBib3VuZAotfSBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUsICpQTkRJU184MDJfMTFfTkVUV09SS19UWVBFOwotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1QKLXsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJPZkl0ZW1zOyAgLy8gaW4gbGlzdCBiZWxvdywgYXQgbGVhc3QgMQotICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgIE5ldHdvcmtUeXBlIFsxXTsKLX0gTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1QsICpQTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1Q7Ci0KLXR5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfUE9XRVJfTU9ERQotewotICAgIE5kaXM4MDJfMTFQb3dlck1vZGVDQU0sCi0gICAgTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1AsCi0gICAgTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQLAotICAgIE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQLAotICAgIE5kaXM4MDJfMTFQb3dlck1vZGVNYXggICAgICAvLyBub3QgYSByZWFsIG1vZGUsIGRlZmluZWQgYXMgYW4gdXBwZXIgYm91bmQKLX0gTkRJU184MDJfMTFfUE9XRVJfTU9ERSwgKlBORElTXzgwMl8xMV9QT1dFUl9NT0RFOwotCi10eXBlZGVmIFVMT05HICAgTkRJU184MDJfMTFfVFhfUE9XRVJfTEVWRUw7IC8vIGluIG1pbGxpd2F0dHMKLQotLy8KLS8vIFJlY2VpdmVkIFNpZ25hbCBTdHJlbmd0aCBJbmRpY2F0aW9uCi0vLwotdHlwZWRlZiBMT05HICAgIE5ESVNfODAyXzExX1JTU0k7ICAgICAgICAgICAvLyBpbiBkQm0KLQotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkgKLXsKLSAgIFVMT05HICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQotICAgVUxPTkcgICAgICAgICAgIEhvcFBhdHRlcm47ICAgICAgICAvLyBBcyBkZWZpbmVkIGJ5IDgwMi4xMSwgTVNCIHNldAotICAgVUxPTkcgICAgICAgICAgIEhvcFNldDsgICAgICAgICAgICAvLyB0byBvbmUgaWYgbm9uLTgwMi4xMQotICAgVUxPTkcgICAgICAgICAgIER3ZWxsVGltZTsgICAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKLX0gTkRJU184MDJfMTFfQ09ORklHVVJBVElPTl9GSCwgKlBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OX0ZIOwotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQ09ORklHVVJBVElPTgotewotICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKLSAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhY29uUGVyaW9kOyAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKLSAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRJTVdpbmRvdzsgICAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKLSAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNDb25maWc7ICAgICAgICAgICAvLyBGcmVxdWVuY3ksIHVuaXRzIGFyZSBrSHoKLSAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkggICAgRkhDb25maWc7Ci19IE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04sICpQTkRJU184MDJfMTFfQ09ORklHVVJBVElPTjsKLQotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1NUQVRJU1RJQ1MKLXsKLSAgIFVMT05HICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKLSAgIExBUkdFX0lOVEVHRVIgICBUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIEZhaWxlZENvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIFJldHJ5Q291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgTXVsdGlwbGVSZXRyeUNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIFJUU1N1Y2Nlc3NDb3VudDsKLSAgIExBUkdFX0lOVEVHRVIgICBSVFNGYWlsdXJlQ291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgQUNLRmFpbHVyZUNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIEZyYW1lRHVwbGljYXRlQ291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgUmVjZWl2ZWRGcmFnbWVudENvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudDsKLSAgIExBUkdFX0lOVEVHRVIgICBGQ1NFcnJvckNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIFRLSVBMb2NhbE1JQ0ZhaWx1cmVzOwotICAgTEFSR0VfSU5URUdFUiAgIFRLSVBSZW1vdGVNSUNFcnJvcnM7Ci0gICBMQVJHRV9JTlRFR0VSICAgVEtJUElDVkVycm9yczsKLSAgIExBUkdFX0lOVEVHRVIgICBUS0lQQ291bnRlck1lYXN1cmVzSW52b2tlZDsKLSAgIExBUkdFX0lOVEVHRVIgICBUS0lQUmVwbGF5czsKLSAgIExBUkdFX0lOVEVHRVIgICBDQ01QRm9ybWF0RXJyb3JzOwotICAgTEFSR0VfSU5URUdFUiAgIENDTVBSZXBsYXlzOwotICAgTEFSR0VfSU5URUdFUiAgIENDTVBEZWNyeXB0RXJyb3JzOwotICAgTEFSR0VfSU5URUdFUiAgIEZvdXJXYXlIYW5kc2hha2VGYWlsdXJlczsKLX0gTkRJU184MDJfMTFfU1RBVElTVElDUywgKlBORElTXzgwMl8xMV9TVEFUSVNUSUNTOwotCi10eXBlZGVmICBVTE9ORyAgTkRJU184MDJfMTFfS0VZX0lOREVYOwotdHlwZWRlZiBVTE9OR0xPTkcgICBORElTXzgwMl8xMV9LRVlfUlNDOwotCi0jZGVmaW5lIE1BWF9SQURJVVNfU1JWX05VTQkJCTIJICAvLyA4MDIuMXggZmFpbG92ZXIgbnVtYmVyCi0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUkFESVVTX1NSVl9JTkZPIHsKLQlVSU5UMzIJCQlyYWRpdXNfaXA7Ci0JVUlOVDMyCQkJcmFkaXVzX3BvcnQ7Ci0JVUNIQVIJCQlyYWRpdXNfa2V5WzY0XTsKLQlVQ0hBUgkJCXJhZGl1c19rZXlfbGVuOwotfSBSQURJVVNfU1JWX0lORk8sICpQUkFESVVTX1NSVl9JTkZPOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JBRElVU19LRVlfSU5GTwotewotCVVDSEFSCQkJcmFkaXVzX3Nydl9udW07Ci0JUkFESVVTX1NSVl9JTkZPCXJhZGl1c19zcnZfaW5mb1tNQVhfUkFESVVTX1NSVl9OVU1dOwotCVVDSEFSCQkJaWVlZTgwMjF4V0VQOwkJIC8vIGR5bmFtaWMgV0VQCi0gICAgVUNIQVIgICAgICAgICAgIGtleV9pbmRleDsKLSAgICBVQ0hBUiAgICAgICAgICAga2V5X2xlbmd0aDsgICAgICAgICAgLy8gbGVuZ3RoIG9mIGtleSBpbiBieXRlcwotICAgIFVDSEFSICAgICAgICAgICBrZXlfbWF0ZXJpYWxbMTNdOwotfSBSQURJVVNfS0VZX0lORk8sICpQUkFESVVTX0tFWV9JTkZPOwotCi0vLyBJdCdzIHVzZWQgYnkgODAyLjF4IGRhZW1vbiB0byByZXF1aXJlIHJlbGF0aXZlIGNvbmZpZ3VyYXRpb24KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUkFESVVTX0NPTkYKLXsKLSAgICBVSU5UMzIgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKLSAgICBVQ0hBUgkJCW1ic3NfbnVtOwkJCS8vIGluZGljYXRlIG11bHRpcGxlIEJTUyBudW1iZXIKLQlVSU5UMzIJCQlvd25faXBfYWRkcjsKLQlVSU5UMzIJCQlyZXRyeV9pbnRlcnZhbDsKLQlVSU5UMzIJCQlzZXNzaW9uX3RpbWVvdXRfaW50ZXJ2YWw7Ci0JVUNIQVIJCQlFQVBpZm5hbWVbOF1bSUZOQU1TSVpdOwotCVVDSEFSCQkJRUFQaWZuYW1lX2xlbls4XTsKLQlVQ0hBUgkJCVByZUF1dGhpZm5hbWVbOF1bSUZOQU1TSVpdOwotCVVDSEFSCQkJUHJlQXV0aGlmbmFtZV9sZW5bOF07Ci0JUkFESVVTX0tFWV9JTkZPCVJhZGl1c0luZm9bOF07Ci19IFJBRElVU19DT05GLCAqUFJBRElVU19DT05GOwotCi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotLy8gS2V5IG1hcHBpbmcga2V5cyByZXF1aXJlIGEgQlNTSUQKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9LRVkKLXsKLSAgICBVSU5UICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQotICAgIFVJTlQgICAgICAgICAgIEtleUluZGV4OwotICAgIFVJTlQgICAgICAgICAgIEtleUxlbmd0aDsgICAgICAgICAgLy8gbGVuZ3RoIG9mIGtleSBpbiBieXRlcwotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOwotICAgIE5ESVNfODAyXzExX0tFWV9SU0MgS2V5UlNDOwotICAgIFVDSEFSICAgICAgICAgICBLZXlNYXRlcmlhbFsxXTsgICAgIC8vIHZhcmlhYmxlIGxlbmd0aCBkZXBlbmRpbmcgb24gYWJvdmUgZmllbGQKLX0gTkRJU184MDJfMTFfS0VZLCAqUE5ESVNfODAyXzExX0tFWTsKLQotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1BBU1NQSFJBU0UKLXsKLSAgICBVSU5UICAgICAgICAgICBLZXlMZW5ndGg7ICAgICAgICAgIC8vIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKLSAgICBVQ0hBUiAgICAgICAgICAgS2V5TWF0ZXJpYWxbMV07ICAgICAvLyB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkCi19IE5ESVNfODAyXzExX1BBU1NQSFJBU0UsICpQTkRJU184MDJfMTFfUEFTU1BIUkFTRTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1JFTU9WRV9LRVkKLXsKLSAgICBVSU5UICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQotICAgIFVJTlQgICAgICAgICAgIEtleUluZGV4OwotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOwotfSBORElTXzgwMl8xMV9SRU1PVkVfS0VZLCAqUE5ESVNfODAyXzExX1JFTU9WRV9LRVk7Ci0KLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9XRVAKLXsKLSAgIFVJTlQgICAgIExlbmd0aDsgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQotICAgVUlOVCAgICAgS2V5SW5kZXg7ICAgICAgICAgICAvLyAwIGlzIHRoZSBwZXItY2xpZW50IGtleSwgMS1OIGFyZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnbG9iYWwga2V5cwotICAgVUlOVCAgICAgS2V5TGVuZ3RoOyAgICAgLy8gbGVuZ3RoIG9mIGtleSBpbiBieXRlcwotICAgVUNIQVIgICAgIEtleU1hdGVyaWFsWzFdOy8vIHZhcmlhYmxlIGxlbmd0aCBkZXBlbmRpbmcgb24gYWJvdmUgZmllbGQKLX0gTkRJU184MDJfMTFfV0VQLCAqUE5ESVNfODAyXzExX1dFUDsKLQotCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUKLXsKLSAgIE5kaXM4MDJfMTFJQlNTLAotICAgTmRpczgwMl8xMUluZnJhc3RydWN0dXJlLAotICAgTmRpczgwMl8xMUF1dG9Vbmtub3duLAotICAgTmRpczgwMl8xMU1vbml0b3IsCi0gICBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmVNYXggICAgIC8vIE5vdCBhIHJlYWwgdmFsdWUsIGRlZmluZWQgYXMgdXBwZXIgYm91bmQKLX0gTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSwgKlBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFOwotCi0vLyBBZGQgbmV3IGF1dGhlbnRpY2F0aW9uIG1vZGVzCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUKLXsKLSAgIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4sCi0gICBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQsCi0gICBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLAotICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQSwKLSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0ssCi0gICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSwKLSAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIsCi0gICBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLLAotCU5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyLAotCU5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLLAotICAgTmRpczgwMl8xMUF1dGhNb2RlTWF4ICAgICAgICAgICAvLyBOb3QgYSByZWFsIG1vZGUsIGRlZmluZWQgYXMgdXBwZXIgYm91bmQKLX0gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOwotCi10eXBlZGVmIFVDSEFSICAgTkRJU184MDJfMTFfUkFURVNbTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTXTsgICAgICAgIC8vIFNldCBvZiA4IGRhdGEgcmF0ZXMKLXR5cGVkZWYgVUNIQVIgICBORElTXzgwMl8xMV9SQVRFU19FWFtORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVhdOyAgLy8gU2V0IG9mIDE2IGRhdGEgcmF0ZXMKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9TU0lECi17Ci0gICAgVUlOVCAgIFNzaWRMZW5ndGg7ICAgICAgICAgLy8gbGVuZ3RoIG9mIFNTSUQgZmllbGQgYmVsb3csIGluIGJ5dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNhbiBiZSB6ZXJvLgotICAgIFVDSEFSICAgU3NpZFtORElTXzgwMl8xMV9MRU5HVEhfU1NJRF07ICAgICAgICAgICAvLyBTU0lEIGluZm9ybWF0aW9uIGZpZWxkCi19IE5ESVNfODAyXzExX1NTSUQsICpQTkRJU184MDJfMTFfU1NJRDsKLQotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfV0xBTl9CU1NJRAotewotICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoOyAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCi0gICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgICAgICAgICAgICBNYWNBZGRyZXNzOyAvLyBCU1NJRAotICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWRbMl07Ci0gICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOyAgICAgICAvLyBTU0lECi0gICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcml2YWN5OyAgICAvLyBXRVAgZW5jcnlwdGlvbiByZXF1aXJlbWVudAotICAgTkRJU184MDJfMTFfUlNTSSAgICAgICAgICAgICAgICAgICAgUnNzaTsgICAgICAgLy8gcmVjZWl2ZSBzaWduYWwgc3RyZW5ndGggaW4gZEJtCi0gICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgICAgICAgICBOZXR3b3JrVHlwZUluVXNlOwotICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgQ29uZmlndXJhdGlvbjsKLSAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEluZnJhc3RydWN0dXJlTW9kZTsKLSAgIE5ESVNfODAyXzExX1JBVEVTICAgICAgICAgICAgICAgICAgIFN1cHBvcnRlZFJhdGVzOwotfSBORElTX1dMQU5fQlNTSUQsICpQTkRJU19XTEFOX0JTU0lEOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfODAyXzExX0JTU0lEX0xJU1QKLXsKLSAgIFVJTlQgICAgICAgICAgIE51bWJlck9mSXRlbXM7ICAgICAgLy8gaW4gbGlzdCBiZWxvdywgYXQgbGVhc3QgMQotICAgTkRJU19XTEFOX0JTU0lEIEJzc2lkWzFdOwotfSBORElTXzgwMl8xMV9CU1NJRF9MSVNULCAqUE5ESVNfODAyXzExX0JTU0lEX0xJU1Q7Ci0KLS8vIEFkZGVkIENhcGFiaWxpdGllcywgSUVMZW5ndGggYW5kIElFcyBmb3IgZWFjaCBCU1NJRAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTX1dMQU5fQlNTSURfRVgKLXsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICAgICAgICAgICAgIE1hY0FkZHJlc3M7ICAgICAgICAgLy8gQlNTSUQKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZFsyXTsKLSAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOyAgICAgICAgICAgICAgIC8vIFNTSUQKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcml2YWN5OyAgICAgICAgICAgIC8vIFdFUCBlbmNyeXB0aW9uIHJlcXVpcmVtZW50Ci0gICAgTkRJU184MDJfMTFfUlNTSSAgICAgICAgICAgICAgICAgICAgUnNzaTsgICAgICAgICAgICAgICAvLyByZWNlaXZlIHNpZ25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyZW5ndGggaW4gZEJtCi0gICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgICAgICAgICAgTmV0d29ya1R5cGVJblVzZTsKLSAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICBDb25maWd1cmF0aW9uOwotICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEluZnJhc3RydWN0dXJlTW9kZTsKLSAgICBORElTXzgwMl8xMV9SQVRFU19FWCAgICAgICAgICAgICAgICBTdXBwb3J0ZWRSYXRlczsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUxlbmd0aDsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRXNbMV07Ci19IE5ESVNfV0xBTl9CU1NJRF9FWCwgKlBORElTX1dMQU5fQlNTSURfRVg7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfQlNTSURfTElTVF9FWAotewotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZJdGVtczsgICAgICAvLyBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxCi0gICAgTkRJU19XTEFOX0JTU0lEX0VYICAgICAgQnNzaWRbMV07Ci19IE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgsICpQTkRJU184MDJfMTFfQlNTSURfTElTVF9FWDsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9GSVhFRF9JRXMKLXsKLSAgICBVQ0hBUiBUaW1lc3RhbXBbOF07Ci0gICAgVVNIT1JUIEJlYWNvbkludGVydmFsOwotICAgIFVTSE9SVCBDYXBhYmlsaXRpZXM7Ci19IE5ESVNfODAyXzExX0ZJWEVEX0lFcywgKlBORElTXzgwMl8xMV9GSVhFRF9JRXM7Ci0KLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMKLXsKLSAgICBVQ0hBUiBFbGVtZW50SUQ7Ci0gICAgVUNIQVIgTGVuZ3RoOyAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gZGF0YSBmaWVsZAotICAgIFVDSEFSIGRhdGFbMV07Ci19IE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcywgKlBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXM7Ci0KLXR5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ7Ci0KLXR5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRDsKLQotdHlwZWRlZiAgVUxPTkcgICBORElTXzgwMl8xMV9BTlRFTk5BOwotCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSCi17Ci0gICBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbCwKLSAgIE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVAKLX0gTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIsICpQTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVI7Ci0KLS8vIEFkZGVkIG5ldyBlbmNyeXB0aW9uIHR5cGVzCi0vLyBBbHNvIGFsaWFzZWQgdHlwZWRlZiB0byBuZXcgbmFtZQotdHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9XRVBfU1RBVFVTCi17Ci0gICBOZGlzODAyXzExV0VQRW5hYmxlZCwKLSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkID0gTmRpczgwMl8xMVdFUEVuYWJsZWQsCi0gICBOZGlzODAyXzExV0VQRGlzYWJsZWQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCwKLSAgIE5kaXM4MDJfMTFXRVBLZXlBYnNlbnQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb24xS2V5QWJzZW50ID0gTmRpczgwMl8xMVdFUEtleUFic2VudCwKLSAgIE5kaXM4MDJfMTFXRVBOb3RTdXBwb3J0ZWQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb25Ob3RTdXBwb3J0ZWQgPSBOZGlzODAyXzExV0VQTm90U3VwcG9ydGVkLAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb24yS2V5QWJzZW50LAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb24zS2V5QWJzZW50LAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQsCS8vIFRLSVAgb3IgQUVTIG1peAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEtleUFic2VudCwKLSAgICBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQsCi0JTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCwKLX0gTkRJU184MDJfMTFfV0VQX1NUQVRVUywgKlBORElTXzgwMl8xMV9XRVBfU1RBVFVTLAotICBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUywgKlBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUzsKLQotdHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9SRUxPQURfREVGQVVMVFMKLXsKLSAgIE5kaXM4MDJfMTFSZWxvYWRXRVBLZXlzCi19IE5ESVNfODAyXzExX1JFTE9BRF9ERUZBVUxUUywgKlBORElTXzgwMl8xMV9SRUxPQURfREVGQVVMVFM7Ci0KLSNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVRRklfQ0FQQUJJTElUSUVTICAgICAgMQotI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVFGSV9MSVNURU5JTlRFUlZBTCAgICAyCi0jZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFUUZJX0NVUlJFTlRBUEFERFJFU1MgIDQKLQotI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVNGSV9DQVBBQklMSVRJRVMgICAgICAxCi0jZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFU0ZJX1NUQVRVU0NPREUgICAgICAgIDIKLSNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVTRklfQVNTT0NJQVRJT05JRCAgICAgNAotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQUlfUkVRRkkKLXsKLSAgICBVU0hPUlQgQ2FwYWJpbGl0aWVzOwotICAgIFVTSE9SVCBMaXN0ZW5JbnRlcnZhbDsKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgQ3VycmVudEFQQWRkcmVzczsKLX0gTkRJU184MDJfMTFfQUlfUkVRRkksICpQTkRJU184MDJfMTFfQUlfUkVRRkk7Ci0KLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BSV9SRVNGSQotewotICAgIFVTSE9SVCBDYXBhYmlsaXRpZXM7Ci0gICAgVVNIT1JUIFN0YXR1c0NvZGU7Ci0gICAgVVNIT1JUIEFzc29jaWF0aW9uSWQ7Ci19IE5ESVNfODAyXzExX0FJX1JFU0ZJLCAqUE5ESVNfODAyXzExX0FJX1JFU0ZJOwotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04KLXsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBMZW5ndGg7Ci0gICAgVVNIT1JUICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlUmVxdWVzdEZpeGVkSUVzOwotICAgIE5ESVNfODAyXzExX0FJX1JFUUZJICAgIFJlcXVlc3RGaXhlZElFczsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUVMZW5ndGg7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgT2Zmc2V0UmVxdWVzdElFczsKLSAgICBVU0hPUlQgICAgICAgICAgICAgICAgICBBdmFpbGFibGVSZXNwb25zZUZpeGVkSUVzOwotICAgIE5ESVNfODAyXzExX0FJX1JFU0ZJICAgIFJlc3BvbnNlRml4ZWRJRXM7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgUmVzcG9uc2VJRUxlbmd0aDsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBPZmZzZXRSZXNwb25zZUlFczsKLX0gTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04sICpQTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT047Ci0KLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVAotewotICAgIE5ESVNfODAyXzExX1NUQVRVU19JTkRJQ0FUSU9OICAgICAgIFN0YXR1czsKLSAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNUICBSZXF1ZXN0WzFdOwotfSBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVCwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVDsKLQotLyoKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9URVNUCi17Ci0gICAgVUxPTkcgTGVuZ3RoOwotICAgIFVMT05HIFR5cGU7Ci0gICAgdW5pb24KLSAgICB7Ci0gICAgICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VWRU5UIEF1dGhlbnRpY2F0aW9uRXZlbnQ7Ci0gICAgICAgIE5ESVNfODAyXzExX1JTU0kgUnNzaVRyaWdnZXI7Ci0gICAgfTsKLX0gTkRJU184MDJfMTFfVEVTVCwgKlBORElTXzgwMl8xMV9URVNUOwotICovCi0KLS8vIDgwMi4xMSBNZWRpYSBzdHJlYW0gY29uc3RyYWludHMsIGFzc29jaWF0ZWQgd2l0aCBPSURfODAyXzExX01FRElBX1NUUkVBTV9NT0RFCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX01FRElBX1NUUkVBTV9NT0RFCi17Ci0gICAgTmRpczgwMl8xMU1lZGlhU3RyZWFtT2ZmLAotICAgIE5kaXM4MDJfMTFNZWRpYVN0cmVhbU9uLAotfSBORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERSwgKlBORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERTsKLQotLy8gUE1LSUQgU3RydWN0dXJlcwotdHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX1BNS0lEX1ZBTFVFWzE2XTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotdHlwZWRlZiBzdHJ1Y3QgX0JTU0lEX0lORk8KLXsKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKLSAgICBORElTXzgwMl8xMV9QTUtJRF9WQUxVRSBQTUtJRDsKLX0gQlNTSURfSU5GTywgKlBCU1NJRF9JTkZPOwotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfUE1LSUQKLXsKLSAgICBVSU5UICAgIExlbmd0aDsKLSAgICBVSU5UICAgIEJTU0lESW5mb0NvdW50OwotICAgIEJTU0lEX0lORk8gQlNTSURJbmZvWzFdOwotfSBORElTXzgwMl8xMV9QTUtJRCwgKlBORElTXzgwMl8xMV9QTUtJRDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTgotewotICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgQXV0aE1vZGVTdXBwb3J0ZWQ7Ci0gICAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgRW5jcnlwdFN0YXR1c1N1cHBvcnRlZDsKLX0gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTiwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FTkNSWVBUSU9OOwotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQ0FQQUJJTElUWQotewotICAgICBVTE9ORyBMZW5ndGg7Ci0gICAgIFVMT05HIFZlcnNpb247Ci0gICAgIFVMT05HIE5vT2ZQTUtJRHM7Ci0gICAgIFVMT05HIE5vT2ZBdXRoRW5jcnlwdFBhaXJzU3VwcG9ydGVkOwotICAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FTkNSWVBUSU9OIEF1dGhlbnRpY2F0aW9uRW5jcnlwdGlvblN1cHBvcnRlZFsxXTsKLX0gTkRJU184MDJfMTFfQ0FQQUJJTElUWSwgKlBORElTXzgwMl8xMV9DQVBBQklMSVRZOwotCi0jaWZkZWYgTElOVVgKLSNpZiBXSVJFTEVTU19FWFQgPD0gMTEKLSNpZm5kZWYgU0lPQ0RFVlBSSVZBVEUKLSNkZWZpbmUgU0lPQ0RFVlBSSVZBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRTAKLSNlbmRpZgotI2RlZmluZSBTSU9DSVdGSVJTVFBSSVYJCQkJCQkJCVNJT0NERVZQUklWQVRFCi0jZW5kaWYKLSNlbmRpZiAvLyBMSU5VWCAvLwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNkZWZpbmUgUlRfUFJJVl9JT0NUTAkJCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgwMSkgLy8gU3luYy4gd2l0aCBBUCBmb3Igd3NjIHVwbnAgZGFlbW9uCi0jZGVmaW5lIFJUUFJJVl9JT0NUTF9TRVQJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MDIpCi0KLSNpZmRlZiBEQkcKLSNkZWZpbmUgUlRQUklWX0lPQ1RMX0JCUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwMykKLSNkZWZpbmUgUlRQUklWX0lPQ1RMX01BQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwNSkKLQotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotLy8gVE9ETzogc2hpYW5nLCBOZWVkIHRvIHJlYXNzaWduIHRoZSBvaWQgbnVtYmVyLiBBcmNoVGVhbSB1c2UgKFNJT0NJV0ZJUlNUUFJJViArIDB4MTkpIGZvciB0aGlzIG9pZAotI2RlZmluZSBSVFBSSVZfSU9DVExfUkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTSU9DSVdGSVJTVFBSSVYgKyAweDEzKSAgLy8gZWRpdCBieSBqb2hubGksIGZpeCByZWFkIHJmIHJlZ2lzdGVyIHByb2JsZW0KLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQotI2RlZmluZSBSVFBSSVZfSU9DVExfRTJQICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTSU9DSVdGSVJTVFBSSVYgKyAweDA3KQotI2VuZGlmIC8vIERCRyAvLwotCi0jaWZkZWYgUkFMSU5LX0FURQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0jZGVmaW5lIFJUUFJJVl9JT0NUTF9BVEUJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MDgpCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLSNkZWZpbmUgUlRQUklWX0lPQ1RMX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwOSkKLSNkZWZpbmUgUlRQUklWX0lPQ1RMX0FERF9QTUtJRF9DQUNIRSAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwQSkKLSNkZWZpbmUgUlRQUklWX0lPQ1RMX1JBRElVU19EQVRBICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwQykKLSNkZWZpbmUgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgwRCkKLSNkZWZpbmUgUlRfUFJJVl9JT0NUTF9FWFQJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEUpIC8vIFN5bmMuIHdpdGggUlQ2MSAoZm9yIHdwYV9zdXBwbGljYW50KQotI2RlZmluZSBSVFBSSVZfSU9DVExfR0VUX01BQ19UQUJMRQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEYpCi0KLSNkZWZpbmUgUlRQUklWX0lPQ1RMX1NIT1cJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MTEpCi1lbnVtIHsKLQlTSE9XX0NPTk5fU1RBVFVTID0gNCwKLQlTSE9XX0RSVklFUl9WRVJJT04gPSA1LAotCVNIT1dfQkFfSU5GTyA9IDYsCi0JU0hPV19ERVNDX0lORk8gPSA3LAotCVJBSU9fT0ZGID0gMTAsCi0JUkFJT19PTiA9IDExLAotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCVNIT1dfRExTX0VOVFJZX0lORk8gPSAxOSwKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQlTSE9XX0NGR19WQUxVRSA9IDIwLAotCVNIT1dfQURIT0NfRU5UUllfSU5GTyA9IDIxLAotfTsKLQotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCi0jaWZkZWYgU05NUF9TVVBQT1JUCi0vL1NOTVAgaWVlZSA4MDJkb3QxMSwga2F0aHkgLCAyMDA4XzAyMjAKLS8vIGRvdDExcmVzKDMpCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJCQkJMHgwNzAwCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVSTkFNRQkJCTB4MDcwMQotI2RlZmluZSBSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRQkJMHgwNzAyCi0KLS8vIGRvdDExc210KDEpCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfUFJJVkFDWU9QVElPTklNUExFTUVOVEVECTB4MDcwMwotI2RlZmluZSBSVF9PSURfODAyXzExX1BPV0VSTUFOQUdFTUVOVE1PREUJCTB4MDcwNAotI2RlZmluZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRQkJCTB4MDcwNSAvLyByZWFkICwgd3JpdGUKLSNkZWZpbmUgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQJCQkJMHgwNzA2Ci0jZGVmaW5lIFJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSAkJMHgwNzA3Ci0jZGVmaW5lIE9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUCQkJCTB4MDcwOAotI2RlZmluZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUCQkJCTB4MDcwOQotI2RlZmluZSBSVF9PSURfODAyXzExX1BST0RVQ1RJRAkJCQkJMHgwNzEwCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVJRAkJCQkweDA3MTEKLQotLy8gLy9kb3QxMVBoeSg0KQotI2RlZmluZSBPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMCQkJCTB4MDcxMgotCi0vL2RvdDExbWFjCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfTUFDX0FERFJFU1MJCQkJMHgwNzEzCi0jZW5kaWYgLy8gU05NUF9TVVBQT1JUIC8vCi0KLSNkZWZpbmUgT0lEXzgwMl8xMV9CVUlMRF9DSEFOTkVMX0VYCQkJCTB4MDcxNAotI2RlZmluZSBPSURfODAyXzExX0dFVF9DSF9MSVNUCQkJCQkweDA3MTUKLSNkZWZpbmUgT0lEXzgwMl8xMV9HRVRfQ09VTlRSWV9DT0RFCQkJCTB4MDcxNgotI2RlZmluZSBPSURfODAyXzExX0dFVF9DSEFOTkVMX0dFT0dSQVBIWQkJMHgwNzE3Ci0KLS8vI2RlZmluZSBSVF9PSURfODAyXzExX1NUQVRJU1RJQ1MgICAgICAgICAgICAgIChPSURfR0VUX1NFVF9UT0dHTEUgfCBPSURfODAyXzExX1NUQVRJU1RJQ1MpCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNkZWZpbmUgUlRfT0lEX1dTQ19TRVRfUEFTU1BIUkFTRSAgICAgICAgICAgICAgICAgICAweDA3NDAgLy8gcGFzc3BocmFzZSBmb3Igd3BhKDIpLXBzawotI2RlZmluZSBSVF9PSURfV1NDX0RSSVZFUl9BVVRPX0NPTk5FQ1QgICAgICAgICAgICAgIDB4MDc0MQotI2RlZmluZSBSVF9PSURfV1NDX1FVRVJZX0RFRkFVTFRfUFJPRklMRSAgICAgICAgICAgIDB4MDc0MgotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9DT05OX0JZX1BST0ZJTEVfSU5ERVggICAgICAgIDB4MDc0MwotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9BQ1RJT04gICAgICAgICAgICAgICAgICAgICAgIDB4MDc0NAotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9TU0lEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDc0NQotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9QSU5fQ09ERSAgICAgICAgICAgICAgICAgICAgIDB4MDc0NgotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDc0NyAvLyBQSU4gb3IgUEJDCi0jZGVmaW5lIFJUX09JRF9XU0NfU0VUX0NPTkZfTU9ERSAgICAgICAgICAgICAgICAgICAgMHgwNzQ4IC8vIEVucm9sbGVlIG9yIFJlZ2lzdHJhcgotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9QUk9GSUxFICAgICAgICAgICAgICAgICAgICAgIDB4MDc0OQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2RlZmluZQlSVF9PSURfV1NDX0NPTkZJR19TVEFUVVMJCQkJCTB4MDc0RgotI2RlZmluZSBSVF9PSURfODAyXzExX1dTQ19RVUVSWV9QUk9GSUxFCQkJCTB4MDc1MAotLy8gZm9yIGNvbnNpc3RlbmN5IHdpdGggUlQ2MQotI2RlZmluZSBSVF9PSURfV1NDX1FVRVJZX1NUQVRVUwkJCQkJCTB4MDc1MQotI2RlZmluZSBSVF9PSURfV1NDX1BJTl9DT0RFCQkJCQkJCTB4MDc1MgotI2RlZmluZSBSVF9PSURfV1NDX1VVSUQJCQkJCQkJCTB4MDc1MwotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9TRUxFQ1RFRF9SRUdJU1RSQVIJCQkweDA3NTQKLSNkZWZpbmUgUlRfT0lEX1dTQ19FQVBNU0cJCQkJCQkJMHgwNzU1Ci0jZGVmaW5lIFJUX09JRF9XU0NfTUFOVUZBQ1RVUkVSCQkJCQkJMHgwNzU2Ci0jZGVmaW5lIFJUX09JRF9XU0NfTU9ERUxfTkFNRQkJCQkJCTB4MDc1NwotI2RlZmluZSBSVF9PSURfV1NDX01PREVMX05PCQkJCQkJCTB4MDc1OAotI2RlZmluZSBSVF9PSURfV1NDX1NFUklBTF9OTwkJCQkJCTB4MDc1OQotI2RlZmluZSBSVF9PSURfV1NDX01BQ19BRERSRVNTCQkJCQkJMHgwNzYwCi0KLSNpZmRlZiBMTFREX1NVUFBPUlQKLS8vIGZvciBjb25zaXN0ZW5jeSB3aXRoIFJUNjEKLSNkZWZpbmUgUlRfT0lEX0dFVF9QSFlfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAweDc2MQotI2VuZGlmIC8vIExMVERfU1VQUE9SVCAvLwotCi0jaWZkZWYgTklOVEVORE9fQVAKLS8vI2RlZmluZSBSVF9PSURfTklOVEVORE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQwMTA3NzAKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9OSU5URU5ET19HRVRfVEFCTEUJCQkweDA3NzEgLy8oKFJUX09JRF9OSU5URU5ETyArIDB4MDEpICYgMHhmZmZmKQotI2RlZmluZSBSVF9PSURfODAyXzExX05JTlRFTkRPX1NFVF9UQUJMRQkJCTB4MDc3MiAvLygoUlRfT0lEX05JTlRFTkRPICsgMHgwMikgJiAweGZmZmYpCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfTklOVEVORE9fQ0FQQUJMRQkJCQkweDA3NzMgLy8oKFJUX09JRF9OSU5URU5ETyArIDB4MDMpICYgMHhmZmZmKQotI2VuZGlmIC8vIE5JTlRFTkRPX0FQIC8vCi0KLQotLy8gTmV3IGZvciBNZWV0aW5nSG91c2UgQXBpIHN1cHBvcnQKLSNkZWZpbmUgT0lEX01IXzgwMl8xWF9TVVBQT1JURUQgICAgICAgICAgICAgICAweEZGRURDMTAwCi0KLS8vIE1JTU8gVHggcGFyYW1ldGVyLCBTaG9ydEdJLCBNQ1MsIFNUQkMsIGV0Yy4gIHRoZXNlIGFyZSBmaWVsZHMgaW4gVFhXSS4gRG9uJ3QgY2hhbmdlIHRoaXMgZGVmaW5pdGlvbiEhIQotdHlwZWRlZiB1bmlvbiAgX0hUVFJBTlNNSVRfU0VUVElORyB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCXN0cnVjdAl7Ci0JVVNIT1JUCQlNT0RFOjI7CS8vIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LgotLy8JVVNIT1JUCQlyc3Y6MzsKLQlVU0hPUlQJCVR4QkY6MTsKLQlVU0hPUlQJCXJzdjoyOwotCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCi0JVVNIT1JUCQlTaG9ydEdJOjE7Ci0JVVNIT1JUCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegotCVVTSE9SVAkJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKLQl9CWZpZWxkOwotI2Vsc2UKLQlzdHJ1Y3QJewotCVVTSE9SVAkJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKLQlVU0hPUlQJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6Ci0JVVNIT1JUCQlTaG9ydEdJOjE7Ci0JVVNIT1JUCQlTVEJDOjI7CS8vU1BBQ0UKLS8vCVVTSE9SVAkJcnN2OjM7Ci0JVVNIT1JUCQlyc3Y6MjsKLQlVU0hPUlQJCVR4QkY6MTsKLQlVU0hPUlQJCU1PREU6MjsJLy8gVXNlIGRlZmluaXRpb24gTU9ERV94eHguCi0JfQlmaWVsZDsKLSNlbmRpZgotCVVTSE9SVAkJd29yZDsKLSB9IEhUVFJBTlNNSVRfU0VUVElORywgKlBIVFRSQU5TTUlUX1NFVFRJTkc7Ci0KLXR5cGVkZWYgZW51bSBfUlRfODAyXzExX1BSRUFNQkxFIHsKLSAgICBSdDgwMl8xMVByZWFtYmxlTG9uZywKLSAgICBSdDgwMl8xMVByZWFtYmxlU2hvcnQsCi0gICAgUnQ4MDJfMTFQcmVhbWJsZUF1dG8KLX0gUlRfODAyXzExX1BSRUFNQkxFLCAqUFJUXzgwMl8xMV9QUkVBTUJMRTsKLQotdHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfUEhZX01PREUgewotCVBIWV8xMUJHX01JWEVEID0gMCwKLQlQSFlfMTFCLAotCVBIWV8xMUEsCi0JUEhZXzExQUJHX01JWEVELAotCVBIWV8xMUcsCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JUEhZXzExQUJHTl9NSVhFRCwJLy8gYm90aCBiYW5kICAgNQotCVBIWV8xMU5fMl80RywJCS8vIDExbi1vbmx5IHdpdGggMi40RyBiYW5kCTYKLQlQSFlfMTFHTl9NSVhFRCwJLy8gMi40RyBiYW5kICAgICAgNwotCVBIWV8xMUFOX01JWEVELAkvLyA1RyAgYmFuZCAgICAgICA4Ci0JUEhZXzExQkdOX01JWEVELAkvLyBpZiBjaGVjayA4MDIuMTFiLiAgICAgIDkKLQlQSFlfMTFBR05fTUlYRUQsCS8vIGlmIGNoZWNrIDgwMi4xMWIuICAgICAgMTAKLQlQSFlfMTFOXzVHLAkJCS8vIDExbi1vbmx5IHdpdGggNUcgYmFuZAkJMTEKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLX0gUlRfODAyXzExX1BIWV9NT0RFOwotCi0KLS8vIHB1dCBhbGwgcHJvcHJpZXRlcnkgZm9yLXF1ZXJ5IG9iamVjdHMgaGVyZSB0byByZWR1Y2UgIyBvZiBRdWVyeV9PSUQKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfTElOS19TVEFUVVMgewotICAgIFVMT05HICAgQ3VyclR4UmF0ZTsgICAgICAgICAvLyBpbiB1bml0cyBvZiAwLjVNYnBzCi0gICAgVUxPTkcgICBDaGFubmVsUXVhbGl0eTsgICAgIC8vIDAuLjEwMCAlCi0gICAgVUxPTkcgICBUeEJ5dGVDb3VudDsgICAgICAgIC8vIGJvdGggb2sgYW5kIGZhaWwKLSAgICBVTE9ORyAgIFJ4Qnl0ZUNvdW50OyAgICAgICAgLy8gYm90aCBvayBhbmQgZmFpbAotICAgIFVMT05HCUNlbnRyYWxDaGFubmVsOwkJLy8gNDBNSHogY2VudHJhbCBjaGFubmVsIG51bWJlcgotfSBSVF84MDJfMTFfTElOS19TVEFUVVMsICpQUlRfODAyXzExX0xJTktfU1RBVFVTOwotCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0VWRU5UX0xPRyB7Ci0gICAgTEFSR0VfSU5URUdFUiAgIFN5c3RlbVRpbWU7ICAvLyB0aW1lc3RhbW1wIHZpYSBOZGlzR2V0Q3VycmVudFN5c3RlbVRpbWUoKQotICAgIFVDSEFSICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTkdUSF07Ci0gICAgVVNIT1JUICAgICAgICAgIEV2ZW50OyAgICAgICAvLyBFVkVOVF94eHgKLX0gUlRfODAyXzExX0VWRU5UX0xPRywgKlBSVF84MDJfMTFfRVZFTlRfTE9HOwotCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0VWRU5UX1RBQkxFIHsKLSAgICBVTE9ORyAgICAgICBOdW07Ci0gICAgVUxPTkcgICAgICAgUnN2OyAgICAgLy8gdG8gYWxpZ24gTG9nW10gYXQgTEFSR0VfSU5FR0VSIGJvdW5kYXJ5Ci0gICAgUlRfODAyXzExX0VWRU5UX0xPRyAgIExvZ1tNQVhfTlVNQkVSX09GX0VWRU5UXTsKLX0gUlRfODAyXzExX0VWRU5UX1RBQkxFLCBQUlRfODAyXzExX0VWRU5UX1RBQkxFOwotCi0vLyBNSU1PIFR4IHBhcmFtZXRlciwgU2hvcnRHSSwgTUNTLCBTVEJDLCBldGMuICB0aGVzZSBhcmUgZmllbGRzIGluIFRYV0kuIERvbid0IGNoYW5nZSB0aGlzIGRlZmluaXRpb24hISEKLXR5cGVkZWYgdW5pb24gIF9NQUNIVFRSQU5TTUlUX1NFVFRJTkcgewotCXN0cnVjdAl7Ci0JVVNIT1JUCQlNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUwotCVVTSE9SVAkJQlc6MTsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKLQlVU0hPUlQJCVNob3J0R0k6MTsKLQlVU0hPUlQJCVNUQkM6MjsJLy9TUEFDRQotCVVTSE9SVAkJcnN2OjM7Ci0JVVNIT1JUCQlNT0RFOjI7CS8vIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LgotCX0JZmllbGQ7Ci0JVVNIT1JUCQl3b3JkOwotIH0gTUFDSFRUUkFOU01JVF9TRVRUSU5HLCAqUE1BQ0hUVFJBTlNNSVRfU0VUVElORzsKLQotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9NQUNfRU5UUlkgewotICAgIFVDSEFSICAgICAgIEFkZHJbTUFDX0FERFJfTEVOR1RIXTsKLSAgICBVQ0hBUiAgICAgICBBaWQ7Ci0gICAgVUNIQVIgICAgICAgUHNtOyAgICAgLy8gMDpQV1JfQUNUSVZFLCAxOlBXUl9TQVZFCi0gICAgVUNIQVIJCU1pbW9QczsgIC8vIDA6TU1QU19TVEFUSUMsIDE6TU1QU19EWU5BTUlDLCAzOk1NUFNfRW5hYmxlZAotICAgIENIQVIJCUF2Z1Jzc2kwOwotCUNIQVIJCUF2Z1Jzc2kxOwotCUNIQVIJCUF2Z1Jzc2kyOwotCVVJTlQzMgkJQ29ubmVjdGVkVGltZTsKLSAgICBNQUNIVFRSQU5TTUlUX1NFVFRJTkcJVHhSYXRlOwotfSBSVF84MDJfMTFfTUFDX0VOVFJZLCAqUFJUXzgwMl8xMV9NQUNfRU5UUlk7Ci0KLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfTUFDX1RBQkxFIHsKLSAgICBVTE9ORyAgICAgICBOdW07Ci0gICAgUlRfODAyXzExX01BQ19FTlRSWSBFbnRyeVtNQVhfTlVNQkVSX09GX01BQ107Ci19IFJUXzgwMl8xMV9NQUNfVEFCTEUsICpQUlRfODAyXzExX01BQ19UQUJMRTsKLQotLy8gc3RydWN0dXJlIGZvciBxdWVyeS9zZXQgaGFyZHdhcmUgcmVnaXN0ZXIgLSBNQUMsIEJCUCwgUkYgcmVnaXN0ZXIKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfSEFSRFdBUkVfUkVHSVNURVIgewotICAgIFVMT05HICAgSGFyZHdhcmVUeXBlOyAgICAgICAvLyAwOk1BQywgMTpCQlAsIDI6UkYgcmVnaXN0ZXIsIDM6RUVQUk9NCi0gICAgVUxPTkcgICBPZmZzZXQ7ICAgICAgICAgICAgIC8vIFEvUyByZWdpc3RlciBvZmZzZXQgYWRkcgotICAgIFVMT05HICAgRGF0YTsgICAgICAgICAgICAgICAvLyBSL1cgZGF0YSBidWZmZXIKLX0gUlRfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSLCAqUFJUXzgwMl8xMV9IQVJEV0FSRV9SRUdJU1RFUjsKLQotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9BUF9DT05GSUcgewotICAgIFVMT05HICAgRW5hYmxlVHhCdXJzdDsgICAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlCi0gICAgVUxPTkcgICBFbmFibGVUdXJib1JhdGU7ICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUgNzIvMTAwbWJwcyB0dXJibyByYXRlCi0gICAgVUxPTkcgICBJc29sYXRlSW50ZXJTdGFUcmFmZmljOyAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSBpc29sYXRpb24KLSAgICBVTE9ORyAgIEhpZGVTc2lkOyAgICAgICAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSBoaWRpbmcKLSAgICBVTE9ORyAgIFVzZUJHUHJvdGVjdGlvbjsgICAgLy8gMC1BVVRPLCAxLWFsd2F5cyBPTiwgMi1hbHdheXMgT0ZGCi0gICAgVUxPTkcgICBVc2VTaG9ydFNsb3RUaW1lOyAgIC8vIDAtbm8gdXNlLCAxLXVzZSA5LXVzIHNob3J0IHNsb3QgdGltZQotICAgIFVMT05HICAgUnN2MTsgICAgICAgICAgICAgICAvLyBtdXN0IGJlIDAKLSAgICBVTE9ORyAgIFN5c3RlbUVycm9yQml0bWFwOyAgLy8gaWdub3JlIHVwb24gU0VULCByZXR1cm4gc3lzdGVtIGVycm9yIHVwb24gUVVFUlkKLX0gUlRfODAyXzExX0FQX0NPTkZJRywgKlBSVF84MDJfMTFfQVBfQ09ORklHOwotCi0vLyBzdHJ1Y3R1cmUgdG8gcXVlcnkvc2V0IFNUQV9DT05GSUcKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfU1RBX0NPTkZJRyB7Ci0gICAgVUxPTkcgICBFbmFibGVUeEJ1cnN0OyAgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUKLSAgICBVTE9ORyAgIEVuYWJsZVR1cmJvUmF0ZTsgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSA3Mi8xMDBtYnBzIHR1cmJvIHJhdGUKLSAgICBVTE9ORyAgIFVzZUJHUHJvdGVjdGlvbjsgICAgLy8gMC1BVVRPLCAxLWFsd2F5cyBPTiwgMi1hbHdheXMgT0ZGCi0gICAgVUxPTkcgICBVc2VTaG9ydFNsb3RUaW1lOyAgIC8vIDAtbm8gdXNlLCAxLXVzZSA5LXVzIHNob3J0IHNsb3QgdGltZSB3aGVuIGFwcGxpY2FibGUKLSAgICBVTE9ORyAgIEFkaG9jTW9kZTsJCQkvLyAwLTExYiByYXRlcyBvbmx5IChXSUZJIHNwZWMpLCAxIC0gYi9nIG1peGVkLCAyIC0gZyBvbmx5Ci0gICAgVUxPTkcgICBId1JhZGlvU3RhdHVzOyAgICAgIC8vIDAtT0ZGLCAxLU9OLCBkZWZhdWx0IGlzIDEsIFJlYWQtT25seQotICAgIFVMT05HICAgUnN2MTsgICAgICAgICAgICAgICAvLyBtdXN0IGJlIDAKLSAgICBVTE9ORyAgIFN5c3RlbUVycm9yQml0bWFwOyAgLy8gaWdub3JlIHVwb24gU0VULCByZXR1cm4gc3lzdGVtIGVycm9yIHVwb24gUVVFUlkKLX0gUlRfODAyXzExX1NUQV9DT05GSUcsICpQUlRfODAyXzExX1NUQV9DT05GSUc7Ci0KLS8vCi0vLyAgRm9yIE9JRCBRdWVyeSBvciBTZXQgYWJvdXQgQkEgc3RydWN0dXJlCi0vLwotdHlwZWRlZglzdHJ1Y3QJX09JRF9CQUNBUF9TVFJVQwl7Ci0JCVVDSEFSCQlSeEJBV2luTGltaXQ7Ci0JCVVDSEFSCQlUeEJBV2luTGltaXQ7Ci0JCVVDSEFSCQlQb2xpY3k7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UuIG90aGVyIHZhbHVlIGludmFsaWQKLQkJVUNIQVIJCU1wZHVEZW5zaXR5OwkvLyAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlLiBvdGhlciB2YWx1ZSBpbnZhbGlkCi0JCVVDSEFSCQlBbXNkdUVuYWJsZTsJLy9FbmFibGUgQU1TRFUgdHJhbnNtaXNzdGlvbgotCQlVQ0hBUgkJQW1zZHVTaXplOwkvLyAwOjM4MzksIDE6NzkzNSBieXRlcy4gVUlOVCAgTVNEVVNpemVUb0J5dGVzW10JPSB7IDM4MzksIDc5MzV9OwotCQlVQ0hBUgkJTU1QU21vZGU7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLCAwOnN0YXRpYywgMTpkeW5hbWljLCAyOnJzdiwgMzptaW1vIGVuYWJsZQotCQlCT09MRUFOCQlBdXRvQkE7CS8vIEF1dG8gQkEgd2lsbCBhdXRvbWF0aWNhbGx5Ci19IE9JRF9CQUNBUF9TVFJVQywgKlBPSURfQkFDQVBfU1RSVUM7Ci0KLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfQUNMX0VOVFJZIHsKLSAgICBVQ0hBUiAgIEFkZHJbTUFDX0FERFJfTEVOR1RIXTsKLSAgICBVU0hPUlQgIFJzdjsKLX0gUlRfODAyXzExX0FDTF9FTlRSWSwgKlBSVF84MDJfMTFfQUNMX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUXzgwMl8xMV9BQ0wgewotICAgIFVMT05HICAgUG9saWN5OyAgICAgICAgICAgICAvLyAwLWRpc2FibGUsIDEtcG9zaXRpdmUgbGlzdCwgMi1uZWdhdGl2ZSBsaXN0Ci0gICAgVUxPTkcgICBOdW07Ci0gICAgUlRfODAyXzExX0FDTF9FTlRSWSBFbnRyeVtNQVhfTlVNQkVSX09GX0FDTF07Ci19IFJUXzgwMl8xMV9BQ0wsICpQUlRfODAyXzExX0FDTDsKLQotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9XRFMgewotICAgIFVMT05HCQkJCQkJTnVtOwotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTCQlFbnRyeVsyNC8qTUFYX05VTV9PRl9XRFNfTElOSyovXTsKLQlVTE9ORwkJCQkJCUtleUxlbmd0aDsKLQlVQ0hBUgkJCQkJCUtleU1hdGVyaWFsWzMyXTsKLX0gUlRfODAyXzExX1dEUywgKlBSVF84MDJfMTFfV0RTOwotCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX1RYX1JBVEVTXyB7Ci0gICAgVUNIQVIgICAgICAgU3VwUmF0ZUxlbjsKLSAgICBVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFU107Ci0gICAgVUNIQVIgICAgICAgRXh0UmF0ZUxlbjsKLSAgICBVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFU107Ci19IFJUXzgwMl8xMV9UWF9SQVRFUywgKlBSVF84MDJfMTFfVFhfUkFURVM7Ci0KLQotLy8gRGVmaW5pdGlvbiBvZiBleHRyYSBpbmZvcm1hdGlvbiBjb2RlCi0jZGVmaW5lCUdFTkVSQUxfTElOS19VUAkJCTB4MAkJCS8vIExpbmsgaXMgVXAKLSNkZWZpbmUJR0VORVJBTF9MSU5LX0RPV04JCTB4MQkJCS8vIExpbmsgaXMgRG93bgotI2RlZmluZQlIV19SQURJT19PRkYJCQkweDIJCQkvLyBIYXJkd2FyZSByYWRpbyBvZmYKLSNkZWZpbmUJU1dfUkFESU9fT0ZGCQkJMHgzCQkJLy8gU29mdHdhcmUgcmFkaW8gb2ZmCi0jZGVmaW5lCUFVVEhfRkFJTAkJCQkweDQJCQkvLyBPcGVuIGF1dGhlbnRpY2F0aW9uIGZhaWwKLSNkZWZpbmUJQVVUSF9GQUlMX0tFWVMJCQkweDUJCQkvLyBTaGFyZWQgYXV0aGVudGljYXRpb24gZmFpbAotI2RlZmluZQlBU1NPQ19GQUlMCQkJCTB4NgkJCS8vIEFzc29jaWF0aW9uIGZhaWxlZAotI2RlZmluZQlFQVBfTUlDX0ZBSUxVUkUJCQkweDcJCQkvLyBEZWF1dGhlbmNhdGlvbiBiZWNhdXNlIE1JQyBmYWlsdXJlCi0jZGVmaW5lCUVBUF80V0FZX1RJTUVPVVQJCTB4OAkJCS8vIERlYXV0aGVuY2F0aW9uIG9uIDQtd2F5IGhhbmRzaGFrZSB0aW1lb3V0Ci0jZGVmaW5lCUVBUF9HUk9VUF9LRVlfVElNRU9VVAkweDkJCQkvLyBEZWF1dGhlbmNhdGlvbiBvbiBncm91cCBrZXkgaGFuZHNoYWtlIHRpbWVvdXQKLSNkZWZpbmUJRUFQX1NVQ0NFU1MJCQkJMHhhCQkJLy8gRUFQIHN1Y2NlZWQKLSNkZWZpbmUJREVURUNUX1JBREFSX1NJR05BTAkJMHhiICAgICAgICAgLy8gUmFkYXIgc2lnbmFsIG9jY3VyIGluIGN1cnJlbnQgY2hhbm5lbAotI2RlZmluZSBFWFRSQV9JTkZPX01BWAkJCTB4YgkJCS8vIEluZGljYXRlIExhc3QgT0lECi0KLSNkZWZpbmUgRVhUUkFfSU5GT19DTEVBUgkJMHhmZmZmZmZmZgotCi0vLyBUaGlzIGlzIE9JRCBzZXR0aW5nIHN0cnVjdHVyZS4gU28gb25seSBHRiBvciBNTSBhcyBNb2RlLiBUaGlzIGlzIHZhbGlkIHdoZW4gb3VyIHdpcmVsc3MgbW9kZSBoYXMgODAyLjExbiBpbiB1c2UuCi10eXBlZGVmIHN0cnVjdCB7Ci0JUlRfODAyXzExX1BIWV9NT0RFCQlQaHlNb2RlOwkvLwotCVVDSEFSCQlUcmFuc21pdE5vOwotCVVDSEFSCQlIdE1vZGU7CQkvL0hUTU9ERV9HRiBvciBIVE1PREVfTU0KLQlVQ0hBUgkJRXh0T2Zmc2V0OwkvL2V4dGVuc2lvbiBjaGFubmVsIGFib3ZlIG9yIGJlbG93Ci0JVUNIQVIJCU1DUzsKLQlVQ0hBUgkJQlc7Ci0JVUNIQVIJCVNUQkM7Ci0JVUNIQVIJCVNIT1JUR0k7Ci0JVUNIQVIJCXJzdjsKLX0gT0lEX1NFVF9IVF9QSFlNT0RFLCAqUE9JRF9TRVRfSFRfUEhZTU9ERTsKLQotI2lmZGVmIE5JTlRFTkRPX0FQCi0jZGVmaW5lIE5JTlRFTkRPX01BWF9FTlRSWSAxNgotI2RlZmluZSBOSU5URU5ET19TU0lEX05BTUVfTE4gOAotI2RlZmluZSBOSU5URU5ET19TU0lEX05BTUUgIk5XQ1VTQkFQIgotI2RlZmluZSBOSU5URU5ET19QUk9CRV9SRVFfRkxBR19NQVNLIDB4MDMKLSNkZWZpbmUgTklOVEVORE9fUFJPQkVfUkVRX09OIDB4MDEKLSNkZWZpbmUgTklOVEVORE9fUFJPQkVfUkVRX1NJR05BTCAweDAyCi0jZGVmaW5lIE5JTlRFTkRPX1BST0JFX1JTUF9PTiAweDAxCi0jZGVmaW5lIE5JTlRFTkRPX1NTSURfTklDS05BTUVfTE4gMjAKLQotI2RlZmluZSBOSU5URU5ET19XRVBLRVlfTE4gMTMKLQotdHlwZWRlZiBzdHJ1Y3QgX05JTlRFTkRPX1NTSUQKLXsKLQlVQ0hBUglOSU5URU5ET0ZpeENoYXJbTklOVEVORE9fU1NJRF9OQU1FX0xOXTsKLQlVQ0hBUgl6ZXJvMTsKLQlVQ0hBUglyZWdpc3RlOwotCVVDSEFSCUlEOwotCVVDSEFSCXplcm8yOwotCVVDSEFSCU5JQ0tuYW1lW05JTlRFTkRPX1NTSURfTklDS05BTUVfTE5dOwotfSBSVF9OSU5URU5ET19TU0lELCAqUFJUX05JTlRFTkRPX1NTSUQ7Ci0KLXR5cGVkZWYgc3RydWN0IF9OSU5URU5ET19FTlRSWQotewotCVVDSEFSCU5JQ0tuYW1lW05JTlRFTkRPX1NTSURfTklDS05BTUVfTE5dOwotICAgIFVDSEFSICAgRFNfQWRkcltFVEhfTEVOR1RIX09GX0FERFJFU1NdOwotCVVDSEFSCXJlZ2lzdGU7Ci0JVUNIQVIJVXNlclNwYWNlQWNrOwotfSBSVF9OSU5URU5ET19FTlRSWSwgKlBSVF9OSU5URU5ET19FTlRSWTsKLQotLy9SVFBSSVZfSU9DVExfTklOVEVORE9fR0VUX1RBQkxFCi0vL1JUUFJJVl9JT0NUTF9OSU5URU5ET19TRVRfVEFCTEUKLXR5cGVkZWYgc3RydWN0IF9OSU5URU5ET19UQUJMRQotewotCVVJTlQJCQkJbnVtYmVyOwotCVJUX05JTlRFTkRPX0VOVFJZCWVudHJ5W05JTlRFTkRPX01BWF9FTlRSWV07Ci19IFJUX05JTlRFTkRPX1RBQkxFLCAqUFJUX05JTlRFTkRPX1RBQkxFOwotCi0vL1JUUFJJVl9JT0NUTF9OSU5URU5ET19TRUVEX1dFUEtFWQotdHlwZWRlZiBzdHJ1Y3QgX05JTlRFTkRPX1NFRURfV0VQS0VZCi17Ci0JVUNIQVIJc2VlZFtOSU5URU5ET19TU0lEX05JQ0tOQU1FX0xOXTsKLQlVQ0hBUgl3ZXBrZXlbMTZdOy8vdXNlIDEzIGZvciAxMDQgYml0cyB3ZXAga2V5Ci19IFJUX05JTlRFTkRPX1NFRURfV0VQS0VZLCAqUFJUX05JTlRFTkRPX1NFRURfV0VQS0VZOwotI2VuZGlmIC8vIE5JTlRFTkRPX0FQIC8vCi0KLSNpZmRlZiBMTFREX1NVUFBPUlQKLXR5cGVkZWYgc3RydWN0IF9SVF9MTFREX0FTU09JQ0FUSU9OX0VOVFJZIHsKLSAgICBVQ0hBUiAgICAgICAgICAgQWRkcltFVEhfTEVOR1RIX09GX0FERFJFU1NdOwotICAgIHVuc2lnbmVkIHNob3J0ICBNT1I7ICAgICAgICAvLyBtYXhpbXVtIG9wZXJhdGlvbmFsIHJhdGUKLSAgICBVQ0hBUiAgICAgICAgICAgcGh5TW9kZTsKLX0gUlRfTExURF9BU1NPSUNBVElPTl9FTlRSWSwgKlBSVF9MTFREX0FTU09JQ0FUSU9OX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCBfUlRfTExURF9BU1NPSUNBVElPTl9UQUJMRSB7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIE51bTsKLSAgICBSVF9MTFREX0FTU09JQ0FUSU9OX0VOVFJZICAgRW50cnlbTUFYX05VTUJFUl9PRl9NQUNdOwotfSBSVF9MTFREX0FTU09JQ0FUSU9OX1RBQkxFLCAqUFJUX0xMVERfQVNTT0lDQVRJT05fVEFCTEU7Ci0jZW5kaWYgLy8gTExURF9TVVBQT1JUIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLS8vcnQyODYwLCBrYXRoeSAyMDA3LTAxMTgKLS8vIHN0cnVjdHVyZSBmb3IgRExTCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0RMU19VSSB7Ci0JVVNIT1JUCQkJCQkJVGltZU91dDsJCS8vIHVuaXQ6IHNlY29uZCAsIHNldCBieSBVSQotCVVTSE9SVAkJCQkJCUNvdW50RG93blRpbWVyOwkvLyB1bml0OiBzZWNvbmQgLCB1c2VkIGJ5IGRyaXZlciBvbmx5Ci0JTkRJU184MDJfMTFfTUFDX0FERFJFU1MJCU1hY0FkZHI7CQkvLyBzZXQgYnkgVUkKLQlVQ0hBUgkJCQkJCVN0YXR1czsJCQkvLyAwOiBub25lICwgMTogd2FpdCBTVEFrZXksIDI6IGZpbmlzaCBETFMgc2V0dXAgLCBzZXQgYnkgZHJpdmVyIG9ubHkKLQlCT09MRUFOCQkJCQkJVmFsaWQ7CQkJLy8gMTogdmFsaWQgLCAwOiBpbnZhbGlkICwgc2V0IGJ5IFVJLCB1c2UgdG8gc2V0dXAgb3IgdGVhciBkb3duIERMUyBsaW5rCi19IFJUXzgwMl8xMV9ETFNfVUksICpQUlRfODAyXzExX0RMU19VSTsKLQotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9ETFNfSU5GTyB7Ci0JUlRfODAyXzExX0RMU19VSQlFbnRyeVtNQVhfTlVNQkVSX09GX0RMU19FTlRSWV07Ci0JVUNIQVIJCQkJbnVtOwotfSBSVF84MDJfMTFfRExTX0lORk8sICpQUlRfODAyXzExX0RMU19JTkZPOwotCi10eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9ETFNfTU9ERSB7Ci0gICAgRExTX05PTkUsCi0gICAgRExTX1dBSVRfS0VZLAotICAgIERMU19GSU5JU0gKLX0gUlRfODAyXzExX0RMU19NT0RFOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2RlZmluZQlSVF9BU1NPQ19FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMQotI2RlZmluZQlSVF9ESVNBU1NPQ19FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMgotI2RlZmluZQlSVF9SRVFJRV9FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMwotI2RlZmluZQlSVF9SRVNQSUVfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNAotI2RlZmluZQlSVF9BU1NPQ0lORk9fRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgIDB4MDEwNQotI2RlZmluZSBSVF9QTUtJRENBTkRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNgotI2RlZmluZSBSVF9JTlRFUkZBQ0VfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNwotI2RlZmluZSBSVF9JTlRFUkZBQ0VfVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwOAotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQotCi0jZGVmaW5lIE1BWF9DVVNUT01fTEVOIDEyOAotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi10eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9EX0NMSUVOVF9NT0RFCi17Ci0gICBSdDgwMl8xMV9EX05vbmUsCi0gICBSdDgwMl8xMV9EX0ZsZXhpYmxlLAotICAgUnQ4MDJfMTFfRF9TdHJpY3QsCi19IFJUXzgwMl8xMV9EX0NMSUVOVF9NT0RFLCAqUFJUXzgwMl8xMV9EX0NMSUVOVF9NT0RFOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi10eXBlZGVmIHN0cnVjdCBfUlRfQ0hBTk5FTF9MSVNUX0lORk8KLXsKLQlVQ0hBUiBDaGFubmVsTGlzdFtNQVhfTlVNX09GX0NIU107ICAgLy8gbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleQotCVVDSEFSIENoYW5uZWxMaXN0TnVtOyAvLyBudW1iZXIgb2YgY2hhbm5lbCBpbiBDaGFubmVsTGlzdFtdCi19IFJUX0NIQU5ORUxfTElTVF9JTkZPLCAqUFJUX0NIQU5ORUxfTElTVF9JTkZPOwotCi0vLyBXU0MgY29uZmlndXJlZCBjcmVkZW50aWFsCi10eXBlZGVmCXN0cnVjdAlfV1NDX0NSRURFTlRJQUwKLXsKLQlORElTXzgwMl8xMV9TU0lECVNTSUQ7CQkJCS8vIG1hbmRhdG9yeQotCVVTSE9SVAkJCQlBdXRoVHlwZTsJCQkvLyBtYW5kYXRvcnksIDE6IG9wZW4sIDI6IHdwYS1wc2ssIDQ6IHNoYXJlZCwgODp3cGEsIDB4MTA6IHdwYTIsIDB4MjA6IHdwYTItcHNrCi0JVVNIT1JUCQkJCUVuY3JUeXBlOwkJCS8vIG1hbmRhdG9yeSwgMTogbm9uZSwgMjogd2VwLCA0OiB0a2lwLCA4OiBhZXMKLQlVQ0hBUgkJCQlLZXlbNjRdOwkJCS8vIG1hbmRhdG9yeSwgTWF4aW11bSA2NCBieXRlCi0JVVNIT1JUCQkJCUtleUxlbmd0aDsKLQlVQ0hBUgkJCQlNYWNBZGRyWzZdOwkJCS8vIG1hbmRhdG9yeSwgQVAgTUFDIGFkZHJlc3MKLQlVQ0hBUgkJCQlLZXlJbmRleDsJCQkvLyBvcHRpb25hbCwgZGVmYXVsdCBpcyAxCi0JVUNIQVIJCQkJUnN2ZFszXTsJCQkvLyBNYWtlIGFsaWdubWVudAotfQlXU0NfQ1JFREVOVElBTCwgKlBXU0NfQ1JFREVOVElBTDsKLQotLy8gV1NDIGNvbmZpZ3VyZWQgcHJvZmlsZXMKLXR5cGVkZWYJc3RydWN0CV9XU0NfUFJPRklMRQotewotCVVJTlQJCQlQcm9maWxlQ250OwotCVVJTlQJCQlBcHBseVByb2ZpbGVJZHg7ICAvLyBhZGQgYnkgam9obmxpLCBmaXggV1BTIHRlc3QgcGxhbiA1LjEuMQotCVdTQ19DUkVERU5USUFMCVByb2ZpbGVbOF07CQkJCS8vIFN1cHBvcnQgdXAgdG8gOCBwcm9maWxlcwotfQlXU0NfUFJPRklMRSwgKlBXU0NfUFJPRklMRTsKLQotCi0KLSNlbmRpZiAvLyBfT0lEX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3BjaV9tYWluX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9wY2lfbWFpbl9kZXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQxMDE1Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3BjaV9tYWluX2Rldi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE5NSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXBjaV9tYWluX2Rldi5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCi0qLwotCi0KLSNpbmNsdWRlICJydF9jb25maWcuaCIKLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLQotLy8gRm9sbG93aW5nIGluZm9ybWF0aW9uIHdpbGwgYmUgc2hvdyB3aGVuIHlvdSBydW4gJ21vZGluZm8nCi0vLyAqKiogSWYgeW91IGhhdmUgYSBzb2x1dGlvbiBmb3IgdGhlIGJ1ZyBpbiBjdXJyZW50IHZlcnNpb24gb2YgZHJpdmVyLCBwbGVhc2UgbWFpbCB0byBtZS4KLS8vIE90aGVyd2lzZSBwb3N0IHRvIGZvcnVtIGluIHJhbGlua3RlY2gncyB3ZWIgc2l0ZSh3d3cucmFsaW5rdGVjaC5jb20pIGFuZCBsZXQgYWxsIHVzZXJzIGhlbHAgeW91LiAqKioKLU1PRFVMRV9BVVRIT1IoIkpldHQgQ2hlbiA8amV0dF9jaGVuQHJhbGlua3RlY2guY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJSVDMwOTAgV2lyZWxlc3MgTGFuIExpbnV4IERyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0vLwotLy8gRnVuY3Rpb24gZGVjbGFyYXRpb25zCi0vLwotZXh0ZXJuIGludCBydDI4eHhfY2xvc2UoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwotZXh0ZXJuIGludCBydDI4eHhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7Ci0KLXN0YXRpYyBWT0lEIF9fZGV2ZXhpdCBydDI4NjBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldik7Ci1zdGF0aWMgSU5UIF9fZGV2aW5pdCBydDI4NjBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICAqZW50KTsKLXN0YXRpYyB2b2lkIF9fZXhpdCBydDI4NjBfY2xlYW51cF9tb2R1bGUodm9pZCk7Ci1zdGF0aWMgaW50IF9faW5pdCBydDI4NjBfaW5pdF9tb2R1bGUodm9pZCk7Ci0KLQotIHN0YXRpYyBWT0lEIFJUTVBJbml0UENJZURldmljZSgKLSAgICBJTiAgc3RydWN0IHBjaV9kZXYgICAqcGNpX2RldiwKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgICBwQWQpOwotCi0KLSNpZmRlZiBDT05GSUdfUE0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDEwKQotI2RlZmluZSBwbV9tZXNzYWdlX3QgdTMyCi0jZW5kaWYKLQotc3RhdGljIGludCBydDI4NjBfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLXN0YXRpYyBpbnQgcnQyODYwX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldik7Ci0jZW5kaWYKLSNlbmRpZiAvLyBDT05GSUdfUE0gLy8KLQotLy8KLS8vIFJhbGluayBQQ0kgZGV2aWNlIHRhYmxlLCBpbmNsdWRlIGFsbCBzdXBwb3J0ZWQgY2hpcHNldHMKLS8vCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcnQyODYwX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0KLXsKLSNpZmRlZiBSVDMwOTAKLQl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMzA5MF9QQ0llX0RFVklDRV9JRCl9LAotCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMzMDkxX1BDSWVfREVWSUNFX0lEKX0sCi0Je1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzMwOTJfUENJZV9ERVZJQ0VfSUQpfSwKLQl7UENJX0RFVklDRSgweDE0NjIsIDB4ODkxQSl9LAotI2VuZGlmIC8vIFJUMzA5MCAvLwotI2lmZGVmIFJUMzM5MAotCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMzMzkwX1BDSWVfREVWSUNFX0lEKX0sCi0Je1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzMzOTFfUENJZV9ERVZJQ0VfSUQpfSwKLQl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMzM5Ml9QQ0llX0RFVklDRV9JRCl9LAotI2VuZGlmIC8vIFJUMzM5MCAvLwotICAgIHswLH0JCS8vIHRlcm1pbmF0ZSBsaXN0Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcnQyODYwX3BjaV90YmwpOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIE1PRFVMRV9WRVJTSU9OCi1NT0RVTEVfVkVSU0lPTihTVEFfRFJJVkVSX1ZFUlNJT04pOwotI2VuZGlmCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotLy8KLS8vIE91ciBQQ0kgZHJpdmVyIHN0cnVjdHVyZQotLy8KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBydDI4NjBfZHJpdmVyID0KLXsKLSAgICBuYW1lOiAgICAgICAicnQzMDkwIiwKLSAgICBpZF90YWJsZTogICBydDI4NjBfcGNpX3RibCwKLSAgICBwcm9iZTogICAgICBydDI4NjBfcHJvYmUsCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IDB4MjA0MTIKLSAgICByZW1vdmU6ICAgICBfX2RldmV4aXRfcChydDI4NjBfcmVtb3ZlX29uZSksCi0jZWxzZQotICAgIHJlbW92ZTogICAgIF9fZGV2ZXhpdChydDI4NjBfcmVtb3ZlX29uZSksCi0jZW5kaWYKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSNpZmRlZiBDT05GSUdfUE0KLQlzdXNwZW5kOglydDI4NjBfc3VzcGVuZCwKLQlyZXN1bWU6CQlydDI4NjBfcmVzdW1lLAotI2VuZGlmCi0jZW5kaWYKLX07Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqCVBDSSBkZXZpY2UgaW5pdGlhbGl6YXRpb24gcmVsYXRlZCBwcm9jZWR1cmVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotI2lmZGVmIENPTkZJR19QTQotCi1WT0lEIFJUMjg2MFJlamVjdFBlbmRpbmdQYWNrZXRzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCS8vIGNsZWFyIFBTIHBhY2tldHMKLQkvLyBjbGVhciBUeFN3IHBhY2tldHMKLX0KLQotc3RhdGljIGludCBydDI4NjBfc3VzcGVuZCgKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKLQlwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUilOVUxMOwotCUlOVDMyIHJldHZhbCA9IDA7Ci0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3N1c3BlbmQoKVxuIikpOwotCi0JaWYgKG5ldF9kZXYgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIm5ldF9kZXYgPT0gTlVMTCFcbiIpKTsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkID0gKFBSVE1QX0FEQVBURVIpUlRNUF9PU19ORVRERVZfR0VUX1BSSVYobmV0X2Rldik7Ci0KLQkJLyogd2UgY2FuIG5vdCB1c2UgSUZGX1VQIGJlY2F1c2UgcmEwIGRvd24gYnV0IHJhMSB1cCAqLwotCQkvKiBhbmQgMSBzdXNwZW5kL3Jlc3VtZSBmdW5jdGlvbiBmb3IgMSBtb2R1bGUsIG5vdCBmb3IgZWFjaCBpbnRlcmZhY2UgKi8KLQkJLyogc28gTGludXggd2lsbCBjYWxsIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIG9uY2UgKi8KLQkJaWYgKFZJUlRVQUxfSUZfTlVNKHBBZCkgPiAwKQotCQl7Ci0JCQkvLyBhdm9pZCB1c2VycyBkbyBzdXNwZW5kIGFmdGVyIGludGVyZmFjZSBpcyBkb3duCi0KLQkJCS8vIHN0b3AgaW50ZXJmYWNlCi0JCQluZXRpZl9jYXJyaWVyX29mZihuZXRfZGV2KTsKLQkJCW5ldGlmX3N0b3BfcXVldWUobmV0X2Rldik7Ci0KLQkJCS8vIG1hcmsgZGV2aWNlIGFzIHJlbW92ZWQgZnJvbSBzeXN0ZW0gYW5kIHRoZXJlZm9yZSBubyBsb25nZXIgYXZhaWxhYmxlCi0JCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldF9kZXYpOwotCi0JCQkvLyBtYXJrIGhhbHQgZmxhZwotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7Ci0JCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOwotCi0JCQkvLyB0YWtlIGRvd24gdGhlIGRldmljZQotCQkJcnQyOHh4X2Nsb3NlKChQTkVUX0RFViluZXRfZGV2KTsKLQotCQkJUlRfTU9EX0RFQ19VU0VfQ09VTlQoKTsKLQkJfQotCX0KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTApCi0JLy8gcmVmZXJlbmNlIHRvIGh0dHA6Ly92b3ZvMjAwMC5jb20vdHlwZS1sYWIvbGludXgva2VybmVsLWFwaS9saW51eC1rZXJuZWwtYXBpLmh0bWwKLQkvLyBlbmFibGUgZGV2aWNlIHRvIGdlbmVyYXRlIFBNRSMgd2hlbiBzdXNwZW5kZWQKLQkvLyBwY2lfY2hvb3NlX3N0YXRlKCk6IENob29zZSB0aGUgcG93ZXIgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlIHRvIGJlIHN1c3BlbmRlZAotCXJldHZhbCA9IHBjaV9lbmFibGVfd2FrZShwY2lfZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBjaV9kZXYsIHN0YXRlKSwgMSk7Ci0JLy8gc2F2ZSB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2Ugb2YgYSBkZXZpY2UgYmVmb3JlIHN1c3BlbmRpbmcKLQlwY2lfc2F2ZV9zdGF0ZShwY2lfZGV2KTsKLQkvLyBkaXNhYmxlIFBDSSBkZXZpY2UgYWZ0ZXIgdXNlCi0JcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOwotCi0JcmV0dmFsID0gcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBjaV9kZXYsIHN0YXRlKSk7Ci0jZW5kaWYKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX3N1c3BlbmQoKVxuIikpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgcnQyODYwX3Jlc3VtZSgKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKU5VTEw7Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDEwKQotCUlOVDMyIHJldHZhbDsKLQotCi0JLy8gc2V0IHRoZSBwb3dlciBzdGF0ZSBvZiBhIFBDSSBkZXZpY2UKLQkvLyBQQ0kgaGFzIDQgcG93ZXIgc3RhdGVzLCBETyAobm9ybWFsKSB+IEQzKGxlc3MgcG93ZXIpCi0JLy8gaW4gaW5jbHVkZS9saW51eC9wY2kuaCwgeW91IGNhbiBmaW5kIHRoYXQKLQkvLyAjZGVmaW5lIFBDSV9EMCAgICAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDApCi0JLy8gI2RlZmluZSBQQ0lfRDEgICAgICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAxKQotCS8vICNkZWZpbmUgUENJX0QyICAgICAgICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgMikKLQkvLyAjZGVmaW5lIFBDSV9EM2hvdCAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDMpCi0JLy8gI2RlZmluZSBQQ0lfRDNjb2xkICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSA0KQotCS8vICNkZWZpbmUgUENJX1VOS05PV04gICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgNSkKLQkvLyAjZGVmaW5lIFBDSV9QT1dFUl9FUlJPUiAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIC0xKQotCXJldHZhbCA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKLQotCS8vIHJlc3RvcmUgdGhlIHNhdmVkIHN0YXRlIG9mIGEgUENJIGRldmljZQotCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOwotCi0JLy8gaW5pdGlhbGl6ZSBkZXZpY2UgYmVmb3JlIGl0J3MgdXNlZCBieSBhIGRyaXZlcgotCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkKLQl7Ci0JCXByaW50aygicGNpIGVuYWJsZSBmYWlsIVxuIik7Ci0JCXJldHVybiAwOwotCX0KLSNlbmRpZgotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NjBfcmVzdW1lKClcbiIpKTsKLQotCWlmIChuZXRfZGV2ID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJuZXRfZGV2ID09IE5VTEwhXG4iKSk7Ci0JfQotCWVsc2UKLQkJcEFkID0gKFBSVE1QX0FEQVBURVIpUlRNUF9PU19ORVRERVZfR0VUX1BSSVYobmV0X2Rldik7Ci0KLQlpZiAocEFkICE9IE5VTEwpCi0JewotCQkvKiB3ZSBjYW4gbm90IHVzZSBJRkZfVVAgYmVjYXVzZSByYTAgZG93biBidXQgcmExIHVwICovCi0JCS8qIGFuZCAxIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIGZvciAxIG1vZHVsZSwgbm90IGZvciBlYWNoIGludGVyZmFjZSAqLwotCQkvKiBzbyBMaW51eCB3aWxsIGNhbGwgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb24gb25jZSAqLwotCQlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA+IDApCi0JCXsKLQkJCS8vIG1hcmsgZGV2aWNlIGFzIGF0dGFjaGVkIGZyb20gc3lzdGVtIGFuZCByZXN0YXJ0IGlmIG5lZWRlZAotCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRfZGV2KTsKLQotCQkJaWYgKHJ0Mjh4eF9vcGVuKChQTkVUX0RFViluZXRfZGV2KSAhPSAwKQotCQkJewotCQkJCS8vIG9wZW4gZmFpbAotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX3Jlc3VtZSgpXG4iKSk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0KLQkJCS8vIGluY3JlYXNlIE1PRFVMRSB1c2UgY291bnQKLQkJCVJUX01PRF9JTkNfVVNFX0NPVU5UKCk7Ci0KLQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7Ci0JCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7Ci0KLQkJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOwotCQkJbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKLQkJCW5ldGlmX3dha2VfcXVldWUobmV0X2Rldik7Ci0JCX0KLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg2MF9yZXN1bWUoKVxuIikpOwotCXJldHVybiAwOwotfQotI2VuZGlmIC8vIENPTkZJR19QTSAvLwotI2VuZGlmCi0KLQotc3RhdGljIElOVCBfX2luaXQgcnQyODYwX2luaXRfbW9kdWxlKFZPSUQpCi17Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZydDI4NjBfZHJpdmVyKTsKLSNlbHNlCi0gICAgcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcnQyODYwX2RyaXZlcik7Ci0jZW5kaWYKLX0KLQotCi0vLwotLy8gRHJpdmVyIG1vZHVsZSB1bmxvYWQgZnVuY3Rpb24KLS8vCi1zdGF0aWMgVk9JRCBfX2V4aXQgcnQyODYwX2NsZWFudXBfbW9kdWxlKFZPSUQpCi17Ci0gICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZydDI4NjBfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQocnQyODYwX2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KHJ0Mjg2MF9jbGVhbnVwX21vZHVsZSk7Ci0KLQotLy8KLS8vIFBDSSBkZXZpY2UgcHJvYmUgJiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgotLy8KLXN0YXRpYyBJTlQgX19kZXZpbml0ICAgcnQyODYwX3Byb2JlKAotICAgIElOICBzdHJ1Y3QgcGNpX2RldiAgICAgICAgICAgICAgKnBjaV9kZXYsCi0gICAgSU4gIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICAqcGNpX2lkKQotewotCVBSVE1QX0FEQVBURVIJCXBBZCA9IChQUlRNUF9BREFQVEVSKU5VTEw7Ci0Jc3RydWN0ICBuZXRfZGV2aWNlCQkqbmV0X2RldjsKLQlQVk9JRAkJCQloYW5kbGU7Ci0JUFNUUklORwkJCQlwcmludF9uYW1lOwotCVVMT05HCQkJCWNzcl9hZGRyOwotCUlOVCBydiA9IDA7Ci0JUlRNUF9PU19ORVRERVZfT1BfSE9PSwluZXREZXZIb29rOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NjBfcHJvYmVcbiIpKTsKLQotLy9QQ0lEZXZJbml0PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCS8vIHdha2UgdXAgYW5kIGVuYWJsZSBkZXZpY2UKLQlpZiAoKHJ2ID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpIT0gMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVuYWJsZSBQQ0kgZGV2aWNlIGZhaWxlZCwgZXJybm89JWQhXG4iLCBydikpOwotCQlyZXR1cm4gcnY7Ci0JfQotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCXByaW50X25hbWUgPSBwY2lfZGV2ID8gcGNpX25hbWUocGNpX2RldikgOiAicnQzMDkwIjsKLSNlbHNlCi0JcHJpbnRfbmFtZSA9IHBjaV9kZXYgPyBwY2lfZGV2LT5zbG90X25hbWUgOiAicnQzMDkwIjsKLSNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KLQotCWlmICgocnYgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaV9kZXYsIHByaW50X25hbWUpKSAhPSAwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUmVxdWVzdCBQQ0kgcmVzb3VyY2UgZmFpbGVkLCBlcnJubz0lZCFcbiIsIHJ2KSk7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQkvLyBtYXAgcGh5c2ljYWwgYWRkcmVzcyB0byB2aXJ0dWFsIGFkZHJlc3MgZm9yIGFjY2Vzc2luZyByZWdpc3RlcgotCWNzcl9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLCBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApKTsKLQlpZiAoIWNzcl9hZGRyKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiaW9yZW1hcCBmYWlsZWQgZm9yIGRldmljZSAlcywgcmVnaW9uIDB4JWxYIEAgMHglbFhcbiIsCi0JCQkJCXByaW50X25hbWUsIChVTE9ORylwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApLCAoVUxPTkcpcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApKSk7Ci0JCWdvdG8gZXJyX291dF9mcmVlX3JlczsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6IGF0IDB4JWx4LCBWQSAweCVseCwgSVJRICVkLiBcbiIsICBwcmludF9uYW1lLAotCQkJCQkoVUxPTkcpcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLCAoVUxPTkcpY3NyX2FkZHIsIHBjaV9kZXYtPmlycSkpOwotCX0KLQotCS8vIFNldCBETUEgbWFzdGVyCi0JcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7Ci0KLQotLy9SdG1wRGV2SW5pdD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkvLyBBbGxvY2F0ZSBSVE1QX0FEQVBURVIgYWRhcHRlciBzdHJ1Y3R1cmUKLQloYW5kbGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb3NfY29va2llKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGhhbmRsZSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMoKTogQWxsb2NhdGUgbWVtb3J5IGZvciBvcyBoYW5kbGUgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCWdvdG8gZXJyX291dF9pb3VubWFwOwotCX0KLQotCSgoUE9TX0NPT0tJRSloYW5kbGUpLT5wY2lfZGV2ID0gcGNpX2RldjsKLQotCXJ2ID0gUlRNUEFsbG9jQWRhcHRlckJsb2NrKGhhbmRsZSwgJnBBZCk7CS8vc2hpYW5nOiB3ZSBtYXkgbmVlZCB0aGUgcGNpX2RldiBmb3IgYWxsb2NhdGUgc3RydWN0dXJlIG9mICJSVE1QX0FEQVBURVIiCi0JaWYgKHJ2ICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCWdvdG8gZXJyX291dF9pb3VubWFwOwotCS8vIEhlcmUgYXJlIHRoZSBSVE1QX0FEQVBURVIgc3RydWN0dXJlIHdpdGggcGNpLWJ1cyBzcGVjaWZpYyBwYXJhbWV0ZXJzLgotCXBBZC0+Q1NSQmFzZUFkZHJlc3MgPSAoUFVDSEFSKWNzcl9hZGRyOwotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBBZC0+Q1NSQmFzZUFkZHJlc3MgPTB4JWx4LCBjc3JfYWRkcj0weCVseCFcbiIsIChVTE9ORylwQWQtPkNTUkJhc2VBZGRyZXNzLCBjc3JfYWRkcikpOwotCVJ0bXBSYURldkN0cmxJbml0KHBBZCwgUlRNUF9ERVZfSU5GX1BDSSk7Ci0KLQotLy9OZXREZXZJbml0PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCW5ldF9kZXYgPSBSdG1wUGh5TmV0RGV2SW5pdChwQWQsICZuZXREZXZIb29rKTsKLQlpZiAobmV0X2RldiA9PSBOVUxMKQotCQlnb3RvIGVycl9vdXRfZnJlZV9yYWRldjsKLQotCS8vIEhlcmUgYXJlIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZSB3aXRoIHBjaS1idXMgc3BlY2lmaWMgcGFyYW1ldGVycy4KLQluZXRfZGV2LT5pcnEgPSBwY2lfZGV2LT5pcnE7CQkvLyBJbnRlcnJ1cHQgSVJRIG51bWJlcgotCW5ldF9kZXYtPmJhc2VfYWRkciA9IGNzcl9hZGRyOwkJLy8gU2F2ZSBDU1IgdmlydHVhbCBhZGRyZXNzIGFuZCBpcnEgdG8gZGV2aWNlIHN0cnVjdHVyZQotCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBuZXRfZGV2KTsJLy8gU2V0IGRyaXZlciBkYXRhCi0KLSNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotLyogZm9yIHN1cHBvcnRpbmcgTmV0d29yayBNYW5hZ2VyICovCi0JLyogU2V0IHRoZSBzeXNmcyBwaHlzaWNhbCBkZXZpY2UgcmVmZXJlbmNlIGZvciB0aGUgbmV0d29yayBsb2dpY2FsIGRldmljZQotCSAgKiBpZiBzZXQgcHJpb3IgdG8gcmVnaXN0cmF0aW9uIHdpbGwgY2F1c2UgYSBzeW1saW5rIGR1cmluZyBpbml0aWFsaXphdGlvbi4KLQkgKi8KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKLQlTRVRfTkVUREVWX0RFVihuZXRfZGV2LCAmKHBjaV9kZXYtPmRldikpOwotI2VuZGlmCi0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotCi0vL0FsbCBkb25lLCBpdCdzIHRpbWUgdG8gcmVnaXN0ZXIgdGhlIG5ldCBkZXZpY2UgdG8gbGludXgga2VybmVsLgotCS8vIFJlZ2lzdGVyIHRoaXMgZGV2aWNlCi0JcnYgPSBSdG1wT1NOZXREZXZBdHRhY2gobmV0X2RldiwgJm5ldERldkhvb2spOwotCWlmIChydikKLQkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JcEFkLT5TdGFDZmcuT3JpRGV2VHlwZSA9IG5ldF9kZXYtPnR5cGU7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi1SVE1QSW5pdFBDSWVEZXZpY2UocGNpX2RldiwgcEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX3Byb2JlXG4iKSk7Ci0KLQlyZXR1cm4gMDsgLy8gcHJvYmUgb2sKLQotCi0JLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVSUk9SIEhBTkRMRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWVycl9vdXRfZnJlZV9uZXRkZXY6Ci0JUnRtcE9TTmV0RGV2RnJlZShuZXRfZGV2KTsKLQotZXJyX291dF9mcmVlX3JhZGV2OgotCS8qIGZyZWUgUlRNUF9BREFQVEVSIHN0cmN1dHVyZSBhbmQgb3NfY29va2llKi8KLQlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKLQotZXJyX291dF9pb3VubWFwOgotCWlvdW5tYXAoKHZvaWQgKikoY3NyX2FkZHIpKTsKLQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLCBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApKTsKLQotZXJyX291dF9mcmVlX3JlczoKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBjaV9kZXYpOwotCi1lcnJfb3V0OgotCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjw9PT0gcnQyODYwX3Byb2JlIGZhaWxlZCB3aXRoIHJ2ID0gJWQhXG4iLCBydikpOwotCi0JcmV0dXJuIC1FTk9ERVY7IC8qIHByb2JlIGZhaWwgKi8KLX0KLQotCi1zdGF0aWMgVk9JRCBfX2RldmV4aXQgcnQyODYwX3JlbW92ZV9vbmUoCi0gICAgSU4gIHN0cnVjdCBwY2lfZGV2ICAqcGNpX2RldikKLXsKLQlQTkVUX0RFVgluZXRfZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOwotCVJUTVBfQURBUFRFUgkqcEFkID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYobmV0X2Rldik7Ci0JVUxPTkcJCQljc3JfYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsgLy8gcEFkLT5DU1JCYXNlQWRkcmVzczsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3JlbW92ZV9vbmVcbiIpKTsKLQotCWlmIChwQWQgIT0gTlVMTCkKLQl7Ci0JCS8vIFVucmVnaXN0ZXIvRnJlZSBhbGwgYWxsb2NhdGVkIG5ldF9kZXZpY2UuCi0JCVJ0bXBQaHlOZXREZXZFeGl0KHBBZCwgbmV0X2Rldik7Ci0KLQkJLy8gVW5tYXAgQ1NSIGJhc2UgYWRkcmVzcwotCQlpb3VubWFwKChjaGFyICopKGNzcl9hZGRyKSk7Ci0KLQkJLy8gcmVsZWFzZSBtZW1vcnkgcmVnaW9uCi0JCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksIHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCkpOwotCi0JCS8vIEZyZWUgUlRNUF9BREFQVEVSIHJlbGF0ZWQgc3RydWN0dXJlcy4KLQkJUnRtcFJhRGV2Q3RybEV4aXQocEFkKTsKLQotCX0KLQllbHNlCi0JewotCQkvLyBVbnJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlCi0JCVJ0bXBPU05ldERldkRldGFjaChuZXRfZGV2KTsKLQotCQkvLyBVbm1hcCBDU1IgYmFzZSBhZGRyZXNzCi0JCWlvdW5tYXAoKGNoYXIgKikobmV0X2Rldi0+YmFzZV9hZGRyKSk7Ci0KLQkJLy8gcmVsZWFzZSBtZW1vcnkgcmVnaW9uCi0JCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksIHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCkpOwotCX0KLQotCS8vIEZyZWUgdGhlIHJvb3QgbmV0X2RldmljZQotCVJ0bXBPU05ldERldkZyZWUobmV0X2Rldik7Ci0KLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIENoZWNrIHRoZSBjaGlwc2V0IHZlbmRvci9wcm9kdWN0IElELgotCi1Bcmd1bWVudHM6Ci0gICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQotCi1SZXR1cm4gVmFsdWU6Ci0gICAgVFJVRQkJCQlDaGVjayBvawotCUZBTFNFCQkJCUNoZWNrIGZhaWwKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4gUlQyOFhYQ2hpcHNldENoZWNrKAotCUlOIHZvaWQgKl9kZXZfcCkKLXsKLQkvKiBhbHdheXMgVFJVRSAqLwotCXJldHVybiBUUlVFOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqCVBDSWUgZGV2aWNlIGluaXRpYWxpemF0aW9uIHJlbGF0ZWQgcHJvY2VkdXJlcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIHN0YXRpYyBWT0lEIFJUTVBJbml0UENJZURldmljZSgKLSAgICBJTiAgc3RydWN0IHBjaV9kZXYgICAqcGNpX2RldiwKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgICBwQWQpCi17Ci0JVVNIT1JUICBkZXZpY2VfaWQ7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQlwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBQQ0lfREVWSUNFX0lELCAmZGV2aWNlX2lkKTsKLQlkZXZpY2VfaWQgPSBsZTJjcHUxNihkZXZpY2VfaWQpOwotCXBPYmotPkRldmljZUlEID0gZGV2aWNlX2lkOwotCWlmICgKLSNpZmRlZiBSVDMwOTAKLQkJKGRldmljZV9pZCA9PSBOSUMzMDkwX1BDSWVfREVWSUNFX0lEKSB8fAotCQkoZGV2aWNlX2lkID09IE5JQzMwOTFfUENJZV9ERVZJQ0VfSUQpIHx8Ci0JCShkZXZpY2VfaWQgPT0gTklDMzA5Ml9QQ0llX0RFVklDRV9JRCkgfHwKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLQkJIDApCi0JewotCQlVSU5UMzIgTWFjQ3NyMCA9IDAsIEluZGV4PSAwOwotCQlkbwotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19DU1IwLCAmTWFjQ3NyMCk7Ci0KLQkJCWlmICgoTWFjQ3NyMCAhPSAweDAwKSAmJiAoTWFjQ3NyMCAhPSAweEZGRkZGRkZGKSkKLQkJCQlicmVhazsKLQotCQkJUlRNUHVzZWNEZWxheSgxMCk7Ci0JCX0gd2hpbGUgKEluZGV4KysgPCAxMDApOwotCi0JCS8vIFN1cHBvcnQgYWR2YW5jZWQgcG93ZXIgc2F2ZSBhZnRlciAyODkyLzI3OTAuCi0JCS8vIE1BQyB2ZXJzaW9uIGF0IG9mZnNldCAweDEwMDAgaXMgMHgyODcyWFhYWC8weDI4NzBYWFhYKFBDSWUsIFVTQiwgU0RJTykuCi0JCWlmICgoTWFjQ3NyMCYweGZmZmYwMDAwKSAhPSAweDI4NjAwMDAwKQotCQl7Ci0JCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpOwotCQl9Ci0JfQotfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1WT0lEIFJUTVBJbml0UENJZUxpbmtDdHJsVmFsdWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0gICAgSU5UICAgICBwb3M7Ci0gICAgVVNIT1JUCXJlZzE2LCBkYXRhMiwgUENJZVBvd2VyU2F2ZUxldmVsLCBDb25maWd1cmF0aW9uOwotCVVJTlQzMiBNYWNWYWx1ZTsKLSAgICBCT09MRUFOCWJGaW5kSW50ZWwgPSBGQUxTRTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKLQkJcmV0dXJuOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMuPT09PlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JLy8gSW5pdCBFRVBST00sIGFuZCBzYXZlIHNldHRpbmdzCi0JaWYgKCEoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpKQotCXsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDIyLCBQQ0llUG93ZXJTYXZlTGV2ZWwpOwotCQlwQWQtPlBDSWVQb3dlclNhdmVMZXZlbCA9IFBDSWVQb3dlclNhdmVMZXZlbCAmIDB4ZmY7Ci0JCXBBZC0+TG5rQ3RybEJpdE1hc2sgPSAwOwotCQlpZiAoKFBDSWVQb3dlclNhdmVMZXZlbCYweGZmKSA9PSAweGZmKQotCQl7Ci0JCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBQQ0llUG93ZXJTYXZlTGV2ZWwgPSAweCV4LlxuIiwgUENJZVBvd2VyU2F2ZUxldmVsKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQllbHNlCi0JewotCQlQQ0llUG93ZXJTYXZlTGV2ZWwgJj0gMHgzOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MjQsIGRhdGEyKTsKLQotCQlpZiggISgoKGRhdGEyJjB4ZmYwMCkgPT0gMHg5MjAwKSAmJiAoKGRhdGEyJjB4ODApICE9MCkpICkKLQkJewotCQkJaWYgKFBDSWVQb3dlclNhdmVMZXZlbCA+IDEgKQotCQkJCVBDSWVQb3dlclNhdmVMZXZlbCA9IDE7Ci0JCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBXcml0ZSAweDgzID0gMHgleC5cbiIsIFBDSWVQb3dlclNhdmVMZXZlbCkpOwotCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4ODMsIDB4ZmYsIChVQ0hBUilQQ0llUG93ZXJTYXZlTGV2ZWwsIDB4MDApOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MjIsIFBDSWVQb3dlclNhdmVMZXZlbCk7Ci0JCVBDSWVQb3dlclNhdmVMZXZlbCAmPSAweGZmOwotCQlQQ0llUG93ZXJTYXZlTGV2ZWwgPSBQQ0llUG93ZXJTYXZlTGV2ZWwgPj4gNjsKLQkJc3dpdGNoKFBDSWVQb3dlclNhdmVMZXZlbCkKLQkJewotCQkJCWNhc2UgMDoJLy8gT25seSBzdXBwb3J0IEwwCi0JCQkJCXBBZC0+TG5rQ3RybEJpdE1hc2sgPSAwOwotCQkJCWJyZWFrOwotCQkJCWNhc2UgMToJLy8gT25seSBlbmFibGUgTDBzCi0JCQkJCXBBZC0+TG5rQ3RybEJpdE1hc2sgPSAxOwotCQkJCWJyZWFrOwotCQkJCWNhc2UgMjoJLy8gZW5hYmxlIEwxLCBMMHMKLQkJCQkJcEFkLT5MbmtDdHJsQml0TWFzayA9IDM7Ci0JCQkJYnJlYWs7Ci0JCQkJY2FzZSAzOgkvLyBzeW5jIHdpdGggaG9zdCBjbGsgYW5kIGVuYWJsZSBMMSwgTDBzCi0JCQkJcEFkLT5MbmtDdHJsQml0TWFzayA9IDB4MTAzOwotCQkJCWJyZWFrOwotCQl9Ci0JCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MjQsIGRhdGEyKTsKLQkJCWlmICgoUENJZVBvd2VyU2F2ZUxldmVsJjB4ZmYpICE9IDB4ZmYpCi0JCQl7Ci0JCQkJUENJZVBvd2VyU2F2ZUxldmVsICY9IDB4MzsKLQotCQkJCWlmKCAhKCgoZGF0YTImMHhmZjAwKSA9PSAweDkyMDApICYmICgoZGF0YTImMHg4MCkgIT0wKSkgKQotCQkJCXsKLQkJCQkJaWYgKFBDSWVQb3dlclNhdmVMZXZlbCA+IDEgKQotCQkJCQkJUENJZVBvd2VyU2F2ZUxldmVsID0gMTsKLQkJCQl9Ci0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBydDI4eHggV3JpdGUgMHg4MyBDb21tYW5kID0gMHgleC5cbiIsIFBDSWVQb3dlclNhdmVMZXZlbCkpOwotCQkJCQkgICAgICAgcHJpbnRrKCJcblxuXG4lczolZFxuIixfX0ZVTkNUSU9OX18sX19MSU5FX18pOwotCi0JCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDgzLCAweGZmLCAoVUNIQVIpUENJZVBvd2VyU2F2ZUxldmVsLCAweDAwKTsKLQkJCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gTG5rQ3RybEJpdE1hc2sgPSAweCV4LlxuIiwgcEFkLT5MbmtDdHJsQml0TWFzaykpOwotCX0KLQl9Ci0JZWxzZSBpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCi0JewotCQlVQ0hBUglMaW5rQ3RybFNldHRpbmcgPSAwOwotCi0JCS8vIENoZWNrIDMwOTBFIHNwZWNpYWwgc2V0dGluZyBjaGlwLgotCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDI0LCBkYXRhMik7Ci0JCWlmICgoZGF0YTIgPT0gMHg5MjgwKSAmJiAoKHBBZC0+TUFDVmVyc2lvbiYweGZmZmYpID09IDB4MDIxMSkpCi0JCXsKLQkJCXBBZC0+YjMwOTBFU3BlY2lhbENoaXAgPSBUUlVFOwotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiU3BlY2lhbCAzMDkwRSBjaGlwIFxuIikpOwotCQl9Ci0KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBBVVhfQ1RSTCwgJk1hY1ZhbHVlKTsKLQkJLy9lbmFibGUgV0FLRV9QQ0lFIGZ1bmN0aW9uLCB3aGljaCBmb3JjZXMgdG8gZW5hYmxlIFBDSUUgY2xvY2sgd2hlbiBtcHUgaW50ZXJydXB0IGFzc2VydGluZy4KLQkJLy9Gb3JjZSBQQ0lFIDEyNU1IeiBDTEsgdG8gdG9nZ2xlCi0JCU1hY1ZhbHVlIHw9IDB4NDAyOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVhfQ1RSTCwgTWFjVmFsdWUpOwotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCIgQVVYX0NUUkwgPSAweCUzMnhcbiIsIE1hY1ZhbHVlKSk7Ci0KLQotCi0JCS8vIGZvciBSVDMweHggRiBhbmQgYWZ0ZXIsIFBDSWUgaW5mdGVyZmFjZSwgYW5kIGZvciBwb3dlciBzb2x1dGlvbiAzCi0JCWlmICgoSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpCi0JCQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA+PSAyKQotCQkJJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPD0gMykpCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgQVVYX0NUUkwsICZNYWNWYWx1ZSk7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCIgUmVhZCBBVVhfQ1RSTCA9IDB4JXhcbiIsIE1hY1ZhbHVlKSk7Ci0JCQkvLyB0dXJuIG9uIGJpdCAxMi4KLQkJCS8vZW5hYmxlIDMyS0h6IGNsb2NrIG1vZGUgZm9yIHBvd2VyIHNhdmluZwotCQkJTWFjVmFsdWUgfD0gMHgxMDAwOwotCQkJaWYgKE1hY1ZhbHVlICE9IDB4ZmZmZmZmZmYpCi0JCQl7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVYX0NUUkwsIE1hY1ZhbHVlKTsKLQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCIgV3JpdGUgQVVYX0NUUkwgPSAweCV4XG4iLCBNYWNWYWx1ZSkpOwotCQkJCS8vIDEuIGlmIHVzZSBQQ0llUG93ZXJTZXR0aW5nIGlzIDIgb3IgMywgbmVlZCB0byBwcm9ncmFtIE9TQ19DVFJMIHRvIDB4M2ZmMTEuCi0JCQkJTWFjVmFsdWUgPSAweDNmZjExOwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE9TQ19DVFJMLCBNYWNWYWx1ZSk7Ci0JCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiIE9TQ19DVFJMID0gMHgleFxuIiwgTWFjVmFsdWUpKTsKLQkJCQkvLyAyLiBXcml0ZSBQQ0kgcmVnaXN0ZXIgQ2xrIHJlZiBiaXQKLQkJCQlSVE1QcnQzeFNldFBDSWVQb3dlckxpbmtDdHJsKHBBZCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gRXJyb3IgcmVhZCBBdXhfQ3RybCB2YWx1ZS4gIEZvcmNlIHRvIHVzZSBzb2x1dGlvbiAxCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCIgRXJyb3IgVmFsdWUgaW4gQVVYX0NUUkwgPSAweCV4XG4iLCBNYWNWYWx1ZSkpOwotCQkJCXBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPSAxOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiIEZvcmNlIHRvIHVzZSBwb3dlciBzb2x1dGlvbjEgXG4iKSk7Ci0JCQl9Ci0JCX0KLQkJLy8gMS4gcmVhZCBzZXR0aW5nIGZyb20gaW5mIGZpbGUuCi0KLQkJUENJZVBvd2VyU2F2ZUxldmVsID0gKFVTSE9SVClwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlOwotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI9PT09PiBydDMweHggUmVhZCBQb3dlckxldmVsTW9kZSA9ICAweCV4LlxuIiwgUENJZVBvd2VyU2F2ZUxldmVsKSk7Ci0JCS8vIDIuIENoZWNrIEVuYWJsZU5ld1BTLgotCQlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IEZBTFNFKQotCQkJUENJZVBvd2VyU2F2ZUxldmVsID0gMTsKLQotCQlpZiAoSVNfVkVSU0lPTl9CRUZPUkVfRihwQWQpICYmIChwQWQtPmIzMDkwRVNwZWNpYWxDaGlwID09IEZBTFNFKSkKLQkJewotCQkJLy8gQ2hpcCBWZXJzaW9uIEUgb25seSBhbGxvdyAxLCBTbyBmb3JjZSBzZXQgMS4KLQkJCVBDSWVQb3dlclNhdmVMZXZlbCAmPSAweDE7Ci0JCQlwQWQtPlBDSWVQb3dlclNhdmVMZXZlbCA9IChVU0hPUlQpUENJZVBvd2VyU2F2ZUxldmVsOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gcnQzMHh4IEUgV3JpdGUgMHg4MyBDb21tYW5kID0gMHgleC5cbiIsIFBDSWVQb3dlclNhdmVMZXZlbCkpOwotCi0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4ODMsIDB4ZmYsIChVQ0hBUilQQ0llUG93ZXJTYXZlTGV2ZWwsIDB4MDApOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gQ2hpcCBWZXJzaW9uIEYgYW5kIGFmdGVyIG9ubHkgYWxsb3cgMSBvciAyIG9yIDMuIFRoaXMgbWlnaHQgYmUgbW9kaWZpZWQgYWZ0ZXIgbmV3IGNoaXAgdmVyc2lvbiBjb21lIG91dC4KLQkJCWlmICghKChQQ0llUG93ZXJTYXZlTGV2ZWwgPT0gMSkgfHwgKFBDSWVQb3dlclNhdmVMZXZlbCA9PSAzKSkpCi0JCQkJUENJZVBvd2VyU2F2ZUxldmVsID0gMTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj09PT0+IHJ0MzB4eCBGIFdyaXRlIDB4ODMgQ29tbWFuZCA9IDB4JXguXG4iLCBQQ0llUG93ZXJTYXZlTGV2ZWwpKTsKLQkJCXBBZC0+UENJZVBvd2VyU2F2ZUxldmVsID0gKFVTSE9SVClQQ0llUG93ZXJTYXZlTGV2ZWw7Ci0JCQkvLyBmb3IgMzA5MEYgLCB3ZSBuZWVkIHRvIGFkZCBoaWdoLWJ5dGUgYXJnIGZvciAweDgzIGNvbW1hbmQgdG8gaW5kaWNhdGUgdGhlIGxpbmsgY29udHJvbCBzZXR0aW5nIGluCi0JCQkvLyBQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZS4gQmVjYXVzZSBmaXJtd2FyZSBjYW4ndCByZWFkIFBDSSBDb25maWd1cmF0aW9uIFNwYWNlCi0JCQlpZiAoKHBBZC0+UnQzeHhSYWxpbmtMaW5rQ3RybCAmIDB4MikgJiYgKHBBZC0+UnQzeHhIb3N0TGlua0N0cmwgJiAweDIpKQotCQkJewotCQkJCUxpbmtDdHJsU2V0dGluZyA9IDE7Ci0JCQl9Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBydDMweHhGIExpbmtDdHJsU2V0dGluZyA9IDB4JXguXG4iLCBMaW5rQ3RybFNldHRpbmcpKTsKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg4MywgMHhmZiwgKFVDSEFSKVBDSWVQb3dlclNhdmVMZXZlbCwgTGlua0N0cmxTZXR0aW5nKTsKLQkJfQotCi0JfQotCi0gICAgLy8gRmluZCBSYWxpbmsgUENJZSBEZXZpY2UncyBFeHByZXNzIENhcGFiaWxpdHkgT2Zmc2V0Ci0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwT2JqLT5wY2lfZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7Ci0KLSAgICBpZiAocG9zICE9IDApCi0gICAgewotICAgICAgICAvLyBSYWxpbmsgUENJZSBEZXZpY2UncyBMaW5rIENvbnRyb2wgUmVnaXN0ZXIgT2Zmc2V0Ci0gICAgICAgIHBBZC0+Ukxua0N0cmxPZmZzZXQgPSBwb3MgKyBQQ0lfRVhQX0xOS0NUTDsKLQlwY2lfcmVhZF9jb25maWdfd29yZChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LCAmcmVnMTYpOwotICAgICAgICBDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOwotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWFkIChSYWxpbmsgUENJZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpIG9mZnNldCAweCV4ID0gMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Ukxua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKLSAgICAgICAgcEFkLT5STG5rQ3RybENvbmZpZ3VyYXRpb24gPSAoQ29uZmlndXJhdGlvbiAmIDB4MTAzKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7Ci0gICAgICAgIENvbmZpZ3VyYXRpb24gfD0gKDB4MCk7Ci0KLSAgICAgICAgUlRNUEZpbmRIb3N0UENJRGV2KHBBZCk7Ci0gICAgICAgIGlmIChwT2JqLT5wYXJlbnRfcGNpX2RldikKLSAgICAgICAgewotCQlVU0hPUlQgIHZlbmRvcl9pZDsKLQotCQlwY2lfcmVhZF9jb25maWdfd29yZChwT2JqLT5wYXJlbnRfcGNpX2RldiwgUENJX1ZFTkRPUl9JRCwgJnZlbmRvcl9pZCk7Ci0JCXZlbmRvcl9pZCA9IGxlMmNwdTE2KHZlbmRvcl9pZCk7Ci0JCWlmICh2ZW5kb3JfaWQgPT0gUENJQlVTX0lOVEVMX1ZFTkRPUikKLSAgICAgICAgICAgICAgICAgewotCQkJYkZpbmRJbnRlbCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSVE1QX1NFVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19UT0dHTEVfTDEpOwotICAgICAgICAgICAgICAgICB9Ci0JCS8qCi0JCWVsc2UgaWYgKCh2ZW5kb3JfaWQgPT0gUENJQlVTX0FNRF9WRU5ET1IxKQotCQkJCQkmJiAoRGV2aWNlSUQgPT0gMHg5NjAwMDAwMCkpCi0JCQkJewotCQkJCQkvL1ZlcmlmaWVkIDI3OTIgQXNwaXJlIDg1MzAgQU1EIE5CIChTMy9TNC9DQm9vdC9XQm9vdC9DaGFyaW90KSBieSBjdXN0b21lciBhbmQgb3Vyc2VsdmVzLgotCQkJCQkvLyBTbyB1c2UgTDEgVG9nZ2xlIG1ldGhvZCBpbiB0aGlzIE5CLgotCQkJYkZpbmRJbnRlbCA9IFRSVUU7Ci0JCQkJCVJUTVBfU0VUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX1RPR0dMRV9MMSk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBTTSA6IEFzcGlyZSA4NTMwIEFNRCBOQi4gVXNlIEwxIFRvZ2dsZS4gXG4iKSk7Ci0JCQkJfQotCQkqLwotCQkvLyBGaW5kIFBDSS10by1QQ0kgQnJpZGdlIEV4cHJlc3MgQ2FwYWJpbGl0eSBPZmZzZXQKLQkJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwT2JqLT5wYXJlbnRfcGNpX2RldiwgUENJX0NBUF9JRF9FWFApOwotCi0JCWlmIChwb3MgIT0gMCkKLQkJewotCQkJQk9PTEVBTgkJYkNoYW5nZSA9IEZBTFNFOwotCQkJLy8gUENJLXRvLVBDSSBCcmlkZ2UgTGluayBDb250cm9sIFJlZ2lzdGVyIE9mZnNldAotCQkJcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCA9IHBvcyArIFBDSV9FWFBfTE5LQ1RMOwotCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQocE9iai0+cGFyZW50X3BjaV9kZXYsIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsICZyZWcxNik7Ci0JCQlDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVhZCAoSG9zdCBQQ0ktdG8tUENJIEJyaWRnZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpIG9mZnNldCAweCV4ID0gMHgleFxuIiwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7Ci0JCQlwQWQtPkhvc3RMbmtDdHJsQ29uZmlndXJhdGlvbiA9IChDb25maWd1cmF0aW9uICYgMHgxMDMpOwotCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7Ci0JCQlDb25maWd1cmF0aW9uIHw9ICgweDApOwotCi0JCQlzd2l0Y2ggKHBPYmotPkRldmljZUlEKQotCQkJewotI2lmZGVmIFJUMzA5MAotCQkJCWNhc2UgTklDMzA5MF9QQ0llX0RFVklDRV9JRDoKLQkJCQljYXNlIE5JQzMwOTFfUENJZV9ERVZJQ0VfSUQ6Ci0JCQkJY2FzZSBOSUMzMDkyX1BDSWVfREVWSUNFX0lEOgotCQkJCQlpZiAoYkZpbmRJbnRlbCA9PSBGQUxTRSkKLQkJCQkJCWJDaGFuZ2UgPSBUUlVFOwotCQkJCQlicmVhazsKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGJDaGFuZ2UpCi0JCQl7Ci0JCQkJcmVnMTYgPSBjcHUybGUxNihDb25maWd1cmF0aW9uKTsKLQkJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocE9iai0+cGFyZW50X3BjaV9kZXYsIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsIHJlZzE2KTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcml0ZSAoSG9zdCBQQ0ktdG8tUENJIEJyaWRnZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpIG9mZnNldCAweCV4ID0gMHgleFxuIiwKLQkJCQkJCXBBZC0+SG9zdExua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+SG9zdExua0N0cmxPZmZzZXQgPSAwOwotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IGNhbm5vdCBmaW5kIFBDSS10by1QQ0kgQnJpZGdlIFBDSSBFeHByZXNzIENhcGFiaWxpdHkhXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBBZC0+Ukxua0N0cmxPZmZzZXQgPSAwOwotICAgICAgICBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0ID0gMDsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IGNhbm5vdCBmaW5kIFJhbGluayBQQ0llIERldmljZSdzIFBDSSBFeHByZXNzIENhcGFiaWxpdHkhXG4iLCBfX0ZVTkNUSU9OX18pKTsKLSAgICB9Ci0KLSAgICBpZiAoYkZpbmRJbnRlbCA9PSBGQUxTRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRvZXNuJ3QgZmluZCBJbnRlbCBQQ0kgaG9zdCBjb250cm9sbGVyLiBcbiIpKTsKLQkJLy8gRG9lc24ndCBzd2l0Y2ggTDAsIEwxLCBTbyBzZXQgUENJZVBvd2VyU2F2ZUxldmVsIHRvIDB4ZmYKLQkJcEFkLT5QQ0llUG93ZXJTYXZlTGV2ZWwgPSAweGZmOwotCQlpZiAoKHBBZC0+Ukxua0N0cmxPZmZzZXQgIT0gMCkKLSNpZmRlZiBSVDMwOTAKLQkJCSYmICgocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5MF9QQ0llX0RFVklDRV9JRCkKLQkJCQl8fChwT2JqLT5EZXZpY2VJRCA9PSBOSUMzMDkxX1BDSWVfREVWSUNFX0lEKQotCQkJCXx8KHBPYmotPkRldmljZUlEID09IE5JQzMwOTJfUENJZV9ERVZJQ0VfSUQpKQotI2VuZGlmIC8vIFJUMzA5MCAvLwotCQkpCi0JCXsKLQkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsICZyZWcxNik7Ci0JCQlDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVhZCAoUmFsaW5rIDMweHggUENJZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpIG9mZnNldCAweCV4ID0gMHgleFxuIiwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Ukxua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKLQkJCXBBZC0+Ukxua0N0cmxDb25maWd1cmF0aW9uID0gKENvbmZpZ3VyYXRpb24gJiAweDEwMyk7Ci0JCQlDb25maWd1cmF0aW9uICY9IDB4ZmVmYzsKLQkJCUNvbmZpZ3VyYXRpb24gfD0gKDB4MCk7Ci0JCQlyZWcxNiA9IGNwdTJsZTE2KENvbmZpZ3VyYXRpb24pOwotCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsIHJlZzE2KTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldyaXRlIChSYWxpbmsgUENJZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpICBvZmZzZXQgMHgleCA9IDB4JXhcbiIsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKyBQQ0lfRVhQX0xOS0NUTCwgQ29uZmlndXJhdGlvbikpOwotCQl9Ci0JfQotfQotCi1WT0lEIFJUTVBGaW5kSG9zdFBDSURldigKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLSAgICBVU0hPUlQgIHJlZzE2OwotICAgIFVDSEFSICAgcmVnODsKLQlVSU5UCURldkZuOwotICAgIFBQQ0lfREVWICAgIHBQY2lfZGV2OwotCVBPU19DT09LSUUJcE9iajsKLQotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQotCQlyZXR1cm47Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcy49PT0+XG4iLCBfX0ZVTkNUSU9OX18pKTsKLQotICAgIHBPYmotPnBhcmVudF9wY2lfZGV2ID0gTlVMTDsKLSAgICBpZiAocE9iai0+cGNpX2Rldi0+YnVzLT5wYXJlbnQpCi0gICAgewotICAgICAgICBmb3IgKERldkZuID0gMDsgRGV2Rm4gPCAyNTU7IERldkZuKyspCi0gICAgICAgIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCi0gICAgICAgICAgICBwUGNpX2RldiA9IHBjaV9nZXRfc2xvdChwT2JqLT5wY2lfZGV2LT5idXMtPnBhcmVudCwgRGV2Rm4pOwotI2Vsc2UKLSAgICAgICAgICAgIHBQY2lfZGV2ID0gcGNpX2ZpbmRfc2xvdChwT2JqLT5wY2lfZGV2LT5idXMtPnBhcmVudC0+bnVtYmVyLCBEZXZGbik7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmIChwUGNpX2RldikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwY2lfcmVhZF9jb25maWdfd29yZChwUGNpX2RldiwgUENJX0NMQVNTX0RFVklDRSwgJnJlZzE2KTsKLSAgICAgICAgICAgICAgICByZWcxNiA9IGxlMmNwdTE2KHJlZzE2KTsKLSAgICAgICAgICAgICAgICBwY2lfcmVhZF9jb25maWdfYnl0ZShwUGNpX2RldiwgUENJX0NCX0NBUkRfQlVTLCAmcmVnOCk7Ci0gICAgICAgICAgICAgICAgaWYgKChyZWcxNiA9PSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHJlZzggPT0gcE9iai0+cGNpX2Rldi0+YnVzLT5udW1iZXIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcE9iai0+cGFyZW50X3BjaV9kZXYgPSBwUGNpX2RldjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCQlMZXZlbCA9IFJFU1RPUkVfSEFMVCA6IFJlc3RvcmUgUENJIGhvc3QgYW5kIFJhbGluayBQQ0llIExpbmsgQ29udHJvbCBmaWVsZCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KLQkJTGV2ZWwgPSBPdGhlciBWYWx1ZSA6IFJlc3RvcmUgZnJvbSBkb3QxMSBwb3dlciBzYXZlIG9yIHJhZGlvIG9mZiBzdGF0dXMuIEFuZCBmb3JjZSBQQ0kgaG9zdCBMaW5rIENvbnRyb2wgZmllbGRzIHRvIDB4MQotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgVUNIQVIJCUxldmVsKQotewotCVVTSE9SVCAgUENJZVBvd2VyU2F2ZUxldmVsLCByZWcxNjsKLQlVU0hPUlQJQ29uZmlndXJhdGlvbjsKLQlQT1NfQ09PS0lFCXBPYmo7Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKLQkJcmV0dXJuOwotCi0JLy8gQ2hlY2sgUFNDb250cm9sIENvbmZpZ3VyYXRpb24KLQlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IEZBTFNFKQotCQlyZXR1cm4gVFJVRTsKLQotCS8vMzA5MCB3aWxsIG5vdCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29kZXMuCi0JLy8gQ2hlY2sgaW50ZXJmYWNlIDogSWYgbm90IFBDSWUgaW50ZXJmYWNlLCByZXR1cm4uCi0KLSNpZmRlZiBSVDMwOTAKLQlpZiAoKHBPYmotPkRldmljZUlEID09IE5JQzMwOTBfUENJZV9ERVZJQ0VfSUQpCi0JCXx8KHBPYmotPkRldmljZUlEID09IE5JQzMwOTFfUENJZV9ERVZJQ0VfSUQpCi0JCXx8KHBPYmotPkRldmljZUlEID09IE5JQzMwOTJfUENJZV9ERVZJQ0VfSUQpKQotCQlyZXR1cm47Ci0jZW5kaWYgLy8gUlQzMDkwIC8vCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMuPT09PlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JUENJZVBvd2VyU2F2ZUxldmVsID0gcEFkLT5QQ0llUG93ZXJTYXZlTGV2ZWw7Ci0JaWYgKChQQ0llUG93ZXJTYXZlTGV2ZWwmMHhmZikgPT0gMHhmZikKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgicmV0dXJuICBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwT2JqLT5wYXJlbnRfcGNpX2RldiAmJiAocEFkLT5Ib3N0TG5rQ3RybE9mZnNldCAhPSAwKSkKLSAgICB7Ci0gICAgICAgIFBDSV9SRUdfUkVBRF9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKTsKLSAgICAgICAgaWYgKChDb25maWd1cmF0aW9uICE9IDApICYmCi0gICAgICAgICAgICAoQ29uZmlndXJhdGlvbiAhPSAweEZGRkYpKQotICAgICAgICB7Ci0JCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkvLyBJZiBjYWxsIGZyb20gaW50ZXJmYWNlIGRvd24sIHJlc3RvcmUgdG8gb3JnaW5pYWwgc2V0dGluZy4KLQkJaWYgKExldmVsID09IFJFU1RPUkVfQ0xPU0UpCi0JCXsKLQkJCUNvbmZpZ3VyYXRpb24gfD0gcEFkLT5Ib3N0TG5rQ3RybENvbmZpZ3VyYXRpb247Ci0JCX0KLQkJZWxzZQotCQkJQ29uZmlndXJhdGlvbiB8PSAweDA7Ci0gICAgICAgICAgICBQQ0lfUkVHX1dJUlRFX1dPUkQocE9iai0+cGFyZW50X3BjaV9kZXYsIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZXN0b3JlIFBDSSBob3N0IDogb2Zmc2V0IDB4JXggPSAweCV4XG4iLCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUmVzdG9yZSBQQ0kgaG9zdCA6IFBDSV9SRUdfUkVBRF9XT1JEIGZhaWxlZCAoQ29uZmlndXJhdGlvbiA9IDB4JXgpXG4iLCBDb25maWd1cmF0aW9uKSk7Ci0gICAgfQotCi0gICAgaWYgKHBPYmotPnBjaV9kZXYgJiYgKHBBZC0+Ukxua0N0cmxPZmZzZXQgIT0gMCkpCi0gICAgewotICAgICAgICBQQ0lfUkVHX1JFQURfV09SRChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKTsKLSAgICAgICAgaWYgKChDb25maWd1cmF0aW9uICE9IDApICYmCi0gICAgICAgICAgICAoQ29uZmlndXJhdGlvbiAhPSAweEZGRkYpKQotICAgICAgICB7Ci0JCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJLy8gSWYgY2FsbCBmcm9tIGludGVyZmFjZSBkb3duLCByZXN0b3JlIHRvIG9yZ2luaWFsIHNldHRpbmcuCi0JCQlpZiAoTGV2ZWwgPT0gUkVTVE9SRV9DTE9TRSkKLQkJQ29uZmlndXJhdGlvbiB8PSBwQWQtPlJMbmtDdHJsQ29uZmlndXJhdGlvbjsKLQkJCWVsc2UKLQkJCQlDb25maWd1cmF0aW9uIHw9IDB4MDsKLSAgICAgICAgICAgIFBDSV9SRUdfV0lSVEVfV09SRChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVzdG9yZSBSYWxpbmsgOiBvZmZzZXQgMHgleCA9IDB4JXhcbiIsIHBBZC0+Ukxua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSZXN0b3JlIFJhbGluayA6IFBDSV9SRUdfUkVBRF9XT1JEIGZhaWxlZCAoQ29uZmlndXJhdGlvbiA9IDB4JXgpXG4iLCBDb25maWd1cmF0aW9uKSk7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyA8PT09XG4iLCBfX0ZVTkNUSU9OX18pKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0JCU1heCA6IGxpbWl0IEhvc3QgUENJIGFuZCBSYWxpbmsgUENJZSBkZXZpY2UncyBMSU5LIENPTlRST0wgZmllbGQncyB2YWx1ZS4KLQkJQmVjYXVzZSBub3cgZnJlcXVlbnRseSBzZXQgb3VyIGRldmljZSB0byBtb2RlIDEgb3IgbW9kZSAzIHdpbGwgY2F1c2UgcHJvYmxlbS4KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQlNYXgpCi17Ci0JVVNIT1JUICBQQ0llUG93ZXJTYXZlTGV2ZWwsIHJlZzE2OwotCVVTSE9SVAlDb25maWd1cmF0aW9uOwotCVBPU19DT09LSUUJcE9iajsKLQotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQotCQlyZXR1cm47Ci0KLQkvLyBDaGVjayBQU0NvbnRyb2wgQ29uZmlndXJhdGlvbgotCWlmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gRkFMU0UpCi0JCXJldHVybiBUUlVFOwotCi0JLy8gQ2hlY2sgaW50ZXJmYWNlIDogSWYgbm90IFBDSWUgaW50ZXJmYWNlLCByZXR1cm4uCi0JLy9CbG9jayAzMDkwIHRvIGVudGVyIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24KLQotI2lmZGVmIFJUMzA5MAotCWlmICgocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5MF9QQ0llX0RFVklDRV9JRCkKLQkJfHwocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5MV9QQ0llX0RFVklDRV9JRCkKLQkJfHwocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5Ml9QQ0llX0RFVklDRV9JRCkpCi0JCXJldHVybjsKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLQlpZiAoIVJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfSU5GTywgKCJSVE1QUENJZVBvd2VyTGlua0N0cmwgcmV0dXJuIG9uIGZSVE1QX1BTX0NBTl9HT19TTEVFUCBmbGFnXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5cbiIsIF9fRlVOQ1RJT05fXykpOwotCVBDSWVQb3dlclNhdmVMZXZlbCA9IHBBZC0+UENJZVBvd2VyU2F2ZUxldmVsOwotCWlmICgoUENJZVBvd2VyU2F2ZUxldmVsJjB4ZmYpID09IDB4ZmYpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInJldHVybiAgXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0JUENJZVBvd2VyU2F2ZUxldmVsID0gUENJZVBvd2VyU2F2ZUxldmVsPj42OwotCi0gICAgLy8gU2tpcCBub24tZXhpc3QgZGVpY2UgcmlnaHQgYXdheQotCWlmIChwT2JqLT5wYXJlbnRfcGNpX2RldiAmJiAocEFkLT5Ib3N0TG5rQ3RybE9mZnNldCAhPSAwKSkKLQl7Ci0gICAgICAgIFBDSV9SRUdfUkVBRF9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKTsKLQkJc3dpdGNoIChQQ0llUG93ZXJTYXZlTGV2ZWwpCi0JCXsKLQkJCWNhc2UgMDoKLQkJCQkvLyBTZXQgYjAgYW5kIGIxIG9mIExpbmtDb250cm9sIChib3RoIDI4OTIgYW5kIFBDSWUgYnJpZGdlKSB0byAwMAotCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCS8vIFNldCBiMCBhbmQgYjEgb2YgTGlua0NvbnRyb2wgKGJvdGggMjg5MiBhbmQgUENJZSBicmlkZ2UpIHRvIDAxCi0JCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7Ci0JCQkJQ29uZmlndXJhdGlvbiB8PSAweDE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJLy8gIFNldCBiMCBhbmQgYjEgb2YgTGlua0NvbnRyb2wgKGJvdGggMjg5MiBhbmQgUENJZSBicmlkZ2UpIHRvIDExCi0JCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7Ci0JCQkJQ29uZmlndXJhdGlvbiB8PSAweDM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJLy8gU2V0IGIwIGFuZCBiMSBvZiBMaW5rQ29udHJvbCAoYm90aCAyODkyIGFuZCBQQ0llIGJyaWRnZSkgdG8gMTEgYW5kIGJpdCA4IG9mIExpbmtDb250cm9sIG9mIDI4OTIgdG8gMQotCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJCUNvbmZpZ3VyYXRpb24gfD0gMHgxMDM7Ci0JCQkJYnJlYWs7Ci0JCX0KLSAgICAgICAgUENJX1JFR19XSVJURV9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3JpdGUgUENJIGhvc3Qgb2Zmc2V0IDB4JXggPSAweCV4XG4iLCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7Ci0JfQotCi0JaWYgKHBPYmotPnBjaV9kZXYgJiYgKHBBZC0+Ukxua0N0cmxPZmZzZXQgIT0gMCkpCi0JewotCQkvLyBmaXJzdCAyODkyIGNoaXAgbm90IGFsbG93IHRvIGZyZXF1ZW50bHkgc2V0IG1vZGUgMy4gd2lsbCBjYXVzZSBoYW5nIHByb2JsZW0uCi0JCWlmIChQQ0llUG93ZXJTYXZlTGV2ZWwgPiBNYXgpCi0JCQlQQ0llUG93ZXJTYXZlTGV2ZWwgPSBNYXg7Ci0KLSAgICAgICAgUENJX1JFR19SRUFEX1dPUkQocE9iai0+cGNpX2RldiwgcEFkLT5STG5rQ3RybE9mZnNldCwgQ29uZmlndXJhdGlvbik7Ci0JCXN3aXRjaCAoUENJZVBvd2VyU2F2ZUxldmVsKQotCQl7Ci0JCQljYXNlIDA6Ci0JCQkJLy8gTm8gUENJIHBvd2VyIHNhZmUKLQkJCQkvLyBTZXQgYjAgYW5kIGIxIG9mIExpbmtDb250cm9sIChib3RoIDI4OTIgYW5kIFBDSWUgYnJpZGdlKSB0byAwMCAuCi0JCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkJLy8gIEwwCi0JCQkJLy8gU2V0IGIwIGFuZCBiMSBvZiBMaW5rQ29udHJvbCAoYm90aCAyODkyIGFuZCBQQ0llIGJyaWRnZSkgdG8gMDEgLgotCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJCUNvbmZpZ3VyYXRpb24gfD0gMHgxOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCS8vIEwwIGFuZCBMMQotCQkJCS8vICBTZXQgYjAgYW5kIGIxIG9mIExpbmtDb250cm9sIChib3RoIDI4OTIgYW5kIFBDSWUgYnJpZGdlKSB0byAxMQotCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJCUNvbmZpZ3VyYXRpb24gfD0gMHgzOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOgotCQkJCS8vIEwwICwgTDEgYW5kIGNsb2NrIG1hbmFnZW1lbnQuCi0JCQkJLy8gU2V0IGIwIGFuZCBiMSBvZiBMaW5rQ29udHJvbCAoYm90aCAyODkyIGFuZCBQQ0llIGJyaWRnZSkgdG8gMTEgYW5kIGJpdCA4IG9mIExpbmtDb250cm9sIG9mIDI4OTIgdG8gMQotCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJCUNvbmZpZ3VyYXRpb24gfD0gMHgxMDM7Ci0JCSAgICAgICAgICAgICAgcEFkLT5iUENJY2xrT2ZmID0gVFJVRTsKLQkJCQlicmVhazsKLQkJfQotICAgICAgICBQQ0lfUkVHX1dJUlRFX1dPUkQocE9iai0+cGNpX2RldiwgcEFkLT5STG5rQ3RybE9mZnNldCwgQ29uZmlndXJhdGlvbik7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldyaXRlIFJhbGluayBkZXZpY2UgOiBvZmZzZXQgMHgleCA9IDB4JXhcbiIsIHBBZC0+Ukxua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBQQ0llUG93ZXJMaW5rQ3RybCA8PT09PT09PT09PT09PT1cbiIpKTsKLX0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQkxLiBXcml0ZSBhIFBDSSByZWdpc3RlciBmb3IgcnQzMHh4IHBvd2VyIHNvbHV0aW9uIDMKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUHJ0M3hTZXRQQ0llUG93ZXJMaW5rQ3RybCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQotCVVMT05HCUhvc3RDb25maWd1cmF0aW9uOwotCVVMT05HCUNvbmZpZ3VyYXRpb247Ci0JVUxPTkcJVmVuZG9yOwotCVVMT05HCW9mZnNldDsKLQlQT1NfQ09PS0lFCXBPYmo7Ci0JSU5UICAgICBwb3M7Ci0JVVNIT1JUCXJlZzE2OwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX0lORk8sICgiUlRNUHJ0M3hTZXRQQ0llUG93ZXJMaW5rQ3RybC49PT0+ICV4XG4iLCBwQWQtPlN0YUNmZy5QU0NvbnRyb2wud29yZCkpOwotCi0JLy8gQ2hlY2sgUFNDb250cm9sIENvbmZpZ3VyYXRpb24KLQlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IEZBTFNFKQotCQlyZXR1cm47Ci0JUlRNUEZpbmRIb3N0UENJRGV2KHBBZCk7Ci0gICAgICAgIGlmIChwT2JqLT5wYXJlbnRfcGNpX2RldikKLSAgICAgICAgewotCQlVU0hPUlQgIHZlbmRvcl9pZDsKLQkJLy8gRmluZCBQQ0ktdG8tUENJIEJyaWRnZSBFeHByZXNzIENhcGFiaWxpdHkgT2Zmc2V0Ci0JCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkocE9iai0+cGFyZW50X3BjaV9kZXYsIFBDSV9DQVBfSURfRVhQKTsKLQotCQlpZiAocG9zICE9IDApCi0JCXsKLQkJCXBBZC0+SG9zdExua0N0cmxPZmZzZXQgPSBwb3MgKyBQQ0lfRVhQX0xOS0NUTDsKLQkJfQotCS8vIElmIGNvbmZpZ3VyYXJlZCB0byB0dXJuIG9uIEwxLgotCUhvc3RDb25maWd1cmF0aW9uID0gMDsKLQkJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb3JjZUFTUE1UZXN0ID09IDEpCi0JCXsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkVudGVyLFBTTSA6IEZvcmNlIEFTUE0gXG4iKSk7Ci0KLQkJCS8vIFNraXAgbm9uLWV4aXN0IGRlaWNlIHJpZ2h0IGF3YXkKLQkJCWlmICgocEFkLT5Ib3N0TG5rQ3RybE9mZnNldCAhPSAwKSkKLQkJCXsKLQkJCSBQQ0lfUkVHX1JFQURfV09SRChwT2JqLT5wYXJlbnRfcGNpX2RldiwgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwgSG9zdENvbmZpZ3VyYXRpb24pOwotCQkJCS8vIFByZXBhcmUgQ29uZmlndXJhdGlvbiB0byB3cml0ZSB0byBIb3N0Ci0JCQkJSG9zdENvbmZpZ3VyYXRpb24gfD0gMHgzOwotCQkJCVBDSV9SRUdfV0lSVEVfV09SRChwT2JqLT5wYXJlbnRfcGNpX2RldiwgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwgSG9zdENvbmZpZ3VyYXRpb24pOwotCQkJCXBBZC0+UnQzeHhIb3N0TGlua0N0cmwgPSBIb3N0Q29uZmlndXJhdGlvbjsKLQkJCQkvLyBCZWNhdXNlIGluIHJ0MzB4eEZvcmNlQVNQTVRlc3QgTW9kZSwgRm9yY2UgdHVybiBvbiBMMHMsIEwxLgotCQkJCS8vIEZpeCBIb3N0Q29uZmlndXJhdGlvbiBiaXQwOjEgPSAweDMgZm9yIGxhdGVyIHVzZS4KLQkJCQlIb3N0Q29uZmlndXJhdGlvbiA9IDB4MzsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQU00gOiBGb3JjZSBBU1BNIDogSG9zdCBkZXZpY2UgTDEvTDBzIFZhbHVlID0gIDB4JXhcbiIsIEhvc3RDb25maWd1cmF0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvbGxvd0hvc3RBU1BNID09IDEpCi0JCXsKLQotCQkJLy8gU2tpcCBub24tZXhpc3QgZGVpY2UgcmlnaHQgYXdheQotCQkJaWYgKChwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0ICE9IDApKQotCQkJewotCQkJIFBDSV9SRUdfUkVBRF9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBIb3N0Q29uZmlndXJhdGlvbik7Ci0JCQkJcEFkLT5SdDN4eEhvc3RMaW5rQ3RybCA9IEhvc3RDb25maWd1cmF0aW9uOwotCQkJCUhvc3RDb25maWd1cmF0aW9uICY9IDB4MzsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQU00gOiBGb2xsb3cgSG9zdCBBU1BNIDogSG9zdCBkZXZpY2UgTDEvTDBzIFZhbHVlID0gIDB4JXhcbiIsIEhvc3RDb25maWd1cmF0aW9uKSk7Ci0JCQl9Ci0JCX0KLSAgICAgICAgfQotCS8vIFByZXBhcmUgdG8gd3JpdGUgUmFsaW5rIHNldHRpbmcuCi0JLy8gRmluZCBSYWxpbmsgUENJZSBEZXZpY2UncyBFeHByZXNzIENhcGFiaWxpdHkgT2Zmc2V0Ci0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwT2JqLT5wY2lfZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7Ci0KLSAgICBpZiAocG9zICE9IDApCi0gICAgewotICAgICAgICAvLyBSYWxpbmsgUENJZSBEZXZpY2UncyBMaW5rIENvbnRyb2wgUmVnaXN0ZXIgT2Zmc2V0Ci0gICAgICAgcEFkLT5STG5rQ3RybE9mZnNldCA9IHBvcyArIFBDSV9FWFBfTE5LQ1RMOwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsICZyZWcxNik7Ci0gICAgICAgIENvbmZpZ3VyYXRpb24gPSBsZTJjcHUxNihyZWcxNik7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVhZCAoUmFsaW5rIFBDSWUgTGluayBDb250cm9sIFJlZ2lzdGVyKSBvZmZzZXQgMHgleCA9IDB4JXhcbiIsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlJMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7Ci0JCUNvbmZpZ3VyYXRpb24gfD0gMHgxMDA7Ci0JCWlmICgocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvbGxvd0hvc3RBU1BNID09IDEpCi0JCQl8fCAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvcmNlQVNQTVRlc3QgPT0gMSkpCi0JCXsKLQkJCXN3aXRjaChIb3N0Q29uZmlndXJhdGlvbikKLQkJCXsKLQkJCQljYXNlIDA6Ci0JCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZmZmZmZjOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6Ci0JCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZmZmZmZjOwotCQkJCQlDb25maWd1cmF0aW9uIHw9IDB4MTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOgotCQkJCQlDb25maWd1cmF0aW9uICY9IDB4ZmZmZmZmYzsKLQkJCQkJQ29uZmlndXJhdGlvbiB8PSAweDI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzoKLQkJCQkJQ29uZmlndXJhdGlvbiB8PSAweDM7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJlZzE2ID0gY3B1MmxlMTYoQ29uZmlndXJhdGlvbik7Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LCByZWcxNik7Ci0JCXBBZC0+UnQzeHhSYWxpbmtMaW5rQ3RybCA9IENvbmZpZ3VyYXRpb247Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBTTSA6V3JpdGUgUmFsaW5rIGRldmljZSBMMS9MMHMgVmFsdWUgPSAgMHgleFxuIiwgQ29uZmlndXJhdGlvbikpOwotCX0KLQlEQkdQUklOVChSVF9ERUJVR19JTkZPLCgiUFNNIDpSVE1QcnQzeFNldFBDSWVQb3dlckxpbmtDdHJsIDw9PT09PT09PT09PT09PVxuIikpOwotCi19Ci0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzMDkwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0MzA5MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzI1Y2IwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzMDkwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotCXJ0MzA5MC5oCi0KLSAgICBBYnN0cmFjdDoKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jaWZuZGVmIF9fUlQzMDkwX0hfXwotI2RlZmluZSBfX1JUMzA5MF9IX18KLQotI2lmZGVmIFJUMzA5MAotCi0jaWZuZGVmIFJUTVBfUENJX1NVUFBPUlQKLSNlcnJvciAiRm9yIFJUMzA5MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfUENJX1NVUFBPUlQiCi0jZW5kaWYKLQotI2lmbmRlZiBSVE1QX01BQ19QQ0kKLSNlcnJvciAiRm9yIFJUMzA5MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfTUFDX1BDSSIKLSNlbmRpZgotCi0jaWZuZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotI2Vycm9yICJGb3IgUlQzMDkwLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGUgY29tcGlsZSBmbGFnIC1EUlRNUF9SRl9SV19TVVBQT1JUIgotI2VuZGlmCi0KLSNpZm5kZWYgUlQzMHh4Ci0jZXJyb3IgIkZvciBSVDMwOTAsIHlvdSBzaG91bGQgZGVmaW5lIHRoZSBjb21waWxlIGZsYWcgLURSVDMweHgiCi0jZW5kaWYKLQotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKLSNkZWZpbmUgVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVAotI2RlZmluZSBDQVJSSUVSX1NFTlNFX05FV19BTEdPCi0jZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLwotCi0jZGVmaW5lIFBDSUVfUFNfU1VQUE9SVAotCi0jaW5jbHVkZSAibWFjX3BjaS5oIgotI2luY2x1ZGUgInJ0MzB4eC5oIgotCi0vLwotLy8gRGV2aWNlIElEICYgVmVuZG9yIElELCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoIEVFUFJPTSB2YWx1ZQotLy8KLSNkZWZpbmUgTklDMzA5MF9QQ0llX0RFVklDRV9JRCAgMHgzMDkwCQkvLyAxVC8xUiBtaW5pQ2FyZAotI2RlZmluZSBOSUMzMDkxX1BDSWVfREVWSUNFX0lEICAweDMwOTEJCS8vIDFULzJSIG1pbmlDYXJkCi0jZGVmaW5lIE5JQzMwOTJfUENJZV9ERVZJQ0VfSUQgIDB4MzA5MgkJLy8gMlQvMlIgbWluaUNhcmQKLQotI2VuZGlmIC8vIFJUMzA5MCAvLwotCi0jZW5kaWYgLy9fX1JUMzA5MF9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzMHh4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0MzB4eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDk3MWEwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzMHh4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotCXJ0MzB4eC5oCi0KLSAgICBBYnN0cmFjdDoKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jaWZuZGVmIF9fUlQzMFhYX0hfXwotI2RlZmluZSBfX1JUMzBYWF9IX18KLQotI2lmZGVmIFJUMzB4eAotCi0KLWV4dGVybiBSRUdfUEFJUiBSVDMweHhfUkZSZWdUYWJsZVtdOwotZXh0ZXJuIFVDSEFSIE5VTV9SRl9SRUdfUEFSTVM7Ci0KLSNlbmRpZiAvLyBSVDMweHggLy8KLQotI2VuZGlmIC8vX19SVDMwWFhfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0MzM3MC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydDMzNzAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZhOTAwNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0MzM3MC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBydDMzNzAuaAotCi0gICAgQWJzdHJhY3Q6Ci0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotI2lmbmRlZiBfX1JUMzM3MF9IX18KLSNkZWZpbmUgX19SVDMzNzBfSF9fCi0KLSNpZmRlZiBSVDMzNzAKLQotCi0jZXJyb3IgIkZvciBSVDMwNzAsIHlvdSBzaG91bGQgZGVmaW5lIHRoZSBjb21waWxlIGZsYWcgLURSVE1QX1VTQl9TVVBQT1JUIgotCi0jZXJyb3IgIkZvciBSVDMwNzAsIHlvdSBzaG91bGQgZGVmaW5lIHRoZSBjb21waWxlIGZsYWcgLURSVE1QX01BQ19VU0IiCi0KLSNpZm5kZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0jZXJyb3IgIkZvciBSVDMwNzAsIHlvdSBzaG91bGQgZGVmaW5lIHRoZSBjb21waWxlIGZsYWcgLURSVE1QX1JGX1JXX1NVUFBPUlQiCi0jZW5kaWYKLQotI2lmbmRlZiBSVDMzeHgKLSNlcnJvciAiRm9yIFJUMzA3MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUMzB4eCIKLSNlbmRpZgotCi0jaW5jbHVkZSAibWFjX3VzYi5oIgotI2luY2x1ZGUgInJ0MzN4eC5oIgotCi0vLwotLy8gRGV2aWNlIElEICYgVmVuZG9yIElELCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoIEVFUFJPTSB2YWx1ZQotLy8KLQotI2VuZGlmIC8vIFJUMzM3MCAvLwotCi0jZW5kaWYgLy9fX1JUMzM3MF9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzMzkwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0MzM5MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTJhYjNkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzMzkwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIHJ0MzM5MC5oCi0KLSAgICBBYnN0cmFjdDoKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jaWZuZGVmIF9fUlQzMzkwX0hfXwotI2RlZmluZSBfX1JUMzM5MF9IX18KLQotI2lmZGVmIFJUMzM5MAotCi0jaWZuZGVmIFJUTVBfUENJX1NVUFBPUlQKLSNlcnJvciAiRm9yIFJUMzM5MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfUENJX1NVUFBPUlQiCi0jZW5kaWYKLQotI2lmbmRlZiBSVE1QX01BQ19QQ0kKLSNlcnJvciAiRm9yIFJUMzM5MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfTUFDX1BDSSIKLSNlbmRpZgotCi0jaWZuZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotI2Vycm9yICJGb3IgUlQzMzkwLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGUgY29tcGlsZSBmbGFnIC1EUlRNUF9SRl9SV19TVVBQT1JUIgotI2VuZGlmCi0KLSNpZm5kZWYgUlQzMHh4Ci0jZXJyb3IgIkZvciBSVDMzOTAsIHlvdSBzaG91bGQgZGVmaW5lIHRoZSBjb21waWxlIGZsYWcgLURSVDMweHgiCi0jZW5kaWYKLQotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKLSNkZWZpbmUgVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVAotI2RlZmluZSBDQVJSSUVSX1NFTlNFX05FV19BTEdPCi0jZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLwotCi0jZGVmaW5lIFBDSUVfUFNfU1VQUE9SVAotCi0jaW5jbHVkZSAibWFjX3BjaS5oIgotI2luY2x1ZGUgInJ0MzN4eC5oIgotCi0vLwotLy8gRGV2aWNlIElEICYgVmVuZG9yIElELCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoIEVFUFJPTSB2YWx1ZQotLy8KLSNkZWZpbmUgTklDMzM5MF9QQ0llX0RFVklDRV9JRCAgMHgzMDkwCQkvLyAxVC8xUiBtaW5pQ2FyZAotI2RlZmluZSBOSUMzMzkxX1BDSWVfREVWSUNFX0lEICAweDMwOTEJCS8vIDFULzJSIG1pbmlDYXJkCi0jZGVmaW5lIE5JQzMzOTJfUENJZV9ERVZJQ0VfSUQgIDB4MzA5MgkJLy8gMlQvMlIgbWluaUNhcmQKLQotI2VuZGlmIC8vIFJUMzM5MCAvLwotCi0jZW5kaWYgLy9fX1JUMzM5MF9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzM3h4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0MzN4eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWI5Mzg4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzM3h4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIHJ0MzN4eC5oCi0KLSAgICBBYnN0cmFjdDoKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jaWZuZGVmIF9fUlQzM1hYX0hfXwotI2RlZmluZSBfX1JUMzNYWF9IX18KLQotI2lmZGVmIFJUMzN4eAotCi0KLWV4dGVybiBSRUdfUEFJUiBSRlJlZ1RhYmxlT3ZlclJUMzM5MFtdOwotZXh0ZXJuIFVDSEFSIE5VTV9SRl9SRUdfUEFSTVNfT1ZFUl9SVDMzOTA7Ci0KLSNlbmRpZiAvLyBSVDMzeHggLy8KLQotI2VuZGlmIC8vX19SVDMzWFhfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2F0ZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9hdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5YWFlNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2F0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjA4OSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAicnRfY29uZmlnLmgiCi0KLSNpZmRlZiBSQUxJTktfQVRFCi0KLSNpZmRlZiBSVDMweHgKLSNkZWZpbmUgQVRFX0JCUF9SRUdfTlVNCTE2OAotVUNIQVIgcmVzdG9yZV9CQlBbQVRFX0JCUF9SRUdfTlVNXT17MH07Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLS8vIDgwMi4xMSBNQUMgSGVhZGVyLCBUeXBlOkRhdGEsIExlbmd0aDoyNGJ5dGVzCi1VQ0hBUiBUZW1wbGF0ZUZyYW1lWzI0XSA9IHsweDA4LDB4MDAsMHgwMCwweDAwLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAotCQkweDAwLDB4QUEsMHhCQiwweDEyLDB4MzQsMHg1NiwweDAwLDB4MTEsMHgyMiwweEFBLDB4QkIsMHhDQywweDAwLDB4MDB9OwotCi1leHRlcm4gUlRNUF9SRl9SRUdTIFJGMjg1MFJlZ1RhYmxlW107Ci1leHRlcm4gVUNIQVIgTlVNX09GXzI4NTBfQ0hOTDsKLQotZXh0ZXJuIEZSRVFVRU5DWV9JVEVNIEZyZXFJdGVtczMwMjBbXTsKLWV4dGVybiBVQ0hBUiBOVU1fT0ZfMzAyMF9DSE5MOwotCi0KLQotCi1zdGF0aWMgQ0hBUiBDQ0tSYXRlVGFibGVbXSA9IHswLCAxLCAyLCAzLCA4LCA5LCAxMCwgMTEsIC0xfTsgLyogQ0NLIE1vZGUuICovCi1zdGF0aWMgQ0hBUiBPRkRNUmF0ZVRhYmxlW10gPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgLTF9OyAvKiBPRkRNIE1vZGUuICovCi1zdGF0aWMgQ0hBUiBIVE1JWFJhdGVUYWJsZVtdID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIC0xfTsgLyogSFQgTWl4IE1vZGUuICovCi0KLXN0YXRpYyBJTlQgVHhEbWFCdXN5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotc3RhdGljIElOVCBSeERtYUJ1c3koCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1zdGF0aWMgVk9JRCBSdG1wRG1hRW5hYmxlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIElOVCBFbmFibGUpOwotCi1zdGF0aWMgVk9JRCBCYnBTb2Z0UmVzZXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1zdGF0aWMgVk9JRCBSdG1wUmZJb1dyaXRlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotc3RhdGljIElOVCBBVEVTZXRVcEZyYW1lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVJTlQzMiBUeElkeCk7Ci0KLXN0YXRpYyBJTlQgQVRFVHhQd3JIYW5kbGVyKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIGNoYXIgaW5kZXgpOwotCi1zdGF0aWMgSU5UIEFURUNtZEhhbmRsZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLSNpZm5kZWYgUlQzMHh4Ci1zdGF0aWMgaW50IENoZWNrTUNTVmFsaWQoCi0JSU4gVUNIQVIgTW9kZSwKLQlJTiBVQ0hBUiBNY3MpOwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0jaWZkZWYgUlQzMHh4Ci1zdGF0aWMgaW50IENoZWNrTUNTVmFsaWQoCi0JSU4gVUNIQVIgTW9kZSwKLQlJTiBVQ0hBUiBNY3MsCi0JSU4gQk9PTEVBTiBiUlQyMDcwKTsKLSNlbmRpZiAvLyBSVDMweHggLy8KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotc3RhdGljIFZPSUQgQVRFV3JpdGVUeFdJKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBUWFdJX1NUUlVDCXBPdXRUeFdJLAotCUlOCUJPT0xFQU4JCQlGUkFHLAotCUlOCUJPT0xFQU4JCQlDRkFDSywKLQlJTglCT09MRUFOCQkJSW5zVGltZXN0YW1wLAotCUlOCUJPT0xFQU4JCQlBTVBEVSwKLQlJTglCT09MRUFOCQkJQWNrLAotCUlOCUJPT0xFQU4JCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCi0JSU4JVUNIQVIJCQlCQVNpemUsCi0JSU4JVUNIQVIJCQlXQ0lELAotCUlOCVVMT05HCQkJTGVuZ3RoLAotCUlOCVVDSEFSCQkJUElELAotCUlOCVVDSEFSCQkJVElELAotCUlOCVVDSEFSCQkJVHhSYXRlLAotCUlOCVVDSEFSCQkJVHhvcG1vZGUsCi0JSU4JQk9PTEVBTgkJCUNmQWNrLAotCUlOCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0KTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi1zdGF0aWMgVk9JRCBTZXRKYXBhbkZpbHRlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi1zdGF0aWMgaW5saW5lIElOVAlET19SQUNGR19DTURfQVRFX1NUQVJUKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NUT1AoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9SRl9XUklURV9BTEwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9FMlBST01fUkVBRDE2KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfRTJQUk9NX1dSSVRFMTYoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9FMlBST01fUkVBRF9BTEwKLSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0UyUFJPTV9XUklURV9BTEwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9JT19SRUFEKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfSU9fV1JJVEUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9JT19SRUFEX0JVTEsoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9CQlBfUkVBRDgoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9CQlBfV1JJVEU4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQkJQX1JFQURfQUxMKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfR0VUX05PSVNFX0xFVkVMKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfR0VUX0NPVU5URVIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9DTEVBUl9DT1VOVEVSKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfVFhfU1RBUlQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9HRVRfVFhfU1RBVFVTKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfVFhfU1RPUCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX1JYX1NUQVJUKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfUlhfU1RPUCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX1JYX1NUT1AoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUigKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9CVygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjEoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX0ZSRVFfT0ZGU0VUKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkEoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkEoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX1BSRUFNQkxFKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9BRERSMSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfQUREUjIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9SQVRFKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU4oCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NUQVJUX1JYX0ZSQU1FKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX0UyUFJPTV9SRUFEX0JVTEsoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfRTJQUk9NX1dSSVRFX0JVTEsoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfSU9fV1JJVEVfQlVMSygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9CQlBfUkVBRF9CVUxLKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLQotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi1zdGF0aWMgSU5UIFR4RG1hQnVzeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlJTlQgcmVzdWx0OwotCVdQRE1BX0dMT19DRkdfU1RSVUMgR2xvQ2ZnOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwkvLyBkaXNhYmxlIERNQQotCWlmIChHbG9DZmcuZmllbGQuVHhETUFCdXN5KQotCQlyZXN1bHQgPSAxOwotCWVsc2UKLQkJcmVzdWx0ID0gMDsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RhdGljIElOVCBSeERtYUJ1c3koCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JSU5UIHJlc3VsdDsKLQlXUERNQV9HTE9fQ0ZHX1NUUlVDIEdsb0NmZzsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsJLy8gZGlzYWJsZSBETUEKLQlpZiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSkKLQkJcmVzdWx0ID0gMTsKLQllbHNlCi0JCXJlc3VsdCA9IDA7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0YXRpYyBWT0lEIFJ0bXBEbWFFbmFibGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gSU5UIEVuYWJsZSkKLXsKLQlCT09MRUFOIHZhbHVlOwotCVVMT05HIFdhaXRDbnQ7Ci0JV1BETUFfR0xPX0NGR19TVFJVQyBHbG9DZmc7Ci0KLQl2YWx1ZSA9IEVuYWJsZSA+IDAgPyAxIDogMDsKLQotCS8vIGNoZWNrIERNQSBpcyBpbiBidXN5IG1vZGUuCi0JV2FpdENudCA9IDA7Ci0KLQl3aGlsZSAoVHhEbWFCdXN5KHBBZCkgfHwgUnhEbWFCdXN5KHBBZCkpCi0JewotCQlSVE1QdXNlY0RlbGF5KDEwKTsKLQkJaWYgKFdhaXRDbnQrKyA+IDEwMCkKLQkJCWJyZWFrOwotCX0KLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsJLy8gZGlzYWJsZSBETUEKLQlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSB2YWx1ZTsKLQlHbG9DZmcuZmllbGQuRW5hYmxlUnhETUEgPSB2YWx1ZTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CS8vIGFib3J0IGFsbCBUWCByaW5ncwotCVJUTVB1c2VjRGVsYXkoNTAwMCk7Ci0KLQlyZXR1cm47Ci19Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCi0KLXN0YXRpYyBWT0lEIEJicFNvZnRSZXNldCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVQ0hBUiBCYnBEYXRhID0gMDsKLQotCS8vIFNvZnQgcmVzZXQsIHNldCBCQlAgUjIxIGJpdDA9MS0+MAotCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgJkJicERhdGEpOwotCUJicERhdGEgfD0gMHgwMDAwMDAwMTsgLy9zZXQgYml0MD0xCi0JQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgQmJwRGF0YSk7Ci0KLQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjEsICZCYnBEYXRhKTsKLQlCYnBEYXRhICY9IH4oMHgwMDAwMDAwMSk7IC8vc2V0IGJpdDA9MAotCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjEsIEJicERhdGEpOwotCi0JcmV0dXJuOwotfQotCi0KLXN0YXRpYyBWT0lEIFJ0bXBSZklvV3JpdGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JLy8gU2V0IFJGIHZhbHVlIDEncyBzZXQgUjNbYml0Ml0gPSBbMF0KLQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKLQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKLQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyAmICh+MHgwNCkpKTsKLQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKLQotCVJUTVB1c2VjRGVsYXkoMjAwKTsKLQotCS8vIFNldCBSRiB2YWx1ZSAyJ3Mgc2V0IFIzW2JpdDJdID0gWzFdCi0JUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7Ci0JUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7Ci0JUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgfCAweDA0KSk7Ci0JUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7Ci0KLQlSVE1QdXNlY0RlbGF5KDIwMCk7Ci0KLQkvLyBTZXQgUkYgdmFsdWUgMydzIHNldCBSM1tiaXQyXSA9IFswXQotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOwotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOwotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOwotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOwotCi0JcmV0dXJuOwotfQotCi0KLSNpZmRlZiBSVDMweHgKLXN0YXRpYyBpbnQgQ2hlY2tNQ1NWYWxpZCgKLQlVQ0hBUiBNb2RlLAotCVVDSEFSIE1jcywKLQlCT09MRUFOIGJSVDIwNzApCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0jaWZuZGVmIFJUMzB4eAotc3RhdGljIGludCBDaGVja01DU1ZhbGlkKAotCUlOIFVDSEFSIE1vZGUsCi0JSU4gVUNIQVIgTWNzKQotI2VuZGlmIC8vIFJUMzB4eCAvLwotewotCUlOVCBpOwotCVBDSEFSIHBSYXRlVGFiOwotCi0Jc3dpdGNoIChNb2RlKQotCXsKLQkJY2FzZSAwOgotCQkJcFJhdGVUYWIgPSBDQ0tSYXRlVGFibGU7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJcFJhdGVUYWIgPSBPRkRNUmF0ZVRhYmxlOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJY2FzZSAzOgotI2lmZGVmIFJUMzB4eAotCQkJaWYgKGJSVDIwNzApCi0JCQkJcFJhdGVUYWIgPSBPRkRNUmF0ZVRhYmxlOwotCQkJZWxzZQotI2VuZGlmIC8vIFJUMzB4eCAvLwotCQkJcFJhdGVUYWIgPSBIVE1JWFJhdGVUYWJsZTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgidW5yZWNvZ25pemFibGUgVHggTW9kZSAlZFxuIiwgTW9kZSkpOwotCQkJcmV0dXJuIC0xOwotCQkJYnJlYWs7Ci0JfQotCi0JaSA9IDA7Ci0Jd2hpbGUgKHBSYXRlVGFiW2ldICE9IC0xKQotCXsKLQkJaWYgKHBSYXRlVGFiW2ldID09IE1jcykKLQkJCXJldHVybiAwOwotCQlpKys7Ci0JfQotCi0JcmV0dXJuIC0xOwotfQotCi0KLXN0YXRpYyBJTlQgQVRFVHhQd3JIYW5kbGVyKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIGNoYXIgaW5kZXgpCi17Ci0JVUxPTkcgUjsKLQlDSEFSIFR4UG93ZXI7Ci0JVUNIQVIgQmJwOTQgPSAwOwotCUJPT0xFQU4gYlBvd2VyUmVkdWNlID0gRkFMU0U7Ci0jaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0JVUNIQVIgUkZWYWx1ZTsKLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCWlmICgocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSB8fCAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBUUlVFKSkKLQl7Ci0JCS8qCi0JCQlXaGVuIFFBIGlzIHVzZWQgZm9yIFR4LCBwQWQtPmF0ZS5UeFBvd2VyMC8xIGFuZCByZWFsIHR4IHBvd2VyCi0JCQlhcmUgbm90IHN5bmNocm9uaXplZC4KLQkJKi8KLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCXsKLQkJVHhQb3dlciA9IGluZGV4ID09IDAgPyBwQWQtPmF0ZS5UeFBvd2VyMCA6IHBBZC0+YXRlLlR4UG93ZXIxOwotCi0JCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQotCQl7Ci0JCQlpZiAoVHhQb3dlciA+IDMxKQotCQkJewotCi0JCQkJLy8gUjMsIFI0IGNhbid0IGxhcmdlIHRoYW4gMzEgKDB4MjQpLCAzMSB+IDM2IHVzZWQgYnkgQkJQIDk0Ci0JCQkJUiA9IDMxOwotCQkJCWlmIChUeFBvd2VyIDw9IDM2KQotCQkJCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUICsgKFVDSEFSKShUeFBvd2VyIC0gMzEpOwotCQkJfQotCQkJZWxzZSBpZiAoVHhQb3dlciA8IDApCi0JCQl7Ci0KLQkJCQkvLyBSMywgUjQgY2FuJ3QgbGVzcyB0aGFuIDAsIC0xIH4gLTYgdXNlZCBieSBCQlAgOTQKLQkJCQlSID0gMDsKLQkJCQlpZiAoVHhQb3dlciA+PSAtNikKLQkJCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVCArIFR4UG93ZXI7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gMCB+IDMxCi0JCQkJUiA9IChVTE9ORykgVHhQb3dlcjsKLQkJCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUOwotCQkJfQotCi0JCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUj0lbGQsIEJCUF9SOTQ9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIFR4UG93ZXIsIFIsIEJicDk0KSk7Ci0JCX0KLQkJZWxzZSAvKiA1LjUgR0h6ICovCi0JCXsKLQkJCWlmIChUeFBvd2VyID4gMTUpCi0JCQl7Ci0KLQkJCQkvLyBSMywgUjQgY2FuJ3QgbGFyZ2UgdGhhbiAxNSAoMHgwRikKLQkJCQlSID0gMTU7Ci0JCQl9Ci0JCQllbHNlIGlmIChUeFBvd2VyIDwgMCkKLQkJCXsKLQotCQkJCS8vIFIzLCBSNCBjYW4ndCBsZXNzIHRoYW4gMAotCQkJCS8vIC0xIH4gLTcKLQkJCQlBU1NFUlQoKFR4UG93ZXIgPj0gLTcpKTsKLQkJCQlSID0gKFVMT05HKShUeFBvd2VyICsgNyk7Ci0JCQkJYlBvd2VyUmVkdWNlID0gVFJVRTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyAwIH4gMTUKLQkJCQlSID0gKFVMT05HKSBUeFBvd2VyOwotCQkJfQotCi0JCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUj0lbHUpXG4iLCBfX0ZVTkNUSU9OX18sIFR4UG93ZXIsIFIpKTsKLQkJfQotLy8yMDA4LzA5LzEwOktIIGFkZHMgdG8gc3VwcG9ydCAzMDcwIEFURSBUWCBQb3dlciB0dW5uaW5nIHJlYWwgdGltZTwtLQotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotCQlpZiAoSVNfUlQzMHh4KHBBZCkpCi0JCXsKLQkJCS8vIFNldCBUeCBQb3dlcgotCQkJQVRFX1JGX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIFJGX1IxMiwgKFBVQ0hBUikmUkZWYWx1ZSk7Ci0JCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAweEUwKSB8IFR4UG93ZXI7Ci0JCQlBVEVfUkZfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIFJGX1IxMiwgKFVDSEFSKVJGVmFsdWUpOwotCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiMzA3MCBvciAyMDcwOiVzIChUeFBvd2VyPSVkLCBSRlZhbHVlPSV4KVxuIiwgX19GVU5DVElPTl9fLCBUeFBvd2VyLCBSRlZhbHVlKSk7Ci0JCX0KLQkJZWxzZQotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCQl7Ci0JCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQotCQl7Ci0JCQlpZiAoaW5kZXggPT0gMCkKLQkJCXsKLQkJCQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjMpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgotCQkJCVIgPSBSIDw8IDk7Ci0JCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOwotCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSNCkgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCi0JCQkJUiA9IFIgPDwgNjsKLQkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7Ci0JCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI7Ci0JCQl9Ci0JCX0KLQkJZWxzZSAvKiA1LjVHSHogKi8KLQkJewotCQkJaWYgKGJQb3dlclJlZHVjZSA9PSBGQUxTRSkKLQkJCXsKLQkJCQlpZiAoaW5kZXggPT0gMCkKLQkJCQl7Ci0JCQkJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCi0JCQkJCVIgPSAoUiA8PCAxMCkgfCAoMSA8PCA5KTsKLQkJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOwotCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KLQkJCQkJUiA9IChSIDw8IDcpIHwgKDEgPDwgNik7Ci0JCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjQgJiAweGZmZmZmODNmKTsKLQkJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmIChpbmRleCA9PSAwKQotCQkJCXsKLQkJCQkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFIzKSByZWdpc3RlciBiaXQgcG9zaXRpb24KLQkJCQkJUiA9IChSIDw8IDEwKTsKLQkJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOwotCi0JCQkJCS8qIENsZWFyIGJpdCA5IG9mIFIzIHRvIHJlZHVjZSA3ZEIuICovCi0JCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSAoUiAmICh+KDEgPDwgOSkpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KLQkJCQkJUiA9IChSIDw8IDcpOwotCQkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7Ci0KLQkJCQkJLyogQ2xlYXIgYml0IDYgb2YgUjQgdG8gcmVkdWNlIDdkQi4gKi8KLQkJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IChSICYgKH4oMSA8PCA2KSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlSdG1wUmZJb1dyaXRlKHBBZCk7Ci0JfQotLy8yMDA4LzA5LzEwOktIIGFkZHMgdG8gc3VwcG9ydCAzMDcwIEFURSBUWCBQb3dlciB0dW5uaW5nIHJlYWwgdGltZS0tPgotCi0JCXJldHVybiAwOwotCX0KLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBvcGVyYXRpb24gbW9kZSB0bwotICAgICAgICAwLiBBVEVTVEFSVCAgPSBTdGFydCBBVEUgTW9kZQotICAgICAgICAxLiBBVEVTVE9QICAgPSBTdG9wIEFURSBNb2RlCi0gICAgICAgIDIuIFRYQ09OVCAgICA9IENvbnRpbnVvdXMgVHJhbnNtaXQKLSAgICAgICAgMy4gVFhDQVJSICAgID0gVHJhbnNtaXQgQ2FycmllcgotICAgICAgICA0LiBUWEZSQU1FICAgPSBUcmFuc21pdCBGcmFtZXMKLSAgICAgICAgNS4gUlhGUkFNRSAgID0gUmVjZWl2ZSBGcmFtZXMKLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotICAgICAgICA2LiBUWFNUT1AgICAgPSBTdG9wIEFueSBUeXBlIG9mIFRyYW5zbWl0aW9uCi0gICAgICAgIDcuIFJYU1RPUCAgICA9IFN0b3AgUmVjZWl2aW5nIEZyYW1lcwotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLXN0YXRpYyBJTlQJQVRFQ21kSGFuZGxlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVJTlQzMgkJCVZhbHVlID0gMDsKLQlVQ0hBUgkJCUJicERhdGE7Ci0JVUlOVDMyCQkJTWFjRGF0YSA9IDA7Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLQlJTlQJCQkJaW5kZXg7Ci0JVUlOVAkJCWkgPSAwLCBhdGVtb2RlID0gMDsKLQlQUlhEX1NUUlVDCQlwUnhEOwotCVBSVE1QX1RYX1JJTkcJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tRSURfQUNfQkVdOwotCU5ESVNfU1RBVFVTCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotI2lmZGVmCVJUX0JJR19FTkRJQU4KLSAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7Ci0gICAgVFhEX1NUUlVDICAgICAgIFR4RDsKLSNlbmRpZgotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBBVEVDbWRIYW5kbGVyKClcbiIpKTsKLQotCUFURUFzaWNTd2l0Y2hDaGFubmVsKHBBZCk7Ci0KLQkvKiBlbXB0eSBmdW5jdGlvbiAqLwotCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+YXRlLkNoYW5uZWwpOwotCi0JUlRNUHVzZWNEZWxheSg1MDAwKTsKLQotCS8vIHJlYWQgTUFDX1NZU19DVFJMIGFuZCBiYWNrdXAgTUFDX1NZU19DVFJMIHZhbHVlLgotCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmTWFjRGF0YSk7Ci0KLQkvLyBEZWZhdWx0IHZhbHVlIGluIEJCUCBSMjIgaXMgMHgwLgotCUJicERhdGEgPSAwOwotCi0JLy8gY2xlYW4gYml0NCB0byBzdG9wIGNvbnRpbnVvdXMgVHggcHJvZHVjdGlvbiB0ZXN0LgotCU1hY0RhdGEgJj0gMHhGRkZGRkZFRjsKLQotCS8vIEVudGVyIEFURSBtb2RlIGFuZCBzZXQgVHgvUnggSWRsZQotCWlmICghc3RyY21wKGFyZywgIkFURVNUQVJUIikpCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IEFURVNUQVJUXG4iKSk7Ci0KLSNpZiBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKFZYV09SS1MpCi0JCS8vIGNoZWNrIGlmIHdlIGhhdmUgcmVtb3ZlZCB0aGUgZmlybXdhcmUKLQkJaWYgKCEoQVRFX09OKHBBZCkpKQotCQl7Ci0JCQlOSUNFcmFzZUZpcm13YXJlKHBBZCk7Ci0JCX0KLSNlbmRpZiAvLyBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKFZYV09SS1MpIC8vCi0KLQkJYXRlbW9kZSA9IHBBZC0+YXRlLk1vZGU7Ci0JCXBBZC0+YXRlLk1vZGUgPSBBVEVfU1RBUlQ7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7Ci0KLQkJaWYgKGF0ZW1vZGUgPT0gQVRFX1RYQ0FSUikKLQkJewotCQkJLy8gTm8gQ2FycmllciBUZXN0IHNldCBCQlAgUjIyIGJpdDc9MCwgYml0Nj0wLCBiaXRbNX4wXT0weDAKLQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOwotCQkJQmJwRGF0YSAmPSAweEZGRkZGRjAwOyAvLyBjbGVhciBiaXQ3LCBiaXQ2LCBiaXRbNX4wXQotCQkgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7Ci0JCX0KLQkJZWxzZSBpZiAoYXRlbW9kZSA9PSBBVEVfVFhDQVJSU1VQUCkKLQkJewotCQkJLy8gTm8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0wCi0JCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKLQkJCUJicERhdGEgJj0gfigxIDw8IDcpOyAvLyBzZXQgYml0Nz0wCi0JCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKLQotCQkJLy8gTm8gQ2FycmllciBTdXBwcmVzc2lvbiBzZXQgQkJQIFIyNCBiaXQwPTAKLQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgJkJicERhdGEpOwotCQkJQmJwRGF0YSAmPSAweEZGRkZGRkZFOyAvLyBjbGVhciBiaXQwCi0JCSAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCBCYnBEYXRhKTsKLQkJfQotCi0JCS8qCi0JCQlXZSBzaG91bGQgZnJlZSBzb21lIHJlc291cmNlIHdoaWNoIHdhcyBhbGxvY2F0ZWQKLQkJCXdoZW4gQVRFX1RYRlJBTUUgLCBBVEVfU1RPUCwgYW5kIEFURV9UWENPTlQuCi0JCSovCi0JCWVsc2UgaWYgKChhdGVtb2RlICYgQVRFX1RYRlJBTUUpIHx8IChhdGVtb2RlID09IEFURV9TVE9QKSkKLQkJewotCQkJUFJUTVBfVFhfUklORyBwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1FJRF9BQ19CRV07Ci0KLQkJCWlmIChhdGVtb2RlID09IEFURV9UWENPTlQpCi0JCQl7Ci0JCQkJLy8gTm8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0wCi0JCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7Ci0JCQkJQmJwRGF0YSAmPSB+KDEgPDwgNyk7IC8vIHNldCBiaXQ3PTAKLQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKLQkJCX0KLQotCQkJLy8gQWJvcnQgVHgsIFJ4IERNQS4KLQkJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKLQkJCWZvciAoaT0wOyBpPFRYX1JJTkdfU0laRTsgaSsrKQotCQkJewotCQkJCVBORElTX1BBQ0tFVCAgcFBhY2tldDsKLQotI2lmbmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkgICAgcFR4RCA9IChQVFhEX1NUUlVDKXBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uQ2VsbFtpXS5BbGxvY1ZhOwotI2Vsc2UKLQkJCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsW2ldLkFsbG9jVmE7Ci0JCQlUeEQgPSAqcERlc3RUeEQ7Ci0JCQlwVHhEID0gJlR4RDsKLQkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotI2VuZGlmCi0JCQkJcFR4RC0+RE1BRE9ORSA9IDA7Ci0JCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQ7Ci0KLQkJCQlpZiAocFBhY2tldCkKLQkJCQl7Ci0JCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCQl9Ci0KLQkJCQkvLyBBbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKLQkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKLQotCQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldDsKLQotCQkJCWlmIChwUGFja2V0KQotCQkJCXsKLQkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQkJCX0KLQotCQkJCS8vIEFsd2F5cyBhc3NpZ24gcE5leHROZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKLQkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCQkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotCQkJCVdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIEZBTFNFLCBUWVBFX1RYRCk7Ci0jZW5kaWYKLQkJCX0KLQotCQkJLy8gU3RhcnQgVHgsIFJYIERNQQotCQkJUnRtcERtYUVuYWJsZShwQWQsIDEpOwotCQl9Ci0KLQkJLy8gcmVzZXQgUnggc3RhdGlzdGljcy4KLQkJcEFkLT5hdGUuTGFzdFNOUjAgPSAwOwotCQlwQWQtPmF0ZS5MYXN0U05SMSA9IDA7Ci0JCXBBZC0+YXRlLkxhc3RSc3NpMCA9IDA7Ci0JCXBBZC0+YXRlLkxhc3RSc3NpMSA9IDA7Ci0JCXBBZC0+YXRlLkxhc3RSc3NpMiA9IDA7Ci0JCXBBZC0+YXRlLkF2Z1Jzc2kwID0gMDsKLQkJcEFkLT5hdGUuQXZnUnNzaTEgPSAwOwotCQlwQWQtPmF0ZS5BdmdSc3NpMiA9IDA7Ci0JCXBBZC0+YXRlLkF2Z1Jzc2kwWDggPSAwOwotCQlwQWQtPmF0ZS5BdmdSc3NpMVg4ID0gMDsKLQkJcEFkLT5hdGUuQXZnUnNzaTJYOCA9IDA7Ci0JCXBBZC0+YXRlLk51bU9mQXZnUnNzaVNhbXBsZSA9IDA7Ci0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCQkvLyBUeCBmcmFtZQotCQlwQWQtPmF0ZS5iUUFUeFN0YXJ0ID0gRkFMU0U7Ci0JCXBBZC0+YXRlLmJRQVJ4U3RhcnQgPSBGQUxTRTsKLQkJcEFkLT5hdGUuc2VxID0gMDsKLQotCQkvLyBjb3VudGVycwotCQlwQWQtPmF0ZS5VMk0gPSAwOwotCQlwQWQtPmF0ZS5PdGhlckRhdGEgPSAwOwotCQlwQWQtPmF0ZS5CZWFjb24gPSAwOwotCQlwQWQtPmF0ZS5PdGhlckNvdW50ID0gMDsKLQkJcEFkLT5hdGUuVHhBYzAgPSAwOwotCQlwQWQtPmF0ZS5UeEFjMSA9IDA7Ci0JCXBBZC0+YXRlLlR4QWMyID0gMDsKLQkJcEFkLT5hdGUuVHhBYzMgPSAwOwotCQkvKnBBZC0+YXRlLlR4SENDQSA9IDA7Ki8KLQkJcEFkLT5hdGUuVHhNZ210ID0gMDsKLQkJcEFkLT5hdGUuUlNTSTAgPSAwOwotCQlwQWQtPmF0ZS5SU1NJMSA9IDA7Ci0JCXBBZC0+YXRlLlJTU0kyID0gMDsKLQkJcEFkLT5hdGUuU05SMCA9IDA7Ci0JCXBBZC0+YXRlLlNOUjEgPSAwOwotCi0JCS8vIGNvbnRyb2wKLQkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOwotCQkvLyBUeFN0YXR1cyA6IDAgLS0+IHRhc2sgaXMgaWRsZSwgMSAtLT4gdGFzayBpcyBydW5uaW5nCi0JCXBBZC0+YXRlLlR4U3RhdHVzID0gMDsKLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCi0JCS8vIFNvZnQgcmVzZXQgQkJQLgotCQlCYnBTb2Z0UmVzZXQocEFkKTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCS8qIExpbmtEb3duKCkgaGFzICJBc2ljRGlzYWJsZVN5bmMoKTsiIGFuZCAiUlRNUF9CQlBfSU9fUi9XOF9CWV9SRUdfSUQoKTsiIGluc2lkZS4gKi8KLS8vICAgICAgTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0vLwkJQXNpY0VuYWJsZUJzc1N5bmMocEFkKTsKLQotI2lmIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoVlhXT1JLUykKLQkJUlRNUF9PU19ORVRERVZfU1RPUF9RVUVVRShwQWQtPm5ldF9kZXYpOwotI2VuZGlmIC8vIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoVlhXT1JLUykgLy8KLQotCQkvKgotCQkJSWYgd2Ugc2tpcCAiTGlua0Rvd24oKSIsIHdlIHNob3VsZCBkaXNhYmxlIHByb3RlY3Rpb24KLQkJCXRvIHByZXZlbnQgZnJvbSBzZW5kaW5nIG91dCBSVFMgb3IgQ1RTLXRvLXNlbGYuCi0JCSovCi0JCUFURURpc2FibGVBc2ljUHJvdGVjdChwQWQpOwotCQlSVE1QU3RhdGlvblN0b3AocEFkKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCQkvKiBEaXNhYmxlIFR4ICovCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSB+KDEgPDwgMik7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotCi0JCS8qIERpc2FibGUgUnggKi8KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCVZhbHVlICY9IH4oMSA8PCAzKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0JfQotCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiQVRFU1RPUCIpKQotCXsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBBVEVTVE9QXG4iKSk7Ci0KLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7Ci0KLQkJLy8gcmVjb3ZlciB0aGUgTUFDX1NZU19DVFJMIHJlZ2lzdGVyIGJhY2sKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKLQotCQkvLyBkaXNhYmxlIFR4LCBSeAotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJVmFsdWUgJj0gKDB4ZmZmZmZmZjMpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQotCQkvLyBhYm9ydCBUeCwgUlggRE1BCi0JCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKLQotI2lmZGVmIExJTlVYCi0JCXBBZC0+YXRlLmJGV0xvYWRpbmcgPSBUUlVFOwotCi0JCVN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOwotCi0JCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTklDTG9hZEZpcm13YXJlIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotI2VuZGlmIC8vIExJTlVYIC8vCi0JCXBBZC0+YXRlLk1vZGUgPSBBVEVfU1RPUDsKLQotCQkvKgotCQkJRXZlbiB0aGUgZmlybXdhcmUgaGFzIGJlZW4gbG9hZGVkLAotCQkJd2Ugc3RpbGwgY291bGQgdXNlIEFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKCkuCi0JCQlCdXQgdGhpcyBpcyBub3Qgc3VnZ2VzdGVkLgotCQkqLwotCQlCYnBTb2Z0UmVzZXQocEFkKTsKLQotCQlSVE1QX0FTSUNfSU5URVJSVVBUX0RJU0FCTEUocEFkKTsKLQotCQlOSUNJbml0aWFsaXplQWRhcHRlcihwQWQsIFRSVUUpOwotCi0JCS8qCi0JCQlSZWluaXRpYWxpemUgUnggUmluZyBiZWZvcmUgUnggRE1BIGlzIGVuYWJsZWQuCi0JCQk+Pj5SeENvaGVyZW50PDw8IHdhcyBnb25lICEKLQkJKi8KLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgUlhfUklOR19TSVpFOyBpbmRleCsrKQotCQl7Ci0JCQlwUnhEID0gKFBSWERfU1RSVUMpIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmE7Ci0JCQlwUnhELT5ERE9ORSA9IDA7Ci0JCX0KLQotCQkvLyBXZSBzaG91bGQgcmVhZCBFRVBST00gZm9yIGFsbCBjYXNlcy4KLQkJTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMocEFkLCBOVUxMKTsKLQkJTklDSW5pdEFzaWNGcm9tRUVQUk9NKHBBZCk7Ci0KLQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0KLQkJLyogZW1wdHkgZnVuY3Rpb24gKi8KLQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0KLQkJLyogY2xlYXIgZ2FyYmFnZSBpbnRlcnJ1cHRzICovCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAweGZmZmZmZmZmKTsKLQkJLyogRW5hYmxlIEludGVycnVwdCAqLwotCQlSVE1QX0FTSUNfSU5URVJSVVBUX0VOQUJMRShwQWQpOwotCi0JCS8qIHJlc3RvcmUgUlhfRklMVFJfQ0ZHICovCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJLyogcmVzdG9yZSBSWF9GSUxUUl9DRkcgZHVlIHRvIHRoYXQgUUEgbWF5YmUgc2V0IGl0IHRvIDB4MyAqLwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJLy8gRW5hYmxlIFR4Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQlWYWx1ZSB8PSAoMSA8PCAyKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0KLQkJLy8gRW5hYmxlIFR4LCBSeCBETUEuCi0JCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKLQotCQkvLyBFbmFibGUgUngKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCVZhbHVlIHw9ICgxIDw8IDMpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCVJUTVBTdGF0aW9uU3RhcnQocEFkKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoVlhXT1JLUykKLQkJUlRNUF9PU19ORVRERVZfU1RBUlRfUVVFVUUocEFkLT5uZXRfZGV2KTsKLSNlbmRpZiAvLyBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKFZYV09SS1MpIC8vCi0JfQotCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhDQVJSIikpCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IFRYQ0FSUlxuIikpOwotCQlwQWQtPmF0ZS5Nb2RlID0gQVRFX1RYQ0FSUjsKLQotCQkvLyBRQSBoYXMgZG9uZSB0aGUgZm9sbG93aW5nIHN0ZXBzIGlmIGl0IGlzIHVzZWQuCi0JCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IEZBTFNFKQotCQl7Ci0JCQkvLyBTb2Z0IHJlc2V0IEJCUC4KLQkJCUJicFNvZnRSZXNldChwQWQpOwotCi0JCQkvLyBDYXJyaWVyIFRlc3Qgc2V0IEJCUCBSMjIgYml0Nz0xLCBiaXQ2PTEsIGJpdFs1fjBdPTB4MDEKLQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOwotCQkJQmJwRGF0YSAmPSAweEZGRkZGRjAwOyAvL2NsZWFyIGJpdDcsIGJpdDYsIGJpdFs1fjBdCi0JCQlCYnBEYXRhIHw9IDB4MDAwMDAwQzE7IC8vc2V0IGJpdDc9MSwgYml0Nj0xLCBiaXRbNX4wXT0weDAxCi0JCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKLQotCQkJLy8gc2V0IE1BQ19TWVNfQ1RSTCgweDEwMDQpIENvbnRpbnVvdXMgVHggUHJvZHVjdGlvbiBUZXN0IChiaXQ0KSA9IDEKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQkJVmFsdWUgPSBWYWx1ZSB8IDB4MDAwMDAwMTA7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQkJfQotCX0KLQllbHNlIGlmICghc3RyY21wKGFyZywgIlRYQ09OVCIpKQotCXsKLQkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKLQkJewotCQkJLyoKLQkJCQlzZXQgTUFDX1NZU19DVFJMKDB4MTAwNCkgYml0NChDb250aW51b3VzIFR4IFByb2R1Y3Rpb24gVGVzdCkKLQkJCQlhbmQgYml0MihNQUMgVFggZW5hYmxlKSBiYWNrIHRvIHplcm8uCi0JCQkqLwotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsKLQkJCU1hY0RhdGEgJj0gMHhGRkZGRkZFQjsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7Ci0KLQkJCS8vIHNldCBCQlAgUjIyIGJpdDc9MAotCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7Ci0JCQlCYnBEYXRhICY9IDB4RkZGRkZGN0Y7IC8vc2V0IGJpdDc9MAotCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7Ci0JCX0KLQotCQkvKgotCQkJZm9yIFR4Q29udCBtb2RlLgotCQkJU3RlcCAxOiBTZW5kIDUwIHBhY2tldHMgZmlyc3QgdGhlbiB3YWl0IGZvciBhIG1vbWVudC4KLQkJCVN0ZXAgMjogU2VuZCBtb3JlIDUwIHBhY2tldCB0aGVuIHN0YXJ0IGNvbnRpbnVlIG1vZGUuCi0JCSovCi0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhDT05UXG4iKSk7Ci0KLQkJLy8gU3RlcCAxOiBzZW5kIDUwIHBhY2tldHMgZmlyc3QuCi0JCXBBZC0+YXRlLk1vZGUgPSBBVEVfVFhDT05UOwotCQlwQWQtPmF0ZS5UeENvdW50ID0gNTA7Ci0KLQkJLyogRG8gaXQgYWZ0ZXIgVHgvUnggRE1BIGlzIGFib3J0ZWQuICovCi0vLwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOwotCi0JCS8vIFNvZnQgcmVzZXQgQkJQLgotCQlCYnBTb2Z0UmVzZXQocEFkKTsKLQotCQkvLyBBYm9ydCBUeCwgUlggRE1BLgotCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7Ci0KLQkJLy8gRml4IGNhbid0IHNtb290aCBraWNrCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRSURfQUNfQkUgKiAweDEwLCAgJnBUeFJpbmctPlR4RG1hSWR4KTsKLQkJCXBUeFJpbmctPlR4U3dGcmVlSWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7Ci0JCQlwVHhSaW5nLT5UeENwdUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBRSURfQUNfQkUgKiAweDEwLCBwVHhSaW5nLT5UeENwdUlkeCk7Ci0JCX0KLQotCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IDA7Ci0KLQkJLyogT25seSBuZWVkZWQgaWYgd2UgaGF2ZSB0byBzZW5kIHNvbWUgbm9ybWFsIGZyYW1lcy4gKi8KLQkJU2V0SmFwYW5GaWx0ZXIocEFkKTsKLQotCQlmb3IgKGkgPSAwOyAoaSA8IFRYX1JJTkdfU0laRS0xKSAmJiAoaSA8IHBBZC0+YXRlLlR4Q291bnQpOyBpKyspCi0JCXsKLQkJCVBORElTX1BBQ0tFVCBwUGFja2V0OwotCQkJVUlOVDMyIFR4SWR4ID0gcFR4UmluZy0+VHhDcHVJZHg7Ci0KLSNpZm5kZWYgUlRfQklHX0VORElBTgotCQkJcFR4RCA9IChQVFhEX1NUUlVDKXBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0jZWxzZQotCQkJcERlc3RUeEQgPSAoUFRYRF9TVFJVQylwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOwotCQkJVHhEID0gKnBEZXN0VHhEOwotCQkJcFR4RCA9ICZUeEQ7Ci0JCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLSNlbmRpZgotCQkJLy8gQ2xlYW4gY3VycmVudCBjZWxsLgotCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0OwotCi0JCQlpZiAocFBhY2tldCkKLQkJCXsKLQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCX0KLQotCQkJLy8gQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCi0JCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQ7Ci0KLQkJCWlmIChwUGFja2V0KQotCQkJewotCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQkJfQotCi0JCQkvLyBBbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCi0JCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0JCQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOwotI2VuZGlmCi0KLQkJCWlmIChBVEVTZXRVcEZyYW1lKHBBZCwgVHhJZHgpICE9IDApCi0JCQkJYnJlYWs7Ci0KLQkJCUlOQ19SSU5HX0lOREVYKHBUeFJpbmctPlR4Q3B1SWR4LCBUWF9SSU5HX1NJWkUpOwotCQl9Ci0KLQkJLy8gU2V0dXAgZnJhbWUgZm9ybWF0LgotCQlBVEVTZXRVcEZyYW1lKHBBZCwgcFR4UmluZy0+VHhDcHVJZHgpOwotCi0JCS8vIFN0YXJ0IFR4LCBSWCBETUEuCi0JCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKLQotCQkvLyBFbmFibGUgVHgKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCVZhbHVlIHw9ICgxIDw8IDIpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQotCQkvLyBEaXNhYmxlIFJ4Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSB+KDEgPDwgMyk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotCi0jaWZkZWYgUkFMSU5LXzI4eHhfUUEKLQkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKLQkJewotCQkJcEFkLT5hdGUuVHhTdGF0dXMgPSAxOwotCQl9Ci0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLQotCQkvLyBraWNrIFR4LVJpbmcKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBRSURfQUNfQkUgKiBSSU5HUkVHX0RJRkYsIHBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uVHhDcHVJZHgpOwotCi0JCVJUTVB1c2VjRGVsYXkoNTAwMCk7Ci0KLQotCQkvLyBTdGVwIDI6IHNlbmQgbW9yZSA1MCBwYWNrZXRzIHRoZW4gc3RhcnQgY29udGludWUgbW9kZS4KLQkJLy8gQWJvcnQgVHgsIFJYIERNQS4KLQkJUnRtcERtYUVuYWJsZShwQWQsIDApOwotCi0JCS8vIENvbnQuIFRYIHNldCBCQlAgUjIyIGJpdDc9MQotCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKLQkJQmJwRGF0YSB8PSAweDAwMDAwMDgwOyAvL3NldCBiaXQ3PTEKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7Ci0KLQkJcEFkLT5hdGUuVHhDb3VudCA9IDUwOwotCi0JCS8vIEZpeCBjYW4ndCBzbW9vdGgga2ljawotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgICZwVHhSaW5nLT5UeERtYUlkeCk7Ci0JCQlwVHhSaW5nLT5UeFN3RnJlZUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OwotCQkJcFR4UmluZy0+VHhDcHVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgcFR4UmluZy0+VHhDcHVJZHgpOwotCQl9Ci0KLQkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOwotCi0JCVNldEphcGFuRmlsdGVyKHBBZCk7Ci0KLQkJZm9yIChpID0gMDsgKGkgPCBUWF9SSU5HX1NJWkUtMSkgJiYgKGkgPCBwQWQtPmF0ZS5UeENvdW50KTsgaSsrKQotCQl7Ci0JCQlQTkRJU19QQUNLRVQgcFBhY2tldDsKLQkJCVVJTlQzMiBUeElkeCA9IHBUeFJpbmctPlR4Q3B1SWR4OwotCi0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQkJCXBUeEQgPSAoUFRYRF9TVFJVQylwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOwotI2Vsc2UKLQkJCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLQkJCVR4RCA9ICpwRGVzdFR4RDsKLQkJCXBUeEQgPSAmVHhEOwotCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0jZW5kaWYKLQkJCS8vIGNsZWFuIGN1cnJlbnQgY2VsbC4KLQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldDsKLQotCQkJaWYgKHBQYWNrZXQpCi0JCQl7Ci0JCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMCwgcFR4RC0+U0RMZW4wLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQl9Ci0KLQkJCS8vIEFsd2F5cyBhc3NpZ24gcE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0OwotCi0JCQlpZiAocFBhY2tldCkKLQkJCXsKLQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCX0KLQotCQkJLy8gQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotCQkJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKLSNlbmRpZgotCi0JCQlpZiAoQVRFU2V0VXBGcmFtZShwQWQsIFR4SWR4KSAhPSAwKQotCQkJCWJyZWFrOwotCi0JCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeENwdUlkeCwgVFhfUklOR19TSVpFKTsKLQkJfQotCi0JCUFURVNldFVwRnJhbWUocEFkLCBwVHhSaW5nLT5UeENwdUlkeCk7Ci0KLQkJLy8gU3RhcnQgVHgsIFJYIERNQS4KLQkJUnRtcERtYUVuYWJsZShwQWQsIDEpOwotCi0JCS8vIEVuYWJsZSBUeAotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJVmFsdWUgfD0gKDEgPDwgMik7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotCi0JCS8vIERpc2FibGUgUngKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCVZhbHVlICY9IH4oMSA8PCAzKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQotCQl7Ci0JCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDE7Ci0JCX0KLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCi0JCS8vIGtpY2sgVHgtUmluZy4KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBRSURfQUNfQkUgKiBSSU5HUkVHX0RJRkYsIHBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uVHhDcHVJZHgpOwotCi0JCVJUTVB1c2VjRGVsYXkoNTAwKTsKLQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOwotCQlNYWNEYXRhIHw9IDB4MDAwMDAwMTA7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7Ci0JfQotCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhGUkFNRSIpKQotCXsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBUWEZSQU1FKENvdW50PSVkKVxuIiwgcEFkLT5hdGUuVHhDb3VudCkpOwotCQlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9UWEZSQU1FOwotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKLQotCQkvLyBTb2Z0IHJlc2V0IEJCUC4KLQkJQmJwU29mdFJlc2V0KHBBZCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7Ci0KLQkJLy8gQWJvcnQgVHgsIFJYIERNQS4KLQkJUnRtcERtYUVuYWJsZShwQWQsIDApOwotCi0JCS8vIEZpeCBjYW4ndCBzbW9vdGgga2ljawotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgICZwVHhSaW5nLT5UeERtYUlkeCk7Ci0JCQlwVHhSaW5nLT5UeFN3RnJlZUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OwotCQkJcFR4UmluZy0+VHhDcHVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgcFR4UmluZy0+VHhDcHVJZHgpOwotCQl9Ci0KLQkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOwotCi0JCVNldEphcGFuRmlsdGVyKHBBZCk7Ci0KLQkJZm9yIChpID0gMDsgKGkgPCBUWF9SSU5HX1NJWkUtMSkgJiYgKGkgPCBwQWQtPmF0ZS5UeENvdW50KTsgaSsrKQotCQl7Ci0JCQlQTkRJU19QQUNLRVQgcFBhY2tldDsKLQkJCVVJTlQzMiBUeElkeCA9IHBUeFJpbmctPlR4Q3B1SWR4OwotCi0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQkJCXBUeEQgPSAoUFRYRF9TVFJVQylwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOwotI2Vsc2UKLQkJCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLQkJCVR4RCA9ICpwRGVzdFR4RDsKLQkJCXBUeEQgPSAmVHhEOwotCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0jZW5kaWYKLQkJCS8vIENsZWFuIGN1cnJlbnQgY2VsbC4KLQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldDsKLQotCQkJaWYgKHBQYWNrZXQpCi0JCQl7Ci0JCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMCwgcFR4RC0+U0RMZW4wLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQl9Ci0KLQkJCS8vIEFsd2F5cyBhc3NpZ24gcE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0OwotCi0JCQlpZiAocFBhY2tldCkKLQkJCXsKLQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCX0KLQotCQkJLy8gQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotCQkJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKLSNlbmRpZgotCi0JCQlpZiAoQVRFU2V0VXBGcmFtZShwQWQsIFR4SWR4KSAhPSAwKQotCQkJCWJyZWFrOwotCi0JCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeENwdUlkeCwgVFhfUklOR19TSVpFKTsKLQotCQl9Ci0KLQkJQVRFU2V0VXBGcmFtZShwQWQsIHBUeFJpbmctPlR4Q3B1SWR4KTsKLQotCQkvLyBTdGFydCBUeCwgUnggRE1BLgotCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7Ci0KLQkJLy8gRW5hYmxlIFR4Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQlWYWx1ZSB8PSAoMSA8PCAyKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCQkvLyBhZGQgdGhpcyBmb3IgTG9vcEJhY2sgbW9kZQotCQlpZiAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBGQUxTRSkKLQkJewotCQkJLy8gRGlzYWJsZSBSeAotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCQlWYWx1ZSAmPSB+KDEgPDwgMyk7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQkJfQotCi0JCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCi0JCXsKLQkJCXBBZC0+YXRlLlR4U3RhdHVzID0gMTsKLQkJfQotI2Vsc2UKLQkJLy8gRGlzYWJsZSBSeAotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJVmFsdWUgJj0gfigxIDw8IDMpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRSURfQUNfQkUgKiBSSU5HUkVHX0RJRkYsICZwQWQtPlR4UmluZ1tRSURfQUNfQkVdLlR4RG1hSWR4KTsKLQkJLy8ga2ljayBUeC1SaW5nLgotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFFJRF9BQ19CRSAqIFJJTkdSRUdfRElGRiwgcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5UeENwdUlkeCk7Ci0KLQkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOwotCX0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhTVE9QIikpCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IFRYU1RPUFxuIikpOwotCQlhdGVtb2RlID0gcEFkLT5hdGUuTW9kZTsKLQkJcEFkLT5hdGUuTW9kZSAmPSBBVEVfVFhTVE9QOwotCQlwQWQtPmF0ZS5iUUFUeFN0YXJ0ID0gRkFMU0U7Ci0vLwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSBwQWQtPmF0ZS5UeENvdW50OwotCi0JCWlmIChhdGVtb2RlID09IEFURV9UWENBUlIpCi0JCXsKLQkJCS8vIE5vIENhcnJpZXIgVGVzdCBzZXQgQkJQIFIyMiBiaXQ3PTAsIGJpdDY9MCwgYml0WzV+MF09MHgwCi0JCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKLQkJCUJicERhdGEgJj0gMHhGRkZGRkYwMDsgLy9jbGVhciBiaXQ3LCBiaXQ2LCBiaXRbNX4wXQotCQkgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7Ci0JCX0KLQkJZWxzZSBpZiAoYXRlbW9kZSA9PSBBVEVfVFhDQVJSU1VQUCkKLQkJewotCQkJLy8gTm8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0wCi0JCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKLQkJCUJicERhdGEgJj0gfigxIDw8IDcpOyAvL3NldCBiaXQ3PTAKLQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOwotCi0JCQkvLyBObyBDYXJyaWVyIFN1cHByZXNzaW9uIHNldCBCQlAgUjI0IGJpdDA9MAotCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCAmQmJwRGF0YSk7Ci0JCQlCYnBEYXRhICY9IDB4RkZGRkZGRkU7IC8vY2xlYXIgYml0MAotCQkgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgQmJwRGF0YSk7Ci0JCX0KLQotCQkvKgotCQkJV2Ugc2hvdWxkIGZyZWUgc29tZSByZXNvdXJjZSB3aGljaCB3YXMgYWxsb2NhdGVkCi0JCQl3aGVuIEFURV9UWEZSQU1FLCBBVEVfU1RPUCwgYW5kIEFURV9UWENPTlQuCi0JCSovCi0JCWVsc2UgaWYgKChhdGVtb2RlICYgQVRFX1RYRlJBTUUpIHx8IChhdGVtb2RlID09IEFURV9TVE9QKSkKLQkJewotCQkJUFJUTVBfVFhfUklORyBwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1FJRF9BQ19CRV07Ci0KLQkJCWlmIChhdGVtb2RlID09IEFURV9UWENPTlQpCi0JCQl7Ci0JCQkJLy8gTm8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0wCi0JCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7Ci0JCQkJQmJwRGF0YSAmPSB+KDEgPDwgNyk7IC8vc2V0IGJpdDc9MAotCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOwotCQkJfQotCi0JCQkvLyBBYm9ydCBUeCwgUnggRE1BLgotCQkJUnRtcERtYUVuYWJsZShwQWQsIDApOwotCi0JCQlmb3IgKGk9MDsgaTxUWF9SSU5HX1NJWkU7IGkrKykKLQkJCXsKLQkJCQlQTkRJU19QQUNLRVQgIHBQYWNrZXQ7Ci0KLSNpZm5kZWYgUlRfQklHX0VORElBTgotCQkJICAgIHBUeEQgPSAoUFRYRF9TVFJVQylwQWQtPlR4UmluZ1tRSURfQUNfQkVdLkNlbGxbaV0uQWxsb2NWYTsKLSNlbHNlCi0JCQlwRGVzdFR4RCA9IChQVFhEX1NUUlVDKXBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uQ2VsbFtpXS5BbGxvY1ZhOwotCQkJVHhEID0gKnBEZXN0VHhEOwotCQkJcFR4RCA9ICZUeEQ7Ci0JCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLSNlbmRpZgotCQkJCXBUeEQtPkRNQURPTkUgPSAwOwotCQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0OwotCi0JCQkJaWYgKHBQYWNrZXQpCi0JCQkJewotCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQkJfQotCi0JCQkJLy8gQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCi0JCQkJcFR4UmluZy0+Q2VsbFtpXS5wTmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQ7Ci0KLQkJCQlpZiAocFBhY2tldCkKLQkJCQl7Ci0JCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCQl9Ci0KLQkJCQkvLyBBbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCi0JCQkJcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQkJCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLQkJCQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOwotI2VuZGlmCi0JCQl9Ci0JCQkvLyBFbmFibGUgVHgsIFJ4IERNQQotCQkJUnRtcERtYUVuYWJsZShwQWQsIDEpOwotCi0JCX0KLQotCQkvLyBUeFN0YXR1cyA6IDAgLS0+IHRhc2sgaXMgaWRsZSwgMSAtLT4gdGFzayBpcyBydW5uaW5nCi0JCXBBZC0+YXRlLlR4U3RhdHVzID0gMDsKLQotCQkvLyBTb2Z0IHJlc2V0IEJCUC4KLQkJQmJwU29mdFJlc2V0KHBBZCk7Ci0KLQkJLy8gRGlzYWJsZSBUeAotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJVmFsdWUgJj0gfigxIDw8IDIpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNtcChhcmcsICJSWFNUT1AiKSkKLQl7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogUlhTVE9QXG4iKSk7Ci0JCWF0ZW1vZGUgPSBwQWQtPmF0ZS5Nb2RlOwotCQlwQWQtPmF0ZS5Nb2RlICY9IEFURV9SWFNUT1A7Ci0JCXBBZC0+YXRlLmJRQVJ4U3RhcnQgPSBGQUxTRTsKLS8vCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IHBBZC0+YXRlLlR4Q291bnQ7Ci0KLQkJaWYgKGF0ZW1vZGUgPT0gQVRFX1RYQ0FSUikKLQkJewotCQkJOwotCQl9Ci0JCWVsc2UgaWYgKGF0ZW1vZGUgPT0gQVRFX1RYQ0FSUlNVUFApCi0JCXsKLQkJCTsKLQkJfQotCi0JCS8qCi0JCQlXZSBzaG91bGQgZnJlZSBzb21lIHJlc291cmNlIHdoaWNoIHdhcyBhbGxvY2F0ZWQKLQkJCXdoZW4gQVRFX1RYRlJBTUUsIEFURV9TVE9QLCBhbmQgQVRFX1RYQ09OVC4KLQkJKi8KLQkJZWxzZSBpZiAoKGF0ZW1vZGUgJiBBVEVfVFhGUkFNRSkgfHwgKGF0ZW1vZGUgPT0gQVRFX1NUT1ApKQotCQl7Ci0JCQlpZiAoYXRlbW9kZSA9PSBBVEVfVFhDT05UKQotCQkJewotCQkJCTsKLQkJCX0KLQkJfQotCi0JCS8vIFNvZnQgcmVzZXQgQkJQLgotCQlCYnBTb2Z0UmVzZXQocEFkKTsKLQotCQkvLyBEaXNhYmxlIFJ4Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSB+KDEgPDwgMyk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotCX0KLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiUlhGUkFNRSIpKQotCXsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBSWEZSQU1FXG4iKSk7Ci0KLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7Ci0KLQkJcEFkLT5hdGUuTW9kZSB8PSBBVEVfUlhGUkFNRTsKLQotCQkvLyBEaXNhYmxlIFR4IG9mIE1BQyBibG9jay4KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCVZhbHVlICY9IH4oMSA8PCAyKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0KLQkJLy8gRW5hYmxlIFJ4IG9mIE1BQyBibG9jay4KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCVZhbHVlIHw9ICgxIDw8IDMpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQl9Ci0JZWxzZQotCXsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBJbnZhbGlkIGFyZyFcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQlSVE1QdXNlY0RlbGF5KDUwMDApOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBBVEVDbWRIYW5kbGVyKClcbiIpKTsKLQotCXJldHVybiBUUlVFOwotfQotLyo9PT09PT09PT09PT09PT09PT09PT09PUVuZCBvZiBSVE1QX01BQ19QQ0kgPT09PT09PT09PT09PT09PT09PT09PT0qLwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0KLQotCi1JTlQJU2V0X0FURV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JaWYgKEFURUNtZEhhbmRsZXIocEFkLCBhcmcpKQotCXsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1Byb2MgU3VjY2Vzc1xuIikpOwotCi0KLQkJcmV0dXJuIFRSVUU7Ci0JfQotCWVsc2UKLQl7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9Qcm9jIEZhaWxlZFxuIikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQVRFIEFERFIxPURBIGZvciBUeEZyYW1lKEFQICA6IFRvIERTID0gMCA7IEZyb20gRFMgPSAxKQotICAgICAgICBvcgotICAgICAgICBTZXQgQVRFIEFERFIzPURBIGZvciBUeEZyYW1lKFNUQSA6IFRvIERTID0gMSA7IEZyb20gRFMgPSAwKQotCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQVRFX0RBX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlQU1RSSU5HCQkJCXZhbHVlOwotCUlOVAkJCQkJaTsKLQotCS8vIE1hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNwotCWlmIChzdHJsZW4oYXJnKSAhPSAxNykKLQkJcmV0dXJuIEZBTFNFOwotCi0gICAgZm9yIChpID0gMCwgdmFsdWUgPSByc3RydG9rKGFyZywgIjoiKTsgdmFsdWU7IHZhbHVlID0gcnN0cnRvayhOVUxMLCAiOiIpKQotCXsKLQkJLyogc2FuaXR5IGNoZWNrICovCi0JCWlmICgoc3RybGVuKHZhbHVlKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp2YWx1ZSkpIHx8ICghaXN4ZGlnaXQoKih2YWx1ZSsxKSkpKQotCQl7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlBdG9IKHZhbHVlLCAmcEFkLT5hdGUuQWRkcjNbaSsrXSwgMSk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JfQotCi0JLyogc2FuaXR5IGNoZWNrICovCi0JaWYgKGkgIT0gNikKLQl7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX0RBX1Byb2MgKERBID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLCBwQWQtPmF0ZS5BZGRyM1swXSwKLQkJcEFkLT5hdGUuQWRkcjNbMV0sIHBBZC0+YXRlLkFkZHIzWzJdLCBwQWQtPmF0ZS5BZGRyM1szXSwgcEFkLT5hdGUuQWRkcjNbNF0sIHBBZC0+YXRlLkFkZHIzWzVdKSk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfREFfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBBRERSMz1TQSBmb3IgVHhGcmFtZShBUCAgOiBUbyBEUyA9IDAgOyBGcm9tIERTID0gMSkKLSAgICAgICAgb3IKLSAgICAgICAgU2V0IEFURSBBRERSMj1TQSBmb3IgVHhGcmFtZShTVEEgOiBUbyBEUyA9IDEgOyBGcm9tIERTID0gMCkKLQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0FURV9TQV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JUFNUUklORwkJCQl2YWx1ZTsKLQlJTlQJCQkJCWk7Ci0KLQkvLyBNYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcKLQlpZiAoc3RybGVuKGFyZykgIT0gMTcpCi0JCXJldHVybiBGQUxTRTsKLQotICAgIGZvciAoaT0wLCB2YWx1ZSA9IHJzdHJ0b2soYXJnLCAiOiIpOyB2YWx1ZTsgdmFsdWUgPSByc3RydG9rKE5VTEwsICI6IikpCi0JewotCQkvKiBzYW5pdHkgY2hlY2sgKi8KLQkJaWYgKChzdHJsZW4odmFsdWUpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnZhbHVlKSkgfHwgKCFpc3hkaWdpdCgqKHZhbHVlKzEpKSkpCi0JCXsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUF0b0godmFsdWUsICZwQWQtPmF0ZS5BZGRyMltpKytdLCAxKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl9Ci0KLQkvKiBzYW5pdHkgY2hlY2sgKi8KLQlpZiAoaSAhPSA2KQotCXsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfU0FfUHJvYyAoU0EgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsIHBBZC0+YXRlLkFkZHIyWzBdLAotCQlwQWQtPmF0ZS5BZGRyMlsxXSwgcEFkLT5hdGUuQWRkcjJbMl0sIHBBZC0+YXRlLkFkZHIyWzNdLCBwQWQtPmF0ZS5BZGRyMls0XSwgcEFkLT5hdGUuQWRkcjJbNV0pKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9TQV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQVRFIEFERFIyPUJTU0lEIGZvciBUeEZyYW1lKEFQICA6IFRvIERTID0gMCA7IEZyb20gRFMgPSAxKQotICAgICAgICBvcgotICAgICAgICBTZXQgQVRFIEFERFIxPUJTU0lEIGZvciBUeEZyYW1lKFNUQSA6IFRvIERTID0gMSA7IEZyb20gRFMgPSAwKQotCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQVRFX0JTU0lEX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlQU1RSSU5HCQkJCXZhbHVlOwotCUlOVAkJCQkJaTsKLQotCS8vIE1hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNwotCWlmIChzdHJsZW4oYXJnKSAhPSAxNykKLQkJcmV0dXJuIEZBTFNFOwotCi0gICAgZm9yIChpPTAsIHZhbHVlID0gcnN0cnRvayhhcmcsICI6Iik7IHZhbHVlOyB2YWx1ZSA9IHJzdHJ0b2soTlVMTCwgIjoiKSkKLQl7Ci0JCS8qIHNhbml0eSBjaGVjayAqLwotCQlpZiAoKHN0cmxlbih2YWx1ZSkgIT0gMikgfHwgKCFpc3hkaWdpdCgqdmFsdWUpKSB8fCAoIWlzeGRpZ2l0KCoodmFsdWUrMSkpKSkKLQkJewotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJQXRvSCh2YWx1ZSwgJnBBZC0+YXRlLkFkZHIxW2krK10sIDEpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLQotCS8qIHNhbml0eSBjaGVjayAqLwotCWlmKGkgIT0gNikKLQl7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX0JTU0lEX1Byb2MgKEJTU0lEID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLAlwQWQtPmF0ZS5BZGRyMVswXSwKLQkJcEFkLT5hdGUuQWRkcjFbMV0sIHBBZC0+YXRlLkFkZHIxWzJdLCBwQWQtPmF0ZS5BZGRyMVszXSwgcEFkLT5hdGUuQWRkcjFbNF0sIHBBZC0+YXRlLkFkZHIxWzVdKSk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfQlNTSURfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBUeCBDaGFubmVsCi0KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9BVEVfQ0hBTk5FTF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUNIQVIgY2hhbm5lbDsKLQotCWNoYW5uZWwgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JLy8gdG8gYWxsb3cgQSBiYW5kIGNoYW5uZWwgOiAoKGNoYW5uZWwgPCAxKSB8fCAoY2hhbm5lbCA+IDE0KSkKLQlpZiAoKGNoYW5uZWwgPCAxKSB8fCAoY2hhbm5lbCA+IDIxNikpCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX0NIQU5ORUxfUHJvYzo6T3V0IG9mIHJhbmdlLCBpdCBzaG91bGQgYmUgaW4gcmFuZ2Ugb2YgMX4xNC5cbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQlwQWQtPmF0ZS5DaGFubmVsID0gY2hhbm5lbDsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfQ0hBTk5FTF9Qcm9jIChBVEUgQ2hhbm5lbCA9ICVkKVxuIiwgcEFkLT5hdGUuQ2hhbm5lbCkpOwotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9DSEFOTkVMX1Byb2MgU3VjY2Vzc1xuIikpOwotCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBUeCBQb3dlcjAKLQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0FURV9UWF9QT1dFUjBfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCUNIQVIgVHhQb3dlcjsKLQotCVR4UG93ZXIgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCi0JewotCQlpZiAoKFR4UG93ZXIgPiAzMSkgfHwgKFR4UG93ZXIgPCAwKSkKLQkJewotCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9QT1dFUjBfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIFR4UG93ZXIpKTsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCX0KLQllbHNlLyogNS41IEdIeiAqLwotCXsKLQkJaWYgKChUeFBvd2VyID4gMTUpIHx8IChUeFBvd2VyIDwgLTcpKQotCQl7Ci0JCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgVHhQb3dlcikpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JfQotCi0JcEFkLT5hdGUuVHhQb3dlcjAgPSBUeFBvd2VyOwotCUFURVR4UHdySGFuZGxlcihwQWQsIDApOwotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9QT1dFUjBfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQVRFIFR4IFBvd2VyMQotCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JQ0hBUiBUeFBvd2VyOwotCi0JVHhQb3dlciA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKLQl7Ci0JCWlmICgoVHhQb3dlciA+IDMxKSB8fCAoVHhQb3dlciA8IDApKQotCQl7Ci0JCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgVHhQb3dlcikpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmICgoVHhQb3dlciA+IDE1KSB8fCAoVHhQb3dlciA8IC03KSkKLQkJewotCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9QT1dFUjFfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIFR4UG93ZXIpKTsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCX0KLQotCXBBZC0+YXRlLlR4UG93ZXIxID0gVHhQb3dlcjsKLQlBVEVUeFB3ckhhbmRsZXIocEFkLCAxKTsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfUE9XRVIxX1Byb2MgU3VjY2Vzc1xuIikpOwotCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBUeCBBbnRlbm5hCi0KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JQ0hBUiB2YWx1ZTsKLQotCXZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmICgodmFsdWUgPiAyKSB8fCAodmFsdWUgPCAwKSkKLQl7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgdmFsdWUpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IHZhbHVlOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9BbnRlbm5hX1Byb2MgKEFudGVubmEgPSAlZClcbiIsIHBBZC0+YXRlLlR4QW50ZW5uYVNlbCkpOwotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmFsaW5rOiBTZXRfQVRFX1RYX0FudGVubmFfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQkvLyBjYWxpYnJhdGlvbiBwb3dlciB1bmJhbGFuY2UgaXNzdWVzLCBtZXJnZWQgZnJvbSBBcmNoIFRlYW0KLQlBVEVBc2ljU3dpdGNoQ2hhbm5lbChwQWQpOwotCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBSeCBBbnRlbm5hCi0KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JQ0hBUiB2YWx1ZTsKLQotCXZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmICgodmFsdWUgPiAzKSB8fCAodmFsdWUgPCAwKSkKLQl7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgdmFsdWUpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IHZhbHVlOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MgKEFudGVubmEgPSAlZClcbiIsIHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCkpOwotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MgU3VjY2Vzc1xuIikpOwotCi0JLy8gY2FsaWJyYXRpb24gcG93ZXIgdW5iYWxhbmNlIGlzc3VlcywgbWVyZ2VkIGZyb20gQXJjaCBUZWFtCi0JQVRFQXNpY1N3aXRjaENoYW5uZWwocEFkKTsKLQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBBVEUgUkYgZnJlcXVlbmNlIG9mZnNldAotCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVDSEFSIFJGRnJlcU9mZnNldCA9IDA7Ci0JVUxPTkcgUjQgPSAwOwotCi0JUkZGcmVxT2Zmc2V0ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLSNpZm5kZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0JaWYgKFJGRnJlcU9mZnNldCA+PSA2NCkKLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQkvKiBSVDM1eHggQVRFIHdpbGwgcmV1c2UgdGhpcyBjb2RlIHNlZ21lbnQuICovCi0jaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0vLzIwMDgvMDgvMDY6IEtIIG1vZGlmaWVkIHRoZSBsaW1pdCBvZiBvZmZzZXQgdmFsdWUgZnJvbSA2NSB0byA5NSgweDVGKQotCWlmIChSRkZyZXFPZmZzZXQgPj0gOTUpCi0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYzo6T3V0IG9mIHJhbmdlLCBpdCBzaG91bGQgYmUgaW4gcmFuZ2Ugb2YgMH42My5cbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCXBBZC0+YXRlLlJGRnJlcU9mZnNldCA9IFJGRnJlcU9mZnNldDsKLSNpZmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLQlpZiAoSVNfUlQzMHh4KHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkpCi0JewotCQkvLyBTZXQgUkYgb2Zmc2V0Ci0JCVVDSEFSIFJGVmFsdWU7Ci0JCUFURV9SRl9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBSRl9SMjMsIChQVUNIQVIpJlJGVmFsdWUpOwotLy8yMDA4LzA4LzA2OiBLSCBtb2RpZmllZCAicEFkLT5SRkZyZXFPZmZzZXQiIHRvICJwQWQtPmF0ZS5SRkZyZXFPZmZzZXQiCi0JCVJGVmFsdWUgPSAoKFJGVmFsdWUgJiAweDgwKSB8IHBBZC0+YXRlLlJGRnJlcU9mZnNldCk7Ci0JCUFURV9SRl9JT19XUklURThfQllfUkVHX0lEKHBBZCwgUkZfUjIzLCAoVUNIQVIpUkZWYWx1ZSk7Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQl7Ci0JCS8vIFJUMjh4eAotCQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCi0JCVI0ID0gcEFkLT5hdGUuUkZGcmVxT2Zmc2V0IDw8IDE1OwotCQlSNCB8PSAocEFkLT5MYXRjaFJmUmVncy5SNCAmICgofjB4MDAxZjgwMDApKSk7Ci0JCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSNDsKLQotCQlSdG1wUmZJb1dyaXRlKHBBZCk7Ci0JfQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jIChSRkZyZXFPZmZzZXQgPSAlZClcbiIsIHBBZC0+YXRlLlJGRnJlcU9mZnNldCkpOwotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2MgU3VjY2Vzc1xuIikpOwotCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBSRiBCVwotCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQVRFX1RYX0JXX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlJTlQgaTsKLQlVQ0hBUiB2YWx1ZSA9IDA7Ci0JVUNIQVIgQkJQQ3VycmVudEJXOwotCi0JQkJQQ3VycmVudEJXID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmICgoQkJQQ3VycmVudEJXID09IDApCi0jaWZkZWYgUlQzMHh4Ci0JCXx8IElTX1JUMjA3MChwQWQpCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0JCSkKLQl7Ci0JCXBBZC0+YXRlLlR4V0kuQlcgPSBCV18yMDsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5hdGUuVHhXSS5CVyA9IEJXXzQwOwotCX0KLQotCS8qIFJUMzV4eCBBVEUgd2lsbCByZXVzZSB0aGlzIGNvZGUgc2VnbWVudC4gKi8KLQkvLyBGaXggdGhlIGVycm9yIHNwZWN0cnVtIG9mIENDSy00ME1IWgotCS8vIFR1cm4gb24gQkJQIDIwTUh6IG1vZGUgYnkgcmVxdWVzdCBoZXJlLgotCWlmICgocEFkLT5hdGUuVHhXSS5QSFlNT0RFID09IE1PREVfQ0NLKSAmJiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV180MCkpCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX0JXX1Byb2MhISBXYXJuaW5nISEgQ0NLIG9ubHkgc3VwcG9ydHMgMjBNSFohIVxuQmFuZHdpZHRoIHN3aXRjaCB0byAyMFxuIikpOwotCQlwQWQtPmF0ZS5UeFdJLkJXID0gQldfMjA7Ci0JfQotCi0JaWYgKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfMjApCi0JewotCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKLQkJewotCQkJZm9yIChpPTA7IGk8NTsgaSsrKQotCQkJewotCQkJCWlmIChwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbaV0gIT0gMHhmZmZmZmZmZikKLQkJCQl7Ci0JCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgcEFkLT5UeDIwTVB3ckNmZ0dCYW5kW2ldKTsKLQkJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlmb3IgKGk9MDsgaTw1OyBpKyspCi0JCQl7Ci0JCQkJaWYgKHBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSAhPSAweGZmZmZmZmZmKQotCQkJCXsKLQkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0pOwotCQkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIFNldCBCQlAgUjQgYml0WzQ6M109MDowCi0JCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmdmFsdWUpOwotCQl2YWx1ZSAmPSAofjB4MTgpOwotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIHZhbHVlKTsKLQotCi0JCS8vIFNldCBCQlAgUjY2PTB4M0MKLQkJdmFsdWUgPSAweDNDOwotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCB2YWx1ZSk7Ci0KLQkJLy8gU2V0IEJCUCBSNjg9MHgwQgotCQkvLyB0byBpbXByb3ZlIFJ4IHNlbnNpdGl2aXR5LgotCQl2YWx1ZSA9IDB4MEI7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjgsIHZhbHVlKTsKLQkJLy8gU2V0IEJCUCBSNjk9MHgxNgotCQl2YWx1ZSA9IDB4MTY7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIHZhbHVlKTsKLQkJLy8gU2V0IEJCUCBSNzA9MHgwOAotCQl2YWx1ZSA9IDB4MDg7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIHZhbHVlKTsKLQkJLy8gU2V0IEJCUCBSNzM9MHgxMQotCQl2YWx1ZSA9IDB4MTE7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIHZhbHVlKTsKLQotCSAgICAvKgotCQkJSWYgQ2hhbm5lbD0xNCwgQmFuZHdpZHRoPTIwTSBhbmQgTW9kZT1DQ0ssIFNldCBCQlAgUjQgYml0NT0xCi0JCQkodG8gc2V0IEphcGFuIGZpbHRlciBjb2VmZmljaWVudHMpLgotCQkJVGhpcyBzZWdtZW50IG9mIGNvZGUgd2lsbCBvbmx5IHdvcmtzIHdoZW4gQVRFVFhNT0RFIGFuZCBBVEVDSEFOTkVMCi0JCQl3ZXJlIHNldCB0byBNT0RFX0NDSyBhbmQgMTQgcmVzcGVjdGl2ZWx5IGJlZm9yZSBBVEVUWEJXIGlzIHNldCB0byAwLgotCSAgICAqLwotCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA9PSAxNCkKLQkJewotCQkJSU5UIFR4TW9kZSA9IHBBZC0+YXRlLlR4V0kuUEhZTU9ERTsKLQotCQkJaWYgKFR4TW9kZSA9PSBNT0RFX0NDSykKLQkJCXsKLQkJCQkvLyB3aGVuIENoYW5uZWw9PTE0ICYmIE1vZGU9PUNDSyAmJiBCYW5kV2lkdGg9PTIwTSwgQkJQIFI0IGJpdDU9MQotCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmdmFsdWUpOwotCQkJCXZhbHVlIHw9IDB4MjA7IC8vc2V0IGJpdDU9MQotCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgdmFsdWUpOwotCQkJfQotCQl9Ci0KLSNpZmRlZiBSVDMweHgKLQkJLy8gc2V0IEJXID0gMjAgTUh6Ci0JCWlmIChJU19SVDMweHgocEFkKSkKLQkJCUFURV9SRl9JT19XUklURThfQllfUkVHX0lEKHBBZCwgUkZfUjI0LCAoVUNIQVIpIHBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0KTsKLQkJZWxzZQotI2VuZGlmIC8vIFJUMzB4eCAvLwotCQkvLyBzZXQgQlcgPSAyMCBNSHoKLQkJewotCQkJcEFkLT5MYXRjaFJmUmVncy5SNCAmPSB+MHgwMDIwMDAwMDsKLQkJCVJ0bXBSZklvV3JpdGUocEFkKTsKLQkJfQotCi0JfQotCS8vIElmIGJhbmR3aWR0aCA9IDQwTSwgc2V0IFJGIFJlZzQgYml0IDIxID0gMC4KLQllbHNlIGlmIChwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzQwKQotCXsKLQkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCi0JCXsKLQkJCWZvciAoaT0wOyBpPDU7IGkrKykKLQkJCXsKLQkJCQlpZiAocEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2ldICE9IDB4ZmZmZmZmZmYpCi0JCQkJewotCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpXSk7Ci0JCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJZm9yIChpPTA7IGk8NTsgaSsrKQotCQkJewotCQkJCWlmIChwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaV0gIT0gMHhmZmZmZmZmZikKLQkJCQl7Ci0JCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2ldKTsKLQkJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKLQkJCQl9Ci0JCQl9Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQlpZiAoKHBBZC0+YXRlLlR4V0kuUEhZTU9ERSA+PSBNT0RFX0hUTUlYKSAmJiAocEFkLT5hdGUuVHhXSS5NQ1MgPT0gNykpCi0JCQl7Ci0JCQl2YWx1ZSA9IDB4Mjg7Ci0JCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY3LCB2YWx1ZSk7Ci0JCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCX0KLQotCQkvLyBTZXQgQkJQIFI0IGJpdFs0OjNdPTE6MAotCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJnZhbHVlKTsKLQkJdmFsdWUgJj0gKH4weDE4KTsKLQkJdmFsdWUgfD0gMHgxMDsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCB2YWx1ZSk7Ci0KLQotCQkvLyBTZXQgQkJQIFI2Nj0weDNDCi0JCXZhbHVlID0gMHgzQzsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgdmFsdWUpOwotCi0JCS8vIFNldCBCQlAgUjY4PTB4MEMKLQkJLy8gdG8gaW1wcm92ZSBSeCBzZW5zaXRpdml0eQotCQl2YWx1ZSA9IDB4MEM7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjgsIHZhbHVlKTsKLQkJLy8gU2V0IEJCUCBSNjk9MHgxQQotCQl2YWx1ZSA9IDB4MUE7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIHZhbHVlKTsKLQkJLy8gU2V0IEJCUCBSNzA9MHgwQQotCQl2YWx1ZSA9IDB4MEE7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIHZhbHVlKTsKLQkJLy8gU2V0IEJCUCBSNzM9MHgxNgotCQl2YWx1ZSA9IDB4MTY7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIHZhbHVlKTsKLQotCQkvLyBJZiBiYW5kd2lkdGggPSA0ME0sIHNldCBSRiBSZWc0IGJpdCAyMSA9IDEuCi0jaWZkZWYgUlQzMHh4Ci0JCS8vIHNldCBCVyA9IDQwIE1IegotCQlpZihJU19SVDMweHgocEFkKSkKLQkJCUFURV9SRl9JT19XUklURThfQllfUkVHX0lEKHBBZCwgUkZfUjI0LCAoVUNIQVIpIHBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0KTsKLQkJZWxzZQotI2VuZGlmIC8vIFJUMzB4eCAvLwotCQkvLyBzZXQgQlcgPSA0MCBNSHoKLQkJewotCQlwQWQtPkxhdGNoUmZSZWdzLlI0IHw9IDB4MDAyMDAwMDA7Ci0JCVJ0bXBSZklvV3JpdGUocEFkKTsKLQkJfQotCX0KLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfQldfUHJvYyAoQkJQQ3VycmVudEJXID0gJWQpXG4iLCBwQWQtPmF0ZS5UeFdJLkJXKSk7Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX0JXX1Byb2MgU3VjY2Vzc1xuIikpOwotCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBUeCBmcmFtZSBsZW5ndGgKLQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0FURV9UWF9MRU5HVEhfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCXBBZC0+YXRlLlR4TGVuZ3RoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmICgocEFkLT5hdGUuVHhMZW5ndGggPCAyNCkgfHwgKHBBZC0+YXRlLlR4TGVuZ3RoID4gKE1BWF9GUkFNRV9TSVpFIC0gMzQvKiA9PSAyMzEyICovKSkpCi0JewotCQlwQWQtPmF0ZS5UeExlbmd0aCA9IChNQVhfRlJBTUVfU0laRSAtIDM0LyogPT0gMjMxMiAqLyk7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfTEVOR1RIX1Byb2M6Ok91dCBvZiByYW5nZSwgaXQgc2hvdWxkIGJlIGluIHJhbmdlIG9mIDI0fiVkLlxuIiwgKE1BWF9GUkFNRV9TSVpFIC0gMzQvKiA9PSAyMzEyICovKSkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9MRU5HVEhfUHJvYyAoVHhMZW5ndGggPSAlZClcbiIsIHBBZC0+YXRlLlR4TGVuZ3RoKSk7Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKLQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBBVEUgVHggZnJhbWUgY291bnQKLQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0FURV9UWF9DT1VOVF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JcEFkLT5hdGUuVHhDb3VudCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0NPVU5UX1Byb2MgKFR4Q291bnQgPSAlZClcbiIsIHBBZC0+YXRlLlR4Q291bnQpKTsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfQ09VTlRfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQVRFIFR4IGZyYW1lIE1DUwotCi0gICAgICAgIFJldHVybjoKLQkJVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0FURV9UWF9NQ1NfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVDSEFSIE1DUzsKLQlJTlQgcmVzdWx0OwotCi0JTUNTID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLSNpZm5kZWYgUlQzMHh4Ci0JcmVzdWx0ID0gQ2hlY2tNQ1NWYWxpZChwQWQtPmF0ZS5UeFdJLlBIWU1PREUsIE1DUyk7Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQkvKiBSVDM1eHggQVRFIHdpbGwgcmV1c2UgdGhpcyBjb2RlIHNlZ21lbnQuICovCi0jaWZkZWYgUlQzMHh4Ci0JcmVzdWx0ID0gQ2hlY2tNQ1NWYWxpZChwQWQtPmF0ZS5UeFdJLlBIWU1PREUsIE1DUywgSVNfUlQyMDcwKHBBZCkpOwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0KLQlpZiAocmVzdWx0ICE9IC0xKQotCXsKLQkJcEFkLT5hdGUuVHhXSS5NQ1MgPSAoVUNIQVIpTUNTOwotCX0KLQllbHNlCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX01DU19Qcm9jOjpPdXQgb2YgcmFuZ2UsIHJlZmVyIHRvIHJhdGUgdGFibGUuXG4iKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX01DU19Qcm9jIChNQ1MgPSAlZClcbiIsIHBBZC0+YXRlLlR4V0kuTUNTKSk7Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX01DU19Qcm9jIFN1Y2Nlc3NcbiIpKTsKLQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBBVEUgVHggZnJhbWUgTW9kZQotICAgICAgICAwOiBNT0RFX0NDSwotICAgICAgICAxOiBNT0RFX09GRE0KLSAgICAgICAgMjogTU9ERV9IVE1JWAotICAgICAgICAzOiBNT0RFX0hUR1JFRU5GSUVMRAotCi0gICAgICAgIFJldHVybjoKLQkJVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0FURV9UWF9NT0RFX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVQ0hBUiBCYnBEYXRhID0gMDsKLQotCXBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAocEFkLT5hdGUuVHhXSS5QSFlNT0RFID4gMykKLQl7Ci0JCXBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9IDA7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfTU9ERV9Qcm9jOjpPdXQgb2YgcmFuZ2UuXG5JdCBzaG91bGQgYmUgaW4gcmFuZ2Ugb2YgMH4zXG4iKSk7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjA6IENDSywgMTogT0ZETSwgMjogSFRfTUlYLCAzOiBIVF9HUkVFTl9GSUVMRC5cbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCS8vIFR1cm4gb24gQkJQIDIwTUh6IG1vZGUgYnkgcmVxdWVzdCBoZXJlLgotCWlmIChwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPT0gTU9ERV9DQ0spCi0JewotCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJicERhdGEpOwotCQlCYnBEYXRhICY9ICh+MHgxOCk7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQmJwRGF0YSk7Ci0JCXBBZC0+YXRlLlR4V0kuQlcgPSBCV18yMDsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9NT0RFX1Byb2M6OkNDSyBPbmx5IHN1cHBvcnQgMjBNSFouIFN3aXRjaCB0byAyME1IWi5cbiIpKTsKLQl9Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX01PREVfUHJvYyAoVHhNb2RlID0gJWQpXG4iLCBwQWQtPmF0ZS5UeFdJLlBIWU1PREUpKTsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfTU9ERV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKLQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBBVEUgVHggZnJhbWUgR0kKLQotICAgICAgICBSZXR1cm46Ci0JCVRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9BVEVfVFhfR0lfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCXBBZC0+YXRlLlR4V0kuU2hvcnRHSSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAocEFkLT5hdGUuVHhXSS5TaG9ydEdJID4gMSkKLQl7Ci0JCXBBZC0+YXRlLlR4V0kuU2hvcnRHSSA9IDA7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfR0lfUHJvYzo6T3V0IG9mIHJhbmdlXG4iKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0dJX1Byb2MgKEdJID0gJWQpXG4iLCBwQWQtPmF0ZS5UeFdJLlNob3J0R0kpKTsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfR0lfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLUlOVAlTZXRfQVRFX1JYX0ZFUl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JcEFkLT5hdGUuYlJ4RkVSID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChwQWQtPmF0ZS5iUnhGRVIgPT0gMSkKLQl7Ci0JCXBBZC0+YXRlLlJ4Q250UGVyU2VjID0gMDsKLQkJcEFkLT5hdGUuUnhUb3RhbENudCA9IDA7Ci0JfQotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9SWF9GRVJfUHJvYyAoYlJ4RkVSID0gJWQpXG4iLCBwQWQtPmF0ZS5iUnhGRVIpKTsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfUlhfRkVSX1Byb2MgU3VjY2Vzc1xuIikpOwotCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1JTlQgU2V0X0FURV9SZWFkX1JGX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLSNpZmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLS8vMjAwOC8wNy8xMDpLSCBhZGQgdG8gc3VwcG9ydCBSVDMweHggQVRFPC0tCi0JaWYgKElTX1JUMzB4eChwQWQpIHx8IElTX1JUMzU3MihwQWQpKQotCXsKLQkJLyogbW9kaWZ5IGJ5IFdZIGZvciBSZWFkIFJGIFJlZy4gZXJyb3IgKi8KLQkJVUNIQVIgUkZWYWx1ZTsKLQkJSU5UIGluZGV4PTA7Ci0KLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMzI7IGluZGV4KyspCi0JCXsKLQkJCUFURV9SRl9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBpbmRleCwgKFBVQ0hBUikmUkZWYWx1ZSk7Ci0JCQlhdGVfcHJpbnQoIlIlZD0lZFxuIixpbmRleCxSRlZhbHVlKTsKLQkJfQotCX0KLQllbHNlCi0vLzIwMDgvMDcvMTA6S0ggYWRkIHRvIHN1cHBvcnQgUlQzMHh4IEFURS0tPgotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCXsKLQkJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlIxID0gJWx4XG4iLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKLQkJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlIyID0gJWx4XG4iLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKLQkJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlIzID0gJWx4XG4iLCBwQWQtPkxhdGNoUmZSZWdzLlIzKTsKLQkJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlI0ID0gJWx4XG4iLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UIFNldF9BVEVfV3JpdGVfUkYxX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVSU5UMzIgdmFsdWUgPSAoVUlOVDMyKSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOwotCi0jaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0vLzIwMDgvMDcvMTA6S0ggYWRkIHRvIHN1cHBvcnQgMzA3MCBBVEU8LS0KLQlpZiAoSVNfUlQzMHh4KHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkpCi0JewotCQlhdGVfcHJpbnQoIldhcm5pbmchISBSVDN4eHggRG9uJ3QgU3VwcG9ydCAhXG4iKTsKLQkJcmV0dXJuIEZBTFNFOwotCi0JfQotCWVsc2UKLS8vMjAwOC8wNy8xMDpLSCBhZGQgdG8gc3VwcG9ydCAzMDcwIEFURS0tPgotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCXsKLQkJcEFkLT5MYXRjaFJmUmVncy5SMSA9IHZhbHVlOwotCQlSdG1wUmZJb1dyaXRlKHBBZCk7Ci0JfQotCXJldHVybiBUUlVFOwotfQotCi0KLUlOVCBTZXRfQVRFX1dyaXRlX1JGMl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUlOVDMyIHZhbHVlID0gKFVJTlQzMikgc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKLQotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotLy8yMDA4LzA3LzEwOktIIGFkZCB0byBzdXBwb3J0IDMwNzAgQVRFPC0tCi0JaWYgKElTX1JUMzB4eChwQWQpIHx8IElTX1JUMzU3MihwQWQpKQotCXsKLQkJYXRlX3ByaW50KCJXYXJuaW5nISEgUlQzeHh4IERvbid0IFN1cHBvcnQgIVxuIik7Ci0JCXJldHVybiBGQUxTRTsKLQotCX0KLQllbHNlCi0vLzIwMDgvMDcvMTA6S0ggYWRkIHRvIHN1cHBvcnQgMzA3MCBBVEUtLT4KLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQl7Ci0JCXBBZC0+TGF0Y2hSZlJlZ3MuUjIgPSB2YWx1ZTsKLQkJUnRtcFJmSW9Xcml0ZShwQWQpOwotCX0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1JTlQgU2V0X0FURV9Xcml0ZV9SRjNfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVJTlQzMiB2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7Ci0KLSNpZmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLS8vMjAwOC8wNy8xMDpLSCBhZGQgdG8gc3VwcG9ydCAzMDcwIEFURTwtLQotCWlmIChJU19SVDMweHgocEFkKSB8fCBJU19SVDM1NzIocEFkKSkKLQl7Ci0JCWF0ZV9wcmludCgiV2FybmluZyEhIFJUM3h4eCBEb24ndCBTdXBwb3J0ICFcbiIpOwotCQlyZXR1cm4gRkFMU0U7Ci0KLQl9Ci0JZWxzZQotLy8yMDA4LzA3LzEwOktIIGFkZCB0byBzdXBwb3J0IDMwNzAgQVRFLS0+Ci0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCi0JewotCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gdmFsdWU7Ci0JCVJ0bXBSZklvV3JpdGUocEFkKTsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UIFNldF9BVEVfV3JpdGVfUkY0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVSU5UMzIgdmFsdWUgPSAoVUlOVDMyKSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOwotCi0jaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0vLzIwMDgvMDcvMTA6S0ggYWRkIHRvIHN1cHBvcnQgMzA3MCBBVEU8LS0KLQlpZiAoSVNfUlQzMHh4KHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkpCi0JewotCQlhdGVfcHJpbnQoIldhcm5pbmchISBSVDN4eHggRG9uJ3QgU3VwcG9ydCAhXG4iKTsKLQkJcmV0dXJuIEZBTFNFOwotCi0JfQotCWVsc2UKLS8vMjAwOC8wNy8xMDpLSCBhZGQgdG8gc3VwcG9ydCAzMDcwIEFURS0tPgotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCXsKLQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IHZhbHVlOwotCQlSdG1wUmZJb1dyaXRlKHBBZCk7Ci0JfQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBMb2FkIGFuZCBXcml0ZSBFRVBST00gZnJvbSBhIGJpbmFyeSBmaWxlIHByZXBhcmVkIGluIGFkdmFuY2UuCi0KLSAgICAgICAgUmV0dXJuOgotCQlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLSNpZiBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKFZYV09SS1MpCi1JTlQgU2V0X0FURV9Mb2FkX0UyUF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JQk9PTEVBTgkJCXJldCA9IEZBTFNFOwotCVBTVFJJTkcJCQlzcmMgPSBFRVBST01fQklOX0ZJTEVfTkFNRTsKLQlSVE1QX09TX0ZECQlzcmNmOwotCUlOVDMyCQkJcmV0dmFsOwotCVVTSE9SVAkJCVdyaXRlRUVQUk9NWyhFRVBST01fU0laRS8yKV07Ci0JSU5UCQkJCUZpbGVMZW5ndGggPSAwOwotCVVJTlQzMgkJCXZhbHVlID0gKFVJTlQzMikgc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlSVE1QX09TX0ZTX0lORk8Jb3NGU0luZm87Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI9PT0+ICVzICh2YWx1ZT0lZClcblxuIiwgX19GVU5DVElPTl9fLCB2YWx1ZSkpOwotCi0JaWYgKHZhbHVlID4gMCkKLQl7Ci0JCS8qIHplcm8gdGhlIGUycCBidWZmZXIgKi8KLQkJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUilXcml0ZUVFUFJPTSwgRUVQUk9NX1NJWkUpOwotCi0JCVJ0bXBPU0ZTSW5mb0NoYW5nZSgmb3NGU0luZm8sIFRSVUUpOwotCi0JCWRvCi0JCXsKLQkJCS8qIG9wZW4gdGhlIGJpbiBmaWxlICovCi0JCQlzcmNmID0gUnRtcE9TRmlsZU9wZW4oc3JjLCBPX1JET05MWSwgMCk7Ci0KLQkJCWlmIChJU19GSUxFX09QRU5fRVJSKHNyY2YpKQotCQkJewotCQkJCWF0ZV9wcmludCgiJXMgLSBFcnJvciBvcGVuaW5nIGZpbGUgJXNcbiIsIF9fRlVOQ1RJT05fXywgc3JjKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogcmVhZCB0aGUgZmlybXdhcmUgZnJvbSB0aGUgZmlsZSAqLmJpbiAqLwotCQkJRmlsZUxlbmd0aCA9IFJ0bXBPU0ZpbGVSZWFkKHNyY2YsIChQU1RSSU5HKVdyaXRlRUVQUk9NLCBFRVBST01fU0laRSk7Ci0KLQkJCWlmIChGaWxlTGVuZ3RoICE9IEVFUFJPTV9TSVpFKQotCQkJewotCQkJCWF0ZV9wcmludCgiJXM6IGVycm9yIGZpbGUgbGVuZ3RoICg9JWQpIGluIGUycC5iaW5cbiIsCi0JCQkJCSAgIF9fRlVOQ1RJT05fXywgRmlsZUxlbmd0aCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLyogd3JpdGUgdGhlIGNvbnRlbnQgb2YgLmJpbiBmaWxlIHRvIEVFUFJPTSAqLwotCQkJCXJ0X2VlX3dyaXRlX2FsbChwQWQsIFdyaXRlRUVQUk9NKTsKLQkJCQlyZXQgPSBUUlVFOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0gd2hpbGUoVFJVRSk7Ci0KLQkJLyogY2xvc2UgZmlybXdhcmUgZmlsZSAqLwotCQlpZiAoSVNfRklMRV9PUEVOX0VSUihzcmNmKSkKLQkJewotCQkJCTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJldHZhbCA9IFJ0bXBPU0ZpbGVDbG9zZShzcmNmKTsKLQotCQkJaWYgKHJldHZhbCkKLQkJCXsKLQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IgJWQgY2xvc2luZyAlc1xuIiwgLXJldHZhbCwgc3JjKSk7Ci0KLQkJCX0KLQkJfQotCi0JCS8qIHJlc3RvcmUgKi8KLQkJUnRtcE9TRlNJbmZvQ2hhbmdlKCZvc0ZTSW5mbywgRkFMU0UpOwotCX0KLQotICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjw9PT0gJXMgKHJldD0lZClcbiIsIF9fRlVOQ1RJT05fXywgcmV0KSk7Ci0KLSAgICByZXR1cm4gcmV0OwotCi19Ci0jZW5kaWYgLy8gZGVmaW5lZChMSU5VWCkgfHwgZGVmaW5lZChWWFdPUktTKSAvLwotCi0KLQotCi1JTlQgU2V0X0FURV9SZWFkX0UyUF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKLQlVU0hPUlQgKnA7Ci0JaW50IGk7Ci0KLQlydF9lZV9yZWFkX2FsbChwQWQsIChVU0hPUlQgKilidWZmZXIpOwotCXAgPSBidWZmZXI7Ci0JZm9yIChpID0gMDsgaSA8IChFRVBST01fU0laRS8yKTsgaSsrKQotCXsKLQkJYXRlX3ByaW50KCIlNC40eCAiLCAqcCk7Ci0JCWlmICgoKGkrMSkgJSAxNikgPT0gMCkKLQkJCWF0ZV9wcmludCgiXG4iKTsKLQkJcCsrOwotCX0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0KLQotSU5UCVNldF9BVEVfU2hvd19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JYXRlX3ByaW50KCJNb2RlPSVkXG4iLCBwQWQtPmF0ZS5Nb2RlKTsKLQlhdGVfcHJpbnQoIlR4UG93ZXIwPSVkXG4iLCBwQWQtPmF0ZS5UeFBvd2VyMCk7Ci0JYXRlX3ByaW50KCJUeFBvd2VyMT0lZFxuIiwgcEFkLT5hdGUuVHhQb3dlcjEpOwotCWF0ZV9wcmludCgiVHhBbnRlbm5hU2VsPSVkXG4iLCBwQWQtPmF0ZS5UeEFudGVubmFTZWwpOwotCWF0ZV9wcmludCgiUnhBbnRlbm5hU2VsPSVkXG4iLCBwQWQtPmF0ZS5SeEFudGVubmFTZWwpOwotCWF0ZV9wcmludCgiQkJQQ3VycmVudEJXPSVkXG4iLCBwQWQtPmF0ZS5UeFdJLkJXKTsKLQlhdGVfcHJpbnQoIkdJPSVkXG4iLCBwQWQtPmF0ZS5UeFdJLlNob3J0R0kpOwotCWF0ZV9wcmludCgiTUNTPSVkXG4iLCBwQWQtPmF0ZS5UeFdJLk1DUyk7Ci0JYXRlX3ByaW50KCJUeE1vZGU9JWRcbiIsIHBBZC0+YXRlLlR4V0kuUEhZTU9ERSk7Ci0JYXRlX3ByaW50KCJBZGRyMT0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJcEFkLT5hdGUuQWRkcjFbMF0sIHBBZC0+YXRlLkFkZHIxWzFdLCBwQWQtPmF0ZS5BZGRyMVsyXSwgcEFkLT5hdGUuQWRkcjFbM10sIHBBZC0+YXRlLkFkZHIxWzRdLCBwQWQtPmF0ZS5BZGRyMVs1XSk7Ci0JYXRlX3ByaW50KCJBZGRyMj0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJcEFkLT5hdGUuQWRkcjJbMF0sIHBBZC0+YXRlLkFkZHIyWzFdLCBwQWQtPmF0ZS5BZGRyMlsyXSwgcEFkLT5hdGUuQWRkcjJbM10sIHBBZC0+YXRlLkFkZHIyWzRdLCBwQWQtPmF0ZS5BZGRyMls1XSk7Ci0JYXRlX3ByaW50KCJBZGRyMz0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJcEFkLT5hdGUuQWRkcjNbMF0sIHBBZC0+YXRlLkFkZHIzWzFdLCBwQWQtPmF0ZS5BZGRyM1syXSwgcEFkLT5hdGUuQWRkcjNbM10sIHBBZC0+YXRlLkFkZHIzWzRdLCBwQWQtPmF0ZS5BZGRyM1s1XSk7Ci0JYXRlX3ByaW50KCJDaGFubmVsPSVkXG4iLCBwQWQtPmF0ZS5DaGFubmVsKTsKLQlhdGVfcHJpbnQoIlR4TGVuZ3RoPSVkXG4iLCBwQWQtPmF0ZS5UeExlbmd0aCk7Ci0JYXRlX3ByaW50KCJUeENvdW50PSV1XG4iLCBwQWQtPmF0ZS5UeENvdW50KTsKLQlhdGVfcHJpbnQoIlJGRnJlcU9mZnNldD0lZFxuIiwgcEFkLT5hdGUuUkZGcmVxT2Zmc2V0KTsKLQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiU2V0X0FURV9TaG93X1Byb2MgU3VjY2Vzc1xuIik7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UCVNldF9BVEVfSGVscF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JYXRlX3ByaW50KCJBVEU9QVRFU1RBUlQsIEFURVNUT1AsIFRYQ09OVCwgVFhDQVJSLCBUWEZSQU1FLCBSWEZSQU1FXG4iKTsKLQlhdGVfcHJpbnQoIkFURURBXG4iKTsKLQlhdGVfcHJpbnQoIkFURVNBXG4iKTsKLQlhdGVfcHJpbnQoIkFURUJTU0lEXG4iKTsKLQlhdGVfcHJpbnQoIkFURUNIQU5ORUwsIHJhbmdlOjB+MTQodW5sZXNzIEEgYmFuZCAhKVxuIik7Ci0JYXRlX3ByaW50KCJBVEVUWFBPVzAsIHNldCBwb3dlciBsZXZlbCBvZiBhbnRlbm5hIDEuXG4iKTsKLQlhdGVfcHJpbnQoIkFURVRYUE9XMSwgc2V0IHBvd2VyIGxldmVsIG9mIGFudGVubmEgMi5cbiIpOwotCWF0ZV9wcmludCgiQVRFVFhBTlQsIHNldCBUWCBhbnRlbm5hLiAwOmFsbCwgMTphbnRlbm5hIG9uZSwgMjphbnRlbm5hIHR3by5cbiIpOwotCWF0ZV9wcmludCgiQVRFUlhBTlQsIHNldCBSWCBhbnRlbm5hLjA6YWxsLCAxOmFudGVubmEgb25lLCAyOmFudGVubmEgdHdvLCAzOmFudGVubmEgdGhyZWUuXG4iKTsKLQlhdGVfcHJpbnQoIkFURVRYRlJFUU9GRlNFVCwgc2V0IGZyZXF1ZW5jeSBvZmZzZXQsIHJhbmdlIDB+NjNcbiIpOwotCWF0ZV9wcmludCgiQVRFVFhCVywgc2V0IEJhbmRXaWR0aCwgMDoyME1IeiwgMTo0ME1Iei5cbiIpOwotCWF0ZV9wcmludCgiQVRFVFhMRU4sIHNldCBGcmFtZSBsZW5ndGgsIHJhbmdlIDI0fiVkXG4iLCAoTUFYX0ZSQU1FX1NJWkUgLSAzNC8qID09IDIzMTIgKi8pKTsKLQlhdGVfcHJpbnQoIkFURVRYQ05ULCBzZXQgaG93IG1hbnkgZnJhbWUgZ29pbmcgdG8gdHJhbnNtaXQuXG4iKTsKLQlhdGVfcHJpbnQoIkFURVRYTUNTLCBzZXQgTUNTLCByZWZlcmVuY2UgdG8gcmF0ZSB0YWJsZS5cbiIpOwotCWF0ZV9wcmludCgiQVRFVFhNT0RFLCBzZXQgTW9kZSAwOkNDSywgMTpPRkRNLCAyOkhULU1peCwgMzpHcmVlbkZpZWxkLCByZWZlcmVuY2UgdG8gcmF0ZSB0YWJsZS5cbiIpOwotCWF0ZV9wcmludCgiQVRFVFhHSSwgc2V0IEdJIGludGVydmFsLCAwOkxvbmcsIDE6U2hvcnRcbiIpOwotCWF0ZV9wcmludCgiQVRFUlhGRVIsIDA6ZGlzYWJsZSBSeCBGcmFtZSBlcnJvciByYXRlLiAxOmVuYWJsZSBSeCBGcmFtZSBlcnJvciByYXRlLlxuIik7Ci0JYXRlX3ByaW50KCJBVEVSUkYsIHNob3cgYWxsIFJGIHJlZ2lzdGVycy5cbiIpOwotCWF0ZV9wcmludCgiQVRFV1JGMSwgc2V0IFJGMSByZWdpc3Rlci5cbiIpOwotCWF0ZV9wcmludCgiQVRFV1JGMiwgc2V0IFJGMiByZWdpc3Rlci5cbiIpOwotCWF0ZV9wcmludCgiQVRFV1JGMywgc2V0IFJGMyByZWdpc3Rlci5cbiIpOwotCWF0ZV9wcmludCgiQVRFV1JGNCwgc2V0IFJGNCByZWdpc3Rlci5cbiIpOwotCWF0ZV9wcmludCgiQVRFTERFMlAsIGxvYWQgRUVQUk9NIGZyb20gLmJpbiBmaWxlLlxuIik7Ci0JYXRlX3ByaW50KCJBVEVSRTJQLCBkaXNwbGF5IGFsbCBFRVBST00gY29udGVudC5cbiIpOwotCWF0ZV9wcmludCgiQVRFU0hPVywgZGlzcGxheSBhbGwgcGFyYW1ldGVycyBvZiBBVEUuXG4iKTsKLQlhdGVfcHJpbnQoIkFURUhFTFAsIG9ubGluZSBoZWxwLlxuIik7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0KLQlBc2ljU3dpdGNoQ2hhbm5lbCgpIGRlZGljYXRlZCBmb3IgQVRFLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQVRFQXNpY1N3aXRjaENoYW5uZWwoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUlOVDMyIFIyID0gMCwgUjMgPSBERUZBVUxUX1JGX1RYX1BPV0VSLCBSNCA9IDAsIFZhbHVlID0gMDsKLQlDSEFSIFR4UHdlciA9IDAsIFR4UHdlcjIgPSAwOwotCVVDSEFSIGluZGV4ID0gMCwgQmJwVmFsdWUgPSAwLCBSNjYgPSAweDMwOwotCVJUTVBfUkZfUkVHUyAqUkZSZWdUYWJsZTsKLQlVQ0hBUiBDaGFubmVsID0gMDsKLQotCVJGUmVnVGFibGUgPSBOVUxMOwotCi0jaWZkZWYgUkFMSU5LXzI4eHhfUUEKLQkvLyBmb3IgUUEgbW9kZSwgVFggcG93ZXIgdmFsdWVzIGFyZSBwYXNzZWQgZnJvbSBVSQotCWlmICgocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSB8fCAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBUUlVFKSkKLQl7Ci0JCWlmIChwQWQtPmF0ZS5DaGFubmVsICE9IHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCkKLQkJewotCQkJcEFkLT5hdGUuQ2hhbm5lbCA9IHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbDsKLQkJfQotCQlyZXR1cm47Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCUNoYW5uZWwgPSBwQWQtPmF0ZS5DaGFubmVsOwotCi0JLy8gc2VsZWN0IGFudGVubmEgZm9yIFJUMzA5MAotCUFzaWNBbnRlbm5hU2VsZWN0KHBBZCwgQ2hhbm5lbCk7Ci0KLQkvLyBmaWxsIFR4IHBvd2VyIHZhbHVlCi0JVHhQd2VyID0gcEFkLT5hdGUuVHhQb3dlcjA7Ci0JVHhQd2VyMiA9IHBBZC0+YXRlLlR4UG93ZXIxOwotI2lmZGVmIFJUMzB4eAotLy8yMDA4LzA3LzEwOktIIGFkZCB0byBzdXBwb3J0IDMwNzAgQVRFPC0tCi0KLQkvKgotCQlUaGUgUkYgcHJvZ3JhbW1pbmcgc2VxdWVuY2UgaXMgZGlmZmVyZW5jZSBiZXR3ZWVuIDN4eHggYW5kIDJ4eHguCi0JCVRoZSAzMDcwIGlzIDFUMVIuIFRoZXJlZm9yZSwgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdGhlIG51bWJlciBvZiBUeC9SeCBwYXRoCi0JCWFuZCB0aGUgb25seSBqb2IgaXMgdG8gc2V0IHRoZSBwYXJhbWV0ZXJzIG9mIGNoYW5uZWxzLgotCSovCi0JaWYgKElTX1JUMzB4eChwQWQpICYmICgocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApIHx8Ci0JCQkocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjEpIHx8IChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMikgfHwKLQkJCShwQWQtPlJmSWNUeXBlID09IFJGSUNfMjAyMCkpKQotCXsKLQkJLyogbW9kaWZ5IGJ5IFdZIGZvciBSZWFkIFJGIFJlZy4gZXJyb3IgKi8KLQkJVUNIQVIgUkZWYWx1ZSA9IDA7Ci0KLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzMwMjBfQ0hOTDsgaW5kZXgrKykKLQkJewotCQkJaWYgKENoYW5uZWwgPT0gRnJlcUl0ZW1zMzAyMFtpbmRleF0uQ2hhbm5lbCkKLQkJCXsKLQkJCQkvLyBQcm9ncmFtbWluZyBjaGFubmVsIHBhcmFtZXRlcnMuCi0JCQkJQVRFX1JGX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBSRl9SMDIsIEZyZXFJdGVtczMwMjBbaW5kZXhdLk4pOwotCQkJCUFURV9SRl9JT19XUklURThfQllfUkVHX0lEKHBBZCwgUkZfUjAzLCBGcmVxSXRlbXMzMDIwW2luZGV4XS5LKTsKLQotCQkJCUFURV9SRl9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBSRl9SMDYsIChQVUNIQVIpJlJGVmFsdWUpOwotCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4RkMpIHwgRnJlcUl0ZW1zMzAyMFtpbmRleF0uUjsKLQkJCQlBVEVfUkZfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIFJGX1IwNiwgKFVDSEFSKVJGVmFsdWUpOwotCi0JCQkJLy8gU2V0IFR4IFBvd2VyLgotCQkJCUFURV9SRl9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBSRl9SMTIsIChQVUNIQVIpJlJGVmFsdWUpOwotCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4RTApIHwgVHhQd2VyOwotCQkJCUFURV9SRl9JT19XUklURThfQllfUkVHX0lEKHBBZCwgUkZfUjEyLCAoVUNIQVIpUkZWYWx1ZSk7Ci0KLQkJCQkvLyBTZXQgUkYgb2Zmc2V0LgotCQkJCUFURV9SRl9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBSRl9SMjMsIChQVUNIQVIpJlJGVmFsdWUpOwotCQkJCS8vMjAwOC8wOC8wNjogS0ggbW9kaWZpZWQgInBBZC0+UkZGcmVxT2Zmc2V0IiB0byAicEFkLT5hdGUuUkZGcmVxT2Zmc2V0IgotCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4ODApIHwgcEFkLT5hdGUuUkZGcmVxT2Zmc2V0OwotCQkJCUFURV9SRl9JT19XUklURThfQllfUkVHX0lEKHBBZCwgUkZfUjIzLCAoVUNIQVIpUkZWYWx1ZSk7Ci0KLQkJCQkvLyBTZXQgQlcuCi0JCQkJaWYgKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfNDApCi0JCQkJewotCQkJCQlSRlZhbHVlID0gcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQ7Ci0vLwkJCQkJRElTQUJMRV8xMU5fQ0hFQ0socEFkKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJUkZWYWx1ZSA9IHBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0OwotCQkJCX0KLQkJCQlBVEVfUkZfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIFJGX1IyNCwgKFVDSEFSKVJGVmFsdWUpOwotCi0JCQkJLy8gRW5hYmxlIFJGIHR1bmluZwotCQkJCUFURV9SRl9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBSRl9SMDcsIChQVUNIQVIpJlJGVmFsdWUpOwotCQkJCVJGVmFsdWUgPSBSRlZhbHVlIHwgMHgxOwotCQkJCUFURV9SRl9JT19XUklURThfQllfUkVHX0lEKHBBZCwgUkZfUjA3LCAoVUNIQVIpUkZWYWx1ZSk7Ci0KLQkJCQkvLyBsYXRjaCBjaGFubmVsIGZvciBmdXR1cmUgdXNhZ2UKLQkJCQlwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPSBDaGFubmVsOwotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hDaGFubmVsIyVkKFJGPSVkLCBQd3IwPSVkLCBQd3IxPSVkLCAlZFQpLCBOPTB4JTAyWCwgSz0weCUwMlgsIFI9MHglMDJYXG4iLAotCQkJQ2hhbm5lbCwKLQkJCXBBZC0+UmZJY1R5cGUsCi0JCQlUeFB3ZXIsCi0JCQlUeFB3ZXIyLAotCQkJcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKLQkJCUZyZXFJdGVtczMwMjBbaW5kZXhdLk4sCi0JCQlGcmVxSXRlbXMzMDIwW2luZGV4XS5LLAotCQkJRnJlcUl0ZW1zMzAyMFtpbmRleF0uUikpOwotCX0KLQllbHNlCi0vLzIwMDgvMDcvMTA6S0ggYWRkIHRvIHN1cHBvcnQgMzA3MCBBVEUtLT4KLSNlbmRpZiAvLyBSVDMweHggLy8KLQl7Ci0JCS8qIFJUMjh4eCAqLwotCQlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7Ci0KLQkJc3dpdGNoIChwQWQtPlJmSWNUeXBlKQotCQl7Ci0JCQkvKiBCdXQgb25seSAyODUwIGFuZCAyNzUwIHN1cHBvcnQgNS41R0h6IGJhbmQuLi4gKi8KLQkJCWNhc2UgUkZJQ18yODIwOgotCQkJY2FzZSBSRklDXzI4NTA6Ci0JCQljYXNlIFJGSUNfMjcyMDoKLQkJCWNhc2UgUkZJQ18yNzUwOgotCi0JCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzI4NTBfQ0hOTDsgaW5kZXgrKykKLQkJCQl7Ci0JCQkJCWlmIChDaGFubmVsID09IFJGUmVnVGFibGVbaW5kZXhdLkNoYW5uZWwpCi0JCQkJCXsKLQkJCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjI7Ci0KLQkJCQkJCS8vIElmIFRYIHBhdGggaXMgMSwgYml0IDE0ID0gMTsKLQkJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCQkJCQl7Ci0JCQkJCQkJUjIgfD0gMHg0MDAwOwotCQkJCQkJfQotCi0JCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQotCQkJCQkJewotCQkJCQkJCXN3aXRjaCAocEFkLT5hdGUuUnhBbnRlbm5hU2VsKQotCQkJCQkJCXsKLQkJCQkJCQkJY2FzZSAxOgotCQkJCQkJCQkJUjIgfD0gMHgyMDA0MDsKLQkJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOwotCQkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKLQkJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDA7Ci0JCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQljYXNlIDI6Ci0JCQkJCQkJCQlSMiB8PSAweDEwMDQwOwotCQkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7Ci0JCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OwotCQkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwMTsKLQkJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCQlSMiB8PSAweDQwOwotCQkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7Ci0JCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OwotCQkJCQkJCQkJLyogT25seSBlbmFibGUgdHdvIEFudGVubmEgdG8gcmVjZWl2ZS4gKi8KLQkJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDg7Ci0JCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQkJCQkJCXsKLQkJCQkJCQkvLyB3cml0ZSAxIHRvIG9mZiBSeFBhdGgKLQkJCQkJCQlSMiB8PSAweDIwMDQwOwotCQkJCQkJfQotCi0JCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKQotCQkJCQkJewotCQkJCQkJCWlmIChwQWQtPmF0ZS5UeEFudGVubmFTZWwgPT0gMSkKLQkJCQkJCQl7Ci0JCQkJCQkJCS8vIElmIFRYIEFudGVubmEgc2VsZWN0IGlzIDEgLCBiaXQgMTQgPSAxOyBEaXNhYmxlIEFudCAyCi0JCQkJCQkJCVIyIHw9IDB4NDAwMDsKLQkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCYnBWYWx1ZSk7Ci0JCQkJCQkJCUJicFZhbHVlICY9IDB4RTc7CQkvLyAxMTEwMDExMUIKLQkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBWYWx1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKHBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9PSAyKQotCQkJCQkJCXsKLQkJCQkJCQkJLy8gSWYgVFggQW50ZW5uYSBzZWxlY3QgaXMgMiAsIGJpdCAxNSA9IDE7IERpc2FibGUgQW50IDEKLQkJCQkJCQkJUjIgfD0gMHg4MDAwOwotCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJicFZhbHVlKTsKLQkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNzsKLQkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwODsKLQkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBWYWx1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UKLQkJCQkJCQl7Ci0JCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQmJwVmFsdWUpOwotCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU3OwotCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDEwOwotCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJicFZhbHVlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQotCQkJCQkJewotCQkJCQkJCXN3aXRjaCAocEFkLT5hdGUuUnhBbnRlbm5hU2VsKQotCQkJCQkJCXsKLQkJCQkJCQkJY2FzZSAxOgotCQkJCQkJCQkJUjIgfD0gMHgyMDA0MDsKLQkJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOwotCQkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKLQkJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDA7Ci0JCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQljYXNlIDI6Ci0JCQkJCQkJCQlSMiB8PSAweDEwMDQwOwotCQkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7Ci0JCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OwotCQkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwMTsKLQkJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWNhc2UgMzoKLQkJCQkJCQkJCVIyIHw9IDB4MzAwMDA7Ci0JCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKLQkJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7Ci0JCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDAyOwotCQkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOwotCQkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKLQkJCQkJCQkJCUJicFZhbHVlIHw9IDB4MTA7Ci0JCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJaWYgKENoYW5uZWwgPiAxNCkKLQkJCQkJCXsKLQkJCQkJCQkvLyBpbml0aWFsaXplIFIzLCBSNAotCQkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZik7Ci0JCQkJCQkJUjQgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjQgJiAofjB4MDAxZjg3YzApKSB8IChwQWQtPmF0ZS5SRkZyZXFPZmZzZXQgPDwgMTUpOwotCi0JCSAgICAgICAgICAgICAgICAgICAgLyoKLQkJCSAgICAgICAgICAgICAgICAgICAgQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgotCi0JCQkJCQkJCTUuNUcgYmFuZCBwb3dlciByYW5nZSA6IDB4Rjl+MFgwRiwgVFgwIFJlZzMgYml0OS9UWDEgUmVnNCBiaXQ2PSIwIgotCQkJCQkJCQkJCQkJCQltZWFucyB0aGUgVFggcG93ZXIgcmVkdWNlIDdkQi4KLQkJCQkJCQkqLwotCQkJCQkJCS8vIFIzCi0JCQkJCQkJaWYgKChUeFB3ZXIgPj0gLTcpICYmIChUeFB3ZXIgPCAwKSkKLQkJCQkJCQl7Ci0JCQkJCQkJCVR4UHdlciA9ICg3K1R4UHdlcik7Ci0JCQkJCQkJCVR4UHdlciA9IChUeFB3ZXIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyKTsKLQkJCQkJCQkJUjMgfD0gKFR4UHdlciA8PCAxMCk7Ci0JCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURUFzaWNTd2l0Y2hDaGFubmVsOiBUeFB3ZXI9JWQgXG4iLCBUeFB3ZXIpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJVHhQd2VyID0gKFR4UHdlciA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIpOwotCQkJCQkJCQlSMyB8PSAoVHhQd2VyIDw8IDEwKSB8ICgxIDw8IDkpOwotCQkJCQkJCX0KLQotCQkJCQkJCS8vIFI0Ci0JCQkJCQkJaWYgKChUeFB3ZXIyID49IC03KSAmJiAoVHhQd2VyMiA8IDApKQotCQkJCQkJCXsKLQkJCQkJCQkJVHhQd2VyMiA9ICg3K1R4UHdlcjIpOwotCQkJCQkJCQlUeFB3ZXIyID0gKFR4UHdlcjIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyMik7Ci0JCQkJCQkJCVI0IHw9IChUeFB3ZXIyIDw8IDcpOwotCQkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEVBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyMj0lZCBcbiIsIFR4UHdlcjIpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJVHhQd2VyMiA9IChUeFB3ZXIyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcjIpOwotCQkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KSB8ICgxIDw8IDYpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQkvLyBTZXQgVFggcG93ZXIwLgotCQkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZikgfCAoVHhQd2VyIDw8IDkpOwotCQkJCQkJCS8vIFNldCBmcmVxdWVuY3kgb2Zmc2V0IGFuZCBUWCBwb3dlcjEuCi0JCQkJCQkJUjQgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjQgJiAofjB4MDAxZjg3YzApKSB8IChwQWQtPmF0ZS5SRkZyZXFPZmZzZXQgPDwgMTUpIHwgKFR4UHdlcjIgPDw2KTsKLQkJCQkJCX0KLQotCQkJCQkJLy8gYmFzZWQgb24gQkJQIGN1cnJlbnQgbW9kZSBiZWZvcmUgY2hhbmdpbmcgUkYgY2hhbm5lbAotCQkJCQkJaWYgKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfNDApCi0JCQkJCQl7Ci0JCQkJCQkJUjQgfD0weDIwMDAwMDsKLQkJCQkJCX0KLQotCQkJCQkJLy8gVXBkYXRlIHZhcmlhYmxlcy4KLQkJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IENoYW5uZWw7Ci0JCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIxID0gUkZSZWdUYWJsZVtpbmRleF0uUjE7Ci0JCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIyID0gUjI7Ci0JCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjM7Ci0JCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjQ7Ci0KLQkJCQkJCVJ0bXBSZklvV3JpdGUocEFkKTsKLQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvLyBDaGFuZ2UgQkJQIHNldHRpbmcgZHVyaW5nIHN3aXRjaCBmcm9tIGEtPmcsIGctPmEKLQlpZiAoQ2hhbm5lbCA8PSAxNCkKLQl7Ci0JICAgIFVJTlQzMiBUeFBpbkNmZyA9IDB4MDAwNTBGMEE7Ly8gMjAwNy4xMC4wOSBieSBCcmlhbiA6IDB4MDAwNTA1MEEgPT0+IDB4MDAwNTBGMEEKLQotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOwotCi0JCS8qIEZvciAxVC8yUiBjaGlwIG9ubHkuLi4gKi8KLQkgICAgaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcpCi0JICAgIHsKLQkgICAgICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4NjIpOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCSAgICAgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg4NCk7Ci0JICAgIH0KLQotICAgICAgICAvLyBBY2NvcmRpbmcgdGhlIFJvcnkncyBzdWdnZXN0aW9uIHRvIHNvbHZlIHRoZSBtaWRkbGUgcmFuZ2UgaXNzdWUuCi0JCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgJkJicFZhbHVlKTsvLyBtYXkgYmUgcmVtb3ZlZCBmb3IgUlQzNXh4ICsrCi0KLQkJQVNTRVJUKChCYnBWYWx1ZSA9PSAweDAwKSk7Ci0JCWlmICgoQmJwVmFsdWUgIT0gMHgwMCkpCi0JCXsKLQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDB4MDApOwotCQl9Ly8gbWF5IGJlIHJlbW92ZWQgZm9yIFJUMzV4eCAtLQotCi0JCS8vIDUuNSBHSHogYmFuZCBzZWxlY3Rpb24gUElOLCBiaXQxIGFuZCBiaXQyIGFyZSBjb21wbGVtZW50Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7Ci0JCVZhbHVlICY9ICh+MHg2KTsKLQkJVmFsdWUgfD0gKDB4MDQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOwotCi0gICAgICAgIC8vIFR1cm4gb2ZmIHVudXNlZCBQQSBvciBMTkEgd2hlbiBvbmx5IDFUIG9yIDFSLgotCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQotCQl7Ci0JCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOwotCQl9Ci0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7Ci0JCX0KLQotCQkvLyBjYWxpYnJhdGlvbiBwb3dlciB1bmJhbGFuY2UgaXNzdWVzCi0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpCi0JCXsKLQkJCWlmIChwQWQtPmF0ZS5UeEFudGVubmFTZWwgPT0gMSkKLQkJCXsKLQkJCQlUeFBpbkNmZyAmPSAweEZGRkZGRkY3OwotCQkJfQotCQkJZWxzZSBpZiAocEFkLT5hdGUuVHhBbnRlbm5hU2VsID09IDIpCi0JCQl7Ci0JCQkJVHhQaW5DZmcgJj0gMHhGRkZGRkZGRDsKLQkJCX0KLQkJfQotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKLQl9Ci0JZWxzZQotCXsKLQkgICAgVUlOVDMyCVR4UGluQ2ZnID0gMHgwMDA1MEYwNTsvLyAyMDA3LjEwLjA5IGJ5IEJyaWFuIDogMHgwMDA1MDUwNSA9PT4gMHgwMDA1MEYwNQotCi0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjIsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MywgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOwotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY0LCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4RjIpOwotCi0gICAgICAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KLQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAmQmJwVmFsdWUpOy8vIG1heSBiZSByZW1vdmVkIGZvciBSVDM1eHggKysKLQotCQlBU1NFUlQoKEJicFZhbHVlID09IDB4MDApKTsKLQkJaWYgKChCYnBWYWx1ZSAhPSAweDAwKSkKLQkJewotCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgMHgwMCk7Ci0JCX0KLQotCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SOTEsICZCYnBWYWx1ZSk7Ci0JCUFTU0VSVCgoQmJwVmFsdWUgPT0gMHgwNCkpOwotCi0JCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I5MiwgJkJicFZhbHVlKTsKLQkJQVNTRVJUKChCYnBWYWx1ZSA9PSAweDAwKSk7Ly8gbWF5IGJlIHJlbW92ZWQgZm9yIFJUMzV4eCAtLQotCi0JCS8vIDUuNSBHSHogYmFuZCBzZWxlY3Rpb24gUElOLCBiaXQxIGFuZCBiaXQyIGFyZSBjb21wbGVtZW50Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7Ci0JCVZhbHVlICY9ICh+MHg2KTsKLQkJVmFsdWUgfD0gKDB4MDIpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOwotCi0JCS8vIFR1cm4gb2ZmIHVudXNlZCBQQSBvciBMTkEgd2hlbiBvbmx5IDFUIG9yIDFSLgotCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQotCQl7Ci0JCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOwotCQl9Ci0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7Ci0JCX0KLQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7Ci0JfQotCi0KLSAgICAvLyBSNjYgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8gQ2hhbm5lbCBhbmQgdXNlIDIwTUh6IHdoZW4gc2Nhbm5pbmcKLQlpZiAoQ2hhbm5lbCA8PSAxNCkKLQl7Ci0JCS8vIEJHIGJhbmQKLQkJUjY2ID0gMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpOwotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCX0KLQllbHNlCi0JewotCQkvLyA1LjUgR0h6IGJhbmQKLQkJaWYgKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfMjApCi0JCXsKLQkJCVI2NiA9IChVQ0hBUikoMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zKTsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVI2NiA9IChVQ0hBUikoMHgzQSArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zKTsKLQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7Ci0JCX0KLQl9Ci0KLQkvKgotCQlPbiAxMUEsIFdlIHNob3VsZCBkZWxheSBhbmQgd2FpdCBSRi9CQlAgdG8gYmUgc3RhYmxlCi0JCWFuZCB0aGUgYXBwcm9wcmlhdGUgdGltZSBzaG91bGQgYmUgMTAwMCBtaWNybyBzZWNvbmRzLgotCi0JCTIwMDUvMDYvMDUgLSBPbiAxMUcsIFdlIGFsc28gbmVlZCB0aGlzIGRlbGF5IHRpbWUuIE90aGVyd2lzZSBpdCdzIGRpZmZpY3VsdCB0byBwYXNzIHRoZSBXSFFMLgotCSovCi0JUlRNUHVzZWNEZWxheSgxMDAwKTsKLQotI2lmbmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLQlpZiAoQ2hhbm5lbCA+IDE0KQotCXsKLQkJLy8gV2hlbiA1LjVHSHogYmFuZCB0aGUgTFNCIG9mIFR4UHdyIHdpbGwgYmUgdXNlZCB0byByZWR1Y2VkIDdkQiBvciBub3QuCi0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsICVkVCkgdG8gLCBSMT0weCUwOGx4LCBSMj0weCUwOGx4LCBSMz0weCUwOGx4LCBSND0weCUwOGx4XG4iLAotCQkJCQkJCQkgIENoYW5uZWwsCi0JCQkJCQkJCSAgcEFkLT5SZkljVHlwZSwKLQkJCQkJCQkJICBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAotCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjEsCi0JCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMiwKLQkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIzLAotCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpKTsKLQl9Ci0JZWxzZQotCXsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3dpdGNoQ2hhbm5lbCMlZChSRj0lZCwgUHdyMD0ldSwgUHdyMT0ldSwgJWRUKSB0byAsIFIxPTB4JTA4bHgsIFIyPTB4JTA4bHgsIFIzPTB4JTA4bHgsIFI0PTB4JTA4bHhcbiIsCi0JCQkJCQkJCSAgQ2hhbm5lbCwKLQkJCQkJCQkJICBwQWQtPlJmSWNUeXBlLAotCQkJCQkJCQkgIChSMyAmIDB4MDAwMDNlMDApID4+IDksCi0JCQkJCQkJCSAgKFI0ICYgMHgwMDAwMDdjMCkgPj4gNiwKLQkJCQkJCQkJICBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAotCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjEsCi0JCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMiwKLQkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIzLAotCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpKTsKLSAgICB9Ci0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCi19Ci0KLQotCi0vKiBJbiBmYWN0LCBubyBvbmUgd2lsbCBjYWxsIHRoaXMgcm91dGluZSBzbyBmYXIgISAqLwotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJR2l2ZXMgQ0NLIFRYIHJhdGUgMiBtb3JlIGRCIFRYIHBvd2VyLgotCQlUaGlzIHJvdXRpbmUgd29ya3Mgb25seSBpbiBBVEUgbW9kZS4KLQotCQljYWxjdWxhdGUgZGVzaXJlZCBUeCBwb3dlciBpbiBSRiBSMy5UeDB+NSwJc2hvdWxkIGNvbnNpZGVyIC0KLQkJMC4gaWYgY3VycmVudCByYWRpbyBpcyBhIG5vaXN5IGVudmlyb25tZW50IChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KQotCQkxLiBUeFBvd2VyUGVyY2VudGFnZQotCQkyLiBhdXRvIGNhbGlicmF0aW9uIGJhc2VkIG9uIFRTU0kgZmVlZGJhY2sKLQkJMy4gZXh0cmEgMiBkYiBmb3IgQ0NLCi0JCTQuIC0xMCBkYiB1cG9uIHZlcnktc2hvcnQgZGlzdGFuY2UgKEF2Z1JTU0kgPj0gLTQwZGIpIHRvIEFQCi0KLQlOT1RFOiBTaW5jZSB0aGlzIHJvdXRpbmUgcmVxdWlyZXMgdGhlIHZhbHVlIG9mIChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KSwKLQkJaXQgc2hvdWxkIGJlIGNhbGxlZCBBRlRFUiBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygpCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQVRFQXNpY0FkanVzdFR4UG93ZXIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JSU5UCQkJaSwgajsKLQlDSEFSCQlEZWx0YVB3ciA9IDA7Ci0JQk9PTEVBTgkJYkF1dG9UeEFnYyA9IEZBTFNFOwotCVVDSEFSCQlUc3NpUmVmLCAqcFRzc2lNaW51c0JvdW5kYXJ5LCAqcFRzc2lQbHVzQm91bmRhcnksIFR4QWdjU3RlcDsKLQlVQ0hBUgkJQmJwUjQ5ID0gMCwgaWR4OwotCVBDSEFSCQlwVHhBZ2NDb21wZW5zYXRlOwotCVVMT05HCQlUeFB3cls1XTsKLQlDSEFSCQlWYWx1ZTsKLQotCS8qIG5vIG9uZSBjYWxscyB0aGlzIHByb2NlZHVyZSBzbyBmYXIgKi8KLQlpZiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV180MCkKLQl7Ci0JCWlmIChwQWQtPmF0ZS5DaGFubmVsID4gMTQpCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbNF07Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFswXTsKLQkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzFdOwotCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMl07Ci0JCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFszXTsKLQkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzRdOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChwQWQtPmF0ZS5DaGFubmVsID4gMTQpCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbNF07Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFswXTsKLQkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzFdOwotCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMl07Ci0JCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFszXTsKLQkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzRdOwotCQl9Ci0JfQotCi0JLy8gVFggcG93ZXIgY29tcGVuc2F0aW9uIGZvciB0ZW1wZXJhdHVyZSB2YXJpYXRpb24gYmFzZWQgb24gVFNTSS4KLQkvLyBEbyBpdCBwZXIgNCBzZWNvbmRzLgotCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDQgPT0gMCkKLQl7Ci0JCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQotCQl7Ci0JCQkvKiBiZyBjaGFubmVsICovCi0JCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOwotCQkJVHNzaVJlZiAgICAgICAgICAgID0gcEFkLT5Uc3NpUmVmRzsKLQkJCXBUc3NpTWludXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1swXTsKLQkJCXBUc3NpUGx1c0JvdW5kYXJ5ICA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdOwotCQkJVHhBZ2NTdGVwICAgICAgICAgID0gcEFkLT5UeEFnY1N0ZXBHOwotCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8qIGEgY2hhbm5lbCAqLwotCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjQTsKLQkJCVRzc2lSZWYgICAgICAgICAgICA9IHBBZC0+VHNzaVJlZkE7Ci0JCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMF07Ci0JCQlwVHNzaVBsdXNCb3VuZGFyeSAgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVswXTsKLQkJCVR4QWdjU3RlcCAgICAgICAgICA9IHBBZC0+VHhBZ2NTdGVwQTsKLQkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7Ci0JCX0KLQotCQlpZiAoYkF1dG9UeEFnYykKLQkJewotCQkJLyogQmJwUjQ5IGlzIHVuc2lnbmVkIGNoYXIuICovCi0JCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNDksICZCYnBSNDkpOwotCi0JCQkvKiAocCkgVHNzaVBsdXNCb3VuZGFyeUdbMF0gPSAwID0gKG0pIFRzc2lNaW51c0JvdW5kYXJ5R1swXSAqLwotCQkJLyogY29tcGVuc2F0ZTogKzQgICAgICszICAgKzIgICArMSAgICAwICAgLTEgICAtMiAgIC0zICAgLTQgKiBzdGVwcyAqLwotCQkJLyogc3RlcCB2YWx1ZSBpcyBkZWZpbmVkIGluIHBBZC0+VHhBZ2NTdGVwRyBmb3IgdHggcG93ZXIgdmFsdWUgKi8KLQotCQkJLyogWzRdKzErWzRdICAgcDQgICAgIHAzICAgcDIgICBwMSAgIG8xICAgbTEgICBtMiAgIG0zICAgbTQgKi8KLQkJCS8qIGV4OiAgICAgICAgIDB4MDAgMHgxNSAweDI1IDB4NDUgMHg4OCAweEEwIDB4QjUgMHhEMCAweEYwCi0JCQkgICBhYm92ZSB2YWx1ZSBhcmUgZXhhbWluZWQgaW4gbWFzcyBmYWN0b3J5IHByb2R1Y3Rpb24gKi8KLQkJCS8qICAgICAgICAgICAgIFs0XSAgICBbM10gIFsyXSAgWzFdICBbMF0gIFsxXSAgWzJdICBbM10gIFs0XSAqLwotCi0JCQkvKiBwbHVzIGlzIDB4MTAgfiAweDQwLCBtaW51cyBpcyAweDYwIH4gMHg5MCAqLwotCQkJLyogaWYgdmFsdWUgaXMgYmV0d2VlbiBwMSB+IG8xIG9yIG8xIH4gczEsIG5vIG5lZWQgdG8gYWRqdXN0IHR4IHBvd2VyICovCi0JCQkvKiBpZiB2YWx1ZSBpcyAweDY1LCB0eCBwb3dlciB3aWxsIGJlIC09IFR4QWdjU3RlcCooMi0xKSAqLwotCi0JCQlpZiAoQmJwUjQ5ID4gcFRzc2lNaW51c0JvdW5kYXJ5WzFdKQotCQkJewotCQkJCS8vIFJlYWRpbmcgaXMgbGFyZ2VyIHRoYW4gdGhlIHJlZmVyZW5jZSB2YWx1ZS4KLQkJCQkvLyBDaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gZGVjcmVhc2UgdGhlIFR4IHBvd2VyLgotCQkJCWZvciAoaWR4ID0gMTsgaWR4IDwgNTsgaWR4KyspCi0JCQkJewotCQkJCQkvLyBGb3VuZCB0aGUgcmFuZ2UuCi0JCQkJCWlmIChCYnBSNDkgPD0gcFRzc2lNaW51c0JvdW5kYXJ5W2lkeF0pCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGRlY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZS4KLS8vCQkJCWlmIChSMyA+IChVTE9ORykgKFR4QWdjU3RlcCAqIChpZHgtMSkpKQotCQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oVHhBZ2NTdGVwICogKGlkeC0xKSk7Ci0vLwkJCQllbHNlCi0vLwkJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAtKChVQ0hBUilSMyk7Ci0KLQkJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOwotCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9IC0lZFxuIiwKLQkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIGlkeC0xKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChCYnBSNDkgPCBwVHNzaVBsdXNCb3VuZGFyeVsxXSkKLQkJCXsKLQkJCQkvLyBSZWFkaW5nIGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlLgotCQkJCS8vIENoZWNrIGZvciBob3cgbGFyZ2Ugd2UgbmVlZCB0byBpbmNyZWFzZSB0aGUgVHggcG93ZXIuCi0JCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKLQkJCQl7Ci0JCQkJCS8vIEZvdW5kIHRoZSByYW5nZS4KLQkJCQkJaWYgKEJicFI0OSA+PSBwVHNzaVBsdXNCb3VuZGFyeVtpZHhdKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJLy8gVGhlIGluZGV4IGlzIHRoZSBzdGVwIHdlIHNob3VsZCBpbmNyZWFzZSwgaWR4ID0gMCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbXBlbnNhdGUuCi0JCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSBUeEFnY1N0ZXAgKiAoaWR4LTEpOwotCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7Ci0JCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiKysgVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAotCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4LTEpKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IDA7Ci0JCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiICAgVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAotCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgMCkpOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQotCQl7Ci0JCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOwotCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0E7Ci0JCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOwotCQl9Ci0KLQkJaWYgKGJBdXRvVHhBZ2MpCi0JCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOwotCX0KLQotCS8qIENhbGN1bGF0ZSBkZWx0YSBwb3dlciBiYXNlZCBvbiB0aGUgcGVyY2VudGFnZSBzcGVjaWZpZWQgZnJvbSBVSS4gKi8KLQkvLyBFMlBST00gc2V0dGluZyBpcyBjYWxpYnJhdGVkIGZvciBtYXhpbXVtIFRYIHBvd2VyIChpLmUuIDEwMCUpCi0JLy8gV2UgbG93ZXIgVFggcG93ZXIgaGVyZSBhY2NvcmRpbmcgdG8gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkuCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID09IDB4ZmZmZmZmZmYpICAgICAgIC8vIEFVVE8gVFggUE9XRVIgY29udHJvbAotCQk7Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5MCkgIC8vIDkxIH4gMTAwJSAmIEFVVE8sIHRyZWF0IGFzIDEwMCUgaW4gdGVybXMgb2YgbVcKLQkJOwotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gNjApICAvLyA2MSB+IDkwJSwgdHJlYXQgYXMgNzUlIGluIHRlcm1zIG9mIG1XCi0JewotCQlEZWx0YVB3ciAtPSAxOwotCX0KLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDMwKSAgLy8gMzEgfiA2MCUsIHRyZWF0IGFzIDUwJSBpbiB0ZXJtcyBvZiBtVwotCXsKLQkJRGVsdGFQd3IgLT0gMzsKLQl9Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiAxNSkgIC8vIDE2IH4gMzAlLCB0cmVhdCBhcyAyNSUgaW4gdGVybXMgb2YgbVcKLQl7Ci0JCURlbHRhUHdyIC09IDY7Ci0JfQotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOSkgICAvLyAxMCB+IDE1JSwgdHJlYXQgYXMgMTIuNSUgaW4gdGVybXMgb2YgbVcKLQl7Ci0JCURlbHRhUHdyIC09IDk7Ci0JfQotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMCB+IDkgJSwgdHJlYXQgYXMgTUlOKH4zJSkgaW4gdGVybXMgb2YgbVcKLQl7Ci0JCURlbHRhUHdyIC09IDEyOwotCX0KLQotCS8qIFJlc2V0IGRpZmZlcmVudCBuZXcgdHggcG93ZXIgZm9yIGRpZmZlcmVudCBUWCByYXRlLiAqLwotCWZvciAoaT0wOyBpPDU7IGkrKykKLQl7Ci0JCWlmIChUeFB3cltpXSAhPSAweGZmZmZmZmZmKQotCQl7Ci0JCQlmb3IgKGo9MDsgajw4OyBqKyspCi0JCQl7Ci0JCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsgLyogMCB+IDE1ICovCi0KLQkJCQlpZiAoKFZhbHVlICsgRGVsdGFQd3IpIDwgMCkKLQkJCQl7Ci0JCQkJCVZhbHVlID0gMDsgLyogbWluICovCi0JCQkJfQotCQkJCWVsc2UgaWYgKChWYWx1ZSArIERlbHRhUHdyKSA+IDB4RikKLQkJCQl7Ci0JCQkJCVZhbHVlID0gMHhGOyAvKiBtYXggKi8KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJVmFsdWUgKz0gRGVsdGFQd3I7IC8qIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbiAqLwotCQkJCX0KLQotCQkJCS8qIGZpbGwgbmV3IHZhbHVlIHRvIENTUiBvZmZzZXQgKi8KLQkJCQlUeFB3cltpXSA9IChUeFB3cltpXSAmIH4oMHgwMDAwMDAwRiA8PCBqKjQpKSB8IChWYWx1ZSA8PCBqKjQpOwotCQkJfQotCi0JCQkvKiB3cml0ZSB0eCBwb3dlciB2YWx1ZSB0byBDU1IgKi8KLQkJCS8qIFRYX1BXUl9DRkdfMCAoOCB0eCByYXRlKSBmb3IJVFggcG93ZXIgZm9yIE9GRE0gMTJNLzE4TQotCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgT0ZETSA2TS85TQotCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLNS41TS8xMU0KLQkJCQkJCQkJCQkJVFggcG93ZXIgZm9yIENDSzFNLzJNICovCi0JCQkvKiBUWF9QV1JfQ0ZHXzEgfiBUWF9QV1JfQ0ZHXzQgKi8KLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgVHhQd3JbaV0pOwotCi0KLQkJfQotCX0KLQotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlXcml0ZSBUeFdJIGZvciBBVEUgbW9kZS4KLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotI2lmZGVmIFJUTVBfTUFDX1BDSQotc3RhdGljIFZPSUQgQVRFV3JpdGVUeFdJKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBUWFdJX1NUUlVDCXBPdXRUeFdJLAotCUlOCUJPT0xFQU4JCQlGUkFHLAotCUlOCUJPT0xFQU4JCQlDRkFDSywKLQlJTglCT09MRUFOCQkJSW5zVGltZXN0YW1wLAotCUlOCUJPT0xFQU4JCQlBTVBEVSwKLQlJTglCT09MRUFOCQkJQWNrLAotCUlOCUJPT0xFQU4JCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCi0JSU4JVUNIQVIJCQlCQVNpemUsCi0JSU4JVUNIQVIJCQlXQ0lELAotCUlOCVVMT05HCQkJTGVuZ3RoLAotCUlOCVVDSEFSCQkJUElELAotCUlOCVVDSEFSCQkJVElELAotCUlOCVVDSEFSCQkJVHhSYXRlLAotCUlOCVVDSEFSCQkJVHhvcG1vZGUsCi0JSU4JQk9PTEVBTgkJCUNmQWNrLAotCUlOCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0KQotewotCVRYV0lfU1RSVUMJCVR4V0k7Ci0JUFRYV0lfU1RSVUMJcFR4V0k7Ci0KLQkvLwotCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgotCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcwotCS8vCi0JT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKLQlOZGlzWmVyb01lbW9yeSgmVHhXSSwgVFhXSV9TSVpFKTsKLQlwVHhXSSA9ICZUeFdJOwotCi0JcFR4V0ktPkZSQUc9IEZSQUc7Ci0KLQlwVHhXSS0+Q0ZBQ0sgPSBDRkFDSzsKLQlwVHhXSS0+VFM9IEluc1RpbWVzdGFtcDsKLQlwVHhXSS0+QU1QRFUgPSBBTVBEVTsKLQlwVHhXSS0+QUNLID0gQWNrOwotCXBUeFdJLT50eG9wPSBUeG9wbW9kZTsKLQotCXBUeFdJLT5OU0VRID0gTlNlcTsKLQotCS8vIEpvaG4gdHVuZSB0aGUgcGVyZm9ybWFjZSB3aXRoIEludGVsIENsaWVudCBpbiAyMCBNSHogcGVyZm9ybWFuY2UKLQlpZiAoIEJBU2l6ZSA+NyApCi0JCUJBU2l6ZSA9NzsKLQotCXBUeFdJLT5CQVdpblNpemUgPSBCQVNpemU7Ci0JcFR4V0ktPldpcmVsZXNzQ2xpSUQgPSBXQ0lEOwotCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSBMZW5ndGg7Ci0JcFR4V0ktPlBhY2tldElkID0gUElEOwotCi0JLy8gSWYgQ0NLIG9yIE9GRE0sIEJXIG11c3QgYmUgMjAKLQlwVHhXSS0+QlcgPSAocFRyYW5zbWl0LT5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOwotCXBUeFdJLT5TaG9ydEdJID0gcFRyYW5zbWl0LT5maWVsZC5TaG9ydEdJOwotCXBUeFdJLT5TVEJDID0gcFRyYW5zbWl0LT5maWVsZC5TVEJDOwotCi0JcFR4V0ktPk1DUyA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOwotCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOwotCXBUeFdJLT5DRkFDSyA9IENmQWNrOwotCXBUeFdJLT5NSU1PcHMgPSAwOwotCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDA7Ci0KLQlwVHhXSS0+UGFja2V0SWQgPSBwVHhXSS0+TUNTOwotCU5kaXNNb3ZlTWVtb3J5KHBPdXRUeFdJLCAmVHhXSSwgc2l6ZW9mKFRYV0lfU1RSVUMpKTsKLQotICAgIHJldHVybjsKLX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJRGlzYWJsZSBwcm90ZWN0aW9uIGZvciBBVEUuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFURURpc2FibGVBc2ljUHJvdGVjdCgKLQlJTgkJUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JUFJPVF9DRkdfU1RSVUMJUHJvdENmZywgUHJvdENmZzQ7Ci0JVUlOVDMyIFByb3RlY3RbNl07Ci0JVVNIT1JUCQkJb2Zmc2V0OwotCVVDSEFSCQkJaTsKLQlVSU5UMzIgTWFjUmVnID0gMDsKLQotCS8vIENvbmZpZyBBU0lDIFJUUyB0aHJlc2hvbGQgcmVnaXN0ZXIKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUU19DRkcsICZNYWNSZWcpOwotCU1hY1JlZyAmPSAweEZGMDAwMEZGOwotCU1hY1JlZyB8PSAocEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkIDw8IDgpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1JUU19DRkcsIE1hY1JlZyk7Ci0KLQkvLyBJbml0aWFsIGNvbW1vbiBwcm90ZWN0aW9uIHNldHRpbmdzCi0JUlRNUFplcm9NZW1vcnkoUHJvdGVjdCwgc2l6ZW9mKFByb3RlY3QpKTsKLQlQcm90Q2ZnNC53b3JkID0gMDsKLQlQcm90Q2ZnLndvcmQgPSAwOwotCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0Y0MCA9IDE7Ci0JUHJvdENmZy5maWVsZC5UeG9wQWxsb3dHRjIwID0gMTsKLQlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NNDAgPSAxOwotCVByb3RDZmcuZmllbGQuVHhvcEFsbG93TU0yMCA9IDE7Ci0JUHJvdENmZy5maWVsZC5UeG9wQWxsb3dPZmRtID0gMTsKLQlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0NjayA9IDE7Ci0JUHJvdENmZy5maWVsZC5SVFNUaEVuID0gMTsKLQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOwotCi0JLy8gSGFuZGxlIGxlZ2FjeShCL0cpIHByb3RlY3Rpb24KLQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKLQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsKLQlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOwotCVByb3RlY3RbMV0gPSBQcm90Q2ZnLndvcmQ7Ci0KLQkvLyBOTyBQUk9URUNUCi0JLy8gMS5BbGwgU1RBcyBpbiB0aGUgQlNTIGFyZSAyMC80MCBNSHogSFQKLQkvLyAyLiBpbiBhaSAyMC80ME1IeiBCU1MKLQkvLyAzLiBhbGwgU1RBcyBhcmUgMjBNSHogaW4gYSAyME1IeiBCU1MKLQkvLyBQdXJlIEhULiBubyBwcm90ZWN0aW9uLgotCi0JLy8gTU0yMF9QUk9UX0NGRwotCS8vCVJlc2VydmVkICgzMToyNykKLQkvLwlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQotCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQotCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQotCS8vCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKLQlQcm90ZWN0WzJdID0gMHgwMTc0NDAwNDsKLQotCS8vIE1NNDBfUFJPVF9DRkcKLQkvLwlSZXNlcnZlZCAoMzE6MjcpCi0JLy8JUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEKLQkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKLQkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKLQkvLwlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQotCVByb3RlY3RbM10gPSAweDAzZjQ0MDg0OwotCi0JLy8gQ0YyMF9QUk9UX0NGRwotCS8vCVJlc2VydmVkICgzMToyNykKLQkvLwlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQotCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQotCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQotCS8vCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKLQlQcm90ZWN0WzRdID0gMHgwMTc0NDAwNDsKLQotCS8vIENGNDBfUFJPVF9DRkcKLQkvLwlSZXNlcnZlZCAoMzE6MjcpCi0JLy8JUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEKLQkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKLQkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKLQkvLwlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQotCVByb3RlY3RbNV0gPSAweDAzZjQ0MDg0OwotCi0JcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IEZBTFNFOwotCi0Jb2Zmc2V0ID0gQ0NLX1BST1RfQ0ZHOwotCWZvciAoaSA9IDA7aSA8IDY7aSsrKQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyBpKjQsIFByb3RlY3RbaV0pOwotCi19Ci0KLQotCi0KLS8qIFRoZXJlIGFyZSB0d28gd2F5cyB0byBjb252ZXJ0IFJzc2kgKi8KLS8qIHRoZSB3YXkgdXNlZCB3aXRoIEdFVF9MTkFfR0FJTigpICovCi1DSEFSIEFURUNvbnZlcnRUb1Jzc2koCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JQ0hBUglSc3NpLAotCUlOICBVQ0hBUiAgIFJzc2lOdW1iZXIpCi17Ci0JVUNIQVIJUnNzaU9mZnNldCwgTE5BR2FpbjsKLQotCS8vIFJzc2kgZXF1YWxzIHRvIHplcm8gc2hvdWxkIGJlIGFuIGludmFsaWQgdmFsdWUKLQlpZiAoUnNzaSA9PSAwKQotCQlyZXR1cm4gLTk5OwotCi0JTE5BR2FpbiA9IEdFVF9MTkFfR0FJTihwQWQpOwotCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKLQl7Ci0JCWlmIChSc3NpTnVtYmVyID09IDApCi0JCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDA7Ci0JCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKLQkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MTsKLQkJZWxzZQotCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQyOwotCX0KLQllbHNlCi0JewotCQlpZiAoUnNzaU51bWJlciA9PSAwKQotCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MDsKLQkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQotCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MTsKLQkJZWxzZQotCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MjsKLQl9Ci0KLQlyZXR1cm4gKC0xMiAtIFJzc2lPZmZzZXQgLSBMTkFHYWluIC0gUnNzaSk7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJU2V0IEphcGFuIGZpbHRlciBjb2VmZmljaWVudHMgaWYgbmVlZGVkLgotCU5vdGU6Ci0JCVRoaXMgcm91dGluZSBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbgotCQllbnRlcmluZyBUWEZSQU1FIG1vZGUgb3IgVFhDT05UIG1vZGUuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBWT0lEIFNldEphcGFuRmlsdGVyKAotCUlOCQlQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVQ0hBUgkJCUJicERhdGEgPSAwOwotCi0JLy8KLQkvLyBJZiBDaGFubmVsPTE0IGFuZCBCYW5kd2lkdGg9MjBNIGFuZCBNb2RlPUNDSywgc2V0IEJCUCBSNCBiaXQ1PTEKLQkvLyAoSmFwYW4gVHggZmlsdGVyIGNvZWZmaWNpZW50cyl3aGVuIChUWEZSQU1FIG9yIFRYQ09OVCkuCi0JLy8KLQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJicERhdGEpOwotCi0gICAgaWYgKChwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPT0gTU9ERV9DQ0spICYmIChwQWQtPmF0ZS5DaGFubmVsID09IDE0KSAmJiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV18yMCkpCi0gICAgewotICAgICAgICBCYnBEYXRhIHw9IDB4MjA7ICAgIC8vIHR1cm4gb24KLSAgICAgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0SmFwYW5GaWx0ZXIhISFcbiIpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkJQmJwRGF0YSAmPSAweGRmOyAgICAvLyB0dXJuIG9mZgotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbGVhckphcGFuRmlsdGVyISEhXG4iKSk7Ci0gICAgfQotCi0JQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCYnBEYXRhKTsKLX0KLQotCi1WT0lEIEFURVNhbXBsZVJzc2koCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUFJYV0lfU1RSVUMJCXBSeFdJKQotewotCS8qIFRoZXJlIGFyZSB0d28gd2F5cyB0byBjb2xsZWN0IFJTU0kuICovCi0vLwlwQWQtPkxhc3RSeFJhdGUgPSAoVVNIT1JUKSgocFJ4V0ktPk1DUykgKyAocFJ4V0ktPkJXIDw8NykgKyAocFJ4V0ktPlNob3J0R0kgPDw4KSsgKHBSeFdJLT5QSFlNT0RFIDw8MTQpKSA7Ci0JaWYgKHBSeFdJLT5SU1NJMCAhPSAwKQotCXsKLQkJcEFkLT5hdGUuTGFzdFJzc2kwCT0gQVRFQ29udmVydFRvUnNzaShwQWQsIChDSEFSKSBwUnhXSS0+UlNTSTAsIFJTU0lfMCk7Ci0JCXBBZC0+YXRlLkF2Z1Jzc2kwWDgJPSAocEFkLT5hdGUuQXZnUnNzaTBYOCAtIHBBZC0+YXRlLkF2Z1Jzc2kwKSArIHBBZC0+YXRlLkxhc3RSc3NpMDsKLQkJcEFkLT5hdGUuQXZnUnNzaTAJPSBwQWQtPmF0ZS5BdmdSc3NpMFg4ID4+IDM7Ci0JfQotCWlmIChwUnhXSS0+UlNTSTEgIT0gMCkKLQl7Ci0JCXBBZC0+YXRlLkxhc3RSc3NpMQk9IEFURUNvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUikgcFJ4V0ktPlJTU0kxLCBSU1NJXzEpOwotCQlwQWQtPmF0ZS5BdmdSc3NpMVg4CT0gKHBBZC0+YXRlLkF2Z1Jzc2kxWDggLSBwQWQtPmF0ZS5BdmdSc3NpMSkgKyBwQWQtPmF0ZS5MYXN0UnNzaTE7Ci0JCXBBZC0+YXRlLkF2Z1Jzc2kxCT0gcEFkLT5hdGUuQXZnUnNzaTFYOCA+PiAzOwotCX0KLQlpZiAocFJ4V0ktPlJTU0kyICE9IDApCi0JewotCQlwQWQtPmF0ZS5MYXN0UnNzaTIJPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMiwgUlNTSV8yKTsKLQkJcEFkLT5hdGUuQXZnUnNzaTJYOAk9IChwQWQtPmF0ZS5BdmdSc3NpMlg4IC0gcEFkLT5hdGUuQXZnUnNzaTIpICsgcEFkLT5hdGUuTGFzdFJzc2kyOwotCQlwQWQtPmF0ZS5BdmdSc3NpMgk9IHBBZC0+YXRlLkF2Z1Jzc2kyWDggPj4gMzsKLQl9Ci0KLQlwQWQtPmF0ZS5MYXN0U05SMCA9IChDSEFSKShwUnhXSS0+U05SMCk7Ly8gQ0hBUiA9PT4gVUNIQVIgPwotCXBBZC0+YXRlLkxhc3RTTlIxID0gKENIQVIpKHBSeFdJLT5TTlIxKTsvLyBDSEFSID09PiBVQ0hBUiA/Ci0KLQlwQWQtPmF0ZS5OdW1PZkF2Z1Jzc2lTYW1wbGUgKys7Ci19Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotVk9JRCBSVE1QU3RhdGlvblN0b3AoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCi17Ci0vLwlCT09MRUFOICAgICAgIENhbmNlbGxlZDsKLQotICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBSVE1QU3RhdGlvblN0b3BcbiIpKTsKLQotCS8vIEZvciByeCBzdGF0aXN0aWNzLCB3ZSBuZWVkIHRvIGtlZXAgdGhpcyB0aW1lciBydW5uaW5nLgotLy8JUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgICAgICAmQ2FuY2VsbGVkKTsKLQotICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QU3RhdGlvblN0b3BcbiIpKTsKLX0KLQotCi1WT0lEIFJUTVBTdGF0aW9uU3RhcnQoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCi17Ci0gICAgQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBTdGF0aW9uU3RhcnRcbiIpKTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0KLQkvKiBXZSBkaWQgbm90IGNhbmNlbCB0aGlzIHRpbWVyIHdoZW4gZW50ZXJpbmcgQVRFIG1vZGUuICovCi0vLwlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLCBNTE1FX1RBU0tfRVhFQ19JTlRWKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QU3RhdGlvblN0YXJ0XG4iKSk7Ci19Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVNldHVwIEZyYW1lIGZvcm1hdC4KLQlOT1RFOgotCQlUaGlzIHJvdXRpbmUgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBBVEUgbW9kZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotI2lmZGVmIFJUTVBfTUFDX1BDSQotc3RhdGljIElOVCBBVEVTZXRVcEZyYW1lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVJTlQzMiBUeElkeCkKLXsKLQlVSU5UIGo7Ci0JUFRYRF9TVFJVQyBwVHhEOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7Ci0gICAgVFhEX1NUUlVDICAgICAgIFR4RDsKLSNlbmRpZgotCVBORElTX1BBQ0tFVCBwUGFja2V0OwotCVBVQ0hBUiBwRGVzdDsKLQlQVk9JRCBBbGxvY1ZhOwotCU5ESVNfUEhZU0lDQUxfQUREUkVTUyBBbGxvY1BhOwotCUhUVFJBTlNNSVRfU0VUVElORwlUeEhUUGh5TW9kZTsKLQotCVBSVE1QX1RYX1JJTkcgcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tRSURfQUNfQkVdOwotCVBUWFdJX1NUUlVDIHBUeFdJID0gKFBUWFdJX1NUUlVDKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKLQlQVUNIQVIgcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7Ci0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCVBIRUFERVJfODAyXzExCXBIZWFkZXI4MDIxMTsKLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCi0JaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKLQl7Ci0JCS8vIGFsd2F5cyB1c2UgUUlEX0FDX0JFIGFuZCBGSUZPX0VEQ0EKLQotCQkvLyBmaWxsIFR4V0kKLQkJVHhIVFBoeU1vZGUuZmllbGQuQlcgPSBwQWQtPmF0ZS5UeFdJLkJXOwotCQlUeEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gcEFkLT5hdGUuVHhXSS5TaG9ydEdJOwotCQlUeEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKLQkJVHhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5hdGUuVHhXSS5NQ1M7Ci0JCVR4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwQWQtPmF0ZS5UeFdJLlBIWU1PREU7Ci0KLQkJQVRFV3JpdGVUeFdJKHBBZCwgcFR4V0ksIHBBZC0+YXRlLlR4V0kuRlJBRywgcEFkLT5hdGUuVHhXSS5DRkFDSywKLQkJCXBBZC0+YXRlLlR4V0kuVFMsICBwQWQtPmF0ZS5UeFdJLkFNUERVLCBwQWQtPmF0ZS5UeFdJLkFDSywgcEFkLT5hdGUuVHhXSS5OU0VRLAotCQkJcEFkLT5hdGUuVHhXSS5CQVdpblNpemUsIDAsIHBBZC0+YXRlLlR4V0kuTVBEVXRvdGFsQnl0ZUNvdW50LCBwQWQtPmF0ZS5UeFdJLlBhY2tldElkLCAwLCAwLAotCQkJcEFkLT5hdGUuVHhXSS50eG9wLypJRlNfSFRUWE9QKi8sIHBBZC0+YXRlLlR4V0kuQ0ZBQ0svKkZBTFNFKi8sICZUeEhUUGh5TW9kZSk7Ci0JfQotCWVsc2UKLQl7Ci0JCVR4SFRQaHlNb2RlLmZpZWxkLkJXID0gcEFkLT5hdGUuVHhXSS5CVzsKLQkJVHhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IHBBZC0+YXRlLlR4V0kuU2hvcnRHSTsKLQkJVHhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7Ci0JCVR4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+YXRlLlR4V0kuTUNTOwotCQlUeEhUUGh5TW9kZS5maWVsZC5NT0RFID0gcEFkLT5hdGUuVHhXSS5QSFlNT0RFOwotCQlBVEVXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgIEZBTFNFLCBGQUxTRSwgRkFMU0UsCi0JCQk0LCAwLCBwQWQtPmF0ZS5UeExlbmd0aCwgMCwgMCwgMCwgSUZTX0hUVFhPUCwgRkFMU0UsICZUeEhUUGh5TW9kZSk7Ci0JfQotCi0JLy8gZmlsbCA4MDIuMTEgaGVhZGVyCi0jaWZkZWYgUkFMSU5LXzI4eHhfUUEKLQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQotCXsKLQkJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBK1RYV0lfU0laRSwgcEFkLT5hdGUuSGVhZGVyLCBwQWQtPmF0ZS5ITGVuKTsKLQl9Ci0JZWxzZQotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0JewotCQlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkErVFhXSV9TSVpFLCBUZW1wbGF0ZUZyYW1lLCBMRU5HVEhfODAyXzExKTsKLQkJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBK1RYV0lfU0laRSs0LCBwQWQtPmF0ZS5BZGRyMSwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKLQkJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBK1RYV0lfU0laRSsxMCwgcEFkLT5hdGUuQWRkcjIsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQStUWFdJX1NJWkUrMTYsIHBBZC0+YXRlLkFkZHIzLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOwotCX0KLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoKChQVUNIQVIpcERNQUhlYWRlckJ1ZlZBKStUWFdJX1NJWkUpLCBESVJfUkVBRCwgRkFMU0UpOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQotCS8qIGFsbG9jIGJ1ZmZlciBmb3IgcGF5bG9hZCAqLwotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKLQl7Ci0JCXBQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIocEFkLCBwQWQtPmF0ZS5ETGVuICsgMHgxMDAsIEZBTFNFLCAmQWxsb2NWYSwgJkFsbG9jUGEpOwotCX0KLQllbHNlCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLQl7Ci0JCXBQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIocEFkLCBwQWQtPmF0ZS5UeExlbmd0aCwgRkFMU0UsICZBbGxvY1ZhLCAmQWxsb2NQYSk7Ci0JfQotCi0JaWYgKHBQYWNrZXQgPT0gTlVMTCkKLQl7Ci0JCXBBZC0+YXRlLlR4Q291bnQgPSAwOwotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyBmYWlsIHRvIGFsbG9jIHBhY2tldCBzcGFjZS5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldCA9IHBQYWNrZXQ7Ci0KLQlwRGVzdCA9IChQVUNIQVIpIEFsbG9jVmE7Ci0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCi0JewotCQlSVFBLVF9UT19PU1BLVChwUGFja2V0KS0+bGVuID0gcEFkLT5hdGUuRExlbjsKLQl9Ci0JZWxzZQotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0JewotCQlSVFBLVF9UT19PU1BLVChwUGFja2V0KS0+bGVuID0gcEFkLT5hdGUuVHhMZW5ndGggLSBMRU5HVEhfODAyXzExOwotCX0KLQotCS8vIHByZXBhcmUgZnJhbWUgcGF5bG9hZAotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKLQl7Ci0JCS8vIGNvcHkgcGF0dGVybgotCQlpZiAoKHBBZC0+YXRlLlBMZW4gIT0gMCkpCi0JCXsKLQkJCWludCBqOwotCi0JCQlmb3IgKGogPSAwOyBqIDwgcEFkLT5hdGUuRExlbjsgais9cEFkLT5hdGUuUExlbikKLQkJCXsKLQkJCQltZW1jcHkoUlRQS1RfVE9fT1NQS1QocFBhY2tldCktPmRhdGEgKyBqLCBwQWQtPmF0ZS5QYXR0ZXJuLCBwQWQtPmF0ZS5QTGVuKTsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLQl7Ci0JCWZvciAoaiA9IDA7IGogPCBSVFBLVF9UT19PU1BLVChwUGFja2V0KS0+bGVuOyBqKyspCi0JCXsKLQkJCXBEZXN0W2pdID0gMHhBNTsKLQkJfQotCX0KLQotCS8qIGJ1aWxkIFR4IERlc2NyaXB0b3IgKi8KLSNpZm5kZWYgUlRfQklHX0VORElBTgotCXBUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLSNlbHNlCi0gICAgcERlc3RUeEQgID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLSAgICBUeEQgPSAqcERlc3RUeEQ7Ci0gICAgcFR4RCA9ICZUeEQ7Ci0jZW5kaWYgLy8gIVJUX0JJR19FTkRJQU4gLy8KLQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKLQl7Ci0JCS8vIHByZXBhcmUgVHhECi0JCU5kaXNaZXJvTWVtb3J5KHBUeEQsIFRYRF9TSVpFKTsKLQkJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7Ci0JCS8vIGJ1aWxkIFRYIERFU0MKLQkJcFR4RC0+U0RQdHIwID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOwotCQlwVHhELT5TRExlbjAgPSBUWFdJX1NJWkUgKyBwQWQtPmF0ZS5ITGVuOwotCQlwVHhELT5MYXN0U2VjMCA9IDA7Ci0JCXBUeEQtPlNEUHRyMSA9IEFsbG9jUGE7Ci0JCXBUeEQtPlNETGVuMSA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLT5sZW47Ci0JCXBUeEQtPkxhc3RTZWMxID0gMTsKLQotCQlwRGVzdCA9IChQVUNIQVIpcFR4V0k7Ci0JCXBEZXN0ICs9IFRYV0lfU0laRTsKLQkJcEhlYWRlcjgwMjExID0gKFBIRUFERVJfODAyXzExKXBEZXN0OwotCi0JCS8vIG1vZGlmeSBzZXF1ZW5jZSBudW1iZXIuLi4KLQkJaWYgKHBBZC0+YXRlLlR4RG9uZUNvdW50ID09IDApCi0JCXsKLQkJCXBBZC0+YXRlLnNlcSA9IHBIZWFkZXI4MDIxMS0+U2VxdWVuY2U7Ci0JCX0KLQkJZWxzZQotCQkJcEhlYWRlcjgwMjExLT5TZXF1ZW5jZSA9ICsrcEFkLT5hdGUuc2VxOwotCX0KLQllbHNlCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLQl7Ci0JCU5kaXNaZXJvTWVtb3J5KHBUeEQsIFRYRF9TSVpFKTsKLQkJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7Ci0JCS8vIGJ1aWxkIFRYIERFU0MKLQkJcFR4RC0+U0RQdHIwID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1BhKTsKLQkJcFR4RC0+U0RMZW4wID0gVFhXSV9TSVpFICsgTEVOR1RIXzgwMl8xMTsKLQkJcFR4RC0+TGFzdFNlYzAgPSAwOwotCQlwVHhELT5TRFB0cjEgPSBBbGxvY1BhOwotCQlwVHhELT5TRExlbjEgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KS0+bGVuOwotCQlwVHhELT5MYXN0U2VjMSA9IDE7Ci0JfQotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeFdJLCBUWVBFX1RYV0kpOwotCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsICgoKFBVQ0hBUilwRE1BSGVhZGVyQnVmVkEpK1RYV0lfU0laRSksIERJUl9XUklURSwgRkFMU0UpOwotICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotICAgIFdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIEZBTFNFLCBUWVBFX1RYRCk7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCi0JcmV0dXJuIDA7Ci19Ci0vKj09PT09PT09PT09PT09PT09PT09PT09RW5kIG9mIFJUTVBfTUFDX1BDSSA9PT09PT09PT09PT09PT09PT09PT09PSovCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCi0KLVZPSUQgcnRfZWVfcmVhZF9hbGwoUFJUTVBfQURBUFRFUiBwQWQsIFVTSE9SVCAqRGF0YSkKLXsKLQlVU0hPUlQgaTsKLQlVU0hPUlQgdmFsdWU7Ci0KLQotCWZvciAoaSA9IDAgOyBpIDwgRUVQUk9NX1NJWkUvMiA7ICkKLQl7Ci0JCS8qICJ2YWx1ZSIgaXMgZXNwZWNpYWxseSBmb3Igc29tZSBjb21waWxlcnMuLi4gKi8KLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBpKjIsIHZhbHVlKTsKLQkJRGF0YVtpXSA9IHZhbHVlOwotCQlpKys7Ci0JfQotfQotCi0KLVZPSUQgcnRfZWVfd3JpdGVfYWxsKFBSVE1QX0FEQVBURVIgcEFkLCBVU0hPUlQgKkRhdGEpCi17Ci0JVVNIT1JUIGk7Ci0JVVNIT1JUIHZhbHVlOwotCi0KLQlmb3IgKGkgPSAwIDsgaSA8IEVFUFJPTV9TSVpFLzIgOyApCi0JewotCQkvKiAidmFsdWUiIGlzIGVzcGVjaWFsbHkgZm9yIHNvbWUgY29tcGlsZXJzLi4uICovCi0JCXZhbHVlID0gRGF0YVtpXTsKLQkJUlQyOHh4X0VFUFJPTV9XUklURTE2KHBBZCwgaSoyLCB2YWx1ZSk7Ci0JCWkrKzsKLQl9Ci19Ci0KLQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi1WT0lEIEFURV9RQV9TdGF0aXN0aWNzKAotCUlOIFBSVE1QX0FEQVBURVIJCQlwQWQsCi0JSU4gUFJYV0lfU1RSVUMJCQkJcFJ4V0ksCi0JSU4gUFJUMjhYWF9SWERfU1RSVUMJCXBSeEQsCi0JSU4gUEhFQURFUl84MDJfMTEJCQlwSGVhZGVyKQotewotCS8vIHVwZGF0ZSBjb3VudGVyIGZpcnN0Ci0JaWYgKHBIZWFkZXIgIT0gTlVMTCkKLQl7Ci0JCWlmIChwSGVhZGVyLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpCi0JCXsKLQkJCWlmIChwUnhELT5VMk0pCi0JCQkJcEFkLT5hdGUuVTJNKys7Ci0JCQllbHNlCi0JCQkJcEFkLT5hdGUuT3RoZXJEYXRhKys7Ci0JCX0KLQkJZWxzZSBpZiAocEhlYWRlci0+RkMuVHlwZSA9PSBCVFlQRV9NR01UKQotCQl7Ci0JCQlpZiAocEhlYWRlci0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX0JFQUNPTikKLQkJCQlwQWQtPmF0ZS5CZWFjb24rKzsKLQkJCWVsc2UKLQkJCQlwQWQtPmF0ZS5PdGhlckNvdW50Kys7Ci0JCX0KLQkJZWxzZSBpZiAocEhlYWRlci0+RkMuVHlwZSA9PSBCVFlQRV9DTlRMKQotCQl7Ci0JCQlwQWQtPmF0ZS5PdGhlckNvdW50Kys7Ci0JCX0KLQl9Ci0JcEFkLT5hdGUuUlNTSTAgPSBwUnhXSS0+UlNTSTA7Ci0JcEFkLT5hdGUuUlNTSTEgPSBwUnhXSS0+UlNTSTE7Ci0JcEFkLT5hdGUuUlNTSTIgPSBwUnhXSS0+UlNTSTI7Ci0JcEFkLT5hdGUuU05SMCA9IHBSeFdJLT5TTlIwOwotCXBBZC0+YXRlLlNOUjEgPSBwUnhXSS0+U05SMTsKLX0KLQotCi0vKiBjb21tYW5kIGlkIHdpdGggQ21kIFR5cGUgPT0gMHgwMDA4KGZvciAyOHh4KS8weDAwMDUoZm9yIGlOSUMpICovCi0jZGVmaW5lIFJBQ0ZHX0NNRF9SRl9XUklURV9BTEwJCTB4MDAwMAotI2RlZmluZSBSQUNGR19DTURfRTJQUk9NX1JFQUQxNgkJMHgwMDAxCi0jZGVmaW5lIFJBQ0ZHX0NNRF9FMlBST01fV1JJVEUxNgkweDAwMDIKLSNkZWZpbmUgUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTAkweDAwMDMKLSNkZWZpbmUgUkFDRkdfQ01EX0UyUFJPTV9XUklURV9BTEwJMHgwMDA0Ci0jZGVmaW5lIFJBQ0ZHX0NNRF9JT19SRUFECQkJMHgwMDA1Ci0jZGVmaW5lIFJBQ0ZHX0NNRF9JT19XUklURQkJCTB4MDAwNgotI2RlZmluZSBSQUNGR19DTURfSU9fUkVBRF9CVUxLCQkweDAwMDcKLSNkZWZpbmUgUkFDRkdfQ01EX0JCUF9SRUFEOAkJCTB4MDAwOAotI2RlZmluZSBSQUNGR19DTURfQkJQX1dSSVRFOAkJMHgwMDA5Ci0jZGVmaW5lIFJBQ0ZHX0NNRF9CQlBfUkVBRF9BTEwJCTB4MDAwYQotI2RlZmluZSBSQUNGR19DTURfR0VUX0NPVU5URVIJCTB4MDAwYgotI2RlZmluZSBSQUNGR19DTURfQ0xFQVJfQ09VTlRFUgkJMHgwMDBjCi0KLSNkZWZpbmUgUkFDRkdfQ01EX1JTVjEJCQkJMHgwMDBkCi0jZGVmaW5lIFJBQ0ZHX0NNRF9SU1YyCQkJCTB4MDAwZQotI2RlZmluZSBSQUNGR19DTURfUlNWMwkJCQkweDAwMGYKLQotI2RlZmluZSBSQUNGR19DTURfVFhfU1RBUlQJCQkweDAwMTAKLSNkZWZpbmUgUkFDRkdfQ01EX0dFVF9UWF9TVEFUVVMJCTB4MDAxMQotI2RlZmluZSBSQUNGR19DTURfVFhfU1RPUAkJCTB4MDAxMgotI2RlZmluZSBSQUNGR19DTURfUlhfU1RBUlQJCQkweDAwMTMKLSNkZWZpbmUgUkFDRkdfQ01EX1JYX1NUT1AJCQkweDAwMTQKLSNkZWZpbmUgUkFDRkdfQ01EX0dFVF9OT0lTRV9MRVZFTAkweDAwMTUKLQotI2RlZmluZSBSQUNGR19DTURfQVRFX1NUQVJUCQkJMHgwMDgwCi0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RPUAkJCTB4MDA4MQotCi0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUgkJMHgwMTAwCi0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVAkJCTB4MDEwMQotI2RlZmluZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FCQkweDAxMDIKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQlcJICAgICAgICAgICAgMHgwMTAzCi0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMAkgICAgICAgIDB4MDEwNAotI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjEJCQkweDAxMDUKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVQJCTB4MDEwNgotI2RlZmluZSBSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTCQkweDAxMDcKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSCQkJMHgwMTA4Ci0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkEJCTB4MDEwOQotI2RlZmluZSBSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BCQkweDAxMGEKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEUJCQkweDAxMGIKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTAkJCTB4MDEwYwotI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMQkJCQkweDAxMGQKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQUREUjIJCQkJMHgwMTBlCi0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzCQkJCTB4MDEwZgotI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9SQVRFCQkJCTB4MDExMAotI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU4JCTB4MDExMQotI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVAkweDAxMTIKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVEFSVF9SWF9GUkFNRQkJMHgwMTEzCi0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1JFQURfQlVMSwkweDAxMTQKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9FMlBST01fV1JJVEVfQlVMSwkweDAxMTUKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLCQkweDAxMTYKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9CQlBfUkVBRF9CVUxLCQkweDAxMTcKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMSwkweDAxMTgKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9SRl9SRUFEX0JVTEsJCTB4MDExOQotI2RlZmluZSBSQUNGR19DTURfQVRFX1JGX1dSSVRFX0JVTEsJCTB4MDExYQotCi0KLXN0YXRpYyBWT0lEIG1lbWNweV9leGwoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVMT05HIGxlbik7Ci1zdGF0aWMgVk9JRCBtZW1jcHlfZXhzKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVTE9ORyBsZW4pOwotc3RhdGljIFZPSUQgUlRNUF9JT19SRUFEX0JVTEsoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVJTlQzMiBsZW4pOwotCi0KLQotVk9JRCBSdG1wRG9BdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSkKLXsKLQlVU0hPUlQgQ29tbWFuZF9JZDsKLQlJTlQJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmc7Ci0KLQotCWlmICgocFJhQ2ZnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF0ZV9yYWNmZ2hkciksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQotCXsKLQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJcmV0dXJuOwotCX0KLQotCU5kaXNaZXJvTWVtb3J5KHBSYUNmZywgc2l6ZW9mKHN0cnVjdCBhdGVfcmFjZmdoZHIpKTsKLQotICAgIGlmIChjb3B5X2Zyb21fdXNlcigoUFVDSEFSKXBSYUNmZywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKSkKLQl7Ci0JCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCWtmcmVlKHBSYUNmZyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlDb21tYW5kX0lkID0gbnRvaHMocFJhQ2ZnLT5jb21tYW5kX2lkKTsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiXG4lczogQ29tbWFuZF9JZCA9IDB4JTA0eCAhXG4iLCBfX0ZVTkNUSU9OX18sIENvbW1hbmRfSWQpKTsKLQotCXN3aXRjaCAoQ29tbWFuZF9JZCkKLQl7Ci0JCS8qIFdlIHdpbGwgZ2V0IHRoaXMgY29tbWFuZCB3aGVuIFFBIHN0YXJ0cy4gKi8KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU1RBUlQocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQkvKiBXZSB3aWxsIGdldCB0aGlzIGNvbW1hbmQgZWl0aGVyIFFBIGlzIGNsb3NlZCBvciBhdGVkIGlzIGtpbGxlZCBieSB1c2VyLiAqLwotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RPUDoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1NUT1AocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9SRl9XUklURV9BTEw6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX1JGX1dSSVRFX0FMTChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0UyUFJPTV9SRUFEMTY6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0UyUFJPTV9SRUFEMTYocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9FMlBST01fV1JJVEUxNjoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfRTJQUk9NX1dSSVRFMTYocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9FMlBST01fUkVBRF9BTEw6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0UyUFJPTV9XUklURV9BTEw6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0UyUFJPTV9XUklURV9BTEwocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9JT19SRUFEOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9JT19SRUFEKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfSU9fV1JJVEU6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0lPX1dSSVRFKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfSU9fUkVBRF9CVUxLOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9JT19SRUFEX0JVTEsocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9CQlBfUkVBRDg6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0JCUF9SRUFEOChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCQljYXNlIFJBQ0ZHX0NNRF9CQlBfV1JJVEU4OgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9CQlBfV1JJVEU4KHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQkJQX1JFQURfQUxMOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9CQlBfUkVBRF9BTEwocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1JFQURfQlVMSzoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX0UyUFJPTV9SRUFEX0JVTEsocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1dSSVRFX0JVTEs6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9FMlBST01fV1JJVEVfQlVMSyhwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfSU9fV1JJVEVfQlVMSyhwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9CQlBfUkVBRF9CVUxLOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfQkJQX1JFQURfQlVMSyhwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMSzoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQotCQljYXNlIFJBQ0ZHX0NNRF9HRVRfTk9JU0VfTEVWRUw6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0dFVF9OT0lTRV9MRVZFTChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0dFVF9DT1VOVEVSOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9HRVRfQ09VTlRFUihwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0NMRUFSX0NPVU5URVI6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0NMRUFSX0NPVU5URVIocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9UWF9TVEFSVDoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfVFhfU1RBUlQocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9HRVRfVFhfU1RBVFVTOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9HRVRfVFhfU1RBVFVTKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfVFhfU1RPUDoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfVFhfU1RPUChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX1JYX1NUQVJUOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9SWF9TVEFSVChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX1JYX1NUT1A6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX1JYX1NUT1AocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQkvKiBUaGUgZm9sbG93aW5nIGNhc2VzIGFyZSBmb3IgbmV3IEFURSBHVUkobm90IFFBKS4gKi8KLQkJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUihwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9GUkFNRToKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9CVzoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1NFVF9CVyhwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMShwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVQ6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfR0VUX1NUQVRJU1RJQ1MocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfUkVTRVRfQ09VTlRFUjoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVIocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkE6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9TRUxfVFhfQU5URU5OQShwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TRUxfUlhfQU5URU5OQToKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1NFTF9UWF9BTlRFTk5BKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRToKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRShwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTDoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMToKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1NFVF9BRERSMShwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQUREUjI6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9TRVRfQUREUjIocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9SQVRFOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU0VUX1JBVEUocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTjoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU4ocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1JYX0ZSQU1FOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU1RBUlRfUlhfRlJBTUUocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KLQotICAgIEFTU0VSVChwUmFDZmcgIT0gTlVMTCk7Ci0KLSAgICBpZiAocFJhQ2ZnICE9IE5VTEwpCi0JICAgIGtmcmVlKHBSYUNmZyk7Ci0KLQlyZXR1cm47Ci19Ci0KLQotVk9JRCBCdWJibGVTb3J0KElOVDMyIG4sIElOVDMyIGFbXSkKLXsKLQlJTlQzMiBrLCBqLCB0ZW1wOwotCi0JZm9yIChrID0gbi0xOyAgaz4wOyAgay0tKQotCXsKLQkJZm9yIChqID0gMDsgajxrOyBqKyspCi0JCXsKLQkJCWlmIChhW2pdID4gYVtqKzFdKQotCQkJewotCQkJCXRlbXAgPSBhW2pdOwotCQkJCWFbal09YVtqKzFdOwotCQkJCWFbaisxXT10ZW1wOwotCQkJfQotCQl9Ci0JfQotfQotCi0KLVZPSUQgQ2FsTm9pc2VMZXZlbChQUlRNUF9BREFQVEVSIHBBZCwgVUNIQVIgY2hhbm5lbCwgSU5UMzIgUlNTSVszXVsxMF0pCi17Ci0JSU5UMzIJCVJTU0kwLCBSU1NJMSwgUlNTSTI7Ci0JQ0hBUgkJUnNzaTBPZmZzZXQsIFJzc2kxT2Zmc2V0LCBSc3NpMk9mZnNldDsKLQlVQ0hBUgkJQmJwUjUwUnNzaTAgPSAwLCBCYnBSNTFSc3NpMSA9IDAsIEJicFI1MlJzc2kyID0gMDsKLQlVQ0hBUgkJT3JnX0JCUDY2dmFsdWUgPSAwLCBPcmdfQkJQNjl2YWx1ZSA9IDAsIE9yZ19CQlA3MHZhbHVlID0gMCwgZGF0YSA9IDA7Ci0JVVNIT1JUCQlMTkFfR2FpbiA9IDA7Ci0JSU5UMzIgICAgICAgaiA9IDA7Ci0JVUNIQVIJCU9yZ19DaGFubmVsID0gcEFkLT5hdGUuQ2hhbm5lbDsKLQlVU0hPUlQJICAgIEdhaW5WYWx1ZSA9IDAsIE9mZnNldFZhbHVlID0gMDsKLQotCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgJk9yZ19CQlA2NnZhbHVlKTsKLQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksICZPcmdfQkJQNjl2YWx1ZSk7Ci0JQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAmT3JnX0JCUDcwdmFsdWUpOwotCi0JLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JLy8gUmVhZCB0aGUgdmFsdWUgb2YgTE5BIGdhaW4gYW5kIFJzc2kgb2Zmc2V0Ci0JLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTE5BX09GRlNFVCwgR2FpblZhbHVlKTsKLQotCS8vIGZvciBOb2lzZSBMZXZlbAotCWlmIChjaGFubmVsIDw9IDE0KQotCXsKLQkJTE5BX0dhaW4gPSBHYWluVmFsdWUgJiAweDAwRkY7Ci0KLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQsIE9mZnNldFZhbHVlKTsKLQkJUnNzaTBPZmZzZXQgPSBPZmZzZXRWYWx1ZSAmIDB4MDBGRjsKLQkJUnNzaTFPZmZzZXQgPSAoT2Zmc2V0VmFsdWUgJiAweEZGMDApID4+IDg7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgKEVFUFJPTV9SU1NJX0JHX09GRlNFVCArIDIpLyogMHg0OCAqLywgT2Zmc2V0VmFsdWUpOwotCQlSc3NpMk9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOwotCX0KLQllbHNlCi0JewotCQlMTkFfR2FpbiA9IChHYWluVmFsdWUgJiAweEZGMDApID4+IDg7Ci0KLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9BX09GRlNFVCwgT2Zmc2V0VmFsdWUpOwotCQlSc3NpME9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOwotCQlSc3NpMU9mZnNldCA9IChPZmZzZXRWYWx1ZSAmIDB4RkYwMCkgPj4gODsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAoRUVQUk9NX1JTU0lfQV9PRkZTRVQgKyAyKS8qIDB4NEMgKi8sIE9mZnNldFZhbHVlKTsKLQkJUnNzaTJPZmZzZXQgPSBPZmZzZXRWYWx1ZSAmIDB4MDBGRjsKLQl9Ci0JLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JewotCQlwQWQtPmF0ZS5DaGFubmVsID0gY2hhbm5lbDsKLQkJQVRFQXNpY1N3aXRjaENoYW5uZWwocEFkKTsKLQkJbWRlbGF5KDUpOwotCi0JCWRhdGEgPSAweDEwOwotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBkYXRhKTsKLQkJZGF0YSA9IDB4NDA7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIGRhdGEpOwotCQlkYXRhID0gMHg0MDsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgZGF0YSk7Ci0JCW1kZWxheSg1KTsKLQotCQkvLyBzdGFydCBSeAotCQlwQWQtPmF0ZS5iUUFSeFN0YXJ0ID0gVFJVRTsKLQkJU2V0X0FURV9Qcm9jKHBBZCwgIlJYRlJBTUUiKTsKLQotCQltZGVsYXkoNSk7Ci0KLQkJZm9yIChqID0gMDsgaiA8IDEwOyBqKyspCi0JCXsKLQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1MCwgJkJicFI1MFJzc2kwKTsKLQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1MSwgJkJicFI1MVJzc2kxKTsKLQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1MiwgJkJicFI1MlJzc2kyKTsKLQotCQkJbWRlbGF5KDEwKTsKLQotCQkJLy8gY2FsY3VsYXRlIFJTU0kgMAotCQkJaWYgKEJicFI1MFJzc2kwID09IDApCi0JCQl7Ci0JCQkJUlNTSTAgPSAtMTAwOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCVJTU0kwID0gKElOVDMyKSgtMTIgLSBCYnBSNTBSc3NpMCAtIExOQV9HYWluIC0gUnNzaTBPZmZzZXQpOwotCQkJfQotCQkJUlNTSVswXVtqXSA9IFJTU0kwOwotCi0JCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMiApIC8vIDJSCi0JCQl7Ci0JCQkJLy8gY2FsY3VsYXRlIFJTU0kgMQotCQkJCWlmIChCYnBSNTFSc3NpMSA9PSAwKQotCQkJCXsKLQkJCQkJUlNTSTEgPSAtMTAwOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlSU1NJMSA9IChJTlQzMikoLTEyIC0gQmJwUjUxUnNzaTEgLSBMTkFfR2FpbiAtIFJzc2kxT2Zmc2V0KTsKLQkJCQl9Ci0JCQkJUlNTSVsxXVtqXSA9IFJTU0kxOwotCQkJfQotCi0JCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMyApIC8vIDNSCi0JCQl7Ci0JCQkJLy8gY2FsY3VsYXRlIFJTU0kgMgotCQkJCWlmIChCYnBSNTJSc3NpMiA9PSAwKQotCQkJCQlSU1NJMiA9IC0xMDA7Ci0JCQkJZWxzZQotCQkJCQlSU1NJMiA9IChJTlQzMikoLTEyIC0gQmJwUjUyUnNzaTIgLSBMTkFfR2FpbiAtIFJzc2kyT2Zmc2V0KTsKLQotCQkJCVJTU0lbMl1bal0gPSBSU1NJMjsKLQkJCX0KLQkJfQotCi0JCS8vIHN0b3AgUngKLQkJU2V0X0FURV9Qcm9jKHBBZCwgIlJYU1RPUCIpOwotCi0JCW1kZWxheSg1KTsKLQotCQlCdWJibGVTb3J0KDEwLCBSU1NJWzBdKTsJLy8gMVIKLQotCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMiApIC8vIDJSCi0JCXsKLQkJCUJ1YmJsZVNvcnQoMTAsIFJTU0lbMV0pOwotCQl9Ci0KLQkJaWYgKCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDMgKSAvLyAzUgotCQl7Ci0JCQlCdWJibGVTb3J0KDEwLCBSU1NJWzJdKTsKLQkJfQotCX0KLQotCXBBZC0+YXRlLkNoYW5uZWwgPSBPcmdfQ2hhbm5lbDsKLQlBVEVBc2ljU3dpdGNoQ2hhbm5lbChwQWQpOwotCi0JLy8gcmVzdG9yZSBvcmlnaW5hbCB2YWx1ZQotICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIE9yZ19CQlA2NnZhbHVlKTsKLSAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCBPcmdfQkJQNjl2YWx1ZSk7Ci0gICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgT3JnX0JCUDcwdmFsdWUpOwotCi0JcmV0dXJuOwotfQotCi0KLUJPT0xFQU4gU3luY1R4UnhDb25maWcoUFJUTVBfQURBUFRFUiBwQWQsIFVTSE9SVCBvZmZzZXQsIFVDSEFSIHZhbHVlKQotewotCVVDSEFSIHRtcCA9IDAsIGJicF9kYXRhID0gMDsKLQotCWlmIChBVEVfT04ocEFkKSkKLQl7Ci0JCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAmYmJwX2RhdGEpOwotCX0KLQllbHNlCi0JewotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBvZmZzZXQsICZiYnBfZGF0YSk7Ci0JfQotCi0JLyogY29uZmlybSBhZ2FpbiAqLwotCUFTU0VSVChiYnBfZGF0YSA9PSB2YWx1ZSk7Ci0KLQlzd2l0Y2ggKG9mZnNldCkKLQl7Ci0JCWNhc2UgQkJQX1IxOgotCQkJLyogTmVlZCB0byBzeW5jaHJvbml6ZSB0eCBjb25maWd1cmF0aW9uIHdpdGggbGVnYWN5IEFURS4gKi8KLQkJCXRtcCA9IChiYnBfZGF0YSAmICgoMSA8PCA0KSB8ICgxIDw8IDMpKS8qIDB4MTggKi8pID4+IDM7Ci0JCSAgICBzd2l0Y2ggKHRtcCkKLQkJICAgIHsKLQkJCQkvKiBUaGUgQkJQIFIxIGJpdFs0OjNdID0gMiA6OiBCb3RoIERBQ3Mgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLwotCQkgICAgICAgIGNhc2UgMjoKLQkJCQkJLyogQWxsICovCi0JCQkJCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IDA7Ci0JCSAgICAgICAgICAgIGJyZWFrOwotCQkJCS8qIFRoZSBCQlAgUjEgYml0WzQ6M10gPSAwIDo6IERBQyAwIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KLQkJICAgICAgICBjYXNlIDA6Ci0JCQkJCS8qIEFudGVubmEgb25lICovCi0JCQkJCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IDE7Ci0JCSAgICAgICAgICAgIGJyZWFrOwotCQkJCS8qIFRoZSBCQlAgUjEgYml0WzQ6M10gPSAxIDo6IERBQyAxIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KLQkJICAgICAgICBjYXNlIDE6Ci0JCQkJCS8qIEFudGVubmEgdHdvICovCi0JCQkJCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IDI7Ci0JCSAgICAgICAgICAgIGJyZWFrOwotCQkgICAgICAgIGRlZmF1bHQ6Ci0JCSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0tIFN0aC4gd3JvbmchICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCQkgICAgfQotCQkJYnJlYWs7LyogY2FzZSBCQlBfUjEgKi8KLQotCQljYXNlIEJCUF9SMzoKLQkJCS8qIE5lZWQgdG8gc3luY2hyb25pemUgcnggY29uZmlndXJhdGlvbiB3aXRoIGxlZ2FjeSBBVEUuICovCi0JCQl0bXAgPSAoYmJwX2RhdGEgJiAoKDEgPDwgMSkgfCAoMSA8PCAwKSkvKiAweDAzICovKTsKLQkJICAgIHN3aXRjaCh0bXApCi0JCSAgICB7Ci0JCQkJLyogVGhlIEJCUCBSMyBiaXRbMTowXSA9IDMgOjogQWxsIEFEQ3Mgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLwotCQkgICAgICAgIGNhc2UgMzoKLQkJCQkJLyogQWxsICovCi0JCQkJCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IDA7Ci0JCSAgICAgICAgICAgIGJyZWFrOwotCQkJCS8qCi0JCQkJCVRoZSBCQlAgUjMgYml0WzE6MF0gPSAwIDo6IEFEQyAwIHdpbGwgYmUgdXNlZCBieSBRQSwKLQkJCQkJdW5sZXNzIHRoZSBCQlAgUjMgYml0WzQ6M10gPSAyCi0JCQkJKi8KLQkJICAgICAgICBjYXNlIDA6Ci0JCQkJCS8qIEFudGVubmEgb25lICovCi0JCQkJCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IDE7Ci0JCQkJCXRtcCA9ICgoYmJwX2RhdGEgJiAoKDEgPDwgNCkgfCAoMSA8PCAzKSkvKiAweDAzICovKSA+PiAzKTsKLQkJCQkJaWYgKHRtcCA9PSAyKS8vIDNSCi0JCQkJCXsKLQkJCQkJCS8qIERlZmF1bHQgOiBBbGwgQURDcyB3aWxsIGJlIHVzZWQgYnkgUUEgKi8KLQkJCQkJCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IDA7Ci0JCQkJCX0KLQkJICAgICAgICAgICAgYnJlYWs7Ci0JCQkJLyogVGhlIEJCUCBSMyBiaXRbMTowXSA9IDEgOjogQURDIDEgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLwotCQkgICAgICAgIGNhc2UgMToKLQkJCQkJLyogQW50ZW5uYSB0d28gKi8KLQkJCQkJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gMjsKLQkJICAgICAgICAgICAgYnJlYWs7Ci0JCQkJLyogVGhlIEJCUCBSMyBiaXRbMTowXSA9IDIgOjogQURDIDIgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLwotCQkgICAgICAgIGNhc2UgMjoKLQkJCQkJLyogQW50ZW5uYSB0aHJlZSAqLwotCQkJCQlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSAzOwotCQkgICAgICAgICAgICBicmVhazsKLQkJICAgICAgICBkZWZhdWx0OgotCQkgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyAtLSBJbXBvc3NpYmxlISAgOiByZXR1cm4gRkFMU0U7IFxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQkJICAgIH0KLQkJCWJyZWFrOy8qIGNhc2UgQkJQX1IzICovCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIC0tIFN0aC4gd3JvbmchICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX0ZVTkNUSU9OX18pKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotCX0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1zdGF0aWMgVk9JRCBtZW1jcHlfZXhsKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVTE9ORyBsZW4pCi17Ci0JVUxPTkcgaSwgVmFsdWUgPSAwOwotCVVMT05HICpwRHN0LCAqcFNyYzsKLQlVQ0hBUiAqcDg7Ci0KLQlwOCA9IHNyYzsKLQlwRHN0ID0gKFVMT05HICopIGRzdDsKLQlwU3JjID0gKFVMT05HICopIHNyYzsKLQotCWZvciAoaSA9IDAgOyBpIDwgKGxlbi80KTsgaSsrKQotCXsKLQkJLyogRm9yIGFsaWdubWVudCBpc3N1ZSwgd2UgbmVlZCBhIHZhcmlhYmxlICJWYWx1ZSIuICovCi0JCW1lbW1vdmUoJlZhbHVlLCBwU3JjLCA0KTsKLQkJVmFsdWUgPSBodG9ubChWYWx1ZSk7Ci0JCW1lbW1vdmUocERzdCwgJlZhbHVlLCA0KTsKLQkJcERzdCsrOwotCQlwU3JjKys7Ci0JfQotCWlmICgobGVuICUgNCkgIT0gMCkKLQl7Ci0JCS8qIHdpc2ggdGhhdCBpdCB3aWxsIG5ldmVyIHJlYWNoIGhlcmUgKi8KLQkJbWVtbW92ZSgmVmFsdWUsIHBTcmMsIChsZW4gJSA0KSk7Ci0JCVZhbHVlID0gaHRvbmwoVmFsdWUpOwotCQltZW1tb3ZlKHBEc3QsICZWYWx1ZSwgKGxlbiAlIDQpKTsKLQl9Ci19Ci0KLQotc3RhdGljIFZPSUQgbWVtY3B5X2V4cyhQUlRNUF9BREFQVEVSIHBBZCwgVUNIQVIgKmRzdCwgVUNIQVIgKnNyYywgVUxPTkcgbGVuKQotewotCVVMT05HIGk7Ci0JVUNIQVIgKnBEc3QsICpwU3JjOwotCi0JcERzdCA9IGRzdDsKLQlwU3JjID0gc3JjOwotCi0JZm9yIChpID0gMDsgaSA8IChsZW4vMik7IGkrKykKLQl7Ci0JCW1lbW1vdmUocERzdCwgcFNyYywgMik7Ci0JCSooKFVTSE9SVCAqKXBEc3QpID0gaHRvbnMoKigoVVNIT1JUICopcERzdCkpOwotCQlwRHN0Kz0yOwotCQlwU3JjKz0yOwotCX0KLQotCWlmICgobGVuICUgMikgIT0gMCkKLQl7Ci0JCW1lbW1vdmUocERzdCwgcFNyYywgMSk7Ci0JfQotfQotCi0KLXN0YXRpYyBWT0lEIFJUTVBfSU9fUkVBRF9CVUxLKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVSU5UMzIgbGVuKQotewotCVVJTlQzMiBpLCBWYWx1ZTsKLQlVSU5UMzIgKnBEc3QsICpwU3JjOwotCi0JcERzdCA9IChVSU5UMzIgKikgZHN0OwotCXBTcmMgPSAoVUlOVDMyICopIHNyYzsKLQotCWZvciAoaSA9IDAgOyBpIDwgKGxlbi80KTsgaSsrKQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCAoVUxPTkcpcFNyYywgJlZhbHVlKTsKLQkJVmFsdWUgPSBodG9ubChWYWx1ZSk7Ci0JCW1lbW1vdmUocERzdCwgJlZhbHVlLCA0KTsKLQkJcERzdCsrOwotCQlwU3JjKys7Ci0JfQotCXJldHVybjsKLX0KLQotCi1JTlQgU2V0X1R4U3RvcF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZXRfVHhTdG9wX1Byb2NcbiIpKTsKLQotCWlmIChTZXRfQVRFX1Byb2MocEFkLCAiVFhTVE9QIikpCi0JewotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JZWxzZQotCXsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLX0KLQotCi1JTlQgU2V0X1J4U3RvcF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZXRfUnhTdG9wX1Byb2NcbiIpKTsKLQotCWlmIChTZXRfQVRFX1Byb2MocEFkLCAiUlhTVE9QIikpCi0JewotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JZWxzZQotCXsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLX0KLQotCi0jaWZkZWYgREJHCi1JTlQgU2V0X0VFUmVhZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKLQlVU0hPUlQgKnA7Ci0JSU5UIGk7Ci0KLQlydF9lZV9yZWFkX2FsbChwQWQsIChVU0hPUlQgKilidWZmZXIpOwotCXAgPSBidWZmZXI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKEVFUFJPTV9TSVpFLzIpOyBpKyspCi0JewotCQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiJTQuNHggIiwgKnApOwotCQlpZiAoKChpKzEpICUgMTYpID09IDApCi0JCQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiXG4iKTsKLQkJcCsrOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLUlOVCBTZXRfRUVXcml0ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVVNIT1JUIG9mZnNldCA9IDAsIHZhbHVlOwotCVBTVFJJTkcgcDIgPSBhcmc7Ci0KLQl3aGlsZSAoKCpwMiAhPSAnOicpICYmICgqcDIgIT0gJ1wwJykpCi0JewotCQlwMisrOwotCX0KLQotCWlmICgqcDIgPT0gJzonKQotCXsKLQkJQTJIZXgob2Zmc2V0LCBhcmcpOwotCQlBMkhleCh2YWx1ZSwgcDIgKyAxKTsKLQl9Ci0JZWxzZQotCXsKLQkJQTJIZXgodmFsdWUsIGFyZyk7Ci0JfQotCi0JaWYgKG9mZnNldCA+PSBFRVBST01fU0laRSkKLQl7Ci0JCWF0ZV9wcmludChLRVJOX0VNRVJHICJPZmZzZXQgY2FuIG5vdCBleGNlZWQgRUVQUk9NX1NJWkUoID09IDB4JTA0eClcbiIsIEVFUFJPTV9TSVpFKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCVJUMjh4eF9FRVBST01fV1JJVEUxNihwQWQsIG9mZnNldCwgdmFsdWUpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UIFNldF9CQlBSZWFkX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVQ0hBUiB2YWx1ZSA9IDAsIG9mZnNldDsKLQotCUEySGV4KG9mZnNldCwgYXJnKTsKLQotCWlmIChBVEVfT04ocEFkKSkKLQl7Ci0JCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgJnZhbHVlKTsKLQl9Ci0JZWxzZQotCXsKLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgJnZhbHVlKTsKLQl9Ci0KLQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiJXhcbiIsIHZhbHVlKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLUlOVCBTZXRfQkJQV3JpdGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVTSE9SVCBvZmZzZXQgPSAwOwotCVBTVFJJTkcgcDIgPSBhcmc7Ci0JVUNIQVIgdmFsdWU7Ci0KLQl3aGlsZSAoKCpwMiAhPSAnOicpICYmICgqcDIgIT0gJ1wwJykpCi0JewotCQlwMisrOwotCX0KLQotCWlmICgqcDIgPT0gJzonKQotCXsKLQkJQTJIZXgob2Zmc2V0LCBhcmcpOwotCQlBMkhleCh2YWx1ZSwgcDIgKyAxKTsKLQl9Ci0JZWxzZQotCXsKLQkJQTJIZXgodmFsdWUsIGFyZyk7Ci0JfQotCi0JaWYgKEFURV9PTihwQWQpKQotCXsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgdmFsdWUpOwotCX0KLQllbHNlCi0JewotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgdmFsdWUpOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLUlOVCBTZXRfUkZXcml0ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JUFNUUklORyBwMiwgcDMsIHA0OwotCVVJTlQzMiBSMSwgUjIsIFIzLCBSNDsKLQotCXAyID0gYXJnOwotCi0Jd2hpbGUgKCgqcDIgIT0gJzonKSAmJiAoKnAyICE9ICdcMCcpKQotCXsKLQkJcDIrKzsKLQl9Ci0KLQlpZiAoKnAyICE9ICc6JykKLQkJcmV0dXJuIEZBTFNFOwotCi0JcDMgPSBwMiArIDE7Ci0KLQl3aGlsZSgoKnAzICE9ICc6JykgJiYgKCpwMyAhPSAnXDAnKSkKLQl7Ci0JCXAzKys7Ci0JfQotCi0JaWYgKCpwMyAhPSAnOicpCi0JCXJldHVybiBGQUxTRTsKLQotCXA0ID0gcDMgKyAxOwotCi0Jd2hpbGUgKCgqcDQgIT0gJzonKSAmJiAoKnA0ICE9ICdcMCcpKQotCXsKLQkJcDQrKzsKLQl9Ci0KLQlpZiAoKnA0ICE9ICc6JykKLQkJcmV0dXJuIEZBTFNFOwotCi0KLQlBMkhleChSMSwgYXJnKTsKLQlBMkhleChSMiwgcDIgKyAxKTsKLQlBMkhleChSMywgcDMgKyAxKTsKLQlBMkhleChSNCwgcDQgKyAxKTsKLQotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKLQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMik7Ci0JUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjMpOwotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFI0KTsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIERCRyAvLwotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0KLQotCi0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotI2RlZmluZQlMRU5fT0ZfQVJHIDE2Ci0KLSNkZWZpbmUgUkVTUE9OU0VfVE9fR1VJKF9fcFJhQ2ZnLCBfX3B3cnEsIF9fTGVuZ3RoLCBfX1N0YXR1cykJCQkJCQkJCQlcCi0JKF9fcFJhQ2ZnKS0+bGVuZ3RoID0gaHRvbnMoKF9fTGVuZ3RoKSk7CQkJCQkJCQkJCQkJCQlcCi0JKF9fcFJhQ2ZnKS0+c3RhdHVzID0gaHRvbnMoKF9fU3RhdHVzKSk7CQkJCQkJCQkJCQkJCQlcCi0JKF9fcHdycSktPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoKF9fcFJhQ2ZnKS0+bWFnaWNfbm8pICsgc2l6ZW9mKChfX3BSYUNmZyktPmNvbW1hbmRfdHlwZSkJXAotCQkJCQkJCSsgc2l6ZW9mKChfX3BSYUNmZyktPmNvbW1hbmRfaWQpICsgc2l6ZW9mKChfX3BSYUNmZyktPmxlbmd0aCkJCVwKLQkJCQkJCQkrIHNpemVvZigoX19wUmFDZmcpLT5zZXF1ZW5jZSkgKyBudG9ocygoX19wUmFDZmcpLT5sZW5ndGgpOwkJCVwKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgKF9fcHdycSktPnUuZGF0YS5sZW5ndGgpKTsJCVwKLQlpZiAoY29weV90b191c2VyKChfX3B3cnEpLT51LmRhdGEucG9pbnRlciwgKFVDSEFSICopKF9fcFJhQ2ZnKSwgKF9fcHdycSktPnUuZGF0YS5sZW5ndGgpKQlcCi0JewkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluICVzXG4iLCBfX0ZVTkNUSU9OX18pKTsJCQkJXAotCQlyZXR1cm4gKC1FRkFVTFQpOwkJCQkJCQkJCQkJCQkJCQkJCVwKLQl9CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JZWxzZQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JewkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyBpcyBkb25lICFcbiIsIF9fRlVOQ1RJT05fXykpOwkJCQkJCQlcCi0JfQotCi1zdGF0aWMgaW5saW5lIElOVAlET19SQUNGR19DTURfQVRFX1NUQVJUKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRcbiIpKTsKLQotCS8qIFByZXBhcmUgZmVlZGJhY2sgYXMgc29vbiBhcyB3ZSBjYW4gdG8gYXZvaWQgUUEgdGltZW91dC4gKi8KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIkFURVNUQVJUIik7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NUT1AoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCUlOVDMyIHJldDsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TVE9QXG4iKSk7Ci0KLQkvKgotCQlEaXN0aW5ndWlzaCB0aGlzIGNvbW1hbmQgY2FtZSBmcm9tIFFBKHZpYSBhdGUgYWdlbnQpCi0JCW9yIGF0ZSBhZ2VudCBhY2NvcmRpbmcgdG8gdGhlIGV4aXN0ZW5jZSBvZiBwaWQgaW4gcGF5bG9hZC4KLQotCQlObyBuZWVkIHRvIHByZXBhcmUgZmVlZGJhY2sgaWYgdGhpcyBjbWQgY2FtZSBkaXJlY3RseSBmcm9tIGF0ZSBhZ2VudCwKLQkJbm90IGZyb20gUUEuCi0JKi8KLQlwUmFDZmctPmxlbmd0aCA9IG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKLQotCWlmIChwUmFDZmctPmxlbmd0aCA9PSBzaXplb2YocEFkYXB0ZXItPmF0ZS5BdGVQaWQpKQotCXsKLQkJLyoKLQkJCVRoaXMgY29tbWFuZCBjYW1lIGZyb20gUUEuCi0JCQlHZXQgdGhlIHBpZCBvZiBBVEUgYWdlbnQuCi0JCSovCi0JCW1lbWNweSgoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5BdGVQaWQsCi0JCQkJCQkoJnBSYUNmZy0+ZGF0YVswXSkgLSAyLyogPT0gc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSAqLywKLQkJCQkJCXNpemVvZihwQWRhcHRlci0+YXRlLkF0ZVBpZCkpOwotCi0JCS8qIFByZXBhcmUgZmVlZGJhY2sgYXMgc29vbiBhcyB3ZSBjYW4gdG8gYXZvaWQgUUEgdGltZW91dC4gKi8KLQkJUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCQkvKgotCQkJS2lsbCBBVEUgYWdlbnQgd2hlbiBsZWF2aW5nIEFURSBtb2RlLgotCi0JCQlXZSBtdXN0IGtpbGwgQVRFIGFnZW50IGZpcnN0IGJlZm9yZSBzZXR0aW5nIEFURVNUT1AsCi0JCQlvciBNaWNyb3NvZnQgd2lsbCByZXBvcnQgc3RoLiB3cm9uZy4KLQkJKi8KLQkJcmV0ID0gS0lMTF9USFJFQURfUElEKHBBZGFwdGVyLT5hdGUuQXRlUGlkLCBTSUdURVJNLCAxKTsKLQotCQlpZiAocmV0KQotCQl7Ci0JCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5hYmxlIHRvIGtpbGwgYXRlIHRocmVhZFxuIiwgcEFkYXB0ZXItPm5ldF9kZXYtPm5hbWUpKTsKLQkJfQotCX0KLQotCi0JLyogQVAvU1RBIG1pZ2h0IGhhdmUgaW4gQVRFX1NUT1AgbW9kZSBkdWUgdG8gY21kIGZyb20gUUEuICovCi0JaWYgKEFURV9PTihwQWRhcHRlcikpCi0JewotCQkvKiBTb21lb25lIGhhcyBraWxsZWQgYXRlIGFnZW50IHdoaWxlIFFBIEdVSSBpcyBzdGlsbCBvcGVuLiAqLwotCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJBVEVTVE9QIik7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BUF9TVEFSVCBpcyBkb25lICFcbiIpKTsKLQl9Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfUkZfV1JJVEVfQUxMKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVSU5UMzIgUjEsIFIyLCBSMywgUjQ7Ci0JVVNIT1JUIGNoYW5uZWw7Ci0KLQltZW1jcHkoJlIxLCBwUmFDZmctPmRhdGEtMiwgNCk7Ci0JbWVtY3B5KCZSMiwgcFJhQ2ZnLT5kYXRhKzIsIDQpOwotCW1lbWNweSgmUjMsIHBSYUNmZy0+ZGF0YSs2LCA0KTsKLQltZW1jcHkoJlI0LCBwUmFDZmctPmRhdGErMTAsIDQpOwotCW1lbWNweSgmY2hhbm5lbCwgcFJhQ2ZnLT5kYXRhKzE0LCAyKTsKLQotCXBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMSA9IG50b2hsKFIxKTsKLQlwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjIgPSBudG9obChSMik7Ci0JcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIzID0gbnRvaGwoUjMpOwotCXBBZGFwdGVyLT5MYXRjaFJmUmVncy5SNCA9IG50b2hsKFI0KTsKLQlwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IG50b2hzKGNoYW5uZWwpOwotCi0JUlRNUF9SRl9JT19XUklURTMyKHBBZGFwdGVyLCBwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjEpOwotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWRhcHRlciwgcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIyKTsKLQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkYXB0ZXIsIHBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMyk7Ci0JUlRNUF9SRl9JT19XUklURTMyKHBBZGFwdGVyLCBwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjQpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiAgTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfRTJQUk9NX1JFQUQxNigKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVUlOVDE2CW9mZnNldD0wLCB2YWx1ZT0wOwotCVVTSE9SVCAgdG1wPTA7Ci0KLQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7Ci0KLQkvKiAidG1wIiBpcyBlc3BlY2lhbGx5IGZvciBzb21lIGNvbXBpbGVycy4uLiAqLwotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZGFwdGVyLCBvZmZzZXQsIHRtcCk7Ci0JdmFsdWUgPSB0bXA7Ci0JdmFsdWUgPSBodG9ucyh2YWx1ZSk7Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkVFUFJPTSBSZWFkIG9mZnNldCA9IDB4JTA0eCwgdmFsdWUgPSAweCUwNHhcbiIsIG9mZnNldCwgdmFsdWUpKTsKLQltZW1jcHkocFJhQ2ZnLT5kYXRhLCAmdmFsdWUsIDIpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpKzIsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0UyUFJPTV9XUklURTE2KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVU0hPUlQJb2Zmc2V0LCB2YWx1ZTsKLQotCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKLQltZW1jcHkoJnZhbHVlLCBwUmFDZmctPmRhdGEsIDIpOwotCXZhbHVlID0gbnRvaHModmFsdWUpOwotCVJUMjh4eF9FRVBST01fV1JJVEUxNihwQWRhcHRlciwgb2Zmc2V0LCB2YWx1ZSk7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKLQotCXJ0X2VlX3JlYWRfYWxsKHBBZGFwdGVyLChVU0hPUlQgKilidWZmZXIpOwotCW1lbWNweV9leHMocEFkYXB0ZXIsIHBSYUNmZy0+ZGF0YSwgKFVDSEFSICopYnVmZmVyLCBFRVBST01fU0laRSk7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cykrRUVQUk9NX1NJWkUsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0UyUFJPTV9XUklURV9BTEwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVVTSE9SVCBidWZmZXJbRUVQUk9NX1NJWkUvMl07Ci0KLQlOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilidWZmZXIsIEVFUFJPTV9TSVpFKTsKLQltZW1jcHlfZXhzKHBBZGFwdGVyLCAoVUNIQVIgKilidWZmZXIsIChVQ0hBUiAqKSZwUmFDZmctPnN0YXR1cywgRUVQUk9NX1NJWkUpOwotCXJ0X2VlX3dyaXRlX2FsbChwQWRhcHRlciwoVVNIT1JUICopYnVmZmVyKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfSU9fUkVBRCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVUlOVDMyCW9mZnNldDsKLQlVSU5UMzIJdmFsdWU7Ci0KLQltZW1jcHkoJm9mZnNldCwgJnBSYUNmZy0+c3RhdHVzLCA0KTsKLQlvZmZzZXQgPSBudG9obChvZmZzZXQpOwotCi0JLyoKLQkJV2UgZG8gbm90IG5lZWQgdGhlIGJhc2UgYWRkcmVzcy4KLQkJU28ganVzdCBleHRyYWN0IHRoZSBvZmZzZXQgb3V0LgotCSovCi0Jb2Zmc2V0ICY9IDB4MDAwMEZGRkY7Ci0JUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIG9mZnNldCwgJnZhbHVlKTsKLQl2YWx1ZSA9IGh0b25sKHZhbHVlKTsKLQltZW1jcHkocFJhQ2ZnLT5kYXRhLCAmdmFsdWUsIDQpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpKzQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0lPX1dSSVRFKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVSU5UMzIJb2Zmc2V0LCB2YWx1ZTsKLQotCW1lbWNweSgmb2Zmc2V0LCBwUmFDZmctPmRhdGEtMiwgNCk7Ci0JbWVtY3B5KCZ2YWx1ZSwgcFJhQ2ZnLT5kYXRhKzIsIDQpOwotCi0Jb2Zmc2V0ID0gbnRvaGwob2Zmc2V0KTsKLQotCS8qCi0JCVdlIGRvIG5vdCBuZWVkIHRoZSBiYXNlIGFkZHJlc3MuCi0JCVNvIGp1c3QgZXh0cmFjdCB0aGUgb2Zmc2V0IG91dC4KLQkqLwotCW9mZnNldCAmPSAweDAwMDBGRkZGOwotCXZhbHVlID0gbnRvaGwodmFsdWUpOwotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0lPX1dSSVRFOiBvZmZzZXQgPSAleCwgdmFsdWUgPSAleFxuIiwgb2Zmc2V0LCB2YWx1ZSkpOwotCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgb2Zmc2V0LCB2YWx1ZSk7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0lPX1JFQURfQlVMSygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVUlOVDMyCW9mZnNldDsKLQlVU0hPUlQJbGVuOwotCi0JbWVtY3B5KCZvZmZzZXQsICZwUmFDZmctPnN0YXR1cywgNCk7Ci0Jb2Zmc2V0ID0gbnRvaGwob2Zmc2V0KTsKLQotCS8qCi0JCVdlIGRvIG5vdCBuZWVkIHRoZSBiYXNlIGFkZHJlc3MuCi0JCVNvIGp1c3QgZXh0cmFjdCB0aGUgb2Zmc2V0IG91dC4KLQkqLwotCW9mZnNldCAmPSAweDAwMDBGRkZGOwotCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGErMiwgMik7Ci0JbGVuID0gbnRvaHMobGVuKTsKLQotCWlmIChsZW4gPiAzNzEpCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImxlbmd0aCByZXF1ZXN0ZWQgaXMgdG9vIGxhcmdlLCBtYWtlIGl0IHNtYWxsZXJcbiIpKTsKLQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKLQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygxKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JUlRNUF9JT19SRUFEX0JVTEsocEFkYXB0ZXIsIHBSYUNmZy0+ZGF0YSwgKFVDSEFSICopb2Zmc2V0LCBsZW4qNCk7Ly8gdW5pdCBpbiBmb3VyIGJ5dGVzCi0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cykrKGxlbio0KSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQkJQX1JFQUQ4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVU0hPUlQJb2Zmc2V0OwotCVVDSEFSCXZhbHVlOwotCi0JdmFsdWUgPSAwOwotCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKLQotCWlmIChBVEVfT04ocEFkYXB0ZXIpKQotCXsKLQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIG9mZnNldCwgJnZhbHVlKTsKLQl9Ci0JZWxzZQotCXsKLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBvZmZzZXQsICZ2YWx1ZSk7Ci0JfQotCi0JcFJhQ2ZnLT5kYXRhWzBdID0gdmFsdWU7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cykrMSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQkJQX1dSSVRFOCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVVNIT1JUCW9mZnNldDsKLQlVQ0hBUgl2YWx1ZTsKLQotCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKLQltZW1jcHkoJnZhbHVlLCBwUmFDZmctPmRhdGEsIDEpOwotCi0JaWYgKEFURV9PTihwQWRhcHRlcikpCi0JewotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIG9mZnNldCwgdmFsdWUpOwotCX0KLQllbHNlCi0JewotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBvZmZzZXQsIHZhbHVlKTsKLQl9Ci0KLQlpZiAoKG9mZnNldCA9PSBCQlBfUjEpIHx8IChvZmZzZXQgPT0gQkJQX1IzKSkKLQl7Ci0JCVN5bmNUeFJ4Q29uZmlnKHBBZGFwdGVyLCBvZmZzZXQsIHZhbHVlKTsKLQl9Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0JCUF9SRUFEX0FMTCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVVNIT1JUIGJicF9yZWdfaW5kZXg7Ci0KLQlmb3IgKGJicF9yZWdfaW5kZXggPSAwOyBiYnBfcmVnX2luZGV4IDwgTUFYX0JCUF9JRCsxOyBiYnBfcmVnX2luZGV4KyspCi0JewotCQlwUmFDZmctPmRhdGFbYmJwX3JlZ19pbmRleF0gPSAwOwotCi0JCWlmIChBVEVfT04ocEFkYXB0ZXIpKQotCQl7Ci0JCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwX3JlZ19pbmRleCwgJnBSYUNmZy0+ZGF0YVtiYnBfcmVnX2luZGV4XSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicF9yZWdfaW5kZXgsICZwUmFDZmctPmRhdGFbYmJwX3JlZ19pbmRleF0pOwotCQl9Ci0JfQotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpK01BWF9CQlBfSUQrMSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfR0VUX05PSVNFX0xFVkVMKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVQ0hBUgljaGFubmVsOwotCUlOVDMyICAgYnVmZmVyWzNdWzEwXTsvKiAzIDogUnhQYXRoIDsgMTAgOiBuby4gb2YgcGVyIHJzc2kgc2FtcGxlcyAqLwotCi0JY2hhbm5lbCA9IChudG9ocyhwUmFDZmctPnN0YXR1cykgJiAweDAwRkYpOwotCUNhbE5vaXNlTGV2ZWwocEFkYXB0ZXIsIGNoYW5uZWwsIGJ1ZmZlcik7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgKFVDSEFSICopcFJhQ2ZnLT5kYXRhLCAoVUNIQVIgKikmKGJ1ZmZlclswXVswXSksIChzaXplb2YoSU5UMzIpKjMqMTApKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSsoc2l6ZW9mKElOVDMyKSozKjEwKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfR0VUX0NPVU5URVIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlUyTSwgNCk7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuT3RoZXJEYXRhLCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5CZWFjb24sIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMTJdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5PdGhlckNvdW50LCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzE2XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhBYzAsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjBdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeEFjMSwgNCk7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyNF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4QWMyLCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzI4XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhBYzMsIDQpOwotCS8qbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVszMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4SENDQSwgNCk7Ki8KLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzM2XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhNZ210LCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQwXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuUlNTSTAsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDRdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5SU1NJMSwgNCk7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0OF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlJTU0kyLCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzUyXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuU05SMCwgNCk7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs1Nl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlNOUjEsIDQpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpKzYwLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9DTEVBUl9DT1VOVEVSKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlwQWRhcHRlci0+YXRlLlUyTSA9IDA7Ci0JcEFkYXB0ZXItPmF0ZS5PdGhlckRhdGEgPSAwOwotCXBBZGFwdGVyLT5hdGUuQmVhY29uID0gMDsKLQlwQWRhcHRlci0+YXRlLk90aGVyQ291bnQgPSAwOwotCXBBZGFwdGVyLT5hdGUuVHhBYzAgPSAwOwotCXBBZGFwdGVyLT5hdGUuVHhBYzEgPSAwOwotCXBBZGFwdGVyLT5hdGUuVHhBYzIgPSAwOwotCXBBZGFwdGVyLT5hdGUuVHhBYzMgPSAwOwotCS8qcEFkYXB0ZXItPmF0ZS5UeEhDQ0EgPSAwOyovCi0JcEFkYXB0ZXItPmF0ZS5UeE1nbXQgPSAwOwotCXBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQgPSAwOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9UWF9TVEFSVCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVVNIT1JUICpwOwotCVVTSE9SVAllcnIgPSAxOwotCVVDSEFSICAgQmJwMjJWYWx1ZSA9IDAsIEJicDI0VmFsdWUgPSAwOwotCi0JaWYgKChwQWRhcHRlci0+YXRlLlR4U3RhdHVzICE9IDApICYmIChwQWRhcHRlci0+YXRlLk1vZGUgJiBBVEVfVFhGUkFNRSkpCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkF0ZSBUeCBpcyBhbHJlYWR5IHJ1bm5pbmcsIHRvIHJ1biBuZXh0IFR4LCB5b3UgbXVzdCBzdG9wIGl0IGZpcnN0XG4iKSk7Ci0JCWVyciA9IDI7Ci0JCWdvdG8gVFhfU1RBUlRfRVJST1I7Ci0JfQotCWVsc2UgaWYgKChwQWRhcHRlci0+YXRlLlR4U3RhdHVzICE9IDApICYmICEocEFkYXB0ZXItPmF0ZS5Nb2RlICYgQVRFX1RYRlJBTUUpKQotCXsKLQkJaW50IGkgPSAwOwotCi0JCXdoaWxlICgoaSsrIDwgMTApICYmIChwQWRhcHRlci0+YXRlLlR4U3RhdHVzICE9IDApKQotCQl7Ci0JCQlSVE1QdXNlY0RlbGF5KDUwMDApOwotCQl9Ci0KLQkJLyogZm9yY2UgaXQgdG8gc3RvcCAqLwotCQlwQWRhcHRlci0+YXRlLlR4U3RhdHVzID0gMDsKLQkJcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCA9IDA7Ci0JCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IEZBTFNFOwotCX0KLQotCS8qCi0JCUlmIHBSYUNmZy0+bGVuZ3RoID09IDAsIHRoaXMgIlJBQ0ZHX0NNRF9UWF9TVEFSVCIKLQkJaXMgZm9yIENhcnJpZXIgdGVzdCBvciBDYXJyaWVyIFN1cHByZXNzaW9uLgotCSovCi0JaWYgKG50b2hzKHBSYUNmZy0+bGVuZ3RoKSAhPSAwKQotCXsKLQkJLyogZ2V0IGZyYW1lIGluZm8gKi8KLQotCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5UeFdJLCBwUmFDZmctPmRhdGEgKyAyLCAxNik7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUikmcEFkYXB0ZXItPmF0ZS5UeFdJLCBUWVBFX1RYV0kpOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQotCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5UeENvdW50LCBwUmFDZmctPmRhdGEgKyAxOCwgNCk7Ci0JCXBBZGFwdGVyLT5hdGUuVHhDb3VudCA9IG50b2hsKHBBZGFwdGVyLT5hdGUuVHhDb3VudCk7Ci0KLQkJcCA9IChVU0hPUlQgKikoJnBSYUNmZy0+ZGF0YVsyMl0pOwotCi0JCS8qIGFsd2F5cyB1c2UgUUlEX0FDX0JFICovCi0JCXBBZGFwdGVyLT5hdGUuUUlEID0gMDsKLQotCQlwID0gKFVTSE9SVCAqKSgmcFJhQ2ZnLT5kYXRhWzI0XSk7Ci0JCXBBZGFwdGVyLT5hdGUuSExlbiA9IG50b2hzKCpwKTsKLQotCQlpZiAocEFkYXB0ZXItPmF0ZS5ITGVuID4gMzIpCi0JCXsKLQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgicEFkYXB0ZXItPmF0ZS5ITGVuID4gMzJcbiIpKTsKLQkJCWVyciA9IDM7Ci0JCQlnb3RvIFRYX1NUQVJUX0VSUk9SOwotCQl9Ci0KLQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5hdGUuSGVhZGVyLCBwUmFDZmctPmRhdGEgKyAyNiwgcEFkYXB0ZXItPmF0ZS5ITGVuKTsKLQotCQlwQWRhcHRlci0+YXRlLlBMZW4gPSBudG9ocyhwUmFDZmctPmxlbmd0aCkgLSAocEFkYXB0ZXItPmF0ZS5ITGVuICsgMjgpOwotCi0JCWlmIChwQWRhcHRlci0+YXRlLlBMZW4gPiAzMikKLQkJewotCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQWRhcHRlci0+YXRlLlBMZW4gPiAzMlxuIikpOwotCQkJZXJyID0gNDsKLQkJCWdvdG8gVFhfU1RBUlRfRVJST1I7Ci0JCX0KLQotCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5QYXR0ZXJuLCBwUmFDZmctPmRhdGEgKyAyNiArIHBBZGFwdGVyLT5hdGUuSExlbiwgcEFkYXB0ZXItPmF0ZS5QTGVuKTsKLQkJcEFkYXB0ZXItPmF0ZS5ETGVuID0gcEFkYXB0ZXItPmF0ZS5UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudCAtIHBBZGFwdGVyLT5hdGUuSExlbjsKLQl9Ci0KLQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IyMiwgJkJicDIyVmFsdWUpOwotCi0Jc3dpdGNoIChCYnAyMlZhbHVlKQotCXsKLQkJY2FzZSBCQlAyMl9UWEZSQU1FOgotCQkJewotCQkJCWlmIChwQWRhcHRlci0+YXRlLlR4Q291bnQgPT0gMCkKLQkJCQl7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCQkJCXBBZGFwdGVyLT5hdGUuVHhDb3VudCA9IDB4RkZGRkZGRkY7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCQkJfQotCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBUlQgVFhGUkFNRVxuIikpOwotCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7Ci0JCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhGUkFNRSIpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBCQlAyMl9UWENPTlRfT1JfQ0FSUlNVUFA6Ci0JCQl7Ci0JCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQlAyMl9UWENPTlRfT1JfQ0FSUlNVUFBcbiIpKTsKLQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IyNCwgJkJicDI0VmFsdWUpOwotCi0JCQkJc3dpdGNoIChCYnAyNFZhbHVlKQotCQkJCXsKLQkJCQkJY2FzZSBCQlAyNF9UWENPTlQ6Ci0JCQkJCQl7Ci0JCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEFSVCBUWENPTlRcbiIpKTsKLQkJCQkJCQlwQWRhcHRlci0+YXRlLmJRQVR4U3RhcnQgPSBUUlVFOwotCQkJCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYQ09OVCIpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJY2FzZSBCQlAyNF9DQVJSU1VQUDoKLQkJCQkJCXsKLQkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVJUIFRYQ0FSUlNVUFBcbiIpKTsKLQkJCQkJCQlwQWRhcHRlci0+YXRlLmJRQVR4U3RhcnQgPSBUUlVFOwotCQkJCQkJCXBBZGFwdGVyLT5hdGUuTW9kZSB8PSBBVEVfVFhDQVJSU1VQUDsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCi0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQl7Ci0JCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJVbmtub3duIFRYIHN1YnR5cGUgISIpKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQkJQMjJfVFhDQVJSOgotCQkJewotCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBUlQgVFhDQVJSXG4iKSk7Ci0JCQkJcEFkYXB0ZXItPmF0ZS5iUUFUeFN0YXJ0ID0gVFJVRTsKLQkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWENBUlIiKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQl7Ci0JCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJVbmtub3duIFN0YXJ0IFRYIHN1YnR5cGUgISIpKTsKLQkJCX0KLQkJCWJyZWFrOwotCX0KLQotCWlmIChwQWRhcHRlci0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKLQl7Ci0JCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotCX0KLQotVFhfU1RBUlRfRVJST1I6Ci0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBlcnIpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfR0VUX1RYX1NUQVRVUygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVUlOVDMyIGNvdW50PTA7Ci0KLQljb3VudCA9IGh0b25sKHBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQpOwotCU5kaXNNb3ZlTWVtb3J5KHBSYUNmZy0+ZGF0YSwgJmNvdW50LCA0KTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSs0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9UWF9TVE9QKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9UWF9TVE9QXG4iKSk7Ci0KLQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWFNUT1AiKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfUlhfU1RBUlQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX1JYX1NUQVJUXG4iKSk7Ci0KLQlwQWRhcHRlci0+YXRlLmJRQVJ4U3RhcnQgPSBUUlVFOwotCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlJYRlJBTUUiKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfUlhfU1RPUCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfUlhfU1RPUFxuIikpOwotCi0JU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiUlhTVE9QIik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUlxuIikpOwotCi0JU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhDQVJSIik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVFxuIikpOwotCi0JU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhDT05UIik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9GUkFNRSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FXG4iKSk7Ci0KLQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWEZSQU1FIik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfQlcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVNIT1JUICAgIHZhbHVlID0gMDsKLQlTVFJJTkcgICAgc3RyW0xFTl9PRl9BUkddOwotCi0JTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQldcbiIpKTsKLQotCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7Ci0JdmFsdWUgPSBudG9ocyh2YWx1ZSk7Ci0Jc3ByaW50ZigoY2hhciAqKXN0ciwgIiVkIiwgdmFsdWUpOwotCi0JU2V0X0FURV9UWF9CV19Qcm9jKHBBZGFwdGVyLCBzdHIpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JU0hPUlQgICAgdmFsdWUgPSAwOwotCVNUUklORyAgICBzdHJbTEVOX09GX0FSR107Ci0KLQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjBcbiIpKTsKLQotCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7Ci0JdmFsdWUgPSBudG9ocyh2YWx1ZSk7Ci0Jc3ByaW50ZigoY2hhciAqKXN0ciwgIiVkIiwgdmFsdWUpOwotCVNldF9BVEVfVFhfUE9XRVIwX1Byb2MocEFkYXB0ZXIsIHN0cik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlTSE9SVCAgICB2YWx1ZSA9IDA7Ci0JU1RSSU5HICAgIHN0cltMRU5fT0ZfQVJHXTsKLQotCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMVxuIikpOwotCi0JbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKLQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKLQlzcHJpbnRmKChjaGFyICopc3RyLCAiJWQiLCB2YWx1ZSk7Ci0JU2V0X0FURV9UWF9QT1dFUjFfUHJvYyhwQWRhcHRlciwgc3RyKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JU0hPUlQgICAgdmFsdWUgPSAwOwotCVNUUklORyAgICBzdHJbTEVOX09GX0FSR107Ci0KLQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVFxuIikpOwotCi0JbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKLQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKLQlzcHJpbnRmKChjaGFyICopc3RyLCAiJWQiLCB2YWx1ZSk7Ci0JU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2MocEFkYXB0ZXIsIHN0cik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9HRVRfU1RBVElTVElDUygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTXG4iKSk7Ci0KLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzBdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCwgNCk7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC51Lkxvd1BhcnQsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbOF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LnUuTG93UGFydCwgNCk7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsxMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC51Lkxvd1BhcnQsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMTZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNGYWlsdXJlQ291bnQudS5Mb3dQYXJ0LCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzIwXSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0LCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzI0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC51Lkxvd1BhcnQsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyLCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzMyXSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC51Lkxvd1BhcnQsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMzZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250LCA0KTsKLQotCWlmIChwQWRhcHRlci0+YXRlLlJ4QW50ZW5uYVNlbCA9PSAwKQotCXsKLQkJSU5UMzIgUlNTSTAgPSAwOwotCQlJTlQzMiBSU1NJMSA9IDA7Ci0JCUlOVDMyIFJTU0kyID0gMDsKLQotCQlSU1NJMCA9IChJTlQzMikocEFkYXB0ZXItPmF0ZS5MYXN0UnNzaTAgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGEpOwotCQlSU1NJMSA9IChJTlQzMikocEFkYXB0ZXItPmF0ZS5MYXN0UnNzaTEgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGEpOwotCQlSU1NJMiA9IChJTlQzMikocEFkYXB0ZXItPmF0ZS5MYXN0UnNzaTIgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGEpOwotCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQwXSwgKFVDSEFSICopJlJTU0kwLCA0KTsKLQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0NF0sIChVQ0hBUiAqKSZSU1NJMSwgNCk7Ci0JCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDhdLCAoVUNIQVIgKikmUlNTSTIsIDQpOwotCQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cykrNTIsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCX0KLQllbHNlCi0JewotCQlJTlQzMiBSU1NJMCA9IDA7Ci0KLQkJUlNTSTAgPSAoSU5UMzIpKHBBZGFwdGVyLT5hdGUuTGFzdFJzc2kwIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhKTsKLQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0MF0sIChVQ0hBUiAqKSZSU1NJMCwgNCk7Ci0JCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSs0NCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JfQotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlTSE9SVCAgICB2YWx1ZSA9IDE7Ci0JU1RSSU5HICAgIHN0cltMRU5fT0ZfQVJHXTsKLQotCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfUkVTRVRfQ09VTlRFUlxuIikpOwotCi0Jc3ByaW50ZigoY2hhciAqKXN0ciwgIiVkIiwgdmFsdWUpOwotCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2MocEFkYXB0ZXIsIHN0cik7Ci0KLQlwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50ID0gMDsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFTF9UWF9BTlRFTk5BKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlTSE9SVCAgICB2YWx1ZSA9IDA7Ci0JU1RSSU5HICAgIHN0cltMRU5fT0ZfQVJHXTsKLQotCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkFcbiIpKTsKLQotCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7Ci0JdmFsdWUgPSBudG9ocyh2YWx1ZSk7Ci0Jc3ByaW50ZigoY2hhciAqKXN0ciwgIiVkIiwgdmFsdWUpOwotCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jKHBBZGFwdGVyLCBzdHIpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkEoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVNIT1JUICAgIHZhbHVlID0gMDsKLQlTVFJJTkcgICAgc3RyW0xFTl9PRl9BUkddOwotCi0JTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRUxfUlhfQU5URU5OQVxuIikpOwotCi0JbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKLQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKLQlzcHJpbnRmKChjaGFyICopc3RyLCAiJWQiLCB2YWx1ZSk7Ci0JU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MocEFkYXB0ZXIsIHN0cik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVNIT1JUICAgIHZhbHVlID0gMDsKLQlTVFJJTkcgICAgc3RyW0xFTl9PRl9BUkddOwotCi0JTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEVcbiIpKTsKLQotCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7Ci0JdmFsdWUgPSBudG9ocyh2YWx1ZSk7Ci0Jc3ByaW50ZigoY2hhciAqKXN0ciwgIiVkIiwgdmFsdWUpOwotCVNldF9BVEVfVFhfTU9ERV9Qcm9jKHBBZGFwdGVyLCBzdHIpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX0NIQU5ORUwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVNIT1JUICAgIHZhbHVlID0gMDsKLQlTVFJJTkcgICAgc3RyW0xFTl9PRl9BUkddOwotCi0JTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTFxuIikpOwotCi0JbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKLQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKLQlzcHJpbnRmKChjaGFyICopc3RyLCAiJWQiLCB2YWx1ZSk7Ci0JU2V0X0FURV9DSEFOTkVMX1Byb2MocEFkYXB0ZXIsIHN0cik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfQUREUjEoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQUREUjFcbiIpKTsKLQotCS8qCi0JCUFkZHIgaXMgYW4gYXJyYXkgb2YgVUNIQVIsCi0JCXNvIG5vIG5lZWQgdG8gcGVyZm9ybSBlbmRpYW4gc3dhcC4KLQkqLwotCW1lbWNweShwQWRhcHRlci0+YXRlLkFkZHIxLCAoUFVDSEFSKShwUmFDZmctPmRhdGEgLSAyKSwgTUFDX0FERFJfTEVOKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9BRERSMigKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9BRERSMlxuIikpOwotCi0JLyoKLQkJQWRkciBpcyBhbiBhcnJheSBvZiBVQ0hBUiwKLQkJc28gbm8gbmVlZCB0byBwZXJmb3JtIGVuZGlhbiBzd2FwLgotCSovCi0JbWVtY3B5KHBBZGFwdGVyLT5hdGUuQWRkcjIsIChQVUNIQVIpKHBSYUNmZy0+ZGF0YSAtIDIpLCBNQUNfQUREUl9MRU4pOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzXG4iKSk7Ci0KLQkvKgotCQlBZGRyIGlzIGFuIGFycmF5IG9mIFVDSEFSLAotCQlzbyBubyBuZWVkIHRvIHBlcmZvcm0gZW5kaWFuIHN3YXAuCi0JKi8KLQltZW1jcHkocEFkYXB0ZXItPmF0ZS5BZGRyMywgKFBVQ0hBUikocFJhQ2ZnLT5kYXRhIC0gMiksIE1BQ19BRERSX0xFTik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfUkFURSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JU0hPUlQgICAgdmFsdWUgPSAwOwotCVNUUklORyAgICBzdHJbTEVOX09GX0FSR107Ci0KLQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9SQVRFXG4iKSk7Ci0KLQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOwotCXZhbHVlID0gbnRvaHModmFsdWUpOwotCXNwcmludGYoKGNoYXIgKilzdHIsICIlZCIsIHZhbHVlKTsKLQlTZXRfQVRFX1RYX01DU19Qcm9jKHBBZGFwdGVyLCBzdHIpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTigKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JU0hPUlQgICAgdmFsdWUgPSAwOwotCVNUUklORyAgICBzdHJbTEVOX09GX0FSR107Ci0KLQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU5cbiIpKTsKLQotCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7Ci0JdmFsdWUgPSBudG9ocyh2YWx1ZSk7Ci0Jc3ByaW50ZigoY2hhciAqKXN0ciwgIiVkIiwgdmFsdWUpOwotCVNldF9BVEVfVFhfTEVOR1RIX1Byb2MocEFkYXB0ZXIsIHN0cik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfQ09VTlQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVVTSE9SVCAgICB2YWx1ZSA9IDA7Ci0JU1RSSU5HICAgIHN0cltMRU5fT0ZfQVJHXTsKLQotCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UXG4iKSk7Ci0KLQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOwotCXZhbHVlID0gbnRvaHModmFsdWUpOwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JLyogVFhfRlJBTUVfQ09VTlQgPT0gMCBtZWFucyB0eCBpbmZpbml0ZWx5ICovCi0JaWYgKHZhbHVlID09IDApCi0JewotCQkvKiBVc2UgVHhDb3VudCA9IDB4RkZGRkZGRkYgdG8gYXBwcm94aW1hdGUgdGhlIGluZmluaXR5LiAqLwotCQlwQWRhcHRlci0+YXRlLlR4Q291bnQgPSAweEZGRkZGRkZGOwotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0NPVU5UX1Byb2MgKFR4Q291bnQgPSAlZClcbiIsIHBBZGFwdGVyLT5hdGUuVHhDb3VudCkpOwotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfQ09VTlRfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQotCX0KLQllbHNlCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JewotCQlzcHJpbnRmKChjaGFyICopc3RyLCAiJWQiLCB2YWx1ZSk7Ci0JCVNldF9BVEVfVFhfQ09VTlRfUHJvYyhwQWRhcHRlciwgc3RyKTsKLQl9Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TVEFSVF9SWF9GUkFNRSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfUlhfU1RBUlRcbiIpKTsKLQotCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlJYRlJBTUUiKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX0UyUFJPTV9SRUFEX0JVTEsoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVVTSE9SVCBvZmZzZXQ7Ci0JVVNIT1JUIGxlbjsKLQlVU0hPUlQgYnVmZmVyW0VFUFJPTV9TSVpFLzJdOwotCi0Jb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOwotCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOwotCWxlbiA9IG50b2hzKGxlbik7Ci0KLQlydF9lZV9yZWFkX2FsbChwQWRhcHRlciwgKFVTSE9SVCAqKWJ1ZmZlcik7Ci0KLQlpZiAob2Zmc2V0ICsgbGVuIDw9IEVFUFJPTV9TSVpFKQotCQltZW1jcHlfZXhzKHBBZGFwdGVyLCBwUmFDZmctPmRhdGEsIChVQ0hBUiAqKWJ1ZmZlcitvZmZzZXQsIGxlbik7Ci0JZWxzZQotCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJleGNlZWQgRUVQUk9NIHNpemVcbiIpKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKStsZW4sIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9FMlBST01fV1JJVEVfQlVMSygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVVNIT1JUIG9mZnNldDsKLQlVU0hPUlQgbGVuOwotCVVTSE9SVCBidWZmZXJbRUVQUk9NX1NJWkUvMl07Ci0KLQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7Ci0JbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7Ci0JbGVuID0gbnRvaHMobGVuKTsKLQotCXJ0X2VlX3JlYWRfYWxsKHBBZGFwdGVyLChVU0hPUlQgKilidWZmZXIpOwotCW1lbWNweV9leHMocEFkYXB0ZXIsIChVQ0hBUiAqKWJ1ZmZlciArIG9mZnNldCwgKFVDSEFSICopcFJhQ2ZnLT5kYXRhICsgMiwgbGVuKTsKLQlydF9lZV93cml0ZV9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVSU5UMzIgb2Zmc2V0LCBpLCB2YWx1ZTsKLQlVU0hPUlQgbGVuOwotCi0JbWVtY3B5KCZvZmZzZXQsICZwUmFDZmctPnN0YXR1cywgNCk7Ci0Jb2Zmc2V0ID0gbnRvaGwob2Zmc2V0KTsKLQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhKzIsIDIpOwotCWxlbiA9IG50b2hzKGxlbik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpCi0JewotCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAoVUNIQVIgKikmdmFsdWUsIHBSYUNmZy0+ZGF0YSs0K2ksIDQpOwotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIldyaXRlICV4ICV4XG4iLCBvZmZzZXQgKyBpLCB2YWx1ZSkpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsICgob2Zmc2V0K2kpICYgKDB4ZmZmZikpLCB2YWx1ZSk7Ci0JfQotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfQkJQX1JFQURfQlVMSygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVVNIT1JUIG9mZnNldDsKLQlVU0hPUlQgbGVuOwotCVVTSE9SVCBqOwotCi0Jb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOwotCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOwotCWxlbiA9IG50b2hzKGxlbik7Ci0KLQlmb3IgKGogPSBvZmZzZXQ7IGogPCAob2Zmc2V0K2xlbik7IGorKykKLQl7Ci0JCXBSYUNmZy0+ZGF0YVtqIC0gb2Zmc2V0XSA9IDA7Ci0KLQkJaWYgKHBBZGFwdGVyLT5hdGUuTW9kZSA9PSBBVEVfU1RPUCkKLQkJewotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAmcFJhQ2ZnLT5kYXRhW2ogLSBvZmZzZXRdKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAmcFJhQ2ZnLT5kYXRhW2ogLSBvZmZzZXRdKTsKLQkJfQotCX0KLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKStsZW4sIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMSygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVVNIT1JUIG9mZnNldDsKLQlVU0hPUlQgbGVuOwotCVVTSE9SVCBqOwotCVVDSEFSICp2YWx1ZTsKLQotCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKLQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhLCAyKTsKLQlsZW4gPSBudG9ocyhsZW4pOwotCi0JZm9yIChqID0gb2Zmc2V0OyBqIDwgKG9mZnNldCtsZW4pOyBqKyspCi0JewotCQl2YWx1ZSA9IHBSYUNmZy0+ZGF0YSArIDIgKyAoaiAtIG9mZnNldCk7Ci0JCWlmIChwQWRhcHRlci0+YXRlLk1vZGUgPT0gQVRFX1NUT1ApCi0JCXsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGosICAqdmFsdWUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAgKnZhbHVlKTsKLQkJfQotCX0KLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLSNlbmRpZgkvLyBSQUxJTktfQVRFIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2F0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9hdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhkNTk2MS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2F0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19BVEVfSF9fCi0jZGVmaW5lIF9fQVRFX0hfXwotCi0KLSNpZmRlZiBMSU5VWAotI2RlZmluZSBhdGVfcHJpbnQgcHJpbnRrCi0jZGVmaW5lIEFURURCR1BSSU5UIERCR1BSSU5UCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0jZGVmaW5lIEVFUFJPTV9TSVpFCQkJCQkJCQkweDIwMAotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2RlZmluZSBFRVBST01fQklOX0ZJTEVfTkFNRSAgIi9ldGMvV2lyZWxlc3MvUlQyODYwU1RBL2UycC5iaW4iCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0jZW5kaWYgLy8gTElOVVggLy8KLQotCi0jZGVmaW5lIEFURV9PTihfcCkgICAgICAgICAgICAgICgoKF9wKS0+YXRlLk1vZGUpICE9IEFURV9TVE9QKQotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0jZGVmaW5lIEFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKSAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQkJQX0NTUl9DRkdfU1RSVUMgIEJicENzcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgICAgICAgICAgICAgaiwgazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoaj0wOyBqPE1BWF9CVVNZX0NPVU5UOyBqKyspICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgUlRNUF9JT19SRUFEMzIoX0EsIEJCUF9DU1JfQ0ZHLCAmQmJwQ3NyLndvcmQpOyAgICAgXAotICAgICAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLmZSZWFkID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBSVE1QX0lPX1dSSVRFMzIoX0EsIEJCUF9DU1JfQ0ZHLCBCYnBDc3Iud29yZCk7ICAgICBcCi0gICAgICAgIGZvciAoaz0wOyBrPE1BWF9CVVNZX0NPVU5UOyBrKyspICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIoX0EsIEJCUF9DU1JfQ0ZHLCAmQmJwQ3NyLndvcmQpOyBcCi0gICAgICAgICAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICgoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgJiYgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIChCYnBDc3IuZmllbGQuUmVnTnVtID09IF9JKSkgICAgICAgICAgICAgICAgXAotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAqKF9wVikgPSAoVUNIQVIpQmJwQ3NyLmZpZWxkLlZhbHVlOyAgICAgICAgIFwKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkJCUCByZWFkIFIlZCBmYWlsXG4iLCBfSSkpOyAgICAgIFwKLSAgICAgICAgKihfcFYpID0gKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV07ICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCAgICAgICAgICAgICBCdXN5Q250OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChCdXN5Q250PTA7IEJ1c3lDbnQ8TUFYX0JVU1lfQ09VTlQ7IEJ1c3lDbnQrKykgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7ICAgICBcCi0gICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3Iud29yZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5mUmVhZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuQnVzeSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5WYWx1ZSA9IF9WOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBSVE1QX0lPX1dSSVRFMzIoX0EsIEJCUF9DU1JfQ0ZHLCBCYnBDc3Iud29yZCk7ICAgICBcCi0gICAgICAgIChfQSktPkJicFdyaXRlTGF0Y2hbX0ldID0gX1Y7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKEJ1c3lDbnQgPT0gTUFYX0JVU1lfQ09VTlQpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJCQlAgd3JpdGUgUiVkIGZhaWxcbiIsIF9JKSk7ICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0jaWZkZWYgUlQzMHh4Ci0jZGVmaW5lIEFURV9SRl9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgICBSVE1QX1JGX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikKLSNkZWZpbmUgQVRFX1JGX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICAgIFJUTVBfUkZfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9WKQotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0KLVZPSUQgcnRfZWVfcmVhZF9hbGwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JT1VUIFVTSE9SVCAqRGF0YSk7Ci0KLVZPSUQgcnRfZWVfd3JpdGVfYWxsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVU0hPUlQgKkRhdGEpOwotCi1JTlQgU2V0X0FURV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0FURV9EQV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0FURV9TQV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0FURV9CU1NJRF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0FURV9DSEFOTkVMX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0FURV9UWF9QT1dFUjFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9BVEVfVFhfQldfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9BVEVfVFhfTEVOR1RIX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQVRFX1RYX0NPVU5UX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQVRFX1RYX01DU19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0FURV9UWF9NT0RFX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQVRFX1RYX0dJX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLQotSU5UCVNldF9BVEVfUlhfRkVSX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfQVRFX1JlYWRfUkZfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9BVEVfV3JpdGVfUkYxX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfQVRFX1dyaXRlX1JGMl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X0FURV9Xcml0ZV9SRjNfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9BVEVfV3JpdGVfUkY0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfQVRFX0xvYWRfRTJQX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfQVRFX1JlYWRfRTJQX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLQotSU5UCVNldF9BVEVfU2hvd19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0FURV9IZWxwX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotVk9JRCBBVEVfUUFfU3RhdGlzdGljcygKLQlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gUFJYV0lfU1RSVUMJCQlwUnhXSSwKLQlJTiBQUlQyOFhYX1JYRF9TVFJVQyAgICBwMjh4eFJ4RCwKLQlJTiBQSEVBREVSXzgwMl8xMQkJcEhlYWRlcik7Ci0KLVZPSUQgUnRtcERvQXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEpOwotCi1WT0lEIEJ1YmJsZVNvcnQoCi0JSU4gIElOVDMyIG4sCi0JSU4gIElOVDMyIGFbXSk7Ci0KLVZPSUQgQ2FsTm9pc2VMZXZlbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotCUlOICBVQ0hBUiAgICAgICAgICAgY2hhbm5lbCwKLQlPVVQgSU5UMzIgICAgICAgICAgIGJ1ZmZlclszXVsxMF0pOwotCi1CT09MRUFOIFN5bmNUeFJ4Q29uZmlnKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4JVVNIT1JUCQkJb2Zmc2V0LAotCUlOCVVDSEFSCQkJdmFsdWUpOwotCi1JTlQgU2V0X1R4U3RvcF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X1J4U3RvcF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi0jaWZkZWYgREJHCi1JTlQgU2V0X0VFUmVhZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X0VFV3JpdGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9CQlBSZWFkX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfQkJQV3JpdGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9SRldyaXRlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0jZW5kaWYgLy8gREJHIC8vCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLQotCi1WT0lEIEFURUFzaWNTd2l0Y2hDaGFubmVsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBBVEVBc2ljQWRqdXN0VHhQb3dlcigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgQVRFRGlzYWJsZUFzaWNQcm90ZWN0KAotCUlOCQlQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLUNIQVIgQVRFQ29udmVydFRvUnNzaSgKLQlJTiBQUlRNUF9BREFQVEVSICBwQWQsCi0JSU4gQ0hBUgkJCQlSc3NpLAotCUlOIFVDSEFSICAgIFJzc2lOdW1iZXIpOwotCi1WT0lEIEFURVNhbXBsZVJzc2koCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUFJYV0lfU1RSVUMJCXBSeFdJKTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1WT0lEIFJUTVBTdGF0aW9uU3RvcCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgUlRNUFN0YXRpb25TdGFydCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gX19BVEVfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2NvbmZpZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9jb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1MTQyZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JcnRfY29uZmlnLmgKLQotCUFic3RyYWN0OgotCUNlbnRyYWwgaGVhZGVyIGZpbGUgdG8gbWFpbnRhaW4gYWxsIGluY2x1ZGUgZmlsZXMgZm9yIGFsbCBORElTCi0JbWluaXBvcnQgZHJpdmVyIHJvdXRpbmVzLgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLQktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlQYXVsIExpbiAgICAwOC0wMS0yMDAyICAgIGNyZWF0ZWQKLQotKi8KLSNpZm5kZWYJX19SVF9DT05GSUdfSF9fCi0jZGVmaW5lCV9fUlRfQ09ORklHX0hfXwotCi0jaW5jbHVkZSAicnRtcF90eXBlLmgiCi0jaW5jbHVkZSAicnRtcF9vcy5oIgotCi0jaW5jbHVkZSAicnRtcF9kZWYuaCIKLSNpbmNsdWRlICJydG1wX2NoaXAuaCIKLSNpbmNsdWRlICJydG1wX3RpbWVyLmgiCi0KLSNpbmNsdWRlICJvaWQuaCIKLSNpbmNsdWRlICJtbG1lLmgiCi0jaW5jbHVkZSAid3BhLmgiCi0jaW5jbHVkZSAiY3J5cHRfbWQ1LmgiCi0jaW5jbHVkZSAiY3J5cHRfc2hhMi5oIgotI2luY2x1ZGUgImNyeXB0X2htYWMuaCIKLSNpbmNsdWRlICJydG1wLmgiCi0jaW5jbHVkZSAiYXAuaCIKLSNpbmNsdWRlICJkZnMuaCIKLSNpbmNsdWRlICJjaGxpc3QuaCIKLSNpbmNsdWRlICJzcGVjdHJ1bS5oIgotCi0jaWZkZWYgTUxNRV9FWAotI2luY2x1ZGUJIm1sbWVfZXhfZGVmLmgiCi0jaW5jbHVkZQkibWxtZV9leC5oIgotI2VuZGlmIC8vIE1MTUVfRVggLy8KLQotI2luY2x1ZGUgImVlcHJvbS5oIgotI2lmIGRlZmluZWQoUlRNUF9QQ0lfU1VQUE9SVCkgfHwgZGVmaW5lZChSVE1QX1VTQl9TVVBQT1JUKQotI2luY2x1ZGUgInJ0bXBfbWN1LmgiCi0jZW5kaWYKLQotCi0KLSN1bmRlZiBBUF9XU0NfSU5DTFVERUQKLSN1bmRlZiBTVEFfV1NDX0lOQ0xVREVECi0jdW5kZWYgV1NDX0lOQ0xVREVECi0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBCTE9DS19ORVRfSUYKLSNpbmNsdWRlICJuZXRpZl9ibG9jay5oIgotI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLwotCi0jaWZkZWYgSUdNUF9TTk9PUF9TVVBQT1JUCi0jaW5jbHVkZSAiaWdtcF9zbm9vcC5oIgotI2VuZGlmIC8vIElHTVBfU05PT1BfU1VQUE9SVCAvLwotCi0jaWZkZWYgUkFMSU5LX0FURQotI2luY2x1ZGUgInJ0X2F0ZS5oIgotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0jaWZuZGVmIFJBTElOS19BVEUKLSNlcnJvciAiRm9yIHN1cHBvcnRpbmcgUUEgR1VJLCBwbGVhc2Ugc2V0IEhBU19BVEU9eSBhbmQgSEFTXzI4eHhfUUE9eS4iCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0KLQotCi0KLSNpZiBkZWZpbmVkKEFQX1dTQ19JTkNMVURFRCkgfHwgZGVmaW5lZChTVEFfV1NDX0lOQ0xVREVEKQotI2RlZmluZSBXU0NfSU5DTFVERUQKLSNlbmRpZgotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmbmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0jZXJyb3IgIkJ1aWxkIGZvciBiZWluZyBjb250cm9sbGVkIGJ5IE5ldHdvcmtNYW5hZ2VyIG9yIHdleHQsIHBsZWFzZSBzZXQgSEFTX1dQQV9TVVBQTElDQU5UPXkgYW5kIEhBU19OQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVD15IgotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCi0jaWZkZWYgSUtBTk9TX1ZYXzFYMAotI2luY2x1ZGUgInZyX2lrYW5zLmgiCi0jZW5kaWYgLy8gSUtBTk9TX1ZYXzFYMCAvLwotCi0KLQotI2VuZGlmCS8vIF9fUlRfQ09ORklHX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9saW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjk0YWE2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDE2MjQgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSAicnRfY29uZmlnLmgiCi0KLVVMT05HCVJURGVidWdMZXZlbCA9IFJUX0RFQlVHX0VSUk9SOwotCi0KLS8vIGZvciB3aXJlbGVzcyBzeXN0ZW0gZXZlbnQgbWVzc2FnZQotY2hhciBjb25zdCAqcFdpcmVsZXNzU3lzRXZlbnRUZXh0W0lXX1NZU19FVkVOVF9UWVBFX05VTV0gPSB7Ci0JLy8gc3lzdGVtIHN0YXR1cyBldmVudAotICAgICJoYWQgYXNzb2NpYXRlZCBzdWNjZXNzZnVsbHkiLAkJCQkJCQkvKiBJV19BU1NPQ19FVkVOVF9GTEFHICovCi0gICAgImhhZCBkaXNhc3NvY2lhdGVkIiwJCQkJCQkJCQkvKiBJV19ESVNBU1NPQ19FVkVOVF9GTEFHICovCi0gICAgImhhZCBkZWF1dGhlbnRpY2F0ZWQiLAkJCQkJCQkJCS8qIElXX0RFQVVUSF9FVkVOVF9GTEFHICovCi0gICAgImhhZCBiZWVuIGFnZWQtb3V0IGFuZCBkaXNhc3NvY2lhdGVkIiwJCQkJCS8qIElXX0FHRU9VVF9FVkVOVF9GTEFHICovCi0gICAgIm9jY3VycmVkIENvdW50ZXJNZWFzdXJlcyBhdHRhY2siLAkJCQkJCS8qIElXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRyAqLwotICAgICJvY2N1cnJlZCByZXBsYXkgY291bnRlciBkaWZmZXJlbnQgaW4gS2V5IEhhbmRzaGFraW5nIiwJLyogSVdfUkVQTEFZX0NPVU5URVJfRElGRl9FVkVOVF9GTEFHICovCi0gICAgIm9jY3VycmVkIFJTTklFIGRpZmZlcmVudCBpbiBLZXkgSGFuZHNoYWtpbmciLAkJCS8qIElXX1JTTklFX0RJRkZfRVZFTlRfRkxBRyAqLwotICAgICJvY2N1cnJlZCBNSUMgZGlmZmVyZW50IGluIEtleSBIYW5kc2hha2luZyIsCQkJLyogSVdfTUlDX0RJRkZfRVZFTlRfRkxBRyAqLwotICAgICJvY2N1cnJlZCBJQ1YgZXJyb3IgaW4gUlgiLAkJCQkJCQkJLyogSVdfSUNWX0VSUk9SX0VWRU5UX0ZMQUcgKi8KLSAgICAib2NjdXJyZWQgTUlDIGVycm9yIGluIFJYIiwJCQkJCQkJCS8qIElXX01JQ19FUlJPUl9FVkVOVF9GTEFHICovCi0JIkdyb3VwIEtleSBIYW5kc2hha2luZyB0aW1lb3V0IiwJCQkJCQkvKiBJV19HUk9VUF9IU19USU1FT1VUX0VWRU5UX0ZMQUcgKi8KLQkiUGFpcndpc2UgS2V5IEhhbmRzaGFraW5nIHRpbWVvdXQiLAkJCQkJCS8qIElXX1BBSVJXSVNFX0hTX1RJTUVPVVRfRVZFTlRfRkxBRyAqLwotCSJSU04gSUUgc2FuaXR5IGNoZWNrIGZhaWx1cmUiLAkJCQkJCQkvKiBJV19SU05JRV9TQU5JVFlfRkFJTF9FVkVOVF9GTEFHICovCi0JInNldCBrZXkgZG9uZSBpbiBXUEEvV1BBUFNLIiwJCQkJCQkJLyogSVdfU0VUX0tFWV9ET05FX1dQQTFfRVZFTlRfRkxBRyAqLwotCSJzZXQga2V5IGRvbmUgaW4gV1BBMi9XUEEyUFNLIiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRyAqLwotCSJjb25uZWN0cyB3aXRoIG91ciB3aXJlbGVzcyBjbGllbnQiLCAgICAgICAgICAgICAgICAgICAgLyogSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHICovCi0JImRpc2Nvbm5lY3RzIHdpdGggb3VyIHdpcmVsZXNzIGNsaWVudCIsICAgICAgICAgICAgICAgICAvKiBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRyAqLwotCSJzY2FuIGNvbXBsZXRlZCIJCQkJCQkJCQkJLyogSVdfU0NBTl9DT01QTEVURURfRVZFTlRfRkxBRyAqLwotCSJzY2FuIHRlcm1pbmF0ZSEhIEJ1c3khISBFbnF1ZXVlIGZhaWwhISIJCQkJLyogSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRyAqLwotCX07Ci0KLS8vIGZvciB3aXJlbGVzcyBJRFNfc3Bvb2ZfYXR0YWNrIGV2ZW50IG1lc3NhZ2UKLWNoYXIgY29uc3QgKnBXaXJlbGVzc1Nwb29mRXZlbnRUZXh0W0lXX1NQT09GX0VWRU5UX1RZUEVfTlVNXSA9IHsKLSAgICAiZGV0ZWN0ZWQgY29uZmxpY3QgU1NJRCIsCQkJCQkJCQkvKiBJV19DT05GTElDVF9TU0lEX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBhc3NvY2lhdGlvbiByZXNwb25zZSIsCQkJCS8qIElXX1NQT09GX0FTU09DX1JFU1BfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBzcG9vZmVkIHJlYXNzb2NpYXRpb24gcmVzcG9uc2VzIiwJCQkJLyogSVdfU1BPT0ZfUkVBU1NPQ19SRVNQX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBwcm9iZSByZXNwb25zZSIsCQkJCQkJLyogSVdfU1BPT0ZfUFJPQkVfUkVTUF9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIHNwb29mZWQgYmVhY29uIiwJCQkJCQkJCS8qIElXX1NQT09GX0JFQUNPTl9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIHNwb29mZWQgZGlzYXNzb2NpYXRpb24iLAkJCQkJCS8qIElXX1NQT09GX0RJU0FTU09DX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBhdXRoZW50aWNhdGlvbiIsCQkJCQkJLyogSVdfU1BPT0ZfQVVUSF9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIHNwb29mZWQgZGVhdXRoZW50aWNhdGlvbiIsCQkJCQkvKiBJV19TUE9PRl9ERUFVVEhfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBzcG9vZmVkIHVua25vd24gbWFuYWdlbWVudCBmcmFtZSIsCQkJLyogSVdfU1BPT0ZfVU5LTk9XTl9NR01UX0VWRU5UX0ZMQUcgKi8KLQkiZGV0ZWN0ZWQgcmVwbGF5IGF0dGFjayIJCQkJCQkJCS8qIElXX1JFUExBWV9BVFRBQ0tfRVZFTlRfRkxBRyAqLwotCX07Ci0KLS8vIGZvciB3aXJlbGVzcyBJRFNfZmxvb2RpbmdfYXR0YWNrIGV2ZW50IG1lc3NhZ2UKLWNoYXIgY29uc3QgKnBXaXJlbGVzc0Zsb29kRXZlbnRUZXh0W0lXX0ZMT09EX0VWRU5UX1RZUEVfTlVNXSA9IHsKLQkiZGV0ZWN0ZWQgYXV0aGVudGljYXRpb24gZmxvb2RpbmciLAkJCQkJCS8qIElXX0ZMT09EX0FVVEhfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBhc3NvY2lhdGlvbiByZXF1ZXN0IGZsb29kaW5nIiwJCQkJLyogSVdfRkxPT0RfQVNTT0NfUkVRX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgcmVhc3NvY2lhdGlvbiByZXF1ZXN0IGZsb29kaW5nIiwJCQkJLyogSVdfRkxPT0RfUkVBU1NPQ19SRVFfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBwcm9iZSByZXF1ZXN0IGZsb29kaW5nIiwJCQkJCQkvKiBJV19GTE9PRF9QUk9CRV9SRVFfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBkaXNhc3NvY2lhdGlvbiBmbG9vZGluZyIsCQkJCQkJLyogSVdfRkxPT0RfRElTQVNTT0NfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBkZWF1dGhlbnRpY2F0aW9uIGZsb29kaW5nIiwJCQkJCS8qIElXX0ZMT09EX0RFQVVUSF9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIDgwMi4xeCBlYXAtcmVxdWVzdCBmbG9vZGluZyIJCQkJCS8qIElXX0ZMT09EX0VBUF9SRVFfRVZFTlRfRkxBRyAqLwotCX07Ci0KLQotLyogdGltZW91dCAtLSBtcyAqLwotVk9JRCBSVE1QX1NldFBlcmlvZGljVGltZXIoCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUiAqcFRpbWVyLAotCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCkKLXsKLQl0aW1lb3V0ID0gKCh0aW1lb3V0Kk9TX0haKSAvIDEwMDApOwotCXBUaW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0OwotCWFkZF90aW1lcihwVGltZXIpOwotfQotCi0vKiBjb252ZXJ0IE5kaXNNSW5pdGlhbGl6ZVRpbWVyIC0tPiBSVE1QX09TX0luaXRfVGltZXIgKi8KLVZPSUQgUlRNUF9PU19Jbml0X1RpbWVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKLQlJTglUSU1FUl9GVU5DVElPTiBmdW5jdGlvbiwKLQlJTglQVk9JRCBkYXRhKQotewotCWluaXRfdGltZXIocFRpbWVyKTsKLSAgICBwVGltZXItPmRhdGEgPSAodW5zaWduZWQgbG9uZylkYXRhOwotICAgIHBUaW1lci0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKLX0KLQotCi1WT0lEIFJUTVBfT1NfQWRkX1RpbWVyKAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJCSpwVGltZXIsCi0JSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KQotewotCWlmICh0aW1lcl9wZW5kaW5nKHBUaW1lcikpCi0JCXJldHVybjsKLQotCXRpbWVvdXQgPSAoKHRpbWVvdXQqT1NfSFopIC8gMTAwMCk7Ci0JcFRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIHRpbWVvdXQ7Ci0JYWRkX3RpbWVyKHBUaW1lcik7Ci19Ci0KLVZPSUQgUlRNUF9PU19Nb2RfVGltZXIoCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUgkJKnBUaW1lciwKLQlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpCi17Ci0JdGltZW91dCA9ICgodGltZW91dCpPU19IWikgLyAxMDAwKTsKLQltb2RfdGltZXIocFRpbWVyLCBqaWZmaWVzICsgdGltZW91dCk7Ci19Ci0KLVZPSUQgUlRNUF9PU19EZWxfVGltZXIoCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUgkJKnBUaW1lciwKLQlPVVQJQk9PTEVBTgkJCQkJKnBDYW5jZWxsZWQpCi17Ci0JaWYgKHRpbWVyX3BlbmRpbmcocFRpbWVyKSkKLQl7Ci0JCSpwQ2FuY2VsbGVkID0gZGVsX3RpbWVyX3N5bmMocFRpbWVyKTsKLQl9Ci0JZWxzZQotCXsKLQkJKnBDYW5jZWxsZWQgPSBUUlVFOwotCX0KLQotfQotCi1WT0lEIFJUTVBfT1NfUmVsZWFzZV9QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JUFFVRVVFX0VOVFJZICBwRW50cnkpCi17Ci0JLy9SVE1QRnJlZU5kaXNQYWNrZXQocEFkLCAoc3RydWN0IHNrX2J1ZmYgKilwRW50cnkpOwotfQotCi0vLyBVbmlmeSBhbGwgZGVsYXkgcm91dGluZSBieSB1c2luZyB1ZGVsYXkKLVZPSUQgUlRNUHVzZWNEZWxheSgKLQlJTglVTE9ORwl1c2VjKQotewotCVVMT05HCWk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKHVzZWMgLyA1MCk7IGkrKykKLQkJdWRlbGF5KDUwKTsKLQotCWlmICh1c2VjICUgNTApCi0JCXVkZWxheSh1c2VjICUgNTApOwotfQotCi12b2lkIFJUTVBfR2V0Q3VycmVudFN5c3RlbVRpbWUoTEFSR0VfSU5URUdFUiAqdGltZSkKLXsKLQl0aW1lLT51Lkxvd1BhcnQgPSBqaWZmaWVzOwotfQotCi0vLyBwQWQgTVVTVCBhbGxvdyB0byBiZSBOVUxMCi1ORElTX1NUQVRVUyBvc19hbGxvY19tZW0oCi0JSU4JUlRNUF9BREFQVEVSICpwQWQsCi0JT1VUCVVDSEFSICoqbWVtLAotCUlOCVVMT05HICBzaXplKQotewotCSptZW0gPSAoUFVDSEFSKSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwotCWlmICgqbWVtKQotCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCWVsc2UKLQkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKLX0KLQotLy8gcEFkIE1VU1QgYWxsb3cgdG8gYmUgTlVMTAotTkRJU19TVEFUVVMgb3NfZnJlZV9tZW0oCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JUFZPSUQgbWVtKQotewotCi0JQVNTRVJUKG1lbSk7Ci0Ja2ZyZWUobWVtKTsKLQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotfQotCi0KLQotCi1QTkRJU19QQUNLRVQgUnRtcE9TTmV0UGt0QWxsb2MoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gaW50IHNpemUpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQkvKiBBZGQgMiBtb3JlIGJ5dGVzIGZvciBpcCBoZWFkZXIgYWxpZ25tZW50Ki8KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUrMik7Ci0KLQlyZXR1cm4gKChQTkRJU19QQUNLRVQpc2tiKTsKLX0KLQotCi1QTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoKQotewotCXN0cnVjdCBza19idWZmICpwa3Q7Ci0KLQlwa3QgPSBkZXZfYWxsb2Nfc2tiKExlbmd0aCk7Ci0KLQlpZiAocGt0ID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjYW4ndCBhbGxvY2F0ZSBmcmFnIHJ4ICVsZCBzaXplIHBhY2tldFxuIixMZW5ndGgpKTsKLQl9Ci0KLQlpZiAocGt0KQotCXsKLQkJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShPU1BLVF9UT19SVFBLVChwa3QpLCBQS1RTUkNfTkRJUyk7Ci0JfQotCi0JcmV0dXJuIChQTkRJU19QQUNLRVQpIHBrdDsKLX0KLQotCi1QTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZVR4UGFja2V0QnVmZmVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzKQotewotCXN0cnVjdCBza19idWZmICpwa3Q7Ci0KLQlwa3QgPSBkZXZfYWxsb2Nfc2tiKExlbmd0aCk7Ci0KLQlpZiAocGt0ID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjYW4ndCBhbGxvY2F0ZSB0eCAlbGQgc2l6ZSBwYWNrZXRcbiIsTGVuZ3RoKSk7Ci0JfQotCi0JaWYgKHBrdCkKLQl7Ci0JCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOwotCQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpIHBrdC0+ZGF0YTsKLQl9Ci0JZWxzZQotCXsKLQkJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKSBOVUxMOwotCX0KLQotCXJldHVybiAoUE5ESVNfUEFDS0VUKSBwa3Q7Ci19Ci0KLQotVk9JRCBidWlsZF90eF9wYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JUFVDSEFSCXBGcmFtZSwKLQlJTglVTE9ORwlGcmFtZUxlbikKLXsKLQotCXN0cnVjdCBza19idWZmCSpwVHhQa3Q7Ci0KLQlBU1NFUlQocFBhY2tldCk7Ci0JcFR4UGt0ID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCk7Ci0KLQlOZGlzTW92ZU1lbW9yeShza2JfcHV0KHBUeFBrdCwgRnJhbWVMZW4pLCBwRnJhbWUsIEZyYW1lTGVuKTsKLX0KLQotVk9JRAlSVE1QRnJlZUFkYXB0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JUE9TX0NPT0tJRSBvc19jb29raWU7Ci0JaW50IGluZGV4OwotCi0Jb3NfY29va2llPShQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JaWYgKHBBZC0+QmVhY29uQnVmKQotCQlrZnJlZShwQWQtPkJlYWNvbkJ1Zik7Ci0KLQotCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+UnhSaW5nTG9jayk7Ci0jaWZkZWYgUlQzMDkwCi1OZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPk1jdUNtZExvY2spOwotI2VuZGlmIC8vIFJUMzA5MCAvLwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JZm9yIChpbmRleCA9MCA7IGluZGV4IDwgTlVNX09GX1RYX1JJTkc7IGluZGV4KyspCi0JewotCQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPlR4U3dRdWV1ZUxvY2tbaW5kZXhdKTsKLQkJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5EZVF1ZXVlTG9ja1tpbmRleF0pOwotCQlwQWQtPkRlUXVldWVSdW5uaW5nW2luZGV4XSA9IEZBTFNFOwotCX0KLQotCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+aXJxX2xvY2spOwotCi0KLQl2ZnJlZShwQWQpOyAvLyBwY2lfZnJlZV9jb25zaXN0ZW50KG9zX2Nvb2tpZS0+cGNpX2RldixzaXplb2YoUlRNUF9BREFQVEVSKSxwQWQsb3NfY29va2llLT5wQWRfcGEpOwotCWlmIChvc19jb29raWUpCi0JCWtmcmVlKG9zX2Nvb2tpZSk7Ci19Ci0KLUJPT0xFQU4gT1NfTmVlZF9DbG9uZV9QYWNrZXQodm9pZCkKLXsKLQlyZXR1cm4gKEZBTFNFKTsKLX0KLQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQljbG9uZSBhbiBpbnB1dCBORElTIFBBQ0tFVCB0byBhbm90aGVyIG9uZS4gVGhlIG5ldyBpbnRlcm5hbGx5IGNyZWF0ZWQgTkRJUyBQQUNLRVQKLQkJbXVzdCBoYXZlIG9ubHkgb25lIE5ESVMgQlVGRkVSCi0JCXJldHVybiAtIGJ5dGUgY29waWVkLiAwIG1lYW5zIGNhbid0IGNyZWF0ZSBORElTIFBBQ0tFVAotCQlOT1RFOiBpbnRlcm5hbGx5IGNyZWF0ZWQgTkRJU19QQUNLRVQgc2hvdWxkIGJlIGRlc3Ryb3llZCBieSBSVE1QRnJlZU5kaXNQYWNrZXQKLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcEluc0FNU0RVSGRyCUVXQyBBLU1TRFUgZm9ybWF0IGhhcyBleHRyYSAxNC1ieXRlcyBoZWFkZXIuIGlmIFRSVUUsIGluc2VydCB0aGlzIDE0LWJ5dGUgaGRyIGluIGZyb250IG9mIE1TRFUuCi0JCSpwU3JjVG90YWxMZW4JCQlyZXR1cm4gdG90YWwgcGFja2V0IGxlbmd0aC4gVGhpcyBsZW5naHQgaXMgY2FsY3VsYXRlZCB3aXRoIDgwMi4zIGZvcm1hdCBwYWNrZXQuCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX1NVQ0NFU1MKLQkJTkRJU19TVEFUVVNfRkFJTFVSRQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfU1RBVFVTIFJUTVBDbG9uZU5kaXNQYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JQk9PTEVBTgkJCXBJbnNBTVNEVUhkciwKLQlJTglQTkRJU19QQUNLRVQJcEluUGFja2V0LAotCU9VVCBQTkRJU19QQUNLRVQgICAqcHBPdXRQYWNrZXQpCi17Ci0KLQlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwotCi0JQVNTRVJUKHBJblBhY2tldCk7Ci0JQVNTRVJUKHBwT3V0UGFja2V0KTsKLQotCS8vIDEuIEFsbG9jYXRlIGEgcGFja2V0Ci0JcGt0ID0gZGV2X2FsbG9jX3NrYigyMDQ4KTsKLQotCWlmIChwa3QgPT0gTlVMTCkKLQl7Ci0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCXNrYl9wdXQocGt0LCBHRVRfT1NfUEtUX0xFTihwSW5QYWNrZXQpKTsKLQlOZGlzTW92ZU1lbW9yeShwa3QtPmRhdGEsIEdFVF9PU19QS1RfREFUQVBUUihwSW5QYWNrZXQpLCBHRVRfT1NfUEtUX0xFTihwSW5QYWNrZXQpKTsKLQkqcHBPdXRQYWNrZXQgPSBPU1BLVF9UT19SVFBLVChwa3QpOwotCi0KLQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKE9TUEtUX1RPX1JUUEtUKHBrdCksIFBLVFNSQ19ORElTKTsKLQotCXByaW50aygiIyMjQ2xvbmUjIyNcbiIpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotLy8gdGhlIGFsbG9jYXRlZCBORElTIFBBQ0tFVCBtdXN0IGJlIGZyZWVkIHZpYSBSVE1QRnJlZU5kaXNQYWNrZXQoKQotTkRJU19TVEFUVVMgUlRNUEFsbG9jYXRlTmRpc1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQgUE5ESVNfUEFDS0VUICAgKnBwUGFja2V0LAotCUlOCVBVQ0hBUgkJCXBIZWFkZXIsCi0JSU4JVUlOVAkJCUhlYWRlckxlbiwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVSU5UCQkJRGF0YUxlbikKLXsKLQlQTkRJU19QQUNLRVQJcFBhY2tldDsKLQlBU1NFUlQocERhdGEpOwotCUFTU0VSVChEYXRhTGVuKTsKLQotCS8vIDEuIEFsbG9jYXRlIGEgcGFja2V0Ci0JcFBhY2tldCA9IChQTkRJU19QQUNLRVQgKikgZGV2X2FsbG9jX3NrYihIZWFkZXJMZW4gKyBEYXRhTGVuICsgUlRNUF9QS1RfVEFJTF9QQURESU5HKTsKLQlpZiAocFBhY2tldCA9PSBOVUxMKQotCXsKLQkJKnBwUGFja2V0ID0gTlVMTDsKLSNpZmRlZiBERUJVRwotCQlwcmludGsoIlJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQgRmFpbFxuXG4iKTsKLSNlbmRpZgotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQkvLyAyLiBjbG9uZSB0aGUgZnJhbWUgY29udGVudAotCWlmIChIZWFkZXJMZW4gPiAwKQotCQlOZGlzTW92ZU1lbW9yeShHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCksIHBIZWFkZXIsIEhlYWRlckxlbik7Ci0JaWYgKERhdGFMZW4gPiAwKQotCQlOZGlzTW92ZU1lbW9yeShHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCkgKyBIZWFkZXJMZW4sIHBEYXRhLCBEYXRhTGVuKTsKLQotCS8vIDMuIHVwZGF0ZSBsZW5ndGggb2YgcGFja2V0Ci0Jc2tiX3B1dChHRVRfT1NfUEtUX1RZUEUocFBhY2tldCksIEhlYWRlckxlbitEYXRhTGVuKTsKLQotCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFBhY2tldCwgUEtUU1JDX05ESVMpOwotLy8JcHJpbnRrKCIlcyA6IHBQYWNrZXQgPSAlcCwgbGVuID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcFBhY2tldCwgR0VUX09TX1BLVF9MRU4ocFBhY2tldCkpOwotCSpwcFBhY2tldCA9IHBQYWNrZXQ7Ci0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICBEZXNjcmlwdGlvbjoKLQlUaGlzIHJvdXRpbmUgZnJlZXMgYSBtaW5pcG9ydCBpbnRlcm5hbGx5IGFsbG9jYXRlZCBORElTX1BBQ0tFVCBhbmQgaXRzCi0JY29ycmVzcG9uZGluZyBORElTX0JVRkZFUiBhbmQgYWxsb2NhdGVkIG1lbW9yeS4KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QRnJlZU5kaXNQYWNrZXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUE5ESVNfUEFDS0VUICBwUGFja2V0KQotewotCWRldl9rZnJlZV9za2JfYW55KFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpKTsKLX0KLQotCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLS8vIE5PVEU6IHdlIGRvIGhhdmUgYW4gYXNzdW1wdGlvbiBoZXJlLCB0aGF0IEJ5dGUwIGFuZCBCeXRlMSBhbHdheXMgcmVhc2lkIGF0IHRoZSBzYW1lCi0vLwkJCSBzY2F0dGVyIGdhdGhlciBidWZmZXIKLU5ESVNfU1RBVFVTIFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoCi0JSU4JUE5ESVNfQlVGRkVSCXBGaXJzdEJ1ZmZlciwKLQlJTglVQ0hBUgkJCURlc2lyZWRPZmZzZXQsCi0JT1VUIFBVQ0hBUgkJCXBCeXRlMCwKLQlPVVQgUFVDSEFSCQkJcEJ5dGUxKQotewotICAgICpwQnl0ZTAgPSAqKFBVQ0hBUikocEZpcnN0QnVmZmVyICsgRGVzaXJlZE9mZnNldCk7Ci0gICAgKnBCeXRlMSA9ICooUFVDSEFSKShwRmlyc3RCdWZmZXIgKyBEZXNpcmVkT2Zmc2V0ICsgMSk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi12b2lkIFJUTVBfUXVlcnlQYWNrZXRJbmZvKAotCUlOICBQTkRJU19QQUNLRVQgcFBhY2tldCwKLQlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKLQlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKLQlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKQotewotCXBQYWNrZXRJbmZvLT5CdWZmZXJDb3VudCA9IDE7Ci0JcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9IChQTkRJU19CVUZGRVIpR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwotCXBQYWNrZXRJbmZvLT5QaHlzaWNhbEJ1ZmZlckNvdW50ID0gMTsKLQlwUGFja2V0SW5mby0+VG90YWxQYWNrZXRMZW5ndGggPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKLQotCSpwU3JjQnVmVkEgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7Ci0JKnBTcmNCdWZMZW4gPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKLX0KLQotdm9pZCBSVE1QX1F1ZXJ5TmV4dFBhY2tldEluZm8oCi0JSU4gIFBORElTX1BBQ0tFVCAqcHBQYWNrZXQsCi0JT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCi0JT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCi0JT1VUCVVJTlQJCSAqcFNyY0J1ZkxlbikKLXsKLQlQTkRJU19QQUNLRVQgcFBhY2tldCA9IE5VTEw7Ci0KLQlpZiAoKnBwUGFja2V0KQotCQlwUGFja2V0ID0gR0VUX09TX1BLVF9ORVhUKCpwcFBhY2tldCk7Ci0KLQlpZiAocFBhY2tldCkKLQl7Ci0JCXBQYWNrZXRJbmZvLT5CdWZmZXJDb3VudCA9IDE7Ci0JCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPSAoUE5ESVNfQlVGRkVSKUdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKLQkJcFBhY2tldEluZm8tPlBoeXNpY2FsQnVmZmVyQ291bnQgPSAxOwotCQlwUGFja2V0SW5mby0+VG90YWxQYWNrZXRMZW5ndGggPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKLQotCQkqcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwotCQkqcFNyY0J1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwotCQkqcHBQYWNrZXQgPSBHRVRfT1NfUEtUX05FWFQocFBhY2tldCk7Ci0JfQotCWVsc2UKLQl7Ci0JCXBQYWNrZXRJbmZvLT5CdWZmZXJDb3VudCA9IDA7Ci0JCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPSBOVUxMOwotCQlwUGFja2V0SW5mby0+UGh5c2ljYWxCdWZmZXJDb3VudCA9IDA7Ci0JCXBQYWNrZXRJbmZvLT5Ub3RhbFBhY2tldExlbmd0aCA9IDA7Ci0KLQkJKnBTcmNCdWZWQSA9IE5VTEw7Ci0JCSpwU3JjQnVmTGVuID0gMDsKLQkJKnBwUGFja2V0ID0gTlVMTDsKLQl9Ci19Ci0KLQotUE5ESVNfUEFDS0VUIER1cGxpY2F0ZVBhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQotewotCXN0cnVjdCBza19idWZmCSpza2I7Ci0JUE5ESVNfUEFDS0VUCXBSZXRQYWNrZXQgPSBOVUxMOwotCVVTSE9SVAkJCURhdGFTaXplOwotCVVDSEFSCQkJKnBEYXRhOwotCi0JRGF0YVNpemUgPSAoVVNIT1JUKSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKLQlwRGF0YSA9IChQVUNIQVIpIEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKLQotCi0Jc2tiID0gc2tiX2Nsb25lKFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLCBNRU1fQUxMT0NfRkxBRyk7Ci0JaWYgKHNrYikKLQl7Ci0JCXNrYi0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpOwotCQlwUmV0UGFja2V0ID0gT1NQS1RfVE9fUlRQS1Qoc2tiKTsKLQl9Ci0KLQotCXJldHVybiBwUmV0UGFja2V0OwotCi19Ci0KLVBORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKLSAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURhdGFTaXplLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0Jc3RydWN0IHNrX2J1ZmYJKnNrYjsKLQlQTkRJU19QQUNLRVQJcFBhY2tldCA9IE5VTEw7Ci0KLQotCWlmICgoc2tiID0gX19kZXZfYWxsb2Nfc2tiKEhkckxlbiArIERhdGFTaXplICsgMiwgTUVNX0FMTE9DX0ZMQUcpKSAhPSBOVUxMKQotCXsKLQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKLQkJTmRpc01vdmVNZW1vcnkoc2tiX3RhaWxfcG9pbnRlcihza2IpLCBwSGVhZGVyODAyXzMsIEhkckxlbik7Ci0JCXNrYl9wdXQoc2tiLCBIZHJMZW4pOwotCQlOZGlzTW92ZU1lbW9yeShza2JfdGFpbF9wb2ludGVyKHNrYiksIHBEYXRhLCBEYXRhU2l6ZSk7Ci0JCXNrYl9wdXQoc2tiLCBEYXRhU2l6ZSk7Ci0JCXNrYi0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpOwotCQlwUGFja2V0ID0gT1NQS1RfVE9fUlRQS1Qoc2tiKTsKLQl9Ci0KLQlyZXR1cm4gcFBhY2tldDsKLX0KLQotCi0jZGVmaW5lIFRLSVBfVFhfTUlDX1NJWkUJCTgKLVBORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCi17Ci0Jc3RydWN0IHNrX2J1ZmYJKnNrYiwgKm5ld3NrYjsKLQotCi0Jc2tiID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCk7Ci0JaWYgKHNrYl90YWlscm9vbShza2IpIDwgVEtJUF9UWF9NSUNfU0laRSkKLQl7Ci0JCS8vIGFsbG9jIGEgbmV3IHNrYiBhbmQgY29weSB0aGUgcGFja2V0Ci0JCW5ld3NrYiA9IHNrYl9jb3B5X2V4cGFuZChza2IsIHNrYl9oZWFkcm9vbShza2IpLCBUS0lQX1RYX01JQ19TSVpFLCBHRlBfQVRPTUlDKTsKLQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJaWYgKG5ld3NrYiA9PSBOVUxMKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFeHRlbmQgVHguTUlDIGZvciBwYWNrZXQgZmFpbGVkISwgZHJvcHBpbmcgcGFja2V0IVxuIikpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc2tiID0gbmV3c2tiOwotCX0KLQotCXJldHVybiBPU1BLVF9UT19SVFBLVChza2IpOwotCi0KLX0KLQotCi0KLQotUE5ESVNfUEFDS0VUIENsb25lUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGF0YVNpemUpCi17Ci0Jc3RydWN0IHNrX2J1ZmYJKnBSeFBrdDsKLQlzdHJ1Y3Qgc2tfYnVmZgkqcENsb25lZFBrdDsKLQotCUFTU0VSVChwUGFja2V0KTsKLQlwUnhQa3QgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KTsKLQotCS8vIGNsb25lIHRoZSBwYWNrZXQKLQlwQ2xvbmVkUGt0ID0gc2tiX2Nsb25lKHBSeFBrdCwgTUVNX0FMTE9DX0ZMQUcpOwotCi0JaWYgKHBDbG9uZWRQa3QpCi0JewotCS8vIHNldCB0aGUgY29ycmVjdCBkYXRhcHRyIGFuZCBkYXRhIGxlbgotCXBDbG9uZWRQa3QtPmRldiA9IHBSeFBrdC0+ZGV2OwotCXBDbG9uZWRQa3QtPmRhdGEgPSBwRGF0YTsKLQlwQ2xvbmVkUGt0LT5sZW4gPSBEYXRhU2l6ZTsKLQlwQ2xvbmVkUGt0LT50YWlsID0gcENsb25lZFBrdC0+ZGF0YSArIHBDbG9uZWRQa3QtPmxlbjsKLQkJQVNTRVJUKERhdGFTaXplIDwgMTUzMCk7Ci0JfQotCXJldHVybiBwQ2xvbmVkUGt0OwotfQotCi0vLwotLy8gY2hhbmdlIE9TIHBhY2tldCBEYXRhUHRyIGFuZCBEYXRhTGVuCi0vLwotdm9pZCAgdXBkYXRlX29zX3BhY2tldF9pbmZvKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0Jc3RydWN0IHNrX2J1ZmYJKnBPU1BrdDsKLQotCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7Ci0JcE9TUGt0ID0gUlRQS1RfVE9fT1NQS1QocFJ4QmxrLT5wUnhQYWNrZXQpOwotCi0JcE9TUGt0LT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7Ci0JcE9TUGt0LT5kYXRhID0gcFJ4QmxrLT5wRGF0YTsKLQlwT1NQa3QtPmxlbiA9IHBSeEJsay0+RGF0YVNpemU7Ci0JcE9TUGt0LT50YWlsID0gcE9TUGt0LT5kYXRhICsgcE9TUGt0LT5sZW47Ci19Ci0KLQotdm9pZCB3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCi0JSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0Jc3RydWN0IHNrX2J1ZmYJKnBPU1BrdDsKLQotCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7Ci0JQVNTRVJUKHBIZWFkZXI4MDJfMyk7Ci0KLQlwT1NQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7Ci0KLQlwT1NQa3QtPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKLQlwT1NQa3QtPmRhdGEgPSBwUnhCbGstPnBEYXRhOwotCXBPU1BrdC0+bGVuID0gcFJ4QmxrLT5EYXRhU2l6ZTsKLQlwT1NQa3QtPnRhaWwgPSBwT1NQa3QtPmRhdGEgKyBwT1NQa3QtPmxlbjsKLQotCS8vCi0JLy8gY29weSA4MDIuMyBoZWFkZXIKLQkvLwotCS8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwT1NQa3QsIExFTkdUSF84MDJfMyksIHBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl9Ci0KLQotCi12b2lkIGFubm91bmNlXzgwMl8zX3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKLXsKLQotCXN0cnVjdCBza19idWZmCSpwUnhQa3Q7Ci0jaWZkZWYgSU5GX0FNQVpPTl9QUEEKLSAgICAgICAgaW50ICAgICAgICAgICAgIHJldCA9IDA7Ci0gICAgICAgIHVuc2lnbmVkIGludCBwcGFfZmxhZ3MgPSAwOyAvKiByZXNlcnZlZCBmb3Igbm93ICovCi0jZW5kaWYgLy8gSU5GX0FNQVpPTl9QUEEgLy8KLQotCUFTU0VSVChwUGFja2V0KTsKLQotCXBSeFBrdCA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSAgICAvKiBQdXNoIHVwIHRoZSBwcm90b2NvbCBzdGFjayAqLwotI2lmZGVmIElLQU5PU19WWF8xWDAKLQlJS0FOT1NfRGF0YUZyYW1lUngocEFkLCBwUnhQa3QtPmRldiwgcFJ4UGt0LCBwUnhQa3QtPmxlbik7Ci0jZWxzZQotI2lmZGVmIElORl9BTUFaT05fU0UKLSNpZmRlZiBCR19GVF9TVVBQT1JUCi0gICAgICAgICAgICBCR19GVFBIX1BhY2tldEZyb21BcEhhbmRsZShwUnhQa3QpOwotICAgICAgICAgICAgcmV0dXJuOwotI2VuZGlmIC8vIEJHX0ZUX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBJTkZfQU1BWk9OX1NFIC8vCi0JcFJ4UGt0LT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBSeFBrdCwgcFJ4UGt0LT5kZXYpOwotCi0jaWZkZWYgSU5GX0FNQVpPTl9QUEEKLQlpZiAocHBhX2hvb2tfZGlyZWN0cGF0aF9zZW5kX2ZuICYmIHBBZC0+UFBBRW5hYmxlPT1UUlVFICkKLQl7Ci0JCW1lbXNldChwUnhQa3QtPmhlYWQsMCxwUnhQa3QtPmRhdGEtcFJ4UGt0LT5oZWFkLTE0KTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicHBhX2hvb2tfZGlyZWN0cGF0aF9zZW5kX2ZuIHJ4IDpyZXQ6JWQgaGVhZHJvb206JWQgZGV2OiVzIHBrdGxlbjolZDw9PT1cbiIscmV0LHNrYl9oZWFkcm9vbShwUnhQa3QpCi0JCQkscFJ4UGt0LT5kZXYtPm5hbWUscFJ4UGt0LT5sZW4pKTsKLQkJaGV4X2R1bXAoInJ4IHBhY2tldCIsIHBSeFBrdC0+ZGF0YSwgMzIpOwotCQlyZXQgPSBwcGFfaG9va19kaXJlY3RwYXRoX3NlbmRfZm4ocEFkLT5nX2lmX2lkLCBwUnhQa3QsIHBSeFBrdC0+bGVuLCBwcGFfZmxhZ3MpOwotCQlwUnhQa3Q9TlVMTDsKLQkJcmV0dXJuOwotCi0JfQotI2VuZGlmIC8vIElORl9BTUFaT05fUFBBIC8vCi0KLS8vI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQotLy8JKihpbnQqKShwUnhQa3QtPmNiKSA9IEJSSURHRV9UQUc7Ci0vLyNlbmRpZgotCi0JewotCQluZXRpZl9yeChwUnhQa3QpOwotCX0KLQotI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KLX0KLQotCi1QUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUCi1ydF9nZXRfc2dfbGlzdF9mcm9tX3BhY2tldChQTkRJU19QQUNLRVQgcFBhY2tldCwgUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUICpzZykKLXsKLQlzZy0+TnVtYmVyT2ZFbGVtZW50cyA9IDE7Ci0Jc2ctPkVsZW1lbnRzWzBdLkFkZHJlc3MgPSAgR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwotCXNnLT5FbGVtZW50c1swXS5MZW5ndGggPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKLQlyZXR1cm4gKHNnKTsKLX0KLQotdm9pZCBoZXhfZHVtcChjaGFyICpzdHIsIHVuc2lnbmVkIGNoYXIgKnBTcmNCdWZWQSwgdW5zaWduZWQgaW50IFNyY0J1ZkxlbikKLXsKLQl1bnNpZ25lZCBjaGFyICpwdDsKLQlpbnQgeDsKLQotCWlmIChSVERlYnVnTGV2ZWwgPCBSVF9ERUJVR19UUkFDRSkKLQkJcmV0dXJuOwotCi0JcHQgPSBwU3JjQnVmVkE7Ci0JcHJpbnRrKCIlczogJXAsIGxlbiA9ICVkXG4iLHN0ciwgIHBTcmNCdWZWQSwgU3JjQnVmTGVuKTsKLQlmb3IgKHg9MDsgeDxTcmNCdWZMZW47IHgrKykKLQl7Ci0JCWlmICh4ICUgMTYgPT0gMCkKLQkJCXByaW50aygiMHglMDR4IDogIiwgeCk7Ci0JCXByaW50aygiJTAyeCAiLCAoKHVuc2lnbmVkIGNoYXIpcHRbeF0pKTsKLQkJaWYgKHglMTYgPT0gMTUpIHByaW50aygiXG4iKTsKLQl9Ci0JcHJpbnRrKCJcbiIpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJU2VuZCBsb2cgbWVzc2FnZSB0aHJvdWdoIHdpcmVsZXNzIGV2ZW50Ci0KLQkJU3VwcG9ydCBzdGFuZGFyZCBpd19ldmVudCB3aXRoIElXRVZDVVNUT00uIEl0IGlzIHVzZWQgYmVsb3cuCi0KLQkJaXdyZXFfZGF0YS5kYXRhLmZsYWdzIGlzIHVzZWQgdG8gc3RvcmUgZXZlbnRfZmxhZyB0aGF0IGlzIGRlZmluZWQgYnkgdXNlci4KLQkJaXdyZXFfZGF0YS5kYXRhLmxlbmd0aCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBldmVudCBsb2cuCi0KLQkJVGhlIGZvcm1hdCBvZiB0aGUgZXZlbnQgbG9nIGlzIGNvbXBvc2VkIG9mIHRoZSBlbnRyeSdzIE1BQyBhZGRyZXNzIGFuZAotCQl0aGUgZGVzaXJlZCBsb2cgbWVzc2FnZSAocmVmZXIgdG8gcFdpcmVsZXNzRXZlbnRUZXh0KS4KLQotCQkJZXg6IDExOjIyOjMzOjQ0OjU1OjY2IGhhcyBhc3NvY2lhdGVkIHN1Y2Nlc3NmdWxseQotCi0JCXAucy4gVGhlIHJlcXVpcmVtZW50IG9mIFdpcmVsZXNzIEV4dGVuc2lvbiBpcyB2MTUgb3IgbmV3ZXIuCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBTZW5kV2lyZWxlc3NFdmVudCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlFdmVudF9mbGFnLAotCUlOCVBVQ0hBUgkJCXBBZGRyLAotCUlOCVVDSEFSCQkJQnNzSWR4LAotCUlOCUNIQVIJCQlSc3NpKQotewotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNQotCi0JLy91bmlvbgkJaXdyZXFfZGF0YSAgICAgIHdycXU7Ci0JUFNUUklORwlwQnVmID0gTlVMTCwgcEJ1ZlB0ciA9IE5VTEw7Ci0JVVNIT1JUCWV2ZW50LCB0eXBlLCBCdWZMZW47Ci0JVUNIQVIJZXZlbnRfdGFibGVfbGVuID0gMDsKLQotCXR5cGUgPSBFdmVudF9mbGFnICYgMHhGRjAwOwotCWV2ZW50ID0gRXZlbnRfZmxhZyAmIDB4MDBGRjsKLQotCXN3aXRjaCAodHlwZSkKLQl7Ci0JCWNhc2UgSVdfU1lTX0VWRU5UX0ZMQUdfU1RBUlQ6Ci0JCQlldmVudF90YWJsZV9sZW4gPSBJV19TWVNfRVZFTlRfVFlQRV9OVU07Ci0JCQlicmVhazsKLQotCQljYXNlIElXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQ6Ci0JCQlldmVudF90YWJsZV9sZW4gPSBJV19TUE9PRl9FVkVOVF9UWVBFX05VTTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVdfRkxPT0RfRVZFTlRfRkxBR19TVEFSVDoKLQkJCWV2ZW50X3RhYmxlX2xlbiA9IElXX0ZMT09EX0VWRU5UX1RZUEVfTlVNOwotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGV2ZW50X3RhYmxlX2xlbiA9PSAwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBUaGUgdHlwZSglMHgwMngpIGlzIG5vdCB2YWxpZC5cbiIsIF9fRlVOQ1RJT05fXywgdHlwZSkpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGV2ZW50ID49IGV2ZW50X3RhYmxlX2xlbikKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIGV2ZW50KCUweDAyeCkgaXMgbm90IHZhbGlkLlxuIiwgX19GVU5DVElPTl9fLCBldmVudCkpOwotCQlyZXR1cm47Ci0JfQotCi0JLy9BbGxvY2F0ZSBtZW1vcnkgYW5kIGNvcHkgdGhlIG1zZy4KLQlpZigocEJ1ZiA9IGttYWxsb2MoSVdfQ1VTVE9NX01BWF9MRU4sIEdGUF9BVE9NSUMpKSAhPSBOVUxMKQotCXsKLQkJLy9QcmVwYXJlIHRoZSBwYXlsb2FkCi0JCW1lbXNldChwQnVmLCAwLCBJV19DVVNUT01fTUFYX0xFTik7Ci0KLQkJcEJ1ZlB0ciA9IHBCdWY7Ci0KLQkJaWYgKHBBZGRyKQotCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSBTVEEoJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngpICIsIFBSSU5UX01BQyhwQWRkcikpOwotCQllbHNlIGlmIChCc3NJZHggPCBNQVhfTUJTU0lEX05VTSkKLQkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiKFJUMjg2MCkgQlNTKHJhJWQpICIsIEJzc0lkeCk7Ci0JCWVsc2UKLQkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiKFJUMjg2MCkgIik7Ci0KLQkJaWYgKHR5cGUgPT0gSVdfU1lTX0VWRU5UX0ZMQUdfU1RBUlQpCi0JCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIiVzIiwgcFdpcmVsZXNzU3lzRXZlbnRUZXh0W2V2ZW50XSk7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gSVdfU1BPT0ZfRVZFTlRfRkxBR19TVEFSVCkKLQkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiJXMgKFJTU0k9JWQpIiwgcFdpcmVsZXNzU3Bvb2ZFdmVudFRleHRbZXZlbnRdLCBSc3NpKTsKLQkJZWxzZSBpZiAodHlwZSA9PSBJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUKQotCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyIsIHBXaXJlbGVzc0Zsb29kRXZlbnRUZXh0W2V2ZW50XSk7Ci0JCWVsc2UKLQkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiJXMiLCAidW5rbm93biBldmVudCIpOwotCi0JCXBCdWZQdHJbcEJ1ZlB0ciAtIHBCdWZdID0gJ1wwJzsKLQkJQnVmTGVuID0gcEJ1ZlB0ciAtIHBCdWY7Ci0KLQkJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBJV0VWQ1VTVE9NLCBFdmVudF9mbGFnLCBOVUxMLCAoUFVDSEFSKXBCdWYsIEJ1Zkxlbik7Ci0JCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgOiAlc1xuIiwgX19GVU5DVElPTl9fLCBwQnVmKSk7Ci0KLQkJa2ZyZWUocEJ1Zik7Ci0JfQotCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHdpcmVsZXNzIGV2ZW50LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0jZWxzZQotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIFdpcmVsZXNzIEV4dGVuc2lvbiBNVVNUIGJlIHYxNSBvciBuZXdlci5cbiIsIF9fRlVOQ1RJT05fXykpOwotI2VuZGlmICAvKiBXSVJFTEVTU19FWFQgPj0gMTUgKi8KLX0KLQotCi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotdm9pZCBzZW5kX21vbml0b3JfcGFja2V0cygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrKQotewotICAgIHN0cnVjdCBza19idWZmCSpwT1NQa3Q7Ci0gICAgd2xhbl9uZ19wcmlzbTJfaGVhZGVyICpwaDsKLSAgICBpbnQgcmF0ZV9pbmRleCA9IDA7Ci0gICAgVVNIT1JUIGhlYWRlcl9sZW4gPSAwOwotICAgIFVDSEFSIHRlbXBfaGVhZGVyWzQwXSA9IHswfTsKLQotICAgIHVfaW50MzJfdCByYWxpbmtyYXRlWzI1Nl0gPSB7Miw0LDExLDIyLCAxMiwxOCwyNCwzNiw0OCw3Miw5NiwgIDEwOCwgICAxMDksIDExMCwgMTExLCAxMTIsIDEzLCAyNiwgMzksIDUyLDc4LDEwNCwgMTE3LCAxMzAsIDI2LCA1MiwgNzgsMTA0LCAxNTYsIDIwOCwgMjM0LCAyNjAsIDI3LCA1NCw4MSwxMDgsMTYyLCAyMTYsIDI0MywgMjcwLCAvLyBMYXN0IDM4Ci0JNTQsIDEwOCwgMTYyLCAyMTYsIDMyNCwgNDMyLCA0ODYsIDU0MCwgIDE0LCAyOSwgNDMsIDU3LCA4NywgMTE1LCAxMzAsIDE0NCwgMjksIDU5LDg3LDExNSwgMTczLCAyMzAsMjYwLCAyODgsIDMwLCA2MCw5MCwxMjAsMTgwLDI0MCwyNzAsMzAwLDYwLDEyMCwxODAsMjQwLDM2MCw0ODAsNTQwLDYwMCwgMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwKLQkxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NCw2NSw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MH07Ci0KLQotICAgIEFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7Ci0gICAgaWYgKHBSeEJsay0+RGF0YVNpemUgPCAxMCkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogU2l6ZSBpcyB0b28gc21hbGwhICglZClcbiIsIF9fRlVOQ1RJT05fXywgcFJ4QmxrLT5EYXRhU2l6ZSkpOwotCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7Ci0gICAgfQotCi0gICAgaWYgKHBSeEJsay0+RGF0YVNpemUgKyBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSA+IFJYX0JVRkZFUl9BR0dSRVNJWkUpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIGxhcmdlISAoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHBSeEJsay0+RGF0YVNpemUgKyBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSkpOwotCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7Ci0gICAgfQotCi0gICAgcE9TUGt0ID0gUlRQS1RfVE9fT1NQS1QocFJ4QmxrLT5wUnhQYWNrZXQpOwotCXBPU1BrdC0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgQlNTMCk7Ci0gICAgaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBKQotICAgIHsKLSAgICAgICAgcFJ4QmxrLT5EYXRhU2l6ZSAtPSBMRU5HVEhfODAyXzExOwotICAgICAgICBpZiAoKHBSeEJsay0+cEhlYWRlci0+RkMuVG9EcyA9PSAxKSAmJgotICAgICAgICAgICAgKHBSeEJsay0+cEhlYWRlci0+RkMuRnJEcyA9PSAxKSkKLSAgICAgICAgICAgIGhlYWRlcl9sZW4gPSBMRU5HVEhfODAyXzExX1dJVEhfQUREUjQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGhlYWRlcl9sZW4gPSBMRU5HVEhfODAyXzExOwotCi0gICAgICAgIC8vIFFPUwotCWlmIChwUnhCbGstPnBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KQotCXsKLQkgICAgaGVhZGVyX2xlbiArPSAyOwotCQkvLyBEYXRhIHNraXAgUU9TIGNvbnRvcmwgZmllbGQKLQkJcFJ4QmxrLT5EYXRhU2l6ZSAtPTI7Ci0JfQotCi0JLy8gT3JkZXIgYml0OiBBLVJhbGluayBvciBIVEMrCi0JaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuT3JkZXIpCi0JewotCSAgICBoZWFkZXJfbGVuICs9IDQ7Ci0JCQkvLyBEYXRhIHNraXAgSFRDIGNvbnRvcmwgZmllbGQKLQkJCXBSeEJsay0+RGF0YVNpemUgLT0gNDsKLQl9Ci0KLSAgICAgICAgLy8gQ29weSBIZWFkZXIKLSAgICAgICAgaWYgKGhlYWRlcl9sZW4gPD0gNDApCi0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSh0ZW1wX2hlYWRlciwgcFJ4QmxrLT5wRGF0YSwgaGVhZGVyX2xlbik7Ci0KLSAgICAgICAgLy8gc2tpcCBIVyBwYWRkaW5nCi0JaWYgKHBSeEJsay0+UnhELkwyUEFEKQotCSAgICBwUnhCbGstPnBEYXRhICs9IChoZWFkZXJfbGVuICsgMik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBSeEJsay0+cERhdGEgKz0gaGVhZGVyX2xlbjsKLSAgICB9IC8vZW5kIGlmCi0KLQotCWlmIChwUnhCbGstPkRhdGFTaXplIDwgcE9TUGt0LT5sZW4pIHsKLSAgICAgICAgc2tiX3RyaW0ocE9TUGt0LHBSeEJsay0+RGF0YVNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNrYl9wdXQocE9TUGt0LChwUnhCbGstPkRhdGFTaXplIC0gcE9TUGt0LT5sZW4pKTsKLSAgICB9IC8vZW5kIGlmCi0KLSAgICBpZiAoKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpID4gMCkgewotCSAgICBza2JfcHV0KHBPU1BrdCwocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkpOwotCSAgICBza2JfcHVsbChwT1NQa3QsKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpKTsKLSAgICB9IC8vZW5kIGlmCi0KLSAgICBpZiAoc2tiX2hlYWRyb29tKHBPU1BrdCkgPCAoc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikrIGhlYWRlcl9sZW4pKSB7Ci0gICAgICAgIGlmIChwc2tiX2V4cGFuZF9oZWFkKHBPU1BrdCwgKHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpICsgaGVhZGVyX2xlbiksIDAsIEdGUF9BVE9NSUMpKSB7Ci0JICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFJlYWxsb2NhdGUgaGVhZGVyIHNpemUgb2Ygc2tfYnVmZiBmYWlsIVxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7Ci0JICAgIH0gLy9lbmQgaWYKLSAgICB9IC8vZW5kIGlmCi0KLSAgICBpZiAoaGVhZGVyX2xlbiA+IDApCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KHNrYl9wdXNoKHBPU1BrdCwgaGVhZGVyX2xlbiksIHRlbXBfaGVhZGVyLCBoZWFkZXJfbGVuKTsKLQotICAgIHBoID0gKHdsYW5fbmdfcHJpc20yX2hlYWRlciAqKSBza2JfcHVzaChwT1NQa3QsIHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpKTsKLQlOZGlzWmVyb01lbW9yeShwaCwgc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikpOwotCi0gICAgcGgtPm1zZ2NvZGUJCSAgICA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm07Ci0JcGgtPm1zZ2xlbgkJICAgID0gc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcik7Ci0Jc3RyY3B5KChQU1RSSU5HKSBwaC0+ZGV2bmFtZSwgKFBTVFJJTkcpIHBBZC0+bmV0X2Rldi0+bmFtZSk7Ci0KLSAgICBwaC0+aG9zdHRpbWUuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ob3N0dGltZTsKLQlwaC0+aG9zdHRpbWUuc3RhdHVzID0gMDsKLQlwaC0+aG9zdHRpbWUubGVuID0gNDsKLQlwaC0+aG9zdHRpbWUuZGF0YSA9IGppZmZpZXM7Ci0KLQlwaC0+bWFjdGltZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX21hY3RpbWU7Ci0JcGgtPm1hY3RpbWUuc3RhdHVzID0gMDsKLQlwaC0+bWFjdGltZS5sZW4gPSAwOwotCXBoLT5tYWN0aW1lLmRhdGEgPSAwOwotCi0gICAgcGgtPmlzdHguZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4OwotCXBoLT5pc3R4LnN0YXR1cyA9IDA7Ci0JcGgtPmlzdHgubGVuID0gMDsKLQlwaC0+aXN0eC5kYXRhID0gMDsKLQotICAgIHBoLT5jaGFubmVsLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbDsKLQlwaC0+Y2hhbm5lbC5zdGF0dXMgPSAwOwotCXBoLT5jaGFubmVsLmxlbiA9IDQ7Ci0KLSAgICBwaC0+Y2hhbm5lbC5kYXRhID0gKHVfaW50MzJfdClwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCi0gICAgcGgtPnJzc2kuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpOwotCXBoLT5yc3NpLnN0YXR1cyA9IDA7Ci0JcGgtPnJzc2kubGVuID0gNDsKLSAgICBwaC0+cnNzaS5kYXRhID0gKHVfaW50MzJfdClSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBwUnhCbGstPnBSeFdJLT5SU1NJMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIHBSeEJsay0+cFJ4V0ktPlJTU0kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgcFJ4QmxrLT5wUnhXSS0+UlNTSTIsIFJTU0lfMikpOzsKLQotCXBoLT5zaWduYWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWw7Ci0JcGgtPnNpZ25hbC5zdGF0dXMgPSAwOwotCXBoLT5zaWduYWwubGVuID0gNDsKLQlwaC0+c2lnbmFsLmRhdGEgPSAwOyAvL3Jzc2kgKyBub2lzZTsKLQotCXBoLT5ub2lzZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX25vaXNlOwotCXBoLT5ub2lzZS5zdGF0dXMgPSAwOwotCXBoLT5ub2lzZS5sZW4gPSA0OwotCXBoLT5ub2lzZS5kYXRhID0gMDsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgIGlmIChwUnhCbGstPnBSeFdJLT5QSFlNT0RFID49IE1PREVfSFRNSVgpCi0gICAgewotCXJhdGVfaW5kZXggPSAxNiArICgoVUNIQVIpcFJ4QmxrLT5wUnhXSS0+QlcgKjE2KSArICgoVUNIQVIpcFJ4QmxrLT5wUnhXSS0+U2hvcnRHSSAqMzIpICsgKChVQ0hBUilwUnhCbGstPnBSeFdJLT5NQ1MpOwotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JaWYgKHBSeEJsay0+cFJ4V0ktPlBIWU1PREUgPT0gTU9ERV9PRkRNKQotCXJhdGVfaW5kZXggPSAoVUNIQVIpKHBSeEJsay0+cFJ4V0ktPk1DUykgKyA0OwotICAgIGVsc2UKLQlyYXRlX2luZGV4ID0gKFVDSEFSKShwUnhCbGstPnBSeFdJLT5NQ1MpOwotICAgIGlmIChyYXRlX2luZGV4IDwgMCkKLSAgICAgICAgcmF0ZV9pbmRleCA9IDA7Ci0gICAgaWYgKHJhdGVfaW5kZXggPiAyNTUpCi0gICAgICAgIHJhdGVfaW5kZXggPSAyNTU7Ci0KLQlwaC0+cmF0ZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3JhdGU7Ci0JcGgtPnJhdGUuc3RhdHVzID0gMDsKLQlwaC0+cmF0ZS5sZW4gPSA0OwotICAgIHBoLT5yYXRlLmRhdGEgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdOwotCi0JcGgtPmZybWxlbi5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbjsKLSAgICBwaC0+ZnJtbGVuLnN0YXR1cyA9IDA7Ci0JcGgtPmZybWxlbi5sZW4gPSA0OwotCXBoLT5mcm1sZW4uZGF0YQk9ICh1X2ludDMyX3QpcFJ4QmxrLT5EYXRhU2l6ZTsKLQotCi0gICAgcE9TUGt0LT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7Ci0gICAgcE9TUGt0LT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBPU1BrdCwgcE9TUGt0LT5kZXYpOwotICAgIHBPU1BrdC0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLSAgICBuZXRpZl9yeChwT1NQa3QpOwotCi0gICAgcmV0dXJuOwotCi1lcnJfZnJlZV9za19idWZmOgotCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JcmV0dXJuOwotCi19Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JRmlsZSBvcGVuL2Nsb3NlIHJlbGF0ZWQgZnVuY3Rpb25zLgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVJUTVBfT1NfRkQgUnRtcE9TRmlsZU9wZW4oY2hhciAqcFBhdGgsICBpbnQgZmxhZywgaW50IG1vZGUpCi17Ci0Jc3RydWN0IGZpbGUJKmZpbGVQdHI7Ci0KLQlmaWxlUHRyID0gZmlscF9vcGVuKHBQYXRoLCBmbGFnLCAwKTsKLQlpZiAoSVNfRVJSKGZpbGVQdHIpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMoKTogRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIF9fRlVOQ1RJT05fXywgLVBUUl9FUlIoZmlsZVB0ciksIHBQYXRoKSk7Ci0JfQotCi0JcmV0dXJuIChSVE1QX09TX0ZEKWZpbGVQdHI7Ci19Ci0KLWludCBSdG1wT1NGaWxlQ2xvc2UoUlRNUF9PU19GRCBvc2ZkKQotewotCWZpbHBfY2xvc2Uob3NmZCwgTlVMTCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotdm9pZCBSdG1wT1NGaWxlU2VlayhSVE1QX09TX0ZEIG9zZmQsIGludCBvZmZzZXQpCi17Ci0Jb3NmZC0+Zl9wb3MgPSBvZmZzZXQ7Ci19Ci0KLQotaW50IFJ0bXBPU0ZpbGVSZWFkKFJUTVBfT1NfRkQgb3NmZCwgY2hhciAqcERhdGFQdHIsIGludCByZWFkTGVuKQotewotCS8vIFRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QKLQlpZiAob3NmZC0+Zl9vcCAmJiBvc2ZkLT5mX29wLT5yZWFkKQotCXsKLQkJcmV0dXJuIG9zZmQtPmZfb3AtPnJlYWQob3NmZCwgIHBEYXRhUHRyLCByZWFkTGVuLCAmb3NmZC0+Zl9wb3MpOwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJubyBmaWxlIHJlYWQgbWV0aG9kXG4iKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci19Ci0KLQotaW50IFJ0bXBPU0ZpbGVXcml0ZShSVE1QX09TX0ZEIG9zZmQsIGNoYXIgKnBEYXRhUHRyLCBpbnQgd3JpdGVMZW4pCi17Ci0JcmV0dXJuIG9zZmQtPmZfb3AtPndyaXRlKG9zZmQsIHBEYXRhUHRyLCAoc2l6ZV90KXdyaXRlTGVuLCAmb3NmZC0+Zl9wb3MpOwotfQotCi0KLXZvaWQgUnRtcE9TRlNJbmZvQ2hhbmdlKFJUTVBfT1NfRlNfSU5GTyAqcE9TRlNJbmZvLCBCT09MRUFOIGJTZXQpCi17Ci0JaWYgKGJTZXQpCi0JewotCQkvLyBTYXZlIHVpZCBhbmQgZ2lkIHVzZWQgZm9yIGZpbGVzeXN0ZW0gYWNjZXNzLgotCQkvLyBTZXQgdXNlciBhbmQgZ3JvdXAgdG8gMCAocm9vdCkKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjkpCi0JCXBPU0ZTSW5mby0+ZnN1aWQ9IGN1cnJlbnQtPmZzdWlkOwotCQlwT1NGU0luZm8tPmZzZ2lkID0gY3VycmVudC0+ZnNnaWQ7Ci0JCWN1cnJlbnQtPmZzdWlkID0gY3VycmVudC0+ZnNnaWQgPSAwOwotI2Vsc2UKLQkJcE9TRlNJbmZvLT5mc3VpZCA9IGN1cnJlbnRfZnN1aWQoKTsKLQkJcE9TRlNJbmZvLT5mc2dpZCA9IGN1cnJlbnRfZnNnaWQoKTsKLSNlbmRpZgotCQlwT1NGU0luZm8tPmZzID0gZ2V0X2ZzKCk7Ci0JCXNldF9mcyhLRVJORUxfRFMpOwotCX0KLQllbHNlCi0JewotCQlzZXRfZnMocE9TRlNJbmZvLT5mcyk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI5KQotCQljdXJyZW50LT5mc3VpZCA9IHBPU0ZTSW5mby0+ZnN1aWQ7Ci0JCWN1cnJlbnQtPmZzZ2lkID0gcE9TRlNJbmZvLT5mc2dpZDsKLSNlbmRpZgotCX0KLX0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlUYXNrIGNyZWF0ZS9tYW5hZ2VtZW50L2tpbGwgcmVsYXRlZCBmdW5jdGlvbnMuCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTkRJU19TVEFUVVMgUnRtcE9TVGFza0tpbGwoCi0JSU4gUlRNUF9PU19UQVNLICpwVGFzaykKLXsKLQlSVE1QX0FEQVBURVIgKnBBZDsKLQlpbnQgcmV0ID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQotCXBBZCA9IChSVE1QX0FEQVBURVIgKilwVGFzay0+cHJpdjsKLQotI2lmZGVmIEtUSFJFQURfU1VQUE9SVAotCWlmIChwVGFzay0+a3RocmVhZF90YXNrKQotCXsKLQkJa3RocmVhZF9zdG9wKHBUYXNrLT5rdGhyZWFkX3Rhc2spOwotCQlyZXQgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCX0KLSNlbHNlCi0JQ0hFQ0tfUElEX0xFR0FMSVRZKHBUYXNrLT50YXNrUElEKQotCXsKLQkJcHJpbnRrKCJUZXJtaW5hdGUgdGhlIHRhc2soJXMpIHdpdGggcGlkKCVkKSFcbiIsIHBUYXNrLT50YXNrTmFtZSwgR0VUX1BJRF9OVU1CRVIocFRhc2stPnRhc2tQSUQpKTsKLQkJbWIoKTsKLQkJcFRhc2stPnRhc2tfa2lsbGVkID0gMTsKLQkJbWIoKTsKLQkJcmV0ID0gS0lMTF9USFJFQURfUElEKHBUYXNrLT50YXNrUElELCBTSUdURVJNLCAxKTsKLQkJaWYgKHJldCkKLQkJewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAia2lsbCB0YXNrKCVzKSB3aXRoIHBpZCglZCkgZmFpbGVkKHJldFZhbD0lZCkhXG4iLAotCQkJCXBUYXNrLT50YXNrTmFtZSwgR0VUX1BJRF9OVU1CRVIocFRhc2stPnRhc2tQSUQpLCByZXQpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJd2FpdF9mb3JfY29tcGxldGlvbigmcFRhc2stPnRhc2tDb21wbGV0ZSk7Ci0JCQlwVGFzay0+dGFza1BJRCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKLQkJCXBUYXNrLT50YXNrX2tpbGxlZCA9IDA7Ci0JCQlyZXQgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCQl9Ci0JfQotI2VuZGlmCi0KLQlyZXR1cm4gcmV0OwotCi19Ci0KLQotSU5UIFJ0bXBPU1Rhc2tOb3RpZnlUb0V4aXQoCi0JSU4gUlRNUF9PU19UQVNLICpwVGFzaykKLXsKLQotI2lmbmRlZiBLVEhSRUFEX1NVUFBPUlQKLQljb21wbGV0ZV9hbmRfZXhpdCgmcFRhc2stPnRhc2tDb21wbGV0ZSwgMCk7Ci0jZW5kaWYKLQotCXJldHVybiAwOwotfQotCi0KLXZvaWQgUnRtcE9TVGFza0N1c3RvbWl6ZSgKLQlJTiBSVE1QX09TX1RBU0sgKnBUYXNrKQotewotCi0jaWZuZGVmIEtUSFJFQURfU1VQUE9SVAotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCWRhZW1vbml6ZSgoUFNUUklORykmcFRhc2stPnRhc2tOYW1lWzBdLyoiJXMiLHBBZC0+bmV0X2Rldi0+bmFtZSovKTsKLQotCWFsbG93X3NpZ25hbChTSUdURVJNKTsKLQlhbGxvd19zaWduYWwoU0lHS0lMTCk7Ci0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7Ci0jZWxzZQotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlkYWVtb25pemUoKTsKLQlyZXBhcmVudF90b19pbml0KCk7Ci0Jc3RyY3B5KGN1cnJlbnQtPmNvbW0sICZwVGFzay0+dGFza05hbWVbMF0pOwotCi0Jc2lnaW5pdHNldGludigmY3VycmVudC0+YmxvY2tlZCwgc2lnbWFzayhTSUdURVJNKSB8IHNpZ21hc2soU0lHS0lMTCkpOwotCi0JLyogQWxsb3cgaW50ZXJjZXB0aW9uIG9mIFNJR0tJTEwgb25seQotCSAqIERvbid0IGFsbG93IG90aGVyIHNpZ25hbHMgdG8gaW50ZXJydXB0IHRoZSB0cmFuc21pc3Npb24gKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDQsMjIpCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmN1cnJlbnQtPnNpZ21hc2tfbG9jaywgZmxhZ3MpOwotCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoY3VycmVudCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnbWFza19sb2NrLCBmbGFncyk7Ci0jZW5kaWYKLSNlbmRpZgotCi0gICAgLyogc2lnbmFsIHRoYXQgd2UndmUgc3RhcnRlZCB0aGUgdGhyZWFkICovCi0JY29tcGxldGUoJnBUYXNrLT50YXNrQ29tcGxldGUpOwotCi0jZW5kaWYKLX0KLQotCi1ORElTX1NUQVRVUyBSdG1wT1NUYXNrQXR0YWNoKAotCUlOIFJUTVBfT1NfVEFTSyAqcFRhc2ssCi0JSU4gaW50ICgqZm4pKHZvaWQgKiksCi0JSU4gdm9pZCAqYXJnKQotewotCU5ESVNfU1RBVFVTIHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JcGlkX3QgcGlkX251bWJlciA9IC0xOwotCi0jaWZkZWYgS1RIUkVBRF9TVVBQT1JUCi0JcFRhc2stPnRhc2tfa2lsbGVkID0gMDsKLQlwVGFzay0+a3RocmVhZF90YXNrID0gTlVMTDsKLQlwVGFzay0+a3RocmVhZF90YXNrID0ga3RocmVhZF9ydW4oZm4sIGFyZywgcFRhc2stPnRhc2tOYW1lKTsKLQlpZiAoSVNfRVJSKHBUYXNrLT5rdGhyZWFkX3Rhc2spKQotCQlzdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotI2Vsc2UKLQlwaWRfbnVtYmVyID0ga2VybmVsX3RocmVhZChmbiwgYXJnLCBSVE1QX09TX01HTVRfVEFTS19GTEFHUyk7Ci0JaWYgKHBpZF9udW1iZXIgPCAwKQotCXsKLQkJREJHUFJJTlQgKFJUX0RFQlVHX0VSUk9SLCAoIkF0dGFjaCB0YXNrKCVzKSBmYWlsZWQhXG4iLCBwVGFzay0+dGFza05hbWUpKTsKLQkJc3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0JZWxzZQotCXsKLQkJcFRhc2stPnRhc2tQSUQgPSBHRVRfUElEKHBpZF9udW1iZXIpOwotCi0JCS8vIFdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gc3RhcnQKLQkJd2FpdF9mb3JfY29tcGxldGlvbigmcFRhc2stPnRhc2tDb21wbGV0ZSk7Ci0JCXN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JfQotI2VuZGlmCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotCi1ORElTX1NUQVRVUyBSdG1wT1NUYXNrSW5pdCgKLQlJTiBSVE1QX09TX1RBU0sgKnBUYXNrLAotCUlOIFBTVFJJTkcJCXBUYXNrTmFtZSwKLQlJTiBWT0lECQkJKnBQcml2KQotewotCWludCBsZW47Ci0KLQlBU1NFUlQocFRhc2spOwotCi0jaWZuZGVmIEtUSFJFQURfU1VQUE9SVAotCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpKHBUYXNrKSwgc2l6ZW9mKFJUTVBfT1NfVEFTSykpOwotI2VuZGlmCi0KLQlsZW4gPSBzdHJsZW4ocFRhc2tOYW1lKTsKLQlsZW4gPSBsZW4gPiAoUlRNUF9PU19UQVNLX05BTUVfTEVOIC0xKSA/IChSVE1QX09TX1RBU0tfTkFNRV9MRU4tMSkgOiBsZW47Ci0JTmRpc01vdmVNZW1vcnkoJnBUYXNrLT50YXNrTmFtZVswXSwgcFRhc2tOYW1lLCBsZW4pOwotCXBUYXNrLT5wcml2ID0gcFByaXY7Ci0KLSNpZm5kZWYgS1RIUkVBRF9TVVBQT1JUCi0JUlRNUF9TRU1fRVZFTlRfSU5JVF9MT0NLRUQoJihwVGFzay0+dGFza1NlbWEpKTsKLQlwVGFzay0+dGFza1BJRCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKLQotCWluaXRfY29tcGxldGlvbiAoJnBUYXNrLT50YXNrQ29tcGxldGUpOwotI2VuZGlmCi0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi12b2lkIFJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQl7Ci0JCWlmIChwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKLQkJewotCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU1RBX0xJTktET1dOX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7Ci0JCX0KLQl9Ci19Ci0KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDIwNDAyCS8vIFJlZCBIYXQgNy4xCi0vL3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfbmV0ZGV2KGludCBzaXplb2ZfcHJpdiwgY29uc3QgY2hhciAqbWFzaywgdm9pZCAoKnNldHVwKShzdHJ1Y3QgbmV0X2RldmljZSAqKSkgLy9zYW1wbGUKLXN0cnVjdCBuZXRfZGV2aWNlICphbGxvY19uZXRkZXYoCi0JaW50IHNpemVvZl9wcml2LAotCWNvbnN0IGNoYXIgKm1hc2ssCi0Jdm9pZCAoKnNldHVwKShzdHJ1Y3QgbmV0X2RldmljZSAqKSkKLXsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OwotICAgIElOVAkJCQkJYWxsb2Nfc2l6ZTsKLQotCi0gICAgLyogZW5zdXJlIDMyLWJ5dGUgYWxpZ25tZW50IG9mIHRoZSBwcml2YXRlIGFyZWEgKi8KLSAgICBhbGxvY19zaXplID0gc2l6ZW9mICgqZGV2KSArIHNpemVvZl9wcml2ICsgMzE7Ci0KLSAgICBkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikga21hbGxvYyhhbGxvY19zaXplLCBHRlBfS0VSTkVMKTsKLSAgICBpZiAoZGV2ID09IE5VTEwpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKLQkJCQkoImFsbG9jX25ldGRldjogVW5hYmxlIHRvIGFsbG9jYXRlIGRldmljZSBtZW1vcnkuXG4iKSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIG1lbXNldChkZXYsIDAsIGFsbG9jX3NpemUpOwotCi0gICAgaWYgKHNpemVvZl9wcml2KQotICAgICAgICBkZXYtPnByaXYgPSAodm9pZCAqKSAoKChsb25nKShkZXYgKyAxKSArIDMxKSAmIH4zMSk7Ci0KLSAgICBzZXR1cChkZXYpOwotICAgIHN0cmNweShkZXYtPm5hbWUsIG1hc2spOwotCi0gICAgcmV0dXJuIGRldjsKLX0KLSNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KLQotCi1pbnQgUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVUlOVDMyCQlldmVudFR5cGUsCi0JSU4gSU5UCQkJZmxhZ3MsCi0JSU4gUFVDSEFSCQlwU3JjTWFjLAotCUlOIFBVQ0hBUgkJcERhdGEsCi0JSU4gVUlOVDMyCQlkYXRhTGVuKQotewotCXVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKLQotICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKLQotCWlmIChmbGFncz4tMSkKLQkgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gZmxhZ3M7Ci0KLQlpZiAocFNyY01hYykKLQkJbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwU3JjTWFjLCBNQUNfQUREUl9MRU4pOwotCi0JaWYgKChwRGF0YSE9IE5VTEwpICYmIChkYXRhTGVuID4gMCkpCi0JCXdycXUuZGF0YS5sZW5ndGggPSBkYXRhTGVuOwotCi0gICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIGV2ZW50VHlwZSwgJndycXUsIChjaGFyICopcERhdGEpOwotCXJldHVybiAwOwotfQotCi0KLWludCBSdG1wT1NOZXREZXZBZGRyU2V0KAotCUlOIFBORVRfREVWIHBOZXREZXYsCi0JSU4gUFVDSEFSCXBNYWNBZGRyKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OwotCVJUTVBfQURBUFRFUiAqcEFkOwotCi0JbmV0X2RldiA9IHBOZXREZXY7Ci0JLy9wQWQgPSAoUlRNUF9BREFQVEVSICopbmV0X2Rldi0+cHJpdjsKLQlwQWQ9UlRNUF9PU19ORVRERVZfR0VUX1BSSVYocE5ldERldik7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkvLyB3b3JrLWFyb3VuZCBmb3IgdGhlIFN1U0UgZHVlIHRvIGl0IGhhcyBpdCdzIG93biBpbnRlcmZhY2UgbmFtZSBtYW5hZ2VtZW50IHN5c3RlbS4KLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuZGV2X25hbWUsIDE2KTsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuZGV2X25hbWUsIG5ldF9kZXYtPm5hbWUsIHN0cmxlbihuZXRfZGV2LT5uYW1lKSk7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JTmRpc01vdmVNZW1vcnkobmV0X2Rldi0+ZGV2X2FkZHIsIHBNYWNBZGRyLCA2KTsKLQotCXJldHVybiAwOwotfQotCi0KLQotLyoKLSAgKglBc3NpZ24gdGhlIG5ldHdvcmsgZGV2IG5hbWUgZm9yIGNyZWF0ZWQgUmFsaW5rIFdpRmkgaW50ZXJmYWNlLgotICAqLwotc3RhdGljIGludCBSdG1wT1NOZXREZXZSZXF1ZXN0TmFtZSgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBQTkVUX0RFViBkZXYsCi0JSU4gUFNUUklORyBwUHJlZml4U3RyLAotCUlOIElOVAlkZXZJZHgpCi17Ci0JUE5FVF9ERVYJCWV4aXN0TmV0RGV2OwotCVNUUklORwkJc3VmZml4TmFtZVtJRk5BTVNJWl07Ci0JU1RSSU5HCQlkZXNpcmVkTmFtZVtJRk5BTVNJWl07Ci0JaW50CWlmTmFtZUlkeCwgcHJlZml4TGVuLCBzbG90TmFtZUxlbjsKLQlpbnQgU3RhdHVzOwotCi0KLQlwcmVmaXhMZW4gPSBzdHJsZW4ocFByZWZpeFN0cik7Ci0JQVNTRVJUKChwcmVmaXhMZW4gPCBJRk5BTVNJWikpOwotCi0JZm9yIChpZk5hbWVJZHggPSBkZXZJZHg7IGlmTmFtZUlkeCA8IDMyOyBpZk5hbWVJZHgrKykKLQl7Ci0JCW1lbXNldChzdWZmaXhOYW1lLCAwLCBJRk5BTVNJWik7Ci0JCW1lbXNldChkZXNpcmVkTmFtZSwgMCwgSUZOQU1TSVopOwotCQlzdHJuY3B5KCZkZXNpcmVkTmFtZVswXSwgcFByZWZpeFN0ciwgcHJlZml4TGVuKTsKLQotI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAotCQlpZiAocEFkLT5NQ19Sb3dJRCA+PSAwKQotCQkJc3ByaW50ZihzdWZmaXhOYW1lLCAiJTAyZF8lZCIsIHBBZC0+TUNfUm93SUQsIGlmTmFtZUlkeCk7Ci0JCWVsc2UKLSNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KLQkJc3ByaW50ZihzdWZmaXhOYW1lLCAiJWQiLCBpZk5hbWVJZHgpOwotCi0JCXNsb3ROYW1lTGVuID0gc3RybGVuKHN1ZmZpeE5hbWUpOwotCQlBU1NFUlQoKChzbG90TmFtZUxlbiArIHByZWZpeExlbikgPCBJRk5BTVNJWikpOwotCQlzdHJjYXQoZGVzaXJlZE5hbWUsIHN1ZmZpeE5hbWUpOwotCi0JCWV4aXN0TmV0RGV2ID0gUnRtcE9TTmV0RGV2R2V0QnlOYW1lKGRldiwgJmRlc2lyZWROYW1lWzBdKTsKLQkJaWYgKGV4aXN0TmV0RGV2ID09IE5VTEwpCi0JCQlicmVhazsKLQkJZWxzZQotCQkJUnRtcE9TTmV0RGV2aWNlUmVmUHV0KGV4aXN0TmV0RGV2KTsKLQl9Ci0KLQlpZihpZk5hbWVJZHggPCAzMikKLQl7Ci0JCXN0cmNweSgmZGV2LT5uYW1lWzBdLCAmZGVzaXJlZE5hbWVbMF0pOwotCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKLQkJCQkJKCJDYW5ub3QgcmVxdWVzdCBEZXZOYW1lIHdpdGggcHJlaWZ4KCVzKSBhbmQgaW4gcmFuZ2UoMH4zMikgYXMgc3VmZml4IGZyb20gT1MhXG4iLCBwUHJlZml4U3RyKSk7Ci0JCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JcmV0dXJuIFN0YXR1czsKLX0KLQotCi12b2lkIFJ0bXBPU05ldERldkNsb3NlKAotCUlOIFBORVRfREVWIHBOZXREZXYpCi17Ci0JZGV2X2Nsb3NlKHBOZXREZXYpOwotfQotCi0KLXZvaWQgUnRtcE9TTmV0RGV2RnJlZShQTkVUX0RFViBwTmV0RGV2KQotewotCUFTU0VSVChwTmV0RGV2KTsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQlmcmVlX25ldGRldihwTmV0RGV2KTsKLSNlbHNlCi0Ja2ZyZWUocE5ldERldik7Ci0jZW5kaWYKLX0KLQotCi1JTlQgUnRtcE9TTmV0RGV2QWxsb2MoCi0JSU4gUE5FVF9ERVYgKm5ld19kZXZfcCwKLQlJTiBVSU5UMzIJcHJpdkRhdGFTaXplKQotewotCS8vIGFzc2lnbiBpdCBhcyBudWxsIGZpcnN0LgotCSpuZXdfZGV2X3AgPSBOVUxMOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWxsb2NhdGUgYSBuZXQgZGV2aWNlIHdpdGggcHJpdmF0ZSBkYXRhIHNpemU9JWQhXG4iLCBwcml2RGF0YVNpemUpKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgyMDQwMiAvLyBSZWQgSGF0IDcuMQotCSpuZXdfZGV2X3AgPSBhbGxvY19uZXRkZXYocHJpdkRhdGFTaXplLCAiZXRoJWQiLCBldGhlcl9zZXR1cCk7Ci0jZWxzZQotCSpuZXdfZGV2X3AgPSBhbGxvY19ldGhlcmRldihwcml2RGF0YVNpemUpOwotI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLwotCi0JaWYgKCpuZXdfZGV2X3ApCi0JCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotCWVsc2UKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci19Ci0KLQotUE5FVF9ERVYgUnRtcE9TTmV0RGV2R2V0QnlOYW1lKFBORVRfREVWIHBOZXREZXYsIFBTVFJJTkcgcERldk5hbWUpCi17Ci0JUE5FVF9ERVYJcFRhcmdldE5ldERldiA9IE5VTEw7Ci0KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjQpCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNikKLQlwVGFyZ2V0TmV0RGV2ID0gZGV2X2dldF9ieV9uYW1lKGRldl9uZXQocE5ldERldiksIHBEZXZOYW1lKTsKLSNlbHNlCi0JQVNTRVJUKHBOZXREZXYpOwotCXBUYXJnZXROZXREZXYgPSBkZXZfZ2V0X2J5X25hbWUocE5ldERldi0+bmRfbmV0LCBwRGV2TmFtZSk7Ci0jZW5kaWYKLSNlbHNlCi0JcFRhcmdldE5ldERldiA9IGRldl9nZXRfYnlfbmFtZShwRGV2TmFtZSk7Ci0jZW5kaWYgLy8gS0VSTkVMX1ZFUlNJT04oMiw2LDI0KSAvLwotCi0jZWxzZQotCWludAlkZXZOYW1lTGVuOwotCi0JZGV2TmFtZUxlbiA9IHN0cmxlbihwRGV2TmFtZSk7Ci0JQVNTRVJUKChkZXZOYW1lTGVuIDw9IElGTkFNU0laKSk7Ci0KLQlmb3IocFRhcmdldE5ldERldj1kZXZfYmFzZTsgcFRhcmdldE5ldERldiE9TlVMTDsgcFRhcmdldE5ldERldj1wVGFyZ2V0TmV0RGV2LT5uZXh0KQotCXsKLQkJaWYgKHN0cm5jbXAocFRhcmdldE5ldERldi0+bmFtZSwgcERldk5hbWUsIGRldk5hbWVMZW4pID09IDApCi0JCQlicmVhazsKLQl9Ci0jZW5kaWYgLy8gS0VSTkVMX1ZFUlNJT04oMiw1LDApIC8vCi0KLQlyZXR1cm4gcFRhcmdldE5ldERldjsKLX0KLQotCi12b2lkIFJ0bXBPU05ldERldmljZVJlZlB1dChQTkVUX0RFViBwTmV0RGV2KQotewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQkvKgotCQlldmVyeSB0aW1lIGRldl9nZXRfYnlfbmFtZSBpcyBjYWxsZWQsIGFuZCBpdCBoYXMgcmV0dXJuZWQgYSB2YWxpZCBzdHJ1Y3QKLQkJbmV0X2RldmljZSosIGRldl9wdXQgc2hvdWxkIGJlIGNhbGxlZCBhZnRlcndhcmRzLCBiZWNhdXNlIG90aGVyd2lzZSB0aGUKLQkJbWFjaGluZSBoYW5ncyB3aGVuIHRoZSBkZXZpY2UgaXMgdW5yZWdpc3RlcmVkIChzaW5jZSBkZXYtPnJlZmNudCA+IDEpLgotCSovCi0JaWYocE5ldERldikKLQkJZGV2X3B1dChwTmV0RGV2KTsKLSNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KLX0KLQotCi1JTlQgUnRtcE9TTmV0RGV2RGVzdG9yeSgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBQTkVUX0RFVgkJcE5ldERldikKLXsKLQotCS8vIFRPRE86IE5lZWQgdG8gZml4IHRoaXMKLQlwcmludGsoIldBUk5JTkc6IFRoaXMgZnVuY3Rpb24oJXMpIG5vdCBpbXBsZW1lbnQgeWV0ISEhXG4iLCBfX0ZVTkNUSU9OX18pOwotCXJldHVybiAwOwotfQotCi0KLXZvaWQgUnRtcE9TTmV0RGV2RGV0YWNoKFBORVRfREVWIHBOZXREZXYpCi17Ci0JdW5yZWdpc3Rlcl9uZXRkZXYocE5ldERldik7Ci19Ci0KLQotaW50IFJ0bXBPU05ldERldkF0dGFjaCgKLQlJTiBQTkVUX0RFViBwTmV0RGV2LAotCUlOIFJUTVBfT1NfTkVUREVWX09QX0hPT0sgKnBEZXZPcEhvb2spCi17Ci0JaW50IHJldCwgcnRubF9sb2NrZWQgPSBGQUxTRTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJ0bXBPU05ldERldkF0dGFjaCgpLS0tPlxuIikpOwotCS8vIElmIHdlIG5lZWQgaG9vayBzb21lIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHRoZSBuZXQgZGV2aWNlIHN0cnVjdHJ1ZSwgbm93IGRvIGl0LgotCWlmIChwRGV2T3BIb29rKQotCXsKLQkJUFJUTVBfQURBUFRFUiBwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihwTmV0RGV2KTsKLQotCQlwTmV0RGV2LT5uZXRkZXZfb3BzID0gcERldk9wSG9vay0+bmV0ZGV2X29wczsKLQotCQkvKiBPUyBzcGVjaWZpYyBmbGFncywgaGVyZSB3ZSB1c2VkIHRvIGluZGljYXRlIGlmIHdlIGFyZSB2aXJ0dWFsIGludGVyZmFjZSAqLwotCQlwTmV0RGV2LT5wcml2X2ZsYWdzID0gcERldk9wSG9vay0+cHJpdl9mbGFnczsKLQotI2lmIChXSVJFTEVTU19FWFQgPCAyMSkgJiYgKFdJUkVMRVNTX0VYVCA+PSAxMikKLQkJcE5ldERldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gcnQyOHh4X2dldF93aXJlbGVzc19zdGF0czsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWYgV0lSRUxFU1NfRVhUID49IDEyCi0JCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQotCQl7Ci0JCQlwTmV0RGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZydDI4eHhfaXdfaGFuZGxlcl9kZWY7Ci0JCX0KLSNlbmRpZiAvL1dJUkVMRVNTX0VYVCA+PSAxMgotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKLSNpZiBXSVJFTEVTU19FWFQgPj0gMTIKLQkJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKLQkJewotCQkJcE5ldERldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmcnQyOHh4X2FwX2l3X2hhbmRsZXJfZGVmOwotCQl9Ci0jZW5kaWYgLy9XSVJFTEVTU19FWFQgPj0gMTIKLSNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLwotCi0JCS8vIGNvcHkgdGhlIG5ldCBkZXZpY2UgbWFjIGFkZHJlc3MgdG8gdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlLgotCQlOZGlzTW92ZU1lbW9yeShwTmV0RGV2LT5kZXZfYWRkciwgJnBEZXZPcEhvb2stPmRldkFkZHJbMF0sIE1BQ19BRERSX0xFTik7Ci0KLQkJcnRubF9sb2NrZWQgPSBwRGV2T3BIb29rLT5uZWVkUHJvdGN0ZWQ7Ci0JfQotCi0JaWYgKHJ0bmxfbG9ja2VkKQotCQlyZXQgPSByZWdpc3Rlcl9uZXRkZXZpY2UocE5ldERldik7Ci0JZWxzZQotCQlyZXQgPSByZWdpc3Rlcl9uZXRkZXYocE5ldERldik7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tUnRtcE9TTmV0RGV2QXR0YWNoKCksIHJldD0lZFxuIiwgcmV0KSk7Ci0JaWYgKHJldCA9PSAwKQotCQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQllbHNlCi0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotfQotCi0KLVBORVRfREVWIFJ0bXBPU05ldERldkNyZWF0ZSgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBJTlQJCQlkZXZUeXBlLAotCUlOIElOVAkJCWRldk51bSwKLQlJTiBJTlQJCQlwcml2TWVtU2l6ZSwKLQlJTiBQU1RSSU5HCQlwTmFtZVByZWZpeCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldiA9IE5VTEw7Ci0JaW50IHN0YXR1czsKLQotCi0JLyogYWxsb2NhdGUgYSBuZXcgbmV0d29yayBkZXZpY2UgKi8KLQlzdGF0dXMgPSBSdG1wT1NOZXREZXZBbGxvYygmcE5ldERldiwgMCAvKnByaXZNZW1TaXplKi8pOwotCWlmIChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCS8qIGFsbG9jYXRpb24gZmFpbCwgZXhpdCAqLwotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBbGxvY2F0ZSBuZXR3b3JrIGRldmljZSBmYWlsICglcykuLi5cbiIsIHBOYW1lUHJlZml4KSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCi0JLyogZmluZCBhIGF2YWlsYWJsZSBpbnRlcmZhY2UgbmFtZSwgbWF4IDMyIGludGVyZmFjZXMgKi8KLQlzdGF0dXMgPSBSdG1wT1NOZXREZXZSZXF1ZXN0TmFtZShwQWQsIHBOZXREZXYsIHBOYW1lUHJlZml4LCBkZXZOdW0pOwotCWlmIChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCS8qIGVycm9yISBubyBhbnkgYXZhaWxhYmxlIHJhIG5hbWUgY2FuIGJlIHVzZWQhICovCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzc2lnbiBpbnRlcmZhY2UgbmFtZSAoJXMgd2l0aCBzdWZmaXggMH4zMikgZmFpbGVkLi4uXG4iLCBwTmFtZVByZWZpeCkpOwotCQlSdG1wT1NOZXREZXZGcmVlKHBOZXREZXYpOwotCi0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgbmFtZSBvZiB0aGUgbmV3ICVzIGludGVyZmFjZSBpcyAlcy4uLlxuIiwgcE5hbWVQcmVmaXgsIHBOZXREZXYtPm5hbWUpKTsKLQl9Ci0KLQlyZXR1cm4gcE5ldERldjsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfbGludXguaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfbGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk3MGU3OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2xpbnV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM0ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0JcnRfbGludXguaAotCi0gICAgQWJzdHJhY3Q6Ci0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaWZuZGVmIF9fUlRfTElOVVhfSF9fCi0jZGVmaW5lIF9fUlRfTElOVVhfSF9fCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KLSNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0jaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KLQotI2lmZGVmIElORl9BTUFaT05fUFBBCi0jaW5jbHVkZSA8YXNtL2FtYXpvbl9zZS9pZnhfcHBhX2ludGVyZmFjZS5oPgotI2luY2x1ZGUgPGFzbS9hbWF6b25fc2UvaWZ4X3BwYV9ob29rLmg+Ci0jZW5kaWYgLy8gSU5GX0FNQVpPTl9QUEEgLy8KLQotLy8gbG9hZCBmaXJtd2FyZQotI2RlZmluZSBfX0tFUk5FTF9TWVNDQUxMU19fCi0jaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CS8vIGZvciBnZXRfdW5hbGlnbmVkKCkKLQotI2lmZGVmIEtUSFJFQURfU1VQUE9SVAotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNlbmRpZiAvLyBLVEhSRUFEX1NVUFBPUlQgLy8KLQotI3VuZGVmIEFQX1dTQ19JTkNMVURFRAotI3VuZGVmIFNUQV9XU0NfSU5DTFVERUQKLSN1bmRlZiBXU0NfSU5DTFVERUQKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotI2lmZGVmIEtUSFJFQURfU1VQUE9SVAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiw0KQotI2Vycm9yICJUaGlzIGtlcm5lIHZlcnNpb24gZG9lc24ndCBzdXBwb3J0IGt0aHJlYWQhISIKLSNlbmRpZgotI2VuZGlmIC8vIEtUSFJFQURfU1VQUE9SVCAvLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCVByb2ZpbGUgcmVsYXRlZCBzZWN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSNkZWZpbmUgU1RBX1BST0ZJTEVfUEFUSAkJCSIvZXRjL1dpcmVsZXNzL1JUMjg2MFNUQS9SVDI4NjBTVEEuZGF0IgotI2RlZmluZSBTVEFfRFJJVkVSX1ZFUlNJT04JCQkiMi4xLjAuMCIKLSNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKLSNkZWZpbmUgQ0FSRF9JTkZPX1BBVEgJCQkiL2V0Yy9XaXJlbGVzcy9SVDI4NjBTVEEvUlQyODYwU1RBQ2FyZC5kYXQiCi0jZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCi1leHRlcm4JY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHJ0Mjh4eF9pd19oYW5kbGVyX2RlZjsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCi1leHRlcm4JY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHJ0Mjh4eF9hcF9pd19oYW5kbGVyX2RlZjsKLSNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCUNvbXBpbGVyIHJlbGF0ZWQgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSN1bmRlZiBfX2lubGluZQotI2RlZmluZSBfX2lubGluZQkJc3RhdGljIGlubGluZQotI2RlZmluZSBJTgotI2RlZmluZSBPVVQKLSNkZWZpbmUgSU5PVVQKLSNkZWZpbmUgTkRJU19TVEFUVVMJCUlOVAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJT1MgU3BlY2lmaWMgZGVmaW5pdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QgcGNpX2RldgkJKiBQUENJX0RFVjsKLXR5cGVkZWYgc3RydWN0IG5ldF9kZXZpY2UJKiBQTkVUX0RFVjsKLXR5cGVkZWYgdm9pZAkJCQkqIFBORElTX1BBQ0tFVDsKLXR5cGVkZWYgY2hhcgkJCQlORElTX1BBQ0tFVDsKLXR5cGVkZWYgUE5ESVNfUEFDS0VUCQkqIFBQTkRJU19QQUNLRVQ7Ci10eXBlZGVmCWRtYV9hZGRyX3QJCQlORElTX1BIWVNJQ0FMX0FERFJFU1M7Ci10eXBlZGVmCWRtYV9hZGRyX3QJCQkqIFBORElTX1BIWVNJQ0FMX0FERFJFU1M7Ci10eXBlZGVmIHZvaWQJCQkJKiBORElTX0hBTkRMRTsKLXR5cGVkZWYgY2hhcgkJCQkqIFBORElTX0JVRkZFUjsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCi10eXBlZGVmCXN0cnVjdCBwaWQgKglSVE1QX09TX1BJRDsKLSNlbHNlCi10eXBlZGVmIHBpZF90CQkJCVJUTVBfT1NfUElEOwotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IHNlbWFwaG9yZQlSVE1QX09TX1NFTTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2lmbmRlZiBQQ0lfREVWSUNFCi0jZGVmaW5lIFBDSV9ERVZJQ0UodmVuZCxkZXYpIFwKLQkudmVuZG9yID0gKHZlbmQpLCAuZGV2aWNlID0gKGRldiksIFwKLQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwgLnN1YmRldmljZSA9IFBDSV9BTllfSUQKLSNlbmRpZiAvLyBQQ0lfREVWSUNFIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0jZGVmaW5lIFJUX01PRF9JTkNfVVNFX0NPVU5UKCkgXAotCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKSBcCi0JeyBcCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBjYW5ub3QgcmVzZXJ2ZSBtb2R1bGVcbiIsIF9fRlVOQ1RJT05fXykpOyBcCi0JCXJldHVybiAtMTsgXAotCX0KLQotI2RlZmluZSBSVF9NT0RfREVDX1VTRV9DT1VOVCgpIG1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwotI2Vsc2UKLSNkZWZpbmUgUlRfTU9EX0lOQ19VU0VfQ09VTlQoKQlNT0RfSU5DX1VTRV9DT1VOVDsKLSNkZWZpbmUgUlRfTU9EX0RFQ19VU0VfQ09VTlQoKSBNT0RfREVDX1VTRV9DT1VOVDsKLSNlbmRpZgotCi0jZGVmaW5lIFJUTVBfSU5DX1JFRihfQSkJCTAKLSNkZWZpbmUgUlRNUF9ERUNfUkVGKF9BKQkJMAotI2RlZmluZSBSVE1QX0dFVF9SRUYoX0EpCQkwCi0KLQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgotLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHF1ZXJ5IC9wcm9jCi1zdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cygKLSAgICBJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7Ci0jZW5kaWYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCU5ldHdvcmsgcmVsYXRlZCBjb25zdGFudCBkZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBJRk5BTVNJWgotI2RlZmluZSBJRk5BTVNJWiAxNgotI2VuZGlmCi0KLSNkZWZpbmUgRVRIX0xFTkdUSF9PRl9BRERSRVNTCTYKLQotI2RlZmluZSBORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgMHgwMAotI2RlZmluZSBORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBORElTX1NUQVRVU19JTlZBTElEX0RBVEEJCQkJMHgwMgotI2RlZmluZSBORElTX1NUQVRVU19SRVNPVVJDRVMgICAgICAgICAgICAgICAgICAgMHgwMwotCi0jZGVmaW5lIE5ESVNfU0VUX1BBQ0tFVF9TVEFUVVMoX3AsIF9zdGF0dXMpCQkJZG97fSB3aGlsZSgwKQotI2RlZmluZSBOZGlzV3JpdGVFcnJvckxvZ0VudHJ5KF9hLCBfYiwgX2MsIF9kKQkJZG97fSB3aGlsZSgwKQotCi0vKiBzdGF0aXN0aWNzIGNvdW50ZXIgKi8KLSNkZWZpbmUgU1RBVFNfSU5DX1JYX1BBQ0tFVFMoX3BBZCwgX2RldikKLSNkZWZpbmUgU1RBVFNfSU5DX1RYX1BBQ0tFVFMoX3BBZCwgX2RldikKLQotI2RlZmluZSBTVEFUU19JTkNfUlhfQllURVNTKF9wQWQsIF9kZXYsIGxlbikKLSNkZWZpbmUgU1RBVFNfSU5DX1RYX0JZVEVTUyhfcEFkLCBfZGV2LCBsZW4pCi0KLSNkZWZpbmUgU1RBVFNfSU5DX1JYX0VSUk9SUyhfcEFkLCBfZGV2KQotI2RlZmluZSBTVEFUU19JTkNfVFhfRVJST1JTKF9wQWQsIF9kZXYpCi0KLSNkZWZpbmUgU1RBVFNfSU5DX1JYX0RST1BQRUQoX3BBZCwgX2RldikKLSNkZWZpbmUgU1RBVFNfSU5DX1RYX0RST1BQRUQoX3BBZCwgX2RldikKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCVJhbGluayBTcGVjaWZpYyBuZXR3b3JrIHJlbGF0ZWQgY29uc3RhbnQgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX0FJRAkJCTB4MDAJCS8vMHgwMH4weDNmCi0jZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9NQlNTSUQJCTB4MDAJCS8vMHgwMCwweDEwLDB4MjAsMHgzMAotI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTCQkJMHgxMAkJLy8weDQwLDB4NTAsMHg2MCwweDcwCi0jZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9BUENMSQkJMHgyMAotI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfTUVTSAkJCTB4MzAKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX0RMUwkJCTB4NDAKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNkZWZpbmUgTkVUX0RFVklDRV9SRUFMX0lEWF9NQVNLCQkweDBmCQkvLyBmb3IgZWFjaCBvcGVyYXRpb24gbW9kZSwgd2UgbWF4aW11bSBzdXBwb3J0IDE1IGVudGl0aWVzLgotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNkZWZpbmUgTkRJU19QQUNLRVRfVFlQRV9ESVJFQ1RFRAkJMAotI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVAkJMQotI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVAkJMgotI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QJMwotI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX1BST01JU0NVT1VTCTQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCU9TIHNpZ25hbGluZyByZWxhdGVkIGNvbnN0YW50IGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglPUyBmaWxlIG9wZXJhdGlvbiByZWxhdGVkIGRhdGEgc3RydWN0dXJlIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCBmaWxlKiBSVE1QX09TX0ZEOwotCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9PU19GU19JTkZPXwotewotCWludAkJCQlmc3VpZDsKLQlpbnQJCQkJZnNnaWQ7Ci0JbW1fc2VnbWVudF90CWZzOwotfVJUTVBfT1NfRlNfSU5GTzsKLQotI2RlZmluZSBJU19GSUxFX09QRU5fRVJSKF9mZCkJSVNfRVJSKChfZmQpKQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJT1Mgc2VtYXBob3JlIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmUgYW5kIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3Qgb3NfbG9jayAgewotCXNwaW5sb2NrX3QJCWxvY2s7Ci0JdW5zaWduZWQgbG9uZwlmbGFnczsKLX07Ci0KLXR5cGVkZWYgc3BpbmxvY2tfdAkJCU5ESVNfU1BJTl9MT0NLOwotCi0vLwotLy8gIHNwaW5fbG9jayBlbmhhbmNlZCBmb3IgTmVzdGVkIHNwaW4gbG9jawotLy8KLSNkZWZpbmUgTmRpc0FsbG9jYXRlU3BpbkxvY2soX19sb2NrKSAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3Bpbl9sb2NrX2luaXQoKHNwaW5sb2NrX3QgKikoX19sb2NrKSk7ICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIE5kaXNGcmVlU3BpbkxvY2sobG9jaykgICAgICAgICAgXAotCWRve313aGlsZSgwKQotCi0KLSNkZWZpbmUgUlRNUF9TRU1fTE9DSyhfX2xvY2spCQkJCQlcCi17CQkJCQkJCQkJCQkJXAotCXNwaW5fbG9ja19iaCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsJCVwKLX0KLQotI2RlZmluZSBSVE1QX1NFTV9VTkxPQ0soX19sb2NrKQkJCQkJXAotewkJCQkJCQkJCQkJCVwKLQlzcGluX3VubG9ja19iaCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsJCVwKLX0KLQotCi0vLyBzYW1wbGUsIHVzZSBzZW1hcGhvcmUgbG9jayB0byByZXBsYWNlIElSUSBsb2NrLCAyMDA3LzExLzE1Ci0jZGVmaW5lIFJUTVBfSVJRX0xPQ0soX19sb2NrLCBfX2lycWZsYWdzKQkJCVwKLXsJCQkJCQkJCQkJCQkJXAotCV9faXJxZmxhZ3MgPSAwOwkJCQkJCQkJCVwKLQlzcGluX2xvY2tfYmgoKHNwaW5sb2NrX3QgKikoX19sb2NrKSk7CQkJXAotCXBBZC0+aXJxX2Rpc2FibGVkIHw9IDE7IFwKLX0KLQotI2RlZmluZSBSVE1QX0lSUV9VTkxPQ0soX19sb2NrLCBfX2lycWZsYWcpCQkJXAotewkJCQkJCQkJCQkJCQlcCi0JcEFkLT5pcnFfZGlzYWJsZWQgJj0gMDsJCQkJCQkJXAotCXNwaW5fdW5sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCVwKLX0KLQotI2RlZmluZSBSVE1QX0lOVF9MT0NLKF9fbG9jaywgX19pcnFmbGFncykJCQlcCi17CQkJCQkJCQkJCQkJCVwKLQlzcGluX2xvY2tfaXJxc2F2ZSgoc3BpbmxvY2tfdCAqKV9fbG9jaywgX19pcnFmbGFncyk7CVwKLX0KLQotI2RlZmluZSBSVE1QX0lOVF9VTkxPQ0soX19sb2NrLCBfX2lycWZsYWcpCQkJXAotewkJCQkJCQkJCQkJCQlcCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgoc3BpbmxvY2tfdCAqKShfX2xvY2spLCAoKHVuc2lnbmVkIGxvbmcpX19pcnFmbGFnKSk7CVwKLX0KLQotI2RlZmluZSBOZGlzQWNxdWlyZVNwaW5Mb2NrCQlSVE1QX1NFTV9MT0NLCi0jZGVmaW5lIE5kaXNSZWxlYXNlU3BpbkxvY2sJCVJUTVBfU0VNX1VOTE9DSwotCi0jaWZuZGVmIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0Ci0jZGVmaW5lIF9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIGNvbmRpdGlvbiwgcmV0KSBcCi1kbyB7IFwKLSAgICAgICAgd2FpdF9xdWV1ZV90IF9fd2FpdDsgXAotICAgICAgICBpbml0X3dhaXRxdWV1ZV9lbnRyeSgmX193YWl0LCBjdXJyZW50KTsgXAotICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOyBcCi0gICAgICAgIGZvciAoOzspIHsgXAotICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7IFwKLSAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgXAotICAgICAgICAgICAgICAgIGlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsgXAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2NoZWR1bGVfdGltZW91dChyZXQpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJldCkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgXAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IFwKLSAgICAgICAgICAgICAgICB9IFwKLSAgICAgICAgICAgICAgICByZXQgPSAtRVJFU1RBUlRTWVM7IFwKLSAgICAgICAgICAgICAgICBicmVhazsgXAotICAgICAgICB9IFwKLSAgICAgICAgY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7IFwKLSAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJndxLCAmX193YWl0KTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCB0aW1lb3V0KSBcCi0oeyBcCi0gICAgICAgIGxvbmcgX19yZXQgPSB0aW1lb3V0OyBcCi0gICAgICAgIGlmICghKGNvbmRpdGlvbikpIFwKLSAgICAgICAgICAgICAgICBfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIF9fcmV0KTsgXAotICAgICAgICBfX3JldDsgXAotfSkKLSNlbmRpZgotCi0jZGVmaW5lIFJUTVBfU0VNX0VWRU5UX0lOSVRfTE9DS0VEKF9wU2VtYSkJc2VtYV9pbml0KChfcFNlbWEpLCAwKQotI2RlZmluZSBSVE1QX1NFTV9FVkVOVF9JTklUKF9wU2VtYSkJCQlzZW1hX2luaXQoKF9wU2VtYSksIDEpCi0jZGVmaW5lIFJUTVBfU0VNX0VWRU5UX1dBSVQoX3BTZW1hLCBfc3RhdHVzKQkoKF9zdGF0dXMpID0gZG93bl9pbnRlcnJ1cHRpYmxlKChfcFNlbWEpKSkKLSNkZWZpbmUgUlRNUF9TRU1fRVZFTlRfVVAoX3BTZW1hKQkJCXVwKF9wU2VtYSkKLQotI2lmZGVmIEtUSFJFQURfU1VQUE9SVAotI2RlZmluZSBSVE1QX1dBSVRfRVZFTlRfSU5URVJSVVBUSUJMRShfcEFkLCBfcFRhc2spIFwKLXsgXAotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoX3BUYXNrLT5rdGhyZWFkX3EsIFwKLQkJCQkJCQkJIF9wVGFzay0+a3RocmVhZF9ydW5uaW5nIHx8IGt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7IFwKLQkJX3BUYXNrLT5rdGhyZWFkX3J1bm5pbmcgPSBGQUxTRTsgXAotCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKSBcCi0JCXsgXAotCQkJUlRNUF9TRVRfRkxBRyhfcEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOyBcCi0JCQlicmVhazsgXAotCQl9IFwKLX0KLSNlbmRpZgotCi0jaWZkZWYgS1RIUkVBRF9TVVBQT1JUCi0jZGVmaW5lIFdBS0VfVVAoX3BUYXNrKSBcCi0JZG97IFwKLQkJaWYgKChfcFRhc2spLT5rdGhyZWFkX3Rhc2spIFwKLSAgICAgICAgeyBcCi0JCQkoX3BUYXNrKS0+a3RocmVhZF9ydW5uaW5nID0gVFJVRTsgXAotCSAgICAgICAgd2FrZV91cCgmKF9wVGFzayktPmt0aHJlYWRfcSk7IFwKLQkJfSBcCi0JfXdoaWxlKDApCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglPUyBNZW1vcnkgQWNjZXNzIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmUgYW5kIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIE1FTV9BTExPQ19GTEFHICAgICAgKEdGUF9BVE9NSUMpIC8vKEdGUF9ETUEgfCBHRlBfQVRPTUlDKQotCi0jZGVmaW5lIE5kaXNNb3ZlTWVtb3J5KERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkgbWVtbW92ZShEZXN0aW5hdGlvbiwgU291cmNlLCBMZW5ndGgpCi0jZGVmaW5lIE5kaXNDb3B5TWVtb3J5KERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkgbWVtY3B5KERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkKLSNkZWZpbmUgTmRpc1plcm9NZW1vcnkoRGVzdGluYXRpb24sIExlbmd0aCkgICAgICAgICBtZW1zZXQoRGVzdGluYXRpb24sIDAsIExlbmd0aCkKLSNkZWZpbmUgTmRpc0ZpbGxNZW1vcnkoRGVzdGluYXRpb24sIExlbmd0aCwgRmlsbCkgICBtZW1zZXQoRGVzdGluYXRpb24sIEZpbGwsIExlbmd0aCkKLSNkZWZpbmUgTmRpc0NtcE1lbW9yeShEZXN0aW5hdGlvbiwgU291cmNlLCBMZW5ndGgpICBtZW1jbXAoRGVzdGluYXRpb24sIFNvdXJjZSwgTGVuZ3RoKQotI2RlZmluZSBOZGlzRXF1YWxNZW1vcnkoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSAgICghbWVtY21wKFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkpCi0jZGVmaW5lIFJUTVBFcXVhbE1lbW9yeShTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpCSghbWVtY21wKFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkpCi0KLSNkZWZpbmUgTWxtZUFsbG9jYXRlTWVtb3J5KF9wQWQsIF9wcFZBKQkJb3NfYWxsb2NfbWVtKF9wQWQsIF9wcFZBLCBNR01UX0RNQV9CVUZGRVJfU0laRSkKLSNkZWZpbmUgTWxtZUZyZWVNZW1vcnkoX3BBZCwgX3BWQSkJCQlvc19mcmVlX21lbShfcEFkLCBfcFZBKQotCi0jZGVmaW5lIENPUFlfTUFDX0FERFIoQWRkcjEsIEFkZHIyKSAgICAgICAgICAgICBtZW1jcHkoKEFkZHIxKSwgKEFkZHIyKSwgTUFDX0FERFJfTEVOKQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJT1MgdGFzayByZWxhdGVkIGRhdGEgc3RydWN0dXJlIGFuZCBkZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBSVE1QX09TX01HTVRfVEFTS19GTEFHUwlDTE9ORV9WTQotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKLXR5cGVkZWYJc3RydWN0IHBpZCAqCVRIUkVBRF9QSUQ7Ci0jZGVmaW5lCVRIUkVBRF9QSURfSU5JVF9WQUxVRQlOVUxMCi0jZGVmaW5lCUdFVF9QSUQoX3YpCWZpbmRfZ2V0X3BpZCgoX3YpKQotI2RlZmluZQlHRVRfUElEX05VTUJFUihfdikJcGlkX25yKChfdikpCi0jZGVmaW5lIENIRUNLX1BJRF9MRUdBTElUWShfcGlkKQlpZiAocGlkX25yKChfcGlkKSkgPj0gMCkKLSNkZWZpbmUgS0lMTF9USFJFQURfUElEKF9BLCBfQiwgX0MpCWtpbGxfcGlkKChfQSksIChfQiksIChfQykpCi0jZWxzZQotdHlwZWRlZglwaWRfdAlUSFJFQURfUElEOwotI2RlZmluZQlUSFJFQURfUElEX0lOSVRfVkFMVUUJLTEKLSNkZWZpbmUJR0VUX1BJRChfdikJKF92KQotI2RlZmluZQlHRVRfUElEX05VTUJFUihfdikJKF92KQotI2RlZmluZSBDSEVDS19QSURfTEVHQUxJVFkoX3BpZCkJaWYgKChfcGlkKSA+PSAwKQotI2RlZmluZSBLSUxMX1RIUkVBRF9QSUQoX0EsIF9CLCBfQykJa2lsbF9wcm9jKChfQSksIChfQiksIChfQykpCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgIFJUTVBfTkVUX1RBU0tfU1RSVUNUOwotdHlwZWRlZiBzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgICpQUlRNUF9ORVRfVEFTS19TVFJVQ1Q7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaW1lciByZWxhdGVkIGRlZmluaXRpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgT1NfSFoJCQlIWgotCi10eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0CU5ESVNfTUlOSVBPUlRfVElNRVI7Ci10eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0CVJUTVBfT1NfVElNRVI7Ci10eXBlZGVmIHZvaWQgKCpUSU1FUl9GVU5DVElPTikodW5zaWduZWQgbG9uZyk7Ci0KLQotI2RlZmluZSBPU19XQUlUKF90aW1lKSBcCi17CWludCBfaTsgXAotCWxvbmcgX2xvb3AgPSAoKF90aW1lKS8oMTAwMC9PU19IWikpID4gMCA/ICgoX3RpbWUpLygxMDAwL09TX0haKSkgOiAxO1wKLQl3YWl0X3F1ZXVlX2hlYWRfdCBfd2FpdDsgXAotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJl93YWl0KTsgXAotCWZvciAoX2k9MDsgX2k8KF9sb29wKTsgX2krKykgXAotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChfd2FpdCwgMCwgT05FX1RJQ0spOyB9Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0jZGVmaW5lIFJUTVBfVElNRV9BRlRFUihhLGIpCQlcCi0JKHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZylhKSAmJiBcCi0JIHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZyliKSAmJiBcCi0JICgobG9uZykoYikgLSAobG9uZykoYSkgPCAwKSkKLQotI2RlZmluZSBSVE1QX1RJTUVfQUZURVJfRVEoYSxiKQlcCi0JKHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZylhKSAmJiBcCi0JIHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZyliKSAmJiBcCi0JICgobG9uZykoYSkgLSAobG9uZykoYikgPj0gMCkpCi0jZGVmaW5lIFJUTVBfVElNRV9CRUZPUkUoYSxiKQlSVE1QX1RJTUVfQUZURVJfRVEoYixhKQotI2Vsc2UKLSNkZWZpbmUgdHlwZWNoZWNrKHR5cGUseCkgXAotKHsgICAgICB0eXBlIF9fZHVtbXk7IFwKLSAgICAgICAgdHlwZW9mKHgpIF9fZHVtbXkyOyBcCi0gICAgICAgICh2b2lkKSgmX19kdW1teSA9PSAmX19kdW1teTIpOyBcCi0gICAgICAgIDE7IFwKLX0pCi0jZGVmaW5lIFJUTVBfVElNRV9BRlRFUl9FUShhLGIpCVwKLQkodHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWEpICYmIFwKLQkgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWIpICYmIFwKLQkgKChsb25nKShhKSAtIChsb25nKShiKSA+PSAwKSkKLSNkZWZpbmUgUlRNUF9USU1FX0JFRk9SRShhLGIpCVJUTVBfVElNRV9BRlRFUl9FUShiLGEpCi0jZGVmaW5lIFJUTVBfVElNRV9BRlRFUihhLGIpIHRpbWVfYWZ0ZXIoYSwgYikKLSNlbmRpZgotCi0jZGVmaW5lIE9ORV9USUNLIDEKLQotc3RhdGljIGlubGluZSB2b2lkIE5kaXNHZXRTeXN0ZW1VcFRpbWUoVUxPTkcgKnRpbWUpCi17Ci0JKnRpbWUgPSBqaWZmaWVzOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJT1Mgc3BlY2lmaWMgY29va2llIGRhdGEgc3RydWN0dXJlIGJpbmRpbmcgdG8gUlRNUF9BREFQVEVSCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBvc19jb29raWUgewotI2lmZGVmIFJUTVBfTUFDX1BDSQotCXN0cnVjdCBwY2lfZGV2CQkJKnBjaV9kZXY7Ci0Jc3RydWN0IHBjaV9kZXYJCQkqcGFyZW50X3BjaV9kZXY7Ci0JVVNIT1JUICAgICAgICAgICAgICAgICAgRGV2aWNlSUQ7Ci0JZG1hX2FkZHJfdAkJCQlwQWRfcGE7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCVJUTVBfTkVUX1RBU0tfU1RSVUNUIHJ4X2RvbmVfdGFzazsKLQlSVE1QX05FVF9UQVNLX1NUUlVDVCBtZ210X2RtYV9kb25lX3Rhc2s7Ci0JUlRNUF9ORVRfVEFTS19TVFJVQ1QgYWMwX2RtYV9kb25lX3Rhc2s7Ci0JUlRNUF9ORVRfVEFTS19TVFJVQ1QgYWMxX2RtYV9kb25lX3Rhc2s7Ci0JUlRNUF9ORVRfVEFTS19TVFJVQ1QgYWMyX2RtYV9kb25lX3Rhc2s7Ci0JUlRNUF9ORVRfVEFTS19TVFJVQ1QgYWMzX2RtYV9kb25lX3Rhc2s7Ci0JLypSVE1QX05FVF9UQVNLX1NUUlVDVCBoY2NhX2RtYV9kb25lX3Rhc2s7Ki8KLQlSVE1QX05FVF9UQVNLX1NUUlVDVCB0YnR0X3Rhc2s7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JUlRNUF9ORVRfVEFTS19TVFJVQ1QgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0KLQotCXVuc2lnbmVkIGxvbmcJCQlhcGRfcGlkOyAvLzgwMi4xeCBkYWVtb24gcGlkCi0JSU5UCQkJCQkJaW9jdGxfaWZfdHlwZTsKLQlJTlQJCQkJCWlvY3RsX2lmOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgb3NfY29va2llCSogUE9TX0NPT0tJRTsKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJT1MgZGVidWdnaW5nIGFuZCBwcmludGluZyByZWxhdGVkIGRlZmluaXRpb25zIGFuZCBkYXRhIHN0cnVjdHVyZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBQUklOVF9NQUMoYWRkcikJXAotCWFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0KLQotI2lmZGVmIERCRwotZXh0ZXJuIFVMT05HCQlSVERlYnVnTGV2ZWw7Ci0KLSNkZWZpbmUgREJHUFJJTlRfUkFXKExldmVsLCBGbXQpICAgIFwKLWRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChMZXZlbCA8PSBSVERlYnVnTGV2ZWwpICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwcmludGsgRm10OyAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX13aGlsZSgwKQotCi0jZGVmaW5lIERCR1BSSU5UKExldmVsLCBGbXQpICAgIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KQotCi0KLSNkZWZpbmUgREJHUFJJTlRfRVJSKEZtdCkgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIkVSUk9SISEhICIpOyAgICAgICAgICBcCi0gICAgcHJpbnRrIEZtdDsgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgREJHUFJJTlRfUyhTdGF0dXMsIEZtdCkJCVwKLXsJCQkJCQkJCQlcCi0JcHJpbnRrIEZtdDsJCQkJCVwKLX0KLSNlbHNlCi0jZGVmaW5lIERCR1BSSU5UKExldmVsLCBGbXQpCi0jZGVmaW5lIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KQotI2RlZmluZSBEQkdQUklOVF9TKFN0YXR1cywgRm10KQotI2RlZmluZSBEQkdQUklOVF9FUlIoRm10KQotI2VuZGlmCi0KLSN1bmRlZiAgQVNTRVJUCi0jZGVmaW5lIEFTU0VSVCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghKHgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyBfX0ZJTEVfXyAiOiVkIGFzc2VydCAiICN4ICJmYWlsZWRcbiIsIF9fTElORV9fKTsgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLXZvaWQgaGV4X2R1bXAoY2hhciAqc3RyLCB1bnNpZ25lZCBjaGFyICpwU3JjQnVmVkEsIHVuc2lnbmVkIGludCBTcmNCdWZMZW4pOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlUaGUgZm9sbG93aW5nIGNvZGUgYXJlIG5vdCByZXZpc2VkLCB0ZW1wb3JhcnkgcHV0IGl0IGhlcmUuCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIERldmljZSBETUEgQWNjZXNzIHJlbGF0ZWQgZGVmaW5pdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIFJUTVBfTUFDX1BDSQotZG1hX2FkZHJfdCBsaW51eF9wY2lfbWFwX3NpbmdsZSh2b2lkICpoYW5kbGUsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIGludCBzZF9pZHgsIGludCBkaXJlY3Rpb24pOwotdm9pZCBsaW51eF9wY2lfdW5tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pOwotCi0jZGVmaW5lIFBDSV9NQVBfU0lOR0xFKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfc2RfaWR4LCBfZGlyKSBcCi0JbGludXhfcGNpX21hcF9zaW5nbGUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9zZF9pZHgsIF9kaXIpCi0KLSNkZWZpbmUgUENJX1VOTUFQX1NJTkdMRShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX2RpcikgXAotCWxpbnV4X3BjaV91bm1hcF9zaW5nbGUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9kaXIpCi0KLSNkZWZpbmUgUENJX0FMTE9DX0NPTlNJU1RFTlQoX3BjaV9kZXYsIF9zaXplLCBfcHRyKSBcCi0JcGNpX2FsbG9jX2NvbnNpc3RlbnQoX3BjaV9kZXYsIF9zaXplLCBfcHRyKQotCi0jZGVmaW5lIFBDSV9GUkVFX0NPTlNJU1RFTlQoX3BjaV9kZXYsIF9zaXplLCBfdmlydHVhbF9hZGRyLCBfcGh5c2ljYWxfYWRkcikgXAotCXBjaV9mcmVlX2NvbnNpc3RlbnQoX3BjaV9kZXYsIF9zaXplLCBfdmlydHVhbF9hZGRyLCBfcGh5c2ljYWxfYWRkcikKLQotI2RlZmluZSBERVZfQUxMT0NfU0tCKF9sZW5ndGgpIFwKLQlkZXZfYWxsb2Nfc2tiKF9sZW5ndGgpCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCi0vKgotICogVUxPTkcKLSAqIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KAotICogICBJTiBORElTX1BIWVNJQ0FMX0FERFJFU1MgIFBoeXNpY2FsQWRkcmVzcyk7Ci0gKi8KLSNkZWZpbmUgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3coUGh5c2ljYWxBZGRyZXNzKQkJKFBoeXNpY2FsQWRkcmVzcykKLQotLyoKLSAqIFVMT05HCi0gKiBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goCi0gKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzKTsKLSAqLwotI2RlZmluZSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goUGh5c2ljYWxBZGRyZXNzKQkJKDApCi0KLS8qCi0gKiBWT0lECi0gKiBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdygKLSAqICAgSU4gTkRJU19QSFlTSUNBTF9BRERSRVNTICBQaHlzaWNhbEFkZHJlc3MsCi0gKiAgIElOIFVMT05HICBWYWx1ZSk7Ci0gKi8KLSNkZWZpbmUgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3coUGh5c2ljYWxBZGRyZXNzLCBWYWx1ZSkJXAotCQkJUGh5c2ljYWxBZGRyZXNzID0gVmFsdWU7Ci0KLS8qCi0gKiBWT0lECi0gKiBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2goCi0gKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzLAotICogICBJTiBVTE9ORyAgVmFsdWUpOwotICovCi0jZGVmaW5lIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChQaHlzaWNhbEFkZHJlc3MsIFZhbHVlKQotCi0jZGVmaW5lIE5kaXNNSW5kaWNhdGVTdGF0dXMoX3csIF94LCBfeSwgX3opCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIERldmljZSBSZWdpc3RlciBJL08gQWNjZXNzIHJlbGF0ZWQgZGVmaW5pdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2lmIGRlZmluZWQoSU5GX1RXSU5QQVNTKSB8fCBkZWZpbmVkKElORl9EQU5VQkUpIHx8IGRlZmluZWQoSUtBTk9TX1ZYXzFYMCkKLS8vUGF0Y2ggZm9yIEFTSUMgdHVyc3QgcmVhZC93cml0ZSBidWcsIG5lZWRzIHRvIHJlbW92ZSBhZnRlciBtZXRlbCBmaXgKLSNkZWZpbmUgUlRNUF9JT19SRUFEMzIoX0EsIF9SLCBfcFYpCQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJXAotICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCVwKLQkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpKTsJCQlcCi0JKCpfcFYgPSBTV0FQMzIoKigoVUlOVDMyICopKF9wVikpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIFJUTVBfSU9fUkVBRDgoX0EsIF9SLCBfcFYpCQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJXAotCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCVwKLQkoKl9wViA9IHJlYWRiKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpKTsJCQlcCi19Ci0KLSNkZWZpbmUgUlRNUF9JT19XUklURTMyKF9BLCBfUiwgX1YpCQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJXAotICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCVVJTlQzMglfVmFsOwkJCQkJCQkJCQkJCQlcCi0JX1ZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJCVwKLQlfVmFsID0gU1dBUDMyKF9WKTsJCQkJCQkJCQkJCQlcCi0Jd3JpdGVsKF9WYWwsICh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwkJCVwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBSVE1QX0lPX1dSSVRFOChfQSwgX1IsIF9WKQkJCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJCVwKLQlVSU5UCVZhbDsJCQkJCQkJCQkJCQkJXAotCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJCVwKLQl3cml0ZWIoKF9WKSwgKFBVQ0hBUikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CQkJXAotfQotCi0jZGVmaW5lIFJUTVBfSU9fV1JJVEUxNihfQSwgX1IsIF9WKQkJCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJCVwKLQlVSU5UCVZhbDsJCQkJCQkJCQkJCQkJXAotCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJCVwKLQl3cml0ZXcoU1dBUDE2KChfVikpLCAoUFVTSE9SVCkoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CVwKLX0KLSNlbHNlCi0vL1BhdGNoIGZvciBBU0lDIHR1cnN0IHJlYWQvd3JpdGUgYnVnLCBuZWVkcyB0byByZW1vdmUgYWZ0ZXIgbWV0ZWwgZml4Ci0jZGVmaW5lIFJUTVBfSU9fUkVBRDMyKF9BLCBfUiwgX3BWKQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQlcCi0gICAgaWYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKSk7CQlcCi0JCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSkpOwkJCVwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UJCQkJCQkJCQkJCQkJCQlcCi0JCSpfcFYgPSAwOwkJCQkJCQkJCQkJCQlcCi19Ci0KLSNkZWZpbmUgUlRNUF9JT19GT1JDRV9SRUFEMzIoX0EsIF9SLCBfcFYpCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJCVwKLQkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKSk7CQlcCi0JKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKSk7CQkJXAotfQotCi0jZGVmaW5lIFJUTVBfSU9fUkVBRDgoX0EsIF9SLCBfcFYpCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCVwKLQkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKSk7CQkJXAotCSgqX3BWID0gcmVhZGIoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSkpOwkJCQlcCi19Ci0KLSNkZWZpbmUgUlRNUF9JT19XUklURTMyKF9BLCBfUiwgX1YpCQkJCQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlVSU5UCVZhbDsJCQkJCQkJCQkJCQkJCQkJXAotCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJCQlcCi0Jd3JpdGVsKChfViksICh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwkJCQkJCQkJXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgUlRNUF9JT19GT1JDRV9XUklURTMyKF9BLCBfUiwgX1YpCQkJCQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCVVJTlQJVmFsOwkJCQkJCQkJCQkJCQkJCQlcCi0JVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJCVwKLQl3cml0ZWwoX1YsICh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwkJCQkJCQkJXAotfQotCi0KLQotI2lmIGRlZmluZWQoQlJDTV82MzU4KSB8fCBkZWZpbmVkKFJBTElOS18yODgwKSB8fCBkZWZpbmVkKFJBTElOS18zMDUyKQotI2RlZmluZSBSVE1QX0lPX1dSSVRFOChfQSwgX1IsIF9WKSAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgIFwKLQlVTE9ORyBWYWw7ICAgICAgICAgICAgICAgIFwKLQlVQ0hBUiBfaTsgICAgICAgICAgICAgICAgXAotCV9pID0gKChfUikgJiAweDMpOyAgICAgICAgICAgICBcCi0JVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoKF9SKSAtIF9pKSkpOyAgIFwKLQlWYWwgPSBWYWwgJiAofigweDAwMDAwMGZmIDw8ICgoX2kpKjgpKSk7ICAgICAgICAgXAotCVZhbCA9IFZhbCB8ICgoVUxPTkcpKF9WKSA8PCAoKF9pKSo4KSk7ICAgICAgICAgXAotCXdyaXRlbCgoVmFsKSwgKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoKF9SKSAtIF9pKSkpOyAgICBcCi19Ci0jZWxzZQotI2RlZmluZSBSVE1QX0lPX1dSSVRFOChfQSwgX1IsIF9WKQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJXAotCVVJTlQJVmFsOwkJCQkJCQkJCQkJCVwKLQlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CVwKLQl3cml0ZWIoKF9WKSwgKFBVQ0hBUikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CQlcCi19Ci0jZW5kaWYgLy8gI2lmIGRlZmluZWQoQlJDTV82MzU4KSB8fCBkZWZpbmVkKFJBTElOS18yODgwKSAvLwotCi0jZGVmaW5lIFJUTVBfSU9fV1JJVEUxNihfQSwgX1IsIF9WKQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJXAotCVVJTlQJVmFsOwkJCQkJCQkJCQkJXAotCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJXAotCXdyaXRldygoX1YpLCAoUFVTSE9SVCkoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CVwKLX0KLSNlbmRpZiAvLyAjaWYgZGVmaW5lZChJTkZfVFdJTlBBU1MpIHx8IGRlZmluZWQoSU5GX0RBTlVCRSkgfHwgZGVmaW5lZChJS0FOT1NfVlhfMVgwKSAvLwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglOZXR3b3JrIFJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmUgYW5kIG1hcmNvIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFBLVFNSQ19ORElTICAgICAgICAgICAgIDB4N2YKLSNkZWZpbmUgUEtUU1JDX0RSSVZFUiAgICAgICAgICAgMHgwZgotCi0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjkpCi0jZGVmaW5lIFJUTVBfT1NfTkVUREVWX1NFVF9QUklWKF9wTmV0RGV2LCBfcFByaXYpCSgoX3BOZXREZXYpLT5wcml2ID0gKF9wUHJpdikpCi0jZGVmaW5lIFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKF9wTmV0RGV2KQkJKChfcE5ldERldiktPnByaXYpCi0jZWxzZQotI2RlZmluZSBSVE1QX09TX05FVERFVl9TRVRfUFJJVihfcE5ldERldiwgX3BQcml2KQkoKF9wTmV0RGV2KS0+bWxfcHJpdiA9IChfcFByaXYpKQotI2RlZmluZSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihfcE5ldERldikJCSgoX3BOZXREZXYpLT5tbF9wcml2KQotI2VuZGlmCi0jZGVmaW5lIFJUTVBfT1NfTkVUREVWX0dFVF9ERVZOQU1FKF9wTmV0RGV2KQkoKF9wTmV0RGV2KS0+bmFtZSkKLSNkZWZpbmUgUlRNUF9PU19ORVRERVZfR0VUX1BIWUFERFIoX1BORVRERVYpCSgoX1BORVRERVYpLT5kZXZfYWRkcikKLQotI2RlZmluZSBSVE1QX09TX05FVERFVl9TVEFSVF9RVUVVRShfcE5ldERldikJbmV0aWZfc3RhcnRfcXVldWUoKF9wTmV0RGV2KSkKLSNkZWZpbmUgUlRNUF9PU19ORVRERVZfU1RPUF9RVUVVRShfcE5ldERldikJbmV0aWZfc3RvcF9xdWV1ZSgoX3BOZXREZXYpKQotI2RlZmluZSBSVE1QX09TX05FVERFVl9XQUtFX1FVRVVFKF9wTmV0RGV2KQluZXRpZl93YWtlX3F1ZXVlKChfcE5ldERldikpCi0jZGVmaW5lIFJUTVBfT1NfTkVUREVWX0NBUlJJRVJfT0ZGKF9wTmV0RGV2KQluZXRpZl9jYXJyaWVyX29mZigoX3BOZXREZXYpKQotCi0jZGVmaW5lIFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpIFwKLQkoUE5ESVNfUEFDS0VUKShwRW50cnkpCi0KLSNkZWZpbmUgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpIFwKLQkoUFFVRVVFX0VOVFJZKShwUGFja2V0KQotCi0jaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCi0jZGVmaW5lIEJSSURHRV9UQUcgMHgzNTU2NDI1MiAgICAvLyBkZXBlbmRzIG9uIDVWVCBkZWZpbmUgaW4gYnJfaW5wdXQuYwotI2VuZGlmCi0KLSNkZWZpbmUgR0VUX1NHX0xJU1RfRlJPTV9QQUNLRVQoX3AsIF9zYykJXAotICAgIHJ0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KF9wLCBfc2MpCi0KLSNkZWZpbmUgUkVMRUFTRV9ORElTX1BBQ0tFVChfcEFkLCBfcFBhY2tldCwgX1N0YXR1cykgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgUlRNUEZyZWVOZGlzUGFja2V0KF9wQWQsIF9wUGFja2V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotLyoKLSAqIHBhY2tldCBoZWxwZXIKLSAqCS0gY29udmVydCBpbnRlcm5hbCBydCBwYWNrZXQgdG8gb3MgcGFja2V0IG9yCi0gKiAgICAgICAgICAgICBvcyBwYWNrZXQgdG8gcnQgcGFja2V0Ci0gKi8KLSNkZWZpbmUgUlRQS1RfVE9fT1NQS1QoX3ApCQkoKHN0cnVjdCBza19idWZmICopKF9wKSkKLSNkZWZpbmUgT1NQS1RfVE9fUlRQS1QoX3ApCQkoKFBORElTX1BBQ0tFVCkoX3ApKQotCi0jZGVmaW5lIEdFVF9PU19QS1RfREFUQVBUUihfcGt0KSBcCi0JCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZGF0YSkKLSNkZWZpbmUgU0VUX09TX1BLVF9EQVRBUFRSKF9wa3QsIF9kYXRhUHRyKQlcCi0JCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZGF0YSkgPSAoX2RhdGFQdHIpCi0KLSNkZWZpbmUgR0VUX09TX1BLVF9MRU4oX3BrdCkgXAotCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmxlbikKLSNkZWZpbmUgU0VUX09TX1BLVF9MRU4oX3BrdCwgX2xlbikJXAotCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmxlbikgPSAoX2xlbikKLQotI2RlZmluZSBHRVRfT1NfUEtUX0RBVEFUQUlMKF9wa3QpIFwKLQkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT50YWlsKQotI2RlZmluZSBTRVRfT1NfUEtUX0RBVEFUQUlMKF9wa3QsIF9zdGFydCwgX2xlbikJXAotCQkoKFJUUEtUX1RPX09TUEtUKF9wa3QpKS0+dGFpbCkgPSAoUFVDSEFSKSgoX3N0YXJ0KSArIChfbGVuKSkKLQotI2RlZmluZSBHRVRfT1NfUEtUX0hFQUQoX3BrdCkgXAotCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmhlYWQpCi0KLSNkZWZpbmUgR0VUX09TX1BLVF9FTkQoX3BrdCkgXAotCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmVuZCkKLQotI2RlZmluZSBHRVRfT1NfUEtUX05FVERFVihfcGt0KSBcCi0JCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZGV2KQotI2RlZmluZSBTRVRfT1NfUEtUX05FVERFVihfcGt0LCBfcE5ldERldikJXAotCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmRldikgPSAoX3BOZXREZXYpCi0KLSNkZWZpbmUgR0VUX09TX1BLVF9UWVBFKF9wa3QpIFwKLQkJKFJUUEtUX1RPX09TUEtUKF9wa3QpKQotCi0jZGVmaW5lIEdFVF9PU19QS1RfTkVYVChfcGt0KSBcCi0JCShSVFBLVF9UT19PU1BLVChfcGt0KS0+bmV4dCkKLQotCi0jZGVmaW5lIE9TX1BLVF9DTE9ORUQoX3BrdCkJCXNrYl9jbG9uZWQoUlRQS1RfVE9fT1NQS1QoX3BrdCkpCi0KLSNkZWZpbmUgT1NfTlRPSFMoX1ZhbCkgXAotCQkobnRvaHMoX1ZhbCkpCi0jZGVmaW5lIE9TX0hUT05TKF9WYWwpIFwKLQkJKGh0b25zKF9WYWwpKQotI2RlZmluZSBPU19OVE9ITChfVmFsKSBcCi0JCShudG9obChfVmFsKSkKLSNkZWZpbmUgT1NfSFRPTkwoX1ZhbCkgXAotCQkoaHRvbmwoX1ZhbCkpCi0KLSNkZWZpbmUgQ0JfT0ZGICAxMAotCi0vLyBVc2VyIFByaW9yaXR5Ci0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9VUChfcCwgX3ByaW8pCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzBdID0gX3ByaW8pCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9VUChfcCkJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRiswXSkKLQotLy8gRnJhZ21lbnQgIwotI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfRlJBR01FTlRTKF9wLCBfbnVtKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzFdID0gX251bSkKLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhfcCkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMV0pCi0KLS8vIDB4MCB+MHg3ZjogVFggdG8gQVAncyBvd24gQlNTIHdoaWNoIGhhcyB0aGUgc3BlY2lmaWVkIEFJRC4gaWYgQUlEPjEyNywgc2V0IGJpdCA3IGluIFJUTVBfU0VUX1BBQ0tFVF9FTUFDVEFCIHRvby4KLS8vKHRoaXMgdmFsdWUgYWxzbyBhcyBNQUMob24tY2hpcCBXQ0lEKSB0YWJsZSBpbmRleCkKLS8vIDB4ODB+MHhmZjogVFggdG8gYSBXRFMgbGluay4gYjB+NjogV0RTIGluZGV4Ci0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9XQ0lEKF9wLCBfd2RzaWR4KQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzJdID0gX3dkc2lkeCkKLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1dDSUQoX3ApCQkJKChVQ0hBUikoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMl0pKQotCi0vLyAweGZmOiBQS1RTUkNfTkRJUywgb3RoZXJzOiBsb2NhbCBUWCBidWZmZXIgaW5kZXguIFRoaXMgdmFsdWUgYWZmZWN0cyBob3cgdG8gYSBwYWNrZXQKLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShfcCwgX3BrdHNyYykJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRiszXSA9IF9wa3RzcmMpCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9TT1VSQ0UoX3ApCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzNdKQotCi0vLyBSVFMvQ1RTLXRvLXNlbGYgcHJvdGVjdGlvbiBtZXRob2QKLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1JUUyhfcCwgX251bSkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNF0gPSBfbnVtKQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfUlRTKF9wKQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNF0pCi0vLyBzZWUgUlRNUF9TKEcpRVRfUEFDS0VUX0VNQUNUQUIKLQotLy8gVFggcmF0ZSBpbmRleAotI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfVFhSQVRFKF9wLCBfcmF0ZSkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis1XSA9IF9yYXRlKQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfVFhSQVRFKF9wKQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNV0pCi0KLS8vIEZyb20gd2hpY2ggSW50ZXJmYWNlCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9JRihfcCwgX2lmZHgpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNl0gPSBfaWZkeCkKLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0lGKF9wKQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNl0pCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX01CU1NJRChfcCwgX2JzcykJCVJUTVBfU0VUX1BBQ0tFVF9JRigoX3ApLCAoX2JzcykpCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX1dEUyhfcCwgX2JzcykJCVJUTVBfU0VUX1BBQ0tFVF9JRigoX3ApLCAoKF9ic3MpICsgTUlOX05FVF9ERVZJQ0VfRk9SX1dEUykpCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX0FQQ0xJKF9wLCBfaWR4KQlSVE1QX1NFVF9QQUNLRVRfSUYoKF9wKSwgKChfaWR4KSArIE1JTl9ORVRfREVWSUNFX0ZPUl9BUENMSSkpCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX01FU0goX3AsIF9pZHgpCVJUTVBfU0VUX1BBQ0tFVF9JRigoX3ApLCAoKF9pZHgpICsgTUlOX05FVF9ERVZJQ0VfRk9SX01FU0gpKQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQoX3ApCQkJUlRNUF9HRVRfUEFDS0VUX0lGKChfcCkpCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKF9wKQkJCQkJUlRNUF9HRVRfUEFDS0VUX0lGKChfcCkpCi0KLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX01PUkVEQVRBKF9wLCBfbW9yZWJpdCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis3XSA9IF9tb3JlYml0KQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTU9SRURBVEEoX3ApCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis3XSkKLQotCi0KLQotCi0vLwotLy8JU2VwY2lmaWMgUGFrY2V0IFR5cGUgZGVmaW5pdGlvbgotLy8KLSNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfQ0JfT0ZGU0VUCTExCi0KLSNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUAkJMHgwMQotI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTAkJMHgwMgotI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19JUFY0CQkweDA0Ci0jZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSQkJMHgwOAotI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19WTEFOCQkweDEwCi0jZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0xMQ1NOQVAJMHgyMAotCi0vL1NwZWNpZmljCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9TUEVDSUZJQyhfcCwgX2ZsZykJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gPSBfZmxnKQotCi0vL0RIQ1AKLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0RIQ1AoX3AsIF9mbGcpCQkJCQkJCQkJCQkJCQlcCi0JCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1ApOwkJXAotCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUCk7CVwKLQkJCX13aGlsZSgwKQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfREhDUChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQKQotCi0vL0VBUE9MCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9FQVBPTChfcCwgX2ZsZykJCQkJCQkJCQkJCQkJCVwKLQkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wpOwkJXAotCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wpOwlcCi0JCQl9d2hpbGUoMCkKLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0VBUE9MKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX0VBUE9MKQotCi0vL1dBSQotI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfV0FJKF9wLCBfZmxnKQkJCQkJCQkJCQkJCQkJXAotCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pIHw9IChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19XQUkpOwkJXAotCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfV0FJKTsJXAotCQkJfXdoaWxlKDApCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9XQUkoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfV0FJKQotCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9MT1dSQVRFKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTCB8IFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1AgfCBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19XQUkpKQotCi0vL1ZMQU4KLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1ZMQU4oX3AsIF9mbGcpCQkJCQkJCQkJCQkJCQlcCi0JCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX1ZMQU4pOwkJXAotCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfVkxBTik7CVwKLQkJCX13aGlsZSgwKQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfVkxBTihfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19WTEFOKQotCi0vL0xMQy9TTkFQCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9MTENTTkFQKF9wLCBfZmxnKQkJCQkJCQkJCQkJCQlcCi0JCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX0xMQ1NOQVApOwkJXAotCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfTExDU05BUCk7CQlcCi0JCQl9d2hpbGUoMCkKLQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTExDU05BUChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19MTENTTkFQKQotCi0vLyBJUAotI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfSVBWNChfcCwgX2ZsZykJCQkJCQkJCQkJCQkJCVwKLQkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNCk7CQlcCi0JCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19JUFY0KTsJXAotCQkJfXdoaWxlKDApCi0KLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0lQVjQoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNCkKLQotCi0vLyBJZiB0aGlzIGZsYWcgaXMgc2V0LCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGlzIEVBUG9MIGZyYW1lIE1VU1QgYmUgY2xlYXIuCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUoX3AsIF9mbGcpICAgKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzEyXSA9IF9mbGcpCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUoX3ApICAgICAgICAgKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzEyXSkKLQotCi0KLS8qIHVzZSBiaXQzIG9mIGNiW0NCX09GRisxNl0gKi8KLQotI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfNVZUKF9wLCBfZmxnKSAgIChSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisyMl0gPSBfZmxnKQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfNVZUKF9wKSAgICAgICAgIChSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisyMl0pCi0KLSNpZmRlZiBJTkZfQU1BWk9OX1NFCi0vKiBbQ0JfT0ZGKzI4XSwgMUIsIEl2ZXJzb24gcGF0Y2ggZm9yIFdNTSBBNS1UMDcgLFdpcmVsZXNzU3RhVG9XaXJlbGVzc1N0YSBkbyBub3QgYnVsayBvdXQgYWdncmVnYXRlICovCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9OT0JVTEtPVVQoX3AsIF9tb3JlYml0KQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisyOF0gPSBfbW9yZWJpdCkKLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX05PQlVMS09VVChfcCkJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisyOF0pCi0jZW5kaWYgLy8gSU5GX0FNQVpPTl9TRSAvLwotLyogTWF4IHNrYi0+Y2IgPSA0OEIgPSBbQ0JfT0ZGKzM4XSAqLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglPdGhlciBmdW5jdGlvbiBwcm90b3R5cGVzIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFJUTVBfR2V0Q3VycmVudFN5c3RlbVRpbWUoTEFSR0VfSU5URUdFUiAqdGltZSk7Ci1pbnQgcnQyOHh4X3BhY2tldF94bWl0KHN0cnVjdCBza19idWZmICpza2IpOwotCi0KLXZvaWQgRmxhc2hXcml0ZShVQ0hBUiAqIHAsIFVMT05HIGEsIFVMT05HIGIpOwotdm9pZCBGbGFzaFJlYWQoVUNIQVIgKiBwLCBVTE9ORyBhLCBVTE9ORyBiKTsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDIwNDAyCS8vIFJlZCBIYXQgNy4xCi1zdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfbmV0ZGV2KGludCBzaXplb2ZfcHJpdiwgY29uc3QgY2hhciAqbWFzaywgdm9pZCAoKnNldHVwKShzdHJ1Y3QgbmV0X2RldmljZSAqKSk7Ci0jZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCi0KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotLyogZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotI2RlZmluZSBJUlFfSEFORExFX1RZUEUgIGlycXJldHVybl90Ci0jZWxzZQotI2RlZmluZSBJUlFfSEFORExFX1RZUEUgIHZvaWQKLSNlbmRpZgotCi1JUlFfSEFORExFX1RZUEUKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxOSkpCi1ydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSk7Ci0jZWxzZQotcnQyODYwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLSNlbmRpZgotCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLUlOVCBydDI4eHhfaW9jdGwoCi0JSU4JUE5FVF9ERVYJCW5ldF9kZXYsCi0JSU4JT1VUCXN0cnVjdCBpZnJlcQkqcnEsCi0JSU4JSU5UCQkJY21kKTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1JTlQgcnQyOHh4X3N0YV9pb2N0bCgKLQlJTglQTkVUX0RFVgkJbmV0X2RldiwKLQlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKLQlJTglJTlQJCQljbWQpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi1leHRlcm4gaW50IHJhX210ZF93cml0ZShpbnQgbnVtLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sIGNvbnN0IHVfY2hhciAqYnVmKTsKLWV4dGVybiBpbnQgcmFfbXRkX3JlYWQoaW50IG51bSwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHVfY2hhciAqYnVmKTsKLQotI2VuZGlmIC8vIF9fUlRfTElOVVhfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X21haW5fZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X21haW5fZGV2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMDdhNWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9tYWluX2Rldi5jCisrKyAvZGV2L251bGwKQEAgLTEsODk3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgcnRfbWFpbl9kZXYuYwotCi0gICAgQWJzdHJhY3Q6Ci0gICAgQ3JlYXRlIGFuZCByZWdpc3RlciBuZXR3b3JrIGludGVyZmFjZS4KLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgotCi0KLSNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAotVUlOVDMyIENXX01BWF9JTl9CSVRTOwotI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFByaXZhdGUgVmFyaWFibGVzIFVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotUFNUUklORyBtYWMgPSAiIjsJCSAgIC8vIGRlZmF1bHQgMDA6MDA6MDA6MDA6MDA6MDAKLVBTVFJJTkcgaG9zdG5hbWUgPSAiIjsJCSAgIC8vIGRlZmF1bHQgQ01QQwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDYsMTIpCi1NT0RVTEVfUEFSTSAobWFjLCAicyIpOwotI2Vsc2UKLW1vZHVsZV9wYXJhbSAobWFjLCBjaGFycCwgMCk7Ci0jZW5kaWYKLU1PRFVMRV9QQVJNX0RFU0MgKG1hYywgInJ0Mjh4eDogd2lyZWxlc3MgbWFjIGFkZHIiKTsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBQcm90b3R5cGVzIG9mIEZ1bmN0aW9ucyBVc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8vIHB1YmxpYyBmdW5jdGlvbiBwcm90b3R5cGUKLWludCBydDI4eHhfY2xvc2UoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwotaW50IHJ0Mjh4eF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKLQotLy8gcHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGUKLXN0YXRpYyBJTlQgcnQyOHh4X3NlbmRfcGFja2V0cyhJTiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3AsIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKLQotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlJUMjh4eF9nZXRfZXRoZXJfc3RhdHMoCi0gICAgSU4gIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBDbG9zZSByYXh4IGludGVyZmFjZS4KLQotQXJndW1lbnRzOgotCSpuZXRfZGV2CQkJdGhlIHJheHggaW50ZXJmYWNlIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotICAgIDAJCQkJCU9wZW4gT0sKLQlvdGhlcndpc2UJCQlPcGVuIEZhaWwKLQotTm90ZToKLQkxLiBpZiBvcGVuIGZhaWwsIGtlcm5lbCB3aWxsIG5vdCBjYWxsIHRoZSBjbG9zZSBmdW5jdGlvbi4KLQkyLiBGcmVlIG1lbW9yeSBmb3IKLQkJKDEpIE1sbWUgTWVtb3J5IEhhbmRsZXI6CQlNbG1lSGFsdCgpCi0JCSgyKSBUWCAmIFJYOgkJCQkJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgpCi0JCSgzKSBCQSBSZW9yZGVyaW5nOgkJCQliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoKQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotaW50IE1haW5WaXJ0dWFsSUZfY2xvc2UoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCi17Ci0gICAgUlRNUF9BREFQVEVSICpwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KTsKLQotCS8vIFNhbml0eSBjaGVjayBmb3IgcEFkCi0JaWYgKHBBZCA9PSBOVUxMKQotCQlyZXR1cm4gMDsgLy8gY2xvc2Ugb2sKLQotCW5ldGlmX2NhcnJpZXJfb2ZmKHBBZC0+bmV0X2Rldik7Ci0JbmV0aWZfc3RvcF9xdWV1ZShwQWQtPm5ldF9kZXYpOwotCi0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCUJPT0xFQU4JCQlDYW5jZWxsZWQ7Ci0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCS8vIHNlbmQgRExTLVRFQVJfRE9XTiBtZXNzYWdlLAotCQlpZiAocEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCi0JCXsKLQkJCVVDSEFSIGk7Ci0KLQkJCS8vIHRlYXIgZG93biBsb2NhbCBkbHMgdGFibGUgZW50cnkKLQkJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKLQkJCXsKLQkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKLQkJCQl7Ci0JCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOwotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHRlYXIgZG93biBwZWVyIGRscyB0YWJsZSBlbnRyeQotCQkJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKLQkJCXsKLQkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKLQkJCQl7Ci0JCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOwotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCQl9Ci0JCQl9Ci0JCQlSVE1QX01MTUVfSEFORExFUihwQWQpOwotCQl9Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQkJaWYgKElORlJBX09OKHBBZCkgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKLQkJewotCQkJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc1JlcTsKLQkJCU1MTUVfUVVFVUVfRUxFTSAqTXNnRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOwotCi0JCQlpZiAoTXNnRWxlbSkKLQkJCXsKLQkJCUNPUFlfTUFDX0FERFIoRGlzUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCURpc1JlcS5SZWFzb24gPSAgUkVBU09OX0RFQVVUSF9TVEFfTEVBVklORzsKLQotCQkJTXNnRWxlbS0+TWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7Ci0JCQlNc2dFbGVtLT5Nc2dUeXBlID0gTVQyX01MTUVfRElTQVNTT0NfUkVROwotCQkJTXNnRWxlbS0+TXNnTGVuID0gc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCk7Ci0JCQlOZGlzTW92ZU1lbW9yeShNc2dFbGVtLT5Nc2csICZEaXNSZXEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKTsKLQotCQkJLy8gUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMKLQkJCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7Ci0JCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7Ci0KLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DOwotCQkJTWxtZURpc2Fzc29jUmVxQWN0aW9uKHBBZCwgTXNnRWxlbSk7Ci0JCQlrZnJlZShNc2dFbGVtKTsKLQkJCX0KLQotCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJfQotCi0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsICZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLldwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyLCAmQ2FuY2VsbGVkKTsKLQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCB0byB3cGFfc3VwcGxpY2FudCBmb3IgaW5mcm9taW5nIGludGVyZmFjZSBkb3duLgotCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZDVVNUT00sIFJUX0lOVEVSRkFDRV9ET1dOLCBOVUxMLCBOVUxMLCAwKTsKLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotCi0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JVklSVFVBTF9JRl9ET1dOKHBBZCk7Ci0KLQlSVF9NT0RfREVDX1VTRV9DT1VOVCgpOwotCi0JcmV0dXJuIDA7IC8vIGNsb3NlIG9rCi19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgT3BlbiByYXh4IGludGVyZmFjZS4KLQotQXJndW1lbnRzOgotCSpuZXRfZGV2CQkJdGhlIHJheHggaW50ZXJmYWNlIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotICAgIDAJCQkJCU9wZW4gT0sKLQlvdGhlcndpc2UJCQlPcGVuIEZhaWwKLQotTm90ZToKLQkxLiBpZiBvcGVuIGZhaWwsIGtlcm5lbCB3aWxsIG5vdCBjYWxsIHRoZSBjbG9zZSBmdW5jdGlvbi4KLQkyLiBGcmVlIG1lbW9yeSBmb3IKLQkJKDEpIE1sbWUgTWVtb3J5IEhhbmRsZXI6CQlNbG1lSGFsdCgpCi0JCSgyKSBUWCAmIFJYOgkJCQkJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgpCi0JCSgzKSBCQSBSZW9yZGVyaW5nOgkJCQliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoKQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotaW50IE1haW5WaXJ0dWFsSUZfb3BlbihJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKLXsKLSAgICBSVE1QX0FEQVBURVIgKnBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKG5ldF9kZXYpOwotCi0JLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKLQlpZiAocEFkID09IE5VTEwpCi0JCXJldHVybiAwOyAvLyBjbG9zZSBvawotCi0JaWYgKFZJUlRVQUxfSUZfVVAocEFkKSAhPSAwKQotCQlyZXR1cm4gLTE7Ci0KLQkvLyBpbmNyZWFzZSBNT0RVTEUgdXNlIGNvdW50Ci0JUlRfTU9EX0lOQ19VU0VfQ09VTlQoKTsKLQotCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOwotCW5ldGlmX2NhcnJpZXJfb24obmV0X2Rldik7Ci0JbmV0aWZfd2FrZV9xdWV1ZShuZXRfZGV2KTsKLQotCXJldHVybiAwOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIENsb3NlIHJheHggaW50ZXJmYWNlLgotCi1Bcmd1bWVudHM6Ci0JKm5ldF9kZXYJCQl0aGUgcmF4eCBpbnRlcmZhY2UgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgMAkJCQkJT3BlbiBPSwotCW90aGVyd2lzZQkJCU9wZW4gRmFpbAotCi1Ob3RlOgotCTEuIGlmIG9wZW4gZmFpbCwga2VybmVsIHdpbGwgbm90IGNhbGwgdGhlIGNsb3NlIGZ1bmN0aW9uLgotCTIuIEZyZWUgbWVtb3J5IGZvcgotCQkoMSkgTWxtZSBNZW1vcnkgSGFuZGxlcjoJCU1sbWVIYWx0KCkKLQkJKDIpIFRYICYgUlg6CQkJCQlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KCkKLQkJKDMpIEJBIFJlb3JkZXJpbmc6CQkJCWJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZSgpCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1pbnQgcnQyOHh4X2Nsb3NlKElOIFBORVRfREVWIGRldikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqIG5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXY7Ci0gICAgUlRNUF9BREFQVEVSCSpwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KTsKLQlCT09MRUFOCQkJQ2FuY2VsbGVkOwotCVVJTlQzMgkJCWkgPSAwOwotCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjh4eF9jbG9zZVxuIikpOwotCi0JQ2FuY2VsbGVkID0gRkFMU0U7Ci0JLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKLQlpZiAocEFkID09IE5VTEwpCi0JCXJldHVybiAwOyAvLyBjbG9zZSBvawotCi0KLQotI2lmZGVmIFdEU19TVVBQT1JUCi0JV2RzRG93bihwQWQpOwotI2VuZGlmIC8vIFdEU19TVVBQT1JUIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfQ0xPU0UpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JCS8vIElmIGRpcnZlciBkb2Vzbid0IHdha2UgdXAgZmlybXdhcmUgaGVyZSwKLQkJLy8gTklDTG9hZEZpcm13YXJlIHdpbGwgaGFuZyBmb3JldmVyIHdoZW4gaW50ZXJmYWNlIGlzIHVwIGFnYWluLgotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLSAgICAgICAgewotCQkgICAgQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7Ci0gICAgICAgIH0KLQotCi0JCU1sbWVSYWRpb09mZihwQWQpOwotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKLQotCWZvciAoaSA9IDAgOyBpIDwgTlVNX09GX1RYX1JJTkc7IGkrKykKLQl7Ci0JCXdoaWxlIChwQWQtPkRlUXVldWVSdW5uaW5nW2ldID09IFRSVUUpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldhaXRpbmcgZm9yIFR4UXVldWVbJWRdIGRvbmUuLi4uLi4uLi4uXG4iLCBpKSk7Ci0JCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCQl9Ci0JfQotCi0KLQotCS8vIFN0b3AgTWxtZSBzdGF0ZSBtYWNoaW5lCi0JTWxtZUhhbHQocEFkKTsKLQotCS8vIENsb3NlIG5ldCB0YXNrbGV0cwotCVJ0bXBOZXRUYXNrRXhpdChwQWQpOwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJTWFjVGFibGVSZXNldChwQWQpOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0JTWVhc3VyZVJlcVRhYkV4aXQocEFkKTsKLQlUcGNSZXFUYWJFeGl0KHBBZCk7Ci0KLQotCS8vIENsb3NlIGtlcm5lbCB0aHJlYWRzCi0JUnRtcE1nbXRUYXNrRXhpdChwQWQpOwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JewotCQkJQk9PTEVBTiBicmM7Ci0JCQkvLwlVTE9ORwkJCVZhbHVlOwotCi0JCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpKQotCQkJewotCQkJCVJUTVBfQVNJQ19JTlRFUlJVUFRfRElTQUJMRShwQWQpOwotCQkJfQotCi0JCQkvLyBSZWNlaXZlIHBhY2tldHMgdG8gY2xlYXIgRE1BIGluZGV4IGFmdGVyIGRpc2FibGUgaW50ZXJydXB0LgotCQkJLy9SVE1QSGFuZGxlUnhEb25lSW50ZXJydXB0KHBBZCk7Ci0JCQkvLyBwdXQgdG8gcmFkaW8gb2ZmIHRvIHNhdmUgcG93ZXIgd2hlbiBkcml2ZXIgdW5sb2FkLiAgQWZ0ZXIgcmFkaW9vZmYsIGNhbid0IHdyaXRlIC9yZWFkIHJlZ2lzdGVyLiAgU28gbmVlZCB0byBmaW5pc2ggYWxsCi0JCQkvLyByZWdpc3RlciBhY2Nlc3MgYmVmb3JlIFJhZGlvIG9mZi4KLQotCi0JCQlicmM9UlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHBBZCwgUlRNUF9IQUxULCAwKTsKLQotLy9JbiAgc29sdXRpb24gMyBvZiAzMDkwRiwgdGhlIGJQQ0ljbGtPZmYgd2lsbCBiZSBzZXQgdG8gVFJVRSBhZnRlciBjYWxsaW5nIFJUMjh4eFBjaUFzaWNSYWRpb09mZgotCQkJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7Ci0KLQkJCWlmIChicmM9PUZBTFNFKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiJXMgY2FsbCBSVDI4eHhQY2lBc2ljUmFkaW9PZmYgZmFpbCAhIVxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCQl9Ci0JfQotCi0KLS8qCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFKSkKLQl7Ci0JCVJUTVBfQVNJQ19JTlRFUlJVUFRfRElTQUJMRShwQWQpOwotCX0KLQotCS8vIERpc2FibGUgUngsIHJlZ2lzdGVyIHZhbHVlIHN1cHBvc2VkIHdpbGwgcmVtYWluIGFmdGVyIHJlc2V0Ci0JTklDSXNzdWVSZXNldChwQWQpOwotKi8KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCS8vIEZyZWUgSVJRCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCS8vIERlcmVnaXN0ZXIgaW50ZXJydXB0IGZ1bmN0aW9uCi0JCVJUTVBfSVJRX1JFTEVBU0UobmV0X2RldikKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKTsKLQl9Ci0KLQkvLyBGcmVlIFJpbmcgb3IgVVNCIGJ1ZmZlcnMKLQlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KHBBZCk7Ci0KLQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JLy8gRnJlZSBCQSByZW9yZGVyIHJlc291cmNlCi0JYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKHBBZCk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApOwotCi0vKisrK01vZGlmeSBieSB3b29keSB0byBzb2x2ZSB0aGUgYnVsayBmYWlsKysrKi8KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjh4eF9jbG9zZVxuIikpOwotCXJldHVybiAwOyAvLyBjbG9zZSBvawotfSAvKiBFbmQgb2YgcnQyOHh4X2Nsb3NlICovCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBPcGVuIHJheHggaW50ZXJmYWNlLgotCi1Bcmd1bWVudHM6Ci0JKm5ldF9kZXYJCQl0aGUgcmF4eCBpbnRlcmZhY2UgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgMAkJCQkJT3BlbiBPSwotCW90aGVyd2lzZQkJCU9wZW4gRmFpbAotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotaW50IHJ0Mjh4eF9vcGVuKElOIFBORVRfREVWIGRldikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqIG5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXY7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KTsKLQlpbnQgcmV0dmFsID0gMDsKLQkvL1BPU19DT09LSUUgcE9iajsKLQotCi0JLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKLQlpZiAocEFkID09IE5VTEwpCi0JewotCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOwotCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KLQkJcmV0dXJuIC0xOwotCX0KLQotI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCi0JaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKLQl7Ci0JCUNXX01BWF9JTl9CSVRTID0gNjsKLQl9Ci0JZWxzZSBpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQl7Ci0JCUNXX01BWF9JTl9CSVRTID0gMTA7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCi0KLSNpZiBXSVJFTEVTU19FWFQgPj0gMTIKLQlpZiAobmV0X2Rldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKLQl7Ci0jaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKLQkJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKLQkJCW5ldF9kZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSAmcnQyOHh4X2FwX2l3X2hhbmRsZXJfZGVmOwotI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQotCQkJbmV0X2Rldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopICZydDI4eHhfaXdfaGFuZGxlcl9kZWY7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JfQotI2VuZGlmIC8vIFdJUkVMRVNTX0VYVCA+PSAxMiAvLwotCi0JLy8gUmVxdWVzdCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBQQ0kgZGV2aWNlCi0JLy8gcmVnaXN0ZXIgdGhlIGludGVycnVwdCByb3V0aW5lIHdpdGggdGhlIG9zCi0JUlRNUF9JUlFfUkVRVUVTVChuZXRfZGV2KTsKLQotCS8vIEluaXQgSVJRIHBhcmFtZXRlcnMgc3RvcmVkIGluIHBBZAotCVJUTVBfSVJRX0lOSVQocEFkKTsKLQotCS8vIENoaXAgJiBvdGhlciBpbml0Ci0JaWYgKHJ0Mjh4eF9pbml0KHBBZCwgbWFjLCBob3N0bmFtZSkgPT0gRkFMU0UpCi0JCWdvdG8gZXJyOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkvLyBFbmFibGUgSW50ZXJydXB0Ci0JUlRNUF9JUlFfRU5BQkxFKHBBZCk7Ci0KLQkvLyBOb3cgRW5hYmxlIFJ4VHgKLQlSVE1QRW5hYmxlUnhUeChwQWQpOwotCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKTsKLQotCXsKLQlVSU5UMzIgcmVnID0gMDsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTMwMCwgJnJlZyk7ICAvLyBjbGVhciBnYXJiYWdlIGludGVycnVwdHMKLQlwcmludGsoIjB4MTMwMCA9ICUwOHhcbiIsIHJlZyk7Ci0JfQotCi0JewotLy8JdTMyIHJlZzsKLS8vCVVJTlQ4ICBieXRlOwotLy8JdTE2IHRtcDsKLQotLy8JUlRNUF9JT19SRUFEMzIocEFkLCBYSUZTX1RJTUVfQ0ZHLCAmcmVnKTsKLQotLy8JdG1wID0gMHgwODA1OwotLy8JcmVnICA9IChyZWcgJiAweGZmZmYwMDAwKSB8IHRtcDsKLS8vCVJUTVBfSU9fV1JJVEUzMihwQWQsIFhJRlNfVElNRV9DRkcsIHJlZyk7Ci0KLQl9Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIFJUTVBfTUFDX1BDSQotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0gICAgICAgIFJUTVBJbml0UENJZUxpbmtDdHJsVmFsdWUocEFkKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCXJldHVybiAocmV0dmFsKTsKLQotZXJyOgotLy8rKytBZGQgYnkgc2hpYW5nLCBtb3ZlIGZyb20gcnQyOHh4X2luaXQoKSB0byBoZXJlLgotCVJUTVBfSVJRX1JFTEVBU0UobmV0X2Rldik7Ci0vLy0tLUFkZCBieSBzaGlhbmcsIG1vdmUgZnJvbSBydDI4eHhfaW5pdCgpIHRvIGhlcmUuCi0JcmV0dXJuICgtMSk7Ci19IC8qIEVuZCBvZiBydDI4eHhfb3BlbiAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHJ0MzA5MF9uZXRkZXZfb3BzID0gewotCS5uZG9fb3BlbgkJPSBNYWluVmlydHVhbElGX29wZW4sCi0JLm5kb19zdG9wCQk9IE1haW5WaXJ0dWFsSUZfY2xvc2UsCi0JLm5kb19kb19pb2N0bAkJPSBydDI4eHhfaW9jdGwsCi0JLm5kb19nZXRfc3RhdHMJCT0gUlQyOHh4X2dldF9ldGhlcl9zdGF0cywKLQkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGV0aF9tYWNfYWRkciwKLQkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCi0jaWZkZWYgSUtBTk9TX1ZYXzFYMAotCS5uZG9fc3RhcnRfeG1pdAkJPSBJS0FOT1NfRGF0YUZyYW1lc1R4LAotI2Vsc2UKLQkubmRvX3N0YXJ0X3htaXQJCT0gcnQyOHh4X3NlbmRfcGFja2V0cywKLSNlbmRpZgotfTsKLQotUE5FVF9ERVYgUnRtcFBoeU5ldERldkluaXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUlRNUF9PU19ORVRERVZfT1BfSE9PSyAqcE5ldERldkhvb2spCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UJKm5ldF9kZXYgPSBOVUxMOwotLy8JTkRJU19TVEFUVVMJCVN0YXR1czsKLQotCW5ldF9kZXYgPSBSdG1wT1NOZXREZXZDcmVhdGUocEFkLCBJTlRfTUFJTiwgMCwgc2l6ZW9mKFBSVE1QX0FEQVBURVIpLCBJTkZfTUFJTl9ERVZfTkFNRSk7Ci0JaWYgKG5ldF9kZXYgPT0gTlVMTCkKLQl7Ci0JCXByaW50aygiUnRtcFBoeU5ldERldkluaXQoKTogY3JlYXRpb24gZmFpbGVkIGZvciBtYWluIHBoeXNpY2FsIG5ldCBkZXZpY2UhXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JTmRpc1plcm9NZW1vcnkoKHVuc2lnbmVkIGNoYXIgKilwTmV0RGV2SG9vaywgc2l6ZW9mKFJUTVBfT1NfTkVUREVWX09QX0hPT0spKTsKLQlwTmV0RGV2SG9vay0+bmV0ZGV2X29wcyA9ICZydDMwOTBfbmV0ZGV2X29wczsKLQlwTmV0RGV2SG9vay0+cHJpdl9mbGFncyA9IElOVF9NQUlOOwotCXBOZXREZXZIb29rLT5uZWVkUHJvdGN0ZWQgPSBGQUxTRTsKLQotCVJUTVBfT1NfTkVUREVWX1NFVF9QUklWKG5ldF9kZXYsIHBBZCk7Ci0JLy9uZXRfZGV2LT5wcml2ID0gKFBWT0lEKXBBZDsKLQlwQWQtPm5ldF9kZXYgPSBuZXRfZGV2OwotCi0KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKLQlTRVRfTU9EVUxFX09XTkVSKG5ldF9kZXYpOwotI2VuZGlmCi0KLQluZXRpZl9zdG9wX3F1ZXVlKG5ldF9kZXYpOwotCi0JcmV0dXJuIG5ldF9kZXY7Ci0KLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIFRoZSBlbnRyeSBwb2ludCBmb3IgTGludXgga2VybmVsIHNlbnQgcGFja2V0IHRvIG91ciBkcml2ZXIuCi0KLUFyZ3VtZW50czoKLSAgICBza19idWZmICpza2IJCXRoZSBwb2ludGVyIHJlZmVyIHRvIGEgc2tfYnVmZmVyLgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgMAotCi1Ob3RlOgotCVRoaXMgZnVuY3Rpb24gaXMgdGhlIGVudHJ5IHBvaW50IG9mIFR4IFBhdGggZm9yIE9zIGRlbGl2ZXJ5IHBhY2tldCB0bwotCW91ciBkcml2ZXIuIFlvdSBvbmx5IGNhbiBwdXQgT1MtZGVwZW5lZCAmIFNUQS9BUCBjb21tb24gaGFuZGxlIHByb2NlZHVyZXMKLQlpbiBoZXJlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotaW50IHJ0Mjh4eF9wYWNrZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gc2tiLT5kZXY7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KTsKLQlpbnQgc3RhdHVzID0gMDsKLQlQTkRJU19QQUNLRVQgcFBhY2tldCA9IChQTkRJU19QQUNLRVQpIHNrYjsKLQotCS8qIFJUMjg3MFNUQSBkb2VzIHRoaXMgaW4gUlRNUFNlbmRQYWNrZXRzKCkgKi8KLSNpZmRlZiBSQUxJTktfQVRFCi0JaWYgKEFURV9PTihwQWQpKQotCXsKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1JFU09VUkNFUyk7Ci0JCXJldHVybiAwOwotCX0KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJLy8gRHJvcCBzZW5kIHJlcXVlc3Qgc2luY2Ugd2UgYXJlIGluIG1vbml0b3IgbW9kZQotCQlpZiAoTU9OSVRPUl9PTihwQWQpKQotCQl7Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSAgICAgICAgLy8gRWFwb2xTdGFydCBzaXplIGlzIDE4Ci0JaWYgKHNrYi0+bGVuIDwgMTQpCi0JewotCQkvL3ByaW50aygiYmFkIHBhY2tldCBzaXplOiAlZFxuIiwgcGt0LT5sZW4pOwotCQloZXhfZHVtcCgiYmFkIHBhY2tldCIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQotCi0JUlRNUF9TRVRfUEFDS0VUXzVWVChwUGFja2V0LCAwKTsKLS8vCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgcGt0LT5kYXRhLCBwa3QtPmxlbik7Ci0jaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCi0gICAgaWYgKCooaW50Kikoc2tiLT5jYikgPT0gQlJJREdFX1RBRykgewotCQlSVE1QX1NFVF9QQUNLRVRfNVZUKHBQYWNrZXQsIDEpOwotICAgIH0KLSNlbmRpZgotCi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCi0JCVNUQVNlbmRQYWNrZXRzKChORElTX0hBTkRMRSlwQWQsIChQUE5ESVNfUEFDS0VUKSAmcFBhY2tldCwgMSk7Ci0JfQotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlzdGF0dXMgPSAwOwotZG9uZToKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBTZW5kIGEgcGFja2V0IHRvIFdMQU4uCi0KLUFyZ3VtZW50czoKLSAgICBza2JfcCAgICAgICAgICAgcG9pbnRzIHRvIG91ciBhZGFwdGVyCi0gICAgZGV2X3AgICAgICAgICAgIHdoaWNoIFdMQU4gbmV0d29yayBpbnRlcmZhY2UKLQotUmV0dXJuIFZhbHVlOgotICAgIDA6IHRyYW5zbWl0IHN1Y2Nlc3NmdWxseQotICAgIG90aGVyd2lzZTogdHJhbnNtaXQgZmFpbAotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIGludCBydDI4eHhfc2VuZF9wYWNrZXRzKAotCUlOIHN0cnVjdCBza19idWZmCQkqc2tiX3AsCi0JSU4gc3RydWN0IG5ldF9kZXZpY2UJKm5ldF9kZXYpCi17Ci0JUlRNUF9BREFQVEVSICpwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KTsKLQotCWlmICghKG5ldF9kZXYtPmZsYWdzICYgSUZGX1VQKSkKLQl7Ci0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCAoUE5ESVNfUEFDS0VUKXNrYl9wLCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmc2tiX3AtPmNiW0NCX09GRl0sIDE1KTsKLQlSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQoc2tiX3AsIE1BSU5fTUJTU0lEKTsKLQotCXJldHVybiBydDI4eHhfcGFja2V0X3htaXQoc2tiX3ApOwotfQotCi0KLSNpZiBXSVJFTEVTU19FWFQgPj0gMTIKLS8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiBxdWVyeSAvcHJvYwotc3RydWN0IGl3X3N0YXRpc3RpY3MgKnJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMoCi0gICAgSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KTsKLQotCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzIC0tLT5cbiIpKTsKLQotCXBBZC0+aXdfc3RhdHMuc3RhdHVzID0gMDsgLy8gU3RhdHVzIC0gZGV2aWNlIGRlcGVuZGVudCBmb3Igbm93Ci0KLQkvLyBsaW5rIHF1YWxpdHkKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQlwQWQtPml3X3N0YXRzLnF1YWwucXVhbCA9ICgocEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ICogMTIpLzEwICsgMTApOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JaWYocEFkLT5pd19zdGF0cy5xdWFsLnF1YWwgPiAxMDApCi0JCXBBZC0+aXdfc3RhdHMucXVhbC5xdWFsID0gMTAwOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0JewotCQlwQWQtPml3X3N0YXRzLnF1YWwubGV2ZWwgPQotCQkJUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwKLQkJCQkJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwKLQkJCQkJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMik7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JcEFkLT5pd19zdGF0cy5xdWFsLm5vaXNlID0gcEFkLT5CYnBXcml0ZUxhdGNoWzY2XTsgLy8gbm9pc2UgbGV2ZWwgKGRCbSkKLQotCXBBZC0+aXdfc3RhdHMucXVhbC5ub2lzZSArPSAyNTYgLSAxNDM7Ci0JcEFkLT5pd19zdGF0cy5xdWFsLnVwZGF0ZWQgPSAxOyAgICAgLy8gRmxhZ3MgdG8ga25vdyBpZiB1cGRhdGVkCi0jaWZkZWYgSVdfUVVBTF9EQk0KLQlwQWQtPml3X3N0YXRzLnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX0RCTTsJLy8gTGV2ZWwgKyBOb2lzZSBhcmUgZEJtCi0jZW5kaWYgLy8gSVdfUVVBTF9EQk0gLy8KLQotCXBBZC0+aXdfc3RhdHMuZGlzY2FyZC5ud2lkID0gMDsgICAgIC8vIFJ4IDogV3JvbmcgbndpZC9lc3NpZAotCXBBZC0+aXdfc3RhdHMubWlzcy5iZWFjb24gPSAwOyAgICAgIC8vIE1pc3NlZCBiZWFjb25zL3N1cGVyZnJhbWUKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0gcnQyOHh4X2dldF93aXJlbGVzc19zdGF0c1xuIikpOwotCXJldHVybiAmcEFkLT5pd19zdGF0czsKLX0KLSNlbmRpZiAvLyBXSVJFTEVTU19FWFQgLy8KLQotCi12b2lkIHRidHRfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0vLyNkZWZpbmUgTUFYX1RYX0lOX1RCVFQJCSgxNikKLQotfQotCi1JTlQgcnQyOHh4X2lvY3RsKAotCUlOCVBORVRfREVWCW5ldF9kZXYsCi0JSU4JT1VUCXN0cnVjdCBpZnJlcQkqcnEsCi0JSU4JSU5UCQkJCQljbWQpCi17Ci0JUlRNUF9BREFQVEVSCSpwQWQgPSBOVUxMOwotCUlOVAkJCQlyZXQgPSAwOwotCi0JcEFkID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYobmV0X2Rldik7Ci0JaWYgKHBBZCA9PSBOVUxMKQotCXsKLQkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKLQkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCi0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJcmV0ID0gcnQyOHh4X3N0YV9pb2N0bChuZXRfZGV2LCBycSwgY21kKTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlyZXR1cm4gcmV0OwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgotICAgICAgICByZXR1cm4gZXRoZXJuZXQgc3RhdGlzdGljcyBjb3VudGVyCi0KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIG5ldF9kZXYgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG5ldF9kZXZpY2UKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgbmV0X2RldmljZV9zdGF0cyoKLQotICAgIE5vdGU6Ci0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlJUMjh4eF9nZXRfZXRoZXJfc3RhdHMoCi0gICAgSU4gIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQotewotICAgIFJUTVBfQURBUFRFUiAqcEFkID0gTlVMTDsKLQotCWlmIChuZXRfZGV2KQotCQlwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KTsKLQotCWlmIChwQWQpCi0JewotCi0JCXBBZC0+c3RhdHMucnhfcGFja2V0cyA9IHBBZC0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKLQkJcEFkLT5zdGF0cy50eF9wYWNrZXRzID0gcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OwotCi0JCXBBZC0+c3RhdHMucnhfYnl0ZXMgPSBwQWQtPlJhbGlua0NvdW50ZXJzLlJlY2VpdmVkQnl0ZUNvdW50OwotCQlwQWQtPnN0YXRzLnR4X2J5dGVzID0gcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudDsKLQotCQlwQWQtPnN0YXRzLnJ4X2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJ4RXJyb3JzOwotCQlwQWQtPnN0YXRzLnR4X2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlR4RXJyb3JzOwotCi0JCXBBZC0+c3RhdHMucnhfZHJvcHBlZCA9IDA7Ci0JCXBBZC0+c3RhdHMudHhfZHJvcHBlZCA9IDA7Ci0KLQkgICAgcEFkLT5zdGF0cy5tdWx0aWNhc3QgPSBwQWQtPldsYW5Db3VudGVycy5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQuUXVhZFBhcnQ7ICAgLy8gbXVsdGljYXN0IHBhY2tldHMgcmVjZWl2ZWQKLQkgICAgcEFkLT5zdGF0cy5jb2xsaXNpb25zID0gcEFkLT5Db3VudGVyczgwMjMuT25lQ29sbGlzaW9uICsgcEFkLT5Db3VudGVyczgwMjMuTW9yZUNvbGxpc2lvbnM7ICAvLyBDb2xsaXNpb24gcGFja2V0cwotCi0JICAgIHBBZC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9IDA7Ci0JICAgIHBBZC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOyAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlciByaW5nIGJ1ZmYgb3ZlcmZsb3cKLQkgICAgcEFkLT5zdGF0cy5yeF9jcmNfZXJyb3JzID0gMDsvL3BBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQ7ICAgICAvLyByZWN2ZWQgcGt0IHdpdGggY3JjIGVycm9yCi0JICAgIHBBZC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuUmN2QWxpZ25tZW50RXJyb3JzOyAgICAgICAgICAvLyByZWN2J2QgZnJhbWUgYWxpZ25tZW50IGVycm9yCi0JICAgIHBBZC0+c3RhdHMucnhfZmlmb19lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOyAgICAgICAgICAgICAgICAgICAvLyByZWN2J3IgZmlmbyBvdmVycnVuCi0JICAgIHBBZC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlciBtaXNzZWQgcGFja2V0Ci0KLQkgICAgLy8gZGV0YWlsZWQgdHhfZXJyb3JzCi0JICAgIHBBZC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPSAwOwotCSAgICBwQWQtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzID0gMDsKLQkgICAgcEFkLT5zdGF0cy50eF9maWZvX2Vycm9ycyA9IDA7Ci0JICAgIHBBZC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycyA9IDA7Ci0JICAgIHBBZC0+c3RhdHMudHhfd2luZG93X2Vycm9ycyA9IDA7Ci0KLQkgICAgLy8gZm9yIGNzbGlwIGV0YwotCSAgICBwQWQtPnN0YXRzLnJ4X2NvbXByZXNzZWQgPSAwOwotCSAgICBwQWQtPnN0YXRzLnR4X2NvbXByZXNzZWQgPSAwOwotCi0JCXJldHVybiAmcEFkLT5zdGF0czsKLQl9Ci0JZWxzZQotCXJldHVybiBOVUxMOwotfQotCi0KLUJPT0xFQU4gUnRtcFBoeU5ldERldkV4aXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUE5FVF9ERVYgbmV0X2RldikKLXsKLQotCi0KLSNpZmRlZiBJTkZfQU1BWk9OX1BQQQotCWlmIChwcGFfaG9va19kaXJlY3RwYXRoX3JlZ2lzdGVyX2Rldl9mbiAmJiBwQWQtPlBQQUVuYWJsZT09VFJVRSkKLQl7Ci0JCVVJTlQgc3RhdHVzOwotCQlzdGF0dXM9cHBhX2hvb2tfZGlyZWN0cGF0aF9yZWdpc3Rlcl9kZXZfZm4oJnBBZC0+Z19pZl9pZCwgcEFkLT5uZXRfZGV2LCBOVUxMLCBQUEFfRl9ESVJFQ1RQQVRIX0RFUkVHSVNURVIpOwotCQlwcmludGsoInVucmVnaXN0ZXIgUFBBOmdfaWZfaWQ9JWQgc3RhdHVzPSVkXG4iLHBBZC0+Z19pZl9pZCxzdGF0dXMpOwotCX0KLQlrZnJlZShwQWQtPnBEaXJlY3RwYXRoQ2IpOwotI2VuZGlmIC8vIElORl9BTUFaT05fUFBBIC8vCi0KLQkvLyBVbnJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlCi0JaWYgKG5ldF9kZXYgIT0gTlVMTCkKLQl7Ci0JCXByaW50aygiUnRtcE9TTmV0RGV2RGV0YWNoKCk6IFJ0bXBPU05ldERldmljZURldGFjaCgpLCBkZXYtPm5hbWU9JXMhXG4iLCBuZXRfZGV2LT5uYW1lKTsKLQkJUnRtcE9TTmV0RGV2RGV0YWNoKG5ldF9kZXYpOwotCX0KLQotCXJldHVybiBUUlVFOwotCi19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFkYXB0ZXIgY29udHJvbCBibG9jay4KLQotQXJndW1lbnRzOgotICAgIHBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi1SZXR1cm4gVmFsdWU6Ci0JTkRJU19TVEFUVVNfU1VDQ0VTUwotCU5ESVNfU1RBVFVTX0ZBSUxVUkUKLQlORElTX1NUQVRVU19SRVNPVVJDRVMKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfU1RBVFVTIEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KAotCUlOIFBWT0lECWhhbmRsZSwKLQlPVVQJUFZPSUQJKnBwQWQpCi17Ci0KLQkqcHBBZCA9IChQVk9JRCl2bWFsbG9jKHNpemVvZihSVE1QX0FEQVBURVIpKTsgLy9wY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBzaXplb2YoUlRNUF9BREFQVEVSKSwgcGh5X2FkZHIpOwotCi0JaWYgKCpwcEFkKQotCXsKLQkJTmRpc1plcm9NZW1vcnkoKnBwQWQsIHNpemVvZihSVE1QX0FEQVBURVIpKTsKLQkJKChQUlRNUF9BREFQVEVSKSpwcEFkKS0+T1NfQ29va2llID0gaGFuZGxlOwotCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCX0gZWxzZSB7Ci0JCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9wY2lfcmJ1cy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9wY2lfcmJ1cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTkxMzE5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfcGNpX3JidXMuYworKysgL2Rldi9udWxsCkBAIC0xLDk4OSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIHJ0X3BjaV9yYnVzLmMKLQotICAgIEFic3RyYWN0OgotICAgIENyZWF0ZSBhbmQgcmVnaXN0ZXIgbmV0d29yayBpbnRlcmZhY2UuCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpbmNsdWRlICJydF9jb25maWcuaCIKLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLQotCi1JUlFfSEFORExFX1RZUEUKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxOSkpCi1ydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSk7Ci0jZWxzZQotcnQyODYwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLSNlbmRpZgotCi0KLXN0YXRpYyB2b2lkIHJ4X2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgbWdtdF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBhYzBfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgYWMxX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIGFjMl9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBhYzNfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotLypzdGF0aWMgdm9pZCBoY2NhX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsqLwotc3RhdGljIHZvaWQgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBTeW1ib2wgJiBNYWNybyBEZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIFJUMjg2MF9JTlRfUlhfRExZCQkJCSgxPDwwKQkJLy8gYml0IDAKLSNkZWZpbmUgUlQyODYwX0lOVF9UWF9ETFkJCQkJKDE8PDEpCQkvLyBiaXQgMQotI2RlZmluZSBSVDI4NjBfSU5UX1JYX0RPTkUJCQkJKDE8PDIpCQkvLyBiaXQgMgotI2RlZmluZSBSVDI4NjBfSU5UX0FDMF9ETUFfRE9ORQkJCSgxPDwzKQkJLy8gYml0IDMKLSNkZWZpbmUgUlQyODYwX0lOVF9BQzFfRE1BX0RPTkUJCQkoMTw8NCkJCS8vIGJpdCA0Ci0jZGVmaW5lIFJUMjg2MF9JTlRfQUMyX0RNQV9ET05FCQkJKDE8PDUpCQkvLyBiaXQgNQotI2RlZmluZSBSVDI4NjBfSU5UX0FDM19ETUFfRE9ORQkJCSgxPDw2KQkJLy8gYml0IDYKLSNkZWZpbmUgUlQyODYwX0lOVF9IQ0NBX0RNQV9ET05FCQkoMTw8NykJCS8vIGJpdCA3Ci0jZGVmaW5lIFJUMjg2MF9JTlRfTUdNVF9ET05FCQkJKDE8PDgpCQkvLyBiaXQgOAotI2lmZGVmIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQKLSNkZWZpbmUgUlQyODYwX0lOVF9UT05FX1JBREFSCQkJKDE8PDIwKQkJLy8gYml0IDIwCi0jZW5kaWYgLy8gVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVCAvLwotCi0jZGVmaW5lIElOVF9SWAkJCVJUMjg2MF9JTlRfUlhfRE9ORQotCi0jZGVmaW5lIElOVF9BQzBfRExZCQkoUlQyODYwX0lOVF9BQzBfRE1BX0RPTkUpIC8vfCBSVDI4NjBfSU5UX1RYX0RMWSkKLSNkZWZpbmUgSU5UX0FDMV9ETFkJCShSVDI4NjBfSU5UX0FDMV9ETUFfRE9ORSkgLy98IFJUMjg2MF9JTlRfVFhfRExZKQotI2RlZmluZSBJTlRfQUMyX0RMWQkJKFJUMjg2MF9JTlRfQUMyX0RNQV9ET05FKSAvL3wgUlQyODYwX0lOVF9UWF9ETFkpCi0jZGVmaW5lIElOVF9BQzNfRExZCQkoUlQyODYwX0lOVF9BQzNfRE1BX0RPTkUpIC8vfCBSVDI4NjBfSU5UX1RYX0RMWSkKLSNkZWZpbmUgSU5UX0hDQ0FfRExZCShSVDI4NjBfSU5UX0hDQ0FfRE1BX0RPTkUpIC8vfCBSVDI4NjBfSU5UX1RYX0RMWSkKLSNkZWZpbmUgSU5UX01HTVRfRExZCVJUMjg2MF9JTlRfTUdNVF9ET05FCi0jaWZkZWYgVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVAotI2RlZmluZSBJTlRfVE9ORV9SQURBUgkoUlQyODYwX0lOVF9UT05FX1JBREFSKQotI2VuZGlmIC8vIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQgLy8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKglJbnRlcmZhY2UtZGVwZW5kZWQgbWVtb3J5IGFsbG9jYXRpb24vRnJlZSByZWxhdGVkIHByb2NlZHVyZXMuCi0gICoJCU1haW5seSBmb3IgSGFyZHdhcmUgVHhEZXNjL1J4RGVzYy9NZ210RGVzYywgRE1BIE1lbW9yeSBmb3IgVHhEYXRhL1J4RGF0YSwgZXRjLiwKLSAgKgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIEZ1bmN0aW9uIGZvciBUeERlc2MgTWVtb3J5IGFsbG9jYXRpb24uCi12b2lkIFJUTVBfQWxsb2NhdGVUeERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUlOVAlJbmRleCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpCi17Ci0JUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpcGNpX2FsbG9jX2NvbnNpc3RlbnQocE9iai0+cGNpX2RldixzaXplb2YoY2hhcikqTGVuZ3RoLCBQaHlzaWNhbEFkZHJlc3MpOwotCi19Ci0KLQotLy8gRnVuY3Rpb24gZm9yIE1nbXREZXNjIE1lbW9yeSBhbGxvY2F0aW9uLgotdm9pZCBSVE1QX0FsbG9jYXRlTWdtdERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQotewotCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKXBjaV9hbGxvY19jb25zaXN0ZW50KHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKLQotfQotCi0KLS8vIEZ1bmN0aW9uIGZvciBSeERlc2MgTWVtb3J5IGFsbG9jYXRpb24uCi12b2lkIFJUTVBfQWxsb2NhdGVSeERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQotewotCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKXBjaV9hbGxvY19jb25zaXN0ZW50KHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKLQotfQotCi0KLS8vIEZ1bmN0aW9uIGZvciBmcmVlIGFsbG9jYXRlZCBEZXNjIE1lbW9yeS4KLXZvaWQgUlRNUF9GcmVlRGVzY01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JUFZPSUQJVmlydHVhbEFkZHJlc3MsCi0JSU4JTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKLXsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCXBjaV9mcmVlX2NvbnNpc3RlbnQocE9iai0+cGNpX2RldiwgTGVuZ3RoLCBWaXJ0dWFsQWRkcmVzcywgUGh5c2ljYWxBZGRyZXNzKTsKLX0KLQotCi0vLyBGdW5jdGlvbiBmb3IgVHhEYXRhIERNQSBNZW1vcnkgYWxsb2NhdGlvbi4KLXZvaWQgUlRNUF9BbGxvY2F0ZUZpcnN0VHhCdWZmZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUlOVAlJbmRleCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpCi17Ci0JUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpcGNpX2FsbG9jX2NvbnNpc3RlbnQocE9iai0+cGNpX2RldixzaXplb2YoY2hhcikqTGVuZ3RoLCBQaHlzaWNhbEFkZHJlc3MpOwotfQotCi0KLXZvaWQgUlRNUF9GcmVlRmlyc3RUeEJ1ZmZlcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JSU4JUFZPSUQJVmlydHVhbEFkZHJlc3MsCi0JSU4JTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKLXsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCXBjaV9mcmVlX2NvbnNpc3RlbnQocE9iai0+cGNpX2RldiwgTGVuZ3RoLCBWaXJ0dWFsQWRkcmVzcywgUGh5c2ljYWxBZGRyZXNzKTsKLX0KLQotCi0vKgotICogRlVOQ1RJT046IEFsbG9jYXRlIGEgY29tbW9uIGJ1ZmZlciBmb3IgRE1BCi0gKiBBUkdVTUVOVFM6Ci0gKiAgICAgQWRhcHRlckhhbmRsZTogIEFkYXB0ZXJIYW5kbGUKLSAqICAgICBMZW5ndGg6ICBOdW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUKLSAqICAgICBDYWNoZWQ6ICBXaGV0aGVyIG9yIG5vdCB0aGUgbWVtb3J5IGNhbiBiZSBjYWNoZWQKLSAqICAgICBWaXJ0dWFsQWRkcmVzczogIFBvaW50ZXIgdG8gbWVtb3J5IGlzIHJldHVybmVkIGhlcmUKLSAqICAgICBQaHlzaWNhbEFkZHJlc3M6ICBQaHlzaWNhbCBhZGRyZXNzIGNvcnJlc3BvbmRpbmcgdG8gdmlydHVhbCBhZGRyZXNzCi0gKi8KLXZvaWQgUlRNUF9BbGxvY2F0ZVNoYXJlZE1lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpCi17Ci0JUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpcGNpX2FsbG9jX2NvbnNpc3RlbnQocE9iai0+cGNpX2RldixzaXplb2YoY2hhcikqTGVuZ3RoLCBQaHlzaWNhbEFkZHJlc3MpOwotfQotCi0KLS8qCi0gKiBGVU5DVElPTjogQWxsb2NhdGUgYSBwYWNrZXQgYnVmZmVyIGZvciBETUEKLSAqIEFSR1VNRU5UUzoKLSAqICAgICBBZGFwdGVySGFuZGxlOiAgQWRhcHRlckhhbmRsZQotICogICAgIExlbmd0aDogIE51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQotICogICAgIENhY2hlZDogIFdoZXRoZXIgb3Igbm90IHRoZSBtZW1vcnkgY2FuIGJlIGNhY2hlZAotICogICAgIFZpcnR1YWxBZGRyZXNzOiAgUG9pbnRlciB0byBtZW1vcnkgaXMgcmV0dXJuZWQgaGVyZQotICogICAgIFBoeXNpY2FsQWRkcmVzczogIFBoeXNpY2FsIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB2aXJ0dWFsIGFkZHJlc3MKLSAqIE5vdGVzOgotICogICAgIENhY2hlZCBpcyBpZ25vcmVkOiBhbHdheXMgY2FjaGVkIG1lbW9yeQotICovCi1QTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwotCi0JcGt0ID0gZGV2X2FsbG9jX3NrYihMZW5ndGgpOwotCi0JaWYgKHBrdCA9PSBOVUxMKSB7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNhbid0IGFsbG9jYXRlIHJ4ICVsZCBzaXplIHBhY2tldFxuIixMZW5ndGgpKTsKLQl9Ci0KLQlpZiAocGt0KSB7Ci0JCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOwotCQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpIHBrdC0+ZGF0YTsKLS8vI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQotLy8JCSpQaHlzaWNhbEFkZHJlc3MgPSBQQ0lfTUFQX1NJTkdMRShwQWQsICpWaXJ0dWFsQWRkcmVzcywgMTYwMCwgUENJX0RNQV9GUk9NREVWSUNFKTsKLS8vI2Vsc2UKLQkJKlBoeXNpY2FsQWRkcmVzcyA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgKlZpcnR1YWxBZGRyZXNzLCBMZW5ndGgsICAtMSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLS8vI2VuZGlmCi0JfSBlbHNlIHsKLQkJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKSBOVUxMOwotCQkqUGh5c2ljYWxBZGRyZXNzID0gKE5ESVNfUEhZU0lDQUxfQUREUkVTUykgTlVMTDsKLQl9Ci0KLQlyZXR1cm4gKFBORElTX1BBQ0tFVCkgcGt0OwotfQotCi0KLVZPSUQgSW52YWxpZF9SZW1haW5pbmdfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCSBVTE9ORyBWaXJ0dWFsQWRkcmVzcykKLXsKLQlORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzOwotCi0JUGh5c2ljYWxBZGRyZXNzID0gUENJX01BUF9TSU5HTEUocEFkLCAodm9pZCAqKShWaXJ0dWFsQWRkcmVzcysxNjAwKSwgUlhfQlVGRkVSX05PUk1TSVpFLTE2MDAsIC0xLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotfQotCi0KLWludCBSdG1wT1NJUlFSZXF1ZXN0KElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQotewotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpKFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKG5ldF9kZXYpKTsKLQlpbnQgcmV0dmFsID0gMDsKLQotCUFTU0VSVChwQWQpOwotCi0JaWYgKHBBZC0+aW5mVHlwZSAhPSBSVE1QX0RFVl9JTkZfUkJVUykKLQl7Ci0JCVBPU19DT09LSUUgX3BPYmogPSAoUE9TX0NPT0tJRSkocEFkLT5PU19Db29raWUpOwotCQlSVE1QX01TSV9FTkFCTEUocEFkKTsKLQkJcmV0dmFsID0gcmVxdWVzdF9pcnEoX3BPYmotPnBjaV9kZXYtPmlycSwgIHJ0Mjg2MF9pbnRlcnJ1cHQsIFNBX1NISVJRLCAobmV0X2RldiktPm5hbWUsIChuZXRfZGV2KSk7Ci0JCWlmIChyZXR2YWwgIT0gMCkKLQkJCXByaW50aygiUlQyODYwOiByZXF1ZXN0X2lycSAgRVJST1IoJWQpXG4iLCByZXR2YWwpOwotCX0KLQllbHNlCi0JewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjIpCi0JCWlmICgocmV0dmFsID0gcmVxdWVzdF9pcnEobmV0X2Rldi0+aXJxLCBydDI4NjBfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgbmV0X2Rldi0+bmFtZSAsbmV0X2RldikpKQotI2Vsc2UKLQkJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShuZXRfZGV2LT5pcnEscnQyODYwX2ludGVycnVwdCwgU0FfSU5URVJSVVBULCBuZXRfZGV2LT5uYW1lICxuZXRfZGV2KSkpCi0jZW5kaWYKLQkJewotCQkJcHJpbnRrKCJSVDI4NjA6IHJlcXVlc3RfaXJxICBFUlJPUiglZClcbiIsIHJldHZhbCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0dmFsOwotCi19Ci0KLQotaW50IFJ0bXBPU0lSUVJlbGVhc2UoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikoUlRNUF9PU19ORVRERVZfR0VUX1BSSVYobmV0X2RldikpOwotCi0JQVNTRVJUKHBBZCk7Ci0JaWYgKHBBZC0+aW5mVHlwZSAhPSBSVE1QX0RFVl9JTkZfUkJVUykKLQl7Ci0JCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKShwQWQtPk9TX0Nvb2tpZSk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCQlzeW5jaHJvbml6ZV9pcnEocE9iai0+cGNpX2Rldi0+aXJxKTsKLSNlbmRpZgotCQlmcmVlX2lycShwT2JqLT5wY2lfZGV2LT5pcnEsIChuZXRfZGV2KSk7Ci0JCVJUTVBfTVNJX0RJU0FCTEUocEFkKTsKLQl9Ci0JZWxzZQotCXsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0JCXN5bmNocm9uaXplX2lycShuZXRfZGV2LT5pcnEpOwotI2VuZGlmCi0JCWZyZWVfaXJxKG5ldF9kZXYtPmlycSwgKG5ldF9kZXYpKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1ORElTX1NUQVRVUyBSdG1wTmV0VGFza0luaXQoSU4gUlRNUF9BREFQVEVSICpwQWQpCi17Ci0JUE9TX0NPT0tJRSBwT2JqOwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCXRhc2tsZXRfaW5pdCgmcE9iai0+cnhfZG9uZV90YXNrLCByeF9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2ssIG1nbXRfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrLCBhYzBfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrLCBhYzFfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrLCBhYzJfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrLCBhYzNfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQkvKnRhc2tsZXRfaW5pdCgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrLCBoY2NhX2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ki8KLQl0YXNrbGV0X2luaXQoJnBPYmotPnRidHRfdGFzaywgdGJ0dF90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+Zmlmb19zdGF0aXN0aWNfZnVsbF90YXNrLCBmaWZvX3N0YXRpc3RpY19mdWxsX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi12b2lkIFJ0bXBOZXRUYXNrRXhpdChJTiBSVE1QX0FEQVBURVIgKnBBZCkKLXsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JdGFza2xldF9raWxsKCZwT2JqLT5yeF9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKLQkvKnRhc2tsZXRfa2lsbCgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrKTsqLwotCXRhc2tsZXRfa2lsbCgmcE9iai0+dGJ0dF90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPmZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzayk7Ci19Ci0KLQotTkRJU19TVEFUVVMgUnRtcE1nbXRUYXNrSW5pdChJTiBSVE1QX0FEQVBURVIgKnBBZCkKLXsKLQotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBDbG9zZSBrZXJuZWwgdGhyZWFkcy4KLQotQXJndW1lbnRzOgotCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTk9ORQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSdG1wTWdtdFRhc2tFeGl0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKQotewotCi0KLQlyZXR1cm47Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIHJ0Mjg2MF9pbnRfZW5hYmxlKFBSVE1QX0FEQVBURVIgcEFkLCB1bnNpZ25lZCBpbnQgbW9kZSkKLXsKLQl1MzIgcmVnVmFsdWU7Ci0KLQlwQWQtPmludF9kaXNhYmxlX21hc2sgJj0gfihtb2RlKTsKLQlyZWdWYWx1ZSA9IHBBZC0+aW50X2VuYWJsZV9yZWcgJiB+KHBBZC0+aW50X2Rpc2FibGVfbWFzayk7Ci0JLy9pZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JewotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIHJlZ1ZhbHVlKTsgICAgIC8vIDE6ZW5hYmxlCi0JfQotCS8vZWxzZQotCS8vCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZPUF9TVEFUVVNfRE9aRSAhXG4iKSk7Ci0KLQlpZiAocmVnVmFsdWUgIT0gMCkKLQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSk7Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIHJ0Mjg2MF9pbnRfZGlzYWJsZShQUlRNUF9BREFQVEVSIHBBZCwgdW5zaWduZWQgaW50IG1vZGUpCi17Ci0JdTMyIHJlZ1ZhbHVlOwotCi0JcEFkLT5pbnRfZGlzYWJsZV9tYXNrIHw9IG1vZGU7Ci0JcmVnVmFsdWUgPQlwQWQtPmludF9lbmFibGVfcmVnICYgfihwQWQtPmludF9kaXNhYmxlX21hc2spOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgcmVnVmFsdWUpOyAgICAgLy8gMDogZGlzYWJsZQotCi0JaWYgKHJlZ1ZhbHVlID09IDApCi0JewotCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpOwotCX0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKgl0YXNrbGV0IHJlbGF0ZWQgcHJvY2VkdXJlcy4KLSAgKgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIG1nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLSAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0vLwlwcmludGsoIm1nbXRfZG1hX2RvbmVfcHJvY2Vzc1xuIik7Ci0JSW50U291cmNlLndvcmQgPSAwOwotCUludFNvdXJjZS5maWVsZC5NZ210RG1hRG9uZSA9IDE7Ci0JcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX01HTVRfRExZOwotCi0JUlRNUEhhbmRsZU1nbXRSaW5nRG1hRG9uZUludGVycnVwdChwQWQpOwotCi0JLy8gaWYgeW91IHVzZSBSVE1QX1NFTV9MT0NLLCBzb21ldGltZXMga2VybmVsIHdpbGwgaGFuZyB1cCwgbm8gYW55Ci0JLy8gYnVnIHJlcG9ydCBvdXRwdXQKLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfTUdNVF9ETFkpCi0JewotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9NR01UX0RMWSk7Ci0JUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci19Ci0KLQotc3RhdGljIHZvaWQgcnhfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7Ci0JQk9PTEVBTgliUmVzY2hlZHVsZSA9IDA7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJcmV0dXJuOwotCi0jaWZkZWYgVUFQU0RfQVBfU1VQUE9SVAotCVVBUFNEX1RJTUlOR19SRUNPUkQocEFkLCBVQVBTRF9USU1JTkdfUkVDT1JEX1RBU0tMRVQpOwotI2VuZGlmIC8vIFVBUFNEX0FQX1NVUFBPUlQgLy8KLQotICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlwQWQtPmludF9wZW5kaW5nICY9IH4oSU5UX1JYKTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQliUmVzY2hlZHVsZSA9IFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZShwQWQsIDApOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgVUFQU0RfQVBfU1VQUE9SVAotCVVBUFNEX1RJTUlOR19SRUNPUkRfU1RPUCgpOwotI2VuZGlmIC8vIFVBUFNEX0FQX1NVUFBPUlQgLy8KLQotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkvKgotCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCByb3R0aW5nIHBhY2tldAotCSAqLwotCWlmIChwQWQtPmludF9wZW5kaW5nICYgSU5UX1JYIHx8IGJSZXNjaGVkdWxlKQotCXsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+cnhfZG9uZV90YXNrKTsKLQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBlbmFibGUgUnhJTlQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9SWCk7Ci0JUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0KLX0KLQotCi12b2lkIGZpZm9fc3RhdGlzdGljX2Z1bGxfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotCVBPU19DT09LSUUgcE9iajsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybjsKLQotICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlwQWQtPmludF9wZW5kaW5nICY9IH4oRmlmb1N0YUZ1bGxJbnQpOwotCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOwotCi0JUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCS8qCi0JICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIHJvdHRpbmcgcGFja2V0Ci0JICovCi0JaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBGaWZvU3RhRnVsbEludCkKLQl7Ci0JCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzayk7Ci0JCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZW5hYmxlIFJ4SU5UIGFnYWluICovCi0KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIEZpZm9TdGFGdWxsSW50KTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQotfQotCi0KLQotCi1zdGF0aWMgdm9pZCBhYzNfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0JQk9PTEVBTiBiUmVzY2hlZHVsZSA9IDA7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLSAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0vLwlwcmludGsoImFjMF9kbWFfZG9uZV9wcm9jZXNzXG4iKTsKLQlJbnRTb3VyY2Uud29yZCA9IDA7Ci0JSW50U291cmNlLmZpZWxkLkFjM0RtYURvbmUgPSAxOwotCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzNfRExZOwotCi0JYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDM19ETFkpIHx8IGJSZXNjaGVkdWxlKQotCXsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzNfRExZKTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBhYzJfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0JQk9PTEVBTiBiUmVzY2hlZHVsZSA9IDA7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLSAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JSW50U291cmNlLndvcmQgPSAwOwotCUludFNvdXJjZS5maWVsZC5BYzJEbWFEb25lID0gMTsKLQlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfQUMyX0RMWTsKLQotCWJSZXNjaGVkdWxlID0gUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQocEFkLCBJbnRTb3VyY2UpOwotCi0JUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCi0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDMl9ETFkpIHx8IGJSZXNjaGVkdWxlKQotCXsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzJfRExZKTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBhYzFfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0JQk9PTEVBTiBiUmVzY2hlZHVsZSA9IDA7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLSAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0vLwlwcmludGsoImFjMF9kbWFfZG9uZV9wcm9jZXNzXG4iKTsKLQlJbnRTb3VyY2Uud29yZCA9IDA7Ci0JSW50U291cmNlLmZpZWxkLkFjMURtYURvbmUgPSAxOwotCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzFfRExZOwotCi0JYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDMV9ETFkpIHx8IGJSZXNjaGVkdWxlKQotCXsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzFfRExZKTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBhYzBfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotCUlOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0JQk9PTEVBTiBiUmVzY2hlZHVsZSA9IDA7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0vLwlwcmludGsoImFjMF9kbWFfZG9uZV9wcm9jZXNzXG4iKTsKLQlJbnRTb3VyY2Uud29yZCA9IDA7Ci0JSW50U291cmNlLmZpZWxkLkFjMERtYURvbmUgPSAxOwotCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzBfRExZOwotCi0vLwlSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCk7Ci0JYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDMF9ETFkpIHx8IGJSZXNjaGVkdWxlKQotCXsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzBfRExZKTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICoJaW50ZXJydXB0IGhhbmRsZXIgcmVsYXRlZCBwcm9jZWR1cmVzLgotICAqCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHByaW50X2ludF9jb3VudDsKLQotSVJRX0hBTkRMRV9UWVBFCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTkpKQotcnQyODYwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCi0jZWxzZQotcnQyODYwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotI2VuZGlmCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2luc3RhbmNlOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKG5ldF9kZXYpOwotCUlOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0KLQkvKiBOb3RlIDAzMzEyMDA4OiB3ZSBjYW4gbm90IHJldHVybiBoZXJlIGJlZm9yZQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAmSW50U291cmNlLndvcmQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgSW50U291cmNlLndvcmQpOwotCQlPciBrZXJuZWwgd2lsbCBwYW5pYyBhZnRlciBpZmNvbmZpZyByYTAgZG93biBzb21ldGltZXMgKi8KLQotCi0JLy8KLQkvLyBJbml0YWwgdGhlIEludGVycnVwdCBzb3VyY2UuCi0JLy8KLQlJbnRTb3VyY2Uud29yZCA9IDB4MDAwMDAwMDBMOwotLy8JTWN1SW50U291cmNlLndvcmQgPSAweDAwMDAwMDAwTDsKLQotCS8vCi0JLy8gR2V0IHRoZSBpbnRlcnJ1cHQgc291cmNlcyAmIHNhdmVkIHRvIGxvY2FsIHZhcmlhYmxlCi0JLy8KLQkvL1JUTVBfSU9fUkVBRDMyKHBBZCwgd2hlcmUsICZNY3VJbnRTb3VyY2Uud29yZCk7Ci0JLy9SVE1QX0lPX1dSSVRFMzIocEFkLCAsIE1jdUludFNvdXJjZS53b3JkKTsKLQotCS8vCi0JLy8gRmxhZyBmT1BfU1RBVFVTX0RPWkUgT24sIG1lYW5zIEFTSUMgcHV0IHRvIHNsZWVwLCBlbGFzZSBtZWFucyBBU0lDSyBXYWtlVXAKLQkvLyBBbmQgYXQgdGhlIHNhbWUgdGltZSwgY2xvY2sgbWF5YmUgdHVybmVkIG9mZiB0aGF0IHNheSB0aGVyZSBpcyBubyBETUEgc2VydmljZS4KLQkvLyB3aGVuIEFTSUMgZ2V0IHRvIHNsZWVwLgotCS8vIFRvIHByZXZlbnQgc3lzdGVtIGhhbmcgb24gcG93ZXIgc2F2aW5nLgotCS8vIFdlIG5lZWQgdG8gY2hlY2sgaXQgYmVmb3JlIGhhbmRsZSB0aGUgSU5UX1NPVVJDRV9DU1IsIEFTSUMgbXVzdCBiZSB3YWtlIHVwLgotCS8vCi0JLy8gUlQyNjYxID0+IHdoZW4gQVNJQyBpcyBzbGVlcGluZywgTUFDIHJlZ2lzdGVyIGNhbm5vdCBiZSByZWFkIGFuZCB3cml0dGVuLgotCS8vIFJUMjg2MCA9PiB3aGVuIEFTSUMgaXMgc2xlZXBpbmcsIE1BQyByZWdpc3RlciBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbi4KLS8vCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsICZJbnRTb3VyY2Uud29yZCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCBJbnRTb3VyY2Uud29yZCk7IC8vIHdyaXRlIDEgdG8gY2xlYXIKLQl9Ci0vLwllbHNlCi0vLwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPj4+Zk9QX1NUQVRVU19ET1pFPDw8XG4iKSk7Ci0KLS8vCVJUTVBfSU9fUkVBRDMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsICZJc3JBZnRlckNsZWFyKTsKLS8vCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUNVX0lOVF9TT1VSQ0VfQ1NSLCAmTWN1SXNyQWZ0ZXJDbGVhcik7Ci0vLwlEQkdQUklOVChSVF9ERUJVR19JTkZPLCAoIj09PT0+IFJUTVBIYW5kbGVJbnRlcnJ1cHQoSVNSPSUwOHgsTWN1IElTUj0lMDh4LCBBZnRlciBjbGVhciBJU1I9JTA4eCwgTUNVIElTUj0lMDh4KVxuIiwKLS8vCQkJSW50U291cmNlLndvcmQsIE1jdUludFNvdXJjZS53b3JkLCBJc3JBZnRlckNsZWFyLCBNY3VJc3JBZnRlckNsZWFyKSk7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIFJlc2V0IGluIHByb2dyZXNzCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpKQotCXsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0gICAgICAgIHJldHVybiAgSVJRX0hBTkRMRUQ7Ci0jZWxzZQotICAgICAgICByZXR1cm47Ci0jZW5kaWYKLQl9Ci0KLQkvLwotCS8vIEhhbmRsZSBpbnRlcnJ1cHQsIHdhbGsgdGhyb3VnaCBhbGwgYml0cwotCS8vIFNob3VsZCBzdGFydCBmcm9tIGhpZ2hlc3QgcHJpb3JpdHkgaW50ZXJydXB0Ci0JLy8gVGhlIHByaW9yaXR5IGNhbiBiZSBhZGp1c3QgYnkgYWx0ZXJpbmcgcHJvY2Vzc2luZyBpZiBzdGF0ZW1lbnQKLQkvLwotCi0jaWZkZWYgREJHCi0KLSNlbmRpZgotCi0KLQlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLQotCS8vIElmIHJlcXVpcmVkIHNwaW5sb2NrLCBlYWNoIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgaGFzIHRvIGFjcXVpcmUKLQkvLyBhbmQgcmVsZWFzZSBpdHNlbGYuCi0JLy8KLQotCS8vIERvIG5vdGhpbmcgaWYgTklDIGRvZXNuJ3QgZXhpc3QKLQlpZiAoSW50U291cmNlLndvcmQgPT0gMHhmZmZmZmZmZikKLQl7Ci0JCVJUTVBfU0VUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotICAgICAgICByZXR1cm4gIElSUV9IQU5ETEVEOwotI2Vsc2UKLSAgICAgICAgcmV0dXJuOwotI2VuZGlmCi0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgVHhDb2hlcmVudCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj4+PlR4Q29oZXJlbnQ8PDxcbiIpKTsKLQkJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQocEFkKTsKLQl9Ci0KLQlpZiAoSW50U291cmNlLndvcmQgJiBSeENvaGVyZW50KQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPj4+UnhDb2hlcmVudDw8PFxuIikpOwotCQlSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdChwQWQpOwotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIEZpZm9TdGFGdWxsSW50KQotCXsKLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBGaWZvU3RhRnVsbEludCkgPT0gMCkKLQkJewotCQkJLyogbWFzayBGaWZvU3RhRnVsbEludCAqLwotCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgRmlmb1N0YUZ1bGxJbnQpOwotCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+Zmlmb19zdGF0aXN0aWNfZnVsbF90YXNrKTsKLQkJfQotCQlwQWQtPmludF9wZW5kaW5nIHw9IEZpZm9TdGFGdWxsSW50OwotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9NR01UX0RMWSkKLQl7Ci0JCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX01HTVRfRExZKSA9PTAgKQotCQl7Ci0JCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfTUdNVF9ETFkpOwotCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKLQkJfQotCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9NR01UX0RMWSA7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgSU5UX1JYKQotCXsKLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfUlgpID09IDApCi0JCXsKLQotCQkJLyogbWFzayBSeElOVCAqLwotCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX1JYKTsKLQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPnJ4X2RvbmVfdGFzayk7Ci0JCX0KLQkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfUlg7Ci0JfQotCi0KLQlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMzX0RMWSkKLQl7Ci0KLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMzX0RMWSkgPT0gMCkKLQkJewotCQkJLyogbWFzayBUeERhdGFJbnQgKi8KLQkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzNfRExZKTsKLQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKLQkJfQotCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9BQzNfRExZOwotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9BQzJfRExZKQotCXsKLQotCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9BQzJfRExZKSA9PSAwKQotCQl7Ci0JCQkvKiBtYXNrIFR4RGF0YUludCAqLwotCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX0FDMl9ETFkpOwotCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2spOwotCQl9Ci0JCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDMl9ETFk7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0FDMV9ETFkpCi0JewotCi0JCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDMV9ETFk7Ci0KLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMxX0RMWSkgPT0gMCkKLQkJewotCQkJLyogbWFzayBUeERhdGFJbnQgKi8KLQkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzFfRExZKTsKLQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKLQkJfQotCi0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0FDMF9ETFkpCi0JewotCi0vKgotCQlpZiAoSW50U291cmNlLndvcmQgJiAweDIpIHsKLQkJCXUzMiByZWc7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIERFTEFZX0lOVF9DRkcsICZyZWcpOwotCQkJcHJpbnRrKCJJbnRTb3VyY2Uud29yZCA9ICUwOHgsIERFTEFZX1JFRyA9ICUwOHhcbiIsIEludFNvdXJjZS53b3JkLCByZWcpOwotCQl9Ci0qLwotCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9BQzBfRExZOwotCi0JCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX0FDMF9ETFkpID09IDApCi0JCXsKLQkJCS8qIG1hc2sgVHhEYXRhSW50ICovCi0JCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfQUMwX0RMWSk7Ci0JCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7Ci0JCX0KLQotCX0KLQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgUHJlVEJUVEludCkKLQl7Ci0JCVJUTVBIYW5kbGVQcmVUQlRUSW50ZXJydXB0KHBBZCk7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgVEJUVEludCkKLQl7Ci0JCVJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KHBBZCk7Ci0JfQotCi0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCWlmIChJbnRTb3VyY2Uud29yZCAmIEF1dG9XYWtldXBJbnQpCi0JCQlSVE1QSGFuZGxlVHdha2V1cEludGVycnVwdChwQWQpOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQlyZXR1cm4gIElSUV9IQU5ETEVEOwotI2VuZGlmCi0KLX0KLQotLyoKLSAqIGludmFpbGQgb3Igd3JpdGViYWNrIGNhY2hlCi0gKiBhbmQgY29udmVydCB2aXJ0dWFsIGFkZHJlc3MgdG8gcGh5c2ljYWwgYWRkcmVzcwotICovCi1kbWFfYWRkcl90IGxpbnV4X3BjaV9tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgaW50IHNkX2lkeCwgaW50IGRpcmVjdGlvbikKLXsKLQlQUlRNUF9BREFQVEVSIHBBZDsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQkvKgotCQktLS0tLS0gUG9ydGluZyBJbmZvcm1hdGlvbiAtLS0tLS0KLQkJPiBGb3IgVHggQWxsb2M6Ci0JCQltZ210IHBhY2tldHMgPT4gc2RfaWR4ID0gMAotCQkJU3dJZHg6IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgKLQkJCXBUeEQgOiBwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLkFsbG9jVmE7Ci0KLQkJCWRhdGEgcGFja2V0cyA9PiBzZF9pZHggPSAxCi0JCQlUeElkeCA6IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeAotCQkJUXVlSWR4OiBwVHhCbGstPlF1ZUlkeAotCQkJcFR4RCAgOiBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uQ2VsbFtUeElkeF0uQWxsb2NWYTsKLQotCQk+IEZvciBSeCBBbGxvYzoKLQkJCXNkX2lkeCA9IC0xCi0JKi8KLQotCXBBZCA9IChQUlRNUF9BREFQVEVSKWhhbmRsZTsKLQlwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQlpZiAoc2RfaWR4ID09IDEpCi0JewotCQlQVFhfQkxLCQlwVHhCbGs7Ci0JCXBUeEJsayA9IChQVFhfQkxLKXB0cjsKLQkJcmV0dXJuIHBjaV9tYXBfc2luZ2xlKHBPYmotPnBjaV9kZXYsIHBUeEJsay0+cFNyY0J1ZkRhdGEsIHBUeEJsay0+U3JjQnVmTGVuLCBkaXJlY3Rpb24pOwotCX0KLQllbHNlCi0JewotCQlyZXR1cm4gcGNpX21hcF9zaW5nbGUocE9iai0+cGNpX2RldiwgcHRyLCBzaXplLCBkaXJlY3Rpb24pOwotCX0KLQotfQotCi12b2lkIGxpbnV4X3BjaV91bm1hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKLXsKLQlQUlRNUF9BREFQVEVSIHBBZDsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQlwQWQ9KFBSVE1QX0FEQVBURVIpaGFuZGxlOwotCXBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCXBjaV91bm1hcF9zaW5nbGUocE9iai0+cGNpX2RldiwgZG1hX2FkZHIsIHNpemUsIGRpcmVjdGlvbik7Ci0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfcHJvZmlsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9wcm9maWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YTA1OTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9wcm9maWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLQlydF9wcm9maWxlLmMKLQotICAgIEFic3RyYWN0OgotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLSNpbmNsdWRlICJydF9jb25maWcuaCIKLQotCi1ORElTX1NUQVRVUwlSVE1QUmVhZFBhcmFtZXRlcnNIb29rKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkKQotewotCVBTVFJJTkcJCQkJCXNyYyA9IE5VTEw7Ci0JUlRNUF9PU19GRAkJCQlzcmNmOwotCVJUTVBfT1NfRlNfSU5GTwkJCW9zRlNJbmZvOwotCUlOVAkJCQkJCXJldHZhbCA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JUFNUUklORwkJCQkJYnVmZmVyOwotCi0JYnVmZmVyID0ga21hbGxvYyhNQVhfSU5JX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7Ci0JaWYoYnVmZmVyID09IE5VTEwpCi0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCW1lbXNldChidWZmZXIsIDB4MDAsIE1BWF9JTklfQlVGRkVSX1NJWkUpOwotCi0JewotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCXNyYyA9IFNUQV9QUk9GSUxFX1BBVEg7Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKLQkJc3JjID0gKFBTVFJJTkcpcEFkLT5NQ19GaWxlTmFtZTsKLSNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KLQl9Ci0KLQlpZiAoc3JjICYmICpzcmMpCi0JewotCQlSdG1wT1NGU0luZm9DaGFuZ2UoJm9zRlNJbmZvLCBUUlVFKTsKLQkJc3JjZiA9IFJ0bXBPU0ZpbGVPcGVuKHNyYywgT19SRE9OTFksIDApOwotCQlpZiAoSVNfRklMRV9PUEVOX0VSUihzcmNmKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiT3BlbiBmaWxlIFwiJXNcIiBmYWlsZWQhXG4iLCBzcmMpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJldHZhbCA9UnRtcE9TRmlsZVJlYWQoc3JjZiwgYnVmZmVyLCBNQVhfSU5JX0JVRkZFUl9TSVpFKTsKLQkJCWlmIChyZXR2YWwgPiAwKQotCQkJewotCQkJCVJUTVBTZXRQcm9maWxlUGFyYW1ldGVycyhwQWQsIGJ1ZmZlcik7Ci0JCQkJcmV0dmFsID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQkJCX0KLQkJCWVsc2UKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSZWFkIGZpbGUgXCIlc1wiIGZhaWxlZChlcnJDb2RlPSVkKSFcbiIsIHNyYywgcmV0dmFsKSk7Ci0KLQkJCXJldHZhbCA9IFJ0bXBPU0ZpbGVDbG9zZShzcmNmKTsKLQkJCWlmICggcmV0dmFsICE9IDApCi0JCQl7Ci0JCQkJcmV0dmFsID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJDbG9zZSBmaWxlIFwiJXNcIiBmYWlsZWQoZXJyQ29kZT0lZCkhXG4iLCBzcmMsIHJldHZhbCkpOwotCQkJfQotCQl9Ci0KLQkJUnRtcE9TRlNJbmZvQ2hhbmdlKCZvc0ZTSW5mbywgRkFMU0UpOwotCX0KLQotCWtmcmVlKGJ1ZmZlcik7Ci0KLQlyZXR1cm4gKHJldHZhbCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZjZkMGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ODczICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgcnRtcC5oCi0KLSAgICBBYnN0cmFjdDoKLSAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgUGF1bCBMaW4gICAgMjAwMi0wOC0wMSAgICBjcmVhdGVkCi0gICAgSmFtZXMgVGFuICAgMjAwMi0wOS0wNiAgICBtb2RpZmllZCAoUmV2aXNlIE5UQ1JlZ1RhYmxlKQotICAgIEpvaG4gQ2hhbmcgIDIwMDQtMDktMDYgICAgbW9kaWZpZWQgZm9yIFJUMjYwMAotKi8KLSNpZm5kZWYgX19SVE1QX0hfXwotI2RlZmluZSBfX1JUTVBfSF9fCi0KLSNpbmNsdWRlICJsaW5rX2xpc3QuaCIKLSNpbmNsdWRlICJzcGVjdHJ1bV9kZWYuaCIKLQotI2luY2x1ZGUgInJ0bXBfZG90MTEuaCIKLQotI2lmZGVmIE1MTUVfRVgKLSNpbmNsdWRlICJtbG1lX2V4X2RlZi5oIgotI2VuZGlmIC8vIE1MTUVfRVggLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jdW5kZWYgQVBfV1NDX0lOQ0xVREVECi0jdW5kZWYgU1RBX1dTQ19JTkNMVURFRAotI3VuZGVmIFdTQ19JTkNMVURFRAotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmIGRlZmluZWQoQVBfV1NDX0lOQ0xVREVEKSB8fCBkZWZpbmVkKFNUQV9XU0NfSU5DTFVERUQpCi0jZGVmaW5lIFdTQ19JTkNMVURFRAotI2VuZGlmCi0KLQotCi0KLQotI2luY2x1ZGUgInJ0bXBfY2hpcC5oIgotCi0KLQotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfQURBUFRFUgkJUlRNUF9BREFQVEVSOwotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfQURBUFRFUgkJKlBSVE1QX0FEQVBURVI7Ci0KLXR5cGVkZWYgc3RydWN0IF9SVE1QX0NISVBfT1BfIFJUTVBfQ0hJUF9PUDsKLQotCi0vLyNkZWZpbmUgREJHCQkxCi0KLS8vI2RlZmluZSBEQkdfRElBR05PU0UJCTEKLQotCi0vLysrK0FkZCBieSBzaGlhbmcgZm9yIG1lcmdlIE1pbmlwb3J0TU1SZXF1ZXN0KCkgYW5kIE1pbmlwb3J0RGF0YU1NUmVxdWVzdCgpIGludG8gb25lIGZ1bmN0aW9uCi0jZGVmaW5lIE1BWF9EQVRBTU1fUkVUUlkJMwotI2RlZmluZSBNR01UX1VTRV9RVUVVRV9GTEFHCTB4ODAKLS8vLS0tQWRkIGJ5IHNoaWFuZyBmb3IgbWVyZ2UgTWluaXBvcnRNTVJlcXVlc3QoKSBhbmQgTWluaXBvcnREYXRhTU1SZXF1ZXN0KCkgaW50byBvbmUgZnVuY3Rpb24KLQotI2RlZmluZQlNQVhTRVEJCSgweEZGRikKLQotCi0jaWYgZGVmaW5lZChDT05GSUdfQVBfU1VQUE9SVCkgJiYgZGVmaW5lZChDT05GSUdfU1RBX1NVUFBPUlQpCi0jZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX0FQKF9wQWQpCWlmKF9wQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCi0jZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShfcEFkKQlpZihfcEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLSNlbHNlCi0jZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX0FQKF9wQWQpCi0jZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShfcEFkKQotI2VuZGlmCi0KLWV4dGVybiAgdW5zaWduZWQgY2hhciAgIFNOQVBfQUlST05FVFtdOwotZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ0lTQ09fT1VJW107Ci1leHRlcm4gIFVDSEFSCUJhU2l6ZUFycmF5WzRdOwotCi1leHRlcm4gVUNIQVIgQlJPQURDQVNUX0FERFJbTUFDX0FERFJfTEVOXTsKLWV4dGVybiBVQ0hBUiBaRVJPX01BQ19BRERSW01BQ19BRERSX0xFTl07Ci1leHRlcm4gVUxPTkcgQklUMzJbMzJdOwotZXh0ZXJuIFVDSEFSIEJJVDhbOF07Ci1leHRlcm4gY2hhciogQ2lwaGVyTmFtZVtdOwotZXh0ZXJuIGNoYXIqIE1DU1RvTWJwc1tdOwotZXh0ZXJuIFVDSEFSCSBSeHdpTUNTVG9PZmRtUmF0ZVsxMl07Ci1leHRlcm4gVUNIQVIgU05BUF84MDJfMUhbNl07Ci1leHRlcm4gVUNIQVIgU05BUF9CUklER0VfVFVOTkVMWzZdOwotZXh0ZXJuIFVDSEFSIFNOQVBfQUlST05FVFs4XTsKLWV4dGVybiBVQ0hBUiBDS0lQX0xMQ19TTkFQWzhdOwotZXh0ZXJuIFVDSEFSIEVBUE9MX0xMQ19TTkFQWzhdOwotZXh0ZXJuIFVDSEFSIEVBUE9MWzJdOwotZXh0ZXJuIFVDSEFSIElQWFsyXTsKLWV4dGVybiBVQ0hBUiBBUFBMRV9UQUxLWzJdOwotZXh0ZXJuIFVDSEFSIFJhdGVJZFRvUGxjcFNpZ25hbFsxMl07IC8vIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQKLWV4dGVybiBVQ0hBUgkgT2ZkbVJhdGVUb1J4d2lNQ1NbXTsKLWV4dGVybiBVQ0hBUiBPZmRtU2lnbmFsVG9SYXRlSWRbMTZdIDsKLWV4dGVybiBVQ0hBUiBkZWZhdWx0X2N3bWluWzRdOwotZXh0ZXJuIFVDSEFSIGRlZmF1bHRfY3dtYXhbNF07Ci1leHRlcm4gVUNIQVIgZGVmYXVsdF9zdGFfYWlmc25bNF07Ci1leHRlcm4gVUNIQVIgTWFwVXNlclByaW9yaXR5VG9BY2Nlc3NDYXRlZ29yeVs4XTsKLQotZXh0ZXJuIFVTSE9SVCBSYXRlVXBQRVJbXTsKLWV4dGVybiBVU0hPUlQgUmF0ZURvd25QRVJbXTsKLWV4dGVybiBVQ0hBUiAgUGh5MTFCTmV4dFJhdGVEb3dud2FyZFtdOwotZXh0ZXJuIFVDSEFSICBQaHkxMUJOZXh0UmF0ZVVwd2FyZFtdOwotZXh0ZXJuIFVDSEFSICBQaHkxMUJHTmV4dFJhdGVEb3dud2FyZFtdOwotZXh0ZXJuIFVDSEFSICBQaHkxMUJHTmV4dFJhdGVVcHdhcmRbXTsKLWV4dGVybiBVQ0hBUiAgUGh5MTFBTmV4dFJhdGVEb3dud2FyZFtdOwotZXh0ZXJuIFVDSEFSICBQaHkxMUFOZXh0UmF0ZVVwd2FyZFtdOwotZXh0ZXJuIENIQVIgICBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW107Ci1leHRlcm4gVUNIQVIgIFJhdGVJZFRvTWJwc1tdOwotZXh0ZXJuIFVTSE9SVCBSYXRlSWRUbzUwMEticHNbXTsKLQotZXh0ZXJuIFVDSEFSICBDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwW107Ci1leHRlcm4gVUNIQVIgIENpcGhlclN1aXRlV3BhTm9uZVRraXBMZW47Ci0KLWV4dGVybiBVQ0hBUiAgQ2lwaGVyU3VpdGVXcGFOb25lQWVzW107Ci1leHRlcm4gVUNIQVIgIENpcGhlclN1aXRlV3BhTm9uZUFlc0xlbjsKLQotZXh0ZXJuIFVDSEFSICBTc2lkSWU7Ci1leHRlcm4gVUNIQVIgIFN1cFJhdGVJZTsKLWV4dGVybiBVQ0hBUiAgRXh0UmF0ZUllOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1leHRlcm4gVUNIQVIgIEh0Q2FwSWU7Ci1leHRlcm4gVUNIQVIgIEFkZEh0SW5mb0llOwotZXh0ZXJuIFVDSEFSICBOZXdFeHRDaGFuSWU7Ci0jaWZkZWYgRE9UMTFOX0RSQUZUMwotZXh0ZXJuIFVDSEFSICBFeHRIdENhcEllOwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotZXh0ZXJuIFVDSEFSICBFcnBJZTsKLWV4dGVybiBVQ0hBUiAgRHNJZTsKLWV4dGVybiBVQ0hBUiAgVGltSWU7Ci1leHRlcm4gVUNIQVIgIFdwYUllOwotZXh0ZXJuIFVDSEFSICBXcGEySWU7Ci1leHRlcm4gVUNIQVIgIElic3NJZTsKLWV4dGVybiBVQ0hBUiAgQ2N4MkllOwotZXh0ZXJuIFVDSEFSICBXYXBpSWU7Ci0KLWV4dGVybiBVQ0hBUiAgV1BBX09VSVtdOwotZXh0ZXJuIFVDSEFSICBSU05fT1VJW107Ci1leHRlcm4gVUNIQVIgIFdBUElfT1VJW107Ci1leHRlcm4gVUNIQVIgIFdNRV9JTkZPX0VMRU1bXTsKLWV4dGVybiBVQ0hBUiAgV01FX1BBUk1fRUxFTVtdOwotZXh0ZXJuIFVDSEFSICBDY3gyUW9zSW5mb1tdOwotZXh0ZXJuIFVDSEFSICBDY3gySWVJbmZvW107Ci1leHRlcm4gVUNIQVIgIFJBTElOS19PVUlbXTsKLWV4dGVybiBVQ0hBUiAgUG93ZXJDb25zdHJhaW50SUVbXTsKLQotCi1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZVtdOwotZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJbXTsKLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFHW107Ci1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQkdbXTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJHTjFTW107Ci1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbXTsKLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kW107Ci1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExTjFTW107Ci1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExTjJTW107Ci1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbXTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotZXh0ZXJuIFVDSEFSICBQUkVfTl9IVF9PVUlbXTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCi0jaWZkZWYgUkFMSU5LX0FURQotdHlwZWRlZglzdHJ1Y3QgX0FURV9JTkZPIHsKLQlVQ0hBUglNb2RlOwotCUNIQVIJVHhQb3dlcjA7Ci0JQ0hBUglUeFBvd2VyMTsKLQlDSEFSICAgIFR4QW50ZW5uYVNlbDsKLQlDSEFSICAgIFJ4QW50ZW5uYVNlbDsKLQlUWFdJX1NUUlVDICBUeFdJOwkgIC8vIFRYV0kKLQlVU0hPUlQJUUlEOwotCVVDSEFSCUFkZHIxW01BQ19BRERSX0xFTl07Ci0JVUNIQVIJQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUglBZGRyM1tNQUNfQUREUl9MRU5dOwotCVVDSEFSCUNoYW5uZWw7Ci0JVUlOVDMyCVR4TGVuZ3RoOwotCVVJTlQzMglUeENvdW50OwotCVVJTlQzMglUeERvbmVDb3VudDsgLy8gVHggRE1BIERvbmUKLQlVSU5UMzIJUkZGcmVxT2Zmc2V0OwotCUJPT0xFQU4JYlJ4RkVSOwkJLy8gU2hvdyBSeCBGcmFtZSBFcnJvciBSYXRlCi0JQk9PTEVBTgliUUFUeFN0YXJ0OyAvLyBIYXZlIGNvbXBpbGVkIFFBIGluIGFuZCB1c2UgaXQgdG8gQVRFIHR4LgotCUJPT0xFQU4JYlFBUnhTdGFydDsJLy8gSGF2ZSBjb21waWxlZCBRQSBpbiBhbmQgdXNlIGl0IHRvIEFURSByeC4KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlCT09MRUFOCWJGV0xvYWRpbmc7CS8vIFJlbG9hZCBmaXJtd2FyZSB3aGVuIEFURSBpcyBkb25lLgotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCVVJTlQzMglSeFRvdGFsQ250OwotCVVJTlQzMglSeENudFBlclNlYzsKLQotCUNIQVIJTGFzdFNOUjA7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgU05SCi0JQ0hBUiAgICBMYXN0U05SMTsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBTTlIgZm9yIDJuZCAgYW50ZW5uYQotCUNIQVIgICAgTGFzdFJzc2kwOyAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSQotCUNIQVIgICAgTGFzdFJzc2kxOyAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSSBmb3IgMm5kICBhbnRlbm5hCi0JQ0hBUiAgICBMYXN0UnNzaTI7ICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJIGZvciAzcmQgIGFudGVubmEKLQlDSEFSICAgIEF2Z1Jzc2kwOyAgICAgICAgICAgICAvLyBsYXN0IDggZnJhbWVzJyBhdmVyYWdlIFJTU0kKLQlDSEFSICAgIEF2Z1Jzc2kxOyAgICAgICAgICAgICAvLyBsYXN0IDggZnJhbWVzJyBhdmVyYWdlIFJTU0kKLQlDSEFSICAgIEF2Z1Jzc2kyOyAgICAgICAgICAgICAvLyBsYXN0IDggZnJhbWVzJyBhdmVyYWdlIFJTU0kKLQlTSE9SVCAgIEF2Z1Jzc2kwWDg7ICAgICAgICAgICAvLyBzdW0gb2YgbGFzdCA4IGZyYW1lcycgUlNTSQotCVNIT1JUICAgQXZnUnNzaTFYODsgICAgICAgICAgIC8vIHN1bSBvZiBsYXN0IDggZnJhbWVzJyBSU1NJCi0JU0hPUlQgICBBdmdSc3NpMlg4OyAgICAgICAgICAgLy8gc3VtIG9mIGxhc3QgOCBmcmFtZXMnIFJTU0kKLQotCVVJTlQzMglOdW1PZkF2Z1Jzc2lTYW1wbGU7Ci0KLQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JLy8gVHggZnJhbWUKLQlVU0hPUlQJCUhMZW47IC8vIEhlYWRlciBMZW5ndGgKLQlVU0hPUlQJCVBMZW47IC8vIFBhdHRlcm4gTGVuZ3RoCi0JVUNIQVIJCUhlYWRlclszMl07IC8vIEhlYWRlciBidWZmZXIKLQlVQ0hBUgkJUGF0dGVyblszMl07IC8vIFBhdHRlcm4gYnVmZmVyCi0JVVNIT1JUCQlETGVuOyAvLyBEYXRhIExlbmd0aAotCVVTSE9SVAkJc2VxOwotCVVJTlQzMgkJQ0lEOwotCVJUTVBfT1NfUElECUF0ZVBpZDsKLQkvLyBjb3VudGVycwotCVVJTlQzMgkJVTJNOwotCVVJTlQzMgkJT3RoZXJEYXRhOwotCVVJTlQzMgkJQmVhY29uOwotCVVJTlQzMgkJT3RoZXJDb3VudDsKLQlVSU5UMzIJCVR4QWMwOwotCVVJTlQzMgkJVHhBYzE7Ci0JVUlOVDMyCQlUeEFjMjsKLQlVSU5UMzIJCVR4QWMzOwotCS8qVUlOVDMyCQlUeEhDQ0E7Ki8KLQlVSU5UMzIJCVR4TWdtdDsKLQlVSU5UMzIJCVJTU0kwOwotCVVJTlQzMgkJUlNTSTE7Ci0JVUlOVDMyCQlSU1NJMjsKLQlVSU5UMzIJCVNOUjA7Ci0JVUlOVDMyCQlTTlIxOwotCS8vIFR4U3RhdHVzIDogMCAtLT4gdGFzayBpcyBpZGxlLCAxIC0tPiB0YXNrIGlzIHJ1bm5pbmcKLQlVQ0hBUgkJVHhTdGF0dXM7Ci0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLX0JQVRFX0lORk8sICpQQVRFX0lORk87Ci0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotc3RydWN0IGF0ZV9yYWNmZ2hkciB7Ci0JVUlOVDMyCQltYWdpY19ubzsKLQlVU0hPUlQJCWNvbW1hbmRfdHlwZTsKLQlVU0hPUlQJCWNvbW1hbmRfaWQ7Ci0JVVNIT1JUCQlsZW5ndGg7Ci0JVVNIT1JUCQlzZXF1ZW5jZTsKLQlVU0hPUlQJCXN0YXR1czsKLQlVQ0hBUgkJZGF0YVsyMDQ2XTsKLX0gIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0KLXR5cGVkZWYgc3RydWN0CV9SU1NJX1NBTVBMRSB7Ci0JQ0hBUgkJCUxhc3RSc3NpMDsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCi0JQ0hBUgkJCUxhc3RSc3NpMTsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCi0JQ0hBUgkJCUxhc3RSc3NpMjsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCi0JQ0hBUgkJCUF2Z1Jzc2kwOwotCUNIQVIJCQlBdmdSc3NpMTsKLQlDSEFSCQkJQXZnUnNzaTI7Ci0JU0hPUlQJCQlBdmdSc3NpMFg4OwotCVNIT1JUCQkJQXZnUnNzaTFYODsKLQlTSE9SVAkJCUF2Z1Jzc2kyWDg7Ci19IFJTU0lfU0FNUExFOwotCi0vLwotLy8gIFF1ZXVlIHN0cnVjdHVyZSBhbmQgbWFjcm9zCi0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9RVUVVRV9FTlRSWSAgICB7Ci0Jc3RydWN0IF9RVUVVRV9FTlRSWSAgICAgKk5leHQ7Ci19ICAgUVVFVUVfRU5UUlksICpQUVVFVUVfRU5UUlk7Ci0KLS8vIFF1ZXVlIHN0cnVjdHVyZQotdHlwZWRlZiBzdHJ1Y3QgIF9RVUVVRV9IRUFERVIgICB7Ci0JUFFVRVVFX0VOVFJZICAgIEhlYWQ7Ci0JUFFVRVVFX0VOVFJZICAgIFRhaWw7Ci0JVUxPTkcgICAgICAgICAgIE51bWJlcjsKLX0gICBRVUVVRV9IRUFERVIsICpQUVVFVUVfSEVBREVSOwotCi0jZGVmaW5lIEluaXRpYWxpemVRdWV1ZUhlYWRlcihRdWV1ZUhlYWRlcikgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoUXVldWVIZWFkZXIpLT5UYWlsID0gTlVMTDsgICBcCi0JKFF1ZXVlSGVhZGVyKS0+TnVtYmVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBSZW1vdmVIZWFkUXVldWUoUXVldWVIZWFkZXIpICAgICAgICAgICAgICAgIFwKLShRdWV1ZUhlYWRlciktPkhlYWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCVBRVUVVRV9FTlRSWSBwTmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoKFF1ZXVlSGVhZGVyKS0+SGVhZCAhPSBOVUxMKQkJCQlcCi0JewkJCQkJCQkJCQkJCVwKLQkJcE5leHQgPSAoUXVldWVIZWFkZXIpLT5IZWFkLT5OZXh0OyAgICAgICAgICBcCi0JCShRdWV1ZUhlYWRlciktPkhlYWQtPk5leHQgPSBOVUxMOwkJXAotCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gcE5leHQ7ICAgICAgICAgICAgICAgIFwKLQkJaWYgKHBOZXh0ID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkoUXVldWVIZWFkZXIpLT5UYWlsID0gTlVMTDsgICAgICAgICAgICAgXAotCQkoUXVldWVIZWFkZXIpLT5OdW1iZXItLTsgICAgICAgICAgICAgICAgICAgIFwKLQl9CQkJCQkJCQkJCQkJXAotfQotCi0jZGVmaW5lIEluc2VydEhlYWRRdWV1ZShRdWV1ZUhlYWRlciwgUXVldWVFbnRyeSkgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSgoUFFVRVVFX0VOVFJZKVF1ZXVlRW50cnkpLT5OZXh0ID0gKFF1ZXVlSGVhZGVyKS0+SGVhZDsgXAotCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgICAgIFwKLQkJaWYgKChRdWV1ZUhlYWRlciktPlRhaWwgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkoUXVldWVIZWFkZXIpLT5UYWlsID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgXAotCQkoUXVldWVIZWFkZXIpLT5OdW1iZXIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBJbnNlcnRUYWlsUXVldWUoUXVldWVIZWFkZXIsIFF1ZXVlRW50cnkpCQkJCVwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JKChQUVVFVUVfRU5UUlkpUXVldWVFbnRyeSktPk5leHQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgXAotCWlmICgoUXVldWVIZWFkZXIpLT5UYWlsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJKFF1ZXVlSGVhZGVyKS0+VGFpbC0+TmV4dCA9IChQUVVFVUVfRU5UUlkpKFF1ZXVlRW50cnkpOyBcCi0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgICAgIFwKLQkoUXVldWVIZWFkZXIpLT5UYWlsID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgICAgICAgICBcCi0JKFF1ZXVlSGVhZGVyKS0+TnVtYmVyKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIEluc2VydFRhaWxRdWV1ZUFjKHBBZCwgcEVudHJ5LCBRdWV1ZUhlYWRlciwgUXVldWVFbnRyeSkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCQkJXAotCSgoUFFVRVVFX0VOVFJZKVF1ZXVlRW50cnkpLT5OZXh0ID0gTlVMTDsJCQkJCQkJXAotCWlmICgoUXVldWVIZWFkZXIpLT5UYWlsKQkJCQkJCQkJCQkJXAotCQkoUXVldWVIZWFkZXIpLT5UYWlsLT5OZXh0ID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7CQkJXAotCWVsc2UJCQkJCQkJCQkJCQkJCQkJXAotCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7CQkJCVwKLQkoUXVldWVIZWFkZXIpLT5UYWlsID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7CQkJCQlcCi0JKFF1ZXVlSGVhZGVyKS0+TnVtYmVyKys7CQkJCQkJCQkJCQlcCi19Ci0KLQotCi0vLwotLy8gIE1hY3JvcyBmb3IgZmxhZyBhbmQgcmVmIGNvdW50IG9wZXJhdGlvbnMKLS8vCi0jZGVmaW5lIFJUTVBfU0VUX0ZMQUcoX00sIF9GKSAgICAgICAoKF9NKS0+RmxhZ3MgfD0gKF9GKSkKLSNkZWZpbmUgUlRNUF9DTEVBUl9GTEFHKF9NLCBfRikgICAgICgoX00pLT5GbGFncyAmPSB+KF9GKSkKLSNkZWZpbmUgUlRNUF9DTEVBUl9GTEFHUyhfTSkgICAgICAgICgoX00pLT5GbGFncyA9IDApCi0jZGVmaW5lIFJUTVBfVEVTVF9GTEFHKF9NLCBfRikgICAgICAoKChfTSktPkZsYWdzICYgKF9GKSkgIT0gMCkKLSNkZWZpbmUgUlRNUF9URVNUX0ZMQUdTKF9NLCBfRikgICAgICgoKF9NKS0+RmxhZ3MgJiAoX0YpKSA9PSAoX0YpKQotLy8gTWFjcm8gZm9yIHBvd2VyIHNhdmUgZmxhZy4KLSNkZWZpbmUgUlRNUF9TRVRfUFNGTEFHKF9NLCBfRikgICAgICAgKChfTSktPlBTRmxhZ3MgfD0gKF9GKSkKLSNkZWZpbmUgUlRNUF9DTEVBUl9QU0ZMQUcoX00sIF9GKSAgICAgKChfTSktPlBTRmxhZ3MgJj0gfihfRikpCi0jZGVmaW5lIFJUTVBfQ0xFQVJfUFNGTEFHUyhfTSkgICAgICAgICgoX00pLT5QU0ZsYWdzID0gMCkKLSNkZWZpbmUgUlRNUF9URVNUX1BTRkxBRyhfTSwgX0YpICAgICAgKCgoX00pLT5QU0ZsYWdzICYgKF9GKSkgIT0gMCkKLSNkZWZpbmUgUlRNUF9URVNUX1BTRkxBR1MoX00sIF9GKSAgICAgKCgoX00pLT5QU0ZsYWdzICYgKF9GKSkgPT0gKF9GKSkKLQotI2RlZmluZSBPUFNUQVRVU19TRVRfRkxBRyhfcEFkLCBfRikgICAgICgoX3BBZCktPkNvbW1vbkNmZy5PcFN0YXR1c0ZsYWdzIHw9IChfRikpCi0jZGVmaW5lIE9QU1RBVFVTX0NMRUFSX0ZMQUcoX3BBZCwgX0YpICAgKChfcEFkKS0+Q29tbW9uQ2ZnLk9wU3RhdHVzRmxhZ3MgJj0gfihfRikpCi0jZGVmaW5lIE9QU1RBVFVTX1RFU1RfRkxBRyhfcEFkLCBfRikgICAgKCgoX3BBZCktPkNvbW1vbkNmZy5PcFN0YXR1c0ZsYWdzICYgKF9GKSkgIT0gMCkKLQotI2RlZmluZSBDTElFTlRfU1RBVFVTX1NFVF9GTEFHKF9wRW50cnksX0YpICAgICAgKChfcEVudHJ5KS0+Q2xpZW50U3RhdHVzRmxhZ3MgfD0gKF9GKSkKLSNkZWZpbmUgQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKF9wRW50cnksX0YpICAgICgoX3BFbnRyeSktPkNsaWVudFN0YXR1c0ZsYWdzICY9IH4oX0YpKQotI2RlZmluZSBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhfcEVudHJ5LF9GKSAgICAgKCgoX3BFbnRyeSktPkNsaWVudFN0YXR1c0ZsYWdzICYgKF9GKSkgIT0gMCkKLQotI2RlZmluZSBSWF9GSUxURVJfU0VUX0ZMQUcoX3BBZCwgX0YpICAgICgoX3BBZCktPkNvbW1vbkNmZy5QYWNrZXRGaWx0ZXIgfD0gKF9GKSkKLSNkZWZpbmUgUlhfRklMVEVSX0NMRUFSX0ZMQUcoX3BBZCwgX0YpICAoKF9wQWQpLT5Db21tb25DZmcuUGFja2V0RmlsdGVyICY9IH4oX0YpKQotI2RlZmluZSBSWF9GSUxURVJfVEVTVF9GTEFHKF9wQWQsIF9GKSAgICgoKF9wQWQpLT5Db21tb25DZmcuUGFja2V0RmlsdGVyICYgKF9GKSkgIT0gMCkKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2RlZmluZSBTVEFfTk9fU0VDVVJJVFlfT04oX3ApICAgICAgICAgIChfcC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKQotI2RlZmluZSBTVEFfV0VQX09OKF9wKSAgICAgICAgICAgICAgICAgIChfcC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKQotI2RlZmluZSBTVEFfVEtJUF9PTihfcCkgICAgICAgICAgICAgICAgIChfcC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotI2RlZmluZSBTVEFfQUVTX09OKF9wKSAgICAgICAgICAgICAgICAgIChfcC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCi0jZGVmaW5lIFNUQV9UR05fV0lGSV9PTihfcCkgICAgICAgICAgICAgKF9wLT5TdGFDZmcuYlRHbldpZmlUZXN0ID09IFRSVUUpCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNkZWZpbmUgQ0tJUF9LUF9PTihfcCkJCQkJKCgoKF9wKS0+U3RhQ2ZnLkNraXBGbGFnKSAmIDB4MTApICYmICgoX3ApLT5TdGFDZmcuYkNraXBDbWljT24gPT0gVFJVRSkpCi0jZGVmaW5lIENLSVBfQ01JQ19PTihfcCkJCQkoKCgoX3ApLT5TdGFDZmcuQ2tpcEZsYWcpICYgMHgwOCkgJiYgKChfcCktPlN0YUNmZy5iQ2tpcENtaWNPbiA9PSBUUlVFKSkKLQotCi0jZGVmaW5lIElOQ19SSU5HX0lOREVYKF9pZHgsIF9SaW5nU2l6ZSkgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoX2lkeCkgPSAoX2lkeCsxKSAlIChfUmluZ1NpemUpOyAgICAgICBcCi19Ci0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotLy8gU3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1DU1NldCBpcyBjb3BpZWQgZnJvbSBBUCBiZWFjb24uICBEb24ndCBuZWVkIHRvIHVwZGF0ZSBoZXJlLgotI2RlZmluZSBDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKF9wQWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aDsgICAgICBcCi0JX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1pbW9QcyA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHM7ICAgICAgXAotCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5HRiA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRjsgICAgICBcCi0JX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlNob3J0R0lmb3IyMCA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjA7ICAgICAgXAotCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwOyAgICAgIFwKLQlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuVHhTVEJDID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQzsgICAgICBcCi0JX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlJ4U1RCQyA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkM7ICAgICAgXAotCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5FeHRDaGFuT2Zmc2V0ID0gX3BBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQ7ICAgICAgXAotCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5SZWNvbVdpZHRoID0gX3BBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGg7ICAgICAgXAotCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5PcGVyYWlvbk1vZGUgPSBfcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZTsgICAgICBcCi0JX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk5vbkdmUHJlc2VudCA9IF9wQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50OyAgICAgIFwKLQlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUQ2FwYWJpbGl0eS5NQ1NTZXQsIChfcEFkKS0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LCBzaXplb2YoVUNIQVIpICogMTYpO1wKLX0KLQotI2RlZmluZSBDT1BZX0FQX0hUU0VUVElOR1NfRlJPTV9CRUFDT04oX3BBZCwgX3BIdENhcGFiaWxpdHkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUgPSAoVUNIQVIpKF9wSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQU1zZHVTaXplKTsJXAotCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1tcHNNb2RlPSAoVUNIQVIpKF9wSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uTWltb1BzKTsJXAotCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1heFJBbXBkdUZhY3RvciA9IChVQ0hBUikoX3BIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IpOwlcCi19Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLS8vCi0vLyBNQUNSTyBmb3IgMzItYml0IFBDSSByZWdpc3RlciByZWFkIC8gd3JpdGUKLS8vCi0vLyBVc2FnZSA6IFJUTVBfSU9fUkVBRDMyKAotLy8gICAgICAgICAgICAgIFBSVE1QX0FEQVBURVIgcEFkLAotLy8gICAgICAgICAgICAgIFVMT05HIFJlZ2lzdGVyX09mZnNldCwKLS8vICAgICAgICAgICAgICBQVUxPTkcgIHBWYWx1ZSkKLS8vCi0vLyAgICAgICAgIFJUTVBfSU9fV1JJVEUzMigKLS8vICAgICAgICAgICAgICBQUlRNUF9BREFQVEVSIHBBZCwKLS8vICAgICAgICAgICAgICBVTE9ORyBSZWdpc3Rlcl9PZmZzZXQsCi0vLyAgICAgICAgICAgICAgVUxPTkcgVmFsdWUpCi0vLwotCi0KLS8vCi0vLyBDb21tb24gZnJhZ21lbnQgbGlzdCBzdHJ1Y3R1cmUgLSAgSWRlbnRpY2FsIHRvIHRoZSBzY2F0dGVyIGdhdGhlciBmcmFnIGxpc3Qgc3RydWN0dXJlCi0vLwotLy8jZGVmaW5lIFJUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCAgICAgICAgIFNDQVRURVJfR0FUSEVSX0VMRU1FTlQKLS8vI2RlZmluZSBQUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UICAgICAgICBQU0NBVFRFUl9HQVRIRVJfRUxFTUVOVAotI2RlZmluZSBOSUNfTUFYX1BIWVNfQlVGX0NPVU5UICAgICAgICAgICAgICA4Ci0KLXR5cGVkZWYgc3RydWN0IF9SVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQgewotICAgIFBWT0lECQlBZGRyZXNzOwotICAgIFVMT05HCQlMZW5ndGg7Ci0gICAgUFVMT05HCQlSZXNlcnZlZDsKLX0gUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5ULCAqUFJUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVDsKLQotCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUIHsKLSAgICBVTE9ORyAgTnVtYmVyT2ZFbGVtZW50czsKLSAgICBQVUxPTkcgUmVzZXJ2ZWQ7Ci0gICAgUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UIEVsZW1lbnRzW05JQ19NQVhfUEhZU19CVUZfQ09VTlRdOwotfSBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QsICpQUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUOwotCi0KLS8vCi0vLyAgU29tZSB1dGlsaXR5IG1hY3JvcwotLy8KLSNpZm5kZWYgbWluCi0jZGVmaW5lIG1pbihfYSwgX2IpICAgICAoKChfYSkgPCAoX2IpKSA/IChfYSkgOiAoX2IpKQotI2VuZGlmCi0KLSNpZm5kZWYgbWF4Ci0jZGVmaW5lIG1heChfYSwgX2IpICAgICAoKChfYSkgPiAoX2IpKSA/IChfYSkgOiAoX2IpKQotI2VuZGlmCi0KLSNkZWZpbmUgR0VUX0xOQV9HQUlOKF9wQWQpCSgoX3BBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkgPyAoX3BBZC0+QkxOQUdhaW4pIDogKChfcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDY0KSA/IChfcEFkLT5BTE5BR2FpbjApIDogKChfcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDEyOCkgPyAoX3BBZC0+QUxOQUdhaW4xKSA6IChfcEFkLT5BTE5BR2FpbjIpKSkpCi0KLSNkZWZpbmUgSU5DX0NPVU5URVI2NChWYWwpICAgICAgICAgIChWYWwuUXVhZFBhcnQrKykKLQotI2RlZmluZSBJTkZSQV9PTihfcCkgICAgICAgICAgICAgICAgKE9QU1RBVFVTX1RFU1RfRkxBRyhfcCwgZk9QX1NUQVRVU19JTkZSQV9PTikpCi0jZGVmaW5lIEFESE9DX09OKF9wKSAgICAgICAgICAgICAgICAoT1BTVEFUVVNfVEVTVF9GTEFHKF9wLCBmT1BfU1RBVFVTX0FESE9DX09OKSkKLSNkZWZpbmUgTU9OSVRPUl9PTihfcCkgICAgICAgICAgICAgICgoKF9wKS0+U3RhQ2ZnLkJzc1R5cGUpID09IEJTU19NT05JVE9SKQotI2RlZmluZSBJRExFX09OKF9wKSAgICAgICAgICAgICAgICAgKCFJTkZSQV9PTihfcCkgJiYgIUFESE9DX09OKF9wKSkKLQotLy8gQ2hlY2sgTEVBUCAmIENDS00gZmxhZ3MKLSNkZWZpbmUgTEVBUF9PTihfcCkgICAgICAgICAgICAgICAgICgoKF9wKS0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSkgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQotI2RlZmluZSBMRUFQX0NDS01fT04oX3ApICAgICAgICAgICAgKCgoKF9wKS0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSkgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKSAmJiAoKF9wKS0+U3RhQ2ZnLkxlYXBBdXRoSW5mby5DQ0tNID09IFRSVUUpKQotCi0vLyBpZiBvcmdpbmFsIEV0aGVybmV0IGZyYW1lIGNvbnRhaW5zIG5vIExMQy9TTkFQLCB0aGVuIGFuIGV4dHJhIExMQy9TTkFQIGVuY2FwIGlzIHJlcXVpcmVkCi0jZGVmaW5lIEVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfU1RBUlQoX3BCdWZWQSwgX3BFeHRyYUxsY1NuYXBFbmNhcCkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJXAotCWlmICgoKCooX3BCdWZWQSArIDEyKSA8PCA4KSArICooX3BCdWZWQSArIDEzKSkgPiAxNTAwKQkJXAotCXsJCQkJCQkJCQkJCQkJCQlcCi0JCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBTTkFQXzgwMl8xSDsJCQkJCQlcCi0JCWlmIChOZGlzRXF1YWxNZW1vcnkoSVBYLCBfcEJ1ZlZBICsgMTIsIDIpIHx8CQkJXAotCQkJTmRpc0VxdWFsTWVtb3J5KEFQUExFX1RBTEssIF9wQnVmVkEgKyAxMiwgMikpCQlcCi0JCXsJCQkJCQkJCQkJCQkJCVwKLQkJCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBTTkFQX0JSSURHRV9UVU5ORUw7CQkJXAotCQl9CQkJCQkJCQkJCQkJCQlcCi0JfQkJCQkJCQkJCQkJCQkJCVwKLQllbHNlCQkJCQkJCQkJCQkJCQlcCi0JewkJCQkJCQkJCQkJCQkJCVwKLQkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IE5VTEw7CQkJCQkJCQlcCi0JfQkJCQkJCQkJCQkJCQkJCVwKLX0KLQotLy8gTmV3IERlZmluZSBmb3IgbmV3IFR4IFBhdGguCi0jZGVmaW5lIEVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKF9wQnVmVkEsIF9wRXh0cmFMbGNTbmFwRW5jYXApCVwKLXsJCQkJCQkJCQkJCQkJCQkJXAotCWlmICgoKCooX3BCdWZWQSkgPDwgOCkgKyAqKF9wQnVmVkEgKyAxKSkgPiAxNTAwKQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJXAotCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gU05BUF84MDJfMUg7CQkJCQkJXAotCQlpZiAoTmRpc0VxdWFsTWVtb3J5KElQWCwgX3BCdWZWQSwgMikgfHwJCQkJCVwKLQkJCU5kaXNFcXVhbE1lbW9yeShBUFBMRV9UQUxLLCBfcEJ1ZlZBLCAyKSkJCQlcCi0JCXsJCQkJCQkJCQkJCQkJCVwKLQkJCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBTTkFQX0JSSURHRV9UVU5ORUw7CQkJXAotCQl9CQkJCQkJCQkJCQkJCQlcCi0JfQkJCQkJCQkJCQkJCQkJCVwKLQllbHNlCQkJCQkJCQkJCQkJCQlcCi0JewkJCQkJCQkJCQkJCQkJCVwKLQkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IE5VTEw7CQkJCQkJCQlcCi0JfQkJCQkJCQkJCQkJCQkJCVwKLX0KLQotCi0jZGVmaW5lIE1BS0VfODAyXzNfSEVBREVSKF9wLCBfcE1hYzEsIF9wTWFjMiwgX3BUeXBlKSAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTmRpc01vdmVNZW1vcnkoX3AsIF9wTWFjMSwgTUFDX0FERFJfTEVOKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTmRpc01vdmVNZW1vcnkoKF9wICsgTUFDX0FERFJfTEVOKSwgX3BNYWMyLCBNQUNfQUREUl9MRU4pOyAgICAgICAgICBcCi0gICAgTmRpc01vdmVNZW1vcnkoKF9wICsgTUFDX0FERFJfTEVOICogMiksIF9wVHlwZSwgTEVOR1RIXzgwMl8zX1RZUEUpOyBcCi19Ci0KLS8vIGlmIHBEYXRhIGhhcyBubyBMTEMvU05BUCAobmVpdGhlciBSRkMxMDQyIG5vciBCcmlkZ2UgdHVubmVsKSwga2VlcCBpdCB0aGF0IHdheS4KLS8vIGVsc2UgaWYgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIExMQy9TTkFQLWVuY2FwZWQgSVBYIG9yIEFQUExFVEFMSywgcHJlc2VydmUgdGhlIExMQy9TTkFQIGZpZWxkCi0vLyBlbHNlIHJlbW92ZSB0aGUgTExDL1NOQVAgZmllbGQgZnJvbSB0aGUgcmVzdWx0IEV0aGVybmV0IGZyYW1lCi0vLyBQYXRjaCBmb3IgV0hRTCBvbmx5LCB3aGljaCBkaWQgbm90IHR1cm4gb24gTmV0YmlvcyBidXQgdXNlIElQWCB3aXRoaW4gaXRzIHBheWxvYWQKLS8vIE5vdGU6Ci0vLyAgICAgX3BEYXRhICYgX0RhdGFTaXplIG1heSBiZSBhbHRlcmVkIChyZW1vdmUgOC1ieXRlIExMQy9TTkFQKSBieSB0aGlzIE1BQ1JPCi0vLyAgICAgX3BSZW1vdmVkTExDU05BUDogcG9pbnRlciB0byByZW1vdmVkIExMQy9TTkFQOyBOVUxMIGlzIG5vdCByZW1vdmVkCi0jZGVmaW5lIENPTlZFUlRfVE9fODAyXzMoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBfcERhdGEsIF9EYXRhU2l6ZSwgX3BSZW1vdmVkTExDU05BUCkgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhciBMTENfTGVuWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX3BSZW1vdmVkTExDU05BUCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKE5kaXNFcXVhbE1lbW9yeShTTkFQXzgwMl8xSCwgX3BEYXRhLCA2KSAgfHwgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIE5kaXNFcXVhbE1lbW9yeShTTkFQX0JSSURHRV9UVU5ORUwsIF9wRGF0YSwgNikpICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFBVQ0hBUiBwUHJvdG8gPSBfcERhdGEgKyA2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICgoTmRpc0VxdWFsTWVtb3J5KElQWCwgcFByb3RvLCAyKSB8fCBOZGlzRXF1YWxNZW1vcnkoQVBQTEVfVEFMSywgcFByb3RvLCAyKSkgJiYgIFwKLSAgICAgICAgICAgIE5kaXNFcXVhbE1lbW9yeShTTkFQXzgwMl8xSCwgX3BEYXRhLCA2KSkgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIExMQ19MZW5bMF0gPSAoVUNIQVIpKF9EYXRhU2l6ZSAvIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIExMQ19MZW5bMV0gPSAoVUNIQVIpKF9EYXRhU2l6ZSAlIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIE1BS0VfODAyXzNfSEVBREVSKF9wODAyM2hkciwgX3BEQSwgX3BTQSwgTExDX0xlbik7ICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIE1BS0VfODAyXzNfSEVBREVSKF9wODAyM2hkciwgX3BEQSwgX3BTQSwgcFByb3RvKTsgICAgICAgICAgIFwKLSAgICAgICAgICAgIF9wUmVtb3ZlZExMQ1NOQVAgPSBfcERhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIF9EYXRhU2l6ZSAtPSBMRU5HVEhfODAyXzFfSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIF9wRGF0YSArPSBMRU5HVEhfODAyXzFfSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgTExDX0xlblswXSA9IChVQ0hBUikoX0RhdGFTaXplIC8gMjU2KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgTExDX0xlblsxXSA9IChVQ0hBUikoX0RhdGFTaXplICUgMjU2KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgTUFLRV84MDJfM19IRUFERVIoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBMTENfTGVuKTsgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotCi0vLyBFbnF1ZXVlIHRoaXMgZnJhbWUgdG8gTUxNRSBlbmdpbmUKLS8vIFdlIG5lZWQgdG8gZW5xdWV1ZSB0aGUgd2hvbGUgZnJhbWUgYmVjYXVzZSBNTE1FIG5lZWQgdG8gcGFzcyBkYXRhIHR5cGUKLS8vIGluZm9ybWF0aW9uIGZyb20gODAyLjExIGhlYWRlcgotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2RlZmluZSBSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKF9wQWQsIFdjaWQsIF9wRnJhbWUsIF9GcmFtZVNpemUsIF9Sc3NpMCwgX1Jzc2kxLCBfUnNzaTIsIF9QbGNwU2lnbmFsKSAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBVSU5UMzIgSGlnaDMyVFNGLCBMb3czMlRTRjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFJUTVBfSU9fUkVBRDMyKF9wQWQsIFRTRl9USU1FUl9EVzEsICZIaWdoMzJUU0YpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBSVE1QX0lPX1JFQUQzMihfcEFkLCBUU0ZfVElNRVJfRFcwLCAmTG93MzJUU0YpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWxtZUVucXVldWVGb3JSZWN2KF9wQWQsIFdjaWQsIEhpZ2gzMlRTRiwgTG93MzJUU0YsIChVQ0hBUilfUnNzaTAsIChVQ0hBUilfUnNzaTEsKFVDSEFSKV9Sc3NpMixfRnJhbWVTaXplLCBfcEZyYW1lLCAoVUNIQVIpX1BsY3BTaWduYWwpOyAgIFwKLX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotI2RlZmluZSBNQUNfQUREUl9FUVVBTChwQWRkcjEscEFkZHIyKSAgICAgICAgICAgUlRNUEVxdWFsTWVtb3J5KChQVk9JRCkocEFkZHIxKSwgKFBWT0lEKShwQWRkcjIpLCBNQUNfQUREUl9MRU4pCi0jZGVmaW5lIFNTSURfRVFVQUwoc3NpZDEsIGxlbjEsIHNzaWQyLCBsZW4yKSAgICAoKGxlbjE9PWxlbjIpICYmIChSVE1QRXF1YWxNZW1vcnkoc3NpZDEsIHNzaWQyLCBsZW4xKSkpCi0KLS8vCi0vLyBDaGVjayBpZiBpdCBpcyBKYXBhbiBXNTMoY2g1Miw1Niw2MCw2NCkgY2hhbm5lbC4KLS8vCi0jZGVmaW5lIEphcGFuQ2hhbm5lbENoZWNrKGNoYW5uZWwpICAoKGNoYW5uZWwgPT0gNTIpIHx8IChjaGFubmVsID09IDU2KSB8fCAoY2hhbm5lbCA9PSA2MCkgfHwgKGNoYW5uZWwgPT0gNjQpKQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZGVmaW5lIFNUQV9FWFRSQV9TRVRUSU5HKF9wQWQpCi0KLSNkZWZpbmUgU1RBX1BPUlRfU0VDVVJFRChfcEFkKSBcCi17IFwKLQlCT09MRUFOCUNhbmNlbGxlZDsgXAotCShfcEFkKS0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7IFwKLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoKF9wQWQpLT5NYWNUYWJMb2NrKSk7IFwKLQkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBvcnRTZWN1cmVkID0gKF9wQWQpLT5TdGFDZmcuUG9ydFNlY3VyZWQ7IFwKLQkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDtcCi0JTmRpc1JlbGVhc2VTcGluTG9jaygmKF9wQWQpLT5NYWNUYWJMb2NrKTsgXAotCVJUTVBDYW5jZWxUaW1lcigmKChfcEFkKS0+TWxtZS5MaW5rRG93blRpbWVyKSwgJkNhbmNlbGxlZCk7XAotCVNUQV9FWFRSQV9TRVRUSU5HKF9wQWQpOyBcCi19Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCi0vLwotLy8gIERhdGEgYnVmZmVyIGZvciBETUEgb3BlcmF0aW9uLCB0aGUgYnVmZmVyIG11c3QgYmUgY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkKLS8vICBCb3RoIERNQSB0byAvIGZyb20gQ1BVIHVzZSB0aGUgc2FtZSBzdHJ1Y3R1cmUuCi0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX0RNQUJVRgotewotCVVMT05HICAgICAgICAgICAgICAgICAgIEFsbG9jU2l6ZTsKLQlQVk9JRCAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAgICAgICAgIC8vIFR4QnVmIHZpcnR1YWwgYWRkcmVzcwotCU5ESVNfUEhZU0lDQUxfQUREUkVTUyAgIEFsbG9jUGE7ICAgICAgICAgICAgLy8gVHhCdWYgcGh5c2ljYWwgYWRkcmVzcwotfSBSVE1QX0RNQUJVRiwgKlBSVE1QX0RNQUJVRjsKLQotCi0vLwotLy8gQ29udHJvbCBibG9jayAoRGVzY3JpcHRvcikgZm9yIGFsbCByaW5nIGRlc2NyaXB0b3IgRE1BIG9wZXJhdGlvbiwgYnVmZmVyIG11c3QgYmUKLS8vIGNvbnRpZ3VvdXMgcGh5c2ljYWwgbWVtb3J5LiBORElTX1BBQ0tFVCBzdG9yZWQgdGhlIGJpbmRpbmcgUnggcGFja2V0IGRlc2NyaXB0b3IKLS8vIHdoaWNoIHdvbid0IGJlIHJlbGVhc2VkLCBkcml2ZXIgaGFzIHRvIHdhaXQgdW50aWwgdXBwZXIgbGF5ZXIgcmV0dXJuIHRoZSBwYWNrZXQKLS8vIGJlZm9yZSBnaXZlaW5nIHVwIHRoaXMgcnggcmluZyBkZXNjcmlwdG9yIHRvIEFTSUMuIE5ESVNfQlVGRkVSIGlzIGFzc29jYWl0ZWQgcGFpcgotLy8gdG8gZGVzY3JpYmUgdGhlIHBhY2tldCBidWZmZXIuIEZvciBUeCwgTkRJU19QQUNLRVQgc3RvcmVkIHRoZSB0eCBwYWNrZXQgZGVzY3JpcHRvcgotLy8gd2hpY2ggZHJpdmVyIHNob3VsZCBBQ0sgdXBwZXIgbGF5ZXIgd2hlbiB0aGUgdHggaXMgcGh5c2ljYWxseSBkb25lIG9yIGZhaWxlZC4KLS8vCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9ETUFDQgotewotCVVMT05HICAgICAgICAgICAgICAgICAgIEFsbG9jU2l6ZTsgICAgICAgICAgLy8gQ29udHJvbCBibG9jayBzaXplCi0JUFZPSUQgICAgICAgICAgICAgICAgICAgQWxsb2NWYTsgICAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHZpcnR1YWwgYWRkcmVzcwotCU5ESVNfUEhZU0lDQUxfQUREUkVTUyAgIEFsbG9jUGE7ICAgICAgICAgICAgLy8gQ29udHJvbCBibG9jayBwaHlzaWNhbCBhZGRyZXNzCi0JUE5ESVNfUEFDS0VUIHBOZGlzUGFja2V0OwotCVBORElTX1BBQ0tFVCBwTmV4dE5kaXNQYWNrZXQ7Ci0KLQlSVE1QX0RNQUJVRiAgICAgICAgICAgICBEbWFCdWY7ICAgICAgICAgICAgIC8vIEFzc29jaWF0ZWQgRE1BIGJ1ZmZlciBzdHJ1Y3R1cmUKLX0gUlRNUF9ETUFDQiwgKlBSVE1QX0RNQUNCOwotCi0KLXR5cGVkZWYgc3RydWN0IF9SVE1QX1RYX1JJTkcKLXsKLQlSVE1QX0RNQUNCICBDZWxsW1RYX1JJTkdfU0laRV07Ci0JVUlOVDMyCQlUeENwdUlkeDsKLQlVSU5UMzIJCVR4RG1hSWR4OwotCVVJTlQzMgkJVHhTd0ZyZWVJZHg7CS8vIHNvZnR3YXJlIG5leHQgZnJlZSB0eCBpbmRleAotfSBSVE1QX1RYX1JJTkcsICpQUlRNUF9UWF9SSU5HOwotCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9SWF9SSU5HCi17Ci0JUlRNUF9ETUFDQiAgQ2VsbFtSWF9SSU5HX1NJWkVdOwotCVVJTlQzMgkJUnhDcHVJZHg7Ci0JVUlOVDMyCQlSeERtYUlkeDsKLQlJTlQzMgkJUnhTd1JlYWRJZHg7CS8vIHNvZnR3YXJlIG5leHQgcmVhZCBpbmRleAotfSBSVE1QX1JYX1JJTkcsICpQUlRNUF9SWF9SSU5HOwotCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9NR01UX1JJTkcKLXsKLQlSVE1QX0RNQUNCICBDZWxsW01HTVRfUklOR19TSVpFXTsKLQlVSU5UMzIJCVR4Q3B1SWR4OwotCVVJTlQzMgkJVHhEbWFJZHg7Ci0JVUlOVDMyCQlUeFN3RnJlZUlkeDsgLy8gc29mdHdhcmUgbmV4dCBmcmVlIHR4IGluZGV4Ci19IFJUTVBfTUdNVF9SSU5HLCAqUFJUTVBfTUdNVF9SSU5HOwotCi0KLS8vCi0vLyAgU3RhdGlzdGljIGNvdW50ZXIgc3RydWN0dXJlCi0vLwotdHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfODAyXzMKLXsKLQkvLyBHZW5lcmFsIFN0YXRzCi0JVUxPTkcgICAgICAgR29vZFRyYW5zbWl0czsKLQlVTE9ORyAgICAgICBHb29kUmVjZWl2ZXM7Ci0JVUxPTkcgICAgICAgVHhFcnJvcnM7Ci0JVUxPTkcgICAgICAgUnhFcnJvcnM7Ci0JVUxPTkcgICAgICAgUnhOb0J1ZmZlcjsKLQotCS8vIEV0aGVybmV0IFN0YXRzCi0JVUxPTkcgICAgICAgUmN2QWxpZ25tZW50RXJyb3JzOwotCVVMT05HICAgICAgIE9uZUNvbGxpc2lvbjsKLQlVTE9ORyAgICAgICBNb3JlQ29sbGlzaW9uczsKLQotfSBDT1VOVEVSXzgwMl8zLCAqUENPVU5URVJfODAyXzM7Ci0KLXR5cGVkZWYgc3RydWN0IF9DT1VOVEVSXzgwMl8xMSB7Ci0JVUxPTkcgICAgICAgICAgIExlbmd0aDsKLQlMQVJHRV9JTlRFR0VSICAgTGFzdFRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50OwotCUxBUkdFX0lOVEVHRVIgICBNdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIEZhaWxlZENvdW50OwotCUxBUkdFX0lOVEVHRVIgICBSZXRyeUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICBNdWx0aXBsZVJldHJ5Q291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIFJUU1N1Y2Nlc3NDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgUlRTRmFpbHVyZUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICBBQ0tGYWlsdXJlQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIEZyYW1lRHVwbGljYXRlQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIFJlY2VpdmVkRnJhZ21lbnRDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICBGQ1NFcnJvckNvdW50OwotfSBDT1VOVEVSXzgwMl8xMSwgKlBDT1VOVEVSXzgwMl8xMTsKLQotdHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfUkFMSU5LIHsKLQlVTE9ORyAgICAgICAgICAgVHJhbnNtaXR0ZWRCeXRlQ291bnQ7ICAgLy8gYm90aCBzdWNjZXNzZnVsIGFuZCBmYWlsdXJlLCB1c2VkIHRvIGNhbGN1bGF0ZSBUWCB0aHJvdWdocHV0Ci0JVUxPTkcgICAgICAgICAgIFJlY2VpdmVkQnl0ZUNvdW50OyAgICAgIC8vIGJvdGggQ1JDIG9rYXkgYW5kIENSQyBlcnJvciwgdXNlZCB0byBjYWxjdWxhdGUgUlggdGhyb3VnaHB1dAotCVVMT05HICAgICAgICAgICBCZWVuRGlzYXNzb2NpYXRlZENvdW50OwotCVVMT05HICAgICAgICAgICBCYWRDUUlBdXRvUmVjb3ZlcnlDb3VudDsKLQlVTE9ORyAgICAgICAgICAgUG9vckNRSVJvYW1pbmdDb3VudDsKLQlVTE9ORyAgICAgICAgICAgTWdtdFJpbmdGdWxsQ291bnQ7Ci0JVUxPTkcgICAgICAgICAgIFJ4Q291bnRTaW5jZUxhc3ROVUxMOwotCVVMT05HICAgICAgICAgICBSeENvdW50OwotCVVMT05HICAgICAgICAgICBSeFJpbmdFcnJDb3VudDsKLQlVTE9ORyAgICAgICAgICAgS2lja1R4Q291bnQ7Ci0JVUxPTkcgICAgICAgICAgIFR4UmluZ0VyckNvdW50OwotCUxBUkdFX0lOVEVHRVIgICBSZWFsRmNzRXJyQ291bnQ7Ci0JVUxPTkcgICAgICAgICAgIFBlbmRpbmdOZGlzUGFja2V0Q291bnQ7Ci0KLQlVTE9ORyAgICAgICAgICAgT25lU2VjT3NUeENvdW50W05VTV9PRl9UWF9SSU5HXTsKLQlVTE9ORyAgICAgICAgICAgT25lU2VjRG1hRG9uZUNvdW50W05VTV9PRl9UWF9SSU5HXTsKLQlVSU5UMzIgICAgICAgICAgT25lU2VjVHhEb25lQ291bnQ7Ci0JVUxPTkcgICAgICAgICAgIE9uZVNlY1J4Q291bnQ7Ci0JVUlOVDMyICAgICAgICAgIE9uZVNlY1R4QWdncmVnYXRpb25Db3VudDsKLQlVSU5UMzIgICAgICAgICAgT25lU2VjUnhBZ2dyZWdhdGlvbkNvdW50OwotCVVJTlQzMiAgICAgICAgICBPbmVTZWNSZWNlaXZlZEJ5dGVDb3VudDsKLQlVSU5UMzIJCQlPbmVTZWNGcmFtZUR1cGxpY2F0ZUNvdW50OwotCi0JVUlOVDMyICAgICAgICAgIE9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50OyAgIC8vIGJvdGggc3VjY2Vzc2Z1bCBhbmQgZmFpbHVyZSwgdXNlZCB0byBjYWxjdWxhdGUgVFggdGhyb3VnaHB1dAotCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeE5vUmV0cnlPa0NvdW50OwotCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeFJldHJ5T2tDb3VudDsKLQlVSU5UMzIgICAgICAgICAgT25lU2VjVHhGYWlsQ291bnQ7Ci0JVUlOVDMyICAgICAgICAgIE9uZVNlY0ZhbHNlQ0NBQ250OyAgICAgIC8vIENDQSBlcnJvciBjb3VudCwgZm9yIGRlYnVnIHB1cnBvc2UsIG1pZ2h0IG1vdmUgdG8gZ2xvYmFsIGNvdW50ZXIKLQlVSU5UMzIgICAgICAgICAgT25lU2VjUnhPa0NudDsgICAgICAgICAgLy8gUlggd2l0aG91dCBlcnJvcgotCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeE9rRGF0YUNudDsgICAgICAvLyB1bmljYXN0LXRvLW1lIERBVEEgZnJhbWUgY291bnQKLQlVSU5UMzIgICAgICAgICAgT25lU2VjUnhGY3NFcnJDbnQ7ICAgICAgLy8gQ1JDIGVycm9yCi0JVUlOVDMyICAgICAgICAgIE9uZVNlY0JlYWNvblNlbnRDbnQ7Ci0JVUlOVDMyICAgICAgICAgIExhc3RPbmVTZWNUb3RhbFR4Q291bnQ7IC8vIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKyBPbmVTZWNUeFJldHJ5T2tDb3VudCArIE9uZVNlY1R4RmFpbENvdW50Ci0JVUlOVDMyICAgICAgICAgIExhc3RPbmVTZWNSeE9rRGF0YUNudDsgIC8vIE9uZVNlY1J4T2tEYXRhQ250Ci0JVUxPTkcJCUR1cGxpY2F0ZVJjdjsKLQlVTE9ORwkJVHhBZ2dDb3VudDsKLQlVTE9ORwkJVHhOb25BZ2dDb3VudDsKLQlVTE9ORwkJVHhBZ2cxTVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzJNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnM01QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2c0TVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzVNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnNk1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2c3TVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzhNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnOU1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxME1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxMU1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxMk1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxM01QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxNE1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxNU1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxNk1QRFVDb3VudDsKLQotCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRPY3RldHNJbkFNU0RVOwotCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRBTVNEVUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICAgICAgUmVjZWl2ZWRPY3Rlc0luQU1TRFVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgICAgIFJlY2VpdmVkQU1TRFVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkQU1QRFVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkTVBEVXNJbkFNUERVQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZE9jdGV0c0luQU1QRFVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgICAgIE1QRFVJblJlY2VpdmVkQU1QRFVDb3VudDsKLX0gQ09VTlRFUl9SQUxJTkssICpQQ09VTlRFUl9SQUxJTks7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfRFJTIHsKLQkvLyB0byByZWNvcmQgdGhlIGVhY2ggVFggcmF0ZSdzIHF1YWxpdHkuIDAgaXMgYmVzdCwgdGhlIGJpZ2dlciB0aGUgd29yc2UuCi0JVVNIT1JUICAgICAgICAgIFR4UXVhbGl0eVtNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07Ci0JVUNIQVIgICAgICAgICAgIFBFUltNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07Ci0JVUNIQVIgICAgICAgICAgIFR4UmF0ZVVwUGVuYWx0eTsgICAgICAvLyBleHRyYSAjIG9mIHNlY29uZCBwZW5hbHR5IGR1ZSB0byBsYXN0IHVuc3RhYmxlIGNvbmRpdGlvbgotCVVMT05HICAgICAgICAgICBDdXJyVHhSYXRlU3RhYmxlVGltZTsgLy8gIyBvZiBzZWNvbmQgaW4gY3VycmVudCBUWCByYXRlCi0JQk9PTEVBTiAgICAgICAgIGZOb2lzeUVudmlyb25tZW50OwotCUJPT0xFQU4gICAgICAgICBmTGFzdFNlY0FjY29yZGluZ1JTU0k7Ci0JVUNIQVIgICAgICAgICAgIExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247IC8vIDA6IG5vIGNoYW5nZSwgMTpyYXRlIFVQLCAyOnJhdGUgZG93bgotCVVDSEFSCQkJTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb247IC8vS2VlcCBsYXN0IHRpbWUgdmFsdWUgb2YgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbgotCVVMT05HCQkJTGFzdFR4T2tDb3VudDsKLX0gQ09VTlRFUl9EUlMsICpQQ09VTlRFUl9EUlM7Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKglzZWN1cml0eSBrZXkgcmVsYXRlZCBkYXRhIHN0cnVjdHVyZQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IF9DSVBIRVJfS0VZIHsKLQlVQ0hBUiAgIEtleVsxNl07ICAgICAgICAgICAgLy8gcmlnaHQgbm93IHdlIGltcGxlbWVudCA0IGtleXMsIDEyOCBiaXRzIG1heAotCVVDSEFSICAgUnhNaWNbOF07CQkJLy8gbWFrZSBhbGlnbm1lbnQKLQlVQ0hBUiAgIFR4TWljWzhdOwotCVVDSEFSICAgVHhUc2NbNl07ICAgICAgICAgICAvLyA0OGJpdCBUU0MgdmFsdWUKLQlVQ0hBUiAgIFJ4VHNjWzZdOyAgICAgICAgICAgLy8gNDhiaXQgVFNDIHZhbHVlCi0JVUNIQVIgICBDaXBoZXJBbGc7ICAgICAgICAgIC8vIDAtbm9uZSwgMTpXRVA2NCwgMjpXRVAxMjgsIDM6VEtJUCwgNDpBRVMsIDU6Q0tJUDY0LCA2OkNLSVAxMjgKLQlVQ0hBUiAgIEtleUxlbjsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlVQ0hBUiAgIEJzc0lkWzZdOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotICAgICAgICAgICAgLy8gS2V5IGxlbmd0aCBmb3IgZWFjaCBrZXksIDA6IGVudHJ5IGlzIGludmFsaWQKLQlVQ0hBUiAgIFR5cGU7ICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgUGFpcndpc2UvR3JvdXAgd2hlbiByZXBvcnRpbmcgTUlDIGVycm9yCi19IENJUEhFUl9LRVksICpQQ0lQSEVSX0tFWTsKLQotCi0vLyBzdHJ1Y3R1cmUgdG8gZGVmaW5lIFdQQSBHcm91cCBLZXkgUmVrZXkgSW50ZXJ2YWwKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlRfODAyXzExX1dQQV9SRUtFWSB7Ci0JVUxPTkcgUmVLZXlNZXRob2Q7ICAgICAgICAgIC8vIG1lY2hhbmlzbSBmb3IgcmVrZXlpbmc6IDA6ZGlzYWJsZSwgMTogdGltZS1iYXNlZCwgMjogcGFja2V0LWJhc2VkCi0JVUxPTkcgUmVLZXlJbnRlcnZhbDsgICAgICAgIC8vIHRpbWUtYmFzZWQ6IHNlY29uZHMsIHBhY2tldC1iYXNlZDoga2lsby1wYWNrZXRzCi19IFJUX1dQQV9SRUtFWSwqUFJUX1dQQV9SRUtFWSwgUlRfODAyXzExX1dQQV9SRUtFWSwgKlBSVF84MDJfMTFfV1BBX1JFS0VZOwotCi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCVVDSEFSICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICAgICAgIEVycm9yQ29kZVsyXTsgIC8vMDAgMDEtSW52YWxpZCBhdXRoZW50aWNhdGlvbiB0eXBlCi0JCQkJCQkJLy8wMCAwMi1BdXRoZW50aWNhdGlvbiB0aW1lb3V0Ci0JCQkJCQkJLy8wMCAwMy1DaGFsbGVuZ2UgZnJvbSBBUCBmYWlsZWQKLQkJCQkJCQkvLzAwIDA0LUNoYWxsZW5nZSB0byBBUCBmYWlsZWQKLQlCT09MRUFOICAgICAgUmVwb3J0ZWQ7Ci19IFJPR1VFQVBfRU5UUlksICpQUk9HVUVBUF9FTlRSWTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCVVDSEFSICAgICAgICAgICAgICAgUm9ndWVBcE5yOwotCVJPR1VFQVBfRU5UUlkgICAgICAgUm9ndWVBcEVudHJ5W01BWF9MRU5fT0ZfQlNTX1RBQkxFXTsKLX0gUk9HVUVBUF9UQUJMRSwgKlBST0dVRUFQX1RBQkxFOwotCi0vLwotLy8gQ2lzY28gSUFQUCBmb3JtYXQKLS8vCi10eXBlZGVmIHN0cnVjdCAgX0NJU0NPX0lBUFBfQ09OVEVOVF8KLXsKLQlVU0hPUlQgICAgIExlbmd0aDsgICAgICAgIC8vSUFQUCBMZW5ndGgKLQlVQ0hBUiAgICAgIE1lc3NhZ2VUeXBlOyAgICAgIC8vSUFQUCB0eXBlCi0JVUNIQVIgICAgICBGdW5jdGlvbkNvZGU7ICAgICAvL0lBUFAgZnVuY3Rpb24gdHlwZQotCVVDSEFSICAgICAgRGVzdGluYWlvbk1BQ1tNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgU291cmNlTUFDW01BQ19BRERSX0xFTl07Ci0JVVNIT1JUICAgICBUYWc7ICAgICAgICAgICAvL1RhZyhlbGVtZW50IElFKSAtIEFkamFjZW50IEFQIHJlcG9ydAotCVVTSE9SVCAgICAgVGFnTGVuZ3RoOyAgICAgLy9MZW5ndGggb2YgZWxlbWVudCBub3QgaW5jbHVkaW5nIDQgYnl0ZSBoZWFkZXIKLQlVQ0hBUiAgICAgIE9VSVs0XTsgICAgICAgICAgIC8vMHgwMCwgMHg0MCwgMHg5NiwgMHgwMAotCVVDSEFSICAgICAgUHJldmlvdXNBUFtNQUNfQUREUl9MRU5dOyAgICAgICAvL01BQyBBZGRyZXNzIG9mIGFjY2VzcyBwb2ludAotCVVTSE9SVCAgICAgQ2hhbm5lbDsKLQlVU0hPUlQgICAgIFNzaWRMZW47Ci0JVUNIQVIgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0JVVNIT1JUICAgICBTZWNvbmRzOyAgICAgICAgICAvL1NlY29uZHMgdGhhdCB0aGUgY2xpZW50IGhhcyBiZWVuIGRpc2Fzc29jaWF0ZWQuCi19IENJU0NPX0lBUFBfQ09OVEVOVCwgKlBDSVNDT19JQVBQX0NPTlRFTlQ7Ci0KLQotLyoKLSAgKglGcmFnbWVudCBGcmFtZSBzdHJ1Y3R1cmUKLSAgKi8KLXR5cGVkZWYgc3RydWN0ICBfRlJBR01FTlRfRlJBTUUgewotCVBORElTX1BBQ0tFVCAgICBwRnJhZ1BhY2tldDsKLQlVTE9ORyAgICAgICBSeFNpemU7Ci0JVVNIT1JUICAgICAgU2VxdWVuY2U7Ci0JVVNIT1JUICAgICAgTGFzdEZyYWc7Ci0JVUxPTkcgICAgICAgRmxhZ3M7ICAgICAgICAgIC8vIFNvbWUgZXh0cmEgZnJhbWUgaW5mb3JtYXRpb24uIGJpdCAwOiBMTEMgcHJlc2VudGVkCi19IEZSQUdNRU5UX0ZSQU1FLCAqUEZSQUdNRU5UX0ZSQU1FOwotCi0KLS8vCi0vLyBQYWNrZXQgaW5mb3JtYXRpb24gZm9yIE5kaXNRdWVyeVBhY2tldAotLy8KLXR5cGVkZWYgc3RydWN0ICBfUEFDS0VUX0lORk8gICAgewotCVVJTlQgICAgICAgICAgICBQaHlzaWNhbEJ1ZmZlckNvdW50OyAgICAvLyBQaHlzaWNhbCBicmVha3Mgb2YgYnVmZmVyIGRlc2NyaXBvciBjaGFpbmVkCi0JVUlOVCAgICAgICAgICAgIEJ1ZmZlckNvdW50IDsgICAgICAgICAgIC8vIE51bWJlciBvZiBCdWZmZXIgZGVzY3JpcHRvciBjaGFpbmVkCi0JVUlOVCAgICAgICAgICAgIFRvdGFsUGFja2V0TGVuZ3RoIDsgICAgIC8vIFNlbGYgZXhwbGFpbmVkCi0JUE5ESVNfQlVGRkVSICAgIHBGaXJzdEJ1ZmZlcjsgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gZmlyc3QgYnVmZmVyIGRlc2NyaXB0b3IKLX0gUEFDS0VUX0lORk8sICpQUEFDS0VUX0lORk87Ci0KLQotLy8KLS8vICBBcmNmb3VyIFN0cnVjdHVyZSBBZGRlZCBieSBQYXVsV3UKLS8vCi10eXBlZGVmIHN0cnVjdCAgX0FSQ0ZPVVIKLXsKLQlVSU5UICAgICAgICAgICAgWDsKLQlVSU5UICAgICAgICAgICAgWTsKLQlVQ0hBUiAgICAgICAgICAgU1RBVEVbMjU2XTsKLX0gQVJDRk9VUkNPTlRFWFQsICpQQVJDRk9VUkNPTlRFWFQ7Ci0KLQotLy8KLS8vIFRraXAgS2V5IHN0cnVjdHVyZSB3aGljaCBSQzQga2V5ICYgTUlDIGNhbGN1bGF0aW9uCi0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9US0lQX0tFWV9JTkZPICB7Ci0JVUlOVCAgICAgICAgbkJ5dGVzSW5NOyAgLy8gIyBieXRlcyBpbiBNIGZvciBNSUNLRVkKLQlVTE9ORyAgICAgICBJVjE2OwotCVVMT05HICAgICAgIElWMzI7Ci0JVUxPTkcgICAgICAgSzA7ICAgICAgICAgLy8gZm9yIE1JQ0tFWSBMb3cKLQlVTE9ORyAgICAgICBLMTsgICAgICAgICAvLyBmb3IgTUlDS0VZIEhpZwotCVVMT05HICAgICAgIEw7ICAgICAgICAgIC8vIEN1cnJlbnQgc3RhdGUgZm9yIE1JQ0tFWQotCVVMT05HICAgICAgIFI7ICAgICAgICAgIC8vIEN1cnJlbnQgc3RhdGUgZm9yIE1JQ0tFWQotCVVMT05HICAgICAgIE07ICAgICAgICAgIC8vIE1lc3NhZ2UgYWNjdW11bGF0b3IgZm9yIE1JQ0tFWQotCVVDSEFSICAgICAgIFJDNEtFWVsxNl07Ci0JVUNIQVIgICAgICAgTUlDWzhdOwotfSBUS0lQX0tFWV9JTkZPLCAqUFRLSVBfS0VZX0lORk87Ci0KLQotLy8KLS8vIFByaXZhdGUgLyBNaXNjIGRhdGEsIGNvdW50ZXJzIGZvciBkcml2ZXIgaW50ZXJuYWwgdXNlCi0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9fUFJJVkFURV9TVFJVQyB7Ci0JVUlOVCAgICAgICBTeXN0ZW1SZXNldENudDsgICAgICAgICAvLyBTeXN0ZW0gcmVzZXQgY291bnRlcgotCVVJTlQgICAgICAgVHhSaW5nRnVsbENudDsgICAgICAgICAgLy8gVHggcmluZyBmdWxsIG9jY3VycmFuY2UgbnVtYmVyCi0JVUlOVCAgICAgICBQaHlSeEVyckNudDsgICAgICAgICAgICAvLyBQSFkgUnggZXJyb3IgY291bnQsIGZvciBkZWJ1ZyBwdXJwb3NlLCBtaWdodCBtb3ZlIHRvIGdsb2JhbCBjb3VudGVyCi0JLy8gVmFyaWFibGVzIGZvciBXRVAgZW5jcnlwdGlvbiAvIGRlY3J5cHRpb24gaW4gcnRtcF93ZXAuYwotCVVJTlQgICAgICAgRkNTQ1JDMzI7Ci0JQVJDRk9VUkNPTlRFWFQgIFdFUENPTlRFWFQ7Ci0JLy8gVGtpcCBzdHVmZgotCVRLSVBfS0VZX0lORk8gICBUeDsKLQlUS0lQX0tFWV9JTkZPICAgUng7Ci19IFBSSVZBVEVfU1RSVUMsICpQUFJJVkFURV9TVFJVQzsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoJQ2hhbm5lbCBhbmQgQkJQIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8gc3RydWN0dXJlIHRvIHR1bmUgQkJQIFI2NiAoQkJQIFRVTklORykKLXR5cGVkZWYgc3RydWN0IF9CQlBfUjY2X1RVTklORyB7Ci0JQk9PTEVBTiAgICAgYkVuYWJsZTsKLQlVU0hPUlQgICAgICBGYWxzZUNjYUxvd2VyVGhyZXNob2xkOyAgLy8gZGVmYXVsdCAxMDAKLQlVU0hPUlQgICAgICBGYWxzZUNjYVVwcGVyVGhyZXNob2xkOyAgLy8gZGVmYXVsdCA1MTIKLQlVQ0hBUiAgICAgICBSNjZEZWx0YTsKLQlVQ0hBUiAgICAgICBSNjZDdXJyZW50VmFsdWU7Ci0JQk9PTEVBTgkJUjY2TG93ZXJVcHBlclNlbGVjdDsgLy9CZWZvcmUgTGlua1VwLCBVc2VkIExvd2VyQm91bmQgb3IgVXBwZXJCb3VuZCBhcyBSNjYgdmFsdWUuCi19IEJCUF9SNjZfVFVOSU5HLCAqUEJCUF9SNjZfVFVOSU5HOwotCi0vLyBzdHJ1Y3R1cmUgdG8gc3RvcmUgY2hhbm5lbCBUWCBwb3dlcgotdHlwZWRlZiBzdHJ1Y3QgX0NIQU5ORUxfVFhfUE9XRVIgewotCVVTSE9SVCAgICAgUmVtYWluaW5nVGltZUZvclVzZTsJCS8vdW5pdDogc2VjCi0JVUNIQVIgICAgICBDaGFubmVsOwotI2lmZGVmIERPVDExTl9EUkFGVDMKLQlCT09MRUFOICAgICAgIGJFZmZlY3RlZENoYW5uZWw7CS8vIEZvciBCVyA0MCBvcGVyYXRpbmcgaW4gMi40R0h6ICwgdGhlICJlZmZlY3RlZCBjaGFubmVsIiBpcyB0aGUgY2hhbm5lbCB0aGF0IGlzIGNvdmVyZWQgaW4gNDBNaHouCi0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotCUNIQVIgICAgICAgUG93ZXI7Ci0JQ0hBUiAgICAgICBQb3dlcjI7Ci0JVUNIQVIgICAgICBNYXhUeFB3cjsKLQlVQ0hBUiAgICAgIERmc1JlcTsKLX0gQ0hBTk5FTF9UWF9QT1dFUiwgKlBDSEFOTkVMX1RYX1BPV0VSOwotCi0vLyBzdHJ1Y3R1cmUgdG8gc3RvcmUgODAyLjExaiBjaGFubmVsIFRYIHBvd2VyCi10eXBlZGVmIHN0cnVjdCBfQ0hBTk5FTF8xMUpfVFhfUE9XRVIgewotCVVDSEFSICAgICAgQ2hhbm5lbDsKLQlVQ0hBUiAgICAgIEJXOwkvLyBCV18xMCBvciBCV18yMAotCUNIQVIgICAgICAgUG93ZXI7Ci0JQ0hBUiAgICAgICBQb3dlcjI7Ci0JVVNIT1JUICAgICBSZW1haW5pbmdUaW1lRm9yVXNlOwkJLy91bml0OiBzZWMKLX0gQ0hBTk5FTF8xMUpfVFhfUE9XRVIsICpQQ0hBTk5FTF8xMUpfVFhfUE9XRVI7Ci0KLXR5cGVkZWYgc3RydWN0IF9TT0ZUX1JYX0FOVF9ESVZFUlNJVFlfU1RSVUNUIHsKLQlVQ0hBUiAgICAgRXZhbHVhdGVQZXJpb2Q7CQkgLy8gMDpub3QgZXZhbHV0ZSBzdGF0dXMsIDE6IGV2YWx1YXRlIHN0YXR1cywgMjogc3dpdGNoaW5nIHN0YXR1cwotCVVDSEFSICAgICBFdmFsdWF0ZVN0YWJsZUNudDsKLQlVQ0hBUiAgICAgUGFpcjFQcmltYXJ5UnhBbnQ7ICAgICAvLyAwOkFudC1FMSwgMTpBbnQtRTIKLQlVQ0hBUiAgICAgUGFpcjFTZWNvbmRhcnlSeEFudDsgICAvLyAwOkFudC1FMSwgMTpBbnQtRTIKLQlVQ0hBUiAgICAgUGFpcjJQcmltYXJ5UnhBbnQ7ICAgICAvLyAwOkFudC1FMywgMTpBbnQtRTQKLQlVQ0hBUiAgICAgUGFpcjJTZWNvbmRhcnlSeEFudDsgICAvLyAwOkFudC1FMywgMTpBbnQtRTQKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlTSE9SVCAgICAgUGFpcjFBdmdSc3NpWzJdOyAgICAgICAvLyBBdmdSc3NpWzBdOkUxLCBBdmdSc3NpWzFdOkUyCi0JU0hPUlQgICAgIFBhaXIyQXZnUnNzaVsyXTsgICAgICAgLy8gQXZnUnNzaVswXTpFMywgQXZnUnNzaVsxXTpFNAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCVNIT1JUICAgICBQYWlyMUxhc3RBdmdSc3NpOyAgICAgIC8vCi0JU0hPUlQgICAgIFBhaXIyTGFzdEF2Z1Jzc2k7ICAgICAgLy8KLQlVTE9ORyAgICAgUmN2UGt0TnVtV2hlbkV2YWx1YXRlOwotCUJPT0xFQU4gICBGaXJzdFBrdEFycml2ZWRXaGVuRXZhbHVhdGU7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBSeEFudERpdmVyc2l0eVRpbWVyOwotfSBTT0ZUX1JYX0FOVF9ESVZFUlNJVFksICpQU09GVF9SWF9BTlRfRElWRVJTSVRZOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKglzdHJ1Y3R1cmUgZm9yIHJhZGFyIGRldGVjdGlvbiBhbmQgY2hhbm5lbCBzd2l0Y2gKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCBfUkFEQVJfREVURUNUX1NUUlVDVCB7Ci0gICAgLy9CT09MRUFOCQlJRUVFODAyMTFIOwkJCS8vIDA6IGRpc2FibGUsIDE6IGVuYWJsZSBJRUVFODAyLjExaAotCVVDSEFSCQlDU0NvdW50OwkJCS8vQ2hhbm5lbCBzd2l0Y2ggY291bnRlcgotCVVDSEFSCQlDU1BlcmlvZDsJCQkvL0NoYW5uZWwgc3dpdGNoIHBlcmlvZCAoYmVhY29uIGNvdW50KQotCVVDSEFSCQlSRENvdW50OwkJCS8vUmFkYXIgZGV0ZWN0aW9uIGNvdW50ZXIKLQlVQ0hBUgkJUkRNb2RlOwkJCQkvL1JhZGFyIERldGVjdGlvbiBtb2RlCi0JVUNIQVIJCVJERHVyUmVnaW9uOwkJLy9SYWRhciBkZXRlY3Rpb24gZHVyYXRpb24gcmVnaW9uCi0JVUNIQVIJCUJCUFIxNjsKLQlVQ0hBUgkJQkJQUjE3OwotCVVDSEFSCQlCQlBSMTg7Ci0JVUNIQVIJCUJCUFIyMTsKLQlVQ0hBUgkJQkJQUjIyOwotCVVDSEFSCQlCQlBSNjQ7Ci0JVUxPTkcJCUluU2VydmljZU1vbml0b3JDb3VudDsgLy8gdW5pdDogc2VjCi0JVUlOVDgJCURmc1Nlc3Npb25UaW1lOwotI2lmZGVmIERGU19GQ0NfQlc0MF9GSVgKLQlDSEFSCQlEZnNTZXNzaW9uRmNjT2ZmOwotI2VuZGlmCi0JQk9PTEVBTgkJYkZhc3REZnM7Ci0JVUlOVDgJCUNoTW92aW5nVGltZTsKLQlVSU5UOAkJTG9uZ1B1bHNlUmFkYXJUaDsKLSNpZmRlZiBNRVJHRV9BUkNIX1RFQU0KLQlDSEFSCQlBdmdSc3NpUmVxOwotCVVMT05HCQlEZnNMb3dlckxpbWl0OwotCVVMT05HCQlEZnNVcHBlckxpbWl0OwotCVVJTlQ4CQlGaXhEZnNMaW1pdDsKLQlVTE9ORwkJdXBwZXJsaW1pdDsKLQlVTE9ORwkJbG93ZXJsaW1pdDsKLSNlbmRpZiAvLyBNRVJHRV9BUkNIX1RFQU0gLy8KLX0gUkFEQVJfREVURUNUX1NUUlVDVCwgKlBSQURBUl9ERVRFQ1RfU1RSVUNUOwotCi0jaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAotdHlwZWRlZiBlbnVtIENEX1NUQVRFX24KLXsKLQlDRF9OT1JNQUwsCi0JQ0RfU0lMRU5DRSwKLQlDRF9NQVhfU1RBVEUKLX0gQ0RfU1RBVEU7Ci0KLSNpZmRlZiBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUCi0jZGVmaW5lIENBUlJJRVJfREVURUNUX1JFQ0hFQ0tfVElNRQkJCTMKLQotCi0jaWZkZWYgQ0FSUklFUl9TRU5TRV9ORVdfQUxHTwotI2RlZmluZSBDQVJSSUVSX0RFVEVDVF9DUklUSVJJQQkJCQk0MDAKLSNkZWZpbmUgQ0FSUklFUl9ERVRFQ1RfU1RPUF9SQVRJTwkJCQkweDExCi0jZGVmaW5lCUNBUlJJRVJfREVURUNUX1NUT1BfUkFUSU9fT0xEXzMwOTAJCQkyCi0jZW5kaWYgLy8gQ0FSUklFUl9TRU5TRV9ORVdfQUxHTyAvLwotCi0KLSNkZWZpbmUgQ0FSUklFUl9ERVRFQ1RfU1RPUF9SRUNIRUNLX1RJTUUJCTQKLSNkZWZpbmUgQ0FSUklFUl9ERVRFQ1RfQ1JJVElSSUFfQQkJCQkyMzAKLSNkZWZpbmUgQ0FSUklFUl9ERVRFQ1RfREVMVEEJCQkJCTcKLSNkZWZpbmUgQ0FSUklFUl9ERVRFQ1RfRElWX0ZMQUcJCQkJMAotI2lmZGVmIFJUMzA5MAotI2RlZmluZSBDQVJSSUVSX0RFVEVDVF9USFJFU0hPTERfMzA5MEEJCQkweDFmZmZmZmZmCi0jZW5kaWYgLy8gUlQzMDkwIC8vCi0jaWZkZWYgUlQzMzkwCi0jZGVmaW5lIENBUlJJRVJfREVURUNUX1RIUkVTSE9MRAkJCTB4MGZmZmZmZmYKLSNlbmRpZiAvLyBSVDMzOTAgLy8KLSNpZm5kZWYgUlQzMzkwCi0jZGVmaW5lIENBUlJJRVJfREVURUNUX1RIUkVTSE9MRAkJCTB4MGZmZmZmZmYKLSNlbmRpZiAvLyBSVDMzOTAgLy8KLSNlbmRpZiAvLyBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUIC8vCi0KLXR5cGVkZWYgc3RydWN0IENBUlJJRVJfREVURUNUSU9OX3MKLXsKLQlCT09MRUFOCQkJCQlFbmFibGU7Ci0JVUlOVDgJCQkJCUNEU2Vzc2lvblRpbWU7Ci0JVUlOVDgJCQkJCUNEUGVyaW9kOwotCUNEX1NUQVRFCQkJCUNEX1N0YXRlOwotI2lmZGVmIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQKLQlVSU5UOAkJCQkJZGVsdGE7Ci0JVUlOVDgJCQkJCWRpdl9mbGFnOwotCVVJTlQzMgkJCQkJdGhyZXNob2xkOwotCVVJTlQ4CQkJCQlyZWNoZWNrOwotCVVJTlQ4CQkJCQlyZWNoZWNrMTsKLQlVSU5UOAkJCQkJcmVjaGVjazI7Ci0JVUlOVDMyCQkJCQlUaW1lU3RhbXA7Ci0JVUlOVDMyCQkJCQljcml0ZXJpYTsKLQlVSU5UMzIJCQkJCUNhcnJpZXJEZWJ1ZzsKLQlVTE9ORwkJCQkJaWRsZV90aW1lOwotCVVMT05HCQkJCQlidXN5X3RpbWU7Ci0JVUxPTkcJCQkJCURlYnVnOwotI2VuZGlmIC8vIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQgLy8KLX1DQVJSSUVSX0RFVEVDVElPTl9TVFJVQ1QsICpQQ0FSUklFUl9ERVRFQ1RJT05fU1RSVUNUOwotI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KLQotCi0jaWZkZWYgTkVXX0RGUwotdHlwZWRlZiBzdHJ1Y3QgX05ld0RGU0RlYnVnCi17Ci0JVUNIQVIgY2hhbm5lbDsKLQlVTE9ORyB3YWl0X3RpbWU7Ci0JVUNIQVIgZGVsdGFfZGVsYXlfcmFuZ2U7Ci0JVUNIQVIgZGVsdGFfZGVsYXlfc3RlcDsKLQlVQ0hBUiBFTF9yYW5nZTsKLQlVQ0hBUiBFTF9zdGVwOwotCVVDSEFSIEVIX3JhbmdlOwotCVVDSEFSIEVIX3N0ZXA7Ci0JVUNIQVIgV0xfcmFuZ2U7Ci0JVUNIQVIgV0xfc3RlcDsKLQlVQ0hBUiBXSF9yYW5nZTsKLQlVQ0hBUiBXSF9zdGVwOwotCVVMT05HIFRfZXhwZWN0ZWQ7Ci0JVUxPTkcgVF9tYXJnaW47Ci0JVUNIQVIgc3RhcnQ7Ci0JVUxPTkcgY291bnQ7Ci0JVUxPTkcgaWR4OwotCi19TmV3REZTRGVidWcsICpwTmV3REZTRGVidWc7Ci0KLSNkZWZpbmUgTkVXX0RGU19GQ0NfNV9FTlRfTlVNCQk1Ci0jZGVmaW5lIE5FV19ERlNfREJHX1BPUlRfRU5UX05VTV9QT1dFUgk4Ci0jZGVmaW5lIE5FV19ERlNfREJHX1BPUlRfRU5UX05VTQkJKDEgPDwgTkVXX0RGU19EQkdfUE9SVF9FTlRfTlVNX1BPV0VSKSAgLy8gQ0UgRGVidWcgUG9ydCBlbnRyeSBudW1iZXIsIDI1NgotI2RlZmluZSBORVdfREZTX0RCR19QT1JUX01BU0sJMHhmZgotCi0vLyBNYXRjaGVkIFBlcmlvZCBkZWZpbml0aW9uCi0jZGVmaW5lIE5FV19ERlNfTVBFUklPRF9FTlRfTlVNX1BPV0VSCQk4Ci0jZGVmaW5lIE5FV19ERlNfTVBFUklPRF9FTlRfTlVNCQkoMSA8PCBORVdfREZTX01QRVJJT0RfRU5UX05VTV9QT1dFUikJIC8vIENFIFBlcmlvZCBUYWJsZSBlbnRyeSBudW1iZXIsIDUxMgotI2RlZmluZSBORVdfREZTX01BWF9DSEFOTkVMCTQKLQotdHlwZWRlZiBzdHJ1Y3QgX05ld0RGU0RlYnVnUG9ydHsKLQlVTE9ORyBjb3VudGVyOwotCVVMT05HIHRpbWVzdGFtcDsKLQlVU0hPUlQgd2lkdGg7Ci0JVVNIT1JUIHN0YXJ0X2lkeDsgLy8gc3RhcnQgaW5kZXggdG8gcGVyaW9kIHRhYmxlCi0JVVNIT1JUIGVuZF9pZHg7IC8vIGVuZCBpbmRleCB0byBwZXJpb2QgdGFibGUKLX1OZXdERlNEZWJ1Z1BvcnQsICpwTmV3REZTRGVidWdQb3J0OwotCi0vLyBNYXRjaGVkIFBlcmlvZCBUYWJsZQotdHlwZWRlZiBzdHJ1Y3QgX05ld0RGU01QZXJpb2R7Ci0JVVNIT1JUCWlkeDsKLQlVU0hPUlQgd2lkdGg7Ci0JVVNIT1JUCWlkeDI7Ci0JVVNIT1JUIHdpZHRoMjsKLQlVTE9ORyBwZXJpb2Q7Ci19TmV3REZTTVBlcmlvZCwgKnBOZXdERlNNUGVyaW9kOwotCi0jZW5kaWYgLy8gTkVXX0RGUyAvLwotCi0KLXR5cGVkZWYgZW51bSBfQUJHQkFORF9TVEFURV8gewotCVVOS05PV05fQkFORCwKLQlCR19CQU5ELAotCUFfQkFORCwKLX0gQUJHQkFORF9TVEFURTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotLy8gUG93ZXIgc2F2ZSBtZXRob2QgY29udHJvbAotdHlwZWRlZgl1bmlvbglfUFNfQ09OVFJPTAl7Ci0Jc3RydWN0CXsKLQkJVUxPTkcJCUVuYWJsZVBTaW5JZGxlOjE7CQkJLy8gRW5hYmxlIHJhZGlvIG9mZiB3aGVuIG5vdCBjb25uZWN0IHRvIEFQLiByYWRpbyBvbiBvbmx5IHdoZW4gc2l0ZXN1cnZleSwKLQkJVUxPTkcJCUVuYWJsZU5ld1BTOjE7CQkvLyBFbmFibGUgbmV3ICBDaGlwIHBvd2VyIHNhdmUgZnVjbnRpb24gLiBOZXcgbWV0aG9kIGNhbiBvbmx5IGJlIGFwcGxpZWQgaW4gY2hpcCB2ZXJzaW9uIGFmdGVyIDI4NzIuIGFuZCBQQ0llLgotCQlVTE9ORwkJcnQzMHh4UG93ZXJNb2RlOjI7CQkJLy8gUG93ZXIgTGV2ZWwgTW9kZSBmb3IgcnQzMHh4IGNoaXAKLQkJVUxPTkcJCXJ0MzB4eEZvbGxvd0hvc3RBU1BNOjE7CQkJLy8gQ2FyZCBGb2xsb3dzIEhvc3QncyBzZXR0aW5nIGZvciBydDMweHggY2hpcC4KLQkJVUxPTkcJCXJ0MzB4eEZvcmNlQVNQTVRlc3Q6MTsJCQkvLyBGb3JjZSBlbmFibGUgTDEgZm9yIHJ0MzB4eCBjaGlwLiBUaGlzIGhhcyBoaWdoZXIgcHJpb3JpdHkgdGhhbiBydDMweHhGb2xsb3dIb3N0QVNQTSBNb2RlLgotCQlVTE9ORwkJcnN2OjI2OwkJCS8vIFJhZGlvIE1lYXN1cmVtZW50IEVuYWJsZQotCX0JZmllbGQ7Ci0JVUxPTkcJCQl3b3JkOwotfQlQU19DT05UUk9MLCAqUFBTX0NPTlRST0w7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoJc3RydWN0dXJlIGZvciBNTE1FIHN0YXRlIG1hY2hpbmUKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9TVFJVQ1QgewotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCS8vIFNUQSBzdGF0ZSBtYWNoaW5lcwotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIENudGxNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEFzc29jTWFjaGluZTsKLQlTVEFURV9NQUNISU5FICAgICAgICAgICBBdXRoTWFjaGluZTsKLQlTVEFURV9NQUNISU5FICAgICAgICAgICBBdXRoUnNwTWFjaGluZTsKLQlTVEFURV9NQUNISU5FICAgICAgICAgICBTeW5jTWFjaGluZTsKLQlTVEFURV9NQUNISU5FICAgICAgICAgICBXcGFQc2tNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIExlYXBNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEFzc29jRnVuY1tBU1NPQ19GVU5DX1NJWkVdOwotCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEF1dGhGdW5jW0FVVEhfRlVOQ19TSVpFXTsKLQlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBdXRoUnNwRnVuY1tBVVRIX1JTUF9GVU5DX1NJWkVdOwotCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIFN5bmNGdW5jW1NZTkNfRlVOQ19TSVpFXTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBY3RGdW5jW0FDVF9GVU5DX1NJWkVdOwotCS8vIEFjdGlvbgotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEFjdE1hY2hpbmU7Ci0KLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCVNUQVRFX01BQ0hJTkUJCQlEbHNNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIERsc0Z1bmNbRExTX0ZVTkNfU0laRV07Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQotCS8vIGNvbW1vbiBXUEEgc3RhdGUgbWFjaGluZQotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIFdwYU1hY2hpbmU7Ci0JU1RBVEVfTUFDSElORV9GVU5DICAgICAgV3BhRnVuY1tXUEFfRlVOQ19TSVpFXTsKLQotCi0KLQlVTE9ORyAgICAgICAgICAgICAgICAgICBDaGFubmVsUXVhbGl0eTsgIC8vIDAuLjEwMCwgQ2hhbm5lbCBRdWFsaXR5IEluZGljYXRpb24gZm9yIFJvYW1pbmcKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBOb3czMjsgICAgICAgICAgIC8vIGxhdGNoIHRoZSB2YWx1ZSBvZiBOZGlzR2V0U3lzdGVtVXBUaW1lKCkKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBMYXN0U2VuZE5VTExwc21UaW1lOwotCi0JQk9PTEVBTiAgICAgICAgICAgICAgICAgYlJ1bm5pbmc7Ci0JTkRJU19TUElOX0xPQ0sgICAgICAgICAgVGFza0xvY2s7Ci0JTUxNRV9RVUVVRSAgICAgICAgICAgICAgUXVldWU7Ci0KLQlVSU5UICAgICAgICAgICAgICAgICAgICBTaGlmdFJlZzsKLQotCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIFBlcmlvZGljVGltZXI7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgQVBTRFBlcmlvZGljVGltZXI7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgTGlua0Rvd25UaW1lcjsKLQlSQUxJTktfVElNRVJfU1RSVUNUICAgICBMaW5rVXBUaW1lcjsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICBiUHNQb2xsVGltZXJSdW5uaW5nOwotICAgIFJBTElOS19USU1FUl9TVFJVQ1QgICAgIFBzUG9sbFRpbWVyOwotCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIFJhZGlvT25PZmZUaW1lcjsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQlVTE9ORyAgICAgICAgICAgICAgICAgICBQZXJpb2RpY1JvdW5kOwotCVVMT05HICAgICAgICAgICAgICAgICAgIE9uZVNlY1BlcmlvZGljUm91bmQ7Ci0KLQlVQ0hBUgkJCQkJUmVhbFJ4UGF0aDsKLQlCT09MRUFOCQkJCQliTG93VGhyb3VnaHB1dDsKLQlCT09MRUFOCQkJCQliRW5hYmxlQXV0b0FudGVubmFDaGVjazsKLQlSQUxJTktfVElNRVJfU1RSVUNUCQlSeEFudEV2YWxUaW1lcjsKLQotI2lmZGVmIFJUMzB4eAotCVVDSEFSIENhbGlCVzQwUmZSMjQ7Ci0JVUNIQVIgQ2FsaUJXMjBSZlIyNDsKLSNlbmRpZiAvLyBSVDMweHggLy8KLQotfSBNTE1FX1NUUlVDVCwgKlBNTE1FX1NUUlVDVDsKLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoJODAyLjExIE4gcmVsYXRlZCBkYXRhIHN0cnVjdHVyZXMKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgcmVvcmRlcmluZ19tcGR1Ci17Ci0Jc3RydWN0IHJlb3JkZXJpbmdfbXBkdQkqbmV4dDsKLQlQTkRJU19QQUNLRVQJCQlwUGFja2V0OwkJLyogY292ZXJ0ZWQgdG8gODAyLjMgZnJhbWUgKi8KLQlpbnQJCQkJCQlTZXF1ZW5jZTsJCS8qIHNlcXVlbmNlIG51bWJlciBvZiBNUERVICovCi0JQk9PTEVBTgkJCQkJYkFNU0RVOwotfTsKLQotc3RydWN0IHJlb3JkZXJpbmdfbGlzdAotewotCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm5leHQ7Ci0JaW50CXFsZW47Ci19OwotCi1zdHJ1Y3QgcmVvcmRlcmluZ19tcGR1X3Bvb2wKLXsKLQlQVk9JRAkJCQkJbWVtOwotCU5ESVNfU1BJTl9MT0NLCQkJbG9jazsKLQlzdHJ1Y3QgcmVvcmRlcmluZ19saXN0CWZyZWVsaXN0OwotfTsKLQotdHlwZWRlZiBlbnVtIF9SRUNfQkxPQ0tBQ0tfU1RBVFVTCi17Ci0gICAgUmVjaXBpZW50X05PTkU9MCwKLQlSZWNpcGllbnRfVVNFRCwKLQlSZWNpcGllbnRfSGFuZGxlUmVzLAotICAgIFJlY2lwaWVudF9BY2NlcHQKLX0gUkVDX0JMT0NLQUNLX1NUQVRVUywgKlBSRUNfQkxPQ0tBQ0tfU1RBVFVTOwotCi10eXBlZGVmIGVudW0gX09SSV9CTE9DS0FDS19TVEFUVVMKLXsKLSAgICBPcmlnaW5hdG9yX05PTkU9MCwKLQlPcmlnaW5hdG9yX1VTRUQsCi0gICAgT3JpZ2luYXRvcl9XYWl0UmVzLAotICAgIE9yaWdpbmF0b3JfRG9uZQotfSBPUklfQkxPQ0tBQ0tfU1RBVFVTLCAqUE9SSV9CTE9DS0FDS19TVEFUVVM7Ci0KLXR5cGVkZWYgc3RydWN0IF9CQV9PUklfRU5UUll7Ci0JVUNIQVIgICBXY2lkOwotCVVDSEFSICAgVElEOwotCVVDSEFSICAgQkFXaW5TaXplOwotCVVDSEFSICAgVG9rZW47Ci0vLyBTZXF1ZW5jZSBpcyB0byBmaWxsIGV2ZXJ5IG91dGdvaW5nIFFvUyBEQVRBIGZyYW1lJ3Mgc2VxdWVuY2UgZmllbGQgaW4gODAyLjExIGhlYWRlci4KLQlVU0hPUlQJU2VxdWVuY2U7Ci0JVVNIT1JUCVRpbWVPdXRWYWx1ZTsKLQlPUklfQkxPQ0tBQ0tfU1RBVFVTICBPUklfQkFfU3RhdHVzOwotCVJBTElOS19USU1FUl9TVFJVQ1QgT1JJQkFUaW1lcjsKLQlQVk9JRAlwQWRhcHRlcjsKLX0gQkFfT1JJX0VOVFJZLCAqUEJBX09SSV9FTlRSWTsKLQotdHlwZWRlZiBzdHJ1Y3QgX0JBX1JFQ19FTlRSWSB7Ci0JVUNIQVIgICBXY2lkOwotCVVDSEFSICAgVElEOwotCVVDSEFSICAgQkFXaW5TaXplOwkvLyA3LjMuMS4xNC4gZWFjaCBidWZmZXIgaXMgY2FwYWJsZSBvZiBob2xkaW5nIGEgbWF4IEFNU0RVIG9yIE1TRFUuCi0JLy9VQ0hBUglOdW1PZlJ4UGt0OwotCS8vVUNIQVIgICAgQ3VyaW5kaWR4OyAvLyB0aGUgaGVhZCBpbiB0aGUgUlggcmVvcmRlcmluZyBidWZmZXIKLQlVU0hPUlQJCUxhc3RJbmRTZXE7Ci0vLwlVU0hPUlQJCUxhc3RJbmRTZXFBdFRpbWVyOwotCVVTSE9SVAkJVGltZU91dFZhbHVlOwotCVJBTElOS19USU1FUl9TVFJVQ1QgUkVDQkFUaW1lcjsKLQlVTE9ORwkJTGFzdEluZFNlcUF0VGltZXI7Ci0JVUxPTkcJCW5Ecm9wUGFja2V0OwotCVVMT05HCQlyY3ZTZXE7Ci0JUkVDX0JMT0NLQUNLX1NUQVRVUyAgUkVDX0JBX1N0YXR1czsKLS8vCVVDSEFSCVJ4QnVmSWR4VXNlZDsKLQkvLyBjb3JyZXNwb25kaW5nIHZpcnR1YWwgYWRkcmVzcyBmb3IgUlggcmVvcmRlcmluZyBwYWNrZXQgc3RvcmFnZS4KLQkvL1JUTVBfUkVPUkRFUkRNQUJVRiBNQVBfUlhCdWZbTUFYX1JYX1JFT1JERVJCVUZdOwotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFJ4UmVSaW5nTG9jazsgICAgICAgICAgICAgICAgIC8vIFJ4IFJpbmcgc3BpbmxvY2sKLS8vCXN0cnVjdCBfQkFfUkVDX0VOVFJZICpwTmV4dDsKLQlQVk9JRAlwQWRhcHRlcjsKLQlzdHJ1Y3QgcmVvcmRlcmluZ19saXN0CWxpc3Q7Ci19IEJBX1JFQ19FTlRSWSwgKlBCQV9SRUNfRU5UUlk7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCVVMT05HCQludW1Bc1JlY2lwaWVudDsJCS8vIEkgYW0gcmVjaXBpZW50IG9mIG51bUFzUmVjaXBpZW50IGNsaWVudHMuIFRoZXNlIGNsaWVudCBhcmUgaW4gdGhlIEJBUmVjRW50cnlbXQotCVVMT05HCQludW1Bc09yaWdpbmF0b3I7CS8vIEkgYW0gb3JpZ2luYXRvciBvZgludW1Bc09yaWdpbmF0b3IgY2xpZW50cy4gVGhlc2UgY2xpZW50cyBhcmUgaW4gdGhlIEJBT3JpRW50cnlbXQotCVVMT05HCQludW1Eb25lT3JpZ2luYXRvcjsJLy8gY291bnQgRG9uZSBPcmlnaW5hdG9yIHNlc3Npb25zCi0JQkFfT1JJX0VOVFJZICAgICAgIEJBT3JpRW50cnlbTUFYX0xFTl9PRl9CQV9PUklfVEFCTEVdOwotCUJBX1JFQ19FTlRSWSAgICAgICBCQVJlY0VudHJ5W01BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFXTsKLX0gQkFfVEFCTEUsICpQQkFfVEFCTEU7Ci0KLS8vRm9yIFF1cmV5QkFUYWJsZU9JRCB1c2U7Ci10eXBlZGVmIHN0cnVjdCAgUEFDS0VEIF9PSURfQkFfUkVDX0VOVFJZewotCVVDSEFSICAgTUFDQWRkcltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgQmFCaXRtYXA7ICAgLy8gaWYgKEJhQml0bWFwJigxPDxUSUQpKSwgdGhpcyBzZXNzaW9uIHdpdGh7TUFDQWRkciwgVElEfWV4aXN0cywgc28gcmVhZCBCdWZTaXplW1RJRF0gZm9yIEJ1ZmZlclNpemUKLQlVQ0hBUiAgIHJzdjsKLQlVQ0hBUiAgIEJ1ZlNpemVbOF07Ci0JUkVDX0JMT0NLQUNLX1NUQVRVUwlSRUNfQkFfU3RhdHVzWzhdOwotfSBPSURfQkFfUkVDX0VOVFJZLCAqUE9JRF9CQV9SRUNfRU5UUlk7Ci0KLS8vRm9yIFF1cmV5QkFUYWJsZU9JRCB1c2U7Ci10eXBlZGVmIHN0cnVjdCAgUEFDS0VEIF9PSURfQkFfT1JJX0VOVFJZewotCVVDSEFSICAgTUFDQWRkcltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgQmFCaXRtYXA7ICAvLyBpZiAoQmFCaXRtYXAmKDE8PFRJRCkpLCB0aGlzIHNlc3Npb24gd2l0aHtNQUNBZGRyLCBUSUR9ZXhpc3RzLCBzbyByZWFkIEJ1ZlNpemVbVElEXSBmb3IgQnVmZmVyU2l6ZSwgcmVhZCBPUklfQkFfU3RhdHVzW1RJRF0gZm9yIHN0YXR1cwotCVVDSEFSICAgcnN2OwotCVVDSEFSICAgQnVmU2l6ZVs4XTsKLQlPUklfQkxPQ0tBQ0tfU1RBVFVTICBPUklfQkFfU3RhdHVzWzhdOwotfSBPSURfQkFfT1JJX0VOVFJZLCAqUE9JRF9CQV9PUklfRU5UUlk7Ci0KLXR5cGVkZWYgc3RydWN0IF9RVUVSWUJBX1RBQkxFewotCU9JRF9CQV9PUklfRU5UUlkgICAgICAgQkFPcmlFbnRyeVszMl07Ci0JT0lEX0JBX1JFQ19FTlRSWSAgICAgICBCQVJlY0VudHJ5WzMyXTsKLQlVQ0hBUiAgIE9yaU51bTsvLyBOdW1iZXIgb2YgYmVsb3cgQkFPcmlFbnRyeQotCVVDSEFSICAgUmVjTnVtOy8vIE51bWJlciBvZiBiZWxvdyBCQVJlY0VudHJ5Ci19IFFVRVJZQkFfVEFCTEUsICpQUVVFUllCQV9UQUJMRTsKLQotdHlwZWRlZgl1bmlvbglfQkFDQVBfU1RSVUMJewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlzdHJ1Y3QJewotCQlVSU5UMzIgICAgIDo0OwotCQlVSU5UMzIgICAgIGIyMDQwQ29leGlzdFNjYW5TdXA6MTsJCS8vQXMgU3RhLCBzdXBwb3J0IGRvIDIwNDAgY29leGlzdGVuY2Ugc2NhbiBmb3IgQVAuIEFzIEFwLCBzdXBwb3J0IG1vbml0b3IgdHJpZ2dlciBldmVudCB0byBjaGVjayBpZiBjYW4gdXNlIEJXIDQwTUh6LgotCQlVSU5UMzIgICAgIGJIdEFkaG9jOjE7CQkJLy8gYWRob2MgY2FuIHVzZSBodCByYXRlLgotCQlVSU5UMzIgICAgIE1NUFNtb2RlOjI7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLCAwOnN0YXRpYywgMTpkeW5hbWljLCAyOnJzdiwgMzptaW1vIGVuYWJsZQotCQlVSU5UMzIgICAgIEFtc2R1U2l6ZToxOwkvLyAwOjM4MzksIDE6NzkzNSBieXRlcy4gVUlOVCAgTVNEVVNpemVUb0J5dGVzW10JPSB7IDM4MzksIDc5MzV9OwotCQlVSU5UMzIgICAgIEFtc2R1RW5hYmxlOjE7CS8vRW5hYmxlIEFNU0RVIHRyYW5zbWlzc3Rpb24KLQkJVUlOVDMyCQlNcGR1RGVuc2l0eTozOwotCQlVSU5UMzIJCVBvbGljeToyOwkvLyAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlCi0JCVVJTlQzMgkJQXV0b0JBOjE7CS8vIGF1dG9tYXRpY2FsbHkgQkEKLQkJVUlOVDMyCQlUeEJBV2luTGltaXQ6ODsKLQkJVUlOVDMyCQlSeEJBV2luTGltaXQ6ODsKLQl9CWZpZWxkOwotI2Vsc2UKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJ4QkFXaW5MaW1pdDo4OwotCQlVSU5UMzIJCVR4QkFXaW5MaW1pdDo4OwotCQlVSU5UMzIJCUF1dG9CQToxOwkvLyBhdXRvbWF0aWNhbGx5IEJBCi0JCVVJTlQzMgkJUG9saWN5OjI7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UKLQkJVUlOVDMyCQlNcGR1RGVuc2l0eTozOwotCQlVSU5UMzIJCUFtc2R1RW5hYmxlOjE7CS8vRW5hYmxlIEFNU0RVIHRyYW5zbWlzc3Rpb24KLQkJVUlOVDMyCQlBbXNkdVNpemU6MTsJLy8gMDozODM5LCAxOjc5MzUgYnl0ZXMuIFVJTlQgIE1TRFVTaXplVG9CeXRlc1tdCT0geyAzODM5LCA3OTM1fTsKLQkJVUlOVDMyCQlNTVBTbW9kZToyOwkvLyBNSU1PIHBvd2VyIHNhdmUgbW9yZSwgMDpzdGF0aWMsIDE6ZHluYW1pYywgMjpyc3YsIDM6bWltbyBlbmFibGUKLQkJVUlOVDMyCQliSHRBZGhvYzoxOwkJCS8vIGFkaG9jIGNhbiB1c2UgaHQgcmF0ZS4KLQkJVUlOVDMyCQliMjA0MENvZXhpc3RTY2FuU3VwOjE7CQkvL0FzIFN0YSwgc3VwcG9ydCBkbyAyMDQwIGNvZXhpc3RlbmNlIHNjYW4gZm9yIEFQLiBBcyBBcCwgc3VwcG9ydCBtb25pdG9yIHRyaWdnZXIgZXZlbnQgdG8gY2hlY2sgaWYgY2FuIHVzZSBCVyA0ME1Iei4KLQkJVUlOVDMyCQk6NDsKLQl9CWZpZWxkOwotI2VuZGlmCi0JVUlOVDMyCQkJd29yZDsKLX0gQkFDQVBfU1RSVUMsICpQQkFDQVBfU1RSVUM7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCUJPT0xFQU4JCUlzUmVjaXBpZW50OwotCVVDSEFSICAgTUFDQWRkcltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgVElEOwotCVVDSEFSICAgbk1TRFU7Ci0JVVNIT1JUICAgVGltZU91dDsKLQlCT09MRUFOIGJBbGxUaWQ7ICAvLyBJZiBUcnVlLCBkZWxldGUgYWxsIFRJRCBmb3IgQkEgc2Vzc2lvbnMgd2l0aCB0aGlzIE1BQ2FkZHIuCi19IE9JRF9BRERfQkFfRU5UUlksICpQT0lEX0FERF9CQV9FTlRSWTsKLQotCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotdHlwZWRlZiBlbnVtIF9CU1MyMDQwQ09FWElTVF9GTEFHewotCUJTU18yMDQwX0NPRVhJU1RfRElTQUJMRSA9IDAsCi0JQlNTXzIwNDBfQ09FWElTVF9USU1FUl9GSVJFRCAgPSAxLAotCUJTU18yMDQwX0NPRVhJU1RfSU5GT19TWU5DID0gMiwKLQlCU1NfMjA0MF9DT0VYSVNUX0lORk9fTk9USUZZID0gNCwKLX1CU1MyMDQwQ09FWElTVF9GTEFHOwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLQotI2RlZmluZSBJU19IVF9TVEEoX3BNYWNFbnRyeSkJXAotCShfcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQotCi0jZGVmaW5lIElTX0hUX1JBVEUoX3BNYWNFbnRyeSkJXAotCShfcE1hY0VudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQotCi0jZGVmaW5lIFBFRVJfSVNfSFRfUkFURShfcE1hY0VudHJ5KQlcCi0JKF9wTWFjRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCi0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCi0vL1RoaXMgc3RydWN0dXJlIGlzIGZvciBhbGwgODAyLjExbiBjYXJkIEludGVyT3B0aWJpbGl0eVRlc3QgYWN0aW9uLiBSZXNldCBhbGwgTnVtIGV2ZXJ5IG4gc2Vjb25kLiAgKERldGFpbHMgc2VlIE1MTUVQZXJpb2RpYykKLXR5cGVkZWYJc3RydWN0CV9JT1RfU1RSVUMJewotCVVDSEFSCQkJVGhyZXNob2xkWzJdOwotCVVDSEFSCQkJUmVvcmRlclRpbWVPdXROdW1bTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEVdOwkvLyBjb21wYXJlIHdpdGggdGhyZXNob2xkWzBdCi0JVUNIQVIJCQlSZWZyZXNoTnVtW01BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFXTsJLy8gY29tcGFyZSB3aXRoIHRocmVzaG9sZFsxXQotCVVMT05HCQkJT25lU2VjSW5XaW5kb3dDb3VudDsKLQlVTE9ORwkJCU9uZVNlY0ZyYW1lRHVwbGljYXRlQ291bnQ7Ci0JVUxPTkcJCQlPbmVTZWNPdXRXaW5kb3dDb3VudDsKLQlVQ0hBUgkJCURlbE9yaUFjdDsKLQlVQ0hBUgkJCURlbFJlY0FjdDsKLQlVQ0hBUgkJCVJUU1Nob3J0UHJvdDsKLQlVQ0hBUgkJCVJUU0xvbmdQcm90OwotCUJPT0xFQU4JCQliUlRTTG9uZ1Byb3RPbjsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlCT09MRUFOCQkJYkxhc3RBdGhlcm9zOwotICAgIEJPT0xFQU4JCQliQ3VycmVudEF0aGVyb3M7Ci0gICAgQk9PTEVBTiAgICAgICAgIGJOb3dBdGhlcm9zQnVyc3RPbjsKLQlCT09MRUFOCQkJYk5leHREaXNhYmxlUnhCQTsKLSAgICBCT09MRUFOCQkJYlRvZ2dsZTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLX0gSU9UX1NUUlVDLCAqUElPVF9TVFJVQzsKLQotCi0vLyBUaGlzIGlzIHRoZSByZWdpc3RyeSBzZXR0aW5nIGZvciA4MDIuMTFuIHRyYW5zbWl0IHNldHRpbmcuICBVc2VkIGluIGFkdmFuY2VkIHBhZ2UuCi10eXBlZGVmIHVuaW9uIF9SRUdfVFJBTlNNSVRfU0VUVElORyB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotIHN0cnVjdCB7Ci0gICAgICAgICBVSU5UMzIgIHJzdjoxMzsKLQkJIFVJTlQzMiAgRVhUQ0hBOjI7Ci0JCSBVSU5UMzIgIEhUTU9ERToxOwotCQkgVUlOVDMyICBUUkFOU05POjI7Ci0JCSBVSU5UMzIgIFNUQkM6MTsgLy9TUEFDRQotCQkgVUlOVDMyICBTaG9ydEdJOjE7Ci0JCSBVSU5UMzIgIEJXOjE7IC8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6Ci0JCSBVSU5UMzIgIFR4QkY6MTsgLy8gMyozCi0JCSBVSU5UMzIgIHJzdjA6MTA7Ci0JCSAvL1VJTlQzMiAgTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKLSAgICAgICAgIC8vVUlOVDMyICBQaHlNb2RlOjQ7Ci0gICAgfSBmaWVsZDsKLSNlbHNlCi0gc3RydWN0IHsKLSAgICAgICAgIC8vVUlOVDMyICBQaHlNb2RlOjQ7Ci0gICAgICAgICAvL1VJTlQzMiAgTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKLQkJIFVJTlQzMiAgcnN2MDoxMDsKLQkJIFVJTlQzMiAgVHhCRjoxOwotICAgICAgICAgVUlOVDMyICBCVzoxOyAvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegotICAgICAgICAgVUlOVDMyICBTaG9ydEdJOjE7Ci0gICAgICAgICBVSU5UMzIgIFNUQkM6MTsgLy9TUEFDRQotICAgICAgICAgVUlOVDMyICBUUkFOU05POjI7Ci0gICAgICAgICBVSU5UMzIgIEhUTU9ERToxOwotICAgICAgICAgVUlOVDMyICBFWFRDSEE6MjsKLSAgICAgICAgIFVJTlQzMiAgcnN2OjEzOwotICAgIH0gZmllbGQ7Ci0jZW5kaWYKLSBVSU5UMzIgICB3b3JkOwotfSBSRUdfVFJBTlNNSVRfU0VUVElORywgKlBSRUdfVFJBTlNNSVRfU0VUVElORzsKLQotCi10eXBlZGVmIHVuaW9uICBfREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HIHsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0Jc3RydWN0CXsKLQkJCVVTSE9SVAkJcnN2OjM7Ci0JCQlVU0hPUlQJCUZpeGVkVHhNb2RlOjI7CQkJLy8gSWYgTUNTIGlzbid0IEFVVE8sIGZpeCByYXRlIGluIENDSywgT0ZETSBvciBIVCBtb2RlLgotCQkJVVNIT1JUCQlQaHlNb2RlOjQ7Ci0JCQlVU0hPUlQJCU1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTCi0JfQlmaWVsZDsKLSNlbHNlCi0Jc3RydWN0CXsKLQkJCVVTSE9SVAkJTUNTOjc7CQkJLy8gTUNTCi0JCQlVU0hPUlQJCVBoeU1vZGU6NDsKLQkJCVVTSE9SVAkJRml4ZWRUeE1vZGU6MjsJCQkvLyBJZiBNQ1MgaXNuJ3QgQVVUTywgZml4IHJhdGUgaW4gQ0NLLCBPRkRNIG9yIEhUIG1vZGUuCi0JCQlVU0hPUlQJCXJzdjozOwotCX0JZmllbGQ7Ci0jZW5kaWYKLQlVU0hPUlQJCXdvcmQ7Ci0gfSBERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcsICpQREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HOwotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoJTXVsdGlwbGUgU1NJRCByZWxhdGVkIGRhdGEgc3RydWN0dXJlcwotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgV0xBTl9NQVhfTlVNX09GX1RJTQkJCSgoTUFYX0xFTl9PRl9NQUNfVEFCTEUgPj4gMykgKyAxKSAvKiAvOCArIDEgKi8KLSNkZWZpbmUgV0xBTl9DVF9USU1fQkNNQ19PRkZTRVQJCTAgLyogdW5pdDogMzJCICovCi0KLS8qIGNsZWFyIGJjbWMgVElNIGJpdCAqLwotI2RlZmluZSBXTEFOX01SX1RJTV9CQ01DX0NMRUFSKGFwaWR4KSBcCi0JcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbV0xBTl9DVF9USU1fQkNNQ19PRkZTRVRdICY9IH5CSVQ4WzBdOwotCi0vKiBzZXQgYmNtYyBUSU0gYml0ICovCi0jZGVmaW5lIFdMQU5fTVJfVElNX0JDTUNfU0VUKGFwaWR4KSBcCi0JcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbV0xBTl9DVF9USU1fQkNNQ19PRkZTRVRdIHw9IEJJVDhbMF07Ci0KLS8qIGNsZWFyIGEgc3RhdGlvbiBQUyBUSU0gYml0ICovCi0jZGVmaW5lIFdMQU5fTVJfVElNX0JJVF9DTEVBUihhZF9wLCBhcGlkeCwgd2NpZCkgXAotCXsJVUNIQVIgdGltX29mZnNldCA9IHdjaWQgPj4gMzsgXAotCQlVQ0hBUiBiaXRfb2Zmc2V0ID0gd2NpZCAmIDB4NzsgXAotCQlhZF9wLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbdGltX29mZnNldF0gJj0gKH5CSVQ4W2JpdF9vZmZzZXRdKTsgfQotCi0vKiBzZXQgYSBzdGF0aW9uIFBTIFRJTSBiaXQgKi8KLSNkZWZpbmUgV0xBTl9NUl9USU1fQklUX1NFVChhZF9wLCBhcGlkeCwgd2NpZCkgXAotCXsJVUNIQVIgdGltX29mZnNldCA9IHdjaWQgPj4gMzsgXAotCQlVQ0hBUiBiaXRfb2Zmc2V0ID0gd2NpZCAmIDB4NzsgXAotCQlhZF9wLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbdGltX29mZnNldF0gfD0gQklUOFtiaXRfb2Zmc2V0XTsgfQotCi0KLS8vIGNvbmZpZ3VyYXRpb24gY29tbW9uIHRvIE9QTU9ERV9BUCBhcyB3ZWxsIGFzIE9QTU9ERV9TVEEKLXR5cGVkZWYgc3RydWN0IF9DT01NT05fQ09ORklHIHsKLQotCUJPT0xFQU4JCWJDb3VudHJ5RmxhZzsKLQlVQ0hBUgkJQ291bnRyeUNvZGVbM107Ci0JVUNIQVIJCUdlb2dyYXBoeTsKLQlVQ0hBUiAgICAgICBDb3VudHJ5UmVnaW9uOyAgICAgIC8vIEVudW0gb2YgY291bnRyeSByZWdpb24sIDA6RkNDLCAxOklDLCAyOkVUU0ksIDM6U1BBSU4sIDQ6RnJhbmNlLCA1Ok1LSywgNjpNS0sxLCA3OklzcmFlbAotCVVDSEFSICAgICAgIENvdW50cnlSZWdpb25Gb3JBQmFuZDsJLy8gRW51bSBvZiBjb3VudHJ5IHJlZ2lvbiBmb3IgQSBiYW5kCi0JVUNIQVIgICAgICAgUGh5TW9kZTsgICAgICAgICAgICAvLyBQSFlfMTFBLCBQSFlfMTFCLCBQSFlfMTFCR19NSVhFRCwgUEhZX0FCR19NSVhFRAotCVVDSEFSICAgICAgIERlc2lyZWRQaHlNb2RlOyAgICAgICAgICAgIC8vIFBIWV8xMUEsIFBIWV8xMUIsIFBIWV8xMUJHX01JWEVELCBQSFlfQUJHX01JWEVECi0JVVNIT1JUICAgICAgRHNpZnM7ICAgICAgICAgICAgICAvLyBpbiB1bml0cyBvZiB1c2VjCi0JVUxPTkcgICAgICAgUGFja2V0RmlsdGVyOyAgICAgICAvLyBQYWNrZXQgZmlsdGVyIGZvciByZWNlaXZpbmcKLQlVSU5UOAkJUmVndWxhdG9yeUNsYXNzW01BWF9OVU1fT0ZfUkVHVUxBVE9SWV9DTEFTU107Ci0KLQlDSEFSICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07IC8vIE5PVCBOVUxMLXRlcm1pbmF0ZWQKLQlVQ0hBUiAgICAgICBTc2lkTGVuOyAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZAotCVVDSEFSICAgICAgIExhc3RTc2lkTGVuOyAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZAotCUNIQVIgICAgICAgIExhc3RTc2lkW01BWF9MRU5fT0ZfU1NJRF07IC8vIE5PVCBOVUxMLXRlcm1pbmF0ZWQKLQlVQ0hBUgkJTGFzdEJzc2lkW01BQ19BRERSX0xFTl07Ci0KLQlVQ0hBUiAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOwotCVVTSE9SVCAgICAgIEJlYWNvblBlcmlvZDsKLQlVQ0hBUiAgICAgICBDaGFubmVsOwotCVVDSEFSICAgICAgIENlbnRyYWxDaGFubmVsOwkvLyBDZW50cmFsIENoYW5uZWwgd2hlbiB1c2luZyA0ME1IeiBpcyBpbmRpY2F0aW5nLiBub3QgcmVhbCBjaGFubmVsLgotCi0JVUNIQVIgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIgICAgICAgU3VwUmF0ZUxlbjsKLQlVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUiAgICAgICBFeHRSYXRlTGVuOwotCVVDSEFSICAgICAgIERlc2lyZVJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOyAgICAgIC8vIE9JRF84MDJfMTFfREVTSVJFRF9SQVRFUwotCVVDSEFSICAgICAgIE1heERlc2lyZWRSYXRlOwotCVVDSEFSICAgICAgIEV4cGVjdGVkQUNLUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0KLQlVTE9ORyAgICAgICBCYXNpY1JhdGVCaXRtYXA7ICAgICAgICAvLyBiYWNrdXAgYmFzaWMgcmF0ZWJpdG1hcAotCi0JQk9PTEVBTgkJYkFQU0RDYXBhYmxlOwotCUJPT0xFQU4JCWJJblNlcnZpY2VQZXJpb2Q7Ci0JQk9PTEVBTgkJYkFQU0RBQ19CRTsKLQlCT09MRUFOCQliQVBTREFDX0JLOwotCUJPT0xFQU4JCWJBUFNEQUNfVkk7Ci0JQk9PTEVBTgkJYkFQU0RBQ19WTzsKLQotCS8qIGJlY2F1c2UgVFNQRUMgY2FuIG1vZGlmeSB0aGUgQVBTRCBmbGFnLCB3ZSBuZWVkIHRvIGtlZXAgdGhlIEFQU0QgZmxhZwotCQlyZXF1ZXN0ZWQgaW4gYXNzb2NpYXRpb24gc3RhZ2UgZnJvbSB0aGUgc3RhdGlvbjsKLQkJd2UgbmVlZCB0byByZWNvdmVyIHRoZSBBUFNEIGZsYWcgYWZ0ZXIgdGhlIFRTUEVDIGlzIGRlbGV0ZWQuICovCi0JQk9PTEVBTgkJYkFDTUFQU0RCYWNrdXBbNF07IC8qIGZvciBkZWxpdmVyeS1lbmFibGVkICYgdHJpZ2dlci1lbmFibGVkIGJvdGggKi8KLQlCT09MRUFOCQliQUNNQVBTRFRyWzRdOyAvKiBubyB1c2UgKi8KLQotCUJPT0xFQU4JCWJOZWVkU2VuZFRyaWdnZXJGcmFtZTsKLQlCT09MRUFOCQliQVBTREZvcmNlUG93ZXJTYXZlOwkvLyBGb3JjZSBwb3dlciBzYXZlIG1vZGUsIHNob3VsZCBvbmx5IHVzZSBpbiBBUFNELVNUQVVUCi0JVUxPTkcJCVRyaWdnZXJUaW1lckNvdW50OwotCVVDSEFSCQlNYXhTUExlbmd0aDsKLQlVQ0hBUgkJQkJQQ3VycmVudEJXOwkvLyBCV18xMCwJQldfMjAsIEJXXzQwCi0JLy8gbW92ZSB0byBNVUxUSVNTSURfU1RSVUNUIGZvciBNQlNTCi0JLy9IVFRSQU5TTUlUX1NFVFRJTkcJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsvLyBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4KLQlSRUdfVFJBTlNNSVRfU0VUVElORyAgICAgICAgUmVnVHJhbnNtaXRTZXR0aW5nOyAvL3JlZ2lzdHJ5IHRyYW5zbWl0IHNldHRpbmcuIHRoaXMgaXMgZm9yIHJlYWRpbmcgcmVnaXN0cnkgc2V0dGluZyBvbmx5LiBub3QgdXNlZnVsLgotCS8vVUNIQVIgICAgICAgRml4ZWRUeE1vZGU7ICAgICAgICAgICAgICAvLyBGaXhlZCBUeCBNb2RlIChDQ0ssIE9GRE0pLCBmb3IgSFQgZml4ZWQgdHggbW9kZSAoR0YsIE1JWCkgLCByZWZlciB0byBSZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNb2RlCi0JVUNIQVIgICAgICAgVHhSYXRlOyAgICAgICAgICAgICAgICAgLy8gU2FtZSB2YWx1ZSB0byBmaWxsIGluIFRYRC4gVHhSYXRlIGlzIDYtYml0Ci0JVUNIQVIgICAgICAgTWF4VHhSYXRlOyAgICAgICAgICAgICAgLy8gUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExCi0JVUNIQVIgICAgICAgVHhSYXRlSW5kZXg7ICAgICAgICAgICAgLy8gVHggcmF0ZSBpbmRleCBpbiBSYXRlU3dpdGNoVGFibGUKLQlVQ0hBUiAgICAgICBUeFJhdGVUYWJsZVNpemU7ICAgICAgICAvLyBWYWxpZCBUeCByYXRlIHRhYmxlIHNpemUgaW4gUmF0ZVN3aXRjaFRhYmxlCi0JLy9CT09MRUFOCQliQXV0b1R4UmF0ZVN3aXRjaDsKLQlVQ0hBUiAgICAgICBNaW5UeFJhdGU7ICAgICAgICAgICAgICAvLyBSQVRFXzEsIFJBVEVfMiwgUkFURV81XzUsIFJBVEVfMTEKLQlVQ0hBUiAgICAgICBSdHNSYXRlOyAgICAgICAgICAgICAgICAvLyBSQVRFX3h4eAotCUhUVFJBTlNNSVRfU0VUVElORwlNbG1lVHJhbnNtaXQ7ICAgLy8gTUdNVCBmcmFtZSBQSFkgcmF0ZSBzZXR0aW5nIHdoZW4gb3BlcmF0aW4gYXQgSHQgcmF0ZS4KLQlVQ0hBUiAgICAgICBNbG1lUmF0ZTsgICAgICAgICAgICAgICAvLyBSQVRFX3h4eCwgdXNlZCB0byBzZW5kIE1MTUUgZnJhbWVzCi0JVUNIQVIgICAgICAgQmFzaWNNbG1lUmF0ZTsgICAgICAgICAgLy8gRGVmYXVsdCBSYXRlIGZvciBzZW5kaW5nIE1MTUUgZnJhbWVzCi0KLQlVU0hPUlQgICAgICBSdHNUaHJlc2hvbGQ7ICAgICAgICAgICAvLyBpbiB1bml0IG9mIEJZVEUKLQlVU0hPUlQgICAgICBGcmFnbWVudFRocmVzaG9sZDsgICAgICAvLyBpbiB1bml0IG9mIEJZVEUKLQotCVVDSEFSICAgICAgIFR4UG93ZXI7ICAgICAgICAgICAgICAgIC8vIGluIHVuaXQgb2YgbVcKLQlVTE9ORyAgICAgICBUeFBvd2VyUGVyY2VudGFnZTsgICAgICAvLyAwfjEwMCAlCi0JVUxPTkcgICAgICAgVHhQb3dlckRlZmF1bHQ7ICAgICAgICAgLy8ga2VlcCBmb3IgVHhQb3dlclBlcmNlbnRhZ2UKLQlVSU5UOAkJUHdyQ29uc3RyYWludDsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCUJBQ0FQX1NUUlVDICAgICAgICBCQUNhcGFiaWxpdHk7IC8vICAgTk8gVVNFID0gMFhGRiAgOyAgSU1NRURfQkEgPTEgIDsgIERFTEFZX0JBPTAKLQlCQUNBUF9TVFJVQyAgICAgICAgUkVHQkFDYXBhYmlsaXR5OyAvLyAgIE5PIFVTRSA9IDBYRkYgIDsgIElNTUVEX0JBID0xICA7ICBERUxBWV9CQT0wCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JSU9UX1NUUlVDCQlJT1Rlc3RQYXJtOwkvLyA4MDIuMTFuIEludGVyT3BiaWxpdHkgVGVzdCBQYXJhbWV0ZXI7Ci0JVUxPTkcgICAgICAgVHhQcmVhbWJsZTsgICAgICAgICAgICAgLy8gUnQ4MDJfMTFQcmVhbWJsZUxvbmcsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCwgUnQ4MDJfMTFQcmVhbWJsZUF1dG8KLQlCT09MRUFOICAgICBiVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50OyAgICAgLy8gTWljcm9zb2Z0IHVzZSAwIGFzIGRpc2FibGUKLQlVTE9ORyAgICAgICBVc2VCR1Byb3RlY3Rpb247ICAgICAgICAvLyAwOiBhdXRvLCAxOiBhbHdheXMgdXNlLCAyOiBhbHdheXMgbm90IHVzZQotCUJPT0xFQU4gICAgIGJVc2VTaG9ydFNsb3RUaW1lOyAgICAgIC8vIDA6IGRpc2FibGUsIDEgLSB1c2Ugc2hvcnQgc2xvdCAoOXVzKQotCUJPT0xFQU4gICAgIGJFbmFibGVUeEJ1cnN0OyAgICAgICAgIC8vIDE6IGVuYmxlIFRYIFBBQ0tFVCBCVVJTVCAod2hlbiBCQSBpcyBlc3RhYmxpc2hlZCBvciBBUCBpcyBub3QgYSBsZWdhY3kgV01NIEFQKSwgMDogZGlzYWJsZSBUWCBQQUNLRVQgQlVSU1QKLQlCT09MRUFOICAgICBiQWdncmVnYXRpb25DYXBhYmxlOyAgICAgIC8vIDE6IGVuYWJsZSBUWCBhZ2dyZWdhdGlvbiB3aGVuIHRoZSBwZWVyIHN1cHBvcnRzIGl0Ci0JQk9PTEVBTiAgICAgYlBpZ2d5QmFja0NhcGFibGU7CQkvLyAxOiBlbmFibGUgVFggcGlnZ3ktYmFjayBhY2NvcmRpbmcgTUFDJ3MgdmVyc2lvbgotCUJPT0xFQU4gICAgIGJJRUVFODAyMTFIOwkJCS8vIDE6IGVuYWJsZSBJRUVFODAyLjExaCBzcGVjLgotCVVMT05HCQlEaXNhYmxlT0xCQ0RldGVjdDsJCS8vIDA6IGVuYWJsZSBPTEJDIGRldGVjdDsgMSBkaXNhYmxlIE9MQkMgZGV0ZWN0Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlCT09MRUFOCQkJCWJSZGc7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JQk9PTEVBTiAgICAgICAgICAgICBiV21tQ2FwYWJsZTsgICAgICAgIC8vIDA6ZGlzYWJsZSBXTU0sIDE6ZW5hYmxlIFdNTQotCVFPU19DQVBBQklMSVRZX1BBUk0gQVBRb3NDYXBhYmlsaXR5OyAgICAvLyBRT1MgY2FwYWJpbGl0eSBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCi0JRURDQV9QQVJNICAgICAgICAgICBBUEVkY2FQYXJtOyAgICAgICAgIC8vIEVEQ0EgcGFyYW1ldGVycyBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCi0JUUJTU19MT0FEX1BBUk0gICAgICBBUFFic3NMb2FkOyAgICAgICAgIC8vIFFCU1MgbG9hZCBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCi0JVUNIQVIgICAgICAgICAgICAgICBBY2tQb2xpY3lbNF07ICAgICAgIC8vIEFDSyBwb2xpY3kgb2YgdGhlIHNwZWNpZmllZCBBQy4gc2VlIEFDS194eHgKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlCT09MRUFOCQkJCWJETFNDYXBhYmxlOwkJLy8gMDpkaXNhYmxlIERMUywgMTplbmFibGUgRExTCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JLy8gYSBiaXRtYXAgb2YgQk9PTEVBTiBmbGFncy4gZWFjaCBiaXQgcmVwcmVzZW50IGFuIG9wZXJhdGlvbiBzdGF0dXMgb2YgYSBwYXJ0aWN1bGFyCi0JLy8gQk9PTEVBTiBjb250cm9sLCBlaXRoZXIgT04gb3IgT0ZGLiBUaGVzZSBmbGFncyBzaG91bGQgYWx3YXlzIGJlIGFjY2Vzc2VkIHZpYQotCS8vIE9QU1RBVFVTX1RFU1RfRkxBRygpLCBPUFNUQVRVU19TRVRfRkxBRygpLCBPUF9TVEFUVVNfQ0xFQVJfRkxBRygpIG1hY3Jvcy4KLQkvLyBzZWUgZk9QX1NUQVRVU194eHggaW4gUlRNUF9ERUYuQyBmb3IgZGV0YWlsIGJpdCBkZWZpbml0aW9uCi0JVUxPTkcgICAgICAgICAgICAgICBPcFN0YXR1c0ZsYWdzOwotCi0JQk9PTEVBTgkJCQlOZGlzUmFkaW9TdGF0ZU9mZjsgLy9Gb3IgSENUIDEyLjAsIHNldCB0aGlzIGZsYWcgdG8gVFJVRSBpbnN0ZWFkIG9mIGNhbGxlZCBNbG1lUmFkaW9PZmYuCi0JQUJHQkFORF9TVEFURQkJQmFuZFN0YXRlOwkJLy8gRm9yIHNldHRpbmcgQkJQIHVzZWQgb24gQi9HIG9yIEEgbW9kZS4KLSNpZmRlZiBBTlRfRElWRVJTSVRZX1NVUFBPUlQKLQlVQ0hBUgkJCQliUnhBbnREaXZlcnNpdHk7IC8vIDA6ZGlzYWJsZSwgMTplbmFibGUgU29mdHdhcmUgUnggQW50ZW5uYSBEaXZlcnNpdHkuCi0jZW5kaWYgLy8gQU5UX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0KLQkvLyBJRUVFODAyLjExSC0tREZTLgotCVJBREFSX0RFVEVDVF9TVFJVQ1QJUmFkYXJEZXRlY3Q7Ci0KLSNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCi0JQ0FSUklFUl9ERVRFQ1RJT05fU1RSVUNUCQlDYXJyaWVyRGV0ZWN0OwotI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCS8vIEhUCi0JVUNIQVIJCQlCQVNpemU7CQkvLyBVU2VyIGRlc2lyZWQgQkFXaW5kb3dTaXplLiBTaG91bGQgbm90IGV4Y2VlZCBvdXIgbWF4IGNhcGFiaWxpdHkKLQkvL1JUX0hUX0NBUEFCSUxJVFkJU3VwcG9ydGVkSHRQaHk7Ci0JUlRfSFRfQ0FQQUJJTElUWQlEZXNpcmVkSHRQaHk7Ci0JSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OwotCUFERF9IVF9JTkZPX0lFCQlBZGRIVEluZm87CS8vIFVzZWZ1bCBhcyBBUC4KLQkvL1RoaXMgSUUgaXMgdXNlZCB3aXRoIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBlbGVtZW50IHdoZW4gY2hhbmdpbmcgdG8gYSBuZXcgNDBNSHouCi0JLy9UaGlzIElFIGlzIGluY2x1ZGVkIGluIGNoYW5uZWwgc3dpdGNoIGFtbW91bmNlbWVudCBmcmFtZXMgNy40LjEuNSwgYmVhY29ucywgcHJvYmUgUnNwLgotCU5FV19FWFRfQ0hBTl9JRQlOZXdFeHRDaGFuT2Zmc2V0OwkvLzcuMy4yLjIwQSwgMSBpZiBleHRlbnNpb24gY2hhbm5lbCBpcyBhYm92ZSB0aGUgY29udHJvbCBjaGFubmVsLCAzIGlmIGJlbG93LCAwIGlmIG5vdCBwcmVzZW50Ci0KLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0JVUNIQVIJCQkJCUJzczIwNDBDb2V4aXN0RmxhZzsJCS8vIGJpdCAwOiBiQnNzQ29leGlzdFRpbWVyUnVubmluZywgYml0IDE6IE5lZWRTeW5jQWRkSHRJbmZvLgotCVJBTElOS19USU1FUl9TVFJVQ1QJQnNzMjA0MENvZXhpc3RUaW1lcjsKLQotCS8vVGhpcyBJRSBpcyB1c2VkIGZvciAyMC80MCBCU1MgQ29leGlzdGVuY2UuCi0JQlNTXzIwNDBfQ09FWElTVF9JRQkJQlNTMjA0MENvZXhpc3RJbmZvOwotCS8vID09PT09PSAxMW4gRDMuMCA9PT09PT09PT09PT09PT09PT09PT09PT4KLQlVU0hPUlQJCQkJCURvdDExT0Jzc1NjYW5QYXNzaXZlRHdlbGw7CQkJCS8vIFVuaXQgOiBUVS4gNX4xMDAwCi0JVVNIT1JUCQkJCQlEb3QxMU9Cc3NTY2FuQWN0aXZlRHdlbGw7CQkJCS8vIFVuaXQgOiBUVS4gMTB+MTAwMAotCVVTSE9SVAkJCQkJRG90MTFCc3NXaWR0aFRyaWdnZXJTY2FuSW50OwkJCS8vIFVuaXQgOiBTZWNvbmQKLQlVU0hPUlQJCQkJCURvdDExT0Jzc1NjYW5QYXNzaXZlVG90YWxQZXJDaGFubmVsOwkvLyBVbml0IDogVFUuIDIwMH4xMDAwMAotCVVTSE9SVAkJCQkJRG90MTFPQnNzU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbDsJLy8gVW5pdCA6IFRVLiAyMH4xMDAwMAotCVVTSE9SVAkJCQkJRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXlGYWN0b3I7Ci0JVVNIT1JUCQkJCQlEb3QxMU9Cc3NTY2FuQWN0aXZpdHlUaHJlOwkJCQkvLyBVbml0IDogcGVyY2VudGFnZQotCi0JVUxPTkcJCQkJCURvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5OwkJCS8vIG11bHRpcGxlIG9mIChEb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQgKiBEb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3RvcikKLQlVTE9ORwkJCQkJQ291bnREb3duQ3RyOwkvLyBDb3VudERvd24gQ291bnRlciBmcm9tIChEb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQgKiBEb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3RvcikKLQotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFRyaWdnZXJFdmVudFRhYkxvY2s7Ci0JQlNTXzIwNDBfQ09FWElTVF9JRQkJTGFzdEJTU0NvZXhpc3QyMDQwOwotCUJTU18yMDQwX0NPRVhJU1RfSUUJCUJTU0NvZXhpc3QyMDQwOwotCVRSSUdHRVJfRVZFTlRfVEFCCQlUcmlnZ2VyRXZlbnRUYWI7Ci0JVUNIQVIJCQkJCUNoYW5uZWxMaXN0SWR4OwotCS8vIDw9PT09PT0gMTFuIEQzLjAgPT09PT09PT09PT09PT09PT09PT09PT0KLQlCT09MRUFOCQkJCQliT3ZlcmxhcFNjYW5uaW5nOwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLQotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIGJIVFByb3RlY3Q7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgYk1JTU9QU0VuYWJsZTsKLSAgICBCT09MRUFOCQkJCQliQkFEZWNsaW5lOwotLy8yMDA4LzExLzA1OiBLSCBhZGQgdG8gc3VwcG9ydCBBbnRlbm5hIHBvd2VyLXNhdmluZyBvZiBBUDwtLQotCUJPT0xFQU4JCQkJCWJHcmVlbkFQRW5hYmxlOwotCUJPT0xFQU4JCQkJCWJCbG9ja0FudERpdmZvckdyZWVuQVA7Ci0vLzIwMDgvMTEvMDU6IEtIIGFkZCB0byBzdXBwb3J0IEFudGVubmEgcG93ZXItc2F2aW5nIG9mIEFQLS0+Ci0JQk9PTEVBTgkJCQkJYkRpc2FibGVSZW9yZGVyaW5nOwotCUJPT0xFQU4JCQkJCWJGb3J0eV9NaHpfSW50b2xlcmFudDsKLQlCT09MRUFOCQkJCQliRXh0Q2hhbm5lbFN3aXRjaEFubm91bmNlbWVudDsKLQlCT09MRUFOCQkJCQliUmN2QlNTV2lkdGhUcmlnZ2VyRXZlbnRzOwotCVVMT05HCQkJCQlMYXN0UmN2QlNTV2lkdGhUcmlnZ2VyRXZlbnRzVGltZTsKLQotCVVDSEFSCQkJCQlUeEJBU2l6ZTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCS8vIEVuYWJsZSB3aXJlbGVzcyBldmVudAotCUJPT0xFQU4JCQkJYldpcmVsZXNzRXZlbnQ7Ci0JQk9PTEVBTgkJCQliV2lGaVRlc3Q7CQkJCS8vIEVuYWJsZSB0aGlzIHBhcmFtZXRlciBmb3IgV2lGaSB0ZXN0Ci0KLQkvLyBUeCAmIFJ4IFN0cmVhbSBudW1iZXIgc2VsZWN0aW9uCi0JVUNIQVIJCQkJVHhTdHJlYW07Ci0JVUNIQVIJCQkJUnhTdHJlYW07Ci0KLQkvLyB0cmFuc21pdCBwaHkgbW9kZSwgdHJhc21pdCByYXRlIGZvciBNdWx0aWNhc3QuCi0jaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQwotCVVDSEFSCQkJCU1jYXN0VHJhbnNtaXRNY3M7Ci0JVUNIQVIJCQkJTWNhc3RUcmFuc21pdFBoeU1vZGU7Ci0jZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLwotCi0JQk9PTEVBTgkJCWJIYXJkd2FyZVJhZGlvOyAgICAgLy8gSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkCi0KLQotCi0JTkRJU19TUElOX0xPQ0sJCQlNZWFzdXJlUmVxVGFiTG9jazsKLQlQTUVBU1VSRV9SRVFfVEFCCQlwTWVhc3VyZVJlcVRhYjsKLQotCU5ESVNfU1BJTl9MT0NLCQkJVHBjUmVxVGFiTG9jazsKLQlQVFBDX1JFUV9UQUIJCQlwVHBjUmVxVGFiOwotCi0JLy8gdHJhbnNtaXQgcGh5IG1vZGUsIHRyYXNtaXQgcmF0ZSBmb3IgTXVsdGljYXN0LgotI2lmZGVmIE1DQVNUX1JBVEVfU1BFQ0lGSUMKLQlIVFRSQU5TTUlUX1NFVFRJTkcJCU1DYXN0UGh5TW9kZTsKLSNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCi0KLSNpZmRlZiBTSU5HTEVfU0tVCi0JVUlOVDE2CQkJCQlEZWZpbmVNYXhUeFB3cjsKLSNlbmRpZiAvLyBTSU5HTEVfU0tVIC8vCi0KLQotCUJPT0xFQU4JCQkJUFNQWGxpbms7ICAvLyAwOiBEaXNhYmxlLiAxOiBFbmFibGUKLQotCi0jaWYgZGVmaW5lZChSVDMwNXgpfHxkZWZpbmVkKFJUMzB4eCkKLQkvLyByZXF1ZXN0IGJ5IEdhcnksIGZvciBIaWdoIFBvd2VyIGlzc3VlCi0JVUNIQVIJSGlnaFBvd2VyUGF0Y2hEaXNhYmxlZDsKLSNlbmRpZgotCi0JQk9PTEVBTgkJSFRfRGlzYWxsb3dUS0lQOwkJLyogUmVzdHJpY3QgdGhlIGVuY3J5cHRpb24gdHlwZSBpbiAxMW4gSFQgbW9kZSAqLwotfSBDT01NT05fQ09ORklHLCAqUENPTU1PTl9DT05GSUc7Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotLyogTW9kaWZpZWQgYnkgV3UgWGktS3VuIDQvMjEvMjAwNiAqLwotLy8gU1RBIGNvbmZpZ3VyYXRpb24gYW5kIHN0YXR1cwotdHlwZWRlZiBzdHJ1Y3QgX1NUQV9BRE1JTl9DT05GSUcgewotCS8vIEdST1VQIDEgLQotCS8vICAgVXNlciBjb25maWd1cmF0aW9uIGxvYWRlZCBmcm9tIFJlZ2lzdHJ5LCBFMlBST00gb3IgT0lEX3h4eC4gVGhlc2Ugc2V0dGluZ3MgZGVzY3JpYmUKLQkvLyAgIHRoZSB1c2VyIGludGVuZGVkIGNvbmZpZ3VyYXRpb24sIGJ1dCBub3QgbmVjZXNzYXJ5IGZ1bGx5IGVxdWFsIHRvIHRoZSBmaW5hbAotCS8vICAgc2V0dGluZ3MgaW4gQUNUSVZFIEJTUyBhZnRlciBuZWdvdGlhdGlvbi9jb21wcm9taXplIHdpdGggdGhlIEJTUyBob2xkZXIgKGVpdGhlcgotCS8vICAgQVAgb3IgSUJTUyBob2xkZXIpLgotCS8vICAgT25jZSBpbml0aWFsaXplZCwgdXNlciBjb25maWd1cmF0aW9uIGNhbiBvbmx5IGJlIGNoYW5nZWQgdmlhIE9JRF94eHgKLQlVQ0hBUiAgICAgICBCc3NUeXBlOyAgICAgICAgICAgICAgLy8gQlNTX0lORlJBIG9yIEJTU19BREhPQwotCVVTSE9SVCAgICAgIEF0aW1XaW47ICAgICAgICAgIC8vIHVzZWQgd2hlbiBzdGFydGluZyBhIG5ldyBJQlNTCi0KLQkvLyBHUk9VUCAyIC0KLQkvLyAgIFVzZXIgY29uZmlndXJhdGlvbiBsb2FkZWQgZnJvbSBSZWdpc3RyeSwgRTJQUk9NIG9yIE9JRF94eHguIFRoZXNlIHNldHRpbmdzIGRlc2NyaWJlCi0JLy8gICB0aGUgdXNlciBpbnRlbmRlZCBjb25maWd1cmF0aW9uLCBhbmQgc2hvdWxkIGJlIGFsd2F5cyBhcHBsaWVkIHRvIHRoZSBmaW5hbAotCS8vICAgc2V0dGluZ3MgaW4gQUNUSVZFIEJTUyB3aXRob3V0IGNvbXByb21pc2luZyB3aXRoIHRoZSBCU1MgaG9sZGVyLgotCS8vICAgT25jZSBpbml0aWFsaXplZCwgdXNlciBjb25maWd1cmF0aW9uIGNhbiBvbmx5IGJlIGNoYW5nZWQgdmlhIE9JRF94eHgKLQlVQ0hBUiAgICAgICBSc3NpVHJpZ2dlcjsKLQlVQ0hBUiAgICAgICBSc3NpVHJpZ2dlck1vZGU7ICAgICAgLy8gUlNTSV9UUklHR0VSRURfVVBPTl9CRUxPV19USFJFU0hPTEQgb3IgUlNTSV9UUklHR0VSRURfVVBPTl9FWENDRUVEX1RIUkVTSE9MRAotCVVTSE9SVCAgICAgIERlZmF1bHRMaXN0ZW5Db3VudDsgICAvLyBkZWZhdWx0IGxpc3RlbiBjb3VudDsKLQlVTE9ORyAgICAgICBXaW5kb3dzUG93ZXJNb2RlOyAgICAgICAgICAgLy8gUG93ZXIgbW9kZSBmb3IgQUMgcG93ZXIKLQlVTE9ORyAgICAgICBXaW5kb3dzQmF0dGVyeVBvd2VyTW9kZTsgICAgLy8gUG93ZXIgbW9kZSBmb3IgYmF0dGVyeSBpZiBleGlzdHMKLQlCT09MRUFOICAgICBiV2luZG93c0FDQ0FNRW5hYmxlOyAgICAgICAgLy8gRW5hYmxlIENBTSBwb3dlciBtb2RlIHdoZW4gQUMgb24KLQlCT09MRUFOICAgICBiQXV0b1JlY29ubmVjdDsgICAgICAgICAvLyBTZXQgdG8gVFJVRSB3aGVuIHNldHRpbmcgT0lEXzgwMl8xMV9TU0lEIHdpdGggbm8gbWF0Y2hpbmcgQlNTSUQKLQlVTE9ORyAgICAgICBXaW5kb3dzUG93ZXJQcm9maWxlOyAgICAvLyBXaW5kb3dzIHBvd2VyIHByb2ZpbGUsIGZvciBORElTNS4xIFBuUAotCi0JLy8gTUlCOmllZWU4MDJkb3QxMS5kb3QxMXNtdCgxKS5kb3QxMVN0YXRpb25Db25maWdUYWJsZSgxKQotCVVTSE9SVCAgICAgIFBzbTsgICAgICAgICAgICAgICAgICAvLyBwb3dlciBtYW5hZ2VtZW50IG1vZGUgICAoUFdSX0FDVElWRXxQV1JfU0FWRSkKLQlVU0hPUlQgICAgICBEaXNhc3NvY1JlYXNvbjsKLQlVQ0hBUiAgICAgICBEaXNhc3NvY1N0YVtNQUNfQUREUl9MRU5dOwotCVVTSE9SVCAgICAgIERlYXV0aFJlYXNvbjsKLQlVQ0hBUiAgICAgICBEZWF1dGhTdGFbTUFDX0FERFJfTEVOXTsKLQlVU0hPUlQgICAgICBBdXRoRmFpbFJlYXNvbjsKLQlVQ0hBUiAgICAgICBBdXRoRmFpbFN0YVtNQUNfQUREUl9MRU5dOwotCi0JTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIgICAgICAgICAgUHJpdmFjeUZpbHRlcjsgIC8vIFByaXZhY3lGaWx0ZXIgZW51bSBmb3IgODAyLjFYCi0JTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7ICAgICAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRvIHdoYXRldmVyIG1pY3Jvc29mdCBkZWZpbmVkCi0JTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOwotCU5ESVNfODAyXzExX1dFUF9TVEFUVVMJCQkJT3JpZ1dlcFN0YXR1czsJLy8gT3JpZ2luYWwgd2VwIHN0YXR1cyBzZXQgZnJvbSBPSUQKLQotCS8vIEFkZCB0byBzdXBwb3J0IGRpZmZlcmVudCBjaXBoZXIgc3VpdGUgZm9yIFdQQTIvV1BBIG1vZGUKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJR3JvdXBDaXBoZXI7CQkvLyBNdWx0aWNhc3QgY2lwaGVyIHN1aXRlCi0JTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCVBhaXJDaXBoZXI7CQkJLy8gVW5pY2FzdCBjaXBoZXIgc3VpdGUKLQlCT09MRUFOCQkJCQkJCQliTWl4Q2lwaGVyOwkJCS8vIEluZGljYXRlIGN1cnJlbnQgUGFpciAmIEdyb3VwIHVzZSBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlcwotCVVTSE9SVAkJCQkJCQkJUnNuQ2FwYWJpbGl0eTsKLQotCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIEdyb3VwS2V5V2VwU3RhdHVzOwotCi0JVUNIQVIJCVdwYVBhc3NQaHJhc2VbNjRdOwkJLy8gV1BBIFBTSyBwYXNzIHBocmFzZQotCVVJTlQJCVdwYVBhc3NQaHJhc2VMZW47CQkvLyB0aGUgbGVuZ3RoIG9mIFdQQSBQU0sgcGFzcyBwaHJhc2UKLQlVQ0hBUgkJUE1LWzMyXTsgICAgICAgICAgICAgICAgLy8gV1BBIFBTSyBtb2RlIFBNSwotCVVDSEFSICAgICAgIFBUS1s2NF07ICAgICAgICAgICAgICAgIC8vIFdQQSBQU0sgbW9kZSBQVEsKLQlVQ0hBUgkJR1RLWzMyXTsJCQkJLy8gR1RLIGZyb20gYXV0aGVudGljYXRvcgotCUJTU0lEX0lORk8JU2F2ZWRQTUtbUE1LSURfTk9dOwotCVVJTlQJCVNhdmVkUE1LTnVtOwkJCS8vIFNhdmVkIFBNS0lEIG51bWJlcgotCi0JVUNIQVIJCURlZmF1bHRLZXlJZDsKLQotCi0JLy8gV1BBIDgwMi4xeCBwb3J0IGNvbnRyb2wsIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVELCBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQKLQlVQ0hBUiAgICAgICBQb3J0U2VjdXJlZDsKLQotCS8vIEZvciBXUEEgY291bnRlcm1lYXN1cmVzCi0JVUxPTkcgICAgICAgTGFzdE1pY0Vycm9yVGltZTsgICAvLyByZWNvcmQgbGFzdCBNSUMgZXJyb3IgdGltZQotCVVMT05HICAgICAgIE1pY0VyckNudDsgICAgICAgICAgLy8gU2hvdWxkIGJlIDAsIDEsIDIsIHRoZW4gcmVzZXQgdG8gemVybyAoYWZ0ZXIgZGlzYXNzb2ljaWF0aW9uKS4KLQlCT09MRUFOICAgICBiQmxvY2tBc3NvYzsgICAgICAgIC8vIEJsb2NrIGFzc29jaWF0ZSBhdHRlbXB0IGZvciA2MCBzZWNvbmRzIGFmdGVyIGNvdW50ZXIgbWVhc3VyZSBvY2N1cnJlZC4KLQkvLyBGb3IgV1BBLVBTSyBzdXBwbGljYW50IHN0YXRlCi0JV1BBX1NUQVRFICAgV3BhU3RhdGU7ICAgICAgICAgICAvLyBEZWZhdWx0IGlzIFNTX05PVFVTRSBhbmQgaGFuZGxlZCBieSBtaWNyb3NvZnQgODAyLjF4Ci0JVUNIQVIgICAgICAgUmVwbGF5Q291bnRlcls4XTsKLQlVQ0hBUiAgICAgICBBTm9uY2VbMzJdOyAgICAgICAgIC8vIEFOb25jZSBmb3IgV1BBLVBTSyBmcm9tIGF1cmhlbnRpY2F0b3IKLQlVQ0hBUiAgICAgICBTTm9uY2VbMzJdOyAgICAgICAgIC8vIFNOb25jZSBmb3IgV1BBLVBTSwotCi0JVUNIQVIgICAgICAgTGFzdFNOUjA7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgQkVBQ09OJ3MgU05SCi0JVUNIQVIgICAgICAgTGFzdFNOUjE7ICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBCRUFDT04ncyBTTlIgZm9yIDJuZCAgYW50ZW5uYQotCVJTU0lfU0FNUExFIFJzc2lTYW1wbGU7Ci0JVUxPTkcgICAgICAgTnVtT2ZBdmdSc3NpU2FtcGxlOwotCi0JVUxPTkcgICAgICAgTGFzdEJlYWNvblJ4VGltZTsgICAgIC8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IEJFQUNPTiBSWCB0aW1lCi0JVUxPTkcgICAgICAgTGFzdDExYkJlYWNvblJ4VGltZTsgIC8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IDExQiBCRUFDT04gUlggdGltZQotCVVMT05HCQlMYXN0MTFnQmVhY29uUnhUaW1lOwkvLyBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCAxMUcgQkVBQ09OIFJYIHRpbWUKLQlVTE9ORwkJTGFzdDIwTkJlYWNvblJ4VGltZTsJLy8gT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgMjBNSHogTiBCRUFDT04gUlggdGltZQotCi0JVUxPTkcgICAgICAgTGFzdFNjYW5UaW1lOyAgICAgICAvLyBSZWNvcmQgbGFzdCBzY2FuIHRpbWUgZm9yIGlzc3VlIEJTU0lEX1NDQU5fTElTVAotCVVMT05HICAgICAgIFNjYW5DbnQ7ICAgICAgICAgICAgLy8gU2NhbiBjb3VudHMgc2luY2UgbW9zdCByZWNlbnQgU1NJRCwgQlNTSUQsIFNDQU4gT0lEIHJlcXVlc3QKLQlCT09MRUFOICAgICBiU3dSYWRpbzsgICAgICAgICAgIC8vIFNvZnR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gT24vT2ZmLCBUUlVFOiBPbgotCUJPT0xFQU4gICAgIGJId1JhZGlvOyAgICAgICAgICAgLy8gSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBPbi9PZmYsIFRSVUU6IE9uCi0JQk9PTEVBTiAgICAgYlJhZGlvOyAgICAgICAgICAgICAvLyBSYWRpbyBzdGF0ZSwgQW5kIG9mIFN3ICYgSHcgcmFkaW8gc3RhdGUKLQlCT09MRUFOICAgICBiSGFyZHdhcmVSYWRpbzsgICAgIC8vIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gZW5hYmxlZAotCUJPT0xFQU4gICAgIGJTaG93SGlkZGVuU1NJRDsgICAgLy8gU2hvdyBhbGwga25vd24gU1NJRCBpbiBTU0lEIGxpc3QgZ2V0IG9wZXJhdGlvbgotCi0JLy8gTmV3IGZvciBXUEEsIHdpbmRvd3Mgd2FudCB1cyB0byB0byBrZWVwIGFzc29jaWF0aW9uIGluZm9ybWF0aW9uIGFuZAotCS8vIEZpeGVkIElFcyBmcm9tIGxhc3QgYXNzb2NpYXRpb24gcmVzcG9uc2UKLQlORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTiAgICAgQXNzb2NJbmZvOwotCVVTSE9SVCAgICAgICBSZXFWYXJJRUxlbjsgICAgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoCi0JVUNIQVIgICAgICAgUmVxVmFySUVzW01BWF9WSUVfTEVOXTsJCS8vIFRoZSBjb250ZW50IHNhdmVkIGhlcmUgc2hvdWxkIGJlIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgotCVVTSE9SVCAgICAgICBSZXNWYXJJRUxlbjsgICAgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoCi0JVUNIQVIgICAgICAgUmVzVmFySUVzW01BWF9WSUVfTEVOXTsKLQotCVVDSEFSICAgICAgIFJTTklFX0xlbjsKLQlVQ0hBUiAgICAgICBSU05fSUVbTUFYX0xFTl9PRl9SU05JRV07CS8vIFRoZSBjb250ZW50IHNhdmVkIGhlcmUgc2hvdWxkIGJlIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgotCi0JVUxPTkcgICAgICAgICAgICAgICBDTEJ1c3lCeXRlczsgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgdG90YWwgYnl0ZXMgcmVjZWl2ZWQgZHVybmluZyBjaGFubmVsIGxvYWQgc2NhbiB0aW1lCi0JVVNIT1JUICAgICAgICAgICAgICBSUElEZW5zaXR5WzhdOyAgICAgICAgICAgICAgLy8gQXJyYXkgZm9yIFJQSSBkZW5zaXR5IGNvbGxlY3Rpb24KLQotCVVDSEFSICAgICAgICAgICAgICAgUk1SZXFDbnQ7ICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBtZWFzdXJlbWVudCByZXF1ZXN0IHNhdmVkLgotCVVDSEFSICAgICAgICAgICAgICAgQ3VycmVudFJNUmVxSWR4OyAgICAgICAgICAgIC8vIE51bWJlciBvZiBtZWFzdXJlbWVudCByZXF1ZXN0IHNhdmVkLgotCUJPT0xFQU4gICAgICAgICAgICAgUGFyYWxsZWxSZXE7ICAgICAgICAgICAgICAgIC8vIFBhcmFsbGVsIG1lYXN1cmVtZW50LCBvbmx5IG9uZSByZXF1ZXN0IHBlcmZvcm1lZCwKLQkJCQkJCQkJCQkJCQkvLyBJdCBtdXN0IGJlIHRoZSBzYW1lIGNoYW5uZWwgd2l0aCBtYXhpbXVtIGR1cmF0aW9uCi0JVVNIT1JUICAgICAgICAgICAgICBQYXJhbGxlbER1cmF0aW9uOyAgICAgICAgICAgLy8gTWF4aW11bSBkdXJhdGlvbiBmb3IgcGFyYWxsZWwgbWVhc3VyZW1lbnQKLQlVQ0hBUiAgICAgICAgICAgICAgIFBhcmFsbGVsQ2hhbm5lbDsgICAgICAgICAgICAvLyBPbmx5IG9uZSBjaGFubmVsIHdpdGggcGFyYWxsZWwgbWVhc3VyZW1lbnQKLQlVU0hPUlQgICAgICAgICAgICAgIElBUFBUb2tlbjsgICAgICAgICAgICAgICAgICAvLyBJQVBQIGRpYWxvZyB0b2tlbgotCS8vIEhhY2sgZm9yIGNoYW5uZWwgbG9hZCBhbmQgbm9pc2UgaGlzdG9ncmFtIHBhcmFtZXRlcnMKLQlVQ0hBUiAgICAgICAgICAgICAgIE5IRmFjdG9yOyAgICAgICAgICAgICAgICAgICAvLyBQYXJhbWV0ZXIgZm9yIE5vaXNlIGhpc3RvZ3JhbQotCVVDSEFSICAgICAgICAgICAgICAgQ0xGYWN0b3I7ICAgICAgICAgICAgICAgICAgIC8vIFBhcmFtZXRlciBmb3IgY2hhbm5lbCBsb2FkCi0KLQlSQUxJTktfVElNRVJfU1RSVUNUCVN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyOwotCUJPT0xFQU4JCQkJU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nOwotCi0JVUNIQVIJCQlEdGltQ291bnQ7ICAgICAgLy8gMC4uIER0aW1QZXJpb2QtMQotCVVDSEFSCQkJRHRpbVBlcmlvZDsgICAgIC8vIGRlZmF1bHQgPSAzCi0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQlSVF84MDJfMTFfRExTCQlETFNFbnRyeVtNQVhfTlVNX09GX0RMU19FTlRSWV07Ci0JVUNIQVIJCQkJRGxzUmVwbGF5Q291bnRlcls4XTsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8gVGhpcyBpcyBvbmx5IGZvciBXSFFMIHRlc3QuCi0JQk9PTEVBTgkJCQlXaHFsVGVzdDsKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBSQUxJTktfVElNRVJfU1RSVUNUIFdwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyOwotICAgIC8vIEZhc3QgUm9hbWluZwotCUJPT0xFQU4JCSAgICAgICAgYkF1dG9Sb2FtaW5nOyAgICAgICAvLyAwOmRpc2FibGUgYXV0byByb2FtaW5nIGJ5IFJTU0ksIDE6ZW5hYmxlIGF1dG8gcm9hbWluZyBieSBSU1NJCi0JQ0hBUgkJICAgICAgICBkQm1Ub1JvYW07ICAgICAgICAgIC8vIHRoZSBjb25kaXRpb24gdG8gcm9hbSB3aGVuIHJlY2VpdmluZyBSc3NpIGxlc3MgdGhhbiB0aGlzIHZhbHVlLiBJdCdzIG5lZ2F0aXZlIHZhbHVlLgotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgIEJPT0xFQU4gICAgICAgICAgICAgSUVFRTgwMjFYOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgSUVFRTgwMjF4X3JlcXVpcmVkX2tleXM7Ci0gICAgQ0lQSEVSX0tFWQkgICAgICAgIERlc2lyZVNoYXJlZEtleVs0XTsJLy8gUmVjb3JkIHVzZXIgZGVzaXJlZCBXRVAga2V5cwotICAgIFVDSEFSICAgICAgICAgICAgICAgRGVzaXJlU2hhcmVkS2V5SWQ7Ci0KLSAgICAvLyAwOiBkcml2ZXIgaWdub3JlcyB3cGFfc3VwcGxpY2FudAotICAgIC8vIDE6IHdwYV9zdXBwbGljYW50IGluaXRpYXRlcyBzY2FubmluZyBhbmQgQVAgc2VsZWN0aW9uCi0gICAgLy8gMjogZHJpdmVyIHRha2VzIGNhcmUgb2Ygc2Nhbm5pbmcsIEFQIHNlbGVjdGlvbiwgYW5kIElFRUUgODAyLjExIGFzc29jaWF0aW9uIHBhcmFtZXRlcnMKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIFdwYVN1cHBsaWNhbnRVUDsKLQlVQ0hBUgkJCQlXcGFTdXBwbGljYW50U2NhbkNvdW50OwotCUJPT0xFQU4JCQkJYlJTTl9JRV9Gcm9tV3BhU3VwcGxpY2FudDsKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLSAgICBDSEFSICAgICAgICAgICAgICAgIGRldl9uYW1lWzE2XTsKLSAgICBVU0hPUlQgICAgICAgICAgICAgIE9yaURldlR5cGU7Ci0KLSAgICBCT09MRUFOICAgICAgICAgICAgIGJUR25XaWZpVGVzdDsKLQlCT09MRUFOCQkJICAgIGJTY2FuUmVxSXNGcm9tV2ViVUk7Ci0KLQlIVFRSQU5TTUlUX1NFVFRJTkcJCQkJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsvLyBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4KLQlERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcJRGVzaXJlZFRyYW5zbWl0U2V0dGluZzsKLQlSVF9IVF9QSFlfSU5GTwkJCQkJRGVzaXJlZEh0UGh5SW5mbzsKLQlCT09MRUFOCQkJCQkJCWJBdXRvVHhSYXRlU3dpdGNoOwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0gICAgVUNIQVIgICAgICAgQkJQUjM7Ci0JLy8gUFMgQ29udHJvbCBoYXMgMiBtZWFuaW5ncyBmb3IgYWR2YW5jZWQgcG93ZXIgc2F2ZSBmdW5jdGlvbi4KLQkvLyAxLiBFbmFibGVQU2luSWRsZSA6IFdoZW4gbm8gY29ubmVjdGlvbiwgYWx3YXlzIHJhZGlvIG9mZiBleGNlcHQgbmVlZCB0byBkbyBzaXRlIHN1cnZleS4KLQkvLyAyLiBFbmFibGVOZXdQUyAgOiB3aWxsIHNhdmUgbW9yZSBjdXJyZW50IGluIHNsZWVwIG9yIHJhZGlvIG9mZiBtb2RlLgotCVBTX0NPTlRST0wJCQkJUFNDb250cm9sOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotCVVDSEFSCQkJCUlFRUU4MDIxMWRDbGllbnRNb2RlOwotCVVDSEFSCQkJCVN0YU9yaUNvdW50cnlDb2RlWzNdOwotCVVDSEFSCQkJCVN0YU9yaUdlb2dyYXBoeTsKLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0KLQotCi0JQk9PTEVBTgkJCQliQXV0b0Nvbm5lY3RCeUJzc2lkOwotCVVMT05HCQkJCUJlYWNvbkxvc3RUaW1lOwkvLyBzZWNvbmRzCi0JQk9PTEVBTgkJCWJGb3JjZVR4QnVyc3Q7ICAgICAgICAgIC8vIDE6IGZvcmNlIGVuYmxlIFRYIFBBQ0tFVCBCVVJTVCwgMDogZGlzYWJsZQotfSBTVEFfQURNSU5fQ09ORklHLCAqUFNUQV9BRE1JTl9DT05GSUc7Ci0KLS8vIFRoaXMgZGF0YSBzdHJ1Y3R1cmUga2VlcCB0aGUgY3VycmVudCBhY3RpdmUgQlNTL0lCU1MncyBjb25maWd1cmF0aW9uIHRoYXQgdGhpcyBTVEEKLS8vIGhhZCBhZ3JlZWQgdXBvbiBqb2luaW5nIHRoZSBuZXR3b3JrLiBXaGljaCBtZWFucyB0aGVzZSBwYXJhbWV0ZXJzIGFyZSB1c3VhbGx5IGRlY2lkZWQKLS8vIGJ5IHRoZSBCU1MvSUJTUyBjcmVhdG9yIGluc3RlYWQgb2YgdXNlciBjb25maWd1cmF0aW9uLiBEYXRhIGluIHRoaXMgZGF0YSBzdHJ1Y3R1cnJlCi0vLyBpcyB2YWxpZCBvbmx5IHdoZW4gZWl0aGVyIEFESE9DX09OKHBBZCkgb3IgSU5GUkFfT04ocEFkKSBpcyBUUlVFLgotLy8gTm9ybWFsbHksIGFmdGVyIFNDQU4gb3IgZmFpbGVkIHJvYW1pbmcgYXR0ZW1wdHMsIHdlIG5lZWQgdG8gcmVjb3ZlciBiYWNrIHRvCi0vLyB0aGUgY3VycmVudCBhY3RpdmUgc2V0dGluZ3MuCi10eXBlZGVmIHN0cnVjdCBfU1RBX0FDVElWRV9DT05GSUcgewotCVVTSE9SVCAgICAgIEFpZDsKLQlVU0hPUlQgICAgICBBdGltV2luOyAgICAgICAgICAgICAgICAvLyBpbiBrdXNlYzsgSUJTUyBwYXJhbWV0ZXIgc2V0IGVsZW1lbnQKLQlVU0hPUlQgICAgICBDYXBhYmlsaXR5SW5mbzsKLQlVU0hPUlQgICAgICBDZnBNYXhEdXJhdGlvbjsKLQlVU0hPUlQgICAgICBDZnBQZXJpb2Q7Ci0KLQkvLyBDb3B5IHN1cHBvcnRlZCByYXRlIGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaAotCS8vIEFQJ3Mgc3VwcG9ydGVkIGFuZCBleHRlbmRlZCByYXRlIHNldHRpbmdzLgotCVVDSEFSICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSICAgICAgIFN1cFJhdGVMZW47Ci0JVUNIQVIgICAgICAgRXh0UmF0ZUxlbjsKLQkvLyBDb3B5IHN1cHBvcnRlZCBodCBmcm9tIGRlc2lyZWQgQVAncyBiZWFjb24uIFdlIGFyZSB0cnlpbmcgdG8gbWF0Y2gKLQlSVF9IVF9QSFlfSU5GTwkJU3VwcG9ydGVkUGh5SW5mbzsKLQlSVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OwotfSBTVEFfQUNUSVZFX0NPTkZJRywgKlBTVEFfQUNUSVZFX0NPTkZJRzsKLQotCi0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0KLXR5cGVkZWYgc3RydWN0IF9NQUNfVEFCTEVfRU5UUlkgewotCS8vQ2hvb3NlIDEgZnJvbSBWYWxpZEFzV0RTIGFuZCBWYWxpZEFzQ0xJICB0byB2YWxpZGl6ZS4KLQlCT09MRUFOCQlWYWxpZEFzQ0xJOwkJLy8gU3RhIG1vZGUsIHNldCB0aGlzIFRSVUUgYWZ0ZXIgTGlua3VwLHRvby4KLQlCT09MRUFOCQlWYWxpZEFzV0RTOwkvLyBUaGlzIGlzIFdEUyBFbnRyeS4gb25seSBmb3IgQVAgbW9kZS4KLQlCT09MRUFOCQlWYWxpZEFzQXBDbGk7ICAgLy9UaGlzIGlzIGEgQVAtQ2xpZW50IGVudHJ5LCBvbmx5IGZvciBBUCBtb2RlIHdoaWNoIGVuYWJsZSBBUC1DbGllbnQgZnVuY3Rpb25zLgotCUJPT0xFQU4JCVZhbGlkQXNNZXNoOwotCUJPT0xFQU4JCVZhbGlkQXNEbHM7CS8vIFRoaXMgaXMgRExTIEVudHJ5LiBvbmx5IGZvciBTVEEgbW9kZS4KLQlCT09MRUFOCQlpc0NhY2hlZDsKLQlCT09MRUFOCQliSUFtQmFkQXRoZXJvczsJLy8gRmxhZyBpZiB0aGlzIGlzIEF0aGVyb3MgY2hpcCB0aGF0IGhhcyBJT1QgcHJvYmxlbS4gIFdlIG5lZWQgdG8gdHVybiBvbiBSVFMvQ1RTIHByb3RlY3Rpb24uCi0KLQlVQ0hBUgkJRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmc7ICAvLyBFbnF1ZXVlIEVBUG9MLVN0YXJ0IGZvciB0cmlnZ2VyaW5nIEVBUCBTTQotCS8vamFuIGZvciB3cGEKLQkvLyByZWNvcmQgd2hpY2ggZW50cnkgcmV2b2tlIE1JQyBGYWlsdXJlICwgaWYgaXQgbGVhdmVzIHRoZSBCU1MgaXRzZWxmLCBBUCB3b24ndCB1cGRhdGUgYU1JQ0ZhaWxUaW1lIE1JQgotCVVDSEFSICAgICAgICAgICBDTVRpbWVyUnVubmluZzsKLQlVQ0hBUiAgICAgICAgICAgYXBpZHg7CQkJLy8gTUJTUyBudW1iZXIKLQlVQ0hBUiAgICAgICAgICAgUlNOSUVfTGVuOwotCVVDSEFSICAgICAgICAgICBSU05fSUVbTUFYX0xFTl9PRl9SU05JRV07Ci0JVUNIQVIgICAgICAgICAgIEFOb25jZVtMRU5fS0VZX0RFU0NfTk9OQ0VdOwotCVVDSEFSICAgICAgICAgICBTTm9uY2VbTEVOX0tFWV9ERVNDX05PTkNFXTsKLQlVQ0hBUiAgICAgICAgICAgUl9Db3VudGVyW0xFTl9LRVlfREVTQ19SRVBMQVldOwotCVVDSEFSICAgICAgICAgICBQVEtbNjRdOwotCVVDSEFSICAgICAgICAgICBSZVRyeUNvdW50ZXI7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgICAgICAgICAgICAgUmV0cnlUaW1lcjsKLQlSQUxJTktfVElNRVJfU1RSVUNUCQkJCQlFbnF1ZXVlU3RhcnRGb3JQU0tUaW1lcjsJLy8gQSB0aW1lciB3aGljaCBlbnF1ZXVlIEVBUG9MLVN0YXJ0IGZvciB0cmlnZ2VyaW5nIFBTSyBTTQotCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOyAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRvIHdoYXRldmVyIG1pY3Jvc29mdCBkZWZpbmVkCi0JTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOwotCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIEdyb3VwS2V5V2VwU3RhdHVzOwotCUFQX1dQQV9TVEFURSAgICBXcGFTdGF0ZTsKLQlHVEtfU1RBVEUgICAgICAgR1RLU3RhdGU7Ci0JVVNIT1JUICAgICAgICAgIFBvcnRTZWN1cmVkOwotCU5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSICBQcml2YWN5RmlsdGVyOyAgICAgIC8vIFByaXZhY3lGaWx0ZXIgZW51bSBmb3IgODAyLjFYCi0JQ0lQSEVSX0tFWSAgICAgIFBhaXJ3aXNlS2V5OwotCVBWT0lEICAgICAgICAgICBwQWQ7Ci0JSU5UCQkJCVBNS0lEX0NhY2hlSWR4OwotCVVDSEFSCQkJUE1LSURbTEVOX1BNS0lEXTsKLQotCi0JVUNIQVIgICAgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICAgICAgUHNNb2RlOwotCVNTVCAgICAgICAgICAgICBTc3Q7Ci0JQVVUSF9TVEFURSAgICAgIEF1dGhTdGF0ZTsgLy8gZm9yIFNIQVJFRCBLRVkgYXV0aGVudGljYXRpb24gc3RhdGUgbWFjaGluZSB1c2VkIG9ubHkKLQlCT09MRUFOCQkJSXNSZWFzc29jU3RhOwkvLyBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgYSByZWFzc29jaWF0aW9uIHByb2NlZHVyZQotCVVTSE9SVCAgICAgICAgICBBaWQ7Ci0JVVNIT1JUICAgICAgICAgIENhcGFiaWxpdHlJbmZvOwotCVVDSEFSICAgICAgICAgICBMYXN0UnNzaTsKLQlVTE9ORyAgICAgICAgICAgTm9EYXRhSWRsZUNvdW50OwotCVVJTlQxNgkJCVN0YXRpb25LZWVwQWxpdmVDb3VudDsgLy8gdW5pdDogc2Vjb25kCi0JVUxPTkcgICAgICAgICAgIFBzUUlkbGVDb3VudDsKLQlRVUVVRV9IRUFERVIgICAgUHNRdWV1ZTsKLQotCVVJTlQzMgkJCVN0YUNvbm5lY3RUaW1lOwkJLy8gdGhlIGxpdmUgdGltZSBvZiB0aGlzIHN0YXRpb24gc2luY2UgYXNzb2NpYXRlZCB3aXRoIEFQCi0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCUJPT0xFQU4JCQliU2VuZEJBUjsKLQlVU0hPUlQJCQlOb0JBRGF0YUNvdW50RG93bjsKLQotCVVJTlQzMgkJCUNhY2hlZEJ1ZlsxNl07CQkvLyBVSU5UICg0IGJ5dGVzKSBmb3IgYWxpZ25tZW50Ci0JVUlOVAkJCVR4QkZDb3VudDsgLy8gMyozCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JVUlOVAkJCUZJRk9Db3VudDsKLQlVSU5UCQkJRGVidWdGSUZPQ291bnQ7Ci0JVUlOVAkJCURlYnVnVHhDb3VudDsKLSAgICBCT09MRUFOCQkJYkRsc0luaXQ7Ci0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vL1dEUyBlbnRyeSBuZWVkcyB0aGVzZQotLy8gaWYgVmFsaWRBc1dEUz09VFJVRSwgTWF0Y2hXRFNUYWJJZHggaXMgdGhlIGluZGV4IGluIFdkc1RhYi5NYWNUYWIKLQlVSU5UCQkJTWF0Y2hXRFNUYWJJZHg7Ci0JVUNIQVIgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGU7Ci0JVUNIQVIgICAgICAgICAgIEN1cnJUeFJhdGU7Ci0JVUNIQVIgICAgICAgICAgIEN1cnJUeFJhdGVJbmRleDsKLQkvLyB0byByZWNvcmQgdGhlIGVhY2ggVFggcmF0ZSdzIHF1YWxpdHkuIDAgaXMgYmVzdCwgdGhlIGJpZ2dlciB0aGUgd29yc2UuCi0JVVNIT1JUICAgICAgICAgIFR4UXVhbGl0eVtNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07Ci0vLwlVU0hPUlQgICAgICAgICAgT25lU2VjVHhPa0NvdW50OwotCVVJTlQzMgkJCU9uZVNlY1R4Tm9SZXRyeU9rQ291bnQ7Ci0JVUlOVDMyICAgICAgICAgIE9uZVNlY1R4UmV0cnlPa0NvdW50OwotCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeEZhaWxDb3VudDsKLQlVSU5UMzIJCQlDb250aW51ZVR4RmFpbENudDsKLQlVSU5UMzIgICAgICAgICAgQ3VyclR4UmF0ZVN0YWJsZVRpbWU7IC8vICMgb2Ygc2Vjb25kIGluIGN1cnJlbnQgVFggcmF0ZQotCVVDSEFSICAgICAgICAgICBUeFJhdGVVcFBlbmFsdHk7ICAgICAgLy8gZXh0cmEgIyBvZiBzZWNvbmQgcGVuYWx0eSBkdWUgdG8gbGFzdCB1bnN0YWJsZSBjb25kaXRpb24KLSNpZmRlZiBXRFNfU1VQUE9SVAotCUJPT0xFQU4JCUxvY2tFbnRyeVR4OyAvLyBUUlVFID0gYmxvY2sgdG8gV0RTIEVudHJ5IHRyYWZmaWMsIEZBTFNFID0gbm90LgotCVVJTlQzMgkJVGltZVN0YW1wX3RvVHhSaW5nOwotI2VuZGlmIC8vIFdEU19TVVBQT1JUIC8vCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCVVJTlQJCQlNYXRjaERsc0VudHJ5SWR4OyAvLyBpbmRpY2F0ZSB0aGUgaW5kZXggaW4gcEFkLT5TdGFDZmcuRExTRW50cnkKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCUJPT0xFQU4gICAgICAgICBmTm9pc3lFbnZpcm9ubWVudDsKLQlCT09MRUFOCQkJZkxhc3RTZWNBY2NvcmRpbmdSU1NJOwotCVVDSEFSICAgICAgICAgICBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOyAvLyAwOiBubyBjaGFuZ2UsIDE6cmF0ZSBVUCwgMjpyYXRlIGRvd24KLQlDSEFSCQkJTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb247IC8vS2VlcCBsYXN0IHRpbWUgdmFsdWUgb2YgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbgotCVVMT05HCQkJTGFzdFR4T2tDb3VudDsKLQlVQ0hBUiAgICAgICAgICAgUEVSW01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKLQotCS8vIGEgYml0bWFwIG9mIEJPT0xFQU4gZmxhZ3MuIGVhY2ggYml0IHJlcHJlc2VudCBhbiBvcGVyYXRpb24gc3RhdHVzIG9mIGEgcGFydGljdWxhcgotCS8vIEJPT0xFQU4gY29udHJvbCwgZWl0aGVyIE9OIG9yIE9GRi4gVGhlc2UgZmxhZ3Mgc2hvdWxkIGFsd2F5cyBiZSBhY2Nlc3NlZCB2aWEKLQkvLyBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRygpLCBDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCksIENMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRygpIG1hY3Jvcy4KLQkvLyBzZWUgZk9QX1NUQVRVU194eHggaW4gUlRNUF9ERUYuQyBmb3IgZGV0YWlsIGJpdCBkZWZpbml0aW9uLiBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQKLQlVTE9ORyAgICAgICAgICAgQ2xpZW50U3RhdHVzRmxhZ3M7Ci0KLQlIVFRSQU5TTUlUX1NFVFRJTkcJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsvLyBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCS8vIEhUIEVXQyBNSU1PLU4gdXNlZCBwYXJhbWV0ZXJzCi0JVVNIT1JUCQlSWEJBYml0bWFwOwkvLyBmaWxsIHRvIG9uLWNoaXAgIFJYV0lfQkFfQklUTUFTSyBpbiA4LjEuM1JYIGF0dHJpYnV0ZSBlbnRyeSBmb3JtYXQKLQlVU0hPUlQJCVRYQkFiaXRtYXA7CS8vIFRoaXMgYml0bWFwIGFzIG9yaWdpbmF0b3IsIG9ubHkga2VlcCBpbiBzb2Z0d2FyZSB1c2VkIHRvIG1hcmsgQU1QRFUgYml0IGluIFRYV0kKLQlVU0hPUlQJCVRYQXV0b0JBYml0bWFwOwotCVVTSE9SVAkJQkFEZWNsaW5lQml0bWFwOwotCVVTSE9SVAkJQkFSZWNXY2lkQXJyYXlbTlVNX09GX1RJRF07CS8vIFRoZSBtYXBwaW5nIHdjaWQgb2YgcmVjaXBpZW50IHNlc3Npb24uIGlmIFJYQkFiaXRtYXAgYml0IGlzIG1hc2tlZAotCVVTSE9SVAkJQkFPcmlXY2lkQXJyYXlbTlVNX09GX1RJRF07IC8vIFRoZSBtYXBwaW5nIHdjaWQgb2Ygb3JpZ2luYXRvciBzZXNzaW9uLiBpZiBUWEJBYml0bWFwIGJpdCBpcyBtYXNrZWQKLQlVU0hPUlQJCUJBT3JpU2VxdWVuY2VbTlVNX09GX1RJRF07IC8vIFRoZSBtYXBwaW5nIHdjaWQgb2Ygb3JpZ2luYXRvciBzZXNzaW9uLiBpZiBUWEJBYml0bWFwIGJpdCBpcyBtYXNrZWQKLQotCS8vIDgwMi4xMW4gZmVhdHVyZXMuCi0JVUNIQVIJCU1wZHVEZW5zaXR5OwotCVVDSEFSCQlNYXhSQW1wZHVGYWN0b3I7Ci0JVUNIQVIJCUFNc2R1U2l6ZTsKLQlVQ0hBUgkJTW1wc01vZGU7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLgotCi0JSFRfQ0FQQUJJTElUWV9JRQkJSFRDYXBhYmlsaXR5OwotCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotCVVDSEFSCQlCU1MyMDQwQ29leGlzdGVuY2VNZ210U3VwcG9ydDsKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlCT09MRUFOCQliQXV0b1R4UmF0ZVN3aXRjaDsKLQotCVVDSEFSICAgICAgIFJhdGVMZW47Ci0Jc3RydWN0IF9NQUNfVEFCTEVfRU5UUlkgKnBOZXh0OwotICAgIFVTSE9SVCAgICAgIFR4U2VxW05VTV9PRl9USURdOwotCVVTSE9SVAkJTm9uUW9zRGF0YVNlcTsKLQotCVJTU0lfU0FNUExFCVJzc2lTYW1wbGU7Ci0KLQlVSU5UMzIJCQlUWE1DU0V4cGVjdGVkWzE2XTsKLQlVSU5UMzIJCQlUWE1DU1N1Y2Nlc3NmdWxbMTZdOwotCVVJTlQzMgkJCVRYTUNTRmFpbGVkWzE2XTsKLQlVSU5UMzIJCQlUWE1DU0F1dG9GYWxsQmFja1sxNl1bMTZdOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JVUxPTkcJCQlMYXN0QmVhY29uUnhUaW1lOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQotCVVMT05HIEFzc29jRGVhZExpbmU7Ci0KLQotCi0JVUxPTkcgQ2hhbm5lbFF1YWxpdHk7ICAvLyAwLi4xMDAsIENoYW5uZWwgUXVhbGl0eSBJbmRpY2F0aW9uIGZvciBSb2FtaW5nCi0KLX0gTUFDX1RBQkxFX0VOVFJZLCAqUE1BQ19UQUJMRV9FTlRSWTsKLQotdHlwZWRlZiBzdHJ1Y3QgX01BQ19UQUJMRSB7Ci0JVVNIT1JUCQkJU2l6ZTsKLQlNQUNfVEFCTEVfRU5UUlkgKkhhc2hbSEFTSF9UQUJMRV9TSVpFXTsKLQlNQUNfVEFCTEVfRU5UUlkgQ29udGVudFtNQVhfTEVOX09GX01BQ19UQUJMRV07Ci0JUVVFVUVfSEVBREVSICAgIE1jYXN0UHNRdWV1ZTsKLQlVTE9ORyAgICAgICAgICAgUHNRSWRsZUNvdW50OwotCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbkluUHNtOwotCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbkJhZEF0aGVyb3M7CS8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGlzIGF0aGVyb3MgODAyLjExbiBDaGlwLiAgV2UgbmVlZCB0byB1c2UgUlRTL0NUUyB3aXRoIEF0aGVyb3MgODAyLC4xMW4gY2hpcC4KLQlCT09MRUFOCQkJZkFueVR4T1BGb3JjZURpc2FibGU7CS8vIENoZWNrIGlmIGl0IGlzIG5lY2Vzc2FyeSB0byBkaXNhYmxlIEJFIFR4T1AKLQlCT09MRUFOCQkJZkFsbFN0YXRpb25Bc1JhbGluazsJLy8gQ2hlY2sgaWYgYWxsIHN0YXRpb25zIGFyZSByYWxpbmstY2hpcHNldAotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbklzTGVnYWN5OwkvLyBDaGVjayBpZiBJIHVzZSBsZWdhY3kgcmF0ZSB0byB0cmFuc21pdCB0byBteSBCU1MgU3RhdGlvbi8KLQlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb25Ob25HRjsJCS8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGNhbid0IHN1cHBvcnQgR0YuCi0JQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uMjBPbmx5OwkJLy8gQ2hlY2sgaWYgYW55IFN0YXRpb24gY2FuJ3Qgc3VwcG9ydCBHRi4KLQlCT09MRUFOCQkJZkFueVN0YXRpb25NSU1PUFNEeW5hbWljOyAvLyBDaGVjayBpZiBhbnkgU3RhdGlvbiBpcyBNSU1PIER5bmFtaWMKLQlCT09MRUFOICAgICAgICAgZkFueUJBU2Vzc2lvbjsgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBCQSBzZXNzaW9uLiAgRm9yY2UgdHVybiBvbiBSVFMvQ1RTCi0vLzIwMDgvMTAvMjg6IEtIIGFkZCB0byBzdXBwb3J0IEFudGVubmEgcG93ZXItc2F2aW5nIG9mIEFQPC0tCi0vLzIwMDgvMTAvMjg6IEtIIGFkZCB0byBzdXBwb3J0IEFudGVubmEgcG93ZXItc2F2aW5nIG9mIEFQLS0+Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi19IE1BQ19UQUJMRSwgKlBNQUNfVEFCTEU7Ci0KLQotCi0KLSNpZmRlZiBCTE9DS19ORVRfSUYKLXR5cGVkZWYgc3RydWN0IF9CTE9DS19RVUVVRV9FTlRSWQotewotCUJPT0xFQU4gU3dUeFF1ZXVlQmxvY2tGbGFnOwotCUxJU1RfSEVBREVSIE5ldElmTGlzdDsKLX0gQkxPQ0tfUVVFVUVfRU5UUlksICpQQkxPQ0tfUVVFVUVfRU5UUlk7Ci0jZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCi0KLQotc3RydWN0IHdpZmljb25mCi17Ci0JQk9PTEVBTgliU2hvcnRHSTsKLQlCT09MRUFOIGJHcmVlbkZpZWxkOwotfTsKLQotCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9ERVZfSU5GT18KLXsKLQlVQ0hBUgkJCWNoaXBOYW1lWzE2XTsKLQlSVE1QX0lORl9UWVBFCWluZlR5cGU7Ci19UlRNUF9ERVZfSU5GTzsKLQotCi0jaWZkZWYgREJHX0RJQUdOT1NFCi0jZGVmaW5lIERJQUdOT1NFX1RJTUUJMTAgICAvLyAxMCBzZWMKLXR5cGVkZWYgc3RydWN0IF9SdG1wRGlhZ1N0cmN1dF8KLXsJLy8gRGlhZ25vc2lzIFJlbGF0ZWQgZWxlbWVudAotCXVuc2lnbmVkIGNoYXIJCWluaXRlZDsKLQl1bnNpZ25lZCBjaGFyCXFJZHg7Ci0JdW5zaWduZWQgY2hhcglBcnJheVN0YXJ0SWR4OwotCXVuc2lnbmVkIGNoYXIJCUFycmF5Q3VySWR4OwotCS8vIFR4IFJlbGF0ZWQgQ291bnQKLQlVU0hPUlQJCQlUeERhdGFDbnRbRElBR05PU0VfVElNRV07Ci0JVVNIT1JUCQkJVHhGYWlsQ250W0RJQUdOT1NFX1RJTUVdOwotLy8JVVNIT1JUCQkJVHhEZXNjQ250W0RJQUdOT1NFX1RJTUVdWzE2XTsJCS8vIFR4RGVzYyBxdWV1ZSBsZW5ndGggaW4gc2NhbGUgb2YgMH4xNCwgPj0xNQotCVVTSE9SVAkJCVR4RGVzY0NudFtESUFHTk9TRV9USU1FXVsyNF07IC8vIDMqMwkvLyBUeERlc2MgcXVldWUgbGVuZ3RoIGluIHNjYWxlIG9mIDB+MTQsID49MTUKLS8vCVVTSE9SVAkJCVR4TWNzQ250W0RJQUdOT1NFX1RJTUVdWzE2XTsJCQkvLyBUeERhdGUgTUNTIENvdW50IGluIHJhbmdlIGZyb20gMCB0byAxNSwgc3RlcCBpbiAxLgotCVVTSE9SVAkJCVR4TWNzQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozCi0JVVNIT1JUCQkJVHhTV1F1ZUNudFtESUFHTk9TRV9USU1FXVs5XTsJCS8vIFR4U3dRdWV1ZSBsZW5ndGggaW4gc2NhbGUgb2YgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgPj04Ci0KLQlVU0hPUlQJCQlUeEFnZ0NudFtESUFHTk9TRV9USU1FXTsKLQlVU0hPUlQJCQlUeE5vbkFnZ0NudFtESUFHTk9TRV9USU1FXTsKLS8vCVVTSE9SVAkJCVR4QU1QRFVDbnRbRElBR05PU0VfVElNRV1bMTZdOwkJLy8gMTAgc2VjLCBUeERNQSBBUE1EVSBBZ2dyZWdhdGlvbiBjb3VudCBpbiByYW5nZSBmcm9tIDAgdG8gMTUsIGluIHNldHAgb2YgMS4KLQlVU0hPUlQJCQlUeEFNUERVQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozIC8vIDEwIHNlYywgVHhETUEgQVBNRFUgQWdncmVnYXRpb24gY291bnQgaW4gcmFuZ2UgZnJvbSAwIHRvIDE1LCBpbiBzZXRwIG9mIDEuCi0JVVNIT1JUCQkJVHhSYWxpbmtDbnRbRElBR05PU0VfVElNRV07CQkJLy8gVHhSYWxpbmsgQWdncmVnYXRpb24gQ291bnQgaW4gMSBzZWMgc2NhbGUuCi0JVVNIT1JUCQkJVHhBTVNEVUNudFtESUFHTk9TRV9USU1FXTsJCQkvLyBUeEFNU1VEIEFnZ3JlZ2F0aW9uIENvdW50IGluIDEgc2VjIHNjYWxlLgotCi0JLy8gUnggUmVsYXRlZCBDb3VudAotCVVTSE9SVAkJCVJ4RGF0YUNudFtESUFHTk9TRV9USU1FXTsJCQkvLyBSeCBUb3RhbCBEYXRhIGNvdW50LgotCVVTSE9SVAkJCVJ4Q3JjRXJyQ250W0RJQUdOT1NFX1RJTUVdOwotLy8JVVNIT1JUCQkJUnhNY3NDbnRbRElBR05PU0VfVElNRV1bMTZdOwkJLy8gUnggTUNTIENvdW50IGluIHJhbmdlIGZyb20gMCB0byAxNSwgc3RlcCBpbiAxLgotCVVTSE9SVAkJCVJ4TWNzQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozCi19UnRtcERpYWdTdHJ1Y3Q7Ci0jZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCi0KLQotc3RydWN0IF9SVE1QX0NISVBfT1BfCi17Ci0JLyogIENhbGlicmF0aW9uIGFjY2VzcyByZWxhdGVkIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLwotCWludCAoKmVlaW5pdCkoUlRNUF9BREFQVEVSICpwQWQpOwkJCQkJCQkJCQkvKiBpbnQgKCplZWluaXQpKFJUTVBfQURBUFRFUiAqcEFkKTsgKi8KLQlpbnQgKCplZXJlYWQpKFJUTVBfQURBUFRFUiAqcEFkLCBVU0hPUlQgb2Zmc2V0LCBQVVNIT1JUIHBWYWx1ZSk7CQkJCS8qIGludCAoKmVlcmVhZCkoUlRNUF9BREFQVEVSICpwQWQsIGludCBvZmZzZXQsIFBVU0hPUlQgcFZhbHVlKTsgKi8KLQlpbnQgKCplZXdyaXRlKShSVE1QX0FEQVBURVIgKnBBZCwgVVNIT1JUIG9mZnNldCwgVVNIT1JUIHZhbHVlKTs7CQkJCS8qIGludCAoKmVld3JpdGUpKFJUTVBfQURBUFRFUiAqcEFkLCBpbnQgb2Zmc2V0LCBVU0hPUlQgdmFsdWUpOyAqLwotCi0JLyogTUNVIHJlbGF0ZWQgY2FsbGJhY2sgZnVuY3Rpb25zICovCi0JaW50ICgqbG9hZEZpcm13YXJlKShSVE1QX0FEQVBURVIgKnBBZCk7CQkJCQkJCQkvKiBpbnQgKCpsb2FkRmlybXdhcmUpKFJUTVBfQURBUFRFUiAqcEFkKTsgKi8KLQlpbnQgKCplcmFzZUZpcm13YXJlKShSVE1QX0FEQVBURVIgKnBBZCk7CQkJCQkJCQkvKiBpbnQgKCplcmFzZUZpcm13YXJlKShSVE1QX0FEQVBURVIgKnBBZCk7ICovCi0JaW50ICgqc2VuZENvbW1hbmRUb01jdSkoUlRNUF9BREFQVEVSICpwQWQsIFVDSEFSIGNtZCwgVUNIQVIgdG9rZW4sIFVDSEFSIGFyZzAsIFVDSEFSIGFyZzEpOzsJLyogaW50ICgqc2VuZENvbW1hbmRUb01jdSkoUlRNUF9BREFQVEVSICpwQWQsIFVDSEFSIGNtZCwgVUNIQVIgdG9rZW4sIFVDSEFSIGFyZzAsIFVDSEFSIGFyZzEpOyAqLwotCi0JLyogUkYgYWNjZXNzIHJlbGF0ZWQgY2FsbGJhY2sgZnVuY3Rpb25zICovCi0JUkVHX1BBSVIgKnBSRlJlZ1RhYmxlOwotCXZvaWQgKCpBc2ljUmZJbml0KShSVE1QX0FEQVBURVIgKnBBZCk7Ci0Jdm9pZCAoKkFzaWNSZlR1cm5PbikoUlRNUF9BREFQVEVSICpwQWQpOwotCXZvaWQgKCpBc2ljUmZUdXJuT2ZmKShSVE1QX0FEQVBURVIgKnBBZCk7Ci0Jdm9pZCAoKkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKShSVE1QX0FEQVBURVIgKnBBZCk7Ci0Jdm9pZCAoKkFzaWNIYWx0QWN0aW9uKShSVE1QX0FEQVBURVIgKnBBZCk7Ci19OwotCi0KLS8vCi0vLyAgVGhlIG1pbmlwb3J0IGFkYXB0ZXIgc3RydWN0dXJlCi0vLwotc3RydWN0IF9SVE1QX0FEQVBURVIKLXsKLQlQVk9JRAkJCQkJT1NfQ29va2llOwkvLyBzYXZlIHNwZWNpZmljIHN0cnVjdHVyZSByZWxhdGl2ZSB0byBPUwotCVBORVRfREVWCQkJCW5ldF9kZXY7Ci0JVUxPTkcJCQkJCVZpcnR1YWxJZkNudDsKLQotCVJUTVBfQ0hJUF9PUAkJCWNoaXBPcHM7Ci0JVVNIT1JUCQkJCQlUaGlzVGJ0dE51bVRvTmV4dFdha2VVcDsKLQotI2lmZGVmIElORl9BTUFaT05fUFBBCi0JVUlOVDMyICBnX2lmX2lkOwotCUJPT0xFQU4JUFBBRW5hYmxlOwotCVBQQV9ESVJFQ1RQQVRIX0NCICAgICAgICpwRGlyZWN0cGF0aENiOwotI2VuZGlmIC8vIElORl9BTUFaT05fUFBBIC8vCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgUENJIHJlbGF0ZWQgcGFyYW1ldGVycwkJCQkJCQkJCQkJCQkJCQkgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JUFVDSEFSICAgICAgICAgICAgICAgICAgQ1NSQmFzZUFkZHJlc3M7ICAgICAvLyBQQ0kgTU1JTyBCYXNlIEFkZHJlc3MsIGFsbCBhY2Nlc3Mgd2lsbCB1c2UKLQl1bnNpZ25lZCBpbnQJCQlpcnFfbnVtOwotCi0JVVNIT1JUCQkgICAgICAgICAgICBMbmtDdHJsQml0TWFzazsKLQlVU0hPUlQJCSAgICAgICAgICAgIFJMbmtDdHJsQ29uZmlndXJhdGlvbjsKLQlVU0hPUlQgICAgICAgICAgICAgICAgICBSTG5rQ3RybE9mZnNldDsKLQlVU0hPUlQJCSAgICAgICAgICAgIEhvc3RMbmtDdHJsQ29uZmlndXJhdGlvbjsKLQlVU0hPUlQgICAgICAgICAgICAgICAgICBIb3N0TG5rQ3RybE9mZnNldDsKLQlVU0hPUlQJCSAgICAgICAgICAgIFBDSWVQb3dlclNhdmVMZXZlbDsKLQlVTE9ORwkJCQlSdDN4eEhvc3RMaW5rQ3RybDsJLy8gVVNlZCBmb3IgMzA5MEYgY2hpcAotCVVMT05HCQkJCVJ0M3h4UmFsaW5rTGlua0N0cmw7CS8vIFVTZWQgZm9yIDMwOTBGIGNoaXAKLQlVU0hPUlQJCQkJRGV2aWNlSUQ7ICAgICAgICAgICAvLyBSZWFkIGZyb20gUENJIGNvbmZpZwotCVVMT05HCQkJCUFjY2Vzc0JCUEZhaWxDb3VudDsKLQlCT09MRUFOCQkJCQliUENJY2xrT2ZmOwkJCQkJCS8vIGZsYWcgdGhhdCBpbmRpY2F0ZSBpZiB0aGUgUElDRSBwb3dlciBzdGF0dXMgaW4gQ29uZmlndXJhdGlvbiBTUGFjZS4uCi0JQk9PTEVBTgkJCQkJYlBDSWNsa09mZkRpc2FibGVUeDsJCQkvLwotCi0JQk9PTEVBTgkJCQkJYnJ0MzB4eEJhbk1jdUNtZDsJLy93aGVuID0gMHhmZiBtZWFucyBhbGwgY29tbWFuZHMgYXJlIG9rIHRvIHNldCAuCi0JQk9PTEVBTgkJCQkJYjMwOTBFU3BlY2lhbENoaXA7CS8vMzA5MEUgc3BlY2lhbCBjaGlwIHRoYXQgd3JpdGUgRUVQUk9NIDB4MjQ9MHg5MjgwLgotCVVMT05HCQkJCQlDaGVja0RtYUJ1c3lDb3VudDsgIC8vIENoZWNrIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgQ291bnQuCi0KLQlVSU5UCQkJCQlpbnRfZW5hYmxlX3JlZzsKLQlVSU5UCQkJCQlpbnRfZGlzYWJsZV9tYXNrOwotCVVJTlQJCQkJCWludF9wZW5kaW5nOwotCi0KLQlSVE1QX0RNQUJVRiAgICAgICAgICAgICBUeEJ1ZlNwYWNlW05VTV9PRl9UWF9SSU5HXTsgLy8gU2hhcmVkIG1lbW9yeSBvZiBhbGwgMXN0IHByZS1hbGxvY2F0ZWQgVHhCdWYgYXNzb2NpYXRlZCB3aXRoIGVhY2ggVFhECi0JUlRNUF9ETUFCVUYgICAgICAgICAgICAgUnhEZXNjUmluZzsgICAgICAgICAgICAgICAgIC8vIFNoYXJlZCBtZW1vcnkgZm9yIFJYIGRlc2NyaXB0b3JzCi0JUlRNUF9ETUFCVUYgICAgICAgICAgICAgVHhEZXNjUmluZ1tOVU1fT0ZfVFhfUklOR107CS8vIFNoYXJlZCBtZW1vcnkgZm9yIFR4IGRlc2NyaXB0b3JzCi0JUlRNUF9UWF9SSU5HICAgICAgICAgICAgVHhSaW5nW05VTV9PRl9UWF9SSU5HXTsJCS8vIEFDMH40ICsgSENDQQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0KLQlORElTX1NQSU5fTE9DSwkJaXJxX2xvY2s7Ci0JVUNIQVIJCQkJaXJxX2Rpc2FibGVkOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgUkJVUyByZWxhdGVkIHBhcmFtZXRlcnMJCQkJCQkJCQkJCQkJCQkJICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgQm90aCBQQ0kvVVNCIHJlbGF0ZWQgcGFyYW1ldGVycwkJCQkJCQkJCQkJCQkJICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8vUlRNUF9ERVZfSU5GTwkJCWNoaXBJbmZvOwotCVJUTVBfSU5GX1RZUEUJCQlpbmZUeXBlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgIERyaXZlciBNZ210IHJlbGF0ZWQgcGFyYW1ldGVycwkJCQkJCQkJCQkJCQkJICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCVJUTVBfT1NfVEFTSwkJCW1sbWVUYXNrOwotI2lmZGVmIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUCi0JLy8gSWYgeW91IHdhbnQgdXNlIHRpbWVyIHRhc2sgdG8gaGFuZGxlIHRoZSB0aW1lciByZWxhdGVkIGpvYnMsIGVuYWJsZSB0aGlzLgotCVJUTVBfVElNRVJfVEFTS19RVUVVRQlUaW1lclE7Ci0JTkRJU19TUElOX0xPQ0sJCQlUaW1lclFMb2NrOwotCVJUTVBfT1NfVEFTSwkJCXRpbWVyVGFzazsKLSNlbmRpZiAvLyBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgVHggcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCUJPT0xFQU4gICAgICAgICAgICAgICAgIERlUXVldWVSdW5uaW5nW05VTV9PRl9UWF9SSU5HXTsgIC8vIGZvciBlbnN1cmluZyBSVFVTQkRlUXVldWVQYWNrZXQgZ2V0IGNhbGwgb25jZQotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIERlUXVldWVMb2NrW05VTV9PRl9UWF9SSU5HXTsKLQotCi0JLy8gcmVzb3VyY2UgZm9yIHNvZnR3YXJlIGJhY2tsb2cgcXVldWVzCi0JUVVFVUVfSEVBREVSICAgICAgICAgICAgVHhTd1F1ZXVlW05VTV9PRl9UWF9SSU5HXTsgIC8vIDQgQUMgKyAxIEhDQ0EKLQlORElTX1NQSU5fTE9DSyAgICAgICAgICBUeFN3UXVldWVMb2NrW05VTV9PRl9UWF9SSU5HXTsJLy8gVHhTd1F1ZXVlIHNwaW5sb2NrCi0KLQlSVE1QX0RNQUJVRiAgICAgICAgICAgICBNZ210RGVzY1Jpbmc7CQkJLy8gU2hhcmVkIG1lbW9yeSBmb3IgTUdNVCBkZXNjcmlwdG9ycwotCVJUTVBfTUdNVF9SSU5HICAgICAgICAgIE1nbXRSaW5nOwotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIE1nbXRSaW5nTG9jazsJCQkvLyBQcmlvIFJpbmcgc3BpbmxvY2sKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgIFJ4IHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCVJUTVBfUlhfUklORyAgICAgICAgICAgIFJ4UmluZzsKLQlORElTX1NQSU5fTE9DSyAgICAgICAgICBSeFJpbmdMb2NrOyAgICAgICAgICAgICAgICAgLy8gUnggUmluZyBzcGlubG9jawotI2lmZGVmIFJUMzA5MAotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIE1jdUNtZExvY2s7ICAgICAgICAgICAgICAvL01DVSBDb21tYW5kIFF1ZXVlIHNwaW5sb2NrCi0jZW5kaWYgLy8gUlQzMDkwIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgIEFTSUMgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JVUlOVDMyCQkJTUFDVmVyc2lvbjsJCS8vIE1BQyB2ZXJzaW9uLiBSZWNvcmQgcnQyODYwQygweDI4NjAwMTAwKSBvciBydDI4NjBEICgweDI4NjAwMTAxKS4uCi0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBFMlBST00KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlVTE9ORwkJCQlFZXByb21WZXJzaW9uOyAgICAgICAgICAvLyBieXRlIDA6IHZlcnNpb24sIGJ5dGUgMTogcmV2aXNpb24sIGJ5dGUgMn4zOiB1bnVzZWQKLQlVTE9ORwkJCQlGaXJtd2FyZVZlcnNpb247ICAgICAgICAvLyBieXRlIDA6IE1pbm9yIHZlcnNpb24sIGJ5dGUgMTogTWFqb3IgdmVyc2lvbiwgb3RoZXJ3aXNlIHVudXNlZC4KLQlVU0hPUlQJCQkJRUVQUk9NRGVmYXVsdFZhbHVlW05VTV9FRVBST01fQkJQX1BBUk1TXTsKLQlVQ0hBUgkJCQlFRVBST01BZGRyZXNzTnVtOyAgICAgICAvLyA5M2M0Nj02ICA5M2M2Nj04Ci0JQk9PTEVBTgkJCQlFZXByb21BY2Nlc3M7Ci0JVUNIQVIJCQkJRUZ1c2VUYWc7Ci0KLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIEJCUCBDb250cm9sCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWZkZWYgTUVSR0VfQVJDSF9URUFNCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgQmJwV3JpdGVMYXRjaFsyNTZdOyAgICAgLy8gcmVjb3JkIGxhc3QgQkJQIHJlZ2lzdGVyIHZhbHVlIHdyaXR0ZW4gdmlhIEJCUF9JT19XUklURS9CQlBfSU9fV1JJVEVfVllfUkVHX0lECi0jZWxzZQotCVVDSEFSICAgICAgICAgICAgICAgICAgIEJicFdyaXRlTGF0Y2hbMTQwXTsgICAgIC8vIHJlY29yZCBsYXN0IEJCUCByZWdpc3RlciB2YWx1ZSB3cml0dGVuIHZpYSBCQlBfSU9fV1JJVEUvQkJQX0lPX1dSSVRFX1ZZX1JFR19JRAotI2VuZGlmIC8vIE1FUkdFX0FSQ0hfVEVBTSAvLwotCUNIQVIJCQkJCUJicFJzc2lUb0RibURlbHRhOwkJLy8gY2hhbmdlIGZyb20gVUNIQVIgdG8gQ0hBUiBmb3IgaGlnaCBwb3dlcgotCUJCUF9SNjZfVFVOSU5HICAgICAgICAgIEJicFR1bmluZzsKLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBSRklDIGNvbnRyb2wKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgUmZJY1R5cGU7ICAgICAgIC8vIFJGSUNfeHh4Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgUmZGcmVxT2Zmc2V0OyAgIC8vIEZyZXF1ZW5jeSBvZmZzZXQgZm9yIGNoYW5uZWwgc3dpdGNoaW5nCi0JUlRNUF9SRl9SRUdTICAgICAgICAgICAgTGF0Y2hSZlJlZ3M7ICAgIC8vIGxhdGNoIHRoIGxhdGVzdCBSRiBwcm9ncmFtbWluZyB2YWx1ZSBzaW5jZSBSRiBJQyBkb2Vzbid0IHN1cHBvcnQgUkVBRAotCi0JRUVQUk9NX0FOVEVOTkFfU1RSVUMgICAgQW50ZW5uYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgQU50ZW5uYSBkZWZpbml0aW9uIGlzIGRpZmZlcmVudCBmb3IgYSAmIGcuIFdlIG5lZWQgdG8gc2F2ZSBpdCBmb3IgZnV0dXJlIHJlZmVyZW5jZS4KLQlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgICAgTmljQ29uZmlnMjsKLQotCS8vIFRoaXMgc29mdCBSeCBBbnRlbm5hIERpdmVyc2l0eSBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IHdoZW4gdXNlciBzZXQKLQkvLyBSWCBBbnRlbm5hID0gRElWRVJTSVRZIE9OCi0JU09GVF9SWF9BTlRfRElWRVJTSVRZICAgUnhBbnQ7Ci0KLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBSRlByb2dTZXE7Ci0JQ0hBTk5FTF9UWF9QT1dFUiAgICAgICAgVHhQb3dlcltNQVhfTlVNX09GX0NIQU5ORUxTXTsgICAgICAgLy8gU3RvcmUgVHggcG93ZXIgdmFsdWUgZm9yIGFsbCBjaGFubmVscy4KLQlDSEFOTkVMX1RYX1BPV0VSICAgICAgICBDaGFubmVsTGlzdFtNQVhfTlVNX09GX0NIQU5ORUxTXTsgICAvLyBsaXN0IGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMgZm9yIHNpdGUgc3VydmV5Ci0JQ0hBTk5FTF8xMUpfVFhfUE9XRVIgICAgVHhQb3dlcjExSltNQVhfTlVNX09GXzExSkNIQU5ORUxTXTsgICAgICAgLy8gODAyLjExaiBjaGFubmVsIGFuZCBidwotCUNIQU5ORUxfMTFKX1RYX1BPV0VSICAgIENoYW5uZWxMaXN0MTFKW01BWF9OVU1fT0ZfMTFKQ0hBTk5FTFNdOyAgIC8vIGxpc3QgYWxsIHN1cHBvcnRlZCBjaGFubmVscyBmb3Igc2l0ZSBzdXJ2ZXkKLQotCVVDSEFSICAgICAgICAgICAgICAgICAgIENoYW5uZWxMaXN0TnVtOyAgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBjaGFubmVsIGluIENoYW5uZWxMaXN0W10KLQlVQ0hBUgkJCQkJQmJwOTQ7Ci0JQk9PTEVBTgkJCQkJQmJwRm9yQ0NLOwotCVVMT05HCQlUeDIwTVB3ckNmZ0FCYW5kWzVdOwotCVVMT05HCQlUeDIwTVB3ckNmZ0dCYW5kWzVdOwotCVVMT05HCQlUeDQwTVB3ckNmZ0FCYW5kWzVdOwotCVVMT05HCQlUeDQwTVB3ckNmZ0dCYW5kWzVdOwotCi0JQk9PTEVBTiAgICAgYkF1dG9UeEFnY0E7ICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBkcml2ZXIgYXV0byBUeCBBZ2MgY29udHJvbAotCVVDSEFSCSAgICBUc3NpUmVmQTsJCQkJCS8vIFN0b3JlIFRzc2kgcmVmZXJlbmNlIHZhbHVlIGFzIDI1IHRlbXBlcmF0dXJlLgotCVVDSEFSCSAgICBUc3NpUGx1c0JvdW5kYXJ5QVs1XTsJCS8vIFRzc2kgYm91bmRhcnkgZm9yIGluY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuCi0JVUNIQVIJICAgIFRzc2lNaW51c0JvdW5kYXJ5QVs1XTsJCS8vIFRzc2kgYm91bmRhcnkgZm9yIGRlY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuCi0JVUNIQVIJICAgIFR4QWdjU3RlcEE7CQkJCQkvLyBTdG9yZSBUeCBUU1NJIGRlbHRhIGluY3JlbWVudCAvIGRlY3JlbWVudCB2YWx1ZQotCUNIQVIJCVR4QWdjQ29tcGVuc2F0ZUE7CQkJLy8gU3RvcmUgdGhlIGNvbXBlbnNhdGlvbiAoVHhBZ2NTdGVwICogKGlkeC0xKSkKLQotCUJPT0xFQU4gICAgIGJBdXRvVHhBZ2NHOyAgICAgICAgICAgICAgICAvLyBFbmFibGUgZHJpdmVyIGF1dG8gVHggQWdjIGNvbnRyb2wKLQlVQ0hBUgkgICAgVHNzaVJlZkc7CQkJCQkvLyBTdG9yZSBUc3NpIHJlZmVyZW5jZSB2YWx1ZSBhcyAyNSB0ZW1wZXJhdHVyZS4KLQlVQ0hBUgkgICAgVHNzaVBsdXNCb3VuZGFyeUdbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBpbmNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgotCVVDSEFSCSAgICBUc3NpTWludXNCb3VuZGFyeUdbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBkZWNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgotCVVDSEFSCSAgICBUeEFnY1N0ZXBHOwkJCQkJLy8gU3RvcmUgVHggVFNTSSBkZWx0YSBpbmNyZW1lbnQgLyBkZWNyZW1lbnQgdmFsdWUKLQlDSEFSCQlUeEFnY0NvbXBlbnNhdGVHOwkJCS8vIFN0b3JlIHRoZSBjb21wZW5zYXRpb24gKFR4QWdjU3RlcCAqIChpZHgtMSkpCi0KLQlDSEFSCQlCR1Jzc2lPZmZzZXQwOwkJCQkvLyBTdG9yZSBCL0cgUlNTSSMwIE9mZnNldCB2YWx1ZSBvbiBFRVBST00gMHg0NmgKLQlDSEFSCQlCR1Jzc2lPZmZzZXQxOwkJCQkvLyBTdG9yZSBCL0cgUlNTSSMxIE9mZnNldCB2YWx1ZQotCUNIQVIJCUJHUnNzaU9mZnNldDI7CQkJCS8vIFN0b3JlIEIvRyBSU1NJIzIgT2Zmc2V0IHZhbHVlCi0KLQlDSEFSCQlBUnNzaU9mZnNldDA7CQkJCS8vIFN0b3JlIEEgUlNTSSMwIE9mZnNldCB2YWx1ZSBvbiBFRVBST00gMHg0QWgKLQlDSEFSCQlBUnNzaU9mZnNldDE7CQkJCS8vIFN0b3JlIEEgUlNTSSMxIE9mZnNldCB2YWx1ZQotCUNIQVIJCUFSc3NpT2Zmc2V0MjsJCQkJLy8gU3RvcmUgQSBSU1NJIzIgT2Zmc2V0IHZhbHVlCi0KLQlDSEFSCQlCTE5BR2FpbjsJCQkJCS8vIFN0b3JlIEIvRyBleHRlcm5hbCBMTkEjMCB2YWx1ZSBvbiBFRVBST00gMHg0NGgKLQlDSEFSCQlBTE5BR2FpbjA7CQkJCQkvLyBTdG9yZSBBIGV4dGVybmFsIExOQSMwIHZhbHVlIGZvciBjaDM2fjY0Ci0JQ0hBUgkJQUxOQUdhaW4xOwkJCQkJLy8gU3RvcmUgQSBleHRlcm5hbCBMTkEjMSB2YWx1ZSBmb3IgY2gxMDB+MTI4Ci0JQ0hBUgkJQUxOQUdhaW4yOwkJCQkJLy8gU3RvcmUgQSBleHRlcm5hbCBMTkEjMiB2YWx1ZSBmb3IgY2gxMzJ+MTY1Ci0jaWZkZWYgUlQzMHh4Ci0JLy8gZm9yIDM1NzIKLQlVQ0hBUgkJQmJwMjU7Ci0JVUNIQVIJCUJicDI2OwotCi0JVUNIQVIJCVR4TWl4ZXJHYWluMjRHOwkJCQkvLyBUeCBtaXhlciBnYWluIHZhbHVlIGZyb20gRUVQUk9NIHRvIGltcHJvdmUgVHggRVZNIC8gVHggREFDLCAyLjRHCi0JVUNIQVIJCVR4TWl4ZXJHYWluNUc7Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIExFRCBjb250cm9sCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCU1DVV9MRURDU19TVFJVQwkJTGVkQ250bDsKLQlVU0hPUlQJCQkJTGVkMTsJLy8gcmVhZCBmcm9tIEVFUFJPTSAweDNjCi0JVVNIT1JUCQkJCUxlZDI7CS8vIEVFUFJPTSAweDNlCi0JVVNIT1JUCQkJCUxlZDM7CS8vIEVFUFJPTSAweDQwCi0JVUNIQVIJCQkJTGVkSW5kaWNhdG9yU3RyZW5ndGg7Ci0JVUNIQVIJCQkJUnNzaVNpbmdhbHN0cmVuZ3RoT2ZmZXQ7Ci0JQk9PTEVBTgkJCQliTGVkT25TY2FubmluZzsKLQlVQ0hBUgkJCQlMZWRTdGF0dXM7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgODAyLjExIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvLyBvdXRnb2luZyBCRUFDT04gZnJhbWUgYnVmZmVyIGFuZCBjb3JyZXNwb25kaW5nIFRYRAotCVRYV0lfU1RSVUMJCQlCZWFjb25UeFdJOwotCVBVQ0hBUgkJCQkJCUJlYWNvbkJ1ZjsKLQlVU0hPUlQJCQkJCQlCZWFjb25PZmZzZXRbSFdfQkVBQ09OX01BWF9DT1VOVF07Ci0KLQkvLyBwcmUtYnVpbGQgUFMtUE9MTCBhbmQgTlVMTCBmcmFtZSB1cG9uIGxpbmsgdXAuIGZvciBlZmZpY2llbmN5IHB1cnBvc2UuCi0JUFNQT0xMX0ZSQU1FCQkJUHNQb2xsRnJhbWU7Ci0JSEVBREVSXzgwMl8xMQkJCU51bGxGcmFtZTsKLQotCi0KLQotLy89PT09PT09PT1BUD09PT09PT09PT09Ci0KLQotLy89PT09PT09U1RBPT09PT09PT09PT0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIFNUQSBzcGVjaWZpYyBjb25maWd1cmF0aW9uICYgb3BlcmF0aW9uIHN0YXR1cwotCS8vIHVzZWQgb25seSB3aGVuIHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNUQV9BRE1JTl9DT05GSUcgICAgICAgIFN0YUNmZzsJCS8vIHVzZXIgZGVzaXJlZCBzZXR0aW5ncwotCVNUQV9BQ1RJVkVfQ09ORklHICAgICAgIFN0YUFjdGl2ZTsJCS8vIHZhbGlkIG9ubHkgd2hlbiBBREhPQ19PTihwQWQpIHx8IElORlJBX09OKHBBZCkKLQlDSEFSICAgICAgICAgICAgICAgICAgICBuaWNrbmFtZVtJV19FU1NJRF9NQVhfU0laRSsxXTsgLy8gbmlja25hbWUsIG9ubHkgdXNlZCBpbiB0aGUgaXdjb25maWcgaS9mCi0JTkRJU19NRURJQV9TVEFURSAgICAgICAgUHJlTWVkaWFTdGF0ZTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotLy89PT09PT09Q29tbW9uPT09PT09PT09PT0KLQkvLyBPUCBtb2RlOiBlaXRoZXIgQVAgb3IgU1RBCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgT3BNb2RlOyAgICAgICAgICAgICAgICAgICAgIC8vIE9QTU9ERV9TVEEsIE9QTU9ERV9BUAotCi0JTkRJU19NRURJQV9TVEFURSAgICAgICAgSW5kaWNhdGVNZWRpYVN0YXRlOwkJCS8vIEJhc2Ugb24gSW5kaWNhdGlvbiBzdGF0ZSwgZGVmYXVsdCBpcyBOZGlzTWVkaWFTdGF0ZURpc0Nvbm5lY3RlZAotCi0KLQkvKiBNQVQgcmVsYXRlZCBwYXJhbWV0ZXJzICovCi0KLQkvLyBjb25maWd1cmF0aW9uOiByZWFkIGZyb20gUmVnaXN0cnkgJiBFMlBST00KLQlCT09MRUFOICAgICAgICAgICAgICAgICBiTG9jYWxBZG1pbk1BQzsgICAgICAgICAgICAgLy8gVXNlIHVzZXIgY2hhbmdlZCBNQUMKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBQZXJtYW5lbnRBZGRyZXNzW01BQ19BRERSX0xFTl07ICAgIC8vIEZhY3RvcnkgZGVmYXVsdCBNQUMgYWRkcmVzcwotCVVDSEFSICAgICAgICAgICAgICAgICAgIEN1cnJlbnRBZGRyZXNzW01BQ19BRERSX0xFTl07ICAgICAgLy8gVXNlciBjaGFuZ2VkIE1BQyBhZGRyZXNzCi0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBjb21tb24gY29uZmlndXJhdGlvbiB0byBib3RoIE9QTU9ERV9TVEEgYW5kIE9QTU9ERV9BUAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUNPTU1PTl9DT05GSUcgICAgICAgICAgIENvbW1vbkNmZzsKLQlNTE1FX1NUUlVDVCAgICAgICAgICAgICBNbG1lOwotCi0JLy8gQVAgbmVlZHMgdGhvc2UgdmFpYWJsZXMgZm9yIHNpdGUgc3VydmV5IGZlYXR1cmUuCi0JTUxNRV9BVVggICAgICAgICAgICAgICAgTWxtZUF1eDsgICAgICAgICAgIC8vIHRlbXBvcmFyeSBzZXR0aW5ncyB1c2VkIGR1cmluZyBNTE1FIHN0YXRlIG1hY2hpbmUKLQlCU1NfVEFCTEUgICAgICAgICAgICAgICBTY2FuVGFiOyAgICAgICAgICAgLy8gc3RvcmUgdGhlIGxhdGVzdCBTQ0FOIHJlc3VsdAotCi0JLy9BYm91dCBNYWNUYWIsIHRoZSBzdGEgZHJpdmVyIHdpbGwgdXNlICMwIGFuZCAjMSBmb3IgbXVsdGljYXN0IGFuZCBBUC4KLQlNQUNfVEFCTEUgICAgICAgICAgICAgICAgIE1hY1RhYjsgICAgIC8vIEFTSUMgb24tY2hpcCBXQ0lEIGVudHJ5IHRhYmxlLiAgQXQgVFgsIEFTSUMgYWx3YXlzIHVzZSBrZXkgYWNjb3JkaW5nIHRvIHRoaXMgb24tY2hpcCB0YWJsZS4KLQlORElTX1NQSU5fTE9DSyAgICAgICAgICBNYWNUYWJMb2NrOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JQkFfVEFCTEUJCQlCQVRhYmxlOwotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIEJBVGFiTG9jazsKLQlSQUxJTktfVElNRVJfU1RSVUNUIFJFQ0JBVGltZXI7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkvLyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gS0VZIHRhYmxlcwotCUNJUEhFUl9LRVkgICAgICAgICAgICAgIFNoYXJlZEtleVtNQVhfTUJTU0lEX05VTV1bNF07IC8vIFNUQSBhbHdheXMgdXNlIFNoYXJlZEtleVtCU1MwXVswLi4zXQotCi0JLy8gUlggcmUtYXNzZW1ibHkgYnVmZmVyIGZvciBmcmFnbWVudGF0aW9uCi0JRlJBR01FTlRfRlJBTUUgICAgICAgICAgRnJhZ0ZyYW1lOyAgICAgICAgICAgICAgICAgIC8vIEZyYW1lIHN0b3JhZ2UgZm9yIGZyYWdtZW50IGZyYW1lCi0KLQkvLyB2YXJpb3VzIENvdW50ZXJzCi0JQ09VTlRFUl84MDJfMyAgICAgICAgICAgQ291bnRlcnM4MDIzOyAgICAgICAgICAgICAgIC8vIDgwMi4zIGNvdW50ZXJzCi0JQ09VTlRFUl84MDJfMTEgICAgICAgICAgV2xhbkNvdW50ZXJzOyAgICAgICAgICAgICAgIC8vIDgwMi4xMSBNSUIgY291bnRlcnMKLQlDT1VOVEVSX1JBTElOSyAgICAgICAgICBSYWxpbmtDb3VudGVyczsgICAgICAgICAgICAgLy8gUmFsaW5rIHByb3ByaWV0eSBjb3VudGVycwotCUNPVU5URVJfRFJTICAgICAgICAgICAgIERyc0NvdW50ZXJzOyAgICAgICAgICAgICAgICAvLyBjb3VudGVycyBmb3IgRHluYW1pYyBUWCBSYXRlIFN3aXRjaGluZwotCVBSSVZBVEVfU1RSVUMgICAgICAgICAgIFByaXZhdGVJbmZvOyAgICAgICAgICAgICAgICAvLyBQcml2YXRlIGluZm9ybWF0aW9uICYgY291bnRlcnMKLQotCS8vIGZsYWdzLCBzZWUgZlJUTVBfQURBUFRFUl94eHggZmxhZ3MKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwcmVzZW50IGN1cnJlbnQgZGV2aWNlIHN0YXR1cwotCVVMT05HICAgICAgICAgICAgICAgICAgIFBTRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAvLyBQb3dlciBTYXZlIG9wZXJhdGlvbiBmbGFnLgotCi0JLy8gY3VycmVudCBUWCBzZXF1ZW5jZSAjCi0JVVNIT1JUICAgICAgICAgICAgICAgICAgU2VxdWVuY2U7Ci0KLQkvLyBDb250cm9sIGRpc2Nvbm5lY3QgLyBjb25uZWN0IGV2ZW50IGdlbmVyYXRpb24KLQkvLysrK0RpZG4ndCB1c2VkIGFueW1vcmUKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBMaW5rRG93blRpbWU7Ci0JLy8tLS0KLQlVTE9ORyAgICAgICAgICAgICAgICAgICBMYXN0UnhSYXRlOwotCVVMT05HICAgICAgICAgICAgICAgICAgIExhc3RUeFJhdGU7Ci0JLy8rKytVc2VkIG9ubHkgZm9yIFN0YXRpb24KLQlCT09MRUFOICAgICAgICAgICAgICAgICBiQ29uZmlnQ2hhbmdlZDsgICAgICAgICAvLyBDb25maWcgQ2hhbmdlIGZsYWcgZm9yIHRoZSBzYW1lIFNTSUQgc2V0dGluZwotCS8vLS0tCi0KLQlVTE9ORyAgICAgICAgICAgICAgICAgICBFeHRyYUluZm87ICAgICAgICAgICAgICAvLyBFeHRyYSBpbmZvcm1hdGlvbiBmb3IgZGlzcGxheWluZyBzdGF0dXMKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBTeXN0ZW1FcnJvckJpdG1hcDsgICAgICAvLyBiMDogRTJQUk9NIHZlcnNpb24gZXJyb3IKLQotCS8vKysrRGlkbid0IHVzZWQgYW55bW9yZQotCVVMT05HICAgICAgICAgICAgICAgICAgIE1hY0ljVmVyc2lvbjsgICAgICAgICAgIC8vIE1BQy9CQlAgc2VyaWFsIGludGVyZmFjZSBpc3N1ZSBzb2x2ZWQgYWZ0ZXIgdmVyLkQKLQkvLy0tLQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gU3lzdGVtIGV2ZW50IGxvZwotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVJUXzgwMl8xMV9FVkVOVF9UQUJMRSAgIEV2ZW50VGFiOwotCi0KLQlCT09MRUFOCQlIVENFbmFibGU7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogICAgICBTdGF0aXN0aWMgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCUJPT0xFQU4JCQkJCQliVXBkYXRlQmNuQ250RG9uZTsKLQlVTE9ORwkJCQkJCXdhdGNoRG9nTWFjRGVhZGxvY2s7CS8vIHByZXZlbnQgTUFDL0JCUCBpbnRvIGRlYWRsb2NrIGNvbmRpdGlvbgotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBERUJVRyBwYXJhbWVydHMKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy9VTE9ORwkJRGVidWdTZXR0aW5nWzRdOwotCUJPT0xFQU4JCWJCYW5BbGxCYVNldHVwOwotCUJPT0xFQU4JCWJQcm9taXNjdW91czsKLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBydDI4NjBjIGVtdWxhdGlvbi11c2UgUGFyYW1ldGVycwotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvL1VMT05HCQlydHNhY2N1WzMwXTsKLQkvL1VMT05HCQljdHNhY2N1WzMwXTsKLQkvL1VMT05HCQljZmVuZGFjY3VbMzBdOwotCS8vVUxPTkcJCWJhY29udGVudFsxNl07Ci0JLy9VTE9ORwkJcnhpbnRbUlhfUklOR19TSVpFKzFdOwotCS8vVUNIQVIJCXJjdmJhWzYwXTsKLQlCT09MRUFOCQliTGlua0FkYXB0OwotCUJPT0xFQU4JCWJGb3JjZVByaW50VFg7Ci0JQk9PTEVBTgkJYkZvcmNlUHJpbnRSWDsKLQkvL0JPT0xFQU4JCWJEaXNhYmxlc2Nhbm5pbmc7CQkvL2RlZmluZWQgaW4gUlQyODcwIFVTQgotCUJPT0xFQU4JCWJTdGFGaWZvVGVzdDsKLQlCT09MRUFOCQliUHJvdGVjdGlvblRlc3Q7Ci0JLyoKLQlCT09MRUFOCQliSENDQVRlc3Q7Ci0JQk9PTEVBTgkJYkdlbk9uZUhDQ0E7Ci0JKi8KLQlCT09MRUFOCQliQnJvYWRDb21IVDsKLQkvLysrK0ZvbGxvd2luZyBhZGQgZnJvbSBSVDI4NzAgVVNCLgotCVVMT05HCQlCdWxrT3V0UmVxOwotCVVMT05HCQlCdWxrT3V0Q29tcGxldGU7Ci0JVUxPTkcJCUJ1bGtPdXRDb21wbGV0ZU90aGVyOwotCVVMT05HCQlCdWxrT3V0Q29tcGxldGVDYW5jZWw7CS8vIHNlZW1zIG5vdCB1c2Ugbm93PwotCVVMT05HCQlCdWxrSW5SZXE7Ci0JVUxPTkcJCUJ1bGtJbkNvbXBsZXRlOwotCVVMT05HCQlCdWxrSW5Db21wbGV0ZUZhaWw7Ci0JLy8tLS0KLQotICAgIHN0cnVjdCB3aWZpY29uZgkJCVdJRkl0ZXN0YmVkOwotCi0jaWZkZWYgUkFMSU5LX0FURQotCUFURV9JTkZPCQkJCWF0ZTsKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1X3Bvb2wgbXBkdV9ibGtfcG9vbDsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCVVMT05HCQkJCQlPbmVTZWNvbmRub25CRXBhY2tldHM7CQkvLyByZWNvcmQgbm9uIEJFIHBhY2tldHMgcGVyIHNlY29uZAotCi0jaWZkZWYgTElOVVgKLSNpZiBXSVJFTEVTU19FWFQgPj0gMTIKLSAgICBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAgICBpd19zdGF0czsKLSNlbmRpZgotCi0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7Ci0jZW5kaWYgLy8gTElOVVggLy8KLQotI2lmZGVmIEJMT0NLX05FVF9JRgotCUJMT0NLX1FVRVVFX0VOVFJZCQlibG9ja1F1ZXVlVGFiW05VTV9PRl9UWF9SSU5HXTsKLSNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KLQotCi0KLSNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKLQlJTlQzMgkJCQkJTUNfUm93SUQ7Ci0JU1RSSU5HCQkJCQlNQ19GaWxlTmFtZVsyNTZdOwotI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLwotCi0JVUxPTkcJCQkJCVRidHRUaWNrQ291bnQ7Ci0jaWZkZWYgUENJX01TSV9TVVBQT1JUCi0JQk9PTEVBTgkJCQkJSGF2ZU1zaTsKLSNlbmRpZiAvLyBQQ0lfTVNJX1NVUFBPUlQgLy8KLQotCi0JVUNIQVIJCQkJCWlzX29uOwotCi0jZGVmaW5lIFRJTUVfQkFTRQkJCSgxMDAwMDAwL09TX0haKQotI2RlZmluZSBUSU1FX09ORV9TRUNPTkQJCSgxMDAwMDAwL1RJTUVfQkFTRSkKLQlVQ0hBUgkJCQkJZmxnX2JlX2FkanVzdDsKLQlVTE9ORwkJCQkJYmVfYWRqdXN0X2xhc3RfdGltZTsKLQotI2lmZGVmIE5JTlRFTkRPX0FQCi0JTklORE9fQ1RSTF9CTE9DSwkJbmluZG9fY3RybF9ibG9jazsKLSNlbmRpZiAvLyBOSU5URU5ET19BUCAvLwotCi0KLSNpZmRlZiBJS0FOT1NfVlhfMVgwCi0Jc3RydWN0IElLQU5PU19UWF9JTkZPCUlrYW5vc1R4SW5mbzsKLQlzdHJ1Y3QgSUtBTk9TX1RYX0lORk8JSWthbm9zUnhJbmZvW01BWF9NQlNTSURfTlVNICsgTUFYX1dEU19FTlRSWSArIE1BWF9BUENMSV9OVU0gKyBNQVhfTUVTSF9OVU1dOwotI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KLQotCi0jaWZkZWYgREJHX0RJQUdOT1NFCi0JUnRtcERpYWdTdHJ1Y3QJRGlhZ1N0cnVjdDsKLSNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KLQotCi0JVUlOVDgJCQkJCUZsZ0N0c0VuYWJsZWQ7Ci0JVUlOVDgJCQkJCVBNX0ZsZ1N1c3BlbmQ7Ci0KLSNpZmRlZiBSVDMweHgKLSNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKLQlCT09MRUFOCQliVXNlRWZ1c2U7Ci0JQk9PTEVBTgkJYkVFUFJPTUZpbGU7Ci0JQk9PTEVBTgkJYkZyb2NlRUVQUk9NQnVmZmVyOwotCVVDSEFSCQlFRVBST01JbWFnZVsxMDI0XTsKLSNlbmRpZiAvLyBSVE1QX0VGVVNFX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBSVDMweHggLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi19OwotCi0KLQotI2lmZGVmIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQKLSNkZWZpbmUgREVMQVlJTlRNQVNLCQkweDAwMTNmZmZiCi0jZGVmaW5lIElOVE1BU0sJCQkJMHgwMDEzZmZmYgotI2RlZmluZSBJbmRNYXNrCQkJCTB4MDAxM2ZmZmMKLSNkZWZpbmUgUmFkYXJJbnQJCQkweDAwMTAwMDAwCi0jZWxzZQotI2RlZmluZSBERUxBWUlOVE1BU0sJCTB4MDAwM2ZmZmIKLSNkZWZpbmUgSU5UTUFTSwkJCQkweDAwMDNmZmZiCi0jZGVmaW5lIEluZE1hc2sJCQkJMHgwMDAzZmZmYwotI2VuZGlmIC8vIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQgLy8KLQotI2RlZmluZSBSeElOVAkJCQkweDAwMDAwMDA1CS8vIERlbGF5ZWQgUnggb3IgaW5kaXZpIHJ4Ci0jZGVmaW5lIFR4RGF0YUludAkJCTB4MDAwMDAwZmEJLy8gRGVsYXllZCBUeCBvciBpbmRpdmkgdHgKLSNkZWZpbmUgVHhNZ210SW50CQkJMHgwMDAwMDEwMgkvLyBEZWxheWVkIFR4IG9yIGluZGl2aSB0eAotI2RlZmluZSBUeENvaGVyZW50CQkJMHgwMDAyMDAwMAkvLyB0eCBjb2hlcmVudAotI2RlZmluZSBSeENvaGVyZW50CQkJMHgwMDAxMDAwMAkvLyByeCBjb2hlcmVudAotI2RlZmluZSBNY3VDb21tYW5kCQkJMHgwMDAwMDIwMAkvLyBtY3UKLSNkZWZpbmUgUHJlVEJUVEludAkJCTB4MDAwMDEwMDAJLy8gUHJlLVRCVFQgaW50ZXJydXB0Ci0jZGVmaW5lIFRCVFRJbnQJCQkJMHgwMDAwMDgwMAkJLy8gVEJUVCBpbnRlcnJ1cHQKLSNkZWZpbmUgR1BUaW1lT3V0SW50CQkJMHgwMDAwODAwMAkJLy8gR1B0aW1lb3V0IGludGVycnVwdAotI2RlZmluZSBBdXRvV2FrZXVwSW50CQkweDAwMDA0MDAwCQkvLyBBdXRvV2FrZXVwSW50IGludGVycnVwdAotI2RlZmluZSBGaWZvU3RhRnVsbEludAkJCTB4MDAwMDIwMDAJLy8gIGZpZm8gc3RhdGlzdGljcyBmdWxsIGludGVycnVwdAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKglSeCBQYXRoIHNvZnR3YXJlIGNvbnRyb2wgYmxvY2sgcmVsYXRlZCBkYXRhIHN0cnVjdHVyZXMKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCBfUlhfQkxLXwotewotLy8JUlhEX1NUUlVDCQlSeEQ7IC8vIHNhbXBsZQotCVJUMjhYWF9SWERfU1RSVUMJUnhEOwotCVBSWFdJX1NUUlVDCQkJcFJ4V0k7Ci0JUEhFQURFUl84MDJfMTEJCXBIZWFkZXI7Ci0JUE5ESVNfUEFDS0VUCQlwUnhQYWNrZXQ7Ci0JVUNIQVIJCQkJKnBEYXRhOwotCVVTSE9SVAkJCQlEYXRhU2l6ZTsKLQlVU0hPUlQJCQkJRmxhZ3M7Ci0JVUNIQVIJCQkJVXNlclByaW9yaXR5OwkvLyBmb3IgY2FsY3VsYXRlIFRLSVAgTUlDIHVzaW5nCi19IFJYX0JMSzsKLQotCi0jZGVmaW5lIFJYX0JMS19TRVRfRkxBRyhfcFJ4QmxrLCBfZmxhZykJCShfcFJ4QmxrLT5GbGFncyB8PSBfZmxhZykKLSNkZWZpbmUgUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBfZmxhZykJKF9wUnhCbGstPkZsYWdzICYgX2ZsYWcpCi0jZGVmaW5lIFJYX0JMS19DTEVBUl9GTEFHKF9wUnhCbGssIF9mbGFnKQkoX3BSeEJsay0+RmxhZ3MgJj0gfihfZmxhZykpCi0KLQotI2RlZmluZSBmUlhfV0RTCQkJMHgwMDAxCi0jZGVmaW5lIGZSWF9BTVNEVQkJMHgwMDAyCi0jZGVmaW5lIGZSWF9BUkFMSU5LCQkweDAwMDQKLSNkZWZpbmUgZlJYX0hUQwkJCTB4MDAwOAotI2RlZmluZSBmUlhfUEFECQkJMHgwMDEwCi0jZGVmaW5lIGZSWF9BTVBEVQkJMHgwMDIwCi0jZGVmaW5lIGZSWF9RT1MJCQkweDAwNDAKLSNkZWZpbmUgZlJYX0lORlJBCQkweDAwODAKLSNkZWZpbmUgZlJYX0VBUAkJCTB4MDEwMAotI2RlZmluZSBmUlhfTUVTSAkJMHgwMjAwCi0jZGVmaW5lIGZSWF9BUENMSQkJMHgwNDAwCi0jZGVmaW5lIGZSWF9ETFMJCQkweDA4MDAKLSNkZWZpbmUgZlJYX1dQSQkJCTB4MTAwMAotCi0jZGVmaW5lIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQJMTQKLSNkZWZpbmUgTEVOR1RIX0FSQUxJTktfU1VCRlJBTUVIRUFECTE0Ci0jZGVmaW5lIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRAkgMgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKglUeCBQYXRoIHNvZnR3YXJlIGNvbnRyb2wgYmxvY2sgcmVsYXRlZCBkYXRhIHN0cnVjdHVyZXMKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFRYX1VOS09XTl9GUkFNRQkJMHgwMAotI2RlZmluZSBUWF9NQ0FTVF9GUkFNRQkJCTB4MDEKLSNkZWZpbmUgVFhfTEVHQUNZX0ZSQU1FCQkweDAyCi0jZGVmaW5lIFRYX0FNUERVX0ZSQU1FCQkweDA0Ci0jZGVmaW5lIFRYX0FNU0RVX0ZSQU1FCQkweDA4Ci0jZGVmaW5lIFRYX1JBTElOS19GUkFNRQkJMHgxMAotI2RlZmluZSBUWF9GUkFHX0ZSQU1FCQkJMHgyMAotCi0KLS8vCUN1cnJlbnRseSB0aGUgc2l6ZW9mKFRYX0JMSykgaXMgMTQ4IGJ5dGVzLgotdHlwZWRlZiBzdHJ1Y3QgX1RYX0JMS18KLXsKLQlVQ0hBUgkJCQlRdWVJZHg7Ci0JVUNIQVIJCQkJVHhGcmFtZVR5cGU7CQkJCS8vIEluZGljYXRlIHRoZSBUcmFuc21pc3Npb24gdHlwZSBvZiB0aGUgYWxsIGZyYW1lcyBpbiBvbmUgYmF0Y2gKLQlVQ0hBUgkJCQlUb3RhbEZyYW1lTnVtOwkJCQkvLyBUb3RhbCBmcmFtZSBudW1iZXIgd2FudCB0byBzZW5kLW91dCBpbiBvbmUgYmF0Y2gKLQlVU0hPUlQJCQkJVG90YWxGcmFnTnVtOwkJCQkvLyBUb3RhbCBmcmFtZSBmcmFnbWVudHMgcmVxdWlyZWQgaW4gb25lIGJhdGNoCi0JVVNIT1JUCQkJCVRvdGFsRnJhbWVMZW47CQkJCS8vIFRvdGFsIGxlbmd0aCBvZiBhbGwgZnJhbWVzIHdhbnQgdG8gc2VuZC1vdXQgaW4gb25lIGJhdGNoCi0KLQlRVUVVRV9IRUFERVIJCVR4UGFja2V0TGlzdDsKLQlNQUNfVEFCTEVfRU5UUlkJCSpwTWFjRW50cnk7CQkJCQkvLyBOVUxMOiBwYWNrZXQgd2l0aCA4MDIuMTEgUkEgZmllbGQgaXMgbXVsdGljYXN0L2Jyb2FkY2FzdCBhZGRyZXNzCi0JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQ7Ci0KLQkvLyBGb2xsb3dpbmcgc3RydWN0dXJlIHVzZWQgZm9yIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBzcGVjaWZpYyBwYWNrZXQuCi0JUE5ESVNfUEFDS0VUCQlwUGFja2V0OwotCVBVQ0hBUgkJCQlwU3JjQnVmSGVhZGVyOwkJCQkvLyBSZWZlcmVuY2UgdG8gdGhlIGhlYWQgb2Ygc2tfYnVmZi0+ZGF0YQotCVBVQ0hBUgkJCQlwU3JjQnVmRGF0YTsJCQkJLy8gUmVmZXJlbmNlIHRvIHRoZSBza19idWZmLT5kYXRhLCB3aWxsIGNoYW5nZWQgZGVwZW5kcyBvbiBoYW5sZGluZyBwcm9ncmVzc3MKLQlVSU5UCQkJCVNyY0J1ZkxlbjsJCQkJCS8vIExlbmd0aCBvZiBwYWNrZXQgcGF5bG9hZCB3aGljaCBub3QgaW5jbHVkaW5nIExheWVyIDIgaGVhZGVyCi0JUFVDSEFSCQkJCXBFeHRyYUxsY1NuYXBFbmNhcDsJCQkvLyBOVUxMIG1lYW5zIG5vIGV4dHJhIExMQy9TTkFQIGlzIHJlcXVpcmVkCi0JVUNIQVIJCQkJSGVhZGVyQnVmWzk2XTsJCQkJLy8gVGVtcEJ1ZmZlciBmb3IgVFhfSU5GTyArIFRYX1dJICsgODAyLjExIEhlYWRlciArIHBhZGRpbmcgKyBBTVNEVSBTdWJIZWFkZXIgKyBMTEMvU05BUAotCVVDSEFSCQkJCU1wZHVIZWFkZXJMZW47CQkJCS8vIDgwMi4xMSBoZWFkZXIgbGVuZ3RoIE5PVCBpbmNsdWRpbmcgdGhlIHBhZGRpbmcKLQlVQ0hBUgkJCQlIZHJQYWRMZW47CQkJCQkvLyByZWNvcmRpbmcgSGVhZGVyIFBhZGRpbmcgTGVuZ3RoOwotCVVDSEFSCQkJCWFwaWR4OwkJCQkJCS8vIFRoZSBpbnRlcmZhY2UgYXNzb2NpYXRlZCB0byB0aGlzIHBhY2tldAotCVVDSEFSCQkJCVdjaWQ7CQkJCQkJLy8gVGhlIE1BQyBlbnRyeSBhc3NvY2lhdGVkIHRvIHRoaXMgcGFja2V0Ci0JVUNIQVIJCQkJVXNlclByaW9yaXR5OwkJCQkvLyBwcmlvcml0eSBjbGFzcyBvZiBwYWNrZXQKLQlVQ0hBUgkJCQlGcmFtZUdhcDsJCQkJCS8vIHdoYXQga2luZCBvZiBJRlMgdGhpcyBwYWNrZXQgdXNlCi0JVUNIQVIJCQkJTXBkdVJlcU51bTsJCQkJCS8vIG51bWJlciBvZiBmcmFnbWVudHMgb2YgdGhpcyBmcmFtZQotCVVDSEFSCQkJCVR4UmF0ZTsJCQkJCQkvLyBUT0RPOiBPYnNvbGV0ZWQ/IFNob3VsZCBjaGFuZ2UgdG8gTUNTPwotCVVDSEFSCQkJCUNpcGhlckFsZzsJCQkJCS8vIGNpcGhlciBhbG9ncml0aG0KLQlQQ0lQSEVSX0tFWQkJCXBLZXk7Ci0KLQotCi0JVVNIT1JUCQkJCUZsYWdzOwkJCQkJCS8vU2VlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBmb3IgZGV0YWlsLgotCi0JLy9ZT1UgU0hPVUxEIE5PVCBUT1VDSCBJVCEgRm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHVzZWQgZm9yIGhhcmR3YXJlLWRlcGVuZGVkIGxheWVyLgotCVVMT05HCQkJCVByaXY7CQkJCQkJLy8gSGFyZHdhcmUgc3BlY2lmaWMgdmFsdWUgc2F2ZWQgaW4gaGVyZS4KLQotfSBUWF9CTEssICpQVFhfQkxLOwotCi0KLSNkZWZpbmUgZlRYX2JSdHNSZXF1aXJlZAkJCTB4MDAwMQkvLyBJbmRpY2F0ZSBpZiBuZWVkIHNlbmQgUlRTIGZyYW1lIGZvciBwcm90ZWN0aW9uLiBOb3QgdXNlZCBpbiBSVDI4NjAvUlQyODcwLgotI2RlZmluZSBmVFhfYkFja1JlcXVpcmVkCQkJMHgwMDAyCS8vIHRoZSBwYWNrZXQgbmVlZCBhY2sgcmVzcG9uc2UKLSNkZWZpbmUgZlRYX2JQaWdneUJhY2sJCQkweDAwMDQJLy8gTGVnYWN5IGRldmljZSB1c2UgUGlnZ2JhY2sgb3Igbm90Ci0jZGVmaW5lIGZUWF9iSFRSYXRlCQkJCTB4MDAwOAkvLyBhbGxvdyB0byB1c2UgSFQgcmF0ZQotI2RlZmluZSBmVFhfYkZvcmNlTm9uUW9TCQkweDAwMTAJLy8gZm9yY2UgdG8gdHJhbnNtaXQgZnJhbWUgd2l0aG91dCBXTU0tUW9TIGluIEhUIG1vZGUKLSNkZWZpbmUgZlRYX2JBbGxvd0ZyYWcJCQkweDAwMjAJLy8gYWxsb3cgdG8gZnJhZ21lbnQgdGhlIHBhY2tldCwgQS1NUERVLCBBLU1TRFUsIEEtUmFsaW5rIGlzIG5vdCBhbGxvd2VkIHRvIGZyYWdtZW50Ci0jZGVmaW5lIGZUWF9iTW9yZURhdGEJCQkweDAwNDAJLy8gdGhlcmUgYXJlIG1vcmUgZGF0YSBwYWNrZXRzIGluIFBvd2VyU2F2ZSBRdWV1ZQotI2RlZmluZSBmVFhfYldNTQkJCQkweDAwODAJLy8gUU9TIERhdGEKLSNkZWZpbmUgZlRYX2JDbGVhckVBUEZyYW1lCQkweDAxMDAKLQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0KLQotI2RlZmluZSBUWF9CTEtfU0VUX0ZMQUcoX3BUeEJsaywgX2ZsYWcpCQkoX3BUeEJsay0+RmxhZ3MgfD0gX2ZsYWcpCi0jZGVmaW5lIFRYX0JMS19URVNUX0ZMQUcoX3BUeEJsaywgX2ZsYWcpCSgoKF9wVHhCbGstPkZsYWdzICYgX2ZsYWcpID09IF9mbGFnKSA/IDEgOiAwKQotI2RlZmluZSBUWF9CTEtfQ0xFQVJfRkxBRyhfcFR4QmxrLCBfZmxhZykJKF9wVHhCbGstPkZsYWdzICY9IH4oX2ZsYWcpKQotCi0KLQotCi0jaWZkZWYgUlRfQklHX0VORElBTgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCUVuZGlhbiBjb252ZXJzaW9uIHJlbGF0ZWQgZnVuY3Rpb25zCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUVuZGlhbiBjb252ZXJzaW9uIG9mIFR4L1J4IGRlc2NyaXB0b3IgLgotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwRGF0YQkJCVBvaW50ZXIgdG8gVHgvUnggZGVzY3JpcHRvcgotCQlEZXNjcmlwdG9yVHlwZQlEaXJlY3Rpb24gb2YgdGhlIGZyYW1lCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0JCUNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHJlYWQgb3IgdXBkYXRlIGRlc2NyaXB0b3IKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgaW5saW5lIFZPSUQJUlRNUFdJRW5kaWFuQ2hhbmdlKAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGVzY3JpcHRvclR5cGUpCi17Ci0JaW50IHNpemU7Ci0JaW50IGk7Ci0KLQlzaXplID0gKChEZXNjcmlwdG9yVHlwZSA9PSBUWVBFX1RYV0kpID8gVFhXSV9TSVpFIDogUlhXSV9TSVpFKTsKLQotCWlmKERlc2NyaXB0b3JUeXBlID09IFRZUEVfVFhXSSkKLQl7Ci0JCSooKFVJTlQzMiAqKShwRGF0YSkpID0gU1dBUDMyKCooKFVJTlQzMiAqKShwRGF0YSkpKTsJCS8vIEJ5dGUgMH4zCi0JCSooKFVJTlQzMiAqKShwRGF0YSArIDQpKSA9IFNXQVAzMigqKChVSU5UMzIgKikocERhdGErNCkpKTsJLy8gQnl0ZSA0fjcKLQl9Ci0JZWxzZQotCXsKLQkJZm9yKGk9MDsgaSA8IHNpemUvNCA7IGkrKykKLQkJCSooKChVSU5UMzIgKilwRGF0YSkgK2kpID0gU1dBUDMyKCooKChVSU5UMzIgKilwRGF0YSkraSkpOwotCX0KLX0KLQotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi1zdGF0aWMgaW5saW5lIFZPSUQJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKAotCUlOICBQVUNIQVIJCQlEZXN0LAotCUlOCVBVQ0hBUgkJCVNyYywKLSAgICBJTiAgQk9PTEVBTgkJCURvRW5jcnlwdCwKLQlJTiAgVUxPTkcgICAgICAgICAgIERlc2NyaXB0b3JUeXBlKQotewotCVVJTlQzMiAqcDEsICpwMjsKLQotCXAxID0gKChVSU5UMzIgKilEZXN0KTsKLQlwMiA9ICgoVUlOVDMyICopU3JjKTsKLQotCSpwMSA9ICpwMjsKLQkqKHAxKzIpID0gKihwMisyKTsKLQkqKHAxKzMpID0gKihwMiszKTsKLQkqKHAxKzEpID0gKihwMisxKTsgLy8gV29yZCAxOyB0aGlzIG11c3QgYmUgd3JpdHRlbiBiYWNrIGxhc3QKLX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJRW5kaWFuIGNvbnZlcnNpb24gb2YgVHgvUnggZGVzY3JpcHRvciAuCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBEYXRhCQkJUG9pbnRlciB0byBUeC9SeCBkZXNjcmlwdG9yCi0JCURlc2NyaXB0b3JUeXBlCURpcmVjdGlvbiBvZiB0aGUgZnJhbWUKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQkJQ2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gcmVhZCBvciB1cGRhdGUgZGVzY3JpcHRvcgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLXN0YXRpYyBpbmxpbmUgVk9JRAlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURlc2NyaXB0b3JUeXBlKQotewotCSooKFVJTlQzMiAqKShwRGF0YSkpID0gU1dBUDMyKCooKFVJTlQzMiAqKShwRGF0YSkpKTsJCS8vIEJ5dGUgMH4zCi0JKigoVUlOVDMyICopKHBEYXRhICsgOCkpID0gU1dBUDMyKCooKFVJTlQzMiAqKShwRGF0YSs4KSkpOwkvLyBCeXRlIDh+MTEKLQkqKChVSU5UMzIgKikocERhdGEgKzEyKSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhICsgMTIpKSk7CS8vIEJ5dGUgMTJ+MTUKLQkqKChVSU5UMzIgKikocERhdGEgKyA0KSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhICsgNCkpKTsJCQkJLy8gQnl0ZSA0fjcsIHRoaXMgbXVzdCBiZSBzd2FwcGVkIGxhc3QKLX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUVuZGlhbiBjb252ZXJzaW9uIG9mIGFsbCBraW5kcyBvZiA4MDIuMTEgZnJhbWVzIC4KLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcERhdGEJCQlQb2ludGVyIHRvIHRoZSA4MDIuMTEgZnJhbWUgc3RydWN0dXJlCi0JCURpcgkJCURpcmVjdGlvbiBvZiB0aGUgZnJhbWUKLQkJRnJvbVJ4RG9uZUludAlDYWxsZXIgaXMgZnJvbSBSeERvbmUgaW50ZXJydXB0Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0JCUNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHJlYWQgb3IgdXBkYXRlIGJ1ZmZlciBkYXRhCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIGlubGluZSBWT0lECVJUTVBGcmFtZUVuZGlhbkNoYW5nZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURpciwKLQlJTglCT09MRUFOCQkJRnJvbVJ4RG9uZUludCkKLXsKLQlQSEVBREVSXzgwMl8xMSBwRnJhbWU7Ci0JUFVDSEFSCXBNYWNIZHI7Ci0KLQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBGcmFtZSBDb250cm9sIGZpZWxkCi0JaWYoRGlyID09IERJUl9SRUFEKQotCXsKLQkJKihVU0hPUlQgKilwRGF0YSA9IFNXQVAxNigqKFVTSE9SVCAqKXBEYXRhKTsKLQl9Ci0KLQlwRnJhbWUgPSAoUEhFQURFUl84MDJfMTEpIHBEYXRhOwotCXBNYWNIZHIgPSAoUFVDSEFSKSBwRnJhbWU7Ci0KLQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBEdXJhdGlvbi9JRCBmaWVsZAotCSooVVNIT1JUICopKHBNYWNIZHIgKyAyKSA9IFNXQVAxNigqKFVTSE9SVCAqKShwTWFjSGRyICsgMikpOwotCi0JLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gU2VxdWVuY2UgQ29udHJvbCBmaWVsZAotCSooVVNIT1JUICopKHBNYWNIZHIgKyAyMikgPSBTV0FQMTYoKihVU0hPUlQgKikocE1hY0hkciArIDIyKSk7Ci0KLQlpZihwRnJhbWUtPkZDLlR5cGUgPT0gQlRZUEVfTUdNVCkKLQl7Ci0JCXN3aXRjaChwRnJhbWUtPkZDLlN1YlR5cGUpCi0JCXsKLQkJCWNhc2UgU1VCVFlQRV9BU1NPQ19SRVE6Ci0JCQljYXNlIFNVQlRZUEVfUkVBU1NPQ19SRVE6Ci0JCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQ2FwYWJpbGl0eUluZm8gZmllbGQKLQkJCQlwTWFjSGRyICs9IHNpemVvZihIRUFERVJfODAyXzExKTsKLQkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKLQotCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIExpc3RlbiBJbnRlcnZhbCBmaWVsZAotCQkJCXBNYWNIZHIgKz0gMjsKLQkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVUJUWVBFX0FTU09DX1JTUDoKLQkJCWNhc2UgU1VCVFlQRV9SRUFTU09DX1JTUDoKLQkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBDYXBhYmlsaXR5SW5mbyBmaWVsZAotCQkJCXBNYWNIZHIgKz0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOwotCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOwotCi0JCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gU3RhdHVzIENvZGUgZmllbGQKLQkJCQlwTWFjSGRyICs9IDI7Ci0JCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7Ci0KLQkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBBSUQgZmllbGQKLQkJCQlwTWFjSGRyICs9IDI7Ci0JCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1VCVFlQRV9BVVRIOgotCQkJCS8vIElmIGZyb20gQVBIYW5kbGVSeERvbmVJbnRlcnJ1cHQgcm91dGluZSwgaXQgaXMgc3RpbGwgYSBlbmNyeXB0IGZvcm1hdC4KLQkJCQkvLyBUaGUgY29udmVydGlvbiBpcyBkZWxheWVkIHRvIFJUTVBIYW5kbGVEZWNyeXB0aW9uRG9uZUludGVycnVwdC4KLQkJCQlpZighRnJvbVJ4RG9uZUludCAmJiBwRnJhbWUtPkZDLldlcCA9PSAxKQotCQkJCQlicmVhazsKLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBBdXRoIEFsZyBOby4gZmllbGQKLQkJCQkJcE1hY0hkciArPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0JCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOwotCi0JCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEF1dGggU2VxIE5vLiBmaWVsZAotCQkJCQlwTWFjSGRyICs9IDI7Ci0JCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOwotCi0JCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIFN0YXR1cyBDb2RlIGZpZWxkCi0JCQkJCXBNYWNIZHIgKz0gMjsKLQkJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNVQlRZUEVfQkVBQ09OOgotCQkJY2FzZSBTVUJUWVBFX1BST0JFX1JTUDoKLQkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBCZWFjb25JbnRlcnZhbCBmaWVsZAotCQkJCXBNYWNIZHIgKz0gKHNpemVvZihIRUFERVJfODAyXzExKSArIFRJTUVTVEFNUF9MRU4pOwotCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOwotCi0JCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQ2FwYWJpbGl0eUluZm8gZmllbGQKLQkJCQlwTWFjSGRyICs9IHNpemVvZihVU0hPUlQpOwotCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNVQlRZUEVfREVBVVRIOgotCQkJY2FzZSBTVUJUWVBFX0RJU0FTU09DOgotCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIFJlYXNvbiBjb2RlIGZpZWxkCi0JCQkJcE1hY0hkciArPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0JCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZWxzZSBpZiggcEZyYW1lLT5GQy5UeXBlID09IEJUWVBFX0RBVEEgKQotCXsKLQl9Ci0JZWxzZSBpZihwRnJhbWUtPkZDLlR5cGUgPT0gQlRZUEVfQ05UTCkKLQl7Ci0JCXN3aXRjaChwRnJhbWUtPkZDLlN1YlR5cGUpCi0JCXsKLQkJCWNhc2UgU1VCVFlQRV9CTE9DS19BQ0tfUkVROgotCQkJCXsKLQkJCQkJUEZSQU1FX0JBX1JFUSBwQkFSZXEgPSAoUEZSQU1FX0JBX1JFUSlwRnJhbWU7Ci0JCQkJCSooVVNIT1JUICopKCZwQkFSZXEtPkJBUkNvbnRyb2wpID0gU1dBUDE2KCooVVNIT1JUICopKCZwQkFSZXEtPkJBUkNvbnRyb2wpKTsKLQkJCQkJcEJBUmVxLT5CQVN0YXJ0aW5nU2VxLndvcmQgPSBTV0FQMTYocEJBUmVxLT5CQVN0YXJ0aW5nU2VxLndvcmQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgU1VCVFlQRV9CTE9DS19BQ0s6Ci0JCQkJLy8gRm9yIEJsb2NrIEFjayBwYWNrZXQsIHRoZSBIVF9DT05UUk9MIGZpZWxkIGlzIGluIHRoZSBzYW1lIG9mZnNldCB3aXRoIEFkZHIzCi0JCQkJKihVSU5UMzIgKikoJnBGcmFtZS0+QWRkcjNbMF0pID0gU1dBUDMyKCooVUlOVDMyICopKCZwRnJhbWUtPkFkZHIzWzBdKSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1VCVFlQRV9BQ0s6Ci0JCQkJLy9Gb3IgQUNLIHBhY2tldCwgdGhlIEhUX0NPTlRST0wgZmllbGQgaXMgaW4gdGhlIHNhbWUgb2Zmc2V0IHdpdGggQWRkcjIKLQkJCQkqKFVJTlQzMiAqKSgmcEZyYW1lLT5BZGRyMlswXSk9CVNXQVAzMigqKFVJTlQzMiAqKSgmcEZyYW1lLT5BZGRyMlswXSkpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiSW52YWxpZCBGcmFtZSBUeXBlISEhXG4iKSk7Ci0JfQotCi0JLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gRnJhbWUgQ29udHJvbAotCWlmKERpciA9PSBESVJfV1JJVEUpCi0JewotCQkqKFVTSE9SVCAqKXBEYXRhID0gU1dBUDE2KCooVVNIT1JUICopcERhdGEpOwotCX0KLX0KLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCU90aGVyIHN0YXRpYyBpbmxpbmUgZnVuY3Rpb24gZGVmaW5pdGlvbnMKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW5saW5lIFZPSUQgQ29udmVydE11bHRpY2FzdElQMk1BQygKLQlJTiBQVUNIQVIgcElwQWRkciwKLQlJTiBQVUNIQVIgKnBwTWFjQWRkciwKLQlJTiBVSU5UMTYgUHJvdG9UeXBlKQotewotCWlmIChwSXBBZGRyID09IE5VTEwpCi0JCXJldHVybjsKLQotCWlmIChwcE1hY0FkZHIgPT0gTlVMTCB8fCAqcHBNYWNBZGRyID09IE5VTEwpCi0JCXJldHVybjsKLQotCXN3aXRjaCAoUHJvdG9UeXBlKQotCXsKLQkJY2FzZSBFVEhfUF9JUFY2OgotLy8JCQltZW1zZXQoKnBwTWFjQWRkciwgMCwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKLQkJCSooKnBwTWFjQWRkcikgPSAweDMzOwotCQkJKigqcHBNYWNBZGRyICsgMSkgPSAweDMzOwotCQkJKigqcHBNYWNBZGRyICsgMikgPSBwSXBBZGRyWzEyXTsKLQkJCSooKnBwTWFjQWRkciArIDMpID0gcElwQWRkclsxM107Ci0JCQkqKCpwcE1hY0FkZHIgKyA0KSA9IHBJcEFkZHJbMTRdOwotCQkJKigqcHBNYWNBZGRyICsgNSkgPSBwSXBBZGRyWzE1XTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgRVRIX1BfSVA6Ci0JCWRlZmF1bHQ6Ci0vLwkJCW1lbXNldCgqcHBNYWNBZGRyLCAwLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOwotCQkJKigqcHBNYWNBZGRyKSA9IDB4MDE7Ci0JCQkqKCpwcE1hY0FkZHIgKyAxKSA9IDB4MDA7Ci0JCQkqKCpwcE1hY0FkZHIgKyAyKSA9IDB4NWU7Ci0JCQkqKCpwcE1hY0FkZHIgKyAzKSA9IHBJcEFkZHJbMV0gJiAweDdmOwotCQkJKigqcHBNYWNBZGRyICsgNCkgPSBwSXBBZGRyWzJdOwotCQkJKigqcHBNYWNBZGRyICsgNSkgPSBwSXBBZGRyWzNdOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0KLWNoYXIgKkdldFBoeU1vZGUoaW50IE1vZGUpOwotY2hhciogR2V0QlcoaW50IEJXKTsKLQotCi0KLUJPT0xFQU4gUlRNUENoZWNrRm9ySGFuZygKLQlJTiAgTkRJU19IQU5ETEUgTWluaXBvcnRBZGFwdGVyQ29udGV4dCk7Ci0KLVZPSUQgIFJUTVBIYWx0KAotCUlOICBORElTX0hBTkRMRSBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0KTsKLQotLy8KLS8vICBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfaW5pdC5jCi0vLwotTkRJU19TVEFUVVMgUlRNUEFsbG9jQWRhcHRlckJsb2NrKAotCUlOIFBWT0lECQkJaGFuZGxlLAotCU9VVCBQUlRNUF9BREFQVEVSICAgKnBwQWRhcHRlcik7Ci0KLU5ESVNfU1RBVFVTIFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotTkRJU19TVEFUVVMgUlRNUEZpbmRBZGFwdGVyKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBORElTX0hBTkRMRSAgICAgV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLQotTkRJU19TVEFUVVMJUlRNUFJlYWRQYXJhbWV0ZXJzSG9vaygKLQlJTglQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLU5ESVNfU1RBVFVTCVJUTVBTZXRQcm9maWxlUGFyYW1ldGVycygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBQU1RSSU5HCQlwQnVmZmVyKTsKLQotSU5UIFJUTVBHZXRLZXlQYXJhbWV0ZXIoCi0gICAgSU4gUFNUUklORyBrZXksCi0gICAgT1VUIFBTVFJJTkcgZGVzdCwKLSAgICBJTiBJTlQgZGVzdHNpemUsCi0gICAgSU4gUFNUUklORyBidWZmZXIsCi0gICAgSU4gQk9PTEVBTiBiVHJpbVNwYWNlKTsKLQotVk9JRCBSVE1QRnJlZUFkYXB0ZXIoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1ORElTX1NUQVRVUyBOSUNSZWFkUmVnUGFyYW1ldGVycygKLQlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCi0JSU4gIE5ESVNfSEFORExFICAgICAgICAgV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLQotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotVk9JRCBOSUNJbml0UkZSZWdpc3RlcnMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIFJ0bXBDaGlwT3BzUkZIb29rKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKLQotTkRJU19TVEFUVVMJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJcmVnSUQsCi0JSU4JVUNIQVIJCQl2YWx1ZSk7Ci0KLU5ESVNfU1RBVFVTCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJcmVnSUQsCi0JSU4JUFVDSEFSCQkJcFZhbHVlKTsKLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQotVk9JRCBOSUNSZWFkRUVQUk9NUGFyYW1ldGVycygKLQlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCi0JSU4JUFVDSEFSCQkJCW1hY19hZGRyKTsKLQotVk9JRCBOSUNJbml0QXNpY0Zyb21FRVBST00oCi0JSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkKTsKLQotCi1ORElTX1NUQVRVUyBOSUNJbml0aWFsaXplQWRhcHRlcigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgIEJPT0xFQU4gICAgYkhhcmRSZXNldCk7Ci0KLU5ESVNfU1RBVFVTIE5JQ0luaXRpYWxpemVBc2ljKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBCT09MRUFOCQliSGFyZFJlc2V0KTsKLQotVk9JRCBOSUNJc3N1ZVJlc2V0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBSVE1QUmluZ0NsZWFuVXAoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBSaW5nVHlwZSk7Ci0KLVZPSUQgUnhUZXN0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotTkRJU19TVEFUVVMgRGJnU2VuZFBhY2tldCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOwotCi1WT0lEIFVzZXJDZmdJbml0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBOSUNSZXNldEZyb21FcnJvcigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLU5ESVNfU1RBVFVTIE5JQ0xvYWRGaXJtd2FyZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgTklDRXJhc2VGaXJtd2FyZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLU5ESVNfU1RBVFVTIE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotQk9PTEVBTiBOSUNDaGVja0ZvckhhbmcoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIE5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgTklDVXBkYXRlUmF3Q291bnRlcnMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIFJUTVBaZXJvTWVtb3J5KAotCUlOICBQVk9JRCAgIHBTcmMsCi0JSU4gIFVMT05HICAgTGVuZ3RoKTsKLQotVUxPTkcgUlRNUENvbXBhcmVNZW1vcnkoCi0JSU4gIFBWT0lEICAgcFNyYzEsCi0JSU4gIFBWT0lEICAgcFNyYzIsCi0JSU4gIFVMT05HICAgTGVuZ3RoKTsKLQotVk9JRCBSVE1QTW92ZU1lbW9yeSgKLQlPVVQgUFZPSUQgICBwRGVzdCwKLQlJTiAgUFZPSUQgICBwU3JjLAotCUlOICBVTE9ORyAgIExlbmd0aCk7Ci0KLVZPSUQgQXRvSCgKLQlQU1RSSU5HCXNyYywKLQlQVUNIQVIgZGVzdCwKLQlpbnQJCWRlc3RsZW4pOwotCi1VQ0hBUiBCdG9IKAotCWNoYXIgY2gpOwotCi1WT0lEIFJUTVBQYXRjaE1hY0JicEJ1ZygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgUlRNUFBhdGNoQ2FyZEJ1cygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyKTsKLQotVk9JRCBSVE1QUGF0Y2hSYWxpbmtDYXJkQnVzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4JVUxPTkcJCQlCdXMpOwotCi1VTE9ORyBSVE1QUmVhZENCQ29uZmlnKAotCUlOCVVMT05HCUJ1cywKLQlJTglVTE9ORwlTbG90LAotCUlOCVVMT05HCUZ1bmMsCi0JSU4JVUxPTkcJT2Zmc2V0KTsKLQotVk9JRCBSVE1QV3JpdGVDQkNvbmZpZygKLQlJTglVTE9ORwlCdXMsCi0JSU4JVUxPTkcJU2xvdCwKLQlJTglVTE9ORwlGdW5jLAotCUlOCVVMT05HCU9mZnNldCwKLQlJTglVTE9ORwlWYWx1ZSk7Ci0KLVZPSUQgUlRNUEluaXRUaW1lcigKLQlJTiAgUFJUTVBfQURBUFRFUiAgICAgICAgICAgcEFkLAotCUlOICBQUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBwVGltZXIsCi0JSU4gIFBWT0lEICAgICAgICAgICAgICAgICAgIHBUaW1lckZ1bmMsCi0JSU4JUFZPSUQJCQkJCXBEYXRhLAotCUlOICBCT09MRUFOICAgICAgICAgICAgICAgICBSZXBlYXQpOwotCi1WT0lEIFJUTVBTZXRUaW1lcigKLQlJTiAgUFJBTElOS19USU1FUl9TVFJVQ1QgICAgcFRpbWVyLAotCUlOICBVTE9ORyAgICAgICAgICAgICAgICAgICBWYWx1ZSk7Ci0KLQotVk9JRCBSVE1QTW9kVGltZXIoCi0JSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAotCUlOCVVMT05HCQkJCQlWYWx1ZSk7Ci0KLVZPSUQgUlRNUENhbmNlbFRpbWVyKAotCUlOICBQUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBwVGltZXIsCi0JT1VUIEJPT0xFQU4gICAgICAgICAgICAgICAgICpwQ2FuY2VsbGVkKTsKLQotVk9JRCBSVE1QU2V0TEVEKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJU3RhdHVzKTsKLQotVk9JRCBSVE1QU2V0U2lnbmFsTEVEKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE5ESVNfODAyXzExX1JTU0kgRGJtKTsKLQotCi1WT0lEIFJUTVBFbmFibGVSeFR4KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotLy8KLS8vIHByb3RvdHlwZSBpbiBhY3Rpb24uYwotLy8KLVZPSUQgQWN0aW9uU3RhdGVNYWNoaW5lSW5pdCgKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLSAgICBJTiAgU1RBVEVfTUFDSElORSAqUywKLSAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwotCi1WT0lEIE1sbWVBRERCQUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIE1sbWVERUxCQUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIE1sbWVETFNBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBNbG1lSW52YWxpZEFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIE1sbWVRT1NBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVk9JRCBQZWVyQWRkQkFSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyQWRkQkFSc3BBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyRGVsQkFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyQkFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotVk9JRCBTZW5kUFNNUEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVQ0hBUgkJCVdjaWQsCi0JSU4gVUNIQVIJCQlQc21wKTsKLQotCi1WT0lEIFBlZXJSTUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJQdWJsaWNBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotVk9JRCBTdGFQdWJsaWNBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgQnNzMjA0MENvZXhpc3QpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLVZPSUQgUGVlckJTU1RyYW5BY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVk9JRCBQZWVySFRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotVk9JRCBQZWVyUU9TQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLVZPSUQgUGVlckRMU0FjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi1WT0lEIERsc1Bhcm1GaWxsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE9VVCBNTE1FX0RMU19SRVFfU1RSVUNUICpwRGxzUmVxLAotCUlOIFBSVF84MDJfMTFfRExTIHBEbHMsCi0JSU4gVVNIT1JUIHJlYXNvbik7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLVZPSUQgUkVDQkFUaW1lclRpbWVvdXQoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBPUklCQVRpbWVyVGltZW91dCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgU2VuZFJlZnJlc2hCQVIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnkpOwotCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotVk9JRCBTZW5kQlNTMjA0MENvZXhpc3RNZ210QWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCVdjaWQsCi0JSU4JVUNIQVIJYXBpZHgsCi0JSU4JVUNIQVIJSW5mb1JlcSk7Ci0KLVZPSUQgU2VuZE5vdGlmeUJXQWN0aW9uRnJhbWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgIFdjaWQsCi0JSU4gVUNIQVIgYXBpZHgpOwotCi1CT09MRUFOIENoYW5uZWxTd2l0Y2hTYW5pdHlDaGVjaygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgICBVQ0hBUiAgV2NpZCwKLQlJTiAgICBVQ0hBUiAgTmV3Q2hhbm5lbCwKLQlJTiAgICBVQ0hBUiAgU2Vjb25kYXJ5KTsKLQotVk9JRCBDaGFubmVsU3dpdGNoQWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgIFVDSEFSICBXY2lkLAotCUlOICAgIFVDSEFSICBDaGFubmVsLAotCUlOICAgIFVDSEFSICBTZWNvbmRhcnkpOwotCi1VTE9ORyBCdWlsZEludG9sZXJhbnRDaGFubmVsUmVwKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgIFBVQ0hBUiAgcERlc3QpOwotCi1WT0lEIFVwZGF0ZTIwNDBDb2V4aXN0RnJhbWVBbmROb3RpZnkoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gICAgVUNIQVIgIFdjaWQsCi0JSU4JQk9PTEVBTgliQWRkSW50b2xlcmFudENoYSk7Ci0KLVZPSUQgU2VuZDIwNDBDb2V4aXN0QWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgIFVDSEFSICBXY2lkLAotCUlOCUJPT0xFQU4JYkFkZEludG9sZXJhbnRDaGEpOwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotVk9JRCBBY3RIZWFkZXJJbml0KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCi0gICAgSU4gUFVDSEFSIEFkZHIxLAotICAgIElOIFBVQ0hBUiBBZGRyMiwKLSAgICBJTiBQVUNIQVIgQWRkcjMpOwotCi1WT0lEIEJhckhlYWRlckluaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gT1VUIFBGUkFNRV9CQVIgcENudGxCYXIsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBQVUNIQVIgcFNBKTsKLQotVk9JRCBJbnNlcnRBY3RGaWVsZCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBDYXRlZ29yeSwKLQlJTiBVSU5UOCBBY3RDb2RlKTsKLQotQk9PTEVBTiBRb3NCQURhdGFQYXJzZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBCT09MRUFOIGJBTVNEVSwKLQlJTiBQVUNIQVIgcDgwMjNIZWFkZXIsCi0JSU4gVUNIQVIJV0NJRCwKLQlJTiBVQ0hBUglUSUQsCi0JSU4gVVNIT1JUIFNlcXVlbmNlLAotCUlOIFVDSEFSIERhdGFPZmZzZXQsCi0JSU4gVVNIT1JUIERhdGFzaXplLAotCUlOIFVJTlQgICBDdXJSeEluZGV4KTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotQk9PTEVBTiBDbnRsRW5xdWV1ZUZvclJlY3YoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUxPTkcgV2NpZCwKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0JSU4gUEZSQU1FX0JBX1JFUSBwTXNnKTsKLQotVk9JRCBCYUF1dG9NYW5Td2l0Y2goCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1WT0lEIEhUSU9UQ2hlY2soCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gICAgVUNIQVIgICAgIEJhdFJlY0lkeCk7Ci0KLS8vCi0vLyBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfZGF0YS5jCi0vLwotQk9PTEVBTiBSVE1QSGFuZGxlUnhEb25lSW50ZXJydXB0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBSVE1QSGFuZGxlVHhEb25lSW50ZXJydXB0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotQk9PTEVBTiBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgSU5UX1NPVVJDRV9DU1JfU1RSVUMgVHhSaW5nQml0bWFwKTsKLQotVk9JRCBSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBSVE1QSGFuZGxlVEJUVEludGVycnVwdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi12b2lkIFJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRAlSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLQotQk9PTEVBTiBUeEZyYW1lSXNBZ2dyZWdhdGlibGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwUHJldkFkZHIxLAotCUlOICBQVUNIQVIgICAgICAgICAgcDgwMjNoZHIpOwotCi1CT09MRUFOIFBlZXJJc0FnZ3JlT24oCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFVMT05HICAgICAgICAgIFR4UmF0ZSwKLSAgICBJTiAgUE1BQ19UQUJMRV9FTlRSWSBwTWFjRW50cnkpOwotCi0KLU5ESVNfU1RBVFVTIFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoCi0JSU4gIFBORElTX0JVRkZFUiAgICBwRmlyc3RCdWZmZXIsCi0JSU4gIFVDSEFSICAgICAgICAgICBEZXNpcmVkT2Zmc2V0LAotCU9VVCBQVUNIQVIgICAgICAgICAgcEJ5dGUwLAotCU9VVCBQVUNIQVIgICAgICAgICAgcEJ5dGUxKTsKLQotTkRJU19TVEFUVVMgU1RBU2VuZFBhY2tldCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOwotCi1WT0lEIFNUQVNlbmRQYWNrZXRzKAotCUlOICBORElTX0hBTkRMRSAgICAgTWluaXBvcnRBZGFwdGVyQ29udGV4dCwKLQlJTiAgUFBORElTX1BBQ0tFVCAgIHBwUGFja2V0QXJyYXksCi0JSU4gIFVJTlQgICAgICAgICAgICBOdW1iZXJPZlBhY2tldHMpOwotCi1WT0lEIFJUTVBEZVF1ZXVlUGFja2V0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCUJPT0xFQU4JCQliSW50Q29udGV4dCwKLQlJTiAgVUNIQVIJCQlRdWVJZHgsCi0JSU4JVUNIQVIJCQlNYXhfVHhfUGFja2V0cyk7Ci0KLU5ESVNfU1RBVFVTCVJUTVBIYXJkVHJhbnNtaXQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUE5ESVNfUEFDS0VUCQlwUGFja2V0LAotCUlOICBVQ0hBUgkJCVF1ZUlkeCwKLQlPVVQJUFVMT05HCQkJcEZyZWVUWERMZWZ0KTsKLQotTkRJU19TVEFUVVMJU1RBSGFyZFRyYW5zbWl0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFRYX0JMSwkJCSpwVHhCbGssCi0JSU4gIFVDSEFSCQkJUXVlSWR4KTsKLQotVk9JRCBTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi1ORElTX1NUQVRVUyBSVE1QRnJlZVRYRFJlcXVlc3QoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBSaW5nVHlwZSwKLQlJTiAgVUNIQVIgICAgICAgICAgIE51bWJlclJlcXVpcmVkLAotCUlOCVBVQ0hBUiAgICAgICAgICBGcmVlTnVtYmVySXMpOwotCi1ORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUglRdWVJZHgsCi0JSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKLQotTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdE1nbXRSaW5nKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUglRdWVJZHgsCi0JSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdFR4UmluZygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIJUXVlSWR4LAotCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7Ci0KLU5ESVNfU1RBVFVTIE1sbWVEYXRhSGFyZFRyYW5zbWl0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCVF1ZUlkeCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7Ci0KLVZPSUQgUlRNUFdyaXRlVHhEZXNjcmlwdG9yKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBUWERfU1RSVUMJCXBUeEQsCi0JSU4JQk9PTEVBTgkJCWJXSVYsCi0JSU4JVUNIQVIJCQlRU0VMKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotVVNIT1JUICBSVE1QQ2FsY0R1cmF0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiAgICAgICAgICAgUmF0ZSwKLQlJTiAgVUxPTkcgICAgICAgICAgIFNpemUpOwotCi1WT0lEIFJUTVBXcml0ZVR4V0koCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFRYV0lfU1RSVUMJCXBUeFdJLAotCUlOICBCT09MRUFOCQlGUkFHLAotCUlOICBCT09MRUFOCQlDRkFDSywKLQlJTiAgQk9PTEVBTgkJSW5zVGltZXN0YW1wLAotCUlOCUJPT0xFQU4JCQlBTVBEVSwKLQlJTglCT09MRUFOCQkJQWNrLAotCUlOCUJPT0xFQU4JCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCi0JSU4JVUNIQVIJCQlCQVNpemUsCi0JSU4JVUNIQVIJCQlXQ0lELAotCUlOCVVMT05HCQkJTGVuZ3RoLAotCUlOICBVQ0hBUgkJUElELAotCUlOCVVDSEFSCQkJVElELAotCUlOCVVDSEFSCQkJVHhSYXRlLAotCUlOCVVDSEFSCQkJVHhvcG1vZGUsCi0JSU4JQk9PTEVBTgkJCUNmQWNrLAotCUlOCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0KTsKLQotCi1WT0lEIFJUTVBXcml0ZVR4V0lfRGF0YSgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JT1VUIFBUWFdJX1NUUlVDCQlwVHhXSSwKLQlJTglUWF9CTEsJCQkJKnBUeEJsayk7Ci0KLQotVk9JRCBSVE1QV3JpdGVUeFdJX0NhY2hlKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAotCUlOCVRYX0JMSwkJCQkqcFR4QmxrKTsKLQotVk9JRCBSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIFJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotTkRJU19TVEFUVVMgTWluaXBvcnRNTVJlcXVlc3QoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JVUNIQVIJCQlRdWVJZHgsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4gIFVJTlQgICAgICAgICAgICBMZW5ndGgpOwotCi0vLysrK21hcmsgYnkgc2hpYW5nLCBub3cgdGhpcyBmdW5jdGlvbiBtZXJnZSB0byBNaW5pcG9ydE1NUmVxdWVzdCgpCi0vLy0tLW1hcmsgYnkgc2hpYW5nLCBub3cgdGhpcyBmdW5jdGlvbiBtZXJnZSB0byBNaW5pcG9ydE1NUmVxdWVzdCgpCi0KLVZPSUQgUlRNUFNlbmROdWxsRnJhbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBUeFJhdGUsCi0JSU4JQk9PTEVBTgkJCWJRb3NOdWxsKTsKLQotVk9JRCBSVE1QU2VuZERpc2Fzc29jaWF0aW9uRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFJUTVBTZW5kUlRTRnJhbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwREEsCi0JSU4JdW5zaWduZWQgaW50CU5leHRNcGR1U2l6ZSwKLQlJTiAgVUNIQVIgICAgICAgICAgIFR4UmF0ZSwKLQlJTiAgVUNIQVIgICAgICAgICAgIFJUU1JhdGUsCi0JSU4gIFVTSE9SVCAgICAgICAgICBBY2tEdXJhdGlvbiwKLQlJTiAgVUNIQVIgICAgICAgICAgIFF1ZUlkeCwKLQlJTiAgVUNIQVIJCQlGcmFtZUdhcCk7Ci0KLQotTkRJU19TVEFUVVMgUlRNUEFwcGx5UGFja2V0RmlsdGVyKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQUlQyOFhYX1JYRF9TVFJVQyAgICAgIHBSeEQsCi0JSU4gIFBIRUFERVJfODAyXzExICBwSGVhZGVyKTsKLQotUFFVRVVFX0hFQURFUiAgIFJUTVBDaGVja1R4U3dRdWV1ZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlPVVQgVUNIQVIgICAgICAgICAgICpRdWVJZHgpOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1WT0lEIFJUTVBSZXBvcnRNaWNFcnJvcigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUENJUEhFUl9LRVkgICAgIHBXcGFLZXkpOwotCi1WT0lECVdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgICAgV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MoCi0gICAgSU4gIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiAgUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOICBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KLVZPSUQgV3BhU3RhUGFpcndpc2VLZXlTZXR0aW5nKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBXcGFTdGFHcm91cEtleVNldHRpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLU5ESVNfU1RBVFVTIFJUTVBDbG9uZU5kaXNQYWNrZXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JQk9PTEVBTiAgICBwSW5zQU1TRFVIZHIsCi0JSU4gIFBORElTX1BBQ0tFVCAgICBwSW5QYWNrZXQsCi0JT1VUIFBORElTX1BBQ0tFVCAgICpwcE91dFBhY2tldCk7Ci0KLU5ESVNfU1RBVFVTIFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBORElTX1BBQ0tFVCAgICAqcFBhY2tldCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBIZWFkZXIsCi0JSU4gIFVJTlQgICAgICAgICAgICBIZWFkZXJMZW4sCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKLQlJTiAgVUlOVCAgICAgICAgICAgIERhdGFMZW4pOwotCi1WT0lEIFJUTVBGcmVlTmRpc1BhY2tldCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOwotCi1CT09MRUFOIFJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZSgKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgICAgIFF1ZUlkeCk7Ci0KLUJPT0xFQU4gUlRNUENoZWNrREhDUEZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKLQotCi1CT09MRUFOIFJUTVBDaGVja0V0aGVyVHlwZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7Ci0KLQotVk9JRCBSVE1QQ2NrQmJwVHVuaW5nKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVJTlQJCQlUeFJhdGUpOwotCi0vLwotLy8gUHJpdmF0ZSByb3V0aW5lcyBpbiBydG1wX3dlcC5jCi0vLwotVk9JRCBSVE1QSW5pdFdlcEVuZ2luZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBLZXksCi0JSU4gIFVDSEFSICAgICAgICAgICBLZXlJZCwKLQlJTiAgVUNIQVIgICAgICAgICAgIEtleUxlbiwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0KTsKLQotVk9JRCBSVE1QRW5jcnlwdERhdGEoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAotCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QsCi0JSU4gIFVJTlQgICAgICAgICAgICBMZW4pOwotCi1CT09MRUFOCVJUTVBEZWNyeXB0RGF0YSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCVBVQ0hBUgkJCXBTcmMsCi0JSU4JVUlOVAkJCUxlbiwKLQlJTglVSU5UCQkJaWR4KTsKLQotQk9PTEVBTglSVE1QU29mdERlY3J5cHRXRVAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUFVDSEFSCQkJcERhdGEsCi0JSU4gVUxPTkcJCQlEYXRhQnl0ZUNudCwKLQlJTiBQQ0lQSEVSX0tFWQkJcEdyb3VwS2V5KTsKLQotVk9JRCBSVE1QU2V0SUNWKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QpOwotCi1WT0lEIEFSQ0ZPVVJfSU5JVCgKLQlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBLZXksCi0JSU4gIFVJTlQgICAgICAgICAgICBLZXlMZW4pOwotCi1VQ0hBUiAgIEFSQ0ZPVVJfQllURSgKLQlJTiAgUEFSQ0ZPVVJDT05URVhUICAgICBDdHgpOwotCi1WT0lEIEFSQ0ZPVVJfREVDUllQVCgKLQlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0LAotCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKLQlJTiAgVUlOVCAgICAgICAgICAgIExlbik7Ci0KLVZPSUQgQVJDRk9VUl9FTkNSWVBUKAotCUlOICBQQVJDRk9VUkNPTlRFWFQgQ3R4LAotCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAotCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKLQotVk9JRCBXUEFBUkNGT1VSX0VOQ1JZUFQoCi0JSU4gIFBBUkNGT1VSQ09OVEVYVCBDdHgsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCi0JSU4gIFVJTlQgICAgICAgICAgICBMZW4pOwotCi1VSU5UIFJUTVBfQ0FMQ19GQ1MzMigKLQlJTiAgVUlOVCAgIEZjcywKLQlJTiAgUFVDSEFSICBDcCwKLQlJTiAgSU5UICAgICBMZW4pOwotCi0vLwotLy8gTUxNRSByb3V0aW5lcwotLy8KLQotLy8gQXNpYy9SRi9CQlAgcmVsYXRlZCBmdW5jdGlvbnMKLQotVk9JRCBBc2ljQWRqdXN0VHhQb3dlcigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQJQXNpY1VwZGF0ZVByb3RlY3QoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCQlVU0hPUlQJCQlPcGVyYWlvbk1vZGUsCi0JSU4JCVVDSEFSCQkJU2V0TWFzaywKLQlJTgkJQk9PTEVBTgkJCWJEaXNhYmxlQkdQcm90ZWN0LAotCUlOCQlCT09MRUFOCQkJYk5vbkdGRXhpc3QpOwotCi1WT0lEIEFzaWNTd2l0Y2hDaGFubmVsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJQ2hhbm5lbCwKLQlJTglCT09MRUFOCQkJYlNjYW4pOwotCi1WT0lEIEFzaWNMb2NrQ2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBDaGFubmVsKSA7Ci0KLVZPSUQgQXNpY0FudGVubmFTZWxlY3QoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBDaGFubmVsKTsKLQotVk9JRCBBc2ljQW50ZW5uYVNldHRpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JQUJHQkFORF9TVEFURQlCYW5kU3RhdGUpOwotCi1WT0lEIEFzaWNSZlR1bmluZ0V4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCi1WT0lEIEFzaWNSZXNldEJCUEFnZW50KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApOwotCi1WT0lEIEFzaWNGb3JjZVNsZWVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBBc2ljRm9yY2VXYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gQk9PTEVBTiAgICBiRnJvbVR4KTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotVk9JRCBBc2ljU2V0QnNzaWQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiBwQnNzaWQpOwotCi1WT0lEIEFzaWNTZXRNY2FzdFdDKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotCi1WT0lEIEFzaWNEZWxXY2lkVGFiKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCVdjaWQpOwotCi1WT0lEIEFzaWNFbmFibGVSREcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIEFzaWNEaXNhYmxlUkRHKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBBc2ljRGlzYWJsZVN5bmMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIEFzaWNFbmFibGVCc3NTeW5jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBBc2ljRW5hYmxlSWJzc1N5bmMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIEFzaWNTZXRFZGNhUGFybSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQRURDQV9QQVJNICAgIHBFZGNhUGFybSk7Ci0KLVZPSUQgQXNpY1NldFNsb3RUaW1lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIEJPT0xFQU4gYlVzZVNob3J0U2xvdFRpbWUpOwotCi0KLVZPSUQgQXNpY0FkZFNoYXJlZEtleUVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSICAgICAgICAgQnNzSW5kZXgsCi0JSU4gVUNIQVIgICAgICAgICBLZXlJZHgsCi0JSU4gVUNIQVIgICAgICAgICBDaXBoZXJBbGcsCi0JSU4gUFVDSEFSICAgICAgICBwS2V5LAotCUlOIFBVQ0hBUiAgICAgICAgcFR4TWljLAotCUlOIFBVQ0hBUiAgICAgICAgcFJ4TWljKTsKLQotVk9JRCBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgICAgICAgICBCc3NJbmRleCwKLQlJTiBVQ0hBUiAgICAgICAgIEtleUlkeCk7Ci0KLVZPSUQgQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUCQlXQ0lELAotCUlOIFVDSEFSCQlCc3NJbmRleCwKLQlJTiBVQ0hBUiAgICAgICAgQ2lwaGVyQWxnLAotCUlOIEJPT0xFQU4JCWJVc2VQYWlyZXdpc2VLZXlUYWJsZSk7Ci0KLVZPSUQgQXNpY1VwZGF0ZVdDSURJVkVJVigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQJCVdDSUQsCi0JSU4gVUxPTkcgICAgICAgIHVJViwKLQlJTiBVTE9ORyAgICAgICAgdUVJVik7Ci0KLVZPSUQgQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVAkJV0NJRCwKLQlJTiBQVUNIQVIgICAgICAgIHBBZGRyKTsKLQotVk9JRCBBc2ljQWRkS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUCQlXQ0lELAotCUlOIFVDSEFSCQlCc3NJbmRleCwKLQlJTiBVQ0hBUgkJS2V5SWR4LAotCUlOIFBDSVBIRVJfS0VZCXBDaXBoZXJLZXksCi0JSU4gQk9PTEVBTgkJYlVzZVBhaXJld2lzZUtleVRhYmxlLAotCUlOIEJPT0xFQU4JCWJUeEtleSk7Ci0KLVZPSUQgQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSICAgICAgICBwQWRkciwKLQlJTiBVQ0hBUgkJV0NJRCwKLQlJTiBDSVBIRVJfS0VZCQkgKnBDaXBoZXJLZXkpOwotCi1WT0lEIEFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKLQlJTiBVQ0hBUgkJIEJzc0lkeCwKLQlJTiBVQ0hBUgkJIFdjaWQpOwotCi1CT09MRUFOIEFzaWNTZW5kQ29tbWFuZFRvTWN1KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSICAgICAgICAgQ29tbWFuZCwKLQlJTiBVQ0hBUiAgICAgICAgIFRva2VuLAotCUlOIFVDSEFSICAgICAgICAgQXJnMCwKLQlJTiBVQ0hBUiAgICAgICAgIEFyZzEpOwotCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLUJPT0xFQU4gQXNpY0NoZWNrQ29tbWFuT2soCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCSBDb21tYW5kKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotVk9JRCBNYWNBZGRyUmFuZG9tQnNzaWQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JT1VUIFBVQ0hBUiBwQWRkcik7Ci0KLVZPSUQgTWd0TWFjSGVhZGVySW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgICAgcEFkLAotCUlOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCi0JSU4gVUNIQVIgU3ViVHlwZSwKLQlJTiBVQ0hBUiBUb0RzLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gUFVDSEFSIHBCc3NpZCk7Ci0KLVZPSUQgTWxtZVJhZGlvT2ZmKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBNbG1lUmFkaW9PbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLQotVk9JRCBCc3NUYWJsZUluaXQoCi0JSU4gQlNTX1RBQkxFICpUYWIpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1WT0lEIEJBVGFibGVJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIEJBX1RBQkxFICpUYWIpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1VTE9ORyBCc3NUYWJsZVNlYXJjaCgKLQlJTiBCU1NfVEFCTEUgKlRhYiwKLQlJTiBQVUNIQVIgcEJzc2lkLAotCUlOIFVDSEFSIENoYW5uZWwpOwotCi1VTE9ORyBCc3NTc2lkVGFibGVTZWFyY2goCi0JSU4gQlNTX1RBQkxFICpUYWIsCi0JSU4gUFVDSEFSICAgIHBCc3NpZCwKLQlJTiBQVUNIQVIgICAgcFNzaWQsCi0JSU4gVUNIQVIgICAgIFNzaWRMZW4sCi0JSU4gVUNIQVIgICAgIENoYW5uZWwpOwotCi1VTE9ORyBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKAotCUlOIEJTU19UQUJMRSAqVGFiLAotCUlOIFBVQ0hBUiAgICBCc3NpZCwKLQlJTiBQVUNIQVIgICAgcFNzaWQsCi0JSU4gVUNIQVIgICAgIFNzaWRMZW4sCi0JSU4gVUNIQVIgICAgIENoYW5uZWwpOwotCi1VTE9ORyBCc3NTc2lkVGFibGVTZWFyY2hCeVNTSUQoCi0JSU4gQlNTX1RBQkxFICpUYWIsCi0JSU4gUFVDSEFSCSBwU3NpZCwKLQlJTiBVQ0hBUgkgU3NpZExlbik7Ci0KLVZPSUQgQnNzVGFibGVEZWxldGVFbnRyeSgKLQlJTiBPVVQgIFBCU1NfVEFCTEUgcFRhYiwKLQlJTiAgICAgIFBVQ0hBUiBwQnNzaWQsCi0JSU4gICAgICBVQ0hBUiBDaGFubmVsKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVk9JRCBCQVRhYmxlRGVsZXRlT1JJRW50cnkoCi0JSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCQlCQV9PUklfRU5UUlkJKnBCQU9SSUVudHJ5KTsKLQotVk9JRCBCQVRhYmxlRGVsZXRlUkVDRW50cnkoCi0JSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCQlCQV9SRUNfRU5UUlkJKnBCQVJFQ0VudHJ5KTsKLQotVk9JRCBCQVRhYmxlVGVhck9SSUVudHJ5KAotCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKLQlJTgkJVUNIQVIgVElELAotCUlOCQlVQ0hBUiBXY2lkLAotCUlOCQlCT09MRUFOIGJGb3JjZURlbGV0ZSwKLQlJTgkJQk9PTEVBTiBBTEwpOwotCi1WT0lEIEJBVGFibGVUZWFyUkVDRW50cnkoCi0JSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCQlVQ0hBUiBUSUQsCi0JSU4JCVVDSEFSIFdDSUQsCi0JSU4JCUJPT0xFQU4gQUxMKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotVk9JRCAgQnNzRW50cnlTZXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JT1VUIFBCU1NfRU5UUlkgcEJzcywKLQlJTiBQVUNIQVIgcEJzc2lkLAotCUlOIENIQVIgU3NpZFtdLAotCUlOIFVDSEFSIFNzaWRMZW4sCi0JSU4gVUNIQVIgQnNzVHlwZSwKLQlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAotCUlOIFBDRl9QQVJNIENmUGFybSwKLQlJTiBVU0hPUlQgQXRpbVdpbiwKLQlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCi0JSU4gVUNIQVIgU3VwUmF0ZVtdLAotCUlOIFVDSEFSIFN1cFJhdGVMZW4sCi0JSU4gVUNIQVIgRXh0UmF0ZVtdLAotCUlOIFVDSEFSIEV4dFJhdGVMZW4sCi0JSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKLQlJTiBBRERfSFRfSU5GT19JRSAqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCi0JSU4gVUNIQVIJCQlBZGRIdEluZm9MZW4sCi0JSU4gVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0LAotCUlOIFVDSEFSIENoYW5uZWwsCi0JSU4gQ0hBUiBSc3NpLAotCUlOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAotCUlOIFVDSEFSIENraXBGbGFnLAotCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotCUlOIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAotCUlOIFBRQlNTX0xPQURfUEFSTSBwUWJzc0xvYWQsCi0JSU4gVVNIT1JUIExlbmd0aFZJRSwKLQlJTiBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpOwotCi1VTE9ORyAgQnNzVGFibGVTZXRFbnRyeSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlPVVQgUEJTU19UQUJMRSBwVGFiLAotCUlOIFBVQ0hBUiBwQnNzaWQsCi0JSU4gQ0hBUiBTc2lkW10sCi0JSU4gVUNIQVIgU3NpZExlbiwKLQlJTiBVQ0hBUiBCc3NUeXBlLAotCUlOIFVTSE9SVCBCZWFjb25QZXJpb2QsCi0JSU4gQ0ZfUEFSTSAqQ2ZQYXJtLAotCUlOIFVTSE9SVCBBdGltV2luLAotCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKLQlJTiBVQ0hBUiBTdXBSYXRlW10sCi0JSU4gVUNIQVIgU3VwUmF0ZUxlbiwKLQlJTiBVQ0hBUiBFeHRSYXRlW10sCi0JSU4gVUNIQVIgRXh0UmF0ZUxlbiwKLQlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAotCUlOIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKLQlJTiBVQ0hBUgkJCUFkZEh0SW5mb0xlbiwKLQlJTiBVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQsCi0JSU4gVUNIQVIgQ2hhbm5lbCwKLQlJTiBDSEFSIFJzc2ksCi0JSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCi0JSU4gVUNIQVIgQ2tpcEZsYWcsCi0JSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCi0JSU4gUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCi0JSU4gUFFCU1NfTE9BRF9QQVJNIHBRYnNzTG9hZCwKLQlJTiBVU0hPUlQgTGVuZ3RoVklFLAotCUlOIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLVZPSUQgQkFUYWJsZUluc2VydEVudHJ5KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVTSE9SVCBBaWQsCi0gICAgSU4gVVNIT1JUCQlUaW1lT3V0VmFsdWUsCi0JSU4gVVNIT1JUCQlTdGFydGluZ1NlcSwKLSAgICBJTiBVQ0hBUiBUSUQsCi0JSU4gVUNIQVIgQkFXaW5TaXplLAotCUlOIFVDSEFSIE9yaWdpbmF0b3JTdGF0dXMsCi0gICAgSU4gQk9PTEVBTiBJc1JlY2lwaWVudCk7Ci0KLSNpZmRlZiBET1QxMU5fRFJBRlQzCi1WT0lEIEJzczIwNDBDb2V4aXN0VGltZU91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi0KLVZPSUQgIFRyaUV2ZW50SW5pdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVVMT05HIFRyaUV2ZW50VGFibGVTZXRFbnRyeSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQgVFJJR0dFUl9FVkVOVF9UQUIgKlRhYiwKLQlJTiBQVUNIQVIgcEJzc2lkLAotCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCi0JSU4gVUNIQVIJCQlSZWdDbGFzcywKLQlJTiBVQ0hBUiBDaGFubmVsTm8pOwotCi1WT0lEIFRyaUV2ZW50Q291bnRlck1haW50ZW5hbmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLVZPSUQgQnNzVGFibGVTc2lkU29ydCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlPVVQgQlNTX1RBQkxFICpPdXRUYWIsCi0JSU4gIENIQVIgU3NpZFtdLAotCUlOICBVQ0hBUiBTc2lkTGVuKTsKLQotVk9JRCAgQnNzVGFibGVTb3J0QnlSc3NpKAotCUlOIE9VVCBCU1NfVEFCTEUgKk91dFRhYik7Ci0KLVZPSUQgQnNzQ2lwaGVyUGFyc2UoCi0JSU4gT1VUICBQQlNTX0VOVFJZICBwQnNzKTsKLQotTkRJU19TVEFUVVMgIE1sbWVRdWV1ZUluaXQoCi0JSU4gTUxNRV9RVUVVRSAqUXVldWUpOwotCi1WT0lEICBNbG1lUXVldWVEZXN0cm95KAotCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKTsKLQotQk9PTEVBTiBNbG1lRW5xdWV1ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVTE9ORyBNYWNoaW5lLAotCUlOIFVMT05HIE1zZ1R5cGUsCi0JSU4gVUxPTkcgTXNnTGVuLAotCUlOIFZPSUQgKk1zZyk7Ci0KLUJPT0xFQU4gTWxtZUVucXVldWVGb3JSZWN2KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIFVMT05HIFdjaWQsCi0JSU4gVUxPTkcgVGltZVN0YW1wSGlnaCwKLQlJTiBVTE9ORyBUaW1lU3RhbXBMb3csCi0JSU4gVUNIQVIgUnNzaTAsCi0JSU4gVUNIQVIgUnNzaTEsCi0JSU4gVUNIQVIgUnNzaTIsCi0JSU4gVUxPTkcgTXNnTGVuLAotCUlOIFBWT0lEIE1zZywKLQlJTiBVQ0hBUiBTaWduYWwpOwotCi0KLUJPT0xFQU4gTWxtZURlcXVldWUoCi0JSU4gTUxNRV9RVUVVRSAqUXVldWUsCi0JT1VUIE1MTUVfUVVFVUVfRUxFTSAqKkVsZW0pOwotCi1WT0lEICAgIE1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotQk9PTEVBTiAgTWxtZVF1ZXVlRW1wdHkoCi0JSU4gTUxNRV9RVUVVRSAqUXVldWUpOwotCi1CT09MRUFOICBNbG1lUXVldWVGdWxsKAotCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKTsKLQotQk9PTEVBTiAgTXNnVHlwZVN1YnN0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBGUkFNRV84MDJfMTEgcEZyYW1lLAotCU9VVCBJTlQgKk1hY2hpbmUsCi0JT1VUIElOVCAqTXNnVHlwZSk7Ci0KLVZPSUQgU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiBTVEFURV9NQUNISU5FICpTbSwKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSwKLQlJTiBVTE9ORyBTdE5yLAotCUlOIFVMT05HIE1zZ05yLAotCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBEZWZGdW5jLAotCUlOIFVMT05HIEluaXRTdGF0ZSwKLQlJTiBVTE9ORyBCYXNlKTsKLQotVk9JRCBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oCi0JSU4gU1RBVEVfTUFDSElORSAqUywKLQlJTiBVTE9ORyBTdCwKLQlVTE9ORyBNc2csCi0JSU4gU1RBVEVfTUFDSElORV9GVU5DIEYpOwotCi1WT0lEIFN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gU1RBVEVfTUFDSElORSAqUywKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIERyb3AoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBBc3NvY1N0YXRlTWFjaGluZUluaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFNUQVRFX01BQ0hJTkUgKlNtLAotCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7Ci0KLVZPSUQgUmVhc3NvY1RpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBBc3NvY1RpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBEaXNhc3NvY1RpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1WT0lEIE1sbWVEaXNhc3NvY1JlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBNbG1lQXNzb2NSZXFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgTWxtZVJlYXNzb2NSZXFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgTWxtZURpc2Fzc29jUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJBc3NvY1JzcEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyUmVhc3NvY1JzcEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyRGlzYXNzb2NBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgRGlzYXNzb2NUaW1lb3V0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIEFzc29jVGltZW91dEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCAgUmVhc3NvY1RpbWVvdXRBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgIENsczNlcnJBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiBwQWRkcik7Ci0KLVZPSUQgIEludmFsaWRTdGF0ZVdoZW5Bc3NvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCAgSW52YWxpZFN0YXRlV2hlblJlYXNzb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSgKLQlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLQotVk9JRCAgQ29tcG9zZVBzUG9sbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgIENvbXBvc2VOdWxsRnJhbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCAgQXNzb2NQb3N0UHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSIHBBZGRyMiwKLQlJTiAgVVNIT1JUIENhcGFiaWxpdHlJbmZvLAotCUlOICBVU0hPUlQgQWlkLAotCUlOICBVQ0hBUiBTdXBSYXRlW10sCi0JSU4gIFVDSEFSIFN1cFJhdGVMZW4sCi0JSU4gIFVDSEFSIEV4dFJhdGVbXSwKLQlJTiAgVUNIQVIgRXh0UmF0ZUxlbiwKLQlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKLQlJTiBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKLQlJTiAgVUNIQVIgSHRDYXBhYmlsaXR5TGVuLAotCUlOIEFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbyk7Ci0KLVZPSUQgQXV0aFN0YXRlTWFjaGluZUluaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gUFNUQVRFX01BQ0hJTkUgc20sCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKLQotVk9JRCBBdXRoVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIE1sbWVBdXRoUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIEF1dGhUaW1lb3V0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIENsczJlcnJBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiBwQWRkcik7Ci0KLVZPSUQgTWxtZURlYXV0aFJlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBJbnZhbGlkU3RhdGVXaGVuQXV0aCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVk9JRCBBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFNUQVRFX01BQ0hJTkUgU20sCi0JSU4gIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKLQotVk9JRCBQZWVyRGVhdXRoQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgUGVlckF1dGhTaW1wbGVSc3BHZW5BbmRTZW5kKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQSEVBREVSXzgwMl8xMSAgcEhkcjgwMjExLAotCUlOICBVU0hPUlQgQWxnLAotCUlOICBVU0hPUlQgU2VxLAotCUlOICBVU0hPUlQgUmVhc29uLAotCUlOICBVU0hPUlQgU3RhdHVzKTsKLQotLy8KLS8vIFByaXZhdGUgcm91dGluZXMgaW4gZGxzLmMKLS8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLXZvaWQgRGxzU3RhdGVNYWNoaW5lSW5pdCgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKLSAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwotCi1WT0lEIE1sbWVEbHNSZXFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyRGxzUmVxQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTQkqRWxlbSk7Ci0KLVZPSUQgUGVlckRsc1JzcEFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSCXBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0JKkVsZW0pOwotCi1WT0lEIE1sbWVEbHNUZWFyRG93bkFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJEbHNUZWFyRG93bkFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSCXBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0JKkVsZW0pOwotCi1WT0lEIFJUTVBDaGVja0RMU1RpbWVPdXQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1CT09MRUFOIFJUTVBSY3ZGcmFtZURMU0NoZWNrKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFBIRUFERVJfODAyXzExCXBIZWFkZXIsCi0JSU4gVUxPTkcJCQlMZW4sCi0JSU4gUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCk7Ci0KLUlOVAlSVE1QQ2hlY2tETFNGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEQSk7Ci0KLVZPSUQgUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcERBKTsKLQotTkRJU19TVEFUVVMgUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBEQSk7Ci0KLU5ESVNfU1RBVFVTIFJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBEQSk7Ci0KLVZPSUQgRGxzVGltZW91dEFjdGlvbigKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1CT09MRUFOIE1sbWVEbHNSZXFTYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFJUXzgwMl8xMV9ETFMgKnBETFMsCi0gICAgT1VUIFBVU0hPUlQgcFJlYXNvbik7Ci0KLUlOVCBTZXRfRGxzRW50cnlJbmZvX0Rpc3BsYXlfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgYXJnKTsKLQotTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUluc2VydERsc0VudHJ5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIJcEFkZHIsCi0JSU4gIFVJTlQJRGxzRW50cnlJZHgpOwotCi1CT09MRUFOIE1hY1RhYmxlRGVsZXRlRGxzRW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIHdjaWQsCi0JSU4gUFVDSEFSIHBBZGRyKTsKLQotTUFDX1RBQkxFX0VOVFJZICpEbHNFbnRyeVRhYmxlTG9va3VwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUglwQWRkciwKLQlJTiBCT09MRUFOCWJSZXNldElkZWxDb3VudCk7Ci0KLU1BQ19UQUJMRV9FTlRSWSAqRGxzRW50cnlUYWJsZUxvb2t1cEJ5V2NpZCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgl3Y2lkLAotCUlOIFBVQ0hBUglwQWRkciwKLQlJTiBCT09MRUFOCWJSZXNldElkZWxDb3VudCk7Ci0KLUlOVAlTZXRfRGxzQWRkRW50cnlfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9EbHNUZWFyRG93bkVudHJ5X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLUJPT0xFQU4gUGVlckRsc1JlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcERBLAotICAgIE9VVCBQVUNIQVIgcFNBLAotICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKLSAgICBPVVQgVVNIT1JUICpwRGxzVGltZW91dCwKLSAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKLSAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKLSAgICBPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCi0gICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpOwotCi1CT09MRUFOIFBlZXJEbHNSc3BTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBEQSwKLSAgICBPVVQgUFVDSEFSIHBTQSwKLSAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCi0gICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKLSAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKLSAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKLSAgICBPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCi0gICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpOwotCi1CT09MRUFOIFBlZXJEbHNUZWFyRG93blNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcERBLAotICAgIE9VVCBQVUNIQVIgcFNBLAotICAgIE9VVCBVU0hPUlQgKnBSZWFzb24pOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVk9JRCBTeW5jU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgU1RBVEVfTUFDSElORSAqU20sCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKLQotVk9JRCBCZWFjb25UaW1lb3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KLVZPSUQgU2NhblRpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBNbG1lU2NhblJlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBJbnZhbGlkU3RhdGVXaGVuU2NhbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBJbnZhbGlkU3RhdGVXaGVuSm9pbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBJbnZhbGlkU3RhdGVXaGVuU3RhcnQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgUGVlckJlYWNvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBFbnF1ZXVlUHJvYmVSZXF1ZXN0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotQk9PTEVBTiBTY2FuUnVubmluZygKLQkJSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1WT0lEIE1sbWVDbnRsSW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgU1RBVEVfTUFDSElORSAqUywKLQlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwotCi1WT0lEIE1sbWVDbnRsTWFjaGluZVBlcmZvcm1BY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFNUQVRFX01BQ0hJTkUgKlMsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgQ250bElkbGVQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIENudGxPaWRTY2FuUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgQ250bE9pZFNzaWRQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKTsKLQotVk9JRCBDbnRsT2lkUlRCc3NpZFByb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pOwotCi1WT0lEIENudGxNbG1lUm9hbWluZ1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pOwotCi1WT0lEIENudGxXYWl0RGlzYXNzb2NQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIENudGxXYWl0Sm9pblByb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgQ250bFdhaXRSZWFzc29jUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBDbnRsV2FpdFN0YXJ0UHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBDbnRsV2FpdEF1dGhQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIENudGxXYWl0QXV0aFByb2MyKAotCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBDbnRsV2FpdEFzc29jUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotVk9JRCBDbnRsT2lkRExTU2V0dXBQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLVZPSUQgTGlua1VwKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiBCc3NUeXBlKTsKLQotVk9JRCBMaW5rRG93bigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgQk9PTEVBTiAgICAgICAgIElzUmVxRnJvbUFQKTsKLQotVk9JRCBJdGVyYXRlT25Cc3NUYWIoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIEl0ZXJhdGVPbkJzc1RhYjIoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOzsKLQotVk9JRCBKb2luUGFybUZpbGwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE9VVCBNTE1FX0pPSU5fUkVRX1NUUlVDVCAqSm9pblJlcSwKLQlJTiAgVUxPTkcgQnNzSWR4KTsKLQotVk9JRCBBc3NvY1Bhcm1GaWxsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIE9VVCBNTE1FX0FTU09DX1JFUV9TVFJVQ1QgKkFzc29jUmVxLAotCUlOICBQVUNIQVIgcEFkZHIsCi0JSU4gIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKLQlJTiAgVUxPTkcgVGltZW91dCwKLQlJTiAgVVNIT1JUIExpc3RlbkludHYpOwotCi1WT0lEIFNjYW5QYXJtRmlsbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgT1VUIE1MTUVfU0NBTl9SRVFfU1RSVUNUICpTY2FuUmVxLAotCUlOICBTVFJJTkcgU3NpZFtdLAotCUlOICBVQ0hBUiBTc2lkTGVuLAotCUlOICBVQ0hBUiBCc3NUeXBlLAotCUlOICBVQ0hBUiBTY2FuVHlwZSk7Ci0KLVZPSUQgRGlzYXNzb2NQYXJtRmlsbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgT1VUIE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAqRGlzYXNzb2NSZXEsCi0JSU4gIFBVQ0hBUiBwQWRkciwKLQlJTiAgVVNIT1JUIFJlYXNvbik7Ci0KLVZPSUQgU3RhcnRQYXJtRmlsbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgT1VUIE1MTUVfU1RBUlRfUkVRX1NUUlVDVCAqU3RhcnRSZXEsCi0JSU4gIENIQVIgU3NpZFtdLAotCUlOICBVQ0hBUiBTc2lkTGVuKTsKLQotVk9JRCBBdXRoUGFybUZpbGwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE9VVCBNTE1FX0FVVEhfUkVRX1NUUlVDVCAqQXV0aFJlcSwKLQlJTiAgUFVDSEFSIHBBZGRyLAotCUlOICBVU0hPUlQgQWxnKTsKLQotVk9JRCBFbnF1ZXVlUHNQb2xsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBFbnF1ZXVlQmVhY29uRnJhbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIE1sbWVKb2luUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIE1sbWVTY2FuUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIE1sbWVTdGFydFJlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBTY2FuVGltZW91dEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJCZWFjb25BdFNjYW5BY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgUGVlckJlYWNvbkF0Sm9pbkFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyQmVhY29uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJQcm9iZVJlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgU2Nhbk5leHRDaGFubmVsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVUxPTkcgTWFrZUlic3NCZWFjb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIENDWEFkamFjZW50QVBSZXBvcnQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1CT09MRUFOIE1sbWVTY2FuUmVxU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBWT0lEICpNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlPVVQgVUNIQVIgKkJzc1R5cGUsCi0JT1VUIENIQVIgc3NpZFtdLAotCU9VVCBVQ0hBUiAqU3NpZExlbiwKLQlPVVQgVUNIQVIgKlNjYW5UeXBlKTsKLQotQk9PTEVBTiBQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFZPSUQgKk1zZywKLQlJTiAgVUxPTkcgTXNnTGVuLAotCUlOICBVQ0hBUiBNc2dDaGFubmVsLAotCU9VVCBQVUNIQVIgcEFkZHIyLAotCU9VVCBQVUNIQVIgcEJzc2lkLAotCU9VVCBDSEFSIFNzaWRbXSwKLQlPVVQgVUNIQVIgKnBTc2lkTGVuLAotCU9VVCBVQ0hBUiAqcEJzc1R5cGUsCi0JT1VUIFVTSE9SVCAqcEJlYWNvblBlcmlvZCwKLQlPVVQgVUNIQVIgKnBDaGFubmVsLAotCU9VVCBVQ0hBUiAqcE5ld0NoYW5uZWwsCi0JT1VUIExBUkdFX0lOVEVHRVIgKnBUaW1lc3RhbXAsCi0JT1VUIENGX1BBUk0gKnBDZlBhcm0sCi0JT1VUIFVTSE9SVCAqcEF0aW1XaW4sCi0JT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAotCU9VVCBVQ0hBUiAqcEVycCwKLQlPVVQgVUNIQVIgKnBEdGltQ291bnQsCi0JT1VUIFVDSEFSICpwRHRpbVBlcmlvZCwKLQlPVVQgVUNIQVIgKnBCY2FzdEZsYWcsCi0JT1VUIFVDSEFSICpwTWVzc2FnZVRvTWUsCi0JT1VUIFVDSEFSIFN1cFJhdGVbXSwKLQlPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAotCU9VVCBVQ0hBUiBFeHRSYXRlW10sCi0JT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKLQlPVVQJVUNIQVIgKnBDa2lwRmxhZywKLQlPVVQJVUNIQVIgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCi0JT1VUIFBFRENBX1BBUk0gICAgICAgcEVkY2FQYXJtLAotCU9VVCBQUUJTU19MT0FEX1BBUk0gIHBRYnNzTG9hZCwKLQlPVVQgUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCi0JT1VUIFVMT05HICpwUmFsaW5rSWUsCi0JT1VUIFVDSEFSCQkgKnBIdENhcGFiaWxpdHlMZW4sCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JT1VUIFVDSEFSCQkgKnBQcmVOSHRDYXBhYmlsaXR5TGVuLAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCU9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAotCU9VVCBVQ0hBUgkJICpBZGRIdEluZm9MZW4sCi0JT1VUIEFERF9IVF9JTkZPX0lFICpBZGRIdEluZm8sCi0JT1VUIFVDSEFSICpOZXdFeHRDaGFubmVsLAotCU9VVCBVU0hPUlQgKkxlbmd0aFZJRSwKLQlPVVQgUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKTsKLQotQk9PTEVBTiBQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqcE1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQWRkcjIpOwotCi1CT09MRUFOIFBlZXJBZGRCQVJzcEFjdGlvblNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpwTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbik7Ci0KLUJPT0xFQU4gUGVlckRlbEJBQWN0aW9uU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFVDSEFSIFdjaWQsCi0gICAgSU4gVk9JRCAqcE1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4pOwotCi1CT09MRUFOIE1sbWVBc3NvY1JlcVNhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVk9JRCAqTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQXBBZGRyLAotCU9VVCBVU0hPUlQgKkNhcGFiaWxpdHlJbmZvLAotCU9VVCBVTE9ORyAqVGltZW91dCwKLQlPVVQgVVNIT1JUICpMaXN0ZW5JbnR2KTsKLQotQk9PTEVBTiBNbG1lQXV0aFJlcVNhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVk9JRCAqTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQWRkciwKLQlPVVQgVUxPTkcgKlRpbWVvdXQsCi0JT1VUIFVTSE9SVCAqQWxnKTsKLQotQk9PTEVBTiBNbG1lU3RhcnRSZXFTYW5pdHkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFZPSUQgKk1zZywKLQlJTiAgVUxPTkcgTXNnTGVuLAotCU9VVCBDSEFSIFNzaWRbXSwKLQlPVVQgVUNIQVIgKlNzaWRsZW4pOwotCi1CT09MRUFOIFBlZXJBdXRoU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBWT0lEICpNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBZGRyLAotCU9VVCBVU0hPUlQgKkFsZywKLQlPVVQgVVNIT1JUICpTZXEsCi0JT1VUIFVTSE9SVCAqU3RhdHVzLAotCU9VVCBDSEFSIENobGdUZXh0W10pOwotCi1CT09MRUFOIFBlZXJBc3NvY1JzcFNhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiBWT0lEICpwTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQWRkcjIsCi0JT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAotCU9VVCBVU0hPUlQgKnBTdGF0dXMsCi0JT1VUIFVTSE9SVCAqcEFpZCwKLQlPVVQgVUNIQVIgU3VwUmF0ZVtdLAotCU9VVCBVQ0hBUiAqcFN1cFJhdGVMZW4sCi0JT1VUIFVDSEFSIEV4dFJhdGVbXSwKLQlPVVQgVUNIQVIgKnBFeHRSYXRlTGVuLAotICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKLSAgICBPVVQgQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLSAgICBPVVQgVUNIQVIJCQkqcEh0Q2FwYWJpbGl0eUxlbiwKLSAgICBPVVQgVUNIQVIJCQkqcEFkZEh0SW5mb0xlbiwKLSAgICBPVVQgVUNIQVIJCQkqcE5ld0V4dENoYW5uZWxPZmZzZXQsCi0JT1VUIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotCU9VVCBVQ0hBUiAqcENraXBGbGFnKTsKLQotQk9PTEVBTiBQZWVyRGlzYXNzb2NTYW5pdHkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFZPSUQgKk1zZywKLQlJTiAgVUxPTkcgTXNnTGVuLAotCU9VVCBQVUNIQVIgcEFkZHIyLAotCU9VVCBVU0hPUlQgKlJlYXNvbik7Ci0KLUJPT0xFQU4gUGVlcldwYU1lc3NhZ2VTYW5pdHkoCi0gICAgSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotICAgIElOCVBFQVBPTF9QQUNLRVQJCXBNc2csCi0gICAgSU4JVUxPTkcJCQkJTXNnTGVuLAotICAgIElOCVVDSEFSCQkJCU1zZ1R5cGUsCi0gICAgSU4JTUFDX1RBQkxFX0VOVFJZCQkqcEVudHJ5KTsKLQotQk9PTEVBTiBQZWVyRGVhdXRoU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBWT0lEICpNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBZGRyMiwKLQlPVVQgVVNIT1JUICpSZWFzb24pOwotCi1CT09MRUFOIFBlZXJQcm9iZVJlcVNhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVk9JRCAqTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQWRkcjIsCi0JT1VUIENIQVIgU3NpZFtdLAotCU9VVCBVQ0hBUiAqcFNzaWRMZW4pOwotCi1CT09MRUFOIEdldFRpbUJpdCgKLQlJTiAgQ0hBUiAqUHRyLAotCUlOICBVU0hPUlQgQWlkLAotCU9VVCBVQ0hBUiAqVGltTGVuLAotCU9VVCBVQ0hBUiAqQmNhc3RGbGFnLAotCU9VVCBVQ0hBUiAqRHRpbUNvdW50LAotCU9VVCBVQ0hBUiAqRHRpbVBlcmlvZCwKLQlPVVQgVUNIQVIgKk1lc3NhZ2VUb01lKTsKLQotVUNIQVIgQ2hhbm5lbFNhbml0eSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBjaGFubmVsKTsKLQotTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoCi0JSU4gUEJTU19FTlRSWSBwQnNzKTsKLQotCi1CT09MRUFOIE1sbWVEZWxCQVJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuKTsKLQotQk9PTEVBTiBNbG1lQWRkQkFSZXFTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMik7Ci0KLVVMT05HIE1ha2VPdXRnb2luZ0ZyYW1lKAotCU9VVCBVQ0hBUiAqQnVmZmVyLAotCU9VVCBVTE9ORyAqTGVuZ3RoLCAuLi4pOwotCi1WT0lEICBMZnNySW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUxPTkcgU2VlZCk7Ci0KLVVDSEFSIFJhbmRvbUJ5dGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIEFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwVHhSYXRlKTsKLQotVk9JRCAgTWxtZVBlcmlvZGljRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIExpbmtEb3duRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIExpbmtVcEV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBTVEFNbG1lUGVyaW9kaWNFeGVjKAotCVBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBNbG1lQXV0b1NjYW4oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIE1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1CT09MRUFOIE1sbWVWYWxpZGF0ZVNTSUQoCi0JSU4gUFVDSEFSIHBTc2lkLAotCUlOIFVDSEFSICBTc2lkTGVuKTsKLQotVk9JRCBNbG1lQ2hlY2tGb3JSb2FtaW5nKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVMT05HICAgIE5vdzMyKTsKLQotQk9PTEVBTiBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIE1sbWVTZXRUeFJhdGUoCi0JSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKLQlJTiBQUlRNUF9UWF9SQVRFX1NXSVRDSAlwVHhSYXRlKTsKLQotVk9JRCBNbG1lU2VsZWN0VHhSYXRlVGFibGUoCi0JSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKLQlJTiBQVUNIQVIJCQkJKnBwVGFibGUsCi0JSU4gUFVDSEFSCQkJCXBUYWJsZVNpemUsCi0JSU4gUFVDSEFSCQkJCXBJbml0VHhSYXRlSWR4KTsKLQotVk9JRCBNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWSBwTWFjRW50cnksCi0JSU4gVUxPTkcgTm93KTsKLQotVk9JRCBNbG1lQ2hlY2tQc21DaGFuZ2UoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUxPTkcgICAgTm93MzIpOwotCi1WT0lEIE1sbWVTZXRQc21CaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIHBzbSk7Ci0KLVZPSUQgTWxtZVNldFR4UHJlYW1ibGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIFR4UHJlYW1ibGUpOwotCi1WT0lEIFVwZGF0ZUJhc2ljUmF0ZUJpdG1hcCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgTWxtZVVwZGF0ZVR4UmF0ZXMoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JQk9PTEVBTgkJCWJMaW5rVXAsCi0JSU4JVUNIQVIJCQlhcGlkeCk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLVZPSUQgTWxtZVVwZGF0ZUh0VHhSYXRlcygKLQlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JVUNIQVIJCQkJYXBpZHgpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1WT0lEICAgIFJUTVBDaGVja1JhdGVzKAotCUlOICAgICAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiBPVVQgIFVDSEFSICAgICAgICAgICBTdXBSYXRlW10sCi0JSU4gT1VUICBVQ0hBUiAgICAgICAgICAgKlN1cFJhdGVMZW4pOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1CT09MRUFOIFJUTVBDaGVja0NoYW5uZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCUNlbnRyYWxDaGFubmVsLAotCUlOIFVDSEFSCQlDaGFubmVsKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotQk9PTEVBTgkJUlRNUENoZWNrSHQoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCQlVQ0hBUglXY2lkLAotCUlOIE9VVAlIVF9DQVBBQklMSVRZX0lFCQkJKnBIdENhcGFiaWxpdHksCi0JSU4gT1VUCUFERF9IVF9JTkZPX0lFCQkJKnBBZGRIdEluZm8pOwotCi1WT0lEIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBBc2ljQmJwVHVuaW5nMSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgQXNpY0JicFR1bmluZzIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIFJUTVBVcGRhdGVNbG1lUmF0ZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLUNIQVIgUlRNUE1heFJzc2koCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gQ0hBUgkJCQlSc3NpMCwKLQlJTiBDSEFSCQkJCVJzc2kxLAotCUlOIENIQVIJCQkJUnNzaTIpOwotCi0jaWZkZWYgUlQzMHh4Ci1WT0lEIEFzaWNTZXRSeEFudCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVQ0hBUgkJCUFudCk7Ci0KLVZPSUQgUlRNUEZpbHRlckNhbGlicmF0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAotLy8yMDA4LzA5LzExOktIIGFkZCB0byBzdXBwb3J0IGVmdXNlPC0tCi1JTlQgc2V0X2VGdXNlR2V0RnJlZUJsb2NrQ291bnRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIHNldF9lRnVzZWR1bXBfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIHNldF9lRnVzZUxvYWRGcm9tQmluX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLVZPSUQgZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUIE9mZnNldCwKLQlJTglVU0hPUlQgTGVuZ3RoLAotCU9VVAlVU0hPUlQqIHBEYXRhKTsKLQotaW50IFJ0bXBFZnVzZVN1cHBvcnRDaGVjaygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCk7Ci0KLUlOVCBzZXRfZUZ1c2VCdWZmZXJNb2RlV3JpdGVCYWNrX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBlRnVzZUxvYWRFRVBST00oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1JTlQgZUZ1c2VXcml0ZUVlZXBwcm9tQnVmKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBlRnVzZUdldEZyZWVCbG9ja0NvdW50KElOIFBSVE1QX0FEQVBURVIgcEFkLAotCVBVSU5UIEVmdXNlRnJlZUJsb2NrKTsKLQotSU5UIGVGdXNlX2luaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1OVFNUQVRVUyBlRnVzZVJlYWQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCU9VVAlQVUNIQVIJCQlwRGF0YSwKLQlJTglVU0hPUlQJCQlMZW5ndGgpOwotCi1OVFNUQVRVUyBlRnVzZVdyaXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVU0hPUlQJCQlsZW5ndGgpOwotLy8yMDA4LzA5LzExOktIIGFkZCB0byBzdXBwb3J0IGVmdXNlLS0+Ci0jZW5kaWYgLy8gUlRNUF9FRlVTRV9TVVBQT1JUIC8vCi0KLS8vIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwCi1WT0lEIFJUMzB4eExvYWRSRk5vcm1hbE1vZGVTZXR1cCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgUlQzMHh4TG9hZFJGU2xlZXBNb2RlU2V0dXAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFJUMzB4eFJldmVyc2VSRlNsZWVwTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLS8vIGVuZCBqb2hubGkKLQotCi0jaWZkZWYgUlQzMDkwCi1WT0lEIE5JQ0luaXRSVDMwOTBSRlJlZ2lzdGVycygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCk7Ci0jZW5kaWYgLy8gUlQzMDkwIC8vCi0KLVZPSUQgUlQzMHh4SGFsdEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgUlQzMHh4U2V0UnhBbnQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlBbnQpOwotI2VuZGlmIC8vIFJUMzB4eCAvLwotI2lmZGVmIFJUMzN4eAotVk9JRCBSVDMzeHhMb2FkUkZOb3JtYWxNb2RlU2V0dXAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFJUMzN4eExvYWRSRlNsZWVwTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBSVDMzeHhSZXZlcnNlUkZTbGVlcE1vZGVTZXR1cCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLSNpZmRlZiBSVDMzNzAKLVZPSUQgTklDSW5pdFJUMzM3MFJGUmVnaXN0ZXJzKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKLSNlbmRpZiAvLyBSVDMwNzAgLy8KLQotI2lmZGVmIFJUMzM5MAotVk9JRCBOSUNJbml0UlQzMzkwUkZSZWdpc3RlcnMoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOwotI2VuZGlmIC8vIFJUMzA5MCAvLwotCi1WT0lEIFJUMzN4eEhhbHRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFJUMzN4eFNldFJ4QW50KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJQW50KTsKLQotI2VuZGlmIC8vIFJUMzN4eCAvLwotCi0KLQotVk9JRCBBc2ljRXZhbHVhdGVSeEFudCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgQXNpY1J4QW50RXZhbFRpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBBUFNEUGVyaW9kaWNFeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KLUJPT0xFQU4gUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaCgKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSk7Ci0KLVVDSEFSIFJUTVBTdGFGaXhlZFR4TW9kZSgKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSk7Ci0KLVZPSUQgUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygKLQkJVUNIQVIJCQkJZml4ZWRfdHhfbW9kZSwKLQkJUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpOwotCi1CT09MRUFOIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkKTsKLQotTkRJU19TVEFUVVMgTWxtZUluaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIE1sbWVIYW5kbGVyKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBNbG1lSGFsdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIEJ1aWxkQ2hhbm5lbExpc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1VQ0hBUiBGaXJzdENoYW5uZWwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1VQ0hBUiBOZXh0Q2hhbm5lbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIgY2hhbm5lbCk7Ci0KLVZPSUQgQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCk7Ci0KLS8vCi0vLyBQcm90b3R5cGVzIG9mIGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gcnRtcF90a2lwLmMKLS8vCi1WT0lEICAgIFJUTVBJbml0VGtpcEVuZ2luZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBUS2V5LAotCUlOICBVQ0hBUiAgICAgICAgICAgS2V5SWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwVEEsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwTUlDS2V5LAotCUlOICBQVUNIQVIgICAgICAgICAgcFRTQywKLQlPVVQgUFVMT05HICAgICAgICAgIHBJVjE2LAotCU9VVCBQVUxPTkcgICAgICAgICAgcElWMzIpOwotCi1WT0lEICAgIFJUTVBJbml0TUlDRW5naW5lKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcEtleSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTQSwKLQlJTiAgVUNIQVIgICAgICAgICAgIFVzZXJQcmlvcml0eSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXkpOwotCi1CT09MRUFOIFJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTQSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXksCi0JSU4JVUNIQVIJCQlVc2VyUHJpb3JpdHksCi0JSU4gIFVJTlQgICAgICAgICAgICBMZW4pOwotCi1WT0lEICAgIFJUTVBDYWxjdWxhdGVNSUNWYWx1ZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRW5jYXAsCi0JSU4gIFBDSVBIRVJfS0VZICAgICBwS2V5LAotCUlOCVVDSEFSCQkJYXBpZHgpOwotCi1CT09MRUFOIFJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlV2l0aExMQygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBMTEMsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAotCUlOICBQVUNIQVIgICAgICAgICAgcERBLAotCUlOICBQVUNIQVIgICAgICAgICAgcFNBLAotCUlOICBQVUNIQVIgICAgICAgICAgcE1JQ0tleSwKLQlJTiAgVUlOVCAgICAgICAgICAgIExlbik7Ci0KLVZPSUQgICAgUlRNUFRraXBBcHBlbmRCeXRlKAotCUlOICBQVEtJUF9LRVlfSU5GTyAgcFRraXAsCi0JSU4gIFVDSEFSICAgICAgICAgICB1Q2hhcik7Ci0KLVZPSUQgICAgUlRNUFRraXBBcHBlbmQoCi0JSU4gIFBUS0lQX0tFWV9JTkZPICBwVGtpcCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCi0JSU4gIFVJTlQgICAgICAgICAgICBuQnl0ZXMpOwotCi1WT0lEICAgIFJUTVBUa2lwR2V0TUlDKAotCUlOICBQVEtJUF9LRVlfSU5GTyAgcFRraXApOwotCi1CT09MRUFOIFJUTVBTb2Z0RGVjcnlwdFRLSVAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSCXBEYXRhLAotCUlOIFVMT05HCURhdGFCeXRlQ250LAotCUlOIFVDSEFSICAgIFVzZXJQcmlvcml0eSwKLQlJTiBQQ0lQSEVSX0tFWQlwV3BhS2V5KTsKLQotQk9PTEVBTiBSVE1QU29mdERlY3J5cHRBRVMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSCXBEYXRhLAotCUlOIFVMT05HCURhdGFCeXRlQ250LAotCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpOwotCi0KLQotLy8KLS8vIFByb3RvdHlwZXMgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiBjbW1faW5mby5jCi0vLwotSU5UIFJUX0NmZ1NldENvdW50cnlSZWdpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZywKLQlJTiBJTlQJCQkJYmFuZCk7Ci0KLUlOVCBSVF9DZmdTZXRXaXJlbGVzc01vZGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBSVF9DZmdTZXRTaG9ydFNsb3QoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlSVF9DZmdTZXRXZXBLZXkoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWtleVN0cmluZywKLQlJTglDSVBIRVJfS0VZCQkqcFNoYXJlZEtleSwKLQlJTglJTlQJCQkJa2V5SWR4KTsKLQotSU5UIFJUX0NmZ1NldFdQQVBTS0tleSgKLQlJTiBSVE1QX0FEQVBURVIJKnBBZCwKLQlJTiBQU1RSSU5HCQlrZXlTdHJpbmcsCi0JSU4gVUNIQVIJCSpwSGFzaFN0ciwKLQlJTiBJTlQJCQloYXNoU3RyTGVuLAotCU9VVCBQVUNIQVIJCXBQTUtCdWYpOwotCi0KLQotLy8KLS8vIFByb3RvdHlwZXMgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiBjbW1faW5mby5jCi0vLwotTkRJU19TVEFUVVMgUlRNUFdQQVJlbW92ZUtleVByb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBWT0lEICAgICAgICAgICBwQnVmKTsKLQotVk9JRCAgICBSVE1QV1BBUmVtb3ZlQWxsS2V5cygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLUJPT0xFQU4gUlRNUENoZWNrU3RyUHJpbnRBYmxlKAotICAgIElOICBDSEFSICpwSW5QdXRTdHIsCi0gICAgSU4gIFVDSEFSIHN0ckxlbik7Ci0KLVZPSUQgICAgUlRNUFNldFBoeU1vZGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVMT05HIHBoeW1vZGUpOwotCi1WT0lECVJUTVBVcGRhdGVIVElFKAotCUlOCVJUX0hUX0NBUEFCSUxJVFkJKnBSdEh0LAotCUlOCQlVQ0hBUgkJCQkqcE1jc1NldCwKLQlPVVQJCUhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JT1VUCQlBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pOwotCi1WT0lECVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlCc3NJZHgsCi0JSU4JVUNIQVIJCQlLZXlJZHgsCi0JSU4JVUNIQVIJCQlDaXBoZXJBbGcsCi0JSU4JTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpOwotCi1QU1RSSU5HIEdldEVuY3J5cHRUeXBlKAotCUNIQVIgZW5jKTsKLQotUFNUUklORyBHZXRBdXRoTW9kZSgKLQlDSEFSIGF1dGgpOwotCi0KLVZPSUQgUlRNUEluZGljYXRlV1BBMlN0YXR1cygKLQlJTiAgUFJUTVBfQURBUFRFUiAgcEFkYXB0ZXIpOwotCi1WT0lECVJUTVBPUE1vZGVTd2l0Y2hpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLVZPSUQJUlRNUFNldEhUKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU9JRF9TRVRfSFRfUEhZTU9ERSAqcEhUUGh5TW9kZSk7Ci0KLVZPSUQJUlRNUFNldEluZGl2aWR1YWxIVCgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JVUNIQVIJCQkJYXBpZHgpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1WT0lEIFJUTVBTZW5kV2lyZWxlc3NFdmVudCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlFdmVudF9mbGFnLAotCUlOCVBVQ0hBUgkJCXBBZGRyLAotCUlOICBVQ0hBUgkJCUJzc0lkeCwKLQlJTglDSEFSCQkJUnNzaSk7Ci0KLVZPSUQJTklDVXBkYXRlQ250bENvdW50ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBIRUFERVJfODAyXzExCXBIZWFkZXIsCi0JSU4gICAgVUNIQVIJCQlTdWJUeXBlLAotCUlOCVBSWFdJX1NUUlVDCXBSeFdJKTsKLQotVk9JRCAgICBEQkdQUklOVF9UWF9SSU5HKAotCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgICBRdWVJZHgpOwotCi1WT0lEIERCR1BSSU5UX1JYX1JJTkcoCi0JSU4gUFJUTVBfQURBUFRFUiAgcEFkKTsKLQotQ0hBUiAgICBDb252ZXJ0VG9Sc3NpKAotCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKLQlJTiBDSEFSCQkJCVJzc2ksCi0JSU4gVUNIQVIgICAgUnNzaU51bWJlcik7Ci0KLQotI2lmZGVmIERPVDExTl9EUkFGVDMKLVZPSUQgQnVpbGRFZmZlY3RlZENoYW5uZWxMaXN0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0KLQotVk9JRCBBUEFzaWNFdmFsdWF0ZVJ4QW50KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotI2lmZGVmIEFOVF9ESVZFUlNJVFlfU1VQUE9SVAotVk9JRAlBUEFzaWNBbnRlbm5hQXZnKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCSAgICAgICAgICAgICAgQW50U2VsZWN0LAotCUlOCVNIT1JUCSAgICAgICAgICAgICAgKlJzc2lBdmcpOwotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwotCi1WT0lEIEFQQXNpY1J4QW50RXZhbFRpbWVvdXQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRnVuY3Rpb24gcHJvdG90eXBlIGluIGNtbV93cGEuYwotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotVk9JRAlSVE1QVG9XaXJlbGVzc1N0YSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotICAgIElOICBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKLSAgICBJTiAgUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAotICAgIElOICBVSU5UCQkJSGRyTGVuLAotICAgIElOICBQVUNIQVIJCQlwRGF0YSwKLSAgICBJTiAgVUlOVAkJCURhdGFMZW4sCi0gICAgSU4JQk9PTEVBTgkJCQliQ2xlYXJGcmFtZSk7Ci0KLVZPSUQgV3BhRGVyaXZlUFRLKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiAgICpQTUssCi0JSU4gIFVDSEFSICAgKkFOb25jZSwKLQlJTiAgVUNIQVIgICAqQUEsCi0JSU4gIFVDSEFSICAgKlNOb25jZSwKLQlJTiAgVUNIQVIgICAqU0EsCi0JT1VUIFVDSEFSICAgKm91dHB1dCwKLQlJTiAgVUlOVCAgICBsZW4pOwotCi1WT0lEICAgIEdlblJhbmRvbSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglVQ0hBUgkJCSptYWNBZGRyLAotCU9VVAlVQ0hBUgkJCSpyYW5kb20pOwotCi1CT09MRUFOIFJUTVBDaGVja1dQQWZyYW1lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAotCUlOIFBVQ0hBUgkJCXBEYXRhLAotCUlOIFVMT05HCQkJRGF0YUJ5dGVDb3VudCwKLQlJTiBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotVk9JRCBBRVNfR1RLX0tFWV9VTldSQVAoCi0JSU4gIFVDSEFSICAgKmtleSwKLQlPVVQgVUNIQVIgICAqcGxhaW50ZXh0LAotCUlOCVVJTlQzMgljX2xlbiwKLQlJTiAgVUNIQVIgICAqY2lwaGVydGV4dCk7Ci0KLUJPT0xFQU4gUlRNUFBhcnNlRWFwb2xLZXlEYXRhKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcEtleURhdGEsCi0JSU4gIFVDSEFSICAgICAgICAgICBLZXlEYXRhTGVuLAotCUlOCVVDSEFSCQkJR3JvdXBLZXlJbmRleCwKLQlJTglVQ0hBUgkJCU1zZ1R5cGUsCi0JSU4JQk9PTEVBTgkJCWJXUEEyLAotCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSk7Ci0KLVZPSUQJQ29uc3RydWN0RWFwb2xNc2coCi0JSU4JUE1BQ19UQUJMRV9FTlRSWQlwRW50cnksCi0gICAgSU4JVUNIQVIJCQkJR3JvdXBLZXlXZXBTdGF0dXMsCi0gICAgSU4JVUNIQVIJCQkJTXNnVHlwZSwKLSAgICBJTglVQ0hBUgkJCQlEZWZhdWx0S2V5SWR4LAotCUlOCVVDSEFSCQkJCSpLZXlOb25jZSwKLQlJTglVQ0hBUgkJCQkqVHhSU0MsCi0JSU4JVUNIQVIJCQkJKkdUSywKLQlJTglVQ0hBUgkJCQkqUlNOSUUsCi0JSU4JVUNIQVIJCQkJUlNOSUVfTGVuLAotICAgIE9VVCBQRUFQT0xfUEFDS0VUICAgICAgIHBNc2cpOwotCi1ORElTX1NUQVRVUwlSVE1QU29mdERlY3J5cHRCcm9hZENhc3REYXRhKAotCUlOCVBSVE1QX0FEQVBURVIJCQkJCXBBZCwKLQlJTglSWF9CTEsJCQkJCQkJKnBSeEJsaywKLQlJTiAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJR3JvdXBDaXBoZXIsCi0JSU4gIFBDSVBIRVJfS0VZCQkJCQkJcFNoYXJkX2tleSk7Ci0KLVZPSUQgUlRNUE1ha2VSU05JRSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUlOVCAgICAgICAgICAgIEF1dGhNb2RlLAotCUlOICBVSU5UICAgICAgICAgICAgV2VwU3RhdHVzLAotCUlOCVVDSEFSCQkJYXBpZHgpOwotCi0vLwotLy8gZnVuY3Rpb24gcHJvdG90eXBlIGluIGFwX3dwYS5jCi0vLwotVk9JRCBSVE1QR2V0VHhUc2NGcm9tQXNpYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglVQ0hBUgkJCWFwaWR4LAotCU9VVAlQVUNIQVIJCQlwVHhUc2MpOwotCi1WT0lEIEFQSW5zdGFsbFBhaXJ3aXNlS2V5KAotCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSk7Ci0KLU1BQ19UQUJMRV9FTlRSWSAqUEFDSW5xdWlyeSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUxPTkcgICAgICAgICAgIFdjaWQpOwotCi1VSU5UCUFQVmFsaWRhdGVSU05JRSgKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSwKLQlJTiBQVUNIQVIJCQlwUnNuSWUsCi0JSU4gVUNIQVIJCQlyc25pZV9sZW4pOwotCi1WT0lEIEhhbmRsZUNvdW50ZXJNZWFzdXJlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSk7Ci0KLVZPSUQgV1BBU3RhcnQ0V2F5SFMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LAotCUlOCVVMT05HCQkJVGltZUludGVydmFsKTsKLQotVk9JRCBXUEFTdGFydDJXYXlHcm91cEhTKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSk7Ci0KLVZPSUQgUGVlclBhaXJNc2cxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJQYWlyTXNnMkFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyUGFpck1zZzNBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgUGVlclBhaXJNc2c0QWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJHcm91cE1zZzFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCUlOICBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSwKLSAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7Ci0KLVZPSUQgUGVlckdyb3VwTXNnMkFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5LAotCUlOICBWT0lEICAgICAgICAgICAgICpNc2csCi0JSU4gIFVJTlQgICAgICAgICAgICAgTXNnTGVuKTsKLQotVk9JRCBDTVRpbWVyRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIFdQQVJldHJ5RXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIEVucXVldWVTdGFydEZvclBTS0V4ZWMoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBSVE1QSGFuZGxlU1RBS2V5KAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkYXB0ZXIsCi0gICAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOwotCi1WT0lEIFBhaXJEaXNBc3NvY0FjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5LAotCUlOICBVU0hPUlQgICAgICAgICAgIFJlYXNvbik7Ci0KLVZPSUQgTWxtZURlQXV0aEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5LAotCUlOICBVU0hPUlQgICAgICAgICAgIFJlYXNvbik7Ci0KLVZPSUQgR1JFS0VZUGVyaW9kaWNFeGVjKAotCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMSwKLQlJTiAgUFZPSUQgICBGdW5jdGlvbkNvbnRleHQsCi0JSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMyLAotCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMyk7Ci0KLVZPSUQgV3BhRGVyaXZlR1RLKAotCUlOICBVQ0hBUiAgICpQTUssCi0JSU4gIFVDSEFSICAgKkdOb25jZSwKLQlJTiAgVUNIQVIgICAqQUEsCi0JT1VUIFVDSEFSICAgKm91dHB1dCwKLQlJTiAgVUlOVCAgICBsZW4pOwotCi1WT0lEIEFFU19HVEtfS0VZX1dSQVAoCi0JSU4gVUNIQVIgKmtleSwKLQlJTiBVQ0hBUiAqcGxhaW50ZXh0LAotCUlOIFVJTlQzMiBwX2xlbiwKLQlPVVQgVUNIQVIgKmNpcGhlcnRleHQpOwotCi1WT0lEIEFFU18xMjhfQ01BQygKLQlJTglQVUNIQVIJa2V5LAotCUlOCVBVQ0hBUglpbnB1dCwKLQlJTglJTlQJCWxlbiwKLQlPVVQJUFVDSEFSCW1hYyk7Ci0KLVZPSUQgICAgV3BhU2VuZCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgcFBhY2tldCwKLSAgICBJTiAgVUxPTkcgICAgICAgICAgIExlbik7Ci0KLVZPSUQgUlRNUEFkZFBNS0lEQ2FjaGUoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglJTlQJCQkJCQlhcGlkeCwKLQlJTglQVUNIQVIJCQkJcEFkZHIsCi0JSU4JVUNIQVIJCQkJCSpQTUtJRCwKLQlJTglVQ0hBUgkJCQkJKlBNSyk7Ci0KLUlOVCBSVE1QU2VhcmNoUE1LSURDYWNoZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglJTlQJCQkJYXBpZHgsCi0JSU4JUFVDSEFSCQlwQWRkcik7Ci0KLVZPSUQgUlRNUERlbGV0ZVBNS0lEQ2FjaGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JSU5UCQkJCWFwaWR4LAotCUlOICBJTlQJCQkJaWR4KTsKLQotVk9JRCBSVE1QTWFpbnRhaW5QTUtJRENhY2hlKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRAlSVE1QU2VuZFRyaWdnZXJGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVk9JRAkJCXBCdWZmZXIsCi0JSU4JVUxPTkcJCQlMZW5ndGgsCi0JSU4gIFVDSEFSICAgICAgICAgICBUeFJhdGUsCi0JSU4JQk9PTEVBTgkJCWJRb3NOdWxsKTsKLQotLy90eXBlZGVmIHZvaWQgKCpUSU1FUl9GVU5DVElPTikodW5zaWduZWQgbG9uZyk7Ci0KLQotLyogdGltZW91dCAtLSBtcyAqLwotVk9JRCBSVE1QX1NldFBlcmlvZGljVGltZXIoCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUiAqcFRpbWVyLAotCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCk7Ci0KLVZPSUQgUlRNUF9PU19Jbml0X1RpbWVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKLQlJTglUSU1FUl9GVU5DVElPTiBmdW5jdGlvbiwKLQlJTglQVk9JRCBkYXRhKTsKLQotVk9JRCBSVE1QX09TX0FkZF9UaW1lcigKLQlJTglORElTX01JTklQT1JUX1RJTUVSCSpwVGltZXIsCi0JSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKLQotVk9JRCBSVE1QX09TX01vZF9UaW1lcigKLQlJTglORElTX01JTklQT1JUX1RJTUVSCSpwVGltZXIsCi0JSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKLQotCi1WT0lEIFJUTVBfT1NfRGVsX1RpbWVyKAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJKnBUaW1lciwKLQlPVVQJQk9PTEVBTgkJCQkgKnBDYW5jZWxsZWQpOwotCi0KLVZPSUQgUlRNUF9PU19SZWxlYXNlX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglQUVVFVUVfRU5UUlkgIHBFbnRyeSk7Ci0KLVZPSUQgUlRNUHVzZWNEZWxheSgKLQlJTglVTE9ORwl1c2VjKTsKLQotTkRJU19TVEFUVVMgb3NfYWxsb2NfbWVtKAotCUlOCVJUTVBfQURBUFRFUiAqcEFkLAotCU9VVAlVQ0hBUiAqKm1lbSwKLQlJTglVTE9ORyAgc2l6ZSk7Ci0KLU5ESVNfU1RBVFVTIG9zX2ZyZWVfbWVtKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVBWT0lEIG1lbSk7Ci0KLQotdm9pZCBSVE1QX0FsbG9jYXRlU2hhcmVkTWVtb3J5KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7Ci0KLVZPSUQgUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLU5ESVNfU1RBVFVTIEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KAotCUlOIFBWT0lECWhhbmRsZSwKLQlPVVQJUFZPSUQJKnBwQWQpOwotCi12b2lkIFJUTVBfQWxsb2NhdGVUeERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUlOVAlJbmRleCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOwotCi12b2lkIFJUTVBfQWxsb2NhdGVGaXJzdFR4QnVmZmVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVJTlQJSW5kZXgsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKLQotdm9pZCBSVE1QX0ZyZWVGaXJzdFR4QnVmZmVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlJTglQVk9JRAlWaXJ0dWFsQWRkcmVzcywKLQlJTglORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKLQotdm9pZCBSVE1QX0FsbG9jYXRlTWdtdERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKLQotdm9pZCBSVE1QX0FsbG9jYXRlUnhEZXNjTWVtb3J5KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7Ci0KLXZvaWQgUlRNUF9GcmVlRGVzY01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JUFZPSUQJVmlydHVhbEFkZHJlc3MsCi0JSU4JTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7Ci0KLVBORElTX1BBQ0tFVCBSdG1wT1NOZXRQa3RBbGxvYygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBpbnQgc2l6ZSk7Ci0KLVBORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKLQotUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVUeFBhY2tldEJ1ZmZlcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcyk7Ci0KLVBORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgpOwotCi12b2lkIFJUTVBfUXVlcnlQYWNrZXRJbmZvKAotCUlOICBQTkRJU19QQUNLRVQgcFBhY2tldCwKLQlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKLQlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKLQlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKTsKLQotdm9pZCBSVE1QX1F1ZXJ5TmV4dFBhY2tldEluZm8oCi0JSU4gIFBORElTX1BBQ0tFVCAqcHBQYWNrZXQsCi0JT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCi0JT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCi0JT1VUCVVJTlQJCSAqcFNyY0J1Zkxlbik7Ci0KLQotQk9PTEVBTiBSVE1QX0ZpbGxUeEJsa0luZm8oCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVFhfQkxLICpwVHhCbGspOwotCi0KLVBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QKLXJ0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KFBORElTX1BBQ0tFVCBwUGFja2V0LCBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QgKnNnKTsKLQotCi0gdm9pZCBhbm5vdW5jZV84MDJfM19wYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpOwotCi0KLVVJTlQgQkFfUmVvcmRlcl9BTVNEVV9Bbm5ub3VuY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpOwotCi0KLVVJTlQgSGFuZGxlX0FNU0RVX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURhdGFTaXplLAotCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotCi12b2lkIGNvbnZlcnRfODAyXzExX3RvXzgwMl8zX3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglQVUNIQVIJCQlwODAyM2hkciwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURhdGFTaXplLAotCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotCi1QTkVUX0RFViBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLQotUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3QoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAotICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGF0YVNpemUsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLQotUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3Rfd2l0aF9US0lQX01JQygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcE9sZFBrdCk7Ci0KLVBORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0X3dpdGhfVkxBTigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCi0gICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVUxPTkcJCQlEYXRhU2l6ZSwKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotCi1VQ0hBUiBWTEFOXzgwMjNfSGVhZGVyX0NvcHkoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAotCUlOCVVJTlQgICAgICAgICAgICBIZHJMZW4sCi0JT1VUIFBVQ0hBUgkJCXBEYXRhLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi12b2lkIGJhX2ZsdXNoX3Jlb3JkZXJpbmdfdGltZW91dF9tcGR1cygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBQQkFfUkVDX0VOVFJZCXBCQUVudHJ5LAotCUlOIFVMT05HCQkJTm93MzIpOwotCi0KLVZPSUQgQkFPcmlTZXNzaW9uU2V0VXAoCi0JCQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQkJCUlOIE1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCQkJSU4gVUNIQVIJCQlUSUQsCi0JCQlJTiBVU0hPUlQJCQlUaW1lT3V0LAotCQkJSU4gVUxPTkcJCQlEZWxheVRpbWUsCi0JCQlJTiBCT09MRUFOCQlpc0ZvcmNlZCk7Ci0KLVZPSUQgQkFTZXNzaW9uVGVhckRvd25BTEwoCi0JSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCQlVQ0hBUiBXY2lkKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotQk9PTEVBTiBPU19OZWVkX0Nsb25lX1BhY2tldCh2b2lkKTsKLQotCi1WT0lEIGJ1aWxkX3R4X3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglQVUNIQVIJcEZyYW1lLAotCUlOCVVMT05HCUZyYW1lTGVuKTsKLQotCi1WT0lEIEJBT3JpU2Vzc2lvblRlYXJEb3duKAotCUlOIE9VVAlQUlRNUF9BREFQVEVSCXBBZCwKLQlJTgkJVUNIQVIJCQlXY2lkLAotCUlOCQlVQ0hBUgkJCVRJRCwKLQlJTgkJQk9PTEVBTgkJCWJQYXNzaXZlLAotCUlOCQlCT09MRUFOCQkJYkZvcmNlU2VuZCk7Ci0KLVZPSUQgQkFSZWNTZXNzaW9uVGVhckRvd24oCi0JSU4gT1VUCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCQlVQ0hBUgkJCVdjaWQsCi0JSU4JCVVDSEFSCQkJVElELAotCUlOCQlCT09MRUFOCQkJYlBhc3NpdmUpOwotCi1CT09MRUFOIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfaW5pdChQUlRNUF9BREFQVEVSIHBBZCwgaW50IG51bSk7Ci12b2lkIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZShQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLQotCi0jaWZkZWYgTklOVEVORE9fQVAKLVZPSUQJSW5pdE5JTlRFTkRPX1RBQkxFKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVUNIQVIJQ2hlY2tOSU5URU5ET19UQUJMRSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlQQ0hBUiBwRFNfU3NpZCwKLQlVQ0hBUiBEU19Tc2lkTGVuLAotCVBVQ0hBUiBwRFNfQWRkcik7Ci0KLVVDSEFSCURlbE5JTlRFTkRPX0VOVFJZKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCVVDSEFSICogcERTX0FkZHIpOwotCi1WT0lECVJUTVBJb2N0bE5pbnRlbmRvQ2FwYWJsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0KLVZPSUQJUlRNUElvY3RsTmludGVuZG9HZXRUYWJsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0KLVZPSUQJUlRNUElvY3RsTmludGVuZG9TZXRUYWJsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0KLSNlbmRpZiAvLyBOSU5URU5ET19BUCAvLwotCi1CT09MRUFOIHJ0c3RybWFjdG9oZXgoCi0JSU4gUFNUUklORyBzMSwKLQlJTiBQU1RSSU5HIHMyKTsKLQotQk9PTEVBTiBydHN0cmNhc2VjbXAoCi0JSU4gUFNUUklORyBzMSwKLQlJTiBQU1RSSU5HIHMyKTsKLQotUFNUUklORyBydHN0cnN0cnVuY2FzZWNtcCgKLQlJTiBQU1RSSU5HIHMxLAotCUlOIFBTVFJJTkcgczIpOwotCi1QU1RSSU5HIHJ0c3Ryc3RyKAotCUlOCWNvbnN0IFBTVFJJTkcgczEsCi0JSU4JY29uc3QgUFNUUklORyBzMik7Ci0KLVBTVFJJTkcgcnN0cnRvaygKLQlJTiBQU1RSSU5HIHMsCi0JSU4gY29uc3QgUFNUUklORyBjdCk7Ci0KLWludCBydGluZXRfYXRvbigKLQljb25zdCBQU1RSSU5HIGNwLAotCXVuc2lnbmVkIGludCAqYWRkcik7Ci0KLS8vLy8vLy8vLy8gY29tbW9uIGlvY3RsIGZ1bmN0aW9ucyAvLy8vLy8vLy8vCi1JTlQgU2V0X0RyaXZlclZlcnNpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9Db3VudHJ5UmVnaW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfV2lyZWxlc3NNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfQ2hhbm5lbF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X1Nob3J0U2xvdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X1R4UG93ZXJfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9CR1Byb3RlY3Rpb25fUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOICBQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9UeFByZWFtYmxlX1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiAgUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfUlRTVGhyZXNob2xkX1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiAgUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jKAotCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gIFBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X1R4QnVyc3RfUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOICBQU1RSSU5HCQkJYXJnKTsKLQotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLUlOVAlTZXRfUGt0QWdncmVnYXRlX1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiAgUFNUUklORwkJCWFyZyk7Ci0jZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLwotCi0jaWZkZWYgSU5GX0FNQVpPTl9QUEEKLUlOVAlTZXRfSU5GX0FNQVpPTl9TRV9QUEFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi0jZW5kaWYgLy8gSU5GX0FNQVpPTl9QUEEgLy8KLQotSU5UCVNldF9JRUVFODAyMTFIX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLSNpZmRlZiBEQkcKLUlOVAlTZXRfRGVidWdfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLSNlbmRpZgotCi1JTlQJU2hvd19EZXNjSW5mb19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotSU5UCVNldF9CQVNldHVwX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQkFEZWNsaW5lX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQkFPcmlUZWFyRG93bl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0JBUmVjVGVhckRvd25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdEJ3X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRNY3NfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdEdpX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRPcE1vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdFN0YmNfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdEh0Y19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0h0RXh0Y2hhX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0h0QmFXaW5TaXplX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRSZGdfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdExpbmtBZGFwdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0h0QW1zZHVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdEF1dG9CYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0h0UHJvdGVjdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0h0TWltb1BzX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLQotSU5UCVNldF9Gb3JjZVNob3J0R0lfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9Gb3JjZUdGX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRDb21tb25IVCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLUlOVAlTZXRfU2VuZFBTTVBBY3Rpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdE1JTU9QU21vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotCi1JTlQJU2V0X0h0VHhCQVNpemVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdERpc2FsbG93VEtJUF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0vL0RscyAsCWthdGh5Ci1WT0lEIFJUTVBTZW5kRExTVGVhckRvd25GcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwREEpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0vL0Jsb2NrIEFDSwotVk9JRCBRdWVyeUJBVEFCTEUoCi0JSU4gIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQUVVFUllCQV9UQUJMRSBwQkFUKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLUlOVAkgICAgV3BhQ2hlY2tFYXBDb2RlKAotCUlOICBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgUFVDSEFSCQkJCXBGcmFtZSwKLQlJTiAgVVNIT1JUCQkJCUZyYW1lTGVuLAotCUlOICBVU0hPUlQJCQkJT2ZmU2V0KTsKLQotVk9JRCAgICBXcGFTZW5kTWljRmFpbHVyZVRvV3BhU3VwcGxpY2FudCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCi0gICAgSU4gIEJPT0xFQU4gICAgICAgICAgICAgYlVuaWNhc3QpOwotCi1WT0lEICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQpOwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi1pbnQgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MoCi0JSU4gIFJUTVBfQURBUFRFUiAqcEFkKTsKLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1WT0lEIEhhbmRsZV9CU1NfV2lkdGhfVHJpZ2dlcl9FdmVudHMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi12b2lkIGJ1aWxkX2V4dF9jaGFubmVsX3N3aXRjaF9pZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBIVF9FWFRfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UX0lFICpwSUUpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0KLUJPT0xFQU4gQVBSeERvbmVJbnRlcnJ1cHRIYW5kbGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwotCi1CT09MRUFOIFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglCT09MRUFOCQkJYXJnYyk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLS8vIEFNUERVIHBhY2tldCBpbmRpY2F0aW9uCi1WT0lEIEluZGljYXRlX0FNUERVX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi0vLyBBTVNEVSBwYWNrZXQgaW5kaWNhdGlvbgotVk9JRCBJbmRpY2F0ZV9BTVNEVV9QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotLy8gTm9ybWFsIGxlZ2FjeSBSeCBwYWNrZXQgaW5kaWNhdGlvbgotVk9JRCBJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLVZPSUQgSW5kaWNhdGVfRUFQT0xfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLXZvaWQgIHVwZGF0ZV9vc19wYWNrZXRfaW5mbygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi12b2lkIHdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKLQlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLVVJTlQgZGVhZ2dyZWdhdGVfQU1TRFVfYW5ub3VuY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JUE5ESVNfUEFDS0VUCQlwUGFja2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGF0YVNpemUpOwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLS8vIHJlbW92ZSBMTEMgYW5kIGdldCA4MDJfMyBIZWFkZXIKLSNkZWZpbmUgIFJUTVBfODAyXzExX1JFTU9WRV9MTENfQU5EX0NPTlZFUlRfVE9fODAyXzMoX3BSeEJsaywgX3BIZWFkZXI4MDJfMykJXAotewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCVBVQ0hBUiBfcFJlbW92ZWRMTENTTkFQID0gTlVMTCwgX3BEQSwgX3BTQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfTUVTSCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCV9wREEgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJX3BTQSA9IChQVUNIQVIpX3BSeEJsay0+cEhlYWRlciArIHNpemVvZihIRUFERVJfODAyXzExKTsgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfSU5GUkEpKQkJCQlcCi0JCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCV9wREEgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfRExTKSkJCQkJCQkJCQlcCi0JCQlfcFNBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjI7CQkJCQkJCQkJCVwKLQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJX3BTQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlfcERBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCV9wU0EgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCUNPTlZFUlRfVE9fODAyXzMoX3BIZWFkZXI4MDJfMywgX3BEQSwgX3BTQSwgX3BSeEJsay0+cERhdGEsCQkJCVwKLQkJX3BSeEJsay0+RGF0YVNpemUsIF9wUmVtb3ZlZExMQ1NOQVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLUJPT0xFQU4gQVBGb3dhcmRXaXJlbGVzc1N0YVRvV2lyZWxlc3NTdGEoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JVUxPTkcJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLVZPSUQgQW5ub3VuY2Vfb3JfRm9yd2FyZF84MDJfM19QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLVZPSUQgU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNkZWZpbmUgQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQoX3BBZCwgX3BQYWNrZXQsIF9Gcm9tV2hpY2hCU1MpXAotCQkJU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KF9wQWQsIF9wUGFja2V0LCBfRnJvbVdoaWNoQlNTKTsKLQkJCS8vYW5ub3VuY2VfODAyXzNfcGFja2V0KF9wQWQsIF9wUGFja2V0KTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi1QTkRJU19QQUNLRVQgRHVwbGljYXRlUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi0KLVBORElTX1BBQ0tFVCBDbG9uZVBhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURhdGFTaXplKTsKLQotCi0vLyBOb3JtYWwsIEFNUERVIG9yIEFNU0RVCi1WT0lEIENtbVJ4bm9uUmFsaW5rRnJhbWVJbmRpY2F0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi1WT0lEIENtbVJ4UmFsaW5rRnJhbWVJbmRpY2F0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi1WT0lEIFVwZGF0ZV9Sc3NpX1NhbXBsZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBSU1NJX1NBTVBMRQkJKnBSc3NpLAotCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSk7Ci0KLVBORElTX1BBQ0tFVCBHZXRQYWNrZXRGcm9tUnhSaW5nKAotCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJCVBSVDI4WFhfUlhEX1NUUlVDCQlwU2F2ZVJ4RCwKLQlPVVQJCUJPT0xFQU4JCQkqcGJSZXNjaGVkdWxlLAotCUlOIE9VVAlVSU5UMzIJCQkqcFJ4UGVuZGluZyk7Ci0KLVBORElTX1BBQ0tFVCBSVE1QRGVGcmFnbWVudERhdGFGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrKTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1WT0lEIFJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0KLQotCi0KLQotI2lmZGVmIFNOTVBfU1VQUE9SVAotLy9mb3Igc25tcCAsIGthdGh5Ci10eXBlZGVmIHN0cnVjdCBfRGVmYXVsdEtleUlkeFZhbHVlCi17Ci0JVUNIQVIJS2V5SWR4OwotCVVDSEFSCVZhbHVlWzE2XTsKLX0gRGVmYXVsdEtleUlkeFZhbHVlLCAqUERlZmF1bHRLZXlJZHhWYWx1ZTsKLSNlbmRpZgotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLWVudW0gewotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm0JCT0gMHgwMDAwMDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2hvc3R0aW1lCT0gMHgwMDAxMDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX21hY3RpbWUJPSAweDAwMDIwMDQ0LAotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbAk9IDB4MDAwMzAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpCQk9IDB4MDAwNDAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zcQkJPSAweDAwMDUwMDQ0LAotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fc2lnbmFsCT0gMHgwMDA2MDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX25vaXNlCQk9IDB4MDAwNzAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yYXRlCQk9IDB4MDAwODAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4CQk9IDB4MDAwOTAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9mcm1sZW4JPSAweDAwMEEwMDQ0Ci19OwotZW51bSB7Ci0JUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19ub192YWx1ZQk9IDB4MDAKLX07Ci1lbnVtIHsKLQlQODAyMTFFTlVNX3RydXRoX2ZhbHNlCQkJPSAweDAwLAotCVA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZQkJCT0gMHgwMQotfTsKLQotLyogRGVmaW5pdGlvbiBmcm9tIG1hZHdpZmkgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgVUlOVDMyIGRpZDsKLSAgICAgICAgVUlOVDE2IHN0YXR1czsKLSAgICAgICAgVUlOVDE2IGxlbjsKLSAgICAgICAgVUlOVDMyIGRhdGE7Ci19IHA4MDIxMWl0ZW1fdWludDMyX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgVUlOVDMyIG1zZ2NvZGU7Ci0gICAgICAgIFVJTlQzMiBtc2dsZW47Ci0jZGVmaW5lIFdMQU5fREVWTkFNRUxFTl9NQVggMTYKLSAgICAgICAgVUlOVDggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBob3N0dGltZTsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBtYWN0aW1lOwotICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGNoYW5uZWw7Ci0gICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgcnNzaTsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBzcTsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBzaWduYWw7Ci0gICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3Qgbm9pc2U7Ci0gICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgcmF0ZTsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBpc3R4OwotICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGZybWxlbjsKLX0gd2xhbl9uZ19wcmlzbTJfaGVhZGVyOwotCi0vKiBUaGUgcmFkaW8gY2FwdHVyZSBoZWFkZXIgcHJlY2VkZXMgdGhlIDgwMi4xMSBoZWFkZXIuICovCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX2llZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgewotICAgIFVJTlQ4CWl0X3ZlcnNpb247CS8qIFZlcnNpb24gMC4gT25seSBpbmNyZWFzZXMKLQkJCQkgKiBmb3IgZHJhc3RpYyBjaGFuZ2VzLAotCQkJCSAqIGludHJvZHVjdGlvbiBvZiBjb21wYXRpYmxlCi0JCQkJICogbmV3IGZpZWxkcyBkb2VzIG5vdCBjb3VudC4KLQkJCQkgKi8KLSAgICBVSU5UOAlpdF9wYWQ7Ci0gICAgVUlOVDE2ICAgICBpdF9sZW47ICAgICAgICAgLyogbGVuZ3RoIG9mIHRoZSB3aG9sZQotCQkJCSAqIGhlYWRlciBpbiBieXRlcywgaW5jbHVkaW5nCi0JCQkJICogaXRfdmVyc2lvbiwgaXRfcGFkLAotCQkJCSAqIGl0X2xlbiwgYW5kIGRhdGEgZmllbGRzLgotCQkJCSAqLwotICAgIFVJTlQzMiAgIGl0X3ByZXNlbnQ7CS8qIEEgYml0bWFwIHRlbGxpbmcgd2hpY2gKLQkJCQkJICogZmllbGRzIGFyZSBwcmVzZW50LiBTZXQgYml0IDMxCi0JCQkJCSAqICgweDgwMDAwMDAwKSB0byBleHRlbmQgdGhlCi0JCQkJCSAqIGJpdG1hcCBieSBhbm90aGVyIDMyIGJpdHMuCi0JCQkJCSAqIEFkZGl0aW9uYWwgZXh0ZW5zaW9ucyBhcmUgbWFkZQotCQkJCQkgKiBieSBzZXR0aW5nIGJpdCAzMS4KLQkJCQkJICovCi19aWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciA7Ci0KLWVudW0gaWVlZTgwMjExX3JhZGlvdGFwX3R5cGUgewotICAgIElFRUU4MDIxMV9SQURJT1RBUF9UU0ZUID0gMCwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MgPSAxLAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9SQVRFID0gMiwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfQ0hBTk5FTCA9IDMsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0ZIU1MgPSA0LAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UU0lHTkFMID0gNSwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVE5PSVNFID0gNiwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfTE9DS19RVUFMSVRZID0gNywKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfVFhfQVRURU5VQVRJT04gPSA4LAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQl9UWF9BVFRFTlVBVElPTiA9IDksCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0RCTV9UWF9QT1dFUiA9IDEwLAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9BTlRFTk5BID0gMTEsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVFNJR05BTCA9IDEyLAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlROT0lTRSA9IDEzCi19OwotCi0jZGVmaW5lIFdMQU5fUkFESU9UQVBfUFJFU0VOVCAoCQkJXAotCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9UU0ZUKQl8CVwKLQkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MpIHwJXAotCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9SQVRFKSAgfAlcCi0JIDApCi0KLXR5cGVkZWYgc3RydWN0IF93bGFuX3JhZGlvdGFwX2hlYWRlciB7Ci0JaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciB3dF9paGRyOwotCUlOVDY0IHd0X3RzZnQ7Ci0JVUlOVDggd3RfZmxhZ3M7Ci0JVUlOVDggd3RfcmF0ZTsKLX0gd2xhbl9yYWRpb3RhcF9oZWFkZXI7Ci0vKiBEZWZpbml0aW9uIGZyb20gbWFkd2lmaSAqLwotCi12b2lkIHNlbmRfbW9uaXRvcl9wYWNrZXRzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGspOwotCi0KLVZPSUQgICAgUlRNUFNldERlc2lyZWRSYXRlcygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBMT05HICAgICAgICAgICAgUmF0ZXMpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi1JTlQJU2V0X0ZpeGVkVHhNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLSNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAotSU5UCVNldF9PcE1vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLSNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLwotCi1JTlQgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1CT09MRUFOIFJUMjhYWENoaXBzZXRDaGVjaygKLQlJTiB2b2lkICpfZGV2X3ApOwotCi0KLVZPSUQgUlQyOFhYRE1BRGlzYWJsZSgKLQlJTiBSVE1QX0FEQVBURVIJCQkqcEFkKTsKLQotVk9JRCBSVDI4WFhETUFFbmFibGUoCi0JSU4gUlRNUF9BREFQVEVSCQkJKnBBZCk7Ci0KLVZPSUQgUlQyOHh4X1VwZGF0ZUJlYWNvblRvQXNpYygKLQlJTiBSVE1QX0FEQVBURVIgKiBwQWQsCi0JSU4gSU5UIGFwaWR4LAotCUlOIFVMT05HIEJlYWNvbkxlbiwKLQlJTiBVTE9ORyBVcGRhdGVQb3MpOwotCi1pbnQgcnQyOHh4X2luaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFNUUklORyBwRGVmYXVsdE1hYywKLQlJTiBQU1RSSU5HIHBIb3N0TmFtZSk7Ci0KLUJPT0xFQU4gUlQyOFhYU2VjdXJpdHlLZXlBZGQoCi0JSU4JCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTgkJVUxPTkcJCQkJYXBpZHgsCi0JSU4JCVVMT05HCQkJCUtleUlkeCwKLQlJTgkJTUFDX1RBQkxFX0VOVFJZCQkqcEVudHJ5KTsKLQotTkRJU19TVEFUVVMgUnRtcE5ldFRhc2tJbml0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKLQotVk9JRCBSdG1wTmV0VGFza0V4aXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1ORElTX1NUQVRVUyBSdG1wTWdtdFRhc2tJbml0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKLQotVk9JRCBSdG1wTWdtdFRhc2tFeGl0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKLQotdm9pZCB0YnR0X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLQotCi1QTkVUX0RFViBSdG1wUGh5TmV0RGV2SW5pdCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBSVE1QX09TX05FVERFVl9PUF9IT09LICpwTmV0SG9vayk7Ci0KLUJPT0xFQU4gUnRtcFBoeU5ldERldkV4aXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUE5FVF9ERVYgbmV0X2Rldik7Ci0KLUlOVCBSdG1wUmFEZXZDdHJsSW5pdCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBSVE1QX0lORl9UWVBFIGluZlR5cGUpOwotCi1CT09MRUFOIFJ0bXBSYURldkN0cmxFeGl0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKLQotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0vLwotLy8gRnVuY3Rpb24gUHJvdG90eXBlIGluIGNtbV9kYXRhX3BjaS5jCi0vLwotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JQk9PTEVBTgkJCWJJc0xhc3QsCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKLQotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVTaW5nbGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JQk9PTEVBTgkJCWJJc0xhc3QsCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKLQotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVNdWx0aVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYW1lTnVtLAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7Ci0KLVVTSE9SVAlSdG1wUENJX1dyaXRlRnJhZ1R4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYWdOdW0sCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKLQotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVTdWJUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JQk9PTEVBTgkJCWJJc0xhc3QsCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKLQotVk9JRCBSdG1wUENJX0ZpbmFsV3JpdGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVVNIT1JUCQkJdG90YWxNUERVU2l6ZSwKLQlJTglVU0hPUlQJCQlGaXJzdFR4SWR4KTsKLQotVk9JRCBSdG1wUENJRGF0YUxhc3RUeElkeCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglVU0hPUlQJCQlMYXN0VHhJZHgpOwotCi1WT0lEIFJ0bXBQQ0lEYXRhS2lja091dCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVDSEFSCQkJUXVlSWR4KTsKLQotCi1pbnQgUnRtcFBDSU1nbXRLaWNrT3V0KAotCUlOIFJUTVBfQURBUFRFUgkJKnBBZCwKLQlJTiBVQ0hBUgkJCVF1ZUlkeCwKLQlJTiBQTkRJU19QQUNLRVQJCXBQYWNrZXQsCi0JSU4gUFVDSEFSCQkJcFNyY0J1ZlZBLAotCUlOIFVJTlQJCQkJU3JjQnVmTGVuKTsKLQotCi1ORElTX1NUQVRVUyBSVE1QQ2hlY2tSeEVycm9yKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQSEVBREVSXzgwMl8xMSAgcEhlYWRlciwKLQlJTglQUlhXSV9TVFJVQwlwUnhXSSwKLQlJTiAgUFJUMjhYWF9SWERfU1RSVUMgICAgICBwUnhEKTsKLQotQk9PTEVBTiBSVDI4eHhQY2lBc2ljUmFkaW9PZmYoCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gVUNIQVIgICAgICAgICAgICBMZXZlbCwKLQlJTiBVU0hPUlQgICAgICAgICAgIFRidHROdW1Ub05leHRXYWtlVXApOwotCi1CT09MRUFOIFJUMjh4eFBjaUFzaWNSYWRpb09uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSICAgICBMZXZlbCk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLVZPSUQgUlRNUEluaXRQQ0llTGlua0N0cmxWYWx1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgUlRNUEZpbmRIb3N0UENJRGV2KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgVUNIQVIJCUxldmVsKTsKLQotVk9JRCBSVE1QUENJZUxpbmtDdHJsU2V0dGluZygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCU1heCk7Ci0KLVZPSUQgUlRNUHJ0M3hTZXRQQ0llUG93ZXJMaW5rQ3RybCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLQotVk9JRCBSVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gQk9PTEVBTiAgICAgICBiRnJvbVR4KTsKLQotVk9JRCBSVDI4eHhQY2lTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCk7Ci0KLVZPSUQgUHNQb2xsV2FrZUV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCAgUmFkaW9PbkV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotVk9JRCBSVDI4eHhQY2lNbG1lUmFkaW9PbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgUlQyOHh4UGNpTWxtZVJhZGlvT0ZGKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotVk9JRCBBc2ljVHVybk9mZlJGQ2xrKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCUlOCVVDSEFSICAgICAgICAgICBDaGFubmVsKTsKLQotVk9JRCBBc2ljVHVybk9uUkZDbGsoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlDaGFubmVsKTsKLQotCi0KLSNpZmRlZiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVAotSU5UIFJ0bXBUaW1lclFUaHJlYWQoCi0JSU4gT1VUIFBWT0lEIENvbnRleHQpOwotCi1SVE1QX1RJTUVSX1RBU0tfRU5UUlkgKlJ0bXBUaW1lclFJbnNlcnQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUkFMSU5LX1RJTUVSX1NUUlVDVCAqcFRpbWVyKTsKLQotQk9PTEVBTiBSdG1wVGltZXJRUmVtb3ZlKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFJBTElOS19USU1FUl9TVFJVQ1QgKnBUaW1lcik7Ci0KLXZvaWQgUnRtcFRpbWVyUUV4aXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOwotCi12b2lkIFJ0bXBUaW1lclFJbml0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKLSNlbmRpZiAvLyBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLwotCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1WT0lEIFFCU1NfTG9hZEluaXQoCi0JSU4JCVJUTVBfQURBUFRFUgkqcEFkKTsKLQotVUlOVDMyIFFCU1NfTG9hZEVsZW1lbnRBcHBlbmQoCi0JSU4JCVJUTVBfQURBUFRFUgkqcEFkLAotCU9VVAkJVUlOVDgJCQkqYnVmX3ApOwotCi1WT0lEIFFCU1NfTG9hZFVwZGF0ZSgKLQlJTgkJUlRNUF9BREFQVEVSCSpwQWQpOwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLUlOVCBSVE1QU2hvd0NmZ1ZhbHVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlwTmFtZSwKLQlJTglQU1RSSU5HCQkJcEJ1Zik7Ci0KLVBTVFJJTkcgUlRNUEdldFJhbGlua0F1dGhNb2RlU3RyKAotICAgIElOICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIGF1dGhNb2RlKTsKLQotUFNUUklORyBSVE1QR2V0UmFsaW5rRW5jcnlNb2RlU3RyKAotICAgIElOICBVU0hPUlQgZW5jcnlNb2RlKTsKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLVZPSUQgQXNpY1N0YUJicFR1bmluZygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLUJPT0xFQU4gU3RhQWRkTWFjVGFibGVFbnRyeSgKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOICBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKLQlJTiAgVUNIQVIJCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywKLQlJTiAgSFRfQ0FQQUJJTElUWV9JRQkqcEh0Q2FwYWJpbGl0eSwKLQlJTiAgVUNIQVIJCQkJSHRDYXBhYmlsaXR5TGVuLAotCUlOICBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8sCi0JSU4gIFVDSEFSCQkJCUFkZEh0SW5mb0xlbiwKLQlJTiAgVVNIT1JUCQkJQ2FwYWJpbGl0eUluZm8pOwotCi0KLUJPT0xFQU4JQVVUSF9SZXFTZW5kKAotCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gIFBNTE1FX1FVRVVFX0VMRU0JcEVsZW0sCi0JSU4gIFBSQUxJTktfVElNRVJfU1RSVUNUIHBBdXRoVGltZXIsCi0JSU4gIFBTVFJJTkcJCQkJcFNNTmFtZSwKLQlJTiAgVVNIT1JUCQkJCVNlcU5vLAotCUlOICBQVUNIQVIJCQkJcE5ld0VsZW1lbnQsCi0JSU4gIFVMT05HCQkJCUVsZW1lbnRMZW4pOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi12b2lkIFJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBSZVN5bmNCZWFjb25UaW1lKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBSVE1QU2V0QUdDSW5pdFZhbHVlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJQmFuZFdpZHRoKTsKLQotaW50IHJ0Mjh4eF9jbG9zZShJTiBQTkVUX0RFViBkZXYpOwotaW50IHJ0Mjh4eF9vcGVuKElOIFBORVRfREVWIGRldik7Ci0KLQotI2RlZmluZSBWSVJUVUFMX0lGX0lOQyhfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudCsrKQotI2RlZmluZSBWSVJUVUFMX0lGX0RFQyhfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudC0tKQotI2RlZmluZSBWSVJUVUFMX0lGX05VTShfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudCkKLQotCi0jaWZkZWYgTElOVVgKLV9faW5saW5lIElOVCBWSVJUVUFMX0lGX1VQKFBSVE1QX0FEQVBURVIgcEFkKQotewotCWlmIChWSVJUVUFMX0lGX05VTShwQWQpID09IDApCi0JewotCQlpZiAocnQyOHh4X29wZW4ocEFkLT5uZXRfZGV2KSAhPSAwKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydDI4eHhfb3BlbiByZXR1cm4gZmFpbCFcbiIpKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQllbHNlCi0JewotCX0KLQlWSVJUVUFMX0lGX0lOQyhwQWQpOwotCXJldHVybiAwOwotfQotCi1fX2lubGluZSBWT0lEIFZJUlRVQUxfSUZfRE9XTihQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlWSVJUVUFMX0lGX0RFQyhwQWQpOwotCWlmIChWSVJUVUFMX0lGX05VTShwQWQpID09IDApCi0JCXJ0Mjh4eF9jbG9zZShwQWQtPm5ldF9kZXYpOwotCXJldHVybjsKLX0KLSNlbmRpZiAvLyBMSU5VWCAvLwotCi0KLQotCi0vKgotCU9TIFJlbGF0ZWQgZnVuY2l0b24gcHJvdG90eXBlIGRlZmluaXRpb25zLgotCVRPRE86IE1heWJlIHdlIG5lZWQgdG8gbW92ZSB0aGVzZSBmdW5jdGlvbiBwcm90b3R5cGVzIHRvIG90aGVyIHByb3BlciBwbGFjZS4KLSovCi1pbnQgUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVUlOVDMyCQlldmVudFR5cGUsCi0JSU4gSU5UCQkJZmxhZ3MsCi0JSU4gUFVDSEFSCQlwU3JjTWFjLAotCUlOIFBVQ0hBUgkJcERhdGEsCi0JSU4gVUlOVDMyCQlkYXRhTGVuKTsKLQotaW50IFJ0bXBPU05ldERldkFkZHJTZXQoCi0JSU4gUE5FVF9ERVYgcE5ldERldiwKLQlJTiBQVUNIQVIJcE1hY0FkZHIpOwotCi1pbnQgUnRtcE9TTmV0RGV2QXR0YWNoKAotCUlOIFBORVRfREVWIHBOZXREZXYsCi0JSU4gUlRNUF9PU19ORVRERVZfT1BfSE9PSyAqcERldk9wSG9vayk7Ci0KLXZvaWQgUnRtcE9TTmV0RGV2Q2xvc2UoCi0JSU4gUE5FVF9ERVYgcE5ldERldik7Ci0KLXZvaWQgUnRtcE9TTmV0RGV2RGV0YWNoKAotCUlOIFBORVRfREVWIHBOZXREZXYpOwotCi1JTlQgUnRtcE9TTmV0RGV2QWxsb2MoCi0JSU4gUE5FVF9ERVYgKnBOZXdOZXREZXYsCi0JSU4gVUlOVDMyCXByaXZEYXRhU2l6ZSk7Ci0KLXZvaWQgUnRtcE9TTmV0RGV2RnJlZSgKLQlJTiBQTkVUX0RFViBwTmV0RGV2KTsKLQotUE5FVF9ERVYgUnRtcE9TTmV0RGV2R2V0QnlOYW1lKAotCUlOIFBORVRfREVWIHBOZXREZXYsCi0JSU4gUFNUUklORwlwRGV2TmFtZSk7Ci0KLXZvaWQgUnRtcE9TTmV0RGV2aWNlUmVmUHV0KAotCUlOIFBORVRfREVWIHBOZXREZXYpOwotCi1QTkVUX0RFViBSdG1wT1NOZXREZXZDcmVhdGUoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gSU5UCQkJZGV2VHlwZSwKLQlJTiBJTlQJCQlkZXZOdW0sCi0JSU4gSU5UCQkJcHJpdk1lbVNpemUsCi0JSU4gUFNUUklORwkJcE5hbWVQcmVmaXgpOwotCi0vKgotCVRhc2sgb3BlcmF0aW9uIHJlbGF0ZWQgZnVuY3Rpb24gcHJvdG90eXBlcwotKi8KLXZvaWQgUnRtcE9TVGFza0N1c3RvbWl6ZSgKLQlJTiBSVE1QX09TX1RBU0sgKnBUYXNrKTsKLQotSU5UIFJ0bXBPU1Rhc2tOb3RpZnlUb0V4aXQoCi0JSU4gUlRNUF9PU19UQVNLICpwVGFzayk7Ci0KLU5ESVNfU1RBVFVTIFJ0bXBPU1Rhc2tLaWxsKAotCUlOIFJUTVBfT1NfVEFTSyAqcFRhc2spOwotCi1ORElTX1NUQVRVUyBSdG1wT1NUYXNrSW5pdCgKLQlJTiBSVE1QX09TX1RBU0sgKnBUYXNrLAotCVBTVFJJTkcJCQkgcFRhc2tOYW1lLAotCVZPSUQJCQkgKnBQcml2KTsKLQotTkRJU19TVEFUVVMgUnRtcE9TVGFza0F0dGFjaCgKLQlJTiBSVE1QX09TX1RBU0sgKnBUYXNrLAotCUlOIGludCAoKmZuKSh2b2lkICopLAotCUlOIHZvaWQgKmFyZyk7Ci0KLQotLyoKLQlGaWxlIG9wZXJhdGlvbiByZWxhdGVkIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSovCi1SVE1QX09TX0ZEIFJ0bXBPU0ZpbGVPcGVuKAotCUlOIGNoYXIgKnBQYXRoLAotCUlOIGludCBmbGFnLAotCUlOIGludCBtb2RlKTsKLQotaW50IFJ0bXBPU0ZpbGVDbG9zZSgKLQlJTiBSVE1QX09TX0ZEIG9zZmQpOwotCi12b2lkIFJ0bXBPU0ZpbGVTZWVrKAotCUlOIFJUTVBfT1NfRkQgb3NmZCwKLQlJTiBpbnQgb2Zmc2V0KTsKLQotaW50IFJ0bXBPU0ZpbGVSZWFkKAotCUlOIFJUTVBfT1NfRkQgb3NmZCwKLQlJTiBjaGFyICpwRGF0YVB0ciwKLQlJTiBpbnQgcmVhZExlbik7Ci0KLWludCBSdG1wT1NGaWxlV3JpdGUoCi0JSU4gUlRNUF9PU19GRCBvc2ZkLAotCUlOIGNoYXIgKnBEYXRhUHRyLAotCUlOIGludCB3cml0ZUxlbik7Ci0KLXZvaWQgUnRtcE9TRlNJbmZvQ2hhbmdlKAotCUlOIFJUTVBfT1NfRlNfSU5GTyAqcE9TRlNJbmZvLAotCUlOIEJPT0xFQU4gYlNldCk7Ci0KLQotI2VuZGlmICAvLyBfX1JUTVBfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfY2hpcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX2NoaXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiNGJmMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfY2hpcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JcnRtcF9jaGlwLmgKLQotCUFic3RyYWN0OgotCVJhbGluayBXaXJlbGVzcyBDaGlwIHJlbGF0ZWQgZGVmaW5pdGlvbiAmIHN0cnVjdHVyZXMKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJICBXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpZm5kZWYJX19SVE1QX0NISVBfSF9fCi0jZGVmaW5lCV9fUlRNUF9DSElQX0hfXwotCi0jaW5jbHVkZSAicnRtcF90eXBlLmgiCi0KLSNpZmRlZiBSVDMwOTAKLSNpbmNsdWRlICJydDMwOTAuaCIKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLQotI2lmZGVmIFJUMzM3MAotI2luY2x1ZGUgInJ0MzM3MC5oIgotI2VuZGlmIC8vIFJUMzM3MCAvLwotCi0jaWZkZWYgUlQzMzkwCi0jaW5jbHVkZSAicnQzMzkwLmgiCi0jZW5kaWYgLy8gUlQzMzkwIC8vCi0KLS8vIFdlIHdpbGwgaGF2ZSBhIGNvc3QgZG93biB2ZXJzaW9uIHdoaWNoIG1hYyB2ZXJzaW9uIGlzIDB4MzA5MHh4eHgKLS8vCi0vLyBSVDMwOTBBIGZhY3RzCi0vLwotLy8gYSkgMi40IEdIegotLy8gYikgUmVwbGFjZW1lbnQgZm9yIFJUMzA5MAotLy8gYykgSW50ZXJuYWwgTE5BCi0vLyBkKSBJbnRlcmZlcmVuY2Ugb3ZlciBjaGFubmVsICMxNAotLy8gZSkgTmV3IEJCUCBmZWF0dXJlcyAoZS5nLiwgU0lHIHJlLW1vZHVsYXRpb24pCi0vLwotI2RlZmluZSBJU19SVDMwOTBBKF9wQWQpCQkJCSgoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzA5MDAwMDApKQotCi0vLyBXZSB3aWxsIGhhdmUgYSBjb3N0IGRvd24gdmVyc2lvbiB3aGljaCBtYWMgdmVyc2lvbiBpcyAweDMwOTB4eHh4Ci0jZGVmaW5lIElTX1JUMzA5MChfcEFkKQkJCQkoKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZmYwMDAwKSA9PSAweDMwNzEwMDAwKSB8fCAoSVNfUlQzMDkwQShfcEFkKSkpCi0KLSNkZWZpbmUgSVNfUlQzMDcwKF9wQWQpCQkoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzA3MDAwMDApCi0jZGVmaW5lIElTX1JUMzA3MShfcEFkKQkJKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZmYwMDAwKSA9PSAweDMwNzEwMDAwKQotI2RlZmluZSBJU19SVDIwNzAoX3BBZCkJCSgoKF9wQWQpLT5SZkljVHlwZSA9PSBSRklDXzIwMjApIHx8ICgoX3BBZCktPkVGdXNlVGFnID09IDB4MjcpKQotCi0jZGVmaW5lIElTX1JUMzB4eChfcEFkKQkJKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZjAwMDAwKSA9PSAweDMwNzAwMDAwfHxJU19SVDMwOTBBKF9wQWQpKQotLy8jZGVmaW5lIElTX1JUMzA1WChfcEFkKQkJKChfcEFkKS0+TUFDVmVyc2lvbiA9PSAweDI4NzIwMjAwKQotCi0vKiBSVDM1NzIsIDM1OTIsIDM1NjIsIDMwNjIgc2hhcmUgdGhlIHNhbWUgTUFDIHZlcnNpb24gKi8KLSNkZWZpbmUgSVNfUlQzNTcyKF9wQWQpCQkoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzU3MjAwMDApCi0jZGVmaW5lIElTX1ZFUlNJT05fQkVGT1JFX0YoX3BBZCkJCQkoKChfcEFkKS0+TUFDVmVyc2lvbiYweGZmZmYpIDw9IDB4MDIxMSkKLS8vIEYgdmVyc2lvbiBpcyAweDAyMTIsIEUgdmVyc2lvbiBpcyAweDAyMTEuIDMwOXggY2FuIHNhdmUgbW9yZSBwb3dlciBhZnRlciBGIHZlcnNpb24uCi0jZGVmaW5lIElTX1ZFUlNJT05fQUZURVJfRihfcEFkKQkJCSgoKChfcEFkKS0+TUFDVmVyc2lvbiYweGZmZmYpID49IDB4MDIxMikgfHwgKCgoX3BBZCktPmIzMDkwRVNwZWNpYWxDaGlwID09IFRSVUUpKSkKLS8vCi0vLyBSVDMzOTAgZmFjdHMKLS8vCi0vLyBhKSBCYXNlIG9uIFJUMzA5MCAoUkYgSUM6IFJUMzAyMCkKLS8vIGIpIDIuNCBHSHoKLS8vIGMpIDF4MQotLy8gZCkgU2luZ2xlIGNoaXAKLS8vIGUpIEludGVybmFsIGNvbXBvbmVudHM6IFBBIGFuZCBMTkEKLS8vCi0vL1JUMzM5MCxSVDMzNzAKLSNkZWZpbmUgSVNfUlQzMzkwKF9wQWQpCQkJCSgoKF9wQWQpLT5NQUNWZXJzaW9uICYgMHhGRkZGMDAwMCkgPT0gMHgzMzkwMDAwMCkKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQQ0kgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MDAwMAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jZGVmaW5lIENISVBfUENJX0NGRwkJMHgwMDAwCi0jZGVmaW5lIENISVBfUENJX0VFQ1RSTAkJMHgwMDA0Ci0jZGVmaW5lIENISVBfUENJX01DVUNUUkwJMHgwMDA4Ci0KLSNkZWZpbmUgT1BUXzE0CQkJMHgxMTQKLQotI2RlZmluZSBSRVRSWV9MSU1JVAkJMTAKLQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQkJQICYgUkYJZGVmaW5pdGlvbgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jZGVmaW5lCUJVU1kJCSAgICAgICAgICAgICAgICAxCi0jZGVmaW5lCUlETEUJCSAgICAgICAgICAgICAgICAwCi0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFRVBST00gZGVmaW5pdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jZGVmaW5lIEVFRE8gICAgICAgICAgICAgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIEVFREkgICAgICAgICAgICAgICAgICAgICAgICAweDA0Ci0jZGVmaW5lIEVFQ1MgICAgICAgICAgICAgICAgICAgICAgICAweDAyCi0jZGVmaW5lIEVFU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIEVFUkwgICAgICAgICAgICAgICAgICAgICAgICAweDgwCi0KLSNkZWZpbmUgRUVQUk9NX1dSSVRFX09QQ09ERSAgICAgICAgIDB4MDUKLSNkZWZpbmUgRUVQUk9NX1JFQURfT1BDT0RFICAgICAgICAgIDB4MDYKLSNkZWZpbmUgRUVQUk9NX0VXRFNfT1BDT0RFICAgICAgICAgIDB4MTAKLSNkZWZpbmUgRUVQUk9NX0VXRU5fT1BDT0RFICAgICAgICAgIDB4MTMKLQotI2RlZmluZSBOVU1fRUVQUk9NX0JCUF9QQVJNUwkJMTkJCQkvLyBJbmNsdWRlIE5JQyBDb25maWcgMCwgMSwgQ1IsIFRYIEFMQyBzdGVwLCBCQlBzCi0jZGVmaW5lIE5VTV9FRVBST01fVFhfR19QQVJNUwkJNwotI2RlZmluZSBFRVBST01fTklDMV9PRkZTRVQgICAgICAgICAgMHgzNAkJLy8gVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQKLSNkZWZpbmUgRUVQUk9NX05JQzJfT0ZGU0VUICAgICAgICAgIDB4MzYJCS8vIFRoZSBhZGRyZXNzIGlzIGZyb20gTklDIGNvbmZpZyAwLCBub3QgQkJQIHJlZ2lzdGVyIElECi0jZGVmaW5lIEVFUFJPTV9CQlBfQkFTRV9PRkZTRVQJCTB4ZjAJCS8vIFRoZSBhZGRyZXNzIGlzIGZyb20gTklDIGNvbmZpZyAwLCBub3QgQkJQIHJlZ2lzdGVyIElECi0jZGVmaW5lIEVFUFJPTV9HX1RYX1BXUl9PRkZTRVQJCTB4NTIKLSNkZWZpbmUgRUVQUk9NX0dfVFgyX1BXUl9PRkZTRVQJCTB4NjAKLSNkZWZpbmUgRUVQUk9NX0xFRDFfT0ZGU0VUCQkJMHgzYwotI2RlZmluZSBFRVBST01fTEVEMl9PRkZTRVQJCQkweDNlCi0jZGVmaW5lIEVFUFJPTV9MRUQzX09GRlNFVAkJCTB4NDAKLSNkZWZpbmUgRUVQUk9NX0xOQV9PRkZTRVQJCQkweDQ0Ci0jZGVmaW5lIEVFUFJPTV9SU1NJX0JHX09GRlNFVAkJMHg0NgotI2RlZmluZSBFRVBST01fVFhNSVhFUl9HQUlOXzJfNEcJMHg0OAotI2RlZmluZSBFRVBST01fUlNTSV9BX09GRlNFVAkJMHg0YQotI2RlZmluZSBFRVBST01fVFhNSVhFUl9HQUlOXzVHCQkweDRjCi0jZGVmaW5lIEVFUFJPTV9ERUZJTkVfTUFYX1RYUFdSCQkweDRlCi0jZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl8yXzRHCTB4ZGUJLy8gMjBNSFogMi40RyB0eCBwb3dlci4KLSNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzJfNEcJMHhlZQkvLyA0ME1IWiAyLjRHIHR4IHBvd2VyLgotI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcJCTB4ZmEJLy8gMjBNSFogNUcgdHggcG93ZXIuCi0jZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RwkJMHgxMGEJLy8gNDBNSFogNUcgdHggcG93ZXIuCi0jZGVmaW5lIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgICAgICAweDc4Ci0jZGVmaW5lIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICAgICAgMHhhNgotLy8jZGVmaW5lIEVFUFJPTV9KYXBhbl9UWF9QV1JfT0ZGU0VUICAgICAgMHg5MCAvLyA4MDIuMTFqCi0vLyNkZWZpbmUgRUVQUk9NX0phcGFuX1RYMl9QV1JfT0ZGU0VUICAgICAgMHhiZQotLy8jZGVmaW5lIEVFUFJPTV9UU1NJX1JFRl9PRkZTRVQJMHg1NAotLy8jZGVmaW5lIEVFUFJPTV9UU1NJX0RFTFRBX09GRlNFVAkweDI0Ci0vLyNkZWZpbmUgRUVQUk9NX0NDS19UWF9QV1JfT0ZGU0VUICAweDYyCi0vLyNkZWZpbmUgRUVQUk9NX0NBTElCUkFURV9PRkZTRVQJMHg3YwotI2RlZmluZSBFRVBST01fVkVSU0lPTl9PRkZTRVQgICAgICAgMHgwMgotI2RlZmluZSBFRVBST01fRlJFUV9PRkZTRVQJCQkweDNhCi0jZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURQkweGRlCS8vIDIwTUhaIHBvd2VyLgotI2RlZmluZSBFRVBST01fVFhQT1dFUl9ERUxUQQkJMHg1MAkvLyAyME1IWiBBTkQgNDAgTUhaIHVzZSBkaWZmZXJlbnQgcG93ZXIuIFRoaXMgaXMgZGVsdGEgaW4gNDBNSFouCi0jZGVmaW5lIFZBTElEX0VFUFJPTV9WRVJTSU9OICAgICAgICAxCi0KLQotLyoKLSAgKiAgIEVFUFJPTSBvcGVyYXRpb24gcmVsYXRlZCBtYXJjb3MKLSAgKi8KLSNkZWZpbmUgUlQyOHh4X0VFUFJPTV9SRUFEMTYoX3BBZCwgX29mZnNldCwgX3ZhbHVlKQkJCVwKLQkoX3BBZCktPmNoaXBPcHMuZWVyZWFkKChSVE1QX0FEQVBURVIgKikoX3BBZCksIChVU0hPUlQpKF9vZmZzZXQpLCAoUFVTSE9SVCkmKF92YWx1ZSkpCi0KLSNkZWZpbmUgUlQyOHh4X0VFUFJPTV9XUklURTE2KF9wQWQsIF9vZmZzZXQsIF92YWx1ZSkJCVwKLQkoX3BBZCktPmNoaXBPcHMuZWV3cml0ZSgoUlRNUF9BREFQVEVSICopKF9wQWQpLCAoVVNIT1JUKShfb2Zmc2V0KSwgKFVTSE9SVCkoX3ZhbHVlKSkKLQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICBFMlBST00gZGF0YSBsYXlvdXQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8KLS8vIE1DVV9MRURDUzogTUNVIExFRCBDb250cm9sIFNldHRpbmcuCi0vLwotdHlwZWRlZiB1bmlvbiAgX01DVV9MRURDU19TVFJVQyB7Ci0Jc3RydWN0CXsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCVVDSEFSCQlQb2xhcml0eToxOwotCQlVQ0hBUgkJTGVkTW9kZTo3OwotI2Vsc2UKLQkJVUNIQVIJCUxlZE1vZGU6NzsKLQkJVUNIQVIJCVBvbGFyaXR5OjE7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCX0gZmllbGQ7Ci0JVUNIQVIJCQkJd29yZDsKLX0gTUNVX0xFRENTX1NUUlVDLCAqUE1DVV9MRURDU19TVFJVQzsKLQotCi0vLwotLy8gRUVQUk9NIGFudGVubmEgc2VsZWN0IGZvcm1hdAotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9FRVBST01fQU5URU5OQV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVVNIT1JUICAgICAgUnN2OjQ7Ci0JCVVTSE9SVCAgICAgIFJmSWNUeXBlOjQ7ICAgICAgICAgICAgIC8vIHNlZSBFMlBST00gZG9jdW1lbnQKLQkJVVNIT1JUCQlUeFBhdGg6NDsJLy8gMTogMVQsIDI6IDJUCi0JCVVTSE9SVAkJUnhQYXRoOjQ7CS8vIDE6IDFSLCAyOiAyUiwgMzogM1IKLQl9CWZpZWxkOwotCVVTSE9SVAkJCXdvcmQ7Ci19CUVFUFJPTV9BTlRFTk5BX1NUUlVDLCAqUEVFUFJPTV9BTlRFTk5BX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0VFUFJPTV9BTlRFTk5BX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVU0hPUlQJCVJ4UGF0aDo0OwkvLyAxOiAxUiwgMjogMlIsIDM6IDNSCi0JCVVTSE9SVAkJVHhQYXRoOjQ7CS8vIDE6IDFULCAyOiAyVAotCQlVU0hPUlQgICAgICBSZkljVHlwZTo0OyAgICAgICAgICAgICAvLyBzZWUgRTJQUk9NIGRvY3VtZW50Ci0JCVVTSE9SVCAgICAgIFJzdjo0OwotCX0JZmllbGQ7Ci0JVVNIT1JUCQkJd29yZDsKLX0JRUVQUk9NX0FOVEVOTkFfU1RSVUMsICpQRUVQUk9NX0FOVEVOTkFfU1RSVUM7Ci0jZW5kaWYKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24gX0VFUFJPTV9OSUNfQ0lORklHMl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVVNIT1JUCQlEQUNUZXN0Qml0OjE7CQkJLy8gY29udHJvbCBpZiBkcml2ZXIgc2hvdWxkIHBhdGNoIHRoZSBEQUMgaXNzdWUKLQkJVVNIT1JUCQlSc3YyOjM7CQkJCQkvLyBtdXN0IGJlIDAKLQkJVVNIT1JUCQlBbnREaXZlcnNpdHk6MTsJCQkvLyBBbnRlbm5hIGRpdmVyc2l0eQotCQlVU0hPUlQJCVJzdjE6MTsJCQkJCS8vIG11c3QgYmUgMAotCQlVU0hPUlQJCUJXNDBNQXZhaWxGb3JBOjE7CQkJLy8gMDplbmFibGUsIDE6ZGlzYWJsZQotCQlVU0hPUlQJCUJXNDBNQXZhaWxGb3JHOjE7CQkJLy8gMDplbmFibGUsIDE6ZGlzYWJsZQotCQlVU0hPUlQJCUVuYWJsZVdQU1BCQzoxOyAgICAgICAgICAgICAgICAgLy8gV1BTIFBCQyBDb250cm9sIGJpdAotCQlVU0hPUlQJCUJXNDBNU2lkZWJhbmRGb3JBOjE7Ci0JCVVTSE9SVAkJQlc0ME1TaWRlYmFuZEZvckc6MTsKLQkJVVNIT1JUCQlDYXJkYnVzQWNjZWxlcmF0aW9uOjE7CS8vICEhISBOT1RFOiAwIC0gZW5hYmxlLCAxIC0gZGlzYWJsZQotCQlVU0hPUlQJCUV4dGVybmFsTE5BRm9yQToxOwkJCS8vIGV4dGVybmFsIExOQSBlbmFibGUgZm9yIDVHCi0JCVVTSE9SVAkJRXh0ZXJuYWxMTkFGb3JHOjE7CQkJLy8gZXh0ZXJuYWwgTE5BIGVuYWJsZSBmb3IgMi40RwotCQlVU0hPUlQJCUR5bmFtaWNUeEFnY0NvbnRyb2w6MTsJCQkvLwotCQlVU0hPUlQJCUhhcmR3YXJlUmFkaW9Db250cm9sOjE7CS8vIFdoZXRoZXIgUkYgaXMgY29udHJvbGxlZCBieSBkcml2ZXIgb3IgSFcuIDE6ZW5hYmxlIGh3IGNvbnRyb2wsIDA6ZGlzYWJsZQotCX0JZmllbGQ7Ci0JVVNIT1JUCQkJd29yZDsKLX0JRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDLCAqUEVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uIF9FRVBST01fTklDX0NJTkZJRzJfU1RSVUMJewotCXN0cnVjdCB7Ci0JCVVTSE9SVAkJSGFyZHdhcmVSYWRpb0NvbnRyb2w6MTsJLy8gMTplbmFibGUsIDA6ZGlzYWJsZQotCQlVU0hPUlQJCUR5bmFtaWNUeEFnY0NvbnRyb2w6MTsJCQkvLwotCQlVU0hPUlQJCUV4dGVybmFsTE5BRm9yRzoxOwkJCQkvLwotCQlVU0hPUlQJCUV4dGVybmFsTE5BRm9yQToxOwkJCS8vIGV4dGVybmFsIExOQSBlbmFibGUgZm9yIDIuNEcKLQkJVVNIT1JUCQlDYXJkYnVzQWNjZWxlcmF0aW9uOjE7CS8vICEhISBOT1RFOiAwIC0gZW5hYmxlLCAxIC0gZGlzYWJsZQotCQlVU0hPUlQJCUJXNDBNU2lkZWJhbmRGb3JHOjE7Ci0JCVVTSE9SVAkJQlc0ME1TaWRlYmFuZEZvckE6MTsKLQkJVVNIT1JUCQlFbmFibGVXUFNQQkM6MTsgICAgICAgICAgICAgICAgIC8vIFdQUyBQQkMgQ29udHJvbCBiaXQKLQkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yRzoxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKLQkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yQToxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKLQkJVVNIT1JUCQlSc3YxOjE7CQkJCQkvLyBtdXN0IGJlIDAKLQkJVVNIT1JUCQlBbnREaXZlcnNpdHk6MTsJCQkvLyBBbnRlbm5hIGRpdmVyc2l0eQotCQlVU0hPUlQJCVJzdjI6MzsJCQkJCS8vIG11c3QgYmUgMAotCQlVU0hPUlQJCURBQ1Rlc3RCaXQ6MTsJCQkvLyBjb250cm9sIGlmIGRyaXZlciBzaG91bGQgcGF0Y2ggdGhlIERBQyBpc3N1ZQotCX0JZmllbGQ7Ci0JVVNIT1JUCQkJd29yZDsKLX0JRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDLCAqUEVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQzsKLSNlbmRpZgotCi0vLwotLy8gVFhfUFdSIFZhbHVlIHZhbGlkIHJhbmdlIDB4RkEoLTYpIH4gMHgyNCgzNikKLS8vCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfRUVQUk9NX1RYX1BXUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJQ0hBUglCeXRlMTsJCQkJLy8gSGlnaCBCeXRlCi0JCUNIQVIJQnl0ZTA7CQkJCS8vIExvdyBCeXRlCi0JfQlmaWVsZDsKLQlVU0hPUlQJd29yZDsKLX0JRUVQUk9NX1RYX1BXUl9TVFJVQywgKlBFRVBST01fVFhfUFdSX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0VFUFJPTV9UWF9QV1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JCUNIQVIJQnl0ZTA7CQkJCS8vIExvdyBCeXRlCi0JCUNIQVIJQnl0ZTE7CQkJCS8vIEhpZ2ggQnl0ZQotCX0JZmllbGQ7Ci0JVVNIT1JUCXdvcmQ7Ci19CUVFUFJPTV9UWF9QV1JfU1RSVUMsICpQRUVQUk9NX1RYX1BXUl9TVFJVQzsKLSNlbmRpZgotCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfRUVQUk9NX1ZFUlNJT05fU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVDSEFSCVZlcnNpb247CQkJLy8gSGlnaCBCeXRlCi0JCVVDSEFSCUZhZVJlbGVhc2VOdW1iZXI7CS8vIExvdyBCeXRlCi0JfQlmaWVsZDsKLQlVU0hPUlQJd29yZDsKLX0JRUVQUk9NX1ZFUlNJT05fU1RSVUMsICpQRUVQUk9NX1ZFUlNJT05fU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfRUVQUk9NX1ZFUlNJT05fU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVDSEFSCUZhZVJlbGVhc2VOdW1iZXI7CS8vIExvdyBCeXRlCi0JCVVDSEFSCVZlcnNpb247CQkJLy8gSGlnaCBCeXRlCi0JfQlmaWVsZDsKLQlVU0hPUlQJd29yZDsKLX0JRUVQUk9NX1ZFUlNJT05fU1RSVUMsICpQRUVQUk9NX1ZFUlNJT05fU1RSVUM7Ci0jZW5kaWYKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0VFUFJPTV9MRURfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVTSE9SVAlSc3ZkOjM7CQkJCS8vIFJlc2VydmVkCi0JCVVTSE9SVAlMZWRNb2RlOjU7CQkJLy8gTGVkIG1vZGUuCi0JCVVTSE9SVAlQb2xhcml0eUdQSU9fNDoxOwkvLyBQb2xhcml0eSBHUElPIzQgc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5R1BJT18zOjE7CS8vIFBvbGFyaXR5IEdQSU8jMyBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlHUElPXzI6MTsJLy8gUG9sYXJpdHkgR1BJTyMyIHNldHRpbmcuCi0JCVVTSE9SVAlQb2xhcml0eUdQSU9fMToxOwkvLyBQb2xhcml0eSBHUElPIzEgc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5R1BJT18wOjE7CS8vIFBvbGFyaXR5IEdQSU8jMCBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlBQ1Q6MTsJCS8vIFBvbGFyaXR5IEFDVCBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlSRFlfQToxOwkJLy8gUG9sYXJpdHkgUkRZX0Egc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5UkRZX0c6MTsJCS8vIFBvbGFyaXR5IFJEWV9HIHNldHRpbmcuCi0JfQlmaWVsZDsKLQlVU0hPUlQJd29yZDsKLX0JRUVQUk9NX0xFRF9TVFJVQywgKlBFRVBST01fTEVEX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0VFUFJPTV9MRURfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVTSE9SVAlQb2xhcml0eVJEWV9HOjE7CQkvLyBQb2xhcml0eSBSRFlfRyBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlSRFlfQToxOwkJLy8gUG9sYXJpdHkgUkRZX0Egc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5QUNUOjE7CQkvLyBQb2xhcml0eSBBQ1Qgc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5R1BJT18wOjE7CS8vIFBvbGFyaXR5IEdQSU8jMCBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlHUElPXzE6MTsJLy8gUG9sYXJpdHkgR1BJTyMxIHNldHRpbmcuCi0JCVVTSE9SVAlQb2xhcml0eUdQSU9fMjoxOwkvLyBQb2xhcml0eSBHUElPIzIgc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5R1BJT18zOjE7CS8vIFBvbGFyaXR5IEdQSU8jMyBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlHUElPXzQ6MTsJLy8gUG9sYXJpdHkgR1BJTyM0IHNldHRpbmcuCi0JCVVTSE9SVAlMZWRNb2RlOjU7CQkJLy8gTGVkIG1vZGUuCi0JCVVTSE9SVAlSc3ZkOjM7CQkJCS8vIFJlc2VydmVkCi0JfQlmaWVsZDsKLQlVU0hPUlQJd29yZDsKLX0JRUVQUk9NX0xFRF9TVFJVQywgKlBFRVBST01fTEVEX1NUUlVDOwotI2VuZGlmCi0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9FRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJVHhQb3dlckVuYWJsZToxOy8vIEVuYWJsZQotCQlVQ0hBUglUeXBlOjE7CQkJLy8gMTogcGx1cyB0aGUgZGVsdGEgdmFsdWUsIDA6IG1pbnVzIHRoZSBkZWx0YSB2YWx1ZQotCQlVQ0hBUglEZWx0YVZhbHVlOjY7CS8vIFR4IFBvd2VyIGRhbHRhIHZhbHVlIChNQVg9NCkKLQl9CWZpZWxkOwotCVVDSEFSCXZhbHVlOwotfQlFRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQywgKlBFRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9FRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJRGVsdGFWYWx1ZTo2OwkvLyBUeCBQb3dlciBkYWx0YSB2YWx1ZSAoTUFYPTQpCi0JCVVDSEFSCVR5cGU6MTsJCQkvLyAxOiBwbHVzIHRoZSBkZWx0YSB2YWx1ZSwgMDogbWludXMgdGhlIGRlbHRhIHZhbHVlCi0JCVVDSEFSCVR4UG93ZXJFbmFibGU6MTsvLyBFbmFibGUKLQl9CWZpZWxkOwotCVVDSEFSCXZhbHVlOwotfQlFRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQywgKlBFRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQzsKLSNlbmRpZgotCi0jZW5kaWYJLy8gX19SVE1QX0NISVBfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfZGVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYjczOWQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX2RlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY1MCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIHJ0bXBfZGVmLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IHJlbGF0ZWQgZGVmaW5pdGlvbiBoZWFkZXIKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgUGF1bCBMaW4gICAgMDgtMDEtMjAwMiAgICBjcmVhdGVkCi0gICAgSm9obiBDaGFuZyAgMDgtMDUtMjAwMyAgICBhZGQgZGVmaW5pdGlvbiBmb3IgMTFnICYgb3RoZXIgZHJhZnRzCi0qLwotI2lmbmRlZiBfX1JUTVBfREVGX0hfXwotI2RlZmluZSBfX1JUTVBfREVGX0hfXwotCi0jaW5jbHVkZSAib2lkLmgiCi0KLSN1bmRlZiBBUF9XU0NfSU5DTFVERUQKLSN1bmRlZiBTVEFfV1NDX0lOQ0xVREVECi0jdW5kZWYgV1NDX0lOQ0xVREVECi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWYgZGVmaW5lZChBUF9XU0NfSU5DTFVERUQpIHx8IGRlZmluZWQoU1RBX1dTQ19JTkNMVURFRCkKLSNkZWZpbmUgV1NDX0lOQ0xVREVECi0jZW5kaWYKLS8vCi0vLyAgRGVidWcgaW5mb3JtYXRpb24gdmVyYm9zaXR5OiBsb3dlciB2YWx1ZXMgaW5kaWNhdGUgaGlnaGVyIHVyZ2VuY3kKLS8vCi0jZGVmaW5lIFJUX0RFQlVHX09GRiAgICAgICAgMAotI2RlZmluZSBSVF9ERUJVR19FUlJPUiAgICAgIDEKLSNkZWZpbmUgUlRfREVCVUdfV0FSTiAgICAgICAyCi0jZGVmaW5lIFJUX0RFQlVHX1RSQUNFICAgICAgMwotI2RlZmluZSBSVF9ERUJVR19JTkZPICAgICAgIDQKLSNkZWZpbmUgUlRfREVCVUdfTE9VRCAgICAgICA1Ci0KLSNkZWZpbmUgTklDX1RBRyAgICAgICAgICAgICAoKFVMT05HKScwNjgyJykKLSNkZWZpbmUgTklDX0RCR19TVFJJTkcgICAgICAoIioqUlQyOHh4KioiKQotCi0jaWZkZWYgU05NUF9TVVBQT1JUCi0vLyBmb3Igc25tcAotLy8gdG8gZ2V0IG1hbnVmYWN0dXJlciBPVUksIGthdGh5LCAyMDA4XzAyMjAKLSNkZWZpbmUgTWFudWZhY3R1cmVyT1VJX0xFTgkJCTMKLSNkZWZpbmUgTWFudWZhY3R1cmVyTkFNRQkJCSgiUmFsaW5rIFRlY2hub2xvZ3kgQ29tcGFueS4iKQotI2RlZmluZQlSZXNvdXJjZVR5cGVJZE5hbWUJCQkoIlJhbGlua19JRCIpCi0jZW5kaWYKLQotCi0vLyNkZWZpbmUgUEFDS0VECi0KLSNkZWZpbmUgUkFMSU5LXzI4ODNfVkVSU0lPTgkJKChVSU5UMzIpMHgyODgzMDMwMCkKLSNkZWZpbmUgUkFMSU5LXzI4ODBFX1ZFUlNJT04JKChVSU5UMzIpMHgyODcyMDIwMCkKLSNkZWZpbmUgUkFMSU5LXzMwNzBfVkVSU0lPTgkJKChVSU5UMzIpMHgzMDcwMDIwMCkKLQotI2RlZmluZSBNQVhfUlhfUEtUX0xFTgkxNTIwCi0KLS8vCi0vLyBFbnRyeSBudW1iZXIgZm9yIGVhY2ggRE1BIGRlc2NyaXB0b3IgcmluZwotLy8KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgICAgICAgICA2NCAvLzY0Ci0jZGVmaW5lIE1HTVRfUklOR19TSVpFICAgICAgICAgIDEyOAotI2RlZmluZSBSWF9SSU5HX1NJWkUgICAgICAgICAgICAxMjggLy82NAotI2RlZmluZSBNQVhfVFhfUFJPQ0VTUyAgICAgICAgICBUWF9SSU5HX1NJWkUgLy84Ci0jZGVmaW5lIE1BWF9ETUFfRE9ORV9QUk9DRVNTICAgIFRYX1JJTkdfU0laRQotI2RlZmluZSBNQVhfVFhfRE9ORV9QUk9DRVNTICAgICBUWF9SSU5HX1NJWkUgLy84Ci0jZGVmaW5lIExPQ0FMX1RYQlVGX1NJWkUgICAgICAgIDIKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotI2RlZmluZSBQQ0lfVklSVF9UT19QSFlTKF9fQWRkcikJKCgoVUlOVDMyKShfX0FkZHIpKSAmIDB4MEZGRkZGRkYpCi0KLQotI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAotLy8gTUM6IE11bHRwbGUgQ2FyZHMKLSNkZWZpbmUgTUFYX05VTV9PRl9NVUxUSVBMRV9DQVJECQkzMgotI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLwotCi0jZGVmaW5lIE1BWF9SWF9QUk9DRVNTICAgICAgICAgIDEyOCAvLzY0IC8vMzIKLSNkZWZpbmUgTlVNX09GX0xPQ0FMX1RYQlVGICAgICAgMgotI2RlZmluZSBUWERfU0laRSAgICAgICAgICAgICAgICAxNgotI2RlZmluZSBUWFdJX1NJWkUgICAgICAgICAgICAgICAxNgotI2RlZmluZSBSWERfU0laRQkJMTYKLSNkZWZpbmUgUlhXSV9TSVpFCQkxNgotLy8gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyA4MDIuMTEgSGVhZGVyIFNpemUgKyBBTVNEVSBzdWIgZnJhbWUgaGVhZGVyCi0jZGVmaW5lIFRYX0RNQV8xU1RfQlVGRkVSX1NJWkUgIDk2ICAgIC8vIG9ubHkgdGhlIDFzdCBwaHlzaWNhbCBidWZmZXIgaXMgcHJlLWFsbG9jYXRlZAotI2RlZmluZSBNR01UX0RNQV9CVUZGRVJfU0laRSAgICAxNTM2IC8vMjA0OAotI2RlZmluZSBSWF9CVUZGRVJfQUdHUkVTSVpFICAgICAzODQwIC8vMzkwNCAvLzM5NjggLy80MDk2IC8vMjA0OCAvLzQwOTYKLSNkZWZpbmUgUlhfQlVGRkVSX05PUk1TSVpFICAgICAgMzg0MCAvLzM5MDQgLy8zOTY4IC8vNDA5NiAvLzIwNDggLy80MDk2Ci0jZGVmaW5lIFRYX0JVRkZFUl9OT1JNU0laRQkJUlhfQlVGRkVSX05PUk1TSVpFCi0jZGVmaW5lIE1BWF9GUkFNRV9TSVpFICAgICAgICAgIDIzNDYgICAgICAgICAgICAgICAgICAgIC8vIE1heGltdW0gODAyLjExIGZyYW1lIHNpemUKLSNkZWZpbmUgTUFYX0FHR1JFR0FUSU9OX1NJWkUgICAgMzg0MCAvLzM5MDQgLy8zOTY4IC8vNDA5NgotI2RlZmluZSBNQVhfTlVNX09GX1RVUExFX0NBQ0hFICAyCi0jZGVmaW5lIE1BWF9NQ0FTVF9MSVNUX1NJWkUgICAgIDMyCi0jZGVmaW5lIE1BWF9MRU5fT0ZfVkVORE9SX0RFU0MgIDY0Ci0vLyNkZWZpbmUgTUFYX1NJWkVfT0ZfTUNBU1RfUFNRICAgKE5VTV9PRl9MT0NBTF9UWEJVRiA+PiAyKSAvLyBBUCB3b24ndCBzcGVuZCBtb3JlIHRoYW4gMS80IG9mIHRvdGFsIGJ1ZmZlcnMgb24gTS9CQ0FTVCBQU1EKLSNkZWZpbmUgTUFYX1NJWkVfT0ZfTUNBU1RfUFNRICAgICAgICAgICAgICAgMzIKLQotI2RlZmluZSBNQVhfUlhfUFJPQ0VTU19DTlQJKFJYX1JJTkdfU0laRSkKLQotCi0vKgotCVdNTSBOb3RlOiBJZiBtZW1vcnkgb2YgeW91ciBzeXN0ZW0gaXMgbm90IG11Y2gsIHBsZWFzZSByZWR1Y2UgdGhlIGRlZmluaXRpb247Ci0Jb3Igd2hlbiB5b3UgZG8gV01NIHRlc3QsIHRoZSBxdWV1ZSBmb3IgbG93IHByaW9yaXR5IEFDIHdpbGwgYmUgZnVsbCwgaS5lLgotCVRYX1JJTkdfU0laRSArIE1BWF9QQUNLRVRTX0lOX1FVRVVFIHBhY2tldHMgZm9yIHRoZSBBQyB3aWxsIGJlIGJ1ZmZlcmVkIGluCi0JV0xBTiwgbWF5YmUgbm8gYW55IHBhY2tldCBidWZmZXIgY2FuIGJlIGdvdCBpbiBFdGhlcm5ldCBkcml2ZXIuCi0KLQlTb21ldGltZXMgbm8gcGFja2V0IGJ1ZmZlciBjYW4gYmUgZ290IGluIEV0aGVybmV0IGRyaXZlciwgdGhlIHN5c3RlbSB3aWxsCi0Jc2VuZCBmbG93IGNvbnRyb2wgcGFja2V0IHRvIHRoZSBzZW5kZXIgdG8gc2xvdyBkb3duIGl0cyBzZW5kaW5nIHJhdGUuCi0JU28gbm8gV01NIGNhbiBiZSBzYXcgaW4gdGhlIGFpci4KLSovCi0KLS8qCi0JTmVlZCB0byB1c2UgNjQgaW4gdnh3b3JrcyBmb3IgdGVzdCBjYXNlIFdNTSBBNS1UMDcKLQlUd28gZG5saW5rICgxME1icHMpIGZyb20gYSBXTU0gc3RhdGlvbiB0byBhIG5vbi1XTU0gc3RhdGlvbi4KLQlJZiB1c2UgMjU2LCBxdWV1ZSBpcyBub3QgZW5vdWdoLgotCUFuZCBpbiBydF9tYWluX2VuZC5jLCBjbENvbmZpZy5jbE51bSA9IFJYX1JJTkdfU0laRSAqIDM7IGlzIGNoYW5nZWQgdG8KLQljbENvbmZpZy5jbE51bSA9IFJYX1JJTkdfU0laRSAqIDQ7Ci0qLwotLy8gVE9ETzogRm9yIFZ4V29ya3MgdGhlIHNpemUgaXMgMjU2LiBTaGFsbCB3ZSBjYWhuZ2UgdGhlIHZhbHVlIGFzIDI1NiBmb3IgYWxsIE9TPz8/Pz8KLSNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fUVVFVUUJCQkJKDUxMikgLy8oNTEyKSAgICAvLyB0byBwYXNzIFdNTSBBNS1XUEFQU0sKLQotI2RlZmluZSBNQVhfUEFDS0VUU19JTl9NQ0FTVF9QU19RVUVVRQkJMzIKLSNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fUFNfUVVFVUUJCQkJMTI4CS8vMzIKLSNkZWZpbmUgV01NX05VTV9PRl9BQyAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogQUMwLCBBQzEsIEFDMiwgYW5kIEFDMyAqLwotCi0KLSNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKLS8vMjAwOC8wOS8xMTpLSCBhZGQgdG8gc3VwcG9ydCBlZnVzZTwtLQotI2RlZmluZSBNQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUJCQkJMTAyNAotI2RlZmluZSBFRlVTRV9CVUZGRVJfUEFUSAkJCQkJCSIvdG1wL1JUMzB4eEVFUFJPTS5iaW4iCi0vLzIwMDgvMDkvMTE6S0ggYWRkIHRvIHN1cHBvcnQgZWZ1c2UtLT4KLSNlbmRpZiAvLyBSVE1QX0VGVVNFX1NVUFBPUlQgLy8KLQotLy8gUnhGaWx0ZXIKLSNkZWZpbmUgU1RBTk9STUFMCSAweDE3Zjk3Ci0jZGVmaW5lIEFQTk9STUFMCSAweDE1Zjk3Ci0jZGVmaW5lIFBTUFhMSU5LCSAweDE3ZjkzCi0vLwotLy8gIFJUTVBfQURBUFRFUiBmbGFncwotLy8KLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9NQVBfUkVHSVNURVIgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfSEFSRFdBUkVfRVJST1IgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9TQ0FUVEVSX0dBVEhFUiAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBmUlRNUF9BREFQVEVSX1NFTkRfUEFDS0VUX0VSUk9SICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfTUxNRV9SRVNFVF9JTl9QUk9HUkVTUyAweDAwMDAwMDIwCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfVFhfUklOR19BTExPQ0FURUQgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MgICAgMHgwMDAwMDQwMAotI2RlZmluZSBmUlRNUF9BREFQVEVSX01JTU9SQVRFX0lOVVNFRCAgICAgICAweDAwMDAwODAwCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfUlhfUklOR19BTExPQ0FURUQgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFICAgICAgMHgwMDAwMjAwMAotI2RlZmluZSBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTICAweDAwMDA0MDAwCi0jZGVmaW5lCWZSVE1QX0FEQVBURVJfUkVBU1NPQ19JTl9QUk9HUkVTUwkweDAwMDA4MDAwCi0jZGVmaW5lCWZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfUEVORElORwkweDAwMDEwMDAwCi0jZGVmaW5lCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGCQkJCTB4MDAwMjAwMDAKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUCQkJMHgwMDA0MDAwMAotI2RlZmluZQlmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVAkJCTB4MDAwODAwMDAKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9SREdfQUNUSVZFCQkJMHgwMDEwMDAwMAotI2RlZmluZSBmUlRNUF9BREFQVEVSX0RZTkFNSUNfQkVfVFhPUF9BQ1RJVkUgMHgwMDIwMDAwMAotI2RlZmluZSBmUlRNUF9BREFQVEVSX1NDQU5fMjA0MAkJCQkweDA0MDAwMDAwCi0jZGVmaW5lCWZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQJCTB4MDgwMDAwMDAKLQotI2RlZmluZSBmUlRNUF9BREFQVEVSX1NUQVJUX1VQCQkJMHgxMDAwMDAwMAkvL0Rldml2ZSBhbHJlYWR5IGluaXRpYWxpemVkIGFuZCBlbmFibGVkIFR4L1J4LgotI2RlZmluZSBmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX0NIQU5HRSAgICAweDIwMDAwMDAwCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYgICAgICAgIDB4NDAwMDAwMDAKLQotLy8gTG9jayBiaXQgZm9yIGFjY2Vzc2luZyBkaWZmZXJlbnQgcmluZyBidWZmZXJzCi0vLyNkZWZpbmUgZlJUTVBfQURBUFRFUl9UWF9SSU5HX0JVU1kgICAgICAgIDB4ODAwMDAwMDAKLS8vI2RlZmluZSBmUlRNUF9BREFQVEVSX01HTVRfUklOR19CVVNZICAgICAgMHg0MDAwMDAwMAotLy8jZGVmaW5lIGZSVE1QX0FEQVBURVJfQVRJTV9SSU5HX0JVU1kgICAgICAweDIwMDAwMDAwCi0vLyNkZWZpbmUgZlJUTVBfQURBUFRFUl9SWF9SSU5HX0JVU1kgICAgICAgIDB4MTAwMDAwMDAKLQotLy8gTG9jayBiaXQgZm9yIGFjY2Vzc2luZyBkaWZmZXJlbnQgcXVldWUKLS8vI2RlZmluZSAgIGZSVE1QX0FEQVBURVJfVFhfUVVFVUVfQlVTWSAgICAgMHgwODAwMDAwMAotLy8jZGVmaW5lICAgZlJUTVBfQURBUFRFUl9NR01UX1FVRVVFX0JVU1kgICAweDA0MDAwMDAwCi0KLS8vCi0vLyAgU1RBIG9wZXJhdGlvbiBzdGF0dXMgZmxhZ3MKLS8vCi0jZGVmaW5lIGZPUF9TVEFUVVNfSU5GUkFfT04gICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgZk9QX1NUQVRVU19BREhPQ19PTiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQgICAgMHgwMDAwMDAxMAotI2RlZmluZSBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSAgICAgICAgICAgICAweDAwMDAwMDIwCi0vLyNkZWZpbmUgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEICAgMHgwMDAwMDA0MAotI2RlZmluZSBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCAgICAweDAwMDAwMDgwCi0jZGVmaW5lIGZPUF9TVEFUVVNfV01NX0lOVVNFRCAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBmT1BfU1RBVFVTX0RPWkUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwICAvLyBkZWJ1ZyBwdXJwb3NlCi0jZGVmaW5lIGZPUF9TVEFUVVNfUElHR1lCQUNLX0lOVVNFRCAgICAgICAgIDB4MDAwMDA4MDAgIC8vIHBpZ2d5LWJhY2ssIGFuZCBhZ2dyZWdhdGlvbgotI2RlZmluZSBmT1BfU1RBVFVTX0FQU0RfSU5VU0VECQkJCTB4MDAwMDEwMDAKLSNkZWZpbmUgZk9QX1NUQVRVU19UWF9BTVNEVV9JTlVTRUQJCQkweDAwMDAyMDAwCi0jZGVmaW5lIGZPUF9TVEFUVVNfTUFYX1JFVFJZX0VOQUJMRUQJCTB4MDAwMDQwMDAKLSNkZWZpbmUgZk9QX1NUQVRVU19XQUtFVVBfTk9XICAgICAgICAgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBmT1BfU1RBVFVTX1BDSUVfREVWSUNFICAgICAgIDB4MDAwMjAwMDAKLQotLy8KLS8vICBSVE1QX0FEQVBURVIgUFNGbGFncyA6IHJlbGF0ZWQgdG8gYWR2YW5jZWQgcG93ZXIgc2F2ZS4KLS8vCi0vLyBJbmRpY2F0ZSB3aGV0aGVyIGRyaXZlciBjYW4gZ28gdG8gc2xlZXAgbW9kZSBmcm9tIG5vdy4gVGhpcyBmbGFnIGlzIHVzZWZ1bCBBRlRFUiBsaW5rIHVwCi0jZGVmaW5lIGZSVE1QX1BTX0NBTl9HT19TTEVFUCAgICAgICAgICAweDAwMDAwMDAxCi0vLyBJbmRpY2F0ZSB3aGV0aGVyIGRyaXZlciBoYXMgaXNzdWUgYSBMaW5rQ29udHJvbCBjb21tYW5kIHRvIFBDSWUgTDEKLSNkZWZpbmUgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQgICAgICAgICAgMHgwMDAwMDAwMgotLy8gSW5kaWNhdGUgZHJpdmVyIHNob3VsZCBkaXNhYmxlIGtpY2sgb2ZmIGhhcmR3YXJlIHRvIHNlbmQgcGFja2V0cyBmcm9tIG5vdy4KLSNkZWZpbmUgZlJUTVBfUFNfRElTQUJMRV9UWCAgICAgICAgIDB4MDAwMDAwMDQKLS8vIEluZGljYXRlIGRyaXZlciBzaG91bGQgSU1NRURJQVRFTFkgZm8gdG8gc2xlZXAgYWZ0ZXIgcmVjZWl2aW5nIEFQJ3MgYmVhY29uIGluIHdoaWNoICBkb2Vzbid0IGluZGljYXRlIHVuaWNhdGUgbm9yIG11bHRpY2FzdCBwYWNrZXRzIGZvciBtZQotLy8uIFRoaXMgZmxhZyBpcyB1c2VkIE9OTFkgaW4gUlRNUEhhbmRsZVJ4RG9uZUludGVycnVwdCByb3V0aW5lLgotI2RlZmluZSBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIGZSVE1QX1BTX1RPR0dMRV9MMQkJMHgwMDAwMDAxMAkvLyBVc2UgVG9nZ2xlIEwxIG1lY2hhbmlzbSBmb3IgcnQyOHh4IFBDSWUKLSNpZmRlZiBSVDMwOTAKLSNkZWZpbmUgV0FLRV9NQ1VfQ01ECQkJCTB4MzEKLSNkZWZpbmUgU0xFRVBfTUNVX0NNRAkJCQkJMHgzMAotI2RlZmluZSBSRk9GRl9NQ1VfQ01ECQkJCTB4MzUKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0jZGVmaW5lIGZPUF9TVEFUVVNfU0NBTl8yMDQwCQkJICAgIDB4MDAwNDAwMDAKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0KLSNkZWZpbmUgQ0NLU0VUUFJPVEVDVAkJMHgxCi0jZGVmaW5lIE9GRE1TRVRQUk9URUNUCQkweDIKLSNkZWZpbmUgTU0yMFNFVFBST1RFQ1QJCTB4NAotI2RlZmluZSBNTTQwU0VUUFJPVEVDVAkJMHg4Ci0jZGVmaW5lIEdGMjBTRVRQUk9URUNUCQkweDEwCi0jZGVmaW5lIEdSNDBTRVRQUk9URUNUCQkweDIwCi0jZGVmaW5lIEFMTE5fU0VUUFJPVEVDVAkJKEdSNDBTRVRQUk9URUNUIHwgR0YyMFNFVFBST1RFQ1QgfCBNTTQwU0VUUFJPVEVDVCB8IE1NMjBTRVRQUk9URUNUKQotCi0vLwotLy8gIEFQJ3MgY2xpZW50IHRhYmxlIG9wZXJhdGlvbiBzdGF0dXMgZmxhZ3MKLS8vCi0jZGVmaW5lIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFICAgICAgICAgIDB4MDAwMDAwMDEgIC8vIENMSUVOVCBjYW4gcGFyc2UgUU9TIERBVEEgZnJhbWUKLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSAgMHgwMDAwMDAwMiAgLy8gQ0xJRU5UIGNhbiByZWNlaXZlIFJhbGluaydzIHByb3ByaWV0YXJ5IFRYIGFnZ3JlZ2F0aW9uIGZyYW1lCi0jZGVmaW5lIGZDTElFTlRfU1RBVFVTX1BJR0dZQkFDS19DQVBBQkxFICAgIDB4MDAwMDAwMDQgIC8vIENMSUVOVCBzdXBwb3J0IHBpZ2d5LWJhY2sKLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VECQkJMHgwMDAwMDAwOAotI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFCQkweDAwMDAwMDEwCi0jZGVmaW5lIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUJCTB4MDAwMDAwMjAKLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUJCTB4MDAwMDAwNDAKLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUJCTB4MDAwMDAwODAKLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUJCQkweDAwMDAwMTAwCi0jZGVmaW5lIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFCQkJMHgwMDAwMDIwMAotI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFICAweDAwMDAwNDAwCi0jZGVmaW5lIGZDTElFTlRfU1RBVFVTX0FQU0RfQ0FQQUJMRSAgICAgICAgIDB4MDAwMDA4MDAgIC8qIFVBUFNEIFNUQVRJT04gKi8KLQotI2lmZGVmIERPVDExTl9EUkFGVDMKLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQlNTQ09FWElTVF9DQVBBQkxFCTB4MDAwMDEwMDAKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0KLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQJCTB4MDAxMDAwMDAKLS8vCi0vLyAgU1RBIGNvbmZpZ3VyYXRpb24gZmxhZ3MKLS8vCi0vLyNkZWZpbmUgZlNUQV9DRkdfRU5BQkxFX1RYX0JVUlNUICAgICAgICAgIDB4MDAwMDAwMDEKLQotLy8gODAyLjExbiBPcGVyYXRpbmcgTW9kZSBEZWZpbml0aW9uLiAwLTMgYWxzbyB1c2VkIGluIEFTSUNVUGRhdGVQcm90ZWN0IHN3aXRjaCBjYXNlCi0jZGVmaW5lIEhUX05PX1BST1RFQ1QJMAotI2RlZmluZSBIVF9MRUdBQ1lfUFJPVEVDVAkxCi0jZGVmaW5lIEhUXzQwX1BST1RFQ1QJMgotI2RlZmluZSBIVF8yMDQwX1BST1RFQ1QJMwotI2RlZmluZSBIVF9SVFNDVFNfNk0JNwotLy9mb2xsb3dpbmcgaXMgb3VyIG93biBkZWZpbml0aW9uIGluIG9yZGVyIHRvIHR1cm4gb24gb3VyIEFTSUMgcHJvdGVjdGlvbiByZWdpc3RlciBpbiBJTkZSQVNUUlVDVFVSRS4KLSNkZWZpbmUgSFRfQVRIRVJPUwk4CS8vIHJ0Mjg2MGMgaGFzIHByb2JsZW0gd2l0aCBhdGhlcm9zIGNoaXAuIHdlIG5lZWQgdG8gdHVybiBvbiBSVFMvQ1RTIC4KLSNkZWZpbmUgSFRfRk9SQ0VSVFNDVFMJOQkvLyBGb3JjZSB0dXJuIG9uIFJUUy9DVFMgZmlyc3QuIHRoZW4gZ28gdG8gZXZhbHVhdGUgaWYgdGhpcyBmb3JjZSBSVFMgaXMgbmVjZXNzYXJ5LgotCi0vLwotLy8gUlggUGFja2V0IEZpbHRlciBjb250cm9sIGZsYWdzLiBBcHBseSBvbiBwQWQtPlBhY2tldEZpbHRlcgotLy8KLSNkZWZpbmUgZlJYX0ZJTFRFUl9BQ0NFUFRfRElSRUNUICAgICAgICAgICAgTkRJU19QQUNLRVRfVFlQRV9ESVJFQ1RFRAotI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9NVUxUSUNBU1QgICAgICAgICBORElTX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVAotI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9CUk9BRENBU1QgICAgICAgICBORElTX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVAotI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9BTExfTVVMVElDQVNUICAgICBORElTX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QKLSNkZWZpbmUgZlJYX0ZJTFRFUl9BQ0NFUFRfUFJPTUlTQ1VPVVMgICAgICAgTkRJU19QQUNLRVRfVFlQRV9QUk9NSVNDVU9VUwotCi0vLwotLy8gRXJyb3IgY29kZSBzZWN0aW9uCi0vLwotLy8gTkRJU19FUlJPUl9DT0RFX0FEQVBURVJfTk9UX0ZPVU5ECi0jZGVmaW5lIEVSUkxPR19SRUFEX1BDSV9TTE9UX0ZBSUxFRCAgICAgMHgwMDAwMDEwMUwKLSNkZWZpbmUgRVJSTE9HX1dSSVRFX1BDSV9TTE9UX0ZBSUxFRCAgICAweDAwMDAwMTAyTAotI2RlZmluZSBFUlJMT0dfVkVORE9SX0RFVklDRV9OT01BVENIICAgIDB4MDAwMDAxMDNMCi0KLS8vIE5ESVNfRVJST1JfQ09ERV9BREFQVEVSX0RJU0FCTEVECi0jZGVmaW5lIEVSUkxPR19CVVNfTUFTVEVSX0RJU0FCTEVEICAgICAgMHgwMDAwMDIwMUwKLQotLy8gTkRJU19FUlJPUl9DT0RFX1VOU1VQUE9SVEVEX0NPTkZJR1VSQVRJT04KLSNkZWZpbmUgRVJSTE9HX0lOVkFMSURfU1BFRURfRFVQTEVYICAgICAweDAwMDAwMzAxTAotI2RlZmluZSBFUlJMT0dfU0VUX1NFQ09OREFSWV9GQUlMRUQgICAgIDB4MDAwMDAzMDJMCi0KLS8vIE5ESVNfRVJST1JfQ09ERV9PVVRfT0ZfUkVTT1VSQ0VTCi0jZGVmaW5lIEVSUkxPR19PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgMHgwMDAwMDQwMUwKLSNkZWZpbmUgRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZICAgICAweDAwMDAwNDAyTAotI2RlZmluZSBFUlJMT0dfT1VUX09GX01BUF9SRUdJU1RFUlMgICAgIDB4MDAwMDA0MDNMCi0jZGVmaW5lIEVSUkxPR19PVVRfT0ZfQlVGRkVSX1BPT0wgICAgICAgMHgwMDAwMDQwNEwKLSNkZWZpbmUgRVJSTE9HX09VVF9PRl9ORElTX0JVRkZFUiAgICAgICAweDAwMDAwNDA1TAotI2RlZmluZSBFUlJMT0dfT1VUX09GX1BBQ0tFVF9QT09MICAgICAgIDB4MDAwMDA0MDZMCi0jZGVmaW5lIEVSUkxPR19PVVRfT0ZfTkRJU19QQUNLRVQgICAgICAgMHgwMDAwMDQwN0wKLSNkZWZpbmUgRVJSTE9HX09VVF9PRl9MT09LQVNJREVfTUVNT1JZICAweDAwMDAwNDA4TAotCi0vLyBORElTX0VSUk9SX0NPREVfSEFSRFdBUkVfRkFJTFVSRQotI2RlZmluZSBFUlJMT0dfU0VMRlRFU1RfRkFJTEVEICAgICAgICAgIDB4MDAwMDA1MDFMCi0jZGVmaW5lIEVSUkxPR19JTklUSUFMSVpFX0FEQVBURVIgICAgICAgMHgwMDAwMDUwMkwKLSNkZWZpbmUgRVJSTE9HX1JFTU9WRV9NSU5JUE9SVCAgICAgICAgICAweDAwMDAwNTAzTAotCi0vLyBORElTX0VSUk9SX0NPREVfUkVTT1VSQ0VfQ09ORkxJQ1QKLSNkZWZpbmUgRVJSTE9HX01BUF9JT19TUEFDRSAgICAgICAgICAgICAweDAwMDAwNjAxTAotI2RlZmluZSBFUlJMT0dfUVVFUllfQURBUFRFUl9SRVNPVVJDRVMgIDB4MDAwMDA2MDJMCi0jZGVmaW5lIEVSUkxPR19OT19JT19SRVNPVVJDRSAgICAgICAgICAgMHgwMDAwMDYwM0wKLSNkZWZpbmUgRVJSTE9HX05PX0lOVEVSUlVQVF9SRVNPVVJDRSAgICAweDAwMDAwNjA0TAotI2RlZmluZSBFUlJMT0dfTk9fTUVNT1JZX1JFU09VUkNFICAgICAgIDB4MDAwMDA2MDVMCi0KLQotLy8gV0RTIGRlZmluaXRpb24KLSNkZWZpbmUJTUFYX1dEU19FTlRSWSAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgV0RTX1BBSVJXSVNFX0tFWV9PRkZTRVQgICAgIDYwICAgIC8vIFdEUyBsaW5rcyB1c2VzIHBhaXJ3aXNlIGtleSM2MCB+IDYzIGluIEFTSUMgcGFpcndpc2Uga2V5IHRhYmxlCi0KLSNkZWZpbmUJV0RTX0RJU0FCTEVfTU9ERSAgICAgICAgICAgIDAKLSNkZWZpbmUJV0RTX1JFU1RSSUNUX01PREUgICAgICAgICAgIDEKLSNkZWZpbmUJV0RTX0JSSURHRV9NT0RFICAgICAgICAgICAgIDIKLSNkZWZpbmUJV0RTX1JFUEVBVEVSX01PREUgICAgICAgICAgIDMKLSNkZWZpbmUJV0RTX0xBWllfTU9ERSAgICAgICAgICAgICAgIDQKLQotCi0jZGVmaW5lIE1BWF9NRVNIX05VTQkJCQkwCi0KLSNkZWZpbmUgTUFYX0FQQ0xJX05VTQkJCQkwCi0jaWZkZWYgQVBDTElfU1VQUE9SVAotI3VuZGVmCU1BWF9BUENMSV9OVU0KLSNkZWZpbmUgTUFYX0FQQ0xJX05VTQkJCQkxCi0jZW5kaWYgLy8gQVBDTElfU1VQUE9SVCAvLwotCi0jZGVmaW5lIE1BWF9NQlNTSURfTlVNCQkJCTEKLSNpZmRlZiBNQlNTX1NVUFBPUlQKLSN1bmRlZglNQVhfTUJTU0lEX05VTQotI2RlZmluZSBNQVhfTUJTU0lEX05VTQkJCQkoOCAtIE1BWF9NRVNIX05VTSAtIE1BWF9BUENMSV9OVU0pCi0jZW5kaWYgLy8gTUJTU19TVVBQT1JUIC8vCi0KLS8qIHNhbml0eSBjaGVjayBmb3IgYXBpZHggKi8KLSNkZWZpbmUgTUJTU19NUl9BUElEWF9TQU5JVFlfQ0hFQ0soYXBpZHgpIFwKLSAgICB7IGlmIChhcGlkeCA+IE1BWF9NQlNTSURfTlVNKSB7IFwKLSAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcz4gRXJyb3IhIGFwaWR4ID0gJWQgPiBNQVhfTUJTU0lEX05VTSFcbiIsIF9fRlVOQ1RJT05fXywgYXBpZHgpKTsgXAotCSAgYXBpZHggPSBNQUlOX01CU1NJRDsgfSB9Ci0KLSNkZWZpbmUgVkFMSURfV0NJRChfd2NpZCkJKChfd2NpZCkgPiAwICYmIChfd2NpZCkgPCBNQVhfTEVOX09GX01BQ19UQUJMRSApCi0KLSNkZWZpbmUgTUFJTl9NQlNTSUQgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgRklSU1RfTUJTU0lEICAgICAgICAgICAgICAgIDEKLQotCi0jZGVmaW5lIE1BWF9CRUFDT05fU0laRQkJCQk1MTIKLS8vIElmIHRoZSBNQVhfTUJTU0lEX05VTSBpcyBsYXJnZXIgdGhhbiA2LAotLy8gaXQgc2hhbGwgcmVzZXJ2ZSBzb21lIFdDSUQgc3BhY2Uod2NpZCAyMjJ+MjUzKSBmb3IgYmVhY29uIGZyYW1lcy4KLS8vIC0JdGhlc2Ugd2NpZCAyMzh+MjUzIGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzYocmE2KS4KLS8vIC0JdGhlc2Ugd2NpZCAyMjJ+MjM3IGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzcocmE3KS4KLSNpZiBkZWZpbmVkKE1BWF9NQlNTSURfTlVNKSAmJiAoTUFYX01CU1NJRF9OVU0gPT0gOCkKLSNkZWZpbmUgSFdfUkVTRVJWRURfV0NJRAkyMjIKLSNlbGlmIGRlZmluZWQoTUFYX01CU1NJRF9OVU0pICYmIChNQVhfTUJTU0lEX05VTSA9PSA3KQotI2RlZmluZSBIV19SRVNFUlZFRF9XQ0lECTIzOAotI2Vsc2UKLSNkZWZpbmUgSFdfUkVTRVJWRURfV0NJRAkyNTUKLSNlbmRpZgotCi0vLyBUaGVuIGRlZGljYXRlIHdjaWQgb2YgREZTIGFuZCBDYXJyaWVyLVNlbnNlLgotI2RlZmluZSBERlNfQ1RTX1dDSUQJCShIV19SRVNFUlZFRF9XQ0lEIC0gMSkKLSNkZWZpbmUgQ1NfQ1RTX1dDSUQJCShIV19SRVNFUlZFRF9XQ0lEIC0gMikKLSNkZWZpbmUgTEFTVF9TUEVDSUZJQ19XQ0lECShIV19SRVNFUlZFRF9XQ0lEIC0gMikKLQotLy8gSWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhlIG1heGltdW0gYXZhaWxhYmxlIHdjaWQgZm9yIHRoZSBhc3NvY2lhdGVkIFNUQSBpcyAyMTEuCi0vLyBJZiBNQVhfTUJTU0lEX05VTSBpcyA3LCB0aGUgbWF4aW11bSBhdmFpbGFibGUgd2NpZCBmb3IgdGhlIGFzc29jaWF0ZWQgU1RBIGlzIDIyOC4KLSNkZWZpbmUgTUFYX0FWQUlMQUJMRV9DTElFTlRfV0NJRAkoTEFTVF9TUEVDSUZJQ19XQ0lEIC0gTUFYX01CU1NJRF9OVU0gLSAxKQotCi0vLyBUWCBuZWVkIFdDSUQgdG8gZmluZCBDaXBoZXIgS2V5Ci0vLyB0aGVzZSB3Y2lkIDIxMiB+IDIxOSBhcmUgcmVzZXJ2ZWQgZm9yIGJjL21jIHBhY2tldHMgaWYgTUFYX01CU1NJRF9OVU0gaXMgOC4KLSNkZWZpbmUgR0VUX0dyb3VwS2V5X1dDSUQoX193Y2lkLCBfX2Jzc2lkeCkgXAotCXsJCQkJCQkJCQkJXAotCQlfX3djaWQgPSBMQVNUX1NQRUNJRklDX1dDSUQgLSAoTUFYX01CU1NJRF9OVU0pICsgX19ic3NpZHg7CVwKLQl9Ci0KLSNkZWZpbmUgSXNHcm91cEtleVdDSUQoX193Y2lkKSAoKChfX3djaWQpIDwgTEFTVF9TUEVDSUZJQ19XQ0lEKSAmJiAoKF9fd2NpZCkgPj0gKExBU1RfU1BFQ0lGSUNfV0NJRCAtIChNQVhfTUJTU0lEX05VTSkpKSkKLQotCi0vLyBkZWZpbml0aW9uIHRvIHN1cHBvcnQgbXVsdGlwbGUgQlNTSUQKLSNkZWZpbmUgQlNTMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEJTUzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBCU1MyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgQlNTMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEJTUzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBCU1M1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgQlNTNiAgICAgICAgICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIEJTUzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgNwotCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBMZW5ndGggZGVmaW5pdGlvbnMKLSNkZWZpbmUgUEVFUl9LRVlfTk8gICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIE1BQ19BRERSX0xFTiAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBUSU1FU1RBTVBfTEVOICAgICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMgICAgICBNQVhfTEVOR1RIX09GX1NVUFBPUlRfUkFURVMgLy8gMSwgMiwgNS41LCAxMSwgNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NAotI2RlZmluZSBNQVhfTlVNX09GX1JFR1VMQVRPUllfQ0xBU1MJCTE2Ci0jZGVmaW5lIE1BWF9MRU5fT0ZfS0VZICAgICAgICAgICAgICAgICAgMzIgICAgICAvLyAzMiBvY3RldHMgPT0gMjU2IGJpdHMsIFJlZGVmaW5lIGZvciBXUEEKLSNkZWZpbmUgTUFYX05VTV9PRl9DSEFOTkVMUyAgICAgICAgICAgICBNQVhfTlVNX09GX0NIUyAgICAgIC8vIDE0IGNoYW5uZWxzIEAyLjRHICsgIDEyQFVOSUkgKyA0IEBNTUFDICsgMTEgQEhpcGVyTEFOMiArIDcgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uCi0jZGVmaW5lIE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFMgICAgICAgICAgICAgMjAgICAgICAvLyAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJICsgNCBATU1BQyArIDExIEBIaXBlckxBTjIgKyA3IEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbgotI2RlZmluZSBNQVhfTEVOX09GX1NTSUQgICAgICAgICAgICAgICAgIDMyCi0jZGVmaW5lIENJUEhFUl9URVhUX0xFTiAgICAgICAgICAgICAgICAgMTI4Ci0jZGVmaW5lIEhBU0hfVEFCTEVfU0laRSAgICAgICAgICAgICAgICAgMjU2Ci0jZGVmaW5lIE1BWF9WSUVfTEVOICAgICAgICAgICAgICAgICAgICAgMTAyNCAgIC8vIE5ldyBmb3IgV1BBIGNpcGhlciBzdWl0ZSB2YXJpYWJsZSBJRSBzaXplcy4KLSNkZWZpbmUgTUFYX1NVUFBPUlRfTUNTICAgICAgICAgICAgIDMyCi0jZGVmaW5lIE1BWF9OVU1fT0ZfQkJQX0xBVENIICAgICAgICAgICAgIDE0MAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEFTSUMgV0NJRCBUYWJsZSBkZWZpbml0aW9uLgotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNkZWZpbmUgQlNTSURfV0NJRAkJMQkvLyBpbiBpbmZyYSBtb2RlLCBhbHdheXMgcHV0IGJzc2lkIHdpdGggdGhpcyBXQ0lECi0jZGVmaW5lIE1DQVNUX1dDSUQJMHgwCi0jZGVmaW5lIEJTUzBNY2FzdF9XQ0lECTB4MAotI2RlZmluZSBCU1MxTWNhc3RfV0NJRAkweGY4Ci0jZGVmaW5lIEJTUzJNY2FzdF9XQ0lECTB4ZjkKLSNkZWZpbmUgQlNTM01jYXN0X1dDSUQJMHhmYQotI2RlZmluZSBCU1M0TWNhc3RfV0NJRAkweGZiCi0jZGVmaW5lIEJTUzVNY2FzdF9XQ0lECTB4ZmMKLSNkZWZpbmUgQlNTNk1jYXN0X1dDSUQJMHhmZAotI2RlZmluZSBCU1M3TWNhc3RfV0NJRAkweGZlCi0jZGVmaW5lIFJFU0VSVkVEX1dDSUQJCTB4ZmYKLQotI2RlZmluZSBNQVhfTlVNX09GX0FDTF9MSVNUCQkJCU1BWF9OVU1CRVJfT0ZfQUNMCi0KLSNkZWZpbmUgTUFYX0xFTl9PRl9NQUNfVEFCTEUgICAgICAgICAgICBNQVhfTlVNQkVSX09GX01BQyAvLyBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGlzIHZhbHVlIGNhbid0IGJlIGxhcmdlciB0aGFuIDIxMQotCi0jaWYgTUFYX0xFTl9PRl9NQUNfVEFCTEU+TUFYX0FWQUlMQUJMRV9DTElFTlRfV0NJRAotI2Vycm9yIE1BWF9MRU5fT0ZfTUFDX1RBQkxFIGNhbiBub3QgYmUgbGFyZ2VyIHRoYW4gTUFYX0FWQUlMQUJMRV9DTElFTlRfV0NJRCEhISEKLSNlbmRpZgotCi0jZGVmaW5lIE1BWF9OVU1fT0ZfV0RTX0xJTktfUEVSQlNTSUQJICAgICAgICAgICAgMwotI2RlZmluZSBNQVhfTlVNX09GX1dEU19MSU5LCSAgICAgICAgICAgIChNQVhfTlVNX09GX1dEU19MSU5LX1BFUkJTU0lEKk1BWF9NQlNTSURfTlVNKQotI2RlZmluZSBNQVhfTlVNX09GX0VWRU5UICAgICAgICAgICAgICAgIE1BWF9OVU1CRVJfT0ZfRVZFTlQKLSNkZWZpbmUgV0RTX0xJTktfU1RBUlRfV0NJRAkJCQkoTUFYX0xFTl9PRl9NQUNfVEFCTEUtMSkKLQotI2RlZmluZSBOVU1fT0ZfVElECQkJOAotI2RlZmluZSBNQVhfQUlEX0JBICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFICAgICAgICAgICgoTlVNX09GX1RJRCAqIE1BWF9MRU5fT0ZfTUFDX1RBQkxFKS8yKS8vICAgKE5VTV9PRl9USUQqTUFYX0FJRF9CQSArIDMyKQkgLy9CbG9jayBBQ0sgcmVjaXBpZW50Ci0jZGVmaW5lIE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFICAgICAgICAgICgoTlVNX09GX1RJRCAqIE1BWF9MRU5fT0ZfTUFDX1RBQkxFKS8yKS8vICAgKE5VTV9PRl9USUQqTUFYX0FJRF9CQSArIDMyKSAgIC8vIEJsb2NrIEFDSyBvcmlnaW5hdG9yCi0jZGVmaW5lIE1BWF9MRU5fT0ZfQlNTX1RBQkxFICAgICAgICAgICAgIDY0Ci0jZGVmaW5lIE1BWF9SRU9SREVSSU5HX01QRFVfTlVNCQkJIDUxMgotCi0vLyBrZXkgcmVsYXRlZCBkZWZpbml0aW9ucwotI2RlZmluZSBTSEFSRV9LRVlfTlVNICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgTUFYX0xFTl9PRl9TSEFSRV9LRVkgICAgICAgICAgICAxNiAgICAvLyBieXRlIGNvdW50Ci0jZGVmaW5lIE1BWF9MRU5fT0ZfUEVFUl9LRVkgICAgICAgICAgICAgMTYgICAgLy8gYnl0ZSBjb3VudAotI2RlZmluZSBQQUlSV0lTRV9LRVlfTlVNICAgICAgICAgICAgICAgIDY0ICAgIC8vIGluIE1BQyBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZQotI2RlZmluZSBHUk9VUF9LRVlfTlVNICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgUE1LX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAzMgotI2RlZmluZSBXRFNfUEFJUldJU0VfS0VZX09GRlNFVCAgICAgICAgIDYwICAgIC8vIFdEUyBsaW5rcyB1c2VzIHBhaXJ3aXNlIGtleSM2MCB+IDYzIGluIEFTSUMgcGFpcndpc2Uga2V5IHRhYmxlCi0jZGVmaW5lCVBNS0lEX05PICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgLy8gTnVtYmVyIG9mIFBNS0lEIHNhdmVkIHN1cHBvcnRlZAotI2RlZmluZSBNQVhfTEVOX09GX01MTUVfQlVGRkVSICAgICAgICAgIDIwNDgKLQotLy8gcG93ZXIgc3RhdHVzIHJlbGF0ZWQgZGVmaW5pdGlvbnMKLSNkZWZpbmUgUFdSX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFBXUl9TQVZFICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBQV1JfTU1QUyAgICAgICAgICAgICAgICAgICAgICAgIDIJCQkvL01JTU8gcG93ZXIgc2F2ZQotLy8jZGVmaW5lIFBXUl9VTktOT1dOICAgICAgICAgICAgICAgICAgIDIKLQotLy8gQXV0aCBhbmQgQXNzb2MgbW9kZSByZWxhdGVkIGRlZmluaXRpb25zCi0jZGVmaW5lIEFVVEhfTU9ERV9PUEVOICAgICAgICAgICAgICAgICAgMHgwMAotI2RlZmluZSBBVVRIX01PREVfS0VZICAgICAgICAgICAgICAgICAgIDB4MDEKLS8vI2RlZmluZSBBVVRIX01PREVfQVVUT19TV0lUQ0ggICAgICAgICAweDAzCi0vLyNkZWZpbmUgQVVUSF9NT0RFX0RFQVVUSCAgICAgICAgICAgICAgMHgwNAotLy8jZGVmaW5lIEFVVEhfTU9ERV9VUExBWUVSICAgICAgICAgICAgIDB4MDUgLy8gcmVzZXJ2ZWQgZm9yIDgwMi4xMWkgdXNlCi0KLS8vIEJTUyBUeXBlIGRlZmluaXRpb25zCi0jZGVmaW5lIEJTU19BREhPQyAgICAgICAgICAgICAgICAgICAgICAgMCAgLy8gPSBOZGlzODAyXzExSUJTUwotI2RlZmluZSBCU1NfSU5GUkEgICAgICAgICAgICAgICAgICAgICAgIDEgIC8vID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlCi0jZGVmaW5lIEJTU19BTlkgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLy8gPSBOZGlzODAyXzExQXV0b1Vua25vd24KLSNkZWZpbmUgQlNTX01PTklUT1IJCQkgICAgICAgICAgICAzICAvLyA9IE5kaXM4MDJfMTFNb25pdG9yCi0KLQotLy8gUmVhc29uIGNvZGUgZGVmaW5pdGlvbnMKLSNkZWZpbmUgUkVBU09OX1JFU0VSVkVEICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFJFQVNPTl9VTlNQRUNJRlkgICAgICAgICAgICAgICAgMQotI2RlZmluZSBSRUFTT05fTk9fTE9OR0VSX1ZBTElEICAgICAgICAgIDIKLSNkZWZpbmUgUkVBU09OX0RFQVVUSF9TVEFfTEVBVklORyAgICAgICAzCi0jZGVmaW5lIFJFQVNPTl9ESVNBU1NPQ19JTkFDVElWRSAgICAgICAgNAotI2RlZmluZSBSRUFTT05fRElTQVNTUENfQVBfVU5BQkxFICAgICAgIDUKLSNkZWZpbmUgUkVBU09OX0NMUzJFUlIgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIFJFQVNPTl9DTFMzRVJSICAgICAgICAgICAgICAgICAgNwotI2RlZmluZSBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcgICAgIDgKLSNkZWZpbmUgUkVBU09OX1NUQV9SRVFfQVNTT0NfTk9UX0FVVEggICA5Ci0jZGVmaW5lIFJFQVNPTl9JTlZBTElEX0lFICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgUkVBU09OX01JQ19GQUlMVVJFICAgICAgICAgICAgICAxNAotI2RlZmluZSBSRUFTT05fNF9XQVlfVElNRU9VVCAgICAgICAgICAgIDE1Ci0jZGVmaW5lIFJFQVNPTl9HUk9VUF9LRVlfSFNfVElNRU9VVCAgICAgMTYKLSNkZWZpbmUgUkVBU09OX0lFX0RJRkZFUkVOVCAgICAgICAgICAgICAxNwotI2RlZmluZSBSRUFTT05fTUNJUEhFUl9OT1RfVkFMSUQgICAgICAgIDE4Ci0jZGVmaW5lIFJFQVNPTl9VQ0lQSEVSX05PVF9WQUxJRCAgICAgICAgMTkKLSNkZWZpbmUgUkVBU09OX0FLTVBfTk9UX1ZBTElEICAgICAgICAgICAyMAotI2RlZmluZSBSRUFTT05fVU5TVVBQT1JUX1JTTkVfVkVSICAgICAgIDIxCi0jZGVmaW5lIFJFQVNPTl9JTlZBTElEX1JTTkVfQ0FQICAgICAgICAgMjIKLSNkZWZpbmUgUkVBU09OXzgwMjFYX0FVVEhfRkFJTCAgICAgICAgICAyMwotI2RlZmluZSBSRUFTT05fQ0lQSEVSX1NVSVRFX1JFSkVDVEVEICAgIDI0Ci0jZGVmaW5lIFJFQVNPTl9ERUNMSU5FRCAgICAgICAgICAgICAgICAgMzcKLQotI2RlZmluZSBSRUFTT05fUU9TX1VOU1BFQ0lGWSAgICAgICAgICAgICAgMzIKLSNkZWZpbmUgUkVBU09OX1FPU19MQUNLX0JBTkRXSURUSCAgICAgICAgIDMzCi0jZGVmaW5lIFJFQVNPTl9QT09SX0NIQU5ORUxfQ09ORElUSU9OICAgICAzNAotI2RlZmluZSBSRUFTT05fUU9TX09VVFNJREVfVFhPUF9MSU1JVElPTiAgMzUKLSNkZWZpbmUgUkVBU09OX1FPU19RU1RBX0xFQVZJTkdfUUJTUyAgICAgIDM2Ci0jZGVmaW5lIFJFQVNPTl9RT1NfVU5XQU5URURfTUVDSEFOSVNNICAgICAzNwotI2RlZmluZSBSRUFTT05fUU9TX01FQ0hfU0VUVVBfUkVRVUlSRUQgICAgMzgKLSNkZWZpbmUgUkVBU09OX1FPU19SRVFVRVNUX1RJTUVPVVQgICAgICAgIDM5Ci0jZGVmaW5lIFJFQVNPTl9RT1NfQ0lQSEVSX05PVF9TVVBQT1JUICAgICA0NQotCi0vLyBTdGF0dXMgY29kZSBkZWZpbml0aW9ucwotI2RlZmluZSBNTE1FX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTUxNRV9VTlNQRUNJRllfRkFJTCAgICAgICAgICAgICAxCi0jZGVmaW5lIE1MTUVfQ0FOTk9UX1NVUFBPUlRfQ0FQICAgICAgICAgMTAKLSNkZWZpbmUgTUxNRV9SRUFTU09DX0RFTllfQVNTT0NfRVhJU1QgICAxMQotI2RlZmluZSBNTE1FX0FTU09DX0RFTllfT1VUX1NDT1BFICAgICAgIDEyCi0jZGVmaW5lIE1MTUVfQUxHX05PVF9TVVBQT1JUICAgICAgICAgICAgMTMKLSNkZWZpbmUgTUxNRV9TRVFfTlJfT1VUX09GX1NFUVVFTkNFICAgICAxNAotI2RlZmluZSBNTE1FX1JFSl9DSEFMTEVOR0VfRkFJTFVSRSAgICAgIDE1Ci0jZGVmaW5lIE1MTUVfUkVKX1RJTUVPVVQgICAgICAgICAgICAgICAgICAxNgotI2RlZmluZSBNTE1FX0FTU09DX1JFSl9VTkFCTEVfSEFORExFX1NUQSAgMTcKLSNkZWZpbmUgTUxNRV9BU1NPQ19SRUpfREFUQV9SQVRFICAgICAgICAgIDE4Ci0KLSNkZWZpbmUgTUxNRV9BU1NPQ19SRUpfTk9fRVhUX1JBVEUgICAgICAgIDIyCi0jZGVmaW5lIE1MTUVfQVNTT0NfUkVKX05PX0VYVF9SQVRFX1BCQ0MgICAyMwotI2RlZmluZSBNTE1FX0FTU09DX1JFSl9OT19DQ0tfT0ZETSAgICAgICAgMjQKLQotI2RlZmluZSBNTE1FX1FPU19VTlNQRUNJRlkgICAgICAgICAgICAgICAgMzIKLSNkZWZpbmUgTUxNRV9SRVFVRVNUX0RFQ0xJTkVEICAgICAgICAgICAgIDM3Ci0jZGVmaW5lIE1MTUVfUkVRVUVTVF9XSVRIX0lOVkFMSURfUEFSQU0gICAzOAotI2RlZmluZSBNTE1FX0lOVkFMSURfR1JPVVBfQ0lQSEVSCSAgNDEKLSNkZWZpbmUgTUxNRV9JTlZBTElEX1BBSVJXSVNFX0NJUEhFUgkgIDQyCi0jZGVmaW5lIE1MTUVfSU5WQUxJRF9BS01QCQkJICA0MwotI2RlZmluZSBNTE1FX0RMU19OT1RfQUxMT1dfSU5fUUJTUyAgICAgICAgNDgKLSNkZWZpbmUgTUxNRV9ERVNUX1NUQV9OT1RfSU5fUUJTUyAgICAgICAgIDQ5Ci0jZGVmaW5lIE1MTUVfREVTVF9TVEFfSVNfTk9UX0FfUVNUQSAgICAgICA1MAotCi0jZGVmaW5lIE1MTUVfSU5WQUxJRF9GT1JNQVQgICAgICAgICAgICAgMHg1MQotI2RlZmluZSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0UgICAgICAgICAgIDB4NTIKLSNkZWZpbmUgTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVCAgICAgICAweDUzCi0jZGVmaW5lIE1MTUVfTUFDX1RBQkxFX0ZBSUwgICAgICAgICAgICAgMHg1NAotCi0vLyBJRSBjb2RlCi0jZGVmaW5lIElFX1NTSUQgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBJRV9TVVBQX1JBVEVTICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgSUVfRkhfUEFSTSAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIElFX0RTX1BBUk0gICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBJRV9DRl9QQVJNICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgSUVfVElNICAgICAgICAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIElFX0lCU1NfUEFSTSAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBJRV9DT1VOVFJZICAgICAgICAgICAgICAgICAgICAgIDcgICAgIC8vIDgwMi4xMWQKLSNkZWZpbmUgSUVfODAyXzExRF9SRVFVRVNUICAgICAgICAgICAgICAxMCAgICAvLyA4MDIuMTFkCi0jZGVmaW5lIElFX1FCU1NfTE9BRCAgICAgICAgICAgICAgICAgICAgMTEgICAgLy8gODAyLjExZSBkOQotI2RlZmluZSBJRV9FRENBX1BBUkFNRVRFUiAgICAgICAgICAgICAgIDEyICAgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgSUVfVFNQRUMgICAgICAgICAgICAgICAgICAgICAgICAxMyAgICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIElFX1RDTEFTICAgICAgICAgICAgICAgICAgICAgICAgMTQgICAgLy8gODAyLjExZSBkOQotI2RlZmluZSBJRV9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIDE1ICAgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgSUVfQ0hBTExFTkdFX1RFWFQgICAgICAgICAgICAgICAxNgotI2RlZmluZSBJRV9QT1dFUl9DT05TVFJBSU5UICAgICAgICAgICAgIDMyICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9QT1dFUl9DQVBBQklMSVRZICAgICAgICAgICAgIDMzICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9UUENfUkVRVUVTVCAgICAgICAgICAgICAgICAgIDM0ICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9UUENfUkVQT1JUICAgICAgICAgICAgICAgICAgIDM1ICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9TVVBQX0NIQU5ORUxTICAgICAgICAgICAgICAgIDM2ICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQgIDM3ICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUICAgICAgICAgIDM4ICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQgICAgICAgICAgIDM5ICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9RVUlFVCAgICAgICAgICAgICAgICAgICAgICAgIDQwICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9JQlNTX0RGUyAgICAgICAgICAgICAgICAgICAgIDQxICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9FUlAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyICAgIC8vIDgwMi4xMWcKLSNkZWZpbmUgSUVfVFNfREVMQVkgICAgICAgICAgICAgICAgICAgICA0MyAgICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIElFX1RDTEFTX1BST0NFU1NJTkcgICAgICAgICAgICAgNDQgICAgLy8gODAyLjExZSBkOQotI2RlZmluZSBJRV9RT1NfQ0FQQUJJTElUWSAgICAgICAgICAgICAgIDQ2ICAgIC8vIDgwMi4xMWUgZDYKLSNkZWZpbmUgSUVfSFRfQ0FQICAgICAgICAgICAgICAgICAgICAgICA0NSAgICAvLyA4MDIuMTFuIGQxLiBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRAotI2RlZmluZSBJRV9BUF9DSEFOTkVMX1JFUE9SVAkJCTUxICAgIC8vIDgwMi4xMWsgZDYKLSNkZWZpbmUgSUVfSFRfQ0FQMiAgICAgICAgICAgICAgICAgICAgICAgICA1MiAgICAvLyA4MDIuMTFuIGQxLiBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRAotI2RlZmluZSBJRV9SU04gICAgICAgICAgICAgICAgICAgICAgICAgIDQ4ICAgIC8vIDgwMi4xMWkgZDMuMAotI2RlZmluZSBJRV9XUEEyICAgICAgICAgICAgICAgICAgICAgICAgIDQ4ICAgIC8vIFdQQTIKLSNkZWZpbmUgSUVfRVhUX1NVUFBfUkFURVMgICAgICAgICAgICAgICA1MCAgICAvLyA4MDIuMTFnCi0jZGVmaW5lIElFX1NVUFBfUkVHX0NMQVNTICAgICAgICAgICAgICAgNTkgICAgLy8gODAyLjExeS4gU3VwcG9ydGVkIHJlZ3VsYXRvcnkgY2xhc3Nlcy4KLSNkZWZpbmUgSUVfRVhUX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVAk2MAkvLyA4MDIuMTFuCi0jZGVmaW5lIElFX0FERF9IVCAgICAgICAgICAgICAgICAgICAgICAgICA2MSAgICAvLyA4MDIuMTFuIGQxLiBBRERJVElPTkFMIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJECi0jZGVmaW5lIElFX0FERF9IVDIgICAgICAgICAgICAgICAgICAgICAgICA1MyAgICAvLyA4MDIuMTFuIGQxLiBBRERJVElPTkFMIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJECi0KLQotLy8gRm9yIDgwMi4xMW4gRDMuMDMKLS8vI2RlZmluZSBJRV9ORVdfRVhUX0NIQV9PRkZTRVQgICAgICAgICAgICAgNjIgICAgLy8gODAyLjExbiBkMS4gTmV3IGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldCBlbGVtZXQKLSNkZWZpbmUgSUVfU0VDT05EQVJZX0NIX09GRlNFVAkJNjIJLy8gODAyLjExbiBEMy4wMwlTZWNvbmRhcnkgQ2hhbm5lbCBPZmZzZXQgZWxlbWVudAotI2RlZmluZSBJRV9XQVBJCQkJCQkJCTY4CQkvLyBXQVBJIGluZm9ybWF0aW9uIGVsZW1lbnQKLSNkZWZpbmUgSUVfMjA0MF9CU1NfQ09FWElTVCAgICAgICAgICAgICAgIDcyICAgIC8vIDgwMi4xMW4gRDMuMC4zCi0jZGVmaW5lIElFXzIwNDBfQlNTX0lOVE9MRVJBTlRfUkVQT1JUICAgICA3MyAgICAvLyA4MDIuMTFuIEQzLjAzCi0jZGVmaW5lIElFX09WRVJMQVBCU1NfU0NBTl9QQVJNICAgICAgICAgICA3NCAgICAvLyA4MDIuMTFuIEQzLjAzCi0jZGVmaW5lIElFX0VYVF9DQVBBQklMSVRZICAgICAgICAgICAgICAgIDEyNyAgIC8vIDgwMi4xMW4gRDMuMDMKLQotCi0jZGVmaW5lIElFX1dQQSAgICAgICAgICAgICAgICAgICAgICAgICAgMjIxICAgLy8gV1BBCi0jZGVmaW5lIElFX1ZFTkRPUl9TUEVDSUZJQyAgICAgICAgICAgICAgMjIxICAgLy8gV2lmaSBXTU0gKFdNRSkKLQotI2RlZmluZSBPVUlfQlJPQURDT01fSFQgICAgICAgICAgICAgIDUxICAgLy8KLSNkZWZpbmUgT1VJX0JST0FEQ09NX0hUQUREICAgICAgICAgICAgICA1MiAgIC8vCi0jZGVmaW5lIE9VSV9QUkVOX0hUX0NBUCAgICAgICAgICAgICAgNTEgICAvLwotI2RlZmluZSBPVUlfUFJFTl9BRERfSFQgICAgICAgICAgICAgIDUyICAgLy8KLQotLy8gQ0NYIGluZm9ybWF0aW9uCi0jZGVmaW5lIElFX0FJUk9ORVRfQ0tJUCAgICAgICAgICAgICAgICAgMTMzICAgLy8gQ0NYMS4wIElEIDg1SCBmb3IgQ0tJUAotI2RlZmluZSBJRV9BUF9UWF9QT1dFUiAgICAgICAgICAgICAgICAgIDE1MCAgIC8vIENDWCAyLjAgZm9yIEFQIHRyYW5zbWl0IHBvd2VyCi0jZGVmaW5lIElFX01FQVNVUkVNRU5UX0NBUEFCSUxJVFkgICAgICAgMjIxICAgLy8gQ0NYIDIuMAotI2RlZmluZSBJRV9DQ1hfVjIgICAgICAgICAgICAgICAgICAgICAgIDIyMQotI2RlZmluZSBJRV9BSVJPTkVUX0lQQUREUkVTUyAgICAgICAgICAgIDE0OSAgIC8vIENDWCBJRCA5NUggZm9yIElQIEFkZHJlc3MKLSNkZWZpbmUgSUVfQUlST05FVF9DQ0tNUkVBU1NPQyAgICAgICAgICAxNTYgICAvLyBDQ1ggSUQgOUNIIGZvciBDQ0tNIFJlYXNzb2NpYXRpb24gUmVxdWVzdCBlbGVtZW50Ci0jZGVmaW5lIENLSVBfTkVHT1RJQVRJT05fTEVOR1RIICAgICAgICAgMzAKLSNkZWZpbmUgQUlST05FVF9JUEFERFJFU1NfTEVOR1RIICAgICAgICAxMAotI2RlZmluZSBBSVJPTkVUX0NDS01SRUFTU09DX0xFTkdUSCAgICAgIDI0Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBNTE1FIHN0YXRlIG1hY2hpbmUgZGVmaW5pdGlvbgotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gU1RBIE1MTUUgc3RhdGUgbWFoY2luZXMKLSNkZWZpbmUgQVNTT0NfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAxCi0jZGVmaW5lIEFVVEhfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgMgotI2RlZmluZSBBVVRIX1JTUF9TVEFURV9NQUNISU5FICAgICAgICAgIDMKLSNkZWZpbmUgU1lOQ19TVEFURV9NQUNISU5FICAgICAgICAgICAgICA0Ci0jZGVmaW5lIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FICAgICAgICAgNQotI2RlZmluZSBXUEFfUFNLX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDYKLS8vI2RlZmluZSBMRUFQX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgIDcKLSNkZWZpbmUgQUlST05FVF9TVEFURV9NQUNISU5FICAgICAgICAgICA4Ci0jZGVmaW5lIEFDVElPTl9TVEFURV9NQUNISU5FICAgICAgICAgICA5Ci0KLS8vIEFQIE1MTUUgc3RhdGUgbWFjaGluZXMKLSNkZWZpbmUgQVBfQVNTT0NfU1RBVEVfTUFDSElORSAgICAgICAgICAxMQotI2RlZmluZSBBUF9BVVRIX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDEyCi0jZGVmaW5lIEFQX1NZTkNfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTQKLSNkZWZpbmUgQVBfQ05UTF9TVEFURV9NQUNISU5FICAgICAgICAgICAxNQotI2RlZmluZSBXU0NfU1RBVEVfTUFDSElORSAgICAgICAgICAgIDE3Ci0jZGVmaW5lIFdTQ19VUE5QX1NUQVRFX01BQ0hJTkUJCSAgICAxOAotCi0KLSNkZWZpbmUgV1BBX1NUQVRFX01BQ0hJTkUJCQkyMwotCi0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLSNkZWZpbmUgRExTX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgICAyNgotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0vLwotLy8gU1RBJ3MgQ09OVFJPTC9DT05ORUNUIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLwotI2RlZmluZSBDTlRMX0lETEUgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQ05UTF9XQUlUX0RJU0FTU09DICAgICAgICAgICAgICAxCi0jZGVmaW5lIENOVExfV0FJVF9KT0lOICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBDTlRMX1dBSVRfUkVBU1NPQyAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgQ05UTF9XQUlUX1NUQVJUICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIENOVExfV0FJVF9BVVRIICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBDTlRMX1dBSVRfQVNTT0MgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgQ05UTF9XQUlUX0FVVEgyICAgICAgICAgICAgICAgICA3Ci0jZGVmaW5lIENOVExfV0FJVF9PSURfTElTVF9TQ0FOICAgICAgICAgOAotI2RlZmluZSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DICAgICAgICAgIDkKLQotI2RlZmluZSBNVDJfQVNTT0NfQ09ORiAgICAgICAgICAgICAgICAgIDM0Ci0jZGVmaW5lIE1UMl9BVVRIX0NPTkYgICAgICAgICAgICAgICAgICAgMzUKLSNkZWZpbmUgTVQyX0RFQVVUSF9DT05GICAgICAgICAgICAgICAgICAzNgotI2RlZmluZSBNVDJfRElTQVNTT0NfQ09ORiAgICAgICAgICAgICAgIDM3Ci0jZGVmaW5lIE1UMl9SRUFTU09DX0NPTkYgICAgICAgICAgICAgICAgMzgKLSNkZWZpbmUgTVQyX1BXUl9NR01UX0NPTkYgICAgICAgICAgICAgICAzOQotI2RlZmluZSBNVDJfSk9JTl9DT05GICAgICAgICAgICAgICAgICAgIDQwCi0jZGVmaW5lIE1UMl9TQ0FOX0NPTkYgICAgICAgICAgICAgICAgICAgNDEKLSNkZWZpbmUgTVQyX1NUQVJUX0NPTkYgICAgICAgICAgICAgICAgICA0MgotI2RlZmluZSBNVDJfR0VUX0NPTkYgICAgICAgICAgICAgICAgICAgIDQzCi0jZGVmaW5lIE1UMl9TRVRfQ09ORiAgICAgICAgICAgICAgICAgICAgNDQKLSNkZWZpbmUgTVQyX1JFU0VUX0NPTkYgICAgICAgICAgICAgICAgICA0NQotI2RlZmluZSBNVDJfRlRfT1REX0NPTkYJCQkJCTQ2Ci0jZGVmaW5lIE1UMl9NTE1FX1JPQU1JTkdfUkVRICAgICAgICAgICAgNTIKLQotI2RlZmluZSBDTlRMX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgIDEKLQotLy8KLS8vIFNUQSdzIEFTU09DIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLwotI2RlZmluZSBBU1NPQ19JRExFICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQVNTT0NfV0FJVF9SU1AgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFJFQVNTT0NfV0FJVF9SU1AgICAgICAgICAgICAgICAgMgotI2RlZmluZSBESVNBU1NPQ19XQUlUX1JTUCAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgTUFYX0FTU09DX1NUQVRFICAgICAgICAgICAgICAgICA0Ci0KLSNkZWZpbmUgQVNTT0NfTUFDSElORV9CQVNFICAgICAgICAgICAgICAwCi0jZGVmaW5lIE1UMl9NTE1FX0FTU09DX1JFUSAgICAgICAgICAgICAgMAotI2RlZmluZSBNVDJfTUxNRV9SRUFTU09DX1JFUSAgICAgICAgICAgIDEKLSNkZWZpbmUgTVQyX01MTUVfRElTQVNTT0NfUkVRICAgICAgICAgICAyCi0jZGVmaW5lIE1UMl9QRUVSX0RJU0FTU09DX1JFUSAgICAgICAgICAgMwotI2RlZmluZSBNVDJfUEVFUl9BU1NPQ19SRVEgICAgICAgICAgICAgIDQKLSNkZWZpbmUgTVQyX1BFRVJfQVNTT0NfUlNQICAgICAgICAgICAgICA1Ci0jZGVmaW5lIE1UMl9QRUVSX1JFQVNTT0NfUkVRICAgICAgICAgICAgNgotI2RlZmluZSBNVDJfUEVFUl9SRUFTU09DX1JTUCAgICAgICAgICAgIDcKLSNkZWZpbmUgTVQyX0RJU0FTU09DX1RJTUVPVVQgICAgICAgICAgICA4Ci0jZGVmaW5lIE1UMl9BU1NPQ19USU1FT1VUICAgICAgICAgICAgICAgOQotI2RlZmluZSBNVDJfUkVBU1NPQ19USU1FT1VUICAgICAgICAgICAgIDEwCi0jZGVmaW5lIE1BWF9BU1NPQ19NU0cgICAgICAgICAgICAgICAgICAgMTEKLQotI2RlZmluZSBBU1NPQ19GVU5DX1NJWkUgICAgICAgICAgICAgICAgIChNQVhfQVNTT0NfU1RBVEUgKiBNQVhfQVNTT0NfTVNHKQotCi0vLwotLy8gQUNUIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLwotI2RlZmluZSBBQ1RfSURMRSAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE1BWF9BQ1RfU1RBVEUgICAgICAgICAgICAgICAgIDEKLQotI2RlZmluZSBBQ1RfTUFDSElORV9CQVNFICAgICAgICAgICAgICAwCi0KLS8vVGhvc2UgUEVFUl94eF9DQVRFIG51bWJlciBpcyBiYXNlZCBvbiByZWFsIENhdGVnYXJ5IHZhbHVlIGluIElFRUUgc3BlYy4gUGxlYXNlIGRvbidlcyBtb2RpZnkgaXQgYnkgeW91ciBzZWxmLgotLy9DYXRlZ29yeQotI2RlZmluZSBNVDJfUEVFUl9TUEVDVFJVTV9DQVRFICAgICAgICAgICAgICAwCi0jZGVmaW5lIE1UMl9QRUVSX1FPU19DQVRFICAgICAgICAgICAgICAxCi0jZGVmaW5lIE1UMl9QRUVSX0RMU19DQVRFICAgICAgICAgICAgIDIKLSNkZWZpbmUgTVQyX1BFRVJfQkFfQ0FURSAgICAgICAgICAgICAzCi0jZGVmaW5lIE1UMl9QRUVSX1BVQkxJQ19DQVRFICAgICAgICAgICAgIDQKLSNkZWZpbmUgTVQyX1BFRVJfUk1fQ0FURSAgICAgICAgICAgICA1Ci0vKiAiRlRfQ0FURUdPUllfQlNTX1RSQU5TSVRJT04gZXF1YWwgdG8gNiIgaXMgZGVmaW5lZCBmaWxlIG9mICJkb3QxMXJfZnQuaCIgKi8KLSNkZWZpbmUgTVQyX1BFRVJfSFRfQ0FURSAgICAgICAgICAgICA3CS8vCTcuNC43Ci0jZGVmaW5lIE1BWF9QRUVSX0NBVEVfTVNHICAgICAgICAgICAgICAgICAgIDcKLQotCi0jZGVmaW5lIE1UMl9NTE1FX0FERF9CQV9DQVRFICAgICAgICAgICAgIDgKLSNkZWZpbmUgTVQyX01MTUVfT1JJX0RFTEJBX0NBVEUgICAgICAgICAgICAgOQotI2RlZmluZSBNVDJfTUxNRV9SRUNfREVMQkFfQ0FURSAgICAgICAgICAgICAxMAotI2RlZmluZSBNVDJfTUxNRV9RT1NfQ0FURSAgICAgICAgICAgICAgMTEKLSNkZWZpbmUgTVQyX01MTUVfRExTX0NBVEUgICAgICAgICAgICAgMTIKLSNkZWZpbmUgTVQyX0FDVF9JTlZBTElEICAgICAgICAgICAgIDEzCi0KLSNkZWZpbmUgTUFYX0FDVF9NU0cgICAgICAgICAgICAgICAgICAgMTQKLQotCi0vL0NhdGVnb3J5IGZpZWxkCi0jZGVmaW5lIENBVEVHT1JZX1NQRUNUUlVNCQkwCi0jZGVmaW5lIENBVEVHT1JZX1FPUwkJCTEKLSNkZWZpbmUgQ0FURUdPUllfRExTCQkJMgotI2RlZmluZSBDQVRFR09SWV9CQQkJCTMKLSNkZWZpbmUgQ0FURUdPUllfUFVCTElDCQk0Ci0jZGVmaW5lIENBVEVHT1JZX1JNCQkJNQotI2RlZmluZSBDQVRFR09SWV9IVAkJCTcKLQotCi0vLyBETFMgQWN0aW9uIGZyYW1lIGRlZmluaXRpb24KLSNkZWZpbmUgQUNUSU9OX0RMU19SRVFVRVNUCQkJMAotI2RlZmluZSBBQ1RJT05fRExTX1JFU1BPTlNFCQkJMQotI2RlZmluZSBBQ1RJT05fRExTX1RFQVJET1dOCQkJMgotCi0vL1NwZWN0cnVtICBBY3Rpb24gZmllbGQgdmFsdWUgODAyLjExaCA3LjQuMQotI2RlZmluZSBTUEVDX01SUQkwCS8vIFJlcXVlc3QKLSNkZWZpbmUgU1BFQ19NUlAJMQkvL1JlcG9ydAotI2RlZmluZSBTUEVDX1RQQ1JRCTIKLSNkZWZpbmUgU1BFQ19UUENSUAkzCi0jZGVmaW5lIFNQRUNfQ0hBTk5FTF9TV0lUQ0gJNAotCi0KLS8vQkEgIEFjdGlvbiBmaWVsZCB2YWx1ZQotI2RlZmluZSBBRERCQV9SRVEJMAotI2RlZmluZSBBRERCQV9SRVNQCTEKLSNkZWZpbmUgREVMQkEgICAyCi0KLS8vUHVibGljJ3MgIEFjdGlvbiBmaWVsZCB2YWx1ZSBpbiBQdWJsaWMgQ2F0ZWdvcnkuICBTb21lIGluIDgwMi4xMXkgYW5kIHNvbWUgaW4gMTFuCi0jZGVmaW5lIEFDVElPTl9CU1NfMjA0MF9DT0VYSVNUCQkJCTAJLy8gMTFuCi0jZGVmaW5lIEFDVElPTl9EU0VfRU5BQkxFTUVOVAkJCQkJMQkvLyAxMXkgRDkuMAotI2RlZmluZSBBQ1RJT05fRFNFX0RFRU5BQkxFTUVOVAkJCQkyCS8vIDExeSBEOS4wCi0jZGVmaW5lIEFDVElPTl9EU0VfUkVHX0xPQ0FUSU9OX0FOTk9VTkNFCTMJLy8gMTF5IEQ5LjAKLSNkZWZpbmUgQUNUSU9OX0VYVF9DSF9TV0lUQ0hfQU5OT1VOQ0UJCTQJLy8gMTF5IEQ5LjAKLSNkZWZpbmUgQUNUSU9OX0RTRV9NRUFTVVJFTUVOVF9SRVEJCQk1CS8vIDExeSBEOS4wCi0jZGVmaW5lIEFDVElPTl9EU0VfTUVBU1VSRU1FTlRfUkVQT1JUCQk2CS8vIDExeSBEOS4wCi0jZGVmaW5lIEFDVElPTl9NRUFTVVJFTUVOVF9QSUxPVF9BQ1RJT04JCTcJLy8gMTF5IEQ5LjAKLSNkZWZpbmUgQUNUSU9OX0RTRV9QT1dFUl9DT05TVFJBSU5UCQkJOAkvLyAxMXkgRDkuMAotCi0KLS8vSFQgIEFjdGlvbiBmaWVsZCB2YWx1ZQotI2RlZmluZSBOT1RJRllfQldfQUNUSU9OCQkJCTAKLSNkZWZpbmUgU01QU19BQ1RJT04JCQkJCQkxCi0jZGVmaW5lIFBTTVBfQUNUSU9OCQkJCQkyCi0jZGVmaW5lIFNFVFBDT19BQ1RJT04JCQkJCTMKLSNkZWZpbmUgTUlNT19DSEFfTUVBU1VSRV9BQ1RJT04JCQk0Ci0jZGVmaW5lIE1JTU9fTl9CRUFDT05GT1JNCQkJCTUKLSNkZWZpbmUgTUlNT19CRUFDT05GT1JNCQkJCQk2Ci0jZGVmaW5lIEFOVEVOTkFfU0VMRUNUCQkJCQk3Ci0jZGVmaW5lIEhUX0lORk9fRVhDSEFOR0UJCQkJOAotCi0jZGVmaW5lIEFDVF9GVU5DX1NJWkUgICAgICAgICAgICAgICAgIChNQVhfQUNUX1NUQVRFICogTUFYX0FDVF9NU0cpCi0vLwotLy8gU1RBJ3MgQVVUSEVOVElDQVRJT04gc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldnZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLwotI2RlZmluZSBBVVRIX1JFUV9JRExFICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQVVUSF9XQUlUX1NFUTIgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFVVEhfV0FJVF9TRVE0ICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBNQVhfQVVUSF9TVEFURSAgICAgICAgICAgICAgICAgIDMKLQotI2RlZmluZSBBVVRIX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTVQyX01MTUVfQVVUSF9SRVEgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE1UMl9QRUVSX0FVVEhfRVZFTiAgICAgICAgICAgICAgMQotI2RlZmluZSBNVDJfQVVUSF9USU1FT1VUICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTUFYX0FVVEhfTVNHICAgICAgICAgICAgICAgICAgICAzCi0KLSNkZWZpbmUgQVVUSF9GVU5DX1NJWkUgICAgICAgICAgICAgICAgICAoTUFYX0FVVEhfU1RBVEUgKiBNQVhfQVVUSF9NU0cpCi0KLS8vCi0vLyBTVEEncyBBVVRIX1JTUCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KLSNkZWZpbmUgQVVUSF9SU1BfSURMRSAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEFVVEhfUlNQX1dBSVRfQ0hBTCAgICAgICAgICAgICAgMQotI2RlZmluZSBNQVhfQVVUSF9SU1BfU1RBVEUgICAgICAgICAgICAgIDIKLQotI2RlZmluZSBBVVRIX1JTUF9NQUNISU5FX0JBU0UgICAgICAgICAgIDAKLSNkZWZpbmUgTVQyX0FVVEhfQ0hBTExFTkdFX1RJTUVPVVQgICAgICAwCi0jZGVmaW5lIE1UMl9QRUVSX0FVVEhfT0REICAgICAgICAgICAgICAgMQotI2RlZmluZSBNVDJfUEVFUl9ERUFVVEggICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTUFYX0FVVEhfUlNQX01TRyAgICAgICAgICAgICAgICAzCi0KLSNkZWZpbmUgQVVUSF9SU1BfRlVOQ19TSVpFICAgICAgICAgICAgICAoTUFYX0FVVEhfUlNQX1NUQVRFICogTUFYX0FVVEhfUlNQX01TRykKLQotLy8KLS8vIFNUQSdzIFNZTkMgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0jZGVmaW5lIFNZTkNfSURMRSAgICAgICAgICAgICAgICAgICAgICAgMCAgLy8gbWVyZ2UgTk9fQlNTLElCU1NfSURMRSxJQlNTX0FDVElWRSBhbmQgQlNTIGluIHRvIDEgc3RhdGUKLSNkZWZpbmUgSk9JTl9XQUlUX0JFQUNPTiAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNDQU5fTElTVEVOICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBNQVhfU1lOQ19TVEFURSAgICAgICAgICAgICAgICAgIDMKLQotI2RlZmluZSBTWU5DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTVQyX01MTUVfU0NBTl9SRVEgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE1UMl9NTE1FX0pPSU5fUkVRICAgICAgICAgICAgICAgMQotI2RlZmluZSBNVDJfTUxNRV9TVEFSVF9SRVEgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTVQyX1BFRVJfQkVBQ09OICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIE1UMl9QRUVSX1BST0JFX1JTUCAgICAgICAgICAgICAgNAotI2RlZmluZSBNVDJfUEVFUl9BVElNICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgTVQyX1NDQU5fVElNRU9VVCAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIE1UMl9CRUFDT05fVElNRU9VVCAgICAgICAgICAgICAgNwotI2RlZmluZSBNVDJfQVRJTV9USU1FT1VUICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgTVQyX1BFRVJfUFJPQkVfUkVRICAgICAgICAgICAgICA5Ci0jZGVmaW5lIE1BWF9TWU5DX01TRyAgICAgICAgICAgICAgICAgICAgMTAKLQotI2RlZmluZSBTWU5DX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgIChNQVhfU1lOQ19TVEFURSAqIE1BWF9TWU5DX01TRykKLQotLy9NZXNzYWdlcyBmb3IgdGhlIERMUyBzdGF0ZSBtYWNoaW5lCi0jZGVmaW5lIERMU19JRExFCQkJCQkJMAotI2RlZmluZSBNQVhfRExTX1NUQVRFCQkJCQkxCi0KLSNkZWZpbmUgRExTX01BQ0hJTkVfQkFTRQkJCQkwCi0jZGVmaW5lIE1UMl9NTE1FX0RMU19SRVEJCQkgICAgMAotI2RlZmluZSBNVDJfUEVFUl9ETFNfUkVRCQkJICAgIDEKLSNkZWZpbmUgTVQyX1BFRVJfRExTX1JTUAkJCSAgICAyCi0jZGVmaW5lIE1UMl9NTE1FX0RMU19URUFSX0RPV04JCSAgICAzCi0jZGVmaW5lIE1UMl9QRUVSX0RMU19URUFSX0RPV04JCSAgICA0Ci0jZGVmaW5lIE1BWF9ETFNfTVNHCQkJCSAgICAgICAgNQotCi0jZGVmaW5lIERMU19GVU5DX1NJWkUJCQkJCShNQVhfRExTX1NUQVRFICogTUFYX0RMU19NU0cpCi0KLS8vCi0vLyBXU0MgU3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0KLS8vCi0vLyBBUCdzIENPTlRST0wvQ09OTkVDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KLSNkZWZpbmUgQVBfQ05UTF9GVU5DX1NJWkUgICAgICAgICAgICAgICAxCi0KLS8vCi0vLyBBUCdzIEFTU09DIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLwotI2RlZmluZSBBUF9BU1NPQ19JRExFICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQVBfTUFYX0FTU09DX1NUQVRFICAgICAgICAgICAgICAxCi0KLSNkZWZpbmUgQVBfQVNTT0NfTUFDSElORV9CQVNFICAgICAgICAgICAwCi0jZGVmaW5lIEFQTVQyX01MTUVfRElTQVNTT0NfUkVRICAgICAgICAgMAotI2RlZmluZSBBUE1UMl9QRUVSX0RJU0FTU09DX1JFUSAgICAgICAgIDEKLSNkZWZpbmUgQVBNVDJfUEVFUl9BU1NPQ19SRVEgICAgICAgICAgICAyCi0jZGVmaW5lIEFQTVQyX1BFRVJfUkVBU1NPQ19SRVEgICAgICAgICAgMwotI2RlZmluZSBBUE1UMl9DTFMzRVJSICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgQVBfTUFYX0FTU09DX01TRyAgICAgICAgICAgICAgICA1Ci0KLSNkZWZpbmUgQVBfQVNTT0NfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBfTUFYX0FTU09DX1NUQVRFICogQVBfTUFYX0FTU09DX01TRykKLQotLy8KLS8vIEFQJ3MgQVVUSEVOVElDQVRJT04gc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0jZGVmaW5lIEFQX0FVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgMAotI2RlZmluZSBBUF9NQVhfQVVUSF9TVEFURSAgICAgICAgICAgICAgIDEKLQotI2RlZmluZSBBUF9BVVRIX01BQ0hJTkVfQkFTRSAgICAgICAgICAgIDAKLSNkZWZpbmUgQVBNVDJfTUxNRV9ERUFVVEhfUkVRICAgICAgICAgICAwCi0jZGVmaW5lIEFQTVQyX0NMUzJFUlIgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBBUE1UMl9QRUVSX0RFQVVUSAkJCQkyCi0jZGVmaW5lIEFQTVQyX1BFRVJfQVVUSF9SRVEJCQkJMwotI2RlZmluZSBBUE1UMl9QRUVSX0FVVEhfQ09ORklSTQkJCTQKLSNkZWZpbmUgQVBfTUFYX0FVVEhfTVNHICAgICAgICAgICAgICAgICA1Ci0KLSNkZWZpbmUgQVBfQVVUSF9GVU5DX1NJWkUgICAgICAgICAgICAgICAoQVBfTUFYX0FVVEhfU1RBVEUgKiBBUF9NQVhfQVVUSF9NU0cpCi0KLS8vCi0vLyBBUCdzIFNZTkMgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0jZGVmaW5lIEFQX1NZTkNfSURMRSAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBBUF9TQ0FOX0xJU1RFTgkJCQkJMQotI2RlZmluZSBBUF9NQVhfU1lOQ19TVEFURSAgICAgICAgICAgICAgIDIKLQotI2RlZmluZSBBUF9TWU5DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgIDAKLSNkZWZpbmUgQVBNVDJfUEVFUl9QUk9CRV9SRVEgICAgICAgICAgICAwCi0jZGVmaW5lIEFQTVQyX1BFRVJfQkVBQ09OICAgICAgICAgICAgICAgMQotI2RlZmluZSBBUE1UMl9NTE1FX1NDQU5fUkVRCQkJCTIKLSNkZWZpbmUgQVBNVDJfUEVFUl9QUk9CRV9SU1AJCQkzCi0jZGVmaW5lIEFQTVQyX1NDQU5fVElNRU9VVAkJCQk0Ci0jZGVmaW5lIEFQTVQyX01MTUVfU0NBTl9DTkNMCQkJNQotI2RlZmluZSBBUF9NQVhfU1lOQ19NU0cgICAgICAgICAgICAgICAgIDYKLQotI2RlZmluZSBBUF9TWU5DX0ZVTkNfU0laRSAgICAgICAgICAgICAgIChBUF9NQVhfU1lOQ19TVEFURSAqIEFQX01BWF9TWU5DX01TRykKLQotLy8KLS8vIENvbW1vbiBXUEEgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0jZGVmaW5lIFdQQV9QVEsgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBNQVhfV1BBX1BUS19TVEFURSAgICAgICAgICAgIDEKLQotI2RlZmluZSBXUEFfTUFDSElORV9CQVNFICAgICAgICAgICAgIDAKLSNkZWZpbmUgTVQyX0VBUFBhY2tldCAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE1UMl9FQVBPTFN0YXJ0ICAgICAgICAgICAgICAgMQotI2RlZmluZSBNVDJfRUFQT0xMb2dvZmYgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTVQyX0VBUE9MS2V5ICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIE1UMl9FQVBPTEFTRkFsZXJ0ICAgICAgICAgICAgNAotI2RlZmluZSBNQVhfV1BBX01TRyAgICAgICAgICAgICAgICAgIDUKLQotI2RlZmluZSBXUEFfRlVOQ19TSVpFICAgICAgICAgICAgICAgIChNQVhfV1BBX1BUS19TVEFURSAqIE1BWF9XUEFfTVNHKQotCi0jaWZkZWYgQVBDTElfU1VQUE9SVAotLy9BcENsaSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBtYWNoaW5lCi0jZGVmaW5lIEFQQ0xJX0FVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgMAotI2RlZmluZSBBUENMSV9BVVRIX1dBSVRfU0VRMiAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQVBDTElfQVVUSF9XQUlUX1NFUTQgICAgICAgICAgICAgICAyCi0jZGVmaW5lIEFQQ0xJX01BWF9BVVRIX1NUQVRFICAgICAgICAgICAgICAgMwotCi0jZGVmaW5lIEFQQ0xJX0FVVEhfTUFDSElORV9CQVNFICAgICAgICAgICAgMAotI2RlZmluZSBBUENMSV9NVDJfTUxNRV9BVVRIX1JFUSAgICAgICAgICAgIDAKLSNkZWZpbmUgQVBDTElfTVQyX01MTUVfREVBVVRIX1JFUSAgICAgICAgICAxCi0jZGVmaW5lIEFQQ0xJX01UMl9QRUVSX0FVVEhfRVZFTiAgICAgICAgICAgMgotI2RlZmluZSBBUENMSV9NVDJfUEVFUl9ERUFVVEggICAgICAgICAgICAgIDMKLSNkZWZpbmUgQVBDTElfTVQyX0FVVEhfVElNRU9VVCAgICAgICAgICAgICA0Ci0jZGVmaW5lIEFQQ0xJX01BWF9BVVRIX01TRyAgICAgICAgICAgICAgICAgNQotCi0jZGVmaW5lIEFQQ0xJX0FVVEhfRlVOQ19TSVpFICAgICAgICAgICAgICAgKEFQQ0xJX01BWF9BVVRIX1NUQVRFICogQVBDTElfTUFYX0FVVEhfTVNHKQotCi0vL0FwQ2xpIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKLSNkZWZpbmUgQVBDTElfQVNTT0NfSURMRSAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEFQQ0xJX0FTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgMQotI2RlZmluZSBBUENMSV9NQVhfQVNTT0NfU1RBVEUgICAgICAgICAgICAgIDIKLQotI2RlZmluZSBBUENMSV9BU1NPQ19NQUNISU5FX0JBU0UgICAgICAgICAgIDAKLSNkZWZpbmUgQVBDTElfTVQyX01MTUVfQVNTT0NfUkVRICAgICAgICAgICAwCi0jZGVmaW5lIEFQQ0xJX01UMl9NTE1FX0RJU0FTU09DX1JFUSAgICAgICAgMQotI2RlZmluZSBBUENMSV9NVDJfUEVFUl9ESVNBU1NPQ19SRVEgICAgICAgIDIKLSNkZWZpbmUgQVBDTElfTVQyX1BFRVJfQVNTT0NfUlNQICAgICAgICAgICAzCi0jZGVmaW5lIEFQQ0xJX01UMl9BU1NPQ19USU1FT1VUICAgICAgICAgICAgNAotI2RlZmluZSBBUENMSV9NQVhfQVNTT0NfTVNHICAgICAgICAgICAgICAgIDUKLQotI2RlZmluZSBBUENMSV9BU1NPQ19GVU5DX1NJWkUgICAgICAgICAgICAgIChBUENMSV9NQVhfQVNTT0NfU1RBVEUgKiBBUENMSV9NQVhfQVNTT0NfTVNHKQotCi0vL0FwQ2xpIHN5bmMgc3RhdGUgbWFjaGluZQotI2RlZmluZSBBUENMSV9TWU5DX0lETEUgICAgICAgICAgICAgICAgICAgMCAgLy8gbWVyZ2UgTk9fQlNTLElCU1NfSURMRSxJQlNTX0FDVElWRSBhbmQgQlNTIGluIHRvIDEgc3RhdGUKLSNkZWZpbmUgQVBDTElfSk9JTl9XQUlUX1BST0JFX1JTUCAgICAgICAgIDEKLSNkZWZpbmUgQVBDTElfTUFYX1NZTkNfU1RBVEUgICAgICAgICAgICAgIDIKLQotI2RlZmluZSBBUENMSV9TWU5DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgMAotI2RlZmluZSBBUENMSV9NVDJfTUxNRV9QUk9CRV9SRVEgICAgICAgICAgMAotI2RlZmluZSBBUENMSV9NVDJfUEVFUl9QUk9CRV9SU1AgICAgICAgICAgMQotI2RlZmluZSBBUENMSV9NVDJfUFJPQkVfVElNRU9VVCAgICAgICAgICAgMgotI2RlZmluZSBBUENMSV9NQVhfU1lOQ19NU0cgICAgICAgICAgICAgICAgMwotCi0jZGVmaW5lIEFQQ0xJX1NZTkNfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBDTElfTUFYX1NZTkNfU1RBVEUgKiBBUENMSV9NQVhfU1lOQ19NU0cpCi0KLS8vQXBDbGkgY3RybCBzdGF0ZSBtYWNoaW5lCi0jZGVmaW5lIEFQQ0xJX0NUUkxfRElTQ09OTkVDVEVEICAgICAgICAgICAwICAvLyBtZXJnZSBOT19CU1MsSUJTU19JRExFLElCU1NfQUNUSVZFIGFuZCBCU1MgaW4gdG8gMSBzdGF0ZQotI2RlZmluZSBBUENMSV9DVFJMX1BST0JFICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBBUENMSV9DVFJMX0FVVEggICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBBUENMSV9DVFJMX0FVVEhfMiAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBBUENMSV9DVFJMX0FTU09DICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBBUENMSV9DVFJMX0RFQVNTT0MgICAgICAgICAgICAgICAgNQotI2RlZmluZSBBUENMSV9DVFJMX0NPTk5FQ1RFRCAgICAgICAgICAgICAgNgotI2RlZmluZSBBUENMSV9NQVhfQ1RSTF9TVEFURSAgICAgICAgICAgICAgNwotCi0jZGVmaW5lIEFQQ0xJX0NUUkxfTUFDSElORV9CQVNFICAgICAgICAgICAwCi0jZGVmaW5lIEFQQ0xJX0NUUkxfSk9JTl9SRVEgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEFQQ0xJX0NUUkxfUFJPQkVfUlNQICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFQQ0xJX0NUUkxfQVVUSF9SU1AgICAgICAgICAgICAgICAyCi0jZGVmaW5lIEFQQ0xJX0NUUkxfRElTQ09OTkVDVF9SRVEgICAgICAgICAzCi0jZGVmaW5lIEFQQ0xJX0NUUkxfUEVFUl9ESVNDT05ORUNUX1JFUSAgICA0Ci0jZGVmaW5lIEFQQ0xJX0NUUkxfQVNTT0NfUlNQICAgICAgICAgICAgICA1Ci0jZGVmaW5lIEFQQ0xJX0NUUkxfREVBU1NPQ19SU1AgICAgICAgICAgICA2Ci0jZGVmaW5lIEFQQ0xJX0NUUkxfSk9JTl9SRVFfVElNRU9VVCAgICAgICA3Ci0jZGVmaW5lIEFQQ0xJX0NUUkxfQVVUSF9SRVFfVElNRU9VVCAgICAgICA4Ci0jZGVmaW5lIEFQQ0xJX0NUUkxfQVNTT0NfUkVRX1RJTUVPVVQgICAgICA5Ci0jZGVmaW5lIEFQQ0xJX01BWF9DVFJMX01TRyAgICAgICAgICAgICAgICAxMAotCi0jZGVmaW5lIEFQQ0xJX0NUUkxfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBDTElfTUFYX0NUUkxfU1RBVEUgKiBBUENMSV9NQVhfQ1RSTF9NU0cpCi0KLQotI2VuZGlmIC8vIEFQQ0xJX1NVUFBPUlQgLy8KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyB2YWx1ZSBkb21haW4gb2YgODAyLjExIGhlYWRlciBGQy5UeXRlLCB3aGljaCBpcyBiMy4uYjIgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIKLSNkZWZpbmUgQlRZUEVfTUdNVCAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQlRZUEVfQ05UTCAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQlRZUEVfREFUQSAgICAgICAgICAgICAgICAgIDIKLQotLy8gdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBNR01UIGZyYW1lJ3MgRkMuc3VidHlwZSwgd2hpY2ggaXMgYjcuLjQgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIKLSNkZWZpbmUgU1VCVFlQRV9BU1NPQ19SRVEgICAgICAgICAgIDAKLSNkZWZpbmUgU1VCVFlQRV9BU1NPQ19SU1AgICAgICAgICAgIDEKLSNkZWZpbmUgU1VCVFlQRV9SRUFTU09DX1JFUSAgICAgICAgIDIKLSNkZWZpbmUgU1VCVFlQRV9SRUFTU09DX1JTUCAgICAgICAgIDMKLSNkZWZpbmUgU1VCVFlQRV9QUk9CRV9SRVEgICAgICAgICAgIDQKLSNkZWZpbmUgU1VCVFlQRV9QUk9CRV9SU1AgICAgICAgICAgIDUKLSNkZWZpbmUgU1VCVFlQRV9CRUFDT04gICAgICAgICAgICAgIDgKLSNkZWZpbmUgU1VCVFlQRV9BVElNICAgICAgICAgICAgICAgIDkKLSNkZWZpbmUgU1VCVFlQRV9ESVNBU1NPQyAgICAgICAgICAgIDEwCi0jZGVmaW5lIFNVQlRZUEVfQVVUSCAgICAgICAgICAgICAgICAxMQotI2RlZmluZSBTVUJUWVBFX0RFQVVUSCAgICAgICAgICAgICAgMTIKLSNkZWZpbmUgU1VCVFlQRV9BQ1RJT04gICAgICAgICAgICAgIDEzCi0jZGVmaW5lIFNVQlRZUEVfQUNUSU9OX05PX0FDSyAgICAgICAgICAgICAgMTQKLQotLy8gdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBDTlRMIGZyYW1lJ3MgRkMuc3VidHlwZSwgd2hpY2ggaXMgYjcuLjQgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIKLSNkZWZpbmUgU1VCVFlQRV9XUkFQUEVSCQk3Ci0jZGVmaW5lIFNVQlRZUEVfQkxPQ0tfQUNLX1JFUSAgICAgICA4Ci0jZGVmaW5lIFNVQlRZUEVfQkxPQ0tfQUNLICAgICAgICAgICA5Ci0jZGVmaW5lIFNVQlRZUEVfUFNfUE9MTCAgICAgICAgICAgICAxMAotI2RlZmluZSBTVUJUWVBFX1JUUyAgICAgICAgICAgICAgICAgMTEKLSNkZWZpbmUgU1VCVFlQRV9DVFMgICAgICAgICAgICAgICAgIDEyCi0jZGVmaW5lIFNVQlRZUEVfQUNLICAgICAgICAgICAgICAgICAxMwotI2RlZmluZSBTVUJUWVBFX0NGRU5EICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgU1VCVFlQRV9DRkVORF9DRkFDSyAgICAgICAgIDE1Ci0KLS8vIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgREFUQSBmcmFtZSdzIEZDLnN1YnR5cGUsIHdoaWNoIGlzIGI3Li40IG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyCi0jZGVmaW5lIFNVQlRZUEVfREFUQSAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFNVQlRZUEVfREFUQV9DRkFDSyAgICAgICAgICAxCi0jZGVmaW5lIFNVQlRZUEVfREFUQV9DRlBPTEwgICAgICAgICAyCi0jZGVmaW5lIFNVQlRZUEVfREFUQV9DRkFDS19DRlBPTEwgICAzCi0jZGVmaW5lIFNVQlRZUEVfTlVMTF9GVU5DICAgICAgICAgICA0Ci0jZGVmaW5lIFNVQlRZUEVfQ0ZBQ0sgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIFNVQlRZUEVfQ0ZQT0xMICAgICAgICAgICAgICA2Ci0jZGVmaW5lIFNVQlRZUEVfQ0ZBQ0tfQ0ZQT0xMICAgICAgICA3Ci0jZGVmaW5lIFNVQlRZUEVfUURBVEEgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIFNVQlRZUEVfUURBVEFfQ0ZBQ0sgICAgICAgICA5Ci0jZGVmaW5lIFNVQlRZUEVfUURBVEFfQ0ZQT0xMICAgICAgICAxMAotI2RlZmluZSBTVUJUWVBFX1FEQVRBX0NGQUNLX0NGUE9MTCAgMTEKLSNkZWZpbmUgU1VCVFlQRV9RT1NfTlVMTCAgICAgICAgICAgIDEyCi0jZGVmaW5lIFNVQlRZUEVfUU9TX0NGQUNLICAgICAgICAgICAxMwotI2RlZmluZSBTVUJUWVBFX1FPU19DRlBPTEwgICAgICAgICAgMTQKLSNkZWZpbmUgU1VCVFlQRV9RT1NfQ0ZBQ0tfQ0ZQT0xMICAgIDE1Ci0KLS8vIEFDSyBwb2xpY3kgb2YgUU9TIENvbnRyb2wgZmllbGQgYml0IDY6NQotI2RlZmluZSBOT1JNQUxfQUNLICAgICAgICAgICAgICAgICAgMHgwMCAgLy8gYjY6NSA9IDAwCi0jZGVmaW5lIE5PX0FDSyAgICAgICAgICAgICAgICAgICAgICAweDIwICAvLyBiNjo1ID0gMDEKLSNkZWZpbmUgTk9fRVhQTElDSVRfQUNLICAgICAgICAgICAgIDB4NDAgIC8vIGI2OjUgPSAxMAotI2RlZmluZSBCTE9DS19BQ0sgICAgICAgICAgICAgICAgICAgMHg2MCAgLy8gYjY6NSA9IDExCi0KLS8vCi0vLyBydG1wX2RhdGEuYyB1c2UgdGhlc2UgZGVmaW5pdGlvbgotLy8KLSNkZWZpbmUgTEVOR1RIXzgwMl8xMSAgICAgICAgICAgICAgIDI0Ci0jZGVmaW5lIExFTkdUSF84MDJfMTFfQU5EX0ggICAgICAgICAzMAotI2RlZmluZSBMRU5HVEhfODAyXzExX0NSQ19IICAgICAgICAgMzQKLSNkZWZpbmUgTEVOR1RIXzgwMl8xMV9DUkMgICAgICAgICAgIDI4Ci0jZGVmaW5lIExFTkdUSF84MDJfMTFfV0lUSF9BRERSNCAgICAzMAotI2RlZmluZSBMRU5HVEhfODAyXzMgICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgTEVOR1RIXzgwMl8zX1RZUEUgICAgICAgICAgIDIKLSNkZWZpbmUgTEVOR1RIXzgwMl8xX0ggICAgICAgICAgICAgIDgKLSNkZWZpbmUgTEVOR1RIX0VBUE9MX0ggICAgICAgICAgICAgIDQKLSNkZWZpbmUgTEVOR1RIX1dNTVFPU19ICQkJCTIKLSNkZWZpbmUgTEVOR1RIX0NSQyAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgTUFYX1NFUV9OVU1CRVIgICAgICAgICAgICAgIDB4MGZmZgotI2RlZmluZSBMRU5HVEhfODAyXzNfTk9fVFlQRQkJMTIKLSNkZWZpbmUgTEVOR1RIXzgwMl8xUQkJCQk0IC8qIFZMQU4gcmVsYXRlZCAqLwotCi0vLyBTVEFfQ1NSNC5maWVsZC5UeFJlc3VsdAotI2RlZmluZSBUWF9SRVNVTFRfU1VDQ0VTUyAgICAgICAgICAgMAotI2RlZmluZSBUWF9SRVNVTFRfWkVST19MRU5HVEggICAgICAgMQotI2RlZmluZSBUWF9SRVNVTFRfVU5ERVJfUlVOICAgICAgICAgMgotI2RlZmluZSBUWF9SRVNVTFRfT0hZX0VSUk9SICAgICAgICAgNAotI2RlZmluZSBUWF9SRVNVTFRfUkVUUllfRkFJTCAgICAgICAgNgotCi0vLyBBbGwgUEhZIHJhdGUgc3VtbWFyeSBpbiBUWEQKLS8vIFByZWFtYmxlIE1PREUgaW4gVHhECi0jZGVmaW5lIE1PREVfQ0NLCTAKLSNkZWZpbmUgTU9ERV9PRkRNICAgMQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotI2RlZmluZSBNT0RFX0hUTUlYCTIKLSNkZWZpbmUgTU9ERV9IVEdSRUVORklFTEQJMwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotLy8gTUNTIGZvciBDQ0suICBCVy5TR0kuU1RCQyBhcmUgcmVzZXJ2ZWQKLSNkZWZpbmUgTUNTX0xPTkdQX1JBVEVfMSAgICAgICAgICAgICAgICAgICAgICAwCSAvLyBsb25nIHByZWFtYmxlIENDSyAxTWJwcwotI2RlZmluZSBNQ1NfTE9OR1BfUkFURV8yICAgICAgICAgICAgICAgICAgICAgIDEJLy8gbG9uZyBwcmVhbWJsZSBDQ0sgMU1icHMKLSNkZWZpbmUgTUNTX0xPTkdQX1JBVEVfNV81ICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIE1DU19MT05HUF9SQVRFXzExICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfMSAgICAgICAgICAgICAgICAgICAgICA0CSAvLyBsb25nIHByZWFtYmxlIENDSyAxTWJwcy4gc2hvcnQgaXMgZm9yYmlkZGVuIGluIDFNYnBzCi0jZGVmaW5lIE1DU19TSE9SVFBfUkFURV8yICAgICAgICAgICAgICAgICAgICAgIDUJLy8gc2hvcnQgcHJlYW1ibGUgQ0NLIDJNYnBzCi0jZGVmaW5lIE1DU19TSE9SVFBfUkFURV81XzUgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzExICAgICAgICAgICAgICAgICAgICAgNwotLy8gVG8gc2VuZCBkdXBsaWNhdGUgbGVnYWN5IE9GRE0uIHNldCBCVz1CV180MC4gIFNHSS5TVEJDIGFyZSByZXNlcnZlZAotI2RlZmluZSBNQ1NfUkFURV82ICAgICAgICAgICAgICAgICAgICAgIDAgICAvLyBsZWdhY3kgT0ZETQotI2RlZmluZSBNQ1NfUkFURV85ICAgICAgICAgICAgICAgICAgICAgIDEgICAvLyBPRkRNCi0jZGVmaW5lIE1DU19SQVRFXzEyICAgICAgICAgICAgICAgICAgICAgMiAgIC8vIE9GRE0KLSNkZWZpbmUgTUNTX1JBVEVfMTggICAgICAgICAgICAgICAgICAgICAzICAgLy8gT0ZETQotI2RlZmluZSBNQ1NfUkFURV8yNCAgICAgICAgICAgICAgICAgICAgIDQgIC8vIE9GRE0KLSNkZWZpbmUgTUNTX1JBVEVfMzYgICAgICAgICAgICAgICAgICAgICA1ICAgLy8gT0ZETQotI2RlZmluZSBNQ1NfUkFURV80OCAgICAgICAgICAgICAgICAgICAgIDYgIC8vIE9GRE0KLSNkZWZpbmUgTUNTX1JBVEVfNTQgICAgICAgICAgICAgICAgICAgICA3IC8vIE9GRE0KLS8vIEhUCi0jZGVmaW5lIE1DU18wCQkwCS8vIDFTCi0jZGVmaW5lIE1DU18xCQkxCi0jZGVmaW5lIE1DU18yCQkyCi0jZGVmaW5lIE1DU18zCQkzCi0jZGVmaW5lIE1DU180CQk0Ci0jZGVmaW5lIE1DU181CQk1Ci0jZGVmaW5lIE1DU182CQk2Ci0jZGVmaW5lIE1DU183CQk3Ci0jZGVmaW5lIE1DU184CQk4CS8vIDJTCi0jZGVmaW5lIE1DU185CQk5Ci0jZGVmaW5lIE1DU18xMAkJMTAKLSNkZWZpbmUgTUNTXzExCQkxMQotI2RlZmluZSBNQ1NfMTIJCTEyCi0jZGVmaW5lIE1DU18xMwkJMTMKLSNkZWZpbmUgTUNTXzE0CQkxNAotI2RlZmluZSBNQ1NfMTUJCTE1Ci0jZGVmaW5lIE1DU18xNgkJMTYJLy8gMyozCi0jZGVmaW5lIE1DU18xNwkJMTcKLSNkZWZpbmUgTUNTXzE4CQkxOAotI2RlZmluZSBNQ1NfMTkJCTE5Ci0jZGVmaW5lIE1DU18yMAkJMjAKLSNkZWZpbmUgTUNTXzIxCQkyMQotI2RlZmluZSBNQ1NfMjIJCTIyCi0jZGVmaW5lIE1DU18yMwkJMjMKLSNkZWZpbmUgTUNTXzMyCQkzMgotI2RlZmluZSBNQ1NfQVVUTwkJMzMKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotLy8gT0lEX0hUUEhZTU9ERQotLy8gTU9ERQotI2RlZmluZSBIVE1PREVfTU0JMAotI2RlZmluZSBIVE1PREVfR0YJMQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0vLyBGaXhlZCBUeCBNT0RFIC0gSFQsIENDSyBvciBPRkRNCi0jZGVmaW5lIEZJWEVEX1RYTU9ERV9IVAkJMAotI2RlZmluZSBGSVhFRF9UWE1PREVfQ0NLCTEKLSNkZWZpbmUgRklYRURfVFhNT0RFX09GRE0JMgotLy8gQlcKLSNkZWZpbmUgQldfMjAJCUJBTkRfV0lEVEhfMjAKLSNkZWZpbmUgQldfNDAJCUJBTkRfV0lEVEhfNDAKLSNkZWZpbmUgQldfQk9USAkJQkFORF9XSURUSF9CT1RICi0jZGVmaW5lIEJXXzEwCQlCQU5EX1dJRFRIXzEwCS8vIDgwMi4xMWogaGFzIDEwTUh6LiBUaGlzIGRlZmluaXRpb24gaXMgZm9yIGludGVybmFsIHVzYWdlLiBkb2Vzbid0IGZpbGwgaW4gdGhlIElFIG9yIG90aGVyIGZpZWxkLgotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0vLyBTSE9SVEdJCi0jZGVmaW5lIEdJXzQwMAkJR0FQX0lOVEVSVkFMXzQwMAkvLyBvbmx5IHN1cHBvcnQgaW4gSFQgbW9kZQotI2RlZmluZSBHSV9CT1RICQlHQVBfSU5URVJWQUxfQk9USAotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotI2RlZmluZSBHSV84MDAJCUdBUF9JTlRFUlZBTF84MDAKLS8vIFNUQkMKLSNkZWZpbmUgU1RCQ19OT05FCTAKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSNkZWZpbmUgU1RCQ19VU0UJMQkvLyBsaW1pdGVkIHVzZSBpbiBydDI4NjBiIHBoeQotI2RlZmluZSBSWFNUQkNfT05FCTEJLy8gcnggc3VwcG9ydCBvZiBvbmUgc3BhdGlhbCBzdHJlYW0KLSNkZWZpbmUgUlhTVEJDX1RXTwkyCS8vIHJ4IHN1cHBvcnQgb2YgMSBhbmQgMiBzcGF0aWFsIHN0cmVhbQotI2RlZmluZSBSWFNUQkNfVEhSCTMJLy8gcnggc3VwcG9ydCBvZiAxfjMgc3BhdGlhbCBzdHJlYW0KLS8vIE1DUyBGRUVEQkFDSwotI2RlZmluZSBNQ1NGQktfTk9ORQkwICAvLyBub3Qgc3VwcG9ydCBtY3MgZmVlZGJhY2sgLwotI2RlZmluZSBNQ1NGQktfUlNWCTEJLy8gcmVzZXJ2ZWQKLSNkZWZpbmUgTUNTRkJLX1VOU09MSUNJVAkyCS8vIG9ubHkgc3VwcG9ydCB1bnNvbGljdCBtY3MgZmVlZGJhY2sKLSNkZWZpbmUgTUNTRkJLX01SUQkzCS8vIHJlc3BvbnNlIHRvIGJvdGggTVJRIGFuZCB1bnNvbGljdCBtY3MgZmVlZGJhY2sKLQotLy8gTUlNTyBwb3dlciBzYWZlCi0jZGVmaW5lCU1NUFNfU1RBVElDCTAKLSNkZWZpbmUJTU1QU19EWU5BTUlDCQkxCi0jZGVmaW5lICAgTU1QU19SU1YJCTIKLSNkZWZpbmUgTU1QU19FTkFCTEUJCTMKLQotCi0vLyBBLU1TRFUgc2l6ZQotI2RlZmluZQlBTVNEVV8wCTAKLSNkZWZpbmUJQU1TRFVfMQkJMQotCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLS8vIE1DUyB1c2UgNyBiaXRzCi0jZGVmaW5lIFRYUkFURU1JTU8JCTB4ODAKLSNkZWZpbmUgVFhSQVRFTUNTCQkweDdGCi0jZGVmaW5lIFRYUkFURU9GRE0JCTB4N0YKLSNkZWZpbmUgUkFURV8xICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgUkFURV8yICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgUkFURV81XzUgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgUkFURV8xMSAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgUkFURV82ICAgICAgICAgICAgICAgICAgICAgIDQgICAvLyBPRkRNCi0jZGVmaW5lIFJBVEVfOSAgICAgICAgICAgICAgICAgICAgICA1ICAgLy8gT0ZETQotI2RlZmluZSBSQVRFXzEyICAgICAgICAgICAgICAgICAgICAgNiAgIC8vIE9GRE0KLSNkZWZpbmUgUkFURV8xOCAgICAgICAgICAgICAgICAgICAgIDcgICAvLyBPRkRNCi0jZGVmaW5lIFJBVEVfMjQgICAgICAgICAgICAgICAgICAgICA4ICAgLy8gT0ZETQotI2RlZmluZSBSQVRFXzM2ICAgICAgICAgICAgICAgICAgICAgOSAgIC8vIE9GRE0KLSNkZWZpbmUgUkFURV80OCAgICAgICAgICAgICAgICAgICAgIDEwICAvLyBPRkRNCi0jZGVmaW5lIFJBVEVfNTQgICAgICAgICAgICAgICAgICAgICAxMSAgLy8gT0ZETQotI2RlZmluZSBSQVRFX0ZJUlNUX09GRE1fUkFURSAgICAgICAgUkFURV82Ci0jZGVmaW5lIFJBVEVfTEFTVF9PRkRNX1JBVEUJCVJBVEVfNTQKLSNkZWZpbmUgUkFURV82XzUgICAgICAgICAgICAgICAgICAgIDEyICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8xMyAgICAgICAgICAgICAgICAgICAgIDEzICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8xOV81ICAgICAgICAgICAgICAgICAgIDE0ICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8yNiAgICAgICAgICAgICAgICAgICAgIDE1ICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8zOSAgICAgICAgICAgICAgICAgICAgIDE2ICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV81MiAgICAgICAgICAgICAgICAgICAgIDE3ICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV81OF81ICAgICAgICAgICAgICAgICAgIDE4ICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV82NSAgICAgICAgICAgICAgICAgICAgIDE5ICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV83OCAgICAgICAgICAgICAgICAgICAgIDIwICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8xMDQgICAgICAgICAgICAgICAgICAgIDIxICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8xMTcgICAgICAgICAgICAgICAgICAgIDIyICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8xMzAgICAgICAgICAgICAgICAgICAgIDIzICAvLyBIVCBtaXgKLS8vI2RlZmluZSBSQVRFX0FVVE9fU1dJVENIICAgICAgICAgICAgMjU1IC8vIGZvciBTdGFDZmcuRml4ZWRUeFJhdGUgb25seQotI2RlZmluZSBIVFJBVEVfMCAgICAgICAgICAgICAgICAgICAgICAxMgotI2RlZmluZSBSQVRFX0ZJUlNUX01NX1JBVEUgICAgICAgIEhUUkFURV8wCi0jZGVmaW5lIFJBVEVfRklSU1RfSFRfUkFURSAgICAgICAgSFRSQVRFXzAKLSNkZWZpbmUgUkFURV9MQVNUX0hUX1JBVEUgICAgICAgIEhUUkFURV8wCi0KLS8vIHBUeFdJLT50eG9wCi0jZGVmaW5lIElGU19IVFRYT1AgICAgICAgICAgICAgICAgIDAJLy8gVGhlIHR4b3Agd2lsbCBiZSBoYW5kbGVzIGJ5IEFTSUMuCi0jZGVmaW5lIElGU19QSUZTICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIElGU19TSUZTICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIElGU19CQUNLT0ZGICAgICAgICAgICAgICAgICAzCi0KLS8vIHBUeEQtPlJldHJ5TW9kZQotI2RlZmluZSBMT05HX1JFVFJZICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTSE9SVF9SRVRSWSAgICAgICAgICAgICAgICAgMAotCi0vLyBDb3VudHJ5IFJlZ2lvbiBkZWZpbml0aW9uCi0jZGVmaW5lIFJFR0lPTl9NSU5JTVVNX0JHX0JBTkQgICAgICAgICAgICAwCi0jZGVmaW5lIFJFR0lPTl8wX0JHX0JBTkQgICAgICAgICAgICAgICAgICAwICAgICAgIC8vIDEtMTEKLSNkZWZpbmUgUkVHSU9OXzFfQkdfQkFORCAgICAgICAgICAgICAgICAgIDEgICAgICAgLy8gMS0xMwotI2RlZmluZSBSRUdJT05fMl9CR19CQU5EICAgICAgICAgICAgICAgICAgMiAgICAgICAvLyAxMC0xMQotI2RlZmluZSBSRUdJT05fM19CR19CQU5EICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyAxMC0xMwotI2RlZmluZSBSRUdJT05fNF9CR19CQU5EICAgICAgICAgICAgICAgICAgNCAgICAgICAvLyAxNAotI2RlZmluZSBSRUdJT05fNV9CR19CQU5EICAgICAgICAgICAgICAgICAgNSAgICAgICAvLyAxLTE0Ci0jZGVmaW5lIFJFR0lPTl82X0JHX0JBTkQgICAgICAgICAgICAgICAgICA2ICAgICAgIC8vIDMtOQotI2RlZmluZSBSRUdJT05fN19CR19CQU5EICAgICAgICAgICAgICAgICAgNyAgICAgICAvLyA1LTEzCi0jZGVmaW5lIFJFR0lPTl8zMV9CR19CQU5EICAgICAgICAgICAgICAgICAzMSAgICAgICAvLyA1LTEzCi0jZGVmaW5lIFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQgICAgICAgICAgICA3Ci0KLSNkZWZpbmUgUkVHSU9OX01JTklNVU1fQV9CQU5EICAgICAgICAgICAgIDAKLSNkZWZpbmUgUkVHSU9OXzBfQV9CQU5EICAgICAgICAgICAgICAgICAgIDAgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQotI2RlZmluZSBSRUdJT05fMV9BX0JBTkQgICAgICAgICAgICAgICAgICAgMSAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwCi0jZGVmaW5lIFJFR0lPTl8yX0FfQkFORCAgICAgICAgICAgICAgICAgICAyICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NAotI2RlZmluZSBSRUdJT05fM19BX0JBTkQgICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyA1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxCi0jZGVmaW5lIFJFR0lPTl80X0FfQkFORCAgICAgICAgICAgICAgICAgICA0ICAgICAgIC8vIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1Ci0jZGVmaW5lIFJFR0lPTl81X0FfQkFORCAgICAgICAgICAgICAgICAgICA1ICAgICAgIC8vIDE0OSwgMTUzLCAxNTcsIDE2MQotI2RlZmluZSBSRUdJT05fNl9BX0JBTkQgICAgICAgICAgICAgICAgICAgNiAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OAotI2RlZmluZSBSRUdJT05fN19BX0JBTkQgICAgICAgICAgICAgICAgICAgNyAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NSwgMTY5LCAxNzMKLSNkZWZpbmUgUkVHSU9OXzhfQV9CQU5EICAgICAgICAgICAgICAgICAgIDggICAgICAgLy8gNTIsIDU2LCA2MCwgNjQKLSNkZWZpbmUgUkVHSU9OXzlfQV9CQU5EICAgICAgICAgICAgICAgICAgIDkgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKLSNkZWZpbmUgUkVHSU9OXzEwX0FfQkFORCAgICAgICAgICAgICAgICAgIDEwCSAgLy8gMzYsIDQwLCA0NCwgNDgsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1Ci0jZGVmaW5lIFJFR0lPTl8xMV9BX0JBTkQgICAgICAgICAgICAgICAgICAxMQkgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTQ5LCAxNTMsIDE1NywgMTYxCi0jZGVmaW5lIFJFR0lPTl8xMl9BX0JBTkQgICAgICAgICAgICAgICAgICAxMiAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwCi0jZGVmaW5lIFJFR0lPTl8xM19BX0JBTkQgICAgICAgICAgICAgICAgICAxMyAgICAgICAvLyA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MQotI2RlZmluZSBSRUdJT05fMTRfQV9CQU5EICAgICAgICAgICAgICAgICAgMTQgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1Ci0jZGVmaW5lIFJFR0lPTl8xNV9BX0JBTkQgICAgICAgICAgICAgICAgICAxNSAgICAgICAvLyAxNDksIDE1MywgMTU3LCAxNjEsIDE2NSwgMTY5LCAxNzMKLSNkZWZpbmUgUkVHSU9OX01BWElNVU1fQV9CQU5EICAgICAgICAgICAgIDE1Ci0KLS8vIHBUeEQtPkNpcGhlckFsZwotI2RlZmluZSBDSVBIRVJfTk9ORSAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBDSVBIRVJfV0VQNjQgICAgICAgICAgICAgICAgMQotI2RlZmluZSBDSVBIRVJfV0VQMTI4ICAgICAgICAgICAgICAgMgotI2RlZmluZSBDSVBIRVJfVEtJUCAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBDSVBIRVJfQUVTICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBDSVBIRVJfQ0tJUDY0ICAgICAgICAgICAgICAgNQotI2RlZmluZSBDSVBIRVJfQ0tJUDEyOCAgICAgICAgICAgICAgNgotI2RlZmluZSBDSVBIRVJfVEtJUF9OT19NSUMgICAgICAgICAgNyAgICAgICAvLyBNSUMgYXBwZW5kZWQgYnkgZHJpdmVyOiBub3QgYSB2YWxpZCB2YWx1ZSBpbiBoYXJkd2FyZSBrZXkgdGFibGUKLSNkZWZpbmUgQ0lQSEVSX1NNUzQJCQkJCTgKLQotCi0vLyBMRUQgU3RhdHVzLgotI2RlZmluZSBMRURfTElOS19ET1dOICAgICAgICAgICAgICAgMAotI2RlZmluZSBMRURfTElOS19VUCAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBMRURfUkFESU9fT0ZGICAgICAgICAgICAgICAgMgotI2RlZmluZSBMRURfUkFESU9fT04gICAgICAgICAgICAgICAgMwotI2RlZmluZSBMRURfSEFMVCAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBMRURfV1BTICAgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBMRURfT05fU0lURV9TVVJWRVkgICAgICAgICAgNgotI2RlZmluZSBMRURfUE9XRVJfVVAgICAgICAgICAgICAgICAgNwotCi0KLS8vIHZhbHVlIGRvbWFpbiBvZiBwQWQtPkxlZENudGwuTGVkTW9kZSBhbmQgRTJQUk9NCi0jZGVmaW5lIExFRF9NT0RFX0RFRkFVTFQgICAgICAgICAgICAwCi0jZGVmaW5lIExFRF9NT0RFX1RXT19MRUQJCQkxCi0vLyNkZWZpbmUgTEVEX01PREVfU0lHTkFMX1NUUkVHVEgJCTggIC8vIEVFUFJPTSBkZWZpbmUgPTgKLSNkZWZpbmUgTEVEX01PREVfU0lHTkFMX1NUUkVHVEgJCTB4NDAgLy8gRUVQUk9NIGRlZmluZSA9IDY0Ci0KLS8vIFJDNCBpbml0IHZhbHVlLCB1c2VkIGZybyBXRVAgJiBUS0lQCi0jZGVmaW5lIFBQUElOSVRGQ1MzMiAgICAgICAgICAgICAgICAweGZmZmZmZmZmICAgLyogSW5pdGlhbCBGQ1MgdmFsdWUgKi8KLQotLy8gdmFsdWUgZG9tYWluIG9mIHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkLiA4MDIuMVggY29udHJvbGxlZCBwb3J0IGRlZmluaXRpb24KLSNkZWZpbmUgV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQgICAgIDEKLSNkZWZpbmUgV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEIDIKLQotI2RlZmluZSBQQUlSV0lTRV9LRVkgICAgICAgICAgICAgICAgMQotI2RlZmluZSBHUk9VUF9LRVkgICAgICAgICAgICAgICAgICAgMgotCi0vL2RlZmluaXRpb24gb2YgRFJTCi0jZGVmaW5lIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENICTMyCi0KLQotLy8gcHJlLWFsbG9jYXRlZCBmcmVlIE5ESVMgUEFDS0VUL0JVRkZFUiBwb2xsIGZvciBpbnRlcm5hbCB1c2FnZQotI2RlZmluZSBNQVhfTlVNX09GX0ZSRUVfTkRJU19QQUNLRVQgMTI4Ci0KLS8vQmxvY2sgQUNLCi0jZGVmaW5lIE1BWF9UWF9SRU9SREVSQlVGICAgNjQKLSNkZWZpbmUgTUFYX1JYX1JFT1JERVJCVUYgICA2NAotI2RlZmluZSBERUZBVUxUX1RYX1RJTUVPVVQgICAzMAotI2RlZmluZSBERUZBVUxUX1JYX1RJTUVPVVQgICAzMAotCi0vLyBkZWZpbml0aW9uIG9mIFJlY2lwaWVudCBvciBPcmlnaW5hdG9yCi0jZGVmaW5lIElfUkVDSVBJRU5UICAgICAgICAgICAgICAgICAgVFJVRQotI2RlZmluZSBJX09SSUdJTkFUT1IgICAgICAgICAgICAgICAgICAgRkFMU0UKLQotI2RlZmluZSBERUZBVUxUX0JCUF9UWF9QT1dFUiAgICAgICAgMAotI2RlZmluZSBERUZBVUxUX1JGX1RYX1BPV0VSICAgICAgICAgNQotCi0jZGVmaW5lIE1BWF9JTklfQlVGRkVSX1NJWkUJCTQwOTYKLSNkZWZpbmUgTUFYX1BBUkFNX0JVRkZFUl9TSVpFCQkoMjA0OCkgLy8gZW5vdWdoIGZvciBBQ0wgKDE4KjY0KQotCQkJCQkJCQkJCQkvLzE4IDogdGhlIGxlbmd0aCBvZiBNYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAiMDE6MDI6MDM6MDQ6MDU6MDY7IikKLQkJCQkJCQkJCQkJLy82NCA6IE1BWF9OVU1fT0ZfQUNMX0xJU1QKLS8vIGRlZmluaXRpb24gb2YgcEFkLT5PcE1vZGUKLSNkZWZpbmUgT1BNT0RFX1NUQSAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgT1BNT0RFX0FQICAgICAgICAgICAgICAgICAgIDEKLS8vI2RlZmluZSBPUE1PREVfTDNfQlJHICAgICAgICAgICAgICAgMiAgICAgICAvLyBhcyBBUCBhbmQgU1RBIGF0IHRoZSBzYW1lIHRpbWUKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSNkZWZpbmUgRElSX1JFQUQgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgRElSX1dSSVRFICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgVFlQRV9UWEQgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgVFlQRV9SWEQgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgVFlQRV9UWElORk8JCQkJCTAKLSNkZWZpbmUgVFlQRV9SWElORk8JCQkJCTEKLSNkZWZpbmUgVFlQRV9UWFdJCQkJCQkwCi0jZGVmaW5lIFRZUEVfUlhXSQkJCQkJMQotI2VuZGlmCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT0gQVAgcnRtcF9kZWYuaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIHZhbHVlIGRvbWFpbiBmb3IgcEFkLT5FdmVudFRhYi5Mb2dbXS5FdmVudAotI2RlZmluZSBFVkVOVF9SRVNFVF9BQ0NFU1NfUE9JTlQgICAgMCAvLyBMb2cgPSAiaGg6bW06c3MgICBSZXN0YXJ0IEFjY2VzcyBQb2ludCIKLSNkZWZpbmUgRVZFTlRfQVNTT0NJQVRFRCAgICAgICAgICAgIDEgLy8gTG9nID0gImhoOm1tOnNzICAgU1RBIDAwOjAxOjAyOjAzOjA0OjA1IGFzc29jaWF0ZWQiCi0jZGVmaW5lIEVWRU5UX0RJU0FTU09DSUFURUQgICAgICAgICAyIC8vIExvZyA9ICJoaDptbTpzcyAgIFNUQSAwMDowMTowMjowMzowNDowNSBsZWZ0IHRoaXMgQlNTIgotI2RlZmluZSBFVkVOVF9BR0VEX09VVCAgICAgICAgICAgICAgMyAvLyBMb2cgPSAiaGg6bW06c3MgICBTVEEgMDA6MDE6MDI6MDM6MDQ6MDUgd2FzIGFnZWQtb3V0IGFuZCByZW1vdmVkIGZyb20gdGhpcyBCU1MiCi0jZGVmaW5lIEVWRU5UX0NPVU5URVJfTSAgICAgICAgICAgICA0Ci0jZGVmaW5lIEVWRU5UX0lOVkFMSURfUFNLICAgICAgICAgICA1Ci0jZGVmaW5lIEVWRU5UX01BWF9FVkVOVF9UWVBFICAgICAgICA2Ci0vLyA9PT09IGVuZCBvZiBBUCBydG1wX2RlZi5oID09PT09PT09PT09PQotCi0vLyBkZWZpbml0aW9uIFJTU0kgTnVtYmVyCi0jZGVmaW5lIFJTU0lfMAkJCQkJMAotI2RlZmluZSBSU1NJXzEJCQkJCTEKLSNkZWZpbmUgUlNTSV8yCQkJCQkyCi0KLS8vIGRlZmluaXRpb24gb2YgcmFkYXIgZGV0ZWN0aW9uCi0jZGVmaW5lIFJEX05PUk1BTF9NT0RFCQkJCTAJLy8gTm90IGZvdW5kIHJhZGFyIHNpZ25hbAotI2RlZmluZSBSRF9TV0lUQ0hJTkdfTU9ERQkJCTEJLy8gRm91bmQgcmFkYXIgc2lnbmFsLCBhbmQgZG9pbmcgY2hhbm5lbCBzd2l0Y2gKLSNkZWZpbmUgUkRfU0lMRU5DRV9NT0RFCQkJCTIJLy8gQWZ0ZXIgY2hhbm5lbCBzd2l0Y2gsIG5lZWQgdG8gYmUgc2lsZW5jZSBhIHdoaWxlIHRvIGVuc3VyZSByYWRhciBub3QgZm91bmQKLQotLy9Ecml2ZXIgZGVmaW5lZCBjaWQgZm9yIG1hcHBpbmcgc3RhdHVzIGFuZCBjb21tYW5kLgotI2RlZmluZSAgU0xFRVBDSUQJMHgxMQotI2RlZmluZSAgV0FLRUNJRAkweDIyCi0jZGVmaW5lICBRVUVSWVBPV0VSQ0lECTB4MzMKLSNkZWZpbmUgIE9XTkVSTUNVCTB4MQotI2RlZmluZSAgT1dORVJDUFUJMHgwCi0KLS8vIE1CU1NJRCBkZWZpbml0aW9uCi0jZGVmaW5lIEVOVFJZX05PVF9GT1VORCAgICAgICAgICAgICAweEZGCi0KLQotLyogQWZ0ZXIgTGludXggMi42LjksCi0gKiBWTEFOIG1vZHVsZSB1c2UgUHJpdmF0ZSAoZnJvbSB1c2VyKSBpbnRlcmZhY2UgZmxhZ3MgKG5ldGRldmljZS0+cHJpdl9mbGFncykuCi0gKiAjZGVmaW5lIElGRl84MDJfMVFfVkxBTiAweDEgICAgICAgICAtLSAgICA4MDIuMVEgVkxBTiBkZXZpY2UuICBpbiBpZi5oCi0gKiByZWYgdG8gaXBfc2Fib3RhZ2Vfb3V0KCkgWyBvdXQtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4gXSBpbiBicl9uZXRmaWx0ZXIuYwotICoKLSAqIEZvciB0aGlzIHJlYXNvbiwgd2UgTVVTVCB1c2UgRVZFTiB2YWx1ZSBpbiBwcml2X2ZsYWdzCi0gKi8KLSNkZWZpbmUgSU5UX01BSU4JCQkweDAxMDAKLSNkZWZpbmUgSU5UX01CU1NJRAkJCTB4MDIwMAotI2RlZmluZSBJTlRfV0RTCQkJCTB4MDMwMAotI2RlZmluZSBJTlRfQVBDTEkJCQkweDA0MDAKLSNkZWZpbmUgSU5UX01FU0gJCQkweDA1MDAKLQotI2RlZmluZSBJTkZfTUFJTl9ERVZfTkFNRQkJIndsYW4iCi0jZGVmaW5lIElORl9NQlNTSURfREVWX05BTUUJCSJ3bGFuIgotI2RlZmluZSBJTkZfV0RTX0RFVl9OQU1FCQkid2RzIgotI2RlZmluZSBJTkZfQVBDTElfREVWX05BTUUJCSJhcGNsaSIKLSNkZWZpbmUgSU5GX01FU0hfREVWX05BTUUJCSJtZXNoIgotCi0vLyBVc2UgYml0bWFwIHRvIGFsbG93IGNvZXhpc3Qgb2YgQVRFX1RYRlJBTUUgYW5kIEFURV9SWEZSQU1FKGkuZS4sdG8gc3VwcG9ydCBMb29wQmFjayBtb2RlKS4KLSNpZmRlZiBSQUxJTktfQVRFCi0jZGVmaW5lCUFURV9TVEFSVCAgICAgICAgICAgICAgICAgICAweDAwICAgLy8gU3RhcnQgQVRFCi0jZGVmaW5lCUFURV9TVE9QICAgICAgICAgICAgICAgICAgICAweDgwICAgLy8gU3RvcCBBVEUKLSNkZWZpbmUJQVRFX1RYQ09OVCAgICAgICAgICAgICAgICAgIDB4MDUgICAvLyBDb250aW51b3VzIFRyYW5zbWl0Ci0jZGVmaW5lCUFURV9UWENBUlIgICAgICAgICAgICAgICAgICAweDA5ICAgLy8gVHJhbnNtaXQgQ2FycmllcgotI2RlZmluZQlBVEVfVFhDQVJSU1VQUCAgICAgICAgICAgICAgMHgxMSAgIC8vIFRyYW5zbWl0IENhcnJpZXIgU3VwcHJlc3Npb24KLSNkZWZpbmUJQVRFX1RYRlJBTUUgICAgICAgICAgICAgICAgIDB4MDEgICAvLyBUcmFuc21pdCBGcmFtZXMKLSNkZWZpbmUJQVRFX1JYRlJBTUUgICAgICAgICAgICAgICAgIDB4MDIgICAvLyBSZWNlaXZlIEZyYW1lcwotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0jZGVmaW5lIEFURV9UWFNUT1AgICAgICAgICAgICAgICAgICAweGUyICAgLy8gU3RvcCBUcmFuc21pdGlvbihpLmUuLCBUWENPTlQsIFRYQ0FSUiwgVFhDQVJSU1VQUCwgYW5kIFRYRlJBTUUpCi0jZGVmaW5lIEFURV9SWFNUT1AJCQkJCTB4ZmQgICAvLyBTdG9wIHJlY2VpdmluZyBGcmFtZXMKLSNkZWZpbmUJQkJQMjJfVFhGUkFNRQkJCQkweDAwICAgLy8gVHJhbnNtaXQgRnJhbWVzCi0jZGVmaW5lCUJCUDIyX1RYQ09OVF9PUl9DQVJSU1VQUCAgICAweDgwICAgLy8gQ29udGludW91cyBUcmFuc21pdCBvciBDYXJyaWVyIFN1cHByZXNzaW9uCi0jZGVmaW5lCUJCUDIyX1RYQ0FSUiAgICAgICAgICAgICAgICAweGMxICAgLy8gVHJhbnNtaXQgQ2FycmllcgotI2RlZmluZQlCQlAyNF9UWENPTlQgICAgICAgICAgICAgICAgMHgwMCAgIC8vIENvbnRpbnVvdXMgVHJhbnNtaXQKLSNkZWZpbmUJQkJQMjRfQ0FSUlNVUFAgICAgICAgICAgICAgIDB4MDEgICAvLyBDYXJyaWVyIFN1cHByZXNzaW9uCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLS8vIFdFUCBLZXkgVFlQRQotI2RlZmluZSBXRVBfSEVYQURFQ0lNQUxfVFlQRSAgICAwCi0jZGVmaW5lIFdFUF9BU0NJSV9UWVBFICAgICAgICAgIDEKLQotCi0KLS8vIFdJUkVMRVNTIEVWRU5UUyBkZWZpbml0aW9uCi0vKiBNYXggbnVtYmVyIG9mIGNoYXIgaW4gY3VzdG9tIGV2ZW50LCByZWZlciB0byB3aXJlbGVzc190b29scy4yOC93aXJlbGVzcy4yMC5oICovCi0jZGVmaW5lIElXX0NVU1RPTV9NQVhfTEVOCQkJCQkJCTI1NQkvKiBJbiBieXRlcyAqLwotCi0vLyBGb3Igc3lzdGVtIGV2ZW50IC0gc3RhcnQKLSNkZWZpbmUJSVdfU1lTX0VWRU5UX0ZMQUdfU1RBUlQgICAgICAgICAgICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUJSVdfQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUJSVdfRElTQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAweDAyMDEKLSNkZWZpbmUJSVdfREVBVVRIX0VWRU5UX0ZMQUcJCQkJMHgwMjAyCi0jZGVmaW5lCUlXX0FHRU9VVF9FVkVOVF9GTEFHCQkJCTB4MDIwMwotI2RlZmluZQlJV19DT1VOVEVSX01FQVNVUkVTX0VWRU5UX0ZMQUcgICAgICAgICAgICAgIDB4MDIwNAotI2RlZmluZQlJV19SRVBMQVlfQ09VTlRFUl9ESUZGX0VWRU5UX0ZMQUcgICAgICAgICAgIDB4MDIwNQotI2RlZmluZQlJV19SU05JRV9ESUZGX0VWRU5UX0ZMQUcJCQkJMHgwMjA2Ci0jZGVmaW5lCUlXX01JQ19ESUZGX0VWRU5UX0ZMQUcJCQkJCTB4MDIwNwotI2RlZmluZSBJV19JQ1ZfRVJST1JfRVZFTlRfRkxBRwkJCQkJCTB4MDIwOAotI2RlZmluZSBJV19NSUNfRVJST1JfRVZFTlRfRkxBRwkJCQkJCTB4MDIwOQotI2RlZmluZSBJV19HUk9VUF9IU19USU1FT1VUX0VWRU5UX0ZMQUcJCQkJMHgwMjBBCi0jZGVmaW5lCUlXX1BBSVJXSVNFX0hTX1RJTUVPVVRfRVZFTlRfRkxBRwkJCTB4MDIwQgotI2RlZmluZSBJV19SU05JRV9TQU5JVFlfRkFJTF9FVkVOVF9GTEFHCQkJCTB4MDIwQwotI2RlZmluZSBJV19TRVRfS0VZX0RPTkVfV1BBMV9FVkVOVF9GTEFHCQkJCTB4MDIwRAotI2RlZmluZSBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHCQkJCTB4MDIwRQotI2RlZmluZSBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcJCQkJCTB4MDIwRgotI2RlZmluZSBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRwkJCQkJMHgwMjEwCi0jZGVmaW5lIElXX1NDQU5fQ09NUExFVEVEX0VWRU5UX0ZMQUcJCQkJMHgwMjExCi0jZGVmaW5lIElXX1NDQU5fRU5RVUVVRV9GQUlMX0VWRU5UX0ZMQUcJCQkJMHgwMjEyCi0vLyBpZiBhZGQgbmV3IHN5c3RlbSBldmVudCBmbGFnLCBwbGVhc2UgdXBhZHRlIHRoZSBJV19TWVNfRVZFTlRfRkxBR19FTkQKLSNkZWZpbmUJSVdfU1lTX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgICAgICAweDAyMTIKLSNkZWZpbmUJSVdfU1lTX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX1NZU19FVkVOVF9GTEFHX0VORCAtIElXX1NZU19FVkVOVF9GTEFHX1NUQVJUICsgMSkKLS8vIEZvciBzeXN0ZW0gZXZlbnQgLSBlbmQKLQotLy8gRm9yIHNwb29mIGF0dGFjayBldmVudCAtIHN0YXJ0Ci0jZGVmaW5lCUlXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQgICAgICAgICAgICAgICAgICAgMHgwMzAwCi0jZGVmaW5lIElXX0NPTkZMSUNUX1NTSURfRVZFTlRfRkxBRwkJCQkJMHgwMzAwCi0jZGVmaW5lIElXX1NQT09GX0FTU09DX1JFU1BfRVZFTlRfRkxBRwkJCQkweDAzMDEKLSNkZWZpbmUgSVdfU1BPT0ZfUkVBU1NPQ19SRVNQX0VWRU5UX0ZMQUcJCQkweDAzMDIKLSNkZWZpbmUgSVdfU1BPT0ZfUFJPQkVfUkVTUF9FVkVOVF9GTEFHCQkJCTB4MDMwMwotI2RlZmluZSBJV19TUE9PRl9CRUFDT05fRVZFTlRfRkxBRwkJCQkJMHgwMzA0Ci0jZGVmaW5lIElXX1NQT09GX0RJU0FTU09DX0VWRU5UX0ZMQUcJCQkJMHgwMzA1Ci0jZGVmaW5lIElXX1NQT09GX0FVVEhfRVZFTlRfRkxBRwkJCQkJMHgwMzA2Ci0jZGVmaW5lIElXX1NQT09GX0RFQVVUSF9FVkVOVF9GTEFHCQkJCQkweDAzMDcKLSNkZWZpbmUgSVdfU1BPT0ZfVU5LTk9XTl9NR01UX0VWRU5UX0ZMQUcJCQkweDAzMDgKLSNkZWZpbmUgSVdfUkVQTEFZX0FUVEFDS19FVkVOVF9GTEFHCQkJCQkweDAzMDkKLS8vIGlmIGFkZCBuZXcgc3Bvb2YgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX1NQT09GX0VWRU5UX0ZMQUdfRU5ECi0jZGVmaW5lCUlXX1NQT09GX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgICAgMHgwMzA5Ci0jZGVmaW5lCUlXX1NQT09GX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX1NQT09GX0VWRU5UX0ZMQUdfRU5EIC0gSVdfU1BPT0ZfRVZFTlRfRkxBR19TVEFSVCArIDEpCi0vLyBGb3Igc3Bvb2YgYXR0YWNrIGV2ZW50IC0gZW5kCi0KLS8vIEZvciBmbG9vZGluZyBhdHRhY2sgZXZlbnQgLSBzdGFydAotI2RlZmluZQlJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUICAgICAgICAgICAgICAgICAgIDB4MDQwMAotI2RlZmluZSBJV19GTE9PRF9BVVRIX0VWRU5UX0ZMQUcJCQkJCTB4MDQwMAotI2RlZmluZSBJV19GTE9PRF9BU1NPQ19SRVFfRVZFTlRfRkxBRwkJCQkweDA0MDEKLSNkZWZpbmUgSVdfRkxPT0RfUkVBU1NPQ19SRVFfRVZFTlRfRkxBRwkJCQkweDA0MDIKLSNkZWZpbmUgSVdfRkxPT0RfUFJPQkVfUkVRX0VWRU5UX0ZMQUcJCQkJMHgwNDAzCi0jZGVmaW5lIElXX0ZMT09EX0RJU0FTU09DX0VWRU5UX0ZMQUcJCQkJMHgwNDA0Ci0jZGVmaW5lIElXX0ZMT09EX0RFQVVUSF9FVkVOVF9GTEFHCQkJCQkweDA0MDUKLSNkZWZpbmUgSVdfRkxPT0RfRUFQX1JFUV9FVkVOVF9GTEFHCQkJCQkweDA0MDYKLS8vIGlmIGFkZCBuZXcgZmxvb2RpbmcgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX0ZMT09EX0VWRU5UX0ZMQUdfRU5ECi0jZGVmaW5lCUlXX0ZMT09EX0VWRU5UX0ZMQUdfRU5ECQkJCTB4MDQwNgotI2RlZmluZQlJV19GTE9PRF9FVkVOVF9UWVBFX05VTQkJCQkJCShJV19GTE9PRF9FVkVOVF9GTEFHX0VORCAtIElXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQgKyAxKQotLy8gRm9yIGZsb29kaW5nIGF0dGFjayAtIGVuZAotCi0vLyBFbmQgLSBXSVJFTEVTUyBFVkVOVFMgZGVmaW5pdGlvbgotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0vLyBkZWZpbml0aW9uIGZvciBETFMsIGthdGh5Ci0jZGVmaW5lCU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlkgICAxCi0jZGVmaW5lCU1BWF9OVU1fT0ZfRExTX0VOVFJZICAgICAgICBNQVhfTlVNQkVSX09GX0RMU19FTlRSWQotCi0vL0Jsb2NrIEFDSywga2F0aHkKLSNkZWZpbmUgTUFYX1RYX1JFT1JERVJCVUYJCTY0Ci0jZGVmaW5lIE1BWF9SWF9SRU9SREVSQlVGCQk2NAotI2RlZmluZSBERUZBVUxUX1RYX1RJTUVPVVQJCTMwCi0jZGVmaW5lIERFRkFVTFRfUlhfVElNRU9VVAkJMzAKLSNkZWZpbmUgTUFYX0JBUkVDSV9TRVNTSU9OCQk4Ci0KLSNpZm5kZWYgSVdfRVNTSURfTUFYX1NJWkUKLS8qIE1heGltdW0gc2l6ZSBvZiB0aGUgRVNTSUQgYW5kIHBBZC0+bmlja25hbWUgc3RyaW5ncyAqLwotI2RlZmluZSBJV19FU1NJRF9NQVhfU0laRQkJMzIKLSNlbmRpZgotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQwotI2RlZmluZSBNQ0FTVF9ESVNBQkxFCTAKLSNkZWZpbmUgTUNBU1RfQ0NLCQkxCi0jZGVmaW5lIE1DQVNUX09GRE0JCTIKLSNkZWZpbmUgTUNBU1RfSFRNSVgJCTMKLSNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCi0KLS8vIEZvciBBc2ljUmFkaW9PZmYvQXNpY1JhZGlvT24gZnVuY3Rpb24KLSNkZWZpbmUgRE9UMTFQT1dFUlNBVkUJCTAKLSNkZWZpbmUgR1VJUkFESU9fT0ZGCQkxCi0jZGVmaW5lIFJUTVBfSEFMVAkJICAgIDIKLSNkZWZpbmUgR1VJX0lETEVfUE9XRVJfU0FWRQkJMwotLy8gLS0KLQotCi0vLyBkZWZpbml0aW9uIGZvciBXcGFTdXBwb3J0IGZsYWcKLSNkZWZpbmUgV1BBX1NVUFBMSUNBTlRfRElTQUJMRQkJCQkwCi0jZGVmaW5lIFdQQV9TVVBQTElDQU5UX0VOQUJMRQkJCQkxCi0jZGVmaW5lCVdQQV9TVVBQTElDQU5UX0VOQUJMRV9XSVRIX1dFQl9VSQkyCi0KLS8vIGRlZmluaXRpb24gZm9yIEFudGVubmEgRGl2ZXJzaXR5IGZsYWcKLSNpZmRlZiBBTlRfRElWRVJTSVRZX1NVUFBPUlQKLWVudW0gQU5UX0RJVkVSU0lUWV9UWVBFIHsKLSAgICBBTlRfRElWRVJTSVRZX0RJU0FCTEUgPSAwLAotICAgIEFOVF9ESVZFUlNJVFlfRU5BQkxFID0gMSwKLSAgICBBTlRfRklYX0FOVDEgPSAyLAotICAgIEFOVF9GSVhfQU5UMiA9IDMKLX07Ci0jZW5kaWYgLy8gQU5UX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0KLS8vIEVuZGlhbiBieXRlIHN3YXBwaW5nIGNvZGVzCi0jZGVmaW5lIFNXQVAxNih4KSBcCi0gICAgKChVSU5UMTYpKCBcCi0gICAgKCgoVUlOVDE2KSh4KSAmIChVSU5UMTYpIDB4MDBmZlUpIDw8IDgpIHwgXAotICAgICgoKFVJTlQxNikoeCkgJiAoVUlOVDE2KSAweGZmMDBVKSA+PiA4KSApKQotCi0jZGVmaW5lIFNXQVAzMih4KSBcCi0gICAgKChVSU5UMzIpKCBcCi0gICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4MDAwMDAwZmZVTCkgPDwgMjQpIHwgXAotICAgICgoKFVJTlQzMikoeCkgJiAoVUlOVDMyKSAweDAwMDBmZjAwVUwpIDw8ICA4KSB8IFwKLSAgICAoKChVSU5UMzIpKHgpICYgKFVJTlQzMikgMHgwMGZmMDAwMFVMKSA+PiAgOCkgfCBcCi0gICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4ZmYwMDAwMDBVTCkgPj4gMjQpICkpCi0KLSNkZWZpbmUgU1dBUDY0KHgpIFwKLSAgICAoKFVJTlQ2NCkoIFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDAwMDAwZmZVTEwpIDw8IDU2KSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDAwMGZmMDBVTEwpIDw8IDQwKSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDBmZjAwMDBVTEwpIDw8IDI0KSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwZmYwMDAwMDBVTEwpIDw8ICA4KSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMGZmMDAwMDAwMDBVTEwpID4+ICA4KSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDBmZjAwMDAwMDAwMDBVTEwpID4+IDI0KSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwZmYwMDAwMDAwMDAwMDBVTEwpID4+IDQwKSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweGZmMDAwMDAwMDAwMDAwMDBVTEwpID4+IDU2KSApKQotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCi0jZGVmaW5lIGNwdTJsZTY0KHgpIFNXQVA2NCgoeCkpCi0jZGVmaW5lIGxlMmNwdTY0KHgpIFNXQVA2NCgoeCkpCi0jZGVmaW5lIGNwdTJsZTMyKHgpIFNXQVAzMigoeCkpCi0jZGVmaW5lIGxlMmNwdTMyKHgpIFNXQVAzMigoeCkpCi0jZGVmaW5lIGNwdTJsZTE2KHgpIFNXQVAxNigoeCkpCi0jZGVmaW5lIGxlMmNwdTE2KHgpIFNXQVAxNigoeCkpCi0jZGVmaW5lIGNwdTJiZTY0KHgpICgoVUlOVDY0KSh4KSkKLSNkZWZpbmUgYmUyY3B1NjQoeCkgKChVSU5UNjQpKHgpKQotI2RlZmluZSBjcHUyYmUzMih4KSAoKFVJTlQzMikoeCkpCi0jZGVmaW5lIGJlMmNwdTMyKHgpICgoVUlOVDMyKSh4KSkKLSNkZWZpbmUgY3B1MmJlMTYoeCkgKChVSU5UMTYpKHgpKQotI2RlZmluZSBiZTJjcHUxNih4KSAoKFVJTlQxNikoeCkpCi0KLSNlbHNlICAgLy8gTGl0dGxlX0VuZGlhbgotCi0jZGVmaW5lIGNwdTJsZTY0KHgpICgoVUlOVDY0KSh4KSkKLSNkZWZpbmUgbGUyY3B1NjQoeCkgKChVSU5UNjQpKHgpKQotI2RlZmluZSBjcHUybGUzMih4KSAoKFVJTlQzMikoeCkpCi0jZGVmaW5lIGxlMmNwdTMyKHgpICgoVUlOVDMyKSh4KSkKLSNkZWZpbmUgY3B1MmxlMTYoeCkgKChVSU5UMTYpKHgpKQotI2RlZmluZSBsZTJjcHUxNih4KSAoKFVJTlQxNikoeCkpCi0jZGVmaW5lIGNwdTJiZTY0KHgpIFNXQVA2NCgoeCkpCi0jZGVmaW5lIGJlMmNwdTY0KHgpIFNXQVA2NCgoeCkpCi0jZGVmaW5lIGNwdTJiZTMyKHgpIFNXQVAzMigoeCkpCi0jZGVmaW5lIGJlMmNwdTMyKHgpIFNXQVAzMigoeCkpCi0jZGVmaW5lIGNwdTJiZTE2KHgpIFNXQVAxNigoeCkpCi0jZGVmaW5lIGJlMmNwdTE2KHgpIFNXQVAxNigoeCkpCi0KLSNlbmRpZiAgLy8gUlRfQklHX0VORElBTgotCi0jZGVmaW5lIEFCUyhfeCwgX3kpICgoX3gpID4gKF95KSkgPyAoKF94KSAtKF95KSkgOiAoKF95KSAtKF94KSkKLQotCi0jZGVmaW5lIEEyRGVjKF9YLCBfcCkJCQkJXAotewkJCQkJCQkJCVwKLQlVQ0hBUiAqcDsJCQkJCQlcCi0JX1ggPSAwOwkJCQkJCQlcCi0JcCA9IF9wOwkJCQkJCQlcCi0Jd2hpbGUgKCgoKnAgPj0gJzAnKSAmJiAoKnAgPD0gJzknKSkpCQlcCi0JewkJCQkJCQkJCQkJCVwKLQkJaWYgKCgqcCA+PSAnMCcpICYmICgqcCA8PSAnOScpKQkJXAotCQkJX1ggPSBfWCAqIDEwICsgKnAgLSA0ODsJCQkJCVwKLQkJcCsrOwkJCQkJCQkJCQlcCi0JfQkJCQkJCQkJCQkJCVwKLX0KLQotCi0jZGVmaW5lIEEySGV4KF9YLCBfcCkJCQkJXAotZG97CQkJCQkJCQkJXAotCWNoYXIgKl9fcDsJCQkJCQlcCi0JKF9YKSA9IDA7CQkJCQkJCVwKLQlfX3AgPSAoY2hhciAqKShfcCk7CQkJCQkJCVwKLQl3aGlsZSAoKCgqX19wID49ICdhJykgJiYgKCpfX3AgPD0gJ2YnKSkgfHwgKCgqX19wID49ICdBJykgJiYgKCpfX3AgPD0gJ0YnKSkgfHwgKCgqX19wID49ICcwJykgJiYgKCpfX3AgPD0gJzknKSkpCQlcCi0JewkJCQkJCQkJCQkJCVwKLQkJaWYgKCgqX19wID49ICdhJykgJiYgKCpfX3AgPD0gJ2YnKSkJCQkJXAotCQkJKF9YKSA9IChfWCkgKiAxNiArICpfX3AgLSA4NzsJCQkJCVwKLQkJZWxzZSBpZiAoKCpfX3AgPj0gJ0EnKSAmJiAoKl9fcCA8PSAnRicpKQkJXAotCQkJKF9YKSA9IChfWCkgKiAxNiArICpfX3AgLSA1NTsJCQkJCVwKLQkJZWxzZSBpZiAoKCpfX3AgPj0gJzAnKSAmJiAoKl9fcCA8PSAnOScpKQkJXAotCQkJKF9YKSA9IChfWCkgKiAxNiArICpfX3AgLSA0ODsJCQkJCVwKLQkJX19wKys7CQkJCQkJCQkJCVwKLQl9CQkJCQkJCQkJCQkJXAotfXdoaWxlKDApCi0KLSNlbmRpZiAgLy8gX19SVE1QX0RFRl9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF9kb3QxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX2RvdDExLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2Mzc4MjUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX2RvdDExLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIF9fRE9UMTFfQkFTRV9IX18KLSNkZWZpbmUgX19ET1QxMV9CQVNFX0hfXwotCi0jaW5jbHVkZSAicnRtcF90eXBlLmgiCi0KLQotLy8gNC1ieXRlIEhUQyBmaWVsZC4gIG1heWJlIGluY2x1ZGVkIGluIGFueSBmcmFtZSBleGNlcHQgbm9uLVFPUyBkYXRhIGZyYW1lLiAgVGhlIE9yZGVyIGJpdCBtdXN0IHNldCAxLgotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgVUlOVDMyCQlSREc6MTsJLy9SREcgLyBNb3JlIFBQRFUKLSAgICBVSU5UMzIJCUFDQ29uc3RyYWludDoxOwkvL2ZlZWRiYWNrIHJlcXVlc3QKLSAgICBVSU5UMzIJCXJzdjo1OyAgLy9jYWxpYnJhdGlvbiBzZXF1ZW5jZQotICAgIFVJTlQzMgkJWkxGQW5ub3VjZToxOwkvLyBaTEYgYW5ub3VuY2VtZW50Ci0gICAgVUlOVDMyCQlDU0lTVEVFUklORzoyOwkvL0NTSS8gU1RFRVJJTkcKLSAgICBVSU5UMzIJCUZCS1JlcToyOwkvL2ZlZWRiYWNrIHJlcXVlc3QKLSAgICBVSU5UMzIJCUNhbFNlcToyOyAgLy9jYWxpYnJhdGlvbiBzZXF1ZW5jZQotICAgIFVJTlQzMgkJQ2FsUG9zOjI7CS8vIGNhbGlicmF0aW9uIHBvc2l0aW9uCi0gICAgVUlOVDMyCQlNRkJvckFTQzo3OwkvL0xpbmsgYWRhcHRhdGlvbiBmZWVkYmFjayBjb250YWluaW5nIHJlY29tbWVuZGVkIE1DUy4gMHg3ZiBmb3Igbm8gZmVlZGJhY2sgb3Igbm90IGF2YWlsYWJsZQotICAgIFVJTlQzMgkJTUZTOjM7CS8vU0VUIHRvIHRoZSByZWNlaXZlZCB2YWx1ZSBvZiBNUlMuIDB4MTExIGZvciB1bnNvbGljaXRlZCBNRkIuCi0gICAgVUlOVDMyCQlNUlNvckFTSTozOwkvLyBNUlEgU2VxdWVuY2UgaWRlbnRpZmllci4gdW5jaGFuZ2VkIGR1cmluZyBlbnRpcmUgcHJvY2VkdXJlLiAweDAwMC0weDExMC4KLSAgICBVSU5UMzIJCU1SUToxOwkvL01DUyBmZWVkYmFjay4gUmVxdWVzdCBmb3IgYSBNQ1MgZmVlZGJhY2sKLSAgICBVSU5UMzIJCVRSUToxOwkvL3NvdW5kaW5nIHJlcXVlc3QKLSAgICBVSU5UMzIJCU1BOjE7CS8vbWFuYWdlbWVudCBhY3Rpb24gcGF5bG9hZCBleGlzdCBpbiAoUW9TIE51bGwrSFRDKQotI2Vsc2UKLSAgICBVSU5UMzIJCU1BOjE7CS8vbWFuYWdlbWVudCBhY3Rpb24gcGF5bG9hZCBleGlzdCBpbiAoUW9TIE51bGwrSFRDKQotICAgIFVJTlQzMgkJVFJROjE7CS8vc291bmRpbmcgcmVxdWVzdAotICAgIFVJTlQzMgkJTVJROjE7CS8vTUNTIGZlZWRiYWNrLiBSZXF1ZXN0IGZvciBhIE1DUyBmZWVkYmFjawotICAgIFVJTlQzMgkJTVJTb3JBU0k6MzsJLy8gTVJRIFNlcXVlbmNlIGlkZW50aWZpZXIuIHVuY2hhbmdlZCBkdXJpbmcgZW50aXJlIHByb2NlZHVyZS4gMHgwMDAtMHgxMTAuCi0gICAgVUlOVDMyCQlNRlM6MzsJLy9TRVQgdG8gdGhlIHJlY2VpdmVkIHZhbHVlIG9mIE1SUy4gMHgxMTEgZm9yIHVuc29saWNpdGVkIE1GQi4KLSAgICBVSU5UMzIJCU1GQm9yQVNDOjc7CS8vTGluayBhZGFwdGF0aW9uIGZlZWRiYWNrIGNvbnRhaW5pbmcgcmVjb21tZW5kZWQgTUNTLiAweDdmIGZvciBubyBmZWVkYmFjayBvciBub3QgYXZhaWxhYmxlCi0gICAgVUlOVDMyCQlDYWxQb3M6MjsJLy8gY2FsaWJyYXRpb24gcG9zaXRpb24KLSAgICBVSU5UMzIJCUNhbFNlcToyOyAgLy9jYWxpYnJhdGlvbiBzZXF1ZW5jZQotICAgIFVJTlQzMgkJRkJLUmVxOjI7CS8vZmVlZGJhY2sgcmVxdWVzdAotICAgIFVJTlQzMgkJQ1NJU1RFRVJJTkc6MjsJLy9DU0kvIFNURUVSSU5HCi0gICAgVUlOVDMyCQlaTEZBbm5vdWNlOjE7CS8vIFpMRiBhbm5vdW5jZW1lbnQKLSAgICBVSU5UMzIJCXJzdjo1OyAgLy9jYWxpYnJhdGlvbiBzZXF1ZW5jZQotICAgIFVJTlQzMgkJQUNDb25zdHJhaW50OjE7CS8vZmVlZGJhY2sgcmVxdWVzdAotICAgIFVJTlQzMgkJUkRHOjE7CS8vUkRHIC8gTW9yZSBQUERVCi0jZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KLX0gSFRfQ09OVFJPTCwgKlBIVF9DT05UUk9MOwotCi0vLyAyLWJ5dGUgUU9TIENPTlRST0wgZmllbGQKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotICAgIFVTSE9SVCAgICAgIFR4b3BfUXVldWVTaXplOjg7Ci0gICAgVVNIT1JUICAgICAgQU1zZHVQcmVzZW50OjE7Ci0gICAgVVNIT1JUICAgICAgQWNrUG9saWN5OjI7ICAvLzA6IG5vcm1hbCBBQ0sgMTpObyBBQ0sgMjpzY2hlZHVsZWQgdW5kZXIgTVRCQS9QU01QICAzOiBCQQotICAgIFVTSE9SVCAgICAgIEVPU1A6MTsKLSAgICBVU0hPUlQgICAgICBUSUQ6NDsKLSNlbHNlCi0gICAgVVNIT1JUICAgICAgVElEOjQ7Ci0gICAgVVNIT1JUICAgICAgRU9TUDoxOwotICAgIFVTSE9SVCAgICAgIEFja1BvbGljeToyOyAgLy8wOiBub3JtYWwgQUNLIDE6Tm8gQUNLIDI6c2NoZWR1bGVkIHVuZGVyIE1UQkEvUFNNUCAgMzogQkEKLSAgICBVU0hPUlQgICAgICBBTXNkdVByZXNlbnQ6MTsKLSAgICBVU0hPUlQgICAgICBUeG9wX1F1ZXVlU2l6ZTo4OwotI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCi19IFFPU19DT05UUk9MLCAqUFFPU19DT05UUk9MOwotCi0KLS8vIDItYnl0ZSBGcmFtZSBjb250cm9sIGZpZWxkCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVU0hPUlQJCU9yZGVyOjE7CQkJLy8gU3RyaWN0IG9yZGVyIGV4cGVjdGVkCi0JVVNIT1JUCQlXZXA6MTsJCQkJLy8gV2VwIGRhdGEKLQlVU0hPUlQJCU1vcmVEYXRhOjE7CQkJLy8gTW9yZSBkYXRhIGJpdAotCVVTSE9SVAkJUHdyTWdtdDoxOwkJCS8vIFBvd2VyIG1hbmFnZW1lbnQgYml0Ci0JVVNIT1JUCQlSZXRyeToxOwkJCS8vIFJldHJ5IHN0YXR1cyBiaXQKLQlVU0hPUlQJCU1vcmVGcmFnOjE7CQkJLy8gTW9yZSBmcmFnbWVudCBiaXQKLQlVU0hPUlQJCUZyRHM6MTsJCQkJLy8gRnJvbSBEUyBpbmRpY2F0aW9uCi0JVVNIT1JUCQlUb0RzOjE7CQkJCS8vIFRvIERTIGluZGljYXRpb24KLQlVU0hPUlQJCVN1YlR5cGU6NDsJCQkvLyBNU0RVIHN1YnR5cGUKLQlVU0hPUlQJCVR5cGU6MjsJCQkJLy8gTVNEVSB0eXBlCi0JVVNIT1JUCQlWZXI6MjsJCQkJLy8gUHJvdG9jb2wgdmVyc2lvbgotI2Vsc2UKLQlVU0hPUlQJCVZlcjoyOwkJCQkvLyBQcm90b2NvbCB2ZXJzaW9uCi0JVVNIT1JUCQlUeXBlOjI7CQkJCS8vIE1TRFUgdHlwZQotCVVTSE9SVAkJU3ViVHlwZTo0OwkJCS8vIE1TRFUgc3VidHlwZQotCVVTSE9SVAkJVG9EczoxOwkJCQkvLyBUbyBEUyBpbmRpY2F0aW9uCi0JVVNIT1JUCQlGckRzOjE7CQkJCS8vIEZyb20gRFMgaW5kaWNhdGlvbgotCVVTSE9SVAkJTW9yZUZyYWc6MTsJCQkvLyBNb3JlIGZyYWdtZW50IGJpdAotCVVTSE9SVAkJUmV0cnk6MTsJCQkvLyBSZXRyeSBzdGF0dXMgYml0Ci0JVVNIT1JUCQlQd3JNZ210OjE7CQkJLy8gUG93ZXIgbWFuYWdlbWVudCBiaXQKLQlVU0hPUlQJCU1vcmVEYXRhOjE7CQkJLy8gTW9yZSBkYXRhIGJpdAotCVVTSE9SVAkJV2VwOjE7CQkJCS8vIFdlcCBkYXRhCi0JVVNIT1JUCQlPcmRlcjoxOwkJCS8vIFN0cmljdCBvcmRlciBleHBlY3RlZAotI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCi19IEZSQU1FX0NPTlRST0wsICpQRlJBTUVfQ09OVFJPTDsKLQotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9IRUFERVJfODAyXzExCXsKLSAgICBGUkFNRV9DT05UUk9MICAgRkM7Ci0gICAgVVNIT1JUICAgICAgICAgIER1cmF0aW9uOwotICAgIFVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOwotICAgIFVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCVVDSEFSCQkJQWRkcjNbTUFDX0FERFJfTEVOXTsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JVVNIT1JUCQkJU2VxdWVuY2U6MTI7Ci0JVVNIT1JUCQkJRnJhZzo0OwotI2Vsc2UKLQlVU0hPUlQJCQlGcmFnOjQ7Ci0JVVNIT1JUCQkJU2VxdWVuY2U6MTI7Ci0jZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KLQlVQ0hBUgkJCU9jdGV0WzBdOwotfQlIRUFERVJfODAyXzExLCAqUEhFQURFUl84MDJfMTE7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUFNQT0xMX0ZSQU1FIHsKLSAgICBGUkFNRV9DT05UUk9MICAgRkM7Ci0gICAgVVNIT1JUICAgICAgICAgIEFpZDsKLSAgICBVQ0hBUiAgICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXTsKLSAgICBVQ0hBUiAgICAgICAgICAgVGFbTUFDX0FERFJfTEVOXTsKLX0gICBQU1BPTExfRlJBTUUsICpQUFNQT0xMX0ZSQU1FOwotCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JUU19GUkFNRQl7Ci0gICAgRlJBTUVfQ09OVFJPTCAgIEZDOwotICAgIFVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKLSAgICBVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKLSAgICBVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLX1SVFNfRlJBTUUsICpQUlRTX0ZSQU1FOwotCi0jZW5kaWYgLy8gX19ET1QxMV9CQVNFX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX2lmYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfaWZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY4ZDA3OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfaWZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0JcnRfaWZhY2UuaAotCi0gICAgQWJzdHJhY3Q6Ci0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotI2lmbmRlZiBfX1JUTVBfSUZBQ0VfSF9fCi0jZGVmaW5lIF9fUlRNUF9JRkFDRV9IX18KLQotI2lmZGVmIFJUTVBfUENJX1NVUFBPUlQKLSNpbmNsdWRlICJydG1wX3BjaS5oIgotI2VuZGlmIC8vIFJUTVBfUENJX1NVUFBPUlQgLy8KLQotCi10eXBlZGVmIHN0cnVjdCBfSU5GX1BDSV9DT05GSUdfCi17Ci0JdW5zaWduZWQgbG9uZwlDU1JCYXNlQWRkcmVzczsgICAgIC8vIFBDSSBNTUlPIEJhc2UgQWRkcmVzcywgYWxsIGFjY2VzcyB3aWxsIHVzZQotCXVuc2lnbmVkIGludAlpcnFfbnVtOwotfUlORl9QQ0lfQ09ORklHOwotCi0KLXR5cGVkZWYgc3RydWN0IF9JTkZfVVNCX0NPTkZJR18KLXsKLQlVSU5UOCAgICAgICAgICAgICAgICBCdWxrSW5FcEFkZHI7CQkvLyBidWxrLWluIGVuZHBvaW50IGFkZHJlc3MKLQlVSU5UOCAgICAgICAgICAgICAgICBCdWxrT3V0RXBBZGRyWzZdOwkvLyBidWxrLW91dCBlbmRwb2ludCBhZGRyZXNzCi19SU5GX1VTQl9DT05GSUc7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX0lORl9SQlVTX0NPTkZJR18KLXsKLQl1bnNpZ25lZCBsb25nCQljc3JfYWRkcjsKLQl1bnNpZ25lZCBpbnQJCWlycTsKLX1JTkZfUkJVU19DT05GSUc7Ci0KLQotdHlwZWRlZiBlbnVtIF9SVE1QX0lORl9UWVBFXwotewotCVJUTVBfREVWX0lORl9VTktOT1dOID0gMCwKLQlSVE1QX0RFVl9JTkZfUENJID0gMSwKLQlSVE1QX0RFVl9JTkZfVVNCID0gMiwKLQlSVE1QX0RFVl9JTkZfUkJVUyA9IDQsCi19UlRNUF9JTkZfVFlQRTsKLQotCi10eXBlZGVmIHVuaW9uIF9SVE1QX0lORl9DT05GSUdfewotCXN0cnVjdCBfSU5GX1BDSV9DT05GSUdfCQkJcGNpQ29uZmlnOwotCXN0cnVjdCBfSU5GX1VTQl9DT05GSUdfCQkJdXNiQ29uZmlnOwotCXN0cnVjdCBfSU5GX1JCVVNfQ09ORklHXwkJcmJ1c0NvbmZpZzsKLX1SVE1QX0lORl9DT05GSUc7Ci0KLSNlbmRpZiAvLyBfX1JUTVBfSUZBQ0VfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfbWFjLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfbWFjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1N2IyOTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX21hYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMwNCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXJ0bXBfbWFjLmgKLQotCUFic3RyYWN0OgotCVJhbGluayBXaXJlbGVzcyBDaGlwIE1BQyByZWxhdGVkIGRlZmluaXRpb24gJiBzdHJ1Y3R1cmVzCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCSAgV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaWZuZGVmIF9fUlRNUF9NQUNfSF9fCi0jZGVmaW5lIF9fUlRNUF9NQUNfSF9fCi0KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFRYIC8gUlggcmluZyBkZXNjcmlwdG9yIGZvcm1hdAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIHRoZSBmaXJzdCAyNC1ieXRlIGluIFRYRCBpcyBjYWxsZWQgVFhJTkZPIGFuZCB3aWxsIGJlIERNQWVkIHRvIE1BQyBibG9jayB0aHJvdWdoIFRYRklGTy4KLS8vIE1BQyBibG9jayB1c2UgdGhpcyBUWElORk8gdG8gY29udHJvbCB0aGUgdHJhbnNtaXNzaW9uIGJlaGF2aW9yIG9mIHRoaXMgZnJhbWUuCi0jZGVmaW5lIEZJRk9fTUdNVCAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBGSUZPX0hDQ0EgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgRklGT19FRENBICAgICAgICAgICAgICAgICAyCi0KLQotLy8KLS8vIFRYRCBXaXJlbGVzcyBJbmZvcm1hdGlvbiBmb3JtYXQgZm9yIFR4IHJpbmcgYW5kIE1nbXQgUmluZwotLy8KLS8vdHhvcCA6IGZvciB0eG9wIG1vZGUKLS8vIDA6dHhvcCBmb3IgdGhlIE1QRFUgZnJhbWUgd2lsbCBiZSBoYW5kbGVzIGJ5IEFTSUMgYnkgcmVnaXN0ZXIKLS8vIDEvMi8zOnRoZSBNUERVIGZyYW1lIGlzIHNlbmQgYWZ0ZXIgUElGUy9iYWNrb2ZmL1NJRlMKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1RYV0lfU1RSVUMgewotCS8vIFdvcmQgMAotCVVJTlQzMgkJUEhZTU9ERToyOwotCVVJTlQzMgkJVHhCRjoxOwkvLyAzKjMKLQlVSU5UMzIJCXJzdjI6MTsKLS8vCVVJTlQzMgkJcnN2MjoyOwotCVVJTlQzMgkJSWZzOjE7CS8vCi0JVUlOVDMyCQlTVEJDOjI7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6Ci0JVUlOVDMyCQlTaG9ydEdJOjE7Ci0JVUlOVDMyCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegotCVVJTlQzMgkJTUNTOjc7Ci0KLQlVSU5UMzIJCXJzdjo2OwotCVVJTlQzMgkJdHhvcDoyOwkvL3R4IGJhY2sgb2ZmIG1vZGUgMDpIVCBUWE9QIHJ1bGUgLCAxOlBJRlMgVFggLDI6QmFja29mZiwgMzpzaWZzIG9ubHkgd2hlbiBwcmV2aW91cyBmcmFtZSBleGNoYW5nZSBpcyBzdWNjZXNzZnVsLgotCVVJTlQzMgkJTXBkdURlbnNpdHk6MzsKLQlVSU5UMzIJCUFNUERVOjE7Ci0KLQlVSU5UMzIJCVRTOjE7Ci0JVUlOVDMyCQlDRkFDSzoxOwotCVVJTlQzMgkJTUlNT3BzOjE7CS8vIHRoZSByZW1vdGUgcGVlciBpcyBpbiBkeW5hbWljIE1JTU8tUFMgbW9kZQotCVVJTlQzMgkJRlJBRzoxOwkJLy8gMSB0byBpbmZvcm0gVEtJUCBlbmdpbmUgdGhpcyBpcyBhIGZyYWdtZW50LgotCS8vIFdvcmQgMQotCVVJTlQzMgkJUGFja2V0SWQ6NDsKLQlVSU5UMzIJCU1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKLQlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKLQlVSU5UMzIJCUJBV2luU2l6ZTo2OwotCVVJTlQzMgkJTlNFUToxOwotCVVJTlQzMgkJQUNLOjE7Ci0JLy8gV29yZCAyCi0JVUlOVDMyCQlJVjsKLQkvLyBXb3JkIDMKLQlVSU5UMzIJCUVJVjsKLX0JVFhXSV9TVFJVQywgKlBUWFdJX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJc3RydWN0CVBBQ0tFRCBfVFhXSV9TVFJVQyB7Ci0JLy8gV29yZAkwCi0JLy8gZXg6IDAwIDAzIDAwIDQwIG1lYW5zIHR4b3AgPSAzLCBQSFlNT0RFID0gMQotCVVJTlQzMgkJRlJBRzoxOwkJLy8gMSB0byBpbmZvcm0gVEtJUCBlbmdpbmUgdGhpcyBpcyBhIGZyYWdtZW50LgotCVVJTlQzMgkJTUlNT3BzOjE7CS8vIHRoZSByZW1vdGUgcGVlciBpcyBpbiBkeW5hbWljIE1JTU8tUFMgbW9kZQotCVVJTlQzMgkJQ0ZBQ0s6MTsKLQlVSU5UMzIJCVRTOjE7Ci0KLQlVSU5UMzIJCUFNUERVOjE7Ci0JVUlOVDMyCQlNcGR1RGVuc2l0eTozOwotCVVJTlQzMgkJdHhvcDoyOwkvL0ZPUiAiVEhJUyIgZnJhbWUuIDA6SFQgVFhPUCBydWxlICwgMTpQSUZTIFRYICwyOkJhY2tvZmYsIDM6c2lmcyBvbmx5IHdoZW4gcHJldmlvdXMgZnJhbWUgZXhjaGFuZ2UgaXMgc3VjY2Vzc2Z1bC4KLQlVSU5UMzIJCXJzdjo2OwotCi0JVUlOVDMyCQlNQ1M6NzsKLQlVSU5UMzIJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6Ci0JVUlOVDMyCQlTaG9ydEdJOjE7Ci0JVUlOVDMyCQlTVEJDOjI7CS8vIDE6IFNUQkMgc3VwcG9ydCBNQ1MgPTAtNywgICAyLDMgOiBSRVNFUlZFCi0JVUlOVDMyCQlJZnM6MTsJLy8KLS8vCVVJTlQzMgkJcnN2MjoyOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegotCVVJTlQzMgkJcnN2MjoxOwotCVVJTlQzMgkJVHhCRjoxOwkvLyAzKjMKLQlVSU5UMzIJCVBIWU1PREU6MjsKLQkvLyBXb3JkMQotCS8vIGV4OiAgMWMgZmYgMzggMDAgbWVhbnMgQUNLPTAsIEJBV2luU2l6ZT03LCBNUERVdG90YWxCeXRlQ291bnQgPSAweDM4Ci0JVUlOVDMyCQlBQ0s6MTsKLQlVSU5UMzIJCU5TRVE6MTsKLQlVSU5UMzIJCUJBV2luU2l6ZTo2OwotCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OwotCVVJTlQzMgkJTVBEVXRvdGFsQnl0ZUNvdW50OjEyOwotCVVJTlQzMgkJUGFja2V0SWQ6NDsKLQkvL1dvcmQyCi0JVUlOVDMyCQlJVjsKLQkvL1dvcmQzCi0JVUlOVDMyCQlFSVY7Ci19CVRYV0lfU1RSVUMsICpQVFhXSV9TVFJVQzsKLSNlbmRpZgotCi0KLS8vCi0vLyBSWFdJIHdpcmVsZXNzIGluZm9ybWF0aW9uIGZvcm1hdCwgaW4gUEJGLiBpbnZpc2libGUgaW4gZHJpdmVyLgotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JYV0lfU1RSVUMgewotCS8vIFdvcmQgMAotCVVJTlQzMgkJVElEOjQ7Ci0JVUlOVDMyCQlNUERVdG90YWxCeXRlQ291bnQ6MTI7Ci0JVUlOVDMyCQlVREY6MzsKLQlVSU5UMzIJCUJTU0lEOjM7Ci0JVUlOVDMyCQlLZXlJbmRleDoyOwotCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OwotCS8vIFdvcmQgMQotCVVJTlQzMgkJUEhZTU9ERToyOyAgICAgICAgICAgICAgLy8gMTogdGhpcyBSWCBmcmFtZSBpcyB1bmljYXN0IHRvIG1lCi0JVUlOVDMyCQlyc3Y6MzsKLQlVSU5UMzIJCVNUQkM6MjsKLQlVSU5UMzIJCVNob3J0R0k6MTsKLQlVSU5UMzIJCUJXOjE7Ci0JVUlOVDMyCQlNQ1M6NzsKLQlVSU5UMzIJCVNFUVVFTkNFOjEyOwotCVVJTlQzMgkJRlJBRzo0OwotCS8vIFdvcmQgMgotCVVJTlQzMgkJcnN2MTo4OwotCVVJTlQzMgkJUlNTSTI6ODsKLQlVSU5UMzIJCVJTU0kxOjg7Ci0JVUlOVDMyCQlSU1NJMDo4OwotCS8vIFdvcmQgMwotCS8qVUlOVDMyCQlyc3YyOjE2OyovCi0JVUlOVDMyCQlyc3YyOjg7Ci0JVUlOVDMyCQlGT0ZGU0VUOjg7CS8vIFJUMzV4eAotCVVJTlQzMgkJU05SMTo4OwotCVVJTlQzMgkJU05SMDo4OwotfQlSWFdJX1NUUlVDLCAqUFJYV0lfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWFdJX1NUUlVDIHsKLQkvLyBXb3JkCTAKLQlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKLQlVSU5UMzIJCUtleUluZGV4OjI7Ci0JVUlOVDMyCQlCU1NJRDozOwotCVVJTlQzMgkJVURGOjM7Ci0JVUlOVDMyCQlNUERVdG90YWxCeXRlQ291bnQ6MTI7Ci0JVUlOVDMyCQlUSUQ6NDsKLQkvLyBXb3JkCTEKLQlVSU5UMzIJCUZSQUc6NDsKLQlVSU5UMzIJCVNFUVVFTkNFOjEyOwotCVVJTlQzMgkJTUNTOjc7Ci0JVUlOVDMyCQlCVzoxOwotCVVJTlQzMgkJU2hvcnRHSToxOwotCVVJTlQzMgkJU1RCQzoyOwotCVVJTlQzMgkJcnN2OjM7Ci0JVUlOVDMyCQlQSFlNT0RFOjI7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKLQkvL1dvcmQyCi0JVUlOVDMyCQlSU1NJMDo4OwotCVVJTlQzMgkJUlNTSTE6ODsKLQlVSU5UMzIJCVJTU0kyOjg7Ci0JVUlOVDMyCQlyc3YxOjg7Ci0JLy9Xb3JkMwotCVVJTlQzMgkJU05SMDo4OwotCVVJTlQzMgkJU05SMTo4OwotCVVJTlQzMgkJRk9GRlNFVDo4OwkvLyBSVDM1eHgKLQlVSU5UMzIJCXJzdjI6ODsKLQkvKlVJTlQzMgkJcnN2MjoxNjsqLwotfQlSWFdJX1NUUlVDLCAqUFJYV0lfU1RSVUM7Ci0jZW5kaWYKLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFJlZ2lzdGVyIGZvcm1hdAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotLy8KLS8vIFNDSC9ETUEgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MDIwMAotLy8KLS8vIElOVF9TT1VSQ0VfQ1NSOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyLiBXcml0ZSBvbmUgdG8gY2xlYXIgY29ycmVzcG9uZGluZyBiaXQKLS8vCi0jZGVmaW5lIERNQV9DU1IwCQkweDIwMAotI2RlZmluZSBJTlRfU09VUkNFX0NTUgkJMHgyMDAKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9JTlRfU09VUkNFX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLSNpZmRlZiBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUCi0JCVVJTlQzMgkJCToxMTsKLQkJVUlOVDMyCQkJUmFkYXJJTlQ6MTsKLQkJVUlOVDMyCQlyc3Y6MjsKLSNlbHNlIC8vIG9yaWdpbmFsIHNvdXJjZSBjb2RlCi0JCVVJTlQzMgkJOjE0OwotI2VuZGlmIC8vIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQgLy8KLQkJVUlOVDMyCQlUeENvaGVyZW50OjE7Ci0JCVVJTlQzMgkJUnhDb2hlcmVudDoxOwotCQlVSU5UMzIJCUdQVGltZXI6MTsKLQkJVUlOVDMyCQlBdXRvV2FrZXVwOjE7Ly9iaXQxNAotCQlVSU5UMzIJCVRYRmlmb1N0YXR1c0ludDoxOy8vRklGTyBTdGF0aXN0aWNzIGlzIGZ1bGwsIHN3IHNob3VsZCByZWFkIDB4MTcxYwotCQlVSU5UMzIJCVByZVRCVFQ6MTsKLQkJVUlOVDMyCQlUQlRUSW50OjE7Ci0JCVVJTlQzMgkJUnhUeENvaGVyZW50OjE7Ci0JCVVJTlQzMgkJTUNVQ29tbWFuZElOVDoxOwotCQlVSU5UMzIJCU1nbXREbWFEb25lOjE7Ci0JCVVJTlQzMgkJSGNjYURtYURvbmU6MTsKLQkJVUlOVDMyCQlBYzNEbWFEb25lOjE7Ci0JCVVJTlQzMgkJQWMyRG1hRG9uZToxOwotCQlVSU5UMzIJCUFjMURtYURvbmU6MTsKLQkJVUlOVDMyCQlBYzBEbWFEb25lOjE7Ci0JCVVJTlQzMgkJUnhEb25lOjE7Ci0JCVVJTlQzMgkJVHhEZWxheUlOVDoxOwkvL2RlbGF5ZWQgaW50ZXJydXB0LCBub3QgaW50ZXJydXB0IHVudGlsIHNldmVyYWwgaW50IG9yIHRpbWUgbGltaXQgaGl0Ci0JCVVJTlQzMgkJUnhEZWxheUlOVDoxOyAvL2RlYWx5ZWQgaW50ZXJydXB0Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlJTlRfU09VUkNFX0NTUl9TVFJVQywgKlBJTlRfU09VUkNFX0NTUl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9JTlRfU09VUkNFX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSeERlbGF5SU5UOjE7Ci0JCVVJTlQzMgkJVHhEZWxheUlOVDoxOwotCQlVSU5UMzIJCVJ4RG9uZToxOwotCQlVSU5UMzIJCUFjMERtYURvbmU6MTsvLzQKLQkJVUlOVDMyCQlBYzFEbWFEb25lOjE7Ci0JCVVJTlQzMgkJQWMyRG1hRG9uZToxOwotCQlVSU5UMzIJCUFjM0RtYURvbmU6MTsKLQkJVUlOVDMyCQlIY2NhRG1hRG9uZToxOyAvLyBiaXQ3Ci0JCVVJTlQzMgkJTWdtdERtYURvbmU6MTsKLQkJVUlOVDMyCQlNQ1VDb21tYW5kSU5UOjE7Ly9iaXQgOQotCQlVSU5UMzIJCVJ4VHhDb2hlcmVudDoxOwotCQlVSU5UMzIJCVRCVFRJbnQ6MTsKLQkJVUlOVDMyCQlQcmVUQlRUOjE7Ci0JCVVJTlQzMgkJVFhGaWZvU3RhdHVzSW50OjE7Ly9GSUZPIFN0YXRpc3RpY3MgaXMgZnVsbCwgc3cgc2hvdWxkIHJlYWQgMHgxNzFjCi0JCVVJTlQzMgkJQXV0b1dha2V1cDoxOy8vYml0MTQKLQkJVUlOVDMyCQlHUFRpbWVyOjE7Ci0JCVVJTlQzMgkJUnhDb2hlcmVudDoxOy8vYml0MTYKLQkJVUlOVDMyCQlUeENvaGVyZW50OjE7Ci0jaWZkZWYgVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVAotCQlVSU5UMzIJCXJzdjoyOwotCQlVSU5UMzIJCQlSYWRhcklOVDoxOwotCQlVSU5UMzIJCQk6MTE7Ci0jZWxzZQotCQlVSU5UMzIJCToxNDsKLSNlbmRpZiAvLyBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUIC8vCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfSBJTlRfU09VUkNFX0NTUl9TVFJVQywgKlBJTlRfU09VUkNFX0NTUl9TVFJVQzsKLSNlbmRpZgotCi0vLwotLy8gSU5UX01BU0tfQ1NSOiAgIEludGVycnVwdCBNQVNLIHJlZ2lzdGVyLiAgIDE6IHRoZSBpbnRlcnJ1cHQgaXMgbWFzayBPRkYKLS8vCi0jZGVmaW5lIElOVF9NQVNLX0NTUiAgICAgICAgMHgyMDQKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9JTlRfTUFTS19DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJVHhDb2hlcmVudDoxOwotCQlVSU5UMzIJCVJ4Q29oZXJlbnQ6MTsKLSNpZmRlZiBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUCi0JCVVJTlQzMgkJCTo5OwotCQlVSU5UMzIJCQlSYWRhcklOVDoxOwotCQlVSU5UMzIJCXJzdjoxMDsKLSNlbHNlCi0JCVVJTlQzMgkJOjIwOwotI2VuZGlmIC8vIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQgLy8KLQkJVUlOVDMyCQlNQ1VDb21tYW5kSU5UOjE7Ci0JCVVJTlQzMgkJTWdtdERtYURvbmU6MTsKLQkJVUlOVDMyCQlIY2NhRG1hRG9uZToxOwotCQlVSU5UMzIJCUFjM0RtYURvbmU6MTsKLQkJVUlOVDMyCQlBYzJEbWFEb25lOjE7Ci0JCVVJTlQzMgkJQWMxRG1hRG9uZToxOwotCQlVSU5UMzIJCUFjMERtYURvbmU6MTsKLQkJVUlOVDMyCQlSeERvbmU6MTsKLQkJVUlOVDMyCQlUeERlbGF5OjE7Ci0JCVVJTlQzMgkJUlhEZWxheV9JTlRfTVNLOjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfUlOVF9NQVNLX0NTUl9TVFJVQywgKlBJTlRfTUFTS19DU1JfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfSU5UX01BU0tfQ1NSX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJYRGVsYXlfSU5UX01TSzoxOwotCQlVSU5UMzIJCVR4RGVsYXk6MTsKLQkJVUlOVDMyCQlSeERvbmU6MTsKLQkJVUlOVDMyCQlBYzBEbWFEb25lOjE7Ci0JCVVJTlQzMgkJQWMxRG1hRG9uZToxOwotCQlVSU5UMzIJCUFjMkRtYURvbmU6MTsKLQkJVUlOVDMyCQlBYzNEbWFEb25lOjE7Ci0JCVVJTlQzMgkJSGNjYURtYURvbmU6MTsKLQkJVUlOVDMyCQlNZ210RG1hRG9uZToxOwotCQlVSU5UMzIJCU1DVUNvbW1hbmRJTlQ6MTsKLSNpZmRlZiBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUCi0JCVVJTlQzMgkJcnN2OjEwOwotCQlVSU5UMzIJCQlSYWRhcklOVDoxOwotCQlVSU5UMzIJCQk6OTsKLSNlbHNlCi0JCVVJTlQzMgkJOjIwOwotI2VuZGlmIC8vIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQgLy8KLQkJVUlOVDMyCQlSeENvaGVyZW50OjE7Ci0JCVVJTlQzMgkJVHhDb2hlcmVudDoxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0gSU5UX01BU0tfQ1NSX1NUUlVDLCAqUElOVF9NQVNLX0NTUl9TVFJVQzsKLSNlbmRpZgotCi0jZGVmaW5lIFdQRE1BX0dMT19DRkcJMHgyMDgKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9XUERNQV9HTE9fQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCUhEUl9TRUdfTEVOOjE2OwotCQlVSU5UMzIJCVJYSGRyU2NhdGVyOjg7Ci0JCVVJTlQzMgkJQmlnRW5kaWFuOjE7Ci0JCVVJTlQzMgkJRW5UWFdyaXRlQmFja0RET05FOjE7Ci0JCVVJTlQzMgkJV1BETUFCdXJzdFNJWkU6MjsKLQkJVUlOVDMyCQlSeERNQUJ1c3k6MTsKLQkJVUlOVDMyCQlFbmFibGVSeERNQToxOwotCQlVSU5UMzIJCVR4RE1BQnVzeToxOwotCQlVSU5UMzIJCUVuYWJsZVR4RE1BOjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfVdQRE1BX0dMT19DRkdfU1RSVUMsICpQV1BETUFfR0xPX0NGR19TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9XUERNQV9HTE9fQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCUVuYWJsZVR4RE1BOjE7Ci0JCVVJTlQzMgkJVHhETUFCdXN5OjE7Ci0JCVVJTlQzMgkJRW5hYmxlUnhETUE6MTsKLQkJVUlOVDMyCQlSeERNQUJ1c3k6MTsKLQkJVUlOVDMyCQlXUERNQUJ1cnN0U0laRToyOwotCQlVSU5UMzIJCUVuVFhXcml0ZUJhY2tERE9ORToxOwotCQlVSU5UMzIJCUJpZ0VuZGlhbjoxOwotCQlVSU5UMzIJCVJYSGRyU2NhdGVyOjg7Ci0JCVVJTlQzMgkJSERSX1NFR19MRU46MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfSBXUERNQV9HTE9fQ0ZHX1NUUlVDLCAqUFdQRE1BX0dMT19DRkdfU1RSVUM7Ci0jZW5kaWYKLQotI2RlZmluZSBXUERNQV9SU1RfSURYCTB4MjBjCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfV1BETUFfUlNUX0lEWF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQk6MTU7Ci0JCVVJTlQzMgkJUlNUX0RSWF9JRFgwOjE7Ci0JCVVJTlQzMgkJcnN2OjEwOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYNToxOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYNDoxOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYMzoxOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYMjoxOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYMToxOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYMDoxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX1XUERNQV9SU1RfSURYX1NUUlVDLCAqUFdQRE1BX1JTVF9JRFhfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfV1BETUFfUlNUX0lEWF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSU1RfRFRYX0lEWDA6MTsKLQkJVUlOVDMyCQlSU1RfRFRYX0lEWDE6MTsKLQkJVUlOVDMyCQlSU1RfRFRYX0lEWDI6MTsKLQkJVUlOVDMyCQlSU1RfRFRYX0lEWDM6MTsKLQkJVUlOVDMyCQlSU1RfRFRYX0lEWDQ6MTsKLQkJVUlOVDMyCQlSU1RfRFRYX0lEWDU6MTsKLQkJVUlOVDMyCQlyc3Y6MTA7Ci0JCVVJTlQzMgkJUlNUX0RSWF9JRFgwOjE7Ci0JCVVJTlQzMgkJOjE1OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0gV1BETUFfUlNUX0lEWF9TVFJVQywgKlBXUERNQV9SU1RfSURYX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIERFTEFZX0lOVF9DRkcgIDB4MDIxMAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0RFTEFZX0lOVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJVFhETFlfSU5UX0VOOjE7Ci0JCVVJTlQzMgkJVFhNQVhfUElOVDo3OwotCQlVSU5UMzIJCVRYTUFYX1BUSU1FOjg7Ci0JCVVJTlQzMgkJUlhETFlfSU5UX0VOOjE7Ci0JCVVJTlQzMgkJUlhNQVhfUElOVDo3OwotCQlVSU5UMzIJCVJYTUFYX1BUSU1FOjg7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfURFTEFZX0lOVF9DRkdfU1RSVUMsICpQREVMQVlfSU5UX0NGR19TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9ERUxBWV9JTlRfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJYTUFYX1BUSU1FOjg7Ci0JCVVJTlQzMgkJUlhNQVhfUElOVDo3OwotCQlVSU5UMzIJCVJYRExZX0lOVF9FTjoxOwotCQlVSU5UMzIJCVRYTUFYX1BUSU1FOjg7Ci0JCVVJTlQzMgkJVFhNQVhfUElOVDo3OwotCQlVSU5UMzIJCVRYRExZX0lOVF9FTjoxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0gREVMQVlfSU5UX0NGR19TVFJVQywgKlBERUxBWV9JTlRfQ0ZHX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIFdNTV9BSUZTTl9DRkcgICAweDAyMTQKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9BSUZTTl9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgIFJzdjoxNjsKLQkgICAgVUlOVDMyICAgQWlmc24zOjQ7ICAgICAgIC8vIGZvciBBQ19WTwotCSAgICBVSU5UMzIgICBBaWZzbjI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCi0JICAgIFVJTlQzMiAgIEFpZnNuMTo0OyAgICAgICAvLyBmb3IgQUNfQksKLQkgICAgVUlOVDMyICAgQWlmc24wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQUlGU05fQ1NSX1NUUlVDLCAqUEFJRlNOX0NTUl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9BSUZTTl9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgIEFpZnNuMDo0OyAgICAgICAvLyBmb3IgQUNfQkUKLQkgICAgVUlOVDMyICAgQWlmc24xOjQ7ICAgICAgIC8vIGZvciBBQ19CSwotCSAgICBVSU5UMzIgICBBaWZzbjI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCi0JICAgIFVJTlQzMiAgIEFpZnNuMzo0OyAgICAgICAvLyBmb3IgQUNfVk8KLQkgICAgVUlOVDMyICAgUnN2OjE2OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQUlGU05fQ1NSX1NUUlVDLCAqUEFJRlNOX0NTUl9TVFJVQzsKLSNlbmRpZgotLy8KLS8vIENXTUlOX0NTUjogQ1dtaW4gZm9yIGVhY2ggRURDQSBBQwotLy8KLSNkZWZpbmUgV01NX0NXTUlOX0NGRyAgIDB4MDIxOAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0NXTUlOX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgUnN2OjE2OwotCSAgICBVSU5UMzIgICBDd21pbjM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCi0JICAgIFVJTlQzMiAgIEN3bWluMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKLQkgICAgVUlOVDMyICAgQ3dtaW4xOjQ7ICAgICAgIC8vIGZvciBBQ19CSwotCSAgICBVSU5UMzIgICBDd21pbjA6NDsgICAgICAgLy8gZm9yIEFDX0JFCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlDV01JTl9DU1JfU1RSVUMsICpQQ1dNSU5fQ1NSX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0NXTUlOX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgQ3dtaW4wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQotCSAgICBVSU5UMzIgICBDd21pbjE6NDsgICAgICAgLy8gZm9yIEFDX0JLCi0JICAgIFVJTlQzMiAgIEN3bWluMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKLQkgICAgVUlOVDMyICAgQ3dtaW4zOjQ7ICAgICAgIC8vIGZvciBBQ19WTwotCSAgICBVSU5UMzIgICBSc3Y6MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlDV01JTl9DU1JfU1RSVUMsICpQQ1dNSU5fQ1NSX1NUUlVDOwotI2VuZGlmCi0KLS8vCi0vLyBDV01BWF9DU1I6IENXbWluIGZvciBlYWNoIEVEQ0EgQUMKLS8vCi0jZGVmaW5lIFdNTV9DV01BWF9DRkcgICAweDAyMWMKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9DV01BWF9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgIFJzdjoxNjsKLQkgICAgVUlOVDMyICAgQ3dtYXgzOjQ7ICAgICAgIC8vIGZvciBBQ19WTwotCSAgICBVSU5UMzIgICBDd21heDI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCi0JICAgIFVJTlQzMiAgIEN3bWF4MTo0OyAgICAgICAvLyBmb3IgQUNfQksKLQkgICAgVUlOVDMyICAgQ3dtYXgwOjQ7ICAgICAgIC8vIGZvciBBQ19CRQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQ1dNQVhfQ1NSX1NUUlVDLCAqUENXTUFYX0NTUl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9DV01BWF9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgIEN3bWF4MDo0OyAgICAgICAvLyBmb3IgQUNfQkUKLQkgICAgVUlOVDMyICAgQ3dtYXgxOjQ7ICAgICAgIC8vIGZvciBBQ19CSwotCSAgICBVSU5UMzIgICBDd21heDI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCi0JICAgIFVJTlQzMiAgIEN3bWF4Mzo0OyAgICAgICAvLyBmb3IgQUNfVk8KLQkgICAgVUlOVDMyICAgUnN2OjE2OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQ1dNQVhfQ1NSX1NUUlVDLCAqUENXTUFYX0NTUl9TVFJVQzsKLSNlbmRpZgotCi0KLS8vCi0vLyBBQ19UWE9QX0NTUjA6IEFDX0JLL0FDX0JFIFRYT1AgcmVnaXN0ZXIKLS8vCi0jZGVmaW5lIFdNTV9UWE9QMF9DRkcgICAgMHgwMjIwCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfQUNfVFhPUF9DU1IwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFjMVR4b3A7ICAgICAgICAvLyBmb3IgQUNfQkUsIGluIHVuaXQgb2YgMzJ1cwotCSAgICBVU0hPUlQgIEFjMFR4b3A7ICAgICAgICAvLyBmb3IgQUNfQkssIGluIHVuaXQgb2YgMzJ1cwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQUNfVFhPUF9DU1IwX1NUUlVDLCAqUEFDX1RYT1BfQ1NSMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjBfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWMwVHhvcDsgICAgICAgIC8vIGZvciBBQ19CSywgaW4gdW5pdCBvZiAzMnVzCi0JICAgIFVTSE9SVCAgQWMxVHhvcDsgICAgICAgIC8vIGZvciBBQ19CRSwgaW4gdW5pdCBvZiAzMnVzCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlBQ19UWE9QX0NTUjBfU1RSVUMsICpQQUNfVFhPUF9DU1IwX1NUUlVDOwotI2VuZGlmCi0KLS8vCi0vLyBBQ19UWE9QX0NTUjE6IEFDX1ZPL0FDX1ZJIFRYT1AgcmVnaXN0ZXIKLS8vCi0jZGVmaW5lIFdNTV9UWE9QMV9DRkcgICAgMHgwMjI0Ci0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfQUNfVFhPUF9DU1IxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFjM1R4b3A7ICAgICAgICAvLyBmb3IgQUNfVk8sIGluIHVuaXQgb2YgMzJ1cwotCSAgICBVU0hPUlQgIEFjMlR4b3A7ICAgICAgICAvLyBmb3IgQUNfVkksIGluIHVuaXQgb2YgMzJ1cwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQUNfVFhPUF9DU1IxX1NUUlVDLCAqUEFDX1RYT1BfQ1NSMV9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjFfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWMyVHhvcDsgICAgICAgIC8vIGZvciBBQ19WSSwgaW4gdW5pdCBvZiAzMnVzCi0JICAgIFVTSE9SVCAgQWMzVHhvcDsgICAgICAgIC8vIGZvciBBQ19WTywgaW4gdW5pdCBvZiAzMnVzCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlBQ19UWE9QX0NTUjFfU1RSVUMsICpQQUNfVFhPUF9DU1IxX1NUUlVDOwotI2VuZGlmCi0KLQotI2RlZmluZSBSSU5HUkVHX0RJRkYJCQkweDEwCi0jZGVmaW5lIEdQSU9fQ1RSTF9DRkcgICAgMHgwMjI4CS8vTUFDX0NTUjEzCi0jZGVmaW5lIE1DVV9DTURfQ0ZHICAgIDB4MDIyYwotI2RlZmluZSBUWF9CQVNFX1BUUjAgICAgIDB4MDIzMAkvL0FDX0JLIGJhc2UgYWRkcmVzcwotI2RlZmluZSBUWF9NQVhfQ05UMCAgICAgIDB4MDIzNAotI2RlZmluZSBUWF9DVFhfSURYMCAgICAgICAweDAyMzgKLSNkZWZpbmUgVFhfRFRYX0lEWDAgICAgICAweDAyM2MKLSNkZWZpbmUgVFhfQkFTRV9QVFIxICAgICAweDAyNDAJCS8vQUNfQkUgYmFzZSBhZGRyZXNzCi0jZGVmaW5lIFRYX01BWF9DTlQxICAgICAgMHgwMjQ0Ci0jZGVmaW5lIFRYX0NUWF9JRFgxICAgICAgIDB4MDI0OAotI2RlZmluZSBUWF9EVFhfSURYMSAgICAgIDB4MDI0YwotI2RlZmluZSBUWF9CQVNFX1BUUjIgICAgIDB4MDI1MAkJLy9BQ19WSSBiYXNlIGFkZHJlc3MKLSNkZWZpbmUgVFhfTUFYX0NOVDIgICAgICAweDAyNTQKLSNkZWZpbmUgVFhfQ1RYX0lEWDIgICAgICAgMHgwMjU4Ci0jZGVmaW5lIFRYX0RUWF9JRFgyICAgICAgMHgwMjVjCi0jZGVmaW5lIFRYX0JBU0VfUFRSMyAgICAgMHgwMjYwCQkvL0FDX1ZPIGJhc2UgYWRkcmVzcwotI2RlZmluZSBUWF9NQVhfQ05UMyAgICAgIDB4MDI2NAotI2RlZmluZSBUWF9DVFhfSURYMyAgICAgICAweDAyNjgKLSNkZWZpbmUgVFhfRFRYX0lEWDMgICAgICAweDAyNmMKLSNkZWZpbmUgVFhfQkFTRV9QVFI0ICAgICAweDAyNzAJCS8vSENDQSBiYXNlIGFkZHJlc3MKLSNkZWZpbmUgVFhfTUFYX0NOVDQgICAgICAweDAyNzQKLSNkZWZpbmUgVFhfQ1RYX0lEWDQgICAgICAgMHgwMjc4Ci0jZGVmaW5lIFRYX0RUWF9JRFg0ICAgICAgMHgwMjdjCi0jZGVmaW5lIFRYX0JBU0VfUFRSNSAgICAgMHgwMjgwCQkvL01HTVQgYmFzZSBhZGRyZXNzCi0jZGVmaW5lICBUWF9NQVhfQ05UNSAgICAgMHgwMjg0Ci0jZGVmaW5lIFRYX0NUWF9JRFg1ICAgICAgIDB4MDI4OAotI2RlZmluZSBUWF9EVFhfSURYNSAgICAgIDB4MDI4YwotI2RlZmluZSBUWF9NR01UTUFYX0NOVCAgICAgIFRYX01BWF9DTlQ1Ci0jZGVmaW5lIFRYX01HTVRDVFhfSURYICAgICAgIFRYX0NUWF9JRFg1Ci0jZGVmaW5lIFRYX01HTVREVFhfSURYICAgICAgVFhfRFRYX0lEWDUKLSNkZWZpbmUgUlhfQkFTRV9QVFIgICAgIDB4MDI5MAkvL1JYIGJhc2UgYWRkcmVzcwotI2RlZmluZSBSWF9NQVhfQ05UICAgICAgMHgwMjk0Ci0jZGVmaW5lIFJYX0NSWF9JRFggICAgICAgMHgwMjk4Ci0jZGVmaW5lIFJYX0RSWF9JRFggICAgICAweDAyOWMKLQotCi0jZGVmaW5lIFVTQl9ETUFfQ0ZHICAgICAgMHgwMmEwCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfVVNCX0RNQV9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgVHhCdXN5OjE7CQkvL1VTQiBETUEgVFggRlNNIGJ1c3kgLiBkZWJ1ZyBvbmx5Ci0JICAgIFVJTlQzMiAgUnhCdXN5OjE7ICAgICAgICAvL1VTQiBETUEgUlggRlNNIGJ1c3kgLiBkZWJ1ZyBvbmx5Ci0JICAgIFVJTlQzMiAgRXBvdXRWYWxpZDo2OyAgICAgICAgLy9PVVQgZW5kcG9pbnQgZGF0YSB2YWxpZC4gZGVidWcgb25seQotCSAgICBVSU5UMzIgIFR4QnVsa0VuOjE7ICAgICAgICAvL0VuYWJsZSBVU0IgRE1BIFR4Ci0JICAgIFVJTlQzMiAgUnhCdWxrRW46MTsgICAgICAgIC8vRW5hYmxlIFVTQiBETUEgUngKLQkgICAgVUlOVDMyICBSeEJ1bGtBZ2dFbjoxOyAgICAgICAgLy9FbmFibGUgUnggQnVsayBBZ2dyZWdhdGlvbgotCSAgICBVSU5UMzIgIFR4b3BIYWx0OjE7ICAgICAgICAvL0hhbHQgVFhPUCBjb3VudCBkb3duIHdoZW4gVFggYnVmZmVyIGlzIGZ1bGwuCi0JICAgIFVJTlQzMiAgVHhDbGVhcjoxOyAgICAgICAgLy9DbGVhciBVU0IgRE1BIFRYIHBhdGgKLQkgICAgVUlOVDMyICByc3Y6MjsKLQkgICAgVUlOVDMyICBwaHljbGVhcjoxOwkJCS8vcGh5IHdhdGNoIGRvZyBlbmFibGUuIHdyaXRlIDEKLQkgICAgVUlOVDMyICBSeEJ1bGtBZ2dMbXQ6ODsgICAgICAgIC8vUnggQnVsayBBZ2dyZWdhdGlvbiBMaW1pdCAgaW4gdW5pdCBvZiAxMDI0IGJ5dGVzCi0JICAgIFVJTlQzMiAgUnhCdWxrQWdnVE91dDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIFRpbWVPdXQgIGluIHVuaXQgb2YgMzNucwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVVNCX0RNQV9DRkdfU1RSVUMsICpQVVNCX0RNQV9DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfVVNCX0RNQV9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgUnhCdWxrQWdnVE91dDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIFRpbWVPdXQgIGluIHVuaXQgb2YgMzNucwotCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ0xtdDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIExpbWl0ICBpbiB1bml0IG9mIDI1NiBieXRlcwotCSAgICBVSU5UMzIgIHBoeWNsZWFyOjE7CQkJLy9waHkgd2F0Y2ggZG9nIGVuYWJsZS4gd3JpdGUgMQotCSAgICBVSU5UMzIgIHJzdjoyOwotCSAgICBVSU5UMzIgIFR4Q2xlYXI6MTsgICAgICAgIC8vQ2xlYXIgVVNCIERNQSBUWCBwYXRoCi0JICAgIFVJTlQzMiAgVHhvcEhhbHQ6MTsgICAgICAgIC8vSGFsdCBUWE9QIGNvdW50IGRvd24gd2hlbiBUWCBidWZmZXIgaXMgZnVsbC4KLQkgICAgVUlOVDMyICBSeEJ1bGtBZ2dFbjoxOyAgICAgICAgLy9FbmFibGUgUnggQnVsayBBZ2dyZWdhdGlvbgotCSAgICBVSU5UMzIgIFJ4QnVsa0VuOjE7ICAgICAgICAvL0VuYWJsZSBVU0IgRE1BIFJ4Ci0JICAgIFVJTlQzMiAgVHhCdWxrRW46MTsgICAgICAgIC8vRW5hYmxlIFVTQiBETUEgVHgKLQkgICAgVUlOVDMyICBFcG91dFZhbGlkOjY7ICAgICAgICAvL09VVCBlbmRwb2ludCBkYXRhIHZhbGlkCi0JICAgIFVJTlQzMiAgUnhCdXN5OjE7ICAgICAgICAvL1VTQiBETUEgUlggRlNNIGJ1c3kKLQkgICAgVUlOVDMyICBUeEJ1c3k6MTsJCS8vVVNCIERNQSBUWCBGU00gYnVzeQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVVNCX0RNQV9DRkdfU1RSVUMsICpQVVNCX0RNQV9DRkdfU1RSVUM7Ci0jZW5kaWYKLQotCi0vLwotLy8gIDMgIFBCRiAgcmVnaXN0ZXJzCi0vLwotLy8KLS8vIE1vc3QgYXJlIGZvciBkZWJ1Zy4gRHJpdmVyIGRvZXNuJ3QgdG91Y2ggUEJGIHJlZ2lzdGVyLgotI2RlZmluZSBQQkZfU1lTX0NUUkwJIDB4MDQwMAotI2RlZmluZSBQQkZfQ0ZHICAgICAgICAgICAgICAgICAweDA0MDgKLSNkZWZpbmUgUEJGX01BWF9QQ05UCSAweDA0MEMKLSNkZWZpbmUgUEJGX0NUUkwJCTB4MDQxMAotI2RlZmluZSBQQkZfSU5UX1NUQQkgMHgwNDE0Ci0jZGVmaW5lIFBCRl9JTlRfRU5BCSAweDA0MTgKLSNkZWZpbmUgVFhSWFFfUENOVAkgMHgwNDM4Ci0jZGVmaW5lIFBCRl9EQkcJCQkgMHgwNDNjCi0jZGVmaW5lIFBCRl9DQVBfQ1RSTCAgICAgMHgwNDQwCi0KLSNpZmRlZiBSVDMweHgKLSNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKLS8vIGVGdXNlIHJlZ2lzdGVycwotI2RlZmluZSBFRlVTRV9DVFJMCQkJCTB4MDU4MAotI2RlZmluZSBFRlVTRV9EQVRBMAkJCQkweDA1OTAKLSNkZWZpbmUgRUZVU0VfREFUQTEJCQkJMHgwNTk0Ci0jZGVmaW5lIEVGVVNFX0RBVEEyCQkJCTB4MDU5OAotI2RlZmluZSBFRlVTRV9EQVRBMwkJCQkweDA1OWMKLSNlbmRpZiAvLyBSVE1QX0VGVVNFX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBSVDMweHggLy8KLQotI2RlZmluZSBPU0NfQ1RSTAkJMHg1YTQKLSNkZWZpbmUgUENJRV9QSFlfVFhfQVRURU5VQVRJT05fQ1RSTAkweDA1QzgKLSNkZWZpbmUgTERPX0NGRzAJCQkJMHgwNWQ0Ci0jZGVmaW5lIEdQSU9fU1dJVENICQkJCTB4MDVkYwotCi0KLS8vCi0vLyAgNCAgTUFDICByZWdpc3RlcnMKLS8vCi0vLwotLy8gIDQuMSBNQUMgU1lTVEVNICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTAwMCkKLS8vCi0jZGVmaW5lIE1BQ19DU1IwICAgICAgICAgICAgMHgxMDAwCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfQVNJQ19WRVJfSURfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQVNJQ1ZlcjsgICAgICAgIC8vIHZlcnNpb24gOiAyODYwCi0JICAgIFVTSE9SVCAgQVNJQ1JldjsgICAgICAgIC8vIHJldmVyc2lvbiAgOiAwCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlBU0lDX1ZFUl9JRF9TVFJVQywgKlBBU0lDX1ZFUl9JRF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9BU0lDX1ZFUl9JRF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBU0lDUmV2OyAgICAgICAgLy8gcmV2ZXJzaW9uICA6IDAKLQkgICAgVVNIT1JUICBBU0lDVmVyOyAgICAgICAgLy8gdmVyc2lvbiA6IDI4NjAKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUFTSUNfVkVSX0lEX1NUUlVDLCAqUEFTSUNfVkVSX0lEX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIE1BQ19TWVNfQ1RSTCAgICAgICAgICAgIDB4MTAwNAkJLy9NQUNfQ1NSMQotI2RlZmluZSBNQUNfQUREUl9EVzAJCQkJMHgxMDA4CQkvLyBNQUMgQUREUiBEVzAKLSNkZWZpbmUgTUFDX0FERFJfRFcxCQkJIDB4MTAwYwkJLy8gTUFDIEFERFIgRFcxCi0vLwotLy8gTUFDX0NTUjI6IFNUQSBNQUMgcmVnaXN0ZXIgMAotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9NQUNfRFcwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJQnl0ZTM7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDMKLQkJVUNIQVIJCUJ5dGUyOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAyCi0JCVVDSEFSCQlCeXRlMTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMQotCQlVQ0hBUgkJQnl0ZTA7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDAKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU1BQ19EVzBfU1RSVUMsICpQTUFDX0RXMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9NQUNfRFcwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJQnl0ZTA7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDAKLQkJVUNIQVIJCUJ5dGUxOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAxCi0JCVVDSEFSCQlCeXRlMjsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMgotCQlVQ0hBUgkJQnl0ZTM7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDMKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU1BQ19EVzBfU1RSVUMsICpQTUFDX0RXMF9TVFJVQzsKLSNlbmRpZgotCi0vLwotLy8gTUFDX0NTUjM6IFNUQSBNQUMgcmVnaXN0ZXIgMQotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9NQUNfRFcxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJUnN2ZDE7Ci0JCVVDSEFSCQlVMk1lTWFzazsKLQkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1Ci0JCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTUFDX0RXMV9TVFJVQywgKlBNQUNfRFcxX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX01BQ19EVzFfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAotCQlVQ0hBUgkJQnl0ZTU7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDUKLQkJVUNIQVIJCVUyTWVNYXNrOwotCQlVQ0hBUgkJUnN2ZDE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlNQUNfRFcxX1NUUlVDLCAqUE1BQ19EVzFfU1RSVUM7Ci0jZW5kaWYKLQotI2RlZmluZSBNQUNfQlNTSURfRFcwCQkJCTB4MTAxMAkJLy8gTUFDIEJTU0lEIERXMAotI2RlZmluZSBNQUNfQlNTSURfRFcxCQkJCTB4MTAxNAkJLy8gTUFDIEJTU0lEIERXMQotCi0vLwotLy8gTUFDX0NTUjU6IEJTU0lEIHJlZ2lzdGVyIDEKLS8vCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfTUFDX0NTUjVfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVTSE9SVAkJUnN2ZDoxMTsKLQkJVVNIT1JUCQlNQnNzQmNuTnVtOjM7Ci0JCVVTSE9SVAkJQnNzSWRNb2RlOjI7IC8vIDA6IG9uZSBCU1NJRCwgMTA6IDQgQlNTSUQsICAwMTogMiBCU1NJRCAsIDExOiA4QlNTSUQKLQkJVUNIQVIJCUJ5dGU1OwkJIC8vIEJTU0lEIGJ5dGUgNQotCQlVQ0hBUgkJQnl0ZTQ7CQkgLy8gQlNTSUQgYnl0ZSA0Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlNQUNfQ1NSNV9TVFJVQywgKlBNQUNfQ1NSNV9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9NQUNfQ1NSNV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJCUJ5dGU0OwkJIC8vIEJTU0lEIGJ5dGUgNAotCQlVQ0hBUgkJQnl0ZTU7CQkgLy8gQlNTSUQgYnl0ZSA1Ci0JCVVTSE9SVAkJQnNzSWRNYXNrOjI7IC8vIDA6IG9uZSBCU1NJRCwgMTA6IDQgQlNTSUQsICAwMTogMiBCU1NJRCAsIDExOiA4QlNTSUQKLQkJVVNIT1JUCQlNQnNzQmNuTnVtOjM7Ci0JCVVTSE9SVAkJUnN2ZDoxMTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU1BQ19DU1I1X1NUUlVDLCAqUE1BQ19DU1I1X1NUUlVDOwotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX0xFTl9DRkcgICAgICAgICAgICAgIDB4MTAxOAkJLy8gcnQyODYwYiBtYXggMTZrIGJ5dGVzLiBiaXQxMjoxMyBNYXhpbXVtIFBTRFUgbGVuZ3RoIChwb3dlciBmYWN0b3IpIDA6Ml4xMywgMToyXjE0LCAyOjJeMTUsIDM6Ml4xNgotI2RlZmluZSBCQlBfQ1NSX0NGRwkJCTB4MTAxYwkJLy8KLS8vCi0vLyBCQlBfQ1NSX0NGRzogQkJQIHNlcmlhbCBjb250cm9sIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0JCUF9DU1JfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCToxMjsKLQkJVUlOVDMyCQlCQlBfUldfTU9ERToxOwkJLy8gMDogdXNlIHNlcmlhbCBtb2RlICAxOnBhcmFsbGVsCi0JCVVJTlQzMgkJQkJQX1BBUl9EVVI6MTsJCSAgICAvLyAwOiA0IE1BQyBjbG9jayBjeWNsZXMgIDE6IDggTUFDIGNsb2NrIGN5Y2xlcwotCQlVSU5UMzIJCUJ1c3k6MTsJCQkJLy8gMTogQVNJQyBpcyBidXN5IGV4ZWN1dGUgQkJQIHByb2dyYW1taW5nLgotCQlVSU5UMzIJCWZSZWFkOjE7CQkgICAgLy8gMDogV3JpdGUJQkJQLCAxOglSZWFkIEJCUAotCQlVSU5UMzIJCVJlZ051bTo4OwkJCS8vIFNlbGVjdGVkCUJCUAlyZWdpc3RlcgotCQlVSU5UMzIJCVZhbHVlOjg7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQkJQX0NTUl9DRkdfU1RSVUMsICpQQkJQX0NTUl9DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfQkJQX0NTUl9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJVmFsdWU6ODsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCi0JCVVJTlQzMgkJUmVnTnVtOjg7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCi0JCVVJTlQzMgkJZlJlYWQ6MTsJCSAgICAvLyAwOiBXcml0ZQlCQlAsIDE6CVJlYWQgQkJQCi0JCVVJTlQzMgkJQnVzeToxOwkJCQkvLyAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBCQlAgcHJvZ3JhbW1pbmcuCi0JCVVJTlQzMgkJQkJQX1BBUl9EVVI6MTsJCSAgICAgLy8gMDogNCBNQUMgY2xvY2sgY3ljbGVzICAxOiA4IE1BQyBjbG9jayBjeWNsZXMKLQkJVUlOVDMyCQlCQlBfUldfTU9ERToxOwkJLy8gMDogdXNlIHNlcmlhbCBtb2RlICAxOnBhcmFsbGVsCi0JCVVJTlQzMgkJOjEyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQkJQX0NTUl9DRkdfU1RSVUMsICpQQkJQX0NTUl9DRkdfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgUkZfQ1NSX0NGRzAJCQkweDEwMjAKLS8vCi0vLyBSRl9DU1JfQ0ZHOiBSRiBjb250cm9sIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCUJ1c3k6MTsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5Ci0JCVVJTlQzMgkJU2VsOjE7CQkJCS8vIDA6UkZfTEUwIGFjdGl2YXRlICAxOlJGX0xFMSBhY3RpdmF0ZQotCQlVSU5UMzIJCVN0YW5kYnlNb2RlOjE7CQkgICAgLy8gMDogaGlnaCB3aGVuIHN0YW5kIGJ5IDE6CWxvdyB3aGVuIHN0YW5kYnkKLQkJVUlOVDMyCQliaXR3aWR0aDo1OwkJCS8vIFNlbGVjdGVkCUJCUAlyZWdpc3RlcgotCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlSRl9DU1JfQ0ZHMF9TVFJVQywgKlBSRl9DU1JfQ0ZHMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAotCQlVSU5UMzIJCWJpdHdpZHRoOjU7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCi0JCVVJTlQzMgkJU3RhbmRieU1vZGU6MTsJCSAgICAvLyAwOiBoaWdoIHdoZW4gc3RhbmQgYnkgMToJbG93IHdoZW4gc3RhbmRieQotCQlVSU5UMzIJCVNlbDoxOwkJCQkvLyAwOlJGX0xFMCBhY3RpdmF0ZSAgMTpSRl9MRTEgYWN0aXZhdGUKLQkJVUlOVDMyCQlCdXN5OjE7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUkZfQ1NSX0NGRzBfU1RSVUMsICpQUkZfQ1NSX0NGRzBfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgUkZfQ1NSX0NGRzEJCQkweDEwMjQKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlyc3Y6NzsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5Ci0JCVVJTlQzMgkJUkZHYXA6NTsJCQkvLyBHYXAgYmV0d2VlbiBCQl9DT05UUk9MX1JGIGFuZCBSRl9MRS4gMDogMyBzeXN0ZW0gY2xvY2sgY3ljbGUgKDM3LjV1c2VjKSAxOiA1IHN5c3RlbSBjbG9jayBjeWNsZSAoNjIuNXVzZWMpCi0JCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJGX0NTUl9DRkcxX1NUUlVDLCAqUFJGX0NTUl9DRkcxX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCi0JCVVJTlQzMgkJUkZHYXA6NTsJCQkvLyBHYXAgYmV0d2VlbiBCQl9DT05UUk9MX1JGIGFuZCBSRl9MRS4gMDogMyBzeXN0ZW0gY2xvY2sgY3ljbGUgKDM3LjV1c2VjKSAxOiA1IHN5c3RlbSBjbG9jayBjeWNsZSAoNjIuNXVzZWMpCi0JCVVJTlQzMgkJcnN2Ojc7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUkZfQ1NSX0NGRzFfU1RSVUMsICpQUkZfQ1NSX0NGRzFfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgUkZfQ1NSX0NGRzIJCQkweDEwMjgJCS8vCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzJfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJcnN2Ojg7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQotCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlSRl9DU1JfQ0ZHMl9TVFJVQywgKlBSRl9DU1JfQ0ZHMl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAotCQlVSU5UMzIJCXJzdjo4OwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJGX0NTUl9DRkcyX1NUUlVDLCAqUFJGX0NTUl9DRkcyX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIExFRF9DRkcJCQkJMHgxMDJjCQkvLyAgTUFDX0NTUjE0Ci0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfTEVEX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQk6MTsKLQkJVUlOVDMyCQlMZWRQb2xhcjoxOwkJCS8vIExlZCBQb2xhcml0eS4gIDA6IGFjdGl2ZSBsb3cxOiBhY3RpdmUgaGlnaAotCQlVSU5UMzIJCVlMZWRNb2RlOjI7CQkJLy8geWVsbG93IExlZCBNb2RlCi0JCVVJTlQzMgkJR0xlZE1vZGU6MjsJCQkvLyBncmVlbiBMZWQgTW9kZQotCQlVSU5UMzIJCVJMZWRNb2RlOjI7CQkJLy8gcmVkIExlZCBNb2RlICAgIDA6IG9mZjE6IGJsaW5raW5nIHVwb24gVFgyOiBwZXJpb2RpYyBzbG93IGJsaW5raW5nMzogYWx3YXlzIG9uCi0JCVVJTlQzMgkJcnN2OjI7Ci0JCVVJTlQzMgkJU2xvd0JsaW5rUGVyaW9kOjY7CQkJLy8gc2xvdyBibGlua2luZyBwZXJpb2QuIHVuaXQ6MW1zCi0JCVVJTlQzMgkJT2ZmUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb2ZmIHBlcmlvZCB1bml0IDFtcwotCQlVSU5UMzIJCU9uUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb24gcGVyaW9kIHVuaXQgMW1zCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlMRURfQ0ZHX1NUUlVDLCAqUExFRF9DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfTEVEX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlPblBlcmlvZDo4OwkJCS8vIGJsaW5raW5nIG9uIHBlcmlvZCB1bml0IDFtcwotCQlVSU5UMzIJCU9mZlBlcmlvZDo4OwkJCS8vIGJsaW5raW5nIG9mZiBwZXJpb2QgdW5pdCAxbXMKLQkJVUlOVDMyCQlTbG93QmxpbmtQZXJpb2Q6NjsJCQkvLyBzbG93IGJsaW5raW5nIHBlcmlvZC4gdW5pdDoxbXMKLQkJVUlOVDMyCQlyc3Y6MjsKLQkJVUlOVDMyCQlSTGVkTW9kZToyOwkJCS8vIHJlZCBMZWQgTW9kZSAgICAwOiBvZmYxOiBibGlua2luZyB1cG9uIFRYMjogcGVyaW9kaWMgc2xvdyBibGlua2luZzM6IGFsd2F5cyBvbgotCQlVSU5UMzIJCUdMZWRNb2RlOjI7CQkJLy8gZ3JlZW4gTGVkIE1vZGUKLQkJVUlOVDMyCQlZTGVkTW9kZToyOwkJCS8vIHllbGxvdyBMZWQgTW9kZQotCQlVSU5UMzIJCUxlZFBvbGFyOjE7CQkJLy8gTGVkIFBvbGFyaXR5LiAgMDogYWN0aXZlIGxvdzE6IGFjdGl2ZSBoaWdoCi0JCVVJTlQzMgkJOjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlMRURfQ0ZHX1NUUlVDLCAqUExFRF9DRkdfU1RSVUM7Ci0jZW5kaWYKLS8vCi0vLyAgNC4yIE1BQyBUSU1JTkcgIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMTAwKQotLy8KLSNkZWZpbmUgWElGU19USU1FX0NGRyAgICAgICAgICAgICAweDExMDAJCSAvLyBNQUNfQ1NSOCAgTUFDX0NTUjkKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9JRlNfU0xPVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgcnN2OjI7Ci0JICAgIFVJTlQzMiAgQkJSeGVuZEVuYWJsZToxOyAgICAgICAgLy8gIHJlZmVyZW5jZSBSWEVORCBzaWduYWwgdG8gYmVnaW4gWElGUyBkZWZlcgotCSAgICBVSU5UMzIgIEVJRlM6OTsgICAgICAgIC8vICB1bml0IDF1cwotCSAgICBVSU5UMzIgIE9mZG1YaWZzVGltZTo0OyAgICAgICAgLy9PRkRNIFNJRlMuIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlggd2hlbiBNQUMgZG9lc24ndCByZWZlcmVuY2UgQkJQIHNpZ25hbCBCQlJYRU5ECi0JICAgIFVJTlQzMiAgT2ZkbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWC9UWAotCSAgICBVSU5UMzIgIENja21TaWZzVGltZTo4OyAgICAgICAgLy8gIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIENDSyBSWC9UWAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JSUZTX1NMT1RfQ0ZHX1NUUlVDLCAqUElGU19TTE9UX0NGR19TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9JRlNfU0xPVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgQ2NrbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgQ0NLIFJYL1RYCi0JICAgIFVJTlQzMiAgT2ZkbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWC9UWAotCSAgICBVSU5UMzIgIE9mZG1YaWZzVGltZTo0OyAgICAgICAgLy9PRkRNIFNJRlMuIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlggd2hlbiBNQUMgZG9lc24ndCByZWZlcmVuY2UgQkJQIHNpZ25hbCBCQlJYRU5ECi0JICAgIFVJTlQzMiAgRUlGUzo5OyAgICAgICAgLy8gIHVuaXQgMXVzCi0JICAgIFVJTlQzMiAgQkJSeGVuZEVuYWJsZToxOyAgICAgICAgLy8gIHJlZmVyZW5jZSBSWEVORCBzaWduYWwgdG8gYmVnaW4gWElGUyBkZWZlcgotCSAgICBVSU5UMzIgIHJzdjoyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JSUZTX1NMT1RfQ0ZHX1NUUlVDLCAqUElGU19TTE9UX0NGR19TVFJVQzsKLSNlbmRpZgotCi0jZGVmaW5lIEJLT0ZGX1NMT1RfQ0ZHICAgICAgICAgICAgIDB4MTEwNAkJIC8vICBtYWNfY3NyOSBsYXN0IDggYml0cwotI2RlZmluZSBOQVZfVElNRV9DRkcgICAgICAgICAgICAgMHgxMTA4CQkgLy8gTkFWICAoTUFDX0NTUjE1KQotI2RlZmluZSBDSF9USU1FX0NGRyAgICAgICAgICAgICAweDExMEMJCQkvLyBDb3VudCBhcyBjaGFubmVsIGJ1c3kKLSNkZWZpbmUgUEJGX0xJRkVfVElNRVIgICAgICAgICAgICAgMHgxMTEwCQkgLy9UWC9SWCBNUERVIHRpbWVzdGFtcCB0aW1lciAoZnJlZSBydW4pVW5pdDogMXVzCi0jZGVmaW5lIEJDTl9USU1FX0NGRyAgICAgICAgICAgICAweDExMTQJCSAvLyBUWFJYX0NTUjkKLQotI2RlZmluZSBCQ05fT0ZGU0VUMAkJCQkweDA0MkMKLSNkZWZpbmUgQkNOX09GRlNFVDEJCQkJMHgwNDMwCi0KLS8vCi0vLyBCQ05fVElNRV9DRkcgOiBTeW5jaHJvbml6YXRpb24gY29udHJvbCByZWdpc3RlcgotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9CQ05fVElNRV9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJVHhUaW1lc3RhbXBDb21wZW5zYXRlOjg7Ci0gICAgICAgIFVJTlQzMiAgICAgICA6MzsKLQkJVUlOVDMyCQliQmVhY29uR2VuOjE7CQkvLyBFbmFibGUgYmVhY29uIGdlbmVyYXRvcgotICAgICAgICBVSU5UMzIgICAgICAgYlRCVFRFbmFibGU6MTsKLQkJVUlOVDMyCQlUc2ZTeW5jTW9kZToyOwkJLy8gRW5hYmxlIFRTRiBzeW5jLCAwMDogZGlzYWJsZSwgMDE6IGluZnJhIG1vZGUsIDEwOiBhZC1ob2MgbW9kZQotCQlVSU5UMzIJCWJUc2ZUaWNraW5nOjE7CQkvLyBFbmFibGUgVFNGIGF1dG8gY291bnRpbmcKLQkJVUlOVDMyICAgICAgIEJlYWNvbkludGVydmFsOjE2OyAgLy8gaW4gdW5pdCBvZiAxLzE2IFRVCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlCQ05fVElNRV9DRkdfU1RSVUMsICpQQkNOX1RJTUVfQ0ZHX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0JDTl9USU1FX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyICAgICAgIEJlYWNvbkludGVydmFsOjE2OyAgLy8gaW4gdW5pdCBvZiAxLzE2IFRVCi0JCVVJTlQzMgkJYlRzZlRpY2tpbmc6MTsJCS8vIEVuYWJsZSBUU0YgYXV0byBjb3VudGluZwotCQlVSU5UMzIJCVRzZlN5bmNNb2RlOjI7CQkvLyBFbmFibGUgVFNGIHN5bmMsIDAwOiBkaXNhYmxlLCAwMTogaW5mcmEgbW9kZSwgMTA6IGFkLWhvYyBtb2RlCi0gICAgICAgIFVJTlQzMiAgICAgICBiVEJUVEVuYWJsZToxOwotCQlVSU5UMzIJCWJCZWFjb25HZW46MTsJCS8vIEVuYWJsZSBiZWFjb24gZ2VuZXJhdG9yCi0gICAgICAgIFVJTlQzMiAgICAgICA6MzsKLQkJVUlOVDMyCQlUeFRpbWVzdGFtcENvbXBlbnNhdGU6ODsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUJDTl9USU1FX0NGR19TVFJVQywgKlBCQ05fVElNRV9DRkdfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgVEJUVF9TWU5DX0NGRyAgICAgICAgICAgIDB4MTExOAkJCS8vIHR4cnhfY3NyMTAKLSNkZWZpbmUgVFNGX1RJTUVSX0RXMCAgICAgICAgICAgICAweDExMUMJCS8vIExvY2FsIFRTRiB0aW1lciBsc2IgMzIgYml0cy4gUmVhZC1vbmx5Ci0jZGVmaW5lIFRTRl9USU1FUl9EVzEgICAgICAgICAgICAgMHgxMTIwCQkvLyBtc2IgMzIgYml0cy4gUmVhZC1vbmx5LgotI2RlZmluZSBUQlRUX1RJTUVSCQkweDExMjQJCQkvLyBUSW1lciByZW1haW5zIHRpbGwgbmV4dCBUQlRULiBSZWFkLW9ubHkuICBUWFJYX0NTUjE0Ci0jZGVmaW5lIElOVF9USU1FUl9DRkcJCQkweDExMjgJCQkvLwotI2RlZmluZSBJTlRfVElNRVJfRU4JCQkweDExMmMJCQkvLyAgR1AtdGltZXIgYW5kIHByZS10YnR0IEludCBlbmFibGUKLSNkZWZpbmUgQ0hfSURMRV9TVEEJCQkweDExMzAJCQkvLyAgY2hhbm5lbCBpZGxlIHRpbWUKLSNkZWZpbmUgQ0hfQlVTWV9TVEEJCQkweDExMzQJCQkvLyAgY2hhbm5sZSBidXN5IHRpbWUKLS8vCi0vLyAgNC4yIE1BQyBQT1dFUiAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDEyMDApCi0vLwotI2RlZmluZSBNQUNfU1RBVFVTX0NGRyAgICAgICAgICAgICAweDEyMDAJCSAvLyBvbGQgTUFDX0NTUjEyCi0jZGVmaW5lIFBXUl9QSU5fQ0ZHICAgICAgICAgICAgIDB4MTIwNAkJIC8vIG9sZCBNQUNfQ1NSMTIKLSNkZWZpbmUgQVVUT19XQUtFVVBfQ0ZHICAgICAgICAgICAgIDB4MTIwOAkJIC8vIG9sZCBNQUNfQ1NSMTAKLS8vCi0vLyBBVVRPX1dBS0VVUF9DRkc6IE1hbnVhbCBwb3dlciBjb250cm9sIC8gc3RhdHVzIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0FVVE9fV0FLRVVQX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCToxNjsKLQkJVUlOVDMyCQlFbmFibGVBdXRvV2FrZXVwOjE7CS8vIDA6c2xlZXAsIDE6YXdha2UKLQkJVUlOVDMyICAgICAgIE51bW9mU2xlZXBpbmdUYnR0Ojc7ICAgICAgICAgIC8vIEZvcmNlV2FrZSBoYXMgaGlnaCBwcml2aWxlZ2UgdGhhbiBQdXRUb1NsZWVwIHdoZW4gYm90aCBzZXQKLQkJVUlOVDMyICAgICAgIEF1dG9MZWFkVGltZTo4OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQVVUT19XQUtFVVBfU1RSVUMsICpQQVVUT19XQUtFVVBfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfQVVUT19XQUtFVVBfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMiAgICAgICBBdXRvTGVhZFRpbWU6ODsKLQkJVUlOVDMyICAgICAgIE51bW9mU2xlZXBpbmdUYnR0Ojc7ICAgICAgICAgIC8vIEZvcmNlV2FrZSBoYXMgaGlnaCBwcml2aWxlZ2UgdGhhbiBQdXRUb1NsZWVwIHdoZW4gYm90aCBzZXQKLQkJVUlOVDMyCQlFbmFibGVBdXRvV2FrZXVwOjE7CS8vIDA6c2xlZXAsIDE6YXdha2UKLQkJVUlOVDMyCQk6MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlBVVRPX1dBS0VVUF9TVFJVQywgKlBBVVRPX1dBS0VVUF9TVFJVQzsKLSNlbmRpZgotLy8KLS8vICA0LjMgTUFDIFRYICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTMwMCkKLS8vCi0KLSNkZWZpbmUgRURDQV9BQzBfQ0ZHCTB4MTMwMAkJLy9BQ19UWE9QX0NTUjAgMHgzNDc0Ci0jZGVmaW5lIEVEQ0FfQUMxX0NGRwkweDEzMDQKLSNkZWZpbmUgRURDQV9BQzJfQ0ZHCTB4MTMwOAotI2RlZmluZSBFRENBX0FDM19DRkcJMHgxMzBjCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfRURDQV9BQ19DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgOjEyOyAgICAgICAgLy8KLQkgICAgVUlOVDMyICBDd21heDo0OyAgICAgICAgLy91bml0IHBvd2VyIG9mIDIKLQkgICAgVUlOVDMyICBDd21pbjo0OyAgICAgICAgLy8KLQkgICAgVUlOVDMyICBBaWZzbjo0OyAgICAgICAgLy8gIyBvZiBzbG90IHRpbWUKLQkgICAgVUlOVDMyICBBY1R4b3A6ODsgICAgICAgIC8vICBpbiB1bml0IG9mIDMydXMKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUVEQ0FfQUNfQ0ZHX1NUUlVDLCAqUEVEQ0FfQUNfQ0ZHX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0VEQ0FfQUNfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgIEFjVHhvcDo4OyAgICAgICAgLy8gIGluIHVuaXQgb2YgMzJ1cwotCSAgICBVSU5UMzIgIEFpZnNuOjQ7ICAgICAgICAvLyAjIG9mIHNsb3QgdGltZQotCSAgICBVSU5UMzIgIEN3bWluOjQ7ICAgICAgICAvLwotCSAgICBVSU5UMzIgIEN3bWF4OjQ7ICAgICAgICAvL3VuaXQgcG93ZXIgb2YgMgotCSAgICBVSU5UMzIgIDoxMjsgICAgICAgLy8KLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUVEQ0FfQUNfQ0ZHX1NUUlVDLCAqUEVEQ0FfQUNfQ0ZHX1NUUlVDOwotI2VuZGlmCi0KLSNkZWZpbmUgRURDQV9USURfQUNfTUFQCTB4MTMxMAotI2RlZmluZSBUWF9QV1JfQ0ZHXzAJMHgxMzE0Ci0jZGVmaW5lIFRYX1BXUl9DRkdfMQkweDEzMTgKLSNkZWZpbmUgVFhfUFdSX0NGR18yCTB4MTMxQwotI2RlZmluZSBUWF9QV1JfQ0ZHXzMJMHgxMzIwCi0jZGVmaW5lIFRYX1BXUl9DRkdfNAkweDEzMjQKLSNkZWZpbmUgVFhfUElOX0NGRwkJMHgxMzI4Ci0jZGVmaW5lIFRYX0JBTkRfQ0ZHCTB4MTMyYwkJLy8gMHgxIHVzZSB1cHBlciAyME1Iei4gMCBqdXNlIGxvd2VyIDIwTUh6Ci0jZGVmaW5lIFRYX1NXX0NGRzAJCTB4MTMzMAotI2RlZmluZSBUWF9TV19DRkcxCQkweDEzMzQKLSNkZWZpbmUgVFhfU1dfQ0ZHMgkJMHgxMzM4Ci0jZGVmaW5lIFRYT1BfVEhSRVNfQ0ZHCQkweDEzM2MKLSNkZWZpbmUgVFhPUF9DVFJMX0NGRwkJMHgxMzQwCi0jZGVmaW5lIFRYX1JUU19DRkcJCTB4MTM0NAotCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfVFhfUlRTX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgICAgIHJzdjo3OwotCSAgICBVSU5UMzIgICAgICAgUnRzRmJrRW46MTsgICAgLy8gZW5hYmxlIHJ0cyByYXRlIGZhbGxiYWNrCi0JICAgIFVJTlQzMiAgICAgICBSdHNUaHJlczoxNjsgICAgLy8gdW5pdDpieXRlCi0JICAgIFVJTlQzMiAgICAgICBBdXRvUnRzUmV0cnlMaW1pdDo4OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfUlRTX0NGR19TVFJVQywgKlBUWF9SVFNfQ0ZHX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX1JUU19DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBBdXRvUnRzUmV0cnlMaW1pdDo4OwotCSAgICBVSU5UMzIgICAgICAgUnRzVGhyZXM6MTY7ICAgIC8vIHVuaXQ6Ynl0ZQotCSAgICBVSU5UMzIgICAgICAgUnRzRmJrRW46MTsgICAgLy8gZW5hYmxlIHJ0cyByYXRlIGZhbGxiYWNrCi0JICAgIFVJTlQzMiAgICAgICByc3Y6NzsgICAgIC8vIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9SVFNfQ0ZHX1NUUlVDLCAqUFRYX1JUU19DRkdfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgVFhfVElNRU9VVF9DRkcJMHgxMzQ4Ci0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfVFhfVElNRU9VVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICByc3YyOjg7Ci0JICAgIFVJTlQzMiAgICAgICBUeG9wVGltZW91dDo4OwkvL1RYT1AgdGltZW91dCB2YWx1ZSBmb3IgVFhPUCB0cnVuY2F0aW9uLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAoU0xPVF9USU1FKSA+IChUWF9PUF9USU1FT1VUKSA+IChSWF9BQ0tfVElNRU9VVCkKLQkgICAgVUlOVDMyICAgICAgIFJ4QWNrVGltZW91dDo4OwkvLyB1bml0OnNsb3QuIFVzZWQgZm9yIFRYIHByZWNlZHVyZQotCSAgICBVSU5UMzIgICAgICAgTXBkdUxpZmVUaW1lOjQ7ICAgIC8vICBleHBpcmF0aW9uIHRpbWUgPSAyXig5K01QRFUgTElGRSBUSU1FKSAgdXMKLQkgICAgVUlOVDMyICAgICAgIHJzdjo0OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfVElNRU9VVF9DRkdfU1RSVUMsICpQVFhfVElNRU9VVF9DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfVFhfVElNRU9VVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICByc3Y6NDsKLQkgICAgVUlOVDMyICAgICAgIE1wZHVMaWZlVGltZTo0OyAgICAvLyAgZXhwaXJhdGlvbiB0aW1lID0gMl4oOStNUERVIExJRkUgVElNRSkgIHVzCi0JICAgIFVJTlQzMiAgICAgICBSeEFja1RpbWVvdXQ6ODsJLy8gdW5pdDpzbG90LiBVc2VkIGZvciBUWCBwcmVjZWR1cmUKLQkgICAgVUlOVDMyICAgICAgIFR4b3BUaW1lb3V0Ojg7CS8vVFhPUCB0aW1lb3V0IHZhbHVlIGZvciBUWE9QIHRydW5jYXRpb24uICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IChTTE9UX1RJTUUpID4gKFRYX09QX1RJTUVPVVQpID4gKFJYX0FDS19USU1FT1VUKQotCSAgICBVSU5UMzIgICAgICAgcnN2Mjo4OyAgICAgLy8gMTogSFQgbm9uLVNUQkMgY29udHJvbCBmcmFtZSBlbmFibGUKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX1RJTUVPVVRfQ0ZHX1NUUlVDLCAqUFRYX1RJTUVPVVRfQ0ZHX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIFRYX1JUWV9DRkcJMHgxMzRjCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1JUWV9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICByc3Y6MTsKLQkgICAgVUlOVDMyICAgICAgIFR4YXV0b0ZCRW5hYmxlOjE7ICAgIC8vIFR4IHJldHJ5IFBIWSByYXRlIGF1dG8gZmFsbGJhY2sgZW5hYmxlCi0JICAgIFVJTlQzMiAgICAgICBBZ2dSdHlNb2RlOjE7CS8vIEFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCi0JICAgIFVJTlQzMiAgICAgICBOb25BZ2dSdHlNb2RlOjE7CS8vIE5vbi1BZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lcgotCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eVRocmU6MTI7CS8vIExvbmcgcmV0cnkgdGhyZXNob29sZAotCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eUxpbWl0Ojg7CS8vbG9uZyByZXRyeSBsaW1pdAotCSAgICBVSU5UMzIgICAgICAgU2hvcnRSdHlMaW1pdDo4OwkvLyAgc2hvcnQgcmV0cnkgbGltaXQKLQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfUlRZX0NGR19TVFJVQywgKlBUWF9SVFlfQ0ZHX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24gUEFDS0VEIF9UWF9SVFlfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgU2hvcnRSdHlMaW1pdDo4OwkvLyAgc2hvcnQgcmV0cnkgbGltaXQKLQkgICAgVUlOVDMyICAgICAgIExvbmdSdHlMaW1pdDo4OwkvL2xvbmcgcmV0cnkgbGltaXQKLQkgICAgVUlOVDMyICAgICAgIExvbmdSdHlUaHJlOjEyOwkvLyBMb25nIHJldHJ5IHRocmVzaG9vbGQKLQkgICAgVUlOVDMyICAgICAgIE5vbkFnZ1J0eU1vZGU6MTsJLy8gTm9uLUFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCi0JICAgIFVJTlQzMiAgICAgICBBZ2dSdHlNb2RlOjE7CS8vIEFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCi0JICAgIFVJTlQzMiAgICAgICBUeGF1dG9GQkVuYWJsZToxOyAgICAvLyBUeCByZXRyeSBQSFkgcmF0ZSBhdXRvIGZhbGxiYWNrIGVuYWJsZQotCSAgICBVSU5UMzIgICAgICAgcnN2OjE7ICAgICAvLyAxOiBIVCBub24tU1RCQyBjb250cm9sIGZyYW1lIGVuYWJsZQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfUlRZX0NGR19TVFJVQywgKlBUWF9SVFlfQ0ZHX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIFRYX0xJTktfQ0ZHCTB4MTM1MAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JUEFDS0VEIF9UWF9MSU5LX0NGR19TVFJVQwl7Ci0Jc3RydWN0IFBBQ0tFRCB7Ci0JICAgIFVJTlQzMiAgICAgICBSZW1vdE1GUzo4OwkvL3JlbW90ZSBNQ1MgZmVlZGJhY2sgc2VxdWVuY2UgbnVtYmVyCi0JICAgIFVJTlQzMiAgICAgICBSZW1vdE1GQjo4OyAgICAvLyAgcmVtb3RlIE1DUyBmZWVkYmFjawotCSAgICBVSU5UMzIgICAgICAgcnN2OjM7CS8vCi0JICAgIFVJTlQzMiAgICAgICBUeENGQWNrRW46MTsJLy8gICBQaWdneWJhY2sgQ0YtQUNLIGVuYWJsZQotCSAgICBVSU5UMzIgICAgICAgVHhSREdFbjoxOwkvLyBSREcgVFggZW5hYmxlCi0JICAgIFVJTlQzMiAgICAgICBUeE1SUUVuOjE7CS8vICBNQ1MgcmVxdWVzdCBUWCBlbmFibGUKLQkgICAgVUlOVDMyICAgICAgIFJlbW90ZVVNRlNFbmFibGU6MTsJLy8gIHJlbW90ZSB1bnNvbGljaXQgIE1GQiBlbmFibGUuICAwOiBub3QgYXBwbHkgcmVtb3RlIHJlbW90ZSB1bnNvbGljaXQgKE1GUz03KQotCSAgICBVSU5UMzIgICAgICAgTUZCRW5hYmxlOjE7CS8vICBUWCBhcHBseSByZW1vdGUgTUZCIDE6ZW5hYmxlCi0JICAgIFVJTlQzMiAgICAgICBSZW1vdGVNRkJMaWZlVGltZTo4OwkvL3JlbW90ZSBNRkIgbGlmZSB0aW1lLiB1bml0IDogMzJ1cwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfTElOS19DRkdfU1RSVUMsICpQVFhfTElOS19DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglQQUNLRUQgX1RYX0xJTktfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QgUEFDS0VEIHsKLQkgICAgVUlOVDMyICAgICAgIFJlbW90ZU1GQkxpZmVUaW1lOjg7CS8vcmVtb3RlIE1GQiBsaWZlIHRpbWUuIHVuaXQgOiAzMnVzCi0JICAgIFVJTlQzMiAgICAgICBNRkJFbmFibGU6MTsJLy8gIFRYIGFwcGx5IHJlbW90ZSBNRkIgMTplbmFibGUKLQkgICAgVUlOVDMyICAgICAgIFJlbW90ZVVNRlNFbmFibGU6MTsJLy8gIHJlbW90ZSB1bnNvbGljaXQgIE1GQiBlbmFibGUuICAwOiBub3QgYXBwbHkgcmVtb3RlIHJlbW90ZSB1bnNvbGljaXQgKE1GUz03KQotCSAgICBVSU5UMzIgICAgICAgVHhNUlFFbjoxOwkvLyAgTUNTIHJlcXVlc3QgVFggZW5hYmxlCi0JICAgIFVJTlQzMiAgICAgICBUeFJER0VuOjE7CS8vIFJERyBUWCBlbmFibGUKLQkgICAgVUlOVDMyICAgICAgIFR4Q0ZBY2tFbjoxOwkvLyAgIFBpZ2d5YmFjayBDRi1BQ0sgZW5hYmxlCi0JICAgIFVJTlQzMiAgICAgICByc3Y6MzsJLy8KLQkgICAgVUlOVDMyICAgICAgIFJlbW90TUZCOjg7ICAgIC8vICByZW1vdGUgTUNTIGZlZWRiYWNrCi0JICAgIFVJTlQzMiAgICAgICBSZW1vdE1GUzo4OwkvL3JlbW90ZSBNQ1MgZmVlZGJhY2sgc2VxdWVuY2UgbnVtYmVyCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9MSU5LX0NGR19TVFJVQywgKlBUWF9MSU5LX0NGR19TVFJVQzsKLSNlbmRpZgotI2RlZmluZSBIVF9GQktfQ0ZHMAkweDEzNTQKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uIFBBQ0tFRCBfSFRfRkJLX0NGRzBfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzdGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTNkZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1M1RkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzRGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTM0ZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MyRkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzFGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMEZCSzo0OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JSFRfRkJLX0NGRzBfU1RSVUMsICpQSFRfRkJLX0NGRzBfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbiBQQUNLRUQgX0hUX0ZCS19DRkcwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MwRkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzFGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMkZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MzRkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzRGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTNUZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1M2RkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzdGQks6NDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUhUX0ZCS19DRkcwX1NUUlVDLCAqUEhUX0ZCS19DRkcwX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIEhUX0ZCS19DRkcxCTB4MTM1OAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0hUX0ZCS19DRkcxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNUZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNEZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxM0ZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMkZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMUZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMEZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1M5RkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzhGQks6NDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUhUX0ZCS19DRkcxX1NUUlVDLCAqUEhUX0ZCS19DRkcxX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0hUX0ZCS19DRkcxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgSFRNQ1M4RkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzlGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTBGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTFGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTJGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTNGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTRGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTVGQks6NDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUhUX0ZCS19DRkcxX1NUUlVDLCAqUEhUX0ZCS19DRkcxX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIExHX0ZCS19DRkcwCTB4MTM1YwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0xHX0ZCS19DRkcwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzdGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDYKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M2RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA1Ci0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNAotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzRGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDMKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCi0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMQotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzFGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlMR19GQktfQ0ZHMF9TVFJVQywgKlBMR19GQktfQ0ZHMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9MR19GQktfQ0ZHMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCi0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzJGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDEKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCi0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMwotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzVGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDQKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M2RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA1Ci0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTN0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNgotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTEdfRkJLX0NGRzBfU1RSVUMsICpQTEdfRkJLX0NGRzBfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgTEdfRkJLX0NGRzEJCTB4MTM2MAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0xHX0ZCS19DRkcxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgcnN2OjE2OwotCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTM0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMgotCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMQotCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAotCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTEdfRkJLX0NGRzFfU1RSVUMsICpQTEdfRkJLX0NGRzFfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfTEdfRkJLX0NGRzFfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCi0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MxRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCi0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MyRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAxCi0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCi0JICAgIFVJTlQzMiAgICAgICByc3Y6MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlMR19GQktfQ0ZHMV9TVFJVQywgKlBMR19GQktfQ0ZHMV9TVFJVQzsKLSNlbmRpZgotCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy89PT09PT09PT09PT09PT09IFByb3RlY3Rpb24gUGFyYW1hdGVyPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2RlZmluZSBDQ0tfUFJPVF9DRkcJMHgxMzY0CQkvL0NDSyBQcm90ZWN0aW9uCi0jZGVmaW5lIEFTSUNfU0hPUlROQVYJCTEKLSNkZWZpbmUgQVNJQ19MT05HTkFWCQkyCi0jZGVmaW5lIEFTSUNfUlRTCQkxCi0jZGVmaW5lIEFTSUNfQ1RTCQkyCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfUFJPVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICByc3Y6NTsKLQkgICAgVUlOVDMyICAgICAgIFJUU1RoRW46MTsJLy9SVFMgdGhyZXNob2xkIGVuYWJsZSBvbiBDQ0sgVFgKLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuIDA6ZGlzYWxsb3cuCi0JICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dPZmRtOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCi0JICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dDY2s6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFByb3RlY3ROYXY6MjsJLy9UWE9QIHByb3RlY3Rpb24gdHlwZSBmb3IgQ0NLIFRYLiAwOk5vbmUsIDE6U2hvcnROQVZwcm90ZWN0LCAgMjpMb25nTkFWUHJvdGVjdCwgMzpyc3YKLQkgICAgVUlOVDMyICAgICAgIFByb3RlY3RDdHJsOjI7CS8vUHJvdGVjdGlvbiBjb250cm9sIGZyYW1lIHR5cGUgZm9yIENDSyBUWC4gMTpSVFMvQ1RTLCAyOkNUUy10by1zZWxmLCAwOk5vbmUsIDM6cnN2Ci0JICAgIFVJTlQzMiAgICAgICBQcm90ZWN0UmF0ZToxNjsJLy9Qcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgcmF0ZSBmb3IgQ0NLIFRYKFJUUy9DVFMvQ0ZFbmQpLgotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUFJPVF9DRkdfU1RSVUMsICpQUFJPVF9DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfUFJPVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBQcm90ZWN0UmF0ZToxNjsJLy9Qcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgcmF0ZSBmb3IgQ0NLIFRYKFJUUy9DVFMvQ0ZFbmQpLgotCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdEN0cmw6MjsJLy9Qcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgdHlwZSBmb3IgQ0NLIFRYLiAxOlJUUy9DVFMsIDI6Q1RTLXRvLXNlbGYsIDA6Tm9uZSwgMzpyc3YKLQkgICAgVUlOVDMyICAgICAgIFByb3RlY3ROYXY6MjsJLy9UWE9QIHByb3RlY3Rpb24gdHlwZSBmb3IgQ0NLIFRYLiAwOk5vbmUsIDE6U2hvcnROQVZwcm90ZWN0LCAgMjpMb25nTkFWUHJvdGVjdCwgMzpyc3YKLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0NjazoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgotCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93T2ZkbToxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgotCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93TU0yMDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4gMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFJUU1RoRW46MTsJLy9SVFMgdGhyZXNob2xkIGVuYWJsZSBvbiBDQ0sgVFgKLQkgICAgVUlOVDMyICAgICAgIHJzdjo1OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUFJPVF9DRkdfU1RSVUMsICpQUFJPVF9DRkdfU1RSVUM7Ci0jZW5kaWYKLQotI2RlZmluZSBPRkRNX1BST1RfQ0ZHCTB4MTM2OAkJLy9PRkRNIFByb3RlY3Rpb24KLSNkZWZpbmUgTU0yMF9QUk9UX0NGRwkweDEzNkMJCS8vTU0yMCBQcm90ZWN0aW9uCi0jZGVmaW5lIE1NNDBfUFJPVF9DRkcJMHgxMzcwCQkvL01NNDAgUHJvdGVjdGlvbgotI2RlZmluZSBHRjIwX1BST1RfQ0ZHCTB4MTM3NAkJLy9HRjIwIFByb3RlY3Rpb24KLSNkZWZpbmUgR0Y0MF9QUk9UX0NGRwkweDEzNzgJCS8vR1I0MCBQcm90ZWN0aW9uCi0jZGVmaW5lIEVYUF9DVFNfVElNRQkweDEzN0MJCS8vCi0jZGVmaW5lIEVYUF9BQ0tfVElNRQkweDEzODAJCS8vCi0KLS8vCi0vLyAgNC40IE1BQyBSWCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTQwMCkKLS8vCi0jZGVmaW5lIFJYX0ZJTFRSX0NGRwkweDE0MDAJCQkvL1RYUlhfQ1NSMAotI2RlZmluZSBBVVRPX1JTUF9DRkcJMHgxNDA0CQkJLy9UWFJYX0NTUjQKLS8vCi0vLyBUWFJYX0NTUjQ6IEF1dG8tUmVzcG9uZGVyLwotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmIHVuaW9uIF9BVVRPX1JTUF9DRkdfU1RSVUMgewotIHN0cnVjdCB7Ci0gICAgIFVJTlQzMiAgICAgICAgOjI0OwotICAgICBVSU5UMzIgICAgICAgQWNrQ3RzUHNtQml0OjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCi0gICAgIFVJTlQzMiAgICAgICBEdWFsQ1RTRW46MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKLSAgICAgVUlOVDMyICAgICAgIHJzdjoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQotICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlclByZWFtYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQotICAgICBVSU5UMzIgICAgICAgQ1RTNDBNUmVmOjE7ICAvLyBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUKLSAgICAgVUlOVDMyICAgICAgIENUUzQwTU1vZGU6MTsgIC8vIFJlc3BvbnNlIENUUyA0ME1IeiBkdXBsaWNhdGUgbW9kZQotICAgICBVSU5UMzIgICAgICAgQkFDQWNrUG9saWN5RW5hYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQotICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlckVuYWJsZToxOwotIH0gZmllbGQ7Ci0gVUlOVDMyICAgd29yZDsKLX0gQVVUT19SU1BfQ0ZHX1NUUlVDLCAqUEFVVE9fUlNQX0NGR19TVFJVQzsKLSNlbHNlCi10eXBlZGVmIHVuaW9uIF9BVVRPX1JTUF9DRkdfU1RSVUMgewotIHN0cnVjdCB7Ci0gICAgIFVJTlQzMiAgICAgICBBdXRvUmVzcG9uZGVyRW5hYmxlOjE7Ci0gICAgIFVJTlQzMiAgICAgICBCQUNBY2tQb2xpY3lFbmFibGU6MTsgICAgLy8gMDpsb25nLCAxOnNob3J0IHByZWFtYmxlCi0gICAgIFVJTlQzMiAgICAgICBDVFM0ME1Nb2RlOjE7ICAvLyBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUKLSAgICAgVUlOVDMyICAgICAgIENUUzQwTVJlZjoxOyAgLy8gUmVzcG9uc2UgQ1RTIDQwTUh6IGR1cGxpY2F0ZSBtb2RlCi0gICAgIFVJTlQzMiAgICAgICBBdXRvUmVzcG9uZGVyUHJlYW1ibGU6MTsgICAgLy8gMDpsb25nLCAxOnNob3J0IHByZWFtYmxlCi0gICAgIFVJTlQzMiAgICAgICByc3Y6MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKLSAgICAgVUlOVDMyICAgICAgIER1YWxDVFNFbjoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQotICAgICBVSU5UMzIgICAgICAgQWNrQ3RzUHNtQml0OjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCi0gICAgIFVJTlQzMiAgICAgICAgOjI0OwotIH0gZmllbGQ7Ci0gVUlOVDMyICAgd29yZDsKLX0gQVVUT19SU1BfQ0ZHX1NUUlVDLCAqUEFVVE9fUlNQX0NGR19TVFJVQzsKLSNlbmRpZgotCi0jZGVmaW5lIExFR0FDWV9CQVNJQ19SQVRFCTB4MTQwOAkvLyAgVFhSWF9DU1I1ICAgICAgICAgICAweDMwNTQKLSNkZWZpbmUgSFRfQkFTSUNfUkFURQkJMHgxNDBjCi0jZGVmaW5lIEhUX0NUUkxfQ0ZHCQkweDE0MTAKLSNkZWZpbmUgU0lGU19DT1NUX0NGRwkJMHgxNDE0Ci0jZGVmaW5lIFJYX1BBUlNFUl9DRkcJCTB4MTQxOAkvL1NldCBOQVYgZm9yIGFsbCByZWNlaXZlZCBmcmFtZXMKLQotLy8KLS8vICA0LjUgTUFDIFNlY3VyaXR5IGNvbmZpZ3VyYXRpb24gKG9mZnNldDoweDE1MDApCi0vLwotI2RlZmluZSBUWF9TRUNfQ05UMAkJMHgxNTAwCQkvLwotI2RlZmluZSBSWF9TRUNfQ05UMAkJMHgxNTA0CQkvLwotI2RlZmluZSBDQ01QX0ZDX01VVEUJCTB4MTUwOAkJLy8KLS8vCi0vLyAgNC42IEhDQ0EvUFNNUCAob2Zmc2V0OjB4MTYwMCkKLS8vCi0jZGVmaW5lIFRYT1BfSExEUl9BRERSMAkJMHgxNjAwCi0jZGVmaW5lIFRYT1BfSExEUl9BRERSMQkJMHgxNjA0Ci0jZGVmaW5lIFRYT1BfSExEUl9FVAkJMHgxNjA4Ci0jZGVmaW5lIFFPU19DRlBPTExfUkFfRFcwCQkweDE2MGMKLSNkZWZpbmUgUU9TX0NGUE9MTF9BMV9EVzEJCTB4MTYxMAotI2RlZmluZSBRT1NfQ0ZQT0xMX1FDCQkweDE2MTQKLS8vCi0vLyAgNC43IE1BQyBTdGF0aXN0aXMgcmVnaXN0ZXJzIChvZmZzZXQ6MHgxNzAwKQotLy8KLSNkZWZpbmUgUlhfU1RBX0NOVDAJCTB4MTcwMAkJLy8KLSNkZWZpbmUgUlhfU1RBX0NOVDEJCTB4MTcwNAkJLy8KLSNkZWZpbmUgUlhfU1RBX0NOVDIJCTB4MTcwOAkJLy8KLQotLy8KLS8vIFJYX1NUQV9DTlQwX1NUUlVDOiBSWCBQTENQIGVycm9yIGNvdW50ICYgUlggQ1JDIGVycm9yIGNvdW50Ci0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFBoeUVycjsKLQkgICAgVVNIT1JUICBDcmNFcnI7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlSWF9TVEFfQ05UMF9TVFJVQywgKlBSWF9TVEFfQ05UMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBDcmNFcnI7Ci0JICAgIFVTSE9SVCAgUGh5RXJyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUlhfU1RBX0NOVDBfU1RSVUMsICpQUlhfU1RBX0NOVDBfU1RSVUM7Ci0jZW5kaWYKLQotLy8KLS8vIFJYX1NUQV9DTlQxX1NUUlVDOiBSWCBGYWxzZSBDQ0EgY291bnQgJiBSWCBMT05HIGZyYW1lIGNvdW50Ci0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFBsY3BFcnI7Ci0JICAgIFVTSE9SVCAgRmFsc2VDY2E7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlSWF9TVEFfQ05UMV9TVFJVQywgKlBSWF9TVEFfQ05UMV9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBGYWxzZUNjYTsKLQkgICAgVVNIT1JUICBQbGNwRXJyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUlhfU1RBX0NOVDFfU1RSVUMsICpQUlhfU1RBX0NOVDFfU1RSVUM7Ci0jZW5kaWYKLQotLy8KLS8vIFJYX1NUQV9DTlQyX1NUUlVDOgotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBSeEZpZm9PdmVyZmxvd0NvdW50OwotCSAgICBVU0hPUlQgIFJ4RHVwbGlDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJYX1NUQV9DTlQyX1NUUlVDLCAqUFJYX1NUQV9DTlQyX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQyX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFJ4RHVwbGlDb3VudDsKLQkgICAgVVNIT1JUICBSeEZpZm9PdmVyZmxvd0NvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUlhfU1RBX0NOVDJfU1RSVUMsICpQUlhfU1RBX0NOVDJfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgVFhfU1RBX0NOVDAJCTB4MTcwQwkJLy8KLS8vCi0vLyBTVEFfQ1NSMzogVFggQmVhY29uIGNvdW50Ci0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFR4QmVhY29uQ291bnQ7Ci0JICAgIFVTSE9SVCAgVHhGYWlsQ291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9TVEFfQ05UMF9TVFJVQywgKlBUWF9TVEFfQ05UMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBUeEZhaWxDb3VudDsKLQkgICAgVVNIT1JUICBUeEJlYWNvbkNvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfU1RBX0NOVDBfU1RSVUMsICpQVFhfU1RBX0NOVDBfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgVFhfU1RBX0NOVDEJCTB4MTcxMAkJLy8KLS8vCi0vLyBUWF9TVEFfQ05UMTogVFggdHggY291bnQKLS8vCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDFfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgVHhSZXRyYW5zbWl0OwotCSAgICBVU0hPUlQgIFR4U3VjY2VzczsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX1NUQV9DTlQxX1NUUlVDLCAqUFRYX1NUQV9DTlQxX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFR4U3VjY2VzczsKLQkgICAgVVNIT1JUICBUeFJldHJhbnNtaXQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9TVEFfQ05UMV9TVFJVQywgKlBUWF9TVEFfQ05UMV9TVFJVQzsKLSNlbmRpZgotI2RlZmluZSBUWF9TVEFfQ05UMgkJMHgxNzE0CQkvLwotLy8KLS8vIFRYX1NUQV9DTlQyOiBUWCB0eCBjb3VudAotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBUeFVuZGVyRmxvd0NvdW50OwotCSAgICBVU0hPUlQgIFR4WmVyb0xlbkNvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfU1RBX0NOVDJfU1RSVUMsICpQVFhfU1RBX0NOVDJfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDJfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgVHhaZXJvTGVuQ291bnQ7Ci0JICAgIFVTSE9SVCAgVHhVbmRlckZsb3dDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX1NUQV9DTlQyX1NUUlVDLCAqUFRYX1NUQV9DTlQyX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIFRYX1NUQV9GSUZPCQkweDE3MTgJCS8vCi0vLwotLy8gVFhfU1RBX0ZJRk9fU1RSVUM6IFRYIFJlc3VsdCBmb3Igc3BlY2lmaWMgUElEIHN0YXR1cyBmaWZvIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24gUEFDS0VEIF9UWF9TVEFfRklGT19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSZXNlcnZlOjI7Ci0JCVVJTlQzMgkJVHhCRjoxOyAvLyAzKjMKLQkJVUlOVDMyCQlTdWNjZXNzUmF0ZToxMzsJLy9pbmNsdWRlIE1DUywgbW9kZSAsc2hvcnRHSSwgQlcgc2V0dGluZ1NhbWUgZm9ybWF0IGFzIFRYV0kgV29yZCAwIEJpdCAzMS0xNi4KLS8vCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjE2OwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgotCQlVSU5UMzIJCXdjaWQ6ODsJCS8vd2lyZWxlc3MgY2xpZW50IGluZGV4Ci0JCVVJTlQzMgkJVHhBY2tSZXF1aXJlZDoxOyAgICAvLyBhY2sgcmVxdWlyZWQKLQkJVUlOVDMyCQlUeEFnZ3JlOjE7ICAgIC8vIFR4IGlzIGFnZ3JlZ2F0ZWQKLQkJVUlOVDMyCQlUeFN1Y2Nlc3M6MTsgICAvLyBUeCBzdWNjZXNzLiB3aGV0aGVyIHN1Y2Nlc3Mgb3Igbm90Ci0JCVVJTlQzMgkJUGlkVHlwZTo0OwotCQlVSU5UMzIJCWJWYWxpZDoxOyAgIC8vIDE6VGhpcyByZWdpc3RlciBjb250YWlucyBhIHZhbGlkIFRYIHJlc3VsdAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfU1RBX0ZJRk9fU1RSVUMsICpQVFhfU1RBX0ZJRk9fU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1NUQV9GSUZPX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCWJWYWxpZDoxOyAgIC8vIDE6VGhpcyByZWdpc3RlciBjb250YWlucyBhIHZhbGlkIFRYIHJlc3VsdAotCQlVSU5UMzIJCVBpZFR5cGU6NDsKLQkJVUlOVDMyCQlUeFN1Y2Nlc3M6MTsgICAvLyBUeCBObyByZXRyeSBzdWNjZXNzCi0JCVVJTlQzMgkJVHhBZ2dyZToxOyAgICAvLyBUeCBSZXRyeSBTdWNjZXNzCi0JCVVJTlQzMgkJVHhBY2tSZXF1aXJlZDoxOyAgICAvLyBUeCBmYWlsCi0JCVVJTlQzMgkJd2NpZDo4OwkJLy93aXJlbGVzcyBjbGllbnQgaW5kZXgKLS8vCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjE2OwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgotCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjEzOwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgotCQlVSU5UMzIJCVR4QkY6MTsKLQkJVUlOVDMyCQlSZXNlcnZlOjI7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9TVEFfRklGT19TVFJVQywgKlBUWF9TVEFfRklGT19TVFJVQzsKLSNlbmRpZgotLy8gRGVidWcgY291bnRlcgotI2RlZmluZSBUWF9BR0dfQ05UCTB4MTcxYwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlRfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWdnVHhDb3VudDsKLQkgICAgVVNIT1JUICBOb25BZ2dUeENvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVF9TVFJVQywgKlBUWF9BR0dfQ05UX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlRfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgTm9uQWdnVHhDb3VudDsKLQkgICAgVVNIT1JUICBBZ2dUeENvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVF9TVFJVQywgKlBUWF9BR0dfQ05UX1NUUlVDOwotI2VuZGlmCi0vLyBEZWJ1ZyBjb3VudGVyCi0jZGVmaW5lIFRYX0FHR19DTlQwCTB4MTcyMAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUyQ291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTFDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQwX1NUUlVDLCAqUFRYX0FHR19DTlQwX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUxQ291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTJDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQwX1NUUlVDLCAqUFRYX0FHR19DTlQwX1NUUlVDOwotI2VuZGlmCi0vLyBEZWJ1ZyBjb3VudGVyCi0jZGVmaW5lIFRYX0FHR19DTlQxCTB4MTcyNAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemU0Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTNDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQxX1NUUlVDLCAqUFRYX0FHR19DTlQxX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUzQ291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTRDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQxX1NUUlVDLCAqUFRYX0FHR19DTlQxX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIFRYX0FHR19DTlQyCTB4MTcyOAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQyX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemU2Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTVDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQyX1NUUlVDLCAqUFRYX0FHR19DTlQyX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQyX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemU1Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTZDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQyX1NUUlVDLCAqUFRYX0FHR19DTlQyX1NUUlVDOwotI2VuZGlmCi0vLyBEZWJ1ZyBjb3VudGVyCi0jZGVmaW5lIFRYX0FHR19DTlQzCTB4MTcyYwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQzX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemU4Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTdDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQzX1NUUlVDLCAqUFRYX0FHR19DTlQzX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQzX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemU3Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZThDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQzX1NUUlVDLCAqUFRYX0FHR19DTlQzX1NUUlVDOwotI2VuZGlmCi0vLyBEZWJ1ZyBjb3VudGVyCi0jZGVmaW5lIFRYX0FHR19DTlQ0CTB4MTczMAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ0X1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUxMENvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemU5Q291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UNF9TVFJVQywgKlBUWF9BR0dfQ05UNF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBZ2dTaXplOUNvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemUxMENvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVDRfU1RSVUMsICpQVFhfQUdHX0NOVDRfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgVFhfQUdHX0NOVDUJMHgxNzM0Ci0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDVfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTEyQ291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTExQ291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UNV9TVFJVQywgKlBUWF9BR0dfQ05UNV9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBZ2dTaXplMTFDb3VudDsKLQkgICAgVVNIT1JUICBBZ2dTaXplMTJDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQ1X1NUUlVDLCAqUFRYX0FHR19DTlQ1X1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIFRYX0FHR19DTlQ2CQkweDE3MzgKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBZ2dTaXplMTRDb3VudDsKLQkgICAgVVNIT1JUICBBZ2dTaXplMTNDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQ2X1NUUlVDLCAqUFRYX0FHR19DTlQ2X1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ2X1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUxM0NvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemUxNENvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVDZfU1RSVUMsICpQVFhfQUdHX0NOVDZfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgVFhfQUdHX0NOVDcJCTB4MTczYwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ3X1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUxNkNvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemUxNUNvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVDdfU1RSVUMsICpQVFhfQUdHX0NOVDdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTE1Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTE2Q291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UN19TVFJVQywgKlBUWF9BR0dfQ05UN19TVFJVQzsKLSNlbmRpZgotI2RlZmluZSBNUERVX0RFTlNJVFlfQ05UCQkweDE3NDAKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9NUERVX0RFTl9DTlRfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgUlhaZXJvRGVsQ291bnQ7CS8vUlggemVybyBsZW5ndGggZGVsaW1pdGVyIGNvdW50Ci0JICAgIFVTSE9SVCAgVFhaZXJvRGVsQ291bnQ7CS8vVFggemVybyBsZW5ndGggZGVsaW1pdGVyIGNvdW50Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlNUERVX0RFTl9DTlRfU1RSVUMsICpQTVBEVV9ERU5fQ05UX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX01QRFVfREVOX0NOVF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBUWFplcm9EZWxDb3VudDsJLy9UWCB6ZXJvIGxlbmd0aCBkZWxpbWl0ZXIgY291bnQKLQkgICAgVVNIT1JUICBSWFplcm9EZWxDb3VudDsJLy9SWCB6ZXJvIGxlbmd0aCBkZWxpbWl0ZXIgY291bnQKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU1QRFVfREVOX0NOVF9TVFJVQywgKlBNUERVX0RFTl9DTlRfU1RSVUM7Ci0jZW5kaWYKLS8vCi0vLyBUWFJYIGNvbnRyb2wgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MzAwMAotLy8KLS8vIHJ0Mjg2MGIgIFVOS05PV04gcmVnIHVzZSBSL08gUmVnIEFkZHIgMHg3N2QwIGZpcnN0Li4KLSNkZWZpbmUgVFhSWF9DU1IxICAgICAgICAgICAweDc3ZDAKLQotLy8KLS8vIFNlY3VyaXR5IGtleSB0YWJsZSBtZW1vcnksIGJhc2UgYWRkcmVzcyA9IDB4MTAwMAotLy8KLSNkZWZpbmUgTUFDX1dDSURfQkFTRQkJMHgxODAwIC8vOC1ieXRlcyh1c2Ugb25seSA2LWJ5dGVzKSAqIDI1NiBlbnRyeSA9Ci0jZGVmaW5lIEhXX1dDSURfRU5UUllfU0laRSAgIDgKLSNkZWZpbmUgUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgICAgIDB4NDAwMCAgICAgIC8vIDMyLWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKLSNkZWZpbmUgSFdfS0VZX0VOVFJZX1NJWkUgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSAgICAgMHg2MDAwICAgICAgLy8gOC1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlCi0jZGVmaW5lIE1BQ19JVkVJVl9UQUJMRV9CQVNFICAgICAweDYwMDAgICAgICAvLyA4LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKLSNkZWZpbmUgSFdfSVZFSVZfRU5UUllfU0laRSAgIDgKLSNkZWZpbmUgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgICAgIDB4NjgwMCAgICAgIC8vIDQtYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZQotI2RlZmluZSBIV19XQ0lEX0FUVFJJX1NJWkUgICA0Ci0jZGVmaW5lIFdDSURfUkVTRVJWRUQJCQkweDZiZmMKLSNkZWZpbmUgU0hBUkVEX0tFWV9UQUJMRV9CQVNFICAgICAgIDB4NmMwMCAgICAgIC8vIDMyLWJ5dGUgKiAxNi1lbnRyeSA9IDUxMi1ieXRlCi0jZGVmaW5lIFNIQVJFRF9LRVlfTU9ERV9CQVNFICAgICAgIDB4NzAwMCAgICAgIC8vIDMyLWJ5dGUgKiAxNi1lbnRyeSA9IDUxMi1ieXRlCi0jZGVmaW5lIEhXX1NIQVJFRF9LRVlfTU9ERV9TSVpFICAgNAotI2RlZmluZSBTSEFSRURLRVlUQUJMRQkJCTAKLSNkZWZpbmUgUEFJUldJU0VLRVlUQUJMRQkJCTEKLQotCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfU0hBUkVES0VZX01PREVfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkzQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkyQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkxQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkwQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkzQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkyQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkxQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkwQ2lwaGVyQWxnOjM7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlTSEFSRURLRVlfTU9ERV9TVFJVQywgKlBTSEFSRURLRVlfTU9ERV9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9TSEFSRURLRVlfTU9ERV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkwQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkxQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkyQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkzQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkwQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkxQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkyQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkzQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVNIQVJFREtFWV9NT0RFX1NUUlVDLCAqUFNIQVJFREtFWV9NT0RFX1NUUlVDOwotI2VuZGlmCi0vLyA2NC1lbnRyeSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCi10eXBlZGVmIHN0cnVjdCBfSFdfV0NJRF9FTlRSWSB7ICAvLyA4LWJ5dGUgcGVyIGVudHJ5Ci0gICAgVUNIQVIgICBBZGRyZXNzWzZdOwotICAgIFVDSEFSICAgUnN2WzJdOwotfSBIV19XQ0lEX0VOVFJZLCBQSFdfV0NJRF9FTlRSWTsKLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFdDSUQgIGZvcm1hdAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLzcuMQlXQ0lEICBFTlRSWSAgZm9ybWF0ICA6IDhieXRlcwotdHlwZWRlZglzdHJ1Y3QJX1dDSURfRU5UUllfU1RSVUMgewotCVVDSEFSCQlSWEJBQml0bWFwNzsgICAgLy8gYml0MCBmb3IgVElEOCwgYml0NyBmb3IgVElEIDE1Ci0JVUNIQVIJCVJYQkFCaXRtYXAwOyAgICAvLyBiaXQwIGZvciBUSUQwLCBiaXQ3IGZvciBUSUQgNwotCVVDSEFSCQlNQUNbNl07CS8vIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUKLX0JV0NJRF9FTlRSWV9TVFJVQywgKlBXQ0lEX0VOVFJZX1NUUlVDOwotCi0vLzguMS4xCVNFQ1VSSVRZICBLRVkgIGZvcm1hdCAgOiA4RFcKLS8vIDMyLWJ5dGUgcGVyIGVudHJ5LCB0b3RhbCAxNi1lbnRyeSBmb3Igc2hhcmVkIGtleSB0YWJsZSwgNjQtZW50cnkgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZQotdHlwZWRlZiBzdHJ1Y3QgX0hXX0tFWV9FTlRSWSB7ICAgICAgICAgIC8vIDMyLWJ5dGUgcGVyIGVudHJ5Ci0gICAgVUNIQVIgICBLZXlbMTZdOwotICAgIFVDSEFSICAgVHhNaWNbOF07Ci0gICAgVUNIQVIgICBSeE1pY1s4XTsKLX0gSFdfS0VZX0VOVFJZLCAqUEhXX0tFWV9FTlRSWTsKLQotLy84LjEuMglJVi9FSVYgIGZvcm1hdCAgOiAyRFcKLQotLy84LjEuMwlSWCBhdHRyaWJ1dGUgZW50cnkgZm9ybWF0ICA6IDFEVwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJc3RydWN0CV9NQUNfQVRUUklCVVRFX1NUUlVDIHsKLQlVSU5UMzIJCXJzdjoyMjsKLQlVSU5UMzIJCVJYV0lVREY6MzsKLQlVSU5UMzIJCUJTU0lESWR4OjM7IC8vbXVsdGlwbGVCU1MgaW5kZXggZm9yIHRoZSBXQ0lECi0JVUlOVDMyCQlQYWlyS2V5TW9kZTozOwotCVVJTlQzMgkJS2V5VGFiOjE7CS8vIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUKLX0JTUFDX0FUVFJJQlVURV9TVFJVQywgKlBNQUNfQVRUUklCVVRFX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJc3RydWN0CV9NQUNfQVRUUklCVVRFX1NUUlVDIHsKLQlVSU5UMzIJCUtleVRhYjoxOwkvLyAwIGZvciBzaGFyZWQga2V5IHRhYmxlLiAgMSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCi0JVUlOVDMyCQlQYWlyS2V5TW9kZTozOwotCVVJTlQzMgkJQlNTSURJZHg6MzsgLy9tdWx0aXBsZUJTUyBpbmRleCBmb3IgdGhlIFdDSUQKLQlVSU5UMzIJCVJYV0lVREY6MzsKLQlVSU5UMzIJCXJzdjoyMjsKLX0JTUFDX0FUVFJJQlVURV9TVFJVQywgKlBNQUNfQVRUUklCVVRFX1NUUlVDOwotI2VuZGlmCi0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBIT1NULU1DVSBjb21tdW5pY2F0aW9uIGRhdGEgc3RydWN0dXJlCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8KLS8vIEgyTV9NQUlMQk9YX0NTUjogSG9zdC10by1NQ1UgTWFpbGJveAotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmIHVuaW9uICBfSDJNX01BSUxCT1hfU1RSVUMgewotICAgIHN0cnVjdCB7Ci0gICAgICAgIFVJTlQzMiAgICAgICBPd25lcjo4OwotICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW46ODsgICAgLy8gMHhmZiB0ZWxscyBNQ1Ugbm90IHRvIHJlcG9ydCBDbWREb25lSW50IGFmdGVyIGV4Y3V0aW5nIHRoZSBjb21tYW5kCi0gICAgICAgIFVJTlQzMiAgICAgICBIaWdoQnl0ZTo4OwotICAgICAgICBVSU5UMzIgICAgICAgTG93Qnl0ZTo4OwotICAgIH0gICBmaWVsZDsKLSAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Ci19IEgyTV9NQUlMQk9YX1NUUlVDLCAqUEgyTV9NQUlMQk9YX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYgdW5pb24gIF9IMk1fTUFJTEJPWF9TVFJVQyB7Ci0gICAgc3RydWN0IHsKLSAgICAgICAgVUlOVDMyICAgICAgIExvd0J5dGU6ODsKLSAgICAgICAgVUlOVDMyICAgICAgIEhpZ2hCeXRlOjg7Ci0gICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjo4OwotICAgICAgICBVSU5UMzIgICAgICAgT3duZXI6ODsKLSAgICB9ICAgZmllbGQ7Ci0gICAgVUlOVDMyICAgICAgICAgICB3b3JkOwotfSBIMk1fTUFJTEJPWF9TVFJVQywgKlBIMk1fTUFJTEJPWF9TVFJVQzsKLSNlbmRpZgotCi0vLwotLy8gTTJIX0NNRF9ET05FX0NTUjogTUNVLXRvLUhvc3QgY29tbWFuZCBjb21wbGV0ZSBpbmRpY2F0aW9uCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYgdW5pb24gX00ySF9DTURfRE9ORV9TVFJVQyB7Ci0gICAgc3RydWN0ICB7Ci0gICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjM7Ci0gICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjI7Ci0gICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjE7Ci0gICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjA7Ci0gICAgfSBmaWVsZDsKLSAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Ci19IE0ySF9DTURfRE9ORV9TVFJVQywgKlBNMkhfQ01EX0RPTkVfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZiB1bmlvbiBfTTJIX0NNRF9ET05FX1NUUlVDIHsKLSAgICBzdHJ1Y3QgIHsKLSAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMDsKLSAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMTsKLSAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMjsKLSAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMzsKLSAgICB9IGZpZWxkOwotICAgIFVJTlQzMiAgICAgICAgICAgd29yZDsKLX0gTTJIX0NNRF9ET05FX1NUUlVDLCAqUE0ySF9DTURfRE9ORV9TVFJVQzsKLSNlbmRpZgotCi0KLS8vTkFWX1RJTUVfQ0ZHIDpOQVYKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9OQVZfVElNRV9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVTSE9SVAkJcnN2OjY7Ci0JCVVTSE9SVAkJWmVyb1NpZnM6MTsgICAgICAgICAgICAgICAvLyBBcHBsaWVkIHplcm8gU0lGUyB0aW1lciBhZnRlciBPRkRNIFJYIDA6IGRpc2FibGUKLQkJVVNIT1JUCQlFaWZzOjk7ICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiAxLXVzCi0JCVVDSEFSICAgICAgIFNsb3RUaW1lOyAgICAvLyBpbiB1bml0IG9mIDEtdXMKLQkJVUNIQVIJCVNpZnM7ICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiAxLXVzCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlOQVZfVElNRV9DRkdfU1RSVUMsICpQTkFWX1RJTUVfQ0ZHX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX05BVl9USU1FX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJCVNpZnM7ICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiAxLXVzCi0JCVVDSEFSICAgICAgIFNsb3RUaW1lOyAgICAvLyBpbiB1bml0IG9mIDEtdXMKLQkJVVNIT1JUCQlFaWZzOjk7ICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiAxLXVzCi0JCVVTSE9SVAkJWmVyb1NpZnM6MTsgICAgICAgICAgICAgICAvLyBBcHBsaWVkIHplcm8gU0lGUyB0aW1lciBhZnRlciBPRkRNIFJYIDA6IGRpc2FibGUKLQkJVVNIT1JUCQlyc3Y6NjsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU5BVl9USU1FX0NGR19TVFJVQywgKlBOQVZfVElNRV9DRkdfU1RSVUM7Ci0jZW5kaWYKLQotCi0vLwotLy8gUlhfRklMVFJfQ0ZHOiAgL1JYIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKLS8vCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglSWF9GSUxUUl9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJOjE1OwotCQlVSU5UMzIgICAgICAgRHJvcFJzdkNudGxUeXBlOjE7Ci0KLQkJVUlOVDMyCQlEcm9wQkFSOjE7ICAgICAgIC8vCi0JCVVJTlQzMgkJRHJvcEJBOjE7CQkvLwotCQlVSU5UMzIJCURyb3BQc1BvbGw6MTsJCS8vIERyb3AgUHMtUG9sbAotCQlVSU5UMzIJCURyb3BSdHM6MTsJCS8vIERyb3AgUHMtUG9sbAotCi0JCVVJTlQzMgkJRHJvcEN0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0JCVVJTlQzMgkJRHJvcEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0JCVVJTlQzMgkJRHJvcENGRW5kOjE7CQkvLyBEcm9wIFBzLVBvbGwKLQkJVUlOVDMyCQlEcm9wQ0ZFbmRBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAotCi0JCVVJTlQzMgkJRHJvcER1cGxpY2F0ZToxOwkJLy8gRHJvcCBkdXBsaWNhdGUgZnJhbWUKLQkJVUlOVDMyCQlEcm9wQmNhc3Q6MTsJCS8vIERyb3AgYnJvYWRjYXN0IGZyYW1lcwotCQlVSU5UMzIJCURyb3BNY2FzdDoxOwkJLy8gRHJvcCBtdWx0aWNhc3QgZnJhbWVzCi0JCVVJTlQzMgkJRHJvcFZlckVycjoxOwkgICAgLy8gRHJvcCB2ZXJzaW9uIGVycm9yIGZyYW1lCi0KLQkJVUlOVDMyCQlEcm9wTm90TXlCU1NJRDoxOwkJCS8vIERyb3AgZnJhbSBUb0RzIGJpdCBpcyB0cnVlCi0JCVVJTlQzMgkJRHJvcE5vdFRvTWU6MTsJCS8vIERyb3Agbm90IHRvIG1lIHVuaWNhc3QgZnJhbWUKLQkJVUlOVDMyCQlEcm9wUGh5RXJyOjE7CQkvLyBEcm9wIHBoeXNpY2FsIGVycm9yCi0JCVVJTlQzMgkJRHJvcENSQ0VycjoxOwkJLy8gRHJvcCBDUkMgZXJyb3IKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJYX0ZJTFRSX0NGR19TVFJVQywgKlBSWF9GSUxUUl9DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfUlhfRklMVFJfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCURyb3BDUkNFcnI6MTsJCS8vIERyb3AgQ1JDIGVycm9yCi0JCVVJTlQzMgkJRHJvcFBoeUVycjoxOwkJLy8gRHJvcCBwaHlzaWNhbCBlcnJvcgotCQlVSU5UMzIJCURyb3BOb3RUb01lOjE7CQkvLyBEcm9wIG5vdCB0byBtZSB1bmljYXN0IGZyYW1lCi0JCVVJTlQzMgkJRHJvcE5vdE15QlNTSUQ6MTsJCQkvLyBEcm9wIGZyYW0gVG9EcyBiaXQgaXMgdHJ1ZQotCi0JCVVJTlQzMgkJRHJvcFZlckVycjoxOwkgICAgLy8gRHJvcCB2ZXJzaW9uIGVycm9yIGZyYW1lCi0JCVVJTlQzMgkJRHJvcE1jYXN0OjE7CQkvLyBEcm9wIG11bHRpY2FzdCBmcmFtZXMKLQkJVUlOVDMyCQlEcm9wQmNhc3Q6MTsJCS8vIERyb3AgYnJvYWRjYXN0IGZyYW1lcwotCQlVSU5UMzIJCURyb3BEdXBsaWNhdGU6MTsJCS8vIERyb3AgZHVwbGljYXRlIGZyYW1lCi0KLQkJVUlOVDMyCQlEcm9wQ0ZFbmRBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAotCQlVSU5UMzIJCURyb3BDRkVuZDoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0JCVVJTlQzMgkJRHJvcEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0JCVVJTlQzMgkJRHJvcEN0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0KLQkJVUlOVDMyCQlEcm9wUnRzOjE7CQkvLyBEcm9wIFBzLVBvbGwKLQkJVUlOVDMyCQlEcm9wUHNQb2xsOjE7CQkvLyBEcm9wIFBzLVBvbGwKLQkJVUlOVDMyCQlEcm9wQkE6MTsJCS8vCi0JCVVJTlQzMgkJRHJvcEJBUjoxOyAgICAgICAvLwotCi0JCVVJTlQzMgkJRHJvcFJzdkNudGxUeXBlOjE7Ci0JCVVJTlQzMgkJOjE1OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUlhfRklMVFJfQ0ZHX1NUUlVDLCAqUFJYX0ZJTFRSX0NGR19TVFJVQzsKLSNlbmRpZgotCi0KLQotCi0vLwotLy8gUEhZX0NTUjQ6IFJGIHNlcmlhbCBjb250cm9sIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1BIWV9DU1I0X1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCUJ1c3k6MTsJCQkJLy8gMTogQVNJQyBpcyBidXN5IGV4ZWN1dGUgUkYgcHJvZ3JhbW1pbmcuCi0JCVVJTlQzMgkJUExMX0xEOjE7CQkJLy8gUkYgUExMX0xEIHN0YXR1cwotCQlVSU5UMzIJCUlGU2VsZWN0OjE7CQkJLy8gMTogc2VsZWN0IElGCXRvIHByb2dyYW0sCTA6IHNlbGVjdCBSRiB0bwlwcm9ncmFtCi0JCVVJTlQzMgkJTnVtYmVyT2ZCaXRzOjU7CQkvLyBOdW1iZXIgb2YgYml0cyB1c2VkIGluIFJGUmVnVmFsdWUgKEk6MjAsCVJGTUQ6MjIpCi0JCVVJTlQzMgkJUkZSZWdWYWx1ZToyNDsJCS8vIFJlZ2lzdGVyCXZhbHVlIChpbmNsdWRlIHJlZ2lzdGVyCWlkKQlzZXJpYWwgb3V0IHRvIFJGL0lGCWNoaXAuCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlQSFlfQ1NSNF9TVFJVQywgKlBQSFlfQ1NSNF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9QSFlfQ1NSNF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSRlJlZ1ZhbHVlOjI0OwkJLy8gUmVnaXN0ZXIJdmFsdWUgKGluY2x1ZGUgcmVnaXN0ZXIJaWQpCXNlcmlhbCBvdXQgdG8gUkYvSUYJY2hpcC4KLQkJVUlOVDMyCQlOdW1iZXJPZkJpdHM6NTsJCS8vIE51bWJlciBvZiBiaXRzIHVzZWQgaW4gUkZSZWdWYWx1ZSAoSToyMCwJUkZNRDoyMikKLQkJVUlOVDMyCQlJRlNlbGVjdDoxOwkJCS8vIDE6IHNlbGVjdCBJRgl0byBwcm9ncmFtLAkwOiBzZWxlY3QgUkYgdG8JcHJvZ3JhbQotCQlVSU5UMzIJCVBMTF9MRDoxOwkJCS8vIFJGIFBMTF9MRCBzdGF0dXMKLQkJVUlOVDMyCQlCdXN5OjE7CQkJCS8vIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIFJGIHByb2dyYW1taW5nLgotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUEhZX0NTUjRfU1RSVUMsICpQUEhZX0NTUjRfU1RSVUM7Ci0jZW5kaWYKLQotCi0vLwotLy8gU0VDX0NTUjU6IHNoYXJlZCBrZXkgdGFibGUgc2VjdXJpdHkgbW9kZSByZWdpc3RlcgotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9TRUNfQ1NSNV9TVFJVQwl7Ci0Jc3RydWN0CXsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTNDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTJDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTFDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTBDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTNDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTJDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTFDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTBDaXBoZXJBbGc6MzsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVNFQ19DU1I1X1NUUlVDLCAqUFNFQ19DU1I1X1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1NFQ19DU1I1X1NUUlVDCXsKLQlzdHJ1Y3QJewotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTBDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTFDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTJDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTNDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTBDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTFDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTJDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTNDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JU0VDX0NTUjVfU1RSVUMsICpQU0VDX0NTUjVfU1RSVUM7Ci0jZW5kaWYKLQotCi0vLwotLy8gSE9TVF9DTURfQ1NSOiBGb3IgSE9TVCB0byBpbnRlcnJ1cHQgZW1iZWRkZWQgcHJvY2Vzc29yCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0hPU1RfQ01EX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgUnN2OjI0OwotCSAgICBVSU5UMzIgICBIb3N0Q29tbWFuZDo4OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JSE9TVF9DTURfQ1NSX1NUUlVDLCAqUEhPU1RfQ01EX0NTUl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9IT1NUX0NNRF9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgIEhvc3RDb21tYW5kOjg7Ci0JICAgIFVJTlQzMiAgIFJzdjoyNDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUhPU1RfQ01EX0NTUl9TVFJVQywgKlBIT1NUX0NNRF9DU1JfU1RSVUM7Ci0jZW5kaWYKLQotCi0vLwotLy8gQUlGU05fQ1NSOiBBSUZTTiBmb3IgZWFjaCBFRENBIEFDCi0vLwotCi0KLQotLy8KLS8vIEUyUFJPTV9DU1I6IEVFUFJPTSBjb250cm9sIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0UyUFJPTV9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJUnN2ZDoyNTsKLQkJVUlOVDMyICAgICAgIExvYWRTdGF0dXM6MTsgICAvLyAxOmxvYWRpbmcsIDA6ZG9uZQotCQlVSU5UMzIJCVR5cGU6MTsJCQkvLyAxOiA5M0M0NiwgMDo5M0M2NgotCQlVSU5UMzIJCUVlcHJvbURPOjE7Ci0JCVVJTlQzMgkJRWVwcm9tREk6MTsKLQkJVUlOVDMyCQlFZXByb21DUzoxOwotCQlVSU5UMzIJCUVlcHJvbVNLOjE7Ci0JCVVJTlQzMgkJUmVsb2FkOjE7CQkvLyBSZWxvYWQgRUVQUk9NIGNvbnRlbnQsIHdyaXRlIG9uZSB0byByZWxvYWQsIHNlbGYtY2xlYXJlZC4KLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUUyUFJPTV9DU1JfU1RSVUMsICpQRTJQUk9NX0NTUl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9FMlBST01fQ1NSX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJlbG9hZDoxOwkJLy8gUmVsb2FkIEVFUFJPTSBjb250ZW50LCB3cml0ZSBvbmUgdG8gcmVsb2FkLCBzZWxmLWNsZWFyZWQuCi0JCVVJTlQzMgkJRWVwcm9tU0s6MTsKLQkJVUlOVDMyCQlFZXByb21DUzoxOwotCQlVSU5UMzIJCUVlcHJvbURJOjE7Ci0JCVVJTlQzMgkJRWVwcm9tRE86MTsKLQkJVUlOVDMyCQlUeXBlOjE7CQkJLy8gMTogOTNDNDYsIDA6OTNDNjYKLQkJVUlOVDMyICAgICAgIExvYWRTdGF0dXM6MTsgICAvLyAxOmxvYWRpbmcsIDA6ZG9uZQotCQlVSU5UMzIJCVJzdmQ6MjU7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlFMlBST01fQ1NSX1NUUlVDLCAqUEUyUFJPTV9DU1JfU1RSVUM7Ci0jZW5kaWYKLQotLy8KLS8vIFFPU19DU1IwOiBUWE9QIGhvbGRlciBhZGRyZXNzMCByZWdpc3RlcgotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9RT1NfQ1NSMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJCUJ5dGUzOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAzCi0JCVVDSEFSCQlCeXRlMjsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMgotCQlVQ0hBUgkJQnl0ZTE7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDEKLQkJVUNIQVIJCUJ5dGUwOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAwCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlRT1NfQ1NSMF9TVFJVQywgKlBRT1NfQ1NSMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9RT1NfQ1NSMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJCUJ5dGUwOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAwCi0JCVVDSEFSCQlCeXRlMTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMQotCQlVQ0hBUgkJQnl0ZTI7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDIKLQkJVUNIQVIJCUJ5dGUzOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAzCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlRT1NfQ1NSMF9TVFJVQywgKlBRT1NfQ1NSMF9TVFJVQzsKLSNlbmRpZgotCi0vLwotLy8gUU9TX0NTUjE6IFRYT1AgaG9sZGVyIGFkZHJlc3MxIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1FPU19DU1IxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJUnN2ZDE7Ci0JCVVDSEFSCQlSc3ZkMDsKLQkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1Ci0JCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUU9TX0NTUjFfU1RSVUMsICpQUU9TX0NTUjFfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfUU9TX0NTUjFfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAotCQlVQ0hBUgkJQnl0ZTU7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDUKLQkJVUNIQVIJCVJzdmQwOwotCQlVQ0hBUgkJUnN2ZDE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlRT1NfQ1NSMV9TVFJVQywgKlBRT1NfQ1NSMV9TVFJVQzsKLSNlbmRpZgotCi0jZGVmaW5lCVJGX0NTUl9DRkcJMHg1MDAKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UCVJzdmQxOjE0OwkJCQkvLyBSZXNlcnZlZAotCQlVSU5UCVJGX0NTUl9LSUNLOjE7CQkJLy8ga2ljayBSRiByZWdpc3RlciByZWFkL3dyaXRlCi0JCVVJTlQJUkZfQ1NSX1dSOjE7CQkJLy8gMDogcmVhZCAgMTogd3JpdGUKLQkJVUlOVAlSc3ZkMjozOwkJCQkvLyBSZXNlcnZlZAotCQlVSU5UCVRFU1RDU1JfUkZBQ0NfUkVHTlVNOjU7CS8vIFJGIHJlZ2lzdGVyIElECi0JCVVJTlQJUkZfQ1NSX0RBVEE6ODsJCQkvLyBEQVRBCi0JfQlmaWVsZDsKLQlVSU5UCXdvcmQ7Ci19CVJGX0NTUl9DRkdfU1RSVUMsICpQUkZfQ1NSX0NGR19TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UCVJGX0NTUl9EQVRBOjg7CQkJLy8gREFUQQotCQlVSU5UCVRFU1RDU1JfUkZBQ0NfUkVHTlVNOjU7CS8vIFJGIHJlZ2lzdGVyIElECi0JCVVJTlQJUnN2ZDI6MzsJCQkJLy8gUmVzZXJ2ZWQKLQkJVUlOVAlSRl9DU1JfV1I6MTsJCQkvLyAwOiByZWFkICAxOiB3cml0ZQotCQlVSU5UCVJGX0NTUl9LSUNLOjE7CQkJLy8ga2ljayBSRiByZWdpc3RlciByZWFkL3dyaXRlCi0JCVVJTlQJUnN2ZDE6MTQ7CQkJCS8vIFJlc2VydmVkCi0JfQlmaWVsZDsKLQlVSU5UCXdvcmQ7Ci19CVJGX0NTUl9DRkdfU1RSVUMsICpQUkZfQ1NSX0NGR19TVFJVQzsKLSNlbmRpZgotCi0KLS8vCi0vLyBPdGhlciBvbi1jaGlwIHNoYXJlZCBtZW1vcnkgc3BhY2UsIGJhc2UgPSAweDIwMDAKLS8vCi0KLS8vIENJUyBzcGFjZSAtIGJhc2UgYWRkcmVzcyA9IDB4MjAwMAotI2RlZmluZSBIV19DSVNfQkFTRSAgICAgICAgICAgICAweDIwMDAKLQotLy8gQ2Fycmllci1zZW5zZSBDVFMgZnJhbWUgYmFzZSBhZGRyZXNzLiBJdCdzIHdoZXJlIG1hYyBzdG9yZXMgY2Fycmllci1zZW5zZSBmcmFtZSBmb3IgY2Fycmllci1zZW5zZSBmdW5jdGlvbi4KLSNkZWZpbmUgSFdfQ1NfQ1RTX0JBU0UJCQkweDc3MDAKLS8vIERGUyBDVFMgZnJhbWUgYmFzZSBhZGRyZXNzLiBJdCdzIHdoZXJlIG1hYyBzdG9yZXMgQ1RTIGZyYW1lIGZvciBERlMuCi0jZGVmaW5lIEhXX0RGU19DVFNfQkFTRQkJCTB4Nzc4MAotI2RlZmluZSBIV19DVFNfRlJBTUVfU0laRQkJMHg4MAotCi0vLyAyMDA0LTExLTA4IGpvaG4gLSBzaW5jZSBOVUxMIGZyYW1lIHdvbid0IGJlIHRoYXQgbG9uZyAoMjU2IGJ5dGUpLiBXZSBzdGVhbCAxNiB0YWlsIGJ5dGVzCi0vLyB0byBzYXZlIGRlYnVnZ2luZyBzZXR0aW5ncwotI2RlZmluZSBIV19ERUJVR19TRVRUSU5HX0JBU0UgICAweDc3ZjAgIC8vIDB4NzdmMH4weDc3ZmYgdG90YWwgMTYgYnl0ZXMKLSNkZWZpbmUgSFdfREVCVUdfU0VUVElOR19CQVNFMiAgIDB4Nzc3MCAgLy8gMHg3N2YwfjB4NzdmZiB0b3RhbCAxNiBieXRlcwotCi0vLyBJbiBvcmRlciB0byBzdXBwb3J0IG1heGltdW0gOCBNQlNTIGFuZCBpdHMgbWF4aW11bSBsZW5ndGggaXMgNTEyIGZvciBlYWNoIGJlYWNvbgotLy8gVGhyZWUgc2VjdGlvbiBkaXNjb250aW51ZSBtZW1vcnkgc2VnbWVudHMgd2lsbCBiZSB1c2VkLgotLy8gMS4gVGhlIG9yaWdpbmFsIHJlZ2lvbiBmb3IgQkNOIDB+MwotLy8gMi4gRXh0cmFjdCBtZW1vcnkgZnJvbSBGQ0UgdGFibGUgZm9yIEJDTiA0fjUKLS8vIDMuIEV4dHJhY3QgbWVtb3J5IGZyb20gUGFpci13aXNlIGtleSB0YWJsZSBmb3IgQkNOIDZ+NwotLy8JICBJdCBvY2N1cGllZCB0aG9zZSBtZW1vcnkgb2Ygd2NpZCAyMzh+MjUzIGZvciBCQ04gNgotLy8JCQkJCQkgICAgICBhbmQgd2NpZCAyMjJ+MjM3IGZvciBCQ04gNwotI2RlZmluZSBIV19CRUFDT05fTUFYX1NJWkUgICAgICAweDEwMDAgLyogdW5pdDogYnl0ZSAqLwotI2RlZmluZSBIV19CRUFDT05fQkFTRTAgICAgICAgICAweDc4MDAKLSNkZWZpbmUgSFdfQkVBQ09OX0JBU0UxICAgICAgICAgMHg3QTAwCi0jZGVmaW5lIEhXX0JFQUNPTl9CQVNFMiAgICAgICAgIDB4N0MwMAotI2RlZmluZSBIV19CRUFDT05fQkFTRTMgICAgICAgICAweDdFMDAKLSNkZWZpbmUgSFdfQkVBQ09OX0JBU0U0ICAgICAgICAgMHg3MjAwCi0jZGVmaW5lIEhXX0JFQUNPTl9CQVNFNSAgICAgICAgIDB4NzQwMAotI2RlZmluZSBIV19CRUFDT05fQkFTRTYgICAgICAgICAweDVEQzAKLSNkZWZpbmUgSFdfQkVBQ09OX0JBU0U3ICAgICAgICAgMHg1QkMwCi0KLSNkZWZpbmUgSFdfQkVBQ09OX01BWF9DT1VOVCAgICAgOAotI2RlZmluZSBIV19CRUFDT05fT0ZGU0VUCQkweDAyMDAKLSNkZWZpbmUgSFdfQkVBQ09OX0NPTlRFTlRfTEVOCShIV19CRUFDT05fT0ZGU0VUIC0gVFhXSV9TSVpFKQotCi0vLyBIT1NULU1DVSBzaGFyZWQgbWVtb3J5IC0gYmFzZSBhZGRyZXNzID0gMHgyMTAwCi0jZGVmaW5lIEhPU1RfQ01EX0NTUgkJMHg0MDQKLSNkZWZpbmUgSDJNX01BSUxCT1hfQ1NSICAgICAgICAgMHg3MDEwCi0jZGVmaW5lIEgyTV9NQUlMQk9YX0NJRCAgICAgICAgIDB4NzAxNAotI2RlZmluZSBIMk1fTUFJTEJPWF9TVEFUVVMgICAgICAweDcwMWMKLSNkZWZpbmUgSDJNX0lOVF9TUkMgICAgICAgICAgICAgMHg3MDI0Ci0jZGVmaW5lIEgyTV9CQlBfQUdFTlQgICAgICAgICAgIDB4NzAyOAotI2RlZmluZSBNMkhfQ01EX0RPTkVfQ1NSICAgICAgICAweDAwMGMKLSNkZWZpbmUgTUNVX1RYT1BfQVJSQVlfQkFTRSAgICAgMHgwMDBjICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0Ci0jZGVmaW5lIE1DVV9UWE9QX0VOVFJZX1NJWkUgICAgIDMyICAgICAgIC8vIFRPRE86IHRvIGJlIHByb3ZpZGVkIGJ5IEFsYmVydAotI2RlZmluZSBNQVhfTlVNX09GX1RYT1BfRU5UUlkgICAxNiAgICAgICAvLyBUT0RPOiBtdXN0IGJlIHNhbWUgd2l0aCA4MDUxIGZpcm13YXJlCi0jZGVmaW5lIE1DVV9NQk9YX1ZFUlNJT04gICAgICAgIDB4MDEgICAgIC8vIFRPRE86IHRvIGJlIGNvbmZpcm1lZCBieSBBbGJlcnQKLSNkZWZpbmUgTUNVX01CT1hfVkVSU0lPTl9PRkZTRVQgNSAgICAgICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0Ci0KLS8vCi0vLyBIb3N0IERNQSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgyMDAgLiAgVFgwLTM9RURDQVFpZDAtMywgVFg0PUhDQ0EsIFRYNT1NR01ULAotLy8KLS8vCi0vLyAgRE1BIFJJTkcgREVTQ1JJUFRPUgotLy8KLSNkZWZpbmUgRTJQUk9NX0NTUiAgICAgICAgICAweDAwMDQKLSNkZWZpbmUgSU9fQ05UTF9DU1IgICAgICAgICAweDc3ZDAKLQotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFR4IC8JUnggLyBNZ210IHJpbmcgZGVzY3JpcHRvciBkZWZpbml0aW9uCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIHRoZSBmb2xsb3dpbmcgUElEIHZhbHVlcyBhcmUgdXNlZCB0byBtYXJrIG91dGdvaW5nIGZyYW1lIHR5cGUgaW4gVFhELT5QSUQgc28gdGhhdAotLy8gcHJvcGVyIFRYIHN0YXRpc3RpY3MgY2FuIGJlIGNvbGxlY3RlZCBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzCi0vLyBiMy0yIG9mIFBJRCBmaWVsZCAtCi0jZGVmaW5lIFBJRF9NR01UCQkJMHgwNQotI2RlZmluZSBQSURfQkVBQ09OCQkJMHgwYwotI2RlZmluZSBQSURfREFUQV9OT1JNQUxVQ0FTVAkJMHgwMgotI2RlZmluZSBQSURfREFUQV9BTVBEVQkJMHgwNAotI2RlZmluZSBQSURfREFUQV9OT19BQ0sJCTB4MDgKLSNkZWZpbmUgUElEX0RBVEFfTk9UX05PUk1fQUNLCQkweDAzCi0vLyB2YWx1ZSBkb21haW4gb2YgcFR4RC0+SG9zdFFJZCAoNC1iaXQ6IDB+MTUpCi0jZGVmaW5lIFFJRF9BQ19CSyAgICAgICAgICAgICAgIDEgICAvLyBtZWV0IEFDSSBkZWZpbml0aW9uIGluIDgwMi4xMWUKLSNkZWZpbmUgUUlEX0FDX0JFICAgICAgICAgICAgICAgMCAgIC8vIG1lZXQgQUNJIGRlZmluaXRpb24gaW4gODAyLjExZQotI2RlZmluZSBRSURfQUNfVkkgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFFJRF9BQ19WTyAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgUUlEX0hDQ0EgICAgICAgICAgICAgICAgNAotLy8jZGVmaW5lIE5VTV9PRl9UWF9SSU5HICAgICAgICAgIDUKLSNkZWZpbmUgTlVNX09GX1RYX1JJTkcgICAgICAgICAgNAotI2RlZmluZSBRSURfTUdNVCAgICAgICAgICAgICAgICAxMwotI2RlZmluZSBRSURfUlggICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBRSURfT1RIRVIgICAgICAgICAgICAgICAxNQotCi0jZW5kaWYgLy8gX19SVE1QX01BQ19IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF9tY3UuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF9tY3UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiMmZlZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfbWN1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXJ0bXBfbWN1LmgKLQotCUFic3RyYWN0OgotCU1pbmlwb3J0IGhlYWRlciBmaWxlIGZvciBtY3UgcmVsYXRlZCBpbmZvcm1hdGlvbgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLQktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpZm5kZWYgX19SVE1QX01DVV9IX18KLSNkZWZpbmUgX19SVE1QX01DVV9IX18KLQotCi1JTlQgUnRtcEFzaWNFcmFzZUZpcm13YXJlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotTkRJU19TVEFUVVMgUnRtcEFzaWNMb2FkRmlybXdhcmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1JTlQgUnRtcEFzaWNTZW5kQ29tbWFuZFRvTWN1KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCQkgQ29tbWFuZCwKLQlJTiBVQ0hBUgkJIFRva2VuLAotCUlOIFVDSEFSCQkgQXJnMCwKLQlJTiBVQ0hBUgkJIEFyZzEpOwotCi0jZW5kaWYgLy8gX19SVE1QX01DVV9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF9vcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX29zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDZiMmQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX29zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotCXJ0bXBfb3MuaAotCi0gICAgQWJzdHJhY3Q6Ci0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotCi0jaWZuZGVmIF9fUlRNUF9PU19IX18KLSNkZWZpbmUgX19SVE1QX09TX0hfXwotCi0jaWZkZWYgTElOVVgKLSNpbmNsdWRlICJydF9saW51eC5oIgotI2VuZGlmIC8vIExJTlVYIC8vCi0KLQotLyoKLQlUaGlzIGRhdGEgc3RydWN0dXJlIG1haW5seSBzdHJpcCBzb21lIGNhbGxiYWNrIGZ1bmN0aW9uIGRlZmluZWQgaW4KLQkic3RydWN0IG5ldF9kZXZpY2UiIGluIGtlcm5lbCBzb3VyY2UgImluY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgiLgotCi0JVGhlIGRlZmluaXRpb24gb2YgdGhpcyBkYXRhIHN0cnVjdHVyZSBtYXkgdmFyaW91cyBkZXBlbmRzIG9uIGRpZmZlcmVudAotCU9TLiBVc2UgaXQgY2FyZWZ1bGx5LgotKi8KLXR5cGVkZWYgc3RydWN0IF9SVE1QX09TX05FVERFVl9PUF9IT09LXwotewotCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqbmV0ZGV2X29wczsKLQl2b2lkCQkJKnByaXY7Ci0JaW50CQkJcHJpdl9mbGFnczsKLQl1bnNpZ25lZCBjaGFyIGRldkFkZHJbNl07Ci0JdW5zaWduZWQgY2hhcglkZXZOYW1lWzE2XTsKLQl1bnNpZ25lZCBjaGFyCW5lZWRQcm90Y3RlZDsKLX1SVE1QX09TX05FVERFVl9PUF9IT09LLCAqUFJUTVBfT1NfTkVUREVWX09QX0hPT0s7Ci0KLQotdHlwZWRlZiBlbnVtIF9SVE1QX1RBU0tfU1RBVFVTXwotewotCVJUTVBfVEFTS19TVEFUX1VOS05PV04gPSAwLAotCVJUTVBfVEFTS19TVEFUX0lOSVRFRCA9IDEsCi0JUlRNUF9UQVNLX1NUQVRfUlVOTklORyA9IDIsCi0JUlRNUF9UQVNLX1NUQVRfU1RPUEVEID0gNCwKLX1SVE1QX1RBU0tfU1RBVFVTOwotI2RlZmluZSBSVE1QX1RBU0tfQ0FOX0RPX0lOU0VSVAkJKFJUTVBfVEFTS19TVEFUX0lOSVRFRCB8UlRNUF9UQVNLX1NUQVRfUlVOTklORykKLQotI2RlZmluZSBSVE1QX09TX1RBU0tfTkFNRV9MRU4JMTYKLXR5cGVkZWYgc3RydWN0IF9SVE1QX09TX1RBU0tfCi17Ci0JY2hhcgkJCQkJdGFza05hbWVbUlRNUF9PU19UQVNLX05BTUVfTEVOXTsKLQl2b2lkCQkJCQkqcHJpdjsKLQkvL3Vuc2lnbmVkIGxvbmcJCXRhc2tGbGFnczsKLQlSVE1QX1RBU0tfU1RBVFVTCXRhc2tTdGF0dXM7Ci0jaWZuZGVmIEtUSFJFQURfU1VQUE9SVAotCVJUTVBfT1NfU0VNCQkJdGFza1NlbWE7Ci0JUlRNUF9PU19QSUQJCQl0YXNrUElEOwotCXN0cnVjdCBjb21wbGV0aW9uCQl0YXNrQ29tcGxldGU7Ci0jZW5kaWYKLQl1bnNpZ25lZCBjaGFyCQkJdGFza19raWxsZWQ7Ci0jaWZkZWYgS1RIUkVBRF9TVVBQT1JUCi0Jc3RydWN0IHRhc2tfc3RydWN0CSprdGhyZWFkX3Rhc2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJCWt0aHJlYWRfcTsKLQlCT09MRUFOCQkJCQlrdGhyZWFkX3J1bm5pbmc7Ci0jZW5kaWYKLX1SVE1QX09TX1RBU0s7Ci0KLSNlbmRpZiAvLyBfX1JNVFBfT1NfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfcGNpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfcGNpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZmVkMjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX3BjaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIF9fUlRNUF9QQ0lfSF9fCi0jZGVmaW5lIF9fUlRNUF9QQ0lfSF9fCi0KLSNkZWZpbmUgUlQyOFhYX0hBTkRMRV9ERVZfQVNTSUdOKGhhbmRsZSwgZGV2X3ApCQkJCVwKLQkoKFBPU19DT09LSUUpaGFuZGxlKS0+cGNpX2RldiA9IGRldl9wOwotCi0KLSNpZmRlZiBMSU5VWAotLy8gc2V0IGRyaXZlciBkYXRhCi0jZGVmaW5lIFJUMjhYWF9EUlZEQVRBX1NFVChfYSkJCQlwY2lfc2V0X2RydmRhdGEoX2EsIG5ldF9kZXYpOwotCi0jZGVmaW5lIFJUMjhYWF9QVVRfREVWSUNFKGRldl9wKQotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKLSNkZWZpbmUgU0FfU0hJUlEgSVJRRl9TSEFSRUQKLSNlbmRpZgotCi0jaWZkZWYgUENJX01TSV9TVVBQT1JUCi0jZGVmaW5lIFJUTVBfTVNJX0VOQUJMRShfcEFkKSBcCi17CVBPU19DT09LSUUgX3BPYmogPSAoUE9TX0NPT0tJRSkoX3BBZC0+T1NfQ29va2llKTsgXAotCShfcEFkKS0+SGF2ZU1zaSA9CXBjaV9lbmFibGVfbXNpKF9wT2JqLT5wY2lfZGV2KSA9PSAwID8gVFJVRSA6IEZBTFNFOyB9Ci0KLSNkZWZpbmUgUlRNUF9NU0lfRElTQUJMRShfcEFkKSBcCi17CVBPU19DT09LSUUgX3BPYmogPSAoUE9TX0NPT0tJRSkoX3BBZC0+T1NfQ29va2llKTsgXAotCWlmIChfcEFkLT5IYXZlTXNpID09IFRSVUUpIFwKLQkJcGNpX2Rpc2FibGVfbXNpKF9wT2JqLT5wY2lfZGV2KTsgXAotCV9wQWQtPkhhdmVNc2kgPSBGQUxTRTsJfQotI2Vsc2UKLSNkZWZpbmUgUlRNUF9NU0lfRU5BQkxFKF9wQWQpCi0jZGVmaW5lIFJUTVBfTVNJX0RJU0FCTEUoX3BBZCkKLSNlbmRpZiAvLyBQQ0lfTVNJX1NVUFBPUlQgLy8KLQotCi0jZGVmaW5lIFJUTVBfUENJX0RFVl9VTk1BUCgpCQkJCQkJCQkJCVwKLXsJaWYgKG5ldF9kZXYtPmJhc2VfYWRkcikJewkJCQkJCQkJXAotCQlpb3VubWFwKCh2b2lkICopKG5ldF9kZXYtPmJhc2VfYWRkcikpOwkJCQlcCi0JCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2X3AsIDApLAlcCi0JCQkJCQkJcGNpX3Jlc291cmNlX2xlbihkZXZfcCwgMCkpOyB9CVwKLQlpZiAobmV0X2Rldi0+aXJxKSBwY2lfcmVsZWFzZV9yZWdpb25zKGRldl9wKTsgfQotCi0KLSNkZWZpbmUgUlRNUF9JUlFfUkVRVUVTVChuZXRfZGV2KQkJCQkJCQlcCi17CVBSVE1QX0FEQVBURVIgX3BBZCA9IChQUlRNUF9BREFQVEVSKShSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KSk7CVwKLQlQT1NfQ09PS0lFIF9wT2JqID0gKFBPU19DT09LSUUpKF9wQWQtPk9TX0Nvb2tpZSk7CQlcCi0JUlRNUF9NU0lfRU5BQkxFKF9wQWQpOwkJCQkJCQkJCVwKLQlpZiAoKHJldHZhbCA9IHJlcXVlc3RfaXJxKF9wT2JqLT5wY2lfZGV2LT5pcnEsCQlcCi0JCQkJCQkJcnQyODYwX2ludGVycnVwdCwgU0FfU0hJUlEsCQlcCi0JCQkJCQkJKG5ldF9kZXYpLT5uYW1lLCAobmV0X2RldikpKSkgewlcCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInJlcXVlc3RfaXJxICBlcnJvciglZClcbiIsIHJldHZhbCkpOwlcCi0JcmV0dXJuIHJldHZhbDsgfSB9Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0jZGVmaW5lIFJUTVBfSVJRX1JFTEVBU0UobmV0X2RldikJCQkJCQkJCVwKLXsJUFJUTVBfQURBUFRFUiBfcEFkID0gKFBSVE1QX0FEQVBURVIpKFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKG5ldF9kZXYpKTsJCVwKLQlQT1NfQ09PS0lFIF9wT2JqID0gKFBPU19DT09LSUUpKF9wQWQtPk9TX0Nvb2tpZSk7CQkJXAotCXN5bmNocm9uaXplX2lycShfcE9iai0+cGNpX2Rldi0+aXJxKTsJCQkJCQlcCi0JZnJlZV9pcnEoX3BPYmotPnBjaV9kZXYtPmlycSwgKG5ldF9kZXYpKTsJCQkJCVwKLQlSVE1QX01TSV9ESVNBQkxFKF9wQWQpOyB9Ci0jZWxzZQotI2RlZmluZSBSVE1QX0lSUV9SRUxFQVNFKG5ldF9kZXYpCQkJCQkJCQlcCi17CVBSVE1QX0FEQVBURVIgX3BBZCA9IChQUlRNUF9BREFQVEVSKShSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KSk7CQlcCi0JUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShfcEFkLT5PU19Db29raWUpOwkJCVwKLQlmcmVlX2lycShfcE9iai0+cGNpX2Rldi0+aXJxLCAobmV0X2RldikpOwkJCQkJXAotCVJUTVBfTVNJX0RJU0FCTEUoX3BBZCk7IH0KLSNlbmRpZgotCi0jZGVmaW5lIFBDSV9SRUdfUkVBRF9XT1JEKHBjaV9kZXYsIG9mZnNldCwgQ29uZmlndXJhdGlvbikgICBcCi0gICAgaWYgKHBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaV9kZXYsIG9mZnNldCwgJnJlZzE2KSA9PSAwKSAgICAgXAotICAgICAgICBDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIENvbmZpZ3VyYXRpb24gPSAwOwotCi0jZGVmaW5lIFBDSV9SRUdfV0lSVEVfV09SRChwY2lfZGV2LCBvZmZzZXQsIENvbmZpZ3VyYXRpb24pICBcCi0gICAgcmVnMTYgPSBjcHUybGUxNihDb25maWd1cmF0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaV9kZXYsIG9mZnNldCwgcmVnMTYpOyAgICAgICAgICBcCi0KLSNlbmRpZiAvLyBMSU5VWCAvLwotCi0KLQotCi0jZW5kaWYgLy8gX19SVE1QX1BDSV9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF9waHkuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF9waHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk4NDhjYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfcGh5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MzEgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlydG1wX3BoeS5oCi0KLQlBYnN0cmFjdDoKLQlSYWxpbmsgV2lyZWxlc3MgQ2hpcCBQSFkoQkJQL1JGKSByZWxhdGVkIGRlZmluaXRpb24gJiBzdHJ1Y3R1cmVzCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCSAgV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaWZuZGVmIF9fUlRNUF9QSFlfSF9fCi0jZGVmaW5lIF9fUlRNUF9QSFlfSF9fCi0KLQotLyoKLQlSRiBzZWN0aW9ucwotKi8KLSNkZWZpbmUgUkZfUjAwCQkJMAotI2RlZmluZSBSRl9SMDEJCQkxCi0jZGVmaW5lIFJGX1IwMgkJCTIKLSNkZWZpbmUgUkZfUjAzCQkJMwotI2RlZmluZSBSRl9SMDQJCQk0Ci0jZGVmaW5lIFJGX1IwNQkJCTUKLSNkZWZpbmUgUkZfUjA2CQkJNgotI2RlZmluZSBSRl9SMDcJCQk3Ci0jZGVmaW5lIFJGX1IwOAkJCTgKLSNkZWZpbmUgUkZfUjA5CQkJOQotI2RlZmluZSBSRl9SMTAJCQkxMAotI2RlZmluZSBSRl9SMTEJCQkxMQotI2RlZmluZSBSRl9SMTIJCQkxMgotI2RlZmluZSBSRl9SMTMJCQkxMwotI2RlZmluZSBSRl9SMTQJCQkxNAotI2RlZmluZSBSRl9SMTUJCQkxNQotI2RlZmluZSBSRl9SMTYJCQkxNgotI2RlZmluZSBSRl9SMTcJCQkxNwotI2RlZmluZSBSRl9SMTgJCQkxOAotI2RlZmluZSBSRl9SMTkJCQkxOQotI2RlZmluZSBSRl9SMjAJCQkyMAotI2RlZmluZSBSRl9SMjEJCQkyMQotI2RlZmluZSBSRl9SMjIJCQkyMgotI2RlZmluZSBSRl9SMjMJCQkyMwotI2RlZmluZSBSRl9SMjQJCQkyNAotI2RlZmluZSBSRl9SMjUJCQkyNQotI2RlZmluZSBSRl9SMjYJCQkyNgotI2RlZmluZSBSRl9SMjcJCQkyNwotI2RlZmluZSBSRl9SMjgJCQkyOAotI2RlZmluZSBSRl9SMjkJCQkyOQotI2RlZmluZSBSRl9SMzAJCQkzMAotI2RlZmluZSBSRl9SMzEJCQkzMQotCi0KLS8vIHZhbHVlIGRvbWFpbiBvZiBwQWQtPlJmSWNUeXBlCi0jZGVmaW5lIFJGSUNfMjgyMCAgICAgICAgICAgICAgICAgICAxICAgICAgIC8vIDIuNEcgMlQzUgotI2RlZmluZSBSRklDXzI4NTAgICAgICAgICAgICAgICAgICAgMiAgICAgICAvLyAyLjRHLzVHIDJUM1IKLSNkZWZpbmUgUkZJQ18yNzIwICAgICAgICAgICAgICAgICAgIDMgICAgICAgLy8gMi40RyAxVDJSCi0jZGVmaW5lIFJGSUNfMjc1MCAgICAgICAgICAgICAgICAgICA0ICAgICAgIC8vIDIuNEcvNUcgMVQyUgotI2RlZmluZSBSRklDXzMwMjAgICAgICAgICAgICAgICAgICAgNSAgICAgICAvLyAyLjRHIDFUMVIKLSNkZWZpbmUgUkZJQ18yMDIwICAgICAgICAgICAgICAgICAgIDYgICAgICAgLy8gMi40RyBCL0cKLSNkZWZpbmUgUkZJQ18zMDIxICAgICAgICAgICAgICAgICAgIDcgICAgICAgLy8gMi40RyAxVDJSCi0jZGVmaW5lIFJGSUNfMzAyMiAgICAgICAgICAgICAgICAgICA4ICAgICAgIC8vIDIuNEcgMlQyUgotI2RlZmluZSBSRklDXzMwNTIgICAgICAgICAgICAgICAgICAgOSAgICAgICAvLyAyLjRHLzVHIDJUMlIKLQotLyoKLQlCQlAgc2VjdGlvbnMKLSovCi0jZGVmaW5lIEJCUF9SMAkJCTAgIC8vIHZlcnNpb24KLSNkZWZpbmUgQkJQX1IxCQkJMSAgLy8gVFNTSQotI2RlZmluZSBCQlBfUjIJCQkyICAvLyBUWCBjb25maWd1cmUKLSNkZWZpbmUgQkJQX1IzCQkJMwotI2RlZmluZSBCQlBfUjQJCQk0Ci0jZGVmaW5lIEJCUF9SNQkJCTUKLSNkZWZpbmUgQkJQX1I2CQkJNgotI2RlZmluZSBCQlBfUjE0CQkJMTQgLy8gUlggY29uZmlndXJlCi0jZGVmaW5lIEJCUF9SMTYJCQkxNgotI2RlZmluZSBCQlBfUjE3CQkJMTcgLy8gUlggc2Vuc2liaWxpdHkKLSNkZWZpbmUgQkJQX1IxOAkJCTE4Ci0jZGVmaW5lIEJCUF9SMjEJCQkyMQotI2RlZmluZSBCQlBfUjIyCQkJMjIKLSNkZWZpbmUgQkJQX1IyNAkJCTI0Ci0jZGVmaW5lIEJCUF9SMjUJCQkyNQotI2RlZmluZSBCQlBfUjI2CQkJMjYKLSNkZWZpbmUgQkJQX1IyNwkJCTI3Ci0jZGVmaW5lIEJCUF9SMzEJCQkzMQotI2RlZmluZSBCQlBfUjQ5CQkJNDkgLy9UU1NJCi0jZGVmaW5lIEJCUF9SNTAJCQk1MAotI2RlZmluZSBCQlBfUjUxCQkJNTEKLSNkZWZpbmUgQkJQX1I1MgkJCTUyCi0jZGVmaW5lIEJCUF9SNTUJCQk1NQotI2RlZmluZSBCQlBfUjYyCQkJNjIgLy8gUnggU1EwIFRocmVzaG9sZCBISUdICi0jZGVmaW5lIEJCUF9SNjMJCQk2MwotI2RlZmluZSBCQlBfUjY0CQkJNjQKLSNkZWZpbmUgQkJQX1I2NQkJCTY1Ci0jZGVmaW5lIEJCUF9SNjYJCQk2NgotI2RlZmluZSBCQlBfUjY3CQkJNjcKLSNkZWZpbmUgQkJQX1I2OAkJCTY4Ci0jZGVmaW5lIEJCUF9SNjkJCQk2OQotI2RlZmluZSBCQlBfUjcwCQkJNzAgLy8gUnggQUdDIFNRIENDSyBYY29yciB0aHJlc2hvbGQKLSNkZWZpbmUgQkJQX1I3MwkJCTczCi0jZGVmaW5lIEJCUF9SNzUJCQk3NQotI2RlZmluZSBCQlBfUjc3CQkJNzcKLSNkZWZpbmUgQkJQX1I3OAkJCTc4Ci0jZGVmaW5lIEJCUF9SNzkJCQk3OQotI2RlZmluZSBCQlBfUjgwCQkJODAKLSNkZWZpbmUgQkJQX1I4MQkJCTgxCi0jZGVmaW5lIEJCUF9SODIJCQk4MgotI2RlZmluZSBCQlBfUjgzCQkJODMKLSNkZWZpbmUgQkJQX1I4NAkJCTg0Ci0jZGVmaW5lIEJCUF9SODYJCQk4NgotI2RlZmluZSBCQlBfUjkxCQkJOTEKLSNkZWZpbmUgQkJQX1I5MgkJCTkyCi0jZGVmaW5lIEJCUF9SOTQJCQk5NCAvLyBUeCBHYWluIENvbnRyb2wKLSNkZWZpbmUgQkJQX1IxMDMJCTEwMwotI2RlZmluZSBCQlBfUjEwNQkJMTA1Ci0jZGVmaW5lIEJCUF9SMTA2CQkxMDYKLSNkZWZpbmUgQkJQX1IxMTMJCTExMwotI2RlZmluZSBCQlBfUjExNAkJMTE0Ci0jZGVmaW5lIEJCUF9SMTE1CQkxMTUKLSNkZWZpbmUgQkJQX1IxMTYJCTExNgotI2RlZmluZSBCQlBfUjExNwkJMTE3Ci0jZGVmaW5lIEJCUF9SMTE4CQkxMTgKLSNkZWZpbmUgQkJQX1IxMTkJCTExOQotI2RlZmluZSBCQlBfUjEyMAkJMTIwCi0jZGVmaW5lIEJCUF9SMTIxCQkxMjEKLSNkZWZpbmUgQkJQX1IxMjIJCTEyMgotI2RlZmluZSBCQlBfUjEyMwkJMTIzCi0jaWZkZWYgUlQzMHh4Ci0jZGVmaW5lIEJCUF9SMTM4CQkxMzggLy8gYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAsIEFEQyBkeW5hbWljIG9uL29mZiBjb250cm9sCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQotI2RlZmluZSBCQlBSOTRfREVGQVVMVAkweDA2IC8vIEFkZCAxIHZhbHVlIHdpbGwgZ2FpbiAxZGIKLQotCi0jaWZkZWYgTUVSR0VfQVJDSF9URUFNCi0JI2RlZmluZSBNQVhfQkJQX0lECTIwMAotCSNkZWZpbmUgTUFYX0JCUF9NU0dfU0laRQk0MDk2Ci0jZWxzZQotI2lmZGVmIFJUMzB4eAotCS8vIGVkaXQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cCwgYWRkIEJCUCBSMTM4IGZvciBBREMgZHluYW1pYyBvbi9vZmYgY29udHJvbAotCSNkZWZpbmUgTUFYX0JCUF9JRAkxMzgKLSNlbmRpZiAvLyBSVDMweHggLy8KLSNpZm5kZWYgUlQzMHh4Ci0JI2RlZmluZSBNQVhfQkJQX0lECTEzNgotI2VuZGlmIC8vIFJUMzB4eCAvLwotCSNkZWZpbmUgTUFYX0JCUF9NU0dfU0laRQkyMDQ4Ci0jZW5kaWYgLy8gTUVSR0VfQVJDSF9URUFNIC8vCi0KLQotLy8KLS8vIEJCUCAmIFJGIGFyZSB1c2luZyBpbmRpcmVjdCBhY2Nlc3MuIEJlZm9yZSB3cml0ZSBhbnkgdmFsdWUgaW50byBpdC4KLS8vIFdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIG91dHN0YW5kaW5nIGNvbW1hbmQgcGVuZGluZyB2aWEgY2hlY2tpbmcgYnVzeSBiaXQuCi0vLwotI2RlZmluZSBNQVhfQlVTWV9DT1VOVCAgMTAwICAgICAgICAgLy8gTnVtYmVyIG9mIHJldHJ5IGJlZm9yZSBmYWlsaW5nIGFjY2VzcyBCQlAgJiBSRiBpbmRpcmVjdCByZWdpc3RlcgotCi0vLyNkZWZpbmUgUEhZX1RSX1NXSVRDSF9USU1FICAgICAgICAgIDUgIC8vIHVzZWMKLQotLy8jZGVmaW5lIEJCUF9SMTdfTE9XX1NFTlNJQklMSVRZICAgICAweDUwCi0vLyNkZWZpbmUgQkJQX1IxN19NSURfU0VOU0lCSUxJVFkgICAgIDB4NDEKLS8vI2RlZmluZSBCQlBfUjE3X0RZTkFNSUNfVVBfQk9VTkQgICAgMHg0MAotCi0jZGVmaW5lIFJTU0lfRk9SX1ZFUllfTE9XX1NFTlNJQklMSVRZICAgLTM1Ci0jZGVmaW5lIFJTU0lfRk9SX0xPV19TRU5TSUJJTElUWQkJLTU4Ci0jZGVmaW5lIFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkJLTgwCi0jZGVmaW5lIFJTU0lfRk9SX01JRF9TRU5TSUJJTElUWQkJLTkwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCVJGIHJlZ2lzdGVyIFJlYWQvV3JpdGUgbWFyY28gZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2RlZmluZSBSVE1QX1JGX0lPX1dSSVRFMzIoX0EsIF9WKSAgICAgICAgICAgICAgICAgIFwKLXsJCQkJCQkJCQkJCVwKLQlpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkJICAgICAgICAgICAgICAgIFwKLQl7CQkJCQkJCQkJCQkJXAotCQlQSFlfQ1NSNF9TVFJVQyAgX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlVTE9ORyAgICAgICAgICAgX2J1c3lDbnQgPSAwOyAgICAgICAgICAgICAgICAgICAgXAotCQkJCQkJCQkJCQlcCi0JCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCVJUTVBfSU9fUkVBRDMyKChfQSksIFJGX0NTUl9DRkcwLCAmX3ZhbHVlLndvcmQpOyAgXAotCQkJaWYgKF92YWx1ZS5maWVsZC5CdXN5ID09IElETEUpICAgICAgICAgICAgICAgXAotCQkJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlfYnVzeUNudCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCX13aGlsZSAoX2J1c3lDbnQgPCBNQVhfQlVTWV9DT1VOVCk7CQkJXAotCQlpZihfYnVzeUNudCA8IE1BWF9CVVNZX0NPVU5UKSAgICAgICAgICAgICAgICAgICBcCi0JCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCVJUTVBfSU9fV1JJVEUzMigoX0EpLCBSRl9DU1JfQ0ZHMCwgKF9WKSk7ICAgICAgICAgIFwKLQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0JCQkJCQkJCVwKLX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0KLSNpZmRlZiBSVDMweHgKLSNkZWZpbmUgUlRNUF9SRl9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgIFJUMzB4eFJlYWRSRlJlZ2lzdGVyKF9BLCBfSSwgX3BWKQotI2RlZmluZSBSVE1QX1JGX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICAgUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKF9BLCBfSSwgX1YpCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JQkJQIHJlZ2lzdGVyIFJlYWQvV3JpdGUgbWFyY28gZGVmaW5pdGlvbnMuCi0Jd2UgcmVhZC93cml0ZSB0aGUgYmJwIHZhbHVlIGJ5IHJlZ2lzdGVyJ3MgSUQuCi0JR2VuZXJhdGUgUEVSIHRvIHRlc3QgQkEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLS8qCi0JYmFzaWMgbWFyY28gZm9yIEJCUCByZWFkIG9wZXJhdGlvbi4KLQlfcEFkOiB0aGUgZGF0YSBzdHJ1Y3R1cmUgcG9pbnRlciBvZiBSVE1QX0FEQVBURVIKLQlfYmJwSUQgOiB0aGUgYmJwIHJlZ2lzdGVyIElECi0JX3BWOiBkYXRhIHBvaW50ZXIgdXNlZCB0byBzYXZlIHRoZSB2YWx1ZSBvZiBxdWVyaWVkIGJicCByZWdpc3Rlci4KLQlfYlZpYU1DVTogaWYgd2UgbmVlZCBhY2Nlc3MgdGhlIGJicCB2aWEgdGhlIE1DVS4KLSovCi0jZGVmaW5lIFJUTVBfQkJQX0lPX1JFQUQ4KF9wQWQsIF9iYnBJRCwgX3BWLCBfYlZpYU1DVSkJCQlcCi0JZG97CQkJCQkJCQkJCQkJCQkJXAotCQlCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOwkJCQkJCQkJXAotCQlpbnQgICBfYnVzeUNudCwgX3NlY0NudCwgX3JlZ0lEOwkJCQkJCVwKLQkJCQkJCQkJCQkJCQkJCQlcCi0JCV9yZWdJRCA9ICgoX2JWaWFNQ1UpID09IFRSVUUgPyBIMk1fQkJQX0FHRU5UIDogQkJQX0NTUl9DRkcpOwlcCi0JCWZvciAoX2J1c3lDbnQ9MDsgX2J1c3lDbnQ8TUFYX0JVU1lfQ09VTlQ7IF9idXN5Q250KyspICAgICAgXAotCQl7CQkJCQkJCQkJCQkJCVwKLQkJCVJUTVBfSU9fUkVBRDMyKF9wQWQsIF9yZWdJRCwgJkJicENzci53b3JkKTsJCVwKLQkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKLQkJCQljb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci5maWVsZC5mUmVhZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci5maWVsZC5SZWdOdW0gPSBfYmJwSUQ7ICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgX3JlZ0lELCBCYnBDc3Iud29yZCk7ICAgICBcCi0JCQlpZiAoKF9iVmlhTUNVKSA9PSBUUlVFKQkJCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCVwKLQkJCQlBc2ljU2VuZENvbW1hbmRUb01jdShfcEFkLCAweDgwLCAweGZmLCAweDAsIDB4MCk7IFwKLQkJCQlSVE1QdXNlY0RlbGF5KDEwMDApOwlcCi0JCQl9CQkJCQkJCVwKLQkJCWZvciAoX3NlY0NudD0wOyBfc2VjQ250PE1BWF9CVVNZX0NPVU5UOyBfc2VjQ250KyspICAgICAgIFwKLQkJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQlSVE1QX0lPX1JFQUQzMihfcEFkLCBfcmVnSUQsICZCYnBDc3Iud29yZCk7IFwKLQkJCQlpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgICAgICAgICAgICAgIFwKLQkJCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCWlmICgoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgJiYgICAgICAgICAgICAgIFwKLQkJCQkoQmJwQ3NyLmZpZWxkLlJlZ051bSA9PSBfYmJwSUQpKSAgICAgICAgICAgICAgICBcCi0JCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJKihfcFYpID0gKFVDSEFSKUJicENzci5maWVsZC5WYWx1ZTsgICAgICAgICBcCi0JCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgICAgICBcCi0JCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlEQkdQUklOVF9FUlIoKCJCQlAodmlhTUNVPSVkKSByZWFkIFIlZCBmYWlsXG4iLCAoX2JWaWFNQ1UpLCBfYmJwSUQpKTsgICAgICBcCi0JCQkqKF9wVikgPSAoX3BBZCktPkJicFdyaXRlTGF0Y2hbX2JicElEXTsgICAgICAgICAgICAgICBcCi0JCQlpZiAoKF9iVmlhTUNVKSA9PSBUUlVFKQkJCQlcCi0JCQl7CQkJCQkJCQkJXAotCQkJCVJUTVBfSU9fUkVBRDMyKF9wQWQsIF9yZWdJRCwgJkJicENzci53b3JkKTsJCQkJXAotCQkJCUJicENzci5maWVsZC5CdXN5ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgX3JlZ0lELCBCYnBDc3Iud29yZCk7CQkJCVwKLQkJCX0JCQkJXAotCQl9CQkJCQkJCQkJCQkJCVwKLQl9d2hpbGUoMCkKLQotLyoKLQlUaGlzIG1hcmNvIHVzZWQgZm9yIHRoZSBCQlAgcmVhZCBvcGVyYXRpb24gd2hpY2ggZGlkbid0IG5lZWQgdmlhIE1DVS4KLSovCi0jZGVmaW5lIEJCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpCQkJXAotCVJUTVBfQkJQX0lPX1JFQUQ4KChfQSksIChfSSksIChfcFYpLCBGQUxTRSkKLQotLyoKLQlUaGlzIG1hcmNvIHVzZWQgZm9yIHRoZSBCQlAgcmVhZCBvcGVyYXRpb24gd2hpY2ggbmVlZCB2aWEgTUNVLgotCUJ1dCBmb3Igc29tZSBjaGlwc2V0IHdoaWNoIGRpZG4ndCBoYXZlIG1jdSAoZS5nLiwgUkJVUyBiYXNlZCBjaGlwc2V0KSwgd2UKLQl3aWxsIHVzZSB0aGlzIGZ1bmN0aW9uIHRvbyBhbmQgZGlkbid0IGFjY2VzcyB0aGUgYmJwIHJlZ2lzdGVyIHZpYSB0aGUgTUNVLgotKi8KLSNpZm5kZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZGVmaW5lIFJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikJCQlcCi0JZG97CQkJCQkJCQkJCQkJCQlcCi0JCWlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKQkJCQkJCQlcCi0JCXsJCQkJCQkJCQkJCQkJXAotCQkJaWYgKChfQSktPmluZlR5cGUgPT0gUlRNUF9ERVZfSU5GX1JCVVMpCQkJXAotCQkJCVJUTVBfQkJQX0lPX1JFQUQ4KChfQSksIChfSSksIChfcFYpLCBGQUxTRSk7CVwKLQkJCWVsc2UJCQkJCQkJCQkJCQlcCi0JCQkJUlRNUF9CQlBfSU9fUkVBRDgoKF9BKSwgKF9JKSwgKF9wViksIFRSVUUpOwlcCi0JCX0JCQkJCQkJCQkJCQkJXAotCX13aGlsZSgwKQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotLy8gUmVhZCBCQlAgcmVnaXN0ZXIgYnkgcmVnaXN0ZXIncyBJRC4gR2VuZXJhdGUgUEVSIHRvIHRlc3QgQkEKLSNkZWZpbmUgUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJCQlcCi0JQkJQX0NTUl9DRkdfU1RSVUMJQmJwQ3NyOwkJCQkJCQkJCQkJXAotCWludAkJCQkJaSwgazsJCQlcCi0JQk9PTEVBTgkJCQkJYnJjOwkJCVwKLQlCYnBDc3IuZmllbGQuQnVzeSA9IElETEU7CQkJXAotCWlmICgoSVNfUlQzMDkwKChfQSkpIHx8IElTX1JUMzU3MigoX0EpKSB8fCBJU19SVDMzOTAoKF9BKSkpICYmICgoX0EpLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQlcCi0JCSYmICgoX0EpLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCVwKLQkJJiYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpCVwKLQkJJiYgKChfQSktPmJydDMweHhCYW5NY3VDbWQgPT0gRkFMU0UpKQlcCi0JewkJCQkJCQkJCQkJCQkJCQkJXAotCQlmb3IgKGk9MDsgaTxNQVhfQlVTWV9DT1VOVDsgaSsrKQkJCQkJCQkJCVwKLQkJewkJCQkJCQkJCQkJCQkJCQkJXAotCQkJUlRNUF9JT19SRUFEMzIoX0EsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CQkJCVwKLQkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKQkJCQkJCQkJCVwKLQkJCXsJCQkJCQkJCQkJCQkJCQkJXAotCQkJCWNvbnRpbnVlOwkJCQkJCQkJCQkJCQlcCi0JCQl9CQkJCQkJCQkJCQkJCQkJCVwKLQkJCUJicENzci53b3JkID0gMDsJCQkJCQkJCQkJCQlcCi0JCQlCYnBDc3IuZmllbGQuZlJlYWQgPSAxOwkJCQkJCQkJCQkJXAotCQkJQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsJCQkJCQkJCQlcCi0JCQlCYnBDc3IuZmllbGQuQnVzeSA9IDE7CQkJCQkJCQkJCQlcCi0JCQlCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7CQkJCQkJCQkJCVwKLQkJCVJUTVBfSU9fV1JJVEUzMihfQSwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOwkJCQlcCi0JCQlicmMgPSBBc2ljU2VuZENvbW1hbmRUb01jdShfQSwgMHg4MCwgMHhmZiwgMHgwLCAweDApOwkJCQkJXAotCQkJaWYgKGJyYyA9PSBUUlVFKQkJCQkJCQkJCQkJCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlmb3IgKGs9MDsgazxNQVhfQlVTWV9DT1VOVDsgaysrKQkJCQkJCQkJXAotCQkJCXsJCQkJCQkJCQkJCQkJCQkJXAotCQkJCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQlcCi0JCQkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKQkJCQkJCQkJXAotCQkJCQkJYnJlYWs7CQkJCQkJCQkJCQkJCVwKLQkJCQl9CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlpZiAoKEJicENzci5maWVsZC5CdXN5ID09IElETEUpICYmCQkJCQkJCQlcCi0JCQkJCShCYnBDc3IuZmllbGQuUmVnTnVtID09IF9JKSkJCQkJCQkJCVwKLQkJCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkJKihfcFYpID0gKFVDSEFSKUJicENzci5maWVsZC5WYWx1ZTsJCQkJCQkJXAotCQkJCQlicmVhazsJCQkJCQkJCQkJCQkJCVwKLQkJCQl9CQkJCQkJCQkJCQkJCQkJCVwKLQkJCX0JCQkJCQkJCQkJCQkJCQkJXAotCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlCYnBDc3IuZmllbGQuQnVzeSA9IDA7CQkJCQkJCQkJCQlcCi0JCQkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKLQkJCX0JCQkJCQkJCQkJCQkJCQkJXAotCQl9CQkJCQkJCQkJCQkJCQkJCQlcCi0JfQlcCi0JZWxzZSBpZiAoISgoSVNfUlQzMDkwKChfQSkpIHx8IElTX1JUMzU3MigoX0EpKSB8fCBJU19SVDMzOTAoKF9BKSkpICYmICgoX0EpLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQlcCi0JCSYmICgoX0EpLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKQlcCi0JCSYmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSkJXAotCXsJCQkJCQkJCQkJCQkJCQkJCVwKLQkJZm9yIChpPTA7IGk8TUFYX0JVU1lfQ09VTlQ7IGkrKykJCQkJCQkJCQlcCi0JCXsJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCVJUTVBfSU9fUkVBRDMyKF9BLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwkJCQlcCi0JCQlpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkJCQkJCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQljb250aW51ZTsJCQkJCQkJCQkJCQkJXAotCQkJfQkJCQkJCQkJCQkJCQkJCQlcCi0JCQlCYnBDc3Iud29yZCA9IDA7CQkJCQkJCQkJCQkJXAotCQkJQmJwQ3NyLmZpZWxkLmZSZWFkID0gMTsJCQkJCQkJCQkJCVwKLQkJCUJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7CQkJCQkJCQkJXAotCQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOwkJCQkJCQkJCQkJXAotCQkJQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOwkJCQkJCQkJCQlcCi0JCQlSVE1QX0lPX1dSSVRFMzIoX0EsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJCQkJXAotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UoX0EsIDB4ODAsIDB4ZmYsIDB4MCwgMHgwKTsJCQkJCVwKLQkJCWZvciAoaz0wOyBrPE1BWF9CVVNZX0NPVU5UOyBrKyspCQkJCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQlcCi0JCQkJaWYgKEJicENzci5maWVsZC5CdXN5ID09IElETEUpCQkJCQkJCQlcCi0JCQkJCWJyZWFrOwkJCQkJCQkJCQkJCQlcCi0JCQl9CQkJCQkJCQkJCQkJCQkJCVwKLQkJCWlmICgoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgJiYJCQkJCQkJCVwKLQkJCQkoQmJwQ3NyLmZpZWxkLlJlZ051bSA9PSBfSSkpCQkJCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkqKF9wVikgPSAoVUNIQVIpQmJwQ3NyLmZpZWxkLlZhbHVlOwkJCQkJCQlcCi0JCQkJYnJlYWs7CQkJCQkJCQkJCQkJCQlcCi0JCQl9CQkJCQkJCQkJCQkJCQkJCVwKLQkJfQkJCQkJCQkJCQkJCQkJCQkJXAotCX0JCQkJCQkJCQkJCQkJCQkJCVwKLQllbHNlCQkJCQkJCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JCURCR1BSSU5UX0VSUigoIiAsIGJydDMweHhCYW5NY3VDbWQgPSAlZCwgUmVhZCBCQlAgJWQgXG4iLCAoX0EpLT5icnQzMHh4QmFuTWN1Q21kLCAoX0kpKSk7CVwKLQkJKihfcFYpID0gKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV07CQkJCQkJCQlcCi0JfQkJCQkJCQkJCQkJCQkJCQkJXAotCWlmICgoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgfHwgKChfQSktPmJQQ0ljbGtPZmYgPT0gVFJVRSkpCQkJCQkJCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JCURCR1BSSU5UX0VSUigoIkJCUCByZWFkIFIlZD0weCV4IGZhaWxcbiIsIF9JLCBCYnBDc3Iud29yZCkpOwlcCi0JCSooX3BWKSA9IChfQSktPkJicFdyaXRlTGF0Y2hbX0ldOwkJCQkJCQkJXAotCX0JCQkJCQkJCQkJCQkJCQkJCVwKLX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotLyoKLQliYXNpYyBtYXJjbyBmb3IgQkJQIHdyaXRlIG9wZXJhdGlvbi4KLQlfcEFkOiB0aGUgZGF0YSBzdHJ1Y3R1cmUgcG9pbnRlciBvZiBSVE1QX0FEQVBURVIKLQlfYmJwSUQgOiB0aGUgYmJwIHJlZ2lzdGVyIElECi0JX3BWOiBkYXRhIHVzZWQgdG8gc2F2ZSB0aGUgdmFsdWUgb2YgcXVlcmllZCBiYnAgcmVnaXN0ZXIuCi0JX2JWaWFNQ1U6IGlmIHdlIG5lZWQgYWNjZXNzIHRoZSBiYnAgdmlhIHRoZSBNQ1UuCi0qLwotI2RlZmluZSBSVE1QX0JCUF9JT19XUklURTgoX3BBZCwgX2JicElELCBfcFYsIF9iVmlhTUNVKQkJCVwKLQlkb3sJCQkJCQkJCQkJCQkJCQlcCi0JCUJCUF9DU1JfQ0ZHX1NUUlVDICBCYnBDc3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWludCAgICAgICAgICAgICBfYnVzeUNudCwgX3JlZ0lEOwkJCQkJCQlcCi0JCQkJCQkJCQkJCQkJCQkJXAotCQlfcmVnSUQgPSAoKF9iVmlhTUNVKSA9PSBUUlVFID8gSDJNX0JCUF9BR0VOVCA6IEJCUF9DU1JfQ0ZHKTsJXAotCQlmb3IgKF9idXN5Q250PTA7IF9idXN5Q250PE1BWF9CVVNZX0NPVU5UOyBfYnVzeUNudCsrKSAgXAotCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJUlRNUF9JT19SRUFEMzIoKF9wQWQpLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsgICAgIFwKLQkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKLQkJCQljb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci5maWVsZC5mUmVhZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci5maWVsZC5WYWx1ZSA9IF9wVjsgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlCYnBDc3IuZmllbGQuUmVnTnVtID0gX2JicElEOyAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJUlRNUF9JT19XUklURTMyKChfcEFkKSwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsgICAgIFwKLQkJCWlmICgoX2JWaWFNQ1UpID09IFRSVUUpCQkJCQkJCQkJXAotCQkJewkJCQkJCQkJCQkJCQkJXAotCQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KF9wQWQsIDB4ODAsIDB4ZmYsIDB4MCwgMHgwKTsJCVwKLQkJCQlpZiAoKF9wQWQpLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQkJCQkJCVwKLQkJCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsJCQkJCQkJXAotCQkJfQkJCQkJCQkJCQkJCQkJXAotCQkJKF9wQWQpLT5CYnBXcml0ZUxhdGNoW19iYnBJRF0gPSBfcFY7CQkJCQlcCi0JCQlicmVhazsJCQkJCQkJCQkJCQkJXAotCQl9CQkJCQkJCQkJCQkJCQlcCi0JCWlmIChfYnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkJCQkJCQkJCVwKLQkJewkJCQkJCQkJCQkJCQkJXAotCQkJREJHUFJJTlRfRVJSKCgiQkJQIHdyaXRlIFIlZCBmYWlsXG4iLCBfYmJwSUQpKTsJCQkJXAotCQkJaWYoKF9iVmlhTUNVKSA9PSBUUlVFKQkJCQkJCQkJCVwKLQkJCXsJCQkJCQkJCQkJCQkJCVwKLQkJCQlSVE1QX0lPX1JFQUQzMihfcEFkLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwlcCi0JCQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAwOwkJCQkJCQkJCVwKLQkJCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOwlcCi0JCQl9CQkJCQkJCQkJCQkJCQlcCi0JCX0JCQkJCQkJCQkJCQkJCVwKLQl9d2hpbGUoMCkKLQotCi0vKgotCVRoaXMgbWFyY28gdXNlZCBmb3IgdGhlIEJCUCB3cml0ZSBvcGVyYXRpb24gd2hpY2ggZGlkbid0IG5lZWQgdmlhIE1DVS4KLSovCi0jZGVmaW5lIEJCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX3BWKQkJCVwKLQlSVE1QX0JCUF9JT19XUklURTgoKF9BKSwgKF9JKSwgKF9wViksIEZBTFNFKQotCi0vKgotCVRoaXMgbWFyY28gdXNlZCBmb3IgdGhlIEJCUCB3cml0ZSBvcGVyYXRpb24gd2hpY2ggbmVlZCB2aWEgTUNVLgotCUJ1dCBmb3Igc29tZSBjaGlwc2V0IHdoaWNoIGRpZG4ndCBoYXZlIG1jdSAoZS5nLiwgUkJVUyBiYXNlZCBjaGlwc2V0KSwgd2UKLQl3aWxsIHVzZSB0aGlzIGZ1bmN0aW9uIHRvbyBhbmQgZGlkbid0IGFjY2VzcyB0aGUgYmJwIHJlZ2lzdGVyIHZpYSB0aGUgTUNVLgotKi8KLSNpZm5kZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZGVmaW5lIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpCQkJXAotCWRvewkJCQkJCQkJCQkJCQkJXAotCQlpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkJCQkJCQkJXAotCQl7CQkJCQkJCQkJCQkJCVwKLQkJCWlmICgoX0EpLT5pbmZUeXBlID09IFJUTVBfREVWX0lORl9SQlVTKQkJCVwKLQkJCQlSVE1QX0JCUF9JT19XUklURTgoKF9BKSwgKF9JKSwgKF9wViksIEZBTFNFKTsJXAotCQkJZWxzZQkJCQkJCQkJCQkJCVwKLQkJCQlSVE1QX0JCUF9JT19XUklURTgoKF9BKSwgKF9JKSwgKF9wViksIFRSVUUpOwlcCi0JCX0JCQkJCQkJCQkJCQkJXAotCX13aGlsZSgwKQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotLy8gV3JpdGUgQkJQIHJlZ2lzdGVyIGJ5IHJlZ2lzdGVyJ3MgSUQgJiB2YWx1ZQotI2RlZmluZSBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJCVwKLQlCQlBfQ1NSX0NGR19TVFJVQwlCYnBDc3I7CQkJCQkJCQkJCQlcCi0JSU5UCQkJCQlCdXN5Q250ID0gMDsJCQkJCQkJCQkJXAotCUJPT0xFQU4JCQkJCWJyYzsJCQlcCi0JaWYgKF9JIDwgTUFYX05VTV9PRl9CQlBfTEFUQ0gpCQkJCQkJCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JCWlmICgoSVNfUlQzMDkwKChfQSkpIHx8IElTX1JUMzU3MigoX0EpKSB8fCBJU19SVDMzOTAoKF9BKSkpICYmICgoX0EpLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQlcCi0JCQkmJiAoKF9BKS0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKQlcCi0JCQkmJiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkJXAotCQkJJiYgKChfQSktPmJydDMweHhCYW5NY3VDbWQgPT0gRkFMU0UpKQlcCi0JCXsJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCWlmIChfQS0+QWNjZXNzQkJQRmFpbENvdW50ID4gMjApCQkJCQkJCQkJXAotCQkJewkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCUFzaWNSZXNldEJCUEFnZW50KF9BKTsJCQkJXAotCQkJCV9BLT5BY2Nlc3NCQlBGYWlsQ291bnQgPSAwOwkJCQkJCQkJCQkJXAotCQkJfQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJZm9yIChCdXN5Q250PTA7IEJ1c3lDbnQ8TUFYX0JVU1lfQ09VTlQ7IEJ1c3lDbnQrKykJCQkJCVwKLQkJCXsJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQkJXAotCQkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKQkJCQkJCQkJCVwKLQkJCQkJY29udGludWU7CQkJCQkJCQkJCQkJCVwKLQkJCQlCYnBDc3Iud29yZCA9IDA7CQkJCQkJCQkJCQkJXAotCQkJCUJicENzci5maWVsZC5mUmVhZCA9IDA7CQkJCQkJCQkJCQlcCi0JCQkJQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsJCQkJCQkJCQlcCi0JCQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOwkJCQkJCQkJCQkJXAotCQkJCUJicENzci5maWVsZC5WYWx1ZSA9IF9WOwkJCQkJCQkJCQlcCi0JCQkJQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOwkJCQkJCQkJCQlcCi0JCQkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKLQkJCQlicmMgPSBBc2ljU2VuZENvbW1hbmRUb01jdShfQSwgMHg4MCwgMHhmZiwgMHgwLCAweDApOwkJCQkJXAotCQkJCWlmIChicmMgPT0gVFJVRSkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCXsJCQkJCQkJCQkJCQkJCQkJXAotCQkJCQkoX0EpLT5CYnBXcml0ZUxhdGNoW19JXSA9IF9WOwkJCQkJCQkJCVwKLQkJCQl9CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQllbHNlCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAwOwkJCQkJCQkJCQkJXAotCQkJCQlSVE1QX0lPX1dSSVRFMzIoX0EsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJCQkJXAotCQkJCX0JCQkJCQkJCQkJCQkJCQkJXAotCQkJCWJyZWFrOwkJCQkJCQkJCQkJCQkJCVwKLQkJCX0JCQkJCQkJCQkJCQkJCQkJCVwKLQkJfQkJCQkJCQkJCQkJCQkJCQkJXAotCQllbHNlIGlmICghKChJU19SVDMwOTAoKF9BKSkgfHwgSVNfUlQzNTcyKChfQSkpIHx8IElTX1JUMzM5MCgoX0EpKSkgJiYgKChfQSktPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCVwKLQkJCSYmICgoX0EpLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKQlcCi0JCQkmJiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkpCVwKLQkJewkJCQkJCQkJCQkJCQkJCQkJXAotCQkJaWYgKF9BLT5BY2Nlc3NCQlBGYWlsQ291bnQgPiAyMCkJCQkJCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJQXNpY1Jlc2V0QkJQQWdlbnQoX0EpOwkJCQlcCi0JCQkJX0EtPkFjY2Vzc0JCUEZhaWxDb3VudCA9IDA7CQkJCQkJCQkJCQlcCi0JCQl9CQkJCQkJCQkJCQkJCQkJCQlcCi0JCQlmb3IgKEJ1c3lDbnQ9MDsgQnVzeUNudDxNQVhfQlVTWV9DT1VOVDsgQnVzeUNudCsrKQkJCQkJXAotCQkJewkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCVJUTVBfSU9fUkVBRDMyKF9BLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwkJCQlcCi0JCQkJaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpCQkJCQkJCQkJXAotCQkJCQljb250aW51ZTsJCQkJCQkJCQkJCQkJXAotCQkJCUJicENzci53b3JkID0gMDsJCQkJCQkJCQkJCQlcCi0JCQkJQmJwQ3NyLmZpZWxkLmZSZWFkID0gMDsJCQkJCQkJCQkJCVwKLQkJCQlCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOwkJCQkJCQkJCVwKLQkJCQlCYnBDc3IuZmllbGQuQnVzeSA9IDE7CQkJCQkJCQkJCQlcCi0JCQkJQmJwQ3NyLmZpZWxkLlZhbHVlID0gX1Y7CQkJCQkJCQkJCVwKLQkJCQlCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7CQkJCQkJCQkJCVwKLQkJCQlSVE1QX0lPX1dSSVRFMzIoX0EsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJCQkJXAotCQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KF9BLCAweDgwLCAweGZmLCAweDAsIDB4MCk7CQkJCQlcCi0JCQkJKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV0gPSBfVjsJCQkJCQkJCQlcCi0JCQkJYnJlYWs7CQkJCQkJCQkJCQkJCQkJXAotCQkJfQkJCQkJCQkJCQkJCQkJCQkJXAotCQl9CQkJCQkJCQkJCQkJCQkJCQlcCi0JCWVsc2UJCQkJCQkJCQkJXAotCQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JCQlEQkdQUklOVF9FUlIoKCIgIGJydDMweHhCYW5NY3VDbWQgPSAlZC4gV3JpdGUgQkJQICVkIFxuIiwgIChfQSktPmJydDMweHhCYW5NY3VDbWQsIChfSSkpKTsJXAotCQl9CQkJCQkJCQkJCQkJCQkJCQlcCi0JCWlmICgoQnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkgfHwgKChfQSktPmJQQ0ljbGtPZmYgPT0gVFJVRSkpCQkJXAotCQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JCQlpZiAoQnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkJCQkJCVwKLQkJCQkoX0EpLT5BY2Nlc3NCQlBGYWlsQ291bnQrKzsJCQkJCVwKLQkJCURCR1BSSU5UX0VSUigoIkJCUCB3cml0ZSBSJWQ9MHgleCBmYWlsLiBCdXN5Q250PSAlZC5iUENJY2xrT2ZmID0gJWQuIFxuIiwgX0ksIEJicENzci53b3JkLCBCdXN5Q250LCAoX0EpLT5iUENJY2xrT2ZmICkpOwlcCi0JCX0JCQkJCQkJCQkJCQkJCQkJCVwKLQl9CQkJCQkJCQkJCQkJCQkJCQkJXAotCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCi0JewkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJREJHUFJJTlRfRVJSKCgiKioqKioqIEJCUF9Xcml0ZV9MYXRjaCBCdWZmZXIgZXhjZWVkcyBtYXggYm91bmRyeSAqKioqKiogXG4iKSk7CVwKLQl9CQkJCQkJCQkJCQkJCQkJCQkJXAotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0KLQotI2lmZGVmIFJUMzB4eAotLy9OZWVkIHRvIGNvbGxlY3QgZWFjaCBhbnQncyByc3NpIGNvbmN1cnJlbnRseQotLy9yc3NpMSBpcyByZXBvcnQgdG8gcGFpcjIgQW50IGFuZCByc3MyIGlzIHJlcHJvdCB0byBwYWlyMSBBbnQgd2hlbiA0IEFudAotI2RlZmluZSBDT0xMRUNUX1JYX0FOVEVOTkFfQVZFUkFHRV9SU1NJKF9wQWQsIF9yc3NpMSwgX3Jzc2kyKQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCVNIT1JUCUF2Z1Jzc2k7CQkJCQkJCQkJCQkJCQkJXAotCVVDSEFSCVVzZWRBbnQ7CQkJCQkJCQkJCQkJCQkJXAotCWlmIChfcEFkLT5SeEFudC5FdmFsdWF0ZVBlcmlvZCA9PSAwKQkJCQkJCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJCQkJXAotCQlVc2VkQW50ID0gX3BBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQ7CQkJCQkJCVwKLQkJQXZnUnNzaSA9IF9wQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtVc2VkQW50XTsJCQkJCQlcCi0JCWlmIChBdmdSc3NpIDwgMCkJCQkJCQkJCQkJCQkJXAotCQkJQXZnUnNzaSA9IEF2Z1Jzc2kgLSAoQXZnUnNzaSA+PiAzKSArIF9yc3NpMTsJCQkJCVwKLQkJZWxzZQkJCQkJCQkJCQkJCQkJCQlcCi0JCQlBdmdSc3NpID0gX3Jzc2kxIDw8IDM7CQkJCQkJCQkJCQlcCi0JCV9wQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtVc2VkQW50XSA9IEF2Z1Jzc2k7CQkJCQkJXAotCX0JCQkJCQkJCQkJCQkJCQkJCQlcCi0JZWxzZQkJCQkJCQkJCQkJCQkJCQkJXAotCXsJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCVVzZWRBbnQgPSBfcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50OwkJCQkJCQlcCi0JCUF2Z1Jzc2kgPSBfcEFkLT5SeEFudC5QYWlyMUF2Z1Jzc2lbVXNlZEFudF07CQkJCQkJXAotCQlpZiAoKEF2Z1Jzc2kgPCAwKSAmJiAoX3BBZC0+UnhBbnQuRmlyc3RQa3RBcnJpdmVkV2hlbkV2YWx1YXRlKSkJCVwKLQkJCUF2Z1Jzc2kgPSBBdmdSc3NpIC0gKEF2Z1Jzc2kgPj4gMykgKyBfcnNzaTE7CQkJCQlcCi0JCWVsc2UJCQkJCQkJCQkJCQkJCQkJXAotCQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JCQlfcEFkLT5SeEFudC5GaXJzdFBrdEFycml2ZWRXaGVuRXZhbHVhdGUgPSBUUlVFOwkJCQkJXAotCQkJQXZnUnNzaSA9IF9yc3NpMSA8PCAzOwkJCQkJCQkJCQkJXAotCQl9CQkJCQkJCQkJCQkJCQkJCQlcCi0JCV9wQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtVc2VkQW50XSA9IEF2Z1Jzc2k7CQkJCQkJXAotCQlfcEFkLT5SeEFudC5SY3ZQa3ROdW1XaGVuRXZhbHVhdGUrKzsJCQkJCQkJCVwKLQl9CQkJCQkJCQkJCQkJCQkJCQkJXAotfQotCi0jZGVmaW5lIFJUTVBfQVNJQ19NTVBTX0RJU0FCTEUoX3BBZCkJCQkJCQkJXAotCWRvewkJCQkJCQkJCQkJCQkJCVwKLQkJVUNIQVIgX2JicERhdGE7CQkJCQkJCQkJCQlcCi0JCVVJTlQzMiBfbWFjRGF0YTsJCQkJCQkJCQkJCVwKLQkJLyogZGlzYWJsZSBNTVBTIEJCUCBjb250cm9sIHJlZ2lzdGVyICovCQkJCQkJXAotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoX3BBZCwgQkJQX1IzLCAmX2JicERhdGEpOwlcCi0JCV9iYnBEYXRhICY9IH4oMHgwNCk7CS8qYml0IDIqLwkJCQkJCQkJXAotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKF9wQWQsIEJCUF9SMywgX2JicERhdGEpOwlcCi0JCQkJCQkJCQkJCQkJCQkJXAotCQkvKiBkaXNhYmxlIE1NUFMgTUFDIGNvbnRyb2wgcmVnaXN0ZXIgKi8JCQkJCQlcCi0JCVJUTVBfSU9fUkVBRDMyKF9wQWQsIDB4MTIxMCwgJl9tYWNEYXRhKTsJCQkJXAotCQlfbWFjRGF0YSAmPSB+KDB4MDkpOwkvKmJpdCAwLCAzKi8JCQkJCQkJXAotCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgMHgxMjEwLCBfbWFjRGF0YSk7CQkJCVwKLQl9d2hpbGUoMCkKLQotCi0jZGVmaW5lIFJUTVBfQVNJQ19NTVBTX0VOQUJMRShfcEFkKQkJCQkJCQlcCi0JZG97CQkJCQkJCQkJCQkJCQkJXAotCQlVQ0hBUiBfYmJwRGF0YTsJCQkJCQkJCQkJCVwKLQkJVUlOVDMyIF9tYWNEYXRhOwkJCQkJCQkJCQkJXAotCQkvKiBlbmFibGUgTU1QUyBCQlAgY29udHJvbCByZWdpc3RlciAqLwkJCQkJCVwKLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9wQWQsIEJCUF9SMywgJl9iYnBEYXRhKTsJXAotCQlfYmJwRGF0YSB8PSAoMHgwNCk7CS8qYml0IDIqLwkJCQkJCQkJXAotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKF9wQWQsIEJCUF9SMywgX2JicERhdGEpOwlcCi0JCQkJCQkJCQkJCQkJCQkJXAotCQkvKiBlbmFibGUgTU1QUyBNQUMgY29udHJvbCByZWdpc3RlciAqLwkJCQkJCVwKLQkJUlRNUF9JT19SRUFEMzIoX3BBZCwgMHgxMjEwLCAmX21hY0RhdGEpOwkJCQlcCi0JCV9tYWNEYXRhIHw9ICgweDA5KTsJLypiaXQgMCwgMyovCQkJCQkJCVwKLQkJUlRNUF9JT19XUklURTMyKF9wQWQsIDB4MTIxMCwgX21hY0RhdGEpOwkJCQlcCi0JfXdoaWxlKDApCi0KLSNlbmRpZiAvLyBSVDMweHggLy8KLQotI2VuZGlmIC8vIF9fUlRNUF9QSFlfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfdGltZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF90aW1lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmFjMTI0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF90aW1lci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0JcnRtcF90aW1lci5oCi0KLSAgICBBYnN0cmFjdDoKLQlSYWxpbmsgV2lyZWxlc3MgRHJpdmVyIHRpbWVyIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBkZWxjYXJhdGlvbnMKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgICBXaGVuICAgICAgICAgICAgICAgIFdoYXQKLQktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCU5hbWUgICAgICAgICAgRGF0ZSAgICAgICAgICAgICAgICAgTW9kaWZpY2F0aW9uIGxvZ3MKLQlTaGlhbmcgVHUgICAgQXVnLTI4LTIwMDgJaW5pdCB2ZXJzaW9uCi0KLSovCi0KLSNpZm5kZWYgX19SVE1QX1RJTUVSX0hfXwotI2RlZmluZSAgX19SVE1QX1RJTUVSX0hfXwotCi0jaW5jbHVkZSAicnRtcF9vcy5oIgotCi0KLSNkZWZpbmUgREVDTEFSRV9USU1FUl9GVU5DVElPTihfZnVuYykJCQlcCi0Jdm9pZCBydG1wX3RpbWVyXyMjX2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKQotCi0jZGVmaW5lIEdFVF9USU1FUl9GVU5DVElPTihfZnVuYykJCQkJXAotCXJ0bXBfdGltZXJfIyNfZnVuYwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIFRpbWVyIFJlbGF0ZWQgTUFSQ08gLS0tLS0tLS0tLS0tLS0tKi8KLS8vIEluIHNvbWUgb3Mgb3IgY2hpcHNldCwgd2UgaGF2ZSBhIGxvdCBvZiB0aW1lciBmdW5jdGlvbnMgYW5kIHdpbGwgcmVhZC93cml0ZSByZWdpc3RlciwKLS8vICAgaXQncyBub3QgYWxsb3dlZCBpbiBMaW51eCBVU0Igc3ViLXN5c3RlbSB0byBkbyBpdCAoIGJlY2F1c2Ugb2Ygc2xlZXAgaXNzdWUgd2hlbgotLy8gIHN1Ym1pdCB0byBjdHJsIHBpcGUpLiBTbyB3ZSBuZWVkIGEgd3JhcHBlciBmdW5jdGlvbiB0byB0YWtlIGNhcmUgaXQuCi0KLSNpZmRlZiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVAotdHlwZWRlZiBWT0lEICgqUlRNUF9USU1FUl9UQVNLX0hBTkRMRSkoCi0JSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMxLAotCUlOICBQVk9JRCAgIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiAgUFZPSUQgICBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMzKTsKLSNlbmRpZiAvLyBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLwotCi10eXBlZGVmIHN0cnVjdCAgX1JBTElOS19USU1FUl9TVFJVQ1QgICAgewotCVJUTVBfT1NfVElNRVIJCVRpbWVyT2JqOyAgICAgICAvLyBOZGlzIFRpbWVyIG9iamVjdAotCUJPT0xFQU4JCQkJVmFsaWQ7CQkJLy8gU2V0IHRvIFRydWUgd2hlbiBjYWxsIFJUTVBJbml0VGltZXIKLQlCT09MRUFOCQkJCVN0YXRlOyAgICAgICAgICAvLyBUcnVlIGlmIHRpbWVyIGNhbmNlbGxlZAotCUJPT0xFQU4JCQkJUGVyaW9kaWNUeXBlOwkvLyBUcnVlIGlmIHRpbWVyIGlzIHBlcmlvZGljIHRpbWVyCi0JQk9PTEVBTgkJCQlSZXBlYXQ7ICAgICAgICAgLy8gVHJ1ZSBpZiBwZXJpb2RpYyB0aW1lcgotCVVMT05HCQkJCVRpbWVyVmFsdWU7ICAgICAvLyBUaW1lciB2YWx1ZSBpbiBtaWxsaXNlY29uZHMKLQlVTE9ORwkJCQljb29raWU7CQkJLy8gb3Mgc3BlY2lmaWMgb2JqZWN0Ci0jaWZkZWYgUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQKLQlSVE1QX1RJTUVSX1RBU0tfSEFORExFCWhhbmRsZTsKLQl2b2lkCQkJCQkqcEFkOwotI2VuZGlmIC8vIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vCi19UkFMSU5LX1RJTUVSX1NUUlVDVCwgKlBSQUxJTktfVElNRVJfU1RSVUNUOwotCi0KLSNpZmRlZiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVAotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfVElNRVJfVEFTS19FTlRSWV8KLXsKLQlSQUxJTktfVElNRVJfU1RSVUNUCQkJKnBSYVRpbWVyOwotCXN0cnVjdCBfUlRNUF9USU1FUl9UQVNLX0VOVFJZXwkqcE5leHQ7Ci19UlRNUF9USU1FUl9UQVNLX0VOVFJZOwotCi0KLSNkZWZpbmUgVElNRVJfUVVFVUVfU0laRV9NQVgJMTI4Ci10eXBlZGVmIHN0cnVjdCBfUlRNUF9USU1FUl9UQVNLX1FVRVVFXwotewotCXVuc2lnbmVkIGludAkJCQlzdGF0dXM7Ci0JdW5zaWduZWQgY2hhcgkJCQkqcFRpbWVyUVBvbGw7Ci0JUlRNUF9USU1FUl9UQVNLX0VOVFJZCSpwUVBvbGxGcmVlTGlzdDsKLQlSVE1QX1RJTUVSX1RBU0tfRU5UUlkJKnBRSGVhZDsKLQlSVE1QX1RJTUVSX1RBU0tfRU5UUlkJKnBRVGFpbDsKLX1SVE1QX1RJTUVSX1RBU0tfUVVFVUU7Ci0KLSNkZWZpbmUgQlVJTERfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJCQkJCQkJCVwKLXZvaWQgcnRtcF90aW1lcl8jI19mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkJCQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JUFJBTElOS19USU1FUl9TVFJVQ1QJX3BUaW1lciA9IChQUkFMSU5LX1RJTUVSX1NUUlVDVClkYXRhOwkJCQlcCi0JUlRNUF9USU1FUl9UQVNLX0VOVFJZCSpfcFFOb2RlOwkJCQkJCQkJCQlcCi0JUlRNUF9BREFQVEVSCQkJKl9wQWQ7CQkJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQkJCQkJCQkJXAotCV9wVGltZXItPmhhbmRsZSA9IF9mdW5jOwkJCQkJCQkJCQkJCQlcCi0JX3BBZCA9IChSVE1QX0FEQVBURVIgKilfcFRpbWVyLT5wQWQ7CQkJCQkJCQkJCVwKLQlfcFFOb2RlID0gUnRtcFRpbWVyUUluc2VydChfcEFkLCBfcFRpbWVyKTsJCQkJCQkJCVwKLQlpZiAoKF9wUU5vZGUgPT0gTlVMTCkgJiYgKF9wQWQtPlRpbWVyUS5zdGF0dXMgJiBSVE1QX1RBU0tfQ0FOX0RPX0lOU0VSVCkpCVwKLQkJUlRNUF9PU19BZGRfVGltZXIoJl9wVGltZXItPlRpbWVyT2JqLCBPU19IWik7CQkJCQkJCVwKLX0KLSNlbHNlCi0jZGVmaW5lIEJVSUxEX1RJTUVSX0ZVTkNUSU9OKF9mdW5jKQkJCQkJCQkJCQlcCi12b2lkIHJ0bXBfdGltZXJfIyNfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCQkJCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJCQkJXAotCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciA9IChQUkFMSU5LX1RJTUVSX1NUUlVDVCkgZGF0YTsJCQkJXAotCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQlfZnVuYyhOVUxMLCAoUFZPSUQpIHBUaW1lci0+Y29va2llLCBOVUxMLCBwVGltZXIpOwkJCQkJCQlcCi0JaWYgKHBUaW1lci0+UmVwZWF0KQkJCQkJCQkJCQkJCQkJXAotCQlSVE1QX09TX0FkZF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgcFRpbWVyLT5UaW1lclZhbHVlKTsJCQlcCi19Ci0jZW5kaWYgLy8gUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQgLy8KLQotCi1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKE1sbWVQZXJpb2RpY0V4ZWMpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihNbG1lUnNzaVJlcG9ydEV4ZWMpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCk7Ci1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEFQU0RQZXJpb2RpY0V4ZWMpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihBc2ljUmZUdW5pbmdFeGVjKTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblRpbWVvdXQpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihTY2FuVGltZW91dCk7Ci1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXNzb2NUaW1lb3V0KTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oUmVhc3NvY1RpbWVvdXQpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihMaW5rRG93bkV4ZWMpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihQc1BvbGxXYWtlRXhlYyk7Ci1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFJhZGlvT25FeGVjKTsKLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotREVDTEFSRV9USU1FUl9GVU5DVElPTihEbHNUaW1lb3V0QWN0aW9uKTsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCi0KLSNpZiBkZWZpbmVkKEFQX0xFRCkgfHwgZGVmaW5lZChTVEFfTEVEKQotREVDTEFSRV9USU1FUl9GVU5DVElPTihMZWRDdHJsTWFpbik7Ci0jZW5kaWYKLQotCi0KLSNlbmRpZiAvLyBfX1JUTVBfVElNRVJfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfdHlwZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX3R5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiNTcxZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfdHlwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgcnRtcF90eXBlLmgKLQotICAgIEFic3RyYWN0OgotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgTmFtZSAgICAgICAgRGF0ZSAgICAgICAgICAgIE1vZGlmaWNhdGlvbiBsb2dzCi0gICAgUGF1bCBMaW4gICAgMS0yLTIwMDQKLSovCi0KLSNpZm5kZWYgX19SVE1QX1RZUEVfSF9fCi0jZGVmaW5lIF9fUlRNUF9UWVBFX0hfXwotCi0KLSNkZWZpbmUgUEFDS0VEICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKLQotI2lmZGVmIExJTlVYCi0vLyBQdXQgcGxhdGZvcm0gZGVwZW5kZW50IGRlY2xhcmF0aW9uIGhlcmUKLS8vIEZvciBleGFtcGxlLCBsaW51eCB0eXBlIGRlZmluaXRpb24KLXR5cGVkZWYgdW5zaWduZWQgY2hhcgkJCVVJTlQ4OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJCVVJTlQxNjsKLXR5cGVkZWYgdW5zaWduZWQgaW50CQkJVUlOVDMyOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJCVVJTlQ2NDsKLXR5cGVkZWYgaW50CQkJCQlJTlQzMjsKLXR5cGVkZWYgbG9uZyBsb25nCQkJCUlOVDY0OwotI2VuZGlmIC8vIExJTlVYIC8vCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAqCQlQVUlOVDg7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICoJCVBVSU5UMTY7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAqCQkJUFVJTlQzMjsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICoJUFVJTlQ2NDsKLXR5cGVkZWYgaW50CSoJCQkJUElOVDMyOwotdHlwZWRlZiBsb25nIGxvbmcgKgkJCVBJTlQ2NDsKLQotLy8gbW9kaWZpZWQgZm9yIGZpeGluZyBjb21waWxlIHdhcm5pbmcgb24gU2lnbWEgODYzNCBwbGF0Zm9ybQotdHlwZWRlZiBjaGFyCQkJCQlTVFJJTkc7Ci10eXBlZGVmIHNpZ25lZCBjaGFyCQkJQ0hBUjsKLQotdHlwZWRlZiBzaWduZWQgc2hvcnQJCQlTSE9SVDsKLXR5cGVkZWYgc2lnbmVkIGludAkJCQlJTlQ7Ci10eXBlZGVmIHNpZ25lZCBsb25nCQkJTE9ORzsKLXR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZwkJTE9OR0xPTkc7Ci0KLQotI2lmZGVmIExJTlVYCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIJCQlVQ0hBUjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQJCQlVU0hPUlQ7Ci10eXBlZGVmIHVuc2lnbmVkIGludAkJCVVJTlQ7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcJCQlVTE9ORzsKLSNlbmRpZiAvLyBMSU5VWCAvLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJCVVMT05HTE9ORzsKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyCQkJQk9PTEVBTjsKLSNpZmRlZiBMSU5VWAotdHlwZWRlZiB2b2lkCQkJCQlWT0lEOwotI2VuZGlmIC8vIExJTlVYIC8vCi0KLXR5cGVkZWYgY2hhciAqCQkJCVBTVFJJTkc7Ci10eXBlZGVmIFZPSUQgKgkJCQlQVk9JRDsKLXR5cGVkZWYgQ0hBUiAqCQkJCVBDSEFSOwotdHlwZWRlZiBVQ0hBUiAqCQkJCQlQVUNIQVI7Ci10eXBlZGVmIFVTSE9SVCAqCQkJUFVTSE9SVDsKLXR5cGVkZWYgTE9ORyAqCQkJCVBMT05HOwotdHlwZWRlZiBVTE9ORyAqCQkJCVBVTE9ORzsKLXR5cGVkZWYgVUlOVCAqCQkJCVBVSU5UOwotCi10eXBlZGVmIHVuc2lnbmVkIGludAkJCU5ESVNfTUVESUFfU1RBVEU7Ci0KLXR5cGVkZWYgdW5pb24gX0xBUkdFX0lOVEVHRVIgewotICAgIHN0cnVjdCB7Ci0gICAgICAgIFVJTlQgTG93UGFydDsKLSAgICAgICAgSU5UMzIgSGlnaFBhcnQ7Ci0gICAgfSB1OwotICAgIElOVDY0IFF1YWRQYXJ0OwotfSBMQVJHRV9JTlRFR0VSOwotCi0KLS8vCi0vLyBSZWdpc3RlciBzZXQgcGFpciBmb3IgaW5pdGlhbHphdGlvbiByZWdpc3RlciBzZXQgZGVmaW5pdGlvbgotLy8KLXR5cGVkZWYgc3RydWN0ICBfUlRNUF9SRUdfUEFJUgotewotCVVMT05HICAgUmVnaXN0ZXI7Ci0JVUxPTkcgICBWYWx1ZTsKLX0gUlRNUF9SRUdfUEFJUiwgKlBSVE1QX1JFR19QQUlSOwotCi10eXBlZGVmIHN0cnVjdCAgX1JFR19QQUlSCi17Ci0JVUNIQVIgICBSZWdpc3RlcjsKLQlVQ0hBUiAgIFZhbHVlOwotfSBSRUdfUEFJUiwgKlBSRUdfUEFJUjsKLQotLy8KLS8vIFJlZ2lzdGVyIHNldCBwYWlyIGZvciBpbml0aWFsemF0aW9uIHJlZ2lzdGVyIHNldCBkZWZpbml0aW9uCi0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX1JGX1JFR1MKLXsKLQlVQ0hBUiAgIENoYW5uZWw7Ci0JVUxPTkcgICBSMTsKLQlVTE9ORyAgIFIyOwotCVVMT05HICAgUjM7Ci0JVUxPTkcgICBSNDsKLX0gUlRNUF9SRl9SRUdTLCAqUFJUTVBfUkZfUkVHUzsKLQotdHlwZWRlZiBzdHJ1Y3QgX0ZSRVFVRU5DWV9JVEVNIHsKLQlVQ0hBUglDaGFubmVsOwotCVVDSEFSCU47Ci0JVUNIQVIJUjsKLQlVQ0hBUglLOwotfSBGUkVRVUVOQ1lfSVRFTSwgKlBGUkVRVUVOQ1lfSVRFTTsKLQotCi10eXBlZGVmIGludAkJCQlOVFNUQVRVUzsKLQotCi0jZGVmaW5lIFNUQVRVU19TVUNDRVNTCQkJCTB4MDAKLSNkZWZpbmUgU1RBVFVTX1VOU1VDQ0VTU0ZVTAkJMHgwMQotCi0jZW5kaWYgIC8vIF9fUlRNUF9UWVBFX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zcGVjdHJ1bS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zcGVjdHJ1bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTliYWU1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3BlY3RydW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9fU1BFQ1RSVU1fSF9fCi0jZGVmaW5lIF9fU1BFQ1RSVU1fSF9fCi0KLSNpbmNsdWRlICJydG1wX3R5cGUuaCIKLSNpbmNsdWRlICJzcGVjdHJ1bV9kZWYuaCIKLQotCi1DSEFSIFJUTVBfR2V0VHhQd3IoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gSFRUUkFOU01JVF9TRVRUSU5HIEhUVHhNb2RlKTsKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlQcmVwYXJlIE1lYXN1cmVtZW50IHJlcXVlc3QgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KLQkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KLQotCVBhcmFtZXRyczoKLQkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNYWtlTWVhc3VyZW1lbnRSZXFGcmFtZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBPdXRCdWZmZXIsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4sCi0JSU4gVUlOVDggVG90YWxMZW4sCi0JSU4gVUlOVDggQ2F0ZWdvcnksCi0JSU4gVUlOVDggQWN0aW9uLAotCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKLQlJTiBVSU5UOCBOdW1PZlJlcGV0aXRpb25zKTsKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlQcmVwYXJlIE1lYXN1cmVtZW50IHJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgotCi0JUGFyYW1ldHJzOgotCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVJTlQ4IERpYWxvZ1Rva2VuLAotCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKLQlJTiBVSU5UOCBSZXBvcnRJbmZvTGVuLAotCUlOIFBVSU5UOCBwUmVwb3J0SW5mbyk7Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJUHJlcGFyZSBUUEMgUmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgotCi0JUGFyYW1ldHJzOgotCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEVucXVldWVUUENSZXEoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVQ0hBUiBEaWFsb2dUb2tlbik7Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJUHJlcGFyZSBUUEMgUmVwb3J0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCi0JCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgRW5xdWV1ZVRQQ1JlcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVJTlQ4IERpYWxvZ1Rva2VuLAotCUlOIFVJTlQ4IFR4UHdyLAotCUlOIFVJTlQ4IExpbmtNYXJnaW4pOwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVByZXBhcmUgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCi0JCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCi0JCTIuIENoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBtb2RlLgotCQkyLiBhIE5ldyBzZWxlY3RlZCBjaGFubmVsLgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEVucXVldWVDaFN3QW5uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gVUlOVDggQ2hTd01vZGUsCi0JSU4gVUlOVDggTmV3Q2gpOwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVNwZWN0cnVuIGFjdGlvbiBmcmFtZXMgSGFuZGxlciBzdWNoIGFzIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50LAotCQltZWFzdXJlbWVudCByZXBvcnQsIG1lYXN1cmVtZW50IHJlcXVlc3QgYWN0aW9ucyBmcmFtZXMuCi0KLQlQYXJhbWV0cnM6Ci0JCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBQZWVyU3BlY3RydW1BY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JUGFyYW1ldHJzOgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1JTlQgU2V0X01lYXN1cmVSZXFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9UcGNSZXFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9Qd3JDb25zdHJhaW50KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi0KLVZPSUQgTWVhc3VyZVJlcVRhYkluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIE1lYXN1cmVSZXFUYWJFeGl0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotUE1FQVNVUkVfUkVRX0VOVFJZIE1lYXN1cmVSZXFMb29rVXAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUlOVDgJCQlEaWFsb2dUb2tlbik7Ci0KLVBNRUFTVVJFX1JFUV9FTlRSWSBNZWFzdXJlUmVxSW5zZXJ0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pOwotCi1WT0lEIE1lYXN1cmVSZXFEZWxldGUoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUlOVDgJCQlEaWFsb2dUb2tlbik7Ci0KLVZPSUQgSW5zZXJ0Q2hhbm5lbFJlcElFKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFBTVFJJTkcgcENvdW50cnksCi0JSU4gVUlOVDggUmVndWxhdG9yeUNsYXNzKTsKLQotVk9JRCBJbnNlcnRUcGNSZXBvcnRJRSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBUeFB3ciwKLQlJTiBVSU5UOCBMaW5rTWFyZ2luKTsKLQotVk9JRCBJbnNlcnREaWFsb2dUb2tlbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBEaWFsb2dUb2tlbik7Ci0KLVZPSUQgVHBjUmVxVGFiSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgVHBjUmVxVGFiRXhpdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgTm90aWZ5Q2hTd0FublRvUGVlckFQcygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcFJBLAotCUlOIFBVQ0hBUiBwVEEsCi0JSU4gVUlOVDggQ2hTd01vZGUsCi0JSU4gVUlOVDggQ2hhbm5lbCk7Ci0KLVZPSUQgUmd1Q2xhc3NfQnVpbGRCY25DaExpc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwQnVmLAotCU9VVAlQVUxPTkcgcEJ1Zkxlbik7Ci0jZW5kaWYgLy8gX19TUEVDVFJVTV9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3BlY3RydW1fZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3NwZWN0cnVtX2RlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzg5YjA5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3BlY3RydW1fZGVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLQlzcGVjdHJ1bV9kZWYuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgSGFuZGxlIGFzc29jaWF0aW9uIHJlbGF0ZWQgcmVxdWVzdHMgZWl0aGVyIGZyb20gV1NUQSBvciBmcm9tIGxvY2FsIE1MTUUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlGb25jaGkgV3UgICAgMjAwOAkJICAgY3JlYXRlZCBmb3IgODAyLjExaAotICovCi0KLSNpZm5kZWYgX19TUEVDVFJVTV9ERUZfSF9fCi0jZGVmaW5lIF9fU1BFQ1RSVU1fREVGX0hfXwotCi0KLSNkZWZpbmUgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFCQkzMgotI2RlZmluZSBNQVhfSEFTSF9NRUFTVVJFX1JFUV9UQUJfU0laRQlNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUKLQotI2RlZmluZSBNQVhfVFBDX1JFUV9UQUJfU0laRQkJCTMyCi0jZGVmaW5lIE1BWF9IQVNIX1RQQ19SRVFfVEFCX1NJWkUJCU1BWF9UUENfUkVRX1RBQl9TSVpFCi0KLSNkZWZpbmUgTUlOX1JDVl9QV1IJCQkJMTAwCQkvKiBOZWdhdGl2ZSB2YWx1ZSAoKGRCbSkgKi8KLQotI2RlZmluZSBUUENfUkVRX0FHRV9PVVQJCQk1MDAJCS8qIG1zICovCi0jZGVmaW5lIE1RX1JFUV9BR0VfT1VUCQkJNTAwCQkvKiBtcyAqLwotCi0jZGVmaW5lIFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKF9EaWFsb2dUb2tlbikJKChfRGlhbG9nVG9rZW4pICUgTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRSkKLSNkZWZpbmUgTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChfRGlhbG9nVG9rZW4pCQkoKF9EaWFsb2dUb2tlbikgJSBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUpCi0KLXR5cGVkZWYgc3RydWN0IF9NRUFTVVJFX1JFUV9FTlRSWQotewotCXN0cnVjdCBfTUVBU1VSRV9SRVFfRU5UUlkgKnBOZXh0OwotCVVMT05HIGxhc3RUaW1lOwotCUJPT0xFQU4JVmFsaWQ7Ci0JVUlOVDggRGlhbG9nVG9rZW47Ci0JVUlOVDggTWVhc3VyZURpYWxvZ1Rva2VuWzNdOwkvLyAwOmJhc2ljIG1lYXN1cmUsIDE6IENDQSBtZWFzdXJlLCAyOiBSUElfSGlzdG9ncmFtIG1lYXN1cmUuCi19IE1FQVNVUkVfUkVRX0VOVFJZLCAqUE1FQVNVUkVfUkVRX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCBfTUVBU1VSRV9SRVFfVEFCCi17Ci0JVUNIQVIgU2l6ZTsKLQlQTUVBU1VSRV9SRVFfRU5UUlkgSGFzaFtNQVhfSEFTSF9NRUFTVVJFX1JFUV9UQUJfU0laRV07Ci0JTUVBU1VSRV9SRVFfRU5UUlkgQ29udGVudFtNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkVdOwotfSBNRUFTVVJFX1JFUV9UQUIsICpQTUVBU1VSRV9SRVFfVEFCOwotCi10eXBlZGVmIHN0cnVjdCBfVFBDX1JFUV9FTlRSWQotewotCXN0cnVjdCBfVFBDX1JFUV9FTlRSWSAqcE5leHQ7Ci0JVUxPTkcgbGFzdFRpbWU7Ci0JQk9PTEVBTiBWYWxpZDsKLQlVSU5UOCBEaWFsb2dUb2tlbjsKLX0gVFBDX1JFUV9FTlRSWSwgKlBUUENfUkVRX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCBfVFBDX1JFUV9UQUIKLXsKLQlVQ0hBUiBTaXplOwotCVBUUENfUkVRX0VOVFJZIEhhc2hbTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRV07Ci0JVFBDX1JFUV9FTlRSWSBDb250ZW50W01BWF9UUENfUkVRX1RBQl9TSVpFXTsKLX0gVFBDX1JFUV9UQUIsICpQVFBDX1JFUV9UQUI7Ci0KLQotLyogVGhlIHJlZ3VsYXRvcnkgaW5mb3JtYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0IF9ET1QxMV9DSEFOTkVMX1NFVAotewotCVVDSEFSIE51bWJlck9mQ2hhbm5lbHM7Ci0JVUlOVDggTWF4VHhQd3I7Ci0JVUNIQVIgQ2hhbm5lbExpc3RbMTZdOwotfSBET1QxMV9DSEFOTkVMX1NFVCwgKlBET1QxMV9DSEFOTkVMX1NFVDsKLQotdHlwZWRlZiBzdHJ1Y3QgX0RPVDExX1JFR1VMQVRPUllfSU5GT1JNQVRJT04KLXsKLQlVQ0hBUiBSZWd1bGF0b3J5Q2xhc3M7Ci0JRE9UMTFfQ0hBTk5FTF9TRVQgQ2hhbm5lbFNldDsKLX0gRE9UMTFfUkVHVUxBVE9SWV9JTkZPUk1BVElPTiwgKlBET1QxMV9SRUdVTEFUT1JZX0lORk9STUFUSU9OOwotCi0KLQotI2RlZmluZSBSTV9UUENfUkVRCQkJCTAKLSNkZWZpbmUgUk1fTUVBU1VSRV9SRVEJCQkxCi0KLSNkZWZpbmUgUk1fQkFTSUMJCQkJMAotI2RlZmluZSBSTV9DQ0EJCQkJCTEKLSNkZWZpbmUgUk1fUlBJX0hJU1RPR1JBTQkJMgotI2RlZmluZSBSTV9DSF9MT0FECQkJCTMKLSNkZWZpbmUgUk1fTk9JU0VfSElTVE9HUkFNCQk0Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9UUENfUkVQT1JUX0lORk8KLXsKLQlVSU5UOCBUeFB3cjsKLQlVSU5UOCBMaW5rTWFyZ2luOwotfSBUUENfUkVQT1JUX0lORk8sICpQVFBDX1JFUE9SVF9JTkZPOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0NIX1NXX0FOTl9JTkZPCi17Ci0JVUlOVDggQ2hTd01vZGU7Ci0JVUlOVDggQ2hhbm5lbDsKLQlVSU5UOCBDaFN3Q250OwotfSBDSF9TV19BTk5fSU5GTywgKlBDSF9TV19BTk5fSU5GTzsKLQotdHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfUkVRX01PREUKLXsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0Jc3RydWN0IFBBQ0tFRAotCXsKLQotCQlVSU5UOCA6MzsKLQkJVUlOVDggRHVyYXRpb25NYW5kYXRvcnk6MTsKLQkJVUlOVDggUmVwb3J0OjE7Ci0JCVVJTlQ4IFJlcXVlc3Q6MTsKLQkJVUlOVDggRW5hYmxlOjE7Ci0JCVVJTlQ4IFBhcmFsbGVsOjE7Ci0JfSBmaWVsZDsKLSNlbHNlCi0Jc3RydWN0IFBBQ0tFRAotCXsKLQkJVUlOVDggUGFyYWxsZWw6MTsKLQkJVUlOVDggRW5hYmxlOjE7Ci0JCVVJTlQ4IFJlcXVlc3Q6MTsKLQkJVUlOVDggUmVwb3J0OjE7Ci0JCVVJTlQ4IER1cmF0aW9uTWFuZGF0b3J5OjE7Ci0JCVVJTlQ4IDozOwotCX0gZmllbGQ7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCVVJTlQ4IHdvcmQ7Ci19IE1FQVNVUkVfUkVRX01PREUsICpQTUVBU1VSRV9SRVFfTU9ERTsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX1JFUQotewotCVVJTlQ4IENoTnVtOwotCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOwotCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247Ci19IE1FQVNVUkVfUkVRLCAqUE1FQVNVUkVfUkVROwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUkVRX0lORk8KLXsKLQlVSU5UOCBUb2tlbjsKLQlNRUFTVVJFX1JFUV9NT0RFIFJlcU1vZGU7Ci0JVUlOVDggUmVxVHlwZTsKLQlVSU5UOCBPY3RbMF07Ci19IE1FQVNVUkVfUkVRX0lORk8sICpQTUVBU1VSRV9SRVFfSU5GTzsKLQotdHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfQkFTSUNfUkVQT1JUX01BUAotewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlzdHJ1Y3QgUEFDS0VECi0JewotCQlVSU5UOCBSZXY6MzsKLQotCQlVSU5UOCBVbm1lYXN1cmU6MTsKLQkJVUlOVDggUmFkYXI6MTsKLQkJVUlOVDggVW5pZGVudGlmaWVkU2lnbmFsOjE7Ci0JCVVJTlQ4IE9mZG1QcmVhbWJsZToxOwotCQlVSU5UOCBCU1M6MTsKLQl9IGZpZWxkOwotI2Vsc2UKLQlzdHJ1Y3QgUEFDS0VECi0JewotCQlVSU5UOCBCU1M6MTsKLQotCQlVSU5UOCBPZmRtUHJlYW1ibGU6MTsKLQkJVUlOVDggVW5pZGVudGlmaWVkU2lnbmFsOjE7Ci0JCVVJTlQ4IFJhZGFyOjE7Ci0JCVVJTlQ4IFVubWVhc3VyZToxOwotCQlVSU5UOCBSZXY6MzsKLQl9IGZpZWxkOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQlVSU5UOCB3b3JkOwotfSBNRUFTVVJFX0JBU0lDX1JFUE9SVF9NQVAsICpQTUVBU1VSRV9CQVNJQ19SRVBPUlRfTUFQOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfQkFTSUNfUkVQT1JUCi17Ci0JVUlOVDggQ2hOdW07Ci0JVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7Ci0JVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKLQlNRUFTVVJFX0JBU0lDX1JFUE9SVF9NQVAgTWFwOwotfSBNRUFTVVJFX0JBU0lDX1JFUE9SVCwgKlBNRUFTVVJFX0JBU0lDX1JFUE9SVDsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX0NDQV9SRVBPUlQKLXsKLQlVSU5UOCBDaE51bTsKLQlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKLQlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOwotCVVJTlQ4IENDQV9CdXN5X0ZyYWN0aW9uOwotfSBNRUFTVVJFX0NDQV9SRVBPUlQsICpQTUVBU1VSRV9DQ0FfUkVQT1JUOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUlBJX1JFUE9SVAotewotCVVJTlQ4IENoTnVtOwotCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOwotCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247Ci0JVUlOVDggUlBJX0RlbnNpdHlbOF07Ci19IE1FQVNVUkVfUlBJX1JFUE9SVCwgKlBNRUFTVVJFX1JQSV9SRVBPUlQ7Ci0KLXR5cGVkZWYgdW5pb24gUEFDS0VEIF9NRUFTVVJFX1JFUE9SVF9NT0RFCi17Ci0Jc3RydWN0IFBBQ0tFRAotCXsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCVVJTlQ4IFJldjo1OwotCQlVSU5UOCBSZWZ1c2VkOjE7Ci0JCVVJTlQ4IEluY2FwYWJsZToxOwotCQlVSU5UOCBMYXRlOjE7Ci0jZWxzZQotCQlVSU5UOCBMYXRlOjE7Ci0JCVVJTlQ4IEluY2FwYWJsZToxOwotCQlVSU5UOCBSZWZ1c2VkOjE7Ci0JCVVJTlQ4IFJldjo1OwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQl9IGZpZWxkOwotCVVJTlQ4IHdvcmQ7Ci19IE1FQVNVUkVfUkVQT1JUX01PREUsICpQTUVBU1VSRV9SRVBPUlRfTU9ERTsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX1JFUE9SVF9JTkZPCi17Ci0JVUlOVDggVG9rZW47Ci0JVUlOVDggUmVwb3J0TW9kZTsKLQlVSU5UOCBSZXBvcnRUeXBlOwotCVVJTlQ4IE9jdGVjdFswXTsKLX0gTUVBU1VSRV9SRVBPUlRfSU5GTywgKlBNRUFTVVJFX1JFUE9SVF9JTkZPOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1FVSUVUX0lORk8KLXsKLQlVSU5UOCBRdWlldENudDsKLQlVSU5UOCBRdWlldFBlcmlvZDsKLQlVSU5UMTYgUXVpZXREdXJhdGlvbjsKLQlVSU5UMTYgUXVpZXRPZmZzZXQ7Ci19IFFVSUVUX0lORk8sICpQUVVJRVRfSU5GTzsKLQotI2VuZGlmIC8vIF9fU1BFQ1RSVU1fREVGX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvYXNzb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL2Fzc29jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMmVkMmIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvYXNzb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NzMgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlhc3NvYy5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JSm9obgkJMjAwNC05LTMJCXBvcnRpbmcgZnJvbSBSVDI1MDAKLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi1VQ0hBUglDaXBoZXJXcGFUZW1wbGF0ZVtdID0gewotCQkweGRkLAkJCQkJLy8gV1BBIElFCi0JCTB4MTYsCQkJCQkvLyBMZW5ndGgKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCi0JCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0Ci0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDUwLCAweGYyLCAweDAxCS8vIGF1dGhlbnRpY2F0aW9uCi0JCX07Ci0KLVVDSEFSCUNpcGhlcldwYTJUZW1wbGF0ZVtdID0gewotCQkweDMwLAkJCQkJLy8gUlNOIElFCi0JCTB4MTQsCQkJCQkvLyBMZW5ndGgKLQkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgotCQkweDAwLCAweDBmLCAweGFjLCAweDAyLAkvLyBncm91cCBjaXBoZXIsIFRLSVAKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIHBhaXJ3aXNlCi0JCTB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCS8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDBmLCAweGFjLCAweDAyLAkvLyBhdXRoZW50aWNhdGlvbgotCQkweDAwLCAweDAwLAkJCQkvLyBSU04gY2FwYWJpbGl0eQotCQl9OwotCi1VQ0hBUglDY3gySWVJbmZvW10gPSB7IDB4MDAsIDB4NDAsIDB4OTYsIDB4MDMsIDB4MDJ9OwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCWFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUgaW5pdCwgaW5jbHVkaW5nIHN0YXRlIHRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKLQlQYXJhbWV0ZXJzOgotCQlTIC0gcG9pbnRlciB0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNzb2NTdGF0ZU1hY2hpbmVJbml0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICBTVEFURV9NQUNISU5FICpTLAotCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKLXsKLQlTdGF0ZU1hY2hpbmVJbml0KFMsIFRyYW5zLCBNQVhfQVNTT0NfU1RBVEUsIE1BWF9BU1NPQ19NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQVNTT0NfSURMRSwgQVNTT0NfTUFDSElORV9CQVNFKTsKLQotCS8vIGZpcnN0IGNvbHVtbgotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19JRExFLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUFzc29jUmVxQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfUkVBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVJlYXNzb2NSZXFBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19JRExFLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURpc2Fzc29jUmVxQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX1BFRVJfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEaXNhc3NvY0FjdGlvbik7Ci0KLQkvLyBzZWNvbmQgY29sdW1uCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5SZWFzc29jKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBc3NvY1JzcEFjdGlvbik7Ci0JLy8KLQkvLyBQYXRjaCAzQ29tIEFQIE1PZGU6M0NSV0U0NTRHNzIKLQkvLyBXZSBzZW5kIEFzc29jIHJlcXVlc3QgZnJhbWUgdG8gdGhpcyBBUCwgaXQgYWx3YXlzIHNlbmQgUmVhc3NvYyBSc3Agbm90IEFzc29jaWF0ZSBSc3AuCi0JLy8KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX1JFQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBc3NvY1JzcEFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfQVNTT0NfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylBc3NvY1RpbWVvdXRBY3Rpb24pOwotCi0JLy8gdGhpcmQgY29sdW1uCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXNzb2MpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyk7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEaXNhc3NvY0FjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX1JFQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJSZWFzc29jUnNwQWN0aW9uKTsKLQkvLwotCS8vIFBhdGNoLCBBUCBkb2Vzbid0IHNlbmQgUmVhc3NvY2lhdGUgUnNwIGZyYW1lIHRvIFN0YXRpb24uCi0JLy8KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJSZWFzc29jUnNwQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1JFQVNTT0NfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylSZWFzc29jVGltZW91dEFjdGlvbik7Ci0KLQkvLyBmb3VydGggY29sdW1uCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5SZWFzc29jKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX0RJU0FTU09DX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpRGlzYXNzb2NUaW1lb3V0QWN0aW9uKTsKLQotCS8vIGluaXRpYWxpemUgdGhlIHRpbWVyCi0JUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEFzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOwotCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFJlYXNzb2NUaW1lb3V0KSwgcEFkLCBGQUxTRSk7Ci0JUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKERpc2Fzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUFzc29jaWF0aW9uIHRpbWVvdXQgcHJvY2VkdXJlLiBBZnRlciBhc3NvY2lhdGlvbiB0aW1lb3V0LCB0aGlzIGZ1bmN0aW9uCi0JCXdpbGwgYmUgY2FsbGVkIGFuZCBpdCB3aWxsIHB1dCBhIG1lc3NhZ2UgaW50byB0aGUgTUxNRSBxdWV1ZQotCVBhcmFtZXRlcnM6Ci0JCVN0YW5kYXJkIHRpbWVyIHBhcmFtZXRlcnMKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc3NvY1RpbWVvdXQoSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCQkJCSBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JCQkJIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQkJCQkgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybjsKLQotCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX1RJTUVPVVQsIDAsIE5VTEwpOwotCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJUmVhc3NvY2lhdGlvbiB0aW1lb3V0IHByb2NlZHVyZS4gQWZ0ZXIgcmVhc3NvY2lhdGlvbiB0aW1lb3V0LCB0aGlzCi0JCWZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFuZCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKLQlQYXJhbWV0ZXJzOgotCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUmVhc3NvY1RpbWVvdXQoSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCQkJCQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQkJCQkJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybjsKLQotCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfVElNRU9VVCwgMCwgTlVMTCk7Ci0JUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlEaXNhc3NvY2lhdGlvbiB0aW1lb3V0IHByb2NlZHVyZS4gQWZ0ZXIgZGlzYXNzb2NpYXRpb24gdGltZW91dCwgdGhpcwotCQlmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhbmQgcHV0IGEgbWVzc2FnZSBpbnRvIHRoZSBNTE1FIHF1ZXVlCi0JUGFyYW1ldGVyczoKLQkJU3RhbmRhcmQgdGltZXIgcGFyYW1ldGVycwotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIERpc2Fzc29jVGltZW91dChJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JCQkJCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQkJCQkJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCQkJCQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJcmV0dXJuOwotCi0JTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfRElTQVNTT0NfVElNRU9VVCwgMCwgTlVMTCk7Ci0JUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQltbG1lIGFzc29jIHJlcSBoYW5kbGluZyBwcm9jZWR1cmUKLQlQYXJhbWV0ZXJzOgotCQlBZGFwdGVyIC0gQWRhcHRlciBwb2ludGVyCi0JCUVsZW0gLSBNTE1FIFF1ZXVlIEVsZW1lbnQKLQlQcmU6Ci0JCXRoZSBzdGF0aW9uIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgYW5kIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZSBjb25maWcKLQkJCS0jIFNTSUQKLQkJCS0jIHN1cHBvcnRlZCByYXRlcyBhbmQgdGhlaXIgbGVuZ3RoCi0JCQktIyBsaXN0ZW4gaW50ZXJ2YWwgKEFkYXB0ZXItPlN0YUNmZy5kZWZhdWx0X2xpc3Rlbl9jb3VudCkKLQkJCS0jIFRyYW5zbWl0IHBvd2VyICAoQWRhcHRlci0+U3RhQ2ZnLnR4X3Bvd2VyKQotCVBvc3QgIDoKLQkJLSMgQW4gYXNzb2NpYXRpb24gcmVxdWVzdCBmcmFtZSBpcyBnZW5lcmF0ZWQgYW5kIHNlbnQgdG8gdGhlIGFpcgotCQktIyBBc3NvY2lhdGlvbiB0aW1lciBzdGFydHMKLQkJLSMgQXNzb2NpYXRpb24gc3RhdGUgLT4gQVNTT0NfV0FJVF9SU1AKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lQXNzb2NSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVDSEFSCQkJQXBBZGRyWzZdOwotCUhFQURFUl84MDJfMTEJQXNzb2NIZHI7Ci0JVUNIQVIJCQlXbWVJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDB4MDcsIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDB9OwotCVVTSE9SVAkJCUxpc3RlbkludHY7Ci0JVUxPTkcJCQlUaW1lb3V0OwotCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvOwotCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKLQlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUwkJTlN0YXR1czsKLQlVTE9ORwkJCUZyYW1lTGVuID0gMDsKLQlVTE9ORwkJCXRtcDsKLQlVU0hPUlQJCQlWYXJJZXNPZmZzZXQ7Ci0JVVNIT1JUCQkJU3RhdHVzOwotCi0JLy8gQmxvY2sgYWxsIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kCi0JaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID09IFRSVUUpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIEJsb2NrIEFzc29jIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIikpOwotCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7Ci0JCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKLQl9Ci0JLy8gY2hlY2sgc2FuaXR5IGZpcnN0Ci0JZWxzZSBpZiAoTWxtZUFzc29jUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFwQWRkciwgJkNhcGFiaWxpdHlJbmZvLCAmVGltZW91dCwgJkxpc3RlbkludHYpKQotCXsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQkJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIEFwQWRkcik7Ci0KLQkJLy8gR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKLQkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBU1NPQyAtIE1sbWVBc3NvY1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7Ci0JCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7Ci0JCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBBZGQgYnkgSmFtZXMgMDMvMDYvMjcKLQkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTik7Ci0JCS8vIEFzc29jaWF0aW9uIGRvbid0IG5lZWQgdG8gcmVwb3J0IE1BQyBhZGRyZXNzCi0JCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5BdmFpbGFibGVSZXF1ZXN0Rml4ZWRJRXMgPQotCQkJTkRJU184MDJfMTFfQUlfUkVRRklfQ0FQQUJJTElUSUVTIHwgTkRJU184MDJfMTFfQUlfUkVRRklfTElTVEVOSU5URVJWQUw7Ci0JCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5SZXF1ZXN0Rml4ZWRJRXMuQ2FwYWJpbGl0aWVzID0gQ2FwYWJpbGl0eUluZm87Ci0JCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5SZXF1ZXN0Rml4ZWRJRXMuTGlzdGVuSW50ZXJ2YWwgPSBMaXN0ZW5JbnR2OwotCQkvLyBPbmx5IHJlYXNzb2NpYXRlIG5lZWQgdGhpcwotCQkvL0NPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5DdXJyZW50QVBBZGRyZXNzLCBBcEFkZHIpOwotCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uT2Zmc2V0UmVxdWVzdElFcyA9IHNpemVvZihORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTik7Ci0KLSAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzLCBNQVhfVklFX0xFTik7Ci0JCS8vIEZpcnN0IGFkZCBTU0lECi0JCVZhckllc09mZnNldCA9IDA7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJlNzaWRJZSwgMSk7Ci0JCVZhckllc09mZnNldCArPSAxOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZwQWQtPk1sbWVBdXguU3NpZExlbiwgMSk7Ci0JCVZhckllc09mZnNldCArPSAxOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7Ci0JCVZhckllc09mZnNldCArPSBwQWQtPk1sbWVBdXguU3NpZExlbjsKLQotCQkvLyBTZWNvbmQgYWRkIFN1cHBvcnRlZCByYXRlcwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZTdXBSYXRlSWUsIDEpOwotCQlWYXJJZXNPZmZzZXQgKz0gMTsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sIDEpOwotCQlWYXJJZXNPZmZzZXQgKz0gMTsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4pOwotCQlWYXJJZXNPZmZzZXQgKz0gcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW47Ci0JCS8vIEVuZCBBZGQgYnkgSmFtZXMKLQotICAgICAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkgJiYKLSAgICAgICAgICAgIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSBUUlVFKSkKLSAgICAgICAgICAgIENhcGFiaWxpdHlJbmZvIHw9IDB4MDEwMDsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFNlbmQgQVNTT0MgcmVxdWVzdC4uLlxuIikpOwotCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFzc29jSGRyLCBTVUJUWVBFX0FTU09DX1JFUSwgMCwgQXBBZGRyLCBBcEFkZHIpOwotCi0JCS8vIEJ1aWxkIGJhc2ljIGZyYW1lIGZpcnN0Ci0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKLQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLAkmQXNzb2NIZHIsCi0JCQkJCQkgIDIsCQkJCQkJJkNhcGFiaWxpdHlJbmZvLAotCQkJCQkJICAyLAkJCQkJCSZMaXN0ZW5JbnR2LAotCQkJCQkJICAxLAkJCQkJCSZTc2lkSWUsCi0JCQkJCQkgIDEsCQkJCQkJJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLAotCQkJCQkJICBwQWQtPk1sbWVBdXguU3NpZExlbiwJCXBBZC0+TWxtZUF1eC5Tc2lkLAotCQkJCQkJICAxLAkJCQkJCSZTdXBSYXRlSWUsCi0JCQkJCQkgIDEsCQkJCQkJJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAotCQkJCQkJICBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgIHBBZC0+TWxtZUF1eC5TdXBSYXRlLAotCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0KLQkJaWYgKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuICE9IDApCi0JCXsKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgJnRtcCwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAotCQkJCQkJCSAgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sICBwQWQtPk1sbWVBdXguRXh0UmF0ZSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCUZyYW1lTGVuICs9IHRtcDsKLQkJfQotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJLy8gSFQKLQkJaWYgKChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID4gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCi0JCXsKLQkJCVVMT05HIFRtcExlbjsKLQkJCVVDSEFSIEh0TGVuOwotCQkJVUNIQVIgQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKLQkJCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPT0gVFJVRSkKLQkJCXsKLQkJCQlIdExlbiA9IFNJWkVfSFRfQ0FQX0lFICsgNDsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAotCQkJCQkJCSAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKLQkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCQkgICAgICAgIEhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOwotI2VuZGlmCi0KLSNpZm5kZWYgUlRfQklHX0VORElBTgotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAotCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbik7Ci0JCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKLQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOwotCi0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBJZSwKLQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwmSHRDYXBhYmlsaXR5VG1wLAotCQkJCQkJCQlFTkRfT0ZfQVJHUyk7Ci0jZW5kaWYKLQkJCX0KLQkJCUZyYW1lTGVuICs9IFRtcExlbjsKLQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCS8vIGFkZCBSYWxpbmsgcHJvcHJpZXRhcnkgSUUgdG8gaW5mb3JtIEFQIHRoaXMgU1RBIGlzIGdvaW5nIHRvIHVzZSBBR0dSRUdBVElPTiBvciBQSUdHWS1CQUNLK0FHR1JFR0FUSU9OCi0JCS8vIENhc2UgSTogKEFnZ3JlZ2F0aW9uICsgUGlnZ3ktQmFjaykKLQkJLy8gMS4gdXNlciBlbmFibGUgYWdncmVnYXRpb24sIEFORAotCQkvLyAyLiBNYWMgc3VwcG9ydCBwaWdneS1iYWNrCi0JCS8vIDMuIEFQIGFubm91Y2VzIGl0J3MgUElHR1ktQkFDSytBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgotCQkvLyBDYXNlIElJOiAoQWdncmVnYXRpb24pCi0JCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKLQkJLy8gMi4gQVAgYW5ub3VjZXMgaXQncyBBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgotCQlpZiAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkKLQkJewotCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSkgJiYgKChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDMpID09IDMpKQotCQkJewotCQkJCVVMT05HIFRtcExlbjsKLQkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OwotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAotCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQkJRnJhbWVMZW4gKz0gVG1wTGVuOwotCQkJfQotCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAxKQotCQkJewotCQkJCVVMT05HIFRtcExlbjsKLQkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDB9OwotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAotCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQkJRnJhbWVMZW4gKz0gVG1wTGVuOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJVUxPTkcgVG1wTGVuOwotCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDA2LCAweDAwLCAweDAwLCAweDAwfTsKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sCQkgJlRtcExlbiwKLQkJCQkJCQkgIDksCQkJCQkJIFJhbGlua0llLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJRnJhbWVMZW4gKz0gVG1wTGVuOwotCQl9Ci0KLQkJaWYgKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJWYWxpZCkKLQkJewotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iQVBTRENhcGFibGUpCi0JCQl7Ci0JCQkJUUJTU19TVEFfSU5GT19QQVJNIFFvc0luZm87Ci0KLQkJCQlOZGlzWmVyb01lbW9yeSgmUW9zSW5mbywgc2l6ZW9mKFFCU1NfU1RBX0lORk9fUEFSTSkpOwotCQkJCVFvc0luZm8uVUFQU0RfQUNfQkUgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFOwotCQkJCVFvc0luZm8uVUFQU0RfQUNfQksgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLOwotCQkJCVFvc0luZm8uVUFQU0RfQUNfVkkgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJOwotCQkJCVFvc0luZm8uVUFQU0RfQUNfVk8gPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPOwotCQkJCVFvc0luZm8uTWF4U1BMZW5ndGggPSBwQWQtPkNvbW1vbkNmZy5NYXhTUExlbmd0aDsKLQkJCQlXbWVJZVs4XSB8PSAqKFBVQ0hBUikmUW9zSW5mbzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLSAgICAgICAgICAgICAgICAvLyBUaGUgUGFyYW1ldGVyIFNldCBDb3VudCBpcyBzZXQgdG8g77+977+9MO+/ve+/vSBpbiB0aGUgYXNzb2NpYXRpb24gcmVxdWVzdCBmcmFtZXMKLSAgICAgICAgICAgICAgICAvLyBXbWVJZVs4XSB8PSAocEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50ICYgMHgwZik7Ci0JCQl9Ci0KLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgJnRtcCwKLQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgJldtZUllWzBdLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJRnJhbWVMZW4gKz0gdG1wOwotCQl9Ci0KLQkJLy8KLQkJLy8gTGV0IFdQQSgjMjIxKSBFbGVtZW50IElEIG9uIHRoZSBlbmQgb2YgdGhpcyBhc3NvY2lhdGlvbiBmcmFtZS4KLQkJLy8gT3RoZXJ3aXNlIHNvbWUgQVAgd2lsbCBmYWlsIG9uIHBhcnNpbmcgRWxlbWVudCBJRCBhbmQgc2V0IHN0YXR1cyBmYWlsIG9uIEFzc29jIFJzcC4KLQkJLy8gRm9yIGV4YW1wbGU6IFB1dCBWZW5kb3IgU3BlY2lmaWMgSUUgb24gdGhlIGZyb250IG9mIFdQQSBJRS4KLQkJLy8gVGhpcyBoYXBwZW5zIG9uIEFQIChNb2RlbCBObzpMaW5rc3lzIFdSSzU0RykKLQkJLy8KLQkJaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAotICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8Ci0gICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAotICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCi0JCQkpCi0gICAgICAgICAgICApCi0JCXsKLQkJCVVDSEFSIFJTTkllID0gSUVfV1BBOwotCi0JCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8Ci0gICAgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpKQotCQkJewotCQkJCVJTTkllID0gSUVfV1BBMjsKLQkJCX0KLQotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0jaWZkZWYgU0lPQ1NJV0dFTklFCi0JCQlpZiAoKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpICYmCi0JCQkJKHBBZC0+U3RhQ2ZnLmJSU05fSUVfRnJvbVdwYVN1cHBsaWNhbnQgPT0gRkFMU0UpKQotI2VuZGlmIC8vIFNJT0NTSVdHRU5JRSAvLwotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0gICAgICAgICAgICBSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgQlNTMCk7Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIGZvciBXUEEgUE1LIGNhY2hlIGxpc3QKLQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQotCQkJewotCQkJICAgIElOVCAgICAgaWR4OwotICAgICAgICAgICAgICAgIEJPT0xFQU4gRm91bmRQTUsgPSBGQUxTRTsKLQkJCQkvLyBTZWFyY2ggY2hjaGVkIFBNS0lELCBhcHBlbmQgaXQgaWYgZXhpc3RlZAotCQkJCWZvciAoaWR4ID0gMDsgaWR4IDwgUE1LSURfTk87IGlkeCsrKQotCQkJCXsKLQkJCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShBcEFkZHIsICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLkJTU0lELCA2KSkKLQkJCQkJewotCQkJCQkJRm91bmRQTUsgPSBUUlVFOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoRm91bmRQTUspCi0JCQkJewotCQkJCQkvLyBTZXQgUE1LIG51bWJlcgotCQkJCQkqKFBVU0hPUlQpICZwQWQtPlN0YUNmZy5SU05fSUVbcEFkLT5TdGFDZmcuUlNOSUVfTGVuXSA9IDE7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5SU05fSUVbcEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMl0sICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLlBNS0lELCAxNik7Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArPSAxODsKLQkJCQl9Ci0JCQl9Ci0KLSNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmZGVmIFNJT0NTSVdHRU5JRQotCQkJaWYgKChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKSAmJgotCQkJCShwQWQtPlN0YUNmZy5iUlNOX0lFX0Zyb21XcGFTdXBwbGljYW50ID09IFRSVUUpKQotCQkJewotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJCSZ0bXAsCi0JCQkJCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4sCQkJcEFkLT5TdGFDZmcuUlNOX0lFLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCQkJfQotCQkJZWxzZQotI2VuZGlmCi0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQkJCXsKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJCSZ0bXAsCi0JCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSU05JZSwKLQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAotCQkJCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4sCQkJcEFkLT5TdGFDZmcuUlNOX0lFLAotCQkJCQlFTkRfT0ZfQVJHUyk7Ci0JCQl9Ci0KLQkJCUZyYW1lTGVuICs9IHRtcDsKLQotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0jaWZkZWYgU0lPQ1NJV0dFTklFCi0JCQlpZiAoKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpIHx8Ci0JCQkJKHBBZC0+U3RhQ2ZnLmJSU05fSUVfRnJvbVdwYVN1cHBsaWNhbnQgPT0gRkFMU0UpKQotI2VuZGlmCi0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQkJCXsKLSAgICAgICAgICAgIC8vIEFwcGVuZCBWYXJpYWJsZSBJRQotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmUlNOSWUsIDEpOwotICAgICAgICAgICAgVmFySWVzT2Zmc2V0ICs9IDE7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZwQWQtPlN0YUNmZy5SU05JRV9MZW4sIDEpOwotICAgICAgICAgICAgVmFySWVzT2Zmc2V0ICs9IDE7Ci0JCQl9Ci0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIHBBZC0+U3RhQ2ZnLlJTTl9JRSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKLQkJCVZhckllc09mZnNldCArPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47Ci0KLQkJCS8vIFNldCBWYXJpYWJsZSBJRXMgTGVuZ3RoCi0JCQlwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA9IFZhckllc09mZnNldDsKLQkJfQotCi0KLQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0KLQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgVGltZW91dCk7Ci0JCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfV0FJVF9SU1A7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVNTT0MgLSBNbG1lQXNzb2NSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkLiBCVUchISEhISEgXG4iKSk7Ci0JCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOwotCX0KLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCW1sbWUgcmVhc3NvYyByZXEgaGFuZGxpbmcgcHJvY2VkdXJlCi0JUGFyYW1ldGVyczoKLQkJRWxlbSAtCi0JUHJlOgotCQktIyBTU0lEICAoQWRhcHRlci0+U3RhQ2ZnLnNzaWRbXSkKLQkJLSMgQlNTSUQgKEFQIGFkZHJlc3MsIEFkYXB0ZXItPlN0YUNmZy5ic3NpZCkKLQkJLSMgU3VwcG9ydGVkIHJhdGVzIChBZGFwdGVyLT5TdGFDZmcuc3VwcG9ydGVkX3JhdGVzW10pCi0JCS0jIFN1cHBvcnRlZCByYXRlcyBsZW5ndGggKEFkYXB0ZXItPlN0YUNmZy5zdXBwb3J0ZWRfcmF0ZXNfbGVuKQotCQktIyBUeCBwb3dlciAoQWRhcHRlci0+U3RhQ2ZnLnR4X3Bvd2VyKQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE1sbWVSZWFzc29jUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVQ0hBUgkJCUFwQWRkcls2XTsKLQlIRUFERVJfODAyXzExCVJlYXNzb2NIZHI7Ci0JVUNIQVIJCQlXbWVJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDB4MDcsIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDB9OwotCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvLCBMaXN0ZW5JbnR2OwotCVVMT05HCQkJVGltZW91dDsKLQlVTE9ORwkJCUZyYW1lTGVuID0gMDsKLQlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7Ci0JTkRJU19TVEFUVVMJCU5TdGF0dXM7Ci0JVUxPTkcJCQl0bXA7Ci0JUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JVVNIT1JUCQkJU3RhdHVzOwotCi0JLy8gQmxvY2sgYWxsIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kCi0JaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID09IFRSVUUpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIEJsb2NrIFJlQXNzb2MgcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QhXG4iKSk7Ci0JCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQkJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Ci0JfQotCS8vIHRoZSBwYXJhbWV0ZXJzIGFyZSB0aGUgc2FtZSBhcyB0aGUgYXNzb2NpYXRpb24KLQllbHNlIGlmKE1sbWVBc3NvY1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBcEFkZHIsICZDYXBhYmlsaXR5SW5mbywgJlRpbWVvdXQsICZMaXN0ZW5JbnR2KSkKLQl7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVNTT0MgLSBNbG1lUmVhc3NvY1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7Ci0JCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7Ci0JCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBBcEFkZHIpOwotCi0JCS8vIG1ha2UgZnJhbWUsIHVzZSBic3NpZCBhcyB0aGUgQVAgYWRkcmVzcz8/Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gU2VuZCBSRS1BU1NPQyByZXF1ZXN0Li4uXG4iKSk7Ci0JCU1ndE1hY0hlYWRlckluaXQocEFkLCAmUmVhc3NvY0hkciwgU1VCVFlQRV9SRUFTU09DX1JFUSwgMCwgQXBBZGRyLCBBcEFkZHIpOwotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmUmVhc3NvY0hkciwKLQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJkxpc3RlbkludHYsCi0JCQkJCQkgIE1BQ19BRERSX0xFTiwgICAgICAgICAgICAgQXBBZGRyLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLAotCQkJCQkJICBwQWQtPk1sbWVBdXguU3NpZExlbiwgICAgIHBBZC0+TWxtZUF1eC5Tc2lkLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCi0JCQkJCQkgIDEsCQkJCQkJJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAotCQkJCQkJICBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgIHBBZC0+TWxtZUF1eC5TdXBSYXRlLAotCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0KLQkJaWYgKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuICE9IDApCi0JCXsKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICZ0bXAsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAotCQkJCQkJCSAgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCSAgICBwQWQtPk1sbWVBdXguRXh0UmF0ZSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCUZyYW1lTGVuICs9IHRtcDsKLQkJfQotCi0KLQkJaWYgKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJWYWxpZCkKLQkJewotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iQVBTRENhcGFibGUpCi0JCQl7Ci0JCQkJUUJTU19TVEFfSU5GT19QQVJNIFFvc0luZm87Ci0KLQkJCQlOZGlzWmVyb01lbW9yeSgmUW9zSW5mbywgc2l6ZW9mKFFCU1NfU1RBX0lORk9fUEFSTSkpOwotCQkJCVFvc0luZm8uVUFQU0RfQUNfQkUgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFOwotCQkJCVFvc0luZm8uVUFQU0RfQUNfQksgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLOwotCQkJCVFvc0luZm8uVUFQU0RfQUNfVkkgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJOwotCQkJCVFvc0luZm8uVUFQU0RfQUNfVk8gPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPOwotCQkJCVFvc0luZm8uTWF4U1BMZW5ndGggPSBwQWQtPkNvbW1vbkNmZy5NYXhTUExlbmd0aDsKLQkJCQlXbWVJZVs4XSB8PSAqKFBVQ0hBUikmUW9zSW5mbzsKLQkJCX0KLQotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAotCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAmV21lSWVbMF0sCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQlGcmFtZUxlbiArPSB0bXA7Ci0JCX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkvLyBIVAotCQlpZiAoKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKLQkJewotCQkJVUxPTkcgVG1wTGVuOwotCQkJVUNIQVIgSHRMZW47Ci0JCQlVQ0hBUiBCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OwotCQkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYlByZU5IdCA9PSBUUlVFKQotCQkJewotCQkJCUh0TGVuID0gU0laRV9IVF9DQVBfSUUgKyA0OwotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCi0JCQkJCQkJICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAotCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQl9Ci0JCQlGcmFtZUxlbiArPSBUbXBMZW47Ci0JCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCQkvLyBhZGQgUmFsaW5rIHByb3ByaWV0YXJ5IElFIHRvIGluZm9ybSBBUCB0aGlzIFNUQSBpcyBnb2luZyB0byB1c2UgQUdHUkVHQVRJT04gb3IgUElHR1ktQkFDSytBR0dSRUdBVElPTgotCQkvLyBDYXNlIEk6IChBZ2dyZWdhdGlvbiArIFBpZ2d5LUJhY2spCi0JCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKLQkJLy8gMi4gTWFjIHN1cHBvcnQgcGlnZ3ktYmFjawotCQkvLyAzLiBBUCBhbm5vdWNlcyBpdCdzIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KLQkJLy8gQ2FzZSBJSTogKEFnZ3JlZ2F0aW9uKQotCQkvLyAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5ECi0JCS8vIDIuIEFQIGFubm91Y2VzIGl0J3MgQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpCi0JCXsKLQkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpICYmICgocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKSkKLQkJCXsKLQkJCQlVTE9ORyBUbXBMZW47Ci0JCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCi0JCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKLQkJCX0KLQkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkKLQkJCXsKLQkJCQlVTE9ORyBUbXBMZW47Ci0JCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAxLCAweDAwLCAweDAwLCAweDAwfTsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCi0JCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCVVMT05HIFRtcExlbjsKLQkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLAkJICZUbXBMZW4sCi0JCQkJCQkJICA5LAkJCQkJCSBSYWxpbmtJZSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCUZyYW1lTGVuICs9IFRtcExlbjsKLQkJfQotCi0JCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgVGltZW91dCk7IC8qIGluIG1TZWMgKi8KLQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBSRUFTU09DX1dBSVRfUlNQOwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZVJlYXNzb2NSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkLiBCVUchISEhIFxuIikpOwotCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7Ci0JCVN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlVcHBlciBsYXllciBpc3N1ZXMgZGlzYXNzb2MgcmVxdWVzdAotCVBhcmFtZXRlcnM6Ci0JCUVsZW0gLQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWxtZURpc2Fzc29jUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlQTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUIHBEaXNhc3NvY1JlcTsKLQlIRUFERVJfODAyXzExICAgICAgICAgRGlzYXNzb2NIZHI7Ci0JUEhFQURFUl84MDJfMTEgICAgICAgIHBEaXNhc3NvY0hkcjsKLQlQVUNIQVIgICAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JVUxPTkcgICAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlORElTX1NUQVRVUyAgICAgICAgICAgTlN0YXR1czsKLQlCT09MRUFOICAgICAgICAgICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0JVUxPTkcgICAgICAgICAgICAgICAgIFRpbWVvdXQgPSA1MDA7Ci0JVVNIT1JUICAgICAgICAgICAgICAgIFN0YXR1czsKLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCS8vIHNlbmQgRExTLVRFQVJfRE9XTiBtZXNzYWdlLAotCWlmIChwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKLQl7Ci0JCVVDSEFSIGk7Ci0KLQkJLy8gdGVhciBkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQotCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCi0JCXsKLQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQotCQkJewotCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOwotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOwotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7Ci0JCQl9Ci0JCX0KLQotCQkvLyB0ZWFyIGRvd24gcGVlciBkbHMgdGFibGUgZW50cnkKLQkJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKLQkJewotCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCi0JCQl7Ci0JCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7Ci0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7Ci0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCX0KLQkJfQotCX0KLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotCS8vIHNraXAgc2FuaXR5IGNoZWNrCi0JcERpc2Fzc29jUmVxID0gKFBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKEVsZW0tPk1zZyk7Ci0KLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIE1sbWVEaXNhc3NvY1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWRcbiIpKTsKLQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKLQkJcmV0dXJuOwotCX0KLQotCi0KLQotCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFNlbmQgRElTQVNTT0MgcmVxdWVzdFtCU1NJRDo6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggKFJlYXNvbj0lZClcbiIsCi0JCQkJcERpc2Fzc29jUmVxLT5BZGRyWzBdLCBwRGlzYXNzb2NSZXEtPkFkZHJbMV0sIHBEaXNhc3NvY1JlcS0+QWRkclsyXSwKLQkJCQlwRGlzYXNzb2NSZXEtPkFkZHJbM10sIHBEaXNhc3NvY1JlcS0+QWRkcls0XSwgcERpc2Fzc29jUmVxLT5BZGRyWzVdLCBwRGlzYXNzb2NSZXEtPlJlYXNvbikpOwotCU1ndE1hY0hlYWRlckluaXQocEFkLCAmRGlzYXNzb2NIZHIsIFNVQlRZUEVfRElTQVNTT0MsIDAsIHBEaXNhc3NvY1JlcS0+QWRkciwgcERpc2Fzc29jUmVxLT5BZGRyKTsJLy8gcGF0Y2ggcGVhcCB0dGxzIHN3aXRjaGluZyBpc3N1ZQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0JCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZEaXNhc3NvY0hkciwKLQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgJnBEaXNhc3NvY1JlcS0+UmVhc29uLAotCQkJCQkgIEVORF9PRl9BUkdTKTsKLQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQotCS8vIFRvIHBhdGNoIEluc3RhbmNlIGFuZCBCdWZmYWxvKE4pIEFQCi0JLy8gRHJpdmVyIGhhcyB0byBzZW5kIGRlYXV0aCB0byBJbnN0YW5jZSBBUCwgYnV0IEJ1ZmZhbG8oTikgbmVlZHMgdG8gc2VuZCBkaXNhc3NvYyB0byByZXNldCBBdXRoZW50aWNhdG9yJ3Mgc3RhdGUgbWFjaGluZQotCS8vIFRoZXJlZm9yZSwgd2Ugc2VuZCBib3RoIG9mIHRoZW0uCi0JcERpc2Fzc29jSGRyID0gKFBIRUFERVJfODAyXzExKXBPdXRCdWZmZXI7Ci0JcERpc2Fzc29jSGRyLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9ERUFVVEg7Ci0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0KLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JcEFkLT5TdGFDZmcuRGlzYXNzb2NSZWFzb24gPSBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkc7Ci0JQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EaXNhc3NvY1N0YSwgcERpc2Fzc29jUmVxLT5BZGRyKTsKLQotCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsIFRpbWVvdXQpOyAvKiBpbiBtU2VjICovCi0JcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBESVNBU1NPQ19XQUlUX1JTUDsKLQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCi0JewotCQkvL3NlbmQgZGlzYXNzb2NpYXRlIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50Ci0JCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgSVdFVkNVU1RPTSwgUlRfRElTQVNTT0NfRVZFTlRfRkxBRywgTlVMTCwgTlVMTCwgMCk7Ci0JfQotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0jaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIFNJT0NHSVdBUCwgLTEsIE5VTEwsIE5VTEwsIDApOwotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlwZWVyIHNlbmRzIGFzc29jIHJzcCBiYWNrCi0JUGFyYW1ldGVyczoKLQkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFBlZXJBc3NvY1JzcEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbywgU3RhdHVzLCBBaWQ7Ci0JVUNIQVIgICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgU3VwUmF0ZUxlbjsKLQlVQ0hBUiAgICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlTGVuOwotCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOwotCVVDSEFSICAgICAgICAgQ2tpcEZsYWc7Ci0JRURDQV9QQVJNICAgICBFZGNhUGFybTsKLQlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7Ci0JQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JVUNIQVIJCQlIdENhcGFiaWxpdHlMZW47Ci0JVUNIQVIJCQlBZGRIdEluZm9MZW47Ci0JVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKLQotCWlmIChQZWVyQXNzb2NSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZDYXBhYmlsaXR5SW5mbywgJlN0YXR1cywgJkFpZCwgU3VwUmF0ZSwgJlN1cFJhdGVMZW4sIEV4dFJhdGUsICZFeHRSYXRlTGVuLAotCQkmSHRDYXBhYmlsaXR5LCZBZGRIdEluZm8sICZIdENhcGFiaWxpdHlMZW4sJkFkZEh0SW5mb0xlbiwmTmV3RXh0Q2hhbm5lbE9mZnNldCwgJkVkY2FQYXJtLCAmQ2tpcEZsYWcpKQotCXsKLQkJLy8gVGhlIGZyYW1lIGlzIGZvciBtZSA/Ci0JCWlmKE1BQ19BRERSX0VRVUFMKEFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXNzb2NSc3BBY3Rpb24oKTpBU1NPQyAtIHJlY2VpdmUgQVNTT0NfUlNQIHRvIG1lIChzdGF0dXM9JWQpXG4iLCBTdGF0dXMpKTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBc3NvY1JzcEFjdGlvbigpOk1hY1RhYmxlIFslZF0uQU1zZHVTaXplID0gJWQuIENsaWVudFN0YXR1c0ZsYWdzID0gMHglbHggXG4iLEVsZW0tPldjaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkNsaWVudFN0YXR1c0ZsYWdzKSk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCi0KLQkJCWlmKFN0YXR1cyA9PSBNTE1FX1NVQ0NFU1MpCi0JCQl7Ci0JCQkJVUNIQVIJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gMDsKLQkJCQlVQ0hBUgkJCWlkeDsKLQotCQkJCS8vIHN1cHBvcnRlZCByYXRlcyBhcnJheSBtYXkgbm90IGJlIHNvcnRlZC4gc29ydCBpdCBhbmQgZmluZCB0aGUgbWF4aW11bSByYXRlCi0JCQkgICAgZm9yIChpZHg9MDsgaWR4PFN1cFJhdGVMZW47IGlkeCsrKQotCQkJICAgIHsKLQkJCSAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoU3VwUmF0ZVtpZHhdICYgMHg3ZikpCi0JCQkgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gU3VwUmF0ZVtpZHhdICYgMHg3ZjsKLQkJCSAgICB9Ci0KLQkJCQlmb3IgKGlkeD0wOyBpZHg8RXh0UmF0ZUxlbjsgaWR4KyspCi0JCQkgICAgewotCQkJICAgICAgICBpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8IChFeHRSYXRlW2lkeF0gJiAweDdmKSkKLQkJCSAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBFeHRSYXRlW2lkeF0gJiAweDdmOwotCQkJICAgIH0KLQkJCQkvLyBnbyB0byBwcm9jZWR1cmUgbGlzdGVkIG9uIHBhZ2UgMzc2Ci0JCQkJQXNzb2NQb3N0UHJvYyhwQWQsIEFkZHIyLCBDYXBhYmlsaXR5SW5mbywgQWlkLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLAotCQkJCQkmRWRjYVBhcm0sICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mbyk7Ci0KLQkJCQlTdGFBZGRNYWNUYWJsZUVudHJ5KHBBZCwKLQkJCQkJCQkJCSZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLAotCQkJCQkJCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywKLQkJCQkJCQkJCSZIdENhcGFiaWxpdHksCi0JCQkJCQkJCQlIdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJCQkmQWRkSHRJbmZvLAotCQkJCQkJCQkJQWRkSHRJbmZvTGVuLAotCQkJCQkJCQkJQ2FwYWJpbGl0eUluZm8pOwotCQkJfQotCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUGVlckFzc29jUnNwQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJcGVlciBzZW5kcyByZWFzc29jIHJzcAotCVBhcmFtZXRyczoKLQkJRWxlbSAtIE1MTUUgbWVzc2FnZSBjbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUGVlclJlYXNzb2NSc3BBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCAgICAgIENhcGFiaWxpdHlJbmZvOwotCVVTSE9SVCAgICAgIFN0YXR1czsKLQlVU0hPUlQgICAgICBBaWQ7Ci0JVUNIQVIgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIFN1cFJhdGVMZW47Ci0JVUNIQVIgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVMZW47Ci0JVUNIQVIgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICBDa2lwRmxhZzsKLQlCT09MRUFOICAgICBUaW1lckNhbmNlbGxlZDsKLQlFRENBX1BBUk0gICBFZGNhUGFybTsKLQlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7Ci0JQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JVUNIQVIJCQlIdENhcGFiaWxpdHlMZW47Ci0JVUNIQVIJCQlBZGRIdEluZm9MZW47Ci0JVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKLQotCWlmKFBlZXJBc3NvY1JzcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkNhcGFiaWxpdHlJbmZvLCAmU3RhdHVzLCAmQWlkLCBTdXBSYXRlLCAmU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgJkV4dFJhdGVMZW4sCi0JCQkJCQkJCSZIdENhcGFiaWxpdHksCSZBZGRIdEluZm8sICZIdENhcGFiaWxpdHlMZW4sICZBZGRIdEluZm9MZW4sJk5ld0V4dENoYW5uZWxPZmZzZXQsICZFZGNhUGFybSwgJkNraXBGbGFnKSkKLQl7Ci0JCWlmKE1BQ19BRERSX0VRVUFMKEFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpKSAvLyBUaGUgZnJhbWUgaXMgZm9yIG1lID8KLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSByZWNlaXZlIFJFQVNTT0NfUlNQIHRvIG1lIChzdGF0dXM9JWQpXG4iLCBTdGF0dXMpKTsKLQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotCQkJaWYoU3RhdHVzID09IE1MTUVfU1VDQ0VTUykKLQkJCXsKLQkJCQkvLyBnbyB0byBwcm9jZWR1cmUgbGlzdGVkIG9uIHBhZ2UgMzc2Ci0JCQkJQXNzb2NQb3N0UHJvYyhwQWQsIEFkZHIyLCBDYXBhYmlsaXR5SW5mbywgQWlkLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLAotCQkJCQkgJkVkY2FQYXJtLCAmSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4sICZBZGRIdEluZm8pOwotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKLQkJCXsKLQkJCQlTZW5kQXNzb2NJRXNUb1dwYVN1cHBsaWNhbnQocEFkKTsKLQkJCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZDVVNUT00sIFJUX0FTU09DX0VWRU5UX0ZMQUcsIE5VTEwsIE5VTEwsIDApOwotCQkJfQotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0jaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKHBBZCk7Ci0gICAgICAgICAgICAgICAgICAgIFJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgU0lPQ0dJV0FQLCAtMSwgJnBBZC0+TWxtZUF1eC5Cc3NpZFswXSwgTlVMTCwgMCk7Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLQkJCX0KLQotCQkJLy8gQ2tpcEZsYWcgaXMgbm8gdXNlIGZvciByZWFzc29jaWF0ZQotCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyUmVhc3NvY1JzcEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7Ci0JfQotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJcHJvY2VkdXJlcyBvbiBJRUVFIDgwMi4xMS8xOTk5IHAuMzc2Ci0JUGFyYW1ldHJzOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzc29jUG9zdFByb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBBZGRyMiwKLQlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCi0JSU4gVVNIT1JUIEFpZCwKLQlJTiBVQ0hBUiBTdXBSYXRlW10sCi0JSU4gVUNIQVIgU3VwUmF0ZUxlbiwKLQlJTiBVQ0hBUiBFeHRSYXRlW10sCi0JSU4gVUNIQVIgRXh0UmF0ZUxlbiwKLQlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKLQlJTiBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKLQlJTiBVQ0hBUiBIdENhcGFiaWxpdHlMZW4sCi0JSU4gQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvKQkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLXsKLQlVTE9ORyBJZHg7Ci0KLQlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IEJTU19JTkZSQTsKLQlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkZHIyKTsKLQlwQWQtPk1sbWVBdXguQWlkID0gQWlkOwotCXBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvICYgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTzsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCS8vIFNvbWUgSFQgQVAgbWlnaHQgbG9zdCBXTU0gSUUuIFdlIGFkZCBXTU0gb3Vyc2VsdmVzLiBiZWFjdWFzZSBIVCByZXF1aXJlcyBRb1Mgb24uCi0JaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEVkY2FQYXJtLT5iVmFsaWQgPT0gRkFMU0UpKQotCXsKLQkJcEVkY2FQYXJtLT5iVmFsaWQgPSBUUlVFOwotCQlwRWRjYVBhcm0tPkFpZnNuWzBdID0gMzsKLQkJcEVkY2FQYXJtLT5BaWZzblsxXSA9IDc7Ci0JCXBFZGNhUGFybS0+QWlmc25bMl0gPSAyOwotCQlwRWRjYVBhcm0tPkFpZnNuWzNdID0gMjsKLQotCQlwRWRjYVBhcm0tPkN3bWluWzBdID0gNDsKLQkJcEVkY2FQYXJtLT5Dd21pblsxXSA9IDQ7Ci0JCXBFZGNhUGFybS0+Q3dtaW5bMl0gPSAzOwotCQlwRWRjYVBhcm0tPkN3bWluWzNdID0gMjsKLQotCQlwRWRjYVBhcm0tPkN3bWF4WzBdID0gMTA7Ci0JCXBFZGNhUGFybS0+Q3dtYXhbMV0gPSAxMDsKLQkJcEVkY2FQYXJtLT5Dd21heFsyXSA9IDQ7Ci0JCXBFZGNhUGFybS0+Q3dtYXhbM10gPSAzOwotCi0JCXBFZGNhUGFybS0+VHhvcFswXSAgPSAwOwotCQlwRWRjYVBhcm0tPlR4b3BbMV0gID0gMDsKLQkJcEVkY2FQYXJtLT5UeG9wWzJdICA9IDk2OwotCQlwRWRjYVBhcm0tPlR4b3BbM10gID0gNDg7Ci0KLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOwotCi0JLy8gZmlsdGVyIG91dCB1bi1zdXBwb3J0ZWQgcmF0ZXMKLQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOwotCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7Ci0KLQkvLyBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCByYXRlcwotCXBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7Ci0JUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCWlmIChIdENhcGFiaWxpdHlMZW4gPiAwKQotCXsKLQkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCBwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvKTsKLQl9Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNzb2NQb3N0UHJvYz09PT4gIEFQLkFNc2R1U2l6ZSA9ICVkLiBDbGllbnRTdGF0dXNGbGFncyA9IDB4JWx4IFxuIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+ICAgIChNbXBzPSVkLCBBbXNkdVNpemU9JWQsIClcbiIsCi0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTW1wc01vZGUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplKSk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkvLyBTZXQgTmV3IFdQQSBpbmZvcm1hdGlvbgotCUlkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBBZGRyMiwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOwotCWlmIChJZHggPT0gQlNTX05PVF9GT1VORCkKLQl7Ci0JCURCR1BSSU5UX0VSUigoIkFTU09DIC0gQ2FuJ3QgZmluZCBCU1MgYWZ0ZXIgcmVjZWl2aW5nIEFzc29jIHJlc3BvbnNlXG4iKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIEluaXQgdmFyaWFibGUKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAwOwotCQlOZGlzWmVyb01lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgTUFYX0xFTl9PRl9SU05JRSk7Ci0KLQkJLy8gU3RvcmUgYXBwcm9wcmlhdGUgUlNOX0lFIGZvciBXUEEgU00gbmVnb3RpYXRpb24gbGF0ZXIKLQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRUxlbiAhPSAwKSkKLQkJewotCQkJUFVDSEFSICAgICAgICAgICAgICBwVklFOwotCQkJVVNIT1JUICAgICAgICAgICAgICBsZW47Ci0JCQlQRUlEX1NUUlVDVCAgICAgICAgIHBFaWQ7Ci0KLQkJCXBWSUUgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRXM7Ci0JCQlsZW4JID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVmFySUVMZW47Ci0JCQkvL0tIIG5lZWQgdG8gY2hlY2sgYWdhaW4KLQkJCS8vIERvbid0IGFsbG93IHRvIGdvIHRvIHNsZWVwIG1vZGUgaWYgYXV0aG1vZGUgaXMgV1BBLXJlbGF0ZWQuCi0JCQkvL1RoaXMgY2FuIG1ha2UgQXV0aGVudGljYXRpb24gcHJvY2VzcyBtb3JlIHNtb290aGx5LgotCQkJUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwotCi0JCQl3aGlsZSAobGVuID4gMCkKLQkJCXsKLQkJCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOwotCQkJCS8vIEZvciBXUEEvV1BBUFNLCi0JCQkJaWYgKChwRWlkLT5FaWQgPT0gSUVfV1BBKSAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkKLQkJCQkJJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSB8fCBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQotCQkJCXsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBWSUUsIChwRWlkLT5MZW4gKyAyKSk7Ci0JCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID0gKHBFaWQtPkxlbiArIDIpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiBTdG9yZSBSU05fSUUgZm9yIFdQQSBTTSBuZWdvdGlhdGlvbiBcbiIpKTsKLQkJCQl9Ci0JCQkJLy8gRm9yIFdQQTIvV1BBMlBTSwotCQkJCWVsc2UgaWYgKChwRWlkLT5FaWQgPT0gSUVfUlNOKSAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpCi0JCQkJCSYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQkJCXsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBWSUUsIChwRWlkLT5MZW4gKyAyKSk7Ci0JCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID0gKHBFaWQtPkxlbiArIDIpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiBTdG9yZSBSU05fSUUgZm9yIFdQQTIgU00gbmVnb3RpYXRpb24gXG4iKSk7Ci0JCQkJfQotCi0JCQkJcFZJRSArPSAocEVpZC0+TGVuICsgMik7Ci0JCQkJbGVuICAtPSAocEVpZC0+TGVuICsgMik7Ci0JCQl9Ci0KLQotCQl9Ci0KLQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID09IDApCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IG5vIFJTTl9JRSBcbiIpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWhleF9kdW1wKCJSU05fSUUiLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pOwotCQl9Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCWxlZnQgcGFydCBvZiBJRUVFIDgwMi4xMS8xOTk5IHAuMzc0Ci0JUGFyYW1ldGVyczoKLQkJRWxlbSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFBlZXJEaXNhc3NvY0FjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCVVTSE9SVCAgICAgICAgUmVhc29uOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyRGlzYXNzb2NBY3Rpb24oKVxuIikpOwotCWlmKFBlZXJEaXNhc3NvY1Nhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJlJlYXNvbikpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJEaXNhc3NvY0FjdGlvbigpIFJlYXNvbiA9ICVkXG4iLCBSZWFzb24pKTsKLQkJaWYgKElORlJBX09OKHBBZCkgJiYgTUFDX0FERFJfRVFVQUwocEFkLT5Db21tb25DZmcuQnNzaWQsIEFkZHIyKSkKLQkJewotCi0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQl7Ci0JCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfRElTQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQkJCX0KLQotCi0JCQlMaW5rRG93bihwQWQsIFRSVUUpOwotCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQotCQkJewotCQkJCS8vc2VuZCBkaXNhc3NvY2lhdGUgZXZlbnQgdG8gd3BhX3N1cHBsaWNhbnQKLQkJCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZDVVNUT00sIFJUX0RJU0FTU09DX0VWRU5UX0ZMQUcsIE5VTEwsIE5VTEwsIDApOwotCQkJfQotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0jaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgU0lPQ0dJV0FQLCAtMSwgTlVMTCwgTlVMTCwgMCk7Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQkJfQotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJEaXNhc3NvY0FjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7Ci0JfQotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJd2hhdCB0aGUgc3RhdGUgbWFjaGluZSB3aWxsIGRvIGFmdGVyIGFzc29jIHRpbWVvdXQKLQlQYXJhbWV0ZXJzOgotCQlFbG1lIC0KLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc3NvY1RpbWVvdXRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCAgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQXNzb2NUaW1lb3V0QWN0aW9uXG4iKSk7Ci0JcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCVN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7Ci0JTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCXdoYXQgdGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBkbyBhZnRlciByZWFzc29jIHRpbWVvdXQKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBSZWFzc29jVGltZW91dEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVVNIT1JUICBTdGF0dXM7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBSZWFzc29jVGltZW91dEFjdGlvblxuIikpOwotCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQlTdGF0dXMgPSBNTE1FX1JFSl9USU1FT1VUOwotCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCXdoYXQgdGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBkbyBhZnRlciBkaXNhc3NvYyB0aW1lb3V0Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgRGlzYXNzb2NUaW1lb3V0QWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVU0hPUlQgIFN0YXR1czsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIERpc2Fzc29jVGltZW91dEFjdGlvblxuIikpOwotCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7Ci0JTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOwotfQotCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5Bc3NvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVVNIT1JUICBTdGF0dXM7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBJbnZhbGlkU3RhdGVXaGVuQXNzb2Moc3RhdGU9JWxkKSwgcmVzZXQgQVNTT0Mgc3RhdGUgbWFjaGluZVxuIiwKLQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUpKTsKLQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7Ci0JU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKLQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Ci19Ci0KLVZPSUQgSW52YWxpZFN0YXRlV2hlblJlYXNzb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCBTdGF0dXM7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyhzdGF0ZT0lbGQpLCByZXNldCBBU1NPQyBzdGF0ZSBtYWNoaW5lXG4iLAotCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSkpOwotCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOwotCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOwotfQotCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCBTdGF0dXM7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2Moc3RhdGU9JWxkKSwgcmVzZXQgQVNTT0Mgc3RhdGUgbWFjaGluZVxuIiwKLQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUpKTsKLQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7Ci0JU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKLQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfRElTQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJcmlnaHQgcGFydCBvZiBJRUVFIDgwMi4xMS8xOTk5IHBhZ2UgMzc0Ci0JTm90ZToKLQkJVGhpcyBldmVudCBzaG91bGQgbmV2ZXIgY2F1c2UgQVNTT0Mgc3RhdGUgbWFjaGluZSBwZXJmb3JtIHN0YXRlCi0JCXRyYW5zaXRpb24sIGFuZCBoYXMgbm8gcmVsYXRpb25zaGlwIHdpdGggQ05UTCBtYWNoaW5lLiBTbyB3ZSBzZXBhcmF0ZQotCQl0aGlzIHJvdXRpbmUgYXMgYSBzZXJ2aWNlIG91dHNpZGUgb2YgQVNTT0Mgc3RhdGUgdHJhbnNpdGlvbiB0YWJsZS4KLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBDbHMzZXJyQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIpCi17Ci0JSEVBREVSXzgwMl8xMSAgICAgICAgIERpc2Fzc29jSGRyOwotCVBIRUFERVJfODAyXzExICAgICAgICBwRGlzYXNzb2NIZHI7Ci0JUFVDSEFSICAgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCVVMT05HICAgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JTkRJU19TVEFUVVMgICAgICAgICAgIE5TdGF0dXM7Ci0JVVNIT1JUICAgICAgICAgICAgICAgIFJlYXNvbiA9IFJFQVNPTl9DTFMzRVJSOwotCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQlyZXR1cm47Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIENsYXNzIDMgRXJyb3IsIFNlbmQgRElTQVNTT0MgZnJhbWVcbiIpKTsKLQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRpc2Fzc29jSGRyLCBTVUJUWVBFX0RJU0FTU09DLCAwLCBwQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwkvLyBwYXRjaCBwZWFwIHR0bHMgc3dpdGNoaW5nIGlzc3VlCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRpc2Fzc29jSGRyLAotCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAmUmVhc29uLAotCQkJCQkgIEVORF9PRl9BUkdTKTsKLQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQotCS8vIFRvIHBhdGNoIEluc3RhbmNlIGFuZCBCdWZmYWxvKE4pIEFQCi0JLy8gRHJpdmVyIGhhcyB0byBzZW5kIGRlYXV0aCB0byBJbnN0YW5jZSBBUCwgYnV0IEJ1ZmZhbG8oTikgbmVlZHMgdG8gc2VuZCBkaXNhc3NvYyB0byByZXNldCBBdXRoZW50aWNhdG9yJ3Mgc3RhdGUgbWFjaGluZQotCS8vIFRoZXJlZm9yZSwgd2Ugc2VuZCBib3RoIG9mIHRoZW0uCi0JcERpc2Fzc29jSGRyID0gKFBIRUFERVJfODAyXzExKXBPdXRCdWZmZXI7Ci0JcERpc2Fzc29jSGRyLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9ERUFVVEg7Ci0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0KLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JcEFkLT5TdGFDZmcuRGlzYXNzb2NSZWFzb24gPSBSRUFTT05fQ0xTM0VSUjsKLQlDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRpc2Fzc29jU3RhLCBwQWRkcik7Ci19Ci0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0jaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi1WT0lEICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JU1RSSU5HIGN1c3RvbVtJV19DVVNUT01fTUFYXSA9IHswfTsKLQotCWlmICgocEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gKyAxNykgPD0gSVdfQ1VTVE9NX01BWCkKLQl7Ci0JCXNwcmludGYoY3VzdG9tLCAiQVNTT0NJTkZPX1JlcUlFcz0iKTsKLQkJTmRpc01vdmVNZW1vcnkoY3VzdG9tKzE3LCBwQWQtPlN0YUNmZy5SZXFWYXJJRXMsIHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKTsKLQkJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBJV0VWQ1VTVE9NLCBSVF9SRVFJRV9FVkVOVF9GTEFHLCBOVUxMLCAoUFVDSEFSKWN1c3RvbSwgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gKyAxNyk7Ci0KLQkJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBJV0VWQ1VTVE9NLCBSVF9BU1NPQ0lORk9fRVZFTlRfRkxBRywgTlVMTCwgTlVMTCwgMCk7Ci0JfQotCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gKyAxNyA+IE1BWF9DVVNUT01fTEVOXG4iKSk7Ci0KLQlyZXR1cm47Ci19Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLSNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotaW50IHdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKAotCUlOICBSVE1QX0FEQVBURVIgKnBBZCkKLXsKLQljaGFyIGN1c3RvbVtJV19DVVNUT01fTUFYXSA9IHswfTsKLQotI2lmIFdJUkVMRVNTX0VYVCA+IDE3Ci0JaWYgKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuIDw9IElXX0NVU1RPTV9NQVgpCi0JewotCQlOZGlzTW92ZU1lbW9yeShjdXN0b20sIHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4pOwotCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZBU1NPQ1JFUUlFLCAtMSwgTlVMTCwgY3VzdG9tLCBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbik7Ci0JfQotCWVsc2UKLQkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gPiBNQVhfQ1VTVE9NX0xFTlxuIikpOwotI2Vsc2UKLQlpbnQgbGVuOwotCi0JbGVuID0gKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKjIpICsgMTc7Ci0JaWYgKGxlbiA8PSBJV19DVVNUT01fTUFYKQotCXsKLQkJVUNIQVIgICBpZHg7Ci0JCXNwcmludGYoY3VzdG9tLCAiQVNTT0NJTkZPKFJlcUlFcz0iKTsKLQkJZm9yIChpZHg9MDsgaWR4PHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuOyBpZHgrKykKLQkJICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkLT5TdGFDZmcuUmVxVmFySUVzW2lkeF0pOwotCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZDVVNUT00sIC0xLCBOVUxMLCBjdXN0b20sIGxlbik7Ci0JfQotCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibGVuKCVkKSA+IE1BWF9DVVNUT01fTEVOXG4iLCBsZW4pKTsKLSNlbmRpZgotCi0JcmV0dXJuIDA7Ci0KLX0KLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0KLUJPT0xFQU4gU3RhQWRkTWFjVGFibGVFbnRyeSgKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOICBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKLQlJTiAgVUNIQVIJCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywKLQlJTiAgSFRfQ0FQQUJJTElUWV9JRQkqcEh0Q2FwYWJpbGl0eSwKLQlJTiAgVUNIQVIJCQkJSHRDYXBhYmlsaXR5TGVuLAotCUlOICBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8sCi0JSU4gIFVDSEFSCQkJCUFkZEh0SW5mb0xlbiwKLQlJTiAgVVNIT1JUCQkJQ2FwYWJpbGl0eUluZm8pCi17Ci0JVUNIQVIgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKLQotCWlmIChBREhPQ19PTihwQWQpKQotCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7Ci0KLQlzd2l0Y2ggKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMpCi0gICAgewotICAgICAgICBjYXNlIDEwODogTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNTQ7ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgOTY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV80ODsgICBicmVhazsKLSAgICAgICAgY2FzZSA3MjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzM2OyAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjQ7ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xODsgICBicmVhazsKLSAgICAgICAgY2FzZSAyNDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzEyOyAgIGJyZWFrOwotICAgICAgICBjYXNlIDE4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfOTsgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV82OyAgICBicmVhazsKLSAgICAgICAgY2FzZSAyMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOwotICAgICAgICBjYXNlIDExOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNV81OyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yOyAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE7ICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUcpICYmIChNYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkvLyAxMW4gb25seQotCWlmICgoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl8yXzRHKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkmJiAoSHRDYXBhYmlsaXR5TGVuID09IDApKQotCQlyZXR1cm4gRkFMU0U7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlpZiAoIXBFbnRyeSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLQlpZiAocEVudHJ5KQotCXsKLQkJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwotCQlpZiAoKE1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkgfHwKLQkJCShwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpKQotCQl7Ci0JCQlwRW50cnktPlJhdGVMZW4gPSA0OwotCQkJaWYgKE1heFN1cHBvcnRlZFJhdGUgPj0gUkFURV9GSVJTVF9PRkRNX1JBVEUpCi0JCQkJTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7Ci0JCX0KLQkJZWxzZQotCQkJcEVudHJ5LT5SYXRlTGVuID0gMTI7Ci0KLQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZCA9IDA7Ci0JCXBFbnRyeS0+TWluSFRQaHlNb2RlLndvcmQgPSAwOwotCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gMDsKLQkJcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlID0gTWF4U3VwcG9ydGVkUmF0ZTsKLQkJaWYgKHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKQotCQl7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7Ci0JCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7Ci0JCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKLQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOwotCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07Ci0JCX0KLQkJcEVudHJ5LT5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvOwotCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKTsKLQkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUpOwotCX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCU5kaXNaZXJvTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgc2l6ZW9mKHBFbnRyeS0+SFRDYXBhYmlsaXR5KSk7Ci0JLy8gSWYgdGhpcyBFbnRyeSBzdXBwb3J0cyA4MDIuMTFuLCB1cGdyYWRlIHRvIEhUIHJhdGUuCi0JaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCi0JewotCQlVQ0hBUglqLCBiaXRtYXNrOyAvL2ssYml0bWFzazsKLQkJQ0hBUiAgICBpOwotCi0JCWlmIChBREhPQ19PTihwQWQpKQotCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKLQkJaWYgKChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQotCQl7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKLQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YgPSBUUlVFOwotCQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gMTsKLQkJfQotCi0JCWlmICgocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkgJiYKLQkJCShwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSAmJgotCQkJKChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkgfHwgKChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykgJiYgKHBBZGRIdEluZm8tPkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCkpKSkKLQkJewotCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlc9IEJXXzQwOwotCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkmKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCkpOwotCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb24yME9ubHkgPSBUUlVFOwotCQl9Ci0KLQkJLy8gMyozCi0JCWlmIChwQWQtPk1BQ1ZlcnNpb24gPj0gUkFMSU5LXzI4ODNfVkVSU0lPTiAmJiBwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMzA3MF9WRVJTSU9OKQotCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuVHhCRiA9IHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5UeEJGOwotCi0JCS8vIGZpbmQgbWF4IGZpeGVkIHJhdGUKLQkJZm9yIChpPTIzOyBpPj0wOyBpLS0pIC8vIDMqMwotCQl7Ci0JCQlqID0gaS84OwotCQkJYml0bWFzayA9ICgxPDwoaS0oaio4KSkpOwotCQkJaWYgKChwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvLk1DU1NldFtqXSAmIGJpdG1hc2spICYmIChwSHRDYXBhYmlsaXR5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSkKLQkJCXsKLQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGk9PTApCi0JCQkJYnJlYWs7Ci0JCX0KLQotCi0JCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykKLQkJewotCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID09IDMyKQotCQkJewotCQkJCS8vIEZpeCBNQ1MgYXMgSFQgRHVwbGljYXRlZCBNb2RlCi0JCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSAxOwotCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOwotCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAwOwotCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAwOwotCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IDMyOwotCQkJfQotCQkJZWxzZSBpZiAocEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID4gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUykKLQkJCXsKLQkJCQkvLyBTVEEgc3VwcG9ydHMgZml4ZWQgTUNTCi0JCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJCX0KLQkJfQotCi0JCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlJ4U1RCQyAmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSk7Ci0JCXBFbnRyeS0+TXBkdURlbnNpdHkgPSBwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTXBkdURlbnNpdHk7Ci0JCXBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID0gcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvcjsKLQkJcEVudHJ5LT5NbXBzTW9kZSA9IChVQ0hBUilwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uTWltb1BzOwotCQlwRW50cnktPkFNc2R1U2l6ZSA9IChVQ0hBUilwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQU1zZHVTaXplOwotCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKLQotCQlpZiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlICYmIChwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID09IEZBTFNFKSkKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpOwotCQlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKTsKLQkJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCi0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7Ci0JCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uVHhTVEJDKQotCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFKTsKLQkJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5SeFNUQkMpCi0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUpOwotCQlpZiAocEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlBsdXNIVEMpCi0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUpOwotCQlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7Ci0JCWlmIChwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uTUNTRmVlZGJhY2sgPT0gMHgwMykKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFKTsKLQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+SFRDYXBhYmlsaXR5LCBwSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4pOwotCX0KLQllbHNlCi0JewotCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbklzTGVnYWN5ID0gVFJVRTsKLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKLQlwRW50cnktPkN1cnJUeFJhdGUgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7Ci0KLQkvLyBTZXQgYXNpYyBhdXRvIGZhbGwgYmFjawotCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQotCXsKLQkJUFVDSEFSCQkJCQlwVGFibGU7Ci0JCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOwotCi0JCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKLQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7Ci0JfQotCWVsc2UKLQl7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOwotCi0JCS8vIElmIHRoZSBsZWdhY3kgbW9kZSBpcyBzZXQsIG92ZXJ3cml0ZSB0aGUgdHJhbnNtaXQgc2V0dGluZyBvZiB0aGlzIGVudHJ5LgotCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlLCBwRW50cnkpOwotCX0KLQotCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQlwRW50cnktPlNzdCA9IFNTVF9BU1NPQzsKLQlwRW50cnktPkF1dGhTdGF0ZSA9IEFTX0FVVEhfT1BFTjsKLQlwRW50cnktPkF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7Ci0JcEVudHJ5LT5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7Ci0KLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCi0gICAgewotICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7Ci0KLSAgICAgICAgU2VuZEFzc29jSUVzVG9XcGFTdXBwbGljYW50KHBBZCk7Ci0gICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKLSAgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfQVNTT0NfRVZFTlRfRkxBRzsKLSAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKLSAgICB9Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLSNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgIHsKLSAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OwotICAgICAgICB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYyhwQWQpOwotCi0gICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKLSAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKLQotICAgIH0KLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCXJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvYXV0aC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvYXV0aC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTdlMjk5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL2F1dGguYworKysgL2Rldi9udWxsCkBAIC0xLDQ5MSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCWF1dGguYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4JCTIwMDQtOS0zCQlwb3J0aW5nIGZyb20gUlQyNTAwCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBhdXRoZW50aWNhdGUgc3RhdGUgbWFjaGluZSBpbml0LCBpbmNsdWRpbmcgc3RhdGUgdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAotICAgIFBhcmFtZXRlcnM6Ci0gICAgICAgIFNtIC0gcG9pbnRlciB0byB0aGUgYXV0aCBzdGF0ZSBtYWNoaW5lCi0gICAgTm90ZToKLSAgICAgICAgVGhlIHN0YXRlIG1hY2hpbmUgbG9va3MgbGlrZSB0aGlzCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhfUkVRX0lETEUgICAgICAgICAgIEFVVEhfV0FJVF9TRVEyICAgICAgICAgICAgICAgICAgIEFVVEhfV0FJVF9TRVE0Ci0gICAgTVQyX01MTUVfQVVUSF9SRVEgICBtbG1lX2F1dGhfcmVxX2FjdGlvbiAgICBpbnZhbGlkX3N0YXRlX3doZW5fYXV0aCAgICAgICAgICBpbnZhbGlkX3N0YXRlX3doZW5fYXV0aAotICAgIE1UMl9QRUVSX0FVVEhfRVZFTiAgZHJvcCAgICAgICAgICAgICAgICAgICAgcGVlcl9hdXRoX2V2ZW5fYXRfc2VxMl9hY3Rpb24gICAgcGVlcl9hdXRoX2V2ZW5fYXRfc2VxNF9hY3Rpb24KLSAgICBNVDJfQVVUSF9USU1FT1VUICAgIERyb3AgICAgICAgICAgICAgICAgICAgIGF1dGhfdGltZW91dF9hY3Rpb24gICAgICAgICAgICAgIGF1dGhfdGltZW91dF9hY3Rpb24KLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0KLXZvaWQgQXV0aFN0YXRlTWFjaGluZUluaXQoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gU1RBVEVfTUFDSElORSAqU20sCi0gICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQotewotICAgIFN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfQVVUSF9TVEFURSwgTUFYX0FVVEhfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFVVEhfUkVRX0lETEUsIEFVVEhfTUFDSElORV9CQVNFKTsKLQotICAgIC8vIHRoZSBmaXJzdCBjb2x1bW4KLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfUkVRX0lETEUsIE1UMl9NTE1FX0FVVEhfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVBdXRoUmVxQWN0aW9uKTsKLQotICAgIC8vIHRoZSBzZWNvbmQgY29sdW1uCi0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX01MTUVfQVVUSF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkF1dGgpOwotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTIsIE1UMl9QRUVSX0FVVEhfRVZFTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXV0aFJzcEF0U2VxMkFjdGlvbik7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX0FVVEhfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylBdXRoVGltZW91dEFjdGlvbik7Ci0KLSAgICAvLyB0aGUgdGhpcmQgY29sdW1uCi0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX01MTUVfQVVUSF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkF1dGgpOwotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTQsIE1UMl9QRUVSX0FVVEhfRVZFTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbik7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX0FVVEhfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylBdXRoVGltZW91dEFjdGlvbik7Ci0KLQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBdXRoVGltZW91dCksIHBBZCwgRkFMU0UpOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGF0IHRpbWVyIHRocmVhZCB3aGVuIGF1dGggdGltZXIgZXhwaXJlcwotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEF1dGhUaW1lb3V0KAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLSAgICBSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFVVEggLSBBdXRoVGltZW91dFxuIikpOwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJcmV0dXJuOwotCi0JLy8gc2VuZCBhIGRlLWF1dGggdG8gcmVzZXQgQVAncyBzdGF0ZSBtYWNoaW5lIChQYXRjaCBBUC1EaXI2MzUpCi0JaWYgKHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPT0gQVVUSF9XQUlUX1NFUTIpCi0JCUNsczJlcnJBY3Rpb24ocEFkLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotCi0KLSAgICBNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfVElNRU9VVCwgMCwgTlVMTCk7Ci0gICAgUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWxtZUF1dGhSZXFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCWlmIChBVVRIX1JlcVNlbmQocEFkLCBFbGVtLCAmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgIkFVVEgiLCAxLCBOVUxMLCAwKSkKLSAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfV0FJVF9TRVEyOwotICAgIGVsc2UKLSAgICB7Ci0JCVVTSE9SVCBTdGF0dXM7Ci0KLSAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgIFN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7Ci0gICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOwotICAgIH0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLSAgICBVQ0hBUiAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0gICAgVVNIT1JUICAgICAgICBTZXEsIFN0YXR1cywgUmVtb3RlU3RhdHVzLCBBbGc7Ci0gICAgVUNIQVIgICAgICAgICBDaGxnVGV4dFtDSVBIRVJfVEVYVF9MRU5dOwotICAgIFVDSEFSICAgICAgICAgQ3lwZXJDaGxnVGV4dFtDSVBIRVJfVEVYVF9MRU4gKyA4ICsgOF07Ci0gICAgVUNIQVIgICAgICAgICBFbGVtZW50WzJdOwotICAgIEhFQURFUl84MDJfMTEgQXV0aEhkcjsKLSAgICBCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOwotICAgIFBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0gICAgTkRJU19TVEFUVVMgICBOU3RhdHVzOwotICAgIFVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOwotICAgIFVTSE9SVCAgICAgICAgU3RhdHVzMjsKLQotICAgIGlmIChQZWVyQXV0aFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkFsZywgJlNlcSwgJlN0YXR1cywgKFBDSEFSKUNobGdUZXh0KSkKLSAgICB7Ci0gICAgICAgIGlmIChNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIEFkZHIyKSAmJiBTZXEgPT0gMikKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFJlY2VpdmUgQVVUSF9SU1Agc2VxIzIgdG8gbWUgKEFsZz0lZCwgU3RhdHVzPSVkKVxuIiwgQWxnLCBTdGF0dXMpKTsKLSAgICAgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotICAgICAgICAgICAgaWYgKFN0YXR1cyA9PSBNTE1FX1NVQ0NFU1MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQXV0aGVudGljYXRpb24gTW9kZSAiTEVBUCIgaGFzIGFsbG93IGZvciBDQ1ggMS5YCi0gICAgICAgICAgICAgICAgaWYgKHBBZC0+TWxtZUF1eC5BbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOwotICAgICAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gMi4gc2hhcmVkIGtleSwgbmVlZCB0byBiZSBjaGFsbGVuZ2VkCi0gICAgICAgICAgICAgICAgICAgIFNlcSsrOwotICAgICAgICAgICAgICAgICAgICBSZW1vdGVTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7Ci0KLQkJCQkJLy8gR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLSAgICAgICAgICAgICAgICAgICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbFxuIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMyID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOwotICAgICAgICAgICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1czIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFNlbmQgQVVUSCByZXF1ZXN0IHNlcSMzLi4uXG4iKSk7Ci0gICAgICAgICAgICAgICAgICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwgU1VCVFlQRV9BVVRILCAwLCBBZGRyMiwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKLSAgICAgICAgICAgICAgICAgICAgQXV0aEhkci5GQy5XZXAgPSAxOwotICAgICAgICAgICAgICAgICAgICAvLyBFbmNyeXB0IGNoYWxsZW5nZSB0ZXh0ICYgYXV0aCBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICBSVE1QSW5pdFdlcEVuZ2luZSgKLQkJCXBBZCwKLQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAotCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAotCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4sCi0JCQlDeXBlckNobGdUZXh0KTsKLQotCQkJCQlBbGcgPSBjcHUybGUxNigqKFVTSE9SVCAqKSZBbGcpOwotCQkJCQlTZXEgPSBjcHUybGUxNigqKFVTSE9SVCAqKSZTZXEpOwotCQkJCQlSZW1vdGVTdGF0dXM9IGNwdTJsZTE2KCooVVNIT1JUICopJlJlbW90ZVN0YXR1cyk7Ci0KLQkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgKFBVQ0hBUikgJkFsZywgQ3lwZXJDaGxnVGV4dCArIDQsIDIpOwotCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCAoUFVDSEFSKSAmU2VxLCBDeXBlckNobGdUZXh0ICsgNiwgMik7Ci0JCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIChQVUNIQVIpICZSZW1vdGVTdGF0dXMsIEN5cGVyQ2hsZ1RleHQgKyA4LCAyKTsKLQkJCQkJRWxlbWVudFswXSA9IDE2OwotCQkJCQlFbGVtZW50WzFdID0gMTI4OwotCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCBFbGVtZW50LCBDeXBlckNobGdUZXh0ICsgMTAsIDIpOwotCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCBDaGxnVGV4dCwgQ3lwZXJDaGxnVGV4dCArIDEyLCAxMjgpOwotCQkJCQlSVE1QU2V0SUNWKHBBZCwgQ3lwZXJDaGxnVGV4dCArIDE0MCk7Ci0gICAgICAgICAgICAgICAgICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZBdXRoSGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfVEVYVF9MRU4gKyAxNiwgICAgIEN5cGVyQ2hsZ1RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLSAgICAgICAgICAgICAgICAgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgICAgIFJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgQVVUSF9USU1FT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfV0FJVF9TRVE0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoRmFpbFJlYXNvbiA9IFN0YXR1czsKLSAgICAgICAgICAgICAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkF1dGhGYWlsU3RhLCBBZGRyMik7Ci0gICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFBlZXJBdXRoU2FuaXR5KCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKLSAgICB9Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0gICAgVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotICAgIFVTSE9SVCAgICAgICAgQWxnLCBTZXEsIFN0YXR1czsKLSAgICBDSEFSICAgICAgICAgIENobGdUZXh0W0NJUEhFUl9URVhUX0xFTl07Ci0gICAgQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKLQotICAgIGlmKFBlZXJBdXRoU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQWxnLCAmU2VxLCAmU3RhdHVzLCBDaGxnVGV4dCkpCi0gICAgewotICAgICAgICBpZihNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIEFkZHIyKSAmJiBTZXEgPT0gNCkKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFJlY2VpdmUgQVVUSF9SU1Agc2VxIzQgdG8gbWVcbiIpKTsKLSAgICAgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotICAgICAgICAgICAgaWYgKFN0YXR1cyAhPSBNTE1FX1NVQ0NFU1MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQXV0aEZhaWxSZWFzb24gPSBTdGF0dXM7Ci0gICAgICAgICAgICAgICAgQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5BdXRoRmFpbFN0YSwgQWRkcjIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKLSAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7Ci0gICAgfQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWxtZURlYXV0aFJlcUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0gICAgTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAqcEluZm87Ci0gICAgSEVBREVSXzgwMl8xMSBEZWF1dGhIZHI7Ci0gICAgUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLSAgICBORElTX1NUQVRVUyAgIE5TdGF0dXM7Ci0gICAgVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0gICAgVVNIT1JUICAgICAgICBTdGF0dXM7Ci0KLSAgICBwSW5mbyA9IChNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICopRWxlbS0+TXNnOwotCi0gICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLSAgICBpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIE1sbWVEZWF1dGhSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbFxuIikpOwotICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKLSAgICAgICAgU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOwotICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfREVBVVRIX0NPTkYsIDIsICZTdGF0dXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gU2VuZCBERS1BVVRIIHJlcXVlc3QgKFJlYXNvbj0lZCkuLi5cbiIsIHBJbmZvLT5SZWFzb24pKTsKLSAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRlYXV0aEhkciwgU1VCVFlQRV9ERUFVVEgsIDAsIHBJbmZvLT5BZGRyLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZEZWF1dGhIZHIsCi0gICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZwSW5mby0+UmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLSAgICBNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0gICAgcEFkLT5TdGFDZmcuRGVhdXRoUmVhc29uID0gcEluZm8tPlJlYXNvbjsKLSAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRlYXV0aFN0YSwgcEluZm8tPkFkZHIpOwotICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOwotICAgIFN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKLSAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfREVBVVRIX0NPTkYsIDIsICZTdGF0dXMpOwotCi0JLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBkZWF1dGhlbnRpY2F0aW9uCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19ERUFVVEhfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEF1dGhUaW1lb3V0QWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLSAgICBVU0hPUlQgU3RhdHVzOwotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBBdXRoVGltZW91dEFjdGlvblxuIikpOwotICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOwotICAgIFN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7Ci0gICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBJbnZhbGlkU3RhdGVXaGVuQXV0aCgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0gICAgVVNIT1JUIFN0YXR1czsKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gSW52YWxpZFN0YXRlV2hlbkF1dGggKHN0YXRlPSVsZCksIHJlc2V0IEFVVEggc3RhdGUgbWFjaGluZVxuIiwgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSkpOwotICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOwotICAgIFN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7Ci0gICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU29tZSBTVEEvQVAKLSAgICBOb3RlOgotICAgICAgICBUaGlzIGFjdGlvbiBzaG91bGQgbmV2ZXIgdHJpZ2dlciBBVVRIIHN0YXRlIHRyYW5zaXRpb24sIHRoZXJlZm9yZSB3ZQotICAgICAgICBzZXBhcmF0ZSBpdCBmcm9tIEFVVEggc3RhdGUgbWFjaGluZSwgYW5kIG1ha2UgaXQgYXMgYSBzdGFuZGFsb25lIHNlcnZpY2UKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBDbHMyZXJyQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFBVQ0hBUiBwQWRkcikKLXsKLSAgICBIRUFERVJfODAyXzExIERlYXV0aEhkcjsKLSAgICBQVUNIQVIgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotICAgIE5ESVNfU1RBVFVTICAgTlN0YXR1czsKLSAgICBVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKLSAgICBVU0hPUlQgICAgICAgIFJlYXNvbiA9IFJFQVNPTl9DTFMyRVJSOwotCi0gICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLSAgICBpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotICAgICAgICByZXR1cm47Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gQ2xhc3MgMiBlcnJvciwgU2VuZCBERUFVVEggZnJhbWUuLi5cbiIpKTsKLSAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRlYXV0aEhkciwgU1VCVFlQRV9ERUFVVEgsIDAsIHBBZGRyLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZEZWF1dGhIZHIsCi0gICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZSZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOwotICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0KLSAgICBwQWQtPlN0YUNmZy5EZWF1dGhSZWFzb24gPSBSZWFzb247Ci0gICAgQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EZWF1dGhTdGEsIHBBZGRyKTsKLX0KLQotQk9PTEVBTglBVVRIX1JlcVNlbmQoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiAgUE1MTUVfUVVFVUVfRUxFTQlwRWxlbSwKLQlJTiAgUFJBTElOS19USU1FUl9TVFJVQ1QgcEF1dGhUaW1lciwKLQlJTiAgUFNUUklORwkJCQlwU01OYW1lLAotCUlOICBVU0hPUlQJCQkJU2VxTm8sCi0JSU4gIFBVQ0hBUgkJCQlwTmV3RWxlbWVudCwKLQlJTiAgVUxPTkcJCQkJRWxlbWVudExlbikKLXsKLQlVU0hPUlQgICAgICAgICAgICAgQWxnLCBTZXEsIFN0YXR1czsKLQlVQ0hBUiAgICAgICAgICAgICAgQWRkcls2XTsKLSAgICBVTE9ORyAgICAgICAgICAgICAgVGltZW91dDsKLSAgICBIRUFERVJfODAyXzExICAgICAgQXV0aEhkcjsKLSAgICBCT09MRUFOICAgICAgICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0gICAgTkRJU19TVEFUVVMgICAgICAgIE5TdGF0dXM7Ci0gICAgUFVDSEFSICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotICAgIFVMT05HICAgICAgICAgICAgICBGcmFtZUxlbiA9IDAsIHRtcCA9IDA7Ci0KLQkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKLQlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKLQl7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0gQmxvY2sgQXV0aCByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIsIHBTTU5hbWUpKTsKLSAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgIFN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7Ci0gICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOwotCX0KLSAgICBlbHNlIGlmKE1sbWVBdXRoUmVxU2FuaXR5KHBBZCwgcEVsZW0tPk1zZywgcEVsZW0tPk1zZ0xlbiwgQWRkciwgJlRpbWVvdXQsICZBbGcpKQotICAgIHsKLQkvKiByZXNldCB0aW1lciAqLwotCQlSVE1QQ2FuY2VsVGltZXIocEF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotICAgICAgICBDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQWRkcik7Ci0gICAgICAgIHBBZC0+TWxtZUF1eC5BbGcgID0gQWxnOwotICAgICAgICBTZXEgPSBTZXFObzsKLSAgICAgICAgU3RhdHVzID0gTUxNRV9TVUNDRVNTOwotCi0gICAgICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0gICAgICAgIGlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgLSBNbG1lQXV0aFJlcUFjdGlvbihBbGc6JWQpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWRcbiIsIHBTTU5hbWUsIEFsZykpOwotICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgICAgICBTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7Ci0gICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0gU2VuZCBBVVRIIHJlcXVlc3Qgc2VxIzEgKEFsZz0lZCkuLi5cbiIsIHBTTU5hbWUsIEFsZykpOwotICAgICAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkF1dGhIZHIsIFNVQlRZUEVfQVVUSCwgMCwgQWRkciwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKLSAgICAgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZBdXRoSGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJkFsZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZTZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0KLQkJaWYgKHBOZXdFbGVtZW50ICYmIEVsZW1lbnRMZW4pCi0JCXsKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sCSZ0bXAsCi0JCQkJCQkJICBFbGVtZW50TGVuLAkJCXBOZXdFbGVtZW50LAotCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJRnJhbWVMZW4gKz0gdG1wOwotCQl9Ci0KLSAgICAgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQotCQlSVE1QU2V0VGltZXIocEF1dGhUaW1lciwgVGltZW91dCk7Ci0JCXJldHVybiBUUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEQkdQUklOVF9FUlIoKCIlcyAtIE1sbWVBdXRoUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZFxuIiwgcFNNTmFtZSkpOwotCQlyZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0JcmV0dXJuIFRSVUU7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9hdXRoX3JzcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvYXV0aF9yc3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3YmZlYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9hdXRoX3JzcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JYXV0aF9yc3AuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4JCTIwMDQtMTAtMQkJY29weSBmcm9tIFJUMjU2MAotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgYXV0aGVudGljYXRpb24gc3RhdGUgbWFjaGluZSBpbml0IHByb2NlZHVyZQotICAgIFBhcmFtZXRlcnM6Ci0gICAgICAgIFNtIC0gdGhlIHN0YXRlIG1hY2hpbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFBTVEFURV9NQUNISU5FIFNtLAotICAgIElOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQotewotICAgIFN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfQVVUSF9SU1BfU1RBVEUsIE1BWF9BVVRIX1JTUF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQVVUSF9SU1BfSURMRSwgQVVUSF9SU1BfTUFDSElORV9CQVNFKTsKLQotICAgIC8vIGNvbHVtbiAxCi0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JTUF9JRExFLCBNVDJfUEVFUl9ERUFVVEgsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRlYXV0aEFjdGlvbik7Ci0KLSAgICAvLyBjb2x1bW4gMgotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9SU1BfV0FJVF9DSEFMLCBNVDJfUEVFUl9ERUFVVEgsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRlYXV0aEFjdGlvbik7Ci0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUGVlckF1dGhTaW1wbGVSc3BHZW5BbmRTZW5kKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKLSAgICBJTiBVU0hPUlQgQWxnLAotICAgIElOIFVTSE9SVCBTZXEsCi0gICAgSU4gVVNIT1JUIFJlYXNvbiwKLSAgICBJTiBVU0hPUlQgU3RhdHVzKQotewotICAgIEhFQURFUl84MDJfMTEgICAgIEF1dGhIZHI7Ci0gICAgVUxPTkcgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOwotICAgIFBVQ0hBUiAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotICAgIE5ESVNfU1RBVFVTICAgICAgIE5TdGF0dXM7Ci0KLSAgICBpZiAoUmVhc29uICE9IE1MTUVfU1VDQ0VTUykKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXIgQVVUSCBmYWlsLi4uXG4iKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLQkvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0gICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKLSAgICBpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotICAgICAgICByZXR1cm47Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIEFVVEggcmVzcG9uc2UgKHNlcSMyKS4uLlxuIikpOwotICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwgU1VCVFlQRV9BVVRILCAwLCBwSGRyODAyMTEtPkFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJkF1dGhIZHIsCi0gICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmQWxnLAotICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJlNlcSwKLSAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZSZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOwotICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFBlZXJEZWF1dGhBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gUE1MTUVfUVVFVUVfRUxFTSBFbGVtKQotewotICAgIFVDSEFSICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0gICAgVVNIT1JUICAgICAgUmVhc29uOwotCi0gICAgaWYgKFBlZXJEZWF1dGhTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZSZWFzb24pKQotICAgIHsKLSAgICAgICAgaWYgKElORlJBX09OKHBBZCkKLQkJCSYmIE1BQ19BRERSX0VRVUFMKEFkZHIyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCkKLQkJCSkKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBVVRIX1JTUCAtIHJlY2VpdmUgREUtQVVUSCBmcm9tIG91ciBBUCAoUmVhc29uPSVkKVxuIiwgUmVhc29uKSk7Ci0KLQotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgU0lPQ0dJV0FQLCAtMSwgTlVMTCwgTlVMTCwgMCk7Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotCi0JCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIGRlYXV0aGVudGljYXRpb24KLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19ERUFVVEhfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQotICAgICAgICAgICAgTGlua0Rvd24ocEFkLCBUUlVFKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFVVEhfUlNQIC0gUGVlckRlYXV0aEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvY29ubmVjdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvY29ubmVjdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWEzNWVlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL2Nvbm5lY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NTkgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQljb25uZWN0LmMKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlKb2huCQkJMjAwNC0wOC0wOAkJCU1ham9yIG1vZGlmaWNhdGlvbiBmcm9tIFJUMjU2MAotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLVVDSEFSCUNpcGhlclN1aXRlV3BhTm9uZVRraXBbXSA9IHsKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCi0JCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0Ci0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDUwLCAweGYyLCAweDAwCS8vIGF1dGhlbnRpY2F0aW9uCi0JCX07Ci1VQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwTGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwKSAvIHNpemVvZihVQ0hBUikpOwotCi1VQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVBZXNbXSA9IHsKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCi0JCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLy8gTXVsdGljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0Ci0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQsCS8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDUwLCAweGYyLCAweDAwCS8vIGF1dGhlbnRpY2F0aW9uCi0JCX07Ci1VQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVBZXNMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlV3BhTm9uZUFlcykgLyBzaXplb2YoVUNIQVIpKTsKLQotLy8gVGhlIGZvbGxvd2luZyBNQUNSTyBpcyBjYWxsZWQgYWZ0ZXIgMS4gc3RhcnRpbmcgYW4gbmV3IElCU1MsIDIuIHN1Y2Nlc2Z1bGx5IEpPSU4gYW4gSUJTUywKLS8vIG9yIDMuIHN1Y2Nlc2Z1bGx5IEFTU09DSUFURSB0byBhIEJTUywgNC4gc3VjY2Vzc2Z1bGx5IFJFX0FTU09DSUFURSB0byBhIEJTUwotLy8gQWxsIHNldHRpbmdzIHN1Y2Nlc3NmdWx5IG5lZ290aWF0ZWQgZnVyaW5nIE1MTUUgc3RhdGUgbWFjaGluZXMgYmVjb21lIGZpbmFsIHNldHRpbmdzCi0vLyBhbmQgYXJlIGNvcGllZCB0byBwQWQtPlN0YUFjdGl2ZQotI2RlZmluZSBDT1BZX1NFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhfcEFkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JTmRpc1plcm9NZW1vcnkoKF9wQWQpLT5Db21tb25DZmcuU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsJCQkJCQkJXAotCShfcEFkKS0+Q29tbW9uQ2ZnLlNzaWRMZW4gPSAoX3BBZCktPk1sbWVBdXguU3NpZExlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPkNvbW1vbkNmZy5Tc2lkLCAoX3BBZCktPk1sbWVBdXguU3NpZCwgKF9wQWQpLT5NbG1lQXV4LlNzaWRMZW4pOyBcCi0JQ09QWV9NQUNfQUREUigoX3BBZCktPkNvbW1vbkNmZy5Cc3NpZCwgKF9wQWQpLT5NbG1lQXV4LkJzc2lkKTsgICAgICAgICAgICAgICAgICAgICAgXAotCShfcEFkKS0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSAoX3BBZCktPk1sbWVBdXguQ2hhbm5lbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkoX3BBZCktPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IChfcEFkKS0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbDsgICAgICAgICAgICAgICAgICBcCi0JKF9wQWQpLT5TdGFBY3RpdmUuQWlkID0gKF9wQWQpLT5NbG1lQXV4LkFpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCShfcEFkKS0+U3RhQWN0aXZlLkF0aW1XaW4gPSAoX3BBZCktPk1sbWVBdXguQXRpbVdpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkoX3BBZCktPlN0YUFjdGl2ZS5DYXBhYmlsaXR5SW5mbyA9IChfcEFkKS0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbzsgICAgICAgICAgICAgICAgICBcCi0JKF9wQWQpLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gKF9wQWQpLT5NbG1lQXV4LkJlYWNvblBlcmlvZDsgICAgICAgICAgICAgICAgICAgICAgXAotCShfcEFkKS0+U3RhQWN0aXZlLkNmcE1heER1cmF0aW9uID0gKF9wQWQpLT5NbG1lQXV4LkNmcE1heER1cmF0aW9uOyAgICAgICAgICAgICAgICAgIFwKLQkoX3BBZCktPlN0YUFjdGl2ZS5DZnBQZXJpb2QgPSAoX3BBZCktPk1sbWVBdXguQ2ZwUGVyaW9kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JKF9wQWQpLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiA9IChfcEFkKS0+TWxtZUF1eC5TdXBSYXRlTGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+U3RhQWN0aXZlLlN1cFJhdGUsIChfcEFkKS0+TWxtZUF1eC5TdXBSYXRlLCAoX3BBZCktPk1sbWVBdXguU3VwUmF0ZUxlbik7XAotCShfcEFkKS0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPSAoX3BBZCktPk1sbWVBdXguRXh0UmF0ZUxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPlN0YUFjdGl2ZS5FeHRSYXRlLCAoX3BBZCktPk1sbWVBdXguRXh0UmF0ZSwgKF9wQWQpLT5NbG1lQXV4LkV4dFJhdGVMZW4pO1wKLQlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBFZGNhUGFybSwgJihfcEFkKS0+TWxtZUF1eC5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7XAotCU5kaXNNb3ZlTWVtb3J5KCYoX3BBZCktPkNvbW1vbkNmZy5BUFFvc0NhcGFiaWxpdHksICYoX3BBZCktPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpO1wKLQlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBRYnNzTG9hZCwgJihfcEFkKS0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTtcCi0JQ09QWV9NQUNfQUREUigoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIChfcEFkKS0+TWxtZUF1eC5Cc3NpZCk7ICAgICAgXAotCShfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWlkID0gKF9wQWQpLT5NbG1lQXV4LkFpZDsgICAgICAgICAgICAgICAgICAgICAgIFwKLQkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IChfcEFkKS0+U3RhQ2ZnLlBhaXJDaXBoZXI7XAotCUNPUFlfTUFDX0FERFIoKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5Cc3NJZCwgKF9wQWQpLT5NbG1lQXV4LkJzc2lkKTtcCi0JKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SYXRlTGVuID0gKF9wQWQpLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiArIChfcEFkKS0+U3RhQWN0aXZlLkV4dFJhdGVMZW47XAotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIE1sbWVDbnRsSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBTVEFURV9NQUNISU5FICpTLAotCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKLXsKLQkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgZGlmZmVycyBmcm9tIG90aGVyIHN0YXRlIG1hY2hpbmVzLCB0aGUgaW50ZXJmYWNlCi0JLy8gZm9sbG93cyB0aGUgc3RhbmRhcmQgaW50ZXJmYWNlCi0JcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgTWxtZUNudGxNYWNoaW5lUGVyZm9ybUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBTVEFURV9NQUNISU5FICpTLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlzd2l0Y2gocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSkKLQl7Ci0JCWNhc2UgQ05UTF9JRExFOgotCQkJQ250bElkbGVQcm9jKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDTlRMX1dBSVRfRElTQVNTT0M6Ci0JCQlDbnRsV2FpdERpc2Fzc29jUHJvYyhwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ05UTF9XQUlUX0pPSU46Ci0JCQlDbnRsV2FpdEpvaW5Qcm9jKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQotCQkvLyBDTlRMX1dBSVRfUkVBU1NPQyBpcyB0aGUgb25seSBzdGF0ZSBpbiBDTlRMIG1hY2hpbmUgdGhhdCBkb2VzCi0JCS8vIG5vdCB0cmlnZ2VyZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBieSAiUlRNUFNldEluZm9ybWF0aW9uKE9JRF94eHgpIi4KLQkJLy8gVGhlcmVmb3JlIG5vdCBwcm90ZWN0ZWQgYnkgTkRJUydzICJvbmx5IG9uZSBvdXRzdGFuZGluZyBPSUQgcmVxdWVzdCIKLQkJLy8gcnVsZS4gV2hpY2ggbWVhbnMgTkRJUyBtYXkgU0VUIE9JRCBpbiB0aGUgbWlkZGxlIG9mIFJPQU1pbmcgYXR0ZW1wdHMuCi0JCS8vIEN1cnJlbnQgYXBwcm9hY2ggaXMgdG8gYmxvY2sgbmV3IFNFVCByZXF1ZXN0IGF0IFJUTVBTZXRJbmZvcm1hdGlvbigpCi0JCS8vIHdoZW4gQ250bE1hY2hpbmUuQ3VyclN0YXRlIGlzIG5vdCBDTlRMX0lETEUKLQkJY2FzZSBDTlRMX1dBSVRfUkVBU1NPQzoKLQkJCUNudGxXYWl0UmVhc3NvY1Byb2MocEFkLCBFbGVtKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ05UTF9XQUlUX1NUQVJUOgotCQkJQ250bFdhaXRTdGFydFByb2MocEFkLCBFbGVtKTsKLQkJCWJyZWFrOwotCQljYXNlIENOVExfV0FJVF9BVVRIOgotCQkJQ250bFdhaXRBdXRoUHJvYyhwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ05UTF9XQUlUX0FVVEgyOgotCQkJQ250bFdhaXRBdXRoUHJvYzIocEFkLCBFbGVtKTsKLQkJCWJyZWFrOwotCQljYXNlIENOVExfV0FJVF9BU1NPQzoKLQkJCUNudGxXYWl0QXNzb2NQcm9jKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENOVExfV0FJVF9PSURfTElTVF9TQ0FOOgotCQkJaWYoRWxlbS0+TXNnVHlwZSA9PSBNVDJfU0NBTl9DT05GKQotCQkJewotCQkJCS8vIFJlc3VtZSBUeFJpbmcgYWZ0ZXIgU0NBTklORyBjb21wbGV0ZS4gV2UgaG9wZSB0aGUgb3V0LW9mLXNlcnZpY2UgdGltZQotCQkJCS8vIHdvbid0IGJlIHRvbyBsb25nIHRvIGxldCB1cHBlciBsYXllciB0aW1lLW91dCB0aGUgd2FpdGluZyBmcmFtZXMKLQkJCQlSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbihwQWQpOwotCi0JCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQotICAgICAgICAgICAgICAgIC8vCi0JCQkJLy8gU2V0IExFRCBzdGF0dXMgdG8gcHJldmlvdXMgc3RhdHVzLgotCQkJCS8vCi0JCQkJaWYgKHBBZC0+YkxlZE9uU2Nhbm5pbmcpCi0JCQkJewotCQkJCQlwQWQtPmJMZWRPblNjYW5uaW5nID0gRkFMU0U7Ci0JCQkJCVJUTVBTZXRMRUQocEFkLCBwQWQtPkxlZFN0YXR1cyk7Ci0JCQkJfQotI2lmZGVmIERPVDExTl9EUkFGVDMKLQkJCQkvLyBBUCBzZW50IGEgMjA0MENvZXhpc3RlbmNlIG1nbXQgZnJhbWUsIHRoZW4gc3RhdGlvbiBwZXJmb3JtIGEgc2NhbiwgYW5kIHRoZW4gc2VuZCBiYWNrIHRoZSByZXNwb25lLgotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5JbmZvUmVxID09IDEpCi0JCQkJewotCQkJCQlVcGRhdGUyMDQwQ29leGlzdEZyYW1lQW5kTm90aWZ5KHBBZCwgQlNTSURfV0NJRCwgVFJVRSk7Ci0JCQkJfQotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ05UTF9XQUlUX09JRF9ESVNBU1NPQzoKLQkJCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9ESVNBU1NPQ19DT05GKQotCQkJewotCQkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOwotCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UX0VSUigoIiFFUlJPUiEgQ05UTCAtIElsbGVnYWwgbWVzc2FnZSB0eXBlKD0lbGQpIiwgRWxlbS0+TXNnVHlwZSkpOwotCQkJYnJlYWs7Ci0JfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIENudGxJZGxlUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICAgRGlzYXNzb2NSZXE7Ci0KLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCi0JCXJldHVybjsKLQotCXN3aXRjaChFbGVtLT5Nc2dUeXBlKQotCXsKLQkJY2FzZSBPSURfODAyXzExX1NTSUQ6Ci0JCQlDbnRsT2lkU3NpZFByb2MocEFkLCBFbGVtKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgT0lEXzgwMl8xMV9CU1NJRDoKLQkJCUNudGxPaWRSVEJzc2lkUHJvYyhwQWQsRWxlbSk7Ci0JCQlicmVhazsKLQotCQljYXNlIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOOgotCQkJQ250bE9pZFNjYW5Qcm9jKHBBZCxFbGVtKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEU6Ci0JCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DOwotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJKQotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSAgICAgICAgICAgIHsKLQkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKLQkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KLQkJCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7Ci0JCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7Ci0gICAgICAgICAgICB9Ci0JCQlicmVhazsKLQotCQljYXNlIE1UMl9NTE1FX1JPQU1JTkdfUkVROgotCQkJQ250bE1sbWVSb2FtaW5nUHJvYyhwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBPSURfODAyXzExX01JQ19GQUlMVVJFX1JFUE9SVF9GUkFNRToKLSAgICAgICAgICAgIFdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZShwQWQsIEVsZW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU06Ci0JCQlDbnRsT2lkRExTU2V0dXBQcm9jKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotCQlkZWZhdWx0OgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIElsbGVnYWwgbWVzc2FnZSBpbiBDbnRsSWRsZVByb2MoTXNnVHlwZT0lbGQpXG4iLEVsZW0tPk1zZ1R5cGUpKTsKLQkJCWJyZWFrOwotCX0KLX0KLQotVk9JRCBDbnRsT2lkU2NhblByb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCU1MTUVfU0NBTl9SRVFfU1RSVUNUICAgICAgIFNjYW5SZXE7Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgICAgQnNzSWR4ID0gQlNTX05PVF9GT1VORDsKLQlCU1NfRU5UUlkgICAgICAgICAgICAgICAgICBDdXJyQnNzOwotCi0jaWZkZWYgUkFMSU5LX0FURQotLyogRGlzYWJsZSBzY2FubmluZyB3aGVuIEFURSBpcyBydW5uaW5nLiAqLwotCWlmIChBVEVfT04ocEFkKSkKLQkJcmV0dXJuOwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCi0JLy8gcmVjb3JkIGN1cnJlbnQgQlNTIGlmIG5ldHdvcmsgaXMgY29ubmVjdGVkLgotCS8vIDIwMDMtMi0xMyBkbyBub3QgaW5jbHVkZSBjdXJyZW50IElCU1MgaWYgdGhpcyBpcyB0aGUgb25seSBTVEEgaW4gdGhpcyBJQlNTLgotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JewotCQlCc3NJZHggPSBCc3NTc2lkVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcEFkLT5Db21tb25DZmcuQnNzaWQsIChQVUNIQVIpcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCWlmIChCc3NJZHggIT0gQlNTX05PVF9GT1VORCkKLQkJewotCQkJTmRpc01vdmVNZW1vcnkoJkN1cnJCc3MsICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XSwgc2l6ZW9mKEJTU19FTlRSWSkpOwotCQl9Ci0JfQotCi0JLy8gY2xlYW4gdXAgcHJldmlvdXMgU0NBTiByZXN1bHQsIGFkZCBjdXJyZW50IEJTUyBiYWNrIHRvIHRhYmxlIGlmIGFueQotCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKLQlpZiAoQnNzSWR4ICE9IEJTU19OT1RfRk9VTkQpCi0JewotCQkvLyBEREsgTm90ZTogSWYgdGhlIE5JQyBpcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIEJTU0lEIGFuZCBTU0lECi0JCS8vICAgIHRoYXQgYXJlIG5vdCBjb250YWluZWQgaW4gdGhlIGxpc3Qgb2YgQlNTSURzIGdlbmVyYXRlZCBieSB0aGlzIHNjYW4sIHRoZQotCQkvLyAgICBCU1NJRCBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudGx5IGFzc29jaWF0ZWQgQlNTSUQgYW5kIFNTSUQgc2hvdWxkIGJlCi0JCS8vICAgIGFwcGVuZGVkIHRvIHRoZSBsaXN0IG9mIEJTU0lEcyBpbiB0aGUgTklDJ3MgZGF0YWJhc2UuCi0JCS8vIFRvIGVuc3VyZSB0aGlzLCB3ZSBhcHBlbmQgdGhpcyBCU1MgYXMgdGhlIGZpcnN0IGVudHJ5IGluIFNDQU4gcmVzdWx0Ci0JCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbMF0sICZDdXJyQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7Ci0JCXBBZC0+U2NhblRhYi5Cc3NOciA9IDE7Ci0JfQotCi0JU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIChQU1RSSU5HKSBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOwotCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwKLQkJc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOwotCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlCZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUsIHVzZXIgZGVzaXJlZCBTU0lEIHNob3VsZCBhbHJlYWR5IGJlZW4KLQkJcmVjb3JkZWQgaW4gQ29tbW9uQ2ZnLlNzaWRbXQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIENudGxPaWRTc2lkUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKQotewotCVBORElTXzgwMl8xMV9TU0lEICAgICAgICAgIHBPaWRTc2lkID0gKE5ESVNfODAyXzExX1NTSUQgKilFbGVtLT5Nc2c7Ci0JTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICAgRGlzYXNzb2NSZXE7Ci0JVUxPTkcJCQkJCSAgIE5vdzsKLQotCi0JLy8gU3RlcCAxLiByZWNvcmQgdGhlIGRlc2lyZWQgdXNlciBzZXR0aW5ncyB0byBNbG1lQXV4Ci0JTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHBPaWRTc2lkLT5Tc2lkLCBwT2lkU3NpZC0+U3NpZExlbmd0aCk7Ci0JcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSAoVUNIQVIpcE9pZFNzaWQtPlNzaWRMZW5ndGg7Ci0JTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOwotCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gcEFkLT5TdGFDZmcuQnNzVHlwZTsKLQotCXBBZC0+U3RhQ2ZnLmJBdXRvQ29ubmVjdEJ5QnNzaWQgPSBGQUxTRTsKLQotCS8vCi0JLy8gVXBkYXRlIFJlY29ubmVjdCBTc2lkLCB0aGF0IHVzZXIgZGVzaXJlZCB0byBjb25uZWN0LgotCS8vCi0JTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBNQVhfTEVOX09GX1NTSUQpOwotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKLQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSBwQWQtPk1sbWVBdXguU3NpZExlbjsKLQotCS8vIHN0ZXAgMi4gZmluZCBhbGwgbWF0Y2hpbmcgQlNTIGluIHRoZSBsYXN0ZXN0IFNDQU4gcmVzdWx0IChpbkJzc1RhYikKLQkvLyAgICAmIGxvZyB0aGVtIGludG8gTWxtZUF1eC5Tc2lkQnNzVGFiIGZvciBsYXRlci1vbiBpdGVyYXRpb24uIFNvcnQgYnkgUlNTSSBvcmRlcgotCUJzc1RhYmxlU3NpZFNvcnQocEFkLCAmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIsIChQQ0hBUilwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtICVkIEJTUyBvZiAlZCBCU1MgbWF0Y2ggdGhlIGRlc2lyZSAoJWQpU1NJRCAtICVzXG4iLAotCQkJcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIsIHBBZC0+U2NhblRhYi5Cc3NOciwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIHBBZC0+TWxtZUF1eC5Tc2lkKSk7Ci0JTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKLQotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkgJiYKLQkJKHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4gPT0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0uU3NpZExlbikgJiYKLQkJTmRpc0VxdWFsTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pICYmCi0JCU1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXS5Cc3NpZCkpCi0JewotCQkvLyBDYXNlIDEuIGFscmVhZHkgY29ubmVjdGVkIHdpdGggYW4gQVAgd2hvIGhhcyB0aGUgZGVzaXJlZCBTU0lECi0JCS8vICAgICAgICAgd2l0aCBoaWdoZXN0IFJTU0kKLQotCQkvLyBBZGQgY2hlY2tpbmcgTW9kZSAiTEVBUCIgZm9yIENDWCAxLjAKLQkJaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAotCQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8Ci0JCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8Ci0JCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0JCQkgKSAmJgotCQkJKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCi0JCXsKLQkJCS8vIGNhc2UgMS4xIEZvciBXUEEsIFdQQS1QU0ssIGlmIHRoZSAxeCBwb3J0IGlzIG5vdCBzZWN1cmVkLCB3ZSBoYXZlIHRvIHJlZG8KLQkJCS8vICAgICAgICAgIGNvbm5lY3Rpb24gcHJvY2VzcwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAuLi5cbiIpKTsKLQkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOwotCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCi0JCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7Ci0JCX0KLQkJZWxzZSBpZiAocEFkLT5iQ29uZmlnQ2hhbmdlZCA9PSBUUlVFKQotCQl7Ci0JCQkvLyBjYXNlIDEuMiBJbXBvcnRhbnQgQ29uZmlnIGhhcyBjaGFuZ2VkLCB3ZSBoYXZlIHRvIHJlY29ubmVjdCB0byB0aGUgc2FtZSBBUAotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAgQmVjYXVzZSBjb25maWcgY2hhbmdlZC4uLlxuIikpOwotCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKLQkJCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOwotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIGNhc2UgMS4zLiBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUgU1NJRCB3aXRoIGhpZ2hlc3QgUlNTSS4KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBhbHJlYWR5IHdpdGggdGhpcyBCU1NJRC4gaWdub3JlIHRoaXMgU0VUX1NTSUQgcmVxdWVzdFxuIikpOwotCQkJLy8KLQkJCS8vIChIQ1QgMTIuMSkgMWNfd2xhbl9tZWRpYWV2ZW50cyByZXF1aXJlZAotCQkJLy8gbWVkaWEgY29ubmVjdCBldmVudHMgYXJlIGluZGljYXRlZCB3aGVuIGFzc29jaWF0aW5nIHdpdGggdGhlIHNhbWUgQVAKLQkJCS8vCi0JCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJCXsKLQkJCQkvLwotCQkJCS8vIFNpbmNlIE1lZGlhU3RhdGUgYWxyZWFkeSBpcyBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZAotCQkJCS8vIFdlIGp1c3QgaW5kaWNhdGUgdGhlIGNvbm5lY3QgZXZlbnQgYWdhaW4gdG8gbWVldCB0aGUgV0hRTCByZXF1aXJlZC4KLQkJCQkvLwotCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0JCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLSAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cAotCQkJfQotCi0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIFNJT0NHSVdBUCwgLTEsICZwQWQtPk1sbWVBdXguQnNzaWRbMF0sIE5VTEwsIDApOwotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0JCX0KLQl9Ci0JZWxzZSBpZiAoSU5GUkFfT04ocEFkKSkKLQl7Ci0JCS8vCi0JCS8vIEZvciBSVDYxCi0JCS8vIFs4ODg4OF0gT0lEXzgwMl8xMV9TU0lEIHNob3VsZCBoYXZlIHJldHVybmVkIE5EVEVTVF9XRVBfQVAyKFJldHVybmVkOiApCi0JCS8vIFJUNjEgbWF5IGxvc3QgU1NJRCwgYW5kIG5vdCBjb25uZWN0IHRvIE5EVEVTVF9XRVBfQVAyIGFuZCB3aWxsIGNvbm5lY3QgdG8gTkRURVNUX1dFUF9BUDIgYnkgQXV0b3JlY29ubmVjdAotCQkvLyBCdXQgbWVkaWEgc3RhdHVzIGlzIGNvbm5lY3RlZCwgc28gdGhlIFNTSUQgbm90IHJlcG9ydCBjb3JyZWN0bHkuCi0JCS8vCi0JCWlmICghU1NJRF9FUVVBTChwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pKQotCQl7Ci0JCQkvLwotCQkJLy8gRGlmZmVyZW50IFNTSUQgbWVhbnMgbm90IFJvYW1pbmcgY2FzZSwgc28gd2UgbGV0IExpbmtEb3duKCkgdG8gSW5kaWNhdGUgYSBkaXNjb25uZWN0IGV2ZW50LgotCQkJLy8KLQkJCXBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IFRSVUU7Ci0JCX0KLQkJLy8gY2FzZSAyLiBhY3RpdmUgSU5GUkEgYXNzb2NpYXRpb24gZXhpc3RlbnQKLQkJLy8gICAgcm9hbWluZyBpcyBkb25lIHdpdGhpbiBtaW5pcG9ydCBkcml2ZXIsIG5vdGhpbmcgdG8gZG8gd2l0aCBjb25maWd1cmF0aW9uCi0JCS8vICAgIHV0aWxpdHkuIHNvIHVwb24gYSBuZXcgU0VUKE9JRF84MDJfMTFfU1NJRCkgaXMgcmVjZWl2ZWQsIHdlIGp1c3QKLQkJLy8gICAgZGlzYXNzb2NpYXRlIHdpdGggdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCwKLQkJLy8gICAgdGhlbiBwZXJmb3JtIGEgbmV3IGFzc29jaWF0aW9uIHdpdGggdGhpcyBuZXcgU1NJRCwgbm8gbWF0dGVyIHRoZQotCQkvLyAgICBuZXcvb2xkIFNTSUQgYXJlIHRoZSBzYW1lIG9yIG5vdC4KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAuLi5cbiIpKTsKLQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAotCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKLQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKEFESE9DX09OKHBBZCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkcm9wIGN1cnJlbnQgQURIT0NcbiIpKTsKLQkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOwotCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKLQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7Ci0JCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQyFcbiIpKTsKLQkJfQotCi0JCWlmICgocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPT0gMCkgJiYKLQkJCShwQWQtPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9PSBUUlVFKSAmJgotCQkJKHBBZC0+TWxtZUF1eC5Cc3NUeXBlID09IEJTU19JTkZSQSkgJiYKLQkJCShNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbikgPT0gVFJVRSkKLQkJCSkKLQkJewotCQkJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgICAgICAgU2NhblJlcTsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIE5vIG1hdGNoaW5nIEJTUywgc3RhcnQgYSBuZXcgc2NhblxuIikpOwotCQkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIChQU1RSSU5HKSBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIEJTU19BTlksIFNDQU5fQUNUSVZFKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOwotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOwotCQkJLy8gUmVzZXQgTWlzc2VkIHNjYW4gbnVtYmVyCi0JCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7Ci0JCX0KLQkJZWxzZQotCQl7Ci0KLQkJCXBBZC0+TWxtZUF1eC5Cc3NJZHggPSAwOwotCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7Ci0JCX0KLQl9Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQ250bE9pZFJUQnNzaWRQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pCi17Ci0JVUxPTkcgICAgICAgQnNzSWR4OwotCVBVQ0hBUiAgICAgIHBPaWRCc3NpZCA9IChQVUNIQVIpRWxlbS0+TXNnOwotCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAgICBEaXNhc3NvY1JlcTsKLQlNTE1FX0pPSU5fUkVRX1NUUlVDVCAgICAgICAgSm9pblJlcTsKLQotI2lmZGVmIFJBTElOS19BVEUKLS8qIE5vIG5lZWQgdG8gcGVyZm9ybSB0aGlzIHJvdXRpbmUgd2hlbiBBVEUgaXMgcnVubmluZy4gKi8KLQlpZiAoQVRFX09OKHBBZCkpCi0JCXJldHVybjsKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQkvLyByZWNvcmQgdXNlciBkZXNpcmVkIHNldHRpbmdzCi0JQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIHBPaWRCc3NpZCk7Ci0JcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBwQWQtPlN0YUNmZy5Cc3NUeXBlOwotCi0JLy8gZmluZCB0aGUgZGVzaXJlZCBCU1MgaW4gdGhlIGxhdGVzdCBTQ0FOIHJlc3VsdCB0YWJsZQotCUJzc0lkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBPaWRCc3NpZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOwotCWlmIChCc3NJZHggPT0gQlNTX05PVF9GT1VORCkKLQl7Ci0JCU1MTUVfU0NBTl9SRVFfU1RSVUNUICAgICAgIFNjYW5SZXE7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEJTU0lEIG5vdCBmb3VuZC4gcmVwbHkgTkRJU19TVEFUVVNfTk9UX0FDQ0VQVEVEXG4iKSk7Ci0JCS8vcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQlNTSUQgbm90IGZvdW5kLiBzdGFydCBhIG5ldyBzY2FuXG4iKSk7Ci0JCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCAoUFNUUklORykgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBCU1NfQU5ZLCBTQ0FOX0FDVElWRSk7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOwotCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47Ci0JCS8vIFJlc2V0IE1pc3NlZCBzY2FuIG51bWJlcgotCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8KLQkvLyBVcGRhdGUgUmVjb25uZWN0IFNzaWQsIHRoYXQgdXNlciBkZXNpcmVkIHRvIGNvbm5lY3QuCi0JLy8KLQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7Ci0JcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZExlbjsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWQsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWRMZW4pOwotCi0JLy8gY29weSB0aGUgbWF0Y2hlZCBCU1MgZW50cnkgZnJvbSBTY2FuVGFiIHRvIE1sbWVBdXguU3NpZEJzc1RhYi4gV2h5PwotCS8vIEJlY2F1c2Ugd2UgbmVlZCB0aGlzIGVudHJ5IHRvIGJlY29tZSB0aGUgSk9JTiB0YXJnZXQgaW4gbGF0ZXIgb24gU1lOQyBzdGF0ZSBtYWNoaW5lCi0JcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7Ci0JcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPSAxOwotCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXSwgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLCBzaXplb2YoQlNTX0VOVFJZKSk7Ci0KLQkvLyBBZGQgU1NJRCBpbnRvIE1sbWVBdXggZm9yIHNpdGUgc3VyZXkgam9pbmluZyBoaWRkZW4gU1NJRAotCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZExlbjsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOwotCi0JewotCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJewotCQkJLy8gZGlzYXNzb2MgZnJvbSBjdXJyZW50IEFQIGZpcnN0Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUCAuLi5cbiIpKTsKLQkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOwotCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCi0JCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKLQotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChBREhPQ19PTihwQWQpKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBkcm9wIGN1cnJlbnQgQURIT0NcbiIpKTsKLQkJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKLQkJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7Ci0JCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLSAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQyFcbiIpKTsKLQkJCX0KLQotCQkJLy8gQ2hhbmdlIHRoZSB3ZXBzdGF0dXMgdG8gb3JpZ2luYWwgd2Vwc3RhdHVzCi0JCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMgICA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7Ci0JCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyICA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7Ci0JCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7Ci0KLQkJCS8vIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcKLQkJCS8vIFNldCB0aGUgUGFpcndpc2UgYW5kIEdyb3VwIGNpcGhlciB0byBtYXRjaCB0aGUgaW50ZW5kZWQgQVAgc2V0dGluZwotCQkJLy8gV2UgY2FuIG9ubHkgY29ubmVjdCB0byBBUCB3aXRoIGxlc3Mgc2VjdXJlZCBjaXBoZXIgc2V0dGluZwotCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQotCQkJewotCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLkdyb3VwQ2lwaGVyOwotCi0JCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcikKLQkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyOwotCQkJCWVsc2UgaWYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLQkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4OwotCQkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCi0JCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCQkJfQotCQkJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJCXsKLQkJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuR3JvdXBDaXBoZXI7Ci0KLQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlcikKLQkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlcjsKLQkJCQllbHNlIGlmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQotCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyQXV4OwotCQkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCi0JCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCi0JCQkJLy8gUlNOIGNhcGFiaWxpdHkKLQkJCQlwQWQtPlN0YUNmZy5Sc25DYXBhYmlsaXR5ID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5Sc25DYXBhYmlsaXR5OwotCQkJfQotCi0JCQkvLyBTZXQgTWl4IGNpcGhlciBmbGFnCi0JCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID0gKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIpID8gRkFMU0UgOiBUUlVFOwotCQkJLyppZiAocEFkLT5TdGFDZmcuYk1peENpcGhlciA9PSBUUlVFKQotCQkJewotCQkJCS8vIElmIG1peCBjaXBoZXIsIHJlLWJ1aWxkIFJTTklFCi0JCQkJUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIDApOwotCQkJfSovCi0JCQkvLyBObyBhY3RpdmUgYXNzb2NpYXRpb24sIGpvaW4gdGhlIEJTUyBpbW1lZGlhdGVseQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGpvaW5pbmcgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAotCQkJCXBPaWRCc3NpZFswXSxwT2lkQnNzaWRbMV0scE9pZEJzc2lkWzJdLHBPaWRCc3NpZFszXSxwT2lkQnNzaWRbNF0scE9pZEJzc2lkWzVdKSk7Ci0KLQkJCUpvaW5QYXJtRmlsbChwQWQsICZKb2luUmVxLCBwQWQtPk1sbWVBdXguQnNzSWR4KTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9KT0lOX1JFUSwgc2l6ZW9mKE1MTUVfSk9JTl9SRVFfU1RSVUNUKSwgJkpvaW5SZXEpOwotCi0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0pPSU47Ci0JCX0KLQl9Ci19Ci0KLS8vIFJvYW1pbmcgaXMgdGhlIG9ubHkgZXh0ZXJuYWwgcmVxdWVzdCB0cmlnZ2VyaW5nIENOVEwgc3RhdGUgbWFjaGluZQotLy8gZGVzcGl0ZSBvZiBvdGhlciAiU0VUIE9JRCIgb3BlcmF0aW9uLiBBbGwgIlNFVCBPSUQiIHJlbGF0ZWQgb2VyYXRpb25zCi0vLyBoYXBwZW4gaW4gc2VxdWVuY2UsIGJlY2F1c2Ugbm8gb3RoZXIgU0VUIE9JRCB3aWxsIGJlIHNlbnQgdG8gdGhpcyBkZXZpY2UKLS8vIHVudGlsIHRoZSB0aGUgcHJldmlvdXMgU0VUIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSAoc3VjY2Vzc2Z1bCBvIGZhaWxlZCkuCi0vLyBTbywgaG93IGRvIHdlIHF1YXJhbnRlZSB0aGlzIFJPQU1JTkcgcmVxdWVzdCB3b24ndCBjb3JydXB0IG90aGVyICJTRVQgT0lEIj8KLS8vIG9yIGJlZW4gY29ycnVwdGVkIGJ5IG90aGVyICJTRVQgT0lEIj8KLS8vCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgQ250bE1sbWVSb2FtaW5nUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVUNIQVIgQkJQVmFsdWUgPSAwOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gUm9hbWluZyBpbiBNbG1lQXV4LlJvYW1UYWIuLi5cbiIpKTsKLQotCXsKLQkJLy9MZXQgQkJQIHJlZ2lzdGVyIGF0IDIwTUh6IHRvIGRvIChmYXN0KSByb2FtaW5nLgotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7Ci0JCUJCUFZhbHVlICY9ICh+MHgxOCk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKLQotCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIsICZwQWQtPk1sbWVBdXguUm9hbVRhYiwgc2l6ZW9mKHBBZC0+TWxtZUF1eC5Sb2FtVGFiKSk7Ci0JCXBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yID0gcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnI7Ci0KLQkJQnNzVGFibGVTb3J0QnlSc3NpKCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYik7Ci0JCXBBZC0+TWxtZUF1eC5Cc3NJZHggPSAwOwotCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKLQl9Ci19Ci0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIENudGxPaWRETFNTZXR1cFByb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVBSVF84MDJfMTFfRExTCQlwRExTID0gKFBSVF84MDJfMTFfRExTKUVsZW0tPk1zZzsKLQlNTE1FX0RMU19SRVFfU1RSVUNUCU1sbWVEbHNSZXE7Ci0JSU5UCQkJCQlpOwotCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fVU5TUEVDSUZZOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gKE9JRCBzZXQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggd2l0aCBWYWxpZD0lZCwgU3RhdHVzPSVkLCBUaW1lT3V0PSVkLCBDb3VudERvd25UaW1lcj0lZClcbiIsCi0JCXBETFMtPk1hY0FkZHJbMF0sIHBETFMtPk1hY0FkZHJbMV0sIHBETFMtPk1hY0FkZHJbMl0sIHBETFMtPk1hY0FkZHJbM10sIHBETFMtPk1hY0FkZHJbNF0sIHBETFMtPk1hY0FkZHJbNV0sCi0JCXBETFMtPlZhbGlkLCBwRExTLT5TdGF0dXMsIHBETFMtPlRpbWVPdXQsIHBETFMtPkNvdW50RG93blRpbWVyKSk7Ci0KLQlpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQotCQlyZXR1cm47Ci0KLQkvLyBETFMgd2lsbCBub3QgYmUgc3VwcG9ydGVkIHdoZW4gQWRob2MgbW9kZQotCWlmIChJTkZSQV9PTihwQWQpKQotCXsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCi0JCXsKLQkJCWlmIChwRExTLT5WYWxpZCAmJiBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmCi0JCQkJKHBETFMtPlRpbWVPdXQgPT0gcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCkgJiYgTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCi0JCQl7Ci0JCQkJLy8gMS4gU2FtZSBzZXR0aW5nLCBqdXN0IGRyb3AgaXQKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBzZXR0aW5nIHVuY2hhbmdlZFxuIikpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAoIXBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkgJiYKLQkJCQlNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJCXsKLQkJCQkvLyAyLiBEaXNhYmxlIERMUyBsaW5rIGNhc2UsIGp1c3QgdGVhciBkb3duIERMUyBsaW5rCi0JCQkJcmVhc29uID0gUkVBU09OX1FPU19VTldBTlRFRF9NRUNIQU5JU007Ci0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKLQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7Ci0JCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gc3RhcnQgdGVhciBkb3duIHByb2NlZHVyZVxuIikpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAoKGkgPCBNQVhfTlVNX09GX0RMU19FTlRSWSkgJiYgcERMUy0+VmFsaWQgJiYgIXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkKQotCQkJewotCQkJCS8vIDMuIEVuYWJsZSBjYXNlLCBzdGFydCBETFMgc2V0dXAgcHJvY2VkdXJlCi0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCBwRExTLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOwotCi0JCQkJLy9VcGRhdGUgY291bnRkb3duIHRpbWVyCi0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0OwotCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKLQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfUkVRLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBETFMgc2V0dXAgY2FzZVxuIikpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAoKGkgPCBNQVhfTlVNX09GX0RMU19FTlRSWSkgJiYgcERMUy0+VmFsaWQgJiYgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYKLQkJCQkocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmICFNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJCXsKLQkJCQkvLyA0LiB1cGRhdGUgbWFjIGNhc2UsIHRlYXIgZG93biBvbGQgRExTIGFuZCBzZXR1cCBuZXcgRExTCi0JCQkJcmVhc29uID0gUkVBU09OX1FPU19VTldBTlRFRF9NRUNIQU5JU007Ci0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKLQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7Ci0JCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCBwRExTLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOwotCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKLQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfUkVRLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBETFMgdGVhciBkb3duIGFuZCByZXN0YXJ0IGNhc2VcbiIpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYgKHBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmCi0JCQkJTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgIT0gcERMUy0+VGltZU91dCkpCi0JCQl7Ci0JCQkJLy8gNS4gdXBkYXRlIHRpbWVvdXQgY2FzZSwgc3RhcnQgRExTIHNldHVwIHByb2NlZHVyZSAobm8gdGVhciBkb3duKQotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQJPSBwRExTLT5UaW1lT3V0OwotCQkJCS8vVXBkYXRlIGNvdW50ZG93biB0aW1lcgotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dDsKLQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7Ci0JCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1JFUSwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gRExTIHVwZGF0ZSB0aW1lb3V0IGNhc2VcbiIpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYgKHBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmCi0JCQkJKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyAhPSBETFNfRklOSVNIKSAmJiBNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJCXsKLQkJCQkvLyA2LiByZS1zZXR1cCBjYXNlLCBzdGFydCBETFMgc2V0dXAgcHJvY2VkdXJlIChubyB0ZWFyIGRvd24pCi0JCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOwotCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19SRVEsIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIERMUyByZXRyeSBzZXR1cCBwcm9jZWR1cmVcbiIpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiQ05UTCAtIERMUyBub3QgY2hhbmdlZCBpbiBlbnRyeSAtICVkIC0gVmFsaWQ9JWQsIFN0YXR1cz0lZCwgVGltZU91dD0lZFxuIiwKLQkJCQkJaSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cywgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCkpOwotCQkJfQotCQl9Ci0JfQotfQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBDbnRsV2FpdERpc2Fzc29jUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JTUxNRV9TVEFSVF9SRVFfU1RSVUNUICAgICBTdGFydFJlcTsKLQotCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9ESVNBU1NPQ19DT05GKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIERpcy1hc3NvY2lhdGUgc3VjY2Vzc2Z1bFxuIikpOwotCi0JICAgIGlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJewotCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfRElTQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQkJfQotCi0JCUxpbmtEb3duKHBBZCwgRkFMU0UpOwotCi0JCS8vIGNhc2UgMS4gbm8gbWF0Y2hpbmcgQlNTLCBhbmQgdXNlciB3YW50cyBBREhPQywgc28gd2UganVzdCBzdGFydCBhIG5ldyBvbmUKLQkJaWYgKChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcj09MCkgJiYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIE5vIG1hdGNoaW5nIEJTUywgc3RhcnQgYSBuZXcgQURIT0MgKFNzaWQ9JXMpLi4uXG4iLHBBZC0+TWxtZUF1eC5Tc2lkKSk7Ci0JCQlTdGFydFBhcm1GaWxsKHBBZCwgJlN0YXJ0UmVxLCAoUENIQVIpcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOwotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9TVEFSVDsKLQkJfQotCQkvLyBjYXNlIDIuIHRyeSBlYWNoIG1hdGNoZWQgQlNTCi0JCWVsc2UKLQkJewotCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7Ci0KLQkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOwotCQl9Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBDbnRsV2FpdEpvaW5Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgUmVhc29uOwotCU1MTUVfQVVUSF9SRVFfU1RSVUNUICAgICAgICBBdXRoUmVxOwotCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0pPSU5fQ09ORikKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOwotCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKLQkJewotCQkJLy8gMS4gam9pbmVkIGFuIElCU1MsIHdlIGFyZSBwcmV0dHkgbXVjaCBkb25lIGhlcmUKLQkJCWlmIChwQWQtPk1sbWVBdXguQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCQl7Ci0JCQkgICAgLy8KLQkJCQkvLyA1RyBiYW5kcyBydWxlcyBvZiBKYXBhbjoKLQkJCQkvLyBBZCBob2MgbXVzdCBiZSBkaXNhYmxlZCBpbiBXNTMoY2g1Miw1Niw2MCw2NCkgY2hhbm5lbHMuCi0JCQkJLy8KLQkJCQlpZiAoIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgotICAgICAgICAgICAgICAgICAgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJCQkgICApCi0JCQkJewotCQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQ2hhbm5lbD0lZCwgSm9pbiBhZGhvYyBvbiBXNTMoNTIsNTYsNjAsNjQpIENoYW5uZWxzIGFyZSBub3QgYWNjZXB0ZWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCUxpbmtVcChwQWQsIEJTU19BREhPQyk7Ci0JCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gam9pbiB0aGUgSUJTUyA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IC4uLlxuIiwKLQkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsxXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsyXSwKLQkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs0XSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs1XSkpOwotCi0gICAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLSAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKLQkJCX0KLQkJCS8vIDIuIGpvaW5lZCBhIG5ldyBJTkZSQSBuZXR3b3JrLCBzdGFydCBmcm9tIGF1dGhlbnRpY2F0aW9uCi0JCQllbHNlCi0JCQl7Ci0JCQkJewotCQkJCQkvLyBlaXRoZXIgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkIG9yIE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gsIHRyeSBzaGFyZWQga2V5IGZpcnN0Ci0JCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSB8fAotCQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpKQotCQkJCQl7Ci0JCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBBVVRIX01PREVfS0VZKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIEFVVEhfTU9ERV9PUEVOKTsKLQkJCQkJfQotCQkJCQlNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQVVUSF9SRVEsCi0JCQkJCQkJc2l6ZW9mKE1MTUVfQVVUSF9SRVFfU1RSVUNUKSwgJkF1dGhSZXEpOwotCQkJCX0KLQotCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVVUSDsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIDMuIGZhaWxlZCwgdHJ5IG5leHQgQlNTCi0JCQlwQWQtPk1sbWVBdXguQnNzSWR4Kys7Ci0JCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKLQkJfQotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBDbnRsV2FpdFN0YXJ0UHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVVNIT1JUICAgICAgUmVzdWx0OwotCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1NUQVJUX0NPTkYpCi0JewotCQlOZGlzTW92ZU1lbW9yeSgmUmVzdWx0LCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKLQkJaWYgKFJlc3VsdCA9PSBNTE1FX1NVQ0NFU1MpCi0JCXsKLQkJICAgIC8vCi0JCQkvLyA1RyBiYW5kcyBydWxlcyBvZiBKYXBhbjoKLQkJCS8vIEFkIGhvYyBtdXN0IGJlIGRpc2FibGVkIGluIFc1MyhjaDUyLDU2LDYwLDY0KSBjaGFubmVscy4KLQkJCS8vCi0JCQlpZiAoIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgotICAgICAgICAgICAgICAgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQkJICAgKQotCQkJewotCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIENoYW5uZWw9JWQsIFN0YXJ0IGFkaG9jIG9uIFc1Myg1Miw1Niw2MCw2NCkgQ2hhbm5lbHMgYXJlIG5vdCBhY2NlcHRlZFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwotCQkJCXJldHVybjsKLQkJCX0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSwgMTYpOwotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKLQkJCXsKLQkJCQlOX0NoYW5uZWxDaGVjayhwQWQpOwotCQkJCVNldENvbW1vbkhUKHBBZCk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sICZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOwotCQkJCVJUTVBDaGVja0h0KHBBZCwgQlNTSURfV0NJRCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbyk7Ci0JCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBUUlVFOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0sIDE2KTsKLQkJCQlDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKHBBZCk7Ci0KLQkJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoICA9PSBCV180MCkgJiYKLQkJCQkJKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQUJPVkUpKQotCQkJCXsKLQkJCQkJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCAgPT0gQldfNDApICYmCi0JCQkJCQkgKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQkVMT1cpKQotCQkJCXsKLQkJCQkJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJewotCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gRkFMU0U7Ci0JCQl9Ci0JCQlMaW5rVXAocEFkLCBCU1NfQURIT0MpOwotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQkJCS8vIEJlZm9yZSBzZW5kIGJlYWNvbiwgZHJpdmVyIG5lZWQgZG8gcmFkYXIgZGV0ZWN0aW9uCi0JCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCApCi0JCQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCi0JCQkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKLQkJCXsKLQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9TSUxFTkNFX01PREU7Ci0JCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRDb3VudCA9IDA7Ci0jaWZkZWYgREZTX1NVUFBPUlQKLQkJCQlCYnBSYWRhckRldGVjdGlvblN0YXJ0KHBBZCk7Ci0jZW5kaWYgLy8gREZTX1NVUFBPUlQgLy8KLQkJCX0KLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIHN0YXJ0IGEgbmV3IElCU1MgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAuLi5cbiIsCi0JCQkJcEFkLT5Db21tb25DZmcuQnNzaWRbMF0scEFkLT5Db21tb25DZmcuQnNzaWRbMV0scEFkLT5Db21tb25DZmcuQnNzaWRbMl0sCi0JCQkJcEFkLT5Db21tb25DZmcuQnNzaWRbM10scEFkLT5Db21tb25DZmcuQnNzaWRbNF0scEFkLT5Db21tb25DZmcuQnNzaWRbNV0pKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBTdGFydCBJQlNTIGZhaWwuIEJVRyEhISEhXG4iKSk7Ci0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCQl9Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBDbnRsV2FpdEF1dGhQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgIFJlYXNvbjsKLQlNTE1FX0FTU09DX1JFUV9TVFJVQ1QgICAgICAgIEFzc29jUmVxOwotCU1MTUVfQVVUSF9SRVFfU1RSVUNUICAgICAgICAgQXV0aFJlcTsKLQotCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9BVVRIX0NPTkYpCi0JewotCQlOZGlzTW92ZU1lbW9yeSgmUmVhc29uLCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKLQkJaWYgKFJlYXNvbiA9PSBNTE1FX1NVQ0NFU1MpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIE9LXG4iKSk7Ci0JCQlBc3NvY1Bhcm1GaWxsKHBBZCwgJkFzc29jUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIHBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbywKLQkJCQkJCSAgQVNTT0NfVElNRU9VVCwgcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50KTsKLQotCQkJewotCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQVNTT0NfUkVRLAotCQkJCQkJCXNpemVvZihNTE1FX0FTU09DX1JFUV9TVFJVQ1QpLCAmQXNzb2NSZXEpOwotCi0JCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BU1NPQzsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIFRoaXMgZmFpbCBtYXkgYmVjYXVzZSBvZiB0aGUgQVAgYWxyZWFkeSBrZWVwIHVzIGluIGl0cyBNQUMgdGFibGUgd2l0aG91dAotCQkJLy8gYWdlaW5nLW91dC4gVGhlIHByZXZpb3VzIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHQgbXVzdCBoYXZlIGxldCBpdCByZW1vdmUgdXMuCi0JCQkvLyBzbyB0cnkgQXV0aGVudGljYXRpb24gYWdhaW4gbWF5IGhlbHAuIEZvciBELUxpbmsgRFdMLTkwMEFQKyBjb21wYXRpYmlsaXR5LgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggRkFJTCwgdHJ5IGFnYWluLi4uXG4iKSk7Ci0JCQl7Ci0JCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpIHx8Ci0JCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSkKLQkJCQl7Ci0JCQkJCS8vIGVpdGhlciBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQgb3IgTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCwgdHJ5IHNoYXJlZCBrZXkgZmlyc3QKLQkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgQVVUSF9NT0RFX0tFWSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIEFVVEhfTU9ERV9PUEVOKTsKLQkJCQl9Ci0JCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FVVEhfUkVRLAotCQkJCQkJCXNpemVvZihNTE1FX0FVVEhfUkVRX1NUUlVDVCksICZBdXRoUmVxKTsKLQotCQkJfQotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BVVRIMjsKLQkJfQotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQ250bFdhaXRBdXRoUHJvYzIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgUmVhc29uOwotCU1MTUVfQVNTT0NfUkVRX1NUUlVDVCAgICAgICAgQXNzb2NSZXE7Ci0JTUxNRV9BVVRIX1JFUV9TVFJVQ1QgICAgICAgICBBdXRoUmVxOwotCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0FVVEhfQ09ORikKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOwotCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggT0tcbiIpKTsKLQkJCUFzc29jUGFybUZpbGwocEFkLCAmQXNzb2NSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvLAotCQkJCQkJCSAgQVNTT0NfVElNRU9VVCwgcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50KTsKLQkJCXsKLQkJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FTU09DX1JFUSwKLQkJCQkJCQlzaXplb2YoTUxNRV9BU1NPQ19SRVFfU1RSVUNUKSwgJkFzc29jUmVxKTsKLQotCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVNTT0M7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpICYmCi0JCQkJIChwQWQtPk1sbWVBdXguQWxnID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggRkFJTCwgdHJ5IE9QRU4gc3lzdGVtLi4uXG4iKSk7Ci0JCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlT3Blbik7Ci0JCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FVVEhfUkVRLAotCQkJCQkJCXNpemVvZihNTE1FX0FVVEhfUkVRX1NUUlVDVCksICZBdXRoUmVxKTsKLQotCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVVUSDI7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gbm90IHN1Y2Nlc3MsIHRyeSBuZXh0IEJTUwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIEZBSUwsIGdpdmUgdXA7IHRyeSBuZXh0IEJTU1xuIikpOwotCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7IC8vPz8/Pz8/PwotCQkJCXBBZC0+TWxtZUF1eC5Cc3NJZHgrKzsKLQkJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQ250bFdhaXRBc3NvY1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCAgICAgIFJlYXNvbjsKLQotCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9BU1NPQ19DT05GKQotCXsKLQkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7Ci0JCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKQotCQl7Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQl7Ci0JCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQkJCX0KLQotCQkJTGlua1VwKHBBZCwgQlNTX0lORlJBKTsKLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQXNzb2NpYXRpb24gc3VjY2Vzc2Z1bCBvbiBCU1MgIyVsZFxuIixwQWQtPk1sbWVBdXguQnNzSWR4KSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBub3Qgc3VjY2VzcywgdHJ5IG5leHQgQlNTCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQXNzb2NpYXRpb24gZmFpbHMgb24gQlNTICMlbGRcbiIscEFkLT5NbG1lQXV4LkJzc0lkeCkpOwotCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCsrOwotCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIENudGxXYWl0UmVhc3NvY1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCAgICAgIFJlc3VsdDsKLQotCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9SRUFTU09DX0NPTkYpCi0JewotCQlOZGlzTW92ZU1lbW9yeSgmUmVzdWx0LCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKLQkJaWYgKFJlc3VsdCA9PSBNTE1FX1NVQ0NFU1MpCi0JCXsKLQkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgYXNzb2NpYXRpb24KLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19BU1NPQ19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotCi0JCQkvLwotCQkJLy8gTkRJUyByZXF1aXJlcyBhIG5ldyBMaW5rIFVQIGluZGljYXRpb24gYnV0IG5vIExpbmsgRG93biBmb3IgUkUtQVNTT0MKLQkJCS8vCi0JCQlMaW5rVXAocEFkLCBCU1NfSU5GUkEpOwotCi0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIFJlLWFzc29jaXRpb24gc3VjY2Vzc2Z1bCBvbiBCU1MgIyVsZFxuIiwgcEFkLT5NbG1lQXV4LlJvYW1JZHgpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIHJlYXNzb2MgZmFpbGVkLCB0cnkgdG8gcGljayBuZXh0IEJTUyBpbiB0aGUgQlNTIFRhYmxlCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gUmUtYXNzb2NpdGlvbiBmYWlscyBvbiBCU1MgIyVsZFxuIiwgcEFkLT5NbG1lQXV4LlJvYW1JZHgpKTsKLQkJCXsKLQkJCQlwQWQtPk1sbWVBdXguUm9hbUlkeCsrOwotCQkJCUl0ZXJhdGVPbkJzc1RhYjIocEFkKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotCi1WT0lECUFkaG9jVHVybk9uUW9zKAotCUlOICBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLSNkZWZpbmUgQUMwX0RFRl9UWE9QCQkwCi0jZGVmaW5lIEFDMV9ERUZfVFhPUAkJMAotI2RlZmluZSBBQzJfREVGX1RYT1AJCTk0Ci0jZGVmaW5lIEFDM19ERUZfVFhPUAkJNDcKLQotCS8vIFR1cm4gb24gUU9zIGlmIHVzZSBIVCByYXRlLgotCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9PSBGQUxTRSkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID0gVFJVRTsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblswXSA9IDM7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMV0gPSA3OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzJdID0gMTsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblszXSA9IDE7Ci0KLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblswXSA9IDQ7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMV0gPSA0OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzJdID0gMzsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblszXSA9IDI7Ci0KLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFswXSA9IDEwOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzFdID0gNjsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsyXSA9IDQ7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbM10gPSAzOwotCi0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFswXSAgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMV0gID0gMDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdICA9IEFDMl9ERUZfVFhPUDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzNdICA9IEFDM19ERUZfVFhPUDsKLQl9Ci0JQXNpY1NldEVkY2FQYXJtKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0pOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBMaW5rVXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgQnNzVHlwZSkKLXsKLQlVTE9ORwlOb3c7Ci0JVUlOVDMyCURhdGE7Ci0JQk9PTEVBTglDYW5jZWxsZWQ7Ci0JVUNIQVIJVmFsdWUgPSAwLCBpZHggPSAwLCBIYXNoSWR4ID0gMDsKLQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5ID0gTlVMTDsKLQotCS8vIEluaXQgQ2hhbm5lbFF1YWxpdHkgdG8gcHJldmVudCBERUFEX0NRSSBhdCBpbml0aWFsIExpbmtVcAotCXBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA9IDUwOwotCi0JcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JaWYgKHBFbnRyeSkKLQl7Ci0JCU1hY1RhYmxlRGVsZXRlRW50cnkocEFkLCBwRW50cnktPkFpZCwgcEVudHJ5LT5BZGRyKTsKLQkJcEVudHJ5ID0gTlVMTDsKLQl9Ci0KLQotCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOwotCi0JLy8KLQkvLyBBU1NPQyAtIERpc2Fzc29jVGltZW91dEFjdGlvbgotCS8vIENOVEwgLSBEaXMtYXNzb2NpYXRlIHN1Y2Nlc3NmdWwKLQkvLyAhISEgTElOSyBET1dOICEhIQotCS8vIFs4ODg4OF0gT0lEXzgwMl8xMV9TU0lEIHNob3VsZCBoYXZlIHJldHVybmVkIE5EVEVTVF9XRVBfQVAyKFJldHVybmVkOiApCi0JLy8KLQkvLyBUbyBwcmV2ZW50IERpc2Fzc29jVGltZW91dEFjdGlvbiB0byBjYWxsIExpbmsgZG93biBhZnRlciB3ZSBsaW5rIHVwLAotCS8vIGNhbmNlbCB0aGUgRGlzYXNzb2NUaW1lciBubyBtYXR0ZXIgd2hhdCBpdCBzdGFydCBvciBub3QuCi0JLy8KLQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAgJkNhbmNlbGxlZCk7Ci0KLQlDT1BZX1NFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhwQWQpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JQ09QWV9IVFNFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JLy8gQmVmb3JlIHBvd2VyIHNhdmUgYmVmb3JlIGxpbmsgdXAgZnVuY3Rpb24sIFdlIHdpbGwgZm9yY2UgdXNlIDFSLgotCS8vIFNvIGFmdGVyIGxpbmsgdXAsIGNoZWNrIFJ4IGFudGVubmEgIyBhZ2Fpbi4KLQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZWYWx1ZSk7Ci0JaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQotCXsKLQkJVmFsdWUgfD0gKDB4MTApOwotCX0KLQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKLQl7Ci0JCVZhbHVlIHw9ICgweDgpOwotCX0KLQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQl7Ci0JCVZhbHVlIHw9ICgweDApOwotCX0KLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBWYWx1ZSk7Ci0JcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCWlmIChCc3NUeXBlID09IEJTU19BREhPQykKLQl7Ci0JCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7Ci0JCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKLQotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCi0JCS8vIE5vIGNhcnJpZXIgZGV0ZWN0aW9uIHdoZW4gYWRob2MKLQkJLy8gQ2FycmllckRldGVjdGlvblN0b3AocEFkKTsKLQkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5DRF9TdGF0ZSA9IENEX05PUk1BTDsKLSNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKLQkJCUFkaG9jVHVybk9uUW9zKHBBZCk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhQWRob2MgTElOSyBVUCAhISEgXG4iICkpOwotCX0KLQllbHNlCi0JewotCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOwotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhSW5mcmEgTElOSyBVUCAhISEgXG4iICkpOwotCX0KLQotCQkvLyAzKjMKLQkJLy8gcmVzZXQgVHggYmVhbWZvcm1pbmcgYml0Ci0JCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKLQkJVmFsdWUgJj0gKH4weDAxKTsKLQkJVmFsdWUgfD0gcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlR4QkY7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCS8vIENoYW5nZSB0byBBUCBjaGFubmVsCi0gICAgICAgIGlmICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLQl7Ci0JCS8vIE11c3QgdXNpbmcgNDBNSHouCi0JCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOwotCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLQotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7Ci0JCVZhbHVlICY9ICh+MHgxOCk7Ci0JCVZhbHVlIHw9IDB4MTA7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKLQotCQkvLyAgUlggOiBjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSAofjB4MjApOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBWYWx1ZSk7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0gICAgICAgICAgICBwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZEYXRhKTsKLQkJRGF0YSAmPSAweGZmZmZmZmZlOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7Ci0KLQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQotCQl7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxQSk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwQSk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxNik7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhNDBNSHogTG93ZXIgTElOSyBVUCAhISEgQ29udHJvbCBDaGFubmVsIGF0IEJlbG93LiBDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKLQl9Ci0JCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotCSAgICB7Ci0JCSAgICAvLyBNdXN0IHVzaW5nIDQwTUh6LgotCQkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7Ci0JCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCSAgICBBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKLQkJVmFsdWUgJj0gKH4weDE4KTsKLQkJVmFsdWUgfD0gMHgxMDsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKLQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmRGF0YSk7Ci0JCURhdGEgfD0gMHgxOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7Ci0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKLQkJICAgIFZhbHVlIHw9ICgweDIwKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkJCUFIzID0gVmFsdWU7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQotCQl7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxQSk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwQSk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxNik7Ci0JCQkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOwotCQl9Ci0KLQkJICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISA0ME1IeiBVcHBlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgVXBwZXJDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKLQkgICAgfQotCSAgICBlbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JICAgIHsKLQkJICAgIHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOwotCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7Ci0JCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKLQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7Ci0JCQlWYWx1ZSAmPSAofjB4MTgpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgVmFsdWUpOwotCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmRGF0YSk7Ci0JCQlEYXRhICY9IDB4ZmZmZmZmZmU7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7Ci0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKLQkJCVZhbHVlICY9ICh+MHgyMCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBWYWx1ZSk7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0gICAgICAgICAgICBwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCi0JCQl7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MTYpOwotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDA4KTsKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxMSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOwotCQkJfQotCi0JCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgMjBNSHogTElOSyBVUCAhISEgXG4iICkpOwotCX0KLQotCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcpOwotCS8vCi0JLy8gU2F2ZSBCQlBfUjY2IHZhbHVlLCBpdCB3aWxsIGJlIHVzZWQgaW4gUlRVU0JSZXN1bWVNc2R1VHJhbnNtaXNzaW9uCi0JLy8KLQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIFVQICEhISAoQnNzVHlwZT0lZCwgQUlEPSVkLCBzc2lkPSVzLCBDaGFubmVsPSVkLCBDZW50cmFsQ2hhbm5lbCA9ICVkKVxuIiwKLQkJQnNzVHlwZSwgcEFkLT5TdGFBY3RpdmUuQWlkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEhIChEZW5zaXR5ID0lZCwgKVxuIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NcGR1RGVuc2l0eSkpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCUFzaWNTZXRCc3NpZChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQotCUFzaWNTZXRTbG90VGltZShwQWQsIFRSVUUpOwotCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKLQotCi0JLy8gQ2FsbCB0aGlzIGZvciBSVFMgcHJvdGVjdGlvbmZvciBsZWdhY3kgcmF0ZSwgd2Ugd2lsbCBhbHdheXMgZW5hYmxlIFJUUyB0aHJlc2hvbGQsIGJ1dCBub3JtYWxseSBpdCB3aWxsIG5vdCBoaXQKLQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAsIChPRkRNU0VUUFJPVEVDVCB8IENDS1NFVFBST1RFQ1QpLCBUUlVFLCBGQUxTRSk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IFRSVUUpKQotCXsKLQkJLy8gVXBkYXRlIEhUIHByb3RlY3Rpb25mb3IgYmFzZWQgb24gQVAncyBvcGVyYXRpbmcgbW9kZS4KLQlpZiAocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKQotCXsKLQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgVFJVRSk7Ci0JfQotCWVsc2UKLQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5EcnNDb3VudGVycywgc2l6ZW9mKENPVU5URVJfRFJTKSk7Ci0KLQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCXBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgPSBOb3c7ICAgLy8gbGFzdCBSWCB0aW1lc3RhbXAKLQotCWlmICgocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSAhPSBSdDgwMl8xMVByZWFtYmxlTG9uZykgJiYKLQkJQ0FQX0lTX1NIT1JUX1BSRUFNQkxFX09OKHBBZC0+U3RhQWN0aXZlLkNhcGFiaWxpdHlJbmZvKSkKLQl7Ci0JCU1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZVNob3J0KTsKLQl9Ci0KLQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9PSBSRF9TSUxFTkNFX01PREUpCi0JewotI2lmZGVmIERGU19TVVBQT1JUCi0JCVJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOwotI2VuZGlmIC8vIERGU19TVVBQT1JUIC8vCi0JfQotCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX05PUk1BTF9NT0RFOwotCi0JaWYgKEJzc1R5cGUgPT0gQlNTX0FESE9DKQotCXsKLQkJTWFrZUlic3NCZWFjb24ocEFkKTsKLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKLQkJCSYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCi0JCXsKLQkJCTsgLy9EbyBub3RoaW5nCi0JCX0KLQkJZWxzZQotCQl7Ci0JCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsKLQkJfQotCi0JCS8vIEluIGFkIGhvYyBtb2RlLCB1c2UgTUFDIHRhYmxlIGZyb20gaW5kZXggMS4KLQkJLy8gcC5zIEFTSUMgdXNlIGFsbCAweGZmIGFzIHRlcm1pbmF0aW9uIG9mIFdDSUQgdGFibGUgc2VhcmNoLlRvIHByZXZlbnQgaXQncyAweGZmLWZmLWZmLWZmLWZmLWZmLCBXcml0ZSAwIGhlcmUuCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19XQ0lEX0JBU0UsIDB4MDApOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAweDE4MDgsIDB4MDApOwotCi0JCS8vIElmIFdFUCBpcyBlbmFibGVkLCBhZGQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgaW50byBBc2ljCi0JCS8vIEZpbGwgaW4gU2hhcmVkIEtleSBUYWJsZShvZmZzZXQ6IDB4NmMwMCkgYW5kIFNoYXJlZCBLZXkgTW9kZShvZmZzZXQ6IDB4NzAwMCkKLQotCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQotCQl7Ci0JCQlQVUNIQVIJS2V5OwotCQkJVUNIQVIJQ2lwaGVyQWxnOwotCi0JCQlmb3IgKGlkeD0wOyBpZHggPCBTSEFSRV9LRVlfTlVNOyBpZHgrKykKLQkJewotCQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uQ2lwaGVyQWxnOwotCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXk7Ci0KLQkJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPiAwKQotCQkJCXsKLQkJCQkJLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKLQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID09IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkKLQkJCQkJewotCQkJCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKLQkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgTlVMTCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQotCQkJfQotCQl9Ci0JCS8vIElmIFdQQU5vbmUgaXMgZW5hYmxlZCwgYWRkIGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIGludG8gQXNpYwotCQkvLyBGaWxsIGluIFNoYXJlZCBLZXkgVGFibGUob2Zmc2V0OiAweDZjMDApIGFuZCBTaGFyZWQgS2V5IE1vZGUob2Zmc2V0OiAweDcwMDApCi0JCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0JCXsKLQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IDA7CS8vIGFsd2F5cyBiZSB6ZXJvCi0KLSAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLQkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgcEFkLT5TdGFDZmcuUE1LLCBMRU5fVEtJUF9FSyk7Ci0KLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0gICAgICAgICAgICB7Ci0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBNS1sxNl0sIExFTl9US0lQX1JYTUlDSyk7Ci0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBNS1sxNl0sIExFTl9US0lQX1RYTUlDSyk7Ci0gICAgICAgICAgICB9Ci0KLQkJCS8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCi0JCQlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOwotCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0JCQllbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVW5rbm93IENpcGhlciAoPSVkKSwgc2V0IENpcGhlciB0byBBRVNcbiIsIHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIpKTsKLQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwotICAgICAgICAgICAgfQotCi0JCQkvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYwotCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKLQkJCQkJCQkJICBCU1MwLAotCQkJCQkJCQkgIDAsCi0JCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAotCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKLQkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKLQkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCi0JCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgMCwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLCBOVUxMKTsKLQotCQl9Ci0KLQl9Ci0JZWxzZSAvLyBCU1NfSU5GUkEKLQl7Ci0JCS8vIENoZWNrIHRoZSBuZXcgU1NJRCB3aXRoIGxhc3QgU1NJRAotCQl3aGlsZSAoQ2FuY2VsbGVkID09IFRSVUUpCi0JCXsKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbiA9PSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKQotCQkJewotCQkJCWlmIChSVE1QQ29tcGFyZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuTGFzdFNzaWRMZW4pID09IDApCi0JCQkJewotCQkJCQkvLyBMaW5rIHRvIHRoZSBvbGQgb25lIG5vIGxpbmtkb3duIGlzIHJlcXVpcmVkLgotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBTZW5kIGxpbmsgZG93biBldmVudCBiZWZvcmUgc2V0IHRvIGxpbmsgdXAKLQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7Ci0JCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQUEhXG4iKSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8vCi0JCS8vIE9uIFdQQSBtb2RlLCBSZW1vdmUgQWxsIEtleXMgaWYgbm90IGNvbm5lY3QgdG8gdGhlIGxhc3QgQlNTSUQKLQkJLy8gS2V5IHdpbGwgYmUgc2V0IGFmdGVyIDQtd2F5IGhhbmRzaGFrZS4KLQkJLy8KLQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLQkJewotCQkJVUxPTkcJCUlWOwotCi0JCQkvLyBSZW1vdmUgYWxsIFdQQSBrZXlzCi0JCQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0JCQlSVE1QV1BBUmVtb3ZlQWxsS2V5cyhwQWQpOwotCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0JCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKLQotCQkJLy8gRml4ZWQgY29ubmVjdGlvbiBmYWlsZWQgd2l0aCBSYW5nZSBNYXhpbWl6ZXIgLSA1MTUgQVAgKE1hcnZlbGwgQ2hpcCkgd2hlbiBzZWN1cml0eSBpcyBXUEFQU0svVEtJUAotCQkJLy8gSWYgSVYgcmVsYXRlZCB2YWx1ZXMgYXJlIHRvbyBsYXJnZSBpbiBHcm91cE1zZzIsIEFQIHdvdWxkIGlnbm9yZSB0aGlzIG1lc3NhZ2UuCi0JCQlJViA9IDE7Ci0JCQlJViB8PSAocEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkIDw8IDMwKTsKLQkJCUFzaWNVcGRhdGVXQ0lESVZFSVYocEFkLCBCU1NJRF9XQ0lELCBJViwgMCk7Ci0JCQkvL1JUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLQkJfQotCi0JCS8vIE5PVEU6Ci0JCS8vIHRoZSBkZWNpc2lvbiBvZiB1c2luZyAic2hvcnQgc2xvdCB0aW1lIiBvciBub3QgbWF5IGNoYW5nZSBkeW5hbWljYWxseSBkdWUgdG8KLQkJLy8gbmV3IFNUQSBhc3NvY2lhdGlvbiB0byB0aGUgQVAuIHNvIHdlIGhhdmUgdG8gZGVjaWRlIHRoYXQgdXBvbiBwYXJzaW5nIEJFQUNPTiwgbm90IGhlcmUKLQotCQkvLyBOT1RFOgotCQkvLyB0aGUgZGVjaXNpb24gdG8gdXNlICJSVEMvQ1RTIiBvciAiQ1RTLXRvLXNlbGYiIHByb3RlY3Rpb24gb3Igbm90IG1heSBjaGFuZ2UgZHluYW1pY2FsbHkKLQkJLy8gZHVlIHRvIG5ldyBTVEEgYXNzb2NpYXRpb24gdG8gdGhlIEFQLiBzbyB3ZSBoYXZlIHRvIGRlY2lkZSB0aGF0IHVwb24gcGFyc2luZyBCRUFDT04sIG5vdCBoZXJlCi0KLQkJQ29tcG9zZVBzUG9sbChwQWQpOwotCQlDb21wb3NlTnVsbEZyYW1lKHBBZCk7Ci0KLQkJCUFzaWNFbmFibGVCc3NTeW5jKHBBZCk7Ci0KLQkJLy8gQWRkIEJTU0lEIHRvIFdDSUQgc2VhcmNoIHRhYmxlCi0JCUFzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIEJTU0lEX1dDSUQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQotCQkvLyBJZiBXRVAgaXMgZW5hYmxlZCwgYWRkIHBhaWV3aXNlIGFuZCBzaGFyZWQga2V5Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgICAgICBpZiAoKChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApJiYKLSAgICAgICAgICAgICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSYmCi0gICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSkgfHwKLSAgICAgICAgICAgICgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpJiYKLSAgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkpKQotI2Vsc2UKLQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0JCXsKLQkJCVBVQ0hBUglLZXk7Ci0JCQlVQ0hBUglDaXBoZXJBbGc7Ci0KLQkJCWZvciAoaWR4PTA7IGlkeCA8IFNIQVJFX0tFWV9OVU07IGlkeCsrKQotCQl7Ci0JCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5DaXBoZXJBbGc7Ci0JCQlLZXkgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleTsKLQotCQkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IDApCi0JCQkJewotCQkJCQkvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYwotCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOwotCi0JCQkJCWlmIChpZHggPT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKQotCQkJCQl7Ci0JCQkJCQkvLyBBc3NpZ24gZ3JvdXAga2V5IGluZm8KLQkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgTlVMTCk7Ci0KLQkJCQkJCXBFbnRyeS0+QWlkID0gQlNTSURfV0NJRDsKLQkJCQkJCS8vIEFzc2lnbiBwYWlyd2lzZSBrZXkgaW5mbwotCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBwRW50cnkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gb25seSBJTkZSQVNUUlVDVFVSRSBtb2RlIG5lZWQgdG8gaW5kaWNhdGUgY29ubmVjdGl2aXR5IGltbWVkaWF0ZWx5OyBBREhPQyBtb2RlCi0JCS8vIHNob3VsZCB3YWl0IHVudGlsIGF0IGxlYXN0IDIgYWN0aXZlIG5vZGVzIGluIHRoaXMgQlNTSUQuCi0JCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotCi0gICAgICAgIC8vIEZvciBHVUkgKysKLQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQl7Ci0JCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7Ci0JCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotCQl9Ci0JCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8Ci0JCQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJewotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0JCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuTGlua0Rvd25UaW1lciwgTElOS19ET1dOX1RJTUVPVVQpOwotCQl9Ci0gICAgICAgIC8vIC0tCi0KLQkJLy8gQWRkIEJTU0lEIGluIG15IE1BQyBUYWJsZS4KLSAgICAgICAgTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLQkJLy8gYWRkIHRoaXMgTUFDIGVudHJ5IGludG8gSEFTSCB0YWJsZQotCQlpZiAocEVudHJ5KQotCQl7Ci0JCQlIYXNoSWR4ID0gTUFDX0FERFJfSEFTSF9JTkRFWChwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQlpZiAocEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9PSBOVUxMKQotCQkJewotCQkJCXBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPSBwRW50cnk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEN1cnJFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07Ci0JCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCi0JCQkJewotCQkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7Ci0JCQkJfQotCQkJCXBDdXJyRW50cnktPnBOZXh0ID0gcEVudHJ5OwotCQkJfQotCQl9Ci0JCVJUTVBNb3ZlTWVtb3J5KHBFbnRyeS0+QWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0JCXBFbnRyeS0+QWlkID0gQlNTSURfV0NJRDsKLQkJcEVudHJ5LT5wQWQgPSBwQWQ7Ci0JCXBFbnRyeS0+VmFsaWRBc0NMSSA9IFRSVUU7CS8vQWx0aG91Z2ggdGhpcyBpcyBic3NpZC4uc3RpbGwgc2V0IFZhbGlkQXNDbAotCQlwQWQtPk1hY1RhYi5TaXplID0gMTsJLy8gaW5mcmEgbW9kZSBhbHdheXMgc2V0IE1BQ3RhYiBzaXplID0xLgotCQlwRW50cnktPlNzdCA9IFNTVF9BU1NPQzsKLQkJcEVudHJ5LT5BdXRoU3RhdGUgPSBTU1RfQVNTT0M7Ci0JCXBFbnRyeS0+QXV0aE1vZGUgPSBwQWQtPlN0YUNmZy5BdXRoTW9kZTsKLQkJcEVudHJ5LT5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7Ci0JCWlmIChwRW50cnktPkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQl7Ci0JCQlwRW50cnktPldwYVN0YXRlID0gQVNfTk9UVVNFOwotCQkJcEVudHJ5LT5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwRW50cnktPldwYVN0YXRlID0gQVNfUFRLU1RBUlQ7Ci0JCQlwRW50cnktPlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQOwotCQl9Ci0JCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEhICBDbGllbnRTdGF0dXNGbGFncz0lbHgpXG4iLAotCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOwotCi0KLQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBUUlVFLCBCU1MwKTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIEJTUzApOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBVUCAhISAoU3RhQWN0aXZlLmJIdEVuYWJsZSA9JWQsIClcbiIsIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlKSk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQotCQlpZiAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkKLQkJewotCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSkgJiYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMykgPT0gMykKLQkJCXsKLQotCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QSUdHWUJBQ0tfSU5VU0VEKTsKLQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKLQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSk7Ci0JCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1BJR0dZQkFDS19DQVBBQkxFKTsKLQkJCQlSVE1QU2V0UGlnZ3lCYWNrKHBBZCwgVFJVRSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHVybiBvbiBQaWdneS1CYWNrXG4iKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDEpCi0JCQl7Ci0JCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUpOwotCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICE9IDB4MCkKLQkJewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJaWYgKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSkpCi0JCQl7Ci0JCQkJQXNpY0VuYWJsZVJERyhwQWQpOwotCQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7Ci0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpOwotCQkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7Ci0JCX0KLQl9Ci0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0NPTk5FQ1QgRXZlbnQgQiEuQkFDYXBhYmlsaXR5ID0gJXguIENsaWVudFN0YXR1c0ZsYWdzID0gJWx4XG4iLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZCwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JLy8gU2V0IExFRAotCVJUTVBTZXRMRUQocEFkLCBMRURfTElOS19VUCk7Ci0KLQlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCA9IDA7Ci0JcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgPSAwOwotCXBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBGQUxTRTsgICAgICAgIC8vIFJlc2V0IGNvbmZpZyBmbGFnCi0JcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7ICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uIHRvIGxpbmsgaXMgdXAKLQotCS8vIFNldCBhc2ljIGF1dG8gZmFsbCBiYWNrCi0JewotCQlQVUNIQVIJCQkJCXBUYWJsZTsKLQkJVUNIQVIJCQkJCVRhYmxlU2l6ZSA9IDA7Ci0KLQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sICZwVGFibGUsICZUYWJsZVNpemUsICZwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCk7Ci0JCUFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZShwQWQsIHBUYWJsZSk7Ci0JfQotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLSAgICBwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7Ci0gICAgcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOwotCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBGQUxTRSkKLQl7Ci0JCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJaWYgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAzMikKLQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7Ci0KLQkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPiBNQ1NfNykgfHwgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAzMikpCi0JCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19OT05FOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkvLyBJZiB0aGUgbGVnYWN5IG1vZGUgaXMgc2V0LCBvdmVyd3JpdGUgdGhlIHRyYW5zbWl0IHNldHRpbmcgb2YgdGhpcyBlbnRyeS4KLQkJaWYgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKQotCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKLQl9Ci0JZWxzZQotCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCi0JLy8gIExldCBMaW5rIFN0YXR1cyBQYWdlIGRpc3BsYXkgZmlyc3QgaW5pdGlhbCByYXRlLgotCXBBZC0+TGFzdFR4UmF0ZSA9IChVU0hPUlQpKHBFbnRyeS0+SFRQaHlNb2RlLndvcmQpOwotCS8vIFNlbGVjdCBEQUMgYWNjb3JkaW5nIHRvIEhUIG9yIExlZ2FjeQotCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSAhPSAweDAwKQotCXsKLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSAofjB4MTgpOwotCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKQotCQl7Ci0JCSAgICBWYWx1ZSB8PSAweDEwOwotCQl9Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIFZhbHVlKTsKLQl9Ci0JZWxzZQotCXsKLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSAofjB4MTgpOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBWYWx1ZSk7Ci0JfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKQotCXsKLQl9Ci0JZWxzZSBpZiAocEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPT0gMCkKLQl7Ci0JICAgIC8vIElmIEhUIEFQIGRvZXNuJ3Qgc3VwcG9ydCBNYXhSQW1wZHVGYWN0b3IgPSAxLCB3ZSBuZWVkIHRvIHNldCBtYXggUFNEVSB0byAwLgotCSAgICAvLyBCZWNhdXNlIG91ciBJbml0IHZhbHVlIGlzIDEgYXQgTUFDUmVnVGFibGUuCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BWF9MRU5fQ0ZHLCAweDBmZmYpOwotCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCS8vIFBhdGNoIGZvciBNYXJ2ZWwgQVAgdG8gZ2FpbiBoaWdoIHRocm91Z2hwdXQKLQkvLyBOZWVkIHRvIHNldCBhcyBmb2xsb3dpbmcsCi0JLy8gMS4gU2V0IHR4b3AgaW4gcmVnaXN0ZXItRURDQV9BQzBfQ0ZHIGFzIDB4NjAKLQkvLyAyLiBTZXQgRW5UWFdyaXRlQmFja0RET05FIGluIHJlZ2lzdGVyLVdQRE1BX0dMT19DRkcgYXMgemVybwotCS8vIDMuIFBCRl9NQVhfUENOVCBhcyAweDFGM0ZCRjlGCi0JLy8gNC4ga2ljayBwZXIgdHdvIHBhY2tldHMgd2hlbiBkZXF1ZXVlCi0JLy8KLQkvLyBUeG9wIGNhbiBvbmx5IGJlIG1vZGlmaWVkIHdoZW4gUkRHIGlzIG9mZiwgV01NIGlzIGRpc2FibGUgYW5kIFR4QnVyc3QgaXMgZW5hYmxlCi0JLy8KLQkvLyBpZiAxLiBMZWdhY3kgQVAgV01NIG9uLCAgb3IgMi4gMTFuIEFQLCBBTVBEVSBkaXNhYmxlLiAgRm9yY2UgdHVybiBvZmYgYnVyc3Qgbm8gbWF0dGVyIHdoYXQgYkVuYWJsZVR4QnVyc3QgaXMuCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JaWYgKCEoKHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID09IDEpJiYocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkpICYmCi0JCShwQWQtPlN0YUNmZy5iRm9yY2VUeEJ1cnN0ID09IEZBTFNFKSAmJgotCQkoKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSkKLQkJfHwgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSAmJiAocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9PSBCQV9OT1RVU0UpKSkpCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOwotCQlEYXRhICAmPSAweEZGRkZGRjAwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOwotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9NQVhfUENOVCwgMHgxRjNGN0Y5Rik7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4YnVyc3QgMVxuIikpOwotCX0KLQllbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKLQkJRGF0YSAgJj0gMHhGRkZGRkYwMDsKLQkJRGF0YSAgfD0gMHg2MDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKLQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTm93QXRoZXJvc0J1cnN0T24gPSBUUlVFOwotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9NQVhfUENOVCwgMHgxRjNGQkY5Rik7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4YnVyc3QgMlxuIikpOwotCX0KLQllbHNlCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOwotCQlEYXRhICAmPSAweEZGRkZGRjAwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOwotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9NQVhfUENOVCwgMHgxRjNGN0Y5Rik7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4YnVyc3QgM1xuIikpOwotCX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCS8vIFJlLWNoZWNrIHRvIHR1cm4gb24gVFggYnVyc3Qgb3Igbm90LgotCWlmICgocEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTGFzdEF0aGVyb3MgPT0gVFJVRSkgJiYgKChTVEFfV0VQX09OKHBBZCkpfHwoU1RBX1RLSVBfT04ocEFkKSkpKQotCXsKLQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTmV4dERpc2FibGVSeEJBID0gVFJVRTsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQotCQl7Ci0JCSAgICBVSU5UMzIgTUFDVmFsdWUgPSAwOwotCQkJLy8gRm9yY2UgZGlzYWJsZSAgVFhPUCB2YWx1ZSBpbiB0aGlzIGNhc2UuIFRoZSBzYW1lIGFjdGlvbiBpbiBNTE1FVXBkYXRlUHJvdGVjdCB0b28uCi0JCQkvLyBJIGRpZG4ndCBjaGFuZ2UgUEJGX01BWF9QQ05UIHNldHRpbmcuCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJk1BQ1ZhbHVlKTsKLQkJCU1BQ1ZhbHVlICAmPSAweEZGRkZGRjAwOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBNQUNWYWx1ZSk7Ci0JCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOb3dBdGhlcm9zQnVyc3RPbiA9IEZBTFNFOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5leHREaXNhYmxlUnhCQSA9IEZBTFNFOwotCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkxhc3RBdGhlcm9zID0gRkFMU0U7Ci0JQ09QWV9NQUNfQUREUihwQWQtPkNvbW1vbkNmZy5MYXN0QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFwQWQtPmJOZXh0RGlzYWJsZVJ4QkE9ICVkIFxuIiwgcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTmV4dERpc2FibGVSeEJBKSk7Ci0JLy8gQlNTSUQgYWRkIGluIG9uZSBNQUMgZW50cnkgdG9vLiAgQmVjYXVzZSBpbiBUeCwgQVNJQyBuZWVkIHRvIGNoZWNrIENpcGhlciBhbmQgSVYvRUlWLCBCQWJpdG1hcAotCS8vIFB0aGVyIGluZm9ybWF0aW9uIGluIE1BQ1RhYi5Db250ZW50W0JTU0lEX1dDSURdIGlzIG5vdCBuZWNlc3NhcnkgZm9yIGRyaXZlci4KLQkvLyBOb3RlOiBBcyBTVEEsIFRoZSBNQUNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4gUGFpcndpc2VLZXkgYW5kIFNoYXJlZCBLZXkgZm9yIEJTUzAgYXJlIHRoZSBzYW1lLgotCi0JaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JewotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAmJgotCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkgJiYKLQkJCShwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSkpCi0JCQk7Ci0JCWVsc2UKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0JCXsKLQkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0JCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7Ci0JCX0KLQl9Ci0KLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsKLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCi0gICAgLy8KLQkvLyBQYXRjaCBBdGhlcm9zIEFQIFRYIHdpbGwgYnJlYWtkb3duIGlzc3VlLgotCS8vIEFQIE1vZGVsOiBETGluayBEV0wtODIwMEFQCi0JLy8KLQlpZiAoSU5GUkFfT04ocEFkKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmIFNUQV9US0lQX09OKHBBZCkpCi0JewotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9QQVJTRVJfQ0ZHLCAweDAxKTsKLQl9Ci0JZWxzZQotCXsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfUEFSU0VSX0NGRywgMHgwMCk7Ci0JfQotCi0JUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7Ci0JUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotCWlmICgocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLmIyMDQwQ29leGlzdFNjYW5TdXApICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDExKSkKLQl7Ci0JCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TQ0FOXzIwNDApOwotCQlCdWlsZEVmZmVjdGVkQ2hhbm5lbExpc3QocEFkKTsKLQl9Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlEaXNjb25uZWN0IGN1cnJlbnQgQlNTSUQKLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJCS0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlJc1JlcUZyb21BUAkJLSBSZXF1ZXN0IGZyb20gQVAKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCQlXZSBuZWVkIG1vcmUgaW5mb3JtYXRpb24gdG8ga25vdyBpdCdzIHRoaXMgcmVxdXN0IGZyb20gQVAuCi0JCUlmIHllcyEgd2UgbmVlZCB0byBkbyBleHRyYSBoYW5kbGluZywgZm9yIGV4YW1wbGUsIHJlbW92ZSB0aGUgV1BBIGtleS4KLQkJT3RoZXJ3aXNlIG9uIDQtd2F5IGhhbmRzaGFraW5nIHdpbGwgZmFpZWQsIHNpbmNlIHRoZSBXUEEga2V5IGRpZG4ndCBiZQotCQlyZW1vdmUgd2hpbGUgYXV0byByZWNvbm5lY3QuCi0JCURpc2Nvbm5lY3QgcmVxdWVzdCBmcm9tIEFQLCBpdCBtZWFucyB3ZSB3aWxsIHN0YXJ0IGFmcmVzaCA0LXdheSBoYW5kc2hha2luZwotCQlvbiBXUEEgbW9kZS4KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBMaW5rRG93bigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiAgQk9PTEVBTiAgICAgIElzUmVxRnJvbUFQKQotewotCVVDSEFSCQkJICAgIGksIEJ5dGVWYWx1ZSA9IDA7Ci0KLQlCT09MRUFOCQlDYW5jZWxsZWQ7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIG1vbml0b3IgbW9kZSBpcyBvbgotCWlmIChNT05JVE9SX09OKHBBZCkpCi0JCXJldHVybjsKLQotI2lmZGVmIFJBTElOS19BVEUKLQkvLyBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlLgotCWlmIChBVEVfT04ocEFkKSkKLQkJcmV0dXJuOwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0dPX1RPX1NMRUVQX05PVyk7Ci0JLy9Db21tZW50IHRoZSBjb2RlcywgYmVhc3VlIHRoZSBsaW5lIDIyOTEgY2FsbCB0aGUgc2FtZSBmdW5jdGlvbi4KLQkvL1JUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkJJkNhbmNlbGxlZCk7Ci0JLy8gTm90IGFsbG93IGdvIHRvIHNsZWVwIHdpdGhpbiBsaW5rZG93biBmdW5jdGlvbi4KLQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0KLSAgICBpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JewotCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOICEhIVxuIikpOwotCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpCi0gICAgewotCSAgICBCT09MRUFOIENhbmNlbGxlZDsKLSAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLSAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOwotICAgIH0KLQotCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0gICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkKLXx8CVJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19TRVRfUENJX0NMS19PRkZfQ09NTUFORCkKLQkJfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkKLSAgICB7Ci0gICAgICAgIEFVVE9fV0FLRVVQX1NUUlVDIEF1dG9XYWtldXBDZmc7Ci0JCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOwotICAgICAgICBBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOwotCSAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0gICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOwotICAgIH0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQlpZiAoQURIT0NfT04ocEFkKSkJCS8vIEFkaG9jIG1vZGUgbGluayBkb3duCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOIDEhISFcbiIpKTsKLQotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7Ci0JCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKLQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLSAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047Ci0JCQlCc3NUYWJsZURlbGV0ZUVudHJ5KCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1hY1RhYi5TaXplPSVkICEhIVxuIiwgcEFkLT5NYWNUYWIuU2l6ZSkpOwotCX0KLQllbHNlCQkJCQkvLyBJbmZyYSBzdHJ1Y3R1cmUgbW9kZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgRE9XTiAyISEhXG4iKSk7Ci0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJLy8gRExTIHRlYXIgZG93biBmcmFtZSBtdXN0IGJlIHNlbnQgYmVmb3JlIGxpbmsgZG93bgotCQkvLyBzZW5kIERMUy1URUFSX0RPV04gbWVzc2FnZQotCQlpZiAocEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCi0JCXsKLQkJCS8vIHRlYXIgZG93biBsb2NhbCBkbHMgdGFibGUgZW50cnkKLQkJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKLQkJCXsKLQkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKLQkJCQl7Ci0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOwotCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHRlYXIgZG93biBwZWVyIGRscyB0YWJsZSBlbnRyeQotCQkJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKLQkJCXsKLQkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSAgRExTX0ZJTklTSCkpCi0JCQkJewotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKLQkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOwotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotCi0JCS8vIFNhdmVkIGxhc3QgU1NJRCBmb3IgbGlua3VwIGNvbXBhcmlzb24KLQkJcEFkLT5Db21tb25DZmcuTGFzdFNzaWRMZW4gPSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuTGFzdFNzaWRMZW4pOwotCQlDT1BZX01BQ19BRERSKHBBZC0+Q29tbW9uQ2ZnLkxhc3RCc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQlpZiAocEFkLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID09IFRSVUUpCi0JCXsKLQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7Ci0JCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQSFcbiIpKTsKLQkJCXBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotICAgICAgICAgICAgLy8KLQkJCS8vIElmIGRpc2Fzc29jaWF0aW9uIHJlcXVlc3QgaXMgZnJvbSBORElTLCB0aGVuIHdlIGRvbid0IG5lZWQgdG8gZGVsZXRlIEJTU0lEIGZyb20gZW50cnkuCi0JCQkvLyBPdGhlcndpc2UgbG9zdCBiZWFjb24gb3IgcmVjZWl2ZSBEZS1BdXRoZW50aWNhdGlvbiBmcm9tIEFQLAotCQkJLy8gdGhlbiB3ZSBzaG91bGQgZGVsZXRlIEJTU0lEIGZyb20gQnNzVGFibGUuCi0JCQkvLyBJZiB3ZSBkb24ndCBkZWxldGUgZnJvbSBlbnRyeSwgcm9hbWluZyB3aWxsIGZhaWwuCi0JCQkvLwotCQkJQnNzVGFibGVEZWxldGVFbnRyeSgmcEFkLT5TY2FuVGFiLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCX0KLQotCQkvLyByZXN0b3JlIGJhY2sgdG8gLQotCQkvLyAgICAgIDEuIGxvbmcgc2xvdCAoMjAgdXMpIG9yIHNob3J0IHNsb3QgKDkgdXMpIHRpbWUKLQkJLy8gICAgICAyLiB0dXJuIG9uL29mZiBSVFMvQ1RTIGFuZC9vciBDVFMtdG8tc2VsZiBwcm90ZWN0aW9uCi0JCS8vICAgICAgMy4gc2hvcnQgcHJlYW1ibGUKLQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpOwotCi0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotCQkvLyBDb3VudHJ5IElFIG9mIHRoZSBBUCB3aWxsIGJlIGV2YWx1YXRlZCBhbmQgd2lsbCBiZSB1c2VkLgotCQlpZiAocEFkLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgIT0gUnQ4MDJfMTFfRF9Ob25lKQotCQl7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMF0sICZwQWQtPlN0YUNmZy5TdGFPcmlDb3VudHJ5Q29kZVswXSwgMik7Ci0JCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBwQWQtPlN0YUNmZy5TdGFPcmlHZW9ncmFwaHk7Ci0JCQlCdWlsZENoYW5uZWxMaXN0RXgocEFkKTsKLQkJfQotI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KLQotCX0KLQotCi0JZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQl7Ci0JCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgPT0gVFJVRSkKLQkJCU1hY1RhYmxlRGVsZXRlRW50cnkocEFkLCBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFpZCwgcEFkLT5NYWNUYWIuQ29udGVudFtpXS5BZGRyKTsKLQl9Ci0KLQlBc2ljU2V0U2xvdFRpbWUocEFkLCBUUlVFKTsgLy9GQUxTRSk7Ci0JQXNpY1NldEVkY2FQYXJtKHBBZCwgTlVMTCk7Ci0KLQkvLyBTZXQgTEVECi0JUlRNUFNldExFRChwQWQsIExFRF9MSU5LX0RPV04pOwotICAgIHBBZC0+TGVkSW5kaWNhdG9yU3RyZW5ndGggPSAweEYwOwotICAgIFJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLy8gRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBmaXJtd2FyZSBpcyBub3QgZG9uZSBpdC4KLQotCQlBc2ljRGlzYWJsZVN5bmMocEFkKTsKLQotCXBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kID0gMDsKLQlwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCA9IDA7Ci0KLQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCi0JewotCS8vIFJlbW92ZSBTdGFDZmcgSW5mb3JtYXRpb24gYWZ0ZXIgbGluayBkb3duCi0JTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0JTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKLQkJcEFkLT5Db21tb25DZmcuU3NpZExlbiA9IDA7Ci0JfQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOwotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gMDsKLQlwQWQtPk1sbWVBdXguTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkvLyBSZXNldCBXUEEtUFNLIHN0YXRlLiBPbmx5IHJlc2V0IHdoZW4gc3VwcGxpY2FudCBlbmFibGVkCi0JaWYgKHBBZC0+U3RhQ2ZnLldwYVN0YXRlICE9IFNTX05PVFVTRSkKLQl7Ci0JCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7Ci0JCS8vIENsZWFyIFJlcGxheSBjb3VudGVyCi0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIDgpOwotCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKLQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkRsc1JlcGxheUNvdW50ZXIsIDgpOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCX0KLQotCS8vCi0JLy8gaWYgbGluayBkb3duIGNvbWUgZnJvbSBBUCwgd2UgbmVlZCB0byByZW1vdmUgYWxsIFdQQSBrZXlzIG9uIFdQQSBtb2RlLgotCS8vIG90aGVyd2lzZSB3aWxsIGNhdXNlIDQtd2F5IGhhbmRzaGFraW5nIGZhaWxlZCwgc2luY2UgdGhlIFdQQSBrZXkgbm90IGVtcHR5LgotCS8vCi0JaWYgKChJc1JlcUZyb21BUCkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCi0JewotCQkvLyBSZW1vdmUgYWxsIFdQQSBrZXlzCi0JCVJUTVBXUEFSZW1vdmVBbGxLZXlzKHBBZCk7Ci0JfQotCi0JLy8gODAyLjF4IHBvcnQgY29udHJvbAotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkvLyBQcmV2ZW50IGNsZWFyIFBvcnRTZWN1cmVkIGhlcmUgd2l0aCBzdGF0aWMgV0VQCi0JLy8gTmV0d29ya01hbmdlciBzZXQgc2VjdXJpdHkgcG9saWN5IGZpcnN0IHRoZW4gc2V0IFNTSUQgdG8gY29ubmVjdCBBUC4KLQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICYmCi0JCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpICYmCi0JCShwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gRkFMU0UpKQotCXsKLQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQl9Ci0JZWxzZQotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQl7Ci0JCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOwotCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKLQl9Ci0KLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1hY1RhYiwgc2l6ZW9mKE1BQ19UQUJMRSkpOwotCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUG9ydFNlY3VyZWQgPSBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsKLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCi0JcEFkLT5TdGFDZmcuTWljRXJyQ250ID0gMDsKLQotICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7Ci0JLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uIHRvIGxpbmsgaXMgdXAKLQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOwotCi0gICAgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKLQotCi0JLy8gQ2xlYW4gYXNzb2NpYXRpb24gaW5mb3JtYXRpb24KLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuQXNzb2NJbmZvLCBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pKTsKLQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKLQlwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA9IDA7Ci0JcEFkLT5TdGFDZmcuUmVzVmFySUVMZW4gPSAwOwotCi0JLy8KLQkvLyBSZXNldCBSU1NJIHZhbHVlIGFmdGVyIGxpbmsgZG93bgotCS8vCi0JcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCA9IDA7Ci0JcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMFg4ID0gMDsKLQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxID0gMDsKLQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxWDggPSAwOwotCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIgPSAwOwotCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTJYOCA9IDA7Ci0KLQkvLyBSZXN0b3JlIE1sbWVSYXRlCi0JcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlOwotCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JLy8KLQkvLyBBZnRlciBMaW5rIGRvd24sIHJlc2V0IHBpZ2d5LWJhY2sgc2V0dGluZyBpbiBBU0lDLiBEaXNhYmxlIFJERy4KLQkvLwotCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCi0JewotCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQnl0ZVZhbHVlKTsKLQkJQnl0ZVZhbHVlICY9ICh+MHgxOCk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJ5dGVWYWx1ZSk7Ci0JfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCS8vIFJlc2V0IERBQwotCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJ5dGVWYWx1ZSk7Ci0JQnl0ZVZhbHVlICY9ICh+MHgxOCk7Ci0JaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikKLQl7Ci0JQnl0ZVZhbHVlIHw9IDB4MTA7Ci0JfQotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJ5dGVWYWx1ZSk7Ci0KLQkJUlRNUFNldFBpZ2d5QmFjayhwQWQsRkFMU0UpOwotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19QSUdHWUJBQ0tfSU5VU0VEKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkID0gcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LndvcmQ7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkvLyBSZXN0b3JlIGFsbCBzZXR0aW5ncyBpbiB0aGUgZm9sbG93aW5nLgotCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCwgKEFMTE5fU0VUUFJPVEVDVHxDQ0tTRVRQUk9URUNUfE9GRE1TRVRQUk9URUNUKSwgVFJVRSwgRkFMU0UpOwotCUFzaWNEaXNhYmxlUkRHKHBBZCk7Ci0JcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iQ3VycmVudEF0aGVyb3MgPSBGQUxTRTsKLQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOb3dBdGhlcm9zQnVyc3RPbiA9IEZBTFNFOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NDQU5fMjA0MCk7Ci0JcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZCA9IDA7Ci0JVHJpRXZlbnRJbml0KHBBZCk7Ci0JZm9yIChpID0gMDsgaSA8IChwQWQtPkNoYW5uZWxMaXN0TnVtIC0gMSk7IGkrKykKLQl7Ci0JCXBBZC0+Q2hhbm5lbExpc3RbaV0uYkVmZmVjdGVkQ2hhbm5lbCA9IEZBTFNFOwotCX0KLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQVhfTEVOX0NGRywgMHgxZmZmKTsKLQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKLS8vIEFsbG93IGdvIHRvIHNsZWVwIGFmdGVyIGxpbmtkb3duIHN0ZXBzLgotCVJUTVBfU0VUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApIHsKLQkJLy9zZW5kIGRpc2Fzc29jaWF0ZSBldmVudCB0byB3cGFfc3VwcGxpY2FudAotCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZDVVNUT00sIFJUX0RJU0FTU09DX0VWRU5UX0ZMQUcsIE5VTEwsIE5VTEwsIDApOwotCX0KLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBTSU9DR0lXQVAsIC0xLCBOVUxMLCBOVUxMLCAwKTsKLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0jaWZkZWYgUlQzMHh4Ci0JaWYgKChJU19SVDMweHgocEFkKSB8fCBJU19SVDMwOTAocEFkKXx8SVNfUlQzMzkwKHBBZCkpCi0JCSYmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGg+MXx8cEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aD4xKSkKLQl7Ci0JCVJUTVBfQVNJQ19NTVBTX0RJU0FCTEUocEFkKTsKLQl9Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgSXRlcmF0ZU9uQnNzVGFiKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCU1MTUVfU1RBUlRfUkVRX1NUUlVDVCAgIFN0YXJ0UmVxOwotCU1MTUVfSk9JTl9SRVFfU1RSVUNUICAgIEpvaW5SZXE7Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgQnNzSWR4OwotCi0JLy8gQ2hhbmdlIHRoZSB3ZXBzdGF0dXMgdG8gb3JpZ2luYWwgd2Vwc3RhdHVzCi0JcEFkLT5TdGFDZmcuV2VwU3RhdHVzICAgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOwotCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKLQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7Ci0KLQlCc3NJZHggPSBwQWQtPk1sbWVBdXguQnNzSWR4OwotCWlmIChCc3NJZHggPCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcikKLQl7Ci0JCS8vIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcKLQkJLy8gU2V0IHRoZSBQYWlyd2lzZSBhbmQgR3JvdXAgY2lwaGVyIHRvIG1hdGNoIHRoZSBpbnRlbmRlZCBBUCBzZXR0aW5nCi0JCS8vIFdlIGNhbiBvbmx5IGNvbm5lY3QgdG8gQVAgd2l0aCBsZXNzIHNlY3VyZWQgY2lwaGVyIHNldHRpbmcKLQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQotCQl7Ci0JCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLkdyb3VwQ2lwaGVyOwotCi0JCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXIpCi0JCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXI7Ci0JCQllbHNlIGlmIChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlckF1eDsKLQkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCi0JCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JCX0KLQkJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJewotCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuR3JvdXBDaXBoZXI7Ci0KLQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXIpCi0JCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyOwotCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQotCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eDsKLQkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCi0JCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0KLQkJCS8vIFJTTiBjYXBhYmlsaXR5Ci0JCQlwQWQtPlN0YUNmZy5Sc25DYXBhYmlsaXR5ID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlJzbkNhcGFiaWxpdHk7Ci0JCX0KLQotCQkvLyBTZXQgTWl4IGNpcGhlciBmbGFnCi0JCXBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPSAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcikgPyBGQUxTRSA6IFRSVUU7Ci0JCS8qaWYgKHBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPT0gVFJVRSkKLQkJewotCQkJLy8gSWYgbWl4IGNpcGhlciwgcmUtYnVpbGQgUlNOSUUKLQkJCVJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCAwKTsKLQkJfSovCi0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGl0ZXJhdGUgQlNTICVsZCBvZiAlZFxuIiwgQnNzSWR4LCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcikpOwotCQlKb2luUGFybUZpbGwocEFkLCAmSm9pblJlcSwgQnNzSWR4KTsKLQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0pPSU5fUkVRLCBzaXplb2YoTUxNRV9KT0lOX1JFUV9TVFJVQ1QpLAotCQkJCQkmSm9pblJlcSk7Ci0JCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfSk9JTjsKLQl9Ci0JZWxzZSBpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQWxsIEJTUyBmYWlsOyBzdGFydCBhIG5ldyBBREhPQyAoU3NpZD0lcykuLi5cbiIscEFkLT5NbG1lQXV4LlNzaWQpKTsKLQkJU3RhcnRQYXJtRmlsbChwQWQsICZTdGFydFJlcSwgKFBDSEFSKXBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOwotCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1NUQVJUOwotCX0KLQllbHNlIC8vIG5vIG1vcmUgQlNTCi0JewotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCXsKLQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQWxsIHJvYW1pbmcgZmFpbGVkLCByZXN0b3JlIHRvIGNoYW5uZWwgJWQsIFRvdGFsIEJTU1slMDJkXVxuIixwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKLQkJfQotCi0JCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0JfQotfQotCi0vLyBmb3IgcmUtYXNzb2NpYXRpb24gb25seQotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIEl0ZXJhdGVPbkJzc1RhYjIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QgUmVhc3NvY1JlcTsKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBCc3NJZHg7Ci0JQlNTX0VOVFJZICAgICAgICAgICAgICAgKnBCc3M7Ci0KLQlCc3NJZHggPSBwQWQtPk1sbWVBdXguUm9hbUlkeDsKLQlwQnNzID0gJnBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc0VudHJ5W0Jzc0lkeF07Ci0KLQlpZiAoQnNzSWR4IDwgcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnIpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gaXRlcmF0ZSBCU1MgJWxkIG9mICVkXG4iLCBCc3NJZHgsIHBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc05yKSk7Ci0KLQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQnNzLT5DaGFubmVsLCBGQUxTRSk7Ci0JCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBCc3MtPkNoYW5uZWwpOwotCi0JCS8vIHJlYXNzb2NpYXRlIG1lc3NhZ2UgaGFzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBhc3NvY2lhdGUgbWVzc2FnZQotCQlBc3NvY1Bhcm1GaWxsKHBBZCwgJlJlYXNzb2NSZXEsIHBCc3MtPkJzc2lkLCBwQnNzLT5DYXBhYmlsaXR5SW5mbywKLQkJCQkJICBBU1NPQ19USU1FT1VULCBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOwotCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLAotCQkJCQlzaXplb2YoTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QpLCAmUmVhc3NvY1JlcSk7Ci0KLQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9SRUFTU09DOwotCX0KLQllbHNlIC8vIG5vIG1vcmUgQlNTCi0JewotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCXsKLQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQWxsIHJvYW1pbmcgZmFpbGVkLCByZXN0b3JlIHRvIGNoYW5uZWwgJWQsIFRvdGFsIEJTU1slMDJkXVxuIixwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKLQkJfQotCi0JCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBKb2luUGFybUZpbGwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gT1VUIE1MTUVfSk9JTl9SRVFfU1RSVUNUICpKb2luUmVxLAotCUlOIFVMT05HIEJzc0lkeCkKLXsKLQlKb2luUmVxLT5Cc3NJZHggPSBCc3NJZHg7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFNjYW5QYXJtRmlsbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBPVVQgTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKlNjYW5SZXEsCi0JSU4gU1RSSU5HIFNzaWRbXSwKLQlJTiBVQ0hBUiBTc2lkTGVuLAotCUlOIFVDSEFSIEJzc1R5cGUsCi0JSU4gVUNIQVIgU2NhblR5cGUpCi17Ci0gICAgTmRpc1plcm9NZW1vcnkoU2NhblJlcS0+U3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKLQlTY2FuUmVxLT5Tc2lkTGVuID0gU3NpZExlbjsKLQlOZGlzTW92ZU1lbW9yeShTY2FuUmVxLT5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKLQlTY2FuUmVxLT5Cc3NUeXBlID0gQnNzVHlwZTsKLQlTY2FuUmVxLT5TY2FuVHlwZSA9IFNjYW5UeXBlOwotfQotCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBEbHNQYXJtRmlsbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBPVVQgTUxNRV9ETFNfUkVRX1NUUlVDVCAqcERsc1JlcSwKLQlJTiBQUlRfODAyXzExX0RMUyBwRGxzLAotCUlOIFVTSE9SVCByZWFzb24pCi17Ci0JcERsc1JlcS0+cERMUyA9IHBEbHM7Ci0JcERsc1JlcS0+UmVhc29uID0gcmVhc29uOwotfQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBTdGFydFBhcm1GaWxsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE9VVCBNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgKlN0YXJ0UmVxLAotCUlOIENIQVIgU3NpZFtdLAotCUlOIFVDSEFSIFNzaWRMZW4pCi17Ci0JQVNTRVJUKFNzaWRMZW4gPD0gTUFYX0xFTl9PRl9TU0lEKTsKLQlOZGlzTW92ZU1lbW9yeShTdGFydFJlcS0+U3NpZCwgU3NpZCwgU3NpZExlbik7Ci0JU3RhcnRSZXEtPlNzaWRMZW4gPSBTc2lkTGVuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBdXRoUGFybUZpbGwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gT1VUIE1MTUVfQVVUSF9SRVFfU1RSVUNUICpBdXRoUmVxLAotCUlOIFBVQ0hBUiBwQWRkciwKLQlJTiBVU0hPUlQgQWxnKQotewotCUNPUFlfTUFDX0FERFIoQXV0aFJlcS0+QWRkciwgcEFkZHIpOwotCUF1dGhSZXEtPkFsZyA9IEFsZzsKLQlBdXRoUmVxLT5UaW1lb3V0ID0gQVVUSF9USU1FT1VUOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLVZPSUQgQ29tcG9zZVBzUG9sbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5Qc1BvbGxGcmFtZSwgc2l6ZW9mKFBTUE9MTF9GUkFNRSkpOwotCXBBZC0+UHNQb2xsRnJhbWUuRkMuVHlwZSA9IEJUWVBFX0NOVEw7Ci0JcEFkLT5Qc1BvbGxGcmFtZS5GQy5TdWJUeXBlID0gU1VCVFlQRV9QU19QT0xMOwotCXBBZC0+UHNQb2xsRnJhbWUuQWlkID0gcEFkLT5TdGFBY3RpdmUuQWlkIHwgMHhDMDAwOwotCUNPUFlfTUFDX0FERFIocEFkLT5Qc1BvbGxGcmFtZS5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCUNPUFlfTUFDX0FERFIocEFkLT5Qc1BvbGxGcmFtZS5UYSwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci19Ci0KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBDb21wb3NlTnVsbEZyYW1lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk51bGxGcmFtZSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQlwQWQtPk51bGxGcmFtZS5GQy5UeXBlID0gQlRZUEVfREFUQTsKLQlwQWQtPk51bGxGcmFtZS5GQy5TdWJUeXBlID0gU1VCVFlQRV9OVUxMX0ZVTkM7Ci0JcEFkLT5OdWxsRnJhbWUuRkMuVG9EcyA9IDE7Ci0JQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMSwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCUNPUFlfTUFDX0FERFIocEFkLT5OdWxsRnJhbWUuQWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOwotCUNPUFlfTUFDX0FERFIocEFkLT5OdWxsRnJhbWUuQWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlQcmUtYnVpbGQgYSBCRUFDT04gZnJhbWUgaW4gdGhlIHNoYXJlZCBtZW1vcnkKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVMT05HIE1ha2VJYnNzQmVhY29uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVVDSEFSICAgICAgICAgRHNMZW4gPSAxLCBJYnNzTGVuID0gMjsKLQlVQ0hBUiAgICAgICAgIExvY2FsRXJwSWVbM10gPSB7SUVfRVJQLCAxLCAweDA0fTsKLQlIRUFERVJfODAyXzExIEJjbkhkcjsKLQlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvOwotCUxBUkdFX0lOVEVHRVIgRmFrZVRpbWVzdGFtcDsKLQlVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlQVFhXSV9TVFJVQwkgIHBUeFdJID0gJnBBZC0+QmVhY29uVHhXSTsKLQlVQ0hBUiAgICAgICAgICpwQmVhY29uRnJhbWUgPSBwQWQtPkJlYWNvbkJ1ZjsKLQlCT09MRUFOICAgICAgIFByaXZhY3k7Ci0JVUNIQVIgICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUiAgICAgICAgIFN1cFJhdGVMZW4gPSAwOwotCVVDSEFSICAgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIgICAgICAgICBFeHRSYXRlTGVuID0gMDsKLQlVQ0hBUiAgICAgICAgIFJTTkllID0gSUVfV1BBOwotCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSkKLQl7Ci0JCVN1cFJhdGVbMF0gPSAweDgyOyAvLyAxIG1icHMKLQkJU3VwUmF0ZVsxXSA9IDB4ODQ7IC8vIDIgbWJwcwotCQlTdXBSYXRlWzJdID0gMHg4YjsgLy8gNS41IG1icHMKLQkJU3VwUmF0ZVszXSA9IDB4OTY7IC8vIDExIG1icHMKLQkJU3VwUmF0ZUxlbiA9IDQ7Ci0JCUV4dFJhdGVMZW4gPSAwOwotCX0KLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JewotCQlTdXBSYXRlWzBdICA9IDB4OEM7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJU3VwUmF0ZVsxXSAgPSAweDEyOyAgICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCVN1cFJhdGVbMl0gID0gMHg5ODsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJU3VwUmF0ZVszXSAgPSAweDI0OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlTdXBSYXRlWzRdICA9IDB4YjA7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCVN1cFJhdGVbNV0gID0gMHg0ODsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJU3VwUmF0ZVs2XSAgPSAweDYwOyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlTdXBSYXRlWzddICA9IDB4NmM7ICAgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCVN1cFJhdGVMZW4gID0gODsKLQkJRXh0UmF0ZUxlbiAgPSAwOwotCi0JCS8vCi0JCS8vIEFsc28gVXBkYXRlIE1sbWVSYXRlICYgUnRzUmF0ZSBmb3IgRyBvbmx5ICYgQSBvbmx5Ci0JCS8vCi0JCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OwotCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV82OwotCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07Ci0JfQotCWVsc2UKLQl7Ci0JCVN1cFJhdGVbMF0gPSAweDgyOyAvLyAxIG1icHMKLQkJU3VwUmF0ZVsxXSA9IDB4ODQ7IC8vIDIgbWJwcwotCQlTdXBSYXRlWzJdID0gMHg4YjsgLy8gNS41IG1icHMKLQkJU3VwUmF0ZVszXSA9IDB4OTY7IC8vIDExIG1icHMKLQkJU3VwUmF0ZUxlbiA9IDQ7Ci0KLQkJRXh0UmF0ZVswXSAgPSAweDBDOyAgICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLAotCQlFeHRSYXRlWzFdICA9IDB4MTI7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJRXh0UmF0ZVsyXSAgPSAweDE4OyAgICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywKLQkJRXh0UmF0ZVszXSAgPSAweDI0OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlFeHRSYXRlWzRdICA9IDB4MzA7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLAotCQlFeHRSYXRlWzVdICA9IDB4NDg7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCUV4dFJhdGVbNl0gID0gMHg2MDsgICAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJRXh0UmF0ZVs3XSAgPSAweDZjOyAgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlFeHRSYXRlTGVuICA9IDg7Ci0JfQotCi0JcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7Ci0JcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7Ci0KLQkvLyBjb21wb3NlIElCU1MgYmVhY29uIGZyYW1lCi0JTWd0TWFjSGVhZGVySW5pdChwQWQsICZCY25IZHIsIFNVQlRZUEVfQkVBQ09OLCAwLCBCUk9BRENBU1RfQUREUiwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCVByaXZhY3kgPSAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpIHx8Ci0JCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKLQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKTsKLQlDYXBhYmlsaXR5SW5mbyA9IENBUF9HRU5FUkFURSgwLCAxLCBQcml2YWN5LCAocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpLCAwLCAwKTsKLQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSwgICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgICAgICAgICZCY25IZHIsCi0JCQkJCSAgVElNRVNUQU1QX0xFTiwgICAgICAgICAgICAgICAgICAgJkZha2VUaW1lc3RhbXAsCi0JCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCwKLQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKLQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKLQkJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Tc2lkLAotCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVMZW4sCi0JCQkJCSAgU3VwUmF0ZUxlbiwgICAgICAgICAgICAgICAgICAgICAgU3VwUmF0ZSwKLQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNJZSwKLQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNMZW4sCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NJZSwKLQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWJzc0xlbiwKLQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuQXRpbVdpbiwKLQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0KLQkvLyBhZGQgRVJQX0lFIGFuZCBFWFRfUkFFIElFIG9mIGluIDgwMi4xMWcKLQlpZiAoRXh0UmF0ZUxlbikKLQl7Ci0JCVVMT05HCXRtcDsKLQotCQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUgKyBGcmFtZUxlbiwgICAgICAgICAmdG1wLAotCQkJCQkJICAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbEVycEllLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUxlbiwKLQkJCQkJCSAgRXh0UmF0ZUxlbiwgICAgICAgICAgICAgICAgICAgICAgRXh0UmF0ZSwKLQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQlGcmFtZUxlbiArPSB0bXA7Ci0JfQotCi0JLy8gSWYgYWRob2Mgc2VjcnVpdHkgaXMgc2V0IGZvciBXUEEtTm9uZSwgYXBwZW5kIHRoZSBjaXBoZXIgc3VpdGUgSUUKLQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQl7Ci0JCVVMT05HIHRtcDsKLSAgICAgICAgUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIEJTUzApOwotCi0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSArIEZyYW1lTGVuLAkJJnRtcCwKLQkJCQkJCSAgMSwJCQkJCSZSU05JZSwKLQkJCQkJCSAgMSwJCQkJCSZwQWQtPlN0YUNmZy5SU05JRV9MZW4sCi0JCQkJCQkgIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwJCXBBZC0+U3RhQ2ZnLlJTTl9JRSwKLQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQlGcmFtZUxlbiArPSB0bXA7Ci0JfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQotCXsKLQkJVUxPTkcgVG1wTGVuOwotCQlVQ0hBUiBIdExlbiwgSHRMZW4xOwotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eVRtcDsKLQkJQUREX0hUX0lORk9fSUUJYWRkSFRJbmZvVG1wOwotCQlVU0hPUlQJYjJsVG1wLCBiMmxUbXAyOwotI2VuZGlmCi0KLQkJLy8gYWRkIEhUIENhcGFiaWxpdHkgSUUKLQkJSHRMZW4gPSBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KTsKLQkJSHRMZW4xID0gc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbyk7Ci0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQkJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lK0ZyYW1lTGVuLAkmVG1wTGVuLAotCQkJCQkJICAxLAkJCQkJCSZIdENhcEllLAotCQkJCQkJICAxLAkJCQkJCSZIdExlbiwKLQkJCQkJCSAgSHRMZW4sCQkJCQkmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAotCQkJCQkJICAxLAkJCQkJCSZBZGRIdEluZm9JZSwKLQkJCQkJCSAgMSwJCQkJCQkmSHRMZW4xLAotCQkJCQkJICBIdExlbjEsCQkJCQkmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLAotCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0jZWxzZQotCQlOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBIdExlbik7Ci0JCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykpOwotCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pKTsKLQotCQlOZGlzTW92ZU1lbW9yeSgmYWRkSFRJbmZvVG1wLCAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLCBIdExlbjEpOwotCQkqKFVTSE9SVCAqKSgmYWRkSFRJbmZvVG1wLkFkZEh0SW5mbzIpID0gU1dBUDE2KCooVVNIT1JUICopKCZhZGRIVEluZm9UbXAuQWRkSHRJbmZvMikpOwotCQkqKFVTSE9SVCAqKSgmYWRkSFRJbmZvVG1wLkFkZEh0SW5mbzMpID0gU1dBUDE2KCooVVNIT1JUICopKCZhZGRIVEluZm9UbXAuQWRkSHRJbmZvMykpOwotCi0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZStGcmFtZUxlbiwJJlRtcExlbiwKLQkJCQkJCSAgMSwJCQkJCQkmSHRDYXBJZSwKLQkJCQkJCSAgMSwJCQkJCQkmSHRMZW4sCi0JCQkJCQkgIEh0TGVuLAkJCQkJJkh0Q2FwYWJpbGl0eVRtcCwKLQkJCQkJCSAgMSwJCQkJCQkmQWRkSHRJbmZvSWUsCi0JCQkJCQkgIDEsCQkJCQkJJkh0TGVuMSwKLQkJCQkJCSAgSHRMZW4xLAkJCQkJJmFkZEhUSW5mb1RtcCwKLQkJCQkJCSAgRU5EX09GX0FSR1MpOwotI2VuZGlmCi0JCUZyYW1lTGVuICs9IFRtcExlbjsKLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkvL2JlYWNvbiB1c2UgcmVzZXJ2ZWQgV0NJRCAweGZmCi0gICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLSAgICB7Ci0JUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsICBUUlVFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIDAsIDB4ZmYsIEZyYW1lTGVuLAotCQlQSURfTUdNVCwgUElEX0JFQUNPTiwgUkFURV8xLCBJRlNfSFRUWE9QLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8vIFNldCB0byB1c2UgMU1icHMgZm9yIEFkaG9jIGJlYWNvbi4KLQkJSFRUUkFOU01JVF9TRVRUSU5HIFRyYW5zbWl0OwotICAgICAgICBUcmFuc21pdC53b3JkID0gMDsKLSAgICAgICAgUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsICBUUlVFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIDAsIDB4ZmYsIEZyYW1lTGVuLAotCQlQSURfTUdNVCwgUElEX0JFQUNPTiwgUkFURV8xLCBJRlNfSFRUWE9QLCBGQUxTRSwgJlRyYW5zbWl0KTsKLSAgICB9Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgcEJlYWNvbkZyYW1lLCBESVJfV1JJVEUsIEZBTFNFKTsKLQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhXSSwgVFlQRV9UWFdJKTsKLSNlbmRpZgotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFrZUlic3NCZWFjb24gKGxlbj0lbGQpLCBTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkLCBDaGFubmVsPSVkLCBQaHlNb2RlPSVkXG4iLAotCQkJCQlGcmFtZUxlbiwgU3VwUmF0ZUxlbiwgRXh0UmF0ZUxlbiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOwotCXJldHVybiBGcmFtZUxlbjsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL2Rscy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvZGxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNmUxNmYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvZGxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjA3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgZGxzLmMKLQotICAgIEFic3RyYWN0OgotICAgIEhhbmRsZSBXTU0tRExTIHN0YXRlIG1hY2hpbmUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgUm9yeSBDaGVuICAgMDItMTQtMjAwNgotCUFydmluIFRhaQkwNi0wMy0yMDA4CSAgTW9kaWZpZWQgZm9yIFJUMjh4eAotICovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIGRscyBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0Ci0gICAgUGFyYW1ldGVyczoKLSAgICAgICAgU20gLSBwb2ludGVyIHRvIHRoZSBkbHMgc3RhdGUgbWFjaGluZQotICAgIE5vdGU6Ci0gICAgICAgIFRoZSBzdGF0ZSBtYWNoaW5lIGxvb2tzIGxpa2UgdGhpcwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRExTX0lETEUKLSAgICBNVDJfTUxNRV9ETFNfUkVRVUVTVCAgIE1sbWVEbHNSZXFBY3Rpb24KLSAgICBNVDJfUEVFUl9ETFNfUkVRVUVTVCAgIFBlZXJEbHNSZXFBY3Rpb24KLSAgICBNVDJfUEVFUl9ETFNfUkVTUE9OU0UgIFBlZXJEbHNSc3BBY3Rpb24KLSAgICBNVDJfTUxNRV9ETFNfVEVBUkRPV04gIE1sbWVUZWFyRG93bkFjdGlvbgotICAgIE1UMl9QRUVSX0RMU19URUFSRE9XTiAgUGVlclRlYXJEb3duQWN0aW9uCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotdm9pZCBEbHNTdGF0ZU1hY2hpbmVJbml0KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFNUQVRFX01BQ0hJTkUgKlNtLAotICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKLXsKLQlVQ0hBUglpOwotCi0gICAgU3RhdGVNYWNoaW5lSW5pdChTbSwgKFNUQVRFX01BQ0hJTkVfRlVOQyopVHJhbnMsIE1BWF9ETFNfU1RBVEUsIE1BWF9ETFNfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIERMU19JRExFLCBETFNfTUFDSElORV9CQVNFKTsKLQotICAgIC8vIHRoZSBmaXJzdCBjb2x1bW4KLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIERMU19JRExFLCBNVDJfTUxNRV9ETFNfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVEbHNSZXFBY3Rpb24pOwotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgRExTX0lETEUsIE1UMl9QRUVSX0RMU19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRsc1JlcUFjdGlvbik7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBETFNfSURMRSwgTVQyX1BFRVJfRExTX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGxzUnNwQWN0aW9uKTsKLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIERMU19JRExFLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVEbHNUZWFyRG93bkFjdGlvbik7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBETFNfSURMRSwgTVQyX1BFRVJfRExTX1RFQVJfRE9XTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGxzVGVhckRvd25BY3Rpb24pOwotCi0JZm9yIChpPTA7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKLQl7Ci0JCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLnBBZCA9IHBBZDsKLQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKERsc1RpbWVvdXRBY3Rpb24pLCBwQWQsIEZBTFNFKTsKLQl9Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lRGxzUmVxQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUwkJTlN0YXR1czsKLQlVTE9ORwkJCUZyYW1lTGVuID0gMDsKLQlIRUFERVJfODAyXzExCURsc1JlcUhkcjsKLQlQUlRfODAyXzExX0RMUwlwRExTID0gTlVMTDsKLQlVQ0hBUgkJCUNhdGVnb3J5ID0gQ0FURUdPUllfRExTOwotCVVDSEFSCQkJQWN0aW9uID0gQUNUSU9OX0RMU19SRVFVRVNUOwotCVVMT05HCQkJdG1wOwotCVVTSE9SVAkJCXJlYXNvbjsKLQlVTE9ORwkJCVRpbWVvdXQ7Ci0JQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOwotCi0JaWYoIU1sbWVEbHNSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJnBETFMsICZyZWFzb24pKQotCQlyZXR1cm47Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIE1sbWVEbHNSZXFBY3Rpb24oKSBcbiIpKTsKLQotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gTWxtZURsc1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlBY3RIZWFkZXJJbml0KHBBZCwgJkRsc1JlcUhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQotCS8vIEJ1aWxkIGJhc2ljIGZyYW1lIGZpcnN0Ci0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAotCQkJCQlzaXplb2YoSEVBREVSXzgwMl8xMSksCQkmRGxzUmVxSGRyLAotCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCi0JCQkJCTEsCQkJCQkJCSZBY3Rpb24sCi0JCQkJCTYsCQkJCQkJCSZwRExTLT5NYWNBZGRyLAotCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAotCQkJCQkyLAkJCQkJCQkmcEFkLT5TdGFBY3RpdmUuQ2FwYWJpbGl0eUluZm8sCi0JCQkJCTIsCQkJCQkJCSZwRExTLT5UaW1lT3V0LAotCQkJCQkxLAkJCQkJCQkmU3VwUmF0ZUllLAotCQkJCQkxLAkJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCi0JCQkJCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAlwQWQtPk1sbWVBdXguU3VwUmF0ZSwKLQkJCQkJRU5EX09GX0FSR1MpOwotCi0JaWYgKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuICE9IDApCi0JewotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCi0JCQkJCQkgIDEsCQkJCQkJJkV4dFJhdGVJZSwKLQkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCi0JCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAlwQWQtPk1sbWVBdXguRXh0UmF0ZSwKLQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQlGcmFtZUxlbiArPSB0bXA7Ci0JfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQotCXsKLQkJVUNIQVIgSHRMZW47Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCUhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOwotI2VuZGlmCi0KLQkJLy8gYWRkIEhUIENhcGFiaWxpdHkgSUUKLQkJSHRMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7Ci0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAotCQkJCQkJCTEsCQkJCQkJJkh0Q2FwSWUsCi0JCQkJCQkJMSwJCQkJCQkmSHRMZW4sCi0JCQkJCQkJSHRMZW4sCQkJCQkmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAotCQkJCQkJCUVORF9PRl9BUkdTKTsKLSNlbHNlCi0JCU5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIEh0TGVuKTsKLQkJCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKLQkJCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pKTsKLQotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCi0JCQkJCQkJMSwJCQkJCQkmSHRDYXBJZSwKLQkJCQkJCQkxLAkJCQkJCSZIdExlbiwKLQkJCQkJCQlIdExlbiwJCQkJCSZIdENhcGFiaWxpdHlUbXAsCi0JCQkJCQkJRU5EX09GX0FSR1MpOwotI2VuZGlmCi0JCUZyYW1lTGVuID0gRnJhbWVMZW4gKyB0bXA7Ci0JfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JUlRNUENhbmNlbFRpbWVyKCZwRExTLT5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQlUaW1lb3V0ID0gRExTX1RJTUVPVVQ7Ci0JUlRNUFNldFRpbWVyKCZwRExTLT5UaW1lciwgVGltZW91dCk7Ci0KLQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBQZWVyRGxzUmVxQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUwkJTlN0YXR1czsKLQlVTE9ORwkJCUZyYW1lTGVuID0gMDsKLQlVU0hPUlQJCQlTdGF0dXNDb2RlID0gTUxNRV9TVUNDRVNTOwotCUhFQURFUl84MDJfMTEJRGxzUnNwSGRyOwotCVVDSEFSCQkJQ2F0ZWdvcnkgPSBDQVRFR09SWV9ETFM7Ci0JVUNIQVIJCQlBY3Rpb24gPSBBQ1RJT05fRExTX1JFU1BPTlNFOwotCVVMT05HCQkJdG1wOwotCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvOwotCVVDSEFSCQkJREFbTUFDX0FERFJfTEVOXSwgU0FbTUFDX0FERFJfTEVOXTsKLQlVU0hPUlQJCQlETFNUaW1lT3V0OwotCVNIT1JUCQkJaTsKLQlVTE9ORwkJCVRpbWVvdXQ7Ci0JQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOwotCVBSVF84MDJfMTFfRExTCXBETFMgPSBOVUxMOwotCVVDSEFSCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IDA7Ci0gICAgVUNIQVIJCQlTdXBwb3J0ZWRSYXRlc0xlbjsKLSAgICBVQ0hBUgkJCVN1cHBvcnRlZFJhdGVzW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKLQlIVF9DQVBBQklMSVRZX0lFCUh0Q2FwYWJpbGl0eTsKLQotCWlmICghUGVlckRsc1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBEQSwgU0EsICZDYXBhYmlsaXR5SW5mbywgJkRMU1RpbWVPdXQsCi0JCQkJCQkJJlN1cHBvcnRlZFJhdGVzTGVuLCAmU3VwcG9ydGVkUmF0ZXNbMF0sICZIdENhcGFiaWxpdHlMZW4sICZIdENhcGFiaWxpdHkpKQotCQlyZXR1cm47Ci0KLSAgICAvLyBzdXBwb3J0ZWQgcmF0ZXMgYXJyYXkgbWF5IG5vdCBiZSBzb3J0ZWQuIHNvcnQgaXQgYW5kIGZpbmQgdGhlIG1heGltdW0gcmF0ZQotICAgIGZvciAoaSA9IDA7IGkgPCBTdXBwb3J0ZWRSYXRlc0xlbjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoU3VwcG9ydGVkUmF0ZXNbaV0gJiAweDdmKSkKLSAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBTdXBwb3J0ZWRSYXRlc1tpXSAmIDB4N2Y7Ci0gICAgfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOwotCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghSU5GUkFfT04ocEFkKSkKLQl7Ci0JCVN0YXR1c0NvZGUgPSBNTE1FX1JFUVVFU1RfREVDTElORUQ7Ci0JfQotCWVsc2UgaWYgKCFwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkKLQl7Ci0JCVN0YXR1c0NvZGUgPSBNTE1FX0RFU1RfU1RBX0lTX05PVF9BX1FTVEE7Ci0JfQotCWVsc2UgaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKLQl7Ci0JCVN0YXR1c0NvZGUgPSBNTE1FX1JFUVVFU1RfREVDTElORUQ7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIGZpbmQgdGFibGUgdG8gdXBkYXRlIHBhcmFtZXRlcnMKLQkJZm9yIChpID0gKE1BWF9OVU1fT0ZfRExTX0VOVFJZLTEpOyBpID49IDA7IGktLSkKLQkJewotCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJCXsKLQkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfV0FJVF9LRVk7Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKLQkJCQl9Ci0KLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TZXF1ZW5jZSA9IDA7Ci0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCA9IERMU1RpbWVPdXQ7Ci0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBETFNUaW1lT3V0OwotCQkJCWlmIChIdENhcGFiaWxpdHlMZW4gIT0gMCkKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gVFJVRTsKLQkJCQllbHNlCi0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IEZBTFNFOwotCQkJCXBETFMgPSAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjYW4gbm90IGZpbmQgaW4gdGFibGUsIGNyZWF0ZSBhIG5ldyBvbmUKLQkJaWYgKGkgPCAwKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSZXFBY3Rpb24oKSBjYW4gbm90IGZpbmQgc2FtZSBlbnRyeSBcbiIpKTsKLQkJCWZvciAoaT0oTUFYX05VTV9PRl9ETFNfRU5UUlkgLSAxKTsgaSA+PSBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpLS0pCi0JCQl7Ci0JCQkJaWYgKCFwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkKLQkJCQl7Ci0JCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCQkJCQlVQ0hBUiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKLQotCQkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQkJCQl7Ci0JCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfV0FJVF9LRVk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKLQkJCQkJfQotCi0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlNlcXVlbmNlID0gMDsKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgPSBUUlVFOwotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0ID0gRExTVGltZU91dDsKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBETFNUaW1lT3V0OwotCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLCBTQSwgTUFDX0FERFJfTEVOKTsKLQkJCQkJaWYgKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKQotCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gVFJVRTsKLQkJCQkJZWxzZQotCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gRkFMU0U7Ci0JCQkJCXBETFMgPSAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV07Ci0JCQkJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RGxzRW50cnkocEFkLCBTQSwgaSk7Ci0KLQkJCQkJc3dpdGNoIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzKQotCQkJCQl7Ci0JCQkJCQljYXNlIDEwODogTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNTQ7ICAgYnJlYWs7Ci0JCQkJCQljYXNlIDk2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNDg7ICAgYnJlYWs7Ci0JCQkJCQljYXNlIDcyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMzY7ICAgYnJlYWs7Ci0JCQkJCQljYXNlIDQ4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjQ7ICAgYnJlYWs7Ci0JCQkJCQljYXNlIDM2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTg7ICAgYnJlYWs7Ci0JCQkJCQljYXNlIDI0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTI7ICAgYnJlYWs7Ci0JCQkJCQljYXNlIDE4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfOTsgICAgYnJlYWs7Ci0JCQkJCQljYXNlIDEyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNjsgICAgYnJlYWs7Ci0JCQkJCQljYXNlIDIyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7Ci0JCQkJCQljYXNlIDExOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNV81OyAgYnJlYWs7Ci0JCQkJCQljYXNlIDQ6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjsgICAgYnJlYWs7Ci0JCQkJCQljYXNlIDI6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTsgICAgYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7Ci0JCQkJCX0KLQotCQkJCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBtaW4ocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlLCBNYXhTdXBwb3J0ZWRSYXRlKTsKLQotCQkJCQlpZiAocEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpCi0JCQkJCXsKLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKLQkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKLQkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOwotCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07Ci0JCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKLQkJCQkJfQotCi0JCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7Ci0JCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMDsKLQkJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMDsKLQotCQkJCQkvLyBJZiB0aGlzIEVudHJ5IHN1cHBvcnRzIDgwMi4xMW4sIHVwZ3JhZGUgdG8gSFQgcmF0ZS4KLQkJCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCi0JCQkJCXsKLQkJCQkJCVVDSEFSCWosIGJpdG1hc2s7IC8vayxiaXRtYXNrOwotCQkJCQkJQ0hBUiAgICBpaTsKLQotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIFJlY2VpdmUgUGVlciBIVCBDYXBhYmxlIFNUQSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJCQkJCQkJU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOwotCi0JCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQotCQkJCQkJewotCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKLQkJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk5vbkdGID0gVFJVRTsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSAxOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCkpCi0JCQkJCQl7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlc9IEJXXzQwOwotCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKSk7Ci0JCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb24yME9ubHkgPSBUUlVFOwotCQkJCQkJfQotCi0JCQkJCQkvLyBmaW5kIG1heCBmaXhlZCByYXRlCi0JCQkJCQlmb3IgKGlpPTE1OyBpaT49MDsgaWktLSkKLQkJCQkJCXsKLQkJCQkJCQlqID0gaWkvODsKLQkJCQkJCQliaXRtYXNrID0gKDE8PChpaS0oaio4KSkpOwotCQkJCQkJCWlmICggKHBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0W2pdJmJpdG1hc2spICYmIChIdENhcGFiaWxpdHkuTUNTU2V0W2pdJmJpdG1hc2spKQotCQkJCQkJCXsKLQkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gaWk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoaWk9PTApCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCi0KLQkJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykKLQkJCQkJCXsKLQotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJAQEAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9ICVkXG4iLAotCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKSk7Ci0JCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID09IDMyKQotCQkJCQkJCXsKLQkJCQkJCQkJLy8gRml4IE1DUyBhcyBIVCBEdXBsaWNhdGVkIE1vZGUKLQkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSAxOwotCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKLQkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7Ci0JCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAwOwotCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSAzMjsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAocEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID4gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUykKLQkJCQkJCQl7Ci0JCQkJCQkJCS8vIFNUQSBzdXBwb3J0cyBmaXhlZCBNQ1MKLQkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykpOwotCQkJCQkJcEVudHJ5LT5NcGR1RGVuc2l0eSA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7Ci0JCQkJCQlwRW50cnktPk1heFJBbXBkdUZhY3RvciA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yOwotCQkJCQkJcEVudHJ5LT5NbXBzTW9kZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QczsKLQkJCQkJCXBFbnRyeS0+QU1zZHVTaXplID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplOwotCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7Ci0KLQkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKLQkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7Ci0JCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCi0JCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOwotCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDKQotCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7Ci0JCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMpCi0JCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKLQkJCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMpCi0JCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0hUQ19DQVBBQkxFKTsKLQkJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnICYmIEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkKLQkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpOwotCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uTUNTRmVlZGJhY2sgPT0gMHgwMykKLQkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfTUNTRkVFREJBQ0tfQ0FQQUJMRSk7Ci0KLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLQkJCQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOwotCQkJCQlwRW50cnktPkN1cnJUeFJhdGUgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7Ci0JCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7Ci0KLQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IFRSVUUpCi0JCQkJCXsKLQkJCQkJCVBVQ0hBUiBwVGFibGU7Ci0JCQkJCQlVQ0hBUiBUYWJsZVNpemUgPSAwOwotCi0JCQkJCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZwRW50cnktPkN1cnJUeFJhdGVJbmRleCk7Ci0JCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKLQkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7Ci0JCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7Ci0KLQkJCQkJCVJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUsIHBFbnRyeSk7Ci0JCQkJCX0KLQkJCQkJcEVudHJ5LT5SYXRlTGVuID0gU3VwcG9ydGVkUmF0ZXNMZW47Ci0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVN0YXR1c0NvZGUgPSBNTE1FX1NVQ0NFU1M7Ci0KLQkJLy8gY2FuIG5vdCBmaW5kIGluIHRhYmxlLCBjcmVhdGUgYSBuZXcgb25lCi0JCWlmIChpIDwgMCkKLQkJewotCQkJU3RhdHVzQ29kZSA9IE1MTUVfUU9TX1VOU1BFQ0lGWTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIERMU0VudHJ5IHRhYmxlIGZ1bGwob25seSBjYW4gc3VwcG9ydCAlZCBETFMgc2Vzc2lvbikgXG4iLCBNQVhfTlVNX09GX0RMU19FTlRSWSAtIE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlkpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIHVzZSBlbnRyeSglZCkgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQkJaSwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOwotCQl9Ci0JfQotCi0JQWN0SGVhZGVySW5pdChwQWQsICZEbHNSc3BIZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0KLQkvLyBCdWlsZCBiYXNpYyBmcmFtZSBmaXJzdAotCWlmIChTdGF0dXNDb2RlID09IE1MTUVfU1VDQ0VTUykKLQl7Ci0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKLQkJCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNSc3BIZHIsCi0JCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCi0JCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAotCQkJCQkJMiwJCQkJCQkJJlN0YXR1c0NvZGUsCi0JCQkJCQk2LAkJCQkJCQlTQSwKLQkJCQkJCTYsCQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MsCi0JCQkJCQkyLAkJCQkJCQkmcEFkLT5TdGFBY3RpdmUuQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkxLAkJCQkJCQkmU3VwUmF0ZUllLAotCQkJCQkJMSwJCQkJCQkJJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAotCQkJCQkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCXBBZC0+TWxtZUF1eC5TdXBSYXRlLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCi0JCWlmIChwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiAhPSAwKQotCQl7Ci0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCi0JCQkJCQkJICAxLAkJCQkJCSZFeHRSYXRlSWUsCi0JCQkJCQkJICAxLAkJCQkJCSZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwKLQkJCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAlwQWQtPk1sbWVBdXguRXh0UmF0ZSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCUZyYW1lTGVuICs9IHRtcDsKLQkJfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKLQkJewotCQkJVUNIQVIgSHRMZW47Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eVRtcDsKLSNlbmRpZgotCi0JCQkvLyBhZGQgSFQgQ2FwYWJpbGl0eSBJRQotCQkJSHRMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7Ci0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKLQkJCQkJCQkJMSwJCQkJCQkmSHRDYXBJZSwKLQkJCQkJCQkJMSwJCQkJCQkmSHRMZW4sCi0JCQkJCQkJCUh0TGVuLAkJCQkJJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJRU5EX09GX0FSR1MpOwotI2Vsc2UKLQkJCU5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIEh0TGVuKTsKLQkJCQkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7Ci0JCQkJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOwotCi0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCi0JCQkJCQkJCTEsCQkJCQkJJkh0Q2FwSWUsCi0JCQkJCQkJCTEsCQkJCQkJJkh0TGVuLAotCQkJCQkJCQlIdExlbiwJCQkJCSZIdENhcGFiaWxpdHlUbXAsCi0JCQkJCQkJCUVORF9PRl9BUkdTKTsKLSNlbmRpZgotCQkJRnJhbWVMZW4gPSBGcmFtZUxlbiArIHRtcDsKLQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCWlmIChwRExTICYmIChwRExTLT5TdGF0dXMgIT0gRExTX0ZJTklTSCkpCi0JCXsKLQkJCVJUTVBDYW5jZWxUaW1lcigmcERMUy0+VGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0JCQlUaW1lb3V0ID0gRExTX1RJTUVPVVQ7Ci0JCQlSVE1QU2V0VGltZXIoJnBETFMtPlRpbWVyLCBUaW1lb3V0KTsKLQkJfQotCX0KLQllbHNlCi0JewotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCi0JCQkJCQlzaXplb2YoSEVBREVSXzgwMl8xMSksCQkmRGxzUnNwSGRyLAotCQkJCQkJMSwJCQkJCQkJJkNhdGVnb3J5LAotCQkJCQkJMSwJCQkJCQkJJkFjdGlvbiwKLQkJCQkJCTIsCQkJCQkJCSZTdGF0dXNDb2RlLAotCQkJCQkJNiwJCQkJCQkJU0EsCi0JCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCX0KLQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFBlZXJEbHNSc3BBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVAkJQ2FwYWJpbGl0eUluZm87Ci0JVUNIQVIJCURBW01BQ19BRERSX0xFTl0sIFNBW01BQ19BRERSX0xFTl07Ci0JVVNIT1JUCQlTdGF0dXNDb2RlOwotCVNIT1JUCQlpOwotCUJPT0xFQU4JCVRpbWVyQ2FuY2VsbGVkOwotCVVDSEFSCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gMDsKLSAgICBVQ0hBUgkJU3VwcG9ydGVkUmF0ZXNMZW47Ci0gICAgVUNIQVIJCVN1cHBvcnRlZFJhdGVzW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUgkJSHRDYXBhYmlsaXR5TGVuOwotCUhUX0NBUEFCSUxJVFlfSUUJSHRDYXBhYmlsaXR5OwotCi0JaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKLQkJcmV0dXJuOwotCi0JaWYgKCFJTkZSQV9PTihwQWQpKQotCQlyZXR1cm47Ci0KLQlpZiAoIVBlZXJEbHNSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgREEsIFNBLCAmQ2FwYWJpbGl0eUluZm8sICZTdGF0dXNDb2RlLAotCQkJCQkJCSZTdXBwb3J0ZWRSYXRlc0xlbiwgJlN1cHBvcnRlZFJhdGVzWzBdLCAmSHRDYXBhYmlsaXR5TGVuLCAmSHRDYXBhYmlsaXR5KSkKLQkJcmV0dXJuOwotCi0gICAgLy8gc3VwcG9ydGVkIHJhdGVzIGFycmF5IG1heSBub3QgYmUgc29ydGVkLiBzb3J0IGl0IGFuZCBmaW5kIHRoZSBtYXhpbXVtIHJhdGUKLSAgICBmb3IgKGk9MDsgaTxTdXBwb3J0ZWRSYXRlc0xlbjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoU3VwcG9ydGVkUmF0ZXNbaV0gJiAweDdmKSkKLSAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBTdXBwb3J0ZWRSYXRlc1tpXSAmIDB4N2Y7Ci0gICAgfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uKCkgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCB3aXRoIFN0YXR1c0NvZGU9JWQsIENhcGFiaWxpdHlJbmZvPTB4JXhcbiIsCi0JCVNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0sIFN0YXR1c0NvZGUsIENhcGFiaWxpdHlJbmZvKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJewotCQkJaWYgKFN0YXR1c0NvZGUgPT0gTUxNRV9TVUNDRVNTKQotCQkJewotCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCQkJCVVDSEFSIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOwotCi0JCQkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnREbHNFbnRyeShwQWQsIFNBLCBpKTsKLQotCQkJCXN3aXRjaCAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcykKLQkJCQl7Ci0JCQkJCWNhc2UgMTA4OiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81NDsgICBicmVhazsKLQkJCQkJY2FzZSA5NjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzQ4OyAgIGJyZWFrOwotCQkJCQljYXNlIDcyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMzY7ICAgYnJlYWs7Ci0JCQkJCWNhc2UgNDg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yNDsgICBicmVhazsKLQkJCQkJY2FzZSAzNjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE4OyAgIGJyZWFrOwotCQkJCQljYXNlIDI0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTI7ICAgYnJlYWs7Ci0JCQkJCWNhc2UgMTg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV85OyAgICBicmVhazsKLQkJCQkJY2FzZSAxMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzY7ICAgIGJyZWFrOwotCQkJCQljYXNlIDIyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7Ci0JCQkJCWNhc2UgMTE6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81XzU7ICBicmVhazsKLQkJCQkJY2FzZSA0OiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI7ICAgIGJyZWFrOwotCQkJCQljYXNlIDI6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTsgICAgYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKLQkJCQl9Ci0KLQkJCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBtaW4ocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlLCBNYXhTdXBwb3J0ZWRSYXRlKTsKLQotCQkJCWlmIChwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkKLQkJCQl7Ci0JCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwotCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKLQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07Ci0JCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07Ci0JCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07Ci0JCQkJfQotCi0JCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKLQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMDsKLQkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAwOwotCi0JCQkJLy8gSWYgdGhpcyBFbnRyeSBzdXBwb3J0cyA4MDIuMTFuLCB1cGdyYWRlIHRvIEhUIHJhdGUuCi0JCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCi0JCQkJewotCQkJCQlVQ0hBUglqLCBiaXRtYXNrOyAvL2ssYml0bWFzazsKLQkJCQkJQ0hBUiAgICBpaTsKLQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBSZWNlaXZlIFBlZXIgSFQgQ2FwYWJsZSBTVEEgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCQkJCQkJU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOwotCi0JCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCi0JCQkJCXsKLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOwotCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb25Ob25HRiA9IFRSVUU7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSAxOwotCQkJCQl9Ci0KLQkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpKQotCQkJCQl7Ci0JCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVz0gQldfNDA7Ci0JCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7Ci0JCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApKTsKLQkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uMjBPbmx5ID0gVFJVRTsKLQkJCQkJfQotCi0JCQkJCS8vIGZpbmQgbWF4IGZpeGVkIHJhdGUKLQkJCQkJZm9yIChpaT0xNTsgaWk+PTA7IGlpLS0pCi0JCQkJCXsKLQkJCQkJCWogPSBpaS84OwotCQkJCQkJYml0bWFzayA9ICgxPDwoaWktKGoqOCkpKTsKLQkJCQkJCWlmICggKHBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0W2pdJmJpdG1hc2spICYmIChIdENhcGFiaWxpdHkuTUNTU2V0W2pdJmJpdG1hc2spKQotCQkJCQkJewotCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IGlpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJaWYgKGlpPT0wKQotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKQotCQkJCQl7Ci0JCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPT0gMzIpCi0JCQkJCQl7Ci0JCQkJCQkJLy8gRml4IE1DUyBhcyBIVCBEdXBsaWNhdGVkIE1vZGUKLQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IDE7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gMzI7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPiBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKQotCQkJCQkJewotCQkJCQkJCS8vIFNUQSBzdXBwb3J0cyBmaXhlZCBNQ1MKLQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyAmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSk7Ci0JCQkJCXBFbnRyeS0+TXBkdURlbnNpdHkgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5OwotCQkJCQlwRW50cnktPk1heFJBbXBkdUZhY3RvciA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yOwotCQkJCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzOwotCQkJCQlwRW50cnktPkFNc2R1U2l6ZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZTsKLQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7Ci0KLQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKQotCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOwotCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCi0JCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7Ci0JCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQykKLQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7Ci0JCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQykKLQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7Ci0JCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMpCi0JCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUpOwotCQkJCQlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCi0JCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpOwotCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9PSAweDAzKQotCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUpOwotCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLQkJCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7Ci0JCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwotCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7Ci0KLQkJCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkKLQkJCQl7Ci0JCQkJCVBVQ0hBUiBwVGFibGU7Ci0JCQkJCVVDSEFSIFRhYmxlU2l6ZSA9IDA7Ci0KLQkJCQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgpOwotCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOwotCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOwotCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7Ci0KLQkJCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKLQkJCQl9Ci0JCQkJcEVudHJ5LT5SYXRlTGVuID0gU3VwcG9ydGVkUmF0ZXNMZW47Ci0KLQkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQkJCXsKLQkJCQkJLy8gSWYgc3VwcG9ydCBXUEEgb3IgV1BBMiwgc3RhcnQgU1RBS2V5IGhhbmQgc2hha2UsCi0JCQkJCS8vIElmIGZhaWxlZCBoYW5kIHNoYWtlLCBqdXN0IHRlYXIgZG93biBwZWVyIERMUwotCQkJCQlpZiAoUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCQkJewotCQkJCQkJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOwotCQkJCQkJVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfQ0lQSEVSX05PVF9TVVBQT1JUOwotCi0JCQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7Ci0JCQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKLQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOwotCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBmYWlsZWQgd2hlbiBjYWxsIFJUTVBTZW5kU1RBS2V5UmVxdWVzdCBcbiIpKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19XQUlUX0tFWTsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gd2FpdGluZyBmb3IgU1RBS2V5IGhhbmRzaGFrZSBwcm9jZWR1cmVcbiIpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfRklOSVNIOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFN1Y2NlZWQgd2l0aCBXRVAgb3Igbm8gc2VjdXJpdHlcbiIsIFNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKLQkJCQl9Ci0KLQkJCQkvL2luaXRpYWxpemUgc2VxIG5vIGZvciBETFMgZnJhbWVzLgotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlNlcXVlbmNlID0gMDsKLQkJCQlpZiAoSHRDYXBhYmlsaXR5TGVuICE9IDApCi0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IFRSVUU7Ci0JCQkJZWxzZQotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBGQUxTRTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBETFMgc2V0dXAgcHJvY2VkdXJlIGZhaWxlZC4KLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIGZhaWxlZCB3aXRoIFN0YXR1c0NvZGU9JWQgXG4iLCBTdGF0dXNDb2RlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoaSA+PSBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uKCkgdXBkYXRlIHRpbWVvdXQgdmFsdWUgXG4iKSk7Ci0JCWZvciAoaT0oTUFYX05VTV9PRl9ETFNfRU5UUlktMSk7IGk+PU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGktLSkKLQkJewotCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJCXsKLQkJCQlpZiAoU3RhdHVzQ29kZSA9PSBNTE1FX1NVQ0NFU1MpCi0JCQkJewotCQkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQkJCQkJVUNIQVIgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7Ci0KLQkJCQkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnREbHNFbnRyeShwQWQsIFNBLCBpKTsKLQotCQkJCQlzd2l0Y2ggKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMpCi0JCQkJCXsKLQkJCQkJCWNhc2UgMTA4OiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81NDsgICBicmVhazsKLQkJCQkJCWNhc2UgOTY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV80ODsgICBicmVhazsKLQkJCQkJCWNhc2UgNzI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8zNjsgICBicmVhazsKLQkJCQkJCWNhc2UgNDg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yNDsgICBicmVhazsKLQkJCQkJCWNhc2UgMzY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xODsgICBicmVhazsKLQkJCQkJCWNhc2UgMjQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMjsgICBicmVhazsKLQkJCQkJCWNhc2UgMTg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV85OyAgICBicmVhazsKLQkJCQkJCWNhc2UgMTI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV82OyAgICBicmVhazsKLQkJCQkJCWNhc2UgMjI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKLQkJCQkJCWNhc2UgMTE6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81XzU7ICBicmVhazsKLQkJCQkJCWNhc2UgNDogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yOyAgICBicmVhazsKLQkJCQkJCWNhc2UgMjogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xOyAgICBicmVhazsKLQkJCQkJCWRlZmF1bHQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKLQkJCQkJfQotCi0JCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IG1pbihwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUsIE1heFN1cHBvcnRlZFJhdGUpOwotCi0JCQkJCWlmIChwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkKLQkJCQkJewotCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwotCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwotCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07Ci0JCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKLQkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOwotCQkJCQl9Ci0KLQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKLQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAwOwotCQkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAwOwotCi0JCQkJCS8vIElmIHRoaXMgRW50cnkgc3VwcG9ydHMgODAyLjExbiwgdXBncmFkZSB0byBIVCByYXRlLgotCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKLQkJCQkJewotCQkJCQkJVUNIQVIJaiwgYml0bWFzazsgLy9rLGJpdG1hc2s7Ci0JCQkJCQlDSEFSICAgIGlpOwotCi0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIFJlY2VpdmUgUGVlciBIVCBDYXBhYmxlIFNUQSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJCQkJCQkJU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOwotCi0JCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQotCQkJCQkJewotCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKLQkJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk5vbkdGID0gVFJVRTsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSAxOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCkpCi0JCQkJCQl7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlc9IEJXXzQwOwotCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKSk7Ci0JCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb24yME9ubHkgPSBUUlVFOwotCQkJCQkJfQotCi0JCQkJCQkvLyBmaW5kIG1heCBmaXhlZCByYXRlCi0JCQkJCQlmb3IgKGlpPTE1OyBpaT49MDsgaWktLSkKLQkJCQkJCXsKLQkJCQkJCQlqID0gaWkvODsKLQkJCQkJCQliaXRtYXNrID0gKDE8PChpaS0oaio4KSkpOwotCQkJCQkJCWlmICggKHBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0W2pdJmJpdG1hc2spICYmIChIdENhcGFiaWxpdHkuTUNTU2V0W2pdJmJpdG1hc2spKQotCQkJCQkJCXsKLQkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gaWk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoaWk9PTApCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCi0JCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pCi0JCQkJCQl7Ci0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIkBAQCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gJWRcbiIsCi0JCQkJCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpKTsKLQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPT0gMzIpCi0JCQkJCQkJewotCQkJCQkJCQkvLyBGaXggTUNTIGFzIEhUIER1cGxpY2F0ZWQgTW9kZQotCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IDE7Ci0JCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOwotCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKLQkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7Ci0JCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IDMyOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPiBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKQotCQkJCQkJCXsKLQkJCQkJCQkJLy8gU1RBIHN1cHBvcnRzIGZpeGVkIE1DUwotCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyAmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSk7Ci0JCQkJCQlwRW50cnktPk1wZHVEZW5zaXR5ID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKLQkJCQkJCXBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3I7Ci0JCQkJCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzOwotCQkJCQkJcEVudHJ5LT5BTXNkdVNpemUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemU7Ci0JCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKLQotCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKQotCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKTsKLQkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkKLQkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7Ci0JCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMpCi0JCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFKTsKLQkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQykKLQkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUpOwotCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQykKLQkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUpOwotCQkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQotCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7Ci0JCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9PSAweDAzKQotCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFKTsKLQotCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+SFRDYXBhYmlsaXR5LCAmSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOwotCQkJCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7Ci0JCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKLQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKLQotCQkJCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkKLQkJCQkJewotCQkJCQkJUFVDSEFSIHBUYWJsZTsKLQkJCQkJCVVDSEFSIFRhYmxlU2l6ZSA9IDA7Ci0KLQkJCQkJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKLQkJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOwotCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKLQotCQkJCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKLQkJCQkJfQotCQkJCQlwRW50cnktPlJhdGVMZW4gPSBTdXBwb3J0ZWRSYXRlc0xlbjsKLQotCQkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQkJCQl7Ci0JCQkJCQkvLyBJZiBzdXBwb3J0IFdQQSBvciBXUEEyLCBzdGFydCBTVEFLZXkgaGFuZCBzaGFrZSwKLQkJCQkJCS8vIElmIGZhaWxlZCBoYW5kIHNoYWtlLCBqdXN0IHRlYXIgZG93biBwZWVyIERMUwotCQkJCQkJaWYgKFJUTVBTZW5kU1RBS2V5UmVxdWVzdChwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQkJCQl7Ci0JCQkJCQkJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOwotCQkJCQkJCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fUU9TX0NJUEhFUl9OT1RfU1VQUE9SVDsKLQotCQkJCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKLQkJCQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKLQkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKLQkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBmYWlsZWQgd2hlbiBjYWxsIFJUTVBTZW5kU1RBS2V5UmVxdWVzdCBcbiIpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfV0FJVF9LRVk7Ci0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSB3YWl0aW5nIGZvciBTVEFLZXkgaGFuZHNoYWtlIHByb2NlZHVyZVxuIikpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFN1Y2NlZWQgd2l0aCBXRVAgb3Igbm8gc2VjdXJpdHlcbiIsIFNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKLQkJCQkJfQotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TZXF1ZW5jZSA9IDA7Ci0JCQkJCWlmIChIdENhcGFiaWxpdHlMZW4gIT0gMCkKLQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IFRSVUU7Ci0JCQkJCWVsc2UKLQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IEZBTFNFOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyBETFMgc2V0dXAgcHJvY2VkdXJlIGZhaWxlZC4KLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7Ci0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7Ci0JCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBmYWlsZWQgd2l0aCBTdGF0dXNDb2RlPSVkIFxuIiwgU3RhdHVzQ29kZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE1sbWVEbHNUZWFyRG93bkFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMJCU5TdGF0dXM7Ci0JVUxPTkcJCQlGcmFtZUxlbiA9IDA7Ci0JVUNIQVIJCQlDYXRlZ29yeSA9IENBVEVHT1JZX0RMUzsKLQlVQ0hBUgkJCUFjdGlvbiA9IEFDVElPTl9ETFNfVEVBUkRPV047Ci0JVVNIT1JUCQkJUmVhc29uQ29kZSA9IFJFQVNPTl9RT1NfVU5TUEVDSUZZOwotCUhFQURFUl84MDJfMTEJRGxzVGVhckRvd25IZHI7Ci0JUFJUXzgwMl8xMV9ETFMJcERMUzsKLQlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7Ci0JVUNIQVIJCQlpOwotCi0JaWYoIU1sbWVEbHNSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJnBETFMsICZSZWFzb25Db2RlKSkKLQkJcmV0dXJuOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBNbG1lRGxzVGVhckRvd25BY3Rpb24oKSB3aXRoIFJlYXNvbkNvZGU9JWQgXG4iLCBSZWFzb25Db2RlKSk7Ci0KLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIE1sbWVEbHNUZWFyRG93bkFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlBY3RIZWFkZXJJbml0KHBBZCwgJkRsc1RlYXJEb3duSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCi0JLy8gQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QKLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCi0JCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNUZWFyRG93bkhkciwKLQkJCQkJMSwJCQkJCQkJJkNhdGVnb3J5LAotCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAotCQkJCQk2LAkJCQkJCQkmcERMUy0+TWFjQWRkciwKLQkJCQkJNiwJCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcywKLQkJCQkJMiwJCQkJCQkJJlJlYXNvbkNvZGUsCi0JCQkJCUVORF9PRl9BUkdTKTsKLQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQlSVE1QQ2FuY2VsVGltZXIoJnBETFMtPlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCi0JLy8gUmVtb3ZlIGtleSBpbiBsb2NhbCBkbHMgdGFibGUgZW50cnkKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQotCXsKLQkJaWYgKE1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQotCQl7Ci0JCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKLQkJfQotCX0KLQotCS8vIGNsZWFyIHBlZXIgZGxzIHRhYmxlIGVudHJ5Ci0JZm9yIChpID0gTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSA8IE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCi0JewotCQlpZiAoTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCi0JCXsKLQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOwotCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0JCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKLQkJfQotCX0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFBlZXJEbHNUZWFyRG93bkFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVUNIQVIJCQlEQVtNQUNfQUREUl9MRU5dLCBTQVtNQUNfQUREUl9MRU5dOwotCVVTSE9SVAkJCVJlYXNvbkNvZGU7Ci0JVUlOVAkJCWk7Ci0JQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOwotCi0JaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKLQkJcmV0dXJuOwotCi0JaWYgKCFJTkZSQV9PTihwQWQpKQotCQlyZXR1cm47Ci0KLQlpZiAoIVBlZXJEbHNUZWFyRG93blNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBEQSwgU0EsICZSZWFzb25Db2RlKSkKLQkJcmV0dXJuOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzVGVhckRvd25BY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IHdpdGggUmVhc29uQ29kZT0lZFxuIiwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSwgUmVhc29uQ29kZSkpOwotCi0JLy8gY2xlYXIgbG9jYWwgZGxzIHRhYmxlIGVudHJ5Ci0JZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJewotCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7Ci0JCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQkJCS8vQXNpY0RlbFdjaWRUYWIocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQpOwotCQkJLy9Bc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsIEJTUzAsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCk7Ci0JCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKLQkJfQotCX0KLQotCS8vIGNsZWFyIHBlZXIgZGxzIHRhYmxlIGVudHJ5Ci0JZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKLQl7Ci0JCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChTQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCi0JCXsKLQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOwotCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0JCQkvL0FzaWNEZWxXY2lkVGFiKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lEKTsKLQkJCS8vQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBCU1MwLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQpOwotCQkJTWFjVGFibGVEZWxldGVEbHNFbnRyeShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBSVE1QQ2hlY2tETFNUaW1lT3V0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVMT05HCQkJCWk7Ci0JTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOwotCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1VOU1BFQ0lGWTsKLQotCWlmICghIHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQotCQlyZXR1cm47Ci0KLQlpZiAoISBJTkZSQV9PTihwQWQpKQotCQlyZXR1cm47Ci0KLQkvLyBJZiB0aW1lb3V0IHZhbHVlIGlzIGVxdWFsZWQgdG8gemVybywgaXQgbWVhbnMgYWx3YXlzIG5vdCBiZSB0aW1lb3V0LgotCi0JLy8gdXBkYXRlIGxvY2FsIGRscyB0YWJsZSBlbnRyeQotCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKLQl7Ci0JCWlmICgocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQpICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKLQkJCSYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0ICE9IDApKQotCQl7Ci0JCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciAtLTsKLQotCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID09IDApCi0JCQl7Ci0JCQkJcmVhc29uID0gUkVBU09OX1FPU19SRVFVRVNUX1RJTUVPVVQ7Ci0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKLQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7Ci0JCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyB1cGRhdGUgcGVlciBkbHMgdGFibGUgZW50cnkKLQlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQotCXsKLQkJaWYgKChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQotCQkJJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgIT0gMCkpCi0JCXsKLQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyIC0tOwotCi0JCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPT0gMCkKLQkJCXsKLQkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1JFUVVFU1RfVElNRU9VVDsKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOwotCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKLQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIFJUTVBSY3ZGcmFtZURMU0NoZWNrKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFBIRUFERVJfODAyXzExCXBIZWFkZXIsCi0JSU4gVUxPTkcJCQlMZW4sCi0JSU4gUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCkKLXsKLQlVTE9ORwkJCWk7Ci0JQk9PTEVBTgkJCWJGaW5kRW50cnkgPSBGQUxTRTsKLQlCT09MRUFOCQkJYlNUQUtleUZyYW1lID0gRkFMU0U7Ci0JUEVBUE9MX1BBQ0tFVAlwRWFwOwotCVBVQ0hBUgkJCXBQcm90bywgcEFkZHIgPSBOVUxMOwotCVBVQ0hBUgkJCXBTVEFLZXkgPSBOVUxMOwotCVVDSEFSCQkJWmVyb1JlcGxheVtMRU5fS0VZX0RFU0NfUkVQTEFZXTsKLQlVQ0hBUgkJCU1pY1sxNl0sIE9sZE1pY1sxNl07Ci0JVUNIQVIJCQlkaWdlc3RbODBdOwotCVVDSEFSCQkJRGxzUFRLWzgwXTsKLQlVQ0hBUgkJCXRlbXBbNjRdOwotCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKLQlDSVBIRVJfS0VZCQlQYWlyd2lzZUtleTsKLQotCi0JaWYgKCEgcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCi0JCXJldHVybiBiU1RBS2V5RnJhbWU7Ci0KLQlpZiAoISBJTkZSQV9PTihwQWQpKQotCQlyZXR1cm4gYlNUQUtleUZyYW1lOwotCi0JaWYgKExlbiA8IExFTkdUSF84MDJfMTEgKyA2ICsgMikgLyogTEVOR1RIXzgwMl8xMSArIExMQyArIEVBUE9MIHByb3RvY29sIHR5cGUgKi8KLQkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKLQotCXBQcm90bwk9IChQVUNIQVIpcEhlYWRlciArIExFTkdUSF84MDJfMTE7Ci0KLQlpZiAoKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KSkKLQkJcFByb3RvCSs9IDI7CS8qIFFPUyBDb250cm9sIGZpZWxkICovCi0KLSAgICAgLyogU2tpcCA0LWJ5dGVzIGZvciBIVEMgKi8KLSAgICAgaWYgKHBIZWFkZXItPkZDLk9yZGVyICYmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpKSkKLSAgICAgewotICAgICAgICAgIHBQcm90byArPSA0OwotICAgICB9Ci0KLQkvKiBMMlBBRCBiaXQgb24gd2lsbCBwYWQgMiBieXRlcyBhdCBMTEMgKi8KLQlpZiAocFJ4RC0+TDJQQUQpCi0JewotCQlwUHJvdG8gKz0gMjsKLQl9Ci0KLQlwUHJvdG8JKz0gNjsJLyogMHhBQSAweEFBIDB4QUEgMHgwMCAweDAwIDB4MDAgKi8KLQotCWlmICgoIShwSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkpICYmICghUlRNUEVxdWFsTWVtb3J5KEVBUE9MLCBwUHJvdG8sIDIpKSkKLQkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKLQotCXBBZGRyCT0gcEhlYWRlci0+QWRkcjI7Ci0KLQlpZiAoUlRNUEVxdWFsTWVtb3J5KEVBUE9MLCBwUHJvdG8sIDIpICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSAgTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKLQl7Ci0JCXBFYXAgPSAoUEVBUE9MX1BBQ0tFVCkgKHBQcm90byArIDIpOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gU25pZmYgTGVuPSVsZCwgRGF0YUxlbj0lZCwgS2V5TWljPSVkLCBJbnN0YWxsPSVkLCBLZXlBY2s9JWQsIFNlY3VyZT0lZCwgRUtEX0RMPSVkLCBFcnJvcj0lZCwgUmVxdWVzdD0lZFxuIiwgTGVuLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMRU5HVEhfODAyXzExICsgNiArIDIgKyAyICsgc2l6ZW9mKEVBUE9MX1BBQ0tFVCkgLSBNQVhfTEVOX09GX1JTTklFICsgMTYpLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5LZXlNaWMsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkluc3RhbGwsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLktleUFjaywKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uU2VjdXJlLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5FS0RfREwsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkVycm9yLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5SZXF1ZXN0KSk7Ci0KLQkJaWYgKChMZW4gPj0gKExFTkdUSF84MDJfMTEgKyA2ICsgMiArIDIgKyBzaXplb2YoRUFQT0xfUEFDS0VUKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyAxNikpICYmIHBFYXAtPktleURlc2MuS2V5SW5mby5LZXlNaWMKLQkJCSYmIHBFYXAtPktleURlc2MuS2V5SW5mby5JbnN0YWxsICYmIHBFYXAtPktleURlc2MuS2V5SW5mby5LZXlBY2sgJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLlNlY3VyZQotCQkJJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkVLRF9ETCAmJiAhcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkVycm9yICYmICFwRWFwLT5LZXlEZXNjLktleUluZm8uUmVxdWVzdCkKLQkJewotCQkJLy8gRmlyc3QgdmFsaWRhdGUgcmVwbGF5IGNvdW50ZXIsIG9ubHkgYWNjZXB0IG1lc3NhZ2Ugd2l0aCBsYXJnZXIgcmVwbGF5IGNvdW50ZXIKLQkJCS8vIExldCBlcXVhbCBwYXNzLCBzb21lIEFQIHN0YXJ0IHdpdGggYWxsIHplcm8gcmVwbGF5IGNvdW50ZXIKLQkJCU5kaXNaZXJvTWVtb3J5KFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCQkJaWYgKChSVE1QQ29tcGFyZU1lbW9yeShwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpICYmCi0JCQkJKFJUTVBDb21wYXJlTWVtb3J5KHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMCkpCi0JCQkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKLQotCQkJLy9SVE1QTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCQkJUlRNUE1vdmVNZW1vcnkocEFkLT5TdGFDZmcuRGxzUmVwbGF5Q291bnRlciwgcEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gU25pZmYgcmVwbGF5IGNvdW50ZXIgKCUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeCkgTGVuPSVsZCwgS2V5RGF0YUxlbj0lZFxuIiwKLQkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzBdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzFdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzJdLAotCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbM10sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNF0sCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNV0sCi0JCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls2XSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls3XSwgTGVuLCBwRWFwLT5LZXlEZXNjLktleURhdGFbMV0pKTsKLQotCQkJLy8gcHV0IHRoZXNlIGNvZGUgc2VnbWVudCB0byBnZXQgdGhlIHJlcGxheSBjb3VudGVyCi0JCQlpZiAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKQotCQkJCXJldHVybiBiU1RBS2V5RnJhbWU7Ci0KLQkJCS8vIENoZWNrIE1JQyB2YWx1ZQotCQkJLy8gU2F2ZSB0aGUgTUlDIGFuZCByZXBsYWNlIHdpdGggemVybwotCQkJLy8gdXNlIHByb3ByaWV0YXJ5IFBUSwotCQkJTmRpc1plcm9NZW1vcnkodGVtcCwgNjQpOwotCQkJTmRpc01vdmVNZW1vcnkodGVtcCwgIklFRUU4MDIuMTEgV0lSRUxFU1MgQUNDRVNTIFBPSU5UIiwgMzIpOwotCQkJV3BhRGVyaXZlUFRLKHBBZCwgdGVtcCwgdGVtcCwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHRlbXAsIHBBZC0+Q3VycmVudEFkZHJlc3MsIERsc1BUSywgTEVOX1BUSyk7Ci0KLQkJCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcEVhcC0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCQkJTmRpc1plcm9NZW1vcnkocEVhcC0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCQkJewotCQkJCS8vIEFFUwotCQkJCUhNQUNfU0hBMShEbHNQVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUikgcEVhcCwgcEVhcC0+Qm9keV9MZW5bMV0gKyA0LCBkaWdlc3QsIFNIQTFfRElHRVNUX1NJWkUpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KE1pYywJZGlnZXN0LAlMRU5fS0VZX0RFU0NfTUlDKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlITUFDX01ENShEbHNQVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUikgcEVhcCwgcEVhcC0+Qm9keV9MZW5bMV0gKyA0LCBNaWMsIE1ENV9ESUdFU1RfU0laRSk7Ci0JCQl9Ci0KLQkJCWlmICghTmRpc0VxdWFsTWVtb3J5KE9sZE1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNSUMgRGlmZmVyZW50IGluIE1zZzEgb2YgU1RBS2V5IGhhbmRzaGFrZSEgXG4iKSk7Ci0JCQkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNSUMgVkFMSUQgaW4gTXNnMSBvZiBTVEFLZXkgaGFuZHNoYWtlISBcbiIpKTsKLQkJCWlmICgocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzBdID09IDB4REQpICYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbMl0gPT0gMHgwMCkgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVszXSA9PSAweDBDKQotCQkJCSYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbNF0gPT0gMHg0MykgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVs1XSA9PSAweDAyKSkKLQkJCXsKLQkJCQlwQWRkcgkJCT0gcEVhcC0+S2V5RGVzYy5LZXlEYXRhICsgODsJCS8vIFRwZSgxKSwgTGVuKDEpLCBPVUkoMyksIERhdGFUeXBlKDEpLCBSZXNlcnZlZCgyKQotCQkJCXBTVEFLZXkJCQk9IHBFYXAtPktleURlc2MuS2V5RGF0YSArIDE0OwkvLyBUcGUoMSksIExlbigxKSwgT1VJKDMpLCBEYXRhVHlwZSgxKSwgUmVzZXJ2ZWQoMiksIFNUQUtleV9NYWNfQWRkcig2KQotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSZWNlaXZlIFNUQUtleSBNZXNzYWdlLTEgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBMZW49JWxkLCBLZXlEYXRhTGVuPSVkXG4iLAotCQkJCQlwQWRkclswXSwgcEFkZHJbMV0sIHBBZGRyWzJdLCBwQWRkclszXSwgcEFkZHJbNF0sIHBBZGRyWzVdLCBMZW4sIHBFYXAtPktleURlc2MuS2V5RGF0YVsxXSkpOwotCi0JCQkJYlNUQUtleUZyYW1lID0gVFJVRTsKLQkJCX0KLQotCQl9Ci0JCWVsc2UgaWYgKExlbiA+PSAoTEVOR1RIXzgwMl8xMSArIDYgKyAyICsgMiArIHNpemVvZihFQVBPTF9QQUNLRVQpIC0gTUFYX0xFTl9PRl9SU05JRSkpCi0JCXsKLQkJCVJUTVBNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkRsc1JlcGxheUNvdW50ZXIsIHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFNuaWZmIHJlcGxheSBjb3VudGVyIDIoJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4KSBMZW49JWxkLCBLZXlEYXRhTGVuPSVkXG4iLAotCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMF0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMV0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMl0sCi0JCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclszXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls0XSwJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls1XSwKLQkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzZdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzddLCBMZW4sIHBFYXAtPktleURlc2MuS2V5RGF0YVsxXSkpOwotCQl9Ci0JfQotCi0JLy8gSWYgdGltZW91dCB2YWx1ZSBpcyBlcXVhbGVkIHRvIHplcm8sIGl0IG1lYW5zIGFsd2F5cyBub3QgYmUgdGltZW91dC4KLQkvLyB1cGRhdGUgbG9jYWwgZGxzIHRhYmxlIGVudHJ5Ci0JZm9yIChpPSAwOyBpIDwgTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKHBBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJewotCQkJaWYgKGJTVEFLZXlGcmFtZSkKLQkJCXsKLQkJCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeTsKLQotCQkJCS8vIFNUQUtleSBmcmFtZSwgYWRkIHBhaXJ3aXNlIGtleSB0YWJsZQotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7Ci0JCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotCQkJCVBhaXJ3aXNlS2V5LktleUxlbiA9IExFTl9US0lQX0VLOwotCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LktleSwgJnBTVEFLZXlbMF0sIExFTl9US0lQX0VLKTsKLQkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5UeE1pYywgJnBTVEFLZXlbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOwotCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LlJ4TWljLCAmcFNUQUtleVsyNF0sIExFTl9US0lQX1RYTUlDSyk7Ci0KLQkJCQkvL1BhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnOwotCQkJCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0JCQkJCVBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9US0lQOwotCQkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQkJCQkJUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKLQotCQkJCXBFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXAocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLCBUUlVFKTsKLQkJCQkvL0FzaWNBZGRLZXlFbnRyeShwQWQsIChVU0hPUlQpKGkgKyAyKSwgQlNTMCwgMCwgJlBhaXJ3aXNlS2V5LCBUUlVFLCBUUlVFKTsJLy8gcmVzZXJ2ZSAwIGZvciBtdWx0aWNhc3QsIDEgZm9yIHVuaWNhc3QKLQkJCQkvL0FzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIChVU0hPUlQpKGkgKyAyKSwgcEFkZHIpOwotCQkJCS8vIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJCQlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeShwQWQsCi0JCQkJCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkciwKLQkJCQkJCQkJCQkoVUNIQVIpcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELAotCQkJCQkJCQkJCSZQYWlyd2lzZUtleSk7Ci0KLQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLQkJCQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJCQkJICAwLAotCQkJCQkJCQkJCSAgUGFpcndpc2VLZXkuQ2lwaGVyQWxnLAotCQkJCQkJCQkJCSAgcEVudHJ5KTsKLQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LCAmUGFpcndpc2VLZXksIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSZWNlaXZlIFNUQUtleSBNZXNzYWdlLTEgKFBlZXIgU1RBIE1BQyBBZGRyZXNzIFNUQUtleSkgXG4iKSk7Ci0KLQkJCQlSVE1QU2VuZFNUQUtleUhhbmRTaGFrZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBGaW5pc2ggU1RBS2V5IGhhbmRzaGFrZSBwcm9jZWR1cmUgKEluaXRpYXRvciBzaWRlKVxuIikpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIERhdGEgZnJhbWUsIHVwZGF0ZSB0aW1lb3V0IHZhbHVlCi0JCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQotCQkJCXsKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0OwotCQkJCQkvL0FzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIChVU0hPUlQpKGkgKyAyKSwgcEFkZHIpOwotCQkJCX0KLQkJCX0KLQotCQkJYkZpbmRFbnRyeSA9IFRSVUU7Ci0JCX0KLQl9Ci0KLQkvLyB1cGRhdGUgcGVlciBkbHMgdGFibGUgZW50cnkKLQlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKHBBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJewotCQkJaWYgKGJTVEFLZXlGcmFtZSkKLQkJCXsKLQkJCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9IE5VTEw7Ci0KLQkJCQkvLyBTVEFLZXkgZnJhbWUsIGFkZCBwYWlyd2lzZSBrZXkgdGFibGUsIGFuZCBzZW5kIFNUQWtleSBNc2ctMgotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7Ci0JCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotCQkJCVBhaXJ3aXNlS2V5LktleUxlbiA9IExFTl9US0lQX0VLOwotCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LktleSwgJnBTVEFLZXlbMF0sIExFTl9US0lQX0VLKTsKLQkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5UeE1pYywgJnBTVEFLZXlbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOwotCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LlJ4TWljLCAmcFNUQUtleVsyNF0sIExFTl9US0lQX1RYTUlDSyk7Ci0KLQkJCQkvL1BhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnOwotCQkJCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0JCQkJCVBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9US0lQOwotCQkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQkJCQkJUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKLQotCQkJCXBFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXAocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLCBUUlVFKTsKLQkJCQkvL0FzaWNBZGRLZXlFbnRyeShwQWQsIChVU0hPUlQpKGkgKyAyKSwgQlNTMCwgMCwgJlBhaXJ3aXNlS2V5LCBUUlVFLCBUUlVFKTsJLy8gcmVzZXJ2ZSAwIGZvciBtdWx0aWNhc3QsIDEgZm9yIHVuaWNhc3QKLQkJCQkvL0FzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIChVU0hPUlQpKGkgKyAyKSwgcEFkZHIpOwotCQkJCS8vIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkocEFkLAotCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIsCi0JCQkJCQkJCQkJKFVDSEFSKXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwKLQkJCQkJCQkJCQkmUGFpcndpc2VLZXkpOwotCi0JCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCi0JCQkJCQkJCQkJICBCU1MwLAotCQkJCQkJCQkJCSAgMCwKLQkJCQkJCQkJCQkgIFBhaXJ3aXNlS2V5LkNpcGhlckFsZywKLQkJCQkJCQkJCQkgIHBFbnRyeSk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+UGFpcndpc2VLZXksICZQYWlyd2lzZUtleSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJlY2VpdmUgU1RBS2V5IE1lc3NhZ2UtMSAoSW5pdGlhdG9yIFNUQSBNQUMgQWRkcmVzcyBTVEFLZXkpXG4iKSk7Ci0KLQkJCQkvLyBJZiBzdXBwb3J0IFdQQSBvciBXUEEyLCBzdGFydCBTVEFLZXkgaGFuZCBzaGFrZSwKLQkJCQkvLyBJZiBmYWlsZWQgaGFuZCBzaGFrZSwganVzdCB0ZWFyIGRvd24gcGVlciBETFMKLQkJCQlpZiAoUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UocEFkLCBwQWRkcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCQl7Ci0JCQkJCU1MTUVfRExTX1JFUV9TVFJVQ1QJTWxtZURsc1JlcTsKLQkJCQkJVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfQ0lQSEVSX05PVF9TVVBQT1JUOwotCi0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7Ci0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOwotCQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7Ci0JCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIEZpbmlzaCBTVEFLZXkgaGFuZHNoYWtlIHByb2NlZHVyZSAoUGVlciBzaWRlKVxuIikpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBEYXRhIGZyYW1lLCB1cGRhdGUgdGltZW91dCB2YWx1ZQotCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKLQkJCQl7Ci0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWJGaW5kRW50cnkgPSBUUlVFOwotCQl9Ci0JfQotCi0KLQlyZXR1cm4gYlNUQUtleUZyYW1lOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJQ2hlY2sgaWYgdGhlIGZyYW1lIGNhbiBiZSBzZW50IHRocm91Z2ggRExTIGRpcmVjdCBsaW5rIGludGVyZmFjZQotCi0JQXJndW1lbnRzOgotCQlwQWQJCVBvaW50ZXIJdG8gYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlETFMgZW50cnkgaW5kZXgKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJUlRNUENoZWNrRExTRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwREEpCi17Ci0JSU5UIHJ2YWwgPSAtMTsKLQlJTlQJaTsKLQotCWlmICghcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCi0JCXJldHVybiBydmFsOwotCi0JaWYgKCFJTkZSQV9PTihwQWQpKQotCQlyZXR1cm4gcnZhbDsKLQotCWRvewotCQkvLyBjaGVjayBsb2NhbCBkbHMgdGFibGUgZW50cnkKLQkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQotCQl7Ci0JCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSAmJgotCQkJCU1BQ19BRERSX0VRVUFMKHBEQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCi0JCQl7Ci0JCQkJcnZhbCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBwZWVyIGRscyB0YWJsZSBlbnRyeQotCQlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQotCQl7Ci0JCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSAmJgotCQkJCU1BQ19BRERSX0VRVUFMKHBEQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCi0JCQl7Ci0JCQkJcnZhbCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9IHdoaWxlIChGQUxTRSk7Ci0KLQlyZXR1cm4gcnZhbDsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFJUTVBTZW5kRExTVGVhckRvd25GcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEQSkKLXsKLQlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUwkJTlN0YXR1czsKLQlIRUFERVJfODAyXzExCURsc1RlYXJEb3duSGRyOwotCVVMT05HCQkJRnJhbWVMZW4gPSAwOwotCVVTSE9SVAkJCVJlYXNvbiA9IFJFQVNPTl9RT1NfUVNUQV9MRUFWSU5HX1FCU1M7Ci0JVUNIQVIJCQlDYXRlZ29yeSA9IENBVEVHT1JZX0RMUzsKLQlVQ0hBUgkJCUFjdGlvbiA9IEFDVElPTl9ETFNfVEVBUkRPV047Ci0JVUNIQVIJCQlpID0gMDsKLQotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpIHx8Ci0JCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKLQkJcmV0dXJuOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBETFMgVGVhckRvd24gRnJhbWUgXG4iKSk7Ci0KLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFTU09DIC0gUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCUFjdEhlYWRlckluaXQocEFkLCAmRGxzVGVhckRvd25IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAotCQkJCQlzaXplb2YoSEVBREVSXzgwMl8xMSksCQkmRGxzVGVhckRvd25IZHIsCi0JCQkJCTEsCQkJCQkJCSZDYXRlZ29yeSwKLQkJCQkJMSwJCQkJCQkJJkFjdGlvbiwKLQkJCQkJNiwJCQkJCQkJcERBLAotCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAotCQkJCQkyLAkJCQkJCQkmUmVhc29uLAotCQkJCQlFTkRfT0ZfQVJHUyk7Ci0KLQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JLy8gUmVtb3ZlIGtleSBpbiBsb2NhbCBkbHMgdGFibGUgZW50cnkKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKLQkJCSYmIE1BQ19BRERSX0VRVUFMKHBEQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCi0JCXsKLQkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOwotCQl9Ci0JfQotCi0JLy8gUmVtb3ZlIGtleSBpbiBwZWVyIGRscyB0YWJsZSBlbnRyeQotCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCi0JewotCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQotCQkJJiYgTUFDX0FERFJfRVFVQUwocERBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJewotCQkJTWFjVGFibGVEZWxldGVEbHNFbnRyeShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7Ci0JCX0KLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIERMUyBUZWFyRG93biBGcmFtZSBhbmQgcmVtb3ZlIGtleSBpbiAoaT0lZCkgXG4iLCBpKSk7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotTkRJU19TVEFUVVMgUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBEQSkKLXsKLQlVQ0hBUgkJCQlIZWFkZXI4MDJfM1sxNF07Ci0JTkRJU19TVEFUVVMJCQlOU3RhdHVzOwotCVVMT05HCQkJCUZyYW1lTGVuID0gMDsKLQlFQVBPTF9QQUNLRVQJCVBhY2tldDsKLQlVQ0hBUgkJCQlNaWNbMTZdOwotCVVDSEFSCQkJCWRpZ2VzdFs4MF07Ci0JUFVDSEFSCQkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCVBORElTX1BBQ0tFVAkJcE5kaXNQYWNrZXQ7Ci0JVUNIQVIJCQkJdGVtcFs2NF07Ci0JVUNIQVIJCQkJRGxzUFRLWzgwXTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KCkgdG8gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIHBEQVswXSwgcERBWzFdLCBwREFbMl0sIHBEQVszXSwgcERBWzRdLCBwREFbNV0pKTsKLQotCXBBZC0+U2VxdWVuY2UgKys7Ci0JTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7Ci0KLQkvLyBaZXJvIG1lc3NhZ2UgYm9keQotCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKLQlQYWNrZXQuUHJvVmVyID0gRUFQT0xfVkVSOwotCVBhY2tldC5Qcm9UeXBlICAgID0gRUFQT0xLZXk7Ci0JUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFICsgNiArIE1BQ19BRERSX0xFTjsJCS8vIGRhdGEgZmllbGQgY29udGFpbiBLREUgYW5kUGVlciBNQUMgYWRkcmVzcwotCi0JLy8gU1RBS2V5IE1lc3NhZ2UgaXMgYXMgRUFQT0wtS2V5KDEsMSwwLDAsRy8wLDAsMCwgTUlDLCAwLFBlZXIgTUFDIEtERSkKLQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCi0gICAgewotICAgICAgICBQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLSAgICB7Ci0gICAgICAgIFBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOwotICAgIH0KLQotCS8vIEtleSBkZXNjcmlwdG9yIHZlcnNpb24KLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPQotCQkoKChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHx8IChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgPyAoREVTQ19UWVBFX0FFUykgOiAoREVTQ19UWVBFX1RLSVApKTsKLQotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljCT0gMTsKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZQk9IDE7Ci0JUGFja2V0LktleURlc2MuS2V5SW5mby5SZXF1ZXN0CT0gMTsKLQotCVBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV0JPSAxMjsKLQotCS8vIHVzZSBvdXIgb3duIE9VSSB0byBkaXN0aW5ndWlzaCBwcm9wcmlldGFyeSB3aXRoIHN0YW5kYXJkLgotCVBhY2tldC5LZXlEZXNjLktleURhdGFbMF0JCT0gMHhERDsKLQlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzFdCQk9IDB4MEE7Ci0JUGFja2V0LktleURlc2MuS2V5RGF0YVsyXQkJPSAweDAwOwotCVBhY2tldC5LZXlEZXNjLktleURhdGFbM10JCT0gMHgwQzsKLQlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzRdCQk9IDB4NDM7Ci0JUGFja2V0LktleURlc2MuS2V5RGF0YVs1XQkJPSAweDAzOwotCU5kaXNNb3ZlTWVtb3J5KCZQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzZdLCBwREEsIE1BQ19BRERSX0xFTik7Ci0KLQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5EbHNSZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLQotCS8vIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwotCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXJldHVybiBOU3RhdHVzOwotCi0JLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCi0JLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAotCQkgICAgICAgICAgICAgIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCi0JCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOwotCi0JLy8gdXNlIHByb3ByaWV0YXJ5IFBUSwotCU5kaXNaZXJvTWVtb3J5KHRlbXAsIDY0KTsKLQlOZGlzTW92ZU1lbW9yeSh0ZW1wLCAiSUVFRTgwMi4xMSBXSVJFTEVTUyBBQ0NFU1MgUE9JTlQiLCAzMik7Ci0JV3BhRGVyaXZlUFRLKHBBZCwgdGVtcCwgdGVtcCwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHRlbXAsIHBBZC0+Q3VycmVudEFkZHJlc3MsIERsc1BUSywgTEVOX1BUSyk7Ci0KLQkvLyBjYWxjdWxhdGUgTUlDCi0JaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsKLQkJLy8gQUVTCi0JCU5kaXNaZXJvTWVtb3J5KGRpZ2VzdCwJc2l6ZW9mKGRpZ2VzdCkpOwotCQlITUFDX1NIQTEoRGxzUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBkaWdlc3QsIFNIQTFfRElHRVNUX1NJWkUpOwotCQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7Ci0JfQotCWVsc2UKLQl7Ci0JCU5kaXNaZXJvTWVtb3J5KE1pYywJc2l6ZW9mKE1pYykpOwotCQlITUFDX01ENShEbHNQVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYywgTUQ1X0RJR0VTVF9TSVpFKTsKLQkJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCX0KLQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0JICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhlYWRlcjgwMl8zKSwJSGVhZGVyODAyXzMsCi0JCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwJJlBhY2tldCwKLQkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0KLQlOU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwTmRpc1BhY2tldCwgTlVMTCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCWlmIChOU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwTmRpc1BhY2tldCwgQlNTSURfV0NJRCk7Ci0JCVNUQVNlbmRQYWNrZXQocEFkLCBwTmRpc1BhY2tldCk7Ci0JCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7Ci0JfQotCi0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZW5kU1RBS2V5UmVxdWVzdC0gU2VuZCBTVEFLZXkgcmVxdWVzdCAoTlN0YXR1cz0leCwgRnJhbWVMZW49JWxkKVxuIiwgTlN0YXR1cywgRnJhbWVMZW4pKTsKLQotCXJldHVybiBOU3RhdHVzOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLU5ESVNfU1RBVFVTIFJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBEQSkKLXsKLQlVQ0hBUgkJCQlIZWFkZXI4MDJfM1sxNF07Ci0JTkRJU19TVEFUVVMJCQlOU3RhdHVzOwotCVVMT05HCQkJCUZyYW1lTGVuID0gMDsKLQlFQVBPTF9QQUNLRVQJCVBhY2tldDsKLQlVQ0hBUgkJCQlNaWNbMTZdOwotCVVDSEFSCQkJCWRpZ2VzdFs4MF07Ci0JUFVDSEFSCQkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCVBORElTX1BBQ0tFVAkJcE5kaXNQYWNrZXQ7Ci0JVUNIQVIJCQkJdGVtcFs2NF07Ci0JVUNIQVIJCQkJRGxzUFRLWzgwXTsJCQkvLyBEdWUgdG8gZGlydmVyIGNhbiBub3QgZ2V0IFBUSywgdXNlIHByb3ByaWV0YXJ5IFBUSwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSVE1QU2VuZFNUQUtleUhhbmRTaGFrZSgpIHRvICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBwREFbMF0sIHBEQVsxXSwgcERBWzJdLCBwREFbM10sIHBEQVs0XSwgcERBWzVdKSk7Ci0KLQlwQWQtPlNlcXVlbmNlICsrOwotCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOwotCi0JLy8gWmVybyBtZXNzYWdlIGJvZHkKLQlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7Ci0JUGFja2V0LlByb1ZlciA9IEVBUE9MX1ZFUjsKLQlQYWNrZXQuUHJvVHlwZSAgICA9IEVBUE9MS2V5OwotCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSArIDYgKyBNQUNfQUREUl9MRU47CQkvLyBkYXRhIGZpZWxkIGNvbnRhaW4gS0RFIGFuZCBQZWVyIE1BQyBhZGRyZXNzCi0KLQkvLyBTVEFLZXkgTWVzc2FnZSBpcyBhcyBFQVBPTC1LZXkoMSwxLDAsMCxHLzAsMCwwLCBNSUMsIDAsUGVlciBNQUMgS0RFKQotCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKLSAgICB7Ci0gICAgICAgIFBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOwotICAgIH0KLSAgICBlbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotICAgIHsKLSAgICAgICAgUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTJfS0VZX0RFU0M7Ci0gICAgfQotCi0JLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbgotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9Ci0JCSgoKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkgfHwgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKSA/IChERVNDX1RZUEVfQUVTKSA6IChERVNDX1RZUEVfVEtJUCkpOwotCi0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMJPSAxOwotCVBhY2tldC5LZXlEZXNjLktleUluZm8uU2VjdXJlCT0gMTsKLQotCVBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV0JPSAxMjsKLQotCS8vIHVzZSBvdXIgb3duIE9VSSB0byBkaXN0aW5ndWlzaCBwcm9wcmlldGFyeSB3aXRoIHN0YW5kYXJkLgotCVBhY2tldC5LZXlEZXNjLktleURhdGFbMF0JCT0gMHhERDsKLQlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzFdCQk9IDB4MEE7Ci0JUGFja2V0LktleURlc2MuS2V5RGF0YVsyXQkJPSAweDAwOwotCVBhY2tldC5LZXlEZXNjLktleURhdGFbM10JCT0gMHgwQzsKLQlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzRdCQk9IDB4NDM7Ci0JUGFja2V0LktleURlc2MuS2V5RGF0YVs1XQkJPSAweDAzOwotCU5kaXNNb3ZlTWVtb3J5KCZQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzZdLCBwREEsIE1BQ19BRERSX0xFTik7Ci0KLQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5EbHNSZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLQotCS8vIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwotCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXJldHVybiBOU3RhdHVzOwotCi0JLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCi0JLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAotCQkgICAgICAgICAgICAgIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCi0JCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOwotCi0JLy8gdXNlIHByb3ByaWV0YXJ5IFBUSwotCU5kaXNaZXJvTWVtb3J5KHRlbXAsIDY0KTsKLQlOZGlzTW92ZU1lbW9yeSh0ZW1wLCAiSUVFRTgwMi4xMSBXSVJFTEVTUyBBQ0NFU1MgUE9JTlQiLCAzMik7Ci0JV3BhRGVyaXZlUFRLKHBBZCwgdGVtcCwgdGVtcCwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHRlbXAsIHBBZC0+Q3VycmVudEFkZHJlc3MsIERsc1BUSywgTEVOX1BUSyk7Ci0KLQkvLyBjYWxjdWxhdGUgTUlDCi0JaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsKLQkJLy8gQUVTCi0JCU5kaXNaZXJvTWVtb3J5KGRpZ2VzdCwJc2l6ZW9mKGRpZ2VzdCkpOwotCQlITUFDX1NIQTEoRGxzUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBkaWdlc3QsIFNIQTFfRElHRVNUX1NJWkUpOwotCQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7Ci0JfQotCWVsc2UKLQl7Ci0JCU5kaXNaZXJvTWVtb3J5KE1pYywJc2l6ZW9mKE1pYykpOwotCQlITUFDX01ENShEbHNQVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYywgTUQ1X0RJR0VTVF9TSVpFKTsKLQkJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCX0KLQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0JICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhlYWRlcjgwMl8zKSwJSGVhZGVyODAyXzMsCi0JCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwJJlBhY2tldCwKLQkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0KLQlOU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwTmRpc1BhY2tldCwgTlVMTCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCWlmIChOU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwTmRpc1BhY2tldCwgQlNTSURfV0NJRCk7Ci0JCVNUQVNlbmRQYWNrZXQocEFkLCBwTmRpc1BhY2tldCk7Ci0JCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7Ci0JfQotCi0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlLSBTZW5kIFNUQUtleSBNZXNzYWdlLTIgKE5TdGF0dXM9JXgsIEZyYW1lTGVuPSVsZClcbiIsIE5TdGF0dXMsIEZyYW1lTGVuKSk7Ci0KLQlyZXR1cm4gTlN0YXR1czsKLX0KLQotVk9JRCBEbHNUaW1lb3V0QWN0aW9uKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLQlNTE1FX0RMU19SRVFfU1RSVUNUCQlNbG1lRGxzUmVxOwotCVVTSE9SVAkJCQkJcmVhc29uOwotCVBSVF84MDJfMTFfRExTCQkJcERMUyA9IChQUlRfODAyXzExX0RMUylGdW5jdGlvbkNvbnRleHQ7Ci0JUFJUTVBfQURBUFRFUgkJCXBBZCA9IHBETFMtPnBBZDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRsc1RpbWVvdXQgLSBUZWFyIGRvd24gRExTIGxpbmtzICglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeClcbiIsCi0JCXBETFMtPk1hY0FkZHJbMF0sIHBETFMtPk1hY0FkZHJbMV0sIHBETFMtPk1hY0FkZHJbMl0sIHBETFMtPk1hY0FkZHJbM10sIHBETFMtPk1hY0FkZHJbNF0sIHBETFMtPk1hY0FkZHJbNV0pKTsKLQotCWlmICgocERMUykgJiYgKHBETFMtPlZhbGlkKSkKLQl7Ci0JCXJlYXNvbgkJCT0gUkVBU09OX1FPU19SRVFVRVNUX1RJTUVPVVQ7Ci0JCXBETFMtPlZhbGlkCQk9IEZBTFNFOwotCQlwRExTLT5TdGF0dXMJPSBETFNfTk9ORTsKLQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgcERMUywgcmVhc29uKTsKLQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7Ci0JCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7Ci0JfQotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRGVzY3JpcHRpb24gOiBiZWNhdXNlIERMUyBhbmQgQ0xJIHNoYXJlIHRoZSBzYW1lIFdDSUQgdGFibGUgaW4gQVNJQy4KLU1lc2ggZW50cnkgYWxzbyBpbnNlcnQgdG8gcEFkLT5NYWNUYWIuY29udGVudFtdLiAgU3VjaCBpcyBtYXJrZWQgYXMgVmFsaWRBc0RscyA9IFRSVUUuCi1BbHNvIGZpbGxzIHRoZSBwYWlyd2lzZSBrZXkuCi1CZWNhdXNlIGZyb250IE1BWF9BSURfQkEgZW50cmllcyBoYXZlIGRpcmVjdCBtYXBwaW5nIHRvIEJBRW50cnksIHdoaWNoIGlzIG9ubHkgdXNlZCBhcyBDTEkuIFNvIHdlIGluc2VydCBEbHMKLWZyb20gaW5kZXggTUFYX0FJRF9CQS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1NQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlSW5zZXJ0RGxzRW50cnkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUglwQWRkciwKLQlJTiAgVUlOVAlEbHNFbnRyeUlkeCkKLXsKLQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9IE5VTEw7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBNYWNUYWJsZUluc2VydERsc0VudHJ5XG4iKSk7Ci0JLy8gaWYgRlVMTCwgcmV0dXJuCi0JaWYgKHBBZC0+TWFjVGFiLlNpemUgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JCXJldHVybiBOVUxMOwotCi0JZG8KLQl7Ci0JCWlmKChwRW50cnkgPSBEbHNFbnRyeVRhYmxlTG9va3VwKHBBZCwgcEFkZHIsIFRSVUUpKSAhPSBOVUxMKQotCQkJYnJlYWs7Ci0KLQkJLy8gYWxsb2NhdGUgb25lIE1BQyBlbnRyeQotCQlwRW50cnkgPSBNYWNUYWJsZUluc2VydEVudHJ5KHBBZCwgcEFkZHIsIERsc0VudHJ5SWR4ICsgTUlOX05FVF9ERVZJQ0VfRk9SX0RMUywgVFJVRSk7Ci0JCWlmIChwRW50cnkpCi0JCXsKLQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W0Rsc0VudHJ5SWR4XS5NYWNUYWJNYXRjaFdDSUQgPSBwRW50cnktPkFpZDsKLQkJCXBFbnRyeS0+TWF0Y2hEbHNFbnRyeUlkeCA9IERsc0VudHJ5SWR4OwotCQkJcEVudHJ5LT5BdXRoTW9kZSA9IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlOwotCQkJcEVudHJ5LT5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7Ci0JCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY1RhYmxlSW5zZXJ0RGxzRW50cnkgLSBhbGxvY2F0ZSBlbnRyeSAjJWQsIFRvdGFsPSAlZFxuIixwRW50cnktPkFpZCwgcEFkLT5NYWNUYWIuU2l6ZSkpOwotCi0JCQkvLyBJZiBsZWdhY3kgV0VQIGlzIHVzZWQsIHNldCBwYWlyLXdpc2UgY2lwaGVyQWxnIGludG8gV0NJRCBhdHRyaWJ1dGUgdGFibGUgZm9yIHRoaXMgZW50cnkKLQkJCWlmICgocEVudHJ5LT5WYWxpZEFzRGxzKSAmJiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSkKLQkJCXsKLQkJCQlVQ0hBUiBLZXlJZHggPSAwOwotCQkJCVVDSEFSIENpcGhlckFsZyA9IDA7Ci0KLQkJCQlLZXlJZHgJPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7Ci0KLQkJCQlDaXBoZXJBbGcJPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzsKLQotCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAotCQkJCQkJCQkJCQlCU1MwLAotCQkJCQkJCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCi0JCQkJCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAotCQkJCQkJCQkJCQlwRW50cnkpOwotCQkJfQotCi0JCQlicmVhazsKLQkJfQotCX0gd2hpbGUoRkFMU0UpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PT0gTWFjVGFibGVJbnNlcnREbHNFbnRyeVxuIikpOwotCi0JcmV0dXJuIHBFbnRyeTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCURlbGV0ZSBhbGwgTWVzaCBFbnRyeSBpbiBwQWQtPk1hY1RhYgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gTWFjVGFibGVEZWxldGVEbHNFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgd2NpZCwKLQlJTiBQVUNIQVIgcEFkZHIpCi17Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gTWFjVGFibGVEZWxldGVEbHNFbnRyeVxuIikpOwotCi0JaWYgKCFWQUxJRF9XQ0lEKHdjaWQpKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlNYWNUYWJsZURlbGV0ZUVudHJ5KHBBZCwgd2NpZCwgcEFkZHIpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PT0gTWFjVGFibGVEZWxldGVEbHNFbnRyeVxuIikpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLU1BQ19UQUJMRV9FTlRSWSAqRGxzRW50cnlUYWJsZUxvb2t1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIJcEFkZHIsCi0JSU4gQk9PTEVBTgliUmVzZXRJZGVsQ291bnQpCi17Ci0JVUxPTkcgSGFzaElkeDsKLQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEw7Ci0KLQlSVE1QX1NFTV9MT0NLKCZwQWQtPk1hY1RhYkxvY2spOwotCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKLQlwRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOwotCi0Jd2hpbGUgKHBFbnRyeSkKLQl7Ci0JCWlmICgocEVudHJ5LT5WYWxpZEFzRGxzID09IFRSVUUpCi0JCQkmJiBNQUNfQUREUl9FUVVBTChwRW50cnktPkFkZHIsIHBBZGRyKSkKLQkJewotCQkJaWYoYlJlc2V0SWRlbENvdW50KQotCQkJCXBFbnRyeS0+Tm9EYXRhSWRsZUNvdW50ID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UKLQkJCXBFbnRyeSA9IHBFbnRyeS0+cE5leHQ7Ci0JfQotCi0JUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1hY1RhYkxvY2spOwotCXJldHVybiBwRW50cnk7Ci19Ci0KLU1BQ19UQUJMRV9FTlRSWSAqRGxzRW50cnlUYWJsZUxvb2t1cEJ5V2NpZCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgl3Y2lkLAotCUlOIFBVQ0hBUglwQWRkciwKLQlJTiBCT09MRUFOCWJSZXNldElkZWxDb3VudCkKLXsKLQlVTE9ORyBETHNJbmRleDsKLQlQTUFDX1RBQkxFX0VOVFJZIHBDdXJFbnRyeSA9IE5VTEw7Ci0JUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSBOVUxMOwotCi0JaWYgKCFWQUxJRF9XQ0lEKHdjaWQpKQotCQlyZXR1cm4gTlVMTDsKLQotCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWFjVGFiTG9jayk7Ci0KLQlkbwotCXsKLQkJcEN1ckVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbd2NpZF07Ci0KLQkJRExzSW5kZXggPSAweGZmOwotCQlpZiAoKHBDdXJFbnRyeSkgJiYgKHBDdXJFbnRyeS0+VmFsaWRBc0Rscz09IFRSVUUpKQotCQl7Ci0JCQlETHNJbmRleCA9IHBDdXJFbnRyeS0+TWF0Y2hEbHNFbnRyeUlkeDsKLQkJfQotCi0JCWlmIChETHNJbmRleCA9PSAweGZmKQotCQkJYnJlYWs7Ci0KLQkJaWYgKE1BQ19BRERSX0VRVUFMKHBDdXJFbnRyeS0+QWRkciwgcEFkZHIpKQotCQl7Ci0JCQlpZihiUmVzZXRJZGVsQ291bnQpCi0JCQkJcEN1ckVudHJ5LT5Ob0RhdGFJZGxlQ291bnQgPSAwOwotCQkJcEVudHJ5ID0gcEN1ckVudHJ5OwotCQkJYnJlYWs7Ci0JCX0KLQl9IHdoaWxlKEZBTFNFKTsKLQotCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NYWNUYWJMb2NrKTsKLQotCXJldHVybiBwRW50cnk7Ci19Ci0KLUlOVCBTZXRfRGxzRW50cnlJbmZvX0Rpc3BsYXlfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgYXJnKQotewotCUlOVCBpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlxuJS0xOXMlLThzXG4iLCAiTUFDIiwgIlRJTUVPVVRcbiIpKTsKLQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQotCXsKLQkJaWYgKChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKLQkJewotCQkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSURdOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggICIsCi0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkclswXSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkclsxXSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkclsyXSwKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzNdLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzRdLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzVdKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJS04ZFxuIiwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCkpOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiXG4iKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiXG4lLTE5cyUtNHMlLTRzJS00cyUtNHMlLTdzJS03cyUtN3MiLCJNQUMiLCAiQUlEIiwgIkJTUyIsICJQU00iLCAiV01NIiwgIlJTU0kwIiwgIlJTU0kxIiwgIlJTU0kyIikpOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiUtOHMlLTEwcyUtNnMlLTZzJS02cyUtNnMiLCAiTUlNT1BTIiwgIlBoTWQiLCAiQlciLCAiTUNTIiwgIlNHSSIsICJTVEJDIikpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlxuJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggICIsCi0JCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKLQkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJS00ZCIsIChpbnQpcEVudHJ5LT5BaWQpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlLTRkIiwgKGludClwRW50cnktPmFwaWR4KSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJS00ZCIsIChpbnQpcEVudHJ5LT5Qc01vZGUpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlLTRkIiwgKGludClDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiUtN2QiLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTApKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlLTdkIiwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kxKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJS03ZCIsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMikpOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiUtOGQiLCAoaW50KXBFbnRyeS0+TW1wc01vZGUpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlLTEwcyIsIEdldFBoeU1vZGUocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSkpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlLTZzIiwgR2V0QlcocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcpKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJS02ZCIsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUykpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiUtNmQiLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJS02ZCIsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMpKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlLTEwZCwgJWQsICVkJSVcbiIsIHBFbnRyeS0+RGVidWdGSUZPQ291bnQsIHBFbnRyeS0+RGVidWdUeENvdW50LAotCQkJCQkJKHBFbnRyeS0+RGVidWdUeENvdW50KSA/ICgocEVudHJ5LT5EZWJ1Z1R4Q291bnQtcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCkqMTAwL3BFbnRyeS0+RGVidWdUeENvdW50KSA6IDApKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJcbiIpKTsKLQotCQl9Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfRGxzQWRkRW50cnlfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotICAgIFVDSEFSCW1hY1tNQUNfQUREUl9MRU5dOwotCVVTSE9SVAlUaW1lb3V0OwotCVBTVFJJTkcgdG9rZW47Ci0JU1RSSU5HIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7Ci0JSU5UIGk7Ci0gICAgUlRfODAyXzExX0RMUwlEbHM7Ci0KLSAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aW1lb3V0IHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgotCQlyZXR1cm4gRkFMU0U7Ci0KLQl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOwotCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCi0JewotCQlUaW1lb3V0ID0gKFVTSE9SVCkgc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKLQotCQkqdG9rZW4gPSAnXDAnOwotCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKLQkJewotCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQlBdG9IKHRva2VuLCAoJm1hY1tpXSksIDEpOwotCQl9Ci0JCWlmKGkgIT0gNikKLQkJCXJldHVybiBGQUxTRTsKLQotCSAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lZCIsIG1hY1swXSwgbWFjWzFdLAotCSAgICAgICAgICAgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCAoaW50KVRpbWVvdXQpKTsKLQotCQlOZGlzWmVyb01lbW9yeSgmRGxzLCBzaXplb2YoUlRfODAyXzExX0RMUykpOwotCQlEbHMuVGltZU91dCA9IFRpbWVvdXQ7Ci0JCUNPUFlfTUFDX0FERFIoRGxzLk1hY0FkZHIsIG1hYyk7Ci0JCURscy5WYWxpZCA9IDE7Ci0KLQkJTWxtZUVucXVldWUocEFkLAotCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLQkJCQkJUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNLAotCQkJCQlzaXplb2YoUlRfODAyXzExX0RMUyksCi0JCQkJCSZEbHMpOwotCi0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKLQotfQotCi1JTlQJU2V0X0Rsc1RlYXJEb3duRW50cnlfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVDSEFSCQkJbWFjQWRkcltNQUNfQUREUl9MRU5dOwotCVBTVFJJTkcJCQl2YWx1ZTsKLQlJTlQJCQkJaTsKLQlSVF84MDJfMTFfRExTCURsczsKLQotCWlmKHN0cmxlbihhcmcpICE9IDE3KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcKLQkJcmV0dXJuIEZBTFNFOwotCi0JZm9yIChpPTAsIHZhbHVlID0gcnN0cnRvayhhcmcsIjoiKTsgdmFsdWU7IHZhbHVlID0gcnN0cnRvayhOVUxMLCI6IikpCi0JewotCQlpZigoc3RybGVuKHZhbHVlKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp2YWx1ZSkpIHx8ICghaXN4ZGlnaXQoKih2YWx1ZSsxKSkpICkKLQkJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAotCi0JCUF0b0godmFsdWUsICZtYWNBZGRyW2krK10sIDIpOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwgbWFjQWRkclswXSwgbWFjQWRkclsxXSwKLQkgICAgICAgICAgIG1hY0FkZHJbMl0sIG1hY0FkZHJbM10sIG1hY0FkZHJbNF0sIG1hY0FkZHJbNV0pKTsKLQotCU5kaXNaZXJvTWVtb3J5KCZEbHMsIHNpemVvZihSVF84MDJfMTFfRExTKSk7Ci0JQ09QWV9NQUNfQUREUihEbHMuTWFjQWRkciwgbWFjQWRkcik7Ci0JRGxzLlZhbGlkID0gMDsKLQotCU1sbWVFbnF1ZXVlKHBBZCwKLQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLQkJCQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0sCi0JCQkJc2l6ZW9mKFJUXzgwMl8xMV9ETFMpLAotCQkJCSZEbHMpOwotCi0JcmV0dXJuIFRSVUU7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9ydG1wX2NraXBtaWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL3J0bXBfY2tpcG1pYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjZkYmQ3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL3J0bXBfY2tpcG1pYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTc5ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JcnRtcF9ja2lwbWljLmMKLQotCUFic3RyYWN0OgotCURhdGEgcGF0aCBzdWJyb3V0aW5lcwotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotI2luY2x1ZGUgIi4uL3J0bXBfY2tpcG1pYy5oIgotCi0KLSNkZWZpbmUgTUlDX0FDQ1VNKHYpICAgICAgICAgICAgcENvbnRleHQtPmFjY3VtICs9IChVTE9OR0xPTkcpdiAqIFJUTVBNaWNHZXRDb2VmZmljaWVudChwQ29udGV4dCkKLSNkZWZpbmUgR0IocCxpLHMpICAgICAgICAgICAgICAgKCAoKFVMT05HKSAqKChVQ0hBUiopKHApK2kpICkgPDwgKHMpICkKLSNkZWZpbmUgR0VUQklHMzIocCkgICAgICAgICAgICAgR0IocCwwLDI0KXxHQihwLDEsMTYpfEdCKHAsMiw4KXxHQihwLDMsMCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqIFNCT1ggVGFibGUgKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1VQ0hBUiBTYm94VGFibGVbMjU2XSA9Ci17Ci0gICAgMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSwKLSAgICAweDMwLCAweDAxLCAweDY3LCAweDJiLCAweGZlLCAweGQ3LCAweGFiLCAweDc2LAotICAgIDB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAsCi0gICAgMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCwKLSAgICAweGI3LCAweGZkLCAweDkzLCAweDI2LCAweDM2LCAweDNmLCAweGY3LCAweGNjLAotICAgIDB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUsCi0gICAgMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YSwKLSAgICAweDA3LCAweDEyLCAweDgwLCAweGUyLCAweGViLCAweDI3LCAweGIyLCAweDc1LAotICAgIDB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTAsCi0gICAgMHg1MiwgMHgzYiwgMHhkNiwgMHhiMywgMHgyOSwgMHhlMywgMHgyZiwgMHg4NCwKLSAgICAweDUzLCAweGQxLCAweDAwLCAweGVkLCAweDIwLCAweGZjLCAweGIxLCAweDViLAotICAgIDB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YsCi0gICAgMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NSwKLSAgICAweDQ1LCAweGY5LCAweDAyLCAweDdmLCAweDUwLCAweDNjLCAweDlmLCAweGE4LAotICAgIDB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUsCi0gICAgMHhiYywgMHhiNiwgMHhkYSwgMHgyMSwgMHgxMCwgMHhmZiwgMHhmMywgMHhkMiwKLSAgICAweGNkLCAweDBjLCAweDEzLCAweGVjLCAweDVmLCAweDk3LCAweDQ0LCAweDE3LAotICAgIDB4YzQsIDB4YTcsIDB4N2UsIDB4M2QsIDB4NjQsIDB4NWQsIDB4MTksIDB4NzMsCi0gICAgMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCwKLSAgICAweDQ2LCAweGVlLCAweGI4LCAweDE0LCAweGRlLCAweDVlLCAweDBiLCAweGRiLAotICAgIDB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMsCi0gICAgMHhjMiwgMHhkMywgMHhhYywgMHg2MiwgMHg5MSwgMHg5NSwgMHhlNCwgMHg3OSwKLSAgICAweGU3LCAweGM4LCAweDM3LCAweDZkLCAweDhkLCAweGQ1LCAweDRlLCAweGE5LAotICAgIDB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgsCi0gICAgMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNiwKLSAgICAweGU4LCAweGRkLCAweDc0LCAweDFmLCAweDRiLCAweGJkLCAweDhiLCAweDhhLAotICAgIDB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUsCi0gICAgMHg2MSwgMHgzNSwgMHg1NywgMHhiOSwgMHg4NiwgMHhjMSwgMHgxZCwgMHg5ZSwKLSAgICAweGUxLCAweGY4LCAweDk4LCAweDExLCAweDY5LCAweGQ5LCAweDhlLCAweDk0LAotICAgIDB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYsCi0gICAgMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OCwKLSAgICAweDQxLCAweDk5LCAweDJkLCAweDBmLCAweGIwLCAweDU0LCAweGJiLCAweDE2Ci19OwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKj09PT09PT09PT09PT09PT09PT0gQ0tJUCBLRVkgUEVSTVVUQVRJT04gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qIDItYnl0ZSBieSAyLWJ5dGUgc3Vic2V0IG9mIHRoZSBmdWxsIEFFUyB0YWJsZSAqLwotc3RhdGljIGNvbnN0IFVTSE9SVCBTYm94WzI1Nl0gPQotewotICAgIDB4QzZBNSwweEY4ODQsMHhFRTk5LDB4RjY4RCwweEZGMEQsMHhENkJELDB4REVCMSwweDkxNTQsCi0gICAgMHg2MDUwLDB4MDIwMywweENFQTksMHg1NjdELDB4RTcxOSwweEI1NjIsMHg0REU2LDB4RUM5QSwKLSAgICAweDhGNDUsMHgxRjlELDB4ODk0MCwweEZBODcsMHhFRjE1LDB4QjJFQiwweDhFQzksMHhGQjBCLAotICAgIDB4NDFFQywweEIzNjcsMHg1RkZELDB4NDVFQSwweDIzQkYsMHg1M0Y3LDB4RTQ5NiwweDlCNUIsCi0gICAgMHg3NUMyLDB4RTExQywweDNEQUUsMHg0QzZBLDB4NkM1QSwweDdFNDEsMHhGNTAyLDB4ODM0RiwKLSAgICAweDY4NUMsMHg1MUY0LDB4RDEzNCwweEY5MDgsMHhFMjkzLDB4QUI3MywweDYyNTMsMHgyQTNGLAotICAgIDB4MDgwQywweDk1NTIsMHg0NjY1LDB4OUQ1RSwweDMwMjgsMHgzN0ExLDB4MEEwRiwweDJGQjUsCi0gICAgMHgwRTA5LDB4MjQzNiwweDFCOUIsMHhERjNELDB4Q0QyNiwweDRFNjksMHg3RkNELDB4RUE5RiwKLSAgICAweDEyMUIsMHgxRDlFLDB4NTg3NCwweDM0MkUsMHgzNjJELDB4RENCMiwweEI0RUUsMHg1QkZCLAotICAgIDB4QTRGNiwweDc2NEQsMHhCNzYxLDB4N0RDRSwweDUyN0IsMHhERDNFLDB4NUU3MSwweDEzOTcsCi0gICAgMHhBNkY1LDB4Qjk2OCwweDAwMDAsMHhDMTJDLDB4NDA2MCwweEUzMUYsMHg3OUM4LDB4QjZFRCwKLSAgICAweEQ0QkUsMHg4RDQ2LDB4NjdEOSwweDcyNEIsMHg5NERFLDB4OThENCwweEIwRTgsMHg4NTRBLAotICAgIDB4QkI2QiwweEM1MkEsMHg0RkU1LDB4RUQxNiwweDg2QzUsMHg5QUQ3LDB4NjY1NSwweDExOTQsCi0gICAgMHg4QUNGLDB4RTkxMCwweDA0MDYsMHhGRTgxLDB4QTBGMCwweDc4NDQsMHgyNUJBLDB4NEJFMywKLSAgICAweEEyRjMsMHg1REZFLDB4ODBDMCwweDA1OEEsMHgzRkFELDB4MjFCQywweDcwNDgsMHhGMTA0LAotICAgIDB4NjNERiwweDc3QzEsMHhBRjc1LDB4NDI2MywweDIwMzAsMHhFNTFBLDB4RkQwRSwweEJGNkQsCi0gICAgMHg4MTRDLDB4MTgxNCwweDI2MzUsMHhDMzJGLDB4QkVFMSwweDM1QTIsMHg4OENDLDB4MkUzOSwKLSAgICAweDkzNTcsMHg1NUYyLDB4RkM4MiwweDdBNDcsMHhDOEFDLDB4QkFFNywweDMyMkIsMHhFNjk1LAotICAgIDB4QzBBMCwweDE5OTgsMHg5RUQxLDB4QTM3RiwweDQ0NjYsMHg1NDdFLDB4M0JBQiwweDBCODMsCi0gICAgMHg4Q0NBLDB4QzcyOSwweDZCRDMsMHgyODNDLDB4QTc3OSwweEJDRTIsMHgxNjFELDB4QUQ3NiwKLSAgICAweERCM0IsMHg2NDU2LDB4NzQ0RSwweDE0MUUsMHg5MkRCLDB4MEMwQSwweDQ4NkMsMHhCOEU0LAotICAgIDB4OUY1RCwweEJENkUsMHg0M0VGLDB4QzRBNiwweDM5QTgsMHgzMUE0LDB4RDMzNywweEYyOEIsCi0gICAgMHhENTMyLDB4OEI0MywweDZFNTksMHhEQUI3LDB4MDE4QywweEIxNjQsMHg5Q0QyLDB4NDlFMCwKLSAgICAweEQ4QjQsMHhBQ0ZBLDB4RjMwNywweENGMjUsMHhDQUFGLDB4RjQ4RSwweDQ3RTksMHgxMDE4LAotICAgIDB4NkZENSwweEYwODgsMHg0QTZGLDB4NUM3MiwweDM4MjQsMHg1N0YxLDB4NzNDNywweDk3NTEsCi0gICAgMHhDQjIzLDB4QTE3QywweEU4OUMsMHgzRTIxLDB4OTZERCwweDYxREMsMHgwRDg2LDB4MEY4NSwKLSAgICAweEUwOTAsMHg3QzQyLDB4NzFDNCwweENDQUEsMHg5MEQ4LDB4MDYwNSwweEY3MDEsMHgxQzEyLAotICAgIDB4QzJBMywweDZBNUYsMHhBRUY5LDB4NjlEMCwweDE3OTEsMHg5OTU4LDB4M0EyNywweDI3QjksCi0gICAgMHhEOTM4LDB4RUIxMywweDJCQjMsMHgyMjMzLDB4RDJCQiwweEE5NzAsMHgwNzg5LDB4MzNBNywKLSAgICAweDJEQjYsMHgzQzIyLDB4MTU5MiwweEM5MjAsMHg4NzQ5LDB4QUFGRiwweDUwNzgsMHhBNTdBLAotICAgIDB4MDM4RiwweDU5RjgsMHgwOTgwLDB4MUExNywweDY1REEsMHhENzMxLDB4ODRDNiwweEQwQjgsCi0gICAgMHg4MkMzLDB4MjlCMCwweDVBNzcsMHgxRTExLDB4N0JDQiwweEE4RkMsMHg2REQ2LDB4MkMzQQotICAgIH07Ci0KLSNkZWZpbmUgTG84KHYxNikgICAgICgodjE2KSAgICAgICAmIDB4RkYpCi0jZGVmaW5lIEhpOCh2MTYpICAgICgoKHYxNikgPj4gOCkgJiAweEZGKQotI2RlZmluZSB1MTZTd2FwKGkpICAoICgoKGkpID4+IDgpICYgMHhGRikgfCAoKChpKSA8PCA4KSAmIDB4RkYwMCkgKQotI2RlZmluZSBfU18oaSkgICAgICAoU2JveFtMbzgoaSldIF4gdTE2U3dhcChTYm94W0hpOChpKV0pKQotCi0jZGVmaW5lIHJvdExlZnRfMSh4KSAoKCgoeCkgPDwgMSkgfCAoKHgpID4+IDE1KSkgJiAweEZGRkYpCi1WT0lEIENLSVBfa2V5X3Blcm11dGUKLSAgICAoCi0gICAgIE9VVCBVQ0hBUiAgKlBLLCAgICAgICAgICAgLyogb3V0cHV0IHBlcm11dGVkIGtleSAqLwotICAgICBJTiBVQ0hBUiAqQ0ssICAgICAgICAgICAvKiBpbnB1dCBDS0lQIGtleSAqLwotICAgICBJTiBVQ0hBUiAgdG9Ec0Zyb21EcywgICAgLyogaW5wdXQgdG9Ecy9Gcm9tRHMgYml0cyAqLwotICAgICBJTiBVQ0hBUiAqcGl2ICAgICAgICAgICAvKiBpbnB1dCBwb2ludGVyIHRvIElWICovCi0gICAgICkKLXsKLSAgICBpbnQgaTsKLSAgICBVU0hPUlQgSFsyXSwgdG1wOyAgICAgICAgICAvKiBIPTMyLWJpdHMgb2YgcGVyLXBhY2tldCBoYXNoIHZhbHVlICovCi0gICAgVVNIT1JUIExbOF0sIFJbOF07ICAgICAgICAgLyogTD11MTYgYXJyYXkgb2YgQ0ssIFI9dTE2IGFycmF5IG9mIFBLICovCi0KLSAgICAvKiBidWlsZCBMIGZyb20gaW5wdXQga2V5ICovCi0gICAgbWVtc2V0KEwsIDAsIHNpemVvZihMKSk7Ci0gICAgZm9yIChpPTA7IGk8MTY7IGkrKykgewotICAgICAgICBMW2k+PjFdIHw9ICggKChVU0hPUlQpKENLW2ldKSkgPDwgKCBpICYgMSA/IDggOiAwKSApOwotICAgIH0KLQotICAgIEhbMF0gPSAoKChVU0hPUlQpcGl2WzBdKSA8PCA4KSArIHBpdlsxXTsKLSAgICBIWzFdID0gKCAoKFVTSE9SVCl0b0RzRnJvbURzKSA8PCA4KSB8IHBpdlsyXTsKLQotICAgIGZvciAoaT0wOyBpPDg7IGkrKykgewotICAgICAgICBIWzBdIF49IExbaV07ICAgICAgICAgICAvKiAxNi1iaXRzIG9mIGtleSBtYXRlcmlhbCAqLwotICAgICAgICB0bXAgICA9IF9TXyhIWzBdKTsgICAgICAvKiAxNngxNiBwZXJtdXRhdGlvbiAqLwotICAgICAgICBIWzBdICA9IHRtcCBeIEhbMV07ICAgICAvKiBzZXQgdXAgZm9yIG5leHQgcm91bmQgKi8KLSAgICAgICAgSFsxXSAgPSB0bXA7Ci0gICAgICAgIFJbaV0gID0gSFswXTsgICAgICAgICAgIC8qIHN0b3JlIGludG8ga2V5IGFycmF5ICAqLwotICAgIH0KLQotICAgIC8qIHN3ZWVwIGluIHRoZSBvdGhlciBkaXJlY3Rpb24gKi8KLSAgICB0bXA9TFswXTsKLSAgICBmb3IgKGk9NzsgaT4wOyBpLS0pIHsKLSAgICAgICAgUltpXSA9IHRtcCA9IHJvdExlZnRfMSh0bXApICsgUltpXTsKLSAgICB9Ci0KLSAgICAvKiBJViBvZiB0aGUgcGVybXV0ZWQga2V5IGlzIHVuY2hhbmdlZCAqLwotICAgIFBLWzBdID0gcGl2WzBdOwotICAgIFBLWzFdID0gcGl2WzFdOwotICAgIFBLWzJdID0gcGl2WzJdOwotCi0gICAgLyoga2V5IHBvcnRpb24gb2YgdGhlIHBlcm11dGVkIGtleSBpcyBjaGFuZ2VkICovCi0gICAgZm9yIChpPTM7IGk8MTY7IGkrKykgewotICAgICAgICBQS1tpXSA9IChVQ0hBUikgKFJbaT4+MV0gPj4gKGkgJiAxID8gOCA6IDApKTsKLSAgICB9Ci19Ci0KLS8qIHByZXBhcmUgZm9yIGNhbGN1bGF0aW9uIG9mIGEgbmV3IG1pYyAqLwotVk9JRCBSVE1QQ2tpcE1pY0luaXQoCi0gICAgSU4gIFBNSUNfQ09OVEVYVCAgICAgICAgcENvbnRleHQsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgQ0spCi17Ci0gICAgLyogcHJlcGFyZSBmb3IgbmV3IG1pYyBjYWxjdWxhdGlvbiAqLwotICAgIE5kaXNNb3ZlTWVtb3J5KHBDb250ZXh0LT5DSywgQ0ssIHNpemVvZihwQ29udGV4dC0+Q0spKTsKLSAgICBwQ29udGV4dC0+YWNjdW0gPSAwOwotICAgIHBDb250ZXh0LT5wb3NpdGlvbiA9IDA7Ci19Ci0KLS8qIGFkZCBzb21lIGJ5dGVzIHRvIHRoZSBtaWMgY2FsY3VsYXRpb24gKi8KLVZPSUQgUlRNUE1pY1VwZGF0ZSgKLSAgICBJTiAgUE1JQ19DT05URVhUICAgICAgICBwQ29udGV4dCwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBwT2N0ZXRzLAotICAgIElOICBJTlQgICAgICAgICAgICAgICAgIGxlbikKLXsKLSAgICBJTlQgICAgIGJ5dGVfcG9zaXRpb247Ci0gICAgVUxPTkcgICB2YWw7Ci0KLSAgICBieXRlX3Bvc2l0aW9uID0gKHBDb250ZXh0LT5wb3NpdGlvbiAmIDMpOwotICAgIHdoaWxlIChsZW4gPiAwKSB7Ci0gICAgICAgIC8qIGJ1aWxkIGEgMzItYml0IHdvcmQgZm9yIE1JQyBtdWx0aXBseSBhY2N1bXVsYXRlICovCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuOwotICAgICAgICAgICAgcENvbnRleHQtPnBhcnRbYnl0ZV9wb3NpdGlvbisrXSA9ICpwT2N0ZXRzKys7Ci0gICAgICAgICAgICBwQ29udGV4dC0+cG9zaXRpb24rKzsKLSAgICAgICAgICAgIGxlbi0tOwotICAgICAgICB9IHdoaWxlIChieXRlX3Bvc2l0aW9uIDwgNCk7Ci0gICAgICAgIC8qIGhhdmUgYSBmdWxsIDMyLWJpdCB3b3JkIHRvIHByb2Nlc3MgKi8KLSAgICAgICAgdmFsID0gR0VUQklHMzIoJnBDb250ZXh0LT5wYXJ0WzBdKTsKLSAgICAgICAgTUlDX0FDQ1VNKHZhbCk7Ci0gICAgICAgIGJ5dGVfcG9zaXRpb24gPSAwOwotICAgIH0KLX0KLQotVUxPTkcgUlRNUE1pY0dldENvZWZmaWNpZW50KAotICAgIElOICBQTUlDX0NPTlRFWFQgICAgICAgICBwQ29udGV4dCkKLXsKLSAgICBVQ0hBUiAgIGFlc19jb3VudGVyWzE2XTsKLSAgICBJTlQgICAgIGNvZWZmX3Bvc2l0aW9uOwotICAgIFVDSEFSICAgKnA7Ci0KLSAgICBjb2VmZl9wb3NpdGlvbiA9IChwQ29udGV4dC0+cG9zaXRpb24gLSAxKSA+PiAyOwotICAgIGlmICggKGNvZWZmX3Bvc2l0aW9uICYgMykgPT0gMCkgewotICAgICAgICAvKiBmZXRjaGluZyB0aGUgZmlyc3QgY29lZmZpY2llbnQgLS0gZ2V0IG5ldyAxNi1ieXRlIGFlcyBjb3VudGVyIG91dHB1dCAqLwotICAgICAgICB1MzIgY291bnRlciA9IChjb2VmZl9wb3NpdGlvbiA+PiAyKTsKLQotICAgICAgICAvKiBuZXcgY291bnRlciB2YWx1ZSAqLwotICAgICAgICBtZW1zZXQoJmFlc19jb3VudGVyWzBdLCAwLCBzaXplb2YoYWVzX2NvdW50ZXIpKTsKLSAgICAgICAgYWVzX2NvdW50ZXJbMTVdID0gKFVJTlQ4KShjb3VudGVyID4+IDApOwotICAgICAgICBhZXNfY291bnRlclsxNF0gPSAoVUlOVDgpKGNvdW50ZXIgPj4gOCk7Ci0gICAgICAgIGFlc19jb3VudGVyWzEzXSA9IChVSU5UOCkoY291bnRlciA+PiAxNik7Ci0gICAgICAgIGFlc19jb3VudGVyWzEyXSA9IChVSU5UOCkoY291bnRlciA+PiAyNCk7Ci0KLSAgICAgICAgUlRNUEFlc0VuY3J5cHQoJnBDb250ZXh0LT5DS1swXSwgJmFlc19jb3VudGVyWzBdLCBwQ29udGV4dC0+Y29lZmZpY2llbnQpOwotICAgIH0KLSAgICBwID0gJihwQ29udGV4dC0+Y29lZmZpY2llbnRbIChjb2VmZl9wb3NpdGlvbiAmIDMpIDw8IDIgXSk7Ci0gICAgcmV0dXJuIEdFVEJJRzMyKHApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGFlczEyOGsxMjhkKCkgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUGVyZm9ybXMgYSAxMjggYml0IEFFUyBlbmNyeXB0IHdpdGggICovCi0vKiAxMjggYml0IGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVk9JRCB4b3JfMTI4KAotICAgIElOICBQVUNIQVIgIGEsCi0gICAgSU4gIFBVQ0hBUiAgYiwKLSAgICBPVVQgUFVDSEFSICBvdXQpCi17Ci0gICAgSU5UIGk7Ci0KLSAgICBmb3IgKGk9MDtpPDE2OyBpKyspCi0gICAgewotICAgICAgICBvdXRbaV0gPSBhW2ldIF4gYltpXTsKLSAgICB9Ci19Ci0KLVVDSEFSIFJUTVBDa2lwU2JveCgKLSAgICBJTiAgVUNIQVIgICBhKQotewotICAgIHJldHVybiBTYm94VGFibGVbKGludClhXTsKLX0KLQotVk9JRCB4b3JfMzIoCi0gICAgSU4gIFBVQ0hBUiAgYSwKLSAgICBJTiAgUFVDSEFSICBiLAotICAgIE9VVCBQVUNIQVIgIG91dCkKLXsKLSAgICBJTlQgaTsKLQotICAgIGZvciAoaT0wO2k8NDsgaSsrKQotICAgIHsKLSAgICAgICAgb3V0W2ldID0gYVtpXSBeIGJbaV07Ci0gICAgfQotfQotCi1WT0lEIG5leHRfa2V5KAotICAgIElOICBQVUNIQVIgIGtleSwKLSAgICBJTiAgSU5UICAgICByb3VuZCkKLXsKLSAgICBVQ0hBUiAgICAgICByY29uOwotICAgIFVDSEFSICAgICAgIHNib3hfa2V5WzRdOwotICAgIFVDSEFSICAgICAgIHJjb25fdGFibGVbMTJdID0KLSAgICB7Ci0gICAgICAgIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsCi0gICAgICAgIDB4MWIsIDB4MzYsIDB4MzYsIDB4MzYKLSAgICB9OwotCi0gICAgc2JveF9rZXlbMF0gPSBSVE1QQ2tpcFNib3goa2V5WzEzXSk7Ci0gICAgc2JveF9rZXlbMV0gPSBSVE1QQ2tpcFNib3goa2V5WzE0XSk7Ci0gICAgc2JveF9rZXlbMl0gPSBSVE1QQ2tpcFNib3goa2V5WzE1XSk7Ci0gICAgc2JveF9rZXlbM10gPSBSVE1QQ2tpcFNib3goa2V5WzEyXSk7Ci0KLSAgICByY29uID0gcmNvbl90YWJsZVtyb3VuZF07Ci0KLSAgICB4b3JfMzIoJmtleVswXSwgc2JveF9rZXksICZrZXlbMF0pOwotICAgIGtleVswXSA9IGtleVswXSBeIHJjb247Ci0KLSAgICB4b3JfMzIoJmtleVs0XSwgJmtleVswXSwgJmtleVs0XSk7Ci0gICAgeG9yXzMyKCZrZXlbOF0sICZrZXlbNF0sICZrZXlbOF0pOwotICAgIHhvcl8zMigma2V5WzEyXSwgJmtleVs4XSwgJmtleVsxMl0pOwotfQotCi1WT0lEIGJ5dGVfc3ViKAotICAgIElOICBQVUNIQVIgIGluLAotICAgIE9VVCBQVUNIQVIgIG91dCkKLXsKLSAgICBJTlQgaTsKLQotICAgIGZvciAoaT0wOyBpPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgb3V0W2ldID0gUlRNUENraXBTYm94KGluW2ldKTsKLSAgICB9Ci19Ci0KLVZPSUQgc2hpZnRfcm93KAotICAgIElOICBQVUNIQVIgIGluLAotICAgIE9VVCBQVUNIQVIgIG91dCkKLXsKLSAgICBvdXRbMF0gPSAgaW5bMF07Ci0gICAgb3V0WzFdID0gIGluWzVdOwotICAgIG91dFsyXSA9ICBpblsxMF07Ci0gICAgb3V0WzNdID0gIGluWzE1XTsKLSAgICBvdXRbNF0gPSAgaW5bNF07Ci0gICAgb3V0WzVdID0gIGluWzldOwotICAgIG91dFs2XSA9ICBpblsxNF07Ci0gICAgb3V0WzddID0gIGluWzNdOwotICAgIG91dFs4XSA9ICBpbls4XTsKLSAgICBvdXRbOV0gPSAgaW5bMTNdOwotICAgIG91dFsxMF0gPSBpblsyXTsKLSAgICBvdXRbMTFdID0gaW5bN107Ci0gICAgb3V0WzEyXSA9IGluWzEyXTsKLSAgICBvdXRbMTNdID0gaW5bMV07Ci0gICAgb3V0WzE0XSA9IGluWzZdOwotICAgIG91dFsxNV0gPSBpblsxMV07Ci19Ci0KLVZPSUQgbWl4X2NvbHVtbigKLSAgICBJTiAgUFVDSEFSICBpbiwKLSAgICBPVVQgUFVDSEFSICBvdXQpCi17Ci0gICAgSU5UICAgICAgICAgaTsKLSAgICBVQ0hBUiAgICAgICBhZGQxYls0XTsKLSAgICBVQ0hBUiAgICAgICBhZGQxYmY3WzRdOwotICAgIFVDSEFSICAgICAgIHJvdGxbNF07Ci0gICAgVUNIQVIgICAgICAgc3dhcF9oYWxmc1s0XTsKLSAgICBVQ0hBUiAgICAgICBhbmRmN1s0XTsKLSAgICBVQ0hBUiAgICAgICByb3RyWzRdOwotICAgIFVDSEFSICAgICAgIHRlbXBbNF07Ci0gICAgVUNIQVIgICAgICAgdGVtcGJbNF07Ci0KLSAgICBmb3IgKGk9MCA7IGk8NDsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKChpbltpXSAmIDB4ODApPT0gMHg4MCkKLSAgICAgICAgICAgIGFkZDFiW2ldID0gMHgxYjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYWRkMWJbaV0gPSAweDAwOwotICAgIH0KLQotICAgIHN3YXBfaGFsZnNbMF0gPSBpblsyXTsgICAgLyogU3dhcCBoYWxmcyAqLwotICAgIHN3YXBfaGFsZnNbMV0gPSBpblszXTsKLSAgICBzd2FwX2hhbGZzWzJdID0gaW5bMF07Ci0gICAgc3dhcF9oYWxmc1szXSA9IGluWzFdOwotCi0gICAgcm90bFswXSA9IGluWzNdOyAgICAgICAgLyogUm90YXRlIGxlZnQgOCBiaXRzICovCi0gICAgcm90bFsxXSA9IGluWzBdOwotICAgIHJvdGxbMl0gPSBpblsxXTsKLSAgICByb3RsWzNdID0gaW5bMl07Ci0KLSAgICBhbmRmN1swXSA9IGluWzBdICYgMHg3ZjsKLSAgICBhbmRmN1sxXSA9IGluWzFdICYgMHg3ZjsKLSAgICBhbmRmN1syXSA9IGluWzJdICYgMHg3ZjsKLSAgICBhbmRmN1szXSA9IGluWzNdICYgMHg3ZjsKLQotICAgIGZvciAoaSA9IDM7IGk+MDsgaS0tKSAgICAvKiBsb2dpY2FsIHNoaWZ0IGxlZnQgMSBiaXQgKi8KLSAgICB7Ci0gICAgICAgIGFuZGY3W2ldID0gYW5kZjdbaV0gPDwgMTsKLSAgICAgICAgaWYgKChhbmRmN1tpLTFdICYgMHg4MCkgPT0gMHg4MCkKLSAgICAgICAgewotICAgICAgICAgICAgYW5kZjdbaV0gPSAoYW5kZjdbaV0gfCAweDAxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBhbmRmN1swXSA9IGFuZGY3WzBdIDw8IDE7Ci0gICAgYW5kZjdbMF0gPSBhbmRmN1swXSAmIDB4ZmU7Ci0KLSAgICB4b3JfMzIoYWRkMWIsIGFuZGY3LCBhZGQxYmY3KTsKLQotICAgIHhvcl8zMihpbiwgYWRkMWJmNywgcm90cik7Ci0KLSAgICB0ZW1wWzBdID0gcm90clswXTsgICAgICAgICAvKiBSb3RhdGUgcmlnaHQgOCBiaXRzICovCi0gICAgcm90clswXSA9IHJvdHJbMV07Ci0gICAgcm90clsxXSA9IHJvdHJbMl07Ci0gICAgcm90clsyXSA9IHJvdHJbM107Ci0gICAgcm90clszXSA9IHRlbXBbMF07Ci0KLSAgICB4b3JfMzIoYWRkMWJmNywgcm90ciwgdGVtcCk7Ci0gICAgeG9yXzMyKHN3YXBfaGFsZnMsIHJvdGwsdGVtcGIpOwotICAgIHhvcl8zMih0ZW1wLCB0ZW1wYiwgb3V0KTsKLX0KLQotVk9JRCBSVE1QQWVzRW5jcnlwdCgKLSAgICBJTiAgUFVDSEFSICBrZXksCi0gICAgSU4gIFBVQ0hBUiAgZGF0YSwKLSAgICBJTiAgUFVDSEFSICBjaXBoZXJ0ZXh0KQotewotICAgIElOVCAgICAgICAgICAgICByb3VuZDsKLSAgICBJTlQgICAgICAgICAgICAgaTsKLSAgICBVQ0hBUiAgICAgICAgICAgaW50ZXJtZWRpYXRlYVsxNl07Ci0gICAgVUNIQVIgICAgICAgICAgIGludGVybWVkaWF0ZWJbMTZdOwotICAgIFVDSEFSICAgICAgICAgICByb3VuZF9rZXlbMTZdOwotCi0gICAgZm9yKGk9MDsgaTwxNjsgaSsrKSByb3VuZF9rZXlbaV0gPSBrZXlbaV07Ci0KLSAgICBmb3IgKHJvdW5kID0gMDsgcm91bmQgPCAxMTsgcm91bmQrKykKLSAgICB7Ci0gICAgICAgIGlmIChyb3VuZCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB4b3JfMTI4KHJvdW5kX2tleSwgZGF0YSwgY2lwaGVydGV4dCk7Ci0gICAgICAgICAgICBuZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChyb3VuZCA9PSAxMCkKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZV9zdWIoY2lwaGVydGV4dCwgaW50ZXJtZWRpYXRlYSk7Ci0gICAgICAgICAgICBzaGlmdF9yb3coaW50ZXJtZWRpYXRlYSwgaW50ZXJtZWRpYXRlYik7Ci0gICAgICAgICAgICB4b3JfMTI4KGludGVybWVkaWF0ZWIsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAgICAvKiAxIC0gOSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKLSAgICAgICAgICAgIHNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKLSAgICAgICAgICAgIG1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbMF0sICZpbnRlcm1lZGlhdGVhWzBdKTsKLSAgICAgICAgICAgIG1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbNF0sICZpbnRlcm1lZGlhdGVhWzRdKTsKLSAgICAgICAgICAgIG1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbOF0sICZpbnRlcm1lZGlhdGVhWzhdKTsKLSAgICAgICAgICAgIG1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbMTJdLCAmaW50ZXJtZWRpYXRlYVsxMl0pOwotICAgICAgICAgICAgeG9yXzEyOChpbnRlcm1lZGlhdGVhLCByb3VuZF9rZXksIGNpcGhlcnRleHQpOwotICAgICAgICAgICAgbmV4dF9rZXkocm91bmRfa2V5LCByb3VuZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyogY2FsY3VsYXRlIHRoZSBtaWMgKi8KLVZPSUQgUlRNUE1pY0ZpbmFsKAotICAgIElOICBQTUlDX0NPTlRFWFQgICAgcENvbnRleHQsCi0gICAgT1VUIFVDSEFSICAgICAgICAgICBkaWdlc3RbNF0pCi17Ci0gICAgSU5UICAgICAgICAgICAgIGJ5dGVfcG9zaXRpb247Ci0gICAgVUxPTkcgICAgICAgICAgIHZhbDsKLSAgICBVTE9OR0xPTkcgICAgICAgc3VtLCB1dG1wOwotICAgIExPTkdMT05HICAgICAgICBzdG1wOwotCi0gICAgLyogZGVhbCB3aXRoIHBhcnRpYWwgMzItYml0IHdvcmQgbGVmdCBvdmVyIGZyb20gbGFzdCB1cGRhdGUgKi8KLSAgICBpZiAoIChieXRlX3Bvc2l0aW9uID0gKHBDb250ZXh0LT5wb3NpdGlvbiAmIDMpKSAhPSAwKSB7Ci0gICAgICAgIC8qIGhhdmUgYSBwYXJ0aWFsIHdvcmQgaW4gcGFydCB0byBkZWFsIHdpdGggLS0gemVybyB1bnVzZWQgYnl0ZXMgKi8KLSAgICAgICAgZG8gewotICAgICAgICAgICAgcENvbnRleHQtPnBhcnRbYnl0ZV9wb3NpdGlvbisrXSA9IDA7Ci0gICAgICAgICAgICBwQ29udGV4dC0+cG9zaXRpb24rKzsKLSAgICAgICAgfSB3aGlsZSAoYnl0ZV9wb3NpdGlvbiA8IDQpOwotICAgICAgICB2YWwgPSBHRVRCSUczMigmcENvbnRleHQtPnBhcnRbMF0pOwotICAgICAgICBNSUNfQUNDVU0odmFsKTsKLSAgICB9Ci0KLSAgICAvKiByZWR1Y2UgdGhlIGFjY3VtdWxhdGVkIHU2NCB0byBhIDMyLWJpdCBNSUMgKi8KLSAgICBzdW0gPSBwQ29udGV4dC0+YWNjdW07Ci0gICAgc3RtcCA9IChzdW0gICYgMHhmZmZmZmZmZkwpIC0gKChzdW0gPj4gMzIpICAqIDE1KTsKLSAgICB1dG1wID0gKHN0bXAgJiAweGZmZmZmZmZmTCkgLSAoKHN0bXAgPj4gMzIpICogMTUpOwotICAgIHN1bSA9IHV0bXAgJiAweGZmZmZmZmZmTDsKLSAgICBpZiAodXRtcCA+IDB4MTAwMDAwMDBmTCkKLSAgICAgICAgc3VtIC09IDE1OwotCi0gICAgdmFsID0gKFVMT05HKXN1bTsKLSAgICBkaWdlc3RbMF0gPSAoVUNIQVIpKCh2YWw+PjI0KSAmIDB4RkYpOwotICAgIGRpZ2VzdFsxXSA9IChVQ0hBUikgKCh2YWw+PjE2KSAmIDB4RkYpOwotICAgIGRpZ2VzdFsyXSA9IChVQ0hBUikgKCh2YWw+PjgpICYgMHhGRik7Ci0gICAgZGlnZXN0WzNdID0gKFVDSEFSKSgodmFsPj4wKSAmIDB4RkYpOwotfQotCi1WT0lEIFJUTVBDa2lwSW5zZXJ0Q01JQygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBPVVQgUFVDSEFSICAgICAgICAgIHBNSUMsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBwODAyMTFoZHIsCi0gICAgSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0LAotICAgIElOICBQQ0lQSEVSX0tFWSAgICAgcEtleSwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIG1pY19zbmFwKQotewotCVBBQ0tFVF9JTkZPCQlQYWNrZXRJbmZvOwotCVBVQ0hBUgkJCXBTcmNCdWZWQTsKLQlVTE9ORwkJCVNyY0J1ZkxlbjsKLSAgICBQVUNIQVIgICAgICAgICAgcERBLCBwU0EsIHBQcm90bzsKLSAgICBVQ0hBUiAgICAgICAgICAgYmlnZXRobGVuWzJdOwotCVVDSEFSCQkJY2tpcF9ja1sxNl07Ci0gICAgTUlDX0NPTlRFWFQgICAgIG1pY19jdHg7Ci0gICAgVVNIT1JUICAgICAgICAgIHBheWxvYWRsZW47Ci0JVUNIQVIJCQlpOwotCi0JaWYgKHBLZXkgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UX0VSUigoIlJUTVBDa2lwSW5zZXJ0Q01JQywgQmVmb3JlIHRvIGZvcm0gdGhlIENLSVAga2V5IChDSyksIHBLZXkgY2FuJ3QgYmUgTlVMTFxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0gICAgc3dpdGNoICgqKHA4MDIxMWhkcisxKSAmIDMpCi0gICAgewotICAgICAgICBjYXNlIDA6IC8qIEZyb21Ecz0wLCBUb0RzPTAgKi8KLSAgICAgICAgICAgIHBEQSA9IHA4MDIxMWhkcis0OwotICAgICAgICAgICAgcFNBID0gcDgwMjExaGRyKzEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogLyogRnJvbURzPTAsIFRvRHM9MSAqLwotICAgICAgICAgICAgcERBID0gcDgwMjExaGRyKzE2OwotICAgICAgICAgICAgcFNBID0gcDgwMjExaGRyKzEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogLyogRnJvbURzPTEsIFRvRHM9MCAqLwotICAgICAgICAgICAgcERBID0gcDgwMjExaGRyKzQ7Ci0gICAgICAgICAgICBwU0EgPSBwODAyMTFoZHIrMTY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOiAvKiBGcm9tRHM9MSwgVG9Ecz0xICovCi0gICAgICAgICAgICBwREEgPSBwODAyMTFoZHIrMTY7Ci0gICAgICAgICAgICBwU0EgPSBwODAyMTFoZHIrMjQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLQlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7Ci0KLSAgICBpZiAoU3JjQnVmTGVuIDwgTEVOR1RIXzgwMl8zKQotICAgICAgICByZXR1cm47Ci0KLSAgICBwUHJvdG8gPSBwU3JjQnVmVkEgKyAxMjsKLSAgICBwYXlsb2FkbGVuID0gUGFja2V0SW5mby5Ub3RhbFBhY2tldExlbmd0aCAtIExFTkdUSF84MDJfMyArIDE4OyAvLyBDS0lQX0xMQyg4KStDTUlDKDQpK1R4U0VRKDQpK1BST1RPKDIpPTE4Ci0KLSAgICBiaWdldGhsZW5bMF0gPSAodW5zaWduZWQgY2hhcikocGF5bG9hZGxlbiA+PiA4KTsKLSAgICBiaWdldGhsZW5bMV0gPSAodW5zaWduZWQgY2hhcilwYXlsb2FkbGVuOwotCi0JLy8KLQkvLyBFbmNyeXB0aW9uIEtleSBleHBhbnNpb24gdG8gZm9ybSB0aGUgQ0tJUCBLZXkgKENLSVBfQ0spLgotCS8vCi0JaWYgKHBLZXktPktleUxlbiA8IDE2KQotCXsKLQkJZm9yKGkgPSAwOyBpIDwgKDE2IC8gcEtleS0+S2V5TGVuKTsgaSsrKQotCQl7Ci0JCQlOZGlzTW92ZU1lbW9yeShja2lwX2NrICsgaSAqIHBLZXktPktleUxlbiwKLQkJCQkJCQlwS2V5LT5LZXksCi0JCQkJCQkJcEtleS0+S2V5TGVuKTsKLQkJfQotCQlOZGlzTW92ZU1lbW9yeShja2lwX2NrICsgaSAqIHBLZXktPktleUxlbiwKLQkJCQkJCXBLZXktPktleSwKLQkJCQkJCTE2IC0gKGkgKiBwS2V5LT5LZXlMZW4pKTsKLQl9Ci0JZWxzZQotCXsKLQkJTmRpc01vdmVNZW1vcnkoY2tpcF9jaywgcEtleS0+S2V5LCBwS2V5LT5LZXlMZW4pOwotCX0KLSAgICBSVE1QQ2tpcE1pY0luaXQoJm1pY19jdHgsIGNraXBfY2spOwotICAgIFJUTVBNaWNVcGRhdGUoJm1pY19jdHgsIHBEQSwgTUFDX0FERFJfTEVOKTsgICAgICAgICAgICAvLyBNSUMgPC0tIERBCi0gICAgUlRNUE1pY1VwZGF0ZSgmbWljX2N0eCwgcFNBLCBNQUNfQUREUl9MRU4pOyAgICAgICAgICAgIC8vIE1JQyA8LS0gU0EKLSAgICBSVE1QTWljVXBkYXRlKCZtaWNfY3R4LCBiaWdldGhsZW4sIDIpOyAgICAgICAgICAgICAgICAgLy8gTUlDIDwtLSBwYXlsb2FkIGxlbmd0aCBzdGFydGluZyBmcm9tIENLSVAgU05BUAotICAgIFJUTVBNaWNVcGRhdGUoJm1pY19jdHgsIG1pY19zbmFwLCA4KTsgICAgICAgICAgICAgICAgICAvLyBNSUMgPC0tIHNuYXAgaGVhZGVyCi0gICAgUlRNUE1pY1VwZGF0ZSgmbWljX2N0eCwgcEFkLT5TdGFDZmcuVHhTRVEsIDQpOyAgIC8vIE1JQyA8LS0gVHhTRVEKLSAgICBSVE1QTWljVXBkYXRlKCZtaWNfY3R4LCBwUHJvdG8sIDIpOyAgICAgICAgICAgICAgICAgICAgLy8gTUlDIDwtLSBQcm90b2NvbAotCi0gICAgcFNyY0J1ZlZBICs9IExFTkdUSF84MDJfMzsKLSAgICBTcmNCdWZMZW4gLT0gTEVOR1RIXzgwMl8zOwotCi0gICAgLy8gTWljIDwtLSBvcmlnaW5hbCBwYXlsb2FkLiBsb29wIHVudGlsIGFsbCBwYXlsb2FkIHByb2Nlc3NlZAotICAgIGRvCi0gICAgewotICAgICAgICBpZiAoU3JjQnVmTGVuID4gMCkKLSAgICAgICAgICAgIFJUTVBNaWNVcGRhdGUoJm1pY19jdHgsIHBTcmNCdWZWQSwgU3JjQnVmTGVuKTsKLQotCQlOZGlzR2V0TmV4dEJ1ZmZlcihQYWNrZXRJbmZvLnBGaXJzdEJ1ZmZlciwgJlBhY2tldEluZm8ucEZpcnN0QnVmZmVyKTsKLSAgICAgICAgaWYgKFBhY2tldEluZm8ucEZpcnN0QnVmZmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBORElTX1FVRVJZX0JVRkZFUihQYWNrZXRJbmZvLnBGaXJzdEJ1ZmZlciwgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfSB3aGlsZSAoVFJVRSk7Ci0KLSAgICBSVE1QTWljRmluYWwoJm1pY19jdHgsIHBNSUMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIE1JQwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvcnRtcF9kYXRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9ydG1wX2RhdGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU5MTM2NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9ydG1wX2RhdGEuYworKysgL2Rldi9udWxsCkBAIC0xLDI2NjEgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlydG1wX2RhdGEuYwotCi0JQWJzdHJhY3Q6Ci0JRGF0YSBwYXRoIHN1YnJvdXRpbmVzCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotVk9JRCBTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0JUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCA9ICYocFJ4QmxrLT5SeEQpOwotCVBSWFdJX1NUUlVDCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7Ci0JVUNIQVIJCQkqcFRtcEJ1ZjsKLQotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCi0JewotCQkvLyBBbGwgRUFQb0wgZnJhbWVzIGhhdmUgdG8gcGFzcyB0byB1cHBlciBsYXllciAoZXguIFdQQV9TVVBQTElDQU5UIGRhZW1vbikKLQkJLy8gVEJEIDogcHJvY2VzcyBmcmFnbWVudGVkIEVBUG9sIGZyYW1lcwotCQl7Ci0JCQkvLyBJbiA4MDIuMXggbW9kZSwgaWYgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIEVBUC1TVUNDRVNTIHBhY2tldCwgdHVybiBvbiB0aGUgUG9ydFNlY3VyZWQgdmFyaWFibGUKLQkJCWlmICggcEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUgJiYKLQkJCQkgKEVBUF9DT0RFX1NVQ0NFU1MgPT0gV3BhQ2hlY2tFYXBDb2RlKHBBZCwgcFJ4QmxrLT5wRGF0YSwgcFJ4QmxrLT5EYXRhU2l6ZSwgTEVOR1RIXzgwMl8xX0gpKSkKLQkJCXsKLQkJCQlQVUNIQVIJS2V5OwotCQkJCVVDSEFSCUNpcGhlckFsZzsKLQkJCQlpbnQgICAgIGlkeCA9IDA7Ci0KLQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVAtU1VDQ0VTUyBQYWNrZXRcbiIpKTsKLQkJCQkvL3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0JCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOwotCi0gICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID09IEZBTFNFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWR4ID0gcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5SWQ7Ci0gICAgICAgICAgICAgICAgICAgIENpcGhlckFsZyA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLkNpcGhlckFsZzsKLQkJCQkJS2V5ID0gcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5OwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXlMZW4gPiAwKQotCQkJCXsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07Ci0KLQkJCQkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCi0JCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKLQotCQkJCQkJLy8gQXNzaWduIGdyb3VwIGtleSBpbmZvCi0JCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIE5VTEwpOwotCi0JCQkJCQkvLyBBc3NpZ24gcGFpcndpc2Uga2V5IGluZm8KLQkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgcEVudHJ5KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQkJCQkJLy8gRm9yIFByZXZlbnRpbmcgU2hhcmRLZXkgVGFibGUgaXMgY2xlYXJlZCBieSByZW1vdmUga2V5IHByb2NlZHVyZS4KLQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbjsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5LAotCQkJCQkJCQkJICAgcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5LAotCQkJCQkJCQkJICAgcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuKTsKLQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JZWxzZQotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQl7Ci0JCS8vIFNwZWNpYWwgREFUQSBmcmFtZSB0aGF0IGhhcyB0byBwYXNzIHRvIE1MTUUKLQkJLy8JIDEuIENpc2NvIEFpcm9uZXQgZnJhbWVzIGZvciBDQ1gyLiBXZSBuZWVkIHBhc3MgaXQgdG8gTUxNRSBmb3Igc3BlY2lhbCBwcm9jZXNzCi0JCS8vCSAyLiBFQVBPTCBoYW5kc2hha2luZyBmcmFtZXMgd2hlbiBkcml2ZXIgc3VwcGxpY2FudCBlbmFibGVkLCBwYXNzIHRvIE1MTUUgZm9yIHNwZWNpYWwgcHJvY2VzcwotCQl7Ci0JCQlwVG1wQnVmID0gcFJ4QmxrLT5wRGF0YSAtIExFTkdUSF84MDJfMTE7Ci0JCQlOZGlzTW92ZU1lbW9yeShwVG1wQnVmLCBwUnhCbGstPnBIZWFkZXIsIExFTkdUSF84MDJfMTEpOwotCQkJUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShwQWQsIHBSeFdJLT5XaXJlbGVzc0NsaUlELCBwVG1wQnVmLCBwUnhCbGstPkRhdGFTaXplICsgTEVOR1RIXzgwMl8xMSwgcFJ4V0ktPlJTU0kwLCBwUnhXSS0+UlNTSTEsIHBSeFdJLT5SU1NJMiwgcFJ4RC0+UGxjcFNpZ25hbCk7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiISEhIHJlcG9ydCBFQVBPTC9BSVJPTkVUIERBVEEgdG8gTUxNRSAobGVuPSVkKSAhISFcbiIsIHBSeEJsay0+RGF0YVNpemUpKTsKLQkJfQotCX0KLQotCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JcmV0dXJuOwotCi19Ci0KLVZPSUQgU1RBUnhEYXRhRnJhbWVBbm5vdW5jZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0KLQkvLyBub24tRUFQIGZyYW1lCi0JaWYgKCFSVE1QQ2hlY2tXUEFmcmFtZShwQWQsIHBFbnRyeSwgcFJ4QmxrLT5wRGF0YSwgcFJ4QmxrLT5EYXRhU2l6ZSwgRnJvbVdoaWNoQlNTSUQpKQotCXsKLQotCQl7Ci0JCQkvLyBkcm9wIGFsbCBub24tRUFQIERBVEEgZnJhbWUgYmVmb3JlCi0JCQkvLyB0aGlzIGNsaWVudCdzIFBvcnQtQWNjZXNzLUNvbnRyb2wgaXMgc2VjdXJlZAotCQkJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuV2VwKQotCQkJewotCQkJCS8vIHVuc3VwcG9ydGVkIGNpcGhlciBzdWl0ZQotCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKLQkJCQl7Ci0JCQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gZW5jcnlwdGlvbiBpbi11c2UgYnV0IHJlY2VpdmUgYSBub24tRUFQT0wgY2xlYXIgdGV4dCBmcmFtZSwgZHJvcCBpdAotCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpICYmCi0JCQkJCShwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQotCQkJCXsKLQkJCQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQlSWF9CTEtfQ0xFQVJfRkxBRyhwUnhCbGssIGZSWF9FQVApOwotCi0KLQkJaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FSQUxJTkspKQotCQl7Ci0JCQkvLyBOb3JtYWwgbGVnYWN5LCBBTVBEVSBvciBBTVNEVQotCQkJQ21tUnhub25SYWxpbmtGcmFtZUluZGljYXRlKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0KLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIEFSQUxJTksKLQkJCUNtbVJ4UmFsaW5rRnJhbWVJbmRpY2F0ZShwQWQsIHBFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCX0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJUlhfQkxLX0NMRUFSX0ZMQUcocFJ4QmxrLCBmUlhfRExTKTsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQl9Ci0JZWxzZQotCXsKLQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0VBUCk7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNUERVKSAmJiAocEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID09IDApKQotCQl7Ci0JCQlJbmRpY2F0ZV9BTVBEVV9QYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQkJfQotCQllbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCXsKLQkJCS8vIERldGVybWluIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgRUFQIGZyYW1lCi0JCQkvLyAgdG8gV1BBIHN0YXRlIG1hY2hpbmUgb3IgdXBwZXIgbGF5ZXIKLQkJCVNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKHBBZCwgcEVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQkJfQotCX0KLX0KLQotCi0vLyBGb3IgVEtJUCBmcmFtZSwgY2FsY3VsYXRlIHRoZSBNSUMgdmFsdWUKLUJPT0xFQU4gU1RBQ2hlY2tUa2lwTUlDVmFsdWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCi0JSU4JUlhfQkxLCQkJKnBSeEJsaykKLXsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOwotCVVDSEFSCQkJKnBEYXRhID0gcFJ4QmxrLT5wRGF0YTsKLQlVU0hPUlQJCQlEYXRhU2l6ZSA9IHBSeEJsay0+RGF0YVNpemU7Ci0JVUNIQVIJCQlVc2VyUHJpb3JpdHkgPSBwUnhCbGstPlVzZXJQcmlvcml0eTsKLQlQQ0lQSEVSX0tFWQkJcFdwYUtleTsKLQlVQ0hBUgkJCSpwREEsICpwU0E7Ci0KLQlwV3BhS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BSeEJsay0+cFJ4V0ktPktleUluZGV4XTsKLQotCXBEQSA9IHBIZWFkZXItPkFkZHIxOwotCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0lORlJBKSkKLQl7Ci0JCXBTQSA9IHBIZWFkZXItPkFkZHIzOwotCX0KLQllbHNlCi0JewotCQlwU0EgPSBwSGVhZGVyLT5BZGRyMjsKLQl9Ci0KLQlpZiAoUlRNUFRraXBDb21wYXJlTUlDVmFsdWUocEFkLAotCQkJCQkJCQlwRGF0YSwKLQkJCQkJCQkJcERBLAotCQkJCQkJCQlwU0EsCi0JCQkJCQkJCXBXcGFLZXktPlJ4TWljLAotCQkJCQkJCQlVc2VyUHJpb3JpdHksCi0JCQkJCQkJCURhdGFTaXplKSA9PSBGQUxTRSkKLQl7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIlJ4IE1JQyBWYWx1ZSBlcnJvciAyXG4iKSk7Ci0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCi0JCXsKLQkJCVdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KHBBZCwgKHBXcGFLZXktPlR5cGUgPT0gUEFJUldJU0VLRVkpID8gVFJVRSA6IEZBTFNFKTsKLQkJfQotCQllbHNlCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCQl7Ci0JCQlSVE1QUmVwb3J0TWljRXJyb3IocEFkLCBwV3BhS2V5KTsKLQkJfQotCi0JCS8vIHJlbGVhc2UgcGFja2V0Ci0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vLwotLy8gQWxsIFJ4IHJvdXRpbmVzIHVzZSBSWF9CTEsgc3RydWN0dXJlIHRvIGhhbmRlIHJ4IGV2ZW50cwotLy8gSXQgaXMgdmVyeSBpbXBvcnRhbnQgdG8gYnVpbGQgcFJ4QmxrIGF0dHJpYnV0ZXMKLS8vICAxLiBwSGVhZGVyIHBvaW50ZXIgdG8gODAyLjExIEhlYWRlcgotLy8gIDIuIHBEYXRhIHBvaW50ZXIgdG8gcGF5bG9hZCBpbmNsdWRpbmcgTExDIChqdXN0IHNraXAgSGVhZGVyKQotLy8gIDMuIHNldCBwYXlsb2FkIHNpemUgaW5jbHVkaW5nIExMQyB0byBEYXRhU2l6ZQotLy8gIDQuIHNldCBzb21lIGZsYWdzIHdpdGggUlhfQkxLX1NFVF9GTEFHKCkKLS8vCi1WT0lEIFNUQUhhbmRsZVJ4RGF0YUZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGspCi17Ci0JUFJUMjhYWF9SWERfU1RSVUMJCQkJcFJ4RCA9ICYocFJ4QmxrLT5SeEQpOwotCVBSWFdJX1NUUlVDCQkJCQkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOwotCVBIRUFERVJfODAyXzExCQkJCQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOwotCVBORElTX1BBQ0tFVAkJCQkJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7Ci0JQk9PTEVBTgkJCQkJCQliRnJhZ21lbnQgPSBGQUxTRTsKLQlNQUNfVEFCTEVfRU5UUlkJCQkJKnBFbnRyeSA9IE5VTEw7Ci0JVUNIQVIJCQkJCQkJRnJvbVdoaWNoQlNTSUQgPSBCU1MwOwotCVVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlclByaW9yaXR5ID0gMDsKLQotCXsKLQkJLy8gYmVmb3JlIExJTksgVVAsIGFsbCBEQVRBIGZyYW1lcyBhcmUgcmVqZWN0ZWQKLQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JCXsKLQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCXJldHVybjsKLQkJfQotCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCS8vaWYgKChwSGVhZGVyLT5GQy5GckRzID09IDApICYmIChwSGVhZGVyLT5GQy5Ub0RzID09IDApKQotCQlpZiAoUlRNUFJjdkZyYW1lRExTQ2hlY2socEFkLCBwSGVhZGVyLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LCBwUnhEKSkKLQkJewotCQkJcmV0dXJuOwotCQl9Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQkJLy8gRHJvcCBub3QgbXkgQlNTIGZyYW1lcwotCQlpZiAocFJ4RC0+TXlCc3MgPT0gMCkKLQkJewotCQkJewotCQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCsrOwotCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlICYmIChwSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkpCi0JCXsKLQkJCVVDSEFSICpwRGF0YTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0lORk8sKCJiQVBTRENhcGFibGVcbiIpKTsKLQotCQkJLy8gUW9zIGJpdCA0Ci0JCQlwRGF0YSA9IChQVUNIQVIpcEhlYWRlciArIExFTkdUSF84MDJfMTE7Ci0JCQlpZiAoKCpwRGF0YSA+PiA0KSAmIDB4MDEpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfSU5GTywoIlJ4RG9uZS0gUmN2IEVPU1AgZnJhbWUsIGRyaXZlciBtYXkgZmFsbCBpbnRvIHNsZWVwXG4iKSk7Ci0JCQkJcEFkLT5Db21tb25DZmcuYkluU2VydmljZVBlcmlvZCA9IEZBTFNFOwotCi0JCQkJLy8gRm9yY2UgZHJpdmVyIHRvIGZhbGwgaW50byBzbGVlcCBtb2RlIHdoZW4gcmN2IEVPU1AgZnJhbWUKLQkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JCQkJewotCQkJCQlVU0hPUlQgIFRidHROdW1Ub05leHRXYWtlVXA7Ci0JCQkJCVVTSE9SVCAgTmV4dER0aW0gPSBwQWQtPlN0YUNmZy5EdGltUGVyaW9kOwotCQkJCQlVTE9ORyAgIE5vdzsKLQotCQkJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCQkJCQlOZXh0RHRpbSAtPSAoVVNIT1JUKShOb3cgLSBwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lKS9wQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2Q7Ci0KLQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudDsKLQkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKSAmJiAoVGJ0dE51bVRvTmV4dFdha2VVcCA+IE5leHREdGltKSkKLQkJCQkJCVRidHROdW1Ub05leHRXYWtlVXAgPSBOZXh0RHRpbTsKLQotCQkJCQlSVE1QX1NFVF9QU01fQklUKHBBZCwgUFdSX1NBVkUpOwotCQkJCQkvLyBpZiBXTU0tQVBTRCBpcyBmYWlsZWQsIHRyeSB0byBkaXNhYmxlIGZvbGxvd2luZyBsaW5lCi0JCQkJCUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoKHBIZWFkZXItPkZDLk1vcmVEYXRhKSAmJiAocEFkLT5Db21tb25DZmcuYkluU2VydmljZVBlcmlvZCkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZW5kaW5nIGFub3RoZXIgdHJpZ2dlciBmcmFtZSB3aGVuIE1vcmUgRGF0YSBiaXQgaXMgc2V0IHRvIDFcbiIpKTsKLQkJCX0KLQkJfQotCi0JCS8vIERyb3AgTlVMTCwgQ0YtQUNLKG5vIGRhdGEpLCBDRi1QT0xMKG5vIGRhdGEpLCBhbmQgQ0YtQUNLK0NGLVBPTEwobm8gZGF0YSkgZGF0YSBmcmFtZQotCQlpZiAoKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA0KSkgLy8gYml0IDIgOiBubyBEQVRBCi0JCXsKLQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCXJldHVybjsKLQkJfQotCi0JICAgIC8vIERyb3Agbm90IG15IEJTUyBmcmFtZSAod2UgY2FuIG5vdCBvbmx5IGNoZWNrIHRoZSBNeUJzcyBiaXQgaW4gUnhEKQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCSAgICBpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQotCSAgICB7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JCWlmIChJTkZSQV9PTihwQWQpKQotCQl7Ci0JCQkvLyBJbmZyYXN0cnVjdHVyZSBtb2RlLCBjaGVjayBhZGRyZXNzIDIgZm9yIEJTU0lECi0JCQlpZiAoIVJUTVBFcXVhbE1lbW9yeSgmcEhlYWRlci0+QWRkcjIsICZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgNikpCi0JCQl7Ci0JCQkJLy8gUmVjZWl2ZSBmcmFtZSBub3QgbXkgQlNTSUQKLQkgICAgICAgICAgICAvLyByZWxlYXNlIHBhY2tldAotCSAgICAgICAgICAgIFJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQllbHNlCS8vIEFkLUhvYyBtb2RlIG9yIE5vdCBhc3NvY2lhdGVkCi0JCXsKLQkJCS8vIEFkLUhvYyBtb2RlLCBjaGVjayBhZGRyZXNzIDMgZm9yIEJTU0lECi0JCQlpZiAoIVJUTVBFcXVhbE1lbW9yeSgmcEhlYWRlci0+QWRkcjMsICZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgNikpCi0JCQl7Ci0JCQkJLy8gUmVjZWl2ZSBmcmFtZSBub3QgbXkgQlNTSUQKLQkgICAgICAgICAgICAvLyByZWxlYXNlIHBhY2tldAotCSAgICAgICAgICAgIFJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCSAgICB9Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQkJLy8KLQkJLy8gZmluZCBwRW50cnkKLQkJLy8KLQkJaWYgKHBSeFdJLT5XaXJlbGVzc0NsaUlEIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JCXsKLQkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BSeFdJLT5XaXJlbGVzc0NsaUlEXTsKLQotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gMS4gcmVsZWFzZSBwYWNrZXQgaWYgaW5mcmEgbW9kZQotCQkJLy8gMi4gbmV3IGEgcEVudHJ5IGlmIGFkLWhvYyBtb2RlCi0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGluZnJhIG9yIGFkLWhvYwotCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJewotCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0lORlJBKTsKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJCWlmICgocEhlYWRlci0+RkMuRnJEcyA9PSAwKSAmJiAocEhlYWRlci0+RkMuVG9EcyA9PSAwKSkKLQkJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfRExTKTsKLQkJCWVsc2UKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkJCUFTU0VSVChwUnhXSS0+V2lyZWxlc3NDbGlJRCA9PSBCU1NJRF9XQ0lEKTsKLQkJfQotCi0JCS8vIGNoZWNrIEF0aGVyb3MgQ2xpZW50Ci0JCWlmICgocEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9PSBGQUxTRSkgJiYgIChwUnhELT5BTVBEVSA9PSAxKSAmJiAocEhlYWRlci0+RkMuUmV0cnkgKSkKLQkJewotCQkJcEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9IFRSVUU7Ci0JCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJDdXJyZW50QXRoZXJvcyA9IFRSVUU7Ci0JCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJMYXN0QXRoZXJvcyA9IFRSVUU7Ci0JCQlpZiAoIVNUQV9BRVNfT04ocEFkKSkKLQkJCXsKLQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDgsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgRkFMU0UpOwotCQkJfQotCQl9Ci0JfQotCi0JcFJ4QmxrLT5wRGF0YSA9IChVQ0hBUiAqKXBIZWFkZXI7Ci0KLQkvLwotCS8vIHVwZGF0ZSBSeEJsay0+cERhdGEsIERhdGFTaXplCi0JLy8gODAyLjExIEhlYWRlciwgUU9TLCBIVEMsIEh3IFBhZGRpbmcKLQkvLwotCi0JLy8gMS4gc2tpcCA4MDIuMTEgSEVBREVSCi0JewotCQlwUnhCbGstPnBEYXRhICs9IExFTkdUSF84MDJfMTE7Ci0JCXBSeEJsay0+RGF0YVNpemUgLT0gTEVOR1RIXzgwMl8xMTsKLQl9Ci0KLQkvLyAyLiBRT1MKLQlpZiAocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpCi0JewotCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfUU9TKTsKLQkJVXNlclByaW9yaXR5ID0gKihwUnhCbGstPnBEYXRhKSAmIDB4MGY7Ci0JCS8vIGJpdCA3IGluIFFvUyBDb250cm9sIGZpZWxkIHNpZ25hbHMgdGhlIEhUIEEtTVNEVSBmb3JtYXQKLQkJaWYgKCgqcFJ4QmxrLT5wRGF0YSkgJiAweDgwKQotCQl7Ci0JCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfQU1TRFUpOwotCQl9Ci0KLQkJLy8gc2tpcCBRT1MgY29udG9ybCBmaWVsZAotCQlwUnhCbGstPnBEYXRhICs9IDI7Ci0JCXBSeEJsay0+RGF0YVNpemUgLT0yOwotCX0KLQlwUnhCbGstPlVzZXJQcmlvcml0eSA9IFVzZXJQcmlvcml0eTsKLQotCS8qIGNoZWNrIGlmIG5lZWQgdG8gcmVzZW5kIFBTIFBvbGwgd2hlbiByZWNlaXZlZCBwYWNrZXQgd2l0aCBNb3JlRGF0YSA9IDEgKi8KLQlpZiAoKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgJiYgKHBIZWFkZXItPkZDLk1vcmVEYXRhID09IDEpKQotCXsKLQkJaWYgKCgoKFVzZXJQcmlvcml0eSA9PSAwKSB8fCAoVXNlclByaW9yaXR5ID09IDMpKSAmJgotCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSA9PSAwKSB8fAotCQkJKCgoVXNlclByaW9yaXR5ID09IDEpIHx8IChVc2VyUHJpb3JpdHkgPT0gMikpICYmCi0JCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLID09IDApIHx8Ci0JCQkoKChVc2VyUHJpb3JpdHkgPT0gNCkgfHwgKFVzZXJQcmlvcml0eSA9PSA1KSkgJiYKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPT0gMCkgfHwKLQkJCSgoKFVzZXJQcmlvcml0eSA9PSA2KSB8fCAoVXNlclByaW9yaXR5ID09IDcpKSAmJgotCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTyA9PSAwKSkKLQkJewotCQkJLyogbm9uLVVBUFNEIGRlbGl2ZXJ5LWVuYWJsZWQgQUMgKi8KLQkJCVJUTVBfUFNfUE9MTF9FTlFVRVVFKHBBZCk7Ci0JCX0KLQl9Ci0KLQkvLyAzLiBPcmRlciBiaXQ6IEEtUmFsaW5rIG9yIEhUQysKLQlpZiAocEhlYWRlci0+RkMuT3JkZXIpCi0JewotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLQkJaWYgKChwUnhXSS0+UEhZTU9ERSA8PSBNT0RFX09GRE0pICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpKQotCQl7Ci0JCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfQVJBTElOSyk7Ci0JCX0KLQkJZWxzZQotI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KLQkJewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0hUQyk7Ci0JCQkvLyBza2lwIEhUQyBjb250b3JsIGZpZWxkCi0JCQlwUnhCbGstPnBEYXRhICs9IDQ7Ci0JCQlwUnhCbGstPkRhdGFTaXplIC09IDQ7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCX0KLQl9Ci0KLQkvLyA0LiBza2lwIEhXIHBhZGRpbmcKLQlpZiAocFJ4RC0+TDJQQUQpCi0JewotCQkvLyBqdXN0IG1vdmUgcERhdGEgcG9pbnRlcgotCQkvLyBiZWNhdXNlIERhdGFTaXplIGV4Y2x1ZGluZyBIVyBwYWRkaW5nCi0JCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9QQUQpOwotCQlwUnhCbGstPnBEYXRhICs9IDI7Ci0JfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JaWYgKHBSeEQtPkJBKQotCXsKLQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0FNUERVKTsKLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQotCS8vCi0JLy8gQ2FzZSBJICBQcm9jZXNzIEJyb2FkY2FzdCAmIE11bHRpY2FzdCBkYXRhIGZyYW1lCi0JLy8KLQlpZiAocFJ4RC0+QmNhc3QgfHwgcFJ4RC0+TWNhc3QpCi0JewotCQlJTkNfQ09VTlRFUjY0KHBBZC0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudCk7Ci0KLQkJLy8gRHJvcCBNY2FzdC9CY2FzdCBmcmFtZSB3aXRoIGZyYWdtZW50IGJpdCBvbgotCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcpCi0JCXsKLQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEZpbHRlciBvdXQgQmNhc3QgZnJhbWUgd2hpY2ggQVAgcmVsYXllZCBmb3IgdXMKLQkJaWYgKHBIZWFkZXItPkZDLkZyRHMgJiYgTUFDX0FERFJfRVFVQUwocEhlYWRlci0+QWRkcjMsIHBBZC0+Q3VycmVudEFkZHJlc3MpKQotCQl7Ci0JCQkvLyByZWxlYXNlIHBhY2tldAotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZSBpZiAocFJ4RC0+VTJNKQotCXsKLQkJcEFkLT5MYXN0UnhSYXRlID0gKFVTSE9SVCkoKHBSeFdJLT5NQ1MpICsgKHBSeFdJLT5CVyA8PDcpICsgKHBSeFdJLT5TaG9ydEdJIDw8OCkrIChwUnhXSS0+UEhZTU9ERSA8PDE0KSkgOwotCi0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLSAgICAgICAgaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfRExTKSkKLQkJewotCQkJTUFDX1RBQkxFX0VOVFJZICpwRGxzRW50cnkgPSBOVUxMOwotCi0JCQlwRGxzRW50cnkgPSBEbHNFbnRyeVRhYmxlTG9va3VwQnlXY2lkKHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIHBIZWFkZXItPkFkZHIyLCBUUlVFKTsKLQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBpZihwRGxzRW50cnkpCi0JCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcERsc0VudHJ5LT5Sc3NpU2FtcGxlLCBwUnhXSSk7Ci0JCX0KLQkJZWxzZQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCQlpZiAoQURIT0NfT04ocEFkKSkKLQkJewotCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyLT5BZGRyMik7Ci0JCQlpZiAocEVudHJ5KQotCQkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwRW50cnktPlJzc2lTYW1wbGUsIHBSeFdJKTsKLQkJfQotCi0KLQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHBSeFdJKTsKLQotCQlwQWQtPlN0YUNmZy5MYXN0U05SMCA9IChVQ0hBUikocFJ4V0ktPlNOUjApOwotCQlwQWQtPlN0YUNmZy5MYXN0U05SMSA9IChVQ0hBUikocFJ4V0ktPlNOUjEpOwotCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0RhdGFDbnQrKzsKLQotCi0JaWYgKCEoKHBIZWFkZXItPkZyYWcgPT0gMCkgJiYgKHBIZWFkZXItPkZDLk1vcmVGcmFnID09IDApKSkKLQl7Ci0JCS8vIHJlLWFzc2VtYmxlIHRoZSBmcmFnbWVudGVkIHBhY2tldHMKLQkJLy8gcmV0dXJuIGNvbXBsZXRlIGZyYW1lIChwUnhQYWNrZXQpIG9yIE5VTEwKLQkJYkZyYWdtZW50ID0gVFJVRTsKLQkJcFJ4UGFja2V0ID0gUlRNUERlRnJhZ21lbnREYXRhRnJhbWUocEFkLCBwUnhCbGspOwotCX0KLQotCWlmIChwUnhQYWNrZXQpCi0JewotCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwUnhXSS0+V2lyZWxlc3NDbGlJRF07Ci0KLQkJLy8gcHJvY2VzcyBjb21wbGV0ZSBmcmFtZQotCQlpZiAoYkZyYWdtZW50ICYmIChwUnhELT5EZWNyeXB0ZWQpICYmIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSkKLQkJewotCQkJLy8gTWludXMgTUlDIGxlbmd0aAotCQkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSA4OwotCi0JCQkvLyBGb3IgVEtJUCBmcmFtZSwgY2FsY3VsYXRlIHRoZSBNSUMgdmFsdWUKLQkJCWlmIChTVEFDaGVja1RraXBNSUNWYWx1ZShwQWQsIHBFbnRyeSwgcFJ4QmxrKSA9PSBGQUxTRSkKLQkJCXsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlTVEFSeERhdGFGcmFtZUFubm91bmNlKHBBZCwgcEVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQkJCXJldHVybjsKLQl9Ci0JZWxzZQotCXsKLQkJLy8ganVzdCByZXR1cm4KLQkJLy8gYmVjYXVzZSBSVE1QRGVGcmFnbWVudERhdGFGcmFtZSgpIHdpbGwgcmVsZWFzZSByeCBwYWNrZXQsCi0JCS8vIGlmIHBhY2tldCBpcyBmcmFnbWVudGVkCi0JCXJldHVybjsKLQl9Ci0JfQotCi0JQVNTRVJUKDApOwotCS8vIHJlbGVhc2UgcGFja2V0Ci0JUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci19Ci0KLVZPSUQgU1RBSGFuZGxlUnhNZ210RnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaykKLXsKLQlQUlQyOFhYX1JYRF9TVFJVQwlwUnhEID0gJihwUnhCbGstPlJ4RCk7Ci0JUFJYV0lfU1RSVUMJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOwotCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKLQotCWRvCi0JewotCi0KLQkJLyogY2hlY2sgaWYgbmVlZCB0byByZXNlbmQgUFMgUG9sbCB3aGVuIHJlY2VpdmVkIHBhY2tldCB3aXRoIE1vcmVEYXRhID0gMSAqLwotCQlpZiAoKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgJiYgKHBIZWFkZXItPkZDLk1vcmVEYXRhID09IDEpKQotCQl7Ci0JCQkvKiBmb3IgVUFQU0QsIGFsbCBtYW5hZ2VtZW50IGZyYW1lcyB3aWxsIGJlIFZPIHByaW9yaXR5ICovCi0JCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTyA9PSAwKQotCQkJewotCQkJCS8qIG5vbi1VQVBTRCBkZWxpdmVyeS1lbmFibGVkIEFDICovCi0JCQkJUlRNUF9QU19QT0xMX0VOUVVFVUUocEFkKTsKLQkJCX0KLQkJfQotCi0JCS8qIFRPRE86IGlmIE1vcmVEYXRhID09IDAsIHN0YXRpb24gY2FuIGdvIHRvIHNsZWVwICovCi0KLQotCQkvLyBXZSBzaG91bGQgY29sbGVjdCBSU1NJIG5vdCBvbmx5IFUyTSBkYXRhIGJ1dCBhbHNvIG15IGJlYWNvbgotCQlpZiAoKHBIZWFkZXItPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9CRUFDT04pICYmIChNQUNfQUREUl9FUVVBTCgmcEFkLT5Db21tb25DZmcuQnNzaWQsICZwSGVhZGVyLT5BZGRyMikpCi0JCQkmJiAocEFkLT5SeEFudC5FdmFsdWF0ZVBlcmlvZCA9PSAwKSkKLQkJewotCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHBSeFdJKTsKLQotCQkJcEFkLT5TdGFDZmcuTGFzdFNOUjAgPSAoVUNIQVIpKHBSeFdJLT5TTlIwKTsKLQkJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIxID0gKFVDSEFSKShwUnhXSS0+U05SMSk7Ci0JCX0KLQotI2lmZGVmIFJUMzB4eAotI2lmZGVmIEFOVF9ESVZFUlNJVFlfU1VQUE9SVAotCQkvLyBjb2xsZWN0IHJzc2kgaW5mb3JtYXRpb24gZm9yIGFudGVubmEgZGl2ZXJzaXR5Ci0JCWlmICgocEFkLT5OaWNDb25maWcyLmZpZWxkLkFudERpdmVyc2l0eSkgJiYKLQkJCShwQWQtPkNvbW1vbkNmZy5iUnhBbnREaXZlcnNpdHkgIT0gQU5UX0RJVkVSU0lUWV9ESVNBQkxFKSkKLQkJewotCQkJaWYgKChwUnhELT5VMk0pIHx8ICgocEhlYWRlci0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX0JFQUNPTikgJiYgKE1BQ19BRERSX0VRVUFMKCZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgJnBIZWFkZXItPkFkZHIyKSkpKQotCQkJewotCQkJCQlDT0xMRUNUX1JYX0FOVEVOTkFfQVZFUkFHRV9SU1NJKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIChVQ0hBUilwUnhXSS0+UlNTSTAsIFJTU0lfMCksIDApOyAvL05vdGU6IFJTU0kyIG5vdCB1c2VkIG9uIFJUNzMKLQkJCQkJcEFkLT5TdGFDZmcuTnVtT2ZBdmdSc3NpU2FtcGxlICsrOwotCQkJfQotCQl9Ci0jZW5kaWYgLy8gQU5UX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQkJLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCi0JCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCi0JCXsKLQkJCURCR1BSSU5UX0VSUigoIlNUQUhhbmRsZVJ4TWdtdEZyYW1lOiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlZCBcbiIsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQpKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShwQWQsIHBSeFdJLT5XaXJlbGVzc0NsaUlELCBwSGVhZGVyLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LAotCQkJCQkJCQkJcFJ4V0ktPlJTU0kwLCBwUnhXSS0+UlNTSTEsIHBSeFdJLT5SU1NJMiwgcFJ4RC0+UGxjcFNpZ25hbCk7Ci0JfSB3aGlsZSAoRkFMU0UpOwotCi0JUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci19Ci0KLVZPSUQgU1RBSGFuZGxlUnhDb250cm9sRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaykKLXsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlQUlhXSV9TVFJVQwkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCVBIRUFERVJfODAyXzExCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7Ci0JUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OwotCi0Jc3dpdGNoIChwSGVhZGVyLT5GQy5TdWJUeXBlKQotCXsKLQkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDS19SRVE6Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQl7Ci0JCQkJQ250bEVucXVldWVGb3JSZWN2KHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50KSwgKFBGUkFNRV9CQV9SRVEpcEhlYWRlcik7Ci0JCQl9Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDSzoKLQkJY2FzZSBTVUJUWVBFX0FDSzoKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KLQotCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlQcm9jZXNzIFJ4RG9uZSBpbnRlcnJ1cHQsIHJ1bm5pbmcgaW4gRFBDIGxldmVsCi0KLQlBcmd1bWVudHM6Ci0JCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQkJVGhpcyByb3V0aW5lIGhhcyB0byBtYWludGFpbiBSeCByaW5nIHJlYWQgcG9pbnRlci4KLQkJTmVlZCB0byBjb25zaWRlciBRT1MgREFUQSBmb3JtYXQgd2hlbiBjb252ZXJ0aW5nIHRvIDgwMi4zCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JQk9PTEVBTgkJCWFyZ2MpCi17Ci0JTkRJU19TVEFUVVMJCQlTdGF0dXM7Ci0JVUlOVDMyCQkJUnhQcm9jZXNzZWQsIFJ4UGVuZGluZzsKLQlCT09MRUFOCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKLQlSVDI4WFhfUlhEX1NUUlVDCSpwUnhEOwotCVVDSEFSCQkJKnBEYXRhOwotCVBSWFdJX1NUUlVDCQlwUnhXSTsKLQlQTkRJU19QQUNLRVQJcFJ4UGFja2V0OwotCVBIRUFERVJfODAyXzExCXBIZWFkZXI7Ci0JUlhfQkxLCQkJUnhDZWxsOwotCi0JUnhQcm9jZXNzZWQgPSBSeFBlbmRpbmcgPSAwOwotCi0JLy8gcHJvY2VzcyB3aG9sZSByeCByaW5nCi0Jd2hpbGUgKDEpCi0JewotCi0JCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkgfHwKLQkJCSFSVE1QX1RFU1RfRkxBRyhwQWQsZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCi0JCXsKLQkJCWJyZWFrOwotCQl9Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJaWYgKFJ4UHJvY2Vzc2VkKysgPiBNQVhfUlhfUFJPQ0VTU19DTlQpCi0JCXsKLQkJCS8vIG5lZWQgdG8gcmVzY2hlZHVsZSByeCBoYW5kbGUKLQkJCWJSZXNjaGVkdWxlID0gVFJVRTsKLQkJCWJyZWFrOwotCQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQkJUnhQcm9jZXNzZWQgKys7IC8vIHRlc3QKLQotCQkvLyAxLiBhbGxvY2F0ZSBhIG5ldyBkYXRhIHBhY2tldCBpbnRvIHJ4IHJpbmcgdG8gcmVwbGFjZSByZWNlaXZlZCBwYWNrZXQKLQkJLy8gICAgdGhlbiBwcm9jZXNzaW5nIHRoZSByZWNlaXZlZCBwYWNrZXQKLQkJLy8gMi4gdGhlIGNhbGxlZSBtdXN0IHRha2UgY2hhcmdlIG9mIHJlbGVhc2Ugb2YgcGFja2V0Ci0JCS8vIDMuIEFzIGZhciBhcyBkcml2ZXIgaXMgY29uY2VybmVkICwKLQkJLy8gICAgdGhlIHJ4IHBhY2tldCBtdXN0Ci0JCS8vICAgICAgYS4gYmUgaW5kaWNhdGVkIHRvIHVwcGVyIGxheWVyIG9yCi0JCS8vICAgICAgYi4gYmUgcmVsZWFzZWQgaWYgaXQgaXMgZGlzY2FyZGVkCi0JCXBSeFBhY2tldCA9IEdldFBhY2tldEZyb21SeFJpbmcocEFkLCAmKFJ4Q2VsbC5SeEQpLCAmYlJlc2NoZWR1bGUsICZSeFBlbmRpbmcpOwotCQlpZiAocFJ4UGFja2V0ID09IE5VTEwpCi0JCXsKLQkJCS8vIG5vIG1vcmUgcGFja2V0IHRvIHByb2Nlc3MKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gZ2V0IHJ4IHJpbmcgZGVzY3JpcHRvcgotCQlwUnhEID0gJihSeENlbGwuUnhEKTsKLQkJLy8gZ2V0IHJ4IGRhdGEgYnVmZmVyCi0JCXBEYXRhCT0gR0VUX09TX1BLVF9EQVRBUFRSKHBSeFBhY2tldCk7Ci0JCXBSeFdJCT0gKFBSWFdJX1NUUlVDKSBwRGF0YTsKLQkJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgKHBEYXRhK1JYV0lfU0laRSkgOwotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCSAgICBSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBIZWFkZXIsIERJUl9SRUFELCBUUlVFKTsKLQkJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFJ4V0ksIFRZUEVfUlhXSSk7Ci0jZW5kaWYKLQotCQkvLyBidWlsZCBSeENlbGwKLQkJUnhDZWxsLnBSeFdJID0gcFJ4V0k7Ci0JCVJ4Q2VsbC5wSGVhZGVyID0gcEhlYWRlcjsKLQkJUnhDZWxsLnBSeFBhY2tldCA9IHBSeFBhY2tldDsKLQkJUnhDZWxsLnBEYXRhID0gKFVDSEFSICopIHBIZWFkZXI7Ci0JCVJ4Q2VsbC5EYXRhU2l6ZSA9IHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQ7Ci0JCVJ4Q2VsbC5GbGFncyA9IDA7Ci0KLQkJLy8gSW5jcmVhc2UgVG90YWwgcmVjZWl2ZSBieXRlIGNvdW50ZXIgYWZ0ZXIgcmVhbCBkYXRhIHJlY2VpdmVkIG5vIG1hdGVyIGFueSBlcnJvciBvciBub3QKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5SZWNlaXZlZEJ5dGVDb3VudCArPSAgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSZWNlaXZlZEJ5dGVDb3VudCArPSAgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50ICsrOwotCi0JCUlOQ19DT1VOVEVSNjQocEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50KTsKLQotCQlpZiAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA8IDE0KQotCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQotICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWQpKQotCQl7Ci0gICAgICAgICAgICBzZW5kX21vbml0b3JfcGFja2V0cyhwQWQsICZSeENlbGwpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUoKSBpcyBjYWxsZWQgaW4gcnR1c2JfYnVsay5jICovCi0jaWZkZWYgUkFMSU5LX0FURQotCQlpZiAoQVRFX09OKHBBZCkpCi0JCXsKLQkJCXBBZC0+YXRlLlJ4Q250UGVyU2VjKys7Ci0JCQlBVEVTYW1wbGVSc3NpKHBBZCwgcFJ4V0kpOwotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JCQlpZiAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBUUlVFKQotCQkJewotCQkJCS8qICgqcFJ4RCkgaGFzIGJlZW4gc3dhcHBlZCBpbiBHZXRQYWNrZXRGcm9tUnhSaW5nKCkgKi8KLQkJCQlBVEVfUUFfU3RhdGlzdGljcyhwQWQsIHBSeFdJLCBwUnhELAlwSGVhZGVyKTsKLQkJCX0KLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQljb250aW51ZTsKLQkJfQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCQkvLyBDaGVjayBmb3IgYWxsIFJ4RCBlcnJvcnMKLQkJU3RhdHVzID0gUlRNUENoZWNrUnhFcnJvcihwQWQsIHBIZWFkZXIsIHBSeFdJLCBwUnhEKTsKLQotCQkvLyBIYW5kbGUgdGhlIHJlY2VpdmVkIGZyYW1lCi0JCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJc3dpdGNoIChwSGVhZGVyLT5GQy5UeXBlKQotCQkJewotCQkJCS8vIENBU0UgSSwgcmVjZWl2ZSBhIERBVEEgZnJhbWUKLQkJCQljYXNlIEJUWVBFX0RBVEE6Ci0JCQkJewotCQkJCQkvLyBwcm9jZXNzIERBVEEgZnJhbWUKLQkJCQkJU1RBSGFuZGxlUnhEYXRhRnJhbWUocEFkLCAmUnhDZWxsKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkJLy8gQ0FTRSBJSSwgcmVjZWl2ZSBhIE1HTVQgZnJhbWUKLQkJCQljYXNlIEJUWVBFX01HTVQ6Ci0JCQkJewotCQkJCQlTVEFIYW5kbGVSeE1nbXRGcmFtZShwQWQsICZSeENlbGwpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCQkvLyBDQVNFIElJSS4gcmVjZWl2ZSBhIENOVEwgZnJhbWUKLQkJCQljYXNlIEJUWVBFX0NOVEw6Ci0JCQkJewotCQkJCQlTVEFIYW5kbGVSeENvbnRyb2xGcmFtZShwQWQsICZSeENlbGwpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCQkvLyBkaXNjYXJkIG90aGVyIHR5cGUKLQkJCQlkZWZhdWx0OgotCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvdW50ZXJzODAyMy5SeEVycm9ycysrOwotCQkJLy8gZGlzY2FyZCB0aGlzIGZyYW1lCi0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJfQotCX0KLQotCXJldHVybiBiUmVzY2hlZHVsZTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCUFzaWNGb3JjZVdha2V1cChwQWQsIEZBTFNFKTsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBFYXJseSBjaGVja2luZyBhbmQgT1MtZGVwZW5lZCBwYXJzaW5nIGZvciBUeCBwYWNrZXQgc2VuZCB0byBvdXIgU1RBIGRyaXZlci4KLQotQXJndW1lbnRzOgotICAgIE5ESVNfSEFORExFCQlNaW5pcG9ydEFkYXB0ZXJDb250ZXh0CVBvaW50ZXIgcmVmZXIgdG8gdGhlIGRldmljZSBoYW5kbGUsIGkuZS4sIHRoZSBwQWQuCi0JUFBORElTX1BBQ0tFVAlwcFBhY2tldEFycmF5CQkJVGhlIHBhY2tldCBhcnJheSBuZWVkIHRvIGRvIHRyYW5zbWlzc2lvbi4KLQlVSU5UCQkJTnVtYmVyT2ZQYWNrZXRzCQkJTnVtYmVyIG9mIHBhY2tldCBpbiBwYWNrZXQgYXJyYXkuCi0KLVJldHVybiBWYWx1ZToKLQlOT05FCi0KLU5vdGU6Ci0JVGhpcyBmdW5jdGlvbiBkbyBlYXJseSBjaGVja2luZyBhbmQgY2xhc3NpZmljYXRpb24gZm9yIHNlbmQtb3V0IHBhY2tldC4KLQlZb3Ugb25seSBjYW4gcHV0IE9TLWRlcGVuZWQgJiBTVEEgcmVsYXRlZCBjb2RlIGluIGhlcmUuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFNUQVNlbmRQYWNrZXRzKAotCUlOCU5ESVNfSEFORExFCQlNaW5pcG9ydEFkYXB0ZXJDb250ZXh0LAotCUlOCVBQTkRJU19QQUNLRVQJcHBQYWNrZXRBcnJheSwKLQlJTglVSU5UCQkJTnVtYmVyT2ZQYWNrZXRzKQotewotCVVJTlQJCQlJbmRleDsKLQlQUlRNUF9BREFQVEVSCXBBZCA9IChQUlRNUF9BREFQVEVSKSBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0OwotCVBORElTX1BBQ0tFVAlwUGFja2V0OwotCUJPT0xFQU4JCQlhbGxvd1RvU2VuZCA9IEZBTFNFOwotCi0KLQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOdW1iZXJPZlBhY2tldHM7IEluZGV4KyspCi0JewotCQlwUGFja2V0ID0gcHBQYWNrZXRBcnJheVtJbmRleF07Ci0KLQkJZG8KLQkJewotCi0JCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAotCQkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSB8fAotCQkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQotCQkJewotCQkJCS8vIERyb3Agc2VuZCByZXF1ZXN0IHNpbmNlIGhhcmR3YXJlIGlzIGluIHJlc2V0IHN0YXRlCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAoIUlORlJBX09OKHBBZCkgJiYgIUFESE9DX09OKHBBZCkpCi0JCQl7Ci0JCQkJLy8gRHJvcCBzZW5kIHJlcXVlc3Qgc2luY2UgdGhlcmUgYXJlIG5vIHBoeXNpY2FsIGNvbm5lY3Rpb24geWV0Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIFJlY29yZCB0aGF0IG9yaWduYWwgcGFja2V0IHNvdXJjZSBpcyBmcm9tIE5ESVMgbGF5ZXIsc28gdGhhdAotCQkJCS8vIGxhdGVyIG9uIGRyaXZlciBrbm93cyBob3cgdG8gcmVsZWFzZSB0aGlzIE5ESVMgUEFDS0VUCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7Ci0JCQkJUFVDSEFSIHBTcmNCdWZWQSA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKLQotCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcFNyY0J1ZlZBKTsKLQkJCQlpZiAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkpCi0JCQkJewotCQkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCBwRW50cnktPkFpZCk7Ci0JCQkJfQotCQkJCWVsc2UKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCAwKTsgLy8gdGhpcyBmaWVsZCBpcyB1c2VsZXNzIHdoZW4gaW4gU1RBIG1vZGUKLQkJCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKHBQYWNrZXQsIFBLVFNSQ19ORElTKTsKLQkJCQlORElTX1NFVF9QQUNLRVRfU1RBVFVTKHBQYWNrZXQsIE5ESVNfU1RBVFVTX1BFTkRJTkcpOwotCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuUGVuZGluZ05kaXNQYWNrZXRDb3VudCsrOwotCi0JCQkJYWxsb3dUb1NlbmQgPSBUUlVFOwotCQkJfQotCQl9IHdoaWxlKEZBTFNFKTsKLQotCQlpZiAoYWxsb3dUb1NlbmQgPT0gVFJVRSkKLQkJCVNUQVNlbmRQYWNrZXQocEFkLCBwUGFja2V0KTsKLQkJZWxzZQotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLQotCS8vIERlcXVldWUgb3V0Z29pbmcgZnJhbWVzIGZyb20gVHhTd1F1ZXVlW10gYW5kIHByb2Nlc3MgaXQKLQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOwotCi19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLQlUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBkbyBwYWNrZXQgcGFyc2luZyBhbmQgY2xhc3NpZmljYXRpb24gZm9yIFR4IHBhY2tldAotCXRvIFNUQSBkZXZpY2UsIGFuZCBpdCB3aWxsIGVuLXF1ZXVlIHBhY2tldHMgdG8gb3VyIFR4U3dRdWV1ZSBkZXBlbmRzIG9uIEFDCi0JY2xhc3MuCi0KLUFyZ3VtZW50czoKLQlwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQlwUGFja2V0CQlQb2ludGVyIHRvIHNlbmQgcGFja2V0Ci0KLVJldHVybiBWYWx1ZToKLQlORElTX1NUQVRVU19TVUNDRVNTCQkJSWYgc3VjY2VzIHRvIHF1ZXVlIHRoZSBwYWNrZXQgaW50byBUeFN3UXVldWUuCi0JTkRJU19TVEFUVVNfRkFJTFVSRQkJCUlmIGZhaWxlZCB0byBkbyBlbi1xdWV1ZS4KLQotTm90ZToKLQlZb3Ugb25seSBjYW4gcHV0IE9TLWluZGVwZW5lZCAmIFNUQSByZWxhdGVkIGNvZGUgaW4gaGVyZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfU1RBVFVTIFNUQVNlbmRQYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCi17Ci0JUEFDS0VUX0lORk8JUGFja2V0SW5mbzsKLQlQVUNIQVIJCQlwU3JjQnVmVkE7Ci0JVUlOVAkJCVNyY0J1ZkxlbjsKLQlVSU5UCQkJQWxsb3dGcmFnU2l6ZTsKLQlVQ0hBUgkJCU51bWJlck9mRnJhZzsKLQlVQ0hBUgkJCVJUU1JlcXVpcmVkOwotCVVDSEFSCQkJUXVlSWR4LCBVc2VyUHJpb3JpdHk7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOwotCXVuc2lnbmVkIGludAlJcnFGbGFnczsKLQlVQ0hBUgkJCUZsZ0lzSVAgPSAwOwotCVVDSEFSCQkJUmF0ZTsKLQotCS8vIFByZXBhcmUgcGFja2V0IGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgYnVmZmVyIGRlc2NyaXB0b3IKLQkvLyBjaGFpbmVkIHdpdGhpbiBhIHNpbmdsZSBORElTIHBhY2tldC4KLQlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7Ci0KLQlpZiAocFNyY0J1ZlZBID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlNUQVNlbmRQYWNrZXQgLS0+IHBTcmNCdWZWQSA9PSBOVUxMICEhIVNyY0J1Zkxlbj0leFxuIixTcmNCdWZMZW4pKTsKLQkJLy8gUmVzb3VyZWNlIGlzIGxvdywgc3lzdGVtIGRpZCBub3QgYWxsb2NhdGUgdmlydHVhbCBhZGRyZXNzCi0JCS8vIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGRpcmVjdGx5IHRvIHVwcGVyIGxheWVyCi0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0KLQlpZiAoU3JjQnVmTGVuIDwgMTQpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlNUQVNlbmRQYWNrZXQgLS0+IE5kaXMgUGFja2V0IGJ1ZmZlciBlcnJvciAhISFcbiIpKTsKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLQotCS8vIEluIEhUIHJhdGUgYWRob2MgbW9kZSwgQS1NUERVIGlzIG9mdGVuIHVzZWQuIFNvIG5lZWQgdG8gbG9va3VwIEJBIFRhYmxlIGFuZCBNQUMgRW50cnkuCi0JLy8gTm90ZSBtdWx0aWNhc3QgcGFja2V0cyBpbiBhZGhvYyBhbHNvIHVzZSBCU1NJRF9XQ0lEIGluZGV4LgotCXsKLQkJaWYoSU5GUkFfT04ocEFkKSkKLQkJewotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQkJVVNIT1JUCXRtcFdjaWQ7Ci0KLQkJCXRtcFdjaWQgPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKLQkJCWlmIChWQUxJRF9XQ0lEKHRtcFdjaWQpICYmCi0JCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbdG1wV2NpZF0uVmFsaWRBc0Rscz09IFRSVUUpKQotCQkJewotCQkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3RtcFdjaWRdOwotCQkJCVJhdGUgPSBwQWQtPk1hY1RhYi5Db250ZW50W3RtcFdjaWRdLkN1cnJUeFJhdGU7Ci0JCQl9Ci0JCQllbHNlCi0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JCQl7Ci0JCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKLQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIEJTU0lEX1dDSUQpOwotCQkJUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZTsKLQkJfQotCQl9Ci0JCWVsc2UgaWYgKEFESE9DX09OKHBBZCkpCi0JCXsKLQkJCWlmICgqcFNyY0J1ZlZBICYgMHgwMSkKLQkJCXsKLQkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCBNQ0FTVF9XQ0lEKTsKLQkJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBTcmNCdWZWQSk7Ci0JCQl9Ci0JCQlSYXRlID0gcEFkLT5Db21tb25DZmcuVHhSYXRlOwotCQl9Ci0JfQotCi0JaWYgKCFwRW50cnkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlNUQVNlbmRQYWNrZXQtPkNhbm5vdCBmaW5kIHBFbnRyeSglMng6JTJ4OiUyeDolMng6JTJ4OiUyeCkgaW4gTWFjVGFiIVxuIiwgUFJJTlRfTUFDKHBTcmNCdWZWQSkpKTsKLQkJLy8gUmVzb3VyZWNlIGlzIGxvdywgc3lzdGVtIGRpZCBub3QgYWxsb2NhdGUgdmlydHVhbCBhZGRyZXNzCi0JCS8vIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGRpcmVjdGx5IHRvIHVwcGVyIGxheWVyCi0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JaWYgKEFESE9DX09OKHBBZCkKLQkJKQotCXsKLQkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgKFVDSEFSKXBFbnRyeS0+QWlkKTsKLQl9Ci0KLQkvLwotCS8vIENoZWNrIHRoZSBFdGhlcm5ldCBGcmFtZSB0eXBlIG9mIHRoaXMgcGFja2V0LCBhbmQgc2V0IHRoZSBSVE1QX1NFVF9QQUNLRVRfU1BFQ0lGSUMgZmxhZ3MuCi0JLy8JCUhlcmUgd2Ugc2V0IHRoZSBQQUNLRVRfU1BFQ0lGSUMgZmxhZ3MoTExDLCBWTEFOLCBESENQL0FSUCwgRUFQT0wpLgotCVJUTVBDaGVja0V0aGVyVHlwZShwQWQsIHBQYWNrZXQpOwotCi0KLQotCS8vCi0JLy8gV1BBIDgwMi4xeCBzZWN1cmVkIHBvcnQgY29udHJvbCAtIGRyb3AgYWxsIG5vbi04MDIuMXggZnJhbWUgYmVmb3JlIHBvcnQgc2VjdXJlZAotCS8vCi0JaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAotCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKLQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAotCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCQkgIHx8IChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSkKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0JCSAgKQotCQkgICYmICgocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSB8fCAocEFkLT5TdGFDZmcuTWljRXJyQ250ID49IDIpKQotCQkgICYmIChSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFBhY2tldCk9PSBGQUxTRSkKLQkJICApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVNlbmRQYWNrZXQgLS0+IERyb3AgcGFja2V0IGJlZm9yZSBwb3J0IHNlY3VyZWQgISEhXG4iKSk7Ci0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQotCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLQotCi0JLy8gU1RFUCAxLiBEZWNpZGUgbnVtYmVyIG9mIGZyYWdtZW50cyByZXF1aXJlZCB0byBkZWxpdmVyIHRoaXMgTVNEVS4KLQkvLwkgICBUaGUgZXN0aW1hdGlvbiBoZXJlIGlzIG5vdCB2ZXJ5IGFjY3VyYXRlIGJlY2F1c2UgZGlmZmljdWx0IHRvCi0JLy8JICAgdGFrZSBlbmNyeXB0aW9uIG92ZXJoZWFkIGludG8gY29uc2lkZXJhdGlvbiBoZXJlLiBUaGUgcmVzdWx0Ci0JLy8JICAgIk51bWJlck9mRnJhZyIgaXMgdGhlbiBqdXN0IHVzZWQgdG8gcHJlLWNoZWNrIGlmIGVub3VnaCBmcmVlCi0JLy8JICAgVFhEIGFyZSBhdmFpbGFibGUgdG8gaG9sZCB0aGlzIE1TRFUuCi0KLQotCWlmICgqcFNyY0J1ZlZBICYgMHgwMSkJLy8gZnJhZ21lbnRhdGlvbiBub3QgYWxsb3dlZCBvbiBtdWx0aWNhc3QgJiBicm9hZGNhc3QKLQkJTnVtYmVyT2ZGcmFnID0gMTsKLQllbHNlIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpCi0JCU51bWJlck9mRnJhZyA9IDE7CS8vIEFnZ3JlZ2F0aW9uIG92ZXJ3aGVsbXMgZnJhZ21lbnRhdGlvbgotCWVsc2UgaWYgKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEKSkKLQkJTnVtYmVyT2ZGcmFnID0gMTsJLy8gQWdncmVnYXRpb24gb3ZlcndoZWxtcyBmcmFnbWVudGF0aW9uCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfSFRNSVgpIHx8IChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUR1JFRU5GSUVMRCkpCi0JCU51bWJlck9mRnJhZyA9IDE7CS8vIE1JTU8gUkFURSBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQllbHNlCi0JewotCQkvLyBUaGUgY2FsY3VsYXRlZCAiTnVtYmVyT2ZGcmFnIiBpcyBhIHJvdWdoIGVzdGltYXRpb24gYmVjYXVzZSBvZiB2YXJpb3VzCi0JCS8vIGVuY3J5cHRpb24vZW5jYXBzdWxhdGlvbiBvdmVyaGVhZCBub3QgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGlzIG51bWJlciBpcyBqdXN0Ci0JCS8vIHVzZWQgdG8gbWFrZSBzdXJlIGVub3VnaCBmcmVlIFRYRCBhcmUgYXZhaWxhYmxlIGJlZm9yZSBmcmFnbWVudGF0aW9uIHRha2VzIHBsYWNlLgotCQkvLyBJbiBjYXNlIHRoZSBhY3R1YWwgcmVxdWlyZWQgbnVtYmVyIG9mIGZyYWdtZW50cyBvZiBhbiBORElTIHBhY2tldAotCQkvLyBleGNjZWVkcyAiTnVtYmVyT2ZGcmFnImNhY3VsYXRlZCBoZXJlIGFuZCBub3QgZW5vdWdoIGZyZWUgVFhEIGF2YWlsYWJsZSwgdGhlCi0JCS8vIGxhc3QgZnJhZ21lbnQgKGkuZS4gbGFzdCBNUERVKSB3aWxsIGJlIGRyb3BwZWQgaW4gUlRNUEhhcmRUcmFuc21pdCgpIGR1ZSB0byBvdXQgb2YKLQkJLy8gcmVzb3VyY2UsIGFuZCB0aGUgTkRJUyBwYWNrZXQgd2lsbCBiZSBpbmRpY2F0ZWQgTkRJU19TVEFUVVNfRkFJTFVSRS4gVGhpcyBzaG91bGQKLQkJLy8gcmFyZWx5IGhhcHBlbiBhbmQgdGhlIHBlbmFsdHkgaXMganVzdCBsaWtlIGEgVFggUkVUUlkgZmFpbC4gQWZmb3JkYWJsZS4KLQotCQlBbGxvd0ZyYWdTaXplID0gKHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfQ1JDOwotCQlOdW1iZXJPZkZyYWcgPSAoKFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGggLSBMRU5HVEhfODAyXzMgKyBMRU5HVEhfODAyXzFfSCkgLyBBbGxvd0ZyYWdTaXplKSArIDE7Ci0JCS8vIFRvIGdldCBhY2N1cmF0ZSBudW1iZXIgb2YgZnJhZ21lbnRhdGlvbiwgTWludXMgMSBpZiB0aGUgc2l6ZSBqdXN0IG1hdGNoIHRvIGFsbG93YWJsZSBmcmFnbWVudCBzaXplCi0JCWlmICgoKFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGggLSBMRU5HVEhfODAyXzMgKyBMRU5HVEhfODAyXzFfSCkgJSBBbGxvd0ZyYWdTaXplKSA9PSAwKQotCQl7Ci0JCQlOdW1iZXJPZkZyYWctLTsKLQkJfQotCX0KLQotCS8vIFNhdmUgZnJhZ21lbnQgbnVtYmVyIHRvIE5kaXMgcGFja2V0IHJlc2VydmVkIGZpZWxkCi0JUlRNUF9TRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0LCBOdW1iZXJPZkZyYWcpOwotCi0KLQkvLyBTVEVQIDIuIENoZWNrIHRoZSByZXF1aXJlbWVudCBvZiBSVFM6Ci0JLy8JICAgSWYgbXVsdGlwbGUgZnJhZ21lbnQgcmVxdWlyZWQsIFJUUyBpcyByZXF1aXJlZCBvbmx5IGZvciB0aGUgZmlyc3QgZnJhZ21lbnQKLQkvLwkgICBpZiB0aGUgZnJhZ21lbnQgc2l6ZSBsYXJnZSB0aGFuIFJUUyB0aHJlc2hvbGQKLQkvLyAgICAgRm9yIFJUMjh4eCwgTGV0IEFTSUMgc2VuZCBSVFMvQ1RTCi0vLwlSVE1QX1NFVF9QQUNLRVRfUlRTKHBQYWNrZXQsIDApOwotCWlmIChOdW1iZXJPZkZyYWcgPiAxKQotCQlSVFNSZXF1aXJlZCA9IChwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA+IHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCkgPyAxIDogMDsKLQllbHNlCi0JCVJUU1JlcXVpcmVkID0gKFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGggPiBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpID8gMSA6IDA7Ci0KLQkvLyBTYXZlIFJUUyByZXF1aXJlbWVudCB0byBOZGlzIHBhY2tldCByZXNlcnZlZCBmaWVsZAotCVJUTVBfU0VUX1BBQ0tFVF9SVFMocFBhY2tldCwgUlRTUmVxdWlyZWQpOwotCVJUTVBfU0VUX1BBQ0tFVF9UWFJBVEUocFBhY2tldCwgcEFkLT5Db21tb25DZmcuVHhSYXRlKTsKLQotCS8vCi0JLy8gU1RFUCAzLiBUcmFmZmljIGNsYXNzaWZpY2F0aW9uLiBvdXRjb21lID0gPFVzZXJQcmlvcml0eSwgUXVlSWR4PgotCS8vCi0JVXNlclByaW9yaXR5ID0gMDsKLQlRdWVJZHgJCSA9IFFJRF9BQ19CRTsKLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJgotCQlDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkKLQl7Ci0JCVVTSE9SVCBQcm90b2NvbDsKLQkJVUNIQVIgIExsY1NuYXBMZW4gPSAwLCBCeXRlMCwgQnl0ZTE7Ci0JCWRvCi0JCXsKLQkJCS8vIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZAotCQkJUHJvdG9jb2wgPSAoVVNIT1JUKSgocFNyY0J1ZlZBWzEyXSA8PCA4KSArIHBTcmNCdWZWQVsxM10pOwotCQkJaWYgKFByb3RvY29sIDw9IDE1MDApCi0JCQl7Ci0JCQkJLy8gZ2V0IEV0aGVybmV0IHByb3RvY29sIGZpZWxkIGZyb20gTExDL1NOQVAKLQkJCQlpZiAoU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihQYWNrZXRJbmZvLnBGaXJzdEJ1ZmZlciwgTEVOR1RIXzgwMl8zICsgNiwgJkJ5dGUwLCAmQnl0ZTEpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQkJCWJyZWFrOwotCi0JCQkJUHJvdG9jb2wgPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7Ci0JCQkJTGxjU25hcExlbiA9IDg7Ci0JCQl9Ci0KLQkJCS8vIGFsd2F5cyBBQ19CRSBmb3Igbm9uLUlQIHBhY2tldAotCQkJaWYgKFByb3RvY29sICE9IDB4MDgwMCkKLQkJCQlicmVhazsKLQotCQkJLy8gZ2V0IElQIGhlYWRlcgotCQkJaWYgKFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoUGFja2V0SW5mby5wRmlyc3RCdWZmZXIsIExFTkdUSF84MDJfMyArIExsY1NuYXBMZW4sICZCeXRlMCwgJkJ5dGUxKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJCWJyZWFrOwotCi0JCQkvLyByZXR1cm4gQUNfQkUgaWYgcGFja2V0IGlzIG5vdCBJUHY0Ci0JCQlpZiAoKEJ5dGUwICYgMHhmMCkgIT0gMHg0MCkKLQkJCQlicmVhazsKLQotCQkJRmxnSXNJUCA9IDE7Ci0JCQlVc2VyUHJpb3JpdHkgPSAoQnl0ZTEgJiAweGUwKSA+PiA1OwotCQkJUXVlSWR4ID0gTWFwVXNlclByaW9yaXR5VG9BY2Nlc3NDYXRlZ29yeVtVc2VyUHJpb3JpdHldOwotCi0JCQkvLyBUT0RPOiBoYXZlIHRvIGNoZWNrIEFDTSBiaXQuIGFwcGx5IFRTUEVDIGlmIEFDTSBpcyBPTgotCQkJLy8gVE9ETzogZG93bmdyYWRlIFVQICYgUXVlSWR4IGJlZm9yZSBwYXNzaW5nIEFDTQotCQkJLyoKLQkJCQlVbmRlciBXTU0gQUNNIGNvbnRyb2wsIHdlIGRvbnQgbmVlZCB0byBjaGVjayB0aGUgYml0OwotCQkJCU9yIHdoZW4gYSBUU1BFQyBpcyBidWlsdCBmb3IgVk8gYnV0IHdlIHdpbGwgY2hhbmdlIHRvIGlzc3VlCi0JCQkJQkEgc2Vzc2lvbiBmb3IgQkUgaGVyZSwgc28gd2Ugd2lsbCBub3QgdXNlIEJBIHRvIHNlbmQgVk8gcGFja2V0cy4KLQkJCSovCi0JCQlpZiAocEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQUNNW1F1ZUlkeF0pCi0JCQl7Ci0JCQkJVXNlclByaW9yaXR5ID0gMDsKLQkJCQlRdWVJZHgJCSA9IFFJRF9BQ19CRTsKLQkJCX0KLQkJfSB3aGlsZSAoRkFMU0UpOwotCX0KLQotCVJUTVBfU0VUX1BBQ0tFVF9VUChwUGFja2V0LCBVc2VyUHJpb3JpdHkpOwotCi0KLQotCS8vIE1ha2Ugc3VyZSBTZW5kVHhXYWl0IHF1ZXVlIHJlc291cmNlIHdvbid0IGJlIHVzZWQgYnkgb3RoZXIgdGhyZWFkcwotCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQlpZiAocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPj0gTUFYX1BBQ0tFVFNfSU5fUVVFVUUpCi0JewotCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLSNpZmRlZiBCTE9DS19ORVRfSUYKLQkJU3RvcE5ldElmUXVldWUocEFkLCBRdWVJZHgsIHBQYWNrZXQpOwotI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLwotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0KLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCWVsc2UKLQl7Ci0JCUluc2VydFRhaWxRdWV1ZUFjKHBBZCwgcEVudHJ5LCAmcEFkLT5UeFN3UXVldWVbUXVlSWR4XSwgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpKTsKLQl9Ci0JUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPT0gVFJVRSkmJgotICAgICAgICBJU19IVF9TVEEocEVudHJ5KSkKLQl7Ci0JICAgIC8vUE1BQ19UQUJMRV9FTlRSWSBwTWFjRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKLQkJaWYgKCgocEVudHJ5LT5UWEJBYml0bWFwICYgKDE8PFVzZXJQcmlvcml0eSkpID09IDApICYmCi0gICAgICAgICAgICAoKHBFbnRyeS0+QkFEZWNsaW5lQml0bWFwICYgKDE8PFVzZXJQcmlvcml0eSkpID09IDApICYmCi0gICAgICAgICAgICAocEVudHJ5LT5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkKLQkJCSAvLyBGb3IgSU9UIGNvbXBhdGliaWxpdHksIGlmCi0JCQkgLy8gMS4gSXQgaXMgUmFsaW5rIGNoaXAgb3IKLQkJCSAvLyAyLiBJdCBpcyBPUEVOIG9yIEFFUyBtb2RlLAotCQkJIC8vIHRoZW4gQkEgc2Vzc2lvbiBjYW4gYmUgYnVsaXQuCi0JCQkgJiYgKChwRW50cnktPlZhbGlkQXNDTEkgJiYgcEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgIT0gMHgwKSB8fAotCQkJCSAocEVudHJ5LT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMVdFUEVuYWJsZWQgJiYgcEVudHJ5LT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkpCi0JCQkpCi0JCXsKLQkJCUJBT3JpU2Vzc2lvblNldFVwKHBBZCwgcEVudHJ5LCBVc2VyUHJpb3JpdHksIDAsIDEwLCBGQUxTRSk7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRdWVJZHhdKys7IC8vIFRPRE86IGZvciBkZWJ1ZyBvbmx5LiB0byBiZSByZW1vdmVkCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVRoaXMgc3Vicm91dGluZSB3aWxsIHNjYW4gdGhyb3VnaCByZWxlYXRpdmUgcmluZyBkZXNjcmlwdG9yIHRvIGZpbmQKLQkJb3V0IGF2YWxpYWJsZSBmcmVlIHJpbmcgZGVzY3JpcHRvciBhbmQgY29tcGFyZSB3aXRoIHJlcXVlc3Qgc2l6ZS4KLQotCUFyZ3VtZW50czoKLQkJcEFkIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJUXVlSWR4CQlTZWxlY3RlZCBUWCBSaW5nCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX0ZBSUxVUkUJTm90IGVub3VnaCBmcmVlIGRlc2NyaXB0b3IKLQkJTkRJU19TVEFUVVNfU1VDQ0VTUwlFbm91Z2ggZnJlZSBkZXNjcmlwdG9yCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLU5ESVNfU1RBVFVTIFJUTVBGcmVlVFhEUmVxdWVzdCgKLQlJTgkJUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JCVVDSEFSCQkJUXVlSWR4LAotCUlOCQlVQ0hBUgkJCU51bWJlclJlcXVpcmVkLAotCUlOCQlQVUNIQVIJCQlGcmVlTnVtYmVySXMpCi17Ci0JVUxPTkcJCUZyZWVOdW1iZXIgPSAwOwotCU5ESVNfU1RBVFVTCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0KLQlzd2l0Y2ggKFF1ZUlkeCkKLQl7Ci0JCWNhc2UgUUlEX0FDX0JLOgotCQljYXNlIFFJRF9BQ19CRToKLQkJY2FzZSBRSURfQUNfVkk6Ci0JCWNhc2UgUUlEX0FDX1ZPOgotCQkvKmNhc2UgUUlEX0hDQ0E6Ki8KLQkJCWlmIChwQWQtPlR4UmluZ1tRdWVJZHhdLlR4U3dGcmVlSWR4ID4gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCkKLQkJCQlGcmVlTnVtYmVyID0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeFN3RnJlZUlkeCAtIHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHggLSAxOwotCQkJZWxzZQotCQkJCUZyZWVOdW1iZXIgPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4U3dGcmVlSWR4ICsgVFhfUklOR19TSVpFIC0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCAtIDE7Ci0KLQkJCWlmIChGcmVlTnVtYmVyID49IE51bWJlclJlcXVpcmVkKQotCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JCQlicmVhazsKLQotCQljYXNlIFFJRF9NR01UOgotCQkJaWYgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPiBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KQotCQkJCUZyZWVOdW1iZXIgPSBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4IC0gcEFkLT5NZ210UmluZy5UeENwdUlkeCAtIDE7Ci0JCQllbHNlCi0JCQkJRnJlZU51bWJlciA9IHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggKyBNR01UX1JJTkdfU0laRSAtIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHggLSAxOwotCi0JCQlpZiAoRnJlZU51bWJlciA+PSBOdW1iZXJSZXF1aXJlZCkKLQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUlRNUEZyZWVUWERSZXF1ZXN0OjpJbnZhbGlkIFF1ZUlkeCg9JWQpXG4iLCBRdWVJZHgpKTsKLQkJCWJyZWFrOwotCX0KLQkqRnJlZU51bWJlcklzID0gKFVDSEFSKUZyZWVOdW1iZXI7Ci0KLQlyZXR1cm4gKFN0YXR1cyk7Ci19Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCi1WT0lEIFJUTVBTZW5kRGlzYXNzb2NpYXRpb25GcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLX0KLQotVk9JRAlSVE1QU2VuZE51bGxGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVR4UmF0ZSwKLQlJTglCT09MRUFOCQkJYlFvc051bGwpCi17Ci0JVUNIQVIJTnVsbEZyYW1lWzQ4XTsKLQlVTE9ORwlMZW5ndGg7Ci0JUEhFQURFUl84MDJfMTEJcEhlYWRlcl84MDJfMTE7Ci0KLQotI2lmZGVmIFJBTElOS19BVEUKLQlpZihBVEVfT04ocEFkKSkKLQl7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0gICAgLy8gV1BBIDgwMi4xeCBzZWN1cmVkIHBvcnQgY29udHJvbAotICAgIGlmICgoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKLSAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8Ci0gICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKLSAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJCSAgfHwgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKQotI2VuZGlmCi0gICAgICAgICkgJiYKLSAgICAgICAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKLQl7Ci0JCXJldHVybjsKLQl9Ci0KLQlOZGlzWmVyb01lbW9yeShOdWxsRnJhbWUsIDQ4KTsKLQlMZW5ndGggPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0KLQlwSGVhZGVyXzgwMl8xMSA9IChQSEVBREVSXzgwMl8xMSkgTnVsbEZyYW1lOwotCi0JcEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPSBCVFlQRV9EQVRBOwotCXBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9OVUxMX0ZVTkM7Ci0JcEhlYWRlcl84MDJfMTEtPkZDLlRvRHMgPSAxOwotCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOwotCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0KLQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkKLQl7Ci0JCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7Ci0JfQotCWVsc2UKLQl7Ci0JCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgPyAxOiAwOwotCX0KLQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSBwQWQtPkNvbW1vbkNmZy5Ec2lmcyArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBUeFJhdGUsIDE0KTsKLQotCXBBZC0+U2VxdWVuY2UrKzsKLQlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlNlcXVlbmNlOwotCi0JLy8gUHJlcGFyZSBRb3NOdWxsIGZ1bmN0aW9uIGZyYW1lCi0JaWYgKGJRb3NOdWxsKQotCXsKLQkJcEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPSBTVUJUWVBFX1FPU19OVUxMOwotCi0JCS8vIGNvcHkgUU9TIGNvbnRyb2wgYnl0ZXMKLQkJTnVsbEZyYW1lW0xlbmd0aF0JPSAgMDsKLQkJTnVsbEZyYW1lW0xlbmd0aCsxXSA9ICAwOwotCQlMZW5ndGggKz0gMjsvLyBpZiBwYWQgd2l0aCAyIGJ5dGVzIGZvciBhbGlnbm1lbnQsIEFQU0Qgd2lsbCBmYWlsCi0JfQotCi0JSEFMX0tpY2tPdXROdWxsRnJhbWVUeChwQWQsIDAsIE51bGxGcmFtZSwgTGVuZ3RoKTsKLQotfQotCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQJUlRNUFNlbmRSVFNGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwREEsCi0JSU4JdW5zaWduZWQgaW50CU5leHRNcGR1U2l6ZSwKLQlJTglVQ0hBUgkJCVR4UmF0ZSwKLQlJTglVQ0hBUgkJCVJUU1JhdGUsCi0JSU4JVVNIT1JUCQkJQWNrRHVyYXRpb24sCi0JSU4JVUNIQVIJCQlRdWVJZHgsCi0JSU4JVUNIQVIJCQlGcmFtZUdhcCkKLXsKLX0KLQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgRklORCBFTkNSWVBUIEtFWSBBTkQgREVDSURFIENJUEhFUiBBTEdPUklUSE0KLS8vCQlGaW5kIHRoZSBXUEEga2V5LCBlaXRoZXIgR3JvdXAgb3IgUGFpcndpc2UgS2V5Ci0vLwkJTEVBUCArIFRLSVAgYWxzbyB1c2UgV1BBIGtleS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWNpZGUgV0VQIGJpdCBhbmQgY2lwaGVyIHN1aXRlIHRvIGJlIHVzZWQuIFNhbWUgY2lwaGVyIHN1aXRlIHNob3VsZCBiZSB1c2VkIGZvciB3aG9sZSBmcmFnbWVudCBidXJzdAotLy8gSW4gQ2lzY28gQ0NYIDIuMCBMZWFwIEF1dGhlbnRpY2F0aW9uCi0vLwkJICAgV2VwU3RhdHVzIGlzIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQgYnV0IHRoZSBrZXkgd2lsbCB1c2UgUGFpcndpc2VLZXkKLS8vCQkgICBJbnN0ZWFkIG9mIHRoZSBTaGFyZWRLZXksIFNoYXJlZEtleSBMZW5ndGggbWF5IGJlIFplcm8uCi1WT0lEIFNUQUZpbmRDaXBoZXJBbGdvcml0aG0oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaykKLXsKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlDaXBoZXI7CQkJCS8vIFRvIGluZGljYXRlIGNpcGhlciB1c2VkIGZvciB0aGlzIHBhY2tldAotCVVDSEFSCQkJCQkJCUNpcGhlckFsZyA9IENJUEhFUl9OT05FOwkJLy8gY2lwaGVyIGFsb2dyaXRobQotCVVDSEFSCQkJCQkJCUtleUlkeCA9IDB4ZmY7Ci0JUFVDSEFSCQkJCQkJCXBTcmNCdWZWQTsKLQlQQ0lQSEVSX0tFWQkJCQkJCXBLZXkgPSBOVUxMOwotCi0JcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBUeEJsay0+cFBhY2tldCk7Ci0KLQl7Ci0JICAgIC8vIFNlbGVjdCBDaXBoZXIKLQkgICAgaWYgKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKQotCSAgICAgICAgQ2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7IC8vIENpcGhlciBmb3IgTXVsdGljYXN0IG9yIEJyb2FkY2FzdAotCSAgICBlbHNlCi0JICAgICAgICBDaXBoZXIgPSBwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyOyAvLyBDaXBoZXIgZm9yIFVuaWNhc3QKLQotCQlpZiAoUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBUeEJsay0+cFBhY2tldCkpCi0JCXsKLQkJCUFTU0VSVChwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPD0gQ0lQSEVSX0NLSVAxMjgpOwotCi0JCQkvLyA0LXdheSBoYW5kc2hha2luZyBmcmFtZSBtdXN0IGJlIGNsZWFyCi0JCQlpZiAoIShUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JDbGVhckVBUEZyYW1lKSkgJiYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZykgJiYKLQkJCQkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuKSkKLQkJCXsKLQkJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7Ci0JCQkJS2V5SWR4ID0gMDsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkKLQkJewotCQkJCUtleUlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKLQkJfQotCQllbHNlIGlmICgoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8Ci0JCQkJIChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCi0JCXsKLQkJCWlmICgoKnBTcmNCdWZWQSAmIDB4MDEpICYmIChBREhPQ19PTihwQWQpKSkgLy8gbXVsdGljYXN0Ci0JCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOwotCQkJZWxzZSBpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuKQotCQkJCUtleUlkeCA9IDA7Ci0JCQllbHNlCi0JCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOwotCQl9Ci0KLQkJaWYgKEtleUlkeCA9PSAweGZmKQotCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCWVsc2UgaWYgKChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkgfHwgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID09IDApKQotCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCSAgICBlbHNlIGlmICggcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICYmCi0JICAgICAgICAgICAgIChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkgJiYKLQkgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKSAmJgotCSAgICAgICAgICAgICAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKLQkgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9OT05FOwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQkJZWxzZQotCQl7Ci0JCQkvL0hlYWRlcl84MDJfMTEuRkMuV2VwID0gMTsKLQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnOwotCQkJcEtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdOwotCQl9Ci0JfQotCi0JcFR4QmxrLT5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JcFR4QmxrLT5wS2V5ID0gcEtleTsKLX0KLQotCi1WT0lEIFNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBUWF9CTEsgICAgICAgICAgKnBUeEJsaykKLXsKLQotCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOwotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCUJPT0xFQU4JYkRMU0ZyYW1lID0gRkFMU0U7Ci0JSU5UCURsc0VudHJ5SW5kZXggPSAwOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0JLy8KLQkvLyBNQUtFIEEgQ09NTU9OIDgwMi4xMSBIRUFERVIKLQkvLwotCi0JLy8gbm9ybWFsIHdsYW4gaGVhZGVyIHNpemUgOiAyNCBvY3RldHMKLQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0KLQlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07Ci0KLQlOZGlzWmVyb01lbW9yeShwSGVhZGVyXzgwMl8xMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQotCXBIZWFkZXJfODAyXzExLT5GQy5GckRzID0gMDsKLQlwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7Ci0JcEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPSAoKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpID8gU1VCVFlQRV9RREFUQSA6IFNVQlRZUEVfREFUQSk7Ci0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQlpZiAoSU5GUkFfT04ocEFkKSkKLQl7Ci0JCS8vIENoZWNrIGlmIHRoZSBmcmFtZSBjYW4gYmUgc2VudCB0aHJvdWdoIERMUyBkaXJlY3QgbGluayBpbnRlcmZhY2UKLQkJLy8gSWYgcGFja2V0IGNhbiBiZSBzZW50IHRocm91Z2ggRExTLCB0aGVuIGZvcmNlIGFnZ3JlZ2F0aW9uIGRpc2FibGUuIChIYXJkIHRvIGRldGVybWluZSBwZWVyIFNUQSdzIGNhcGFiaWxpdHkpCi0JCURsc0VudHJ5SW5kZXggPSBSVE1QQ2hlY2tETFNGcmFtZShwQWQsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7Ci0JCWlmIChEbHNFbnRyeUluZGV4ID49IDApCi0JCQliRExTRnJhbWUgPSBUUlVFOwotCQllbHNlCi0JCQliRExTRnJhbWUgPSBGQUxTRTsKLQl9Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLSAgICBpZiAocFR4QmxrLT5wTWFjRW50cnkpCi0JewotCQlpZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VOb25Rb1MpKQotCQl7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwVHhCbGstPnBNYWNFbnRyeS0+Tm9uUW9zRGF0YVNlcTsKLQkJCXBUeEJsay0+cE1hY0VudHJ5LT5Ob25Rb3NEYXRhU2VxID0gKHBUeEJsay0+cE1hY0VudHJ5LT5Ob25Rb3NEYXRhU2VxKzEpICYgTUFYU0VROwotCQl9Ci0JCWVsc2UKLQkJewotCQkJewotCSAgICBwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwVHhCbGstPnBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOwotCSAgICBwVHhCbGstPnBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldID0gKHBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0rMSkgJiBNQVhTRVE7Ci0JfQotCX0KLQl9Ci0JZWxzZQotCXsKLQkJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZTsKLQkJcEFkLT5TZXF1ZW5jZSA9IChwQWQtPlNlcXVlbmNlKzEpICYgTUFYU0VROyAvLyBuZXh0IHNlcXVlbmNlCi0JfQotCi0JcEhlYWRlcl84MDJfMTEtPkZyYWcgPSAwOwotCi0JcEhlYWRlcl84MDJfMTEtPkZDLk1vcmVEYXRhID0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iTW9yZURhdGEpOwotCi0JewotCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJewotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQkJaWYgKGJETFNGcmFtZSkKLQkJCXsKLQkJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKLQkJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0JCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDA7Ci0JCQl9Ci0JCQllbHNlCi0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JCQl7Ci0JCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOwotCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDE7Ci0JCX0KLQkJfQotCQllbHNlIGlmIChBREhPQ19PTihwQWQpKQotCQl7Ci0JCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKLQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDA7Ci0JCX0KLQl9Ci0KLQlpZiAocFR4QmxrLT5DaXBoZXJBbGcgIT0gQ0lQSEVSX05PTkUpCi0JCXBIZWFkZXJfODAyXzExLT5GQy5XZXAgPSAxOwotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLgotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpCi0JcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKLQllbHNlCi0JcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKTsKLX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVk9JRCBTVEFCdWlsZENhY2hlODAyXzExSGVhZGVyKAotCUlOIFJUTVBfQURBUFRFUgkJKnBBZCwKLQlJTiBUWF9CTEsJCQkqcFR4QmxrLAotCUlOIFVDSEFSCQkJKnBIZWFkZXIpCi17Ci0JTUFDX1RBQkxFX0VOVFJZCSpwTWFjRW50cnk7Ci0JUEhFQURFUl84MDJfMTEJcEhlYWRlcjgwMjExOwotCi0JcEhlYWRlcjgwMjExID0gKFBIRUFERVJfODAyXzExKXBIZWFkZXI7Ci0JcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7Ci0KLQkvLwotCS8vIFVwZGF0ZSB0aGUgY2FjaGVkIDgwMi4xMSBIRUFERVIKLQkvLwotCi0JLy8gbm9ybWFsIHdsYW4gaGVhZGVyIHNpemUgOiAyNCBvY3RldHMKLQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0KLQkvLyBNb3JlIEJpdAotCXBIZWFkZXI4MDIxMS0+RkMuTW9yZURhdGEgPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7Ci0KLQkvLyBTZXF1ZW5jZQotCXBIZWFkZXI4MDIxMS0+U2VxdWVuY2UgPSBwTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XTsKLSAgICBwTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XSA9IChwTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XSsxKSAmIE1BWFNFUTsKLQotCXsKLQkJLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGNhbiBiZSBzZW50IHRocm91Z2ggRExTIGRpcmVjdCBsaW5rIGludGVyZmFjZQotCQkvLyBJZiBwYWNrZXQgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMsIHRoZW4gZm9yY2UgYWdncmVnYXRpb24gZGlzYWJsZS4gKEhhcmQgdG8gZGV0ZXJtaW5lIHBlZXIgU1RBJ3MgY2FwYWJpbGl0eSkKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJQk9PTEVBTgliRExTRnJhbWUgPSBGQUxTRTsKLQkJSU5UCURsc0VudHJ5SW5kZXggPSAwOwotCi0JCURsc0VudHJ5SW5kZXggPSBSVE1QQ2hlY2tETFNGcmFtZShwQWQsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7Ci0JCWlmIChEbHNFbnRyeUluZGV4ID49IDApCi0JCQliRExTRnJhbWUgPSBUUlVFOwotCQllbHNlCi0JCQliRExTRnJhbWUgPSBGQUxTRTsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotCQkvLyBUaGUgYWRkcjMgb2Ygbm9ybWFsIHBhY2tldCBzZW5kIGZyb20gRFMgaXMgRGVzdCBNYWMgYWRkcmVzcy4KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJaWYgKGJETFNGcmFtZSkKLQkJewotCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyODAyMTEtPkFkZHIxLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOwotCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyODAyMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQlwSGVhZGVyODAyMTEtPkZDLlRvRHMgPSAwOwotCQl9Ci0JCWVsc2UKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkJaWYgKEFESE9DX09OKHBBZCkpCi0JCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJZWxzZQotCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjMsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7Ci0JfQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLgotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpCi0JcEhlYWRlcjgwMjExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7Ci0JZWxzZQotCXBIZWFkZXI4MDIxMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOwotfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1zdGF0aWMgaW5saW5lIFBVQ0hBUiBTVEFfQnVpbGRfQVJhbGlua19GcmFtZV9IZWFkZXIoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVFhfQkxLCQkqcFR4QmxrKQotewotCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ci0JSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7Ci0JUE5ESVNfUEFDS0VUCXBOZXh0UGFja2V0OwotCVVJTlQzMgkJCW5leHRCdWZMZW47Ci0JUFFVRVVFX0VOVFJZCXBRRW50cnk7Ci0KLQlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKLQlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7Ci0KLQotCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOwotCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKLQotCS8vIHN0ZWFsICJvcmRlciIgYml0IHRvIG1hcmsgImFnZ3JlZ2F0aW9uIgotCXBIZWFkZXJfODAyXzExLT5GQy5PcmRlciA9IDE7Ci0KLQkvLyBza2lwIGNvbW1vbiBoZWFkZXIKLQlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKLQotCWlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pKQotCXsKLQkJLy8KLQkJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKLQkJLy8KLQkJKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKLQotCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOwotCQlwSGVhZGVyQnVmUHRyICs9MjsKLQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7Ci0JfQotCi0JLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyLiBMTEMgaGVhZGVyIHNob3VsZCBhdCA0LWJ5dGVzIGFsaWdtZW50LgotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7Ci0JcEhlYWRlckJ1ZlB0ciA9IChQVUNIQVIpUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7Ci0JcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7Ci0KLQkvLyBGb3IgUkEgQWdncmVnYXRpb24sCi0JLy8gcHV0IHRoZSAybmQgTVNEVSBsZW5ndGgoZXh0cmEgMi1ieXRlIGZpZWxkKSBhZnRlciBRT1NfQ09OVFJPTCBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdAotCXBRRW50cnkgPSBwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkOwotCXBOZXh0UGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOwotCW5leHRCdWZMZW4gPSBHRVRfT1NfUEtUX0xFTihwTmV4dFBhY2tldCk7Ci0JaWYgKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBOZXh0UGFja2V0KSkKLQkJbmV4dEJ1ZkxlbiAtPSBMRU5HVEhfODAyXzFROwotCi0JKnBIZWFkZXJCdWZQdHIgPSAoVUNIQVIpbmV4dEJ1ZkxlbiAmIDB4ZmY7Ci0JKihwSGVhZGVyQnVmUHRyKzEpID0gKFVDSEFSKShuZXh0QnVmTGVuID4+IDgpOwotCi0JcEhlYWRlckJ1ZlB0ciArPSAyOwotCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOwotCi0JcmV0dXJuIHBIZWFkZXJCdWZQdHI7Ci0KLX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotc3RhdGljIGlubGluZSBQVUNIQVIgU1RBX0J1aWxkX0FNU0RVX0ZyYW1lX0hlYWRlcigKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBUWF9CTEsJCSpwVHhCbGspCi17Ci0JUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsvLywgcFNhdmVCdWZQdHI7Ci0JSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7Ci0KLQotCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOwotCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKLQotCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOwotCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKLQotCS8vIHNraXAgY29tbW9uIGhlYWRlcgotCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOwotCi0JLy8KLQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcwotCS8vCi0JKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKLQotCS8vCi0JLy8gQS1NU0RVIHBhY2tldAotCS8vCi0JKnBIZWFkZXJCdWZQdHIgfD0gMHg4MDsKLQotCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7Ci0JcEhlYWRlckJ1ZlB0ciArPTI7Ci0JcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7Ci0KLQkvL3BTYXZlQnVmUHRyID0gcEhlYWRlckJ1ZlB0cjsKLQotCS8vCi0JLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyCi0JLy8gTExDIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50Ci0JLy8KLQkvLyBAQEAgTXBkdUhlYWRlckxlbiBleGNsdWRpbmcgcGFkZGluZyBAQEAKLQkvLwotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7Ci0JcEhlYWRlckJ1ZlB0ciA9IChQVUNIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOwotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOwotCi0JcmV0dXJuIHBIZWFkZXJCdWZQdHI7Ci0KLX0KLQotCi1WT0lEIFNUQV9BTVBEVV9GcmFtZV9UeCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrKQotewotCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOwotCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ci0JVVNIT1JUCQkJRnJlZU51bWJlcjsKLQlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeTsKLQlCT09MRUFOCQkJYlZMQU5Qa3Q7Ci0JUFFVRVVFX0VOVFJZCXBRRW50cnk7Ci0KLQlBU1NFUlQocFR4QmxrKTsKLQotCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCi0JewotCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7Ci0JCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKLQkJaWYgKCBSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCi0JCXsKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKLQotCQlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKLQkJaWYgKHBNYWNFbnRyeS0+aXNDYWNoZWQpCi0JCXsKLQkJCS8vIE5PVEU6IFBsZWFzZSBtYWtlIHN1cmUgdGhlIHNpemUgb2YgcE1hY0VudHJ5LT5DYWNoZWRCdWZbXSBpcyBzbWFsbGVyIHRoYW4gcFR4QmxrLT5IZWFkZXJCdWZbXSEhISEKLQkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSwgKFBVQ0hBUikmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0sIFRYV0lfU0laRSArIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JCQlwSGVhZGVyQnVmUHRyID0gKFBVQ0hBUikoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXSk7Ci0JCQlTVEFCdWlsZENhY2hlODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrLCBwSGVhZGVyQnVmUHRyKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOwotCQkJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOwotCi0JCQlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKLQkJfQotCi0KLQkJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOwotCi0JCS8vIHNraXAgY29tbW9uIGhlYWRlcgotCQlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKLQotCQkvLwotCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcwotCQkvLwotCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOwotCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOwotCQlwSGVhZGVyQnVmUHRyICs9MjsKLQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7Ci0KLQkJLy8KLQkJLy8gYnVpbGQgSFRDKwotCQkvLyBIVEMgY29udHJvbCBmaWxlZCBmb2xsb3dpbmcgUW9TIGZpZWxkCi0JCS8vCi0JCWlmICgocEFkLT5Db21tb25DZmcuYlJkZyA9PSBUUlVFKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwVHhCbGstPnBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpKQotCQl7Ci0JCQlpZiAocE1hY0VudHJ5LT5pc0NhY2hlZCA9PSBGQUxTRSkKLQkJCXsKLQkJCQkvLyBtYXJrIEhUQyBiaXQKLQkJCQlwSGVhZGVyXzgwMl8xMS0+RkMuT3JkZXIgPSAxOwotCi0JCQkJTmRpc1plcm9NZW1vcnkocEhlYWRlckJ1ZlB0ciwgNCk7Ci0JCQkJKihwSGVhZGVyQnVmUHRyKzMpIHw9IDB4ODA7Ci0JCQl9Ci0JCQlwSGVhZGVyQnVmUHRyICs9IDQ7Ci0JCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gNDsKLQkJfQotCi0JCS8vcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gcEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGVhZGVyQnVmIC0gVFhXSV9TSVpFIC0gVFhJTkZPX1NJWkU7Ci0JCUFTU0VSVChwVHhCbGstPk1wZHVIZWFkZXJMZW4gPj0gMjQpOwotCi0JCS8vIHNraXAgODAyLjMgaGVhZGVyCi0JCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7Ci0JCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7Ci0KLQkJLy8gc2tpcCB2bGFuIHRhZwotCQlpZiAoYlZMQU5Qa3QpCi0JCXsKLQkJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKLQkJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7Ci0JCX0KLQotCQkvLwotCQkvLyBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIKLQkJLy8gTExDIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50Ci0JCS8vCi0JCS8vIEBAQCBNcGR1SGVhZGVyTGVuIGV4Y2x1ZGluZyBwYWRkaW5nIEBAQAotCQkvLwotCQlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOwotCQlwSGVhZGVyQnVmUHRyID0gKFBVQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7Ci0JCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOwotCi0JCXsKLQotCQkJLy8KLQkJCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKLQkJCS8vCi0JCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChwVHhCbGstPnBTcmNCdWZEYXRhLTIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKLQkJCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKLQkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgNik7Ci0JCQkJcEhlYWRlckJ1ZlB0ciArPSA2OwotCQkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQotCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgMik7Ci0JCQkJcEhlYWRlckJ1ZlB0ciArPSAyOwotCQkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKLQkJCX0KLQotCQl9Ci0KLQkJaWYgKHBNYWNFbnRyeS0+aXNDYWNoZWQpCi0JCXsKLSAgICAgICAgICAgIFJUTVBXcml0ZVR4V0lfQ2FjaGUocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKLQotCQkJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikoJnBNYWNFbnRyeS0+Q2FjaGVkQnVmWzBdKSwgc2l6ZW9mKHBNYWNFbnRyeS0+Q2FjaGVkQnVmKSk7Ci0JCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSgmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0pLCAoUFVDSEFSKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgKHBIZWFkZXJCdWZQdHIgLSAoUFVDSEFSKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSkpOwotCQkJcE1hY0VudHJ5LT5pc0NhY2hlZCA9IFRSVUU7Ci0JCX0KLQotCQkvLyBjYWxjdWxhdGUgVHJhbnNtaXR0ZWQgQU1QRFUgY291bnQgYW5kIEJ5dGVDb3VudAotCQl7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkTVBEVXNJbkFNUERVQ291bnQudS5Mb3dQYXJ0ICsrOwotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZE9jdGV0c0luQU1QRFVDb3VudC5RdWFkUGFydCArPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQkJfQotCi0JCS8vRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKLQotCQlIQUxfV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBUUlVFLCAmRnJlZU51bWJlcik7Ci0KLQkJLy8KLQkJLy8gS2ljayBvdXQgVHgKLQkJLy8KLSAgICAgICAgICAgICAgICBpZiAoIVJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19ESVNBQkxFX1RYKSkKLQkJSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOwotCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOwotCX0KLQotfQotCi0KLVZPSUQgU1RBX0FNU0RVX0ZyYW1lX1R4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGspCi17Ci0JUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKLQlVU0hPUlQJCQlGcmVlTnVtYmVyOwotCVVTSE9SVAkJCXN1YkZyYW1lUGF5bG9hZExlbiA9IDA7CS8vIEFNU0RVIFN1YmZyYW1lIGxlbmd0aCB3aXRob3V0IEFNU0RVLUhlYWRlciAvIFBhZGRpbmcuCi0JVVNIT1JUCQkJdG90YWxNUERVU2l6ZT0wOwotCVVDSEFSCQkJKnN1YkZyYW1lSGVhZGVyOwotCVVDSEFSCQkJcGFkZGluZyA9IDA7Ci0JVVNIT1JUCQkJRmlyc3RUeCA9IDAsIExhc3RUeElkeCA9IDA7Ci0JQk9PTEVBTgkJCWJWTEFOUGt0OwotCWludAkJCWZyYW1lTnVtID0gMDsKLQlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKLQotCi0JQVNTRVJUKHBUeEJsayk7Ci0KLQlBU1NFUlQoKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA+IDEpKTsKLQotCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCi0JewotCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7Ci0JCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKLQkJaWYgKFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkKLQkJewotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOwotCi0JCS8vIHNraXAgODAyLjMgaGVhZGVyCi0JCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7Ci0JCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7Ci0KLQkJLy8gc2tpcCB2bGFuIHRhZwotCQlpZiAoYlZMQU5Qa3QpCi0JCXsKLQkJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKLQkJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7Ci0JCX0KLQotCQlpZiAoZnJhbWVOdW0gPT0gMCkKLQkJewotCQkJcEhlYWRlckJ1ZlB0ciA9IFNUQV9CdWlsZF9BTVNEVV9GcmFtZV9IZWFkZXIocEFkLCBwVHhCbGspOwotCi0JCQkvLyBOT1RFOiBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGZpbmFsIGZyYW1lIHdhcyBoYW5kbGVkLgotCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbMF07Ci0JCQlwYWRkaW5nID0gUk9VTkRfVVAoTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHN1YkZyYW1lUGF5bG9hZExlbiwgNCkgLSAoTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHN1YkZyYW1lUGF5bG9hZExlbik7Ci0JCQlOZGlzWmVyb01lbW9yeShwSGVhZGVyQnVmUHRyLCBwYWRkaW5nICsgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCk7Ci0JCQlwSGVhZGVyQnVmUHRyICs9IHBhZGRpbmc7Ci0JCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBwYWRkaW5nOwotCQl9Ci0KLQkJLy8KLQkJLy8gQS1NU0RVIHN1YmZyYW1lCi0JCS8vICAgREEoNikrU0EoNikrTGVuZ3RoKDIpICsgTExDL1NOQVAgRW5jYXAKLQkJLy8KLQkJc3ViRnJhbWVIZWFkZXIgPSBwSGVhZGVyQnVmUHRyOwotCQlzdWJGcmFtZVBheWxvYWRMZW4gPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQotCQlOZGlzTW92ZU1lbW9yeShzdWJGcmFtZUhlYWRlciwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAxMik7Ci0KLQotCQlwSGVhZGVyQnVmUHRyICs9IExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7Ci0JCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOwotCi0KLQkJLy8KLQkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cwotCQkvLwotCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChwVHhCbGstPnBTcmNCdWZEYXRhLTIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKLQotCQlzdWJGcmFtZVBheWxvYWRMZW4gPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQotCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCi0JCXsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKLQkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKLQkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQotCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKLQkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKLQkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKLQkJCXN1YkZyYW1lUGF5bG9hZExlbiArPSBMRU5HVEhfODAyXzFfSDsKLQkJfQotCi0JCS8vIHVwZGF0ZSBzdWJGcmFtZSBMZW5ndGggZmllbGQKLQkJc3ViRnJhbWVIZWFkZXJbMTJdID0gKHN1YkZyYW1lUGF5bG9hZExlbiAmIDB4RkYwMCkgPj4gODsKLQkJc3ViRnJhbWVIZWFkZXJbMTNdID0gc3ViRnJhbWVQYXlsb2FkTGVuICYgMHhGRjsKLQotCQl0b3RhbE1QRFVTaXplICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOwotCi0JCWlmIChmcmFtZU51bSA9PTApCi0JCQlGaXJzdFR4ID0gSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgJkZyZWVOdW1iZXIpOwotCQllbHNlCi0JCQlMYXN0VHhJZHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7Ci0KLQkJZnJhbWVOdW0rKzsKLQotCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKLQotCQkvLyBjYWxjdWxhdGUgVHJhbnNtaXR0ZWQgQU1TRFUgQ291bnQgYW5kIEJ5dGVDb3VudAotCQl7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1TRFVDb3VudC51Lkxvd1BhcnQgKys7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkT2N0ZXRzSW5BTVNEVS5RdWFkUGFydCArPSB0b3RhbE1QRFVTaXplOwotCQl9Ci0KLQl9Ci0KLQlIQUxfRmluYWxXcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIHRvdGFsTVBEVVNpemUsIEZpcnN0VHgpOwotCUhBTF9MYXN0VHhJZHgocEFkLCBwVHhCbGstPlF1ZUlkeCwgTGFzdFR4SWR4KTsKLQotCS8vCi0JLy8gS2ljayBvdXQgVHgKLQkvLwotICAgICAgICBpZiAoIVJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19ESVNBQkxFX1RYKSkKLQlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7Ci19Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLVZPSUQgU1RBX0xlZ2FjeV9GcmFtZV9UeCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrKQotewotCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOwotCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ci0JVVNIT1JUCQkJRnJlZU51bWJlcjsKLQlCT09MRUFOCQkJYlZMQU5Qa3Q7Ci0JUFFVRVVFX0VOVFJZCXBRRW50cnk7Ci0KLQlBU1NFUlQocFR4QmxrKTsKLQotCi0JcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOwotCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKLQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQotCXsKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9NQ0FTVF9GUkFNRSkKLQl7Ci0JCUlOQ19DT1VOVEVSNjQocEFkLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50KTsKLQl9Ci0KLQlpZiAoUlRNUF9HRVRfUEFDS0VUX1JUUyhwVHhCbGstPnBQYWNrZXQpKQotCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYlJ0c1JlcXVpcmVkKTsKLQllbHNlCi0JCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JSdHNSZXF1aXJlZCk7Ci0KLQliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKLQotCWlmIChwVHhCbGstPlR4UmF0ZSA8IHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSkKLQkJcFR4QmxrLT5UeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGU7Ci0KLQlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKLQlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7Ci0KLQotCS8vIHNraXAgODAyLjMgaGVhZGVyCi0JcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKLQlwVHhCbGstPlNyY0J1ZkxlbiAgLT0gTEVOR1RIXzgwMl8zOwotCi0JLy8gc2tpcCB2bGFuIHRhZwotCWlmIChiVkxBTlBrdCkKLQl7Ci0JCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKLQkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKLQl9Ci0KLQlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKLQlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7Ci0KLQkvLyBza2lwIGNvbW1vbiBoZWFkZXIKLQlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKLQotCWlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pKQotCXsKLQkJLy8KLQkJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKLQkJLy8KLQkJKihwSGVhZGVyQnVmUHRyKSA9ICgocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKSB8IChwQWQtPkNvbW1vbkNmZy5BY2tQb2xpY3lbcFR4QmxrLT5RdWVJZHhdPDw1KSk7Ci0JCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7Ci0JCXBIZWFkZXJCdWZQdHIgKz0yOwotCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKLQl9Ci0KLQkvLyBUaGUgcmVtYWluaW5nIGNvbnRlbnQgb2YgTVBEVSBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudAotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7Ci0JcEhlYWRlckJ1ZlB0ciA9IChQVUNIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOwotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOwotCi0JewotCi0JCS8vCi0JCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKLQkJLy8KLQkJLy8KLQkJLy8gaWYgb3JpZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsCi0JCS8vIHRoZW4gYW4gZXh0cmEgTExDL1NOQVAgZW5jYXAgaXMgcmVxdWlyZWQKLQkJLy8KLQkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChwVHhCbGstPnBTcmNCdWZIZWFkZXIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKLQkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQotCQl7Ci0JCQlVQ0hBUiB2bGFuX3NpemU7Ci0KLQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKLQkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKLQkJCS8vIHNraXAgdmxhbiB0YWcKLQkJCXZsYW5fc2l6ZSA9ICAoYlZMQU5Qa3QpID8gTEVOR1RIXzgwMl8xUSA6IDA7Ci0JCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKLQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcisxMit2bGFuX3NpemUsIDIpOwotCQkJcEhlYWRlckJ1ZlB0ciArPSAyOwotCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOwotCQl9Ci0KLQl9Ci0KLQkvLwotCS8vIHByZXBhcmUgZm9yIFRYV0kKLQkvLyB1c2UgV2NpZCBhcyBLZXkgSW5kZXgKLQkvLwotCi0JUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKLQotCS8vRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKLQotCUhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIFRSVUUsICZGcmVlTnVtYmVyKTsKLQotCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7Ci0KLQkvLwotCS8vIEtpY2sgb3V0IFR4Ci0JLy8KLQlpZiAoIVJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19ESVNBQkxFX1RYKSkKLQlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7Ci19Ci0KLQotVk9JRCBTVEFfQVJhbGlua19GcmFtZV9UeCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrKQotewotCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ci0JVVNIT1JUCQkJRnJlZU51bWJlcjsKLQlVU0hPUlQJCQl0b3RhbE1QRFVTaXplPTA7Ci0JVVNIT1JUCQkJRmlyc3RUeCwgTGFzdFR4SWR4OwotCWludAkJCWZyYW1lTnVtID0gMDsKLQlCT09MRUFOCQkJYlZMQU5Qa3Q7Ci0JUFFVRVVFX0VOVFJZCXBRRW50cnk7Ci0KLQotCUFTU0VSVChwVHhCbGspOwotCi0JQVNTRVJUKChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXI9PSAyKSk7Ci0KLQotCUZpcnN0VHggPSBMYXN0VHhJZHggPSAwOyAgLy8gSXMgaXQgb2sgaW5pdCB0aGV5IGFzIDA/Ci0Jd2hpbGUocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkKLQl7Ci0JCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKLQkJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOwotCi0JCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCi0JCXsKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKLQotCQkvLyBza2lwIDgwMi4zIGhlYWRlcgotCQlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOwotCQlwVHhCbGstPlNyY0J1ZkxlbiAgLT0gTEVOR1RIXzgwMl8zOwotCi0JCS8vIHNraXAgdmxhbiB0YWcKLQkJaWYgKGJWTEFOUGt0KQotCQl7Ci0JCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7Ci0JCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROwotCQl9Ci0KLQkJaWYgKGZyYW1lTnVtID09IDApCi0JCXsJLy8gRm9yIGZpcnN0IGZyYW1lLCB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgODAyLjExIGhlYWRlciArIHBhZGRpbmcob3B0aW9uYWwpICsgUkEtQUdHLUxFTiArIFNOQVAgSGVhZGVyCi0KLQkJCXBIZWFkZXJCdWZQdHIgPSBTVEFfQnVpbGRfQVJhbGlua19GcmFtZV9IZWFkZXIocEFkLCBwVHhCbGspOwotCi0JCQkvLyBJdCdzIG9rIHdyaXRlIHRoZSBUeFdJIGhlcmUsIGJlY2F1c2UgdGhlIFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudAotCQkJLy8Jd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGZpbmFsIGZyYW1lIHdhcyBoYW5kbGVkLgotCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKLQotCi0JCQkvLwotCQkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cwotCQkJLy8KLQkJCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOwotCi0JCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCi0JCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOwotCQkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKLQkJCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKLQkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZEYXRhLTIsIDIpOwotCQkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKLQkJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7CS8vIEZvciBzZWNvbmQgYWdncmVnYXRlZCBmcmFtZSwgd2UgbmVlZCBjcmVhdGUgdGhlIDgwMi4zIGhlYWRlciB0byBoZWFkZXJCdWYsIGJlY2F1c2UgUENJIHdpbGwgY29weSBpdCB0byBTRFB0cjAuCi0KLQkJCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbMF07Ci0JCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSAwOwotCi0JCQkvLyBBLVJhbGluayBzdWItc2VxdWVudCBmcmFtZSBoZWFkZXIgaXMgdGhlIHNhbWUgYXMgODAyLjMgaGVhZGVyLgotCQkJLy8gICBEQSg2KStTQSg2KStGcmFtZVR5cGUoMikKLQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlciwgMTIpOwotCQkJcEhlYWRlckJ1ZlB0ciArPSAxMjsKLQkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQotCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKLQkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKLQkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IExFTkdUSF9BUkFMSU5LX1NVQkZSQU1FSEVBRDsKLQkJfQotCi0JCXRvdGFsTVBEVVNpemUgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47Ci0KLQkJLy9GcmVlTnVtYmVyID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOwotCQlpZiAoZnJhbWVOdW0gPT0wKQotCQkJRmlyc3RUeCA9IEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sICZGcmVlTnVtYmVyKTsKLQkJZWxzZQotCQkJTGFzdFR4SWR4ID0gSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgJkZyZWVOdW1iZXIpOwotCi0JCWZyYW1lTnVtKys7Ci0KLQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEFnZ3JlZ2F0aW9uQ291bnQrKzsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7Ci0KLQl9Ci0KLQlIQUxfRmluYWxXcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIHRvdGFsTVBEVVNpemUsIEZpcnN0VHgpOwotCUhBTF9MYXN0VHhJZHgocEFkLCBwVHhCbGstPlF1ZUlkeCwgTGFzdFR4SWR4KTsKLQotCS8vCi0JLy8gS2ljayBvdXQgVHgKLQkvLwotCWlmICghUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpKQotCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKLQotfQotCi0KLVZPSUQgU1RBX0ZyYWdtZW50X0ZyYW1lX1R4KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFRYX0JMSwkJKnBUeEJsaykKLXsKLQlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKLQlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOwotCVVTSE9SVAkJCUZyZWVOdW1iZXI7Ci0JVUNIQVIJCQlmcmFnTnVtID0gMDsKLQlQQUNLRVRfSU5GTwkJUGFja2V0SW5mbzsKLQlVU0hPUlQJCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAwOwotCVVJTlQzMgkJCUZyZWVNcGR1U2l6ZSwgU3JjUmVtYWluaW5nQnl0ZXM7Ci0JVVNIT1JUCQkJQWNrRHVyYXRpb247Ci0JVUlOVAkJCU5leHRNcGR1U2l6ZTsKLQlCT09MRUFOCQkJYlZMQU5Qa3Q7Ci0JUFFVRVVFX0VOVFJZCXBRRW50cnk7Ci0JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQ7Ci0KLQotCUFTU0VSVChwVHhCbGspOwotCi0JcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOwotCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKLQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQotCXsKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlBU1NFUlQoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQWxsb3dGcmFnKSk7Ci0JYlZMQU5Qa3QgPSAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7Ci0KLQlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKLQlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7Ci0KLQlpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCi0JewotCQlwVHhCbGstPnBQYWNrZXQgPSBkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMocEFkLCBwVHhCbGstPnBQYWNrZXQpOwotCQlpZiAocFR4QmxrLT5wUGFja2V0ID09IE5VTEwpCi0JCQlyZXR1cm47Ci0JCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBUeEJsay0+cFBhY2tldCwgJlBhY2tldEluZm8sICZwVHhCbGstPnBTcmNCdWZIZWFkZXIsICZwVHhCbGstPlNyY0J1Zkxlbik7Ci0JfQotCi0JLy8gc2tpcCA4MDIuMyBoZWFkZXIKLQlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOwotCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7Ci0KLQotCS8vIHNraXAgdmxhbiB0YWcKLQlpZiAoYlZMQU5Qa3QpCi0JewotCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7Ci0JCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7Ci0JfQotCi0JcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07Ci0JcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKXBIZWFkZXJCdWZQdHI7Ci0KLQotCS8vIHNraXAgY29tbW9uIGhlYWRlcgotCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOwotCi0JaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpCi0JewotCQkvLwotCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcwotCQkvLwotCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOwotCi0JCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7Ci0JCXBIZWFkZXJCdWZQdHIgKz0yOwotCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKLQl9Ci0KLQkvLwotCS8vIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlcgotCS8vIExMQyBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudAotCS8vCi0JcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKLQlwSGVhZGVyQnVmUHRyID0gKFBVQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7Ci0JcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7Ci0KLQotCi0JLy8KLQkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCi0JLy8KLQkvLwotCS8vIGlmIG9yaWdpbmFsIEV0aGVybmV0IGZyYW1lIGNvbnRhaW5zIG5vIExMQy9TTkFQLAotCS8vIHRoZW4gYW4gZXh0cmEgTExDL1NOQVAgZW5jYXAgaXMgcmVxdWlyZWQKLQkvLwotCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfU1RBUlQocFR4QmxrLT5wU3JjQnVmSGVhZGVyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCk7Ci0JaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQotCXsKLQkJVUNIQVIgdmxhbl9zaXplOwotCi0JCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKLQkJcEhlYWRlckJ1ZlB0ciArPSA2OwotCQkvLyBza2lwIHZsYW4gdGFnCi0JCXZsYW5fc2l6ZSA9ICAoYlZMQU5Qa3QpID8gTEVOR1RIXzgwMl8xUSA6IDA7Ci0JCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQotCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIrMTIrdmxhbl9zaXplLCAyKTsKLQkJcEhlYWRlckJ1ZlB0ciArPSAyOwotCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7Ci0JfQotCi0KLQkvLyBJZiBUS0lQIGlzIHVzZWQgYW5kIGZyYWdtZW50YXRpb24gaXMgcmVxdWlyZWQuIERyaXZlciBoYXMgdG8KLQkvLwlhcHBlbmQgVEtJUCBNSUMgYXQgdGFpbCBvZiB0aGUgc2NhdHRlciBidWZmZXIKLQkvLwlNQUMgQVNJQyB3aWxsIG9ubHkgcGVyZm9ybSBJVi9FSVYvSUNWIGluc2VydGlvbiBidXQgbm8gVEtJUCBNSUMKLQlpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCi0JewotCQlSVE1QQ2FsY3VsYXRlTUlDVmFsdWUocEFkLCBwVHhCbGstPnBQYWNrZXQsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCBwVHhCbGstPnBLZXksIDApOwotCi0JCS8vIE5PVEU6IERPTidUIHJlZmVyIHRoZSBza2ItPmxlbiBkaXJlY3RseSBhZnRlciBmb2xsb3dpbmcgY29weS4gQmVjYXN1ZSB0aGUgbGVuZ3RoIGlzIG5vdCBhZGp1c3QKLQkJLy8JCQl0byBjb3JyZWN0IGxlbmdodCwgcmVmZXIgdG8gcFR4QmxrLT5TcmNCdWZMZW4gZm9yIHRoZSBwYWNrZXQgbGVuZ3RoIGluIGZvbGxvd2luZyBwcm9ncmVzcy4KLQkJTmRpc01vdmVNZW1vcnkocFR4QmxrLT5wU3JjQnVmRGF0YSArIHBUeEJsay0+U3JjQnVmTGVuLCAmcEFkLT5Qcml2YXRlSW5mby5UeC5NSUNbMF0sIDgpOwotCQkvL3NrYl9wdXQoKFJUUEtUX1RPX09TUEtUKHBUeEJsay0+cFBhY2tldCkpLT50YWlsLCA4KTsKLQkJcFR4QmxrLT5TcmNCdWZMZW4gKz0gODsKLQkJcFR4QmxrLT5Ub3RhbEZyYW1lTGVuICs9IDg7Ci0JCXBUeEJsay0+Q2lwaGVyQWxnID0gQ0lQSEVSX1RLSVBfTk9fTUlDOwotCX0KLQotCS8vCi0JLy8gY2FsY3VhdGUgdGhlIG92ZXJoZWFkIGJ5dGVzIHRoYXQgZW5jcnlwdGlvbiBhbGdvcml0aG0gbWF5IGFkZC4gVGhpcwotCS8vIGFmZmVjdHMgdGhlIGNhbGN1bGF0ZSBvZiAiZHVyYXRpb24iIGZpZWxkCi0JLy8KLQlpZiAoKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkgfHwgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpKQotCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSA4OyAvL1dFUDogSVZbNF0gKyBJQ1ZbNF07Ci0JZWxzZSBpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKQotCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAxMjsvL1RLSVA6IElWWzRdICsgRUlWWzRdICsgSUNWWzRdLCBNSUMgd2lsbCBiZSBhZGRlZCB0byBUb3RhbFBhY2tldExlbmd0aAotCWVsc2UgaWYgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9US0lQKQotCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAyMDsvL1RLSVA6IElWWzRdICsgRUlWWzRdICsgSUNWWzRdICsgTUlDWzhdCi0JZWxzZSBpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykKLQkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMTY7CS8vIEFFUzogSVZbNF0gKyBFSVZbNF0gKyBNSUNbOF0KLQllbHNlCi0JCUVuY3J5cHRpb25PdmVyaGVhZCA9IDA7Ci0KLQlwVHJhbnNtaXQgPSBwVHhCbGstPnBUcmFuc21pdDsKLQkvLyBEZWNpZGUgdGhlIFRYIHJhdGUKLQlpZiAocFRyYW5zbWl0LT5maWVsZC5NT0RFID09IE1PREVfQ0NLKQotCQlwVHhCbGstPlR4UmF0ZSA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOwotCWVsc2UgaWYgKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA9PSBNT0RFX09GRE0pCi0JCXBUeEJsay0+VHhSYXRlID0gcFRyYW5zbWl0LT5maWVsZC5NQ1MgKyBSQVRFX0ZJUlNUX09GRE1fUkFURTsKLQllbHNlCi0JCXBUeEJsay0+VHhSYXRlID0gUkFURV82XzU7Ci0KLQkvLyBkZWNpZGUgaG93IG11Y2ggdGltZSBhbiBBQ0svQ1RTIGZyYW1lIHdpbGwgY29uc3VtZSBpbiB0aGUgYWlyCi0JaWYgKHBUeEJsay0+VHhSYXRlIDw9IFJBVEVfTEFTVF9PRkRNX1JBVEUpCi0JCUFja0R1cmF0aW9uID0gUlRNUENhbGNEdXJhdGlvbihwQWQsIHBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtwVHhCbGstPlR4UmF0ZV0sIDE0KTsKLQllbHNlCi0JCUFja0R1cmF0aW9uID0gUlRNUENhbGNEdXJhdGlvbihwQWQsIFJBVEVfNl81LCAxNCk7Ci0KLQkvLyBJbml0IHRoZSB0b3RhbCBwYXlsb2FkIGxlbmd0aCBvZiB0aGlzIGZyYW1lLgotCVNyY1JlbWFpbmluZ0J5dGVzID0gcFR4QmxrLT5TcmNCdWZMZW47Ci0KLQlwVHhCbGstPlRvdGFsRnJhZ051bSA9IDB4ZmY7Ci0KLQlkbyB7Ci0KLQkJRnJlZU1wZHVTaXplID0gcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgLSBMRU5HVEhfQ1JDOwotCi0JCUZyZWVNcGR1U2l6ZSAtPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47Ci0KLQkJaWYgKFNyY1JlbWFpbmluZ0J5dGVzIDw9IEZyZWVNcGR1U2l6ZSkKLQkJewkvLyB0aGlzIGlzIHRoZSBsYXN0IG9yIG9ubHkgZnJhZ21lbnQKLQotCQkJcFR4QmxrLT5TcmNCdWZMZW4gPSBTcmNSZW1haW5pbmdCeXRlczsKLQotCQkJcEhlYWRlcl84MDJfMTEtPkZDLk1vcmVGcmFnID0gMDsKLQkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IHBBZC0+Q29tbW9uQ2ZnLkRzaWZzICsgQWNrRHVyYXRpb247Ci0KLQkJCS8vIEluZGljYXRlIHRoZSBsb3dlciBsYXllciB0aGF0IHRoaXMncyB0aGUgbGFzdCBmcmFnbWVudC4KLQkJCXBUeEJsay0+VG90YWxGcmFnTnVtID0gZnJhZ051bTsKLQkJfQotCQllbHNlCi0JCXsJLy8gbW9yZSBmcmFnbWVudCBpcyByZXF1aXJlZAotCi0JCQlwVHhCbGstPlNyY0J1ZkxlbiA9IEZyZWVNcGR1U2l6ZTsKLQotCQkJTmV4dE1wZHVTaXplID0gbWluKCgoVUlOVClTcmNSZW1haW5pbmdCeXRlcyAtIHBUeEJsay0+U3JjQnVmTGVuKSwgKChVSU5UKXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+RkMuTW9yZUZyYWcgPSAxOwotCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gKDMgKiBwQWQtPkNvbW1vbkNmZy5Ec2lmcykgKyAoMiAqIEFja0R1cmF0aW9uKSArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBwVHhCbGstPlR4UmF0ZSwgTmV4dE1wZHVTaXplICsgRW5jcnlwdGlvbk92ZXJoZWFkKTsKLQkJfQotCi0JCWlmIChmcmFnTnVtID09IDApCi0JCQlwVHhCbGstPkZyYW1lR2FwID0gSUZTX0hUVFhPUDsKLQkJZWxzZQotCQkJcFR4QmxrLT5GcmFtZUdhcCA9IElGU19TSUZTOwotCi0JCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7Ci0KLQkJSEFMX1dyaXRlRnJhZ1R4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYWdOdW0sICZGcmVlTnVtYmVyKTsKLQotCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKLQotCQkvLyBVcGRhdGUgdGhlIGZyYW1lIG51bWJlciwgcmVtYWluaW5nIHNpemUgb2YgdGhlIE5ESVMgcGFja2V0IHBheWxvYWQuCi0KLQkJLy8gc3BhY2UgZm9yIDgwMi4xMSBoZWFkZXIuCi0JCWlmIChmcmFnTnVtID09IDAgJiYgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCi0JCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gLT0gTEVOR1RIXzgwMl8xX0g7Ci0KLQkJZnJhZ051bSsrOwotCQlTcmNSZW1haW5pbmdCeXRlcyAtPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQkJcFR4QmxrLT5wU3JjQnVmRGF0YSArPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQotCQlwSGVhZGVyXzgwMl8xMS0+RnJhZysrOwkgLy8gaW5jcmVhc2UgRnJhZyAjCi0KLQl9d2hpbGUoU3JjUmVtYWluaW5nQnl0ZXMgPiAwKTsKLQotCS8vCi0JLy8gS2ljayBvdXQgVHgKLQkvLwotCWlmICghUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpKQotCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKLX0KLQotCi0jZGVmaW5lIFJFTEVBU0VfRlJBTUVTX09GX1RYQkxLKF9wQWQsIF9wVHhCbGssIF9wUUVudHJ5LCBfU3RhdHVzKQkJCQkJCQkJCQlcCi0JCXdoaWxlKF9wVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkKQkJCQkJCQkJCQkJCQkJXAotCQl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCV9wUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZfcFR4QmxrLT5UeFBhY2tldExpc3QpOwkJCQkJCQkJCVwKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQoX3BBZCwgUVVFVUVfRU5UUllfVE9fUEFDS0VUKF9wUUVudHJ5KSwgX1N0YXR1cyk7CVwKLQkJfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKLQlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgZW5jcnlwdGlvbiBiZWZvcmUgcmVhbGx5Ci0Jc2VudCBvdXQgdG8gYWlyLgotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlQTkRJU19QQUNLRVQJUG9pbnRlciB0byBvdXRnb2luZyBOZGlzIGZyYW1lCi0JCU51bWJlck9mRnJhZwlOdW1iZXIgb2YgZnJhZ21lbnQgcmVxdWlyZWQKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMgU1RBSGFyZFRyYW5zbWl0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVUNIQVIJCQlRdWVJZHgpCi17Ci0JTkRJU19QQUNLRVQJCSpwUGFja2V0OwotCVBRVUVVRV9FTlRSWQlwUUVudHJ5OwotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gU1RFUCAwLiBETyBTQU5JVFkgQ0hFQ0sgQU5EIFNPTUUgRUFSTFkgUFJFUEFSQVRJT04uCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8KLQlBU1NFUlQocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyKTsKLQlpZiAocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgicFR4QmxrLT5Ub3RhbEZyYW1lTnVtID09ICVsZCFcbiIsIHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcikpOwotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpOwotCi0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBTVEVQIDEuIFdBS0UgVVAgUEhZCi0JLy8JCW91dGdvaW5nIGZyYW1lIGFsd2F5cyB3YWtldXAgUEhZIHRvIHByZXZlbnQgZnJhbWUgbG9zdCBhbmQKLQkvLwkJdHVybiBvZmYgUFNNIGJpdCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gbm90IHRvIGNoYW5nZSBQU00gYml0LCBqdXN0IHNlbmQgdGhpcyBmcmFtZSBvdXQ/Ci0JaWYgKChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JewotCSAgICBEQkdQUklOVF9SQVcoUlRfREVCVUdfSU5GTywgKCJBc2ljRm9yY2VXYWtldXAgQXQgSGFyZFR4XG4iKSk7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCX0KLQotCS8vIEl0IHNob3VsZCBub3QgY2hhbmdlIFBTTSBiaXQsIHdoZW4gQVBTRCB0dXJuIG9uLgotCWlmICgoIShwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUpICYmIChwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlID09IEZBTFNFKSkKLQkJfHwgKFJUTVBfR0VUX1BBQ0tFVF9FQVBPTChwVHhCbGstPnBQYWNrZXQpKQotCQl8fCAoUlRNUF9HRVRfUEFDS0VUX1dBSShwVHhCbGstPnBQYWNrZXQpKSkKLQl7Ci0JCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJgotICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQKSkKLQkJCVJUTVBfU0VUX1BTTV9CSVQocEFkLCBQV1JfQUNUSVZFKTsKLQl9Ci0KLQlzd2l0Y2ggKHBUeEJsay0+VHhGcmFtZVR5cGUpCi0JewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQljYXNlIFRYX0FNUERVX0ZSQU1FOgotCQkJCVNUQV9BTVBEVV9GcmFtZV9UeChwQWQsIHBUeEJsayk7Ci0JCQlicmVhazsKLQkJY2FzZSBUWF9BTVNEVV9GUkFNRToKLQkJCQlTVEFfQU1TRFVfRnJhbWVfVHgocEFkLCBwVHhCbGspOwotCQkJYnJlYWs7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCWNhc2UgVFhfTEVHQUNZX0ZSQU1FOgotCQkJCVNUQV9MZWdhY3lfRnJhbWVfVHgocEFkLCBwVHhCbGspOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFhfTUNBU1RfRlJBTUU6Ci0JCQkJU1RBX0xlZ2FjeV9GcmFtZV9UeChwQWQsIHBUeEJsayk7Ci0JCQlicmVhazsKLQkJY2FzZSBUWF9SQUxJTktfRlJBTUU6Ci0JCQkJU1RBX0FSYWxpbmtfRnJhbWVfVHgocEFkLCBwVHhCbGspOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFhfRlJBR19GUkFNRToKLQkJCQlTVEFfRnJhZ21lbnRfRnJhbWVfVHgocEFkLCBwVHhCbGspOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl7Ci0JCQkJLy8gSXQgc2hvdWxkIG5vdCBoYXBwZW5lZCEKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZW5kIGEgcGFjZWt0IHdhcyBub3QgY2xhc3NpZmllZCEhIEl0IHNob3VsZCBub3QgaGFwcGVuIVxuIikpOwotCQkJCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcikKLQkJCQl7Ci0JCQkJCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKLQkJCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKLQkJCQkJaWYgKHBQYWNrZXQpCi0JCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKLQotfQotCi1VTE9ORyAgSGFzaEJ5dGVzUG9seW5vbWlhbChVQ0hBUiAqdmFsdWUsIHVuc2lnbmVkIGludCBsZW4pCi17Ci0gICB1bnNpZ25lZCBjaGFyICp3b3JkID0gdmFsdWU7Ci0gICB1bnNpZ25lZCBpbnQgcmV0ID0gMDsKLSAgIHVuc2lnbmVkIGludCBpOwotCi0gICBmb3IoaT0wOyBpIDwgbGVuOyBpKyspCi0gICB7Ci0JICBpbnQgbW9kID0gaSAlIDMyOwotCSAgcmV0IF49KHVuc2lnbmVkIGludCkgKHdvcmRbaV0pIDw8IG1vZDsKLQkgIHJldCBePSh1bnNpZ25lZCBpbnQpICh3b3JkW2ldKSA+PiAoMzIgLSBtb2QpOwotICAgfQotICAgcmV0dXJuIHJldDsKLX0KLQotVk9JRCBTdGFfQW5ub3VuY2Vfb3JfRm9yd2FyZF84MDJfM19QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKLXsKLQlpZiAoVFJVRQotCQkpCi0JewotCQlhbm5vdW5jZV84MDJfM19wYWNrZXQocEFkLCBwUGFja2V0KTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL3Nhbml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvc2FuaXR5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZGExNWIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvc2FuaXR5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlzYW5pdHkuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4gQ2hhbmcgIDIwMDQtMDktMDEgICAgICBhZGQgV01NIHN1cHBvcnQKLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi1leHRlcm4gVUNIQVIJQ0lTQ09fT1VJW107Ci0KLWV4dGVybiBVQ0hBUglXUEFfT1VJW107Ci1leHRlcm4gVUNIQVIJUlNOX09VSVtdOwotZXh0ZXJuIFVDSEFSCVdNRV9JTkZPX0VMRU1bXTsKLWV4dGVybiBVQ0hBUglXTUVfUEFSTV9FTEVNW107Ci1leHRlcm4gVUNIQVIJQ2N4MlFvc0luZm9bXTsKLWV4dGVybiBVQ0hBUglSQUxJTktfT1VJW107Ci1leHRlcm4gVUNIQVIJQlJPQURDT01fT1VJW107Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjawotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gTWxtZVN0YXJ0UmVxU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIENIQVIgU3NpZFtdLAotICAgIE9VVCBVQ0hBUiAqcFNzaWRMZW4pCi17Ci0gICAgTUxNRV9TVEFSVF9SRVFfU1RSVUNUICpJbmZvOwotCi0gICAgSW5mbyA9IChNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgKikoTXNnKTsKLQotICAgIGlmIChJbmZvLT5Tc2lkTGVuID4gTUFYX0xFTl9PRl9TU0lEKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVN0YXJ0UmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBTU0lEIGxlbmd0aFxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgKnBTc2lkTGVuID0gSW5mby0+U3NpZExlbjsKLSAgICBOZGlzTW92ZU1lbW9yeShTc2lkLCBJbmZvLT5Tc2lkLCAqcFNzaWRMZW4pOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjawotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotCi0gICAgSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIFBlZXJBc3NvY1JzcFNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpwTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMiwKLSAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCi0gICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKLSAgICBPVVQgVVNIT1JUICpwQWlkLAotICAgIE9VVCBVQ0hBUiBTdXBSYXRlW10sCi0gICAgT1VUIFVDSEFSICpwU3VwUmF0ZUxlbiwKLSAgICBPVVQgVUNIQVIgRXh0UmF0ZVtdLAotICAgIE9VVCBVQ0hBUiAqcEV4dFJhdGVMZW4sCi0gICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAotICAgIE9VVCBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotICAgIE9VVCBVQ0hBUgkJCSpwSHRDYXBhYmlsaXR5TGVuLAotICAgIE9VVCBVQ0hBUgkJCSpwQWRkSHRJbmZvTGVuLAotICAgIE9VVCBVQ0hBUgkJCSpwTmV3RXh0Q2hhbm5lbE9mZnNldCwKLSAgICBPVVQgUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCi0gICAgT1VUIFVDSEFSICpwQ2tpcEZsYWcpCi17Ci0gICAgQ0hBUiAgICAgICAgICBJZVR5cGUsICpQdHI7Ci0gICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOwotICAgIFBFSURfU1RSVUNUICAgcEVpZDsKLSAgICBVTE9ORyAgICAgICAgIExlbmd0aCA9IDA7Ci0KLQkqcE5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOwotCSpwSHRDYXBhYmlsaXR5TGVuID0gMDsKLQkqcEFkZEh0SW5mb0xlbiA9IDA7Ci0gICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKLSAgICBQdHIgPSAoUENIQVIpcEZyYW1lLT5PY3RldDsKLSAgICBMZW5ndGggKz0gTEVOR1RIXzgwMl8xMTsKLQotICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOwotICAgIExlbmd0aCArPSAyOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsICAgICAgICAgJnBGcmFtZS0+T2N0ZXRbMl0sIDIpOwotICAgIExlbmd0aCArPSAyOwotICAgICpwQ2tpcEZsYWcgPSAwOwotICAgICpwRXh0UmF0ZUxlbiA9IDA7Ci0gICAgcEVkY2FQYXJtLT5iVmFsaWQgPSBGQUxTRTsKLQotICAgIGlmICgqcFN0YXR1cyAhPSBNTE1FX1NVQ0NFU1MpCi0gICAgICAgIHJldHVybiBUUlVFOwotCi0gICAgTmRpc01vdmVNZW1vcnkocEFpZCwgJnBGcmFtZS0+T2N0ZXRbNF0sIDIpOwotICAgIExlbmd0aCArPSAyOwotCi0gICAgLy8gQWlkIGFscmVhZHkgc3dhcGVkIGJ5dGUgb3JkZXIgaW4gUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKCkgZm9yIGJpZyBlbmRpYW4gcGxhdGZvcm0KLSAgICAqcEFpZCA9ICgqcEFpZCkgJiAweDNmZmY7IC8vIEFJRCBpcyBsb3cgMTQtYml0Ci0KLSAgICAvLyAtLSBnZXQgc3VwcG9ydGVkIHJhdGVzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIEllVHlwZSA9IHBGcmFtZS0+T2N0ZXRbNl07Ci0gICAgKnBTdXBSYXRlTGVuID0gcEZyYW1lLT5PY3RldFs3XTsKLSAgICBpZiAoKEllVHlwZSAhPSBJRV9TVVBQX1JBVEVTKSB8fCAoKnBTdXBSYXRlTGVuID4gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwU2FuaXR5IGZhaWwgLSB3cm9uZyBTdXBwb3J0ZWRSYXRlcyBJRVxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgJnBGcmFtZS0+T2N0ZXRbOF0sICpwU3VwUmF0ZUxlbik7Ci0KLQotICAgIExlbmd0aCA9IExlbmd0aCArIDIgKyAqcFN1cFJhdGVMZW47Ci0KLSAgICAvLyBtYW55IEFQIGltcGxlbWVudCBwcm9wcmlldGFyeSBJRXMgaW4gbm9uLXN0YW5kYXJkIG9yZGVyLCB3ZSdkIGJldHRlcgotICAgIC8vIHRvbGVyYXRlIG1pcy1vcmRlcmVkIElFcyB0byBnZXQgYmVzdCBjb21wYXRpYmlsaXR5Ci0gICAgcEVpZCA9IChQRUlEX1NUUlVDVCkgJnBGcmFtZS0+T2N0ZXRbOCArICgqcFN1cFJhdGVMZW4pXTsKLQotICAgIC8vIGdldCB2YXJpYWJsZSBmaWVsZHMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgd2hpbGUgKChMZW5ndGggKyAyICsgcEVpZC0+TGVuKSA8PSBNc2dMZW4pCi0gICAgewotICAgICAgICBzd2l0Y2ggKHBFaWQtPkVpZCkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKLSAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoRXh0UmF0ZSwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7Ci0gICAgICAgICAgICAgICAgICAgICpwRXh0UmF0ZUxlbiA9IHBFaWQtPkxlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICBjYXNlIElFX0hUX0NBUDoKLSAgICAgICAgICAgIGNhc2UgSUVfSFRfQ0FQMjoKLQkJCWlmIChwRWlkLT5MZW4gPj0gU0laRV9IVF9DQVBfSUUpICAvL05vdGU6IGFsbG93IGV4dGVuc2lvbi4hIQotCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksIHBFaWQtPk9jdGV0LCBTSVpFX0hUX0NBUF9JRSk7Ci0KLQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKLQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKLQotCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSB3cm9uZyBJRV9IVF9DQVAuIFxuIikpOwotCQkJfQotCi0JCWJyZWFrOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgICAgICAgICAgY2FzZSBJRV9BRERfSFQ6Ci0gICAgICAgICAgICBjYXNlIElFX0FERF9IVDI6Ci0JCQlpZiAocEVpZC0+TGVuID49IHNpemVvZihBRERfSFRfSU5GT19JRSkpCi0JCQl7Ci0JCQkJLy8gVGhpcyBJRSBhbGxvd3MgZXh0ZW5zaW9uLCBidXQgd2UgY2FuIGlnbm9yZSBleHRyYSBieXRlcyBiZXlvbmQgb3VyIGtub3dsZWRnZSAsIHNvIG9ubHkKLQkJCQkvLyBjb3B5IGZpcnN0IHNpemVvZihBRERfSFRfSU5GT19JRSkKLQkJCQlOZGlzTW92ZU1lbW9yeShwQWRkSHRJbmZvLCBwRWlkLT5PY3RldCwgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7Ci0KLQkJCQkqKFVTSE9SVCAqKSgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMikgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMikpOwotCQkJCSooVVNIT1JUICopKCZwQWRkSHRJbmZvLT5BZGRIdEluZm8zKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkSHRJbmZvLT5BZGRIdEluZm8zKSk7Ci0KLQkJCQkqcEFkZEh0SW5mb0xlbiA9IFNJWkVfQUREX0hUX0lORk9fSUU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSB3cm9uZyBJRV9BRERfSFQuIFxuIikpOwotCQkJfQotCi0JCWJyZWFrOwotICAgICAgICAgICAgY2FzZSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUOgotCQkJaWYgKHBFaWQtPkxlbiA9PSAxKQotCQkJewotCQkJCSpwTmV3RXh0Q2hhbm5lbE9mZnNldCA9IHBFaWQtPk9jdGV0WzBdOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckFzc29jUnNwU2FuaXR5IC0gd3JvbmcgSUVfU0VDT05EQVJZX0NIX09GRlNFVC4gXG4iKSk7Ci0JCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCWJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIElFX1ZFTkRPUl9TUEVDSUZJQzoKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGUgV01FIFBBUkFNVEVSIEVMRU1FTlQKLSAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfUEFSTV9FTEVNLCA2KSAmJiAocEVpZC0+TGVuID09IDI0KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBVQ0hBUiBwdHI7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHBhcnNpbmcgRURDQSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlZhbGlkICAgICAgICAgID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUUFjayAgICAgICAgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDEwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRdWV1ZVJlcXVlc3QgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MjA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlR4b3BSZXF1ZXN0ICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg0MDsKLSAgICAgICAgICAgICAgICAgICAgLy9wRWRjYVBhcm0tPmJNb3JlRGF0YUFjayAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4ODA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50ID0gcEVpZC0+T2N0ZXRbNl0gJiAweDBmOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBUFNEQ2FwYWJsZSAgICA9IChwRWlkLT5PY3RldFs2XSAmIDB4ODApID8gMSA6IDA7Ci0gICAgICAgICAgICAgICAgICAgIHB0ciA9IChQVUNIQVIpJnBFaWQtPk9jdGV0WzhdOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFjaSA9ICgqcHRyICYgMHg2MCkgPj4gNTsgLy8gYjV+NiBpcyBBQyBJTkRFWAotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW2FjaV0gID0gKCgoKnB0cikgJiAweDEwKSA9PSAweDEwKTsgICAvLyBiNSBpcyBBQ00KLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bYWNpXSA9ICgqcHRyKSAmIDB4MGY7ICAgICAgICAgICAgICAgLy8gYjB+MyBpcyBBSUZTTgotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pblthY2ldID0gKihwdHIrMSkgJiAweDBmOyAgICAgICAgICAgICAvLyBiMH40IGlzIEN3bWluCi0gICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W2FjaV0gPSAqKHB0cisxKSA+PiA0OyAgICAgICAgICAgICAgIC8vIGI1fjggaXMgQ3dtYXgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFthY2ldICA9ICoocHRyKzIpICsgMjU2ICogKCoocHRyKzMpKTsgLy8gaW4gdW5pdCBvZiAzMi11cwotICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IDQ7IC8vIHBvaW50IHRvIG5leHQgQUMKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwU2FuaXR5IC0gaWdub3JlIHVucmVjb2duaXplZCBFSUQgPSAlZFxuIiwgcEVpZC0+RWlkKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBMZW5ndGggPSBMZW5ndGggKyAyICsgcEVpZC0+TGVuOwotICAgICAgICBwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKLSAgICB9Ci0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBQZWVyUHJvYmVSZXFTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMiwKLSAgICBPVVQgQ0hBUiBTc2lkW10sCi0gICAgT1VUIFVDSEFSICpwU3NpZExlbikKLXsKLSAgICBVQ0hBUiAgICAgICAgIElkeDsKLSAgICBVQ0hBUgkgICAgICBSYXRlTGVuOwotICAgIENIQVIgICAgICAgICAgSWVUeXBlOwotICAgIFBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOwotCi0gICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKLQotICAgIGlmICgocEZyYW1lLT5PY3RldFswXSAhPSBJRV9TU0lEKSB8fCAocEZyYW1lLT5PY3RldFsxXSA+IE1BWF9MRU5fT0ZfU1NJRCkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyUHJvYmVSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFNTSUQgSUUoVHlwZT0lZCxMZW49JWQpXG4iLHBGcmFtZS0+T2N0ZXRbMF0scEZyYW1lLT5PY3RldFsxXSkpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgKnBTc2lkTGVuID0gcEZyYW1lLT5PY3RldFsxXTsKLSAgICBOZGlzTW92ZU1lbW9yeShTc2lkLCAmcEZyYW1lLT5PY3RldFsyXSwgKnBTc2lkTGVuKTsKLQotICAgIElkeCA9ICpwU3NpZExlbiArIDI7Ci0KLSAgICAvLyAtLSBnZXQgc3VwcG9ydGVkIHJhdGVzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIEllVHlwZSA9IHBGcmFtZS0+T2N0ZXRbSWR4XTsKLSAgICBSYXRlTGVuID0gcEZyYW1lLT5PY3RldFtJZHggKyAxXTsKLSAgICBpZiAoSWVUeXBlICE9IElFX1NVUFBfUkFURVMpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyUHJvYmVSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFN1cHBvcnRSYXRlcyBJRShUeXBlPSVkLExlbj0lZClcbiIscEZyYW1lLT5PY3RldFtJZHhdLHBGcmFtZS0+T2N0ZXRbSWR4KzFdKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUcpICYmIChSYXRlTGVuIDwgOCkpCi0gICAgICAgICAgICByZXR1cm4gKEZBTFNFKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIEdldFRpbUJpdCgKLSAgICBJTiBDSEFSICpQdHIsCi0gICAgSU4gVVNIT1JUIEFpZCwKLSAgICBPVVQgVUNIQVIgKlRpbUxlbiwKLSAgICBPVVQgVUNIQVIgKkJjYXN0RmxhZywKLSAgICBPVVQgVUNIQVIgKkR0aW1Db3VudCwKLSAgICBPVVQgVUNIQVIgKkR0aW1QZXJpb2QsCi0gICAgT1VUIFVDSEFSICpNZXNzYWdlVG9NZSkKLXsKLSAgICBVQ0hBUiAgICAgICAgICBCaXRDbnRsLCBOMSwgTjIsIE15Qnl0ZSwgTXlCaXQ7Ci0gICAgQ0hBUiAgICAgICAgICAqSWR4UHRyOwotCi0gICAgSWR4UHRyID0gUHRyOwotCi0gICAgSWR4UHRyICsrOwotICAgICpUaW1MZW4gPSAqSWR4UHRyOwotCi0gICAgLy8gZ2V0IERUSU0gQ291bnQgZnJvbSBUSU0gZWxlbWVudAotICAgIElkeFB0ciArKzsKLSAgICAqRHRpbUNvdW50ID0gKklkeFB0cjsKLQotICAgIC8vIGdldCBEVElNIFBlcmlvZCBmcm9tIFRJTSBlbGVtZW50Ci0gICAgSWR4UHRyKys7Ci0gICAgKkR0aW1QZXJpb2QgPSAqSWR4UHRyOwotCi0gICAgLy8gZ2V0IEJpdG1hcCBDb250cm9sIGZyb20gVElNIGVsZW1lbnQKLSAgICBJZHhQdHIrKzsKLSAgICBCaXRDbnRsID0gKklkeFB0cjsKLQotICAgIGlmICgoKkR0aW1Db3VudCA9PSAwKSAmJiAoQml0Q250bCAmIDB4MDEpKQotICAgICAgICAqQmNhc3RGbGFnID0gVFJVRTsKLSAgICBlbHNlCi0gICAgICAgICpCY2FzdEZsYWcgPSBGQUxTRTsKLQotICAgIC8vIFBhcnNlIFBhcnRpYWwgVmlydHVhbCBCaXRtYXAgZnJvbSBUSU0gZWxlbWVudAotICAgIE4xID0gQml0Q250bCAmIDB4ZmU7ICAgIC8vIE4xIGlzIHRoZSBmaXJzdCBiaXRtYXAgYnl0ZSMKLSAgICBOMiA9ICpUaW1MZW4gLSA0ICsgTjE7ICAvLyBOMiBpcyB0aGUgbGFzdCBiaXRtYXAgYnl0ZSMKLQotICAgIGlmICgoQWlkIDwgKE4xIDw8IDMpKSB8fCAoQWlkID49ICgoTjIgKyAxKSA8PCAzKSkpCi0gICAgICAgICpNZXNzYWdlVG9NZSA9IEZBTFNFOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE15Qnl0ZSA9IChBaWQgPj4gMykgLSBOMTsgICAgICAgICAgICAgICAgICAgICAgIC8vIG15IGJ5dGUgcG9zaXRpb24gaW4gdGhlIGJpdG1hcCBieXRlLXN0cmVhbQotICAgICAgICBNeUJpdCA9IEFpZCAlIDE2IC0gKChNeUJ5dGUgJiAweDAxKT8gODowKTsKLQotICAgICAgICBJZHhQdHIgKz0gKE15Qnl0ZSArIDEpOwotCi0gICAgICAgIC8vaWYgKCpJZHhQdHIpCi0gICAgICAgIC8vICAgIERCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiVElNIGJpdG1hcCA9IDB4JTAyeFxuIiwgKklkeFB0cikpOwotCi0gICAgICAgIGlmICgqSWR4UHRyICYgKDB4MDEgPDwgTXlCaXQpKQotICAgICAgICAgICAgKk1lc3NhZ2VUb01lID0gVFJVRTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgKk1lc3NhZ2VUb01lID0gRkFMU0U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9zeW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9zeW5jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MjBlMDMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvc3luYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg0MCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXN5bmMuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4gQ2hhbmcJMjAwNC0wOS0wMSAgICAgIG1vZGlmaWVkIGZvciBydDI1NjEvMjY2MQotCUphbiBMZWUJCTIwMDYtMDgtMDEgICAgICBtb2RpZmllZCBmb3IgcnQyODYwIGZvciA4MDIuMTFuCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotI2RlZmluZSBBREhPQ19FTlRSWV9CRUFDT05fTE9TVF9USU1FCSgyKk9TX0haKQkvLyAyIHNlYwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoZSBzeW5jIHN0YXRlIG1hY2hpbmUsCi0JUGFyYW1ldGVyczoKLQkJU20gLSBwb2ludGVyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lCi0JTm90ZToKLQkJdGhlIHN0YXRlIG1hY2hpbmUgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFN5bmNTdGF0ZU1hY2hpbmVJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFNUQVRFX01BQ0hJTkUgKlNtLAotCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKLXsKLQlTdGF0ZU1hY2hpbmVJbml0KFNtLCBUcmFucywgTUFYX1NZTkNfU1RBVEUsIE1BWF9TWU5DX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBTWU5DX0lETEUsIFNZTkNfTUFDSElORV9CQVNFKTsKLQotCS8vIGNvbHVtbiAxCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9NTE1FX1NDQU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVTY2FuUmVxQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX01MTUVfSk9JTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUpvaW5SZXFBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfTUxNRV9TVEFSVF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVN0YXJ0UmVxQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX1BFRVJfQkVBQ09OLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfUEVFUl9QUk9CRV9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclByb2JlUmVxQWN0aW9uKTsKLQotCS8vY29sdW1uIDIKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX1NDQU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TY2FuKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX0pPSU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Kb2luKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX1NUQVJUX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU3RhcnQpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX1BFRVJfQkVBQ09OLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb25BdEpvaW5BY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX0JFQUNPTl9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24pOwotCi0JLy8gY29sdW1uIDMKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfTUxNRV9TQ0FOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU2Nhbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfSk9JTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkpvaW4pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9NTE1FX1NUQVJUX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU3RhcnQpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9QRUVSX0JFQUNPTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQmVhY29uQXRTY2FuQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfUEVFUl9QUk9CRV9SU1AsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJlYWNvbkF0U2NhbkFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX1NDQU5fVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylTY2FuVGltZW91dEFjdGlvbik7Ci0KLQkvLyB0aW1lciBpbml0Ci0JUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCZWFjb25UaW1lb3V0KSwgcEFkLCBGQUxTRSk7Ci0JUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oU2NhblRpbWVvdXQpLCBwQWQsIEZBTFNFKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlCZWFjb24gdGltZW91dCBoYW5kbGVyLCBleGVjdXRlZCBpbiB0aW1lciB0aHJlYWQKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBCZWFjb25UaW1lb3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLQlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNZTkMgLSBCZWFjb25UaW1lb3V0XG4iKSk7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQotCQlyZXR1cm47Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKLQkJKQotCXsKLQkJVUNIQVIgICAgICAgIEJCUFZhbHVlID0gMDsKLQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwotCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKLQkJQkJQVmFsdWUgJj0gKH4weDE4KTsKLQkJQkJQVmFsdWUgfD0gMHgxMDsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gRW5kIG9mIFNDQU4sIHJlc3RvcmUgdG8gNDBNSHogY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX0JFQUNPTl9USU1FT1VULCAwLCBOVUxMKTsKLQlSVE1QX01MTUVfSEFORExFUihwQWQpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVNjYW4gdGltZW91dCBoYW5kbGVyLCBleGVjdXRlZCBpbiB0aW1lciB0aHJlYWQKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBTY2FuVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OwotCi0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQotCQlyZXR1cm47Ci0KLQlpZiAoTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX1RJTUVPVVQsIDAsIE5VTEwpKQotCXsKLQlSVE1QX01MTUVfSEFORExFUihwQWQpOwotfQotCWVsc2UKLQl7Ci0JCS8vIFRvIHByZXZlbnQgU3luY01hY2hpbmUuQ3VyclN0YXRlIGlzIFNDQU5fTElTVEVOIGZvcmV2ZXIuCi0JCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gMDsKLQkJU2Nhbk5leHRDaGFubmVsKHBBZCk7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJewotCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQkJfQotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlNTE1FIFNDQU4gcmVxIHN0YXRlIG1hY2hpbmUgcHJvY2VkdXJlCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lU2NhblJlcUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVUNIQVIgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuLCBTY2FuVHlwZSwgQnNzVHlwZSwgQkJQVmFsdWUgPSAwOwotCUJPT0xFQU4gICAgICAgIFRpbWVyQ2FuY2VsbGVkOwotCVVMT05HCQkgICBOb3c7Ci0JVVNIT1JUICAgICAgICAgU3RhdHVzOwotCVBIRUFERVJfODAyXzExIHBIZHI4MDIxMTsKLQlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyAgICBOU3RhdHVzOwotCi0JLy8gQ2hlY2sgdGhlIHRvdGFsIHNjYW4gdHJpZXMgZm9yIG9uZSBzaW5nbGUgT0lEIGNvbW1hbmQKLQkvLyBJZiB0aGlzIGlzIHRoZSBDQ1ggMi4wIENhc2UsIHNraXAgdGhhdCEKLQlpZiAoICFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIE1sbWVTY2FuUmVxQWN0aW9uIGJlZm9yZSBTdGFydHVwXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBJbmNyZWFzZSB0aGUgc2NhbiByZXRyeSBjb3VudGVycy4KLQlwQWQtPlN0YUNmZy5TY2FuQ250Kys7Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSAgICBpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKSAmJgotICAgICAgICAoSURMRV9PTihwQWQpKSAmJgotCQkocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpICYmCi0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkKLQl7Ci0JICAgICAgICBpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IEZBTFNFKQotCQl7Ci0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIFBvd2VyV2FrZUNJRCwgMHgwMCwgMHgwMik7Ci0JCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyV2FrZUNJRCk7Ci0JCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBTTSAtIElzc3VlIFdha2UgdXAgY29tbWFuZCBcbiIpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFKTsKLQl9Ci0JfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JLy8gZmlyc3QgY2hlY2sgdGhlIHBhcmFtZXRlciBzYW5pdHkKLQlpZiAoTWxtZVNjYW5SZXFTYW5pdHkocEFkLAotCQkJCQkJICBFbGVtLT5Nc2csCi0JCQkJCQkgIEVsZW0tPk1zZ0xlbiwKLQkJCQkJCSAgJkJzc1R5cGUsCi0JCQkJCQkgIChQQ0hBUilTc2lkLAotCQkJCQkJICAmU3NpZExlbiwKLQkJCQkJCSAgJlNjYW5UeXBlKSkKLQl7Ci0KLQkJLy8gQ2hlY2sgZm9yIGNoYW5uZWwgbG9hZCBhbmQgbm9pc2UgaGlzdCByZXF1ZXN0Ci0JCS8vIFN1c3BlbmQgTVNEVSBvbmx5IGF0IHNjYW4gcmVxdWVzdCwgbm90IHRoZSBsYXN0IHR3byBtZW50aW9uZWQKLQkJLy8gU3VzcGVuZCBNU0RVIHRyYW5zbWlzc2lvbiBoZXJlCi0JCVJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbihwQWQpOwotCi0JCS8vCi0JCS8vIFRvIHByZXZlbnQgZGF0YSBsb3N0LgotCQkvLyBTZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9uIHRvIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCBiZWZvcmUgU0NBTiBwcm9ncmVzcy4KLQkJLy8gQW5kIHNob3VsZCBzZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9mZiB0byBBUCwgd2hlbiBzY2FuIHByb2dyZXNzIGRvbmUKLQkJLy8KLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJiAoSU5GUkFfT04ocEFkKSkpCi0JCXsKLQkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOwotCQkJaWYgKE5TdGF0dXMJPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCXsKLQkJCQlwSGRyODAyMTEgPSAoUEhFQURFUl84MDJfMTEpIHBPdXRCdWZmZXI7Ci0JCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBIZHI4MDIxMSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQkJcEhkcjgwMjExLT5EdXJhdGlvbiA9IDA7Ci0JCQkJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfREFUQTsKLQkJCQlwSGRyODAyMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKLQotCQkJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKLQkJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNjYW5SZXFBY3Rpb24gLS0gU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKLQkJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7Ci0JCQl9Ci0JCX0KLQotCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7Ci0JCS8vIHJlc2V0IGFsbCB0aGUgdGltZXJzCi0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0KLQkJLy8gcmVjb3JkIGRlc2lyZWQgQlNTIHBhcmFtZXRlcnMKLQkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBCc3NUeXBlOwotCQlwQWQtPk1sbWVBdXguU2NhblR5cGUgPSBTY2FuVHlwZTsKLQkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBTc2lkTGVuOwotICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIFNzaWQsIFNzaWRMZW4pOwotCi0JCS8vIHN0YXJ0IGZyb20gdGhlIGZpcnN0IGNoYW5uZWwKLQkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBGaXJzdENoYW5uZWwocEFkKTsKLQotCQkvLyBMZXQgQkJQIHJlZ2lzdGVyIGF0IDIwTUh6IHRvIGRvIHNjYW4KLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwotCQlCQlBWYWx1ZSAmPSAofjB4MTgpOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCQlAgUjQgdG8gMjBNSHoubFxuIikpOwotCQlTY2FuTmV4dENoYW5uZWwocEFkKTsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlRfRVJSKCgiU1lOQyAtIE1sbWVTY2FuUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKLQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKLQkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCU1MTUUgSk9JTiByZXEgc3RhdGUgbWFjaGluZSBwcm9jZWR1cmUKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE1sbWVKb2luUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVQ0hBUiAgICAgICAgQkJQVmFsdWUgPSAwOwotCUJTU19FTlRSWSAgICAqcEJzczsKLQlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOwotCUhFQURFUl84MDJfMTEgSGRyODAyMTE7Ci0JTkRJU19TVEFUVVMgICBOU3RhdHVzOwotCVVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOwotCVBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JUFVDSEFSICAgICAgICBwU3VwUmF0ZSA9IE5VTEw7Ci0JVUNIQVIgICAgICAgICBTdXBSYXRlTGVuOwotCVBVQ0hBUiAgICAgICAgcEV4dFJhdGUgPSBOVUxMOwotCVVDSEFSICAgICAgICAgRXh0UmF0ZUxlbjsKLQlVQ0hBUiAgICAgICAgIEFTdXBSYXRlW10gPSB7MHg4QywgMHgxMiwgMHg5OCwgMHgyNCwgMHhiMCwgMHg0OCwgMHg2MCwgMHg2Q307Ci0JVUNIQVIgICAgICAgICBBU3VwUmF0ZUxlbiA9IHNpemVvZihBU3VwUmF0ZSkvc2l6ZW9mKFVDSEFSKTsKLQlNTE1FX0pPSU5fUkVRX1NUUlVDVCAqcEluZm8gPSAoTUxNRV9KT0lOX1JFUV9TVFJVQ1QgKikoRWxlbS0+TXNnKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBNbG1lSm9pblJlcUFjdGlvbihCU1MgIyVsZClcbiIsIHBJbmZvLT5Cc3NJZHgpKTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotICAgIGlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpICYmCi0gICAgICAgIChJRExFX09OKHBBZCkpICYmCi0JCShwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkgJiYKLQkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikpKQotCXsKLQkJUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFKTsKLQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQkvLyByZXNldCBhbGwgdGhlIHRpbWVycwotCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotCXBCc3MgPSAmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbcEluZm8tPkJzc0lkeF07Ci0KLQkvLyByZWNvcmQgdGhlIGRlc2lyZWQgU1NJRCAmIEJTU0lEIHdlJ3JlIHdhaXRpbmcgZm9yCi0JQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIHBCc3MtPkJzc2lkKTsKLQotCS8vIElmIEFQJ3MgU1NJRCBpcyBub3QgaGlkZGVuLCBpdCBpcyBPSyBmb3IgdXBkYXRpbmcgc3NpZCB0byBNbG1lQXV4IGFnYWluLgotCWlmIChwQnNzLT5IaWRkZW4gPT0gMCkKLQl7Ci0JCVJUTVBaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgcEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbik7Ci0JcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBwQnNzLT5Tc2lkTGVuOwotCX0KLQotCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gcEJzcy0+QnNzVHlwZTsKLQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IHBCc3MtPkNoYW5uZWw7Ci0JcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0gcEJzcy0+Q2VudHJhbENoYW5uZWw7Ci0KLSNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi0JLy8gQ291bnRyeSBJRSBvZiB0aGUgQVAgd2lsbCBiZSBldmFsdWF0ZWQgYW5kIHdpbGwgYmUgdXNlZC4KLQlpZiAoKHBBZC0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlICE9IFJ0ODAyXzExX0RfTm9uZSkgJiYKLQkJKHBCc3MtPmJIYXNDb3VudHJ5SUUgPT0gVFJVRSkpCi0JewotCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMF0sICZwQnNzLT5Db3VudHJ5U3RyaW5nWzBdLCAyKTsKLQkJaWYgKHBCc3MtPkNvdW50cnlTdHJpbmdbMl0gPT0gJ0knKQotCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gSURPUjsKLQkJZWxzZSBpZiAocEJzcy0+Q291bnRyeVN0cmluZ1syXSA9PSAnTycpCi0JCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBPRE9SOwotCQllbHNlCi0JCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBCT1RIOwotCQlCdWlsZENoYW5uZWxMaXN0RXgocEFkKTsKLQl9Ci0jZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLwotCi0JLy8gTGV0IEJCUCByZWdpc3RlciBhdCAyME1IeiB0byBkbyBzY2FuCi0JUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwotCUJCUFZhbHVlICY9ICh+MHgxOCk7Ci0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCQlAgUjQgdG8gMjBNSHoubFxuIikpOwotCi0JLy8gc3dpdGNoIGNoYW5uZWwgYW5kIHdhaXRpbmcgZm9yIGJlYWNvbiB0aW1lcgotCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwsIEZBTFNFKTsKLQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7Ci0KLQotCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCBKT0lOX1RJTUVPVVQpOwotCi0gICAgZG8KLQl7Ci0JCWlmICgoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCi0gICAgICAgICAgICAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkgJiYKLSAgICAgICAgICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKSkKLSNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgotICAgICAgICAgICAgIHx8IChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKQotI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KLSAgICAgICAgICAgICkKLQkJewotCQkJLy8KLQkJCS8vIFdlIGNhbid0IHNlbmQgYW55IFByb2JlIHJlcXVlc3QgZnJhbWUgdG8gbWVldCA4MDIuMTFoLgotCQkJLy8KLQkJCWlmIChwQnNzLT5IaWRkZW4gPT0gMCkKLQkJCWJyZWFrOwotCQl9Ci0KLQkvLwotCS8vIHNlbmQgcHJvYmUgcmVxdWVzdAotCS8vCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKLQlpZiAoTlN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsIDw9IDE0KQotCQl7Ci0JCQlwU3VwUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGU7Ci0JCQlTdXBSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKLQkJCXBFeHRSYXRlID0gcEFkLT5Db21tb25DZmcuRXh0UmF0ZTsKLQkJCUV4dFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8KLQkJCS8vIE92ZXJ3cml0ZSBTdXBwb3J0IFJhdGUsIENDSyByYXRlIGFyZSBub3QgYWxsb3dlZAotCQkJLy8KLQkJCXBTdXBSYXRlID0gQVN1cFJhdGU7Ci0JCQlTdXBSYXRlTGVuID0gQVN1cFJhdGVMZW47Ci0JCQlFeHRSYXRlTGVuID0gMDsKLQkJfQotCi0JCWlmIChwQWQtPk1sbWVBdXguQnNzVHlwZSA9PSBCU1NfSU5GUkEpCi0JCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgcEFkLT5NbG1lQXV4LkJzc2lkLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotCQllbHNlCi0JCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgQlJPQURDQVNUX0FERFIsIEJST0FEQ0FTVF9BRERSKTsKLQotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmSGRyODAyMTEsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCi0JCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLAkgICAgcEFkLT5NbG1lQXV4LlNzaWQsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUxlbiwKLQkJCQkJCSAgU3VwUmF0ZUxlbiwgICAgICAgICAgICAgICBwU3VwUmF0ZSwKLQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCi0JCWlmIChFeHRSYXRlTGVuKQotCQl7Ci0JCQlVTE9ORyBUbXA7Ci0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcCwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlTGVuLAotCQkJCQkJCSAgRXh0UmF0ZUxlbiwgICAgICAgICAgICAgICAgICAgICAgIHBFeHRSYXRlLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJRnJhbWVMZW4gKz0gVG1wOwotCQl9Ci0KLQotCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQl9Ci0gICAgfSB3aGlsZSAoRkFMU0UpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIFN3aXRjaCB0byBjaCAlZCwgV2FpdCBCRUFDT04gZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJcEJzcy0+Q2hhbm5lbCwgcEJzcy0+QnNzaWRbMF0sIHBCc3MtPkJzc2lkWzFdLCBwQnNzLT5Cc3NpZFsyXSwgcEJzcy0+QnNzaWRbM10sIHBCc3MtPkJzc2lkWzRdLCBwQnNzLT5Cc3NpZFs1XSkpOwotCi0JcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IEpPSU5fV0FJVF9CRUFDT047Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJTUxNRSBTVEFSVCBSZXF1ZXN0IHN0YXRlIG1hY2hpbmUgcHJvY2VkdXJlLCBzdGFydGluZyBhbiBJQlNTCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lU3RhcnRSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVDSEFSICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuOwotCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0KLQkvLyBOZXcgZm9yIFdQQSBzZWN1cml0eSBzdWl0ZXMKLQlVQ0hBUgkJCQkJCVZhcklFW01BWF9WSUVfTEVOXTsJLy8gVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUKLQlORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMJKnBWSUUgPSBOVUxMOwotCUxBUkdFX0lOVEVHRVIJCQkJVGltZVN0YW1wOwotCUJPT0xFQU4gUHJpdmFjeTsKLQlVU0hPUlQgU3RhdHVzOwotCi0JLy8gSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUKLQlwVklFID0gKFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMpIFZhcklFOwotCXBWSUUtPkxlbmd0aCA9IDA7Ci0JVGltZVN0YW1wLnUuTG93UGFydCAgPSAwOwotCVRpbWVTdGFtcC51LkhpZ2hQYXJ0ID0gMDsKLQotCWlmIChNbG1lU3RhcnRSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgKFBDSEFSKVNzaWQsICZTc2lkTGVuKSkKLQl7Ci0JCS8vIHJlc2V0IGFsbCB0aGUgdGltZXJzCi0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0KLQkJLy8KLQkJLy8gU3RhcnQgYSBuZXcgSUJTUy4gQWxsIElCU1MgcGFyYW1ldGVycyBhcmUgZGVjaWRlZCBub3cuLi4uCi0JCS8vCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTdGFydFJlcUFjdGlvbiAtIFN0YXJ0IGEgbmV3IElCU1MuIEFsbCBJQlNTIHBhcmFtZXRlcnMgYXJlIGRlY2lkZWQgbm93Li4uLiBcbiIpKTsKLQkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgICAgICAgICAgID0gQlNTX0FESE9DOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgU3NpZCwgU3NpZExlbik7Ci0JCXBBZC0+TWxtZUF1eC5Tc2lkTGVuICAgICAgICAgICA9IFNzaWRMZW47Ci0KLQkJLy8gZ2VuZXJhdGUgYSByYWRvbSBudW1iZXIgYXMgQlNTSUQKLQkJTWFjQWRkclJhbmRvbUJzc2lkKHBBZCwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVN0YXJ0UmVxQWN0aW9uIC0gZ2VuZXJhdGUgYSByYWRvbSBudW1iZXIgYXMgQlNTSUQgXG4iKSk7Ci0KLQkJUHJpdmFjeSA9IChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkgfHwKLQkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKLQkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCk7Ci0JCXBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbyAgICA9IENBUF9HRU5FUkFURSgwLDEsUHJpdmFjeSwgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KSwgMSwgMCk7Ci0JCXBBZC0+TWxtZUF1eC5CZWFjb25QZXJpb2QgICAgICA9IHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZDsKLQkJcEFkLT5NbG1lQXV4LkF0aW1XaW4gICAgICAgICAgID0gcEFkLT5TdGFDZmcuQXRpbVdpbjsKLQkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgICAgICAgICAgID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQotCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgICAgPSBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKLQotCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbj0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLQkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKLQkJcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgcEFkLT5Db21tb25DZmcuRXh0UmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwotCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQotCQl7Ci0JCQlSVE1QVXBkYXRlSFRJRSgmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LCAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbMF0sICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCAmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbyk7Ci0JCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOwotCQkJLy8gTm90IHR1cm4gcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID0gVFJVRSBoZXJlLgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID0gVFJVRVxuIikpOwotCQl9Ci0JCWVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJewotCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IDA7Ci0JCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOwotCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdLCAxNik7Ci0JCX0KLQkJLy8gdGVtcG9yYXJpbHkgbm90IHN1cHBvcnQgUU9TIGluIElCU1MKLQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7Ci0JCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRYnNzTG9hZCwgc2l6ZW9mKFFCU1NfTE9BRF9QQVJNKSk7Ci0JCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOwotCi0JCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwsIEZBTFNFKTsKLQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBNbG1lU3RhcnRSZXFBY3Rpb24oY2g9ICVkLHN1cCByYXRlcz0gJWQsIGV4dCByYXRlcz0lZClcbiIsCi0JCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCwgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKSk7Ci0KLQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKLQkJU3RhdHVzID0gTUxNRV9TVUNDRVNTOwotCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwgJlN0YXR1cyk7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UX0VSUigoIlNZTkMgLSBNbG1lU3RhcnRSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbC5cbiIpKTsKLQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKLQkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NUQVJUX0NPTkYsIDIsICZTdGF0dXMpOwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlwZWVyIHNlbmRzIGJlYWNvbiBiYWNrIHdoZW4gc2Nhbm5pbmcKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFBlZXJCZWFjb25BdFNjYW5BY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVDSEFSICAgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dLCBBZGRyMltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIEJzc1R5cGUsIENoYW5uZWwsIE5ld0NoYW5uZWwsCi0JCQkJCVNzaWRMZW4sIER0aW1Db3VudCwgRHRpbVBlcmlvZCwgQmNhc3RGbGFnLCBNZXNzYWdlVG9NZTsKLQlDRl9QQVJNICAgICAgICAgQ2ZQYXJtOwotCVVTSE9SVCAgICAgICAgICBCZWFjb25QZXJpb2QsIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvOwotCVBGUkFNRV84MDJfMTEgICBwRnJhbWU7Ci0JTEFSR0VfSU5URUdFUiAgIFRpbWVTdGFtcDsKLQlVQ0hBUiAgICAgICAgICAgRXJwOwotCVVDSEFSCQlTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIJCQlTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOwotCVVTSE9SVAkJCUxlblZJRTsKLQlVQ0hBUgkJCUNraXBGbGFnOwotCVVDSEFSCQkJQWlyb25ldENlbGxQb3dlckxpbWl0OwotCUVEQ0FfUEFSTSAgICAgICBFZGNhUGFybTsKLQlRQlNTX0xPQURfUEFSTSAgUWJzc0xvYWQ7Ci0JUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OwotCVVMT05HCQkJCQkJUmFsaW5rSWU7Ci0JVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07CQkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQotCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7Ci0JSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OwotCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuID0gMCwgUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7Ci0JVUNIQVIJCQlBZGRIdEluZm9MZW47Ci0JVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKLQotCi0JLy8gTmRpc0ZpbGxNZW1vcnkoU3NpZCwgTUFYX0xFTl9PRl9TU0lELCAweDAwKTsKLQlwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSkgRWxlbS0+TXNnOwotCS8vIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlCi0JcFZJRSA9IChQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzKSBWYXJJRTsKLQlwVklFLT5MZW5ndGggPSAwOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgIFJUTVBaZXJvTWVtb3J5KCZIdENhcGFiaWxpdHksIHNpemVvZihIdENhcGFiaWxpdHkpKTsKLQlSVE1QWmVyb01lbW9yeSgmQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAotCQkJCQkJCQlFbGVtLT5Nc2csCi0JCQkJCQkJCUVsZW0tPk1zZ0xlbiwKLQkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKLQkJCQkJCQkJQWRkcjIsCi0JCQkJCQkJCUJzc2lkLAotCQkJCQkJCQkoUENIQVIpU3NpZCwKLQkJCQkJCQkJJlNzaWRMZW4sCi0JCQkJCQkJCSZCc3NUeXBlLAotCQkJCQkJCQkmQmVhY29uUGVyaW9kLAotCQkJCQkJCQkmQ2hhbm5lbCwKLQkJCQkJCQkJJk5ld0NoYW5uZWwsCi0JCQkJCQkJCSZUaW1lU3RhbXAsCi0JCQkJCQkJCSZDZlBhcm0sCi0JCQkJCQkJCSZBdGltV2luLAotCQkJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkJCSZFcnAsCi0JCQkJCQkJCSZEdGltQ291bnQsCi0JCQkJCQkJCSZEdGltUGVyaW9kLAotCQkJCQkJCQkmQmNhc3RGbGFnLAotCQkJCQkJCQkmTWVzc2FnZVRvTWUsCi0JCQkJCQkJCVN1cFJhdGUsCi0JCQkJCQkJCSZTdXBSYXRlTGVuLAotCQkJCQkJCQlFeHRSYXRlLAotCQkJCQkJCQkmRXh0UmF0ZUxlbiwKLQkJCQkJCQkJJkNraXBGbGFnLAotCQkJCQkJCQkmQWlyb25ldENlbGxQb3dlckxpbWl0LAotCQkJCQkJCQkmRWRjYVBhcm0sCi0JCQkJCQkJCSZRYnNzTG9hZCwKLQkJCQkJCQkJJlFvc0NhcGFiaWxpdHksCi0JCQkJCQkJCSZSYWxpbmtJZSwKLQkJCQkJCQkJJkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkJJlByZU5IdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJCSZIdENhcGFiaWxpdHksCi0JCQkJCQkJCSZBZGRIdEluZm9MZW4sCi0JCQkJCQkJCSZBZGRIdEluZm8sCi0JCQkJCQkJCSZOZXdFeHRDaGFubmVsT2Zmc2V0LAotCQkJCQkJCQkmTGVuVklFLAotCQkJCQkJCQlwVklFKSkKLQl7Ci0JCVVMT05HIElkeDsKLQkJQ0hBUiBSc3NpID0gMDsKLQotCQlJZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgQ2hhbm5lbCk7Ci0JCWlmIChJZHggIT0gQlNTX05PVF9GT1VORCkKLQkJCVJzc2kgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5Sc3NpOwotCi0JCVJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMikpOwotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSB8fCAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApKQotCQkJSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJSWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCAoUENIQVIpU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAotCQkJCQkgICZDZlBhcm0sIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLCAgJkh0Q2FwYWJpbGl0eSwKLQkJCQkJICZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLAotCQkJCQkgJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotI2lmZGVmIERPVDExTl9EUkFGVDMKLQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbcEFkLT5Db21tb25DZmcuQ2hhbm5lbExpc3RJZHhdLmJFZmZlY3RlZENoYW5uZWwgPT0gVFJVRSkKLQkJewotCQkJVUNIQVIJCVJlZ0NsYXNzOwotCQkJUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5MihwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmUmVnQ2xhc3MpOwotCQkJVHJpRXZlbnRUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYiwgQnNzaWQsICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgUmVnQ2xhc3MsIENoYW5uZWwpOwotCQl9Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpCi0JCXsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlBUU0YsICZFbGVtLT5Nc2dbMjRdLCA0KTsKLQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5UVFNGWzBdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVFRTRls0XSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOwotCQl9Ci0KLQl9Ci0JLy8gc2FuaXR5IGNoZWNrIGZhaWwsIGlnbm9yZWQKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlXaGVuIHdhaXRpbmcgam9pbmluZyB0aGUgKEkpQlNTLCBiZWFjb24gcmVjZWl2ZWQgZnJvbSBleHRlcm5hbAotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUGVlckJlYWNvbkF0Sm9pbkFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVUNIQVIgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dLCBBZGRyMltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuLCBCc3NUeXBlLCBDaGFubmVsLCBNZXNzYWdlVG9NZSwKLQkJCQkgIER0aW1Db3VudCwgRHRpbVBlcmlvZCwgQmNhc3RGbGFnLCBOZXdDaGFubmVsOwotCUxBUkdFX0lOVEVHRVIgVGltZVN0YW1wOwotCVVTSE9SVCAgICAgICAgQmVhY29uUGVyaW9kLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbzsKLQlDRl9QQVJNICAgICAgIENmOwotCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0JVUNIQVIgICAgICAgICBFcnA7Ci0JVUNIQVIgICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIJCSAgU3VwUmF0ZUxlbiwgRXh0UmF0ZUxlbjsKLQlVQ0hBUiAgICAgICAgIENraXBGbGFnOwotCVVTSE9SVAkJICBMZW5WSUU7Ci0JVUNIQVIJCSAgQWlyb25ldENlbGxQb3dlckxpbWl0OwotCUVEQ0FfUEFSTSAgICAgICBFZGNhUGFybTsKLQlRQlNTX0xPQURfUEFSTSAgUWJzc0xvYWQ7Ci0JUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OwotCVVTSE9SVCAgICAgICAgU3RhdHVzOwotCVVDSEFSCQkJCQkJVmFySUVbTUFYX1ZJRV9MRU5dOwkJLy8gVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUKLQlORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMJKnBWSUUgPSBOVUxMOwotCVVMT05HICAgICAgICAgICBSYWxpbmtJZTsKLQlVTE9ORyAgICAgICAgIElkeDsKLQlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7Ci0JQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JVUNIQVIJCQkJSHRDYXBhYmlsaXR5TGVuID0gMCwgUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7Ci0JVUNIQVIJCQlBZGRIdEluZm9MZW47Ci0JVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlVQ0hBUgkJCUNlbnRyYWxDaGFubmVsOwotCUJPT0xFQU4JCQliQWxsb3dOcmF0ZSA9IEZBTFNFOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JLy8gSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUKLQlwVklFID0gKFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMpIFZhcklFOwotCXBWSUUtPkxlbmd0aCA9IDA7Ci0gICAgUlRNUFplcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEh0Q2FwYWJpbGl0eSkpOwotCVJUTVBaZXJvTWVtb3J5KCZBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOwotCi0KLQlpZiAoUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KHBBZCwKLQkJCQkJCQkJRWxlbS0+TXNnLAotCQkJCQkJCQlFbGVtLT5Nc2dMZW4sCi0JCQkJCQkJCUVsZW0tPkNoYW5uZWwsCi0JCQkJCQkJCUFkZHIyLAotCQkJCQkJCQlCc3NpZCwKLQkJCQkJCQkJKFBDSEFSKVNzaWQsCi0JCQkJCQkJCSZTc2lkTGVuLAotCQkJCQkJCQkmQnNzVHlwZSwKLQkJCQkJCQkJJkJlYWNvblBlcmlvZCwKLQkJCQkJCQkJJkNoYW5uZWwsCi0JCQkJCQkJCSZOZXdDaGFubmVsLAotCQkJCQkJCQkmVGltZVN0YW1wLAotCQkJCQkJCQkmQ2YsCi0JCQkJCQkJCSZBdGltV2luLAotCQkJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkJCSZFcnAsCi0JCQkJCQkJCSZEdGltQ291bnQsCi0JCQkJCQkJCSZEdGltUGVyaW9kLAotCQkJCQkJCQkmQmNhc3RGbGFnLAotCQkJCQkJCQkmTWVzc2FnZVRvTWUsCi0JCQkJCQkJCVN1cFJhdGUsCi0JCQkJCQkJCSZTdXBSYXRlTGVuLAotCQkJCQkJCQlFeHRSYXRlLAotCQkJCQkJCQkmRXh0UmF0ZUxlbiwKLQkJCQkJCQkJJkNraXBGbGFnLAotCQkJCQkJCQkmQWlyb25ldENlbGxQb3dlckxpbWl0LAotCQkJCQkJCQkmRWRjYVBhcm0sCi0JCQkJCQkJCSZRYnNzTG9hZCwKLQkJCQkJCQkJJlFvc0NhcGFiaWxpdHksCi0JCQkJCQkJCSZSYWxpbmtJZSwKLQkJCQkJCQkJJkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkJJlByZU5IdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJCSZIdENhcGFiaWxpdHksCi0JCQkJCQkJCSZBZGRIdEluZm9MZW4sCi0JCQkJCQkJCSZBZGRIdEluZm8sCi0JCQkJCQkJCSZOZXdFeHRDaGFubmVsT2Zmc2V0LAotCQkJCQkJCQkmTGVuVklFLAotCQkJCQkJCQlwVklFKSkKLQl7Ci0JCS8vIERpc3F1YWxpZnkgMTFiIG9ubHkgYWRob2Mgd2hlbiB3ZSBhcmUgaW4gMTFnIG9ubHkgYWRob2MgbW9kZQotCQlpZiAoKEJzc1R5cGUgPT0gQlNTX0FESE9DKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFHKSAmJiAoKFN1cFJhdGVMZW4rRXh0UmF0ZUxlbik8IDEyKSkKLQkJCXJldHVybjsKLQotCQkvLyBCRUFDT04gZnJvbSBkZXNpcmVkIEJTUy9JQlNTIGZvdW5kLiBXZSBzaG91bGQgYmUgYWJsZSB0byBkZWNpZGUgbW9zdAotCQkvLyBCU1MgcGFyYW1ldGVycyBoZXJlLgotCQkvLyBRLiBCdXQgd2hhdCBoYXBwZW4gaWYgdGhpcyBKT0lOIGRvZXNuJ3QgY29uY2x1ZGUgYSBzdWNjZXNzZnVsIEFTU09DSUFURUlPTj8KLQkJLy8gICAgRG8gd2UgbmVlZCB0byByZWNlb3ZlciBiYWNrIGFsbCBwYXJhbWV0ZXJzIGJlbG9uZ2luZyB0byBwcmV2aW91cyBCU1M/Ci0JCS8vIEEuIFNob3VsZCBiZSBub3QuIFRoZXJlJ3Mgbm8gYmFjay1kb29yIHJlY292ZXIgdG8gcHJldmlvdXMgQVAuIEl0IHN0aWxsIG5lZWQKLQkJLy8gICAgYSBuZXcgSk9JTi1BVVRILUFTU09DIHNlcXVlbmNlLgotCQlpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBCc3NpZCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSByZWNlaXZlIGRlc2lyZWQgQkVBQ09OIGF0IEpvaW5XYWl0QmVhY29uLi4uIENoYW5uZWwgPSAlZFxuIiwgQ2hhbm5lbCkpOwotCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0KLQkJCS8vIFVwZGF0ZSBSU1NJIHRvIHByZXZlbnQgTm8gc2lnbmFsIGRpc3BsYXkgd2hlbiBjYXJkcyBmaXJzdCBpbml0aWFsaXplZAotCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCk7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMQk9IENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMSwgUlNTSV8xKTsKLQkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyCT0gQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpOwotCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMAk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwOwotCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMFg4CT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCA8PCAzOwotCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMQk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxOwotCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMVg4CT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSA8PCAzOwotCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMgk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyOwotCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMlg4CT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMiA8PCAzOwotCi0JCQkvLwotCQkJLy8gV2UgbmVlZCB0byBjaGVjayBpZiBTU0lEIG9ubHkgc2V0IHRvIGFueSwgdGhlbiB3ZSBjYW4gcmVjb3JkIHRoZSBjdXJyZW50IFNTSUQuCi0JCQkvLyBPdGhlcndpc2Ugd2lsbCBjYXVzZSBoaWRkZW4gU1NJRCBhc3NvY2lhdGlvbiBmYWlsZWQuCi0JCQkvLwotCQkJaWYgKHBBZC0+TWxtZUF1eC5Tc2lkTGVuID09IDApCi0JCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIFNzaWQsIFNzaWRMZW4pOwotCQkJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gU3NpZExlbjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlJZHggPSBCc3NTc2lkVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbiwgQ2hhbm5lbCk7Ci0KLQkJCQlpZiAoSWR4ID09IEJTU19OT1RfRk9VTkQpCi0JCQkJewotCQkJCQlDSEFSIFJzc2kgPSAwOwotCQkJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMSwgUlNTSV8xKSwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpKTsKLQkJCQkJSWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCAoQ0hBUiAqKSBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCi0JCQkJCQkJCQkJJkNmLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwgICZIdENhcGFiaWxpdHksCi0JCQkJCQkJCQkJJkFkZEh0SW5mbywgSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sIE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsCi0JCQkJCQkJCQkJJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOwotCQkJCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpCi0JCQkJCXsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlBUU0YsICZFbGVtLT5Nc2dbMjRdLCA0KTsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5UVFNGWzBdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7Ci0JCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVFRTRls0XSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOwotCQkJCQkJQ2FwYWJpbGl0eUluZm8gPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5DYXBhYmlsaXR5SW5mbzsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLwotCQkJCQkvLyBNdWx0aXBsZSBTU0lEIGNhc2UsIHVzZWQgY29ycmVjdCBDYXBhYmlsaXR5SW5mbwotCQkJCQkvLwotCQkJCQlDYXBhYmlsaXR5SW5mbyA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLkNhcGFiaWxpdHlJbmZvOwotCQkJCX0KLQkJCX0KLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Cc3NpZCwgQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0JCQlwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87Ci0JCQlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IEJzc1R5cGU7Ci0JCQlwQWQtPk1sbWVBdXguQmVhY29uUGVyaW9kID0gQmVhY29uUGVyaW9kOwotCQkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBDaGFubmVsOwotCQkJcEFkLT5NbG1lQXV4LkF0aW1XaW4gPSBBdGltV2luOwotCQkJcEFkLT5NbG1lQXV4LkNmcFBlcmlvZCA9IENmLkNmcFBlcmlvZDsKLQkJCXBBZC0+TWxtZUF1eC5DZnBNYXhEdXJhdGlvbiA9IENmLkNmcE1heER1cmF0aW9uOwotCQkJcEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgPSBSYWxpbmtJZTsKLQotCQkJLy8gQ29weSBBUCdzIHN1cHBvcnRlZCByYXRlIHRvIE1sbWVBdXggZm9yIGNyZWF0aW5nIGFzc29pY2F0aW9uIHJlcXVlc3QKLQkJCS8vIEFsc28gZmlsdGVyIG91dCBub3Qgc3VwcG9ydGVkIHJhdGUKLQkJCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuID0gU3VwUmF0ZUxlbjsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBTdXBSYXRlLCBTdXBSYXRlTGVuKTsKLQkJCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7Ci0JCQlwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47Ci0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7Ci0JCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pOwotCi0gICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldCwgMTYpOwotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCWlmICgoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBOZGlzODAyXzExV0VQRW5hYmxlZCkgJiYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSkKLQkJCQl8fCAocEFkLT5Db21tb25DZmcuSFRfRGlzYWxsb3dUS0lQID09IEZBTFNFKSkKLQkJCXsKLQkJCQliQWxsb3dOcmF0ZSA9IFRSVUU7Ci0JCQl9Ci0KLQkJCXBBZC0+TWxtZUF1eC5OZXdFeHRDaGFubmVsT2Zmc2V0ID0gTmV3RXh0Q2hhbm5lbE9mZnNldDsKLQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSBIdENhcGFiaWxpdHlMZW47Ci0KLQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBTSVpFX0hUX0NBUF9JRSk7Ci0JCQkvLyBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCBodCByYXRlcwotCQkJaWYgKCgoSHRDYXBhYmlsaXR5TGVuID4gMCkgfHwgKFByZU5IdENhcGFiaWxpdHlMZW4gPiAwKSkgJiYKLQkJCQkoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYgKGJBbGxvd05yYXRlKSkpCi0JCQl7Ci0JCQkJUlRNUE1vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sICZBZGRIdEluZm8sIFNJWkVfQUREX0hUX0lORk9fSUUpOwotCi0JCQkJLy8gU3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1DU1NldCBzdG9yZXMgUGVlciBBUCdzIDExbiBSeCBjYXBhYmlsaXR5Ci0JCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIEh0Q2FwYWJpbGl0eS5NQ1NTZXQsIDE2KTsKLQkJCQlwQWQtPk1sbWVBdXguTmV3RXh0Q2hhbm5lbE9mZnNldCA9IE5ld0V4dENoYW5uZWxPZmZzZXQ7Ci0JCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOwotCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gVFJVRTsKLQkJCQlpZiAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApCi0JCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYlByZU5IdCA9IFRSVUU7Ci0JCQkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCAmSHRDYXBhYmlsaXR5LCAmQWRkSHRJbmZvKTsKLQkJCQkvLyBDb3B5IEFQIFBhcmFtZXRlciB0byBTdGFBY3RpdmUuICBUaGlzIGlzIGFsc28gaW4gTGlua1VwLgotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BdEpvaW5BY3Rpb24hIChNcGR1RGVuc2l0eT0lZCwgTWF4UkFtcGR1RmFjdG9yPSVkLCBCVz0lZClcbiIsCi0JCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1wZHVEZW5zaXR5LCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NYXhSQW1wZHVGYWN0b3IsIEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoKSk7Ci0KLQkJCQlpZiAoQWRkSHRJbmZvTGVuID4gMCkKLQkJCQl7Ci0JCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuOwotCQkJCQkvLyBDaGVjayBhZ2FpbiB0aGUgQmFuZHdpZHRoIGNhcGFiaWxpdHkgb2YgdGhpcyBBUC4KLQkJCQkJaWYgKChBZGRIdEluZm8uQ29udHJvbENoYW4gPiAyKSYmIChBZGRIdEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSAmJiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotCQkJCQl7Ci0JCQkJCQlDZW50cmFsQ2hhbm5lbCA9IEFkZEh0SW5mby5Db250cm9sQ2hhbiAtIDI7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoKEFkZEh0SW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQUJPVkUpICYmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JCQkJCXsKLQkJCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuICsgMjsKLQkJCQkJfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIEVycm9yIC4KLQkJCQkJaWYgKHBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCAhPSBDZW50cmFsQ2hhbm5lbCkKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlBlZXJCZWFjb25BdEpvaW5BY3Rpb24gSFQ9PT0+QmVhY29uIENlbnRyYWwgQ2hhbm5lbCA9ICVkLCBDb250cm9sIENoYW5uZWwgPSAlZC4gTWxtZWF1eCBDZW50cmFsQ2hhbm5lbCA9ICVkXG4iLCBDZW50cmFsQ2hhbm5lbCwgQWRkSHRJbmZvLkNvbnRyb2xDaGFuLCBwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwpKTsKLQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uIEhUPT09PkNlbnRyYWwgQ2hhbm5lbCA9ICVkLCBDb250cm9sIENoYW5uZWwgPSAlZCwgIC5cbiIsIENlbnRyYWxDaGFubmVsLCBBZGRIdEluZm8uQ29udHJvbENoYW4pKTsKLQotCQkJCX0KLQotCQkJfQotCQkJZWxzZQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJewotCQkJCS8vIFRvIHByZXZlbnQgZXJyb3IsIGxldCBsZWdhY3kgQVAgbXVzdCBoYXZlIHNhbWUgQ2VudHJhbENoYW5uZWwgYW5kIENoYW5uZWwuCi0JCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYgKFByZU5IdENhcGFiaWxpdHlMZW4gPT0gMCkpCi0JCQkJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+TWxtZUF1eC5DaGFubmVsOwotCi0JCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKLQkJCQlwQWQtPk1sbWVBdXguTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7Ci0JCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKLQkJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gMDsKLQkJCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgU0laRV9BRERfSFRfSU5GT19JRSk7Ci0JCQl9Ci0KLQkJCVJUTVBVcGRhdGVNbG1lUmF0ZShwQWQpOwotCi0JCQkvLyBjb3B5IFFPUyByZWxhdGVkIGluZm9ybWF0aW9uCi0JCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJCSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJCSkKLQkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sICZFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRYnNzTG9hZCwgJlFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwgJlFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7Ci0JCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKLQkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKLQkJCX0KLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIGFmdGVyIEpPSU4sIFN1cFJhdGVMZW49JWQsIEV4dFJhdGVMZW49JWRcbiIsCi0JCQkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKSk7Ci0KLQkJCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgIT0gMHhGRikKLQkJCXsKLQkJCQkvL1dlIG5lZWQgdG8gY2hhbmdlIG91ciBUeFBvd2VyIGZvciBDQ1ggMi4wIEFQIENvbnRyb2wgb2YgQ2xpZW50IFRyYW5zbWl0IFBvd2VyCi0JCQkJQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdChwQWQsIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCk7Ci0JCQl9Ci0JCQllbHNlICAvL1VzZWQgdGhlIGRlZmF1bHQgVFggUG93ZXIgUGVyY2VudGFnZS4KLQkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OwotCi0JCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwotCQkJU3RhdHVzID0gTUxNRV9TVUNDRVNTOwotCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0pPSU5fQ09ORiwgMiwgJlN0YXR1cyk7Ci0JCX0KLQkJLy8gbm90IHRvIG1lIEJFQUNPTiwgaWdub3JlZAotCX0KLQkvLyBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlIHRoaXMgZnJhbWUKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlyZWNlaXZlIEJFQUNPTiBmcm9tIHBlZXIKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBQZWVyQmVhY29uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVQ0hBUiAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JQ0hBUiAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0JQ0ZfUEFSTSAgICAgICBDZlBhcm07Ci0JVUNIQVIgICAgICAgICBTc2lkTGVuLCBNZXNzYWdlVG9NZT0wLCBCc3NUeXBlLCBDaGFubmVsLCBOZXdDaGFubmVsLCBpbmRleD0wOwotCVVDSEFSICAgICAgICAgRHRpbUNvdW50PTAsIER0aW1QZXJpb2Q9MCwgQmNhc3RGbGFnPTA7Ci0JVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbywgQXRpbVdpbiwgQmVhY29uUGVyaW9kOwotCUxBUkdFX0lOVEVHRVIgVGltZVN0YW1wOwotCVVTSE9SVCAgICAgICAgVGJ0dE51bVRvTmV4dFdha2VVcDsKLQlVQ0hBUiAgICAgICAgIEVycDsKLQlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUgkJICBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOwotCVVDSEFSCQkgIENraXBGbGFnOwotCVVTSE9SVCAgICAgICAgTGVuVklFOwotCVVDSEFSCQkgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdDsKLQlFRENBX1BBUk0gICAgICAgRWRjYVBhcm07Ci0JUUJTU19MT0FEX1BBUk0gIFFic3NMb2FkOwotCVFPU19DQVBBQklMSVRZX1BBUk0gUW9zQ2FwYWJpbGl0eTsKLQlVTE9ORyAgICAgICAgICAgUmFsaW5rSWU7Ci0JLy8gTmV3IGZvciBXUEEgc2VjdXJpdHkgc3VpdGVzCi0JVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07CQkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQotCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7Ci0JSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OwotCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLCBQcmVOSHRDYXBhYmlsaXR5TGVuOwotCVVDSEFSCQkJQWRkSHRJbmZvTGVuOwotCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7Ci0KLQotI2lmZGVmIFJBTElOS19BVEUKLSAgICBpZiAoQVRFX09OKHBBZCkpCi0gICAgewotCQlyZXR1cm47Ci0gICAgfQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCWlmICghKElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKQotCQkpKQotCQlyZXR1cm47Ci0KLQkvLyBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZQotCXBWSUUgPSAoUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcykgVmFySUU7Ci0JcFZJRS0+TGVuZ3RoID0gMDsKLSAgICBSVE1QWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5LCBzaXplb2YoSHRDYXBhYmlsaXR5KSk7Ci0JUlRNUFplcm9NZW1vcnkoJkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7Ci0KLQlpZiAoUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KHBBZCwKLQkJCQkJCQkJRWxlbS0+TXNnLAotCQkJCQkJCQlFbGVtLT5Nc2dMZW4sCi0JCQkJCQkJCUVsZW0tPkNoYW5uZWwsCi0JCQkJCQkJCUFkZHIyLAotCQkJCQkJCQlCc3NpZCwKLQkJCQkJCQkJU3NpZCwKLQkJCQkJCQkJJlNzaWRMZW4sCi0JCQkJCQkJCSZCc3NUeXBlLAotCQkJCQkJCQkmQmVhY29uUGVyaW9kLAotCQkJCQkJCQkmQ2hhbm5lbCwKLQkJCQkJCQkJJk5ld0NoYW5uZWwsCi0JCQkJCQkJCSZUaW1lU3RhbXAsCi0JCQkJCQkJCSZDZlBhcm0sCi0JCQkJCQkJCSZBdGltV2luLAotCQkJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkJCSZFcnAsCi0JCQkJCQkJCSZEdGltQ291bnQsCi0JCQkJCQkJCSZEdGltUGVyaW9kLAotCQkJCQkJCQkmQmNhc3RGbGFnLAotCQkJCQkJCQkmTWVzc2FnZVRvTWUsCi0JCQkJCQkJCVN1cFJhdGUsCi0JCQkJCQkJCSZTdXBSYXRlTGVuLAotCQkJCQkJCQlFeHRSYXRlLAotCQkJCQkJCQkmRXh0UmF0ZUxlbiwKLQkJCQkJCQkJJkNraXBGbGFnLAotCQkJCQkJCQkmQWlyb25ldENlbGxQb3dlckxpbWl0LAotCQkJCQkJCQkmRWRjYVBhcm0sCi0JCQkJCQkJCSZRYnNzTG9hZCwKLQkJCQkJCQkJJlFvc0NhcGFiaWxpdHksCi0JCQkJCQkJCSZSYWxpbmtJZSwKLQkJCQkJCQkJJkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkJJlByZU5IdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJCSZIdENhcGFiaWxpdHksCi0JCQkJCQkJCSZBZGRIdEluZm9MZW4sCi0JCQkJCQkJCSZBZGRIdEluZm8sCi0JCQkJCQkJCSZOZXdFeHRDaGFubmVsT2Zmc2V0LAotCQkJCQkJCQkmTGVuVklFLAotCQkJCQkJCQlwVklFKSkKLQl7Ci0JCUJPT0xFQU4gaXNfbXlfYnNzaWQsIGlzX215X3NzaWQ7Ci0JCVVMT05HICAgQnNzaWR4LCBOb3c7Ci0JCUJTU19FTlRSWSAqcEJzczsKLQkJQ0hBUgkJUmVhbFJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMikpOwotCi0JCWlzX215X2Jzc2lkID0gTUFDX0FERFJfRVFVQUwoQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKT8gVFJVRSA6IEZBTFNFOwotCQlpc19teV9zc2lkID0gU1NJRF9FUVVBTChTc2lkLCBTc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKT8gVFJVRTpGQUxTRTsKLQotCi0JCS8vIGlnbm9yZSBCRUFDT04gbm90IGZvciBteSBTU0lECi0JCWlmICgoISBpc19teV9zc2lkKSAmJiAoISBpc19teV9ic3NpZCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gSXQgbWVhbnMgU1RBIHdhaXRzIGRpc2Fzc29jIGNvbXBsZXRlbHkgZnJvbSB0aGlzIEFQLCBpZ25vcmVzIHRoaXMgYmVhY29uLgotCQlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX1dBSVRfRElTQVNTT0MpCi0JCQlyZXR1cm47Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJLy8gQ29weSBDb250cm9sIGNoYW5uZWwgZm9yIHRoaXMgQlNTSUQuCi0JCWlmIChBZGRIdEluZm9MZW4gIT0gMCkKLQkJCUNoYW5uZWwgPSBBZGRIdEluZm8uQ29udHJvbENoYW47Ci0KLQkJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSB8fCAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApKQotCQkJSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJLy8KLQkJLy8gSG91c2VrZWVwaW5nICJTc2lkQnNzVGFiIiB0YWJsZSBmb3IgbGF0ZXItb24gUk9BTWluZyB1c2FnZS4KLQkJLy8KLQkJQnNzaWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsIENoYW5uZWwpOwotCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpCi0JCXsKLQkJCS8vIGRpc2NvdmVyIG5ldyBBUCBvZiB0aGlzIG5ldHdvcmssIGNyZWF0ZSBCU1MgZW50cnkKLQkJCUJzc2lkeCA9IEJzc1RhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TY2FuVGFiLCBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAotCQkJCQkJICZDZlBhcm0sIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLAotCQkJCQkJJkh0Q2FwYWJpbGl0eSwgJkFkZEh0SW5mbyxIdENhcGFiaWxpdHlMZW4sQWRkSHRJbmZvTGVuLE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsCi0JCQkJCQlSZWFsUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwKLQkJCQkJCSZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKLQkJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkgLy8gcmV0dXJuIGlmIEJTUyB0YWJsZSBmdWxsCi0JCQkJcmV0dXJuOwotCi0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5QVFNGLCAmRWxlbS0+TXNnWzI0XSwgNCk7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uVFRTRlswXSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOwotCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLlRUU0ZbNF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKLQotCi0KLQkJfQotCi0JCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgKE5ld0NoYW5uZWwgIT0gMCkgJiYgKENoYW5uZWwgIT0gTmV3Q2hhbm5lbCkpCi0JCXsKLQkJCS8vIFN3aXRjaGluZyB0byBjaGFubmVsIDEgY2FuIHByZXZlbnQgZnJvbSByZXNjYW5uaW5nIHRoZSBjdXJyZW50IGNoYW5uZWwgaW1tZWRpYXRlbHkgKGJ5IGF1dG8gcmVjb25uZWN0aW9uKS4KLQkJCS8vIEluIGFkZGl0aW9uLCBjbGVhciB0aGUgTUxNRSBxdWV1ZSBhbmQgdGhlIHNjYW4gdGFibGUgdG8gZGlzY2FyZCB0aGUgUlggcGFja2V0cyBhbmQgcHJldmlvdXMgc2Nhbm5pbmcgcmVzdWx0cy4KLQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgMSwgRkFMU0UpOwotCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgMSk7Ci0JCSAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKLQkJCU1sbWVRdWV1ZUluaXQoJnBBZC0+TWxtZS5RdWV1ZSk7Ci0JCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7Ci0JCSAgICBSVE1QdXNlY0RlbGF5KDEwMDAwMDApOwkJLy8gdXNlIGRlbGF5IHRvIHByZXZlbnQgU1RBIGRvIHJlYXNzb2MKLQotCQkJLy8gY2hhbm5lbCBzYW5pdHkgY2hlY2sKLQkJCWZvciAoaW5kZXggPSAwIDsgaW5kZXggPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpbmRleCsrKQotCQkJewotCQkJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2luZGV4XS5DaGFubmVsID09IE5ld0NoYW5uZWwpCi0JCQkJewotCQkJCQlwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsID0gTmV3Q2hhbm5lbDsKLQkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7Ci0JCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbiAtIFNUQSByZWNlaXZlIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBJRSAoTmV3IENoYW5uZWwgPSVkKVxuIiwgTmV3Q2hhbm5lbCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChpbmRleCA+PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQotCQkJewotCQkJCURCR1BSSU5UX0VSUigoIlBlZXJCZWFjb24oY2FuIG5vdCBmaW5kIE5ldyBDaGFubmVsPSVkIGluIENoYW5uZWxMaXN0WyVkXVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5DaGFubmVsTGlzdE51bSkpOwotCQkJfQotCQl9Ci0KLQkJLy8gaWYgdGhlIHNzaWQgbWF0Y2hlZCAmIGJzc2lkIHVubWF0Y2hlZCwgd2Ugc2hvdWxkIHNlbGVjdCB0aGUgYnNzaWQgd2l0aCBsYXJnZSB2YWx1ZS4KLQkJLy8gVGhpcyBtaWdodCBoYXBwZW5lZCB3aGVuIHR3byBTVEEgc3RhcnQgYXQgdGhlIHNhbWUgdGltZQotCQlpZiAoKCEgaXNfbXlfYnNzaWQpICYmIEFESE9DX09OKHBBZCkpCi0JCXsKLQkJCUlOVAlpOwotCi0JCQkvLyBBZGQgdGhlIHNhZmVndWFyZCBhZ2FpbnN0IHRoZSBtaXNtYXRjaCBvZiBhZGhvYyB3ZXAgc3RhdHVzCi0JCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLldlcFN0YXR1cykKLQkJCXsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIGNvbGxhcHNlIGludG8gdGhlIEFESE9DIG5ldHdvcmsgd2hpY2ggaGFzIGJpZ2dlciBCU1NJRCB2YWx1ZS4KLQkJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JCQl7Ci0JCQkJaWYgKEJzc2lkW2ldID4gcEFkLT5Db21tb25DZmcuQnNzaWRbaV0pCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gbWVyZ2UgdG8gdGhlIElCU1Mgd2l0aCBiaWdnZXIgQlNTSUQ9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQkJCQlCc3NpZFswXSwgQnNzaWRbMV0sIEJzc2lkWzJdLCBCc3NpZFszXSwgQnNzaWRbNF0sIEJzc2lkWzVdKSk7Ci0JCQkJCUFzaWNEaXNhYmxlU3luYyhwQWQpOwotCQkJCQlDT1BZX01BQ19BRERSKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBCc3NpZCk7Ci0JCQkJCUFzaWNTZXRCc3NpZChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCQkJTWFrZUlic3NCZWFjb24ocEFkKTsgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQotCQkJCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsgICAgLy8gY29weSBCRUFDT04gZnJhbWUgdG8gb24tY2hpcCBtZW1vcnkKLQkJCQkJaXNfbXlfYnNzaWQgPSBUUlVFOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoQnNzaWRbaV0gPCBwQWQtPkNvbW1vbkNmZy5Cc3NpZFtpXSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCi0JCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7Ci0JCXBCc3MgPSAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF07Ci0JCXBCc3MtPlJzc2kgPSBSZWFsUnNzaTsgICAgICAgLy8gbGFzdGVzdCBSU1NJCi0JCXBCc3MtPkxhc3RCZWFjb25SeFRpbWUgPSBOb3c7ICAgLy8gbGFzdCBSWCB0aW1lc3RhbXAKLQotCQkvLwotCQkvLyBCRUFDT04gZnJvbSBteSBCU1NJRCAtIGVpdGhlciBJQlNTIG9yIElORlJBIG5ldHdvcmsKLQkJLy8KLQkJaWYgKGlzX215X2Jzc2lkKQotCQl7Ci0JCQlSWFdJX1NUUlVDCVJ4V0k7Ci0KLQkJCXBBZC0+U3RhQ2ZnLkR0aW1Db3VudCA9IER0aW1Db3VudDsKLQkJCXBBZC0+U3RhQ2ZnLkR0aW1QZXJpb2QgPSBEdGltUGVyaW9kOwotCQkJcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSA9IE5vdzsKLQotCi0JCQlSeFdJLlJTU0kwID0gRWxlbS0+UnNzaTA7Ci0JCQlSeFdJLlJTU0kxID0gRWxlbS0+UnNzaTE7Ci0JCQlSeFdJLlJTU0kyID0gRWxlbS0+UnNzaTI7Ci0KLQkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLCAmUnhXSSk7Ci0JCQlpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0ICE9IDB4RkYpCi0JCQl7Ci0JCQkJLy8KLQkJCQkvLyBXZSBnZXQgdGhlIENpc2NvIChjY3gpICJUeFBvd2VyIExpbWl0IiByZXF1aXJlZAotCQkJCS8vIENoYW5nZWQgdG8gYXBwcm9wcmlhdGUgVHhQb3dlciBMaW1pdCBmb3IgQ2lzbyBDb21wYXRpYmxlIEV4dGVuc2lvbnMKLQkJCQkvLwotCQkJCUNoYW5nZVRvQ2VsbFBvd2VyTGltaXQocEFkLCBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vCi0JCQkJLy8gQWlyb25ldENlbGxQb3dlckxpbWl0IGVxdWFsIHRvIDB4RkYgbWVhbnMgdGhlIENpc2NvIChjY3gpICJUeFBvd2VyIExpbWl0IiBub3QgZXhpc3QuCi0JCQkJLy8gVXNlZCB0aGUgZGVmYXVsdCBUWCBQb3dlciBQZXJjZW50YWdlLCB0aGF0IHNldCBmcm9tIFVJLgotCQkJCS8vCi0JCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKLQkJCX0KLQotCQkJaWYgKEFESE9DX09OKHBBZCkgJiYgKENBUF9JU19JQlNTX09OKENhcGFiaWxpdHlJbmZvKSkpCi0JCQl7Ci0JCQkJVUNIQVIJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gMDsKLQkJCQlVQ0hBUgkJCWlkeDsKLQkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQotCQkJCS8vIHN1cHBvcnRlZCByYXRlcyBhcnJheSBtYXkgbm90IGJlIHNvcnRlZC4gc29ydCBpdCBhbmQgZmluZCB0aGUgbWF4aW11bSByYXRlCi0JCQkgICAgZm9yIChpZHg9MDsgaWR4PFN1cFJhdGVMZW47IGlkeCsrKQotCQkJCXsKLQkJCSAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoU3VwUmF0ZVtpZHhdICYgMHg3ZikpCi0JCQkgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gU3VwUmF0ZVtpZHhdICYgMHg3ZjsKLQkJCQkJCX0KLQotCQkJCWZvciAoaWR4PTA7IGlkeDxFeHRSYXRlTGVuOyBpZHgrKykKLQkJCSAgICB7Ci0JCQkgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKEV4dFJhdGVbaWR4XSAmIDB4N2YpKQotCQkJICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IEV4dFJhdGVbaWR4XSAmIDB4N2Y7Ci0JCQkJCX0KLQotCQkJCS8vIGxvb2sgdXAgdGhlIGV4aXN0aW5nIHRhYmxlCi0JCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBBZGRyMik7Ci0KLQkJCQkvLyBBZC1ob2MgbW9kZSBpcyB1c2luZyBNQUMgYWRkcmVzcyBhcyBCQSBzZXNzaW9uLiBTbyB3ZSBuZWVkIHRvIGNvbnRpbnVvdXNseSBmaW5kIG5ld2x5IGpvaW5lZCBhZGhvYyBzdGF0aW9uIGJ5IHJlY2VpdmluZyBiZWFjb24uCi0JCQkJLy8gVG8gcHJldmVudCBhbHdheXMgY2hlY2sgdGhpcywgd2UgdXNlIHdjaWQgPT0gUkVTRVJWRURfV0NJRCB0byByZWNvZ25pemUgaXQgYXMgbmV3bHkgam9pbmVkIGFkaG9jIHN0YXRpb24uCi0JCQkJaWYgKChBREhPQ19PTihwQWQpICYmIChFbGVtLT5XY2lkID09IFJFU0VSVkVEX1dDSUQpKSB8fAotCQkJCQkocEVudHJ5ICYmICgocEVudHJ5LT5MYXN0QmVhY29uUnhUaW1lICsgQURIT0NfRU5UUllfQkVBQ09OX0xPU1RfVElNRSkgPCBOb3cpKSkKLQkJCQkJCXsKLQkJCQkJaWYgKHBFbnRyeSA9PSBOVUxMKQotCQkJCQkJLy8gQW5vdGhlciBhZGhvYyBqb2luaW5nLCBhZGQgdG8gb3VyIE1BQyB0YWJsZS4KLQkJCQkJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RW50cnkocEFkLCBBZGRyMiwgQlNTMCwgRkFMU0UpOwotCi0JCQkJCWlmIChTdGFBZGRNYWNUYWJsZUVudHJ5KHBBZCwKLQkJCQkJCQkJCQkJcEVudHJ5LAotCQkJCQkJCQkJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAotCQkJCQkJCQkJCQkmSHRDYXBhYmlsaXR5LAotCQkJCQkJCQkJCQlIdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJCQkJCSZBZGRIdEluZm8sCi0JCQkJCQkJCQkJCUFkZEh0SW5mb0xlbiwKLQkJCQkJCQkJCQkJQ2FwYWJpbGl0eUluZm8pID09IEZBTFNFKQotCQkJCQl7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBREhPQyAtIEFkZCBFbnRyeSBmYWlsZWQuXG4iKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQlpZiAocEVudHJ5ICYmCi0JCQkJCQkoRWxlbS0+V2NpZCA9PSBSRVNFUlZFRF9XQ0lEKSkKLQkJCQl7Ci0JCQkJCQlpZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7Ci0JCQkJCQlSVE1QX1NUQV9TRUNVUklUWV9JTkZPX0FERChwQWQsIEJTUzAsIGlkeCwgcEVudHJ5KTsKLQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHBFbnRyeSAmJiBwRW50cnktPlZhbGlkQXNDTEkpCi0JCQkJCXBFbnRyeS0+TGFzdEJlYWNvblJ4VGltZSA9IE5vdzsKLQotCQkJCS8vIEF0IGxlYXN0IGFub3RoZXIgcGVlciBpbiB0aGlzIElCU1MsIGRlY2xhcmUgTWVkaWFTdGF0ZSBhcyBDT05ORUNURUQKLQkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCQl7Ci0JCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotCi0JCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0JCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0JICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOwotCQkJCQlBc2ljU2V0QnNzaWQocEFkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0KLQkJCQkJLy8gMjAwMy8wMy8xMiAtIGpvaG4KLQkJCQkJLy8gTWFrZSBzdXJlIHRoaXMgZW50cnkgaW4gIlNjYW5UYWIiIHRhYmxlLCB0aHVzIGNvbXBsaWVzIHRvIE1pY3Jvc29mdCdzIHBvbGljeSB0aGF0Ci0JCQkJCS8vICJzaXRlIHN1cnZleSIgcmVzdWx0IHNob3VsZCBhbHdheXMgaW5jbHVkZSB0aGUgY3VycmVudCBjb25uZWN0ZWQgbmV0d29yay4KLQkJCQkJLy8KLQkJCQkJQnNzaWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsIENoYW5uZWwpOwotCQkJCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpCi0JCQkJCXsKLQkJCQkJCUJzc2lkeCA9IEJzc1RhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TY2FuVGFiLCBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAotCQkJCQkJCQkJJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sICZIdENhcGFiaWxpdHksCi0JCQkJCQkJCQkmQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwgTmV3RXh0Q2hhbm5lbE9mZnNldCwgQ2hhbm5lbCwgUmVhbFJzc2ksIFRpbWVTdGFtcCwgMCwKLQkJCQkJCQkJCSZFZGNhUGFybSwgJlFvc0NhcGFiaWxpdHksICZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKLQkJCQkJfQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBREhPQyAgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQuXG4iKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJCXsKLQkJCQlCT09MRUFOIGJVc2VTaG9ydFNsb3QsIGJVc2VCR1Byb3RlY3Rpb247Ci0KLQkJCQkvLyBkZWNpZGUgdG8gdXNlL2NoYW5nZSB0byAtCi0JCQkJLy8gICAgICAxLiBsb25nIHNsb3QgKDIwIHVzKSBvciBzaG9ydCBzbG90ICg5IHVzKSB0aW1lCi0JCQkJLy8gICAgICAyLiB0dXJuIG9uL29mZiBSVFMvQ1RTIGFuZC9vciBDVFMtdG8tc2VsZiBwcm90ZWN0aW9uCi0JCQkJLy8gICAgICAzLiBzaG9ydCBwcmVhbWJsZQotCi0JCQkJLy9iVXNlU2hvcnRTbG90ID0gcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgJiYgQ0FQX0lTX1NIT1JUX1NMT1QoQ2FwYWJpbGl0eUluZm8pOwotCQkJCWJVc2VTaG9ydFNsb3QgPSBDQVBfSVNfU0hPUlRfU0xPVChDYXBhYmlsaXR5SW5mbyk7Ci0JCQkJaWYgKGJVc2VTaG9ydFNsb3QgIT0gT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCkpCi0JCQkJCUFzaWNTZXRTbG90VGltZShwQWQsIGJVc2VTaG9ydFNsb3QpOwotCi0JCQkJYlVzZUJHUHJvdGVjdGlvbiA9IChwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPT0gMSkgfHwgICAgLy8gYWx3YXlzIHVzZQotCQkJCQkJCQkgICAoKHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9PSAwKSAmJiBFUlBfSVNfVVNFX1BST1RFQ1RJT04oRXJwKSk7Ci0KLQkJCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KSAvLyBhbHdheXMgbm8gQkcgcHJvdGVjdGlvbiBpbiBBLWJhbmQuIGZhbHNlbHkgaGFwcGVuZWQgd2hlbiBzd2l0Y2hpbmcgQS9HIGJhbmQgdG8gYSBkdWFsLWJhbmQgQVAKLQkJCQkJYlVzZUJHUHJvdGVjdGlvbiA9IEZBTFNFOwotCi0JCQkJaWYgKGJVc2VCR1Byb3RlY3Rpb24gIT0gT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCkpCi0JCQkJewotCQkJCQlpZiAoYlVzZUJHUHJvdGVjdGlvbikKLQkJCQkJewotCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKTsKLQkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgKE9GRE1TRVRQUk9URUNUfENDS1NFVFBST1RFQ1R8QUxMTl9TRVRQUk9URUNUKSxGQUxTRSwocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCk7Ci0JCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIChPRkRNU0VUUFJPVEVDVHxDQ0tTRVRQUk9URUNUfEFMTE5fU0VUUFJPVEVDVCksVFJVRSwocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKSk7Ci0JCQkJCX0KLQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlNZTkMgLSBBUCBjaGFuZ2VkIEIvRyBwcm90ZWN0aW9uIHRvICVkXG4iLCBiVXNlQkdQcm90ZWN0aW9uKSk7Ci0JCQkJfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkJLy8gY2hlY2sgSHQgcHJvdGVjdGlvbiBtb2RlLiBhbmQgYWRoZXJlIHRvIHRoZSBOb24tR0YgZGV2aWNlIGluZGljYXRpb24gYnkgQVAuCi0JCQkJaWYgKChBZGRIdEluZm9MZW4gIT0gMCkgJiYKLQkJCQkJKChBZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgIT0gcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSkgfHwKLQkJCQkJKEFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCAhPSBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KSkpCi0JCQkJewotCQkJCQlwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50OwotCQkJCQlwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlID0gQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlOwotCQkJCQlpZiAocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKQotCQkJCXsKLQkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgVFJVRSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBGQUxTRSk7Ci0KLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEFQIGNoYW5nZWQgTiBPcGVyYWlvbk1vZGUgdG8gJWRcbiIsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUpKTsKLQkJCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpICYmCi0JCQkJCUVSUF9JU19VU0VfQkFSS0VSX1BSRUFNQkxFKEVycCkpCi0JCQkJewotCQkJCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVMb25nKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEFQIGZvcmNlZCB0byB1c2UgTE9ORyBwcmVhbWJsZVxuIikpOwotCQkJCX0KLQotCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICAgICYmCi0JCQkJCShFZGNhUGFybS5iVmFsaWQgPT0gVFJVRSkgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0JCQkJCShFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQgIT0gcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQpKQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEFQIGNoYW5nZSBFRENBIHBhcmFtZXRlcnMoZnJvbSAlZCB0byAlZClcbiIsCi0JCQkJCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCwKLQkJCQkJCUVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCkpOwotCQkJCQlBc2ljU2V0RWRjYVBhcm0ocEFkLCAmRWRjYVBhcm0pOwotCQkJCX0KLQotCQkJCS8vIGNvcHkgUU9TIHJlbGF0ZWQgaW5mb3JtYXRpb24KLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBRYnNzTG9hZCwgJlFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBRb3NDYXBhYmlsaXR5LCAmUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKLQkJCX0KLQotCQkJLy8gb25seSBJTkZSQVNUUlVDVFVSRSBtb2RlIHN1cHBvcnQgcG93ZXItc2F2aW5nIGZlYXR1cmUKLQkJCWlmICgoSU5GUkFfT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSkgfHwgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKQotCQkJewotCQkJCVVDSEFSIEZyZWVOdW1iZXI7Ci0JCQkJLy8gIDEuIEFQIGhhcyBiYWNrbG9nZ2VkIHVuaWNhc3QtdG8tbWUgZnJhbWUsIHN0YXkgQVdBS0UsIHNlbmQgUFNQT0xMCi0JCQkJLy8gIDIuIEFQIGhhcyBiYWNrbG9nZ2VkIGJyb2FkY2FzdC9tdWx0aWNhc3QgZnJhbWUgYW5kIHdlIHdhbnQgdGhvc2UgZnJhbWVzLCBzdGF5IEFXQUtFCi0JCQkJLy8gIDMuIHdlIGhhdmUgb3V0Z29pbmcgZnJhbWVzIGluIFR4UmluZyBvciBNZ210UmluZywgYmV0dGVyIHN0YXkgQVdBS0UKLQkJCQkvLyAgNC4gUHNtIGNoYW5nZSB0byBQV1JfU0FWRSwgYnV0IEFQIG5vdCBiZWVuIGluZm9ybWVkIHlldCwgd2UgYmV0dGVyIHN0YXkgQVdBS0UKLQkJCQkvLyAgNS4gb3RoZXJ3aXNlLCBwdXQgUEhZIGJhY2sgdG8gc2xlZXAgdG8gc2F2ZSBiYXR0ZXJ5LgotCQkJCWlmIChNZXNzYWdlVG9NZSkKLQkJCQl7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKLQkJCQkJewotCQkJCQkJLy8gUmVzdG9yZSB0byBjb3JyZWN0IEJCUCBSMyB2YWx1ZQotCQkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPiAxKQotCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOwotCQkJCQkJLy8gVHVybiBjbGsgdG8gODBNaHouCi0JCQkJCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSAmJgotCQkJCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSAmJiBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLICYmIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTykKLQkJCQkJewotCQkJCQkJcEFkLT5Db21tb25DZmcuYk5lZWRTZW5kVHJpZ2dlckZyYW1lID0gVFJVRTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQlSVE1QX1BTX1BPTExfRU5RVUVVRShwQWQpOwotCQkJCX0KLQkJCQllbHNlIGlmIChCY2FzdEZsYWcgJiYgKER0aW1Db3VudCA9PSAwKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSkpCi0JCQkJewotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpCi0JCQkJCXsKLQkJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID4gMSkKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIHBBZC0+U3RhQ2ZnLkJCUFIzKTsKLQkJCQkJfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQkJCX0KLQkJCQllbHNlIGlmICgocEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXS5OdW1iZXIgIT0gMCkJCQkJCQkJCQkJCQkJfHwKLQkJCQkJCShwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQkJfHwKLQkJCQkJCShwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQkJfHwKLQkJCQkJCShwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQkJfHwKLQkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfQkssIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAotCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8Ci0JCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX0FDX1ZJLCBUWF9SSU5HX1NJWkUgLSAxLCAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykJfHwKLQkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfVk8sIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAotCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9NR01ULCBNR01UX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKSkKLQkJCQl7Ci0JCQkJCS8vIFRPRE86IGNvbnNpZGVyIHNjaGVkdWxlZCBIQ0NBLiBtaWdodCBub3QgYmUgcHJvcGVyIHRvIHVzZSB0cmFkaXRpb25hbCBEVElNLWJhc2VkIHBvd2VyLXNhdmluZyBzY2hlbWUKLQkJCQkJLy8gY2FuIHdlIGNoZWF0IGhlcmUgKGkuZS4ganVzdCBjaGVjayBNR01UICYgQUNfQkUpIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2U/Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKLQkJCQkJewotCQkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPiAxKQotCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOwotCQkJCQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWlmICgocEFkLT5Db21tb25DZmcuYkFDTUFQU0RUcltRSURfQUNfVk9dKSB8fAotCQkJCQkJKHBBZC0+Q29tbW9uQ2ZnLmJBQ01BUFNEVHJbUUlEX0FDX1ZJXSkgfHwKLQkJCQkJCShwQWQtPkNvbW1vbkNmZy5iQUNNQVBTRFRyW1FJRF9BQ19CS10pIHx8Ci0JCQkJCQkocEFkLT5Db21tb25DZmcuYkFDTUFQU0RUcltRSURfQUNfQkVdKSkKLQkJCQkJewotCQkJCQkJLyoKLQkJCQkJCQlXTU0gU3BlYyB2MS4wIDMuNi4yLjQsCi0JCQkJCQkJVGhlIFdNTSBTVEEgc2hhbGwgcmVtYWluIGF3YWtlIHVudGlsIGl0IHJlY2VpdmVzIGEKLQkJCQkJCQlRb1MgRGF0YSBvciBOdWxsIGZyYW1lIGFkZHJlc3NlZCB0byBpdCwgd2l0aCB0aGUKLQkJCQkJCQlFT1NQIHN1YmZpZWxkIGluIFFvUyBDb250cm9sIGZpZWxkIHNldCB0byAxLgotCi0JCQkJCQkJU28gd2UgY2FuIG5vdCBzbGVlcCBoZXJlIG9yIHdlIHdpbGwgc3VmZmVyIGEgY2FzZToKLQotCQkJCQkJCVBTIE1hbmFnZW1lbnQgRnJhbWUgLS0+Ci0JCQkJCQkJVHJpZ2dlciBmcmFtZSAtLT4KLQkJCQkJCQlCZWFjb24gKFRJTT0wKSAoQmVhY29uIGlzIGNsb3NlciB0byBUcmlnIGZyYW1lKSAtLT4KLQkJCQkJCQlTdGF0aW9uIGdvZXMgdG8gc2xlZXAgLS0+Ci0JCQkJCQkJQVAgZGVsaXZlcnkgcXVldWVkIFVBUFNEIHBhY2tldHMgLS0+Ci0JCQkJCQkJU3RhdGlvbiBjYW4gTk9UIHJlY2VpdmUgdGhlIHJlcGx5Ci0KLQkJCQkJCQlNYXliZSB3ZSBuZWVkIGEgdGltZW91dCB0aW1lciB0byBhdm9pZCB0aGF0IHdlIGRvCi0JCQkJCQkJTk9UIHJlY2VpdmUgdGhlIEVPU1AgZnJhbWUuCi0KLQkJCQkJCQlXZSBjYW4gbm90IHVzZSBNb3JlIERhdGEgdG8gY2hlY2sgaWYgU1AgaXMgZW5kZWQKLQkJCQkJCQlkdWUgdG8gTWF4U1BMZW5ndGguCi0JCQkJCQkqLwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJVVNIT1JUIE5leHREdGltID0gRHRpbUNvdW50OwotCi0KLQkJCQkJCWlmIChOZXh0RHRpbSA9PSAwKQotCQkJCQkJCU5leHREdGltID0gRHRpbVBlcmlvZDsKLQotCQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudDsKLQkJCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSkgJiYgKFRidHROdW1Ub05leHRXYWtlVXAgPiBOZXh0RHRpbSkpCi0JCQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IE5leHREdGltOwotCi0JCQkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JCQkJCQl7Ci0JCQkJCQkJLy8gU2V0IGEgZmxhZyB0byBnbyB0byBzbGVlcCAuIFRoZW4gYWZ0ZXIgcGFyc2UgdGhpcyBSeERvbmVJbnRlcnJ1cHQsIHdpbGwgZ28gdG8gc2xlZXAgbW9kZS4KLQkJCQkJCQlwQWQtPlRoaXNUYnR0TnVtVG9OZXh0V2FrZVVwID0gVGJ0dE51bVRvTmV4dFdha2VVcDsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHBBZCwgcEFkLT5UaGlzVGJ0dE51bVRvTmV4dFdha2VVcCk7Ci0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBub3QgbXkgQlNTSUQsIGlnbm9yZSBpdAotCX0KLQkvLyBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlIHRoaXMgZnJhbWUKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlSZWNlaXZlIFBST0JFIFJFUSBmcm9tIHJlbW90ZSBwZWVyIHdoZW4gb3BlcmF0aW5nIGluIElCU1MgbW9kZQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUGVlclByb2JlUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVQ0hBUiAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JQ0hBUiAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0JVUNIQVIgICAgICAgICBTc2lkTGVuOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCVVDSEFSCQkgIEh0TGVuLCBBZGRIdExlbiwgTmV3RXh0TGVuOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCUhFQURFUl84MDJfMTEgUHJvYmVSc3BIZHI7Ci0JTkRJU19TVEFUVVMgICBOU3RhdHVzOwotCVBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JTEFSR0VfSU5URUdFUiBGYWtlVGltZXN0YW1wOwotCVVDSEFSICAgICAgICAgRHNMZW4gPSAxLCBJYnNzTGVuID0gMjsKLQlVQ0hBUiAgICAgICAgIExvY2FsRXJwSWVbM10gPSB7SUVfRVJQLCAxLCAwfTsKLQlCT09MRUFOICAgICAgIFByaXZhY3k7Ci0JVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbzsKLQlVQ0hBUgkJICBSU05JZSA9IElFX1dQQTsKLQotCWlmICghIEFESE9DX09OKHBBZCkpCi0JCXJldHVybjsKLQotCWlmIChQZWVyUHJvYmVSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsIFNzaWQsICZTc2lkTGVuKSkKLQl7Ci0JCWlmICgoU3NpZExlbiA9PSAwKSB8fCBTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pKQotCQl7Ci0JCQkvLyBhbGxvY2F0ZSBhbmQgc2VuZCBvdXQgUHJvYmVSc3AgZnJhbWUKLQkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJCXJldHVybjsKLQotCQkJLy9wQWQtPlN0YUNmZy5BdGltV2luID0gMDsgIC8vID8/Pz8/PwotCi0JCQlQcml2YWN5ID0gKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB8fAotCQkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKLQkJCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpOwotCQkJQ2FwYWJpbGl0eUluZm8gPSBDQVBfR0VORVJBVEUoMCwgMSwgUHJpdmFjeSwgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KSwgMCwgMCk7Ci0KLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgICAgICZQcm9iZVJzcEhkciwKLQkJCQkJCQkgIFRJTUVTVEFNUF9MRU4sICAgICAgICAgICAgICAgICZGYWtlVGltZXN0YW1wLAotCQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCwKLQkJCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDYXBhYmlsaXR5SW5mbywKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKLQkJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sCi0JCQkJCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLCAgICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRzSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNMZW4sCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJYnNzSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWJzc0xlbiwKLQkJCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUFjdGl2ZS5BdGltV2luLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCi0JCQlpZiAocEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbikKLQkJCXsKLQkJCQlVTE9ORyB0bXA7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgJnRtcCwKLQkJCQkJCQkJICAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbEVycEllLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4sCi0JCQkJCQkJCSAgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiwgICAgJnBBZC0+U3RhQWN0aXZlLkV4dFJhdGUsCi0JCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJCUZyYW1lTGVuICs9IHRtcDsKLQkJCX0KLQotCQkJLy8gSWYgYWRob2Mgc2VjcnVpdHkgaXMgc2V0IGZvciBXUEEtTm9uZSwgYXBwZW5kIHRoZSBjaXBoZXIgc3VpdGUgSUUKLQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQkJewotCQkJCVVMT05HIHRtcDsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCQkmdG1wLAotCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUlNOSWUsCi0JCQkJCQkJCQkxLAkJCQkmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAotCQkJCQkJCQkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAkJcEFkLT5TdGFDZmcuUlNOX0lFLAotCQkJCQkJCQkJRU5EX09GX0FSR1MpOwotCQkJCUZyYW1lTGVuICs9IHRtcDsKLQkJCX0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCi0JCQl7Ci0JCQkJVUxPTkcgVG1wTGVuOwotCQkJCVVDSEFSCUJST0FEQ09NWzRdID0gezB4MCwgMHg5MCwgMHg0YywgMHgzM307Ci0JCQkJSHRMZW4gPSBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KTsKLQkJCQlBZGRIdExlbiA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pOwotCQkJCU5ld0V4dExlbiA9IDE7Ci0JCQkJLy9OZXcgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IElFIGlzIGluY2x1ZGVkIGluIEJlYWNvbiwgUHJvYmUgUnNwIG9yIGNoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBGcmFtZQotCQkJCWlmIChwQWQtPmJCcm9hZENvbUhUID09IFRSVUUpCi0JCQkJewotCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldwYUllLAotCQkJCQkJCQkgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQlJPQURDT01bMF0sCi0JCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCi0JCQkJCQkJCSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSksICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBZGRIdEluZm9JZSwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFkZEh0TGVuLAotCQkJCQkJCQkgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSwgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5ld0V4dENoYW5JZSwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5ld0V4dExlbiwKLQkJCQkJCQkJIHNpemVvZihORVdfRVhUX0NIQU5fSUUpLCAgICAgICAgICAmcEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQkJfQotCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKLQkJCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJfQotCX0KLX0KLQotVk9JRCBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVU0hPUlQgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uXG4iKSk7Ci0JcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKLQlTdGF0dXMgPSBNTE1FX1JFSl9USU1FT1VUOwotCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9KT0lOX0NPTkYsIDIsICZTdGF0dXMpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVNjYW4gdGltZW91dCBwcm9jZWR1cmUuIGJhc2ljYWxseSBhZGQgY2hhbm5lbCBpbmRleCBieSAxIGFuZCByZXNjYW4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFNjYW5UaW1lb3V0QWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IE5leHRDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOwotCi0JLy8gT25seSBvbmUgY2hhbm5lbCBzY2FubmVkIGZvciBDSVNDTyBiZWFjb24gcmVxdWVzdAotCWlmICgocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQUNUSVZFKSB8fAotCQkocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fUEFTU0lWRSkgfHwKLQkJKHBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX05PSVNFKSB8fAotCQkocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKSkKLQkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSAwOwotCi0JLy8gdGhpcyByb3V0aW5lIHdpbGwgc3RvcCBpZiBwQWQtPk1sbWVBdXguQ2hhbm5lbCA9PSAwCi0JU2Nhbk5leHRDaGFubmVsKHBBZCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5TY2FuKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVU0hPUlQgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFZTkMgLSBJbnZhbGlkU3RhdGVXaGVuU2NhbihzdGF0ZT0lbGQpLiBSZXNldCBTWU5DIG1hY2hpbmVcbiIsIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKLQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwotCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7Ci0JTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5Kb2luKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVU0hPUlQgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWRTdGF0ZVdoZW5Kb2luKHN0YXRlPSVsZCkuIFJlc2V0IFNZTkMgbWFjaGluZVxuIiwgcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSkpOwotCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7Ci0JU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKLQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfSk9JTl9DT05GLCAyLCAmU3RhdHVzKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgSW52YWxpZFN0YXRlV2hlblN0YXJ0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVU0hPUlQgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWRTdGF0ZVdoZW5TdGFydChzdGF0ZT0lbGQpLiBSZXNldCBTWU5DIG1hY2hpbmVcbiIsIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKLQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwotCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7Ci0JTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NUQVJUX0NPTkYsIDIsICZTdGF0dXMpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgRW5xdWV1ZVBzUG9sbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLSNpZmRlZiBSQUxJTktfQVRFCi0gICAgaWYgKEFURV9PTihwQWQpKQotICAgIHsKLQkJcmV0dXJuOwotICAgIH0KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQotCWlmIChwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQKQotCXBBZC0+UHNQb2xsRnJhbWUuRkMuUHdyTWdtdCA9IFBXUl9TQVZFOwotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgKFBVQ0hBUikmcEFkLT5Qc1BvbGxGcmFtZSwgc2l6ZW9mKFBTUE9MTF9GUkFNRSkpOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEVucXVldWVQcm9iZVJlcXVlc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JTkRJU19TVEFUVVMgICAgIE5TdGF0ZTsKLQlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlcjsKLQlVTE9ORyAgICAgICAgICAgRnJhbWVMZW4gPSAwOwotCUhFQURFUl84MDJfMTEgICBIZHI4MDIxMTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZvcmNlIG91dCBhIFByb2JlUmVxdWVzdCAuLi5cbiIpKTsKLQotCU5TdGF0ZSA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZiAoTlN0YXRlID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgQlJPQURDQVNUX0FERFIsIEJST0FEQ0FTVF9BRERSKTsKLQotCQkvLyB0aGlzIFByb2JlUmVxdWVzdCBleHBsaWNpdGx5IHNwZWNpZnkgU1NJRCB0byByZWR1Y2UgdW53YW50ZWQgUHJvYmVSZXNwb25zZQotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAgICAgICAmSGRyODAyMTEsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKLQkJCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwJCSAgcEFkLT5Db21tb25DZmcuU3NpZCwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLAotCQkJCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLCAgICAgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsCi0JCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0JfQotCi19Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSNpZmRlZiBET1QxMU5fRFJBRlQzCi1WT0lEIEJ1aWxkRWZmZWN0ZWRDaGFubmVsTGlzdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVQ0hBUgkJRUNoYW5uZWxbMTFdOwotCVVDSEFSCQlpLCBqLCBrOwotCVVDSEFSCQlVcHBlckNoYW5uZWwgPSAwLCBMb3dlckNoYW5uZWwgPSAwOwotCi0JUlRNUFplcm9NZW1vcnkoRUNoYW5uZWwsIDExKTsKLQlpID0gMDsKLQkvLyBGaW5kIHVwcGVyIGNoYW5uZWwgYW5kIGxvd2VyIGNoYW5uZWwuCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQl7Ci0JCVVwcGVyQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7Ci0JCUxvd2VyQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOwotCX0KLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCi0JewotCQlVcHBlckNoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKLQkJTG93ZXJDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQl9Ci0JZWxzZQotCXsKLQkJcmV0dXJuOwotCX0KLQotCS8vIFJlY29yZCBjaGFubmVscyB0aGF0IGlzIGJlbG93IGxvd2VyIGNoYW5uZWwuLgotCWlmIChMb3dlckNoYW5uZWwgPiAxKQotCXsKLQkJRUNoYW5uZWxbMF0gPSBMb3dlckNoYW5uZWwgLSAxOwotCQlpID0gMTsKLQkJaWYgKExvd2VyQ2hhbm5lbCA+IDIpCi0JCXsKLQkJCUVDaGFubmVsWzFdID0gTG93ZXJDaGFubmVsIC0gMjsKLQkJCWkgPSAyOwotCQkJaWYgKExvd2VyQ2hhbm5lbCA+IDMpCi0JCQl7Ci0JCQkJRUNoYW5uZWxbMl0gPSBMb3dlckNoYW5uZWwgLSAzOwotCQkJCWkgPSAzOwotCQkJfQotCQl9Ci0JfQotCS8vIFJlY29yZCBjaGFubmVscyB0aGF0IGlzIGJldHdlZW4gIGxvd2VyIGNoYW5uZWwgYW5kIHVwcGVyIGNoYW5uZWwuCi0JZm9yIChrID0gTG93ZXJDaGFubmVsO2sgPCBVcHBlckNoYW5uZWw7aysrKQotCXsKLQkJRUNoYW5uZWxbaV0gPSBrOwotCQlpKys7Ci0JfQotCS8vIFJlY29yZCBjaGFubmVscyB0aGF0IGlzIGFib3ZlIHVwcGVyIGNoYW5uZWwuLgotCWlmIChMb3dlckNoYW5uZWwgPCAxMSkKLQl7Ci0JCUVDaGFubmVsW2ldID0gVXBwZXJDaGFubmVsICsgMTsKLQkJaSsrOwotCQlpZiAoTG93ZXJDaGFubmVsIDwgMTApCi0JCXsKLQkJCUVDaGFubmVsW2ldID0gTG93ZXJDaGFubmVsICsgMjsKLQkJCWkrKzsKLQkJCWlmIChMb3dlckNoYW5uZWwgPCA5KQotCQkJewotCQkJCUVDaGFubmVsW2ldID0gTG93ZXJDaGFubmVsICsgMzsKLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQl9Ci0JLy8KLQlmb3IgKGogPSAwO2ogPCBpO2orKykKLQl7Ci0JCWZvciAoayA9IDA7ayA8IHBBZC0+Q2hhbm5lbExpc3ROdW07aysrKQotCQl7Ci0JCQlpZiAocEFkLT5DaGFubmVsTGlzdFtrXS5DaGFubmVsID09IEVDaGFubmVsW2pdKQotCQkJewotCQkJCXBBZC0+Q2hhbm5lbExpc3Rba10uYkVmZmVjdGVkQ2hhbm5lbCA9IFRSVUU7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgRWZmZWN0ZWRDaGFubmVsKCA9JWQpXG4iLCBFQ2hhbm5lbFtqXSkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotfQotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotQk9PTEVBTiBTY2FuUnVubmluZygKLQkJSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JcmV0dXJuIChwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID09IFNDQU5fTElTVEVOKSA/IFRSVUUgOiBGQUxTRTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL3dwYS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvd3BhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYmRiYTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvd3BhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQl3cGEuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUphbglMZWUJCTAzLTA3LTIyCQlJbml0aWFsCi0JUGF1bCBMaW4JMDMtMTEtMjgJCU1vZGlmeSBmb3Igc3VwcGxpY2FudAotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLXZvaWQgaW5jX2J5dGVfYXJyYXkoVUNIQVIgKmNvdW50ZXIsIGludCBsZW4pOwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUHJvY2VzcyBNSUMgZXJyb3IgaW5kaWNhdGlvbiBhbmQgcmVjb3JkIE1JQyBlcnJvciB0aW1lci4KLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcFdwYUtleQkJCVBvaW50ZXIgdG8gdGhlIFdQQSBrZXkgc3RydWN0dXJlCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFJlcG9ydE1pY0Vycm9yKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBDSVBIRVJfS0VZCXBXcGFLZXkpCi17Ci0JVUxPTkcJTm93OwotICAgIFVDSEFSICAgdW5pY2FzdEtleSA9IChwV3BhS2V5LT5UeXBlID09IFBBSVJXSVNFX0tFWSA/IDE6MCk7Ci0KLQkvLyBSZWNvcmQgTGFzdCBNSUMgZXJyb3IgdGltZSBhbmQgY291bnQKLQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCWlmIChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPT0gMCkKLQl7Ci0JCXBBZC0+U3RhQ2ZnLk1pY0VyckNudCsrOwotCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gTm93OwotICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCA4KTsKLQl9Ci0JZWxzZSBpZiAocEFkLT5TdGFDZmcuTWljRXJyQ250ID09IDEpCi0JewotCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgKyAoNjAgKiBPU19IWikpIDwgTm93KQotCQl7Ci0JCQkvLyBVcGRhdGUgTGFzdCBNSUMgZXJyb3IgdGltZSwgdGhpcyBkaWQgbm90IHZpb2xhdGUgdHdvIE1JQyBlcnJvcnMgd2l0aGluIDYwIHNlY29uZHMKLQkJCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSBOb3c7Ci0JCX0KLQkJZWxzZQotCQl7Ci0KLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19DT1VOVEVSX01FQVNVUkVTX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7Ci0KLQkJCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSBOb3c7Ci0JCQkvLyBWaW9sYXRlIE1JQyBlcnJvciBjb3VudHMsIE1JQyBjb3VudGVybWVhc3VyZXMga2lja3MgaW4KLQkJCXBBZC0+U3RhQ2ZnLk1pY0VyckNudCsrOwotCQkJLy8gV2Ugc2hhbGwgYmxvY2sgYWxsIHJlY2VwdGlvbgotCQkJLy8gV2Ugc2hhbGwgY2xlYW4gYWxsIFR4IHJpbmcgYW5kIGRpc2Fzc29pY2F0ZSBmcm9tIEFQIGFmdGVyIG5leHQgRUFQT0wgZnJhbWUKLQkJCS8vCi0JCQkvLyBObyBuZWNlc3NhcnkgdG8gY2xlYW4gYWxsIFR4IHJpbmcsIG9uIFJUTVBIYXJkVHJhbnNtaXQgd2lsbCBzdG9wIHNlbmRpbmcgbm9uLTgwMi4xWCBFQVBPTCBwYWNrZXRzCi0JCQkvLyBpZiBwQWQtPlN0YUNmZy5NaWNFcnJDbnQgZ3JlYXRlciB0aGFuIDIuCi0JCQkvLwotCQkJLy8gUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKLQkJCS8vIFJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CRSk7Ci0JCQkvLyBSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOwotCQkJLy8gUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKLQkJCS8vIFJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9IQ0NBKTsKLQkJfQotCX0KLQllbHNlCi0JewotCQkvLyBNSUMgZXJyb3IgY291bnQgPj0gMgotCQkvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuCi0JCTsKLQl9Ci0gICAgTWxtZUVucXVldWUocEFkLAotCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotCQkJCU9JRF84MDJfMTFfTUlDX0ZBSUxVUkVfUkVQT1JUX0ZSQU1FLAotCQkJCTEsCi0JCQkJJnVuaWNhc3RLZXkpOwotCi0gICAgaWYgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9PSAyKQotICAgIHsKLSAgICAgICAgUlRNUFNldFRpbWVyKCZwQWQtPlN0YUNmZy5XcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lciwgMTAwKTsKLSAgICB9Ci19Ci0KLQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSNkZWZpbmUJTEVOR1RIX0VBUF9IICAgIDQKLS8vIElmIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBFQVAtUGFja2V0ICxmaW5kIG91dCBpdHMgRUFQLUNvZGUgKFJlcXVlc3QoMHgwMSksIFJlc3BvbnNlKDB4MDIpLCBTdWNjZXNzKDB4MDMpLCBGYWlsdXJlKDB4MDQpKS4KLUlOVAkgICAgV3BhQ2hlY2tFYXBDb2RlKAotCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gIFBVQ0hBUgkJCQlwRnJhbWUsCi0JSU4gIFVTSE9SVAkJCQlGcmFtZUxlbiwKLQlJTiAgVVNIT1JUCQkJCU9mZlNldCkKLXsKLQotCVBVQ0hBUglwRGF0YTsKLQlJTlQJcmVzdWx0ID0gMDsKLQotCWlmKCBGcmFtZUxlbiA8IE9mZlNldCArIExFTkdUSF9FQVBPTF9IICsgTEVOR1RIX0VBUF9IICkKLQkJcmV0dXJuIHJlc3VsdDsKLQotCXBEYXRhID0gcEZyYW1lICsgT2ZmU2V0OyAvLyBza2lwIG9mZnNldCBieXRlcwotCi0JaWYoKihwRGF0YSsxKSA9PSBFQVBQYWNrZXQpCS8vIDgwMi4xeCBoZWFkZXIgLSBQYWNrZXQgVHlwZQotCXsKLQkJIHJlc3VsdCA9ICoocERhdGErNCk7CQkvLyBFQVAgaGVhZGVyIC0gQ29kZQotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLVZPSUQgICAgV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOICBCT09MRUFOICAgICAgICAgIGJVbmljYXN0KQotewotCWNoYXIgY3VzdG9tW0lXX0NVU1RPTV9NQVhdID0gezB9OwotCi0Jc3ByaW50ZihjdXN0b20sICJNTE1FLU1JQ0hBRUxNSUNGQUlMVVJFLmluZGljYXRpb24iKTsKLQlpZihiVW5pY2FzdCkKLQkJc3ByaW50ZihjdXN0b20sICIlcyB1bmljYXN0IiwgY3VzdG9tKTsKLQotCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgSVdFVkNVU1RPTSwgLTEsIE5VTEwsIChQVUNIQVIpY3VzdG9tLCBzdHJsZW4oY3VzdG9tKSk7Ci0KLQlyZXR1cm47Ci19Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi1WT0lECVdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKLQlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKLQlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl07Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBiVW5pY2FzdDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSAtLS0tLT5cbiIpKTsKLQotICAgIGJVbmljYXN0ID0gKEVsZW0tPk1zZ1swXSA9PSAxID8gVFJVRTpGQUxTRSk7Ci0JcEFkLT5TZXF1ZW5jZSA9ICgocEFkLT5TZXF1ZW5jZSkgKyAxKSAmIChNQVhfU0VRX05VTUJFUik7Ci0KLQkvLyBpbml0IDgwMi4zIGhlYWRlciBhbmQgRmlsbCBQYWNrZXQKLQlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKLQotCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKLQlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOwotCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7Ci0KLQlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKLQotICAgIC8vIFJlcXVlc3QgZmllbGQgcHJlc2VudGVkCi0gICAgUGFja2V0LktleURlc2MuS2V5SW5mby5SZXF1ZXN0ID0gMTsKLQotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQl7Ci0JCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDI7Ci0JfQotCWVsc2UJICAvLyBUS0lQCi0JewotCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAxOwotCX0KLQotICAgIFBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IChiVW5pY2FzdCA/IFBBSVJXSVNFS0VZIDogR1JPVVBLRVkpOwotCi0JLy8gS2V5TWljIGZpZWxkIHByZXNlbnRlZAotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7Ci0KLSAgICAvLyBFcnJvciBmaWVsZCBwcmVzZW50ZWQKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLkVycm9yICA9IDE7Ci0KLQkvLyBVcGRhdGUgcGFja2V0IGxlbmd0aCBhZnRlciBkZWNpZGUgS2V5IGRhdGEgcGF5bG9hZAotCVNFVF9VSU5UMTZfVE9fQVJSQVJZKFBhY2tldC5Cb2R5X0xlbiwgTEVOX0VBUE9MX0tFWV9NU0cpCi0KLQkvLyBLZXkgUmVwbGF5IENvdW50Ci0JTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0gICAgaW5jX2J5dGVfYXJyYXkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgOCk7Ci0KLQkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgotCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7Ci0KLQotCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKLQlpZihwT3V0QnVmZmVyID09IE5VTEwpCi0JewotCQlyZXR1cm47Ci0JfQotCi0JLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCi0JLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJICAgICAgICAgICAgICBDT05WX0FSUkFSWV9UT19VSU5UMTYoUGFja2V0LkJvZHlfTGVuKSArIDQsICAgJlBhY2tldCwKLQkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0KLQkvLyBQcmVwYXJlIGFuZCBGaWxsIE1JQyB2YWx1ZQotCU5kaXNaZXJvTWVtb3J5KE1pYywgc2l6ZW9mKE1pYykpOwotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQl7CS8vIEFFUwotICAgICAgICBVQ0hBUiBkaWdlc3RbMjBdID0gezB9OwotCQlITUFDX1NIQTEocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBkaWdlc3QsIFNIQTFfRElHRVNUX1NJWkUpOwotCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7Ci0JfQotCWVsc2UKLQl7CS8vIFRLSVAKLQkJSE1BQ19NRDUocEFkLT5TdGFDZmcuUFRLLCAgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljLCBNRDVfRElHRVNUX1NJWkUpOwotCX0KLQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7Ci0KLQkvLyBjb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIHNlbmQgTUlDIGZhaWx1cmUgcmVwb3J0IGZyYW1lIHRvIGF1dGhlbnRpY2F0b3IKLQlSVE1QVG9XaXJlbGVzc1N0YShwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLAotCQkJCQkgIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsCi0JCQkJCSAgKFBVQ0hBUikmUGFja2V0LAotCQkJCQkgIENPTlZfQVJSQVJZX1RPX1VJTlQxNihQYWNrZXQuQm9keV9MZW4pICsgNCwgRkFMU0UpOwotCi0JTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lIDwtLS0tLVxuIikpOwotfQotCi0vKiogZnJvbSB3cGFfc3VwcGxpY2FudAotICogaW5jX2J5dGVfYXJyYXkgLSBJbmNyZW1lbnQgYXJiaXRyYXJ5IGxlbmd0aCBieXRlIGFycmF5IGJ5IG9uZQotICogQGNvdW50ZXI6IFBvaW50ZXIgdG8gYnl0ZSBhcnJheQotICogQGxlbjogTGVuZ3RoIG9mIHRoZSBjb3VudGVyIGluIGJ5dGVzCi0gKgotICogVGhpcyBmdW5jdGlvbiBpbmNyZW1lbnRzIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGNvdW50ZXIgYnkgb25lIGFuZCBjb250aW51ZXMKLSAqIHJvbGxpbmcgb3ZlciB0byBtb3JlIHNpZ25pZmljYW50IGJ5dGVzIGlmIHRoZSBieXRlIHdhcyBpbmNyZW1lbnRlZCBmcm9tCi0gKiAweGZmIHRvIDB4MDAuCi0gKi8KLXZvaWQgaW5jX2J5dGVfYXJyYXkoVUNIQVIgKmNvdW50ZXIsIGludCBsZW4pCi17Ci0JaW50IHBvcyA9IGxlbiAtIDE7Ci0Jd2hpbGUgKHBvcyA+PSAwKSB7Ci0JCWNvdW50ZXJbcG9zXSsrOwotCQlpZiAoY291bnRlcltwb3NdICE9IDApCi0JCQlicmVhazsKLQkJcG9zLS07Ci0JfQotfQotCi1WT0lEIFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLSAgICBSVE1QX0FEQVBURVIgICAgICAgICAgICAgICAgKnBBZCA9IChQUlRNUF9BREFQVEVSKUZ1bmN0aW9uQ29udGV4dDsKLSAgICBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICAgRGlzYXNzb2NSZXE7Ci0KLQkvLyBkaXNhc3NvYyBmcm9tIGN1cnJlbnQgQVAgZmlyc3QKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QUmVwb3J0TWljRXJyb3IgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQIGFmdGVyIHNlbmRpbmcgc2Vjb25kIGNvbnRpbnVvdXMgRUFQT0wgZnJhbWVcbiIpKTsKLQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX01JQ19GQUlMVVJFKTsKLQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7Ci0KLQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOwotCXBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gVFJVRTsKLX0KLQotVk9JRCBXcGFTdGFQYWlyd2lzZUtleVNldHRpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JUENJUEhFUl9LRVkgcFNoYXJlZEtleTsKLQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeTsKLQotCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOwotCi0JLy8gUGFpcndpc2Uga2V5IHNoYWxsIHVzZSBrZXkjMAotCXBTaGFyZWRLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF07Ci0KLQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QVEssIHBFbnRyeS0+UFRLLCBMRU5fUFRLKTsKLQotCS8vIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUKLQlOZGlzWmVyb01lbW9yeShwU2hhcmVkS2V5LCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotCXBTaGFyZWRLZXktPktleUxlbiA9IExFTl9US0lQX0VLOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sIExFTl9US0lQX0VLKTsKLQlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sIExFTl9US0lQX1JYTUlDSyk7Ci0JTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+VHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKLQotCS8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCi0JaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7Ci0JZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwotCWVsc2UKLQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0KLQkvLyBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBNQUNfVEFCTEVfRU5UUlkKLQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sIExFTl9US0lQX0VLKTsKLQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKLQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4K0xFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7Ci0JcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwU2hhcmVkS2V5LT5DaXBoZXJBbGc7Ci0KLQkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQotCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCi0JCQkJCQkgIEJTUzAsCi0JCQkJCQkgIDAsCi0JCQkJCQkgIHBTaGFyZWRLZXktPkNpcGhlckFsZywKLQkJCQkJCSAgcFNoYXJlZEtleS0+S2V5LAotCQkJCQkJICBwU2hhcmVkS2V5LT5UeE1pYywKLQkJCQkJCSAgcFNoYXJlZEtleS0+UnhNaWMpOwotCi0JLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0JUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCi0JCQkJCQkJICBCU1MwLAotCQkJCQkJCSAgMCwKLQkJCQkJCQkgIHBTaGFyZWRLZXktPkNpcGhlckFsZywKLQkJCQkJCQkgIHBFbnRyeSk7Ci0JU1RBX1BPUlRfU0VDVVJFRChwQWQpOwotCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA6IEFJRCglZCkgcG9ydCBzZWN1cmVkXG4iLCBfX0ZVTkNUSU9OX18sIHBFbnRyeS0+QWlkKSk7Ci0KLX0KLQotVk9JRCBXcGFTdGFHcm91cEtleVNldHRpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JUENJUEhFUl9LRVkJCXBTaGFyZWRLZXk7Ci0KLQlwU2hhcmVkS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF07Ci0KLQkvLyBQcmVwYXJlIHBhaXItd2lzZSBrZXkgaW5mb3JtYXRpb24gaW50byBzaGFyZWQga2V5IHRhYmxlCi0JTmRpc1plcm9NZW1vcnkocFNoYXJlZEtleSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLQlwU2hhcmVkS2V5LT5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKLQlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5LZXksIHBBZC0+U3RhQ2ZnLkdUSywgTEVOX1RLSVBfRUspOwotCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPlJ4TWljLCAmcEFkLT5TdGFDZmcuR1RLWzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKLQlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5UeE1pYywgJnBBZC0+U3RhQ2ZnLkdUS1syNF0sIExFTl9US0lQX1RYTUlDSyk7Ci0KLQkvLyBVcGRhdGUgU2hhcmVkIEtleSBDaXBoZXJBbGcKLQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7Ci0JZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKLQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQpCi0JCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkKQotCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCi0JLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKLQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAotCQkJCQkJICBCU1MwLAotCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCi0JCQkJCQkgIHBTaGFyZWRLZXktPkNpcGhlckFsZywKLQkJCQkJCSAgcFNoYXJlZEtleS0+S2V5LAotCQkJCQkJICBwU2hhcmVkS2V5LT5UeE1pYywKLQkJCQkJCSAgcFNoYXJlZEtleS0+UnhNaWMpOwotCi0JLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0JUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCi0JCQkJCQkJICBCU1MwLAotCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAotCQkJCQkJCSAgcFNoYXJlZEtleS0+Q2lwaGVyQWxnLAotCQkJCQkJCSAgTlVMTCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhX2lvY3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YV9pb2N0bC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGFiODRhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhX2lvY3RsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NTU3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgc3RhX2lvY3RsLmMKLQotICAgIEFic3RyYWN0OgotICAgIElPQ1RMIHJlbGF0ZWQgc3Vicm91dGluZXMKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgUm9yeSBDaGVuICAgMDEtMDMtMjAwMyAgICBjcmVhdGVkCi0JUm9yeSBDaGVuICAgMDItMTQtMjAwNSAgICBtb2RpZnkgdG8gc3VwcG9ydCBSVDYxCi0qLwotCi0jaW5jbHVkZQkicnRfY29uZmlnLmgiCi0KLSNpZmRlZiBEQkcKLWV4dGVybiBVTE9ORyAgICBSVERlYnVnTGV2ZWw7Ci0jZW5kaWYKLQotI2RlZmluZSBOUl9XRVBfS0VZUwkJCQk0Ci0jZGVmaW5lIFdFUF9TTUFMTF9LRVlfTEVOCQkJKDQwLzgpCi0jZGVmaW5lIFdFUF9MQVJHRV9LRVlfTEVOCQkJKDEwNC84KQotCi0jZGVmaW5lIEdST1VQX0tFWV9OTyAgICAgICAgICAgICAgICA0Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQotI2RlZmluZSBJV0VfU1RSRUFNX0FERF9FVkVOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9ldmVudChfQSwgX0IsIF9DLCBfRCwgX0UpCi0jZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX3BvaW50KF9BLCBfQiwgX0MsIF9ELCBfRSkKLSNkZWZpbmUgSVdFX1NUUkVBTV9BRERfVkFMVUUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikJaXdlX3N0cmVhbV9hZGRfdmFsdWUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikKLSNlbHNlCi0jZGVmaW5lIElXRV9TVFJFQU1fQUREX0VWRU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX2V2ZW50KF9CLCBfQywgX0QsIF9FKQotI2RlZmluZSBJV0VfU1RSRUFNX0FERF9QT0lOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9wb2ludChfQiwgX0MsIF9ELCBfRSkKLSNkZWZpbmUgSVdFX1NUUkVBTV9BRERfVkFMVUUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikJaXdlX3N0cmVhbV9hZGRfdmFsdWUoX0IsIF9DLCBfRCwgX0UsIF9GKQotI2VuZGlmCi0KLWV4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGEyVGVtcGxhdGVbXTsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVF9WRVJTSU9OX0lORk97Ci0gICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblc7Ci0gICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblg7Ci0gICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblk7Ci0gICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblo7Ci0gICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGRZZWFyOwotICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkTW9udGg7Ci0gICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGREYXk7Ci19IFJUX1ZFUlNJT05fSU5GTywgKlBSVF9WRVJTSU9OX0lORk87Ci0KLXN0cnVjdCBpd19wcml2X2FyZ3MgcHJpdnRhYltdID0gewoteyBSVFBSSVZfSU9DVExfU0VULAotICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIDAsCi0gICJzZXQifSwKLQoteyBSVFBSSVZfSU9DVExfU0hPVywgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAotICAiIn0sCi0vKiAtLS0gc3ViLWlvY3RscyBkZWZpbml0aW9ucyAtLS0gKi8KLSAgICB7IFNIT1dfQ09OTl9TVEFUVVMsCi0JICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJjb25uU3RhdHVzIiB9LAotCXsgU0hPV19EUlZJRVJfVkVSSU9OLAotCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiZHJpdmVyVmVyIiB9LAotICAgIHsgU0hPV19CQV9JTkZPLAotCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiYmFpbmZvIiB9LAotCXsgU0hPV19ERVNDX0lORk8sCi0JICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkZXNjaW5mbyIgfSwKLSAgICB7IFJBSU9fT0ZGLAotCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAicmFkaW9fb2ZmIiB9LAotCXsgUkFJT19PTiwKLQkgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInJhZGlvX29uIiB9LAotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCXsgU0hPV19ETFNfRU5UUllfSU5GTywKLQkgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRsc2VudHJ5aW5mbyIgfSwKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQl7IFNIT1dfQ0ZHX1ZBTFVFLAotCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAic2hvdyIgfSwKLQl7IFNIT1dfQURIT0NfRU5UUllfSU5GTywKLQkgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImFkaG9jRW50cnkiIH0sCi0vKiAtLS0gc3ViLWlvY3RscyByZWxhdGlvbnMgLS0tICovCi0KLSNpZmRlZiBEQkcKLXsgUlRQUklWX0lPQ1RMX0JCUCwKLSAgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKLSAgImJicCJ9LAoteyBSVFBSSVZfSU9DVExfTUFDLAotICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKLSAgIm1hYyJ9LAotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAoteyBSVFBSSVZfSU9DVExfUkYsCi0gIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCi0gICJyZiJ9LAotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwoteyBSVFBSSVZfSU9DVExfRTJQLAotICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKLSAgImUycCJ9LAotI2VuZGlmICAvKiBEQkcgKi8KLQoteyBSVFBSSVZfSU9DVExfU1RBVElTVElDUywKLSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKLSAgInN0YXQifSwKLXsgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZLAotICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCi0gICJnZXRfc2l0ZV9zdXJ2ZXkifSwKLQotCi19OwotCi1zdGF0aWMgX19zMzIgcmFsaW5rcmF0ZVtdID0KLQl7MiwgIDQsICAgMTEsICAyMiwgLy8gQ0NLCi0JMTIsIDE4LCAgIDI0LCAgMzYsIDQ4LCA3MiwgOTYsIDEwOCwgLy8gT0ZETQotCTEzLCAyNiwgICAzOSwgIDUyLCAgNzgsIDEwNCwgMTE3LCAxMzAsIDI2LCAgNTIsICA3OCwgMTA0LCAxNTYsIDIwOCwgMjM0LCAyNjAsIC8vIDIwTUh6LCA4MDBucyBHSSwgTUNTOiAwIH4gMTUKLQkzOSwgNzgsICAxMTcsIDE1NiwgMjM0LCAzMTIsIDM1MSwgMzkwLAkJCQkJCQkJCQkgIC8vIDIwTUh6LCA4MDBucyBHSSwgTUNTOiAxNiB+IDIzCi0JMjcsIDU0LCAgIDgxLCAxMDgsIDE2MiwgMjE2LCAyNDMsIDI3MCwgNTQsIDEwOCwgMTYyLCAyMTYsIDMyNCwgNDMyLCA0ODYsIDU0MCwgLy8gNDBNSHosIDgwMG5zIEdJLCBNQ1M6IDAgfiAxNQotCTgxLCAxNjIsIDI0MywgMzI0LCA0ODYsIDY0OCwgNzI5LCA4MTAsCQkJCQkJCQkJCSAgLy8gNDBNSHosIDgwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKLQkxNCwgMjksICAgNDMsICA1NywgIDg3LCAxMTUsIDEzMCwgMTQ0LCAyOSwgNTksICAgODcsIDExNSwgMTczLCAyMzAsIDI2MCwgMjg4LCAvLyAyME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1Ci0JNDMsIDg3LCAgMTMwLCAxNzMsIDI2MCwgMzE3LCAzOTAsIDQzMywJCQkJCQkJCQkJICAvLyAyME1IeiwgNDAwbnMgR0ksIE1DUzogMTYgfiAyMwotCTMwLCA2MCwgICA5MCwgMTIwLCAxODAsIDI0MCwgMjcwLCAzMDAsIDYwLCAxMjAsIDE4MCwgMjQwLCAzNjAsIDQ4MCwgNTQwLCA2MDAsIC8vIDQwTUh6LCA0MDBucyBHSSwgTUNTOiAwIH4gMTUKLQk5MCwgMTgwLCAyNzAsIDM2MCwgNTQwLCA3MjAsIDgxMCwgOTAwfTsKLQotCi0KLUlOVCBTZXRfU1NJRF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKTsKLQotI2lmZGVmIFdNTV9TVVBQT1JUCi1JTlQJU2V0X1dtbUNhcGFibGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLSNlbmRpZgotCi1JTlQgU2V0X05ldHdvcmtUeXBlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X0F1dGhNb2RlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X0VuY3J5cFR5cGVfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfRGVmYXVsdEtleUlEX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X0tleTFfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfS2V5Ml9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKTsKLQotSU5UIFNldF9LZXkzX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X0tleTRfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfV1BBUFNLX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpOwotCi0KLUlOVCBTZXRfUFNNb2RlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpOwotCi0jaWZkZWYgUlQzMDkwCi1JTlQgU2V0X1BDSWVQU0xldmVsX1Byb2MoCi1JTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOwotI2VuZGlmIC8vIFJUMzA5MCAvLwotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLUlOVCBTZXRfV3BhX1N1cHBvcnQoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0jaWZkZWYgREJHCi0KLVZPSUQgUlRNUElvY3RsTUFDKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEpOwotCi1WT0lEIFJUTVBJb2N0bEUyUFJPTSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBzdHJ1Y3QgaXdyZXEgICAgKndycSk7Ci0jZW5kaWYgLy8gREJHIC8vCi0KLQotTkRJU19TVEFUVVMgUlRNUFdQQU5vbmVBZGRLZXlQcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOCVBWT0lECQkJcEJ1Zik7Ci0KLUlOVCBTZXRfRnJhZ1Rlc3RfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZyk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLUlOVCBTZXRfVEduV2lmaVRlc3RfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1JTlQgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotSU5UIFNldF9JZWVlODAyMTFkQ2xpZW50TW9kZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKTsKLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0KLSNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCi1JTlQgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpOwotI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KLQotSU5UCVNob3dfQWRob2NfTWFjVGFibGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJZXh0cmEpOwotCi0jaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCi1WT0lEIFJUTVBJb2N0bFJGKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEpOwotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCi0KLUlOVCBTZXRfQmVhY29uTG9zdFRpbWVfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFNUUklORyAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfQXV0b1JvYW1pbmdfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFNUUklORyAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfU2l0ZVN1cnZleV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X0ZvcmNlVHhCdXJzdF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQU1RSSU5HICAgICAgICAgYXJnKTsKLQotI2lmZGVmIEFOVF9ESVZFUlNJVFlfU1VQUE9SVAotSU5UCVNldF9BbnRlbm5hX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLSNlbmRpZiAvLyBBTlRfRElWRVJTSVRZX1NVUFBPUlQgLy8KLQotc3RhdGljIHN0cnVjdCB7Ci0JUFNUUklORyBuYW1lOwotCUlOVCAoKnNldF9wcm9jKShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLCBQU1RSSU5HIGFyZyk7Ci19ICpQUlRNUF9QUklWQVRFX1NFVF9QUk9DLCBSVE1QX1BSSVZBVEVfU1VQUE9SVF9QUk9DW10gPSB7Ci0JeyJEcml2ZXJWZXJzaW9uIiwJCQkJU2V0X0RyaXZlclZlcnNpb25fUHJvY30sCi0JeyJDb3VudHJ5UmVnaW9uIiwJCQkJU2V0X0NvdW50cnlSZWdpb25fUHJvY30sCi0JeyJDb3VudHJ5UmVnaW9uQUJhbmQiLAkJCVNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvY30sCi0JeyJTU0lEIiwJCQkJCQlTZXRfU1NJRF9Qcm9jfSwKLQl7IldpcmVsZXNzTW9kZSIsCQkJCVNldF9XaXJlbGVzc01vZGVfUHJvY30sCi0JeyJUeEJ1cnN0IiwJCQkJCVNldF9UeEJ1cnN0X1Byb2N9LAotCXsiVHhQcmVhbWJsZSIsCQkJCVNldF9UeFByZWFtYmxlX1Byb2N9LAotCXsiVHhQb3dlciIsCQkJCQlTZXRfVHhQb3dlcl9Qcm9jfSwKLQl7IkNoYW5uZWwiLAkJCQkJU2V0X0NoYW5uZWxfUHJvY30sCi0JeyJCR1Byb3RlY3Rpb24iLAkJCQlTZXRfQkdQcm90ZWN0aW9uX1Byb2N9LAotCXsiUlRTVGhyZXNob2xkIiwJCQkJU2V0X1JUU1RocmVzaG9sZF9Qcm9jfSwKLQl7IkZyYWdUaHJlc2hvbGQiLAkJCQlTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jfSwKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQl7Ikh0QnciLAkJICAgICAgICAgICAgICAgIFNldF9IdEJ3X1Byb2N9LAotCXsiSHRNY3MiLAkJICAgICAgICAgICAgICAgIFNldF9IdE1jc19Qcm9jfSwKLQl7Ikh0R2kiLAkJICAgICAgICAgICAgICAgIFNldF9IdEdpX1Byb2N9LAotCXsiSHRPcE1vZGUiLAkJICAgICAgICAgICAgU2V0X0h0T3BNb2RlX1Byb2N9LAotCXsiSHRFeHRjaGEiLAkJICAgICAgICAgICAgU2V0X0h0RXh0Y2hhX1Byb2N9LAotCXsiSHRNcGR1RGVuc2l0eSIsCQkgICAgICAgIFNldF9IdE1wZHVEZW5zaXR5X1Byb2N9LAotCXsiSHRCYVdpblNpemUiLAkJCQlTZXRfSHRCYVdpblNpemVfUHJvY30sCi0JeyJIdFJkZyIsCQkJCQlTZXRfSHRSZGdfUHJvY30sCi0JeyJIdEFtc2R1IiwJCQkJCVNldF9IdEFtc2R1X1Byb2N9LAotCXsiSHRBdXRvQmEiLAkJCQlTZXRfSHRBdXRvQmFfUHJvY30sCi0JeyJIdEJhRGVjbGluZSIsCQkJCQlTZXRfQkFEZWNsaW5lX1Byb2N9LAotCXsiSHRQcm90ZWN0IiwJCQkJU2V0X0h0UHJvdGVjdF9Qcm9jfSwKLQl7Ikh0TWltb1BzIiwJCQkJU2V0X0h0TWltb1BzX1Byb2N9LAotCXsiSHREaXNhbGxvd1RLSVAiLAkJCQlTZXRfSHREaXNhbGxvd1RLSVBfUHJvY30sCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCi0JeyJQa3RBZ2dyZWdhdGUiLAkJCQlTZXRfUGt0QWdncmVnYXRlX1Byb2N9LAotI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIFdNTV9TVVBQT1JUCi0JeyJXbW1DYXBhYmxlIiwJCQkJCVNldF9XbW1DYXBhYmxlX1Byb2N9LAotI2VuZGlmCi0JeyJJRUVFODAyMTFIIiwJCQkJCVNldF9JRUVFODAyMTFIX1Byb2N9LAotICAgIHsiTmV0d29ya1R5cGUiLCAgICAgICAgICAgICAgICAgU2V0X05ldHdvcmtUeXBlX1Byb2N9LAotCXsiQXV0aE1vZGUiLAkJCQkJU2V0X0F1dGhNb2RlX1Byb2N9LAotCXsiRW5jcnlwVHlwZSIsCQkJCQlTZXRfRW5jcnlwVHlwZV9Qcm9jfSwKLQl7IkRlZmF1bHRLZXlJRCIsCQkJCVNldF9EZWZhdWx0S2V5SURfUHJvY30sCi0JeyJLZXkxIiwJCQkJCQlTZXRfS2V5MV9Qcm9jfSwKLQl7IktleTIiLAkJCQkJCVNldF9LZXkyX1Byb2N9LAotCXsiS2V5MyIsCQkJCQkJU2V0X0tleTNfUHJvY30sCi0JeyJLZXk0IiwJCQkJCQlTZXRfS2V5NF9Qcm9jfSwKLQl7IldQQVBTSyIsCQkJCQkJU2V0X1dQQVBTS19Qcm9jfSwKLQl7IlJlc2V0Q291bnRlciIsCQkJCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2N9LAotCXsiUFNNb2RlIiwgICAgICAgICAgICAgICAgICAgICAgU2V0X1BTTW9kZV9Qcm9jfSwKLSNpZmRlZiBEQkcKLQl7IkRlYnVnIiwJCQkJCQlTZXRfRGVidWdfUHJvY30sCi0jZW5kaWYgLy8gREJHIC8vCi0KLSNpZmRlZiBSQUxJTktfQVRFCi0JeyJBVEUiLAkJCQkJCQlTZXRfQVRFX1Byb2N9LAotCXsiQVRFREEiLAkJCQkJCVNldF9BVEVfREFfUHJvY30sCi0JeyJBVEVTQSIsCQkJCQkJU2V0X0FURV9TQV9Qcm9jfSwKLQl7IkFURUJTU0lEIiwJCQkJCVNldF9BVEVfQlNTSURfUHJvY30sCi0JeyJBVEVDSEFOTkVMIiwJCQkJCVNldF9BVEVfQ0hBTk5FTF9Qcm9jfSwKLQl7IkFURVRYUE9XMCIsCQkJCQlTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jfSwKLQl7IkFURVRYUE9XMSIsCQkJCQlTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jfSwKLQl7IkFURVRYQU5UIiwJCQkJCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jfSwKLQl7IkFURVJYQU5UIiwJCQkJCVNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jfSwKLQl7IkFURVRYRlJFUU9GRlNFVCIsCQkJCVNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jfSwKLQl7IkFURVRYQlciLAkJCQkJCVNldF9BVEVfVFhfQldfUHJvY30sCi0JeyJBVEVUWExFTiIsCQkJCQlTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jfSwKLQl7IkFURVRYQ05UIiwJCQkJCVNldF9BVEVfVFhfQ09VTlRfUHJvY30sCi0JeyJBVEVUWE1DUyIsCQkJCQlTZXRfQVRFX1RYX01DU19Qcm9jfSwKLQl7IkFURVRYTU9ERSIsCQkJCQlTZXRfQVRFX1RYX01PREVfUHJvY30sCi0JeyJBVEVUWEdJIiwJCQkJCQlTZXRfQVRFX1RYX0dJX1Byb2N9LAotCXsiQVRFUlhGRVIiLAkJCQkJU2V0X0FURV9SWF9GRVJfUHJvY30sCi0JeyJBVEVSUkYiLAkJCQkJCVNldF9BVEVfUmVhZF9SRl9Qcm9jfSwKLQl7IkFURVdSRjEiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkYxX1Byb2N9LAotCXsiQVRFV1JGMiIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjJfUHJvY30sCi0JeyJBVEVXUkYzIiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGM19Qcm9jfSwKLQl7IkFURVdSRjQiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkY0X1Byb2N9LAotCXsiQVRFTERFMlAiLAkJCQkgICAgU2V0X0FURV9Mb2FkX0UyUF9Qcm9jfSwKLQl7IkFURVJFMlAiLAkJCQkJCVNldF9BVEVfUmVhZF9FMlBfUHJvY30sCi0JeyJBVEVTSE9XIiwJCQkJCQlTZXRfQVRFX1Nob3dfUHJvY30sCi0JeyJBVEVIRUxQIiwJCQkJCQlTZXRfQVRFX0hlbHBfUHJvY30sCi0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCXsiVHhTdG9wIiwJCQkJCQlTZXRfVHhTdG9wX1Byb2N9LAotCXsiUnhTdG9wIiwJCQkJCQlTZXRfUnhTdG9wX1Byb2N9LAotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgIHsiV3BhU3VwcG9ydCIsICAgICAgICAgICAgICAgICAgU2V0X1dwYV9TdXBwb3J0fSwKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLQotCi0KLQotCXsiRml4ZWRUeE1vZGUiLCAgICAgICAgICAgICAgICAgU2V0X0ZpeGVkVHhNb2RlX1Byb2N9LAotI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCi0JeyJPcE1vZGUiLAkJCQkJCVNldF9PcE1vZGVfUHJvY30sCi0jZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSAgICB7IlRHbldpZmlUZXN0IiwgICAgICAgICAgICAgICAgIFNldF9UR25XaWZpVGVzdF9Qcm9jfSwKLSAgICB7IkZvcmNlR0YiLAkJCQkJU2V0X0ZvcmNlR0ZfUHJvY30sCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JeyJEbHNBZGRFbnRyeSIsCQkJCQlTZXRfRGxzQWRkRW50cnlfUHJvY30sCi0JeyJEbHNUZWFyRG93bkVudHJ5IiwJCQlTZXRfRGxzVGVhckRvd25FbnRyeV9Qcm9jfSwKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQl7IkxvbmdSZXRyeSIsCQkJCVNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jfSwKLQl7IlNob3J0UmV0cnkiLAkJCQlTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2N9LAotI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKLQl7IjExZENsaWVudE1vZGUiLAkJCQlTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvY30sCi0jZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLwotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKLQl7IkNhcnJpZXJEZXRlY3QiLAkJCQlTZXRfQ2FycmllckRldGVjdF9Qcm9jfSwKLSNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCi0KLQotLy8yMDA4LzA5LzExOktIIGFkZCB0byBzdXBwb3J0IGVmdXNlPC0tCi0jaWZkZWYgUlQzMHh4Ci0jaWZkZWYgUlRNUF9FRlVTRV9TVVBQT1JUCi0JeyJlZnVzZUZyZWVOdW1iZXIiLAkJCQlzZXRfZUZ1c2VHZXRGcmVlQmxvY2tDb3VudF9Qcm9jfSwKLQl7ImVmdXNlRHVtcCIsCQkJCQlzZXRfZUZ1c2VkdW1wX1Byb2N9LAotCXsiZWZ1c2VMb2FkRnJvbUJpbiIsCQkJCXNldF9lRnVzZUxvYWRGcm9tQmluX1Byb2N9LAotCXsiZWZ1c2VCdWZmZXJNb2RlV3JpdGVCYWNrIiwJCXNldF9lRnVzZUJ1ZmZlck1vZGVXcml0ZUJhY2tfUHJvY30sCi0jZW5kaWYgLy8gUlRNUF9FRlVTRV9TVVBQT1JUIC8vCi0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi0JeyJhbnQiLAkJCQkJU2V0X0FudGVubmFfUHJvY30sCi0jZW5kaWYgLy8gQU5UX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0vLzIwMDgvMDkvMTE6S0ggYWRkIHRvIHN1cHBvcnQgZWZ1c2UtLT4KLQotCXsiQmVhY29uTG9zdFRpbWUiLAkJCQlTZXRfQmVhY29uTG9zdFRpbWVfUHJvY30sCi0JeyJBdXRvUm9hbWluZyIsCQkJCQlTZXRfQXV0b1JvYW1pbmdfUHJvY30sCi0JeyJTaXRlU3VydmV5IiwJCQkJCVNldF9TaXRlU3VydmV5X1Byb2N9LAotCXsiRm9yY2VUeEJ1cnN0IiwJCQkJU2V0X0ZvcmNlVHhCdXJzdF9Qcm9jfSwKLQotCXtOVUxMLH0KLX07Ci0KLQotVk9JRCBSVE1QQWRkS2V5KAotCUlOCVBSVE1QX0FEQVBURVIJICAgIHBBZCwKLQlJTglQTkRJU184MDJfMTFfS0VZICAgIHBLZXkpCi17Ci0JVUxPTkcJCQkJS2V5SWR4OwotCU1BQ19UQUJMRV9FTlRSWQkJKnBFbnRyeTsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRLZXkgLS0tLS0tPlxuIikpOwotCi0JaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLQl7Ci0JCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCi0JCXsKLQkJICAgIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywgMzIpOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywgcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICB9Ci0JCSAgICAvLyBVcGRhdGUgUFRLCi0JCSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0gICAgICAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgcEtleS0+S2V5TWF0ZXJpYWwsIExFTl9US0lQX0VLKTsKLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSAgICAgICAgICAgIHsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCi0JCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0JCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKLQkJZWxzZQotCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIE1BQ19UQUJMRV9FTlRSWQotCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIExFTl9US0lQX0VLKTsKLQkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5SeE1pYywgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIExFTl9US0lQX1JYTUlDSyk7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBMRU5fVEtJUF9UWE1JQ0spOwotCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKLQotCQkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQotCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAotCQkJCQkJCSAgQlNTMCwKLQkJCQkJCQkgIDAsCi0JCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCi0JCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCi0JCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKLQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljKTsKLQotCQkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKLQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCi0JCQkJCQkJCSAgQlNTMCwKLQkJCQkJCQkJICAwLAotCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKLQkJCQkJCQkJICBwRW50cnkpOwotCi0gICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAotCSAgICAgICAgICAgIC8vcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQotICAgICAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0gICAgICAgICAgICB9Ci0JCX0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBVcGRhdGUgR1RLCi0gICAgICAgICAgICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAocEtleS0+S2V5SW5kZXggJiAweEZGKTsKLSAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotICAgICAgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBwS2V5LT5LZXlNYXRlcmlhbCwgTEVOX1RLSVBfRUspOwotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0gICAgICAgICAgICB7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnCi0JCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCWlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKLQotICAgICAgICAgICAgLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKLQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKLQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCi0JCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKLQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAotCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywKLQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMpOwotCi0JCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQotCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLQkJCQkJCQkJICBCU1MwLAotCQkJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKLQkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKLQkJCQkJCQkJICBOVUxMKTsKLQotICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKLQkgICAgICAgIC8vcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKLQotICAgICAgICAgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKLSAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0gICAgICAgIH0KLQl9Ci0JZWxzZQkvLyBkeW5hbWljIFdFUCBmcm9tIHdwYV9zdXBwbGljYW50Ci0JewotCQlVQ0hBUglDaXBoZXJBbGc7Ci0JUFVDSEFSCUtleTsKLQotCQlpZihwS2V5LT5LZXlMZW5ndGggPT0gMzIpCi0JCQlnb3RvIGVuZDsKLQotCQlLZXlJZHggPSBwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7Ci0KLQkJaWYgKEtleUlkeCA8IDQpCi0JCXsKLQkJCS8vIGl0IGlzIGEgZGVmYXVsdCBzaGFyZWQga2V5LCBmb3IgUGFpcndpc2Uga2V5IHNldHRpbmcKLQkJCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCi0JCQl7Ci0JCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwS2V5LT5CU1NJRCk7Ci0KLQkJCQlpZiAocEVudHJ5KQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEFkZEtleTogU2V0IFBhaXItd2lzZSBLZXlcbiIpKTsKLQotCQkJCQkvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCi0JCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuS2V5TGVuID0gKFVDSEFSKXBLZXktPktleUxlbmd0aDsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKLQotCQkJCQkvLyBzZXQgQ2lwaGVyIHR5cGUKLQkJCQkJaWYgKHBLZXktPktleUxlbmd0aCA9PSA1KQotCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0JCQkJCWVsc2UKLQkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLQotCQkJCQkvLyBBZGQgUGFpci13aXNlIGtleSB0byBBc2ljCi0JCQkJCUFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KAotCQkJCQkJcEFkLAotCQkJCQkJcEVudHJ5LT5BZGRyLAotCQkJCQkJKFVDSEFSKXBFbnRyeS0+QWlkLAotCQkJCSZwRW50cnktPlBhaXJ3aXNlS2V5KTsKLQotCQkJCQkvLyB1cGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGVudHJ5Ci0JCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoCi0JCQkJCQlwQWQsCi0JCQkJCQlCU1MwLAotCQkJCQkJS2V5SWR4LCAvLyBUaGUgdmFsdWUgbWF5IGJlIG5vdCB6ZXJvCi0JCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZywKLQkJCQkJCXBFbnRyeSk7Ci0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0gICAgICAgICAgICB7Ci0JCQkJLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQotCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OwotCi0JCQkJLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAotCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwS2V5LT5LZXlMZW5ndGg7Ci0JCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKLQotCQkJCS8vIFNldCBDaXBlciB0eXBlCi0JCQkJaWYgKHBLZXktPktleUxlbmd0aCA9PSA1KQotCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQkJCQllbHNlCi0JCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLQotCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7Ci0JCQlLZXkgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleTsKLQotCQkJCS8vIFNldCBHcm91cCBrZXkgbWF0ZXJpYWwgdG8gQXNpYwotCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7Ci0KLQkJCQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQotCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgTlVMTCk7Ci0KLQkJCX0KLQkJfQotCX0KLWVuZDoKLQlyZXR1cm47Ci19Ci0KLWNoYXIgKiBydHN0cmNocihjb25zdCBjaGFyICogcywgaW50IGMpCi17Ci0gICAgZm9yKDsgKnMgIT0gKGNoYXIpIGM7ICsrcykKLSAgICAgICAgaWYgKCpzID09ICdcMCcpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gKGNoYXIgKikgczsKLX0KLQotLyoKLVRoaXMgaXMgcmVxdWlyZWQgZm9yIExpbkVYMjAwNC9rZXJuZWwyLjYuNyB0byBwcm92aWRlIGl3bGlzdCBzY2FubmluZyBmdW5jdGlvbgotKi8KLQotaW50Ci1ydF9pb2N0bF9naXduYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQotewotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0gICAgc3RybmNweShuYW1lLCAiUlQyODYwIFdpcmVsZXNzIiwgSUZOQU1TSVopOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfc2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCXN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQlpbnQJY2hhbiA9IC0xOwotCi0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLSAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0gICAgICAgIHJldHVybiAtRU5FVERPV047Ci0gICAgfQotCi0KLQlpZiAoZnJlcS0+ZSA+IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYoKGZyZXEtPmUgPT0gMCkgJiYgKGZyZXEtPm0gPD0gMTAwMCkpCi0JCWNoYW4gPSBmcmVxLT5tOwkvLyBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyCi0JZWxzZQotCQlNQVBfS0haX1RPX0NIQU5ORUxfSUQoIChmcmVxLT5tIC8xMDApICwgY2hhbik7IC8vIFNldHRpbmcgYnkgZnJlcXVlbmN5IC0gc2VhcmNoIHRoZSB0YWJsZSAsIGxpa2UgMi40MTJHLCAyLjQyMkcsCi0KLSAgICBpZiAoQ2hhbm5lbFNhbml0eShwQWRhcHRlciwgY2hhbikgPT0gVFJVRSkKLSAgICB7Ci0JcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID0gY2hhbjsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI9PT5ydF9pb2N0bF9zaXdmcmVxOjpTSU9DU0lXRlJFUVtjbWQ9MHgleF0gKENoYW5uZWw9JWQpXG4iLCBTSU9DU0lXRlJFUSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1pbnQgcnRfaW9jdGxfZ2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICBzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IE5VTEw7Ci0JVUNIQVIgY2g7Ci0JVUxPTkcJbSA9IDI0MTIwMDA7Ci0KLQlwQWRhcHRlciA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0JaWYgKHBBZGFwdGVyID09IE5VTEwpCi0JewotCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOwotCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KLQkJcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLQkJY2ggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWw7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIj09PnJ0X2lvY3RsX2dpd2ZyZXEgICVkXG4iLCBjaCkpOwotCi0JTUFQX0NIQU5ORUxfSURfVE9fS0haKGNoLCBtKTsKLQlmcmVxLT5tID0gbSAqIDEwMDsKLQlmcmVxLT5lID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotCi1pbnQgcnRfaW9jdGxfc2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0KLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICB7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCXJldHVybiAtRU5FVERPV047Ci0gICAgfQotCi0Jc3dpdGNoICgqbW9kZSkKLQl7Ci0JCWNhc2UgSVdfTU9ERV9BREhPQzoKLQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiQWRob2MiKTsKLQkJCWJyZWFrOwotCQljYXNlIElXX01PREVfSU5GUkE6Ci0JCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkluZnJhIik7Ci0JCQlicmVhazsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIwKSkKLSAgICAgICAgY2FzZSBJV19NT0RFX01PTklUT1I6Ci0JCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIk1vbml0b3IiKTsKLQkJCWJyZWFrOwotI2VuZGlmCi0JCWRlZmF1bHQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfc2l3bW9kZTo6U0lPQ1NJV01PREUgKHVua25vd24gJWQpXG4iLCAqbW9kZSkpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQotCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1pbnQgcnRfaW9jdGxfZ2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0KLQlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKLQl7Ci0JCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7Ci0JCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotCWlmIChBREhPQ19PTihwQWRhcHRlcikpCi0JCSptb2RlID0gSVdfTU9ERV9BREhPQzsKLSAgICBlbHNlIGlmIChJTkZSQV9PTihwQWRhcHRlcikpCi0JCSptb2RlID0gSVdfTU9ERV9JTkZSQTsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIwKSkKLSAgICBlbHNlIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKLSAgICB7Ci0gICAgICAgICptb2RlID0gSVdfTU9ERV9NT05JVE9SOwotICAgIH0KLSNlbmRpZgotICAgIGVsc2UKLSAgICAgICAgKm1vZGUgPSBJV19NT0RFX0FVVE87Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT5ydF9pb2N0bF9naXdtb2RlKG1vZGU9JWQpXG4iLCAqbW9kZSkpOwotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfc2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfZ2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHJ0X2lvY3RsX2dpd3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0Jc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKikgZXh0cmE7Ci0JdTE2IHZhbDsKLQlpbnQgaTsKLQotCWlmIChwQWRhcHRlciA9PSBOVUxMKQotCXsKLQkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKLQkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCi0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PnJ0X2lvY3RsX2dpd3JhbmdlXG4iKSk7Ci0JZGF0YS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7Ci0JbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7Ci0KLQlyYW5nZS0+dHhwb3dlcl9jYXBhID0gSVdfVFhQT1dfREJNOwotCi0JaWYgKElORlJBX09OKHBBZGFwdGVyKXx8QURIT0NfT04ocEFkYXB0ZXIpKQotCXsKLQkJcmFuZ2UtPm1pbl9wbXAgPSAxICogMTAyNDsKLQkJcmFuZ2UtPm1heF9wbXAgPSA2NTUzNSAqIDEwMjQ7Ci0JCXJhbmdlLT5taW5fcG10ID0gMSAqIDEwMjQ7Ci0JCXJhbmdlLT5tYXhfcG10ID0gMTAwMCAqIDEwMjQ7Ci0JCXJhbmdlLT5wbXBfZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7Ci0JCXJhbmdlLT5wbXRfZmxhZ3MgPSBJV19QT1dFUl9USU1FT1VUOwotCQlyYW5nZS0+cG1fY2FwYSA9IElXX1BPV0VSX1BFUklPRCB8IElXX1BPV0VSX1RJTUVPVVQgfAotCQkJSVdfUE9XRVJfVU5JQ0FTVF9SIHwgSVdfUE9XRVJfQUxMX1I7Ci0JfQotCi0JcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7Ci0JcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMTQ7Ci0KLQlyYW5nZS0+cmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUOwotCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOwotCXJhbmdlLT5taW5fcmV0cnkgPSAwOwotCXJhbmdlLT5tYXhfcmV0cnkgPSAyNTU7Ci0KLQlyYW5nZS0+bnVtX2NoYW5uZWxzID0gIHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bTsKLQotCXZhbCA9IDA7Ci0JZm9yIChpID0gMTsgaSA8PSByYW5nZS0+bnVtX2NoYW5uZWxzOyBpKyspCi0JewotCQl1MzIgbSA9IDI0MTIwMDA7Ci0JCXJhbmdlLT5mcmVxW3ZhbF0uaSA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpLTFdLkNoYW5uZWw7Ci0JCU1BUF9DSEFOTkVMX0lEX1RPX0tIWihwQWRhcHRlci0+Q2hhbm5lbExpc3RbaS0xXS5DaGFubmVsLCBtKTsKLQkJcmFuZ2UtPmZyZXFbdmFsXS5tID0gbSAqIDEwMDsgLyogT1NfSFogKi8KLQotCQlyYW5nZS0+ZnJlcVt2YWxdLmUgPSAxOwotCQl2YWwrKzsKLQkJaWYgKHZhbCA9PSBJV19NQVhfRlJFUVVFTkNJRVMpCi0JCQlicmVhazsKLQl9Ci0JcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB2YWw7Ci0KLQlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDEwMDsgLyogd2hhdCBpcyBjb3JyZWN0IG1heD8gVGhpcyB3YXMgbm90Ci0JCQkJCSogZG9jdW1lbnRlZCBleGFjdGx5LiBBdCBsZWFzdAotCQkJCQkqIDY5IGhhcyBiZWVuIG9ic2VydmVkLiAqLwotCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDA7IC8qIGRCICovCi0JcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsgLyogZEIgKi8KLQotCS8qIFdoYXQgd291bGQgYmUgc3VpdGFibGUgdmFsdWVzIGZvciAiYXZlcmFnZS90eXBpY2FsIiBxdWFsPyAqLwotCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gMjA7Ci0JcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gLTYwOwotCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IC05NTsKLQlyYW5nZS0+c2Vuc2l0aXZpdHkgPSAzOwotCi0JcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSBOUl9XRVBfS0VZUzsKLQlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMjsKLQlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDU7Ci0JcmFuZ2UtPmVuY29kaW5nX3NpemVbMV0gPSAxMzsKLQotCXJhbmdlLT5taW5fcnRzID0gMDsKLQlyYW5nZS0+bWF4X3J0cyA9IDIzNDc7Ci0JcmFuZ2UtPm1pbl9mcmFnID0gMjU2OwotCXJhbmdlLT5tYXhfZnJhZyA9IDIzNDY7Ci0KLSNpZiBXSVJFTEVTU19FWFQgPiAxNwotCS8qIElXX0VOQ19DQVBBXyogYml0IGZpZWxkICovCi0JcmFuZ2UtPmVuY19jYXBhID0gSVdfRU5DX0NBUEFfV1BBIHwgSVdfRU5DX0NBUEFfV1BBMiB8Ci0JCQkJCUlXX0VOQ19DQVBBX0NJUEhFUl9US0lQIHwgSVdfRU5DX0NBUEFfQ0lQSEVSX0NDTVA7Ci0jZW5kaWYKLQotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfc2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCc3NpZDsKLQotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JcmV0dXJuIC1FTkVURE9XTjsKLSAgICB9Ci0KLQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKLSAgICB7Ci0gICAgICAgIFJUTVBfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOwotICAgIH0KLQotICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZwotICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCi0gICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKLQkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYwotCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKLQotICAgIG1lbXNldChCc3NpZCwgMCwgTUFDX0FERFJfTEVOKTsKLSAgICBtZW1jcHkoQnNzaWQsIGFwX2FkZHItPnNhX2RhdGEsIE1BQ19BRERSX0xFTik7Ci0gICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCi0gICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRCwKLSAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpLAotICAgICAgICAgICAgICAgIChWT0lEICopJkJzc2lkKTsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DU0lXQVAgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0gICAgICAgIEJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfZ2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotCWlmIChwQWRhcHRlciA9PSBOVUxMKQotCXsKLQkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKLQkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCi0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCi0JewotCQlhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JCW1lbWNweShhcF9hZGRyLT5zYV9kYXRhLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5Cc3NpZCwgRVRIX0FMRU4pOwotCX0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgLy8gQWRkIGZvciBSVDI4NzAKLSAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQotICAgIHsKLSAgICAgICAgYXBfYWRkci0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotICAgICAgICBtZW1jcHkoYXBfYWRkci0+c2FfZGF0YSwgJnBBZGFwdGVyLT5NbG1lQXV4LkJzc2lkLCBFVEhfQUxFTik7Ci0gICAgfQotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ0dJV0FQKD1FTVBUWSlcbiIpKTsKLQkJcmV0dXJuIC1FTk9UQ09OTjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFVuaXRzIGFyZSBpbiBkYiBhYm92ZSB0aGUgbm9pc2UgZmxvb3IuIFRoYXQgbWVhbnMgdGhlCi0gKiByc3NpIHZhbHVlcyByZXBvcnRlZCBpbiB0aGUgdHgvcnggZGVzY3JpcHRvcnMgaW4gdGhlCi0gKiBkcml2ZXIgYXJlIHRoZSBTTlIgZXhwcmVzc2VkIGluIGRiLgotICoKLSAqIElmIHlvdSBhc3N1bWUgdGhhdCB0aGUgbm9pc2UgZmxvb3IgaXMgLTk1LCB3aGljaCBpcyBhbgotICogZXhjZWxsZW50IGFzc3VtcHRpb24gOTkuNSAlIG9mIHRoZSB0aW1lLCB0aGVuIHlvdSBjYW4KLSAqIGRlcml2ZSB0aGUgYWJzb2x1dGUgc2lnbmFsIGxldmVsIChpLmUuIC05NSArIHJzc2kpLgotICogVGhlcmUgYXJlIHNvbWUgb3RoZXIgc2xpZ2h0IGZhY3RvcnMgdG8gdGFrZSBpbnRvIGFjY291bnQKLSAqIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSByc3NpIG1lYXN1cmVtZW50IGlzIGZyb20gMTFiLAotICogMTFnLCBvciAxMWEuICAgVGhlc2UgZGlmZmVyZW5jZXMgYXJlIGF0IG1vc3QgMmRiIGFuZAotICogY2FuIGJlIGRvY3VtZW50ZWQuCi0gKgotICogTkI6IHZhcmlvdXMgY2FsY3VsYXRpb25zIGFyZSBiYXNlZCBvbiB0aGUgb3Jpbm9jby93YXZlbGFuCi0gKiAgICAgZHJpdmVycyBmb3IgY29tcGF0aWJpbGl0eQotICovCi1zdGF0aWMgdm9pZCBzZXRfcXVhbGl0eShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3F1YWxpdHkgKmlxLAotICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGNoYXIgcnNzaSkKLXsKLQlfX3U4IENoYW5uZWxRdWFsaXR5OwotCi0JLy8gTm9ybWFsaXplIFJzc2kKLQlpZiAocnNzaSA+PSAtNTApCi0gICAgICAgIENoYW5uZWxRdWFsaXR5ID0gMTAwOwotCWVsc2UgaWYgKHJzc2kgPj0gLTgwKSAvLyBiZXR3ZWVuIC01MCB+IC04MGRibQotCQlDaGFubmVsUXVhbGl0eSA9IChfX3U4KSgyNCArICgocnNzaSArIDgwKSAqIDI2KS8xMCk7Ci0JZWxzZSBpZiAocnNzaSA+PSAtOTApICAgLy8gYmV0d2VlbiAtODAgfiAtOTBkYm0KLSAgICAgICAgQ2hhbm5lbFF1YWxpdHkgPSAoX191OCkoKHJzc2kgKyA5MCkgKiAyNikvMTA7Ci0JZWxzZQotCQlDaGFubmVsUXVhbGl0eSA9IDA7Ci0KLSAgICBpcS0+cXVhbCA9IChfX3U4KUNoYW5uZWxRdWFsaXR5OwotCi0gICAgaXEtPmxldmVsID0gKF9fdTgpKHJzc2kpOwotICAgIGlxLT5ub2lzZSA9IChwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0gPiBwQWRhcHRlci0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQpID8gKChfX3U4KXBBZGFwdGVyLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCkgOiAoKF9fdTgpIHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSk7CQkvLyBub2lzZSBsZXZlbCAoZEJtKQotICAgIGlxLT5ub2lzZSArPSAyNTYgLSAxNDM7Ci0gICAgaXEtPnVwZGF0ZWQgPSBwQWRhcHRlci0+aXdfc3RhdHMucXVhbC51cGRhdGVkOwotfQotCi1pbnQgcnRfaW9jdGxfaXdhcGxpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQotewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCi0Jc3RydWN0IHNvY2thZGRyIGFkZHJbSVdfTUFYX0FQXTsKLQlzdHJ1Y3QgaXdfcXVhbGl0eSBxdWFsW0lXX01BWF9BUF07Ci0JaW50IGk7Ci0KLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICB7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCQlkYXRhLT5sZW5ndGggPSAwOwotCQlyZXR1cm4gMDsKLSAgICAgICAgLy9yZXR1cm4gLUVORVRET1dOOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPElXX01BWF9BUCA7IGkrKykKLQl7Ci0JCWlmIChpID49ICBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcikKLQkJCWJyZWFrOwotCQlhZGRyW2ldLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQkJCW1lbWNweShhZGRyW2ldLnNhX2RhdGEsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKLQkJc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZxdWFsW2ldLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKLQl9Ci0JZGF0YS0+bGVuZ3RoID0gaTsKLQltZW1jcHkoZXh0cmEsICZhZGRyLCBpKnNpemVvZihhZGRyWzBdKSk7Ci0JZGF0YS0+ZmxhZ3MgPSAxOwkJLyogc2lnbmFsIHF1YWxpdHkgcHJlc2VudCAoc29ydCBvZikgKi8KLQltZW1jcHkoZXh0cmEgKyBpKnNpemVvZihhZGRyWzBdKSwgJnF1YWwsIGkqc2l6ZW9mKHF1YWxbaV0pKTsKLQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgU0lPQ0dJV1NDQU4KLWludCBydF9pb2N0bF9zaXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotCVVMT05HCQkJCQkJCQlOb3c7Ci0JaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0KLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLQkJcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLQlpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIGluIE1vbml0b3IgTW9kZSBub3cgISEhXG4iKSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCi0JewotCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQrKzsKLQl9Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0gICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotCQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlkb3sKLQkJTm93ID0gamlmZmllczsKLQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpICYmCi0JCQkocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50ID4gMykpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBXcGFTdXBwbGljYW50U2NhbkNvdW50ID4gM1xuIikpOwotCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQkJCWJyZWFrOwotCQl9Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0JCWlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpICYmCi0JCQkoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAotCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkgJiYKLQkJCShwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMaW5rIFVQLCBQb3J0IE5vdCBTZWN1cmVkISBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7Ci0JCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKLQkJewotCQkJUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOwotCQl9Ci0KLQkJLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCi0JCS8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCi0JCXBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7Ci0JCS8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCi0JCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7Ci0JCXBBZGFwdGVyLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OwotCi0JCU1sbWVFbnF1ZXVlKHBBZGFwdGVyLAotCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCi0JCQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKLQkJCTAsCi0JCQlOVUxMKTsKLQotCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCQlSVE1QX01MTUVfSEFORExFUihwQWRhcHRlcik7Ci0JfXdoaWxlKDApOwotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi1pbnQgcnRfaW9jdGxfZ2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCi17Ci0KLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQlpbnQgaT0wOwotCVBTVFJJTkcgY3VycmVudF9ldiA9IGV4dHJhLCBwcmV2aW91c19ldiA9IGV4dHJhOwotCVBTVFJJTkcgZW5kX2J1ZjsKLQlQU1RSSU5HIGN1cnJlbnRfdmFsOwotCVNUUklORyBjdXN0b21bTUFYX0NVU1RPTV9MRU5dID0gezB9OwotI2lmbmRlZiBJV0VWR0VOSUUKLQl1bnNpZ25lZCBjaGFyIGlkeDsKLSNlbmRpZiAvLyBJV0VWR0VOSUUgLy8KLQlzdHJ1Y3QgaXdfZXZlbnQgaXdlOwotCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKLSAgICB7Ci0JCS8qCi0JCSAqIFN0aWxsIHNjYW5uaW5nLCBpbmRpY2F0ZSB0aGUgY2FsbGVyIHNob3VsZCB0cnkgYWdhaW4uCi0JCSAqLwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0KLQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQlpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQotCXsKLQkJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50ID0gMDsKLQl9Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0JaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yID09IDApCi0JewotCQlkYXRhLT5sZW5ndGggPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0KLSNpZiBXSVJFTEVTU19FWFQgPj0gMTcKLSAgICBpZiAoZGF0YS0+bGVuZ3RoID4gMCkKLSAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgZGF0YS0+bGVuZ3RoOwotICAgIGVsc2UKLSAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKLSNlbHNlCi0gICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKLSNlbmRpZgotCi0JZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCi0JewotCQlpZiAoY3VycmVudF9ldiA+PSBlbmRfYnVmKQotICAgICAgICB7Ci0jaWYgV0lSRUxFU1NfRVhUID49IDE3Ci0gICAgICAgICAgICByZXR1cm4gLUUyQklHOwotI2Vsc2UKLQkJCWJyZWFrOwotI2VuZGlmCi0gICAgICAgIH0KLQotCQkvL01BQyBhZGRyZXNzCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJaXdlLmNtZCA9IFNJT0NHSVdBUDsKLQkJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JCQkJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBFVEhfQUxFTik7Ci0KLSAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OwotCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBJV19FVl9BRERSX0xFTik7Ci0gICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNwotICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKLSNlbHNlCi0JCQlicmVhazsKLSNlbmRpZgotCi0JCS8qCi0JCVByb3RvY29sOgotCQkJaXQgd2lsbCBzaG93IHNjYW5uZWQgQVAncyBXaXJlbGVzc01vZGUgLgotCQkJaXQgbWlnaHQgYmUKLQkJCQkJODAyLjExYQotCQkJCQk4MDIuMTFhL24KLQkJCQkJODAyLjExZy9uCi0JCQkJCTgwMi4xMWIvZy9uCi0JCQkJCTgwMi4xMWcKLQkJCQkJODAyLjExYi9nCi0JCSovCi0JCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7Ci0JCWl3ZS5jbWQgPSBTSU9DR0lXTkFNRTsKLQotCi0JewotCQlQQlNTX0VOVFJZIHBCc3NFbnRyeT0mcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV07Ci0JCUJPT0xFQU4gaXNHb25seT1GQUxTRTsKLQkJaW50IHJhdGVDbnQ9MDsKLQotCQlpZiAocEJzc0VudHJ5LT5DaGFubmVsPjE0KQotCQl7Ci0JCQlpZiAocEJzc0VudHJ5LT5IdENhcGFiaWxpdHlMZW4hPTApCi0JCQkJc3RyY3B5KGl3ZS51Lm5hbWUsIjgwMi4xMWEvbiIpOwotCQkJZWxzZQotCQkJCXN0cmNweShpd2UudS5uYW1lLCI4MDIuMTFhIik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvKgotCQkJCWlmIG9uZSBvZiBub24gQiBtb2RlIHJhdGUgaXMgc2V0IHN1cHBvcnRlZCByYXRlIC4gaXQgbWVhbiBHIG9ubHkuCi0JCQkqLwotCQkJZm9yIChyYXRlQ250PTA7cmF0ZUNudDxwQnNzRW50cnktPlN1cFJhdGVMZW47cmF0ZUNudCsrKQotCQkJewotCQkJCS8qCi0JCQkJCTZNYnBzKDE0MCkgOU1icHMoMTQ2KSBhbmQgPj0xMk1icHMoMTUyKSBhcmUgc3VwcG9ydGVkIHJhdGUgLCBpdCBtZWFuIEcgb25seS4KLQkJCQkqLwotCQkJCWlmIChwQnNzRW50cnktPlN1cFJhdGVbcmF0ZUNudF09PTE0MCB8fCBwQnNzRW50cnktPlN1cFJhdGVbcmF0ZUNudF09PTE0NiB8fCBwQnNzRW50cnktPlN1cFJhdGVbcmF0ZUNudF0+PTE1MikKLQkJCQkJaXNHb25seT1UUlVFOwotCQkJfQotCi0JCQlmb3IgKHJhdGVDbnQ9MDtyYXRlQ250PHBCc3NFbnRyeS0+RXh0UmF0ZUxlbjtyYXRlQ250KyspCi0JCQl7Ci0JCQkJaWYgKHBCc3NFbnRyeS0+RXh0UmF0ZVtyYXRlQ250XT09MTQwIHx8IHBCc3NFbnRyeS0+RXh0UmF0ZVtyYXRlQ250XT09MTQ2IHx8IHBCc3NFbnRyeS0+RXh0UmF0ZVtyYXRlQ250XT49MTUyKQotCQkJCQlpc0dvbmx5PVRSVUU7Ci0JCQl9Ci0KLQotCQkJaWYgKHBCc3NFbnRyeS0+SHRDYXBhYmlsaXR5TGVuIT0wKQotCQkJewotCQkJCWlmIChpc0dvbmx5PT1UUlVFKQotCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwiODAyLjExZy9uIik7Ci0JCQkJZWxzZQotCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwiODAyLjExYi9nL24iKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoaXNHb25seT09VFJVRSkKLQkJCQkJc3RyY3B5KGl3ZS51Lm5hbWUsIjgwMi4xMWciKTsKLQkJCQllbHNlCi0JCQkJewotCQkJCQlpZiAocEJzc0VudHJ5LT5TdXBSYXRlTGVuPT00ICYmIHBCc3NFbnRyeS0+RXh0UmF0ZUxlbj09MCkKLQkJCQkJCXN0cmNweShpd2UudS5uYW1lLCI4MDIuMTFiIik7Ci0JCQkJCWVsc2UKLQkJCQkJCXN0cmNweShpd2UudS5uYW1lLCI4MDIuMTFiL2ciKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkJcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OwotCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBJV19FVl9BRERSX0xFTik7Ci0JCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNwotCQkJcmV0dXJuIC1FMkJJRzsKLSNlbHNlCi0JCQlicmVhazsKLSNlbmRpZgotCi0JCS8vRVNTSUQKLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwotCQlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOwotCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW47Ci0JCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOwotCi0gICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKLQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsZW5kX2J1ZiwgJml3ZSwgKFBTVFJJTkcpIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQpOwotICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKLSNpZiBXSVJFTEVTU19FWFQgPj0gMTcKLSAgICAgICAgICAgIHJldHVybiAtRTJCSUc7Ci0jZWxzZQotCQkJYnJlYWs7Ci0jZW5kaWYKLQotCQkvL05ldHdvcmsgVHlwZQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7Ci0JCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKLQkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gTmRpczgwMl8xMUlCU1MpCi0JCXsKLQkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FESE9DOwotCQl9Ci0JCWVsc2UgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlKQotCQl7Ci0JCQlpd2UudS5tb2RlID0gSVdfTU9ERV9JTkZSQTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FVVE87Ci0JCX0KLQkJaXdlLmxlbiA9IElXX0VWX1VJTlRfTEVOOwotCi0gICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKLQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBJV19FVl9VSU5UX0xFTik7Ci0gICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNwotICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKLSNlbHNlCi0JCQlicmVhazsKLSNlbmRpZgotCi0JCS8vQ2hhbm5lbCBhbmQgRnJlcXVlbmN5Ci0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJaXdlLmNtZCA9IFNJT0NHSVdGUkVROwotCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKLQkJCWl3ZS51LmZyZXEubSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWw7Ci0JCWVsc2UKLQkJCWl3ZS51LmZyZXEubSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWw7Ci0JCWl3ZS51LmZyZXEuZSA9IDA7Ci0JCWl3ZS51LmZyZXEuaSA9IDA7Ci0KLQkJcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OwotCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7Ci0gICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNwotICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKLSNlbHNlCi0JCQlicmVhazsKLSNlbmRpZgotCi0gICAgICAgIC8vQWRkIHF1YWxpdHkgc3RhdGlzdGljcwotICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIG1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7Ci0JaXdlLmNtZCA9IElXRVZRVUFMOwotCWl3ZS51LnF1YWwubGV2ZWwgPSAwOwotCWl3ZS51LnF1YWwubm9pc2UgPSAwOwotCXNldF9xdWFsaXR5KHBBZGFwdGVyLCAmaXdlLnUucXVhbCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSk7Ci0JY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX1FVQUxfTEVOKTsKLQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKLSNpZiBXSVJFTEVTU19FWFQgPj0gMTcKLSAgICAgICAgICAgIHJldHVybiAtRTJCSUc7Ci0jZWxzZQotCQkJYnJlYWs7Ci0jZW5kaWYKLQotCQkvL0VuY3lwdGlvbiBrZXkKLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwotCQlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKLQkJaWYgKENBUF9JU19QUklWQUNZX09OIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DYXBhYmlsaXR5SW5mbyApKQotCQkJaXdlLnUuZGF0YS5mbGFncyA9SVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7Ci0JCWVsc2UKLQkJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7Ci0KLSAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OwotICAgICAgICBjdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwmaXdlLCAoY2hhciAqKXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bKGl3ZS51LmRhdGEuZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpLTFdLktleSk7Ci0gICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNwotICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKLSNlbHNlCi0JCQlicmVhazsKLSNlbmRpZgotCi0JCS8vQml0IFJhdGUKLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbikKLSAgICAgICAgewotICAgICAgICAgICAgVUNIQVIgdG1wUmF0ZSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVbcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbi0xXTsKLQkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7Ci0JCQlpd2UuY21kID0gU0lPQ0dJV1JBVEU7Ci0JCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47Ci0gICAgICAgICAgICBpZiAodG1wUmF0ZSA9PSAweDgyKQotICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgMSAqIDEwMDAwMDA7Ci0gICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4ODQpCi0gICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAyICogMTAwMDAwMDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4QikKLSAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDUuNSAqIDEwMDAwMDA7Ci0gICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4OTYpCi0gICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAxMSAqIDEwMDAwMDA7Ci0gICAgICAgICAgICBlbHNlCi0JCSAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gICh0bXBSYXRlLzIpICogMTAwMDAwMDsKLQotCQkJaWYgKHRtcFJhdGUgPT0gMHg2YyAmJiBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5IdENhcGFiaWxpdHlMZW4gPiAwKQotCQkJewotCQkJCWludCByYXRlX2NvdW50ID0gc2l6ZW9mKHJhbGlua3JhdGUpL3NpemVvZihfX3MzMik7Ci0JCQkJSFRfQ0FQX0lORk8gY2FwSW5mbyA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkh0Q2FwYWJpbGl0eS5IdENhcEluZm87Ci0JCQkJaW50IHNob3J0R0kgPSBjYXBJbmZvLkNoYW5uZWxXaWR0aCA/IGNhcEluZm8uU2hvcnRHSWZvcjQwIDogY2FwSW5mby5TaG9ydEdJZm9yMjA7Ci0JCQkJaW50IG1heE1DUyA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPyAgMTUgOiA3OwotCQkJCWludCByYXRlX2luZGV4ID0gMTIgKyAoKFVDSEFSKWNhcEluZm8uQ2hhbm5lbFdpZHRoICogMjQpICsgKChVQ0hBUilzaG9ydEdJICo0OCkgKyAoKFVDSEFSKW1heE1DUyk7Ci0JCQkJaWYgKHJhdGVfaW5kZXggPCAwKQotCQkJCQlyYXRlX2luZGV4ID0gMDsKLQkJCQlpZiAocmF0ZV9pbmRleCA+IHJhdGVfY291bnQpCi0JCQkJCXJhdGVfaW5kZXggPSByYXRlX2NvdW50OwotCQkJCWl3ZS51LmJpdHJhdGUudmFsdWUJPSAgcmFsaW5rcmF0ZVtyYXRlX2luZGV4XSAqIDUwMDAwMDsKLQkJCX0KLQotCQkJaXdlLnUuYml0cmF0ZS5kaXNhYmxlZCA9IDA7Ci0JCQljdXJyZW50X3ZhbCA9IElXRV9TVFJFQU1fQUREX1ZBTFVFKGluZm8sIGN1cnJlbnRfZXYsCi0JCQkJY3VycmVudF92YWwsIGVuZF9idWYsICZpd2UsCi0JCQlJV19FVl9QQVJBTV9MRU4pOwotCi0JCWlmKChjdXJyZW50X3ZhbC1jdXJyZW50X2V2KT5JV19FVl9MQ1BfTEVOKQotCQljdXJyZW50X2V2ID0gY3VycmVudF92YWw7Ci0JCWVsc2UKLSNpZiBXSVJFTEVTU19FWFQgPj0gMTcKLSAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOwotI2Vsc2UKLQkJCSAgICBicmVhazsKLSNlbmRpZgotICAgICAgICB9Ci0KLSNpZmRlZiBJV0VWR0VOSUUKLSAgICAgICAgLy9XUEEgSUUKLQkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuID4gMCkKLSAgICAgICAgewotCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7Ci0JCQltZW1jcHkoY3VzdG9tLCAmKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFWzBdKSwKLQkJCQkJCSAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuKTsKLQkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7Ci0JCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuOwotCQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGN1c3RvbSk7Ci0JCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKLSNpZiBXSVJFTEVTU19FWFQgPj0gMTcKLSAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOwotI2Vsc2UKLQkJCSAgICBicmVhazsKLSNlbmRpZgotCQl9Ci0KLQkJLy9XUEEyIElFCi0gICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiA+IDApCi0gICAgICAgIHsKLQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7Ci0JCQltZW1jcHkoY3VzdG9tLCAmKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFWzBdKSwKLQkJCQkJCSAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuKTsKLQkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7Ci0JCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuOwotCQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGN1c3RvbSk7Ci0JCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKLSNpZiBXSVJFTEVTU19FWFQgPj0gMTcKLSAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOwotI2Vsc2UKLQkJCSAgICBicmVhazsKLSNlbmRpZgotICAgICAgICB9Ci0jZWxzZQotICAgICAgICAvL1dQQSBJRQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiA+IDApCi0gICAgICAgIHsKLQkJTmRpc1plcm9NZW1vcnkoJml3ZSwgc2l6ZW9mKGl3ZSkpOwotCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKLQkJaXdlLmNtZCA9IElXRVZDVVNUT007Ci0gICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiAqIDIpICsgNzsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KGN1c3RvbSwgIndwYV9pZT0iLCA3KTsKLSAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW47IGlkeCsrKQotICAgICAgICAgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMlMDJ4IiwgY3VzdG9tLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRVtpZHhdKTsKLSAgICAgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKLQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBjdXN0b20pOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCi0jaWYgV0lSRUxFU1NfRVhUID49IDE3Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKLSNlbHNlCi0JCQkgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgfQotCi0gICAgICAgIC8vV1BBMiBJRQotICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gPiAwKQotICAgICAgICB7Ci0JCU5kaXNaZXJvTWVtb3J5KCZpd2UsIHNpemVvZihpd2UpKTsKLQkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7Ci0JCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOwotICAgICAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gKiAyKSArIDc7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShjdXN0b20sICJyc25faWU9IiwgNyk7Ci0JCQlmb3IgKGlkeCA9IDA7IGlkeCA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuOyBpZHgrKykKLSAgICAgICAgICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVbaWR4XSk7Ci0gICAgICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7Ci0JCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgY3VzdG9tKTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNwotICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7Ci0jZWxzZQotCQkJICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgIH0KLSNlbmRpZiAvLyBJV0VWR0VOSUUgLy8KLQl9Ci0KLQlkYXRhLT5sZW5ndGggPSBjdXJyZW50X2V2IC0gZXh0cmE7Ci0gICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IgLCgiPT09PnJ0X2lvY3RsX2dpd3NjYW4uICVkKCVkKSBCU1MgcmV0dXJuZWQsIGRhdGEtPmxlbmd0aCA9ICVkXG4iLGkgLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOciwgZGF0YS0+bGVuZ3RoKSk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotaW50IHJ0X2lvY3RsX3Npd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKQotewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCi0JLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLSAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgewotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLQlyZXR1cm4gLUVORVRET1dOOwotICAgIH0KLQotCWlmIChkYXRhLT5mbGFncykKLQl7Ci0JCVBTVFJJTkcJcFNzaWRTdHJpbmcgPSBOVUxMOwotCi0JCS8vIEluY2x1ZGVzIG51bGwgY2hhcmFjdGVyLgotCQlpZiAoZGF0YS0+bGVuZ3RoID4gKElXX0VTU0lEX01BWF9TSVpFICsgMSkpCi0JCQlyZXR1cm4gLUUyQklHOwotCi0JCXBTc2lkU3RyaW5nID0ga21hbGxvYyhNQVhfTEVOX09GX1NTSUQrMSwgTUVNX0FMTE9DX0ZMQUcpOwotCQlpZiAocFNzaWRTdHJpbmcpCi0gICAgICAgIHsKLQkJCU5kaXNaZXJvTWVtb3J5KHBTc2lkU3RyaW5nLCBNQVhfTEVOX09GX1NTSUQrMSk7Ci0JCQlOZGlzTW92ZU1lbW9yeShwU3NpZFN0cmluZywgZXNzaWQsIGRhdGEtPmxlbmd0aCk7Ci0JCQlpZiAoU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgcFNzaWRTdHJpbmcpID09IEZBTFNFKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JZWxzZQotICAgIHsKLQkJLy8gQU5ZIHNzaWQKLQkJaWYgKFNldF9TU0lEX1Byb2MocEFkYXB0ZXIsICIiKSA9PSBGQUxTRSkKLQkJCXJldHVybiAtRUlOVkFMOwotICAgIH0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHJ0X2lvY3RsX2dpd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKQotewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCi0JaWYgKHBBZGFwdGVyID09IE5VTEwpCi0JewotCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOwotCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KLQkJcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLQlkYXRhLT5mbGFncyA9IDE7Ci0gICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQotICAgIHsKLSAgICAgICAgZGF0YS0+bGVuZ3RoICA9IDA7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIk1lZGlhU3RhdGUgaXMgY29ubmVjdGVkXG4iKSk7Ci0JCWRhdGEtPmxlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKLQkJbWVtY3B5KGVzc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbik7Ci0JfQotCWVsc2UKLQl7Ly90aGUgQU5ZIHNzaWQgd2FzIHNwZWNpZmllZAotCQlkYXRhLT5sZW5ndGggID0gMDsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiTWVkaWFTdGF0ZSBpcyBub3QgY29ubmVjdGVkLCBlc3NcbiIpKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotfQotCi1pbnQgcnRfaW9jdGxfc2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0KLSAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKLSAgICB9Ci0KLQlpZiAoZGF0YS0+bGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWVtc2V0KHBBZGFwdGVyLT5uaWNrbmFtZSwgMCwgSVdfRVNTSURfTUFYX1NJWkUgKyAxKTsKLQltZW1jcHkocEFkYXB0ZXItPm5pY2tuYW1lLCBuaWNrbmFtZSwgZGF0YS0+bGVuZ3RoKTsKLQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBydF9pb2N0bF9naXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotCWlmIChwQWRhcHRlciA9PSBOVUxMKQotCXsKLQkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKLQkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCi0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JaWYgKGRhdGEtPmxlbmd0aCA+IHN0cmxlbigoUFNUUklORykgcEFkYXB0ZXItPm5pY2tuYW1lKSArIDEpCi0JCWRhdGEtPmxlbmd0aCA9IHN0cmxlbigoUFNUUklORykgcEFkYXB0ZXItPm5pY2tuYW1lKSArIDE7Ci0JaWYgKGRhdGEtPmxlbmd0aCA+IDApIHsKLQkJbWVtY3B5KG5pY2tuYW1lLCBwQWRhcHRlci0+bmlja25hbWUsIGRhdGEtPmxlbmd0aC0xKTsKLQkJbmlja25hbWVbZGF0YS0+bGVuZ3RoLTFdID0gJ1wwJzsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBydF9pb2N0bF9zaXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0JdTE2IHZhbDsKLQotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0gICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgICAgICByZXR1cm4gLUVORVRET1dOOwotICAgIH0KLQotCWlmIChydHMtPmRpc2FibGVkKQotCQl2YWwgPSBNQVhfUlRTX1RIUkVTSE9MRDsKLQllbHNlIGlmIChydHMtPnZhbHVlIDwgMCB8fCBydHMtPnZhbHVlID4gTUFYX1JUU19USFJFU0hPTEQpCi0JCXJldHVybiAtRUlOVkFMOwotCWVsc2UgaWYgKHJ0cy0+dmFsdWUgPT0gMCkKLQkgICAgdmFsID0gTUFYX1JUU19USFJFU0hPTEQ7Ci0JZWxzZQotCQl2YWwgPSBydHMtPnZhbHVlOwotCi0JaWYgKHZhbCAhPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCkKLQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSB2YWw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHJ0X2lvY3RsX2dpd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotCWlmIChwQWRhcHRlciA9PSBOVUxMKQotCXsKLQkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKLQkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCi0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JcnRzLT52YWx1ZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkOwotCXJ0cy0+ZGlzYWJsZWQgPSAocnRzLT52YWx1ZSA9PSBNQVhfUlRTX1RIUkVTSE9MRCk7Ci0JcnRzLT5maXhlZCA9IDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHJ0X2lvY3RsX3Npd2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQotewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCXUxNiB2YWw7Ci0KLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLQkJcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLQlpZiAoZnJhZy0+ZGlzYWJsZWQpCi0JCXZhbCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKLQllbHNlIGlmIChmcmFnLT52YWx1ZSA+PSBNSU5fRlJBR19USFJFU0hPTEQgfHwgZnJhZy0+dmFsdWUgPD0gTUFYX0ZSQUdfVEhSRVNIT0xEKQotICAgICAgICB2YWwgPSBfX2NwdV90b19sZTE2KGZyYWctPnZhbHVlICYgfjB4MSk7IC8qIGV2ZW4gbnVtYmVycyBvbmx5ICovCi0JZWxzZSBpZiAoZnJhZy0+dmFsdWUgPT0gMCkKLQkgICAgdmFsID0gTUFYX0ZSQUdfVEhSRVNIT0xEOwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gdmFsOwotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfZ2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCXN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0KLQlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKLQl7Ci0JCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7Ci0JCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotCWZyYWctPnZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZDsKLQlmcmFnLT5kaXNhYmxlZCA9IChmcmFnLT52YWx1ZSA9PSBNQVhfRlJBR19USFJFU0hPTEQpOwotCWZyYWctPmZpeGVkID0gMTsKLQotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIE1BWF9XRVBfS0VZX1NJWkUgMTMKLSNkZWZpbmUgTUlOX1dFUF9LRVlfU0laRSA1Ci1pbnQgcnRfaW9jdGxfc2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotCWlmICgoZXJxLT5sZW5ndGggPT0gMCkgJiYKLSAgICAgICAgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpKQotCXsKLQkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotICAgICAgICBnb3RvIGRvbmU7Ci0JfQotCWVsc2UgaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCB8fCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX09QRU4pCi0JewotCSAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7Ci0JCXBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwotCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7Ci0JCXBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwotCQlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKQotCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKLQllbHNlCi0JCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQl9Ci0KLSAgICBpZiAoZXJxLT5sZW5ndGggPiAwKQotCXsKLQkJaW50IGtleUlkeCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7Ci0JCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KLQkJaWYgKGVycS0+bGVuZ3RoID4gTUFYX1dFUF9LRVlfU0laRSkKLQkJewotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJLyogQ2hlY2sga2V5IGluZGV4ICovCi0JCWlmICgoa2V5SWR4IDwgMCkgfHwgKGtleUlkeCA+PSBOUl9XRVBfS0VZUykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6V3Jvbmcga2V5SWR4PSVkISBVc2luZyBkZWZhdWx0IGtleSBpbnN0ZWFkICglZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5SWR4LCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOwotCi0gICAgICAgICAgICAvL1VzaW5nIGRlZmF1bHQga2V5Ci0JCQlrZXlJZHggPSBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKLSAgICAgICAgfQotCQllbHNlCi0JCQlwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGtleUlkeDsKLQotICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCAgMTYpOwotCi0JCWlmIChlcnEtPmxlbmd0aCA9PSBNQVhfV0VQX0tFWV9TSVpFKQotICAgICAgICB7Ci0JCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCQl9Ci0JCWVsc2UgaWYgKGVycS0+bGVuZ3RoID09IE1JTl9XRVBfS0VZX1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNSU5fV0VQX0tFWV9TSVpFOwotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQkJfQotCQllbHNlCi0JCQkvKiBEaXNhYmxlIHRoZSBrZXkgKi8KLQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSAwOwotCi0JCS8qIENoZWNrIGlmIHRoZSBrZXkgaXMgbm90IG1hcmtlZCBhcyBpbnZhbGlkICovCi0JCWlmKCEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkpCi0JCXsKLQkJCS8qIENvcHkgdGhlIGtleSBpbiB0aGUgZHJpdmVyICovCi0JCQlOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHRyYSwgZXJxLT5sZW5ndGgpOwotICAgICAgICB9Ci0JfQotICAgIGVsc2UKLQkJCXsKLQkJLyogRG8gd2Ugd2FudCB0byBqdXN0IHNldCB0aGUgdHJhbnNtaXQga2V5IGluZGV4ID8gKi8KLQkJaW50IGluZGV4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKLQkJaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPCA0KSkKLSAgICAgICAgewotCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBpbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZWxzZQotCQkJLyogRG9uJ3QgY29tcGxhaW4gaWYgb25seSBjaGFuZ2UgdGhlIG1vZGUgKi8KLQkJaWYgKCEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotZG9uZToKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OmVycS0+ZmxhZ3M9JXhcbiIsZXJxLT5mbGFncykpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6QXV0aE1vZGU9JXhcbiIscEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6RGVmYXVsdEtleUlkPSV4LCBLZXlMZW4gPSAlZFxuIixwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCAsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbikpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6V2VwU3RhdHVzPSV4XG4iLHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludAotcnRfaW9jdGxfZ2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXkpCi17Ci0JaW50IGtpZDsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotCWlmIChwQWRhcHRlciA9PSBOVUxMKQotCXsKLQkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKLQkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCi0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLQlraWQgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9naXdlbmNvZGUgJWRcbiIsIGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpKTsKLQotCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JewotCQllcnEtPmxlbmd0aCA9IDA7Ci0JCWVycS0+ZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7Ci0JfQotCWVsc2UgaWYgKChraWQgPiAwKSAmJiAoa2lkIDw9NCkpCi0JewotCQkvLyBjb3B5IHdlcCBrZXkKLQkJZXJxLT5mbGFncyA9IGtpZCA7CQkJLyogTkI6IGJhc2UgMSAqLwotCQlpZiAoZXJxLT5sZW5ndGggPiBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXlMZW4pCi0JCQllcnEtPmxlbmd0aCA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleUxlbjsKLQkJbWVtY3B5KGtleSwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5LCBlcnEtPmxlbmd0aCk7Ci0JCS8vaWYgKChraWQgPT0gcEFkYXB0ZXItPlBvcnRDZmcuRGVmYXVsdEtleUlkKSkKLQkJLy9lcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwkvKiBYWFggKi8KLQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQotCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLwotCQllbHNlCi0JCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCi0KLQl9Ci0JZWxzZSBpZiAoa2lkID09IDApCi0JewotCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCi0JCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCi0JCWVsc2UKLQkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KLQkJZXJxLT5sZW5ndGggPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW47Ci0JCW1lbWNweShrZXksIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgZXJxLT5sZW5ndGgpOwotCQkvLyBjb3B5IGRlZmF1bHQga2V5IElECi0JCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKLQkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KLQkJZWxzZQotCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLwotCQllcnEtPmZsYWdzID0gcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgKyAxOwkJCS8qIE5COiBiYXNlIDEgKi8KLQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsJLyogWFhYICovCi0JfQotCi0JcmV0dXJuIDA7Ci0KLX0KLQotc3RhdGljIGludAotcnRfaW9jdGxfc2V0cGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSB2b2lkICp3LCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyOwotCVBPU19DT09LSUUgcE9iajsKLQlQU1RSSU5HIHRoaXNfY2hhciA9IGV4dHJhOwotCVBTVFJJTkcgdmFsdWU7Ci0JaW50ICBTdGF0dXM9MDsKLQotCXBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKLQl7Ci0JCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7Ci0JCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkYXB0ZXItPk9TX0Nvb2tpZTsKLQl7Ci0JCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKLSAgICAgICAgcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKLQl9Ci0KLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLQkJCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JaWYgKCEqdGhpc19jaGFyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCi0JICAgICp2YWx1ZSsrID0gMDsKLQotCWlmICghdmFsdWUgJiYgKHN0cmNtcCh0aGlzX2NoYXIsICJTaXRlU3VydmV5IikgIT0gMCkpCi0JICAgIHJldHVybiAtRUlOVkFMOwotCWVsc2UKLQkJZ290byBTRVRfUFJPQzsKLQotCS8vIHJlamVjdCBzZXR0aW5nIG5vdGhpbmcgYmVzaWRlcyBBTlkgc3NpZChzc2lkTGVuPTApCi0gICAgaWYgKCEqdmFsdWUgJiYgKHN0cmNtcCh0aGlzX2NoYXIsICJTU0lEIikgIT0gMCkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotCi1TRVRfUFJPQzoKLQlmb3IgKFBSVE1QX1BSSVZBVEVfU0VUX1BST0MgPSBSVE1QX1BSSVZBVEVfU1VQUE9SVF9QUk9DOyBQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lOyBQUlRNUF9QUklWQVRFX1NFVF9QUk9DKyspCi0JewotCSAgICBpZiAoc3RyY21wKHRoaXNfY2hhciwgUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgICAgaWYoIVBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPnNldF9wcm9jKHBBZGFwdGVyLCB2YWx1ZSkpCi0JICAgICAgICB7CS8vRkFMU0U6U2V0IHByaXZhdGUgZmFpbGVkIHRoZW4gcmV0dXJuIEludmFsaWQgYXJndW1lbnQKLQkJCSAgICBTdGF0dXMgPSAtRUlOVkFMOwotCSAgICAgICAgfQotCQkgICAgYnJlYWs7CS8vRXhpdCBmb3IgbG9vcC4KLQkgICAgfQotCX0KLQotCWlmKFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWUgPT0gTlVMTCkKLQl7ICAvL05vdCBmb3VuZCBhcmd1bWVudAotCSAgICBTdGF0dXMgPSAtRUlOVkFMOwotCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfc2V0cGFyYW06OiAoaXdwcml2KSBOb3QgU3VwcG9ydCBTZXQgQ29tbWFuZCBbJXM9JXNdXG4iLCB0aGlzX2NoYXIsIHZhbHVlKSk7Ci0JfQotCi0gICAgcmV0dXJuIFN0YXR1czsKLX0KLQotCi1zdGF0aWMgaW50Ci1ydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKLXsKLQlJTlQJCQkJU3RhdHVzID0gMDsKLSAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotICAgIGlmIChleHRyYSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgd3JxLT5sZW5ndGggPSAwOwotICAgICAgICByZXR1cm4gLUVJTzsKLSAgICB9Ci0KLSAgICBtZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKLSAgICBzcHJpbnRmKGV4dHJhLCAiXG5cbiIpOwotCi0jaWZkZWYgUkFMSU5LX0FURQotCWlmIChBVEVfT04ocEFkKSkKLQl7Ci0JICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPmF0ZS5UeERvbmVDb3VudCk7Ci0JICAgIC8vc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+YXRlLlR4RG9uZUNvdW50KTsKLQl9Ci0JZWxzZQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQl7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCk7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCAtIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KTsKLQl9Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyBhZnRlciByZXRyeSAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpOwotICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IGZhaWwgdG8gUmN2IEFDSyBhZnRlciByZXRyeSAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC5RdWFkUGFydCk7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIFN1Y2Nlc3MgUmN2IENUUyAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydCk7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIEZhaWwgUmN2IENUUyAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydCk7Ci0KLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0KTsKLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCB3aXRoIENSQyAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC5RdWFkUGFydCk7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggZHJvcCBkdWUgdG8gb3V0IG9mIHJlc291cmNlICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIpOwotICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IGR1cGxpY2F0ZSBmcmFtZSAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0KTsKLQotICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIkZhbHNlIENDQSAob25lIHNlY29uZCkgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250KTsKLQotI2lmZGVmIFJBTElOS19BVEUKLQlpZiAoQVRFX09OKHBBZCkpCi0JewotCQlpZiAocEFkLT5hdGUuUnhBbnRlbm5hU2VsID09IDApCi0JCXsKLQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1BICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKLQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQiAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTEgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7Ci0JCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUMgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG5cbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTIgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7Ci0JCX0KLQl9Ci0JZWxzZQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQl7Ci0Jc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1BICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOwotICAgICAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUIgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7Ci0gICAgICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQyAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcblxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOwotCX0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiV3BhU3VwcGxpY2FudFVQICAgICAgICAgICAgICAgICA9ICVkXG5cbiIsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCk7Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0KLQotICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzLCB3cnEtPmxlbmd0aCA9ICVkXG4iLCB3cnEtPmxlbmd0aCkpOwotCi0gICAgcmV0dXJuIFN0YXR1czsKLX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotdm9pZAlnZXRCYUluZm8oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCXBPdXRCdWYpCi17Ci0JSU5UIGksIGo7Ci0JQkFfT1JJX0VOVFJZICpwT3JpQkFFbnRyeTsKLQlCQV9SRUNfRU5UUlkgKnBSZWNCQUVudHJ5OwotCi0JZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQl7Ci0JCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07Ci0JCWlmICgoKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCi0JCQl8fCAocEVudHJ5LT5WYWxpZEFzV0RTKSB8fCAocEVudHJ5LT5WYWxpZEFzTWVzaCkpCi0JCXsKLQkJCXNwcmludGYocE91dEJ1ZiwgIiVzXG4lMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAoQWlkID0gJWQpIChBUCkgLVxuIiwKLSAgICAgICAgICAgICAgICBwT3V0QnVmLAotCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sCi0JCQkJcEVudHJ5LT5BZGRyWzNdLCBwRW50cnktPkFkZHJbNF0sIHBFbnRyeS0+QWRkcls1XSwgcEVudHJ5LT5BaWQpOwotCi0JCQlzcHJpbnRmKHBPdXRCdWYsICIlc1tSZWNpcGllbnRdXG4iLCBwT3V0QnVmKTsKLQkJCWZvciAoaj0wOyBqIDwgTlVNX09GX1RJRDsgaisrKQotCQkJewotCQkJCWlmIChwRW50cnktPkJBUmVjV2NpZEFycmF5W2pdICE9IDApCi0JCQkJewotCQkJCQlwUmVjQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W3BFbnRyeS0+QkFSZWNXY2lkQXJyYXlbal1dOwotCQkJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1RJRD0lZCwgQkFXaW5TaXplPSVkLCBMYXN0SW5kU2VxPSVkLCBSZW9yZGVyaW5nUGt0cz0lZFxuIiwgcE91dEJ1ZiwgaiwgcFJlY0JBRW50cnktPkJBV2luU2l6ZSwgcFJlY0JBRW50cnktPkxhc3RJbmRTZXEsIHBSZWNCQUVudHJ5LT5saXN0LnFsZW4pOwotCQkJCX0KLQkJCX0KLQkJCXNwcmludGYocE91dEJ1ZiwgIiVzXG4iLCBwT3V0QnVmKTsKLQotCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNbT3JpZ2luYXRvcl1cbiIsIHBPdXRCdWYpOwotCQkJZm9yIChqPTA7IGogPCBOVU1fT0ZfVElEOyBqKyspCi0JCQl7Ci0JCQkJaWYgKHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbal0gIT0gMCkKLQkJCQl7Ci0JCQkJCXBPcmlCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtqXV07Ci0JCQkJCXNwcmludGYocE91dEJ1ZiwgIiVzVElEPSVkLCBCQVdpblNpemU9JWQsIFN0YXJ0U2VxPSVkLCBDdXJUeFNlcT0lZFxuIiwgcE91dEJ1ZiwgaiwgcE9yaUJBRW50cnktPkJBV2luU2l6ZSwgcE9yaUJBRW50cnktPlNlcXVlbmNlLCBwRW50cnktPlR4U2VxW2pdKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuXG4iLCBwT3V0QnVmKTsKLQkJfQotICAgICAgICBpZiAoc3RybGVuKHBPdXRCdWYpID4gKElXX1BSSVZfU0laRV9NQVNLIC0gMzApKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCX0KLQotCXJldHVybjsKLX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotc3RhdGljIGludAotcnRfcHJpdmF0ZV9zaG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCXN0cnVjdCBpd19wb2ludCAqd3JxLCBQU1RSSU5HIGV4dHJhKQotewotCUlOVAkJCQlTdGF0dXMgPSAwOwotCVBSVE1QX0FEQVBURVIgICBwQWQ7Ci0JUE9TX0NPT0tJRQkJcE9iajsKLQl1MzIgICAgICAgICAgICAgc3ViY21kID0gd3JxLT5mbGFnczsKLQotCXBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0JaWYgKHBBZCA9PSBOVUxMKQotCXsKLQkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKLQkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCi0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQlpZiAoZXh0cmEgPT0gTlVMTCkKLQl7Ci0JCXdycS0+bGVuZ3RoID0gMDsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCW1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOwotCi0JewotCQlwT2JqLT5pb2N0bF9pZl90eXBlID0gSU5UX01BSU47Ci0JCXBPYmotPmlvY3RsX2lmID0gTUFJTl9NQlNTSUQ7Ci0JfQotCi0gICAgc3dpdGNoKHN1YmNtZCkKLSAgICB7Ci0KLSAgICAgICAgY2FzZSBTSE9XX0NPTk5fU1RBVFVTOgotICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkKSkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSAgICAgICAgICAgICAgICBpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCi0gICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVykKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIk1vbml0b3IgTW9kZShDZW50cmFsQ2hhbm5lbCAlZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJNb25pdG9yIE1vZGUoQ2hhbm5lbCAlZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKLQkJewotCQkgICAgaWYgKElORlJBX09OKHBBZCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkNvbm5lY3RlZChBUDogJXNbJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhdKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbNV0pOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiU3NpZD0lcyAsU3NpZGxlbiA9ICVkXG4iLHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pKTsKLQkJfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBREhPQ19PTihwQWQpKQotICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkNvbm5lY3RlZFxuIik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCSAgICBzcHJpbnRmKGV4dHJhLCAiRGlzY29ubmVjdGVkXG4iKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIkNvbm5TdGF0dXMgaXMgbm90IGNvbm5lY3RlZFxuIikpOwotCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNIT1dfRFJWSUVSX1ZFUklPTjoKLSAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJEcml2ZXIgdmVyc2lvbi0lcywgJXMgJXNcbiIsIFNUQV9EUklWRVJfVkVSU0lPTiwgX19EQVRFX18sIF9fVElNRV9fICk7Ci0gICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKLSAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgICAgICBjYXNlIFNIT1dfQkFfSU5GTzoKLSAgICAgICAgICAgIGdldEJhSW5mbyhwQWQsIGV4dHJhKTsKLSAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCWNhc2UgU0hPV19ERVNDX0lORk86Ci0JCQl7Ci0JCQkJU2hvd19EZXNjSW5mb19Qcm9jKHBBZCwgTlVMTCk7Ci0JCQkJd3JxLT5sZW5ndGggPSAwOyAvLyAxOiBzaXplIG9mICdcMCcKLQkJCX0KLQkJCWJyZWFrOwotICAgICAgICBjYXNlIFJBSU9fT0ZGOgotICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQotCQkgICAgICAgIHsKLQkJICAgICAgICAgICAgUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkKTsKLQkJICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOwotCQkgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvID0gRkFMU0U7Ci0gICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKLSAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT2ZmKHBBZCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgotCQkJCQlwQWQtPkV4dHJhSW5mbyA9IFNXX1JBRElPX09GRjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiUmFkaW8gT2ZmXG4iKTsKLSAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkFJT19PTjoKLSAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvID0gVFJVRTsKLSAgICAgICAgICAgIC8vaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJSYWRpbyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7Ci0gICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT24ocEFkKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCi0JCQkJCXBBZC0+RXh0cmFJbmZvID0gRVhUUkFfSU5GT19DTEVBUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiUmFkaW8gT25cbiIpOwotICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCi0gICAgICAgICAgICBicmVhazsKLQotCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCWNhc2UgU0hPV19ETFNfRU5UUllfSU5GTzoKLQkJCXsKLQkJCQlTZXRfRGxzRW50cnlJbmZvX0Rpc3BsYXlfUHJvYyhwQWQsIE5VTEwpOwotCQkJCXdycS0+bGVuZ3RoID0gMDsgLy8gMTogc2l6ZSBvZiAnXDAnCi0JCQl9Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotCQljYXNlIFNIT1dfQ0ZHX1ZBTFVFOgotCQkJewotCQkJCVN0YXR1cyA9IFJUTVBTaG93Q2ZnVmFsdWUocEFkLCAoUFNUUklORykgd3JxLT5wb2ludGVyLCBleHRyYSk7Ci0JCQkJaWYgKFN0YXR1cyA9PSAwKQotCQkJCQl3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFNIT1dfQURIT0NfRU5UUllfSU5GTzoKLQkJCVNob3dfQWRob2NfTWFjVGFibGVfUHJvYyhwQWQsIGV4dHJhKTsKLQkJCXdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotCQkJYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAtIHVua25vdyBzdWJjbWQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdWJjbWQpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM7Ci19Ci0KLSNpZmRlZiBTSU9DU0lXTUxNRQotaW50IHJ0X2lvY3RsX3Npd21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAotCQkJICAgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiAgIHBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0Jc3RydWN0IGl3X21sbWUgKnBNbG1lID0gKHN0cnVjdCBpd19tbG1lICopd3JxdS0+ZGF0YS5wb2ludGVyOwotCU1MTUVfUVVFVUVfRUxFTQkJCQlNc2dFbGVtOwotCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVAlEaXNBc3NvY1JlcTsKLQlNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICAgICAgRGVBdXRoUmVxOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXNcbiIsIF9fRlVOQ1RJT05fXykpOwotCi0JaWYgKHBNbG1lID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3dpdGNoKHBNbG1lLT5jbWQpCi0JewotI2lmZGVmIElXX01MTUVfREVBVVRICi0JCWNhc2UgSVdfTUxNRV9ERUFVVEg6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfREVBVVRIXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJCUNPUFlfTUFDX0FERFIoRGVBdXRoUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCURlQXV0aFJlcS5SZWFzb24gPSBwTWxtZS0+cmVhc29uX2NvZGU7Ci0JCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKTsKLQkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGVBdXRoUmVxLCBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCkpOwotCQkJTWxtZURlYXV0aFJlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKLQkJCWlmIChJTkZSQV9PTihwQWQpKQotCQkJewotCQkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOwotCQkJICAgIHBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQkJCX0KLQkJCWJyZWFrOwotI2VuZGlmIC8vIElXX01MTUVfREVBVVRIIC8vCi0jaWZkZWYgSVdfTUxNRV9ESVNBU1NPQwotCQljYXNlIElXX01MTUVfRElTQVNTT0M6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfRElTQVNTT0NcbiIsIF9fRlVOQ1RJT05fXykpOwotCQkJQ09QWV9NQUNfQUREUihEaXNBc3NvY1JlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQlEaXNBc3NvY1JlcS5SZWFzb24gPSAgcE1sbWUtPnJlYXNvbl9jb2RlOwotCi0JCQlNc2dFbGVtLk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOwotCQkJTXNnRWxlbS5Nc2dUeXBlID0gTVQyX01MTUVfRElTQVNTT0NfUkVROwotCQkJTXNnRWxlbS5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKTsKLQkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGlzQXNzb2NSZXEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKTsKLQotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7Ci0JCQlNbG1lRGlzYXNzb2NSZXFBY3Rpb24ocEFkLCAmTXNnRWxlbSk7Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBJV19NTE1FX0RJU0FTU09DIC8vCi0JCWRlZmF1bHQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIFVua25vdyBDb21tYW5kXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotI2VuZGlmIC8vIFNJT0NTSVdNTE1FIC8vCi0KLSNpZiBXSVJFTEVTU19FWFQgPiAxNwotaW50IHJ0X2lvY3RsX3Npd2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOwotCi0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0Jc3dpdGNoIChwYXJhbS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7Ci0JY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgotICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOwotCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQotCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTIpCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7Ci0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0JY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKLSAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfTk9ORSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQNDAgfHwKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVAxMDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfVEtJUCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9DQ01QKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0JY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKLSAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfTk9ORSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDQwIHx8Ci0gICAgICAgICAgICAgICAgICAgICBwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQMTA0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9US0lQKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX0NDTVApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfR1JPVVAgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7Ci0gICAgICAgICAgICBicmVhazsKLQljYXNlIElXX0FVVEhfS0VZX01HTVQ6Ci0gICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfS0VZX01HTVRfODAyXzFYKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgLy8gV0VQIDF4Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gVFJVRTsKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0tFWV9NR01UIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0JY2FzZSBJV19BVVRIX1JYX1VORU5DUllQVEVEX0VBUE9MOgotICAgICAgICAgICAgYnJlYWs7Ci0JY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKLSAgICAgICAgICAgIC8qaWYgKHBhcmFtLT52YWx1ZSA9PSAwKQotCQkJewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQkJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0gICAgICAgICAgICB9Ki8KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKLQkJYnJlYWs7Ci0JY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6Ci0gICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlICE9IDApCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKLQkJCWVsc2UKLQkJCXsKLSAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLQkJCX0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOwotCQlicmVhazsKLQljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6Ci0JCQlpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSkKLSAgICAgICAgICAgIHsKLQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOwotCQkJfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pCi0gICAgICAgICAgICB7Ci0JCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0JCQl9Ci0gICAgICAgICAgICBlbHNlCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF84MDIxMV9BVVRIX0FMRyAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKLQkJCWJyZWFrOwotCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX0VOQUJMRUQgLSBEcml2ZXIgc3VwcG9ydHMgV1BBIShwYXJhbS0+dmFsdWUgPSAlZClcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfZ2l3YXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOwotCi0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JcmV0dXJuIC1FTkVURE9XTjsKLSAgICB9Ci0KLQlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKLQljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKLSAgICAgICAgcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkgPyAwIDogMTsKLQkJYnJlYWs7Ci0KLQljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6Ci0gICAgICAgIHBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgPyBJV19BVVRIX0FMR19TSEFSRURfS0VZIDogSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07Ci0JCWJyZWFrOwotCi0JY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgotCQlwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpID8gMSA6IDA7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCX0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9naXdhdXRoOjpwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIHBhcmFtLT52YWx1ZSkpOwotCXJldHVybiAwOwotfQotCi12b2lkIGZuU2V0Q2lwaGVyS2V5KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIElOVCAgICAgICAgICAgICBrZXlJZHgsCi0gICAgSU4gIFVDSEFSICAgICAgICAgICBDaXBoZXJBbGcsCi0gICAgSU4gIEJPT0xFQU4gICAgICAgICBiR1RLLAotICAgIElOICBzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0KQotewotICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0sIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0gICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IExFTl9US0lQX0VLOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LCBMRU5fVEtJUF9FSyk7Ci0gICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLCBleHQtPmtleSArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5SeE1pYywgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKLSAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCi0gICAgLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKLQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCi0JCQkJCQkgIEJTUzAsCi0JCQkJCQkgIGtleUlkeCwKLQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKLQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwKLQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLAotCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMpOwotCi0gICAgaWYgKGJHVEspCi0gICAgICAgIC8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQotCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsCi0JCQkJCQkJICBCU1MwLAotCQkJCQkJCSAga2V5SWR4LAotCQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKLQkJCQkJCQkgIE5VTEwpOwotICAgIGVsc2UKLSAgICAgICAgLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0JUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKLQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJICBrZXlJZHgsCi0JCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAotCQkJCQkJCSAgJnBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSk7Ci19Ci0KLWludCBydF9pb2N0bF9zaXdlbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAotCQkJICAgY2hhciAqZXh0cmEpCi0JCQl7Ci0gICAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQlzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOwotCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKLSAgICBpbnQga2V5SWR4LCBhbGcgPSBleHQtPmFsZzsKLQotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0gICAgaWYgKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkKLQl7Ci0gICAgICAgIGtleUlkeCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKLSAgICAgICAgLy8gc2V0IEJTU0lEIHdjaWQgZW50cnkgb2YgdGhlIFBhaXItd2lzZSBLZXkgdGFibGUgYXMgbm8tc2VjdXJpdHkgbW9kZQotCSAgICBBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWRhcHRlciwgQlNTMCwgQlNTSURfV0NJRCk7Ci0gICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSAwOwotCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgMCwgKFVDSEFSKWtleUlkeCk7Ci0gICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0sIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpSZW1vdmUgYWxsIGtleXMhKGVuY29kaW5nLT5mbGFncyA9ICV4KVxuIiwgX19GVU5DVElPTl9fLCBlbmNvZGluZy0+ZmxhZ3MpKTsKLSAgICB9Ci0JCQkJCWVsc2UKLSAgICB7Ci0gICAgICAgIC8vIEdldCBLZXkgSW5kZXggYW5kIGNvbnZldCB0byBvdXIgb3duIGRlZmluZWQga2V5IGluZGV4Ci0Ja2V5SWR4ID0gKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOwotCWlmKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLSAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGtleUlkeDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpEZWZhdWx0S2V5SWQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChhbGcpIHsKLQkJY2FzZSBJV19FTkNPREVfQUxHX05PTkU6Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfTk9ORVxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJV19FTkNPREVfQUxHX1dFUDoKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19XRVAgLSBleHQtPmtleV9sZW4gPSAlZCwga2V5SWR4ID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgZXh0LT5rZXlfbGVuLCBrZXlJZHgpKTsKLQkJCWlmIChleHQtPmtleV9sZW4gPT0gTUFYX1dFUF9LRVlfU0laRSkKLSAgICAgICAgICAgICAgICB7Ci0JCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1BWF9XRVBfS0VZX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCQkJCX0KLQkJCWVsc2UgaWYgKGV4dC0+a2V5X2xlbiA9PSBNSU5fV0VQX0tFWV9TSVpFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1JTl9XRVBfS0VZX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0JCQl9Ci0JCQllbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotCi0gICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgIDE2KTsKLQkJCSAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHQtPmtleSwgZXh0LT5rZXlfbGVuKTsKLQotCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCB8fAotCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQpCi0JCQkJewotCQkJCQkvLyBTZXQgR3JvdXAga2V5IG1hdGVyaWFsIHRvIEFzaWMKLQkJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBrZXlJZHgsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIE5VTEwsIE5VTEwpOwotCQkJCQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQotCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBrZXlJZHgsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsIE5VTEwpOwotCQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLQkJCQkJLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKLQkJCQkJcEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotCQkJCX0KLQkJCWJyZWFrOwotICAgICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfVEtJUCAtIGtleUlkeCA9ICVkLCBleHQtPmtleV9sZW4gPSAlZFxuIiwgX19GVU5DVElPTl9fLCBrZXlJZHgsIGV4dC0+a2V5X2xlbikpOwotICAgICAgICAgICAgICAgIGlmIChleHQtPmtleV9sZW4gPT0gMzIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9US0lQLCBGQUxTRSwgZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCQl9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9US0lQLCBUUlVFLCBleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAotCQkgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwotCQkgICAgICAgIFNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOwotCQkgICAgICAgIHBBZGFwdGVyLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX0NDTVA6Ci0gICAgICAgICAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQotCQl7Ci0gICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9BRVMsIEZBTFNFLCBleHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQotCQkJLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0JCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLQkJCXBBZGFwdGVyLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9BRVMsIFRSVUUsIGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKLQkJICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQkJICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLQkJICAgICAgICBwQWRhcHRlci0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50Ci1ydF9pb2N0bF9naXdlbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCVBDSEFSIHBLZXkgPSBOVUxMOwotCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7Ci0Jc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOwotCWludCBpZHgsIG1heF9rZXlfbGVuOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9naXdlbmNvZGVleHRcbiIpKTsKLQotCW1heF9rZXlfbGVuID0gZW5jb2RpbmctPmxlbmd0aCAtIHNpemVvZigqZXh0KTsKLQlpZiAobWF4X2tleV9sZW4gPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKLQlpZiAoaWR4KQotCXsKLQkJaWYgKGlkeCA8IDEgfHwgaWR4ID4gNCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZHgtLTsKLQotCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAotCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKLQkJewotCQkJaWYgKGlkeCAhPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpCi0JCQl7Ci0JCQkJZXh0LT5rZXlfbGVuID0gMDsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JCWlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKLQotCWVuY29kaW5nLT5mbGFncyA9IGlkeCArIDE7Ci0JbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKTsKLQotCWV4dC0+a2V5X2xlbiA9IDA7Ci0Jc3dpdGNoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykgewotCQljYXNlIE5kaXM4MDJfMTFXRVBEaXNhYmxlZDoKLQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19OT05FOwotCQkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKLQkJCWJyZWFrOwotCQljYXNlIE5kaXM4MDJfMTFXRVBFbmFibGVkOgotCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1dFUDsKLQkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IG1heF9rZXlfbGVuKQotCQkJCXJldHVybiAtRTJCSUc7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJZXh0LT5rZXlfbGVuID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW47Ci0JCQkJcEtleSA9IChQQ0hBUikmKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5WzBdKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6Ci0JCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKLQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfVEtJUDsKLQkJCWVsc2UKLQkJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfQ0NNUDsKLQotCQkJaWYgKG1heF9rZXlfbGVuIDwgMzIpCi0JCQkJcmV0dXJuIC1FMkJJRzsKLQkJCWVsc2UKLQkJCXsKLQkJCQlleHQtPmtleV9sZW4gPSAzMjsKLQkJCQlwS2V5ID0gKFBDSEFSKSZwQWQtPlN0YUNmZy5QTUtbMF07Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChleHQtPmtleV9sZW4gJiYgcEtleSkKLQl7Ci0JCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKLQkJbWVtY3B5KGV4dC0+a2V5LCBwS2V5LCBleHQtPmtleV9sZW4pOwotCX0KLQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgU0lPQ1NJV0dFTklFCi1pbnQgcnRfaW9jdGxfc2l3Z2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiAgIHBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+IHJ0X2lvY3RsX3Npd2dlbmllXG4iKSk7Ci0jaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQlwQWQtPlN0YUNmZy5iUlNOX0lFX0Zyb21XcGFTdXBwbGljYW50ID0gRkFMU0U7Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPiBNQVhfTEVOX09GX1JTTklFIHx8Ci0JICAgICh3cnF1LT5kYXRhLmxlbmd0aCAmJiBleHRyYSA9PSBOVUxMKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAod3JxdS0+ZGF0YS5sZW5ndGgpCi0JewotCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gPSB3cnF1LT5kYXRhLmxlbmd0aDsKLQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgZXh0cmEsIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7Ci0jaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJcEFkLT5TdGFDZmcuYlJTTl9JRV9Gcm9tV3BhU3VwcGxpY2FudCA9IFRSVUU7Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gMDsKLQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgTUFYX0xFTl9PRl9SU05JRSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLy8gU0lPQ1NJV0dFTklFIC8vCi0KLWludCBydF9pb2N0bF9naXdnZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiAgIHBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0KLQlpZiAoKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9PSAwKSB8fAotCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQotCXsKLQkJd3JxdS0+ZGF0YS5sZW5ndGggPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0KLSNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmZGVmIFNJT0NTSVdHRU5JRQotCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQotCXsKLQlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pCi0JCXJldHVybiAtRTJCSUc7Ci0KLQl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKLQltZW1jcHkoZXh0cmEsICZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBTSU9DU0lXR0VOSUUgLy8KLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCXsKLQkJVUNIQVIgUlNOSWUgPSBJRV9XUEE7Ci0KLQkJaWYgKHdycXUtPmRhdGEubGVuZ3RoIDwgKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDIpKSAvLyBJRCwgTGVuCi0JCQlyZXR1cm4gLUUyQklHOwotCQl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDI7Ci0KLQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAotICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpKQotCQkJUlNOSWUgPSBJRV9SU047Ci0KLQkJZXh0cmFbMF0gPSAoY2hhcilSU05JZTsKLQkJZXh0cmFbMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47Ci0JCW1lbWNweShleHRyYSsyLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfc2l3cG1rc2Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAotCQkJICAgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiAgIHBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0Jc3RydWN0IGl3X3Bta3NhICpwUG1rc2EgPSAoc3RydWN0IGl3X3Bta3NhICopd3JxdS0+ZGF0YS5wb2ludGVyOwotCUlOVAlDYWNoZWRJZHggPSAwLCBpZHggPSAwOwotCi0JaWYgKHBQbWtzYSA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT4gcnRfaW9jdGxfc2l3cG1rc2FcbiIpKTsKLQlzd2l0Y2gocFBta3NhLT5jbWQpCi0JewotCQljYXNlIElXX1BNS1NBX0ZMVVNIOgotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUssIHNpemVvZihCU1NJRF9JTkZPKSpQTUtJRF9OTyk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX0ZMVVNIXG4iKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJV19QTUtTQV9SRU1PVkU6Ci0JCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKLQkJCXsKLQkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAotCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQotCQkgICAgICAgIHsKLQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pOwotCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lELCAxNik7Ci0JCQkJCWZvciAoaWR4ID0gQ2FjaGVkSWR4OyBpZHggPCAocEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0gLSAxKTsgaWR4KyspCi0JCQkJCXsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLkJTU0lEWzBdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4KzFdLkJTU0lEWzBdLCBNQUNfQUREUl9MRU4pOwotCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uUE1LSURbMF0sICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHgrMV0uUE1LSURbMF0sIDE2KTsKLQkJCQkJfQotCQkJCQlwQWQtPlN0YUNmZy5TYXZlZFBNS051bS0tOwotCQkJICAgICAgICBicmVhazsKLQkJICAgICAgICB9Ci0JICAgICAgICB9Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfUkVNT1ZFXG4iKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJV19QTUtTQV9BREQ6Ci0JCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKLQkJCXsKLQkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAotCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQotCQkJICAgICAgICBicmVhazsKLQkgICAgICAgIH0KLQotCSAgICAgICAgLy8gRm91bmQsIHJlcGxhY2UgaXQKLQkgICAgICAgIGlmIChDYWNoZWRJZHggPCBQTUtJRF9OTykKLQkgICAgICAgIHsKLQkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIFBNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7Ci0JCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSURbMF0sIHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRFswXSwgcFBta3NhLT5wbWtpZCwgMTYpOwotCQkgICAgICAgIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtKys7Ci0JICAgICAgICB9Ci0JICAgICAgICAvLyBOb3QgZm91bmQsIHJlcGxhY2UgdGhlIGxhc3Qgb25lCi0JICAgICAgICBlbHNlCi0JICAgICAgICB7Ci0JCSAgICAgICAgLy8gUmFuZG9tbHkgcmVwbGFjZSBvbmUKLQkJICAgICAgICBDYWNoZWRJZHggPSAocFBta3NhLT5ic3NpZC5zYV9kYXRhWzVdICUgUE1LSURfTk8pOwotCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKLQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRFswXSwgcFBta3NhLT5ic3NpZC5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lEWzBdLCBwUG1rc2EtPnBta2lkLCAxNik7Ci0JICAgICAgICB9Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfQUREXG4iKSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gVW5rbm93IENvbW1hbmQhIVxuIikpOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLy8gI2lmIFdJUkVMRVNTX0VYVCA+IDE3Ci0KLSNpZmRlZiBEQkcKLXN0YXRpYyBpbnQKLXJ0X3ByaXZhdGVfaW9jdGxfYmJwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKLQkJCXsKLQlQU1RSSU5HCQkJCXRoaXNfY2hhcjsKLQlQU1RSSU5HCQkJCXZhbHVlID0gTlVMTDsKLQlVQ0hBUgkJCQlyZWdCQlAgPSAwOwotLy8JQ0hBUgkJCQlhcmdbMjU1XT17MH07Ci0JVUlOVDMyCQkJCWJicElkOwotCVVJTlQzMgkJCQliYnBWYWx1ZTsKLQlCT09MRUFOCQkJCWJJc1ByaW50QWxsQkJQID0gRkFMU0U7Ci0JSU5UCQkJCQlTdGF0dXMgPSAwOwotICAgIFBSVE1QX0FEQVBURVIgICAgICAgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCi0KLQltZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKLQotCWlmICh3cnEtPmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KLQkJCQl7Ci0JCXNwcmludGYoZXh0cmEsICJcbiIpOwotCi0JCS8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCi0JCXRoaXNfY2hhciA9IHdycS0+cG9pbnRlcjsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgidGhpc19jaGFyPSVzXG4iLCB0aGlzX2NoYXIpKTsKLQkJaWYgKCEqdGhpc19jaGFyKQotCQkJZ290byBuZXh0OwotCi0JCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCi0JCQkqdmFsdWUrKyA9IDA7Ci0KLQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQotCQl7IC8vUmVhZAotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgidGhpc19jaGFyPSVzLCB2YWx1ZT0lc1xuIiwgdGhpc19jaGFyLCB2YWx1ZSkpOwotCQkJaWYgKHNzY2FuZih0aGlzX2NoYXIsICIlZCIsICYoYmJwSWQpKSA9PSAxKQotCQkJewotCQkJCWlmIChiYnBJZCA8PSBNQVhfQkJQX0lEKQotCQkJCXsKLSNpZmRlZiBSQUxJTktfQVRFCi0JCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQotCQkJCQl7Ci0JCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOwotCQkJCQl9Ci0JCQkJCWVsc2UKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0JCQkJCXsKLQkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7Ci0JCQkJCX0KLQkJCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUiUwMmRbMHglMDJYXTolMDJYXG4iLCBiYnBJZCwgYmJwSWQsIHJlZ0JCUCk7Ci0gICAgICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJtc2c9JXNcbiIsIGV4dHJhKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAotCQkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7Ci0JCQkJCWdvdG8gbmV4dDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7IC8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKLQkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7Ci0JCQkJZ290byBuZXh0OwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJeyAvL1dyaXRlCi0JCQlpZiAoKHNzY2FuZih0aGlzX2NoYXIsICIlZCIsICYoYmJwSWQpKSA9PSAxKSAmJiAoc3NjYW5mKHZhbHVlLCAiJXgiLCAmKGJicFZhbHVlKSkgPT0gMSkpCi0JCQl7Ci0JCQkJaWYgKGJicElkIDw9IE1BWF9CQlBfSUQpCi0JCQkJewotI2lmZGVmIFJBTElOS19BVEUKLQkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCi0JCQkJCXsKLQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsIGJicFZhbHVlKTsKLQkJCQkJCS8qIHJlYWQgaXQgYmFjayBmb3Igc2hvd2luZyAqLwotCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKLQkJCQkJfQotCQkJCQllbHNlCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCQkJCQl7Ci0JCQkJCSAgICBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgYmJwVmFsdWUpOwotCQkJCQkvKiByZWFkIGl0IGJhY2sgZm9yIHNob3dpbmcgKi8KLQkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7Ci0JCQl9Ci0JCQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlIlMDJkWzB4JTAyWF06JTAyWFxuIiwgYmJwSWQsIGJicElkLCByZWdCQlApOwotICAgICAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibXNnPSVzXG4iLCBleHRyYSkpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKLQkJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOwotCQkJCQlnb3RvIG5leHQ7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJeyAvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCi0JCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOwotCQkJCWdvdG8gbmV4dDsKLQkJCX0KLQkJfQotCQl9Ci0JZWxzZQotCQliSXNQcmludEFsbEJCUCA9IFRSVUU7Ci0KLW5leHQ6Ci0JaWYgKGJJc1ByaW50QWxsQkJQKQotCXsKLQkJbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7Ci0JCXNwcmludGYoZXh0cmEsICJcbiIpOwotCQlmb3IgKGJicElkID0gMDsgYmJwSWQgPD0gTUFYX0JCUF9JRDsgYmJwSWQrKykKLQkJewotCQkgICAgaWYgKHN0cmxlbihleHRyYSkgPj0gKElXX1BSSVZfU0laRV9NQVNLIC0gMjApKQotICAgICAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFJBTElOS19BVEUKLQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQotCQkJewotCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7Ci0JCQl9Ci0JCQllbHNlCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7Ci0JCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSJTAyZFsweCUwMlhdOiUwMlggICAgIiwgYmJwSWQsIGJicElkLCByZWdCQlApOwotCQkJaWYgKGJicElkJTUgPT0gNCkKLQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIiUwM2QgPSAlMDJYXG4iLCBiYnBJZCwgcmVnQkJQKTsgIC8vIGVkaXQgYnkgam9obmxpLCBjaGFuZ2UgZGlzcGxheSBmb3JtYXQKLQkJfQotCi0gICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPmxlbmd0aCA9ICVkXG4iLCB3cnEtPmxlbmd0aCkpOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PXJ0X3ByaXZhdGVfaW9jdGxfYmJwXG5cbiIpKTsKLQotICAgIHJldHVybiBTdGF0dXM7Ci19Ci0jZW5kaWYgLy8gREJHIC8vCi0KLWludCBydF9pb2N0bF9zaXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0gICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0gICAgVUlOVDMyICAgICAgICAgIHJhdGUgPSB3cnF1LT5iaXRyYXRlLnZhbHVlLCBmaXhlZCA9IHdycXUtPmJpdHJhdGUuZml4ZWQ7Ci0KLSAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjoocmF0ZSA9ICVkLCBmaXhlZCA9ICVkKVxuIiwgcmF0ZSwgZml4ZWQpKTsKLSAgICAvKiByYXRlID0gLTEgPT4gYXV0byByYXRlCi0gICAgICAgcmF0ZSA9IFgsIGZpeGVkID0gMSA9PiAoZml4ZWQgcmF0ZSBYKQotICAgICovCi0gICAgaWYgKHJhdGUgPT0gLTEpCi0gICAgewotICAgICAgICAvL0F1dG8gUmF0ZQotICAgICAgICBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOwotCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7Ci0JCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fAotCQkgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkKLSAgICAgICAgICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAtMSk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSAgICAgICAgICAgIFNldENvbW1vbkhUKHBBZCk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChmaXhlZCkKLSAgICAgICAgewotCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8Ci0gICAgICAgICAgICAgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkKLSAgICAgICAgICAgICAgICBSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgcmF0ZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSAgICAgICAgICAgICAgICBTZXRDb21tb25IVChwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6KEh0TWNzPSVkKVxuIixwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETzogcmF0ZSA9IFgsIGZpeGVkID0gMCA9PiAocmF0ZXMgPD0gWCkKLSAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfZ2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0gICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0gICAgaW50IHJhdGVfaW5kZXggPSAwLCByYXRlX2NvdW50ID0gMDsKLSAgICBIVFRSQU5TTUlUX1NFVFRJTkcgaHRfc2V0dGluZzsKLS8qIFJlbW92ZSB0byBnbG9iYWwgdmFyaWFibGUKLSAgICBfX3MzMiByYWxpbmtyYXRlW10gPQotCXsyLCAgNCwgICAxMSwgIDIyLCAvLyBDQ0sKLQkxMiwgMTgsICAgMjQsICAzNiwgNDgsIDcyLCA5NiwgMTA4LCAvLyBPRkRNCi0JMTMsIDI2LCAgIDM5LCAgNTIsICA3OCwgMTA0LCAxMTcsIDEzMCwgMjYsICA1MiwgIDc4LCAxMDQsIDE1NiwgMjA4LCAyMzQsIDI2MCwgLy8gMjBNSHosIDgwMG5zIEdJLCBNQ1M6IDAgfiAxNQotCTM5LCA3OCwgIDExNywgMTU2LCAyMzQsIDMxMiwgMzUxLCAzOTAsCQkJCQkJCQkJCSAgLy8gMjBNSHosIDgwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKLQkyNywgNTQsICAgODEsIDEwOCwgMTYyLCAyMTYsIDI0MywgMjcwLCA1NCwgMTA4LCAxNjIsIDIxNiwgMzI0LCA0MzIsIDQ4NiwgNTQwLCAvLyA0ME1IeiwgODAwbnMgR0ksIE1DUzogMCB+IDE1Ci0JODEsIDE2MiwgMjQzLCAzMjQsIDQ4NiwgNjQ4LCA3MjksIDgxMCwJCQkJCQkJCQkJICAvLyA0ME1IeiwgODAwbnMgR0ksIE1DUzogMTYgfiAyMwotCTE0LCAyOSwgICA0MywgIDU3LCAgODcsIDExNSwgMTMwLCAxNDQsIDI5LCA1OSwgICA4NywgMTE1LCAxNzMsIDIzMCwgMjYwLCAyODgsIC8vIDIwTUh6LCA0MDBucyBHSSwgTUNTOiAwIH4gMTUKLQk0MywgODcsICAxMzAsIDE3MywgMjYwLCAzMTcsIDM5MCwgNDMzLAkJCQkJCQkJCQkgIC8vIDIwTUh6LCA0MDBucyBHSSwgTUNTOiAxNiB+IDIzCi0JMzAsIDYwLCAgIDkwLCAxMjAsIDE4MCwgMjQwLCAyNzAsIDMwMCwgNjAsIDEyMCwgMTgwLCAyNDAsIDM2MCwgNDgwLCA1NDAsIDYwMCwgLy8gNDBNSHosIDQwMG5zIEdJLCBNQ1M6IDAgfiAxNQotCTkwLCAxODAsIDI3MCwgMzYwLCA1NDAsIDcyMCwgODEwLCA5MDB9OwkJCQkJCQkJCQkgIC8vIDQwTUh6LCA0MDBucyBHSSwgTUNTOiAxNiB+IDIzCi0qLwotCi0gICAgcmF0ZV9jb3VudCA9IHNpemVvZihyYWxpbmtyYXRlKS9zaXplb2YoX19zMzIpOwotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotICAgIGlmICgocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gRkFMU0UpICYmCi0gICAgICAgIChJTkZSQV9PTihwQWQpKSAmJgotICAgICAgICAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkpCi0gICAgICAgIGh0X3NldHRpbmcud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOwotICAgIGVsc2UKLSAgICAgICAgaHRfc2V0dGluZy53b3JkID0gcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZDsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKLSAgICB7Ci0vLwlyYXRlX2luZGV4ID0gMTIgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuQlcgKjE2KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5TaG9ydEdJICozMikgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuTUNTKTsKLQlyYXRlX2luZGV4ID0gMTIgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuQlcgKjI0KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5TaG9ydEdJICo0OCkgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuTUNTKTsKLSAgICB9Ci0gICAgZWxzZQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotICAgIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPT0gTU9ERV9PRkRNKQotCXJhdGVfaW5kZXggPSAoVUNIQVIpKGh0X3NldHRpbmcuZmllbGQuTUNTKSArIDQ7Ci0gICAgZWxzZSBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID09IE1PREVfQ0NLKQotCXJhdGVfaW5kZXggPSAoVUNIQVIpKGh0X3NldHRpbmcuZmllbGQuTUNTKTsKLQotICAgIGlmIChyYXRlX2luZGV4IDwgMCkKLSAgICAgICAgcmF0ZV9pbmRleCA9IDA7Ci0KLSAgICBpZiAocmF0ZV9pbmRleCA+IHJhdGVfY291bnQpCi0gICAgICAgIHJhdGVfaW5kZXggPSByYXRlX2NvdW50OwotCi0gICAgd3JxdS0+Yml0cmF0ZS52YWx1ZSA9IHJhbGlua3JhdGVbcmF0ZV9pbmRleF0gKiA1MDAwMDA7Ci0gICAgd3JxdS0+Yml0cmF0ZS5kaXNhYmxlZCA9IDA7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcnRfaGFuZGxlcltdID0KLXsKLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkgICAgICAgICAgICAvKiBTSU9DU0lXQ09NTUlUICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd25hbWUsCQkJLyogU0lPQ0dJV05BTUUgICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NTSVdOV0lEICAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkgICAgICAgICAgICAvKiBTSU9DR0lXTldJRCAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2ZyZXEsCQkgICAgLyogU0lPQ1NJV0ZSRVEgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdmcmVxLAkJICAgIC8qIFNJT0NHSVdGUkVRICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bW9kZSwJCSAgICAvKiBTSU9DU0lXTU9ERSAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd21vZGUsCQkgICAgLyogU0lPQ0dJV01PREUgICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTRU5TICAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU0VOUyAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXUkFOR0UgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3JhbmdlLAkJICAgIC8qIFNJT0NHSVdSQU5HRSAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdQUklWICAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCAvKiBrZXJuZWwgY29kZSAqLywgICAgLyogU0lPQ0dJV1BSSVYgICAqLwotCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1NUQVRTICAqLwotCShpd19oYW5kbGVyKSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzIC8qIGtlcm5lbCBjb2RlICovLCAgICAvKiBTSU9DR0lXU1RBVFMgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NQWSAgICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTUFkgICAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DU0lXVEhSU1BZICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ0dJV1RIUlNQWSAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdhcCwgICAgICAgICAgICAvKiBTSU9DU0lXQVAgICAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2FwLAkJICAgIC8qIFNJT0NHSVdBUCAgICAgKi8KLSNpZmRlZiBTSU9DU0lXTUxNRQotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtbG1lLAkgICAgICAgIC8qIFNJT0NTSVdNTE1FICAgKi8KLSNlbHNlCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1NJV01MTUUgKi8KLSNlbmRpZiAvLyBTSU9DU0lXTUxNRSAvLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9pd2FwbGlzdCwJCSAgICAvKiBTSU9DR0lXQVBMSVNUICovCi0jaWZkZWYgU0lPQ0dJV1NDQU4KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3c2NhbiwJCSAgICAvKiBTSU9DU0lXU0NBTiAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3NjYW4sCQkgICAgLyogU0lPQ0dJV1NDQU4gICAqLwotI2Vsc2UKLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DU0lXU0NBTiAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ0dJV1NDQU4gICAqLwotI2VuZGlmIC8qIFNJT0NHSVdTQ0FOICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2Vzc2lkLAkJICAgIC8qIFNJT0NTSVdFU1NJRCAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZXNzaWQsCQkgICAgLyogU0lPQ0dJV0VTU0lEICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXduaWNrbiwJCSAgICAvKiBTSU9DU0lXTklDS04gICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd25pY2tuLAkJICAgIC8qIFNJT0NHSVdOSUNLTiAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiAtLSBob2xlIC0tICAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogLS0gaG9sZSAtLSAgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdyYXRlLCAgICAgICAgICAvKiBTSU9DU0lXUkFURSAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3JhdGUsICAgICAgICAgIC8qIFNJT0NHSVdSQVRFICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cnRzLAkJICAgIC8qIFNJT0NTSVdSVFMgICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cnRzLAkJICAgIC8qIFNJT0NHSVdSVFMgICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZnJhZywJCSAgICAvKiBTSU9DU0lXRlJBRyAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2ZyYWcsCQkgICAgLyogU0lPQ0dJV0ZSQUcgICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdUWFBPVyAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXVFhQT1cgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1JFVFJZICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdSRVRSWSAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZW5jb2RlLAkJLyogU0lPQ1NJV0VOQ09ERSAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlbmNvZGUsCQkvKiBTSU9DR0lXRU5DT0RFICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1BPV0VSICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdQT1dFUiAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJCQkvKiAtLSBob2xlIC0tICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJCQkJLyogLS0gaG9sZSAtLSAqLwotI2lmIFdJUkVMRVNTX0VYVCA+IDE3Ci0gICAgKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2dlbmllLCAgICAgICAgIC8qIFNJT0NTSVdHRU5JRSAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3Z2VuaWUsICAgICAgICAgLyogU0lPQ0dJV0dFTklFICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdhdXRoLAkJICAgIC8qIFNJT0NTSVdBVVRIICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3YXV0aCwJCSAgICAvKiBTSU9DR0lXQVVUSCAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2VuY29kZWV4dCwJICAgIC8qIFNJT0NTSVdFTkNPREVFWFQgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0LAkJLyogU0lPQ0dJV0VOQ09ERUVYVCAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdwbWtzYSwgICAgICAgICAvKiBTSU9DU0lXUE1LU0EgICovCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyBjb25zdCBpd19oYW5kbGVyIHJ0X3ByaXZfaGFuZGxlcnNbXSA9IHsKLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAwICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMSAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zZXRwYXJhbSwgLyogKyAweDAyICovCi0jaWZkZWYgREJHCi0JKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfaW9jdGxfYmJwLCAvKiArIDB4MDMgKi8KLSNlbHNlCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMyAqLwotI2VuZGlmCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNCAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDUgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA2ICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNyAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDggKi8KLQkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcywgLyogKyAweDA5ICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQSAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEIgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBDICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRCAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEUgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBGICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMCAqLwotCShpd19oYW5kbGVyKSBydF9wcml2YXRlX3Nob3csIC8qICsgMHgxMSAqLwotICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTIgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEzICovCi0gICAgKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNCAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTUgKi8KLSAgICAoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE2ICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNyAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTggKi8KLX07Ci0KLWNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBydDI4eHhfaXdfaGFuZGxlcl9kZWYgPQotewotI2RlZmluZQlOKGEpCShzaXplb2YgKGEpIC8gc2l6ZW9mIChhWzBdKSkKLQkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKSBydF9oYW5kbGVyLAotCS5udW1fc3RhbmRhcmQJPSBzaXplb2YocnRfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCi0JLnByaXZhdGUJPSAoaXdfaGFuZGxlciAqKSBydF9wcml2X2hhbmRsZXJzLAotCS5udW1fcHJpdmF0ZQkJPSBOKHJ0X3ByaXZfaGFuZGxlcnMpLAotCS5wcml2YXRlX2FyZ3MJPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBwcml2dGFiLAotCS5udW1fcHJpdmF0ZV9hcmdzCT0gTihwcml2dGFiKSwKLSNpZiBJV19IQU5ETEVSX1ZFUlNJT04gPj0gNwotICAgIC5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzLAotI2VuZGlmCi19OwotCi1JTlQgUlRNUFNldEluZm9ybWF0aW9uKAotICAgIElOICBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiAgT1VUIHN0cnVjdCBpZnJlcSAgICAqcnEsCi0gICAgSU4gIElOVCAgICAgICAgICAgICAgICAgY21kKQotewotICAgIHN0cnVjdCBpd3JlcSAgICAgICAgICAgICAgICAgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOwotICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7Ci0gICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgICAgICAgICAgICAgQnNzaWQ7Ci0gICAgUlRfODAyXzExX1BIWV9NT0RFICAgICAgICAgICAgICAgICAgUGh5TW9kZTsKLSAgICBSVF84MDJfMTFfU1RBX0NPTkZJRyAgICAgICAgICAgICAgICBTdGFDb25maWc7Ci0gICAgTkRJU184MDJfMTFfUkFURVMgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXM7Ci0gICAgUlRfODAyXzExX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgUHJlYW1ibGU7Ci0gICAgTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOwotICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlTWF4OwotICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEJzc1R5cGU7Ci0gICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgUnRzVGhyZXNoOwotICAgIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIEZyYWdUaHJlc2g7Ci0gICAgTkRJU184MDJfMTFfUE9XRVJfTU9ERSAgICAgICAgICAgICAgUG93ZXJNb2RlOwotICAgIFBORElTXzgwMl8xMV9LRVkgICAgICAgICAgICAgICAgICAgIHBLZXkgPSBOVUxMOwotICAgIFBORElTXzgwMl8xMV9XRVAJCQkgICAgICAgIHBXZXBLZXkgPU5VTEw7Ci0gICAgUE5ESVNfODAyXzExX1JFTU9WRV9LRVkgICAgICAgICAgICAgcFJlbW92ZUtleSA9IE5VTEw7Ci0gICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgQ29uZmlnLCAqcENvbmZpZyA9IE5VTEw7Ci0gICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgICAgICAgICAgTmV0VHlwZTsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3c7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gMDsKLSAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTLCBNYXhQaHlNb2RlID0gUEhZXzExRzsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3dlclRlbXA7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9TdGF0ZTsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7Ci0gICAgIFBORElTXzgwMl8xMV9QQVNTUEhSQVNFICAgICAgICAgICAgICAgICAgICBwcGFzc3BocmFzZSA9IE5VTEw7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JT0lEX1NFVF9IVF9QSFlNT0RFCQkJCQlIVF9QaHlNb2RlOwkvLzExbiAsa2F0aHkKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgUE5ESVNfODAyXzExX1BNS0lEICAgICAgICAgICAgICAgICAgcFBta0lkID0gTlVMTDsKLSAgICBCT09MRUFOCQkJCSAgICAgICAgICAgICAgICBJRUVFODAyMXhTdGF0ZSA9IEZBTFNFOwotICAgIEJPT0xFQU4JCQkJICAgICAgICAgICAgICAgIElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID0gRkFMU0U7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3BhX3N1cHBsaWNhbnRfZW5hYmxlID0gMDsKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLSNpZmRlZiBTTk1QX1NVUFBPUlQKLQlUWF9SVFlfQ0ZHX1NUUlVDCQkJdHhfcnR5X2NmZzsKLQlVTE9ORwkJCQkJCVNob3J0UmV0cnlMaW1pdCwgTG9uZ1JldHJ5TGltaXQ7Ci0JVUNIQVIJCQkJCQljdG1wOwotI2VuZGlmIC8vIFNOTVBfU1VQUE9SVCAvLwotCi0KLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JTWF4UGh5TW9kZSA9IFBIWV8xMU5fNUc7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT5SVE1QU2V0SW5mb3JtYXRpb24oKSwJMHglMDh4XG4iLCBjbWQmMHg3RkZGKSk7Ci0Jc3dpdGNoKGNtZCAmIDB4N0ZGRikgewotCQljYXNlIFJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT046Ci0JCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoIDwgc2l6ZW9mKFVDSEFSKSkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJLy8gT25seSBhdmFsaWFibGUgd2hlbiBFRVBST00gbm90IHByb2dyYW1taW5nCi0gICAgICAgICAgICBlbHNlIGlmICghKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gJiAweDgwKSAmJiAhKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4ODApKQotCQkJewotCQkJCVVMT05HICAgQ291bnRyeTsKLQkJCQlVQ0hBUglUbXBQaHk7Ci0KLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQ291bnRyeSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKShDb3VudHJ5ICYgMHgwMDAwMDBGRik7Ci0JCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kID0gKFVDSEFSKSgoQ291bnRyeSA+PiA4KSAmIDB4MDAwMDAwRkYpOwotICAgICAgICAgICAgICAgIFRtcFBoeSA9IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGU7Ci0JCQkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7Ci0JCQkJLy8gQnVpbGQgYWxsIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCBpbmZvcm1hdGlvbgotCQkJCVJUTVBTZXRQaHlNb2RlKHBBZCwgVG1wUGh5KTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCQlTZXRDb21tb25IVChwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTiAoQTolZCAgQi9HOiVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kLAotCQkJCSAgICBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTjoKLSAgICAgICAgICAgIE5vdyA9IGppZmZpZXM7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLCBUeENudCA9ICVkIFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5MYXN0T25lU2VjVG90YWxUeENvdW50KSk7Ci0KLSAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBpbiBNb25pdG9yIE1vZGUgbm93ICEhIVxuIikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0JCQkvL0JlbnNvbiBhZGQgMjAwODA1MjcsIHdoZW4gcmFkaW8gb2ZmLCBzdGEgZG9uJ3QgbmVlZCB0byBzY2FuCi0JCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCi0JCQkJYnJlYWs7Ci0KLQkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotCQkJewotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgc2Nhbm5pbmcgbm93ICEhIVxuIikpOwotCQkJCXBBZC0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOwotCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLQkJCWlmIChwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQgPiAxMDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKLQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCQkJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgPSA5OTsJCS8vIFByZXZlbnQgYXV0byBzY2FuIHRyaWdnZXJlZCBieSB0aGlzIE9JRAotCQkJCWJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgJiYKLQkJCQkoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKLQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAotCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAotCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkgJiYKLSAgICAgICAgICAgICAgICAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgUG9ydCBOb3QgU2VjdXJlZCEgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOwotCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JCQkJcEFkLT5TdGFDZmcuU2NhbkNudCA9IDk5OwkJLy8gUHJldmVudCBhdXRvIHNjYW4gdHJpZ2dlcmVkIGJ5IHRoaXMgT0lECi0JCQkJYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJUTVBfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZCk7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKLSAgICAgICAgICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCi0gICAgICAgICAgICBwQWQtPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKLSAgICAgICAgICAgIC8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCi0gICAgICAgICAgICBwQWQtPlN0YUNmZy5TY2FuQ250ID0gMDsKLSAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKLQotCQkJcEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7Ci0gICAgICAgICAgICBSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7Ci0gICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAotICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotCi0gICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX1NTSUQ6Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9TU0lEKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotCQlQU1RSSU5HIHBTc2lkU3RyaW5nID0gTlVMTDsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU3NpZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TU0lEIChMZW49JWQsU3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCwgU3NpZC5Tc2lkKSk7Ci0gICAgICAgICAgICAgICAgaWYgKFNzaWQuU3NpZExlbmd0aCA+IE1BWF9MRU5fT0ZfU1NJRCkKLSAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotCQkJaWYgKFNzaWQuU3NpZExlbmd0aCA9PSAwKQotCQkJCXsKLQkJCQlTZXRfU1NJRF9Qcm9jKHBBZCwgIiIpOwotCQkJCX0KLQkJCQkJZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0JCQkJcFNzaWRTdHJpbmcgPSAoUFNUUklORylrbWFsbG9jKE1BWF9MRU5fT0ZfU1NJRCsxLCBNRU1fQUxMT0NfRkxBRyk7Ci0JCQkJCQlpZiAocFNzaWRTdHJpbmcpCi0JCQkJCQl7Ci0JCQkJCQkJTmRpc1plcm9NZW1vcnkocFNzaWRTdHJpbmcsIE1BWF9MRU5fT0ZfU1NJRCsxKTsKLQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwU3NpZFN0cmluZywgU3NpZC5Tc2lkLCBTc2lkLlNzaWRMZW5ndGgpOwotCQkJCQkJCVNldF9TU0lEX1Byb2MocEFkLCBwU3NpZFN0cmluZyk7Ci0JCQkJCQkJa2ZyZWUocFNzaWRTdHJpbmcpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCVN0YXR1cyA9IC1FTk9NRU07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQkJY2FzZSBPSURfODAyXzExX1NFVF9QQVNTUEhSQVNFOgotCSAgICBwcGFzc3BocmFzZT0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKLQotCSAgICBpZihwcGFzc3BocmFzZT09IE5VTEwpCi0gICAgICAgICAgICB7Ci0JCVN0YXR1cyA9IC1FTk9NRU07Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NFVF9QQVNTUEhSQVNFLCBGYWlsZWQhIVxuIikpOwotCQlicmVhazsKLSAgICAgICAgICAgIH0KLQkJCWVsc2UKLQkJewotCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwcGFzc3BocmFzZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQotCQkJCWlmIChTdGF0dXMpCi0JCXsKLQkJCVN0YXR1cyAgPSAtRUlOVkFMOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NFVF9QQVNTUEhSQVNFLCBGYWlsZWQgKGxlbmd0aCBtaXNtYXRjaCkhIVxuIikpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCQlpZihwcGFzc3BocmFzZS0+S2V5TGVuZ3RoIDwgOCB8fCBwcGFzc3BocmFzZS0+S2V5TGVuZ3RoID4gNjQpCi0JCQkJCXsKLQkJCQkJCVN0YXR1cyAgPSAtRUlOVkFMOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NFVF9QQVNTUEhSQVNFLCBGYWlsZWQgKGxlbiBsZXNzIHRoYW4gOCBvciBncmVhdGVyIHRoYW4gNjQpISFcbiIpKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCS8vIHNldCBrZXkgcGFzc3BocmFzZSBhbmQgbGVuZ3RoCi0JCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5XcGFQYXNzUGhyYXNlLCA2NCk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLldwYVBhc3NQaHJhc2UsICZwcGFzc3BocmFzZS0+S2V5TWF0ZXJpYWwsIHBwYXNzcGhyYXNlLT5LZXlMZW5ndGgpOwotCQkJCQkJcEFkLT5TdGFDZmcuV3BhUGFzc1BocmFzZUxlbiA9IHBwYXNzcGhyYXNlLT5LZXlMZW5ndGg7Ci0JCQkJCQloZXhfZHVtcCgicEFkLT5TdGFDZmcuV3BhUGFzc1BocmFzZSIsIHBBZC0+U3RhQ2ZnLldwYVBhc3NQaHJhc2UsIDY0KTsKLQkJCQkJCXByaW50aygiV3BhUGFzc1BocmFzZT0lc1xuIixwQWQtPlN0YUNmZy5XcGFQYXNzUGhyYXNlKTsKLQkJCQkJfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQkJa2ZyZWUocHBhc3NwaHJhc2UpOwotCQkJYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKQotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZCc3NpZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZwotICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCi0gICAgICAgICAgICAgICAgcEFkLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7Ci0KLQkJCQkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYwotCQkJCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZXNldCBhbGxvd2VkIHNjYW4gcmV0cmllcwotCQkJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgPSAwOwotCi0gICAgICAgICAgICAgICAgaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkKTsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWT0lEICopJkJzc2lkKTsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBUUlVFOwotCi0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0JTU0lEICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUkFESU86Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihCT09MRUFOKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUmFkaW9TdGF0ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUkFESU8gKD0lZClcbiIsIFJhZGlvU3RhdGUpKTsKLSAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlN3UmFkaW8gIT0gUmFkaW9TdGF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvID0gUmFkaW9TdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09uKHBBZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCi0JCQkJCQkJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotCQkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotCQkJCSAgICAgICAgICAgIHsKLQkJCQkgICAgICAgICAgICAgICAgaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQotCQkJCQkJICAgICAgICB7Ci0JCQkJCQkgICAgICAgICAgICBSVE1QX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWQpOwotCQkJCQkJICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOwotCQkJCQkJICAgICAgICB9Ci0JCQkJICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT2ZmKHBBZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCi0JCQkJCQkJcEFkLT5FeHRyYUluZm8gPSBTV19SQURJT19PRkY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BIWV9NT0RFOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1BIWV9NT0RFKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUGh5TW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQlpZiAoUGh5TW9kZSA8PSBNYXhQaHlNb2RlKQotCQkJCXsKLSAgICAgICAgICAgICAgICBSVE1QU2V0UGh5TW9kZShwQWQsIFBoeU1vZGUpOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJCVNldENvbW1vbkhUKHBBZCk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkJfQotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9QSFlfTU9ERSAoPSVkKVxuIiwgUGh5TW9kZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpKQotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotCQlVSU5UMzIJVmFsdWU7Ci0KLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU3RhQ29uZmlnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gU3RhQ29uZmlnLkVuYWJsZVR4QnVyc3Q7Ci0gICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gU3RhQ29uZmlnLlVzZUJHUHJvdGVjdGlvbjsKLSAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IDE7IC8vIDIwMDMtMTAtMzAgYWx3YXlzIFNIT1JUIFNMT1QgY2FwYWJsZQotICAgICAgICAgICAgICAgIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSAhPSBTdGFDb25maWcuQWRob2NNb2RlKSAmJgotCQkJCQkoU3RhQ29uZmlnLkFkaG9jTW9kZSA8PSBNYXhQaHlNb2RlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGR5bmFtaWMgY2hhbmdlIG9mICJVU0UgT0ZETSByYXRlIG9yIG5vdCIgaW4gQURIT0MgbW9kZQotICAgICAgICAgICAgICAgICAgICAvLyBpZiBzZXR0aW5nIGNoYW5nZWQsIG5lZWQgdG8gcmVzZXQgY3VycmVudCBUWCByYXRlIGFzIHdlbGwgYXMgQkVBQ09OIGZyYW1lIGZvcm1hdAotICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0gICAgICAgICAgICAgICAgICAgIHsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSBTdGFDb25maWcuQWRob2NNb2RlOwotCQkJUlRNUFNldFBoeU1vZGUocEFkLCBQaHlNb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgRkFMU0UsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgTWFrZUlic3NCZWFjb24ocEFkKTsgICAgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7ICAgLy8gY29weSB0byBvbi1jaGlwIG1lbW9yeQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfU1RBX0NPTkZJRyAoQnVyc3Q9JWQsIFByb3RlY3Rpb249JWxkLFNob3J0U2xvdD0lZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUpKTsKLQotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5QU1BYbGluaykKLQkJCQkJVmFsdWUgPSBQU1BYTElOSzsKLQkJCQllbHNlCi0JCQkJCVZhbHVlID0gU1RBTk9STUFMOwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgVmFsdWUpOwotCQkJCVZhbHVlID0gMDsKLQkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJCQlWYWx1ZSAmPSAofjB4ODApOwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKQotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZhcnlSYXRlcywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgJmFyeVJhdGVzLCBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKTsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfREVTSVJFRF9SQVRFUyAoJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4KVxuIiwKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSxwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdLAotICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdLHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10sCi0gICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0scEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSwKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs2XSxwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICkpOwotICAgICAgICAgICAgICAgIC8vIENoYW5naW5nIERlc2lyZWRSYXRlIG1heSBhZmZlY3QgdGhlIE1BWCBUWCByYXRlIHdlIHVzZWQgdG8gVFggZnJhbWVzIG91dAotICAgICAgICAgICAgICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgRkFMU0UsIDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QUkVBTUJMRToKLSAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFJUXzgwMl8xMV9QUkVBTUJMRSkpCi0gICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlByZWFtYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7Ci0gICAgICAgICAgICAgICAgICAgIE1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZVNob3J0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVMb25nKSB8fCAoUHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUF1dG8pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdXNlciB3YW50cyBBVVRPLCBpbml0aWFsaXplIHRvIExPTkcgaGVyZSwgdGhlbiBjaGFuZ2UgYWNjb3JkaW5nIHRvIEFQJ3MKLSAgICAgICAgICAgICAgICAgICAgLy8gY2FwYWJpbGl0eSB1cG9uIGFzc29jaWF0aW9uLgotICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7Ci0gICAgICAgICAgICAgICAgICAgIE1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZUxvbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1BSRUFNQkxFICg9JWQpXG4iLCBQcmVhbWJsZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9XRVBfU1RBVFVTOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfV0VQX1NUQVRVUykpCi0gICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJldlcFN0YXR1cywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAvLyBTaW5jZSBUS0lQLCBBRVMsIFdFUCBhcmUgYWxsIHN1cHBvcnRlZC4gSXQgc2hvdWxkIG5vdCBoYXZlIGFueSBpbnZhbGlkIHNldHRpbmcKLSAgICAgICAgICAgICAgICBpZiAoV2VwU3RhdHVzIDw9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0tleUFic2VudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gV2VwU3RhdHVzKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBXZXBTdGF0dXM7Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBXZXBTdGF0dXM7Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBXZXBTdGF0dXM7Ci0JCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciAgID0gV2VwU3RhdHVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBfU1RBVFVTICg9JWQpXG4iLFdlcFN0YXR1cykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSkpCi0gICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkF1dGhNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChBdXRoTW9kZSA+IE5kaXM4MDJfMTFBdXRoTW9kZU1heCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IEF1dGhNb2RlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gQXV0aE1vZGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOwotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICg9JWQpIFxuIixwQWQtPlN0YUNmZy5BdXRoTW9kZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSkpCi0gICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJzc1R5cGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0KLQkJCQlpZiAoQnNzVHlwZSA9PSBOZGlzODAyXzExSUJTUykKLQkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkLCAiQWRob2MiKTsKLQkJCQllbHNlIGlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZSkKLQkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkLCAiSW5mcmEiKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFNb25pdG9yKQotCQkJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWQsICJNb25pdG9yIik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFICh1bmtub3duKVxuIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCSBjYXNlIE9JRF84MDJfMTFfUkVNT1ZFX1dFUDoKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfV0VQXG4iKSk7Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9LRVlfSU5ERVgpKQotICAgICAgICAgICAgewotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0JCUtleUlkeCA9ICooTkRJU184MDJfMTFfS0VZX0lOREVYICopIHdycS0+dS5kYXRhLnBvaW50ZXI7Ci0KLQkJaWYgKEtleUlkeCAmIDB4ODAwMDAwMDApCi0JCXsKLQkJCS8vIFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5Ci0JCQlTdGF0dXMgPSAtRUlOVkFMOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJS2V5SWR4ID0gS2V5SWR4ICYgMHgwZmZmZmZmZjsKLQkJCWlmIChLZXlJZHggPj0gNCl7Ci0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gMDsKLQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCQkJCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCAwLCAoVUNIQVIpS2V5SWR4KTsKLQkJCX0KLQkJfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SRVNFVF9DT1VOVEVSUzoKLSAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPldsYW5Db3VudGVycywgc2l6ZW9mKENPVU5URVJfODAyXzExKSk7Ci0gICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5Db3VudGVyczgwMjMsIHNpemVvZihDT1VOVEVSXzgwMl8zKSk7Ci0gICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5SYWxpbmtDb3VudGVycywgc2l6ZW9mKENPVU5URVJfUkFMSU5LKSk7Ci0gICAgICAgICAgICBwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyICAgPSAwOwotCQkJcEFkLT5Db3VudGVyczgwMjMuR29vZFJlY2VpdmVzID0gMDsKLQkJCXBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIgICA9IDA7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUkVTRVRfQ09VTlRFUlMgXG4iKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX1JUU19USFJFU0hPTEQ6Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUnRzVGhyZXNoLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChSdHNUaHJlc2ggPiBNQVhfUlRTX1RIUkVTSE9MRCkKLSAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSAoVVNIT1JUKVJ0c1RocmVzaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEICg9JWxkKVxuIixSdHNUaHJlc2gpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ6Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCkpCi0gICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkZyYWdUaHJlc2gsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOwotICAgICAgICAgICAgICAgIGlmIChGcmFnVGhyZXNoID4gTUFYX0ZSQUdfVEhSRVNIT0xEIHx8IEZyYWdUaHJlc2ggPCBNSU5fRlJBR19USFJFU0hPTEQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoRnJhZ1RocmVzaCA9PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVClGcmFnVGhyZXNoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEICg9JWxkKSBcbiIsRnJhZ1RocmVzaCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QT1dFUl9NT0RFOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUE9XRVJfTU9ERSkpCi0gICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUG93ZXJNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTSkKLQkJCVNldF9QU01vZGVfUHJvYyhwQWQsICJDQU0iKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1ApCi0JCQlTZXRfUFNNb2RlX1Byb2MocEFkLCAiTWF4X1BTUCIpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1ApCi0JCQkJCVNldF9QU01vZGVfUHJvYyhwQWQsICJGYXN0X1BTUCIpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUCkKLQkJCQkJU2V0X1BTTW9kZV9Qcm9jKHBBZCwgIkxlZ2FjeV9QU1AiKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUE9XRVJfTU9ERSAoPSVkKVxuIixQb3dlck1vZGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzE6Ci0JCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICA8IHNpemVvZihVTE9ORykpCi0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCXsKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUG93ZXJUZW1wLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCWlmIChQb3dlclRlbXAgPiAxMDApCi0JCQkJCVBvd2VyVGVtcCA9IDB4ZmZmZmZmZmY7ICAvLyBBVVRPCi0JCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSBQb3dlclRlbXA7IC8va2VlcCBjdXJyZW50IHNldHRpbmcuCi0JCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMSAoPSVsZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7Ci0JCQl9Ci0JICAgICAgICBicmVhazsKLQkJY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0U6Ci0JCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUpKQotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJk5ldFR5cGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0KLQkJCQlpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExRFMpCi0JCQkJCVJUTVBTZXRQaHlNb2RlKHBBZCwgUEhZXzExQik7Ci0JCQkJZWxzZSBpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExT0ZETTI0KQotCQkJCQlSVE1QU2V0UGh5TW9kZShwQWQsIFBIWV8xMUJHX01JWEVEKTsKLQkJCQllbHNlIGlmIChOZXRUeXBlID09IE5kaXM4MDJfMTFPRkRNNSkKLQkJCQkJUlRNUFNldFBoeU1vZGUocEFkLCBQSFlfMTFBKTsKLQkJCQllbHNlCi0JCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJCQlTZXRDb21tb25IVChwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFICg9JWQpXG4iLE5ldFR5cGUpKTsKLQkJICAgIH0KLQkJCWJyZWFrOwotICAgICAgICAvLyBGb3IgV1BBIFBTSyBQTUsga2V5Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9BRERfV1BBOgotICAgICAgICAgICAgcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7Ci0gICAgICAgICAgICBpZihwS2V5ID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIGlmIChwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBLCBGYWlsZWQhIVxuIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgotCQkJCSAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKLQkJCQkgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FT1BOT1RTVVBQOwotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSwgRmFpbGVkISEgW0F1dGhNb2RlICE9IFdQQVBTSy9XUEEyUFNLL1dQQU5PTkVdXG4iKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8Ci0JCQkJCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8Ci0JCQkJCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpICkgICAgIC8vIE9ubHkgZm9yIFdQQSBQU0sgbW9kZQotCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUE1LLCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVzZSBSYUNvbmZpZyBhcyBQU0sgYWdlbnQuCi0gICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IFNUQSBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0gICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOwotCi0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBrZnJlZShwS2V5KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfUkVNT1ZFX0tFWToKLSAgICAgICAgICAgIHBSZW1vdmVLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOwotICAgICAgICAgICAgaWYocFJlbW92ZUtleSA9PSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBSZW1vdmVLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBpZiAocFJlbW92ZUtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgRmFpbGVkISFcbiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUlRNUFdQQVJlbW92ZUtleVByb2MocEFkLCBwUmVtb3ZlS2V5KTsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIFJlbW92ZSBXUEEgS2V5ISFcbiIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gcFJlbW92ZUtleS0+S2V5SW5kZXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEtleUlkeCAmIDB4ODAwMDAwMDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIShTaG91bGQgbmV2ZXIgc2V0IGRlZmF1bHQgYml0IHdoZW4gcmVtb3ZlIGtleSlcbiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEtleUlkeCA9IEtleUlkeCAmIDB4MGZmZmZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ID4gMykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgRmFpbGVkISEoS2V5SWRbJWRdIG91dCBvZiByYW5nZSlcbiIsIEtleUlkeCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWQsIDAsIChVQ0hBUilLZXlJZHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBSZW1vdmVLZXktPktleUluZGV4LCBwUmVtb3ZlS2V5LT5MZW5ndGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGtmcmVlKHBSZW1vdmVLZXkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8vIE5ldyBmb3IgV1BBCi0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BRERfS0VZOgotICAgICAgICAgICAgcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7Ci0gICAgICAgICAgICBpZihwS2V5ID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBpZiAocEtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX0tFWSwgRmFpbGVkISFcbiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSVE1QQWRkS2V5KHBBZCwgcEtleSk7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9LRVkgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAga2ZyZWUocEtleSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX0NPTkZJR1VSQVRJT046Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQ29uZmlnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIHBDb25maWcgPSAmQ29uZmlnOwotCi0gICAgICAgICAgICAgICAgaWYgKChwQ29uZmlnLT5CZWFjb25QZXJpb2QgPj0gMjApICYmIChwQ29uZmlnLT5CZWFjb25QZXJpb2QgPD00MDApKQotICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gKFVTSE9SVCkgcENvbmZpZy0+QmVhY29uUGVyaW9kOwotCi0gICAgICAgICAgICAgICAgcEFkLT5TdGFBY3RpdmUuQXRpbVdpbiA9IChVU0hPUlQpIHBDb25maWctPkFUSU1XaW5kb3c7Ci0gICAgICAgICAgICAgICAgTUFQX0tIWl9UT19DSEFOTkVMX0lEKHBDb25maWctPkRTQ29uZmlnLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLSAgICAgICAgICAgICAgICAvLwotCQkJCS8vIFNhdmUgdGhlIGNoYW5uZWwgb24gTWxtZUF1eCBmb3IgQ250bE9pZFJUQnNzaWRQcm9jIHVzZWQuCi0JCQkJLy8KLQkJCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7Ci0KLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQ09ORklHVVJBVElPTiAoQmVhY25QZXJpb2Q9JWxkLEF0aW1XPSVsZCxDaD0lZClcbiIsCi0gICAgICAgICAgICAgICAgICAgIHBDb25maWctPkJlYWNvblBlcmlvZCwgcENvbmZpZy0+QVRJTVdpbmRvdywgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwotICAgICAgICAgICAgICAgIC8vIENvbmZpZyBoYXMgY2hhbmdlZAotICAgICAgICAgICAgICAgIHBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfSFRfUEhZTU9ERToKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSkpCi0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCXsKLQkJCSAgICBQT0lEX1NFVF9IVF9QSFlNT0RFCXBIVFBoeU1vZGUgPSAmSFRfUGh5TW9kZTsKLQotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZIVF9QaHlNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6cEhUUGh5TW9kZQkoUGh5TW9kZSA9ICVkLFRyYW5zbWl0Tm8gPSAlZCwgSHRNb2RlID0JJWQsCUV4dE9mZnNldCA9CSVkICwgTUNTID0gJWQsIEJXID0JJWQsCVNUQkMgPSAlZCwgU0hPUlRHSSA9ICVkKSBcbiIsCi0JCQkJcEhUUGh5TW9kZS0+UGh5TW9kZSwgcEhUUGh5TW9kZS0+VHJhbnNtaXRObyxwSFRQaHlNb2RlLT5IdE1vZGUscEhUUGh5TW9kZS0+RXh0T2Zmc2V0LAotCQkJCXBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsCXBIVFBoeU1vZGUtPlNIT1JUR0kpKTsKLQkJCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZQk+PSBQSFlfMTFBQkdOX01JWEVEKQotCQkJCQlSVE1QU2V0SFQocEFkLAlwSFRQaHlNb2RlKTsKLQkJCX0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfSFRfUEhZTU9ERShNQ1M9JWQsQlc9JWQsU0dJPSVkLFNUQkM9JWQpXG4iLAotCQkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MsIHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5CVywgcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0ksCi0JCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMpKTsKLQkJCWJyZWFrOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORzoKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJZWxzZQotCQkJewotCQkJCVVMT05HIGFwc2QgOwotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZhcHNkLCB3cnEtPnUuZGF0YS5wb2ludGVyLAl3cnEtPnUuZGF0YS5sZW5ndGgpOwotCi0JCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkJfEIzMX5CNwl8CUI2fkI1CSB8CSBCNAkgfAkgQjMJIHwJQjIJIHwJQjEJIHwJICAgQjAJCXwKLQkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCQl8IFJzdmQJfCBNYXggU1AgTGVuIHwgQUNfVk8gfCBBQ19WSSB8IEFDX0JLIHwgQUNfQkUgfCBBUFNECUNhcGFibGUJfAotCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JCQkJcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gKGFwc2QgJiAweDAwMDAwMDAxKSA/IFRSVUUgOglGQUxTRTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFID0gKChhcHNkCSYgMHgwMDAwMDAwMikgPj4gMSkJPyBUUlVFIDogRkFMU0U7Ci0JCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSyA9ICgoYXBzZAkmIDB4MDAwMDAwMDQpID4+IDIpCT8gVFJVRSA6IEZBTFNFOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPSAoKGFwc2QJJiAweDAwMDAwMDA4KSA+PiAzKQk/IFRSVUUgOiBGQUxTRTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPID0gKChhcHNkCSYgMHgwMDAwMDAxMCkgPj4gNCkJPyBUUlVFIDogRkFMU0U7Ci0JCQkJcEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGgJPSAoVUNIQVIpKChhcHNkCSYgMHgwMDAwMDA2MCkgPj4gNSk7Ci0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORyAoYXBzZD0weCVseCwgQVBTRENhcD0lZCwgW0JFLEJLLFZJLFZPXT1bJWQvJWQvJWQvJWRdLAlNYXhTUExlbj0lZClcbiIsIGFwc2QsIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSwKLQkJCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSwJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSywJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSSwJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTywJcEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGgpKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9QU006Ci0JCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihVTE9ORykpCi0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBEcml2ZXIgbmVlZHMJdG8gbm90aWZ5IEFQIHdoZW4gUFNNIGNoYW5nZXMKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZQkhPSBwQWQtPlN0YUNmZy5Qc20pCi0JCQkJewotCQkJCQlSVE1QX1NFVF9QU01fQklUKHBBZCwJcEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSk7Ci0JCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwJcEFkLT5Db21tb25DZmcuVHhSYXRlLAlUUlVFKTsKLQkJCQl9Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9BUFNEX1BTTSAoYkFQU0RGb3JjZVBvd2VyU2F2ZTolZClcbiIsCXBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKTsKLQkJCX0KLQkJCWJyZWFrOwotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0RMUzoKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJZWxzZQotCQkJewotCQkJCUJPT0xFQU4Jb2xkdmFsdWUgPSBwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZTsKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQkJaWYgKG9sZHZhbHVlICYmCSFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKLQkJCQl7Ci0JCQkJCWludAlpOwotCQkJCQkvLyB0ZWFyCWRvd24gbG9jYWwgZGxzIHRhYmxlIGVudHJ5Ci0JCQkJCWZvcgkoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKLQkJCQkJewotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCi0JCQkJCQl7Ci0JCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7Ci0JCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIHRlYXIJZG93biBwZWVyIGRscyB0YWJsZQllbnRyeQotCQkJCQlmb3IJKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQotCQkJCQl7Ci0JCQkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKLQkJCQkJCXsKLQkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKLQkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0RMUyAoPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNOgotCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpCi0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCXsKLQkJCQlSVF84MDJfMTFfRExTCURsczsKLQotCQkJCU5kaXNaZXJvTWVtb3J5KCZEbHMsIHNpemVvZihSVF84MDJfMTFfRExTKSk7Ci0JCQkJUlRNUE1vdmVNZW1vcnkoJkRscywgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKLQkJCQlNbG1lRW5xdWV1ZShwQWQsCi0JCQkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCi0JCQkJCQkJUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNLAotCQkJCQkJCXNpemVvZihSVF84MDJfMTFfRExTKSwKLQkJCQkJCQkmRGxzKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNIFxuIikpOwotCQkJfQotCQkJYnJlYWs7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfV01NOgotCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoQk9PTEVBTikpCi0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCXsKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9XTU0gKD0lZCkJXG4iLCBwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPSURfODAyXzExX0RJU0FTU09DSUFURToKLQkJCS8vCi0JCQkvLyBTZXQgTmRpc1JhZGlvU3RhdGVPZmYgdG8JVFJVRSwgaW5zdGVhZCBvZiBjYWxsZWQJTWxtZVJhZGlvT2ZmLgotCQkJLy8gTGF0ZXIgb24sIE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgtPk51bWJlck9mSXRlbXMgc2hvdWxkIGJlCTAKLQkJCS8vIHdoZW4JcXVlcnkgT0lEXzgwMl8xMV9CU1NJRF9MSVNULgotCQkJLy8KLQkJCS8vIFRSVUU6ICBOdW1iZXJPZkl0ZW1zCXdpbGwgc2V0IHRvCTAuCi0JCQkvLyBGQUxTRTogTnVtYmVyT2ZJdGVtcwlubyBjaGFuZ2UuCi0JCQkvLwotCQkJcEFkLT5Db21tb25DZmcuTmRpc1JhZGlvU3RhdGVPZmYgPQlUUlVFOwotCQkJLy8gU2V0IHRvIGltbWVkaWF0ZWx5IHNlbmQgdGhlIG1lZGlhIGRpc2Nvbm5lY3QJZXZlbnQKLQkJCXBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcwk9IFRSVUU7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfRElTQVNTT0NJQVRFCVxuIikpOwotCi0KLQkJCWlmIChJTkZSQV9PTihwQWQpKQotCQkJewotCQkJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9CUNOVExfSURMRSkKLQkJCQl7Ci0JCQkJCVJUTVBfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZCk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FCWJ1c3ksIHJlc2V0CU1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKLQkJCQl9Ci0KLQkJCQlNbG1lRW5xdWV1ZShwQWQsCi0JCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotCQkJCQlPSURfODAyXzExX0RJU0FTU09DSUFURSwKLQkJCQkJMCwKLQkJCQkJTlVMTCk7Ci0KLQkJCQlTdGF0ZU1hY2hpbmVUb3VjaGVkCT0gVFJVRTsKLQkJCX0KLQkJCWJyZWFrOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfSU1NRV9CQV9DQVA6Ci0JCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0JBQ0FQX1NUUlVDKSkKLQkJCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCQllbHNlCi0JCQkJewotCQkJCQlPSURfQkFDQVBfU1RSVUMgT3JkZSA7Ci0JCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZPcmRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCQlpZiAoT3JkZS5Qb2xpY3kgPiBCQV9OT1RVU0UpCi0JCQkJCXsKLQkJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChPcmRlLlBvbGljeSA9PSBCQV9OT1RVU0UpCi0JCQkJCXsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBCQV9OT1RVU0U7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OwotCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IE9yZGUuQW1zZHVFbmFibGU7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplPSBPcmRlLkFtc2R1U2l6ZTsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHM9IE9yZGUuTU1QU21vZGU7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBPcmRlLk1NUFNtb2RlOwotCQkJCQkJLy8gVVBkYXRhIHRvIEhUIElFCi0JCQkJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IE9yZGUuTU1QU21vZGU7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IE9yZGUuQW1zZHVTaXplOwotCQkJCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gT3JkZS5BdXRvQkE7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gSU1NRURfQkE7IC8vIHdlIG9ubHkgc3VwcG9ydCBpbW1lZGlhdGUgQkEuCi0JCQkJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OwotCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IE9yZGUuQW1zZHVFbmFibGU7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplPSBPcmRlLkFtc2R1U2l6ZTsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMgPSBPcmRlLk1NUFNtb2RlOwotCQkJCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gT3JkZS5NTVBTbW9kZTsKLQotCQkJCQkJLy8gVVBkYXRhIHRvIEhUIElFCi0JCQkJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IE9yZGUuTU1QU21vZGU7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IE9yZGUuQW1zZHVTaXplOwotCQkJCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7Ci0KLQkJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID4gTUFYX1JYX1JFT1JERVJCVUYpCi0JCQkJCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IE1BWF9SWF9SRU9SREVSQlVGOwotCi0JCQkJCX0KLQotCQkJCQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZCA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OihPcmRlLkF1dG9CQSA9ICVkKSAoUG9saWN5PSVkKShSZUJBV2luTGltaXQ9JWQpKFR4QkFXaW5MaW1pdD0lZCkoQXV0b01vZGU9JWQpXG4iLE9yZGUuQXV0b0JBLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5LAotCQkJCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCxwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuVHhCQVdpbkxpbWl0LCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBKSk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6KE1pbW9QcyA9ICVkKShBbXNkdUVuYWJsZSA9ICVkKSAoQW1zZHVTaXplPSVkKShNcGR1RGVuc2l0eT0lZClcbiIscEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcywgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlLAotCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSwgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5KSk7Ci0JCQkJfQotCi0JCQkJYnJlYWs7Ci0JCWNhc2UgUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQToKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBTZXQgOjogUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQSBcbiIpKTsKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE9JRF9BRERfQkFfRU5UUlkpKQotCQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJZWxzZQotCQkJewotCQkJCVVDSEFSCQkgICAgICAgIGluZGV4OwotCQkJCU9JRF9BRERfQkFfRU5UUlkgICAgQkE7Ci0JCQkJTUFDX1RBQkxFX0VOVFJZICAgICAqcEVudHJ5OwotCi0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJBLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCWlmIChCQS5USUQgPiAxNSkKLQkJCQl7Ci0JCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vQkFUYWJsZUluc2VydEVudHJ5Ci0JCQkJCS8vQXMgYWQtaG9jIG1vZGUsIEJBIHBhaXIgaXMgbm90IGxpbWl0ZWQgdG8gb25seSBCU1NJRC4gc28gYWRkIHZpYSBPSUQuCi0JCQkJCWluZGV4ID0gQkEuVElEOwotCQkJCQkvLyBpbiBhZCBob2MgbW9kZSwgd2hlbiBhZGRpbmcgQkEgcGFpciwgd2Ugc2hvdWxkIGluc2VydCB0aGlzIGVudHJ5IGludG8gTUFDRW50cnkgdG9vCi0JCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgQkEuTUFDQWRkcik7Ci0JCQkJCWlmICghcEVudHJ5KQotCQkJCQl7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVF9PSURfODAyXzExX0FERF9JTU1FX0JBLiBicmVhayBvbiBubyBjb25uZWN0aW9uLi0tLS06JXg6JXhcbiIsIEJBLk1BQ0FkZHJbNF0sIEJBLk1BQ0FkZHJbNV0pKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmIChCQS5Jc1JlY2lwaWVudCA9PSBGQUxTRSkKLQkJCQkJewotCQkJCQkgICAgaWYgKHBFbnRyeS0+YklBbUJhZEF0aGVyb3MgPT0gVFJVRSkKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gMHgxMDsKLQotCQkJCQkJQkFPcmlTZXNzaW9uU2V0VXAocEFkLCBwRW50cnksIGluZGV4LCAwLCAxMDAsIFRSVUUpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJLy9CQVRhYmxlSW5zZXJ0RW50cnkocEFkLCBwRW50cnktPkFpZCwgQkEuTUFDQWRkciwgMCwgMHhmZmZmLCBCQS5USUQsIEJBLm5NU0RVLCBCQS5Jc1JlY2lwaWVudCk7Ci0JCQkJCX0KLQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEuIFJlYyA9ICVkLiBNYWMgPSAleDoleDoleDoleDoleDoleCAuIFxuIiwKLQkJCQkJCUJBLklzUmVjaXBpZW50LCBCQS5NQUNBZGRyWzBdLCBCQS5NQUNBZGRyWzFdLCBCQS5NQUNBZGRyWzJdLCBCQS5NQUNBZGRyWzJdCi0JCQkJCQksIEJBLk1BQ0FkZHJbNF0sIEJBLk1BQ0FkZHJbNV0pKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBIFxuIikpOwotCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0FERF9CQV9FTlRSWSkpCi0JCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJUE9JRF9BRERfQkFfRU5UUlkJcEJBOwotCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCi0JCQkJcEJBID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKLQotCQkJCWlmIChwQkEgPT0gTlVMTCkKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQSBrbWFsbG9jKCkgY2FuJ3QgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeVxuIikpOwotCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwQkEsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQShUSUQ9JWQsIGJBbGxUaWQ9JWQpXG4iLCBwQkEtPlRJRCwgcEJBLT5iQWxsVGlkKSk7Ci0KLQkJCQkJaWYgKCFwQkEtPmJBbGxUaWQgJiYgKHBCQS0+VElEID4gTlVNX09GX1RJRCkpCi0JCQkJCXsKLQkJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJaWYgKHBCQS0+SXNSZWNpcGllbnQgPT0gRkFMU0UpCi0JCQkJCXsKLQkJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEJBLT5NQUNBZGRyKTsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBwQkEtPklzUmVjaXBpZW50ID09IEZBTFNFXG4iKSk7Ci0JCQkJCQlpZiAocEVudHJ5KQotCQkJCQkJewotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBwQkEtPnBFbnRyeVxuIikpOwotCQkJCQkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgcEVudHJ5LT5BaWQsIHBCQS0+VElELCBGQUxTRSwgVFJVRSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IE5vdCBmb3VuZCBwRW50cnkgXG4iKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBCQS0+TUFDQWRkcik7Ci0JCQkJCQlpZiAocEVudHJ5KQotCQkJCQkJewotCQkJCQkJCUJBUmVjU2Vzc2lvblRlYXJEb3duKCBwQWQsIChVQ0hBUilwRW50cnktPkFpZCwgcEJBLT5USUQsIFRSVUUpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBOb3QgZm91bmQgcEVudHJ5IFxuIikpOwotCQkJCQl9Ci0JCQkJCWtmcmVlKHBCQSk7Ci0JCQkJfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLSAgICAgICAgLy8gRm9yIFdQQV9TVVBQTElDQU5UIHRvIHNldCBzdGF0aWMgd2VwIGtleQotCWNhc2UgT0lEXzgwMl8xMV9BRERfV0VQOgotCSAgICBwV2VwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKLQotCSAgICBpZihwV2VwS2V5ID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkISFcbiIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBXZXBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBpZiAoU3RhdHVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBGYWlsZWQgKGxlbmd0aCBtaXNtYXRjaCkhIVxuIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotCQkgICAgICAgIEtleUlkeCA9IHBXZXBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKLSAgICAgICAgICAgICAgICAvLyBLZXlJZHggbXVzdCBiZSAwIH4gMwotICAgICAgICAgICAgICAgIGlmIChLZXlJZHggPiA0KQotCQkJewotICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCAoS2V5SWR4IG11c3QgYmUgc21hbGxlciB0aGFuIDQpISFcbiIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVUNIQVIgQ2lwaGVyQWxnID0gMDsKLSAgICAgICAgICAgICAgICAgICAgUFVDSEFSIEtleTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAxNik7Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwV2VwS2V5LT5LZXlMZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAmcFdlcEtleS0+S2V5TWF0ZXJpYWwsIHBXZXBLZXktPktleUxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHBXZXBLZXktPktleUxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIG9ubHkgc3VwcG9ydCBDSVBIRVJfV0VQNjQobGVuOjUpICYgQ0lQSEVSX1dFUDEyOChsZW46MTMpISFcbiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBXZXBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgewotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLktleSwgMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwV2VwS2V5LT5LZXlMZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5LZXksICZwV2VwS2V5LT5LZXlNYXRlcmlhbCwgcFdlcEtleS0+S2V5TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleUlkID0gS2V5SWR4OwotICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JCQkJCWlmICgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpICYmCi0JCQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKLQkJCQkJewotCQkJCQkJS2V5ID0gcFdlcEtleS0+S2V5TWF0ZXJpYWw7Ci0KLQkJCQkJCS8vIFNldCBHcm91cCBrZXkgbWF0ZXJpYWwgdG8gQXNpYwotCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKLQotCQkJCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKLQkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgTlVMTCk7Ci0KLQkJCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKLQotCQkJCQkvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQotCQkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKQotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCi0JCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocFdlcEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzaWduIGdyb3VwIGtleSBpbmZvCi0JCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIE5VTEwpOwotCQkJCQkJLy8gQXNzaWduIHBhaXJ3aXNlIGtleSBpbmZvCi0JCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIHBFbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAgKGlkPTB4JXgsIExlbj0lZC1ieXRlKSwgJXNcbiIsIHBXZXBLZXktPktleUluZGV4LCBwV2VwS2V5LT5LZXlMZW5ndGgsIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkgPyAiUG9ydCBTZWN1cmVkIjoiUG9ydCBOT1QgU2VjdXJlZCIpKTsKLQkJCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBrZnJlZShwV2VwS2V5KTsKLSAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkgICAgY2FzZSBPSURfU0VUX0NPVU5URVJNRUFTVVJFUzoKLSAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKGludCkpCi0gICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGVuYWJsZWQgPSAwOwotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlbmFibGVkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChlbmFibGVkID09IDEpCi0gICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gVFJVRTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIC8vIFdQQSBNSUMgZXJyb3Igc2hvdWxkIGJsb2NrIGFzc29jaWF0aW9uIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF9TRVRfQ09VTlRFUk1FQVNVUkVTIGJCbG9ja0Fzc29jPSVzXG4iLCBwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA/ICJUUlVFIjoiRkFMU0UiKSk7Ci0gICAgICAgICAgICB9Ci0JICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVDoKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmd3BhX3N1cHBsaWNhbnRfZW5hYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gd3BhX3N1cHBsaWNhbnRfZW5hYmxlOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAoPSVkKVxuIiwgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7Ci0JCQl9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX0RFQVVUSEVOVElDQVRJT046Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICAgICAgKnBJbmZvOwotCQlNTE1FX1FVRVVFX0VMRU0gKk1zZ0VsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKLSAgICAgICAgICAgICAgICBpZiAoTXNnRWxlbSA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzKCk6YWxsb2MgbWVtb3J5IGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXykpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcEluZm8gPSAoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAqKSBNc2dFbGVtLT5Nc2c7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEluZm8sIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgTWxtZURlYXV0aFJlcUFjdGlvbihwQWQsIE1zZ0VsZW0pOwotCQkJCWtmcmVlKE1zZ0VsZW0pOwotCi0gICAgICAgICAgICAgICAgaWYgKElORlJBX09OKHBBZCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfREVBVVRIRU5USUNBVElPTiAoUmVhc29uPSVkKVxuIiwgcEluZm8tPlJlYXNvbikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9EUk9QX1VORU5DUllQVEVEOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoaW50KSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgZW5hYmxlZCA9IDA7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVuYWJsZWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwotCQkJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0JCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Qb3J0U2VjdXJlZCA9IHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkOwotCQkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RST1BfVU5FTkNSWVBURUQgKD0lZClcbiIsIGVuYWJsZWQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWDoKLSAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJRUVFODAyMXhTdGF0ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJICAgICAgICBwQWQtPlN0YUNmZy5JRUVFODAyMVggPSBJRUVFODAyMXhTdGF0ZTsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWCAoPSVkKVxuIiwgSUVFRTgwMjF4U3RhdGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWF9SRVFVSVJFX0tFWToKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQotCQkJCSBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQkJcEFkLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBJRUVFODAyMXhfcmVxdWlyZWRfa2V5czsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWF9SRVFVSVJFX0tFWSAoJWQpXG4iLCBJRUVFODAyMXhfcmVxdWlyZWRfa2V5cykpOwotCQkJfQotCQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QTUtJRDoKLQkgICAgICAgIHBQbWtJZCA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7Ci0KLQkgICAgICAgIGlmKHBQbWtJZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBQbWtJZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQotCSAgICAgICAgLy8gY2hlY2sgdGhlIFBNS0lEIGluZm9ybWF0aW9uCi0JICAgICAgICBpZiAocFBta0lkLT5CU1NJREluZm9Db3VudCA9PSAwKQotICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlNhdmVkUE1LLCBzaXplb2YoQlNTSURfSU5GTykqUE1LSURfTk8pOwotCSAgICAgICAgZWxzZQotCSAgICAgICAgewotCQkgICAgICAgIFBCU1NJRF9JTkZPCXBCc3NJZEluZm87Ci0JCSAgICAgICAgVUlOVAkJQnNzSWR4OwotCQkgICAgICAgIFVJTlQJCUNhY2hlZElkeDsKLQotCQkgICAgICAgIGZvciAoQnNzSWR4ID0gMDsgQnNzSWR4IDwgcFBta0lkLT5CU1NJREluZm9Db3VudDsgQnNzSWR4KyspCi0JCSAgICAgICAgewotCQkJICAgICAgICAvLyBwb2ludCB0byB0aGUgaW5kZXhlZCBCU1NJRF9JTkZPIHN0cnVjdHVyZQotCQkJICAgICAgICBwQnNzSWRJbmZvID0gKFBCU1NJRF9JTkZPKSAoKFBVQ0hBUikgcFBta0lkICsgMiAqIHNpemVvZihVSU5UKSArIEJzc0lkeCAqIHNpemVvZihCU1NJRF9JTkZPKSk7Ci0JCQkgICAgICAgIC8vIEZpbmQgdGhlIGVudHJ5IGluIHRoZSBzYXZlZCBkYXRhIGJhc2UuCi0JCQkgICAgICAgIGZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQotCQkJICAgICAgICB7Ci0JCQkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAotCQkJCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwQnNzSWRJbmZvLT5CU1NJRCwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSkpCi0JCQkJCSAgICAgICAgYnJlYWs7Ci0JCQkgICAgICAgIH0KLQotCQkJICAgICAgICAvLyBGb3VuZCwgcmVwbGFjZSBpdAotCQkJICAgICAgICBpZiAoQ2FjaGVkSWR4IDwgUE1LSURfTk8pCi0JCQkgICAgICAgIHsKLQkJCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgT0lEXzgwMl8xMV9QTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOwotCQkJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0sIHBCc3NJZEluZm8sIHNpemVvZihCU1NJRF9JTkZPKSk7Ci0JCQkJICAgICAgICBwQWQtPlN0YUNmZy5TYXZlZFBNS051bSsrOwotCQkJICAgICAgICB9Ci0JCQkgICAgICAgIC8vIE5vdCBmb3VuZCwgcmVwbGFjZSB0aGUgbGFzdCBvbmUKLQkJCSAgICAgICAgZWxzZQotCQkJICAgICAgICB7Ci0JCQkJICAgICAgICAvLyBSYW5kb21seSByZXBsYWNlIG9uZQotCQkJCSAgICAgICAgQ2FjaGVkSWR4ID0gKHBCc3NJZEluZm8tPkJTU0lEWzVdICUgUE1LSURfTk8pOwotCQkJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBPSURfODAyXzExX1BNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7Ci0JCQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XSwgcEJzc0lkSW5mbywgc2l6ZW9mKEJTU0lEX0lORk8pKTsKLQkJCSAgICAgICAgfQotCQkgICAgICAgIH0KLQkJCX0KLQkJCWlmKHBQbWtJZCkKLQkJCQlrZnJlZShwUG1rSWQpOwotCSAgICAgICAgYnJlYWs7Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0KLQotI2lmZGVmIFNOTVBfU1VQUE9SVAotCQljYXNlIE9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUOgotCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlNob3J0UmV0cnlMaW1pdCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOwotCQkJCXR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCA9IFNob3J0UmV0cnlMaW1pdDsKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQgKHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSZXRyeUxpbWl0PSVkLCBTaG9ydFJldHJ5TGltaXQ9JWxkKVxuIiwgdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0LCBTaG9ydFJldHJ5TGltaXQpKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgT0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCBcbiIpKTsKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJZWxzZQotCQkJewotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZMb25nUmV0cnlMaW1pdCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOwotCQkJCXR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0ID0gTG9uZ1JldHJ5TGltaXQ7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgKHR4X3J0eV9jZmcuZmllbGQuTG9uZ1JldHJ5TGltaXQ9ICVkLExvbmdSZXRyeUxpbWl0PSVsZClcbiIsIHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0LCBMb25nUmV0cnlMaW1pdCkpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRToKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUVcbiIpKTsKLQkJCXBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJLy9wS2V5ID0gJldlcEtleTsKLQotCQkJaWYgKCBwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQotCQkJewotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRSwgRmFpbGVkISFcbiIpKTsKLQkJCX0KLQkJCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgicEtleS0+S2V5SW5kZXggPSVkLCBwS2V5LT5LZXlMZW5ndGg9JWRcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKLQotCQkJLy8gaXQgaXMgYSBzaGFyZWQga2V5Ci0JCQlpZiAoS2V5SWR4ID4gNCkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJZWxzZQotCQkJewotCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gKFVDSEFSKSBwS2V5LT5LZXlMZW5ndGg7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7Ci0JCQkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKLQkJCQl7Ci0JCQkJCS8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKLQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7Ci0JCQkJfQotCQkJCS8vUmVzdGFydEFQSXNSZXF1aXJlZCA9IFRSVUU7Ci0JCQl9Ci0JCQlicmVhazsKLQotCi0JCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEIFxuIikpOwotCi0JCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVQ0hBUikpCi0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCi0JCQlicmVhazsKLQotCi0JCWNhc2UgT0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTCBcbiIpKTsKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJZWxzZQotCQkJewotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZjdG1wLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCXNwcmludGYoKFBTVFJJTkcpJmN0bXAsIiVkIiwgY3RtcCk7Ci0JCQkJU2V0X0NoYW5uZWxfUHJvYyhwQWQsIChQU1RSSU5HKSZjdG1wKTsKLQkJCX0KLQkJCWJyZWFrOwotI2VuZGlmCi0KLQotCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfUFNQWExJTktfTU9ERToKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWQtPkNvbW1vbkNmZy5QU1BYbGluaywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQkvKmlmIChwQWQtPkNvbW1vbkNmZy5QU1BYbGluaykKLQkJCQkJUlhfRklMVEVSX1NFVF9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfUFJPTUlTQ1VPVVMpKi8KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfUFNQWExJTktfTU9ERSg9JWQpIFxuIiwgcEFkLT5Db21tb25DZmcuUFNQWGxpbmspKTsKLSAgICAgICAgICAgIH0KLQkJCWJyZWFrOwotCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6dW5rbm93biBJT0NUTCdzIHN1YmNtZCA9IDB4JTA4eFxuIiwgY21kKSk7Ci0gICAgICAgICAgICBTdGF0dXMgPSAtRU9QTk9UU1VQUDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotCi0gICAgcmV0dXJuIFN0YXR1czsKLX0KLQotSU5UIFJUTVBRdWVyeUluZm9ybWF0aW9uKAotICAgIElOICBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiAgT1VUIHN0cnVjdCBpZnJlcSAgICAqcnEsCi0gICAgSU4gIElOVCAgICAgICAgICAgICAgICAgY21kKQotewotICAgIHN0cnVjdCBpd3JlcSAgICAgICAgICAgICAgICAgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOwotICAgIE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVggICAgICAgICAgICpwQnNzaWRMaXN0ID0gTlVMTDsKLSAgICBQTkRJU19XTEFOX0JTU0lEX0VYICAgICAgICAgICAgICAgICBwQnNzOwotICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7Ci0gICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgKnBDb25maWd1cmF0aW9uID0gTlVMTDsKLSAgICBSVF84MDJfMTFfTElOS19TVEFUVVMgICAgICAgICAgICAgICAqcExpbmtTdGF0dXMgPSBOVUxMOwotICAgIFJUXzgwMl8xMV9TVEFfQ09ORklHICAgICAgICAgICAgICAgICpwU3RhQ29uZmlnID0gTlVMTDsKLSAgICBORElTXzgwMl8xMV9TVEFUSVNUSUNTICAgICAgICAgICAgICAqcFN0YXRpc3RpY3MgPSBOVUxMOwotICAgIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgIFJ0c1RocmVzaDsKLSAgICBORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCBGcmFnVGhyZXNoOwotICAgIE5ESVNfODAyXzExX1BPV0VSX01PREUgICAgICAgICAgICAgIFBvd2VyTW9kZTsKLSAgICBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICBCc3NUeXBlOwotICAgIFJUXzgwMl8xMV9QUkVBTUJMRSAgICAgICAgICAgICAgICAgIFByZWFtVHlwZTsKLSAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsKLSAgICBORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7Ci0gICAgTkRJU19NRURJQV9TVEFURSAgICAgICAgICAgICAgICAgICAgTWVkaWFTdGF0ZTsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NCdWZTaXplLCB1bEluZm89MCwgTmV0d29ya1R5cGVMaXN0WzRdLCBhcHNkID0gMDsKLSAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NMZW4gPSAwOwotICAgIFBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWYgPSBOVUxMLCBwUHRyOwotICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VfdmVyc2lvbl9jb21waWxlZDsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBQYWRkaW5nID0gMDsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWRpb1N0YXRlOwotCVNUUklORwkJCQkJCQkJZHJpdmVyVmVyc2lvbls4XTsKLSAgICBPSURfU0VUX0hUX1BIWU1PREUJCQkgICAgICAgICpwSFRQaHlNb2RlID0gTlVMTDsKLQotCi0jaWZkZWYgU05NUF9TVVBQT1JUCi0JLy9mb3Igc25tcCwga2F0aHkKLQlEZWZhdWx0S2V5SWR4VmFsdWUJCQkqcEtleUlkeFZhbHVlOwotCUlOVAkJCQkJCQl2YWx1ZUxlbjsKLQlUWF9SVFlfQ0ZHX1NUUlVDCQkJdHhfcnR5X2NmZzsKLQlVTE9ORwkJCQkJCVNob3J0UmV0cnlMaW1pdCwgTG9uZ1JldHJ5TGltaXQ7Ci0JVUNIQVIJCQkJCQl0bXBbNjRdOwotI2VuZGlmIC8vU05NUAotCi0gICAgc3dpdGNoKGNtZCkKLSAgICB7Ci0gICAgICAgIGNhc2UgUlRfT0lEX0RFVklDRV9OQU1FOgotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBBZC0+bmlja25hbWUpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBBZC0+bmlja25hbWUsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfVkVSU0lPTl9JTkZPOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9WRVJTSU9OX0lORk8gXG4iKSk7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSA4KnNpemVvZihDSEFSKTsKLQkJCXNwcmludGYoJmRyaXZlclZlcnNpb25bMF0sICIlcyIsIFNUQV9EUklWRVJfVkVSU0lPTik7Ci0JCQlkcml2ZXJWZXJzaW9uWzddID0gJ1wwJzsKLQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmRyaXZlclZlcnNpb25bMF0sIHdycS0+dS5kYXRhLmxlbmd0aCkpCi0gICAgICAgICAgICB7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRF9MSVNUOgotICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0gICAgICAgICAgICB7Ci0JCS8qCi0JCSAqIFN0aWxsIHNjYW5uaW5nLCBpbmRpY2F0ZSB0aGUgY2FsbGVyIHNob3VsZCB0cnkgYWdhaW4uCi0JCSAqLwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUIChTdGlsbCBzY2FubmluZylcbiIpKTsKLQkJCQlyZXR1cm4gLUVBR0FJTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEX0xJU1QgKCVkIEJTUyByZXR1cm5lZClcbiIscEFkLT5TY2FuVGFiLkJzc05yKSk7Ci0JCQlwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7Ci0gICAgICAgICAgICAvLyBDbGFjdWxhdGUgdG90YWwgYnVmZmVyIHNpemUgcmVxdWlyZWQKLSAgICAgICAgICAgIEJzc0J1ZlNpemUgPSBzaXplb2YoVUxPTkcpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEFkLT5TY2FuVGFiLkJzc05yOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQWxpZ24gcG9pbnRlciB0byA0IGJ5dGVzIGJvdW5kYXJ5LgotICAgICAgICAgICAgICAgIC8vUGFkZGluZyA9IDQgLSAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gJiAweDAwMDMpOwotICAgICAgICAgICAgICAgIC8vaWYgKFBhZGRpbmcgPT0gNCkKLSAgICAgICAgICAgICAgICAvLyAgICBQYWRkaW5nID0gMDsKLSAgICAgICAgICAgICAgICBCc3NCdWZTaXplICs9IChzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSArIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiArIFBhZGRpbmcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBGb3Igc2FmZXR5IGlzc3VlLCB3ZSBhZGQgMjU2IGJ5dGVzIGp1c3QgaW4gY2FzZQotICAgICAgICAgICAgQnNzQnVmU2l6ZSArPSAyNTY7Ci0gICAgICAgICAgICAvLyBBbGxvY2F0ZSB0aGUgc2FtZSBzaXplIGFzIHBhc3NlZCBmcm9tIGhpZ2hlciBsYXllcgotICAgICAgICAgICAgcEJ1ZiA9IGttYWxsb2MoQnNzQnVmU2l6ZSwgTUVNX0FMTE9DX0ZMQUcpOwotICAgICAgICAgICAgaWYocEJ1ZiA9PSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbml0IDgwMl8xMV9CU1NJRF9MSVNUX0VYIHN0cnVjdHVyZQotICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEJ1ZiwgQnNzQnVmU2l6ZSk7Ci0gICAgICAgICAgICBwQnNzaWRMaXN0ID0gKFBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYKSBwQnVmOwotICAgICAgICAgICAgcEJzc2lkTGlzdC0+TnVtYmVyT2ZJdGVtcyA9IHBBZC0+U2NhblRhYi5Cc3NOcjsKLQotICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRvdGFsIGJ1ZmZlciBsZW5ndGgKLSAgICAgICAgICAgIEJzc0xlbiA9IDQ7IC8vIENvbnNpc3Qgb2YgTnVtYmVyT2ZJdGVtcwotICAgICAgICAgICAgLy8gUG9pbnQgdG8gc3RhcnQgb2YgTkRJU19XTEFOX0JTU0lEX0VYCi0gICAgICAgICAgICAvLyBwUHRyID0gcEJ1ZiArIHNpemVvZihVTE9ORyk7Ci0gICAgICAgICAgICBwUHRyID0gKFBVQ0hBUikgJnBCc3NpZExpc3QtPkJzc2lkWzBdOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBCc3MgPSAoUE5ESVNfV0xBTl9CU1NJRF9FWCkgcFB0cjsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEJzcy0+TWFjQWRkcmVzcywgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKLSAgICAgICAgICAgICAgICBpZiAoKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5IaWRkZW4gPT0gMSkgJiYgKHBBZC0+U3RhQ2ZnLmJTaG93SGlkZGVuU1NJRCA9PSBGQUxTRSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLwotCQkJCQkvLyBXZSBtdXN0IHJldHVybiB0aGlzIFNTSUQgZHVyaW5nIDR3YXkgaGFuZHNoYWtpbmcsIG90aGVyd2lzZSBBZWdpcyB3aWxsIGZhaWxlZCB0byBwYXJzZSBXUEEgaW5mb21hdGlvbgotCQkJCQkvLyBhbmQgdGhlbiBmYWlsZWQgdG8gc2VuZCBFQVBPbCBmYXJhbWUuCi0JCQkJCS8vCi0JCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSAmJiAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgIT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpKQotCQkJCQl7Ci0JCQkJCQlwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlNzaWQuU3NpZCwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQlwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZC5Tc2lkLCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQnNzLT5Qcml2YWN5ID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlByaXZhY3k7Ci0gICAgICAgICAgICAgICAgcEJzcy0+UnNzaSA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKLSAgICAgICAgICAgICAgICBwQnNzLT5OZXR3b3JrVHlwZUluVXNlID0gTmV0d29ya1R5cGVJblVzZVNhbml0eSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldKTsKLSAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKTsKLSAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkJlYWNvblBlcmlvZCA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5CZWFjb25QZXJpb2Q7Ci0gICAgICAgICAgICAgICAgcEJzcy0+Q29uZmlndXJhdGlvbi5BVElNV2luZG93ID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkF0aW1XaW47Ci0KLSAgICAgICAgICAgICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWwsIHBCc3MtPkNvbmZpZ3VyYXRpb24uRFNDb25maWcpOwotCi0gICAgICAgICAgICAgICAgaWYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IEJTU19JTkZSQSkKLSAgICAgICAgICAgICAgICAgICAgcEJzcy0+SW5mcmFzdHJ1Y3R1cmVNb2RlID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcEJzcy0+SW5mcmFzdHJ1Y3R1cmVNb2RlID0gTmRpczgwMl8xMUlCU1M7Ci0KLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBwb3J0ZWRSYXRlcywgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGUsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuKTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBwb3J0ZWRSYXRlcyArIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5FeHRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5FeHRSYXRlTGVuKTsKLQotICAgICAgICAgICAgICAgIGlmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBCc3MtPklFTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyk7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPklFcywgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5GaXhJRXMsIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpKTsKLSAgICAgICAgICAgICAgICAgICAgcFB0ciA9IHBQdHIgKyBzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEJzcy0+SUVMZW5ndGggPSAoVUxPTkcpKHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuKTsKLSAgICAgICAgICAgICAgICAgICAgcFB0ciA9IHBQdHIgKyBzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+SUVzLCAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkZpeElFcywgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykpOwotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFcywgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuKTsKLSAgICAgICAgICAgICAgICAgICAgcFB0ciArPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBCc3MtPkxlbmd0aCA9IChVTE9ORykoc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykgKyBwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gKyBQYWRkaW5nKTsKLQotI2lmIFdJUkVMRVNTX0VYVCA8IDE3Ci0gICAgICAgICAgICAgICAgaWYgKChCc3NMZW4gKyBwQnNzLT5MZW5ndGgpIDwgd3JxLT51LmRhdGEubGVuZ3RoKQotICAgICAgICAgICAgICAgIEJzc0xlbiArPSBwQnNzLT5MZW5ndGg7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEJzc2lkTGlzdC0+TnVtYmVyT2ZJdGVtcyA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgICAgICAgQnNzTGVuICs9IHBCc3MtPkxlbmd0aDsKLSNlbmRpZgotICAgICAgICAgICAgfQotCi0jaWYgV0lSRUxFU1NfRVhUIDwgMTcKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IEJzc0xlbjsKLSNlbHNlCi0gICAgICAgICAgICBpZiAoQnNzTGVuID4gd3JxLT51LmRhdGEubGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGtmcmVlKHBCc3NpZExpc3QpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gQnNzTGVuOwotI2VuZGlmCi0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEJzc2lkTGlzdCwgQnNzTGVuKTsKLSAgICAgICAgICAgIGtmcmVlKHBCc3NpZExpc3QpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTUzoKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IE1BQ19BRERSX0xFTjsKLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVM6Ci0gICAgICAgICAgICBpZiAocEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpCi0gICAgICAgICAgICAgICAgTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIE1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKLQotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfTUVESUFfU1RBVEUpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZNZWRpYVN0YXRlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRDoKLSAgICAgICAgICAgIGlmIChJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CU1NJRCg9RU1QVFkpXG4iKSk7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT1RDT05OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TU0lEOgotCQkJTmRpc1plcm9NZW1vcnkoJlNzaWQsIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSk7Ci0JCQlOZGlzWmVyb01lbW9yeShTc2lkLlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7Ci0gICAgICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuOwotCQkJbWVtY3B5KFNzaWQuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwJU3NpZC5Tc2lkTGVuZ3RoKTsKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9TU0lEKTsKLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmU3NpZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NTSUQgKExlbj0lZCwgc3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCxTc2lkLlNzaWQpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVM6Ci0gICAgICAgICAgICBwTGlua1N0YXR1cyA9IChSVF84MDJfMTFfTElOS19TVEFUVVMgKikga21hbGxvYyhzaXplb2YoUlRfODAyXzExX0xJTktfU1RBVFVTKSwgTUVNX0FMTE9DX0ZMQUcpOwotICAgICAgICAgICAgaWYgKHBMaW5rU3RhdHVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5DdXJyVHhSYXRlID0gUmF0ZUlkVG81MDBLYnBzW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZV07ICAgLy8gdW5pdCA6IDUwMCBrYnBzCi0gICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPkNoYW5uZWxRdWFsaXR5ID0gcEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5OwotICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5SeEJ5dGVDb3VudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQ7Ci0gICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPlR4Qnl0ZUNvdW50ID0gcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudDsKLQkJCXBMaW5rU3RhdHVzLT5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOwotICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfTElOS19TVEFUVVMpOwotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwTGlua1N0YXR1cywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBrZnJlZShwTGlua1N0YXR1cyk7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVNcbiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVUyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OOgotICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24gPSAoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAqKSBrbWFsbG9jKHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKSwgTUVNX0FMTE9DX0ZMQUcpOwotICAgICAgICAgICAgaWYgKHBDb25maWd1cmF0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5MZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTik7Ci0gICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkJlYWNvblBlcmlvZCA9IHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZDsKLSAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QVRJTVdpbmRvdyA9IHBBZC0+U3RhQWN0aXZlLkF0aW1XaW47Ci0gICAgICAgICAgICAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBDb25maWd1cmF0aW9uLT5EU0NvbmZpZyk7Ci0gICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pOwotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQ29uZmlndXJhdGlvbiwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OKEJlYWNvblBlcmlvZD0lbGQsQXRpbVc9JWxkLENoYW5uZWw9JWQpIFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QmVhY29uUGVyaW9kLCBwQ29uZmlndXJhdGlvbi0+QVRJTVdpbmRvdywgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwotCQkJCWtmcmVlKHBDb25maWd1cmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OKGttYWxsb2MgZmFpbGVkKVxuIikpOwotICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQkJY2FzZSBSVF9PSURfODAyXzExX1NOUl8wOgotCQkJaWYgKChwQWQtPlN0YUNmZy5MYXN0U05SMCA+IDApKQotCQkJewotCQkJCXVsSW5mbyA9ICgoMHhlYgktIHBBZC0+U3RhQ2ZnLkxhc3RTTlIwKSAqIDMpIC8JMTYgOwotCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOwotCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NOUl8wKDB4PSVseClcbiIsIHVsSW5mbykpOwotCQkJfQotICAgICAgICAgICAgZWxzZQotCQkJICAgIFN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJY2FzZSBSVF9PSURfODAyXzExX1NOUl8xOgotCQkJaWYgKChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoCT4gMSkgJiYKLSAgICAgICAgICAgICAgICAocEFkLT5TdGFDZmcuTGFzdFNOUjEgPiAwKSkKLQkJCXsKLQkJCQl1bEluZm8gPSAoKDB4ZWIJLSBwQWQtPlN0YUNmZy5MYXN0U05SMSkgKiAzKSAvCTE2IDsKLQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKLQkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NOUl8xKDB4PSVseClcbiIsdWxJbmZvKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzEocEFkLT5TdGFDZmcuTGFzdFNOUjE9JWQpXG4iLHBBZC0+U3RhQ2ZnLkxhc3RTTlIxKSk7Ci0JCQlicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX1JTU0lfVFJJR0dFUjoKLSAgICAgICAgICAgIHVsSW5mbyA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9SU1NJX1RSSUdHRVIoPSVsZClcbiIsIHVsSW5mbykpOwotICAgICAgICAgICAgYnJlYWs7Ci0JCWNhc2UgT0lEXzgwMl8xMV9SU1NJOgotICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUlNTSToKLQkJCXVsSW5mbyA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwOwotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCWJyZWFrOwotCQljYXNlIFJUX09JRF84MDJfMTFfUlNTSV8xOgotICAgICAgICAgICAgdWxJbmZvID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTE7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SU1NJXzI6Ci0gICAgICAgICAgICB1bEluZm8gPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMjsKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX1NUQVRJU1RJQ1M6Ci0gICAgICAgICAgICBwU3RhdGlzdGljcyA9IChORElTXzgwMl8xMV9TVEFUSVNUSUNTICopIGttYWxsb2Moc2l6ZW9mKE5ESVNfODAyXzExX1NUQVRJU1RJQ1MpLCBNRU1fQUxMT0NfRkxBRyk7Ci0gICAgICAgICAgICBpZiAocFN0YXRpc3RpY3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU1RBVElTVElDUyBcbiIpKTsKLSAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBoL3cgcmF3IGNvdW50ZXJzIGludG8gc29mdHdhcmUgY291bnRlcnMKLQkJCSAgICBOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpOwotCi0gICAgICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIGZvciBjYWxjdWxhdGlvbiBvZiBzdWNlc3NmdWwgY291bnQKLSAgICAgICAgICAgICAgICBpZiAocEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0IDwgcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydCkKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydDsKLQotICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPSBwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7Ci0gICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudC5RdWFkUGFydCA9IHBBZC0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudC5RdWFkUGFydDsKLSAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RmFpbGVkQ291bnQuUXVhZFBhcnQgPSBwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC5RdWFkUGFydDsKLSAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UmV0cnlDb3VudC5RdWFkUGFydCA9IHBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQ7Ci0gICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpcGxlUmV0cnlDb3VudC5RdWFkUGFydCA9IHBBZC0+V2xhbkNvdW50ZXJzLk11bHRpcGxlUmV0cnlDb3VudC5RdWFkUGFydDsKLSAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0ID0gcEFkLT5XbGFuQ291bnRlcnMuUlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0OwotICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SVFNGYWlsdXJlQ291bnQuUXVhZFBhcnQgPSBwQWQtPldsYW5Db3VudGVycy5SVFNGYWlsdXJlQ291bnQuUXVhZFBhcnQ7Ci0gICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkFDS0ZhaWx1cmVDb3VudC5RdWFkUGFydCA9IHBBZC0+V2xhbkNvdW50ZXJzLkFDS0ZhaWx1cmVDb3VudC5RdWFkUGFydDsKLSAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RnJhbWVEdXBsaWNhdGVDb3VudC5RdWFkUGFydCA9IHBBZC0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQuUXVhZFBhcnQ7Ci0gICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA9IHBBZC0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKLSAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+TXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50LlF1YWRQYXJ0ID0gcEFkLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50LlF1YWRQYXJ0OwotI2lmZGVmIERCRwotICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GQ1NFcnJvckNvdW50ID0gcEFkLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQ7Ci0jZWxzZQotICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0ID0gcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC5RdWFkUGFydDsKLSAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RnJhbWVEdXBsaWNhdGVDb3VudC51Lkxvd1BhcnQgPSBwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCAvIDEwMDsKLSNlbmRpZgotICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9TVEFUSVNUSUNTKTsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFN0YXRpc3RpY3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAga2ZyZWUocFN0YXRpc3RpY3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NUQVRJU1RJQ1Moa21hbGxvYyBmYWlsZWQpXG4iKSk7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF9HRU5fUkNWX09LOgotICAgICAgICAgICAgdWxJbmZvID0gcEFkLT5Db3VudGVyczgwMjMuR29vZFJlY2VpdmVzOwotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF9HRU5fUkNWX05PX0JVRkZFUjoKLSAgICAgICAgICAgIHVsSW5mbyA9IHBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7Ci0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QSFlfTU9ERToKLSAgICAgICAgICAgIHVsSW5mbyA9IChVTE9ORylwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOwotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BIWV9NT0RFICg9JWxkKVxuIiwgdWxJbmZvKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1NUQV9DT05GSUc6Ci0gICAgICAgICAgICBwU3RhQ29uZmlnID0gKFJUXzgwMl8xMV9TVEFfQ09ORklHICopIGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9TVEFfQ09ORklHKSwgTUVNX0FMTE9DX0ZMQUcpOwotICAgICAgICAgICAgaWYgKHBTdGFDb25maWcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJR1xuIikpOwotICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkVuYWJsZVR4QnVyc3QgPSBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdDsKLSAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5FbmFibGVUdXJib1JhdGUgPSAwOwotICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlVzZUJHUHJvdGVjdGlvbiA9IHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbjsKLSAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Vc2VTaG9ydFNsb3RUaW1lID0gcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWU7Ci0gICAgICAgICAgICAgICAgLy9wU3RhQ29uZmlnLT5BZGhvY01vZGUgPSBwQWQtPlN0YUNmZy5BZGhvY01vZGU7Ci0gICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+SHdSYWRpb1N0YXR1cyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyA9PSBUUlVFKSA/IDEgOiAwOwotICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlJzdjEgPSAwOwotICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlN5c3RlbUVycm9yQml0bWFwID0gcEFkLT5TeXN0ZW1FcnJvckJpdG1hcDsKLSAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpOwotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwU3RhQ29uZmlnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGtmcmVlKHBTdGFDb25maWcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUcoa21hbGxvYyBmYWlsZWQpXG4iKSk7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRDoKLSAgICAgICAgICAgIFJ0c1RocmVzaCA9IHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZDsKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSdHNUaHJlc2gpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZSdHNUaHJlc2gsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEKD0lbGQpXG4iLCBSdHNUaHJlc2gpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ6Ci0gICAgICAgICAgICBGcmFnVGhyZXNoID0gcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQ7Ci0gICAgICAgICAgICBpZiAocEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9PSBUUlVFKQotICAgICAgICAgICAgICAgIEZyYWdUaHJlc2ggPSAwOwotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEZyYWdUaHJlc2gpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZGcmFnVGhyZXNoLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQoPSVsZClcbiIsIEZyYWdUaHJlc2gpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfUE9XRVJfTU9ERToKLSAgICAgICAgICAgIFBvd2VyTW9kZSA9IHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGU7Ci0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUG93ZXJNb2RlKTsKLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUG93ZXJNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfUE9XRVJfTU9ERSg9JWQpXG4iLCBQb3dlck1vZGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUkFESU86Ci0gICAgICAgICAgICBSYWRpb1N0YXRlID0gKEJPT0xFQU4pIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvOwotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJhZGlvU3RhdGUpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZSYWRpb1N0YXRlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfUkFESU8gKD0lZClcbiIsIFJhZGlvU3RhdGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERToKLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKLSAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUlCU1M7Ci0gICAgICAgICAgICBlbHNlIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKLSAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlOwotICAgICAgICAgICAgZWxzZSBpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfTU9OSVRPUikKLSAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMU1vbml0b3I7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFBdXRvVW5rbm93bjsKLQotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJzc1R5cGUpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZCc3NUeXBlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERSg9JWQpXG4iLCBCc3NUeXBlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BSRUFNQkxFOgotICAgICAgICAgICAgUHJlYW1UeXBlID0gcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZTsKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihQcmVhbVR5cGUpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZQcmVhbVR5cGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUkVBTUJMRSg9JWQpXG4iLCBQcmVhbVR5cGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERToKLSAgICAgICAgICAgIEF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7Ci0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQXV0aE1vZGUpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZBdXRoTW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUoPSVkKVxuIiwgQXV0aE1vZGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfV0VQX1NUQVRVUzoKLSAgICAgICAgICAgIFdlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihXZXBTdGF0dXMpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZXZXBTdGF0dXMsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9XRVBfU1RBVFVTKD0lZClcbiIsIFdlcFN0YXR1cykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTDoKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTCAleFxuIixwQWQtPkNvbW1vbkNmZy5UeFBvd2VyKSk7Ci0JCQlicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzE6Ci0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEgKD0lbGQpXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOwotCQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVTX1NVUFBPUlRFRDoKLQkJCWlmICgocEFkLT5SZkljVHlwZQk9PSBSRklDXzI4NTApIHx8IChwQWQtPlJmSWNUeXBlID09CVJGSUNfMjc1MCkgfHwgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDUyKSkKLQkJCXsKLQkJCQlOZXR3b3JrVHlwZUxpc3RbMF0gPSAzOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyT2ZJdGVtcyA9IDMKLQkJCQlOZXR3b3JrVHlwZUxpc3RbMV0gPSBOZGlzODAyXzExRFM7ICAgICAgLy8gTmV0d29ya1R5cGVbMV0gPSAxMWIKLQkJCQlOZXR3b3JrVHlwZUxpc3RbMl0gPSBOZGlzODAyXzExT0ZETTI0OyAgLy8gTmV0d29ya1R5cGVbMl0gPSAxMWcKLQkJCQlOZXR3b3JrVHlwZUxpc3RbM10gPSBOZGlzODAyXzExT0ZETTU7ICAgLy8gTmV0d29ya1R5cGVbM10gPSAxMWEKLSAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSAxNjsKLQkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk5ldHdvcmtUeXBlTGlzdFswXSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlOZXR3b3JrVHlwZUxpc3RbMF0gPSAyOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyT2ZJdGVtcyA9IDIKLQkJCQlOZXR3b3JrVHlwZUxpc3RbMV0gPSBOZGlzODAyXzExRFM7ICAgICAgLy8gTmV0d29ya1R5cGVbMV0gPSAxMWIKLQkJCQlOZXR3b3JrVHlwZUxpc3RbMl0gPSBOZGlzODAyXzExT0ZETTI0OyAgLy8gTmV0d29ya1R5cGVbMl0gPSAxMWcKLQkJCSAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSAxMjsKLQkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk5ldHdvcmtUeXBlTGlzdFswXSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCX0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX05FVFdPUktfVFlQRVNfU1VQUE9SVEVEXG4iKSk7Ci0JCQkJYnJlYWs7Ci0JICAgIGNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFOgotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpCi0JCQkJdWxJbmZvID0gTmRpczgwMl8xMU9GRE01OwotCQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQkdfTUlYRUQpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUcpKQotCQkJCXVsSW5mbyA9IE5kaXM4MDJfMTFPRkRNMjQ7Ci0JCQllbHNlCi0JCQkJdWxJbmZvID0gTmRpczgwMl8xMURTOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURToKLSAgICAgICAgICAgIHVsSW5mbyA9IChVTE9ORylwQWQtPkxhc3RSeFJhdGU7Ci0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9SWF9SQVRFICg9JWxkKVxuIiwgdWxJbmZvKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfVFhfUkFURToKLQkJCS8vdWxJbmZvID0gKFVMT05HKXBBZC0+TGFzdFR4UmF0ZTsKLQkJCXVsSW5mbyA9IChVTE9ORylwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkOwotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfVFhfUkFURSAoPSVseClcbiIsIHVsSW5mbykpOwotCQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9FRVBST01fVkVSU0lPTjoKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZC0+RWVwcm9tVmVyc2lvbiwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRklSTVdBUkVfVkVSU0lPTjoKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZC0+RmlybXdhcmVWZXJzaW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJYnJlYWs7Ci0JICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9OT0lTRV9MRVZFTDoKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZC0+QmJwV3JpdGVMYXRjaFs2Nl0sIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9OT0lTRV9MRVZFTCAoPSVkKVxuIiwgcEFkLT5CYnBXcml0ZUxhdGNoWzY2XSkpOwotCQkJYnJlYWs7Ci0JICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9FWFRSQV9JTkZPOgotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkLT5FeHRyYUluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9FWFRSQV9JTkZPICg9JWxkKVxuIiwgcEFkLT5FeHRyYUluZm8pKTsKLQkgICAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJUX09JRF9XRV9WRVJTSU9OX0NPTVBJTEVEOgotCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVJTlQpOwotCSAgICAgICAgd2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKLQkgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmd2VfdmVyc2lvbl9jb21waWxlZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkgICAgICAgIGJyZWFrOwotCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9TRVRUSU5HOgotCQkJYXBzZCA9IChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgfCAocEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSA8PCAxKSB8IChwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLIDw8IDIpCi0JCQkJfCAocEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSSA8PCAzKQl8IChwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPIDw8IDQpCXwgKHBBZC0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoIDw8IDUpKTsKLQotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmYXBzZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfU0VUVElORyAoPTB4JWx4LEFQU0RDYXA9JWQsQUNfQkU9JWQsQUNfQks9JWQsQUNfVkk9JWQsQUNfVk89JWQsTUFYU1BMZW49JWQpXG4iLAotCQkJCWFwc2QscEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlLHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUscEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSyxwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJLHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8scEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGgpKTsKLQkJCWJyZWFrOwotCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9QU006Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9QU00gKD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKTsKLQkJCWJyZWFrOwotCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfV01NOgotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJPT0xFQU4pOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX1dNTSAoPSVkKVxuIiwJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKLQkJCWJyZWFrOwotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICAgICAgY2FzZSBSVF9PSURfTkVXX0RSSVZFUjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBVQ0hBUiBlbmFibGVkID0gMTsKLQkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7Ci0JICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmVuYWJsZWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9ORVdfRFJJVkVSICg9JWQpXG4iLCBlbmFibGVkKSk7Ci0gICAgICAgICAgICB9Ci0JICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVDoKLQkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7Ci0JICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAoPSVkKVxuIiwgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7Ci0JICAgICAgICBicmVhazsKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLSAgICAgICAgY2FzZSBSVF9PSURfRFJJVkVSX0RFVklDRV9OQU1FOgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9EUklWRVJfREVWSUNFX05BTUUgXG4iKSk7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxNjsKLQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEFkLT5TdGFDZmcuZGV2X25hbWUsIHdycS0+dS5kYXRhLmxlbmd0aCkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCX0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERToKLSAgICAgICAgICAgIHBIVFBoeU1vZGUgPSAoT0lEX1NFVF9IVF9QSFlNT0RFICopIGttYWxsb2Moc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSksIE1FTV9BTExPQ19GTEFHKTsKLSAgICAgICAgICAgIGlmIChwSFRQaHlNb2RlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBIVFBoeU1vZGUtPlBoeU1vZGUgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOwotCQkJcEhUUGh5TW9kZS0+SHRNb2RlID0gKFVDSEFSKXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREU7Ci0JCQlwSFRQaHlNb2RlLT5CVyA9IChVQ0hBUilwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5CVzsKLQkJCXBIVFBoeU1vZGUtPk1DUz0gKFVDSEFSKXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJCXBIVFBoeU1vZGUtPlNIT1JUR0k9IChVQ0hBUilwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJOwotCQkJcEhUUGh5TW9kZS0+U1RCQz0gKFVDSEFSKXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNUQkM7Ci0KLQkJCXBIVFBoeU1vZGUtPkV4dE9mZnNldCA9ICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSA/IChFWFRDSEFfQkVMT1cpIDogKEVYVENIQV9BQk9WRSkpOwotICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpOwotICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEhUUGh5TW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJfQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERSAoUGh5TW9kZSA9ICVkLCBNQ1MgPSVkLCBCVyA9ICVkLCBTVEJDID0gJWQsIEV4dE9mZnNldD0lZClcbiIsCi0JCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoLndvcmQgPSAleCApXG4iLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTjoKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OIFxuIikpOwotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7Ci0gICAgICAgICAgICB1bEluZm8gPSBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQ7Ci0gICAgICAgICAgICB1bEluZm8gPSAodWxJbmZvIDw8IDgpfChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKSkKLSAgICAgICAgICAgIHsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9EQVRfSFRfUEhZTU9ERToKLSAgICAgICAgICAgIHBIVFBoeU1vZGUgPSAoT0lEX1NFVF9IVF9QSFlNT0RFICopIGttYWxsb2Moc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSksIE1FTV9BTExPQ19GTEFHKTsKLSAgICAgICAgICAgIGlmIChwSFRQaHlNb2RlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBIVFBoeU1vZGUtPlBoeU1vZGUgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOwotCQkJcEhUUGh5TW9kZS0+SHRNb2RlID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREU7Ci0JCQlwSFRQaHlNb2RlLT5CVyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlc7Ci0JCQlwSFRQaHlNb2RlLT5NQ1M9IChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKLQkJCXBIVFBoeU1vZGUtPlNIT1JUR0k9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSTsKLQkJCXBIVFBoeU1vZGUtPlNUQkM9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQzsKLQotICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpOwotICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEhUUGh5TW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJfQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERSAoUGh5TW9kZSA9ICVkLCBNQ1MgPSVkLCBCVyA9ICVkLCBTVEJDID0gJWQsIEV4dE9mZnNldD0lZClcbiIsCi0JCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoLndvcmQgPSAleCApXG4iLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVDoKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7Ci0gICAgICAgICAgICBpID0gMDsKLSNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKLSAgICAgICAgICAgIGkgPSAxOwotI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLwotCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmaSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKLSAgICAgICAgICAgIHsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9RVUVSWV9NVUxUSVBMRV9DQVJEX1NVUFBPUlQoPSVkKSBcbiIsIGkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFNOTVBfU1VQUE9SVAotCQljYXNlIFJUX09JRF84MDJfMTFfTUFDX0FERFJFU1M6Ci0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBNQUNfQUREUl9MRU47Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZC0+Q3VycmVudEFkZHJlc3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJIFxuIikpOwotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gTWFudWZhY3R1cmVyT1VJX0xFTjsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJOQU1FOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVSTkFNRSBcbiIpKTsKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihNYW51ZmFjdHVyZXJOQU1FKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBNYW51ZmFjdHVyZXJOQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRToKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRSBcbiIpKTsKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihSZXNvdXJjZVR5cGVJZE5hbWUpOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIFJlc291cmNlVHlwZUlkTmFtZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQgXG4iKSk7Ci0JCQl1bEluZm8gPSAxOyAvLyAxIGlzIHN1cHBvcnQgd2VwIGVsc2UgMiBpcyBub3Qgc3VwcG9ydC4KLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJUX09JRF84MDJfMTFfUE9XRVJNQU5BR0VNRU5UTU9ERToKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BPV0VSTUFOQUdFTUVOVE1PREUgXG4iKSk7Ci0JCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBTTVBfQUNUSU9OKQotCQkJCXVsSW5mbyA9IDE7IC8vIDEgaXMgcG93ZXIgYWN0aXZlIGVsc2UgMiBpcyBwb3dlciBzYXZlLgotCQkJZWxzZQotCQkJCXVsSW5mbyA9IDI7Ci0KLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlicmVhazsKLQotCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFIFxuIikpOwotCQkJLy9LZXlJZHhWYWx1ZS5LZXlJZHggPSBwQWQtPlBvcnRDZmcuTUJTU0lEW3BBZC0+SW9jdGxJRl0uRGVmYXVsdEtleUlkOwotCQkJcEtleUlkeFZhbHVlID0gd3JxLT51LmRhdGEucG9pbnRlcjsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiS2V5SWR4VmFsdWUuS2V5SWR4ID0gJWQsIFxuIixwS2V5SWR4VmFsdWUtPktleUlkeCkpOwotCQkJdmFsdWVMZW4gPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbjsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBLZXlJZHhWYWx1ZS0+VmFsdWUsCi0JCQkJCQkgICAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCi0JCQkJCQkgICB2YWx1ZUxlbik7Ci0JCQlwS2V5SWR4VmFsdWUtPlZhbHVlW3ZhbHVlTGVuXT0nXDAnOwotCi0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoRGVmYXVsdEtleUlkeFZhbHVlKTsKLQotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBLZXlJZHhWYWx1ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRGVmYXVsdEtleUlkID0gJWQsIHRvdGFsIGxlbiA9ICVkLCBzdHIgbGVuPSVkLCBLZXlWYWx1ZT0gJTAyeCAlMDJ4ICUwMnggJTAyeCBcbiIsCi0JCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAotCQkJCQkJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCwKLQkJCQkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiwKLQkJCQkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlbMF0sCi0JCQkJCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5WzBdLAotCQkJCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzJdLktleVswXSwKLQkJCQkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVszXS5LZXlbMF0pKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQgXG4iKSk7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZWZhdWx0S2V5SWQgPSVkIFxuIiwgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1dFUEtFWU1BUFBJTkdMRU5HVEggXG4iKSk7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsCi0JCQkJCQkJCQkmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4sCi0JCQkJCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVCBcbiIpKTsKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOwotCQkJU2hvcnRSZXRyeUxpbWl0ID0gdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0OwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2hvcnRSZXRyeUxpbWl0ID0lbGQsICB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UmV0cnlMaW1pdD0lZFxuIiwgU2hvcnRSZXRyeUxpbWl0LCB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQpKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmU2hvcnRSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgXG4iKSk7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOwotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKLQkJCUxvbmdSZXRyeUxpbWl0ID0gdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQ7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMb25nUmV0cnlMaW1pdCA9JWxkLCAgdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQ9JWRcbiIsIExvbmdSZXRyeUxpbWl0LCB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCkpOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZMb25nUmV0cnlMaW1pdCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9QUk9EVUNUSUQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUk9EVUNUSUQgXG4iKSk7Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJCXsKLQotCQkJCVVTSE9SVCAgZGV2aWNlX2lkOwotCQkJCWlmICgoKFBPU19DT09LSUUpcEFkLT5PU19Db29raWUpLT5wY2lfZGV2ICE9IE5VTEwpCi0JCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoKChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llKS0+cGNpX2RldiwgUENJX0RFVklDRV9JRCwgJmRldmljZV9pZCk7Ci0JCQkJZWxzZQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcGNpX2RldiA9IE5VTExcbiIpKTsKLQkJCQlzcHJpbnRmKChQU1RSSU5HKXRtcCwgIiUwNHggJTA0eFxuIiwgTklDX1BDSV9WRU5ET1JfSUQsIGRldmljZV9pZCk7Ci0JCQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oKFBTVFJJTkcpdG1wKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCB0bXAsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVJRDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX01BTlVGQUNUVVJFSUQgXG4iKSk7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oTWFudWZhY3R1cmVyTkFNRSk7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgTWFudWZhY3R1cmVyTkFNRSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgT0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMIFxuIikpOwotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInNpemVvZiBVQ0hBUj0lZCwgY2hhbm5lbD0lZCBcbiIsIHNpemVvZihVQ0hBUiksIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7Ci0JCQlicmVhazsKLSNlbmRpZiAvL1NOTVBfU1VQUE9SVAotCi0JCWNhc2UgT0lEXzgwMl8xMV9CVUlMRF9DSEFOTkVMX0VYOgotCQkJewotCQkJCVVDSEFSIHZhbHVlOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JVSUxEX0NIQU5ORUxfRVggXG4iKSk7Ci0JCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKLSNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3VwcG9ydCBFWFRfQlVJTERfQ0hBTk5FTF9MSVNULlxuIikpOwotCQkJCXZhbHVlID0gMTsKLSNlbHNlCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRG9lc24ndCBzdXBwb3J0IEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QuXG4iKSk7Ci0JCQkJdmFsdWUgPSAwOwotI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KLQkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnZhbHVlLCAxKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPSURfODAyXzExX0dFVF9DSF9MSVNUOgotCQkJewotCQkJCVBSVF9DSEFOTkVMX0xJU1RfSU5GTyBwQ2hMaXN0QnVmOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfR0VUX0NIX0xJU1QgXG4iKSk7Ci0JCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3ROdW0gPT0gMCkKLQkJCQl7Ci0JCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCXBDaExpc3RCdWYgPSAoUlRfQ0hBTk5FTF9MSVNUX0lORk8gKikga21hbGxvYyhzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pLCBNRU1fQUxMT0NfRkxBRyk7Ci0JCQkJaWYgKHBDaExpc3RCdWYgPT0gTlVMTCkKLQkJCQl7Ci0JCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCXBDaExpc3RCdWYtPkNoYW5uZWxMaXN0TnVtID0gcEFkLT5DaGFubmVsTGlzdE51bTsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3ROdW07IGkrKykKLQkJCQkJcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3RbaV0gPSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWw7Ci0KLQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pOwotCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQ2hMaXN0QnVmLCBzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOwotCi0JCQkJaWYgKHBDaExpc3RCdWYpCi0JCQkJCWtmcmVlKHBDaExpc3RCdWYpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPSURfODAyXzExX0dFVF9DT1VOVFJZX0NPREU6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ09VTlRSWV9DT0RFIFxuIikpOwotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMjsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUsIDIpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgT0lEXzgwMl8xMV9HRVRfQ0hBTk5FTF9HRU9HUkFQSFk6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ0hBTk5FTF9HRU9HUkFQSFkgXG4iKSk7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHksIDEpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKLQkJCWJyZWFrOwotCi0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RMUzoKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihCT09MRUFOKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9ETFMoPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9ETFNfUEFSQU06Ci0JCQl7Ci0JCQkJUFJUXzgwMl8xMV9ETFNfSU5GTwlwRGxzSW5mbyA9IGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9ETFNfSU5GTyksIEdGUF9BVE9NSUMpOwotCQkJCWlmIChwRGxzSW5mbyA9PSBOVUxMKQotCQkJCQlicmVhazsKLQotCQkJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCi0JCQkJewotCQkJCQlSVE1QTW92ZU1lbW9yeSgmcERsc0luZm8tPkVudHJ5W2ldLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHNpemVvZihSVF84MDJfMTFfRExTX1VJKSk7Ci0JCQkJfQotCi0JCQkJcERsc0luZm8tPm51bSA9IE1BWF9OVU1fT0ZfRExTX0VOVFJZOwotCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfRExTX0lORk8pOwotCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwRGxzSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9ETFNfUEFSQU1cbiIpKTsKLQotCQkJCWlmIChwRGxzSW5mbykKLQkJCQkJa2ZyZWUocERsc0luZm8pOwotCQkJfQotCQkJYnJlYWs7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQkJY2FzZSBPSURfODAyXzExX1NFVF9QU1BYTElOS19NT0RFOgotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJPT0xFQU4pOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPkNvbW1vbkNmZy5QU1BYbGluaywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NFVF9QU1BYTElOS19NT0RFKD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBTUFhsaW5rKSk7Ci0JCQlicmVhazsKLQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6dW5rbm93biBJT0NUTCdzIHN1YmNtZCA9IDB4JTA4eFxuIiwgY21kKSk7Ci0gICAgICAgICAgICBTdGF0dXMgPSAtRU9QTk9UU1VQUDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOwotfQotCi1JTlQgcnQyOHh4X3N0YV9pb2N0bCgKLQlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKLQlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKLQlJTglJTlQJCQkJCWNtZCkKLXsKLQlQT1NfQ09PS0lFCQkJcE9iajsKLQlSVE1QX0FEQVBURVIgICAgICAgICpwQWQgPSBOVUxMOwotCXN0cnVjdCBpd3JlcSAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7Ci0JQk9PTEVBTgkJCQlTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7Ci0JSU5UCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCVVTSE9SVAkJCQlzdWJjbWQ7Ci0KLQotCXBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKG5ldF9kZXYpOwotCWlmIChwQWQgPT0gTlVMTCkKLQl7Ci0JCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7Ci0JCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLSAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotICAgIHsKLSNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAotCSAgICBpZiAod3JxLT51LmRhdGEucG9pbnRlciA9PSBOVUxMKQotCSAgICB7Ci0JCSAgICByZXR1cm4gU3RhdHVzOwotCSAgICB9Ci0KLQkgICAgaWYgKHN0cnN0cih3cnEtPnUuZGF0YS5wb2ludGVyLCAiT3BNb2RlIikgPT0gTlVMTCkKLSNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLwotCQl7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JCSAgICByZXR1cm4gLUVORVRET1dOOwotICAgICAgICB9Ci0gICAgfQotCi0JewkvLyBkZXRlcm1pbmUgdGhpcyBpb2N0bCBjb21tYW5kIGlzIGNvbW1pbmcgZnJvbSB3aGljaCBpbnRlcmZhY2UuCi0JCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKLQkJcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKLQl9Ci0KLQlzd2l0Y2goY21kKQotCXsKLSNpZmRlZiBSQUxJTktfQVRFCi0jaWZkZWYgUkFMSU5LXzI4eHhfUUEKLQkJY2FzZSBSVFBSSVZfSU9DVExfQVRFOgotCQkJewotCQkJCVJ0bXBEb0F0ZShwQWQsIHdycSk7Ci0JCQl9Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLSAgICAgICAgY2FzZSBTSU9DR0lGSFdBRERSOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NHSUZIV0FERFJcbiIpKTsKLQkJCW1lbWNweSh3cnEtPnUubmFtZSwgcEFkLT5DdXJyZW50QWRkcmVzcywgRVRIX0FMRU4pOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0lPQ0dJV05BTUU6Ci0gICAgICAgIHsKLQkJY2hhciAqbmFtZT0md3JxLT51Lm5hbWVbMF07Ci0JCXJ0X2lvY3RsX2dpd25hbWUobmV0X2RldiwgTlVMTCwgbmFtZSwgTlVMTCk7Ci0gICAgICAgICAgICBicmVhazsKLQkJfQotCQljYXNlIFNJT0NHSVdFU1NJRDogIC8vR2V0IEVTU0lECi0gICAgICAgIHsKLQkJc3RydWN0IGl3X3BvaW50ICplc3NpZD0md3JxLT51LmVzc2lkOwotCQlydF9pb2N0bF9naXdlc3NpZChuZXRfZGV2LCBOVUxMLCBlc3NpZCwgZXNzaWQtPnBvaW50ZXIpOwotICAgICAgICAgICAgYnJlYWs7Ci0JCX0KLQkJY2FzZSBTSU9DU0lXRVNTSUQ6ICAvL1NldCBFU1NJRAotCQl7Ci0JCXN0cnVjdCBpd19wb2ludAkqZXNzaWQ9JndycS0+dS5lc3NpZDsKLQkJcnRfaW9jdGxfc2l3ZXNzaWQobmV0X2RldiwgTlVMTCwgZXNzaWQsIGVzc2lkLT5wb2ludGVyKTsKLSAgICAgICAgICAgIGJyZWFrOwotCQl9Ci0JCWNhc2UgU0lPQ1NJV05XSUQ6ICAgLy8gc2V0IG5ldHdvcmsgaWQgKHRoZSBjZWxsKQotCQljYXNlIFNJT0NHSVdOV0lEOiAgIC8vIGdldCBuZXR3b3JrIGlkCi0JCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKLQkJCWJyZWFrOwotCQljYXNlIFNJT0NTSVdGUkVROiAgIC8vc2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikKLQkJewotCQlzdHJ1Y3QgaXdfZnJlcSAqZnJlcT0md3JxLT51LmZyZXE7Ci0JCXJ0X2lvY3RsX3Npd2ZyZXEobmV0X2RldiwgTlVMTCwgZnJlcSwgTlVMTCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNJT0NHSVdGUkVROiAgIC8vIGdldCBjaGFubmVsL2ZyZXF1ZW5jeSAoSHopCi0JCXsKLQkJc3RydWN0IGl3X2ZyZXEgKmZyZXE9JndycS0+dS5mcmVxOwotCQlydF9pb2N0bF9naXdmcmVxKG5ldF9kZXYsIE5VTEwsIGZyZXEsIE5VTEwpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTSU9DU0lXTklDS046IC8vc2V0IG5vZGUgbmFtZS9uaWNrbmFtZQotCQl7Ci0JCS8vc3RydWN0IGl3X3BvaW50ICpkYXRhPSZ3cnEtPnUuZGF0YTsKLQkJLy9ydF9pb2N0bF9zaXduaWNrbihuZXRfZGV2LCBOVUxMLCBkYXRhLCBOVUxMKTsKLQkJCWJyZWFrOwotCQkJfQotCQljYXNlIFNJT0NHSVdOSUNLTjogLy9nZXQgbm9kZSBuYW1lL25pY2tuYW1lCi0gICAgICAgIHsKLQkJCXN0cnVjdCBpd19wb2ludAkqZXJxID0gTlVMTDsKLQkJZXJxID0gJndycS0+dS5kYXRhOwotICAgICAgICAgICAgZXJxLT5sZW5ndGggPSBzdHJsZW4oKFBTVFJJTkcpIHBBZC0+bmlja25hbWUpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKGVycS0+cG9pbnRlciwgcEFkLT5uaWNrbmFtZSwgZXJxLT5sZW5ndGgpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTSU9DR0lXUkFURTogICAvL2dldCBkZWZhdWx0IGJpdCByYXRlIChicHMpCi0JCSAgICBydF9pb2N0bF9naXdyYXRlKG5ldF9kZXYsIE5VTEwsICZ3cnEtPnUsIE5VTEwpOwotICAgICAgICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU0lPQ1NJV1JBVEU6ICAvL3NldCBkZWZhdWx0IGJpdCByYXRlIChicHMpCi0JICAgICAgICBydF9pb2N0bF9zaXdyYXRlKG5ldF9kZXYsIE5VTEwsICZ3cnEtPnUsIE5VTEwpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0lPQ0dJV1JUUzogIC8vIGdldCBSVFMvQ1RTIHRocmVzaG9sZCAoYnl0ZXMpCi0JCXsKLQkJc3RydWN0IGl3X3BhcmFtICpydHM9JndycS0+dS5ydHM7Ci0JCXJ0X2lvY3RsX2dpd3J0cyhuZXRfZGV2LCBOVUxMLCBydHMsIE5VTEwpOwotICAgICAgICAgICAgYnJlYWs7Ci0JCX0KLSAgICAgICAgY2FzZSBTSU9DU0lXUlRTOiAgLy9zZXQgUlRTL0NUUyB0aHJlc2hvbGQgKGJ5dGVzKQotCQl7Ci0JCXN0cnVjdCBpd19wYXJhbSAqcnRzPSZ3cnEtPnUucnRzOwotCQlydF9pb2N0bF9zaXdydHMobmV0X2RldiwgTlVMTCwgcnRzLCBOVUxMKTsKLSAgICAgICAgICAgIGJyZWFrOwotCQl9Ci0gICAgICAgIGNhc2UgU0lPQ0dJV0ZSQUc6ICAvL2dldCBmcmFnbWVudGF0aW9uIHRociAoYnl0ZXMpCi0JCXsKLQkJc3RydWN0IGl3X3BhcmFtICpmcmFnPSZ3cnEtPnUuZnJhZzsKLQkJcnRfaW9jdGxfZ2l3ZnJhZyhuZXRfZGV2LCBOVUxMLCBmcmFnLCBOVUxMKTsKLSAgICAgICAgICAgIGJyZWFrOwotCQl9Ci0gICAgICAgIGNhc2UgU0lPQ1NJV0ZSQUc6ICAvL3NldCBmcmFnbWVudGF0aW9uIHRociAoYnl0ZXMpCi0JCXsKLQkJc3RydWN0IGl3X3BhcmFtICpmcmFnPSZ3cnEtPnUuZnJhZzsKLQkJcnRfaW9jdGxfc2l3ZnJhZyhuZXRfZGV2LCBOVUxMLCBmcmFnLCBOVUxMKTsKLSAgICAgICAgICAgIGJyZWFrOwotCQl9Ci0gICAgICAgIGNhc2UgU0lPQ0dJV0VOQ09ERTogIC8vZ2V0IGVuY29kaW5nIHRva2VuICYgbW9kZQotCQl7Ci0JCXN0cnVjdCBpd19wb2ludCAqZXJxPSZ3cnEtPnUuZW5jb2Rpbmc7Ci0JCWlmKGVycSkKLQkJCXJ0X2lvY3RsX2dpd2VuY29kZShuZXRfZGV2LCBOVUxMLCBlcnEsIGVycS0+cG9pbnRlcik7Ci0gICAgICAgICAgICBicmVhazsKLQkJfQotICAgICAgICBjYXNlIFNJT0NTSVdFTkNPREU6ICAvL3NldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUKLQkJewotCQlzdHJ1Y3QgaXdfcG9pbnQgKmVycT0md3JxLT51LmVuY29kaW5nOwotCQlpZihlcnEpCi0JCQlydF9pb2N0bF9zaXdlbmNvZGUobmV0X2RldiwgTlVMTCwgZXJxLCBlcnEtPnBvaW50ZXIpOwotICAgICAgICAgICAgYnJlYWs7Ci0JCX0KLQkJY2FzZSBTSU9DR0lXQVA6ICAgICAvL2dldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcwotCQl7Ci0JCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkcj0md3JxLT51LmFwX2FkZHI7Ci0JCXJ0X2lvY3RsX2dpd2FwKG5ldF9kZXYsIE5VTEwsIGFwX2FkZHIsIGFwX2FkZHItPnNhX2RhdGEpOwotCQkJYnJlYWs7Ci0JCX0KLQkgICAgY2FzZSBTSU9DU0lXQVA6ICAvL3NldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcwotCQl7Ci0JCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkcj0md3JxLT51LmFwX2FkZHI7Ci0JCXJ0X2lvY3RsX3Npd2FwKG5ldF9kZXYsIE5VTEwsIGFwX2FkZHIsIGFwX2FkZHItPnNhX2RhdGEpOwotICAgICAgICAgICAgYnJlYWs7Ci0JCX0KLQkJY2FzZSBTSU9DR0lXTU9ERTogICAvL2dldCBvcGVyYXRpb24gbW9kZQotCQl7Ci0JCV9fdTMyICptb2RlPSZ3cnEtPnUubW9kZTsKLQkJcnRfaW9jdGxfZ2l3bW9kZShuZXRfZGV2LCBOVUxMLCBtb2RlLCBOVUxMKTsKLSAgICAgICAgICAgIGJyZWFrOwotCQl9Ci0JCWNhc2UgU0lPQ1NJV01PREU6ICAgLy9zZXQgb3BlcmF0aW9uIG1vZGUKLQkJewotCQlfX3UzMiAqbW9kZT0md3JxLT51Lm1vZGU7Ci0JCXJ0X2lvY3RsX3Npd21vZGUobmV0X2RldiwgTlVMTCwgbW9kZSwgTlVMTCk7Ci0gICAgICAgICAgICBicmVhazsKLQkJfQotCQljYXNlIFNJT0NHSVdTRU5TOiAgIC8vZ2V0IHNlbnNpdGl2aXR5IChkQm0pCi0JCWNhc2UgU0lPQ1NJV1NFTlM6CS8vc2V0IHNlbnNpdGl2aXR5IChkQm0pCi0JCWNhc2UgU0lPQ0dJV1BPV0VSOiAgLy9nZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncwotCQljYXNlIFNJT0NTSVdQT1dFUjogIC8vc2V0IFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZ3MKLQkJY2FzZSBTSU9DR0lXVFhQT1c6ICAvL2dldCB0cmFuc21pdCBwb3dlciAoZEJtKQotCQljYXNlIFNJT0NTSVdUWFBPVzogIC8vc2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pCi0JCWNhc2UgU0lPQ0dJV1JBTkdFOgkvL0dldCByYW5nZSBvZiBwYXJhbWV0ZXJzCi0JCWNhc2UgU0lPQ0dJV1JFVFJZOgkvL2dldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCi0JCWNhc2UgU0lPQ1NJV1JFVFJZOgkvL3NldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCi0JCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKLQkJCWJyZWFrOwotCQljYXNlIFJUX1BSSVZfSU9DVEw6Ci0gICAgICAgIGNhc2UgUlRfUFJJVl9JT0NUTF9FWFQ6Ci0JCQlzdWJjbWQgPSB3cnEtPnUuZGF0YS5mbGFnczsKLQkJCWlmKCBzdWJjbWQgJiBPSURfR0VUX1NFVF9UT0dHTEUpCi0JCQkJU3RhdHVzID0gUlRNUFNldEluZm9ybWF0aW9uKHBBZCwgcnEsIHN1YmNtZCk7Ci0JCQllbHNlCi0JCQkJU3RhdHVzID0gUlRNUFF1ZXJ5SW5mb3JtYXRpb24ocEFkLCBycSwgc3ViY21kKTsKLQkJCWJyZWFrOwotCQljYXNlIFNJT0NHSVdQUklWOgotCQkJaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIpCi0JCQl7Ci0JCQkJaWYgKCBhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YocHJpdnRhYikpICE9IFRSVUUpCi0JCQkJCWJyZWFrOwotCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwcml2dGFiKSAvIHNpemVvZihwcml2dGFiWzBdKTsKLQkJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHByaXZ0YWIsIHNpemVvZihwcml2dGFiKSkpCi0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBSVFBSSVZfSU9DVExfU0VUOgotCQkJaWYoYWNjZXNzX29rKFZFUklGWV9SRUFELCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpICE9IFRSVUUpCi0JCQkJCWJyZWFrOwotCQkJcnRfaW9jdGxfc2V0cGFyYW0obmV0X2RldiwgTlVMTCwgTlVMTCwgd3JxLT51LmRhdGEucG9pbnRlcik7Ci0JCQlicmVhazsKLQkJY2FzZSBSVFBSSVZfSU9DVExfR1NJVEVTVVJWRVk6Ci0JCQlSVE1QSW9jdGxHZXRTaXRlU3VydmV5KHBBZCwgd3JxKTsKLQkJICAgIGJyZWFrOwotI2lmZGVmIERCRwotCQljYXNlIFJUUFJJVl9JT0NUTF9NQUM6Ci0JCQlSVE1QSW9jdGxNQUMocEFkLCB3cnEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUlRQUklWX0lPQ1RMX0UyUDoKLQkJCVJUTVBJb2N0bEUyUFJPTShwQWQsIHdycSk7Ci0JCQlicmVhazsKLSNpZmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLQkJY2FzZSBSVFBSSVZfSU9DVExfUkY6Ci0JCQlSVE1QSW9jdGxSRihwQWQsIHdycSk7Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBEQkcgLy8KLQotICAgICAgICBjYXNlIFNJT0NFVEhUT09MOgotICAgICAgICAgICAgICAgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiSU9DVEw6OnVua25vd24gSU9DVEwncyBjbWQgPSAweCUwOHhcbiIsIGNtZCkpOwotCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7Ci0JCQlicmVhazsKLQl9Ci0KLSAgICBpZihTdGF0ZU1hY2hpbmVUb3VjaGVkKSAvLyBVcHBlciBsYXllciBzZW50IGEgTUxNRS1yZWxhdGVkIG9wZXJhdGlvbnMKLQlSVE1QX01MTUVfSEFORExFUihwQWQpOwotCi0JcmV0dXJuIFN0YXR1czsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgU1NJRAotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9TU0lEX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpCi17Ci0gICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZCwgKnBTc2lkPU5VTEw7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IEZBTFNFOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBUUlVFOwotCi0gICAgaWYoIHN0cmxlbihhcmcpIDw9IE1BWF9MRU5fT0ZfU1NJRCkKLSAgICB7Ci0gICAgICAgIE5kaXNaZXJvTWVtb3J5KCZTc2lkLCBzaXplb2YoTkRJU184MDJfMTFfU1NJRCkpOwotICAgICAgICBpZiAoc3RybGVuKGFyZykgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoU3NpZC5Tc2lkLCBhcmcsIHN0cmxlbihhcmcpKTsKLSAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IHN0cmxlbihhcmcpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgICAvL0FOWSBzc2lkCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IDA7Ci0JICAgIG1lbWNweShTc2lkLlNzaWQsICIiLCAwKTsKLQkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOwotCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKLQl9Ci0gICAgICAgIHBTc2lkID0gJlNzaWQ7Ci0KLSAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJUTVBfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKLSAgICAgICAgfQotCi0JCWlmICgocEFkYXB0ZXItPlN0YUNmZy5XcGFQYXNzUGhyYXNlTGVuID49IDgpICYmCi0JCQkocEFkYXB0ZXItPlN0YUNmZy5XcGFQYXNzUGhyYXNlTGVuIDw9IDY0KSkKLQkJewotCQkJU1RSSU5HIHBhc3NwaHJhc2Vfc3RyWzY1XSA9IHswfTsKLQkJCVVDSEFSIGtleU1hdGVyaWFsWzQwXTsKLQotCQkJUlRNUE1vdmVNZW1vcnkocGFzc3BocmFzZV9zdHIsIHBBZGFwdGVyLT5TdGFDZmcuV3BhUGFzc1BocmFzZSwgcEFkYXB0ZXItPlN0YUNmZy5XcGFQYXNzUGhyYXNlTGVuKTsKLQkJCVJUTVBaZXJvTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCAzMik7Ci0JCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFQYXNzUGhyYXNlTGVuID09IDY0KQotCQkJewotCQkJICAgIEF0b0goKFBTVFJJTkcpIHBBZGFwdGVyLT5TdGFDZmcuV3BhUGFzc1BocmFzZSwgcEFkYXB0ZXItPlN0YUNmZy5QTUssIDMyKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCSAgICBQYXNzd29yZEhhc2goKFBTVFJJTkcpIHBBZGFwdGVyLT5TdGFDZmcuV3BhUGFzc1BocmFzZSwgU3NpZC5Tc2lkLCBTc2lkLlNzaWRMZW5ndGgsIGtleU1hdGVyaWFsKTsKLQkJCSAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKLQkJCX0KLQkJfQotCi0gICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gVFJVRTsKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7Ci0JCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7Ci0KLSAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX1NTSUQsCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSwKLSAgICAgICAgICAgICAgICAgICAgKFZPSUQgKilwU3NpZCk7Ci0KLSAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9TU0lEX1Byb2M6OihMZW49JWQsU3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCwgU3NpZC5Tc2lkKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgc3VjY2VzcyA9IEZBTFNFOwotCi0gICAgaWYgKFN0YXRlTWFjaGluZVRvdWNoZWQpIC8vIFVwcGVyIGxheWVyIHNlbnQgYSBNTE1FLXJlbGF0ZWQgb3BlcmF0aW9ucwotCVJUTVBfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKLQotICAgIHJldHVybiBzdWNjZXNzOwotfQotCi0jaWZkZWYgV01NX1NVUFBPUlQKLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdtbUNhcGFibGUgRW5hYmxlIG9yIERpc2FibGUKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfV21tQ2FwYWJsZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JQk9PTEVBTgliV21tQ2FwYWJsZTsKLQotCWJXbW1DYXBhYmxlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmICgoYldtbUNhcGFibGUgPT0gMSkKLQkJKQotCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IFRSVUU7Ci0JZWxzZSBpZiAoYldtbUNhcGFibGUgPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBGQUxTRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dtbUNhcGFibGVfUHJvYzo6KGJXbW1DYXBhYmxlPSVkKVxuIiwKLQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIFdNTV9TVVBQT1JUIC8vCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IE5ldHdvcmsgVHlwZShJbmZyYXN0cnVjdHVyZS9BZGhvYyBtb2RlKQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9OZXR3b3JrVHlwZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKQotewotICAgIFVJTlQzMglWYWx1ZSA9IDA7Ci0KLSAgICBpZiAoc3RyY21wKGFyZywgIkFkaG9jIikgPT0gMCkKLQl7Ci0JCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0FESE9DKQotCQl7Ci0JCQkvLyBDb25maWcgaGFzIGNoYW5nZWQKLQkJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7Ci0gICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7Ci0gICAgICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJCQlWYWx1ZSAmPSAofjB4ODApOwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOwotICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7Ci0gICAgICAgICAgICB9Ci0JCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQotCQkJewotCQkJCS8vQk9PTEVBTiBDYW5jZWxsZWQ7Ci0JCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAotCQkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KLQkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7Ci0JCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKLQotCQkJCUxpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7Ci0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEJCIVxuIikpOwotCQkJfQotCQl9Ci0JCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19BREhPQzsKLSAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KEFELUhPQylcbiIpKTsKLQl9Ci0gICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIkluZnJhIikgPT0gMCkKLQl7Ci0JCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0lORlJBKQotCQl7Ci0JCQkvLyBDb25maWcgaGFzIGNoYW5nZWQKLQkJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7Ci0gICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7Ci0gICAgICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJCQlWYWx1ZSAmPSAofjB4ODApOwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOwotICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7Ci0gICAgICAgICAgICB9Ci0JCQlpZiAoQURIT0NfT04ocEFkYXB0ZXIpKQotCQkJewotCQkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKLQkJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCi0JCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOwotCQkJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7Ci0KLQkJCQlMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOwotCQkJfQotCQl9Ci0JCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKLSAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KElORlJBKVxuIikpOwotCX0KLSAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiTW9uaXRvciIpID09IDApCi0gICAgewotCQkJVUNIQVIJYmJwVmFsdWUgPSAwOwotCQkJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKLQkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfSU5GUkFfT04pOwotICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19BREhPQ19PTik7Ci0JCQlPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotCQkJLy8gZGlzYWJsZSBhbGwgcGVyaW9kaWMgc3RhdGUgbWFjaGluZQotCQkJcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IEZBTFNFOwotCQkJLy8gcmVzZXQgYWxsIG1sbWUgc3RhdGUgbWFjaGluZQotCQkJUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQgXG4iKSk7Ci0gICAgICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9PSAwKQotICAgICAgICAgICAgewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSAzNjsKLSAgICAgICAgICAgICAgICBlbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSA2OwotICAgICAgICAgICAgfQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIE5fQ2hhbm5lbENoZWNrKHBBZGFwdGVyKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDAgJiYKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0FCT1ZFKQotCQkJewotCQkJCS8vIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKLQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKLQkJCQliYnBWYWx1ZSAmPSAofjB4MTgpOwotCQkJCWJicFZhbHVlIHw9IDB4MTA7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7Ci0JCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKLQkJCQkvLyAgUlggOiBjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKLQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgJmJicFZhbHVlKTsKLQkJCQliYnBWYWx1ZSAmPSAofjB4MjApOwotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgYmJwVmFsdWUpOwotCi0JCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOwotCQkJCVZhbHVlICY9IDB4ZmZmZmZmZmU7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgVmFsdWUpOwotCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOwotICAgICAgICAgICAgICAgIEFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCQkgICAgQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCAsY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOwotCQkJfQotCQkJZWxzZSBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKLSAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwICYmCi0gICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0JFTE9XKQotCQkJewotCQkJCS8vIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgdXBwZXIKLQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKLQkJCQliYnBWYWx1ZSAmPSAofjB4MTgpOwotCQkJCWJicFZhbHVlIHw9IDB4MTA7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7Ci0JCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKLQkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsICZWYWx1ZSk7Ci0JCQkJVmFsdWUgfD0gMHgxOwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsIFZhbHVlKTsKLQotCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCAmYmJwVmFsdWUpOwotCQkJCWJicFZhbHVlIHw9ICgweDIwKTsKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsIGJicFZhbHVlKTsKLQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKLSAgICAgICAgICAgICAgICBBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwotCQkJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfNDAgLGNvbnRyb2xfY2hhbm5lbCglZCksIENlbnRyYWxDaGFubmVsKCVkKSBcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKLQkJCX0KLQkJCWVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCXsKLQkJCQkvLyAyME1IegotCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOwotCQkJCWJicFZhbHVlICY9ICh+MHgxOCk7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7Ci0JCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKLSAgICAgICAgICAgICAgICBBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQkgICAgQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzIwLCBDaGFubmVsKCVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7Ci0JCQl9Ci0JCQkvLyBFbmFibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24KLQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCAweDMpOwotCQkJLy8gQVNJQyBzdXBwb3JzdHMgc25pZmZlciBmdW5jdGlvbiB3aXRoIHJlcGxhY2luZyBSU1NJIHdpdGggdGltZXN0YW1wLgotCQkJLy9SVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQkJLy9WYWx1ZSB8PSAoMHg4MCk7Ci0JCQkvL1JUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0JCQkvLyBkaXNhYmxlIHN5bmMKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7Ci0JCQljc3IuZmllbGQuYkJlYWNvbkdlbiA9IDA7Ci0JCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAwOwotCQkJY3NyLmZpZWxkLlRzZlN5bmNNb2RlID0gMDsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgQkNOX1RJTUVfQ0ZHLCBjc3Iud29yZCk7Ci0KLQkJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19NT05JVE9SOwotICAgICAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNOyAvL0FSUEhSRF9JRUVFODAyMTE7IC8vIElFRUU4MDIxMQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooTU9OSVRPUilcbiIpKTsKLSAgICB9Ci0KLSAgICAvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5Ci0gICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooTmV0d29ya1R5cGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUpKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBBdXRoZW50aWNhdGlvbiBtb2RlCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0F1dGhNb2RlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpCi17Ci0gICAgaWYgKChzdHJjbXAoYXJnLCAiV0VQQVVUTyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid2VwYXV0byIpID09IDApKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaDsKLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIk9QRU4iKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIm9wZW4iKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0gICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJTSEFSRUQiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgInNoYXJlZCIpID09IDApKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOwotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGFwc2siKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQU5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYW5vbmUiKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7Ci0gICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEyUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEycHNrIikgPT0gMCkpCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOwotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhIikgPT0gMCkpCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7Ci0gICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEyIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEyIikgPT0gMCkpCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQXV0aE1vZGVfUHJvYzo6KEF1dGhNb2RlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEVuY3J5cHRpb24gVHlwZQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9FbmNyeXBUeXBlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpCi17Ci0gICAgaWYgKChzdHJjbXAoYXJnLCAiTk9ORSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAibm9uZSIpID09IDApKQotICAgIHsKLSAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKLQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotICAgIH0KLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldFUCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid2VwIikgPT0gMCkpCi0gICAgewotICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLQkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiVEtJUCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAidGtpcCIpID09IDApKQotICAgIHsKLSAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiQUVTIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJhZXMiKSA9PSAwKSkKLSAgICB7Ci0gICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKLQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0VuY3J5cFR5cGVfUHJvYzo6KEVuY3J5cFR5cGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cykpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IERlZmF1bHQgS2V5IElECi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0RlZmF1bHRLZXlJRF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKQotewotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUlkeDsKLQotICAgIEtleUlkeCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0gICAgaWYoKEtleUlkeCA+PSAxICkgJiYgKEtleUlkeCA8PSA0KSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIChLZXlJZHggLSAxICk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9EZWZhdWx0S2V5SURfUHJvYzo6KERlZmF1bHRLZXlJRD0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgV0VQIEtFWTEKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfS2V5MV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKQotewotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7Ci0KLSAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCi0KLSAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKLQotICAgIHN3aXRjaCAoS2V5TGVuKQotICAgIHsKLSAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCi0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbjsKLSAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgYXJnLCBLZXlMZW4pOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQotICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKLSAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgS2V5TGVuIC8gMik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW47Ci0gICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIGFyZywgS2V5TGVuKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQotICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKLSAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgS2V5TGVuIC8gMik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQotICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCi0gICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKLSAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKLSAgICB7Ci0gICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgV0VQIEtFWTIKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfS2V5Ml9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKQotewotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7Ci0KLSAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCi0KLSAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKLQotICAgIHN3aXRjaCAoS2V5TGVuKQotICAgIHsKLSAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCi0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbjsKLSAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgYXJnLCBLZXlMZW4pOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQotICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKLSAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgS2V5TGVuIC8gMik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW47Ci0gICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIGFyZywgS2V5TGVuKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQotICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKLSAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgS2V5TGVuIC8gMik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0KLSAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQotICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0Ci0gICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCi0gICAgewotICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBXRVAgS0VZMwotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9LZXkzX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpCi17Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKLQotICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKLQotICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOwotCi0gICAgc3dpdGNoIChLZXlMZW4pCi0gICAgewotICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuOwotICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBhcmcsIEtleUxlbik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1Bc2NpaSlcbiIsIGFyZykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCi0gICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbiAvIDIgOwotICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBLZXlMZW4gLyAyKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUhleClcbiIsIGFyZykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCi0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbjsKLSAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgYXJnLCBLZXlMZW4pOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUFzY2lpKVxuIiwgYXJnKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCi0gICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbiAvIDIgOwotICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBLZXlMZW4gLyAyKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1IZXgpXG4iLCBhcmcpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQotICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCi0gICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKLSAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKLSAgICB7Ci0gICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5DaXBoZXJBbGcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdFUCBLRVk0Ci0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0tleTRfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZykKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OwotCi0gICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgS2V5TGVuID0gc3RybGVuKGFyZyk7Ci0KLSAgICBzd2l0Y2ggKEtleUxlbikKLSAgICB7Ci0gICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW47Ci0gICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIGFyZywgS2V5TGVuKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKLSAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuIC8gMiA7Ci0gICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIEtleUxlbiAvIDIpOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuOwotICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBhcmcsIEtleUxlbik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKLSAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuIC8gMiA7Ci0gICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIEtleUxlbiAvIDIpOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCi0gICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKLSAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAotICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgotICAgIHsKLSAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLkNpcGhlckFsZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBXUEEgUFNLIGtleQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9XUEFQU0tfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpCi17Ci0gICAgaW50IHN0YXR1czsKLQotICAgIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgotICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKLQkgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0JCSkKLSAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XUEFQU0tfUHJvYzo6KFdQQVBTSz0lcylcbiIsIGFyZykpOwotCi0Jc3RhdHVzID0gUlRfQ2ZnU2V0V1BBUFNLS2V5KHBBZCwgYXJnLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIHBBZC0+U3RhQ2ZnLlBNSyk7Ci0JaWYgKHN0YXR1cyA9PSBGQUxTRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XUEFQU0tfUHJvYygpOiBTZXQga2V5IGZhaWxlZCFcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5XcGFQYXNzUGhyYXNlLCA2NCk7Ci0gICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuV3BhUGFzc1BocmFzZSwgYXJnLCBzdHJsZW4oYXJnKSk7Ci0gICAgcEFkLT5TdGFDZmcuV3BhUGFzc1BocmFzZUxlbiA9IChVSU5UKXN0cmxlbihhcmcpOwotCi0KLQotICAgIGlmKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DICYmCi0gICAgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLSAgICB7Ci0gICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvLyBTdGFydCBTVEEgc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lCi0gICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFBvd2VyIFNhdmluZyBtb2RlCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X1BTTW9kZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKQotewotICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQotICAgIHsKLSAgICAgICAgaWYgKChzdHJjbXAoYXJnLCAiTWF4X1BTUCIpID09IDApIHx8Ci0JCQkoc3RyY21wKGFyZywgIm1heF9wc3AiKSA9PSAwKSB8fAotCQkJKHN0cmNtcChhcmcsICJNQVhfUFNQIikgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tQc21DaGFuZ2UoKQotICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCi0gICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOwotICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gNTsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiRmFzdF9QU1AiKSA9PSAwKSB8fAotCQkJCSAoc3RyY21wKGFyZywgImZhc3RfcHNwIikgPT0gMCkgfHwKLSAgICAgICAgICAgICAgICAgKHN0cmNtcChhcmcsICJGQVNUX1BTUCIpID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrUHNtQ2hhbmdlKCkKLSAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgotICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLSAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIkxlZ2FjeV9QU1AiKSA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgImxlZ2FjeV9wc3AiKSA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgIkxFR0FDWV9QU1AiKSA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja1BzbUNoYW5nZSgpCi0gICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KLSAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7Ci0gICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy9EZWZhdWx0IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0KLSAgICAgICAgICAgIC8vIGNsZWFyIFBTTSBiaXQgaW1tZWRpYXRlbHkKLSAgICAgICAgICAgIFJUTVBfU0VUX1BTTV9CSVQocEFkYXB0ZXIsIFBXUl9BQ1RJVkUpOwotICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLSAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOwotICAgICAgICB9Ci0KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1BTTW9kZV9Qcm9jOjooUFNNb2RlPSVsZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0vL0FkZCB0byBzdXBvcnQgdGhlIGZ1bmN0aW9uIHdoaWNoIGNsb3VsZCBkeW5hbWljYWxsbHkgZW5hYmxlL2Rpc2FibGUgUENJZSBQb3dlciBTYXZpbmcKLQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdwYVN1cHBvcnQgZmxhZy4KLSAgICBWYWx1ZToKLSAgICAgICAgMDogRHJpdmVyIGlnbm9yZSB3cGFfc3VwcGxpY2FudC4KLSAgICAgICAgMTogd3BhX3N1cHBsaWNhbnQgaW5pdGlhdGVzIHNjYW5uaW5nIGFuZCBBUCBzZWxlY3Rpb24uCi0gICAgICAgIDI6IGRyaXZlciB0YWtlcyBjYXJlIG9mIHNjYW5uaW5nLCBBUCBzZWxlY3Rpb24sIGFuZCBJRUVFIDgwMi4xMSBhc3NvY2lhdGlvbiBwYXJhbWV0ZXJzLgotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9XcGFfU3VwcG9ydCgKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCi0gICAgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCi0gICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEU7Ci0gICAgZWxzZSBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMSkKLSAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFOwotICAgIGVsc2UgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDIpCi0gICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0VOQUJMRV9XSVRIX1dFQl9VSTsKLSAgICBlbHNlCi0gICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEU7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV3BhX1N1cHBvcnQ6OihXcGFTdXBwbGljYW50VVA9JWQpXG4iLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotI2lmZGVmIERCRwotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBSZWFkIC8gV3JpdGUgTUFDCi0gICAgQXJndW1lbnRzOgotICAgICAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotICAgICAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgTm9uZQotCi0gICAgTm90ZToKLSAgICAgICAgVXNhZ2U6Ci0gICAgICAgICAgICAgICAxLikgaXdwcml2IHJhMCBtYWMgMCAgICAgICAgPT0+IHJlYWQgTUFDIHdoZXJlIEFkZHI9MHgwCi0gICAgICAgICAgICAgICAyLikgaXdwcml2IHJhMCBtYWMgMD0xMiAgICAgPT0+IHdyaXRlIE1BQyB3aGVyZSBBZGRyPTB4MCwgdmFsdWU9MTIKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUElvY3RsTUFDKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEpCi17Ci0JUFNUUklORwkJCQl0aGlzX2NoYXI7Ci0JUFNUUklORwkJCQl2YWx1ZTsKLQlJTlQJCQkJCWogPSAwLCBrID0gMDsKLQlTVFJJTkcJCQkJbXNnWzEwMjRdOwotCVNUUklORwkJCQlhcmdbMjU1XTsKLQlVTE9ORwkJCQltYWNBZGRyID0gMDsKLQlVQ0hBUgkJCQl0ZW1wWzE2XTsKLQlTVFJJTkcJCQkJdGVtcDJbMTZdOwotCVVJTlQzMgkJCQltYWNWYWx1ZSA9IDA7Ci0JSU5UCQkJCQlTdGF0dXM7Ci0JQk9PTEVBTgkJCQliSXNQcmludEFsbE1BQyA9IEZBTFNFOwotCi0KLQltZW1zZXQobXNnLCAweDAwLCAxMDI0KTsKLQlpZiAod3JxLT51LmRhdGEubGVuZ3RoID4gMSkgLy9ObyBwYXJhbWV0ZXJzLgotCXsKLQkgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoYXJnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCAod3JxLT51LmRhdGEubGVuZ3RoID4gMjU1KSA/IDI1NSA6IHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCXNwcmludGYobXNnLCAiXG4iKTsKLQotCQkvL1BhcnNpbmcgUmVhZCBvciBXcml0ZQotCSAgICB0aGlzX2NoYXIgPSBhcmc7Ci0JCWlmICghKnRoaXNfY2hhcikKLQkJCWdvdG8gbmV4dDsKLQotCQlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQotCQkJKnZhbHVlKysgPSAwOwotCi0JCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKLQkJeyAvL1JlYWQKLQkJCS8vIFNhbml0eSBjaGVjawotCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPiA0KQotCQkJCWdvdG8gbmV4dDsKLQotCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOwotCQkJd2hpbGUoai0tID4gMCkKLQkJCXsKLQkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIE1hYyBBZGRyCi0JCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOwotCQkJd2hpbGUoai0tID4gMCkKLQkJCXsKLQkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOwotCQkJfQotCi0JCQl3aGlsZShrIDwgNCkKLQkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKLQkJCXRoaXNfY2hhcls0XT0nXDAnOwotCi0JCQlpZihzdHJsZW4odGhpc19jaGFyKSA9PSA0KQotCQkJewotCQkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKLQkJCQltYWNBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKLQkJCQlpZiAobWFjQWRkciA8IDB4RkZGRikKLQkJCQl7Ci0JCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBtYWNBZGRyLCAmbWFjVmFsdWUpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNBZGRyPSVseCwgTWFjVmFsdWU9JXhcbiIsIG1hY0FkZHIsIG1hY1ZhbHVlKSk7Ci0JCQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTA4bFhdOiUwOFggICIsIG1hY0FkZHIgLCBtYWNWYWx1ZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIG1hYwotCQkJCQliSXNQcmludEFsbE1BQyA9IFRSVUU7Ci0JCQkJCWdvdG8gbmV4dDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7IC8vV3JpdGUKLQkJCW1lbWNweSgmdGVtcDIsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKLQkJCXRlbXAyW3N0cmxlbih2YWx1ZSldID0gJ1wwJzsKLQotCQkJLy8gU2FuaXR5IGNoZWNrCi0JCQlpZigoc3RybGVuKHRoaXNfY2hhcikgPiA0KSB8fCBzdHJsZW4odGVtcDIpID4gOCkKLQkJCQlnb3RvIG5leHQ7Ci0KLQkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKLQkJCXdoaWxlKGotLSA+IDApCi0JCQl7Ci0JCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKLQkJCQkJcmV0dXJuOwotCQkJfQotCi0JCQlqID0gc3RybGVuKHRlbXAyKTsKLQkJCXdoaWxlKGotLSA+IDApCi0JCQl7Ci0JCQkJaWYodGVtcDJbal0gPiAnZicgfHwgdGVtcDJbal0gPCAnMCcpCi0JCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy9NQUMgQWRkcgotCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKLQkJCXdoaWxlKGotLSA+IDApCi0JCQl7Ci0JCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKLQkJCX0KLQotCQkJd2hpbGUoayA8IDQpCi0JCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7Ci0JCQl0aGlzX2NoYXJbNF09J1wwJzsKLQotCQkJLy9NQUMgdmFsdWUKLQkJCWsgPSBqID0gc3RybGVuKHRlbXAyKTsKLQkJCXdoaWxlKGotLSA+IDApCi0JCQl7Ci0JCQkJdGVtcDJbOC1rK2pdID0gdGVtcDJbal07Ci0JCQl9Ci0KLQkJCXdoaWxlKGsgPCA4KQotCQkJCXRlbXAyWzctaysrXT0nMCc7Ci0JCQl0ZW1wMls4XT0nXDAnOwotCi0JCQl7Ci0JCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOwotCQkJCW1hY0FkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOwotCi0JCQkJQXRvSCh0ZW1wMiwgdGVtcCwgNCk7Ci0JCQkJbWFjVmFsdWUgPSAqdGVtcCoyNTYqMjU2KjI1NiArIHRlbXBbMV0qMjU2KjI1NiArIHRlbXBbMl0qMjU2ICsgdGVtcFszXTsKLQotCQkJCS8vIGRlYnVnIG1vZGUKLQkJCQlpZiAobWFjQWRkciA9PSAoSFdfREVCVUdfU0VUVElOR19CQVNFICsgNCkpCi0JCQkJewotCQkJCQkvLyAweDJiZjQ6IGJ5dGUwIG5vbi16ZXJvOiBlbmFibGUgUjE3IHR1bmluZywgMDogZGlzYWJsZSBSMTcgdHVuaW5nCi0gICAgICAgICAgICAgICAgICAgIGlmIChtYWNWYWx1ZSAmIDB4MDAwMDAwZmYpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5CYnBUdW5pbmcuYkVuYWJsZSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInR1cm4gb24gUjE3IHR1bmluZ1xuIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgUjY2OwotICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkJicFR1bmluZy5iRW5hYmxlID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSNjYgPSAweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKTsKLSNpZmRlZiBSQUxJTktfQVRFCi0JCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKLQkJCQkJCXsKLQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNjYsICgweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKSkpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNjYsICgweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJ0dXJuIG9mZiBSMTcgdHVuaW5nLCByZXN0b3JlIHRvIDB4JTAyeFxuIiwgUjY2KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY0FkZHI9JTAybHgsIE1hY1ZhbHVlPTB4JXhcbiIsIG1hY0FkZHIsIG1hY1ZhbHVlKSk7Ci0KLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIG1hY0FkZHIsIG1hY1ZhbHVlKTsKLQkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwOGxYXTolMDhYICAiLCBtYWNBZGRyLCBtYWNWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZQotCQliSXNQcmludEFsbE1BQyA9IFRSVUU7Ci1uZXh0OgotCWlmIChiSXNQcmludEFsbE1BQykKLQl7Ci0JCXN0cnVjdCBmaWxlCQkqZmlsZV93OwotCQlQU1RSSU5HCQkJZmlsZU5hbWUgPSAiTWFjRHVtcC50eHQiOwotCQltbV9zZWdtZW50X3QJb3JpZ19mczsKLQotCQlvcmlnX2ZzID0gZ2V0X2ZzKCk7Ci0JCXNldF9mcyhLRVJORUxfRFMpOwotCi0JCS8vIG9wZW4gZmlsZQotCQlmaWxlX3cgPSBmaWxwX29wZW4oZmlsZU5hbWUsIE9fV1JPTkxZfE9fQ1JFQVQsIDApOwotCQlpZiAoSVNfRVJSKGZpbGVfdykpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPjIpICVzOiBFcnJvciAlbGQgb3BlbmluZyAlc1xuIiwgX19GVU5DVElPTl9fLCAtUFRSX0VSUihmaWxlX3cpLCBmaWxlTmFtZSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKGZpbGVfdy0+Zl9vcCAmJiBmaWxlX3ctPmZfb3AtPndyaXRlKQotCQkJewotCQkJCWZpbGVfdy0+Zl9wb3MgPSAwOwotCQkJCW1hY0FkZHIgPSAweDEwMDA7Ci0KLQkJCQl3aGlsZSAobWFjQWRkciA8PSAweDE4MDApCi0JCQkJewotCQkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgbWFjQWRkciwgJm1hY1ZhbHVlKTsKLQkJCQkJc3ByaW50Zihtc2csICIlMDhseCA9ICUwOFhcbiIsIG1hY0FkZHIsIG1hY1ZhbHVlKTsKLQotCQkJCQkvLyB3cml0ZSBkYXRhIHRvIGZpbGUKLQkJCQkJZmlsZV93LT5mX29wLT53cml0ZShmaWxlX3csIG1zZywgc3RybGVuKG1zZyksICZmaWxlX3ctPmZfcG9zKTsKLQotCQkJCQlwcmludGsoIiVzIiwgbXNnKTsKLQkJCQkJbWFjQWRkciArPSA0OwotCQkJCX0KLQkJCQlzcHJpbnRmKG1zZywgIlxuRHVtcCBhbGwgTUFDIHZhbHVlcyB0byAlc1xuIiwgZmlsZU5hbWUpOwotCQkJfQotCQkJZmlscF9jbG9zZShmaWxlX3csIE5VTEwpOwotCQl9Ci0JCXNldF9mcyhvcmlnX2ZzKTsKLQl9Ci0JaWYoc3RybGVuKG1zZykgPT0gMSkKLQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICI9PT0+RXJyb3IgY29tbWFuZCBmb3JtYXQhIik7Ci0KLQkvLyBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlcgotCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOwotCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1SVE1QSW9jdGxNQUNcblxuIikpOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFJlYWQgLyBXcml0ZSBFMlBST00KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBOb25lCi0KLSAgICBOb3RlOgotICAgICAgICBVc2FnZToKLSAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIGUycCAwCQk9PT4gcmVhZCBFMlBST00gd2hlcmUgQWRkcj0weDAKLSAgICAgICAgICAgICAgIDIuKSBpd3ByaXYgcmEwIGUycCAwPTEyMzQgICAgPT0+IHdyaXRlIEUyUFJPTSB3aGVyZSBBZGRyPTB4MCwgdmFsdWU9MTIzNAotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QSW9jdGxFMlBST00oCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSkKLXsKLQlQU1RSSU5HCQkJCXRoaXNfY2hhcjsKLQlQU1RSSU5HCQkJCXZhbHVlOwotCUlOVAkJCQkJaiA9IDAsIGsgPSAwOwotCVNUUklORwkJCQltc2dbMTAyNF07Ci0JU1RSSU5HCQkJCWFyZ1syNTVdOwotCVVTSE9SVAkJCQllZXBBZGRyID0gMDsKLQlVQ0hBUgkJCQl0ZW1wWzE2XTsKLQlTVFJJTkcJCQkJdGVtcDJbMTZdOwotCVVTSE9SVAkJCQllZXBWYWx1ZTsKLQlpbnQJCQkJCVN0YXR1czsKLQlCT09MRUFOCQkJCWJJc1ByaW50QWxsRTJQID0gRkFMU0U7Ci0KLQotCW1lbXNldChtc2csIDB4MDAsIDEwMjQpOwotCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCi0JewotCSAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihhcmcsIHdycS0+dS5kYXRhLnBvaW50ZXIsICh3cnEtPnUuZGF0YS5sZW5ndGggPiAyNTUpID8gMjU1IDogd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJc3ByaW50Zihtc2csICJcbiIpOwotCi0JICAgIC8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCi0JCXRoaXNfY2hhciA9IGFyZzsKLQotCi0JCWlmICghKnRoaXNfY2hhcikKLQkJCWdvdG8gbmV4dDsKLQotCQlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQotCQkJKnZhbHVlKysgPSAwOwotCi0JCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKLQkJeyAvL1JlYWQKLQotCQkJLy8gU2FuaXR5IGNoZWNrCi0JCQlpZihzdHJsZW4odGhpc19jaGFyKSA+IDQpCi0JCQkJZ290byBuZXh0OwotCi0JCQlqID0gc3RybGVuKHRoaXNfY2hhcik7Ci0JCQl3aGlsZShqLS0gPiAwKQotCQkJewotCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCi0JCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gRTJQUk9NIGFkZHIKLQkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7Ci0JCQl3aGlsZShqLS0gPiAwKQotCQkJewotCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07Ci0JCQl9Ci0KLQkJCXdoaWxlKGsgPCA0KQotCQkJCXRoaXNfY2hhclszLWsrK109JzAnOwotCQkJdGhpc19jaGFyWzRdPSdcMCc7Ci0KLQkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID09IDQpCi0JCQl7Ci0JCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOwotCQkJCWVlcEFkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOwotCQkJCWlmIChlZXBBZGRyIDwgMHhGRkZGKQotCQkJCXsKLQkJCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkYXB0ZXIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKLQkJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDRYXToweCUwNFggICIsIGVlcEFkZHIgLCBlZXBWYWx1ZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAotCQkJCQliSXNQcmludEFsbEUyUCA9IFRSVUU7Ci0JCQkJCWdvdG8gbmV4dDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7IC8vV3JpdGUKLQkJCW1lbWNweSgmdGVtcDIsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKLQkJCXRlbXAyW3N0cmxlbih2YWx1ZSldID0gJ1wwJzsKLQotCQkJLy8gU2FuaXR5IGNoZWNrCi0JCQlpZigoc3RybGVuKHRoaXNfY2hhcikgPiA0KSB8fCBzdHJsZW4odGVtcDIpID4gOCkKLQkJCQlnb3RvIG5leHQ7Ci0KLQkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKLQkJCXdoaWxlKGotLSA+IDApCi0JCQl7Ci0JCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJaiA9IHN0cmxlbih0ZW1wMik7Ci0JCQl3aGlsZShqLS0gPiAwKQotCQkJewotCQkJCWlmKHRlbXAyW2pdID4gJ2YnIHx8IHRlbXAyW2pdIDwgJzAnKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vTUFDIEFkZHIKLQkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7Ci0JCQl3aGlsZShqLS0gPiAwKQotCQkJewotCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07Ci0JCQl9Ci0KLQkJCXdoaWxlKGsgPCA0KQotCQkJCXRoaXNfY2hhclszLWsrK109JzAnOwotCQkJdGhpc19jaGFyWzRdPSdcMCc7Ci0KLQkJCS8vTUFDIHZhbHVlCi0JCQlrID0gaiA9IHN0cmxlbih0ZW1wMik7Ci0JCQl3aGlsZShqLS0gPiAwKQotCQkJewotCQkJCXRlbXAyWzQtaytqXSA9IHRlbXAyW2pdOwotCQkJfQotCi0JCQl3aGlsZShrIDwgNCkKLQkJCQl0ZW1wMlszLWsrK109JzAnOwotCQkJdGVtcDJbNF09J1wwJzsKLQotCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOwotCQkJZWVwQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07Ci0KLQkJCUF0b0godGVtcDIsIHRlbXAsIDIpOwotCQkJZWVwVmFsdWUgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOwotCi0JCQlSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkYXB0ZXIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTAyWF06JTAyWCAgIiwgZWVwQWRkciwgZWVwVmFsdWUpOwotCQl9Ci0JfQotCWVsc2UKLQkJYklzUHJpbnRBbGxFMlAgPSBUUlVFOwotbmV4dDoKLQlpZiAoYklzUHJpbnRBbGxFMlApCi0JewotCQlzdHJ1Y3QgZmlsZQkJKmZpbGVfdzsKLQkJUFNUUklORwkJCWZpbGVOYW1lID0gIkVFUFJPTUR1bXAudHh0IjsKLQkJbW1fc2VnbWVudF90CW9yaWdfZnM7Ci0KLQkJb3JpZ19mcyA9IGdldF9mcygpOwotCQlzZXRfZnMoS0VSTkVMX0RTKTsKLQotCQkvLyBvcGVuIGZpbGUKLQkJZmlsZV93ID0gZmlscF9vcGVuKGZpbGVOYW1lLCBPX1dST05MWXxPX0NSRUFULCAwKTsKLQkJaWYgKElTX0VSUihmaWxlX3cpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4yKSAlczogRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIF9fRlVOQ1RJT05fXywgLVBUUl9FUlIoZmlsZV93KSwgZmlsZU5hbWUpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChmaWxlX3ctPmZfb3AgJiYgZmlsZV93LT5mX29wLT53cml0ZSkKLQkJCXsKLQkJCQlmaWxlX3ctPmZfcG9zID0gMDsKLQkJCQllZXBBZGRyID0gMHgwMDsKLQotCQkJCXdoaWxlIChlZXBBZGRyIDw9IDB4RkUpCi0JCQkJewotCQkJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWRhcHRlciwgZWVwQWRkciwgZWVwVmFsdWUpOwotCQkJCQlzcHJpbnRmKG1zZywgIiUwOHggPSAlMDR4XG4iLCBlZXBBZGRyICwgZWVwVmFsdWUpOwotCi0JCQkJCS8vIHdyaXRlIGRhdGEgdG8gZmlsZQotCQkJCQlmaWxlX3ctPmZfb3AtPndyaXRlKGZpbGVfdywgbXNnLCBzdHJsZW4obXNnKSwgJmZpbGVfdy0+Zl9wb3MpOwotCi0JCQkJCXByaW50aygiJXMiLCBtc2cpOwotCQkJCQllZXBBZGRyICs9IDI7Ci0JCQkJfQotCQkJCXNwcmludGYobXNnLCAiXG5EdW1wIGFsbCBFRVBST00gdmFsdWVzIHRvICVzXG4iLCBmaWxlTmFtZSk7Ci0JCQl9Ci0JCQlmaWxwX2Nsb3NlKGZpbGVfdywgTlVMTCk7Ci0JCX0KLQkJc2V0X2ZzKG9yaWdfZnMpOwotCX0KLQlpZihzdHJsZW4obXNnKSA9PSAxKQotCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIj09PT5FcnJvciBjb21tYW5kIGZvcm1hdCEiKTsKLQotCi0JLy8gQ29weSB0aGUgaW5mb3JtYXRpb24gaW50byB0aGUgdXNlciBidWZmZXIKLQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKLQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09UlRNUElvY3RsRTJQUk9NXG4iKSk7Ci19Ci0KLQotI2lmZGVmIFJUMzB4eAotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBSZWFkIC8gV3JpdGUgUkYgcmVnaXN0ZXIKLUFyZ3VtZW50czoKLSAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBOb25lCi0KLSAgICBOb3RlOgotICAgICAgICBVc2FnZToKLSAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIHJmICAgICAgICAgICAgICAgID09PiByZWFkIGFsbCBSRiByZWdpc3RlcnMKLSAgICAgICAgICAgICAgIDIuKSBpd3ByaXYgcmEwIHJmIDEgICAgICAgICAgICAgID09PiByZWFkIFJGIHdoZXJlIFJlZ0lEPTEKLSAgICAgICAgICAgICAgIDMuKSBpd3ByaXYgcmEwIHJmIDE9MTAJCSAgICA9PT4gd3JpdGUgUkYgUjE9MHgxMAotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QSW9jdGxSRigKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQotewotCUNIQVIJCQkJKnRoaXNfY2hhcjsKLQlDSEFSCQkJCSp2YWx1ZTsKLQlVQ0hBUgkJCQlyZWdSRiA9IDA7Ci0JU1RSSU5HCQkJCW1zZ1syMDQ4XTsKLQlDSEFSCQkJCWFyZ1syNTVdOwotCUlOVAkJCQkJcmZJZDsKLQlMT05HCQkJCXJmVmFsdWU7Ci0JaW50CQkJCQlTdGF0dXM7Ci0JQk9PTEVBTgkJCQliSXNQcmludEFsbFJGID0gRkFMU0U7Ci0KLQotCW1lbXNldChtc2csIDB4MDAsIDIwNDgpOwotCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCi0JewotCSAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihhcmcsIHdycS0+dS5kYXRhLnBvaW50ZXIsICh3cnEtPnUuZGF0YS5sZW5ndGggPiAyNTUpID8gMjU1IDogd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJc3ByaW50Zihtc2csICJcbiIpOwotCi0JICAgIC8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCi0JCXRoaXNfY2hhciA9IGFyZzsKLQkJaWYgKCEqdGhpc19jaGFyKQotCQkJZ290byBuZXh0OwotCi0JCWlmICgodmFsdWUgPSBzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQotCQkJKnZhbHVlKysgPSAwOwotCi0JCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKLQkJeyAvL1JlYWQKLQkJCWlmIChzc2NhbmYoKFBTVFJJTkcpIHRoaXNfY2hhciwgIiVkIiwgJihyZklkKSkgPT0gMSkKLQkJCXsKLQkJCQlpZiAocmZJZCA8PSAzMSkKLQkJCQl7Ci0jaWZkZWYgUkFMSU5LX0FURQotCQkJCQkvKgotCQkJCQkJSW4gUlQyODYwIEFURSBtb2RlLCB3ZSBkbyBub3QgbG9hZCA4MDUxIGZpcm13YXJlLgotCSAgICAgICAgICAgICAgICAgICAgV2UgbXVzdCBhY2Nlc3MgUkYgZGlyZWN0bHkuCi0JCQkJCQlGb3IgUlQyODcwIEFURSBtb2RlLCBBVEVfUkZfSU9fV1JJVEU4KC9SRUFEOClfQllfUkVHX0lEIGFyZSByZWRlZmluZWQuCi0JCQkJCSovCi0JCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQotCQkJCQl7Ci0JCQkJCQlBVEVfUkZfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCByZklkLCAmcmVnUkYpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0JCQkJCS8vIGFjY29yZGluZyB0byBBbmR5LCBHYXJ5LCBEYXZpZCByZXF1aXJlLgotCQkJCQkvLyB0aGUgY29tbWFuZCByZiBzaGFsbCByZWFkIHJmIHJlZ2lzdGVyIGRpcmVjdGx5IGZvciBkdWJ1Zy4KLQkJCQkJLy8gQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOwotCQkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWRhcHRlciwgcmZJZCwgJnJlZ1JGKTsKLQotCQkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlIlMDJkWzB4JTAyeF06JTAyWCAgIiwgcmZJZCwgcmZJZCwgcmVnUkYpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBSRgotCQkJCQliSXNQcmludEFsbFJGID0gVFJVRTsKLQkJCQkJZ290byBuZXh0OwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsgLy9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIFJGCi0JCQkJYklzUHJpbnRBbGxSRiA9IFRSVUU7Ci0JCQkJZ290byBuZXh0OwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJeyAvL1dyaXRlCi0JCQlpZiAoKHNzY2FuZigoUFNUUklORykgdGhpc19jaGFyLCAiJWQiLCAmKHJmSWQpKSA9PSAxKSAmJiAoc3NjYW5mKChQU1RSSU5HKSB2YWx1ZSwgIiVseCIsICYocmZWYWx1ZSkpID09IDEpKQotCQkJewotCQkJCWlmIChyZklkIDw9IDMxKQotCQkJCXsKLSNpZmRlZiBSQUxJTktfQVRFCi0JCQkJCQkvKgotCQkJCQkJCUluIFJUMjg2MCBBVEUgbW9kZSwgd2UgZG8gbm90IGxvYWQgODA1MSBmaXJtd2FyZS4KLQkJICAgICAgICAgICAgICAgICAgICBXZSBtdXN0IGFjY2VzcyBSRiBkaXJlY3RseS4KLQkJCQkJCQlGb3IgUlQyODcwIEFURSBtb2RlLCBBVEVfUkZfSU9fV1JJVEU4KC9SRUFEOClfQllfUkVHX0lEIGFyZSByZWRlZmluZWQuCi0JCQkJCQkqLwotCQkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCi0JCQkJCQl7Ci0JCQkJCQkJQVRFX1JGX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgcmZJZCwgJnJlZ1JGKTsKLQkJCQkJCQlBVEVfUkZfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgKFVDSEFSKXJmSWQsKFVDSEFSKSByZlZhbHVlKTsKLQkJCQkJCQkvL1JlYWQgaXQgYmFjayBmb3Igc2hvd2luZwotCQkJCQkJCUFURV9SRl9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIHJmSWQsICZyZWdSRik7Ci0JCQkJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJSJTAyZFsweCUwMlhdOiUwMlhcbiIsIHJmSWQsIHJmSWQsIHJlZ1JGKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0JCQkJCQl7Ci0JCQkJCQkJLy8gYWNjb3JkaW5nIHRvIEFuZHksIEdhcnksIERhdmlkIHJlcXVpcmUuCi0JCQkJCQkJLy8gdGhlIGNvbW1hbmQgUkYgc2hhbGwgcmVhZC93cml0ZSBSRiByZWdpc3RlciBkaXJlY3RseSBmb3IgZHVidWcuCi0JCQkJCQkJLy9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7Ci0JCQkJCQkJLy9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgKFVDSEFSKWJicElkLChVQ0hBUikgYmJwVmFsdWUpOwotCQkJCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZGFwdGVyLCByZklkLCAmcmVnUkYpOwotCQkJCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWRhcHRlciwgKFVDSEFSKXJmSWQsKFVDSEFSKSByZlZhbHVlKTsKLQkJCQkJCQkvL1JlYWQgaXQgYmFjayBmb3Igc2hvd2luZwotCQkJCQkJCS8vQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOwotCQkJCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZGFwdGVyLCByZklkLCAmcmVnUkYpOwotCQkJICAgICAgICAgICAgICAgIHNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiUiUwMmRbMHglMDJYXTolMDJYXG4iLCByZklkLCByZklkLCByZWdSRik7Ci0JCQkJICAgICAgICAgICAgICAgIH0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgUkYKLQkJCQkJYklzUHJpbnRBbGxSRiA9IFRSVUU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJeyAvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgUkYKLQkJCQliSXNQcmludEFsbFJGID0gVFJVRTsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JCWJJc1ByaW50QWxsUkYgPSBUUlVFOwotbmV4dDoKLQlpZiAoYklzUHJpbnRBbGxSRikKLQl7Ci0JCW1lbXNldChtc2csIDB4MDAsIDIwNDgpOwotCQlzcHJpbnRmKG1zZywgIlxuIik7Ci0JCWZvciAocmZJZCA9IDA7IHJmSWQgPD0gMzE7IHJmSWQrKykKLQkJewotI2lmZGVmIFJBTElOS19BVEUKLQkJCS8qCi0JCQkJSW4gUlQyODYwIEFURSBtb2RlLCB3ZSBkbyBub3QgbG9hZCA4MDUxIGZpcm13YXJlLgotICAgICAgICAgICAgICAgIFdlIG11c3QgYWNjZXNzIFJGIGRpcmVjdGx5LgotCQkJCUZvciBSVDI4NzAgQVRFIG1vZGUsIEFURV9SRl9JT19XUklURTgoL1JFQUQ4KV9CWV9SRUdfSUQgYXJlIHJlZGVmaW5lZC4KLQkJCSovCi0JCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKLQkJCXsKLQkJCQlBVEVfUkZfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCByZklkLCAmcmVnUkYpOwotCQkJfQotCQkJZWxzZQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCQkJLy8gYWNjb3JkaW5nIHRvIEFuZHksIEdhcnksIERhdmlkIHJlcXVpcmUuCi0JCQkvLyB0aGUgY29tbWFuZCBSRiBzaGFsbCByZWFkL3dyaXRlIFJGIHJlZ2lzdGVyIGRpcmVjdGx5IGZvciBkdWJ1Zy4KLQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZGFwdGVyLCByZklkLCAmcmVnUkYpOwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICIlMDNkID0gJTAyWFxuIiwgcmZJZCwgcmVnUkYpOwotCQl9Ci0JCS8vIENvcHkgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIgYnVmZmVyCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInN0cmxlbihtc2cpPSVkXG4iLCAoVUlOVDMyKXN0cmxlbihtc2cpKSk7Ci0JCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOwotCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6IGNvcHlfdG9fdXNlcigpIGZhaWxcbiIsIF9fRlVOQ1RJT05fXykpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmKHN0cmxlbihtc2cpID09IDEpCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIj09PT5FcnJvciBjb21tYW5kIGZvcm1hdCEiKTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJjb3B5IHRvIHVzZXIgW21zZz0lc11cbiIsIG1zZykpOwotCQkvLyBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlcgotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJzdHJsZW4obXNnKSA9JWRcbiIsIChVSU5UMzIpc3RybGVuKG1zZykpKTsKLQotCQkvLyBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlcgotCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKLQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1SVE1QSW9jdGxSRlxuXG4iKSk7Ci19Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0jZW5kaWYgLy8gREJHIC8vCi0KLQotCi0KLUlOVCBTZXRfVEduV2lmaVRlc3RfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpCi17Ci0gICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKLSAgICAgICAgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gRkFMU0U7Ci0gICAgZWxzZQotICAgICAgICBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBUUlVFOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X1RHbldpZmlUZXN0X1Byb2M6OihiVEduV2lmaVRlc3Q9JWQpXG4iLCBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QpKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKLUlOVCBTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZykKLXsKLSAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9Ob25lOwotICAgIGVsc2UgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfRmxleGlibGU7Ci0gICAgZWxzZSBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAyKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9TdHJpY3Q7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSWVlZTgwMmRNb2RlX1Byb2M6OihJRUVFRTAyMTFkTW9kZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUpKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0KLSNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCi1JTlQgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFNUUklORyAgICAgICAgIGFyZykKLXsKLSAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQotICAgICAgICBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IEZBTFNFOwotICAgIGVsc2UKLSAgICAgICAgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBUUlVFOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYzo6KENhcnJpZXJEZXRlY3QuRW5hYmxlPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUpKTsKLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCi0KLQotSU5UCVNob3dfQWRob2NfTWFjVGFibGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJZXh0cmEpCi17Ci0JSU5UIGk7Ci0KLQlzcHJpbnRmKGV4dHJhLCAiXG4iKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCXNwcmludGYoZXh0cmEsICIlc0hUIE9wZXJhdGluZyBNb2RlIDogJWRcbiIsIGV4dHJhLCBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0Jc3ByaW50ZihleHRyYSwgIiVzXG4lLTE5cyUtNHMlLTRzJS03cyUtN3MlLTdzJS0xMHMlLTZzJS02cyUtNnMlLTZzXG4iLCBleHRyYSwKLQkJCSJNQUMiLCAiQUlEIiwgIkJTUyIsICJSU1NJMCIsICJSU1NJMSIsICJSU1NJMiIsICJQaE1kIiwgIkJXIiwgIk1DUyIsICJTR0kiLCAiU1RCQyIpOwotCi0JZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQl7Ci0JCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07Ci0KLQkJaWYgKHN0cmxlbihleHRyYSkgPiAoSVdfUFJJVl9TSVpFX01BU0sgLSAzMCkpCi0JCSAgICBicmVhazsKLQkJaWYgKChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkpICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQotCQl7Ci0JCQlzcHJpbnRmKGV4dHJhLCAiJXMlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAgIiwgZXh0cmEsCi0JCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKLQkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdKTsKLQkJCXNwcmludGYoZXh0cmEsICIlcyUtNGQiLCBleHRyYSwgKGludClwRW50cnktPkFpZCk7Ci0JCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTRkIiwgZXh0cmEsIChpbnQpcEVudHJ5LT5hcGlkeCk7Ci0JCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTdkIiwgZXh0cmEsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCk7Ci0JCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTdkIiwgZXh0cmEsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMSk7Ci0JCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTdkIiwgZXh0cmEsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7Ci0JCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTEwcyIsIGV4dHJhLCBHZXRQaHlNb2RlKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUpKTsKLQkJCXNwcmludGYoZXh0cmEsICIlcyUtNnMiLCBleHRyYSwgR2V0QlcocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcpKTsKLQkJCXNwcmludGYoZXh0cmEsICIlcyUtNmQiLCBleHRyYSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTKTsKLQkJCXNwcmludGYoZXh0cmEsICIlcyUtNmQiLCBleHRyYSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSk7Ci0JCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTZkIiwgZXh0cmEsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMpOwotCQkJc3ByaW50ZihleHRyYSwgIiVzJS0xMGQsICVkLCAlZCUlXG4iLCBleHRyYSwgcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCwgcEVudHJ5LT5EZWJ1Z1R4Q291bnQsCi0JCQkJCQkocEVudHJ5LT5EZWJ1Z1R4Q291bnQpID8gKChwRW50cnktPkRlYnVnVHhDb3VudC1wRW50cnktPkRlYnVnRklGT0NvdW50KSoxMDAvcEVudHJ5LT5EZWJ1Z1R4Q291bnQpIDogMCk7Ci0JCQlzcHJpbnRmKGV4dHJhLCAiJXNcbiIsIGV4dHJhKTsKLQkJfQotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLUlOVCBTZXRfQmVhY29uTG9zdFRpbWVfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFNUUklORyAgICAgICAgIGFyZykKLXsKLQlVTE9ORyBsdG1wID0gKFVMT05HKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoKGx0bXAgIT0gMCkgJiYgKGx0bXAgPD0gNjApKQotCQlwQWQtPlN0YUNmZy5CZWFjb25Mb3N0VGltZSA9IChsdG1wICogT1NfSFopOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X0JlYWNvbkxvc3RUaW1lX1Byb2M6OihCZWFjb25Mb3N0VGltZT0lbGQpXG4iLCBwQWQtPlN0YUNmZy5CZWFjb25Mb3N0VGltZSkpOwotCXJldHVybiBUUlVFOwotfQotCi1JTlQgU2V0X0F1dG9Sb2FtaW5nX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICBhcmcpCi17Ci0gICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKLSAgICAgICAgcEFkLT5TdGFDZmcuYkF1dG9Sb2FtaW5nID0gRkFMU0U7Ci0gICAgZWxzZQotICAgICAgICBwQWQtPlN0YUNmZy5iQXV0b1JvYW1pbmcgPSBUUlVFOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X0F1dG9Sb2FtaW5nX1Byb2M6OihiQXV0b1JvYW1pbmc9JWQpXG4iLCBwQWQtPlN0YUNmZy5iQXV0b1JvYW1pbmcpKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIElzc3VlIGEgc2l0ZSBzdXJ2ZXkgY29tbWFuZCB0byBkcml2ZXIKLQlBcmd1bWVudHM6Ci0JICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBOb25lCi0KLSAgICBOb3RlOgotICAgICAgICBVc2FnZToKLSAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIHNldCBzaXRlX3N1cnZleQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9TaXRlU3VydmV5X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlORElTXzgwMl8xMV9TU0lEIFNzaWQ7Ci0KLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotCWlmIChNT05JVE9SX09OKHBBZCkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIGluIE1vbml0b3IgTW9kZSBub3cgISEhXG4iKSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotCVJUTVBaZXJvTWVtb3J5KCZTc2lkLCBzaXplb2YoTkRJU184MDJfMTFfU1NJRCkpOwotCVNzaWQuU3NpZExlbmd0aCA9IDA7Ci0JaWYgKChhcmcgIT0gTlVMTCkgJiYKLQkJKHN0cmxlbihhcmcpIDw9IE1BWF9MRU5fT0ZfU1NJRCkpCi0gICAgewotICAgICAgICBSVE1QTW92ZU1lbW9yeShTc2lkLlNzaWQsIGFyZywgc3RybGVuKGFyZykpOwotICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSBzdHJsZW4oYXJnKTsKLQl9Ci0KLQlwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKLQotCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKLQl7Ci0JCVJUTVBfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZCk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKLQl9Ci0KLQkvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKLQkvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgotCXBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOwotCS8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCi0JcEFkLT5TdGFDZmcuU2NhbkNudCA9IDA7Ci0JTmRpc0dldFN5c3RlbVVwVGltZSgmcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lKTsKLQotCU1sbWVFbnF1ZXVlKHBBZCwKLQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCi0JCU9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAotCQlTc2lkLlNzaWRMZW5ndGgsCi0JCVNzaWQuU3NpZCk7Ci0KLQlSVE1QX01MTUVfSEFORExFUihwQWQpOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1NpdGVTdXJ2ZXlfUHJvY1xuIikpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVCBTZXRfRm9yY2VUeEJ1cnN0X1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICBhcmcpCi17Ci0gICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKLSAgICAgICAgcEFkLT5TdGFDZmcuYkZvcmNlVHhCdXJzdCA9IEZBTFNFOwotICAgIGVsc2UKLSAgICAgICAgcEFkLT5TdGFDZmcuYkZvcmNlVHhCdXJzdCA9IFRSVUU7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfRm9yY2VUeEJ1cnN0X1Byb2M6OihiRm9yY2VUeEJ1cnN0PSVkKVxuIiwgcEFkLT5TdGFDZmcuYkZvcmNlVHhCdXJzdCkpOwotCXJldHVybiBUUlVFOwotfQotCi0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi1JTlQJU2V0X0FudGVubmFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0gICAgVUNIQVIgVXNlZEFudDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gU2V0X0FudGVubmFfUHJvYyAqKioqKioqKioqKioqKioqKioqXG4iKSk7Ci0KLSAgICBpZihzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApIDw9IDMpCi0gICAgICAgIFVzZWRBbnQgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0gICAgcEFkLT5Db21tb25DZmcuYlJ4QW50RGl2ZXJzaXR5ID0gVXNlZEFudDsgLy8gQXV0byBzd2l0Y2gKLSAgICBpZiAoVXNlZEFudCA9PSBBTlRfRElWRVJTSVRZX0VOQUJMRSkKLSAgICB7Ci0gICAgICAgICAgICBwQWQtPlJ4QW50LkV2YWx1YXRlU3RhYmxlQ250ID0gMDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBTZXRfQW50ZW5uYV9Qcm9jKEF1dG8gU3dpdGNoIE1vZGUpLCAoJWQsJWQpXG4iLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50LCBwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQpKTsKLSAgICB9Ci0gICAgLyogMjogRml4IGluIHRoZSBQSFkgQW50ZW5uYSBDT04xKi8KLSAgICBpZiAoVXNlZEFudCA9PSBBTlRfRklYX0FOVDEpCi0gICAgewotICAgICAgICAgICAgQXNpY1NldFJ4QW50KHBBZCwgMCk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gU2V0X0FudGVubmFfUHJvYyhGaXggaW4gQW50IENPTjEpLCAoJWQsJWQpXG4iLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50LCBwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQpKTsKLSAgICB9Ci0gICAgLyogMzogRml4IGluIHRoZSBQSFkgQW50ZW5uYSBDT04yKi8KLSAgICBpZiAoVXNlZEFudCA9PSBBTlRfRklYX0FOVDIpCi0gICAgewotICAgICAgICAgICAgQXNpY1NldFJ4QW50KHBBZCwgMSk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gU2V0X0FudGVubmFfUHJvYyhGaXggaW4gQW50IENPTjIpLCAoJWQsJWQpXG4iLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50LCBwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQpKTsKLSAgICB9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZiAvLyBBTlRfRElWRVJTSVRZX1NVUFBPUlQgLy8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3ZyX2lrYW5zLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3ZyX2lrYW5zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YmZmM2IuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC92cl9pa2Fucy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLQl2cl9pa2Fucy5oCi0KLSAgICBBYnN0cmFjdDoKLSAgICBIYW5kbGUgYXNzb2NpYXRpb24gcmVsYXRlZCByZXF1ZXN0cyBlaXRoZXIgZnJvbSBXU1RBIG9yIGZyb20gbG9jYWwgTUxNRQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIFNhbXBsZSBMaW4JMDEtMjgtMjAwOCAgICBDcmVhdGVkCi0gKi8KLQotI2lmbmRlZiBfX1ZSX0lLQU5TX0hfXwotI2RlZmluZSBfX1ZSX0lLQU5TX0hfXwotCi0jaWZuZGVmIE1PRFVMRV9JS0FOT1MKLSNkZWZpbmUgSUtBTk9TX0VYVEVSTglleHRlcm4KLSNlbHNlCi0jZGVmaW5lIElLQU5PU19FWFRFUk4KLSNlbmRpZiAvLyBNT0RVTEVfSUtBTk9TIC8vCi0KLSNpZmRlZiBJS0FOT1NfVlhfMVgwCi0JdHlwZWRlZiB2b2lkICgqSWthbm9zV2xhblR4Q2JGdW5jUCkodm9pZCAqLCB2b2lkICopOwotCi0Jc3RydWN0IElLQU5PU19UWF9JTkZPCi0JewotCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwotCQlJa2Fub3NXbGFuVHhDYkZ1bmNQICpmcDsKLQl9OwotI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KLQotCi1JS0FOT1NfRVhURVJOIHZvaWQgVlJfSUtBTk9TX0ZQX0luaXQoVUlOVDggQnNzTnVtLCBVSU5UOCAqcEFwTWFjKTsKLQotSUtBTk9TX0VYVEVSTiBJTlQzMiBJS0FOT1NfRGF0YUZyYW1lc1R4KHN0cnVjdCBza19idWZmICpwU2tiLAotCQkJCQkJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2KTsKLQotSUtBTk9TX0VYVEVSTiB2b2lkIElLQU5PU19EYXRhRnJhbWVSeChQUlRNUF9BREFQVEVSIHBBZCwKLQkJCQkJCQkJCQl2b2lkICpwUnhQYXJhbSwKLQkJCQkJCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqcFNrYiwKLQkJCQkJCQkJCQlVSU5UMzIgTGVuZ3RoKTsKLQotI2VuZGlmIC8vIF9fVlJfSUtBTlNfSF9fIC8vCi0KLS8qIEVuZCBvZiB2cl9pa2Fucy5oICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3dwYS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC93cGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJhYTI4Ny4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3dwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQ3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0Jd3BhLmgKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKLSovCi0KLSNpZm5kZWYJX19XUEFfSF9fCi0jZGVmaW5lCV9fV1BBX0hfXwotCi0vLyBFQVBPTCBLZXkgZGVzY3JpcHRlciBmcmFtZSBmb3JtYXQgcmVsYXRlZCBsZW5ndGgKLSNkZWZpbmUgTEVOX0tFWV9ERVNDX05PTkNFCQkJMzIKLSNkZWZpbmUgTEVOX0tFWV9ERVNDX0lWCQkJCTE2Ci0jZGVmaW5lIExFTl9LRVlfREVTQ19SU0MJCQk4Ci0jZGVmaW5lIExFTl9LRVlfREVTQ19JRAkJCQk4Ci0jZGVmaW5lIExFTl9LRVlfREVTQ19SRVBMQVkJCQk4Ci0jZGVmaW5lIExFTl9LRVlfREVTQ19NSUMJCQkxNgotCi0vLyBUaGUgbGVuZ3RoIGlzIHRoZSBFQVBvTC1LZXkgZnJhbWUgZXhjZXB0IGtleSBkYXRhIGZpZWxkLgotLy8gUGxlYXNlIHJlZmVyIHRvIDgwMi4xMWktMjAwNCAsRmlndXJlIDQzdSBpbiBwLjc4Ci0jZGVmaW5lIExFTl9FQVBPTF9LRVlfTVNHCQkJKHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFKQotCi0vLyBFQVAgQ29kZSBUeXBlLgotI2RlZmluZSBFQVBfQ09ERV9SRVFVRVNUCTEKLSNkZWZpbmUgRUFQX0NPREVfUkVTUE9OU0UJMgotI2RlZmluZSBFQVBfQ09ERV9TVUNDRVNTICAgIDMKLSNkZWZpbmUgRUFQX0NPREVfRkFJTFVSRSAgICA0Ci0KLS8vIEVBUE9MIGZyYW1lIFByb3RvY29sIFZlcnNpb24KLSNkZWZpbmUJRUFQT0xfVkVSCQkJCQkxCi0jZGVmaW5lCUVBUE9MX1ZFUjIJCQkJCTIKLQotLy8gRUFQT0wtS0VZIERlc2NyaXB0b3IgVHlwZQotI2RlZmluZQlXUEExX0tFWV9ERVNDCQkJCTB4ZmUKLSNkZWZpbmUgV1BBMl9LRVlfREVTQyAgICAgICAgICAgICAgIDB4MDIKLQotLy8gS2V5IERlc2NyaXB0b3IgVmVyc2lvbiBvZiBLZXkgSW5mb3JtYXRpb24KLSNkZWZpbmUJREVTQ19UWVBFX1RLSVAJCQkJMQotI2RlZmluZQlERVNDX1RZUEVfQUVTCQkJCTIKLQotI2RlZmluZSBMRU5fTVNHMV8yV0FZICAgICAgICAgICAgICAgMHg3ZgotI2RlZmluZSBNQVhfTEVOX09GX0VBUF9IUyAgICAgICAgICAgMjU2Ci0KLSNkZWZpbmUgTEVOX01BU1RFUl9LRVkJCQkJMzIKLQotLy8gRUFQT0wgRUssIE1LCi0jZGVmaW5lIExFTl9FQVBfRUsJCQkJCTE2Ci0jZGVmaW5lIExFTl9FQVBfTUlDSwkJCQkxNgotI2RlZmluZSBMRU5fRUFQX0tFWQkJCQkJKChMRU5fRUFQX0VLKSsoTEVOX0VBUF9NSUNLKSkKLS8vIFRLSVAga2V5IHJlbGF0ZWQKLSNkZWZpbmUgTEVOX1BNS0lECQkJCQkxNgotI2RlZmluZSBMRU5fVEtJUF9FSwkJCQkJMTYKLSNkZWZpbmUgTEVOX1RLSVBfUlhNSUNLCQkJCTgKLSNkZWZpbmUgTEVOX1RLSVBfVFhNSUNLCQkJCTgKLSNkZWZpbmUgTEVOX0FFU19FSwkJCQkJMTYKLSNkZWZpbmUgTEVOX0FFU19LRVkJCQkJCUxFTl9BRVNfRUsKLSNkZWZpbmUgTEVOX1RLSVBfS0VZCQkJCSgoTEVOX1RLSVBfRUspKyhMRU5fVEtJUF9SWE1JQ0spKyhMRU5fVEtJUF9UWE1JQ0spKQotI2RlZmluZSBUS0lQX0FQX1RYTUlDS19PRkZTRVQJCSgoTEVOX0VBUF9LRVkpKyhMRU5fVEtJUF9FSykpCi0jZGVmaW5lIFRLSVBfQVBfUlhNSUNLX09GRlNFVAkJKFRLSVBfQVBfVFhNSUNLX09GRlNFVCtMRU5fVEtJUF9UWE1JQ0spCi0jZGVmaW5lIFRLSVBfR1RLX0xFTkdUSAkJCQkoKExFTl9US0lQX0VLKSsoTEVOX1RLSVBfUlhNSUNLKSsoTEVOX1RLSVBfVFhNSUNLKSkKLSNkZWZpbmUgTEVOX1BUSwkJCQkJCSgoTEVOX0VBUF9LRVkpKyhMRU5fVEtJUF9LRVkpKQotI2RlZmluZSBNSU5fTEVOX09GX0dUSwkJCQk1Ci0jZGVmaW5lIExFTl9QTUsJCQkJCQkzMgotI2RlZmluZSBMRU5fUE1LX05BTUUJCQkJMTYKLSNkZWZpbmUgTEVOX05PTkNFCQkJCQkzMgotCi0vLyBSU04gSUUgTGVuZ3RoIGRlZmluaXRpb24KLSNkZWZpbmUgTUFYX0xFTl9PRl9SU05JRQkJMjU1Ci0jZGVmaW5lIE1JTl9MRU5fT0ZfUlNOSUUJCTgKLQotI2RlZmluZSBLRVlfTElGRVRJTUUJCQkJMzYwMAotCi0vL0VBUCBQYWNrZXQgVHlwZQotI2RlZmluZQlFQVBQYWNrZXQJCTAKLSNkZWZpbmUJRUFQT0xTdGFydAkJMQotI2RlZmluZQlFQVBPTExvZ29mZgkJMgotI2RlZmluZQlFQVBPTEtleQkJMwotI2RlZmluZQlFQVBPTEFTRkFsZXJ0CTQKLSNkZWZpbmUJRUFQVHR5cGVNYXgJCTUKLQotI2RlZmluZQlFQVBPTF9NU0dfSU5WQUxJRAkwCi0jZGVmaW5lCUVBUE9MX1BBSVJfTVNHXzEJMQotI2RlZmluZQlFQVBPTF9QQUlSX01TR18yCTIKLSNkZWZpbmUJRUFQT0xfUEFJUl9NU0dfMwkzCi0jZGVmaW5lCUVBUE9MX1BBSVJfTVNHXzQJNAotI2RlZmluZQlFQVBPTF9HUk9VUF9NU0dfMQk1Ci0jZGVmaW5lCUVBUE9MX0dST1VQX01TR18yCTYKLQotI2RlZmluZSBQQUlSV0lTRUtFWQkJCQkJMQotI2RlZmluZSBHUk9VUEtFWQkJCQkJMAotCi0vLyBSZXRyeSB0aW1lciBjb3VudGVyIGluaXRpYWwgdmFsdWUKLSNkZWZpbmUgUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUiAgICAgICAgICAgMAotI2RlZmluZSBQRUVSX01TRzNfUkVUUllfVElNRVJfQ1RSICAgICAgICAgICAxMAotI2RlZmluZSBHUk9VUF9NU0cxX1JFVFJZX1RJTUVSX0NUUiAgICAgICAgICAyMAotCi0vLyBXUEEgbWVjaGFuaXNtIHJldHJ5IHRpbWVyIGludGVydmFsCi0jZGVmaW5lIFBFRVJfTVNHMV9SRVRSWV9FWEVDX0lOVFYgICAgICAgICAgIDEwMDAJCQkvLyAxIHNlYwotI2RlZmluZSBQRUVSX01TRzNfUkVUUllfRVhFQ19JTlRWICAgICAgICAgICAzMDAwCQkJLy8gMyBzZWMKLSNkZWZpbmUgR1JPVVBfS0VZX1VQREFURV9FWEVDX0lOVFYgICAgICAgICAgMTAwMAkJCQkvLyAxIHNlYwotI2RlZmluZSBQRUVSX0dST1VQX0tFWV9VUERBVEVfSU5JVgkJCTIwMDAJCQkJLy8gMiBzZWMKLQotI2RlZmluZSBFTlFVRVVFX0VBUE9MX1NUQVJUX1RJTUVSCQkJMjAwCQkJCQkvLyAyMDAgbXMKLQotLy8gZ3JvdXAgcmVrZXkgaW50ZXJ2YWwKLSNkZWZpbmUgVElNRV9SRUtFWSAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBQS1RfUkVLRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIERJU0FCTEVfUkVLRVkgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTUFYX1JFS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgMgotCi0jZGVmaW5lIE1BWF9SRUtFWV9JTlRFUiAgICAgICAgICAgICAgICAgICAgIDB4M2ZmZmZmZgotCi0jZGVmaW5lIEdST1VQX1NVSVRFCQkJCQkwCi0jZGVmaW5lIFBBSVJXSVNFX1NVSVRFCQkJCTEKLSNkZWZpbmUgQUtNX1NVSVRFCQkJCQkyCi0jZGVmaW5lIFBNS0lEX0xJU1QJCQkJCTMKLQotCi0jZGVmaW5lIEVBUE9MX1NUQVJUX0RJU0FCTEUJCQkJCTAKLSNkZWZpbmUgRUFQT0xfU1RBUlRfUFNLCQkJCQkJMQotI2RlZmluZSBFQVBPTF9TVEFSVF8xWAkJCQkJCTIKLQotI2RlZmluZSBNSVhfQ0lQSEVSX1dQQV9US0lQX09OKHgpICAgICAgICgoKHgpICYgMHgwOCkgIT0gMCkKLSNkZWZpbmUgTUlYX0NJUEhFUl9XUEFfQUVTX09OKHgpICAgICAgICAoKCh4KSAmIDB4MDQpICE9IDApCi0jZGVmaW5lIE1JWF9DSVBIRVJfV1BBMl9US0lQX09OKHgpICAgICAgKCgoeCkgJiAweDAyKSAhPSAwKQotI2RlZmluZSBNSVhfQ0lQSEVSX1dQQTJfQUVTX09OKHgpICAgICAgICgoKHgpICYgMHgwMSkgIT0gMCkKLQotI2lmbmRlZiBST1VORF9VUAotI2RlZmluZSBST1VORF9VUChfX3gsIF9feSkgXAotCSgoKFVMT05HKSgoX194KSsoKF9feSktMSkpKSAmICgoVUxPTkcpfigoX195KS0xKSkpCi0jZW5kaWYKLQotI2RlZmluZQlTRVRfVUlOVDE2X1RPX0FSUkFSWShfViwgX0xFTikJCVwKLXsJCQkJCQkJCQkJCVwKLQlfVlswXSA9IChfTEVOICYgMHhGRjAwKSA+PiA4OwkJCVwKLQlfVlsxXSA9IChfTEVOICYgMHhGRik7CQkJCQlcCi19Ci0KLSNkZWZpbmUJSU5DX1VJTlQxNl9UT19BUlJBUlkoX1YsIF9MRU4pCQkJXAotewkJCQkJCQkJCQkJCVwKLQlVSU5UMTYJdmFyX2xlbjsJCQkJCQkJXAotCQkJCQkJCQkJCQkJXAotCXZhcl9sZW4gPSAoX1ZbMF08PDgpIHwgKF9WWzFdKTsJCQkJXAotCXZhcl9sZW4gKz0gX0xFTjsJCQkJCQkJXAotCQkJCQkJCQkJCQkJXAotCV9WWzBdID0gKHZhcl9sZW4gJiAweEZGMDApID4+IDg7CQkJXAotCV9WWzFdID0gKHZhcl9sZW4gJiAweEZGKTsJCQkJCVwKLX0KLQotI2RlZmluZQlDT05WX0FSUkFSWV9UT19VSU5UMTYoX1YpCSgoX1ZbMF08PDgpIHwgKF9WWzFdKSkKLQotCi0jZGVmaW5lCUFERF9PTkVfVG9fNjRCSVRfVkFSKF9WKQkJXAotewkJCQkJCQkJCQlcCi0JVUNIQVIJY250ID0gTEVOX0tFWV9ERVNDX1JFUExBWTsJXAotCWRvCQkJCQkJCQkJXAotCXsJCQkJCQkJCQlcCi0JCWNudC0tOwkJCQkJCQlcCi0JCV9WW2NudF0rKzsJCQkJCQlcCi0JCWlmIChjbnQgPT0gMCkJCQkJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQl9d2hpbGUgKF9WW2NudF0gPT0gMCk7CQkJCVwKLX0KLQotI2RlZmluZSBJU19XUEFfQ0FQQUJJTElUWShhKSAgICAgICAoKChhKSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmICgoYSkgPD0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQotCi0vLyBFQVBPTCBLZXkgSW5mb3JtYXRpb24gZGVmaW5pdGlvbiB3aXRoaW4gS2V5IGRlc2NyaXB0b3IgZm9ybWF0Ci10eXBlZGVmCXN0cnVjdCBQQUNLRUQgX0tFWV9JTkZPCi17Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCUtleUFjazoxOwotICAgIFVDSEFSCUluc3RhbGw6MTsKLSAgICBVQ0hBUglLZXlJbmRleDoyOwotICAgIFVDSEFSCUtleVR5cGU6MTsKLSAgICBVQ0hBUglLZXlEZXNjVmVyOjM7Ci0gICAgVUNIQVIJUnN2ZDozOwotICAgIFVDSEFSCUVLRF9ETDoxOwkJLy8gRUtEIGZvciBBUDsgREwgZm9yIFNUQQotICAgIFVDSEFSCVJlcXVlc3Q6MTsKLSAgICBVQ0hBUglFcnJvcjoxOwotICAgIFVDSEFSCVNlY3VyZToxOwotICAgIFVDSEFSCUtleU1pYzoxOwotI2Vsc2UKLQlVQ0hBUglLZXlNaWM6MTsKLQlVQ0hBUglTZWN1cmU6MTsKLQlVQ0hBUglFcnJvcjoxOwotCVVDSEFSCVJlcXVlc3Q6MTsKLQlVQ0hBUglFS0RfREw6MTsgICAgICAgLy8gRUtEIGZvciBBUDsgREwgZm9yIFNUQQotCVVDSEFSCVJzdmQ6MzsKLQlVQ0hBUglLZXlEZXNjVmVyOjM7Ci0JVUNIQVIJS2V5VHlwZToxOwotCVVDSEFSCUtleUluZGV4OjI7Ci0JVUNIQVIJSW5zdGFsbDoxOwotCVVDSEFSCUtleUFjazoxOwotI2VuZGlmCi19CUtFWV9JTkZPLCAqUEtFWV9JTkZPOwotCi0vLyBFQVBPTCBLZXkgZGVzY3JpcHRvciBmb3JtYXQKLXR5cGVkZWYJc3RydWN0IFBBQ0tFRCBfS0VZX0RFU0NSSVBURVIKLXsKLQlVQ0hBUgkJVHlwZTsKLQlLRVlfSU5GTwlLZXlJbmZvOwotCVVDSEFSCQlLZXlMZW5ndGhbMl07Ci0JVUNIQVIJCVJlcGxheUNvdW50ZXJbTEVOX0tFWV9ERVNDX1JFUExBWV07Ci0JVUNIQVIJCUtleU5vbmNlW0xFTl9LRVlfREVTQ19OT05DRV07Ci0JVUNIQVIJCUtleUl2W0xFTl9LRVlfREVTQ19JVl07Ci0JVUNIQVIJCUtleVJzY1tMRU5fS0VZX0RFU0NfUlNDXTsKLQlVQ0hBUgkJS2V5SWRbTEVOX0tFWV9ERVNDX0lEXTsKLQlVQ0hBUgkJS2V5TWljW0xFTl9LRVlfREVTQ19NSUNdOwotCVVDSEFSCQlLZXlEYXRhTGVuWzJdOwotCVVDSEFSCQlLZXlEYXRhW01BWF9MRU5fT0ZfUlNOSUVdOwotfQlLRVlfREVTQ1JJUFRFUiwgKlBLRVlfREVTQ1JJUFRFUjsKLQotdHlwZWRlZglzdHJ1Y3QgUEFDS0VEIF9FQVBPTF9QQUNLRVQKLXsKLQlVQ0hBUgkJCQlQcm9WZXI7Ci0JVUNIQVIJCQkJUHJvVHlwZTsKLQlVQ0hBUgkJCQlCb2R5X0xlblsyXTsKLQlLRVlfREVTQ1JJUFRFUgkJS2V5RGVzYzsKLX0JRUFQT0xfUEFDS0VULCAqUEVBUE9MX1BBQ0tFVDsKLQotLy84MDIuMTFpIEQxMCBwYWdlIDgzCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0dUS19FTkNBUAotewotI2lmbmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgVUNIQVIgICAgICAgICAgICAgICBLaWQ6MjsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIHR4OjE7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICByc3Y6NTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIHJzdjE7Ci0jZWxzZQotICAgIFVDSEFSICAgICAgICAgICAgICAgcnN2OjU7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICB0eDoxOwotICAgIFVDSEFSICAgICAgICAgICAgICAgS2lkOjI7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICByc3YxOwotI2VuZGlmCi0gICAgVUNIQVIgICAgICAgICAgICAgICBHVEtbVEtJUF9HVEtfTEVOR1RIXTsKLX0gICBHVEtfRU5DQVAsICpQR1RLX0VOQ0FQOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0tERV9FTkNBUAotewotICAgIFVDSEFSICAgICAgICAgICAgICAgVHlwZTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIExlbjsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIE9VSVszXTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIERhdGFUeXBlOwotICAgIEdUS19FTkNBUCAgICAgIEdUS0VuY2FwOwotfSAgIEtERV9FTkNBUCwgKlBLREVfRU5DQVA7Ci0KLS8vIEZvciBXUEExCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTklFIHsKLSAgICBVQ0hBUiAgIG91aVs0XTsKLSAgICBVU0hPUlQgIHZlcnNpb247Ci0gICAgVUNIQVIgICBtY2FzdFs0XTsKLSAgICBVU0hPUlQgIHVjb3VudDsKLSAgICBzdHJ1Y3QgUEFDS0VEIHsKLSAgICAgICAgVUNIQVIgb3VpWzRdOwotICAgIH11Y2FzdFsxXTsKLX0gUlNOSUUsICpQUlNOSUU7Ci0KLS8vIEZvciBXUEEyCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTklFMiB7Ci0gICAgVVNIT1JUICB2ZXJzaW9uOwotICAgIFVDSEFSICAgbWNhc3RbNF07Ci0gICAgVVNIT1JUICB1Y291bnQ7Ci0gICAgc3RydWN0IFBBQ0tFRCB7Ci0gICAgICAgIFVDSEFSIG91aVs0XTsKLSAgICB9dWNhc3RbMV07Ci19IFJTTklFMiwgKlBSU05JRTI7Ci0KLS8vIEFLTSBTdWl0ZQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05JRV9BVVRIIHsKLSAgICBVU0hPUlQgYWNvdW50OwotICAgIHN0cnVjdCBQQUNLRUQgewotICAgICAgICBVQ0hBUiBvdWlbNF07Ci0gICAgfWF1dGhbMV07Ci19IFJTTklFX0FVVEgsKlBSU05JRV9BVVRIOwotCi10eXBlZGVmCXVuaW9uIFBBQ0tFRCBfUlNOX0NBUEFCSUxJVElFUwl7Ci0Jc3RydWN0CVBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotICAgICAgICBVU0hPUlQJCVJzdmQ6MTA7Ci0gICAgICAgIFVTSE9SVAkJR1RLU0FfUl9Db3VudGVyOjI7Ci0gICAgICAgIFVTSE9SVAkJUFRLU0FfUl9Db3VudGVyOjI7Ci0gICAgICAgIFVTSE9SVAkJTm9fUGFpcndpc2U6MTsKLQkJVVNIT1JUCQlQcmVBdXRoOjE7Ci0jZWxzZQotICAgICAgICBVU0hPUlQJCVByZUF1dGg6MTsKLQkJVVNIT1JUCQlOb19QYWlyd2lzZToxOwotCQlVU0hPUlQJCVBUS1NBX1JfQ291bnRlcjoyOwotCQlVU0hPUlQJCUdUS1NBX1JfQ291bnRlcjoyOwotCQlVU0hPUlQJCVJzdmQ6MTA7Ci0jZW5kaWYKLQl9CWZpZWxkOwotCVVTSE9SVAkJCXdvcmQ7Ci19CVJTTl9DQVBBQklMSVRJRVMsICpQUlNOX0NBUEFCSUxJVElFUzsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9FQVBfSERSIHsKLSAgICBVQ0hBUiAgIFByb1ZlcjsKLSAgICBVQ0hBUiAgIFByb1R5cGU7Ci0gICAgVUNIQVIgICBCb2R5X0xlblsyXTsKLSAgICBVQ0hBUiAgIGNvZGU7Ci0gICAgVUNIQVIgICBpZGVudGlmaWVyOwotICAgIFVDSEFSICAgbGVuZ3RoWzJdOyAvLyBpbmNsdWRpbmcgY29kZSBhbmQgaWRlbnRpZmllciwgZm9sbG93ZWQgYnkgbGVuZ3RoLTIgb2N0ZXRzIG9mIGRhdGEKLX0gRUFQX0hEUiwgKlBFQVBfSERSOwotCi0vLyBGb3Igc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lIHN0YXRlcy4gODAyLjExaSBEcmFmdCA0LjEsIHAuIDk3Ci0vLyBXZSBzaW1wbGlmaWVkIGl0Ci10eXBlZGVmCWVudW0JX1dwYVN0YXRlCi17Ci0JU1NfTk9UVVNFLAkJCQkvLyAwCi0JU1NfU1RBUlQsCQkJCS8vIDEKLQlTU19XQUlUX01TR18zLAkJCS8vIDIKLQlTU19XQUlUX0dST1VQLAkJCS8vIDMKLQlTU19GSU5JU0gsCQkJLy8gNAotCVNTX0tFWVVQREFURSwJCQkvLyA1Ci19CVdQQV9TVEFURTsKLQotLy8KLS8vCVRoZSBkZWZpbml0aW9uIG9mIHRoZSBjaXBoZXIgY29tYmluYXRpb24KLS8vCi0vLwkgYml0MwliaXQyICBiaXQxICAgYml0MAotLy8JKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCi0vLwl8CSAgV1BBCSB8CSAgIFdQQTIgICB8Ci0vLwkrLS0tLS0tKy0tLS0tKy0tLS0tLSstLS0tLSsKLS8vCXwgVEtJUCB8IEFFUyB8IFRLSVAgfCBBRVMgfAotLy8JfAkwICB8ICAxICB8ICAgMSAgfCAgMCAgfCAtPiAweDA2Ci0vLwl8CTAgIHwgIDEgIHwgICAxICB8ICAxICB8IC0+IDB4MDcKLS8vCXwJMSAgfCAgMCAgfCAgIDAgIHwgIDEgIHwgLT4gMHgwOQotLy8JfAkxICB8ICAwICB8ICAgMSAgfCAgMSAgfCAtPiAweDBCCi0vLwl8CTEgIHwgIDEgIHwgICAwICB8ICAxICB8IC0+IDB4MEQKLS8vCXwJMSAgfCAgMSAgfCAgIDEgIHwgIDAgIHwgLT4gMHgwRQotLy8JfAkxICB8ICAxICB8ICAgMSAgfCAgMSAgfAktPiAweDBGCi0vLwkrLS0tLS0tKy0tLS0tKy0tLS0tLSstLS0tLSsKLS8vCi10eXBlZGVmCWVudW0JX1dwYU1peFBhaXJDaXBoZXIKLXsKLQlNSVhfQ0lQSEVSX05PVFVTRQkJCT0gMHgwMCwKLQlXUEFfTk9ORV9XUEEyX1RLSVBBRVMJCT0gMHgwMywJCS8vIFdQQTItVEtJUEFFUwotCVdQQV9BRVNfV1BBMl9US0lQCQkJPSAweDA2LAotCVdQQV9BRVNfV1BBMl9US0lQQUVTCQk9IDB4MDcsCi0JV1BBX1RLSVBfV1BBMl9BRVMJCQk9IDB4MDksCi0JV1BBX1RLSVBfV1BBMl9US0lQQUVTCQk9IDB4MEIsCi0JV1BBX1RLSVBBRVNfV1BBMl9OT05FCQk9IDB4MEMsCQkvLyBXUEEtVEtJUEFFUwotCVdQQV9US0lQQUVTX1dQQTJfQUVTCQk9IDB4MEQsCi0JV1BBX1RLSVBBRVNfV1BBMl9US0lQCQk9IDB4MEUsCi0JV1BBX1RLSVBBRVNfV1BBMl9US0lQQUVTCT0gMHgwRiwKLX0JV1BBX01JWF9QQUlSX0NJUEhFUjsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05fSUVfSEVBREVSX1NUUlVDVAl7Ci0JVUNIQVIJCUVpZDsKLQlVQ0hBUgkJTGVuZ3RoOwotCVVTSE9SVAkJVmVyc2lvbjsJLy8gTGl0dGxlIGVuZGlhbiBmb3JtYXQKLX0JUlNOX0lFX0hFQURFUl9TVFJVQ1QsICpQUlNOX0lFX0hFQURFUl9TVFJVQ1Q7Ci0KLS8vIENpcGhlciBzdWl0ZSBzZWxlY3RvciB0eXBlcwotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSVBIRVJfU1VJVEVfU1RSVUNUCXsKLQlVQ0hBUgkJT3VpWzNdOwotCVVDSEFSCQlUeXBlOwotfQlDSVBIRVJfU1VJVEVfU1RSVUNULCAqUENJUEhFUl9TVUlURV9TVFJVQ1Q7Ci0KLS8vIEF1dGhlbnRpY2F0aW9uIGFuZCBLZXkgTWFuYWdlbWVudCBzdWl0ZSBzZWxlY3RvcgotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9BS01fU1VJVEVfU1RSVUNUCXsKLQlVQ0hBUgkJT3VpWzNdOwotCVVDSEFSCQlUeXBlOwotfQlBS01fU1VJVEVfU1RSVUNULCAqUEFLTV9TVUlURV9TVFJVQ1Q7Ci0KLS8vIFJTTiBjYXBhYmlsaXR5Ci10eXBlZGVmIHN0cnVjdAlQQUNLRUQgX1JTTl9DQVBBQklMSVRZCXsKLQlVU0hPUlQJCVJzdjoxMDsKLQlVU0hPUlQJCUdUS1NBUmVwbGF5Q250OjI7Ci0JVVNIT1JUCQlQVEtTQVJlcGxheUNudDoyOwotCVVTSE9SVAkJTm9QYWlyd2lzZToxOwotCVVTSE9SVAkJUHJlQXV0aDoxOwotfQlSU05fQ0FQQUJJTElUWSwgKlBSU05fQ0FQQUJJTElUWTsKLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlUaGUgcHJvdG90eXBlIGlzIGRlZmluZWQgaW4gY21tX3dwYS5jCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotQk9PTEVBTiBXcGFNc2dUeXBlU3Vic3QoCi0JSU4gIFVDSEFSICAgRUFQVHlwZSwKLQlPVVQgSU5UCQkqTXNnVHlwZSk7Ci0KLVZPSUQgICAgUFJGKAotCUlOICBVQ0hBUiAgICprZXksCi0JSU4gIElOVCAgICAga2V5X2xlbiwKLQlJTiAgVUNIQVIgICAqcHJlZml4LAotCUlOICBJTlQgICAgIHByZWZpeF9sZW4sCi0JSU4gIFVDSEFSICAgKmRhdGEsCi0JSU4gIElOVCAgICAgZGF0YV9sZW4sCi0JT1VUIFVDSEFSICAgKm91dHB1dCwKLQlJTiAgSU5UICAgICBsZW4pOwotCi1pbnQgUGFzc3dvcmRIYXNoKAotCWNoYXIgKnBhc3N3b3JkLAotCXVuc2lnbmVkIGNoYXIgKnNzaWQsCi0JaW50IHNzaWRsZW5ndGgsCi0JdW5zaWduZWQgY2hhciAqb3V0cHV0KTsKLQotUFVJTlQ4CUdldFN1aXRlRnJvbVJTTklFKAotCQlJTglQVUlOVDgJcnNuaWUsCi0JCUlOCVVJTlQJcnNuaWVfbGVuLAotCQlJTglVSU5UOAl0eXBlLAotCQlPVVQJVUlOVDgJKmNvdW50KTsKLQotVk9JRCBXcGFTaG93QWxsc3VpdGUoCi0JSU4JUFVJTlQ4CXJzbmllLAotCUlOCVVJTlQJcnNuaWVfbGVuKTsKLQotVk9JRCBSVE1QSW5zZXJ0UlNOSUUoCi0JSU4gUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBQVUlOVDggcnNuaWVfcHRyLAotCUlOIFVJTlQ4ICByc25pZV9sZW4sCi0JSU4gUFVJTlQ4IHBta2lkX3B0ciwKLQlJTiBVSU5UOCAgcG1raWRfbGVuKTsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvS2NvbmZpZwppbmRleCAzMjExZGQzLi5lMjRhNmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9LY29uZmlnCkBAIC0xLDcgKzEsOCBAQAotY29uZmlnIFJUTDgxODdTRQorY29uZmlnIFI4MTg3U0UKIAl0cmlzdGF0ZSAiUmVhbFRlayBSVEw4MTg3U0UgV2lyZWxlc3MgTEFOIE5JQyBkcml2ZXIiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgV0xBTgogCXNlbGVjdCBXSVJFTEVTU19FWFQKIAlzZWxlY3QgV0VYVF9QUklWCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQorCSAgSWYgYnVpbHQgYXMgYSBtb2R1bGUsIGl0IHdpbGwgYmUgY2FsbGVkIHI4MTg3c2Uua28uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9NYWtlZmlsZQppbmRleCBhYzM1Y2ZmLi5iMzk1YWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvTWFrZWZpbGUKQEAgLTE2LDcgKzE2LDcgQEAKIAogI0VYVFJBX0NGTEFHUyArPSAtbWhhcmQtZmxvYXQgLURDT05GSUdfRk9SQ0VfSEFSRF9GTE9BVD15CiAKLXJ0bDgxODdzZS1vYmpzIDo9CQkJXAorcjgxODdzZS1vYmpzIDo9CQkJXAogCQlyODE4MF9jb3JlLm8JCVwKIAkJcjgxODBfOTNjeDYubwkJXAogCQlyODE4MF93eC5vCQlcCkBAIC0zNSw1ICszNSw1IEBACiAJCWllZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5vCVwKIAkJaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAubwogCi1vYmotJChDT05GSUdfUlRMODE4N1NFKQkrPSBydGw4MTg3c2Uubworb2JqLSQoQ09ORklHX1I4MTg3U0UpCSs9IHI4MTg3c2UubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfcnguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCmluZGV4IDVlMmU3OWIxLi5mODgyZGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfcnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpAQCAtMzcsNyArMzcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCmluZGV4IDMzNGU0YzcuLjFmZTE5YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwpAQCAtMTgzNyw3ICsxODM3LDcgQEAKIAogCQkJCQkgCSAgICAgICAgICAgIGlmICgoKGllZWUtPmN1cnJlbnRfbmV0d29yay53bW1faW5mb15pbmZvX2VsZW1lbnQtPmRhdGFbNl0pJiBcCiAJCQkJCQkJCQkJICAgIDB4MGYpfHwoIWllZWUtPmluaXRfd21tcGFyYW1fZmxhZykpIHsKLQkJCQkJCSAgIAkgICAgICAvL3JlZnJlc2ggcGFyYW1ldGUgZWxlbWVudCBmb3IgY3VycmVudCBuZXR3b3JrCisJCQkJCQkgICAJICAgICAgLy8gcmVmcmVzaCBwYXJhbWV0ZXIgZWxlbWVudCBmb3IgY3VycmVudCBuZXR3b3JrCiAJCQkJCQkJICAgICAgLy8gdXBkYXRlIHRoZSByZWdpc3RlciBwYXJhbWV0ZXIgZm9yIGhhcmR3YXJlCiAJCQkJCQkJICAgICAgaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnID0gMTsKIAkJCQkJCQkgICAgICBxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+d21tX3BhcmFtX3VwZGF0ZV93cSk7CkBAIC0xOTU4LDEwICsxOTU4LDEwIEBACiAgKiBjYXJlIG9mIHRoZSBpZWVlODAyLjExIGZyYWdtZW50YXRpb24uCiAgKiBTbyB0aGUgZHJpdmVyIHJlY2VpdmVzIGEgZnJhZ21lbnQgcGVyIHRpbWUgYW5kIG1pZ2h0CiAgKiBjYWxsIHRoZSBzdG9wIGZ1bmN0aW9uIHdoZW4gaXQgd2FudCB3aXRob3V0IHRha2UgY2FyZQotICogdG8gaGF2ZSBlbm91Z2h0IHJvb20gdG8gVFggYW4gZW50aXJlIHBhY2tldC4KKyAqIHRvIGhhdmUgZW5vdWdoIHJvb20gdG8gVFggYW4gZW50aXJlIHBhY2tldC4KICAqIFRoaXMgbWlnaHQgYmUgdXNlZnVsIGlmIGVhY2ggZnJhZ21lbnQgbmVlZCBpdCdzIG93bgogICogZGVzY3JpcHRvciwgdGh1cyBqdXN0IGtlZXAgYSB0b3RhbCBmcmVlIG1lbW9yeSA+IHRoYW4KLSAqIHRoZSBtYXggZnJhZ21lbnRhdGlvbiB0cmVzaG9sZCBpcyBub3QgZW5vdWdodC4uIElmIHRoZQorICogdGhlIG1heCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCBpcyBub3QgZW5vdWdoLi4gSWYgdGhlCiAgKiBpZWVlODAyLjExIHN0YWNrIHBhc3NlZCBhIFRYQiBzdHJ1Y3QgdGhlbiB5b3UgbmVlZGVkCiAgKiB0byBrZWVwIE4gZnJlZSBkZXNjcmlwdG9ycyB3aGVyZQogICogTiA9IE1BWF9QQUNLRVRfU0laRSAvIE1JTl9GUkFHX1RSRVNIT0xECmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfdHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCmluZGV4IGUyOTQ1ZGIuLmRkZTFmMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCkBAIC00Nyw3ICs0Nyw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwppbmRleCBhMDhiOTdhLi42YWFkNDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwpAQCAtMzAsNyArMzAsNiBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwLmgKaW5kZXggMzVlZDYwYi4uY2U4Mjg4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODAuaApAQCAtNzcsMjEgKzc3LDYgQEAKIAlXSVJFTEVTU19NT0RFX0FVVE8gPSAweDA4LAogfSBXSVJFTEVTU19NT0RFOwogCi10eXBlZGVmIGVudW0gX1ZFUlNJT05fODE4NXsKLQkvLyBSVEw4MTg1Ci0JVkVSU0lPTl84MTg1X1VOS05PV04sCi0JVkVSU0lPTl84MTg1X0MsIC8vIEMtY3V0Ci0JVkVSU0lPTl84MTg1X0QsIC8vIEQtY3V0Ci0JLy8gUlRMODE4NUIKLQlWRVJTSU9OXzgxODVCX0IsIC8vIEItY3V0Ci0JVkVSU0lPTl84MTg1Ql9ELCAvLyBELWN1dAotCVZFUlNJT05fODE4NUJfRSwgLy8gRS1jdXQKLQkvL1JUTDgxODdTLVBDSUUKLQlWRVJTSU9OXzgxODdTX0IsIC8vIEItY3V0Ci0JVkVSU0lPTl84MTg3U19DLCAvLyBDLWN1dAotCVZFUlNJT05fODE4N1NfRCwgLy8gRC1jdXQKLQotfVZFUlNJT05fODE4NSwqUFZFUlNJT05fODE4NTsKIHR5cGVkZWYgc3RydWN0IAlDaG5sQWNjZXNzU2V0dGluZyB7CiAJdTE2IFNJRlNfVGltZXI7CiAJdTE2IERJRlNfVGltZXI7CkBAIC0zNDEsMTEgKzMyNiw4IEBACiAJaW50IGlycTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTgwMjExOwogCi0gICAgICAgIHNob3J0IGNhcmRfODE4NTsgLyogTzogcnRsODE4MCwgMTpydGw4MTg1IFYgQi9DLCAyOnJ0bDgxODUgViBELCAzOnJ0bDgxODVCICovCi0Jc2hvcnQgY2FyZF84MTg1X0J2ZXJzaW9uOyAvKiBpZiBUQ1IgcmVwb3J0cyBjYXJkIFYgQi9DIHRoaXMgZGlzY3JpbWluYXRlcyAqLwogCXNob3J0IHBoeV92ZXI7IC8qIG1lYW5pbmdmdWwgZm9yIHJ0bDgyMjUgMTpBIDI6QiAzOkMgKi8KIAlzaG9ydCBlbmFibGVfZ3BpbzA7Ci0JZW51bSBjYXJkX3R5cGUge1BDSSxNSU5JUENJLENBUkRCVVMsVVNCLypydGw4MTg3Ki99Y2FyZF90eXBlOwogCXNob3J0IGh3X3BsY3BfbGVuOwogCXNob3J0IHBsY3BfcHJlYW1ibGVfbW9kZTsgLy8gMDphdXRvIDE6c2hvcnQgMjpsb25nCiAKQEAgLTU5OSw3ICs1ODEsNyBAQAogCXU4CQkJCQkJUlNTSTsKIAljaGFyCQkJCQlSeFBvd2VyOwogCSB1OCBJbml0aWFsR2FpbjsKLQkgLy9Gb3IgYWRqdXN0IERpZyBUaHJlc2hob2xkIGR1cmluZyBMZWdhY3kvTGVpc3VyZSBQb3dlciBTYXZlIE1vZGUKKwkgLy9Gb3IgYWRqdXN0IERpZyBUaHJlc2hvbGQgZHVyaW5nIExlZ2FjeS9MZWlzdXJlIFBvd2VyIFNhdmUgTW9kZQogCXUzMgkJCQlEb3plUGVyaW9kSW5QYXN0MlNlYzsKIAkgLy8gRG9uJ3QgYWNjZXNzIEJCL1JGIHVuZGVyIGRpc2FibGUgUExMIHNpdHVhdGlvbi4KIAl1OAkJCQkJSW5pdGlhbEdhaW5CYWNrVXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jCmluZGV4IDUzZTY1NGQuLjU3YzYyYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jCkBAIC04ODYsOCArODg2LDYgQEAKIAkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9BTExNQUNfRlJBTUVfU0hJRlQpOwogCX1lbHNlewogCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX05JQ01BQ19GUkFNRV9TSElGVCk7Ci0JCWlmKHByaXYtPmNhcmRfODE4NSA9PSAwKQotCQkJcnhjb25mID0gcnhjb25mIHwgKDE8PFJYX0NIRUNLX0JTU0lEX1NISUZUKTsKIAl9CiAKIAlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKXsKQEAgLTkxMCw5ICs5MDgsNiBAQAogCiAJcnhjb25mID0gcnhjb25mICZ+IFJDUl9DU19NQVNLOwogCi0JaWYgKCFwcml2LT5jYXJkXzgxODUpCi0JCXJ4Y29uZiB8PSAocHJpdi0+cmNyX2NzZW5zZTw8UkNSX0NTX1NISUZUKTsKLQogCXdyaXRlX25pY19kd29yZChkZXYsIFJYX0NPTkYsIHJ4Y29uZik7CiAKIAlmaXhfcnhfZmlmbyhkZXYpOwpAQCAtOTY0LDI4ICs5NTksMTkgQEAKIAogCXR4Y29uZiA9IHJlYWRfbmljX2R3b3JkKGRldiwgVFhfQ09ORik7CiAKLQlpZiAocHJpdi0+Y2FyZF84MTg1KSB7Ci0JCWJ5dGUgPSByZWFkX25pY19ieXRlKGRldixDV19DT05GKTsKLQkJYnl0ZSAmPSB+KDE8PENXX0NPTkZfUEVSUEFDS0VUX0NXX1NISUZUKTsKLQkJYnl0ZSAmPSB+KDE8PENXX0NPTkZfUEVSUEFDS0VUX1JFVFJZX1NISUZUKTsKLQkJd3JpdGVfbmljX2J5dGUoZGV2LCBDV19DT05GLCBieXRlKTsKKwlieXRlID0gcmVhZF9uaWNfYnl0ZShkZXYsIENXX0NPTkYpOworCWJ5dGUgJj0gfigxPDxDV19DT05GX1BFUlBBQ0tFVF9DV19TSElGVCk7CisJYnl0ZSAmPSB+KDE8PENXX0NPTkZfUEVSUEFDS0VUX1JFVFJZX1NISUZUKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENXX0NPTkYsIGJ5dGUpOwogCi0JCXR4X2FnY19jdGwgPSByZWFkX25pY19ieXRlKGRldiwgVFhfQUdDX0NUTCk7Ci0JCXR4X2FnY19jdGwgJj0gfigxPDxUWF9BR0NfQ1RMX1BFUlBBQ0tFVF9HQUlOX1NISUZUKTsKLQkJdHhfYWdjX2N0bCAmPSB+KDE8PFRYX0FHQ19DVExfUEVSUEFDS0VUX0FOVFNFTF9TSElGVCk7Ci0JCXR4X2FnY19jdGwgfD0oMTw8VFhfQUdDX0NUTF9GRUVEQkFDS19BTlQpOwotCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0FHQ19DVEwsIHR4X2FnY19jdGwpOwotCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4ZWMsIDB4M2YpOyAvKiBEaXNhYmxlIGVhcmx5IFRYICovCi0JfQorCXR4X2FnY19jdGwgPSByZWFkX25pY19ieXRlKGRldiwgVFhfQUdDX0NUTCk7CisJdHhfYWdjX2N0bCAmPSB+KDE8PFRYX0FHQ19DVExfUEVSUEFDS0VUX0dBSU5fU0hJRlQpOworCXR4X2FnY19jdGwgJj0gfigxPDxUWF9BR0NfQ1RMX1BFUlBBQ0tFVF9BTlRTRUxfU0hJRlQpOworCXR4X2FnY19jdGwgfD0gKDE8PFRYX0FHQ19DVExfRkVFREJBQ0tfQU5UKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0FHQ19DVEwsIHR4X2FnY19jdGwpOworCXdyaXRlX25pY19ieXRlKGRldiwgMHhlYywgMHgzZik7IC8qIERpc2FibGUgZWFybHkgVFggKi8KIAotCWlmIChwcml2LT5jYXJkXzgxODUpCi0JCXR4Y29uZiA9IHR4Y29uZiAmfiAoMTw8VENSX1BST0JFX05PVElNRVNUQU1QX1NISUZUKTsKLQllbHNlIHsKLQkJaWYoaHdzZXFudW0pCi0JCQl0eGNvbmY9IHR4Y29uZiAmfiAoMTw8VFhfQ09ORl9IRUFERVJfQVVUT0lDUkVNRU5UX1NISUZUKTsKLQkJZWxzZQotCQkJdHhjb25mPSB0eGNvbmYgfCAoMTw8VFhfQ09ORl9IRUFERVJfQVVUT0lDUkVNRU5UX1NISUZUKTsKLQl9CisJdHhjb25mID0gdHhjb25mICYgfigxPDxUQ1JfUFJPQkVfTk9USU1FU1RBTVBfU0hJRlQpOwogCiAJdHhjb25mID0gdHhjb25mICZ+IFRYX0xPT1BCQUNLX01BU0s7CiAJdHhjb25mID0gdHhjb25mIHwgKFRYX0xPT1BCQUNLX05PTkUgPDxUWF9MT09QQkFDS19TSElGVCk7CkBAIC05OTUsMTMgKzk4MSwxMCBAQAogCXR4Y29uZiA9IHR4Y29uZiB8IChwcml2LT5yZXRyeV9ydHM8PFRYX1JUU1JFVFJZX1NISUZUKTsKIAl0eGNvbmYgPSB0eGNvbmYgJn4gKDE8PFRYX05PQ1JDX1NISUZUKTsKIAotCWlmIChwcml2LT5jYXJkXzgxODUpIHsKLQkJaWYgKHByaXYtPmh3X3BsY3BfbGVuKQotCQkJdHhjb25mID0gdHhjb25mICZ+IFRDUl9QTENQX0xFTjsKLQkJZWxzZQotCQkJdHhjb25mID0gdHhjb25mIHwgVENSX1BMQ1BfTEVOOwotCX0gZWxzZQotCQl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX1NBVDsKKwlpZiAocHJpdi0+aHdfcGxjcF9sZW4pCisJCXR4Y29uZiA9IHR4Y29uZiAmIH5UQ1JfUExDUF9MRU47CisJZWxzZQorCQl0eGNvbmYgPSB0eGNvbmYgfCBUQ1JfUExDUF9MRU47CiAKIAl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX01YRE1BX01BU0s7CiAJdHhjb25mID0gdHhjb25mIHwgKFRDUl9NWERNQV8yMDQ4PDxUQ1JfTVhETUFfU0hJRlQpOwpAQCAtMTcyMCw4ICsxNzAzLDYgQEAKIAkJZWxzZQogCQkJcXVhbGl0eSA9IDEyNyAtIHF1YWxpdHk7CiAJCXByaXYtPlNpZ25hbFF1YWxpdHkgPSBxdWFsaXR5OwotCQlpZighcHJpdi0+Y2FyZF84MTg1KQotCQkJcHJpbnRrKCJjaGVjayB5b3VyIGNhcmQgdHlwZVxuIik7CiAKIAkJc3RhdHMuc2lnbmFsID0gKHU4KXF1YWxpdHk7Ly9wcml2LT53c3RhdHMucXVhbC5sZXZlbCA9IHByaXYtPlNpZ25hbFN0cmVuZ3RoOwogCQlzdGF0cy5zaWduYWxzdHJlbmd0aCA9IFJYQUdDOwpAQCAtMTg0OCw3ICsxODI5LDcgQEAKIAkJCQkgICAgc2l6ZW9mKHU4KSwKIAkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAotZHJvcDogLy8gdGhpcyBpcyB1c2VkIHdoZW4gd2UgaGF2ZSBub3QgZW5vdWdodCBtZW0KK2Ryb3A6IC8vIHRoaXMgaXMgdXNlZCB3aGVuIHdlIGhhdmUgbm90IGVub3VnaCBtZW0KIAkJLyogcmVzdG9yZSB0aGUgZGVzY3JpcHRvciAqLwogCQkqKHByaXYtPnJ4cmluZ3RhaWwrMik9cHJpdi0+cnhidWZmZXItPmRtYTsKIAkJKihwcml2LT5yeHJpbmd0YWlsKT0qKHByaXYtPnJ4cmluZ3RhaWwpICZ+IDB4ZmZmOwpAQCAtMTkxOSw4ICsxOTAwLDggQEAKIAkvKgogCSogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHJlcXVpcmUgbG9jayBiZWNhdXNlIHdlIG1ha2UKIAkqIHN1cmUgaXQncyBjYWxsZWQgd2l0aCB0aGUgdHhfbG9jayBhbHJlYWR5IGFjcXVpcmVkLgotCSogdGhpcyBjb21lIGZyb20gdGhlIGtlcm5lbCdzIGhhcmRfeG1pdCBjYWxsYmFjayAodHJvdWdodAotCSogdGhlIGllZWUgc3RhY2ssIG9yIGZyb20gdGhlIHRyeV93YWtlX3F1ZXVlIChhZ2FpbiB0cm91Z2h0CisJKiB0aGlzIGNvbWUgZnJvbSB0aGUga2VybmVsJ3MgaGFyZF94bWl0IGNhbGxiYWNrICh0aHJvdWdoCisJKiB0aGUgaWVlZSBzdGFjaywgb3IgZnJvbSB0aGUgdHJ5X3dha2VfcXVldWUgKGFnYWluIHRocm91Z2gKIAkqIHRoZSBpZWVlIHN0YWNrLgogCSovCiAJcHJpb3JpdHkgPSBBQzJRKHNrYi0+cHJpb3JpdHkpOwpAQCAtMjIyMSwxMCArMjIwMiw4IEBACiAJCSoodGFpbCs2KSA9IDA7CiAJCSoodGFpbCs3KSA9IDA7CiAKLQkJaWYocHJpdi0+Y2FyZF84MTg1KXsKLQkJCS8vRklYTUU6IHRoaXMgc2hvdWxkIGJlIHRyaWdnZXJlZCBieSBIVyBlbmNyeXB0aW9uIHBhcmFtZXRlcnMuCi0JCQkqdGFpbCB8PSAoMTw8MTUpOyAvL25vIGVuY3J5cHQKLQkJfQorCQkvKkZJWE1FOiB0aGlzIHNob3VsZCBiZSB0cmlnZ2VyZWQgYnkgSFcgZW5jcnlwdGlvbiBwYXJhbWV0ZXJzLiovCisJCSp0YWlsIHw9ICgxPDwxNSk7IC8qIG5vIGVuY3J5cHQgKi8KIAogCQlpZihyZW1haW49PWxlbiAmJiAhZGVzY2ZyYWcpIHsKIAkJCW93bmJpdF9mbGFnID0gZmFsc2U7CS8vYWRkZWQgYnkgZGF2aWQgd29vLDIwMDcuMTIuMTQKQEAgLTIyNjYsNyArMjI0NSw3IEBACiAKIAkJLyogaHdfcGxjcF9sZW4gaXMgbm90IHVzZWQgZm9yIHJ0bDgxODAgY2hpcCAqLwogCQkvKiBGSVhNRSAqLwotCQlpZihwcml2LT5jYXJkXzgxODUgPT0gMCB8fCAhcHJpdi0+aHdfcGxjcF9sZW4peworCQlpZiAoIXByaXYtPmh3X3BsY3BfbGVuKSB7CiAJCQlkdXJhdGlvbiA9IHJ0bDgxODBfbGVuMmR1cmF0aW9uKGxlbiwgcmF0ZSwgJmV4dCk7CiAJCQkqKHRhaWwrMSkgPSAqKHRhaWwrMSkgfCAoKGR1cmF0aW9uICYgMHg3ZmZmKTw8MTYpOwogCQkJaWYoZXh0KSAqKHRhaWwrMSkgPSAqKHRhaWwrMSkgfCgxPDwzMSk7IC8vcGxjcCBsZW5ndGggZXh0ZW5zaW9uCkBAIC0yMzU1LDggKzIzMzQsNyBAQAogCiAJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9OT1JNQUwpOwogCi0JaWYocHJpdi0+Y2FyZF84MTg1KQotCQlydGw4MTgwX3NldF9jaGFuKGRldiwgcHJpdi0+Y2hhbik7CisJcnRsODE4MF9zZXRfY2hhbihkZXYsIHByaXYtPmNoYW4pOwogfQogCiB2b2lkIHJ0bDgxODBfcnFfdHhfYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpewpAQCAtMjcwMiw4ICsyNjgwLDYgQEAKIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJdTE2IHdvcmQ7CiAJdTE2IHZlcnNpb247Ci0JdTggaHdfdmVyc2lvbjsKLQkvL3U4IGNvbmZpZzM7CiAJdTMyIHVzVmFsdWU7CiAJdTE2IHRtcHUxNjsKIAlpbnQgaSwgajsKQEAgLTI5MjgsNTAgKzI5MDQsMTMgQEAKIAogCXByaXYtPkluaXRpYWxHYWluID0gNjsKIAotCWh3X3ZlcnNpb24gPSggcmVhZF9uaWNfZHdvcmQoZGV2LCBUQ1IpICYgVENSX0hXVkVSSURfTUFTSyk+PlRDUl9IV1ZFUklEX1NISUZUOworCURNRVNHKCJNQUMgY29udHJvbGxlciBpcyBhIFJUTDgxODdTRSBiL2ciKTsKKwlwcml2LT5waHlfdmVyID0gMjsKIAotCXN3aXRjaCAoaHdfdmVyc2lvbil7Ci0JCWNhc2UgSFdfVkVSSURfUjgxODVCX0I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5jYXJkXzgxODUgPSBWRVJTSU9OXzgxODdTX0M7Ci0JCSAgICAgICAgRE1FU0coIk1BQyBjb250cm9sbGVyIGlzIGEgUlRMODE4N1NFIGIvZyIpOwotCQkJcHJpdi0+cGh5X3ZlciA9IDI7Ci0JCQlicmVhazsKLQkJY2FzZSBIV19WRVJJRF9SODE4NV9BQkM6Ci0JCQlETUVTRygiTUFDIGNvbnRyb2xsZXIgaXMgYSBSVEw4MTg1IGIvZyIpOwotCQkJcHJpdi0+Y2FyZF84MTg1ID0gMTsKLQkJCS8qIHlvdSBzaG91bGQgbm90IGZpbmQgYSBjYXJkIHdpdGggODIyNSBQSFkgdmVyIDwgQyovCi0JCQlwcml2LT5waHlfdmVyID0gMjsKLQkJCWJyZWFrOwotCQljYXNlIEhXX1ZFUklEX1I4MTg1X0Q6Ci0JCQlETUVTRygiTUFDIGNvbnRyb2xsZXIgaXMgYSBSVEw4MTg1IGIvZyAoVi4gRCkiKTsKLQkJCXByaXYtPmNhcmRfODE4NSA9IDI7Ci0JCQkvKiB5b3Ugc2hvdWxkIG5vdCBmaW5kIGEgY2FyZCB3aXRoIDgyMjUgUEhZIHZlciA8IEMqLwotCQkJcHJpdi0+cGh5X3ZlciA9IDI7Ci0JCQlicmVhazsKLQkJY2FzZSBIV19WRVJJRF9SODE4MF9BQkNEOgotCQkJRE1FU0coIk1BQyBjb250cm9sbGVyIGlzIGEgUlRMODE4MCIpOwotCQkJcHJpdi0+Y2FyZF84MTg1ID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIEhXX1ZFUklEX1I4MTgwX0Y6Ci0JCQlETUVTRygiTUFDIGNvbnRyb2xsZXIgaXMgYSBSVEw4MTgwICh2LiBGKSIpOwotCQkJcHJpdi0+Y2FyZF84MTg1ID0gMDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJRE1FU0dXKCJNQUMgY2hpcCBub3QgcmVjb2duaXplZDogdmVyc2lvbiAleC4gQXNzdW1pbmcgUlRMODE4MCIsaHdfdmVyc2lvbik7Ci0JCQlwcml2LT5jYXJkXzgxODUgPSAwOwotCQkJYnJlYWs7Ci0JfQotCi0JaWYocHJpdi0+Y2FyZF84MTg1KXsKLQkJcHJpdi0+aWVlZTgwMjExLT5tb2R1bGF0aW9uIHw9IElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT047Ci0JCXByaXYtPmllZWU4MDIxMS0+c2hvcnRfc2xvdCA9IDE7Ci0JfQotCS8qIHlvdSBzaG91bGQgbm90IGZvdW5kIGFueSA4MTg1IFZlciBCIENhcmQgKi8KLQlwcml2LT5jYXJkXzgxODVfQnZlcnNpb24gPSAwOworCXByaXYtPmllZWU4MDIxMS0+bW9kdWxhdGlvbiB8PSBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OOworCXByaXYtPmllZWU4MDIxMS0+c2hvcnRfc2xvdCA9IDE7CiAKIAkvLyBqdXN0IGZvciBzeW5jIDg1Ci0JcHJpdi0+Y2FyZF90eXBlID0gUENJOwotICAgICAgICBETUVTRygiVGhpcyBpcyBhIFBDSSBOSUMiKTsKIAlwcml2LT5lbmFibGVfZ3BpbzAgPSAwOwogCiAJdXNWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LCBFRVBST01fU1dfUkVWRF9PRkZTRVQpOwpAQCAtMzAyNiwxMiArMjk2NSwxMCBAQAogCQlwcml2LT5jaHR4cHdyW2ldPXdvcmQgJiAweGZmOwogCQlwcml2LT5jaHR4cHdyW2krMV09KHdvcmQgJiAweGZmMDApPj44OwogCX0KLQlpZihwcml2LT5jYXJkXzgxODUpewotCQlmb3IoaT0xLGo9MDsgaTwxNDsgaSs9MixqKyspewotCQkJd29yZCA9IGVwcm9tX3JlYWQoZGV2LEVQUk9NX1RYUFdfT0ZETV9DSDFfMiArIGopOwotCQkJcHJpdi0+Y2h0eHB3cl9vZmRtW2ldPXdvcmQgJiAweGZmOwotCQkJcHJpdi0+Y2h0eHB3cl9vZmRtW2krMV09KHdvcmQgJiAweGZmMDApPj44OwotCQl9CisJZm9yIChpID0gMSwgaiA9IDA7IGkgPCAxNDsgaSArPSAyLCBqKyspIHsKKwkJd29yZCA9IGVwcm9tX3JlYWQoZGV2LCBFUFJPTV9UWFBXX09GRE1fQ0gxXzIgKyBqKTsKKwkJcHJpdi0+Y2h0eHB3cl9vZmRtW2ldID0gd29yZCAmIDB4ZmY7CisJCXByaXYtPmNodHhwd3Jfb2ZkbVtpKzFdID0gKHdvcmQgJiAweGZmMDApPj44OwogCX0KIAogCS8vM1JlYWQgY3J5c3RhbCBjYWxpYnRyYXRpb24gYW5kIHRoZXJtYWwgbWV0ZXIgaW5kaWNhdGlvbiBvbiA4N1NFLgpAQCAtMzA1NywzNyArMjk5NCwxMSBAQAogCiAJdmVyc2lvbiA9IGVwcm9tX3JlYWQoZGV2LEVQUk9NX1ZFUlNJT04pOwogCURNRVNHKCJFRVBST00gdmVyc2lvbiAleCIsdmVyc2lvbik7Ci0JaWYoICghcHJpdi0+Y2FyZF84MTg1KSAmJiB2ZXJzaW9uIDwgMHgwMTAxKXsKLQkJRE1FU0cgKCJFRVBST00gdmVyc2lvbiB0b28gb2xkLCBhc3N1bWluZyBkZWZhdWx0cyIpOwotCQlETUVTRyAoIklmIHlvdSBzZWUgdGhpcyBtZXNzYWdlICpwbGFzZSogc2VuZCB5b3VyIFwKLURNRVNHIG91dHB1dCB0byBhbmRyZWFtcmxAdGlzY2FsaS5pdCBUSEFOS1MiKTsKLQkJcHJpdi0+ZGlncGh5PTE7Ci0JCXByaXYtPmFudGI9MDsKLQkJcHJpdi0+ZGl2ZXJzaXR5PTE7Ci0JCXByaXYtPmNzX3RyZXNob2xkPTB4YzsKLQkJcHJpdi0+cmNyX2NzZW5zZT0xOwotCQlwcml2LT5yZl9jaGlwPVJGQ0hJUElEX1BISUxJUFM7Ci0JfWVsc2V7Ci0JCWlmKCFwcml2LT5jYXJkXzgxODUpewotCQkJdTggcmZwYXJhbSA9IGVwcm9tX3JlYWQoZGV2LFJGX1BBUkFNKTsKLQkJCURNRVNHKCJSZlBhcmFtOiAleCIscmZwYXJhbSk7CisJcHJpdi0+cmNyX2NzZW5zZSA9IDM7CiAKLQkJCXByaXYtPmRpZ3BoeSA9IHJmcGFyYW0gJiAoMTw8UkZfUEFSQU1fRElHUEhZX1NISUZUKSA/IDA6MTsKLQkJCXByaXYtPmFudGIgPSAgcmZwYXJhbSAmICgxPDxSRl9QQVJBTV9BTlRCREVGQVVMVF9TSElGVCkgPyAxOjA7CisJcHJpdi0+Y3NfdHJlc2hvbGQgPSAoZXByb21fcmVhZChkZXYsIEVORVJHWV9UUkVTSE9MRCkgJiAweGZmMDApID4+IDg7CiAKLQkJCXByaXYtPnJjcl9jc2Vuc2UgPSAocmZwYXJhbSAmIFJGX1BBUkFNX0NBUlJJRVJTRU5TRV9NQVNLKSA+PgotCQkJCQlSRl9QQVJBTV9DQVJSSUVSU0VOU0VfU0hJRlQ7Ci0KLQkJCXByaXYtPmRpdmVyc2l0eSA9Ci0JCQkJKHJlYWRfbmljX2J5dGUoZGV2LENPTkZJRzIpJigxPDxDT05GSUcyX0FOVEVOTkFfU0hJRlQpKSA/IDE6MDsKLQkJfWVsc2V7Ci0JCQlwcml2LT5yY3JfY3NlbnNlID0gMzsKLQkJfQotCi0JCXByaXYtPmNzX3RyZXNob2xkID0gKGVwcm9tX3JlYWQoZGV2LEVORVJHWV9UUkVTSE9MRCkmMHhmZjAwKSA+Pjg7Ci0KLQkJcHJpdi0+cmZfY2hpcCA9IDB4ZmYgJiBlcHJvbV9yZWFkKGRldixSRkNISVBJRCk7Ci0JfQorCXByaXYtPnJmX2NoaXAgPSAweGZmICYgZXByb21fcmVhZChkZXYsIFJGQ0hJUElEKTsKIAogCXByaXYtPnJmX2NoaXAgPSBSRl9aRUJSQTQ7CiAJcHJpdi0+cmZfc2xlZXAgPSBydGw4MjI1ejRfcmZfc2xlZXA7CkBAIC0zMDk5LDE5ICszMDEwLDYgQEAKIAlwcml2LT5yZl9zZXRfY2hhbiA9IHJ0bDgyMjV6Ml9yZl9zZXRfY2hhbjsKIAlwcml2LT5yZl9zZXRfc2VucyA9IE5VTEw7CiAKLQlpZighcHJpdi0+Y2FyZF84MTg1KXsKLQkJaWYocHJpdi0+YW50YikKLQkJCURNRVNHICgiQW50ZW5uYSBCIGlzIGRlZmF1bHQgYW50ZW5uYSIpOwotCQllbHNlCi0JCQlETUVTRyAoIkFudGVubmEgQSBpcyBkZWZhdWx0IGFudGVubmEiKTsKLQotCQlpZihwcml2LT5kaXZlcnNpdHkpCi0JCQlETUVTRyAoIkFudGVubmEgZGl2ZXJzaXR5IGlzIGVuYWJsZWQiKTsKLQkJZWxzZQotCQkJRE1FU0coIkFudGVubmEgZGl2ZXJzaXR5IGlzIGRpc2FibGVkIik7Ci0KLQkJRE1FU0coIkNhcnJpZXIgc2Vuc2UgJWQiLHByaXYtPnJjcl9jc2Vuc2UpOwotCX0KIAogCWlmICgwIT1hbGxvY19yeF9kZXNjX3JpbmcoZGV2LCBwcml2LT5yeGJ1ZmZlcnNpemUsIHByaXYtPnJ4cmluZ2NvdW50KSkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0zMTQ0LDE3ICszMDQyLDYgQEAKIAkJCQkgIFRYX0JFQUNPTl9SSU5HX0FERFIpKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmKCFwcml2LT5jYXJkXzgxODUpewotCQlpZihyZWFkX25pY19ieXRlKGRldiwgQ09ORklHMCkgJiAoMTw8Q09ORklHMF9XRVA0MF9TSElGVCkpCi0JCQlETUVTRyAoIjQwLWJpdCBXRVAgaXMgc3VwcG9ydGVkIGluIGhhcmR3YXJlIik7Ci0JCWVsc2UKLQkJCURNRVNHICgiNDAtYml0IFdFUCBpcyBOT1Qgc3VwcG9ydGVkIGluIGhhcmR3YXJlIik7Ci0KLQkJaWYocmVhZF9uaWNfYnl0ZShkZXYsQ09ORklHMCkgJiAoMTw8Q09ORklHMF9XRVAxMDRfU0hJRlQpKQotCQkJRE1FU0cgKCIxMDQtYml0IFdFUCBpcyBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUiKTsKLQkJZWxzZQotCQkJRE1FU0cgKCIxMDQtYml0IFdFUCBpcyBOT1Qgc3VwcG9ydGVkIGluIGhhcmR3YXJlIik7Ci0JfQogI2lmICFkZWZpbmVkKFNBX1NISVJRKQogICAgICAgICBpZihyZXF1ZXN0X2lycShkZXYtPmlycSwgKHZvaWQgKilydGw4MTgwX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgZGV2KSl7CiAjZWxzZQpAQCAtMzE3MiwxNyArMzA1OSw2IEBACiAKIHZvaWQgcnRsODE4MF9ub19od193ZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0KLQlpZiAoIXByaXYtPmNhcmRfODE4NSkgewotCQl1OCBzZWN1cml0eTsKLQotCQlzZWN1cml0eSAgPSByZWFkX25pY19ieXRlKGRldiwgU0VDVVJJVFkpOwotCQlzZWN1cml0eSAmPX4oMTw8U0VDVVJJVFlfV0VQX1RYX0VOQUJMRV9TSElGVCk7Ci0JCXNlY3VyaXR5ICY9figxPDxTRUNVUklUWV9XRVBfUlhfRU5BQkxFX1NISUZUKTsKLQotCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFNFQ1VSSVRZLCBzZWN1cml0eSk7Ci0JfQogfQogCiB2b2lkIHJ0bDgxODBfc2V0X2h3X3dlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMzM1NSw5ICszMjMxLDYgQEAKIHZvaWQgcnRsODE4MF9hZGFwdGVyX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAgICAgICAgIHN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQl1MzIgYW5hcGFyYW07Ci0JdTE2IHdvcmQ7Ci0JdTggY29uZmlnMzsKIAogCXJ0bDgxODBfcnR4X2Rpc2FibGUoZGV2KTsKIAlydGw4MTgwX3Jlc2V0KGRldik7CkBAIC0zMzcxLDEyICszMjQ0LDYgQEAKIAogCXJ0bDgxODBfYmVhY29uX3R4X2Rpc2FibGUoZGV2KTsKIAotCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBDQVJEQlVTICl7Ci0JCWNvbmZpZzM9cmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzMpOwotCQl3cml0ZV9uaWNfYnl0ZShkZXYsQ09ORklHMyxjb25maWczIHwgQ09ORklHM19GdW5jUmVnRW4pOwotCQl3cml0ZV9uaWNfd29yZChkZXYsRkVNUiwgRkVNUl9JTlRSIHwgRkVNUl9XS1VQIHwgRkVNUl9HV0FLRSB8Ci0JCQlyZWFkX25pY193b3JkKGRldiwgRkVNUikpOwotCX0KIAlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX0NPTkZJRyk7CiAJd3JpdGVfbmljX2R3b3JkKGRldiwgTUFDMCwgKCh1MzIqKWRldi0+ZGV2X2FkZHIpWzBdKTsKIAl3cml0ZV9uaWNfd29yZChkZXYsIE1BQzQsICgodTMyKilkZXYtPmRldl9hZGRyKVsxXSAmIDB4ZmZmZiApOwpAQCAtMzM4NCwxMiArMzI1MSw2IEBACiAKIAlydGw4MTgwX3VwZGF0ZV9tc3IoZGV2KTsKIAotCWlmKCFwcml2LT5jYXJkXzgxODUpewotCQlhbmFwYXJhbSAgPSBlcHJvbV9yZWFkKGRldixFUFJPTV9BTkFQQVJBTV9BRERSTFdPUkQpOwotCQlhbmFwYXJhbSB8PSBlcHJvbV9yZWFkKGRldixFUFJPTV9BTkFQQVJBTV9BRERSSFdPUkQpPDwxNjsKLQotCQlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsYW5hcGFyYW0pOwotCX0KIAkvKiBUaGVzZSBtaWdodCBiZSB1bm5lY2Vzc2FyeSBzaW5jZSB3ZSBkbyBpbiByeF9lbmFibGUgLyB0eF9lbmFibGUgKi8KIAlmaXhfcnhfZmlmbyhkZXYpOwogCWZpeF90eF9maWZvKGRldik7CkBAIC0zMzk5LDYxICszMjYwLDM0IEBACiAJLyoKIAkgICBUaGUgZm9sbG93aW5nIGlzIHZlcnkgc3RyYW5nZS4gc2VlbXMgdG8gYmUgdGhhdCAxIG1lYW5zIHRlc3QgbW9kZSwKIAkgICBidXQgd2UgbmVlZCB0byBhY2tub2x3bGVkZ2VzIHRoZSBuaWMgd2hlbiBhIHBhY2tldCBpcyByZWFkeQotCSAgIGFsdG91Z2h0IHdlIHNldCBpdCB0byAwCisJICAgYWx0aG91Z2ggd2Ugc2V0IGl0IHRvIDAKIAkqLwogCiAJd3JpdGVfbmljX2J5dGUoZGV2LAogCQkgICAgICAgQ09ORklHMiwgcmVhZF9uaWNfYnl0ZShkZXYsQ09ORklHMikgJn5cCiAJCSAgICAgICAoMTw8Q09ORklHMl9ETUFfUE9MTElOR19NT0RFX1NISUZUKSk7CiAJLy9edGhlIG5pYyBpc24ndCBpbiB0ZXN0IG1vZGUKLQlpZihwcml2LT5jYXJkXzgxODUpCi0JCQl3cml0ZV9uaWNfYnl0ZShkZXYsCisJd3JpdGVfbmljX2J5dGUoZGV2LAogCQkgICAgICAgQ09ORklHMiwgcmVhZF9uaWNfYnl0ZShkZXYsQ09ORklHMil8KDE8PDQpKTsKIAogCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9OT1JNQUwpOwogCiAJd3JpdGVfbmljX2R3b3JkKGRldixJTlRfVElNRU9VVCwwKTsKIAotCWlmKCFwcml2LT5jYXJkXzgxODUpCi0JewotCQkvKgotCQlleHBlcmltZW50YWwgLSB0aGlzIG1pZ2h0IGJlIG5lZWRlZCB0byBjYWxpYnJhdGUgQUdDLAotCQlhbnl3YXkgaXQgc2hvdWxkbid0IGh1cnQKLQkJKi8KLQkJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUc1LAotCQkJcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzUpIHwgKDE8PEFHQ1JFU0VUX1NISUZUKSk7Ci0JCXJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUc1KTsKLQkJdWRlbGF5KDE1KTsKLQkJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUc1LAotCQkJcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzUpICZ+ICgxPDxBR0NSRVNFVF9TSElGVCkpOwotCX1lbHNlewotCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFdQQV9DT05GSUcsIDApOwotCQkvL3dyaXRlX25pY19ieXRlKGRldiwgVEVTVFIsIDB4ZCk7Ci0JfQorCXdyaXRlX25pY19ieXRlKGRldiwgV1BBX0NPTkZJRywgMCk7CiAKIAlydGw4MTgwX25vX2h3X3dlcChkZXYpOwogCi0JaWYocHJpdi0+Y2FyZF84MTg1KXsKLQkJcnRsODE4NV9zZXRfcmF0ZShkZXYpOwotCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFJBVEVfRkFMTEJBQ0ssIDB4ODEpOwotCX1lbHNlewotCQl3b3JkICA9IHJlYWRfbmljX3dvcmQoZGV2LCBCUlNSKTsKLQkJd29yZCAmPSB+QlJTUl9NQlI7Ci0JCXdvcmQgJj0gfkJSU1JfQlBMQ1A7Ci0JCXdvcmQgfD0gaWVlZXJhdGUycnRscmF0ZShwcml2LT5pZWVlODAyMTEtPmJhc2ljX3JhdGUpOwotCQl3b3JkIHw9IDB4MGY7Ci0JCXdyaXRlX25pY193b3JkKGRldiwgQlJTUiwgd29yZCk7Ci0JfQorCXJ0bDgxODVfc2V0X3JhdGUoZGV2KTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFJBVEVfRkFMTEJBQ0ssIDB4ODEpOwogCi0JaWYocHJpdi0+Y2FyZF84MTg1KXsKLQkJd3JpdGVfbmljX2J5dGUoZGV2LCBHUF9FTkFCTEUscmVhZF9uaWNfYnl0ZShkZXYsIEdQX0VOQUJMRSkgJiB+KDE8PDYpKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEdQX0VOQUJMRSwgcmVhZF9uaWNfYnl0ZShkZXYsIEdQX0VOQUJMRSkgJiB+KDE8PDYpKTsKIAotCQkvL0ZJWE1FIGNmZyAzIENsa1J1biBlbmFibGUgLSBpc24ndCBpdCBSZWFkT25seSA/Ci0JCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfQ09ORklHKTsKLQkJd3JpdGVfbmljX2J5dGUoZGV2LENPTkZJRzMsIHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUczKQotCQkJICAgICAgIHwgKDEgPDwgQ09ORklHM19DTEtSVU5fU0hJRlQpKTsKLQkJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9OT1JNQUwpOwotCX0KKwkvKkZJWE1FIGNmZyAzIENsa1J1biBlbmFibGUgLSBpc24ndCBpdCBSZWFkT25seSA/ICovCisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9DT05GSUcpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzMpCisJCSAgICAgICB8ICgxIDw8IENPTkZJRzNfQ0xLUlVOX1NISUZUKSk7CisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9OT1JNQUwpOwogCiAJcHJpdi0+cmZfaW5pdChkZXYpOwogCkBAIC00MTQ0LDcgKzM5NzgsNyBAQAogCQl9CiAKIAkvKiB3ZSBjaGVjayBhbGwgdGhlIGRlc2NyaXB0b3JzIGJldHdlZW4gdGhlIGhlYWQgYW5kIHRoZSBuaWMsCi0JICogYnV0IG5vdCB0aGUgY3VycmVubHkgcG9pbnRlZCBieSB0aGUgbmljICh0aGUgbmV4dCB0byBiZSB0eGVkKQorCSAqIGJ1dCBub3QgdGhlIGN1cnJlbnRseSBwb2ludGVkIGJ5IHRoZSBuaWMgKHRoZSBuZXh0IHRvIGJlIHR4ZWQpCiAJICogYW5kIHRoZSBwcmV2aW91cyBvZiB0aGUgcG9pbnRlZCAobWlnaHQgYmUgaW4gcHJvY2VzcyA/PykKIAkqLwogCW9mZnMgPSAobmljIC0gbmljYmVnaW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9kbS5jCmluZGV4IGI2ZWVlZWMuLmNiY2E1OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2RtLmMKQEAgLTM2LDcgKzM2LDcgQEAKIC8vCiAvLwlOb3RlOgogLy8JCVRoZSByZWFzb24gd2h5IHdlIHVkcGF0ZSBUeCBwb3dlciBsZXZlbCBoZXJlIGluc3RlYWQgb2YgRG9SeEhpZ2hQb3dlcigpCi0vLwkJaXMgdGhlIG51bWJlciBvZiBJTyB0byBjaGFuZ2UgVHggcG93ZXIgaXMgbXVjaCBtb3JlIHRoYW4gY2hhbmUgVFIgc3dpdGNoCisvLwkJaXMgdGhlIG51bWJlciBvZiBJTyB0byBjaGFuZ2UgVHggcG93ZXIgaXMgbXVjaCBtb3JlIHRoYW4gY2hhbm5lbCBUUiBzd2l0Y2gKIC8vCQlhbmQgdGhleSBhcmUgcmVsYXRlZCB0byBPRkRNIGFuZCBNQUMgcmVnaXN0ZXJzLgogLy8JCVNvLCB3ZSBkb24ndCB3YW50IHRvIHVwZGF0ZSBpdCBzbyBmcmVxdWVudGx5IGluIHBlci1SeCBwYWNrZXQgYmFzZS4KIC8vCkBAIC0xOTcsNyArMTk3LDYgQEAKIAl7IC8vIEFkdmlzZWQgZnJvbSBTRDMgRFoKIAkJcHJpdi0+SW5pdGlhbEdhaW4gPSA0OyAvLyBJbiA4N0IsIG03NGRCbSBtZWFucyBTdGF0ZSA0IChtODJkQm0pCiAJfQotCS8vaWYocEhhbERhdGEtPlZlcnNpb25JRCAhPSBWRVJTSU9OXzgxODdCX0IpCiAJeyAvLyBBZHZpc2VkIGZyb20gU0QzIERaCiAJCU9mZG1GQTEgPSAgMHgyMDsKIAl9CkBAIC0xMzI2LDcgKzEzMjUsNyBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCXByaW50aygiU2V0QW50ZW5uYTgxODU6IHVua293biBSRkNoaXBJRCglZClcbiIsIHByaXYtPnJmX2NoaXApOworCQkJcHJpbnRrKCJTZXRBbnRlbm5hODE4NTogdW5rbm93biBSRkNoaXBJRCglZClcbiIsIHByaXYtPnJmX2NoaXApOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC0xMzQ2LDEzICsxMzQ1LDEzIEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJTZXRBbnRlbm5hODE4NTogdW5rb3duIFJGQ2hpcElEKCVkKVxuIiwgcHJpdi0+cmZfY2hpcCk7CisJCQlwcmludGsoIlNldEFudGVubmE4MTg1OiB1bmtub3duIFJGQ2hpcElEKCVkKVxuIiwgcHJpdi0+cmZfY2hpcCk7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXByaW50aygiU2V0QW50ZW5uYTgxODU6IHVua293biB1MWJBbnRlbm5hSW5kZXgoJWQpXG4iLCB1MWJBbnRlbm5hSW5kZXgpOworCQlwcmludGsoIlNldEFudGVubmE4MTg1OiB1bmtub3duIHUxYkFudGVubmFJbmRleCglZClcbiIsIHUxYkFudGVubmFJbmRleCk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTQ0OCw3ICsxNDQ3LDcgQEAKIAogCQlwcml2LT5iQWRTd2l0Y2hlZENoZWNraW5nID0gZmFsc2U7CiAKLQkJLy8gQWRqdXN0IFJ4IHNpZ25hbCBzdHJlbmd0aCB0aHJlYXNob2xkLgorCQkvLyBBZGp1c3QgUnggc2lnbmFsIHN0cmVuZ3RoIHRocmVzaG9sZC4KIAkJcHJpdi0+QWRSeFNzVGhyZXNob2xkID0gKHByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCArIHByaXYtPkFkUnhTc0JlZm9yZVN3aXRjaGVkKSAvIDI7CiAKIAkJcHJpdi0+QWRSeFNzVGhyZXNob2xkID0gKHByaXYtPkFkUnhTc1RocmVzaG9sZCA+IHByaXYtPkFkTWF4UnhTc1RocmVzaG9sZCkgPwpAQCAtMTU2Miw3ICsxNTYxLDcgQEAKIC8vCQkJCXByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCwgcHJpdi0+QWRSeFNzVGhyZXNob2xkKTsKIAogCQkJcHJpdi0+YkFkU3dpdGNoZWRDaGVja2luZyA9IGZhbHNlOwotCQkJLy8gSW5jcmVhc2UgUnggc2lnbmFsIHN0cmVuZ3RoIHRocmVhc2hvbGQgaWYgbmVjZXNzYXJ5LgorCQkJLy8gSW5jcmVhc2UgUnggc2lnbmFsIHN0cmVuZ3RoIHRocmVzaG9sZCBpZiBuZWNlc3NhcnkuCiAJCQlpZigJKHByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCA+IChwcml2LT5BZFJ4U3NUaHJlc2hvbGQgKyAxMCkpICYmIC8vIFNpZ25hbCBpcyBtdWNoIHN0cm9uZ2VyIHRoYW4gY3VycmVudCB0aHJlc2hvbGQKIAkJCQlwcml2LT5BZFJ4U3NUaHJlc2hvbGQgPD0gcHJpdi0+QWRNYXhSeFNzVGhyZXNob2xkKSAvLyBDdXJyZW50IHRocmVob2xkIGlzIG5vdCB5ZXQgcmVhY2ggdXBwZXIgbGltaXQuCiAJCQl7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjV6Mi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1ejIuYwppbmRleCBiNjQ4NzUxLi5hZmUxMGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjV6Mi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNXoyLmMKQEAgLTIzLDcgKzIzLDYgQEAKIAl1MTYgb3V0LCBzZWxlY3Q7CiAJdTggYml0OwogCXUzMiBiYW5nZGF0YSA9IChkYXRhIDw8IDQpIHwgKGFkciAmIDB4Zik7Ci0Jc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCiAJb3V0ID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCkgJiAweGZmZjM7CiAKQEAgLTMzLDcgKzMyLDcgQEAKIAlzZWxlY3QgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0KTsKIAogCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBzZWxlY3QgfCAweDcgfAotCQkoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpID8gMCA6IFNXX0NPTlRST0xfR1BJTykpOworCQkgICAgICAgU1dfQ09OVFJPTF9HUElPKTsKIAogCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CiAJdWRlbGF5KDEwKTsKQEAgLTcxLDE2ICs3MCwxMSBAQAogCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CiAJdWRlbGF5KDEwKTsKIAotCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfAotCQkoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpID8gNCA6IEJCX0hPU1RfQkFOR19FTikpOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfCBCQl9IT1NUX0JBTkdfRU4pOwogCi0Jd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIHNlbGVjdCB8Ci0JCSgocHJpdi0+Y2FyZF90eXBlID09IFVTQikgPyAwIDogU1dfQ09OVFJPTF9HUElPKSk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIHNlbGVjdCB8IFNXX0NPTlRST0xfR1BJTyk7CiAKLQlpZiAocHJpdi0+Y2FyZF90eXBlID09IFVTQikKLQkJbWRlbGF5KDIpOwotCWVsc2UKLQkJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKIH0KIAogc3RhdGljIGNvbnN0IHUxNiBydGw4MjI1YmNkX3J4Z2FpbltdID0gewpAQCAtMTc0LDE1ICsxNjgsOSBAQAogCXU4IGNja19wb3dlcl9sZXZlbCA9IDB4ZmYgJiBwcml2LT5jaHR4cHdyW2NoXTsKIAl1OCBvZmRtX3Bvd2VyX2xldmVsID0gMHhmZiAmIHByaXYtPmNodHhwd3Jfb2ZkbVtjaF07CiAKLQlpZiAocHJpdi0+Y2FyZF90eXBlID09IFVTQikgewotCQltYXhfY2NrX3Bvd2VyX2xldmVsID0gMTE7Ci0JCW1heF9vZmRtX3Bvd2VyX2xldmVsID0gMjU7Ci0JCW1pbl9vZmRtX3Bvd2VyX2xldmVsID0gMTA7Ci0JfSBlbHNlIHsKLQkJbWF4X2Nja19wb3dlcl9sZXZlbCA9IDM1OwotCQltYXhfb2ZkbV9wb3dlcl9sZXZlbCA9IDM1OwotCQltaW5fb2ZkbV9wb3dlcl9sZXZlbCA9IDA7Ci0JfQorCW1heF9jY2tfcG93ZXJfbGV2ZWwgPSAzNTsKKwltYXhfb2ZkbV9wb3dlcl9sZXZlbCA9IDM1OworCW1pbl9vZmRtX3Bvd2VyX2xldmVsID0gMDsKIAogCWlmIChjY2tfcG93ZXJfbGV2ZWwgPiBtYXhfY2NrX3Bvd2VyX2xldmVsKQogCQljY2tfcG93ZXJfbGV2ZWwgPSBtYXhfY2NrX3Bvd2VyX2xldmVsOwpAQCAtNDQ1LDMwICs0MzMsMjggQEAKIAkgKiBPRkRNIFBvd2VyIGluIGRCbSA9IEluZGV4ICogMC41ICsgMAogCSAqIENDSyBQb3dlciBpbiBkQm0gPSBJbmRleCAqIDAuMjUgKyAxMwogCSAqLwotCWlmIChwcml2LT5jYXJkXzgxODUgPj0gVkVSU0lPTl84MTg3U19CKSB7Ci0JCXMzMiB0bXAgPSAwOworCXMzMiB0bXAgPSAwOwogCi0JCWlmIChXaXJlbGVzc01vZGUgPT0gV0lSRUxFU1NfTU9ERV9HKSB7Ci0JCQliVXNlRGVmYXVsdCA9IGZhbHNlOwotCQkJdG1wID0gKDIgKiBQb3dlckluRGJtKTsKKwlpZiAoV2lyZWxlc3NNb2RlID09IFdJUkVMRVNTX01PREVfRykgeworCQliVXNlRGVmYXVsdCA9IGZhbHNlOworCQl0bXAgPSAoMiAqIFBvd2VySW5EYm0pOwogCi0JCQlpZiAodG1wIDwgMCkKLQkJCQlUeFB3cklkeCA9IDA7Ci0JCQllbHNlIGlmICh0bXAgPiA0MCkgLyogNDAgbWVhbnMgMjAgZEJtLiAqLwotCQkJCVR4UHdySWR4ID0gNDA7Ci0JCQllbHNlCi0JCQkJVHhQd3JJZHggPSAoczgpdG1wOwotCQl9IGVsc2UgaWYgKFdpcmVsZXNzTW9kZSA9PSBXSVJFTEVTU19NT0RFX0IpIHsKLQkJCWJVc2VEZWZhdWx0ID0gZmFsc2U7Ci0JCQl0bXAgPSAoNCAqIFBvd2VySW5EYm0pIC0gNTI7CisJCWlmICh0bXAgPCAwKQorCQkJVHhQd3JJZHggPSAwOworCQllbHNlIGlmICh0bXAgPiA0MCkgLyogNDAgbWVhbnMgMjAgZEJtLiAqLworCQkJVHhQd3JJZHggPSA0MDsKKwkJZWxzZQorCQkJVHhQd3JJZHggPSAoczgpdG1wOworCX0gZWxzZSBpZiAoV2lyZWxlc3NNb2RlID09IFdJUkVMRVNTX01PREVfQikgeworCQliVXNlRGVmYXVsdCA9IGZhbHNlOworCQl0bXAgPSAoNCAqIFBvd2VySW5EYm0pIC0gNTI7CiAKLQkJCWlmKHRtcCA8IDApCi0JCQkJVHhQd3JJZHggPSAwOwotCQkJZWxzZSBpZiAodG1wID4gMjgpIC8qIDI4IG1lYW5zIDIwIGRCbS4gKi8KLQkJCQlUeFB3cklkeCA9IDI4OwotCQkJZWxzZQotCQkJCVR4UHdySWR4ID0gKHM4KXRtcDsKLQkJfQorCQlpZiAodG1wIDwgMCkKKwkJCVR4UHdySWR4ID0gMDsKKwkJZWxzZSBpZiAodG1wID4gMjgpIC8qIDI4IG1lYW5zIDIwIGRCbS4gKi8KKwkJCVR4UHdySWR4ID0gMjg7CisJCWVsc2UKKwkJCVR4UHdySWR4ID0gKHM4KXRtcDsKIAl9CiAKIAkvKgpAQCAtNjMxLDggKzYxNyw3IEBACiAKIAlwcml2LT5jaGFuID0gY2hhbm5lbDsKIAotCWlmIChwcml2LT5jYXJkX3R5cGUgIT0gVVNCKQotCQlydGw4MjI1X2hvc3RfcGNpX2luaXQoZGV2KTsKKwlydGw4MjI1X2hvc3RfcGNpX2luaXQoZGV2KTsKIAogCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1RJTUlORywgMHgwMDBhODAwOCk7CiAKQEAgLTY1NSw3ICs2NDAsNyBAQAogCXdyaXRlX3J0bDgyMjUoZGV2LCAweDQsIDB4OGMzKTsgbWRlbGF5KDEpOwogCXdyaXRlX3J0bDgyMjUoZGV2LCAweDUsIDB4YzcyKTsgbWRlbGF5KDEpOwogCXdyaXRlX3J0bDgyMjUoZGV2LCAweDYsIDB4ZTYpOyAgbWRlbGF5KDEpOwotCXdyaXRlX3J0bDgyMjUoZGV2LCAweDcsICgocHJpdi0+Y2FyZF90eXBlID09IFVTQik/IDB4ODJhIDogcnRsODIyNV9jaGFuW2NoYW5uZWxdKSk7ICBtZGVsYXkoMSk7CisJd3JpdGVfcnRsODIyNShkZXYsIDB4NywgcnRsODIyNV9jaGFuW2NoYW5uZWxdKTsgIG1kZWxheSgxKTsKIAl3cml0ZV9ydGw4MjI1KGRldiwgMHg4LCAweDNmKTsgIG1kZWxheSgxKTsKIAl3cml0ZV9ydGw4MjI1KGRldiwgMHg5LCAweDMzNSk7IG1kZWxheSgxKTsKIAl3cml0ZV9ydGw4MjI1KGRldiwgMHhhLCAweDlkNCk7IG1kZWxheSgxKTsKQEAgLTY4MSwxMyArNjY2LDYgQEAKIAogCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIDB4YzRkKTsKIAotCWlmIChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKSB7Ci0JCW1kZWxheSgyMDApOwotCi0JCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIDB4NDRkKTsKLQkJbWRlbGF5KDEwMCk7Ci0JfQotCiAJLyogRklYTUUhISBydGw4MTg3IHdlIGhhdmUgdG8gY2hlY2sgaWYgY2FsaWJyYXJpb24KIAkgKiBpcyBzdWNjZXNzZnVsIGFuZCBldmVudHVhbGx5IGNhbC4gYWdhaW4gKHJlcGVhdAogCSAqIHRoZSB0d28gd3JpdGUgb24gcmVnIDIpCkBAIC03MDcsOSArNjg1LDYgQEAKIAogCXdyaXRlX3J0bDgyMjUoZGV2LCAweDAsIDB4MmJmKTsKIAotCWlmIChwcml2LT5jYXJkX3R5cGUgIT0gVVNCKQotCQlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKIAkJZGF0YSA9IHJ0bDgyMjVfYWdjW2ldOwogCkBAIC03MjYsNyArNzAxLDcgQEAKIAogCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwMCwgMHgwMSk7IG1kZWxheSgxKTsKIAl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDEsIDB4MDIpOyBtZGVsYXkoMSk7Ci0Jd3JpdGVfcGh5X29mZG0oZGV2LCAweDAyLCAoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpID8gMHg0MiA6IDB4NjIpKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwMiwgMHg2Mik7IG1kZWxheSgxKTsKIAl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDMsIDB4MDApOyBtZGVsYXkoMSk7CiAJd3JpdGVfcGh5X29mZG0oZGV2LCAweDA0LCAweDAwKTsgbWRlbGF5KDEpOwogCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwNSwgMHgwMCk7IG1kZWxheSgxKTsKQEAgLTc3NCw3ICs3NDksNyBAQAogCXdyaXRlX3BoeV9jY2soZGV2LCAweDYsIDB4ZmMpOyBtZGVsYXkoMSk7CiAJd3JpdGVfcGh5X2NjayhkZXYsIDB4NywgMHg3OCk7IG1kZWxheSgxKTsKIAl3cml0ZV9waHlfY2NrKGRldiwgMHg4LCAweDJlKTsgbWRlbGF5KDEpOwotCXdyaXRlX3BoeV9jY2soZGV2LCAweDEwLCAoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpID8gMHg5YjogMHg5MykpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsIDB4OTMpOyBtZGVsYXkoMSk7CiAJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTEsIDB4ODgpOyBtZGVsYXkoMSk7CiAJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTIsIDB4NDcpOyBtZGVsYXkoMSk7CiAJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTMsIDB4ZDApOwpAQCAtODA4LDEyICs3ODMsOCBAQAogCS8qIHN3aXRjaCB0byBoaWdoLXNwZWVkIDMtd2lyZQogCSAqIGxhc3QgZGlnaXQuIDIgZm9yIGJvdGggY2NrIGFuZCBvZmRtCiAJICovCi0JaWYgKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpCi0JCXdyaXRlX25pY19kd29yZChkZXYsIDB4OTQsIDB4M2RjMDAwMDIpOwotCWVsc2UgewotCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LCAweDE1YzAwMDAyKTsKLQkJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOwotCX0KKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LCAweDE1YzAwMDAyKTsKKwlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7CiAKIAlydGw4MjI1X3JmX3NldF9jaGFuKGRldiwgcHJpdi0+Y2hhbik7CiB9CkBAIC0xMDU4LDcgKzEwMjksNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQliUmVzdWx0ID0gZmFsc2U7Ci0JCQlwcmludGsoIlNldFplYnJhUkZQb3dlclN0YXRlODE4NSgpOiB1bmtub3cgc3RhdGUgdG8gc2V0OiAweCVYISEhXG4iLCBlUkZQb3dlclN0YXRlKTsKKwkJCXByaW50aygiU2V0WmVicmFSRlBvd2VyU3RhdGU4MTg1KCk6IHVua25vd24gc3RhdGUgdG8gc2V0OiAweCVYISEhXG4iLCBlUkZQb3dlclN0YXRlKTsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5jCmluZGV4IDc2Njg5MmUuLjUzNmNiNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3d4LmMKQEAgLTI3Niw3ICsyNzYsNyBAQAogCXJhbmdlLT5tYXhfcXVhbC51cGRhdGVkID0gNzsgLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KIAogCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gOTI7IC8qID4gOCUgbWlzc2VkIGJlYWNvbnMgaXMgJ2JhZCcgKi8KLQkvKiBUT0RPOiBGaW5kIHJlYWwgJ2dvb2QnIHRvICdiYWQnIHRocmVzaG9sIHZhbHVlIGZvciBSU1NJICovCisJLyogVE9ETzogRmluZCByZWFsICdnb29kJyB0byAnYmFkJyB0aHJlc2hvbGQgdmFsdWUgZm9yIFJTU0kgKi8KIAlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAyMCArIC05ODsKIAlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOwogCXJhbmdlLT5hdmdfcXVhbC51cGRhdGVkID0gNzsgLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODViX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODViX2luaXQuYwppbmRleCBjZDA3MDU5Li41MDMwOWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTg1Yl9pbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4NWJfaW5pdC5jCkBAIC0xMDIzLDYgKzEwMjMsNyBAQAogCXUzMglhZGRyLGRhdGE7CiAJdTMyCXU0YlJlZ09mZnNldCwgdTRiUmVnVmFsdWUsIHU0YlJGMjMsIHU0YlJGMjQ7CiAgICAgICAgdTgJCQl1MWIyNEU7CisJaW50IGRfY3V0ID0gMDsKIAogCiAJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTAzNSw4ICsxMDM2LDEwIEBACiAJdTRiUkYyMz0gUkZfUmVhZFJlZyhkZXYsIDB4MDgpOwkJCW1kZWxheSgxKTsKIAl1NGJSRjI0PSBSRl9SZWFkUmVnKGRldiwgMHgwOSk7CQkJbWRlbGF5KDEpOwogCi0JaWYgKHU0YlJGMjM9PTB4ODE4ICYmIHU0YlJGMjQ9PTB4NzBDICYmIHByaXYtPmNhcmRfODE4NSA9PSBWRVJTSU9OXzgxODdTX0MpCi0JCXByaXYtPmNhcmRfODE4NSA9IFZFUlNJT05fODE4N1NfRDsKKwlpZiAodTRiUkYyMyA9PSAweDgxOCAmJiB1NGJSRjI0ID09IDB4NzBDKSB7CisJCWRfY3V0ID0gMTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicnRsODE4N3NlOiBjYXJkIHR5cGUgY2hhbmdlZCBmcm9tIEMtIHRvIEQtY3V0XG4iKTsKKwl9CiAKIAkvLyBQYWdlMCA6IHJlZzAtcmVnMTUKIApAQCAtMTA3MCwxOCArMTA3Myw5IEBACiAKIAlSRl9Xcml0ZVJlZyhkZXYsIDB4MDMsIDB4MDgwNik7CQkJbWRlbGF5KDEpOwogCi0JaWYocHJpdi0+Y2FyZF84MTg1IDwgVkVSU0lPTl84MTg3U19DKQotCXsKLQkJUkZfV3JpdGVSZWcoZGV2LCAweDA0LCAweDAzZjcpOwkJCW1kZWxheSgxKTsKLQkJUkZfV3JpdGVSZWcoZGV2LCAweDA1LCAweDA1YWIpOwkJCW1kZWxheSgxKTsKLQkJUkZfV3JpdGVSZWcoZGV2LCAweDA2LCAweDAwYzEpOwkJCW1kZWxheSgxKTsKLQl9Ci0JZWxzZQotCXsKLQkJUkZfV3JpdGVSZWcoZGV2LCAweDA0LCAweDAzYTcpOwkJCW1kZWxheSgxKTsKLQkJUkZfV3JpdGVSZWcoZGV2LCAweDA1LCAweDA1OWIpOwkJCW1kZWxheSgxKTsKLQkJUkZfV3JpdGVSZWcoZGV2LCAweDA2LCAweDAwODEpOwkJCW1kZWxheSgxKTsKLQl9CisJUkZfV3JpdGVSZWcoZGV2LCAweDA0LCAweDAzYTcpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDUsIDB4MDU5Yik7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwNiwgMHgwMDgxKTsJCQltZGVsYXkoMSk7CiAKIAogCVJGX1dyaXRlUmVnKGRldiwgMHgwNywgMHgwMUEwKTsJCQltZGVsYXkoMSk7CkBAIC0xMDkxLDE0ICsxMDg1LDExIEBACiAJUkZfV3JpdGVSZWcoZGV2LCAweDBhLCAweDAwMDEpOwkJCW1kZWxheSgxKTsKIAlSRl9Xcml0ZVJlZyhkZXYsIDB4MGIsIDB4MDQxOCk7CQkJbWRlbGF5KDEpOwogCi0JaWYocHJpdi0+Y2FyZF84MTg1ID09IFZFUlNJT05fODE4N1NfRCkKLQl7CisJaWYgKGRfY3V0KSB7CiAJCVJGX1dyaXRlUmVnKGRldiwgMHgwYywgMHgwZmJlKTsJCQltZGVsYXkoMSk7CiAJCVJGX1dyaXRlUmVnKGRldiwgMHgwZCwgMHgwMDA4KTsJCQltZGVsYXkoMSk7CiAJCVJGX1dyaXRlUmVnKGRldiwgMHgwZSwgMHgwODA3KTsJCQltZGVsYXkoMSk7IC8vIFJYIExPIGJ1ZmZlcgotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCVJGX1dyaXRlUmVnKGRldiwgMHgwYywgMHgwZmJlKTsJCQltZGVsYXkoMSk7CiAJCVJGX1dyaXRlUmVnKGRldiwgMHgwZCwgMHgwMDA4KTsJCQltZGVsYXkoMSk7CiAJCVJGX1dyaXRlUmVnKGRldiwgMHgwZSwgMHgwODA2KTsJCQltZGVsYXkoMSk7IC8vIFJYIExPIGJ1ZmZlcgpAQCAtMjQ5Myw4ICsyNDg0LDggQEAKIAlQaHlDb25maWc4MTg1KGRldik7CiAKIAkvLyBXZSBhc3N1bWUgUmVnV2lyZWxlc3NNb2RlIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgYmVmb3JlLAotCS8vIGhvd2V2ZXIsIHdlIGhhcyB0byB2YWxpZGF0ZSB0aGUgd2lyZWxlc3MgbW9kZSBoZXJlIGFuZCBwcm92aWRlIGEgcmVhc29uYmxlCi0JLy8gaW5pdGlhbGl6ZWQgdmFsdWUgaWYgbmVjZXNzYXJ5LiAyMDA1LjAxLjEzLCBieSByY25qa28uCisJLy8gaG93ZXZlciwgd2UgaGFzIHRvIHZhbGlkYXRlIHRoZSB3aXJlbGVzcyBtb2RlIGhlcmUgYW5kIHByb3ZpZGUgYQorCS8vIHJlYXNvbmFibGUgaW5pdGlhbGl6ZWQgdmFsdWUgaWYgbmVjZXNzYXJ5LiAyMDA1LjAxLjEzLCBieSByY25qa28uCiAJU3VwcG9ydGVkV2lyZWxlc3NNb2RlID0gR2V0U3VwcG9ydGVkV2lyZWxlc3NNb2RlODE4NShkZXYpOwogCWlmKAkoaWVlZS0+bW9kZSAhPSBXSVJFTEVTU19NT0RFX0IpICYmCiAJCShpZWVlLT5tb2RlICE9IFdJUkVMRVNTX01PREVfRykgJiYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKaW5kZXggMTJjMmExOC4uMjY0NDE1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKQEAgLTE2NCw3ICsxNjQsNyBAQAogIAlpZWVlLT5wcml2YWN5X2ludm9rZWQgPSAwOwogIAlpZWVlLT5pZWVlODAyXzF4ID0gMTsKIAlpZWVlLT5yYXdfdHggPSAwOwotCS8vaWVlZS0+aHdzZWNfc3VwcG9ydCA9IDE7IC8vZGVmYWx0IHN1cHBvcnQgaHcgc2VjdXJpdHkuIC8vdXNlIG1vZHVsZV9wYXJhbSBpbnN0ZWFkLgorCS8vaWVlZS0+aHdzZWNfc3VwcG9ydCA9IDE7IC8vZGVmYXVsdCBzdXBwb3J0IGh3IHNlY3VyaXR5LiAvL3VzZSBtb2R1bGVfcGFyYW0gaW5zdGVhZC4KIAlpZWVlLT5od3NlY19hY3RpdmUgPSAwOyAvL2Rpc2FibGUgaHdzZWMsIHN3aXRjaCBpdCBvbiB3aGVuIG5lY2Vzc2FyeS4KIAogCWllZWU4MDIxMV9zb2Z0bWFjX2luaXQoaWVlZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKaW5kZXggZWFlN2M0NS4uNTkzZDIyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwpAQCAtMjMzMCwxMCArMjMzMCwxMCBAQAogICogY2FyZSBvZiB0aGUgaWVlZTgwMi4xMSBmcmFnbWVudGF0aW9uLgogICogU28gdGhlIGRyaXZlciByZWNlaXZlcyBhIGZyYWdtZW50IHBlciB0aW1lIGFuZCBtaWdodAogICogY2FsbCB0aGUgc3RvcCBmdW5jdGlvbiB3aGVuIGl0IHdhbnQgd2l0aG91dCB0YWtlIGNhcmUKLSAqIHRvIGhhdmUgZW5vdWdodCByb29tIHRvIFRYIGFuIGVudGlyZSBwYWNrZXQuCisgKiB0byBoYXZlIGVub3VnaCByb29tIHRvIFRYIGFuIGVudGlyZSBwYWNrZXQuCiAgKiBUaGlzIG1pZ2h0IGJlIHVzZWZ1bCBpZiBlYWNoIGZyYWdtZW50IG5lZWQgaXQncyBvd24KICAqIGRlc2NyaXB0b3IsIHRodXMganVzdCBrZWVwIGEgdG90YWwgZnJlZSBtZW1vcnkgPiB0aGFuCi0gKiB0aGUgbWF4IGZyYWdtZW50YXRpb24gdHJlc2hvbGQgaXMgbm90IGVub3VnaHQuLiBJZiB0aGUKKyAqIHRoZSBtYXggZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgaXMgbm90IGVub3VnaC4uIElmIHRoZQogICogaWVlZTgwMi4xMSBzdGFjayBwYXNzZWQgYSBUWEIgc3RydWN0IHRoZW4geW91IG5lZWRlZAogICogdG8ga2VlcCBOIGZyZWUgZGVzY3JpcHRvcnMgd2hlcmUKICAqIE4gPSBNQVhfUEFDS0VUX1NJWkUgLyBNSU5fRlJBR19UUkVTSE9MRApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkwX3J0bDgyNTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MF9ydGw4MjU2LmMKaW5kZXggMGVhZWUzYS4uM2Q2N2ZiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkwX3J0bDgyNTYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTBfcnRsODI1Ni5jCkBAIC02MjksNyArNjI5LDcgQEAKIAogCQkJZGVmYXVsdDoKIAkJCQkJYlJlc3VsdCA9IGZhbHNlOwotCQkJCQlSVF9UUkFDRShDT01QX0VSUiwgIlNldFJGUG93ZXJTdGF0ZTgxOTAoKTogdW5rbm93IHN0YXRlIHRvIHNldDogMHglWCEhIVxuIiwgZVJGUG93ZXJTdGF0ZSk7CisJCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiU2V0UkZQb3dlclN0YXRlODE5MCgpOiB1bmtub3duIHN0YXRlIHRvIHNldDogMHglWCEhIVxuIiwgZVJGUG93ZXJTdGF0ZSk7CiAJCQkJCWJyZWFrOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jb3JlLmMKaW5kZXggYjA4MDJhNy4uZmY4ZmU3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jb3JlLmMKQEAgLTEwNDEsNyArMTA0MSw3IEBACiAgICAgICAgIHR4X2Rlc2NfODE5eF9wY2kgKmVudHJ5ID0gJnJpbmctPmRlc2NbcmluZy0+aWR4XTsKICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAotICAgICAgICAvKiBiZWFjb24gcGFja2V0IHdpbGwgb25seSB1c2UgdGhlIGZpcnN0IGRlc2NyaXB0b3IgZGVmYXV0bHksCisgICAgICAgIC8qIGJlYWNvbiBwYWNrZXQgd2lsbCBvbmx5IHVzZSB0aGUgZmlyc3QgZGVzY3JpcHRvciBkZWZhdWx0bHksCiAgICAgICAgICAqIGFuZCB0aGUgT1dOIG1heSBub3QgYmUgY2xlYXJlZCBieSB0aGUgaGFyZHdhcmUKICAgICAgICAgICogKi8KICAgICAgICAgaWYocHJpbyAhPSBCRUFDT05fUVVFVUUpIHsKQEAgLTI1NjIsNyArMjU2Miw3IEBACiAJCXByaXYtPmJUWFBvd2VyRGF0YVJlYWRGcm9tRUVQT1JNID0gZmFsc2U7CiAJfQogCi0JLy8gMjAwNy8xMS8xNSBNSCA4MTkwUENJIERlZmF1bHQ9MlQ0UiwgODE5MlBDSUUgZGFmYXVsdD0xVDJSCisJLy8gMjAwNy8xMS8xNSBNSCA4MTkwUENJIERlZmF1bHQ9MlQ0UiwgODE5MlBDSUUgZGVmYXVsdD0xVDJSCiAJcHJpdi0+cmZfdHlwZSA9IFJUTDgxOVhfREVGQVVMVF9SRl9UWVBFOwogCiAJaWYocHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPiBWRVJTSU9OXzgxOTBfQkQpCkBAIC0zNTU0LDcgKzM1NTQsNyBAQAogCS8vc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOwogCS8qIHByZXBhcmUgbWlzYyBpbmZvIGZvciB0aGUgYmVhY29uIHhtaXQgKi8KIAl0Y2JfZGVzYy0+cXVldWVfaW5kZXggPSBCRUFDT05fUVVFVUU7Ci0JLyogSUJTUyBkb2VzIG5vdCBzdXBwb3J0IEhUIHlldCwgdXNlIDFNIGRlZmF1dGx5ICovCisJLyogSUJTUyBkb2VzIG5vdCBzdXBwb3J0IEhUIHlldCwgdXNlIDFNIGRlZmF1bHRseSAqLwogCXRjYl9kZXNjLT5kYXRhX3JhdGUgPSAyOwogCXRjYl9kZXNjLT5SQVRSSW5kZXggPSA3OwogCXRjYl9kZXNjLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfZG0uYwppbmRleCBiZjg3NjMyLi41ZmZiNGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2RtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9kbS5jCkBAIC00NTUsNyArNDU1LDcgQEAKIAkJCQkJKHByYS0+bG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTQwTSk6KHByYS0+bG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTIwTSk7CiAJCX0KIAotCQkvL0RiZ1ByaW50KCJbRE1dIFRIcmVzaCBIL0w9JWQvJWRcblxyIiwgUkFUUi5IaWdoUlNTSVRocmVzaEZvclJBLCBSQVRSLkxvd1JTU0lUaHJlc2hGb3JSQSk7CisJCS8vRGJnUHJpbnQoIltETV0gVGhyZXNoIEgvTD0lZC8lZFxuXHIiLCBSQVRSLkhpZ2hSU1NJVGhyZXNoRm9yUkEsIFJBVFIuTG93UlNTSVRocmVzaEZvclJBKTsKIAkJaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSAobG9uZylIaWdoUlNTSVRocmVzaEZvclJBKQogCQl7CiAJCQkvL0RiZ1ByaW50KCJbRE1dIFJTU0k9JWQgU1RBPUhJR0hcblxyIiwgcEhhbERhdGEtPlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCKTsKQEAgLTU3MSw3ICs1NzEsNyBAQAogCTB4NWE0MDAxNjksCS8vIDMsICszZGIKIAkweDUwODAwMTQyLAkvLyA0LCArMmRiCiAJMHg0N2MwMDExZiwJLy8gNSwgKzFkYgotCTB4NDAwMDAxMDAsCS8vIDYsICswZGIgPT09PiBkZWZhdWx0LCB1cHBlciBmb3IgaGlnaGVyIHRlbXByYXR1cmUsIGxvd2VyIGZvciBsb3cgdGVtcHJhdHVyZQorCTB4NDAwMDAxMDAsCS8vIDYsICswZGIgPT09PiBkZWZhdWx0LCB1cHBlciBmb3IgaGlnaGVyIHRlbXBlcmF0dXJlLCBsb3dlciBmb3IgbG93IHRlbXBlcmF0dXJlCiAJMHgzOTAwMDBlNCwJLy8gNywgLTFkYgogCTB4MzJjMDAwY2IsCS8vIDgsIC0yZGIKIAkweDJkNDAwMGI1LAkvLyA5LCAtM2RiCkBAIC05MzIsMTQgKzkzMiwxNCBAQAogCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJSZWFkYmFjayBUaGVybWFsTWV0ZXJBID0gJWQgXG4iLCB0bXBSZWdBKTsKIAlpZih0bXBSZWdBIDwgMyB8fCB0bXBSZWdBID4gMTMpCiAJCXJldHVybjsKLQlpZih0bXBSZWdBID49IDEyKQkvLyBpZiBvdmVyIDEyLCBUUCB3aWxsIGJlIGJhZCB3aGVuIGhpZ2ggdGVtcHJhdHVyZQorCWlmKHRtcFJlZ0EgPj0gMTIpCS8vIGlmIG92ZXIgMTIsIFRQIHdpbGwgYmUgYmFkIHdoZW4gaGlnaCB0ZW1wZXJhdHVyZQogCQl0bXBSZWdBID0gMTI7CiAJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlZhbGlkIFRoZXJtYWxNZXRlckEgPSAlZCBcbiIsIHRtcFJlZ0EpOwogCXByaXYtPlRoZXJtYWxNZXRlclswXSA9IFRoZXJtYWxNZXRlclZhbDsJLy9XZSB1c2UgZml4ZWQgdmFsdWUgYnkgQnJ5YW50J3Mgc3VnZ2VzdGlvbgogCXByaXYtPlRoZXJtYWxNZXRlclsxXSA9IFRoZXJtYWxNZXRlclZhbDsJLy9XZSB1c2UgZml4ZWQgdmFsdWUgYnkgQnJ5YW50J3Mgc3VnZ2VzdGlvbgogCi0JLy9HZXQgY3VycmVudCBSRi1BIHRlbXByYXR1cmUgaW5kZXgKLQlpZihwcml2LT5UaGVybWFsTWV0ZXJbMF0gPj0gKHU4KXRtcFJlZ0EpCS8vbG93ZXIgdGVtcHJhdHVyZQorCS8vR2V0IGN1cnJlbnQgUkYtQSB0ZW1wZXJhdHVyZSBpbmRleAorCWlmKHByaXYtPlRoZXJtYWxNZXRlclswXSA+PSAodTgpdG1wUmVnQSkJLy9sb3dlciB0ZW1wZXJhdHVyZQogCXsKIAkJdG1wT0ZETWluZGV4ID0gdG1wQ0NLMjBNaW5kZXggPSA2Kyhwcml2LT5UaGVybWFsTWV0ZXJbMF0tKHU4KXRtcFJlZ0EpOwogCQl0bXBDQ0s0ME1pbmRleCA9IHRtcENDSzIwTWluZGV4IC0gNjsKQEAgLTk1Myw3ICs5NTMsNyBAQAogCWVsc2UKIAl7CiAJCXRtcHZhbCA9ICgodTgpdG1wUmVnQSAtIHByaXYtPlRoZXJtYWxNZXRlclswXSk7Ci0JCWlmKHRtcHZhbCA+PSA2KQkJCQkJCQkJLy8gaGlnaGVyIHRlbXByYXR1cmUKKwkJaWYodG1wdmFsID49IDYpCQkJCQkJCQkvLyBoaWdoZXIgdGVtcGVyYXR1cmUKIAkJCXRtcE9GRE1pbmRleCA9IHRtcENDSzIwTWluZGV4ID0gMDsJCS8vIG1heCB0byArNmRCCiAJCWVsc2UKIAkJCXRtcE9GRE1pbmRleCA9IHRtcENDSzIwTWluZGV4ID0gNiAtIHRtcHZhbDsKQEAgLTIwMTcsNyArMjAxNyw3IEBACiAJZG1fZGlndGFibGUuZGJnX21vZGUgPSBETV9EQkdfT0ZGOwkvL29mZj1ieSByZWFsIHJzc2kgdmFsdWUsIG9uPWJ5IERNX0RpZ1RhYmxlLlJzc2lfdmFsIGZvciBuZXcgZGlnCiAJZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobV9zd2l0Y2ggPSAwOwogCi0JLyogMjAwNy8xMC8wNCBNSCBEZWZpbmUgaW5pdCBnYWluIHRocmVzaG9sLiAqLworCS8qIDIwMDcvMTAvMDQgTUggRGVmaW5lIGluaXQgZ2FpbiB0aHJlc2hvbGQuICovCiAJZG1fZGlndGFibGUuZGlnX3N0YXRlCQk9IERNX1NUQV9ESUdfTUFYOwogCWRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlCT0gRE1fU1RBX0RJR19NQVg7CiAJZG1fZGlndGFibGUuaW5pdGlhbGdhaW5fbG93ZXJib3VuZF9zdGF0ZSA9IGZhbHNlOwpAQCAtMjE0NSw3ICsyMTQ1LDcgQEAKIAkvKkRiZ1ByaW50KCJESUcgQ2hlY2tcblxyIFJTU0k9JWQgTE9XPSVkIEhJR0g9JWQgU1RBVEU9JWQiLAogCXBIYWxEYXRhLT5VbmRlY29yYXRlZFNtb290aGVkUFdEQiwgRE1fRGlnVGFibGUuUnNzaUxvd1RocmVzaCwKIAlETV9EaWdUYWJsZS5Sc3NpSGlnaFRocmVzaCwgRE1fRGlnVGFibGUuRGlnX1N0YXRlKTsqLwotCS8qIDEuIFdoZW4gUlNTSSBkZWNyZWFzZSwgV2UgaGF2ZSB0byBqdWRnZSBpZiBpdCBpcyBzbWFsbGVyIHRoYW4gYSB0cmVzaG9sZAorCS8qIDEuIFdoZW4gUlNTSSBkZWNyZWFzZSwgV2UgaGF2ZSB0byBqdWRnZSBpZiBpdCBpcyBzbWFsbGVyIHRoYW4gYSB0aHJlc2hvbGQKIAkJICBhbmQgdGhlbiBleGVjdXRlIGJlbG93IHN0ZXAuICovCiAJaWYgKChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDw9IGRtX2RpZ3RhYmxlLnJzc2lfbG93X3RocmVzaCkpCiAJewpAQCAtMjIwNSw3ICsyMjA1LDcgQEAKIAogCX0KIAotCS8qIDIuIFdoZW4gUlNTSSBpbmNyZWFzZSwgV2UgaGF2ZSB0byBqdWRnZSBpZiBpdCBpcyBsYXJnZXIgdGhhbiBhIHRyZXNob2xkCisJLyogMi4gV2hlbiBSU1NJIGluY3JlYXNlLCBXZSBoYXZlIHRvIGp1ZGdlIGlmIGl0IGlzIGxhcmdlciB0aGFuIGEgdGhyZXNob2xkCiAJCSAgYW5kIHRoZW4gZXhlY3V0ZSBiZWxvdyBzdGVwLiAgKi8KIAlpZiAoKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCkgKQogCXsKQEAgLTIzMTQsNyArMjMxNCw3IEBACiAJfQogCiAJLyogMy4gV2hlbiBSU1NJID43NSUgb3IgPDcwJSwgaXQgaXMgYSBoaWdoIHBvd2VyIGlzc3VlLiBXZSBoYXZlIHRvIGp1ZGdlIGlmCi0JCSAgaXQgaXMgbGFyZ2VyIHRoYW4gYSB0cmVzaG9sZCBhbmQgdGhlbiBleGVjdXRlIGJlbG93IHN0ZXAuICAqLworCQkgIGl0IGlzIGxhcmdlciB0aGFuIGEgdGhyZXNob2xkIGFuZCB0aGVuIGV4ZWN1dGUgYmVsb3cgc3RlcC4gICovCiAJLy8gMjAwOC8wMi8wNSBNSCBTRDMtSmVycnkgTW9kaWZ5IFBEX1RIIGZvciBoaWdoIHBvd2VyIGlzc3VlLgogCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9oaWdodGhyZXNoKQogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfd3guYwppbmRleCBlOWU3OTljLi5kMWViODkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV93eC5jCkBAIC00NDYsNyArNDQ2LDcgQEAKIAlyYW5nZS0+bWF4X3F1YWwudXBkYXRlZCA9IDc7IC8qIFVwZGF0ZWQgYWxsIHRocmVlICovCiAKIAlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IDkyOyAvKiA+IDglIG1pc3NlZCBiZWFjb25zIGlzICdiYWQnICovCi0JLyogVE9ETzogRmluZCByZWFsICdnb29kJyB0byAnYmFkJyB0aHJlc2hvbCB2YWx1ZSBmb3IgUlNTSSAqLworCS8qIFRPRE86IEZpbmQgcmVhbCAnZ29vZCcgdG8gJ2JhZCcgdGhyZXNob2xkIHZhbHVlIGZvciBSU1NJICovCiAJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gMjAgKyAtOTg7CiAJcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gMDsKIAlyYW5nZS0+YXZnX3F1YWwudXBkYXRlZCA9IDc7IC8qIFVwZGF0ZWQgYWxsIHRocmVlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX2NtZHBrdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTl4RV9jbWRwa3QuYwppbmRleCBkNmI3ZDJmLi4yYWFhNGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX2NtZHBrdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfY21kcGt0LmMKQEAgLTc4Myw3ICs3ODMsNyBAQAogCiAJCQlkZWZhdWx0OgogCi0JCQkgICAgICAgIFJUX1RSQUNFKENPTVBfRVZFTlRTLCAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6dW5rbm93IENNRCBFbGVtZW50XG4iKTsKKwkJCSAgICAgICAgUlRfVFJBQ0UoQ09NUF9FVkVOVFMsICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKTp1bmtub3duIENNRCBFbGVtZW50XG4iKTsKIAkJCQlyZXR1cm4gMTsJLyogVGhpcyBpcyBhIGNvbW1hbmQgcGFja2V0LiAqLwogCQl9CiAJCS8vIDIwMDcvMDEvMjIgTUggRGlzcGxheSByZWNlaXZlZCByeCBjb21tYW5kIHBhY2tldCBpbmZvLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTl4RV9waHlyZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfcGh5cmVnLmgKaW5kZXggZDRhNDM5Mi4uMzdmMGZlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTl4RV9waHlyZWcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX3BoeXJlZy5oCkBAIC0yOTQsNyArMjk0LDcgQEAKICNkZWZpbmUgYlIyUkNDQU1hc2sgICAgICAgICAgICAgICAJCTB4MDAwMDBmMDAKICNkZWZpbmUgYkhTU0lfUjJURGVsYXkgICAgICAgICAgICAJCTB4ZjgwMDAwMDAKICNkZWZpbmUgYkhTU0lfVDJSRGVsYXkgICAgICAgICAgICAJCTB4ZjgwMDAwCi0jZGVmaW5lIGJDb250VHhIU1NJICAgICAgICAgICAgICAgCQkweDQwMCAgICAgLy9jaGFuZSBnYWluIGF0IGNvbnRpbnVlIFR4CisjZGVmaW5lIGJDb250VHhIU1NJICAgICAgICAgICAgICAgCQkweDQwMCAgICAgLy9jaGFubmVsIGdhaW4gYXQgY29udGludWUgVHgKICNkZWZpbmUgYklHRnJvbUNDSyAgICAgICAgICAgICAgICAJCTB4MjAwCiAjZGVmaW5lIGJBR0NBZGRyZXNzICAgICAgICAgICAgICAgCQkweDNmCiAjZGVmaW5lIGJSeEhQVHggICAgICAgICAgICAgICAgICAgCQkJMHg3MDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L0tjb25maWcKaW5kZXggYjhjOTVmOS4uMTIzZmE2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvS2NvbmZpZwpAQCAtMSw2ICsxLDYgQEAKIGNvbmZpZyBSVEw4MTkyU1UKIAl0cmlzdGF0ZSAiUmVhbFRlayBSVEw4MTkyU1UgV2lyZWxlc3MgTEFOIE5JQyBkcml2ZXIiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgV0xBTgorCWRlcGVuZHMgb24gUENJICYmIFdMQU4gJiYgVVNCCiAJZGVwZW5kcyBvbiBXSVJFTEVTU19FWFQKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKaW5kZXggYzMzODNiYi4uZThjNjdkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAgCWllZWUtPnByaXZhY3lfaW52b2tlZCA9IDA7CiAgCWllZWUtPmllZWU4MDJfMXggPSAxOwogCWllZWUtPnJhd190eCA9IDA7Ci0JLy9pZWVlLT5od3NlY19zdXBwb3J0ID0gMTsgLy9kZWZhbHQgc3VwcG9ydCBodyBzZWN1cml0eS4gLy91c2UgbW9kdWxlX3BhcmFtIGluc3RlYWQuCisJLy9pZWVlLT5od3NlY19zdXBwb3J0ID0gMTsgLy9kZWZhdWx0IHN1cHBvcnQgaHcgc2VjdXJpdHkuIC8vdXNlIG1vZHVsZV9wYXJhbSBpbnN0ZWFkLgogCWllZWUtPmh3c2VjX2FjdGl2ZSA9IDA7IC8vZGlzYWJsZSBod3NlYywgc3dpdGNoIGl0IG9uIHdoZW4gbmVjZXNzYXJ5LgogCiAJaWVlZTgwMjExX3NvZnRtYWNfaW5pdChpZWVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKaW5kZXggOGU1NmY5Ny4uYWMyMjNjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGNwLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwppbmRleCBmZDhlMTEyLi4yMDNjMGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKQEAgLTIxMjAsMTAgKzIxMjAsMTAgQEAKICAqIGNhcmUgb2YgdGhlIGllZWU4MDIuMTEgZnJhZ21lbnRhdGlvbi4KICAqIFNvIHRoZSBkcml2ZXIgcmVjZWl2ZXMgYSBmcmFnbWVudCBwZXIgdGltZSBhbmQgbWlnaHQKICAqIGNhbGwgdGhlIHN0b3AgZnVuY3Rpb24gd2hlbiBpdCB3YW50IHdpdGhvdXQgdGFrZSBjYXJlCi0gKiB0byBoYXZlIGVub3VnaHQgcm9vbSB0byBUWCBhbiBlbnRpcmUgcGFja2V0LgorICogdG8gaGF2ZSBlbm91Z2ggcm9vbSB0byBUWCBhbiBlbnRpcmUgcGFja2V0LgogICogVGhpcyBtaWdodCBiZSB1c2VmdWwgaWYgZWFjaCBmcmFnbWVudCBuZWVkIGl0J3Mgb3duCiAgKiBkZXNjcmlwdG9yLCB0aHVzIGp1c3Qga2VlcCBhIHRvdGFsIGZyZWUgbWVtb3J5ID4gdGhhbgotICogdGhlIG1heCBmcmFnbWVudGF0aW9uIHRyZXNob2xkIGlzIG5vdCBlbm91Z2h0Li4gSWYgdGhlCisgKiB0aGUgbWF4IGZyYWdtZW50YXRpb24gdGhyZXNob2xkIGlzIG5vdCBlbm91Z2guLiBJZiB0aGUKICAqIGllZWU4MDIuMTEgc3RhY2sgcGFzc2VkIGEgVFhCIHN0cnVjdCB0aGVuIHlvdSBuZWVkZWQKICAqIHRvIGtlZXAgTiBmcmVlIGRlc2NyaXB0b3JzIHdoZXJlCiAgKiBOID0gTUFYX1BBQ0tFVF9TSVpFIC8gTUlOX0ZSQUdfVFJFU0hPTEQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKaW5kZXggNDdmZjBlZi4uNjA2MjFkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKQEAgLTQ3LDcgKzQ3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGNwLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCmluZGV4IDYxNDZjNjQuLjg1YzdlOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCkBAIC0zMCw3ICszMCw2IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL3JlYWRtZSBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL3JlYWRtZQppbmRleCA1NzY0ZjI4Li43YmExNzdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9yZWFkbWUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvcmVhZG1lCkBAIC0zNyw3ICszNyw3IEBACiAgIGRpc2Fzc29jaWF0ZSBjbGllbnRzLCBhbmQgaXQgaXMgcmVhbGx5IHByb25lIHRvIGFsd2F5cyBhbGxvdyBhY2Nlc3MuCiAgIEluIGJzcyBjbGllbnQgbW9kZSBpdCBpcyBhIGJpdCByb3VnaCB3aXRoIEFQIGRlYXV0aCBhbmQgZGlzYXNzb2MgcmVxdWVzdHMuCiAtIEl0IGhhcyBub3QgYW55IGVudHJ5IHBvaW50IHRvIHZpZXcgdGhlIGNvbGxlY3RlZCBzdGF0cy4KLS0gQWx0b3VnaHQgaXQgdGFrZXMgY2FyZSBvZiB0aGUgY2FyZCBzdXBwb3J0ZWQgcmF0ZXMgaW4gdGhlIG1hbmFnZW1lbnQgZnJhbWUKKy0gQWx0aG91Z2ggaXQgdGFrZXMgY2FyZSBvZiB0aGUgY2FyZCBzdXBwb3J0ZWQgcmF0ZXMgaW4gdGhlIG1hbmFnZW1lbnQgZnJhbWUKICAgaXQgc2VuZHMsIHN1cHBvcnQgZm9yIHJhdGUgY2hhbmdpbmcgb24gVFhlZCBwYWNrZXQgaXMgbm90IGNvbXBsZXRlLgogLSBHaXZlIHVwIG9uY2UgYXNzb2NpYXRlZCBpbiBic3MgY2xpZW50IG1vZGUgKGl0IG5ldmVyIGRldGVjdCBhCiAgIHNpZ25hbCBsb3NzIGNvbmRpdGlvbiB0byBkaXNhc3NvY2lhdGUgYW5kIHJlc3RhcnQgc2Nhbm5pbmcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyU19waHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX3BoeS5jCmluZGV4IDJjMTExZDcuLjc3YWIwMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX3BoeS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX3BoeS5jCkBAIC0xNzI4LDcgKzE3MjgsNyBAQAogCiAJCQlkZWZhdWx0OgogCQkJCWJSZXN1bHQgPSBGQUxTRTsKLQkJCQkvL1JUX0FTU0VSVChGQUxTRSwgKCJwaHlfU2V0UkZQb3dlclN0YXRlODE5MlNVKCk6IHVua25vdyBzdGF0ZSB0byBzZXQ6IDB4JVghISFcbiIsIGVSRlBvd2VyU3RhdGUpKTsKKwkJCQkvL1JUX0FTU0VSVChGQUxTRSwgKCJwaHlfU2V0UkZQb3dlclN0YXRlODE5MlNVKCk6IHVua25vd24gc3RhdGUgdG8gc2V0OiAweCVYISEhXG4iLCBlUkZQb3dlclN0YXRlKSk7CiAJCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC0yNzExLDcgKzI3MTEsNyBAQAogLy8gSG93ZXZlciwgdGhpcyBwcm9jZWR1cmUgaXMgcGVyZm9ybWVkIHN5bmNocm9ub3VzbHkgIHdoaWNoIHNob3VsZCBiZSBydW5uaW5nIHVuZGVyCiAvLyBwYXNzaXZlIGxldmVsLgogLy8KLS8vbm90IHVuZGVyc3RhbnQgaXQKKy8vbm90IHVuZGVyc3RhbmQgaXQKIHZvaWQgUEhZX1N3Q2hubFBoeTgxOTJTKAkvLyBPbmx5IGNhbGxlZCBkdXJpbmcgaW5pdGlhbGl6ZQogCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCiAJdTgJCWNoYW5uZWwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX3BoeXJlZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfcGh5cmVnLmgKaW5kZXggYWNmNjQ0Zi4uMmU0ZDc2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfcGh5cmVnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfcGh5cmVnLmgKQEAgLTQ1Myw3ICs0NTMsNyBAQAogI2RlZmluZQkJYlIyUkNDQU1hc2sgICAgICAgICAgICAgICAJCQkweDAwMDAwZjAwCiAjZGVmaW5lCQliSFNTSV9SMlREZWxheSAgICAgICAgICAgIAkJMHhmODAwMDAwMAogI2RlZmluZQkJYkhTU0lfVDJSRGVsYXkgICAgICAgICAgICAJCTB4ZjgwMDAwCi0jZGVmaW5lCQliQ29udFR4SFNTSSAgICAgICAgICAgICAgIAkJCTB4NDAwICAgICAvL2NoYW5lIGdhaW4gYXQgY29udGludWUgVHgKKyNkZWZpbmUJCWJDb250VHhIU1NJICAgICAgICAgICAgICAgCQkJMHg0MDAgICAgIC8vY2hhbm5lbCBnYWluIGF0IGNvbnRpbnVlIFR4CiAjZGVmaW5lCQliSUdGcm9tQ0NLICAgICAgICAgICAgICAgIAkJCTB4MjAwCiAjZGVmaW5lCQliQUdDQWRkcmVzcyAgICAgICAgICAgICAgIAkJCTB4M2YKICNkZWZpbmUJCWJSeEhQVHggICAgICAgICAgICAgICAgICAgCQkJMHg3MDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyU19ydGw2MDUyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyU19ydGw2MDUyLmMKaW5kZXggNjllZjZkZi4uMjIzOTgwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfcnRsNjA1Mi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX3J0bDYwNTIuYwpAQCAtMzI2LDcgKzMyNiw3IEBACiAKIAkJLy8KIAkJLy8gSWYgcGF0aCBBIGFuZCBQYXRoIEIgY29leGlzdCwgd2UgbXVzdCBsaW1pdCBQYXRoIEEgdHggcG93ZXIuCi0JCS8vIFByb3RlY3QgUGF0aCBCIHB3ciBvdmVyIG9yIHVuZGVyIGZsb3cuIFdlIG5lZWQgdG8gY2FsY3VsYXRlIHVwcGVyIGFuZAorCQkvLyBQcm90ZWN0IFBhdGggQiBwd3Igb3ZlciBvciB1bmRlcmZsb3cuIFdlIG5lZWQgdG8gY2FsY3VsYXRlIHVwcGVyIGFuZAogCQkvLyBsb3dlciBib3VuZCBvZiBwYXRoIEEgdHggcG93ZXIuCiAJCS8vCiAJCWlmIChwcml2LT5yZl90eXBlID09IFJGXzJUMlIpCkBAIC0zNTQsNyArMzU0LDcgQEAKIAogCQkJLy8KIAkJCS8vIElmIHBhdGggQSBhbmQgUGF0aCBCIGNvZXhpc3QsIHdlIG11c3QgbGltaXQgUGF0aCBBIHR4IHBvd2VyLgotCQkJLy8gUHJvdGVjdCBQYXRoIEIgcHdyIG92ZXIgb3IgdW5kZXIgZmxvdy4gV2UgbmVlZCB0byBjYWxjdWxhdGUgdXBwZXIgYW5kCisJCQkvLyBQcm90ZWN0IFBhdGggQiBwd3IgdW5kZXIvb3ZlciBmbG93LiBXZSBuZWVkIHRvIGNhbGN1bGF0ZSB1cHBlciBhbmQKIAkJCS8vIGxvd2VyIGJvdW5kIG9mIHBhdGggQSB0eCBwb3dlci4KIAkJCS8vCiAJCQlpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8yVDJSKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlVfZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJVX2RtLmMKaW5kZXggNTM1OGFlOC4uNzg5MWU5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlVfZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyVV9kbS5jCkBAIC01OTMsNyArNTkzLDcgQEAKIAkweDVhNDAwMTY5LAkvLyAzLCArM2RiCiAJMHg1MDgwMDE0MiwJLy8gNCwgKzJkYgogCTB4NDdjMDAxMWYsCS8vIDUsICsxZGIKLQkweDQwMDAwMTAwLAkvLyA2LCArMGRiID09PT4gZGVmYXVsdCwgdXBwZXIgZm9yIGhpZ2hlciB0ZW1wcmF0dXJlLCBsb3dlciBmb3IgbG93IHRlbXByYXR1cmUKKwkweDQwMDAwMTAwLAkvLyA2LCArMGRiID09PT4gZGVmYXVsdCwgdXBwZXIgZm9yIGhpZ2hlciB0ZW1wZXJhdHVyZSwgbG93ZXIgZm9yIGxvdyB0ZW1wZXJhdHVyZQogCTB4MzkwMDAwZTQsCS8vIDcsIC0xZGIKIAkweDMyYzAwMGNiLAkvLyA4LCAtMmRiCiAJMHgyZDQwMDBiNSwJLy8gOSwgLTNkYgpAQCAtOTEyLDE0ICs5MTIsMTQgQEAKIAlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiUmVhZGJhY2sgVGhlcm1hbE1ldGVyQSA9ICVkIFxuIiwgdG1wUmVnQSk7CiAJaWYodG1wUmVnQSA8IDMgfHwgdG1wUmVnQSA+IDEzKQogCQlyZXR1cm47Ci0JaWYodG1wUmVnQSA+PSAxMikJLy8gaWYgb3ZlciAxMiwgVFAgd2lsbCBiZSBiYWQgd2hlbiBoaWdoIHRlbXByYXR1cmUKKwlpZih0bXBSZWdBID49IDEyKQkvLyBpZiBvdmVyIDEyLCBUUCB3aWxsIGJlIGJhZCB3aGVuIGhpZ2ggdGVtcGVyYXR1cmUKIAkJdG1wUmVnQSA9IDEyOwogCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJWYWxpZCBUaGVybWFsTWV0ZXJBID0gJWQgXG4iLCB0bXBSZWdBKTsKIAlwcml2LT5UaGVybWFsTWV0ZXJbMF0gPSBUaGVybWFsTWV0ZXJWYWw7CS8vV2UgdXNlIGZpeGVkIHZhbHVlIGJ5IEJyeWFudCdzIHN1Z2dlc3Rpb24KIAlwcml2LT5UaGVybWFsTWV0ZXJbMV0gPSBUaGVybWFsTWV0ZXJWYWw7CS8vV2UgdXNlIGZpeGVkIHZhbHVlIGJ5IEJyeWFudCdzIHN1Z2dlc3Rpb24KIAotCS8vR2V0IGN1cnJlbnQgUkYtQSB0ZW1wcmF0dXJlIGluZGV4Ci0JaWYocHJpdi0+VGhlcm1hbE1ldGVyWzBdID49ICh1OCl0bXBSZWdBKQkvL2xvd2VyIHRlbXByYXR1cmUKKwkvL0dldCBjdXJyZW50IFJGLUEgdGVtcGVyYXR1cmUgaW5kZXgKKwlpZihwcml2LT5UaGVybWFsTWV0ZXJbMF0gPj0gKHU4KXRtcFJlZ0EpCS8vbG93ZXIgdGVtcGVyYXR1cmUKIAl7CiAJCXRtcE9GRE1pbmRleCA9IHRtcENDSzIwTWluZGV4ID0gNisocHJpdi0+VGhlcm1hbE1ldGVyWzBdLSh1OCl0bXBSZWdBKTsKIAkJdG1wQ0NLNDBNaW5kZXggPSB0bXBDQ0syME1pbmRleCAtIDY7CkBAIC05MzMsNyArOTMzLDcgQEAKIAllbHNlCiAJewogCQl0bXB2YWwgPSAoKHU4KXRtcFJlZ0EgLSBwcml2LT5UaGVybWFsTWV0ZXJbMF0pOwotCQlpZih0bXB2YWwgPj0gNikJCQkJCQkJCS8vIGhpZ2hlciB0ZW1wcmF0dXJlCisJCWlmKHRtcHZhbCA+PSA2KQkJCQkJCQkJLy8gaGlnaGVyIHRlbXBlcmF0dXJlCiAJCQl0bXBPRkRNaW5kZXggPSB0bXBDQ0syME1pbmRleCA9IDA7CQkvLyBtYXggdG8gKzZkQgogCQllbHNlCiAJCQl0bXBPRkRNaW5kZXggPSB0bXBDQ0syME1pbmRleCA9IDYgLSB0bXB2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyVV93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlVfd3guYwppbmRleCAyMjA4YzliLi5hN2NjNmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyVV93eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJVX3d4LmMKQEAgLTQzNSw3ICs0MzUsNyBAQAogCXJhbmdlLT5tYXhfcXVhbC51cGRhdGVkID0gNzsgLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KIAogCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gOTI7IC8qID4gOCUgbWlzc2VkIGJlYWNvbnMgaXMgJ2JhZCcgKi8KLQkvKiBUT0RPOiBGaW5kIHJlYWwgJ2dvb2QnIHRvICdiYWQnIHRocmVzaG9sIHZhbHVlIGZvciBSU1NJICovCisJLyogVE9ETzogRmluZCByZWFsICdnb29kJyB0byAnYmFkJyB0aHJlc2hvbGQgdmFsdWUgZm9yIFJTU0kgKi8KIAlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAyMCArIC05ODsKIAlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOwogCXJhbmdlLT5hdmdfcXVhbC51cGRhdGVkID0gNzsgLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOXhVX2NtZHBrdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5eFVfY21kcGt0LmMKaW5kZXggZTJiYTkzZS4uM2ViZmU3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5eFVfY21kcGt0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5eFVfY21kcGt0LmMKQEAgLTY5Nyw3ICs2OTcsNyBAQAogCiAJCQlkZWZhdWx0OgogCi0JCQkgICAgICAgIFJUX1RSQUNFKENPTVBfRVJSLCAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6dW5rbm93IENNRCBFbGVtZW50XG4iKTsKKwkJCSAgICAgICAgUlRfVFJBQ0UoQ09NUF9FUlIsICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKTp1bmtub3duIENNRCBFbGVtZW50XG4iKTsKIAkJCQlyZXR1cm4gMTsJLyogVGhpcyBpcyBhIGNvbW1hbmQgcGFja2V0LiAqLwogCQl9CiAJCS8vIDIwMDcvMDEvMjIgTUggRGlzcGxheSByZWNlaXZlZCByeCBjb21tYW5kIHBhY2tldCBpbmZvLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTEzYWI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L0tjb25maWcKQEAgLTAsMCArMSw2IEBACitjb25maWcgUlRMODE5MlUKKwl0cmlzdGF0ZSAiUmVhbFRlayBSVEw4MTkyVSBXaXJlbGVzcyBMQU4gTklDIGRyaXZlciIKKwlkZXBlbmRzIG9uIFBDSSAmJiBXTEFOICYmIFVTQgorCWRlcGVuZHMgb24gV0lSRUxFU1NfRVhUCisJZGVmYXVsdCBOCisJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNTljNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvTWFrZWZpbGUKQEAgLTAsMCArMSwzMyBAQAorTklDX1NFTEVDVCA9IFJUTDgxOTJVCisKK0VYVFJBX0NGTEFHUyArPSAtc3RkPWdudTg5CitFWFRSQV9DRkxBR1MgKz0gLU8yCisKK0VYVFJBX0NGTEFHUyArPSAtbWhhcmQtZmxvYXQgLURDT05GSUdfRk9SQ0VfSEFSRF9GTE9BVD15CitFWFRSQV9DRkxBR1MgKz0gLURKQUNLU09OX05FV184MTg3IC1ESkFDS1NPTl9ORVdfUlgKK0VYVFJBX0NGTEFHUyArPSAtRFRIT01BU19CRUFDT04gLURUSE9NQVNfVEFTS0xFVCAtRFRIT01BU19TS0IgLURUSE9NQVNfVFVSQk8KKyNFWFRSQV9DRkxBR1MgKz0gLURVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQorI0VYVFJBX0NGTEFHUyArPSAtRFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCitFWFRSQV9DRkxBR1MgKz0gLURVU0VfT05FX1BJUEUKK0VYVFJBX0NGTEFHUyArPSAtREVOQUJMRV9ET1QxMUQKK0VYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEKKworcjgxOTJ1X3VzYi1vYmpzIDo9IHI4MTkyVV9jb3JlLm8gcjgxODBfOTNjeDYubyByODE5MlVfd3gubwkJXAorCQkgIHI4MTkwX3J0bDgyNTYubyByODE5eFVfcGh5Lm8gcjgxOXhVX2Zpcm13YXJlLm8JXAorCQkgIHI4MTl4VV9jbWRwa3QubyByODE5MlVfZG0ubyByODE5eFVfZmlybXdhcmVfaW1nLm8JXAorCQkgIGllZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQubwkJCQlcCisJCSAgaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLm8JCQlcCisJCSAgaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLm8JCQlcCisJCSAgaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAubwkJCVwKKwkJICBpZWVlODAyMTEvaWVlZTgwMjExX3J4Lm8JCQkJXAorCQkgIGllZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5vCQkJCVwKKwkJICBpZWVlODAyMTEvaWVlZTgwMjExX3R4Lm8JCQkJXAorCQkgIGllZWU4MDIxMS9pZWVlODAyMTFfd3gubwkJCQlcCisJCSAgaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUubwkJCQlcCisJCSAgaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjX3d4Lm8JCQlcCisJCSAgaWVlZTgwMjExL3J0bDgxOXhfSFRQcm9jLm8JCQkJXAorCQkgIGllZWU4MDIxMS9ydGw4MTl4X1RTUHJvYy5vCQkJCVwKKwkJICBpZWVlODAyMTEvcnRsODE5eF9CQVByb2MubwkJCQlcCisJCSAgaWVlZTgwMjExL2RvdDExZC5vCisKK29iai0kKENPTkZJR19SVEw4MTkyVSkgKz0gcjgxOTJ1X3VzYi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvYXV0aG9ycyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9hdXRob3JzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOGJiYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvYXV0aG9ycwpAQCAtMCwwICsxIEBACitBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvY2hhbmdlcyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9jaGFuZ2VzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YzMzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvY2hhbmdlcwpAQCAtMCwwICsxLDUgQEAKK3YgMC4xCisKK0ZpcnN0IHZlcnNpb24uCitUaGlzIGlzIGJhc2VkIG9uIHRoZSBydGw4MTgwLXNhMjQwMCBwcmUtMC4yMi1DVlMgY29kZS4uCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9jb3B5aW5nIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2NvcHlpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwYzMxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9jb3B5aW5nCkBAIC0wLDAgKzEsMzQwIEBACisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciAgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9kb3QxMWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9kb3QxMWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWI3YTRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2RvdDExZC5oCkBAIC0wLDAgKzEsMTAyIEBACisjaWZuZGVmIF9fSU5DX0RPVDExRF9ICisjZGVmaW5lIF9fSU5DX0RPVDExRF9ICisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKKy8vI2RlZmluZSBFTkFCTEVfRE9UMTFECisKKy8vI2RlZmluZSBET1QxMURfTUFYX0NITkxfTlVNIDgzCisKK3R5cGVkZWYgc3RydWN0IF9DSE5MX1RYUE9XRVJfVFJJUExFIHsKKwl1OCBGaXJzdENobmw7CisJdTggIE51bUNobmxzOworCXU4ICBNYXhUeFBvd2VySW5EYm07Cit9Q0hOTF9UWFBPV0VSX1RSSVBMRSwgKlBDSE5MX1RYUE9XRVJfVFJJUExFOworCit0eXBlZGVmIGVudW0gX0RPVDExRF9TVEFURSB7CisJRE9UMTFEX1NUQVRFX05PTkUgPSAwLAorCURPVDExRF9TVEFURV9MRUFSTkVELAorCURPVDExRF9TVEFURV9ET05FLAorfURPVDExRF9TVEFURTsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUX0RPVDExRF9JTkZPIHsKKwkvL0RFQ0xBUkVfUlRfT0JKRUNUKFJUX0RPVDExRF9JTkZPKTsKKworCWJvb2wgYkVuYWJsZWQ7IC8vIGRvdDExTXVsdGlEb21haW5DYXBhYmlsaXR5RW5hYmxlZAorCisJdTE2IENvdW50cnlJZUxlbjsgLy8gPiAwIGlmIENvdW50cnlJZUJ1ZltdIGNvbnRhaW5zIHZhbGlkIGNvdW50cnkgaW5mb3JtYXRpb24gZWxlbWVudC4KKwl1OCAgQ291bnRyeUllQnVmW01BWF9JRV9MRU5dOworCXU4ICBDb3VudHJ5SWVTcmNBZGRyWzZdOyAvLyBTb3VyY2UgQVAgb2YgdGhlIGNvdW50cnkgSUUuCisJdTggIENvdW50cnlJZVdhdGNoZG9nOworCisJdTggIGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsgIC8vISEhVmFsdWUgMDogSW52YWxpZCwgMTogVmFsaWQgKGFjdGl2ZSBzY2FuKSwgMjogVmFsaWQgKHBhc3NpdmUgc2NhbikKKwkvL3U4ICBDaG5sTGlzdExlbjsgLy8gI0J5dGVzIHZhbGlkIGluIENobmxMaXN0W10uCisJLy91OCAgQ2hubExpc3RbRE9UMTFEX01BWF9DSE5MX05VTV07CisJdTggIE1heFR4UHdyRGJtTGlzdFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisKKwlET1QxMURfU1RBVEUgU3RhdGU7Cit9UlRfRE9UMTFEX0lORk8sICpQUlRfRE9UMTFEX0lORk87CisjZGVmaW5lIGVxTWFjQWRkcihhLGIpCQkoICgoYSlbMF09PShiKVswXSAmJiAoYSlbMV09PShiKVsxXSAmJiAoYSlbMl09PShiKVsyXSAmJiAoYSlbM109PShiKVszXSAmJiAoYSlbNF09PShiKVs0XSAmJiAoYSlbNV09PShiKVs1XSkgPyAxOjAgKQorI2RlZmluZSBjcE1hY0FkZHIoZGVzLHNyYykJICAgICAgKChkZXMpWzBdPShzcmMpWzBdLChkZXMpWzFdPShzcmMpWzFdLChkZXMpWzJdPShzcmMpWzJdLChkZXMpWzNdPShzcmMpWzNdLChkZXMpWzRdPShzcmMpWzRdLChkZXMpWzVdPShzcmMpWzVdKQorI2RlZmluZSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldikgKChQUlRfRE9UMTFEX0lORk8pKChfX3BJZWVlRGV2KS0+cERvdDExZEluZm8pKQorCisjZGVmaW5lIElTX0RPVDExRF9FTkFCTEUoX19wSWVlZURldikgR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5iRW5hYmxlZAorI2RlZmluZSBJU19DT1VOVFJZX0lFX1ZBTElEKF9fcEllZWVEZXYpIChHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZUxlbiA+IDApCisKKyNkZWZpbmUgSVNfRVFVQUxfQ0lFX1NSQyhfX3BJZWVlRGV2LCBfX3BUYSkgZXFNYWNBZGRyKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllU3JjQWRkciwgX19wVGEpCisjZGVmaW5lIFVQREFURV9DSUVfU1JDKF9fcEllZWVEZXYsIF9fcFRhKSBjcE1hY0FkZHIoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVTcmNBZGRyLCBfX3BUYSkKKworI2RlZmluZSBJU19DT1VOVFJZX0lFX0NIQU5HRUQoX19wSWVlZURldiwgX19JZSkgXAorCSgoKF9fSWUpLkxlbmd0aCA9PSAwIHx8IChfX0llKS5MZW5ndGggIT0gR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVMZW4pID8gXAorCUZBTFNFIDogXAorCSghbWVtY21wKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllQnVmLCAoX19JZSkuT2N0ZXQsIChfX0llKS5MZW5ndGgpKSkKKworI2RlZmluZSBDSUVfV0FUQ0hET0dfVEggMQorI2RlZmluZSBHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpIEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllV2F0Y2hkb2cKKyNkZWZpbmUgUkVTRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpIEdFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikgPSAwCisjZGVmaW5lIFVQREFURV9DSUVfV0FUQ0hET0coX19wSWVlZURldikgKytHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpCisKKyNkZWZpbmUgSVNfRE9UMTFEX1NUQVRFX0RPTkUoX19wSWVlZURldikgKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+U3RhdGUgPT0gRE9UMTFEX1NUQVRFX0RPTkUpCisKKwordm9pZAorRG90MTFkX0luaXQoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldgorCSk7CisKK3ZvaWQKK0RvdDExZF9SZXNldCgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2CisJKTsKKwordm9pZAorRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LAorCXU4ICoJCXBUYWRkciwKKwl1MTYJQ291dHJ5SWVMZW4sCisJdTggKiBwQ291dHJ5SWUKKwkpOworCit1OAorRE9UMTFEX0dldE1heFR4UHdySW5EYm0oCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwKKwl1OCBDaGFubmVsCisJKTsKKwordm9pZAorRE9UMTFEX1NjYW5Db21wbGV0ZSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldgorCSk7CisKK2ludCBJc0xlZ2FsQ2hhbm5lbCgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldiwKKwl1OCBjaGFubmVsCispOworCitpbnQgVG9MZWdhbENoYW5uZWwoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYsCisJdTggY2hhbm5lbAorKTsKKyNlbmRpZiAvL0VOQUJMRV9ET1QxMUQKKyNlbmRpZiAvLyAjaWZuZGVmIF9fSU5DX0RPVDExRF9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0N2YxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEuaApAQCAtMCwwICsxLDI2MzggQEAKKy8qCisgKiBNZXJnZWQgd2l0aCBtYWlubGluZSBpZWVlODAyMTEuaCBpbiBBdWcgMjAwNC4gIE9yaWdpbmFsIGllZWU4MDJfMTEKKyAqIHJlbWFpbnMgY29weXJpZ2h0IGJ5IHRoZSBvcmlnaW5hbCBhdXRob3JzCisgKgorICogUG9ydGlvbnMgb2YgdGhlIG1lcmdlZCBjb2RlIGFyZSBiYXNlZCBvbiBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcworICogTEFOIGFjY2VzcyBwb2ludCkgZHJpdmVyIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBBZGFwdGlvbiB0byBhIGdlbmVyaWMgSUVFRSA4MDIuMTEgc3RhY2sgYnkgSmFtZXMgS2V0cmVub3MKKyAqIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEludGVsIENvcnBvcmF0aW9uCisgKgorICogTW9kaWZpZWQgZm9yIFJlYWx0ZWsncyB3aS1maSBjYXJkcyBieSBBbmRyZWEgTWVyZWxsbworICogPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgSUVFRTgwMjExX0gKKyNkZWZpbmUgSUVFRTgwMjExX0gKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPiAvKiBFVEhfQUxFTiAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPiAgIC8qIEFSUkFZX1NJWkUgKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS9ydGw4MTl4X0hULmgiCisjaW5jbHVkZSAiaWVlZTgwMjExL3J0bDgxOXhfQkEuaCIKKyNpbmNsdWRlICJpZWVlODAyMTEvcnRsODE5eF9UUy5oIgorCisKKyNpZm5kZWYgSVdfTU9ERV9NT05JVE9SCisjZGVmaW5lIElXX01PREVfTU9OSVRPUiA2CisjZW5kaWYKKworI2lmbmRlZiBJV0VWQ1VTVE9NCisjZGVmaW5lIElXRVZDVVNUT00gMHg4YzAyCisjZW5kaWYKKworCisjaWZuZGVmIGNvbnRhaW5lcl9vZgorLyoqCisgKiBjb250YWluZXJfb2YgLSBjYXN0IGEgbWVtYmVyIG9mIGEgc3RydWN0dXJlIG91dCB0byB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUKKyAqCisgKiBAcHRyOiAgICAgICAgdGhlIHBvaW50ZXIgdG8gdGhlIG1lbWJlci4KKyAqIEB0eXBlOiAgICAgICB0aGUgdHlwZSBvZiB0aGUgY29udGFpbmVyIHN0cnVjdCB0aGlzIGlzIGVtYmVkZGVkIGluLgorICogQG1lbWJlcjogICAgIHRoZSBuYW1lIG9mIHRoZSBtZW1iZXIgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKgorICovCisjZGVmaW5lIGNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikgKHsgICAgICAgICAgICAgICAgICAgICAgXAorCWNvbnN0IHR5cGVvZiggKCh0eXBlICopMCktPm1lbWJlciApICpfX21wdHIgPSAocHRyKTsgICAgXAorCSh0eXBlICopKCAoY2hhciAqKV9fbXB0ciAtIG9mZnNldG9mKHR5cGUsbWVtYmVyKSApO30pCisjZW5kaWYKKworI2RlZmluZSBLRVlfVFlQRV9OQQkJMHgwCisjZGVmaW5lIEtFWV9UWVBFX1dFUDQwIAkJMHgxCisjZGVmaW5lIEtFWV9UWVBFX1RLSVAJCTB4MgorI2RlZmluZSBLRVlfVFlQRV9DQ01QCQkweDQKKyNkZWZpbmUgS0VZX1RZUEVfV0VQMTA0CQkweDUKKworLyogYWRkZWQgZm9yIHJ0bDgxOXggdHggcHJvY2VkdXJlICovCisjZGVmaW5lIE1BWF9RVUVVRV9TSVpFCQkweDEwCisKKy8vCisvLyA4MTkwIHF1ZXVlIG1hcHBpbmcKKy8vCisjZGVmaW5lIEJLX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQkVfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBWSV9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFZPX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgSENDQV9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBUWENNRF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIE1HTlRfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgSElHSF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBCRUFDT05fUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICA4CisKKyNkZWZpbmUgTE9XX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVfUVVFVUUKKyNkZWZpbmUgTk9STUFMX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgTUdOVF9RVUVVRQorCisvL2FkZGVkIGJ5IGFteSBmb3IgcHMKKyNkZWZpbmUgU1dSRl9USU1FT1VUCQkJCTUwCisKKy8vYWRkZWQgYnkgYW15IGZvciBMRUFQIHJlbGF0ZWQKKyNkZWZpbmUgSUVfQ0lTQ09fRkxBR19QT1NJVElPTgkJMHgwOAkvLyBGbGFnIGJ5dGU6IGJ5dGUgOCwgbnVtYmVyZWQgZnJvbSAwLgorI2RlZmluZSBTVVBQT1JUX0NLSVBfTUlDCQkJMHgwOAkvLyBiaXQzCisjZGVmaW5lIFNVUFBPUlRfQ0tJUF9QSwkJCTB4MTAJLy8gYml0NAorLyogZGVmaW5lZCBmb3Igc2tiIGNiIGZpZWxkICovCisvKiBBdCBtb3N0IDI4IGJ5dGUgKi8KK3R5cGVkZWYgc3RydWN0IGNiX2Rlc2MgeworCS8qIFR4IERlc2MgUmVsYXRlZCBmbGFncyAoOC05KSAqLworCXU4IGJMYXN0SW5pUGt0OjE7CisJdTggYkNtZE9ySW5pdDoxOworCXU4IGJGaXJzdFNlZzoxOworCXU4IGJMYXN0U2VnOjE7CisJdTggYkVuY3J5cHQ6MTsKKwl1OCBiVHhEaXNhYmxlUmF0ZUZhbGxCYWNrOjE7CisJdTggYlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlOjE7CisJdTggYkh3U2VjOjE7IC8vaW5kaWNhdGUgd2hldGhlciB1c2UgSHcgc2VjdXJpdHkuIFdCCisKKwl1OCByZXNlcnZlZDE7CisKKwkvKiBUeCBGaXJtd2FyZSBSZWxhZ2VkIGZsYWdzICgxMC0xMSkqLworCXU4IGJDVFNFbmFibGU6MTsKKwl1OCBiUlRTRW5hYmxlOjE7CisJdTggYlVzZVNob3J0R0k6MTsKKwl1OCBiVXNlU2hvcnRQcmVhbWJsZToxOworCXU4IGJUeEVuYWJsZUZ3Q2FsY0R1cjoxOworCXU4IGJBTVBEVUVuYWJsZToxOworCXU4IGJSVFNTVEJDOjE7CisJdTggUlRTU0M6MTsKKworCXU4IGJSVFNCVzoxOworCXU4IGJQYWNrZXRCVzoxOworCXU4IGJSVFNVc2VTaG9ydFByZWFtYmxlOjE7CisJdTggYlJUU1VzZVNob3J0R0k6MTsKKwl1OCBiTXVsdGljYXN0OjE7CisJdTggYkJyb2FkY2FzdDoxOworCS8vdTggcmVzZXJ2ZWQyOjI7CisJdTggZHJ2X2FnZ19lbmFibGU6MTsKKwl1OCByZXNlcnZlZDI6MTsKKworCS8qIFR4IERlc2MgcmVsYXRlZCBlbGVtZW50KDEyLTE5KSAqLworCXU4IHJhdGFfaW5kZXg7CisJdTggcXVldWVfaW5kZXg7CisJLy91OCByZXNlcnZlZDM7CisJLy91OCByZXNlcnZlZDQ7CisJdTE2IHR4YnVmX3NpemU7CisJLy91OCByZXNlcnZlZDU7CisJdTggUkFUUkluZGV4OworCXU4IHJlc2VydmVkNjsKKwl1OCByZXNlcnZlZDc7CisJdTggcmVzZXJ2ZWQ4OworCisJLyogVHggZmlybXdhcmUgcmVsYXRlZCBlbGVtZW50KDIwLTI3KSAqLworCXU4IGRhdGFfcmF0ZTsKKwl1OCBydHNfcmF0ZTsKKwl1OCBhbXBkdV9mYWN0b3I7CisJdTggYW1wZHVfZGVuc2l0eTsKKwkvL3U4IHJlc2VydmVkOTsKKwkvL3U4IHJlc2VydmVkMTA7CisJLy91OCByZXNlcnZlZDExOworCXU4IERydkFnZ3JOdW07CisJdTE2IHBrdF9zaXplOworCXU4IHJlc2VydmVkMTI7Cit9Y2JfZGVzYywgKnBjYl9kZXNjOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBNR05fMU0gICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIE1HTl8yTSAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgTUdOXzVfNU0gICAgICAgICAgICAgICAgMHgwYgorI2RlZmluZSBNR05fMTFNICAgICAgICAgICAgICAgICAweDE2CisKKyNkZWZpbmUgTUdOXzZNICAgICAgICAgICAgICAgICAgMHgwYworI2RlZmluZSBNR05fOU0gICAgICAgICAgICAgICAgICAweDEyCisjZGVmaW5lIE1HTl8xMk0gICAgICAgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgTUdOXzE4TSAgICAgICAgICAgICAgICAgMHgyNAorI2RlZmluZSBNR05fMjRNICAgICAgICAgICAgICAgICAweDMwCisjZGVmaW5lIE1HTl8zNk0gICAgICAgICAgICAgICAgIDB4NDgKKyNkZWZpbmUgTUdOXzQ4TSAgICAgICAgICAgICAgICAgMHg2MAorI2RlZmluZSBNR05fNTRNICAgICAgICAgICAgICAgICAweDZjCisKKyNkZWZpbmUgTUdOX01DUzAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBNR05fTUNTMSAgICAgICAgICAgICAgICAweDgxCisjZGVmaW5lIE1HTl9NQ1MyICAgICAgICAgICAgICAgIDB4ODIKKyNkZWZpbmUgTUdOX01DUzMgICAgICAgICAgICAgICAgMHg4MworI2RlZmluZSBNR05fTUNTNCAgICAgICAgICAgICAgICAweDg0CisjZGVmaW5lIE1HTl9NQ1M1ICAgICAgICAgICAgICAgIDB4ODUKKyNkZWZpbmUgTUdOX01DUzYgICAgICAgICAgICAgICAgMHg4NgorI2RlZmluZSBNR05fTUNTNyAgICAgICAgICAgICAgICAweDg3CisjZGVmaW5lIE1HTl9NQ1M4ICAgICAgICAgICAgICAgIDB4ODgKKyNkZWZpbmUgTUdOX01DUzkgICAgICAgICAgICAgICAgMHg4OQorI2RlZmluZSBNR05fTUNTMTAgICAgICAgICAgICAgICAweDhhCisjZGVmaW5lIE1HTl9NQ1MxMSAgICAgICAgICAgICAgIDB4OGIKKyNkZWZpbmUgTUdOX01DUzEyICAgICAgICAgICAgICAgMHg4YworI2RlZmluZSBNR05fTUNTMTMgICAgICAgICAgICAgICAweDhkCisjZGVmaW5lIE1HTl9NQ1MxNCAgICAgICAgICAgICAgIDB4OGUKKyNkZWZpbmUgTUdOX01DUzE1ICAgICAgICAgICAgICAgMHg4ZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCQk4MDIuMTEgTWFuYWdlbWVudCBmcmFtZSBSZWFzb24gQ29kZSBmaWVsZAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlbnVtCV9SZWFzb25Db2RleworCXVuc3BlY19yZWFzb24JPSAweDEsCisJYXV0aF9ub3RfdmFsaWQJPSAweDIsCisJZGVhdXRoX2x2X3NzCT0gMHgzLAorCWluYWN0aXZpdHkJCT0gMHg0LAorCWFwX292ZXJsb2FkIAk9IDB4NSwKKwljbGFzczJfZXJyCQk9IDB4NiwKKwljbGFzczNfZXJyCQk9IDB4NywKKwlkaXNhc19sdl9zcyAJPSAweDgsCisJYXNvY19ub3RfYXV0aAk9IDB4OSwKKworCS8vLS0tLU1JQ19DSEVDSworCW1pY19mYWlsdXJlIAk9IDB4ZSwKKwkvLy0tLS1FTkQgTUlDX0NIRUNLCisKKwkvLyBSZWFzb24gY29kZSBkZWZpbmVkIGluIDgwMi4xMWkgRDEwLjAgcC4yOC4KKwlpbnZhbGlkX0lFCQk9IDB4MGQsCisJZm91cl93YXlfdG1vdXQJPSAweDBmLAorCXR3b193YXlfdG1vdXQJPSAweDEwLAorCUlFX2Rpc21hdGNoIAk9IDB4MTEsCisJaW52YWxpZF9HY2lwaGVyID0gMHgxMiwKKwlpbnZhbGlkX1BjaXBoZXIgPSAweDEzLAorCWludmFsaWRfQUtNUAk9IDB4MTQsCisJdW5zdXBfUlNOSUV2ZXIgPSAweDE1LAorCWludmFsaWRfUlNOSUUJPSAweDE2LAorCWF1dGhfODAyXzF4X2ZhaWw9IDB4MTcsCisJY2lwZXJfcmVqZWN0CQk9IDB4MTgsCisKKwkvLyBSZWFzb24gY29kZSBkZWZpbmVkIGluIDcuMy4xLjcsIDgwMi4xZSBEMTMuMCwgcC40Mi4gQWRkZWQgYnkgQW5uaWUsIDIwMDUtMTEtMTUuCisJUW9TX3Vuc3BlYwkJPSAweDIwLCAvLyAzMgorCVFBUF9iYW5kd2lkdGgJPSAweDIxLCAvLyAzMworCXBvb3JfY29uZGl0aW9uCT0gMHgyMiwgLy8gMzQKKwlub19mYWNpbGl0eSAJPSAweDIzLCAvLyAzNQorCQkJCQkJCS8vIFdoZXJlIGlzIDM2Pz8/CisJcmVxX2RlY2xpbmVkCT0gMHgyNSwgLy8gMzcKKwlpbnZhbGlkX3BhcmFtCT0gMHgyNiwgLy8gMzgKKwlyZXFfbm90X2hvbm9yZWQ9IDB4MjcsCS8vIDM5CisJVFNfbm90X2NyZWF0ZWQJPSAweDJGLCAvLyA0NworCURMX25vdF9hbGxvd2VkCT0gMHgzMCwgLy8gNDgKKwlkZXN0X25vdF9leGlzdAk9IDB4MzEsIC8vIDQ5CisJZGVzdF9ub3RfUVNUQQk9IDB4MzIsIC8vIDUwCit9OworCisKKworI2RlZmluZSBhU2lmc1RpbWUJICgocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX0EpfHwocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fMjRHKXx8KHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9OXzVHKSk/IDE2IDogMTAKKworI2RlZmluZSBNR01UX1FVRVVFX05VTSA1CisKKyNkZWZpbmUgSUVFRV9DTURfU0VUX1dQQV9QQVJBTQkJCTEKKyNkZWZpbmUJSUVFRV9DTURfU0VUX1dQQV9JRQkJCTIKKyNkZWZpbmUgSUVFRV9DTURfU0VUX0VOQ1JZUFRJT04JCQkzCisjZGVmaW5lIElFRUVfQ01EX01MTUUJCQkJNAorCisjZGVmaW5lIElFRUVfUEFSQU1fV1BBX0VOQUJMRUQJCQkxCisjZGVmaW5lIElFRUVfUEFSQU1fVEtJUF9DT1VOVEVSTUVBU1VSRVMJCTIKKyNkZWZpbmUgSUVFRV9QQVJBTV9EUk9QX1VORU5DUllQVEVECQkzCisjZGVmaW5lIElFRUVfUEFSQU1fUFJJVkFDWV9JTlZPS0VECQk0CisjZGVmaW5lIElFRUVfUEFSQU1fQVVUSF9BTEdTCQkJNQorI2RlZmluZSBJRUVFX1BBUkFNX0lFRUVfODAyXzFYCQkJNgorLy9JdCBzaG91bGQgY29uc2lzdGVudCB3aXRoIHRoZSBkcml2ZXJfWFhYLmMKKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1BBUkFNX1dQQVhfU0VMRUNUCQkJNworLy9BZGRlZCBmb3Igbm90aWZ5IHRoZSBlbmNyeXB0aW9uIHR5cGUgc2VsZWN0aW9uCisvLyAgIERhdmlkLCAyMDA2LjkuMjYKKyNkZWZpbmUgSUVFRV9QUk9UT19XUEEJCQkJMQorI2RlZmluZSBJRUVFX1BST1RPX1JTTgkJCQkyCisvL0FkZGVkIGZvciBub3RpZnkgdGhlIGVuY3J5cHRpb24gdHlwZSBzZWxlY3Rpb24KKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1dQQVhfVVNFR1JPVVAJCQkwCisjZGVmaW5lIElFRUVfV1BBWF9XRVA0MAkJCQkxCisjZGVmaW5lIElFRUVfV1BBWF9US0lQCQkJCTIKKyNkZWZpbmUgSUVFRV9XUEFYX1dSQVAgICAJCQkzCisjZGVmaW5lIElFRUVfV1BBWF9DQ01QCQkJCTQKKyNkZWZpbmUgSUVFRV9XUEFYX1dFUDEwNAkJCTUKKworI2RlZmluZSBJRUVFX0tFWV9NR01UX0lFRUU4MDIxWAkJCTEKKyNkZWZpbmUgSUVFRV9LRVlfTUdNVF9QU0sJCQkyCisKKyNkZWZpbmUgSUVFRV9NTE1FX1NUQV9ERUFVVEgJCQkxCisjZGVmaW5lIElFRUVfTUxNRV9TVEFfRElTQVNTT0MJCQkyCisKKworI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9VTktOT1dOX0FMRwkJMgorI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9VTktOT1dOX0FERFIJCTMKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfQ1JZUFRfSU5JVF9GQUlMRUQJNAorI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9LRVlfU0VUX0ZBSUxFRAkJNQorI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9UWF9LRVlfU0VUX0ZBSUxFRAk2CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0NBUkRfQ09ORl9GQUlMRUQJCTcKKworCisjZGVmaW5lCUlFRUVfQ1JZUFRfQUxHX05BTUVfTEVOCQkJMTYKKworI2RlZmluZSBNQVhfSUVfTEVOICAweGZmCisKKy8vIGFkZGVkIGZvciBrZXJuZWwgY29uZmxpY3QKKyNkZWZpbmUgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzIAlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXNfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlciAJaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyX3JzbAorI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQgCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMgIAlpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wc19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcyBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzX3JzbAorI2RlZmluZSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMgCWllZWU4MDIxMV9nZXRfY3J5cHRvX29wc19yc2wKKworI2RlZmluZSBpZWVlODAyMTFfY2NtcF9udWxsCQlpZWVlODAyMTFfY2NtcF9udWxsX3JzbAorCisjZGVmaW5lIGllZWU4MDIxMV90a2lwX251bGwJCWllZWU4MDIxMV90a2lwX251bGxfcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX3dlcF9udWxsCQlpZWVlODAyMTFfd2VwX251bGxfcnNsCisKKyNkZWZpbmUgZnJlZV9pZWVlODAyMTEgICAgICAgICAgCWZyZWVfaWVlZTgwMjExX3JzbAorI2RlZmluZSBhbGxvY19pZWVlODAyMTEgICAgICAgIAkJYWxsb2NfaWVlZTgwMjExX3JzbAorCisjZGVmaW5lIGllZWU4MDIxMV9yeCAJCQlpZWVlODAyMTFfcnhfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9yeF9tZ3QJCWllZWU4MDIxMV9yeF9tZ3RfcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX2dldF9iZWFjb24JCWllZWU4MDIxMV9nZXRfYmVhY29uX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd2FrZV9xdWV1ZQkJaWVlZTgwMjExX3dha2VfcXVldWVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zdG9wX3F1ZXVlCQlpZWVlODAyMTFfc3RvcF9xdWV1ZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3Jlc2V0X3F1ZXVlCQlpZWVlODAyMTFfcmVzZXRfcXVldWVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wJaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2wgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2xfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9pc19zaG9ydHNsb3QJCWllZWU4MDIxMV9pc19zaG9ydHNsb3RfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9pc181NGcJCWllZWU4MDIxMV9pc181NGdfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bAlpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGxfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9wc190eF9hY2sJCWllZWU4MDIxMV9wc190eF9hY2tfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zb2Z0bWFjX3htaXQJCWllZWU4MDIxMV9zb2Z0bWFjX3htaXRfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucwlpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnNfcnNsCisjZGVmaW5lIG5vdGlmeV93eF9hc3NvY19ldmVudAkJbm90aWZ5X3d4X2Fzc29jX2V2ZW50X3JzbAorI2RlZmluZSBTZW5kRGlzYXNzb2NpYXRpb24JCVNlbmREaXNhc3NvY2lhdGlvbl9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZQkJaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucwlpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zX3JzbAorI2RlZmluZSBpZWVlODAyMTFfc3RvcF9zY2FuCQlpZWVlODAyMTFfc3RvcF9zY2FuX3JzbAorI2RlZmluZSBpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cwlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0c19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm8JaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm9fcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybwlpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm9fcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lc3NpZAkJaWVlZTgwMjExX3d4X2dldF9lc3NpZF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9lc3NpZAkJaWVlZTgwMjExX3d4X3NldF9lc3NpZF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9yYXRlCQlpZWVlODAyMTFfd3hfc2V0X3JhdGVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfcmF0ZQkJaWVlZTgwMjExX3d4X2dldF9yYXRlX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3dhcAkJaWVlZTgwMjExX3d4X3NldF93YXBfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfd2FwCQlpZWVlODAyMTFfd3hfZ2V0X3dhcF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9tb2RlCQlpZWVlODAyMTFfd3hfc2V0X21vZGVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfbW9kZQkJaWVlZTgwMjExX3d4X2dldF9tb2RlX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3NjYW4JCWllZWU4MDIxMV93eF9zZXRfc2Nhbl9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9mcmVxCQlpZWVlODAyMTFfd3hfZ2V0X2ZyZXFfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZnJlcQkJaWVlZTgwMjExX3d4X3NldF9mcmVxX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3Jhd3R4CQlpZWVlODAyMTFfd3hfc2V0X3Jhd3R4X3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X25hbWUJCWllZWU4MDIxMV93eF9nZXRfbmFtZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9wb3dlcgkJaWVlZTgwMjExX3d4X3NldF9wb3dlcl9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9wb3dlcgkJaWVlZTgwMjExX3d4X2dldF9wb3dlcl9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXMJaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfcnRzCQlpZWVlODAyMTFfd3hfc2V0X3J0c19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9ydHMJCWllZWU4MDIxMV93eF9nZXRfcnRzX3JzbAorCisjZGVmaW5lIGllZWU4MDIxMV90eGJfZnJlZQkJaWVlZTgwMjExX3R4Yl9mcmVlX3JzbAorCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZ2VuX2llCQlpZWVlODAyMTFfd3hfc2V0X2dlbl9pZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9zY2FuCQlpZWVlODAyMTFfd3hfZ2V0X3NjYW5fcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZW5jb2RlCQlpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lbmNvZGUJCWllZWU4MDIxMV93eF9nZXRfZW5jb2RlX3JzbAorI2lmIFdJUkVMRVNTX0VYVCA+PSAxOAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X21sbWUJCWllZWU4MDIxMV93eF9zZXRfbWxtZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9hdXRoCQlpZWVlODAyMTFfd3hfc2V0X2F1dGhfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZW5jb2RlX2V4dAlpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9leHRfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfZW5jb2RlX2V4dAlpZWVlODAyMTFfd3hfZ2V0X2VuY29kZV9leHRfcnNsCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCBpZWVlX3BhcmFtIHsKKwl1MzIgY21kOworCXU4IHN0YV9hZGRyW0VUSF9BTEVOXTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1OCBuYW1lOworCQkJdTMyIHZhbHVlOworCQl9IHdwYV9wYXJhbTsKKwkJc3RydWN0IHsKKwkJCXUzMiBsZW47CisJCQl1OCByZXNlcnZlZFszMl07CisJCQl1OCBkYXRhWzBdOworCQl9IHdwYV9pZTsKKwkJc3RydWN0eworCQkJaW50IGNvbW1hbmQ7CisJCQlpbnQgcmVhc29uX2NvZGU7CisJCX0gbWxtZTsKKwkJc3RydWN0IHsKKwkJCXU4IGFsZ1tJRUVFX0NSWVBUX0FMR19OQU1FX0xFTl07CisJCQl1OCBzZXRfdHg7CisJCQl1MzIgZXJyOworCQkJdTggaWR4OworCQkJdTggc2VxWzhdOyAvKiBzZXF1ZW5jZSBjb3VudGVyIChzZXQ6IFJYLCBnZXQ6IFRYKSAqLworCQkJdTE2IGtleV9sZW47CisJCQl1OCBrZXlbMF07CisJCX0gY3J5cHQ7CisJfSB1OworfWllZWVfcGFyYW07CisKKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisjZGVmaW5lIElXX1FVQUxfUVVBTF9JTlZBTElEICAgMHgxMAorI2RlZmluZSBJV19RVUFMX0xFVkVMX0lOVkFMSUQgIDB4MjAKKyNkZWZpbmUgSVdfUVVBTF9OT0lTRV9JTlZBTElEICAweDQwCisjZGVmaW5lIElXX1FVQUxfUVVBTF9VUERBVEVEICAgMHgxCisjZGVmaW5lIElXX1FVQUxfTEVWRUxfVVBEQVRFRCAgMHgyCisjZGVmaW5lIElXX1FVQUxfTk9JU0VfVVBEQVRFRCAgMHg0CisjZW5kaWYKKworCisvLyBsaW51eCB1bmRlciAyLjYuOSByZWxlYXNlIG1heSBub3Qgc3VwcG9ydCBpdCwgc28gbW9kaWZ5IGl0IGZvciBjb21tb24gdXNlCisjZGVmaW5lIE1TRUNTKHQpIG1zZWNzX3RvX2ppZmZpZXModCkKKyNkZWZpbmUgbXNsZWVwX2ludGVycnVwdGlibGVfcnNsICBtc2xlZXBfaW50ZXJydXB0aWJsZQorCisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0xFTgkJMjMwNAorLyogTWF4aW11bSBzaXplIGZvciB0aGUgTUEtVU5JVERBVEEgcHJpbWl0aXZlLCA4MDIuMTEgc3RhbmRhcmQgc2VjdGlvbgorICAgNi4yLjEuMS4yLgorCisgICBUaGUgZmlndXJlIGluIHNlY3Rpb24gNy4xLjIgc3VnZ2VzdHMgYSBib2R5IHNpemUgb2YgdXAgdG8gMjMxMgorICAgYnl0ZXMgaXMgYWxsb3dlZCwgd2hpY2ggaXMgYSBiaXQgY29uZnVzaW5nLCBJIHN1c3BlY3QgdGhpcworICAgcmVwcmVzZW50cyB0aGUgMjMwNCBieXRlcyBvZiByZWFsIGRhdGEsIHBsdXMgYSBwb3NzaWJsZSA4IGJ5dGVzIG9mCisgICBXRVAgSVYgYW5kIElDVi4gKHRoaXMgaW50ZXJwcmV0YXRpb24gc3VnZ2VzdGVkIGJ5IFJhbWlybyBCYXJyZWlybykgKi8KKyNkZWZpbmUgSUVFRTgwMjExXzFBRERSX0xFTiAxMAorI2RlZmluZSBJRUVFODAyMTFfMkFERFJfTEVOIDE2CisjZGVmaW5lIElFRUU4MDIxMV8zQUREUl9MRU4gMjQKKyNkZWZpbmUgSUVFRTgwMjExXzRBRERSX0xFTiAzMAorI2RlZmluZSBJRUVFODAyMTFfRkNTX0xFTiAgICA0CisjZGVmaW5lIElFRUU4MDIxMV9ITEVOICAgICAgICAgICAgICAgICAgKElFRUU4MDIxMV80QUREUl9MRU4pCisjZGVmaW5lIElFRUU4MDIxMV9GUkFNRV9MRU4gICAgICAgICAgICAgKElFRUU4MDIxMV9EQVRBX0xFTiArIElFRUU4MDIxMV9ITEVOKQorI2RlZmluZSBJRUVFODAyMTFfTUdNVF9IRFJfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjNfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjRfTEVOIDMwCisKKyNkZWZpbmUgTUlOX0ZSQUdfVEhSRVNIT0xEICAgICAyNTZVCisjZGVmaW5lIE1BWF9GUkFHX1RIUkVTSE9MRCAgICAgMjM0NlUKKworCisvKiBGcmFtZSBjb250cm9sIGZpZWxkIGNvbnN0YW50cyAqLworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9WRVJTCQkweDAwMDMKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRlRZUEUJCTB4MDAwYworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9TVFlQRQkJMHgwMGYwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0ZSQU1FVFlQRQkweDAwZmMKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfVE9EUwkJMHgwMTAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0ZST01EUwkJMHgwMjAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0RTVE9EUwkJMHgwMzAwIC8vYWRkZWQgYnkgZGF2aWQKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTCTB4MDQwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9SRVRSWQkJMHgwODAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1BNCQkweDEwMDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfTU9SRURBVEEJCTB4MjAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9XRVAJCTB4NDAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9PUkRFUgkJMHg4MDAwCisKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX01HTVQJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfQ1RMCQkweDAwMDQKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX0RBVEEJCTB4MDAwOAorCisvKiBtYW5hZ2VtZW50ICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQIAkweDAwMTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVRCTB4MDAyMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQCTB4MDAzMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRCTB4MDA0MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUAkweDAwNTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0JFQUNPTgkJMHgwMDgwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BVElNCQkweDAwOTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DCTB4MDBBMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQVVUSAkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9ERUFVVEgJCTB4MDBDMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfTUFOQUdFX0FDVAkweDAwRDAKKworLyogY29udHJvbCAqLworI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFNQT0xMCQkweDAwQTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JUUwkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DVFMJCTB4MDBDMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQUNLCQkweDAwRDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGRU5ECQkweDAwRTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGRU5EQUNLCTB4MDBGMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQkxPQ0tBQ0sgICAweDAwOTQKKworLyogZGF0YSAqLworI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQQkJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLCTB4MDAxMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRlBPTEwJMHgwMDIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLUE9MTAkweDAwMzAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX05VTExGVU5DCTB4MDA0MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZBQ0sJCTB4MDA1MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZQT0xMCQkweDAwNjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGQUNLUE9MTAkweDAwNzAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBCTB4MDA4MCAvL2FkZGVkIGZvciBXTU0gMjAwNi84LzIKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1FPU19OVUxMCTB4MDBDMAorCisjZGVmaW5lIElFRUU4MDIxMV9TQ1RMX0ZSQUcJCTB4MDAwRgorI2RlZmluZSBJRUVFODAyMTFfU0NUTF9TRVEJCTB4RkZGMAorCisvKiBRT1MgY29udHJvbCAqLworI2RlZmluZSBJRUVFODAyMTFfUUNUTF9USUQgICAgICAgICAgICAgIDB4MDAwRgorCisjZGVmaW5lCUZDX1FPU19CSVQJCQkJCUJJVDcKKyNkZWZpbmUgSXNEYXRhRnJhbWUocGR1KQkJCSggKChwZHVbMF0gJiAweDBDKT09MHgwOCkgPyB0cnVlIDogZmFsc2UgKQorI2RlZmluZQlJc0xlZ2FjeURhdGFGcmFtZShwZHUpCShJc0RhdGFGcmFtZShwZHUpICYmICghKHBkdVswXSZGQ19RT1NfQklUKSkgKQorLy9hZGRlZCBieSB3Yi4gSXMgdGhpcyByaWdodD8KKyNkZWZpbmUgSXNRb1NEYXRhRnJhbWUocGZyYW1lKSAgKCgqKHUxNiopcGZyYW1lJihJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEF8SUVFRTgwMjExX0ZUWVBFX0RBVEEpKSA9PSAoSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBfElFRUU4MDIxMV9GVFlQRV9EQVRBKSkKKyNkZWZpbmUgRnJhbWVfT3JkZXIocGZyYW1lKSAgICAgKCoodTE2KilwZnJhbWUmSUVFRTgwMjExX0ZDVExfT1JERVIpCisjZGVmaW5lIFNOX0xFU1MoYSwgYikJCSgoKGEtYikmMHg4MDApIT0wKQorI2RlZmluZSBTTl9FUVVBTChhLCBiKQkoYSA9PSBiKQorI2RlZmluZSBNQVhfREVWX0FERFJfU0laRSA4Cit0eXBlZGVmIGVudW0gX0FDVF9DQVRFR09SWXsKKwlBQ1RfQ0FUX1FPUyA9IDEsCisJQUNUX0NBVF9ETFMgPSAyLAorCUFDVF9DQVRfQkEgID0gMywKKwlBQ1RfQ0FUX0hUICA9IDcsCisJQUNUX0NBVF9XTU0gPSAxNywKK30gQUNUX0NBVEVHT1JZLCAqUEFDVF9DQVRFR09SWTsKKwordHlwZWRlZiBlbnVtIF9UU19BQ1RJT057CisJQUNUX0FERFRTUkVRID0gMCwKKwlBQ1RfQUREVFNSU1AgPSAxLAorCUFDVF9ERUxUUyAgICA9IDIsCisJQUNUX1NDSEVEVUxFID0gMywKK30gVFNfQUNUSU9OLCAqUFRTX0FDVElPTjsKKwordHlwZWRlZiBlbnVtIF9CQV9BQ1RJT057CisJQUNUX0FEREJBUkVRID0gMCwKKwlBQ1RfQUREQkFSU1AgPSAxLAorCUFDVF9ERUxCQSAgICA9IDIsCit9IEJBX0FDVElPTiwgKlBCQV9BQ1RJT047CisKK3R5cGVkZWYgZW51bSBfSW5pdGlhbEdhaW5PcFR5cGV7CisJSUdfQmFja3VwPTAsCisJSUdfUmVzdG9yZSwKKwlJR19NYXgKK31Jbml0aWFsR2Fpbk9wVHlwZTsKKworLyogZGVidWcgbWFjcm9zICovCisjZGVmaW5lIENPTkZJR19JRUVFODAyMTFfREVCVUcKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCitleHRlcm4gdTMyIGllZWU4MDIxMV9kZWJ1Z19sZXZlbDsKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKK2RvIHsgaWYgKGllZWU4MDIxMV9kZWJ1Z19sZXZlbCAmIChsZXZlbCkpIFwKKyAgcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMTogIiBmbXQsICMjIGFyZ3MpOyB9IHdoaWxlICgwKQorLy93YiBhZGRlZCB0byBkZWJ1ZyBvdXQgZGF0YSBidWYKKy8vaWYgeW91IHdhbnQgcHJpbnQgREFUQSBidWZmZXIgcmVsYXRlZCBCQSwgcGxlYXNlIHNldCBpZWVlODAyMTFfZGVidWdfbGV2ZWwgdG8gREFUQXxCQQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfREFUQShsZXZlbCwgZGF0YSwgZGF0YWxlbikJXAorCWRveyBpZiAoKGllZWU4MDIxMV9kZWJ1Z19sZXZlbCAmIChsZXZlbCkpID09IChsZXZlbCkpCVwKKwkJeyAJXAorCQkJaW50IGk7CQkJCQlcCisJCQl1OCogcGRhdGEgPSAodTgqKSBkYXRhOwkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTE6ICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CVwKKwkJCWZvcihpPTA7IGk8KGludCkoZGF0YWxlbik7IGkrKykJCQlcCisJCQl7CQkJCQkJXAorCQkJCXByaW50aygiJTJ4ICIsIHBkYXRhW2ldKTsJCVwKKwkJCQlpZiAoKGkrMSklMTYgPT0gMCkgcHJpbnRrKCJcbiIpOwlcCisJCQl9CQkJCVwKKwkJCXByaW50aygiXG4iKTsJCQlcCisJCX0JCQkJCVwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfREFUQShsZXZlbCwgZGF0YSwgZGF0YWxlbikgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgkvKiBDT05GSUdfSUVFRTgwMjExX0RFQlVHICovCisKKy8qIGRlYnVnIG1hY3JvcyBub3QgZGVwZW5kZW50IG9uIENPTkZJR19JRUVFODAyMTFfREVCVUcgKi8KKworI2RlZmluZSBNQUNfRk1UICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIKKyNkZWZpbmUgTUFDX0FSRyh4KSAoKHU4KikoeCkpWzBdLCgodTgqKSh4KSlbMV0sKCh1OCopKHgpKVsyXSwoKHU4KikoeCkpWzNdLCgodTgqKSh4KSlbNF0sKCh1OCopKHgpKVs1XQorCisvKgorICogVG8gdXNlIHRoZSBkZWJ1ZyBzeXN0ZW07CisgKgorICogSWYgeW91IGFyZSBkZWZpbmluZyBhIG5ldyBkZWJ1ZyBjbGFzc2lmaWNhdGlvbiwgc2ltcGx5IGFkZCBpdCB0byB0aGUgI2RlZmluZQorICogbGlzdCBoZXJlIGluIHRoZSBmb3JtIG9mOgorICoKKyAqICNkZWZpbmUgSUVFRTgwMjExX0RMX3h4eHggVkFMVUUKKyAqCisgKiBzaGlmdGluZyB2YWx1ZSB0byB0aGUgbGVmdCBvbmUgYml0IGZyb20gdGhlIHByZXZpb3VzIGVudHJ5LiAgeHh4eCBzaG91bGQgYmUKKyAqIHRoZSBuYW1lIG9mIHRoZSBjbGFzc2lmaWNhdGlvbiAoZm9yIGV4YW1wbGUsIFdFUCkKKyAqCisgKiBZb3UgdGhlbiBuZWVkIHRvIGVpdGhlciBhZGQgYSBJRUVFODAyMTFfeHh4eF9ERUJVRygpIG1hY3JvIGRlZmluaXRpb24gZm9yIHlvdXIKKyAqIGNsYXNzaWZpY2F0aW9uLCBvciB1c2UgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF94eHh4LCAuLi4pIHdoZW5ldmVyIHlvdSB3YW50CisgKiB0byBzZW5kIG91dHB1dCB0byB0aGF0IGNsYXNzaWZpY2F0aW9uLgorICoKKyAqIFRvIGFkZCB5b3VyIGRlYnVnIGxldmVsIHRvIHRoZSBsaXN0IG9mIGxldmVscyBzZWVuIHdoZW4geW91IHBlcmZvcm0KKyAqCisgKiAlIGNhdCAvcHJvYy9uZXQvaXB3L2RlYnVnX2xldmVsCisgKgorICogeW91IHNpbXBseSBuZWVkIHRvIGFkZCB5b3VyIGVudHJ5IHRvIHRoZSBpcHdfZGVidWdfbGV2ZWxzIGFycmF5LgorICoKKyAqIElmIHlvdSBkbyBub3Qgc2VlIGRlYnVnX2xldmVsIGluIC9wcm9jL25ldC9pcHcgdGhlbiB5b3UgZG8gbm90IGhhdmUKKyAqIENPTkZJR19JRUVFODAyMTFfREVCVUcgZGVmaW5lZCBpbiB5b3VyIGtlcm5lbCBjb25maWd1cmF0aW9uCisgKgorICovCisKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0lORk8gICAgICAgICAgKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9ETF9XWCAgICAgICAgICAgICgxPDwxKQorI2RlZmluZSBJRUVFODAyMTFfRExfU0NBTiAgICAgICAgICAoMTw8MikKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1NUQVRFICAgICAgICAgKDE8PDMpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9NR01UICAgICAgICAgICgxPDw0KQorI2RlZmluZSBJRUVFODAyMTFfRExfRlJBRyAgICAgICAgICAoMTw8NSkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0VBUCAgICAgICAgICAgKDE8PDYpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9EUk9QICAgICAgICAgICgxPDw3KQorCisjZGVmaW5lIElFRUU4MDIxMV9ETF9UWCAgICAgICAgICAgICgxPDw4KQorI2RlZmluZSBJRUVFODAyMTFfRExfUlggICAgICAgICAgICAoMTw8OSkKKworI2RlZmluZSBJRUVFODAyMTFfRExfSFQJCSAgICgxPDwxMCkgIC8vSFQKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0JBCQkgICAoMTw8MTEpICAvL2JhCisjZGVmaW5lIElFRUU4MDIxMV9ETF9UUwkJICAgKDE8PDEyKSAgLy9UUworI2RlZmluZSBJRUVFODAyMTFfRExfUU9TICAgICAgICAgICAoMTw8MTMpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9SRU9SREVSCSAgICgxPDwxNCkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0lPVAkgICAoMTw8MTUpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9JUFMJICAgKDE8PDE2KQorI2RlZmluZSBJRUVFODAyMTFfRExfVFJBQ0UJICAgKDE8PDI5KSAgLy90cmFjZSBmdW5jdGlvbiwgbmVlZCB0byB1c2VyIG5ldF9yYXRlbGltaXQoKSB0b2dldGhlciBpbiBvcmRlciBub3QgdG8gcHJpbnQgdG9vIG11Y2ggdG8gdGhlIHNjcmVlbgorI2RlZmluZSBJRUVFODAyMTFfRExfREFUQQkgICAoMTw8MzApICAgLy91c2UgdGhpcyBmbGFnIHRvIGNvbnRyb2wgd2hldGhlciBwcmludCBkYXRhIGJ1ZiBvdXQuCisjZGVmaW5lIElFRUU4MDIxMV9ETF9FUlIJICAgKDE8PDMxKSAgIC8vYWx3YXlzIG9wZW4KKyNkZWZpbmUgSUVFRTgwMjExX0VSUk9SKGYsIGEuLi4pIHByaW50ayhLRVJOX0VSUiAiaWVlZTgwMjExOiAiIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9XQVJOSU5HKGYsIGEuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgImllZWU4MDIxMTogIiBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfSU5GTyhmLCBhLi4uKSAgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSU5GTywgZiwgIyMgYSkKKworI2RlZmluZSBJRUVFODAyMTFfREVCVUdfV1goZiwgYS4uLikgICAgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfV1gsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19TQ0FOKGYsIGEuLi4pICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9TQ0FOLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfU1RBVEUoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfU1RBVEUsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19NR01UKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX01HTVQsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19GUkFHKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0ZSQUcsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19FQVAoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRUFQLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfRFJPUChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9EUk9QLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfVFgoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFgsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19SWChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SWCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1FPUyhmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9RT1MsIGYsICMjIGEpCisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisvKiBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMS0yMi4gKi8KKyNkZWZpbmUgTUFYX1NUUl9MRU4gICAgIDY0CisvKiBJIHdhbnQgdG8gc2VlIEFTQ0lJIDMzIHRvIDEyNiBvbmx5LiBPdGhlcndpc2UsIEkgcHJpbnQgJz8nLiBBbm5pZSwgMjAwNS0xMS0yMi4qLworI2RlZmluZSBQUklOVEFCTEUoX2NoKSAgKF9jaD4nIScgJiYgX2NoPCd+JykKKyNkZWZpbmUgSUVFRTgwMjExX1BSSU5UX1NUUihfQ29tcCwgX1RpdGxlU3RyaW5nLCBfUHRyLCBfTGVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCQkJaWYoKF9Db21wKSAmIGxldmVsKSAgIAkJCQkJCQlcCisJCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJaW50ICAgICAgICAgICAgIF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQl1OCAgYnVmZmVyW01BWF9TVFJfTEVOXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCQkJCWludCBsZW5ndGggPSAoX0xlbjxNQVhfU1RSX0xFTik/IF9MZW4gOiAoTUFYX1NUUl9MRU4tMSkgOyAgCVwKKwkJCQltZW1zZXQoYnVmZmVyLCAwLCBNQVhfU1RSX0xFTik7ICAgICAgICAgICAgICAgICAgICAgIAkJXAorCQkJCW1lbWNweShidWZmZXIsICh1OCAqKV9QdHIsIGxlbmd0aCApOyAgICAgICAgICAgIAkJXAorCQkJCWZvciggX19pPTA7IF9faTxNQVhfU1RSX0xFTjsgX19pKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgIGlmKCAhUFJJTlRBQkxFKGJ1ZmZlcltfX2ldKSApICAgYnVmZmVyW19faV0gPSAnPyc7ICAgICAJXAorCQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJYnVmZmVyW2xlbmd0aF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQlwcmludGsoIlJ0bDgxOXg6ICIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkJCQlwcmludGsoX1RpdGxlU3RyaW5nKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQlwcmludGsoIjogJWQsIDwlcz5cbiIsIF9MZW4sIGJ1ZmZlcik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCX0KKyNlbHNlCisjZGVmaW5lIElFRUU4MDIxMV9QUklOVF9TVFIoX0NvbXAsIF9UaXRsZVN0cmluZywgX1B0ciwgX0xlbikgIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4gLyogQVJQSFJEX0VUSEVSICovCisKKyNpZm5kZWYgV0lSRUxFU1NfU1BZCisjZGVmaW5lIFdJUkVMRVNTX1NQWQkJLy8gZW5hYmxlIGl3c3B5IHN1cHBvcnQKKyNlbmRpZgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CS8vIG5ldyBkcml2ZXIgQVBJCisKKyNpZm5kZWYgRVRIX1BfUEFFCisjZGVmaW5lIEVUSF9QX1BBRSAweDg4OEUgLyogUG9ydCBBY2Nlc3MgRW50aXR5IChJRUVFIDgwMi4xWCkgKi8KKyNlbmRpZiAvKiBFVEhfUF9QQUUgKi8KKworI2RlZmluZSBFVEhfUF9QUkVBVVRIIDB4ODhDNyAvKiBJRUVFIDgwMi4xMWkgcHJlLWF1dGhlbnRpY2F0aW9uICovCisKKyNpZm5kZWYgRVRIX1BfODAyMTFfUkFXCisjZGVmaW5lIEVUSF9QXzgwMjExX1JBVyAoRVRIX1BfRUNPTkVUICsgMSkKKyNlbmRpZgorCisvKiBJRUVFIDgwMi4xMSBkZWZpbmVzICovCisKKyNkZWZpbmUgUDgwMjExX09VSV9MRU4gMworCitzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyIHsKKworCXU4ICAgIGRzYXA7ICAgLyogYWx3YXlzIDB4QUEgKi8KKwl1OCAgICBzc2FwOyAgIC8qIGFsd2F5cyAweEFBICovCisJdTggICAgY3RybDsgICAvKiBhbHdheXMgMHgwMyAqLworCXU4ICAgIG91aVtQODAyMTFfT1VJX0xFTl07ICAgIC8qIG9yZ2FuaXphdGlvbmFsIHVuaXZlcnNhbCBpZCAqLworCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBTTkFQX1NJWkUgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIpCisKKyNkZWZpbmUgV0xBTl9GQ19HRVRfVkVSUyhmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9WRVJTKQorI2RlZmluZSBXTEFOX0ZDX0dFVF9UWVBFKGZjKSAoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKQorI2RlZmluZSBXTEFOX0ZDX0dFVF9TVFlQRShmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkKKworI2RlZmluZSBXTEFOX0ZDX0dFVF9GUkFNRVRZUEUoZmMpICgoZmMpICYgSUVFRTgwMjExX0ZDVExfRlJBTUVUWVBFKQorI2RlZmluZSBXTEFOX0dFVF9TRVFfRlJBRyhzZXEpICgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX0ZSQUcpCisjZGVmaW5lIFdMQU5fR0VUX1NFUV9TRVEoc2VxKSAgKCgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKKworLyogQXV0aGVudGljYXRpb24gYWxnb3JpdGhtcyAqLworI2RlZmluZSBXTEFOX0FVVEhfT1BFTiAwCisjZGVmaW5lIFdMQU5fQVVUSF9TSEFSRURfS0VZIDEKKyNkZWZpbmUgV0xBTl9BVVRIX0xFQVAgMgorCisjZGVmaW5lIFdMQU5fQVVUSF9DSEFMTEVOR0VfTEVOIDEyOAorCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9CU1MgKDE8PDApCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9JQlNTICgxPDwxKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0ZfUE9MTEFCTEUgKDE8PDIpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DRl9QT0xMX1JFUVVFU1QgKDE8PDMpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZICgxPDw0KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUgKDE8PDUpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9QQkNDICgxPDw2KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0hBTk5FTF9BR0lMSVRZICgxPDw3KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU1BFQ1RSVU1fTUdNVCAoMTw8OCkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1FPUyAoMTw8OSkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QgKDE8PDEwKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfRFNTU19PRkRNICgxPDwxMykKKworLyogODAyLjExZyBFUlAgaW5mb3JtYXRpb24gZWxlbWVudCAqLworI2RlZmluZSBXTEFOX0VSUF9OT05fRVJQX1BSRVNFTlQgKDE8PDApCisjZGVmaW5lIFdMQU5fRVJQX1VTRV9QUk9URUNUSU9OICgxPDwxKQorI2RlZmluZSBXTEFOX0VSUF9CQVJLRVJfUFJFQU1CTEUgKDE8PDIpCisKKy8qIFN0YXR1cyBjb2RlcyAqLworZW51bSBpZWVlODAyMTFfc3RhdHVzY29kZSB7CisJV0xBTl9TVEFUVVNfU1VDQ0VTUyA9IDAsCisJV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRSA9IDEsCisJV0xBTl9TVEFUVVNfQ0FQU19VTlNVUFBPUlRFRCA9IDEwLAorCVdMQU5fU1RBVFVTX1JFQVNTT0NfTk9fQVNTT0MgPSAxMSwKKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfVU5TUEVDID0gMTIsCisJV0xBTl9TVEFUVVNfTk9UX1NVUFBPUlRFRF9BVVRIX0FMRyA9IDEzLAorCVdMQU5fU1RBVFVTX1VOS05PV05fQVVUSF9UUkFOU0FDVElPTiA9IDE0LAorCVdMQU5fU1RBVFVTX0NIQUxMRU5HRV9GQUlMID0gMTUsCisJV0xBTl9TVEFUVVNfQVVUSF9USU1FT1VUID0gMTYsCisJV0xBTl9TVEFUVVNfQVBfVU5BQkxFX1RPX0hBTkRMRV9ORVdfU1RBID0gMTcsCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1JBVEVTID0gMTgsCisJLyogODAyLjExYiAqLworCVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1NIT1JUUFJFQU1CTEUgPSAxOSwKKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9QQkNDID0gMjAsCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PQUdJTElUWSA9IDIxLAorCS8qIDgwMi4xMWggKi8KKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9TUEVDVFJVTSA9IDIyLAorCVdMQU5fU1RBVFVTX0FTU09DX1JFSkVDVEVEX0JBRF9QT1dFUiA9IDIzLAorCVdMQU5fU1RBVFVTX0FTU09DX1JFSkVDVEVEX0JBRF9TVVBQX0NIQU4gPSAyNCwKKwkvKiA4MDIuMTFnICovCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PU0hPUlRUSU1FID0gMjUsCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PRFNTU09GRE0gPSAyNiwKKwkvKiA4MDIuMTFpICovCisJV0xBTl9TVEFUVVNfSU5WQUxJRF9JRSA9IDQwLAorCVdMQU5fU1RBVFVTX0lOVkFMSURfR1JPVVBfQ0lQSEVSID0gNDEsCisJV0xBTl9TVEFUVVNfSU5WQUxJRF9QQUlSV0lTRV9DSVBIRVIgPSA0MiwKKwlXTEFOX1NUQVRVU19JTlZBTElEX0FLTVAgPSA0MywKKwlXTEFOX1NUQVRVU19VTlNVUFBfUlNOX1ZFUlNJT04gPSA0NCwKKwlXTEFOX1NUQVRVU19JTlZBTElEX1JTTl9JRV9DQVAgPSA0NSwKKwlXTEFOX1NUQVRVU19DSVBIRVJfU1VJVEVfUkVKRUNURUQgPSA0NiwKK307CisKKy8qIFJlYXNvbiBjb2RlcyAqLworZW51bSBpZWVlODAyMTFfcmVhc29uY29kZSB7CisJV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQgPSAxLAorCVdMQU5fUkVBU09OX1BSRVZfQVVUSF9OT1RfVkFMSUQgPSAyLAorCVdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HID0gMywKKwlXTEFOX1JFQVNPTl9ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWSA9IDQsCisJV0xBTl9SRUFTT05fRElTQVNTT0NfQVBfQlVTWSA9IDUsCisJV0xBTl9SRUFTT05fQ0xBU1MyX0ZSQU1FX0ZST01fTk9OQVVUSF9TVEEgPSA2LAorCVdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSA9IDcsCisJV0xBTl9SRUFTT05fRElTQVNTT0NfU1RBX0hBU19MRUZUID0gOCwKKwlXTEFOX1JFQVNPTl9TVEFfUkVRX0FTU09DX1dJVEhPVVRfQVVUSCA9IDksCisJLyogODAyLjExaCAqLworCVdMQU5fUkVBU09OX0RJU0FTU09DX0JBRF9QT1dFUiA9IDEwLAorCVdMQU5fUkVBU09OX0RJU0FTU09DX0JBRF9TVVBQX0NIQU4gPSAxMSwKKwkvKiA4MDIuMTFpICovCisJV0xBTl9SRUFTT05fSU5WQUxJRF9JRSA9IDEzLAorCVdMQU5fUkVBU09OX01JQ19GQUlMVVJFID0gMTQsCisJV0xBTl9SRUFTT05fNFdBWV9IQU5EU0hBS0VfVElNRU9VVCA9IDE1LAorCVdMQU5fUkVBU09OX0dST1VQX0tFWV9IQU5EU0hBS0VfVElNRU9VVCA9IDE2LAorCVdMQU5fUkVBU09OX0lFX0RJRkZFUkVOVCA9IDE3LAorCVdMQU5fUkVBU09OX0lOVkFMSURfR1JPVVBfQ0lQSEVSID0gMTgsCisJV0xBTl9SRUFTT05fSU5WQUxJRF9QQUlSV0lTRV9DSVBIRVIgPSAxOSwKKwlXTEFOX1JFQVNPTl9JTlZBTElEX0FLTVAgPSAyMCwKKwlXTEFOX1JFQVNPTl9VTlNVUFBfUlNOX1ZFUlNJT04gPSAyMSwKKwlXTEFOX1JFQVNPTl9JTlZBTElEX1JTTl9JRV9DQVAgPSAyMiwKKwlXTEFOX1JFQVNPTl9JRUVFODAyMVhfRkFJTEVEID0gMjMsCisJV0xBTl9SRUFTT05fQ0lQSEVSX1NVSVRFX1JFSkVDVEVEID0gMjQsCit9OworCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19TSUdOQUwgKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SU1NJICgxPDwxKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfTk9JU0UgKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SQVRFICgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfV0VNQVNLIDB4NworCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTiAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTiAgICgxPDwxKQorCisjZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9CQU5EICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExXzUyR0haX0JBTkQgICAgICgxPDwxKQorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV9MRU4gIAkJNAorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1CCQkJMHgwMgorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1CCQkJMHgwNAorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfNU1CCQkJMHgwQgorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQgkJCTB4MTYKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV9MRU4gCQk4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CCQkJMHgwQworI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQgkJCTB4MTIKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CCQkweDE4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQgkJMHgyNAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUIJCTB4MzAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CCQkweDQ4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQgkJMHg2MAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUIJCTB4NkMKKyNkZWZpbmUgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSwkJMHg4MAorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSwkJKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSwkJKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSwkJKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CX01BU0sJCSgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLCQkoMTw8NCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSwkJKDE8PDUpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLCQkoMTw8NikKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sJCSgxPDw3KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSwkJKDE8PDgpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLCQkoMTw8OSkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sJCSgxPDwxMCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0sJCSgxPDwxMSkKKworI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVTX01BU0sJCTB4MDAwMDAwMEYKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19CQVNJQ19SQVRFU19NQVNLCShJRUVFODAyMTFfQ0NLX1JBVEVfMU1CX01BU0sgfCBcCisJSUVFRTgwMjExX0NDS19SQVRFXzJNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfQ0NLX0RFRkFVTFRfUkFURVNfTUFTSwkoSUVFRTgwMjExX0NDS19CQVNJQ19SQVRFU19NQVNLIHwgXAorCUlFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQl9NQVNLKQorCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVTX01BU0sJCTB4MDAwMDBGRjAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSykKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fREVGQVVMVF9SQVRFU19NQVNLCShJRUVFODAyMTFfT0ZETV9CQVNJQ19SQVRFU19NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0sgIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMThNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9SQVRFU19NQVNLIChJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sgfCBcCisJCQkJSUVFRTgwMjExX0NDS19ERUZBVUxUX1JBVEVTX01BU0spCisKKyNkZWZpbmUgSUVFRTgwMjExX05VTV9PRkRNX1JBVEVTCSAgICA4CisjZGVmaW5lIElFRUU4MDIxMV9OVU1fQ0NLX1JBVEVTCQkgICAgNAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9TSElGVF9NQVNLX0EgICAgICAgICA0CisKKworLyogdGhpcyBpcyBzdG9sZW4gYW5kIG1vZGlmaWVkIGZyb20gdGhlIG1hZHdpZmkgZHJpdmVyKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9UWVBFX01BU0sJCTB4MGMKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9UWVBFX0RBVEEJCTB4MDgKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0sJMHhCMAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TCTB4ODAKKworI2RlZmluZSBJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpIFwKKwkoKChmYykgJiAoSUVFRTgwMjExX0ZDMF9UWVBFX01BU0sgfCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSykpID09IFwKKwkgKElFRUU4MDIxMV9GQzBfVFlQRV9EQVRBIHwgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPUykpCisKKy8qIHRoaXMgaXMgc3RvbGVuIGZyb20gaXB3MjIwMCBkcml2ZXIgKi8KKyNkZWZpbmUgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkUgMzEKK3N0cnVjdCBpZWVlX2lic3Nfc2VxIHsKKwl1OCBtYWNbRVRIX0FMRU5dOworCXUxNiBzZXFfbnVtWzE3XTsKKwl1MTYgZnJhZ19udW1bMTddOworCXVuc2lnbmVkIGxvbmcgcGFja2V0X3RpbWVbMTddOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKy8qIE5PVEU6IFRoaXMgZGF0YSBpcyBmb3Igc3RhdGlzdGljYWwgcHVycG9zZXM7IG5vdCBhbGwgaGFyZHdhcmUgcHJvdmlkZXMgdGhpcworICogICAgICAgaW5mb3JtYXRpb24gZm9yIGZyYW1lcyByZWNlaXZlZC4gIE5vdCBzZXR0aW5nIHRoZXNlIHdpbGwgbm90IGNhdXNlCisgKiAgICAgICBhbnkgYWR2ZXJzZSBhZmZlY3RzLiAqLworc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyB7CisJdTMyIG1hY190aW1lWzJdOworCXM4IHJzc2k7CisJdTggc2lnbmFsOworCXU4IG5vaXNlOworCXUxNiByYXRlOyAvKiBpbiAxMDAga2JwcyAqLworCXU4IHJlY2VpdmVkX2NoYW5uZWw7CisJdTggY29udHJvbDsKKwl1OCBtYXNrOworCXU4IGZyZXE7CisJdTE2IGxlbjsKKwl1NjQgdHNmOworCXUzMiBiZWFjb25fdGltZTsKKwl1OCBuaWNfdHlwZTsKKwl1MTYgICAgICAgTGVuZ3RoOworCS8vICAgICAgdTggICAgICAgIERhdGFSYXRlOyAgICAgIC8vIEluIDAuNSBNYnBzCisJdTggICAgICAgIFNpZ25hbFF1YWxpdHk7IC8vIGluIDAtMTAwIGluZGV4LgorCXMzMiAgICAgICBSZWN2U2lnbmFsUG93ZXI7IC8vIFJlYWwgcG93ZXIgaW4gZEJtIGZvciB0aGlzIHBhY2tldCwgbm8gYmVhdXRpZmljYXRpb24gYW5kIGFnZ3JlZ2F0aW9uLgorCXM4ICAgICAgICBSeFBvd2VyOyAvLyBpbiBkQm0gVHJhbnNsYXRlIGZyb20gUFdkQgorCXU4ICAgICAgICBTaWduYWxTdHJlbmd0aDsgLy8gaW4gMC0xMDAgaW5kZXguCisJdTE2ICAgICAgIGJId0Vycm9yOjE7CisJdTE2ICAgICAgIGJDUkM6MTsKKwl1MTYgICAgICAgYklDVjoxOworCXUxNiAgICAgICBiU2hvcnRQcmVhbWJsZToxOworCXUxNiAgICAgICBBbnRlbm5hOjE7ICAgICAgLy9mb3IgcnRsODE4NQorCXUxNiAgICAgICBEZWNyeXB0ZWQ6MTsgICAgLy9mb3IgcnRsODE4NSwgcnRsODE4NworCXUxNiAgICAgICBXYWtldXA6MTsgICAgICAgLy9mb3IgcnRsODE4NQorCXUxNiAgICAgICBSZXNlcnZlZDA6MTsgICAgLy9mb3IgcnRsODE4NQorCXU4ICAgICAgICBBR0M7CisJdTMyICAgICAgIFRpbWVTdGFtcExvdzsKKwl1MzIgICAgICAgVGltZVN0YW1wSGlnaDsKKwlib29sICAgICAgYlNoaWZ0OworCWJvb2wgICAgICBiSXNRb3NEYXRhOyAgICAgICAgICAgICAvLyBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMi0yMi4KKwl1OCAgICAgICAgVXNlclByaW9yaXR5OworCisJLy8xISEhISEhISEhISEhISEhISEhISEhISEhISEhCisJLy8xQXR0ZW50aW9uIFBsZWFzZSEhITwxMW4gb3IgODE5MCBzcGVjaWZpYyBjb2RlIHNob3VsZCBiZSBwdXQgYmVsb3cgdGhpcyBsaW5lPgorCS8vMSEhISEhISEhISEhISEhISEhISEhISEhISEhIQorCisJdTggICAgICAgIFJ4RHJ2SW5mb1NpemU7CisJdTggICAgICAgIFJ4QnVmU2hpZnQ7CisJYm9vbCAgICAgIGJJc0FNUERVOworCWJvb2wgICAgICBiRmlyc3RNUERVOworCWJvb2wgICAgICBiQ29udGFpbkhUQzsKKwlib29sICAgICAgUnhJczQwTUh6UGFja2V0OworCXUzMiAgICAgICBSeFBXREJBbGw7CisJdTggICAgICAgIFJ4TUlNT1NpZ25hbFN0cmVuZ3RoWzRdOyAgICAgICAgLy8gaW4gMH4xMDAgaW5kZXgKKwlzOCAgICAgICAgUnhNSU1PU2lnbmFsUXVhbGl0eVsyXTsKKwlib29sICAgICAgYlBhY2tldE1hdGNoQlNTSUQ7CisJYm9vbCAgICAgIGJJc0NDSzsKKwlib29sICAgICAgYlBhY2tldFRvU2VsZjsKKwkvL2FkZGVkIGJ5IGFteQorCXU4KiAgICAgICB2aXJ0dWFsX2FkZHJlc3M7CisJdTE2ICAgICAgICAgIHBhY2tldGxlbmd0aDsgICAgICAgICAgICAgIC8vIFRvdGFsIHBhY2tldCBsZW5ndGg6IE11c3QgZXF1YWwgdG8gc3VtIG9mIGFsbCBGcmFnTGVuZ3RoCisJdTE2ICAgICAgICAgIGZyYWdsZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnJhZ0xlbmd0aCBzaG91bGQgZXF1YWwgdG8gUGFja2V0TGVuZ3RoIGluIG5vbi1mcmFnbWVudCBjYXNlCisJdTE2ICAgICAgICAgIGZyYWdvZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YSBvZmZzZXQgZm9yIHRoaXMgZnJhZ21lbnQKKwl1MTYgICAgICAgICAgbnRvdGFsZnJhZzsKKwlib29sICAgICAgCSAgYmlzcnhhZ2dyc3ViZnJhbWU7CisJYm9vbAkJICBiUGFja2V0QmVhY29uOwkvL2Nvc2EgYWRkIGZvciByc3NpCisJYm9vbAkJICBiVG9TZWxmQkE7CQkvL2Nvc2EgYWRkIGZvciByc3NpCisJY2hhciAJICBjY2tfYWRjX3B3ZGJbNF07CS8vY29zYSBhZGQgZm9yIHJ4IHBhdGggc2VsZWN0aW9uCisJdTE2CQkgIFNlcV9OdW07CisKK307CisKKy8qIElFRUUgODAyLjExIHJlcXVpcmVzIHRoYXQgU1RBIHN1cHBvcnRzIGNvbmN1cnJlbnQgcmVjZXB0aW9uIG9mIGF0IGxlYXN0CisgKiB0aHJlZSBmcmFnbWVudGVkIGZyYW1lcy4gVGhpcyBkZWZpbmUgY2FuIGJlIGluY3JlYXNlZCB0byBzdXBwb3J0IG1vcmUKKyAqIGNvbmN1cnJlbnQgZnJhbWVzLCBidXQgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgZWFjaCBlbnRyeSBjYW4gY29uc3VtZSBhYm91dAorICogMiBrQiBvZiBSQU0gYW5kIGluY3JlYXNpbmcgY2FjaGUgc2l6ZSB3aWxsIHNsb3cgZG93biBmcmFtZSByZWFzc2VtYmx5LiAqLworI2RlZmluZSBJRUVFODAyMTFfRlJBR19DQUNIRV9MRU4gNAorCitzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgeworCXVuc2lnbmVkIGxvbmcgZmlyc3RfZnJhZ190aW1lOworCXVuc2lnbmVkIGludCBzZXE7CisJdW5zaWduZWQgaW50IGxhc3RfZnJhZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU4IHNyY19hZGRyW0VUSF9BTEVOXTsKKwl1OCBkc3RfYWRkcltFVEhfQUxFTl07Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3N0YXRzIHsKKwl1bnNpZ25lZCBpbnQgdHhfdW5pY2FzdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X211bHRpY2FzdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X2ZyYWdtZW50czsKKwl1bnNpZ25lZCBpbnQgdHhfdW5pY2FzdF9vY3RldHM7CisJdW5zaWduZWQgaW50IHR4X211bHRpY2FzdF9vY3RldHM7CisJdW5zaWduZWQgaW50IHR4X2RlZmVycmVkX3RyYW5zbWlzc2lvbnM7CisJdW5zaWduZWQgaW50IHR4X3NpbmdsZV9yZXRyeV9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X211bHRpcGxlX3JldHJ5X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfcmV0cnlfbGltaXRfZXhjZWVkZWQ7CisJdW5zaWduZWQgaW50IHR4X2Rpc2NhcmRzOworCXVuc2lnbmVkIGludCByeF91bmljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgcnhfbXVsdGljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgcnhfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCByeF91bmljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgcnhfbXVsdGljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgcnhfZmNzX2Vycm9yczsKKwl1bnNpZ25lZCBpbnQgcnhfZGlzY2FyZHNfbm9fYnVmZmVyOworCXVuc2lnbmVkIGludCB0eF9kaXNjYXJkc193cm9uZ19zYTsKKwl1bnNpZ25lZCBpbnQgcnhfZGlzY2FyZHNfdW5kZWNyeXB0YWJsZTsKKwl1bnNpZ25lZCBpbnQgcnhfbWVzc2FnZV9pbl9tc2dfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCByeF9tZXNzYWdlX2luX2JhZF9tc2dfZnJhZ21lbnRzOworfTsKKworc3RydWN0IGllZWU4MDIxMV9kZXZpY2U7CisKKyNpbmNsdWRlICJpZWVlODAyMTFfY3J5cHQuaCIKKworI2RlZmluZSBTRUNfS0VZXzEgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgU0VDX0tFWV8yICAgICAgICAgKDE8PDEpCisjZGVmaW5lIFNFQ19LRVlfMyAgICAgICAgICgxPDwyKQorI2RlZmluZSBTRUNfS0VZXzQgICAgICAgICAoMTw8MykKKyNkZWZpbmUgU0VDX0FDVElWRV9LRVkgICAgKDE8PDQpCisjZGVmaW5lIFNFQ19BVVRIX01PREUgICAgICgxPDw1KQorI2RlZmluZSBTRUNfVU5JQ0FTVF9HUk9VUCAoMTw8NikKKyNkZWZpbmUgU0VDX0xFVkVMICAgICAgICAgKDE8PDcpCisjZGVmaW5lIFNFQ19FTkFCTEVEICAgICAgICgxPDw4KQorI2RlZmluZSBTRUNfRU5DUllQVCAgICAgICAoMTw8OSkKKworI2RlZmluZSBTRUNfTEVWRUxfMCAgICAgIDAgLyogTm9uZSAqLworI2RlZmluZSBTRUNfTEVWRUxfMSAgICAgIDEgLyogV0VQIDQwIGFuZCAxMDQgYml0ICovCisjZGVmaW5lIFNFQ19MRVZFTF8yICAgICAgMiAvKiBMZXZlbCAxICsgVEtJUCAqLworI2RlZmluZSBTRUNfTEVWRUxfMl9DS0lQIDMgLyogTGV2ZWwgMSArIENLSVAgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzMgICAgICA0IC8qIExldmVsIDIgKyBDQ01QICovCisKKyNkZWZpbmUgU0VDX0FMR19OT05FICAgICAgICAgICAgMAorI2RlZmluZSBTRUNfQUxHX1dFUCAgICAgICAgICAgICAxCisjZGVmaW5lIFNFQ19BTEdfVEtJUCAgICAgICAgICAgIDIKKyNkZWZpbmUgU0VDX0FMR19DQ01QICAgICAgICAgICAgMworCisjZGVmaW5lIFdFUF9LRVlTIAkJNAorI2RlZmluZSBXRVBfS0VZX0xFTgkJMTMKKyNkZWZpbmUgU0NNX0tFWV9MRU4gICAgICAgICAgICAgMzIKKyNkZWZpbmUgU0NNX1RFTVBPUkFMX0tFWV9MRU5HVEggMTYKKworc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSB7CisJdTE2IGFjdGl2ZV9rZXk6MiwKKwkgICAgZW5hYmxlZDoxLAorCSAgICBhdXRoX21vZGU6MiwKKwkgICAgYXV0aF9hbGdvOjQsCisJICAgIHVuaWNhc3RfdXNlc19ncm91cDoxLAorCSAgICBlbmNyeXB0OjE7CisJdTgga2V5X3NpemVzW1dFUF9LRVlTXTsKKwl1OCBrZXlzW1dFUF9LRVlTXVtTQ01fS0VZX0xFTl07CisJdTggbGV2ZWw7CisJdTE2IGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyoKKyA4MDIuMTEgZGF0YSBmcmFtZSBmcm9tIEFQCisgICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgIDIgICB8ICAyICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgMiAgIHwgMC4uMjMxMiB8ICAgNCAgfAorICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18CitEZXNjLiB8IGN0cmwgfCBkdXJhIHwgIERBL1JBICB8ICAgVEEgICAgfCAgICBTQSAgIHwgU2VxdSB8ICBmcmFtZSAgfCAgZmNzIHwKKyAgICAgIHwgICAgICB8IHRpb24gfCAoQlNTSUQpIHwgICAgICAgICB8ICAgICAgICAgfCBlbmNlIHwgIGRhdGEgICB8ICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCitUb3RhbDogMjgtMjM0MCBieXRlcworKi8KKworLyogTWFuYWdlbWVudCBGcmFtZSBJbmZvcm1hdGlvbiBFbGVtZW50IFR5cGVzICovCitlbnVtIGllZWU4MDIxMV9tZmllIHsKKwlNRklFX1RZUEVfU1NJRCA9IDAsCisJTUZJRV9UWVBFX1JBVEVTID0gMSwKKwlNRklFX1RZUEVfRkhfU0VUID0gMiwKKwlNRklFX1RZUEVfRFNfU0VUID0gMywKKwlNRklFX1RZUEVfQ0ZfU0VUID0gNCwKKwlNRklFX1RZUEVfVElNID0gNSwKKwlNRklFX1RZUEVfSUJTU19TRVQgPSA2LAorCU1GSUVfVFlQRV9DT1VOVFJZID0gNywKKwlNRklFX1RZUEVfSE9QX1BBUkFNUyA9IDgsCisJTUZJRV9UWVBFX0hPUF9UQUJMRSA9IDksCisJTUZJRV9UWVBFX1JFUVVFU1QgPSAxMCwKKwlNRklFX1RZUEVfQ0hBTExFTkdFID0gMTYsCisJTUZJRV9UWVBFX1BPV0VSX0NPTlNUUkFJTlQgPSAzMiwKKwlNRklFX1RZUEVfUE9XRVJfQ0FQQUJJTElUWSA9IDMzLAorCU1GSUVfVFlQRV9UUENfUkVRVUVTVCA9IDM0LAorCU1GSUVfVFlQRV9UUENfUkVQT1JUID0gMzUsCisJTUZJRV9UWVBFX1NVUFBfQ0hBTk5FTFMgPSAzNiwKKwlNRklFX1RZUEVfQ1NBID0gMzcsCisJTUZJRV9UWVBFX01FQVNVUkVfUkVRVUVTVCA9IDM4LAorCU1GSUVfVFlQRV9NRUFTVVJFX1JFUE9SVCA9IDM5LAorCU1GSUVfVFlQRV9RVUlFVCA9IDQwLAorCU1GSUVfVFlQRV9JQlNTX0RGUyA9IDQxLAorCU1GSUVfVFlQRV9FUlAgPSA0MiwKKwlNRklFX1RZUEVfUlNOID0gNDgsCisJTUZJRV9UWVBFX1JBVEVTX0VYID0gNTAsCisJTUZJRV9UWVBFX0hUX0NBUD0gNDUsCisJIE1GSUVfVFlQRV9IVF9JTkZPPSA2MSwKKwkgTUZJRV9UWVBFX0FJUk9ORVQ9MTMzLAorCU1GSUVfVFlQRV9HRU5FUklDID0gMjIxLAorCU1GSUVfVFlQRV9RT1NfUEFSQU1FVEVSID0gMjIyLAorfTsKKworLyogTWluaW1hbCBoZWFkZXI7IGNhbiBiZSB1c2VkIGZvciBwYXNzaW5nIDgwMi4xMSBmcmFtZXMgd2l0aCBzdWZmaWNpZW50CisgKiBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0eXBlIG9mIHVuZGVybHlpbmcgZGF0YSB0eXBlIGlzIGFjdHVhbGx5CisgKiBzdG9yZWQgaW4gdGhlIGRhdGEuICovCitzdHJ1Y3QgaWVlZTgwMjExX2hkciB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggcGF5bG9hZFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl8xYWRkciB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IHBheWxvYWRbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9oZHJfMmFkZHIgeworCV9fbGUxNiBmcmFtZV9jdGw7CisJX19sZTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggcGF5bG9hZFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJX19sZTE2IHNlcV9jdGw7CisJdTggcGF5bG9hZFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJX19sZTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworCXU4IHBheWxvYWRbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgeworCV9fbGUxNiBmcmFtZV9jdGw7CisJX19sZTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCV9fbGUxNiBzZXFfY3RsOworCXU4IHBheWxvYWRbMF07CisJX19sZTE2IHFvc19jdGw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHJxb3MgeworCV9fbGUxNiBmcmFtZV9jdGw7CisJX19sZTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCV9fbGUxNiBzZXFfY3RsOworCXU4IGFkZHI0W0VUSF9BTEVOXTsKKwl1OCBwYXlsb2FkWzBdOworCV9fbGUxNiBxb3NfY3RsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IHsKKwl1OCBpZDsKKwl1OCBsZW47CisJdTggZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJX19sZTE2IGFsZ29yaXRobTsKKwlfX2xlMTYgdHJhbnNhY3Rpb247CisJX19sZTE2IHN0YXR1czsKKwkvKmNoYWxsZW5nZSovCisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2MgeworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKKwlfX2xlMTYgcmVhc29uOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCS8qIFNTSUQsIHN1cHBvcnRlZCByYXRlcyAqLworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJX19sZTE2IGJlYWNvbl9pbnRlcnZhbDsKKwlfX2xlMTYgY2FwYWJpbGl0eTsKKwkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMsIEZIIHBhcmFtcywgRFMgcGFyYW1zLAorCSAqIENGIHBhcmFtcywgSUJTUyBwYXJhbXMsIFRJTSAoaWYgYmVhY29uKSwgUlNOICovCisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEFsaWFzIGJlYWNvbiBmb3IgcHJvYmVfcmVzcG9uc2UgKi8KKyNkZWZpbmUgaWVlZTgwMjExX2JlYWNvbiBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UKKworc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJX19sZTE2IGNhcGFiaWxpdHk7CisJX19sZTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMsIFJTTiAqLworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3JlYXNzb2NfcmVxdWVzdF9mcmFtZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCV9fbGUxNiBjYXBhYmlsaXR5OworCV9fbGUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJdTggY3VycmVudF9hcFtFVEhfQUxFTl07CisJLyogU1NJRCwgc3VwcG9ydGVkIHJhdGVzLCBSU04gKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCV9fbGUxNiBjYXBhYmlsaXR5OworCV9fbGUxNiBzdGF0dXM7CisJX19sZTE2IGFpZDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07IC8qIHN1cHBvcnRlZCByYXRlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfdHhiIHsKKwl1OCBucl9mcmFnczsKKwl1OCBlbmNyeXB0ZWQ7CisJdTggcXVldWVfaW5kZXg7CisJdTggcnRzX2luY2x1ZGVkOworCXUxNiByZXNlcnZlZDsKKwlfX2xlMTYgZnJhZ19zaXplOworCV9fbGUxNiBwYXlsb2FkX3NpemU7CisJc3RydWN0IHNrX2J1ZmYgKmZyYWdtZW50c1swXTsKK307CisKKyNkZWZpbmUgTUFYX1RYX0FHR19DT1VOVAkJICAxNgorc3RydWN0IGllZWU4MDIxMV9kcnZfYWdnX3R4YiB7CisJdTggbnJfZHJ2X2FnZ19mcmFtZXM7CisJc3RydWN0IHNrX2J1ZmYgKnR4X2FnZ19mcmFtZXNbTUFYX1RYX0FHR19DT1VOVF07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgTUFYX1NVQkZSQU1FX0NPVU5UIAkJICA2NAorc3RydWN0IGllZWU4MDIxMV9yeGIgeworCXU4IG5yX3N1YmZyYW1lczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc3ViZnJhbWVzW01BWF9TVUJGUkFNRV9DT1VOVF07CisJdTggZHN0W0VUSF9BTEVOXTsKKwl1OCBzcmNbRVRIX0FMRU5dOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCit0eXBlZGVmIHVuaW9uIF9mcmFtZXFvcyB7CisJdTE2IHNob3J0ZGF0YTsKKwl1OCAgY2hhcmRhdGFbMl07CisJc3RydWN0IHsKKwkJdTE2IHRpZDo0OworCQl1MTYgZW9zcDoxOworCQl1MTYgYWNrX3BvbGljeToyOworCQl1MTYgcmVzZXJ2ZWQ6MTsKKwkJdTE2IHR4b3A6ODsKKwl9ZmllbGQ7Cit9ZnJhbWVxb3MsKnBmcmFtZXFvczsKKworLyogU1dFRVAgVEFCTEUgRU5UUklFUyBOVU1CRVIqLworI2RlZmluZSBNQVhfU1dFRVBfVEFCX0VOVFJJRVMJCSAgNDIKKyNkZWZpbmUgTUFYX1NXRUVQX1RBQl9FTlRSSUVTX1BFUl9QQUNLRVQgIDcKKy8qIE1BWF9SQVRFU19MRU5HVEggbmVlZHMgdG8gYmUgMTIuICBUaGUgc3BlYyBzYXlzIDgsIGFuZCBtYW55IEFQcworICogb25seSB1c2UgOCwgYW5kIHRoZW4gdXNlIGV4dGVuZGVkIHJhdGVzIGZvciB0aGUgcmVtYWluaW5nIHN1cHBvcnRlZAorICogcmF0ZXMuICBPdGhlciBBUHMsIGhvd2V2ZXIsIHN0aWNrIGFsbCBvZiB0aGVpciBzdXBwb3J0ZWQgcmF0ZXMgb24gdGhlCisgKiBtYWluIHJhdGVzIGluZm9ybWF0aW9uIGVsZW1lbnQuLi4gKi8KKyNkZWZpbmUgTUFYX1JBVEVTX0xFTkdUSCAgICAgICAgICAgICAgICAgICgodTgpMTIpCisjZGVmaW5lIE1BWF9SQVRFU19FWF9MRU5HVEggICAgICAgICAgICAgICAoKHU4KTE2KQorI2RlZmluZSBNQVhfTkVUV09SS19DT1VOVCAgICAgICAgICAgICAgICAgIDEyOAorCisjZGVmaW5lIE1BWF9DSEFOTkVMX05VTUJFUiAgICAgICAgICAgICAgICAgMTYxCisjZGVmaW5lIElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRQkgICAxMDAKKy8vKEhaIC8gMikKKyNkZWZpbmUgSUVFRTgwMjExX1NPRlRNQUNfQVNTT0NfUkVUUllfVElNRSAoSFogKiAyKQorCisjZGVmaW5lIENSQ19MRU5HVEggICAgICAgICAgICAgICAgIDRVCisKKyNkZWZpbmUgTUFYX1dQQV9JRV9MRU4gNjQKKworI2RlZmluZSBORVRXT1JLX0VNUFRZX0VTU0lEICgxPDwwKQorI2RlZmluZSBORVRXT1JLX0hBU19PRkRNICAgICgxPDwxKQorI2RlZmluZSBORVRXT1JLX0hBU19DQ0sgICAgICgxPDwyKQorCisvKiBRb1Mgc3RydWN0dXJlICovCisjZGVmaW5lIE5FVFdPUktfSEFTX1FPU19QQVJBTUVURVJTICAgICAgKDE8PDMpCisjZGVmaW5lIE5FVFdPUktfSEFTX1FPU19JTkZPUk1BVElPTiAgICAgKDE8PDQpCisjZGVmaW5lIE5FVFdPUktfSEFTX1FPU19NQVNLICAgICAgICAgICAgKE5FVFdPUktfSEFTX1FPU19QQVJBTUVURVJTIHwgXAorCQkJCQkgTkVUV09SS19IQVNfUU9TX0lORk9STUFUSU9OKQorLyogODAyLjExaCAqLworI2RlZmluZSBORVRXT1JLX0hBU19QT1dFUl9DT05TVFJBSU5UICAgICgxPDw1KQorI2RlZmluZSBORVRXT1JLX0hBU19DU0EgICAgICAgICAgICAgICAgICgxPDw2KQorI2RlZmluZSBORVRXT1JLX0hBU19RVUlFVCAgICAgICAgICAgICAgICgxPDw3KQorI2RlZmluZSBORVRXT1JLX0hBU19JQlNTX0RGUyAgICAgICAgICAgICgxPDw4KQorI2RlZmluZSBORVRXT1JLX0hBU19UUENfUkVQT1JUICAgICAgICAgICgxPDw5KQorCisjZGVmaW5lIE5FVFdPUktfSEFTX0VSUF9WQUxVRSAgICAgICAgICAgKDE8PDEwKQorCisjZGVmaW5lIFFPU19RVUVVRV9OVU0gICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBRT1NfT1VJX0xFTiAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUU9TX09VSV9UWVBFICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFFPU19FTEVNRU5UX0lEICAgICAgICAgICAgICAgICAgMjIxCisjZGVmaW5lIFFPU19PVUlfSU5GT19TVUJfVFlQRSAgICAgICAgICAgMAorI2RlZmluZSBRT1NfT1VJX1BBUkFNX1NVQl9UWVBFICAgICAgICAgIDEKKyNkZWZpbmUgUU9TX1ZFUlNJT05fMSAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFFPU19BSUZTTl9NSU5fVkFMVUUgICAgICAgICAgICAgMgorc3RydWN0IGllZWU4MDIxMV9xb3NfaW5mb3JtYXRpb25fZWxlbWVudCB7CisJdTggZWxlbWVudElEOworCXU4IGxlbmd0aDsKKwl1OCBxdWlbUU9TX09VSV9MRU5dOworCXU4IHF1aV90eXBlOworCXU4IHF1aV9zdWJ0eXBlOworCXU4IHZlcnNpb247CisJdTggYWNfaW5mbzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3Fvc19hY19wYXJhbWV0ZXIgeworCXU4IGFjaV9haWZzbjsKKwl1OCBlY3dfbWluX21heDsKKwlfX2xlMTYgdHhfb3BfbGltaXQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVyX2luZm8geworCXN0cnVjdCBpZWVlODAyMTFfcW9zX2luZm9ybWF0aW9uX2VsZW1lbnQgaW5mb19lbGVtZW50OworCXU4IHJlc2VydmVkOworCXN0cnVjdCBpZWVlODAyMTFfcW9zX2FjX3BhcmFtZXRlciBhY19wYXJhbXNfcmVjb3JkW1FPU19RVUVVRV9OVU1dOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMgeworCV9fbGUxNiBjd19taW5bUU9TX1FVRVVFX05VTV07CisJX19sZTE2IGN3X21heFtRT1NfUVVFVUVfTlVNXTsKKwl1OCBhaWZzW1FPU19RVUVVRV9OVU1dOworCXU4IGZsYWdbUU9TX1FVRVVFX05VTV07CisJX19sZTE2IHR4X29wX2xpbWl0W1FPU19RVUVVRV9OVU1dOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfcW9zX2RhdGEgeworCXN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMgcGFyYW1ldGVyczsKKwlpbnQgYWN0aXZlOworCWludCBzdXBwb3J0ZWQ7CisJdTggcGFyYW1fY291bnQ7CisJdTggb2xkX3BhcmFtX2NvdW50OworfTsKKworc3RydWN0IGllZWU4MDIxMV90aW1fcGFyYW1ldGVycyB7CisJdTggdGltX2NvdW50OworCXU4IHRpbV9wZXJpb2Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLy8jZWxzZQorc3RydWN0IGllZWU4MDIxMV93bW1fYWNfcGFyYW0geworCXU4IGFjX2FjaV9hY21fYWlmc247CisJdTggYWNfZWN3bWluX2Vjd21heDsKKwl1MTYgYWNfdHhvcF9saW1pdDsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfd21tX3RzX2luZm8geworCXU4IGFjX2Rpcl90aWQ7CisJdTggYWNfdXBfcHNiOworCXU4IHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfd21tX3RzcGVjX2VsZW0geworCXN0cnVjdCBpZWVlODAyMTFfd21tX3RzX2luZm8gdHNfaW5mbzsKKwl1MTYgbm9ybV9tc2R1X3NpemU7CisJdTE2IG1heF9tc2R1X3NpemU7CisJdTMyIG1pbl9zZXJ2X2ludGVyOworCXUzMiBtYXhfc2Vydl9pbnRlcjsKKwl1MzIgaW5hY3RfaW50ZXI7CisJdTMyIHN1c3Blbl9pbnRlcjsKKwl1MzIgc2Vydl9zdGFydF90aW1lOworCXUzMiBtaW5fZGF0YV9yYXRlOworCXUzMiBtZWFuX2RhdGFfcmF0ZTsKKwl1MzIgcGVha19kYXRhX3JhdGU7CisJdTMyIG1heF9idXJzdF9zaXplOworCXUzMiBkZWxheV9ib3VuZDsKKwl1MzIgbWluX3BoeV9yYXRlOworCXUxNiBzdXJwX2JhbmRfYWxsb3c7CisJdTE2IG1lZGl1bV90aW1lOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworZW51bSBlYXBfdHlwZSB7CisJRUFQX1BBQ0tFVCA9IDAsCisJRUFQT0xfU1RBUlQsCisJRUFQT0xfTE9HT0ZGLAorCUVBUE9MX0tFWSwKKwlFQVBPTF9FTkNBUF9BU0ZfQUxFUlQKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICplYXBfdHlwZXNbXSA9IHsKKwlbRUFQX1BBQ0tFVF0JCT0gIkVBUC1QYWNrZXQiLAorCVtFQVBPTF9TVEFSVF0JCT0gIkVBUE9MLVN0YXJ0IiwKKwlbRUFQT0xfTE9HT0ZGXQkJPSAiRUFQT0wtTG9nb2ZmIiwKKwlbRUFQT0xfS0VZXQkJPSAiRUFQT0wtS2V5IiwKKwlbRUFQT0xfRU5DQVBfQVNGX0FMRVJUXQk9ICJFQVBPTC1FbmNhcC1BU0YtQWxlcnQiCit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmVhcF9nZXRfdHlwZShpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKCh1MzIpdHlwZSA+PSBBUlJBWV9TSVpFKGVhcF90eXBlcykpID8gIlVua25vd24iIDogZWFwX3R5cGVzW3R5cGVdOworfQorLy9hZGRlZCBieSBhbXkgZm9yIHJlb3JkZXIKK3N0YXRpYyBpbmxpbmUgdTggRnJhbWVfUW9TVElEKHU4KiBidWYpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmhkcjsKKwl1MTYgZmM7CisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopYnVmOworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCXJldHVybiAodTgpKChmcmFtZXFvcyopKGJ1ZiArICgoKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykmJihmYyAmIElFRUU4MDIxMV9GQ1RMX0ZST01EUykpPyAzMCA6IDI0KSkpLT5maWVsZC50aWQ7Cit9CisKKy8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCisKK3N0cnVjdCBlYXBvbCB7CisJdTggc25hcFs2XTsKKwl1MTYgZXRoZXJ0eXBlOworCXU4IHZlcnNpb247CisJdTggdHlwZTsKKwl1MTYgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfc29mdG1hY19zdGF0c3sKKwl1bnNpZ25lZCBpbnQgcnhfYXNzX29rOworCXVuc2lnbmVkIGludCByeF9hc3NfZXJyOworCXVuc2lnbmVkIGludCByeF9wcm9iZV9ycTsKKwl1bnNpZ25lZCBpbnQgdHhfcHJvYmVfcnM7CisJdW5zaWduZWQgaW50IHR4X2JlYWNvbnM7CisJdW5zaWduZWQgaW50IHJ4X2F1dGhfcnE7CisJdW5zaWduZWQgaW50IHJ4X2F1dGhfcnNfb2s7CisJdW5zaWduZWQgaW50IHJ4X2F1dGhfcnNfZXJyOworCXVuc2lnbmVkIGludCB0eF9hdXRoX3JxOworCXVuc2lnbmVkIGludCBub19hdXRoX3JzOworCXVuc2lnbmVkIGludCBub19hc3NfcnM7CisJdW5zaWduZWQgaW50IHR4X2Fzc19ycTsKKwl1bnNpZ25lZCBpbnQgcnhfYXNzX3JxOworCXVuc2lnbmVkIGludCB0eF9wcm9iZV9ycTsKKwl1bnNpZ25lZCBpbnQgcmVhc3NvYzsKKwl1bnNpZ25lZCBpbnQgc3d0eHN0b3A7CisJdW5zaWduZWQgaW50IHN3dHhhd2FrZTsKKwl1bnNpZ25lZCBjaGFyIEN1cnJlbnRTaG93VHhhdGU7CisJdW5zaWduZWQgY2hhciBsYXN0X3BhY2tldF9yYXRlOworCXVuc2lnbmVkIGludCB0eHJldHJ5Y291bnQ7Cit9OworCisjZGVmaW5lIEJFQUNPTl9QUk9CRV9TU0lEX0lEX1BPU0lUSU9OIDEyCisKK3N0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkciB7CisJdTggaWQ7CisJdTggbGVuOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGRhdGEgdHlwZXMgdGhhdCBjYW4gbWFrZSB1cCBtYW5hZ2VtZW50IHBhY2tldHMKKyAqCisJdTE2IGF1dGhfYWxnb3JpdGhtOworCXUxNiBhdXRoX3NlcXVlbmNlOworCXUxNiBiZWFjb25faW50ZXJ2YWw7CisJdTE2IGNhcGFiaWxpdHk7CisJdTggY3VycmVudF9hcFtFVEhfQUxFTl07CisJdTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwlzdHJ1Y3QgeworCQl1MTYgYXNzb2NpYXRpb25faWQ6MTQsIHJlc2VydmVkOjI7CisJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IHJlYXNvbjsKKwl1MTYgc3RhdHVzOworKi8KKworI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCAiUGVuZ3VpbiIKKyNkZWZpbmUgSUVFRTgwMjExX0RFRkFVTFRfQkFTSUNfUkFURSAyIC8vMU1icHMKKworZW51bSB7V01NX2FsbF9mcmFtZSwgV01NX3R3b19mcmFtZSwgV01NX2ZvdXJfZnJhbWUsIFdNTV9zaXhfZnJhbWV9OworI2RlZmluZSBNQVhfU1BfTGVuICAoV01NX2FsbF9mcmFtZSA8PCA0KQorI2RlZmluZSBJRUVFODAyMTFfUU9TX1RJRCAweDBmCisjZGVmaW5lIFFPU19DVExfTk9UQ09OVEFJTl9BQ0sgKDB4MDEgPDwgNSkKKworI2RlZmluZSBJRUVFODAyMTFfRFRJTV9NQkNBU1QgNAorI2RlZmluZSBJRUVFODAyMTFfRFRJTV9VQ0FTVCAyCisjZGVmaW5lIElFRUU4MDIxMV9EVElNX1ZBTElEIDEKKyNkZWZpbmUgSUVFRTgwMjExX0RUSU1fSU5WQUxJRCAwCisKKyNkZWZpbmUgSUVFRTgwMjExX1BTX0RJU0FCTEVEIDAKKyNkZWZpbmUgSUVFRTgwMjExX1BTX1VOSUNBU1QgSUVFRTgwMjExX0RUSU1fVUNBU1QKKyNkZWZpbmUgSUVFRTgwMjExX1BTX01CQ0FTVCBJRUVFODAyMTFfRFRJTV9NQkNBU1QKKworLy9hZGRlZCBieSBEYXZpZCBmb3IgUW9TIDIwMDYvNi8zMAorLy8jZGVmaW5lIFdNTV9IYW5nXzgxODcKKyNpZmRlZiBXTU1fSGFuZ184MTg3CisjdW5kZWYgV01NX0hhbmdfODE4NworI2VuZGlmCisKKyNkZWZpbmUgV01FX0FDX0JLICAgMHgwMAorI2RlZmluZSBXTUVfQUNfQkUgICAweDAxCisjZGVmaW5lIFdNRV9BQ19WSSAgIDB4MDIKKyNkZWZpbmUgV01FX0FDX1ZPICAgMHgwMworI2RlZmluZSBXTUVfQUNJX01BU0sgMHgwMworI2RlZmluZSBXTUVfQUlGU05fTUFTSyAweDAzCisjZGVmaW5lIFdNRV9BQ19QUkFNX0xFTiAxNgorCisjZGVmaW5lIE1BWF9SRUNFSVZFX0JVRkZFUl9TSVpFIDkxMDAKKworLy9VUCBNYXBwaW5nIHRvIEFDLCB1c2luZyBpbiBNZ250UXVlcnlfU2VxdWVuY2VOdW1iZXIoKSBhbmQgbWF5YmUgZm9yIERTQ1AKKy8vI2RlZmluZSBVUDJBQyh1cCkJKCh1cDwzKSA/ICgodXA9PTApPzE6MCkgOiAodXA+PjEpKQorI2RlZmluZSBVUDJBQyh1cCkgKAkJICAgXAorCSgodXApIDwgMSkgPyBXTUVfQUNfQkUgOiBcCisJKCh1cCkgPCAzKSA/IFdNRV9BQ19CSyA6IFwKKwkoKHVwKSA8IDQpID8gV01FX0FDX0JFIDogXAorCSgodXApIDwgNikgPyBXTUVfQUNfVkkgOiBcCisJV01FX0FDX1ZPKQorLy9BQyBNYXBwaW5nIHRvIFVQLCB1c2luZyBpbiBUeCBwYXJ0IGZvciBzZWxlY3RpbmcgdGhlIGNvcnJlc3BvbmRpbmcgVFggcXVldWUKKyNkZWZpbmUgQUMyVVAoX2FjKQkoICAgICAgIFwKKwkoKF9hYykgPT0gV01FX0FDX1ZPKSA/IDYgOiBcCisJKChfYWMpID09IFdNRV9BQ19WSSkgPyA1IDogXAorCSgoX2FjKSA9PSBXTUVfQUNfQkspID8gMSA6IFwKKwkwKQorCisjZGVmaW5lCUVUSEVSX0FERFJfTEVOCQk2CS8qIGxlbmd0aCBvZiBhbiBFdGhlcm5ldCBhZGRyZXNzICovCisjZGVmaW5lIEVUSEVSTkVUX0hFQURFUl9TSVpFICAgIDE0ICAgICAgLyogbGVuZ3RoIG9mIHR3byBFdGhlcm5ldCBhZGRyZXNzIHBsdXMgZXRoZXIgdHlwZSovCisKK3N0cnVjdAlldGhlcl9oZWFkZXIgeworCXU4IGV0aGVyX2Rob3N0W0VUSEVSX0FERFJfTEVOXTsKKwl1OCBldGhlcl9zaG9zdFtFVEhFUl9BRERSX0xFTl07CisJdTE2IGV0aGVyX3R5cGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjaWZuZGVmIEVUSEVSVFlQRV9QQUUKKyNkZWZpbmUJRVRIRVJUWVBFX1BBRQkweDg4OGUJCS8qIEVBUE9MIFBBRS84MDIuMXggKi8KKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfSVAKKyNkZWZpbmUJRVRIRVJUWVBFX0lQCTB4MDgwMAkJLyogSVAgcHJvdG9jb2wgKi8KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfYnNzX2h0eworCisJYm9vbAkJCQlzdXBwb3J0X2h0OworCisJLy8gSFQgcmVsYXRlZCBlbGVtZW50cworCXU4CQkJCQlodF9jYXBfYnVmWzMyXTsKKwl1MTYJCQkJCWh0X2NhcF9sZW47CisJdTgJCQkJCWh0X2luZm9fYnVmWzMyXTsKKwl1MTYJCQkJCWh0X2luZm9fbGVuOworCisJSFRfU1BFQ19WRVIJCQlodF9zcGVjX3ZlcjsKKwkvL0hUX0NBUEFCSUxJVFlfRUxFCQkJYmRIVENhcEVsZTsKKwkvL0hUX0lORk9STUFUSU9OX0VMRQkJYmRIVEluZm9FbGU7CisKKwlib29sCQkJCWFnZ3JlZ2F0aW9uOworCWJvb2wJCQkJbG9uZ19zbG90X3RpbWU7Cit9YnNzX2h0LCAqcGJzc19odDsKKwordHlwZWRlZiBlbnVtIF9lcnBfdHsKKwlFUlBfTm9uRVJQcHJlc2VudAk9IDB4MDEsCisJRVJQX1VzZVByb3RlY3Rpb24JPSAweDAyLAorCUVSUF9CYXJrZXJQcmVhbWJsZU1vZGUgPSAweDA0LAorfSBlcnBfdDsKKworCitzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgeworCS8qIFRoZXNlIGVudHJpZXMgYXJlIHVzZWQgdG8gaWRlbnRpZnkgYSB1bmlxdWUgbmV0d29yayAqLworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKwl1OCBjaGFubmVsOworCS8qIEVuc3VyZSBudWxsLXRlcm1pbmF0ZWQgZm9yIGFueSBkZWJ1ZyBtc2dzICovCisJdTggc3NpZFtJV19FU1NJRF9NQVhfU0laRSArIDFdOworCXU4IHNzaWRfbGVuOworCXN0cnVjdCBpZWVlODAyMTFfcW9zX2RhdGEgcW9zX2RhdGE7CisJLy9hZGRlZCBieSBhbXkgZm9yIExFQVAKKwlib29sCWJXaXRoQWlyb25ldElFOworCWJvb2wJYkNraXBTdXBwb3J0ZWQ7CisJYm9vbAliQ2N4Um1FbmFibGU7CisJdTE2IAlDY3hSbVN0YXRlWzJdOworCS8vIENDWHY0IFM1OSwgTUJTU0lELgorCWJvb2wJYk1Cc3NpZFZhbGlkOworCXU4CU1Cc3NpZE1hc2s7CisJdTgJTUJzc2lkWzZdOworCS8vIENDWCAyIFMzOCwgV0xBTiBEZXZpY2UgVmVyc2lvbiBOdW1iZXIgZWxlbWVudC4gQW5uaWUsIDIwMDYtMDgtMjAuCisJYm9vbAliV2l0aENjeFZlck51bTsKKwl1OAlCc3NDY3hWZXJOdW1iZXI7CisJLyogVGhlc2UgYXJlIG5ldHdvcmsgc3RhdGlzdGljcyAqLworCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgc3RhdHM7CisJdTE2IGNhcGFiaWxpdHk7CisJdTggIHJhdGVzW01BWF9SQVRFU19MRU5HVEhdOworCXU4ICByYXRlc19sZW47CisJdTggIHJhdGVzX2V4W01BWF9SQVRFU19FWF9MRU5HVEhdOworCXU4ICByYXRlc19leF9sZW47CisJdW5zaWduZWQgbG9uZyBsYXN0X3NjYW5uZWQ7CisJdTggIG1vZGU7CisJdTMyIGZsYWdzOworCXUzMiBsYXN0X2Fzc29jaWF0ZTsKKwl1MzIgdGltZV9zdGFtcFsyXTsKKwl1MTYgYmVhY29uX2ludGVydmFsOworCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJdTE2IGF0aW1fd2luZG93OworCXU4ICBlcnBfdmFsdWU7CisJdTggIHdwYV9pZVtNQVhfV1BBX0lFX0xFTl07CisJc2l6ZV90IHdwYV9pZV9sZW47CisJdTggIHJzbl9pZVtNQVhfV1BBX0lFX0xFTl07CisJc2l6ZV90IHJzbl9pZV9sZW47CisKKwlzdHJ1Y3QgaWVlZTgwMjExX3RpbV9wYXJhbWV0ZXJzIHRpbTsKKwl1OCAgZHRpbV9wZXJpb2Q7CisJdTggIGR0aW1fZGF0YTsKKwl1MzIgbGFzdF9kdGltX3N0YV90aW1lWzJdOworCisJLy9hcHBlZGVkIGZvciBRb1MKKwl1OCB3bW1faW5mbzsKKwlzdHJ1Y3QgaWVlZTgwMjExX3dtbV9hY19wYXJhbSB3bW1fcGFyYW1bNF07CisJdTggUW9TX0VuYWJsZTsKKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwl1OCBUdXJib19FbmFibGU7Ly9lbmFibGUgdHVyYm8gbW9kZSwgYWRkZWQgYnkgdGhvbWFzCisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJdTE2IENvdW50cnlJZUxlbjsKKwl1OCBDb3VudHJ5SWVCdWZbTUFYX0lFX0xFTl07CisjZW5kaWYKKwkvLyBIVCBSZWxhdGVkLCBieSBhbXksIDIwMDguMDQuMjkKKwlCU1NfSFQJYnNzaHQ7CisJLy8gQWRkIHRvIGhhbmRsZSBicm9hZGNvbSBBUCBtYW5hZ2VtZW50IGZyYW1lIENDSyByYXRlLgorCWJvb2wgYnJvYWRjb21fY2FwX2V4aXN0OworCWJvb2wgcmFsaW5rX2NhcF9leGlzdDsKKwlib29sIGF0aGVyb3NfY2FwX2V4aXN0OworCWJvb2wgY2lzY29fY2FwX2V4aXN0OworCWJvb2wgdW5rbm93bl9jYXBfZXhpc3Q7CisvLwl1OAliZXJwX2luZm87CisJYm9vbAliZXJwX2luZm9fdmFsaWQ7CisJYm9vbCBidXNlcHJvdGVjdGlvbjsKKwkvL3B1dCBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUuCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworZW51bSBpZWVlODAyMTFfc3RhdGUgeworCisJLyogdGhlIGNhcmQgaXMgbm90IGxpbmtlZCBhdCBhbGwgKi8KKwlJRUVFODAyMTFfTk9MSU5LID0gMCwKKworCS8qIElFRUU4MDIxMV9BU1NPQ0lBVElORyogYXJlIGZvciBCU1MgY2xpZW50IG1vZGUKKwkgKiB0aGUgZHJpdmVyIHNoYWxsIG5vdCBwZXJmb3JtIFJYIGZpbHRlcmluZyB1bmxlc3MKKwkgKiB0aGUgc3RhdGUgaXMgTElOS0VELgorCSAqIFRoZSBkcml2ZXIgc2hhbGwganVzdCBjaGVjayBmb3IgdGhlIHN0YXRlIExJTktFRCBhbmQKKwkgKiBkZWZhdWx0cyB0byBOT0xJTksgZm9yIEFMTCB0aGUgb3RoZXIgc3RhdGVzIChpbmNsdWRpbmcKKwkgKiBMSU5LRURfU0NBTk5JTkcpCisJICovCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIHdpbGwgc3RhcnQgKHdxIHNjaGVkdWxpbmcpKi8KKwlJRUVFODAyMTFfQVNTT0NJQVRJTkcsCisJSUVFRTgwMjExX0FTU09DSUFUSU5HX1JFVFJZLAorCisJLyogdGhlIGFzc29jaWF0aW9uIHByb2NlZHVyZSBpcyBzZW5kaW5nIEFVVEggcmVxdWVzdCovCisJSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HLAorCisJLyogdGhlIGFzc29jaWF0aW9uIHByb2NlZHVyZSBoYXMgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRjYXRlZAorCSAqIGFuZCBpcyBzZW5kaW5nIGFzc29jaWF0aW9uIHJlcXVlc3QKKwkgKi8KKwlJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRFRCwKKworCS8qIHRoZSBsaW5rIGlzIG9rLiB0aGUgY2FyZCBhc3NvY2lhdGVkIHRvIGEgQlNTIG9yIGxpbmtlZAorCSAqIHRvIGEgaWJzcyBjZWxsIG9yIGFjdGluZyBhcyBhbiBBUCBhbmQgY3JlYXRpbmcgdGhlIGJzcworCSAqLworCUlFRUU4MDIxMV9MSU5LRUQsCisKKwkvKiBzYW1lIGFzIExJTktFRCwgYnV0IHRoZSBkcml2ZXIgc2hhbGwgYXBwbHkgUlggZmlsdGVyCisJICogcnVsZXMgYXMgd2UgYXJlIGluIE5PX0xJTksgbW9kZS4gQXMgdGhlIGNhcmQgaXMgc3RpbGwKKwkgKiBsb2dpY2FsbHkgbGlua2VkLCBidXQgaXQgaXMgZG9pbmcgYSBzeW5jcm8gc2l0ZSBzdXJ2ZXkKKwkgKiB0aGVuIGl0IHdpbGwgYmUgYmFjayB0byBMSU5LRUQgc3RhdGUuCisJICovCisJSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORywKKworfTsKKworI2RlZmluZSBERUZBVUxUX01BWF9TQ0FOX0FHRSAoMTUgKiBIWikKKyNkZWZpbmUgREVGQVVMVF9GVFMgMjM0NgorCisjZGVmaW5lIENGR19JRUVFODAyMTFfUkVTRVJWRV9GQ1MgKDE8PDApCisjZGVmaW5lIENGR19JRUVFODAyMTFfQ09NUFVURV9GQ1MgKDE8PDEpCisjZGVmaW5lIENGR19JRUVFODAyMTFfUlRTICgxPDwyKQorCisjZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9NSU5fQ0hBTk5FTCAxCisjZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9NQVhfQ0hBTk5FTCAxNAorI2RlZmluZSBJRUVFODAyMTFfMjRHSFpfQ0hBTk5FTFMgKElFRUU4MDIxMV8yNEdIWl9NQVhfQ0hBTk5FTCAtIFwKKwkJCQkgIElFRUU4MDIxMV8yNEdIWl9NSU5fQ0hBTk5FTCArIDEpCisKKyNkZWZpbmUgSUVFRTgwMjExXzUyR0haX01JTl9DSEFOTkVMIDM0CisjZGVmaW5lIElFRUU4MDIxMV81MkdIWl9NQVhfQ0hBTk5FTCAxNjUKKyNkZWZpbmUgSUVFRTgwMjExXzUyR0haX0NIQU5ORUxTIChJRUVFODAyMTFfNTJHSFpfTUFYX0NIQU5ORUwgLSBcCisJCQkJICBJRUVFODAyMTFfNTJHSFpfTUlOX0NIQU5ORUwgKyAxKQorCisKKwordHlwZWRlZiBzdHJ1Y3QgdHhfcGVuZGluZ190eworCWludCBmcmFnOworCXN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGI7Cit9dHhfcGVuZGluZ190OworCit0eXBlZGVmIHN0cnVjdCBfYmFuZHdpZHRoX2F1dG9zd2l0Y2gKK3sKKwlsb25nIHRocmVzaG9sZF8yME1oenRvNDBNaHo7CisJbG9uZwl0aHJlc2hvbGRfNDBNaHp0bzIwTWh6OworCWJvb2wgYmZvcmNlZF90eDIwTWh6OworCWJvb2wgYmF1dG9zd2l0Y2hfZW5hYmxlOworfWJhbmR3aWR0aF9hdXRvc3dpdGNoLCpwYmFuZHdpZHRoX2F1dG9zd2l0Y2g7CisKKworLy9hZGRlZCBieSBhbXkgZm9yIG9yZGVyCisKKyNkZWZpbmUgUkVPUkRFUl9XSU5fU0laRQkxMjgKKyNkZWZpbmUgUkVPUkRFUl9FTlRSWV9OVU0JMTI4Cit0eXBlZGVmIHN0cnVjdCBfUlhfUkVPUkRFUl9FTlRSWQoreworCXN0cnVjdCBsaXN0X2hlYWQJTGlzdDsKKwl1MTYJCQlTZXFOdW07CisJc3RydWN0IGllZWU4MDIxMV9yeGIqIHByeGI7Cit9IFJYX1JFT1JERVJfRU5UUlksICpQUlhfUkVPUkRFUl9FTlRSWTsKKy8vYWRkZWQgYnkgYW15IGZvciBvcmRlcgordHlwZWRlZiBlbnVtIF9Gc3luY19TdGF0ZXsKKwlEZWZhdWx0X0ZzeW5jLAorCUhXX0ZzeW5jLAorCVNXX0ZzeW5jCit9RnN5bmNfU3RhdGU7CisKKy8vIFBvd2VyIHNhdmUgbW9kZSBjb25maWd1cmVkLgordHlwZWRlZgllbnVtIF9SVF9QU19NT0RFCit7CisJZUFjdGl2ZSwJLy8gQWN0aXZlL0NvbnRpbnVvdXMgYWNjZXNzLgorCWVNYXhQcywJCS8vIE1heCBwb3dlciBzYXZlIG1vZGUuCisJZUZhc3RQcwkJLy8gRmFzdCBwb3dlciBzYXZlIG1vZGUuCit9UlRfUFNfTU9ERTsKKwordHlwZWRlZiBlbnVtIF9JUFNfQ0FMTEJBQ0tfRlVOQ0lPTgoreworCUlQU19DQUxMQkFDS19OT05FID0gMCwKKwlJUFNfQ0FMTEJBQ0tfTUdOVF9MSU5LX1JFUVVFU1QgPSAxLAorCUlQU19DQUxMQkFDS19KT0lOX1JFUVVFU1QgPSAyLAorfUlQU19DQUxMQkFDS19GVU5DSU9OOworCit0eXBlZGVmIGVudW0gX1JUX0pPSU5fQUNUSU9OeworCVJUX0pPSU5fSU5GUkEgICA9IDEsCisJUlRfSk9JTl9JQlNTICA9IDIsCisJUlRfU1RBUlRfSUJTUyA9IDMsCisJUlRfTk9fQUNUSU9OICA9IDQsCit9UlRfSk9JTl9BQ1RJT047CisKK3R5cGVkZWYgc3RydWN0IF9JYnNzUGFybXN7CisJdTE2ICAgYXRpbVdpbjsKK31JYnNzUGFybXMsICpQSWJzc1Bhcm1zOworI2RlZmluZSBNQVhfTlVNX1JBVEVTCTI2NCAvLyBNYXggbnVtIG9mIHN1cHBvcnQgcmF0ZXMgZWxlbWVudDogOCwgIE1heCBudW0gb2YgZXh0LiBzdXBwb3J0IHJhdGU6IDI1NS4gMDYxMTIyLCBieSByY25qa28uCisKKy8vIFJGIHN0YXRlLgordHlwZWRlZgllbnVtIF9SVF9SRl9QT1dFUl9TVEFURQoreworCWVSZk9uLAorCWVSZlNsZWVwLAorCWVSZk9mZgorfVJUX1JGX1BPV0VSX1NUQVRFOworCit0eXBlZGVmIHN0cnVjdCBfUlRfUE9XRVJfU0FWRV9DT05UUk9MCit7CisKKwkvLworCS8vIEluYWN0aXZlIFBvd2VyIFNhdmUoSVBTKSA6IERpc2FibGUgUkYgd2hlbiBkaXNjb25uZWN0ZWQKKwkvLworCWJvb2wJCQkJYkluYWN0aXZlUHM7CisJYm9vbAkJCQliSVBTTW9kZUJhY2t1cDsKKwlib29sCQkJCWJTd1JmUHJvY2Vzc2luZzsKKwlSVF9SRl9QT1dFUl9TVEFURQllSW5hY3RpdmVQb3dlclN0YXRlOworCXN0cnVjdCB3b3JrX3N0cnVjdCAJSW5hY3RpdmVQc1dvcmtJdGVtOworCXN0cnVjdCB0aW1lcl9saXN0CUluYWN0aXZlUHNUaW1lcjsKKworCS8vIFJldHVybiBwb2ludCBmb3Igam9pbiBhY3Rpb24KKwlJUFNfQ0FMTEJBQ0tfRlVOQ0lPTglSZXR1cm5Qb2ludDsKKworCS8vIFJlY29yZWQgUGFyYW1ldGVycyBmb3IgcmVzY2hlZHVsZWQgSm9pblJlcXVlc3QKKwlib29sCQkJCWJUbXBCc3NEZXNjOworCVJUX0pPSU5fQUNUSU9OCQl0bXBKb2luQWN0aW9uOworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayB0bXBCc3NEZXNjOworCisJLy8gUmVjb3JlZCBQYXJhbWV0ZXJzIGZvciByZXNjaGVkdWxlZCBNZ250TGlua1JlcXVlc3QKKwlib29sCQkJCWJUbXBTY2FuT25seTsKKwlib29sCQkJCWJUbXBBY3RpdmVTY2FuOworCWJvb2wJCQkJYlRtcEZpbHRlckhpZGRlbkFQOworCWJvb2wJCQkJYlRtcFVwZGF0ZVBhcm1zOworCXU4CQkJCQl0bXBTc2lkQnVmWzMzXTsKKwlPQ1RFVF9TVFJJTkcJCQl0bXBTc2lkMlNjYW47CisJYm9vbAkJCQliVG1wU3NpZDJTY2FuOworCXU4CQkJCQl0bXBOZXR3b3JrVHlwZTsKKwl1OAkJCQkJdG1wQ2hhbm5lbE51bWJlcjsKKwl1MTYJCQkJCXRtcEJjblBlcmlvZDsKKwl1OAkJCQkJdG1wRHRpbVBlcmlvZDsKKwl1MTYJCQkJCXRtcG1DYXA7CisJT0NURVRfU1RSSU5HCQkJdG1wU3VwcFJhdGVTZXQ7CisJdTgJCQkJCXRtcFN1cHBSYXRlQnVmW01BWF9OVU1fUkFURVNdOworCWJvb2wJCQkJYlRtcFN1cHBSYXRlOworCUlic3NQYXJtcwkJCQl0bXBJYnBtOworCWJvb2wJCQkJYlRtcElicG07CisKKwkvLworCS8vIExlaXNyZSBQb3N3ZXIgU2F2ZSA6IERpc2FibGUgUkYgaWYgY29ubmVjdGVkIGJ1dCB0cmFmZmljIGlzIG5vdCBidXN5CisJLy8KKwlib29sCQkJCWJMZWlzdXJlUHM7CisKK31SVF9QT1dFUl9TQVZFX0NPTlRST0wsKlBSVF9QT1dFUl9TQVZFX0NPTlRST0w7CisKK3R5cGVkZWYgdTMyIFJUX1JGX0NIQU5HRV9TT1VSQ0U7CisjZGVmaW5lIFJGX0NIQU5HRV9CWV9TVyBCSVQzMQorI2RlZmluZSBSRl9DSEFOR0VfQllfSFcgQklUMzAKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX1BTIEJJVDI5CisjZGVmaW5lIFJGX0NIQU5HRV9CWV9JUFMgQklUMjgKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX0lOSVQJMAkvLyBEbyBub3QgY2hhbmdlIHRoZSBSRk9mZiByZWFzb24uIERlZmluZWQgYnkgQnJ1Y2UsIDIwMDgtMDEtMTcuCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECit0eXBlZGVmIGVudW0KK3sKKwlDT1VOVFJZX0NPREVfRkNDID0gMCwKKwlDT1VOVFJZX0NPREVfSUMgPSAxLAorCUNPVU5UUllfQ09ERV9FVFNJID0gMiwKKwlDT1VOVFJZX0NPREVfU1BBSU4gPSAzLAorCUNPVU5UUllfQ09ERV9GUkFOQ0UgPSA0LAorCUNPVU5UUllfQ09ERV9NS0sgPSA1LAorCUNPVU5UUllfQ09ERV9NS0sxID0gNiwKKwlDT1VOVFJZX0NPREVfSVNSQUVMID0gNywKKwlDT1VOVFJZX0NPREVfVEVMRUMsCisJQ09VTlRSWV9DT0RFX01JQywKKwlDT1VOVFJZX0NPREVfR0xPQkFMX0RPTUFJTgorfWNvdW50cnlfY29kZV90eXBlX3Q7CisjZW5kaWYKKworI2RlZmluZSBSVF9NQVhfTERfU0xPVF9OVU0JMTAKK3R5cGVkZWYgc3RydWN0IF9SVF9MSU5LX0RFVEVDVF9UeworCisJdTMyCQkJCU51bVJlY3ZCY25JblBlcmlvZDsKKwl1MzIJCQkJTnVtUmVjdkRhdGFJblBlcmlvZDsKKworCXUzMgkJCQlSeEJjbk51bVtSVF9NQVhfTERfU0xPVF9OVU1dOwkvLyBudW1iZXIgb2YgUnggYmVhY29uIC8gQ2hlY2tGb3JIYW5nX3BlcmlvZCAgdG8gZGV0ZXJtaW5lIGxpbmsgc3RhdHVzCisJdTMyCQkJCVJ4RGF0YU51bVtSVF9NQVhfTERfU0xPVF9OVU1dOwkvLyBudW1iZXIgb2YgUnggZGF0YSAvIENoZWNrRm9ySGFuZ19wZXJpb2QgIHRvIGRldGVybWluZSBsaW5rIHN0YXR1cworCXUxNgkJCQlTbG90TnVtOwkvLyBudW1iZXIgb2YgQ2hlY2tGb3JIYW5nIHBlcmlvZCB0byBkZXRlcm1pbmUgbGluayBzdGF0dXMKKwl1MTYJCQkJU2xvdEluZGV4OworCisJdTMyCQkJCU51bVR4T2tJblBlcmlvZDsKKwl1MzIJCQkJTnVtUnhPa0luUGVyaW9kOworCWJvb2wJCQkJYkJ1c3lUcmFmZmljOworfVJUX0xJTktfREVURUNUX1QsICpQUlRfTElOS19ERVRFQ1RfVDsKKworCitzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYzsKKworCS8vaHcgc2VjdXJpdHkgcmVsYXRlZAorLy8JdTggaHdzZWNfc3VwcG9ydDsgLy9zdXBwb3J0PworCXU4IGh3c2VjX2FjdGl2ZTsgIC8vaHcgc2VjdXJpdHkgYWN0aXZlLgorCWJvb2wgaXNfc2lsZW50X3Jlc2V0OworCWJvb2wgaWVlZV91cDsKKwkvL2FkZGVkIGJ5IGFteQorCWJvb2wgYlN1cHBvcnRSZW1vdGVXYWtlVXA7CisJUlRfUFNfTU9ERQlkb3QxMVBvd2VyU2F2ZU1vZGU7IC8vIFBvd2VyIHNhdmUgbW9kZSBjb25maWd1cmVkLgorCWJvb2wgYWN0c2Nhbm5pbmc7CisJYm9vbCBiZWlucmV0cnk7CisJUlRfUkZfUE9XRVJfU1RBVEUJCWVSRlBvd2VyU3RhdGU7CisJUlRfUkZfQ0hBTkdFX1NPVVJDRQlSZk9mZlJlYXNvbjsKKwlib29sIGlzX3NldF9rZXk7CisJLy8xMW4gc3BlYyByZWxhdGVkIEkgd29uZGVyIGlmIFRoZXNlIGluZm8gc3RydWN0dXJlIG5lZWQgdG8gYmUgbW92ZWQgb3V0IG9mIGllZWU4MDIxMV9kZXZpY2UKKworCS8vMTFuIEhUIGJlbG93CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvOworCS8vc3RydWN0IHRpbWVyX2xpc3QJCVN3QndUaW1lcjsKKy8vCXNwaW5sb2NrX3QgY2hubG9wX3NwaW5sb2NrOworCXNwaW5sb2NrX3QgYndfc3BpbmxvY2s7CisKKwlzcGlubG9ja190IHJlb3JkZXJfc3BpbmxvY2s7CisJLy8gZm9yIEhUIG9wZXJhdGlvbiByYXRlIHNldC4gIHdlIHVzZSB0aGlzIG9uZSBmb3IgSFQgZGF0YSByYXRlIHRvIHNlcGVyYXRlIGRpZmZlcmVudCBkZXNjcmlwdG9ycworCS8vdGhlIHdheSBmaWxsIHRoaXMgaXMgdGhlIHNhbWUgYXMgaW4gdGhlIElFCisJdTgJUmVnZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldFsxNl07CQkvL3VzZSBSQVRSIGZvcm1hdAorCXU4CWRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXRbMTZdOwkJLy91c2UgUkFUUiBmb3JtYXQKKwl1OAlSZWdIVFN1cHBSYXRlU2V0WzE2XTsKKwl1OAkJCQlIVEN1cnJlbnRPcGVyYVJhdGU7CisJdTgJCQkJSFRIaWdoZXN0T3BlcmFSYXRlOworCS8vd2IgYWRkZWQgZm9yIHJhdGUgb3BlcmF0aW9uIG1vZGUgdG8gZmlybXdhcmUKKwl1OAliVHhEaXNhYmxlUmF0ZUZhbGxCYWNrOworCXU4IAliVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGU7CisJYXRvbWljX3QJYXRtX2NobmxvcDsKKwlhdG9taWNfdAlhdG1fc3didzsKKy8vCXU4CUhUSGlnaGVzdE9wZXJhUmF0ZTsKKy8vCXU4IAlIVEN1cnJlbnRPcGVyYVJhdGU7CisKKwkvLyA4MDIuMTFlIGFuZCBXTU0gVHJhZmZpYyBTdHJlYW0gSW5mbyAoVFgpCisJc3RydWN0IGxpc3RfaGVhZAkJVHhfVFNfQWRtaXRfTGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlUeF9UU19QZW5kaW5nX0xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAkJVHhfVFNfVW51c2VkX0xpc3Q7CisJVFhfVFNfUkVDT1JECQlUeFRzUmVjb3JkW1RPVEFMX1RTX05VTV07CisJLy8gODAyLjExZSBhbmQgV01NIFRyYWZmaWMgU3RyZWFtIEluZm8gKFJYKQorCXN0cnVjdCBsaXN0X2hlYWQJCVJ4X1RTX0FkbWl0X0xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAkJUnhfVFNfUGVuZGluZ19MaXN0OworCXN0cnVjdCBsaXN0X2hlYWQJCVJ4X1RTX1VudXNlZF9MaXN0OworCVJYX1RTX1JFQ09SRAkJUnhUc1JlY29yZFtUT1RBTF9UU19OVU1dOworLy8jaWZkZWYgVE9fRE9fTElTVAorCVJYX1JFT1JERVJfRU5UUlkJUnhSZW9yZGVyRW50cnlbMTI4XTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlSeFJlb3JkZXJfVW51c2VkX0xpc3Q7CisvLyNlbmRpZgorCS8vIFFvcyByZWxhdGVkLiBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMS0wMS4KKy8vCVBTVEFfUU9TCQkJcFN0YVFvczsKKwl1OAkJCQlGb3JjZWRQcmlvcml0eTsJCS8vIEZvcmNlIHBlci1wYWNrZXQgcHJpb3JpdHkgMX43LiAoZGVmYXVsdDogMCwgbm90IHRvIGZvcmNlIGl0LikKKworCisJLyogQm9va2tlZXBpbmcgc3RydWN0dXJlcyAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBpZWVlODAyMTFfc3RhdHMgaWVlZV9zdGF0czsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NvZnRtYWNfc3RhdHMgc29mdG1hY19zdGF0czsKKworCS8qIFByb2JlIC8gQmVhY29uIG1hbmFnZW1lbnQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG5ldHdvcmtfZnJlZV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgbmV0d29ya19saXN0OworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29ya3M7CisJaW50IHNjYW5zOworCWludCBzY2FuX2FnZTsKKworCWludCBpd19tb2RlOyAvKiBvcGVyYXRpbmcgbW9kZSAoSVdfTU9ERV8qKSAqLworCXN0cnVjdCBpd19zcHlfZGF0YSBzcHlfZGF0YTsKKworCXNwaW5sb2NrX3QgbG9jazsKKwlzcGlubG9ja190IHdwYXhfc3VpdGxpc3RfbG9jazsKKworCWludCB0eF9oZWFkcm9vbTsgLyogU2V0IHRvIHNpemUgb2YgYW55IGFkZGl0aW9uYWwgcm9vbSBuZWVkZWQgYXQgZnJvbnQKKwkJCSAgKiBvZiBhbGxvY2F0ZWQgVHggU0tCcyAqLworCXUzMiBjb25maWc7CisKKwkvKiBXRVAgYW5kIG90aGVyIGVuY3J5cHRpb24gcmVsYXRlZCBzZXR0aW5ncyBhdCB0aGUgZGV2aWNlIGxldmVsICovCisJaW50IG9wZW5fd2VwOyAvKiBTZXQgdG8gMSB0byBhbGxvdyB1bmVuY3J5cHRlZCBmcmFtZXMgKi8KKwlpbnQgYXV0aF9tb2RlOworCWludCByZXNldF9vbl9rZXljaGFuZ2U7IC8qIFNldCB0byAxIGlmIHRoZSBIVyBuZWVkcyB0byBiZSByZXNldCBvbgorCQkJCSAqIFdFUCBrZXkgY2hhbmdlcyAqLworCisJLyogSWYgdGhlIGhvc3QgcGVyZm9ybXMge2VuLGRlfWNyeXB0aW9uLCB0aGVuIHNldCB0byAxICovCisJaW50IGhvc3RfZW5jcnlwdDsKKwlpbnQgaG9zdF9lbmNyeXB0X21zZHU7CisJaW50IGhvc3RfZGVjcnlwdDsKKwkvKiBob3N0IHBlcmZvcm1zIG11bHRpY2FzdCBkZWNyeXB0aW9uICovCisJaW50IGhvc3RfbWNfZGVjcnlwdDsKKworCS8qIGhvc3Qgc2hvdWxkIHN0cmlwIElWIGFuZCBJQ1YgZnJvbSBwcm90ZWN0ZWQgZnJhbWVzICovCisJLyogbWVhbmluZ2Z1bCBvbmx5IHdoZW4gaGFyZHdhcmUgZGVjcnlwdGlvbiBpcyBiZWluZyB1c2VkICovCisJaW50IGhvc3Rfc3RyaXBfaXZfaWN2OworCisJaW50IGhvc3Rfb3Blbl9mcmFnOworCWludCBob3N0X2J1aWxkX2l2OworCWludCBpZWVlODAyXzF4OyAvKiBpcyBJRUVFIDgwMi4xWCB1c2VkICovCisKKwkvKiBXUEEgZGF0YSAqLworCWJvb2wgYkhhbGZXaXJlbGVzc04yNEdNb2RlOworCWludCB3cGFfZW5hYmxlZDsKKwlpbnQgZHJvcF91bmVuY3J5cHRlZDsKKwlpbnQgdGtpcF9jb3VudGVybWVhc3VyZXM7CisJaW50IHByaXZhY3lfaW52b2tlZDsKKwlzaXplX3Qgd3BhX2llX2xlbjsKKwl1OCAqd3BhX2llOworCXU4IGFwX21hY19hZGRyWzZdOworCXUxNiBwYWlyd2lzZV9rZXlfdHlwZTsKKwl1MTYgZ3JvdXBfa2V5X3R5cGU7CisJc3RydWN0IGxpc3RfaGVhZCBjcnlwdF9kZWluaXRfbGlzdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0W1dFUF9LRVlTXTsKKwlpbnQgdHhfa2V5aWR4OyAvKiBkZWZhdWx0IFRYIGtleSBpbmRleCAoY3J5cHRbdHhfa2V5aWR4XSkgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBjcnlwdF9kZWluaXRfdGltZXI7CisJaW50IGNyeXB0X3F1aWVzY2VkOworCisJaW50IGJjcnhfc3RhX2tleTsgLyogdXNlIGluZGl2aWR1YWwga2V5cyB0byBvdmVycmlkZSBkZWZhdWx0IGtleXMgZXZlbgorCQkJICAgKiB3aXRoIFJYIG9mIGJyb2FkL211bHRpY2FzdCBmcmFtZXMgKi8KKworCS8qIEZyYWdtZW50YXRpb24gc3RydWN0dXJlcyAqLworCS8vIGVhY2ggc3RyZWFtaW5nIGNvbnRhaW4gYSBlbnRyeQorCXN0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSBmcmFnX2NhY2hlWzE3XVtJRUVFODAyMTFfRlJBR19DQUNIRV9MRU5dOworCXVuc2lnbmVkIGludCBmcmFnX25leHRfaWR4WzE3XTsKKwl1MTYgZnRzOyAvKiBGcmFnbWVudGF0aW9uIFRocmVzaG9sZCAqLworI2RlZmluZSBERUZBVUxUX1JUU19USFJFU0hPTEQgMjM0NlUKKyNkZWZpbmUgTUlOX1JUU19USFJFU0hPTEQgMQorI2RlZmluZSBNQVhfUlRTX1RIUkVTSE9MRCAyMzQ2VQorCXUxNiBydHM7IC8qIFJUUyB0aHJlc2hvbGQgKi8KKworCS8qIEFzc29jaWF0aW9uIGluZm8gKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CisKKwkvKiBUaGlzIHN0b3JlcyBpbmZvcyBmb3IgdGhlIGN1cnJlbnQgbmV0d29yay4KKwkgKiBFaXRoZXIgdGhlIG5ldHdvcmsgd2UgYXJlIGFzc29jaWF0ZWQgaW4gSU5GUkFTVFJVQ1RVUkUKKwkgKiBvciB0aGUgbmV0d29yayB0aGF0IHdlIGFyZSBjcmVhdGluZyBpbiBNQVNURVIgbW9kZS4KKwkgKiBhZC1ob2MgaXMgYSBtaXh0dXJlIDstKS4KKwkgKiBOb3RlIHRoYXQgaW4gaW5mcmFzdHJ1Y3R1cmUgbW9kZSwgZXZlbiB3aGVuIG5vdCBhc3NvY2lhdGVkLAorCSAqIGZpZWxkcyBic3NpZCBhbmQgZXNzaWQgbWF5IGJlIHZhbGlkIChpZiB3cGFfc2V0IGFuZCBlc3NpZF9zZXQKKwkgKiBhcmUgdHJ1ZSkgYXMgdGh5IGNhcnJ5IHRoZSB2YWx1ZSBzZXQgYnkgdGhlIHVzZXIgdmlhIGl3Y29uZmlnCisJICovCisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIGN1cnJlbnRfbmV0d29yazsKKworCWVudW0gaWVlZTgwMjExX3N0YXRlIHN0YXRlOworCisJaW50IHNob3J0X3Nsb3Q7CisJaW50IHJlZ19tb2RlOworCWludCBtb2RlOyAgICAgICAvKiBBLCBCLCBHICovCisJaW50IG1vZHVsYXRpb247IC8qIENDSywgT0ZETSAqLworCWludCBmcmVxX2JhbmQ7ICAvKiAyLjRHaHosIDUuMkdoeiwgTWl4ZWQgKi8KKwlpbnQgYWJnX3RydWU7ICAgLyogQUJHIGZsYWcgICAgICAgICAgICAgICovCisKKwkvKiB1c2VkIGZvciBmb3JjaW5nIHRoZSBpYnNzIHdvcmtxdWV1ZSB0byB0ZXJtaW5hdGUKKwkgKiB3aXRob3V0IHdhaXQgZm9yIHRoZSBzeW5jcm8gc2NhbiB0byB0ZXJtaW5hdGUKKwkgKi8KKwlzaG9ydCBzeW5jX3NjYW5faHVycnl1cDsKKworCWludCBwZXJmZWN0X3Jzc2k7CisJaW50IHdvcnN0X3Jzc2k7CisKKwl1MTYgcHJldl9zZXFfY3RsOyAgICAgICAvKiB1c2VkIHRvIGRyb3AgZHVwbGljYXRlIGZyYW1lcyAqLworCisJLyogbWFwIG9mIGFsbG93ZWQgY2hhbm5lbHMuIDAgaXMgZHVtbXkgKi8KKwkvLyBGSVhNRTogcmVtZWJlciB0byBkZWZhdWx0IHRvIGEgYmFzaWMgY2hhbm5lbCBwbGFuIGRlcGVuZGluZyBvZiB0aGUgUEhZIHR5cGUKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJdm9pZCogcERvdDExZEluZm87CisJYm9vbCBiR2xvYmFsRG9tYWluOworI2Vsc2UKKwlpbnQgY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOworI2VuZGlmCisJaW50IHJhdGU7ICAgICAgIC8qIGN1cnJlbnQgcmF0ZSAqLworCWludCBiYXNpY19yYXRlOworCS8vRklYTUU6IHBsZWFjZSBjYWxsYmFjaywgc2VlIGlmIHJlZHVuZGFudCB3aXRoIHNvZnRtYWNfZmVhdHVyZXMKKwlzaG9ydCBhY3RpdmVfc2NhbjsKKworCS8qIHRoaXMgY29udGFpbnMgZmxhZ3MgZm9yIHNlbGVjdGl2ZWx5IGVuYWJsZSBzb2Z0bWFjIHN1cHBvcnQgKi8KKwl1MTYgc29mdG1hY19mZWF0dXJlczsKKworCS8qIGlmIHRoZSBzZXF1ZW5jZSBjb250cm9sIGZpZWxkIGlzIG5vdCBmaWxsZWQgYnkgSFcgKi8KKwl1MTYgc2VxX2N0cmxbNV07CisKKwkvKiBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgdHJhbnNhY3Rpb24gc2VxdWVuY2UgbnVtYmVyICovCisJdTE2IGFzc29jaWF0ZV9zZXE7CisKKwkvKiBBSUQgZm9yIFJUWGVkIGFzc29jaWF0aW9uIHJlc3BvbnNlcyAqLworCXUxNiBhc3NvY19pZDsKKworCS8qIHBvd2VyIHNhdmUgbW9kZSByZWxhdGVkKi8KKwlzaG9ydCBwczsKKwlzaG9ydCBzdGFfc2xlZXA7CisJaW50IHBzX3RpbWVvdXQ7CisJaW50IHBzX3BlcmlvZDsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgcHNfdGFzazsKKwl1MzIgcHNfdGg7CisJdTMyIHBzX3RsOworCisJc2hvcnQgcmF3X3R4OworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFIGlzIHNldCAqLworCXNob3J0IHF1ZXVlX3N0b3A7CisJc2hvcnQgc2Nhbm5pbmc7CisJc2hvcnQgcHJvdG9fc3RhcnRlZDsKKworCXN0cnVjdCBzZW1hcGhvcmUgd3hfc2VtOworCXN0cnVjdCBzZW1hcGhvcmUgc2Nhbl9zZW07CisKKwlzcGlubG9ja190IG1nbXRfdHhfbG9jazsKKwlzcGlubG9ja190IGJlYWNvbl9sb2NrOworCisJc2hvcnQgYmVhY29uX3R4aW5nOworCisJc2hvcnQgd2FwX3NldDsKKwlzaG9ydCBzc2lkX3NldDsKKworCXU4ICB3cGF4X3R5cGVfc2V0OyAgICAvL3thZGRlZCBieSBEYXZpZCwgMjAwNi45LjI4fQorCXUzMiB3cGF4X3R5cGVfbm90aWZ5OyAvL3thZGRlZCBieSBEYXZpZCwgMjAwNi45LjI2fQorCisJLyogUW9TIHJlbGF0ZWQgZmxhZyAqLworCWNoYXIgaW5pdF93bW1wYXJhbV9mbGFnOworCS8qIHNldCBvbiBpbml0aWFsaXphdGlvbiAqLworCXU4ICBxb3Nfc3VwcG9ydDsKKworCS8qIGZvciBkaXNjYXJkaW5nIGR1cGxpY2F0ZWQgcGFja2V0cyBpbiBJQlNTICovCisJc3RydWN0IGxpc3RfaGVhZCBpYnNzX21hY19oYXNoW0lFRUVfSUJTU19NQUNfSEFTSF9TSVpFXTsKKworCS8qIGZvciBkaXNjYXJkaW5nIGR1cGxpY2F0ZWQgcGFja2V0cyBpbiBCU1MgKi8KKwl1MTYgbGFzdF9yeHNlcV9udW1bMTddOyAvKiByeCBzZXEgcHJldmlvdXMgcGVyLXRpZCAqLworCXUxNiBsYXN0X3J4ZnJhZ19udW1bMTddOy8qIHR4IGZyYWcgcHJldmlvdXMgcGVyLXRpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9wYWNrZXRfdGltZVsxN107CisKKwkvKiBmb3IgUFMgbW9kZSAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9yeF9wc190aW1lOworCisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzIHNldCAqLworCXN0cnVjdCBza19idWZmICptZ210X3F1ZXVlX3JpbmdbTUdNVF9RVUVVRV9OVU1dOworCWludCBtZ210X3F1ZXVlX2hlYWQ7CisJaW50IG1nbXRfcXVldWVfdGFpbDsKKy8veyBhZGRlZCBmb3IgcnRsODE5eAorI2RlZmluZSBJRUVFODAyMTFfUVVFVUVfTElNSVQgMTI4CisJdTggQXNvY1JldHJ5Q291bnQ7CisJdW5zaWduZWQgaW50IGh3X2hlYWRlcjsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHNrYl93YWl0UVtNQVhfUVVFVUVfU0laRV07CisJc3RydWN0IHNrX2J1ZmZfaGVhZCAgc2tiX2FnZ1FbTUFYX1FVRVVFX1NJWkVdOworCXN0cnVjdCBza19idWZmX2hlYWQgIHNrYl9kcnZfYWdnUVtNQVhfUVVFVUVfU0laRV07CisJdTMyCXN0YV9lZGNhX3BhcmFtWzRdOworCWJvb2wgYWdncmVnYXRpb247CisJLy8gRW5hYmxlL0Rpc2FibGUgUnggaW1tZWRpYXRlIEJBIGNhcGFiaWxpdHkuCisJYm9vbCBlbmFibGVfcnhfaW1tX0JBOworCWJvb2wgYmlic3Njb29yZGluYXRvcjsKKworCS8vK2J5IGFteSBmb3IgRE0gLDA4MDUxNQorCS8vRHluYW1pYyBUeCBwb3dlciBmb3IgbmVhci9mYXIgcmFuZ2UgZW5hYmxlL0Rpc2FibGUgICwgYnkgYW15ICwgMjAwOC0wNS0xNQorCWJvb2wJYmR5bmFtaWNfdHhwb3dlcl9lbmFibGU7CisKKwlib29sIGJDVFNUb1NlbGZFbmFibGU7CisJdTggCUNUU1RvU2VsZlRIOworCisJdTMyIAlmc3luY190aW1lX2ludGVydmFsOworCXUzMglmc3luY19yYXRlX2JpdG1hcDsKKwl1OAlmc3luY19yc3NpX3RocmVzaG9sZDsKKwlib29sCWJmc3luY19lbmFibGU7CisKKwl1OAlmc3luY19tdWx0aXBsZV90aW1laW50ZXJ2YWw7CQkvLyBGc3luY011bHRpcGxlVGltZUludGVydmFsICogRnN5bmNUaW1lSW50ZXJ2YWwKKwl1MzIJZnN5bmNfZmlyc3RkaWZmX3JhdGV0aHJlc2hvbGQ7CQkvLyBsb3cgdGhyZXNob2xkCisJdTMyCWZzeW5jX3NlY29uZGRpZmZfcmF0ZXRocmVzaG9sZDsJIC8vIGRlY3JlYXNlIHRocmVzaG9sZAorCUZzeW5jX1N0YXRlCQkJZnN5bmNfc3RhdGU7CisJYm9vbAkJYmlzX2FueV9ub25iZXBrdHM7CisJLy8yME1oeiA0ME1oeiBBdXRvU3dpdGNoIFRocmVzaG9sZAorCWJhbmR3aWR0aF9hdXRvc3dpdGNoIGJhbmR3aWR0aF9hdXRvX3N3aXRjaDsKKwkvL2ZvciB0eHBvd2VyIHRyYWNraW5nCisJYm9vbCBGd1JXUkY7CisKKwkvL2FkZGVkIGJ5IGFteSBmb3IgQVAgcm9hbWluZworCVJUX0xJTktfREVURUNUX1QJTGlua0RldGVjdEluZm87CisJLy9hZGRlZCBieSBhbXkgZm9yIHBzCisJUlRfUE9XRVJfU0FWRV9DT05UUk9MCVBvd2VyU2F2ZUNvbnRyb2w7CisvL30KKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19UWF9RVUVVRSBpcyBzZXQgKi8KKwlzdHJ1Y3QgIHR4X3BlbmRpbmdfdCB0eF9wZW5kaW5nOworCisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFIGlzIHNldCAqLworCXN0cnVjdCB0aW1lcl9saXN0IGFzc29jaWF0ZV90aW1lcjsKKworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX0JFQUNPTlMgaXMgc2V0ICovCisJc3RydWN0IHRpbWVyX2xpc3QgYmVhY29uX3RpbWVyOworCXN0cnVjdCB3b3JrX3N0cnVjdCBhc3NvY2lhdGVfY29tcGxldGVfd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9wcm9jZWR1cmVfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBzb2Z0bWFjX3NjYW5fd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBhc3NvY2lhdGVfcmV0cnlfd3E7CisJIHN0cnVjdCBkZWxheWVkX3dvcmsgc3RhcnRfaWJzc193cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd3hfc3luY19zY2FuX3dxOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKKwkvLyBRb3MgcmVsYXRlZC4gQWRkZWQgYnkgQW5uaWUsIDIwMDUtMTEtMDEuCisJLy9TVEFfUU9TICBTdGFRb3M7CisKKwkvL3UzMiBTVEFfRURDQV9QQVJBTVs0XTsKKwkvL0NIQU5ORUxfQUNDRVNTX1NFVFRJTkcgQ2hhbm5lbEFjY2Vzc1NldHRpbmc7CisKKworCS8qIENhbGxiYWNrIGZ1bmN0aW9ucyAqLworCXZvaWQgKCpzZXRfc2VjdXJpdHkpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgKnNlYyk7CisKKwkvKiBVc2VkIHRvIFRYIGRhdGEgZnJhbWUgYnkgdXNpbmcgdHhiIHN0cnVjdHMuCisJICogdGhpcyBpcyBub3QgdXNlZCBpZiBpbiB0aGUgc29mdG1hY19mZWF0dXJlcworCSAqIGlzIHNldCB0aGUgZmxhZyBJRUVFX1NPRlRNQUNfVFhfUVVFVUUKKwkgKi8KKwlpbnQgKCpoYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwlpbnQgKCpyZXNldF9wb3J0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwlpbnQgKCppc19xdWV1ZV9mdWxsKSAoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGludCBwcmkpOworCisJaW50ICgqaGFuZGxlX21hbmFnZW1lbnQpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqIG5ldHdvcmssIHUxNiB0eXBlKTsKKwlpbnQgKCppc19xb3NfYWN0aXZlKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKwkvKiBTb2Z0bWFjLWdlbmVyYXRlZCBmcmFtZXMgKG1hbWFnZW1lbnQpIGFyZSBUWGVkIHZpYSB0aGlzCisJICogY2FsbGJhY2sgaWYgdGhlIGZsYWcgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSBpcworCSAqIG5vdCBzZXQuIEFzIHNvbWUgY2FyZHMgbWF5IGhhdmUgZGlmZmVyZW50IEhXIHF1ZXVlcyB0aGF0CisJICogb25lIG1pZ2h0IHdhbnQgdG8gdXNlIGZvciBkYXRhIGFuZCBtYW5hZ2VtZW50IGZyYW1lcworCSAqIHRoZSBvcHRpb24gdG8gaGF2ZSB0d28gY2FsbGJhY2tzIG1pZ2h0IGJlIHVzZWZ1bC4KKwkgKiBUaGlzIGZ1Y250aW9uIGNhbid0IHNsZWVwLgorCSAqLworCWludCAoKnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogdXNlZCBpbnN0ZWFkIG9mIGhhcmRfc3RhcnRfeG1pdCAobm90IHNvZnRtYWNfaGFyZF9zdGFydF94bWl0KQorCSAqIGlmIHRoZSBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgZmVhdHVyZSBpcyB1c2VkIHRvIFRYIGRhdGEKKwkgKiBmcmFtZXMuIEkgdGhlIG9wdGlvbiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzIGFsc28gc2V0CisJICogdGhlbiBhbHNvIG1hbmFnZW1lbnQgZnJhbWVzIGFyZSBzZW50IHZpYSB0aGlzIGNhbGxiYWNrLgorCSAqIFRoaXMgZnVuY3Rpb24gY2FuJ3Qgc2xlZXAuCisJICovCisJdm9pZCAoKnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldixpbnQgcmF0ZSk7CisKKwkvKiBzdG9wcyB0aGUgSFcgcXVldWUgZm9yIERBVEEgZnJhbWVzLiBVc2VmdWwgdG8gYXZvaWQKKwkgKiB3YXN0ZSB0aW1lIHRvIFRYIGRhdGEgZnJhbWUgd2hlbiB3ZSBhcmUgcmVhc3NvY2lhdGluZworCSAqIFRoaXMgZnVuY3Rpb24gY2FuIHNsZWVwLgorCSAqLworCXZvaWQgKCpkYXRhX2hhcmRfc3RvcCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBPSyB0aGlzIGlzIGNvbXBsZW1lbnRhciB0byBkYXRhX3BvbGxfaGFyZF9zdG9wICovCisJdm9pZCAoKmRhdGFfaGFyZF9yZXN1bWUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogYXNrIHRvIHRoZSBkcml2ZXIgdG8gcmV0dW5lIHRoZSByYWRpbyAuCisJICogVGhpcyBmdW5jdGlvbiBjYW4gc2xlZXAuIHRoZSBkcml2ZXIgc2hvdWxkIGVuc3VyZQorCSAqIHRoZSByYWRpbyBoYXMgYmVlbiBzd2l0aGNlZCBiZWZvcmUgcmV0dXJuLgorCSAqLworCXZvaWQgKCpzZXRfY2hhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7CisKKwkvKiBUaGVzZSBhcmUgbm90IHVzZWQgaWYgdGhlIGllZWUgc3RhY2sgdGFrZXMgY2FyZSBvZgorCSAqIHNjYW5uaW5nIChJRUVFX1NPRlRNQUNfU0NBTiBmZWF0dXJlIHNldCkuCisJICogSW4gdGhpcyBjYXNlIG9ubHkgdGhlIHNldF9jaGFuIGlzIHVzZWQuCisJICoKKwkgKiBUaGUgc3luY3JvIHZlcnNpb24gaXMgc2ltaWxhciB0byB0aGUgc3RhcnRfc2NhbiBidXQKKwkgKiBkb2VzIG5vdCByZXR1cm4gdW50aWwgYWxsIGNoYW5uZWxzIGhhcyBiZWVuIHNjYW5uZWQuCisJICogdGhpcyBpcyBjYWxsZWQgaW4gdXNlciBjb250ZXh0IGFuZCBzaG91bGQgc2xlZXAsCisJICogaXQgaXMgY2FsbGVkIGluIGEgd29ya19xdWV1ZSB3aGVuIHN3aXRoY2luZyB0byBhZC1ob2MgbW9kZQorCSAqIG9yIGluIGJlaGFsZiBvZiBpd2xpc3Qgc2NhbiB3aGVuIHRoZSBjYXJkIGlzIGFzc29jaWF0ZWQKKwkgKiBhbmQgcm9vdCB1c2VyIGFzayBmb3IgYSBzY2FuLgorCSAqIHRoZSBmdWNudGlvbiBzdG9wX3NjYW4gc2hvdWxkIHN0b3AgYm90aCB0aGUgc3luY3JvIGFuZAorCSAqIGJhY2tncm91bmQgc2Nhbm5pbmcgYW5kIGNhbiBzbGVlcC4KKwkgKiBUaGUgZnVjbnRpb24gc3RhcnRfc2NhbiBzaG91bGQgaW5pdGlhdGUgdGhlIGJhY2tncm91bmQKKwkgKiBzY2FubmluZyBhbmQgY2FuJ3Qgc2xlZXAuCisJICovCisJdm9pZCAoKnNjYW5fc3luY3JvKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqc3RhcnRfc2Nhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnN0b3Bfc2Nhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBpbmRpY2F0ZSB0aGUgZHJpdmVyIHRoYXQgdGhlIGxpbmsgc3RhdGUgaXMgY2hhbmdlZAorCSAqIGZvciBleGFtcGxlIGl0IG1heSBpbmRpY2F0ZSB0aGUgY2FyZCBpcyBhc3NvY2lhdGVkIG5vdy4KKwkgKiBEcml2ZXIgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbiB0aGlzIHRvIGFwcGx5IFJYIGZpbHRlcgorCSAqIHJ1bGVzIG9yIHNpbXBseSBsaWdodCB0aGUgTElOSyBsZWQKKwkgKi8KKwl2b2lkICgqbGlua19jaGFuZ2UpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogdGhlc2UgdHdvIGZ1bmN0aW9uIGluZGljYXRlcyB0byB0aGUgSFcgd2hlbiB0byBzdGFydAorCSAqIGFuZCBzdG9wIHRvIHNlbmQgYmVhY29ucy4gVGhpcyBpcyB1c2VkIHdoZW4gdGhlCisJICogSUVFRV9TT0ZUTUFDX0JFQUNPTlMgaXMgbm90IHNldC4gRm9yIG5vdyB0aGUKKwkgKiBzdG9wX3NlbmRfYmFjb25zIGlzIE5PVCBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBvbmx5CisJICogYWZ0ZXIgc3RhcnRfc2VuZF9iZWFjb25zLgorCSAqLworCXZvaWQgKCpzdGFydF9zZW5kX2JlYWNvbnMpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHUxNiB0eF9yYXRlKTsKKwl2b2lkICgqc3RvcF9zZW5kX2JlYWNvbnMpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIHBvd2VyIHNhdmUgbW9kZSByZWxhdGVkICovCisJdm9pZCAoKnN0YV93YWtlX3VwKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnBzX3JlcXVlc3RfdHhfYWNrKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKmVudGVyX3NsZWVwX3N0YXRlKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHRoLCB1MzIgdGwpOworCXNob3J0ICgqcHNfaXNfcXVldWVfZW1wdHkpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwlpbnQgKCpoYW5kbGVfYmVhY29uKSAoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHN0cnVjdCBpZWVlODAyMTFfYmVhY29uICogYmVhY29uLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBuZXR3b3JrKTsKKwlpbnQgKCpoYW5kbGVfYXNzb2NfcmVzcG9uc2UpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqIHJlc3AsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqIG5ldHdvcmspOworCisKKwkvKiBjaGVjayB3aGV0aGVyIFR4IGh3IHJlc291Y2UgYXZhaWxhYmxlICovCisJc2hvcnQgKCpjaGVja19uaWNfZW5vdWdoX2Rlc2MpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBxdWV1ZV9pbmRleCk7CisJLy9hZGRlZCBieSB3YiBmb3IgSFQgcmVsYXRlZAorLy8Jdm9pZCAoKlN3Q2hubEJ5VGltZXJIYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY2hhbm5lbCk7CisJdm9pZCAoKlNldEJXTW9kZUhhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIEhUX0NIQU5ORUxfV0lEVEggQmFuZHdpZHRoLCBIVF9FWFRDSE5MX09GRlNFVCBPZmZzZXQpOworLy8Jdm9pZCAoKlVwZGF0ZUhhbFJBVFJUYWJsZUhhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHU4KiBwTWNzUmF0ZSk7CisJYm9vbCAoKkdldE5tb2RlU3VwcG9ydEJ5U2VjQ2ZnKShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKKwl2b2lkICgqU2V0V2lyZWxlc3NNb2RlKShzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1OCB3aXJlbGVzc19tb2RlKTsKKwlib29sICgqR2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CisJdm9pZCAoKkluaXRpYWxHYWluSGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggT3BlcmF0aW9uKTsKKworCS8qIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCBpdGVtIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBkYXRhCisJICogYWxsb2NhdGVkIGJleW9uZCB0aGlzIHN0cnVjdHVyZSBieSBhbGxvY19pZWVlODAyMTEgKi8KKwl1OCBwcml2WzBdOworfTsKKworI2RlZmluZSBJRUVFX0EgICAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRV9CICAgICAgICAgICAgKDE8PDEpCisjZGVmaW5lIElFRUVfRyAgICAgICAgICAgICgxPDwyKQorI2RlZmluZSBJRUVFX05fMjRHIAkJICAoMTw8NCkKKyNkZWZpbmUJSUVFRV9OXzVHCQkgICgxPDw1KQorI2RlZmluZSBJRUVFX01PREVfTUFTSyAgICAoSUVFRV9BfElFRUVfQnxJRUVFX0cpCisKKy8qIEdlbmVyYXRlIGEgODAyLjExIGhlYWRlciAqLworCisvKiBVc2VzIHRoZSBjaGFubmVsIGNoYW5nZSBjYWxsYmFjayBkaXJlY3RseQorICogaW5zdGVhZCBvZiBbc3RhcnQvc3RvcF0gc2NhbiBjYWxsYmFja3MKKyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfU0NBTiAoMTw8MikKKworLyogUGVyZm9ybSBhdXRoZW50aWNhdGlvbiBhbmQgYXNzb2NpYXRpb24gaGFuZHNoYWtlICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUgKDE8PDMpCisKKy8qIEdlbmVyYXRlIHByb2JlIHJlcXVlc3RzICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19QUk9CRVJRICgxPDw0KQorCisvKiBHZW5lcmF0ZSByZXNwb25lcyB0byBwcm9iZSByZXF1ZXN0cyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfUFJPQkVSUyAoMTw8NSkKKworLyogVGhlIGllZWU4MDIuMTEgc3RhY2sgd2lsbCBtYW5hZ2VzIHRoZSBuZXRpZiBxdWV1ZQorICogd2FrZS9zdG9wIGZvciB0aGUgZHJpdmVyLCB0YWtpbmcgY2FyZSBvZiA4MDIuMTEKKyAqIGZyYWdtZW50YXRpb24uIFNlZSBzb2Z0bWFjLmMgZm9yIGRldGFpbHMuICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19UWF9RVUVVRSAoMTw8NykKKworLyogVXNlcyBvbmx5IHRoZSBzb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0CisgKiBldmVuIGZvciBUWCBtYW5hZ2VtZW50IGZyYW1lcy4KKyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFICgxPDw4KQorCisvKiBHZW5lcmF0ZSBiZWFjb25zLiAgVGhlIHN0YWNrIHdpbGwgZW5xdWV1ZSBiZWFjb25zCisgKiB0byB0aGUgY2FyZAorICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19CRUFDT05TICgxPDw2KQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmllZWU4MDIxMV9wcml2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiluZXRkZXZfcHJpdihkZXYpKS0+cHJpdjsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCBpbnQgZXNzaWRfbGVuKQoreworCS8qIFNpbmdsZSB3aGl0ZSBzcGFjZSBpcyBmb3IgTGlua3N5cyBBUHMgKi8KKwlpZiAoZXNzaWRfbGVuID09IDEgJiYgZXNzaWRbMF0gPT0gJyAnKQorCQlyZXR1cm4gMTsKKworCS8qIE90aGVyd2lzZSwgaWYgdGhlIGVudGlyZSBlc3NpZCBpcyAwLCB3ZSBhc3N1bWUgaXQgaXMgaGlkZGVuICovCisJd2hpbGUgKGVzc2lkX2xlbikgeworCQllc3NpZF9sZW4tLTsKKwkJaWYgKGVzc2lkW2Vzc2lkX2xlbl0gIT0gJ1wwJykKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfaXNfdmFsaWRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IG1vZGUpCit7CisJLyoKKwkgKiBJdCBpcyBwb3NzaWJsZSBmb3IgYm90aCBhY2Nlc3MgcG9pbnRzIGFuZCBvdXIgZGV2aWNlIHRvIHN1cHBvcnQKKwkgKiBjb21iaW5hdGlvbnMgb2YgbW9kZXMsIHNvIGFzIGxvbmcgYXMgdGhlcmUgaXMgb25lIHZhbGlkIGNvbWJpbmF0aW9uCisJICogb2YgYXAvZGV2aWNlIHN1cHBvcnRlZCBtb2RlcywgdGhlbiByZXR1cm4gc3VjY2VzcworCSAqCisJICovCisJaWYgKChtb2RlICYgSUVFRV9BKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCisJICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfNTJHSFpfQkFORCkpCisJCXJldHVybiAxOworCisJaWYgKChtb2RlICYgSUVFRV9HKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCisJICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfMjRHSFpfQkFORCkpCisJCXJldHVybiAxOworCisJaWYgKChtb2RlICYgSUVFRV9CKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV8yNEdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2dldF9oZHJsZW4odTE2IGZjKQoreworCWludCBoZHJsZW4gPSBJRUVFODAyMTFfM0FERFJfTEVOOworCisJc3dpdGNoIChXTEFOX0ZDX0dFVF9UWVBFKGZjKSkgeworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0RBVEE6CisJCWlmICgoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMpICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMpKQorCQkJaGRybGVuID0gSUVFRTgwMjExXzRBRERSX0xFTjsgLyogQWRkcjQgKi8KKwkJaWYoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkKKwkJCWhkcmxlbiArPSAyOyAvKiBRT1MgY3RybCovCisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0NUTDoKKwkJc3dpdGNoIChXTEFOX0ZDX0dFVF9TVFlQRShmYykpIHsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQ1RTOgorCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BQ0s6CisJCQloZHJsZW4gPSBJRUVFODAyMTFfMUFERFJfTEVOOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQloZHJsZW4gPSBJRUVFODAyMTFfMkFERFJfTEVOOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGhkcmxlbjsKK30KKworc3RhdGljIGlubGluZSB1OCAqaWVlZTgwMjExX2dldF9wYXlsb2FkKHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCit7CisJc3dpdGNoIChpZWVlODAyMTFfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpKSB7CisJY2FzZSBJRUVFODAyMTFfMUFERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8xYWRkciAqKWhkciktPnBheWxvYWQ7CisJY2FzZSBJRUVFODAyMTFfMkFERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8yYWRkciAqKWhkciktPnBheWxvYWQ7CisJY2FzZSBJRUVFODAyMTFfM0FERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKWhkciktPnBheWxvYWQ7CisJY2FzZSBJRUVFODAyMTFfNEFERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKWhkciktPnBheWxvYWQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfaXNfb2ZkbV9yYXRlKHU4IHJhdGUpCit7CisJc3dpdGNoIChyYXRlICYgfklFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spIHsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COgorCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV85TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI6CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX2Nja19yYXRlKHU4IHJhdGUpCit7CisJc3dpdGNoIChyYXRlICYgfklFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spIHsKKwljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xTUI6CisJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1COgorCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzVNQjoKKwljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1COgorCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogaWVlZTgwMjExLmMgKi8KK2V4dGVybiB2b2lkIGZyZWVfaWVlZTgwMjExKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICphbGxvY19pZWVlODAyMTEoaW50IHNpemVvZl9wcml2KTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfc2V0X2VuY3J5cHRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCisvKiBpZWVlODAyMTFfdHguYyAqLworCitleHRlcm4gaW50IGllZWU4MDIxMV9lbmNyeXB0X2ZyYWdtZW50KAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCXN0cnVjdCBza19idWZmICpmcmFnLAorCWludCBoZHJfbGVuKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV90eGJfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqKTsKKworCisvKiBpZWVlODAyMTFfcnguYyAqLworZXh0ZXJuIGludCBpZWVlODAyMTFfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cyk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfcnhfbWd0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGVhZGVyLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cyk7CisKKy8qIGllZWU4MDIxMV93eC5jICovCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7CisjaWYgV0lSRUxFU1NfRVhUID49IDE4CitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZW5jb2RlX2V4dChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEqIHdycXUsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSogd3JxdSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2F1dGgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmRhdGEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9tbG1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworI2VuZGlmCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqaWUsIHNpemVfdCBsZW4pOworCisvKiBpZWVlODAyMTFfc29mdG1hYy5jICovCitleHRlcm4gc2hvcnQgaWVlZTgwMjExX2lzXzU0ZyhzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0KTsKK2V4dGVybiBzaG9ydCBpZWVlODAyMTFfaXNfc2hvcnRzbG90KHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpOworZXh0ZXJuIGludCBpZWVlODAyMTFfcnhfZnJhbWVfc29mdG1hYyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzLCB1MTYgdHlwZSwKKwkJCXUxNiBzdHlwZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCk7CisKK3ZvaWQgU2VuZERpc2Fzc29jaWF0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCogYXNTdGEsIHU4IGFzUnNuKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3htaXQoc3RydWN0IGllZWU4MDIxMV90eGIgKnR4Yiwgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgbm90aWZ5X3d4X2Fzc29jX2V2ZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X21hc3Rlcl9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19mcmVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfY2hlY2tfYWxsX25ldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV93YWtlX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19wb2ludCAqcCk7CitleHRlcm4gdm9pZCBub3RpZnlfd3hfYXNzb2NfZXZlbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3BzX3R4X2FjayhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgc3VjY2Vzcyk7CisKK2V4dGVybiB2b2lkIHNvZnRtYWNfbWdtdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKworLyogaWVlZTgwMjExX2NyeXB0X2NjbXAmdGtpcCZ3ZXAuYyAqLworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3RraXBfbnVsbCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV93ZXBfbnVsbCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jY21wX251bGwodm9pZCk7CisKKy8qIGllZWU4MDIxMV9zb2Z0bWFjX3d4LmMgKi8KKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3dhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dCk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF93YXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSB1bmlvbiBpd3JlcV9kYXRhICphd3JxLAorCQkJIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLHVuaW9uIGl3cmVxX2RhdGEgKndycXUsY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9mcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2ZyZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCisvL2V4dGVybiB2b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXd0eChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X25hbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfcnRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9ydHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKy8vSFQKKyNkZWZpbmUgTUFYX1JFQ0VJVkVfQlVGRkVSX1NJWkUgOTEwMCAgLy8KK2V4dGVybiB2b2lkIEhURGVidWdIVENhcGFiaWxpdHkodTgqIENhcElFLCB1OCogVGl0bGVTdHJpbmcgKTsKK2V4dGVybiB2b2lkIEhURGVidWdIVEluZm8odTgqICBJbmZvSUUsIHU4KiBUaXRsZVN0cmluZyk7CisKK3ZvaWQgSFRTZXRDb25uZWN0QndNb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBIVF9DSEFOTkVMX1dJRFRIIEJhbmR3aWR0aCwgSFRfRVhUQ0hOTF9PRkZTRVQgICAgT2Zmc2V0KTsKK2V4dGVybiB2b2lkIEhUVXBkYXRlRGVmYXVsdFNldHRpbmcoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpOworZXh0ZXJuIHZvaWQgSFRDb25zdHJ1Y3RDYXBhYmlsaXR5RWxlbWVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIHBvc0hUQ2FwLCB1OCogbGVuLCB1OCBpc0VuY3J5cHQpOworZXh0ZXJuIHZvaWQgSFRDb25zdHJ1Y3RJbmZvRWxlbWVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIHBvc0hUSW5mbywgdTgqIGxlbiwgdTggaXNFbmNyeXB0KTsKK2V4dGVybiB2b2lkIEhUQ29uc3RydWN0UlQyUlRBZ2dFbGVtZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcG9zUlQyUlRBZ2csIHU4KiBsZW4pOworZXh0ZXJuIHZvaWQgSFRPbkFzc29jUnNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIEhUSW5pdGlhbGl6ZUhUSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSk7CitleHRlcm4gdm9pZCBIVEluaXRpYWxpemVCc3NEZXNjKFBCU1NfSFQgcEJzc0hUKTsKK2V4dGVybiB2b2lkIEhUUmVzZXRTZWxmQW5kU2F2ZVBlZXJTZXR0aW5nKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBwTmV0d29yayk7CitleHRlcm4gdm9pZCBIVFVwZGF0ZVNlbGZBbmRQZWVyU2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBwTmV0d29yayk7CitleHRlcm4gdTggSFRHZXRIaWdoZXN0TUNTUmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIHBNQ1NSYXRlU2V0LCB1OCogcE1DU0ZpbHRlcik7CitleHRlcm4gdTggTUNTX0ZJTFRFUl9BTExbXTsKK2V4dGVybiB1MTYgTUNTX0RBVEFfUkFURVsyXVsyXVs3N10gOworZXh0ZXJuIHU4IEhUQ0NoZWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogICBwRnJhbWUpOworLy9leHRlcm4gdm9pZCBIVFNldENvbm5lY3RCd01vZGVDYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOworZXh0ZXJuIHZvaWQgSFRSZXNldElPVFNldHRpbmcoUFJUX0hJR0hfVEhST1VHSFBVVCAgcEhUSW5mbyk7CitleHRlcm4gYm9vbCBJc0hUSGFsZk5tb2RlQVBzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKTsKK2V4dGVybiB1MTYgSFRIYWxmTWNzVG9EYXRhUmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgIHU4ICAgICAgbk1jc1JhdGUpOworZXh0ZXJuIHUxNiBIVE1jc1RvRGF0YVJhdGUoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCBuTWNzUmF0ZSk7CitleHRlcm4gdTE2ICBUeENvdW50VG9EYXRhUmF0ZSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4IG5EYXRhUmF0ZSk7CisvL2Z1bmN0aW9uIGluIEJBUFJPQy5jCitleHRlcm4gaW50IGllZWU4MDIxMV9yeF9BRERCQVJlcSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIGludCBpZWVlODAyMTFfcnhfQUREQkFSc3AoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3J4X0RFTEJBKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIHZvaWQgVHNJbml0QWRkQkEoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBQVFhfVFNfUkVDT1JEICAgcFRTLCB1OCBQb2xpY3ksIHU4IGJPdmVyd3JpdGVQZW5kaW5nKTsKK2V4dGVybiB2b2lkIFRzSW5pdERlbEJBKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgUFRTX0NPTU1PTl9JTkZPIHBUc0NvbW1vbkluZm8sIFRSX1NFTEVDVCBUeFJ4U2VsZWN0KTsKK2V4dGVybiB2b2lkIEJhU2V0dXBUaW1lT3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gdm9pZCBUeEJhSW5hY3RUaW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gdm9pZCBSeEJhSW5hY3RUaW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gdm9pZCBSZXNldEJhRW50cnkoIFBCQV9SRUNPUkQgcEJBKTsKKy8vZnVuY3Rpb24gaW4gVFMuYworZXh0ZXJuIGJvb2wgR2V0VHMoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqICAgICAgICBpZWVlLAorCVBUU19DT01NT05fSU5GTyAgICAgICAgICAgICAgICAgKnBwVFMsCisJdTgqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyLAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElELAorCVRSX1NFTEVDVCAgICAgICAgICAgICAgICAgICAgICAgVHhSeFNlbGVjdCwgIC8vUng6MSwgVHg6MAorCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFkZE5ld1RzCisJKTsKK2V4dGVybiB2b2lkIFRTSW5pdGlhbGl6ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gIHZvaWQgVHNTdGFydEFkZEJhUHJvY2VzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgUFRYX1RTX1JFQ09SRCAgIHBUeFRTKTsKK2V4dGVybiB2b2lkIFJlbW92ZVBlZXJUUyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIEFkZHIpOworZXh0ZXJuIHZvaWQgUmVtb3ZlQWxsVFMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpOwordm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKK2V4dGVybiBjb25zdCBsb25nIGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzW107CisKK2V4dGVybiBpbmxpbmUgdm9pZCBpZWVlODAyMTFfaW5jcmVtZW50X3NjYW5zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWllZWUtPnNjYW5zKys7Cit9CisKK2V4dGVybiBpbmxpbmUgaW50IGllZWU4MDIxMV9nZXRfc2NhbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJcmV0dXJuIGllZWUtPnNjYW5zOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmVzY2FwZV9lc3NpZChjb25zdCBjaGFyICplc3NpZCwgdTggZXNzaWRfbGVuKSB7CisJc3RhdGljIGNoYXIgZXNjYXBlZFtJV19FU1NJRF9NQVhfU0laRSAqIDIgKyAxXTsKKwljb25zdCBjaGFyICpzID0gZXNzaWQ7CisJY2hhciAqZCA9IGVzY2FwZWQ7CisKKwlpZiAoaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGVzc2lkLCBlc3NpZF9sZW4pKSB7CisJCW1lbWNweShlc2NhcGVkLCAiPGhpZGRlbj4iLCBzaXplb2YoIjxoaWRkZW4+IikpOworCQlyZXR1cm4gZXNjYXBlZDsKKwl9CisKKwllc3NpZF9sZW4gPSBtaW4oZXNzaWRfbGVuLCAodTgpSVdfRVNTSURfTUFYX1NJWkUpOworCXdoaWxlIChlc3NpZF9sZW4tLSkgeworCQlpZiAoKnMgPT0gJ1wwJykgeworCQkJKmQrKyA9ICdcXCc7CisJCQkqZCsrID0gJzAnOworCQkJcysrOworCQl9IGVsc2UgeworCQkJKmQrKyA9ICpzKys7CisJCX0KKwl9CisJKmQgPSAnXDAnOworCXJldHVybiBlc2NhcGVkOworfQorCisvKiBGb3IgdGhlIGZ1bmN0aW9uIGlzIG1vcmUgcmVsYXRlZCB0byBoYXJkd2FyZSBzZXR0aW5nLCBpdCdzIGJldHRlciB0byB1c2UgdGhlCisgKiBpZWVlIGhhbmRsZXIgdG8gcmVmZXIgdG8gaXQuCisgKi8KK2V4dGVybiBzaG9ydCBjaGVja19uaWNfZW5vdWdoX2Rlc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHF1ZXVlX2luZGV4KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX2RhdGFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3BhcnNlX2luZm9fcGFyYW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQsCisJCXUxNiBsZW5ndGgsCisJCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaywKKwkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpOworCit2b2lkIGllZWU4MDIxMV9pbmRpY2F0ZV9wYWNrZXRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX3J4YioqIHByeGJJbmRpY2F0ZUFycmF5LHU4ICBpbmRleCk7CisjZGVmaW5lIFJUX0FTT0NfUkVUUllfTElNSVQJNQorI2VuZGlmIC8qIElFRUU4MDIxMV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL0VuZGlhbkZyZWUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvRW5kaWFuRnJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjODVmYjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL0VuZGlhbkZyZWUuaApAQCAtMCwwICsxLDE5NCBAQAorI2lmbmRlZiBfX0lOQ19FTkRJQU5GUkVFX0gKKyNkZWZpbmUgX19JTkNfRU5ESUFORlJFRV9ICisKKy8qCisgKglDYWxsIGVuZGlhbiBmcmVlIGZ1bmN0aW9uIHdoZW4KKyAqCQkxLiBSZWFkL3dyaXRlIHBhY2tldCBjb250ZW50LgorICoJCTIuIEJlZm9yZSB3cml0ZSBpbnRlZ2VyIHRvIElPLgorICoJCTMuIEFmdGVyIHJlYWQgaW50ZWdlciBmcm9tIElPLgorICovCisKKyNkZWZpbmUgX19NQUNISU5FX0xJVFRMRV9FTkRJQU4gMTIzNCAgICAvKiBMU0IgZmlyc3Q6IGkzODYsIHZheCAqLworI2RlZmluZSBfX01BQ0hJTkVfQklHX0VORElBTiAgICA0MzIxICAgIC8qIE1TQiBmaXJzdDogNjgwMDAsIGlibSwgbmV0LCBwcGMgKi8KKworI2RlZmluZSBCWVRFX09SREVSIF9fTUFDSElORV9MSVRUTEVfRU5ESUFOCisKKyNpZiBCWVRFX09SREVSID09IF9fTUFDSElORV9MSVRUTEVfRU5ESUFOCisvLyBDb252ZXJ0IGRhdGEKKyNkZWZpbmUgRUYxQnl0ZShfdmFsKQkJCQkoKHU4KShfdmFsKSkKKyNkZWZpbmUgRUYyQnl0ZShfdmFsKQkJCQkoKHUxNikoX3ZhbCkpCisjZGVmaW5lIEVGNEJ5dGUoX3ZhbCkJCQkJKCh1MzIpKF92YWwpKQorCisjZWxzZQorLy8gQ29udmVydCBkYXRhCisjZGVmaW5lIEVGMUJ5dGUoX3ZhbCkJCQkJKCh1OCkoX3ZhbCkpCisjZGVmaW5lIEVGMkJ5dGUoX3ZhbCkJCQkJKCgoKCh1MTYpKF92YWwpKSYweDAwZmYpPDw4KXwoKCgodTE2KShfdmFsKSkmMHhmZjAwKT4+OCkpCisjZGVmaW5lIEVGNEJ5dGUoX3ZhbCkJCQkJKCgoKCh1MzIpKF92YWwpKSYweDAwMDAwMGZmKTw8MjQpfFwKKwkJCQkJCSgoKCh1MzIpKF92YWwpKSYweDAwMDBmZjAwKTw8OCl8XAorCQkJCQkJKCgoKHUzMikoX3ZhbCkpJjB4MDBmZjAwMDApPj44KXxcCisJCQkJCQkoKCgodTMyKShfdmFsKSkmMHhmZjAwMDAwMCk+PjI0KSkKKyNlbmRpZgorCisvLyBSZWFkIGRhdGEgZnJvbSBtZW1vcnkKKyNkZWZpbmUgUmVhZEVGMUJ5dGUoX3B0cikJCUVGMUJ5dGUoKigodTggKikoX3B0cikpKQorI2RlZmluZSBSZWFkRUYyQnl0ZShfcHRyKQkJRUYyQnl0ZSgqKCh1MTYgKikoX3B0cikpKQorI2RlZmluZSBSZWFkRUY0Qnl0ZShfcHRyKQkJRUY0Qnl0ZSgqKCh1MzIgKikoX3B0cikpKQorCisvLyBXcml0ZSBkYXRhIHRvIG1lbW9yeQorI2RlZmluZSBXcml0ZUVGMUJ5dGUoX3B0ciwgX3ZhbCkJKCooKHU4ICopKF9wdHIpKSk9RUYxQnl0ZShfdmFsKQorI2RlZmluZSBXcml0ZUVGMkJ5dGUoX3B0ciwgX3ZhbCkJKCooKHUxNiAqKShfcHRyKSkpPUVGMkJ5dGUoX3ZhbCkKKyNkZWZpbmUgV3JpdGVFRjRCeXRlKF9wdHIsIF92YWwpCSgqKCh1MzIgKikoX3B0cikpKT1FRjRCeXRlKF92YWwpCisvLyBDb252ZXJ0IEhvc3Qgc3lzdGVtIHNwZWNpZmljIGJ5dGUgb3JkaW5nIChsaXR0ZW4gb3IgYmlnIGVuZGlhKSB0byBOZXR3b3JrIGJ5dGUgb3JkaW5nIChiaWcgZW5kaWFuKS4KKy8vIDIwMDYuMDUuMDcsIGJ5IHJjbmprby4KKyNpZiBCWVRFX09SREVSID09IF9fTUFDSElORV9MSVRUTEVfRU5ESUFOCisjZGVmaW5lIEgyTjFCWVRFKF92YWwpCSgodTgpKF92YWwpKQorI2RlZmluZSBIMk4yQllURShfdmFsKQkoKCgoKHUxNikoX3ZhbCkpJjB4MDBmZik8PDgpfFwKKwkJCSgoKCh1MTYpKF92YWwpKSYweGZmMDApPj44KSkKKyNkZWZpbmUgSDJONEJZVEUoX3ZhbCkJKCgoKCh1MzIpKF92YWwpKSYweDAwMDAwMGZmKTw8MjQpfFwKKwkJCSgoKCh1MzIpKF92YWwpKSYweDAwMDBmZjAwKTw8OCkJfFwKKwkJCSgoKCh1MzIpKF92YWwpKSYweDAwZmYwMDAwKT4+OCkJfFwKKwkJCSgoKCh1MzIpKF92YWwpKSYweGZmMDAwMDAwKT4+MjQpKQorI2Vsc2UKKyNkZWZpbmUgSDJOMUJZVEUoX3ZhbCkJCQkoKHU4KShfdmFsKSkKKyNkZWZpbmUgSDJOMkJZVEUoX3ZhbCkJCQkoKHUxNikoX3ZhbCkpCisjZGVmaW5lIEgyTjRCWVRFKF92YWwpCQkJKCh1MzIpKF92YWwpKQorI2VuZGlmCisKKy8vIENvbnZlcnQgZnJvbSBOZXR3b3JrIGJ5dGUgb3JkaW5nIChiaWcgZW5kaWFuKSB0byBIb3N0IHN5c3RlbSBzcGVjaWZpYyBieXRlIG9yZGluZyAobGl0dGVuIG9yIGJpZyBlbmRpYSkuCisvLyAyMDA2LjA1LjA3LCBieSByY25qa28uCisjaWYgQllURV9PUkRFUiA9PSBfX01BQ0hJTkVfTElUVExFX0VORElBTgorI2RlZmluZSBOMkgxQllURShfdmFsKQkoKHU4KShfdmFsKSkKKyNkZWZpbmUgTjJIMkJZVEUoX3ZhbCkJKCgoKCh1MTYpKF92YWwpKSYweDAwZmYpPDw4KXxcCisJCQkoKCgodTE2KShfdmFsKSkmMHhmZjAwKT4+OCkpCisjZGVmaW5lIE4ySDRCWVRFKF92YWwpCSgoKCgodTMyKShfdmFsKSkmMHgwMDAwMDBmZik8PDI0KXxcCisJCQkoKCgodTMyKShfdmFsKSkmMHgwMDAwZmYwMCk8PDgpCXxcCisJCQkoKCgodTMyKShfdmFsKSkmMHgwMGZmMDAwMCk+PjgpCXxcCisJCQkoKCgodTMyKShfdmFsKSkmMHhmZjAwMDAwMCk+PjI0KSkKKyNlbHNlCisjZGVmaW5lIE4ySDFCWVRFKF92YWwpCQkJKCh1OCkoX3ZhbCkpCisjZGVmaW5lIE4ySDJCWVRFKF92YWwpCQkJKCh1MTYpKF92YWwpKQorI2RlZmluZSBOMkg0QllURShfdmFsKQkJCSgodTMyKShfdmFsKSkKKyNlbmRpZgorCisvLworLy8JRXhhbXBsZToKKy8vCQlCSVRfTEVOX01BU0tfMzIoMCkgPT4gMHgwMDAwMDAwMAorLy8JCUJJVF9MRU5fTUFTS18zMigxKSA9PiAweDAwMDAwMDAxCisvLwkJQklUX0xFTl9NQVNLXzMyKDIpID0+IDB4MDAwMDAwMDMKKy8vCQlCSVRfTEVOX01BU0tfMzIoMzIpID0+IDB4RkZGRkZGRkYKKy8vCisjZGVmaW5lIEJJVF9MRU5fTUFTS18zMihfX0JpdExlbikgKDB4RkZGRkZGRkYgPj4gKDMyIC0gKF9fQml0TGVuKSkpCisvLworLy8JRXhhbXBsZToKKy8vCQlCSVRfT0ZGU0VUX0xFTl9NQVNLXzMyKDAsIDIpID0+IDB4MDAwMDAwMDMKKy8vCQlCSVRfT0ZGU0VUX0xFTl9NQVNLXzMyKDE2LCAyKSA9PiAweDAwMDMwMDAwCisvLworI2RlZmluZSBCSVRfT0ZGU0VUX0xFTl9NQVNLXzMyKF9fQml0T2Zmc2V0LCBfX0JpdExlbikgKEJJVF9MRU5fTUFTS18zMihfX0JpdExlbikgPDwgKF9fQml0T2Zmc2V0KSkKKworLy8KKy8vCURlc2NyaXB0aW9uOgorLy8JCVJldHVybiA0LWJ5dGUgdmFsdWUgaW4gaG9zdCBieXRlIG9yZGVyaW5nIGZyb20KKy8vCQk0LWJ5dGUgcG9pbnRlciBpbiBsaXR0ZW4tZW5kaWFuIHN5c3RlbS4KKy8vCisjZGVmaW5lIExFX1A0QllURV9UT19IT1NUXzRCWVRFKF9fcFN0YXJ0KSAoRUY0Qnl0ZSgqKCh1MzIgKikoX19wU3RhcnQpKSkpCisKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlUcmFuc2xhdGUgc3ViZmllbGQgKGNvbnRpbnVvdXMgYml0cyBpbiBsaXR0bGUtZW5kaWFuKSBvZiA0LWJ5dGUgdmFsdWUgaW4gbGl0dGVuIGJ5dGUgdG8KKy8vCQk0LWJ5dGUgdmFsdWUgaW4gaG9zdCBieXRlIG9yZGVyaW5nLgorLy8KKyNkZWZpbmUgTEVfQklUU19UT180QllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCisJKCBcCisJICAoIExFX1A0QllURV9UT19IT1NUXzRCWVRFKF9fcFN0YXJ0KSA+PiAoX19CaXRPZmZzZXQpICkgXAorCSAgJiBcCisJICBCSVRfTEVOX01BU0tfMzIoX19CaXRMZW4pIFwKKwkpCisKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlNYXNrIHN1YmZpZWxkIChjb250aW51b3VzIGJpdHMgaW4gbGl0dGxlLWVuZGlhbikgb2YgNC1ieXRlIHZhbHVlIGluIGxpdHRlbiBieXRlIG9yZWRlcmluZworLy8JCWFuZCByZXR1cm4gdGhlIHJlc3VsdCBpbiA0LWJ5dGUgdmFsdWUgaW4gaG9zdCBieXRlIG9yZGVyaW5nLgorLy8KKyNkZWZpbmUgTEVfQklUU19DTEVBUkVEX1RPXzRCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKKwkoIFwKKwkgIExFX1A0QllURV9UT19IT1NUXzRCWVRFKF9fcFN0YXJ0KSBcCisJICAmIFwKKwkgICggfkJJVF9PRkZTRVRfTEVOX01BU0tfMzIoX19CaXRPZmZzZXQsIF9fQml0TGVuKSApIFwKKwkpCisKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlTZXQgc3ViZmllbGQgb2YgbGl0dGxlLWVuZGlhbiA0LWJ5dGUgdmFsdWUgdG8gc3BlY2lmaWVkIHZhbHVlLgorLy8KKyNkZWZpbmUgU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbiwgX19WYWx1ZSkgXAorCSooKHUzMiAqKShfX3BTdGFydCkpID0gXAorCUVGNEJ5dGUoIFwKKwlMRV9CSVRTX0NMRUFSRURfVE9fNEJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAorCXwgXAorCSggKCgodTMyKV9fVmFsdWUpICYgQklUX0xFTl9NQVNLXzMyKF9fQml0TGVuKSkgPDwgKF9fQml0T2Zmc2V0KSApIFwKKyAgICAgICApOworCisKKyNkZWZpbmUgQklUX0xFTl9NQVNLXzE2KF9fQml0TGVuKSBcCisJKDB4RkZGRiA+PiAoMTYgLSAoX19CaXRMZW4pKSkKKworI2RlZmluZSBCSVRfT0ZGU0VUX0xFTl9NQVNLXzE2KF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAorCShCSVRfTEVOX01BU0tfMTYoX19CaXRMZW4pIDw8IChfX0JpdE9mZnNldCkpCisKKyNkZWZpbmUgTEVfUDJCWVRFX1RPX0hPU1RfMkJZVEUoX19wU3RhcnQpIFwKKwkoRUYyQnl0ZSgqKCh1MTYgKikoX19wU3RhcnQpKSkpCisKKyNkZWZpbmUgTEVfQklUU19UT18yQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCisJKCBcCisJICAoIExFX1AyQllURV9UT19IT1NUXzJCWVRFKF9fcFN0YXJ0KSA+PiAoX19CaXRPZmZzZXQpICkgXAorCSAgJiBcCisJICBCSVRfTEVOX01BU0tfMTYoX19CaXRMZW4pIFwKKwkpCisKKyNkZWZpbmUgTEVfQklUU19DTEVBUkVEX1RPXzJCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKKwkoIFwKKwkgIExFX1AyQllURV9UT19IT1NUXzJCWVRFKF9fcFN0YXJ0KSBcCisJICAmIFwKKwkgICggfkJJVF9PRkZTRVRfTEVOX01BU0tfMTYoX19CaXRPZmZzZXQsIF9fQml0TGVuKSApIFwKKwkpCisKKyNkZWZpbmUgU0VUX0JJVFNfVE9fTEVfMkJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbiwgX19WYWx1ZSkgXAorCSooKHUxNiAqKShfX3BTdGFydCkpID0gXAorCUVGMkJ5dGUoIFwKKwkJTEVfQklUU19DTEVBUkVEX1RPXzJCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKKwkJfCBcCisJCSggKCgodTE2KV9fVmFsdWUpICYgQklUX0xFTl9NQVNLXzE2KF9fQml0TGVuKSkgPDwgKF9fQml0T2Zmc2V0KSApIFwKKyAgICAgICApOworCisjZGVmaW5lIEJJVF9MRU5fTUFTS184KF9fQml0TGVuKSBcCisJKDB4RkYgPj4gKDggLSAoX19CaXRMZW4pKSkKKworI2RlZmluZSBCSVRfT0ZGU0VUX0xFTl9NQVNLXzgoX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCisJKEJJVF9MRU5fTUFTS184KF9fQml0TGVuKSA8PCAoX19CaXRPZmZzZXQpKQorCisjZGVmaW5lIExFX1AxQllURV9UT19IT1NUXzFCWVRFKF9fcFN0YXJ0KSBcCisJKEVGMUJ5dGUoKigodTggKikoX19wU3RhcnQpKSkpCisKKyNkZWZpbmUgTEVfQklUU19UT18xQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCisJKCBcCisJICAoIExFX1AxQllURV9UT19IT1NUXzFCWVRFKF9fcFN0YXJ0KSA+PiAoX19CaXRPZmZzZXQpICkgXAorCSAgJiBcCisJICBCSVRfTEVOX01BU0tfOChfX0JpdExlbikgXAorCSkKKworI2RlZmluZSBMRV9CSVRTX0NMRUFSRURfVE9fMUJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAorCSggXAorCSAgTEVfUDFCWVRFX1RPX0hPU1RfMUJZVEUoX19wU3RhcnQpIFwKKwkgICYgXAorCSAgKCB+QklUX09GRlNFVF9MRU5fTUFTS184KF9fQml0T2Zmc2V0LCBfX0JpdExlbikgKSBcCisJKQorCisjZGVmaW5lIFNFVF9CSVRTX1RPX0xFXzFCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4sIF9fVmFsdWUpIFwKKwkqKCh1OCAqKShfX3BTdGFydCkpID0gXAorCUVGMUJ5dGUoIFwKKwkJTEVfQklUU19DTEVBUkVEX1RPXzFCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKKwkJfCBcCisJCSggKCgodTgpX19WYWx1ZSkgJiBCSVRfTEVOX01BU0tfOChfX0JpdExlbikpIDw8IChfX0JpdE9mZnNldCkgKSBcCisgICAgICAgKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX19JTkNfRU5ESUFORlJFRV9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWNhNWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9NYWtlZmlsZQpAQCAtMCwwICsxLDEzOSBAQAorTklDX1NFTEVDVCA9IFJUTDgxOTJVCisKK0tWRVIgIDo9ICQoc2hlbGwgdW5hbWUgLXIpCitNT0RERVNURElSIDo9IC9saWIvbW9kdWxlcy8kKEtWRVIpL2tlcm5lbC9kcml2ZXJzL25ldC93aXJlbGVzcy8kKE5JQ19TRUxFQ1QpCisKK0NDID0gZ2NjCitpZm5lcSAoJChzaGVsbCB1bmFtZSAtcnxjdXQgLWQuIC1mMSwyKSwgMi40KQorRVhUUkFfQ0ZMQUdTICs9IC1JJChUT1BESVIpL2RyaXZlcnMvbmV0L3dpcmVsZXNzCitFWFRSQV9DRkxBR1MgKz0gLU8yCitFWFRSQV9DRkxBR1MgKz0gLURKQUNLU09OX05FV184MTg3IC1ESkFDS1NPTl9ORVdfUlgKKworI2l0IHdpbGwgZmFpbCB0byBjb21waWxlIGluIHN1c2UgbGludXggZW50ZXJwcmlzZSAxMCBzcDIuIFRoaXMgZmxhZyBpcyB0byBzb2x2ZSB0aGlzIHByb2JsZW0uCitpZmVxICgkKHNoZWxsIHVuYW1lIC1yIHwgY3V0IC1kLiAtZjEsMiwzLDQpLCAyLjYuMTYuNjAtMCkKK0VYVFJBX0NGTEFHUyArPSAtRE9QRU5TVVNFX1NMRUQKK2VuZGlmCisKK2lmZXEgKCQoTklDX1NFTEVDVCksUlRMODE5MlUpCisjRVhUUkFfQ0ZMQUdTICs9IC1EVVNCX1RYX0RSSVZFUl9BR0dSRUdBVElPTl9FTkFCTEUKKyNFWFRSQV9DRkxBR1MgKz0gLURVU0JfUlhfQUdHUkVHQVRJT05fU1VQUE9SVAorZW5kaWYKKyNFWFRSQV9DRkxBR1MgKz0gLURKT0hOX05PQ1BZCisjZmxhZ3MgdG8gZW5hYmxlIG9yIGRpc2JsZSA4MDIxMUQgZmVhdHVyZQorRVhUUkFfQ0ZMQUdTICs9IC1ERU5BQkxFX0RPVDExRAoraWVlZTgwMjExLXJzbC1vYmpzIDo9IGllZWU4MDIxMV9yeC5vIFwKKwkJICAgICAgaWVlZTgwMjExX3NvZnRtYWMubyBcCisJCSAgICAgIGllZWU4MDIxMV90eC5vIFwKKwkJICAgICAgaWVlZTgwMjExX3d4Lm8gXAorCQkgICAgICBpZWVlODAyMTFfbW9kdWxlLm8gXAorCQkgICAgICBpZWVlODAyMTFfc29mdG1hY193eC5vXAorCQkgICAgICBydGw4MTl4X0hUUHJvYy5vXAorCQkgICAgICBydGw4MTl4X1RTUHJvYy5vXAorCQkgICAgICBydGw4MTl4X0JBUHJvYy5vXAorCQkgICAgICBkb3QxMWQubworCitpZWVlODAyMTFfY3J5cHQtcnNsLW9ianMgOj0gaWVlZTgwMjExX2NyeXB0Lm8KK2llZWU4MDIxMV9jcnlwdF90a2lwLXJzbC1vYmpzIDo9IGllZWU4MDIxMV9jcnlwdF90a2lwLm8KK2llZWU4MDIxMV9jcnlwdF9jY21wLXJzbC1vYmpzIDo9IGllZWU4MDIxMV9jcnlwdF9jY21wLm8KK2llZWU4MDIxMV9jcnlwdF93ZXAtcnNsLW9ianMgOj0gaWVlZTgwMjExX2NyeXB0X3dlcC5vCisKK29iai1tICs9aWVlZTgwMjExLXJzbC5vCitvYmotbSArPWllZWU4MDIxMV9jcnlwdC1yc2wubworb2JqLW0gKz1pZWVlODAyMTFfY3J5cHRfd2VwLXJzbC5vCitvYmotbSArPWllZWU4MDIxMV9jcnlwdF90a2lwLXJzbC5vCitvYmotbSArPWllZWU4MDIxMV9jcnlwdF9jY21wLXJzbC5vCisKK0tTUkMgOj0gL2xpYi9tb2R1bGVzLyQoS1ZFUikvYnVpbGQKK0lOU1RBTExfUFJFRklYIDo9CisKK2FsbDogbW9kdWxlcworCittb2R1bGVzOgorCSQoTUFLRSkgLUMgJChLU1JDKSBNPSQoUFdEKSBDQz0kKENDKSBtb2R1bGVzCisKK2luc3RhbGw6IG1vZHVsZXMKKwlybSAtZnIgJChNT0RERVNURElSKQorCW1rZGlyIC1wICQoTU9EREVTVERJUikKKwlAaW5zdGFsbCAtcCAtbSA2NDQgaWVlZTgwMjExX2NyeXB0LXJzbC5rbyAkKE1PRERFU1RESVIpCisJQGluc3RhbGwgLXAgLW0gNjQ0IGllZWU4MDIxMV9jcnlwdF93ZXAtcnNsLmtvICQoTU9EREVTVERJUikKKwlAaW5zdGFsbCAtcCAtbSA2NDQgaWVlZTgwMjExX2NyeXB0X3RraXAtcnNsLmtvICQoTU9EREVTVERJUikKKwlAaW5zdGFsbCAtcCAtbSA2NDQgaWVlZTgwMjExX2NyeXB0X2NjbXAtcnNsLmtvICQoTU9EREVTVERJUikKKwlAaW5zdGFsbCAtcCAtbSA2NDQgaWVlZTgwMjExLXJzbC5rbyAkKE1PRERFU1RESVIpCisJZGVwbW9kIC1hCit1bmluc3RhbGw6CisJcm0gLWZyICQoTU9EREVTVERJUikKKwlkZXBtb2QgLWEKKworZWxzZQorTEQgOj0gbGQKK0tTUkMgOj0gL2xpYi9tb2R1bGVzLyQoS1ZFUikvYnVpbGQKK0NPTkZJR19GSUxFIDo9ICQoS1NSQykvaW5jbHVkZS9saW51eC9hdXRvY29uZi5oCisKK0NGTEFHUyArPSAtRExJTlVYIC1EX19LRVJORUxfXyAtRE1PRFVMRSAtTzIgLXBpcGUgLVdhbGwKK0NGTEFHUyArPSAtSSQoS1NSQykvaW5jbHVkZSAtSS4KKyNLZXJuZWwgMi40LjMxCitDRkxBR1MgKz0gLURNT0RWRVJTSU9OUyAtREVYUE9SVF9TWU1UQUIgLWluY2x1ZGUgJChLU1JDKS9pbmNsdWRlL2xpbnV4L21vZHZlcnNpb25zLmgKKyNLZXJuZWwgMi40LjIwCisjQ0ZMQUdTICs9IC1EX19OT19WRVJTSU9OX18gLURFWFBPUlRfU1lNVEFCCisjQ0ZMQUdTICs9IC1ERU5BQkxFX0RPVDExRAorU01QIDo9ICQoc2hlbGwgJChDQykgJChNT0RDRkxBR1MpIC1FIC1kTSAkKENPTkZJR19GSUxFKSB8IFwKKyAgIGdyZXAgQ09ORklHX1NNUCB8IGF3ayAne3ByaW50ICQkM30nKQoraWZuZXEgKCQoU01QKSwxKQorICAgU01QIDo9IDAKK2VuZGlmCitpZmVxICgkKFNNUCksMSkKKyAgIENGTEFHUyAgICArPSAtRF9fU01QX18KK2VuZGlmCisKKyNDRkxBR1MgKz0gLURKT0hOX05PQ1BZCisKK09CSlMgOj0gJHtwYXRzdWJzdCAlLmMsICUubywgJHt3aWxkY2FyZCAqLmN9fQorYWxsOiR7T0JKU30gaWVlZTgwMjExX2NyeXB0LXJzbC5vIG1pY2hhZWxfbWljLXJzbC5vIGFlcy1yc2wubyBpZWVlODAyMTFfY3J5cHRfd2VwLXJzbC5vIGllZWU4MDIxMV9jcnlwdF90a2lwLXJzbC5vIGllZWU4MDIxMV9jcnlwdF9jY21wLXJzbC5vIGNyeXB0by1yc2wubyBpZWVlODAyMTEtcnNsLm8KKworaWVlZTgwMjExX2NyeXB0LXJzbC5vOiBpZWVlODAyMTFfY3J5cHQubworCW12ICReICRACisKK21pY2hhZWxfbWljLXJzbC5vOiBtaWNoYWVsX21pYy5vCisJbXYgJF4gJEAKKworYWVzLXJzbC5vOiBhZXMubworCW12ICReICRACisKK2llZWU4MDIxMV9jcnlwdF93ZXAtcnNsLm86IGllZWU4MDIxMV9jcnlwdF93ZXAubworCW12ICReICRACisKK2llZWU4MDIxMV9jcnlwdF90a2lwLXJzbC5vOiBpZWVlODAyMTFfY3J5cHRfdGtpcC5vCisJbXYgJF4gJEAKKworaWVlZTgwMjExX2NyeXB0X2NjbXAtcnNsLm86IGllZWU4MDIxMV9jcnlwdF9jY21wLm8KKwltdiAkXiAkQAorCitjcnlwdG8tcnNsLm86IGFyYzQubyBhcGkubyBhdXRvbG9hZC5vIGNpcGhlci5vIGNvbXByZXNzLm8gZGlnZXN0Lm8gc2NhdHRlcndhbGsubyBwcm9jLm8KKwkkKExEKSAtciAkXiAtbyAkQAorCitpZWVlODAyMTEtcnNsLm86IGllZWU4MDIxMV9yeC5vIGllZWU4MDIxMV90eC5vIGllZWU4MDIxMV93eC5vIGllZWU4MDIxMV9tb2R1bGUubyBpZWVlODAyMTFfc29mdG1hY193eC5vIGllZWU4MDIxMV9zb2Z0bWFjLm8gcnRsODE5eF9IVFByb2MubyBydGw4MTl4X1RTUHJvYy5vIHJ0bDgxOXhfQkFQcm9jLm8gZG90MTFkLm8KKwkkKExEKSAtciAkXiAtbyAkQAoraW5zdGFsbDoKKwlybSAtZnIgJChNT0RERVNURElSKQorCW1rZGlyIC1wICQoTU9EREVTVERJUikKKwlAaW5zdGFsbCAtcCAtbSA2NDQgaWVlZTgwMjExX2NyeXB0LXJzbC5vICQoTU9EREVTVERJUikKKwlAaW5zdGFsbCAtcCAtbSA2NDQgY3J5cHRvLXJzbC5vICQoTU9EREVTVERJUikKKwlAaW5zdGFsbCAtcCAtbSA2NDQgbWljaGFlbF9taWMtcnNsLm8gJChNT0RERVNURElSKQorCUBpbnN0YWxsIC1wIC1tIDY0NCBhZXMtcnNsLm8gJChNT0RERVNURElSKQorCUBpbnN0YWxsIC1wIC1tIDY0NCBpZWVlODAyMTFfY3J5cHRfd2VwLXJzbC5vICQoTU9EREVTVERJUikKKwlAaW5zdGFsbCAtcCAtbSA2NDQgaWVlZTgwMjExX2NyeXB0X3RraXAtcnNsLm8gJChNT0RERVNURElSKQorCUBpbnN0YWxsIC1wIC1tIDY0NCBpZWVlODAyMTFfY3J5cHRfY2NtcC1yc2wubyAkKE1PRERFU1RESVIpCisJQGluc3RhbGwgLXAgLW0gNjQ0IGllZWU4MDIxMS1yc2wubyAkKE1PRERFU1RESVIpCisJL3NiaW4vZGVwbW9kIC1hICR7c2hlbGwgdW5hbWUgLXJ9CisKK3VuaW5zdGFsbDoKKwlybSAtZnIgJChNT0RERVNURElSKQorCS9zYmluL2RlcG1vZCAtYSAke3NoZWxsIHVuYW1lIC1yfQorCitlbmRpZgorCisuUEhPTlk6IGNsZWFuCitjbGVhbjoKKwlybSAtZnIgKi5tb2QuYyAqLm1vZCAqLm8gLiouY21kICoubW9kLiogKi5rbyAqLm8gKn4KKwlybSAtcmYgLnRtcF92ZXJzaW9ucworCXJtIC1yZiBNb2R1bGUuc3ltdmVycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hZXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZiYjZjOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYWVzLmMKQEAgLTAsMCArMSw0NjkgQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBBRVMgQ2lwaGVyIEFsZ29yaXRobS4KKyAqCisgKiBCYXNlZCBvbiBCcmlhbiBHbGFkbWFuJ3MgY29kZS4KKyAqCisgKiBMaW51eCBkZXZlbG9wZXJzOgorICogIEFsZXhhbmRlciBLamVsZGFhcyA8YXN0b3JAZmFzdC5ubz4KKyAqICBIZXJiZXJ0IFZhbGVyaW8gUmllZGVsIDxodnJAaHZybGFiLm9yZz4KKyAqICBLeWxlIE1jTWFydGluIDxreWxlQGRlYmlhbi5vcmc+CisgKiAgQWRhbSBKLiBSaWNodGVyIDxhZGFtQHlnZ2RyYXNpbC5jb20+IChjb252ZXJzaW9uIHRvIDIuNSBBUEkpLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIERyIEJyaWFuIEdsYWRtYW4gPGJyZ0BnbGFkbWFuLm1lLnVrPiwgV29yY2VzdGVyLCBVSy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTElDRU5TRSBURVJNUworICoKKyAqIFRoZSBmcmVlIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gYm90aCBzb3VyY2UgYW5kIGJpbmFyeQorICogZm9ybSBpcyBhbGxvd2VkICh3aXRoIG9yIHdpdGhvdXQgY2hhbmdlcykgcHJvdmlkZWQgdGhhdDoKKyAqCisgKiAgIDEuIGRpc3RyaWJ1dGlvbnMgb2YgdGhpcyBzb3VyY2UgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyOworICoKKyAqICAgMi4gZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiAgICAgIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBhc3NvY2lhdGVkIG1hdGVyaWFsczsKKyAqCisgKiAgIDMuIHRoZSBjb3B5cmlnaHQgaG9sZGVyJ3MgbmFtZSBpcyBub3QgdXNlZCB0byBlbmRvcnNlIHByb2R1Y3RzCisgKiAgICAgIGJ1aWx0IHVzaW5nIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSBpcyByZXRhaW5lZCBpbiBmdWxsLCB0aGlzIHByb2R1Y3QKKyAqIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLAorICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFwcGx5IElOU1RFQUQgT0YgdGhvc2UgZ2l2ZW4gYWJvdmUuCisgKgorICogRElTQ0xBSU1FUgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzIGlzJyB3aXRoIG5vIGV4cGxpY2l0IG9yIGltcGxpZWQgd2FycmFudGllcworICogaW4gcmVzcGVjdCBvZiBpdHMgcHJvcGVydGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIGNvcnJlY3RuZXNzCisgKiBhbmQvb3IgZml0bmVzcyBmb3IgcHVycG9zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIFNvbWUgY2hhbmdlcyBmcm9tIHRoZSBHbGFkbWFuIHZlcnNpb246CisgICAgcy9SSUpOREFFTChlX2tleSkvRV9LRVkvZworICAgIHMvUklKTkRBRUwoZF9rZXkpL0RfS0VZL2cKKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorLy8jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSAicnRsX2NyeXB0by5oIgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2RlZmluZSBBRVNfTUlOX0tFWV9TSVpFCTE2CisjZGVmaW5lIEFFU19NQVhfS0VZX1NJWkUJMzIKKworI2RlZmluZSBBRVNfQkxPQ0tfU0laRQkJMTYKKworc3RhdGljIGlubGluZQordTMyIGdlbmVyaWNfcm90cjMyIChjb25zdCB1MzIgeCwgY29uc3QgdW5zaWduZWQgYml0cykKK3sKKwljb25zdCB1bnNpZ25lZCBuID0gYml0cyAlIDMyOworCXJldHVybiAoeCA+PiBuKSB8ICh4IDw8ICgzMiAtIG4pKTsKK30KKworc3RhdGljIGlubGluZQordTMyIGdlbmVyaWNfcm90bDMyIChjb25zdCB1MzIgeCwgY29uc3QgdW5zaWduZWQgYml0cykKK3sKKwljb25zdCB1bnNpZ25lZCBuID0gYml0cyAlIDMyOworCXJldHVybiAoeCA8PCBuKSB8ICh4ID4+ICgzMiAtIG4pKTsKK30KKworI2RlZmluZSByb3RsIGdlbmVyaWNfcm90bDMyCisjZGVmaW5lIHJvdHIgZ2VuZXJpY19yb3RyMzIKKworLyoKKyAqICNkZWZpbmUgYnl0ZSh4LCBucikgKCh1bnNpZ25lZCBjaGFyKSgoeCkgPj4gKG5yKjgpKSkKKyAqLworaW5saW5lIHN0YXRpYyB1OAorYnl0ZShjb25zdCB1MzIgeCwgY29uc3QgdW5zaWduZWQgbikKK3sKKwlyZXR1cm4geCA+PiAobiA8PCAzKTsKK30KKworI2RlZmluZSB1MzJfaW4oeCkgbGUzMl90b19jcHUoKihjb25zdCB1MzIgKikoeCkpCisjZGVmaW5lIHUzMl9vdXQodG8sIGZyb20pICgqKHUzMiAqKSh0bykgPSBjcHVfdG9fbGUzMihmcm9tKSkKKworc3RydWN0IGFlc19jdHggeworCWludCBrZXlfbGVuZ3RoOworCXUzMiBFWzYwXTsKKwl1MzIgRFs2MF07Cit9OworCisjZGVmaW5lIEVfS0VZIGN0eC0+RQorI2RlZmluZSBEX0tFWSBjdHgtPkQKKworc3RhdGljIHU4IHBvd190YWJbMjU2XSBfX2luaXRkYXRhOworc3RhdGljIHU4IGxvZ190YWJbMjU2XSBfX2luaXRkYXRhOworc3RhdGljIHU4IHNieF90YWJbMjU2XSBfX2luaXRkYXRhOworc3RhdGljIHU4IGlzYl90YWJbMjU2XSBfX2luaXRkYXRhOworc3RhdGljIHUzMiByY29fdGFiWzEwXTsKK3N0YXRpYyB1MzIgZnRfdGFiWzRdWzI1Nl07CitzdGF0aWMgdTMyIGl0X3RhYls0XVsyNTZdOworCitzdGF0aWMgdTMyIGZsX3RhYls0XVsyNTZdOworc3RhdGljIHUzMiBpbF90YWJbNF1bMjU2XTsKKworc3RhdGljIGlubGluZSB1OCBfX2luaXQKK2ZfbXVsdCAodTggYSwgdTggYikKK3sKKwl1OCBhYSA9IGxvZ190YWJbYV0sIGNjID0gYWEgKyBsb2dfdGFiW2JdOworCisJcmV0dXJuIHBvd190YWJbY2MgKyAoY2MgPCBhYSA/IDEgOiAwKV07Cit9CisKKyNkZWZpbmUgZmZfbXVsdChhLGIpICAgIChhICYmIGIgPyBmX211bHQoYSwgYikgOiAwKQorCisjZGVmaW5lIGZfcm4oYm8sIGJpLCBuLCBrKQkJCQkJXAorICAgIGJvW25dID0gIGZ0X3RhYlswXVtieXRlKGJpW25dLDApXSBeCQkJCVwKKwkgICAgIGZ0X3RhYlsxXVtieXRlKGJpWyhuICsgMSkgJiAzXSwxKV0gXgkJXAorCSAgICAgZnRfdGFiWzJdW2J5dGUoYmlbKG4gKyAyKSAmIDNdLDIpXSBeCQlcCisJICAgICBmdF90YWJbM11bYnl0ZShiaVsobiArIDMpICYgM10sMyldIF4gKihrICsgbikKKworI2RlZmluZSBpX3JuKGJvLCBiaSwgbiwgaykJCQkJCVwKKyAgICBib1tuXSA9ICBpdF90YWJbMF1bYnl0ZShiaVtuXSwwKV0gXgkJCQlcCisJICAgICBpdF90YWJbMV1bYnl0ZShiaVsobiArIDMpICYgM10sMSldIF4JCVwKKwkgICAgIGl0X3RhYlsyXVtieXRlKGJpWyhuICsgMikgJiAzXSwyKV0gXgkJXAorCSAgICAgaXRfdGFiWzNdW2J5dGUoYmlbKG4gKyAxKSAmIDNdLDMpXSBeICooayArIG4pCisKKyNkZWZpbmUgbHNfYm94KHgpCQkJCVwKKyAgICAoIGZsX3RhYlswXVtieXRlKHgsIDApXSBeCQkJXAorICAgICAgZmxfdGFiWzFdW2J5dGUoeCwgMSldIF4JCQlcCisgICAgICBmbF90YWJbMl1bYnl0ZSh4LCAyKV0gXgkJCVwKKyAgICAgIGZsX3RhYlszXVtieXRlKHgsIDMpXSApCisKKyNkZWZpbmUgZl9ybChibywgYmksIG4sIGspCQkJCQlcCisgICAgYm9bbl0gPSAgZmxfdGFiWzBdW2J5dGUoYmlbbl0sMCldIF4JCQkJXAorCSAgICAgZmxfdGFiWzFdW2J5dGUoYmlbKG4gKyAxKSAmIDNdLDEpXSBeCQlcCisJICAgICBmbF90YWJbMl1bYnl0ZShiaVsobiArIDIpICYgM10sMildIF4JCVwKKwkgICAgIGZsX3RhYlszXVtieXRlKGJpWyhuICsgMykgJiAzXSwzKV0gXiAqKGsgKyBuKQorCisjZGVmaW5lIGlfcmwoYm8sIGJpLCBuLCBrKQkJCQkJXAorICAgIGJvW25dID0gIGlsX3RhYlswXVtieXRlKGJpW25dLDApXSBeCQkJCVwKKwkgICAgIGlsX3RhYlsxXVtieXRlKGJpWyhuICsgMykgJiAzXSwxKV0gXgkJXAorCSAgICAgaWxfdGFiWzJdW2J5dGUoYmlbKG4gKyAyKSAmIDNdLDIpXSBeCQlcCisJICAgICBpbF90YWJbM11bYnl0ZShiaVsobiArIDEpICYgM10sMyldIF4gKihrICsgbikKKworc3RhdGljIHZvaWQgX19pbml0CitnZW5fdGFicyAodm9pZCkKK3sKKwl1MzIgaSwgdDsKKwl1OCBwLCBxOworCisJLyogbG9nIGFuZCBwb3dlciB0YWJsZXMgZm9yIEdGKDIqKjgpIGZpbml0ZSBmaWVsZCB3aXRoCisJICAgMHgwMTFiIGFzIG1vZHVsYXIgcG9seW5vbWlhbCAtIHRoZSBzaW1wbGVzdCBwcmltaXRpdmUKKwkgICByb290IGlzIDB4MDMsIHVzZWQgaGVyZSB0byBnZW5lcmF0ZSB0aGUgdGFibGVzICovCisKKwlmb3IgKGkgPSAwLCBwID0gMTsgaSA8IDI1NjsgKytpKSB7CisJCXBvd190YWJbaV0gPSAodTgpIHA7CisJCWxvZ190YWJbcF0gPSAodTgpIGk7CisKKwkJcCBePSAocCA8PCAxKSBeIChwICYgMHg4MCA/IDB4MDFiIDogMCk7CisJfQorCisJbG9nX3RhYlsxXSA9IDA7CisKKwlmb3IgKGkgPSAwLCBwID0gMTsgaSA8IDEwOyArK2kpIHsKKwkJcmNvX3RhYltpXSA9IHA7CisKKwkJcCA9IChwIDw8IDEpIF4gKHAgJiAweDgwID8gMHgwMWIgOiAwKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKwkJcCA9IChpID8gcG93X3RhYlsyNTUgLSBsb2dfdGFiW2ldXSA6IDApOworCQlxID0gKChwID4+IDcpIHwgKHAgPDwgMSkpIF4gKChwID4+IDYpIHwgKHAgPDwgMikpOworCQlwIF49IDB4NjMgXiBxIF4gKChxID4+IDYpIHwgKHEgPDwgMikpOworCQlzYnhfdGFiW2ldID0gcDsKKwkJaXNiX3RhYltwXSA9ICh1OCkgaTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKwkJcCA9IHNieF90YWJbaV07CisKKwkJdCA9IHA7CisJCWZsX3RhYlswXVtpXSA9IHQ7CisJCWZsX3RhYlsxXVtpXSA9IHJvdGwgKHQsIDgpOworCQlmbF90YWJbMl1baV0gPSByb3RsICh0LCAxNik7CisJCWZsX3RhYlszXVtpXSA9IHJvdGwgKHQsIDI0KTsKKworCQl0ID0gKCh1MzIpIGZmX211bHQgKDIsIHApKSB8CisJCSAgICAoKHUzMikgcCA8PCA4KSB8CisJCSAgICAoKHUzMikgcCA8PCAxNikgfCAoKHUzMikgZmZfbXVsdCAoMywgcCkgPDwgMjQpOworCisJCWZ0X3RhYlswXVtpXSA9IHQ7CisJCWZ0X3RhYlsxXVtpXSA9IHJvdGwgKHQsIDgpOworCQlmdF90YWJbMl1baV0gPSByb3RsICh0LCAxNik7CisJCWZ0X3RhYlszXVtpXSA9IHJvdGwgKHQsIDI0KTsKKworCQlwID0gaXNiX3RhYltpXTsKKworCQl0ID0gcDsKKwkJaWxfdGFiWzBdW2ldID0gdDsKKwkJaWxfdGFiWzFdW2ldID0gcm90bCAodCwgOCk7CisJCWlsX3RhYlsyXVtpXSA9IHJvdGwgKHQsIDE2KTsKKwkJaWxfdGFiWzNdW2ldID0gcm90bCAodCwgMjQpOworCisJCXQgPSAoKHUzMikgZmZfbXVsdCAoMTQsIHApKSB8CisJCSAgICAoKHUzMikgZmZfbXVsdCAoOSwgcCkgPDwgOCkgfAorCQkgICAgKCh1MzIpIGZmX211bHQgKDEzLCBwKSA8PCAxNikgfAorCQkgICAgKCh1MzIpIGZmX211bHQgKDExLCBwKSA8PCAyNCk7CisKKwkJaXRfdGFiWzBdW2ldID0gdDsKKwkJaXRfdGFiWzFdW2ldID0gcm90bCAodCwgOCk7CisJCWl0X3RhYlsyXVtpXSA9IHJvdGwgKHQsIDE2KTsKKwkJaXRfdGFiWzNdW2ldID0gcm90bCAodCwgMjQpOworCX0KK30KKworI2RlZmluZSBzdGFyX3goeCkgKCgoeCkgJiAweDdmN2Y3ZjdmKSA8PCAxKSBeICgoKCh4KSAmIDB4ODA4MDgwODApID4+IDcpICogMHgxYikKKworI2RlZmluZSBpbWl4X2NvbCh5LHgpICAgICAgIFwKKyAgICB1ICAgPSBzdGFyX3goeCk7ICAgICAgICBcCisgICAgdiAgID0gc3Rhcl94KHUpOyAgICAgICAgXAorICAgIHcgICA9IHN0YXJfeCh2KTsgICAgICAgIFwKKyAgICB0ICAgPSB3IF4gKHgpOyAgICAgICAgICBcCisgICAoeSkgID0gdSBeIHYgXiB3OyAgICAgICAgXAorICAgKHkpIF49IHJvdHIodSBeIHQsICA4KSBeIFwKKwkgIHJvdHIodiBeIHQsIDE2KSBeIFwKKwkgIHJvdHIodCwyNCkKKworLyogaW5pdGlhbGlzZSB0aGUga2V5IHNjaGVkdWxlIGZyb20gdGhlIHVzZXIgc3VwcGxpZWQga2V5ICovCisKKyNkZWZpbmUgbG9vcDQoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgdCA9IHJvdHIodCwgIDgpOyB0ID0gbHNfYm94KHQpIF4gcmNvX3RhYltpXTsgICAgXAorICAgIHQgXj0gRV9LRVlbNCAqIGldOyAgICAgRV9LRVlbNCAqIGkgKyA0XSA9IHQ7ICAgIFwKKyAgICB0IF49IEVfS0VZWzQgKiBpICsgMV07IEVfS0VZWzQgKiBpICsgNV0gPSB0OyAgICBcCisgICAgdCBePSBFX0tFWVs0ICogaSArIDJdOyBFX0tFWVs0ICogaSArIDZdID0gdDsgICAgXAorICAgIHQgXj0gRV9LRVlbNCAqIGkgKyAzXTsgRV9LRVlbNCAqIGkgKyA3XSA9IHQ7ICAgIFwKK30KKworI2RlZmluZSBsb29wNihpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICB0ID0gcm90cih0LCAgOCk7IHQgPSBsc19ib3godCkgXiByY29fdGFiW2ldOyAgICBcCisgICAgdCBePSBFX0tFWVs2ICogaV07ICAgICBFX0tFWVs2ICogaSArIDZdID0gdDsgICAgXAorICAgIHQgXj0gRV9LRVlbNiAqIGkgKyAxXTsgRV9LRVlbNiAqIGkgKyA3XSA9IHQ7ICAgIFwKKyAgICB0IF49IEVfS0VZWzYgKiBpICsgMl07IEVfS0VZWzYgKiBpICsgOF0gPSB0OyAgICBcCisgICAgdCBePSBFX0tFWVs2ICogaSArIDNdOyBFX0tFWVs2ICogaSArIDldID0gdDsgICAgXAorICAgIHQgXj0gRV9LRVlbNiAqIGkgKyA0XTsgRV9LRVlbNiAqIGkgKyAxMF0gPSB0OyAgIFwKKyAgICB0IF49IEVfS0VZWzYgKiBpICsgNV07IEVfS0VZWzYgKiBpICsgMTFdID0gdDsgICBcCit9CisKKyNkZWZpbmUgbG9vcDgoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgdCA9IHJvdHIodCwgIDgpOyA7IHQgPSBsc19ib3godCkgXiByY29fdGFiW2ldOyAgXAorICAgIHQgXj0gRV9LRVlbOCAqIGldOyAgICAgRV9LRVlbOCAqIGkgKyA4XSA9IHQ7ICAgIFwKKyAgICB0IF49IEVfS0VZWzggKiBpICsgMV07IEVfS0VZWzggKiBpICsgOV0gPSB0OyAgICBcCisgICAgdCBePSBFX0tFWVs4ICogaSArIDJdOyBFX0tFWVs4ICogaSArIDEwXSA9IHQ7ICAgXAorICAgIHQgXj0gRV9LRVlbOCAqIGkgKyAzXTsgRV9LRVlbOCAqIGkgKyAxMV0gPSB0OyAgIFwKKyAgICB0ICA9IEVfS0VZWzggKiBpICsgNF0gXiBsc19ib3godCk7ICAgIFwKKyAgICBFX0tFWVs4ICogaSArIDEyXSA9IHQ7ICAgICAgICAgICAgICAgIFwKKyAgICB0IF49IEVfS0VZWzggKiBpICsgNV07IEVfS0VZWzggKiBpICsgMTNdID0gdDsgICBcCisgICAgdCBePSBFX0tFWVs4ICogaSArIDZdOyBFX0tFWVs4ICogaSArIDE0XSA9IHQ7ICAgXAorICAgIHQgXj0gRV9LRVlbOCAqIGkgKyA3XTsgRV9LRVlbOCAqIGkgKyAxNV0gPSB0OyAgIFwKK30KKworc3RhdGljIGludAorYWVzX3NldF9rZXkodm9pZCAqY3R4X2FyZywgY29uc3QgdTggKmluX2tleSwgdW5zaWduZWQgaW50IGtleV9sZW4sIHUzMiAqZmxhZ3MpCit7CisJc3RydWN0IGFlc19jdHggKmN0eCA9IGN0eF9hcmc7CisJdTMyIGksIHQsIHUsIHYsIHc7CisKKwlpZiAoa2V5X2xlbiAhPSAxNiAmJiBrZXlfbGVuICE9IDI0ICYmIGtleV9sZW4gIT0gMzIpIHsKKwkJKmZsYWdzIHw9IENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljdHgtPmtleV9sZW5ndGggPSBrZXlfbGVuOworCisJRV9LRVlbMF0gPSB1MzJfaW4gKGluX2tleSk7CisJRV9LRVlbMV0gPSB1MzJfaW4gKGluX2tleSArIDQpOworCUVfS0VZWzJdID0gdTMyX2luIChpbl9rZXkgKyA4KTsKKwlFX0tFWVszXSA9IHUzMl9pbiAoaW5fa2V5ICsgMTIpOworCisJc3dpdGNoIChrZXlfbGVuKSB7CisJY2FzZSAxNjoKKwkJdCA9IEVfS0VZWzNdOworCQlmb3IgKGkgPSAwOyBpIDwgMTA7ICsraSkKKwkJCWxvb3A0IChpKTsKKwkJYnJlYWs7CisKKwljYXNlIDI0OgorCQlFX0tFWVs0XSA9IHUzMl9pbiAoaW5fa2V5ICsgMTYpOworCQl0ID0gRV9LRVlbNV0gPSB1MzJfaW4gKGluX2tleSArIDIwKTsKKwkJZm9yIChpID0gMDsgaSA8IDg7ICsraSkKKwkJCWxvb3A2IChpKTsKKwkJYnJlYWs7CisKKwljYXNlIDMyOgorCQlFX0tFWVs0XSA9IHUzMl9pbiAoaW5fa2V5ICsgMTYpOworCQlFX0tFWVs1XSA9IHUzMl9pbiAoaW5fa2V5ICsgMjApOworCQlFX0tFWVs2XSA9IHUzMl9pbiAoaW5fa2V5ICsgMjQpOworCQl0ID0gRV9LRVlbN10gPSB1MzJfaW4gKGluX2tleSArIDI4KTsKKwkJZm9yIChpID0gMDsgaSA8IDc7ICsraSkKKwkJCWxvb3A4IChpKTsKKwkJYnJlYWs7CisJfQorCisJRF9LRVlbMF0gPSBFX0tFWVswXTsKKwlEX0tFWVsxXSA9IEVfS0VZWzFdOworCURfS0VZWzJdID0gRV9LRVlbMl07CisJRF9LRVlbM10gPSBFX0tFWVszXTsKKworCWZvciAoaSA9IDQ7IGkgPCBrZXlfbGVuICsgMjQ7ICsraSkgeworCQlpbWl4X2NvbCAoRF9LRVlbaV0sIEVfS0VZW2ldKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogZW5jcnlwdCBhIGJsb2NrIG9mIHRleHQgKi8KKworI2RlZmluZSBmX25yb3VuZChibywgYmksIGspIFwKKyAgICBmX3JuKGJvLCBiaSwgMCwgayk7ICAgICBcCisgICAgZl9ybihibywgYmksIDEsIGspOyAgICAgXAorICAgIGZfcm4oYm8sIGJpLCAyLCBrKTsgICAgIFwKKyAgICBmX3JuKGJvLCBiaSwgMywgayk7ICAgICBcCisgICAgayArPSA0CisKKyNkZWZpbmUgZl9scm91bmQoYm8sIGJpLCBrKSBcCisgICAgZl9ybChibywgYmksIDAsIGspOyAgICAgXAorICAgIGZfcmwoYm8sIGJpLCAxLCBrKTsgICAgIFwKKyAgICBmX3JsKGJvLCBiaSwgMiwgayk7ICAgICBcCisgICAgZl9ybChibywgYmksIDMsIGspCisKK3N0YXRpYyB2b2lkIGFlc19lbmNyeXB0KHZvaWQgKmN0eF9hcmcsIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKK3sKKwljb25zdCBzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gY3R4X2FyZzsKKwl1MzIgYjBbNF0sIGIxWzRdOworCWNvbnN0IHUzMiAqa3AgPSBFX0tFWSArIDQ7CisKKwliMFswXSA9IHUzMl9pbiAoaW4pIF4gRV9LRVlbMF07CisJYjBbMV0gPSB1MzJfaW4gKGluICsgNCkgXiBFX0tFWVsxXTsKKwliMFsyXSA9IHUzMl9pbiAoaW4gKyA4KSBeIEVfS0VZWzJdOworCWIwWzNdID0gdTMyX2luIChpbiArIDEyKSBeIEVfS0VZWzNdOworCisJaWYgKGN0eC0+a2V5X2xlbmd0aCA+IDI0KSB7CisJCWZfbnJvdW5kIChiMSwgYjAsIGtwKTsKKwkJZl9ucm91bmQgKGIwLCBiMSwga3ApOworCX0KKworCWlmIChjdHgtPmtleV9sZW5ndGggPiAxNikgeworCQlmX25yb3VuZCAoYjEsIGIwLCBrcCk7CisJCWZfbnJvdW5kIChiMCwgYjEsIGtwKTsKKwl9CisKKwlmX25yb3VuZCAoYjEsIGIwLCBrcCk7CisJZl9ucm91bmQgKGIwLCBiMSwga3ApOworCWZfbnJvdW5kIChiMSwgYjAsIGtwKTsKKwlmX25yb3VuZCAoYjAsIGIxLCBrcCk7CisJZl9ucm91bmQgKGIxLCBiMCwga3ApOworCWZfbnJvdW5kIChiMCwgYjEsIGtwKTsKKwlmX25yb3VuZCAoYjEsIGIwLCBrcCk7CisJZl9ucm91bmQgKGIwLCBiMSwga3ApOworCWZfbnJvdW5kIChiMSwgYjAsIGtwKTsKKwlmX2xyb3VuZCAoYjAsIGIxLCBrcCk7CisKKwl1MzJfb3V0IChvdXQsIGIwWzBdKTsKKwl1MzJfb3V0IChvdXQgKyA0LCBiMFsxXSk7CisJdTMyX291dCAob3V0ICsgOCwgYjBbMl0pOworCXUzMl9vdXQgKG91dCArIDEyLCBiMFszXSk7Cit9CisKKy8qIGRlY3J5cHQgYSBibG9jayBvZiB0ZXh0ICovCisKKyNkZWZpbmUgaV9ucm91bmQoYm8sIGJpLCBrKSBcCisgICAgaV9ybihibywgYmksIDAsIGspOyAgICAgXAorICAgIGlfcm4oYm8sIGJpLCAxLCBrKTsgICAgIFwKKyAgICBpX3JuKGJvLCBiaSwgMiwgayk7ICAgICBcCisgICAgaV9ybihibywgYmksIDMsIGspOyAgICAgXAorICAgIGsgLT0gNAorCisjZGVmaW5lIGlfbHJvdW5kKGJvLCBiaSwgaykgXAorICAgIGlfcmwoYm8sIGJpLCAwLCBrKTsgICAgIFwKKyAgICBpX3JsKGJvLCBiaSwgMSwgayk7ICAgICBcCisgICAgaV9ybChibywgYmksIDIsIGspOyAgICAgXAorICAgIGlfcmwoYm8sIGJpLCAzLCBrKQorCitzdGF0aWMgdm9pZCBhZXNfZGVjcnlwdCh2b2lkICpjdHhfYXJnLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCit7CisJY29uc3Qgc3RydWN0IGFlc19jdHggKmN0eCA9IGN0eF9hcmc7CisJdTMyIGIwWzRdLCBiMVs0XTsKKwljb25zdCBpbnQga2V5X2xlbiA9IGN0eC0+a2V5X2xlbmd0aDsKKwljb25zdCB1MzIgKmtwID0gRF9LRVkgKyBrZXlfbGVuICsgMjA7CisKKwliMFswXSA9IHUzMl9pbiAoaW4pIF4gRV9LRVlba2V5X2xlbiArIDI0XTsKKwliMFsxXSA9IHUzMl9pbiAoaW4gKyA0KSBeIEVfS0VZW2tleV9sZW4gKyAyNV07CisJYjBbMl0gPSB1MzJfaW4gKGluICsgOCkgXiBFX0tFWVtrZXlfbGVuICsgMjZdOworCWIwWzNdID0gdTMyX2luIChpbiArIDEyKSBeIEVfS0VZW2tleV9sZW4gKyAyN107CisKKwlpZiAoa2V5X2xlbiA+IDI0KSB7CisJCWlfbnJvdW5kIChiMSwgYjAsIGtwKTsKKwkJaV9ucm91bmQgKGIwLCBiMSwga3ApOworCX0KKworCWlmIChrZXlfbGVuID4gMTYpIHsKKwkJaV9ucm91bmQgKGIxLCBiMCwga3ApOworCQlpX25yb3VuZCAoYjAsIGIxLCBrcCk7CisJfQorCisJaV9ucm91bmQgKGIxLCBiMCwga3ApOworCWlfbnJvdW5kIChiMCwgYjEsIGtwKTsKKwlpX25yb3VuZCAoYjEsIGIwLCBrcCk7CisJaV9ucm91bmQgKGIwLCBiMSwga3ApOworCWlfbnJvdW5kIChiMSwgYjAsIGtwKTsKKwlpX25yb3VuZCAoYjAsIGIxLCBrcCk7CisJaV9ucm91bmQgKGIxLCBiMCwga3ApOworCWlfbnJvdW5kIChiMCwgYjEsIGtwKTsKKwlpX25yb3VuZCAoYjEsIGIwLCBrcCk7CisJaV9scm91bmQgKGIwLCBiMSwga3ApOworCisJdTMyX291dCAob3V0LCBiMFswXSk7CisJdTMyX291dCAob3V0ICsgNCwgYjBbMV0pOworCXUzMl9vdXQgKG91dCArIDgsIGIwWzJdKTsKKwl1MzJfb3V0IChvdXQgKyAxMiwgYjBbM10pOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBhZXNfYWxnID0geworCS5jcmFfbmFtZQkJPQkiYWVzIiwKKwkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCisJLmNyYV9ibG9ja3NpemUJCT0JQUVTX0JMT0NLX1NJWkUsCisJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgYWVzX2N0eCksCisJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCisJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGFlc19hbGcuY3JhX2xpc3QpLAorCS5jcmFfdQkJCT0JeworCQkuY2lwaGVyID0geworCQkJLmNpYV9taW5fa2V5c2l6ZQk9CUFFU19NSU5fS0VZX1NJWkUsCisJCQkuY2lhX21heF9rZXlzaXplCT0JQUVTX01BWF9LRVlfU0laRSwKKwkJCS5jaWFfc2V0a2V5CQk9IAlhZXNfc2V0X2tleSwKKwkJCS5jaWFfZW5jcnlwdAkJPQlhZXNfZW5jcnlwdCwKKwkJCS5jaWFfZGVjcnlwdAkJPQlhZXNfZGVjcnlwdAorCQl9CisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgYWVzX2luaXQodm9pZCkKK3sKKwlnZW5fdGFicygpOworCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZhZXNfYWxnKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFlc19maW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZhZXNfYWxnKTsKK30KKworbW9kdWxlX2luaXQoYWVzX2luaXQpOworbW9kdWxlX2V4aXQoYWVzX2ZpbmkpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlJpam5kYWVsIChBRVMpIENpcGhlciBBbGdvcml0aG0iKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hcGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYyN2QwMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYXBpLmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBTY2F0dGVybGlzdCBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICoKKyAqIFBvcnRpb25zIGRlcml2ZWQgZnJvbSBDcnlwdG9hcGksIGJ5IEFsZXhhbmRlciBLamVsZGFhcyA8YXN0b3JAZmFzdC5ubz4KKyAqIGFuZCBOZXR0bGUsIGJ5IE5pZWxzIE3psIhsZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpbmNsdWRlICJrbWFwX3R5cGVzLmgiCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlICJydGxfY3J5cHRvLmgiCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitMSVNUX0hFQUQoY3J5cHRvX2FsZ19saXN0KTsKK0RFQ0xBUkVfUldTRU0oY3J5cHRvX2FsZ19zZW0pOworCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYWxnX2dldChzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQoreworCXJldHVybiB0cnlfaW5jX21vZF9jb3VudChhbGctPmNyYV9tb2R1bGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2FsZ19wdXQoc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlpZiAoYWxnLT5jcmFfbW9kdWxlKQorCQlfX01PRF9ERUNfVVNFX0NPVU5UKGFsZy0+Y3JhX21vZHVsZSk7Cit9CisKK3N0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBjcnlwdG9fYWxnICpxLCAqYWxnID0gTlVMTDsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkb3duX3JlYWQoJmNyeXB0b19hbGdfc2VtKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocSwgJmNyeXB0b19hbGdfbGlzdCwgY3JhX2xpc3QpIHsKKwkJaWYgKCEoc3RyY21wKHEtPmNyYV9uYW1lLCBuYW1lKSkpIHsKKwkJCWlmIChjcnlwdG9fYWxnX2dldChxKSkKKwkJCQlhbGcgPSBxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwl1cF9yZWFkKCZjcnlwdG9fYWxnX3NlbSk7CisJcmV0dXJuIGFsZzsKK30KKworc3RhdGljIGludCBjcnlwdG9faW5pdF9mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpCit7CisJdGZtLT5jcnRfZmxhZ3MgPSAwOworCisJc3dpdGNoIChjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkpIHsKKwljYXNlIENSWVBUT19BTEdfVFlQRV9DSVBIRVI6CisJCXJldHVybiBjcnlwdG9faW5pdF9jaXBoZXJfZmxhZ3ModGZtLCBmbGFncyk7CisKKwljYXNlIENSWVBUT19BTEdfVFlQRV9ESUdFU1Q6CisJCXJldHVybiBjcnlwdG9faW5pdF9kaWdlc3RfZmxhZ3ModGZtLCBmbGFncyk7CisKKwljYXNlIENSWVBUT19BTEdfVFlQRV9DT01QUkVTUzoKKwkJcmV0dXJuIGNyeXB0b19pbml0X2NvbXByZXNzX2ZsYWdzKHRmbSwgZmxhZ3MpOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJQlVHKCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX2luaXRfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJc3dpdGNoIChjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkpIHsKKwljYXNlIENSWVBUT19BTEdfVFlQRV9DSVBIRVI6CisJCXJldHVybiBjcnlwdG9faW5pdF9jaXBoZXJfb3BzKHRmbSk7CisKKwljYXNlIENSWVBUT19BTEdfVFlQRV9ESUdFU1Q6CisJCXJldHVybiBjcnlwdG9faW5pdF9kaWdlc3Rfb3BzKHRmbSk7CisKKwljYXNlIENSWVBUT19BTEdfVFlQRV9DT01QUkVTUzoKKwkJcmV0dXJuIGNyeXB0b19pbml0X2NvbXByZXNzX29wcyh0Zm0pOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJQlVHKCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIGNyeXB0b19leGl0X29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXN3aXRjaCAoY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pKSB7CisJY2FzZSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSOgorCQljcnlwdG9fZXhpdF9jaXBoZXJfb3BzKHRmbSk7CisJCWJyZWFrOworCisJY2FzZSBDUllQVE9fQUxHX1RZUEVfRElHRVNUOgorCQljcnlwdG9fZXhpdF9kaWdlc3Rfb3BzKHRmbSk7CisJCWJyZWFrOworCisJY2FzZSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1M6CisJCWNyeXB0b19leGl0X2NvbXByZXNzX29wcyh0Zm0pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJVRygpOworCisJfQorfQorCitzdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX2FsbG9jX3RmbShjb25zdCBjaGFyICpuYW1lLCB1MzIgZmxhZ3MpCit7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IE5VTEw7CisJc3RydWN0IGNyeXB0b19hbGcgKmFsZzsKKworCWFsZyA9IGNyeXB0b19hbGdfbW9kX2xvb2t1cChuYW1lKTsKKwlpZiAoYWxnID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJdGZtID0ga21hbGxvYyhzaXplb2YoKnRmbSkgKyBhbGctPmNyYV9jdHhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAodGZtID09IE5VTEwpCisJCWdvdG8gb3V0X3B1dDsKKworCW1lbXNldCh0Zm0sIDAsIHNpemVvZigqdGZtKSArIGFsZy0+Y3JhX2N0eHNpemUpOworCisJdGZtLT5fX2NydF9hbGcgPSBhbGc7CisKKwlpZiAoY3J5cHRvX2luaXRfZmxhZ3ModGZtLCBmbGFncykpCisJCWdvdG8gb3V0X2ZyZWVfdGZtOworCisJaWYgKGNyeXB0b19pbml0X29wcyh0Zm0pKSB7CisJCWNyeXB0b19leGl0X29wcyh0Zm0pOworCQlnb3RvIG91dF9mcmVlX3RmbTsKKwl9CisKKwlnb3RvIG91dDsKKworb3V0X2ZyZWVfdGZtOgorCWtmcmVlKHRmbSk7CisJdGZtID0gTlVMTDsKK291dF9wdXQ6CisJY3J5cHRvX2FsZ19wdXQoYWxnKTsKK291dDoKKwlyZXR1cm4gdGZtOworfQorCit2b2lkIGNyeXB0b19mcmVlX3RmbShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXN0cnVjdCBjcnlwdG9fYWxnICphbGcgPSB0Zm0tPl9fY3J0X2FsZzsKKwlpbnQgc2l6ZSA9IHNpemVvZigqdGZtKSArIGFsZy0+Y3JhX2N0eHNpemU7CisKKwljcnlwdG9fZXhpdF9vcHModGZtKTsKKwljcnlwdG9fYWxnX3B1dChhbGcpOworCW1lbXNldCh0Zm0sIDAsIHNpemUpOworCWtmcmVlKHRmbSk7Cit9CisKK2ludCBjcnlwdG9fcmVnaXN0ZXJfYWxnKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGNyeXB0b19hbGcgKnE7CisKKwlkb3duX3dyaXRlKCZjcnlwdG9fYWxnX3NlbSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHEsICZjcnlwdG9fYWxnX2xpc3QsIGNyYV9saXN0KSB7CisJCWlmICghKHN0cmNtcChxLT5jcmFfbmFtZSwgYWxnLT5jcmFfbmFtZSkpKSB7CisJCQlyZXQgPSAtRUVYSVNUOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlsaXN0X2FkZF90YWlsKCZhbGctPmNyYV9saXN0LCAmY3J5cHRvX2FsZ19saXN0KTsKK291dDoKKwl1cF93cml0ZSgmY3J5cHRvX2FsZ19zZW0pOworCXJldHVybiByZXQ7Cit9CisKK2ludCBjcnlwdG9fdW5yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlpbnQgcmV0ID0gLUVOT0VOVDsKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqcTsKKworCUJVR19PTighYWxnLT5jcmFfbW9kdWxlKTsKKworCWRvd25fd3JpdGUoJmNyeXB0b19hbGdfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHEsICZjcnlwdG9fYWxnX2xpc3QsIGNyYV9saXN0KSB7CisJCWlmIChhbGcgPT0gcSkgeworCQkJbGlzdF9kZWwoJmFsZy0+Y3JhX2xpc3QpOworCQkJcmV0ID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorb3V0OgorCXVwX3dyaXRlKCZjcnlwdG9fYWxnX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGNyeXB0b19hbGdfYXZhaWxhYmxlKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBmbGFncykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnID0gY3J5cHRvX2FsZ19tb2RfbG9va3VwKG5hbWUpOworCisJaWYgKGFsZykgeworCQljcnlwdG9fYWxnX3B1dChhbGcpOworCQlyZXQgPSAxOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfY3J5cHRvKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGl6aW5nIENyeXB0b2dyYXBoaWMgQVBJXG4iKTsKKwljcnlwdG9faW5pdF9wcm9jKCk7CisJcmV0dXJuIDA7Cit9CisKK19faW5pdGNhbGwoaW5pdF9jcnlwdG8pOworCisvKgorRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX3JlZ2lzdGVyX2FsZyk7CitFWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fdW5yZWdpc3Rlcl9hbGcpOworRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX2FsbG9jX3RmbSk7CitFWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fZnJlZV90Zm0pOworRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX2FsZ19hdmFpbGFibGUpOworKi8KKworRVhQT1JUX1NZTUJPTF9OT1ZFUlMoY3J5cHRvX3JlZ2lzdGVyX2FsZyk7CitFWFBPUlRfU1lNQk9MX05PVkVSUyhjcnlwdG9fdW5yZWdpc3Rlcl9hbGcpOworRVhQT1JUX1NZTUJPTF9OT1ZFUlMoY3J5cHRvX2FsbG9jX3RmbSk7CitFWFBPUlRfU1lNQk9MX05PVkVSUyhjcnlwdG9fZnJlZV90Zm0pOworRVhQT1JUX1NZTUJPTF9OT1ZFUlMoY3J5cHRvX2FsZ19hdmFpbGFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hcmM0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2FyYzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2FkOGQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hcmM0LmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSQorICoKKyAqIEFSQzQgQ2lwaGVyIEFsZ29yaXRobQorICoKKyAqIEpvbiBPYmVyaGVpZGUgPGpvbkBvYmVyaGVpZGUub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKKworI2RlZmluZSBBUkM0X01JTl9LRVlfU0laRQkxCisjZGVmaW5lIEFSQzRfTUFYX0tFWV9TSVpFCTI1NgorI2RlZmluZSBBUkM0X0JMT0NLX1NJWkUJCTEKKworc3RydWN0IGFyYzRfY3R4IHsKKwl1OCBTWzI1Nl07CisJdTggeCwgeTsKK307CisKK3N0YXRpYyBpbnQgYXJjNF9zZXRfa2V5KHZvaWQgKmN0eF9hcmcsIGNvbnN0IHU4ICppbl9rZXksIHVuc2lnbmVkIGludCBrZXlfbGVuLCB1MzIgKmZsYWdzKQoreworCXN0cnVjdCBhcmM0X2N0eCAqY3R4ID0gY3R4X2FyZzsKKwlpbnQgaSwgaiA9IDAsIGsgPSAwOworCisJY3R4LT54ID0gMTsKKwljdHgtPnkgPSAwOworCisJZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCWN0eC0+U1tpXSA9IGk7CisKKwlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwl7CisJCXU4IGEgPSBjdHgtPlNbaV07CisJCWogPSAoaiArIGluX2tleVtrXSArIGEpICYgMHhmZjsKKwkJY3R4LT5TW2ldID0gY3R4LT5TW2pdOworCQljdHgtPlNbal0gPSBhOworCQlpZigodW5zaWduZWQgaW50KSsrayA+PSBrZXlfbGVuKQorCQkJayA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFyYzRfY3J5cHQodm9pZCAqY3R4X2FyZywgdTggKm91dCwgY29uc3QgdTggKmluKQoreworCXN0cnVjdCBhcmM0X2N0eCAqY3R4ID0gY3R4X2FyZzsKKworCXU4ICpjb25zdCBTID0gY3R4LT5TOworCXU4IHggPSBjdHgtPng7CisJdTggeSA9IGN0eC0+eTsKKwl1OCBhLCBiOworCisJYSA9IFNbeF07CisJeSA9ICh5ICsgYSkgJiAweGZmOworCWIgPSBTW3ldOworCVNbeF0gPSBiOworCVNbeV0gPSBhOworCXggPSAoeCArIDEpICYgMHhmZjsKKwkqb3V0KysgPSAqaW4gXiBTWyhhICsgYikgJiAweGZmXTsKKworCWN0eC0+eCA9IHg7CisJY3R4LT55ID0geTsKK30KKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGFyYzRfYWxnID0geworCS5jcmFfbmFtZQkJPQkiYXJjNCIsCisJLmNyYV9mbGFncwkJPQlDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAorCS5jcmFfYmxvY2tzaXplCQk9CUFSQzRfQkxPQ0tfU0laRSwKKwkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBhcmM0X2N0eCksCisJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCisJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGFyYzRfYWxnLmNyYV9saXN0KSwKKwkuY3JhX3UJCQk9CXsgLmNpcGhlciA9IHsKKwkuY2lhX21pbl9rZXlzaXplCT0JQVJDNF9NSU5fS0VZX1NJWkUsCisJLmNpYV9tYXhfa2V5c2l6ZQk9CUFSQzRfTUFYX0tFWV9TSVpFLAorCS5jaWFfc2V0a2V5CQk9IAlhcmM0X3NldF9rZXksCisJLmNpYV9lbmNyeXB0CQk9CWFyYzRfY3J5cHQsCisJLmNpYV9kZWNyeXB0CQk9CWFyYzRfY3J5cHQgfSB9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBhcmM0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX2FsZygmYXJjNF9hbGcpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhcmM0X2V4aXQodm9pZCkKK3sKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmFyYzRfYWxnKTsKK30KKworbW9kdWxlX2luaXQoYXJjNF9pbml0KTsKK21vZHVsZV9leGl0KGFyYzRfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQVJDNCBDaXBoZXIgQWxnb3JpdGhtIik7CitNT0RVTEVfQVVUSE9SKCJKb24gT2JlcmhlaWRlIDxqb25Ab2JlcmhlaWRlLm9yZz4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYXV0b2xvYWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYXV0b2xvYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTc3NTZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hdXRvbG9hZC5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBBbGdvcml0aG0gYXV0b2xvYWRlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpbmNsdWRlICJrbWFwX3R5cGVzLmgiCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworLyoKKyAqIEEgZmFyIG1vcmUgaW50ZWxsaWdlbnQgdmVyc2lvbiBvZiB0aGlzIGlzIHBsYW5uZWQuICBGb3Igbm93LCBqdXN0CisgKiB0cnkgYW4gZXhhY3QgbWF0Y2ggb24gdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobS4KKyAqLwordm9pZCBjcnlwdG9fYWxnX2F1dG9sb2FkKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmVxdWVzdF9tb2R1bGUobmFtZSk7Cit9CisKK3N0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX21vZF9sb29rdXAoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnID0gY3J5cHRvX2FsZ19sb29rdXAobmFtZSk7CisJaWYgKGFsZyA9PSBOVUxMKSB7CisJCWNyeXB0b19hbGdfYXV0b2xvYWQobmFtZSk7CisJCWFsZyA9IGNyeXB0b19hbGdfbG9va3VwKG5hbWUpOworCX0KKwlyZXR1cm4gYWxnOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9jaXBoZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY2lwaGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI5ZThhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY2lwaGVyLmMKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBDaXBoZXIgb3BlcmF0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAic2NhdHRlcndhbGsuaCIKKwordHlwZWRlZiB2b2lkIChjcnlwdGZuX3QpKHZvaWQgKiwgdTggKiwgY29uc3QgdTggKik7Cit0eXBlZGVmIHZvaWQgKHByb2Nmbl90KShzdHJ1Y3QgY3J5cHRvX3RmbSAqLCB1OCAqLAorCQkJdTgqLCBjcnlwdGZuX3QsIGludCBlbmMsIHZvaWQgKiwgaW50KTsKKworc3RhdGljIGlubGluZSB2b2lkIHhvcl82NCh1OCAqYSwgY29uc3QgdTggKmIpCit7CisJKCh1MzIgKilhKVswXSBePSAoKHUzMiAqKWIpWzBdOworCSgodTMyICopYSlbMV0gXj0gKCh1MzIgKiliKVsxXTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHhvcl8xMjgodTggKmEsIGNvbnN0IHU4ICpiKQoreworCSgodTMyICopYSlbMF0gXj0gKCh1MzIgKiliKVswXTsKKwkoKHUzMiAqKWEpWzFdIF49ICgodTMyICopYilbMV07CisJKCh1MzIgKilhKVsyXSBePSAoKHUzMiAqKWIpWzJdOworCSgodTMyICopYSlbM10gXj0gKCh1MzIgKiliKVszXTsKK30KKworCisvKgorICogR2VuZXJpYyBlbmNyeXB0L2RlY3J5cHQgd3JhcHBlciBmb3IgY2lwaGVycywgaGFuZGxlcyBvcGVyYXRpb25zIGFjcm9zcworICogbXVsdGlwbGUgcGFnZSBib3VuZGFyaWVzIGJ5IHVzaW5nIHRlbXBvcmFyeSBibG9ja3MuICBJbiB1c2VyIGNvbnRleHQsCisgKiB0aGUga2VybmVsIGlzIGdpdmVuIGEgY2hhbmNlIHRvIHNjaGVkdWxlIHVzIG9uY2UgcGVyIGJsb2NrLgorICovCitzdGF0aWMgaW50IGNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkgdW5zaWduZWQgaW50IG5ieXRlcywgY3J5cHRmbl90IGNyZm4sCisJCSBwcm9jZm5fdCBwcmZuLCBpbnQgZW5jLCB2b2lkICppbmZvKQoreworCXN0cnVjdCBzY2F0dGVyX3dhbGsgd2Fsa19pbiwgd2Fsa19vdXQ7CisJY29uc3QgdW5zaWduZWQgaW50IGJzaXplID0gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSk7CisJdTggdG1wX3NyY1tic2l6ZV07CisJdTggdG1wX2RzdFtic2l6ZV07CisKKwlpZiAoIW5ieXRlcykKKwkJcmV0dXJuIDA7CisKKwlpZiAobmJ5dGVzICUgYnNpemUpIHsKKwkJdGZtLT5jcnRfZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0JMT0NLX0xFTjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2NhdHRlcndhbGtfc3RhcnQoJndhbGtfaW4sIHNyYyk7CisJc2NhdHRlcndhbGtfc3RhcnQoJndhbGtfb3V0LCBkc3QpOworCisJZm9yKDs7KSB7CisJCXU4ICpzcmNfcCwgKmRzdF9wOworCQlpbnQgaW5fcGxhY2U7CisKKwkJc2NhdHRlcndhbGtfbWFwKCZ3YWxrX2luLCAwKTsKKwkJc2NhdHRlcndhbGtfbWFwKCZ3YWxrX291dCwgMSk7CisJCXNyY19wID0gc2NhdHRlcndhbGtfd2hpY2hidWYoJndhbGtfaW4sIGJzaXplLCB0bXBfc3JjKTsKKwkJZHN0X3AgPSBzY2F0dGVyd2Fsa193aGljaGJ1Zigmd2Fsa19vdXQsIGJzaXplLCB0bXBfZHN0KTsKKwkJaW5fcGxhY2UgPSBzY2F0dGVyd2Fsa19zYW1lYnVmKCZ3YWxrX2luLCAmd2Fsa19vdXQsCisJCQkJCSAgICAgICBzcmNfcCwgZHN0X3ApOworCisJCW5ieXRlcyAtPSBic2l6ZTsKKworCQlzY2F0dGVyd2Fsa19jb3B5Y2h1bmtzKHNyY19wLCAmd2Fsa19pbiwgYnNpemUsIDApOworCisJCXByZm4odGZtLCBkc3RfcCwgc3JjX3AsIGNyZm4sIGVuYywgaW5mbywgaW5fcGxhY2UpOworCisJCXNjYXR0ZXJ3YWxrX2RvbmUoJndhbGtfaW4sIDAsIG5ieXRlcyk7CisKKwkJc2NhdHRlcndhbGtfY29weWNodW5rcyhkc3RfcCwgJndhbGtfb3V0LCBic2l6ZSwgMSk7CisJCXNjYXR0ZXJ3YWxrX2RvbmUoJndhbGtfb3V0LCAxLCBuYnl0ZXMpOworCisJCWlmICghbmJ5dGVzKQorCQkJcmV0dXJuIDA7CisKKwkJY3J5cHRvX3lpZWxkKHRmbSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjYmNfcHJvY2VzcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCB1OCAqc3JjLAorCQkJY3J5cHRmbl90IGZuLCBpbnQgZW5jLCB2b2lkICppbmZvLCBpbnQgaW5fcGxhY2UpCit7CisJdTggKml2ID0gaW5mbzsKKworCS8qIE51bGwgZW5jcnlwdGlvbiAqLworCWlmICghaXYpCisJCXJldHVybjsKKworCWlmIChlbmMpIHsKKwkJdGZtLT5jcnRfdS5jaXBoZXIuY2l0X3hvcl9ibG9jayhpdiwgc3JjKTsKKwkJZm4oY3J5cHRvX3RmbV9jdHgodGZtKSwgZHN0LCBpdik7CisJCW1lbWNweShpdiwgZHN0LCBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSk7CisJfSBlbHNlIHsKKwkJdTggc3RhY2tbaW5fcGxhY2UgPyBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSA6IDBdOworCQl1OCAqYnVmID0gaW5fcGxhY2UgPyBzdGFjayA6IGRzdDsKKworCQlmbihjcnlwdG9fdGZtX2N0eCh0Zm0pLCBidWYsIHNyYyk7CisJCXRmbS0+Y3J0X3UuY2lwaGVyLmNpdF94b3JfYmxvY2soYnVmLCBpdik7CisJCW1lbWNweShpdiwgc3JjLCBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSk7CisJCWlmIChidWYgIT0gZHN0KQorCQkJbWVtY3B5KGRzdCwgYnVmLCBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlY2JfcHJvY2VzcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCB1OCAqc3JjLAorCQkJY3J5cHRmbl90IGZuLCBpbnQgZW5jLCB2b2lkICppbmZvLCBpbnQgaW5fcGxhY2UpCit7CisJZm4oY3J5cHRvX3RmbV9jdHgodGZtKSwgZHN0LCBzcmMpOworfQorCitzdGF0aWMgaW50IHNldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCXN0cnVjdCBjaXBoZXJfYWxnICpjaWEgPSAmdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXI7CisKKwlpZiAoa2V5bGVuIDwgY2lhLT5jaWFfbWluX2tleXNpemUgfHwga2V5bGVuID4gY2lhLT5jaWFfbWF4X2tleXNpemUpIHsKKwkJdGZtLT5jcnRfZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU47CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZQorCQlyZXR1cm4gY2lhLT5jaWFfc2V0a2V5KGNyeXB0b190Zm1fY3R4KHRmbSksIGtleSwga2V5bGVuLAorCQkJCSAgICAgICAmdGZtLT5jcnRfZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGVjYl9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXJldHVybiBjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsCisJCSAgICAgdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2VuY3J5cHQsCisJCSAgICAgZWNiX3Byb2Nlc3MsIDEsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGVjYl9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAorCQkgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9kZWNyeXB0LAorCQkgICAgIGVjYl9wcm9jZXNzLCAxLCBOVUxMKTsKK30KKworc3RhdGljIGludCBjYmNfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkJICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJcmV0dXJuIGNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywKKwkJICAgICB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCwKKwkJICAgICBjYmNfcHJvY2VzcywgMSwgdGZtLT5jcnRfY2lwaGVyLmNpdF9pdik7Cit9CisKK3N0YXRpYyBpbnQgY2JjX2VuY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkJICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpCit7CisJcmV0dXJuIGNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywKKwkJICAgICB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCwKKwkJICAgICBjYmNfcHJvY2VzcywgMSwgaXYpOworfQorCitzdGF0aWMgaW50IGNiY19kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAorCQkgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9kZWNyeXB0LAorCQkgICAgIGNiY19wcm9jZXNzLCAwLCB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2KTsKK30KKworc3RhdGljIGludCBjYmNfZGVjcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCQkgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKK3sKKwlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAorCQkgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9kZWNyeXB0LAorCQkgICAgIGNiY19wcm9jZXNzLCAwLCBpdik7Cit9CisKK3N0YXRpYyBpbnQgbm9jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyBpbnQgbm9jcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCSAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworaW50IGNyeXB0b19pbml0X2NpcGhlcl9mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpCit7CisJdTMyIG1vZGUgPSBmbGFncyAmIENSWVBUT19URk1fTU9ERV9NQVNLOworCisJdGZtLT5jcnRfY2lwaGVyLmNpdF9tb2RlID0gbW9kZSA/IG1vZGUgOiBDUllQVE9fVEZNX01PREVfRUNCOworCWlmIChmbGFncyAmIENSWVBUT19URk1fUkVRX1dFQUtfS0VZKQorCQl0Zm0tPmNydF9mbGFncyA9IENSWVBUT19URk1fUkVRX1dFQUtfS0VZOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjcnlwdG9faW5pdF9jaXBoZXJfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGNpcGhlcl90Zm0gKm9wcyA9ICZ0Zm0tPmNydF9jaXBoZXI7CisKKwlvcHMtPmNpdF9zZXRrZXkgPSBzZXRrZXk7CisKKwlzd2l0Y2ggKHRmbS0+Y3J0X2NpcGhlci5jaXRfbW9kZSkgeworCWNhc2UgQ1JZUFRPX1RGTV9NT0RFX0VDQjoKKwkJb3BzLT5jaXRfZW5jcnlwdCA9IGVjYl9lbmNyeXB0OworCQlvcHMtPmNpdF9kZWNyeXB0ID0gZWNiX2RlY3J5cHQ7CisJCWJyZWFrOworCisJY2FzZSBDUllQVE9fVEZNX01PREVfQ0JDOgorCQlvcHMtPmNpdF9lbmNyeXB0ID0gY2JjX2VuY3J5cHQ7CisJCW9wcy0+Y2l0X2RlY3J5cHQgPSBjYmNfZGVjcnlwdDsKKwkJb3BzLT5jaXRfZW5jcnlwdF9pdiA9IGNiY19lbmNyeXB0X2l2OworCQlvcHMtPmNpdF9kZWNyeXB0X2l2ID0gY2JjX2RlY3J5cHRfaXY7CisJCWJyZWFrOworCisJY2FzZSBDUllQVE9fVEZNX01PREVfQ0ZCOgorCQlvcHMtPmNpdF9lbmNyeXB0ID0gbm9jcnlwdDsKKwkJb3BzLT5jaXRfZGVjcnlwdCA9IG5vY3J5cHQ7CisJCW9wcy0+Y2l0X2VuY3J5cHRfaXYgPSBub2NyeXB0X2l2OworCQlvcHMtPmNpdF9kZWNyeXB0X2l2ID0gbm9jcnlwdF9pdjsKKwkJYnJlYWs7CisKKwljYXNlIENSWVBUT19URk1fTU9ERV9DVFI6CisJCW9wcy0+Y2l0X2VuY3J5cHQgPSBub2NyeXB0OworCQlvcHMtPmNpdF9kZWNyeXB0ID0gbm9jcnlwdDsKKwkJb3BzLT5jaXRfZW5jcnlwdF9pdiA9IG5vY3J5cHRfaXY7CisJCW9wcy0+Y2l0X2RlY3J5cHRfaXYgPSBub2NyeXB0X2l2OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCWlmIChvcHMtPmNpdF9tb2RlID09IENSWVBUT19URk1fTU9ERV9DQkMpIHsKKworCQlzd2l0Y2ggKGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pKSB7CisJCWNhc2UgODoKKwkJCW9wcy0+Y2l0X3hvcl9ibG9jayA9IHhvcl82NDsKKwkJCWJyZWFrOworCisJCWNhc2UgMTY6CisJCQlvcHMtPmNpdF94b3JfYmxvY2sgPSB4b3JfMTI4OworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBibG9jayBzaXplICV1IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkgICAgICAgY3J5cHRvX3RmbV9hbGdfbmFtZSh0Zm0pLAorCQkJICAgICAgIGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCW9wcy0+Y2l0X2l2c2l6ZSA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pOworCQlvcHMtPmNpdF9pdiA9IGttYWxsb2Mob3BzLT5jaXRfaXZzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKG9wcy0+Y2l0X2l2ID09IE5VTEwpCisJCQlyZXQgPSAtRU5PTUVNOworCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgY3J5cHRvX2V4aXRfY2lwaGVyX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCWlmICh0Zm0tPmNydF9jaXBoZXIuY2l0X2l2KQorCQlrZnJlZSh0Zm0tPmNydF9jaXBoZXIuY2l0X2l2KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY29tcHJlc3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmMyM2M5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9jb21wcmVzcy5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBDb21wcmVzc2lvbiBvcGVyYXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlICJydGxfY3J5cHRvLmgiCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgaW50IGNyeXB0b19jb21wcmVzcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkJICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorCQkJICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbikKK3sKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9jb21wcmVzcy5jb2FfY29tcHJlc3MoY3J5cHRvX3RmbV9jdHgodGZtKSwKKwkJCQkJCQkgc3JjLCBzbGVuLCBkc3QsCisJCQkJCQkJIGRsZW4pOworfQorCitzdGF0aWMgaW50IGNyeXB0b19kZWNvbXByZXNzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCQkgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorCQkJICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCit7CisJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfY29tcHJlc3MuY29hX2RlY29tcHJlc3MoY3J5cHRvX3RmbV9jdHgodGZtKSwKKwkJCQkJCQkgICBzcmMsIHNsZW4sIGRzdCwKKwkJCQkJCQkgICBkbGVuKTsKK30KKworaW50IGNyeXB0b19pbml0X2NvbXByZXNzX2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKK3sKKwlyZXR1cm4gZmxhZ3MgPyAtRUlOVkFMIDogMDsKK30KKworaW50IGNyeXB0b19pbml0X2NvbXByZXNzX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBjb21wcmVzc190Zm0gKm9wcyA9ICZ0Zm0tPmNydF9jb21wcmVzczsKKworCXJldCA9IHRmbS0+X19jcnRfYWxnLT5jcmFfY29tcHJlc3MuY29hX2luaXQoY3J5cHRvX3RmbV9jdHgodGZtKSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlvcHMtPmNvdF9jb21wcmVzcyA9IGNyeXB0b19jb21wcmVzczsKKwlvcHMtPmNvdF9kZWNvbXByZXNzID0gY3J5cHRvX2RlY29tcHJlc3M7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGNyeXB0b19leGl0X2NvbXByZXNzX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXRmbS0+X19jcnRfYWxnLT5jcmFfY29tcHJlc3MuY29hX2V4aXQoY3J5cHRvX3RmbV9jdHgodGZtKSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2NyeXB0b19jb21wYXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY3J5cHRvX2NvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNDg2NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2NyeXB0b19jb21wYXQuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogSGVhZGVyIGZpbGUgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSBhbW9uZyBkaWZmZXJlbnQga2VybmVsIHZlcnNpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2ICA8bGF3cmVuY2Vfd2FuZ0ByZWFsc2lsLmNvbS5jbj4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKworc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkJCQkJdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2VuY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzKTsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZGVjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMpOworfQorCisgc3RydWN0IGNyeXB0b190Zm0gKmNyeXB0b19hbGxvY190Zm0oY29uc3QgY2hhciAqbmFtZSwgdTMyIGZsYWdzKQoreworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBOVUxMOworCWludCBlcnI7CisJcHJpbnRrKCJjYWxsIGNyeXB0b19hbGxvY190Zm0hISFcbiIpOworCWRvIHsKKwkJc3RydWN0IGNyeXB0b19hbGcgKmFsZzsKKworCQlhbGcgPSBjcnlwdG9fYWxnX21vZF9sb29rdXAobmFtZSwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJCWVyciA9IFBUUl9FUlIoYWxnKTsKKwkJaWYgKElTX0VSUihhbGcpKQorCQkJY29udGludWU7CisKKwkJdGZtID0gX19jcnlwdG9fYWxsb2NfdGZtKGFsZywgZmxhZ3MpOworCQllcnIgPSAwOworCQlpZiAoSVNfRVJSKHRmbSkpIHsKKwkJCWNyeXB0b19tb2RfcHV0KGFsZyk7CisJCQllcnIgPSBQVFJfRVJSKHRmbSk7CisJCQl0Zm0gPSBOVUxMOworCQl9CisJfSB3aGlsZSAoZXJyID09IC1FQUdBSU4gJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKTsKKworCXJldHVybiB0Zm07Cit9CisvL0VYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19hbGxvY190Zm0pOworLy9FWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fZnJlZV90Zm0pOworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZGlnZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RpZ2VzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMWVkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RpZ2VzdC5jCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ3J5cHRvZ3JhcGhpYyBBUEkuCisgKgorICogRGlnZXN0IG9wZXJhdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisvLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlICJydGxfY3J5cHRvLmgiCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgdm9pZCBpbml0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX2luaXQoY3J5cHRvX3RmbV9jdHgodGZtKSk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5zZzsgaSsrKSB7CisKKwkJc3RydWN0IHBhZ2UgKnBnID0gc2dbaV0ucGFnZTsKKwkJdW5zaWduZWQgaW50IG9mZnNldCA9IHNnW2ldLm9mZnNldDsKKwkJdW5zaWduZWQgaW50IGwgPSBzZ1tpXS5sZW5ndGg7CisKKwkJZG8geworCQkJdW5zaWduZWQgaW50IGJ5dGVzX2Zyb21fcGFnZSA9IG1pbihsLCAoKHVuc2lnbmVkIGludCkKKwkJCQkJCQkgICAoUEFHRV9TSVpFKSkgLQorCQkJCQkJCSAgIG9mZnNldCk7CisJCQljaGFyICpwID0gY3J5cHRvX2ttYXAocGcsIDApICsgb2Zmc2V0OworCisJCQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfdXBkYXRlCisJCQkJCShjcnlwdG9fdGZtX2N0eCh0Zm0pLCBwLAorCQkJCQkgYnl0ZXNfZnJvbV9wYWdlKTsKKwkJCWNyeXB0b19rdW5tYXAocCwgMCk7CisJCQljcnlwdG9feWllbGQodGZtKTsKKwkJCW9mZnNldCA9IDA7CisJCQlwZysrOworCQkJbCAtPSBieXRlc19mcm9tX3BhZ2U7CisJCX0gd2hpbGUgKGwgPiAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpCit7CisJdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX2ZpbmFsKGNyeXB0b190Zm1fY3R4KHRmbSksIG91dCk7Cit9CisKK3N0YXRpYyBpbnQgc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCit7CisJdTMyIGZsYWdzOworCWlmICh0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfc2V0a2V5ID09IE5VTEwpCisJCXJldHVybiAtRU5PU1lTOworCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfc2V0a2V5KGNyeXB0b190Zm1fY3R4KHRmbSksCisJCQkJCQkgICAgIGtleSwga2V5bGVuLCAmZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBkaWdlc3Qoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZywgdTggKm91dCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCXRmbS0+Y3J0X2RpZ2VzdC5kaXRfaW5pdCh0Zm0pOworCisJZm9yIChpID0gMDsgaSA8IG5zZzsgaSsrKSB7CisJCWNoYXIgKnAgPSBjcnlwdG9fa21hcChzZ1tpXS5wYWdlLCAwKSArIHNnW2ldLm9mZnNldDsKKwkJdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX3VwZGF0ZShjcnlwdG9fdGZtX2N0eCh0Zm0pLAorCQkJCQkJICAgICAgcCwgc2dbaV0ubGVuZ3RoKTsKKwkJY3J5cHRvX2t1bm1hcChwLCAwKTsKKwkJY3J5cHRvX3lpZWxkKHRmbSk7CisJfQorCWNyeXB0b19kaWdlc3RfZmluYWwodGZtLCBvdXQpOworfQorCitpbnQgY3J5cHRvX2luaXRfZGlnZXN0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKK3sKKwlyZXR1cm4gZmxhZ3MgPyAtRUlOVkFMIDogMDsKK30KKworaW50IGNyeXB0b19pbml0X2RpZ2VzdF9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlzdHJ1Y3QgZGlnZXN0X3RmbSAqb3BzID0gJnRmbS0+Y3J0X2RpZ2VzdDsKKworCW9wcy0+ZGl0X2luaXQJPSBpbml0OworCW9wcy0+ZGl0X3VwZGF0ZQk9IHVwZGF0ZTsKKwlvcHMtPmRpdF9maW5hbAk9IGZpbmFsOworCW9wcy0+ZGl0X2RpZ2VzdAk9IGRpZ2VzdDsKKwlvcHMtPmRpdF9zZXRrZXkJPSBzZXRrZXk7CisKKwlyZXR1cm4gY3J5cHRvX2FsbG9jX2htYWNfYmxvY2sodGZtKTsKK30KKwordm9pZCBjcnlwdG9fZXhpdF9kaWdlc3Rfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJY3J5cHRvX2ZyZWVfaG1hY19ibG9jayh0Zm0pOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxY2JmYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmMKQEAgLTAsMCArMSwyMjMgQEAKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLwlGaWxlOgorLy8JCURvdDExZC5jCisvLworLy8JRGVzY3JpcHRpb246CisvLwkJSW1wbGVtZW50IDgwMi4xMWQuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaW5jbHVkZSAiZG90MTFkLmgiCisKK3ZvaWQKK0RvdDExZF9Jbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhpZWVlKTsKKworCXBEb3QxMWRJbmZvLT5iRW5hYmxlZCA9IDA7CisKKwlwRG90MTFkSW5mby0+U3RhdGUgPSBET1QxMURfU1RBVEVfTk9ORTsKKwlwRG90MTFkSW5mby0+Q291bnRyeUllTGVuID0gMDsKKwltZW1zZXQocERvdDExZEluZm8tPmNoYW5uZWxfbWFwLCAwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisJbWVtc2V0KHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3QsIDB4RkYsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKKwlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7CisKKwlwcmludGsoIkRvdDExZF9Jbml0KClcbiIpOworfQorCisvLworLy8JRGVzY3JpcHRpb246CisvLwkJUmVzZXQgdG8gdGhlIHN0YXRlIGFzIHdlIGFyZSBqdXN0IGVudGVyaW5nIGEgcmVndWxhdG9yeSBkb21haW4uCisvLwordm9pZAorRG90MTFkX1Jlc2V0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXUzMiBpOworCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhpZWVlKTsKKwkvLyBDbGVhciBvbGQgY2hhbm5lbCBtYXAKKwltZW1zZXQocERvdDExZEluZm8tPmNoYW5uZWxfbWFwLCAwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisJbWVtc2V0KHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3QsIDB4RkYsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKKwkvLyBTZXQgbmV3IGNoYW5uZWwgbWFwCisJZm9yIChpPTE7IGk8PTExOyBpKyspIHsKKwkJKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcClbaV0gPSAxOworCX0KKwlmb3IgKGk9MTI7IGk8PTE0OyBpKyspIHsKKwkJKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcClbaV0gPSAyOworCX0KKworCXBEb3QxMWRJbmZvLT5TdGF0ZSA9IERPVDExRF9TVEFURV9OT05FOworCXBEb3QxMWRJbmZvLT5Db3VudHJ5SWVMZW4gPSAwOworCVJFU0VUX0NJRV9XQVRDSERPRyhpZWVlKTsKKworCS8vcHJpbnRrKCJEb3QxMWRfUmVzZXQoKVxuIik7Cit9CisKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlVcGRhdGUgY291bnRyeSBJRSBmcm9tIEJlYWNvbiBvciBQcm9iZSBSZXNvcG5zZQorLy8JCWFuZCBjb25maWd1cmUgUEhZIGZvciBvcGVyYXRpb24gaW4gdGhlIHJlZ3VsYXRvcnkgZG9tYWluLgorLy8KKy8vCVRPRE86CisvLwkJQ29uZmlndXJlIFR4IHBvd2VyLgorLy8KKy8vCUFzc3VtcHRpb246CisvLwkJMS4gSVNfRE9UMTFEX0VOQUJMRSgpIGlzIFRSVUUuCisvLwkJMi4gSW5wdXQgSUUgaXMgYW4gdmFsaWQgb25lLgorLy8KK3ZvaWQKK0RvdDExZF9VcGRhdGVDb3VudHJ5SWUoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwKKwl1OCAqCQlwVGFkZHIsCisJdTE2CUNvdXRyeUllTGVuLAorCXU4ICogcENvdXRyeUllCisJKQoreworCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOworCXU4IGksIGosIE51bVRyaXBsZXMsIE1heENobmxOdW07CisJUENITkxfVFhQT1dFUl9UUklQTEUgcFRyaXBsZTsKKworCW1lbXNldChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXAsIDAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKKwltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOworCU1heENobmxOdW0gPSAwOworCU51bVRyaXBsZXMgPSAoQ291dHJ5SWVMZW4gLSAzKSAvIDM7IC8vIHNraXAgMy1ieXRlIGNvdW50cnkgc3RyaW5nLgorCXBUcmlwbGUgPSAoUENITkxfVFhQT1dFUl9UUklQTEUpKHBDb3V0cnlJZSArIDMpOworCWZvcihpID0gMDsgaSA8IE51bVRyaXBsZXM7IGkrKykKKwl7CisJCWlmKE1heENobmxOdW0gPj0gcFRyaXBsZS0+Rmlyc3RDaG5sKQorCQl7IC8vIEl0IGlzIG5vdCBpbiBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBvcmRlciwgc28gc3RvcCBwcm9jZXNzaW5nLgorCQkJcHJpbnRrKCJEb3QxMWRfVXBkYXRlQ291bnRyeUllKCk6IEludmFsaWQgY291bnRyeSBJRSwgc2tpcCBpdC4uLi4uLi4uMVxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYoTUFYX0NIQU5ORUxfTlVNQkVSIDwgKHBUcmlwbGUtPkZpcnN0Q2hubCArIHBUcmlwbGUtPk51bUNobmxzKSkKKwkJeyAvLyBJdCBpcyBub3QgYSB2YWxpZCBzZXQgb2YgY2hhbm5lbCBpZCwgc28gc3RvcCBwcm9jZXNzaW5nLgorCQkJcHJpbnRrKCJEb3QxMWRfVXBkYXRlQ291bnRyeUllKCk6IEludmFsaWQgY291bnRyeSBJRSwgc2tpcCBpdC4uLi4uLi4uMlxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQlmb3IoaiA9IDAgOyBqIDwgcFRyaXBsZS0+TnVtQ2hubHM7IGorKykKKwkJeworCQkJcERvdDExZEluZm8tPmNoYW5uZWxfbWFwW3BUcmlwbGUtPkZpcnN0Q2hubCArIGpdID0gMTsKKwkJCXBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3RbcFRyaXBsZS0+Rmlyc3RDaG5sICsgal0gPSBwVHJpcGxlLT5NYXhUeFBvd2VySW5EYm07CisJCQlNYXhDaG5sTnVtID0gcFRyaXBsZS0+Rmlyc3RDaG5sICsgajsKKwkJfQorCisJCXBUcmlwbGUgPSAoUENITkxfVFhQT1dFUl9UUklQTEUpKCh1OCopcFRyaXBsZSArIDMpOworCX0KKwkvL3ByaW50aygiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBDaGFubmVsIExpc3Q6XG4iKTsKKwlwcmludGsoIkNoYW5uZWwgTGlzdDoiKTsKKwlmb3IoaT0xOyBpPD0gTUFYX0NIQU5ORUxfTlVNQkVSOyBpKyspCisJCWlmKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtpXSA+IDApCisJCQlwcmludGsoIiAlZCIsIGkpOworCXByaW50aygiXG4iKTsKKworCVVQREFURV9DSUVfU1JDKGRldiwgcFRhZGRyKTsKKworCXBEb3QxMWRJbmZvLT5Db3VudHJ5SWVMZW4gPSBDb3V0cnlJZUxlbjsKKwltZW1jcHkocERvdDExZEluZm8tPkNvdW50cnlJZUJ1ZiwgcENvdXRyeUllLENvdXRyeUllTGVuKTsKKwlwRG90MTFkSW5mby0+U3RhdGUgPSBET1QxMURfU1RBVEVfTEVBUk5FRDsKK30KKworCit1OAorRE9UMTFEX0dldE1heFR4UHdySW5EYm0oCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwKKwl1OCBDaGFubmVsCisJKQoreworCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOworCXU4IE1heFR4UHdySW5EYm0gPSAyNTU7CisKKwlpZihNQVhfQ0hBTk5FTF9OVU1CRVIgPCBDaGFubmVsKQorCXsKKwkJcHJpbnRrKCJET1QxMURfR2V0TWF4VHhQd3JJbkRibSgpOiBJbnZhbGlkIENoYW5uZWxcbiIpOworCQlyZXR1cm4gTWF4VHhQd3JJbkRibTsKKwl9CisJaWYocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW0NoYW5uZWxdKQorCXsKKwkJTWF4VHhQd3JJbkRibSA9IHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3RbQ2hhbm5lbF07CisJfQorCisJcmV0dXJuIE1heFR4UHdySW5EYm07Cit9CisKKwordm9pZAorRE9UMTFEX1NjYW5Db21wbGV0ZSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldgorCSkKK3sKKwlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oZGV2KTsKKworCXN3aXRjaChwRG90MTFkSW5mby0+U3RhdGUpCisJeworCWNhc2UgRE9UMTFEX1NUQVRFX0xFQVJORUQ6CisJCXBEb3QxMWRJbmZvLT5TdGF0ZSA9IERPVDExRF9TVEFURV9ET05FOworCQlicmVhazsKKworCWNhc2UgRE9UMTFEX1NUQVRFX0RPTkU6CisJCWlmKCBHRVRfQ0lFX1dBVENIRE9HKGRldikgPT0gMCApCisJCXsgLy8gUmVzZXQgY291bnRyeSBJRSBpZiBwcmV2aW91cyBvbmUgaXMgZ29uZS4KKwkJCURvdDExZF9SZXNldChkZXYpOworCQl9CisJCWJyZWFrOworCWNhc2UgRE9UMTFEX1NUQVRFX05PTkU6CisJCWJyZWFrOworCX0KK30KKworaW50IElzTGVnYWxDaGFubmVsKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2LAorCXU4IGNoYW5uZWwKKykKK3sKKwlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oZGV2KTsKKworCWlmKE1BWF9DSEFOTkVMX05VTUJFUiA8IGNoYW5uZWwpCisJeworCQlwcmludGsoIklzTGVnYWxDaGFubmVsKCk6IEludmFsaWQgQ2hhbm5lbFxuIik7CisJCXJldHVybiAwOworCX0KKwlpZihwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbY2hhbm5lbF0gPiAwKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IFRvTGVnYWxDaGFubmVsKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2LAorCXU4IGNoYW5uZWwKKykKK3sKKwlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oZGV2KTsKKwl1OCBkZWZhdWx0X2NobiA9IDA7CisJdTMyIGkgPSAwOworCisJZm9yIChpPTE7IGk8PSBNQVhfQ0hBTk5FTF9OVU1CRVI7IGkrKykKKwl7CisJCWlmKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtpXSA+IDApCisJCXsKKwkJCWRlZmF1bHRfY2huID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYoTUFYX0NIQU5ORUxfTlVNQkVSIDwgY2hhbm5lbCkKKwl7CisJCXByaW50aygiSXNMZWdhbENoYW5uZWwoKTogSW52YWxpZCBDaGFubmVsXG4iKTsKKwkJcmV0dXJuIGRlZmF1bHRfY2huOworCX0KKworCWlmKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtjaGFubmVsXSA+IDApCisJCXJldHVybiBjaGFubmVsOworCisJcmV0dXJuIGRlZmF1bHRfY2huOworfQorRVhQT1JUX1NZTUJPTChEb3QxMWRfSW5pdCk7CitFWFBPUlRfU1lNQk9MKERvdDExZF9SZXNldCk7CitFWFBPUlRfU1lNQk9MKERvdDExZF9VcGRhdGVDb3VudHJ5SWUpOworRVhQT1JUX1NZTUJPTChET1QxMURfR2V0TWF4VHhQd3JJbkRibSk7CitFWFBPUlRfU1lNQk9MKERPVDExRF9TY2FuQ29tcGxldGUpOworRVhQT1JUX1NZTUJPTChJc0xlZ2FsQ2hhbm5lbCk7CitFWFBPUlRfU1lNQk9MKFRvTGVnYWxDaGFubmVsKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWI3YTRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuaApAQCAtMCwwICsxLDEwMiBAQAorI2lmbmRlZiBfX0lOQ19ET1QxMURfSAorI2RlZmluZSBfX0lOQ19ET1QxMURfSAorCisjaWZkZWYgRU5BQkxFX0RPVDExRAorI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCisvLyNkZWZpbmUgRU5BQkxFX0RPVDExRAorCisvLyNkZWZpbmUgRE9UMTFEX01BWF9DSE5MX05VTSA4MworCit0eXBlZGVmIHN0cnVjdCBfQ0hOTF9UWFBPV0VSX1RSSVBMRSB7CisJdTggRmlyc3RDaG5sOworCXU4ICBOdW1DaG5sczsKKwl1OCAgTWF4VHhQb3dlckluRGJtOworfUNITkxfVFhQT1dFUl9UUklQTEUsICpQQ0hOTF9UWFBPV0VSX1RSSVBMRTsKKwordHlwZWRlZiBlbnVtIF9ET1QxMURfU1RBVEUgeworCURPVDExRF9TVEFURV9OT05FID0gMCwKKwlET1QxMURfU1RBVEVfTEVBUk5FRCwKKwlET1QxMURfU1RBVEVfRE9ORSwKK31ET1QxMURfU1RBVEU7CisKK3R5cGVkZWYgc3RydWN0IF9SVF9ET1QxMURfSU5GTyB7CisJLy9ERUNMQVJFX1JUX09CSkVDVChSVF9ET1QxMURfSU5GTyk7CisKKwlib29sIGJFbmFibGVkOyAvLyBkb3QxMU11bHRpRG9tYWluQ2FwYWJpbGl0eUVuYWJsZWQKKworCXUxNiBDb3VudHJ5SWVMZW47IC8vID4gMCBpZiBDb3VudHJ5SWVCdWZbXSBjb250YWlucyB2YWxpZCBjb3VudHJ5IGluZm9ybWF0aW9uIGVsZW1lbnQuCisJdTggIENvdW50cnlJZUJ1ZltNQVhfSUVfTEVOXTsKKwl1OCAgQ291bnRyeUllU3JjQWRkcls2XTsgLy8gU291cmNlIEFQIG9mIHRoZSBjb3VudHJ5IElFLgorCXU4ICBDb3VudHJ5SWVXYXRjaGRvZzsKKworCXU4ICBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07ICAvLyEhIVZhbHVlIDA6IEludmFsaWQsIDE6IFZhbGlkIChhY3RpdmUgc2NhbiksIDI6IFZhbGlkIChwYXNzaXZlIHNjYW4pCisJLy91OCAgQ2hubExpc3RMZW47IC8vICNCeXRlcyB2YWxpZCBpbiBDaG5sTGlzdFtdLgorCS8vdTggIENobmxMaXN0W0RPVDExRF9NQVhfQ0hOTF9OVU1dOworCXU4ICBNYXhUeFB3ckRibUxpc3RbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOworCisJRE9UMTFEX1NUQVRFIFN0YXRlOworfVJUX0RPVDExRF9JTkZPLCAqUFJUX0RPVDExRF9JTkZPOworI2RlZmluZSBlcU1hY0FkZHIoYSxiKQkJKCAoKGEpWzBdPT0oYilbMF0gJiYgKGEpWzFdPT0oYilbMV0gJiYgKGEpWzJdPT0oYilbMl0gJiYgKGEpWzNdPT0oYilbM10gJiYgKGEpWzRdPT0oYilbNF0gJiYgKGEpWzVdPT0oYilbNV0pID8gMTowICkKKyNkZWZpbmUgY3BNYWNBZGRyKGRlcyxzcmMpCSAgICAgICgoZGVzKVswXT0oc3JjKVswXSwoZGVzKVsxXT0oc3JjKVsxXSwoZGVzKVsyXT0oc3JjKVsyXSwoZGVzKVszXT0oc3JjKVszXSwoZGVzKVs0XT0oc3JjKVs0XSwoZGVzKVs1XT0oc3JjKVs1XSkKKyNkZWZpbmUgR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpICgoUFJUX0RPVDExRF9JTkZPKSgoX19wSWVlZURldiktPnBEb3QxMWRJbmZvKSkKKworI2RlZmluZSBJU19ET1QxMURfRU5BQkxFKF9fcEllZWVEZXYpIEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+YkVuYWJsZWQKKyNkZWZpbmUgSVNfQ09VTlRSWV9JRV9WQUxJRChfX3BJZWVlRGV2KSAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVMZW4gPiAwKQorCisjZGVmaW5lIElTX0VRVUFMX0NJRV9TUkMoX19wSWVlZURldiwgX19wVGEpIGVxTWFjQWRkcihHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZVNyY0FkZHIsIF9fcFRhKQorI2RlZmluZSBVUERBVEVfQ0lFX1NSQyhfX3BJZWVlRGV2LCBfX3BUYSkgY3BNYWNBZGRyKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllU3JjQWRkciwgX19wVGEpCisKKyNkZWZpbmUgSVNfQ09VTlRSWV9JRV9DSEFOR0VEKF9fcEllZWVEZXYsIF9fSWUpIFwKKwkoKChfX0llKS5MZW5ndGggPT0gMCB8fCAoX19JZSkuTGVuZ3RoICE9IEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllTGVuKSA/IFwKKwlGQUxTRSA6IFwKKwkoIW1lbWNtcChHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZUJ1ZiwgKF9fSWUpLk9jdGV0LCAoX19JZSkuTGVuZ3RoKSkpCisKKyNkZWZpbmUgQ0lFX1dBVENIRE9HX1RIIDEKKyNkZWZpbmUgR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZVdhdGNoZG9nCisjZGVmaW5lIFJFU0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSBHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpID0gMAorI2RlZmluZSBVUERBVEVfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpICsrR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KQorCisjZGVmaW5lIElTX0RPVDExRF9TVEFURV9ET05FKF9fcEllZWVEZXYpIChHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPlN0YXRlID09IERPVDExRF9TVEFURV9ET05FKQorCisKK3ZvaWQKK0RvdDExZF9Jbml0KAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYKKwkpOworCit2b2lkCitEb3QxMWRfUmVzZXQoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldgorCSk7CisKK3ZvaWQKK0RvdDExZF9VcGRhdGVDb3VudHJ5SWUoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwKKwl1OCAqCQlwVGFkZHIsCisJdTE2CUNvdXRyeUllTGVuLAorCXU4ICogcENvdXRyeUllCisJKTsKKwordTgKK0RPVDExRF9HZXRNYXhUeFB3ckluRGJtKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsCisJdTggQ2hhbm5lbAorCSk7CisKK3ZvaWQKK0RPVDExRF9TY2FuQ29tcGxldGUoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYKKwkpOworCitpbnQgSXNMZWdhbENoYW5uZWwoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYsCisJdTggY2hhbm5lbAorKTsKKworaW50IFRvTGVnYWxDaGFubmVsKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2LAorCXU4IGNoYW5uZWwKKyk7CisjZW5kaWYgLy9FTkFCTEVfRE9UMTFECisjZW5kaWYgLy8gI2lmbmRlZiBfX0lOQ19ET1QxMURfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA5MDhlMTIzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaApAQCAtMCwwICsxLDI2MzkgQEAKKy8qCisgKiBNZXJnZWQgd2l0aCBtYWlubGluZSBpZWVlODAyMTEuaCBpbiBBdWcgMjAwNC4gIE9yaWdpbmFsIGllZWU4MDJfMTEKKyAqIHJlbWFpbnMgY29weXJpZ2h0IGJ5IHRoZSBvcmlnaW5hbCBhdXRob3JzCisgKgorICogUG9ydGlvbnMgb2YgdGhlIG1lcmdlZCBjb2RlIGFyZSBiYXNlZCBvbiBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcworICogTEFOIGFjY2VzcyBwb2ludCkgZHJpdmVyIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBBZGFwdGlvbiB0byBhIGdlbmVyaWMgSUVFRSA4MDIuMTEgc3RhY2sgYnkgSmFtZXMgS2V0cmVub3MKKyAqIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEludGVsIENvcnBvcmF0aW9uCisgKgorICogTW9kaWZpZWQgZm9yIFJlYWx0ZWsncyB3aS1maSBjYXJkcyBieSBBbmRyZWEgTWVyZWxsbworICogPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgSUVFRTgwMjExX0gKKyNkZWZpbmUgSUVFRTgwMjExX0gKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPiAvKiBFVEhfQUxFTiAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPiAgIC8qIEFSUkFZX1NJWkUgKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2luY2x1ZGUgInJ0bDgxOXhfSFQuaCIKKyNpbmNsdWRlICJydGw4MTl4X0JBLmgiCisjaW5jbHVkZSAicnRsODE5eF9UUy5oIgorCisKKyNpZm5kZWYgSVdfTU9ERV9NT05JVE9SCisjZGVmaW5lIElXX01PREVfTU9OSVRPUiA2CisjZW5kaWYKKworI2lmbmRlZiBJV0VWQ1VTVE9NCisjZGVmaW5lIElXRVZDVVNUT00gMHg4YzAyCisjZW5kaWYKKworCisjaWZuZGVmIGNvbnRhaW5lcl9vZgorLyoqCisgKiBjb250YWluZXJfb2YgLSBjYXN0IGEgbWVtYmVyIG9mIGEgc3RydWN0dXJlIG91dCB0byB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUKKyAqCisgKiBAcHRyOiAgICAgICAgdGhlIHBvaW50ZXIgdG8gdGhlIG1lbWJlci4KKyAqIEB0eXBlOiAgICAgICB0aGUgdHlwZSBvZiB0aGUgY29udGFpbmVyIHN0cnVjdCB0aGlzIGlzIGVtYmVkZGVkIGluLgorICogQG1lbWJlcjogICAgIHRoZSBuYW1lIG9mIHRoZSBtZW1iZXIgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKgorICovCisjZGVmaW5lIGNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikgKHsgICAgICAgICAgICAgICAgICAgICAgXAorCWNvbnN0IHR5cGVvZiggKCh0eXBlICopMCktPm1lbWJlciApICpfX21wdHIgPSAocHRyKTsgICAgXAorCSh0eXBlICopKCAoY2hhciAqKV9fbXB0ciAtIG9mZnNldG9mKHR5cGUsbWVtYmVyKSApO30pCisjZW5kaWYKKworI2RlZmluZSBLRVlfVFlQRV9OQQkJMHgwCisjZGVmaW5lIEtFWV9UWVBFX1dFUDQwIAkJMHgxCisjZGVmaW5lIEtFWV9UWVBFX1RLSVAJCTB4MgorI2RlZmluZSBLRVlfVFlQRV9DQ01QCQkweDQKKyNkZWZpbmUgS0VZX1RZUEVfV0VQMTA0CQkweDUKKworLyogYWRkZWQgZm9yIHJ0bDgxOXggdHggcHJvY2VkdXJlICovCisjZGVmaW5lIE1BWF9RVUVVRV9TSVpFCQkweDEwCisKKy8vCisvLyA4MTkwIHF1ZXVlIG1hcHBpbmcKKy8vCisjZGVmaW5lIEJLX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQkVfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBWSV9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFZPX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgSENDQV9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBUWENNRF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIE1HTlRfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgSElHSF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBCRUFDT05fUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICA4CisKKyNkZWZpbmUgTE9XX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVfUVVFVUUKKyNkZWZpbmUgTk9STUFMX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgTUdOVF9RVUVVRQorCisvL2FkZGVkIGJ5IGFteSBmb3IgcHMKKyNkZWZpbmUgU1dSRl9USU1FT1VUCQkJCTUwCisKKy8vYWRkZWQgYnkgYW15IGZvciBMRUFQIHJlbGF0ZWQKKyNkZWZpbmUgSUVfQ0lTQ09fRkxBR19QT1NJVElPTgkJMHgwOAkvLyBGbGFnIGJ5dGU6IGJ5dGUgOCwgbnVtYmVyZWQgZnJvbSAwLgorI2RlZmluZSBTVVBQT1JUX0NLSVBfTUlDCQkJMHgwOAkvLyBiaXQzCisjZGVmaW5lIFNVUFBPUlRfQ0tJUF9QSwkJCTB4MTAJLy8gYml0NAorLyogZGVmaW5lZCBmb3Igc2tiIGNiIGZpZWxkICovCisvKiBBdCBtb3N0IDI4IGJ5dGUgKi8KK3R5cGVkZWYgc3RydWN0IGNiX2Rlc2MgeworCS8qIFR4IERlc2MgUmVsYXRlZCBmbGFncyAoOC05KSAqLworCXU4IGJMYXN0SW5pUGt0OjE7CisJdTggYkNtZE9ySW5pdDoxOworCXU4IGJGaXJzdFNlZzoxOworCXU4IGJMYXN0U2VnOjE7CisJdTggYkVuY3J5cHQ6MTsKKwl1OCBiVHhEaXNhYmxlUmF0ZUZhbGxCYWNrOjE7CisJdTggYlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlOjE7CisJdTggYkh3U2VjOjE7IC8vaW5kaWNhdGUgd2hldGhlciB1c2UgSHcgc2VjdXJpdHkuIFdCCisKKwl1OCByZXNlcnZlZDE7CisKKwkvKiBUeCBGaXJtd2FyZSBSZWxhZ2VkIGZsYWdzICgxMC0xMSkqLworCXU4IGJDVFNFbmFibGU6MTsKKwl1OCBiUlRTRW5hYmxlOjE7CisJdTggYlVzZVNob3J0R0k6MTsKKwl1OCBiVXNlU2hvcnRQcmVhbWJsZToxOworCXU4IGJUeEVuYWJsZUZ3Q2FsY0R1cjoxOworCXU4IGJBTVBEVUVuYWJsZToxOworCXU4IGJSVFNTVEJDOjE7CisJdTggUlRTU0M6MTsKKworCXU4IGJSVFNCVzoxOworCXU4IGJQYWNrZXRCVzoxOworCXU4IGJSVFNVc2VTaG9ydFByZWFtYmxlOjE7CisJdTggYlJUU1VzZVNob3J0R0k6MTsKKwl1OCBiTXVsdGljYXN0OjE7CisJdTggYkJyb2FkY2FzdDoxOworCS8vdTggcmVzZXJ2ZWQyOjI7CisJdTggZHJ2X2FnZ19lbmFibGU6MTsKKwl1OCByZXNlcnZlZDI6MTsKKworCS8qIFR4IERlc2MgcmVsYXRlZCBlbGVtZW50KDEyLTE5KSAqLworCXU4IHJhdGFfaW5kZXg7CisJdTggcXVldWVfaW5kZXg7CisJLy91OCByZXNlcnZlZDM7CisJLy91OCByZXNlcnZlZDQ7CisJdTE2IHR4YnVmX3NpemU7CisJLy91OCByZXNlcnZlZDU7CisJdTggUkFUUkluZGV4OworCXU4IHJlc2VydmVkNjsKKwl1OCByZXNlcnZlZDc7CisJdTggcmVzZXJ2ZWQ4OworCisJLyogVHggZmlybXdhcmUgcmVsYXRlZCBlbGVtZW50KDIwLTI3KSAqLworCXU4IGRhdGFfcmF0ZTsKKwl1OCBydHNfcmF0ZTsKKwl1OCBhbXBkdV9mYWN0b3I7CisJdTggYW1wZHVfZGVuc2l0eTsKKwkvL3U4IHJlc2VydmVkOTsKKwkvL3U4IHJlc2VydmVkMTA7CisJLy91OCByZXNlcnZlZDExOworCXU4IERydkFnZ3JOdW07CisJdTE2IHBrdF9zaXplOworCXU4IHJlc2VydmVkMTI7Cit9Y2JfZGVzYywgKnBjYl9kZXNjOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBNR05fMU0gICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIE1HTl8yTSAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgTUdOXzVfNU0gICAgICAgICAgICAgICAgMHgwYgorI2RlZmluZSBNR05fMTFNICAgICAgICAgICAgICAgICAweDE2CisKKyNkZWZpbmUgTUdOXzZNICAgICAgICAgICAgICAgICAgMHgwYworI2RlZmluZSBNR05fOU0gICAgICAgICAgICAgICAgICAweDEyCisjZGVmaW5lIE1HTl8xMk0gICAgICAgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgTUdOXzE4TSAgICAgICAgICAgICAgICAgMHgyNAorI2RlZmluZSBNR05fMjRNICAgICAgICAgICAgICAgICAweDMwCisjZGVmaW5lIE1HTl8zNk0gICAgICAgICAgICAgICAgIDB4NDgKKyNkZWZpbmUgTUdOXzQ4TSAgICAgICAgICAgICAgICAgMHg2MAorI2RlZmluZSBNR05fNTRNICAgICAgICAgICAgICAgICAweDZjCisKKyNkZWZpbmUgTUdOX01DUzAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBNR05fTUNTMSAgICAgICAgICAgICAgICAweDgxCisjZGVmaW5lIE1HTl9NQ1MyICAgICAgICAgICAgICAgIDB4ODIKKyNkZWZpbmUgTUdOX01DUzMgICAgICAgICAgICAgICAgMHg4MworI2RlZmluZSBNR05fTUNTNCAgICAgICAgICAgICAgICAweDg0CisjZGVmaW5lIE1HTl9NQ1M1ICAgICAgICAgICAgICAgIDB4ODUKKyNkZWZpbmUgTUdOX01DUzYgICAgICAgICAgICAgICAgMHg4NgorI2RlZmluZSBNR05fTUNTNyAgICAgICAgICAgICAgICAweDg3CisjZGVmaW5lIE1HTl9NQ1M4ICAgICAgICAgICAgICAgIDB4ODgKKyNkZWZpbmUgTUdOX01DUzkgICAgICAgICAgICAgICAgMHg4OQorI2RlZmluZSBNR05fTUNTMTAgICAgICAgICAgICAgICAweDhhCisjZGVmaW5lIE1HTl9NQ1MxMSAgICAgICAgICAgICAgIDB4OGIKKyNkZWZpbmUgTUdOX01DUzEyICAgICAgICAgICAgICAgMHg4YworI2RlZmluZSBNR05fTUNTMTMgICAgICAgICAgICAgICAweDhkCisjZGVmaW5lIE1HTl9NQ1MxNCAgICAgICAgICAgICAgIDB4OGUKKyNkZWZpbmUgTUdOX01DUzE1ICAgICAgICAgICAgICAgMHg4ZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCQk4MDIuMTEgTWFuYWdlbWVudCBmcmFtZSBSZWFzb24gQ29kZSBmaWVsZAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlbnVtCV9SZWFzb25Db2RleworCXVuc3BlY19yZWFzb24JPSAweDEsCisJYXV0aF9ub3RfdmFsaWQJPSAweDIsCisJZGVhdXRoX2x2X3NzCT0gMHgzLAorCWluYWN0aXZpdHkJCT0gMHg0LAorCWFwX292ZXJsb2FkIAk9IDB4NSwKKwljbGFzczJfZXJyCQk9IDB4NiwKKwljbGFzczNfZXJyCQk9IDB4NywKKwlkaXNhc19sdl9zcyAJPSAweDgsCisJYXNvY19ub3RfYXV0aAk9IDB4OSwKKworCS8vLS0tLU1JQ19DSEVDSworCW1pY19mYWlsdXJlIAk9IDB4ZSwKKwkvLy0tLS1FTkQgTUlDX0NIRUNLCisKKwkvLyBSZWFzb24gY29kZSBkZWZpbmVkIGluIDgwMi4xMWkgRDEwLjAgcC4yOC4KKwlpbnZhbGlkX0lFCQk9IDB4MGQsCisJZm91cl93YXlfdG1vdXQJPSAweDBmLAorCXR3b193YXlfdG1vdXQJPSAweDEwLAorCUlFX2Rpc21hdGNoIAk9IDB4MTEsCisJaW52YWxpZF9HY2lwaGVyID0gMHgxMiwKKwlpbnZhbGlkX1BjaXBoZXIgPSAweDEzLAorCWludmFsaWRfQUtNUAk9IDB4MTQsCisJdW5zdXBfUlNOSUV2ZXIgPSAweDE1LAorCWludmFsaWRfUlNOSUUJPSAweDE2LAorCWF1dGhfODAyXzF4X2ZhaWw9IDB4MTcsCisJY2lwZXJfcmVqZWN0CQk9IDB4MTgsCisKKwkvLyBSZWFzb24gY29kZSBkZWZpbmVkIGluIDcuMy4xLjcsIDgwMi4xZSBEMTMuMCwgcC40Mi4gQWRkZWQgYnkgQW5uaWUsIDIwMDUtMTEtMTUuCisJUW9TX3Vuc3BlYwkJPSAweDIwLCAvLyAzMgorCVFBUF9iYW5kd2lkdGgJPSAweDIxLCAvLyAzMworCXBvb3JfY29uZGl0aW9uCT0gMHgyMiwgLy8gMzQKKwlub19mYWNpbGl0eSAJPSAweDIzLCAvLyAzNQorCQkJCQkJCS8vIFdoZXJlIGlzIDM2Pz8/CisJcmVxX2RlY2xpbmVkCT0gMHgyNSwgLy8gMzcKKwlpbnZhbGlkX3BhcmFtCT0gMHgyNiwgLy8gMzgKKwlyZXFfbm90X2hvbm9yZWQ9IDB4MjcsCS8vIDM5CisJVFNfbm90X2NyZWF0ZWQJPSAweDJGLCAvLyA0NworCURMX25vdF9hbGxvd2VkCT0gMHgzMCwgLy8gNDgKKwlkZXN0X25vdF9leGlzdAk9IDB4MzEsIC8vIDQ5CisJZGVzdF9ub3RfUVNUQQk9IDB4MzIsIC8vIDUwCit9OworCisKKworI2RlZmluZSBhU2lmc1RpbWUJICgocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX0EpfHwocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fMjRHKXx8KHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9OXzVHKSk/IDE2IDogMTAKKworI2RlZmluZSBNR01UX1FVRVVFX05VTSA1CisKKyNkZWZpbmUgSUVFRV9DTURfU0VUX1dQQV9QQVJBTQkJCTEKKyNkZWZpbmUJSUVFRV9DTURfU0VUX1dQQV9JRQkJCTIKKyNkZWZpbmUgSUVFRV9DTURfU0VUX0VOQ1JZUFRJT04JCQkzCisjZGVmaW5lIElFRUVfQ01EX01MTUUJCQkJNAorCisjZGVmaW5lIElFRUVfUEFSQU1fV1BBX0VOQUJMRUQJCQkxCisjZGVmaW5lIElFRUVfUEFSQU1fVEtJUF9DT1VOVEVSTUVBU1VSRVMJCTIKKyNkZWZpbmUgSUVFRV9QQVJBTV9EUk9QX1VORU5DUllQVEVECQkzCisjZGVmaW5lIElFRUVfUEFSQU1fUFJJVkFDWV9JTlZPS0VECQk0CisjZGVmaW5lIElFRUVfUEFSQU1fQVVUSF9BTEdTCQkJNQorI2RlZmluZSBJRUVFX1BBUkFNX0lFRUVfODAyXzFYCQkJNgorLy9JdCBzaG91bGQgY29uc2lzdGVudCB3aXRoIHRoZSBkcml2ZXJfWFhYLmMKKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1BBUkFNX1dQQVhfU0VMRUNUCQkJNworLy9BZGRlZCBmb3Igbm90aWZ5IHRoZSBlbmNyeXB0aW9uIHR5cGUgc2VsZWN0aW9uCisvLyAgIERhdmlkLCAyMDA2LjkuMjYKKyNkZWZpbmUgSUVFRV9QUk9UT19XUEEJCQkJMQorI2RlZmluZSBJRUVFX1BST1RPX1JTTgkJCQkyCisvL0FkZGVkIGZvciBub3RpZnkgdGhlIGVuY3J5cHRpb24gdHlwZSBzZWxlY3Rpb24KKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1dQQVhfVVNFR1JPVVAJCQkwCisjZGVmaW5lIElFRUVfV1BBWF9XRVA0MAkJCQkxCisjZGVmaW5lIElFRUVfV1BBWF9US0lQCQkJCTIKKyNkZWZpbmUgSUVFRV9XUEFYX1dSQVAgICAJCQkzCisjZGVmaW5lIElFRUVfV1BBWF9DQ01QCQkJCTQKKyNkZWZpbmUgSUVFRV9XUEFYX1dFUDEwNAkJCTUKKworI2RlZmluZSBJRUVFX0tFWV9NR01UX0lFRUU4MDIxWAkJCTEKKyNkZWZpbmUgSUVFRV9LRVlfTUdNVF9QU0sJCQkyCisKKyNkZWZpbmUgSUVFRV9NTE1FX1NUQV9ERUFVVEgJCQkxCisjZGVmaW5lIElFRUVfTUxNRV9TVEFfRElTQVNTT0MJCQkyCisKKworI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9VTktOT1dOX0FMRwkJMgorI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9VTktOT1dOX0FERFIJCTMKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfQ1JZUFRfSU5JVF9GQUlMRUQJNAorI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9LRVlfU0VUX0ZBSUxFRAkJNQorI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9UWF9LRVlfU0VUX0ZBSUxFRAk2CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0NBUkRfQ09ORl9GQUlMRUQJCTcKKworCisjZGVmaW5lCUlFRUVfQ1JZUFRfQUxHX05BTUVfTEVOCQkJMTYKKworI2RlZmluZSBNQVhfSUVfTEVOICAweGZmCisKKy8vIGFkZGVkIGZvciBrZXJuZWwgY29uZmxpY3QKKyNkZWZpbmUgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzIAlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXNfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlciAJaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyX3JzbAorI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQgCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMgIAlpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wc19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcyBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzX3JzbAorI2RlZmluZSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMgCWllZWU4MDIxMV9nZXRfY3J5cHRvX29wc19yc2wKKworI2RlZmluZSBpZWVlODAyMTFfY2NtcF9udWxsCQlpZWVlODAyMTFfY2NtcF9udWxsX3JzbAorCisjZGVmaW5lIGllZWU4MDIxMV90a2lwX251bGwJCWllZWU4MDIxMV90a2lwX251bGxfcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX3dlcF9udWxsCQlpZWVlODAyMTFfd2VwX251bGxfcnNsCisKKyNkZWZpbmUgZnJlZV9pZWVlODAyMTEgICAgICAgICAgCWZyZWVfaWVlZTgwMjExX3JzbAorI2RlZmluZSBhbGxvY19pZWVlODAyMTEgICAgICAgIAkJYWxsb2NfaWVlZTgwMjExX3JzbAorCisjZGVmaW5lIGllZWU4MDIxMV9yeCAJCQlpZWVlODAyMTFfcnhfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9yeF9tZ3QJCWllZWU4MDIxMV9yeF9tZ3RfcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX2dldF9iZWFjb24JCWllZWU4MDIxMV9nZXRfYmVhY29uX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd2FrZV9xdWV1ZQkJaWVlZTgwMjExX3dha2VfcXVldWVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zdG9wX3F1ZXVlCQlpZWVlODAyMTFfc3RvcF9xdWV1ZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3Jlc2V0X3F1ZXVlCQlpZWVlODAyMTFfcmVzZXRfcXVldWVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wJaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2wgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2xfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9pc19zaG9ydHNsb3QJCWllZWU4MDIxMV9pc19zaG9ydHNsb3RfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9pc181NGcJCWllZWU4MDIxMV9pc181NGdfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bAlpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGxfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9wc190eF9hY2sJCWllZWU4MDIxMV9wc190eF9hY2tfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zb2Z0bWFjX3htaXQJCWllZWU4MDIxMV9zb2Z0bWFjX3htaXRfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucwlpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnNfcnNsCisjZGVmaW5lIG5vdGlmeV93eF9hc3NvY19ldmVudAkJbm90aWZ5X3d4X2Fzc29jX2V2ZW50X3JzbAorI2RlZmluZSBTZW5kRGlzYXNzb2NpYXRpb24JCVNlbmREaXNhc3NvY2lhdGlvbl9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZQkJaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucwlpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zX3JzbAorI2RlZmluZSBpZWVlODAyMTFfc3RvcF9zY2FuCQlpZWVlODAyMTFfc3RvcF9zY2FuX3JzbAorI2RlZmluZSBpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cwlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0c19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm8JaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm9fcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybwlpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm9fcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lc3NpZAkJaWVlZTgwMjExX3d4X2dldF9lc3NpZF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9lc3NpZAkJaWVlZTgwMjExX3d4X3NldF9lc3NpZF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9yYXRlCQlpZWVlODAyMTFfd3hfc2V0X3JhdGVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfcmF0ZQkJaWVlZTgwMjExX3d4X2dldF9yYXRlX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3dhcAkJaWVlZTgwMjExX3d4X3NldF93YXBfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfd2FwCQlpZWVlODAyMTFfd3hfZ2V0X3dhcF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9tb2RlCQlpZWVlODAyMTFfd3hfc2V0X21vZGVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfbW9kZQkJaWVlZTgwMjExX3d4X2dldF9tb2RlX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3NjYW4JCWllZWU4MDIxMV93eF9zZXRfc2Nhbl9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9mcmVxCQlpZWVlODAyMTFfd3hfZ2V0X2ZyZXFfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZnJlcQkJaWVlZTgwMjExX3d4X3NldF9mcmVxX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3Jhd3R4CQlpZWVlODAyMTFfd3hfc2V0X3Jhd3R4X3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X25hbWUJCWllZWU4MDIxMV93eF9nZXRfbmFtZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9wb3dlcgkJaWVlZTgwMjExX3d4X3NldF9wb3dlcl9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9wb3dlcgkJaWVlZTgwMjExX3d4X2dldF9wb3dlcl9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXMJaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfcnRzCQlpZWVlODAyMTFfd3hfc2V0X3J0c19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9ydHMJCWllZWU4MDIxMV93eF9nZXRfcnRzX3JzbAorCisjZGVmaW5lIGllZWU4MDIxMV90eGJfZnJlZQkJaWVlZTgwMjExX3R4Yl9mcmVlX3JzbAorCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZ2VuX2llCQlpZWVlODAyMTFfd3hfc2V0X2dlbl9pZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9zY2FuCQlpZWVlODAyMTFfd3hfZ2V0X3NjYW5fcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZW5jb2RlCQlpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lbmNvZGUJCWllZWU4MDIxMV93eF9nZXRfZW5jb2RlX3JzbAorI2lmIFdJUkVMRVNTX0VYVCA+PSAxOAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X21sbWUJCWllZWU4MDIxMV93eF9zZXRfbWxtZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9hdXRoCQlpZWVlODAyMTFfd3hfc2V0X2F1dGhfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZW5jb2RlX2V4dAlpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9leHRfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfZW5jb2RlX2V4dAlpZWVlODAyMTFfd3hfZ2V0X2VuY29kZV9leHRfcnNsCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCBpZWVlX3BhcmFtIHsKKwl1MzIgY21kOworCXU4IHN0YV9hZGRyW0VUSF9BTEVOXTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1OCBuYW1lOworCQkJdTMyIHZhbHVlOworCQl9IHdwYV9wYXJhbTsKKwkJc3RydWN0IHsKKwkJCXUzMiBsZW47CisJCQl1OCByZXNlcnZlZFszMl07CisJCQl1OCBkYXRhWzBdOworCQl9IHdwYV9pZTsKKwkJc3RydWN0eworCQkJaW50IGNvbW1hbmQ7CisJCQlpbnQgcmVhc29uX2NvZGU7CisJCX0gbWxtZTsKKwkJc3RydWN0IHsKKwkJCXU4IGFsZ1tJRUVFX0NSWVBUX0FMR19OQU1FX0xFTl07CisJCQl1OCBzZXRfdHg7CisJCQl1MzIgZXJyOworCQkJdTggaWR4OworCQkJdTggc2VxWzhdOyAvKiBzZXF1ZW5jZSBjb3VudGVyIChzZXQ6IFJYLCBnZXQ6IFRYKSAqLworCQkJdTE2IGtleV9sZW47CisJCQl1OCBrZXlbMF07CisJCX0gY3J5cHQ7CisJfSB1OworfWllZWVfcGFyYW07CisKKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisjZGVmaW5lIElXX1FVQUxfUVVBTF9JTlZBTElEICAgMHgxMAorI2RlZmluZSBJV19RVUFMX0xFVkVMX0lOVkFMSUQgIDB4MjAKKyNkZWZpbmUgSVdfUVVBTF9OT0lTRV9JTlZBTElEICAweDQwCisjZGVmaW5lIElXX1FVQUxfUVVBTF9VUERBVEVEICAgMHgxCisjZGVmaW5lIElXX1FVQUxfTEVWRUxfVVBEQVRFRCAgMHgyCisjZGVmaW5lIElXX1FVQUxfTk9JU0VfVVBEQVRFRCAgMHg0CisjZW5kaWYKKworCisvLyBsaW51eCB1bmRlciAyLjYuOSByZWxlYXNlIG1heSBub3Qgc3VwcG9ydCBpdCwgc28gbW9kaWZ5IGl0IGZvciBjb21tb24gdXNlCisjZGVmaW5lIE1TRUNTKHQpIG1zZWNzX3RvX2ppZmZpZXModCkKKyNkZWZpbmUgbXNsZWVwX2ludGVycnVwdGlibGVfcnNsICBtc2xlZXBfaW50ZXJydXB0aWJsZQorCisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0xFTgkJMjMwNAorLyogTWF4aW11bSBzaXplIGZvciB0aGUgTUEtVU5JVERBVEEgcHJpbWl0aXZlLCA4MDIuMTEgc3RhbmRhcmQgc2VjdGlvbgorICAgNi4yLjEuMS4yLgorCisgICBUaGUgZmlndXJlIGluIHNlY3Rpb24gNy4xLjIgc3VnZ2VzdHMgYSBib2R5IHNpemUgb2YgdXAgdG8gMjMxMgorICAgYnl0ZXMgaXMgYWxsb3dlZCwgd2hpY2ggaXMgYSBiaXQgY29uZnVzaW5nLCBJIHN1c3BlY3QgdGhpcworICAgcmVwcmVzZW50cyB0aGUgMjMwNCBieXRlcyBvZiByZWFsIGRhdGEsIHBsdXMgYSBwb3NzaWJsZSA4IGJ5dGVzIG9mCisgICBXRVAgSVYgYW5kIElDVi4gKHRoaXMgaW50ZXJwcmV0YXRpb24gc3VnZ2VzdGVkIGJ5IFJhbWlybyBCYXJyZWlybykgKi8KKyNkZWZpbmUgSUVFRTgwMjExXzFBRERSX0xFTiAxMAorI2RlZmluZSBJRUVFODAyMTFfMkFERFJfTEVOIDE2CisjZGVmaW5lIElFRUU4MDIxMV8zQUREUl9MRU4gMjQKKyNkZWZpbmUgSUVFRTgwMjExXzRBRERSX0xFTiAzMAorI2RlZmluZSBJRUVFODAyMTFfRkNTX0xFTiAgICA0CisjZGVmaW5lIElFRUU4MDIxMV9ITEVOICAgICAgICAgICAgICAgICAgKElFRUU4MDIxMV80QUREUl9MRU4pCisjZGVmaW5lIElFRUU4MDIxMV9GUkFNRV9MRU4gICAgICAgICAgICAgKElFRUU4MDIxMV9EQVRBX0xFTiArIElFRUU4MDIxMV9ITEVOKQorI2RlZmluZSBJRUVFODAyMTFfTUdNVF9IRFJfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjNfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjRfTEVOIDMwCisKKyNkZWZpbmUgTUlOX0ZSQUdfVEhSRVNIT0xEICAgICAyNTZVCisjZGVmaW5lIE1BWF9GUkFHX1RIUkVTSE9MRCAgICAgMjM0NlUKKworCisvKiBGcmFtZSBjb250cm9sIGZpZWxkIGNvbnN0YW50cyAqLworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9WRVJTCQkweDAwMDMKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRlRZUEUJCTB4MDAwYworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9TVFlQRQkJMHgwMGYwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0ZSQU1FVFlQRQkweDAwZmMKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfVE9EUwkJMHgwMTAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0ZST01EUwkJMHgwMjAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0RTVE9EUwkJMHgwMzAwIC8vYWRkZWQgYnkgZGF2aWQKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTCTB4MDQwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9SRVRSWQkJMHgwODAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1BNCQkweDEwMDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfTU9SRURBVEEJCTB4MjAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9XRVAJCTB4NDAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9PUkRFUgkJMHg4MDAwCisKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX01HTVQJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfQ1RMCQkweDAwMDQKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX0RBVEEJCTB4MDAwOAorCisvKiBtYW5hZ2VtZW50ICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQIAkweDAwMTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVRCTB4MDAyMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQCTB4MDAzMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRCTB4MDA0MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUAkweDAwNTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0JFQUNPTgkJMHgwMDgwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BVElNCQkweDAwOTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DCTB4MDBBMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQVVUSAkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9ERUFVVEgJCTB4MDBDMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfTUFOQUdFX0FDVAkweDAwRDAKKworLyogY29udHJvbCAqLworI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFNQT0xMCQkweDAwQTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JUUwkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DVFMJCTB4MDBDMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQUNLCQkweDAwRDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGRU5ECQkweDAwRTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGRU5EQUNLCTB4MDBGMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQkxPQ0tBQ0sgICAweDAwOTQKKworLyogZGF0YSAqLworI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQQkJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLCTB4MDAxMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRlBPTEwJMHgwMDIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLUE9MTAkweDAwMzAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX05VTExGVU5DCTB4MDA0MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZBQ0sJCTB4MDA1MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZQT0xMCQkweDAwNjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGQUNLUE9MTAkweDAwNzAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBCTB4MDA4MCAvL2FkZGVkIGZvciBXTU0gMjAwNi84LzIKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1FPU19OVUxMCTB4MDBDMAorCisjZGVmaW5lIElFRUU4MDIxMV9TQ1RMX0ZSQUcJCTB4MDAwRgorI2RlZmluZSBJRUVFODAyMTFfU0NUTF9TRVEJCTB4RkZGMAorCisvKiBRT1MgY29udHJvbCAqLworI2RlZmluZSBJRUVFODAyMTFfUUNUTF9USUQgICAgICAgICAgICAgIDB4MDAwRgorCisjZGVmaW5lCUZDX1FPU19CSVQJCQkJCUJJVDcKKyNkZWZpbmUgSXNEYXRhRnJhbWUocGR1KQkJCSggKChwZHVbMF0gJiAweDBDKT09MHgwOCkgPyB0cnVlIDogZmFsc2UgKQorI2RlZmluZQlJc0xlZ2FjeURhdGFGcmFtZShwZHUpCShJc0RhdGFGcmFtZShwZHUpICYmICghKHBkdVswXSZGQ19RT1NfQklUKSkgKQorLy9hZGRlZCBieSB3Yi4gSXMgdGhpcyByaWdodD8KKyNkZWZpbmUgSXNRb1NEYXRhRnJhbWUocGZyYW1lKSAgKCgqKHUxNiopcGZyYW1lJihJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEF8SUVFRTgwMjExX0ZUWVBFX0RBVEEpKSA9PSAoSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBfElFRUU4MDIxMV9GVFlQRV9EQVRBKSkKKyNkZWZpbmUgRnJhbWVfT3JkZXIocGZyYW1lKSAgICAgKCoodTE2KilwZnJhbWUmSUVFRTgwMjExX0ZDVExfT1JERVIpCisjZGVmaW5lIFNOX0xFU1MoYSwgYikJCSgoKGEtYikmMHg4MDApIT0wKQorI2RlZmluZSBTTl9FUVVBTChhLCBiKQkoYSA9PSBiKQorI2RlZmluZSBNQVhfREVWX0FERFJfU0laRSA4Cit0eXBlZGVmIGVudW0gX0FDVF9DQVRFR09SWXsKKwlBQ1RfQ0FUX1FPUyA9IDEsCisJQUNUX0NBVF9ETFMgPSAyLAorCUFDVF9DQVRfQkEgID0gMywKKwlBQ1RfQ0FUX0hUICA9IDcsCisJQUNUX0NBVF9XTU0gPSAxNywKK30gQUNUX0NBVEVHT1JZLCAqUEFDVF9DQVRFR09SWTsKKwordHlwZWRlZiBlbnVtIF9UU19BQ1RJT057CisJQUNUX0FERFRTUkVRID0gMCwKKwlBQ1RfQUREVFNSU1AgPSAxLAorCUFDVF9ERUxUUyAgICA9IDIsCisJQUNUX1NDSEVEVUxFID0gMywKK30gVFNfQUNUSU9OLCAqUFRTX0FDVElPTjsKKwordHlwZWRlZiBlbnVtIF9CQV9BQ1RJT057CisJQUNUX0FEREJBUkVRID0gMCwKKwlBQ1RfQUREQkFSU1AgPSAxLAorCUFDVF9ERUxCQSAgICA9IDIsCit9IEJBX0FDVElPTiwgKlBCQV9BQ1RJT047CisKK3R5cGVkZWYgZW51bSBfSW5pdGlhbEdhaW5PcFR5cGV7CisJSUdfQmFja3VwPTAsCisJSUdfUmVzdG9yZSwKKwlJR19NYXgKK31Jbml0aWFsR2Fpbk9wVHlwZTsKKworLyogZGVidWcgbWFjcm9zICovCisjZGVmaW5lIENPTkZJR19JRUVFODAyMTFfREVCVUcKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCitleHRlcm4gdTMyIGllZWU4MDIxMV9kZWJ1Z19sZXZlbDsKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKK2RvIHsgaWYgKGllZWU4MDIxMV9kZWJ1Z19sZXZlbCAmIChsZXZlbCkpIFwKKyAgcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMTogIiBmbXQsICMjIGFyZ3MpOyB9IHdoaWxlICgwKQorLy93YiBhZGRlZCB0byBkZWJ1ZyBvdXQgZGF0YSBidWYKKy8vaWYgeW91IHdhbnQgcHJpbnQgREFUQSBidWZmZXIgcmVsYXRlZCBCQSwgcGxlYXNlIHNldCBpZWVlODAyMTFfZGVidWdfbGV2ZWwgdG8gREFUQXxCQQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfREFUQShsZXZlbCwgZGF0YSwgZGF0YWxlbikJXAorCWRveyBpZiAoKGllZWU4MDIxMV9kZWJ1Z19sZXZlbCAmIChsZXZlbCkpID09IChsZXZlbCkpCVwKKwkJeyAJXAorCQkJaW50IGk7CQkJCQlcCisJCQl1OCogcGRhdGEgPSAodTgqKSBkYXRhOwkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTE6ICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CVwKKwkJCWZvcihpPTA7IGk8KGludCkoZGF0YWxlbik7IGkrKykJCQlcCisJCQl7CQkJCQkJXAorCQkJCXByaW50aygiJTJ4ICIsIHBkYXRhW2ldKTsJCVwKKwkJCQlpZiAoKGkrMSklMTYgPT0gMCkgcHJpbnRrKCJcbiIpOwlcCisJCQl9CQkJCVwKKwkJCXByaW50aygiXG4iKTsJCQlcCisJCX0JCQkJCVwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfREFUQShsZXZlbCwgZGF0YSwgZGF0YWxlbikgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgkvKiBDT05GSUdfSUVFRTgwMjExX0RFQlVHICovCisKKy8qIGRlYnVnIG1hY3JvcyBub3QgZGVwZW5kZW50IG9uIENPTkZJR19JRUVFODAyMTFfREVCVUcgKi8KKworI2RlZmluZSBNQUNfRk1UICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIKKyNkZWZpbmUgTUFDX0FSRyh4KSAoKHU4KikoeCkpWzBdLCgodTgqKSh4KSlbMV0sKCh1OCopKHgpKVsyXSwoKHU4KikoeCkpWzNdLCgodTgqKSh4KSlbNF0sKCh1OCopKHgpKVs1XQorCisvKgorICogVG8gdXNlIHRoZSBkZWJ1ZyBzeXN0ZW07CisgKgorICogSWYgeW91IGFyZSBkZWZpbmluZyBhIG5ldyBkZWJ1ZyBjbGFzc2lmaWNhdGlvbiwgc2ltcGx5IGFkZCBpdCB0byB0aGUgI2RlZmluZQorICogbGlzdCBoZXJlIGluIHRoZSBmb3JtIG9mOgorICoKKyAqICNkZWZpbmUgSUVFRTgwMjExX0RMX3h4eHggVkFMVUUKKyAqCisgKiBzaGlmdGluZyB2YWx1ZSB0byB0aGUgbGVmdCBvbmUgYml0IGZyb20gdGhlIHByZXZpb3VzIGVudHJ5LiAgeHh4eCBzaG91bGQgYmUKKyAqIHRoZSBuYW1lIG9mIHRoZSBjbGFzc2lmaWNhdGlvbiAoZm9yIGV4YW1wbGUsIFdFUCkKKyAqCisgKiBZb3UgdGhlbiBuZWVkIHRvIGVpdGhlciBhZGQgYSBJRUVFODAyMTFfeHh4eF9ERUJVRygpIG1hY3JvIGRlZmluaXRpb24gZm9yIHlvdXIKKyAqIGNsYXNzaWZpY2F0aW9uLCBvciB1c2UgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF94eHh4LCAuLi4pIHdoZW5ldmVyIHlvdSB3YW50CisgKiB0byBzZW5kIG91dHB1dCB0byB0aGF0IGNsYXNzaWZpY2F0aW9uLgorICoKKyAqIFRvIGFkZCB5b3VyIGRlYnVnIGxldmVsIHRvIHRoZSBsaXN0IG9mIGxldmVscyBzZWVuIHdoZW4geW91IHBlcmZvcm0KKyAqCisgKiAlIGNhdCAvcHJvYy9uZXQvaXB3L2RlYnVnX2xldmVsCisgKgorICogeW91IHNpbXBseSBuZWVkIHRvIGFkZCB5b3VyIGVudHJ5IHRvIHRoZSBpcHdfZGVidWdfbGV2ZWxzIGFycmF5LgorICoKKyAqIElmIHlvdSBkbyBub3Qgc2VlIGRlYnVnX2xldmVsIGluIC9wcm9jL25ldC9pcHcgdGhlbiB5b3UgZG8gbm90IGhhdmUKKyAqIENPTkZJR19JRUVFODAyMTFfREVCVUcgZGVmaW5lZCBpbiB5b3VyIGtlcm5lbCBjb25maWd1cmF0aW9uCisgKgorICovCisKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0lORk8gICAgICAgICAgKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9ETF9XWCAgICAgICAgICAgICgxPDwxKQorI2RlZmluZSBJRUVFODAyMTFfRExfU0NBTiAgICAgICAgICAoMTw8MikKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1NUQVRFICAgICAgICAgKDE8PDMpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9NR01UICAgICAgICAgICgxPDw0KQorI2RlZmluZSBJRUVFODAyMTFfRExfRlJBRyAgICAgICAgICAoMTw8NSkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0VBUCAgICAgICAgICAgKDE8PDYpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9EUk9QICAgICAgICAgICgxPDw3KQorCisjZGVmaW5lIElFRUU4MDIxMV9ETF9UWCAgICAgICAgICAgICgxPDw4KQorI2RlZmluZSBJRUVFODAyMTFfRExfUlggICAgICAgICAgICAoMTw8OSkKKworI2RlZmluZSBJRUVFODAyMTFfRExfSFQJCSAgICgxPDwxMCkgIC8vSFQKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0JBCQkgICAoMTw8MTEpICAvL2JhCisjZGVmaW5lIElFRUU4MDIxMV9ETF9UUwkJICAgKDE8PDEyKSAgLy9UUworI2RlZmluZSBJRUVFODAyMTFfRExfUU9TICAgICAgICAgICAoMTw8MTMpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9SRU9SREVSCSAgICgxPDwxNCkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0lPVAkgICAoMTw8MTUpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9JUFMJICAgKDE8PDE2KQorI2RlZmluZSBJRUVFODAyMTFfRExfVFJBQ0UJICAgKDE8PDI5KSAgLy90cmFjZSBmdW5jdGlvbiwgbmVlZCB0byB1c2VyIG5ldF9yYXRlbGltaXQoKSB0b2dldGhlciBpbiBvcmRlciBub3QgdG8gcHJpbnQgdG9vIG11Y2ggdG8gdGhlIHNjcmVlbgorI2RlZmluZSBJRUVFODAyMTFfRExfREFUQQkgICAoMTw8MzApICAgLy91c2UgdGhpcyBmbGFnIHRvIGNvbnRyb2wgd2hldGhlciBwcmludCBkYXRhIGJ1ZiBvdXQuCisjZGVmaW5lIElFRUU4MDIxMV9ETF9FUlIJICAgKDE8PDMxKSAgIC8vYWx3YXlzIG9wZW4KKyNkZWZpbmUgSUVFRTgwMjExX0VSUk9SKGYsIGEuLi4pIHByaW50ayhLRVJOX0VSUiAiaWVlZTgwMjExOiAiIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9XQVJOSU5HKGYsIGEuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgImllZWU4MDIxMTogIiBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfSU5GTyhmLCBhLi4uKSAgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSU5GTywgZiwgIyMgYSkKKworI2RlZmluZSBJRUVFODAyMTFfREVCVUdfV1goZiwgYS4uLikgICAgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfV1gsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19TQ0FOKGYsIGEuLi4pICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9TQ0FOLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfU1RBVEUoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfU1RBVEUsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19NR01UKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX01HTVQsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19GUkFHKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0ZSQUcsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19FQVAoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRUFQLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfRFJPUChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9EUk9QLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfVFgoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFgsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19SWChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SWCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1FPUyhmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9RT1MsIGYsICMjIGEpCisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisvKiBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMS0yMi4gKi8KKyNkZWZpbmUgTUFYX1NUUl9MRU4gICAgIDY0CisvKiBJIHdhbnQgdG8gc2VlIEFTQ0lJIDMzIHRvIDEyNiBvbmx5LiBPdGhlcndpc2UsIEkgcHJpbnQgJz8nLiBBbm5pZSwgMjAwNS0xMS0yMi4qLworI2RlZmluZSBQUklOVEFCTEUoX2NoKSAgKF9jaD4nIScgJiYgX2NoPCd+JykKKyNkZWZpbmUgSUVFRTgwMjExX1BSSU5UX1NUUihfQ29tcCwgX1RpdGxlU3RyaW5nLCBfUHRyLCBfTGVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCQkJaWYoKF9Db21wKSAmIGxldmVsKSAgIAkJCQkJCQlcCisJCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJaW50ICAgICAgICAgICAgIF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQl1OCAgYnVmZmVyW01BWF9TVFJfTEVOXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCQkJCWludCBsZW5ndGggPSAoX0xlbjxNQVhfU1RSX0xFTik/IF9MZW4gOiAoTUFYX1NUUl9MRU4tMSkgOyAgCVwKKwkJCQltZW1zZXQoYnVmZmVyLCAwLCBNQVhfU1RSX0xFTik7ICAgICAgICAgICAgICAgICAgICAgIAkJXAorCQkJCW1lbWNweShidWZmZXIsICh1OCAqKV9QdHIsIGxlbmd0aCApOyAgICAgICAgICAgIAkJXAorCQkJCWZvciggX19pPTA7IF9faTxNQVhfU1RSX0xFTjsgX19pKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgIGlmKCAhUFJJTlRBQkxFKGJ1ZmZlcltfX2ldKSApICAgYnVmZmVyW19faV0gPSAnPyc7ICAgICAJXAorCQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJYnVmZmVyW2xlbmd0aF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQlwcmludGsoIlJ0bDgxOXg6ICIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkJCQlwcmludGsoX1RpdGxlU3RyaW5nKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQlwcmludGsoIjogJWQsIDwlcz5cbiIsIF9MZW4sIGJ1ZmZlcik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCX0KKyNlbHNlCisjZGVmaW5lIElFRUU4MDIxMV9QUklOVF9TVFIoX0NvbXAsIF9UaXRsZVN0cmluZywgX1B0ciwgX0xlbikgIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4gLyogQVJQSFJEX0VUSEVSICovCisKKyNpZm5kZWYgV0lSRUxFU1NfU1BZCisjZGVmaW5lIFdJUkVMRVNTX1NQWQkJLy8gZW5hYmxlIGl3c3B5IHN1cHBvcnQKKyNlbmRpZgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CS8vIG5ldyBkcml2ZXIgQVBJCisKKyNpZm5kZWYgRVRIX1BfUEFFCisjZGVmaW5lIEVUSF9QX1BBRSAweDg4OEUgLyogUG9ydCBBY2Nlc3MgRW50aXR5IChJRUVFIDgwMi4xWCkgKi8KKyNlbmRpZiAvKiBFVEhfUF9QQUUgKi8KKworI2RlZmluZSBFVEhfUF9QUkVBVVRIIDB4ODhDNyAvKiBJRUVFIDgwMi4xMWkgcHJlLWF1dGhlbnRpY2F0aW9uICovCisKKyNpZm5kZWYgRVRIX1BfODAyMTFfUkFXCisjZGVmaW5lIEVUSF9QXzgwMjExX1JBVyAoRVRIX1BfRUNPTkVUICsgMSkKKyNlbmRpZgorCisvKiBJRUVFIDgwMi4xMSBkZWZpbmVzICovCisKKyNkZWZpbmUgUDgwMjExX09VSV9MRU4gMworCitzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyIHsKKworCXU4ICAgIGRzYXA7ICAgLyogYWx3YXlzIDB4QUEgKi8KKwl1OCAgICBzc2FwOyAgIC8qIGFsd2F5cyAweEFBICovCisJdTggICAgY3RybDsgICAvKiBhbHdheXMgMHgwMyAqLworCXU4ICAgIG91aVtQODAyMTFfT1VJX0xFTl07ICAgIC8qIG9yZ2FuaXphdGlvbmFsIHVuaXZlcnNhbCBpZCAqLworCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBTTkFQX1NJWkUgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIpCisKKyNkZWZpbmUgV0xBTl9GQ19HRVRfVkVSUyhmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9WRVJTKQorI2RlZmluZSBXTEFOX0ZDX0dFVF9UWVBFKGZjKSAoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKQorI2RlZmluZSBXTEFOX0ZDX0dFVF9TVFlQRShmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkKKworI2RlZmluZSBXTEFOX0ZDX0dFVF9GUkFNRVRZUEUoZmMpICgoZmMpICYgSUVFRTgwMjExX0ZDVExfRlJBTUVUWVBFKQorI2RlZmluZSBXTEFOX0dFVF9TRVFfRlJBRyhzZXEpICgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX0ZSQUcpCisjZGVmaW5lIFdMQU5fR0VUX1NFUV9TRVEoc2VxKSAgKCgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKKworLyogQXV0aGVudGljYXRpb24gYWxnb3JpdGhtcyAqLworI2RlZmluZSBXTEFOX0FVVEhfT1BFTiAwCisjZGVmaW5lIFdMQU5fQVVUSF9TSEFSRURfS0VZIDEKKyNkZWZpbmUgV0xBTl9BVVRIX0xFQVAgMgorCisjZGVmaW5lIFdMQU5fQVVUSF9DSEFMTEVOR0VfTEVOIDEyOAorCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9CU1MgKDE8PDApCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9JQlNTICgxPDwxKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0ZfUE9MTEFCTEUgKDE8PDIpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DRl9QT0xMX1JFUVVFU1QgKDE8PDMpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZICgxPDw0KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUgKDE8PDUpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9QQkNDICgxPDw2KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0hBTk5FTF9BR0lMSVRZICgxPDw3KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU1BFQ1RSVU1fTUdNVCAoMTw8OCkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1FPUyAoMTw8OSkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QgKDE8PDEwKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfRFNTU19PRkRNICgxPDwxMykKKworLyogODAyLjExZyBFUlAgaW5mb3JtYXRpb24gZWxlbWVudCAqLworI2RlZmluZSBXTEFOX0VSUF9OT05fRVJQX1BSRVNFTlQgKDE8PDApCisjZGVmaW5lIFdMQU5fRVJQX1VTRV9QUk9URUNUSU9OICgxPDwxKQorI2RlZmluZSBXTEFOX0VSUF9CQVJLRVJfUFJFQU1CTEUgKDE8PDIpCisKKy8qIFN0YXR1cyBjb2RlcyAqLworZW51bSBpZWVlODAyMTFfc3RhdHVzY29kZSB7CisJV0xBTl9TVEFUVVNfU1VDQ0VTUyA9IDAsCisJV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRSA9IDEsCisJV0xBTl9TVEFUVVNfQ0FQU19VTlNVUFBPUlRFRCA9IDEwLAorCVdMQU5fU1RBVFVTX1JFQVNTT0NfTk9fQVNTT0MgPSAxMSwKKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfVU5TUEVDID0gMTIsCisJV0xBTl9TVEFUVVNfTk9UX1NVUFBPUlRFRF9BVVRIX0FMRyA9IDEzLAorCVdMQU5fU1RBVFVTX1VOS05PV05fQVVUSF9UUkFOU0FDVElPTiA9IDE0LAorCVdMQU5fU1RBVFVTX0NIQUxMRU5HRV9GQUlMID0gMTUsCisJV0xBTl9TVEFUVVNfQVVUSF9USU1FT1VUID0gMTYsCisJV0xBTl9TVEFUVVNfQVBfVU5BQkxFX1RPX0hBTkRMRV9ORVdfU1RBID0gMTcsCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1JBVEVTID0gMTgsCisJLyogODAyLjExYiAqLworCVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1NIT1JUUFJFQU1CTEUgPSAxOSwKKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9QQkNDID0gMjAsCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PQUdJTElUWSA9IDIxLAorCS8qIDgwMi4xMWggKi8KKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9TUEVDVFJVTSA9IDIyLAorCVdMQU5fU1RBVFVTX0FTU09DX1JFSkVDVEVEX0JBRF9QT1dFUiA9IDIzLAorCVdMQU5fU1RBVFVTX0FTU09DX1JFSkVDVEVEX0JBRF9TVVBQX0NIQU4gPSAyNCwKKwkvKiA4MDIuMTFnICovCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PU0hPUlRUSU1FID0gMjUsCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PRFNTU09GRE0gPSAyNiwKKwkvKiA4MDIuMTFpICovCisJV0xBTl9TVEFUVVNfSU5WQUxJRF9JRSA9IDQwLAorCVdMQU5fU1RBVFVTX0lOVkFMSURfR1JPVVBfQ0lQSEVSID0gNDEsCisJV0xBTl9TVEFUVVNfSU5WQUxJRF9QQUlSV0lTRV9DSVBIRVIgPSA0MiwKKwlXTEFOX1NUQVRVU19JTlZBTElEX0FLTVAgPSA0MywKKwlXTEFOX1NUQVRVU19VTlNVUFBfUlNOX1ZFUlNJT04gPSA0NCwKKwlXTEFOX1NUQVRVU19JTlZBTElEX1JTTl9JRV9DQVAgPSA0NSwKKwlXTEFOX1NUQVRVU19DSVBIRVJfU1VJVEVfUkVKRUNURUQgPSA0NiwKK307CisKKy8qIFJlYXNvbiBjb2RlcyAqLworZW51bSBpZWVlODAyMTFfcmVhc29uY29kZSB7CisJV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQgPSAxLAorCVdMQU5fUkVBU09OX1BSRVZfQVVUSF9OT1RfVkFMSUQgPSAyLAorCVdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HID0gMywKKwlXTEFOX1JFQVNPTl9ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWSA9IDQsCisJV0xBTl9SRUFTT05fRElTQVNTT0NfQVBfQlVTWSA9IDUsCisJV0xBTl9SRUFTT05fQ0xBU1MyX0ZSQU1FX0ZST01fTk9OQVVUSF9TVEEgPSA2LAorCVdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSA9IDcsCisJV0xBTl9SRUFTT05fRElTQVNTT0NfU1RBX0hBU19MRUZUID0gOCwKKwlXTEFOX1JFQVNPTl9TVEFfUkVRX0FTU09DX1dJVEhPVVRfQVVUSCA9IDksCisJLyogODAyLjExaCAqLworCVdMQU5fUkVBU09OX0RJU0FTU09DX0JBRF9QT1dFUiA9IDEwLAorCVdMQU5fUkVBU09OX0RJU0FTU09DX0JBRF9TVVBQX0NIQU4gPSAxMSwKKwkvKiA4MDIuMTFpICovCisJV0xBTl9SRUFTT05fSU5WQUxJRF9JRSA9IDEzLAorCVdMQU5fUkVBU09OX01JQ19GQUlMVVJFID0gMTQsCisJV0xBTl9SRUFTT05fNFdBWV9IQU5EU0hBS0VfVElNRU9VVCA9IDE1LAorCVdMQU5fUkVBU09OX0dST1VQX0tFWV9IQU5EU0hBS0VfVElNRU9VVCA9IDE2LAorCVdMQU5fUkVBU09OX0lFX0RJRkZFUkVOVCA9IDE3LAorCVdMQU5fUkVBU09OX0lOVkFMSURfR1JPVVBfQ0lQSEVSID0gMTgsCisJV0xBTl9SRUFTT05fSU5WQUxJRF9QQUlSV0lTRV9DSVBIRVIgPSAxOSwKKwlXTEFOX1JFQVNPTl9JTlZBTElEX0FLTVAgPSAyMCwKKwlXTEFOX1JFQVNPTl9VTlNVUFBfUlNOX1ZFUlNJT04gPSAyMSwKKwlXTEFOX1JFQVNPTl9JTlZBTElEX1JTTl9JRV9DQVAgPSAyMiwKKwlXTEFOX1JFQVNPTl9JRUVFODAyMVhfRkFJTEVEID0gMjMsCisJV0xBTl9SRUFTT05fQ0lQSEVSX1NVSVRFX1JFSkVDVEVEID0gMjQsCit9OworCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19TSUdOQUwgKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SU1NJICgxPDwxKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfTk9JU0UgKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SQVRFICgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfV0VNQVNLIDB4NworCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTiAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTiAgICgxPDwxKQorCisjZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9CQU5EICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExXzUyR0haX0JBTkQgICAgICgxPDwxKQorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV9MRU4gIAkJNAorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1CCQkJMHgwMgorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1CCQkJMHgwNAorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfNU1CCQkJMHgwQgorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQgkJCTB4MTYKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV9MRU4gCQk4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CCQkJMHgwQworI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQgkJCTB4MTIKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CCQkweDE4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQgkJMHgyNAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUIJCTB4MzAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CCQkweDQ4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQgkJMHg2MAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUIJCTB4NkMKKyNkZWZpbmUgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSwkJMHg4MAorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSwkJKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSwkJKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSwkJKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CX01BU0sJCSgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLCQkoMTw8NCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSwkJKDE8PDUpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLCQkoMTw8NikKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sJCSgxPDw3KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSwkJKDE8PDgpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLCQkoMTw8OSkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sJCSgxPDwxMCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0sJCSgxPDwxMSkKKworI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVTX01BU0sJCTB4MDAwMDAwMEYKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19CQVNJQ19SQVRFU19NQVNLCShJRUVFODAyMTFfQ0NLX1JBVEVfMU1CX01BU0sgfCBcCisJSUVFRTgwMjExX0NDS19SQVRFXzJNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfQ0NLX0RFRkFVTFRfUkFURVNfTUFTSwkoSUVFRTgwMjExX0NDS19CQVNJQ19SQVRFU19NQVNLIHwgXAorCUlFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQl9NQVNLKQorCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVTX01BU0sJCTB4MDAwMDBGRjAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSykKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fREVGQVVMVF9SQVRFU19NQVNLCShJRUVFODAyMTFfT0ZETV9CQVNJQ19SQVRFU19NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0sgIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMThNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9SQVRFU19NQVNLIChJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sgfCBcCisJCQkJSUVFRTgwMjExX0NDS19ERUZBVUxUX1JBVEVTX01BU0spCisKKyNkZWZpbmUgSUVFRTgwMjExX05VTV9PRkRNX1JBVEVTCSAgICA4CisjZGVmaW5lIElFRUU4MDIxMV9OVU1fQ0NLX1JBVEVTCQkgICAgNAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9TSElGVF9NQVNLX0EgICAgICAgICA0CisKKworLyogdGhpcyBpcyBzdG9sZW4gYW5kIG1vZGlmaWVkIGZyb20gdGhlIG1hZHdpZmkgZHJpdmVyKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9UWVBFX01BU0sJCTB4MGMKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9UWVBFX0RBVEEJCTB4MDgKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0sJMHhCMAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TCTB4ODAKKworI2RlZmluZSBJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpIFwKKwkoKChmYykgJiAoSUVFRTgwMjExX0ZDMF9UWVBFX01BU0sgfCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSykpID09IFwKKwkgKElFRUU4MDIxMV9GQzBfVFlQRV9EQVRBIHwgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPUykpCisKKy8qIHRoaXMgaXMgc3RvbGVuIGZyb20gaXB3MjIwMCBkcml2ZXIgKi8KKyNkZWZpbmUgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkUgMzEKK3N0cnVjdCBpZWVlX2lic3Nfc2VxIHsKKwl1OCBtYWNbRVRIX0FMRU5dOworCXUxNiBzZXFfbnVtWzE3XTsKKwl1MTYgZnJhZ19udW1bMTddOworCXVuc2lnbmVkIGxvbmcgcGFja2V0X3RpbWVbMTddOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKy8qIE5PVEU6IFRoaXMgZGF0YSBpcyBmb3Igc3RhdGlzdGljYWwgcHVycG9zZXM7IG5vdCBhbGwgaGFyZHdhcmUgcHJvdmlkZXMgdGhpcworICogICAgICAgaW5mb3JtYXRpb24gZm9yIGZyYW1lcyByZWNlaXZlZC4gIE5vdCBzZXR0aW5nIHRoZXNlIHdpbGwgbm90IGNhdXNlCisgKiAgICAgICBhbnkgYWR2ZXJzZSBhZmZlY3RzLiAqLworc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyB7CisJdTMyIG1hY190aW1lWzJdOworCXM4IHJzc2k7CisJdTggc2lnbmFsOworCXU4IG5vaXNlOworCXUxNiByYXRlOyAvKiBpbiAxMDAga2JwcyAqLworCXU4IHJlY2VpdmVkX2NoYW5uZWw7CisJdTggY29udHJvbDsKKwl1OCBtYXNrOworCXU4IGZyZXE7CisJdTE2IGxlbjsKKwl1NjQgdHNmOworCXUzMiBiZWFjb25fdGltZTsKKwl1OCBuaWNfdHlwZTsKKwl1MTYgICAgICAgTGVuZ3RoOworCS8vICAgICAgdTggICAgICAgIERhdGFSYXRlOyAgICAgIC8vIEluIDAuNSBNYnBzCisJdTggICAgICAgIFNpZ25hbFF1YWxpdHk7IC8vIGluIDAtMTAwIGluZGV4LgorCXMzMiAgICAgICBSZWN2U2lnbmFsUG93ZXI7IC8vIFJlYWwgcG93ZXIgaW4gZEJtIGZvciB0aGlzIHBhY2tldCwgbm8gYmVhdXRpZmljYXRpb24gYW5kIGFnZ3JlZ2F0aW9uLgorCXM4ICAgICAgICBSeFBvd2VyOyAvLyBpbiBkQm0gVHJhbnNsYXRlIGZyb20gUFdkQgorCXU4ICAgICAgICBTaWduYWxTdHJlbmd0aDsgLy8gaW4gMC0xMDAgaW5kZXguCisJdTE2ICAgICAgIGJId0Vycm9yOjE7CisJdTE2ICAgICAgIGJDUkM6MTsKKwl1MTYgICAgICAgYklDVjoxOworCXUxNiAgICAgICBiU2hvcnRQcmVhbWJsZToxOworCXUxNiAgICAgICBBbnRlbm5hOjE7ICAgICAgLy9mb3IgcnRsODE4NQorCXUxNiAgICAgICBEZWNyeXB0ZWQ6MTsgICAgLy9mb3IgcnRsODE4NSwgcnRsODE4NworCXUxNiAgICAgICBXYWtldXA6MTsgICAgICAgLy9mb3IgcnRsODE4NQorCXUxNiAgICAgICBSZXNlcnZlZDA6MTsgICAgLy9mb3IgcnRsODE4NQorCXU4ICAgICAgICBBR0M7CisJdTMyICAgICAgIFRpbWVTdGFtcExvdzsKKwl1MzIgICAgICAgVGltZVN0YW1wSGlnaDsKKwlib29sICAgICAgYlNoaWZ0OworCWJvb2wgICAgICBiSXNRb3NEYXRhOyAgICAgICAgICAgICAvLyBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMi0yMi4KKwl1OCAgICAgICAgVXNlclByaW9yaXR5OworCisJLy8xISEhISEhISEhISEhISEhISEhISEhISEhISEhCisJLy8xQXR0ZW50aW9uIFBsZWFzZSEhITwxMW4gb3IgODE5MCBzcGVjaWZpYyBjb2RlIHNob3VsZCBiZSBwdXQgYmVsb3cgdGhpcyBsaW5lPgorCS8vMSEhISEhISEhISEhISEhISEhISEhISEhISEhIQorCisJdTggICAgICAgIFJ4RHJ2SW5mb1NpemU7CisJdTggICAgICAgIFJ4QnVmU2hpZnQ7CisJYm9vbCAgICAgIGJJc0FNUERVOworCWJvb2wgICAgICBiRmlyc3RNUERVOworCWJvb2wgICAgICBiQ29udGFpbkhUQzsKKwlib29sICAgICAgUnhJczQwTUh6UGFja2V0OworCXUzMiAgICAgICBSeFBXREJBbGw7CisJdTggICAgICAgIFJ4TUlNT1NpZ25hbFN0cmVuZ3RoWzRdOyAgICAgICAgLy8gaW4gMH4xMDAgaW5kZXgKKwlzOCAgICAgICAgUnhNSU1PU2lnbmFsUXVhbGl0eVsyXTsKKwlib29sICAgICAgYlBhY2tldE1hdGNoQlNTSUQ7CisJYm9vbCAgICAgIGJJc0NDSzsKKwlib29sICAgICAgYlBhY2tldFRvU2VsZjsKKwkvL2FkZGVkIGJ5IGFteQorCXU4KiAgICAgICB2aXJ0dWFsX2FkZHJlc3M7CisJdTE2ICAgICAgICAgIHBhY2tldGxlbmd0aDsgICAgICAgICAgICAgIC8vIFRvdGFsIHBhY2tldCBsZW5ndGg6IE11c3QgZXF1YWwgdG8gc3VtIG9mIGFsbCBGcmFnTGVuZ3RoCisJdTE2ICAgICAgICAgIGZyYWdsZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnJhZ0xlbmd0aCBzaG91bGQgZXF1YWwgdG8gUGFja2V0TGVuZ3RoIGluIG5vbi1mcmFnbWVudCBjYXNlCisJdTE2ICAgICAgICAgIGZyYWdvZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YSBvZmZzZXQgZm9yIHRoaXMgZnJhZ21lbnQKKwl1MTYgICAgICAgICAgbnRvdGFsZnJhZzsKKwlib29sICAgICAgCSAgYmlzcnhhZ2dyc3ViZnJhbWU7CisJYm9vbAkJICBiUGFja2V0QmVhY29uOwkvL2Nvc2EgYWRkIGZvciByc3NpCisJYm9vbAkJICBiVG9TZWxmQkE7CQkvL2Nvc2EgYWRkIGZvciByc3NpCisJY2hhciAJICBjY2tfYWRjX3B3ZGJbNF07CS8vY29zYSBhZGQgZm9yIHJ4IHBhdGggc2VsZWN0aW9uCisJdTE2CQkgIFNlcV9OdW07CisKK307CisKKy8qIElFRUUgODAyLjExIHJlcXVpcmVzIHRoYXQgU1RBIHN1cHBvcnRzIGNvbmN1cnJlbnQgcmVjZXB0aW9uIG9mIGF0IGxlYXN0CisgKiB0aHJlZSBmcmFnbWVudGVkIGZyYW1lcy4gVGhpcyBkZWZpbmUgY2FuIGJlIGluY3JlYXNlZCB0byBzdXBwb3J0IG1vcmUKKyAqIGNvbmN1cnJlbnQgZnJhbWVzLCBidXQgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgZWFjaCBlbnRyeSBjYW4gY29uc3VtZSBhYm91dAorICogMiBrQiBvZiBSQU0gYW5kIGluY3JlYXNpbmcgY2FjaGUgc2l6ZSB3aWxsIHNsb3cgZG93biBmcmFtZSByZWFzc2VtYmx5LiAqLworI2RlZmluZSBJRUVFODAyMTFfRlJBR19DQUNIRV9MRU4gNAorCitzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgeworCXVuc2lnbmVkIGxvbmcgZmlyc3RfZnJhZ190aW1lOworCXVuc2lnbmVkIGludCBzZXE7CisJdW5zaWduZWQgaW50IGxhc3RfZnJhZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU4IHNyY19hZGRyW0VUSF9BTEVOXTsKKwl1OCBkc3RfYWRkcltFVEhfQUxFTl07Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3N0YXRzIHsKKwl1bnNpZ25lZCBpbnQgdHhfdW5pY2FzdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X211bHRpY2FzdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X2ZyYWdtZW50czsKKwl1bnNpZ25lZCBpbnQgdHhfdW5pY2FzdF9vY3RldHM7CisJdW5zaWduZWQgaW50IHR4X211bHRpY2FzdF9vY3RldHM7CisJdW5zaWduZWQgaW50IHR4X2RlZmVycmVkX3RyYW5zbWlzc2lvbnM7CisJdW5zaWduZWQgaW50IHR4X3NpbmdsZV9yZXRyeV9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X211bHRpcGxlX3JldHJ5X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfcmV0cnlfbGltaXRfZXhjZWVkZWQ7CisJdW5zaWduZWQgaW50IHR4X2Rpc2NhcmRzOworCXVuc2lnbmVkIGludCByeF91bmljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgcnhfbXVsdGljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgcnhfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCByeF91bmljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgcnhfbXVsdGljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgcnhfZmNzX2Vycm9yczsKKwl1bnNpZ25lZCBpbnQgcnhfZGlzY2FyZHNfbm9fYnVmZmVyOworCXVuc2lnbmVkIGludCB0eF9kaXNjYXJkc193cm9uZ19zYTsKKwl1bnNpZ25lZCBpbnQgcnhfZGlzY2FyZHNfdW5kZWNyeXB0YWJsZTsKKwl1bnNpZ25lZCBpbnQgcnhfbWVzc2FnZV9pbl9tc2dfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCByeF9tZXNzYWdlX2luX2JhZF9tc2dfZnJhZ21lbnRzOworfTsKKworc3RydWN0IGllZWU4MDIxMV9kZXZpY2U7CisKKyNpbmNsdWRlICJpZWVlODAyMTFfY3J5cHQuaCIKKworI2RlZmluZSBTRUNfS0VZXzEgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgU0VDX0tFWV8yICAgICAgICAgKDE8PDEpCisjZGVmaW5lIFNFQ19LRVlfMyAgICAgICAgICgxPDwyKQorI2RlZmluZSBTRUNfS0VZXzQgICAgICAgICAoMTw8MykKKyNkZWZpbmUgU0VDX0FDVElWRV9LRVkgICAgKDE8PDQpCisjZGVmaW5lIFNFQ19BVVRIX01PREUgICAgICgxPDw1KQorI2RlZmluZSBTRUNfVU5JQ0FTVF9HUk9VUCAoMTw8NikKKyNkZWZpbmUgU0VDX0xFVkVMICAgICAgICAgKDE8PDcpCisjZGVmaW5lIFNFQ19FTkFCTEVEICAgICAgICgxPDw4KQorI2RlZmluZSBTRUNfRU5DUllQVCAgICAgICAoMTw8OSkKKworI2RlZmluZSBTRUNfTEVWRUxfMCAgICAgIDAgLyogTm9uZSAqLworI2RlZmluZSBTRUNfTEVWRUxfMSAgICAgIDEgLyogV0VQIDQwIGFuZCAxMDQgYml0ICovCisjZGVmaW5lIFNFQ19MRVZFTF8yICAgICAgMiAvKiBMZXZlbCAxICsgVEtJUCAqLworI2RlZmluZSBTRUNfTEVWRUxfMl9DS0lQIDMgLyogTGV2ZWwgMSArIENLSVAgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzMgICAgICA0IC8qIExldmVsIDIgKyBDQ01QICovCisKKyNkZWZpbmUgU0VDX0FMR19OT05FICAgICAgICAgICAgMAorI2RlZmluZSBTRUNfQUxHX1dFUCAgICAgICAgICAgICAxCisjZGVmaW5lIFNFQ19BTEdfVEtJUCAgICAgICAgICAgIDIKKyNkZWZpbmUgU0VDX0FMR19DQ01QICAgICAgICAgICAgMworCisjZGVmaW5lIFdFUF9LRVlTIAkJNAorI2RlZmluZSBXRVBfS0VZX0xFTgkJMTMKKyNkZWZpbmUgU0NNX0tFWV9MRU4gICAgICAgICAgICAgMzIKKyNkZWZpbmUgU0NNX1RFTVBPUkFMX0tFWV9MRU5HVEggMTYKKworc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSB7CisJdTE2IGFjdGl2ZV9rZXk6MiwKKwkgICAgZW5hYmxlZDoxLAorCSAgICBhdXRoX21vZGU6MiwKKwkgICAgYXV0aF9hbGdvOjQsCisJICAgIHVuaWNhc3RfdXNlc19ncm91cDoxLAorCSAgICBlbmNyeXB0OjE7CisJdTgga2V5X3NpemVzW1dFUF9LRVlTXTsKKwl1OCBrZXlzW1dFUF9LRVlTXVtTQ01fS0VZX0xFTl07CisJdTggbGV2ZWw7CisJdTE2IGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyoKKyA4MDIuMTEgZGF0YSBmcmFtZSBmcm9tIEFQCisgICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgIDIgICB8ICAyICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgMiAgIHwgMC4uMjMxMiB8ICAgNCAgfAorICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18CitEZXNjLiB8IGN0cmwgfCBkdXJhIHwgIERBL1JBICB8ICAgVEEgICAgfCAgICBTQSAgIHwgU2VxdSB8ICBmcmFtZSAgfCAgZmNzIHwKKyAgICAgIHwgICAgICB8IHRpb24gfCAoQlNTSUQpIHwgICAgICAgICB8ICAgICAgICAgfCBlbmNlIHwgIGRhdGEgICB8ICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCitUb3RhbDogMjgtMjM0MCBieXRlcworKi8KKworLyogTWFuYWdlbWVudCBGcmFtZSBJbmZvcm1hdGlvbiBFbGVtZW50IFR5cGVzICovCitlbnVtIGllZWU4MDIxMV9tZmllIHsKKwlNRklFX1RZUEVfU1NJRCA9IDAsCisJTUZJRV9UWVBFX1JBVEVTID0gMSwKKwlNRklFX1RZUEVfRkhfU0VUID0gMiwKKwlNRklFX1RZUEVfRFNfU0VUID0gMywKKwlNRklFX1RZUEVfQ0ZfU0VUID0gNCwKKwlNRklFX1RZUEVfVElNID0gNSwKKwlNRklFX1RZUEVfSUJTU19TRVQgPSA2LAorCU1GSUVfVFlQRV9DT1VOVFJZID0gNywKKwlNRklFX1RZUEVfSE9QX1BBUkFNUyA9IDgsCisJTUZJRV9UWVBFX0hPUF9UQUJMRSA9IDksCisJTUZJRV9UWVBFX1JFUVVFU1QgPSAxMCwKKwlNRklFX1RZUEVfQ0hBTExFTkdFID0gMTYsCisJTUZJRV9UWVBFX1BPV0VSX0NPTlNUUkFJTlQgPSAzMiwKKwlNRklFX1RZUEVfUE9XRVJfQ0FQQUJJTElUWSA9IDMzLAorCU1GSUVfVFlQRV9UUENfUkVRVUVTVCA9IDM0LAorCU1GSUVfVFlQRV9UUENfUkVQT1JUID0gMzUsCisJTUZJRV9UWVBFX1NVUFBfQ0hBTk5FTFMgPSAzNiwKKwlNRklFX1RZUEVfQ1NBID0gMzcsCisJTUZJRV9UWVBFX01FQVNVUkVfUkVRVUVTVCA9IDM4LAorCU1GSUVfVFlQRV9NRUFTVVJFX1JFUE9SVCA9IDM5LAorCU1GSUVfVFlQRV9RVUlFVCA9IDQwLAorCU1GSUVfVFlQRV9JQlNTX0RGUyA9IDQxLAorCU1GSUVfVFlQRV9FUlAgPSA0MiwKKwlNRklFX1RZUEVfUlNOID0gNDgsCisJTUZJRV9UWVBFX1JBVEVTX0VYID0gNTAsCisJTUZJRV9UWVBFX0hUX0NBUD0gNDUsCisJIE1GSUVfVFlQRV9IVF9JTkZPPSA2MSwKKwkgTUZJRV9UWVBFX0FJUk9ORVQ9MTMzLAorCU1GSUVfVFlQRV9HRU5FUklDID0gMjIxLAorCU1GSUVfVFlQRV9RT1NfUEFSQU1FVEVSID0gMjIyLAorfTsKKworLyogTWluaW1hbCBoZWFkZXI7IGNhbiBiZSB1c2VkIGZvciBwYXNzaW5nIDgwMi4xMSBmcmFtZXMgd2l0aCBzdWZmaWNpZW50CisgKiBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0eXBlIG9mIHVuZGVybHlpbmcgZGF0YSB0eXBlIGlzIGFjdHVhbGx5CisgKiBzdG9yZWQgaW4gdGhlIGRhdGEuICovCitzdHJ1Y3QgaWVlZTgwMjExX2hkciB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggcGF5bG9hZFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl8xYWRkciB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IHBheWxvYWRbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9oZHJfMmFkZHIgeworCV9fbGUxNiBmcmFtZV9jdGw7CisJX19sZTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggcGF5bG9hZFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJX19sZTE2IHNlcV9jdGw7CisJdTggcGF5bG9hZFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJX19sZTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworCXU4IHBheWxvYWRbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgeworCV9fbGUxNiBmcmFtZV9jdGw7CisJX19sZTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCV9fbGUxNiBzZXFfY3RsOworCXU4IHBheWxvYWRbMF07CisJX19sZTE2IHFvc19jdGw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHJxb3MgeworCV9fbGUxNiBmcmFtZV9jdGw7CisJX19sZTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCV9fbGUxNiBzZXFfY3RsOworCXU4IGFkZHI0W0VUSF9BTEVOXTsKKwl1OCBwYXlsb2FkWzBdOworCV9fbGUxNiBxb3NfY3RsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IHsKKwl1OCBpZDsKKwl1OCBsZW47CisJdTggZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJX19sZTE2IGFsZ29yaXRobTsKKwlfX2xlMTYgdHJhbnNhY3Rpb247CisJX19sZTE2IHN0YXR1czsKKwkvKmNoYWxsZW5nZSovCisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2MgeworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKKwlfX2xlMTYgcmVhc29uOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCS8qIFNTSUQsIHN1cHBvcnRlZCByYXRlcyAqLworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJX19sZTE2IGJlYWNvbl9pbnRlcnZhbDsKKwlfX2xlMTYgY2FwYWJpbGl0eTsKKwkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMsIEZIIHBhcmFtcywgRFMgcGFyYW1zLAorCSAqIENGIHBhcmFtcywgSUJTUyBwYXJhbXMsIFRJTSAoaWYgYmVhY29uKSwgUlNOICovCisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEFsaWFzIGJlYWNvbiBmb3IgcHJvYmVfcmVzcG9uc2UgKi8KKyNkZWZpbmUgaWVlZTgwMjExX2JlYWNvbiBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UKKworc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJX19sZTE2IGNhcGFiaWxpdHk7CisJX19sZTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMsIFJTTiAqLworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3JlYXNzb2NfcmVxdWVzdF9mcmFtZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCV9fbGUxNiBjYXBhYmlsaXR5OworCV9fbGUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJdTggY3VycmVudF9hcFtFVEhfQUxFTl07CisJLyogU1NJRCwgc3VwcG9ydGVkIHJhdGVzLCBSU04gKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCV9fbGUxNiBjYXBhYmlsaXR5OworCV9fbGUxNiBzdGF0dXM7CisJX19sZTE2IGFpZDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07IC8qIHN1cHBvcnRlZCByYXRlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfdHhiIHsKKwl1OCBucl9mcmFnczsKKwl1OCBlbmNyeXB0ZWQ7CisJdTggcXVldWVfaW5kZXg7CisJdTggcnRzX2luY2x1ZGVkOworCXUxNiByZXNlcnZlZDsKKwlfX2xlMTYgZnJhZ19zaXplOworCV9fbGUxNiBwYXlsb2FkX3NpemU7CisJc3RydWN0IHNrX2J1ZmYgKmZyYWdtZW50c1swXTsKK307CisKKyNkZWZpbmUgTUFYX1RYX0FHR19DT1VOVAkJICAxNgorc3RydWN0IGllZWU4MDIxMV9kcnZfYWdnX3R4YiB7CisJdTggbnJfZHJ2X2FnZ19mcmFtZXM7CisJc3RydWN0IHNrX2J1ZmYgKnR4X2FnZ19mcmFtZXNbTUFYX1RYX0FHR19DT1VOVF07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgTUFYX1NVQkZSQU1FX0NPVU5UIAkJICA2NAorc3RydWN0IGllZWU4MDIxMV9yeGIgeworCXU4IG5yX3N1YmZyYW1lczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc3ViZnJhbWVzW01BWF9TVUJGUkFNRV9DT1VOVF07CisJdTggZHN0W0VUSF9BTEVOXTsKKwl1OCBzcmNbRVRIX0FMRU5dOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCit0eXBlZGVmIHVuaW9uIF9mcmFtZXFvcyB7CisJdTE2IHNob3J0ZGF0YTsKKwl1OCAgY2hhcmRhdGFbMl07CisJc3RydWN0IHsKKwkJdTE2IHRpZDo0OworCQl1MTYgZW9zcDoxOworCQl1MTYgYWNrX3BvbGljeToyOworCQl1MTYgcmVzZXJ2ZWQ6MTsKKwkJdTE2IHR4b3A6ODsKKwl9ZmllbGQ7Cit9ZnJhbWVxb3MsKnBmcmFtZXFvczsKKworLyogU1dFRVAgVEFCTEUgRU5UUklFUyBOVU1CRVIqLworI2RlZmluZSBNQVhfU1dFRVBfVEFCX0VOVFJJRVMJCSAgNDIKKyNkZWZpbmUgTUFYX1NXRUVQX1RBQl9FTlRSSUVTX1BFUl9QQUNLRVQgIDcKKy8qIE1BWF9SQVRFU19MRU5HVEggbmVlZHMgdG8gYmUgMTIuICBUaGUgc3BlYyBzYXlzIDgsIGFuZCBtYW55IEFQcworICogb25seSB1c2UgOCwgYW5kIHRoZW4gdXNlIGV4dGVuZGVkIHJhdGVzIGZvciB0aGUgcmVtYWluaW5nIHN1cHBvcnRlZAorICogcmF0ZXMuICBPdGhlciBBUHMsIGhvd2V2ZXIsIHN0aWNrIGFsbCBvZiB0aGVpciBzdXBwb3J0ZWQgcmF0ZXMgb24gdGhlCisgKiBtYWluIHJhdGVzIGluZm9ybWF0aW9uIGVsZW1lbnQuLi4gKi8KKyNkZWZpbmUgTUFYX1JBVEVTX0xFTkdUSCAgICAgICAgICAgICAgICAgICgodTgpMTIpCisjZGVmaW5lIE1BWF9SQVRFU19FWF9MRU5HVEggICAgICAgICAgICAgICAoKHU4KTE2KQorI2RlZmluZSBNQVhfTkVUV09SS19DT1VOVCAgICAgICAgICAgICAgICAgIDEyOAorCisjZGVmaW5lIE1BWF9DSEFOTkVMX05VTUJFUiAgICAgICAgICAgICAgICAgMTYxCisjZGVmaW5lIElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRQkgICAxMDAKKy8vKEhaIC8gMikKKyNkZWZpbmUgSUVFRTgwMjExX1NPRlRNQUNfQVNTT0NfUkVUUllfVElNRSAoSFogKiAyKQorCisjZGVmaW5lIENSQ19MRU5HVEggICAgICAgICAgICAgICAgIDRVCisKKyNkZWZpbmUgTUFYX1dQQV9JRV9MRU4gNjQKKworI2RlZmluZSBORVRXT1JLX0VNUFRZX0VTU0lEICgxPDwwKQorI2RlZmluZSBORVRXT1JLX0hBU19PRkRNICAgICgxPDwxKQorI2RlZmluZSBORVRXT1JLX0hBU19DQ0sgICAgICgxPDwyKQorCisvKiBRb1Mgc3RydWN0dXJlICovCisjZGVmaW5lIE5FVFdPUktfSEFTX1FPU19QQVJBTUVURVJTICAgICAgKDE8PDMpCisjZGVmaW5lIE5FVFdPUktfSEFTX1FPU19JTkZPUk1BVElPTiAgICAgKDE8PDQpCisjZGVmaW5lIE5FVFdPUktfSEFTX1FPU19NQVNLICAgICAgICAgICAgKE5FVFdPUktfSEFTX1FPU19QQVJBTUVURVJTIHwgXAorCQkJCQkgTkVUV09SS19IQVNfUU9TX0lORk9STUFUSU9OKQorLyogODAyLjExaCAqLworI2RlZmluZSBORVRXT1JLX0hBU19QT1dFUl9DT05TVFJBSU5UICAgICgxPDw1KQorI2RlZmluZSBORVRXT1JLX0hBU19DU0EgICAgICAgICAgICAgICAgICgxPDw2KQorI2RlZmluZSBORVRXT1JLX0hBU19RVUlFVCAgICAgICAgICAgICAgICgxPDw3KQorI2RlZmluZSBORVRXT1JLX0hBU19JQlNTX0RGUyAgICAgICAgICAgICgxPDw4KQorI2RlZmluZSBORVRXT1JLX0hBU19UUENfUkVQT1JUICAgICAgICAgICgxPDw5KQorCisjZGVmaW5lIE5FVFdPUktfSEFTX0VSUF9WQUxVRSAgICAgICAgICAgKDE8PDEwKQorCisjZGVmaW5lIFFPU19RVUVVRV9OVU0gICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBRT1NfT1VJX0xFTiAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUU9TX09VSV9UWVBFICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFFPU19FTEVNRU5UX0lEICAgICAgICAgICAgICAgICAgMjIxCisjZGVmaW5lIFFPU19PVUlfSU5GT19TVUJfVFlQRSAgICAgICAgICAgMAorI2RlZmluZSBRT1NfT1VJX1BBUkFNX1NVQl9UWVBFICAgICAgICAgIDEKKyNkZWZpbmUgUU9TX1ZFUlNJT05fMSAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFFPU19BSUZTTl9NSU5fVkFMVUUgICAgICAgICAgICAgMgorc3RydWN0IGllZWU4MDIxMV9xb3NfaW5mb3JtYXRpb25fZWxlbWVudCB7CisJdTggZWxlbWVudElEOworCXU4IGxlbmd0aDsKKwl1OCBxdWlbUU9TX09VSV9MRU5dOworCXU4IHF1aV90eXBlOworCXU4IHF1aV9zdWJ0eXBlOworCXU4IHZlcnNpb247CisJdTggYWNfaW5mbzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3Fvc19hY19wYXJhbWV0ZXIgeworCXU4IGFjaV9haWZzbjsKKwl1OCBlY3dfbWluX21heDsKKwlfX2xlMTYgdHhfb3BfbGltaXQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVyX2luZm8geworCXN0cnVjdCBpZWVlODAyMTFfcW9zX2luZm9ybWF0aW9uX2VsZW1lbnQgaW5mb19lbGVtZW50OworCXU4IHJlc2VydmVkOworCXN0cnVjdCBpZWVlODAyMTFfcW9zX2FjX3BhcmFtZXRlciBhY19wYXJhbXNfcmVjb3JkW1FPU19RVUVVRV9OVU1dOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMgeworCV9fbGUxNiBjd19taW5bUU9TX1FVRVVFX05VTV07CisJX19sZTE2IGN3X21heFtRT1NfUVVFVUVfTlVNXTsKKwl1OCBhaWZzW1FPU19RVUVVRV9OVU1dOworCXU4IGZsYWdbUU9TX1FVRVVFX05VTV07CisJX19sZTE2IHR4X29wX2xpbWl0W1FPU19RVUVVRV9OVU1dOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfcW9zX2RhdGEgeworCXN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMgcGFyYW1ldGVyczsKKwlpbnQgYWN0aXZlOworCWludCBzdXBwb3J0ZWQ7CisJdTggcGFyYW1fY291bnQ7CisJdTggb2xkX3BhcmFtX2NvdW50OworfTsKKworc3RydWN0IGllZWU4MDIxMV90aW1fcGFyYW1ldGVycyB7CisJdTggdGltX2NvdW50OworCXU4IHRpbV9wZXJpb2Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLy8jZWxzZQorc3RydWN0IGllZWU4MDIxMV93bW1fYWNfcGFyYW0geworCXU4IGFjX2FjaV9hY21fYWlmc247CisJdTggYWNfZWN3bWluX2Vjd21heDsKKwl1MTYgYWNfdHhvcF9saW1pdDsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfd21tX3RzX2luZm8geworCXU4IGFjX2Rpcl90aWQ7CisJdTggYWNfdXBfcHNiOworCXU4IHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfd21tX3RzcGVjX2VsZW0geworCXN0cnVjdCBpZWVlODAyMTFfd21tX3RzX2luZm8gdHNfaW5mbzsKKwl1MTYgbm9ybV9tc2R1X3NpemU7CisJdTE2IG1heF9tc2R1X3NpemU7CisJdTMyIG1pbl9zZXJ2X2ludGVyOworCXUzMiBtYXhfc2Vydl9pbnRlcjsKKwl1MzIgaW5hY3RfaW50ZXI7CisJdTMyIHN1c3Blbl9pbnRlcjsKKwl1MzIgc2Vydl9zdGFydF90aW1lOworCXUzMiBtaW5fZGF0YV9yYXRlOworCXUzMiBtZWFuX2RhdGFfcmF0ZTsKKwl1MzIgcGVha19kYXRhX3JhdGU7CisJdTMyIG1heF9idXJzdF9zaXplOworCXUzMiBkZWxheV9ib3VuZDsKKwl1MzIgbWluX3BoeV9yYXRlOworCXUxNiBzdXJwX2JhbmRfYWxsb3c7CisJdTE2IG1lZGl1bV90aW1lOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworZW51bSBlYXBfdHlwZSB7CisJRUFQX1BBQ0tFVCA9IDAsCisJRUFQT0xfU1RBUlQsCisJRUFQT0xfTE9HT0ZGLAorCUVBUE9MX0tFWSwKKwlFQVBPTF9FTkNBUF9BU0ZfQUxFUlQKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICplYXBfdHlwZXNbXSA9IHsKKwlbRUFQX1BBQ0tFVF0JCT0gIkVBUC1QYWNrZXQiLAorCVtFQVBPTF9TVEFSVF0JCT0gIkVBUE9MLVN0YXJ0IiwKKwlbRUFQT0xfTE9HT0ZGXQkJPSAiRUFQT0wtTG9nb2ZmIiwKKwlbRUFQT0xfS0VZXQkJPSAiRUFQT0wtS2V5IiwKKwlbRUFQT0xfRU5DQVBfQVNGX0FMRVJUXQk9ICJFQVBPTC1FbmNhcC1BU0YtQWxlcnQiCit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmVhcF9nZXRfdHlwZShpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKCh1MzIpdHlwZSA+PSBBUlJBWV9TSVpFKGVhcF90eXBlcykpID8gIlVua25vd24iIDogZWFwX3R5cGVzW3R5cGVdOworfQorLy9hZGRlZCBieSBhbXkgZm9yIHJlb3JkZXIKK3N0YXRpYyBpbmxpbmUgdTggRnJhbWVfUW9TVElEKHU4KiBidWYpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmhkcjsKKwl1MTYgZmM7CisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopYnVmOworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCXJldHVybiAodTgpKChmcmFtZXFvcyopKGJ1ZiArICgoKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykmJihmYyAmIElFRUU4MDIxMV9GQ1RMX0ZST01EUykpPyAzMCA6IDI0KSkpLT5maWVsZC50aWQ7Cit9CisKKy8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCisKK3N0cnVjdCBlYXBvbCB7CisJdTggc25hcFs2XTsKKwl1MTYgZXRoZXJ0eXBlOworCXU4IHZlcnNpb247CisJdTggdHlwZTsKKwl1MTYgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfc29mdG1hY19zdGF0c3sKKwl1bnNpZ25lZCBpbnQgcnhfYXNzX29rOworCXVuc2lnbmVkIGludCByeF9hc3NfZXJyOworCXVuc2lnbmVkIGludCByeF9wcm9iZV9ycTsKKwl1bnNpZ25lZCBpbnQgdHhfcHJvYmVfcnM7CisJdW5zaWduZWQgaW50IHR4X2JlYWNvbnM7CisJdW5zaWduZWQgaW50IHJ4X2F1dGhfcnE7CisJdW5zaWduZWQgaW50IHJ4X2F1dGhfcnNfb2s7CisJdW5zaWduZWQgaW50IHJ4X2F1dGhfcnNfZXJyOworCXVuc2lnbmVkIGludCB0eF9hdXRoX3JxOworCXVuc2lnbmVkIGludCBub19hdXRoX3JzOworCXVuc2lnbmVkIGludCBub19hc3NfcnM7CisJdW5zaWduZWQgaW50IHR4X2Fzc19ycTsKKwl1bnNpZ25lZCBpbnQgcnhfYXNzX3JxOworCXVuc2lnbmVkIGludCB0eF9wcm9iZV9ycTsKKwl1bnNpZ25lZCBpbnQgcmVhc3NvYzsKKwl1bnNpZ25lZCBpbnQgc3d0eHN0b3A7CisJdW5zaWduZWQgaW50IHN3dHhhd2FrZTsKKwl1bnNpZ25lZCBjaGFyIEN1cnJlbnRTaG93VHhhdGU7CisJdW5zaWduZWQgY2hhciBsYXN0X3BhY2tldF9yYXRlOworCXVuc2lnbmVkIGludCB0eHJldHJ5Y291bnQ7Cit9OworCisjZGVmaW5lIEJFQUNPTl9QUk9CRV9TU0lEX0lEX1BPU0lUSU9OIDEyCisKK3N0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkciB7CisJdTggaWQ7CisJdTggbGVuOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGRhdGEgdHlwZXMgdGhhdCBjYW4gbWFrZSB1cCBtYW5hZ2VtZW50IHBhY2tldHMKKyAqCisJdTE2IGF1dGhfYWxnb3JpdGhtOworCXUxNiBhdXRoX3NlcXVlbmNlOworCXUxNiBiZWFjb25faW50ZXJ2YWw7CisJdTE2IGNhcGFiaWxpdHk7CisJdTggY3VycmVudF9hcFtFVEhfQUxFTl07CisJdTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwlzdHJ1Y3QgeworCQl1MTYgYXNzb2NpYXRpb25faWQ6MTQsIHJlc2VydmVkOjI7CisJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IHJlYXNvbjsKKwl1MTYgc3RhdHVzOworKi8KKworI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCAiUGVuZ3VpbiIKKyNkZWZpbmUgSUVFRTgwMjExX0RFRkFVTFRfQkFTSUNfUkFURSAyIC8vMU1icHMKKworZW51bSB7V01NX2FsbF9mcmFtZSwgV01NX3R3b19mcmFtZSwgV01NX2ZvdXJfZnJhbWUsIFdNTV9zaXhfZnJhbWV9OworI2RlZmluZSBNQVhfU1BfTGVuICAoV01NX2FsbF9mcmFtZSA8PCA0KQorI2RlZmluZSBJRUVFODAyMTFfUU9TX1RJRCAweDBmCisjZGVmaW5lIFFPU19DVExfTk9UQ09OVEFJTl9BQ0sgKDB4MDEgPDwgNSkKKworI2RlZmluZSBJRUVFODAyMTFfRFRJTV9NQkNBU1QgNAorI2RlZmluZSBJRUVFODAyMTFfRFRJTV9VQ0FTVCAyCisjZGVmaW5lIElFRUU4MDIxMV9EVElNX1ZBTElEIDEKKyNkZWZpbmUgSUVFRTgwMjExX0RUSU1fSU5WQUxJRCAwCisKKyNkZWZpbmUgSUVFRTgwMjExX1BTX0RJU0FCTEVEIDAKKyNkZWZpbmUgSUVFRTgwMjExX1BTX1VOSUNBU1QgSUVFRTgwMjExX0RUSU1fVUNBU1QKKyNkZWZpbmUgSUVFRTgwMjExX1BTX01CQ0FTVCBJRUVFODAyMTFfRFRJTV9NQkNBU1QKKworLy9hZGRlZCBieSBEYXZpZCBmb3IgUW9TIDIwMDYvNi8zMAorLy8jZGVmaW5lIFdNTV9IYW5nXzgxODcKKyNpZmRlZiBXTU1fSGFuZ184MTg3CisjdW5kZWYgV01NX0hhbmdfODE4NworI2VuZGlmCisKKyNkZWZpbmUgV01FX0FDX0JLICAgMHgwMAorI2RlZmluZSBXTUVfQUNfQkUgICAweDAxCisjZGVmaW5lIFdNRV9BQ19WSSAgIDB4MDIKKyNkZWZpbmUgV01FX0FDX1ZPICAgMHgwMworI2RlZmluZSBXTUVfQUNJX01BU0sgMHgwMworI2RlZmluZSBXTUVfQUlGU05fTUFTSyAweDAzCisjZGVmaW5lIFdNRV9BQ19QUkFNX0xFTiAxNgorCisjZGVmaW5lIE1BWF9SRUNFSVZFX0JVRkZFUl9TSVpFIDkxMDAKKworLy9VUCBNYXBwaW5nIHRvIEFDLCB1c2luZyBpbiBNZ250UXVlcnlfU2VxdWVuY2VOdW1iZXIoKSBhbmQgbWF5YmUgZm9yIERTQ1AKKy8vI2RlZmluZSBVUDJBQyh1cCkJKCh1cDwzKSA/ICgodXA9PTApPzE6MCkgOiAodXA+PjEpKQorI2RlZmluZSBVUDJBQyh1cCkgKAkJICAgXAorCSgodXApIDwgMSkgPyBXTUVfQUNfQkUgOiBcCisJKCh1cCkgPCAzKSA/IFdNRV9BQ19CSyA6IFwKKwkoKHVwKSA8IDQpID8gV01FX0FDX0JFIDogXAorCSgodXApIDwgNikgPyBXTUVfQUNfVkkgOiBcCisJV01FX0FDX1ZPKQorLy9BQyBNYXBwaW5nIHRvIFVQLCB1c2luZyBpbiBUeCBwYXJ0IGZvciBzZWxlY3RpbmcgdGhlIGNvcnJlc3BvbmRpbmcgVFggcXVldWUKKyNkZWZpbmUgQUMyVVAoX2FjKQkoICAgICAgIFwKKwkoKF9hYykgPT0gV01FX0FDX1ZPKSA/IDYgOiBcCisJKChfYWMpID09IFdNRV9BQ19WSSkgPyA1IDogXAorCSgoX2FjKSA9PSBXTUVfQUNfQkspID8gMSA6IFwKKwkwKQorCisjZGVmaW5lCUVUSEVSX0FERFJfTEVOCQk2CS8qIGxlbmd0aCBvZiBhbiBFdGhlcm5ldCBhZGRyZXNzICovCisjZGVmaW5lIEVUSEVSTkVUX0hFQURFUl9TSVpFICAgIDE0ICAgICAgLyogbGVuZ3RoIG9mIHR3byBFdGhlcm5ldCBhZGRyZXNzIHBsdXMgZXRoZXIgdHlwZSovCisKK3N0cnVjdAlldGhlcl9oZWFkZXIgeworCXU4IGV0aGVyX2Rob3N0W0VUSEVSX0FERFJfTEVOXTsKKwl1OCBldGhlcl9zaG9zdFtFVEhFUl9BRERSX0xFTl07CisJdTE2IGV0aGVyX3R5cGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjaWZuZGVmIEVUSEVSVFlQRV9QQUUKKyNkZWZpbmUJRVRIRVJUWVBFX1BBRQkweDg4OGUJCS8qIEVBUE9MIFBBRS84MDIuMXggKi8KKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfSVAKKyNkZWZpbmUJRVRIRVJUWVBFX0lQCTB4MDgwMAkJLyogSVAgcHJvdG9jb2wgKi8KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfYnNzX2h0eworCisJYm9vbAkJCQlzdXBwb3J0X2h0OworCisJLy8gSFQgcmVsYXRlZCBlbGVtZW50cworCXU4CQkJCQlodF9jYXBfYnVmWzMyXTsKKwl1MTYJCQkJCWh0X2NhcF9sZW47CisJdTgJCQkJCWh0X2luZm9fYnVmWzMyXTsKKwl1MTYJCQkJCWh0X2luZm9fbGVuOworCisJSFRfU1BFQ19WRVIJCQlodF9zcGVjX3ZlcjsKKwkvL0hUX0NBUEFCSUxJVFlfRUxFCQkJYmRIVENhcEVsZTsKKwkvL0hUX0lORk9STUFUSU9OX0VMRQkJYmRIVEluZm9FbGU7CisKKwlib29sCQkJCWFnZ3JlZ2F0aW9uOworCWJvb2wJCQkJbG9uZ19zbG90X3RpbWU7Cit9YnNzX2h0LCAqcGJzc19odDsKKwordHlwZWRlZiBlbnVtIF9lcnBfdHsKKwlFUlBfTm9uRVJQcHJlc2VudAk9IDB4MDEsCisJRVJQX1VzZVByb3RlY3Rpb24JPSAweDAyLAorCUVSUF9CYXJrZXJQcmVhbWJsZU1vZGUgPSAweDA0LAorfSBlcnBfdDsKKworCitzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgeworCS8qIFRoZXNlIGVudHJpZXMgYXJlIHVzZWQgdG8gaWRlbnRpZnkgYSB1bmlxdWUgbmV0d29yayAqLworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKwl1OCBjaGFubmVsOworCS8qIEVuc3VyZSBudWxsLXRlcm1pbmF0ZWQgZm9yIGFueSBkZWJ1ZyBtc2dzICovCisJdTggc3NpZFtJV19FU1NJRF9NQVhfU0laRSArIDFdOworCXU4IHNzaWRfbGVuOworCXN0cnVjdCBpZWVlODAyMTFfcW9zX2RhdGEgcW9zX2RhdGE7CisKKwkvL2FkZGVkIGJ5IGFteSBmb3IgTEVBUAorCWJvb2wJYldpdGhBaXJvbmV0SUU7CisJYm9vbAliQ2tpcFN1cHBvcnRlZDsKKwlib29sCWJDY3hSbUVuYWJsZTsKKwl1MTYgCUNjeFJtU3RhdGVbMl07CisJLy8gQ0NYdjQgUzU5LCBNQlNTSUQuCisJYm9vbAliTUJzc2lkVmFsaWQ7CisJdTgJTUJzc2lkTWFzazsKKwl1OAlNQnNzaWRbNl07CisJLy8gQ0NYIDIgUzM4LCBXTEFOIERldmljZSBWZXJzaW9uIE51bWJlciBlbGVtZW50LiBBbm5pZSwgMjAwNi0wOC0yMC4KKwlib29sCWJXaXRoQ2N4VmVyTnVtOworCXU4CUJzc0NjeFZlck51bWJlcjsKKwkvKiBUaGVzZSBhcmUgbmV0d29yayBzdGF0aXN0aWNzICovCisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyBzdGF0czsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1OCAgcmF0ZXNbTUFYX1JBVEVTX0xFTkdUSF07CisJdTggIHJhdGVzX2xlbjsKKwl1OCAgcmF0ZXNfZXhbTUFYX1JBVEVTX0VYX0xFTkdUSF07CisJdTggIHJhdGVzX2V4X2xlbjsKKwl1bnNpZ25lZCBsb25nIGxhc3Rfc2Nhbm5lZDsKKwl1OCAgbW9kZTsKKwl1MzIgZmxhZ3M7CisJdTMyIGxhc3RfYXNzb2NpYXRlOworCXUzMiB0aW1lX3N0YW1wWzJdOworCXUxNiBiZWFjb25faW50ZXJ2YWw7CisJdTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwl1MTYgYXRpbV93aW5kb3c7CisJdTggIGVycF92YWx1ZTsKKwl1OCAgd3BhX2llW01BWF9XUEFfSUVfTEVOXTsKKwlzaXplX3Qgd3BhX2llX2xlbjsKKwl1OCAgcnNuX2llW01BWF9XUEFfSUVfTEVOXTsKKwlzaXplX3QgcnNuX2llX2xlbjsKKworCXN0cnVjdCBpZWVlODAyMTFfdGltX3BhcmFtZXRlcnMgdGltOworCXU4ICBkdGltX3BlcmlvZDsKKwl1OCAgZHRpbV9kYXRhOworCXUzMiBsYXN0X2R0aW1fc3RhX3RpbWVbMl07CisKKwkvL2FwcGVkZWQgZm9yIFFvUworCXU4IHdtbV9pbmZvOworCXN0cnVjdCBpZWVlODAyMTFfd21tX2FjX3BhcmFtIHdtbV9wYXJhbVs0XTsKKwl1OCBRb1NfRW5hYmxlOworI2lmZGVmIFRIT01BU19UVVJCTworCXU4IFR1cmJvX0VuYWJsZTsvL2VuYWJsZSB0dXJibyBtb2RlLCBhZGRlZCBieSB0aG9tYXMKKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl1MTYgQ291bnRyeUllTGVuOworCXU4IENvdW50cnlJZUJ1ZltNQVhfSUVfTEVOXTsKKyNlbmRpZgorCS8vIEhUIFJlbGF0ZWQsIGJ5IGFteSwgMjAwOC4wNC4yOQorCUJTU19IVAlic3NodDsKKwkvLyBBZGQgdG8gaGFuZGxlIGJyb2FkY29tIEFQIG1hbmFnZW1lbnQgZnJhbWUgQ0NLIHJhdGUuCisJYm9vbCBicm9hZGNvbV9jYXBfZXhpc3Q7CisJYm9vbCByYWxpbmtfY2FwX2V4aXN0OworCWJvb2wgYXRoZXJvc19jYXBfZXhpc3Q7CisJYm9vbCBjaXNjb19jYXBfZXhpc3Q7CisJYm9vbCB1bmtub3duX2NhcF9leGlzdDsKKy8vCXU4CWJlcnBfaW5mbzsKKwlib29sCWJlcnBfaW5mb192YWxpZDsKKwlib29sIGJ1c2Vwcm90ZWN0aW9uOworCS8vcHV0IGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZS4KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitlbnVtIGllZWU4MDIxMV9zdGF0ZSB7CisKKwkvKiB0aGUgY2FyZCBpcyBub3QgbGlua2VkIGF0IGFsbCAqLworCUlFRUU4MDIxMV9OT0xJTksgPSAwLAorCisJLyogSUVFRTgwMjExX0FTU09DSUFUSU5HKiBhcmUgZm9yIEJTUyBjbGllbnQgbW9kZQorCSAqIHRoZSBkcml2ZXIgc2hhbGwgbm90IHBlcmZvcm0gUlggZmlsdGVyaW5nIHVubGVzcworCSAqIHRoZSBzdGF0ZSBpcyBMSU5LRUQuCisJICogVGhlIGRyaXZlciBzaGFsbCBqdXN0IGNoZWNrIGZvciB0aGUgc3RhdGUgTElOS0VEIGFuZAorCSAqIGRlZmF1bHRzIHRvIE5PTElOSyBmb3IgQUxMIHRoZSBvdGhlciBzdGF0ZXMgKGluY2x1ZGluZworCSAqIExJTktFRF9TQ0FOTklORykKKwkgKi8KKworCS8qIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgd2lsbCBzdGFydCAod3Egc2NoZWR1bGluZykqLworCUlFRUU4MDIxMV9BU1NPQ0lBVElORywKKwlJRUVFODAyMTFfQVNTT0NJQVRJTkdfUkVUUlksCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGlzIHNlbmRpbmcgQVVUSCByZXF1ZXN0Ki8KKwlJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcsCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGhhcyBzdWNjZXNzZnVsbHkgYXV0aGVudGNhdGVkCisJICogYW5kIGlzIHNlbmRpbmcgYXNzb2NpYXRpb24gcmVxdWVzdAorCSAqLworCUlFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVELAorCisJLyogdGhlIGxpbmsgaXMgb2suIHRoZSBjYXJkIGFzc29jaWF0ZWQgdG8gYSBCU1Mgb3IgbGlua2VkCisJICogdG8gYSBpYnNzIGNlbGwgb3IgYWN0aW5nIGFzIGFuIEFQIGFuZCBjcmVhdGluZyB0aGUgYnNzCisJICovCisJSUVFRTgwMjExX0xJTktFRCwKKworCS8qIHNhbWUgYXMgTElOS0VELCBidXQgdGhlIGRyaXZlciBzaGFsbCBhcHBseSBSWCBmaWx0ZXIKKwkgKiBydWxlcyBhcyB3ZSBhcmUgaW4gTk9fTElOSyBtb2RlLiBBcyB0aGUgY2FyZCBpcyBzdGlsbAorCSAqIGxvZ2ljYWxseSBsaW5rZWQsIGJ1dCBpdCBpcyBkb2luZyBhIHN5bmNybyBzaXRlIHN1cnZleQorCSAqIHRoZW4gaXQgd2lsbCBiZSBiYWNrIHRvIExJTktFRCBzdGF0ZS4KKwkgKi8KKwlJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HLAorCit9OworCisjZGVmaW5lIERFRkFVTFRfTUFYX1NDQU5fQUdFICgxNSAqIEhaKQorI2RlZmluZSBERUZBVUxUX0ZUUyAyMzQ2CisKKyNkZWZpbmUgQ0ZHX0lFRUU4MDIxMV9SRVNFUlZFX0ZDUyAoMTw8MCkKKyNkZWZpbmUgQ0ZHX0lFRUU4MDIxMV9DT01QVVRFX0ZDUyAoMTw8MSkKKyNkZWZpbmUgQ0ZHX0lFRUU4MDIxMV9SVFMgKDE8PDIpCisKKyNkZWZpbmUgSUVFRTgwMjExXzI0R0haX01JTl9DSEFOTkVMIDEKKyNkZWZpbmUgSUVFRTgwMjExXzI0R0haX01BWF9DSEFOTkVMIDE0CisjZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9DSEFOTkVMUyAoSUVFRTgwMjExXzI0R0haX01BWF9DSEFOTkVMIC0gXAorCQkJCSAgSUVFRTgwMjExXzI0R0haX01JTl9DSEFOTkVMICsgMSkKKworI2RlZmluZSBJRUVFODAyMTFfNTJHSFpfTUlOX0NIQU5ORUwgMzQKKyNkZWZpbmUgSUVFRTgwMjExXzUyR0haX01BWF9DSEFOTkVMIDE2NQorI2RlZmluZSBJRUVFODAyMTFfNTJHSFpfQ0hBTk5FTFMgKElFRUU4MDIxMV81MkdIWl9NQVhfQ0hBTk5FTCAtIFwKKwkJCQkgIElFRUU4MDIxMV81MkdIWl9NSU5fQ0hBTk5FTCArIDEpCisKKworCit0eXBlZGVmIHN0cnVjdCB0eF9wZW5kaW5nX3R7CisJaW50IGZyYWc7CisJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YjsKK310eF9wZW5kaW5nX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9iYW5kd2lkdGhfYXV0b3N3aXRjaAoreworCWxvbmcgdGhyZXNob2xkXzIwTWh6dG80ME1oejsKKwlsb25nCXRocmVzaG9sZF80ME1oenRvMjBNaHo7CisJYm9vbCBiZm9yY2VkX3R4MjBNaHo7CisJYm9vbCBiYXV0b3N3aXRjaF9lbmFibGU7Cit9YmFuZHdpZHRoX2F1dG9zd2l0Y2gsKnBiYW5kd2lkdGhfYXV0b3N3aXRjaDsKKworCisvL2FkZGVkIGJ5IGFteSBmb3Igb3JkZXIKKworI2RlZmluZSBSRU9SREVSX1dJTl9TSVpFCTEyOAorI2RlZmluZSBSRU9SREVSX0VOVFJZX05VTQkxMjgKK3R5cGVkZWYgc3RydWN0IF9SWF9SRU9SREVSX0VOVFJZCit7CisJc3RydWN0IGxpc3RfaGVhZAlMaXN0OworCXUxNgkJCVNlcU51bTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4YiogcHJ4YjsKK30gUlhfUkVPUkRFUl9FTlRSWSwgKlBSWF9SRU9SREVSX0VOVFJZOworLy9hZGRlZCBieSBhbXkgZm9yIG9yZGVyCit0eXBlZGVmIGVudW0gX0ZzeW5jX1N0YXRleworCURlZmF1bHRfRnN5bmMsCisJSFdfRnN5bmMsCisJU1dfRnN5bmMKK31Gc3luY19TdGF0ZTsKKworLy8gUG93ZXIgc2F2ZSBtb2RlIGNvbmZpZ3VyZWQuCit0eXBlZGVmCWVudW0gX1JUX1BTX01PREUKK3sKKwllQWN0aXZlLAkvLyBBY3RpdmUvQ29udGludW91cyBhY2Nlc3MuCisJZU1heFBzLAkJLy8gTWF4IHBvd2VyIHNhdmUgbW9kZS4KKwllRmFzdFBzCQkvLyBGYXN0IHBvd2VyIHNhdmUgbW9kZS4KK31SVF9QU19NT0RFOworCit0eXBlZGVmIGVudW0gX0lQU19DQUxMQkFDS19GVU5DSU9OCit7CisJSVBTX0NBTExCQUNLX05PTkUgPSAwLAorCUlQU19DQUxMQkFDS19NR05UX0xJTktfUkVRVUVTVCA9IDEsCisJSVBTX0NBTExCQUNLX0pPSU5fUkVRVUVTVCA9IDIsCit9SVBTX0NBTExCQUNLX0ZVTkNJT047CisKK3R5cGVkZWYgZW51bSBfUlRfSk9JTl9BQ1RJT057CisJUlRfSk9JTl9JTkZSQSAgID0gMSwKKwlSVF9KT0lOX0lCU1MgID0gMiwKKwlSVF9TVEFSVF9JQlNTID0gMywKKwlSVF9OT19BQ1RJT04gID0gNCwKK31SVF9KT0lOX0FDVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgX0lic3NQYXJtc3sKKwl1MTYgICBhdGltV2luOworfUlic3NQYXJtcywgKlBJYnNzUGFybXM7CisjZGVmaW5lIE1BWF9OVU1fUkFURVMJMjY0IC8vIE1heCBudW0gb2Ygc3VwcG9ydCByYXRlcyBlbGVtZW50OiA4LCAgTWF4IG51bSBvZiBleHQuIHN1cHBvcnQgcmF0ZTogMjU1LiAwNjExMjIsIGJ5IHJjbmprby4KKworLy8gUkYgc3RhdGUuCit0eXBlZGVmCWVudW0gX1JUX1JGX1BPV0VSX1NUQVRFCit7CisJZVJmT24sCisJZVJmU2xlZXAsCisJZVJmT2ZmCit9UlRfUkZfUE9XRVJfU1RBVEU7CisKK3R5cGVkZWYgc3RydWN0IF9SVF9QT1dFUl9TQVZFX0NPTlRST0wKK3sKKworCS8vCisJLy8gSW5hY3RpdmUgUG93ZXIgU2F2ZShJUFMpIDogRGlzYWJsZSBSRiB3aGVuIGRpc2Nvbm5lY3RlZAorCS8vCisJYm9vbAkJCQliSW5hY3RpdmVQczsKKwlib29sCQkJCWJJUFNNb2RlQmFja3VwOworCWJvb2wJCQkJYlN3UmZQcm9jZXNzaW5nOworCVJUX1JGX1BPV0VSX1NUQVRFCWVJbmFjdGl2ZVBvd2VyU3RhdGU7CisJc3RydWN0IHdvcmtfc3RydWN0IAlJbmFjdGl2ZVBzV29ya0l0ZW07CisJc3RydWN0IHRpbWVyX2xpc3QJSW5hY3RpdmVQc1RpbWVyOworCisJLy8gUmV0dXJuIHBvaW50IGZvciBqb2luIGFjdGlvbgorCUlQU19DQUxMQkFDS19GVU5DSU9OCVJldHVyblBvaW50OworCisJLy8gUmVjb3JlZCBQYXJhbWV0ZXJzIGZvciByZXNjaGVkdWxlZCBKb2luUmVxdWVzdAorCWJvb2wJCQkJYlRtcEJzc0Rlc2M7CisJUlRfSk9JTl9BQ1RJT04JCXRtcEpvaW5BY3Rpb247CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIHRtcEJzc0Rlc2M7CisKKwkvLyBSZWNvcmVkIFBhcmFtZXRlcnMgZm9yIHJlc2NoZWR1bGVkIE1nbnRMaW5rUmVxdWVzdAorCWJvb2wJCQkJYlRtcFNjYW5Pbmx5OworCWJvb2wJCQkJYlRtcEFjdGl2ZVNjYW47CisJYm9vbAkJCQliVG1wRmlsdGVySGlkZGVuQVA7CisJYm9vbAkJCQliVG1wVXBkYXRlUGFybXM7CisJdTgJCQkJCXRtcFNzaWRCdWZbMzNdOworCU9DVEVUX1NUUklORwkJCXRtcFNzaWQyU2NhbjsKKwlib29sCQkJCWJUbXBTc2lkMlNjYW47CisJdTgJCQkJCXRtcE5ldHdvcmtUeXBlOworCXU4CQkJCQl0bXBDaGFubmVsTnVtYmVyOworCXUxNgkJCQkJdG1wQmNuUGVyaW9kOworCXU4CQkJCQl0bXBEdGltUGVyaW9kOworCXUxNgkJCQkJdG1wbUNhcDsKKwlPQ1RFVF9TVFJJTkcJCQl0bXBTdXBwUmF0ZVNldDsKKwl1OAkJCQkJdG1wU3VwcFJhdGVCdWZbTUFYX05VTV9SQVRFU107CisJYm9vbAkJCQliVG1wU3VwcFJhdGU7CisJSWJzc1Bhcm1zCQkJCXRtcElicG07CisJYm9vbAkJCQliVG1wSWJwbTsKKworCS8vCisJLy8gTGVpc3JlIFBvc3dlciBTYXZlIDogRGlzYWJsZSBSRiBpZiBjb25uZWN0ZWQgYnV0IHRyYWZmaWMgaXMgbm90IGJ1c3kKKwkvLworCWJvb2wJCQkJYkxlaXN1cmVQczsKKworfVJUX1BPV0VSX1NBVkVfQ09OVFJPTCwqUFJUX1BPV0VSX1NBVkVfQ09OVFJPTDsKKwordHlwZWRlZiB1MzIgUlRfUkZfQ0hBTkdFX1NPVVJDRTsKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX1NXIEJJVDMxCisjZGVmaW5lIFJGX0NIQU5HRV9CWV9IVyBCSVQzMAorI2RlZmluZSBSRl9DSEFOR0VfQllfUFMgQklUMjkKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX0lQUyBCSVQyOAorI2RlZmluZSBSRl9DSEFOR0VfQllfSU5JVAkwCS8vIERvIG5vdCBjaGFuZ2UgdGhlIFJGT2ZmIHJlYXNvbi4gRGVmaW5lZCBieSBCcnVjZSwgMjAwOC0wMS0xNy4KKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKK3R5cGVkZWYgZW51bQoreworCUNPVU5UUllfQ09ERV9GQ0MgPSAwLAorCUNPVU5UUllfQ09ERV9JQyA9IDEsCisJQ09VTlRSWV9DT0RFX0VUU0kgPSAyLAorCUNPVU5UUllfQ09ERV9TUEFJTiA9IDMsCisJQ09VTlRSWV9DT0RFX0ZSQU5DRSA9IDQsCisJQ09VTlRSWV9DT0RFX01LSyA9IDUsCisJQ09VTlRSWV9DT0RFX01LSzEgPSA2LAorCUNPVU5UUllfQ09ERV9JU1JBRUwgPSA3LAorCUNPVU5UUllfQ09ERV9URUxFQywKKwlDT1VOVFJZX0NPREVfTUlDLAorCUNPVU5UUllfQ09ERV9HTE9CQUxfRE9NQUlOCit9Y291bnRyeV9jb2RlX3R5cGVfdDsKKyNlbmRpZgorCisjZGVmaW5lIFJUX01BWF9MRF9TTE9UX05VTQkxMAordHlwZWRlZiBzdHJ1Y3QgX1JUX0xJTktfREVURUNUX1R7CisKKwl1MzIJCQkJTnVtUmVjdkJjbkluUGVyaW9kOworCXUzMgkJCQlOdW1SZWN2RGF0YUluUGVyaW9kOworCisJdTMyCQkJCVJ4QmNuTnVtW1JUX01BWF9MRF9TTE9UX05VTV07CS8vIG51bWJlciBvZiBSeCBiZWFjb24gLyBDaGVja0ZvckhhbmdfcGVyaW9kICB0byBkZXRlcm1pbmUgbGluayBzdGF0dXMKKwl1MzIJCQkJUnhEYXRhTnVtW1JUX01BWF9MRF9TTE9UX05VTV07CS8vIG51bWJlciBvZiBSeCBkYXRhIC8gQ2hlY2tGb3JIYW5nX3BlcmlvZCAgdG8gZGV0ZXJtaW5lIGxpbmsgc3RhdHVzCisJdTE2CQkJCVNsb3ROdW07CS8vIG51bWJlciBvZiBDaGVja0ZvckhhbmcgcGVyaW9kIHRvIGRldGVybWluZSBsaW5rIHN0YXR1cworCXUxNgkJCQlTbG90SW5kZXg7CisKKwl1MzIJCQkJTnVtVHhPa0luUGVyaW9kOworCXUzMgkJCQlOdW1SeE9rSW5QZXJpb2Q7CisJYm9vbAkJCQliQnVzeVRyYWZmaWM7Cit9UlRfTElOS19ERVRFQ1RfVCwgKlBSVF9MSU5LX0RFVEVDVF9UOworCisKK3N0cnVjdCBpZWVlODAyMTFfZGV2aWNlIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjOworCisJLy9odyBzZWN1cml0eSByZWxhdGVkCisvLwl1OCBod3NlY19zdXBwb3J0OyAvL3N1cHBvcnQ/CisJdTggaHdzZWNfYWN0aXZlOyAgLy9odyBzZWN1cml0eSBhY3RpdmUuCisJYm9vbCBpc19zaWxlbnRfcmVzZXQ7CisJYm9vbCBpZWVlX3VwOworCS8vYWRkZWQgYnkgYW15CisJYm9vbCBiU3VwcG9ydFJlbW90ZVdha2VVcDsKKwlSVF9QU19NT0RFCWRvdDExUG93ZXJTYXZlTW9kZTsgLy8gUG93ZXIgc2F2ZSBtb2RlIGNvbmZpZ3VyZWQuCisJYm9vbCBhY3RzY2FubmluZzsKKwlib29sIGJlaW5yZXRyeTsKKwlSVF9SRl9QT1dFUl9TVEFURQkJZVJGUG93ZXJTdGF0ZTsKKwlSVF9SRl9DSEFOR0VfU09VUkNFCVJmT2ZmUmVhc29uOworCWJvb2wgaXNfc2V0X2tleTsKKwkvLzExbiBzcGVjIHJlbGF0ZWQgSSB3b25kZXIgaWYgVGhlc2UgaW5mbyBzdHJ1Y3R1cmUgbmVlZCB0byBiZSBtb3ZlZCBvdXQgb2YgaWVlZTgwMjExX2RldmljZQorCisJLy8xMW4gSFQgYmVsb3cKKwlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm87CisJLy9zdHJ1Y3QgdGltZXJfbGlzdAkJU3dCd1RpbWVyOworLy8Jc3BpbmxvY2tfdCBjaG5sb3Bfc3BpbmxvY2s7CisJc3BpbmxvY2tfdCBid19zcGlubG9jazsKKworCXNwaW5sb2NrX3QgcmVvcmRlcl9zcGlubG9jazsKKwkvLyBmb3IgSFQgb3BlcmF0aW9uIHJhdGUgc2V0LiAgd2UgdXNlIHRoaXMgb25lIGZvciBIVCBkYXRhIHJhdGUgdG8gc2VwZXJhdGUgZGlmZmVyZW50IGRlc2NyaXB0b3JzCisJLy90aGUgd2F5IGZpbGwgdGhpcyBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgSUUKKwl1OAlSZWdkb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0WzE2XTsJCS8vdXNlIFJBVFIgZm9ybWF0CisJdTgJZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldFsxNl07CQkvL3VzZSBSQVRSIGZvcm1hdAorCXU4CVJlZ0hUU3VwcFJhdGVTZXRbMTZdOworCXU4CQkJCUhUQ3VycmVudE9wZXJhUmF0ZTsKKwl1OAkJCQlIVEhpZ2hlc3RPcGVyYVJhdGU7CisJLy93YiBhZGRlZCBmb3IgcmF0ZSBvcGVyYXRpb24gbW9kZSB0byBmaXJtd2FyZQorCXU4CWJUeERpc2FibGVSYXRlRmFsbEJhY2s7CisJdTggCWJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZTsKKwlhdG9taWNfdAlhdG1fY2hubG9wOworCWF0b21pY190CWF0bV9zd2J3OworLy8JdTgJSFRIaWdoZXN0T3BlcmFSYXRlOworLy8JdTggCUhUQ3VycmVudE9wZXJhUmF0ZTsKKworCS8vIDgwMi4xMWUgYW5kIFdNTSBUcmFmZmljIFN0cmVhbSBJbmZvIChUWCkKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlUeF9UU19BZG1pdF9MaXN0OworCXN0cnVjdCBsaXN0X2hlYWQJCVR4X1RTX1BlbmRpbmdfTGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlUeF9UU19VbnVzZWRfTGlzdDsKKwlUWF9UU19SRUNPUkQJCVR4VHNSZWNvcmRbVE9UQUxfVFNfTlVNXTsKKwkvLyA4MDIuMTFlIGFuZCBXTU0gVHJhZmZpYyBTdHJlYW0gSW5mbyAoUlgpCisJc3RydWN0IGxpc3RfaGVhZAkJUnhfVFNfQWRtaXRfTGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlSeF9UU19QZW5kaW5nX0xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAkJUnhfVFNfVW51c2VkX0xpc3Q7CisJUlhfVFNfUkVDT1JECQlSeFRzUmVjb3JkW1RPVEFMX1RTX05VTV07CisvLyNpZmRlZiBUT19ET19MSVNUCisJUlhfUkVPUkRFUl9FTlRSWQlSeFJlb3JkZXJFbnRyeVsxMjhdOworCXN0cnVjdCBsaXN0X2hlYWQJCVJ4UmVvcmRlcl9VbnVzZWRfTGlzdDsKKy8vI2VuZGlmCisJLy8gUW9zIHJlbGF0ZWQuIEFkZGVkIGJ5IEFubmllLCAyMDA1LTExLTAxLgorLy8JUFNUQV9RT1MJCQlwU3RhUW9zOworCXU4CQkJCUZvcmNlZFByaW9yaXR5OwkJLy8gRm9yY2UgcGVyLXBhY2tldCBwcmlvcml0eSAxfjcuIChkZWZhdWx0OiAwLCBub3QgdG8gZm9yY2UgaXQuKQorCisKKwkvKiBCb29ra2VlcGluZyBzdHJ1Y3R1cmVzICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IGllZWU4MDIxMV9zdGF0cyBpZWVlX3N0YXRzOworCXN0cnVjdCBpZWVlODAyMTFfc29mdG1hY19zdGF0cyBzb2Z0bWFjX3N0YXRzOworCisJLyogUHJvYmUgLyBCZWFjb24gbWFuYWdlbWVudCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbmV0d29ya19mcmVlX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBuZXR3b3JrX2xpc3Q7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrczsKKwlpbnQgc2NhbnM7CisJaW50IHNjYW5fYWdlOworCisJaW50IGl3X21vZGU7IC8qIG9wZXJhdGluZyBtb2RlIChJV19NT0RFXyopICovCisJc3RydWN0IGl3X3NweV9kYXRhIHNweV9kYXRhOworCisJc3BpbmxvY2tfdCBsb2NrOworCXNwaW5sb2NrX3Qgd3BheF9zdWl0bGlzdF9sb2NrOworCisJaW50IHR4X2hlYWRyb29tOyAvKiBTZXQgdG8gc2l6ZSBvZiBhbnkgYWRkaXRpb25hbCByb29tIG5lZWRlZCBhdCBmcm9udAorCQkJICAqIG9mIGFsbG9jYXRlZCBUeCBTS0JzICovCisJdTMyIGNvbmZpZzsKKworCS8qIFdFUCBhbmQgb3RoZXIgZW5jcnlwdGlvbiByZWxhdGVkIHNldHRpbmdzIGF0IHRoZSBkZXZpY2UgbGV2ZWwgKi8KKwlpbnQgb3Blbl93ZXA7IC8qIFNldCB0byAxIHRvIGFsbG93IHVuZW5jcnlwdGVkIGZyYW1lcyAqLworCWludCBhdXRoX21vZGU7CisJaW50IHJlc2V0X29uX2tleWNoYW5nZTsgLyogU2V0IHRvIDEgaWYgdGhlIEhXIG5lZWRzIHRvIGJlIHJlc2V0IG9uCisJCQkJICogV0VQIGtleSBjaGFuZ2VzICovCisKKwkvKiBJZiB0aGUgaG9zdCBwZXJmb3JtcyB7ZW4sZGV9Y3J5cHRpb24sIHRoZW4gc2V0IHRvIDEgKi8KKwlpbnQgaG9zdF9lbmNyeXB0OworCWludCBob3N0X2VuY3J5cHRfbXNkdTsKKwlpbnQgaG9zdF9kZWNyeXB0OworCS8qIGhvc3QgcGVyZm9ybXMgbXVsdGljYXN0IGRlY3J5cHRpb24gKi8KKwlpbnQgaG9zdF9tY19kZWNyeXB0OworCisJLyogaG9zdCBzaG91bGQgc3RyaXAgSVYgYW5kIElDViBmcm9tIHByb3RlY3RlZCBmcmFtZXMgKi8KKwkvKiBtZWFuaW5nZnVsIG9ubHkgd2hlbiBoYXJkd2FyZSBkZWNyeXB0aW9uIGlzIGJlaW5nIHVzZWQgKi8KKwlpbnQgaG9zdF9zdHJpcF9pdl9pY3Y7CisKKwlpbnQgaG9zdF9vcGVuX2ZyYWc7CisJaW50IGhvc3RfYnVpbGRfaXY7CisJaW50IGllZWU4MDJfMXg7IC8qIGlzIElFRUUgODAyLjFYIHVzZWQgKi8KKworCS8qIFdQQSBkYXRhICovCisJYm9vbCBiSGFsZldpcmVsZXNzTjI0R01vZGU7CisJaW50IHdwYV9lbmFibGVkOworCWludCBkcm9wX3VuZW5jcnlwdGVkOworCWludCB0a2lwX2NvdW50ZXJtZWFzdXJlczsKKwlpbnQgcHJpdmFjeV9pbnZva2VkOworCXNpemVfdCB3cGFfaWVfbGVuOworCXU4ICp3cGFfaWU7CisJdTggYXBfbWFjX2FkZHJbNl07CisJdTE2IHBhaXJ3aXNlX2tleV90eXBlOworCXUxNiBncm91cF9rZXlfdHlwZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNyeXB0X2RlaW5pdF9saXN0OworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHRbV0VQX0tFWVNdOworCWludCB0eF9rZXlpZHg7IC8qIGRlZmF1bHQgVFgga2V5IGluZGV4IChjcnlwdFt0eF9rZXlpZHhdKSAqLworCXN0cnVjdCB0aW1lcl9saXN0IGNyeXB0X2RlaW5pdF90aW1lcjsKKwlpbnQgY3J5cHRfcXVpZXNjZWQ7CisKKwlpbnQgYmNyeF9zdGFfa2V5OyAvKiB1c2UgaW5kaXZpZHVhbCBrZXlzIHRvIG92ZXJyaWRlIGRlZmF1bHQga2V5cyBldmVuCisJCQkgICAqIHdpdGggUlggb2YgYnJvYWQvbXVsdGljYXN0IGZyYW1lcyAqLworCisJLyogRnJhZ21lbnRhdGlvbiBzdHJ1Y3R1cmVzICovCisJLy8gZWFjaCBzdHJlYW1pbmcgY29udGFpbiBhIGVudHJ5CisJc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5IGZyYWdfY2FjaGVbMTddW0lFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTl07CisJdW5zaWduZWQgaW50IGZyYWdfbmV4dF9pZHhbMTddOworCXUxNiBmdHM7IC8qIEZyYWdtZW50YXRpb24gVGhyZXNob2xkICovCisjZGVmaW5lIERFRkFVTFRfUlRTX1RIUkVTSE9MRCAyMzQ2VQorI2RlZmluZSBNSU5fUlRTX1RIUkVTSE9MRCAxCisjZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xEIDIzNDZVCisJdTE2IHJ0czsgLyogUlRTIHRocmVzaG9sZCAqLworCisJLyogQXNzb2NpYXRpb24gaW5mbyAqLworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKworCS8qIFRoaXMgc3RvcmVzIGluZm9zIGZvciB0aGUgY3VycmVudCBuZXR3b3JrLgorCSAqIEVpdGhlciB0aGUgbmV0d29yayB3ZSBhcmUgYXNzb2NpYXRlZCBpbiBJTkZSQVNUUlVDVFVSRQorCSAqIG9yIHRoZSBuZXR3b3JrIHRoYXQgd2UgYXJlIGNyZWF0aW5nIGluIE1BU1RFUiBtb2RlLgorCSAqIGFkLWhvYyBpcyBhIG1peHR1cmUgOy0pLgorCSAqIE5vdGUgdGhhdCBpbiBpbmZyYXN0cnVjdHVyZSBtb2RlLCBldmVuIHdoZW4gbm90IGFzc29jaWF0ZWQsCisJICogZmllbGRzIGJzc2lkIGFuZCBlc3NpZCBtYXkgYmUgdmFsaWQgKGlmIHdwYV9zZXQgYW5kIGVzc2lkX3NldAorCSAqIGFyZSB0cnVlKSBhcyB0aHkgY2FycnkgdGhlIHZhbHVlIHNldCBieSB0aGUgdXNlciB2aWEgaXdjb25maWcKKwkgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgY3VycmVudF9uZXR3b3JrOworCisJZW51bSBpZWVlODAyMTFfc3RhdGUgc3RhdGU7CisKKwlpbnQgc2hvcnRfc2xvdDsKKwlpbnQgcmVnX21vZGU7CisJaW50IG1vZGU7ICAgICAgIC8qIEEsIEIsIEcgKi8KKwlpbnQgbW9kdWxhdGlvbjsgLyogQ0NLLCBPRkRNICovCisJaW50IGZyZXFfYmFuZDsgIC8qIDIuNEdoeiwgNS4yR2h6LCBNaXhlZCAqLworCWludCBhYmdfdHJ1ZTsgICAvKiBBQkcgZmxhZyAgICAgICAgICAgICAgKi8KKworCS8qIHVzZWQgZm9yIGZvcmNpbmcgdGhlIGlic3Mgd29ya3F1ZXVlIHRvIHRlcm1pbmF0ZQorCSAqIHdpdGhvdXQgd2FpdCBmb3IgdGhlIHN5bmNybyBzY2FuIHRvIHRlcm1pbmF0ZQorCSAqLworCXNob3J0IHN5bmNfc2Nhbl9odXJyeXVwOworCisJaW50IHBlcmZlY3RfcnNzaTsKKwlpbnQgd29yc3RfcnNzaTsKKworCXUxNiBwcmV2X3NlcV9jdGw7ICAgICAgIC8qIHVzZWQgdG8gZHJvcCBkdXBsaWNhdGUgZnJhbWVzICovCisKKwkvKiBtYXAgb2YgYWxsb3dlZCBjaGFubmVscy4gMCBpcyBkdW1teSAqLworCS8vIEZJWE1FOiByZW1lYmVyIHRvIGRlZmF1bHQgdG8gYSBiYXNpYyBjaGFubmVsIHBsYW4gZGVwZW5kaW5nIG9mIHRoZSBQSFkgdHlwZQorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl2b2lkKiBwRG90MTFkSW5mbzsKKwlib29sIGJHbG9iYWxEb21haW47CisjZWxzZQorCWludCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisjZW5kaWYKKwlpbnQgcmF0ZTsgICAgICAgLyogY3VycmVudCByYXRlICovCisJaW50IGJhc2ljX3JhdGU7CisJLy9GSVhNRTogcGxlYWNlIGNhbGxiYWNrLCBzZWUgaWYgcmVkdW5kYW50IHdpdGggc29mdG1hY19mZWF0dXJlcworCXNob3J0IGFjdGl2ZV9zY2FuOworCisJLyogdGhpcyBjb250YWlucyBmbGFncyBmb3Igc2VsZWN0aXZlbHkgZW5hYmxlIHNvZnRtYWMgc3VwcG9ydCAqLworCXUxNiBzb2Z0bWFjX2ZlYXR1cmVzOworCisJLyogaWYgdGhlIHNlcXVlbmNlIGNvbnRyb2wgZmllbGQgaXMgbm90IGZpbGxlZCBieSBIVyAqLworCXUxNiBzZXFfY3RybFs1XTsKKworCS8qIGFzc29jaWF0aW9uIHByb2NlZHVyZSB0cmFuc2FjdGlvbiBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1MTYgYXNzb2NpYXRlX3NlcTsKKworCS8qIEFJRCBmb3IgUlRYZWQgYXNzb2NpYXRpb24gcmVzcG9uc2VzICovCisJdTE2IGFzc29jX2lkOworCisJLyogcG93ZXIgc2F2ZSBtb2RlIHJlbGF0ZWQqLworCXNob3J0IHBzOworCXNob3J0IHN0YV9zbGVlcDsKKwlpbnQgcHNfdGltZW91dDsKKwlpbnQgcHNfcGVyaW9kOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBwc190YXNrOworCXUzMiBwc190aDsKKwl1MzIgcHNfdGw7CisKKwlzaG9ydCByYXdfdHg7CisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgaXMgc2V0ICovCisJc2hvcnQgcXVldWVfc3RvcDsKKwlzaG9ydCBzY2FubmluZzsKKwlzaG9ydCBwcm90b19zdGFydGVkOworCisJc3RydWN0IHNlbWFwaG9yZSB3eF9zZW07CisJc3RydWN0IHNlbWFwaG9yZSBzY2FuX3NlbTsKKworCXNwaW5sb2NrX3QgbWdtdF90eF9sb2NrOworCXNwaW5sb2NrX3QgYmVhY29uX2xvY2s7CisKKwlzaG9ydCBiZWFjb25fdHhpbmc7CisKKwlzaG9ydCB3YXBfc2V0OworCXNob3J0IHNzaWRfc2V0OworCisJdTggIHdwYXhfdHlwZV9zZXQ7ICAgIC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjh9CisJdTMyIHdwYXhfdHlwZV9ub3RpZnk7IC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjZ9CisKKwkvKiBRb1MgcmVsYXRlZCBmbGFnICovCisJY2hhciBpbml0X3dtbXBhcmFtX2ZsYWc7CisJLyogc2V0IG9uIGluaXRpYWxpemF0aW9uICovCisJdTggIHFvc19zdXBwb3J0OworCisJLyogZm9yIGRpc2NhcmRpbmcgZHVwbGljYXRlZCBwYWNrZXRzIGluIElCU1MgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGlic3NfbWFjX2hhc2hbSUVFRV9JQlNTX01BQ19IQVNIX1NJWkVdOworCisJLyogZm9yIGRpc2NhcmRpbmcgZHVwbGljYXRlZCBwYWNrZXRzIGluIEJTUyAqLworCXUxNiBsYXN0X3J4c2VxX251bVsxN107IC8qIHJ4IHNlcSBwcmV2aW91cyBwZXItdGlkICovCisJdTE2IGxhc3RfcnhmcmFnX251bVsxN107LyogdHggZnJhZyBwcmV2aW91cyBwZXItdGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3BhY2tldF90aW1lWzE3XTsKKworCS8qIGZvciBQUyBtb2RlICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3J4X3BzX3RpbWU7CisKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgaXMgc2V0ICovCisJc3RydWN0IHNrX2J1ZmYgKm1nbXRfcXVldWVfcmluZ1tNR01UX1FVRVVFX05VTV07CisJaW50IG1nbXRfcXVldWVfaGVhZDsKKwlpbnQgbWdtdF9xdWV1ZV90YWlsOworLy97IGFkZGVkIGZvciBydGw4MTl4CisjZGVmaW5lIElFRUU4MDIxMV9RVUVVRV9MSU1JVCAxMjgKKwl1OCBBc29jUmV0cnlDb3VudDsKKwl1bnNpZ25lZCBpbnQgaHdfaGVhZGVyOworCXN0cnVjdCBza19idWZmX2hlYWQgc2tiX3dhaXRRW01BWF9RVUVVRV9TSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICBza2JfYWdnUVtNQVhfUVVFVUVfU0laRV07CisJc3RydWN0IHNrX2J1ZmZfaGVhZCAgc2tiX2Rydl9hZ2dRW01BWF9RVUVVRV9TSVpFXTsKKwl1MzIJc3RhX2VkY2FfcGFyYW1bNF07CisJYm9vbCBhZ2dyZWdhdGlvbjsKKwkvLyBFbmFibGUvRGlzYWJsZSBSeCBpbW1lZGlhdGUgQkEgY2FwYWJpbGl0eS4KKwlib29sIGVuYWJsZV9yeF9pbW1fQkE7CisJYm9vbCBiaWJzc2Nvb3JkaW5hdG9yOworCisJLy8rYnkgYW15IGZvciBETSAsMDgwNTE1CisJLy9EeW5hbWljIFR4IHBvd2VyIGZvciBuZWFyL2ZhciByYW5nZSBlbmFibGUvRGlzYWJsZSAgLCBieSBhbXkgLCAyMDA4LTA1LTE1CisJYm9vbAliZHluYW1pY190eHBvd2VyX2VuYWJsZTsKKworCWJvb2wgYkNUU1RvU2VsZkVuYWJsZTsKKwl1OCAJQ1RTVG9TZWxmVEg7CisKKwl1MzIgCWZzeW5jX3RpbWVfaW50ZXJ2YWw7CisJdTMyCWZzeW5jX3JhdGVfYml0bWFwOworCXU4CWZzeW5jX3Jzc2lfdGhyZXNob2xkOworCWJvb2wJYmZzeW5jX2VuYWJsZTsKKworCXU4CWZzeW5jX211bHRpcGxlX3RpbWVpbnRlcnZhbDsJCS8vIEZzeW5jTXVsdGlwbGVUaW1lSW50ZXJ2YWwgKiBGc3luY1RpbWVJbnRlcnZhbAorCXUzMglmc3luY19maXJzdGRpZmZfcmF0ZXRocmVzaG9sZDsJCS8vIGxvdyB0aHJlc2hvbGQKKwl1MzIJZnN5bmNfc2Vjb25kZGlmZl9yYXRldGhyZXNob2xkOwkgLy8gZGVjcmVhc2UgdGhyZXNob2xkCisJRnN5bmNfU3RhdGUJCQlmc3luY19zdGF0ZTsKKwlib29sCQliaXNfYW55X25vbmJlcGt0czsKKwkvLzIwTWh6IDQwTWh6IEF1dG9Td2l0Y2ggVGhyZXNob2xkCisJYmFuZHdpZHRoX2F1dG9zd2l0Y2ggYmFuZHdpZHRoX2F1dG9fc3dpdGNoOworCS8vZm9yIHR4cG93ZXIgdHJhY2tpbmcKKwlib29sIEZ3UldSRjsKKworCS8vYWRkZWQgYnkgYW15IGZvciBBUCByb2FtaW5nCisJUlRfTElOS19ERVRFQ1RfVAlMaW5rRGV0ZWN0SW5mbzsKKwkvL2FkZGVkIGJ5IGFteSBmb3IgcHMKKwlSVF9QT1dFUl9TQVZFX0NPTlRST0wJUG93ZXJTYXZlQ29udHJvbDsKKy8vfQorCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFIGlzIHNldCAqLworCXN0cnVjdCAgdHhfcGVuZGluZ190IHR4X3BlbmRpbmc7CisKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUgaXMgc2V0ICovCisJc3RydWN0IHRpbWVyX2xpc3QgYXNzb2NpYXRlX3RpbWVyOworCisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfQkVBQ09OUyBpcyBzZXQgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBiZWFjb25fdGltZXI7CisJc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9jb21wbGV0ZV93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlX3Byb2NlZHVyZV93cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHNvZnRtYWNfc2Nhbl93cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGFzc29jaWF0ZV9yZXRyeV93cTsKKwkgc3RydWN0IGRlbGF5ZWRfd29yayBzdGFydF9pYnNzX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3eF9zeW5jX3NjYW5fd3E7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOworICAgICAgICAvLyBRb3MgcmVsYXRlZC4gQWRkZWQgYnkgQW5uaWUsIDIwMDUtMTEtMDEuCisgICAgICAgIC8vU1RBX1FPUyAgU3RhUW9zOworCisgICAgICAgIC8vdTMyIFNUQV9FRENBX1BBUkFNWzRdOworCS8vQ0hBTk5FTF9BQ0NFU1NfU0VUVElORyBDaGFubmVsQWNjZXNzU2V0dGluZzsKKworCisJLyogQ2FsbGJhY2sgZnVuY3Rpb25zICovCisJdm9pZCAoKnNldF9zZWN1cml0eSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSAqc2VjKTsKKworCS8qIFVzZWQgdG8gVFggZGF0YSBmcmFtZSBieSB1c2luZyB0eGIgc3RydWN0cy4KKwkgKiB0aGlzIGlzIG5vdCB1c2VkIGlmIGluIHRoZSBzb2Z0bWFjX2ZlYXR1cmVzCisJICogaXMgc2V0IHRoZSBmbGFnIElFRUVfU09GVE1BQ19UWF9RVUVVRQorCSAqLworCWludCAoKmhhcmRfc3RhcnRfeG1pdCkoc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCWludCAoKnJlc2V0X3BvcnQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworICAgICAgICBpbnQgKCppc19xdWV1ZV9mdWxsKSAoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGludCBwcmkpOworCisgICAgICAgIGludCAoKmhhbmRsZV9tYW5hZ2VtZW50KSAoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICogbmV0d29yaywgdTE2IHR5cGUpOworICAgICAgICBpbnQgKCppc19xb3NfYWN0aXZlKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKwkvKiBTb2Z0bWFjLWdlbmVyYXRlZCBmcmFtZXMgKG1hbWFnZW1lbnQpIGFyZSBUWGVkIHZpYSB0aGlzCisJICogY2FsbGJhY2sgaWYgdGhlIGZsYWcgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSBpcworCSAqIG5vdCBzZXQuIEFzIHNvbWUgY2FyZHMgbWF5IGhhdmUgZGlmZmVyZW50IEhXIHF1ZXVlcyB0aGF0CisJICogb25lIG1pZ2h0IHdhbnQgdG8gdXNlIGZvciBkYXRhIGFuZCBtYW5hZ2VtZW50IGZyYW1lcworCSAqIHRoZSBvcHRpb24gdG8gaGF2ZSB0d28gY2FsbGJhY2tzIG1pZ2h0IGJlIHVzZWZ1bC4KKwkgKiBUaGlzIGZ1Y250aW9uIGNhbid0IHNsZWVwLgorCSAqLworCWludCAoKnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogdXNlZCBpbnN0ZWFkIG9mIGhhcmRfc3RhcnRfeG1pdCAobm90IHNvZnRtYWNfaGFyZF9zdGFydF94bWl0KQorCSAqIGlmIHRoZSBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgZmVhdHVyZSBpcyB1c2VkIHRvIFRYIGRhdGEKKwkgKiBmcmFtZXMuIEkgdGhlIG9wdGlvbiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzIGFsc28gc2V0CisJICogdGhlbiBhbHNvIG1hbmFnZW1lbnQgZnJhbWVzIGFyZSBzZW50IHZpYSB0aGlzIGNhbGxiYWNrLgorCSAqIFRoaXMgZnVuY3Rpb24gY2FuJ3Qgc2xlZXAuCisJICovCisJdm9pZCAoKnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldixpbnQgcmF0ZSk7CisKKwkvKiBzdG9wcyB0aGUgSFcgcXVldWUgZm9yIERBVEEgZnJhbWVzLiBVc2VmdWwgdG8gYXZvaWQKKwkgKiB3YXN0ZSB0aW1lIHRvIFRYIGRhdGEgZnJhbWUgd2hlbiB3ZSBhcmUgcmVhc3NvY2lhdGluZworCSAqIFRoaXMgZnVuY3Rpb24gY2FuIHNsZWVwLgorCSAqLworCXZvaWQgKCpkYXRhX2hhcmRfc3RvcCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBPSyB0aGlzIGlzIGNvbXBsZW1lbnRhciB0byBkYXRhX3BvbGxfaGFyZF9zdG9wICovCisJdm9pZCAoKmRhdGFfaGFyZF9yZXN1bWUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogYXNrIHRvIHRoZSBkcml2ZXIgdG8gcmV0dW5lIHRoZSByYWRpbyAuCisJICogVGhpcyBmdW5jdGlvbiBjYW4gc2xlZXAuIHRoZSBkcml2ZXIgc2hvdWxkIGVuc3VyZQorCSAqIHRoZSByYWRpbyBoYXMgYmVlbiBzd2l0aGNlZCBiZWZvcmUgcmV0dXJuLgorCSAqLworCXZvaWQgKCpzZXRfY2hhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7CisKKwkvKiBUaGVzZSBhcmUgbm90IHVzZWQgaWYgdGhlIGllZWUgc3RhY2sgdGFrZXMgY2FyZSBvZgorCSAqIHNjYW5uaW5nIChJRUVFX1NPRlRNQUNfU0NBTiBmZWF0dXJlIHNldCkuCisJICogSW4gdGhpcyBjYXNlIG9ubHkgdGhlIHNldF9jaGFuIGlzIHVzZWQuCisJICoKKwkgKiBUaGUgc3luY3JvIHZlcnNpb24gaXMgc2ltaWxhciB0byB0aGUgc3RhcnRfc2NhbiBidXQKKwkgKiBkb2VzIG5vdCByZXR1cm4gdW50aWwgYWxsIGNoYW5uZWxzIGhhcyBiZWVuIHNjYW5uZWQuCisJICogdGhpcyBpcyBjYWxsZWQgaW4gdXNlciBjb250ZXh0IGFuZCBzaG91bGQgc2xlZXAsCisJICogaXQgaXMgY2FsbGVkIGluIGEgd29ya19xdWV1ZSB3aGVuIHN3aXRoY2luZyB0byBhZC1ob2MgbW9kZQorCSAqIG9yIGluIGJlaGFsZiBvZiBpd2xpc3Qgc2NhbiB3aGVuIHRoZSBjYXJkIGlzIGFzc29jaWF0ZWQKKwkgKiBhbmQgcm9vdCB1c2VyIGFzayBmb3IgYSBzY2FuLgorCSAqIHRoZSBmdWNudGlvbiBzdG9wX3NjYW4gc2hvdWxkIHN0b3AgYm90aCB0aGUgc3luY3JvIGFuZAorCSAqIGJhY2tncm91bmQgc2Nhbm5pbmcgYW5kIGNhbiBzbGVlcC4KKwkgKiBUaGUgZnVjbnRpb24gc3RhcnRfc2NhbiBzaG91bGQgaW5pdGlhdGUgdGhlIGJhY2tncm91bmQKKwkgKiBzY2FubmluZyBhbmQgY2FuJ3Qgc2xlZXAuCisJICovCisJdm9pZCAoKnNjYW5fc3luY3JvKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqc3RhcnRfc2Nhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnN0b3Bfc2Nhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBpbmRpY2F0ZSB0aGUgZHJpdmVyIHRoYXQgdGhlIGxpbmsgc3RhdGUgaXMgY2hhbmdlZAorCSAqIGZvciBleGFtcGxlIGl0IG1heSBpbmRpY2F0ZSB0aGUgY2FyZCBpcyBhc3NvY2lhdGVkIG5vdy4KKwkgKiBEcml2ZXIgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbiB0aGlzIHRvIGFwcGx5IFJYIGZpbHRlcgorCSAqIHJ1bGVzIG9yIHNpbXBseSBsaWdodCB0aGUgTElOSyBsZWQKKwkgKi8KKwl2b2lkICgqbGlua19jaGFuZ2UpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogdGhlc2UgdHdvIGZ1bmN0aW9uIGluZGljYXRlcyB0byB0aGUgSFcgd2hlbiB0byBzdGFydAorCSAqIGFuZCBzdG9wIHRvIHNlbmQgYmVhY29ucy4gVGhpcyBpcyB1c2VkIHdoZW4gdGhlCisJICogSUVFRV9TT0ZUTUFDX0JFQUNPTlMgaXMgbm90IHNldC4gRm9yIG5vdyB0aGUKKwkgKiBzdG9wX3NlbmRfYmFjb25zIGlzIE5PVCBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBvbmx5CisJICogYWZ0ZXIgc3RhcnRfc2VuZF9iZWFjb25zLgorCSAqLworCXZvaWQgKCpzdGFydF9zZW5kX2JlYWNvbnMpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHUxNiB0eF9yYXRlKTsKKwl2b2lkICgqc3RvcF9zZW5kX2JlYWNvbnMpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIHBvd2VyIHNhdmUgbW9kZSByZWxhdGVkICovCisJdm9pZCAoKnN0YV93YWtlX3VwKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnBzX3JlcXVlc3RfdHhfYWNrKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKmVudGVyX3NsZWVwX3N0YXRlKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHRoLCB1MzIgdGwpOworCXNob3J0ICgqcHNfaXNfcXVldWVfZW1wdHkpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwlpbnQgKCpoYW5kbGVfYmVhY29uKSAoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHN0cnVjdCBpZWVlODAyMTFfYmVhY29uICogYmVhY29uLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBuZXR3b3JrKTsKKwlpbnQgKCpoYW5kbGVfYXNzb2NfcmVzcG9uc2UpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqIHJlc3AsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqIG5ldHdvcmspOworCisKKwkvKiBjaGVjayB3aGV0aGVyIFR4IGh3IHJlc291Y2UgYXZhaWxhYmxlICovCisJc2hvcnQgKCpjaGVja19uaWNfZW5vdWdoX2Rlc2MpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBxdWV1ZV9pbmRleCk7CisJLy9hZGRlZCBieSB3YiBmb3IgSFQgcmVsYXRlZAorLy8Jdm9pZCAoKlN3Q2hubEJ5VGltZXJIYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY2hhbm5lbCk7CisJdm9pZCAoKlNldEJXTW9kZUhhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIEhUX0NIQU5ORUxfV0lEVEggQmFuZHdpZHRoLCBIVF9FWFRDSE5MX09GRlNFVCBPZmZzZXQpOworLy8Jdm9pZCAoKlVwZGF0ZUhhbFJBVFJUYWJsZUhhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHU4KiBwTWNzUmF0ZSk7CisJYm9vbCAoKkdldE5tb2RlU3VwcG9ydEJ5U2VjQ2ZnKShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKKwl2b2lkICgqU2V0V2lyZWxlc3NNb2RlKShzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1OCB3aXJlbGVzc19tb2RlKTsKKwlib29sICgqR2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CisJdm9pZCAoKkluaXRpYWxHYWluSGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggT3BlcmF0aW9uKTsKKworCS8qIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCBpdGVtIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBkYXRhCisJICogYWxsb2NhdGVkIGJleW9uZCB0aGlzIHN0cnVjdHVyZSBieSBhbGxvY19pZWVlODAyMTEgKi8KKwl1OCBwcml2WzBdOworfTsKKworI2RlZmluZSBJRUVFX0EgICAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRV9CICAgICAgICAgICAgKDE8PDEpCisjZGVmaW5lIElFRUVfRyAgICAgICAgICAgICgxPDwyKQorI2RlZmluZSBJRUVFX05fMjRHIAkJICAoMTw8NCkKKyNkZWZpbmUJSUVFRV9OXzVHCQkgICgxPDw1KQorI2RlZmluZSBJRUVFX01PREVfTUFTSyAgICAoSUVFRV9BfElFRUVfQnxJRUVFX0cpCisKKy8qIEdlbmVyYXRlIGEgODAyLjExIGhlYWRlciAqLworCisvKiBVc2VzIHRoZSBjaGFubmVsIGNoYW5nZSBjYWxsYmFjayBkaXJlY3RseQorICogaW5zdGVhZCBvZiBbc3RhcnQvc3RvcF0gc2NhbiBjYWxsYmFja3MKKyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfU0NBTiAoMTw8MikKKworLyogUGVyZm9ybSBhdXRoZW50aWNhdGlvbiBhbmQgYXNzb2NpYXRpb24gaGFuZHNoYWtlICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUgKDE8PDMpCisKKy8qIEdlbmVyYXRlIHByb2JlIHJlcXVlc3RzICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19QUk9CRVJRICgxPDw0KQorCisvKiBHZW5lcmF0ZSByZXNwb25lcyB0byBwcm9iZSByZXF1ZXN0cyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfUFJPQkVSUyAoMTw8NSkKKworLyogVGhlIGllZWU4MDIuMTEgc3RhY2sgd2lsbCBtYW5hZ2VzIHRoZSBuZXRpZiBxdWV1ZQorICogd2FrZS9zdG9wIGZvciB0aGUgZHJpdmVyLCB0YWtpbmcgY2FyZSBvZiA4MDIuMTEKKyAqIGZyYWdtZW50YXRpb24uIFNlZSBzb2Z0bWFjLmMgZm9yIGRldGFpbHMuICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19UWF9RVUVVRSAoMTw8NykKKworLyogVXNlcyBvbmx5IHRoZSBzb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0CisgKiBldmVuIGZvciBUWCBtYW5hZ2VtZW50IGZyYW1lcy4KKyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFICgxPDw4KQorCisvKiBHZW5lcmF0ZSBiZWFjb25zLiAgVGhlIHN0YWNrIHdpbGwgZW5xdWV1ZSBiZWFjb25zCisgKiB0byB0aGUgY2FyZAorICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19CRUFDT05TICgxPDw2KQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmllZWU4MDIxMV9wcml2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiluZXRkZXZfcHJpdihkZXYpKS0+cHJpdjsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCBpbnQgZXNzaWRfbGVuKQoreworCS8qIFNpbmdsZSB3aGl0ZSBzcGFjZSBpcyBmb3IgTGlua3N5cyBBUHMgKi8KKwlpZiAoZXNzaWRfbGVuID09IDEgJiYgZXNzaWRbMF0gPT0gJyAnKQorCQlyZXR1cm4gMTsKKworCS8qIE90aGVyd2lzZSwgaWYgdGhlIGVudGlyZSBlc3NpZCBpcyAwLCB3ZSBhc3N1bWUgaXQgaXMgaGlkZGVuICovCisJd2hpbGUgKGVzc2lkX2xlbikgeworCQllc3NpZF9sZW4tLTsKKwkJaWYgKGVzc2lkW2Vzc2lkX2xlbl0gIT0gJ1wwJykKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfaXNfdmFsaWRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IG1vZGUpCit7CisJLyoKKwkgKiBJdCBpcyBwb3NzaWJsZSBmb3IgYm90aCBhY2Nlc3MgcG9pbnRzIGFuZCBvdXIgZGV2aWNlIHRvIHN1cHBvcnQKKwkgKiBjb21iaW5hdGlvbnMgb2YgbW9kZXMsIHNvIGFzIGxvbmcgYXMgdGhlcmUgaXMgb25lIHZhbGlkIGNvbWJpbmF0aW9uCisJICogb2YgYXAvZGV2aWNlIHN1cHBvcnRlZCBtb2RlcywgdGhlbiByZXR1cm4gc3VjY2VzcworCSAqCisJICovCisJaWYgKChtb2RlICYgSUVFRV9BKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCisJICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfNTJHSFpfQkFORCkpCisJCXJldHVybiAxOworCisJaWYgKChtb2RlICYgSUVFRV9HKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCisJICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfMjRHSFpfQkFORCkpCisJCXJldHVybiAxOworCisJaWYgKChtb2RlICYgSUVFRV9CKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV8yNEdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2dldF9oZHJsZW4odTE2IGZjKQoreworCWludCBoZHJsZW4gPSBJRUVFODAyMTFfM0FERFJfTEVOOworCisJc3dpdGNoIChXTEFOX0ZDX0dFVF9UWVBFKGZjKSkgeworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0RBVEE6CisJCWlmICgoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMpICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMpKQorCQkJaGRybGVuID0gSUVFRTgwMjExXzRBRERSX0xFTjsgLyogQWRkcjQgKi8KKwkJaWYoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkKKwkJCWhkcmxlbiArPSAyOyAvKiBRT1MgY3RybCovCisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0NUTDoKKwkJc3dpdGNoIChXTEFOX0ZDX0dFVF9TVFlQRShmYykpIHsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQ1RTOgorCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BQ0s6CisJCQloZHJsZW4gPSBJRUVFODAyMTFfMUFERFJfTEVOOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQloZHJsZW4gPSBJRUVFODAyMTFfMkFERFJfTEVOOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGhkcmxlbjsKK30KKworc3RhdGljIGlubGluZSB1OCAqaWVlZTgwMjExX2dldF9wYXlsb2FkKHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCit7CisJc3dpdGNoIChpZWVlODAyMTFfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpKSB7CisJY2FzZSBJRUVFODAyMTFfMUFERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8xYWRkciAqKWhkciktPnBheWxvYWQ7CisJY2FzZSBJRUVFODAyMTFfMkFERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8yYWRkciAqKWhkciktPnBheWxvYWQ7CisJY2FzZSBJRUVFODAyMTFfM0FERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKWhkciktPnBheWxvYWQ7CisJY2FzZSBJRUVFODAyMTFfNEFERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKWhkciktPnBheWxvYWQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfaXNfb2ZkbV9yYXRlKHU4IHJhdGUpCit7CisJc3dpdGNoIChyYXRlICYgfklFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spIHsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COgorCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV85TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI6CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX2Nja19yYXRlKHU4IHJhdGUpCit7CisJc3dpdGNoIChyYXRlICYgfklFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spIHsKKwljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xTUI6CisJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1COgorCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzVNQjoKKwljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1COgorCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogaWVlZTgwMjExLmMgKi8KK2V4dGVybiB2b2lkIGZyZWVfaWVlZTgwMjExKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICphbGxvY19pZWVlODAyMTEoaW50IHNpemVvZl9wcml2KTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfc2V0X2VuY3J5cHRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCisvKiBpZWVlODAyMTFfdHguYyAqLworCitleHRlcm4gaW50IGllZWU4MDIxMV9lbmNyeXB0X2ZyYWdtZW50KAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCXN0cnVjdCBza19idWZmICpmcmFnLAorCWludCBoZHJfbGVuKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV90eGJfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqKTsKKworCisvKiBpZWVlODAyMTFfcnguYyAqLworZXh0ZXJuIGludCBpZWVlODAyMTFfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cyk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfcnhfbWd0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGVhZGVyLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cyk7CisKKy8qIGllZWU4MDIxMV93eC5jICovCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7CisjaWYgV0lSRUxFU1NfRVhUID49IDE4CitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZW5jb2RlX2V4dChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEqIHdycXUsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSogd3JxdSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2F1dGgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmRhdGEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9tbG1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworI2VuZGlmCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqaWUsIHNpemVfdCBsZW4pOworCisvKiBpZWVlODAyMTFfc29mdG1hYy5jICovCitleHRlcm4gc2hvcnQgaWVlZTgwMjExX2lzXzU0ZyhzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0KTsKK2V4dGVybiBzaG9ydCBpZWVlODAyMTFfaXNfc2hvcnRzbG90KHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpOworZXh0ZXJuIGludCBpZWVlODAyMTFfcnhfZnJhbWVfc29mdG1hYyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzLCB1MTYgdHlwZSwKKwkJCXUxNiBzdHlwZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCk7CisKK3ZvaWQgU2VuZERpc2Fzc29jaWF0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCogYXNTdGEsIHU4IGFzUnNuKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3htaXQoc3RydWN0IGllZWU4MDIxMV90eGIgKnR4Yiwgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgbm90aWZ5X3d4X2Fzc29jX2V2ZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X21hc3Rlcl9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19mcmVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfY2hlY2tfYWxsX25ldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV93YWtlX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19wb2ludCAqcCk7CitleHRlcm4gdm9pZCBub3RpZnlfd3hfYXNzb2NfZXZlbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3BzX3R4X2FjayhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgc3VjY2Vzcyk7CisKK2V4dGVybiB2b2lkIHNvZnRtYWNfbWdtdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKworLyogaWVlZTgwMjExX2NyeXB0X2NjbXAmdGtpcCZ3ZXAuYyAqLworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3RraXBfbnVsbCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV93ZXBfbnVsbCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jY21wX251bGwodm9pZCk7CisKKy8qIGllZWU4MDIxMV9zb2Z0bWFjX3d4LmMgKi8KKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3dhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dCk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF93YXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSB1bmlvbiBpd3JlcV9kYXRhICphd3JxLAorCQkJIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLHVuaW9uIGl3cmVxX2RhdGEgKndycXUsY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9mcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2ZyZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCisvL2V4dGVybiB2b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXd0eChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X25hbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfcnRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9ydHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKy8vSFQKKyNkZWZpbmUgTUFYX1JFQ0VJVkVfQlVGRkVSX1NJWkUgOTEwMCAgLy8KK2V4dGVybiB2b2lkIEhURGVidWdIVENhcGFiaWxpdHkodTgqIENhcElFLCB1OCogVGl0bGVTdHJpbmcgKTsKK2V4dGVybiB2b2lkIEhURGVidWdIVEluZm8odTgqICBJbmZvSUUsIHU4KiBUaXRsZVN0cmluZyk7CisKK3ZvaWQgSFRTZXRDb25uZWN0QndNb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBIVF9DSEFOTkVMX1dJRFRIIEJhbmR3aWR0aCwgSFRfRVhUQ0hOTF9PRkZTRVQgICAgT2Zmc2V0KTsKK2V4dGVybiB2b2lkIEhUVXBkYXRlRGVmYXVsdFNldHRpbmcoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpOworZXh0ZXJuIHZvaWQgSFRDb25zdHJ1Y3RDYXBhYmlsaXR5RWxlbWVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIHBvc0hUQ2FwLCB1OCogbGVuLCB1OCBpc0VuY3J5cHQpOworZXh0ZXJuIHZvaWQgSFRDb25zdHJ1Y3RJbmZvRWxlbWVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIHBvc0hUSW5mbywgdTgqIGxlbiwgdTggaXNFbmNyeXB0KTsKK2V4dGVybiB2b2lkIEhUQ29uc3RydWN0UlQyUlRBZ2dFbGVtZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcG9zUlQyUlRBZ2csIHU4KiBsZW4pOworZXh0ZXJuIHZvaWQgSFRPbkFzc29jUnNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIEhUSW5pdGlhbGl6ZUhUSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSk7CitleHRlcm4gdm9pZCBIVEluaXRpYWxpemVCc3NEZXNjKFBCU1NfSFQgcEJzc0hUKTsKK2V4dGVybiB2b2lkIEhUUmVzZXRTZWxmQW5kU2F2ZVBlZXJTZXR0aW5nKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBwTmV0d29yayk7CitleHRlcm4gdm9pZCBIVFVwZGF0ZVNlbGZBbmRQZWVyU2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBwTmV0d29yayk7CitleHRlcm4gdTggSFRHZXRIaWdoZXN0TUNTUmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIHBNQ1NSYXRlU2V0LCB1OCogcE1DU0ZpbHRlcik7CitleHRlcm4gdTggTUNTX0ZJTFRFUl9BTExbXTsKK2V4dGVybiB1MTYgTUNTX0RBVEFfUkFURVsyXVsyXVs3N10gOworZXh0ZXJuIHU4IEhUQ0NoZWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogICBwRnJhbWUpOworLy9leHRlcm4gdm9pZCBIVFNldENvbm5lY3RCd01vZGVDYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOworZXh0ZXJuIHZvaWQgSFRSZXNldElPVFNldHRpbmcoUFJUX0hJR0hfVEhST1VHSFBVVCAgcEhUSW5mbyk7CitleHRlcm4gYm9vbCBJc0hUSGFsZk5tb2RlQVBzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKTsKK2V4dGVybiB1MTYgSFRIYWxmTWNzVG9EYXRhUmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgIHU4ICAgICAgbk1jc1JhdGUpOworZXh0ZXJuIHUxNiBIVE1jc1RvRGF0YVJhdGUoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCBuTWNzUmF0ZSk7CitleHRlcm4gdTE2ICBUeENvdW50VG9EYXRhUmF0ZSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4IG5EYXRhUmF0ZSk7CisvL2Z1bmN0aW9uIGluIEJBUFJPQy5jCitleHRlcm4gaW50IGllZWU4MDIxMV9yeF9BRERCQVJlcSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIGludCBpZWVlODAyMTFfcnhfQUREQkFSc3AoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3J4X0RFTEJBKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIHZvaWQgVHNJbml0QWRkQkEoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBQVFhfVFNfUkVDT1JEICAgcFRTLCB1OCBQb2xpY3ksIHU4IGJPdmVyd3JpdGVQZW5kaW5nKTsKK2V4dGVybiB2b2lkIFRzSW5pdERlbEJBKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgUFRTX0NPTU1PTl9JTkZPIHBUc0NvbW1vbkluZm8sIFRSX1NFTEVDVCBUeFJ4U2VsZWN0KTsKK2V4dGVybiB2b2lkIEJhU2V0dXBUaW1lT3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gdm9pZCBUeEJhSW5hY3RUaW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gdm9pZCBSeEJhSW5hY3RUaW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gdm9pZCBSZXNldEJhRW50cnkoIFBCQV9SRUNPUkQgcEJBKTsKKy8vZnVuY3Rpb24gaW4gVFMuYworZXh0ZXJuIGJvb2wgR2V0VHMoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqICAgICAgICBpZWVlLAorCVBUU19DT01NT05fSU5GTyAgICAgICAgICAgICAgICAgKnBwVFMsCisJdTgqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyLAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElELAorCVRSX1NFTEVDVCAgICAgICAgICAgICAgICAgICAgICAgVHhSeFNlbGVjdCwgIC8vUng6MSwgVHg6MAorCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFkZE5ld1RzCisJKTsKK2V4dGVybiB2b2lkIFRTSW5pdGlhbGl6ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gIHZvaWQgVHNTdGFydEFkZEJhUHJvY2VzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgUFRYX1RTX1JFQ09SRCAgIHBUeFRTKTsKK2V4dGVybiB2b2lkIFJlbW92ZVBlZXJUUyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIEFkZHIpOworZXh0ZXJuIHZvaWQgUmVtb3ZlQWxsVFMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpOwordm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKK2V4dGVybiBjb25zdCBsb25nIGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzW107CisKK2V4dGVybiBpbmxpbmUgdm9pZCBpZWVlODAyMTFfaW5jcmVtZW50X3NjYW5zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWllZWUtPnNjYW5zKys7Cit9CisKK2V4dGVybiBpbmxpbmUgaW50IGllZWU4MDIxMV9nZXRfc2NhbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJcmV0dXJuIGllZWUtPnNjYW5zOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmVzY2FwZV9lc3NpZChjb25zdCBjaGFyICplc3NpZCwgdTggZXNzaWRfbGVuKSB7CisJc3RhdGljIGNoYXIgZXNjYXBlZFtJV19FU1NJRF9NQVhfU0laRSAqIDIgKyAxXTsKKwljb25zdCBjaGFyICpzID0gZXNzaWQ7CisJY2hhciAqZCA9IGVzY2FwZWQ7CisKKwlpZiAoaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGVzc2lkLCBlc3NpZF9sZW4pKSB7CisJCW1lbWNweShlc2NhcGVkLCAiPGhpZGRlbj4iLCBzaXplb2YoIjxoaWRkZW4+IikpOworCQlyZXR1cm4gZXNjYXBlZDsKKwl9CisKKwllc3NpZF9sZW4gPSBtaW4oZXNzaWRfbGVuLCAodTgpSVdfRVNTSURfTUFYX1NJWkUpOworCXdoaWxlIChlc3NpZF9sZW4tLSkgeworCQlpZiAoKnMgPT0gJ1wwJykgeworCQkJKmQrKyA9ICdcXCc7CisJCQkqZCsrID0gJzAnOworCQkJcysrOworCQl9IGVsc2UgeworCQkJKmQrKyA9ICpzKys7CisJCX0KKwl9CisJKmQgPSAnXDAnOworCXJldHVybiBlc2NhcGVkOworfQorCisvKiBGb3IgdGhlIGZ1bmN0aW9uIGlzIG1vcmUgcmVsYXRlZCB0byBoYXJkd2FyZSBzZXR0aW5nLCBpdCdzIGJldHRlciB0byB1c2UgdGhlCisgKiBpZWVlIGhhbmRsZXIgdG8gcmVmZXIgdG8gaXQuCisgKi8KK2V4dGVybiBzaG9ydCBjaGVja19uaWNfZW5vdWdoX2Rlc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHF1ZXVlX2luZGV4KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX2RhdGFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3BhcnNlX2luZm9fcGFyYW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQsCisJCXUxNiBsZW5ndGgsCisJCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaywKKwkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpOworCit2b2lkIGllZWU4MDIxMV9pbmRpY2F0ZV9wYWNrZXRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX3J4YioqIHByeGJJbmRpY2F0ZUFycmF5LHU4ICBpbmRleCk7CisjZGVmaW5lIFJUX0FTT0NfUkVUUllfTElNSVQJNQorI2VuZGlmIC8qIElFRUU4MDIxMV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjFlN2I5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYwpAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqIEhvc3QgQVAgY3J5cHRvIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24gPGprZXRyZW5vQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIb3N0QVAgY3J5cHRvIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOworfTsKKworCitzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0byB7CisJc3RydWN0IGxpc3RfaGVhZCBhbGdzOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0byAqaGNyeXB0OworCit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJICAgaW50IGZvcmNlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm47CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICplbnRyeTsKKworCWZvciAocHRyID0gaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QubmV4dCwgbiA9IHB0ci0+bmV4dDsKKwkgICAgIHB0ciAhPSAmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3Q7IHB0ciA9IG4sIG4gPSBwdHItPm5leHQpIHsKKwkJZW50cnkgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhLCBsaXN0KTsKKworCQlpZiAoYXRvbWljX3JlYWQoJmVudHJ5LT5yZWZjbnQpICE9IDAgJiYgIWZvcmNlKQorCQkJY29udGludWU7CisKKwkJbGlzdF9kZWwocHRyKTsKKworCQlpZiAoZW50cnktPm9wcykKKwkJCWVudHJ5LT5vcHMtPmRlaW5pdChlbnRyeS0+cHJpdik7CisJCWtmcmVlKGVudHJ5KTsKKwl9Cit9CisKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzKGllZWUsIDApOworCWlmICghbGlzdF9lbXB0eSgmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZW50cmllcyByZW1haW5pbmcgaW4gZGVsYXllZCBjcnlwdCAiCisJCSAgICAgICAiZGVsZXRpb24gbGlzdFxuIiwgaWVlZS0+ZGV2LT5uYW1lKTsKKwkJaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJCWFkZF90aW1lcigmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCit9CisKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKnRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCpjcnlwdCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwl0bXAgPSAqY3J5cHQ7CisJKmNyeXB0ID0gTlVMTDsKKworCS8qIG11c3Qgbm90IHJ1biBvcHMtPmRlaW5pdCgpIHdoaWxlIHRoZXJlIG1heSBiZSBwZW5kaW5nIGVuY3J5cHQgb3IKKwkgKiBkZWNyeXB0IG9wZXJhdGlvbnMuIFVzZSBhIGxpc3Qgb2YgZGVsYXllZCBkZWluaXRzIHRvIGF2b2lkIG5lZWRpbmcKKwkgKiBsb2NraW5nLiAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmdG1wLT5saXN0LCAmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QpOworCWlmICghdGltZXJfcGVuZGluZygmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKSkgeworCQlpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwkJYWRkX3RpbWVyKCZpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Cit9CisKK2ludCBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcyhzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqYWxnOworCisJaWYgKGhjcnlwdCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlhbGcgPSBrbWFsbG9jKHNpemVvZigqYWxnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFsZyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChhbGcsIDAsIHNpemVvZigqYWxnKSk7CisJYWxnLT5vcHMgPSBvcHM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoJmFsZy0+bGlzdCwgJmhjcnlwdC0+YWxncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0OiByZWdpc3RlcmVkIGFsZ29yaXRobSAnJXMnXG4iLAorCSAgICAgICBvcHMtPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqZGVsX2FsZyA9IE5VTEw7CisKKwlpZiAoaGNyeXB0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKHB0ciA9IGhjcnlwdC0+YWxncy5uZXh0OyBwdHIgIT0gJmhjcnlwdC0+YWxnczsgcHRyID0gcHRyLT5uZXh0KSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqYWxnID0KKwkJCShzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKikgcHRyOworCQlpZiAoYWxnLT5vcHMgPT0gb3BzKSB7CisJCQlsaXN0X2RlbCgmYWxnLT5saXN0KTsKKwkJCWRlbF9hbGcgPSBhbGc7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChkZWxfYWxnKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHQ6IHVucmVnaXN0ZXJlZCBhbGdvcml0aG0gIgorCQkgICAgICAgIiclcydcbiIsIG9wcy0+bmFtZSk7CisJCWtmcmVlKGRlbF9hbGcpOworCX0KKworCXJldHVybiBkZWxfYWxnID8gMCA6IC0xOworfQorCisKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqIGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqZm91bmRfYWxnID0gTlVMTDsKKworCWlmIChoY3J5cHQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisJZm9yIChwdHIgPSBoY3J5cHQtPmFsZ3MubmV4dDsgcHRyICE9ICZoY3J5cHQtPmFsZ3M7IHB0ciA9IHB0ci0+bmV4dCkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKmFsZyA9CisJCQkoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICopIHB0cjsKKwkJaWYgKHN0cmNtcChhbGctPm9wcy0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJZm91bmRfYWxnID0gYWxnOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoZm91bmRfYWxnKQorCQlyZXR1cm4gZm91bmRfYWxnLT5vcHM7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZCAqIGllZWU4MDIxMV9jcnlwdF9udWxsX2luaXQoaW50IGtleWlkeCkgeyByZXR1cm4gKHZvaWQgKikgMTsgfQorc3RhdGljIHZvaWQgaWVlZTgwMjExX2NyeXB0X251bGxfZGVpbml0KHZvaWQgKnByaXYpIHt9CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X251bGwgPSB7CisJLm5hbWUJCQk9ICJOVUxMIiwKKwkuaW5pdAkJCT0gaWVlZTgwMjExX2NyeXB0X251bGxfaW5pdCwKKwkuZGVpbml0CQkJPSBpZWVlODAyMTFfY3J5cHRfbnVsbF9kZWluaXQsCisJLmVuY3J5cHRfbXBkdQkJPSBOVUxMLAorCS5kZWNyeXB0X21wZHUJCT0gTlVMTCwKKwkuZW5jcnlwdF9tc2R1CQk9IE5VTEwsCisJLmRlY3J5cHRfbXNkdQkJPSBOVUxMLAorCS5zZXRfa2V5CQk9IE5VTEwsCisJLmdldF9rZXkJCT0gTlVMTCwKKwkuZXh0cmFfcHJlZml4X2xlbgk9IDAsCisJLmV4dHJhX3Bvc3RmaXhfbGVuCT0gMCwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorfTsKKworaW50IF9faW5pdCBpZWVlODAyMTFfY3J5cHRvX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gLUVOT01FTTsKKworCWhjcnlwdCA9IGttYWxsb2Moc2l6ZW9mKCpoY3J5cHQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhjcnlwdCkKKwkJZ290byBvdXQ7CisKKwltZW1zZXQoaGNyeXB0LCAwLCBzaXplb2YoKmhjcnlwdCkpOworCUlOSVRfTElTVF9IRUFEKCZoY3J5cHQtPmFsZ3MpOworCXNwaW5fbG9ja19pbml0KCZoY3J5cHQtPmxvY2spOworCisJcmV0ID0gaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF9udWxsKTsKKwlpZiAocmV0IDwgMCkgeworCQlrZnJlZShoY3J5cHQpOworCQloY3J5cHQgPSBOVUxMOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIF9fZXhpdCBpZWVlODAyMTFfY3J5cHRvX2RlaW5pdCh2b2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm47CisKKwlpZiAoaGNyeXB0ID09IE5VTEwpCisJCXJldHVybjsKKworCWZvciAocHRyID0gaGNyeXB0LT5hbGdzLm5leHQsIG4gPSBwdHItPm5leHQ7IHB0ciAhPSAmaGNyeXB0LT5hbGdzOworCSAgICAgcHRyID0gbiwgbiA9IHB0ci0+bmV4dCkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKmFsZyA9CisJCQkoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICopIHB0cjsKKwkJbGlzdF9kZWwocHRyKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdDogdW5yZWdpc3RlcmVkIGFsZ29yaXRobSAiCisJCSAgICAgICAiJyVzJyAoZGVpbml0KVxuIiwgYWxnLT5vcHMtPm5hbWUpOworCQlrZnJlZShhbGcpOworCX0KKworCWtmcmVlKGhjcnlwdCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNThhM2JjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogT3JpZ2luYWwgY29kZSBiYXNlZCBvbiBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcyBMQU4gYWNjZXNzIHBvaW50KSBkcml2ZXIKKyAqIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBBZGFwdGlvbiB0byBhIGdlbmVyaWMgSUVFRSA4MDIuMTEgc3RhY2sgYnkgSmFtZXMgS2V0cmVub3MKKyAqIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGllZWU4MDIxMSBjcnlwdG8gbW9kdWxlLgorICovCisjaWZuZGVmIElFRUU4MDIxMV9DUllQVF9ICisjZGVmaW5lIElFRUU4MDIxMV9DUllQVF9ICisKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzIHsKKwljb25zdCBjaGFyICpuYW1lOworCisJLyogaW5pdCBuZXcgY3J5cHRvIGNvbnRleHQgKGUuZy4sIGFsbG9jYXRlIHByaXZhdGUgZGF0YSBzcGFjZSwKKwkgKiBzZWxlY3QgSVYsIGV0Yy4pOyByZXR1cm5zIE5VTEwgb24gZmFpbHVyZSBvciBwb2ludGVyIHRvIGFsbG9jYXRlZAorCSAqIHByaXZhdGUgZGF0YSBvbiBzdWNjZXNzICovCisJdm9pZCAqICgqaW5pdCkoaW50IGtleWlkeCk7CisKKwkvKiBkZWluaXRpYWxpemUgY3J5cHRvIGNvbnRleHQgYW5kIGZyZWUgYWxsb2NhdGVkIHByaXZhdGUgZGF0YSAqLworCXZvaWQgKCpkZWluaXQpKHZvaWQgKnByaXYpOworCisJLyogZW5jcnlwdC9kZWNyeXB0IHJldHVybiA8IDAgb24gZXJyb3Igb3IgPj0gMCBvbiBzdWNjZXNzLiBUaGUgcmV0dXJuCisJICogdmFsdWUgZnJvbSBkZWNyeXB0X21wZHUgaXMgcGFzc2VkIGFzIHRoZSBrZXlpZHggdmFsdWUgZm9yCisJICogZGVjcnlwdF9tc2R1LiBza2IgbXVzdCBoYXZlIGVub3VnaCBoZWFkIGFuZCB0YWlsIHJvb20gZm9yIHRoZQorCSAqIGVuY3J5cHRpb247IGlmIG5vdCwgZXJyb3Igd2lsbCBiZSByZXR1cm5lZDsgdGhlc2UgZnVuY3Rpb25zIGFyZQorCSAqIGNhbGxlZCBmb3IgYWxsIE1QRFVzIChpLmUuLCBmcmFnbWVudHMpLgorCSAqLworCWludCAoKmVuY3J5cHRfbXBkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOworCWludCAoKmRlY3J5cHRfbXBkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOworCisJLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgZm9yIGZ1bGwgTVNEVXMsIGkuZS4gZnVsbCBmcmFtZXMuCisJICogVGhlc2UgY2FuIGJlIE5VTEwgaWYgZnVsbCBNU0RVIG9wZXJhdGlvbnMgYXJlIG5vdCBuZWVkZWQuICovCisJaW50ICgqZW5jcnlwdF9tc2R1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdik7CisJaW50ICgqZGVjcnlwdF9tc2R1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQga2V5aWR4LCBpbnQgaGRyX2xlbiwKKwkJCSAgICB2b2lkICpwcml2KTsKKworCWludCAoKnNldF9rZXkpKHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdik7CisJaW50ICgqZ2V0X2tleSkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KTsKKworCS8qIHByb2NmcyBoYW5kbGVyIGZvciBwcmludGluZyBvdXQga2V5IGluZm9ybWF0aW9uIGFuZCBwb3NzaWJsZQorCSAqIHN0YXRpc3RpY3MgKi8KKwljaGFyICogKCpwcmludF9zdGF0cykoY2hhciAqcCwgdm9pZCAqcHJpdik7CisKKwkvKiBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBhZGRlZCBieSBlbmNyeXB0aW9uOyBlbmNyeXB0IGJ1ZiBpcworCSAqIGFsbG9jYXRlZCB3aXRoIGV4dHJhX3ByZWZpeF9sZW4gYnl0ZXMsIGNvcHkgb2YgaW5fYnVmLCBhbmQKKwkgKiBleHRyYV9wb3N0Zml4X2xlbjsgZW5jcnlwdCBuZWVkIG5vdCB1c2UgYWxsIHRoaXMgc3BhY2UsIGJ1dAorCSAqIHRoZSByZXN1bHQgbXVzdCBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgYW5kIGNvcnJlY3QKKwkgKiBsZW5ndGggbXVzdCBiZSByZXR1cm5lZCAqLworCWludCBleHRyYV9wcmVmaXhfbGVuLCBleHRyYV9wb3N0Zml4X2xlbjsKKworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworfTsKKworc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7IC8qIGRlbGF5ZWQgZGVsZXRpb24gbGlzdCAqLworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOworCXZvaWQgKnByaXY7CisJYXRvbWljX3QgcmVmY250OworfTsKKworaW50IGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKTsKK2ludCBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKTsKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqIGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICosIGludCk7Cit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcih1bnNpZ25lZCBsb25nKTsKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzNiZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMKQEAgLTAsMCArMSw0ODAgQEAKKy8qCisgKiBIb3N0IEFQIGNyeXB0OiBob3N0LWJhc2VkIENDTVAgZW5jcnlwdGlvbiBpbXBsZW1lbnRhdGlvbiBmb3IgSG9zdCBBUCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCwgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisgICAgI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisKK01PRFVMRV9BVVRIT1IoIkpvdW5pIE1hbGluZW4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSG9zdCBBUCBjcnlwdDogQ0NNUCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIEFFU19CTE9DS19MRU4gMTYKKyNkZWZpbmUgQ0NNUF9IRFJfTEVOIDgKKyNkZWZpbmUgQ0NNUF9NSUNfTEVOIDgKKyNkZWZpbmUgQ0NNUF9US19MRU4gMTYKKyNkZWZpbmUgQ0NNUF9QTl9MRU4gNgorCitzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSB7CisJdTgga2V5W0NDTVBfVEtfTEVOXTsKKwlpbnQga2V5X3NldDsKKworCXU4IHR4X3BuW0NDTVBfUE5fTEVOXTsKKwl1OCByeF9wbltDQ01QX1BOX0xFTl07CisKKwl1MzIgZG90MTFSU05BU3RhdHNDQ01QRm9ybWF0RXJyb3JzOworCXUzMiBkb3QxMVJTTkFTdGF0c0NDTVBSZXBsYXlzOworCXUzMiBkb3QxMVJTTkFTdGF0c0NDTVBEZWNyeXB0RXJyb3JzOworCisJaW50IGtleV9pZHg7CisKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtOworCisJLyogc2NyYXRjaCBidWZmZXJzIGZvciB2aXJ0X3RvX3BhZ2UoKSAoY3J5cHRvIEFQSSkgKi8KKwl1OCB0eF9iMFtBRVNfQkxPQ0tfTEVOXSwgdHhfYltBRVNfQkxPQ0tfTEVOXSwKKwkJdHhfZVtBRVNfQkxPQ0tfTEVOXSwgdHhfczBbQUVTX0JMT0NLX0xFTl07CisJdTggcnhfYjBbQUVTX0JMT0NLX0xFTl0sIHJ4X2JbQUVTX0JMT0NLX0xFTl0sIHJ4X2FbQUVTX0JMT0NLX0xFTl07Cit9OworCit2b2lkIGllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCQkgICAgIGNvbnN0IHU4IHB0WzE2XSwgdTggY3RbMTZdKQoreworCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUoKHZvaWQqKXRmbSwgY3QsIHB0KTsKK30KKworc3RhdGljIHZvaWQgKiBpZWVlODAyMTFfY2NtcF9pbml0KGludCBrZXlfaWR4KQoreworCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpwcml2OworCisJcHJpdiA9IGttYWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0FUT01JQyk7CisJaWYgKHByaXYgPT0gTlVMTCkKKwkJZ290byBmYWlsOworCW1lbXNldChwcml2LCAwLCBzaXplb2YoKnByaXYpKTsKKwlwcml2LT5rZXlfaWR4ID0ga2V5X2lkeDsKKworICAgICAgIHByaXYtPnRmbSA9ICh2b2lkKiljcnlwdG9fYWxsb2NfY2lwaGVyKCJhZXMiLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHByaXYtPnRmbSkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF9jY21wOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgYWVzXG4iKTsKKwkJcHJpdi0+dGZtID0gTlVMTDsKKwkJZ290byBmYWlsOworCX0KKworCXJldHVybiBwcml2OworCitmYWlsOgorCWlmIChwcml2KSB7CisJCWlmIChwcml2LT50Zm0pCisJCQljcnlwdG9fZnJlZV9jaXBoZXIoKHZvaWQqKXByaXYtPnRmbSk7CisJCWtmcmVlKHByaXYpOworCX0KKworCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9jY21wX2RlaW5pdCh2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpfcHJpdiA9IHByaXY7CisKKwlpZiAoX3ByaXYgJiYgX3ByaXYtPnRmbSkKKwkJY3J5cHRvX2ZyZWVfY2lwaGVyKCh2b2lkKilfcHJpdi0+dGZtKTsKKwlrZnJlZShwcml2KTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgeG9yX2Jsb2NrKHU4ICpiLCB1OCAqYSwgc2l6ZV90IGxlbikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWJbaV0gXj0gYVtpXTsKK30KKworCisKK3N0YXRpYyB2b2lkIGNjbXBfaW5pdF9ibG9ja3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkciwKKwkJCSAgICAgdTggKnBuLCBzaXplX3QgZGxlbiwgdTggKmIwLCB1OCAqYXV0aCwKKwkJCSAgICAgdTggKnMwKQoreworCXU4ICpwb3MsIHFjID0gMDsKKwlzaXplX3QgYWFkX2xlbjsKKwl1MTYgZmM7CisJaW50IGE0X2luY2x1ZGVkLCBxY19pbmNsdWRlZDsKKwl1OCBhYWRbMiAqIEFFU19CTE9DS19MRU5dOworCisJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJYTRfaW5jbHVkZWQgPSAoKGZjICYgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSA9PQorCQkgICAgICAgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKTsKKwkvKgorCXFjX2luY2x1ZGVkID0gKChXTEFOX0ZDX0dFVF9UWVBFKGZjKSA9PSBJRUVFODAyMTFfRlRZUEVfREFUQSkgJiYKKwkJICAgICAgIChXTEFOX0ZDX0dFVF9TVFlQRShmYykgJiAweDA4KSk7CisJKi8KKwkvLyBmaXhlZCBieSBEYXZpZCA6MjAwNi45LjYKKwlxY19pbmNsdWRlZCA9ICgoV0xBTl9GQ19HRVRfVFlQRShmYykgPT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEpICYmCisJCSAgICAgICAoV0xBTl9GQ19HRVRfU1RZUEUoZmMpICYgMHg4MCkpOworCWFhZF9sZW4gPSAyMjsKKwlpZiAoYTRfaW5jbHVkZWQpCisJCWFhZF9sZW4gKz0gNjsKKwlpZiAocWNfaW5jbHVkZWQpIHsKKwkJcG9zID0gKHU4ICopICZoZHItPmFkZHI0OworCQlpZiAoYTRfaW5jbHVkZWQpCisJCQlwb3MgKz0gNjsKKwkJcWMgPSAqcG9zICYgMHgwZjsKKwkJYWFkX2xlbiArPSAyOworCX0KKwkvKiBDQ00gSW5pdGlhbCBCbG9jazoKKwkgKiBGbGFnIChJbmNsdWRlIGF1dGhlbnRpY2F0aW9uIGhlYWRlciwgTT0zICg4LW9jdGV0IE1JQyksCisJICogICAgICAgTD0xICgyLW9jdGV0IERsZW4pKQorCSAqIE5vbmNlOiAweDAwIHwgQTIgfCBQTgorCSAqIERsZW4gKi8KKwliMFswXSA9IDB4NTk7CisJYjBbMV0gPSBxYzsKKwltZW1jcHkoYjAgKyAyLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7CisJbWVtY3B5KGIwICsgOCwgcG4sIENDTVBfUE5fTEVOKTsKKwliMFsxNF0gPSAoZGxlbiA+PiA4KSAmIDB4ZmY7CisJYjBbMTVdID0gZGxlbiAmIDB4ZmY7CisKKwkvKiBBQUQ6CisJICogRkMgd2l0aCBiaXRzIDQuLjYgYW5kIDExLi4xMyBtYXNrZWQgdG8gemVybzsgMTQgaXMgYWx3YXlzIG9uZQorCSAqIEExIHwgQTIgfCBBMworCSAqIFNDIHdpdGggYml0cyA0Li4xNSAoc2VxIykgbWFza2VkIHRvIHplcm8KKwkgKiBBNCAoaWYgcHJlc2VudCkKKwkgKiBRQyAoaWYgcHJlc2VudCkKKwkgKi8KKwlwb3MgPSAodTggKikgaGRyOworCWFhZFswXSA9IDA7IC8qIGFhZF9sZW4gPj4gOCAqLworCWFhZFsxXSA9IGFhZF9sZW4gJiAweGZmOworCWFhZFsyXSA9IHBvc1swXSAmIDB4OGY7CisJYWFkWzNdID0gcG9zWzFdICYgMHhjNzsKKwltZW1jcHkoYWFkICsgNCwgaGRyLT5hZGRyMSwgMyAqIEVUSF9BTEVOKTsKKwlwb3MgPSAodTggKikgJmhkci0+c2VxX2N0bDsKKwlhYWRbMjJdID0gcG9zWzBdICYgMHgwZjsKKwlhYWRbMjNdID0gMDsgLyogYWxsIGJpdHMgbWFza2VkICovCisJbWVtc2V0KGFhZCArIDI0LCAwLCA4KTsKKwlpZiAoYTRfaW5jbHVkZWQpCisJCW1lbWNweShhYWQgKyAyNCwgaGRyLT5hZGRyNCwgRVRIX0FMRU4pOworCWlmIChxY19pbmNsdWRlZCkgeworCQlhYWRbYTRfaW5jbHVkZWQgPyAzMCA6IDI0XSA9IHFjOworCQkvKiByZXN0IG9mIFFDIG1hc2tlZCAqLworCX0KKworCS8qIFN0YXJ0IHdpdGggdGhlIGZpcnN0IGJsb2NrIGFuZCBBQUQgKi8KKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGIwLCBhdXRoKTsKKwl4b3JfYmxvY2soYXV0aCwgYWFkLCBBRVNfQkxPQ0tfTEVOKTsKKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGF1dGgsIGF1dGgpOworCXhvcl9ibG9jayhhdXRoLCAmYWFkW0FFU19CTE9DS19MRU5dLCBBRVNfQkxPQ0tfTEVOKTsKKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGF1dGgsIGF1dGgpOworCWIwWzBdICY9IDB4MDc7CisJYjBbMTRdID0gYjBbMTVdID0gMDsKKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGIwLCBzMCk7Cit9CisKKworCitzdGF0aWMgaW50IGllZWU4MDIxMV9jY21wX2VuY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKmtleSA9IHByaXY7CisJaW50IGRhdGFfbGVuLCBpOworCXU4ICpwb3M7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjsKKwljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisKKwlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBDQ01QX0hEUl9MRU4gfHwKKwkgICAgc2tiX3RhaWxyb29tKHNrYikgPCBDQ01QX01JQ19MRU4gfHwKKwkgICAgc2tiLT5sZW4gPCBoZHJfbGVuKQorCQlyZXR1cm4gLTE7CisKKwlkYXRhX2xlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbjsKKwlwb3MgPSBza2JfcHVzaChza2IsIENDTVBfSERSX0xFTik7CisJbWVtbW92ZShwb3MsIHBvcyArIENDTVBfSERSX0xFTiwgaGRyX2xlbik7CisJcG9zICs9IGhkcl9sZW47CisvLwltaWMgPSBza2JfcHV0KHNrYiwgQ0NNUF9NSUNfTEVOKTsKKworCWkgPSBDQ01QX1BOX0xFTiAtIDE7CisJd2hpbGUgKGkgPj0gMCkgeworCQlrZXktPnR4X3BuW2ldKys7CisJCWlmIChrZXktPnR4X3BuW2ldICE9IDApCisJCQlicmVhazsKKwkJaS0tOworCX0KKworCSpwb3MrKyA9IGtleS0+dHhfcG5bNV07CisJKnBvcysrID0ga2V5LT50eF9wbls0XTsKKwkqcG9zKysgPSAwOworCSpwb3MrKyA9IChrZXktPmtleV9pZHggPDwgNikgfCAoMSA8PCA1KSAvKiBFeHQgSVYgaW5jbHVkZWQgKi87CisJKnBvcysrID0ga2V5LT50eF9wblszXTsKKwkqcG9zKysgPSBrZXktPnR4X3BuWzJdOworCSpwb3MrKyA9IGtleS0+dHhfcG5bMV07CisJKnBvcysrID0ga2V5LT50eF9wblswXTsKKworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwlpZiAoIXRjYl9kZXNjLT5iSHdTZWMpCisJeworCQlpbnQgYmxvY2tzLCBsYXN0LCBsZW47CisJCXU4ICptaWM7CisJCXU4ICpiMCA9IGtleS0+dHhfYjA7CisJCXU4ICpiID0ga2V5LT50eF9iOworCQl1OCAqZSA9IGtleS0+dHhfZTsKKwkJdTggKnMwID0ga2V5LT50eF9zMDsKKworCQkvL21pYyBpcyBtb3ZlZCB0byBoZXJlIGJ5IGpvaG4KKwkJbWljID0gc2tiX3B1dChza2IsIENDTVBfTUlDX0xFTik7CisKKwkJY2NtcF9pbml0X2Jsb2NrcyhrZXktPnRmbSwgaGRyLCBrZXktPnR4X3BuLCBkYXRhX2xlbiwgYjAsIGIsIHMwKTsKKworCQlibG9ja3MgPSAoZGF0YV9sZW4gKyBBRVNfQkxPQ0tfTEVOIC0gMSkgLyBBRVNfQkxPQ0tfTEVOOworCQlsYXN0ID0gZGF0YV9sZW4gJSBBRVNfQkxPQ0tfTEVOOworCisJCWZvciAoaSA9IDE7IGkgPD0gYmxvY2tzOyBpKyspIHsKKwkJCWxlbiA9IChpID09IGJsb2NrcyAmJiBsYXN0KSA/IGxhc3QgOiBBRVNfQkxPQ0tfTEVOOworCQkJLyogQXV0aGVudGljYXRpb24gKi8KKwkJCXhvcl9ibG9jayhiLCBwb3MsIGxlbik7CisJCQlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdChrZXktPnRmbSwgYiwgYik7CisJCQkvKiBFbmNyeXB0aW9uLCB3aXRoIGNvdW50ZXIgKi8KKwkJCWIwWzE0XSA9IChpID4+IDgpICYgMHhmZjsKKwkJCWIwWzE1XSA9IGkgJiAweGZmOworCQkJaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoa2V5LT50Zm0sIGIwLCBlKTsKKwkJCXhvcl9ibG9jayhwb3MsIGUsIGxlbik7CisJCQlwb3MgKz0gbGVuOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IENDTVBfTUlDX0xFTjsgaSsrKQorCQkJbWljW2ldID0gYltpXSBeIHMwW2ldOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV9jY21wX2RlY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKmtleSA9IHByaXY7CisJdTgga2V5aWR4LCAqcG9zOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHI7CisJY2JfZGVzYyAqdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCXU4IHBuWzZdOworCisJaWYgKHNrYi0+bGVuIDwgaGRyX2xlbiArIENDTVBfSERSX0xFTiArIENDTVBfTUlDX0xFTikgeworCQlrZXktPmRvdDExUlNOQVN0YXRzQ0NNUEZvcm1hdEVycm9ycysrOworCQlyZXR1cm4gLTE7CisJfQorCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwlwb3MgPSBza2ItPmRhdGEgKyBoZHJfbGVuOworCWtleWlkeCA9IHBvc1szXTsKKwlpZiAoIShrZXlpZHggJiAoMSA8PCA1KSkpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNDTVA6IHJlY2VpdmVkIHBhY2tldCB3aXRob3V0IEV4dElWIgorCQkJICAgICAgICIgZmxhZyBmcm9tICIgTUFDX0ZNVCAiXG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJfQorCQlrZXktPmRvdDExUlNOQVN0YXRzQ0NNUEZvcm1hdEVycm9ycysrOworCQlyZXR1cm4gLTI7CisJfQorCWtleWlkeCA+Pj0gNjsKKwlpZiAoa2V5LT5rZXlfaWR4ICE9IGtleWlkeCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQ0NNUDogUlggdGtleS0+a2V5X2lkeD0lZCBmcmFtZSAiCisJCSAgICAgICAia2V5aWR4PSVkIHByaXY9JXBcbiIsIGtleS0+a2V5X2lkeCwga2V5aWR4LCBwcml2KTsKKwkJcmV0dXJuIC02OworCX0KKwlpZiAoIWtleS0+a2V5X3NldCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQ0NNUDogcmVjZWl2ZWQgcGFja2V0IGZyb20gIiBNQUNfRk1UCisJCQkgICAgICAgIiB3aXRoIGtleWlkPSVkIHRoYXQgZG9lcyBub3QgaGF2ZSBhIGNvbmZpZ3VyZWQiCisJCQkgICAgICAgIiBrZXlcbiIsIE1BQ19BUkcoaGRyLT5hZGRyMiksIGtleWlkeCk7CisJCX0KKwkJcmV0dXJuIC0zOworCX0KKworCXBuWzBdID0gcG9zWzddOworCXBuWzFdID0gcG9zWzZdOworCXBuWzJdID0gcG9zWzVdOworCXBuWzNdID0gcG9zWzRdOworCXBuWzRdID0gcG9zWzFdOworCXBuWzVdID0gcG9zWzBdOworCXBvcyArPSA4OworCisJaWYgKG1lbWNtcChwbiwga2V5LT5yeF9wbiwgQ0NNUF9QTl9MRU4pIDw9IDApIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNDTVA6IHJlcGxheSBkZXRlY3RlZDogU1RBPSIgTUFDX0ZNVAorCQkJICAgICAgICIgcHJldmlvdXMgUE4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJCSAgICAgICAicmVjZWl2ZWQgUE4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQkJICAgICAgIE1BQ19BUkcoaGRyLT5hZGRyMiksIE1BQ19BUkcoa2V5LT5yeF9wbiksCisJCQkgICAgICAgTUFDX0FSRyhwbikpOworCQl9CisJCWtleS0+ZG90MTFSU05BU3RhdHNDQ01QUmVwbGF5cysrOworCQlyZXR1cm4gLTQ7CisJfQorCWlmICghdGNiX2Rlc2MtPmJId1NlYykKKwl7CisJCXNpemVfdCBkYXRhX2xlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbiAtIENDTVBfSERSX0xFTiAtIENDTVBfTUlDX0xFTjsKKwkJdTggKm1pYyA9IHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gQ0NNUF9NSUNfTEVOOworCQl1OCAqYjAgPSBrZXktPnJ4X2IwOworCQl1OCAqYiA9IGtleS0+cnhfYjsKKwkJdTggKmEgPSBrZXktPnJ4X2E7CisJCWludCBpLCBibG9ja3MsIGxhc3QsIGxlbjsKKworCisJCWNjbXBfaW5pdF9ibG9ja3Moa2V5LT50Zm0sIGhkciwgcG4sIGRhdGFfbGVuLCBiMCwgYSwgYik7CisJCXhvcl9ibG9jayhtaWMsIGIsIENDTVBfTUlDX0xFTik7CisKKwkJYmxvY2tzID0gKGRhdGFfbGVuICsgQUVTX0JMT0NLX0xFTiAtIDEpIC8gQUVTX0JMT0NLX0xFTjsKKwkJbGFzdCA9IGRhdGFfbGVuICUgQUVTX0JMT0NLX0xFTjsKKworCQlmb3IgKGkgPSAxOyBpIDw9IGJsb2NrczsgaSsrKSB7CisJCQlsZW4gPSAoaSA9PSBibG9ja3MgJiYgbGFzdCkgPyBsYXN0IDogQUVTX0JMT0NLX0xFTjsKKwkJCS8qIERlY3J5cHQsIHdpdGggY291bnRlciAqLworCQkJYjBbMTRdID0gKGkgPj4gOCkgJiAweGZmOworCQkJYjBbMTVdID0gaSAmIDB4ZmY7CisJCQlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdChrZXktPnRmbSwgYjAsIGIpOworCQkJeG9yX2Jsb2NrKHBvcywgYiwgbGVuKTsKKwkJCS8qIEF1dGhlbnRpY2F0aW9uICovCisJCQl4b3JfYmxvY2soYSwgcG9zLCBsZW4pOworCQkJaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoa2V5LT50Zm0sIGEsIGEpOworCQkJcG9zICs9IGxlbjsKKwkJfQorCisJCWlmIChtZW1jbXAobWljLCBhLCBDQ01QX01JQ19MRU4pICE9IDApIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiQ0NNUDogZGVjcnlwdCBmYWlsZWQ6IFNUQT0iCisJCQkJTUFDX0ZNVCAiXG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJCX0KKwkJCWtleS0+ZG90MTFSU05BU3RhdHNDQ01QRGVjcnlwdEVycm9ycysrOworCQkJcmV0dXJuIC01OworCQl9CisKKwkJbWVtY3B5KGtleS0+cnhfcG4sIHBuLCBDQ01QX1BOX0xFTik7CisJfQorCS8qIFJlbW92ZSBoZHIgYW5kIE1JQyAqLworCW1lbW1vdmUoc2tiLT5kYXRhICsgQ0NNUF9IRFJfTEVOLCBza2ItPmRhdGEsIGhkcl9sZW4pOworCXNrYl9wdWxsKHNrYiwgQ0NNUF9IRFJfTEVOKTsKKwlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gQ0NNUF9NSUNfTEVOKTsKKworCXJldHVybiBrZXlpZHg7Cit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfY2NtcF9zZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqZGF0YSA9IHByaXY7CisJaW50IGtleWlkeDsKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gZGF0YS0+dGZtOworCisJa2V5aWR4ID0gZGF0YS0+a2V5X2lkeDsKKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKCpkYXRhKSk7CisJZGF0YS0+a2V5X2lkeCA9IGtleWlkeDsKKwlkYXRhLT50Zm0gPSB0Zm07CisJaWYgKGxlbiA9PSBDQ01QX1RLX0xFTikgeworCQltZW1jcHkoZGF0YS0+a2V5LCBrZXksIENDTVBfVEtfTEVOKTsKKwkJZGF0YS0+a2V5X3NldCA9IDE7CisJCWlmIChzZXEpIHsKKwkJCWRhdGEtPnJ4X3BuWzBdID0gc2VxWzVdOworCQkJZGF0YS0+cnhfcG5bMV0gPSBzZXFbNF07CisJCQlkYXRhLT5yeF9wblsyXSA9IHNlcVszXTsKKwkJCWRhdGEtPnJ4X3BuWzNdID0gc2VxWzJdOworCQkJZGF0YS0+cnhfcG5bNF0gPSBzZXFbMV07CisJCQlkYXRhLT5yeF9wbls1XSA9IHNlcVswXTsKKwkJfQorCQljcnlwdG9fY2lwaGVyX3NldGtleSgodm9pZCopZGF0YS0+dGZtLCBkYXRhLT5rZXksIENDTVBfVEtfTEVOKTsKKwl9IGVsc2UgaWYgKGxlbiA9PSAwKQorCQlkYXRhLT5rZXlfc2V0ID0gMDsKKwllbHNlCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2NjbXBfZ2V0X2tleSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKmRhdGEgPSBwcml2OworCisJaWYgKGxlbiA8IENDTVBfVEtfTEVOKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIWRhdGEtPmtleV9zZXQpCisJCXJldHVybiAwOworCW1lbWNweShrZXksIGRhdGEtPmtleSwgQ0NNUF9US19MRU4pOworCisJaWYgKHNlcSkgeworCQlzZXFbMF0gPSBkYXRhLT50eF9wbls1XTsKKwkJc2VxWzFdID0gZGF0YS0+dHhfcG5bNF07CisJCXNlcVsyXSA9IGRhdGEtPnR4X3BuWzNdOworCQlzZXFbM10gPSBkYXRhLT50eF9wblsyXTsKKwkJc2VxWzRdID0gZGF0YS0+dHhfcG5bMV07CisJCXNlcVs1XSA9IGRhdGEtPnR4X3BuWzBdOworCX0KKworCXJldHVybiBDQ01QX1RLX0xFTjsKK30KKworCitzdGF0aWMgY2hhciAqIGllZWU4MDIxMV9jY21wX3ByaW50X3N0YXRzKGNoYXIgKnAsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKmNjbXAgPSBwcml2OworCXAgKz0gc3ByaW50ZihwLCAia2V5WyVkXSBhbGc9Q0NNUCBrZXlfc2V0PSVkICIKKwkJICAgICAidHhfcG49JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICAicnhfcG49JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICAiZm9ybWF0X2Vycm9ycz0lZCByZXBsYXlzPSVkIGRlY3J5cHRfZXJyb3JzPSVkXG4iLAorCQkgICAgIGNjbXAtPmtleV9pZHgsIGNjbXAtPmtleV9zZXQsCisJCSAgICAgTUFDX0FSRyhjY21wLT50eF9wbiksIE1BQ19BUkcoY2NtcC0+cnhfcG4pLAorCQkgICAgIGNjbXAtPmRvdDExUlNOQVN0YXRzQ0NNUEZvcm1hdEVycm9ycywKKwkJICAgICBjY21wLT5kb3QxMVJTTkFTdGF0c0NDTVBSZXBsYXlzLAorCQkgICAgIGNjbXAtPmRvdDExUlNOQVN0YXRzQ0NNUERlY3J5cHRFcnJvcnMpOworCisJcmV0dXJuIHA7Cit9CisKK3ZvaWQgaWVlZTgwMjExX2NjbXBfbnVsbCh2b2lkKQoreworLy8gICAgcHJpbnRrKCI9PT09PT09PT09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X2NjbXAgPSB7CisJLm5hbWUJCQk9ICJDQ01QIiwKKwkuaW5pdAkJCT0gaWVlZTgwMjExX2NjbXBfaW5pdCwKKwkuZGVpbml0CQkJPSBpZWVlODAyMTFfY2NtcF9kZWluaXQsCisJLmVuY3J5cHRfbXBkdQkJPSBpZWVlODAyMTFfY2NtcF9lbmNyeXB0LAorCS5kZWNyeXB0X21wZHUJCT0gaWVlZTgwMjExX2NjbXBfZGVjcnlwdCwKKwkuZW5jcnlwdF9tc2R1CQk9IE5VTEwsCisJLmRlY3J5cHRfbXNkdQkJPSBOVUxMLAorCS5zZXRfa2V5CQk9IGllZWU4MDIxMV9jY21wX3NldF9rZXksCisJLmdldF9rZXkJCT0gaWVlZTgwMjExX2NjbXBfZ2V0X2tleSwKKwkucHJpbnRfc3RhdHMJCT0gaWVlZTgwMjExX2NjbXBfcHJpbnRfc3RhdHMsCisJLmV4dHJhX3ByZWZpeF9sZW4JPSBDQ01QX0hEUl9MRU4sCisJLmV4dHJhX3Bvc3RmaXhfbGVuCT0gQ0NNUF9NSUNfTEVOLAorCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCit9OworCitpbnQgX19pbml0IGllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfY2NtcCk7Cit9CisKK3ZvaWQgX19leGl0IGllZWU4MDIxMV9jcnlwdG9fY2NtcF9leGl0KHZvaWQpCit7CisJaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X2NjbXApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MWI5OTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMKQEAgLTAsMCArMSw3ODAgQEAKKy8qCisgKiBIb3N0IEFQIGNyeXB0OiBob3N0LWJhc2VkIFRLSVAgZW5jcnlwdGlvbiBpbXBsZW1lbnRhdGlvbiBmb3IgSG9zdCBBUCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCwgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorCSNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisKK01PRFVMRV9BVVRIT1IoIkpvdW5pIE1hbGluZW4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSG9zdCBBUCBjcnlwdDogVEtJUCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSB7CisjZGVmaW5lIFRLSVBfS0VZX0xFTiAzMgorCXU4IGtleVtUS0lQX0tFWV9MRU5dOworCWludCBrZXlfc2V0OworCisJdTMyIHR4X2l2MzI7CisJdTE2IHR4X2l2MTY7CisJdTE2IHR4X3R0YWtbNV07CisJaW50IHR4X3BoYXNlMV9kb25lOworCisJdTMyIHJ4X2l2MzI7CisJdTE2IHJ4X2l2MTY7CisJdTE2IHJ4X3R0YWtbNV07CisJaW50IHJ4X3BoYXNlMV9kb25lOworCXUzMiByeF9pdjMyX25ldzsKKwl1MTYgcnhfaXYxNl9uZXc7CisKKwl1MzIgZG90MTFSU05BU3RhdHNUS0lQUmVwbGF5czsKKwl1MzIgZG90MTFSU05BU3RhdHNUS0lQSUNWRXJyb3JzOworCXUzMiBkb3QxMVJTTkFTdGF0c1RLSVBMb2NhbE1JQ0ZhaWx1cmVzOworCisJaW50IGtleV9pZHg7CisKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqcnhfdGZtX2FyYzQ7CisJc3RydWN0IGNyeXB0b19oYXNoICpyeF90Zm1fbWljaGFlbDsKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdHhfdGZtX2FyYzQ7CisJc3RydWN0IGNyeXB0b19oYXNoICp0eF90Zm1fbWljaGFlbDsKKworCS8qIHNjcmF0Y2ggYnVmZmVycyBmb3IgdmlydF90b19wYWdlKCkgKGNyeXB0byBBUEkpICovCisJdTggcnhfaGRyWzE2XSwgdHhfaGRyWzE2XTsKK307CisKK3N0YXRpYyB2b2lkICogaWVlZTgwMjExX3RraXBfaW5pdChpbnQga2V5X2lkeCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqcHJpdjsKKworCXByaXYgPSBrbWFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9BVE9NSUMpOworCWlmIChwcml2ID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKwltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKCpwcml2KSk7CisJcHJpdi0+a2V5X2lkeCA9IGtleV9pZHg7CisKKwlwcml2LT50eF90Zm1fYXJjNCA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImVjYihhcmM0KSIsIDAsCisJCQlDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHByaXYtPnR4X3RmbV9hcmM0KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCQkJImNyeXB0byBBUEkgYXJjNFxuIik7CisJCXByaXYtPnR4X3RmbV9hcmM0ID0gTlVMTDsKKwkJZ290byBmYWlsOworCX0KKworCXByaXYtPnR4X3RmbV9taWNoYWVsID0gY3J5cHRvX2FsbG9jX2hhc2goIm1pY2hhZWxfbWljIiwgMCwKKwkJCUNSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+dHhfdGZtX21pY2hhZWwpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJCQkiY3J5cHRvIEFQSSBtaWNoYWVsX21pY1xuIik7CisJCXByaXYtPnR4X3RmbV9taWNoYWVsID0gTlVMTDsKKwkJZ290byBmYWlsOworCX0KKworCXByaXYtPnJ4X3RmbV9hcmM0ID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFyYzQpIiwgMCwKKwkJCUNSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+cnhfdGZtX2FyYzQpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJCQkiY3J5cHRvIEFQSSBhcmM0XG4iKTsKKwkJcHJpdi0+cnhfdGZtX2FyYzQgPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCisJcHJpdi0+cnhfdGZtX21pY2hhZWwgPSBjcnlwdG9fYWxsb2NfaGFzaCgibWljaGFlbF9taWMiLCAwLAorCQkJQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihwcml2LT5yeF90Zm1fbWljaGFlbCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkJCSJjcnlwdG8gQVBJIG1pY2hhZWxfbWljXG4iKTsKKwkJcHJpdi0+cnhfdGZtX21pY2hhZWwgPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIHByaXY7CisKK2ZhaWw6CisJaWYgKHByaXYpIHsKKwkJaWYgKHByaXYtPnR4X3RmbV9taWNoYWVsKQorCQkJY3J5cHRvX2ZyZWVfaGFzaChwcml2LT50eF90Zm1fbWljaGFlbCk7CisJCWlmIChwcml2LT50eF90Zm1fYXJjNCkKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihwcml2LT50eF90Zm1fYXJjNCk7CisJCWlmIChwcml2LT5yeF90Zm1fbWljaGFlbCkKKwkJCWNyeXB0b19mcmVlX2hhc2gocHJpdi0+cnhfdGZtX21pY2hhZWwpOworCQlpZiAocHJpdi0+cnhfdGZtX2FyYzQpCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIocHJpdi0+cnhfdGZtX2FyYzQpOworCQlrZnJlZShwcml2KTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfdGtpcF9kZWluaXQodm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqX3ByaXYgPSBwcml2OworCisJaWYgKF9wcml2KSB7CisJCWlmIChfcHJpdi0+dHhfdGZtX21pY2hhZWwpCisJCQljcnlwdG9fZnJlZV9oYXNoKF9wcml2LT50eF90Zm1fbWljaGFlbCk7CisJCWlmIChfcHJpdi0+dHhfdGZtX2FyYzQpCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIoX3ByaXYtPnR4X3RmbV9hcmM0KTsKKwkJaWYgKF9wcml2LT5yeF90Zm1fbWljaGFlbCkKKwkJCWNyeXB0b19mcmVlX2hhc2goX3ByaXYtPnJ4X3RmbV9taWNoYWVsKTsKKwkJaWYgKF9wcml2LT5yeF90Zm1fYXJjNCkKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihfcHJpdi0+cnhfdGZtX2FyYzQpOworCX0KKwlrZnJlZShwcml2KTsKK30KKworCitzdGF0aWMgaW5saW5lIHUxNiBSb3RSMSh1MTYgdmFsKQoreworCXJldHVybiAodmFsID4+IDEpIHwgKHZhbCA8PCAxNSk7Cit9CisKKworc3RhdGljIGlubGluZSB1OCBMbzgodTE2IHZhbCkKK3sKKwlyZXR1cm4gdmFsICYgMHhmZjsKK30KKworCitzdGF0aWMgaW5saW5lIHU4IEhpOCh1MTYgdmFsKQoreworCXJldHVybiB2YWwgPj4gODsKK30KKworCitzdGF0aWMgaW5saW5lIHUxNiBMbzE2KHUzMiB2YWwpCit7CisJcmV0dXJuIHZhbCAmIDB4ZmZmZjsKK30KKworCitzdGF0aWMgaW5saW5lIHUxNiBIaTE2KHUzMiB2YWwpCit7CisJcmV0dXJuIHZhbCA+PiAxNjsKK30KKworCitzdGF0aWMgaW5saW5lIHUxNiBNazE2KHU4IGhpLCB1OCBsbykKK3sKKwlyZXR1cm4gbG8gfCAoKCh1MTYpIGhpKSA8PCA4KTsKK30KKworCitzdGF0aWMgaW5saW5lIHUxNiBNazE2X2xlKHUxNiAqdikKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUoKnYpOworfQorCisKK3N0YXRpYyBjb25zdCB1MTYgU2JveFsyNTZdID0KK3sKKwkweEM2QTUsIDB4Rjg4NCwgMHhFRTk5LCAweEY2OEQsIDB4RkYwRCwgMHhENkJELCAweERFQjEsIDB4OTE1NCwKKwkweDYwNTAsIDB4MDIwMywgMHhDRUE5LCAweDU2N0QsIDB4RTcxOSwgMHhCNTYyLCAweDRERTYsIDB4RUM5QSwKKwkweDhGNDUsIDB4MUY5RCwgMHg4OTQwLCAweEZBODcsIDB4RUYxNSwgMHhCMkVCLCAweDhFQzksIDB4RkIwQiwKKwkweDQxRUMsIDB4QjM2NywgMHg1RkZELCAweDQ1RUEsIDB4MjNCRiwgMHg1M0Y3LCAweEU0OTYsIDB4OUI1QiwKKwkweDc1QzIsIDB4RTExQywgMHgzREFFLCAweDRDNkEsIDB4NkM1QSwgMHg3RTQxLCAweEY1MDIsIDB4ODM0RiwKKwkweDY4NUMsIDB4NTFGNCwgMHhEMTM0LCAweEY5MDgsIDB4RTI5MywgMHhBQjczLCAweDYyNTMsIDB4MkEzRiwKKwkweDA4MEMsIDB4OTU1MiwgMHg0NjY1LCAweDlENUUsIDB4MzAyOCwgMHgzN0ExLCAweDBBMEYsIDB4MkZCNSwKKwkweDBFMDksIDB4MjQzNiwgMHgxQjlCLCAweERGM0QsIDB4Q0QyNiwgMHg0RTY5LCAweDdGQ0QsIDB4RUE5RiwKKwkweDEyMUIsIDB4MUQ5RSwgMHg1ODc0LCAweDM0MkUsIDB4MzYyRCwgMHhEQ0IyLCAweEI0RUUsIDB4NUJGQiwKKwkweEE0RjYsIDB4NzY0RCwgMHhCNzYxLCAweDdEQ0UsIDB4NTI3QiwgMHhERDNFLCAweDVFNzEsIDB4MTM5NywKKwkweEE2RjUsIDB4Qjk2OCwgMHgwMDAwLCAweEMxMkMsIDB4NDA2MCwgMHhFMzFGLCAweDc5QzgsIDB4QjZFRCwKKwkweEQ0QkUsIDB4OEQ0NiwgMHg2N0Q5LCAweDcyNEIsIDB4OTRERSwgMHg5OEQ0LCAweEIwRTgsIDB4ODU0QSwKKwkweEJCNkIsIDB4QzUyQSwgMHg0RkU1LCAweEVEMTYsIDB4ODZDNSwgMHg5QUQ3LCAweDY2NTUsIDB4MTE5NCwKKwkweDhBQ0YsIDB4RTkxMCwgMHgwNDA2LCAweEZFODEsIDB4QTBGMCwgMHg3ODQ0LCAweDI1QkEsIDB4NEJFMywKKwkweEEyRjMsIDB4NURGRSwgMHg4MEMwLCAweDA1OEEsIDB4M0ZBRCwgMHgyMUJDLCAweDcwNDgsIDB4RjEwNCwKKwkweDYzREYsIDB4NzdDMSwgMHhBRjc1LCAweDQyNjMsIDB4MjAzMCwgMHhFNTFBLCAweEZEMEUsIDB4QkY2RCwKKwkweDgxNEMsIDB4MTgxNCwgMHgyNjM1LCAweEMzMkYsIDB4QkVFMSwgMHgzNUEyLCAweDg4Q0MsIDB4MkUzOSwKKwkweDkzNTcsIDB4NTVGMiwgMHhGQzgyLCAweDdBNDcsIDB4QzhBQywgMHhCQUU3LCAweDMyMkIsIDB4RTY5NSwKKwkweEMwQTAsIDB4MTk5OCwgMHg5RUQxLCAweEEzN0YsIDB4NDQ2NiwgMHg1NDdFLCAweDNCQUIsIDB4MEI4MywKKwkweDhDQ0EsIDB4QzcyOSwgMHg2QkQzLCAweDI4M0MsIDB4QTc3OSwgMHhCQ0UyLCAweDE2MUQsIDB4QUQ3NiwKKwkweERCM0IsIDB4NjQ1NiwgMHg3NDRFLCAweDE0MUUsIDB4OTJEQiwgMHgwQzBBLCAweDQ4NkMsIDB4QjhFNCwKKwkweDlGNUQsIDB4QkQ2RSwgMHg0M0VGLCAweEM0QTYsIDB4MzlBOCwgMHgzMUE0LCAweEQzMzcsIDB4RjI4QiwKKwkweEQ1MzIsIDB4OEI0MywgMHg2RTU5LCAweERBQjcsIDB4MDE4QywgMHhCMTY0LCAweDlDRDIsIDB4NDlFMCwKKwkweEQ4QjQsIDB4QUNGQSwgMHhGMzA3LCAweENGMjUsIDB4Q0FBRiwgMHhGNDhFLCAweDQ3RTksIDB4MTAxOCwKKwkweDZGRDUsIDB4RjA4OCwgMHg0QTZGLCAweDVDNzIsIDB4MzgyNCwgMHg1N0YxLCAweDczQzcsIDB4OTc1MSwKKwkweENCMjMsIDB4QTE3QywgMHhFODlDLCAweDNFMjEsIDB4OTZERCwgMHg2MURDLCAweDBEODYsIDB4MEY4NSwKKwkweEUwOTAsIDB4N0M0MiwgMHg3MUM0LCAweENDQUEsIDB4OTBEOCwgMHgwNjA1LCAweEY3MDEsIDB4MUMxMiwKKwkweEMyQTMsIDB4NkE1RiwgMHhBRUY5LCAweDY5RDAsIDB4MTc5MSwgMHg5OTU4LCAweDNBMjcsIDB4MjdCOSwKKwkweEQ5MzgsIDB4RUIxMywgMHgyQkIzLCAweDIyMzMsIDB4RDJCQiwgMHhBOTcwLCAweDA3ODksIDB4MzNBNywKKwkweDJEQjYsIDB4M0MyMiwgMHgxNTkyLCAweEM5MjAsIDB4ODc0OSwgMHhBQUZGLCAweDUwNzgsIDB4QTU3QSwKKwkweDAzOEYsIDB4NTlGOCwgMHgwOTgwLCAweDFBMTcsIDB4NjVEQSwgMHhENzMxLCAweDg0QzYsIDB4RDBCOCwKKwkweDgyQzMsIDB4MjlCMCwgMHg1QTc3LCAweDFFMTEsIDB4N0JDQiwgMHhBOEZDLCAweDZERDYsIDB4MkMzQSwKK307CisKKworc3RhdGljIGlubGluZSB1MTYgX1NfKHUxNiB2KQoreworCXUxNiB0ID0gU2JveFtIaTgodildOworCXJldHVybiBTYm94W0xvOCh2KV0gXiAoKHQgPDwgOCkgfCAodCA+PiA4KSk7Cit9CisKKworI2RlZmluZSBQSEFTRTFfTE9PUF9DT1VOVCA4CisKKworc3RhdGljIHZvaWQgdGtpcF9taXhpbmdfcGhhc2UxKHUxNiAqVFRBSywgY29uc3QgdTggKlRLLCBjb25zdCB1OCAqVEEsIHUzMiBJVjMyKQoreworCWludCBpLCBqOworCisJLyogSW5pdGlhbGl6ZSB0aGUgODAtYml0IFRUQUsgZnJvbSBUU0MgKElWMzIpIGFuZCBUQVswLi41XSAqLworCVRUQUtbMF0gPSBMbzE2KElWMzIpOworCVRUQUtbMV0gPSBIaTE2KElWMzIpOworCVRUQUtbMl0gPSBNazE2KFRBWzFdLCBUQVswXSk7CisJVFRBS1szXSA9IE1rMTYoVEFbM10sIFRBWzJdKTsKKwlUVEFLWzRdID0gTWsxNihUQVs1XSwgVEFbNF0pOworCisJZm9yIChpID0gMDsgaSA8IFBIQVNFMV9MT09QX0NPVU5UOyBpKyspIHsKKwkJaiA9IDIgKiAoaSAmIDEpOworCQlUVEFLWzBdICs9IF9TXyhUVEFLWzRdIF4gTWsxNihUS1sxICsgal0sIFRLWzAgKyBqXSkpOworCQlUVEFLWzFdICs9IF9TXyhUVEFLWzBdIF4gTWsxNihUS1s1ICsgal0sIFRLWzQgKyBqXSkpOworCQlUVEFLWzJdICs9IF9TXyhUVEFLWzFdIF4gTWsxNihUS1s5ICsgal0sIFRLWzggKyBqXSkpOworCQlUVEFLWzNdICs9IF9TXyhUVEFLWzJdIF4gTWsxNihUS1sxMyArIGpdLCBUS1sxMiArIGpdKSk7CisJCVRUQUtbNF0gKz0gX1NfKFRUQUtbM10gXiBNazE2KFRLWzEgKyBqXSwgVEtbMCArIGpdKSkgKyBpOworCX0KK30KKworCitzdGF0aWMgdm9pZCB0a2lwX21peGluZ19waGFzZTIodTggKldFUFNlZWQsIGNvbnN0IHU4ICpUSywgY29uc3QgdTE2ICpUVEFLLAorCQkJICAgICAgIHUxNiBJVjE2KQoreworCS8qIE1ha2UgdGVtcG9yYXJ5IGFyZWEgb3ZlcmxhcCBXRVAgc2VlZCBzbyB0aGF0IHRoZSBmaW5hbCBjb3B5IGNhbiBiZQorCSAqIGF2b2lkZWQgb24gbGl0dGxlIGVuZGlhbiBob3N0cy4gKi8KKwl1MTYgKlBQSyA9ICh1MTYgKikgJldFUFNlZWRbNF07CisKKwkvKiBTdGVwIDEgLSBtYWtlIGNvcHkgb2YgVFRBSyBhbmQgYnJpbmcgaW4gVFNDICovCisJUFBLWzBdID0gVFRBS1swXTsKKwlQUEtbMV0gPSBUVEFLWzFdOworCVBQS1syXSA9IFRUQUtbMl07CisJUFBLWzNdID0gVFRBS1szXTsKKwlQUEtbNF0gPSBUVEFLWzRdOworCVBQS1s1XSA9IFRUQUtbNF0gKyBJVjE2OworCisJLyogU3RlcCAyIC0gOTYtYml0IGJpamVjdGl2ZSBtaXhpbmcgdXNpbmcgUy1ib3ggKi8KKwlQUEtbMF0gKz0gX1NfKFBQS1s1XSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbMF0pKTsKKwlQUEtbMV0gKz0gX1NfKFBQS1swXSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbMl0pKTsKKwlQUEtbMl0gKz0gX1NfKFBQS1sxXSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbNF0pKTsKKwlQUEtbM10gKz0gX1NfKFBQS1syXSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbNl0pKTsKKwlQUEtbNF0gKz0gX1NfKFBQS1szXSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbOF0pKTsKKwlQUEtbNV0gKz0gX1NfKFBQS1s0XSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbMTBdKSk7CisKKwlQUEtbMF0gKz0gUm90UjEoUFBLWzVdIF4gTWsxNl9sZSgodTE2ICopICZUS1sxMl0pKTsKKwlQUEtbMV0gKz0gUm90UjEoUFBLWzBdIF4gTWsxNl9sZSgodTE2ICopICZUS1sxNF0pKTsKKwlQUEtbMl0gKz0gUm90UjEoUFBLWzFdKTsKKwlQUEtbM10gKz0gUm90UjEoUFBLWzJdKTsKKwlQUEtbNF0gKz0gUm90UjEoUFBLWzNdKTsKKwlQUEtbNV0gKz0gUm90UjEoUFBLWzRdKTsKKworCS8qIFN0ZXAgMyAtIGJyaW5nIGluIGxhc3Qgb2YgVEsgYml0cywgYXNzaWduIDI0LWJpdCBXRVAgSVYgdmFsdWUKKwkgKiBXRVBTZWVkWzAuLjJdIGlzIHRyYW5zbWl0dGVkIGFzIFdFUCBJViAqLworCVdFUFNlZWRbMF0gPSBIaTgoSVYxNik7CisJV0VQU2VlZFsxXSA9IChIaTgoSVYxNikgfCAweDIwKSAmIDB4N0Y7CisJV0VQU2VlZFsyXSA9IExvOChJVjE2KTsKKwlXRVBTZWVkWzNdID0gTG84KChQUEtbNV0gXiBNazE2X2xlKCh1MTYgKikgJlRLWzBdKSkgPj4gMSk7CisKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwl7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJUFBLW2ldID0gKFBQS1tpXSA8PCA4KSB8IChQUEtbaV0gPj4gOCk7CisJfQorI2VuZGlmCit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfdGtpcF9lbmNyeXB0KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKwkJaW50IGxlbjsKKwl1OCAqcG9zOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHI7CisJY2JfZGVzYyAqdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjID0gey50Zm0gPSB0a2V5LT50eF90Zm1fYXJjNH07CisJaW50IHJldCA9IDA7CisJdTggcmM0a2V5WzE2XSwgICppY3Y7CisJdTMyIGNyYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisKKwlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCA4IHx8IHNrYl90YWlscm9vbShza2IpIDwgNCB8fAorCSAgICBza2ItPmxlbiA8IGhkcl9sZW4pCisJCXJldHVybiAtMTsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CisKKwlpZiAoIXRjYl9kZXNjLT5iSHdTZWMpCisJeworCQlpZiAoIXRrZXktPnR4X3BoYXNlMV9kb25lKSB7CisJCQl0a2lwX21peGluZ19waGFzZTEodGtleS0+dHhfdHRhaywgdGtleS0+a2V5LCBoZHItPmFkZHIyLAorCQkJCQl0a2V5LT50eF9pdjMyKTsKKwkJCXRrZXktPnR4X3BoYXNlMV9kb25lID0gMTsKKwkJfQorCQl0a2lwX21peGluZ19waGFzZTIocmM0a2V5LCB0a2V5LT5rZXksIHRrZXktPnR4X3R0YWssIHRrZXktPnR4X2l2MTYpOworCX0KKwllbHNlCisJdGtleS0+dHhfcGhhc2UxX2RvbmUgPSAxOworCisKKwlsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW47CisJcG9zID0gc2tiX3B1c2goc2tiLCA4KTsKKwltZW1tb3ZlKHBvcywgcG9zICsgOCwgaGRyX2xlbik7CisJcG9zICs9IGhkcl9sZW47CisKKwlpZiAodGNiX2Rlc2MtPmJId1NlYykKKwl7CisJCSpwb3MrKyA9IEhpOCh0a2V5LT50eF9pdjE2KTsKKwkJKnBvcysrID0gKEhpOCh0a2V5LT50eF9pdjE2KSB8IDB4MjApICYgMHg3RjsKKwkJKnBvcysrID0gTG84KHRrZXktPnR4X2l2MTYpOworCX0KKwllbHNlCisJeworCQkqcG9zKysgPSByYzRrZXlbMF07CisJCSpwb3MrKyA9IHJjNGtleVsxXTsKKwkJKnBvcysrID0gcmM0a2V5WzJdOworCX0KKworCSpwb3MrKyA9ICh0a2V5LT5rZXlfaWR4IDw8IDYpIHwgKDEgPDwgNSkgLyogRXh0IElWIGluY2x1ZGVkICovOworCSpwb3MrKyA9IHRrZXktPnR4X2l2MzIgJiAweGZmOworCSpwb3MrKyA9ICh0a2V5LT50eF9pdjMyID4+IDgpICYgMHhmZjsKKwkqcG9zKysgPSAodGtleS0+dHhfaXYzMiA+PiAxNikgJiAweGZmOworCSpwb3MrKyA9ICh0a2V5LT50eF9pdjMyID4+IDI0KSAmIDB4ZmY7CisKKwlpZiAoIXRjYl9kZXNjLT5iSHdTZWMpCisJeworCQlpY3YgPSBza2JfcHV0KHNrYiwgNCk7CisJCWNyYyA9IH5jcmMzMl9sZSh+MCwgcG9zLCBsZW4pOworCQlpY3ZbMF0gPSBjcmM7CisJCWljdlsxXSA9IGNyYyA+PiA4OworCQlpY3ZbMl0gPSBjcmMgPj4gMTY7CisJCWljdlszXSA9IGNyYyA+PiAyNDsKKwkJY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkodGtleS0+dHhfdGZtX2FyYzQsIHJjNGtleSwgMTYpOworCQlzZ19pbml0X29uZSgmc2csIHBvcywgbGVuKzQpOworCQlyZXQ9IGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZGVzYywgJnNnLCAmc2csIGxlbiArIDQpOworCX0KKworCXRrZXktPnR4X2l2MTYrKzsKKwlpZiAodGtleS0+dHhfaXYxNiA9PSAwKSB7CisJCXRrZXktPnR4X3BoYXNlMV9kb25lID0gMDsKKwkJdGtleS0+dHhfaXYzMisrOworCX0KKworCWlmICghdGNiX2Rlc2MtPmJId1NlYykKKwkJcmV0dXJuIHJldDsKKwllbHNlCisJCXJldHVybiAwOworCisKK30KKworc3RhdGljIGludCBpZWVlODAyMTFfdGtpcF9kZWNyeXB0KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKwl1OCBrZXlpZHgsICpwb3M7CisJdTMyIGl2MzI7CisJdTE2IGl2MTY7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjsKKwljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2MgPSB7LnRmbSA9IHRrZXktPnJ4X3RmbV9hcmM0fTsKKwl1OCByYzRrZXlbMTZdOworCXU4IGljdls0XTsKKwl1MzIgY3JjOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKwlpbnQgcGxlbjsKKwlpZiAoc2tiLT5sZW4gPCBoZHJfbGVuICsgOCArIDQpCisJCXJldHVybiAtMTsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CisJcG9zID0gc2tiLT5kYXRhICsgaGRyX2xlbjsKKwlrZXlpZHggPSBwb3NbM107CisJaWYgKCEoa2V5aWR4ICYgKDEgPDwgNSkpKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJUS0lQOiByZWNlaXZlZCBwYWNrZXQgd2l0aG91dCBFeHRJViIKKwkJCSAgICAgICAiIGZsYWcgZnJvbSAiIE1BQ19GTVQgIlxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCX0KKwkJcmV0dXJuIC0yOworCX0KKwlrZXlpZHggPj49IDY7CisJaWYgKHRrZXktPmtleV9pZHggIT0ga2V5aWR4KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJUS0lQOiBSWCB0a2V5LT5rZXlfaWR4PSVkIGZyYW1lICIKKwkJICAgICAgICJrZXlpZHg9JWQgcHJpdj0lcFxuIiwgdGtleS0+a2V5X2lkeCwga2V5aWR4LCBwcml2KTsKKwkJcmV0dXJuIC02OworCX0KKwlpZiAoIXRrZXktPmtleV9zZXQpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IHJlY2VpdmVkIHBhY2tldCBmcm9tICIgTUFDX0ZNVAorCQkJICAgICAgICIgd2l0aCBrZXlpZD0lZCB0aGF0IGRvZXMgbm90IGhhdmUgYSBjb25maWd1cmVkIgorCQkJICAgICAgICIga2V5XG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpLCBrZXlpZHgpOworCQl9CisJCXJldHVybiAtMzsKKwl9CisJaXYxNiA9IChwb3NbMF0gPDwgOCkgfCBwb3NbMl07CisJaXYzMiA9IHBvc1s0XSB8IChwb3NbNV0gPDwgOCkgfCAocG9zWzZdIDw8IDE2KSB8IChwb3NbN10gPDwgMjQpOworCXBvcyArPSA4OworCisJaWYgKCF0Y2JfZGVzYy0+Ykh3U2VjKQorCXsKKwkJaWYgKGl2MzIgPCB0a2V5LT5yeF9pdjMyIHx8CisJCShpdjMyID09IHRrZXktPnJ4X2l2MzIgJiYgaXYxNiA8PSB0a2V5LT5yeF9pdjE2KSkgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICJUS0lQOiByZXBsYXkgZGV0ZWN0ZWQ6IFNUQT0iIE1BQ19GTVQKKwkJCQkiIHByZXZpb3VzIFRTQyAlMDh4JTA0eCByZWNlaXZlZCBUU0MgIgorCQkJCSIlMDh4JTA0eFxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSwKKwkJCQl0a2V5LT5yeF9pdjMyLCB0a2V5LT5yeF9pdjE2LCBpdjMyLCBpdjE2KTsKKwkJCX0KKwkJCXRrZXktPmRvdDExUlNOQVN0YXRzVEtJUFJlcGxheXMrKzsKKwkJCXJldHVybiAtNDsKKwkJfQorCisJCWlmIChpdjMyICE9IHRrZXktPnJ4X2l2MzIgfHwgIXRrZXktPnJ4X3BoYXNlMV9kb25lKSB7CisJCQl0a2lwX21peGluZ19waGFzZTEodGtleS0+cnhfdHRhaywgdGtleS0+a2V5LCBoZHItPmFkZHIyLCBpdjMyKTsKKwkJCXRrZXktPnJ4X3BoYXNlMV9kb25lID0gMTsKKwkJfQorCQl0a2lwX21peGluZ19waGFzZTIocmM0a2V5LCB0a2V5LT5rZXksIHRrZXktPnJ4X3R0YWssIGl2MTYpOworCisJCXBsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW4gLSAxMjsKKworCQljcnlwdG9fYmxrY2lwaGVyX3NldGtleSh0a2V5LT5yeF90Zm1fYXJjNCwgcmM0a2V5LCAxNik7CisJCXNnX2luaXRfb25lKCZzZywgcG9zLCBwbGVuKzQpOworCisJCWlmIChjcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHQoJmRlc2MsICZzZywgJnNnLCBwbGVuICsgNCkpIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiOiBUS0lQOiBmYWlsZWQgdG8gZGVjcnlwdCAiCisJCQkJCQkicmVjZWl2ZWQgcGFja2V0IGZyb20gIiBNQUNfRk1UICJcbiIsCisJCQkJCQlNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJCX0KKwkJCXJldHVybiAtNzsKKwkJfQorCisJCWNyYyA9IH5jcmMzMl9sZSh+MCwgcG9zLCBwbGVuKTsKKwkJaWN2WzBdID0gY3JjOworCQlpY3ZbMV0gPSBjcmMgPj4gODsKKwkJaWN2WzJdID0gY3JjID4+IDE2OworCQlpY3ZbM10gPSBjcmMgPj4gMjQ7CisKKwkJaWYgKG1lbWNtcChpY3YsIHBvcyArIHBsZW4sIDQpICE9IDApIHsKKwkJCWlmIChpdjMyICE9IHRrZXktPnJ4X2l2MzIpIHsKKwkJCQkvKiBQcmV2aW91c2x5IGNhY2hlZCBQaGFzZTEgcmVzdWx0IHdhcyBhbHJlYWR5IGxvc3QsIHNvCisJCQkJKiBpdCBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQgZm9yIHRoZSBuZXh0IHBhY2tldC4gKi8KKwkJCQl0a2V5LT5yeF9waGFzZTFfZG9uZSA9IDA7CisJCQl9CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IElDViBlcnJvciBkZXRlY3RlZDogU1RBPSIKKwkJCQlNQUNfRk1UICJcbiIsIE1BQ19BUkcoaGRyLT5hZGRyMikpOworCQkJfQorCQkJdGtleS0+ZG90MTFSU05BU3RhdHNUS0lQSUNWRXJyb3JzKys7CisJCQlyZXR1cm4gLTU7CisJCX0KKworCX0KKworCS8qIFVwZGF0ZSByZWFsIGNvdW50ZXJzIG9ubHkgYWZ0ZXIgTWljaGFlbCBNSUMgdmVyaWZpY2F0aW9uIGhhcworCSAqIGNvbXBsZXRlZCAqLworCXRrZXktPnJ4X2l2MzJfbmV3ID0gaXYzMjsKKwl0a2V5LT5yeF9pdjE2X25ldyA9IGl2MTY7CisKKwkvKiBSZW1vdmUgSVYgYW5kIElDViAqLworCW1lbW1vdmUoc2tiLT5kYXRhICsgOCwgc2tiLT5kYXRhLCBoZHJfbGVuKTsKKwlza2JfcHVsbChza2IsIDgpOworCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSA0KTsKKworCXJldHVybiBrZXlpZHg7Cit9CisKK3N0YXRpYyBpbnQgbWljaGFlbF9taWMoc3RydWN0IGNyeXB0b19oYXNoICp0Zm1fbWljaGFlbCwgdTggKiBrZXksIHU4ICogaGRyLAorCQkgICAgICAgdTggKiBkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICogbWljKQoreworCXN0cnVjdCBoYXNoX2Rlc2MgZGVzYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMl07CisKKwlpZiAodGZtX21pY2hhZWwgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtaWNoYWVsX21pYzogdGZtX21pY2hhZWwgPT0gTlVMTFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzZ19pbml0X3RhYmxlKHNnLCAyKTsKKwlzZ19zZXRfYnVmKCZzZ1swXSwgaGRyLCAxNik7CisJc2dfc2V0X2J1Zigmc2dbMV0sIGRhdGEsIGRhdGFfbGVuKTsKKworCWlmIChjcnlwdG9faGFzaF9zZXRrZXkodGZtX21pY2hhZWwsIGtleSwgOCkpCisJCXJldHVybiAtMTsKKworCWRlc2MudGZtID0gdGZtX21pY2hhZWw7CisJZGVzYy5mbGFncyA9IDA7CisJcmV0dXJuIGNyeXB0b19oYXNoX2RpZ2VzdCgmZGVzYywgc2csIGRhdGFfbGVuICsgMTYsIG1pYyk7Cit9CisKK3N0YXRpYyB2b2lkIG1pY2hhZWxfbWljX2hkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqaGRyKQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHIxMTsKKworCWhkcjExID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwlzd2l0Y2ggKGxlMTZfdG9fY3B1KGhkcjExLT5mcmFtZV9jdGwpICYKKwkJKElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFMpKSB7CisJY2FzZSBJRUVFODAyMTFfRkNUTF9UT0RTOgorCQltZW1jcHkoaGRyLCBoZHIxMS0+YWRkcjMsIEVUSF9BTEVOKTsgLyogREEgKi8KKwkJbWVtY3B5KGhkciArIEVUSF9BTEVOLCBoZHIxMS0+YWRkcjIsIEVUSF9BTEVOKTsgLyogU0EgKi8KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRkNUTF9GUk9NRFM6CisJCW1lbWNweShoZHIsIGhkcjExLT5hZGRyMSwgRVRIX0FMRU4pOyAvKiBEQSAqLworCQltZW1jcHkoaGRyICsgRVRIX0FMRU4sIGhkcjExLT5hZGRyMywgRVRIX0FMRU4pOyAvKiBTQSAqLworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFM6CisJCW1lbWNweShoZHIsIGhkcjExLT5hZGRyMywgRVRIX0FMRU4pOyAvKiBEQSAqLworCQltZW1jcHkoaGRyICsgRVRIX0FMRU4sIGhkcjExLT5hZGRyNCwgRVRIX0FMRU4pOyAvKiBTQSAqLworCQlicmVhazsKKwljYXNlIDA6CisJCW1lbWNweShoZHIsIGhkcjExLT5hZGRyMSwgRVRIX0FMRU4pOyAvKiBEQSAqLworCQltZW1jcHkoaGRyICsgRVRIX0FMRU4sIGhkcjExLT5hZGRyMiwgRVRIX0FMRU4pOyAvKiBTQSAqLworCQlicmVhazsKKwl9CisKKwloZHJbMTJdID0gMDsgLyogcHJpb3JpdHkgKi8KKworCWhkclsxM10gPSBoZHJbMTRdID0gaGRyWzE1XSA9IDA7IC8qIHJlc2VydmVkICovCit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfbWljaGFlbF9taWNfYWRkKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKwl1OCAqcG9zOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHI7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKikgc2tiLT5kYXRhOworCisJaWYgKHNrYl90YWlscm9vbShza2IpIDwgOCB8fCBza2ItPmxlbiA8IGhkcl9sZW4pIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkludmFsaWQgcGFja2V0IGZvciBNaWNoYWVsIE1JQyBhZGQgIgorCQkgICAgICAgIih0YWlscm9vbT0lZCBoZHJfbGVuPSVkIHNrYi0+bGVuPSVkKVxuIiwKKwkJICAgICAgIHNrYl90YWlscm9vbShza2IpLCBoZHJfbGVuLCBza2ItPmxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwltaWNoYWVsX21pY19oZHIoc2tiLCB0a2V5LT50eF9oZHIpOworCisJLy8geyBkYXZpZCwgMjAwNi45LjEKKwkvLyBmaXggdGhlIHdwYSBwcm9jZXNzIHdpdGggd21tIGVuYWJsZWQuCisJaWYoSUVFRTgwMjExX1FPU19IQVNfU0VRKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSkpIHsKKwkJdGtleS0+dHhfaGRyWzEyXSA9ICooc2tiLT5kYXRhICsgaGRyX2xlbiAtIDIpICYgMHgwNzsKKwl9CisJLy8gfQorCXBvcyA9IHNrYl9wdXQoc2tiLCA4KTsKKworCWlmIChtaWNoYWVsX21pYyh0a2V5LT50eF90Zm1fbWljaGFlbCwgJnRrZXktPmtleVsxNl0sIHRrZXktPnR4X2hkciwKKwkJCQlza2ItPmRhdGEgKyBoZHJfbGVuLCBza2ItPmxlbiAtIDggLSBoZHJfbGVuLCBwb3MpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaWVlZTgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkciwKKwkJCQkgICAgICAgaW50IGtleWlkeCkKK3sKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJc3RydWN0IGl3X21pY2hhZWxtaWNmYWlsdXJlIGV2OworCisJLyogVE9ETzogbmVlZGVkIHBhcmFtZXRlcnM6IGNvdW50LCBrZXlpZCwga2V5IHR5cGUsIFRTQyAqLworCW1lbXNldCgmZXYsIDAsIHNpemVvZihldikpOworCWV2LmZsYWdzID0ga2V5aWR4ICYgSVdfTUlDRkFJTFVSRV9LRVlfSUQ7CisJaWYgKGhkci0+YWRkcjFbMF0gJiAweDAxKQorCQlldi5mbGFncyB8PSBJV19NSUNGQUlMVVJFX0dST1VQOworCWVsc2UKKwkJZXYuZmxhZ3MgfD0gSVdfTUlDRkFJTFVSRV9QQUlSV0lTRTsKKwlldi5zcmNfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJbWVtY3B5KGV2LnNyY19hZGRyLnNhX2RhdGEsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJd3JxdS5kYXRhLmxlbmd0aCA9IHNpemVvZihldik7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZNSUNIQUVMTUlDRkFJTFVSRSwgJndycXUsIChjaGFyICopICZldik7Cit9CisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX21pY2hhZWxfbWljX3ZlcmlmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQga2V5aWR4LAorCQkJCSAgICAgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXkgPSBwcml2OworCXU4IG1pY1s4XTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKworCWlmICghdGtleS0+a2V5X3NldCkKKwkJcmV0dXJuIC0xOworCisJbWljaGFlbF9taWNfaGRyKHNrYiwgdGtleS0+cnhfaGRyKTsKKwkvLyB7IGRhdmlkLCAyMDA2LjkuMQorCS8vIGZpeCB0aGUgd3BhIHByb2Nlc3Mgd2l0aCB3bW0gZW5hYmxlZC4KKwlpZihJRUVFODAyMTFfUU9TX0hBU19TRVEobGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKSkgeworCQl0a2V5LT5yeF9oZHJbMTJdID0gKihza2ItPmRhdGEgKyBoZHJfbGVuIC0gMikgJiAweDA3OworCX0KKwkvLyB9CisKKwlpZiAobWljaGFlbF9taWModGtleS0+cnhfdGZtX21pY2hhZWwsICZ0a2V5LT5rZXlbMjRdLCB0a2V5LT5yeF9oZHIsCisJCQkJc2tiLT5kYXRhICsgaGRyX2xlbiwgc2tiLT5sZW4gLSA4IC0gaGRyX2xlbiwgbWljKSkKKwkJcmV0dXJuIC0xOworCWlmIChtZW1jbXAobWljLCBza2ItPmRhdGEgKyBza2ItPmxlbiAtIDgsIDgpICE9IDApIHsKKwkJc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjsKKwkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNaWNoYWVsIE1JQyB2ZXJpZmljYXRpb24gZmFpbGVkIGZvciAiCisJCSAgICAgICAiTVNEVSBmcm9tICIgTUFDX0ZNVCAiIGtleWlkeD0lZFxuIiwKKwkJICAgICAgIHNrYi0+ZGV2ID8gc2tiLT5kZXYtPm5hbWUgOiAiTi9BIiwgTUFDX0FSRyhoZHItPmFkZHIyKSwKKwkJICAgICAgIGtleWlkeCk7CisJCWlmIChza2ItPmRldikKKwkJCWllZWU4MDIxMV9taWNoYWVsX21pY19mYWlsdXJlKHNrYi0+ZGV2LCBoZHIsIGtleWlkeCk7CisJCXRrZXktPmRvdDExUlNOQVN0YXRzVEtJUExvY2FsTUlDRmFpbHVyZXMrKzsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFVwZGF0ZSBUU0MgY291bnRlcnMgZm9yIFJYIG5vdyB0aGF0IHRoZSBwYWNrZXQgdmVyaWZpY2F0aW9uIGhhcworCSAqIGNvbXBsZXRlZC4gKi8KKwl0a2V5LT5yeF9pdjMyID0gdGtleS0+cnhfaXYzMl9uZXc7CisJdGtleS0+cnhfaXYxNiA9IHRrZXktPnJ4X2l2MTZfbmV3OworCisJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDgpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfdGtpcF9zZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisJaW50IGtleWlkeDsKKwlzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSA9IHRrZXktPnR4X3RmbV9taWNoYWVsOworCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0yID0gdGtleS0+dHhfdGZtX2FyYzQ7CisJc3RydWN0IGNyeXB0b19oYXNoICp0Zm0zID0gdGtleS0+cnhfdGZtX21pY2hhZWw7CisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbTQgPSB0a2V5LT5yeF90Zm1fYXJjNDsKKworCWtleWlkeCA9IHRrZXktPmtleV9pZHg7CisJbWVtc2V0KHRrZXksIDAsIHNpemVvZigqdGtleSkpOworCXRrZXktPmtleV9pZHggPSBrZXlpZHg7CisJdGtleS0+dHhfdGZtX21pY2hhZWwgPSB0Zm07CisJdGtleS0+dHhfdGZtX2FyYzQgPSB0Zm0yOworCXRrZXktPnJ4X3RmbV9taWNoYWVsID0gdGZtMzsKKwl0a2V5LT5yeF90Zm1fYXJjNCA9IHRmbTQ7CisKKwlpZiAobGVuID09IFRLSVBfS0VZX0xFTikgeworCQltZW1jcHkodGtleS0+a2V5LCBrZXksIFRLSVBfS0VZX0xFTik7CisJCXRrZXktPmtleV9zZXQgPSAxOworCQl0a2V5LT50eF9pdjE2ID0gMTsgLyogVFNDIGlzIGluaXRpYWxpemVkIHRvIDEgKi8KKwkJaWYgKHNlcSkgeworCQkJdGtleS0+cnhfaXYzMiA9IChzZXFbNV0gPDwgMjQpIHwgKHNlcVs0XSA8PCAxNikgfAorCQkJCShzZXFbM10gPDwgOCkgfCBzZXFbMl07CisJCQl0a2V5LT5yeF9pdjE2ID0gKHNlcVsxXSA8PCA4KSB8IHNlcVswXTsKKwkJfQorCX0gZWxzZSBpZiAobGVuID09IDApCisJCXRrZXktPmtleV9zZXQgPSAwOworCWVsc2UKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfdGtpcF9nZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisKKwlpZiAobGVuIDwgVEtJUF9LRVlfTEVOKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIXRrZXktPmtleV9zZXQpCisJCXJldHVybiAwOworCW1lbWNweShrZXksIHRrZXktPmtleSwgVEtJUF9LRVlfTEVOKTsKKworCWlmIChzZXEpIHsKKwkJLyogUmV0dXJuIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGxhc3QgdHJhbnNtaXR0ZWQgZnJhbWUuICovCisJCXUxNiBpdjE2ID0gdGtleS0+dHhfaXYxNjsKKwkJdTMyIGl2MzIgPSB0a2V5LT50eF9pdjMyOworCQlpZiAoaXYxNiA9PSAwKQorCQkJaXYzMi0tOworCQlpdjE2LS07CisJCXNlcVswXSA9IHRrZXktPnR4X2l2MTY7CisJCXNlcVsxXSA9IHRrZXktPnR4X2l2MTYgPj4gODsKKwkJc2VxWzJdID0gdGtleS0+dHhfaXYzMjsKKwkJc2VxWzNdID0gdGtleS0+dHhfaXYzMiA+PiA4OworCQlzZXFbNF0gPSB0a2V5LT50eF9pdjMyID4+IDE2OworCQlzZXFbNV0gPSB0a2V5LT50eF9pdjMyID4+IDI0OworCX0KKworCXJldHVybiBUS0lQX0tFWV9MRU47Cit9CisKKworc3RhdGljIGNoYXIgKiBpZWVlODAyMTFfdGtpcF9wcmludF9zdGF0cyhjaGFyICpwLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2lwID0gcHJpdjsKKwlwICs9IHNwcmludGYocCwgImtleVslZF0gYWxnPVRLSVAga2V5X3NldD0lZCAiCisJCSAgICAgInR4X3BuPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCSAgICAgInJ4X3BuPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCSAgICAgInJlcGxheXM9JWQgaWN2X2Vycm9ycz0lZCBsb2NhbF9taWNfZmFpbHVyZXM9JWRcbiIsCisJCSAgICAgdGtpcC0+a2V5X2lkeCwgdGtpcC0+a2V5X3NldCwKKwkJICAgICAodGtpcC0+dHhfaXYzMiA+PiAyNCkgJiAweGZmLAorCQkgICAgICh0a2lwLT50eF9pdjMyID4+IDE2KSAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnR4X2l2MzIgPj4gOCkgJiAweGZmLAorCQkgICAgIHRraXAtPnR4X2l2MzIgJiAweGZmLAorCQkgICAgICh0a2lwLT50eF9pdjE2ID4+IDgpICYgMHhmZiwKKwkJICAgICB0a2lwLT50eF9pdjE2ICYgMHhmZiwKKwkJICAgICAodGtpcC0+cnhfaXYzMiA+PiAyNCkgJiAweGZmLAorCQkgICAgICh0a2lwLT5yeF9pdjMyID4+IDE2KSAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnJ4X2l2MzIgPj4gOCkgJiAweGZmLAorCQkgICAgIHRraXAtPnJ4X2l2MzIgJiAweGZmLAorCQkgICAgICh0a2lwLT5yeF9pdjE2ID4+IDgpICYgMHhmZiwKKwkJICAgICB0a2lwLT5yeF9pdjE2ICYgMHhmZiwKKwkJICAgICB0a2lwLT5kb3QxMVJTTkFTdGF0c1RLSVBSZXBsYXlzLAorCQkgICAgIHRraXAtPmRvdDExUlNOQVN0YXRzVEtJUElDVkVycm9ycywKKwkJICAgICB0a2lwLT5kb3QxMVJTTkFTdGF0c1RLSVBMb2NhbE1JQ0ZhaWx1cmVzKTsKKwlyZXR1cm4gcDsKK30KKworCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzIGllZWU4MDIxMV9jcnlwdF90a2lwID0geworCS5uYW1lCQkJPSAiVEtJUCIsCisJLmluaXQJCQk9IGllZWU4MDIxMV90a2lwX2luaXQsCisJLmRlaW5pdAkJCT0gaWVlZTgwMjExX3RraXBfZGVpbml0LAorCS5lbmNyeXB0X21wZHUJCT0gaWVlZTgwMjExX3RraXBfZW5jcnlwdCwKKwkuZGVjcnlwdF9tcGR1CQk9IGllZWU4MDIxMV90a2lwX2RlY3J5cHQsCisJLmVuY3J5cHRfbXNkdQkJPSBpZWVlODAyMTFfbWljaGFlbF9taWNfYWRkLAorCS5kZWNyeXB0X21zZHUJCT0gaWVlZTgwMjExX21pY2hhZWxfbWljX3ZlcmlmeSwKKwkuc2V0X2tleQkJPSBpZWVlODAyMTFfdGtpcF9zZXRfa2V5LAorCS5nZXRfa2V5CQk9IGllZWU4MDIxMV90a2lwX2dldF9rZXksCisJLnByaW50X3N0YXRzCQk9IGllZWU4MDIxMV90a2lwX3ByaW50X3N0YXRzLAorCS5leHRyYV9wcmVmaXhfbGVuCT0gNCArIDQsIC8qIElWICsgRXh0SVYgKi8KKwkuZXh0cmFfcG9zdGZpeF9sZW4JPSA4ICsgNCwgLyogTUlDICsgSUNWICovCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKK307CisKK2ludCBfX2luaXQgaWVlZTgwMjExX2NyeXB0b190a2lwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF90a2lwKTsKK30KKwordm9pZCBfX2V4aXQgaWVlZTgwMjExX2NyeXB0b190a2lwX2V4aXQodm9pZCkKK3sKKwlpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfdGtpcCk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3RraXBfbnVsbCh2b2lkKQoreworLy8gICAgcHJpbnRrKCI9PT09PT09PT09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYWQxMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwpAQCAtMCwwICsxLDI5NyBAQAorLyoKKyAqIEhvc3QgQVAgY3J5cHQ6IGhvc3QtYmFzZWQgV0VQIGVuY3J5cHRpb24gaW1wbGVtZW50YXRpb24gZm9yIEhvc3QgQVAgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisgICAgI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIb3N0IEFQIGNyeXB0OiBXRVAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RydWN0IHByaXNtMl93ZXBfZGF0YSB7CisJdTMyIGl2OworI2RlZmluZSBXRVBfS0VZX0xFTiAxMworCXU4IGtleVtXRVBfS0VZX0xFTiArIDFdOworCXU4IGtleV9sZW47CisJdTgga2V5X2lkeDsKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdHhfdGZtOworCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICpyeF90Zm07Cit9OworCisKK3N0YXRpYyB2b2lkICogcHJpc20yX3dlcF9pbml0KGludCBrZXlpZHgpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqcHJpdjsKKworCXByaXYgPSBrbWFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9BVE9NSUMpOworCWlmIChwcml2ID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKwltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKCpwcml2KSk7CisJcHJpdi0+a2V5X2lkeCA9IGtleWlkeDsKKworCXByaXYtPnR4X3RmbSA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImVjYihhcmM0KSIsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+dHhfdGZtKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3dlcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIGFyYzRcbiIpOworCQlwcml2LT50eF90Zm0gPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCXByaXYtPnJ4X3RmbSA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImVjYihhcmM0KSIsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+cnhfdGZtKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3dlcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIGFyYzRcbiIpOworCQlwcml2LT5yeF90Zm0gPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogc3RhcnQgV0VQIElWIGZyb20gYSByYW5kb20gdmFsdWUgKi8KKwlnZXRfcmFuZG9tX2J5dGVzKCZwcml2LT5pdiwgNCk7CisKKwlyZXR1cm4gcHJpdjsKKworZmFpbDoKKwlpZiAocHJpdikgeworCQlpZiAocHJpdi0+dHhfdGZtKQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHByaXYtPnR4X3RmbSk7CisJCWlmIChwcml2LT5yeF90Zm0pCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIocHJpdi0+cnhfdGZtKTsKKwkJa2ZyZWUocHJpdik7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQgcHJpc20yX3dlcF9kZWluaXQodm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICpfcHJpdiA9IHByaXY7CisKKwlpZiAoX3ByaXYpIHsKKwkJaWYgKF9wcml2LT50eF90Zm0pCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIoX3ByaXYtPnR4X3RmbSk7CisJCWlmIChfcHJpdi0+cnhfdGZtKQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKF9wcml2LT5yeF90Zm0pOworCX0KKwlrZnJlZShwcml2KTsKK30KKworLyogUGVyZm9ybSBXRVAgZW5jcnlwdGlvbiBvbiBnaXZlbiBza2IgdGhhdCBoYXMgYXQgbGVhc3QgNCBieXRlcyBvZiBoZWFkcm9vbQorICogZm9yIElWIGFuZCA0IGJ5dGVzIG9mIHRhaWxyb29tIGZvciBJQ1YuIEJvdGggSVYgYW5kIElDViB3aWxsIGJlIHRyYW5zbWl0dGVkLAorICogc28gdGhlIHBheWxvYWQgbGVuZ3RoIGluY3JlYXNlcyB3aXRoIDggYnl0ZXMuCisgKgorICogV0VQIGZyYW1lIHBheWxvYWQ6IElWICsgVFgga2V5IGlkeCwgUkM0KGRhdGEpLCBJQ1YgPSBSQzQoQ1JDMzIoZGF0YSkpCisgKi8KK3N0YXRpYyBpbnQgcHJpc20yX3dlcF9lbmNyeXB0KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKndlcCA9IHByaXY7CisJdTMyIGtsZW4sIGxlbjsKKwl1OCBrZXlbV0VQX0tFWV9MRU4gKyAzXTsKKwl1OCAqcG9zOworCWNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKwlzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYyA9IHsudGZtID0gd2VwLT50eF90Zm19OworCXUzMiBjcmM7CisJdTggKmljdjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgNCB8fCBza2JfdGFpbHJvb20oc2tiKSA8IDQgfHwKKwkgICAgc2tiLT5sZW4gPCBoZHJfbGVuKQorCQlyZXR1cm4gLTE7CisKKwlsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW47CisJcG9zID0gc2tiX3B1c2goc2tiLCA0KTsKKwltZW1tb3ZlKHBvcywgcG9zICsgNCwgaGRyX2xlbik7CisJcG9zICs9IGhkcl9sZW47CisKKwlrbGVuID0gMyArIHdlcC0+a2V5X2xlbjsKKworCXdlcC0+aXYrKzsKKworCS8qIEZsdWhyZXIsIE1hbnRpbiwgYW5kIFNoYW1pciBoYXZlIHJlcG9ydGVkIHdlYWtuZXNzZXMgaW4gdGhlIGtleQorCSAqIHNjaGVkdWxpbmcgYWxnb3JpdGhtIG9mIFJDNC4gQXQgbGVhc3QgSVZzIChLZXlCeXRlICsgMywgMHhmZiwgTikKKwkgKiBjYW4gYmUgdXNlZCB0byBzcGVlZHVwIGF0dGFja3MsIHNvIGF2b2lkIHVzaW5nIHRoZW0uICovCisJaWYgKCh3ZXAtPml2ICYgMHhmZjAwKSA9PSAweGZmMDApIHsKKwkJdTggQiA9ICh3ZXAtPml2ID4+IDE2KSAmIDB4ZmY7CisJCWlmIChCID49IDMgJiYgQiA8IGtsZW4pCisJCQl3ZXAtPml2ICs9IDB4MDEwMDsKKwl9CisKKwkvKiBQcmVwZW5kIDI0LWJpdCBJViB0byBSQzQga2V5IGFuZCBUWCBmcmFtZSAqLworCSpwb3MrKyA9IGtleVswXSA9ICh3ZXAtPml2ID4+IDE2KSAmIDB4ZmY7CisJKnBvcysrID0ga2V5WzFdID0gKHdlcC0+aXYgPj4gOCkgJiAweGZmOworCSpwb3MrKyA9IGtleVsyXSA9IHdlcC0+aXYgJiAweGZmOworCSpwb3MrKyA9IHdlcC0+a2V5X2lkeCA8PCA2OworCisJLyogQ29weSByZXN0IG9mIHRoZSBXRVAga2V5ICh0aGUgc2VjcmV0IHBhcnQpICovCisJbWVtY3B5KGtleSArIDMsIHdlcC0+a2V5LCB3ZXAtPmtleV9sZW4pOworCisJaWYgKCF0Y2JfZGVzYy0+Ykh3U2VjKQorCXsKKworCQkvKiBBcHBlbmQgbGl0dGxlLWVuZGlhbiBDUkMzMiBhbmQgZW5jcnlwdCBpdCB0byBwcm9kdWNlIElDViAqLworCQljcmMgPSB+Y3JjMzJfbGUofjAsIHBvcywgbGVuKTsKKwkJaWN2ID0gc2tiX3B1dChza2IsIDQpOworCQlpY3ZbMF0gPSBjcmM7CisJCWljdlsxXSA9IGNyYyA+PiA4OworCQlpY3ZbMl0gPSBjcmMgPj4gMTY7CisJCWljdlszXSA9IGNyYyA+PiAyNDsKKworCQljcnlwdG9fYmxrY2lwaGVyX3NldGtleSh3ZXAtPnR4X3RmbSwga2V5LCBrbGVuKTsKKwkJc2dfaW5pdF9vbmUoJnNnLCBwb3MsIGxlbis0KTsKKworCQlyZXR1cm4gY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0KCZkZXNjLCAmc2csICZzZywgbGVuICsgNCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyogUGVyZm9ybSBXRVAgZGVjcnlwdGlvbiBvbiBnaXZlbiBidWZmZXIuIEJ1ZmZlciBpbmNsdWRlcyB3aG9sZSBXRVAgcGFydCBvZgorICogdGhlIGZyYW1lOiBJViAoNCBieXRlcyksIGVuY3J5cHRlZCBwYXlsb2FkIChpbmNsdWRpbmcgU05BUCBoZWFkZXIpLAorICogSUNWICg0IGJ5dGVzKS4gbGVuIGluY2x1ZGVzIGJvdGggSVYgYW5kIElDVi4KKyAqCisgKiBSZXR1cm5zIDAgaWYgZnJhbWUgd2FzIGRlY3J5cHRlZCBzdWNjZXNzZnVsbHkgYW5kIElDViB3YXMgY29ycmVjdCBhbmQgLTEgb24KKyAqIGZhaWx1cmUuIElmIGZyYW1lIGlzIE9LLCBJViBhbmQgSUNWIHdpbGwgYmUgcmVtb3ZlZC4KKyAqLworc3RhdGljIGludCBwcmlzbTJfd2VwX2RlY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqd2VwID0gcHJpdjsKKwl1MzIgIGtsZW4sIHBsZW47CisJdTgga2V5W1dFUF9LRVlfTEVOICsgM107CisJdTgga2V5aWR4LCAqcG9zOworCWNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKwlzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYyA9IHsudGZtID0gd2VwLT5yeF90Zm19OworCXUzMiBjcmM7CisJdTggaWN2WzRdOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKwlpZiAoc2tiLT5sZW4gPCBoZHJfbGVuICsgOCkKKwkJcmV0dXJuIC0xOworCisJcG9zID0gc2tiLT5kYXRhICsgaGRyX2xlbjsKKwlrZXlbMF0gPSAqcG9zKys7CisJa2V5WzFdID0gKnBvcysrOworCWtleVsyXSA9ICpwb3MrKzsKKwlrZXlpZHggPSAqcG9zKysgPj4gNjsKKwlpZiAoa2V5aWR4ICE9IHdlcC0+a2V5X2lkeCkKKwkJcmV0dXJuIC0xOworCisJa2xlbiA9IDMgKyB3ZXAtPmtleV9sZW47CisKKwkvKiBDb3B5IHJlc3Qgb2YgdGhlIFdFUCBrZXkgKHRoZSBzZWNyZXQgcGFydCkgKi8KKwltZW1jcHkoa2V5ICsgMywgd2VwLT5rZXksIHdlcC0+a2V5X2xlbik7CisKKwkvKiBBcHBseSBSQzQgdG8gZGF0YSBhbmQgY29tcHV0ZSBDUkMzMiBvdmVyIGRlY3J5cHRlZCBkYXRhICovCisJcGxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbiAtIDg7CisKKwlpZiAoIXRjYl9kZXNjLT5iSHdTZWMpCisJeworCQljcnlwdG9fYmxrY2lwaGVyX3NldGtleSh3ZXAtPnJ4X3RmbSwga2V5LCBrbGVuKTsKKwkJc2dfaW5pdF9vbmUoJnNnLCBwb3MsIHBsZW4rNCk7CisKKwkJaWYgKGNyeXB0b19ibGtjaXBoZXJfZGVjcnlwdCgmZGVzYywgJnNnLCAmc2csIHBsZW4gKyA0KSkKKwkJCXJldHVybiAtNzsKKworCQljcmMgPSB+Y3JjMzJfbGUofjAsIHBvcywgcGxlbik7CisJCWljdlswXSA9IGNyYzsKKwkJaWN2WzFdID0gY3JjID4+IDg7CisJCWljdlsyXSA9IGNyYyA+PiAxNjsKKwkJaWN2WzNdID0gY3JjID4+IDI0OworCQlpZiAobWVtY21wKGljdiwgcG9zICsgcGxlbiwgNCkgIT0gMCkgeworCQkJLyogSUNWIG1pc21hdGNoIC0gZHJvcCBmcmFtZSAqLworCQkJcmV0dXJuIC0yOworCQl9CisJfQorCS8qIFJlbW92ZSBJViBhbmQgSUNWICovCisJbWVtbW92ZShza2ItPmRhdGEgKyA0LCBza2ItPmRhdGEsIGhkcl9sZW4pOworCXNrYl9wdWxsKHNrYiwgNCk7CisJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDQpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfd2VwX3NldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKndlcCA9IHByaXY7CisKKwlpZiAobGVuIDwgMCB8fCBsZW4gPiBXRVBfS0VZX0xFTikKKwkJcmV0dXJuIC0xOworCisJbWVtY3B5KHdlcC0+a2V5LCBrZXksIGxlbik7CisJd2VwLT5rZXlfbGVuID0gbGVuOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfd2VwX2dldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKndlcCA9IHByaXY7CisKKwlpZiAobGVuIDwgd2VwLT5rZXlfbGVuKQorCQlyZXR1cm4gLTE7CisKKwltZW1jcHkoa2V5LCB3ZXAtPmtleSwgd2VwLT5rZXlfbGVuKTsKKworCXJldHVybiB3ZXAtPmtleV9sZW47Cit9CisKKworc3RhdGljIGNoYXIgKiBwcmlzbTJfd2VwX3ByaW50X3N0YXRzKGNoYXIgKnAsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqd2VwID0gcHJpdjsKKwlwICs9IHNwcmludGYocCwgImtleVslZF0gYWxnPVdFUCBsZW49JWRcbiIsCisJCSAgICAgd2VwLT5rZXlfaWR4LCB3ZXAtPmtleV9sZW4pOworCXJldHVybiBwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X3dlcCA9IHsKKwkubmFtZQkJCT0gIldFUCIsCisJLmluaXQJCQk9IHByaXNtMl93ZXBfaW5pdCwKKwkuZGVpbml0CQkJPSBwcmlzbTJfd2VwX2RlaW5pdCwKKwkuZW5jcnlwdF9tcGR1CQk9IHByaXNtMl93ZXBfZW5jcnlwdCwKKwkuZGVjcnlwdF9tcGR1CQk9IHByaXNtMl93ZXBfZGVjcnlwdCwKKwkuZW5jcnlwdF9tc2R1CQk9IE5VTEwsCisJLmRlY3J5cHRfbXNkdQkJPSBOVUxMLAorCS5zZXRfa2V5CQk9IHByaXNtMl93ZXBfc2V0X2tleSwKKwkuZ2V0X2tleQkJPSBwcmlzbTJfd2VwX2dldF9rZXksCisJLnByaW50X3N0YXRzCQk9IHByaXNtMl93ZXBfcHJpbnRfc3RhdHMsCisJLmV4dHJhX3ByZWZpeF9sZW4JPSA0LCAvKiBJViAqLworCS5leHRyYV9wb3N0Zml4X2xlbgk9IDQsIC8qIElDViAqLworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCit9OworCitpbnQgX19pbml0IGllZWU4MDIxMV9jcnlwdG9fd2VwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF93ZXApOworfQorCit2b2lkIF9fZXhpdCBpZWVlODAyMTFfY3J5cHRvX3dlcF9leGl0KHZvaWQpCit7CisJaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X3dlcCk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3dlcF9udWxsKHZvaWQpCit7CisvLwlwcmludGsoIj09PT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4NjkwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCkBAIC0wLDAgKzEsMzI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIENvcHlyaWdodChjKSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgYmFzZWQgb24gdGhlIFdFUCBlbmFibGVtZW50IGNvZGUgcHJvdmlkZWQgYnkgdGhlCisgIEhvc3QgQVAgcHJvamVjdCBob3N0YXAtZHJpdmVycyB2MC4xLjMKKyAgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgIDxqa21hbGluZUBjYy5odXQuZmk+CisgIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKworICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKworICBDb250YWN0IEluZm9ybWF0aW9uOgorICBKYW1lcyBQLiBLZXRyZW5vcyA8aXB3MjEwMC1hZG1pbkBsaW51eC5pbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCitNT0RVTEVfREVTQ1JJUFRJT04oIjgwMi4xMSBkYXRhL21hbmFnZW1lbnQvY29udHJvbCBzdGFjayIpOworTU9EVUxFX0FVVEhPUigiQ29weXJpZ2h0IChDKSAyMDA0IEludGVsIENvcnBvcmF0aW9uIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgRFJWX05BTUUgImllZWU4MDIxMSIKKworc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX25ldHdvcmtzX2FsbG9jYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmIChpZWVlLT5uZXR3b3JrcykKKwkJcmV0dXJuIDA7CisKKwlpZWVlLT5uZXR3b3JrcyA9IGttYWxsb2MoCisJCU1BWF9ORVRXT1JLX0NPVU5UICogc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayksCisJCUdGUF9LRVJORUwpOworCWlmICghaWVlZS0+bmV0d29ya3MpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBiZWFjb25zXG4iLAorCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KGllZWUtPm5ldHdvcmtzLCAwLAorCSAgICAgICBNQVhfTkVUV09SS19DT1VOVCAqIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX25ldHdvcmtzX2ZyZWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYgKCFpZWVlLT5uZXR3b3JrcykKKwkJcmV0dXJuOworCWtmcmVlKGllZWUtPm5ldHdvcmtzKTsKKwlpZWVlLT5uZXR3b3JrcyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfbmV0d29ya3NfaW5pdGlhbGl6ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpbnQgaTsKKworCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmllZWUtPm5ldHdvcmtfbGlzdCk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9ORVRXT1JLX0NPVU5UOyBpKyspCisJCWxpc3RfYWRkX3RhaWwoJmllZWUtPm5ldHdvcmtzW2ldLmxpc3QsICZpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdCk7Cit9CisKKworc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2llZWU4MDIxMShpbnQgc2l6ZW9mX3ByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaSxlcnI7CisKKwlJRUVFODAyMTFfREVCVUdfSU5GTygiSW5pdGlhbGl6aW5nLi4uXG4iKTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSkgKyBzaXplb2ZfcHJpdik7CisJaWYgKCFkZXYpIHsKKwkJSUVFRTgwMjExX0VSUk9SKCJVbmFibGUgdG8gbmV0d29yayBkZXZpY2UuXG4iKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisJbWVtc2V0KGllZWUsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSkrc2l6ZW9mX3ByaXYpOworCWllZWUtPmRldiA9IGRldjsKKworCWVyciA9IGllZWU4MDIxMV9uZXR3b3Jrc19hbGxvY2F0ZShpZWVlKTsKKwlpZiAoZXJyKSB7CisJCUlFRUU4MDIxMV9FUlJPUigiVW5hYmxlIHRvIGFsbG9jYXRlIGJlYWNvbiBzdG9yYWdlOiAlZFxuIiwKKwkJCQllcnIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJaWVlZTgwMjExX25ldHdvcmtzX2luaXRpYWxpemUoaWVlZSk7CisKKworCS8qIERlZmF1bHQgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgaXMgbWF4aW11bSBwYXlsb2FkIHNpemUgKi8KKwlpZWVlLT5mdHMgPSBERUZBVUxUX0ZUUzsKKwlpZWVlLT5zY2FuX2FnZSA9IERFRkFVTFRfTUFYX1NDQU5fQUdFOworCWllZWUtPm9wZW5fd2VwID0gMTsKKworCS8qIERlZmF1bHQgdG8gZW5hYmxpbmcgZnVsbCBvcGVuIFdFUCB3aXRoIGhvc3QgYmFzZWQgZW5jcnlwdC9kZWNyeXB0ICovCisJaWVlZS0+aG9zdF9lbmNyeXB0ID0gMTsKKwlpZWVlLT5ob3N0X2RlY3J5cHQgPSAxOworCWllZWUtPmllZWU4MDJfMXggPSAxOyAvKiBEZWZhdWx0IHRvIHN1cHBvcnRpbmcgODAyLjF4ICovCisKKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QpOworCWluaXRfdGltZXIoJmllZWUtPmNyeXB0X2RlaW5pdF90aW1lcik7CisJaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpZWVlOworCWllZWUtPmNyeXB0X2RlaW5pdF90aW1lci5mdW5jdGlvbiA9IGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcjsKKworCXNwaW5fbG9ja19pbml0KCZpZWVlLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaWVlZS0+d3BheF9zdWl0bGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaWVlZS0+Yndfc3BpbmxvY2spOworCXNwaW5fbG9ja19pbml0KCZpZWVlLT5yZW9yZGVyX3NwaW5sb2NrKTsKKwkvL2FkZGVkIGJ5IFdCCisJYXRvbWljX3NldCgmKGllZWUtPmF0bV9jaG5sb3ApLCAwKTsKKwlhdG9taWNfc2V0KCYoaWVlZS0+YXRtX3N3YncpLCAwKTsKKworCWllZWUtPndwYXhfdHlwZV9zZXQgPSAwOworCWllZWUtPndwYV9lbmFibGVkID0gMDsKKwlpZWVlLT50a2lwX2NvdW50ZXJtZWFzdXJlcyA9IDA7CisJaWVlZS0+ZHJvcF91bmVuY3J5cHRlZCA9IDA7CisJaWVlZS0+cHJpdmFjeV9pbnZva2VkID0gMDsKKwlpZWVlLT5pZWVlODAyXzF4ID0gMTsKKwlpZWVlLT5yYXdfdHggPSAwOworCS8vaWVlZS0+aHdzZWNfc3VwcG9ydCA9IDE7IC8vZGVmYWx0IHN1cHBvcnQgaHcgc2VjdXJpdHkuIC8vdXNlIG1vZHVsZV9wYXJhbSBpbnN0ZWFkLgorCWllZWUtPmh3c2VjX2FjdGl2ZSA9IDA7IC8vZGlzYWJsZSBod3NlYywgc3dpdGNoIGl0IG9uIHdoZW4gbmVjZXNzYXJ5LgorCisJaWVlZTgwMjExX3NvZnRtYWNfaW5pdChpZWVlKTsKKworCWllZWUtPnBIVEluZm8gPSAoUlRfSElHSF9USFJPVUdIUFVUKilremFsbG9jKHNpemVvZihSVF9ISUdIX1RIUk9VR0hQVVQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaWVlZS0+cEhUSW5mbyA9PSBOVUxMKQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJjYW4ndCBhbGxvYyBtZW1vcnkgZm9yIEhUSW5mb1xuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlIVFVwZGF0ZURlZmF1bHRTZXR0aW5nKGllZWUpOworCUhUSW5pdGlhbGl6ZUhUSW5mbyhpZWVlKTsgLy9tYXkgbW92ZSB0byBvdGhlciBwbGFjZS4KKwlUU0luaXRpYWxpemUoaWVlZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkU7IGkrKykKKwkJSU5JVF9MSVNUX0hFQUQoJmllZWUtPmlic3NfbWFjX2hhc2hbaV0pOworCisJZm9yIChpID0gMDsgaSA8IDE3OyBpKyspIHsKKwkgIGllZWUtPmxhc3RfcnhzZXFfbnVtW2ldID0gLTE7CisJICBpZWVlLT5sYXN0X3J4ZnJhZ19udW1baV0gPSAtMTsKKwkgIGllZWUtPmxhc3RfcGFja2V0X3RpbWVbaV0gPSAwOworCX0KKworLy9UaGVzZSBmdW5jdGlvbiB3ZXJlIGFkZGVkIHRvIGxvYWQgY3J5cHRlIG1vZHVsZSBhdXRvbHkKKwlpZWVlODAyMTFfdGtpcF9udWxsKCk7CisJaWVlZTgwMjExX3dlcF9udWxsKCk7CisJaWVlZTgwMjExX2NjbXBfbnVsbCgpOworCisJcmV0dXJuIGRldjsKKworIGZhaWxlZDoKKwlpZiAoZGV2KQorCQlmcmVlX25ldGRldihkZXYpOworCisJcmV0dXJuIE5VTEw7Cit9CisKKwordm9pZCBmcmVlX2llZWU4MDIxMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwkvL3N0cnVjdCBsaXN0X2hlYWQgKnAsICpxOworLy8JZGVsX3RpbWVyX3N5bmMoJmllZWUtPlN3QndUaW1lcik7CisJaWYgKGllZWUtPnBIVEluZm8gIT0gTlVMTCkKKwl7CisJCWtmcmVlKGllZWUtPnBIVEluZm8pOworCQlpZWVlLT5wSFRJbmZvID0gTlVMTDsKKwl9CisJUmVtb3ZlQWxsVFMoaWVlZSk7CisJaWVlZTgwMjExX3NvZnRtYWNfZnJlZShpZWVlKTsKKwlkZWxfdGltZXJfc3luYygmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKKwlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMoaWVlZSwgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0ID0gaWVlZS0+Y3J5cHRbaV07CisJCWlmIChjcnlwdCkgeworCQkJaWYgKGNyeXB0LT5vcHMpCisJCQkJY3J5cHQtPm9wcy0+ZGVpbml0KGNyeXB0LT5wcml2KTsKKwkJCWtmcmVlKGNyeXB0KTsKKwkJCWllZWUtPmNyeXB0W2ldID0gTlVMTDsKKwkJfQorCX0KKworCWllZWU4MDIxMV9uZXR3b3Jrc19mcmVlKGllZWUpOworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisKK3UzMiBpZWVlODAyMTFfZGVidWdfbGV2ZWwgPSAwOworc3RhdGljIGludCBkZWJ1ZyA9IFwKKwkvLwkJICAgIElFRUU4MDIxMV9ETF9JTkZPCXwKKwkvLwkJICAgIElFRUU4MDIxMV9ETF9XWAl8CisJLy8JCSAgICBJRUVFODAyMTFfRExfU0NBTgl8CisJLy8JCSAgICBJRUVFODAyMTFfRExfU1RBVEUJfAorCS8vCQkgICAgSUVFRTgwMjExX0RMX01HTVQJfAorCS8vCQkgICAgSUVFRTgwMjExX0RMX0ZSQUcJfAorCS8vCQkgICAgSUVFRTgwMjExX0RMX0VBUAl8CisJLy8JCSAgICBJRUVFODAyMTFfRExfRFJPUAl8CisJLy8JCSAgICBJRUVFODAyMTFfRExfVFgJfAorCS8vCQkgICAgSUVFRTgwMjExX0RMX1JYCXwKKwkJCSAgICAvL0lFRUU4MDIxMV9ETF9RT1MgICAgfAorCS8vCQkgICAgSUVFRTgwMjExX0RMX0hUIAl8CisJLy8JCSAgICBJRUVFODAyMTFfRExfVFMJfAorLy8JCQkgICAgSUVFRTgwMjExX0RMX0JBIAl8CisJLy8JCSAgICBJRUVFODAyMTFfRExfUkVPUkRFUnwKKy8vCQkJICAgIElFRUU4MDIxMV9ETF9UUkFDRSAgfAorCQkJICAgIC8vSUVFRTgwMjExX0RMX0RBVEEJfAorCQkJICAgIElFRUU4MDIxMV9ETF9FUlIJICAvL2F3YXlscyBvcGVuIHRoaXMgZmxhZ3MgdG8gc2hvdyBlcnJvciBvdXQKKwkJCSAgICA7CitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmllZWU4MDIxMV9wcm9jID0gTlVMTDsKKworc3RhdGljIGludCBzaG93X2RlYnVnX2xldmVsKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIHNucHJpbnRmKHBhZ2UsIGNvdW50LCAiMHglMDhYXG4iLCBpZWVlODAyMTFfZGVidWdfbGV2ZWwpOworfQorCitzdGF0aWMgaW50IHN0b3JlX2RlYnVnX2xldmVsKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJY2hhciBidWZbXSA9ICIweDAwMDAwMDAwIjsKKwl1bnNpZ25lZCBsb25nIGxlbiA9IG1pbihzaXplb2YoYnVmKSAtIDEsIGNvdW50KTsKKwljaGFyICpwID0gKGNoYXIgKilidWY7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGxlbikpCisJCXJldHVybiBjb3VudDsKKwlidWZbbGVuXSA9IDA7CisJaWYgKHBbMV0gPT0gJ3gnIHx8IHBbMV0gPT0gJ1gnIHx8IHBbMF0gPT0gJ3gnIHx8IHBbMF0gPT0gJ1gnKSB7CisJCXArKzsKKwkJaWYgKHBbMF0gPT0gJ3gnIHx8IHBbMF0gPT0gJ1gnKQorCQkJcCsrOworCQl2YWwgPSBzaW1wbGVfc3RydG91bChwLCAmcCwgMTYpOworCX0gZWxzZQorCQl2YWwgPSBzaW1wbGVfc3RydG91bChwLCAmcCwgMTApOworCWlmIChwID09IGJ1ZikKKwkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkgICAgICAgIjogJXMgaXMgbm90IGluIGhleCBvciBkZWNpbWFsIGZvcm0uXG4iLCBidWYpOworCWVsc2UKKwkJaWVlZTgwMjExX2RlYnVnX2xldmVsID0gdmFsOworCisJcmV0dXJuIHN0cm5sZW4oYnVmLCBjb3VudCk7Cit9CisKK2ludCBfX2luaXQgaWVlZTgwMjExX2RlYnVnX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmU7CisKKwlpZWVlODAyMTFfZGVidWdfbGV2ZWwgPSBkZWJ1ZzsKKworCWllZWU4MDIxMV9wcm9jID0gY3JlYXRlX3Byb2NfZW50cnkoRFJWX05BTUUsIFNfSUZESVIsIGluaXRfbmV0LnByb2NfbmV0KTsKKwlpZiAoaWVlZTgwMjExX3Byb2MgPT0gTlVMTCkgeworCQlJRUVFODAyMTFfRVJST1IoIlVuYWJsZSB0byBjcmVhdGUgIiBEUlZfTkFNRQorCQkJCSIgcHJvYyBkaXJlY3RvcnlcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJkZWJ1Z19sZXZlbCIsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCSAgICAgIGllZWU4MDIxMV9wcm9jKTsKKwlpZiAoIWUpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoRFJWX05BTUUsIGluaXRfbmV0LnByb2NfbmV0KTsKKwkJaWVlZTgwMjExX3Byb2MgPSBOVUxMOworCQlyZXR1cm4gLUVJTzsKKwl9CisJZS0+cmVhZF9wcm9jID0gc2hvd19kZWJ1Z19sZXZlbDsKKwllLT53cml0ZV9wcm9jID0gc3RvcmVfZGVidWdfbGV2ZWw7CisJZS0+ZGF0YSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2V4aXQgaWVlZTgwMjExX2RlYnVnX2V4aXQodm9pZCkKK3sKKwlpZiAoaWVlZTgwMjExX3Byb2MpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImRlYnVnX2xldmVsIiwgaWVlZTgwMjExX3Byb2MpOworCQlyZW1vdmVfcHJvY19lbnRyeShEUlZfTkFNRSwgaW5pdF9uZXQucHJvY19uZXQpOworCQlpZWVlODAyMTFfcHJvYyA9IE5VTEw7CisJfQorfQorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBvdXRwdXQgbWFzayIpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTAwM2M1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpAQCAtMCwwICsxLDI2NjggQEAKKy8qCisgKiBPcmlnaW5hbCBjb2RlIGJhc2VkIEhvc3QgQVAgKHNvZnR3YXJlIHdpcmVsZXNzIExBTiBhY2Nlc3MgcG9pbnQpIGRyaXZlcgorICogZm9yIEludGVyc2lsIFByaXNtMi8yLjUvMyAtIGhvc3RhcC5vIG1vZHVsZSwgY29tbW9uIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIEZldyBtb2RpZmljYXRpb25zIGZvciBSZWFsdGVrJ3MgV2ktRmkgZHJpdmVycyBieQorICBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisKKyAgQSBzcGVjaWFsIHRoYW5rcyBnb2VzIHRvIFJlYWx0ZWsgZm9yIHRoZWlyIHN1cHBvcnQgIQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiZG90MTFkLmgiCisjZW5kaWYKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfbW9uaXRvcl9yeChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKXNrYi0+ZGF0YTsKKwl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisKKwlza2ItPmRldiA9IGllZWUtPmRldjsKKyAgICAgICAgc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKworCXNrYl9wdWxsKHNrYiwgaWVlZTgwMjExX2dldF9oZHJsZW4oZmMpKTsKKwlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKwlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDIxMV9SQVcpOworCW1lbXNldChza2ItPmNiLCAwLCBzaXplb2Yoc2tiLT5jYikpOworCW5ldGlmX3J4KHNrYik7Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5ICoKK2llZWU4MDIxMV9mcmFnX2NhY2hlX2ZpbmQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHVuc2lnbmVkIGludCBzZXEsCisJCQkgIHVuc2lnbmVkIGludCBmcmFnLCB1OCB0aWQsdTggKnNyYywgdTggKmRzdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgKmVudHJ5OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTjsgaSsrKSB7CisJCWVudHJ5ID0gJmllZWUtPmZyYWdfY2FjaGVbdGlkXVtpXTsKKwkJaWYgKGVudHJ5LT5za2IgIT0gTlVMTCAmJgorCQkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBlbnRyeS0+Zmlyc3RfZnJhZ190aW1lICsgMiAqIEhaKSkgeworCQkJSUVFRTgwMjExX0RFQlVHX0ZSQUcoCisJCQkJImV4cGlyaW5nIGZyYWdtZW50IGNhY2hlIGVudHJ5ICIKKwkJCQkic2VxPSV1IGxhc3RfZnJhZz0ldVxuIiwKKwkJCQllbnRyeS0+c2VxLCBlbnRyeS0+bGFzdF9mcmFnKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KGVudHJ5LT5za2IpOworCQkJZW50cnktPnNrYiA9IE5VTEw7CisJCX0KKworCQlpZiAoZW50cnktPnNrYiAhPSBOVUxMICYmIGVudHJ5LT5zZXEgPT0gc2VxICYmCisJCSAgICAoZW50cnktPmxhc3RfZnJhZyArIDEgPT0gZnJhZyB8fCBmcmFnID09IC0xKSAmJgorCQkgICAgbWVtY21wKGVudHJ5LT5zcmNfYWRkciwgc3JjLCBFVEhfQUxFTikgPT0gMCAmJgorCQkgICAgbWVtY21wKGVudHJ5LT5kc3RfYWRkciwgZHN0LCBFVEhfQUxFTikgPT0gMCkKKwkJCXJldHVybiBlbnRyeTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgoraWVlZTgwMjExX2ZyYWdfY2FjaGVfZ2V0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJdTE2IGZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCXUxNiBzYyA9IGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0bCk7CisJdW5zaWduZWQgaW50IGZyYWcgPSBXTEFOX0dFVF9TRVFfRlJBRyhzYyk7CisJdW5zaWduZWQgaW50IHNlcSA9IFdMQU5fR0VUX1NFUV9TRVEoc2MpOworCXN0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSAqZW50cnk7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgKmhkcl8zYWRkcnFvczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkcnFvcyAqaGRyXzRhZGRycW9zOworCXU4IHRpZDsKKworCWlmICgoKGZjICYgSUVFRTgwMjExX0ZDVExfRFNUT0RTKSA9PSBJRUVFODAyMTFfRkNUTF9EU1RPRFMpJiZJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSB7CisJICBoZHJfNGFkZHJxb3MgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHJxb3MgKiloZHI7CisJICB0aWQgPSBsZTE2X3RvX2NwdShoZHJfNGFkZHJxb3MtPnFvc19jdGwpICYgSUVFRTgwMjExX1FDVExfVElEOworCSAgdGlkID0gVVAyQUModGlkKTsKKwkgIHRpZCArKzsKKwl9IGVsc2UgaWYgKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsKKwkgIGhkcl8zYWRkcnFvcyA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcnFvcyAqKWhkcjsKKwkgIHRpZCA9IGxlMTZfdG9fY3B1KGhkcl8zYWRkcnFvcy0+cW9zX2N0bCkgJiBJRUVFODAyMTFfUUNUTF9USUQ7CisJICB0aWQgPSBVUDJBQyh0aWQpOworCSAgdGlkICsrOworCX0gZWxzZSB7CisJICB0aWQgPSAwOworCX0KKworCWlmIChmcmFnID09IDApIHsKKwkJLyogUmVzZXJ2ZSBlbm91Z2ggc3BhY2UgdG8gZml0IG1heGltdW0gZnJhbWUgbGVuZ3RoICovCisJCXNrYiA9IGRldl9hbGxvY19za2IoaWVlZS0+ZGV2LT5tdHUgKworCQkJCSAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIpICsKKwkJCQkgICAgOCAvKiBMTEMgKi8gKworCQkJCSAgICAyIC8qIGFsaWdubWVudCAqLyArCisJCQkJICAgIDggLyogV0VQICovICsKKwkJCQkgICAgRVRIX0FMRU4gLyogV0RTICovICsKKwkJCQkgICAgKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYyk/MjowKSAvKiBRT1MgQ29udHJvbCAqLyk7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCisJCWVudHJ5ID0gJmllZWUtPmZyYWdfY2FjaGVbdGlkXVtpZWVlLT5mcmFnX25leHRfaWR4W3RpZF1dOworCQlpZWVlLT5mcmFnX25leHRfaWR4W3RpZF0rKzsKKwkJaWYgKGllZWUtPmZyYWdfbmV4dF9pZHhbdGlkXSA+PSBJRUVFODAyMTFfRlJBR19DQUNIRV9MRU4pCisJCQlpZWVlLT5mcmFnX25leHRfaWR4W3RpZF0gPSAwOworCisJCWlmIChlbnRyeS0+c2tiICE9IE5VTEwpCisJCQlkZXZfa2ZyZWVfc2tiX2FueShlbnRyeS0+c2tiKTsKKworCQllbnRyeS0+Zmlyc3RfZnJhZ190aW1lID0gamlmZmllczsKKwkJZW50cnktPnNlcSA9IHNlcTsKKwkJZW50cnktPmxhc3RfZnJhZyA9IGZyYWc7CisJCWVudHJ5LT5za2IgPSBza2I7CisJCW1lbWNweShlbnRyeS0+c3JjX2FkZHIsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGVudHJ5LT5kc3RfYWRkciwgaGRyLT5hZGRyMSwgRVRIX0FMRU4pOworCX0gZWxzZSB7CisJCS8qIHJlY2VpdmVkIGEgZnJhZ21lbnQgb2YgYSBmcmFtZSBmb3Igd2hpY2ggdGhlIGhlYWQgZnJhZ21lbnQKKwkJICogc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlY2VpdmVkICovCisJCWVudHJ5ID0gaWVlZTgwMjExX2ZyYWdfY2FjaGVfZmluZChpZWVlLCBzZXEsIGZyYWcsIHRpZCxoZHItPmFkZHIyLAorCQkJCQkJICBoZHItPmFkZHIxKTsKKwkJaWYgKGVudHJ5ICE9IE5VTEwpIHsKKwkJCWVudHJ5LT5sYXN0X2ZyYWcgPSBmcmFnOworCQkJc2tiID0gZW50cnktPnNrYjsKKwkJfQorCX0KKworCXJldHVybiBza2I7Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgaW50IGllZWU4MDIxMV9mcmFnX2NhY2hlX2ludmFsaWRhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHIpCit7CisJdTE2IGZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCXUxNiBzYyA9IGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0bCk7CisJdW5zaWduZWQgaW50IHNlcSA9IFdMQU5fR0VUX1NFUV9TRVEoc2MpOworCXN0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSAqZW50cnk7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgKmhkcl8zYWRkcnFvczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkcnFvcyAqaGRyXzRhZGRycW9zOworCXU4IHRpZDsKKworCWlmKCgoZmMgJiBJRUVFODAyMTFfRkNUTF9EU1RPRFMpID09IElFRUU4MDIxMV9GQ1RMX0RTVE9EUykmJklFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsKKwkgIGhkcl80YWRkcnFvcyA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkcnFvcyAqKWhkcjsKKwkgIHRpZCA9IGxlMTZfdG9fY3B1KGhkcl80YWRkcnFvcy0+cW9zX2N0bCkgJiBJRUVFODAyMTFfUUNUTF9USUQ7CisJICB0aWQgPSBVUDJBQyh0aWQpOworCSAgdGlkICsrOworCX0gZWxzZSBpZiAoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgeworCSAgaGRyXzNhZGRycW9zID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRycW9zICopaGRyOworCSAgdGlkID0gbGUxNl90b19jcHUoaGRyXzNhZGRycW9zLT5xb3NfY3RsKSAmIElFRUU4MDIxMV9RQ1RMX1RJRDsKKwkgIHRpZCA9IFVQMkFDKHRpZCk7CisJICB0aWQgKys7CisJfSBlbHNlIHsKKwkgIHRpZCA9IDA7CisJfQorCisJZW50cnkgPSBpZWVlODAyMTFfZnJhZ19jYWNoZV9maW5kKGllZWUsIHNlcSwgLTEsIHRpZCxoZHItPmFkZHIyLAorCQkJCQkgIGhkci0+YWRkcjEpOworCisJaWYgKGVudHJ5ID09IE5VTEwpIHsKKwkJSUVFRTgwMjExX0RFQlVHX0ZSQUcoCisJCQkiY291bGQgbm90IGludmFsaWRhdGUgZnJhZ21lbnQgY2FjaGUgIgorCQkJImVudHJ5IChzZXE9JXUpXG4iLCBzZXEpOworCQlyZXR1cm4gLTE7CisJfQorCisJZW50cnktPnNrYiA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKworCisvKiBpZWVlODAyMTFfcnhfZnJhbWVfbWd0bXQKKyAqCisgKiBSZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgbWFuYWdlbWVudCBjb250cm9sIGZyYW1lcworICoKKyAqIENhbGxlZCBieSBpZWVlODAyMTFfcnggKi8KK3N0YXRpYyBpbmxpbmUgaW50CitpZWVlODAyMTFfcnhfZnJhbWVfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzLCB1MTYgdHlwZSwKKwkJCXUxNiBzdHlwZSkKK3sKKwkvKiBPbiB0aGUgc3RydWN0IHN0YXRzIGRlZmluaXRpb24gdGhlcmUgaXMgd3JpdHRlbiB0aGF0CisJICogdGhpcyBpcyBub3QgbWFuZGF0b3J5Li4uLiBidXQgc2VlbXMgdGhhdCB0aGUgcHJvYmUKKwkgKiByZXNwb25zZSBwYXJzZXIgdXNlcyBpdAorCSAqLworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqIGhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKXNrYi0+ZGF0YTsKKworCXJ4X3N0YXRzLT5sZW4gPSBza2ItPmxlbjsKKwlpZWVlODAyMTFfcnhfbWd0KGllZWUsKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopc2tiLT5kYXRhLHJ4X3N0YXRzKTsKKyAgICAgICAgLy9pZiAoKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpICYmIChtZW1jbXAoaGRyLT5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTikpKQorICAgICAgICBpZiAoKG1lbWNtcChoZHItPmFkZHIxLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTikpKS8vdXNlIEFERFIxIHRvIHBlcmZvcm0gYWRkcmVzcyBtYXRjaGluZyBmb3IgTWFuYWdlbWVudCBmcmFtZXMKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworCWllZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjKGllZWUsIHNrYiwgcnhfc3RhdHMsIHR5cGUsIHN0eXBlKTsKKworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisKKwlyZXR1cm4gMDsKKworCSNpZmRlZiBOT1RfWUVUCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNYXN0ZXIgbW9kZSBub3QgeWV0IHN1cHBwb3J0ZWQuXG4iLAorCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisvKgorICBob3N0YXBfdXBkYXRlX3N0YV9wcyhpZWVlLCAoc3RydWN0IGhvc3RhcF9pZWVlODAyMTFfaGRyXzRhZGRyICopCisgIHNrYi0+ZGF0YSk7Ki8KKwl9CisKKwlpZiAoaWVlZS0+aG9zdGFwZCAmJiB0eXBlID09IElFRUU4MDIxMV9UWVBFX01HTVQpIHsKKwkJaWYgKHN0eXBlID09IFdMQU5fRkNfU1RZUEVfQkVBQ09OICYmCisJCSAgICBpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKwkJCS8qIFByb2Nlc3MgYmVhY29uIGZyYW1lcyBhbHNvIGluIGtlcm5lbCBkcml2ZXIgdG8KKwkJCSAqIHVwZGF0ZSBTVEEoQVApIHRhYmxlIHN0YXRpc3RpY3MgKi8KKwkJCXNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChza2IyKQorCQkJCWhvc3RhcF9yeChza2IyLT5kZXYsIHNrYjIsIHJ4X3N0YXRzKTsKKwkJfQorCisJCS8qIHNlbmQgbWFuYWdlbWVudCBmcmFtZXMgdG8gdGhlIHVzZXIgc3BhY2UgZGFlbW9uIGZvcgorCQkgKiBwcm9jZXNzaW5nICovCisJCWllZWUtPmFwZGV2c3RhdHMucnhfcGFja2V0cysrOworCQlpZWVlLT5hcGRldnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQlwcmlzbTJfcnhfODAyMTEoaWVlZS0+YXBkZXYsIHNrYiwgcnhfc3RhdHMsIFBSSVNNMl9SWF9NR01UKTsKKwkJcmV0dXJuIDA7CisJfQorCisJICAgIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCWlmICh0eXBlICE9IFdMQU5fRkNfVFlQRV9NR01UICYmIHR5cGUgIT0gV0xBTl9GQ19UWVBFX0NUUkwpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5rbm93biBtYW5hZ2VtZW50IGZyYW1lICIKKwkJCSAgICAgICAiKHR5cGU9MHglMDJ4LCBzdHlwZT0weCUwMngpIGRyb3BwZWRcbiIsCisJCQkgICAgICAgc2tiLT5kZXYtPm5hbWUsIHR5cGUsIHN0eXBlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWhvc3RhcF9yeChza2ItPmRldiwgc2tiLCByeF9zdGF0cyk7CisJCXJldHVybiAwOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICIlczogaG9zdGFwX3J4X2ZyYW1lX21nbXQ6IG1hbmFnZW1lbnQgZnJhbWUgIgorCSAgICAgICAicmVjZWl2ZWQgaW4gbm9uLUhvc3QgQVAgbW9kZVxuIiwgc2tiLT5kZXYtPm5hbWUpOworCXJldHVybiAtMTsKKwkjZW5kaWYKK30KKworCisKKy8qIFNlZSBJRUVFIDgwMi4xSCBmb3IgTExDL1NOQVAgZW5jYXBzdWxhdGlvbi9kZWNhcHN1bGF0aW9uICovCisvKiBFdGhlcm5ldC1JSSBzbmFwIGhlYWRlciAoUkZDMTA0MiBmb3IgbW9zdCBFdGhlclR5cGVzKSAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmZjMTA0Ml9oZWFkZXJbXSA9Cit7IDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKy8qIEJyaWRnZS1UdW5uZWwgaGVhZGVyIChmb3IgRXRoZXJUeXBlcyBFVEhfUF9BQVJQIGFuZCBFVEhfUF9JUFgpICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBicmlkZ2VfdHVubmVsX2hlYWRlcltdID0KK3sgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHhmOCB9OworLyogTm8gZW5jYXBzdWxhdGlvbiBoZWFkZXIgaWYgRXRoZXJUeXBlIDwgMHg2MDAgKD1sZW5ndGgpICovCisKKy8qIENhbGxlZCBieSBpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdCAqLworc3RhdGljIGludCBpZWVlODAyMTFfaXNfZWFwb2xfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIHNpemVfdCBoZHJsZW4pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwl1MTYgZmMsIGV0aGVydHlwZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyOworCXU4ICpwb3M7CisKKwlpZiAoc2tiLT5sZW4gPCAyNCkKKwkJcmV0dXJuIDA7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKikgc2tiLT5kYXRhOworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCisJLyogY2hlY2sgdGhhdCB0aGUgZnJhbWUgaXMgdW5pY2FzdCBmcmFtZSB0byB1cyAqLworCWlmICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09CisJICAgIElFRUU4MDIxMV9GQ1RMX1RPRFMgJiYKKwkgICAgbWVtY21wKGhkci0+YWRkcjEsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSA9PSAwICYmCisJICAgIG1lbWNtcChoZHItPmFkZHIzLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgPT0gMCkgeworCQkvKiBUb0RTIGZyYW1lIHdpdGggb3duIGFkZHIgQlNTSUQgYW5kIERBICovCisJfSBlbHNlIGlmICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09CisJCSAgIElFRUU4MDIxMV9GQ1RMX0ZST01EUyAmJgorCQkgICBtZW1jbXAoaGRyLT5hZGRyMSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pID09IDApIHsKKwkJLyogRnJvbURTIGZyYW1lIHdpdGggb3duIGFkZHIgYXMgREEgKi8KKwl9IGVsc2UKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2tiLT5sZW4gPCAyNCArIDgpCisJCXJldHVybiAwOworCisJLyogY2hlY2sgZm9yIHBvcnQgYWNjZXNzIGVudGl0eSBFdGhlcm5ldCB0eXBlICovCisvLwlwb3MgPSBza2ItPmRhdGEgKyAyNDsKKwlwb3MgPSBza2ItPmRhdGEgKyBoZHJsZW47CisJZXRoZXJ0eXBlID0gKHBvc1s2XSA8PCA4KSB8IHBvc1s3XTsKKwlpZiAoZXRoZXJ0eXBlID09IEVUSF9QX1BBRSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpLCBieSBpZWVlODAyMTFfcnggKi8KK3N0YXRpYyBpbmxpbmUgaW50CitpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjsKKwlpbnQgcmVzLCBoZHJsZW47CisKKwlpZiAoY3J5cHQgPT0gTlVMTCB8fCBjcnlwdC0+b3BzLT5kZWNyeXB0X21wZHUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWYgKGllZWUtPmh3c2VjX2FjdGl2ZSkKKwl7CisJCWNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYisgTUFYX0RFVl9BRERSX1NJWkUpOworCQl0Y2JfZGVzYy0+Ykh3U2VjID0gMTsKKwl9CisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwloZHJsZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpOworCisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9DUllQVF9US0lQCisJaWYgKGllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzICYmCisJICAgIHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiVEtJUCIpID09IDApIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUS0lQIGNvdW50ZXJtZWFzdXJlczogZHJvcHBlZCAiCisJCQkgICAgICAgInJlY2VpdmVkIHBhY2tldCBmcm9tICIgTUFDX0ZNVCAiXG4iLAorCQkJICAgICAgIGllZWUtPmRldi0+bmFtZSwgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorCisJYXRvbWljX2luYygmY3J5cHQtPnJlZmNudCk7CisJcmVzID0gY3J5cHQtPm9wcy0+ZGVjcnlwdF9tcGR1KHNrYiwgaGRybGVuLCBjcnlwdC0+cHJpdik7CisJYXRvbWljX2RlYygmY3J5cHQtPnJlZmNudCk7CisJaWYgKHJlcyA8IDApIHsKKwkJSUVFRTgwMjExX0RFQlVHX0RST1AoCisJCQkiZGVjcnlwdGlvbiBmYWlsZWQgKFNBPSIgTUFDX0ZNVAorCQkJIikgcmVzPSVkXG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpLCByZXMpOworCQlpZiAocmVzID09IC0yKQorCQkJSUVFRTgwMjExX0RFQlVHX0RST1AoIkRlY3J5cHRpb24gZmFpbGVkIElDViAiCisJCQkJCSAgICAgIm1pc21hdGNoIChrZXkgJWQpXG4iLAorCQkJCQkgICAgIHNrYi0+ZGF0YVtoZHJsZW4gKyAzXSA+PiA2KTsKKwkJaWVlZS0+aWVlZV9zdGF0cy5yeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlKys7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSwgYnkgaWVlZTgwMjExX3J4ICovCitzdGF0aWMgaW5saW5lIGludAoraWVlZTgwMjExX3J4X2ZyYW1lX2RlY3J5cHRfbXNkdShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgaW50IGtleWlkeCwgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyOworCWludCByZXMsIGhkcmxlbjsKKworCWlmIChjcnlwdCA9PSBOVUxMIHx8IGNyeXB0LT5vcHMtPmRlY3J5cHRfbXNkdSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZiAoaWVlZS0+aHdzZWNfYWN0aXZlKQorCXsKKwkJY2JfZGVzYyAqdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiKyBNQVhfREVWX0FERFJfU0laRSk7CisJCXRjYl9kZXNjLT5iSHdTZWMgPSAxOworCX0KKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CisJaGRybGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW4obGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKTsKKworCWF0b21pY19pbmMoJmNyeXB0LT5yZWZjbnQpOworCXJlcyA9IGNyeXB0LT5vcHMtPmRlY3J5cHRfbXNkdShza2IsIGtleWlkeCwgaGRybGVuLCBjcnlwdC0+cHJpdik7CisJYXRvbWljX2RlYygmY3J5cHQtPnJlZmNudCk7CisJaWYgKHJlcyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNU0RVIGRlY3J5cHRpb24vTUlDIHZlcmlmaWNhdGlvbiBmYWlsZWQiCisJCSAgICAgICAiIChTQT0iIE1BQ19GTVQgIiBrZXlpZHg9JWQpXG4iLAorCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lLCBNQUNfQVJHKGhkci0+YWRkcjIpLCBrZXlpZHgpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyogdGhpcyBmdW5jdGlvbiBpcyBzdG9sZW4gZnJvbSBpcHcyMjAwIGRyaXZlciovCisjZGVmaW5lIElFRUVfUEFDS0VUX1JFVFJZX1RJTUUgKDUqSFopCitzdGF0aWMgaW50IGlzX2R1cGxpY2F0ZV9wYWNrZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhlYWRlcikKK3sKKwl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZWFkZXItPmZyYW1lX2N0bCk7CisJdTE2IHNjID0gbGUxNl90b19jcHUoaGVhZGVyLT5zZXFfY3RsKTsKKwl1MTYgc2VxID0gV0xBTl9HRVRfU0VRX1NFUShzYyk7CisJdTE2IGZyYWcgPSBXTEFOX0dFVF9TRVFfRlJBRyhzYyk7CisJdTE2ICpsYXN0X3NlcSwgKmxhc3RfZnJhZzsKKwl1bnNpZ25lZCBsb25nICpsYXN0X3RpbWU7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgKmhkcl8zYWRkcnFvczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkcnFvcyAqaGRyXzRhZGRycW9zOworCXU4IHRpZDsKKworCisJLy9UTzJEUyBhbmQgUW9TCisJaWYoKChmYyAmIElFRUU4MDIxMV9GQ1RMX0RTVE9EUykgPT0gSUVFRTgwMjExX0ZDVExfRFNUT0RTKSYmSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgeworCSAgaGRyXzRhZGRycW9zID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRycW9zICopaGVhZGVyOworCSAgdGlkID0gbGUxNl90b19jcHUoaGRyXzRhZGRycW9zLT5xb3NfY3RsKSAmIElFRUU4MDIxMV9RQ1RMX1RJRDsKKwkgIHRpZCA9IFVQMkFDKHRpZCk7CisJICB0aWQgKys7CisJfSBlbHNlIGlmKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsgLy9Rb1MKKwkgIGhkcl8zYWRkcnFvcyA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcnFvcyopaGVhZGVyOworCSAgdGlkID0gbGUxNl90b19jcHUoaGRyXzNhZGRycW9zLT5xb3NfY3RsKSAmIElFRUU4MDIxMV9RQ1RMX1RJRDsKKwkgIHRpZCA9IFVQMkFDKHRpZCk7CisJICB0aWQgKys7CisJfSBlbHNlIHsgLy8gbm8gUW9TCisJICB0aWQgPSAwOworCX0KKworCXN3aXRjaCAoaWVlZS0+aXdfbW9kZSkgeworCWNhc2UgSVdfTU9ERV9BREhPQzoKKwl7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJCXN0cnVjdCBpZWVlX2lic3Nfc2VxICplbnRyeSA9IE5VTEw7CisJCXU4ICptYWMgPSBoZWFkZXItPmFkZHIyOworCQlpbnQgaW5kZXggPSBtYWNbNV0gJSBJRUVFX0lCU1NfTUFDX0hBU0hfU0laRTsKKwkJLy9mb3IgKHBvcyA9IChoZWFkKS0+bmV4dDsgcG9zICE9IChoZWFkKTsgcG9zID0gcG9zLT5uZXh0KQorCQkvL19fbGlzdF9mb3JfZWFjaChwLCAmaWVlZS0+aWJzc19tYWNfaGFzaFtpbmRleF0pIHsKKwkJbGlzdF9mb3JfZWFjaChwLCAmaWVlZS0+aWJzc19tYWNfaGFzaFtpbmRleF0pIHsKKwkJCWVudHJ5ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaWVlZV9pYnNzX3NlcSwgbGlzdCk7CisJCQlpZiAoIW1lbWNtcChlbnRyeS0+bWFjLCBtYWMsIEVUSF9BTEVOKSkKKwkJCQlicmVhazsKKwkJfQorCS8vCWlmIChtZW1jbXAoZW50cnktPm1hYywgbWFjLCBFVEhfQUxFTikpeworCQlpZiAocCA9PSAmaWVlZS0+aWJzc19tYWNfaGFzaFtpbmRleF0pIHsKKwkJCWVudHJ5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGllZWVfaWJzc19zZXEpLCBHRlBfQVRPTUlDKTsKKwkJCWlmICghZW50cnkpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW5ub3QgbWFsbG9jIG5ldyBtYWMgZW50cnlcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbWVtY3B5KGVudHJ5LT5tYWMsIG1hYywgRVRIX0FMRU4pOworCQkJZW50cnktPnNlcV9udW1bdGlkXSA9IHNlcTsKKwkJCWVudHJ5LT5mcmFnX251bVt0aWRdID0gZnJhZzsKKwkJCWVudHJ5LT5wYWNrZXRfdGltZVt0aWRdID0gamlmZmllczsKKwkJCWxpc3RfYWRkKCZlbnRyeS0+bGlzdCwgJmllZWUtPmlic3NfbWFjX2hhc2hbaW5kZXhdKTsKKwkJCXJldHVybiAwOworCQl9CisJCWxhc3Rfc2VxID0gJmVudHJ5LT5zZXFfbnVtW3RpZF07CisJCWxhc3RfZnJhZyA9ICZlbnRyeS0+ZnJhZ19udW1bdGlkXTsKKwkJbGFzdF90aW1lID0gJmVudHJ5LT5wYWNrZXRfdGltZVt0aWRdOworCQlicmVhazsKKwl9CisKKwljYXNlIElXX01PREVfSU5GUkE6CisJCWxhc3Rfc2VxID0gJmllZWUtPmxhc3RfcnhzZXFfbnVtW3RpZF07CisJCWxhc3RfZnJhZyA9ICZpZWVlLT5sYXN0X3J4ZnJhZ19udW1bdGlkXTsKKwkJbGFzdF90aW1lID0gJmllZWUtPmxhc3RfcGFja2V0X3RpbWVbdGlkXTsKKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKy8vCWlmKHRpZCAhPSAwKSB7CisvLwkJcHJpbnRrKEtFUk5fV0FSTklORyAiOikpKSkpKSkpKSkpJXggJXggJXgsIGZjKCV4KVxuIiwgdGlkLCAqbGFzdF9zZXEsIHNlcSwgaGVhZGVyLT5mcmFtZV9jdGwpOworLy8JfQorCWlmICgoKmxhc3Rfc2VxID09IHNlcSkgJiYKKwkgICAgdGltZV9hZnRlcigqbGFzdF90aW1lICsgSUVFRV9QQUNLRVRfUkVUUllfVElNRSwgamlmZmllcykpIHsKKwkJaWYgKCpsYXN0X2ZyYWcgPT0gZnJhZyl7CisJCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIlsxXSBnbyBkcm9wIVxuIik7CisJCQlnb3RvIGRyb3A7CisKKwkJfQorCQlpZiAoKmxhc3RfZnJhZyArIDEgIT0gZnJhZykKKwkJCS8qIG91dC1vZi1vcmRlciBmcmFnbWVudCAqLworCQkJLy9wcmludGsoS0VSTl9XQVJOSU5HICJbMl0gZ28gZHJvcCFcbiIpOworCQkJZ290byBkcm9wOworCX0gZWxzZQorCQkqbGFzdF9zZXEgPSBzZXE7CisKKwkqbGFzdF9mcmFnID0gZnJhZzsKKwkqbGFzdF90aW1lID0gamlmZmllczsKKwlyZXR1cm4gMDsKKworZHJvcDoKKy8vCUJVR19PTighKGZjICYgSUVFRTgwMjExX0ZDVExfUkVUUlkpKTsKKy8vCXByaW50aygiRFVQXG4iKTsKKworCXJldHVybiAxOworfQorYm9vbAorQWRkUmVvcmRlckVudHJ5KAorCVBSWF9UU19SRUNPUkQJCQlwVFMsCisJUFJYX1JFT1JERVJfRU5UUlkJCXBSZW9yZGVyRW50cnkKKwkpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcExpc3QgPSAmcFRTLT5SeFBlbmRpbmdQa3RMaXN0OworCXdoaWxlKHBMaXN0LT5uZXh0ICE9ICZwVFMtPlJ4UGVuZGluZ1BrdExpc3QpCisJeworCQlpZiggU05fTEVTUyhwUmVvcmRlckVudHJ5LT5TZXFOdW0sICgoUFJYX1JFT1JERVJfRU5UUlkpbGlzdF9lbnRyeShwTGlzdC0+bmV4dCxSWF9SRU9SREVSX0VOVFJZLExpc3QpKS0+U2VxTnVtKSApCisJCXsKKwkJCXBMaXN0ID0gcExpc3QtPm5leHQ7CisJCX0KKwkJZWxzZSBpZiggU05fRVFVQUwocFJlb3JkZXJFbnRyeS0+U2VxTnVtLCAoKFBSWF9SRU9SREVSX0VOVFJZKWxpc3RfZW50cnkocExpc3QtPm5leHQsUlhfUkVPUkRFUl9FTlRSWSxMaXN0KSktPlNlcU51bSkgKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJZWxzZQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKwlwUmVvcmRlckVudHJ5LT5MaXN0Lm5leHQgPSBwTGlzdC0+bmV4dDsKKwlwUmVvcmRlckVudHJ5LT5MaXN0Lm5leHQtPnByZXYgPSAmcFJlb3JkZXJFbnRyeS0+TGlzdDsKKwlwUmVvcmRlckVudHJ5LT5MaXN0LnByZXYgPSBwTGlzdDsKKwlwTGlzdC0+bmV4dCA9ICZwUmVvcmRlckVudHJ5LT5MaXN0OworCisJcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgaWVlZTgwMjExX2luZGljYXRlX3BhY2tldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpZWVlODAyMTFfcnhiKiogcHJ4YkluZGljYXRlQXJyYXksdTggIGluZGV4KQoreworCXU4IGkgPSAwICwgaj0wOworCXUxNiBldGhlcnR5cGU7CisvLwlpZihpbmRleCA+IDEpCisvLwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCIlcygpOiBoYWhhaGFoaGhoLCBXZSBpbmRpY2F0ZSBwYWNrZXQgZnJvbSByZW9yZGVyIGxpc3QsIGluZGV4IGlzICV1XG4iLF9fRlVOQ1RJT05fXyxpbmRleCk7CisJZm9yKGogPSAwOyBqPGluZGV4OyBqKyspCisJeworLy9hZGRlZCBieSBhbXkgZm9yIHJlb3JkZXIKKwkJc3RydWN0IGllZWU4MDIxMV9yeGIqIHByeGIgPSBwcnhiSW5kaWNhdGVBcnJheVtqXTsKKwkJZm9yKGkgPSAwOyBpPHByeGItPm5yX3N1YmZyYW1lczsgaSsrKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc3ViX3NrYiA9IHByeGItPnN1YmZyYW1lc1tpXTsKKworCQkvKiBjb252ZXJ0IGhkciArIHBvc3NpYmxlIExMQyBoZWFkZXJzIGludG8gRXRoZXJuZXQgaGVhZGVyICovCisJCQlldGhlcnR5cGUgPSAoc3ViX3NrYi0+ZGF0YVs2XSA8PCA4KSB8IHN1Yl9za2ItPmRhdGFbN107CisJCQlpZiAoc3ViX3NrYi0+bGVuID49IDggJiYKKwkJCQkoKG1lbWNtcChzdWJfc2tiLT5kYXRhLCByZmMxMDQyX2hlYWRlciwgU05BUF9TSVpFKSA9PSAwICYmCisJCQkJICBldGhlcnR5cGUgIT0gRVRIX1BfQUFSUCAmJiBldGhlcnR5cGUgIT0gRVRIX1BfSVBYKSB8fAorCQkJCSBtZW1jbXAoc3ViX3NrYi0+ZGF0YSwgYnJpZGdlX3R1bm5lbF9oZWFkZXIsIFNOQVBfU0laRSkgPT0gMCkpIHsKKwkJCS8qIHJlbW92ZSBSRkMxMDQyIG9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbiBhbmQKKwkJCSAqIHJlcGxhY2UgRXRoZXJUeXBlICovCisJCQkJc2tiX3B1bGwoc3ViX3NrYiwgU05BUF9TSVpFKTsKKwkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBwcnhiLT5zcmMsIEVUSF9BTEVOKTsKKwkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBwcnhiLT5kc3QsIEVUSF9BTEVOKTsKKwkJCX0gZWxzZSB7CisJCQkJdTE2IGxlbjsKKwkJCS8qIExlYXZlIEV0aGVybmV0IGhlYWRlciBwYXJ0IG9mIGhkciBhbmQgZnVsbCBwYXlsb2FkICovCisJCQkJbGVuID0gaHRvbnMoc3ViX3NrYi0+bGVuKTsKKwkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgMiksICZsZW4sIDIpOworCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIHByeGItPnNyYywgRVRIX0FMRU4pOworCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIHByeGItPmRzdCwgRVRIX0FMRU4pOworCQkJfQorCQkJLy9zdGF0cy0+cnhfcGFja2V0cysrOworCQkJLy9zdGF0cy0+cnhfYnl0ZXMgKz0gc3ViX3NrYi0+bGVuOworCisJCS8qIEluZGljYXQgdGhlIHBhY2tldHMgdG8gdXBwZXIgbGF5ZXIgKi8KKwkJCWlmIChzdWJfc2tiKSB7CisJCQkJLy9wcmludGsoIjBza2JfbGVuKCVkKVxuIiwgc2tiLT5sZW4pOworCQkJCXN1Yl9za2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc3ViX3NrYiwgaWVlZS0+ZGV2KTsKKwkJCQltZW1zZXQoc3ViX3NrYi0+Y2IsIDAsIHNpemVvZihzdWJfc2tiLT5jYikpOworCQkJCXN1Yl9za2ItPmRldiA9IGllZWUtPmRldjsKKwkJCQlzdWJfc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOyAvKiA4MDIuMTEgY3JjIG5vdCBzdWZmaWNpZW50ICovCisJCQkJLy9za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOyAvKiA4MDIuMTEgY3JjIG5vdCBzdWZmaWNpZW50ICovCisJCQkJaWVlZS0+bGFzdF9yeF9wc190aW1lID0gamlmZmllczsKKwkJCQkvL3ByaW50aygiMXNrYl9sZW4oJWQpXG4iLCBza2ItPmxlbik7CisJCQkJbmV0aWZfcngoc3ViX3NrYik7CisJCQl9CisJCX0KKwkJa2ZyZWUocHJ4Yik7CisJCXByeGIgPSBOVUxMOworCX0KK30KKworCit2b2lkIFJ4UmVvcmRlckluZGljYXRlUGFja2V0KCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJc3RydWN0IGllZWU4MDIxMV9yeGIqIHByeGIsCisJCVBSWF9UU19SRUNPUkQJCXBUUywKKwkJdTE2CQkJU2VxTnVtKQoreworCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisJUFJYX1JFT1JERVJfRU5UUlkgCXBSZW9yZGVyRW50cnkgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfcnhiKiBwcnhiSW5kaWNhdGVBcnJheVtSRU9SREVSX1dJTl9TSVpFXTsKKwl1OAkJCVdpblNpemUgPSBwSFRJbmZvLT5SeFJlb3JkZXJXaW5TaXplOworCXUxNgkJCVdpbkVuZCA9IChwVFMtPlJ4SW5kaWNhdGVTZXEgKyBXaW5TaXplIC0xKSU0MDk2OworCXU4CQkJaW5kZXggPSAwOworCWJvb2wJCQliTWF0Y2hXaW5TdGFydCA9IGZhbHNlLCBiUGt0SW5CdWYgPSBmYWxzZTsKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JFT1JERVIsIiVzKCk6IFNlcSBpcyAlZCxwVFMtPlJ4SW5kaWNhdGVTZXEgaXMgJWQsIFdpblNpemUgaXMgJWRcbiIsX19GVU5DVElPTl9fLFNlcU51bSxwVFMtPlJ4SW5kaWNhdGVTZXEsV2luU2l6ZSk7CisJLyogUnggUmVvcmRlciBpbml0aWFsaXplIGNvbmRpdGlvbi4qLworCWlmKHBUUy0+UnhJbmRpY2F0ZVNlcSA9PSAweGZmZmYpIHsKKwkJcFRTLT5SeEluZGljYXRlU2VxID0gU2VxTnVtOworCX0KKworCS8qIERyb3Agb3V0IHRoZSBwYWNrZXQgd2hpY2ggU2VxTnVtIGlzIHNtYWxsZXIgdGhhbiBXaW5TdGFydCAqLworCWlmKFNOX0xFU1MoU2VxTnVtLCBwVFMtPlJ4SW5kaWNhdGVTZXEpKSB7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwiUGFja2V0IERyb3AhIEluZGljYXRlU2VxOiAlZCwgTmV3U2VxOiAlZFxuIiwKKwkJCQkgcFRTLT5SeEluZGljYXRlU2VxLCBTZXFOdW0pOworCQlwSFRJbmZvLT5SeFJlb3JkZXJEcm9wQ291bnRlcisrOworCQl7CisJCQlpbnQgaTsKKwkJCWZvcihpID0wOyBpIDwgcHJ4Yi0+bnJfc3ViZnJhbWVzOyBpKyspIHsKKwkJCQlkZXZfa2ZyZWVfc2tiKHByeGItPnN1YmZyYW1lc1tpXSk7CisJCQl9CisJCQlrZnJlZShwcnhiKTsKKwkJCXByeGIgPSBOVUxMOworCQl9CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFNsaWRpbmcgd2luZG93IG1hbmlwdWxhdGlvbi4gQ29uZGl0aW9ucyBpbmNsdWRlczoKKwkgKiAxLiBJbmNvbWluZyBTZXFOdW0gaXMgZXF1YWwgdG8gV2luU3RhcnQgPT5XaW5kb3cgc2hpZnQgMQorCSAqIDIuIEluY29taW5nIFNlcU51bSBpcyBsYXJnZXIgdGhhbiB0aGUgV2luRW5kID0+IFdpbmRvdyBzaGlmdCBOCisJICovCisJaWYoU05fRVFVQUwoU2VxTnVtLCBwVFMtPlJ4SW5kaWNhdGVTZXEpKSB7CisJCXBUUy0+UnhJbmRpY2F0ZVNlcSA9IChwVFMtPlJ4SW5kaWNhdGVTZXEgKyAxKSAlIDQwOTY7CisJCWJNYXRjaFdpblN0YXJ0ID0gdHJ1ZTsKKwl9IGVsc2UgaWYoU05fTEVTUyhXaW5FbmQsIFNlcU51bSkpIHsKKwkJaWYoU2VxTnVtID49IChXaW5TaXplIC0gMSkpIHsKKwkJCXBUUy0+UnhJbmRpY2F0ZVNlcSA9IFNlcU51bSArIDEgLVdpblNpemU7CisJCX0gZWxzZSB7CisJCQlwVFMtPlJ4SW5kaWNhdGVTZXEgPSA0MDk1IC0gKFdpblNpemUgLSAoU2VxTnVtICsxKSkgKyAxOworCQl9CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwgIldpbmRvdyBTaGlmdCEgSW5kaWNhdGVTZXE6ICVkLCBOZXdTZXE6ICVkXG4iLHBUUy0+UnhJbmRpY2F0ZVNlcSwgU2VxTnVtKTsKKwl9CisKKwkvKgorCSAqIEluZGljYXRpb24gcHJvY2Vzcy4KKwkgKiBBZnRlciBQYWNrZXQgZHJvcHBpbmcgYW5kIFNsaWRpbmcgV2luZG93IHNoaWZ0aW5nIGFzIGFib3ZlLCB3ZSBjYW4gbm93IGp1c3QgaW5kaWNhdGUgdGhlIHBhY2tldHMKKwkgKiB3aXRoIHRoZSBTZXFOdW0gc21hbGxlciB0aGFuIGxhdGVzdCBXaW5TdGFydCBhbmQgYnVmZmVyIG90aGVyIHBhY2tldHMuCisJICovCisJLyogRm9yIFJ4IFJlb3JkZXIgY29uZGl0aW9uOgorCSAqIDEuIEFsbCBwYWNrZXRzIHdpdGggU2VxTnVtIHNtYWxsZXIgdGhhbiBXaW5TdGFydCA9PiBJbmRpY2F0ZQorCSAqIDIuIEFsbCBwYWNrZXRzIHdpdGggU2VxTnVtIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIFdpblN0YXJ0ID0+IEJ1ZmZlciBpdC4KKwkgKi8KKwlpZihiTWF0Y2hXaW5TdGFydCkgeworCQkvKiBDdXJyZW50IHBhY2tldCBpcyBnb2luZyB0byBiZSBpbmRpY2F0ZWQuKi8KKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCAiUGFja2V0cyBpbmRpY2F0aW9uISEgSW5kaWNhdGVTZXE6ICVkLCBOZXdTZXE6ICVkXG4iLFwKKwkJCQlwVFMtPlJ4SW5kaWNhdGVTZXEsIFNlcU51bSk7CisJCXByeGJJbmRpY2F0ZUFycmF5WzBdID0gcHJ4YjsKKy8vCQlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT4lcygpOiBTZXFOdW0gaXMgJWRcbiIsX19GVU5DVElPTl9fLFNlcU51bSk7CisJCWluZGV4ID0gMTsKKwl9IGVsc2UgeworCQkvKiBDdXJyZW50IHBhY2tldCBpcyBnb2luZyB0byBiZSBpbnNlcnRlZCBpbnRvIHBlbmRpbmcgbGlzdC4qLworCQkvL0lFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwiJXMoKTogV2UgUlggbm8gb3JkZXJlZCBwYWNrZWQsIGluc2VydCB0byBvcmRlcmQgbGlzdFxuIixfX0ZVTkNUSU9OX18pOworCQlpZighbGlzdF9lbXB0eSgmaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0KSkgeworCQkJcFJlb3JkZXJFbnRyeSA9IChQUlhfUkVPUkRFUl9FTlRSWSlsaXN0X2VudHJ5KGllZWUtPlJ4UmVvcmRlcl9VbnVzZWRfTGlzdC5uZXh0LFJYX1JFT1JERVJfRU5UUlksTGlzdCk7CisJCQlsaXN0X2RlbF9pbml0KCZwUmVvcmRlckVudHJ5LT5MaXN0KTsKKworCQkJLyogTWFrZSBhIHJlb3JkZXIgZW50cnkgYW5kIGluc2VydCBpbnRvIGEgdGhlIHBhY2tldCBsaXN0LiovCisJCQlwUmVvcmRlckVudHJ5LT5TZXFOdW0gPSBTZXFOdW07CisJCQlwUmVvcmRlckVudHJ5LT5wcnhiID0gcHJ4YjsKKwkvLwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCIlcygpOiBwUkVvcmRlckVudHJ5LT5TZXFOdW0gaXMgJWRcbiIsX19GVU5DVElPTl9fLHBSZW9yZGVyRW50cnktPlNlcU51bSk7CisKKwkJCWlmKCFBZGRSZW9yZGVyRW50cnkocFRTLCBwUmVvcmRlckVudHJ5KSkgeworCQkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwgIiVzKCk6IER1cGxpY2F0ZSBwYWNrZXQgaXMgZHJvcHBlZCEhIEluZGljYXRlU2VxOiAlZCwgTmV3U2VxOiAlZFxuIiwKKwkJCQkJX19GVU5DVElPTl9fLCBwVFMtPlJ4SW5kaWNhdGVTZXEsIFNlcU51bSk7CisJCQkJbGlzdF9hZGRfdGFpbCgmcFJlb3JkZXJFbnRyeS0+TGlzdCwmaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0KTsKKwkJCQl7CisJCQkJCWludCBpOworCQkJCQlmb3IoaSA9MDsgaSA8IHByeGItPm5yX3N1YmZyYW1lczsgaSsrKSB7CisJCQkJCQlkZXZfa2ZyZWVfc2tiKHByeGItPnN1YmZyYW1lc1tpXSk7CisJCQkJCX0KKwkJCQkJa2ZyZWUocHJ4Yik7CisJCQkJCXByeGIgPSBOVUxMOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLAorCQkJCQkgIlBrdCBpbnNlcnQgaW50byBidWZmZXIhISBJbmRpY2F0ZVNlcTogJWQsIE5ld1NlcTogJWRcbiIscFRTLT5SeEluZGljYXRlU2VxLCBTZXFOdW0pOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIFBhY2tldHMgYXJlIGRyb3BwZWQgaWYgdGhlcmUgaXMgbm90IGVub3VnaCByZW9yZGVyIGVudHJpZXMuCisJCQkgKiBUaGlzIHBhcnQgc2hhbGwgYmUgbW9kaWZpZWQhISBXZSBjYW4ganVzdCBpbmRpY2F0ZSBhbGwgdGhlCisJCQkgKiBwYWNrZXRzIGluIGJ1ZmZlciBhbmQgZ2V0IHJlb3JkZXIgZW50cmllcy4KKwkJCSAqLworCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJSeFJlb3JkZXJJbmRpY2F0ZVBhY2tldCgpOiBUaGVyZSBpcyBubyByZW9yZGVyIGVudHJ5ISEgUGFja2V0IGlzIGRyb3BwZWQhIVxuIik7CisJCQl7CisJCQkJaW50IGk7CisJCQkJZm9yKGkgPTA7IGkgPCBwcnhiLT5ucl9zdWJmcmFtZXM7IGkrKykgeworCQkJCQlkZXZfa2ZyZWVfc2tiKHByeGItPnN1YmZyYW1lc1tpXSk7CisJCQkJfQorCQkJCWtmcmVlKHByeGIpOworCQkJCXByeGIgPSBOVUxMOworCQkJfQorCQl9CisJfQorCisJLyogQ2hlY2sgaWYgdGhlcmUgaXMgYW55IHBhY2tldCBuZWVkIGluZGljYXRlLiovCisJd2hpbGUoIWxpc3RfZW1wdHkoJnBUUy0+UnhQZW5kaW5nUGt0TGlzdCkpIHsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCIlcygpOiBzdGFydCBSUkVPUkRFUiBpbmRpY2F0ZVxuIixfX0ZVTkNUSU9OX18pOworCQlwUmVvcmRlckVudHJ5ID0gKFBSWF9SRU9SREVSX0VOVFJZKWxpc3RfZW50cnkocFRTLT5SeFBlbmRpbmdQa3RMaXN0LnByZXYsUlhfUkVPUkRFUl9FTlRSWSxMaXN0KTsKKwkJaWYoIFNOX0xFU1MocFJlb3JkZXJFbnRyeS0+U2VxTnVtLCBwVFMtPlJ4SW5kaWNhdGVTZXEpIHx8CisJCQkJU05fRVFVQUwocFJlb3JkZXJFbnRyeS0+U2VxTnVtLCBwVFMtPlJ4SW5kaWNhdGVTZXEpKQorCQl7CisJCQkvKiBUaGlzIHByb3RlY3QgYnVmZmVyIGZyb20gb3ZlcmZsb3cuICovCisJCQlpZihpbmRleCA+PSBSRU9SREVSX1dJTl9TSVpFKSB7CisJCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJSeFJlb3JkZXJJbmRpY2F0ZVBhY2tldCgpOiBCdWZmZXIgb3ZlcmZsb3chISBcbiIpOworCQkJCWJQa3RJbkJ1ZiA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWxpc3RfZGVsX2luaXQoJnBSZW9yZGVyRW50cnktPkxpc3QpOworCisJCQlpZihTTl9FUVVBTChwUmVvcmRlckVudHJ5LT5TZXFOdW0sIHBUUy0+UnhJbmRpY2F0ZVNlcSkpCisJCQkJcFRTLT5SeEluZGljYXRlU2VxID0gKHBUUy0+UnhJbmRpY2F0ZVNlcSArIDEpICUgNDA5NjsKKworCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCJQYWNrZXRzIGluZGljYXRpb24hISBJbmRpY2F0ZVNlcTogJWQsIE5ld1NlcTogJWRcbiIscFRTLT5SeEluZGljYXRlU2VxLCBTZXFOdW0pOworCQkJcHJ4YkluZGljYXRlQXJyYXlbaW5kZXhdID0gcFJlb3JkZXJFbnRyeS0+cHJ4YjsKKwkJLy8JcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT0+JXMoKTogcFJlb3JkZXJFbnRyeS0+U2VxTnVtIGlzICVkXG4iLF9fRlVOQ1RJT05fXyxwUmVvcmRlckVudHJ5LT5TZXFOdW0pOworCQkJaW5kZXgrKzsKKworCQkJbGlzdF9hZGRfdGFpbCgmcFJlb3JkZXJFbnRyeS0+TGlzdCwmaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0KTsKKwkJfSBlbHNlIHsKKwkJCWJQa3RJbkJ1ZiA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIEhhbmRsaW5nIHBlbmRpbmcgdGltZXIuIFNldCB0aGlzIHRpbWVyIHRvIHByZXZlbnQgZnJvbSBsb25nIHRpbWUgUnggYnVmZmVyaW5nLiovCisJaWYoaW5kZXg+MCkgeworCQkvLyBDYW5jZWwgcHJldmlvdXMgcGVuZGluZyB0aW1lci4KKwkvLwlkZWxfdGltZXJfc3luYygmcFRTLT5SeFBrdFBlbmRpbmdUaW1lcik7CisJCXBUUy0+UnhUaW1lb3V0SW5kaWNhdGVTZXEgPSAweGZmZmY7CisKKwkJLy8gSW5kaWNhdGUgcGFja2V0cworCQlpZihpbmRleD5SRU9SREVSX1dJTl9TSVpFKXsKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiUnhSZW9yZGVySW5kaWNhdGVQYWNrZXQoKTogUnggUmVvcmVyIGJ1ZmZlciBmdWxsISEgXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZWVlODAyMTFfaW5kaWNhdGVfcGFja2V0cyhpZWVlLCBwcnhiSW5kaWNhdGVBcnJheSwgaW5kZXgpOworCX0KKworCWlmKGJQa3RJbkJ1ZiAmJiBwVFMtPlJ4VGltZW91dEluZGljYXRlU2VxPT0weGZmZmYpIHsKKwkJLy8gU2V0IG5ldyBwZW5kaW5nIHRpbWVyLgorCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JFT1JERVIsIiVzKCk6IFNFVCByeCB0aW1lb3V0IHRpbWVyXG4iLCBfX0ZVTkNUSU9OX18pOworCQlwVFMtPlJ4VGltZW91dEluZGljYXRlU2VxID0gcFRTLT5SeEluZGljYXRlU2VxOworCQlpZih0aW1lcl9wZW5kaW5nKCZwVFMtPlJ4UGt0UGVuZGluZ1RpbWVyKSkKKwkJCWRlbF90aW1lcl9zeW5jKCZwVFMtPlJ4UGt0UGVuZGluZ1RpbWVyKTsKKwkJcFRTLT5SeFBrdFBlbmRpbmdUaW1lci5leHBpcmVzID0gamlmZmllcyArIE1TRUNTKHBIVEluZm8tPlJ4UmVvcmRlclBlbmRpbmdUaW1lKTsKKwkJYWRkX3RpbWVyKCZwVFMtPlJ4UGt0UGVuZGluZ1RpbWVyKTsKKwl9Cit9CisKK3U4IHBhcnNlX3N1YmZyYW1lKHN0cnVjdCBza19idWZmICpza2IsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywKKwkJICBzdHJ1Y3QgaWVlZTgwMjExX3J4YiAqcnhiLHU4KiBzcmMsdTgqIGRzdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciogKXNrYi0+ZGF0YTsKKwl1MTYJCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCisJdTE2CQlMTENPZmZzZXQ9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CisJdTE2CQlDaGtMZW5ndGg7CisJYm9vbAkJYklzQWdncmVnYXRlRnJhbWUgPSBmYWxzZTsKKwl1MTYJCW5TdWJmcmFtZV9MZW5ndGg7CisJdTgJCW5QYWRkaW5nX0xlbmd0aCA9IDA7CisJdTE2CQlTZXFOdW09MDsKKworCXN0cnVjdCBza19idWZmICpzdWJfc2tiOworCXU4ICAgICAgICAgICAgICpkYXRhX3B0cjsKKwkvKiBqdXN0IGZvciBkZWJ1ZyBwdXJwb3NlICovCisJU2VxTnVtID0gV0xBTl9HRVRfU0VRX1NFUShsZTE2X3RvX2NwdShoZHItPnNlcV9jdGwpKTsKKworCWlmKChJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSYmXAorCQkJKCgoZnJhbWVxb3MgKikoc2tiLT5kYXRhICsgSUVFRTgwMjExXzNBRERSX0xFTikpLT5maWVsZC5yZXNlcnZlZCkpIHsKKwkJYklzQWdncmVnYXRlRnJhbWUgPSB0cnVlOworCX0KKworCWlmKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsKKwkJTExDT2Zmc2V0ICs9IDI7CisJfQorCisJaWYocnhfc3RhdHMtPmJDb250YWluSFRDKSB7CisJCUxMQ09mZnNldCArPSBzSFRDTG5nOworCX0KKwkvL3ByaW50aygiQ2hrTGVuZ3RoID0gJWRcbiIsIExMQ09mZnNldCk7CisJLy8gTnVsbCBwYWNrZXQsIGRvbid0IGluZGljYXRlIGl0IHRvIHVwcGVyIGxheWVyCisJQ2hrTGVuZ3RoID0gTExDT2Zmc2V0Oy8qICsgKEZyYW1lX1dFUChmcmFtZSkhPTAgP0FkYXB0ZXItPk1nbnRJbmZvLlNlY3VyaXR5SW5mby5FbmNyeXB0aW9uSGVhZE92ZXJoZWFkOjApOyovCisKKwlpZiggc2tiLT5sZW4gPD0gQ2hrTGVuZ3RoICkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlza2JfcHVsbChza2IsIExMQ09mZnNldCk7CisKKwlpZighYklzQWdncmVnYXRlRnJhbWUpIHsKKwkJcnhiLT5ucl9zdWJmcmFtZXMgPSAxOworI2lmZGVmIEpPSE5fTk9DUFkKKwkJcnhiLT5zdWJmcmFtZXNbMF0gPSBza2I7CisjZWxzZQorCQlyeGItPnN1YmZyYW1lc1swXSA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CisjZW5kaWYKKworCQltZW1jcHkocnhiLT5zcmMsc3JjLEVUSF9BTEVOKTsKKwkJbWVtY3B5KHJ4Yi0+ZHN0LGRzdCxFVEhfQUxFTik7CisJCS8vSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX1JYLHNrYi0+ZGF0YSxza2ItPmxlbik7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCXJ4Yi0+bnJfc3ViZnJhbWVzID0gMDsKKwkJbWVtY3B5KHJ4Yi0+c3JjLHNyYyxFVEhfQUxFTik7CisJCW1lbWNweShyeGItPmRzdCxkc3QsRVRIX0FMRU4pOworCQl3aGlsZShza2ItPmxlbiA+IEVUSEVSTkVUX0hFQURFUl9TSVpFKSB7CisJCQkvKiBPZmZzZXQgMTIgZGVub3RlIDIgbWFjIGFkZHJlc3MgKi8KKwkJCW5TdWJmcmFtZV9MZW5ndGggPSAqKCh1MTYqKShza2ItPmRhdGEgKyAxMikpOworCQkJLy89PW09PT5jaGFuZ2UgdGhlIGxlbmd0aCBvcmRlcgorCQkJblN1YmZyYW1lX0xlbmd0aCA9IChuU3ViZnJhbWVfTGVuZ3RoPj44KSArIChuU3ViZnJhbWVfTGVuZ3RoPDw4KTsKKworCQkJaWYoc2tiLT5sZW48KEVUSEVSTkVUX0hFQURFUl9TSVpFICsgblN1YmZyYW1lX0xlbmd0aCkpIHsKKwkJCQlwcmludGsoIiVzOiBBLU1TRFUgcGFyc2UgZXJyb3IhISBwUmZkLT5uVG90YWxTdWJmcmFtZSA6ICVkXG4iLFwKKwkJCQkJCV9fRlVOQ1RJT05fXyxyeGItPm5yX3N1YmZyYW1lcyk7CisJCQkJcHJpbnRrKCIlczogQS1NU0RVIHBhcnNlIGVycm9yISEgU3ViZnJhbWUgTGVuZ3RoOiAlZFxuIixfX0ZVTkNUSU9OX18sIG5TdWJmcmFtZV9MZW5ndGgpOworCQkJCXByaW50aygiblJlbWFpbl9MZW5ndGggaXMgJWQgYW5kIG5TdWJmcmFtZV9MZW5ndGggaXMgOiAlZFxuIixza2ItPmxlbixuU3ViZnJhbWVfTGVuZ3RoKTsKKwkJCQlwcmludGsoIlRoZSBQYWNrZXQgU2VxTnVtIGlzICVkXG4iLFNlcU51bSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCS8qIG1vdmUgdGhlIGRhdGEgcG9pbnQgdG8gZGF0YSBjb250ZW50ICovCisJCQlza2JfcHVsbChza2IsIEVUSEVSTkVUX0hFQURFUl9TSVpFKTsKKworI2lmZGVmIEpPSE5fTk9DUFkKKwkJCXN1Yl9za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJCXN1Yl9za2ItPmxlbiA9IG5TdWJmcmFtZV9MZW5ndGg7CisJCQlzdWJfc2tiLT50YWlsID0gc3ViX3NrYi0+ZGF0YSArIG5TdWJmcmFtZV9MZW5ndGg7CisjZWxzZQorCQkJLyogQWxsb2NhdGUgbmV3IHNrYiBmb3IgcmVsZWFzaW5nIHRvIHVwcGVyIGxheWVyICovCisJCQlzdWJfc2tiID0gZGV2X2FsbG9jX3NrYihuU3ViZnJhbWVfTGVuZ3RoICsgMTIpOworCQkJc2tiX3Jlc2VydmUoc3ViX3NrYiwgMTIpOworCQkJZGF0YV9wdHIgPSAodTggKilza2JfcHV0KHN1Yl9za2IsIG5TdWJmcmFtZV9MZW5ndGgpOworCQkJbWVtY3B5KGRhdGFfcHRyLHNrYi0+ZGF0YSxuU3ViZnJhbWVfTGVuZ3RoKTsKKyNlbmRpZgorCQkJcnhiLT5zdWJmcmFtZXNbcnhiLT5ucl9zdWJmcmFtZXMrK10gPSBzdWJfc2tiOworCQkJaWYocnhiLT5ucl9zdWJmcmFtZXMgPj0gTUFYX1NVQkZSQU1FX0NPVU5UKSB7CisJCQkJSUVFRTgwMjExX0RFQlVHX1JYKCJQYXJzZVN1YmZyYW1lKCk6IFRvbyBtYW55IFN1YmZyYW1lcyEgUGFja2V0cyBkcm9wcGVkIVxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlza2JfcHVsbChza2IsblN1YmZyYW1lX0xlbmd0aCk7CisKKwkJCWlmKHNrYi0+bGVuICE9IDApIHsKKwkJCQluUGFkZGluZ19MZW5ndGggPSA0IC0gKChuU3ViZnJhbWVfTGVuZ3RoICsgRVRIRVJORVRfSEVBREVSX1NJWkUpICUgNCk7CisJCQkJaWYoblBhZGRpbmdfTGVuZ3RoID09IDQpIHsKKwkJCQkJblBhZGRpbmdfTGVuZ3RoID0gMDsKKwkJCQl9CisKKwkJCQlpZihza2ItPmxlbiA8IG5QYWRkaW5nX0xlbmd0aCkgeworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisKKwkJCQlza2JfcHVsbChza2IsblBhZGRpbmdfTGVuZ3RoKTsKKwkJCX0KKwkJfQorI2lmZGVmIEpPSE5fTk9DUFkKKwkJZGV2X2tmcmVlX3NrYihza2IpOworI2VuZGlmCisJCS8ve2p1c3QgZm9yIGRlYnVnIGFkZGVkIGJ5IGRhdmlkCisJCS8vcHJpbnRrKCJBTVNEVTo6cnhiLT5ucl9zdWJmcmFtZXMgPSAlZFxuIixyeGItPm5yX3N1YmZyYW1lcyk7CisJCS8vfQorCQlyZXR1cm4gcnhiLT5ucl9zdWJmcmFtZXM7CisJfQorfQorCisvKiBBbGwgcmVjZWl2ZWQgZnJhbWVzIGFyZSBzZW50IHRvIHRoaXMgZnVuY3Rpb24uIEBza2IgY29udGFpbnMgdGhlIGZyYW1lIGluCisgKiBJRUVFIDgwMi4xMSBmb3JtYXQsIGkuZS4sIGluIHRoZSBmb3JtYXQgaXQgd2FzIHNlbnQgb3ZlciBhaXIuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKS4gKi8KK2ludCBpZWVlODAyMTFfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCSBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHI7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcnFvcyAqaGRyOworCisJc2l6ZV90IGhkcmxlbjsKKwl1MTYgZmMsIHR5cGUsIHN0eXBlLCBzYzsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHM7CisJdW5zaWduZWQgaW50IGZyYWc7CisJdTggKnBheWxvYWQ7CisJdTE2IGV0aGVydHlwZTsKKwkvL2FkZGVkIGJ5IGFteSBmb3IgcmVvcmRlcgorCXU4CVRJRCA9IDA7CisJdTE2CVNlcU51bSA9IDA7CisJUFJYX1RTX1JFQ09SRCBwVFMgPSBOVUxMOworCS8vYm9vbCBiSXNBZ2dyZWdhdGVGcmFtZSA9IGZhbHNlOworCS8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCisjaWZkZWYgTk9UX1lFVAorCXN0cnVjdCBuZXRfZGV2aWNlICp3ZHMgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2IyID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqd2RzID0gTlVMTDsKKwlpbnQgZnJhbWVfYXV0aG9yaXplZCA9IDA7CisJaW50IGZyb21fYXNzb2NfYXAgPSAwOworCXZvaWQgKnN0YSA9IE5VTEw7CisjZW5kaWYKKy8vCXUxNiBxb3NfY3RsID0gMDsKKwl1OCBkc3RbRVRIX0FMRU5dOworCXU4IHNyY1tFVEhfQUxFTl07CisJdTggYnNzaWRbRVRIX0FMRU5dOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQgPSBOVUxMOworCWludCBrZXlpZHggPSAwOworCisJaW50IGk7CisJc3RydWN0IGllZWU4MDIxMV9yeGIqIHJ4YiA9IE5VTEw7CisJLy8gY2hlYXQgdGhlIHRoZSBoZHIgdHlwZQorCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKXNrYi0+ZGF0YTsKKwlzdGF0cyA9ICZpZWVlLT5zdGF0czsKKworCWlmIChza2ItPmxlbiA8IDEwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTS0IgbGVuZ3RoIDwgMTBcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJfQorCisJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJdHlwZSA9IFdMQU5fRkNfR0VUX1RZUEUoZmMpOworCXN0eXBlID0gV0xBTl9GQ19HRVRfU1RZUEUoZmMpOworCXNjID0gbGUxNl90b19jcHUoaGRyLT5zZXFfY3RsKTsKKworCWZyYWcgPSBXTEFOX0dFVF9TRVFfRlJBRyhzYyk7CisJaGRybGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW4oZmMpOworCisJaWYoSFRDQ2hlY2soaWVlZSwgc2tiLT5kYXRhKSkKKwl7CisJCWlmKG5ldF9yYXRlbGltaXQoKSkKKwkJcHJpbnRrKCJmaW5kIEhUQ0NvbnRyb2xcbiIpOworCQloZHJsZW4gKz0gNDsKKwkJcnhfc3RhdHMtPmJDb250YWluSFRDID0gMTsKKwl9CisKKwkvL0lFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKyNpZmRlZiBOT1RfWUVUCisjaWYgV0lSRUxFU1NfRVhUID4gMTUKKwkvKiBQdXQgdGhpcyBjb2RlIGhlcmUgc28gdGhhdCB3ZSBhdm9pZCBkdXBsaWNhdGluZyBpdCBpbiBhbGwKKwkgKiBSeCBwYXRocy4gLSBKZWFuIElJICovCisjaWZkZWYgSVdfV0lSRUxFU1NfU1BZCQkvKiBkZWZpbmVkIGluIGl3X2hhbmRsZXIuaCAqLworCS8qIElmIHNweSBtb25pdG9yaW5nIG9uICovCisJaWYgKGlmYWNlLT5zcHlfZGF0YS5zcHlfbnVtYmVyID4gMCkgeworCQlzdHJ1Y3QgaXdfcXVhbGl0eSB3c3RhdHM7CisJCXdzdGF0cy5sZXZlbCA9IHJ4X3N0YXRzLT5yc3NpOworCQl3c3RhdHMubm9pc2UgPSByeF9zdGF0cy0+bm9pc2U7CisJCXdzdGF0cy51cGRhdGVkID0gNjsJLyogTm8gcXVhbCB2YWx1ZSAqLworCQkvKiBVcGRhdGUgc3B5IHJlY29yZHMgKi8KKwkJd2lyZWxlc3Nfc3B5X3VwZGF0ZShkZXYsIGhkci0+YWRkcjIsICZ3c3RhdHMpOworCX0KKyNlbmRpZiAvKiBJV19XSVJFTEVTU19TUFkgKi8KKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxNSAqLworCWhvc3RhcF91cGRhdGVfcnhfc3RhdHMobG9jYWwtPmFwLCBoZHIsIHJ4X3N0YXRzKTsKKyNlbmRpZgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTUKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpIHsKKwkJaWVlZTgwMjExX21vbml0b3JfcngoaWVlZSwgc2tiLCByeF9zdGF0cyk7CisJCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJCXN0YXRzLT5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJaWYgKGllZWUtPmhvc3RfZGVjcnlwdCkgeworCQlpbnQgaWR4ID0gMDsKKwkJaWYgKHNrYi0+bGVuID49IGhkcmxlbiArIDMpCisJCQlpZHggPSBza2ItPmRhdGFbaGRybGVuICsgM10gPj4gNjsKKwkJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZHhdOworI2lmZGVmIE5PVF9ZRVQKKwkJc3RhID0gTlVMTDsKKworCQkvKiBVc2Ugc3RhdGlvbiBzcGVjaWZpYyBrZXkgdG8gb3ZlcnJpZGUgZGVmYXVsdCBrZXlzIGlmIHRoZQorCQkgKiByZWNlaXZlciBhZGRyZXNzIGlzIGEgdW5pY2FzdCBhZGRyZXNzICgiaW5kaXZpZHVhbCBSQSIpLiBJZgorCQkgKiBiY3J4X3N0YV9rZXkgcGFyYW1ldGVyIGlzIHNldCwgc3RhdGlvbiBzcGVjaWZpYyBrZXkgaXMgdXNlZAorCQkgKiBldmVuIHdpdGggYnJvYWQvbXVsdGljYXN0IHRhcmdldHMgKHRoaXMgaXMgYWdhaW5zdCBJRUVFCisJCSAqIDgwMi4xMSwgYnV0IG1ha2VzIGl0IGVhc2llciB0byB1c2UgZGlmZmVyZW50IGtleXMgd2l0aAorCQkgKiBzdGF0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IFdFUCBrZXkgbWFwcGluZykuICovCisKKwkJaWYgKCEoaGRyLT5hZGRyMVswXSAmIDB4MDEpIHx8IGxvY2FsLT5iY3J4X3N0YV9rZXkpCisJCQkodm9pZCkgaG9zdGFwX2hhbmRsZV9zdGFfY3J5cHRvKGxvY2FsLCBoZHIsICZjcnlwdCwKKwkJCQkJCQkmc3RhKTsKKyNlbmRpZgorCisJCS8qIGFsbG93IE5VTEwgZGVjcnlwdCB0byBpbmRpY2F0ZSBhbiBzdGF0aW9uIHNwZWNpZmljIG92ZXJyaWRlCisJCSAqIGZvciBkZWZhdWx0IGVuY3J5cHRpb24gKi8KKwkJaWYgKGNyeXB0ICYmIChjcnlwdC0+b3BzID09IE5VTEwgfHwKKwkJCSAgICAgIGNyeXB0LT5vcHMtPmRlY3J5cHRfbXBkdSA9PSBOVUxMKSkKKwkJCWNyeXB0ID0gTlVMTDsKKworCQlpZiAoIWNyeXB0ICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkpIHsKKwkJCS8qIFRoaXMgc2VlbXMgdG8gYmUgdHJpZ2dlcmVkIGJ5IHNvbWUgKG11bHRpY2FzdD8pCisJCQkgKiBmcmFtZXMgZnJvbSBvdGhlciB0aGFuIGN1cnJlbnQgQlNTLCBzbyBqdXN0IGRyb3AgdGhlCisJCQkgKiBmcmFtZXMgc2lsZW50bHkgaW5zdGVhZCBvZiBmaWxsaW5nIHN5c3RlbSBsb2cgd2l0aAorCQkJICogdGhlc2UgcmVwb3J0cy4gKi8KKwkJCUlFRUU4MDIxMV9ERUJVR19EUk9QKCJEZWNyeXB0aW9uIGZhaWxlZCAobm90IHNldCkiCisJCQkJCSAgICAgIiAoU0E9IiBNQUNfRk1UICIpXG4iLAorCQkJCQkgICAgIE1BQ19BUkcoaGRyLT5hZGRyMikpOworCQkJaWVlZS0+aWVlZV9zdGF0cy5yeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlKys7CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCX0KKwl9CisKKwlpZiAoc2tiLT5sZW4gPCBJRUVFODAyMTFfREFUQV9IRFIzX0xFTikKKwkJZ290byByeF9kcm9wcGVkOworCisJLy8gaWYgUW9TIGVuYWJsZWQsIHNob3VsZCBjaGVjayB0aGUgc2VxdWVuY2UgZm9yIGVhY2ggb2YgdGhlIEFDCisJaWYoIChpZWVlLT5wSFRJbmZvLT5iQ3VyUnhSZW9yZGVyRW5hYmxlID09IGZhbHNlKSB8fCAhaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZXx8ICFJc0RhdGFGcmFtZShza2ItPmRhdGEpIHx8IElzTGVnYWN5RGF0YUZyYW1lKHNrYi0+ZGF0YSkpeworCQlpZiAoaXNfZHVwbGljYXRlX3BhY2tldChpZWVlLCBoZHIpKQorCQlnb3RvIHJ4X2Ryb3BwZWQ7CisKKwl9CisJZWxzZQorCXsKKwkJUFJYX1RTX1JFQ09SRCBwUnhUUyA9IE5VTEw7CisJCQkvL0lFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwiJXMoKTogUU9TIEVOQUJMRSBBTkQgUkVDRUlWRSBRT1MgREFUQSAsIHdlIHdpbGwgZ2V0IFRzLCB0aWQ6JWRcbiIsX19GVU5DVElPTl9fLCB0aWQpOworCQlpZihHZXRUcygKKwkJCQlpZWVlLAorCQkJCShQVFNfQ09NTU9OX0lORk8qKSAmcFJ4VFMsCisJCQkJaGRyLT5hZGRyMiwKKwkJCQkodTgpRnJhbWVfUW9TVElEKCh1OCopKHNrYi0+ZGF0YSkpLAorCQkJCVJYX0RJUiwKKwkJCQl0cnVlKSkKKwkJeworCisJCS8vCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwiJXMoKTogcFJ4VFMtPlJ4TGFzdEZyYWdOdW0gaXMgJWQsZnJhZyBpcyAlZCxwUnhUUy0+UnhMYXN0U2VxTnVtIGlzICVkLHNlcSBpcyAlZFxuIixfX0ZVTkNUSU9OX18scFJ4VFMtPlJ4TGFzdEZyYWdOdW0sZnJhZyxwUnhUUy0+UnhMYXN0U2VxTnVtLFdMQU5fR0VUX1NFUV9TRVEoc2MpKTsKKwkJCWlmKCAJKGZjICYgKDE8PDExKSkgICYmCisJCQkJCShmcmFnID09IHBSeFRTLT5SeExhc3RGcmFnTnVtKSAmJgorCQkJCQkoV0xBTl9HRVRfU0VRX1NFUShzYykgPT0gcFJ4VFMtPlJ4TGFzdFNlcU51bSkJKQorCQkJeworCQkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwUnhUUy0+UnhMYXN0RnJhZ051bSA9IGZyYWc7CisJCQkJcFJ4VFMtPlJ4TGFzdFNlcU51bSA9IFdMQU5fR0VUX1NFUV9TRVEoc2MpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICIlcygpOiBObyBUUyEhIFNraXAgdGhlIGNoZWNrISFcbiIsX19GVU5DVElPTl9fKTsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCX0KKwlpZiAodHlwZSA9PSBJRUVFODAyMTFfRlRZUEVfTUdNVCkgeworCisKKwkvL0lFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJaWYgKGllZWU4MDIxMV9yeF9mcmFtZV9tZ210KGllZWUsIHNrYiwgcnhfc3RhdHMsIHR5cGUsIHN0eXBlKSkKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJZWxzZQorCQkJZ290byByeF9leGl0OworCX0KKworCS8qIERhdGEgZnJhbWUgLSBleHRyYWN0IHNyYy9kc3QgYWRkcmVzc2VzICovCisJc3dpdGNoIChmYyAmIChJRUVFODAyMTFfRkNUTF9GUk9NRFMgfCBJRUVFODAyMTFfRkNUTF9UT0RTKSkgeworCWNhc2UgSUVFRTgwMjExX0ZDVExfRlJPTURTOgorCQltZW1jcHkoZHN0LCBoZHItPmFkZHIxLCBFVEhfQUxFTik7CisJCW1lbWNweShzcmMsIGhkci0+YWRkcjMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGJzc2lkLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZDVExfVE9EUzoKKwkJbWVtY3B5KGRzdCwgaGRyLT5hZGRyMywgRVRIX0FMRU4pOworCQltZW1jcHkoc3JjLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7CisJCW1lbWNweShic3NpZCwgaGRyLT5hZGRyMSwgRVRIX0FMRU4pOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFM6CisJCWlmIChza2ItPmxlbiA8IElFRUU4MDIxMV9EQVRBX0hEUjRfTEVOKQorCQkJZ290byByeF9kcm9wcGVkOworCQltZW1jcHkoZHN0LCBoZHItPmFkZHIzLCBFVEhfQUxFTik7CisJCW1lbWNweShzcmMsIGhkci0+YWRkcjQsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGJzc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQltZW1jcHkoZHN0LCBoZHItPmFkZHIxLCBFVEhfQUxFTik7CisJCW1lbWNweShzcmMsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGJzc2lkLCBoZHItPmFkZHIzLCBFVEhfQUxFTik7CisJCWJyZWFrOworCX0KKworI2lmZGVmIE5PVF9ZRVQKKwlpZiAoaG9zdGFwX3J4X2ZyYW1lX3dkcyhpZWVlLCBoZHIsIGZjLCAmd2RzKSkKKwkJZ290byByeF9kcm9wcGVkOworCWlmICh3ZHMpIHsKKwkJc2tiLT5kZXYgPSBkZXYgPSB3ZHM7CisJCXN0YXRzID0gaG9zdGFwX2dldF9zdGF0cyhkZXYpOworCX0KKworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSICYmICF3ZHMgJiYKKwkgICAgKGZjICYgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSA9PSBJRUVFODAyMTFfRkNUTF9GUk9NRFMgJiYKKwkgICAgaWVlZS0+c3RhZGV2ICYmCisJICAgIG1lbWNtcChoZHItPmFkZHIyLCBpZWVlLT5hc3NvY19hcF9hZGRyLCBFVEhfQUxFTikgPT0gMCkgeworCQkvKiBGcmFtZSBmcm9tIEJTU0lEIG9mIHRoZSBBUCBmb3Igd2hpY2ggd2UgYXJlIGEgY2xpZW50ICovCisJCXNrYi0+ZGV2ID0gZGV2ID0gaWVlZS0+c3RhZGV2OworCQlzdGF0cyA9IGhvc3RhcF9nZXRfc3RhdHMoZGV2KTsKKwkJZnJvbV9hc3NvY19hcCA9IDE7CisJfQorI2VuZGlmCisKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCisjaWZkZWYgTk9UX1lFVAorCWlmICgoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiB8fAorCSAgICAgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX1JFUEVBVCkgJiYKKwkgICAgIWZyb21fYXNzb2NfYXApIHsKKwkJc3dpdGNoIChob3N0YXBfaGFuZGxlX3N0YV9yeChpZWVlLCBkZXYsIHNrYiwgcnhfc3RhdHMsCisJCQkJCSAgICAgd2RzICE9IE5VTEwpKSB7CisJCWNhc2UgQVBfUlhfQ09OVElOVUVfTk9UX0FVVEhPUklaRUQ6CisJCQlmcmFtZV9hdXRob3JpemVkID0gMDsKKwkJCWJyZWFrOworCQljYXNlIEFQX1JYX0NPTlRJTlVFOgorCQkJZnJhbWVfYXV0aG9yaXplZCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBBUF9SWF9EUk9QOgorCQkJZ290byByeF9kcm9wcGVkOworCQljYXNlIEFQX1JYX0VYSVQ6CisJCQlnb3RvIHJ4X2V4aXQ7CisJCX0KKwl9CisjZW5kaWYKKwkvL0lFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkvKiBOdWxsZnVuYyBmcmFtZXMgbWF5IGhhdmUgUFMtYml0IHNldCwgc28gdGhleSBtdXN0IGJlIHBhc3NlZCB0bworCSAqIGhvc3RhcF9oYW5kbGVfc3RhX3J4KCkgYmVmb3JlIGJlaW5nIGRyb3BwZWQgaGVyZS4gKi8KKwlpZiAoc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEEgJiYKKwkgICAgc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0sgJiYKKwkgICAgc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZQT0xMICYmCisJICAgIHN0eXBlICE9IElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLUE9MTCYmCisJICAgIHN0eXBlICE9IElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQS8vYWRkIGJ5IERhdmlkLDIwMDYuOC40CisJICAgICkgeworCQlpZiAoc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX05VTExGVU5DKQorCQkJSUVFRTgwMjExX0RFQlVHX0RST1AoCisJCQkJIlJYOiBkcm9wcGVkIGRhdGEgZnJhbWUgIgorCQkJCSJ3aXRoIG5vIGRhdGEgKHR5cGU9MHglMDJ4LCAiCisJCQkJInN1YnR5cGU9MHglMDJ4LCBsZW49JWQpXG4iLAorCQkJCXR5cGUsIHN0eXBlLCBza2ItPmxlbik7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisgICAgICAgIGlmIChtZW1jbXAoYnNzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pKQorICAgICAgICAgICAgICAgIGdvdG8gcnhfZHJvcHBlZDsKKworCS8qIHNrYjogaGRyICsgKHBvc3NpYmx5IGZyYWdtZW50ZWQsIHBvc3NpYmx5IGVuY3J5cHRlZCkgcGF5bG9hZCAqLworCisJaWYgKGllZWUtPmhvc3RfZGVjcnlwdCAmJiAoZmMgJiBJRUVFODAyMTFfRkNUTF9XRVApICYmCisJICAgIChrZXlpZHggPSBpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdChpZWVlLCBza2IsIGNyeXB0KSkgPCAwKQorCXsKKwkJcHJpbnRrKCJkZWNyeXB0IGZyYW1lIGVycm9yXG4iKTsKKwkJZ290byByeF9kcm9wcGVkOworCX0KKworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKworCS8qIHNrYjogaGRyICsgKHBvc3NpYmx5IGZyYWdtZW50ZWQpIHBsYWludGV4dCBwYXlsb2FkICovCisJLy8gUFI6IEZJWE1FOiBob3N0YXAgaGFzIGFkZGl0aW9uYWwgY29uZGl0aW9ucyBpbiB0aGUgImlmIiBiZWxvdzoKKwkvLyBpZWVlLT5ob3N0X2RlY3J5cHQgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJgorCWlmICgoZnJhZyAhPSAwIHx8IChmYyAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUykpKSB7CisJCWludCBmbGVuOworCQlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZ19za2IgPSBpZWVlODAyMTFfZnJhZ19jYWNoZV9nZXQoaWVlZSwgaGRyKTsKKwkJSUVFRTgwMjExX0RFQlVHX0ZSQUcoIlJ4IEZyYWdtZW50IHJlY2VpdmVkICgldSlcbiIsIGZyYWcpOworCisJCWlmICghZnJhZ19za2IpIHsKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUlggfCBJRUVFODAyMTFfRExfRlJBRywKKwkJCQkJIlJ4IGNhbm5vdCBnZXQgc2tiIGZyb20gZnJhZ21lbnQgIgorCQkJCQkiY2FjaGUgKG1vcmVmcmFnPSVkIHNlcT0ldSBmcmFnPSV1KVxuIiwKKwkJCQkJKGZjICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSAhPSAwLAorCQkJCQlXTEFOX0dFVF9TRVFfU0VRKHNjKSwgZnJhZyk7CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCX0KKwkJZmxlbiA9IHNrYi0+bGVuOworCQlpZiAoZnJhZyAhPSAwKQorCQkJZmxlbiAtPSBoZHJsZW47CisKKwkJaWYgKGZyYWdfc2tiLT50YWlsICsgZmxlbiA+IGZyYWdfc2tiLT5lbmQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBob3N0IGRlY3J5cHRlZCBhbmQgIgorCQkJICAgICAgICJyZWFzc2VtYmxlZCBmcmFtZSBkaWQgbm90IGZpdCBza2JcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWllZWU4MDIxMV9mcmFnX2NhY2hlX2ludmFsaWRhdGUoaWVlZSwgaGRyKTsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCisJCWlmIChmcmFnID09IDApIHsKKwkJCS8qIGNvcHkgZmlyc3QgZnJhZ21lbnQgKGluY2x1ZGluZyBmdWxsIGhlYWRlcnMpIGludG8KKwkJCSAqIGJlZ2lubmluZyBvZiB0aGUgZnJhZ21lbnQgY2FjaGUgc2tiICovCisJCQltZW1jcHkoc2tiX3B1dChmcmFnX3NrYiwgZmxlbiksIHNrYi0+ZGF0YSwgZmxlbik7CisJCX0gZWxzZSB7CisJCQkvKiBhcHBlbmQgZnJhbWUgcGF5bG9hZCB0byB0aGUgZW5kIG9mIHRoZSBmcmFnbWVudAorCQkJICogY2FjaGUgc2tiICovCisJCQltZW1jcHkoc2tiX3B1dChmcmFnX3NrYiwgZmxlbiksIHNrYi0+ZGF0YSArIGhkcmxlbiwKKwkJCSAgICAgICBmbGVuKTsKKwkJfQorCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlza2IgPSBOVUxMOworCisJCWlmIChmYyAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUykgeworCQkJLyogbW9yZSBmcmFnbWVudHMgZXhwZWN0ZWQgLSBsZWF2ZSB0aGUgc2tiIGluIGZyYWdtZW50CisJCQkgKiBjYWNoZSBmb3Igbm93OyBpdCB3aWxsIGJlIGRlbGl2ZXJlZCB0byB1cHBlciBsYXllcnMKKwkJCSAqIGFmdGVyIGFsbCBmcmFnbWVudHMgaGF2ZSBiZWVuIHJlY2VpdmVkICovCisJCQlnb3RvIHJ4X2V4aXQ7CisJCX0KKworCQkvKiB0aGlzIHdhcyB0aGUgbGFzdCBmcmFnbWVudCBhbmQgdGhlIGZyYW1lIHdpbGwgYmUKKwkJICogZGVsaXZlcmVkLCBzbyByZW1vdmUgc2tiIGZyb20gZnJhZ21lbnQgY2FjaGUgKi8KKwkJc2tiID0gZnJhZ19za2I7CisJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CisJCWllZWU4MDIxMV9mcmFnX2NhY2hlX2ludmFsaWRhdGUoaWVlZSwgaGRyKTsKKwl9CisKKwkvKiBza2I6IGhkciArIChwb3NzaWJsZSByZWFzc2VtYmxlZCkgZnVsbCBNU0RVIHBheWxvYWQ7IHBvc3NpYmx5IHN0aWxsCisJICogZW5jcnlwdGVkL2F1dGhlbnRpY2F0ZWQgKi8KKwlpZiAoaWVlZS0+aG9zdF9kZWNyeXB0ICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkgJiYKKwkgICAgaWVlZTgwMjExX3J4X2ZyYW1lX2RlY3J5cHRfbXNkdShpZWVlLCBza2IsIGtleWlkeCwgY3J5cHQpKQorCXsKKwkJcHJpbnRrKCI9PT5kZWNyeXB0IG1zZHUgZXJyb3JcbiIpOworCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJfQorCisJLy9hZGRlZCBieSBhbXkgZm9yIEFQIHJvYW1pbmcKKwlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2RGF0YUluUGVyaW9kKys7CisJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUnhPa0luUGVyaW9kKys7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKikgc2tiLT5kYXRhOworCWlmIChjcnlwdCAmJiAhKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJiAhaWVlZS0+b3Blbl93ZXApIHsKKwkJaWYgKC8qaWVlZS0+aWVlZTgwMl8xeCAmJiovCisJCSAgICBpZWVlODAyMTFfaXNfZWFwb2xfZnJhbWUoaWVlZSwgc2tiLCBoZHJsZW4pKSB7CisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCQkvKiBwYXNzIHVuZW5jcnlwdGVkIEVBUE9MIGZyYW1lcyBldmVuIGlmIGVuY3J5cHRpb24gaXMKKwkJCSAqIGNvbmZpZ3VyZWQgKi8KKwkJCXN0cnVjdCBlYXBvbCAqZWFwID0gKHN0cnVjdCBlYXBvbCAqKShza2ItPmRhdGEgKworCQkJCTI0KTsKKwkJCUlFRUU4MDIxMV9ERUJVR19FQVAoIlJYOiBJRUVFIDgwMi4xWCBFQVBPTCBmcmFtZTogJXNcbiIsCisJCQkJCQllYXBfZ2V0X3R5cGUoZWFwLT50eXBlKSk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCUlFRUU4MDIxMV9ERUJVR19EUk9QKAorCQkJCSJlbmNyeXB0aW9uIGNvbmZpZ3VyZWQsIGJ1dCBSWCAiCisJCQkJImZyYW1lIG5vdCBlbmNyeXB0ZWQgKFNBPSIgTUFDX0ZNVCAiKVxuIiwKKwkJCQlNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCX0KKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwlpZiAoY3J5cHQgJiYgIShmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkgJiYKKwkgICAgaWVlZTgwMjExX2lzX2VhcG9sX2ZyYW1lKGllZWUsIHNrYiwgaGRybGVuKSkgeworCQkJc3RydWN0IGVhcG9sICplYXAgPSAoc3RydWN0IGVhcG9sICopKHNrYi0+ZGF0YSArCisJCQkJMjQpOworCQkJSUVFRTgwMjExX0RFQlVHX0VBUCgiUlg6IElFRUUgODAyLjFYIEVBUE9MIGZyYW1lOiAlc1xuIiwKKwkJCQkJCWVhcF9nZXRfdHlwZShlYXAtPnR5cGUpKTsKKwl9CisjZW5kaWYKKworCWlmIChjcnlwdCAmJiAhKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJiAhaWVlZS0+b3Blbl93ZXAgJiYKKwkgICAgIWllZWU4MDIxMV9pc19lYXBvbF9mcmFtZShpZWVlLCBza2IsIGhkcmxlbikpIHsKKwkJSUVFRTgwMjExX0RFQlVHX0RST1AoCisJCQkiZHJvcHBlZCB1bmVuY3J5cHRlZCBSWCBkYXRhICIKKwkJCSJmcmFtZSBmcm9tICIgTUFDX0ZNVAorCQkJIiAoZHJvcF91bmVuY3J5cHRlZD0xKVxuIiwKKwkJCU1BQ19BUkcoaGRyLT5hZGRyMikpOworCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJfQorLyoKKwlpZihpZWVlODAyMTFfaXNfZWFwb2xfZnJhbWUoaWVlZSwgc2tiLCBoZHJsZW4pKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJYOiBJRUVFODAyLjFYIEVQQU9MIGZyYW1lIVxuIik7CisJfQorKi8KKy8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCisJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSAmJiBJc1FvU0RhdGFGcmFtZShza2ItPmRhdGEpCisJCSYmICFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSAmJiAhaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpCisJeworCQlUSUQgPSBGcmFtZV9Rb1NUSUQoc2tiLT5kYXRhKTsKKwkJU2VxTnVtID0gV0xBTl9HRVRfU0VRX1NFUShzYyk7CisJCUdldFRzKGllZWUsKFBUU19DT01NT05fSU5GTyopICZwVFMsaGRyLT5hZGRyMixUSUQsUlhfRElSLHRydWUpOworCQlpZihUSUQgIT0wICYmIFRJRCAhPTMpCisJCXsKKwkJCWllZWUtPmJpc19hbnlfbm9uYmVwa3RzID0gdHJ1ZTsKKwkJfQorCX0KKy8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCisJLyogc2tiOiBoZHIgKyAocG9zc2libGUgcmVhc3NlbWJsZWQpIGZ1bGwgcGxhaW50ZXh0IHBheWxvYWQgKi8KKwlwYXlsb2FkID0gc2tiLT5kYXRhICsgaGRybGVuOworCS8vZXRoZXJ0eXBlID0gKHBheWxvYWRbNl0gPDwgOCkgfCBwYXlsb2FkWzddOworCXJ4YiA9IChzdHJ1Y3QgaWVlZTgwMjExX3J4Yiopa21hbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yeGIpLEdGUF9BVE9NSUMpOworCWlmKHJ4YiA9PSBOVUxMKQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsIiVzKCk6IGttYWxsb2MgcnhiIGVycm9yXG4iLF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisJLyogdG8gcGFyc2UgYW1zZHUgcGFja2V0cyAqLworCS8qIHFvcyBkYXRhIHBhY2tldHMgJiByZXNlcnZlZCBiaXQgaXMgMSAqLworCWlmKHBhcnNlX3N1YmZyYW1lKHNrYixyeF9zdGF0cyxyeGIsc3JjLGRzdCkgPT0gMCkgeworCQkvKiBvbmx5IHRvIGZyZWUgcnhiLCBhbmQgbm90IHN1Ym1pdCB0aGUgcGFja2V0cyB0byB1cHBlciBsYXllciAqLworCQlmb3IoaSA9MDsgaSA8IHJ4Yi0+bnJfc3ViZnJhbWVzOyBpKyspIHsKKwkJCWRldl9rZnJlZV9za2IocnhiLT5zdWJmcmFtZXNbaV0pOworCQl9CisJCWtmcmVlKHJ4Yik7CisJCXJ4YiA9IE5VTEw7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisKKy8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCisJaWYoaWVlZS0+cEhUSW5mby0+YkN1clJ4UmVvcmRlckVuYWJsZSA9PSBmYWxzZSB8fHBUUyA9PSBOVUxMKXsKKy8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCisJCWZvcihpID0gMDsgaTxyeGItPm5yX3N1YmZyYW1lczsgaSsrKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc3ViX3NrYiA9IHJ4Yi0+c3ViZnJhbWVzW2ldOworCisJCQlpZiAoc3ViX3NrYikgeworCQkJCS8qIGNvbnZlcnQgaGRyICsgcG9zc2libGUgTExDIGhlYWRlcnMgaW50byBFdGhlcm5ldCBoZWFkZXIgKi8KKwkJCQlldGhlcnR5cGUgPSAoc3ViX3NrYi0+ZGF0YVs2XSA8PCA4KSB8IHN1Yl9za2ItPmRhdGFbN107CisJCQkJaWYgKHN1Yl9za2ItPmxlbiA+PSA4ICYmCisJCQkJCQkoKG1lbWNtcChzdWJfc2tiLT5kYXRhLCByZmMxMDQyX2hlYWRlciwgU05BUF9TSVpFKSA9PSAwICYmCisJCQkJCQkgIGV0aGVydHlwZSAhPSBFVEhfUF9BQVJQICYmIGV0aGVydHlwZSAhPSBFVEhfUF9JUFgpIHx8CisJCQkJCQkgbWVtY21wKHN1Yl9za2ItPmRhdGEsIGJyaWRnZV90dW5uZWxfaGVhZGVyLCBTTkFQX1NJWkUpID09IDApKSB7CisJCQkJCS8qIHJlbW92ZSBSRkMxMDQyIG9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbiBhbmQKKwkJCQkJICogcmVwbGFjZSBFdGhlclR5cGUgKi8KKwkJCQkJc2tiX3B1bGwoc3ViX3NrYiwgU05BUF9TSVpFKTsKKwkJCQkJbWVtY3B5KHNrYl9wdXNoKHN1Yl9za2IsIEVUSF9BTEVOKSwgc3JjLCBFVEhfQUxFTik7CisJCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIGRzdCwgRVRIX0FMRU4pOworCQkJCX0gZWxzZSB7CisJCQkJCXUxNiBsZW47CisJCQkJCS8qIExlYXZlIEV0aGVybmV0IGhlYWRlciBwYXJ0IG9mIGhkciBhbmQgZnVsbCBwYXlsb2FkICovCisJCQkJCWxlbiA9IGh0b25zKHN1Yl9za2ItPmxlbik7CisJCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCAyKSwgJmxlbiwgMik7CisJCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIHNyYywgRVRIX0FMRU4pOworCQkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBkc3QsIEVUSF9BTEVOKTsKKwkJCQl9CisKKwkJCQlzdGF0cy0+cnhfcGFja2V0cysrOworCQkJCXN0YXRzLT5yeF9ieXRlcyArPSBzdWJfc2tiLT5sZW47CisJCQkJaWYoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZHN0KSkgeworCQkJCQlzdGF0cy0+bXVsdGljYXN0Kys7CisJCQkJfQorCisJCQkJLyogSW5kaWNhdCB0aGUgcGFja2V0cyB0byB1cHBlciBsYXllciAqLworCQkJCS8vcHJpbnRrKCIwc2tiX2xlbiglZClcbiIsIHNrYi0+bGVuKTsKKwkJCQlzdWJfc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHN1Yl9za2IsIGRldik7CisJCQkJbWVtc2V0KHN1Yl9za2ItPmNiLCAwLCBzaXplb2Yoc3ViX3NrYi0+Y2IpKTsKKwkJCQlzdWJfc2tiLT5kZXYgPSBkZXY7CisJCQkJc3ViX3NrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsgLyogODAyLjExIGNyYyBub3Qgc3VmZmljaWVudCAqLworCQkJCS8vc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsgLyogODAyLjExIGNyYyBub3Qgc3VmZmljaWVudCAqLworCQkJCWllZWUtPmxhc3RfcnhfcHNfdGltZSA9IGppZmZpZXM7CisJCQkJLy9wcmludGsoIjFza2JfbGVuKCVkKVxuIiwgc2tiLT5sZW4pOworCQkJCW5ldGlmX3J4KHN1Yl9za2IpOworCQkJfQorCQl9CisJCWtmcmVlKHJ4Yik7CisJCXJ4YiA9IE5VTEw7CisKKwl9CisJZWxzZQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCIlcygpOiBSRU9SREVSIEVOQUJMRSBBTkQgUFRTIG5vdCBOVUxMLCBhbmQgd2Ugd2lsbCBlbnRlciBSeFJlb3JkZXJJbmRpY2F0ZVBhY2tldCgpXG4iLF9fRlVOQ1RJT05fXyk7CisJCVJ4UmVvcmRlckluZGljYXRlUGFja2V0KGllZWUsIHJ4YiwgcFRTLCBTZXFOdW0pOworCX0KKyNpZm5kZWYgSk9ITl9OT0NQWQorCWRldl9rZnJlZV9za2Ioc2tiKTsKKyNlbmRpZgorCisgcnhfZXhpdDoKKyNpZmRlZiBOT1RfWUVUCisJaWYgKHN0YSkKKwkJaG9zdGFwX2hhbmRsZV9zdGFfcmVsZWFzZShzdGEpOworI2VuZGlmCisJcmV0dXJuIDE7CisKKyByeF9kcm9wcGVkOgorCWlmIChyeGIgIT0gTlVMTCkKKwl7CisJCWtmcmVlKHJ4Yik7CisJCXJ4YiA9IE5VTEw7CisJfQorCXN0YXRzLT5yeF9kcm9wcGVkKys7CisKKwkvKiBSZXR1cm5pbmcgMCBpbmRpY2F0ZXMgdG8gY2FsbGVyIHRoYXQgd2UgaGF2ZSBub3QgaGFuZGxlZCB0aGUgU0tCLS0KKwkgKiBzbyBpdCBpcyBzdGlsbCBhbGxvY2F0ZWQgYW5kIGNhbiBiZSB1c2VkIGFnYWluIGJ5IHVuZGVybHlpbmcKKwkgKiBoYXJkd2FyZSBhcyBhIERNQSB0YXJnZXQgKi8KKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNR01UX0ZSQU1FX0ZJWEVEX1BBUlRfTEVOR1RIICAgICAgICAgICAgMHgyNAorCitzdGF0aWMgdTggcW9zX291aVtRT1NfT1VJX0xFTl0gPSB7IDB4MDAsIDB4NTAsIDB4RjIgfTsKKworLyoKKyogTWFrZSB0aGVyIHN0cnVjdHVyZSB3ZSByZWFkIGZyb20gdGhlIGJlYWNvbiBwYWNrZXQgaGFzCisqIHRoZSByaWdodCB2YWx1ZXMKKyovCitzdGF0aWMgaW50IGllZWU4MDIxMV92ZXJpZnlfcW9zX2luZm8oc3RydWN0IGllZWU4MDIxMV9xb3NfaW5mb3JtYXRpb25fZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbmZvX2VsZW1lbnQsIGludCBzdWJfdHlwZSkKK3sKKworICAgICAgICBpZiAoaW5mb19lbGVtZW50LT5xdWlfc3VidHlwZSAhPSBzdWJfdHlwZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChtZW1jbXAoaW5mb19lbGVtZW50LT5xdWksIHFvc19vdWksIFFPU19PVUlfTEVOKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChpbmZvX2VsZW1lbnQtPnF1aV90eXBlICE9IFFPU19PVUlfVFlQRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChpbmZvX2VsZW1lbnQtPnZlcnNpb24gIT0gUU9TX1ZFUlNJT05fMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFBhcnNlIGEgUW9TIHBhcmFtZXRlciBlbGVtZW50CisgKi8KK3N0YXRpYyBpbnQgaWVlZTgwMjExX3JlYWRfcW9zX3BhcmFtX2VsZW1lbnQoc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVyX2luZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmVsZW1lbnRfcGFyYW0sIHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbmZvX2VsZW1lbnQpCit7CisgICAgICAgIGludCByZXQgPSAwOworICAgICAgICB1MTYgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJfaW5mbykgLSAyOworCisgICAgICAgIGlmICgoaW5mb19lbGVtZW50ID09IE5VTEwpIHx8IChlbGVtZW50X3BhcmFtID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBpZiAoaW5mb19lbGVtZW50LT5pZCA9PSBRT1NfRUxFTUVOVF9JRCAmJiBpbmZvX2VsZW1lbnQtPmxlbiA9PSBzaXplKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGVsZW1lbnRfcGFyYW0tPmluZm9fZWxlbWVudC5xdWksIGluZm9fZWxlbWVudC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5mb19lbGVtZW50LT5sZW4pOworICAgICAgICAgICAgICAgIGVsZW1lbnRfcGFyYW0tPmluZm9fZWxlbWVudC5lbGVtZW50SUQgPSBpbmZvX2VsZW1lbnQtPmlkOworICAgICAgICAgICAgICAgIGVsZW1lbnRfcGFyYW0tPmluZm9fZWxlbWVudC5sZW5ndGggPSBpbmZvX2VsZW1lbnQtPmxlbjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIGlmIChyZXQgPT0gMCkKKyAgICAgICAgICAgICAgICByZXQgPSBpZWVlODAyMTFfdmVyaWZ5X3Fvc19pbmZvKCZlbGVtZW50X3BhcmFtLT5pbmZvX2VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRT1NfT1VJX1BBUkFNX1NVQl9UWVBFKTsKKyAgICAgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFBhcnNlIGEgUW9TIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAqLworc3RhdGljIGludCBpZWVlODAyMTFfcmVhZF9xb3NfaW5mb19lbGVtZW50KHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWU4MDIxMV9xb3NfaW5mb3JtYXRpb25fZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICplbGVtZW50X2luZm8sIHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmluZm9fZWxlbWVudCkKK3sKKyAgICAgICAgaW50IHJldCA9IDA7CisgICAgICAgIHUxNiBzaXplID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX2luZm9ybWF0aW9uX2VsZW1lbnQpIC0gMjsKKworICAgICAgICBpZiAoZWxlbWVudF9pbmZvID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoaW5mb19lbGVtZW50ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGlmICgoaW5mb19lbGVtZW50LT5pZCA9PSBRT1NfRUxFTUVOVF9JRCkgJiYgKGluZm9fZWxlbWVudC0+bGVuID09IHNpemUpKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGVsZW1lbnRfaW5mby0+cXVpLCBpbmZvX2VsZW1lbnQtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKKyAgICAgICAgICAgICAgICBlbGVtZW50X2luZm8tPmVsZW1lbnRJRCA9IGluZm9fZWxlbWVudC0+aWQ7CisgICAgICAgICAgICAgICAgZWxlbWVudF9pbmZvLT5sZW5ndGggPSBpbmZvX2VsZW1lbnQtPmxlbjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisKKyAgICAgICAgaWYgKHJldCA9PSAwKQorICAgICAgICAgICAgICAgIHJldCA9IGllZWU4MDIxMV92ZXJpZnlfcW9zX2luZm8oZWxlbWVudF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU9TX09VSV9JTkZPX1NVQl9UWVBFKTsKKyAgICAgICAgcmV0dXJuIHJldDsKK30KKworCisvKgorICogV3JpdGUgUW9TIHBhcmFtZXRlcnMgZnJvbSB0aGUgYWMgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIGludCBpZWVlODAyMTFfcW9zX2NvbnZlcnRfYWNfdG9fcGFyYW1ldGVycyhzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJfaW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGFyYW1fZWxtLCBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpxb3NfcGFyYW0pCit7CisgICAgICAgIGludCByYyA9IDA7CisgICAgICAgIGludCBpOworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3Fvc19hY19wYXJhbWV0ZXIgKmFjX3BhcmFtczsKKwl1OCBhY2k7CisgICAgICAgIC8vdTggY3dfbWluOworICAgICAgICAvL3U4IGN3X21heDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUU9TX1FVRVVFX05VTTsgaSsrKSB7CisgICAgICAgICAgICAgICAgYWNfcGFyYW1zID0gJihwYXJhbV9lbG0tPmFjX3BhcmFtc19yZWNvcmRbaV0pOworCisJCWFjaSA9IChhY19wYXJhbXMtPmFjaV9haWZzbiAmIDB4NjApID4+IDU7CisKKwkJaWYoYWNpID49IFFPU19RVUVVRV9OVU0pCisJCQljb250aW51ZTsKKyAgICAgICAgICAgICAgICBxb3NfcGFyYW0tPmFpZnNbYWNpXSA9IChhY19wYXJhbXMtPmFjaV9haWZzbikgJiAweDBmOworCisJCS8qIFdNTSBzcGVjIFAuMTE6IFRoZSBtaW5pbXVtIHZhbHVlIGZvciBBSUZTTiBzaGFsbCBiZSAyICovCisgICAgICAgICAgICAgICAgcW9zX3BhcmFtLT5haWZzW2FjaV0gPSAocW9zX3BhcmFtLT5haWZzW2FjaV0gPCAyKSA/IDI6cW9zX3BhcmFtLT5haWZzW2FjaV07CisKKyAgICAgICAgICAgICAgICBxb3NfcGFyYW0tPmN3X21pblthY2ldID0gYWNfcGFyYW1zLT5lY3dfbWluX21heCAmIDB4MEY7CisKKyAgICAgICAgICAgICAgICBxb3NfcGFyYW0tPmN3X21heFthY2ldID0gKGFjX3BhcmFtcy0+ZWN3X21pbl9tYXggJiAweEYwKSA+PiA0OworCisgICAgICAgICAgICAgICAgcW9zX3BhcmFtLT5mbGFnW2FjaV0gPQorICAgICAgICAgICAgICAgICAgICAoYWNfcGFyYW1zLT5hY2lfYWlmc24gJiAweDEwKSA/IDB4MDEgOiAweDAwOworICAgICAgICAgICAgICAgIHFvc19wYXJhbS0+dHhfb3BfbGltaXRbYWNpXSA9IGxlMTZfdG9fY3B1KGFjX3BhcmFtcy0+dHhfb3BfbGltaXQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByYzsKK30KKworLyoKKyAqIHdlIGhhdmUgYSBnZW5lcmljIGRhdGEgZWxlbWVudCB3aGljaCBpdCBtYXkgY29udGFpbiBRb1MgaW5mb3JtYXRpb24gb3IKKyAqIHBhcmFtZXRlcnMgZWxlbWVudC4gY2hlY2sgdGhlIGluZm9ybWF0aW9uIGVsZW1lbnQgbGVuZ3RoIHRvIGRlY2lkZQorICogd2hpY2ggdHlwZSB0byByZWFkCisgKi8KK3N0YXRpYyBpbnQgaWVlZTgwMjExX3BhcnNlX3Fvc19pbmZvX3BhcmFtX0lFKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5mb19lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrKQoreworICAgICAgICBpbnQgcmMgPSAwOworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJzICpxb3NfcGFyYW0gPSBOVUxMOworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3Fvc19pbmZvcm1hdGlvbl9lbGVtZW50IHFvc19pbmZvX2VsZW1lbnQ7CisKKyAgICAgICAgcmMgPSBpZWVlODAyMTFfcmVhZF9xb3NfaW5mb19lbGVtZW50KCZxb3NfaW5mb19lbGVtZW50LCBpbmZvX2VsZW1lbnQpOworCisgICAgICAgIGlmIChyYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgbmV0d29yay0+cW9zX2RhdGEucGFyYW1fY291bnQgPSBxb3NfaW5mb19lbGVtZW50LmFjX2luZm8gJiAweDBGOworICAgICAgICAgICAgICAgIG5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfSEFTX1FPU19JTkZPUk1BVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJfaW5mbyBwYXJhbV9lbGVtZW50OworCisgICAgICAgICAgICAgICAgcmMgPSBpZWVlODAyMTFfcmVhZF9xb3NfcGFyYW1fZWxlbWVudCgmcGFyYW1fZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fZWxlbWVudCk7CisgICAgICAgICAgICAgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHFvc19wYXJhbSA9ICYobmV0d29yay0+cW9zX2RhdGEucGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZWVlODAyMTFfcW9zX2NvbnZlcnRfYWNfdG9fcGFyYW1ldGVycygmcGFyYW1fZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFvc19wYXJhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0hBU19RT1NfUEFSQU1FVEVSUzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmstPnFvc19kYXRhLnBhcmFtX2NvdW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9lbGVtZW50LmluZm9fZWxlbWVudC5hY19pbmZvICYgMHgwRjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmMgPT0gMCkgeworICAgICAgICAgICAgICAgIElFRUU4MDIxMV9ERUJVR19RT1MoIlFvUyBpcyBzdXBwb3J0ZWRcbiIpOworICAgICAgICAgICAgICAgIG5ldHdvcmstPnFvc19kYXRhLnN1cHBvcnRlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJjOworfQorCisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworI2RlZmluZSBNRklFX1NUUklORyh4KSBjYXNlIE1GSUVfVFlQRV8gIyN4OiByZXR1cm4gI3gKKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9pbmZvX2VsZW1lbnRfc3RyaW5nKHUxNiBpZCkKK3sKKyAgICAgICAgc3dpdGNoIChpZCkgeworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKFNTSUQpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKFJBVEVTKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhGSF9TRVQpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKERTX1NFVCk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoQ0ZfU0VUKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhUSU0pOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKElCU1NfU0VUKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhDT1VOVFJZKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhIT1BfUEFSQU1TKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhIT1BfVEFCTEUpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKFJFUVVFU1QpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKENIQUxMRU5HRSk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoUE9XRVJfQ09OU1RSQUlOVCk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoUE9XRVJfQ0FQQUJJTElUWSk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoVFBDX1JFUVVFU1QpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKFRQQ19SRVBPUlQpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKFNVUFBfQ0hBTk5FTFMpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKENTQSk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoTUVBU1VSRV9SRVFVRVNUKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhNRUFTVVJFX1JFUE9SVCk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoUVVJRVQpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKElCU1NfREZTKTsKKyAgICAgICAgICAgICAgIC8vIE1GSUVfU1RSSU5HKEVSUF9JTkZPKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhSU04pOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKFJBVEVTX0VYKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhHRU5FUklDKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhRT1NfUEFSQU1FVEVSKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVOS05PV04iOworICAgICAgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfZXh0cmFjdF9jb3VudHJ5X2llKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQsCisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrLAorCXU4ICogYWRkcjIKKykKK3sKKwlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQorCXsKKwkJaWYoaW5mb19lbGVtZW50LT5sZW4hPSAwKQorCQl7CisJCQltZW1jcHkobmV0d29yay0+Q291bnRyeUllQnVmLCBpbmZvX2VsZW1lbnQtPmRhdGEsIGluZm9fZWxlbWVudC0+bGVuKTsKKwkJCW5ldHdvcmstPkNvdW50cnlJZUxlbiA9IGluZm9fZWxlbWVudC0+bGVuOworCisJCQlpZighSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKKwkJCXsKKwkJCQlEb3QxMWRfVXBkYXRlQ291bnRyeUllKGllZWUsIGFkZHIyLCBpbmZvX2VsZW1lbnQtPmxlbiwgaW5mb19lbGVtZW50LT5kYXRhKTsKKwkJCX0KKwkJfQorCisJCS8vCisJCS8vIDA3MDMwNSwgcmNuamtvOiBJIHVwZGF0ZSBjb3VudHJ5IElFIHdhdGNoIGRvZyBoZXJlIGJlY2F1c2UKKwkJLy8gc29tZSBBUCAoZS5nLiBDaXNjbyAxMjQyKSBkb24ndCBpbmNsdWRlIGNvdW50cnkgSUUgaW4gdGhlaXIKKwkJLy8gcHJvYmUgcmVzcG9uc2UgZnJhbWUuCisJCS8vCisJCWlmKElTX0VRVUFMX0NJRV9TUkMoaWVlZSwgYWRkcjIpICkKKwkJeworCQkJVVBEQVRFX0NJRV9XQVRDSERPRyhpZWVlKTsKKwkJfQorCX0KKworfQorI2VuZGlmCisKK2ludCBpZWVlODAyMTFfcGFyc2VfaW5mb19wYXJhbShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmluZm9fZWxlbWVudCwKKwkJdTE2IGxlbmd0aCwKKwkJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrLAorCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKK3sKKwl1OCBpOworCXNob3J0IG9mZnNldDsKKyAgICAgICAgdTE2CXRtcF9odGNhcF9sZW49MDsKKwl1MTYJdG1wX2h0aW5mb19sZW49MDsKKwl1MTYgaHRfcmVhbHRla19hZ2dfbGVuPTA7CisJdTggIGh0X3JlYWx0ZWtfYWdnX2J1ZltNQVhfSUVfTEVOXTsKKy8vCXUxNiBicm9hZGNvbV9sZW4gPSAwOworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwljaGFyIHJhdGVzX3N0cls2NF07CisJY2hhciAqcDsKKyNlbmRpZgorCisJd2hpbGUgKGxlbmd0aCA+PSBzaXplb2YoKmluZm9fZWxlbWVudCkpIHsKKwkJaWYgKHNpemVvZigqaW5mb19lbGVtZW50KSArIGluZm9fZWxlbWVudC0+bGVuID4gbGVuZ3RoKSB7CisJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiSW5mbyBlbGVtOiBwYXJzZSBmYWlsZWQ6ICIKKwkJCQkJICAgICAiaW5mb19lbGVtZW50LT5sZW4gKyAyID4gbGVmdCA6ICIKKwkJCQkJICAgICAiaW5mb19lbGVtZW50LT5sZW4rMj0lemQgbGVmdD0lZCwgaWQ9JWQuXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuICsKKwkJCQkJICAgICBzaXplb2YoKmluZm9fZWxlbWVudCksCisJCQkJCSAgICAgbGVuZ3RoLCBpbmZvX2VsZW1lbnQtPmlkKTsKKwkJCS8qIFdlIHN0b3AgcHJvY2Vzc2luZyBidXQgZG9uJ3QgcmV0dXJuIGFuIGVycm9yIGhlcmUKKwkJCSAqIGJlY2F1c2Ugc29tZSBtaXNiZWhhdmlvdXIgQVBzIGJyZWFrIHRoaXMgcnVsZS4gaWUuCisJCQkgKiBPcmlub2NvIEFQMTAwMC4gKi8KKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoIChpbmZvX2VsZW1lbnQtPmlkKSB7CisJCWNhc2UgTUZJRV9UWVBFX1NTSUQ6CisJCQlpZiAoaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGluZm9fZWxlbWVudC0+ZGF0YSwKKwkJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pKSB7CisJCQkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19FTVBUWV9FU1NJRDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJbmV0d29yay0+c3NpZF9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sCisJCQkJCQkodTgpIElXX0VTU0lEX01BWF9TSVpFKTsKKwkJCW1lbWNweShuZXR3b3JrLT5zc2lkLCBpbmZvX2VsZW1lbnQtPmRhdGEsIG5ldHdvcmstPnNzaWRfbGVuKTsKKwkJCWlmIChuZXR3b3JrLT5zc2lkX2xlbiA8IElXX0VTU0lEX01BWF9TSVpFKQorCQkJCW1lbXNldChuZXR3b3JrLT5zc2lkICsgbmV0d29yay0+c3NpZF9sZW4sIDAsCisJCQkJICAgICAgIElXX0VTU0lEX01BWF9TSVpFIC0gbmV0d29yay0+c3NpZF9sZW4pOworCisJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiTUZJRV9UWVBFX1NTSUQ6ICclcycgbGVuPSVkLlxuIiwKKwkJCQkJICAgICBuZXR3b3JrLT5zc2lkLCBuZXR3b3JrLT5zc2lkX2xlbik7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9SQVRFUzoKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCQlwID0gcmF0ZXNfc3RyOworI2VuZGlmCisJCQluZXR3b3JrLT5yYXRlc19sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sCisJCQkJCQkgTUFYX1JBVEVTX0xFTkdUSCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbmV0d29yay0+cmF0ZXNfbGVuOyBpKyspIHsKKwkJCQluZXR3b3JrLT5yYXRlc1tpXSA9IGluZm9fZWxlbWVudC0+ZGF0YVtpXTsKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCQkJcCArPSBzbnByaW50ZihwLCBzaXplb2YocmF0ZXNfc3RyKSAtCisJCQkJCSAgICAgIChwIC0gcmF0ZXNfc3RyKSwgIiUwMlggIiwKKwkJCQkJICAgICAgbmV0d29yay0+cmF0ZXNbaV0pOworI2VuZGlmCisJCQkJaWYgKGllZWU4MDIxMV9pc19vZmRtX3JhdGUKKwkJCQkgICAgKGluZm9fZWxlbWVudC0+ZGF0YVtpXSkpIHsKKwkJCQkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19IQVNfT0ZETTsKKwkJCQkJaWYgKGluZm9fZWxlbWVudC0+ZGF0YVtpXSAmCisJCQkJCSAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLKQorCQkJCQkJbmV0d29yay0+ZmxhZ3MgJj0KKwkJCQkJCSAgICB+TkVUV09SS19IQVNfQ0NLOworCQkJCX0KKwkJCX0KKworCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9SQVRFUzogJyVzJyAoJWQpXG4iLAorCQkJCQkgICAgIHJhdGVzX3N0ciwgbmV0d29yay0+cmF0ZXNfbGVuKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX1JBVEVTX0VYOgorI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJCXAgPSByYXRlc19zdHI7CisjZW5kaWYKKwkJCW5ldHdvcmstPnJhdGVzX2V4X2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwKKwkJCQkJCSAgICBNQVhfUkFURVNfRVhfTEVOR1RIKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBuZXR3b3JrLT5yYXRlc19leF9sZW47IGkrKykgeworCQkJCW5ldHdvcmstPnJhdGVzX2V4W2ldID0gaW5mb19lbGVtZW50LT5kYXRhW2ldOworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJCQlwICs9IHNucHJpbnRmKHAsIHNpemVvZihyYXRlc19zdHIpIC0KKwkJCQkJICAgICAgKHAgLSByYXRlc19zdHIpLCAiJTAyWCAiLAorCQkJCQkgICAgICBuZXR3b3JrLT5yYXRlc1tpXSk7CisjZW5kaWYKKwkJCQlpZiAoaWVlZTgwMjExX2lzX29mZG1fcmF0ZQorCQkJCSAgICAoaW5mb19lbGVtZW50LT5kYXRhW2ldKSkgeworCQkJCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0hBU19PRkRNOworCQkJCQlpZiAoaW5mb19lbGVtZW50LT5kYXRhW2ldICYKKwkJCQkJICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spCisJCQkJCQluZXR3b3JrLT5mbGFncyAmPQorCQkJCQkJICAgIH5ORVRXT1JLX0hBU19DQ0s7CisJCQkJfQorCQkJfQorCisJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiTUZJRV9UWVBFX1JBVEVTX0VYOiAnJXMnICglZClcbiIsCisJCQkJCSAgICAgcmF0ZXNfc3RyLCBuZXR3b3JrLT5yYXRlc19leF9sZW4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfRFNfU0VUOgorCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9EU19TRVQ6ICVkXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSk7CisJCQluZXR3b3JrLT5jaGFubmVsID0gaW5mb19lbGVtZW50LT5kYXRhWzBdOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfRkhfU0VUOgorCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9GSF9TRVQ6IGlnbm9yZWRcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfQ0ZfU0VUOgorCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9DRl9TRVQ6IGlnbm9yZWRcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfVElNOgorCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPCA0KQorCQkJCWJyZWFrOworCisJCQluZXR3b3JrLT50aW0udGltX2NvdW50ID0gaW5mb19lbGVtZW50LT5kYXRhWzBdOworCQkJbmV0d29yay0+dGltLnRpbV9wZXJpb2QgPSBpbmZvX2VsZW1lbnQtPmRhdGFbMV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmstPmR0aW1fcGVyaW9kID0gaW5mb19lbGVtZW50LT5kYXRhWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmstPmxhc3RfZHRpbV9zdGFfdGltZVswXSA9IHN0YXRzLT5tYWNfdGltZVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmstPmxhc3RfZHRpbV9zdGFfdGltZVsxXSA9IHN0YXRzLT5tYWNfdGltZVsxXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yay0+ZHRpbV9kYXRhID0gSUVFRTgwMjExX0RUSU1fVkFMSUQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGluZm9fZWxlbWVudC0+ZGF0YVswXSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5mb19lbGVtZW50LT5kYXRhWzJdICYgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yay0+ZHRpbV9kYXRhIHw9IElFRUU4MDIxMV9EVElNX01CQ0FTVDsKKworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGluZm9fZWxlbWVudC0+ZGF0YVsyXSA+PiAxKSoyOworCisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygib2Zmc2V0MToleCBhaWQ6JXhcbiIsb2Zmc2V0LCBpZWVlLT5hc3NvY19pZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGllZWUtPmFzc29jX2lkIDwgOCpvZmZzZXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZS0+YXNzb2NfaWQgPiA4KihvZmZzZXQgKyBpbmZvX2VsZW1lbnQtPmxlbiAtMykpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IChpZWVlLT5hc3NvY19pZCAvIDgpIC0gb2Zmc2V0Oy8vICsgKChhaWQgJSA4KT8gMCA6IDEpIDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5mb19lbGVtZW50LT5kYXRhWzMrb2Zmc2V0XSAmICgxPDwoaWVlZS0+YXNzb2NfaWQlOCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrLT5kdGltX2RhdGEgfD0gSUVFRTgwMjExX0RUSU1fVUNBU1Q7CisKKwkJCS8vSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9USU06IHBhcnRpYWxseSBpZ25vcmVkXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX0VSUDoKKwkJCW5ldHdvcmstPmVycF92YWx1ZSA9IGluZm9fZWxlbWVudC0+ZGF0YVswXTsKKwkJCW5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfSEFTX0VSUF9WQUxVRTsKKwkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJNRklFX1RZUEVfRVJQX1NFVDogJWRcbiIsCisJCQkJCSAgICAgbmV0d29yay0+ZXJwX3ZhbHVlKTsKKwkJCWJyZWFrOworCQljYXNlIE1GSUVfVFlQRV9JQlNTX1NFVDoKKwkJCW5ldHdvcmstPmF0aW1fd2luZG93ID0gaW5mb19lbGVtZW50LT5kYXRhWzBdOworCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9JQlNTX1NFVDogJWRcbiIsCisJCQkJCSAgICAgbmV0d29yay0+YXRpbV93aW5kb3cpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfQ0hBTExFTkdFOgorCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9DSEFMTEVOR0U6IGlnbm9yZWRcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfR0VORVJJQzoKKwkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJNRklFX1RZUEVfR0VORVJJQzogJWQgYnl0ZXNcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOworCQkJaWYgKCFpZWVlODAyMTFfcGFyc2VfcW9zX2luZm9fcGFyYW1fSUUoaW5mb19lbGVtZW50LAorCQkJCQkJCSAgICAgICBuZXR3b3JrKSkKKwkJCQlicmVhazsKKworCQkJaWYgKGluZm9fZWxlbWVudC0+bGVuID49IDQgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDUwICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4ZjIgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMSkgeworCQkJCW5ldHdvcmstPndwYV9pZV9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4gKyAyLAorCQkJCQkJCSAgTUFYX1dQQV9JRV9MRU4pOworCQkJCW1lbWNweShuZXR3b3JrLT53cGFfaWUsIGluZm9fZWxlbWVudCwKKwkJCQkgICAgICAgbmV0d29yay0+d3BhX2llX2xlbik7CisJCQkJYnJlYWs7CisJCQl9CisKKyNpZmRlZiBUSE9NQVNfVFVSQk8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvX2VsZW1lbnQtPmxlbiA9PSA3ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHhlMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDRjICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDEgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX2VsZW1lbnQtPmRhdGFbNF0gPT0gMHgwMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrLT5UdXJib19FbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZm9yIEhUY2FwIGFuZCBIVGluZm8gcGFyYW1ldGVycworCQkJaWYodG1wX2h0Y2FwX2xlbiA9PSAwKXsKKwkJCQlpZihpbmZvX2VsZW1lbnQtPmxlbiA+PSA0ICYmCisJCQkJICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCQkgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg5MCAmJgorCQkJCSAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDRjICYmCisJCQkJICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDMzKXsKKworCQkJCQkJdG1wX2h0Y2FwX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwodTgpTUFYX0lFX0xFTik7CisJCQkJICAgCQlpZih0bXBfaHRjYXBfbGVuICE9IDApeworCQkJCSAgIAkJCW5ldHdvcmstPmJzc2h0LmJkSFRTcGVjVmVyID0gSFRfU1BFQ19WRVJfRVdDOworCQkJCQkJCW5ldHdvcmstPmJzc2h0LmJkSFRDYXBMZW4gPSB0bXBfaHRjYXBfbGVuID4gc2l6ZW9mKG5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYpP1wKKwkJCQkJCQkJc2l6ZW9mKG5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYpOnRtcF9odGNhcF9sZW47CisJCQkJCQkJbWVtY3B5KG5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYsaW5mb19lbGVtZW50LT5kYXRhLG5ldHdvcmstPmJzc2h0LmJkSFRDYXBMZW4pOworCQkJCSAgIAkJfQorCQkJCX0KKwkJCQlpZih0bXBfaHRjYXBfbGVuICE9IDApCisJCQkJCW5ldHdvcmstPmJzc2h0LmJkU3VwcG9ydEhUID0gdHJ1ZTsKKwkJCQllbHNlCisJCQkJCW5ldHdvcmstPmJzc2h0LmJkU3VwcG9ydEhUID0gZmFsc2U7CisJCQl9CisKKworCQkJaWYodG1wX2h0aW5mb19sZW4gPT0gMCl7CisJCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPj0gNCAmJgorCQkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJCSAgIAlpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg5MCAmJgorCQkJCSAgIAlpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg0YyAmJgorCQkJCSAgIAlpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMzQpeworCisJCQkJCQl0bXBfaHRpbmZvX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwodTgpTUFYX0lFX0xFTik7CisJCQkJCQlpZih0bXBfaHRpbmZvX2xlbiAhPSAwKXsKKwkJCQkJCQluZXR3b3JrLT5ic3NodC5iZEhUU3BlY1ZlciA9IEhUX1NQRUNfVkVSX0VXQzsKKwkJCQkJCQlpZih0bXBfaHRpbmZvX2xlbil7CisJCQkJCQkJCW5ldHdvcmstPmJzc2h0LmJkSFRJbmZvTGVuID0gdG1wX2h0aW5mb19sZW4gPiBzaXplb2YobmV0d29yay0+YnNzaHQuYmRIVEluZm9CdWYpP1wKKwkJCQkJCQkJCXNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1Zik6dG1wX2h0aW5mb19sZW47CisJCQkJCQkJCW1lbWNweShuZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1ZixpbmZvX2VsZW1lbnQtPmRhdGEsbmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4pOworCQkJCQkJCX0KKworCQkJCQkJfQorCisJCQkJfQorCQkJfQorCisJCQlpZihpZWVlLT5hZ2dyZWdhdGlvbil7CisJCQkJaWYobmV0d29yay0+YnNzaHQuYmRTdXBwb3J0SFQpeworCQkJCQlpZihpbmZvX2VsZW1lbnQtPmxlbiA+PSA0ICYmCisJCQkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJCQkJaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4ZTAgJiYKKwkJCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDRjICYmCisJCQkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMil7CisKKwkJCQkJCWh0X3JlYWx0ZWtfYWdnX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwodTgpTUFYX0lFX0xFTik7CisJCQkJCQltZW1jcHkoaHRfcmVhbHRla19hZ2dfYnVmLGluZm9fZWxlbWVudC0+ZGF0YSxpbmZvX2VsZW1lbnQtPmxlbik7CisKKwkJCQkJfQorCQkJCQlpZihodF9yZWFsdGVrX2FnZ19sZW4gPj0gNSl7CisJCQkJCQluZXR3b3JrLT5ic3NodC5iZFJUMlJUQWdncmVnYXRpb24gPSB0cnVlOworCisJCQkJCQlpZigoaHRfcmVhbHRla19hZ2dfYnVmWzRdID09IDEpICYmIChodF9yZWFsdGVrX2FnZ19idWZbNV0gJiAweDAyKSkKKwkJCQkJCW5ldHdvcmstPmJzc2h0LmJkUlQyUlRMb25nU2xvdFRpbWUgPSB0cnVlOworCQkJCQl9CisJCQkJfQorCisJCQl9CisKKwkJCS8vaWYodG1wX2h0Y2FwX2xlbiAhPTAgIHx8ICB0bXBfaHRpbmZvX2xlbiAhPSAwKQorCQkJeworCQkJCWlmKChpbmZvX2VsZW1lbnQtPmxlbiA+PSAzICYmCisJCQkJCSBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJCQkgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4MDUgJiYKKwkJCQkJIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweGI1KSB8fAorCQkJCQkgKGluZm9fZWxlbWVudC0+bGVuID49IDMgJiYKKwkJCQkJIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkJCSBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHgwYSAmJgorCQkJCQkgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4ZjcpIHx8CisJCQkJCSAoaW5mb19lbGVtZW50LT5sZW4gPj0gMyAmJgorCQkJCQkgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCQkJIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDEwICYmCisJCQkJCSBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHgxOCkpeworCisJCQkJCQluZXR3b3JrLT5icm9hZGNvbV9jYXBfZXhpc3QgPSB0cnVlOworCisJCQkJfQorCQkJfQorCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPj0gMyAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkJaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4MGMgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg0MykKKwkJCXsKKwkJCQluZXR3b3JrLT5yYWxpbmtfY2FwX2V4aXN0ID0gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UKKwkJCQluZXR3b3JrLT5yYWxpbmtfY2FwX2V4aXN0ID0gZmFsc2U7CisJCQkvL2FkZGVkIGJ5IGFteSBmb3IgYXRoZXJvcyBBUAorCQkJaWYoKGluZm9fZWxlbWVudC0+bGVuID49IDMgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDAzICYmCisJCQkJaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4N2YpIHx8CisJCQkJKGluZm9fZWxlbWVudC0+bGVuID49IDMgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDEzICYmCisJCQkJaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4NzQpKQorCQkJeworCQkJCXByaW50aygiPT09PT09PT0+JXMoKTogYXRocm9zIEFQIGlzIGV4aXN0XG4iLF9fRlVOQ1RJT05fXyk7CisJCQkJbmV0d29yay0+YXRoZXJvc19jYXBfZXhpc3QgPSB0cnVlOworCQkJfQorCQkJZWxzZQorCQkJCW5ldHdvcmstPmF0aGVyb3NfY2FwX2V4aXN0ID0gZmFsc2U7CisKKwkJCWlmKGluZm9fZWxlbWVudC0+bGVuID49IDMgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDQwICYmCisJCQkJaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4OTYpCisJCQl7CisJCQkJbmV0d29yay0+Y2lzY29fY2FwX2V4aXN0ID0gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UKKwkJCQluZXR3b3JrLT5jaXNjb19jYXBfZXhpc3QgPSBmYWxzZTsKKwkJCS8vYWRkZWQgYnkgYW15IGZvciBMRUFQIG9mIGNpc2NvCisJCQlpZihpbmZvX2VsZW1lbnQtPmxlbiA+IDQgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDQwICYmCisJCQkJaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4OTYgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMSkKKwkJCXsKKwkJCQlpZihpbmZvX2VsZW1lbnQtPmxlbiA9PSA2KQorCQkJCXsKKwkJCQkJbWVtY3B5KG5ldHdvcmstPkNjeFJtU3RhdGUsICZpbmZvX2VsZW1lbnRbNF0sIDIpOworCQkJCQlpZihuZXR3b3JrLT5DY3hSbVN0YXRlWzBdICE9IDApCisJCQkJCXsKKwkJCQkJCW5ldHdvcmstPmJDY3hSbUVuYWJsZSA9IHRydWU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJbmV0d29yay0+YkNjeFJtRW5hYmxlID0gZmFsc2U7CisJCQkJCS8vCisJCQkJCS8vIENDWHY0IFRhYmxlIDU5LTEgTUJTU0lEIE1hc2tzLgorCQkJCQkvLworCQkJCQluZXR3b3JrLT5NQnNzaWRNYXNrID0gbmV0d29yay0+Q2N4Um1TdGF0ZVsxXSAmIDB4MDc7CisJCQkJCWlmKG5ldHdvcmstPk1Cc3NpZE1hc2sgIT0gMCkKKwkJCQkJeworCQkJCQkJbmV0d29yay0+Yk1Cc3NpZFZhbGlkID0gdHJ1ZTsKKwkJCQkJCW5ldHdvcmstPk1Cc3NpZE1hc2sgPSAweGZmIDw8IChuZXR3b3JrLT5NQnNzaWRNYXNrKTsKKwkJCQkJCWNwTWFjQWRkcihuZXR3b3JrLT5NQnNzaWQsIG5ldHdvcmstPmJzc2lkKTsKKwkJCQkJCW5ldHdvcmstPk1Cc3NpZFs1XSAmPSBuZXR3b3JrLT5NQnNzaWRNYXNrOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJbmV0d29yay0+Yk1Cc3NpZFZhbGlkID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbmV0d29yay0+YkNjeFJtRW5hYmxlID0gZmFsc2U7CisJCQkJfQorCQkJfQorCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPiA0ICAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkJaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4NDAgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg5NiAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAzKQorCQkJeworCQkJCWlmKGluZm9fZWxlbWVudC0+bGVuID09IDUpCisJCQkJeworCQkJCQluZXR3b3JrLT5iV2l0aENjeFZlck51bSA9IHRydWU7CisJCQkJCW5ldHdvcmstPkJzc0NjeFZlck51bWJlciA9IGluZm9fZWxlbWVudC0+ZGF0YVs0XTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbmV0d29yay0+YldpdGhDY3hWZXJOdW0gPSBmYWxzZTsKKwkJCQkJbmV0d29yay0+QnNzQ2N4VmVyTnVtYmVyID0gMDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9SU046CisJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiTUZJRV9UWVBFX1JTTjogJWQgYnl0ZXNcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOworCQkJbmV0d29yay0+cnNuX2llX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiArIDIsCisJCQkJCQkgIE1BWF9XUEFfSUVfTEVOKTsKKwkJCW1lbWNweShuZXR3b3JrLT5yc25faWUsIGluZm9fZWxlbWVudCwKKwkJCSAgICAgICBuZXR3b3JrLT5yc25faWVfbGVuKTsKKwkJCWJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvL0hUIHJlbGF0ZWQgZWxlbWVudC4KKwkJY2FzZSBNRklFX1RZUEVfSFRfQ0FQOgorCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9IVF9DQVA6ICVkIGJ5dGVzXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKKwkJCXRtcF9odGNhcF9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sKHU4KU1BWF9JRV9MRU4pOworCQkJaWYodG1wX2h0Y2FwX2xlbiAhPSAwKXsKKwkJCQluZXR3b3JrLT5ic3NodC5iZEhUU3BlY1ZlciA9IEhUX1NQRUNfVkVSX0VXQzsKKwkJCQluZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuID0gdG1wX2h0Y2FwX2xlbiA+IHNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmKT9cCisJCQkJCXNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmKTp0bXBfaHRjYXBfbGVuOworCQkJCW1lbWNweShuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmLGluZm9fZWxlbWVudC0+ZGF0YSxuZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuKTsKKworCQkJCS8vSWYgcGVlciBpcyBIVCwgYnV0IG5vdCBXTU0sIGNhbGwgUW9zU2V0TGVnYWN5V01NUGFyYW1XaXRoSFQoKQorCQkJCS8vIHdpbmRvd3MgZHJpdmVyIHdpbGwgdXBkYXRlIFdNTSBwYXJhbWV0ZXJzIGVhY2ggYmVhY29uIHJlY2VpdmVkIG9uY2UgY29ubmVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExpbnV4IGRyaXZlciBpcyBhIGJpdCBkaWZmZXJlbnQuCisJCQkJbmV0d29yay0+YnNzaHQuYmRTdXBwb3J0SFQgPSB0cnVlOworCQkJfQorCQkJZWxzZQorCQkJCW5ldHdvcmstPmJzc2h0LmJkU3VwcG9ydEhUID0gZmFsc2U7CisJCQlicmVhazsKKworCisJCWNhc2UgTUZJRV9UWVBFX0hUX0lORk86CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0hUX0lORk86ICVkIGJ5dGVzXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKKwkJCXRtcF9odGluZm9fbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuLCh1OClNQVhfSUVfTEVOKTsKKwkJCWlmKHRtcF9odGluZm9fbGVuKXsKKwkJCQluZXR3b3JrLT5ic3NodC5iZEhUU3BlY1ZlciA9IEhUX1NQRUNfVkVSX0lFRUU7CisJCQkJbmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4gPSB0bXBfaHRpbmZvX2xlbiA+IHNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1Zik/XAorCQkJCQlzaXplb2YobmV0d29yay0+YnNzaHQuYmRIVEluZm9CdWYpOnRtcF9odGluZm9fbGVuOworCQkJCW1lbWNweShuZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1ZixpbmZvX2VsZW1lbnQtPmRhdGEsbmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4pOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfQUlST05FVDoKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfQUlST05FVDogJWQgYnl0ZXNcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOworCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPklFX0NJU0NPX0ZMQUdfUE9TSVRJT04pCisJCQl7CisJCQkJbmV0d29yay0+YldpdGhBaXJvbmV0SUUgPSB0cnVlOworCisJCQkJLy8gQ0NYIDEgc3BlYyB2MS4xMywgQTAxLjEgQ0tJUCBOZWdvdGlhdGlvbiAocGFnZTIzKToKKwkJCQkvLyAiQSBDaXNjbyBhY2Nlc3MgcG9pbnQgYWR2ZXJ0aXNlcyBzdXBwb3J0IGZvciBDS0lQIGluIGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UgcGFja2V0cywKKwkJCQkvLyAgYnkgYWRkaW5nIGFuIEFpcm9uZXQgZWxlbWVudCBhbmQgc2V0dGluZyBvbmUgb3IgYm90aCBvZiB0aGUgQ0tJUCBuZWdvdGlhdGlvbiBiaXRzLiIKKwkJCQlpZigJKGluZm9fZWxlbWVudC0+ZGF0YVtJRV9DSVNDT19GTEFHX1BPU0lUSU9OXSZTVVBQT1JUX0NLSVBfTUlDKQl8fAorCQkJCQkoaW5mb19lbGVtZW50LT5kYXRhW0lFX0NJU0NPX0ZMQUdfUE9TSVRJT05dJlNVUFBPUlRfQ0tJUF9QSykJKQorCQkJCXsKKwkJIAkJCW5ldHdvcmstPmJDa2lwU3VwcG9ydGVkID0gdHJ1ZTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbmV0d29yay0+YkNraXBTdXBwb3J0ZWQgPSBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbmV0d29yay0+YldpdGhBaXJvbmV0SUUgPSBmYWxzZTsKKwkJIAkJbmV0d29yay0+YkNraXBTdXBwb3J0ZWQgPSBmYWxzZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE1GSUVfVFlQRV9RT1NfUEFSQU1FVEVSOgorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIlFvUyBFcnJvciBuZWVkIHRvIHBhcnNlIFFPU19QQVJBTUVURVIgSUVcbiIpOworCQkJYnJlYWs7CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJCWNhc2UgTUZJRV9UWVBFX0NPVU5UUlk6CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0NPVU5UUlk6ICVkIGJ5dGVzXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKKwkJCS8vcHJpbnRrKCI9PT09PT5SZWNlaXZlIDwlcz4gQ291bnRyeSBJRVxuIixuZXR3b3JrLT5zc2lkKTsKKwkJCWllZWU4MDIxMV9leHRyYWN0X2NvdW50cnlfaWUoaWVlZSwgaW5mb19lbGVtZW50LCBuZXR3b3JrLCBuZXR3b3JrLT5ic3NpZCk7Ly9hZGRyMiBpcyBzYW1lIGFzIGFkZHIzIHdoZW4gZnJvbSBhbiBBUAorCQkJYnJlYWs7CisjZW5kaWYKKy8qIFRPRE8gKi8KKwkJZGVmYXVsdDoKKwkJCUlFRUU4MDIxMV9ERUJVR19NR01UCisJCQkgICAgKCJVbnN1cHBvcnRlZCBpbmZvIGVsZW1lbnQ6ICVzICglZClcbiIsCisJCQkgICAgIGdldF9pbmZvX2VsZW1lbnRfc3RyaW5nKGluZm9fZWxlbWVudC0+aWQpLAorCQkJICAgICBpbmZvX2VsZW1lbnQtPmlkKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbGVuZ3RoIC09IHNpemVvZigqaW5mb19lbGVtZW50KSArIGluZm9fZWxlbWVudC0+bGVuOworCQlpbmZvX2VsZW1lbnQgPQorCQkgICAgKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICopJmluZm9fZWxlbWVudC0+CisJCSAgICBkYXRhW2luZm9fZWxlbWVudC0+bGVuXTsKKwl9CisKKwlpZighbmV0d29yay0+YXRoZXJvc19jYXBfZXhpc3QgJiYgIW5ldHdvcmstPmJyb2FkY29tX2NhcF9leGlzdCAmJgorCQkhbmV0d29yay0+Y2lzY29fY2FwX2V4aXN0ICYmICFuZXR3b3JrLT5yYWxpbmtfY2FwX2V4aXN0ICYmICFuZXR3b3JrLT5ic3NodC5iZFJUMlJUQWdncmVnYXRpb24pCisJeworCQluZXR3b3JrLT51bmtub3duX2NhcF9leGlzdCA9IHRydWU7CisJfQorCWVsc2UKKwl7CisJCW5ldHdvcmstPnVua25vd25fY2FwX2V4aXN0ID0gZmFsc2U7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHU4IGllZWU4MDIxMV9TaWduYWxTdHJlbmd0aFRyYW5zbGF0ZSgKKwl1OCAgQ3VyclNTCisJKQoreworCXU4IFJldFNTOworCisJLy8gU3RlcCAxLiBTY2FsZSBtYXBwaW5nLgorCWlmKEN1cnJTUyA+PSA3MSAmJiBDdXJyU1MgPD0gMTAwKQorCXsKKwkJUmV0U1MgPSA5MCArICgoQ3VyclNTIC0gNzApIC8gMyk7CisJfQorCWVsc2UgaWYoQ3VyclNTID49IDQxICYmIEN1cnJTUyA8PSA3MCkKKwl7CisJCVJldFNTID0gNzggKyAoKEN1cnJTUyAtIDQwKSAvIDMpOworCX0KKwllbHNlIGlmKEN1cnJTUyA+PSAzMSAmJiBDdXJyU1MgPD0gNDApCisJeworCQlSZXRTUyA9IDY2ICsgKEN1cnJTUyAtIDMwKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPj0gMjEgJiYgQ3VyclNTIDw9IDMwKQorCXsKKwkJUmV0U1MgPSA1NCArIChDdXJyU1MgLSAyMCk7CisJfQorCWVsc2UgaWYoQ3VyclNTID49IDUgJiYgQ3VyclNTIDw9IDIwKQorCXsKKwkJUmV0U1MgPSA0MiArICgoKEN1cnJTUyAtIDUpICogMikgLyAzKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPT0gNCkKKwl7CisJCVJldFNTID0gMzY7CisJfQorCWVsc2UgaWYoQ3VyclNTID09IDMpCisJeworCQlSZXRTUyA9IDI3OworCX0KKwllbHNlIGlmKEN1cnJTUyA9PSAyKQorCXsKKwkJUmV0U1MgPSAxODsKKwl9CisJZWxzZSBpZihDdXJyU1MgPT0gMSkKKwl7CisJCVJldFNTID0gOTsKKwl9CisJZWxzZQorCXsKKwkJUmV0U1MgPSBDdXJyU1M7CisJfQorCS8vUlRfVFJBQ0UoQ09NUF9EQkcsIERCR19MT1VELCAoIiMjIyMjIEFmdGVyIE1hcHBpbmc6ICBMYXN0U1M6ICVkLCBDdXJyU1M6ICVkLCBSZXRTUzogJWRcbiIsIExhc3RTUywgQ3VyclNTLCBSZXRTUykpOworCisJLy8gU3RlcCAyLiBTbW9vdGhpbmcuCisKKwkvL1JUX1RSQUNFKENPTVBfREJHLCBEQkdfTE9VRCwgKCIkJCQkJCBBZnRlciBTbW9vdGhpbmc6ICBMYXN0U1M6ICVkLCBDdXJyU1M6ICVkLCBSZXRTUzogJWRcbiIsIExhc3RTUywgQ3VyclNTLCBSZXRTUykpOworCisJcmV0dXJuIFJldFNTOworfQorCitsb25nIGllZWU4MDIxMV90cmFuc2xhdGVfdG9kYm0odTggc2lnbmFsX3N0cmVuZ3RoX2luZGV4CSkvLyAwLTEwMCBpbmRleC4KK3sKKwlsb25nCXNpZ25hbF9wb3dlcjsgLy8gaW4gZEJtLgorCisJLy8gVHJhbnNsYXRlIHRvIGRCbSAoeD0wLjV5LTk1KS4KKwlzaWduYWxfcG93ZXIgPSAobG9uZykoKHNpZ25hbF9zdHJlbmd0aF9pbmRleCArIDEpID4+IDEpOworCXNpZ25hbF9wb3dlciAtPSA5NTsKKworCXJldHVybiBzaWduYWxfcG93ZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9uZXR3b3JrX2luaXQoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqYmVhY29uLAorCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaywKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKK3sKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJLy9jaGFyIHJhdGVzX3N0cls2NF07CisJLy9jaGFyICpwOworI2VuZGlmCisKKyAgICAgICAgbmV0d29yay0+cW9zX2RhdGEuYWN0aXZlID0gMDsKKyAgICAgICAgbmV0d29yay0+cW9zX2RhdGEuc3VwcG9ydGVkID0gMDsKKyAgICAgICAgbmV0d29yay0+cW9zX2RhdGEucGFyYW1fY291bnQgPSAwOworICAgICAgICBuZXR3b3JrLT5xb3NfZGF0YS5vbGRfcGFyYW1fY291bnQgPSAwOworCisJLyogUHVsbCBvdXQgZml4ZWQgZmllbGQgZGF0YSAqLworCW1lbWNweShuZXR3b3JrLT5ic3NpZCwgYmVhY29uLT5oZWFkZXIuYWRkcjMsIEVUSF9BTEVOKTsKKwluZXR3b3JrLT5jYXBhYmlsaXR5ID0gbGUxNl90b19jcHUoYmVhY29uLT5jYXBhYmlsaXR5KTsKKwluZXR3b3JrLT5sYXN0X3NjYW5uZWQgPSBqaWZmaWVzOworCW5ldHdvcmstPnRpbWVfc3RhbXBbMF0gPSBsZTMyX3RvX2NwdShiZWFjb24tPnRpbWVfc3RhbXBbMF0pOworCW5ldHdvcmstPnRpbWVfc3RhbXBbMV0gPSBsZTMyX3RvX2NwdShiZWFjb24tPnRpbWVfc3RhbXBbMV0pOworCW5ldHdvcmstPmJlYWNvbl9pbnRlcnZhbCA9IGxlMzJfdG9fY3B1KGJlYWNvbi0+YmVhY29uX2ludGVydmFsKTsKKwkvKiBXaGVyZSB0byBwdWxsIHRoaXM/IGJlYWNvbi0+bGlzdGVuX2ludGVydmFsOyovCisJbmV0d29yay0+bGlzdGVuX2ludGVydmFsID0gMHgwQTsKKwluZXR3b3JrLT5yYXRlc19sZW4gPSBuZXR3b3JrLT5yYXRlc19leF9sZW4gPSAwOworCW5ldHdvcmstPmxhc3RfYXNzb2NpYXRlID0gMDsKKwluZXR3b3JrLT5zc2lkX2xlbiA9IDA7CisJbmV0d29yay0+ZmxhZ3MgPSAwOworCW5ldHdvcmstPmF0aW1fd2luZG93ID0gMDsKKwluZXR3b3JrLT5lcnBfdmFsdWUgPSAobmV0d29yay0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSA/CisgICAgICAgICAgICAweDMgOiAweDA7CisJbmV0d29yay0+YmVycF9pbmZvX3ZhbGlkID0gZmFsc2U7CisgICAgICAgIG5ldHdvcmstPmJyb2FkY29tX2NhcF9leGlzdCA9IGZhbHNlOworCW5ldHdvcmstPnJhbGlua19jYXBfZXhpc3QgPSBmYWxzZTsKKwluZXR3b3JrLT5hdGhlcm9zX2NhcF9leGlzdCA9IGZhbHNlOworCW5ldHdvcmstPmNpc2NvX2NhcF9leGlzdCA9IGZhbHNlOworCW5ldHdvcmstPnVua25vd25fY2FwX2V4aXN0ID0gZmFsc2U7CisjaWZkZWYgVEhPTUFTX1RVUkJPCisJbmV0d29yay0+VHVyYm9fRW5hYmxlID0gMDsKKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwluZXR3b3JrLT5Db3VudHJ5SWVMZW4gPSAwOworCW1lbXNldChuZXR3b3JrLT5Db3VudHJ5SWVCdWYsIDAsIE1BWF9JRV9MRU4pOworI2VuZGlmCisvL0luaXRpYWxpemUgSFQgcGFyYW1ldGVycworCS8vaWVlZTgwMjExX2h0X2luaXRpYWxpemUoJm5ldHdvcmstPmJzc2h0KTsKKwlIVEluaXRpYWxpemVCc3NEZXNjKCZuZXR3b3JrLT5ic3NodCk7CisJaWYgKHN0YXRzLT5mcmVxID09IElFRUU4MDIxMV81MkdIWl9CQU5EKSB7CisJCS8qIGZvciBBIGJhbmQgKE5vIERTIGluZm8pICovCisJCW5ldHdvcmstPmNoYW5uZWwgPSBzdGF0cy0+cmVjZWl2ZWRfY2hhbm5lbDsKKwl9IGVsc2UKKwkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19IQVNfQ0NLOworCisgCW5ldHdvcmstPndwYV9pZV9sZW4gPSAwOworIAluZXR3b3JrLT5yc25faWVfbGVuID0gMDsKKworICAgICAgICBpZiAoaWVlZTgwMjExX3BhcnNlX2luZm9fcGFyYW0KKyAgICAgICAgICAgIChpZWVlLGJlYWNvbi0+aW5mb19lbGVtZW50LCBzdGF0cy0+bGVuIC0gc2l6ZW9mKCpiZWFjb24pLCBuZXR3b3JrLCBzdGF0cykpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisKKwluZXR3b3JrLT5tb2RlID0gMDsKKwlpZiAoc3RhdHMtPmZyZXEgPT0gSUVFRTgwMjExXzUyR0haX0JBTkQpCisJCW5ldHdvcmstPm1vZGUgPSBJRUVFX0E7CisJZWxzZSB7CisJCWlmIChuZXR3b3JrLT5mbGFncyAmIE5FVFdPUktfSEFTX09GRE0pCisJCQluZXR3b3JrLT5tb2RlIHw9IElFRUVfRzsKKwkJaWYgKG5ldHdvcmstPmZsYWdzICYgTkVUV09SS19IQVNfQ0NLKQorCQkJbmV0d29yay0+bW9kZSB8PSBJRUVFX0I7CisJfQorCisJaWYgKG5ldHdvcmstPm1vZGUgPT0gMCkgeworCQlJRUVFODAyMTFfREVCVUdfU0NBTigiRmlsdGVyZWQgb3V0ICclcyAoIiBNQUNfRk1UICIpJyAiCisJCQkJICAgICAibmV0d29yay5cbiIsCisJCQkJICAgICBlc2NhcGVfZXNzaWQobmV0d29yay0+c3NpZCwKKwkJCQkJCSAgbmV0d29yay0+c3NpZF9sZW4pLAorCQkJCSAgICAgTUFDX0FSRyhuZXR3b3JrLT5ic3NpZCkpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZihuZXR3b3JrLT5ic3NodC5iZFN1cHBvcnRIVCl7CisJCWlmKG5ldHdvcmstPm1vZGUgPT0gSUVFRV9BKQorCQkJbmV0d29yay0+bW9kZSA9IElFRUVfTl81RzsKKwkJZWxzZSBpZihuZXR3b3JrLT5tb2RlICYgKElFRUVfRyB8IElFRUVfQikpCisJCQluZXR3b3JrLT5tb2RlID0gSUVFRV9OXzI0RzsKKwl9CisJaWYgKGllZWU4MDIxMV9pc19lbXB0eV9lc3NpZChuZXR3b3JrLT5zc2lkLCBuZXR3b3JrLT5zc2lkX2xlbikpCisJCW5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfRU1QVFlfRVNTSUQ7CisKKwlzdGF0cy0+c2lnbmFsID0gMzAgKyAoc3RhdHMtPlNpZ25hbFN0cmVuZ3RoICogNzApIC8gMTAwOworCS8vc3RhdHMtPnNpZ25hbCA9IGllZWU4MDIxMV9TaWduYWxTdHJlbmd0aFRyYW5zbGF0ZShzdGF0cy0+c2lnbmFsKTsKKwlzdGF0cy0+bm9pc2UgPSBpZWVlODAyMTFfdHJhbnNsYXRlX3RvZGJtKCh1OCkoMTAwLXN0YXRzLT5zaWduYWwpKSAtMjU7CisKKwltZW1jcHkoJm5ldHdvcmstPnN0YXRzLCBzdGF0cywgc2l6ZW9mKG5ldHdvcmstPnN0YXRzKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfc2FtZV9uZXR3b3JrKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqc3JjLAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpkc3QsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKQoreworCS8qIEEgbmV0d29yayBpcyBvbmx5IGEgZHVwbGljYXRlIGlmIHRoZSBjaGFubmVsLCBCU1NJRCwgRVNTSUQKKwkgKiBhbmQgdGhlIGNhcGFiaWxpdHkgZmllbGQgKGluIHBhcnRpY3VsYXIgSUJTUyBhbmQgQlNTKSBhbGwgbWF0Y2guCisJICogV2UgdHJlYXQgYWxsIDxoaWRkZW4+IHdpdGggdGhlIHNhbWUgQlNTSUQgYW5kIGNoYW5uZWwKKwkgKiBhcyBvbmUgbmV0d29yayAqLworCXJldHVybiAvLygoc3JjLT5zc2lkX2xlbiA9PSBkc3QtPnNzaWRfbGVuKSAmJgorCQkoKChzcmMtPnNzaWRfbGVuID09IGRzdC0+c3NpZF9sZW4pIHx8IChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpKSAmJgorCQkoc3JjLT5jaGFubmVsID09IGRzdC0+Y2hhbm5lbCkgJiYKKwkJIW1lbWNtcChzcmMtPmJzc2lkLCBkc3QtPmJzc2lkLCBFVEhfQUxFTikgJiYKKwkJLy8hbWVtY21wKHNyYy0+c3NpZCwgZHN0LT5zc2lkLCBzcmMtPnNzaWRfbGVuKSAmJgorCQkoIW1lbWNtcChzcmMtPnNzaWQsIGRzdC0+c3NpZCwgc3JjLT5zc2lkX2xlbikgfHwgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkpICYmCisJCSgoc3JjLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpID09CisJCShkc3QtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykpICYmCisJCSgoc3JjLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0JTUykgPT0KKwkJKGRzdC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9CU1MpKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfbmV0d29yayhzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmRzdCwKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqc3JjKQoreworCWludCBxb3NfYWN0aXZlOworCXU4IG9sZF9wYXJhbTsKKworCW1lbWNweSgmZHN0LT5zdGF0cywgJnNyYy0+c3RhdHMsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzKSk7CisJZHN0LT5jYXBhYmlsaXR5ID0gc3JjLT5jYXBhYmlsaXR5OworCW1lbWNweShkc3QtPnJhdGVzLCBzcmMtPnJhdGVzLCBzcmMtPnJhdGVzX2xlbik7CisJZHN0LT5yYXRlc19sZW4gPSBzcmMtPnJhdGVzX2xlbjsKKwltZW1jcHkoZHN0LT5yYXRlc19leCwgc3JjLT5yYXRlc19leCwgc3JjLT5yYXRlc19leF9sZW4pOworCWRzdC0+cmF0ZXNfZXhfbGVuID0gc3JjLT5yYXRlc19leF9sZW47CisJaWYoc3JjLT5zc2lkX2xlbiA+IDApCisJeworCQltZW1zZXQoZHN0LT5zc2lkLCAwLCBkc3QtPnNzaWRfbGVuKTsKKwkJZHN0LT5zc2lkX2xlbiA9IHNyYy0+c3NpZF9sZW47CisJCW1lbWNweShkc3QtPnNzaWQsIHNyYy0+c3NpZCwgc3JjLT5zc2lkX2xlbik7CisJfQorCWRzdC0+bW9kZSA9IHNyYy0+bW9kZTsKKwlkc3QtPmZsYWdzID0gc3JjLT5mbGFnczsKKwlkc3QtPnRpbWVfc3RhbXBbMF0gPSBzcmMtPnRpbWVfc3RhbXBbMF07CisJZHN0LT50aW1lX3N0YW1wWzFdID0gc3JjLT50aW1lX3N0YW1wWzFdOworCWlmIChzcmMtPmZsYWdzICYgTkVUV09SS19IQVNfRVJQX1ZBTFVFKQorCXsKKwkJZHN0LT5lcnBfdmFsdWUgPSBzcmMtPmVycF92YWx1ZTsKKwkJZHN0LT5iZXJwX2luZm9fdmFsaWQgPSBzcmMtPmJlcnBfaW5mb192YWxpZCA9IHRydWU7CisJfQorCWRzdC0+YmVhY29uX2ludGVydmFsID0gc3JjLT5iZWFjb25faW50ZXJ2YWw7CisJZHN0LT5saXN0ZW5faW50ZXJ2YWwgPSBzcmMtPmxpc3Rlbl9pbnRlcnZhbDsKKwlkc3QtPmF0aW1fd2luZG93ID0gc3JjLT5hdGltX3dpbmRvdzsKKwlkc3QtPmR0aW1fcGVyaW9kID0gc3JjLT5kdGltX3BlcmlvZDsKKwlkc3QtPmR0aW1fZGF0YSA9IHNyYy0+ZHRpbV9kYXRhOworCWRzdC0+bGFzdF9kdGltX3N0YV90aW1lWzBdID0gc3JjLT5sYXN0X2R0aW1fc3RhX3RpbWVbMF07CisJZHN0LT5sYXN0X2R0aW1fc3RhX3RpbWVbMV0gPSBzcmMtPmxhc3RfZHRpbV9zdGFfdGltZVsxXTsKKwltZW1jcHkoJmRzdC0+dGltLCAmc3JjLT50aW0sIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3RpbV9wYXJhbWV0ZXJzKSk7CisKKyAgICAgICAgZHN0LT5ic3NodC5iZFN1cHBvcnRIVCA9IHNyYy0+YnNzaHQuYmRTdXBwb3J0SFQ7CisJZHN0LT5ic3NodC5iZFJUMlJUQWdncmVnYXRpb24gPSBzcmMtPmJzc2h0LmJkUlQyUlRBZ2dyZWdhdGlvbjsKKwlkc3QtPmJzc2h0LmJkSFRDYXBMZW49IHNyYy0+YnNzaHQuYmRIVENhcExlbjsKKwltZW1jcHkoZHN0LT5ic3NodC5iZEhUQ2FwQnVmLHNyYy0+YnNzaHQuYmRIVENhcEJ1ZixzcmMtPmJzc2h0LmJkSFRDYXBMZW4pOworCWRzdC0+YnNzaHQuYmRIVEluZm9MZW49IHNyYy0+YnNzaHQuYmRIVEluZm9MZW47CisJbWVtY3B5KGRzdC0+YnNzaHQuYmRIVEluZm9CdWYsc3JjLT5ic3NodC5iZEhUSW5mb0J1ZixzcmMtPmJzc2h0LmJkSFRJbmZvTGVuKTsKKwlkc3QtPmJzc2h0LmJkSFRTcGVjVmVyID0gc3JjLT5ic3NodC5iZEhUU3BlY1ZlcjsKKwlkc3QtPmJzc2h0LmJkUlQyUlRMb25nU2xvdFRpbWUgPSBzcmMtPmJzc2h0LmJkUlQyUlRMb25nU2xvdFRpbWU7CisJZHN0LT5icm9hZGNvbV9jYXBfZXhpc3QgPSBzcmMtPmJyb2FkY29tX2NhcF9leGlzdDsKKwlkc3QtPnJhbGlua19jYXBfZXhpc3QgPSBzcmMtPnJhbGlua19jYXBfZXhpc3Q7CisJZHN0LT5hdGhlcm9zX2NhcF9leGlzdCA9IHNyYy0+YXRoZXJvc19jYXBfZXhpc3Q7CisJZHN0LT5jaXNjb19jYXBfZXhpc3QgPSBzcmMtPmNpc2NvX2NhcF9leGlzdDsKKwlkc3QtPnVua25vd25fY2FwX2V4aXN0ID0gc3JjLT51bmtub3duX2NhcF9leGlzdDsKKwltZW1jcHkoZHN0LT53cGFfaWUsIHNyYy0+d3BhX2llLCBzcmMtPndwYV9pZV9sZW4pOworCWRzdC0+d3BhX2llX2xlbiA9IHNyYy0+d3BhX2llX2xlbjsKKwltZW1jcHkoZHN0LT5yc25faWUsIHNyYy0+cnNuX2llLCBzcmMtPnJzbl9pZV9sZW4pOworCWRzdC0+cnNuX2llX2xlbiA9IHNyYy0+cnNuX2llX2xlbjsKKworCWRzdC0+bGFzdF9zY2FubmVkID0gamlmZmllczsKKwkvKiBxb3MgcmVsYXRlZCBwYXJhbWV0ZXJzICovCisJLy9xb3NfYWN0aXZlID0gc3JjLT5xb3NfZGF0YS5hY3RpdmU7CisJcW9zX2FjdGl2ZSA9IGRzdC0+cW9zX2RhdGEuYWN0aXZlOworCS8vb2xkX3BhcmFtID0gZHN0LT5xb3NfZGF0YS5vbGRfcGFyYW1fY291bnQ7CisJb2xkX3BhcmFtID0gZHN0LT5xb3NfZGF0YS5wYXJhbV9jb3VudDsKKwlpZihkc3QtPmZsYWdzICYgTkVUV09SS19IQVNfUU9TX01BU0spCisJCW1lbWNweSgmZHN0LT5xb3NfZGF0YSwgJnNyYy0+cW9zX2RhdGEsCisJCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfZGF0YSkpOworCWVsc2UgeworCQlkc3QtPnFvc19kYXRhLnN1cHBvcnRlZCA9IHNyYy0+cW9zX2RhdGEuc3VwcG9ydGVkOworCQlkc3QtPnFvc19kYXRhLnBhcmFtX2NvdW50ID0gc3JjLT5xb3NfZGF0YS5wYXJhbV9jb3VudDsKKwl9CisKKwlpZihkc3QtPnFvc19kYXRhLnN1cHBvcnRlZCA9PSAxKSB7CisJCWRzdC0+UW9TX0VuYWJsZSA9IDE7CisJCWlmKGRzdC0+c3NpZF9sZW4pCisJCQlJRUVFODAyMTFfREVCVUdfUU9TCisJCQkJKCJRb1MgdGhlIG5ldHdvcmsgJXMgaXMgUW9TIHN1cHBvcnRlZFxuIiwKKwkJCQlkc3QtPnNzaWQpOworCQllbHNlCisJCQlJRUVFODAyMTFfREVCVUdfUU9TCisJCQkJKCJRb1MgdGhlIG5ldHdvcmsgaXMgUW9TIHN1cHBvcnRlZFxuIik7CisJfQorCWRzdC0+cW9zX2RhdGEuYWN0aXZlID0gcW9zX2FjdGl2ZTsKKwlkc3QtPnFvc19kYXRhLm9sZF9wYXJhbV9jb3VudCA9IG9sZF9wYXJhbTsKKworCS8qIGRzdC0+bGFzdF9hc3NvY2lhdGUgaXMgbm90IG92ZXJ3cml0dGVuICovCisJZHN0LT53bW1faW5mbyA9IHNyYy0+d21tX2luZm87IC8vc3VyZSB0byBleGlzdCBpbiBiZWFjb24gb3IgcHJvYmUgcmVzcG9uc2UgZnJhbWUuCisJaWYoc3JjLT53bW1fcGFyYW1bMF0uYWNfYWNpX2FjbV9haWZzbnx8IFwKKwkgICBzcmMtPndtbV9wYXJhbVsxXS5hY19hY2lfYWNtX2FpZnNufHwgXAorCSAgIHNyYy0+d21tX3BhcmFtWzJdLmFjX2FjaV9hY21fYWlmc258fCBcCisJICAgc3JjLT53bW1fcGFyYW1bMV0uYWNfYWNpX2FjbV9haWZzbikgeworCSAgbWVtY3B5KGRzdC0+d21tX3BhcmFtLCBzcmMtPndtbV9wYXJhbSwgV01FX0FDX1BSQU1fTEVOKTsKKwl9CisJLy9kc3QtPlFvU19FbmFibGUgPSBzcmMtPlFvU19FbmFibGU7CisjaWZkZWYgVEhPTUFTX1RVUkJPCisJZHN0LT5UdXJib19FbmFibGUgPSBzcmMtPlR1cmJvX0VuYWJsZTsKKyNlbmRpZgorCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWRzdC0+Q291bnRyeUllTGVuID0gc3JjLT5Db3VudHJ5SWVMZW47CisJbWVtY3B5KGRzdC0+Q291bnRyeUllQnVmLCBzcmMtPkNvdW50cnlJZUJ1Ziwgc3JjLT5Db3VudHJ5SWVMZW4pOworI2VuZGlmCisKKwkvL2FkZGVkIGJ5IGFteSBmb3IgTEVBUAorCWRzdC0+YldpdGhBaXJvbmV0SUUgPSBzcmMtPmJXaXRoQWlyb25ldElFOworCWRzdC0+YkNraXBTdXBwb3J0ZWQgPSBzcmMtPmJDa2lwU3VwcG9ydGVkOworCW1lbWNweShkc3QtPkNjeFJtU3RhdGUsc3JjLT5DY3hSbVN0YXRlLDIpOworCWRzdC0+YkNjeFJtRW5hYmxlID0gc3JjLT5iQ2N4Um1FbmFibGU7CisJZHN0LT5NQnNzaWRNYXNrID0gc3JjLT5NQnNzaWRNYXNrOworCWRzdC0+Yk1Cc3NpZFZhbGlkID0gc3JjLT5iTUJzc2lkVmFsaWQ7CisJbWVtY3B5KGRzdC0+TUJzc2lkLHNyYy0+TUJzc2lkLDYpOworCWRzdC0+YldpdGhDY3hWZXJOdW0gPSBzcmMtPmJXaXRoQ2N4VmVyTnVtOworCWRzdC0+QnNzQ2N4VmVyTnVtYmVyID0gc3JjLT5Cc3NDY3hWZXJOdW1iZXI7CisKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfYmVhY29uKF9fbGUxNiBmYykKK3sKKwlyZXR1cm4gKFdMQU5fRkNfR0VUX1NUWVBFKGxlMTZfdG9fY3B1KGZjKSkgPT0gSUVFRTgwMjExX1NUWVBFX0JFQUNPTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfcHJvY2Vzc19wcm9iZV9yZXNwb25zZSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiZWFjb24sCisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldHdvcms7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICp0YXJnZXQ7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpvbGRlc3QgPSBOVUxMOworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaW5mb19lbGVtZW50ID0gJmJlYWNvbi0+aW5mb19lbGVtZW50WzBdOworI2VuZGlmCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaG9ydCByZW5ldzsKKwkvL3U4IHdtbV9pbmZvOworCisJbWVtc2V0KCZuZXR3b3JrLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKSk7CisJSUVFRTgwMjExX0RFQlVHX1NDQU4oCisJCSInJXMnICgiIE1BQ19GTVQgIik6ICVjJWMlYyVjICVjJWMlYyVjLSVjJWMlYyVjICVjJWMlYyVjXG4iLAorCQllc2NhcGVfZXNzaWQoaW5mb19lbGVtZW50LT5kYXRhLCBpbmZvX2VsZW1lbnQtPmxlbiksCisJCU1BQ19BUkcoYmVhY29uLT5oZWFkZXIuYWRkcjMpLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4ZikpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4ZSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4ZCkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4YykpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4YikpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4YSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4OSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4OCkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NykpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NikpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NCkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MykpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MikpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MCkpID8gJzEnIDogJzAnKTsKKworCWlmIChpZWVlODAyMTFfbmV0d29ya19pbml0KGllZWUsIGJlYWNvbiwgJm5ldHdvcmssIHN0YXRzKSkgeworCQlJRUVFODAyMTFfREVCVUdfU0NBTigiRHJvcHBlZCAnJXMnICgiIE1BQ19GTVQgIikgdmlhICVzLlxuIiwKKwkJCQkgICAgIGVzY2FwZV9lc3NpZChpbmZvX2VsZW1lbnQtPmRhdGEsCisJCQkJCQkgIGluZm9fZWxlbWVudC0+bGVuKSwKKwkJCQkgICAgIE1BQ19BUkcoYmVhY29uLT5oZWFkZXIuYWRkcjMpLAorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSA9PQorCQkJCSAgICAgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1AgPworCQkJCSAgICAgIlBST0JFIFJFU1BPTlNFIiA6ICJCRUFDT04iKTsKKwkJcmV0dXJuOworCX0KKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkvLyBGb3IgQXN1cyBFZWVQYyByZXF1ZXN0LAorCS8vICgxKSBpZiB3aXJlbGVzcyBhZGFwdGVyIHJlY2VpdmUgZ2V0IGFueSA4MDIuMTFkIGNvdW50cnkgY29kZSBpbiBBUCBiZWFjb24sCisJLy8JICAgd2lyZWxlc3MgYWRhcHRlciBzaG91bGQgZm9sbG93IHRoZSBjb3VudHJ5IGNvZGUuCisJLy8gKDIpICBJZiB0aGVyZSBpcyBubyBhbnkgY291bnRyeSBjb2RlIGluIGJlYWNvbiwKKwkvLyAgICAgICB0aGVuIHdpcmVsZXNzIGFkYXB0ZXIgc2hvdWxkIGRvIGFjdGl2ZSBzY2FuIGZyb20gY2gxfjExIGFuZAorCS8vICAgICAgIHBhc3NpdmUgc2NhbiBmcm9tIGNoMTJ+MTQKKworCWlmKCAhSXNMZWdhbENoYW5uZWwoaWVlZSwgbmV0d29yay5jaGFubmVsKSApCisJCXJldHVybjsKKwlpZihpZWVlLT5iR2xvYmFsRG9tYWluKQorCXsKKwkJaWYgKFdMQU5fRkNfR0VUX1NUWVBFKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkgPT0gSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1ApCisJCXsKKwkJCS8vIENhc2UgMTogQ291bnRyeSBjb2RlCisJCQlpZihJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpICkKKwkJCXsKKwkJCQlpZiggIUlzTGVnYWxDaGFubmVsKGllZWUsIG5ldHdvcmsuY2hhbm5lbCkgKQorCQkJCXsKKwkJCQkJcHJpbnRrKCJHZXRTY2FuSW5mbygpOiBGb3IgQ291bnRyeSBjb2RlLCBmaWx0ZXIgcHJvYmUgcmVzcG9uc2UgYXQgY2hhbm5lbCglZCkuXG4iLCBuZXR3b3JrLmNoYW5uZWwpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJLy8gQ2FzZSAyOiBObyBhbnkgY291bnRyeSBjb2RlLgorCQkJZWxzZQorCQkJeworCQkJCS8vIEZpbHRlciBvdmVyIGNoYW5uZWwgY2gxMn4xNAorCQkJCWlmKG5ldHdvcmsuY2hhbm5lbCA+IDExKQorCQkJCXsKKwkJCQkJcHJpbnRrKCJHZXRTY2FuSW5mbygpOiBGb3IgR2xvYmFsIERvbWFpbiwgZmlsdGVyIHByb2JlIHJlc3BvbnNlIGF0IGNoYW5uZWwoJWQpLlxuIiwgbmV0d29yay5jaGFubmVsKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIENhc2UgMTogQ291bnRyeSBjb2RlCisJCQlpZihJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpICkKKwkJCXsKKwkJCQlpZiggIUlzTGVnYWxDaGFubmVsKGllZWUsIG5ldHdvcmsuY2hhbm5lbCkgKQorCQkJCXsKKwkJCQkJcHJpbnRrKCJHZXRTY2FuSW5mbygpOiBGb3IgQ291bnRyeSBjb2RlLCBmaWx0ZXIgYmVhY29uIGF0IGNoYW5uZWwoJWQpLlxuIixuZXR3b3JrLmNoYW5uZWwpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJLy8gQ2FzZSAyOiBObyBhbnkgY291bnRyeSBjb2RlLgorCQkJZWxzZQorCQkJeworCQkJCS8vIEZpbHRlciBvdmVyIGNoYW5uZWwgY2gxMn4xNAorCQkJCWlmKG5ldHdvcmsuY2hhbm5lbCA+IDE0KQorCQkJCXsKKwkJCQkJcHJpbnRrKCJHZXRTY2FuSW5mbygpOiBGb3IgR2xvYmFsIERvbWFpbiwgZmlsdGVyIGJlYWNvbiBhdCBjaGFubmVsKCVkKS5cbiIsbmV0d29yay5jaGFubmVsKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJLyogVGhlIG5ldHdvcmsgcGFyc2VkIGNvcnJlY3RseSAtLSBzbyBub3cgd2Ugc2NhbiBvdXIga25vd24gbmV0d29ya3MKKwkgKiB0byBzZWUgaWYgd2UgY2FuIGZpbmQgaXQgaW4gb3VyIGxpc3QuCisJICoKKwkgKiBOT1RFOiAgVGhpcyBzZWFyY2ggaXMgZGVmaW5pdGVseSBub3Qgb3B0aW1pemVkLiAgT25jZSBpdHMgZG9pbmcKKwkgKiAgICAgICAgdGhlICJyaWdodCB0aGluZyIgd2UnbGwgb3B0aW1pemUgaXQgZm9yIGVmZmljaWVuY3kgaWYKKwkgKiAgICAgICAgbmVjZXNzYXJ5ICovCisKKwkvKiBTZWFyY2ggZm9yIHRoaXMgZW50cnkgaW4gdGhlIGxpc3QgYW5kIHVwZGF0ZSBpdCBpZiBpdCBpcworCSAqIGFscmVhZHkgdGhlcmUuICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYoaXNfc2FtZV9uZXR3b3JrKCZpZWVlLT5jdXJyZW50X25ldHdvcmssICZuZXR3b3JrLCBpZWVlKSkgeworCQl1cGRhdGVfbmV0d29yaygmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCAmbmV0d29yayk7CisJCWlmKChpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fMjRHIHx8IGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfRykKKwkJJiYgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlcnBfaW5mb192YWxpZCl7CisJCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay5lcnBfdmFsdWUmIEVSUF9Vc2VQcm90ZWN0aW9uKQorCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJ1c2Vwcm90ZWN0aW9uID0gdHJ1ZTsKKwkJZWxzZQorCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJ1c2Vwcm90ZWN0aW9uID0gZmFsc2U7CisJCX0KKwkJaWYoaXNfYmVhY29uKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkpCisJCXsKKwkJCWlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCisJCQkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kKys7CisJCX0KKwkJZWxzZSAvL2hpZGRlbiBBUAorCQkJbmV0d29yay5mbGFncyA9ICh+TkVUV09SS19FTVBUWV9FU1NJRCAmIG5ldHdvcmsuZmxhZ3MpfChORVRXT1JLX0VNUFRZX0VTU0lEICYgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmZsYWdzKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdldCwgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgeworCQlpZiAoaXNfc2FtZV9uZXR3b3JrKHRhcmdldCwgJm5ldHdvcmssIGllZWUpKQorCQkJYnJlYWs7CisJCWlmICgob2xkZXN0ID09IE5VTEwpIHx8CisJCSAgICAodGFyZ2V0LT5sYXN0X3NjYW5uZWQgPCBvbGRlc3QtPmxhc3Rfc2Nhbm5lZCkpCisJCQlvbGRlc3QgPSB0YXJnZXQ7CisJfQorCisJLyogSWYgd2UgZGlkbid0IGZpbmQgYSBtYXRjaCwgdGhlbiBnZXQgYSBuZXcgbmV0d29yayBzbG90IHRvIGluaXRpYWxpemUKKwkgKiB3aXRoIHRoaXMgYmVhY29uJ3MgaW5mb3JtYXRpb24gKi8KKwlpZiAoJnRhcmdldC0+bGlzdCA9PSAmaWVlZS0+bmV0d29ya19saXN0KSB7CisJCWlmIChsaXN0X2VtcHR5KCZpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdCkpIHsKKwkJCS8qIElmIHRoZXJlIGFyZSBubyBtb3JlIHNsb3RzLCBleHBpcmUgdGhlIG9sZGVzdCAqLworCQkJbGlzdF9kZWwoJm9sZGVzdC0+bGlzdCk7CisJCQl0YXJnZXQgPSBvbGRlc3Q7CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiRXhwaXJlZCAnJXMnICgiIE1BQ19GTVQgIikgZnJvbSAiCisJCQkJCSAgICAgIm5ldHdvcmsgbGlzdC5cbiIsCisJCQkJCSAgICAgZXNjYXBlX2Vzc2lkKHRhcmdldC0+c3NpZCwKKwkJCQkJCQkgIHRhcmdldC0+c3NpZF9sZW4pLAorCQkJCQkgICAgIE1BQ19BUkcodGFyZ2V0LT5ic3NpZCkpOworCQl9IGVsc2UgeworCQkJLyogT3RoZXJ3aXNlIGp1c3QgcHVsbCBmcm9tIHRoZSBmcmVlIGxpc3QgKi8KKwkJCXRhcmdldCA9IGxpc3RfZW50cnkoaWVlZS0+bmV0d29ya19mcmVlX2xpc3QubmV4dCwKKwkJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaywgbGlzdCk7CisJCQlsaXN0X2RlbChpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdC5uZXh0KTsKKwkJfQorCisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJBZGRpbmcgJyVzJyAoIiBNQUNfRk1UICIpIHZpYSAlcy5cbiIsCisJCQkJICAgICBlc2NhcGVfZXNzaWQobmV0d29yay5zc2lkLAorCQkJCQkJICBuZXR3b3JrLnNzaWRfbGVuKSwKKwkJCQkgICAgIE1BQ19BUkcobmV0d29yay5ic3NpZCksCisJCQkJICAgICBXTEFOX0ZDX0dFVF9TVFlQRShiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpID09CisJCQkJICAgICBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCA/CisJCQkJICAgICAiUFJPQkUgUkVTUE9OU0UiIDogIkJFQUNPTiIpOworI2VuZGlmCisJCW1lbWNweSh0YXJnZXQsICZuZXR3b3JrLCBzaXplb2YoKnRhcmdldCkpOworCQlsaXN0X2FkZF90YWlsKCZ0YXJnZXQtPmxpc3QsICZpZWVlLT5uZXR3b3JrX2xpc3QpOworCQlpZihpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkKKwkJCWllZWU4MDIxMV9zb2Z0bWFjX25ld19uZXQoaWVlZSwmbmV0d29yayk7CisJfSBlbHNlIHsKKwkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIlVwZGF0aW5nICclcycgKCIgTUFDX0ZNVCAiKSB2aWEgJXMuXG4iLAorCQkJCSAgICAgZXNjYXBlX2Vzc2lkKHRhcmdldC0+c3NpZCwKKwkJCQkJCSAgdGFyZ2V0LT5zc2lkX2xlbiksCisJCQkJICAgICBNQUNfQVJHKHRhcmdldC0+YnNzaWQpLAorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSA9PQorCQkJCSAgICAgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1AgPworCQkJCSAgICAgIlBST0JFIFJFU1BPTlNFIiA6ICJCRUFDT04iKTsKKworCQkvKiB3ZSBoYXZlIGFuIGVudHJ5IGFuZCB3ZSBhcmUgZ29pbmcgdG8gdXBkYXRlIGl0LiBCdXQgdGhpcyBlbnRyeSBtYXkKKwkJICogYmUgYWxyZWFkeSBleHBpcmVkLiBJbiB0aGlzIGNhc2Ugd2UgZG8gdGhlIHNhbWUgYXMgd2UgZm91bmQgYSBuZXcKKwkJICogbmV0IGFuZCBjYWxsIHRoZSBuZXdfbmV0IGhhbmRsZXIKKwkJICovCisJCXJlbmV3ID0gIXRpbWVfYWZ0ZXIodGFyZ2V0LT5sYXN0X3NjYW5uZWQgKyBpZWVlLT5zY2FuX2FnZSwgamlmZmllcyk7CisJCS8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwCisJCWlmKGlzX2JlYWNvbihiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpID09IDApCisJCQluZXR3b3JrLmZsYWdzID0gKH5ORVRXT1JLX0VNUFRZX0VTU0lEICYgbmV0d29yay5mbGFncyl8KE5FVFdPUktfRU1QVFlfRVNTSUQgJiB0YXJnZXQtPmZsYWdzKTsKKwkJLy9pZihzdHJuY21wKG5ldHdvcmsuc3NpZCwgImxpbmtzeXMtYyIsOSkgPT0gMCkKKwkJLy8JcHJpbnRrKCI9PT09PjIgbmV0d29yay5zc2lkPSVzIEZMQUc9JWQgdGFyZ2V0LnNzaWQ9JXMgRkxBRz0lZFxuIiwgbmV0d29yay5zc2lkLCBuZXR3b3JrLmZsYWdzLCB0YXJnZXQtPnNzaWQsIHRhcmdldC0+ZmxhZ3MpOworCQlpZigoKG5ldHdvcmsuZmxhZ3MgJiBORVRXT1JLX0VNUFRZX0VTU0lEKSA9PSBORVRXT1JLX0VNUFRZX0VTU0lEKSBcCisJCSAgICAmJiAoKChuZXR3b3JrLnNzaWRfbGVuID4gMCkgJiYgKHN0cm5jbXAodGFyZ2V0LT5zc2lkLCBuZXR3b3JrLnNzaWQsIG5ldHdvcmsuc3NpZF9sZW4pKSlcCisJCSAgICB8fCgoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IG5ldHdvcmsuc3NpZF9sZW4pJiYoc3RybmNtcChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgbmV0d29yay5zc2lkLCBuZXR3b3JrLnNzaWRfbGVuKSA9PSAwKSYmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspKSkpCisJCQlyZW5ldyA9IDE7CisJCS8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwLGVuZAorCisJCXVwZGF0ZV9uZXR3b3JrKHRhcmdldCwgJm5ldHdvcmspOworCQlpZihyZW5ldyAmJiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpKQorCQkJaWVlZTgwMjExX3NvZnRtYWNfbmV3X25ldChpZWVlLCZuZXR3b3JrKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJaWYgKGlzX2JlYWNvbihiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpJiZpc19zYW1lX25ldHdvcmsoJmllZWUtPmN1cnJlbnRfbmV0d29yaywgJm5ldHdvcmssIGllZWUpJiZcCisJCShpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSkgeworCQlpZihpZWVlLT5oYW5kbGVfYmVhY29uICE9IE5VTEwpIHsKKwkJCWllZWUtPmhhbmRsZV9iZWFjb24oaWVlZS0+ZGV2LGJlYWNvbiwmaWVlZS0+Y3VycmVudF9uZXR3b3JrKTsKKwkJfQorCX0KK30KKwordm9pZCBpZWVlODAyMTFfcnhfbWd0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGVhZGVyLAorCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKK3sKKwlzd2l0Y2ggKFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSkgeworCisJY2FzZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OOgorCQlJRUVFODAyMTFfREVCVUdfTUdNVCgicmVjZWl2ZWQgQkVBQ09OICglZClcbiIsCisJCQkJICAgICBXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpOworCQlJRUVFODAyMTFfREVCVUdfU0NBTigiQmVhY29uXG4iKTsKKwkJaWVlZTgwMjExX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UoCisJCQlpZWVlLCAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqKWhlYWRlciwgc3RhdHMpOworCQlicmVhazsKKworCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1A6CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJyZWNlaXZlZCBQUk9CRSBSRVNQT05TRSAoJWQpXG4iLAorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKTsKKwkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIlByb2JlIHJlc3BvbnNlXG4iKTsKKwkJaWVlZTgwMjExX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UoCisJCQlpZWVlLCAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqKWhlYWRlciwgc3RhdHMpOworCQlicmVhazsKKworCX0KK30KKworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcnhfbWd0KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3J4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTg2ZTkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCkBAIC0wLDAgKzEsMzI4NyBAQAorLyogSUVFRSA4MDIuMTEgU29mdE1BQyBsYXllcgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAqCisgKiBNb3N0bHkgZXh0cmFjdGVkIGZyb20gdGhlIHJ0bDgxODAtc2EyNDAwIGRyaXZlciBmb3IgdGhlCisgKiBpbi1rZXJuZWwgZ2VuZXJpYyBpZWVlODAyLjExIHN0YWNrLgorICoKKyAqIEZldyBsaW5lcyBtaWdodCBiZSBzdG9sZW4gZnJvbSBvdGhlciBwYXJ0IG9mIHRoZSBpZWVlODAyMTEKKyAqIHN0YWNrLiBDb3B5cmlnaHQgd2hvIG93biBpdCdzIGNvcHlyaWdodAorICoKKyAqIFdQQSBjb2RlIHN0b2xlbiBmcm9tIHRoZSBpcHcyMjAwIGRyaXZlci4KKyAqIENvcHlyaWdodCB3aG8gb3duIGl0J3MgY29weXJpZ2h0LgorICoKKyAqIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaWZkZWYgRU5BQkxFX0RPVDExRAorI2luY2x1ZGUgImRvdDExZC5oIgorI2VuZGlmCisKK3U4IHJzbl9hdXRoZW5fY2lwaGVyX3N1aXRlWzE2XVs0XSA9IHsKKwl7MHgwMCwweDBGLDB4QUMsMHgwMH0sIC8vVXNlIGdyb3VwIGtleSwgLy9SZXNlcnZlZAorCXsweDAwLDB4MEYsMHhBQywweDAxfSwgLy9XRVAtNDAgICAgICAgICAvL1JTTkEgZGVmYXVsdAorCXsweDAwLDB4MEYsMHhBQywweDAyfSwgLy9US0lQICAgICAgICAgICAvL05PTkUJCS8ve3VzZWQganVzdCBhcyBkZWZhdWx0fQorCXsweDAwLDB4MEYsMHhBQywweDAzfSwgLy9XUkFQLWhpc3RvcmljYWwKKwl7MHgwMCwweDBGLDB4QUMsMHgwNH0sIC8vQ0NNUAorCXsweDAwLDB4MEYsMHhBQywweDA1fSwgLy9XRVAtMTA0Cit9OworCitzaG9ydCBpZWVlODAyMTFfaXNfNTRnKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpCit7CisJcmV0dXJuICgobmV0LnJhdGVzX2V4X2xlbiA+IDApIHx8IChuZXQucmF0ZXNfbGVuID4gNCkpOworfQorCitzaG9ydCBpZWVlODAyMTFfaXNfc2hvcnRzbG90KHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpCit7CisJcmV0dXJuIChuZXQuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKTsKK30KKworLyogcmV0dXJucyB0aGUgdG90YWwgbGVuZ3RoIG5lZWRlZCBmb3IgcGxlYWNpbmcgdGhlIFJBVEUgTUZJRQorICogdGFnIGFuZCB0aGUgRVhURU5ERUQgUkFURSBNRklFIHRhZyBpZiBuZWVkZWQuCisgKiBJdCBlbmNsdWRlcyB0d28gYnl0ZXMgcGVyIHRhZyBmb3IgdGhlIHRhZyBpdHNlbGYgYW5kIGl0cyBsZW4KKyAqLwordW5zaWduZWQgaW50IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGludCByYXRlX2xlbiA9IDA7CisKKwlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikKKwkJcmF0ZV9sZW4gPSBJRUVFODAyMTFfQ0NLX1JBVEVfTEVOICsgMjsKKworCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikKKworCQlyYXRlX2xlbiArPSBJRUVFODAyMTFfT0ZETV9SQVRFX0xFTiArIDI7CisKKwlyZXR1cm4gcmF0ZV9sZW47Cit9CisKKy8qIHBsZWFjZSB0aGUgTUZJRSByYXRlLCB0YWcgdG8gdGhlIG1lbW9yeSAoZG91YmxlKSBwb2luZWQuCisgKiBUaGVuIGl0IHVwZGF0ZXMgdGhlIHBvaW50ZXIgc28gdGhhdAorICogaXQgcG9pbnRzIGFmdGVyIHRoZSBuZXcgTUZJRSB0YWcgYWRkZWQuCisgKi8KK3ZvaWQgaWVlZTgwMjExX01GSUVfQnJhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApCit7CisJdTggKnRhZyA9ICp0YWdfcDsKKworCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKXsKKwkJKnRhZysrID0gTUZJRV9UWVBFX1JBVEVTOworCQkqdGFnKysgPSA0OworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzFNQjsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8yTUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzExTUI7CisJfQorCisJLyogV2UgbWF5IGFkZCBhbiBvcHRpb24gZm9yIGN1c3RvbSByYXRlcyB0aGF0IHNwZWNpZmljIEhXIG1pZ2h0IHN1cHBvcnQgKi8KKwkqdGFnX3AgPSB0YWc7Cit9CisKK3ZvaWQgaWVlZTgwMjExX01GSUVfR3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApCit7CisJdTggKnRhZyA9ICp0YWdfcDsKKworCQlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04peworCisJCSp0YWcrKyA9IE1GSUVfVFlQRV9SQVRFU19FWDsKKwkJKnRhZysrID0gODsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV85TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI7CisKKwl9CisKKwkvKiBXZSBtYXkgYWRkIGFuIG9wdGlvbiBmb3IgY3VzdG9tIHJhdGVzIHRoYXQgc3BlY2lmaWMgSFcgbWlnaHQgc3VwcG9ydCAqLworCSp0YWdfcCA9IHRhZzsKK30KKworCit2b2lkIGllZWU4MDIxMV9XTU1fSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkgeworCXU4ICp0YWcgPSAqdGFnX3A7CisKKwkqdGFnKysgPSBNRklFX1RZUEVfR0VORVJJQzsgLy8wCisJKnRhZysrID0gNzsKKwkqdGFnKysgPSAweDAwOworCSp0YWcrKyA9IDB4NTA7CisJKnRhZysrID0gMHhmMjsKKwkqdGFnKysgPSAweDAyOy8vNQorCSp0YWcrKyA9IDB4MDA7CisJKnRhZysrID0gMHgwMTsKKyNpZmRlZiBTVVBQT1JUX1VTUEQKKwlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsud21tX2luZm8gJiAweDgwKSB7CisJCSp0YWcrKyA9IDB4MGZ8TUFYX1NQX0xlbjsKKwl9IGVsc2UgeworCQkqdGFnKysgPSBNQVhfU1BfTGVuOworCX0KKyNlbHNlCisJKnRhZysrID0gTUFYX1NQX0xlbjsKKyNlbmRpZgorCSp0YWdfcCA9IHRhZzsKK30KKworI2lmZGVmIFRIT01BU19UVVJCTwordm9pZCBpZWVlODAyMTFfVFVSQk9fSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkgeworCXU4ICp0YWcgPSAqdGFnX3A7CisKKwkqdGFnKysgPSBNRklFX1RZUEVfR0VORVJJQzsgLy8wCisJKnRhZysrID0gNzsKKwkqdGFnKysgPSAweDAwOworCSp0YWcrKyA9IDB4ZTA7CisJKnRhZysrID0gMHg0YzsKKwkqdGFnKysgPSAweDAxOy8vNQorCSp0YWcrKyA9IDB4MDI7CisJKnRhZysrID0gMHgxMTsKKwkqdGFnKysgPSAweDAwOworCisJKnRhZ19wID0gdGFnOworCXByaW50ayhLRVJOX0FMRVJUICJUaGlzIGlzIGVuYWJsZSB0dXJibyBtb2RlIElFIHByb2Nlc3NcbiIpOworfQorI2VuZGlmCisKK3ZvaWQgZW5xdWV1ZV9tZ210KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBuaDsKKwluaCA9IChpZWVlLT5tZ210X3F1ZXVlX2hlYWQgKzEpICUgTUdNVF9RVUVVRV9OVU07CisKKy8qCisgKiBpZiB0aGUgcXVldWUgaXMgZnVsbCBidXQgd2UgaGF2ZSBuZXdlciBmcmFtZXMgdGhlbgorICoganVzdCBvdmVyd3JpdGVzIHRoZSBvbGRlc3QuCisgKgorICogaWYgKG5oID09IGllZWUtPm1nbXRfcXVldWVfdGFpbCkKKyAqCQlyZXR1cm4gLTE7CisgKi8KKwlpZWVlLT5tZ210X3F1ZXVlX2hlYWQgPSBuaDsKKwlpZWVlLT5tZ210X3F1ZXVlX3JpbmdbbmhdID0gc2tiOworCisJLy9yZXR1cm4gMDsKK30KKworc3RydWN0IHNrX2J1ZmYgKmRlcXVldWVfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmV0OworCisJaWYoaWVlZS0+bWdtdF9xdWV1ZV90YWlsID09IGllZWUtPm1nbXRfcXVldWVfaGVhZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBpZWVlLT5tZ210X3F1ZXVlX3JpbmdbaWVlZS0+bWdtdF9xdWV1ZV90YWlsXTsKKworCWllZWUtPm1nbXRfcXVldWVfdGFpbCA9CisJCShpZWVlLT5tZ210X3F1ZXVlX3RhaWwrMSkgJSBNR01UX1FVRVVFX05VTTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgaW5pdF9tZ210X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWllZWUtPm1nbXRfcXVldWVfdGFpbCA9IGllZWUtPm1nbXRfcXVldWVfaGVhZCA9IDA7Cit9CisKK3U4IE1nbnRRdWVyeV9NZ250RnJhbWVUeFJhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVCAgICAgIHBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCXU4IHJhdGU7CisKKwkvLyAyMDA4LzAxLzI1IE1IIEZvciBicm9hZGNvbSwgTUdOVCBmcmFtZSBzZXQgYXMgT0ZETSA2TS4KKwlpZihwSFRJbmZvLT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX01HTlRfVVNFX0NDS182TSkKKwkJcmF0ZSA9IDB4MGM7CisJZWxzZQorCQlyYXRlID0gaWVlZS0+YmFzaWNfcmF0ZSAmIDB4N2Y7CisKKwlpZihyYXRlID09IDApeworCQkvLyAyMDA1LjAxLjI2LCBieSByY25qa28uCisJCWlmKGllZWUtPm1vZGUgPT0gSUVFRV9BfHwKKwkJICAgaWVlZS0+bW9kZT09IElFRUVfTl81R3x8CisJCSAgIChpZWVlLT5tb2RlPT0gSUVFRV9OXzI0RyYmIXBIVEluZm8tPmJDdXJTdXBwQ0NLKSkKKwkJCXJhdGUgPSAweDBjOworCQllbHNlCisJCQlyYXRlID0gMHgwMjsKKwl9CisKKwkvKgorCS8vIERhdGEgcmF0ZSBvZiBQcm9iZVJlcSBpcyBhbHJlYWR5IGRlY2lkZWQuIEFubmllLCAyMDA1LTAzLTMxCisJaWYoIHBNZ250SW5mby0+YlNjYW5JblByb2dyZXNzIHx8IChwTWdudEluZm8tPmJEdWFsTW9kZVNjYW5TdGVwIT0wKSApCisJeworCWlmKHBNZ250SW5mby0+ZG90MTFDdXJyZW50V2lyZWxlc3NNb2RlPT1XSVJFTEVTU19NT0RFX0EpCisJcmF0ZSA9IDB4MGM7CisJZWxzZQorCXJhdGUgPSAweDAyOworCX0KKwkgKi8KKwlyZXR1cm4gcmF0ZTsKK30KKworCit2b2lkIGllZWU4MDIxMV9zdGFfd2FrZXVwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBubCk7CisKK2lubGluZSB2b2lkIHNvZnRtYWNfbWdtdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2hvcnQgc2luZ2xlID0gaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUU7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICpoZWFkZXI9CisJCShzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKikgc2tiLT5kYXRhOworCisJY2JfZGVzYyAqdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgOCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCS8qIGNhbGxlZCB3aXRoIDJuZCBwYXJhbSAwLCBubyBtZ210IGxvY2sgcmVxdWlyZWQgKi8KKwlpZWVlODAyMTFfc3RhX3dha2V1cChpZWVlLDApOworCisJdGNiX2Rlc2MtPnF1ZXVlX2luZGV4ID0gTUdOVF9RVUVVRTsKKwl0Y2JfZGVzYy0+ZGF0YV9yYXRlID0gTWdudFF1ZXJ5X01nbnRGcmFtZVR4UmF0ZShpZWVlKTsKKwl0Y2JfZGVzYy0+UkFUUkluZGV4ID0gNzsKKwl0Y2JfZGVzYy0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayA9IDE7CisJdGNiX2Rlc2MtPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSA9IDE7CisKKwlpZihzaW5nbGUpeworCQlpZihpZWVlLT5xdWV1ZV9zdG9wKXsKKwkJCWVucXVldWVfbWdtdChpZWVlLHNrYik7CisJCX1lbHNleworCQkJaGVhZGVyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF08PDQpOworCisJCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCQkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCQkJZWxzZQorCQkJCWllZWUtPnNlcV9jdHJsWzBdKys7CisKKwkJCS8qIGF2b2lkIHdhdGNoZG9nIHRyaWdnZXJzICovCisJCQlpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoc2tiLGllZWUtPmRldixpZWVlLT5iYXNpY19yYXRlKTsKKwkJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJCX0KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJfWVsc2V7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MpOworCisJCWhlYWRlci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdIDw8IDQpOworCisJCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwkJZWxzZQorCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKworCQkvKiBjaGVjayB3ZXRoZXIgdGhlIG1hbmFnZWQgcGFja2V0IHF1ZXVlZCBncmVhdGVyIHRoYW4gNSAqLworCQlpZighaWVlZS0+Y2hlY2tfbmljX2Vub3VnaF9kZXNjKGllZWUtPmRldix0Y2JfZGVzYy0+cXVldWVfaW5kZXgpfHxcCisJCQkJKHNrYl9xdWV1ZV9sZW4oJmllZWUtPnNrYl93YWl0UVt0Y2JfZGVzYy0+cXVldWVfaW5kZXhdKSAhPSAwKXx8XAorCQkJCShpZWVlLT5xdWV1ZV9zdG9wKSApIHsKKwkJCS8qIGluc2VydCB0aGUgc2tiIHBhY2tldCB0byB0aGUgbWFuYWdlbWVudCBxdWV1ZSAqLworCQkJLyogYXMgZm9yIHRoZSBjb21wbGV0aW9uIGZ1bmN0aW9uLCBpdCBkb2VzIG5vdCBuZWVkCisJCQkgKiB0byBjaGVjayBpdCBhbnkgbW9yZS4KKwkJCSAqICovCisJCQlwcmludGsoIiVzKCk6aW5zZXJ0IHRvIHdhaXRxdWV1ZSFcbiIsX19GVU5DVElPTl9fKTsKKwkJCXNrYl9xdWV1ZV90YWlsKCZpZWVlLT5za2Jfd2FpdFFbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSwgc2tiKTsKKwkJfSBlbHNlIHsKKwkJCS8vcHJpbnRrKCJUWCBwYWNrZXQhXG4iKTsKKwkJCWllZWUtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYixpZWVlLT5kZXYpOworCQkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzKTsKKwl9Cit9CisKK2lubGluZSB2b2lkIHNvZnRtYWNfcHNfbWdtdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCisJc2hvcnQgc2luZ2xlID0gaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUU7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICpoZWFkZXIgPQorCQkoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICopIHNrYi0+ZGF0YTsKKworCisJaWYoc2luZ2xlKXsKKworCQloZWFkZXItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXSA8PCA0KTsKKworCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJCWVsc2UKKwkJCWllZWUtPnNlcV9jdHJsWzBdKys7CisKKwkJLyogYXZvaWQgd2F0Y2hkb2cgdHJpZ2dlcnMgKi8KKwkJaWVlZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoc2tiLGllZWUtPmRldixpZWVlLT5iYXNpY19yYXRlKTsKKworCX1lbHNleworCisJCWhlYWRlci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdIDw8IDQpOworCisJCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwkJZWxzZQorCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKworCQlpZWVlLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2KTsKKworCX0KKwkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworfQorCitpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9wcm9iZV9yZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgaW50IGxlbixyYXRlX2xlbjsKKwl1OCAqdGFnOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0ICpyZXE7CisKKwlsZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW47CisKKwlyYXRlX2xlbiA9IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKGllZWUpOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0KSArCisJCQkgICAgMiArIGxlbiArIHJhdGVfbGVuICsgaWVlZS0+dHhfaGVhZHJvb20pOworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCXNrYl9yZXNlcnZlKHNrYiwgaWVlZS0+dHhfaGVhZHJvb20pOworCisJcmVxID0gKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCAqKSBza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0KSk7CisJcmVxLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSk7CisJcmVxLT5oZWFkZXIuZHVyYXRpb25faWQgPSAwOyAvL0ZJWE1FOiBpcyB0aGlzIE9LID8KKworCW1lbXNldChyZXEtPmhlYWRlci5hZGRyMSwgMHhmZiwgRVRIX0FMRU4pOworCW1lbWNweShyZXEtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbXNldChyZXEtPmhlYWRlci5hZGRyMywgMHhmZiwgRVRIX0FMRU4pOworCisJdGFnID0gKHU4ICopIHNrYl9wdXQoc2tiLGxlbisyK3JhdGVfbGVuKTsKKworCSp0YWcrKyA9IE1GSUVfVFlQRV9TU0lEOworCSp0YWcrKyA9IGxlbjsKKwltZW1jcHkodGFnLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgbGVuKTsKKwl0YWcgKz0gbGVuOworCisJaWVlZTgwMjExX01GSUVfQnJhdGUoaWVlZSwmdGFnKTsKKwlpZWVlODAyMTFfTUZJRV9HcmF0ZShpZWVlLCZ0YWcpOworCXJldHVybiBza2I7Cit9CisKK3N0cnVjdCBza19idWZmICppZWVlODAyMTFfZ2V0X2JlYWNvbl8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwordm9pZCBpZWVlODAyMTFfc2VuZF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpZighaWVlZS0+aWVlZV91cCkKKwkJcmV0dXJuOworCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKwlza2IgPSBpZWVlODAyMTFfZ2V0X2JlYWNvbl8oaWVlZSk7CisKKwlpZiAoc2tiKXsKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9iZWFjb25zKys7CisJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJfQorLy8JaWVlZS0+YmVhY29uX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsKKy8vCQkoTVNFQ1MoIGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgLTUpKTsKKworCS8vc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKKwlpZihpZWVlLT5iZWFjb25fdHhpbmcgJiYgaWVlZS0+aWVlZV91cCl7CisvLwkJaWYoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmJlYWNvbl90aW1lcikpCisvLwkJCWFkZF90aW1lcigmaWVlZS0+YmVhY29uX3RpbWVyKTsKKwkJbW9kX3RpbWVyKCZpZWVlLT5iZWFjb25fdGltZXIsamlmZmllcysoTVNFQ1MoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbC01KSkpOworCX0KKwkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9zZW5kX2JlYWNvbl9jYih1bnNpZ25lZCBsb25nIF9pZWVlKQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0KKwkJKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopIF9pZWVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+YmVhY29uX2xvY2ssIGZsYWdzKTsKKwlpZWVlODAyMTFfc2VuZF9iZWFjb24oaWVlZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+YmVhY29uX2xvY2ssIGZsYWdzKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9zZW5kX3Byb2JlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBpZWVlODAyMTFfcHJvYmVfcmVxKGllZWUpOworCWlmIChza2IpeworCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X3Byb2JlX3JxKys7CisJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJfQorfQorCit2b2lkIGllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmIChpZWVlLT5hY3RpdmVfc2NhbiAmJiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19QUk9CRVJRKSl7CisJCWllZWU4MDIxMV9zZW5kX3Byb2JlKGllZWUpOworCQlpZWVlODAyMTFfc2VuZF9wcm9iZShpZWVlKTsKKwl9Cit9CisKKy8qIHRoaXMgcGVyZm9ybXMgc3luY3JvIHNjYW4gYmxvY2tpbmcgdGhlIGNhbGxlciB1bnRpbCBhbGwgY2hhbm5lbHMKKyAqIGluIHRoZSBhbGxvd2VkIGNoYW5uZWwgbWFwIGhhcyBiZWVuIGNoZWNrZWQuCisgKi8KK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc2hvcnQgY2ggPSAwOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl1OCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisJbWVtY3B5KGNoYW5uZWxfbWFwLCBHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisjZW5kaWYKKwlkb3duKCZpZWVlLT5zY2FuX3NlbSk7CisKKwl3aGlsZSgxKQorCXsKKworCQlkb3sKKwkJCWNoKys7CisJCQlpZiAoY2ggPiBNQVhfQ0hBTk5FTF9OVU1CRVIpCisJCQkJZ290byBvdXQ7IC8qIHNjYW4gY29tcGxldGVkICovCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQl9d2hpbGUoIWNoYW5uZWxfbWFwW2NoXSk7CisjZWxzZQorCQl9d2hpbGUoIWllZWUtPmNoYW5uZWxfbWFwW2NoXSk7CisjZW5kaWYKKworCQkvKiB0aGlzIGZ1Y3Rpb24gY2FuIGJlIGNhbGxlZCBpbiB0d28gc2l0dWF0aW9ucworCQkgKiAxLSBXZSBoYXZlIHN3aXRjaGVkIHRvIGFkLWhvYyBtb2RlIGFuZCB3ZSBhcmUKKwkJICogICAgcGVyZm9ybWluZyBhIGNvbXBsZXRlIHN5bmNybyBzY2FuIGJlZm9yZSBjb25jbHVkZQorCQkgKiAgICB0aGVyZSBhcmUgbm8gaW50ZXJlc3RpbmcgY2VsbCBhbmQgdG8gY3JlYXRlIGEKKwkJICogICAgbmV3IG9uZS4gSW4gdGhpcyBjYXNlIHRoZSBsaW5rIHN0YXRlIGlzCisJCSAqICAgIElFRUU4MDIxMV9OT0xJTksgdW50aWwgd2UgZm91bmQgYW4gaW50ZXJlc3RpbmcgY2VsbC4KKwkJICogICAgSWYgc28gdGhlIGllZWU4MDIxX25ld19uZXQsIGNhbGxlZCBieSB0aGUgUlggcGF0aAorCQkgKiAgICB3aWxsIHNldCB0aGUgc3RhdGUgdG8gSUVFRTgwMjExX0xJTktFRCwgc28gd2Ugc3RvcAorCQkgKiAgICBzY2FubmluZworCQkgKiAyLSBXZSBhcmUgbGlua2VkIGFuZCB0aGUgcm9vdCB1c2VzIHJ1biBpd2xpc3Qgc2Nhbi4KKwkJICogICAgU28gd2Ugc3dpdGNoIHRvIElFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkcgdG8gcmVtZW1iZXIKKwkJICogICAgdGhhdCB3ZSBhcmUgc3RpbGwgbG9naWNhbGx5IGxpbmtlZCAobm90IGludGVyZXN0ZWQgaW4KKwkJICogICAgbmV3IG5ldHdvcmsgZXZlbnRzLCBkZXNwaXRlIGZvciB1cGRhdGluZyB0aGUgbmV0IGxpc3QsCisJCSAqICAgIGJ1dCB3ZSBhcmUgdGVtcG9yYXJseSAndW5saW5rZWQnIGFzIHRoZSBkcml2ZXIgc2hhbGwKKwkJICogICAgbm90IGZpbHRlciBSWCBmcmFtZXMgYW5kIHRoZSBjaGFubmVsIGlzIGNoYW5naW5nLgorCQkgKiBTbyB0aGUgb25seSBzaXR1YXRpb24gaW4gd2l0Y2ggYXJlIGludGVyZXN0ZWQgaXMgdG8gY2hlY2sKKwkJICogaWYgdGhlIHN0YXRlIGJlY29tZSBMSU5LRUQgYmVjYXVzZSBvZiB0aGUgIzEgc2l0dWF0aW9uCisJCSAqLworCisJCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCQkJZ290byBvdXQ7CisJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgY2gpOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJaWYoY2hhbm5lbF9tYXBbY2hdID09IDEpCisjZW5kaWYKKwkJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoaWVlZSk7CisKKwkJLyogdGhpcyBwcmV2ZW50IGV4Y2Vzc2l2ZSB0aW1lIHdhaXQgd2hlbiB3ZQorCQkgKiBuZWVkIHRvIHdhaXQgZm9yIGEgc3luY3JvIHNjYW4gdG8gZW5kLi4KKwkJICovCisJCWlmKGllZWUtPnN0YXRlIDwgSUVFRTgwMjExX0xJTktFRCkKKwkJCTsKKwkJZWxzZQorCQlpZiAoaWVlZS0+c3luY19zY2FuX2h1cnJ5dXApCisJCQlnb3RvIG91dDsKKworCisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlX3JzbChJRUVFODAyMTFfU09GVE1BQ19TQ0FOX1RJTUUpOworCisJfQorb3V0OgorCWlmKGllZWUtPnN0YXRlIDwgSUVFRTgwMjExX0xJTktFRCl7CisJCWllZWUtPmFjdHNjYW5uaW5nID0gZmFsc2U7CisJCXVwKCZpZWVlLT5zY2FuX3NlbSk7CisJfQorCWVsc2V7CisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQorCQlET1QxMURfU2NhbkNvbXBsZXRlKGllZWUpOworI2VuZGlmCisJdXAoJmllZWUtPnNjYW5fc2VtKTsKK30KK30KKworCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgc29mdG1hY19zY2FuX3dxKTsKKwlzdGF0aWMgc2hvcnQgd2F0Y2hkb2cgPSAwOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl1OCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisJbWVtY3B5KGNoYW5uZWxfbWFwLCBHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisjZW5kaWYKKwlpZighaWVlZS0+aWVlZV91cCkKKwkJcmV0dXJuOworCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKKwlkb3sKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPQorCQkJKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsICsgMSkgJSBNQVhfQ0hBTk5FTF9OVU1CRVI7CisJCWlmICh3YXRjaGRvZysrID4gTUFYX0NIQU5ORUxfTlVNQkVSKQorCQl7CisJCS8vaWYgY3VycmVudCBjaGFubmVsIGlzIG5vdCBpbiBjaGFubmVsIG1hcCwgc2V0IHRvIGRlZmF1bHQgY2hhbm5lbC4KKwkJI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJCWlmICghY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKKwkJI2Vsc2UKKwkJCWlmICghaWVlZS0+Y2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKKwkJI2VuZGlmCisJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSA2OworCQkJCWdvdG8gb3V0OyAvKiBubyBnb29kIGNoYW5zICovCisJCX0KKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJfXdoaWxlKCFjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOworI2Vsc2UKKwl9d2hpbGUoIWllZWUtPmNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7CisjZW5kaWYKKwlpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMCApCisJCWdvdG8gb3V0OworCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0gPT0gMSkKKyNlbmRpZgorCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzKGllZWUpOworCisKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsIElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRSk7CisKKwl1cCgmaWVlZS0+c2Nhbl9zZW0pOworCXJldHVybjsKK291dDoKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwkJRE9UMTFEX1NjYW5Db21wbGV0ZShpZWVlKTsKKyNlbmRpZgorCWllZWUtPmFjdHNjYW5uaW5nID0gZmFsc2U7CisJd2F0Y2hkb2cgPSAwOworCWllZWUtPnNjYW5uaW5nID0gMDsKKwl1cCgmaWVlZS0+c2Nhbl9zZW0pOworfQorCisKKwordm9pZCBpZWVlODAyMTFfYmVhY29uc19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7CisKKwlpZWVlLT5iZWFjb25fdHhpbmcgPSAxOworCWllZWU4MDIxMV9zZW5kX2JlYWNvbihpZWVlKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKK30KKwordm9pZCBpZWVlODAyMTFfYmVhY29uc19zdG9wKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOworCisJaWVlZS0+YmVhY29uX3R4aW5nID0gMDsKKwlkZWxfdGltZXJfc3luYygmaWVlZS0+YmVhY29uX3RpbWVyKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKKworfQorCisKK3ZvaWQgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmKGllZWUtPnN0b3Bfc2VuZF9iZWFjb25zKQorCQlpZWVlLT5zdG9wX3NlbmRfYmVhY29ucyhpZWVlLT5kZXYpOworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0JFQUNPTlMpCisJCWllZWU4MDIxMV9iZWFjb25zX3N0b3AoaWVlZSk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmKGllZWUtPnN0YXJ0X3NlbmRfYmVhY29ucykKKwkJaWVlZS0+c3RhcnRfc2VuZF9iZWFjb25zKGllZWUtPmRldixpZWVlLT5iYXNpY19yYXRlKTsKKwlpZihpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0JFQUNPTlMpCisJCWllZWU4MDIxMV9iZWFjb25zX3N0YXJ0KGllZWUpOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworLy8JdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8vaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOworCisJZG93bigmaWVlZS0+c2Nhbl9zZW0pOworLy8Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmIChpZWVlLT5zY2FubmluZyA9PSAxKXsKKwkJaWVlZS0+c2Nhbm5pbmcgPSAwOworCisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPnNvZnRtYWNfc2Nhbl93cSk7CisJfQorCisvLwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJdXAoJmllZWUtPnNjYW5fc2VtKTsKK30KKwordm9pZCBpZWVlODAyMTFfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4pCisJCWllZWU4MDIxMV9zb2Z0bWFjX3N0b3Bfc2NhbihpZWVlKTsKKwllbHNlCisJCWllZWUtPnN0b3Bfc2NhbihpZWVlLT5kZXYpOworfQorCisvKiBjYWxsZWQgd2l0aCBpZWVlLT5sb2NrIGhlbGQgKi8KK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgKQorCXsKKwkJaWYoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKKwkJeworCQkJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOworCQl9CisJfQorI2VuZGlmCisJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTil7CisJCWlmIChpZWVlLT5zY2FubmluZyA9PSAwKXsKKwkJCWllZWUtPnNjYW5uaW5nID0gMTsKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwgMCk7CisJCX0KKwl9ZWxzZQorCQlpZWVlLT5zdGFydF9zY2FuKGllZWUtPmRldik7CisKK30KKworLyogY2FsbGVkIHdpdGggd3hfc2VtIGhlbGQgKi8KK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpICkKKwl7CisJCWlmKElTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCisJCXsKKwkJCVJFU0VUX0NJRV9XQVRDSERPRyhpZWVlKTsKKwkJfQorCX0KKyNlbmRpZgorCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMDsKKwlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TQ0FOKQorCQlpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybyhpZWVlKTsKKwllbHNlCisJCWllZWUtPnNjYW5fc3luY3JvKGllZWUtPmRldik7CisKK30KKworaW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfYXV0aGVudGljYXRpb25fcmVxKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uLAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgY2hhbGxlbmdlbGVuKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqYXV0aDsKKwlpbnQgbGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pICsgY2hhbGxlbmdlbGVuICsgaWVlZS0+dHhfaGVhZHJvb207CisKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKwlpZiAoIXNrYikgcmV0dXJuIE5VTEw7CisKKwlza2JfcmVzZXJ2ZShza2IsIGllZWUtPnR4X2hlYWRyb29tKTsKKwlhdXRoID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKikKKwkJc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSk7CisKKwlhdXRoLT5oZWFkZXIuZnJhbWVfY3RsID0gSUVFRTgwMjExX1NUWVBFX0FVVEg7CisJaWYgKGNoYWxsZW5nZWxlbikgYXV0aC0+aGVhZGVyLmZyYW1lX2N0bCB8PSBJRUVFODAyMTFfRkNUTF9XRVA7CisKKwlhdXRoLT5oZWFkZXIuZHVyYXRpb25faWQgPSAweDAxM2E7IC8vRklYTUUKKworCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjEsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKKwltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMywgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOworCisJLy9hdXRoLT5hbGdvcml0aG0gPSBpZWVlLT5vcGVuX3dlcCA/IFdMQU5fQVVUSF9PUEVOIDogV0xBTl9BVVRIX1NIQVJFRF9LRVk7CisJaWYoaWVlZS0+YXV0aF9tb2RlID09IDApCisJCWF1dGgtPmFsZ29yaXRobSA9IFdMQU5fQVVUSF9PUEVOOworCWVsc2UgaWYoaWVlZS0+YXV0aF9tb2RlID09IDEpCisJCWF1dGgtPmFsZ29yaXRobSA9IFdMQU5fQVVUSF9TSEFSRURfS0VZOworCWVsc2UgaWYoaWVlZS0+YXV0aF9tb2RlID09IDIpCisJCWF1dGgtPmFsZ29yaXRobSA9IFdMQU5fQVVUSF9PUEVOOy8vMHg4MDsKKwlwcmludGsoIj09PT09PT09PT09PT09PT09PiVzKCk6YXV0aC0+YWxnb3JpdGhtIGlzICVkXG4iLF9fRlVOQ1RJT05fXyxhdXRoLT5hbGdvcml0aG0pOworCWF1dGgtPnRyYW5zYWN0aW9uID0gY3B1X3RvX2xlMTYoaWVlZS0+YXNzb2NpYXRlX3NlcSk7CisJaWVlZS0+YXNzb2NpYXRlX3NlcSsrOworCisJYXV0aC0+c3RhdHVzID0gY3B1X3RvX2xlMTYoV0xBTl9TVEFUVVNfU1VDQ0VTUyk7CisKKwlyZXR1cm4gc2tiOworCit9CisKKworc3RhdGljIHN0cnVjdCBza19idWZmKiBpZWVlODAyMTFfcHJvYmVfcmVzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRlc3QpCit7CisJdTggKnRhZzsKKwlpbnQgYmVhY29uX3NpemU7CisJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqYmVhY29uX2J1ZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlpbnQgZW5jcnlwdDsKKwlpbnQgYXRpbV9sZW4sZXJwX2xlbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0OworCisJY2hhciAqc3NpZCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkOworCWludCBzc2lkX2xlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbjsKKwlpbnQgcmF0ZV9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfbGVuKzI7CisJaW50IHJhdGVfZXhfbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbjsKKwlpbnQgd3BhX2llX2xlbiA9IGllZWUtPndwYV9pZV9sZW47CisJdTggZXJwaW5mb19jb250ZW50ID0gMDsKKworCXU4KiB0bXBfaHRfY2FwX2J1ZjsKKwl1OCB0bXBfaHRfY2FwX2xlbj0wOworCXU4KiB0bXBfaHRfaW5mb19idWY7CisJdTggdG1wX2h0X2luZm9fbGVuPTA7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwl1OCogdG1wX2dlbmVyaWNfaWVfYnVmPU5VTEw7CisJdTggdG1wX2dlbmVyaWNfaWVfbGVuPTA7CisKKwlpZihyYXRlX2V4X2xlbiA+IDApIHJhdGVfZXhfbGVuKz0yOworCisJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykKKwkJYXRpbV9sZW4gPSA0OworCWVsc2UKKwkJYXRpbV9sZW4gPSAwOworCisJaWYoaWVlZTgwMjExX2lzXzU0ZyhpZWVlLT5jdXJyZW50X25ldHdvcmspKQorCQllcnBfbGVuID0gMzsKKwllbHNlCisJCWVycF9sZW4gPSAwOworCisKKwljcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07CisKKworCWVuY3J5cHQgPSBpZWVlLT5ob3N0X2VuY3J5cHQgJiYgY3J5cHQgJiYgY3J5cHQtPm9wcyAmJgorCQkoKDAgPT0gc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJXRVAiKSB8fCB3cGFfaWVfbGVuKSk7CisJLy9IVCByYWxhdGVkIGVsZW1lbnQKKwl0bXBfaHRfY2FwX2J1ZiA9KHU4KikgJihpZWVlLT5wSFRJbmZvLT5TZWxmSFRDYXApOworCXRtcF9odF9jYXBfbGVuID0gc2l6ZW9mKGllZWUtPnBIVEluZm8tPlNlbGZIVENhcCk7CisJdG1wX2h0X2luZm9fYnVmID0odTgqKSAmKGllZWUtPnBIVEluZm8tPlNlbGZIVEluZm8pOworCXRtcF9odF9pbmZvX2xlbiA9IHNpemVvZihpZWVlLT5wSFRJbmZvLT5TZWxmSFRJbmZvKTsKKwlIVENvbnN0cnVjdENhcGFiaWxpdHlFbGVtZW50KGllZWUsIHRtcF9odF9jYXBfYnVmLCAmdG1wX2h0X2NhcF9sZW4sZW5jcnlwdCk7CisJSFRDb25zdHJ1Y3RJbmZvRWxlbWVudChpZWVlLHRtcF9odF9pbmZvX2J1ZiwmdG1wX2h0X2luZm9fbGVuLCBlbmNyeXB0KTsKKworCisJaWYocEhUSW5mby0+YlJlZ1JUMlJUQWdncmVnYXRpb24pCisJeworCQl0bXBfZ2VuZXJpY19pZV9idWYgPSBpZWVlLT5wSFRJbmZvLT5zelJUMlJUQWdnQnVmZmVyOworCQl0bXBfZ2VuZXJpY19pZV9sZW4gPSBzaXplb2YoaWVlZS0+cEhUSW5mby0+c3pSVDJSVEFnZ0J1ZmZlcik7CisJCUhUQ29uc3RydWN0UlQyUlRBZ2dFbGVtZW50KGllZWUsIHRtcF9nZW5lcmljX2llX2J1ZiwgJnRtcF9nZW5lcmljX2llX2xlbik7CisJfQorLy8JcHJpbnRrKCI9PT09PT09PT09PT09PT0+dG1wX2h0X2NhcF9sZW4gaXMgJWQsdG1wX2h0X2luZm9fbGVuIGlzICVkLCB0bXBfZ2VuZXJpY19pZV9sZW4gaXMgJWRcbiIsdG1wX2h0X2NhcF9sZW4sdG1wX2h0X2luZm9fbGVuLHRtcF9nZW5lcmljX2llX2xlbik7CisJYmVhY29uX3NpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSkrMisKKwkJc3NpZF9sZW4KKwkJKzMgLy9jaGFubmVsCisJCStyYXRlX2xlbgorCQkrcmF0ZV9leF9sZW4KKwkJK2F0aW1fbGVuCisJCStlcnBfbGVuCisJCSt3cGFfaWVfbGVuCisJLy8JK3RtcF9odF9jYXBfbGVuCisJLy8JK3RtcF9odF9pbmZvX2xlbgorCS8vCSt0bXBfZ2VuZXJpY19pZV9sZW4KKy8vCQkrd21tX2xlbisyCisJCStpZWVlLT50eF9oZWFkcm9vbTsKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGJlYWNvbl9zaXplKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisJc2tiX3Jlc2VydmUoc2tiLCBpZWVlLT50eF9oZWFkcm9vbSk7CisJYmVhY29uX2J1ZiA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlKikgc2tiX3B1dChza2IsIChiZWFjb25fc2l6ZSAtIGllZWUtPnR4X2hlYWRyb29tKSk7CisJbWVtY3B5IChiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjEsIGRlc3QsRVRIX0FMRU4pOworCW1lbWNweSAoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5IChiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjMsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCisJYmVhY29uX2J1Zi0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMDsgLy9GSVhNRQorCWJlYWNvbl9idWYtPmJlYWNvbl9pbnRlcnZhbCA9CisJCWNwdV90b19sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwpOworCWJlYWNvbl9idWYtPmNhcGFiaWxpdHkgPQorCQljcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKTsKKwliZWFjb25fYnVmLT5jYXBhYmlsaXR5IHw9CisJCWNwdV90b19sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKTsgLy9hZGQgc2hvcnQgcHJlYW1ibGUgaGVyZQorCisJaWYoaWVlZS0+c2hvcnRfc2xvdCAmJiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCkpCisJCWNwdV90b19sZTE2KChiZWFjb25fYnVmLT5jYXBhYmlsaXR5IHw9IFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKSk7CisKKwljcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07CisJaWYgKGVuY3J5cHQpCisJCWJlYWNvbl9idWYtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpOworCisKKwliZWFjb25fYnVmLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1ApOworCWJlYWNvbl9idWYtPmluZm9fZWxlbWVudFswXS5pZCA9IE1GSUVfVFlQRV9TU0lEOworCWJlYWNvbl9idWYtPmluZm9fZWxlbWVudFswXS5sZW4gPSBzc2lkX2xlbjsKKworCXRhZyA9ICh1OCopIGJlYWNvbl9idWYtPmluZm9fZWxlbWVudFswXS5kYXRhOworCisJbWVtY3B5KHRhZywgc3NpZCwgc3NpZF9sZW4pOworCisJdGFnICs9IHNzaWRfbGVuOworCisJKih0YWcrKykgPSBNRklFX1RZUEVfUkFURVM7CisJKih0YWcrKykgPSByYXRlX2xlbi0yOworCW1lbWNweSh0YWcsaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzLHJhdGVfbGVuLTIpOworCXRhZys9cmF0ZV9sZW4tMjsKKworCSoodGFnKyspID0gTUZJRV9UWVBFX0RTX1NFVDsKKwkqKHRhZysrKSA9IDE7CisJKih0YWcrKykgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbDsKKworCWlmKGF0aW1fbGVuKXsKKwl1MTYgdmFsMTY7CisJCSoodGFnKyspID0gTUZJRV9UWVBFX0lCU1NfU0VUOworCQkqKHRhZysrKSA9IDI7CisJCS8vKigodTE2KikodGFnKSkgPSBjcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuYXRpbV93aW5kb3cpOworCQkgdmFsMTYgPSBjcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuYXRpbV93aW5kb3cpOworCQltZW1jcHkoKHU4ICopdGFnLCAodTggKikmdmFsMTYsIDIpOworCQl0YWcrPTI7CisJfQorCisJaWYoZXJwX2xlbil7CisJCSoodGFnKyspID0gTUZJRV9UWVBFX0VSUDsKKwkJKih0YWcrKykgPSAxOworCQkqKHRhZysrKSA9IGVycGluZm9fY29udGVudDsKKwl9CisJaWYocmF0ZV9leF9sZW4peworCQkqKHRhZysrKSA9IE1GSUVfVFlQRV9SQVRFU19FWDsKKwkJKih0YWcrKykgPSByYXRlX2V4X2xlbi0yOworCQltZW1jcHkodGFnLGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leCxyYXRlX2V4X2xlbi0yKTsKKwkJdGFnKz1yYXRlX2V4X2xlbi0yOworCX0KKworCWlmICh3cGFfaWVfbGVuKQorCXsKKwkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwkJey8vYXMgV2luZG93cyB3aWxsIHNldCBwYWlyd2lzZSBrZXkgc2FtZSBhcyB0aGUgZ3JvdXAga2V5IHdoaWNoIGlzIG5vdCBhbGxvd2VkIGluIExpbnV4LCBzbyBzZXQgdGhpcyBmb3IgSU9UIGlzc3VlLiBXQiAyMDA4LjA3LjA3CisJCQltZW1jcHkoJmllZWUtPndwYV9pZVsxNF0sICZpZWVlLT53cGFfaWVbOF0sIDQpOworCQl9CisJCW1lbWNweSh0YWcsIGllZWUtPndwYV9pZSwgaWVlZS0+d3BhX2llX2xlbik7CisJCXRhZyArPSB3cGFfaWVfbGVuOworCX0KKworCS8vc2tiLT5kZXYgPSBpZWVlLT5kZXY7CisJcmV0dXJuIHNrYjsKK30KKworCitzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX2Fzc29jX3Jlc3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkZXN0KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdTgqIHRhZzsKKworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSogY3J5cHQ7CisJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqYXNzb2M7CisJc2hvcnQgZW5jcnlwdDsKKworCXVuc2lnbmVkIGludCByYXRlX2xlbiA9IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKGllZWUpOworCWludCBsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSkgKyByYXRlX2xlbiArIGllZWUtPnR4X2hlYWRyb29tOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJc2tiX3Jlc2VydmUoc2tiLCBpZWVlLT50eF9oZWFkcm9vbSk7CisKKwlhc3NvYyA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICopCisJCXNrYl9wdXQoc2tiLHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSk7CisKKwlhc3NvYy0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQKTsKKwltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMSwgZGVzdCxFVEhfQUxFTik7CisJbWVtY3B5KGFzc29jLT5oZWFkZXIuYWRkcjMsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCWFzc29jLT5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiA/CisJCVdMQU5fQ0FQQUJJTElUWV9CU1MgOiBXTEFOX0NBUEFCSUxJVFlfSUJTUyk7CisKKworCWlmKGllZWUtPnNob3J0X3Nsb3QpCisJCWFzc29jLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKTsKKworCWlmIChpZWVlLT5ob3N0X2VuY3J5cHQpCisJCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKwllbHNlIGNyeXB0ID0gTlVMTDsKKworCWVuY3J5cHQgPSAoIGNyeXB0ICYmIGNyeXB0LT5vcHMpOworCisJaWYgKGVuY3J5cHQpCisJCWFzc29jLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKTsKKworCWFzc29jLT5zdGF0dXMgPSAwOworCWFzc29jLT5haWQgPSBjcHVfdG9fbGUxNihpZWVlLT5hc3NvY19pZCk7CisJaWYgKGllZWUtPmFzc29jX2lkID09IDB4MjAwNykgaWVlZS0+YXNzb2NfaWQ9MDsKKwllbHNlIGllZWUtPmFzc29jX2lkKys7CisKKwl0YWcgPSAodTgqKSBza2JfcHV0KHNrYiwgcmF0ZV9sZW4pOworCisJaWVlZTgwMjExX01GSUVfQnJhdGUoaWVlZSwgJnRhZyk7CisJaWVlZTgwMjExX01GSUVfR3JhdGUoaWVlZSwgJnRhZyk7CisKKwlyZXR1cm4gc2tiOworfQorCitzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX2F1dGhfcmVzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSxpbnQgc3RhdHVzLCB1OCAqZGVzdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKmF1dGg7CisJaW50IGxlbiA9IGllZWUtPnR4X2hlYWRyb29tICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pKzE7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7CisKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlza2ItPmxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKTsKKworCWF1dGggPSAoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqKXNrYi0+ZGF0YTsKKworCWF1dGgtPnN0YXR1cyA9IGNwdV90b19sZTE2KHN0YXR1cyk7CisJYXV0aC0+dHJhbnNhY3Rpb24gPSBjcHVfdG9fbGUxNigyKTsKKwlhdXRoLT5hbGdvcml0aG0gPSBjcHVfdG9fbGUxNihXTEFOX0FVVEhfT1BFTik7CisKKwltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIzLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjEsIGRlc3QsIEVUSF9BTEVOKTsKKwlhdXRoLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FVVEgpOworCXJldHVybiBza2I7CisKKworfQorCitzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX251bGxfZnVuYyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSxzaG9ydCBwd3IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciogaGRyOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciopc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CisKKwltZW1jcHkoaGRyLT5hZGRyMSwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGhkci0+YWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoaGRyLT5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisKKwloZHItPmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwKKwkJSUVFRTgwMjExX1NUWVBFX05VTExGVU5DIHwgSUVFRTgwMjExX0ZDVExfVE9EUyB8CisJCShwd3IgPyBJRUVFODAyMTFfRkNUTF9QTTowKSk7CisKKwlyZXR1cm4gc2tiOworCisKK30KKworCit2b2lkIGllZWU4MDIxMV9yZXNwX3RvX2Fzc29jX3JxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCogZGVzdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX2Fzc29jX3Jlc3AoaWVlZSwgZGVzdCk7CisKKwlpZiAoYnVmKQorCQlzb2Z0bWFjX21nbXRfeG1pdChidWYsIGllZWUpOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3Jlc3BfdG9fYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IHMsIHU4KiBkZXN0KQoreworCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfYXV0aF9yZXNwKGllZWUsIHMsIGRlc3QpOworCisJaWYgKGJ1ZikKKwkJc29mdG1hY19tZ210X3htaXQoYnVmLCBpZWVlKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9yZXNwX3RvX3Byb2JlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCkKK3sKKworCisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGllZWU4MDIxMV9wcm9iZV9yZXNwKGllZWUsIGRlc3QpOworCWlmIChidWYpCisJCXNvZnRtYWNfbWdtdF94bWl0KGJ1ZiwgaWVlZSk7Cit9CisKKworaW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uLHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJLy91bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lICpoZHI7CisJdTggKnRhZzsvLywqcnNuX2llOworCS8vc2hvcnQgaW5mb19hZGRyID0gMDsKKwkvL2ludCBpOworCS8vdTE2IHN1aXRlX2NvdW50ID0gMDsKKwkvL3U4IHN1aXRfc2VsZWN0ID0gMDsKKwkvL3Vuc2lnbmVkIGludCB3cGFfbGVuID0gYmVhY29uLT53cGFfaWVfbGVuOworCS8vZm9yIEhUCisJdTgqIGh0X2NhcF9idWYgPSBOVUxMOworCXU4IGh0X2NhcF9sZW49MDsKKwl1OCogcmVhbHRla19pZV9idWY9TlVMTDsKKwl1OCByZWFsdGVrX2llX2xlbj0wOworCWludCB3cGFfaWVfbGVuPSBpZWVlLT53cGFfaWVfbGVuOworCXVuc2lnbmVkIGludCBja2lwX2llX2xlbj0wOworCXVuc2lnbmVkIGludCBjY3hybV9pZV9sZW49MDsKKwl1bnNpZ25lZCBpbnQgY3h2ZXJudW1faWVfbGVuPTA7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdDsKKwlpbnQgZW5jcnlwdDsKKworCXVuc2lnbmVkIGludCByYXRlX2xlbiA9IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKGllZWUpOworCXVuc2lnbmVkIGludCB3bW1faW5mb19sZW4gPSBiZWFjb24tPnFvc19kYXRhLnN1cHBvcnRlZD85OjA7CisjaWZkZWYgVEhPTUFTX1RVUkJPCisJdW5zaWduZWQgaW50IHR1cmJvX2luZm9fbGVuID0gYmVhY29uLT5UdXJib19FbmFibGU/OTowOworI2VuZGlmCisKKwlpbnQgbGVuID0gMDsKKworCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKwllbmNyeXB0ID0gaWVlZS0+aG9zdF9lbmNyeXB0ICYmIGNyeXB0ICYmIGNyeXB0LT5vcHMgJiYgKCgwID09IHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCJXRVAiKSB8fCB3cGFfaWVfbGVuKSk7CisKKwkvL0luY2x1ZGUgSGlnaCBUaHJvdXB1dCBjYXBhYmlsaXR5ICYmIFJlYWx0ZWsgcHJvcHJpZXRhcnkKKwlpZihpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCYmaWVlZS0+cEhUSW5mby0+YkVuYWJsZUhUKQorCXsKKwkJaHRfY2FwX2J1ZiA9ICh1OCopJihpZWVlLT5wSFRJbmZvLT5TZWxmSFRDYXApOworCQlodF9jYXBfbGVuID0gc2l6ZW9mKGllZWUtPnBIVEluZm8tPlNlbGZIVENhcCk7CisJCUhUQ29uc3RydWN0Q2FwYWJpbGl0eUVsZW1lbnQoaWVlZSwgaHRfY2FwX2J1ZiwgJmh0X2NhcF9sZW4sIGVuY3J5cHQpOworCQlpZihpZWVlLT5wSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24pCisJCXsKKwkJCXJlYWx0ZWtfaWVfYnVmID0gaWVlZS0+cEhUSW5mby0+c3pSVDJSVEFnZ0J1ZmZlcjsKKwkJCXJlYWx0ZWtfaWVfbGVuID0gc2l6ZW9mKCBpZWVlLT5wSFRJbmZvLT5zelJUMlJUQWdnQnVmZmVyKTsKKwkJCUhUQ29uc3RydWN0UlQyUlRBZ2dFbGVtZW50KGllZWUsIHJlYWx0ZWtfaWVfYnVmLCAmcmVhbHRla19pZV9sZW4pOworCisJCX0KKwl9CisJaWYoaWVlZS0+cW9zX3N1cHBvcnQpeworCQl3bW1faW5mb19sZW4gPSBiZWFjb24tPnFvc19kYXRhLnN1cHBvcnRlZD85OjA7CisJfQorCisKKwlpZihiZWFjb24tPmJDa2lwU3VwcG9ydGVkKQorCXsKKwkJY2tpcF9pZV9sZW4gPSAzMCsyOworCX0KKwlpZihiZWFjb24tPmJDY3hSbUVuYWJsZSkKKwl7CisJCWNjeHJtX2llX2xlbiA9IDYrMjsKKwl9CisJaWYoIGJlYWNvbi0+QnNzQ2N4VmVyTnVtYmVyID49IDIgKQorCXsKKwkJY3h2ZXJudW1faWVfbGVuID0gNSsyOworCX0KKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwlsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lKSsgMgorCQkrIGJlYWNvbi0+c3NpZF9sZW4vL2Vzc2lkIHRhZ2dlZCB2YWwKKwkJKyByYXRlX2xlbi8vcmF0ZXMgdGFnZ2VkIHZhbAorCQkrIHdwYV9pZV9sZW4KKwkJKyB3bW1faW5mb19sZW4KKwkJKyB0dXJib19pbmZvX2xlbgorCQkrIGh0X2NhcF9sZW4KKwkJKyByZWFsdGVrX2llX2xlbgorCQkrIGNraXBfaWVfbGVuCisJCSsgY2N4cm1faWVfbGVuCisJCSsgY3h2ZXJudW1faWVfbGVuCisJCSsgaWVlZS0+dHhfaGVhZHJvb207CisjZWxzZQorCWxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUpKyAyCisJCSsgYmVhY29uLT5zc2lkX2xlbi8vZXNzaWQgdGFnZ2VkIHZhbAorCQkrIHJhdGVfbGVuLy9yYXRlcyB0YWdnZWQgdmFsCisJCSsgd3BhX2llX2xlbgorCQkrIHdtbV9pbmZvX2xlbgorCQkrIGh0X2NhcF9sZW4KKwkJKyByZWFsdGVrX2llX2xlbgorCQkrIGNraXBfaWVfbGVuCisJCSsgY2N4cm1faWVfbGVuCisJCSsgY3h2ZXJudW1faWVfbGVuCisJCSsgaWVlZS0+dHhfaGVhZHJvb207CisjZW5kaWYKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCXNrYl9yZXNlcnZlKHNrYiwgaWVlZS0+dHhfaGVhZHJvb20pOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSAqKQorCQlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSkrMik7CisKKworCWhkci0+aGVhZGVyLmZyYW1lX2N0bCA9IElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVE7CisJaGRyLT5oZWFkZXIuZHVyYXRpb25faWQ9IDM3OyAvL0ZJWE1FCisJbWVtY3B5KGhkci0+aGVhZGVyLmFkZHIxLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGhkci0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGhkci0+aGVhZGVyLmFkZHIzLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CisKKwltZW1jcHkoaWVlZS0+YXBfbWFjX2FkZHIsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsvL2ZvciBIVyBzZWN1cml0eSwgSm9obgorCisJaGRyLT5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX0JTUyk7CisJaWYgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZICkKKwkJaGRyLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKTsKKworCWlmIChiZWFjb24tPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpCisJCWhkci0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpOyAvL2FkZCBzaG9ydF9wcmVhbWJsZSBoZXJlCisKKwlpZihpZWVlLT5zaG9ydF9zbG90KQorCQloZHItPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpOworCWlmICh3bW1faW5mb19sZW4pIC8vUU9TCisJaGRyLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9RT1MpOworCisJaGRyLT5saXN0ZW5faW50ZXJ2YWwgPSAweGE7IC8vRklYTUUKKworCWhkci0+aW5mb19lbGVtZW50WzBdLmlkID0gTUZJRV9UWVBFX1NTSUQ7CisKKwloZHItPmluZm9fZWxlbWVudFswXS5sZW4gPSBiZWFjb24tPnNzaWRfbGVuOworCXRhZyA9IHNrYl9wdXQoc2tiLCBiZWFjb24tPnNzaWRfbGVuKTsKKwltZW1jcHkodGFnLCBiZWFjb24tPnNzaWQsIGJlYWNvbi0+c3NpZF9sZW4pOworCisJdGFnID0gc2tiX3B1dChza2IsIHJhdGVfbGVuKTsKKworCWllZWU4MDIxMV9NRklFX0JyYXRlKGllZWUsICZ0YWcpOworCWllZWU4MDIxMV9NRklFX0dyYXRlKGllZWUsICZ0YWcpOworCS8vIEZvciBDQ1ggMSBTMTMsIENLSVAuIEFkZGVkIGJ5IEFubmllLCAyMDA2LTA4LTE0LgorCWlmKCBiZWFjb24tPmJDa2lwU3VwcG9ydGVkICkKKwl7CisJCXN0YXRpYyB1OAlBaXJvbmV0SWVPdWlbXSA9IHsweDAwLCAweDAxLCAweDY2fTsgLy8gIjQ1MDAtY2xpZW50IgorCQl1OAlDY3hBaXJvbmV0QnVmWzMwXTsKKwkJT0NURVRfU1RSSU5HCW9zQ2N4QWlyb25ldElFOworCisJCW1lbXNldChDY3hBaXJvbmV0QnVmLCAwLDMwKTsKKwkJb3NDY3hBaXJvbmV0SUUuT2N0ZXQgPSBDY3hBaXJvbmV0QnVmOworCQlvc0NjeEFpcm9uZXRJRS5MZW5ndGggPSBzaXplb2YoQ2N4QWlyb25ldEJ1Zik7CisJCS8vCisJCS8vIFJlZi4gQ0NYIHRlc3QgcGxhbiB2My42MSwgMy4yLjMuMSBzdGVwIDEzLgorCQkvLyBXZSB3YW50IHRvIG1ha2UgdGhlIGRldmljZSB0eXBlIGFzICI0NTAwLWNsaWVudCIuIDA2MDkyNiwgYnkgQ0NXLgorCQkvLworCQltZW1jcHkob3NDY3hBaXJvbmV0SUUuT2N0ZXQsIEFpcm9uZXRJZU91aSwgc2l6ZW9mKEFpcm9uZXRJZU91aSkpOworCisJCS8vIENDWDEgc3BlYyBWMS4xMywgQTAxLjEgQ0tJUCBOZWdvdGlhdGlvbiAocGFnZTIzKToKKwkJLy8gIlRoZSBDS0lQIG5lZ290aWF0aW9uIGlzIHN0YXJ0ZWQgd2l0aCB0aGUgYXNzb2NpYXRlIHJlcXVlc3QgZnJvbSB0aGUgY2xpZW50IHRvIHRoZSBhY2Nlc3MgcG9pbnQsCisJCS8vICBjb250YWluaW5nIGFuIEFpcm9uZXQgZWxlbWVudCB3aXRoIGJvdGggdGhlIE1JQyBhbmQgS1AgYml0cyBzZXQuIgorCQlvc0NjeEFpcm9uZXRJRS5PY3RldFtJRV9DSVNDT19GTEFHX1BPU0lUSU9OXSB8PSAgKFNVUFBPUlRfQ0tJUF9QS3xTVVBQT1JUX0NLSVBfTUlDKSA7CisJCXRhZyA9IHNrYl9wdXQoc2tiLCBja2lwX2llX2xlbik7CisJCSp0YWcrKyA9IE1GSUVfVFlQRV9BSVJPTkVUOworCQkqdGFnKysgPSBvc0NjeEFpcm9uZXRJRS5MZW5ndGg7CisJCW1lbWNweSh0YWcsb3NDY3hBaXJvbmV0SUUuT2N0ZXQsb3NDY3hBaXJvbmV0SUUuTGVuZ3RoKTsKKwkJdGFnICs9IG9zQ2N4QWlyb25ldElFLkxlbmd0aDsKKwl9CisKKwlpZihiZWFjb24tPmJDY3hSbUVuYWJsZSkKKwl7CisJCXN0YXRpYyB1OCBDY3hSbUNhcEJ1ZltdID0gezB4MDAsIDB4NDAsIDB4OTYsIDB4MDEsIDB4MDEsIDB4MDB9OworCQlPQ1RFVF9TVFJJTkcgb3NDY3hSbUNhcDsKKworCQlvc0NjeFJtQ2FwLk9jdGV0ID0gQ2N4Um1DYXBCdWY7CisJCW9zQ2N4Um1DYXAuTGVuZ3RoID0gc2l6ZW9mKENjeFJtQ2FwQnVmKTsKKwkJdGFnID0gc2tiX3B1dChza2IsY2N4cm1faWVfbGVuKTsKKwkJKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7CisJCSp0YWcrKyA9IG9zQ2N4Um1DYXAuTGVuZ3RoOworCQltZW1jcHkodGFnLG9zQ2N4Um1DYXAuT2N0ZXQsb3NDY3hSbUNhcC5MZW5ndGgpOworCQl0YWcgKz0gb3NDY3hSbUNhcC5MZW5ndGg7CisJfQorCisJaWYoIGJlYWNvbi0+QnNzQ2N4VmVyTnVtYmVyID49IDIgKQorCXsKKwkJdTgJCQlDY3hWZXJOdW1CdWZbXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDAzLCAweDAwfTsKKwkJT0NURVRfU1RSSU5HCW9zQ2N4VmVyTnVtOworCQlDY3hWZXJOdW1CdWZbNF0gPSBiZWFjb24tPkJzc0NjeFZlck51bWJlcjsKKwkJb3NDY3hWZXJOdW0uT2N0ZXQgPSBDY3hWZXJOdW1CdWY7CisJCW9zQ2N4VmVyTnVtLkxlbmd0aCA9IHNpemVvZihDY3hWZXJOdW1CdWYpOworCQl0YWcgPSBza2JfcHV0KHNrYixjeHZlcm51bV9pZV9sZW4pOworCQkqdGFnKysgPSBNRklFX1RZUEVfR0VORVJJQzsKKwkJKnRhZysrID0gb3NDY3hWZXJOdW0uTGVuZ3RoOworCQltZW1jcHkodGFnLG9zQ2N4VmVyTnVtLk9jdGV0LG9zQ2N4VmVyTnVtLkxlbmd0aCk7CisJCXRhZyArPSBvc0NjeFZlck51bS5MZW5ndGg7CisJfQorCS8vSFQgY2FwIGVsZW1lbnQKKwlpZihpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCYmaWVlZS0+cEhUSW5mby0+YkVuYWJsZUhUKXsKKwkJaWYoaWVlZS0+cEhUSW5mby0+ZVBlZXJIVFNwZWNWZXIgIT0gSFRfU1BFQ19WRVJfRVdDKQorCQl7CisJCQl0YWcgPSBza2JfcHV0KHNrYiwgaHRfY2FwX2xlbik7CisJCQkqdGFnKysgPSBNRklFX1RZUEVfSFRfQ0FQOworCQkJKnRhZysrID0gaHRfY2FwX2xlbiAtIDI7CisJCQltZW1jcHkodGFnLCBodF9jYXBfYnVmLGh0X2NhcF9sZW4gLTIpOworCQkJdGFnICs9IGh0X2NhcF9sZW4gLTI7CisJCX0KKwl9CisKKworCS8vY2hvb3NlIHdoYXQgd3BhX3N1cHBsaWNhbnQgZ2l2ZXMgdG8gYXNzb2NpYXRlLgorCXRhZyA9IHNrYl9wdXQoc2tiLCB3cGFfaWVfbGVuKTsKKwlpZiAod3BhX2llX2xlbil7CisJCW1lbWNweSh0YWcsIGllZWUtPndwYV9pZSwgaWVlZS0+d3BhX2llX2xlbik7CisJfQorCisJdGFnID0gc2tiX3B1dChza2Isd21tX2luZm9fbGVuKTsKKwlpZih3bW1faW5mb19sZW4pIHsKKwkgIGllZWU4MDIxMV9XTU1fSW5mbyhpZWVlLCAmdGFnKTsKKwl9CisjaWZkZWYgVEhPTUFTX1RVUkJPCisJdGFnID0gc2tiX3B1dChza2IsdHVyYm9faW5mb19sZW4pOworCWlmKHR1cmJvX2luZm9fbGVuKSB7CisJCWllZWU4MDIxMV9UVVJCT19JbmZvKGllZWUsICZ0YWcpOworCX0KKyNlbmRpZgorCisJaWYoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQmJmllZWUtPnBIVEluZm8tPmJFbmFibGVIVCl7CisJCWlmKGllZWUtPnBIVEluZm8tPmVQZWVySFRTcGVjVmVyID09IEhUX1NQRUNfVkVSX0VXQykKKwkJeworCQkJdGFnID0gc2tiX3B1dChza2IsIGh0X2NhcF9sZW4pOworCQkJKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7CisJCQkqdGFnKysgPSBodF9jYXBfbGVuIC0gMjsKKwkJCW1lbWNweSh0YWcsIGh0X2NhcF9idWYsaHRfY2FwX2xlbiAtIDIpOworCQkJdGFnICs9IGh0X2NhcF9sZW4gLTI7CisJCX0KKworCQlpZihpZWVlLT5wSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24peworCQkJdGFnID0gc2tiX3B1dChza2IsIHJlYWx0ZWtfaWVfbGVuKTsKKwkJCSp0YWcrKyA9IE1GSUVfVFlQRV9HRU5FUklDOworCQkJKnRhZysrID0gcmVhbHRla19pZV9sZW4gLSAyOworCQkJbWVtY3B5KHRhZywgcmVhbHRla19pZV9idWYscmVhbHRla19pZV9sZW4gLTIgKTsKKwkJfQorCX0KKy8vCXByaW50aygiPD09PT09JXMoKSwgJXAsICVwXG4iLCBfX0ZVTkNUSU9OX18sIGllZWUtPmRldiwgaWVlZS0+ZGV2LT5kZXZfYWRkcik7CisvLwlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJcmV0dXJuIHNrYjsKK30KKwordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWVlZS0+YXNzb2NpYXRlX3NlcSsrOworCisJLyogZG9uJ3Qgc2NhbiwgYW5kIGF2b2lkIHRvIGhhdmUgdGhlIFJYIHBhdGggcG9zc2liaWx5CisJICogdHJ5IGFnYWluIHRvIGFzc29jaWF0ZS4gRXZlbiBkbyBub3QgcmVhY3QgdG8gQVVUSCBvcgorCSAqIEFTU09DIHJlc3BvbnNlLiBKdXN0IHdhaXQgZm9yIHRoZSByZXRyeSB3cSB0byBiZSBzY2hlZHVsZWQuCisJICogSGVyZSB3ZSB3aWxsIGNoZWNrIGlmIHRoZXJlIGFyZSBnb29kIG5ldHMgdG8gYXNzb2NpYXRlCisJICogd2l0aCwgc28gd2UgcmV0cnkgb3IganVzdCBnZXQgYmFjayB0byBOT19MSU5LIGFuZCBzY2FubmluZworCSAqLworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcpeworCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiQXV0aGVudGljYXRpb24gZmFpbGVkXG4iKTsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy5ub19hdXRoX3JzKys7CisJfWVsc2V7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJBc3NvY2lhdGlvbiBmYWlsZWRcbiIpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLm5vX2Fzc19ycysrOworCX0KKworCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HX1JFVFJZOworCisJcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxLCBcCisJCQkgICBJRUVFODAyMTFfU09GVE1BQ19BU1NPQ19SRVRSWV9USU1FKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0X2NiKHVuc2lnbmVkIGxvbmcgZGV2KQoreworCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopIGRldik7Cit9CisKKwordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJSUVFRTgwMjExX0RFQlVHX01HTVQoIlN0b3BwaW5nIHNjYW5cbiIpOworCisJaWVlZS0+c29mdG1hY19zdGF0cy50eF9hdXRoX3JxKys7CisJc2tiPWllZWU4MDIxMV9hdXRoZW50aWNhdGlvbl9yZXEoYmVhY29uLCBpZWVlLCAwKTsKKworCWlmICghc2tiKQorCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOworCWVsc2V7CisJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HIDsKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoIlNlbmRpbmcgYXV0aGVudGljYXRpb24gcmVxdWVzdFxuIik7CisJCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiU2VuZGluZyBhdXRoZW50aWNhdGlvbiByZXF1ZXN0XG4iKTsKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJLy9CVUdPTiB3aGVuIHlvdSB0cnkgdG8gYWRkX3RpbWVyIHR3aWNlLCB1c2luZyBtb2RfdGltZXIgbWF5IGJlIGJldHRlciwgam9objA3MDkKKwkJaWYoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmFzc29jaWF0ZV90aW1lcikpeworCQkJaWVlZS0+YXNzb2NpYXRlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaIC8gMik7CisJCQlhZGRfdGltZXIoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisJCX0KKwkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwl9Cit9CisKK3ZvaWQgaWVlZTgwMjExX2F1dGhfY2hhbGxlbmdlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqY2hhbGxlbmdlLCBpbnQgY2hsZW4pCit7CisJdTggKmM7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisvLwlpbnQgaGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKTsKKworCWllZWUtPmFzc29jaWF0ZV9zZXErKzsKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2F1dGhfcnErKzsKKworCXNrYiA9IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbl9yZXEoYmVhY29uLCBpZWVlLCBjaGxlbisyKTsKKwlpZiAoIXNrYikKKwkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKKwllbHNleworCQljID0gc2tiX3B1dChza2IsIGNobGVuKzIpOworCQkqKGMrKykgPSBNRklFX1RZUEVfQ0hBTExFTkdFOworCQkqKGMrKykgPSBjaGxlbjsKKwkJbWVtY3B5KGMsIGNoYWxsZW5nZSwgY2hsZW4pOworCisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJTZW5kaW5nIGF1dGhlbnRpY2F0aW9uIGNoYWxsZW5nZSByZXNwb25zZVxuIik7CisKKwkJaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoaWVlZSwgc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICkpOworCisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CisJCW1vZF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyLCBqaWZmaWVzICsgKEhaLzIpKTsKKwkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwl9CisJa2ZyZWUoY2hhbGxlbmdlKTsKK30KKwordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBza19idWZmKiBza2I7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24gPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOworCisJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisKKwlJRUVFODAyMTFfREVCVUdfTUdNVCgiU2VuZGluZyBhc3NvY2lhdGlvbiByZXF1ZXN0XG4iKTsKKworCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfYXNzX3JxKys7CisJc2tiPWllZWU4MDIxMV9hc3NvY2lhdGlvbl9yZXEoYmVhY29uLCBpZWVlKTsKKwlpZiAoIXNrYikKKwkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKKwllbHNleworCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQltb2RfdGltZXIoJmllZWUtPmFzc29jaWF0ZV90aW1lciwgamlmZmllcyArIChIWi8yKSk7CisJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJfQorfQordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgYXNzb2NpYXRlX2NvbXBsZXRlX3dxKTsKKwlwcmludGsoS0VSTl9JTkZPICJBc3NvY2lhdGVkIHN1Y2Nlc3NmdWxseVxuIik7CisJaWYoaWVlZTgwMjExX2lzXzU0ZyhpZWVlLT5jdXJyZW50X25ldHdvcmspICYmCisJCShpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikpeworCisJCWllZWUtPnJhdGUgPSAxMDg7CisJCXByaW50ayhLRVJOX0lORk8iVXNpbmcgRyByYXRlczolZFxuIiwgaWVlZS0+cmF0ZSk7CisJfWVsc2V7CisJCWllZWUtPnJhdGUgPSAyMjsKKwkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBCIHJhdGVzOiVkXG4iLCBpZWVlLT5yYXRlKTsKKwl9CisJaWYgKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0JiZpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQpCisJeworCQlwcmludGsoIlN1Y2Nlc3NmdWxseSBhc3NvY2lhdGVkLCBodCBlbmFibGVkXG4iKTsKKwkJSFRPbkFzc29jUnNwKGllZWUpOworCX0KKwllbHNlCisJeworCQlwcmludGsoIlN1Y2Nlc3NmdWxseSBhc3NvY2lhdGVkLCBodCBub3QgZW5hYmxlZCglZCwgJWQpXG4iLCBpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCwgaWVlZS0+cEhUSW5mby0+YkVuYWJsZUhUKTsKKwkJbWVtc2V0KGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIDAsIDE2KTsKKwkJLy9IVFNldENvbm5lY3RCd01vZGUoaWVlZSwgSFRfQ0hBTk5FTF9XSURUSF8yMCwgSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUKTsKKwl9CisJaWVlZS0+TGlua0RldGVjdEluZm8uU2xvdE51bSA9IDIgKiAoMSArIGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwvNTAwKTsKKwkvLyBUbyBwcmV2ZW50IHRoZSBpbW1lZGlhdGVseSBjYWxsaW5nIHdhdGNoX2RvZyBhZnRlciBhc3NvY2lhdGlvbi4KKwlpZihpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2QmNuSW5QZXJpb2Q9PTB8fGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZEYXRhSW5QZXJpb2Q9PTAgKQorCXsKKwkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kID0gMTsKKwkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZD0gMTsKKwl9CisJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKwlpZihpZWVlLT5pc19zaWxlbnRfcmVzZXQgPT0gMCl7CisJCXByaW50aygiPT09PT09PT09PT09Pm5vcm1hbCBhc3NvY2lhdGVcbiIpOworCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKKwl9CisJZWxzZSBpZihpZWVlLT5pc19zaWxlbnRfcmVzZXQgPT0gMSkKKwl7CisJCXByaW50aygiPT09PT09PT09PT09PT09PT09PnNpbGVudCByZXNldCBhc3NvY2lhdGVcbiIpOworCQlpZWVlLT5pc19zaWxlbnRfcmVzZXQgPSAwOworCX0KKworCWlmIChpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKQorCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworfQorCit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisvLwlpbnQgaTsKKy8vCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYgPSBpZWVlLT5kZXY7CisJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisKKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRUQ7CisJLy9pZWVlLT5VcGRhdGVIYWxSQVRSVGFibGVIYW5kbGVyKGRldiwgaWVlZS0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCk7CisJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9wcm9jZWR1cmVfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBhc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDE7CisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmIChpZWVlLT5kYXRhX2hhcmRfc3RvcCkKKwkJaWVlZS0+ZGF0YV9oYXJkX3N0b3AoaWVlZS0+ZGV2KTsKKworCWllZWU4MDIxMV9zdG9wX3NjYW4oaWVlZSk7CisJcHJpbnRrKCI9PT0+JXMoKSwgY2hhbjolZFxuIiwgX19GVU5DVElPTl9fLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisJLy9pZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwlIVFNldENvbm5lY3RCd01vZGUoaWVlZSwgSFRfQ0hBTk5FTF9XSURUSF8yMCwgSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUKTsKKworCWllZWUtPmFzc29jaWF0ZV9zZXEgPSAxOworCWllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDEoaWVlZSk7CisKKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KKworaW5saW5lIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfbmV3X25ldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQpCit7CisJdTggdG1wX3NzaWRbSVdfRVNTSURfTUFYX1NJWkUrMV07CisJaW50IHRtcF9zc2lkX2xlbiA9IDA7CisKKwlzaG9ydCBhcHNldCxzc2lkc2V0LHNzaWRicm9hZCxhcG1hdGNoLHNzaWRtYXRjaDsKKworCS8qIHdlIGFyZSBpbnRlcmVzdGVkIGluIG5ldyBuZXcgb25seSBpZiB3ZSBhcmUgbm90IGFzc29jaWF0ZWQKKwkgKiBhbmQgd2UgYXJlIG5vdCBhc3NvY2lhdGluZyAvIGF1dGhlbnRpY2F0aW5nCisJICovCisJaWYgKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9OT0xJTkspCisJCXJldHVybjsKKworCWlmICgoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSAmJiAhKG5ldC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9CU1MpKQorCQlyZXR1cm47CisKKwlpZiAoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgJiYgIShuZXQtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykpCisJCXJldHVybjsKKworCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSB8fCBpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpeworCQkvKiBpZiB0aGUgdXNlciBzcGVjaWZpZWQgdGhlIEFQIE1BQywgd2UgbmVlZCBhbHNvIHRoZSBlc3NpZAorCQkgKiBUaGlzIGNvdWxkIGJlIG9idGFpbmVkIGJ5IGJlYWNvbnMgb3IsIGlmIHRoZSBuZXR3b3JrIGRvZXMgbm90CisJCSAqIGJyb2FkY2FzdCBpdCwgaXQgY2FuIGJlIHB1dCBtYW51YWxseS4KKwkJICovCisJCWFwc2V0ID0gaWVlZS0+d2FwX3NldDsvLyhtZW1jbXAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCB6ZXJvLEVUSF9BTEVOKSE9MCApOworCQlzc2lkc2V0ID0gaWVlZS0+c3NpZF9zZXQ7Ly9pZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZFswXSAhPSAnXDAnOworCQlzc2lkYnJvYWQgPSAgIShuZXQtPnNzaWRfbGVuID09IDAgfHwgbmV0LT5zc2lkWzBdPT0gJ1wwJyk7CisJCWFwbWF0Y2ggPSAobWVtY21wKGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgbmV0LT5ic3NpZCwgRVRIX0FMRU4pPT0wKTsKKwkJc3NpZG1hdGNoID0gKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSBuZXQtPnNzaWRfbGVuKSYmXAorCQkJCSghc3RybmNtcChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgbmV0LT5zc2lkLCBuZXQtPnNzaWRfbGVuKSk7CisKKworCQlpZiAoCS8qIGlmIHRoZSB1c2VyIHNldCB0aGUgQVAgY2hlY2sgaWYgbWF0Y2guCisJCQkgKiBpZiB0aGUgbmV0d29yayBkb2VzIG5vdCBicm9hZGNhc3QgZXNzaWQgd2UgY2hlY2sgdGhlIHVzZXIgc3VwcGx5ZWQgQU5ZIGVzc2lkCisJCQkgKiBpZiB0aGUgbmV0d29yayBkb2VzIGJyb2FkY2FzdCBhbmQgdGhlIHVzZXIgZG9lcyBub3Qgc2V0IGVzc2lkIGl0IGlzIE9LCisJCQkgKiBpZiB0aGUgbmV0d29yayBkb2VzIGJyb2FkY2FzdCBhbmQgdGhlIHVzZXIgZGlkIHNldCBlc3NpZCBjaGVjaCBpZiBlc3NpZCBtYXRjaAorCQkJICovCisJCQkoIGFwc2V0ICYmIGFwbWF0Y2ggJiYKKwkJCQkoKHNzaWRzZXQgJiYgc3NpZGJyb2FkICYmIHNzaWRtYXRjaCkgfHwgKHNzaWRicm9hZCAmJiAhc3NpZHNldCkgfHwgKCFzc2lkYnJvYWQgJiYgc3NpZHNldCkpICkgfHwKKwkJCS8qIGlmIHRoZSBhcCBpcyBub3Qgc2V0LCBjaGVjayB0aGF0IHRoZSB1c2VyIHNldCB0aGUgYnNzaWQKKwkJCSAqIGFuZCB0aGUgbmV0d29yayBkb2VzIGJyYWRjYXN0IGFuZCB0aGF0IHRob3NlIHR3byBic3NpZCBtYXRjaGVzCisJCQkgKi8KKwkJCSghYXBzZXQgJiYgc3NpZHNldCAmJiBzc2lkYnJvYWQgJiYgc3NpZG1hdGNoKQorCQkJKXsKKwkJCQkvKiBpZiB0aGUgZXNzaWQgaXMgaGlkZGVuIHJlcGxhY2UgaXQgd2l0aCB0aGUKKwkJCQkqIGVzc2lkIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLgorCQkJCSovCisJCQkJaWYgKCFzc2lkYnJvYWQpeworCQkJCQlzdHJuY3B5KHRtcF9zc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgSVdfRVNTSURfTUFYX1NJWkUpOworCQkJCQl0bXBfc3NpZF9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW47CisJCQkJfQorCQkJCW1lbWNweSgmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCBuZXQsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspKTsKKworCQkJCWlmICghc3NpZGJyb2FkKXsKKwkJCQkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgdG1wX3NzaWQsIElXX0VTU0lEX01BWF9TSVpFKTsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gdG1wX3NzaWRfbGVuOworCQkJCX0KKwkJCQlwcmludGsoS0VSTl9JTkZPIkxpbmtpbmcgd2l0aCAlcyxjaGFubmVsOiVkLCBxb3M6JWQsIG15SFQ6JWQsIG5ldHdvcmtIVDolZFxuIixpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCxpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnN1cHBvcnRlZCwgaWVlZS0+cEhUSW5mby0+YkVuYWJsZUhULCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaHQuYmRTdXBwb3J0SFQpOworCisJCQkJLy9pZWVlLT5wSFRJbmZvLT5JT1RBY3Rpb24gPSAwOworCQkJCUhUUmVzZXRJT1RTZXR0aW5nKGllZWUtPnBIVEluZm8pOworCQkJCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpeworCQkJCQkvKiBKb2luIHRoZSBuZXR3b3JrIGZvciB0aGUgZmlyc3QgdGltZSAqLworCQkJCQlpZWVlLT5Bc29jUmV0cnlDb3VudCA9IDA7CisJCQkJCS8vZm9yIEhUIGJ5IGFteSAwODA1MTQKKwkJCQkJaWYoKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5zdXBwb3J0ZWQgPT0gMSkgJiYKKwkJCQkJICAvLyAoaWVlZS0+cEhUSW5mby0+YkVuYWJsZUhUICYmIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NodC5iZFN1cHBvcnRIVCkpCisJCQkJCSAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NodC5iZFN1cHBvcnRIVCkKKy8qV0IsIDIwMDguMDkuMDk6YkN1cnJlbnRIVFN1cHBvcnQgYW5kIGJFbmFibGVIVCB0d28gZmxhZ3MgYXJlIGdvaW5nIHRvIHB1dCB0b2dldGhlciB0byBjaGVjayB3aGV0aGVyIHdlIGFyZSBpbiBIVCBub3csIHNvIG5lZWRuJ3QgdG8gY2hlY2sgYkVuYWJsZUhUIGZsYWdzIGhlcmUuIFRoYXQncyBpcyB0byBzYXkgd2Ugd2lsbCBzZXQgdG8gSFQgc3VwcG9ydCB3aGVuZXZlciBqb2luZWQgQVAgaGFzIHRoZSBhYmlsaXR5IHRvIHN1cHBvcnQgSFQuIEFuZCB3aGV0aGVyIHdlIGFyZSBpbiBIVCBvciBub3QsIHBsZWFzZSBjaGVjayBiQ3VycmVudEhUU3VwcG9ydCYmYkVuYWJsZUhUIG5vdyBwbGVhc2UuKi8KKwkJCQkJeworCQkJCQkvLwlpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9IHRydWU7CisJCQkJCQlIVFJlc2V0U2VsZkFuZFNhdmVQZWVyU2V0dGluZyhpZWVlLCAmKGllZWUtPmN1cnJlbnRfbmV0d29yaykpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPSBmYWxzZTsKKwkJCQkJfQorCisJCQkJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HOworCQkJCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7CisJCQkJfWVsc2V7CisJCQkJCWlmKGllZWU4MDIxMV9pc181NGcoaWVlZS0+Y3VycmVudF9uZXR3b3JrKSAmJgorCQkJCQkJKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKSl7CisJCQkJCQlpZWVlLT5yYXRlID0gMTA4OworCQkJCQkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUtPmRldiwgSUVFRV9HKTsKKwkJCQkJCXByaW50ayhLRVJOX0lORk8iVXNpbmcgRyByYXRlc1xuIik7CisJCQkJCX1lbHNleworCQkJCQkJaWVlZS0+cmF0ZSA9IDIyOworCQkJCQkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUtPmRldiwgSUVFRV9CKTsKKwkJCQkJCXByaW50ayhLRVJOX0lORk8iVXNpbmcgQiByYXRlc1xuIik7CisJCQkJCX0KKwkJCQkJbWVtc2V0KGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIDAsIDE2KTsKKwkJCQkJLy9IVFNldENvbm5lY3RCd01vZGUoaWVlZSwgSFRfQ0hBTk5FTF9XSURUSF8yMCwgSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUKTsKKwkJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOworCQkJCX0KKworCQl9CisJfQorCit9CisKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnRhcmdldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdldCwgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgeworCisJCS8qIGlmIHRoZSBzdGF0ZSBiZWNvbWUgZGlmZmVyZW50IHRoYXQgTk9MSU5LIG1lYW5zCisJCSAqIHdlIGhhZCBmb3VuZCB3aGF0IHdlIGFyZSBzZWFyY2hpbmcgZm9yCisJCSAqLworCisJCWlmIChpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTk9MSU5LKQorCQkJYnJlYWs7CisKKwkJaWYgKGllZWUtPnNjYW5fYWdlID09IDAgfHwgdGltZV9hZnRlcih0YXJnZXQtPmxhc3Rfc2Nhbm5lZCArIGllZWUtPnNjYW5fYWdlLCBqaWZmaWVzKSkKKwkJaWVlZTgwMjExX3NvZnRtYWNfbmV3X25ldChpZWVlLCB0YXJnZXQpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworfQorCisKK3N0YXRpYyBpbmxpbmUgdTE2IGF1dGhfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTgqKiBjaGFsbGVuZ2UsIGludCAqY2hsZW4pCit7CisJc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqYTsKKwl1OCAqdDsKKwlpZiAoc2tiLT5sZW4gPCAgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKS1zaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpKSl7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlc3A6ICVkXG4iLHNrYi0+bGVuKTsKKwkJcmV0dXJuIDB4Y2FmZTsKKwl9CisJKmNoYWxsZW5nZSA9IE5VTEw7CisJYSA9IChzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKikgc2tiLT5kYXRhOworCWlmKHNrYi0+bGVuID4gKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSArMykpeworCQl0ID0gc2tiLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pOworCisJCWlmKCoodCsrKSA9PSBNRklFX1RZUEVfQ0hBTExFTkdFKXsKKwkJCSpjaGxlbiA9ICoodCsrKTsKKwkJCSpjaGFsbGVuZ2UgPSAodTgqKWttYWxsb2MoKmNobGVuLCBHRlBfQVRPTUlDKTsKKwkJCW1lbWNweSgqY2hhbGxlbmdlLCB0LCAqY2hsZW4pOworCQl9CisJfQorCisJcmV0dXJuIGNwdV90b19sZTE2KGEtPnN0YXR1cyk7CisKK30KKworCitpbnQgYXV0aF9ycV9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLHU4KiBkZXN0KQoreworCXN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKmE7CisKKwlpZiAoc2tiLT5sZW4gPCAgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKS1zaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpKSl7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlcXVlc3Q6ICVkXG4iLHNrYi0+bGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKwlhID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24qKSBza2ItPmRhdGE7CisKKwltZW1jcHkoZGVzdCxhLT5oZWFkZXIuYWRkcjIsIEVUSF9BTEVOKTsKKworCWlmIChsZTE2X3RvX2NwdShhLT5hbGdvcml0aG0pICE9IFdMQU5fQVVUSF9PUEVOKQorCQlyZXR1cm4gIFdMQU5fU1RBVFVTX05PVF9TVVBQT1JURURfQVVUSF9BTEc7CisKKwlyZXR1cm4gV0xBTl9TVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIHNob3J0IHByb2JlX3JxX3BhcnNlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqc3JjKQoreworCXU4ICp0YWc7CisJdTggKnNrYmVuZDsKKwl1OCAqc3NpZD1OVUxMOworCXU4IHNzaWRsZW4gPSAwOworCisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICAqaGVhZGVyID0KKwkJKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAgKikgc2tiLT5kYXRhOworCisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mIChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKSkKKwkJcmV0dXJuIC0xOyAvKiBjb3JydXB0ZWQgKi8KKworCW1lbWNweShzcmMsaGVhZGVyLT5hZGRyMiwgRVRIX0FMRU4pOworCisJc2tiZW5kID0gKHU4Kilza2ItPmRhdGEgKyBza2ItPmxlbjsKKworCXRhZyA9IHNrYi0+ZGF0YSArIHNpemVvZiAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICk7CisKKwl3aGlsZSAodGFnKzEgPCBza2JlbmQpeworCQlpZiAoKnRhZyA9PSAwKXsKKwkJCXNzaWQgPSB0YWcrMjsKKwkJCXNzaWRsZW4gPSAqKHRhZysxKTsKKwkJCWJyZWFrOworCQl9CisJCXRhZysrOyAvKiBwb2ludCB0byB0aGUgbGVuIGZpZWxkICovCisJCXRhZyA9IHRhZyArICoodGFnKTsgLyogcG9pbnQgdG8gdGhlIGxhc3QgZGF0YSBieXRlIG9mIHRoZSB0YWcgKi8KKwkJdGFnKys7IC8qIHBvaW50IHRvIHRoZSBuZXh0IHRhZyAqLworCX0KKworCS8vSUVFRTgwMjExRE1FU0coIkNhcmQgTUFDIGFkZHJlc3MgaXMgIk1BQ1NUUiwgTUFDMlNUUihzcmMpKTsKKwlpZiAoc3NpZGxlbiA9PSAwKSByZXR1cm4gMTsKKworCWlmICghc3NpZCkgcmV0dXJuIDE7IC8qIHNzaWQgbm90IGZvdW5kIGluIHRhZ2dlZCBwYXJhbSAqLworCXJldHVybiAoIXN0cm5jbXAoc3NpZCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIHNzaWRsZW4pKTsKKworfQorCitpbnQgYXNzb2NfcnFfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYix1OCogZGVzdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUgKmE7CisKKwlpZiAoc2tiLT5sZW4gPCAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSkgLQorCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpKSkgeworCisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlcXVlc3Q6JWQgXG4iLCBza2ItPmxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlhID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSopIHNrYi0+ZGF0YTsKKworCW1lbWNweShkZXN0LGEtPmhlYWRlci5hZGRyMixFVEhfQUxFTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1MTYgYXNzb2NfcGFyc2Uoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsIGludCAqYWlkKQoreworCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKnJlc3BvbnNlX2hlYWQ7CisJdTE2IHN0YXR1c19jb2RlOworCisJaWYgKHNrYi0+bGVuIDwgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSl7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlc3A6ICVkXG4iLCBza2ItPmxlbik7CisJCXJldHVybiAweGNhZmU7CisJfQorCisJcmVzcG9uc2VfaGVhZCA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKikgc2tiLT5kYXRhOworCSphaWQgPSBsZTE2X3RvX2NwdShyZXNwb25zZV9oZWFkLT5haWQpICYgMHgzZmZmOworCisJc3RhdHVzX2NvZGUgPSBsZTE2X3RvX2NwdShyZXNwb25zZV9oZWFkLT5zdGF0dXMpOworCWlmKChzdGF0dXNfY29kZT09V0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1JBVEVTIHx8IFwKKwkgICBzdGF0dXNfY29kZT09V0xBTl9TVEFUVVNfQ0FQU19VTlNVUFBPUlRFRCkmJgorCSAgICgoaWVlZS0+bW9kZSA9PSBJRUVFX0cpICYmCisJICAgIChpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fMjRHKSAmJgorCSAgICAoaWVlZS0+QXNvY1JldHJ5Q291bnQrKyA8IChSVF9BU09DX1JFVFJZX0xJTUlULTEpKSkpIHsKKwkJIGllZWUtPnBIVEluZm8tPklPVEFjdGlvbiB8PSBIVF9JT1RfQUNUX1BVUkVfTl9NT0RFOworCX1lbHNlIHsKKwkJIGllZWUtPkFzb2NSZXRyeUNvdW50ID0gMDsKKwl9CisKKwlyZXR1cm4gbGUxNl90b19jcHUocmVzcG9uc2VfaGVhZC0+c3RhdHVzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpZWVlODAyMTFfcnhfcHJvYmVfcnEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTggZGVzdFtFVEhfQUxFTl07CisKKwkvL0lFRUU4MDIxMURNRVNHKCJSeCBwcm9iZSIpOworCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfcHJvYmVfcnErKzsKKwkvL0RNRVNHKCJEZXN0IGlzICJNQUNTVFIsIE1BQzJTVFIoZGVzdCkpOworCWlmIChwcm9iZV9ycV9wYXJzZShpZWVlLCBza2IsIGRlc3QpKXsKKwkJLy9JRUVFODAyMTFETUVTRygiV2FzIGZvciBtZSEiKTsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9wcm9iZV9ycysrOworCQlpZWVlODAyMTFfcmVzcF90b19wcm9iZShpZWVlLCBkZXN0KTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWVlZTgwMjExX3J4X2F1dGhfcnEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTggZGVzdFtFVEhfQUxFTl07CisJaW50IHN0YXR1czsKKwkvL0lFRUU4MDIxMURNRVNHKCJSeCBwcm9iZSIpOworCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXV0aF9ycSsrOworCisJaWYgKChzdGF0dXMgPSBhdXRoX3JxX3BhcnNlKHNrYiwgZGVzdCkpIT0gLTEpeworCQlpZWVlODAyMTFfcmVzcF90b19hdXRoKGllZWUsIHN0YXR1cywgZGVzdCk7CisJfQorCS8vRE1FU0coIkRlc3QgaXMgIk1BQ1NUUiwgTUFDMlNUUihkZXN0KSk7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpZWVlODAyMTFfcnhfYXNzb2NfcnEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisKKwl1OCBkZXN0W0VUSF9BTEVOXTsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2Fzc19ycSsrOworCWlmIChhc3NvY19ycV9wYXJzZShza2IsZGVzdCkgIT0gLTEpeworCQlpZWVlODAyMTFfcmVzcF90b19hc3NvY19ycShpZWVlLCBkZXN0KTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIk5ldyBjbGllbnQgYXNzb2NpYXRlZDogIk1BQ19GTVQiXG4iLCBNQUNfQVJHKGRlc3QpKTsKKwkvL0ZJWE1FCit9CisKKworCit2b2lkIGllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBwd3IpCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX251bGxfZnVuYyhpZWVlLCBwd3IpOworCisJaWYgKGJ1ZikKKwkJc29mdG1hY19wc19tZ210X3htaXQoYnVmLCBpZWVlKTsKKworfQorCisKK3Nob3J0IGllZWU4MDIxMV9zdGFfcHNfc2xlZXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHUzMiAqdGltZV9oLCB1MzIgKnRpbWVfbCkKK3sKKwlpbnQgdGltZW91dCA9IGllZWUtPnBzX3RpbWVvdXQ7CisJdTggZHRpbTsKKwkvKmlmKGllZWUtPnBzID09IElFRUU4MDIxMV9QU19ESVNBQkxFRCB8fAorCQlpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgfHwKKwkJaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkKKworCQlyZXR1cm4gMDsKKwkqLworCWR0aW0gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9kYXRhOworCS8vcHJpbnRrKCJEVElNXG4iKTsKKwlpZighKGR0aW0gJiBJRUVFODAyMTFfRFRJTV9WQUxJRCkpCisJCXJldHVybiAwOworCXRpbWVvdXQgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsOyAvL3Nob3VsZCB3ZSB1c2UgcHNfdGltZW91dCB2YWx1ZSBvciBiZWFjb25faW50ZXJ2YWwKKwkvL3ByaW50aygiVkFMSURcbiIpOworCWllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX2RhdGEgPSBJRUVFODAyMTFfRFRJTV9JTlZBTElEOworCisJaWYoZHRpbSAmICgoSUVFRTgwMjExX0RUSU1fVUNBU1QgfCBJRUVFODAyMTFfRFRJTV9NQkNBU1QpJiBpZWVlLT5wcykpCisJCXJldHVybiAyOworCisJaWYoIXRpbWVfYWZ0ZXIoamlmZmllcywgaWVlZS0+ZGV2LT50cmFuc19zdGFydCArIE1TRUNTKHRpbWVvdXQpKSkKKwkJcmV0dXJuIDA7CisKKwlpZighdGltZV9hZnRlcihqaWZmaWVzLCBpZWVlLT5sYXN0X3J4X3BzX3RpbWUgKyBNU0VDUyh0aW1lb3V0KSkpCisJCXJldHVybiAwOworCisJaWYoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFICkgJiYKKwkJKGllZWUtPm1nbXRfcXVldWVfdGFpbCAhPSBpZWVlLT5tZ210X3F1ZXVlX2hlYWQpKQorCQlyZXR1cm4gMDsKKworCWlmKHRpbWVfbCl7CisJCSp0aW1lX2wgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsubGFzdF9kdGltX3N0YV90aW1lWzBdCisJCQkrIChpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsCisJCQkqIGllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX3BlcmlvZCkgKiAxMDAwOworCX0KKworCWlmKHRpbWVfaCl7CisJCSp0aW1lX2ggPSBpZWVlLT5jdXJyZW50X25ldHdvcmsubGFzdF9kdGltX3N0YV90aW1lWzFdOworCQlpZih0aW1lX2wgJiYgKnRpbWVfbCA8IGllZWUtPmN1cnJlbnRfbmV0d29yay5sYXN0X2R0aW1fc3RhX3RpbWVbMF0pCisJCQkqdGltZV9oICs9IDE7CisJfQorCisJcmV0dXJuIDE7CisKKworfQorCitpbmxpbmUgdm9pZCBpZWVlODAyMTFfc3RhX3BzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCisJdTMyIHRoLHRsOworCXNob3J0IHNsZWVwOworCisJdW5zaWduZWQgbG9uZyBmbGFncyxmbGFnczI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYoKGllZWUtPnBzID09IElFRUU4MDIxMV9QU19ESVNBQkxFRCB8fAorCQlpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgfHwKKwkJaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkpeworCisJLy8JI3dhcm5pbmcgQ0hFQ0tfTE9DS19IRVJFCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisKKwkJaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwgMSk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOworCX0KKworCXNsZWVwID0gaWVlZTgwMjExX3N0YV9wc19zbGVlcChpZWVlLCZ0aCwgJnRsKTsKKwkvKiAyIHdha2UsIDEgc2xlZXAsIDAgZG8gbm90aGluZyAqLworCWlmKHNsZWVwID09IDApCisJCWdvdG8gb3V0OworCisJaWYoc2xlZXAgPT0gMSl7CisKKwkJaWYoaWVlZS0+c3RhX3NsZWVwID09IDEpCisJCQlpZWVlLT5lbnRlcl9zbGVlcF9zdGF0ZShpZWVlLT5kZXYsdGgsdGwpOworCisJCWVsc2UgaWYoaWVlZS0+c3RhX3NsZWVwID09IDApeworCQkvLwlwcmludGsoInNlbmQgbnVsbCAxXG4iKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisKKwkJCWlmKGllZWUtPnBzX2lzX3F1ZXVlX2VtcHR5KGllZWUtPmRldikpeworCisKKwkJCQlpZWVlLT5zdGFfc2xlZXAgPSAyOworCisJCQkJaWVlZS0+cHNfcmVxdWVzdF90eF9hY2soaWVlZS0+ZGV2KTsKKworCQkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsMSk7CisKKwkJCQlpZWVlLT5wc190aCA9IHRoOworCQkJCWllZWUtPnBzX3RsID0gdGw7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisKKwkJfQorCisKKwl9ZWxzZSBpZihzbGVlcCA9PSAyKXsKKy8vI3dhcm5pbmcgQ0hFQ0tfTE9DS19IRVJFCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisKKwkJaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwxKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCit9CisKK3ZvaWQgaWVlZTgwMjExX3N0YV93YWtldXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IG5sKQoreworCWlmKGllZWUtPnN0YV9zbGVlcCA9PSAwKXsKKwkJaWYobmwpeworCQkJcHJpbnRrKCJXYXJuaW5nOiBkcml2ZXIgaXMgcHJvYmFibHkgZmFpbGluZyB0byByZXBvcnQgVFggcHMgZXJyb3JcbiIpOworCQkJaWVlZS0+cHNfcmVxdWVzdF90eF9hY2soaWVlZS0+ZGV2KTsKKwkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDApOworCQl9CisJCXJldHVybjsKKworCX0KKworCWlmKGllZWUtPnN0YV9zbGVlcCA9PSAxKQorCQlpZWVlLT5zdGFfd2FrZV91cChpZWVlLT5kZXYpOworCisJaWVlZS0+c3RhX3NsZWVwID0gMDsKKworCWlmKG5sKXsKKwkJaWVlZS0+cHNfcmVxdWVzdF90eF9hY2soaWVlZS0+ZGV2KTsKKwkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgMCk7CisJfQorfQorCit2b2lkIGllZWU4MDIxMV9wc190eF9hY2soc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IHN1Y2Nlc3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyxmbGFnczI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYoaWVlZS0+c3RhX3NsZWVwID09IDIpeworCQkvKiBOdWxsIGZyYW1lIHdpdGggUFMgYml0IHNldCAqLworCQlpZihzdWNjZXNzKXsKKwkJCWllZWUtPnN0YV9zbGVlcCA9IDE7CisJCQlpZWVlLT5lbnRlcl9zbGVlcF9zdGF0ZShpZWVlLT5kZXYsaWVlZS0+cHNfdGgsaWVlZS0+cHNfdGwpOworCQl9CisJCS8qIGlmIHRoZSBjYXJkIHJlcG9ydCBub3Qgc3VjY2VzcyB3ZSBjYW4ndCBiZSBzdXJlIHRoZSBBUAorCQkgKiBoYXMgbm90IFJYZWQgc28gd2UgY2FuJ3QgYXNzdW1lIHRoZSBBUCBiZWxpZXZlIHVzIGF3YWtlCisJCSAqLworCX0KKwkvKiAyMTExMjAwNSAtIHR4IGFnYWluIG51bGwgd2l0aG91dCBQUyBiaXQgaWYgbG9zdCAqLworCWVsc2UgeworCisJCWlmKChpZWVlLT5zdGFfc2xlZXAgPT0gMCkgJiYgIXN1Y2Nlc3MpeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKwkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDApOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKK30KK3ZvaWQgaWVlZTgwMjExX3Byb2Nlc3NfYWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiogc2tiKQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyKiBoZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIqKXNrYi0+ZGF0YTsKKwl1OCogYWN0ID0gaWVlZTgwMjExX2dldF9wYXlsb2FkKGhlYWRlcik7CisJdTggdG1wID0gMDsKKy8vCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBfElFRUU4MDIxMV9ETF9CQSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJaWYgKGFjdCA9PSBOVUxMKQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJlcnJvciB0byBnZXQgcGF5bG9hZCBvZiBhY3Rpb24gZnJhbWVcbiIpOworCQlyZXR1cm47CisJfQorCXRtcCA9ICphY3Q7CisJYWN0ICsrOworCXN3aXRjaCAodG1wKQorCXsKKwkJY2FzZSBBQ1RfQ0FUX0JBOgorCQkJaWYgKCphY3QgPT0gQUNUX0FEREJBUkVRKQorCQkJaWVlZTgwMjExX3J4X0FEREJBUmVxKGllZWUsIHNrYik7CisJCQllbHNlIGlmICgqYWN0ID09IEFDVF9BRERCQVJTUCkKKwkJCWllZWU4MDIxMV9yeF9BRERCQVJzcChpZWVlLCBza2IpOworCQkJZWxzZSBpZiAoKmFjdCA9PSBBQ1RfREVMQkEpCisJCQlpZWVlODAyMTFfcnhfREVMQkEoaWVlZSwgc2tiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorLy8JCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorLy8JCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0JBLCAidW5rbm93biBhY3Rpb24gZnJhbWUoJWQpXG4iLCB0bXApOworCQkJYnJlYWs7CisJfQorCXJldHVybjsKKworfQoraW5saW5lIGludAoraWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywgdTE2IHR5cGUsCisJCQl1MTYgc3R5cGUpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmhlYWRlciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKSBza2ItPmRhdGE7CisJdTE2IGVycmNvZGU7CisJdTgqIGNoYWxsZW5nZTsKKwlpbnQgY2hsZW49MDsKKwlpbnQgYWlkOworCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKmFzc29jX3Jlc3A7CisvLwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaW5mb19lbGVtZW50OworCWJvb2wgYlN1cHBvcnRObW9kZSA9IHRydWUsIGJIYWxmU3VwcG9ydE5tb2RlID0gZmFsc2U7IC8vZGVmYXVsdCBzdXBwb3J0IE4gbW9kZSwgZGlzYWJsZSBoYWxmTm1vZGUKKworCWlmKCFpZWVlLT5wcm90b19zdGFydGVkKQorCQlyZXR1cm4gMDsKKworCWlmKGllZWUtPnN0YV9zbGVlcCB8fCAoaWVlZS0+cHMgIT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEICYmCisJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSAmJgorCQlpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSkKKworCQl0YXNrbGV0X3NjaGVkdWxlKCZpZWVlLT5wc190YXNrKTsKKworCWlmKFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSAhPSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCAmJgorCQlXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkgIT0gSUVFRTgwMjExX1NUWVBFX0JFQUNPTikKKwkJaWVlZS0+bGFzdF9yeF9wc190aW1lID0gamlmZmllczsKKworCXN3aXRjaCAoV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKSB7CisKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVTUDoKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQOgorCisJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgicmVjZWl2ZWQgW1JFXUFTU09DSUFUSU9OIFJFU1BPTlNFICglZClcbiIsCisJCQkJCVdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSk7CisJCQlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSAmJgorCQkJCWllZWUtPnN0YXRlID09IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVEICYmCisJCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKXsKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0d29ya19yZXNwOworCQkJCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yayA9ICZuZXR3b3JrX3Jlc3A7CisKKwkJCQlpZiAoMCA9PSAoZXJyY29kZT1hc3NvY19wYXJzZShpZWVlLHNrYiwgJmFpZCkpKXsKKwkJCQkJaWVlZS0+c3RhdGU9SUVFRTgwMjExX0xJTktFRDsKKwkJCQkJaWVlZS0+YXNzb2NfaWQgPSBhaWQ7CisJCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXNzX29rKys7CisJCQkJCS8qIHN0YXRpb24gc3VwcG9ydCBxb3MgKi8KKwkJCQkJLyogTGV0IHRoZSByZWdpc3RlciBzZXR0aW5nIGRlZmF1bHRseSB3aXRoIExlZ2FjeSBzdGF0aW9uICovCisJCQkJCWlmKGllZWUtPnFvc19zdXBwb3J0KSB7CisJCQkJCQlhc3NvY19yZXNwID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUqKXNrYi0+ZGF0YTsKKwkJCQkJCW1lbXNldChuZXR3b3JrLCAwLCBzaXplb2YoKm5ldHdvcmspKTsKKwkJCQkJCWlmIChpZWVlODAyMTFfcGFyc2VfaW5mb19wYXJhbShpZWVlLGFzc29jX3Jlc3AtPmluZm9fZWxlbWVudCxcCisJCQkJCQkJCQlyeF9zdGF0cy0+bGVuIC0gc2l6ZW9mKCphc3NvY19yZXNwKSxcCisJCQkJCQkJCQluZXR3b3JrLHJ4X3N0YXRzKSl7CisJCQkJCQkJcmV0dXJuIDE7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CS8vZmlsbGluZyB0aGUgUGVlckhUQ2FwLiAvL21heWJlIG5vdCBuZWNjZXNhcnkgYXMgd2UgY2FuIGdldCBpdHMgaW5mbyBmcm9tIGN1cnJlbnRfbmV0d29yay4KKwkJCQkJCQltZW1jcHkoaWVlZS0+cEhUSW5mby0+UGVlckhUQ2FwQnVmLCBuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmLCBuZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuKTsKKwkJCQkJCQltZW1jcHkoaWVlZS0+cEhUSW5mby0+UGVlckhUSW5mb0J1ZiwgbmV0d29yay0+YnNzaHQuYmRIVEluZm9CdWYsIG5ldHdvcmstPmJzc2h0LmJkSFRJbmZvTGVuKTsKKwkJCQkJCX0KKwkJCQkJCWlmIChpZWVlLT5oYW5kbGVfYXNzb2NfcmVzcG9uc2UgIT0gTlVMTCkKKwkJCQkJCQlpZWVlLT5oYW5kbGVfYXNzb2NfcmVzcG9uc2UoaWVlZS0+ZGV2LCAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSopaGVhZGVyLCBuZXR3b3JrKTsKKwkJCQkJfQorCQkJCQlpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlKGllZWUpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIGFpZCBjb3VsZCBub3QgYmVlbiBhbGxvY2F0ZWQgKi8KKwkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hc3NfZXJyKys7CisJCQkJCXByaW50aygKKwkJCQkJCSJBc3NvY2lhdGlvbiByZXNwb25zZSBzdGF0dXMgY29kZSAweCV4XG4iLAorCQkJCQkJZXJyY29kZSk7CisJCQkJCUlFRUU4MDIxMV9ERUJVR19NR01UKAorCQkJCQkJIkFzc29jaWF0aW9uIHJlc3BvbnNlIHN0YXR1cyBjb2RlIDB4JXhcbiIsCisJCQkJCQllcnJjb2RlKTsKKwkJCQkJaWYoaWVlZS0+QXNvY1JldHJ5Q291bnQgPCBSVF9BU09DX1JFVFJZX0xJTUlUKSB7CisJCQkJCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVROgorCQljYXNlIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFUToKKworCQkJaWYgKChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkgJiYKKwkJCQlpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKQorCisJCQkJaWVlZTgwMjExX3J4X2Fzc29jX3JxKGllZWUsIHNrYik7CisJCQlicmVhazsKKworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BVVRIOgorCisJCQlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpeworCQkJCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcgJiYKKwkJCQlpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpeworCisJCQkJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiUmVjZWl2ZWQgYXV0aGVudGljYXRpb24gcmVzcG9uc2UiKTsKKworCQkJCQkJaWYgKDAgPT0gKGVycmNvZGU9YXV0aF9wYXJzZShza2IsICZjaGFsbGVuZ2UsICZjaGxlbikpKXsKKwkJCQkJCQlpZihpZWVlLT5vcGVuX3dlcCB8fCAhY2hhbGxlbmdlKXsKKwkJCQkJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRFRDsKKwkJCQkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hdXRoX3JzX29rKys7CisJCQkJCQkJCWlmKCEoaWVlZS0+cEhUSW5mby0+SU9UQWN0aW9uJkhUX0lPVF9BQ1RfUFVSRV9OX01PREUpKQorCQkJCQkJCQl7CisJCQkJCQkJCQlpZiAoIWllZWUtPkdldE5tb2RlU3VwcG9ydEJ5U2VjQ2ZnKGllZWUtPmRldikpCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJCQkvLyBXRVAgb3IgVEtJUCBlbmNyeXB0aW9uCisJCQkJCQkJCQkJaWYoSXNIVEhhbGZObW9kZUFQcyhpZWVlKSkKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCWJTdXBwb3J0Tm1vZGUgPSB0cnVlOworCQkJCQkJCQkJCQliSGFsZlN1cHBvcnRObW9kZSA9IHRydWU7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCWJTdXBwb3J0Tm1vZGUgPSBmYWxzZTsKKwkJCQkJCQkJCQkJYkhhbGZTdXBwb3J0Tm1vZGUgPSBmYWxzZTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQlwcmludGsoIj09PT09PT09PT0+dG8gbGluayB3aXRoIEFQIHVzaW5nIFNFQyglZCwgJWQpIiwgYlN1cHBvcnRObW9kZSwgYkhhbGZTdXBwb3J0Tm1vZGUpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCS8qIER1bW15IHdpcmxlc3MgbW9kZSBzZXR0aW5nIHRvIGF2b2lkIGVuY3J5cHRpb24gaXNzdWUgKi8KKwkJCQkJCQkJaWYoYlN1cHBvcnRObW9kZSkgeworCQkJCQkJCQkJLy9OIG1vZGUgc2V0dGluZworCQkJCQkJCQkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUtPmRldiwgXAorCQkJCQkJCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSk7CisJCQkJCQkJCX1lbHNleworCQkJCQkJCQkJLy9iL2cgbW9kZSBzZXR0aW5nCisJCQkJCQkJCQkvKlRPRE8qLworCQkJCQkJCQkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUtPmRldiwgSUVFRV9HKTsKKwkJCQkJCQkJfQorCisJCQkJCQkJCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fMjRHICYmIGJIYWxmU3VwcG9ydE5tb2RlID09IHRydWUpCisJCQkJCQkJCXsKKwkJCQkJCQkJCXByaW50aygiPT09PT09PT09PT09PT09PmVudGVybiBoYWxmIE4gbW9kZVxuIik7CisJCQkJCQkJCQlpZWVlLT5iSGFsZldpcmVsZXNzTjI0R01vZGUgPSB0cnVlOworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCWllZWUtPmJIYWxmV2lyZWxlc3NOMjRHTW9kZSA9IGZhbHNlOworCisJCQkJCQkJCWllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDIoaWVlZSk7CisJCQkJCQkJfWVsc2V7CisJCQkJCQkJCWllZWU4MDIxMV9hdXRoX2NoYWxsZW5nZShpZWVlLCBjaGFsbGVuZ2UsIGNobGVuKTsKKwkJCQkJCQl9CisJCQkJCQl9ZWxzZXsKKwkJCQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnNfZXJyKys7CisJCQkJCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIkF1dGhlbnRpY2F0aW9uIHJlc3Bvc2Ugc3RhdHVzIGNvZGUgMHgleCIsZXJyY29kZSk7CisJCQkJCQkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKKwkJCQkJCX0KKworCQkJCQl9ZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUil7CisJCQkJCQlpZWVlODAyMTFfcnhfYXV0aF9ycShpZWVlLCBza2IpOworCQkJCQl9CisJCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVROgorCisJCQlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfUFJPQkVSUykgJiYKKwkJCQkoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyB8fAorCQkJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpICYmCisJCQkJaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkpeworCQkJCWllZWU4MDIxMV9yeF9wcm9iZV9ycShpZWVlLCBza2IpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfRElTQVNTT0M6CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0RFQVVUSDoKKwkJCS8qIEZJWE1FIGZvciBub3cgcmVwZWF0IGFsbCB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlCisJCQkqIGJvdGggZm9yIGRpc2Fzc29jaWF0aW9uIGFuZCBkZWF1dGhlbnRpY2F0aW9uCisJCQkqLworCQkJaWYgKChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkgJiYKKwkJCQlpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEICYmCisJCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKXsKKworCQkJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HOworCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucmVhc3NvYysrOworCisJCQkJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCQkJCS8vSFRTZXRDb25uZWN0QndNb2RlKGllZWUsIEhUX0NIQU5ORUxfV0lEVEhfMjAsIEhUX0VYVENITkxfT0ZGU0VUX05PX0VYVCk7CisJCQkJUmVtb3ZlUGVlclRTKGllZWUsIGhlYWRlci0+YWRkcjIpOworCQkJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9NQU5BR0VfQUNUOgorCQkJaWVlZTgwMjExX3Byb2Nlc3NfYWN0aW9uKGllZWUsc2tiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCQkJYnJlYWs7CisJfQorCisJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOworCXJldHVybiAwOworfQorCisvKiBmb2xsb3dpbmcgYXJlIGZvciBhIHNpbXBsaWVyIFRYIHF1ZXVlIG1hbmFnZW1lbnQuCisgKiBJbnN0ZWFkIG9mIHVzaW5nIG5ldGlmX1tzdG9wL3dha2VdX3F1ZXVlIHRoZSBkcml2ZXIKKyAqIHdpbGwgdXNlcyB0aGVzZSB0d28gZnVuY3Rpb24gKHBsdXMgYSByZXNldCBvbmUpLCB0aGF0CisgKiB3aWxsIGludGVybmFsbHkgdXNlcyB0aGUga2VybmVsIG5ldGlmXyogYW5kIHRha2VzCisgKiBjYXJlIG9mIHRoZSBpZWVlODAyLjExIGZyYWdtZW50YXRpb24uCisgKiBTbyB0aGUgZHJpdmVyIHJlY2VpdmVzIGEgZnJhZ21lbnQgcGVyIHRpbWUgYW5kIG1pZ2h0CisgKiBjYWxsIHRoZSBzdG9wIGZ1bmN0aW9uIHdoZW4gaXQgd2FudCB3aXRob3V0IHRha2UgY2FyZQorICogdG8gaGF2ZSBlbm91Z2h0IHJvb20gdG8gVFggYW4gZW50aXJlIHBhY2tldC4KKyAqIFRoaXMgbWlnaHQgYmUgdXNlZnVsIGlmIGVhY2ggZnJhZ21lbnQgbmVlZCBpdCdzIG93bgorICogZGVzY3JpcHRvciwgdGh1cyBqdXN0IGtlZXAgYSB0b3RhbCBmcmVlIG1lbW9yeSA+IHRoYW4KKyAqIHRoZSBtYXggZnJhZ21lbnRhdGlvbiB0cmVzaG9sZCBpcyBub3QgZW5vdWdodC4uIElmIHRoZQorICogaWVlZTgwMi4xMSBzdGFjayBwYXNzZWQgYSBUWEIgc3RydWN0IHRoZW4geW91IG5lZWRlZAorICogdG8ga2VlcCBOIGZyZWUgZGVzY3JpcHRvcnMgd2hlcmUKKyAqIE4gPSBNQVhfUEFDS0VUX1NJWkUgLyBNSU5fRlJBR19UUkVTSE9MRAorICogSW4gdGhpcyB3YXkgeW91IG5lZWQganVzdCBvbmUgYW5kIHRoZSA4MDIuMTEgc3RhY2sKKyAqIHdpbGwgdGFrZSBjYXJlIG9mIGJ1ZmZlcmluZyBmcmFnbWVudHMgYW5kIHBhc3MgdGhlbSB0bworICogdG8gdGhlIGRyaXZlciBsYXRlciwgd2hlbiBpdCB3YWtlcyB0aGUgcXVldWUuCisgKi8KK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfeG1pdChzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKworCXVuc2lnbmVkIGludCBxdWV1ZV9pbmRleCA9IHR4Yi0+cXVldWVfaW5kZXg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgIGk7CisJY2JfZGVzYyAqdGNiX2Rlc2MgPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCisJLyogY2FsbGVkIHdpdGggMm5kIHBhcm0gMCwgbm8gdHggbWdtdCBsb2NrIHJlcXVpcmVkICovCisJaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwwKTsKKworCS8qIHVwZGF0ZSB0aGUgdHggc3RhdHVzICovCisJaWVlZS0+c3RhdHMudHhfYnl0ZXMgKz0gdHhiLT5wYXlsb2FkX3NpemU7CisJaWVlZS0+c3RhdHMudHhfcGFja2V0cysrOworCXRjYl9kZXNjID0gKGNiX2Rlc2MgKikodHhiLT5mcmFnbWVudHNbMF0tPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCWlmKHRjYl9kZXNjLT5iTXVsdGljYXN0KSB7CisJCWllZWUtPnN0YXRzLm11bHRpY2FzdCsrOworCX0KKwkvKiBpZiB4bWl0IGF2YWlsYWJsZSwganVzdCB4bWl0IGl0IGltbWVkaWF0ZWx5LCBlbHNlIGp1c3QgaW5zZXJ0IGl0IHRvIHRoZSB3YWl0IHF1ZXVlICovCisJZm9yKGkgPSAwOyBpIDwgdHhiLT5ucl9mcmFnczsgaSsrKSB7CisjaWZkZWYgVVNCX1RYX0RSSVZFUl9BR0dSRUdBVElPTl9FTkFCTEUKKwkJaWYgKChza2JfcXVldWVfbGVuKCZpZWVlLT5za2JfZHJ2X2FnZ1FbcXVldWVfaW5kZXhdKSAhPSAwKSB8fAorI2Vsc2UKKwkJaWYgKChza2JfcXVldWVfbGVuKCZpZWVlLT5za2Jfd2FpdFFbcXVldWVfaW5kZXhdKSAhPSAwKSB8fAorI2VuZGlmCisJCSghaWVlZS0+Y2hlY2tfbmljX2Vub3VnaF9kZXNjKGllZWUtPmRldixxdWV1ZV9pbmRleCkpfHxcCisJCSAgICAgKGllZWUtPnF1ZXVlX3N0b3ApKSB7CisJCQkvKiBpbnNlcnQgdGhlIHNrYiBwYWNrZXQgdG8gdGhlIHdhaXQgcXVldWUgKi8KKwkJCS8qIGFzIGZvciB0aGUgY29tcGxldGlvbiBmdW5jdGlvbiwgaXQgZG9lcyBub3QgbmVlZAorCQkJICogdG8gY2hlY2sgaXQgYW55IG1vcmUuCisJCQkgKiAqLworCQkJLy9wcmludGsoImVycm9yOm5vIGRlc2NyaXB0b3IgbGVmdEBxdWV1ZV9pbmRleCAlZFxuIiwgcXVldWVfaW5kZXgpOworCQkJLy9pZWVlODAyMTFfc3RvcF9xdWV1ZShpZWVlKTsKKyNpZmRlZiBVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQorCQkJc2tiX3F1ZXVlX3RhaWwoJmllZWUtPnNrYl9kcnZfYWdnUVtxdWV1ZV9pbmRleF0sIHR4Yi0+ZnJhZ21lbnRzW2ldKTsKKyNlbHNlCisJCQlza2JfcXVldWVfdGFpbCgmaWVlZS0+c2tiX3dhaXRRW3F1ZXVlX2luZGV4XSwgdHhiLT5mcmFnbWVudHNbaV0pOworI2VuZGlmCisJCX1lbHNleworCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCgKKwkJCQkJdHhiLT5mcmFnbWVudHNbaV0sCisJCQkJCWllZWUtPmRldixpZWVlLT5yYXRlKTsKKwkJCS8vaWVlZS0+c3RhdHMudHhfcGFja2V0cysrOworCQkJLy9pZWVlLT5zdGF0cy50eF9ieXRlcyArPSB0eGItPmZyYWdtZW50c1tpXS0+bGVuOworCQkJLy9pZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJfQorCX0KKwlpZWVlODAyMTFfdHhiX2ZyZWUodHhiKTsKKworLy9leGl0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCit9CisKKy8qIGNhbGxlZCB3aXRoIGllZWUtPmxvY2sgYWNxdWlyZWQgKi8KK3ZvaWQgaWVlZTgwMjExX3Jlc3VtZV90eChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpbnQgaTsKKwlmb3IoaSA9IGllZWUtPnR4X3BlbmRpbmcuZnJhZzsgaSA8IGllZWUtPnR4X3BlbmRpbmcudHhiLT5ucl9mcmFnczsgaSsrKSB7CisKKwkJaWYgKGllZWUtPnF1ZXVlX3N0b3ApeworCQkJaWVlZS0+dHhfcGVuZGluZy5mcmFnID0gaTsKKwkJCXJldHVybjsKKwkJfWVsc2V7CisKKwkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoCisJCQkJaWVlZS0+dHhfcGVuZGluZy50eGItPmZyYWdtZW50c1tpXSwKKwkJCQlpZWVlLT5kZXYsaWVlZS0+cmF0ZSk7CisJCQkJLy8oaSsxKTxpZWVlLT50eF9wZW5kaW5nLnR4Yi0+bnJfZnJhZ3MpOworCQkJaWVlZS0+c3RhdHMudHhfcGFja2V0cysrOworCQkJaWVlZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCX0KKwl9CisKKworCWllZWU4MDIxMV90eGJfZnJlZShpZWVlLT50eF9wZW5kaW5nLnR4Yik7CisJaWVlZS0+dHhfcGVuZGluZy50eGIgPSBOVUxMOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jayxmbGFncyk7CisJaW5pdF9tZ210X3F1ZXVlKGllZWUpOworCWlmIChpZWVlLT50eF9wZW5kaW5nLnR4Yil7CisJCWllZWU4MDIxMV90eGJfZnJlZShpZWVlLT50eF9wZW5kaW5nLnR4Yik7CisJCWllZWUtPnR4X3BlbmRpbmcudHhiID0gTlVMTDsKKwl9CisJaWVlZS0+cXVldWVfc3RvcCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jayxmbGFncyk7CisKK30KKwordm9pZCBpZWVlODAyMTFfd2FrZV9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKmhlYWRlcjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKwlpZiAoISBpZWVlLT5xdWV1ZV9zdG9wKSBnb3RvIGV4aXQ7CisKKwlpZWVlLT5xdWV1ZV9zdG9wID0gMDsKKworCWlmKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFKXsKKwkJd2hpbGUgKCFpZWVlLT5xdWV1ZV9zdG9wICYmIChza2IgPSBkZXF1ZXVlX21nbXQoaWVlZSkpKXsKKworCQkJaGVhZGVyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqKSBza2ItPmRhdGE7CisKKwkJCWhlYWRlci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdIDw8IDQpOworCisJCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCQkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCQkJZWxzZQorCQkJCWllZWUtPnNlcV9jdHJsWzBdKys7CisKKwkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoc2tiLGllZWUtPmRldixpZWVlLT5iYXNpY19yYXRlKTsKKwkJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJCX0KKwl9CisJaWYgKCFpZWVlLT5xdWV1ZV9zdG9wICYmIGllZWUtPnR4X3BlbmRpbmcudHhiKQorCQlpZWVlODAyMTFfcmVzdW1lX3R4KGllZWUpOworCisJaWYgKCFpZWVlLT5xdWV1ZV9zdG9wICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQoaWVlZS0+ZGV2KSl7CisJCWllZWUtPnNvZnRtYWNfc3RhdHMuc3d0eGF3YWtlKys7CisJCW5ldGlmX3dha2VfcXVldWUoaWVlZS0+ZGV2KTsKKwl9CisKK2V4aXQgOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssZmxhZ3MpOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3N0b3BfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJLy91bnNpZ25lZCBsb25nIGZsYWdzOworCS8vc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCisJaWYgKCEgbmV0aWZfcXVldWVfc3RvcHBlZChpZWVlLT5kZXYpKXsKKwkJbmV0aWZfc3RvcF9xdWV1ZShpZWVlLT5kZXYpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnN3dHhzdG9wKys7CisJfQorCWllZWUtPnF1ZXVlX3N0b3AgPSAxOworCS8vc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jayxmbGFncyk7CisKK30KKworCitpbmxpbmUgdm9pZCBpZWVlODAyMTFfcmFuZG9taXplX2NlbGwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisKKwlnZXRfcmFuZG9tX2J5dGVzKGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCisJLyogYW4gSUJTUyBjZWxsIGFkZHJlc3MgbXVzdCBoYXZlIHRoZSB0d28gbGVzcyBzaWduaWZpY2FudAorCSAqIGJpdHMgb2YgdGhlIGZpcnN0IGJ5dGUgPSAyCisJICovCisJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkWzBdICY9IH4weDAxOworCWllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZFswXSB8PSAweDAyOworfQorCisvKiBjYWxsZWQgaW4gdXNlciBjb250ZXh0IG9ubHkgKi8KK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X21hc3Rlcl9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWVlZS0+YXNzb2NfaWQgPSAxOworCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSAwKXsKKwkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwKKwkJCUlFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lELAorCQkJSVdfRVNTSURfTUFYX1NJWkUpOworCisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IHN0cmxlbihJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCk7CisJCWllZWUtPnNzaWRfc2V0ID0gMTsKKwl9CisKKwltZW1jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisKKwlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRUQ7CisJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKwlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7CisKKwlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlLT5kZXYpOworCisJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworfQorCit2b2lkIGllZWU4MDIxMV9zdGFydF9tb25pdG9yX21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYoaWVlZS0+cmF3X3R4KXsKKworCQlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKworCQluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7CisJfQorfQordm9pZCBpZWVlODAyMTFfc3RhcnRfaWJzc193cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHN0YXJ0X2lic3Nfd3EpOworCS8qIGl3Y29uZmlnIG1vZGUgYWQtaG9jIHdpbGwgc2NoZWR1bGUgdGhpcyBhbmQgcmV0dXJuCisJICogb24gdGhlIG90aGVyIGhhbmQgdGhpcyB3aWxsIGJsb2NrIGZ1cnRoZXIgaXdjb25maWcgU0VUCisJICogb3BlcmF0aW9ucyBiZWNhdXNlIG9mIHRoZSB3eF9zZW0gaG9sZC4KKwkgKiBBbnl3YXkgc29tZSBtb3N0IHNldCBvcGVyYXRpb25zIHNldCBhIGZsYWcgdG8gc3BlZWQtdXAKKwkgKiAoYWJvcnQpIHRoaXMgd3EgKHdoZW4gc3luY3JvIHNjYW5uaW5nKSBiZWZvcmUgc2xlZXBpbmcKKwkgKiBvbiB0aGUgc2VtYXBob3JlCisJICovCisJaWYoIWllZWUtPnByb3RvX3N0YXJ0ZWQpeworCQlwcmludGsoIj09PT09PT09PT1vaCBkcml2ZXIgZG93biByZXR1cm5cbiIpOworCQlyZXR1cm47CisJfQorCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApeworCQlzdHJjcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQpOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSBzdHJsZW4oSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQpOworCQlpZWVlLT5zc2lkX3NldCA9IDE7CisJfQorCisJLyogY2hlY2sgaWYgd2UgaGF2ZSB0aGlzIGNlbGwgaW4gb3VyIG5ldHdvcmsgbGlzdCAqLworCWllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKGllZWUpOworCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFEIC8vaWYgY3JlYXRpbmcgYW4gYWQtaG9jLCBzZXQgaXRzIGNoYW5uZWwgdG8gMTAgdGVtcG9yYXJpbHktLXRoaXMgaXMgdGhlIHJlcXVpcmVtZW50IGZvciBBU1VTLCBub3QgMTFELCBzbyBkaXNhYmxlIDExZC4KKy8vCWlmKChJU19ET1QxMURfRU5BQkxFKGllZWUpKSAmJiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykpCisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspCisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gNjsKKyNlbmRpZgorCS8qIGlmIG5vdCB0aGVuIHRoZSBzdGF0ZSBpcyBub3QgbGlua2VkLiBNYXliZSB0aGUgdXNlciBzd2l0aGNlZCB0bworCSAqIGFkLWhvYyBtb2RlIGp1c3QgYWZ0ZXIgYmVpbmcgaW4gbW9uaXRvciBtb2RlLCBvciBqdXN0IGFmdGVyCisJICogYmVpbmcgdmVyeSBmZXcgdGltZSBpbiBtYW5hZ2VkIG1vZGUgKHNvIHRoZSBjYXJkIGhhdmUgaGFkIG5vCisJICogdGltZSB0byBzY2FuIGFsbCB0aGUgY2hhbnMuLikgb3Igd2UgaGF2ZSBqdXN0IHJ1biB1cCB0aGUgaWZhY2UKKwkgKiBhZnRlciBzZXR0aW5nIGFkLWhvYyBtb2RlLiBTbyB3ZSBoYXZlIHRvIGdpdmUgYW5vdGhlciB0cnkuLgorCSAqIEhlcmUsIGluIGlic3MgbW9kZSwgc2hvdWxkIGJlIHNhZmUgdG8gZG8gdGhpcyB3aXRob3V0IGV4dHJhIGNhcmUKKwkgKiAoaW4gYnNzIG1vZGUgd2UgaGFkIHRvIG1ha2Ugc3VyZSBuby1vbmUgdHJ5ZWQgdG8gYXNzb2NpYXRlIHdoZW4KKwkgKiB3ZSBoYWQganVzdCBjaGVja2VkIHRoZSBpZWVlLT5zdGF0ZSBhbmQgd2Ugd2FzIGdvaW5nIHRvIHN0YXJ0IHRoZQorCSAqIHNjYW4pIGJlYWNhdXNlIGluIGlic3MgbW9kZSB0aGUgaWVlZTgwMjExX25ld19uZXQgZnVuY3Rpb24sIHdoZW4KKwkgKiBmaW5kcyBhIGdvb2QgbmV0LCBqdXN0IHNldCB0aGUgaWVlZS0+c3RhdGUgdG8gSUVFRTgwMjExX0xJTktFRCwKKwkgKiBzbywgYXQgd29yc3QsIHdlIHdhc3RlIGEgYml0IG9mIHRpbWUgdG8gaW5pdGlhdGUgYW4gdW5uZWVkZWQgc3luY3JvCisJICogc2NhbiwgdGhhdCB3aWxsIHN0b3AgYXQgdGhlIGZpcnN0IHJvdW5kIGJlY2F1c2UgaXQgc2VlcyB0aGUgc3RhdGUKKwkgKiBhc3NvY2lhdGVkLgorCSAqLworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKQorCQlpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm8oaWVlZSk7CisKKwkvKiB0aGUgbmV0d29yayBkZWZpbml0aXZlbHkgaXMgbm90IGhlcmUuLiBjcmVhdGUgYSBuZXcgY2VsbCAqLworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKXsKKwkJcHJpbnRrKCJjcmVhdGluZyBuZXcgSUJTUyBjZWxsXG4iKTsKKwkJaWYoIWllZWUtPndhcF9zZXQpCisJCQlpZWVlODAyMTFfcmFuZG9taXplX2NlbGwoaWVlZSk7CisKKwkJaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTil7CisKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19sZW4gPSA0OworCisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbMF0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzFNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1sxXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfMk1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzJdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV81TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbM10gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzExTUI7CisKKwkJfWVsc2UKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19sZW4gPSAwOworCisJCWlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKXsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leF9sZW4gPSA4OworCisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbMF0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV82TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbMV0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV85TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbMl0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV8xMk1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzNdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFs0XSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbNV0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV8zNk1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzZdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFs3XSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI7CisKKwkJCWllZWUtPnJhdGUgPSAxMDg7CisJCX1lbHNleworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbiA9IDA7CisJCQlpZWVlLT5yYXRlID0gMjI7CisJCX0KKworCQkvLyBCeSBkZWZhdWx0LCBXTU0gZnVuY3Rpb24gd2lsbCBiZSBkaXNhYmxlZCBpbiBJQlNTIG1vZGUKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUgPSAwOworCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZS0+ZGV2LCBJRUVFX0cpOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuYXRpbV93aW5kb3cgPSAwOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSA9IFdMQU5fQ0FQQUJJTElUWV9JQlNTOworCQlpZihpZWVlLT5zaG9ydF9zbG90KQorCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgfD0gV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1Q7CisKKwl9CisKKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRUQ7CisKKwlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOworCisJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCisJaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhpZWVlKTsKKworCWlmIChpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKQorCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworCisJdXAoJmllZWUtPnd4X3NlbSk7Cit9CisKK2lubGluZSB2b2lkIGllZWU4MDIxMV9zdGFydF9pYnNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPnN0YXJ0X2lic3Nfd3EsIDE1MCk7Cit9CisKKy8qIHRoaXMgaXMgY2FsbGVkIG9ubHkgaW4gdXNlciBjb250ZXh0LCB3aXRoIHd4X3NlbSBoZWxkICovCit2b2lkIGllZWU4MDIxMV9zdGFydF9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJLy8KKwkvLyBSZWY6IDgwMi4xMWQgMTEuMS4zLjMKKwkvLyBTVEEgc2hhbGwgbm90IHN0YXJ0IGEgQlNTIHVubGVzcyBwcm9wZXJseSBmb3JtZWQgQmVhY29uIGZyYW1lIGluY2x1ZGluZyBhIENvdW50cnkgSUUuCisJLy8KKwlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpICYmICFJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQorCXsKKwkJaWYoISBpZWVlLT5iR2xvYmFsRG9tYWluKQorCQl7CisJCQlyZXR1cm47CisJCX0KKwl9CisjZW5kaWYKKwkvKiBjaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgZm91bmQgdGhlIG5ldCB3ZQorCSAqIGFyZSBpbnRlcmVzdGVkIGluIChpZiBhbnkpLgorCSAqIGlmIG5vdCAod2UgYXJlIGRpc2Fzc29jaWF0ZWQgYW5kIHdlIGFyZSBub3QKKwkgKiBpbiBhc3NvY2lhdGluZyAvIGF1dGhlbnRpY2F0aW5nIHBoYXNlKSBzdGFydCB0aGUgYmFja2dyb3VuZCBzY2FubmluZy4KKwkgKi8KKwlpZWVlODAyMTFfc29mdG1hY19jaGVja19hbGxfbmV0cyhpZWVlKTsKKworCS8qIGVuc3VyZSBuby1vbmUgc3RhcnQgYW4gYXNzb2NpYXRpbmcgcHJvY2VzcyAodGh1cyBzZXR0aW5nCisJICogdGhlIGllZWUtPnN0YXRlIHRvIGllZWU4MDIxMV9BU1NPQ0lBVElORykgd2hpbGUgd2UKKwkgKiBoYXZlIGp1c3QgY2hla2VkIGl0IGFuZCB3ZSBhcmUgZ29pbmcgdG8gZW5hYmxlIHNjYW4uCisJICogVGhlIGllZWU4MDIxMV9uZXdfbmV0IGZ1bmN0aW9uIGlzIGFsd2F5cyBjYWxsZWQgd2l0aAorCSAqIGxvY2sgaGVsZCAoZnJvbSBib3RoIGllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzIGFuZAorCSAqIHRoZSByeCBwYXRoKSwgc28gd2UgY2Fubm90IGJlIGluIHRoZSBtaWRkbGUgb2Ygc3VjaCBmdW5jdGlvbgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSyl7CisJCWllZWUtPmFjdHNjYW5uaW5nID0gdHJ1ZTsKKwkJaWVlZTgwMjExX3N0YXJ0X3NjYW4oaWVlZSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKK30KKworLyogY2FsbGVkIG9ubHkgaW4gdXNlcnNwYWNlIGNvbnRleHQgKi8KK3ZvaWQgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKworCisJbmV0aWZfY2Fycmllcl9vZmYoaWVlZS0+ZGV2KTsKKwlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19UWF9RVUVVRSkKKwkJCWllZWU4MDIxMV9yZXNldF9xdWV1ZShpZWVlKTsKKworCWlmIChpZWVlLT5kYXRhX2hhcmRfc3RvcCkKKwkJCWllZWUtPmRhdGFfaGFyZF9zdG9wKGllZWUtPmRldik7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCisJCURvdDExZF9SZXNldChpZWVlKTsKKyNlbmRpZgorCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKKwlpZWVlLT5pc19zZXRfa2V5ID0gZmFsc2U7CisJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKwkvL0hUU2V0Q29ubmVjdEJ3TW9kZShpZWVlLCBIVF9DSEFOTkVMX1dJRFRIXzIwLCBIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQpOworCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKKworfQordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3JldHJ5X3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgYXNzb2NpYXRlX3JldHJ5X3dxKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKwlpZighaWVlZS0+cHJvdG9fc3RhcnRlZCkKKwkJZ290byBleGl0OworCisJaWYoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0FTU09DSUFUSU5HX1JFVFJZKQorCQlnb3RvIGV4aXQ7CisKKwkvKiB1bnRpbCB3ZSBkbyBub3Qgc2V0IHRoZSBzdGF0ZSB0byBJRUVFODAyMTFfTk9MSU5LCisJKiB0aGVyZSBhcmUgbm8gcG9zc2liaWxpdHkgdG8gaGF2ZSBzb21lb25lIGVsc2UgdHJ5aW5nCisJKiB0byBzdGFydCBhbiBhc3NvY2lhdGlvbiBwcm9jZHVyZSAod2UgZ2V0IGhlcmUgd2l0aAorCSogaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkcpLgorCSogV2hlbiB3ZSBzZXQgdGhlIHN0YXRlIHRvIElFRUU4MDIxMV9OT0xJTksgaXQgaXMgcG9zc2libGUKKwkqIHRoYXQgdGhlIFJYIHBhdGggcnVuIGFuIGF0dGVtcHQgdG8gYXNzb2NpYXRlLCBidXQKKwkqIGJvdGggaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMgYW5kIHRoZQorCSogUlggcGF0aCB3b3JrcyB3aXRoIGllZWUtPmxvY2sgaGVsZCBzbyB0aGVyZSBhcmUgbm8KKwkqIHByb2JsZW1zLiBJZiB3ZSBhcmUgc3RpbGwgZGlzYXNzb2NpYXRlZCB0aGVuIHN0YXJ0IGEgc2Nhbi4KKwkqIHRoZSBsb2NrIGhlcmUgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSBubyBvbmUgdHJ5IHRvIHN0YXJ0CisJKiBhbiBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgd2hlbiB3ZSBoYXZlIGp1c3QgY2hlY2tlZCB0aGUKKwkqIHN0YXRlIGFuZCB3ZSBhcmUgZ29pbmcgdG8gc3RhcnQgdGhlIHNjYW4uCisJKi8KKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9OT0xJTks7CisKKwlpZWVlODAyMTFfc29mdG1hY19jaGVja19hbGxfbmV0cyhpZWVlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKQorCQlpZWVlODAyMTFfc3RhcnRfc2NhbihpZWVlKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworZXhpdDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KKworc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9nZXRfYmVhY29uXyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1OCBicm9hZGNhc3RfYWRkcltdID0gezB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmfTsKKworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqYjsKKworCXNrYiA9IGllZWU4MDIxMV9wcm9iZV9yZXNwKGllZWUsIGJyb2FkY2FzdF9hZGRyKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWIgPSAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqKSBza2ItPmRhdGE7CisJYi0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9CRUFDT04pOworCisJcmV0dXJuIHNrYjsKKworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiOworCisJc2tiID0gaWVlZTgwMjExX2dldF9iZWFjb25fKGllZWUpOworCWlmKCFza2IpCisJCXJldHVybiBOVUxMOworCisJYiA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICopIHNrYi0+ZGF0YTsKKwliLT5oZWFkZXIuc2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdIDw8IDQpOworCisJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQorCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJZWxzZQorCQlpZWVlLT5zZXFfY3RybFswXSsrOworCisJcmV0dXJuIHNrYjsKK30KKwordm9pZCBpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCWllZWU4MDIxMV9zdG9wX3Byb3RvY29sKGllZWUpOworCXVwKCZpZWVlLT53eF9zZW0pOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYgKCFpZWVlLT5wcm90b19zdGFydGVkKQorCQlyZXR1cm47CisKKwlpZWVlLT5wcm90b19zdGFydGVkID0gMDsKKworCWllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhpZWVlKTsKKwlkZWxfdGltZXJfc3luYygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPnN0YXJ0X2lic3Nfd3EpOworCWllZWU4MDIxMV9zdG9wX3NjYW4oaWVlZSk7CisKKwlpZWVlODAyMTFfZGlzYXNzb2NpYXRlKGllZWUpOworCVJlbW92ZUFsbFRTKGllZWUpOyAvL2FkZGVkIGFzIHdlIGRpc2Nvbm5lY3QgZnJvbSB0aGUgcHJldmlvdXMgQlNTLCBSZW1vdmUgYWxsIFRTCit9CisKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOworCWRvd24oJmllZWUtPnd4X3NlbSk7CisJaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKGllZWUpOworCXVwKCZpZWVlLT53eF9zZW0pOworfQorCit2b2lkIGllZWU4MDIxMV9zdGFydF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzaG9ydCBjaCA9IDA7CisJaW50IGkgPSAwOworCWlmIChpZWVlLT5wcm90b19zdGFydGVkKQorCQlyZXR1cm47CisKKwlpZWVlLT5wcm90b19zdGFydGVkID0gMTsKKworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAwKXsKKwkJZG97CisJCQljaCsrOworCQkJaWYgKGNoID4gTUFYX0NIQU5ORUxfTlVNQkVSKQorCQkJCXJldHVybjsgLyogbm8gY2hhbm5lbCBmb3VuZCAqLworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJfXdoaWxlKCFHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwW2NoXSk7CisjZWxzZQorCQl9d2hpbGUoIWllZWUtPmNoYW5uZWxfbWFwW2NoXSk7CisjZW5kaWYKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSBjaDsKKwl9CisKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCA9PSAwKQorCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsID0gMTAwOworLy8JcHJpbnRrKCI9PT0+JXMoKSwgY2hhbjolZFxuIiwgX19GVU5DVElPTl9fLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisvLwlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCisJZm9yKGkgPSAwOyBpIDwgMTc7IGkrKykgeworCSAgaWVlZS0+bGFzdF9yeHNlcV9udW1baV0gPSAtMTsKKwkgIGllZWUtPmxhc3RfcnhmcmFnX251bVtpXSA9IC0xOworCSAgaWVlZS0+bGFzdF9wYWNrZXRfdGltZVtpXSA9IDA7CisJfQorCisJaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnID0gMDsvL3JlaW5pdGlhbGl6ZSBBQ194eF9QQVJBTSByZWdpc3RlcnMuCisKKworCS8qIGlmIHRoZSB1c2VyIHNldCB0aGUgTUFDIG9mIHRoZSBhZC1ob2MgY2VsbCBhbmQgdGhlbgorCSAqIHN3aXRjaCB0byBtYW5hZ2VkIG1vZGUsIHNoYWxsIHdlICBtYWtlIHN1cmUgdGhhdCBhc3NvY2lhdGlvbgorCSAqIGF0dGVtcHRzIGRvZXMgbm90IGZhaWwganVzdCBiZWNhdXNlIHRoZSB1c2VyIHByb3ZpZGUgdGhlIGVzc2lkCisJICogYW5kIHRoZSBuaWMgaXMgc3RpbGwgY2hlY2tpbmcgZm9yIHRoZSBBUCBNQUMgPz8KKwkgKi8KKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQorCQlpZWVlODAyMTFfc3RhcnRfYnNzKGllZWUpOworCisJZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCQlpZWVlODAyMTFfc3RhcnRfaWJzcyhpZWVlKTsKKworCWVsc2UgaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpCisJCWllZWU4MDIxMV9zdGFydF9tYXN0ZXJfYnNzKGllZWUpOworCisJZWxzZSBpZihpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwkJaWVlZTgwMjExX3N0YXJ0X21vbml0b3JfbW9kZShpZWVlKTsKK30KKworCisjZGVmaW5lIERSVl9OQU1FICAiSWVlZTgwMjExIgordm9pZCBpZWVlODAyMTFfc29mdG1hY19pbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWludCBpOworCW1lbXNldCgmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKSk7CisKKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9OT0xJTks7CisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOworCWZvcihpID0gMDsgaSA8IDU7IGkrKykgeworCSAgaWVlZS0+c2VxX2N0cmxbaV0gPSAwOworCX0KKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWVlZS0+cERvdDExZEluZm8gPSBrbWFsbG9jKHNpemVvZihSVF9ET1QxMURfSU5GTyksIEdGUF9BVE9NSUMpOworCWlmICghaWVlZS0+cERvdDExZEluZm8pCisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiY2FuJ3QgYWxsb2MgbWVtb3J5IGZvciBET1QxMURcbiIpOworCW1lbXNldChpZWVlLT5wRG90MTFkSW5mbywgMCwgc2l6ZW9mKFJUX0RPVDExRF9JTkZPKSk7CisjZW5kaWYKKwkvL2FkZGVkIGZvciAgQVAgcm9hbWluZworCWllZWUtPkxpbmtEZXRlY3RJbmZvLlNsb3ROdW0gPSAyOworCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZCY25JblBlcmlvZD0wOworCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZEYXRhSW5QZXJpb2Q9MDsKKworCWllZWUtPmFzc29jX2lkID0gMDsKKwlpZWVlLT5xdWV1ZV9zdG9wID0gMDsKKwlpZWVlLT5zY2FubmluZyA9IDA7CisJaWVlZS0+c29mdG1hY19mZWF0dXJlcyA9IDA7IC8vc28gSUVFRTIxMDAtbGlrZSBkcml2ZXIgYXJlIGhhcHB5CisJaWVlZS0+d2FwX3NldCA9IDA7CisJaWVlZS0+c3NpZF9zZXQgPSAwOworCWllZWUtPnByb3RvX3N0YXJ0ZWQgPSAwOworCWllZWUtPmJhc2ljX3JhdGUgPSBJRUVFODAyMTFfREVGQVVMVF9CQVNJQ19SQVRFOworCWllZWUtPnJhdGUgPSAyMjsKKwlpZWVlLT5wcyA9IElFRUU4MDIxMV9QU19ESVNBQkxFRDsKKwlpZWVlLT5zdGFfc2xlZXAgPSAwOworCWllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXRbMF09IDB4ZmY7Ly9zdXBwb3J0IE1DUyAwfjcKKwlpZWVlLT5SZWdkb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0WzFdPSAweGZmOy8vc3VwcG9ydCBNQ1MgOH4xNQorCWllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXRbNF09IDB4MDE7CisJLy9hZGRlZCBieSBhbXkKKwlpZWVlLT5hY3RzY2FubmluZyA9IGZhbHNlOworCWllZWUtPmJlaW5yZXRyeSA9IGZhbHNlOworCWllZWUtPmlzX3NldF9rZXkgPSBmYWxzZTsKKwlpbml0X21nbXRfcXVldWUoaWVlZSk7CisKKwlpZWVlLT5zdGFfZWRjYV9wYXJhbVswXSA9IDB4MDAwMEE0MDM7CisJaWVlZS0+c3RhX2VkY2FfcGFyYW1bMV0gPSAweDAwMDBBNDI3OworCWllZWUtPnN0YV9lZGNhX3BhcmFtWzJdID0gMHgwMDVFNDM0MjsKKwlpZWVlLT5zdGFfZWRjYV9wYXJhbVszXSA9IDB4MDAyRjMyNjI7CisJaWVlZS0+YWdncmVnYXRpb24gPSB0cnVlOworCWllZWUtPmVuYWJsZV9yeF9pbW1fQkEgPSAxOworCWllZWUtPnR4X3BlbmRpbmcudHhiID0gTlVMTDsKKworCWluaXRfdGltZXIoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisJaWVlZS0+YXNzb2NpYXRlX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpZWVlOworCWllZWUtPmFzc29jaWF0ZV90aW1lci5mdW5jdGlvbiA9IGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnRfY2I7CisKKwlpbml0X3RpbWVyKCZpZWVlLT5iZWFjb25fdGltZXIpOworCWllZWUtPmJlYWNvbl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGllZWU7CisJaWVlZS0+YmVhY29uX3RpbWVyLmZ1bmN0aW9uID0gaWVlZTgwMjExX3NlbmRfYmVhY29uX2NiOworCisjaWZkZWYgUEZfU1lOQ1RIUkVBRAorCWllZWUtPndxID0gY3JlYXRlX3dvcmtxdWV1ZShEUlZfTkFNRSwwKTsKKyNlbHNlCisJaWVlZS0+d3EgPSBjcmVhdGVfd29ya3F1ZXVlKERSVl9OQU1FKTsKKyNlbmRpZgorCisJSU5JVF9ERUxBWUVEX1dPUksoJmllZWUtPnN0YXJ0X2lic3Nfd3EsaWVlZTgwMjExX3N0YXJ0X2lic3Nfd3EpOworCUlOSVRfV09SSygmaWVlZS0+YXNzb2NpYXRlX2NvbXBsZXRlX3dxLCBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlX3dxKTsKKwlJTklUX1dPUksoJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EsIGllZWU4MDIxMV9hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKKwlJTklUX0RFTEFZRURfV09SSygmaWVlZS0+c29mdG1hY19zY2FuX3dxLGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3EpOworCUlOSVRfREVMQVlFRF9XT1JLKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EsIGllZWU4MDIxMV9hc3NvY2lhdGVfcmV0cnlfd3EpOworCUlOSVRfV09SSygmaWVlZS0+d3hfc3luY19zY2FuX3dxLGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3EpOworCisKKwlzZW1hX2luaXQoJmllZWUtPnd4X3NlbSwgMSk7CisJc2VtYV9pbml0KCZpZWVlLT5zY2FuX3NlbSwgMSk7CisKKwlzcGluX2xvY2tfaW5pdCgmaWVlZS0+bWdtdF90eF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaWVlZS0+YmVhY29uX2xvY2spOworCisJdGFza2xldF9pbml0KCZpZWVlLT5wc190YXNrLAorCSAgICAgKHZvaWQoKikodW5zaWduZWQgbG9uZykpIGllZWU4MDIxMV9zdGFfcHMsCisJICAgICAodW5zaWduZWQgbG9uZylpZWVlKTsKKworfQorCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2ZyZWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJZG93bigmaWVlZS0+d3hfc2VtKTsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoTlVMTCAhPSBpZWVlLT5wRG90MTFkSW5mbykKKwl7CisJCWtmcmVlKGllZWUtPnBEb3QxMWRJbmZvKTsKKwkJaWVlZS0+cERvdDExZEluZm8gPSBOVUxMOworCX0KKyNlbmRpZgorCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShpZWVlLT53cSk7CisKKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdGFydCBvZiBXUEEgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHRoaXMgaXMgc3RvbGVuIGZyb20gdGhlIGlwdzIyMDAgZHJpdmVyICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9lbmFibGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCB2YWx1ZSkKK3sKKwkvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdwYV9zdXBwbGljYW50IGxvYWRzIGFuZCBjbG9zZXMgdGhlIGRyaXZlcgorCSAqIGludGVyZmFjZS4gKi8KKwlwcmludGsoIiVzIFdQQVxuIix2YWx1ZSA/ICJlbmFibGluZyIgOiAiZGlzYWJsaW5nIik7CisJaWVlZS0+d3BhX2VuYWJsZWQgPSB2YWx1ZTsKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGllZWU4MDIxMV93cGFfYXNzb2NfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGNoYXIgKndwYV9pZSwgaW50IHdwYV9pZV9sZW4pCit7CisJLyogbWFrZSBzdXJlIFdQQSBpcyBlbmFibGVkICovCisJaWVlZTgwMjExX3dwYV9lbmFibGUoaWVlZSwgMSk7CisKKwlpZWVlODAyMTFfZGlzYXNzb2NpYXRlKGllZWUpOworfQorCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9tbG1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgY29tbWFuZCwgaW50IHJlYXNvbikKK3sKKworCWludCByZXQgPSAwOworCisJc3dpdGNoIChjb21tYW5kKSB7CisJY2FzZSBJRUVFX01MTUVfU1RBX0RFQVVUSDoKKwkJLy8gc2lsZW50bHkgaWdub3JlCisJCWJyZWFrOworCisJY2FzZSBJRUVFX01MTUVfU1RBX0RJU0FTU09DOgorCQlpZWVlODAyMTFfZGlzYXNzb2NpYXRlKGllZWUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiVW5rbm93biBNTE1FIHJlcXVlc3Q6ICVkXG4iLCBjb21tYW5kKTsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV93cGFfc2V0X3dwYV9pZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgIHN0cnVjdCBpZWVlX3BhcmFtICpwYXJhbSwgaW50IHBsZW4pCit7CisJdTggKmJ1ZjsKKworCWlmIChwYXJhbS0+dS53cGFfaWUubGVuID4gTUFYX1dQQV9JRV9MRU4gfHwKKwkgICAgKHBhcmFtLT51LndwYV9pZS5sZW4gJiYgcGFyYW0tPnUud3BhX2llLmRhdGEgPT0gTlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBhcmFtLT51LndwYV9pZS5sZW4pIHsKKwkJYnVmID0ga21hbGxvYyhwYXJhbS0+dS53cGFfaWUubGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbWVtY3B5KGJ1ZiwgcGFyYW0tPnUud3BhX2llLmRhdGEsIHBhcmFtLT51LndwYV9pZS5sZW4pOworCQlrZnJlZShpZWVlLT53cGFfaWUpOworCQlpZWVlLT53cGFfaWUgPSBidWY7CisJCWllZWUtPndwYV9pZV9sZW4gPSBwYXJhbS0+dS53cGFfaWUubGVuOworCX0gZWxzZSB7CisJCWtmcmVlKGllZWUtPndwYV9pZSk7CisJCWllZWUtPndwYV9pZSA9IE5VTEw7CisJCWllZWUtPndwYV9pZV9sZW4gPSAwOworCX0KKworCWllZWU4MDIxMV93cGFfYXNzb2NfZnJhbWUoaWVlZSwgaWVlZS0+d3BhX2llLCBpZWVlLT53cGFfaWVfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBBVVRIX0FMR19PUEVOX1NZU1RFTQkJCTB4MQorI2RlZmluZSBBVVRIX0FMR19TSEFSRURfS0VZCQkJMHgyCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9zZXRfYXV0aF9hbGdzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgdmFsdWUpCit7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKwkJLmZsYWdzID0gU0VDX0FVVEhfTU9ERSwKKwl9OworCWludCByZXQgPSAwOworCisJaWYgKHZhbHVlICYgQVVUSF9BTEdfU0hBUkVEX0tFWSkgeworCQlzZWMuYXV0aF9tb2RlID0gV0xBTl9BVVRIX1NIQVJFRF9LRVk7CisJCWllZWUtPm9wZW5fd2VwID0gMDsKKwkJaWVlZS0+YXV0aF9tb2RlID0gMTsKKwl9IGVsc2UgaWYgKHZhbHVlICYgQVVUSF9BTEdfT1BFTl9TWVNURU0peworCQlzZWMuYXV0aF9tb2RlID0gV0xBTl9BVVRIX09QRU47CisJCWllZWUtPm9wZW5fd2VwID0gMTsKKwkJaWVlZS0+YXV0aF9tb2RlID0gMDsKKwl9CisJZWxzZSBpZiAodmFsdWUgJiBJV19BVVRIX0FMR19MRUFQKXsKKwkJc2VjLmF1dGhfbW9kZSA9IFdMQU5fQVVUSF9MRUFQOworCQlpZWVlLT5vcGVuX3dlcCA9IDE7CisJCWllZWUtPmF1dGhfbW9kZSA9IDI7CisJfQorCisKKwlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQorCQlpZWVlLT5zZXRfc2VjdXJpdHkoaWVlZS0+ZGV2LCAmc2VjKTsKKwkvL2Vsc2UKKwkvLwlyZXQgPSAtRU9QTk9UU1VQUDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9zZXRfcGFyYW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4IG5hbWUsIHUzMiB2YWx1ZSkKK3sKKwlpbnQgcmV0PTA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN3aXRjaCAobmFtZSkgeworCWNhc2UgSUVFRV9QQVJBTV9XUEFfRU5BQkxFRDoKKwkJcmV0ID0gaWVlZTgwMjExX3dwYV9lbmFibGUoaWVlZSwgdmFsdWUpOworCQlicmVhazsKKworCWNhc2UgSUVFRV9QQVJBTV9US0lQX0NPVU5URVJNRUFTVVJFUzoKKwkJaWVlZS0+dGtpcF9jb3VudGVybWVhc3VyZXM9dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX1BBUkFNX0RST1BfVU5FTkNSWVBURUQ6IHsKKwkJLyogSEFDSzoKKwkJICoKKwkJICogd3BhX3N1cHBsaWNhbnQgY2FsbHMgc2V0X3dwYV9lbmFibGVkIHdoZW4gdGhlIGRyaXZlcgorCQkgKiBpcyBsb2FkZWQgYW5kIHVubG9hZGVkLCByZWdhcmRsZXNzIG9mIGlmIFdQQSBpcyBiZWluZworCQkgKiB1c2VkLiAgTm8gb3RoZXIgY2FsbHMgYXJlIG1hZGUgd2hpY2ggY2FuIGJlIHVzZWQgdG8KKwkJICogZGV0ZXJtaW5lIGlmIGVuY3J5cHRpb24gd2lsbCBiZSB1c2VkIG9yIG5vdCBwcmlvciB0bworCQkgKiBhc3NvY2lhdGlvbiBiZWluZyBleHBlY3RlZC4gIElmIGVuY3J5cHRpb24gaXMgbm90IGJlaW5nCisJCSAqIHVzZWQsIGRyb3BfdW5lbmNyeXB0ZWQgaXMgc2V0IHRvIGZhbHNlLCBlbHNlIHRydWUgLS0gd2UKKwkJICogY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZSBpZiB0aGUgQ0FQX1BSSVZBQ1lfT04gYml0IHNob3VsZAorCQkgKiBiZSBzZXQuCisJCSAqLworCQlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKwkJCS5mbGFncyA9IFNFQ19FTkFCTEVELAorCQkJLmVuYWJsZWQgPSB2YWx1ZSwKKwkJfTsKKwkJaWVlZS0+ZHJvcF91bmVuY3J5cHRlZCA9IHZhbHVlOworCQkvKiBXZSBvbmx5IGNoYW5nZSBTRUNfTEVWRUwgZm9yIG9wZW4gbW9kZS4gT3RoZXJzCisJCSAqIGFyZSBzZXQgYnkgaXB3X3dwYV9zZXRfZW5jcnlwdGlvbi4KKwkJICovCisJCWlmICghdmFsdWUpIHsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMDsKKwkJfQorCQllbHNlIHsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsKKwkJfQorCQlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQorCQkJaWVlZS0+c2V0X3NlY3VyaXR5KGllZWUtPmRldiwgJnNlYyk7CisJCWJyZWFrOworCX0KKworCWNhc2UgSUVFRV9QQVJBTV9QUklWQUNZX0lOVk9LRUQ6CisJCWllZWUtPnByaXZhY3lfaW52b2tlZD12YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIElFRUVfUEFSQU1fQVVUSF9BTEdTOgorCQlyZXQgPSBpZWVlODAyMTFfd3BhX3NldF9hdXRoX2FsZ3MoaWVlZSwgdmFsdWUpOworCQlicmVhazsKKworCWNhc2UgSUVFRV9QQVJBTV9JRUVFXzgwMl8xWDoKKwkJaWVlZS0+aWVlZTgwMl8xeD12YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFX1BBUkFNX1dQQVhfU0VMRUNUOgorCQkvLyBhZGRlZCBmb3IgV1BBMiBtaXhlZCBtb2RlCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2ssZmxhZ3MpOworCQlpZWVlLT53cGF4X3R5cGVfc2V0ID0gMTsKKwkJaWVlZS0+d3BheF90eXBlX25vdGlmeSA9IHZhbHVlOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2ssZmxhZ3MpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiVW5rbm93biBXUEEgcGFyYW06ICVkXG4iLG5hbWUpOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBpbXBsZW1lbnRhdGlvbiBib3Jyb3dlZCBmcm9tIGhvc3RhcCBkcml2ZXIgKi8KKworc3RhdGljIGludCBpZWVlODAyMTFfd3BhX3NldF9lbmNyeXB0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgc3RydWN0IGllZWVfcGFyYW0gKnBhcmFtLCBpbnQgcGFyYW1fbGVuKQoreworCWludCByZXQgPSAwOworCisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHM7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqY3J5cHQ7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKwkJLmZsYWdzID0gMCwKKwl9OworCisJcGFyYW0tPnUuY3J5cHQuZXJyID0gMDsKKwlwYXJhbS0+dS5jcnlwdC5hbGdbSUVFRV9DUllQVF9BTEdfTkFNRV9MRU4gLSAxXSA9ICdcMCc7CisKKwlpZiAocGFyYW1fbGVuICE9CisJICAgIChpbnQpICgoY2hhciAqKSBwYXJhbS0+dS5jcnlwdC5rZXkgLSAoY2hhciAqKSBwYXJhbSkgKworCSAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuKSB7CisJCXByaW50aygiTGVuIG1pc21hdGNoICVkLCAlZFxuIiwgcGFyYW1fbGVuLAorCQkJICAgICAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHBhcmFtLT5zdGFfYWRkclswXSA9PSAweGZmICYmIHBhcmFtLT5zdGFfYWRkclsxXSA9PSAweGZmICYmCisJICAgIHBhcmFtLT5zdGFfYWRkclsyXSA9PSAweGZmICYmIHBhcmFtLT5zdGFfYWRkclszXSA9PSAweGZmICYmCisJICAgIHBhcmFtLT5zdGFfYWRkcls0XSA9PSAweGZmICYmIHBhcmFtLT5zdGFfYWRkcls1XSA9PSAweGZmKSB7CisJCWlmIChwYXJhbS0+dS5jcnlwdC5pZHggPj0gV0VQX0tFWVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY3J5cHQgPSAmaWVlZS0+Y3J5cHRbcGFyYW0tPnUuY3J5cHQuaWR4XTsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIm5vbmUiKSA9PSAwKSB7CisJCWlmIChjcnlwdCkgeworCQkJc2VjLmVuYWJsZWQgPSAwOworCQkJLy8gRklYTUUgRklYTUUKKwkJCS8vc2VjLmVuY3J5cHQgPSAwOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzA7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQgfCBTRUNfTEVWRUw7CisJCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOworCQl9CisJCWdvdG8gZG9uZTsKKwl9CisJc2VjLmVuYWJsZWQgPSAxOworLy8gRklYTUUgRklYTUUKKy8vCXNlYy5lbmNyeXB0ID0gMTsKKwlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQ7CisKKwkvKiBJUFcgSFcgY2Fubm90IGJ1aWxkIFRLSVAgTUlDLCBob3N0IGRlY3J5cHRpb24gc3RpbGwgbmVlZGVkLiAqLworCWlmICghKGllZWUtPmhvc3RfZW5jcnlwdCB8fCBpZWVlLT5ob3N0X2RlY3J5cHQpICYmCisJICAgIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJUS0lQIikpCisJCWdvdG8gc2tpcF9ob3N0X2NyeXB0OworCisJb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7CisJaWYgKG9wcyA9PSBOVUxMICYmIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJpZWVlODAyMTFfY3J5cHRfd2VwIik7CisJCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOworCQkvL3NldCBXRVA0MCBmaXJzdCwgaXQgd2lsbCBiZSBtb2RpZmllZCBhY2NvcmRpbmcgdG8gV0VQMTA0IG9yIFdFUDQwIGF0IG90aGVyIHBsYWNlCisJfSBlbHNlIGlmIChvcHMgPT0gTlVMTCAmJiBzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiVEtJUCIpID09IDApIHsKKwkJcmVxdWVzdF9tb2R1bGUoImllZWU4MDIxMV9jcnlwdF90a2lwIik7CisJCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOworCX0gZWxzZSBpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIkNDTVAiKSA9PSAwKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJpZWVlODAyMTFfY3J5cHRfY2NtcCIpOworCQlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKKwl9CisJaWYgKG9wcyA9PSBOVUxMKSB7CisJCXByaW50aygidW5rbm93biBjcnlwdG8gYWxnICclcydcbiIsIHBhcmFtLT51LmNyeXB0LmFsZyk7CisJCXBhcmFtLT51LmNyeXB0LmVyciA9IElFRUVfQ1JZUFRfRVJSX1VOS05PV05fQUxHOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKCpjcnlwdCA9PSBOVUxMIHx8ICgqY3J5cHQpLT5vcHMgIT0gb3BzKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqbmV3X2NyeXB0OworCisJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CisKKwkJbmV3X2NyeXB0ID0gKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKQorCQkJa21hbGxvYyhzaXplb2YoKm5ld19jcnlwdCksIEdGUF9LRVJORUwpOworCQlpZiAobmV3X2NyeXB0ID09IE5VTEwpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJbWVtc2V0KG5ld19jcnlwdCwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSkpOworCQluZXdfY3J5cHQtPm9wcyA9IG9wczsKKwkJaWYgKG5ld19jcnlwdC0+b3BzICYmIHRyeV9tb2R1bGVfZ2V0KG5ld19jcnlwdC0+b3BzLT5vd25lcikpCisJCQluZXdfY3J5cHQtPnByaXYgPQorCQkJCW5ld19jcnlwdC0+b3BzLT5pbml0KHBhcmFtLT51LmNyeXB0LmlkeCk7CisKKwkJaWYgKG5ld19jcnlwdC0+cHJpdiA9PSBOVUxMKSB7CisJCQlrZnJlZShuZXdfY3J5cHQpOworCQkJcGFyYW0tPnUuY3J5cHQuZXJyID0gSUVFRV9DUllQVF9FUlJfQ1JZUFRfSU5JVF9GQUlMRUQ7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBkb25lOworCQl9CisKKwkJKmNyeXB0ID0gbmV3X2NyeXB0OworCX0KKworCWlmIChwYXJhbS0+dS5jcnlwdC5rZXlfbGVuID4gMCAmJiAoKmNyeXB0KS0+b3BzLT5zZXRfa2V5ICYmCisJICAgICgqY3J5cHQpLT5vcHMtPnNldF9rZXkocGFyYW0tPnUuY3J5cHQua2V5LAorCQkJCSAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4sIHBhcmFtLT51LmNyeXB0LnNlcSwKKwkJCQkgICAoKmNyeXB0KS0+cHJpdikgPCAwKSB7CisJCXByaW50aygia2V5IHNldHRpbmcgZmFpbGVkXG4iKTsKKwkJcGFyYW0tPnUuY3J5cHQuZXJyID0gSUVFRV9DUllQVF9FUlJfS0VZX1NFVF9GQUlMRUQ7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKyBza2lwX2hvc3RfY3J5cHQ6CisJaWYgKHBhcmFtLT51LmNyeXB0LnNldF90eCkgeworCQlpZWVlLT50eF9rZXlpZHggPSBwYXJhbS0+dS5jcnlwdC5pZHg7CisJCXNlYy5hY3RpdmVfa2V5ID0gcGFyYW0tPnUuY3J5cHQuaWR4OworCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7CisJfSBlbHNlCisJCXNlYy5mbGFncyAmPSB+U0VDX0FDVElWRV9LRVk7CisKKwlpZiAocGFyYW0tPnUuY3J5cHQuYWxnICE9IE5VTEwpIHsKKwkJbWVtY3B5KHNlYy5rZXlzW3BhcmFtLT51LmNyeXB0LmlkeF0sCisJCSAgICAgICBwYXJhbS0+dS5jcnlwdC5rZXksCisJCSAgICAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuKTsKKwkJc2VjLmtleV9zaXplc1twYXJhbS0+dS5jcnlwdC5pZHhdID0gcGFyYW0tPnUuY3J5cHQua2V5X2xlbjsKKwkJc2VjLmZsYWdzIHw9ICgxIDw8IHBhcmFtLT51LmNyeXB0LmlkeCk7CisKKwkJaWYgKHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwKSB7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzE7CisJCX0gZWxzZSBpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIlRLSVAiKSA9PSAwKSB7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzI7CisJCX0gZWxzZSBpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIkNDTVAiKSA9PSAwKSB7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzM7CisJCX0KKwl9CisgZG9uZToKKwlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQorCQlpZWVlLT5zZXRfc2VjdXJpdHkoaWVlZS0+ZGV2LCAmc2VjKTsKKworCS8qIERvIG5vdCByZXNldCBwb3J0IGlmIGNhcmQgaXMgaW4gTWFuYWdlZCBtb2RlIHNpbmNlIHJlc2V0dGluZyB3aWxsCisJICogZ2VuZXJhdGUgbmV3IElFRUUgODAyLjExIGF1dGhlbnRpY2F0aW9uIHdoaWNoIG1heSBlbmQgdXAgaW4gbG9vcGluZworCSAqIHdpdGggSUVFRSA4MDIuMVguICBJZiB5b3VyIGhhcmR3YXJlIHJlcXVpcmVzIGEgcmVzZXQgYWZ0ZXIgV0VQCisJICogY29uZmlndXJhdGlvbiAoZm9yIGV4YW1wbGUuLi4gUHJpc20yKSwgaW1wbGVtZW50IHRoZSByZXNldF9wb3J0IGluCisJICogdGhlIGNhbGxiYWNrcyBzdHJ1Y3R1cmVzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgODAyLjExIHN0YWNrLiAqLworCWlmIChpZWVlLT5yZXNldF9vbl9rZXljaGFuZ2UgJiYKKwkgICAgaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBICYmCisJICAgIGllZWUtPnJlc2V0X3BvcnQgJiYKKwkgICAgaWVlZS0+cmVzZXRfcG9ydChpZWVlLT5kZXYpKSB7CisJCXByaW50aygicmVzZXRfcG9ydCBmYWlsZWRcbiIpOworCQlwYXJhbS0+dS5jcnlwdC5lcnIgPSBJRUVFX0NSWVBUX0VSUl9DQVJEX0NPTkZfRkFJTEVEOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9kaXNhc3NvY2lhdGVfc2tiKAorCQkJCQkJCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uLAorCQkJCQkJCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQkJCXU4CWFzUnNuKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvYyAqZGlzYXNzOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvYykpOworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWRpc2FzcyA9IChzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jICopIHNrYl9wdXQoc2tiLHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jKSk7CisJZGlzYXNzLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DKTsKKwlkaXNhc3MtPmhlYWRlci5kdXJhdGlvbl9pZCA9IDA7CisKKwltZW1jcHkoZGlzYXNzLT5oZWFkZXIuYWRkcjEsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKKwltZW1jcHkoZGlzYXNzLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoZGlzYXNzLT5oZWFkZXIuYWRkcjMsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKKworCWRpc2Fzcy0+cmVhc29uID0gYXNSc247CisJcmV0dXJuIHNrYjsKK30KKworCit2b2lkCitTZW5kRGlzYXNzb2NpYXRpb24oCisJCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQl1OCogCQkJCQlhc1N0YSwKKwkJdTgJCQkJCQlhc1JzbgorKQoreworCQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXNrYiA9IGllZWU4MDIxMV9kaXNhc3NvY2lhdGVfc2tiKGJlYWNvbixpZWVlLGFzUnNuKTsKKwkJaWYgKHNrYil7CisJCQkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJCQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCQl9Cit9CisKK2ludCBpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19wb2ludCAqcCkKK3sKKwlzdHJ1Y3QgaWVlZV9wYXJhbSAqcGFyYW07CisJaW50IHJldD0wOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKwkvL0lFRUVfREVCVUdfSU5GTygid3BhX3N1cHBsaWNhbnQ6IGxlbj0lZFxuIiwgcC0+bGVuZ3RoKTsKKworCWlmIChwLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGllZWVfcGFyYW0pIHx8ICFwLT5wb2ludGVyKXsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcGFyYW0gPSAoc3RydWN0IGllZWVfcGFyYW0gKilrbWFsbG9jKHAtPmxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKHBhcmFtID09IE5VTEwpeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKHBhcmFtLCBwLT5wb2ludGVyLCBwLT5sZW5ndGgpKSB7CisJCWtmcmVlKHBhcmFtKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJc3dpdGNoIChwYXJhbS0+Y21kKSB7CisKKwljYXNlIElFRUVfQ01EX1NFVF9XUEFfUEFSQU06CisJCXJldCA9IGllZWU4MDIxMV93cGFfc2V0X3BhcmFtKGllZWUsIHBhcmFtLT51LndwYV9wYXJhbS5uYW1lLAorCQkJCQlwYXJhbS0+dS53cGFfcGFyYW0udmFsdWUpOworCQlicmVhazsKKworCWNhc2UgSUVFRV9DTURfU0VUX1dQQV9JRToKKwkJcmV0ID0gaWVlZTgwMjExX3dwYV9zZXRfd3BhX2llKGllZWUsIHBhcmFtLCBwLT5sZW5ndGgpOworCQlicmVhazsKKworCWNhc2UgSUVFRV9DTURfU0VUX0VOQ1JZUFRJT046CisJCXJldCA9IGllZWU4MDIxMV93cGFfc2V0X2VuY3J5cHRpb24oaWVlZSwgcGFyYW0sIHAtPmxlbmd0aCk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX0NNRF9NTE1FOgorCQlyZXQgPSBpZWVlODAyMTFfd3BhX21sbWUoaWVlZSwgcGFyYW0tPnUubWxtZS5jb21tYW5kLAorCQkJCSAgIHBhcmFtLT51Lm1sbWUucmVhc29uX2NvZGUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiVW5rbm93biBXUEEgc3VwcGxpY2FudCByZXF1ZXN0OiAlZFxuIixwYXJhbS0+Y21kKTsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCX0KKworCWlmIChyZXQgPT0gMCAmJiBjb3B5X3RvX3VzZXIocC0+cG9pbnRlciwgcGFyYW0sIHAtPmxlbmd0aCkpCisJCXJldCA9IC1FRkFVTFQ7CisKKwlrZnJlZShwYXJhbSk7CitvdXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG5vdGlmeV93eF9hc3NvY19ldmVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKKwkJbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKwllbHNlCisJCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCXdpcmVsZXNzX3NlbmRfZXZlbnQoaWVlZS0+ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKK30KKworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZ2V0X2JlYWNvbik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93YWtlX3F1ZXVlKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0b3BfcXVldWUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcmVzZXRfcXVldWUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2wpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfaXNfc2hvcnRzbG90KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2lzXzU0Zyk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9wc190eF9hY2spOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc29mdG1hY194bWl0KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKTsKK0VYUE9SVF9TWU1CT0wobm90aWZ5X3d4X2Fzc29jX2V2ZW50KTsKK0VYUE9SVF9TWU1CT0woU2VuZERpc2Fzc29jaWF0aW9uKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdGFydF9zZW5kX2JlYWNvbnMpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RvcF9zY2FuKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybyk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyk7CisvL0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMzVjMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjX3d4LmMKQEAgLTAsMCArMSw2MTUgQEAKKy8qIElFRUUgODAyLjExIFNvZnRNQUMgbGF5ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgKgorICogTW9zdGx5IGV4dHJhY3RlZCBmcm9tIHRoZSBydGw4MTgwLXNhMjQwMCBkcml2ZXIgZm9yIHRoZQorICogaW4ta2VybmVsIGdlbmVyaWMgaWVlZTgwMi4xMSBzdGFjay4KKyAqCisgKiBTb21lIHBpZWNlcyBvZiBjb2RlIG1pZ2h0IGJlIHN0b2xlbiBmcm9tIGlwdzIxMDAgZHJpdmVyCisgKiBjb3B5cmlnaHQgb2Ygd2hvIG93biBpdCdzIGNvcHlyaWdodCA7LSkKKyAqCisgKiBQUyB3eCBoYW5kbGVyIG1vc3RseSBzdG9sZW4gZnJvbSBob3N0YXAsIGNvcHlyaWdodCB3aG8KKyAqIG93biBpdCdzIGNvcHlyaWdodCA7LSkKKyAqCisgKiByZWxlYXNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisjaWZkZWYgRU5BQkxFX0RPVDExRAorI2luY2x1ZGUgImRvdDExZC5oIgorI2VuZGlmCisvKiBGSVhNRTogYWRkIEEgZnJlcXMgKi8KKworY29uc3QgbG9uZyBpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llc1tdID0geworCTI0MTIsIDI0MTcsIDI0MjIsIDI0MjcsCisJMjQzMiwgMjQzNywgMjQ0MiwgMjQ0NywKKwkyNDUyLCAyNDU3LCAyNDYyLCAyNDY3LAorCTI0NzIsIDI0ODQKK307CisKKworaW50IGllZWU4MDIxMV93eF9zZXRfZnJlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpd19mcmVxICpmd3JxID0gJiB3cnF1LT5mcmVxOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSl7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBpZiBzZXR0aW5nIGJ5IGZyZXEgY29udmVydCB0byBjaGFubmVsICovCisJaWYgKGZ3cnEtPmUgPT0gMSkgeworCQlpZiAoKGZ3cnEtPm0gPj0gKGludCkgMi40MTJlOCAmJgorCQkgICAgIGZ3cnEtPm0gPD0gKGludCkgMi40ODdlOCkpIHsKKwkJCWludCBmID0gZndycS0+bSAvIDEwMDAwMDsKKwkJCWludCBjID0gMDsKKworCQkJd2hpbGUgKChjIDwgMTQpICYmIChmICE9IGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzW2NdKSkKKwkJCQljKys7CisKKwkJCS8qIGhhY2sgdG8gZmFsbCB0aHJvdWdoICovCisJCQlmd3JxLT5lID0gMDsKKwkJCWZ3cnEtPm0gPSBjICsgMTsKKwkJfQorCX0KKworCWlmIChmd3JxLT5lID4gMCB8fCBmd3JxLT5tID4gMTQgfHwgZndycS0+bSA8IDEgKXsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCisJfWVsc2UgeyAvKiBTZXQgdGhlIGNoYW5uZWwgKi8KKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJaWYgKCEoR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcClbZndycS0+bV0pIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorI2VuZGlmCisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gZndycS0+bTsKKwkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisKKwkJaWYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DIHx8IGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpCisJCQlpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKXsKKworCQkJaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKGllZWUpOworCQkJaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhpZWVlKTsKKwkJCX0KKwl9CisKKwlyZXQgPSAwOworb3V0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKworaW50IGllZWU4MDIxMV93eF9nZXRfZnJlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlzdHJ1Y3QgaXdfZnJlcSAqZndycSA9ICYgd3JxdS0+ZnJlcTsKKworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAwKQorCQlyZXR1cm4gLTE7CisJLy9OTSAwLjcuMCB3aWxsIG5vdCBhY2NlcHQgY2hhbm5lbCBhbnkgbW9yZS4KKwlmd3JxLT5tID0gaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwtMV0gKiAxMDAwMDA7CisJZndycS0+ZSA9IDE7CisvLwlmd3JxLT5tID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw7CisvLwlmd3JxLT5lID0gMDsKKworCXJldHVybiAwOworfQorCitpbnQgaWVlZTgwMjExX3d4X2dldF93YXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJd3JxdS0+YXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXJldHVybiAtMTsKKworCS8qIFdlIHdhbnQgYXZvaWQgdG8gZ2l2ZSB0byB0aGUgdXNlciBpbmNvbnNpc3RlbnQgaW5mb3MqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCAmJgorCQlpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HICYmCisJCWllZWUtPndhcF9zZXQgPT0gMCkKKworCQltZW1zZXQod3JxdS0+YXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJZWxzZQorCQltZW1jcHkod3JxdS0+YXBfYWRkci5zYV9kYXRhLAorCQkgICAgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgaWVlZTgwMjExX3d4X3NldF93YXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSB1bmlvbiBpd3JlcV9kYXRhICphd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCisJaW50IHJldCA9IDA7CisJdTggemVyb1tdID0gezAsMCwwLDAsMCwwfTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2hvcnQgaWZ1cCA9IGllZWUtPnByb3RvX3N0YXJ0ZWQ7Ly9kZXYtPmZsYWdzICYgSUZGX1VQOworCXN0cnVjdCBzb2NrYWRkciAqdGVtcCA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhd3JxOworCisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKwkvKiB1c2UgaWZjb25maWcgaHcgZXRoZXIgKi8KKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUil7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodGVtcC0+c2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUil7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChpZnVwKQorCQlpZWVlODAyMTFfc3RvcF9wcm90b2NvbChpZWVlKTsKKworCS8qIGp1c3QgdG8gYXZvaWQgdG8gZ2l2ZSBpbmNvbnNpc3RlbnQgaW5mb3MgaW4gdGhlCisJICogZ2V0IHd4IG1ldGhvZC4gbm90IHJlYWxseSBuZWVkZWQgb3RoZXJ3aXNlCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCW1lbWNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIHRlbXAtPnNhX2RhdGEsIEVUSF9BTEVOKTsKKwlpZWVlLT53YXBfc2V0ID0gbWVtY21wKHRlbXAtPnNhX2RhdGEsIHplcm8sRVRIX0FMRU4pIT0wOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYgKGlmdXApCisJCWllZWU4MDIxMV9zdGFydF9wcm90b2NvbChpZWVlKTsKK291dDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisgaW50IGllZWU4MDIxMV93eF9nZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsdW5pb24gaXdyZXFfZGF0YSAqd3JxdSxjaGFyICpiKQoreworCWludCBsZW4scmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQlyZXR1cm4gLTE7CisKKwkvKiBXZSB3YW50IGF2b2lkIHRvIGdpdmUgdG8gdGhlIHVzZXIgaW5jb25zaXN0ZW50IGluZm9zKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkWzBdID09ICdcMCcgfHwKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQgJiYKKwkJaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORyAmJgorCQlpZWVlLT5zc2lkX3NldCA9PSAwKXsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKwlsZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW47CisJd3JxdS0+ZXNzaWQubGVuZ3RoID0gbGVuOworCXN0cm5jcHkoYixpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCxsZW4pOworCXdycXUtPmVzc2lkLmZsYWdzID0gMTsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7CisKK30KKworaW50IGllZWU4MDIxMV93eF9zZXRfcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKwl1MzIgdGFyZ2V0X3JhdGUgPSB3cnF1LT5iaXRyYXRlLnZhbHVlOworCisJaWVlZS0+cmF0ZSA9IHRhcmdldF9yYXRlLzEwMDAwMDsKKwkvL0ZJWE1FOiB3ZSBtaWdodCB3YW50IHRvIGxpbWl0IHJhdGUgYWxzbyBpbiBtYW5hZ2VtZW50IHByb3RvY29scy4KKwlyZXR1cm4gMDsKK30KKworCisKK2ludCBpZWVlODAyMTFfd3hfZ2V0X3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXUzMiB0bXBfcmF0ZTsKKwl0bXBfcmF0ZSA9IFR4Q291bnRUb0RhdGFSYXRlKGllZWUsIGllZWUtPnNvZnRtYWNfc3RhdHMuQ3VycmVudFNob3dUeGF0ZSk7CisKKwl3cnF1LT5iaXRyYXRlLnZhbHVlID0gdG1wX3JhdGUgKiA1MDAwMDA7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgaWVlZTgwMjExX3d4X3NldF9ydHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWlmICh3cnF1LT5ydHMuZGlzYWJsZWQgfHwgIXdycXUtPnJ0cy5maXhlZCkKKwkJaWVlZS0+cnRzID0gREVGQVVMVF9SVFNfVEhSRVNIT0xEOworCWVsc2UKKwl7CisJCWlmICh3cnF1LT5ydHMudmFsdWUgPCBNSU5fUlRTX1RIUkVTSE9MRCB8fAorCQkJCXdycXUtPnJ0cy52YWx1ZSA+IE1BWF9SVFNfVEhSRVNIT0xEKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWllZWUtPnJ0cyA9IHdycXUtPnJ0cy52YWx1ZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfZ2V0X3J0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJd3JxdS0+cnRzLnZhbHVlID0gaWVlZS0+cnRzOworCXdycXUtPnJ0cy5maXhlZCA9IDA7CS8qIG5vIGF1dG8gc2VsZWN0ICovCisJd3JxdS0+cnRzLmRpc2FibGVkID0gKHdycXUtPnJ0cy52YWx1ZSA9PSBERUZBVUxUX1JUU19USFJFU0hPTEQpOworCXJldHVybiAwOworfQoraW50IGllZWU4MDIxMV93eF9zZXRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKworCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZiAod3JxdS0+bW9kZSA9PSBpZWVlLT5pd19tb2RlKQorCQlnb3RvIG91dDsKKworCWlmICh3cnF1LT5tb2RlID09IElXX01PREVfTU9OSVRPUil7CisKKwkJaWVlZS0+ZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMTsKKwl9ZWxzZXsKKwkJaWVlZS0+ZGV2LT50eXBlID0gQVJQSFJEX0VUSEVSOworCX0KKworCWlmICghaWVlZS0+cHJvdG9fc3RhcnRlZCl7CisJCWllZWUtPml3X21vZGUgPSB3cnF1LT5tb2RlOworCX1lbHNleworCQlpZWVlODAyMTFfc3RvcF9wcm90b2NvbChpZWVlKTsKKwkJaWVlZS0+aXdfbW9kZSA9IHdycXUtPm1vZGU7CisJCWllZWU4MDIxMV9zdGFydF9wcm90b2NvbChpZWVlKTsKKwl9CisKK291dDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpZWVlODAyMTFfd3hfc3luY19zY2FuX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgd3hfc3luY19zY2FuX3dxKTsKKwlzaG9ydCBjaGFuOworCUhUX0VYVENITkxfT0ZGU0VUIGNoYW5fb2Zmc2V0PTA7CisJSFRfQ0hBTk5FTF9XSURUSCBiYW5kd2lkdGg9MDsKKwlpbnQgYjQwTSA9IDA7CisJc3RhdGljIGludCBjb3VudCA9IDA7CisJY2hhbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsOworCW5ldGlmX2NhcnJpZXJfb2ZmKGllZWUtPmRldik7CisKKwlpZiAoaWVlZS0+ZGF0YV9oYXJkX3N0b3ApCisJCWllZWUtPmRhdGFfaGFyZF9zdG9wKGllZWUtPmRldik7CisKKwlpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoaWVlZSk7CisKKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkc7CisJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKwlpZWVlLT5Jbml0aWFsR2FpbkhhbmRsZXIoaWVlZS0+ZGV2LElHX0JhY2t1cCk7CisJaWYgKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ICYmIGllZWUtPnBIVEluZm8tPmJFbmFibGVIVCAmJiBpZWVlLT5wSFRJbmZvLT5iQ3VyQlc0ME1IeikgeworCQliNDBNID0gMTsKKwkJY2hhbl9vZmZzZXQgPSBpZWVlLT5wSFRJbmZvLT5DdXJTVEFFeHRDaG5sT2Zmc2V0OworCQliYW5kd2lkdGggPSAoSFRfQ0hBTk5FTF9XSURUSClpZWVlLT5wSFRJbmZvLT5iQ3VyQlc0ME1IejsKKwkJcHJpbnRrKCJTY2FuIGluIDQwTSwgZm9yY2UgdG8gMjBNIGZpcnN0OiVkLCAlZFxuIiwgY2hhbl9vZmZzZXQsIGJhbmR3aWR0aCk7CisJCWllZWUtPlNldEJXTW9kZUhhbmRsZXIoaWVlZS0+ZGV2LCBIVF9DSEFOTkVMX1dJRFRIXzIwLCBIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQpOworCQl9CisJaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKGllZWUpOworCWlmIChiNDBNKSB7CisJCXByaW50aygiU2NhbiBpbiAyME0sIGJhY2sgdG8gNDBNXG4iKTsKKwkJaWYgKGNoYW5fb2Zmc2V0ID09IEhUX0VYVENITkxfT0ZGU0VUX1VQUEVSKQorCQkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBjaGFuICsgMik7CisJCWVsc2UgaWYgKGNoYW5fb2Zmc2V0ID09IEhUX0VYVENITkxfT0ZGU0VUX0xPV0VSKQorCQkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBjaGFuIC0gMik7CisJCWVsc2UKKwkJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgY2hhbik7CisJCWllZWUtPlNldEJXTW9kZUhhbmRsZXIoaWVlZS0+ZGV2LCBiYW5kd2lkdGgsIGNoYW5fb2Zmc2V0KTsKKwl9IGVsc2UgeworCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGNoYW4pOworCX0KKworCWllZWUtPkluaXRpYWxHYWluSGFuZGxlcihpZWVlLT5kZXYsSUdfUmVzdG9yZSk7CisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOworCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CisJLy8gVG8gcHJldmVudCB0aGUgaW1tZWRpYXRlbHkgY2FsbGluZyB3YXRjaF9kb2cgYWZ0ZXIgc2Nhbi4KKwlpZihpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2QmNuSW5QZXJpb2Q9PTB8fGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZEYXRhSW5QZXJpb2Q9PTAgKQorCXsKKwkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kID0gMTsKKwkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZD0gMTsKKwl9CisJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKworCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyB8fCBpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKQorCQlpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKGllZWUpOworCisJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworCWNvdW50ID0gMDsKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKworfQorCitpbnQgaWVlZTgwMjExX3d4X3NldF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCWludCByZXQgPSAwOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUiB8fCAhKGllZWUtPnByb3RvX3N0YXJ0ZWQpKXsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCWlmICggaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCl7CisJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT53eF9zeW5jX3NjYW5fd3EpOworCQkvKiBpbnRlbnRpb25hbGx5IGZvcmdldCB0byB1cCBzZW0gKi8KKwkJcmV0dXJuIDA7CisJfQorCitvdXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGllZWU4MDIxMV93eF9zZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKwlpbnQgcmV0PTAsbGVuOworCXNob3J0IHByb3RvX3N0YXJ0ZWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJcHJvdG9fc3RhcnRlZCA9IGllZWUtPnByb3RvX3N0YXJ0ZWQ7CisKKwlpZiAod3JxdS0+ZXNzaWQubGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpeworCQlyZXQ9IC1FMkJJRzsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKXsKKwkJcmV0PSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYocHJvdG9fc3RhcnRlZCkKKwkJaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woaWVlZSk7CisKKworCS8qIHRoaXMgaXMganVzdCB0byBiZSBzdXJlIHRoYXQgdGhlIEdFVCB3eCBjYWxsYmFjaworCSAqIGhhcyBjb25zaXN0ZW4gaW5mb3MuIG5vdCBuZWVkZWQgb3RoZXJ3aXNlCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmICh3cnF1LT5lc3NpZC5mbGFncyAmJiB3cnF1LT5lc3NpZC5sZW5ndGgpIHsKKwkJLy9maXJzdCBmbHVzaCBjdXJyZW50IG5ldHdvcmsuc3NpZAorCQlsZW4gPSAoKHdycXUtPmVzc2lkLmxlbmd0aC0xKSA8IElXX0VTU0lEX01BWF9TSVpFKSA/ICh3cnF1LT5lc3NpZC5sZW5ndGgtMSkgOiBJV19FU1NJRF9NQVhfU0laRTsKKwkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgZXh0cmEsIGxlbisxKTsKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gbGVuKzE7CisJCWllZWUtPnNzaWRfc2V0ID0gMTsKKwl9CisJZWxzZXsKKwkJaWVlZS0+c3NpZF9zZXQgPSAwOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZFswXSA9ICdcMCc7CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmIChwcm90b19zdGFydGVkKQorCQlpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2woaWVlZSk7CitvdXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworIGludCBpZWVlODAyMTFfd3hfZ2V0X21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisKKwl3cnF1LT5tb2RlID0gaWVlZS0+aXdfbW9kZTsKKwlyZXR1cm4gMDsKK30KKworIGludCBpZWVlODAyMTFfd3hfc2V0X3Jhd3R4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKwlpbnQgKnBhcm1zID0gKGludCAqKWV4dHJhOworCWludCBlbmFibGUgPSAocGFybXNbMF0gPiAwKTsKKwlzaG9ydCBwcmV2ID0gaWVlZS0+cmF3X3R4OworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmKGVuYWJsZSkKKwkJaWVlZS0+cmF3X3R4ID0gMTsKKwllbHNlCisJCWllZWUtPnJhd190eCA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPInJhdyBUWCBpcyAlc1xuIiwKKwkgICAgICBpZWVlLT5yYXdfdHggPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKworCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCXsKKwkJaWYocHJldiA9PSAwICYmIGllZWUtPnJhd190eCl7CisJCQlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisKKwkJCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKKwkJfQorCisJCWlmKHByZXYgJiYgaWVlZS0+cmF3X3R4ID09IDEpCisJCQluZXRpZl9jYXJyaWVyX29mZihpZWVlLT5kZXYpOworCX0KKworCXVwKCZpZWVlLT53eF9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfZ2V0X25hbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cmNweSh3cnF1LT5uYW1lLCAiODAyLjExIik7CisJaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTil7CisJCXN0cmNhdCh3cnF1LT5uYW1lLCAiYiIpOworCQlpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikKKwkJCXN0cmNhdCh3cnF1LT5uYW1lLCAiL2ciKTsKKwl9ZWxzZSBpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikKKwkJc3RyY2F0KHdycXUtPm5hbWUsICJnIik7CisJaWYgKGllZWUtPm1vZGUgJiAoSUVFRV9OXzI0RyB8IElFRUVfTl81RykpCisJCXN0cmNhdCh3cnF1LT5uYW1lLCAiL24iKTsKKworCWlmKChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSB8fAorCQkoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORykpCisJCXN0cmNhdCh3cnF1LT5uYW1lLCIgbGlua2VkIik7CisJZWxzZSBpZihpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTk9MSU5LKQorCQlzdHJjYXQod3JxdS0+bmFtZSwiIGxpbmsuLiIpOworCisKKwlyZXR1cm4gMDsKK30KKworCisvKiB0aGlzIGlzIG1vc3RseSBzdG9sZW4gZnJvbSBob3N0YXAgKi8KK2ludCBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJaWYgKHdycXUtPnBvd2VyLmRpc2FibGVkKXsKKwkJaWVlZS0+cHMgPSBJRUVFODAyMTFfUFNfRElTQUJMRUQ7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKHdycXUtPnBvd2VyLmZsYWdzICYgSVdfUE9XRVJfVElNRU9VVCkgeworCQkvL2llZWUtPnBzX3BlcmlvZCA9IHdycXUtPnBvd2VyLnZhbHVlIC8gMTAwMDsKKwkJaWVlZS0+cHNfdGltZW91dCA9IHdycXUtPnBvd2VyLnZhbHVlIC8gMTAwMDsKKwl9CisKKwlpZiAod3JxdS0+cG93ZXIuZmxhZ3MgJiBJV19QT1dFUl9QRVJJT0QpIHsKKworCQkvL2llZWUtPnBzX3RpbWVvdXQgPSB3cnF1LT5wb3dlci52YWx1ZSAvIDEwMDA7CisJCWllZWUtPnBzX3BlcmlvZCA9IHdycXUtPnBvd2VyLnZhbHVlIC8gMTAwMDsKKwkJLy93cnEtPnZhbHVlIC8gMTAyNDsKKworCX0KKwlzd2l0Y2ggKHdycXUtPnBvd2VyLmZsYWdzICYgSVdfUE9XRVJfTU9ERSkgeworCWNhc2UgSVdfUE9XRVJfVU5JQ0FTVF9SOgorCQlpZWVlLT5wcyA9IElFRUU4MDIxMV9QU19VTklDQVNUOworCQlicmVhazsKKwljYXNlIElXX1BPV0VSX01VTFRJQ0FTVF9SOgorCQlpZWVlLT5wcyA9IElFRUU4MDIxMV9QU19NQkNBU1Q7CisJCWJyZWFrOworCWNhc2UgSVdfUE9XRVJfQUxMX1I6CisJCWllZWUtPnBzID0gSUVFRTgwMjExX1BTX1VOSUNBU1QgfCBJRUVFODAyMTFfUFNfTUJDQVNUOworCQlicmVhazsKKworCWNhc2UgSVdfUE9XRVJfT046CisJLy8JaWVlZS0+cHMgPSBJRUVFODAyMTFfUFNfRElTQUJMRUQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCisJfQorZXhpdDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworCit9CisKKy8qIHRoaXMgaXMgc3RvbGVuIGZyb20gaG9zdGFwICovCitpbnQgaWVlZTgwMjExX3d4X2dldF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9MDsKKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZihpZWVlLT5wcyA9PSBJRUVFODAyMTFfUFNfRElTQUJMRUQpeworCQl3cnF1LT5wb3dlci5kaXNhYmxlZCA9IDE7CisJCWdvdG8gZXhpdDsKKwl9CisKKwl3cnF1LT5wb3dlci5kaXNhYmxlZCA9IDA7CisKKwlpZiAoKHdycXUtPnBvd2VyLmZsYWdzICYgSVdfUE9XRVJfVFlQRSkgPT0gSVdfUE9XRVJfVElNRU9VVCkgeworCQl3cnF1LT5wb3dlci5mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7CisJCXdycXUtPnBvd2VyLnZhbHVlID0gaWVlZS0+cHNfdGltZW91dCAqIDEwMDA7CisJfSBlbHNlIHsKKy8vCQlyZXQgPSAtRU9QTk9UU1VQUDsKKy8vCQlnb3RvIGV4aXQ7CisJCXdycXUtPnBvd2VyLmZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOworCQl3cnF1LT5wb3dlci52YWx1ZSA9IGllZWUtPnBzX3BlcmlvZCAqIDEwMDA7CisvL2llZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX3BlcmlvZCAqIGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgKiAxMDI0OworCX0KKworICAgICAgIGlmICgoaWVlZS0+cHMgJiAoSUVFRTgwMjExX1BTX01CQ0FTVCB8IElFRUU4MDIxMV9QU19VTklDQVNUKSkgPT0gKElFRUU4MDIxMV9QU19NQkNBU1QgfCBJRUVFODAyMTFfUFNfVU5JQ0FTVCkpCisJCXdycXUtPnBvd2VyLmZsYWdzIHw9IElXX1BPV0VSX0FMTF9SOworCWVsc2UgaWYgKGllZWUtPnBzICYgSUVFRTgwMjExX1BTX01CQ0FTVCkKKwkJd3JxdS0+cG93ZXIuZmxhZ3MgfD0gSVdfUE9XRVJfTVVMVElDQVNUX1I7CisJZWxzZQorCQl3cnF1LT5wb3dlci5mbGFncyB8PSBJV19QT1dFUl9VTklDQVNUX1I7CisKK2V4aXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKKworfQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9lc3NpZCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfcmF0ZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfcmF0ZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfd2FwKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF93YXApOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X21vZGUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X21vZGUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X3NjYW4pOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X2ZyZXEpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X2ZyZXEpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X3Jhd3R4KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9uYW1lKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9wb3dlcik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfcG93ZXIpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llcyk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfcnRzKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9ydHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5YzM2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKQEAgLTAsMCArMSw5MTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKworICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKworICBDb250YWN0IEluZm9ybWF0aW9uOgorICBKYW1lcyBQLiBLZXRyZW5vcyA8aXB3MjEwMC1hZG1pbkBsaW51eC5pbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgRmV3IG1vZGlmaWNhdGlvbnMgZm9yIFJlYWx0ZWsncyBXaS1GaSBkcml2ZXJzIGJ5CisgIEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKworICBBIHNwZWNpYWwgdGhhbmtzIGdvZXMgdG8gUmVhbHRlayBmb3IgdGhlaXIgc3VwcG9ydCAhCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCisKKy8qCisKKworODAyLjExIERhdGEgRnJhbWUKKworCis4MDIuMTEgZnJhbWVfY29udG9ybCBmb3IgZGF0YSBmcmFtZXMgLSAyIGJ5dGVzCisgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK2JpdHMgfCAwICB8ICAxICB8ICAyICB8ICAzICB8ICA0ICB8ICA1ICB8ICA2ICB8ICA3ICB8ICA4ICB8ICA5ICB8ICBhICB8ICBiICB8ICBjICB8ICBkICB8ICBlICAgfAorICAgICB8LS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLS18Cit2YWwgIHwgMCAgfCAgMCAgfCAgMCAgfCAgMSAgfCAgeCAgfCAgMCAgfCAgMCAgfCAgMCAgfCAgMSAgfCAgMCAgfCAgeCAgfCAgeCAgfCAgeCAgfCAgeCAgfCAgeCAgIHwKKyAgICAgfC0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS0tfAorZGVzYyB8IF4tdmVyLV4gIHwgIF50eXBlLV4gIHwgIF4tLS0tLXN1YnR5cGUtLS0tLV4gIHwgdG8gIHxmcm9tIHxtb3JlIHxyZXRyeXwgcHdyIHxtb3JlIHx3ZXAgICB8CisgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgfCB4PTAgZGF0YSx4PTEgZGF0YSthY2sgfCBEUyAgfCBEUyAgfGZyYWcgfCAgICAgfCBtZ20gfGRhdGEgfCAgICAgIHwKKyAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzgwMi4xMSBEYXRhIEZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICwtLS0tLS0tLS0gJ2N0cmwnIGV4cGFuZHMgdG8gPi0tLS0tLS0tLS0tJworICAgICAgICAgIHwKKyAgICAgICwtLSctLS0sLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgIDIgICB8ICAyICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgMiAgIHwgMC4uMjMxMiB8ICAgNCAgfAorICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18CitEZXNjLiB8IGN0cmwgfCBkdXJhIHwgIERBL1JBICB8ICAgVEEgICAgfCAgICBTQSAgIHwgU2VxdSB8ICBGcmFtZSAgfCAgZmNzIHwKKyAgICAgIHwgICAgICB8IHRpb24gfCAoQlNTSUQpIHwgICAgICAgICB8ICAgICAgICAgfCBlbmNlIHwgIGRhdGEgICB8ICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgIHwtLS0tLS0nCitUb3RhbDogMjggbm9uLWRhdGEgYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgLS0tLS4tLS0tJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgLi0gJ0ZyYW1lIGRhdGEnIGV4cGFuZHMgdG8gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKyAgICAgICB8CisgICAgICAgVgorICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgIDEgICB8ICAxICAgfCAgICAxICAgIHwgICAgMyAgICAgfCAgMiAgIHwgIDAtMjMwNCB8CisgICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfAorRGVzYy4gfCBTTkFQIHwgU05BUCB8IENvbnRyb2wgfEV0aCBUdW5uZWx8IFR5cGUgfCBJUCAgICAgIHwKKyAgICAgIHwgRFNBUCB8IFNTQVAgfCAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwgUGFja2V0ICB8CisgICAgICB8IDB4QUEgfCAweEFBIHwweDAzIChVSSl8MHgwMC0wMC1GOHwgICAgICB8ICAgICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgIHwKK1RvdGFsOiA4IG5vbi1kYXRhIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgIGAtLS0tLi0tLS0nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAuLSAnSVAgUGFja2V0JyBleHBhbmRzLCBpZiBXRVAgZW5hYmxlZCwgdG8gPC0tJworICAgICAgIHwKKyAgICAgICBWCisgICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitCeXRlcyB8ICA0ICB8ICAgMC0yMjk2ICB8ICA0ICB8CisgICAgICB8LS0tLS18LS0tLS0tLS0tLS18LS0tLS18CitEZXNjLiB8IElWICB8IEVuY3J5cHRlZCB8IElDViB8CisgICAgICB8ICAgICB8IElQIFBhY2tldCB8ICAgICB8CisgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCitUb3RhbDogOCBub24tZGF0YSBieXRlcworCisKKzgwMi4zIEV0aGVybmV0IERhdGEgRnJhbWUKKworICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorQnl0ZXMgfCAgIDYgICB8ICAgNiAgIHwgIDIgICB8ICBWYXJpYWJsZSB8ICAgNCAgfAorICAgICAgfC0tLS0tLS18LS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tfAorRGVzYy4gfCBEZXN0LiB8IFNvdXJjZXwgVHlwZSB8IElQIFBhY2tldCB8ICBmY3MgfAorICAgICAgfCAgTUFDICB8ICBNQUMgIHwgICAgICB8ICAgICAgICAgICB8ICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworVG90YWw6IDE4IG5vbi1kYXRhIGJ5dGVzCisKK0luIHRoZSBldmVudCB0aGF0IGZyYWdtZW50YXRpb24gaXMgcmVxdWlyZWQsIHRoZSBpbmNvbWluZyBwYXlsb2FkIGlzIHNwbGl0IGludG8KK04gcGFydHMgb2Ygc2l6ZSBpZWVlLT5mdHMuICBUaGUgZmlyc3QgZnJhZ21lbnQgY29udGFpbnMgdGhlIFNOQVAgaGVhZGVyIGFuZCB0aGUKK3JlbWFpbmluZyBwYWNrZXRzIGFyZSBqdXN0IGRhdGEuCisKK0lmIGVuY3J5cHRpb24gaXMgZW5hYmxlZCwgZWFjaCBmcmFnbWVudCBwYXlsb2FkIHNpemUgaXMgcmVkdWNlZCBieSBlbm91Z2ggc3BhY2UKK3RvIGFkZCB0aGUgcHJlZml4IGFuZCBwb3N0Zml4IChJViBhbmQgSUNWIHRvdGFsbGluZyA4IGJ5dGVzIGluIHRoZSBjYXNlIG9mIFdFUCkKK1NvIGlmIHlvdSBoYXZlIDE1MDAgYnl0ZXMgb2YgcGF5bG9hZCB3aXRoIGllZWUtPmZ0cyBzZXQgdG8gNTAwIHdpdGhvdXQKK2VuY3J5cHRpb24gaXQgd2lsbCB0YWtlIDMgZnJhbWVzLiAgV2l0aCBXRVAgaXQgd2lsbCB0YWtlIDQgZnJhbWVzIGFzIHRoZQorcGF5bG9hZCBvZiBlYWNoIGZyYW1lIGlzIHJlZHVjZWQgdG8gNDkyIGJ5dGVzLgorCisqIFNLQiB2aXN1YWxpemF0aW9uCisqCisqICAsLSBza2ItPmRhdGEKKyogfAorKiB8ICAgIEVUSEVSTkVUIEhFQURFUiAgICAgICAgLC08LS0gUEFZTE9BRAorKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgMTQgYnl0ZXMgZnJvbSBza2ItPmRhdGEKKyogfCAgMiBieXRlcyBmb3IgVHlwZSAtLT4gLFQuIHwgICAgIChzaXplb2YgZXRoaGRyKQorKiB8ICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorKiB8LC1EZXN0Li0tLiAsLS1TcmMuLS0tLiB8IHwgfAorKiB8ICA2IGJ5dGVzfCB8IDYgYnl0ZXMgfCB8IHwgfAorKiB2ICAgICAgICAgfCB8ICAgICAgICAgfCB8IHwgfAorKiAwICAgICAgICAgfCB2ICAgICAgIDEgfCB2IHwgdiAgICAgICAgICAgMgorKiAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUKKyogICAgIF4gICAgIHwgXiAgICAgICAgIHwgXiB8CisqICAgICB8ICAgICB8IHwgICAgICAgICB8IHwgfAorKiAgICAgfCAgICAgfCB8ICAgICAgICAgfCBgVCcgPC0tLS0gMiBieXRlcyBmb3IgVHlwZQorKiAgICAgfCAgICAgfCB8ICAgICAgICAgfAorKiAgICAgfCAgICAgfCAnLS0tU05BUC0tJyA8LS0tLS0tLS0gNiBieXRlcyBmb3IgU05BUAorKiAgICAgfCAgICAgfAorKiAgICAgYC1JVi0tJyA8LS0tLS0tLS0tLS0tLS0tLS0tLS0gNCBieXRlcyBmb3IgSVYgKFdFUCkKKyoKKyogICAgICBTTkFQIEhFQURFUgorKgorKi8KKworc3RhdGljIHU4IFA4MDJfMUhfT1VJW1A4MDIxMV9PVUlfTEVOXSA9IHsgMHgwMCwgMHgwMCwgMHhmOCB9Oworc3RhdGljIHU4IFJGQzEwNDJfT1VJW1A4MDIxMV9PVUlfTEVOXSA9IHsgMHgwMCwgMHgwMCwgMHgwMCB9OworCitzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfcHV0X3NuYXAodTggKmRhdGEsIHUxNiBoX3Byb3RvKQoreworCXN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIgKnNuYXA7CisJdTggKm91aTsKKworCXNuYXAgPSAoc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkciAqKWRhdGE7CisJc25hcC0+ZHNhcCA9IDB4YWE7CisJc25hcC0+c3NhcCA9IDB4YWE7CisJc25hcC0+Y3RybCA9IDB4MDM7CisKKwlpZiAoaF9wcm90byA9PSAweDgxMzcgfHwgaF9wcm90byA9PSAweDgwZjMpCisJCW91aSA9IFA4MDJfMUhfT1VJOworCWVsc2UKKwkJb3VpID0gUkZDMTA0Ml9PVUk7CisJc25hcC0+b3VpWzBdID0gb3VpWzBdOworCXNuYXAtPm91aVsxXSA9IG91aVsxXTsKKwlzbmFwLT5vdWlbMl0gPSBvdWlbMl07CisKKwkqKHUxNiAqKShkYXRhICsgU05BUF9TSVpFKSA9IGh0b25zKGhfcHJvdG8pOworCisJcmV0dXJuIFNOQVBfU0laRSArIHNpemVvZih1MTYpOworfQorCitpbnQgaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJc3RydWN0IHNrX2J1ZmYgKmZyYWcsCisJaW50IGhkcl9sZW4pCit7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07CisJaW50IHJlczsKKworCWlmICghKGNyeXB0ICYmIGNyeXB0LT5vcHMpKQorCXsKKwkJcHJpbnRrKCI9PT09PT09PT0+JXMoKSwgY3J5cHQgaXMgbnVsbFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0NSWVBUX1RLSVAKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyOworCisJaWYgKGllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzICYmCisJICAgIGNyeXB0ICYmIGNyeXB0LT5vcHMgJiYgc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJUS0lQIikgPT0gMCkgeworCQloZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgZnJhZy0+ZGF0YTsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUS0lQIGNvdW50ZXJtZWFzdXJlczogZHJvcHBlZCAiCisJCQkgICAgICAgIlRYIHBhY2tldCB0byAiIE1BQ19GTVQgIlxuIiwKKwkJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUsIE1BQ19BUkcoaGVhZGVyLT5hZGRyMSkpOworCQl9CisJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKwkvKiBUbyBlbmNyeXB0LCBmcmFtZSBmb3JtYXQgaXM6CisJICogSVYgKDQgYnl0ZXMpLCBjbGVhciBwYXlsb2FkIChpbmNsdWRpbmcgU05BUCksIElDViAoNCBieXRlcykgKi8KKworCS8vIFBSOiBGSVhNRTogQ29waWVkIGZyb20gaG9zdGFwLiBDaGVjayBmcmFnbWVudGF0aW9uL01TRFUvTVBEVSBlbmNyeXB0aW9uLgorCS8qIEhvc3QtYmFzZWQgSUVFRSA4MDIuMTEgZnJhZ21lbnRhdGlvbiBmb3IgVFggaXMgbm90IHlldCBzdXBwb3J0ZWQsIHNvCisJICogY2FsbCBib3RoIE1TRFUgYW5kIE1QRFUgZW5jcnlwdGlvbiBmdW5jdGlvbnMgZnJvbSBoZXJlLiAqLworCWF0b21pY19pbmMoJmNyeXB0LT5yZWZjbnQpOworCXJlcyA9IDA7CisJaWYgKGNyeXB0LT5vcHMtPmVuY3J5cHRfbXNkdSkKKwkJcmVzID0gY3J5cHQtPm9wcy0+ZW5jcnlwdF9tc2R1KGZyYWcsIGhkcl9sZW4sIGNyeXB0LT5wcml2KTsKKwlpZiAocmVzID09IDAgJiYgY3J5cHQtPm9wcy0+ZW5jcnlwdF9tcGR1KQorCQlyZXMgPSBjcnlwdC0+b3BzLT5lbmNyeXB0X21wZHUoZnJhZywgaGRyX2xlbiwgY3J5cHQtPnByaXYpOworCisJYXRvbWljX2RlYygmY3J5cHQtPnJlZmNudCk7CisJaWYgKHJlcyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVuY3J5cHRpb24gZmFpbGVkOiBsZW49JWQuXG4iLAorCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lLCBmcmFnLT5sZW4pOworCQlpZWVlLT5pZWVlX3N0YXRzLnR4X2Rpc2NhcmRzKys7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGllZWU4MDIxMV90eGJfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiKSB7CisJLy9pbnQgaTsKKwlpZiAodW5saWtlbHkoIXR4YikpCisJCXJldHVybjsKKwlrZnJlZSh0eGIpOworfQorCitzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqaWVlZTgwMjExX2FsbG9jX3R4YihpbnQgbnJfZnJhZ3MsIGludCB0eGJfc2l6ZSwKKwkJCQkJICBpbnQgZ2ZwX21hc2spCit7CisJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YjsKKwlpbnQgaTsKKwl0eGIgPSBrbWFsbG9jKAorCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV90eGIpICsgKHNpemVvZih1OCopICogbnJfZnJhZ3MpLAorCQlnZnBfbWFzayk7CisJaWYgKCF0eGIpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KHR4YiwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdHhiKSk7CisJdHhiLT5ucl9mcmFncyA9IG5yX2ZyYWdzOworCXR4Yi0+ZnJhZ19zaXplID0gdHhiX3NpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfZnJhZ3M7IGkrKykgeworCQl0eGItPmZyYWdtZW50c1tpXSA9IGRldl9hbGxvY19za2IodHhiX3NpemUpOworCQlpZiAodW5saWtlbHkoIXR4Yi0+ZnJhZ21lbnRzW2ldKSkgeworCQkJaS0tOworCQkJYnJlYWs7CisJCX0KKwkJbWVtc2V0KHR4Yi0+ZnJhZ21lbnRzW2ldLT5jYiwgMCwgc2l6ZW9mKHR4Yi0+ZnJhZ21lbnRzW2ldLT5jYikpOworCX0KKwlpZiAodW5saWtlbHkoaSAhPSBucl9mcmFncykpIHsKKwkJd2hpbGUgKGkgPj0gMCkKKwkJCWRldl9rZnJlZV9za2JfYW55KHR4Yi0+ZnJhZ21lbnRzW2ktLV0pOworCQlrZnJlZSh0eGIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHR4YjsKK30KKworLy8gQ2xhc3NpZnkgdGhlIHRvLWJlIHNlbmQgZGF0YSBwYWNrZXQKKy8vIE5lZWQgdG8gYWNxdWlyZSB0aGUgc2VudCBxdWV1ZSBpbmRleC4KK3N0YXRpYyBpbnQKK2llZWU4MDIxMV9jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCit7CisJc3RydWN0IGV0aGhkciAqZXRoOworCXN0cnVjdCBpcGhkciAqaXA7CisJZXRoID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7CisJaWYgKGV0aC0+aF9wcm90byAhPSBodG9ucyhFVEhfUF9JUCkpCisJCXJldHVybiAwOworCisvLwlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJaXAgPSBpcF9oZHIoc2tiKTsKKwlzd2l0Y2ggKGlwLT50b3MgJiAweGZjKSB7CisJCWNhc2UgMHgyMDoKKwkJCXJldHVybiAyOworCQljYXNlIDB4NDA6CisJCQlyZXR1cm4gMTsKKwkJY2FzZSAweDYwOgorCQkJcmV0dXJuIDM7CisJCWNhc2UgMHg4MDoKKwkJCXJldHVybiA0OworCQljYXNlIDB4YTA6CisJCQlyZXR1cm4gNTsKKwkJY2FzZSAweGMwOgorCQkJcmV0dXJuIDY7CisJCWNhc2UgMHhlMDoKKwkJCXJldHVybiA3OworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJfQorfQorCisjZGVmaW5lIFNOX0xFU1MoYSwgYikJCSgoKGEtYikmMHg4MDApIT0wKQordm9pZCBpZWVlODAyMTFfdHhfcXVlcnlfYWdnX2NhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgc3RydWN0IHNrX2J1ZmYqIHNrYiwgY2JfZGVzYyogdGNiX2Rlc2MpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwlQVFhfVFNfUkVDT1JECQkJcFR4VHMgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzFhZGRyKiBoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfMWFkZHIqKXNrYi0+ZGF0YTsKKworCWlmICghcEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnR8fCFwSFRJbmZvLT5iRW5hYmxlSFQpCisJCXJldHVybjsKKwlpZiAoIUlzUW9TRGF0YUZyYW1lKHNrYi0+ZGF0YSkpCisJCXJldHVybjsKKworCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSB8fCBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkKKwkJcmV0dXJuOworCS8vY2hlY2sgcGFja2V0IGFuZCBtb2RlIGxhdGVyCisjaWZkZWYgVE9fRE9fTElTVAorCWlmKHBUY2ItPlBhY2tldExlbmd0aCA+PSA0MDk2KQorCQlyZXR1cm47CisJLy8gRm9yIFJUTDgxOVgsIGlmIHBhaXJ3aXNla2V5ID0gd2VwL3RraXAsIHdlIGRvbid0IGFnZ3JyZWdhdGlvbi4KKwlpZighQWRhcHRlci0+SGFsRnVuYy5HZXRObW9kZVN1cHBvcnRCeVNlY0NmZ0hhbmRsZXIoQWRhcHRlcikpCisJCXJldHVybjsKKyNlbmRpZgorCWlmKCFpZWVlLT5HZXRObW9kZVN1cHBvcnRCeVNlY0NmZyhpZWVlLT5kZXYpKQorCXsKKwkJcmV0dXJuOworCX0KKwlpZihwSFRJbmZvLT5iQ3VycmVudEFNUERVRW5hYmxlKQorCXsKKwkJaWYgKCFHZXRUcyhpZWVlLCAoUFRTX0NPTU1PTl9JTkZPKikoJnBUeFRzKSwgaGRyLT5hZGRyMSwgc2tiLT5wcmlvcml0eSwgVFhfRElSLCB0cnVlKSkKKwkJeworCQkJcHJpbnRrKCI9PT0+Y2FuJ3QgZ2V0IFRTXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAocFR4VHMtPlR4QWRtaXR0ZWRCQVJlY29yZC5iVmFsaWQgPT0gZmFsc2UpCisJCXsKKwkJCVRzU3RhcnRBZGRCYVByb2Nlc3MoaWVlZSwgcFR4VHMpOworCQkJZ290byBGT1JDRURfQUdHX1NFVFRJTkc7CisJCX0KKwkJZWxzZSBpZiAocFR4VHMtPmJVc2luZ0JhID09IGZhbHNlKQorCQl7CisJCQlpZiAoU05fTEVTUyhwVHhUcy0+VHhBZG1pdHRlZEJBUmVjb3JkLkJhU3RhcnRTZXFDdHJsLmZpZWxkLlNlcU51bSwgKHBUeFRzLT5UeEN1clNlcSsxKSU0MDk2KSkKKwkJCQlwVHhUcy0+YlVzaW5nQmEgPSB0cnVlOworCQkJZWxzZQorCQkJCWdvdG8gRk9SQ0VEX0FHR19TRVRUSU5HOworCQl9CisKKwkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkKKwkJeworCQkJdGNiX2Rlc2MtPmJBTVBEVUVuYWJsZSA9IHRydWU7CisJCQl0Y2JfZGVzYy0+YW1wZHVfZmFjdG9yID0gcEhUSW5mby0+Q3VycmVudEFNUERVRmFjdG9yOworCQkJdGNiX2Rlc2MtPmFtcGR1X2RlbnNpdHkgPSBwSFRJbmZvLT5DdXJyZW50TVBEVURlbnNpdHk7CisJCX0KKwl9CitGT1JDRURfQUdHX1NFVFRJTkc6CisJc3dpdGNoKHBIVEluZm8tPkZvcmNlZEFNUERVTW9kZSApCisJeworCQljYXNlIEhUX0FHR19BVVRPOgorCQkJYnJlYWs7CisKKwkJY2FzZSBIVF9BR0dfRk9SQ0VfRU5BQkxFOgorCQkJdGNiX2Rlc2MtPmJBTVBEVUVuYWJsZSA9IHRydWU7CisJCQl0Y2JfZGVzYy0+YW1wZHVfZGVuc2l0eSA9IHBIVEluZm8tPkZvcmNlZE1QRFVEZW5zaXR5OworCQkJdGNiX2Rlc2MtPmFtcGR1X2ZhY3RvciA9IHBIVEluZm8tPkZvcmNlZEFNUERVRmFjdG9yOworCQkJYnJlYWs7CisKKwkJY2FzZSBIVF9BR0dfRk9SQ0VfRElTQUJMRToKKwkJCXRjYl9kZXNjLT5iQU1QRFVFbmFibGUgPSBmYWxzZTsKKwkJCXRjYl9kZXNjLT5hbXBkdV9kZW5zaXR5ID0gMDsKKwkJCXRjYl9kZXNjLT5hbXBkdV9mYWN0b3IgPSAwOworCQkJYnJlYWs7CisKKwl9CisJCXJldHVybjsKK30KKworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3F1cmV5X1Nob3J0UHJlYW1ibGVNb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBjYl9kZXNjKiB0Y2JfZGVzYykKK3sKKwl0Y2JfZGVzYy0+YlVzZVNob3J0UHJlYW1ibGUgPSBmYWxzZTsKKwlpZiAodGNiX2Rlc2MtPmRhdGFfcmF0ZSA9PSAyKQorCXsvLy8vIDFNIGNhbiBvbmx5IHVzZSBMb25nIFByZWFtYmxlLiAxMUIgc3BlYworCQlyZXR1cm47CisJfQorCWVsc2UgaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKQorCXsKKwkJdGNiX2Rlc2MtPmJVc2VTaG9ydFByZWFtYmxlID0gdHJ1ZTsKKwl9CisJcmV0dXJuOworfQorZXh0ZXJuCXZvaWQKK2llZWU4MDIxMV9xdWVyeV9IVENhcFNob3J0R0koc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGNiX2Rlc2MgKnRjYl9kZXNjKQoreworCVBSVF9ISUdIX1RIUk9VR0hQVVQJCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCisJdGNiX2Rlc2MtPmJVc2VTaG9ydEdJIAkJPSBmYWxzZTsKKworCWlmKCFwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydHx8IXBIVEluZm8tPmJFbmFibGVIVCkKKwkJcmV0dXJuOworCisJaWYocEhUSW5mby0+YkZvcmNlZFNob3J0R0kpCisJeworCQl0Y2JfZGVzYy0+YlVzZVNob3J0R0kgPSB0cnVlOworCQlyZXR1cm47CisJfQorCisJaWYoKHBIVEluZm8tPmJDdXJCVzQwTUh6PT10cnVlKSAmJiBwSFRJbmZvLT5iQ3VyU2hvcnRHSTQwTUh6KQorCQl0Y2JfZGVzYy0+YlVzZVNob3J0R0kgPSB0cnVlOworCWVsc2UgaWYoKHBIVEluZm8tPmJDdXJCVzQwTUh6PT1mYWxzZSkgJiYgcEhUSW5mby0+YkN1clNob3J0R0kyME1IeikKKwkJdGNiX2Rlc2MtPmJVc2VTaG9ydEdJID0gdHJ1ZTsKK30KKwordm9pZCBpZWVlODAyMTFfcXVlcnlfQmFuZHdpZHRoTW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgY2JfZGVzYyAqdGNiX2Rlc2MpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKworCXRjYl9kZXNjLT5iUGFja2V0QlcgPSBmYWxzZTsKKworCWlmKCFwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydHx8IXBIVEluZm8tPmJFbmFibGVIVCkKKwkJcmV0dXJuOworCisJaWYodGNiX2Rlc2MtPmJNdWx0aWNhc3QgfHwgdGNiX2Rlc2MtPmJCcm9hZGNhc3QpCisJCXJldHVybjsKKworCWlmKCh0Y2JfZGVzYy0+ZGF0YV9yYXRlICYgMHg4MCk9PTApIC8vIElmIHVzaW5nIGxlZ2FjeSByYXRlLCBpdCBzaGFsbCB1c2UgMjBNSHogY2hhbm5lbC4KKwkJcmV0dXJuOworCS8vQmFuZFdpZHRoQXV0b1N3aXRjaCBpcyBmb3IgYXV0byBzd2l0Y2ggdG8gMjAgb3IgNDAgaW4gbG9uZyBkaXN0YW5jZQorCWlmKHBIVEluZm8tPmJDdXJCVzQwTUh6ICYmIHBIVEluZm8tPmJDdXJUeEJXNDBNSHogJiYgIWllZWUtPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC5iZm9yY2VkX3R4MjBNaHopCisJCXRjYl9kZXNjLT5iUGFja2V0QlcgPSB0cnVlOworCXJldHVybjsKK30KKwordm9pZCBpZWVlODAyMTFfcXVlcnlfcHJvdGVjdGlvbm1vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIGNiX2Rlc2MqIHRjYl9kZXNjLCBzdHJ1Y3Qgc2tfYnVmZiogc2tiKQoreworCS8vIENvbW1vbiBTZXR0aW5ncworCXRjYl9kZXNjLT5iUlRTU1RCQwkJCT0gZmFsc2U7CisJdGNiX2Rlc2MtPmJSVFNVc2VTaG9ydEdJCQk9IGZhbHNlOyAvLyBTaW5jZSBwcm90ZWN0aW9uIGZyYW1lcyBhcmUgYWx3YXlzIHNlbnQgYnkgbGVnYWN5IHJhdGUsIFNob3J0R0kgd2lsbCBuZXZlciBiZSB1c2VkLgorCXRjYl9kZXNjLT5iQ1RTRW5hYmxlCQkJPSBmYWxzZTsgLy8gTW9zdCBvZiBwcm90ZWN0aW9uIHVzaW5nIFJUUy9DVFMKKwl0Y2JfZGVzYy0+UlRTU0MJCQkJPSAwOwkJLy8gMjBNSHo6IERvbid0IGNhcmU7ICA0ME1IejogRHVwbGljYXRlLgorCXRjYl9kZXNjLT5iUlRTQlcJCQk9IGZhbHNlOyAvLyBSVFMgZnJhbWUgYmFuZHdpZHRoIGlzIGFsd2F5cyAyME1IegorCisJaWYodGNiX2Rlc2MtPmJCcm9hZGNhc3QgfHwgdGNiX2Rlc2MtPmJNdWx0aWNhc3QpLy9vbmx5IHVuaWNhc3QgZnJhbWUgd2lsbCB1c2UgcnRzL2N0cworCQlyZXR1cm47CisKKwlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoc2tiLT5kYXRhKzE2KSkgIC8vY2hlY2sgYWRkcjMgYXMgaW5mcmFzdHJ1Y3R1cmUgYWRkMyBpcyBEQS4KKwkJcmV0dXJuOworCisJaWYgKGllZWUtPm1vZGUgPCBJRUVFX05fMjRHKSAvL2IsIGcgbW9kZQorCXsKKwkJCS8vICgxKSBSVFNfVGhyZXNob2xkIGlzIGNvbXBhcmVkIHRvIHRoZSBNUERVLCBub3QgTVNEVS4KKwkJCS8vICgyKSBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBmcmFnIGluICB0aGlzIE1TRFUsIG9ubHkgdGhlIGZpcnN0IGZyYWcgdXNlcyBwcm90ZWN0aW9uIGZyYW1lLgorCQkJLy8JCU90aGVyIGZyYWdtZW50cyBhcmUgcHJvdGVjdGVkIGJ5IHByZXZpb3VzIGZyYWdtZW50LgorCQkJLy8JCVNvIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgbGVuZ3RoIG9mIGZpcnN0IGZyYWdtZW50LgorCQlpZiAoc2tiLT5sZW4gPiBpZWVlLT5ydHMpCisJCXsKKwkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gdHJ1ZTsKKwkJCXRjYl9kZXNjLT5ydHNfcmF0ZSA9IE1HTl8yNE07CisJCX0KKwkJZWxzZSBpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJ1c2Vwcm90ZWN0aW9uKQorCQl7CisJCQkvLyBVc2UgQ1RTLXRvLVNFTEYgaW4gcHJvdGVjdGlvbiBtb2RlLgorCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSB0cnVlOworCQkJdGNiX2Rlc2MtPmJDVFNFbmFibGUgPSB0cnVlOworCQkJdGNiX2Rlc2MtPnJ0c19yYXRlID0gTUdOXzI0TTsKKwkJfQorCQkvL290aGVyd2lzZSByZXR1cm47CisJCXJldHVybjsKKwl9CisJZWxzZQorCXsvLyAxMW4gSGlnaCB0aHJvdWdocHV0IGNhc2UuCisJCVBSVF9ISUdIX1RIUk9VR0hQVVQgcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisJCXdoaWxlICh0cnVlKQorCQl7CisJCQkvL2NoZWNrIEVSUCBwcm90ZWN0aW9uCisJCQlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJ1c2Vwcm90ZWN0aW9uKQorCQkJey8vIENUUy10by1TRUxGCisJCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSB0cnVlOworCQkJCXRjYl9kZXNjLT5iQ1RTRW5hYmxlID0gdHJ1ZTsKKwkJCQl0Y2JfZGVzYy0+cnRzX3JhdGUgPSBNR05fMjRNOworCQkJCWJyZWFrOworCQkJfQorCQkJLy9jaGVjayBIVCBvcCBtb2RlCisJCQlpZihwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCAgJiYgcEhUSW5mby0+YkVuYWJsZUhUKQorCQkJeworCQkJCXU4IEhUT3BNb2RlID0gcEhUSW5mby0+Q3VycmVudE9wTW9kZTsKKwkJCQlpZigocEhUSW5mby0+YkN1ckJXNDBNSHogJiYgKEhUT3BNb2RlID09IDIgfHwgSFRPcE1vZGUgPT0gMykpIHx8CisJCQkJCQkJKCFwSFRJbmZvLT5iQ3VyQlc0ME1IeiAmJiBIVE9wTW9kZSA9PSAzKSApCisJCQkJeworCQkJCQl0Y2JfZGVzYy0+cnRzX3JhdGUgPSBNR05fMjRNOyAvLyBSYXRlIGlzIDI0TWJwcy4KKwkJCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQkvL2NoZWNrIHJ0cworCQkJaWYgKHNrYi0+bGVuID4gaWVlZS0+cnRzKQorCQkJeworCQkJCXRjYl9kZXNjLT5ydHNfcmF0ZSA9IE1HTl8yNE07IC8vIFJhdGUgaXMgMjRNYnBzLgorCQkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8vdG8gZG8gbGlzdDogY2hlY2sgTUlNTyBwb3dlciBzYXZlIGNvbmRpdGlvbi4KKwkJCS8vY2hlY2sgQU1QRFUgYWdncmVnYXRpb24gZm9yIFRYT1AKKwkJCWlmKHRjYl9kZXNjLT5iQU1QRFVFbmFibGUpCisJCQl7CisJCQkJdGNiX2Rlc2MtPnJ0c19yYXRlID0gTUdOXzI0TTsgLy8gUmF0ZSBpcyAyNE1icHMuCisJCQkJLy8gQWNjb3JkaW5nIHRvIDgxOTAgZGVzaWduLCBmaXJtd2FyZSBzZW5kcyBDRi1FbmQgb25seSBpZiBSVFMvQ1RTIGlzIGVuYWJsZWQuIEhvd2V2ZXIsIGl0IGRlZ3JhZHMKKwkJCQkvLyB0aHJvdWdocHV0IGFyb3VuZCAxME0sIHNvIHdlIGRpc2FibGUgb2YgdGhpcyBtZWNoYW5pc20uIDIwMDcuMDguMDMgYnkgRW1pbHkKKwkJCQl0Y2JfZGVzYy0+YlJUU0VuYWJsZSA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCQkJLy9jaGVjayBJT1QgYWN0aW9uCisJCQlpZihwSFRJbmZvLT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX0ZPUkNFRF9DVFMyU0VMRikKKwkJCXsKKwkJCQl0Y2JfZGVzYy0+YkNUU0VuYWJsZQk9IHRydWU7CisJCQkJdGNiX2Rlc2MtPnJ0c19yYXRlICA9IAlNR05fMjRNOworCQkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8vIFRvdGFsbHkgbm8gcHJvdGVjdGlvbiBjYXNlISEKKwkJCWdvdG8gTk9fUFJPVEVDVElPTjsKKwkJfQorCQl9CisJLy8gRm9yIHRlc3QgLCBDVFMgcmVwbGFjZSB3aXRoIFJUUworCWlmKCAwICkKKwl7CisJCXRjYl9kZXNjLT5iQ1RTRW5hYmxlCT0gdHJ1ZTsKKwkJdGNiX2Rlc2MtPnJ0c19yYXRlID0gTUdOXzI0TTsKKwkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgCT0gdHJ1ZTsKKwl9CisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKQorCQl0Y2JfZGVzYy0+YlVzZVNob3J0UHJlYW1ibGUgPSB0cnVlOworCWlmIChpZWVlLT5tb2RlID09IElXX01PREVfTUFTVEVSKQorCQkJZ290byBOT19QUk9URUNUSU9OOworCXJldHVybjsKK05PX1BST1RFQ1RJT046CisJdGNiX2Rlc2MtPmJSVFNFbmFibGUJPSBmYWxzZTsKKwl0Y2JfZGVzYy0+YkNUU0VuYWJsZQk9IGZhbHNlOworCXRjYl9kZXNjLT5ydHNfcmF0ZQkJPSAwOworCXRjYl9kZXNjLT5SVFNTQwkJPSAwOworCXRjYl9kZXNjLT5iUlRTQlcJCT0gZmFsc2U7Cit9CisKKwordm9pZCBpZWVlODAyMTFfdHhyYXRlX3NlbGVjdG1vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIGNiX2Rlc2MqIHRjYl9kZXNjKQoreworI2lmZGVmIFRPX0RPX0xJU1QKKwlpZighSXNEYXRhRnJhbWUocEZyYW1lKSkKKwl7CisJCXBUY2ItPmJUeERpc2FibGVSYXRlRmFsbEJhY2sgPSBUUlVFOworCQlwVGNiLT5iVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGUgPSBUUlVFOworCQlwVGNiLT5SQVRSSW5kZXggPSA3OworCQlyZXR1cm47CisJfQorCisJaWYocE1nbnRJbmZvLT5Gb3JjZWREYXRhUmF0ZSE9IDApCisJeworCQlwVGNiLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrID0gVFJVRTsKKwkJcFRjYi0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlID0gVFJVRTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCWlmKGllZWUtPmJUeERpc2FibGVSYXRlRmFsbEJhY2spCisJCXRjYl9kZXNjLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrID0gdHJ1ZTsKKworCWlmKGllZWUtPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSkKKwkJdGNiX2Rlc2MtPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSA9IHRydWU7CisJaWYoIXRjYl9kZXNjLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrIHx8ICF0Y2JfZGVzYy0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlKQorCXsKKwkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSB8fCBpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJCQl0Y2JfZGVzYy0+UkFUUkluZGV4ID0gMDsKKwl9Cit9CisKK3ZvaWQgaWVlZTgwMjExX3F1ZXJ5X3NlcW51bShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiogc2tiLCB1OCogZHN0KQoreworCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkc3QpIHx8IGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGRzdCkpCisJCXJldHVybjsKKwlpZiAoSXNRb1NEYXRhRnJhbWUoc2tiLT5kYXRhKSkgLy93ZSBkZWFsIHFvcyBkYXRhIG9ubHkKKwl7CisJCVBUWF9UU19SRUNPUkQgcFRTID0gTlVMTDsKKwkJaWYgKCFHZXRUcyhpZWVlLCAoUFRTX0NPTU1PTl9JTkZPKikoJnBUUyksIGRzdCwgc2tiLT5wcmlvcml0eSwgVFhfRElSLCB0cnVlKSkKKwkJeworCQkJcmV0dXJuOworCQl9CisJCXBUUy0+VHhDdXJTZXEgPSAocFRTLT5UeEN1clNlcSsxKSU0MDk2OworCX0KK30KKworaW50IGllZWU4MDIxMV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRycW9zICpmcmFnX2hkcjsKKwlpbnQgaSwgYnl0ZXNfcGVyX2ZyYWcsIG5yX2ZyYWdzLCBieXRlc19sYXN0X2ZyYWcsIGZyYWdfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZpZWVlLT5zdGF0czsKKwlpbnQgZXRoZXJfdHlwZSA9IDAsIGVuY3J5cHQ7CisJaW50IGJ5dGVzLCBmYywgcW9zX2N0bCA9IDAsIGhkcl9sZW47CisJc3RydWN0IHNrX2J1ZmYgKnNrYl9mcmFnOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRycW9zIGhlYWRlciA9IHsgLyogRW5zdXJlIHplcm8gaW5pdGlhbGl6ZWQgKi8KKwkJLmR1cmF0aW9uX2lkID0gMCwKKwkJLnNlcV9jdGwgPSAwLAorCQkucW9zX2N0bCA9IDAKKwl9OworCXU4IGRlc3RbRVRIX0FMRU5dLCBzcmNbRVRIX0FMRU5dOworCWludCBxb3NfYWN0aXZlZCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmU7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0OworCisJY2JfZGVzYyAqdGNiX2Rlc2M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJLyogSWYgdGhlcmUgaXMgbm8gZHJpdmVyIGhhbmRsZXIgdG8gdGFrZSB0aGUgVFhCLCBkb250JyBib3RoZXIKKwkgKiBjcmVhdGluZyBpdC4uLiAqLworCWlmICgoIWllZWUtPmhhcmRfc3RhcnRfeG1pdCAmJiAhKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUpKXx8CisJICAgKCghaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCAmJiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19UWF9RVUVVRSkpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8geG1pdCBoYW5kbGVyLlxuIiwKKwkJICAgICAgIGllZWUtPmRldi0+bmFtZSk7CisJCWdvdG8gc3VjY2VzczsKKwl9CisKKworCWlmKGxpa2VseShpZWVlLT5yYXdfdHggPT0gMCkpeworCQlpZiAodW5saWtlbHkoc2tiLT5sZW4gPCBTTkFQX1NJWkUgKyBzaXplb2YodTE2KSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBza2IgdG9vIHNtYWxsICglZCkuXG4iLAorCQkJaWVlZS0+ZGV2LT5uYW1lLCBza2ItPmxlbik7CisJCQlnb3RvIHN1Y2Nlc3M7CisJCX0KKworCQltZW1zZXQoc2tiLT5jYiwgMCwgc2l6ZW9mKHNrYi0+Y2IpKTsKKwkJZXRoZXJfdHlwZSA9IG50b2hzKCgoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YSktPmhfcHJvdG8pOworCisJCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKworCQllbmNyeXB0ID0gIShldGhlcl90eXBlID09IEVUSF9QX1BBRSAmJiBpZWVlLT5pZWVlODAyXzF4KSAmJgorCQkJaWVlZS0+aG9zdF9lbmNyeXB0ICYmIGNyeXB0ICYmIGNyeXB0LT5vcHM7CisKKwkJaWYgKCFlbmNyeXB0ICYmIGllZWUtPmllZWU4MDJfMXggJiYKKwkJaWVlZS0+ZHJvcF91bmVuY3J5cHRlZCAmJiBldGhlcl90eXBlICE9IEVUSF9QX1BBRSkgeworCQkJc3RhdHMtPnR4X2Ryb3BwZWQrKzsKKwkJCWdvdG8gc3VjY2VzczsKKwkJfQorCSNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCWlmIChjcnlwdCAmJiAhZW5jcnlwdCAmJiBldGhlcl90eXBlID09IEVUSF9QX1BBRSkgeworCQkJc3RydWN0IGVhcG9sICplYXAgPSAoc3RydWN0IGVhcG9sICopKHNrYi0+ZGF0YSArCisJCQkJc2l6ZW9mKHN0cnVjdCBldGhoZHIpIC0gU05BUF9TSVpFIC0gc2l6ZW9mKHUxNikpOworCQkJSUVFRTgwMjExX0RFQlVHX0VBUCgiVFg6IElFRUUgODAyLjExIEVBUE9MIGZyYW1lOiAlc1xuIiwKKwkJCQllYXBfZ2V0X3R5cGUoZWFwLT50eXBlKSk7CisJCX0KKwkjZW5kaWYKKworCQkvKiBTYXZlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzICovCisJCW1lbWNweSgmZGVzdCwgc2tiLT5kYXRhLCBFVEhfQUxFTik7CisJCW1lbWNweSgmc3JjLCBza2ItPmRhdGErRVRIX0FMRU4sIEVUSF9BTEVOKTsKKworICAgICAgICAgICAgICAgIC8qIEFkdmFuY2UgdGhlIFNLQiB0byB0aGUgc3RhcnQgb2YgdGhlIHBheWxvYWQgKi8KKyAgICAgICAgICAgICAgICBza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisKKyAgICAgICAgICAgICAgICAvKiBEZXRlcm1pbmUgdG90YWwgYW1vdW50IG9mIHN0b3JhZ2UgcmVxdWlyZWQgZm9yIFRYQiBwYWNrZXRzICovCisgICAgICAgICAgICAgICAgYnl0ZXMgPSBza2ItPmxlbiArIFNOQVBfU0laRSArIHNpemVvZih1MTYpOworCisJCWlmIChlbmNyeXB0KQorCQkJZmMgPSBJRUVFODAyMTFfRlRZUEVfREFUQSB8IElFRUU4MDIxMV9GQ1RMX1dFUDsKKwkJZWxzZQorCisgICAgICAgICAgICAgICAgICAgICAgICBmYyA9IElFRUU4MDIxMV9GVFlQRV9EQVRBOworCisJCS8vaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUpCisJCWlmKHFvc19hY3RpdmVkKQorCQkJZmMgfD0gSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBOworCQllbHNlCisJCQlmYyB8PSBJRUVFODAyMTFfU1RZUEVfREFUQTsKKworCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSB7CisJCQlmYyB8PSBJRUVFODAyMTFfRkNUTF9UT0RTOworCQkJLyogVG8gRFM6IEFkZHIxID0gQlNTSUQsIEFkZHIyID0gU0EsCisJCQlBZGRyMyA9IERBICovCisJCQltZW1jcHkoJmhlYWRlci5hZGRyMSwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisJCQltZW1jcHkoJmhlYWRlci5hZGRyMiwgJnNyYywgRVRIX0FMRU4pOworCQkJbWVtY3B5KCZoZWFkZXIuYWRkcjMsICZkZXN0LCBFVEhfQUxFTik7CisJCX0gZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CisJCQkvKiBub3QgRnJvbS9UbyBEUzogQWRkcjEgPSBEQSwgQWRkcjIgPSBTQSwKKwkJCUFkZHIzID0gQlNTSUQgKi8KKwkJCW1lbWNweSgmaGVhZGVyLmFkZHIxLCBkZXN0LCBFVEhfQUxFTik7CisJCQltZW1jcHkoJmhlYWRlci5hZGRyMiwgc3JjLCBFVEhfQUxFTik7CisJCQltZW1jcHkoJmhlYWRlci5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisJCX0KKworICAgICAgICAgICAgICAgIGhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihmYyk7CisKKwkJLyogRGV0ZXJtaW5lIGZyYWdtZW50YXRpb24gc2l6ZSBiYXNlZCBvbiBkZXN0aW5hdGlvbiAobXVsdGljYXN0CisJCSogYW5kIGJyb2FkY2FzdCBhcmUgbm90IGZyYWdtZW50ZWQpICovCisJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZWFkZXIuYWRkcjEpIHx8CisJCWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGhlYWRlci5hZGRyMSkpIHsKKwkJCWZyYWdfc2l6ZSA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwkJCXFvc19jdGwgfD0gUU9TX0NUTF9OT1RDT05UQUlOX0FDSzsKKwkJfQorCQllbHNlIHsKKwkJCWZyYWdfc2l6ZSA9IGllZWUtPmZ0czsvL2RlZmF1bHQ6MzkyCisJCQlxb3NfY3RsID0gMDsKKwkJfQorCisJCS8vaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlKQorCQlpZihxb3NfYWN0aXZlZCkKKwkJeworCQkJaGRyX2xlbiA9IElFRUU4MDIxMV8zQUREUl9MRU4gKyAyOworCisJCQlza2ItPnByaW9yaXR5ID0gaWVlZTgwMjExX2NsYXNzaWZ5KHNrYiwgJmllZWUtPmN1cnJlbnRfbmV0d29yayk7CisJCQlxb3NfY3RsIHw9IHNrYi0+cHJpb3JpdHk7IC8vc2V0IGluIHRoZSBpZWVlODAyMTFfY2xhc3NpZnkKKwkJCWhlYWRlci5xb3NfY3RsID0gY3B1X3RvX2xlMTYocW9zX2N0bCAmIElFRUU4MDIxMV9RT1NfVElEKTsKKwkJfSBlbHNlIHsKKwkJCWhkcl9sZW4gPSBJRUVFODAyMTFfM0FERFJfTEVOOworCQl9CisJCS8qIERldGVybWluZSBhbW91bnQgb2YgcGF5bG9hZCBwZXIgZnJhZ21lbnQuICBSZWdhcmRsZXNzIG9mIGlmCisJCSogdGhpcyBzdGFjayBpcyBwcm92aWRpbmcgdGhlIGZ1bGwgODAyLjExIGhlYWRlciwgb25lIHdpbGwKKwkJKiBldmVudHVhbGx5IGJlIGFmZml4ZWQgdG8gdGhpcyBmcmFnbWVudCAtLSBzbyB3ZSBtdXN0IGFjY291bnQgZm9yCisJCSogaXQgd2hlbiBkZXRlcm1pbmluZyB0aGUgYW1vdW50IG9mIHBheWxvYWQgc3BhY2UuICovCisJCWJ5dGVzX3Blcl9mcmFnID0gZnJhZ19zaXplIC0gaGRyX2xlbjsKKwkJaWYgKGllZWUtPmNvbmZpZyAmCisJCShDRkdfSUVFRTgwMjExX0NPTVBVVEVfRkNTIHwgQ0ZHX0lFRUU4MDIxMV9SRVNFUlZFX0ZDUykpCisJCQlieXRlc19wZXJfZnJhZyAtPSBJRUVFODAyMTFfRkNTX0xFTjsKKworCQkvKiBFYWNoIGZyYWdtZW50IG1heSBuZWVkIHRvIGhhdmUgcm9vbSBmb3IgZW5jcnlwdGlvbmcgcHJlL3Bvc3RmaXggKi8KKwkJaWYgKGVuY3J5cHQpCisJCQlieXRlc19wZXJfZnJhZyAtPSBjcnlwdC0+b3BzLT5leHRyYV9wcmVmaXhfbGVuICsKKwkJCQljcnlwdC0+b3BzLT5leHRyYV9wb3N0Zml4X2xlbjsKKworCQkvKiBOdW1iZXIgb2YgZnJhZ21lbnRzIGlzIHRoZSB0b3RhbCBieXRlc19wZXJfZnJhZyAvCisJCSogcGF5bG9hZF9wZXJfZnJhZ21lbnQgKi8KKwkJbnJfZnJhZ3MgPSBieXRlcyAvIGJ5dGVzX3Blcl9mcmFnOworCQlieXRlc19sYXN0X2ZyYWcgPSBieXRlcyAlIGJ5dGVzX3Blcl9mcmFnOworCQlpZiAoYnl0ZXNfbGFzdF9mcmFnKQorCQkJbnJfZnJhZ3MrKzsKKwkJZWxzZQorCQkJYnl0ZXNfbGFzdF9mcmFnID0gYnl0ZXNfcGVyX2ZyYWc7CisKKwkJLyogV2hlbiB3ZSBhbGxvY2F0ZSB0aGUgVFhCIHdlIGFsbG9jYXRlIGVub3VnaCBzcGFjZSBmb3IgdGhlIHJlc2VydmUKKwkJKiBhbmQgZnVsbCBmcmFnbWVudCBieXRlcyAoYnl0ZXNfcGVyX2ZyYWcgZG9lc24ndCBpbmNsdWRlIHByZWZpeCwKKwkJKiBwb3N0Zml4LCBoZWFkZXIsIEZDUywgZXRjLikgKi8KKwkJdHhiID0gaWVlZTgwMjExX2FsbG9jX3R4Yihucl9mcmFncywgZnJhZ19zaXplICsgaWVlZS0+dHhfaGVhZHJvb20sIEdGUF9BVE9NSUMpOworCQlpZiAodW5saWtlbHkoIXR4YikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgVFhCXG4iLAorCQkJaWVlZS0+ZGV2LT5uYW1lKTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisJCXR4Yi0+ZW5jcnlwdGVkID0gZW5jcnlwdDsKKwkJdHhiLT5wYXlsb2FkX3NpemUgPSBieXRlczsKKworCQkvL2lmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSkKKwkJaWYocW9zX2FjdGl2ZWQpCisJCXsKKwkJCXR4Yi0+cXVldWVfaW5kZXggPSBVUDJBQyhza2ItPnByaW9yaXR5KTsKKwkJfSBlbHNlIHsKKwkJCXR4Yi0+cXVldWVfaW5kZXggPSBXTUVfQUNfQks7OworCQl9CisKKworCisJCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsgaSsrKSB7CisJCQlza2JfZnJhZyA9IHR4Yi0+ZnJhZ21lbnRzW2ldOworCQkJdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2JfZnJhZy0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJCQlpZihxb3NfYWN0aXZlZCl7CisJCQkJc2tiX2ZyYWctPnByaW9yaXR5ID0gc2tiLT5wcmlvcml0eTsvL1VQMkFDKHNrYi0+cHJpb3JpdHkpOworCQkJCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9ICBVUDJBQyhza2ItPnByaW9yaXR5KTsKKwkJCX0gZWxzZSB7CisJCQkJc2tiX2ZyYWctPnByaW9yaXR5ID0gV01FX0FDX0JLOworCQkJCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9IFdNRV9BQ19CSzsKKwkJCX0KKwkJCXNrYl9yZXNlcnZlKHNrYl9mcmFnLCBpZWVlLT50eF9oZWFkcm9vbSk7CisKKwkJCWlmIChlbmNyeXB0KXsKKwkJCQlpZiAoaWVlZS0+aHdzZWNfYWN0aXZlKQorCQkJCQl0Y2JfZGVzYy0+Ykh3U2VjID0gMTsKKwkJCQllbHNlCisJCQkJCXRjYl9kZXNjLT5iSHdTZWMgPSAwOworCQkJCXNrYl9yZXNlcnZlKHNrYl9mcmFnLCBjcnlwdC0+b3BzLT5leHRyYV9wcmVmaXhfbGVuKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl0Y2JfZGVzYy0+Ykh3U2VjID0gMDsKKwkJCX0KKwkJCWZyYWdfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRycW9zICopc2tiX3B1dChza2JfZnJhZywgaGRyX2xlbik7CisJCQltZW1jcHkoZnJhZ19oZHIsICZoZWFkZXIsIGhkcl9sZW4pOworCisJCQkvKiBJZiB0aGlzIGlzIG5vdCB0aGUgbGFzdCBmcmFnbWVudCwgdGhlbiBhZGQgdGhlIE1PUkVGUkFHUworCQkJKiBiaXQgdG8gdGhlIGZyYW1lIGNvbnRyb2wgKi8KKwkJCWlmIChpICE9IG5yX2ZyYWdzIC0gMSkgeworCQkJCWZyYWdfaGRyLT5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNigKKwkJCQkJZmMgfCBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpOworCQkJCWJ5dGVzID0gYnl0ZXNfcGVyX2ZyYWc7CisKKwkJCX0gZWxzZSB7CisJCQkJLyogVGhlIGxhc3QgZnJhZ21lbnQgdGFrZXMgdGhlIHJlbWFpbmluZyBsZW5ndGggKi8KKwkJCQlieXRlcyA9IGJ5dGVzX2xhc3RfZnJhZzsKKwkJCX0KKwkJCS8vaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUpCisJCQlpZihxb3NfYWN0aXZlZCkKKwkJCXsKKwkJCQkvLyBhZGQgMSBvbmx5IGluZGljYXRlIHRvIGNvcnJlc3BvbmRpbmcgc2VxIG51bWJlciBjb250cm9sIDIwMDYvNy8xMgorCQkJCWZyYWdfaGRyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbVVAyQUMoc2tiLT5wcmlvcml0eSkrMV08PDQgfCBpKTsKKwkJCX0gZWxzZSB7CisJCQkJZnJhZ19oZHItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXTw8NCB8IGkpOworCQkJfQorCisJCQkvKiBQdXQgYSBTTkFQIGhlYWRlciBvbiB0aGUgZmlyc3QgZnJhZ21lbnQgKi8KKwkJCWlmIChpID09IDApIHsKKwkJCQlpZWVlODAyMTFfcHV0X3NuYXAoCisJCQkJCXNrYl9wdXQoc2tiX2ZyYWcsIFNOQVBfU0laRSArIHNpemVvZih1MTYpKSwKKwkJCQkJZXRoZXJfdHlwZSk7CisJCQkJYnl0ZXMgLT0gU05BUF9TSVpFICsgc2l6ZW9mKHUxNik7CisJCQl9CisKKwkJCW1lbWNweShza2JfcHV0KHNrYl9mcmFnLCBieXRlcyksIHNrYi0+ZGF0YSwgYnl0ZXMpOworCisJCQkvKiBBZHZhbmNlIHRoZSBTS0IuLi4gKi8KKwkJCXNrYl9wdWxsKHNrYiwgYnl0ZXMpOworCisJCQkvKiBFbmNyeXB0aW9uIHJvdXRpbmUgd2lsbCBtb3ZlIHRoZSBoZWFkZXIgZm9yd2FyZCBpbiBvcmRlcgorCQkJKiB0byBpbnNlcnQgdGhlIElWIGJldHdlZW4gdGhlIGhlYWRlciBhbmQgdGhlIHBheWxvYWQgKi8KKwkJCWlmIChlbmNyeXB0KQorCQkJCWllZWU4MDIxMV9lbmNyeXB0X2ZyYWdtZW50KGllZWUsIHNrYl9mcmFnLCBoZHJfbGVuKTsKKwkJCWlmIChpZWVlLT5jb25maWcgJgorCQkJKENGR19JRUVFODAyMTFfQ09NUFVURV9GQ1MgfCBDRkdfSUVFRTgwMjExX1JFU0VSVkVfRkNTKSkKKwkJCQlza2JfcHV0KHNrYl9mcmFnLCA0KTsKKwkJfQorCisJCWlmKHFvc19hY3RpdmVkKQorCQl7CisJCSAgaWYgKGllZWUtPnNlcV9jdHJsW1VQMkFDKHNrYi0+cHJpb3JpdHkpICsgMV0gPT0gMHhGRkYpCisJCQlpZWVlLT5zZXFfY3RybFtVUDJBQyhza2ItPnByaW9yaXR5KSArIDFdID0gMDsKKwkJICBlbHNlCisJCQlpZWVlLT5zZXFfY3RybFtVUDJBQyhza2ItPnByaW9yaXR5KSArIDFdKys7CisJCX0gZWxzZSB7CisgIAkJICBpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJCSAgZWxzZQorCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKwkJfQorCX1lbHNleworCQlpZiAodW5saWtlbHkoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNrYiB0b28gc21hbGwgKCVkKS5cbiIsCisJCQlpZWVlLT5kZXYtPm5hbWUsIHNrYi0+bGVuKTsKKwkJCWdvdG8gc3VjY2VzczsKKwkJfQorCisJCXR4YiA9IGllZWU4MDIxMV9hbGxvY190eGIoMSwgc2tiLT5sZW4sIEdGUF9BVE9NSUMpOworCQlpZighdHhiKXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgVFhCXG4iLAorCQkJaWVlZS0+ZGV2LT5uYW1lKTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisKKwkJdHhiLT5lbmNyeXB0ZWQgPSAwOworCQl0eGItPnBheWxvYWRfc2l6ZSA9IHNrYi0+bGVuOworCQltZW1jcHkoc2tiX3B1dCh0eGItPmZyYWdtZW50c1swXSxza2ItPmxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCX0KKworIHN1Y2Nlc3M6CisvL1dCIGFkZCB0byBmaWxsIGRhdGEgdGNiX2Rlc2MgaGVyZS4gb25seSBmaXJzdCBmcmFnbWVudCBpcyBjb25zaWRlcmVkLCBuZWVkIHRvIGNoYW5nZSwgYW5kIHlvdSBtYXkgcmVtb3ZlIHRvIG90aGVyIHBsYWNlLgorCWlmICh0eGIpCisJeworCQljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHR4Yi0+ZnJhZ21lbnRzWzBdLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKwkJdGNiX2Rlc2MtPmJUeEVuYWJsZUZ3Q2FsY0R1ciA9IDE7CisJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZWFkZXIuYWRkcjEpKQorCQkJdGNiX2Rlc2MtPmJNdWx0aWNhc3QgPSAxOworCQlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGVhZGVyLmFkZHIxKSkKKwkJCXRjYl9kZXNjLT5iQnJvYWRjYXN0ID0gMTsKKwkJaWVlZTgwMjExX3R4cmF0ZV9zZWxlY3Rtb2RlKGllZWUsIHRjYl9kZXNjKTsKKwkJaWYgKCB0Y2JfZGVzYy0+Yk11bHRpY2FzdCB8fCAgdGNiX2Rlc2MtPmJCcm9hZGNhc3QpCisJCQl0Y2JfZGVzYy0+ZGF0YV9yYXRlID0gaWVlZS0+YmFzaWNfcmF0ZTsKKwkJZWxzZQorCQkJLy90Y2JfZGVzYy0+ZGF0YV9yYXRlID0gQ1VSUkVOVF9SQVRFKGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlLCBpZWVlLT5yYXRlLCBpZWVlLT5IVEN1cnJlbnRPcGVyYVJhdGUpOworCQkJdGNiX2Rlc2MtPmRhdGFfcmF0ZSA9IENVUlJFTlRfUkFURShpZWVlLT5tb2RlLCBpZWVlLT5yYXRlLCBpZWVlLT5IVEN1cnJlbnRPcGVyYVJhdGUpOworCQlpZWVlODAyMTFfcXVyZXlfU2hvcnRQcmVhbWJsZU1vZGUoaWVlZSwgdGNiX2Rlc2MpOworCQlpZWVlODAyMTFfdHhfcXVlcnlfYWdnX2NhcChpZWVlLCB0eGItPmZyYWdtZW50c1swXSwgdGNiX2Rlc2MpOworCQlpZWVlODAyMTFfcXVlcnlfSFRDYXBTaG9ydEdJKGllZWUsIHRjYl9kZXNjKTsKKwkJaWVlZTgwMjExX3F1ZXJ5X0JhbmR3aWR0aE1vZGUoaWVlZSwgdGNiX2Rlc2MpOworCQlpZWVlODAyMTFfcXVlcnlfcHJvdGVjdGlvbm1vZGUoaWVlZSwgdGNiX2Rlc2MsIHR4Yi0+ZnJhZ21lbnRzWzBdKTsKKwkJaWVlZTgwMjExX3F1ZXJ5X3NlcW51bShpZWVlLCB0eGItPmZyYWdtZW50c1swXSwgaGVhZGVyLmFkZHIxKTsKKy8vCQlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQSwgdHhiLT5mcmFnbWVudHNbMF0tPmRhdGEsIHR4Yi0+ZnJhZ21lbnRzWzBdLT5sZW4pOworCQkvL0lFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBLCB0Y2JfZGVzYywgc2l6ZW9mKGNiX2Rlc2MpKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJaWYgKHR4YikgeworCQlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19UWF9RVUVVRSl7CisJCQlpZWVlODAyMTFfc29mdG1hY194bWl0KHR4YiwgaWVlZSk7CisJCX1lbHNleworCQkJaWYgKCgqaWVlZS0+aGFyZF9zdGFydF94bWl0KSh0eGIsIGRldikgPT0gMCkgeworCQkJCXN0YXRzLT50eF9wYWNrZXRzKys7CisJCQkJc3RhdHMtPnR4X2J5dGVzICs9IHR4Yi0+cGF5bG9hZF9zaXplOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWVlZTgwMjExX3R4Yl9mcmVlKHR4Yik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworIGZhaWxlZDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXN0YXRzLT50eF9lcnJvcnMrKzsKKwlyZXR1cm4gMTsKKworfQorCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV90eGJfZnJlZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzk3ZjFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwpAQCAtMCwwICsxLDg3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIENvcHlyaWdodChjKSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgYmFzZWQgb24gdGhlIFdFUCBlbmFibGVtZW50IGNvZGUgcHJvdmlkZWQgYnkgdGhlCisgIEhvc3QgQVAgcHJvamVjdCBob3N0YXAtZHJpdmVycyB2MC4xLjMKKyAgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgIDxqa21hbGluZUBjYy5odXQuZmk+CisgIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKworICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKworICBDb250YWN0IEluZm9ybWF0aW9uOgorICBKYW1lcyBQLiBLZXRyZW5vcyA8aXB3MjEwMC1hZG1pbkBsaW51eC5pbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorc3RydWN0IG1vZGVzX3VuaXQgeworCWNoYXIgKm1vZGVfc3RyaW5nOworCWludCBtb2RlX3NpemU7Cit9Oworc3RydWN0IG1vZGVzX3VuaXQgaWVlZTgwMjExX21vZGVzW10gPSB7CisJeyJhIiwxfSwKKwl7ImIiLDF9LAorCXsiZyIsMX0sCisJeyI/IiwxfSwKKwl7Ik4tMjRHIiw1fSwKKwl7Ik4tNUciLDR9LAorfTsKKworI2RlZmluZSBpd2Vfc3RyZWFtX2FkZF9ldmVudF9yc2wgaXdlX3N0cmVhbV9hZGRfZXZlbnQKKworI2RlZmluZSBNQVhfQ1VTVE9NX0xFTiA2NAorc3RhdGljIGlubGluZSBjaGFyICpydGw4MTl4X3RyYW5zbGF0ZV9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQkgICBjaGFyICpzdGFydCwgY2hhciAqc3RvcCwKKwkJCQkJICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrLAorCQkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvKQoreworCWNoYXIgY3VzdG9tW01BWF9DVVNUT01fTEVOXTsKKwljaGFyIHByb3RvX25hbWVbSUZOQU1TSVpdOworCWNoYXIgKnBuYW1lID0gcHJvdG9fbmFtZTsKKwljaGFyICpwOworCXN0cnVjdCBpd19ldmVudCBpd2U7CisJaW50IGksIGo7CisJdTE2IG1heF9yYXRlLCByYXRlOworCXN0YXRpYyB1OAlFV0MxMU5IVENhcFtdID0gezB4MDAsIDB4OTAsIDB4NGMsIDB4MzN9OworCisJLyogRmlyc3QgZW50cnkgKk1VU1QqIGJlIHRoZSBBUCBNQUMgYWRkcmVzcyAqLworCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CisJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgbmV0d29yay0+YnNzaWQsIEVUSF9BTEVOKTsKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOworCS8qIFJlbWFpbmluZyBlbnRyaWVzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBvcmRlciB3ZSBwcm92aWRlIHRoZW0gKi8KKworCS8qIEFkZCB0aGUgRVNTSUQgKi8KKwlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOworCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOworLy8JaWYgKG5ldHdvcmstPmZsYWdzICYgTkVUV09SS19FTVBUWV9FU1NJRCkgeworCWlmIChuZXR3b3JrLT5zc2lkX2xlbiA9PSAwKSB7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKCI8aGlkZGVuPiIpOworCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCAiPGhpZGRlbj4iKTsKKwl9IGVsc2UgeworCQlpd2UudS5kYXRhLmxlbmd0aCA9IG1pbihuZXR3b3JrLT5zc2lkX2xlbiwgKHU4KTMyKTsKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgbmV0d29yay0+c3NpZCk7CisJfQorCS8qIEFkZCB0aGUgcHJvdG9jb2wgbmFtZSAqLworCWl3ZS5jbWQgPSBTSU9DR0lXTkFNRTsKKwlmb3IoaT0wOyBpPChzaXplb2YoaWVlZTgwMjExX21vZGVzKS9zaXplb2YoaWVlZTgwMjExX21vZGVzWzBdKSk7IGkrKykgeworCQlpZihuZXR3b3JrLT5tb2RlJigxPDxpKSkgeworCQkJc3ByaW50ZihwbmFtZSxpZWVlODAyMTFfbW9kZXNbaV0ubW9kZV9zdHJpbmcsaWVlZTgwMjExX21vZGVzW2ldLm1vZGVfc2l6ZSk7CisJCQlwbmFtZSArPWllZWU4MDIxMV9tb2Rlc1tpXS5tb2RlX3NpemU7CisJCX0KKwl9CisJKnBuYW1lID0gJ1wwJzsKKwlzbnByaW50Zihpd2UudS5uYW1lLCBJRk5BTVNJWiwgIklFRUU4MDIuMTElcyIsIHByb3RvX25hbWUpOworCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnRfcnNsKGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9DSEFSX0xFTik7CisJLyogQWRkIG1vZGUgKi8KKwlpd2UuY21kID0gU0lPQ0dJV01PREU7CisJaWYgKG5ldHdvcmstPmNhcGFiaWxpdHkgJgorCSAgICAoV0xBTl9DQVBBQklMSVRZX0JTUyB8IFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkgeworCQlpZiAobmV0d29yay0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9CU1MpCisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9NQVNURVI7CisJCWVsc2UKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FESE9DOworCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfVUlOVF9MRU4pOworCX0KKworCS8qIEFkZCBmcmVxdWVuY3kvY2hhbm5lbCAqLworCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKy8qCWl3ZS51LmZyZXEubSA9IGllZWU4MDIxMV9mcmVxdWVuY3kobmV0d29yay0+Y2hhbm5lbCwgbmV0d29yay0+bW9kZSk7CisJaXdlLnUuZnJlcS5lID0gMzsgKi8KKwlpd2UudS5mcmVxLm0gPSBuZXR3b3JrLT5jaGFubmVsOworCWl3ZS51LmZyZXEuZSA9IDA7CisJaXdlLnUuZnJlcS5pID0gMDsKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOworCS8qIEFkZCBlbmNyeXB0aW9uIGNhcGFiaWxpdHkgKi8KKwlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKKwlpZiAobmV0d29yay0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKQorCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7CisJZWxzZQorCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCWl3ZS51LmRhdGEubGVuZ3RoID0gMDsKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBuZXR3b3JrLT5zc2lkKTsKKwkvKiBBZGQgYmFzaWMgYW5kIGV4dGVuZGVkIHJhdGVzICovCisJbWF4X3JhdGUgPSAwOworCXAgPSBjdXN0b207CisJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwgIiBSYXRlcyAoTWIvcyk6ICIpOworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgbmV0d29yay0+cmF0ZXNfbGVuOyApIHsKKwkJaWYgKGogPCBuZXR3b3JrLT5yYXRlc19leF9sZW4gJiYKKwkJICAgICgobmV0d29yay0+cmF0ZXNfZXhbal0gJiAweDdGKSA8CisJCSAgICAgKG5ldHdvcmstPnJhdGVzW2ldICYgMHg3RikpKQorCQkJcmF0ZSA9IG5ldHdvcmstPnJhdGVzX2V4W2orK10gJiAweDdGOworCQllbHNlCisJCQlyYXRlID0gbmV0d29yay0+cmF0ZXNbaSsrXSAmIDB4N0Y7CisJCWlmIChyYXRlID4gbWF4X3JhdGUpCisJCQltYXhfcmF0ZSA9IHJhdGU7CisJCXAgKz0gc25wcmludGYocCwgTUFYX0NVU1RPTV9MRU4gLSAocCAtIGN1c3RvbSksCisJCQkgICAgICAiJWQlcyAiLCByYXRlID4+IDEsIChyYXRlICYgMSkgPyAiLjUiIDogIiIpOworCX0KKwlmb3IgKDsgaiA8IG5ldHdvcmstPnJhdGVzX2V4X2xlbjsgaisrKSB7CisJCXJhdGUgPSBuZXR3b3JrLT5yYXRlc19leFtqXSAmIDB4N0Y7CisJCXAgKz0gc25wcmludGYocCwgTUFYX0NVU1RPTV9MRU4gLSAocCAtIGN1c3RvbSksCisJCQkgICAgICAiJWQlcyAiLCByYXRlID4+IDEsIChyYXRlICYgMSkgPyAiLjUiIDogIiIpOworCQlpZiAocmF0ZSA+IG1heF9yYXRlKQorCQkJbWF4X3JhdGUgPSByYXRlOworCX0KKworCWlmIChuZXR3b3JrLT5tb2RlID49IElFRUVfTl8yNEcpLy9hZGQgTiByYXRlIGhlcmU7CisJeworCQlQSFRfQ0FQQUJJTElUWV9FTEUgaHRfY2FwID0gTlVMTDsKKwkJYm9vbCBpczQwTSA9IGZhbHNlLCBpc1Nob3J0R0kgPSBmYWxzZTsKKwkJdTggbWF4X21jcyA9IDA7CisJCWlmICghbWVtY21wKG5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYsIEVXQzExTkhUQ2FwLCA0KSkKKwkJCWh0X2NhcCA9IChQSFRfQ0FQQUJJTElUWV9FTEUpJm5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWZbNF07CisJCWVsc2UKKwkJCWh0X2NhcCA9IChQSFRfQ0FQQUJJTElUWV9FTEUpJm5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWZbMF07CisJCWlzNDBNID0gKGh0X2NhcC0+Q2hsV2lkdGgpPzE6MDsKKwkJaXNTaG9ydEdJID0gKGh0X2NhcC0+Q2hsV2lkdGgpPworCQkJCQkJKChodF9jYXAtPlNob3J0R0k0ME1oeik/MTowKToKKwkJCQkJCSgoaHRfY2FwLT5TaG9ydEdJMjBNaHopPzE6MCk7CisKKwkJbWF4X21jcyA9IEhUR2V0SGlnaGVzdE1DU1JhdGUoaWVlZSwgaHRfY2FwLT5NQ1MsIE1DU19GSUxURVJfQUxMKTsKKwkJcmF0ZSA9IE1DU19EQVRBX1JBVEVbaXM0ME1dW2lzU2hvcnRHSV1bbWF4X21jcyYweDdmXTsKKwkJaWYgKHJhdGUgPiBtYXhfcmF0ZSkKKwkJCW1heF9yYXRlID0gcmF0ZTsKKwl9CisJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOworCWl3ZS51LmJpdHJhdGUuZml4ZWQgPSBpd2UudS5iaXRyYXRlLmRpc2FibGVkID0gMDsKKwlpd2UudS5iaXRyYXRlLnZhbHVlID0gbWF4X3JhdGUgKiA1MDAwMDA7CisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudF9yc2woaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsCisJCQkJICAgICBJV19FVl9QQVJBTV9MRU4pOworCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCWl3ZS51LmRhdGEubGVuZ3RoID0gcCAtIGN1c3RvbTsKKwlpZiAoaXdlLnUuZGF0YS5sZW5ndGgpCisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgY3VzdG9tKTsKKwkvKiBBZGQgcXVhbGl0eSBzdGF0aXN0aWNzICovCisJLyogVE9ETzogRml4IHRoZXNlIHZhbHVlcy4uLiAqLworCWl3ZS5jbWQgPSBJV0VWUVVBTDsKKwlpd2UudS5xdWFsLnF1YWwgPSBuZXR3b3JrLT5zdGF0cy5zaWduYWw7CisJaXdlLnUucXVhbC5sZXZlbCA9IG5ldHdvcmstPnN0YXRzLnJzc2k7CisJaXdlLnUucXVhbC5ub2lzZSA9IG5ldHdvcmstPnN0YXRzLm5vaXNlOworCWl3ZS51LnF1YWwudXBkYXRlZCA9IG5ldHdvcmstPnN0YXRzLm1hc2sgJiBJRUVFODAyMTFfU1RBVE1BU0tfV0VNQVNLOworCWlmICghKG5ldHdvcmstPnN0YXRzLm1hc2sgJiBJRUVFODAyMTFfU1RBVE1BU0tfUlNTSSkpCisJCWl3ZS51LnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX0xFVkVMX0lOVkFMSUQ7CisJaWYgKCEobmV0d29yay0+c3RhdHMubWFzayAmIElFRUU4MDIxMV9TVEFUTUFTS19OT0lTRSkpCisJCWl3ZS51LnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX05PSVNFX0lOVkFMSUQ7CisJaWYgKCEobmV0d29yay0+c3RhdHMubWFzayAmIElFRUU4MDIxMV9TVEFUTUFTS19TSUdOQUwpKQorCQlpd2UudS5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9RVUFMX0lOVkFMSUQ7CisJaXdlLnUucXVhbC51cGRhdGVkID0gNzsKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCXAgPSBjdXN0b207CisKKwlpd2UudS5kYXRhLmxlbmd0aCA9IHAgLSBjdXN0b207CisJaWYgKGl3ZS51LmRhdGEubGVuZ3RoKQorCSAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBjdXN0b20pOworI2lmIChXSVJFTEVTU19FWFQgPCAxOCkKKwlpZiAoaWVlZS0+d3BhX2VuYWJsZWQgJiYgbmV0d29yay0+d3BhX2llX2xlbil7CisJCWNoYXIgYnVmW01BWF9XUEFfSUVfTEVOICogMiArIDMwXTsKKwkvLwlwcmludGsoIldQQSBJRVxuIik7CisJCXU4ICpwID0gYnVmOworCQlwICs9IHNwcmludGYocCwgIndwYV9pZT0iKTsKKwkJZm9yIChpID0gMDsgaSA8IG5ldHdvcmstPndwYV9pZV9sZW47IGkrKykgeworCQkJcCArPSBzcHJpbnRmKHAsICIlMDJ4IiwgbmV0d29yay0+d3BhX2llW2ldKTsKKwkJfQorCisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOworCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBidWYpOworCX0KKworCWlmIChpZWVlLT53cGFfZW5hYmxlZCAmJiBuZXR3b3JrLT5yc25faWVfbGVuKXsKKwkJY2hhciBidWZbTUFYX1dQQV9JRV9MRU4gKiAyICsgMzBdOworCisJCXU4ICpwID0gYnVmOworCQlwICs9IHNwcmludGYocCwgInJzbl9pZT0iKTsKKwkJZm9yIChpID0gMDsgaSA8IG5ldHdvcmstPnJzbl9pZV9sZW47IGkrKykgeworCQkJcCArPSBzcHJpbnRmKHAsICIlMDJ4IiwgbmV0d29yay0+cnNuX2llW2ldKTsKKwkJfQorCisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOworCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBidWYpOworCX0KKyNlbHNlCisJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwlpZiAobmV0d29yay0+d3BhX2llX2xlbikKKwl7CisJCWNoYXIgYnVmW01BWF9XUEFfSUVfTEVOXTsKKwkJbWVtY3B5KGJ1ZiwgbmV0d29yay0+d3BhX2llLCBuZXR3b3JrLT53cGFfaWVfbGVuKTsKKwkJaXdlLmNtZCA9IElXRVZHRU5JRTsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBuZXR3b3JrLT53cGFfaWVfbGVuOworCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBidWYpOworCX0KKwltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCWlmIChuZXR3b3JrLT5yc25faWVfbGVuKQorCXsKKwkJY2hhciBidWZbTUFYX1dQQV9JRV9MRU5dOworCQltZW1jcHkoYnVmLCBuZXR3b3JrLT5yc25faWUsIG5ldHdvcmstPnJzbl9pZV9sZW4pOworCQlpd2UuY21kID0gSVdFVkdFTklFOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IG5ldHdvcmstPnJzbl9pZV9sZW47CisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIGJ1Zik7CisJfQorI2VuZGlmCisKKworCS8qIEFkZCBFWFRSQTogQWdlIHRvIGRpc3BsYXkgc2Vjb25kcyBzaW5jZSBsYXN0IGJlYWNvbi9wcm9iZSByZXNwb25zZQorCSAqIGZvciBnaXZlbiBuZXR3b3JrLiAqLworCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCXAgPSBjdXN0b207CisJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwKKwkJICAgICAgIiBMYXN0IGJlYWNvbjogJWx1bXMgYWdvIiwgKGppZmZpZXMgLSBuZXR3b3JrLT5sYXN0X3NjYW5uZWQpIC8gKEhaIC8gMTAwKSk7CisJaXdlLnUuZGF0YS5sZW5ndGggPSBwIC0gY3VzdG9tOworCWlmIChpd2UudS5kYXRhLmxlbmd0aCkKKwkgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgY3VzdG9tKTsKKworCXJldHVybiBzdGFydDsKK30KKworaW50IGllZWU4MDIxMV93eF9nZXRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljaGFyICpldiA9IGV4dHJhOworLy8JY2hhciAqc3RvcCA9IGV2ICsgSVdfU0NBTl9NQVhfREFUQTsKKwljaGFyICpzdG9wID0gZXYgKyB3cnF1LT5kYXRhLmxlbmd0aDsvL0lXX1NDQU5fTUFYX0RBVEE7CisJLy9jaGFyICpzdG9wID0gZXYgKyBJV19TQ0FOX01BWF9EQVRBOworCWludCBpID0gMDsKKwlpbnQgZXJyID0gMDsKKwlJRUVFODAyMTFfREVCVUdfV1goIkdldHRpbmcgc2NhblxuIik7CisJZG93bigmaWVlZS0+d3hfc2VtKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShuZXR3b3JrLCAmaWVlZS0+bmV0d29ya19saXN0LCBsaXN0KSB7CisJCWkrKzsKKwkJaWYoKHN0b3AtZXYpPDIwMCkKKwkJeworCQkJZXJyID0gLUUyQklHOworCQkJYnJlYWs7CisJCQkJCQkJCQkJCQl9CisJCWlmIChpZWVlLT5zY2FuX2FnZSA9PSAwIHx8CisJCSAgICB0aW1lX2FmdGVyKG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCArIGllZWUtPnNjYW5fYWdlLCBqaWZmaWVzKSkKKwkJCWV2ID0gcnRsODE5eF90cmFuc2xhdGVfc2NhbihpZWVlLCBldiwgc3RvcCwgbmV0d29yaywgaW5mbyk7CisJCWVsc2UKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKAorCQkJCSJOb3Qgc2hvd2luZyBuZXR3b3JrICclcyAoIgorCQkJCU1BQ19GTVQgIiknIGR1ZSB0byBhZ2UgKCVsdW1zKS5cbiIsCisJCQkJZXNjYXBlX2Vzc2lkKG5ldHdvcmstPnNzaWQsCisJCQkJCSAgICAgbmV0d29yay0+c3NpZF9sZW4pLAorCQkJCU1BQ19BUkcobmV0d29yay0+YnNzaWQpLAorCQkJCShqaWZmaWVzIC0gbmV0d29yay0+bGFzdF9zY2FubmVkKSAvIChIWiAvIDEwMCkpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IGV2IC0gIGV4dHJhOworCXdycXUtPmRhdGEuZmxhZ3MgPSAwOworCisJSUVFRTgwMjExX0RFQlVHX1dYKCJleGl0OiAlZCBuZXR3b3JrcyByZXR1cm5lZC5cbiIsIGkpOworCisJcmV0dXJuIGVycjsKK30KKworaW50IGllZWU4MDIxMV93eF9zZXRfZW5jb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5YnVmKQoreworCXN0cnVjdCBpd19wb2ludCAqZXJxID0gJih3cnF1LT5lbmNvZGluZyk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKwkJLmZsYWdzID0gMAorCX07CisJaW50IGksIGtleSwga2V5X3Byb3ZpZGVkLCBsZW47CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqY3J5cHQ7CisKKwlJRUVFODAyMTFfREVCVUdfV1goIlNFVF9FTkNPREVcbiIpOworCisJa2V5ID0gZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoa2V5KSB7CisJCWlmIChrZXkgPiBXRVBfS0VZUykKKwkJCXJldHVybiAtRUlOVkFMOworCQlrZXktLTsKKwkJa2V5X3Byb3ZpZGVkID0gMTsKKwl9IGVsc2UgeworCQlrZXlfcHJvdmlkZWQgPSAwOworCQlrZXkgPSBpZWVlLT50eF9rZXlpZHg7CisJfQorCisJSUVFRTgwMjExX0RFQlVHX1dYKCJLZXk6ICVkIFslc11cbiIsIGtleSwga2V5X3Byb3ZpZGVkID8KKwkJCSAgICJwcm92aWRlZCIgOiAiZGVmYXVsdCIpOworCWNyeXB0ID0gJmllZWUtPmNyeXB0W2tleV07CisKKwlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgeworCQlpZiAoa2V5X3Byb3ZpZGVkICYmICpjcnlwdCkgeworCQkJSUVFRTgwMjExX0RFQlVHX1dYKCJEaXNhYmxpbmcgZW5jcnlwdGlvbiBvbiBrZXkgJWQuXG4iLAorCQkJCQkgICBrZXkpOworCQkJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKKwkJfSBlbHNlCisJCQlJRUVFODAyMTFfREVCVUdfV1goIkRpc2FibGluZyBlbmNyeXB0aW9uLlxuIik7CisKKwkJLyogQ2hlY2sgYWxsIHRoZSBrZXlzIHRvIHNlZSBpZiBhbnkgYXJlIHN0aWxsIGNvbmZpZ3VyZWQsCisJCSAqIGFuZCBpZiBubyBrZXkgaW5kZXggd2FzIHByb3ZpZGVkLCBkZS1pbml0IHRoZW0gYWxsICovCisJCWZvciAoaSA9IDA7IGkgPCBXRVBfS0VZUzsgaSsrKSB7CisJCQlpZiAoaWVlZS0+Y3J5cHRbaV0gIT0gTlVMTCkgeworCQkJCWlmIChrZXlfcHJvdmlkZWQpCisJCQkJCWJyZWFrOworCQkJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdCgKKwkJCQkJaWVlZSwgJmllZWUtPmNyeXB0W2ldKTsKKwkJCX0KKwkJfQorCisJCWlmIChpID09IFdFUF9LRVlTKSB7CisJCQlzZWMuZW5hYmxlZCA9IDA7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMDsKKwkJCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRCB8IFNFQ19MRVZFTDsKKwkJfQorCisJCWdvdG8gZG9uZTsKKwl9CisKKworCisJc2VjLmVuYWJsZWQgPSAxOworCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRDsKKworCWlmICgqY3J5cHQgIT0gTlVMTCAmJiAoKmNyeXB0KS0+b3BzICE9IE5VTEwgJiYKKwkgICAgc3RyY21wKCgqY3J5cHQpLT5vcHMtPm5hbWUsICJXRVAiKSAhPSAwKSB7CisJCS8qIGNoYW5naW5nIHRvIHVzZSBXRVA7IGRlaW5pdCBwcmV2aW91c2x5IHVzZWQgYWxnb3JpdGhtCisJCSAqIG9uIHRoaXMga2V5ICovCisJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CisJfQorCisJaWYgKCpjcnlwdCA9PSBOVUxMKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqbmV3X2NyeXB0OworCisJCS8qIHRha2UgV0VQIGludG8gdXNlICovCisJCW5ld19jcnlwdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSksCisJCQkJICAgIEdGUF9LRVJORUwpOworCQlpZiAobmV3X2NyeXB0ID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJbWVtc2V0KG5ld19jcnlwdCwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSkpOworCQluZXdfY3J5cHQtPm9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcygiV0VQIik7CisJCWlmICghbmV3X2NyeXB0LT5vcHMpIHsKKwkJCXJlcXVlc3RfbW9kdWxlKCJpZWVlODAyMTFfY3J5cHRfd2VwIik7CisJCQluZXdfY3J5cHQtPm9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcygiV0VQIik7CisJCX0KKwkJaWYgKG5ld19jcnlwdC0+b3BzICYmIHRyeV9tb2R1bGVfZ2V0KG5ld19jcnlwdC0+b3BzLT5vd25lcikpCisJCQluZXdfY3J5cHQtPnByaXYgPSBuZXdfY3J5cHQtPm9wcy0+aW5pdChrZXkpOworCisJCWlmICghbmV3X2NyeXB0LT5vcHMgfHwgIW5ld19jcnlwdC0+cHJpdikgeworCQkJa2ZyZWUobmV3X2NyeXB0KTsKKwkJCW5ld19jcnlwdCA9IE5VTEw7CisKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb3VsZCBub3QgaW5pdGlhbGl6ZSBXRVA6ICIKKwkJCSAgICAgICAibG9hZCBtb2R1bGUgaWVlZTgwMjExX2NyeXB0X3dlcFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisJCSpjcnlwdCA9IG5ld19jcnlwdDsKKwl9CisKKwkvKiBJZiBhIG5ldyBrZXkgd2FzIHByb3ZpZGVkLCBzZXQgaXQgdXAgKi8KKwlpZiAoZXJxLT5sZW5ndGggPiAwKSB7CisJCWxlbiA9IGVycS0+bGVuZ3RoIDw9IDUgPyA1IDogMTM7CisJCW1lbWNweShzZWMua2V5c1trZXldLCBrZXlidWYsIGVycS0+bGVuZ3RoKTsKKwkJaWYgKGxlbiA+IGVycS0+bGVuZ3RoKQorCQkJbWVtc2V0KHNlYy5rZXlzW2tleV0gKyBlcnEtPmxlbmd0aCwgMCwKKwkJCSAgICAgICBsZW4gLSBlcnEtPmxlbmd0aCk7CisJCUlFRUU4MDIxMV9ERUJVR19XWCgiU2V0dGluZyBrZXkgJWQgdG8gJyVzJyAoJWQ6JWQgYnl0ZXMpXG4iLAorCQkJCSAgIGtleSwgZXNjYXBlX2Vzc2lkKHNlYy5rZXlzW2tleV0sIGxlbiksCisJCQkJICAgZXJxLT5sZW5ndGgsIGxlbik7CisJCXNlYy5rZXlfc2l6ZXNba2V5XSA9IGxlbjsKKwkJKCpjcnlwdCktPm9wcy0+c2V0X2tleShzZWMua2V5c1trZXldLCBsZW4sIE5VTEwsCisJCQkJICAgICAgICgqY3J5cHQpLT5wcml2KTsKKwkJc2VjLmZsYWdzIHw9ICgxIDw8IGtleSk7CisJCS8qIFRoaXMgZW5zdXJlcyBhIGtleSB3aWxsIGJlIGFjdGl2YXRlZCBpZiBubyBrZXkgaXMKKwkJICogZXhwbGljaXRlbHkgc2V0ICovCisJCWlmIChrZXkgPT0gc2VjLmFjdGl2ZV9rZXkpCisJCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7CisJCWllZWUtPnR4X2tleWlkeCA9IGtleTsKKworCX0gZWxzZSB7CisJCWxlbiA9ICgqY3J5cHQpLT5vcHMtPmdldF9rZXkoc2VjLmtleXNba2V5XSwgV0VQX0tFWV9MRU4sCisJCQkJCSAgICAgTlVMTCwgKCpjcnlwdCktPnByaXYpOworCQlpZiAobGVuID09IDApIHsKKwkJCS8qIFNldCBhIGRlZmF1bHQga2V5IG9mIGFsbCAwICovCisJCQlwcmludGsoIlNldHRpbmcga2V5ICVkIHRvIGFsbCB6ZXJvLlxuIiwKKwkJCQkJICAga2V5KTsKKworCQkJSUVFRTgwMjExX0RFQlVHX1dYKCJTZXR0aW5nIGtleSAlZCB0byBhbGwgemVyby5cbiIsCisJCQkJCSAgIGtleSk7CisJCQltZW1zZXQoc2VjLmtleXNba2V5XSwgMCwgMTMpOworCQkJKCpjcnlwdCktPm9wcy0+c2V0X2tleShzZWMua2V5c1trZXldLCAxMywgTlVMTCwKKwkJCQkJICAgICAgICgqY3J5cHQpLT5wcml2KTsKKwkJCXNlYy5rZXlfc2l6ZXNba2V5XSA9IDEzOworCQkJc2VjLmZsYWdzIHw9ICgxIDw8IGtleSk7CisJCX0KKworCQkvKiBObyBrZXkgZGF0YSAtIGp1c3Qgc2V0IHRoZSBkZWZhdWx0IFRYIGtleSBpbmRleCAqLworCQlpZiAoa2V5X3Byb3ZpZGVkKSB7CisJCQlJRUVFODAyMTFfREVCVUdfV1goCisJCQkJIlNldHRpbmcga2V5ICVkIHRvIGRlZmF1bHQgVHgga2V5LlxuIiwga2V5KTsKKwkJCWllZWUtPnR4X2tleWlkeCA9IGtleTsKKwkJCXNlYy5hY3RpdmVfa2V5ID0ga2V5OworCQkJc2VjLmZsYWdzIHw9IFNFQ19BQ1RJVkVfS0VZOworCQl9CisJfQorCisgZG9uZToKKwlpZWVlLT5vcGVuX3dlcCA9ICEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKTsKKwlpZWVlLT5hdXRoX21vZGUgPSBpZWVlLT5vcGVuX3dlcCA/IFdMQU5fQVVUSF9PUEVOIDogV0xBTl9BVVRIX1NIQVJFRF9LRVk7CisJc2VjLmF1dGhfbW9kZSA9IGllZWUtPm9wZW5fd2VwID8gV0xBTl9BVVRIX09QRU4gOiBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKKwlzZWMuZmxhZ3MgfD0gU0VDX0FVVEhfTU9ERTsKKwlJRUVFODAyMTFfREVCVUdfV1goIkF1dGg6ICVzXG4iLCBzZWMuYXV0aF9tb2RlID09IFdMQU5fQVVUSF9PUEVOID8KKwkJCSAgICJPUEVOIiA6ICJTSEFSRUQgS0VZIik7CisKKwkvKiBGb3Igbm93IHdlIGp1c3Qgc3VwcG9ydCBXRVAsIHNvIG9ubHkgc2V0IHRoYXQgc2VjdXJpdHkgbGV2ZWwuLi4KKwkgKiBUT0RPOiBXaGVuIFdQQSBpcyBhZGRlZCB0aGlzIGlzIG9uZSBwbGFjZSB0aGF0IG5lZWRzIHRvIGNoYW5nZSAqLworCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJc2VjLmxldmVsID0gU0VDX0xFVkVMXzE7IC8qIDQwIGFuZCAxMDQgYml0IFdFUCAqLworCisJaWYgKGllZWUtPnNldF9zZWN1cml0eSkKKwkJaWVlZS0+c2V0X3NlY3VyaXR5KGRldiwgJnNlYyk7CisKKwkvKiBEbyBub3QgcmVzZXQgcG9ydCBpZiBjYXJkIGlzIGluIE1hbmFnZWQgbW9kZSBzaW5jZSByZXNldHRpbmcgd2lsbAorCSAqIGdlbmVyYXRlIG5ldyBJRUVFIDgwMi4xMSBhdXRoZW50aWNhdGlvbiB3aGljaCBtYXkgZW5kIHVwIGluIGxvb3BpbmcKKwkgKiB3aXRoIElFRUUgODAyLjFYLiAgSWYgeW91ciBoYXJkd2FyZSByZXF1aXJlcyBhIHJlc2V0IGFmdGVyIFdFUAorCSAqIGNvbmZpZ3VyYXRpb24gKGZvciBleGFtcGxlLi4uIFByaXNtMiksIGltcGxlbWVudCB0aGUgcmVzZXRfcG9ydCBpbgorCSAqIHRoZSBjYWxsYmFja3Mgc3RydWN0dXJlcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIDgwMi4xMSBzdGFjay4gKi8KKwlpZiAoaWVlZS0+cmVzZXRfb25fa2V5Y2hhbmdlICYmCisJICAgIGllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJgorCSAgICBpZWVlLT5yZXNldF9wb3J0ICYmIGllZWUtPnJlc2V0X3BvcnQoZGV2KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlc2V0X3BvcnQgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleWJ1ZikKK3sKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVycSA9ICYod3JxdS0+ZW5jb2RpbmcpOworCWludCBsZW4sIGtleTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0OworCisJSUVFRTgwMjExX0RFQlVHX1dYKCJHRVRfRU5DT0RFXG4iKTsKKworCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQlyZXR1cm4gLTE7CisKKwlrZXkgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCWlmIChrZXkpIHsKKwkJaWYgKGtleSA+IFdFUF9LRVlTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWtleS0tOworCX0gZWxzZQorCQlrZXkgPSBpZWVlLT50eF9rZXlpZHg7CisKKwljcnlwdCA9IGllZWUtPmNyeXB0W2tleV07CisJZXJxLT5mbGFncyA9IGtleSArIDE7CisKKwlpZiAoY3J5cHQgPT0gTlVMTCB8fCBjcnlwdC0+b3BzID09IE5VTEwpIHsKKwkJZXJxLT5sZW5ndGggPSAwOworCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJcmV0dXJuIDA7CisJfQorCWxlbiA9IGNyeXB0LT5vcHMtPmdldF9rZXkoa2V5YnVmLCBTQ01fS0VZX0xFTiwgTlVMTCwgY3J5cHQtPnByaXYpOworCWVycS0+bGVuZ3RoID0gKGxlbiA+PSAwID8gbGVuIDogMCk7CisKKwllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOworCisJaWYgKGllZWUtPm9wZW5fd2VwKQorCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOworCWVsc2UKKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsKKworCXJldHVybiAwOworfQorI2lmIChXSVJFTEVTU19FWFQgPj0gMTgpCitpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKKwlpbnQgaSwgaWR4OworCWludCBncm91cF9rZXkgPSAwOworCWNvbnN0IGNoYXIgKmFsZywgKm1vZHVsZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdDsKKworCXN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0geworCQkuZmxhZ3MgPSAwLAorCX07CisJLy9wcmludGsoIj09PT09PT5lbmNvZGluZyBmbGFnOiV4LGV4dCBmbGFnOiV4LCBleHQgYWxnOiVkXG4iLCBlbmNvZGluZy0+ZmxhZ3MsZXh0LT5leHRfZmxhZ3MsIGV4dC0+YWxnKTsKKwlpZHggPSBlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGlkeCkgeworCQlpZiAoaWR4IDwgMSB8fCBpZHggPiBXRVBfS0VZUykKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZHgtLTsKKwl9IGVsc2UKKwkJaWR4ID0gaWVlZS0+dHhfa2V5aWR4OworCisJaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpIHsKKworCQljcnlwdCA9ICZpZWVlLT5jcnlwdFtpZHhdOworCisJCWdyb3VwX2tleSA9IDE7CisJfSBlbHNlIHsKKwkJLyogc29tZSBDaXNjbyBBUHMgdXNlIGlkeD4wIGZvciB1bmljYXN0IGluIGR5bmFtaWMgV0VQICovCisJCS8vcHJpbnRrKCJub3QgZ3JvdXAga2V5LCBmbGFnczoleCwgZXh0LT5hbGc6JWRcbiIsIGV4dC0+ZXh0X2ZsYWdzLCBleHQtPmFsZyk7CisJCWlmIChpZHggIT0gMCAmJiBleHQtPmFsZyAhPSBJV19FTkNPREVfQUxHX1dFUCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQorCisJCQljcnlwdCA9ICZpZWVlLT5jcnlwdFtpZHhdOworCisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRDsvLyB8IFNFQ19FTkNSWVBUOworCWlmICgoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB8fAorCSAgICBleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX05PTkUpIHsKKwkJaWYgKCpjcnlwdCkKKwkJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CisKKwkJZm9yIChpID0gMDsgaSA8IFdFUF9LRVlTOyBpKyspCisKKwkJCWlmIChpZWVlLT5jcnlwdFtpXSAhPSBOVUxMKQorCisJCQkJYnJlYWs7CisKKwkJaWYgKGkgPT0gV0VQX0tFWVMpIHsKKwkJCXNlYy5lbmFibGVkID0gMDsKKwkJICAgICAgLy8gIHNlYy5lbmNyeXB0ID0gMDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8wOworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJfQorCQkvL3ByaW50aygiZGlzYWJsZWQ6IGZsYWc6JXhcbiIsIGVuY29kaW5nLT5mbGFncyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzZWMuZW5hYmxlZCA9IDE7CisgICAgLy8gICAgc2VjLmVuY3J5cHQgPSAxOworCXN3aXRjaCAoZXh0LT5hbGcpIHsKKwljYXNlIElXX0VOQ09ERV9BTEdfV0VQOgorCQlhbGcgPSAiV0VQIjsKKwkJbW9kdWxlID0gImllZWU4MDIxMV9jcnlwdF93ZXAiOworCQlicmVhazsKKwljYXNlIElXX0VOQ09ERV9BTEdfVEtJUDoKKwkJYWxnID0gIlRLSVAiOworCQltb2R1bGUgPSAiaWVlZTgwMjExX2NyeXB0X3RraXAiOworCQlicmVhazsKKwljYXNlIElXX0VOQ09ERV9BTEdfQ0NNUDoKKwkJYWxnID0gIkNDTVAiOworCQltb2R1bGUgPSAiaWVlZTgwMjExX2NyeXB0X2NjbXAiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJRUVFODAyMTFfREVCVUdfV1goIiVzOiB1bmtub3duIGNyeXB0byBhbGcgJWRcbiIsCisJCQkJICAgZGV2LT5uYW1lLCBleHQtPmFsZyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJcHJpbnRrKCJhbGcgbmFtZTolc1xuIixhbGcpOworCisJIG9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhhbGcpOworCWlmIChvcHMgPT0gTlVMTCkgeworCQlyZXF1ZXN0X21vZHVsZShtb2R1bGUpOworCQlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoYWxnKTsKKwl9CisJaWYgKG9wcyA9PSBOVUxMKSB7CisJCUlFRUU4MDIxMV9ERUJVR19XWCgiJXM6IHVua25vd24gY3J5cHRvIGFsZyAlZFxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGV4dC0+YWxnKTsKKwkJcHJpbnRrKCI9PT09PT09PT51bmtub3duIGNyeXB0byBhbGcgJWRcbiIsIGV4dC0+YWxnKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICgqY3J5cHQgPT0gTlVMTCB8fCAoKmNyeXB0KS0+b3BzICE9IG9wcykgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKm5ld19jcnlwdDsKKworCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOworCisJCW5ld19jcnlwdCA9IGt6YWxsb2Moc2l6ZW9mKCpuZXdfY3J5cHQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKG5ld19jcnlwdCA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBkb25lOworCQl9CisJCW5ld19jcnlwdC0+b3BzID0gb3BzOworCQlpZiAobmV3X2NyeXB0LT5vcHMgJiYgdHJ5X21vZHVsZV9nZXQobmV3X2NyeXB0LT5vcHMtPm93bmVyKSkKKwkJCW5ld19jcnlwdC0+cHJpdiA9IG5ld19jcnlwdC0+b3BzLT5pbml0KGlkeCk7CisJCWlmIChuZXdfY3J5cHQtPnByaXYgPT0gTlVMTCkgeworCQkJa2ZyZWUobmV3X2NyeXB0KTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJKmNyeXB0ID0gbmV3X2NyeXB0OworCisJfQorCisJaWYgKGV4dC0+a2V5X2xlbiA+IDAgJiYgKCpjcnlwdCktPm9wcy0+c2V0X2tleSAmJgorCSAgICAoKmNyeXB0KS0+b3BzLT5zZXRfa2V5KGV4dC0+a2V5LCBleHQtPmtleV9sZW4sIGV4dC0+cnhfc2VxLAorCQkJCSAgICgqY3J5cHQpLT5wcml2KSA8IDApIHsKKwkJSUVFRTgwMjExX0RFQlVHX1dYKCIlczoga2V5IHNldHRpbmcgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQlwcmludGsoImtleSBzZXR0aW5nIGZhaWxlZFxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisgLy9za2lwX2hvc3RfY3J5cHQ6CisJLy9wcmludGsoInNraXBfaG9zdF9jcnlwdDpleHRfZmxhZ3M6JXhcbiIsIGV4dC0+ZXh0X2ZsYWdzKTsKKwlpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpIHsKKwkJaWVlZS0+dHhfa2V5aWR4ID0gaWR4OworCQlzZWMuYWN0aXZlX2tleSA9IGlkeDsKKwkJc2VjLmZsYWdzIHw9IFNFQ19BQ1RJVkVfS0VZOworCX0KKworCWlmIChleHQtPmFsZyAhPSBJV19FTkNPREVfQUxHX05PTkUpIHsKKwkJLy9tZW1jcHkoc2VjLmtleXNbaWR4XSwgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7CisJCXNlYy5rZXlfc2l6ZXNbaWR4XSA9IGV4dC0+a2V5X2xlbjsKKwkJc2VjLmZsYWdzIHw9ICgxIDw8IGlkeCk7CisJCWlmIChleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX1dFUCkgeworCQkgICAgICAvLyAgc2VjLmVuY29kZV9hbGdbaWR4XSA9IFNFQ19BTEdfV0VQOworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8xOworCQl9IGVsc2UgaWYgKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfVEtJUCkgeworCQkgICAgICAvLyAgc2VjLmVuY29kZV9hbGdbaWR4XSA9IFNFQ19BTEdfVEtJUDsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMjsKKwkJfSBlbHNlIGlmIChleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX0NDTVApIHsKKwkJICAgICAgIC8vIHNlYy5lbmNvZGVfYWxnW2lkeF0gPSBTRUNfQUxHX0NDTVA7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzM7CisJCX0KKwkJLyogRG9uJ3Qgc2V0IHNlYyBsZXZlbCBmb3IgZ3JvdXAga2V5cy4gKi8KKwkJaWYgKGdyb3VwX2tleSkKKwkJCXNlYy5mbGFncyAmPSB+U0VDX0xFVkVMOworCX0KK2RvbmU6CisJaWYgKGllZWUtPnNldF9zZWN1cml0eSkKKwkJaWVlZS0+c2V0X3NlY3VyaXR5KGllZWUtPmRldiwgJnNlYyk7CisKKwkgaWYgKGllZWUtPnJlc2V0X29uX2tleWNoYW5nZSAmJgorCSAgICBpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgJiYKKwkgICAgaWVlZS0+cmVzZXRfcG9ydCAmJiBpZWVlLT5yZXNldF9wb3J0KGRldikpIHsKKwkJSUVFRTgwMjExX0RFQlVHX1dYKCIlczogcmVzZXRfcG9ydCBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgaWVlZTgwMjExX3d4X2dldF9lbmNvZGVfZXh0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdDsKKwlpbnQgaWR4LCBtYXhfa2V5X2xlbjsKKworCW1heF9rZXlfbGVuID0gZW5jb2RpbmctPmxlbmd0aCAtIHNpemVvZigqZXh0KTsKKwlpZiAobWF4X2tleV9sZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoaWR4KSB7CisJCWlmIChpZHggPCAxIHx8IGlkeCA+IFdFUF9LRVlTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlkeC0tOworCX0gZWxzZQorCQlpZHggPSBpZWVlLT50eF9rZXlpZHg7CisKKwlpZiAoIWV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkgJiYKKwkgICAgZXh0LT5hbGcgIT0gSVdfRU5DT0RFX0FMR19XRVApCisJCWlmIChpZHggIT0gMCB8fCBpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWR4XTsKKwllbmNvZGluZy0+ZmxhZ3MgPSBpZHggKyAxOworCW1lbXNldChleHQsIDAsIHNpemVvZigqZXh0KSk7CisKKwlpZiAoY3J5cHQgPT0gTlVMTCB8fCBjcnlwdC0+b3BzID09IE5VTEwgKSB7CisJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19OT05FOworCQlleHQtPmtleV9sZW4gPSAwOworCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOworCX0gZWxzZSB7CisJCWlmIChzdHJjbXAoY3J5cHQtPm9wcy0+bmFtZSwgIldFUCIpID09IDAgKQorCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1dFUDsKKwkJZWxzZSBpZiAoc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJUS0lQIikpCisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfVEtJUDsKKwkJZWxzZSBpZiAoc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJDQ01QIikpCisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfQ0NNUDsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWV4dC0+a2V5X2xlbiA9IGNyeXB0LT5vcHMtPmdldF9rZXkoZXh0LT5rZXksIFNDTV9LRVlfTEVOLCBOVUxMLCBjcnlwdC0+cHJpdik7CisJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKKwkJaWYgKGV4dC0+a2V5X2xlbiAmJgorCQkgICAgKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfVEtJUCB8fAorCQkgICAgIGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfQ0NNUCkpCisJCQlleHQtPmV4dF9mbGFncyB8PSBJV19FTkNPREVfRVhUX1RYX1NFUV9WQUxJRDsKKworCX0KKworCXJldHVybiAwOworfQorCitpbnQgaWVlZTgwMjExX3d4X3NldF9tbG1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGl3X21sbWUgKm1sbWUgPSAoc3RydWN0IGl3X21sbWUgKikgZXh0cmE7CisJc3dpdGNoIChtbG1lLT5jbWQpIHsKKwljYXNlIElXX01MTUVfREVBVVRIOgorCWNhc2UgSVdfTUxNRV9ESVNBU1NPQzoKKwkJaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShpZWVlKTsKKwkJYnJlYWs7CisJIGRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfc2V0X2F1dGgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCXN3aXRjaCAoZGF0YS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisJY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgorCSAgICAgLypuZWVkIHRvIHN1cHBvcnQgd3BhMiBoZXJlKi8KKwkJLy9wcmludGsoIndwYSB2ZXJzaW9uOiV4XG4iLCBkYXRhLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6CisJY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKKwljYXNlIElXX0FVVEhfS0VZX01HTVQ6CisJCS8qCisgKiAgICAgICAgICAgICAgICAgICogSG9zdCBBUCBkcml2ZXIgZG9lcyBub3QgdXNlIHRoZXNlIHBhcmFtZXRlcnMgYW5kIGFsbG93cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd3BhX3N1cHBsaWNhbnQgdG8gY29udHJvbCB0aGVtIGludGVybmFsbHkuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQlicmVhazsKKwljYXNlIElXX0FVVEhfVEtJUF9DT1VOVEVSTUVBU1VSRVM6CisJCWllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzID0gZGF0YS0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorCQlpZWVlLT5kcm9wX3VuZW5jcnlwdGVkID0gZGF0YS0+dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorCQkvL3ByaW50aygiPT09PT09PiVzKCk6ZGF0YS0+dmFsdWUgaXMgJWRcbiIsX19GVU5DVElPTl9fLGRhdGEtPnZhbHVlKTsKKwkvLwlpZWVlLT5vcGVuX3dlcCA9IChkYXRhLT52YWx1ZSZJV19BVVRIX0FMR19PUEVOX1NZU1RFTSk/MTowOworCQlpZihkYXRhLT52YWx1ZSAmIElXX0FVVEhfQUxHX1NIQVJFRF9LRVkpeworCQkJaWVlZS0+b3Blbl93ZXAgPSAwOworCQkJaWVlZS0+YXV0aF9tb2RlID0gMTsKKwkJfQorCQllbHNlIGlmKGRhdGEtPnZhbHVlICYgSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0peworCQkJaWVlZS0+b3Blbl93ZXAgPSAxOworCQkJaWVlZS0+YXV0aF9tb2RlID0gMDsKKwkJfQorCQllbHNlIGlmKGRhdGEtPnZhbHVlICYgSVdfQVVUSF9BTEdfTEVBUCl7CisJCQlpZWVlLT5vcGVuX3dlcCA9IDE7CisJCQlpZWVlLT5hdXRoX21vZGUgPSAyOworCQkJLy9wcmludGsoImhhaGFoYWE6TEVBUFxuIik7CisJCX0KKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8vcHJpbnRrKCJvcGVuX3dlcDolZFxuIiwgaWVlZS0+b3Blbl93ZXApOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKwkJaWVlZS0+d3BhX2VuYWJsZWQgPSAoZGF0YS0+dmFsdWUpPzE6MDsKKwkJLy9wcmludGsoImVuYWxiZSB3cGE6JWRcbiIsIGllZWUtPndwYV9lbmFibGVkKTsKKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0w6CisJCWllZWUtPmllZWU4MDJfMXggPSBkYXRhLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKKwkJaWVlZS0+cHJpdmFjeV9pbnZva2VkID0gZGF0YS0+dmFsdWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKK2ludCBpZWVlODAyMTFfd3hfc2V0X2dlbl9pZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmllLCBzaXplX3QgbGVuKQoreworCXU4ICpidWY7CisKKwlpZiAobGVuPk1BWF9XUEFfSUVfTEVOIHx8IChsZW4gJiYgaWUgPT0gTlVMTCkpCisJeworCS8vCXByaW50aygicmV0dXJuIGVycm9yIG91dCwgbGVuOiVkXG4iLCBsZW4pOworCXJldHVybiAtRUlOVkFMOworCX0KKworCisJaWYgKGxlbikKKwl7CisJCWlmIChsZW4gIT0gaWVbMV0rMikKKwkJeworCQkJcHJpbnRrKCJsZW46JWQsIGllOiVkXG4iLCBsZW4sIGllWzFdKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJ1ZiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbWNweShidWYsIGllLCBsZW4pOworCQlrZnJlZShpZWVlLT53cGFfaWUpOworCQlpZWVlLT53cGFfaWUgPSBidWY7CisJCWllZWUtPndwYV9pZV9sZW4gPSBsZW47CisJfQorCWVsc2V7CisJCWlmIChpZWVlLT53cGFfaWUpCisJCWtmcmVlKGllZWUtPndwYV9pZSk7CisJCWllZWUtPndwYV9pZSA9IE5VTEw7CisJCWllZWUtPndwYV9pZV9sZW4gPSAwOworCX0KKwlyZXR1cm4gMDsKKworfQorCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKTsKKyNpZiAoV0lSRUxFU1NfRVhUID49IDE4KQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X21sbWUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X2F1dGgpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9leHQpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X2VuY29kZV9leHQpOworI2VuZGlmCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfc2Nhbik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfZW5jb2RlKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9lbmNvZGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YzA5NmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2ludGVybmFsLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2lmbmRlZiBfQ1JZUFRPX0lOVEVSTkFMX0gKKyNkZWZpbmUgX0NSWVBUT19JTlRFUk5BTF9ICisKKworLy8jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSAicnRsX2NyeXB0by5oIgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vaGFyZGlycS5oPgorI2luY2x1ZGUgPGFzbS9zb2Z0aXJxLmg+CisjaW5jbHVkZSA8YXNtL2ttYXBfdHlwZXMuaD4KKworCitleHRlcm4gZW51bSBrbV90eXBlIGNyeXB0b19rbV90eXBlc1tdOworCitzdGF0aWMgaW5saW5lIGVudW0ga21fdHlwZSBjcnlwdG9fa21hcF90eXBlKGludCBvdXQpCit7CisJcmV0dXJuIGNyeXB0b19rbV90eXBlc1soaW5fc29mdGlycSgpID8gMiA6IDApICsgb3V0XTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpjcnlwdG9fa21hcChzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG91dCkKK3sKKwlyZXR1cm4ga21hcF9hdG9taWMocGFnZSwgY3J5cHRvX2ttYXBfdHlwZShvdXQpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19rdW5tYXAodm9pZCAqdmFkZHIsIGludCBvdXQpCit7CisJa3VubWFwX2F0b21pYyh2YWRkciwgY3J5cHRvX2ttYXBfdHlwZShvdXQpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b195aWVsZChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCWlmICghaW5fc29mdGlycSgpKQorCQljb25kX3Jlc2NoZWQoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpjcnlwdG9fdGZtX2N0eChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXJldHVybiAodm9pZCAqKSZ0Zm1bMV07Cit9CisKK3N0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKTsKKworI2lmZGVmIENPTkZJR19LTU9ECit2b2lkIGNyeXB0b19hbGdfYXV0b2xvYWQoY29uc3QgY2hhciAqbmFtZSk7CitzdHJ1Y3QgY3J5cHRvX2FsZyAqY3J5cHRvX2FsZ19tb2RfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbW9kX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBjcnlwdG9fYWxnX2xvb2t1cChuYW1lKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NSWVBUT19ITUFDCitpbnQgY3J5cHRvX2FsbG9jX2htYWNfYmxvY2soc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Cit2b2lkIGNyeXB0b19mcmVlX2htYWNfYmxvY2soc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2FsbG9jX2htYWNfYmxvY2soc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19mcmVlX2htYWNfYmxvY2soc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sgfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwordm9pZCBfX2luaXQgY3J5cHRvX2luaXRfcHJvYyh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2luaXRfcHJvYyh2b2lkKQoreyB9CisjZW5kaWYKKworaW50IGNyeXB0b19pbml0X2RpZ2VzdF9mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpOworaW50IGNyeXB0b19pbml0X2NpcGhlcl9mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpOworaW50IGNyeXB0b19pbml0X2NvbXByZXNzX2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncyk7CisKK2ludCBjcnlwdG9faW5pdF9kaWdlc3Rfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOworaW50IGNyeXB0b19pbml0X2NpcGhlcl9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CitpbnQgY3J5cHRvX2luaXRfY29tcHJlc3Nfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOworCit2b2lkIGNyeXB0b19leGl0X2RpZ2VzdF9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Cit2b2lkIGNyeXB0b19leGl0X2NpcGhlcl9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Cit2b2lkIGNyeXB0b19leGl0X2NvbXByZXNzX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKKworI2VuZGlmCS8qIF9DUllQVE9fSU5URVJOQUxfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2ttYXBfdHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEva21hcF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNjdiYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2ttYXBfdHlwZXMuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9fS01BUF9UWVBFU19ICisKKyNkZWZpbmUgX19LTUFQX1RZUEVTX0gKKworCitlbnVtIGttX3R5cGUgeworCUtNX0JPVU5DRV9SRUFELAorCUtNX1NLQl9TVU5SUENfREFUQSwKKwlLTV9TS0JfREFUQV9TT0ZUSVJRLAorCUtNX1VTRVIwLAorCUtNX1VTRVIxLAorCUtNX0JIX0lSUSwKKwlLTV9TT0ZUSVJRMCwKKwlLTV9TT0ZUSVJRMSwKKwlLTV9UWVBFX05SCit9OworCisjZGVmaW5lIF9BU01fS01BUF9UWVBFU19ICisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9taWNoYWVsX21pYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9taWNoYWVsX21pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMjU2ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL21pY2hhZWxfbWljLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSQorICoKKyAqIE1pY2hhZWwgTUlDIChJRUVFIDgwMi4xMWkvVEtJUCkga2V5ZWQgZGlnZXN0CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlICJydGxfY3J5cHRvLmgiCisKKworc3RydWN0IG1pY2hhZWxfbWljX2N0eCB7CisJdTggcGVuZGluZ1s0XTsKKwlzaXplX3QgcGVuZGluZ19sZW47CisKKwl1MzIgbCwgcjsKK307CisKKworc3RhdGljIGlubGluZSB1MzIgcm90bCh1MzIgdmFsLCBpbnQgYml0cykKK3sKKwlyZXR1cm4gKHZhbCA8PCBiaXRzKSB8ICh2YWwgPj4gKDMyIC0gYml0cykpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTMyIHJvdHIodTMyIHZhbCwgaW50IGJpdHMpCit7CisJcmV0dXJuICh2YWwgPj4gYml0cykgfCAodmFsIDw8ICgzMiAtIGJpdHMpKTsKK30KKworCitzdGF0aWMgaW5saW5lIHUzMiB4c3dhcCh1MzIgdmFsKQoreworCXJldHVybiAoKHZhbCAmIDB4MDBmZjAwZmYpIDw8IDgpIHwgKCh2YWwgJiAweGZmMDBmZjAwKSA+PiA4KTsKK30KKworCisjZGVmaW5lIG1pY2hhZWxfYmxvY2sobCwgcikJXAorZG8gewkJCQlcCisJciBePSByb3RsKGwsIDE3KTsJXAorCWwgKz0gcjsJCQlcCisJciBePSB4c3dhcChsKTsJCVwKKwlsICs9IHI7CQkJXAorCXIgXj0gcm90bChsLCAzKTsJXAorCWwgKz0gcjsJCQlcCisJciBePSByb3RyKGwsIDIpOwlcCisJbCArPSByOwkJCVwKK30gd2hpbGUgKDApCisKKworc3RhdGljIGlubGluZSB1MzIgZ2V0X2xlMzIoY29uc3QgdTggKnApCit7CisJcmV0dXJuIHBbMF0gfCAocFsxXSA8PCA4KSB8IChwWzJdIDw8IDE2KSB8IChwWzNdIDw8IDI0KTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2xlMzIodTggKnAsIHUzMiB2KQoreworCXBbMF0gPSB2OworCXBbMV0gPSB2ID4+IDg7CisJcFsyXSA9IHYgPj4gMTY7CisJcFszXSA9IHYgPj4gMjQ7Cit9CisKKworc3RhdGljIHZvaWQgbWljaGFlbF9pbml0KHZvaWQgKmN0eCkKK3sKKwlzdHJ1Y3QgbWljaGFlbF9taWNfY3R4ICptY3R4ID0gY3R4OworCW1jdHgtPnBlbmRpbmdfbGVuID0gMDsKK30KKworCitzdGF0aWMgdm9pZCBtaWNoYWVsX3VwZGF0ZSh2b2lkICpjdHgsIGNvbnN0IHU4ICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCBtaWNoYWVsX21pY19jdHggKm1jdHggPSBjdHg7CisKKwlpZiAobWN0eC0+cGVuZGluZ19sZW4pIHsKKwkJaW50IGZsZW4gPSA0IC0gbWN0eC0+cGVuZGluZ19sZW47CisJCWlmIChmbGVuID4gbGVuKQorCQkJZmxlbiA9IGxlbjsKKwkJbWVtY3B5KCZtY3R4LT5wZW5kaW5nW21jdHgtPnBlbmRpbmdfbGVuXSwgZGF0YSwgZmxlbik7CisJCW1jdHgtPnBlbmRpbmdfbGVuICs9IGZsZW47CisJCWRhdGEgKz0gZmxlbjsKKwkJbGVuIC09IGZsZW47CisKKwkJaWYgKG1jdHgtPnBlbmRpbmdfbGVuIDwgNCkKKwkJCXJldHVybjsKKworCQltY3R4LT5sIF49IGdldF9sZTMyKG1jdHgtPnBlbmRpbmcpOworCQltaWNoYWVsX2Jsb2NrKG1jdHgtPmwsIG1jdHgtPnIpOworCQltY3R4LT5wZW5kaW5nX2xlbiA9IDA7CisJfQorCisJd2hpbGUgKGxlbiA+PSA0KSB7CisJCW1jdHgtPmwgXj0gZ2V0X2xlMzIoZGF0YSk7CisJCW1pY2hhZWxfYmxvY2sobWN0eC0+bCwgbWN0eC0+cik7CisJCWRhdGEgKz0gNDsKKwkJbGVuIC09IDQ7CisJfQorCisJaWYgKGxlbiA+IDApIHsKKwkJbWN0eC0+cGVuZGluZ19sZW4gPSBsZW47CisJCW1lbWNweShtY3R4LT5wZW5kaW5nLCBkYXRhLCBsZW4pOworCX0KK30KKworCitzdGF0aWMgdm9pZCBtaWNoYWVsX2ZpbmFsKHZvaWQgKmN0eCwgdTggKm91dCkKK3sKKwlzdHJ1Y3QgbWljaGFlbF9taWNfY3R4ICptY3R4ID0gY3R4OworCXU4ICpkYXRhID0gbWN0eC0+cGVuZGluZzsKKworCS8qIExhc3QgYmxvY2sgYW5kIHBhZGRpbmcgKDB4NWEsIDQuLjcgeCAwKSAqLworCXN3aXRjaCAobWN0eC0+cGVuZGluZ19sZW4pIHsKKwljYXNlIDA6CisJCW1jdHgtPmwgXj0gMHg1YTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQltY3R4LT5sIF49IGRhdGFbMF0gfCAweDVhMDA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJbWN0eC0+bCBePSBkYXRhWzBdIHwgKGRhdGFbMV0gPDwgOCkgfCAweDVhMDAwMDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQltY3R4LT5sIF49IGRhdGFbMF0gfCAoZGF0YVsxXSA8PCA4KSB8IChkYXRhWzJdIDw8IDE2KSB8CisJCQkweDVhMDAwMDAwOworCQlicmVhazsKKwl9CisJbWljaGFlbF9ibG9jayhtY3R4LT5sLCBtY3R4LT5yKTsKKwkvKiBsIF49IDA7ICovCisJbWljaGFlbF9ibG9jayhtY3R4LT5sLCBtY3R4LT5yKTsKKworCXB1dF9sZTMyKG91dCwgbWN0eC0+bCk7CisJcHV0X2xlMzIob3V0ICsgNCwgbWN0eC0+cik7Cit9CisKKworc3RhdGljIGludCBtaWNoYWVsX3NldGtleSh2b2lkICpjdHgsIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4sCisJCQkgIHUzMiAqZmxhZ3MpCit7CisJc3RydWN0IG1pY2hhZWxfbWljX2N0eCAqbWN0eCA9IGN0eDsKKwlpZiAoa2V5bGVuICE9IDgpIHsKKwkJaWYgKGZsYWdzKQorCQkJKmZsYWdzID0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU47CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltY3R4LT5sID0gZ2V0X2xlMzIoa2V5KTsKKwltY3R4LT5yID0gZ2V0X2xlMzIoa2V5ICsgNCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIG1pY2hhZWxfbWljX2FsZyA9IHsKKwkuY3JhX25hbWUJPSAibWljaGFlbF9taWMiLAorCS5jcmFfZmxhZ3MJPSBDUllQVE9fQUxHX1RZUEVfRElHRVNULAorCS5jcmFfYmxvY2tzaXplCT0gOCwKKwkuY3JhX2N0eHNpemUJPSBzaXplb2Yoc3RydWN0IG1pY2hhZWxfbWljX2N0eCksCisJLmNyYV9tb2R1bGUJPSBUSElTX01PRFVMRSwKKwkuY3JhX2xpc3QJPSBMSVNUX0hFQURfSU5JVChtaWNoYWVsX21pY19hbGcuY3JhX2xpc3QpLAorCS5jcmFfdQkJPSB7IC5kaWdlc3QgPSB7CisJLmRpYV9kaWdlc3RzaXplCT0gOCwKKwkuZGlhX2luaXQJPSBtaWNoYWVsX2luaXQsCisJLmRpYV91cGRhdGUJPSBtaWNoYWVsX3VwZGF0ZSwKKwkuZGlhX2ZpbmFsCT0gbWljaGFlbF9maW5hbCwKKwkuZGlhX3NldGtleQk9IG1pY2hhZWxfc2V0a2V5IH0gfQorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBtaWNoYWVsX21pY19pbml0KHZvaWQpCit7CisJcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl9hbGcoJm1pY2hhZWxfbWljX2FsZyk7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IG1pY2hhZWxfbWljX2V4aXQodm9pZCkKK3sKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJm1pY2hhZWxfbWljX2FsZyk7Cit9CisKKworbW9kdWxlX2luaXQobWljaGFlbF9taWNfaW5pdCk7Cittb2R1bGVfZXhpdChtaWNoYWVsX21pY19leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNaWNoYWVsIE1JQyIpOworTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9wcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWRhOTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9wcm9jLmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBTY2F0dGVybGlzdCBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBQcm9jZnMgaW5mb3JtYXRpb24uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorLy8jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSAicnRsX2NyeXB0by5oIgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgY3J5cHRvX2FsZ19saXN0OworZXh0ZXJuIHN0cnVjdCByd19zZW1hcGhvcmUgY3J5cHRvX2FsZ19zZW07CisKK3N0YXRpYyB2b2lkICpjX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqdjsKKwlsb2ZmX3QgbiA9ICpwb3M7CisKKwlkb3duX3JlYWQoJmNyeXB0b19hbGdfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoKHYsICZjcnlwdG9fYWxnX2xpc3QpCisJCWlmICghbi0tKQorCQkJcmV0dXJuIGxpc3RfZW50cnkodiwgc3RydWN0IGNyeXB0b19hbGcsIGNyYV9saXN0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKmNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnAsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnYgPSBwOworCisJKCpwb3MpKys7CisJdiA9IHYtPm5leHQ7CisJcmV0dXJuICh2ID09ICZjcnlwdG9fYWxnX2xpc3QpID8KKwkJTlVMTCA6IGxpc3RfZW50cnkodiwgc3RydWN0IGNyeXB0b19hbGcsIGNyYV9saXN0KTsKK30KKworc3RhdGljIHZvaWQgY19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKK3sKKwl1cF9yZWFkKCZjcnlwdG9fYWxnX3NlbSk7Cit9CisKK3N0YXRpYyBpbnQgY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnID0gKHN0cnVjdCBjcnlwdG9fYWxnICopcDsKKworCXNlcV9wcmludGYobSwgIm5hbWUgICAgICAgICA6ICVzXG4iLCBhbGctPmNyYV9uYW1lKTsKKwlzZXFfcHJpbnRmKG0sICJtb2R1bGUgICAgICAgOiAlc1xuIiwKKwkJICAgKGFsZy0+Y3JhX21vZHVsZSA/CisJCSAgICBhbGctPmNyYV9tb2R1bGUtPm5hbWUgOgorCQkgICAgImtlcm5lbCIpKTsKKworCXN3aXRjaCAoYWxnLT5jcmFfZmxhZ3MgJiBDUllQVE9fQUxHX1RZUEVfTUFTSykgeworCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUjoKKwkJc2VxX3ByaW50ZihtLCAidHlwZSAgICAgICAgIDogY2lwaGVyXG4iKTsKKwkJc2VxX3ByaW50ZihtLCAiYmxvY2tzaXplICAgIDogJXVcbiIsIGFsZy0+Y3JhX2Jsb2Nrc2l6ZSk7CisJCXNlcV9wcmludGYobSwgIm1pbiBrZXlzaXplICA6ICV1XG4iLAorCQkJCQlhbGctPmNyYV9jaXBoZXIuY2lhX21pbl9rZXlzaXplKTsKKwkJc2VxX3ByaW50ZihtLCAibWF4IGtleXNpemUgIDogJXVcbiIsCisJCQkJCWFsZy0+Y3JhX2NpcGhlci5jaWFfbWF4X2tleXNpemUpOworCQlicmVhazsKKworCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0RJR0VTVDoKKwkJc2VxX3ByaW50ZihtLCAidHlwZSAgICAgICAgIDogZGlnZXN0XG4iKTsKKwkJc2VxX3ByaW50ZihtLCAiYmxvY2tzaXplICAgIDogJXVcbiIsIGFsZy0+Y3JhX2Jsb2Nrc2l6ZSk7CisJCXNlcV9wcmludGYobSwgImRpZ2VzdHNpemUgICA6ICV1XG4iLAorCQkJICAgYWxnLT5jcmFfZGlnZXN0LmRpYV9kaWdlc3RzaXplKTsKKwkJYnJlYWs7CisJY2FzZSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1M6CisJCXNlcV9wcmludGYobSwgInR5cGUgICAgICAgICA6IGNvbXByZXNzaW9uXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2VxX3ByaW50ZihtLCAidHlwZSAgICAgICAgIDogdW5rbm93blxuIik7CisJCWJyZWFrOworCX0KKworCXNlcV9wdXRjKG0sICdcbicpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGNyeXB0b19zZXFfb3BzID0geworCS5zdGFydAkJPSBjX3N0YXJ0LAorCS5uZXh0CQk9IGNfbmV4dCwKKwkuc3RvcAkJPSBjX3N0b3AsCisJLnNob3cJCT0gY19zaG93Cit9OworCitzdGF0aWMgaW50IGNyeXB0b19pbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZjcnlwdG9fc2VxX29wcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfY3J5cHRvX29wcyA9IHsKKwkub3BlbgkJPSBjcnlwdG9faW5mb19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UKK307CisKK3ZvaWQgX19pbml0IGNyeXB0b19pbml0X3Byb2Modm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7CisKKwlwcm9jID0gY3JlYXRlX3Byb2NfZW50cnkoImNyeXB0byIsIDAsIE5VTEwpOworCWlmIChwcm9jKQorCQlwcm9jLT5wcm9jX2ZvcHMgPSAmcHJvY19jcnlwdG9fb3BzOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0JBLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfQkEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGRjOGJmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9CQS5oCkBAIC0wLDAgKzEsNjkgQEAKKyNpZm5kZWYgX0JBVFlQRV9IXworI2RlZmluZSBfQkFUWVBFX0hfCisKKyNkZWZpbmUgCVRPVEFMX1RYQkFfTlVNCTE2CisjZGVmaW5lCVRPVEFMX1JYQkFfTlVNCTE2CisKKyNkZWZpbmUJQkFfU0VUVVBfVElNRU9VVAkyMDAKKyNkZWZpbmUJQkFfSU5BQ1RfVElNRU9VVAk2MDAwMAorCisjZGVmaW5lCUJBX1BPTElDWV9ERUxBWUVECQkwCisjZGVmaW5lCUJBX1BPTElDWV9JTU1FRElBVEUJMQorCisjZGVmaW5lCUFEREJBX1NUQVRVU19TVUNDRVNTCQkJMAorI2RlZmluZQlBRERCQV9TVEFUVVNfUkVGVVNFRAkJMzcKKyNkZWZpbmUJQUREQkFfU1RBVFVTX0lOVkFMSURfUEFSQU0JMzgKKworI2RlZmluZQlERUxCQV9SRUFTT05fUVNUQV9MRUFWSU5HCTM2CisjZGVmaW5lCURFTEJBX1JFQVNPTl9FTkRfQkEJCQkzNworI2RlZmluZQlERUxCQV9SRUFTT05fVU5LTk9XTl9CQQkzOAorI2RlZmluZQlERUxCQV9SRUFTT05fVElNRU9VVAkJCTM5CisvKiAgd2hldGhlciBuZWVkIGRlZmluZSBCQSBBY3Rpb24gZnJhbWVzIGhlcmU/CitzdHJ1Y3QgaWVlZTgwMjExX0FEREJBX1JlcXsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIGhlYWRlcjsKKwl1OAljYXRlZ29yeTsKKwl1OAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisqLworLy9JcyB0aGlzIG5lZWQ/SSBwdXQgaGVyZSBqdXN0IHRvIG1ha2UgaXQgZWFzaWVyIHRvIGRlZmluZSBzdHJ1Y3R1cmUgQkFfUkVDT1JEIC8vV0IKK3R5cGVkZWYgdW5pb24gX1NFUVVFTkNFX0NPTlRST0x7CisJdTE2IFNob3J0RGF0YTsKKwlzdHJ1Y3QKKwl7CisJCXUxNglGcmFnTnVtOjQ7CisJCXUxNglTZXFOdW06MTI7CisJfWZpZWxkOworfVNFUVVFTkNFX0NPTlRST0wsICpQU0VRVUVOQ0VfQ09OVFJPTDsKKwordHlwZWRlZiB1bmlvbiBfQkFfUEFSQU1fU0VUIHsKKwl1OCBjaGFyRGF0YVsyXTsKKwl1MTYgc2hvcnREYXRhOworCXN0cnVjdCB7CisJCXUxNiBBTVNEVV9TdXBwb3J0OjE7CisJCXUxNiBCQVBvbGljeToxOworCQl1MTYgVElEOjQ7CisJCXUxNiBCdWZmZXJTaXplOjEwOworCX0gZmllbGQ7Cit9IEJBX1BBUkFNX1NFVCwgKlBCQV9QQVJBTV9TRVQ7CisKK3R5cGVkZWYgdW5pb24gX0RFTEJBX1BBUkFNX1NFVCB7CisJdTggY2hhckRhdGFbMl07CisJdTE2IHNob3J0RGF0YTsKKwlzdHJ1Y3QgeworCQl1MTYgUmVzZXJ2ZWQ6MTE7CisJCXUxNiBJbml0aWF0b3I6MTsKKwkJdTE2IFRJRDo0OworCX0gZmllbGQ7Cit9IERFTEJBX1BBUkFNX1NFVCwgKlBERUxCQV9QQVJBTV9TRVQ7CisKK3R5cGVkZWYgc3RydWN0IF9CQV9SRUNPUkQgeworCXN0cnVjdCB0aW1lcl9saXN0CQlUaW1lcjsKKwl1OAkJCQliVmFsaWQ7CisJdTgJCQkJRGlhbG9nVG9rZW47CisJQkFfUEFSQU1fU0VUCQlCYVBhcmFtU2V0OworCXUxNgkJCQlCYVRpbWVvdXRWYWx1ZTsKKwlTRVFVRU5DRV9DT05UUk9MCUJhU3RhcnRTZXFDdHJsOworfSBCQV9SRUNPUkQsICpQQkFfUkVDT1JEOworCisjZW5kaWYgLy9lbmQgX0JBVFlQRV9IXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfQkFQcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfQkFQcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZhZjQzYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYwpAQCAtMCwwICsxLDczNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIGZpbGUgaXMgY3JlYXRlZCB0byBwcm9jZXNzIEJBIEFjdGlvbiBGcmFtZS4gQWNjb3JkaW5nIHRvIDgwMi4xMSBzcGVjLCB0aGVyZSBhcmUgMyBCQSBhY3Rpb24gdHlwZXMgYXQgYWxsLiBBbmQgYXMgQkEgaXMKKyAqIHJlbGF0ZWQgdG8gVFMsIHRoaXMgcGFydCBuZWVkIHNvbWUgc3RydXR1cmUgZGVmaW5lZCBpbiBRT1Mgc2lkZSBjb2RlLiBBbHNvIFRYIFJYIGlzIGdvaW5nIHRvIGJlIHJlc3R1cmN0dXJlZCwgc28gaG93IHRvIHNlbmQKKyAqIEFEREJBUkVRIEFEREJBUlNQIGFuZCBERUxCQSBwYWNrZXQgaXMgc3RpbGwgb24gY29uc2lkZXJhdGlvbi4gVGVtcG9yYXJpbHkgdXNlIE1BTkFHRSBRVUVVRSBpbnN0ZWFkIG9mIE5vcm1hbCBRdWV1ZS4KKyAqIFdCIDIwMDgtMDUtMjcKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorI2luY2x1ZGUgInJ0bDgxOXhfQkEuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgQWN0aXZhdGUgQkEgZW50cnkuIEFuZCBpZiBUaW1lIGlzIG5vemVybywgc3RhcnQgdGltZXIuCisgKiAgIGlucHV0OiAgUEJBX1JFQ09SRCAJCXBCQSAgLy9CQSBlbnRyeSB0byBiZSBlbmFibGVkCisgKiAgIAkgICAgIHUxNiAJCQlUaW1lIC8vaW5kaWNhdGUgdGltZSBkZWxheS4KKyAqICBvdXRwdXQ6ICBub25lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQWN0aXZhdGVCQUVudHJ5KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBQQkFfUkVDT1JEIHBCQSwgdTE2IFRpbWUpCit7CisJcEJBLT5iVmFsaWQgPSB0cnVlOworCWlmKFRpbWUgIT0gMCkKKwkJbW9kX3RpbWVyKCZwQkEtPlRpbWVyLCBqaWZmaWVzICsgTVNFQ1MoVGltZSkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBkZWFjdGl2YXRlIEJBIGVudHJ5LCBpbmNsdWRpbmcgaXRzIHRpbWVyLgorICogICBpbnB1dDogIFBCQV9SRUNPUkQgCQlwQkEgIC8vQkEgZW50cnkgdG8gYmUgZGlzYWJsZWQKKyAqICBvdXRwdXQ6ICBub25lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRGVBY3RpdmF0ZUJBRW50cnkoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBQQkFfUkVDT1JEIHBCQSkKK3sKKwlwQkEtPmJWYWxpZCA9IGZhbHNlOworCWRlbF90aW1lcl9zeW5jKCZwQkEtPlRpbWVyKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogZGVhY3RpdmV0ZSBCQSBlbnRyeSBpbiBUeCBUcywgYW5kIHNlbmQgREVMQkEuCisgKiAgIGlucHV0OgorICogICAJICAgICBQVFhfVFNfUkVDT1JECQlwVHhUcyAvL1R4IFRzIHdoaWNoIGlzIHRvIGRlYWN0aXZhdGUgQkEgZW50cnkuCisgKiAgb3V0cHV0OiAgbm9uZQorICogIG5vdGljZTogIEFzIFBUWF9UU19SRUNPUkQgc3RydWN0dXJlIHdpbGwgYmUgZGVmaW5lZCBpbiBRT1MsIHNvIHdhaXQgdG8gYmUgbWVyZ2VkLiAvL0ZJWE1FCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IFR4VHNEZWxldGVCQSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIFBUWF9UU19SRUNPUkQJcFR4VHMpCit7CisJUEJBX1JFQ09SRAkJcEFkbWl0dGVkQmEgPSAmcFR4VHMtPlR4QWRtaXR0ZWRCQVJlY29yZDsgIC8vVGhlc2UgdHdvIEJBIGVudHJpZXMgbXVzdCBleGlzdCBpbiBUUyBzdHJ1Y3R1cmUKKwlQQkFfUkVDT1JECQlwUGVuZGluZ0JhID0gJnBUeFRzLT5UeFBlbmRpbmdCQVJlY29yZDsKKwl1OAkJCWJTZW5kREVMQkEgPSBmYWxzZTsKKworCS8vIERlbGV0ZSBwZW5kaW5nIEJBCisJaWYocFBlbmRpbmdCYS0+YlZhbGlkKQorCXsKKwkJRGVBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcFBlbmRpbmdCYSk7CisJCWJTZW5kREVMQkEgPSB0cnVlOworCX0KKworCS8vIERlbGV0ZSBhZG1pdHRlZCBCQQorCWlmKHBBZG1pdHRlZEJhLT5iVmFsaWQpCisJeworCQlEZUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwQWRtaXR0ZWRCYSk7CisJCWJTZW5kREVMQkEgPSB0cnVlOworCX0KKworCXJldHVybiBiU2VuZERFTEJBOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246IGRlYWN0aXZldGUgQkEgZW50cnkgaW4gVHggVHMsIGFuZCBzZW5kIERFTEJBLgorICogICBpbnB1dDoKKyAqICAgCSAgICAgUFJYX1RTX1JFQ09SRAkJcFJ4VHMgLy9SeCBUcyB3aGljaCBpcyB0byBkZWFjdGl2YXRlIEJBIGVudHJ5LgorICogIG91dHB1dDogIG5vbmUKKyAqICBub3RpY2U6ICBBcyBQUlhfVFNfUkVDT1JEIHN0cnVjdHVyZSB3aWxsIGJlIGRlZmluZWQgaW4gUU9TLCBzbyB3YWl0IHRvIGJlIG1lcmdlZC4gLy9GSVhNRSwgc2FtZSB3aXRoIGFib3ZlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IFJ4VHNEZWxldGVCQSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIFBSWF9UU19SRUNPUkQJcFJ4VHMpCit7CisJUEJBX1JFQ09SRAkJcEJhID0gJnBSeFRzLT5SeEFkbWl0dGVkQkFSZWNvcmQ7CisJdTgJCQliU2VuZERFTEJBID0gZmFsc2U7CisKKwlpZihwQmEtPmJWYWxpZCkKKwl7CisJCURlQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBCYSk7CisJCWJTZW5kREVMQkEgPSB0cnVlOworCX0KKworCXJldHVybiBiU2VuZERFTEJBOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246IHJlc2V0IEJBIGVudHJ5CisgKiAgIGlucHV0OgorICogICAJICAgICBQQkFfUkVDT1JECQlwQkEgLy9lbnRyeSB0byBiZSByZXNldAorICogIG91dHB1dDogIG5vbmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBSZXNldEJhRW50cnkoIFBCQV9SRUNPUkQgcEJBKQoreworCXBCQS0+YlZhbGlkCQkJPSBmYWxzZTsKKwlwQkEtPkJhUGFyYW1TZXQuc2hvcnREYXRhCT0gMDsKKwlwQkEtPkJhVGltZW91dFZhbHVlCQk9IDA7CisJcEJBLT5EaWFsb2dUb2tlbgkJPSAwOworCXBCQS0+QmFTdGFydFNlcUN0cmwuU2hvcnREYXRhCT0gMDsKK30KKy8vVGhlc2UgZnVuY3Rpb25zIG5lZWQgcG9ydGluZyBoZXJlIG9yIG5vdD8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgY29uc3RydWN0IEFEREJBUkVRIGFuZCBBRERCQVJTUCBmcmFtZSBoZXJlIHRvZ2V0aGVyLgorICogICBpbnB1dDogIHU4KiAJCURzdCAJLy9BRERCQSBmcmFtZSdzIGRlc3RpbmF0aW9uCisgKiAgIAkgICAgIFBCQV9SRUNPUkQgCXBCQQkvL0JBX1JFQ09SRCBlbnRyeSB3aGljaCBzdG9yZXMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgQkEuCisgKiAgIAkgICAgIHUxNiAJCVN0YXR1c0NvZGUgIC8vc3RhdHVzIGNvZGUgaW4gUlNQIGFuZCBJIHdpbGwgdXNlIGl0IHRvIGluZGljYXRlIHdoZXRoZXIgaXQncyBSU1Agb3IgUkVRKHdpbGwgST8pCisgKiAgIAkgICAgIHU4CQkJdHlwZQkvL2luZGljYXRlIHdoZXRoZXIgaXQncyBSU1AoQUNUX0FEREJBUlNQKSBvdyBSRVEoQUNUX0FEREJBUkVRKQorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBza19idWZmKiAJCXNrYiAgICAgLy9yZXR1cm4gY29uc3RydWN0ZWQgc2tiIHRvIHhtaXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYqIGllZWU4MDIxMV9BRERCQShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIERzdCwgUEJBX1JFQ09SRCBwQkEsIHUxNiBTdGF0dXNDb2RlLCB1OCB0eXBlKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCSBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciogQkFSZXEgPSBOVUxMOworCXU4KiB0YWcgPSBOVUxMOworCXUxNiB0bXAgPSAwOworCXUxNiBsZW4gPSBpZWVlLT50eF9oZWFkcm9vbSArIDk7CisJLy9jYXRlZ29yeSgxKSArIGFjdGlvbiBmaWVsZCgxKSArIERpYWxvZyBUb2tlbigxKSArIEJBIFBhcmFtZXRlciBTZXQoMikgKyAgQkEgVGltZW91dCBWYWx1ZSgyKSArICBCQSBTdGFydCBTZXFDdHJsKDIpKG9yIFN0YXR1c0NvZGUoMikpCisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9UUkFDRSB8IElFRUU4MDIxMV9ETF9CQSwgIj09PT09PT09PiVzKCksIGZyYW1lKCVkKSBzZW50ZCB0bzoiTUFDX0ZNVCIsIGllZWUtPmRldjolcFxuIiwgX19GVU5DVElPTl9fLCB0eXBlLCBNQUNfQVJHKERzdCksIGllZWUtPmRldik7CisJaWYgKHBCQSA9PSBOVUxMfHxpZWVlID09IE5VTEwpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgInBCQSglcCkgaXMgTlVMTCBvciBpZWVlKCVwKSBpcyBOVUxMXG4iLCBwQkEsIGllZWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyBzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7IC8vbmVlZCB0byBhZGQgc29tZXRoaW5nIG90aGVycz8gRklYTUUKKwlpZiAoc2tiID09IE5VTEwpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImNhbid0IGFsbG9jIHNrYiBmb3IgQUREQkFfUkVRXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHNrYi0+ZGF0YSwgMCwgc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpOyAgCS8vSSB3b25kZXIgd2hldGhlciBpdCdzIG5lY2Vzc2FyeS4gQXBwYXJlbnRseSBrZXJuZWwgd2lsbCBub3QgZG8gaXQgd2hlbiBhbGxvYyBhIHNrYi4KKwlza2JfcmVzZXJ2ZShza2IsIGllZWUtPnR4X2hlYWRyb29tKTsKKworCUJBUmVxID0gKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKSBza2JfcHV0KHNrYixzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CisKKwltZW1jcHkoQkFSZXEtPmFkZHIxLCBEc3QsIEVUSF9BTEVOKTsKKwltZW1jcHkoQkFSZXEtPmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisKKwltZW1jcHkoQkFSZXEtPmFkZHIzLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKworCUJBUmVxLT5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfTUFOQUdFX0FDVCk7IC8vYWN0aW9uIGZyYW1lCisKKwkvL3RhZyArPSBzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsgLy9tb3ZlIHRvIGFjdGlvbiBmaWVsZAorCXRhZyA9ICh1OCopc2tiX3B1dChza2IsIDkpOworCSp0YWcgKys9IEFDVF9DQVRfQkE7CisJKnRhZyArKz0gdHlwZTsKKwkvLyBEaWFsb2cgVG9rZW4KKwkqdGFnICsrPSBwQkEtPkRpYWxvZ1Rva2VuOworCisJaWYgKEFDVF9BRERCQVJTUCA9PSB0eXBlKQorCXsKKwkJLy8gU3RhdHVzIENvZGUKKwkJcHJpbnRrKCI9PT09PT50byBzZW5kIEFEREJBUlNQXG4iKTsKKwkJdG1wID0gY3B1X3RvX2xlMTYoU3RhdHVzQ29kZSk7CisJCW1lbWNweSh0YWcsICh1OCopJnRtcCwgMik7CisJCXRhZyArPSAyOworCX0KKwkvLyBCQSBQYXJhbWV0ZXIgU2V0CisJdG1wID0gY3B1X3RvX2xlMTYocEJBLT5CYVBhcmFtU2V0LnNob3J0RGF0YSk7CisJbWVtY3B5KHRhZywgKHU4KikmdG1wLCAyKTsKKwl0YWcgKz0gMjsKKwkvLyBCQSBUaW1lb3V0IFZhbHVlCisJdG1wID0gY3B1X3RvX2xlMTYocEJBLT5CYVRpbWVvdXRWYWx1ZSk7CisJbWVtY3B5KHRhZywgKHU4KikmdG1wLCAyKTsKKwl0YWcgKz0gMjsKKworCWlmIChBQ1RfQUREQkFSRVEgPT0gdHlwZSkKKwl7CisJLy8gQkEgU3RhcnQgU2VxQ3RybAorCQltZW1jcHkodGFnLCh1OCopJihwQkEtPkJhU3RhcnRTZXFDdHJsKSwgMik7CisJCXRhZyArPSAyOworCX0KKworCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBfElFRUU4MDIxMV9ETF9CQSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJcmV0dXJuIHNrYjsKKwkvL3JldHVybiBOVUxMOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIGNvbnN0cnVjdCBERUxCQSBmcmFtZQorICogICBpbnB1dDogIHU4KiAJCWRzdCAJLy9ERUxCQSBmcmFtZSdzIGRlc3RpbmF0aW9uCisgKiAgIAkgICAgIFBCQV9SRUNPUkQgCXBCQQkvL0JBX1JFQ09SRCBlbnRyeSB3aGljaCBzdG9yZXMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgQkEKKyAqICAgCSAgICAgVFJfU0VMRUNUCSAgICAgICAgVHhSeFNlbGVjdCAgLy9UWCBSWCBkaXJlY3Rpb24KKyAqICAgCSAgICAgdTE2IAkJUmVhc29uQ29kZSAgLy9zdGF0dXMgY29kZS4KKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgc2tfYnVmZiogCQlza2IgICAgIC8vcmV0dXJuIGNvbnN0cnVjdGVkIHNrYiB0byB4bWl0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX0RFTEJBKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLAorCXU4KgkJICAgICAgICAgZHN0LAorCVBCQV9SRUNPUkQJCSBwQkEsCisJVFJfU0VMRUNUCQkgVHhSeFNlbGVjdCwKKwl1MTYJCQkgUmVhc29uQ29kZQorCSkKK3sKKwlERUxCQV9QQVJBTV9TRVQJRGVsYmFQYXJhbVNldDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwkgc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIqIERlbGJhID0gTlVMTDsKKwl1OCogdGFnID0gTlVMTDsKKwl1MTYgdG1wID0gMDsKKwkvL2xlbiA9IGhlYWQgbGVuICsgREVMQkEgUGFyYW1ldGVyIFNldCgyKSArIFJlYXNvbiBDb2RlKDIpCisJdTE2IGxlbiA9IDYgKyBpZWVlLT50eF9oZWFkcm9vbTsKKworCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9UUkFDRSB8IElFRUU4MDIxMV9ETF9CQSwgIj09PT09PT09PiVzKCksIFJlYXNvbkNvZGUoJWQpIHNlbnRkIHRvOiJNQUNfRk1UIlxuIiwgX19GVU5DVElPTl9fLCBSZWFzb25Db2RlLCBNQUNfQVJHKGRzdCkpOworCisJbWVtc2V0KCZEZWxiYVBhcmFtU2V0LCAwLCAyKTsKKworCURlbGJhUGFyYW1TZXQuZmllbGQuSW5pdGlhdG9yCT0gKFR4UnhTZWxlY3Q9PVRYX0RJUik/MTowOworCURlbGJhUGFyYW1TZXQuZmllbGQuVElECT0gcEJBLT5CYVBhcmFtU2V0LmZpZWxkLlRJRDsKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpOyAvL25lZWQgdG8gYWRkIHNvbWV0aGluZyBvdGhlcnM/IEZJWE1FCisJaWYgKHNrYiA9PSBOVUxMKQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJjYW4ndCBhbGxvYyBza2IgZm9yIEFEREJBX1JFUVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKy8vCW1lbXNldChza2ItPmRhdGEsIDAsIGxlbitzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CisJc2tiX3Jlc2VydmUoc2tiLCBpZWVlLT50eF9oZWFkcm9vbSk7CisKKwlEZWxiYSA9ICggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKikgc2tiX3B1dChza2Isc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpOworCisJbWVtY3B5KERlbGJhLT5hZGRyMSwgZHN0LCBFVEhfQUxFTik7CisJbWVtY3B5KERlbGJhLT5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShEZWxiYS0+YWRkcjMsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCURlbGJhLT5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfTUFOQUdFX0FDVCk7IC8vYWN0aW9uIGZyYW1lCisKKwl0YWcgPSAodTgqKXNrYl9wdXQoc2tiLCA2KTsKKworCSp0YWcgKys9IEFDVF9DQVRfQkE7CisJKnRhZyArKz0gQUNUX0RFTEJBOworCisJLy8gREVMQkEgUGFyYW1ldGVyIFNldAorCXRtcCA9IGNwdV90b19sZTE2KERlbGJhUGFyYW1TZXQuc2hvcnREYXRhKTsKKwltZW1jcHkodGFnLCAodTgqKSZ0bXAsIDIpOworCXRhZyArPSAyOworCS8vIFJlYXNvbiBDb2RlCisJdG1wID0gY3B1X3RvX2xlMTYoUmVhc29uQ29kZSk7CisJbWVtY3B5KHRhZywgKHU4KikmdG1wLCAyKTsKKwl0YWcgKz0gMjsKKworCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBfElFRUU4MDIxMV9ETF9CQSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RSQUNFIHwgSUVFRTgwMjExX0RMX0JBLCAiPD09PT09JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gc2tiOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246IHNlbmQgQUREQkFSZXEgZnJhbWUgb3V0CisgKiAgIGlucHV0OiAgdTgqIAkJZHN0IAkvL0FEREJBUmVxIGZyYW1lJ3MgZGVzdGluYXRpb24KKyAqICAgCSAgICAgUEJBX1JFQ09SRCAJcEJBCS8vQkFfUkVDT1JEIGVudHJ5IHdoaWNoIHN0b3JlcyB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciBCQQorICogIG91dHB1dDogIG5vbmUKKyAqICBub3RpY2U6IElmIGFueSBwb3NzaWJsZSwgcGxlYXNlIGhpZGUgcEJBIGluIGllZWUuIEFuZCB0ZW1wb3JhcmlseSB1c2UgTWFuYWdlIFF1ZXVlIGFzIHNvZnRtYWNfbWdtdF94bWl0KCkgdXN1YWxseSBkb2VzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaWVlZTgwMjExX3NlbmRfQUREQkFSZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4Kglkc3QsIFBCQV9SRUNPUkQJcEJBKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXNrYiA9IGllZWU4MDIxMV9BRERCQShpZWVlLCBkc3QsIHBCQSwgMCwgQUNUX0FEREJBUkVRKTsgLy9jb25zdHJ1Y3QgQUNUX0FEREJBUkVRIGZyYW1lcyBzbyBzZXQgc3RhdHVzY29kZSB6ZXJvLgorCisJaWYgKHNrYikKKwl7CisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CisJCS8vYWRkIHN0YXRpc3RpYyBuZWVkZWQgaGVyZS4KKwkJLy9hbmQgc2tiIHdpbGwgYmUgZnJlZWQgaW4gc29mdG1hY19tZ210X3htaXQoKSwgc28gb21pdCBhbGwgZGV2X2tmcmVlX3NrYl9hbnkoKSBvdXRzaWRlIHNvZnRtYWNfbWdtdF94bWl0KCkKKwkJLy9XQgorCX0KKwllbHNlCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImFsbG9jIHNrYiBlcnJvciBpbiBmdW5jdGlvbiAlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogc2VuZCBBRERCQVJTUCBmcmFtZSBvdXQKKyAqICAgaW5wdXQ6ICB1OCogCQlkc3QgCS8vREVMQkEgZnJhbWUncyBkZXN0aW5hdGlvbgorICogICAJICAgICBQQkFfUkVDT1JEIAlwQkEJLy9CQV9SRUNPUkQgZW50cnkgd2hpY2ggc3RvcmVzIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIEJBCisgKiAgIAkgICAgIHUxNgkJU3RhdHVzQ29kZSAvL1JTUCBTdGF0dXNDb2RlCisgKiAgb3V0cHV0OiAgbm9uZQorICogIG5vdGljZTogSWYgYW55IHBvc3NpYmxlLCBwbGVhc2UgaGlkZSBwQkEgaW4gaWVlZS4gQW5kIHRlbXBvcmFyaWx5IHVzZSBNYW5hZ2UgUXVldWUgYXMgc29mdG1hY19tZ210X3htaXQoKSB1c3VhbGx5IGRvZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpZWVlODAyMTFfc2VuZF9BRERCQVJzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIGRzdCwgUEJBX1JFQ09SRCBwQkEsIHUxNiBTdGF0dXNDb2RlKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXNrYiA9IGllZWU4MDIxMV9BRERCQShpZWVlLCBkc3QsIHBCQSwgU3RhdHVzQ29kZSwgQUNUX0FEREJBUlNQKTsgLy9jb25zdHJ1Y3QgQUNUX0FEREJBUlNQIGZyYW1lcworCWlmIChza2IpCisJeworCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQkvL3NhbWUgYWJvdmUKKwl9CisJZWxzZQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJhbGxvYyBza2IgZXJyb3IgaW4gZnVuY3Rpb24gJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwl9CisKKwlyZXR1cm47CisKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogc2VuZCBBRERCQVJTUCBmcmFtZSBvdXQKKyAqICAgaW5wdXQ6ICB1OCogCQlkc3QgCS8vREVMQkEgZnJhbWUncyBkZXN0aW5hdGlvbgorICogICAJICAgICBQQkFfUkVDT1JEIAlwQkEJLy9CQV9SRUNPUkQgZW50cnkgd2hpY2ggc3RvcmVzIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIEJBCisgKiAgIAkgICAgIFRSX1NFTEVDVCAgICAgICAgICBUeFJ4U2VsZWN0IC8vVFggb3IgUlgKKyAqICAgCSAgICAgdTE2CQlSZWFzb25Db2RlIC8vREVMIFJlYXNvbkNvZGUKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgbm90aWNlOiBJZiBhbnkgcG9zc2libGUsIHBsZWFzZSBoaWRlIHBCQSBpbiBpZWVlLiBBbmQgdGVtcG9yYXJpbHkgdXNlIE1hbmFnZSBRdWV1ZSBhcyBzb2Z0bWFjX21nbXRfeG1pdCgpIHVzdWFsbHkgZG9lcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgaWVlZTgwMjExX3NlbmRfREVMQkEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4KiBkc3QsIFBCQV9SRUNPUkQgcEJBLCBUUl9TRUxFQ1QgVHhSeFNlbGVjdCwgdTE2IFJlYXNvbkNvZGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJc2tiID0gaWVlZTgwMjExX0RFTEJBKGllZWUsIGRzdCwgcEJBLCBUeFJ4U2VsZWN0LCBSZWFzb25Db2RlKTsgLy9jb25zdHJ1Y3QgQUNUX0FEREJBUlNQIGZyYW1lcworCWlmIChza2IpCisJeworCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQkvL3NhbWUgYWJvdmUKKwl9CisJZWxzZQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJhbGxvYyBza2IgZXJyb3IgaW4gZnVuY3Rpb24gJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwl9CisJcmV0dXJuIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiBSWCBBRERCQVJlcQorICogICBpbnB1dDogIHN0cnVjdCBza19idWZmICogICBza2IJLy9pbmNvbWluZyBBRERCQVJlcSBza2IuCisgKiAgcmV0dXJuOiAgMChwYXNzKSwgb3RoZXIoZmFpbCkKKyAqICBub3RpY2U6ICBBcyB0aGlzIGZ1bmN0aW9uIG5lZWQgc3VwcG9ydCBvZiBRT1MsIEkgY29tbWVudCBzb21lIGNvZGUgb3V0LiBBbmQgd2hlbiBxb3MgaXMgcmVhZHksIHRoaXMgY29kZSBuZWVkIHRvIGJlIHN1cHBvcnQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBpZWVlODAyMTFfcnhfQUREQkFSZXEoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCSBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciogcmVxID0gTlVMTDsKKwl1MTYgcmMgPSAwOworCXU4ICogZHN0ID0gTlVMTCwgKnBEaWFsb2dUb2tlbiA9IE5VTEwsICp0YWcgPSBOVUxMOworCVBCQV9SRUNPUkQgcEJBID0gTlVMTDsKKwlQQkFfUEFSQU1fU0VUCXBCYVBhcmFtU2V0ID0gTlVMTDsKKwl1MTYqIHBCYVRpbWVvdXRWYWwgPSBOVUxMOworCVBTRVFVRU5DRV9DT05UUk9MIHBCYVN0YXJ0U2VxQ3RybCA9IE5VTEw7CisJUFJYX1RTX1JFQ09SRAlwVFMgPSBOVUxMOworCisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA5KQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICIgSW52YWxpZCBza2IgbGVuIGluIEJBUkVRKCVkIC8gJWQpXG4iLCBza2ItPmxlbiwgCShzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSArIDkpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBfElFRUU4MDIxMV9ETF9CQSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKwlyZXEgPSAoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKikgc2tiLT5kYXRhOworCXRhZyA9ICh1OCopcmVxOworCWRzdCA9ICh1OCopKCZyZXEtPmFkZHIyWzBdKTsKKwl0YWcgKz0gc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcERpYWxvZ1Rva2VuID0gdGFnICsgMjsgIC8vY2F0ZWdvcnkrYWN0aW9uCisJcEJhUGFyYW1TZXQgPSAoUEJBX1BBUkFNX1NFVCkodGFnICsgMyk7ICAgLy8rRGlhbG9nVG9rZW4KKwlwQmFUaW1lb3V0VmFsID0gKHUxNiopKHRhZyArIDUpOworCXBCYVN0YXJ0U2VxQ3RybCA9IChQU0VRVUVOQ0VfQ09OVFJPTCkocmVxICsgNyk7CisKKwlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PnJ4IEFEREJBUkVRIGZyb20gOiJNQUNfRk1UIlxuIiwgTUFDX0FSRyhkc3QpKTsKKy8vc29tZSBvdGhlciBjYXBhYmlsaXR5IGlzIG5vdCByZWFkeSBub3cuCisJaWYoCShpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlID09IDApIHx8CisJCShpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9PSBmYWxzZSkpIC8vfHwKKwkvLwkoaWVlZS0+cFN0YVFvcy0+YkVuYWJsZVJ4SW1tQkEgPT0gZmFsc2UpCSkKKwl7CisJCXJjID0gQUREQkFfU1RBVFVTX1JFRlVTRUQ7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiRmFpbGVkIHRvIHJlcGx5IG9uIEFEREJBX1JFUSBhcyBzb21lIGNhcGFiaWxpdHkgaXMgbm90IHJlYWR5KCVkLCAlZClcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUsIGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0KTsKKwkJZ290byBPbkFEREJBUmVxX0ZhaWw7CisJfQorCS8vIFNlYXJjaCBmb3IgcmVsYXRlZCB0cmFmZmljIHN0cmVhbS4KKwkvLyBJZiB0aGVyZSBpcyBubyBtYXRjaGVkIFRTLCByZWplY3QgdGhlIEFEREJBIHJlcXVlc3QuCisJaWYoCSFHZXRUcygKKwkJCWllZWUsCisJCQkoUFRTX0NPTU1PTl9JTkZPKikoJnBUUyksCisJCQlkc3QsCisJCQkodTgpKHBCYVBhcmFtU2V0LT5maWVsZC5USUQpLAorCQkJUlhfRElSLAorCQkJdHJ1ZSkJKQorCXsKKwkJcmMgPSBBRERCQV9TVEFUVVNfUkVGVVNFRDsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJjYW4ndCBnZXQgVFMgaW4gJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBPbkFEREJBUmVxX0ZhaWw7CisJfQorCXBCQSA9ICZwVFMtPlJ4QWRtaXR0ZWRCQVJlY29yZDsKKwkvLyBUbyBEZXRlcm1pbmUgdGhlIEFEREJBIFJlcSBjb250ZW50CisJLy8gV2UgY2FuIGRvIG11Y2ggbW9yZSBjaGVjayBoZXJlLCBpbmNsdWRpbmcgQnVmZmVyU2l6ZSwgQU1TRFVfU3VwcG9ydCwgUG9saWN5LCBTdGFydFNlcUN0cmwuLi4KKwkvLyBJIHdhbnQgdG8gY2hlY2sgU3RhcnRTZXFDdHJsIHRvIG1ha2Ugc3VyZSB3aGVuIHdlIHN0YXJ0IGFnZ3JlZ2F0aW9uISEhCisJLy8KKwlpZihwQmFQYXJhbVNldC0+ZmllbGQuQkFQb2xpY3kgPT0gQkFfUE9MSUNZX0RFTEFZRUQpCisJeworCQlyYyA9IEFEREJBX1NUQVRVU19JTlZBTElEX1BBUkFNOworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIkJBIFBvbGljeSBpcyBub3QgY29ycmVjdCBpbiAlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIE9uQUREQkFSZXFfRmFpbDsKKwl9CisJCS8vIEFkbWl0IHRoZSBBRERCQSBSZXF1ZXN0CisJLy8KKwlEZUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwQkEpOworCXBCQS0+RGlhbG9nVG9rZW4gPSAqcERpYWxvZ1Rva2VuOworCXBCQS0+QmFQYXJhbVNldCA9ICpwQmFQYXJhbVNldDsKKwlwQkEtPkJhVGltZW91dFZhbHVlID0gKnBCYVRpbWVvdXRWYWw7CisJcEJBLT5CYVN0YXJ0U2VxQ3RybCA9ICpwQmFTdGFydFNlcUN0cmw7CisJLy9mb3IgaGFsZiBOIG1vZGUgd2Ugb25seSBhZ2dyZWdhdGUgMSBmcmFtZQorCWlmIChpZWVlLT5HZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyKGllZWUtPmRldikpCisJcEJBLT5CYVBhcmFtU2V0LmZpZWxkLkJ1ZmZlclNpemUgPSAxOworCWVsc2UKKwlwQkEtPkJhUGFyYW1TZXQuZmllbGQuQnVmZmVyU2l6ZSA9IDMyOworCUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwQkEsIHBCQS0+QmFUaW1lb3V0VmFsdWUpOworCWllZWU4MDIxMV9zZW5kX0FEREJBUnNwKGllZWUsIGRzdCwgcEJBLCBBRERCQV9TVEFUVVNfU1VDQ0VTUyk7CisKKwkvLyBFbmQgb2YgcHJvY2VkdXJlLgorCXJldHVybiAwOworCitPbkFEREJBUmVxX0ZhaWw6CisJeworCQlCQV9SRUNPUkQJQkE7CisJCUJBLkJhUGFyYW1TZXQgPSAqcEJhUGFyYW1TZXQ7CisJCUJBLkJhVGltZW91dFZhbHVlID0gKnBCYVRpbWVvdXRWYWw7CisJCUJBLkRpYWxvZ1Rva2VuID0gKnBEaWFsb2dUb2tlbjsKKwkJQkEuQmFQYXJhbVNldC5maWVsZC5CQVBvbGljeSA9IEJBX1BPTElDWV9JTU1FRElBVEU7CisJCWllZWU4MDIxMV9zZW5kX0FEREJBUnNwKGllZWUsIGRzdCwgJkJBLCByYyk7CisJCXJldHVybiAwOyAvL3dlIHNlbmQgUlNQIG91dC4KKwl9CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiBSWCBBRERCQVJTUAorICogICBpbnB1dDogIHN0cnVjdCBza19idWZmICogICBza2IJLy9pbmNvbWluZyBBRERCQVJlcSBza2IuCisgKiAgcmV0dXJuOiAgMChwYXNzKSwgb3RoZXIoZmFpbCkKKyAqICBub3RpY2U6ICBBcyB0aGlzIGZ1bmN0aW9uIG5lZWQgc3VwcG9ydCBvZiBRT1MsIEkgY29tbWVudCBzb21lIGNvZGUgb3V0LiBBbmQgd2hlbiBxb3MgaXMgcmVhZHksIHRoaXMgY29kZSBuZWVkIHRvIGJlIHN1cHBvcnQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBpZWVlODAyMTFfcnhfQUREQkFSc3AoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCSBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciogcnNwID0gTlVMTDsKKwlQQkFfUkVDT1JECQlwUGVuZGluZ0JBLCBwQWRtaXR0ZWRCQTsKKwlQVFhfVFNfUkVDT1JECQlwVFMgPSBOVUxMOworCXU4KiBkc3QgPSBOVUxMLCAqcERpYWxvZ1Rva2VuID0gTlVMTCwgKnRhZyA9IE5VTEw7CisJdTE2KiBwU3RhdHVzQ29kZSA9IE5VTEwsICpwQmFUaW1lb3V0VmFsID0gTlVMTDsKKwlQQkFfUEFSQU1fU0VUCQlwQmFQYXJhbVNldCA9IE5VTEw7CisJdTE2CQkJUmVhc29uQ29kZTsKKworCWlmIChza2ItPmxlbiA8IHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpICsgOSkKKwl7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiIEludmFsaWQgc2tiIGxlbiBpbiBCQVJTUCglZCAvICVkKVxuIiwgc2tiLT5sZW4sIAkoc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA5KSk7CisJCXJldHVybiAtMTsKKwl9CisJcnNwID0gKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciopc2tiLT5kYXRhOworCXRhZyA9ICh1OCopcnNwOworCWRzdCA9ICh1OCopKCZyc3AtPmFkZHIyWzBdKTsKKwl0YWcgKz0gc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcERpYWxvZ1Rva2VuID0gdGFnICsgMjsKKwlwU3RhdHVzQ29kZSA9ICh1MTYqKSh0YWcgKyAzKTsKKwlwQmFQYXJhbVNldCA9IChQQkFfUEFSQU1fU0VUKSh0YWcgKyA1KTsKKwlwQmFUaW1lb3V0VmFsID0gKHUxNiopKHRhZyArIDcpOworCisJLy8gQ2hlY2sgdGhlIGNhcGFiaWxpdHkKKwkvLyBTaW5jZSB3ZSBjYW4gYWx3YXlzIHJlY2VpdmUgQS1NUERVLCB3ZSBqdXN0IGNoZWNrIGlmIGl0IGlzIHVuZGVyIEhUIG1vZGUuCisJaWYoICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlID09IDAgIHx8CisJCWllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IGZhbHNlIHx8CisJCWllZWUtPnBIVEluZm8tPmJDdXJyZW50QU1QRFVFbmFibGUgPT0gZmFsc2UgKQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJyZWplY3QgdG8gQUREQkFfUlNQIGFzIHNvbWUgY2FwYWJpbGl0eSBpcyBub3QgcmVhZHkoJWQsICVkLCAlZClcbiIsaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSwgaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQsIGllZWUtPnBIVEluZm8tPmJDdXJyZW50QU1QRFVFbmFibGUpOworCQlSZWFzb25Db2RlID0gREVMQkFfUkVBU09OX1VOS05PV05fQkE7CisJCWdvdG8gT25BRERCQVJzcF9SZWplY3Q7CisJfQorCisKKwkvLworCS8vIFNlYXJjaCBmb3IgcmVsYXRlZCBUUy4KKwkvLyBJZiB0aGVyZSBpcyBubyBUUyBmb3VuZCwgd2Ugd2lsIHJlamVjdCBBRERCQSBSc3AgYnkgc2VuZGluZyBERUxCQSBmcmFtZS4KKwkvLworCWlmICghR2V0VHMoCisJCQlpZWVlLAorCQkJKFBUU19DT01NT05fSU5GTyopKCZwVFMpLAorCQkJZHN0LAorCQkJKHU4KShwQmFQYXJhbVNldC0+ZmllbGQuVElEKSwKKwkJCVRYX0RJUiwKKwkJCWZhbHNlKQkpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImNhbid0IGdldCBUUyBpbiAlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCQlSZWFzb25Db2RlID0gREVMQkFfUkVBU09OX1VOS05PV05fQkE7CisJCWdvdG8gT25BRERCQVJzcF9SZWplY3Q7CisJfQorCisJcFRTLT5iQWRkQmFSZXFJblByb2dyZXNzID0gZmFsc2U7CisJcFBlbmRpbmdCQSA9ICZwVFMtPlR4UGVuZGluZ0JBUmVjb3JkOworCXBBZG1pdHRlZEJBID0gJnBUUy0+VHhBZG1pdHRlZEJBUmVjb3JkOworCisKKwkvLworCS8vIENoZWNrIGlmIHJlbGF0ZWQgQkEgaXMgd2FpdGluZyBmb3Igc2V0dXAuCisJLy8gSWYgbm90LCByZWplY3QgYnkgc2VuZGluZyBERUxCQSBmcmFtZS4KKwkvLworCWlmKChwQWRtaXR0ZWRCQS0+YlZhbGlkPT10cnVlKSkKKwl7CisJCS8vIFNpbmNlIEJBIGlzIGFscmVhZHkgc2V0dXAsIHdlIGlnbm9yZSBhbGwgb3RoZXIgQUREQkEgUmVzcG9uc2UuCisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfQkEsICJPbkFEREJBUnNwKCk6IFJlY3YgQUREQkEgUnNwLiBEcm9wIGJlY2F1c2UgYWxyZWFkeSBhZG1pdCBpdCEgXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwllbHNlIGlmKChwUGVuZGluZ0JBLT5iVmFsaWQgPT0gZmFsc2UpIHx8KCpwRGlhbG9nVG9rZW4gIT0gcFBlbmRpbmdCQS0+RGlhbG9nVG9rZW4pKQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICAiT25BRERCQVJzcCgpOiBSZWN2IEFEREJBIFJzcC4gQkEgaW52YWxpZCwgREVMQkEhIFxuIik7CisJCVJlYXNvbkNvZGUgPSBERUxCQV9SRUFTT05fVU5LTk9XTl9CQTsKKwkJZ290byBPbkFEREJBUnNwX1JlamVjdDsKKwl9CisJZWxzZQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9CQSwgIk9uQUREQkFSc3AoKTogUmVjdiBBRERCQSBSc3AuIEJBIGlzIGFkbWl0dGVkISBTdGF0dXMgY29kZTolWFxuIiwgKnBTdGF0dXNDb2RlKTsKKwkJRGVBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcFBlbmRpbmdCQSk7CisJfQorCisKKwlpZigqcFN0YXR1c0NvZGUgPT0gQUREQkFfU1RBVFVTX1NVQ0NFU1MpCisJeworCQkvLworCQkvLyBEZXRlcm1pbmUgQUREQkEgUnNwIGNvbnRlbnQgaGVyZS4KKwkJLy8gV2UgY2FuIGNvbXBhcmUgdGhlIHZhbHVlIG9mIEJBIHBhcmFtZXRlciBzZXQgdGhhdCBQZWVyIHJldHVybmVkIGFuZCBTZWxmIHNlbnQuCisJCS8vIElmIGl0IGlzIE9LLCB0aGVuIGFkbWl0dGVkLiBPciB3ZSBjYW4gc2VuZCBERUxCQSB0byBjYW5jZWwgQkEgbWVjaGFuaXNtLgorCQkvLworCQlpZihwQmFQYXJhbVNldC0+ZmllbGQuQkFQb2xpY3kgPT0gQkFfUE9MSUNZX0RFTEFZRUQpCisJCXsKKwkJCS8vIFNpbmNlIHRoaXMgaXMgYSBraW5kIG9mIEFEREJBIGZhaWxlZCwgd2UgZGVsYXkgbmV4dCBBRERCQSBwcm9jZXNzLgorCQkJcFRTLT5iQWRkQmFSZXFEZWxheWVkID0gdHJ1ZTsKKwkJCURlQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBBZG1pdHRlZEJBKTsKKwkJCVJlYXNvbkNvZGUgPSBERUxCQV9SRUFTT05fRU5EX0JBOworCQkJZ290byBPbkFEREJBUnNwX1JlamVjdDsKKwkJfQorCisKKwkJLy8KKwkJLy8gQWRtaXR0ZWQgY29uZGl0aW9uCisJCS8vCisJCXBBZG1pdHRlZEJBLT5EaWFsb2dUb2tlbiA9ICpwRGlhbG9nVG9rZW47CisJCXBBZG1pdHRlZEJBLT5CYVRpbWVvdXRWYWx1ZSA9ICpwQmFUaW1lb3V0VmFsOworCQlwQWRtaXR0ZWRCQS0+QmFTdGFydFNlcUN0cmwgPSBwUGVuZGluZ0JBLT5CYVN0YXJ0U2VxQ3RybDsKKwkJcEFkbWl0dGVkQkEtPkJhUGFyYW1TZXQgPSAqcEJhUGFyYW1TZXQ7CisJCURlQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBBZG1pdHRlZEJBKTsKKwkJQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBBZG1pdHRlZEJBLCAqcEJhVGltZW91dFZhbCk7CisJfQorCWVsc2UKKwl7CisJCS8vIERlbGF5IG5leHQgQUREQkEgcHJvY2Vzcy4KKwkJcFRTLT5iQWRkQmFSZXFEZWxheWVkID0gdHJ1ZTsKKwl9CisKKwkvLyBFbmQgb2YgcHJvY2VkdXJlCisJcmV0dXJuIDA7CisKK09uQUREQkFSc3BfUmVqZWN0OgorCXsKKwkJQkFfUkVDT1JECUJBOworCQlCQS5CYVBhcmFtU2V0ID0gKnBCYVBhcmFtU2V0OworCQlpZWVlODAyMTFfc2VuZF9ERUxCQShpZWVlLCBkc3QsICZCQSwgVFhfRElSLCBSZWFzb25Db2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogUlggREVMQkEKKyAqICAgaW5wdXQ6ICBzdHJ1Y3Qgc2tfYnVmZiAqICAgc2tiCS8vaW5jb21pbmcgQUREQkFSZXEgc2tiLgorICogIHJldHVybjogIDAocGFzcyksIG90aGVyKGZhaWwpCisgKiAgbm90aWNlOiAgQXMgdGhpcyBmdW5jdGlvbiBuZWVkIHN1cHBvcnQgb2YgUU9TLCBJIGNvbW1lbnQgc29tZSBjb2RlIG91dC4gQW5kIHdoZW4gcW9zIGlzIHJlYWR5LCB0aGlzIGNvZGUgbmVlZCB0byBiZSBzdXBwb3J0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgaWVlZTgwMjExX3J4X0RFTEJBKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLHN0cnVjdCBza19idWZmICpza2IpCit7CisJIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKiBkZWxiYSA9IE5VTEw7CisJUERFTEJBX1BBUkFNX1NFVAlwRGVsQmFQYXJhbVNldCA9IE5VTEw7CisJdTE2KgkJCXBSZWFzb25Db2RlID0gTlVMTDsKKwl1OCoJCQlkc3QgPSBOVUxMOworCisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA2KQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICIgSW52YWxpZCBza2IgbGVuIGluIERFTEJBKCVkIC8gJWQpXG4iLCBza2ItPmxlbiwgCShzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSArIDYpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUgPT0gMCB8fAorCQlpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9PSBmYWxzZSApCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgInJlY2VpdmVkIERFTEJBIHdoaWxlIFFPUyBvciBIVCBpcyBub3Qgc3VwcG9ydGVkKCVkLCAlZClcbiIsaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSwgaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQpOworCQlyZXR1cm4gLTE7CisJfQorCisJSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEF8SUVFRTgwMjExX0RMX0JBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlkZWxiYSA9ICggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIqKXNrYi0+ZGF0YTsKKwlkc3QgPSAodTgqKSgmZGVsYmEtPmFkZHIyWzBdKTsKKwlkZWxiYSArPSBzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwRGVsQmFQYXJhbVNldCA9IChQREVMQkFfUEFSQU1fU0VUKShkZWxiYSsyKTsKKwlwUmVhc29uQ29kZSA9ICh1MTYqKShkZWxiYSs0KTsKKworCWlmKHBEZWxCYVBhcmFtU2V0LT5maWVsZC5Jbml0aWF0b3IgPT0gMSkKKwl7CisJCVBSWF9UU19SRUNPUkQgCXBSeFRzOworCisJCWlmKCAhR2V0VHMoCisJCQkJaWVlZSwKKwkJCQkoUFRTX0NPTU1PTl9JTkZPKikmcFJ4VHMsCisJCQkJZHN0LAorCQkJCSh1OClwRGVsQmFQYXJhbVNldC0+ZmllbGQuVElELAorCQkJCVJYX0RJUiwKKwkJCQlmYWxzZSkJKQorCQl7CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgICJjYW4ndCBnZXQgVFMgZm9yIFJYVFMgaW4gJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCVJ4VHNEZWxldGVCQShpZWVlLCBwUnhUcyk7CisJfQorCWVsc2UKKwl7CisJCVBUWF9UU19SRUNPUkQJcFR4VHM7CisKKwkJaWYoIUdldFRzKAorCQkJaWVlZSwKKwkJCShQVFNfQ09NTU9OX0lORk8qKSZwVHhUcywKKwkJCWRzdCwKKwkJCSh1OClwRGVsQmFQYXJhbVNldC0+ZmllbGQuVElELAorCQkJVFhfRElSLAorCQkJZmFsc2UpCSkKKwkJeworCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICAiY2FuJ3QgZ2V0IFRTIGZvciBUWFRTIGluICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlwVHhUcy0+YlVzaW5nQmEgPSBmYWxzZTsKKwkJcFR4VHMtPmJBZGRCYVJlcUluUHJvZ3Jlc3MgPSBmYWxzZTsKKwkJcFR4VHMtPmJBZGRCYVJlcURlbGF5ZWQgPSBmYWxzZTsKKwkJZGVsX3RpbWVyX3N5bmMoJnBUeFRzLT5Uc0FkZEJhVGltZXIpOworCQkvL1BsYXRmb3JtQ2FuY2VsVGltZXIoQWRhcHRlciwgJnBUeFRzLT5Uc0FkZEJhVGltZXIpOworCQlUeFRzRGVsZXRlQkEoaWVlZSwgcFR4VHMpOworCX0KKwlyZXR1cm4gMDsKK30KKworLy8KKy8vIEFEREJBIGluaXRpYXRlLiBUaGlzIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBUWCBzaWRlLgorLy8KK3ZvaWQKK1RzSW5pdEFkZEJBKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLAorCVBUWF9UU19SRUNPUkQJcFRTLAorCXU4CQlQb2xpY3ksCisJdTgJCWJPdmVyd3JpdGVQZW5kaW5nCisJKQoreworCVBCQV9SRUNPUkQJCQlwQkEgPSAmcFRTLT5UeFBlbmRpbmdCQVJlY29yZDsKKworCWlmKHBCQS0+YlZhbGlkPT10cnVlICYmIGJPdmVyd3JpdGVQZW5kaW5nPT1mYWxzZSkKKwkJcmV0dXJuOworCisJLy8gU2V0IHBhcmFtZXRlcnMgdG8gIlBlbmRpbmciIHZhcmlhYmxlIHNldAorCURlQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBCQSk7CisKKwlwQkEtPkRpYWxvZ1Rva2VuKys7CQkJCQkJLy8gRGlhbG9nVG9rZW46IE9ubHkga2VlcCB0aGUgbGF0ZXN0IGRpYWxvZyB0b2tlbgorCXBCQS0+QmFQYXJhbVNldC5maWVsZC5BTVNEVV9TdXBwb3J0ID0gMDsJLy8gRG8gbm90IHN1cHBvcnQgQS1NU0RVIHdpdGggQS1NUERVIG5vdyEhCisJcEJBLT5CYVBhcmFtU2V0LmZpZWxkLkJBUG9saWN5ID0gUG9saWN5OwkvLyBQb2xpY3k6IERlbGF5ZWQgb3IgSW1tZWRpYXRlCisJcEJBLT5CYVBhcmFtU2V0LmZpZWxkLlRJRCA9IHBUUy0+VHNDb21tb25JbmZvLlRTcGVjLmYuVFNJbmZvLmZpZWxkLnVjVFNJRDsJLy8gVElECisJLy8gQnVmZmVyU2l6ZTogVGhpcyBuZWVkIHRvIGJlIHNldCBhY2NvcmRpbmcgdG8gQS1NUERVIHZlY3RvcgorCXBCQS0+QmFQYXJhbVNldC5maWVsZC5CdWZmZXJTaXplID0gMzI7CQkvLyBCdWZmZXJTaXplOiBUaGlzIG5lZWQgdG8gYmUgc2V0IGFjY29yZGluZyB0byBBLU1QRFUgdmVjdG9yCisJcEJBLT5CYVRpbWVvdXRWYWx1ZSA9IDA7CQkJCQkvLyBUaW1lb3V0IHZhbHVlOiBTZXQgMCB0byBkaXNhYmxlIFRpbWVyCisJcEJBLT5CYVN0YXJ0U2VxQ3RybC5maWVsZC5TZXFOdW0gPSAocFRTLT5UeEN1clNlcSArIDMpICUgNDA5NjsgCS8vIEJsb2NrIEFjayB3aWxsIHN0YXJ0IGFmdGVyIDMgcGFja2V0cyBsYXRlci4KKworCUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwQkEsIEJBX1NFVFVQX1RJTUVPVVQpOworCisJaWVlZTgwMjExX3NlbmRfQUREQkFSZXEoaWVlZSwgcFRTLT5Uc0NvbW1vbkluZm8uQWRkciwgcEJBKTsKK30KKwordm9pZAorVHNJbml0RGVsQkEoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBQVFNfQ09NTU9OX0lORk8gcFRzQ29tbW9uSW5mbywgVFJfU0VMRUNUIFR4UnhTZWxlY3QpCit7CisKKwlpZihUeFJ4U2VsZWN0ID09IFRYX0RJUikKKwl7CisJCVBUWF9UU19SRUNPUkQJcFR4VHMgPSAoUFRYX1RTX1JFQ09SRClwVHNDb21tb25JbmZvOworCisJCWlmKFR4VHNEZWxldGVCQShpZWVlLCBwVHhUcykpCisJCQlpZWVlODAyMTFfc2VuZF9ERUxCQSgKKwkJCQlpZWVlLAorCQkJCXBUc0NvbW1vbkluZm8tPkFkZHIsCisJCQkJKHBUeFRzLT5UeEFkbWl0dGVkQkFSZWNvcmQuYlZhbGlkKT8oJnBUeFRzLT5UeEFkbWl0dGVkQkFSZWNvcmQpOigmcFR4VHMtPlR4UGVuZGluZ0JBUmVjb3JkKSwKKwkJCQlUeFJ4U2VsZWN0LAorCQkJCURFTEJBX1JFQVNPTl9FTkRfQkEpOworCX0KKwllbHNlIGlmKFR4UnhTZWxlY3QgPT0gUlhfRElSKQorCXsKKwkJUFJYX1RTX1JFQ09SRAlwUnhUcyA9IChQUlhfVFNfUkVDT1JEKXBUc0NvbW1vbkluZm87CisJCWlmKFJ4VHNEZWxldGVCQShpZWVlLCBwUnhUcykpCisJCQlpZWVlODAyMTFfc2VuZF9ERUxCQSgKKwkJCQlpZWVlLAorCQkJCXBUc0NvbW1vbkluZm8tPkFkZHIsCisJCQkJJnBSeFRzLT5SeEFkbWl0dGVkQkFSZWNvcmQsCisJCQkJVHhSeFNlbGVjdCwKKwkJCQlERUxCQV9SRUFTT05fRU5EX0JBCSk7CisJfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgQkEgc2V0dXAgdGltZXIKKyAqICAgaW5wdXQ6ICB1bnNpZ25lZCBsb25nCSBkYXRhCQkvL2FjdHVyYWxseSB3ZSBzZW5kIFRYX1RTX1JFQ09SRCBvciBSWF9UU19SRUNPUkQgdG8gdGhlc2UgdGltZXIKKyAqICByZXR1cm46ICBOVUxMCisgKiAgbm90aWNlOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEJhU2V0dXBUaW1lT3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlQVFhfVFNfUkVDT1JECXBUeFRzID0gKFBUWF9UU19SRUNPUkQpZGF0YTsKKworCXBUeFRzLT5iQWRkQmFSZXFJblByb2dyZXNzID0gZmFsc2U7CisJcFR4VHMtPmJBZGRCYVJlcURlbGF5ZWQgPSB0cnVlOworCXBUeFRzLT5UeFBlbmRpbmdCQVJlY29yZC5iVmFsaWQgPSBmYWxzZTsKK30KKwordm9pZCBUeEJhSW5hY3RUaW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlQVFhfVFNfUkVDT1JECXBUeFRzID0gKFBUWF9UU19SRUNPUkQpZGF0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihwVHhUcywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIFR4VHNSZWNvcmRbcFR4VHMtPm51bV0pOworCVR4VHNEZWxldGVCQShpZWVlLCBwVHhUcyk7CisJaWVlZTgwMjExX3NlbmRfREVMQkEoCisJCWllZWUsCisJCXBUeFRzLT5Uc0NvbW1vbkluZm8uQWRkciwKKwkJJnBUeFRzLT5UeEFkbWl0dGVkQkFSZWNvcmQsCisJCVRYX0RJUiwKKwkJREVMQkFfUkVBU09OX1RJTUVPVVQpOworfQorCit2b2lkIFJ4QmFJbmFjdFRpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSWF9UU19SRUNPUkQJcFJ4VHMgPSAoUFJYX1RTX1JFQ09SRClkYXRhOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHBSeFRzLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgUnhUc1JlY29yZFtwUnhUcy0+bnVtXSk7CisKKwlSeFRzRGVsZXRlQkEoaWVlZSwgcFJ4VHMpOworCWllZWU4MDIxMV9zZW5kX0RFTEJBKAorCQlpZWVlLAorCQlwUnhUcy0+VHNDb21tb25JbmZvLkFkZHIsCisJCSZwUnhUcy0+UnhBZG1pdHRlZEJBUmVjb3JkLAorCQlSWF9ESVIsCisJCURFTEJBX1JFQVNPTl9USU1FT1VUKTsKKwlyZXR1cm4gOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfSFQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9IVC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZTYwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfSFQuaApAQCAtMCwwICsxLDQ4MSBAQAorI2lmbmRlZiBfUlRMODE5WFVfSFRUWVBFX0hfCisjZGVmaW5lIF9SVEw4MTlYVV9IVFRZUEVfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBIVCBDYXBhYmlsaXR5IGVsZW1lbnQgaXMgcHJlc2VudCBpbiBiZWFjb25zLCBhc3NvY2lhdGlvbiByZXF1ZXN0LAorLy8JcmVhc3NvY2lhdGlvbiByZXF1ZXN0IGFuZCBwcm9iZSByZXNwb25zZSBmcmFtZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vCisvLyBPcGVyYXRpb24gbW9kZSB2YWx1ZQorLy8KKyNkZWZpbmUgSFRfT1BNT0RFX05PX1BST1RFQ1QJCTAKKyNkZWZpbmUgSFRfT1BNT0RFX09QVElPTkFMCQkxCisjZGVmaW5lIEhUX09QTU9ERV80ME1IWl9QUk9URUNUCTIKKyNkZWZpbmUgSFRfT1BNT0RFX01JWEVECQkJMworCisvLworLy8gTUlNTyBQb3dlciBTYXZlIFNldGluZ3MKKy8vCisjZGVmaW5lIE1JTU9fUFNfU1RBVElDCQkJCTAKKyNkZWZpbmUgTUlNT19QU19EWU5BTUlDCQkJMQorI2RlZmluZSBNSU1PX1BTX05PTElNSVQJCQkzCisKKworLy8KKy8vCVRoZXJlIHNob3VsZCBiZSAxMjggYml0cyB0byBjb3ZlciBhbGwgb2YgdGhlIE1DUyByYXRlcy4gSG93ZXZlciwgc2luY2UKKy8vCTgxOTAgZG9lcyBub3Qgc3VwcG9ydCB0b28gbXVjaCByYXRlcywgb25lIGludGVnZXIgaXMgcXVpdGUgZW5vdWdoLgorLy8KKworI2RlZmluZSBzSFRDTG5nCTQKKworCisjZGVmaW5lIEhUX1NVUFBPUlRFRF9NQ1NfMVNTX0JJVE1BUAkJCQkJMHgwMDAwMDBmZgorI2RlZmluZSBIVF9TVVBQT1JURURfTUNTXzJTU19CSVRNQVAJCQkJCTB4MDAwMGZmMDAKKyNkZWZpbmUgSFRfU1VQUE9SVEVEX01DU18xU1NfMlNTX0JJVE1BUAkJCUhUX01DU18xU1NfQklUTUFQfEhUX01DU18xU1NfMlNTX0JJVE1BUAorCisKK3R5cGVkZWYgZW51bSBfSFRfTUNTX1JBVEV7CisJSFRfTUNTMCAgID0gMHgwMDAwMDAwMSwKKwlIVF9NQ1MxICAgPSAweDAwMDAwMDAyLAorCUhUX01DUzIgICA9IDB4MDAwMDAwMDQsCisJSFRfTUNTMyAgID0gMHgwMDAwMDAwOCwKKwlIVF9NQ1M0ICAgPSAweDAwMDAwMDEwLAorCUhUX01DUzUgICA9IDB4MDAwMDAwMjAsCisJSFRfTUNTNiAgID0gMHgwMDAwMDA0MCwKKwlIVF9NQ1M3ICAgPSAweDAwMDAwMDgwLAorCUhUX01DUzggICA9IDB4MDAwMDAxMDAsCisJSFRfTUNTOSAgID0gMHgwMDAwMDIwMCwKKwlIVF9NQ1MxMCA9IDB4MDAwMDA0MDAsCisJSFRfTUNTMTEgPSAweDAwMDAwODAwLAorCUhUX01DUzEyID0gMHgwMDAwMTAwMCwKKwlIVF9NQ1MxMyA9IDB4MDAwMDIwMDAsCisJSFRfTUNTMTQgPSAweDAwMDA0MDAwLAorCUhUX01DUzE1ID0gMHgwMDAwODAwMCwKKwkvLyBEbyBub3QgZGVmaW5lIE1DUzMyIGhlcmUgYWx0aG91Z2ggODE5MCBzdXBwb3J0IE1DUzMyCit9SFRfTUNTX1JBVEUsKlBIVF9NQ1NfUkFURTsKKworLy8KKy8vIFJlcHJlc2VudCBDaGFubmVsIFdpZHRoIGluIEhUIENhcGFiaWxpdGllcworLy8KK3R5cGVkZWYgZW51bSBfSFRfQ0hBTk5FTF9XSURUSHsKKwlIVF9DSEFOTkVMX1dJRFRIXzIwID0gMCwKKwlIVF9DSEFOTkVMX1dJRFRIXzIwXzQwID0gMSwKK31IVF9DSEFOTkVMX1dJRFRILCAqUEhUX0NIQU5ORUxfV0lEVEg7CisKKy8vCisvLyBSZXByZXNlbnQgRXh0ZW50aW9uIENoYW5uZWwgT2Zmc2V0IGluIEhUIENhcGFiaWxpdGllcworLy8gVGhpcyBpcyBhdmFpbGFibGUgb25seSBpbiA0ME1oeiBtb2RlLgorLy8KK3R5cGVkZWYgZW51bSBfSFRfRVhUQ0hOTF9PRkZTRVR7CisJSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUID0gMCwKKwlIVF9FWFRDSE5MX09GRlNFVF9VUFBFUiA9IDEsCisJSFRfRVhUQ0hOTF9PRkZTRVRfTk9fREVGID0gMiwKKwlIVF9FWFRDSE5MX09GRlNFVF9MT1dFUiA9IDMsCit9SFRfRVhUQ0hOTF9PRkZTRVQsICpQSFRfRVhUQ0hOTF9PRkZTRVQ7CisKK3R5cGVkZWYgZW51bSBfQ0hOTE9QeworCUNITkxPUF9OT05FID0gMCwgLy8gTm8gQWN0aW9uIG5vdworCUNITkxPUF9TQ0FOID0gMSwgLy8gU2NhbiBpbiBwcm9ncmVzcworCUNITkxPUF9TV0JXID0gMiwgLy8gQmFuZHdpZHRoIHN3aXRjaGluZyBpbiBwcm9ncmVzcworCUNITkxPUF9TV0NITkwgPSAzLCAvLyBTb2Z0d2FyZSBDaGFubmVsIHN3aXRjaGluZyBpbiBwcm9ncmVzcworfSBDSE5MT1AsICpQQ0hOTE9QOworCisvLyBEZXRlcm1pbmUgaWYgdGhlIENoYW5uZWwgT3BlcmF0aW9uIGlzIGluIHByb2dyZXNzCisjZGVmaW5lIENISExPUF9JTl9QUk9HUkVTUyhfcEhUSW5mbykJXAorCQkoKF9wSFRJbmZvKS0+Q2hubE9wID4gQ0hOTE9QX05PTkUpID8gVFJVRSA6IEZBTFNFCisKKy8qCit0eXBlZGVmCXVuaW9uIF9IVF9DQVBBQklMSVRZeworCXUxNglTaG9ydERhdGE7CisJdTgJQ2hhckRhdGFbMl07CisJc3RydWN0CisJeworCQl1MTYJQWR2Q29kaW5nOjE7CisJCXUxNglDaGxXaWR0aDoxOworCQl1MTYJTWltb1B3clNhdmU6MjsKKwkJdTE2CUdyZWVuRmllbGQ6MTsKKwkJdTE2CVNob3J0R0kyME1oejoxOworCQl1MTYJU2hvcnRHSTQwTWh6OjE7CisJCXUxNglTVEJDOjE7CisJCXUxNglCZWFtRm9ybToxOworCQl1MTYJRGVsYXlCQToxOworCQl1MTYJTWF4QU1TRFVTaXplOjE7CisJCXUxNglEc3NDQ2s6MTsKKwkJdTE2CVBTTVA6MTsKKwkJdTE2CVJzdmQ6MzsKKwl9RmllbGQ7Cit9SFRfQ0FQQUJJTElUWSwgKlBIVF9DQVBBQklMSVRZOworCit0eXBlZGVmCXVuaW9uIF9IVF9DQVBBQklMSVRZX01BQ1BBUkF7CisJdTgJU2hvcnREYXRhOworCXU4CUNoYXJEYXRhWzFdOworCXN0cnVjdAorCXsKKwkJdTgJTWF4UnhBTVBEVToyOworCQl1OAlNUERVRGVuc2l0eToyOworCQl1OAlSc3ZkOjQ7CisJfUZpZWxkOworfUhUX0NBUEFCSUxJVFlfTUFDUEFSQSwgKlBIVF9DQVBBQklMSVRZX01BQ1BBUkE7CisqLworCit0eXBlZGVmIGVudW0gX0hUX0FDVElPTnsKKwlBQ1RfUkVDT01NQU5EX1dJRFRICQk9IDAsCisJQUNUX01JTU9fUFdSX1NBVkUgCQk9IDEsCisJQUNUX1BTTVAJCQkJCT0gMiwKKwlBQ1RfU0VUX1BDT19QSEFTRQkJPSAzLAorCUFDVF9NSU1PX0NITF9NRUFTVVJFCT0gNCwKKwlBQ1RfUkVDSVBST0NJVFlfQ09SUkVDVAk9IDUsCisJQUNUX01JTU9fQ1NJX01BVFJJQ1MJCT0gNiwKKwlBQ1RfTUlNT19OT0NPTVBSX1NURUVSCT0gNywKKwlBQ1RfTUlNT19DT01QUl9TVEVFUgkJPSA4LAorCUFDVF9BTlRFTk5BX1NFTEVDVAkJPSA5LAorfSBIVF9BQ1RJT04sICpQSFRfQUNUSU9OOworCisKKy8qIDIwMDcvMDYvMDcgTUggRGVmaW5lIHN1Yi1jYXJyaWVyIG1vZGUgZm9yIDQwTUhaLiAqLwordHlwZWRlZiBlbnVtIF9IVF9CYW5kd2lkdGhfNDBNSFpfU3ViX0NhcnJpZXJ7CisJU0NfTU9ERV9EVVBMSUNBVEUgPSAwLAorCVNDX01PREVfTE9XRVIgPSAxLAorCVNDX01PREVfVVBQRVIgPSAyLAorCVNDX01PREVfRlVMTDQwTUhaID0gMywKK31IVF9CVzQwX1NDX0U7CisKK3R5cGVkZWYJc3RydWN0IF9IVF9DQVBBQklMSVRZX0VMRXsKKworCS8vSFQgY2FwYWJpbGl0eSBpbmZvCisJdTgJQWR2Q29kaW5nOjE7CisJdTgJQ2hsV2lkdGg6MTsKKwl1OAlNaW1vUHdyU2F2ZToyOworCXU4CUdyZWVuRmllbGQ6MTsKKwl1OAlTaG9ydEdJMjBNaHo6MTsKKwl1OAlTaG9ydEdJNDBNaHo6MTsKKwl1OAlUeFNUQkM6MTsKKwl1OAlSeFNUQkM6MjsKKwl1OAlEZWxheUJBOjE7CisJdTgJTWF4QU1TRFVTaXplOjE7CisJdTgJRHNzQ0NrOjE7CisJdTgJUFNNUDoxOworCXU4CVJzdmQxOjE7CisJdTgJTFNpZ1R4b3BQcm90ZWN0OjE7CisKKwkvL01BQyBIVCBwYXJhbWV0ZXJzIGluZm8KKwl1OAlNYXhSeEFNUERVRmFjdG9yOjI7CisJdTgJTVBEVURlbnNpdHk6MzsKKwl1OAlSc3ZkMjozOworCisJLy9TdXBwb3J0ZWQgTUNTIHNldAorCXU4CU1DU1sxNl07CisKKworCS8vRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvCisJdTE2CUV4dEhUQ2FwSW5mbzsKKworCS8vVFhCRiBDYXBhYmlsaXRpZXMKKwl1OAlUeEJGQ2FwWzRdOworCisJLy9BbnRlbm5hIFNlbGVjdGlvbiBDYXBhYmlsaXRpZXMKKwl1OAlBU0NhcDsKKworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgSFRfQ0FQQUJJTElUWV9FTEUsICpQSFRfQ0FQQUJJTElUWV9FTEU7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgSFQgSW5mb3JtYXRpb24gZWxlbWVudCBpcyBwcmVzZW50IGluIGJlYWNvbnMKKy8vIE9ubHkgQVAgaXMgcmVxdWlyZWQgdG8gaW5jbHVkZSB0aGlzIGVsZW1lbnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IF9IVF9JTkZPUk1BVElPTl9FTEV7CisJdTgJQ29udHJvbENobDsKKworCXU4CUV4dENobE9mZnNldDoyOworCXU4CVJlY29tbWVtZGVkVHhXaWR0aDoxOworCXU4CVJJRlM6MTsKKwl1OAlQU01QQWNjZXNzT25seToxOworCXU4CVNydkludEdyYW51bGFyaXR5OjM7CisKKwl1OAlPcHRNb2RlOjI7CisJdTgJTm9uR0ZEZXZQcmVzZW50OjE7CisJdTgJUmV2ZDE6NTsKKwl1OAlSZXZkMjo4OworCisJdTgJUnN2ZDM6NjsKKwl1OAlEdWFsQmVhY29uOjE7CisJdTgJRHVhbENUU1Byb3RlY3Q6MTsKKworCXU4CVNlY29uZGFyeUJlYWNvbjoxOworCXU4CUxTaWdUeG9wUHJvdGVjdEZ1bGw6MTsKKwl1OAlQY29BY3RpdmU6MTsKKwl1OAlQY29QaGFzZToxOworCXU4CVJzdmQ0OjQ7CisKKwl1OAlCYXNpY01TQ1sxNl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBIVF9JTkZPUk1BVElPTl9FTEUsICpQSFRfSU5GT1JNQVRJT05fRUxFOworCisvLworLy8gTUlNTyBQb3dlciBTYXZlIGNvbnRyb2wgZmllbGQuCisvLyBUaGlzIGlzIGFwcGVhciBpbiBNSU1PIFBvd2VyIFNhdmUgQWN0aW9uIEZyYW1lCisvLwordHlwZWRlZiBzdHJ1Y3QgX01JTU9QU19DVFJMeworCXU4CU1pbW9Qc0VuYWJsZToxOworCXU4CU1pbW9Qc01vZGU6MTsKKwl1OAlSZXNlcnZlZDo2OworfSBNSU1PUFNfQ1RSTCwgKlBNSU1PUFNfQ1RSTDsKKwordHlwZWRlZiBlbnVtIF9IVF9TUEVDX1ZFUnsKKwlIVF9TUEVDX1ZFUl9JRUVFID0gMCwKKwlIVF9TUEVDX1ZFUl9FV0MgPSAxLAorfUhUX1NQRUNfVkVSLCAqUEhUX1NQRUNfVkVSOworCit0eXBlZGVmIGVudW0gX0hUX0FHR1JFX01PREVfRXsKKwlIVF9BR0dfQVVUTyA9IDAsCisJSFRfQUdHX0ZPUkNFX0VOQUJMRSA9IDEsCisJSFRfQUdHX0ZPUkNFX0RJU0FCTEUgPSAyLAorfUhUX0FHR1JFX01PREVfRSwgKlBIVF9BR0dSRV9NT0RFX0U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgVGhlIERhdGEgc3RydWN0dXJlIGlzIHVzZWQgdG8ga2VlcCBIVCByZWxhdGVkIHZhcmlhYmxlcyB3aGVuIGNhcmQgaXMKKy8vICBjb25maWd1cmVkIGFzIG5vbi1BUCBTVEEgbW9kZS4gICoqTm90ZSoqICBDdXJyZW50X3h4eCBzaG91bGQgYmUgc2V0CisvLwl0byBkZWZhdWx0IHZhbHVlIGluIEhUSW5pdGlhbGl6ZUhUSW5mbygpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCBfUlRfSElHSF9USFJPVUdIUFVUeworCXU4CQkJCWJFbmFibGVIVDsKKwl1OAkJCQliQ3VycmVudEhUU3VwcG9ydDsKKworCXU4CQkJCWJSZWdCVzQwTUh6OwkJCQkvLyBUeCA0ME1IeiBjaGFubmVsIGNhcGFibGl0eQorCXU4CQkJCWJDdXJCVzQwTUh6OwkJCQkvLyBUeCA0ME1IeiBjaGFubmVsIGNhcGFiaWxpdHkKKworCXU4CQkJCWJSZWdTaG9ydEdJNDBNSHo7CQkJLy8gVHggU2hvcnQgR0kgZm9yIDQwTWh6CisJdTgJCQkJYkN1clNob3J0R0k0ME1IejsJCQkvLyBUeCBTaG9ydCBHSSBmb3IgNDBNSHoKKworCXU4CQkJCWJSZWdTaG9ydEdJMjBNSHo7CQkJLy8gVHggU2hvcnQgR0kgZm9yIDIwTUh6CisJdTgJCQkJYkN1clNob3J0R0kyME1IejsJCQkvLyBUeCBTaG9ydCBHSSBmb3IgMjBNSHoKKworCXU4CQkJCWJSZWdTdXBwQ0NLOwkJCQkvLyBUeCBDQ0sgcmF0ZSBjYXBhYmlsaXR5CisJdTgJCQkJYkN1clN1cHBDQ0s7CQkJCS8vIFR4IENDSyByYXRlIGNhcGFiaWxpdHkKKworCS8vIDgwMi4xMW4gc3BlYyB2ZXJzaW9uIGZvciAicGVlciIKKwlIVF9TUEVDX1ZFUgkJCWVQZWVySFRTcGVjVmVyOworCisKKwkvLyBIVCByZWxhdGVkIGluZm9ybWF0aW9uIGZvciAiU2VsZiIKKwlIVF9DQVBBQklMSVRZX0VMRQlTZWxmSFRDYXA7CQkvLyBUaGlzIGlzIEhUIGNhcCBlbGVtZW50IHNlbnQgdG8gcGVlciBTVEEsIHdoaWNoIGFsc28gaW5kaWNhdGUgSFQgUnggY2FwYWJpbGl0aWVzLgorCUhUX0lORk9STUFUSU9OX0VMRQlTZWxmSFRJbmZvOwkJLy8gVGhpcyBpcyBIVCBpbmZvIGVsZW1lbnQgc2VudCB0byBwZWVyIFNUQSwgd2hpY2ggYWxzbyBpbmRpY2F0ZSBIVCBSeCBjYXBhYmlsaXRpZXMuCisKKwkvLyBIVCByZWxhdGVkIGluZm9ybWF0aW9uIGZvciAiUGVlciIKKwl1OAkJCQlQZWVySFRDYXBCdWZbMzJdOworCXU4CQkJCVBlZXJIVEluZm9CdWZbMzJdOworCisKKwkvLyBBLU1TRFUgcmVsYXRlZAorCXU4CQkJCWJBTVNEVV9TdXBwb3J0OwkJCS8vIFRoaXMgaW5kaWNhdGVzIFR4IEEtTVNEVSBjYXBhYmlsaXR5CisJdTE2CQkJCW5BTVNEVV9NYXhTaXplOwkJCS8vIFRoaXMgaW5kaWNhdGVzIFR4IEEtTVNEVSBjYXBhYmlsaXR5CisJdTgJCQkJYkN1cnJlbnRfQU1TRFVfU3VwcG9ydDsJLy8gVGhpcyBpbmRpY2F0ZXMgVHggQS1NU0RVIGNhcGFiaWxpdHkKKwl1MTYJCQkJbkN1cnJlbnRfQU1TRFVfTWF4U2l6ZTsJLy8gVGhpcyBpbmRpY2F0ZXMgVHggQS1NU0RVIGNhcGFiaWxpdHkKKworCisJLy8gQU1QRFUgIHJlbGF0ZWQgPDIwMDYuMDguMTAgRW1pbHk+CisJdTgJCQkJYkFNUERVRW5hYmxlOwkJCQkvLyBUaGlzIGluZGljYXRlIFR4IEEtTVBEVSBjYXBhYmlsaXR5CisJdTgJCQkJYkN1cnJlbnRBTVBEVUVuYWJsZTsJCS8vIFRoaXMgaW5kaWNhdGUgVHggQS1NUERVIGNhcGFiaWxpdHkKKwl1OAkJCQlBTVBEVV9GYWN0b3I7CQkJCS8vIFRoaXMgaW5kaWNhdGUgVHggQS1NUERVIGNhcGFiaWxpdHkKKwl1OAkJCQlDdXJyZW50QU1QRFVGYWN0b3I7CQkvLyBUaGlzIGluZGljYXRlIFR4IEEtTVBEVSBjYXBhYmlsaXR5CisJdTgJCQkJTVBEVV9EZW5zaXR5OwkJCQkvLyBUaGlzIGluZGljYXRlIFR4IEEtTVBEVSBjYXBhYmlsaXR5CisJdTgJCQkJQ3VycmVudE1QRFVEZW5zaXR5OwkJCS8vIFRoaXMgaW5kaWNhdGUgVHggQS1NUERVIGNhcGFiaWxpdHkKKworCS8vIEZvcmNlZCBBLU1QRFUgZW5hYmxlCisJSFRfQUdHUkVfTU9ERV9FCUZvcmNlZEFNUERVTW9kZTsKKwl1OAkJCQlGb3JjZWRBTVBEVUZhY3RvcjsKKwl1OAkJCQlGb3JjZWRNUERVRGVuc2l0eTsKKworCS8vIEZvcmNlZCBBLU1TRFUgZW5hYmxlCisJSFRfQUdHUkVfTU9ERV9FCUZvcmNlZEFNU0RVTW9kZTsKKwl1MTYJCQkJRm9yY2VkQU1TRFVNYXhTaXplOworCisJdTgJCQkJYkZvcmNlZFNob3J0R0k7CisKKwl1OAkJCQlDdXJyZW50T3BNb2RlOworCisJLy8gTUlNTyBQUyByZWxhdGVkCisJdTgJCQkJU2VsZk1pbW9QczsKKwl1OAkJCQlQZWVyTWltb1BzOworCisJLy8gNDBNSHogQ2hhbm5lbCBPZmZzZXQgc2V0dGluZ3MuCisJSFRfRVhUQ0hOTF9PRkZTRVQJQ3VyU1RBRXh0Q2hubE9mZnNldDsKKwl1OAkJCQliQ3VyVHhCVzQwTUh6OwkvLyBJZiB3ZSB1c2UgNDAgTUh6IHRvIFR4CisJdTgJCQkJUGVlckJhbmR3aWR0aDsKKworCS8vIEZvciBCYW5kd2lkdGggU3dpdGNoaW5nCisJdTgJCQkJYlN3QndJblByb2dyZXNzOworCUNITkxPUAkJCQlDaG5sT3A7IC8vIHNvZnR3YXJlIHN3aXRjaGluZyBjaGFubmVsIGluIHByb2dyZXNzLiBCeSBCcnVjZSwgMjAwOC0wMi0xNS4KKwl1OAkJCQlTd0J3U3RlcDsKKwkvL3N0cnVjdCB0aW1lcl9saXN0CQlTd0J3VGltZXI7ICAvL21vdmVkIHRvIGllZWU4MDIxMV9kZXZpY2UuIGFzIHRpbWVyX2xpc3QgbmVlZCBpbmNsdWRlIHNvbWUgaGVhZGVyIGZpbGUgaGVyZS4KKworCS8vIEZvciBSZWFsdGVrIHByb3ByaWV0YXJ5IEEtTVBEVSBmYWN0b3IgZm9yIGFnZ3JlZ2F0aW9uCisJdTgJCQkJYlJlZ1JUMlJUQWdncmVnYXRpb247CisJdTgJCQkJYkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uOworCXU4CQkJCWJDdXJyZW50UlQyUlRMb25nU2xvdFRpbWU7CisJdTgJCQkJc3pSVDJSVEFnZ0J1ZmZlclsxMF07CisKKwkvLyBSeCBSZW9yZGVyIGNvbnRyb2wKKwl1OAkJCQliUmVnUnhSZW9yZGVyRW5hYmxlOworCXU4CQkJCWJDdXJSeFJlb3JkZXJFbmFibGU7CisJdTgJCQkJUnhSZW9yZGVyV2luU2l6ZTsKKwl1OAkJCQlSeFJlb3JkZXJQZW5kaW5nVGltZTsKKwl1MTYJCQkJUnhSZW9yZGVyRHJvcENvdW50ZXI7CisKKyNpZmRlZiBVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQorCXU4CQkJCVVzYlR4QWdnck51bTsKKyNlbmRpZgorI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCisJdTgJCQkJVXNiUnhGd0FnZ3JFbjsKKwl1OAkJCQlVc2JSeEZ3QWdnclBhZ2VOdW07CisJdTgJCQkJVXNiUnhGd0FnZ3JQYWNrZXROdW07CisJdTgJCQkJVXNiUnhGd0FnZ3JUaW1lb3V0OworI2VuZGlmCisKKwkvLyBBZGQgZm9yIEJyb2FkY29tKExpbmtzeXMpIElPVC4gSm9zZXBoCisJdTgJCQkJYklzUGVlckJjbTsKKworCS8vIEZvciBJT1QgaXNzdWUuCisJdTgJCQkJSU9UUGVlcjsKKwl1MzIJCQkJSU9UQWN0aW9uOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgUlRfSElHSF9USFJPVUdIUFVULCAqUFJUX0hJR0hfVEhST1VHSFBVVDsKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlIERhdGEgc3RydWN0dXJlIGlzIHVzZWQgdG8ga2VlcCBIVCByZWxhdGVkIHZhcmlhYmxlIGZvciAiZWFjaCBTdGEiCisvLyB3aGVuIGNhcmQgaXMgY29uZmlndXJlZCBhcyAiQVAgbW9kZSIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IF9SVF9IVElORk9fU1RBX0VOVFJZeworCXU4CQkJYkVuYWJsZUhUOworCisJdTgJCQliU3VwcG9ydENjazsKKworCXUxNgkJCUFNU0RVX01heFNpemU7CisKKwl1OAkJCUFNUERVX0ZhY3RvcjsKKwl1OAkJCU1QRFVfRGVuc2l0eTsKKworCXU4CQkJSFRIaWdoZXN0T3BlcmFSYXRlOworCisJdTgJCQliQnc0ME1IejsKKworCXU4CQkJTWltb1BzOworCisJdTgJCQlNY3NSYXRlU2V0WzE2XTsKKworCit9UlRfSFRJTkZPX1NUQV9FTlRSWSwgKlBSVF9IVElORk9fU1RBX0VOVFJZOworCisKKworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgRGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBrZWVwIEhUIHJlbGF0ZWQgdmFyaWFibGUgZm9yICJlYWNoIEFQIgorLy8gd2hlbiBjYXJkIGlzIGNvbmZpZ3VyZWQgYXMgIlNUQSBtb2RlIgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgX0JTU19IVHsKKworCXU4CQkJCWJkU3VwcG9ydEhUOworCisJLy8gSFQgcmVsYXRlZCBlbGVtZW50cworCXU4CQkJCQliZEhUQ2FwQnVmWzMyXTsKKwl1MTYJCQkJCWJkSFRDYXBMZW47CisJdTgJCQkJCWJkSFRJbmZvQnVmWzMyXTsKKwl1MTYJCQkJCWJkSFRJbmZvTGVuOworCisJSFRfU1BFQ19WRVIJCQkJYmRIVFNwZWNWZXI7CisJLy9IVF9DQVBBQklMSVRZX0VMRQkJCWJkSFRDYXBFbGU7CisJLy9IVF9JTkZPUk1BVElPTl9FTEUJCWJkSFRJbmZvRWxlOworCisJdTgJCQkJCWJkUlQyUlRBZ2dyZWdhdGlvbjsKKwl1OAkJCQkJYmRSVDJSVExvbmdTbG90VGltZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIEJTU19IVCwgKlBCU1NfSFQ7CisKK3R5cGVkZWYgc3RydWN0IF9NSU1PX1JTU0l7CisJdTMyCUVuYWJsZUFudGVubmE7CisJdTMyCUFudGVubmFBOworCXUzMiAJQW50ZW5uYUI7CisJdTMyIAlBbnRlbm5hQzsKKwl1MzIgCUFudGVubmFEOworCXUzMglBdmVyYWdlOworfU1JTU9fUlNTSSwgKlBNSU1PX1JTU0k7CisKK3R5cGVkZWYgc3RydWN0IF9NSU1PX0VWTXsKKwl1MzIJRVZNMTsKKwl1MzIgICAgRVZNMjsKK31NSU1PX0VWTSwgKlBNSU1PX0VWTTsKKwordHlwZWRlZiBzdHJ1Y3QgX0ZBTFNFX0FMQVJNX1NUQVRJU1RJQ1N7CisJdTMyCUNudF9QYXJpdHlfRmFpbDsKKwl1MzIgICAgQ250X1JhdGVfSWxsZWdhbDsKKwl1MzIJQ250X0NyYzhfZmFpbDsKKwl1MzIJQ250X2FsbDsKK31GQUxTRV9BTEFSTV9TVEFUSVNUSUNTLCAqUEZBTFNFX0FMQVJNX1NUQVRJU1RJQ1M7CisKKworZXh0ZXJuIHU4IE1DU19GSUxURVJfQUxMWzE2XTsKK2V4dGVybiB1OCBNQ1NfRklMVEVSXzFTU1sxNl07CisKKy8qIDIwMDcvMDcvMTEgTUggTW9kaWZ5IHRoZSBtYWNyby4gQmVjYXVzIFNUQSBtYXkgbGluayB3aXRoIGEgTi1BUC4gSWYgd2Ugc2V0CisgICBTVEEgaW4gQS9CL0cgbW9kZSBhbmQgQVAgaXMgc3RpbGwgaW4gTiBtb2RlLiBUaGUgbWFjcm8gd2lsbCBiZSB3cm9uZy4gV2UgaGF2ZQorICAgdG8gYWRkIGEgbWFjcm8gdG8ganVkZ2Ugd2lyZWxlc3MgbW9kZS4gKi8KKyNkZWZpbmUgUElDS19SQVRFKF9uTGVnYWN5UmF0ZSwgX25NY3NSYXRlKQlcCisJCShfbk1jc1JhdGU9PTApPyhfbkxlZ2FjeVJhdGUmMHg3Zik6KF9uTWNzUmF0ZSkKKy8qIDIwMDcvMDcvMTIgTUggV2Ugb25seSBkZWZpbmUgbGVnYWN5IGFuZCBIVCB3aXJlbGVzcyBtb2RlIG5vdy4gKi8KKyNkZWZpbmUJTEVHQUNZX1dJUkVMRVNTX01PREUJSUVFRV9NT0RFX01BU0sKKworI2RlZmluZSBDVVJSRU5UX1JBVEUoV2lyZWxlc3NNb2RlLCBMZWdhY3lSYXRlLCBIVFJhdGUpCVwKKwkJCQkJKChXaXJlbGVzc01vZGUgJiAoTEVHQUNZX1dJUkVMRVNTX01PREUpKSE9MCk/XAorCQkJCQkJKExlZ2FjeVJhdGUpOlwKKwkJCQkJCShQSUNLX1JBVEUoTGVnYWN5UmF0ZSwgSFRSYXRlKSkKKworCisKKy8vIE1DUyBCdyA0MCB7MX43LCAxMn4xNSwzMn0KKyNkZWZpbmUJUkFURV9BRFBUXzFTU19NQVNLIAkJMHhGRgorI2RlZmluZQlSQVRFX0FEUFRfMlNTX01BU0sJCTB4RjAgLy9Ta2lwIE1DUzh+MTEgYmVjYXVzZSBtY3M3ID4gbWNzNiwgOSwgMTAsIDExLiAyMDA3LjAxLjE2IGJ5IEVtaWx5CisjZGVmaW5lCVJBVEVfQURQVF9NQ1MzMl9NQVNLCQkweDAxCisKKyNkZWZpbmUgCUlTXzExTl9NQ1NfUkFURShyYXRlKQkJKHJhdGUmMHg4MCkKKwordHlwZWRlZiBlbnVtIF9IVF9BR0dSRV9TSVpFeworCUhUX0FHR19TSVpFXzhLID0gMCwKKwlIVF9BR0dfU0laRV8xNksgPSAxLAorCUhUX0FHR19TSVpFXzMySyA9IDIsCisJSFRfQUdHX1NJWkVfNjRLID0gMywKK31IVF9BR0dSRV9TSVpFX0UsICpQSFRfQUdHUkVfU0laRV9FOworCisvKiBJbmRpY2F0ZSBkaWZmZXJlbnQgQVAgdmVuZG9yIGZvciBJT1QgaXNzdWUgKi8KK3R5cGVkZWYgZW51bSBfSFRfSU9UX1BFRVIKK3sKKwlIVF9JT1RfUEVFUl9VTktOT1dOID0gMCwKKwlIVF9JT1RfUEVFUl9SRUFMVEVLID0gMSwKKwlIVF9JT1RfUEVFUl9CUk9BRENPTSA9IDIsCisJSFRfSU9UX1BFRVJfUkFMSU5LID0gMywKKwlIVF9JT1RfUEVFUl9BVEhFUk9TID0gNCwKKwlIVF9JT1RfUEVFUl9DSVNDTz0gNSwKKwlIVF9JT1RfUEVFUl9NQVggPSA2Cit9SFRfSU9UX1BFRVJfRSwgKlBIVElPVF9QRUVSX0U7CisKKy8vCisvLyBJT1QgQWN0aW9uIGZvciBkaWZmZXJlbnQgQVAKKy8vCit0eXBlZGVmIGVudW0gX0hUX0lPVF9BQ1RJT057CisJSFRfSU9UX0FDVF9UWF9VU0VfQU1TRFVfNEsgPSAweDAwMDAwMDAxLAorCUhUX0lPVF9BQ1RfVFhfVVNFX0FNU0RVXzhLID0gMHgwMDAwMDAwMiwKKwlIVF9JT1RfQUNUX0RJU0FCTEVfTUNTMTQgPSAweDAwMDAwMDA0LAorCUhUX0lPVF9BQ1RfRElTQUJMRV9NQ1MxNSA9IDB4MDAwMDAwMDgsCisJSFRfSU9UX0FDVF9ESVNBQkxFX0FMTF8yU1MgPSAweDAwMDAwMDEwLAorCUhUX0lPVF9BQ1RfRElTQUJMRV9FRENBX1RVUkJPID0gMHgwMDAwMDAyMCwKKwlIVF9JT1RfQUNUX01HTlRfVVNFX0NDS182TSA9IDB4MDAwMDAwNDAsCisJSFRfSU9UX0FDVF9DRERfRlNZTkMgPSAweDAwMDAwMDgwLAorCUhUX0lPVF9BQ1RfUFVSRV9OX01PREUgPSAweDAwMDAwMTAwLAorCUhUX0lPVF9BQ1RfRk9SQ0VEX0NUUzJTRUxGID0gMHgwMDAwMDIwMCwKK31IVF9JT1RfQUNUSU9OX0UsICpQSFRfSU9UX0FDVElPTl9FOworCisjZW5kaWYgLy9fUlRMODE5WFVfSFRUWVBFX0hfCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9IVFByb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9IVFByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzRlYjM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0hUUHJvYy5jCkBAIC0wLDAgKzEsMTQ2MiBAQAorCisvL0FzIHRoaXMgZnVuY3Rpb24gaXMgbWFpbmx5IHBvcnRlZCBmcm9tIFdpbmRvd3MgZHJpdmVyLCBzbyBsZWF2ZSB0aGUgbmFtZSBsaXR0bGUgY2hhbmdlZC4gSWYgYW55IGNvbmZ1c2lvbiBjYXVzZWQsIHRlbGwgbWUuIENyZWF0ZWQgYnkgV0IuIDIwMDguMDUuMDgKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKyNpbmNsdWRlICJydGw4MTl4X0hULmgiCit1OCBNQ1NfRklMVEVSX0FMTFsxNl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgxZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisKK3U4IE1DU19GSUxURVJfMVNTWzE2XSA9IHsweGZmLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKwordTE2IE1DU19EQVRBX1JBVEVbMl1bMl1bNzddID0KKwl7CXsJezEzLCAyNiwgMzksIDUyLCA3OCwgMTA0LCAxMTcsIDEzMCwgMjYsIDUyLCA3OCAsMTA0LCAxNTYsIDIwOCwgMjM0LCAyNjAsCisJCQkzOSwgNzgsIDExNywgMjM0LCAzMTIsIDM1MSwgMzkwLCA1MiwgMTA0LCAxNTYsIDIwOCwgMzEyLCA0MTYsIDQ2OCwgNTIwLAorCQkJMCwgNzgsIDEwNCwgMTMwLCAxMTcsIDE1NiwgMTk1LCAxMDQsIDEzMCwgMTMwLCAxNTYsIDE4MiwgMTgyLCAyMDgsIDE1NiwgMTk1LAorCQkJMTk1LCAyMzQsIDI3MywgMjczLCAzMTIsIDEzMCwgMTU2LCAxODEsIDE1NiwgMTgxLCAyMDgsIDIzNCwgMjA4LCAyMzQsIDI2MCwgMjYwLAorCQkJMjg2LCAxOTUsIDIzNCwgMjczLCAyMzQsIDI3MywgMzEyLCAzNTEsIDMxMiwgMzUxLCAzOTAsIDM5MCwgNDI5fSwJCQkvLyBMb25nIEdJLCAyME1IegorCQkJezE0LCAyOSwgNDMsIDU4LCA4NywgMTE2LCAxMzAsIDE0NCwgMjksIDU4LCA4NywgMTE2LCAxNzMsIDIzMSwgMjYwLCAyODksCisJCQk0MywgODcsIDEzMCwgMTczLCAyNjAsIDM0NywgMzkwLCA0MzMsIDU4LCAxMTYsIDE3MywgMjMxLCAzNDcsIDQ2MiwgNTIwLCA1NzgsCisJCQkwLCA4NywgMTE2LCAxNDQsIDEzMCwgMTczLCAyMTcsIDExNiwgMTQ0LCAxNDQsIDE3MywgMjAyLCAyMDIsIDIzMSwgMTczLCAyMTcsCisJCQkyMTcsIDI2MCwgMzAzLCAzMDMsIDM0NywgMTQ0LCAxNzMsIDIwMiwgMTczLCAyMDIsIDIzMSwgMjYwLCAyMzEsIDI2MCwgMjg5LCAyODksCisJCQkzMTgsIDIxNywgMjYwLCAzMDMsIDI2MCwgMzAzLCAzNDcsIDM5MCwgMzQ3LCAzOTAsIDQzMywgNDMzLCA0Nzd9CX0sCQkvLyBTaG9ydCBHSSwgMjBNSHoKKwkJewl7MjcsIDU0LCA4MSwgMTA4LCAxNjIsIDIxNiwgMjQzLCAyNzAsIDU0LCAxMDgsIDE2MiwgMjE2LCAzMjQsIDQzMiwgNDg2LCA1NDAsCisJCQk4MSwgMTYyLCAyNDMsIDMyNCwgNDg2LCA2NDgsIDcyOSwgODEwLCAxMDgsIDIxNiwgMzI0LCA0MzIsIDY0OCwgODY0LCA5NzIsIDEwODAsCisJCQkxMiwgMTYyLCAyMTYsIDI3MCwgMjQzLCAzMjQsIDQwNSwgMjE2LCAyNzAsIDI3MCwgMzI0LCAzNzgsIDM3OCwgNDMyLCAzMjQsIDQwNSwKKwkJCTQwNSwgNDg2LCA1NjcsIDU2NywgNjQ4LCAyNzAsIDMyNCwgMzc4LCAzMjQsIDM3OCwgNDMyLCA0ODYsIDQzMiwgNDg2LCA1NDAsIDU0MCwKKwkJCTU5NCwgNDA1LCA0ODYsIDU2NywgNDg2LCA1NjcsIDY0OCwgNzI5LCA2NDgsIDcyOSwgODEwLCA4MTAsIDg5MX0sIAkvLyBMb25nIEdJLCA0ME1IegorCQkJezMwLCA2MCwgOTAsIDEyMCwgMTgwLCAyNDAsIDI3MCwgMzAwLCA2MCwgMTIwLCAxODAsIDI0MCwgMzYwLCA0ODAsIDU0MCwgNjAwLAorCQkJOTAsIDE4MCwgMjcwLCAzNjAsIDU0MCwgNzIwLCA4MTAsIDkwMCwgMTIwLCAyNDAsIDM2MCwgNDgwLCA3MjAsIDk2MCwgMTA4MCwgMTIwMCwKKwkJCTEzLCAxODAsIDI0MCwgMzAwLCAyNzAsIDM2MCwgNDUwLCAyNDAsIDMwMCwgMzAwLCAzNjAsIDQyMCwgNDIwLCA0ODAsIDM2MCwgNDUwLAorCQkJNDUwLCA1NDAsIDYzMCwgNjMwLCA3MjAsIDMwMCwgMzYwLCA0MjAsIDM2MCwgNDIwLCA0ODAsIDU0MCwgNDgwLCA1NDAsIDYwMCwgNjAwLAorCQkJNjYwLCA0NTAsIDU0MCwgNjMwLCA1NDAsIDYzMCwgNzIwLCA4MTAsIDcyMCwgODEwLCA5MDAsIDkwMCwgOTkwfQl9CS8vIFNob3J0IEdJLCA0ME1IegorCX07CisKK3N0YXRpYyB1OCBVTktOT1dOX0JPUkFEQ09NWzNdID0gezB4MDAsIDB4MTQsIDB4YmZ9Oworc3RhdGljIHU4IExJTktTWVNXUlQzMzBfTElOS1NZU1dSVDMwMF9CUk9BRENPTVszXSA9IHsweDAwLCAweDFhLCAweDcwfTsKK3N0YXRpYyB1OCBMSU5LU1lTV1JUMzUwX0xJTktTWVNXUlQxNTBfQlJPQURDT01bM10gPSB7MHgwMCwgMHgxZCwgMHg3ZX07CitzdGF0aWMgdTggTkVUR0VBUjgzNEJ2Ml9CUk9BRENPTVszXSA9IHsweDAwLCAweDFiLCAweDJmfTsKK3N0YXRpYyB1OCBCRUxLSU5GNUQ4MjMzVjFfUkFMSU5LWzNdID0gezB4MDAsIDB4MTcsIDB4M2Z9OwkvL2Nvc2EgMDMyMDIwMDgKK3N0YXRpYyB1OCBCRUxLSU5GNUQ4MjMzNFYzX1JBTElOS1szXSA9IHsweDAwLCAweDFjLCAweGRmfTsKK3N0YXRpYyB1OCBQQ0lfUkFMSU5LWzNdID0gezB4MDAsIDB4OTAsIDB4Y2N9Oworc3RhdGljIHU4IEVESU1BWF9SQUxJTktbM10gPSB7MHgwMCwgMHgwZSwgMHgyZX07CitzdGF0aWMgdTggQUlSTElOS19SQUxJTktbM10gPSB7MHgwMCwgMHgxOCwgMHgwMn07CisvL3N0YXRpYyB1OCBETElOS19BVEhFUk9TWzNdID0gezB4MDAsIDB4MWMsIDB4ZjB9Oworc3RhdGljIHU4IENJU0NPX0JST0FEQ09NWzNdID0gezB4MDAsIDB4MTcsIDB4OTR9OworCisvLyAyMDA4LzA0LzAxIE1IIEZvciBDaXNjbyBHIG1vZGUgUlggVFAgV2UgbmVlZCB0byBjaGFuZ2UgRlcgZHVyYXRpb24uIFNob3VkIHdlIHB1dCB0aGUKKy8vIGNvZGUgaW4gb3RoZXIgcGxhY2U/PworLy9zdGF0aWMgdTggV0lGSV9DSVNDT19HX0FQWzNdID0gezB4MDAsIDB4NDAsIDB4OTZ9OworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiB1cGRhdGUgZGVmYXVsdCBzZXR0aW5ncyBpbiBwSFRJbmZvIHN0cnVjdHVyZQorICogICBpbnB1dDogIFBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbworICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiAgVGhlc2UgdmFsdWUgbmVlZCBiZSBtb2RpZmllZCBpZiBhbnkgY2hhbmdlcy4KKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIVFVwZGF0ZURlZmF1bHRTZXR0aW5nKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKQoreworCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisJLy9jb25zdCB0eXBlb2YoICgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKikwKS0+cEhUSW5mbyApICpfX21wdHIgPSAmcEhUSW5mbzsKKworCS8vcHJpbnRrKCJwSFRpbmZvOiVwLCAmcEhUaW5mbzolcCwgbXB0cjolcCwgIG9mZnNldG9mOiV4XG4iLCBwSFRJbmZvLCAmcEhUSW5mbywgX19tcHRyLCBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgcEhUSW5mbykpOworCS8vcHJpbnRrKCI9PT0+aWVlZTolcCxcbiIsIGllZWUpOworCS8vIFNob3J0R0kgc3VwcG9ydAorCXBIVEluZm8tPmJSZWdTaG9ydEdJMjBNSHo9IDE7CisJcEhUSW5mby0+YlJlZ1Nob3J0R0k0ME1Iej0gMTsKKworCS8vIDQwTUh6IGNoYW5uZWwgc3VwcG9ydAorCXBIVEluZm8tPmJSZWdCVzQwTUh6ID0gMTsKKworCS8vIENDSyByYXRlIHN1cHBvcnQgaW4gNDBNSHogY2hhbm5lbAorCWlmKHBIVEluZm8tPmJSZWdCVzQwTUh6KQorCQlwSFRJbmZvLT5iUmVnU3VwcENDSyA9IDE7CisJZWxzZQorCQlwSFRJbmZvLT5iUmVnU3VwcENDSyA9IHRydWU7CisKKwkvLyBBTVNEVSByZWxhdGVkCisJcEhUSW5mby0+bkFNU0RVX01heFNpemUgPSA3OTM1VUw7CisJcEhUSW5mby0+YkFNU0RVX1N1cHBvcnQgPSAwOworCisJLy8gQU1QRFUgcmVsYXRlZAorCXBIVEluZm8tPmJBTVBEVUVuYWJsZSA9IDE7CisJcEhUSW5mby0+QU1QRFVfRmFjdG9yID0gMjsgLy8vLyAwOiAybjEzKDhLKSwgMToybjE0KDE2SyksIDI6Mm4xNSgzMkspLCAzOjJuMTYoNjRrKQorCXBIVEluZm8tPk1QRFVfRGVuc2l0eSA9IDA7Ly8gMDogTm8gcmVzdHJpY3Rpb24sIDE6IDEvOHVzZWMsIDI6IDEvNHVzZWMsIDM6IDEvMnVzZWMsIDQ6IDF1c2VjLCA1OiAydXNlYywgNjogNHVzZWMsIDc6OHVzZWMKKworCS8vIE1JTU8gUG93ZXIgU2F2ZQorCXBIVEluZm8tPlNlbGZNaW1vUHMgPSAzOy8vIDA6IFN0YXRpYyBNaW1vIFBzLCAxOiBEeW5hbWljIE1pbW8gUHMsIDM6IE5vIExpbWl0YXRpb24sIDI6IFJlc2VydmVkKFNldCB0byAzIGF1dG9tYXRpY2FsbHkuKQorCWlmKHBIVEluZm8tPlNlbGZNaW1vUHMgPT0gMikKKwkJcEhUSW5mby0+U2VsZk1pbW9QcyA9IDM7CisJLy8gODE5MCBvbmx5LiBBc3NpZ24gcmF0ZSBvcGVyYXRpb24gbW9kZSB0byBmaXJtd2FyZQorCWllZWUtPmJUeERpc2FibGVSYXRlRmFsbEJhY2sgPSAwOworCWllZWUtPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSA9IDA7CisKKyNpZmRlZiAJVE9fRE9fTElTVAorCS8vIDgxOTAgb25seS4gQXNzaWduIGR1cmF0aW9uIG9wZXJhdGlvbiBtb2RlIHRvIGZpcm13YXJlCisJcE1nbnRJbmZvLT5iVHhFbmFibGVGd0NhbGNEdXIgPSAoQk9PTEVBTilwTmRpc0NvbW1vbi0+YlJlZ1R4RW5hYmxlRndDYWxjRHVyOworI2VuZGlmCisJLy8gODE5MCBvbmx5LCBSZWFsdGVrIHByb3ByaWV0YXJ5IGFnZ3JlZ2F0aW9uIG1vZGUKKwkvLyBTZXQgTVBEVURlbnNpdHk9MiwgICAxOiBTZXQgTVBEVURlbnNpdHk9MigzMmspICBmb3IgUmVhbHRlayBBUCBhbmQgc2V0IE1QRFVEZW5zaXR5PTAoOGspIGZvciBvdGhlcnMKKwlwSFRJbmZvLT5iUmVnUlQyUlRBZ2dyZWdhdGlvbiA9IDE7Ly8wOiBTZXQgTVBEVURlbnNpdHk9MiwgICAxOiBTZXQgTVBEVURlbnNpdHk9MigzMmspICBmb3IgUmVhbHRlayBBUCBhbmQgc2V0IE1QRFVEZW5zaXR5PTAoOGspIGZvciBvdGhlcnMKKworCS8vIEZvciBSeCBSZW9yZGVyIENvbnRyb2wKKwlwSFRJbmZvLT5iUmVnUnhSZW9yZGVyRW5hYmxlID0gMTsKKwlwSFRJbmZvLT5SeFJlb3JkZXJXaW5TaXplID0gNjQ7CisJcEhUSW5mby0+UnhSZW9yZGVyUGVuZGluZ1RpbWUgPSAzMDsKKworI2lmZGVmIFVTQl9UWF9EUklWRVJfQUdHUkVHQVRJT05fRU5BQkxFCisJcEhUSW5mby0+VXNiVHhBZ2dyTnVtID0gNDsKKyNlbmRpZgorI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCisJcEhUSW5mby0+VXNiUnhGd0FnZ3JFbiA9IDE7CisJcEhUSW5mby0+VXNiUnhGd0FnZ3JQYWdlTnVtID0gMjQ7CisJcEhUSW5mby0+VXNiUnhGd0FnZ3JQYWNrZXROdW0gPSA4OworCXBIVEluZm8tPlVzYlJ4RndBZ2dyVGltZW91dCA9IDE2OyAvLy8vdXNiIHJ4IEZXIGFnZ3JlZ2F0aW9uIHRpbWVvdXQgdGhyZXNob2xkLkl0J3MgaW4gdW5pdHMgb2YgNjR1cworI2VuZGlmCisKKworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBwcmludCBvdXQgZWFjaCBmaWVsZCBvbiBIVCBjYXBhYmlsaXR5IElFIG1haW5seSBmcm9tIChCZWFjb24vUHJvYmVSc3AvQXNzb2NSZXEpCisgKiAgIGlucHV0OiAgdTgqCUNhcElFICAgICAgIC8vQ2FwYWJpbGl0eSBJRSB0byBiZSBwcmludGVkIG91dAorICogICAJICAgICB1OCogCVRpdGxlU3RyaW5nIC8vbWFpbmx5IHByaW50IG91dCBjYWxsZXIgZnVuY3Rpb24KKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogIG5vdGljZTogIERyaXZlciBzaG91bGQgbm90IHByaW50IG91dCB0aGlzIG1lc3NhZ2UgYnkgZGVmYXVsdC4KKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIVERlYnVnSFRDYXBhYmlsaXR5KHU4KiBDYXBJRSwgdTgqIFRpdGxlU3RyaW5nICkKK3sKKworCXN0YXRpYyB1OAlFV0MxMU5IVENhcFtdID0gezB4MDAsIDB4OTAsIDB4NGMsIDB4MzN9OwkvLyBGb3IgMTFuIEVXQyBkZWZpbml0aW9uLCAyMDA3LjA3LjE3LCBieSBFbWlseQorCVBIVF9DQVBBQklMSVRZX0VMRSAJCXBDYXBFTEU7CisKKwlpZighbWVtY21wKENhcElFLCBFV0MxMU5IVENhcCwgc2l6ZW9mKEVXQzExTkhUQ2FwKSkpCisJeworCQkvL0VXQyBJRQorCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiRVdDIElFIGluICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXBDYXBFTEUgPSAoUEhUX0NBUEFCSUxJVFlfRUxFKSgmQ2FwSUVbNF0pOworCX1lbHNlCisJCXBDYXBFTEUgPSAoUEhUX0NBUEFCSUxJVFlfRUxFKSgmQ2FwSUVbMF0pOworCisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIjxMb2cgSFQgQ2FwYWJpbGl0eT4uIENhbGxlZCBieSAlc1xuIiwgVGl0bGVTdHJpbmcgKTsKKworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRTdXBwb3J0ZWQgQ2hhbm5lbCBXaWR0aCA9ICVzXG4iLCAocENhcEVMRS0+Q2hsV2lkdGgpPyIyME1IeiI6ICIyMC80ME1IeiIpOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRTdXBwb3J0IFNob3J0IEdJIGZvciAyME0gPSAlc1xuIiwgKHBDYXBFTEUtPlNob3J0R0kyME1oeik/IllFUyI6ICJOTyIpOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRTdXBwb3J0IFNob3J0IEdJIGZvciA0ME0gPSAlc1xuIiwgKHBDYXBFTEUtPlNob3J0R0k0ME1oeik/IllFUyI6ICJOTyIpOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRTdXBwb3J0IFRYIFNUQkMgPSAlc1xuIiwgKHBDYXBFTEUtPlR4U1RCQyk/IllFUyI6ICJOTyIpOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRNYXggQU1TRFUgU2l6ZSA9ICVzXG4iLCAocENhcEVMRS0+TWF4QU1TRFVTaXplKT8iMzgzOSI6ICI3OTM1Iik7CisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgICJcdFN1cHBvcnQgQ0NLIGluIDIwLzQwIG1vZGUgPSAlc1xuIiwgKHBDYXBFTEUtPkRzc0NDayk/IllFUyI6ICJOTyIpOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRNYXggQU1QRFUgRmFjdG9yID0gJWRcbiIsIHBDYXBFTEUtPk1heFJ4QU1QRFVGYWN0b3IpOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRNUERVIERlbnNpdHkgPSAlZFxuIiwgcENhcEVMRS0+TVBEVURlbnNpdHkpOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRNQ1MgUmF0ZSBTZXQgPSBbJXhdWyV4XVsleF1bJXhdWyV4XVxuIiwgcENhcEVMRS0+TUNTWzBdLFwKKwkJCQlwQ2FwRUxFLT5NQ1NbMV0sIHBDYXBFTEUtPk1DU1syXSwgcENhcEVMRS0+TUNTWzNdLCBwQ2FwRUxFLT5NQ1NbNF0pOworCXJldHVybjsKKworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBwcmludCBvdXQgZWFjaCBmaWVsZCBvbiBIVCBJbmZvcm1hdGlvbiBJRSBtYWlubHkgZnJvbSAoQmVhY29uL1Byb2JlUnNwKQorICogICBpbnB1dDogIHU4KglJbmZvSUUgICAgICAgLy9DYXBhYmlsaXR5IElFIHRvIGJlIHByaW50ZWQgb3V0CisgKiAgIAkgICAgIHU4KiAJVGl0bGVTdHJpbmcgLy9tYWlubHkgcHJpbnQgb3V0IGNhbGxlciBmdW5jdGlvbgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiAgRHJpdmVyIHNob3VsZCBub3QgcHJpbnQgb3V0IHRoaXMgbWVzc2FnZSBieSBkZWZhdWx0LgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhURGVidWdIVEluZm8odTgqCUluZm9JRSwgdTgqIFRpdGxlU3RyaW5nKQoreworCisJc3RhdGljIHU4CUVXQzExTkhUSW5mb1tdID0gezB4MDAsIDB4OTAsIDB4NGMsIDB4MzR9OwkvLyBGb3IgMTFuIEVXQyBkZWZpbml0aW9uLCAyMDA3LjA3LjE3LCBieSBFbWlseQorCVBIVF9JTkZPUk1BVElPTl9FTEUJCXBIVEluZm9FbGU7CisKKwlpZighbWVtY21wKEluZm9JRSwgRVdDMTFOSFRJbmZvLCBzaXplb2YoRVdDMTFOSFRJbmZvKSkpCisJeworCQkvLyBOb3QgRVdDIElFCisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJFV0MgSUUgaW4gJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcEhUSW5mb0VsZSA9IChQSFRfSU5GT1JNQVRJT05fRUxFKSgmSW5mb0lFWzRdKTsKKwl9ZWxzZQorCQlwSFRJbmZvRWxlID0gKFBIVF9JTkZPUk1BVElPTl9FTEUpKCZJbmZvSUVbMF0pOworCisKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiPExvZyBIVCBJbmZvcm1hdGlvbiBFbGVtZW50Pi4gQ2FsbGVkIGJ5ICVzXG4iLCBUaXRsZVN0cmluZyk7CisKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiXHRQcmltYXJ5IGNoYW5uZWwgPSAlZFxuIiwgcEhUSW5mb0VsZS0+Q29udHJvbENobCk7CisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIlx0U2Vub25kYXJ5IGNoYW5uZWwgPSIpOworCXN3aXRjaChwSFRJbmZvRWxlLT5FeHRDaGxPZmZzZXQpCisJeworCQljYXNlIDA6CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiTm90IFByZXNlbnRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJVcHBlciBjaGFubmVsXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiUmVzZXJ2ZWQuIEVvb3JvISEhXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiTG93ZXIgQ2hhbm5lbFxuIik7CisJCQlicmVhazsKKwl9CisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIlx0UmVjb21tZW5kZWQgY2hhbm5lbCB3aWR0aCA9ICVzXG4iLCAocEhUSW5mb0VsZS0+UmVjb21tZW1kZWRUeFdpZHRoKT8iMjBNaHoiOiAiNDBNaHoiKTsKKworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJcdE9wZXJhdGlvbiBtb2RlIGZvciBwcm90ZWN0aW9uID0gIik7CisJc3dpdGNoKHBIVEluZm9FbGUtPk9wdE1vZGUpCisJeworCQljYXNlIDA6CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiTm8gUHJvdGVjdGlvblxuIik7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIkhUIG5vbi1tZW1iZXIgcHJvdGVjdGlvbiBtb2RlXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiU3VnZ2VzdCB0byBvcGVuIHByb3RlY3Rpb25cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJIVCBtaXhlZCBtb2RlXG4iKTsKKwkJCWJyZWFrOworCX0KKworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJcdEJhc2ljIE1DUyBSYXRlIFNldCA9IFsleF1bJXhdWyV4XVsleF1bJXhdXG4iLCBwSFRJbmZvRWxlLT5CYXNpY01TQ1swXSxcCisJCQkJcEhUSW5mb0VsZS0+QmFzaWNNU0NbMV0sIHBIVEluZm9FbGUtPkJhc2ljTVNDWzJdLCBwSFRJbmZvRWxlLT5CYXNpY01TQ1szXSwgcEhUSW5mb0VsZS0+QmFzaWNNU0NbNF0pOworCXJldHVybjsKK30KKworLyoKKyoJUmV0dXJuOiAgICAgCXRydWUgaWYgc3RhdGlvbiBpbiBoYWxmIG4gbW9kZSBhbmQgQVAgc3VwcG9ydHMgNDAgYncKKyovCitib29sIElzSFRIYWxmTm1vZGU0MEJhbmR3aWR0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSkKK3sKKwlib29sCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwlQUlRfSElHSF9USFJPVUdIUFVUCSBwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKworCWlmKHBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IGZhbHNlICkJLy8gd2lyZWxlc3MgaXMgbiBtb2RlCisJCXJldFZhbHVlID0gZmFsc2U7CisJZWxzZSBpZihwSFRJbmZvLT5iUmVnQlc0ME1IeiA9PSBmYWxzZSkJLy8gc3RhdGlvbiBzdXBwb3J0cyA0MCBidworCQlyZXRWYWx1ZSA9IGZhbHNlOworCWVsc2UgaWYoIWllZWUtPkdldEhhbGZObW9kZVN1cHBvcnRCeUFQc0hhbmRsZXIoaWVlZS0+ZGV2KSkgCS8vIHN0YXRpb24gaW4gaGFsZiBuIG1vZGUKKwkJcmV0VmFsdWUgPSBmYWxzZTsKKwllbHNlIGlmKCgoUEhUX0NBUEFCSUxJVFlfRUxFKShwSFRJbmZvLT5QZWVySFRDYXBCdWYpKS0+Q2hsV2lkdGgpIC8vIGFwIHN1cHBvcnQgNDAgYncKKwkJcmV0VmFsdWUgPSB0cnVlOworCWVsc2UKKwkJcmV0VmFsdWUgPSBmYWxzZTsKKworCXJldHVybiByZXRWYWx1ZTsKK30KKworYm9vbCBJc0hUSGFsZk5tb2RlU0dJKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBib29sIGlzNDBNSHopCit7CisJYm9vbAkJCXJldFZhbHVlID0gZmFsc2U7CisJUFJUX0hJR0hfVEhST1VHSFBVVAkgcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisKKwlpZihwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9PSBmYWxzZSApCS8vIHdpcmVsZXNzIGlzIG4gbW9kZQorCQlyZXRWYWx1ZSA9IGZhbHNlOworCWVsc2UgaWYoIWllZWUtPkdldEhhbGZObW9kZVN1cHBvcnRCeUFQc0hhbmRsZXIoaWVlZS0+ZGV2KSkgCS8vIHN0YXRpb24gaW4gaGFsZiBuIG1vZGUKKwkJcmV0VmFsdWUgPSBmYWxzZTsKKwllbHNlIGlmKGlzNDBNSHopIC8vIGFwIHN1cHBvcnQgNDAgYncKKwl7CisJCWlmKCgoUEhUX0NBUEFCSUxJVFlfRUxFKShwSFRJbmZvLT5QZWVySFRDYXBCdWYpKS0+U2hvcnRHSTQwTWh6KSAvLyBhcCBzdXBwb3J0IDQwIGJ3IHNob3J0IEdJCisJCQlyZXRWYWx1ZSA9IHRydWU7CisJCWVsc2UKKwkJCXJldFZhbHVlID0gZmFsc2U7CisJfQorCWVsc2UKKwl7CisJCWlmKCgoUEhUX0NBUEFCSUxJVFlfRUxFKShwSFRJbmZvLT5QZWVySFRDYXBCdWYpKS0+U2hvcnRHSTIwTWh6KSAvLyBhcCBzdXBwb3J0IDQwIGJ3IHNob3J0IEdJCisJCQlyZXRWYWx1ZSA9IHRydWU7CisJCWVsc2UKKwkJCXJldFZhbHVlID0gZmFsc2U7CisJfQorCisJcmV0dXJuIHJldFZhbHVlOworfQorCit1MTYgSFRIYWxmTWNzVG9EYXRhUmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgCXU4CW5NY3NSYXRlKQoreworCisJdTgJaXM0ME1IejsKKwl1OAlpc1Nob3J0R0k7CisKKwlpczQwTUh6ICA9ICAoSXNIVEhhbGZObW9kZTQwQmFuZHdpZHRoKGllZWUpKT8xOjA7CisJaXNTaG9ydEdJID0gKElzSFRIYWxmTm1vZGVTR0koaWVlZSwgaXM0ME1IeikpPyAxOjA7CisKKwlyZXR1cm4gTUNTX0RBVEFfUkFURVtpczQwTUh6XVtpc1Nob3J0R0ldWyhuTWNzUmF0ZSYweDdmKV07Cit9CisKKwordTE2IEhUTWNzVG9EYXRhUmF0ZSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4IG5NY3NSYXRlKQoreworCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisKKwl1OAlpczQwTUh6ID0gKHBIVEluZm8tPmJDdXJCVzQwTUh6KT8xOjA7CisJdTgJaXNTaG9ydEdJID0gKHBIVEluZm8tPmJDdXJCVzQwTUh6KT8KKwkJCQkJCSgocEhUSW5mby0+YkN1clNob3J0R0k0ME1Ieik/MTowKToKKwkJCQkJCSgocEhUSW5mby0+YkN1clNob3J0R0kyME1Ieik/MTowKTsKKwlyZXR1cm4gTUNTX0RBVEFfUkFURVtpczQwTUh6XVtpc1Nob3J0R0ldWyhuTWNzUmF0ZSYweDdmKV07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBjdXJyZW50IGRhdGFyYXRlLgorICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiAJaWVlZQorICogICAJICAgICB1OCAJCQluRGF0YVJhdGUKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgdHggcmF0ZQorICogIG5vdGljZTogIHF1aXRlIHVuc3VyZSBhYm91dCBob3cgdG8gdXNlIHRoaXMgZnVuY3Rpb24gLy93YgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgIFR4Q291bnRUb0RhdGFSYXRlKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTggbkRhdGFSYXRlKQoreworCS8vUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwl1MTYJCUNDS09GRE1SYXRlWzEyXSA9IHsweDAyICwgMHgwNCAsIDB4MGIgLCAweDE2ICwgMHgwYyAsIDB4MTIgLCAweDE4ICwgMHgyNCAsIDB4MzAgLCAweDQ4ICwgMHg2MCAsIDB4NmN9OworCXU4CWlzNDBNSHogPSAwOworCXU4CWlzU2hvcnRHSSA9IDA7CisKKwlpZihuRGF0YVJhdGUgPCAxMikKKwl7CisJCXJldHVybiBDQ0tPRkRNUmF0ZVtuRGF0YVJhdGVdOworCX0KKwllbHNlCisJeworCQlpZiAobkRhdGFSYXRlID49IDB4MTAgJiYgbkRhdGFSYXRlIDw9IDB4MWYpLy9pZihuRGF0YVJhdGUgPiAxMSAmJiBuRGF0YVJhdGUgPCAyOCApCisJCXsKKwkJCWlzNDBNSHogPSAwOworCQkJaXNTaG9ydEdJID0gMDsKKworCQkgICAgICAvLyBuRGF0YVJhdGUgPSBuRGF0YVJhdGUgLSAxMjsKKwkJfQorCQllbHNlIGlmKG5EYXRhUmF0ZSA+PTB4MjAgICYmIG5EYXRhUmF0ZSA8PSAweDJmICkgLy8oMjcsIDQ0KQorCQl7CisJCQlpczQwTUh6ID0gMTsKKwkJCWlzU2hvcnRHSSA9IDA7CisKKwkJCS8vbkRhdGFSYXRlID0gbkRhdGFSYXRlIC0gMjg7CisJCX0KKwkJZWxzZSBpZihuRGF0YVJhdGUgPj0gMHgzMCAgJiYgbkRhdGFSYXRlIDw9IDB4M2YgKSAgLy8oNDMsIDYwKQorCQl7CisJCQlpczQwTUh6ID0gMDsKKwkJCWlzU2hvcnRHSSA9IDE7CisKKwkJCS8vbkRhdGFSYXRlID0gbkRhdGFSYXRlIC0gNDQ7CisJCX0KKwkJZWxzZSBpZihuRGF0YVJhdGUgPj0gMHg0MCAgJiYgbkRhdGFSYXRlIDw9IDB4NGYgKSAvLyg1OSwgNzYpCisJCXsKKwkJCWlzNDBNSHogPSAxOworCQkJaXNTaG9ydEdJID0gMTsKKworCQkJLy9uRGF0YVJhdGUgPSBuRGF0YVJhdGUgLSA2MDsKKwkJfQorCQlyZXR1cm4gTUNTX0RBVEFfUkFURVtpczQwTUh6XVtpc1Nob3J0R0ldW25EYXRhUmF0ZSYweGZdOworCX0KK30KKworCisKK2Jvb2wgSXNIVEhhbGZObW9kZUFQcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSkKK3sKKwlib29sCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsqIG5ldCA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisJaWYoKG1lbWNtcChuZXQtPmJzc2lkLCBCRUxLSU5GNUQ4MjMzVjFfUkFMSU5LLCAzKT09MCkgfHwKKwkJICAgICAobWVtY21wKG5ldC0+YnNzaWQsIEJFTEtJTkY1RDgyMzM0VjNfUkFMSU5LLCAzKT09MCkgfHwKKwkJICAgICAobWVtY21wKG5ldC0+YnNzaWQsIFBDSV9SQUxJTkssIDMpPT0wKSB8fAorCQkgICAgIChtZW1jbXAobmV0LT5ic3NpZCwgRURJTUFYX1JBTElOSywgMyk9PTApIHx8CisJCSAgICAgKG1lbWNtcChuZXQtPmJzc2lkLCBBSVJMSU5LX1JBTElOSywgMyk9PTApIHx8CisJCSAgICAgKG5ldC0+cmFsaW5rX2NhcF9leGlzdCkpCisJCXJldFZhbHVlID0gdHJ1ZTsKKwllbHNlIGlmKChtZW1jbXAobmV0LT5ic3NpZCwgVU5LTk9XTl9CT1JBRENPTSwgMyk9PTApIHx8CisJCSAgICAobWVtY21wKG5ldC0+YnNzaWQsIExJTktTWVNXUlQzMzBfTElOS1NZU1dSVDMwMF9CUk9BRENPTSwgMyk9PTApfHwKKwkJICAgIChtZW1jbXAobmV0LT5ic3NpZCwgTElOS1NZU1dSVDM1MF9MSU5LU1lTV1JUMTUwX0JST0FEQ09NLCAzKT09MCl8fAorCQkgICAgKG1lbWNtcChuZXQtPmJzc2lkLCBORVRHRUFSODM0QnYyX0JST0FEQ09NLCAzKT09MCkgfHwKKwkJICAgIChuZXQtPmJyb2FkY29tX2NhcF9leGlzdCkpCisJCSAgcmV0VmFsdWUgPSB0cnVlOworCWVsc2UgaWYobmV0LT5ic3NodC5iZFJUMlJUQWdncmVnYXRpb24pCisJCXJldFZhbHVlID0gdHJ1ZTsKKwllbHNlCisJCXJldFZhbHVlID0gZmFsc2U7CisKKwlyZXR1cm4gcmV0VmFsdWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBwZWVyIElPVC4KKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogCWllZWUKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOgorICogIG5vdGljZToKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIVElPVFBlZXJEZXRlcm1pbmUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsqIG5ldCA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisJaWYobmV0LT5ic3NodC5iZFJUMlJUQWdncmVnYXRpb24pCisJCXBIVEluZm8tPklPVFBlZXIgPSBIVF9JT1RfUEVFUl9SRUFMVEVLOworCWVsc2UgaWYobmV0LT5icm9hZGNvbV9jYXBfZXhpc3QpCisJCXBIVEluZm8tPklPVFBlZXIgPSBIVF9JT1RfUEVFUl9CUk9BRENPTTsKKwllbHNlIGlmKChtZW1jbXAobmV0LT5ic3NpZCwgVU5LTk9XTl9CT1JBRENPTSwgMyk9PTApIHx8CisJCQkobWVtY21wKG5ldC0+YnNzaWQsIExJTktTWVNXUlQzMzBfTElOS1NZU1dSVDMwMF9CUk9BRENPTSwgMyk9PTApfHwKKwkJCShtZW1jbXAobmV0LT5ic3NpZCwgTElOS1NZU1dSVDM1MF9MSU5LU1lTV1JUMTUwX0JST0FEQ09NLCAzKT09MCl8fAorCQkJKG1lbWNtcChuZXQtPmJzc2lkLCBORVRHRUFSODM0QnYyX0JST0FEQ09NLCAzKT09MCkgKQorCQlwSFRJbmZvLT5JT1RQZWVyID0gSFRfSU9UX1BFRVJfQlJPQURDT007CisJZWxzZSBpZigobWVtY21wKG5ldC0+YnNzaWQsIEJFTEtJTkY1RDgyMzNWMV9SQUxJTkssIDMpPT0wKSB8fAorCQkJKG1lbWNtcChuZXQtPmJzc2lkLCBCRUxLSU5GNUQ4MjMzNFYzX1JBTElOSywgMyk9PTApIHx8CisJCQkobWVtY21wKG5ldC0+YnNzaWQsIFBDSV9SQUxJTkssIDMpPT0wKSB8fAorCQkJKG1lbWNtcChuZXQtPmJzc2lkLCBFRElNQVhfUkFMSU5LLCAzKT09MCkgfHwKKwkJCShtZW1jbXAobmV0LT5ic3NpZCwgQUlSTElOS19SQUxJTkssIDMpPT0wKSB8fAorCQkJIG5ldC0+cmFsaW5rX2NhcF9leGlzdCkKKwkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX1JBTElOSzsKKwllbHNlIGlmKG5ldC0+YXRoZXJvc19jYXBfZXhpc3QpCisJCXBIVEluZm8tPklPVFBlZXIgPSBIVF9JT1RfUEVFUl9BVEhFUk9TOworCWVsc2UgaWYobWVtY21wKG5ldC0+YnNzaWQsIENJU0NPX0JST0FEQ09NLCAzKT09MCkKKwkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX0NJU0NPOworCWVsc2UKKwkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX1VOS05PV047CisKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0lPVCwgIkpvc2VwaCBkZWJ1ZyEhIElPVFBFRVI6ICV4XG4iLCBwSFRJbmZvLT5JT1RQZWVyKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIENoZWNrIHdoZXRoZXIgZHJpdmVyIHNob3VsZCBkZWNsYXJlIHJlY2VpdmVkIHJhdGUgdXAgdG8gTUNTMTMgb25seSBzaW5jZSBzb21lIGNoaXBzZXQgaXMgbm90IGdvb2QKKyAqCSAgICAgYXQgcmVjZWl2aW5nIE1DUzE0fjE1IGZyYW1lIGZyb20gc29tZSBBUC4KKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogCWllZWUKKyAqICAgCSAgICAgdTggKgkJCVBlZXJNYWNBZGRyCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIHJldHVybiAxIGlmIGRyaXZlciBzaG91bGQgZGVjbGFyZSBNQ1MxMyBvbmx5KG90aGVyd2lzZSByZXR1cm4gMCkKKyAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IEhUSU9UQWN0SXNEaXNhYmxlTUNTMTQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4KiBQZWVyTWFjQWRkcikKK3sKKwl1OCByZXQgPSAwOworCXJldHVybiByZXQ7CisgfQorCisKKy8qKgorKiBGdW5jdGlvbjoJSFRJT1RBY3RJc0Rpc2FibGVNQ1MxNQorKgorKiBPdmVydmlldzoJQ2hlY2sgd2hldGhlciBkcml2ZXIgc2hvdWxkIGRlY2xhcmUgY2FwYWJpbGl0eSBvZiByZWNldmluZyBNQ1MxNQorKgorKiBJbnB1dDoKKyoJCQlQQURBUFRFUgkJQWRhcHRlciwKKyoKKyogT3V0cHV0OgkJTm9uZQorKiBSZXR1cm46ICAgICAJdHJ1ZSBpZiBkcml2ZXIgc2hvdWxkIGRpc2FibGUgTUNTMTUKKyogMjAwOC4wNC4xNQlFbWlseQorKi8KK2Jvb2wgSFRJT1RBY3RJc0Rpc2FibGVNQ1MxNShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSkKK3sKKwlib29sIHJldFZhbHVlID0gZmFsc2U7CisKKyNpZmRlZiBUT0RPCisJLy8gQXBwbHkgZm9yIDgxOXUgb25seQorI2lmIChIQUxfQ09ERV9CQVNFPT1SVEw4MTkyKQorCisjaWYgKERFVl9CVVNfVFlQRSA9PSBVU0JfSU5URVJGQUNFKQorCS8vIEFsd2F5IGRpc2FibGUgTUNTMTUgYnkgSmVycnkgQ2hhbmcncyByZXF1ZXN0LmJ5IEVtaWx5LCAyMDA4LjA0LjE1CisJcmV0VmFsdWUgPSB0cnVlOworI2VsaWYgKERFVl9CVVNfVFlQRSA9PSBQQ0lfSU5URVJGQUNFKQorCS8vIEVuYWJsZSBNQ1MxNSBpZiB0aGUgcGVlciBpcyBDaXNjbyBBUC4gYnkgRW1pbHksIDIwMDguMDUuMTIKKy8vCWlmKHBCc3NEZXNjLT5iQ2lzY29DYXBFeGlzdCkKKy8vCQlyZXRWYWx1ZSA9IGZhbHNlOworLy8JZWxzZQorCQlyZXRWYWx1ZSA9IGZhbHNlOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCS8vIEplcnJ5IENoYW5nIHN1Z2dlc3QgdGhhdCA4MTkwIDF4MiBkb2VzIG5vdCBuZWVkIHRvIGRpc2FibGUgTUNTMTUKKworCXJldHVybiByZXRWYWx1ZTsKK30KKworLyoqCisqIEZ1bmN0aW9uOglIVElPVEFjdElzRGlzYWJsZU1DU1R3b1NwYXRpYWxTdHJlYW0KKyoKKyogT3ZlcnZpZXc6CUNoZWNrIHdoZXRoZXIgZHJpdmVyIHNob3VsZCBkZWNsYXJlIGNhcGFiaWxpdHkgb2YgcmVjZXZpbmcgQWxsIDIgc3MgcGFja2V0cworKgorKiBJbnB1dDoKKyoJCQlQQURBUFRFUgkJQWRhcHRlciwKKyoKKyogT3V0cHV0OgkJTm9uZQorKiBSZXR1cm46ICAgICAJdHJ1ZSBpZiBkcml2ZXIgc2hvdWxkIGRpc2FibGUgYWxsIHR3byBzcGF0aWFsIHN0cmVhbSBwYWNrZXQKKyogMjAwOC4wNC4yMQlFbWlseQorKi8KK2Jvb2wgSFRJT1RBY3RJc0Rpc2FibGVNQ1NUd29TcGF0aWFsU3RyZWFtKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCAqUGVlck1hY0FkZHIpCit7CisJYm9vbCByZXRWYWx1ZSA9IGZhbHNlOworCisjaWZkZWYgVE9ETworCS8vIEFwcGx5IGZvciA4MTl1IG9ubHkKKyNlbmRpZgorCXJldHVybiByZXRWYWx1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgQ2hlY2sgd2hldGhlciBkcml2ZXIgc2hvdWxkIGRpc2FibGUgRURDQSB0dXJibyBtb2RlCisgKiAgIGlucHV0OiAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIAlpZWVlCisgKiAgIAkgICAgIHU4KiAJCQlQZWVyTWFjQWRkcgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICByZXR1cm4gMSBpZiBkcml2ZXIgc2hvdWxkIGRpc2FibGUgRURDQSB0dXJibyBtb2RlKG90aGVyd2lzZSByZXR1cm4gMCkKKyAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IEhUSU9UQWN0SXNEaXNhYmxlRURDQVR1cmJvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiAJaWVlZSwgdTgqIFBlZXJNYWNBZGRyKQoreworCXU4CXJldFZhbHVlID0gZmFsc2U7CS8vIGRlZmF1bHQgZW5hYmxlIEVEQ0EgVHVyYm8gbW9kZS4KKwkvLyBTZXQgc3BlY2lmaWMgRURDQSBwYXJhbWV0ZXIgZm9yIGRpZmZlcmVudCBBUCBpbiBETSBoYW5kbGVyLgorCisJcmV0dXJuIHJldFZhbHVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBDaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gdXNlIE9GRE0gdG8gc25lZCBNR05UIGZyYW1lIGZvciBicm9hZGNvbSBBUAorICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yayAgIC8vY3VycmVudCBuZXR3b3JrIHdlIGxpdmUKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgcmV0dXJuIDEgaWYgdHJ1ZQorICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggSFRJT1RBY3RJc01nbnRVc2VDQ0s2TShzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCit7CisJdTgJcmV0VmFsdWUgPSAwOworCisJLy8gMjAwOC8wMS8yNSBNSCBKdWRlZyBpZiB3ZSBuZWVkIHRvIHVzZSBPRkRNIHRvIHNuZWQgTUdOVCBmcmFtZSBmb3IgYnJvYWRjb20gQVAuCisJLy8gMjAwOC8wMS8yOCBNSCBXZSBtdXN0IHByZXZlbnQgdGhhdCB3ZSBzZWxlY3QgbnVsbCBic3NpZCB0byBsaW5rLgorCisJaWYobmV0d29yay0+YnJvYWRjb21fY2FwX2V4aXN0KQorCXsKKwkJcmV0VmFsdWUgPSAxOworCX0KKworCXJldHVybiByZXRWYWx1ZTsKK30KKwordTggSFRJT1RBY3RJc0NDREZzeW5jKHU4KiBQZWVyTWFjQWRkcikKK3sKKwl1OAlyZXRWYWx1ZSA9IDA7CisJaWYoCShtZW1jbXAoUGVlck1hY0FkZHIsIFVOS05PV05fQk9SQURDT00sIDMpPT0wKSB8fAorCQkobWVtY21wKFBlZXJNYWNBZGRyLCBMSU5LU1lTV1JUMzMwX0xJTktTWVNXUlQzMDBfQlJPQURDT00sIDMpPT0wKSB8fAorCQkobWVtY21wKFBlZXJNYWNBZGRyLCBMSU5LU1lTV1JUMzUwX0xJTktTWVNXUlQxNTBfQlJPQURDT00sIDMpID09MCkpCisJeworCQlyZXRWYWx1ZSA9IDE7CisJfQorCisJcmV0dXJuIHJldFZhbHVlOworfQorCit2b2lkIEhUUmVzZXRJT1RTZXR0aW5nKAorCVBSVF9ISUdIX1RIUk9VR0hQVVQJCXBIVEluZm8KKykKK3sKKwlwSFRJbmZvLT5JT1RBY3Rpb24gPSAwOworCXBIVEluZm8tPklPVFBlZXIgPSBIVF9JT1RfUEVFUl9VTktOT1dOOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIENvbnN0cnVjdCBDYXBhYmxpbGl0eSBFbGVtZW50IGluIEJlYWNvbi4uLiBpZiBIVEVuYWJsZSBpcyB0dXJuZWQgb24KKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogCWllZWUKKyAqICAgCSAgICAgdTgqIAkJCXBvc0hUQ2FwIC8vcG9pbnRlciB0byBzdG9yZSBDYXBhYmlsaXR5IEVsZQorICogICAJICAgICB1OCoJCQlsZW4gLy9zdG9yZSBsZW5ndGggb2YgQ0UKKyAqICAgCSAgICAgdTgJCQkJSXNFbmNyeXB0IC8vd2hldGhlciBlbmNyeXB0LCBuZWVkZWQgZnVydGhlcgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiAgcG9zSFRDYXAgY2FuJ3QgYmUgbnVsbCBhbmQgc2hvdWxkIGJlIGluaXRpYWxpemVkIGJlZm9yZS4KKyAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSFRDb25zdHJ1Y3RDYXBhYmlsaXR5RWxlbWVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIHBvc0hUQ2FwLCB1OCogbGVuLCB1OCBJc0VuY3J5cHQpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFQgPSBpZWVlLT5wSFRJbmZvOworCVBIVF9DQVBBQklMSVRZX0VMRSAJcENhcEVMRSA9IE5VTEw7CisJLy91OCBiSXNEZWNsYXJlTUNTMTM7CisKKwlpZiAoKHBvc0hUQ2FwID09IE5VTEwpIHx8IChwSFQgPT0gTlVMTCkpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgInBvc0hUQ2FwIG9yIHBIVEluZm8gY2FuJ3QgYmUgbnVsbCBpbiBIVENvbnN0cnVjdENhcGFiaWxpdHlFbGVtZW50KClcbiIpOworCQlyZXR1cm47CisJfQorCW1lbXNldChwb3NIVENhcCwgMCwgKmxlbik7CisJaWYocEhULT5lUGVlckhUU3BlY1ZlciA9PSBIVF9TUEVDX1ZFUl9FV0MpCisJeworCQl1OAlFV0MxMU5IVENhcFtdID0gezB4MDAsIDB4OTAsIDB4NGMsIDB4MzN9OwkvLyBGb3IgMTFuIEVXQyBkZWZpbml0aW9uLCAyMDA3LjA3LjE3LCBieSBFbWlseQorCQltZW1jcHkocG9zSFRDYXAsIEVXQzExTkhUQ2FwLCBzaXplb2YoRVdDMTFOSFRDYXApKTsKKwkJcENhcEVMRSA9IChQSFRfQ0FQQUJJTElUWV9FTEUpJihwb3NIVENhcFs0XSk7CisJfWVsc2UKKwl7CisJCXBDYXBFTEUgPSAoUEhUX0NBUEFCSUxJVFlfRUxFKXBvc0hUQ2FwOworCX0KKworCisJLy9IVCBjYXBhYmlsaXR5IGluZm8KKwlwQ2FwRUxFLT5BZHZDb2RpbmcgCQk9IDA7IC8vIFRoaXMgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIG5vdyEhCisJaWYoaWVlZS0+R2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcihpZWVlLT5kZXYpKQorCXsKKwkJcENhcEVMRS0+Q2hsV2lkdGggPSAwOworCX0KKwllbHNlCisJeworCQlwQ2FwRUxFLT5DaGxXaWR0aCA9IChwSFQtPmJSZWdCVzQwTUh6PzE6MCk7CisJfQorCisvLwlwQ2FwRUxFLT5DaGxXaWR0aCAJCT0gKHBIVC0+YlJlZ0JXNDBNSHo/MTowKTsKKwlwQ2FwRUxFLT5NaW1vUHdyU2F2ZSAJCT0gcEhULT5TZWxmTWltb1BzOworCXBDYXBFTEUtPkdyZWVuRmllbGQJCT0gMDsgLy8gVGhpcyBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgbm93ISEKKwlwQ2FwRUxFLT5TaG9ydEdJMjBNaHoJCT0gMTsgLy8gV2UgY2FuIHJlY2VpdmUgU2hvcnQgR0khIQorCXBDYXBFTEUtPlNob3J0R0k0ME1oegkJPSAxOyAvLyBXZSBjYW4gcmVjZWl2ZSBTaG9ydCBHSSEhCisJLy9EYmdQcmludCgiVFggSFQgY2FwL2luZm8gZWxlIEJXPSVkIFNHMjA9JWQgU0c0MD0lZFxuXHIiLAorCQkvL3BDYXBFTEUtPkNobFdpZHRoLCBwQ2FwRUxFLT5TaG9ydEdJMjBNaHosIHBDYXBFTEUtPlNob3J0R0k0ME1oeik7CisJcENhcEVMRS0+VHhTVEJDIAkJPSAxOworCXBDYXBFTEUtPlJ4U1RCQyAJCT0gMDsKKwlwQ2FwRUxFLT5EZWxheUJBCQk9IDA7CS8vIERvIG5vdCBzdXBwb3J0IG5vdyEhCisJcENhcEVMRS0+TWF4QU1TRFVTaXplCT0gKE1BWF9SRUNFSVZFX0JVRkZFUl9TSVpFPj03OTM1KT8xOjA7CisJcENhcEVMRS0+RHNzQ0NrIAkJPSAoKHBIVC0+YlJlZ0JXNDBNSHopPyhwSFQtPmJSZWdTdXBwQ0NLPzE6MCk6MCk7CisJcENhcEVMRS0+UFNNUAkJCT0gMDsgLy8gRG8gbm90IHN1cHBvcnQgbm93ISEKKwlwQ2FwRUxFLT5MU2lnVHhvcFByb3RlY3QJPSAwOyAvLyBEbyBub3Qgc3VwcG9ydCBub3chIQorCisKKwkvL01BQyBIVCBwYXJhbWV0ZXJzIGluZm8KKwkvLyBUT0RPOiBOZWRkIHRvIHRha2UgY2FyZSBvZiB0aGlzIHBhcnQKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiVFggSFQgY2FwL2luZm8gZWxlIEJXPSVkIE1heEFNU0RVU2l6ZTolZCBEc3NDQ2s6JWRcbiIsIHBDYXBFTEUtPkNobFdpZHRoLCBwQ2FwRUxFLT5NYXhBTVNEVVNpemUsIHBDYXBFTEUtPkRzc0NDayk7CisKKwlpZiggSXNFbmNyeXB0KQorCXsKKwkJcENhcEVMRS0+TVBEVURlbnNpdHkgCT0gNzsgLy8gOHVzCisJCXBDYXBFTEUtPk1heFJ4QU1QRFVGYWN0b3IgCT0gMjsgLy8gMiBpcyBmb3IgMzIgSyBhbmQgMyBpcyA2NEsKKwl9CisJZWxzZQorCXsKKwkJcENhcEVMRS0+TWF4UnhBTVBEVUZhY3RvciAJPSAzOyAvLyAyIGlzIGZvciAzMiBLIGFuZCAzIGlzIDY0SworCQlwQ2FwRUxFLT5NUERVRGVuc2l0eSAJPSAwOyAvLyBubyBkZW5zaXR5CisJfQorCisJLy9TdXBwb3J0ZWQgTUNTIHNldAorCW1lbWNweShwQ2FwRUxFLT5NQ1MsIGllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIDE2KTsKKwlpZihwSFQtPklPVEFjdGlvbiAmIEhUX0lPVF9BQ1RfRElTQUJMRV9NQ1MxNSkKKwkJcENhcEVMRS0+TUNTWzFdICY9IDB4N2Y7CisKKwlpZihwSFQtPklPVEFjdGlvbiAmIEhUX0lPVF9BQ1RfRElTQUJMRV9NQ1MxNCkKKwkJcENhcEVMRS0+TUNTWzFdICY9IDB4YmY7CisKKwlpZihwSFQtPklPVEFjdGlvbiAmIEhUX0lPVF9BQ1RfRElTQUJMRV9BTExfMlNTKQorCQlwQ2FwRUxFLT5NQ1NbMV0gJj0gMHgwMDsKKworCS8vIDIwMDguMDYuMTIKKwkvLyBGb3IgUlRMODE5WCwgaWYgcGFpcndpc2VrZXkgPSB3ZXAvdGtpcCwgYXAgaXMgcmFsaW5rLCB3ZSBzdXBwb3J0IG9ubHkgTUNTMH43LgorCWlmKGllZWUtPkdldEhhbGZObW9kZVN1cHBvcnRCeUFQc0hhbmRsZXIoaWVlZS0+ZGV2KSkKKwl7CisJCWludCBpOworCQlmb3IoaSA9IDE7IGk8IDE2OyBpKyspCisJCQlwQ2FwRUxFLT5NQ1NbaV0gPSAwOworCX0KKworCS8vRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvCisJbWVtc2V0KCZwQ2FwRUxFLT5FeHRIVENhcEluZm8sIDAsIDIpOworCisKKwkvL1RYQkYgQ2FwYWJpbGl0aWVzCisJbWVtc2V0KHBDYXBFTEUtPlR4QkZDYXAsIDAsIDQpOworCisJLy9BbnRlbm5hIFNlbGVjdGlvbiBDYXBhYmlsaXRpZXMKKwlwQ2FwRUxFLT5BU0NhcCA9IDA7CisvL2FkZCAyIHRvIGdpdmUgc3BhY2UgZm9yIGVsZW1lbnQgSUQgYW5kIGxlbiB3aGVuIGNvbnN0cnVjdCBmcmFtZXMKKwlpZihwSFQtPmVQZWVySFRTcGVjVmVyID09IEhUX1NQRUNfVkVSX0VXQykKKwkJKmxlbiA9IDMwICsgMjsKKwllbHNlCisJCSpsZW4gPSAyNiArIDI7CisKKworCisvLwlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQSB8IElFRUU4MDIxMV9ETF9IVCwgcG9zSFRDYXAsICpsZW4gLTIpOworCisJLy9QcmludCBlYWNoIGZpZWxkIGluIGRldGFpbC4gRHJpdmVyIHNob3VsZCBub3QgcHJpbnQgb3V0IHRoaXMgbWVzc2FnZSBieSBkZWZhdWx0CisvLwlIVERlYnVnSFRDYXBhYmlsaXR5KHBvc0hUQ2FwLCAodTgqKSJIVENvbnN0cnVjdENhcGFiaWxpdHkoKSIpOworCXJldHVybjsKKworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgQ29uc3RydWN0ICBJbmZvcm1hdGlvbiBFbGVtZW50IGluIEJlYWNvbi4uLiBpZiBIVEVuYWJsZSBpcyB0dXJuZWQgb24KKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogCWllZWUKKyAqICAgCSAgICAgdTgqIAkJCXBvc0hUQ2FwIC8vcG9pbnRlciB0byBzdG9yZSBJbmZvcm1hdGlvbiBFbGUKKyAqICAgCSAgICAgdTgqCQkJbGVuICAgLy9zdG9yZSBsZW4gb2YKKyAqICAgCSAgICAgdTgJCQkJSXNFbmNyeXB0IC8vd2hldGhlciBlbmNyeXB0LCBuZWVkZWQgZnVydGhlcgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiAgcG9zSFRDYXAgY2FuJ3QgYmUgbnVsbCBhbmQgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlLiBvbmx5IEFQIGFuZCBJQlNTIHN0YSBzaG91bGQgZG8gdGhpcworICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIVENvbnN0cnVjdEluZm9FbGVtZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcG9zSFRJbmZvLCB1OCogbGVuLCB1OCBJc0VuY3J5cHQpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFQgPSBpZWVlLT5wSFRJbmZvOworCVBIVF9JTkZPUk1BVElPTl9FTEUJCXBIVEluZm9FbGUgPSAoUEhUX0lORk9STUFUSU9OX0VMRSlwb3NIVEluZm87CisJaWYgKChwb3NIVEluZm8gPT0gTlVMTCkgfHwgKHBIVEluZm9FbGUgPT0gTlVMTCkpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgInBvc0hUSW5mbyBvciBwSFRJbmZvRWxlIGNhbid0IGJlIG51bGwgaW4gSFRDb25zdHJ1Y3RJbmZvRWxlbWVudCgpXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW1lbXNldChwb3NIVEluZm8sIDAsICpsZW4pOworCWlmICggKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgfHwgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpKSAvL2FwIG1vZGUgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKwl7CisJCXBIVEluZm9FbGUtPkNvbnRyb2xDaGwgCQkJPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbDsKKwkJcEhUSW5mb0VsZS0+RXh0Q2hsT2Zmc2V0IAkJCT0gKChwSFQtPmJSZWdCVzQwTUh6ID09IGZhbHNlKT9IVF9FWFRDSE5MX09GRlNFVF9OT19FWFQ6CisJCQkJCQkJCQkJCShpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbDw9Nik/CisJCQkJCQkJCQkJCQlIVF9FWFRDSE5MX09GRlNFVF9VUFBFUjpIVF9FWFRDSE5MX09GRlNFVF9MT1dFUik7CisJCXBIVEluZm9FbGUtPlJlY29tbWVtZGVkVHhXaWR0aAk9IHBIVC0+YlJlZ0JXNDBNSHo7CisJCXBIVEluZm9FbGUtPlJJRlMgCQkJCQk9IDA7CisJCXBIVEluZm9FbGUtPlBTTVBBY2Nlc3NPbmx5CQk9IDA7CisJCXBIVEluZm9FbGUtPlNydkludEdyYW51bGFyaXR5CQk9IDA7CisJCXBIVEluZm9FbGUtPk9wdE1vZGUJCQkJPSBwSFQtPkN1cnJlbnRPcE1vZGU7CisJCXBIVEluZm9FbGUtPk5vbkdGRGV2UHJlc2VudAkJPSAwOworCQlwSFRJbmZvRWxlLT5EdWFsQmVhY29uCQkJPSAwOworCQlwSFRJbmZvRWxlLT5TZWNvbmRhcnlCZWFjb24JCT0gMDsKKwkJcEhUSW5mb0VsZS0+TFNpZ1R4b3BQcm90ZWN0RnVsbAkJPSAwOworCQlwSFRJbmZvRWxlLT5QY29BY3RpdmUJCQkJPSAwOworCQlwSFRJbmZvRWxlLT5QY29QaGFzZQkJCQk9IDA7CisKKwkJbWVtc2V0KHBIVEluZm9FbGUtPkJhc2ljTVNDLCAwLCAxNik7CisKKworCQkqbGVuID0gMjIgKyAyOyAvL3NhbWUgYWJvdmUKKworCX0KKwllbHNlCisJeworCQkvL1NUQSBzaG91bGQgbm90IGdlbmVyYXRlIEhpZ2ggVGhyb3VnaHB1dCBJbmZvcm1hdGlvbiBFbGVtZW50CisJCSpsZW4gPSAwOworCX0KKwkvL0lFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBIHwgSUVFRTgwMjExX0RMX0hULCBwb3NIVEluZm8sICpsZW4gLSAyKTsKKwkvL0hURGVidWdIVEluZm8ocG9zSFRJbmZvLCAiSFRDb25zdHJ1Y3RJbmZvckVsZW1lbnQiKTsKKwlyZXR1cm47Cit9CisKKy8qCisgICogIEFjY29yZGluZyB0byBleHBlcmltZW50LCBSZWFsdGVrIEFQIHRvIFNUQSAoYmFzZWQgb24gcnRsODE5MCkgbWF5IGFjaGlldmUgYmVzdCBwZXJmb3JtYW5jZQorICAqICBpZiBib3RoIFNUQSBhbmQgQVAgc2V0IGxpbWl0YXRpb24gb2YgYWdncmVnYXRpb24gc2l6ZSB0byAzMkssIHRoYXQgaXMsIHNldCBBTVBEVSBkZW5zaXR5IHRvIDIKKyAgKiAgKFJlZjogSUVFRSAxMW4gc3BlY2lmaWNhdGlvbikuIEhvd2V2ZXIsIGlmIFJlYWx0ZWsgU1RBIGFzc29jaWF0ZXMgdG8gb3RoZXIgQVAsIFNUQSBzaG91bGQgc2V0CisgICogIGxpbWl0YXRpb24gb2YgYWdncmVnYXRpb24gc2l6ZSB0byA4Sywgb3RoZXJ3aXNlLCBwZXJmb3JtYW5jZSBvZiB0cmFmZmljIHN0cmVhbSBmcm9tIFNUQSB0byBBUAorICAqICB3aWxsIGJlIG11Y2ggbGVzcyB0aGFuIHRoZSB0cmFmZmljIHN0cmVhbSBmcm9tIEFQIHRvIFNUQSBpZiBib3RoIG9mIHRoZSBzdHJlYW0gcnVucyBjb25jdXJyZW50bHkKKyAgKiAgYXQgdGhlIHNhbWUgdGltZS4KKyAgKgorICAqICBGcmFtZSBGb3JtYXQKKyAgKiAgRWxlbWVudCBJRAkJTGVuZ3RoCQlPVUkJCQlUeXBlMQkJUmVzZXJ2ZWQKKyAgKiAgMSBieXRlCQkJMSBieXRlCQkzIGJ5dGVzCQkxIGJ5dGUJCTEgYnl0ZQorICAqCisgICogIE9VSSAJCT0gMHgwMCwgMHhlMCwgMHg0YywKKyAgKiAgVHlwZSAJPSAweDAyCisgICogIFJlc2VydmVkIAk9IDB4MDAKKyAgKgorICAqICAyMDA3LjguMjEgYnkgRW1pbHkKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBDb25zdHJ1Y3QgIEluZm9ybWF0aW9uIEVsZW1lbnQgaW4gQmVhY29uLi4uIGluIFJUMlJUIGNvbmRpdGlvbgorICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiAJaWVlZQorICogICAJICAgICB1OCogCQkJcG9zUlQyUlRBZ2cgLy9wb2ludGVyIHRvIHN0b3JlIEluZm9ybWF0aW9uIEVsZQorICogICAJICAgICB1OCoJCQlsZW4gICAvL3N0b3JlIGxlbgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOgorICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIVENvbnN0cnVjdFJUMlJUQWdnRWxlbWVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIHBvc1JUMlJUQWdnLCB1OCogbGVuKQoreworCWlmIChwb3NSVDJSVEFnZyA9PSBOVUxMKSB7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAicG9zUlQyUlRBZ2cgY2FuJ3QgYmUgbnVsbCBpbiBIVENvbnN0cnVjdFJUMlJUQWdnRWxlbWVudCgpXG4iKTsKKwkJcmV0dXJuOworCX0KKwltZW1zZXQocG9zUlQyUlRBZ2csIDAsICpsZW4pOworCSpwb3NSVDJSVEFnZysrID0gMHgwMDsKKwkqcG9zUlQyUlRBZ2crKyA9IDB4ZTA7CisJKnBvc1JUMlJUQWdnKysgPSAweDRjOworCSpwb3NSVDJSVEFnZysrID0gMHgwMjsKKwkqcG9zUlQyUlRBZ2crKyA9IDB4MDE7CisJKnBvc1JUMlJUQWdnID0gMHgxMDsvLypwb3NSVDJSVEFnZyA9IDB4MDI7CisKKwlpZihpZWVlLT5iU3VwcG9ydFJlbW90ZVdha2VVcCkgeworCQkqcG9zUlQyUlRBZ2cgfD0gMHgwODsvL1JUX0hUX0NBUF9VU0VfV09XOworCX0KKworCSpsZW4gPSA2ICsgMjsKKwlyZXR1cm47CisjaWZkZWYgVE9ETworI2lmIChIQUxfQ09ERV9CQVNFID09IFJUTDgxOTIgJiYgREVWX0JVU19UWVBFID09IFVTQl9JTlRFUkZBQ0UpCisJLyoKKwkvL0VtaWx5LiBJZiBpdCBpcyByZXF1aXJlZCB0byBBc2sgUmVhbHRlayBBUCB0byBzZW5kIEFNUERVIGR1cmluZyBBRVMgbW9kZSwgZW5hYmxlIHRoaXMKKwkgICBzZWN0aW9uIG9mIGNvZGUuCisJaWYoSVNfVU5ERVJfMTFOX0FFU19NT0RFKEFkYXB0ZXIpKQorCXsKKwkJcG9zUlQyUlRBZ2ctPk9jdGV0WzVdIHw9UlRfSFRfQ0FQX1VTRV9BTVBEVTsKKwl9ZWxzZQorCXsKKwkJcG9zUlQyUlRBZ2ctPk9jdGV0WzVdICY9IDB4ZmI7CisJfQorCSovCisKKyNlbHNlCisJLy8gRG8gTm90aGluZworI2VuZGlmCisKKwlwb3NSVDJSVEFnZy0+TGVuZ3RoID0gNjsKKyNlbmRpZgorCisKKworCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgUGljayB0aGUgcmlnaHQgUmF0ZSBBZGFwdGl2ZSB0YWJsZSB0byB1c2UKKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogCWllZWUKKyAqICAgCSAgICAgdTgqIAkJCXBPcGVyYXRlTUNTIC8vQSBwb2ludGVyIHRvIE1DUyByYXRlIGJpdG1hcAorICogIHJldHVybjogIGFsd2F5cyB3ZSByZXR1cm4gdHJ1ZQorICogIG5vdGljZToKKyAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IEhUX1BpY2tNQ1NSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcE9wZXJhdGVNQ1MpCit7CisJdTgJCQkJCWk7CisJaWYgKHBPcGVyYXRlTUNTID09IE5VTEwpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgInBPcGVyYXRlTUNTIGNhbid0IGJlIG51bGwgaW4gSFRfUGlja01DU1JhdGUoKVxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlzd2l0Y2goaWVlZS0+bW9kZSkKKwl7CisJY2FzZSBJRUVFX0E6CisJY2FzZSBJRUVFX0I6CisJY2FzZSBJRUVFX0c6CisJCQkvL2xlZ2FjeSByYXRlIHJvdXRpbmUgaGFuZGxlZCBhdCBzZWxlY3RlZHJhdGUKKworCQkJLy9ubyBNQ1MgcmF0ZQorCQkJZm9yKGk9MDtpPD0xNTtpKyspeworCQkJCXBPcGVyYXRlTUNTW2ldID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCisJY2FzZSBJRUVFX05fMjRHOgkvL2Fzc3VtZSBDQ0sgcmF0ZSBvaworCWNhc2UgSUVFRV9OXzVHOgorCQkJLy8gTGVnYWN5IHBhcnQgd2Ugb25seSB1c2UgNiwgNS41LDIsMSBmb3IgTl8yNEcgYW5kIDYgZm9yIE5fNUcuCisJCQkvLyBMZWdhY3kgcGFydCBzaGFsbCBiZSBoYW5kbGVkIGF0IFNlbGVjdFJhdGVTZXQoKS4KKworCQkJLy9IVCBwYXJ0CisJCQkvLyBUT0RPOiBtYXkgYmUgZGlmZmVyZW50IGlmIHdlIGhhdmUgZGlmZmVyZW50IG51bWJlciBvZiBhbnRlbm5hCisJCQlwT3BlcmF0ZU1DU1swXSAmPVJBVEVfQURQVF8xU1NfTUFTSzsJLy9zdXBwb3J0IE1DUyAwfjcKKwkJCXBPcGVyYXRlTUNTWzFdICY9UkFURV9BRFBUXzJTU19NQVNLOworCQkJcE9wZXJhdGVNQ1NbM10gJj1SQVRFX0FEUFRfTUNTMzJfTUFTSzsKKwkJCWJyZWFrOworCisJLy9zaG91bGQgbmV2ZXIgcmVhY2ggaGVyZQorCWRlZmF1bHQ6CisKKwkJCWJyZWFrOworCisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisqCURlc2NyaXB0aW9uOgorKgkJVGhpcyBmdW5jdGlvbiB3aWxsIGdldCB0aGUgaGlnaGVzdCBzcGVlZCByYXRlIGluIGlucHV0IE1DUyBzZXQuCisqCisqCS9wYXJhbSAJQWRhcHRlcgkJCVBpb250ZXIgdG8gQWRhcHRlciBlbnRpdHkKKyoJCQlwTUNTUmF0ZVNldAkJUG9pbnRlciB0byBNQ1MgcmF0ZSBiaXRtYXAKKyoJCQlwTUNTRmlsdGVyCQlQb2ludGVyIHRvIE1DUyByYXRlIGZpbHRlcgorKgorKgkvcmV0dXJuCUhpZ2hlc3QgTUNTIHJhdGUgaW5jbHVkZWQgaW4gcE1DU1JhdGVTZXQgYW5kIGZpbHRlcmVkIGJ5IHBNQ1NGaWx0ZXIuCisqCisqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiB3aWxsIGdldCB0aGUgaGlnaGVzdCBzcGVlZCByYXRlIGluIGlucHV0IE1DUyBzZXQuCisgKiAgIGlucHV0OiAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIAlpZWVlCisgKiAgIAkgICAgIHU4KiAJCQlwTUNTUmF0ZVNldCAvL1BvaW50ZXIgdG8gTUNTIHJhdGUgYml0bWFwCisgKiAgIAkgICAgIHU4KgkJCXBNQ1NGaWx0ZXIgLy9Qb2ludGVyIHRvIE1DUyByYXRlIGZpbHRlcgorICogIHJldHVybjogIEhpZ2hlc3QgTUNTIHJhdGUgaW5jbHVkZWQgaW4gcE1DU1JhdGVTZXQgYW5kIGZpbHRlcmVkIGJ5IHBNQ1NGaWx0ZXIKKyAqICBub3RpY2U6CisgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBIVEdldEhpZ2hlc3RNQ1NSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcE1DU1JhdGVTZXQsIHU4KiBwTUNTRmlsdGVyKQoreworCXU4CQlpLCBqOworCXU4CQliaXRNYXA7CisJdTgJCW1jc1JhdGUgPSAwOworCXU4CQlhdmFpbGFibGVNY3NSYXRlWzE2XTsKKwlpZiAocE1DU1JhdGVTZXQgPT0gTlVMTCB8fCBwTUNTRmlsdGVyID09IE5VTEwpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgInBNQ1NSYXRlU2V0IG9yIHBNQ1NGaWx0ZXIgY2FuJ3QgYmUgbnVsbCBpbiBIVEdldEhpZ2hlc3RNQ1NSYXRlKClcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCWZvcihpPTA7IGk8MTY7IGkrKykKKwkJYXZhaWxhYmxlTWNzUmF0ZVtpXSA9IHBNQ1NSYXRlU2V0W2ldICYgcE1DU0ZpbHRlcltpXTsKKworCWZvcihpID0gMDsgaSA8IDE2OyBpKyspCisJeworCQlpZihhdmFpbGFibGVNY3NSYXRlW2ldICE9IDApCisJCQlicmVhazsKKwl9CisJaWYoaSA9PSAxNikKKwkJcmV0dXJuIGZhbHNlOworCisJZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKKwl7CisJCWlmKGF2YWlsYWJsZU1jc1JhdGVbaV0gIT0gMCkKKwkJeworCQkJYml0TWFwID0gYXZhaWxhYmxlTWNzUmF0ZVtpXTsKKwkJCWZvcihqID0gMDsgaiA8IDg7IGorKykKKwkJCXsKKwkJCQlpZigoYml0TWFwJTIpICE9IDApCisJCQkJeworCQkJCQlpZihIVE1jc1RvRGF0YVJhdGUoaWVlZSwgKDgqaStqKSkgPiBIVE1jc1RvRGF0YVJhdGUoaWVlZSwgbWNzUmF0ZSkpCisJCQkJCQltY3NSYXRlID0gKDgqaStqKTsKKwkJCQl9CisJCQkJYml0TWFwID0gYml0TWFwPj4xOworCQkJfQorCQl9CisJfQorCXJldHVybiAobWNzUmF0ZXwweDgwKTsKK30KKworCisKKy8qCisqKgorKioxLkZpbHRlciBvdXIgb3BlcmF0aW9uIHJhdGUgc2V0IHdpdGggQVAncyByYXRlIHNldAorKioyLnNoYWxsIHJlZmVyZW5jZSBjaGFubmVsIGJhbmR3aWR0aCwgU1RCQywgQW50ZW5uYSBudW1iZXIKKyoqMy5nZW5lcmF0ZSByYXRlIGFkYXRpdmUgdGFibGUgZm9yIGZpcm13YXJlCisqKkRhdmlkIDIwMDYwOTA2CisqKgorKiogXHBIVFN1cHBvcnRlZENhcDogdGhlIGNvbm5lY3RlZCBTVEEncyBzdXBwb3J0ZWQgcmF0ZSBDYXBhYmlsaXR5IGVsZW1lbnQKKyovCit1OCBIVEZpbHRlck1DU1JhdGUoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcFN1cHBvcnRNQ1MsIHU4KiBwT3BlcmF0ZU1DUykKK3sKKworCXU4IGk9MDsKKworCS8vIGZpbHRlciBvdXQgb3BlcmF0aW9uYWwgcmF0ZSBzZXQgbm90IHN1cHBvcnRlZCBieSBBUCwgdGhlIGxlbnRoIG9mIGl0IGlzIDE2CisJZm9yKGk9MDtpPD0xNTtpKyspeworCQlwT3BlcmF0ZU1DU1tpXSA9IGllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXRbaV0mcFN1cHBvcnRNQ1NbaV07CisJfQorCisKKwkvLyBUT0RPOiBhZGp1c3Qgb3VyIG9wZXJhdGlvbmFsIHJhdGUgc2V0ICBhY2NvcmRpbmcgdG8gb3VyIGNoYW5uZWwgYmFuZHdpZHRoLCBTVEJDIGFuZCBBbnRlbm5hIG51bWJlcgorCisJLy8gVE9ETzogZmlsbCBzdWdnZXN0ZWQgcmF0ZSBhZGFwdGl2ZSByYXRlIGluZGV4IGFuZCBnaXZlIGZpcm13YXJlIGluZm8gdXNpbmcgVHggY29tbWFuZCBwYWNrZXQKKwkvLyB3ZSBhbHNvIHNoYWxsIHN1Z2dlc3RlZCB0aGUgZmlyc3Qgc3RhcnQgcmF0ZSBzZXQgYWNjb3JkaW5nIHRvIG91ciBzaW5nYWwgc3RyZW5ndGgKKwlIVF9QaWNrTUNTUmF0ZShpZWVlLCBwT3BlcmF0ZU1DUyk7CisKKwkvLyBGb3IgUlRMODE5WCwgaWYgcGFpcndpc2VrZXkgPSB3ZXAvdGtpcCwgd2Ugc3VwcG9ydCBvbmx5IE1DUzB+Ny4KKwlpZihpZWVlLT5HZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyKGllZWUtPmRldikpCisJCXBPcGVyYXRlTUNTWzFdID0gMDsKKworCS8vCisJLy8gRm9yIFJUTDgxOVgsIHdlIHN1cHBvcnQgb25seSBNQ1MwfjE1LgorCS8vIEFuZCBhbHNvLCB3ZSBkbyBub3Qga25vdyBob3cgdG8gdXNlIE1DUzMyIG5vdy4KKwkvLworCWZvcihpPTI7IGk8PTE1OyBpKyspCisJCXBPcGVyYXRlTUNTW2ldID0gMDsKKworCXJldHVybiB0cnVlOworfQordm9pZCBIVFNldENvbm5lY3RCd01vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIEhUX0NIQU5ORUxfV0lEVEgJQmFuZHdpZHRoLCBIVF9FWFRDSE5MX09GRlNFVAlPZmZzZXQpOwordm9pZCBIVE9uQXNzb2NSc3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwlQSFRfQ0FQQUJJTElUWV9FTEUJCXBQZWVySFRDYXAgPSBOVUxMOworCVBIVF9JTkZPUk1BVElPTl9FTEUJCXBQZWVySFRJbmZvID0gTlVMTDsKKwl1MTYJbk1heEFNU0RVU2l6ZSA9IDA7CisJdTgqCXBNY3NGaWx0ZXIgPSBOVUxMOworCisJc3RhdGljIHU4CQkJCUVXQzExTkhUQ2FwW10gPSB7MHgwMCwgMHg5MCwgMHg0YywgMHgzM307CQkvLyBGb3IgMTFuIEVXQyBkZWZpbml0aW9uLCAyMDA3LjA3LjE3LCBieSBFbWlseQorCXN0YXRpYyB1OAkJCQlFV0MxMU5IVEluZm9bXSA9IHsweDAwLCAweDkwLCAweDRjLCAweDM0fTsJLy8gRm9yIDExbiBFV0MgZGVmaW5pdGlvbiwgMjAwNy4wNy4xNywgYnkgRW1pbHkKKworCWlmKCBwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9PSBmYWxzZSApCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIjw9PT0gSFRPbkFzc29jUnNwKCk6IEhUX0RJU0FCTEVcbiIpOworCQlyZXR1cm47CisJfQorCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICI9PT0+IEhUT25Bc3NvY1JzcF93cSgpOiBIVF9FTkFCTEVcbiIpOworLy8JSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEEsIHBIVEluZm8tPlBlZXJIVENhcEJ1Ziwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfRUxFKSk7CisvLwlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQSwgcEhUSW5mby0+UGVlckhUSW5mb0J1Ziwgc2l6ZW9mKEhUX0lORk9STUFUSU9OX0VMRSkpOworCisvLwlIVERlYnVnSFRDYXBhYmlsaXR5KHBIVEluZm8tPlBlZXJIVENhcEJ1ZiwiSFRPbkFzc29jUnNwX3dxIik7CisvLwlIVERlYnVnSFRJbmZvKHBIVEluZm8tPlBlZXJIVEluZm9CdWYsIkhUT25Bc3NvY1JzcF93cSIpOworCS8vCisJaWYoIW1lbWNtcChwSFRJbmZvLT5QZWVySFRDYXBCdWYsRVdDMTFOSFRDYXAsIHNpemVvZihFV0MxMU5IVENhcCkpKQorCQlwUGVlckhUQ2FwID0gKFBIVF9DQVBBQklMSVRZX0VMRSkoJnBIVEluZm8tPlBlZXJIVENhcEJ1Zls0XSk7CisJZWxzZQorCQlwUGVlckhUQ2FwID0gKFBIVF9DQVBBQklMSVRZX0VMRSkocEhUSW5mby0+UGVlckhUQ2FwQnVmKTsKKworCWlmKCFtZW1jbXAocEhUSW5mby0+UGVlckhUSW5mb0J1ZiwgRVdDMTFOSFRJbmZvLCBzaXplb2YoRVdDMTFOSFRJbmZvKSkpCisJCXBQZWVySFRJbmZvID0gKFBIVF9JTkZPUk1BVElPTl9FTEUpKCZwSFRJbmZvLT5QZWVySFRJbmZvQnVmWzRdKTsKKwllbHNlCisJCXBQZWVySFRJbmZvID0gKFBIVF9JTkZPUk1BVElPTl9FTEUpKHBIVEluZm8tPlBlZXJIVEluZm9CdWYpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENvbmZpZ3VyYXRpb25zOgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEF8SUVFRTgwMjExX0RMX0hULCBwUGVlckhUQ2FwLCBzaXplb2YoSFRfQ0FQQUJJTElUWV9FTEUpKTsKKy8vCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBfElFRUU4MDIxMV9ETF9IVCwgcFBlZXJIVEluZm8sIHNpemVvZihIVF9JTkZPUk1BVElPTl9FTEUpKTsKKwkvLyBDb25maWcgU3VwcG9ydGVkIENoYW5uZWwgV2lkdGggc2V0dGluZworCS8vCisJSFRTZXRDb25uZWN0QndNb2RlKGllZWUsIChIVF9DSEFOTkVMX1dJRFRIKShwUGVlckhUQ2FwLT5DaGxXaWR0aCksIChIVF9FWFRDSE5MX09GRlNFVCkocFBlZXJIVEluZm8tPkV4dENobE9mZnNldCkpOworCisvLwlpZihwSFRJbmZvLT5iQ3VyQlc0ME1IeiA9PSB0cnVlKQorCQlwSFRJbmZvLT5iQ3VyVHhCVzQwTUh6ID0gKChwUGVlckhUSW5mby0+UmVjb21tZW1kZWRUeFdpZHRoID09IDEpP3RydWU6ZmFsc2UpOworCisJLy8KKwkvLyBVcGRhdGUgc2hvcnQgR0kvIGxvbmcgR0kgc2V0dGluZworCS8vCisJLy8gVE9ETzoKKwlwSFRJbmZvLT5iQ3VyU2hvcnRHSTIwTUh6PQorCQkoKHBIVEluZm8tPmJSZWdTaG9ydEdJMjBNSHopPygocFBlZXJIVENhcC0+U2hvcnRHSTIwTWh6PT0xKT90cnVlOmZhbHNlKTpmYWxzZSk7CisJcEhUSW5mby0+YkN1clNob3J0R0k0ME1Iej0KKwkJKChwSFRJbmZvLT5iUmVnU2hvcnRHSTQwTUh6KT8oKHBQZWVySFRDYXAtPlNob3J0R0k0ME1oej09MSk/dHJ1ZTpmYWxzZSk6ZmFsc2UpOworCisJLy8KKwkvLyBDb25maWcgVFggU1RCQyBzZXR0aW5nCisJLy8KKwkvLyBUT0RPOgorCisJLy8KKwkvLyBDb25maWcgRFNTUy9DQ0sgIG1vZGUgaW4gNDBNSHogbW9kZQorCS8vCisJLy8gVE9ETzoKKwlwSFRJbmZvLT5iQ3VyU3VwcENDSyA9CisJCSgocEhUSW5mby0+YlJlZ1N1cHBDQ0spPygocFBlZXJIVENhcC0+RHNzQ0NrPT0xKT90cnVlOmZhbHNlKTpmYWxzZSk7CisKKworCS8vCisJLy8gQ29uZmlnIGFuZCBjb25maWd1cmUgQS1NU0RVIHNldHRpbmcKKwkvLworCXBIVEluZm8tPmJDdXJyZW50X0FNU0RVX1N1cHBvcnQgPSBwSFRJbmZvLT5iQU1TRFVfU3VwcG9ydDsKKworCW5NYXhBTVNEVVNpemUgPSAocFBlZXJIVENhcC0+TWF4QU1TRFVTaXplPT0wKT8zODM5Ojc5MzU7CisKKwlpZihwSFRJbmZvLT5uQU1TRFVfTWF4U2l6ZSA+IG5NYXhBTVNEVVNpemUgKQorCQlwSFRJbmZvLT5uQ3VycmVudF9BTVNEVV9NYXhTaXplID0gbk1heEFNU0RVU2l6ZTsKKwllbHNlCisJCXBIVEluZm8tPm5DdXJyZW50X0FNU0RVX01heFNpemUgPSBwSFRJbmZvLT5uQU1TRFVfTWF4U2l6ZTsKKworCisJLy8KKwkvLyBDb25maWcgQS1NUERVIHNldHRpbmcKKwkvLworCXBIVEluZm8tPmJDdXJyZW50QU1QRFVFbmFibGUgPSBwSFRJbmZvLT5iQU1QRFVFbmFibGU7CisKKwkvLyA8MT4gRGVjaWRlIEFNUERVIEZhY3RvcgorCisJLy8gQnkgRW1pbHkKKwlpZighcEhUSW5mby0+YlJlZ1JUMlJUQWdncmVnYXRpb24pCisJeworCQkvLyBEZWNpZGUgQU1QRFUgRmFjdG9yIGFjY29yZGluZyB0byBwcm90b2NvbCBoYW5kc2hha2UKKwkJaWYocEhUSW5mby0+QU1QRFVfRmFjdG9yID4gcFBlZXJIVENhcC0+TWF4UnhBTVBEVUZhY3RvcikKKwkJCXBIVEluZm8tPkN1cnJlbnRBTVBEVUZhY3RvciA9IHBQZWVySFRDYXAtPk1heFJ4QU1QRFVGYWN0b3I7CisJCWVsc2UKKwkJCXBIVEluZm8tPkN1cnJlbnRBTVBEVUZhY3RvciA9IHBIVEluZm8tPkFNUERVX0ZhY3RvcjsKKworCX1lbHNlCisJeworCQkvLyBTZXQgTVBEVSBkZW5zaXR5IHRvIDIgdG8gUmVhbHRlayBBUCwgYW5kIHNldCBpdCB0byAwIGZvciBvdGhlcnMKKwkJLy8gUmVwbGFjZSBNUERVIGZhY3RvciBkZWNsYXJlZCBpbiBvcmlnaW5hbCBhc3NvY2lhdGlvbiByZXNwb25zZSBmcmFtZSBmb3JtYXQuIDIwMDcuMDguMjAgYnkgRW1pbHkKKwkJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NodC5iZFJUMlJUQWdncmVnYXRpb24pCisJCXsKKwkJCWlmKCBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSAhPSBLRVlfVFlQRV9OQSkKKwkJCQkvLyBSZWFsdGVrIG1heSBzZXQgMzJrIGluIHNlY3VyaXR5IG1vZGUgYW5kIDY0ayBmb3Igb3RoZXJzCisJCQkJcEhUSW5mby0+Q3VycmVudEFNUERVRmFjdG9yID0gcFBlZXJIVENhcC0+TWF4UnhBTVBEVUZhY3RvcjsKKwkJCWVsc2UKKwkJCQlwSFRJbmZvLT5DdXJyZW50QU1QRFVGYWN0b3IgPSBIVF9BR0dfU0laRV82NEs7CisJCX1lbHNlCisJCXsKKwkJCWlmKHBQZWVySFRDYXAtPk1heFJ4QU1QRFVGYWN0b3IgPCBIVF9BR0dfU0laRV8zMkspCisJCQkJcEhUSW5mby0+Q3VycmVudEFNUERVRmFjdG9yID0gcFBlZXJIVENhcC0+TWF4UnhBTVBEVUZhY3RvcjsKKwkJCWVsc2UKKwkJCQlwSFRJbmZvLT5DdXJyZW50QU1QRFVGYWN0b3IgPSBIVF9BR0dfU0laRV8zMks7CisJCX0KKwl9CisKKwkvLyA8Mj4gU2V0IEFNUERVIE1pbmltdW0gTVBEVSBTdGFydCBTcGFjaW5nCisJLy8gODAyLjExbiAzLjAgc2VjdGlvbiA5LjdkLjMKKwlpZihwSFRJbmZvLT5NUERVX0RlbnNpdHkgPiBwUGVlckhUQ2FwLT5NUERVRGVuc2l0eSkKKwkJcEhUSW5mby0+Q3VycmVudE1QRFVEZW5zaXR5ID0gcEhUSW5mby0+TVBEVV9EZW5zaXR5OworCWVsc2UKKwkJcEhUSW5mby0+Q3VycmVudE1QRFVEZW5zaXR5ID0gcFBlZXJIVENhcC0+TVBEVURlbnNpdHk7CisJaWYoaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgIT0gS0VZX1RZUEVfTkEgKQorCQlwSFRJbmZvLT5DdXJyZW50TVBEVURlbnNpdHkgCT0gNzsgLy8gOHVzCisJLy8gRm9yY2UgVFggQU1TRFUKKworCS8vIExhbmhzaW46IG1hcmsgZm9yIHRtcCB0byBhdm9pZCBkZWF1dGggYnkgYXAgZnJvbSAgczMKKwkvL2lmKG1lbWNtcChwTWdudEluZm8tPkJzc2lkLCBORVRHRUFSODM0QnYyX0JST0FEQ09NLCAzKT09MCkKKwlpZigwKQorCQl7CisKKwkJCXBIVEluZm8tPmJDdXJyZW50QU1QRFVFbmFibGUgPSBmYWxzZTsKKwkJCXBIVEluZm8tPkZvcmNlZEFNU0RVTW9kZSA9IEhUX0FHR19GT1JDRV9FTkFCTEU7CisJCQlwSFRJbmZvLT5Gb3JjZWRBTVNEVU1heFNpemUgPSA3OTM1OworCisJCXBIVEluZm8tPklPVEFjdGlvbiB8PSAgSFRfSU9UX0FDVF9UWF9VU0VfQU1TRFVfOEs7CisJfQorCisJLy8gUnggUmVvcmRlciBTZXR0aW5nCisJcEhUSW5mby0+YkN1clJ4UmVvcmRlckVuYWJsZSA9IHBIVEluZm8tPmJSZWdSeFJlb3JkZXJFbmFibGU7CisKKwkvLworCS8vIEZpbHRlciBvdXQgdW5zdXBwb3J0ZWQgSFQgcmF0ZSBmb3IgdGhpcyBBUAorCS8vIFVwZGF0ZSBSQVRSIHRhYmxlCisJLy8gVGhpcyBpcyBvbmx5IGZvciA4MTkwICw4MTkyIG9yIGxhdGVyIHByb2R1Y3Qgd2hpY2ggdXNpbmcgZmlybXdhcmUgdG8gaGFuZGxlIHJhdGUgYWRhcHRpdmUgbWVjaGFuaXNtLgorCS8vCisKKwkvLyBIYW5kbGUgUmFsaW5rIEFQIGJhZCBNQ1MgcmF0ZSBzZXQgY29uZGl0aW9uLiBKb3NlcGguCisJLy8gVGhpcyBmaXggdGhlIGJ1ZyBvZiBSYWxpbmsgQVAuIFRoaXMgbWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KKwlpZihwUGVlckhUQ2FwLT5NQ1NbMF0gPT0gMCkKKwkJcFBlZXJIVENhcC0+TUNTWzBdID0gMHhmZjsKKworCUhURmlsdGVyTUNTUmF0ZShpZWVlLCBwUGVlckhUQ2FwLT5NQ1MsIGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQpOworCisJLy8KKwkvLyBDb25maWcgTUlNTyBQb3dlciBTYXZlIHNldHRpbmcKKwkvLworCXBIVEluZm8tPlBlZXJNaW1vUHMgPSBwUGVlckhUQ2FwLT5NaW1vUHdyU2F2ZTsKKwlpZihwSFRJbmZvLT5QZWVyTWltb1BzID09IE1JTU9fUFNfU1RBVElDKQorCQlwTWNzRmlsdGVyID0gTUNTX0ZJTFRFUl8xU1M7CisJZWxzZQorCQlwTWNzRmlsdGVyID0gTUNTX0ZJTFRFUl9BTEw7CisJLy9XQiBhZGQgZm9yIE1DUzggYnVnCisvLwlwTWNzRmlsdGVyID0gTUNTX0ZJTFRFUl8xU1M7CisJaWVlZS0+SFRIaWdoZXN0T3BlcmFSYXRlID0gSFRHZXRIaWdoZXN0TUNTUmF0ZShpZWVlLCBpZWVlLT5kb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0LCBwTWNzRmlsdGVyKTsKKwlpZWVlLT5IVEN1cnJlbnRPcGVyYVJhdGUgPSBpZWVlLT5IVEhpZ2hlc3RPcGVyYVJhdGU7CisKKwkvLworCS8vIENvbmZpZyBjdXJyZW50IG9wZXJhdGlvbiBtb2RlLgorCS8vCisJcEhUSW5mby0+Q3VycmVudE9wTW9kZSA9IHBQZWVySFRJbmZvLT5PcHRNb2RlOworCisKKworfQorCit2b2lkIEhUU2V0Q29ubmVjdEJ3TW9kZUNhbGxiYWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIGluaXRpYWxpemUgSFQgaW5mbyhzdHJ1Y3QgUFJUX0hJR0hfVEhST1VHSFBVVCkKKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogCWllZWUKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogIG5vdGljZTogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiAqICAoMSkgTVBJbml0aWFsaXphdGlvbiBQaGFzZSAqICAoMikgUmVjZWl2aW5nIG9mIERlYXV0aGVudGljYXRpb24gZnJvbSBBUAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBUT0RPOiBTaG91bGQgdGhpcyBmdW5jaXRvbiBiZSBjYWxsZWQgd2hlbiByZWNlaXZpbmcgb2YgRGlzYXNzb2NpYXRpb24/Cit2b2lkIEhUSW5pdGlhbGl6ZUhUSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSkKK3sKKwlQUlRfSElHSF9USFJPVUdIUFVUIHBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCisJLy8KKwkvLyBUaGVzZSBwYXJhbWV0ZXJzIHdpbGwgYmUgcmVzZXQgd2hlbiByZWNlaXZpbmcgZGVhdXRoZW50aWNhdGlvbiBwYWNrZXQKKwkvLworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICI9PT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCXBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID0gZmFsc2U7CisKKwkvLyA0ME1IeiBjaGFubmVsIHN1cHBvcnQKKwlwSFRJbmZvLT5iQ3VyQlc0ME1IeiA9IGZhbHNlOworCXBIVEluZm8tPmJDdXJUeEJXNDBNSHogPSBmYWxzZTsKKworCS8vIFNob3J0IEdJIHN1cHBvcnQKKwlwSFRJbmZvLT5iQ3VyU2hvcnRHSTIwTUh6ID0gZmFsc2U7CisJcEhUSW5mby0+YkN1clNob3J0R0k0ME1IeiA9IGZhbHNlOworCXBIVEluZm8tPmJGb3JjZWRTaG9ydEdJID0gZmFsc2U7CisKKwkvLyBDQ0sgcmF0ZSBzdXBwb3J0CisJLy8gVGhpcyBmbGFnIGlzIHNldCB0byB0cnVlIHRvIHN1cHBvcnQgQ0NLIHJhdGUgYnkgZGVmYXVsdC4KKwkvLyBJdCB3aWxsIGJlIGFmZmVjdGVkIGJ5ICJwSFRJbmZvLT5iUmVnU3VwcENDSyIgYW5kIEFQIGNhcGFiaWxpdGllcyBvbmx5IHdoZW4gYXNzb2NpYXRlIHRvCisJLy8gMTFOIEJTUy4KKwlwSFRJbmZvLT5iQ3VyU3VwcENDSyA9IHRydWU7CisKKwkvLyBBTVNEVSByZWxhdGVkCisJcEhUSW5mby0+YkN1cnJlbnRfQU1TRFVfU3VwcG9ydCA9IGZhbHNlOworCXBIVEluZm8tPm5DdXJyZW50X0FNU0RVX01heFNpemUgPSBwSFRJbmZvLT5uQU1TRFVfTWF4U2l6ZTsKKworCS8vIEFNUFVEIHJlbGF0ZWQKKwlwSFRJbmZvLT5DdXJyZW50TVBEVURlbnNpdHkgPSBwSFRJbmZvLT5NUERVX0RlbnNpdHk7CisJcEhUSW5mby0+Q3VycmVudEFNUERVRmFjdG9yID0gcEhUSW5mby0+QU1QRFVfRmFjdG9yOworCisKKworCS8vIEluaXRpYWxpemUgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIHJlbGF0ZWQgdG8gMTFuCisJbWVtc2V0KCh2b2lkKikoJihwSFRJbmZvLT5TZWxmSFRDYXApKSwgMCwgc2l6ZW9mKHBIVEluZm8tPlNlbGZIVENhcCkpOworCW1lbXNldCgodm9pZCopKCYocEhUSW5mby0+U2VsZkhUSW5mbykpLCAwLCBzaXplb2YocEhUSW5mby0+U2VsZkhUSW5mbykpOworCW1lbXNldCgodm9pZCopKCYocEhUSW5mby0+UGVlckhUQ2FwQnVmKSksIDAsIHNpemVvZihwSFRJbmZvLT5QZWVySFRDYXBCdWYpKTsKKwltZW1zZXQoKHZvaWQqKSgmKHBIVEluZm8tPlBlZXJIVEluZm9CdWYpKSwgMCwgc2l6ZW9mKHBIVEluZm8tPlBlZXJIVEluZm9CdWYpKTsKKworCXBIVEluZm8tPmJTd0J3SW5Qcm9ncmVzcyA9IGZhbHNlOworCXBIVEluZm8tPkNobmxPcCA9IENITkxPUF9OT05FOworCisJLy8gU2V0IGRlZmF1bHQgSUVFRSBzcGVjIGZvciBEcmFmdCBOCisJcEhUSW5mby0+ZVBlZXJIVFNwZWNWZXIgPSBIVF9TUEVDX1ZFUl9JRUVFOworCisJLy8gUmVhbHRlayBwcm9wcmlldGFyeSBhZ2dyZWdhdGlvbiBtb2RlCisJcEhUSW5mby0+YkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uID0gZmFsc2U7CisJcEhUSW5mby0+YkN1cnJlbnRSVDJSVExvbmdTbG90VGltZSA9IGZhbHNlOworCXBIVEluZm8tPklPVFBlZXIgPSAwOworCXBIVEluZm8tPklPVEFjdGlvbiA9IDA7CisKKwkvL01DUyByYXRlIGluaXRpYWxpemVkIGhlcmUKKwl7CisJCXU4KiBSZWdIVFN1cHBSYXRlU2V0cyA9ICYoaWVlZS0+UmVnSFRTdXBwUmF0ZVNldFswXSk7CisJCVJlZ0hUU3VwcFJhdGVTZXRzWzBdID0gMHhGRjsJLy9zdXBwb3J0IE1DUyAwfjcKKwkJUmVnSFRTdXBwUmF0ZVNldHNbMV0gPSAweEZGOwkvL3N1cHBvcnQgTUNTIDh+MTUKKwkJUmVnSFRTdXBwUmF0ZVNldHNbNF0gPSAweDAxOwkvL3N1cHBvcnQgTUNTIDMyCisJfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgaW5pdGlhbGl6ZSBCc3MgSFQgc3RydWN0dXJlKHN0cnVjdCBQQlNTX0hUKQorICogICBpbnB1dDogIFBCU1NfSFQgcEJzc0hUIC8vdG8gYmUgaW5pdGlhbGl6ZWQKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogIG5vdGljZTogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBpbml0aWFsaXplIG5ldHdvcmsgc3RydWN0dXJlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSFRJbml0aWFsaXplQnNzRGVzYyhQQlNTX0hUIHBCc3NIVCkKK3sKKworCXBCc3NIVC0+YmRTdXBwb3J0SFQgPSBmYWxzZTsKKwltZW1zZXQocEJzc0hULT5iZEhUQ2FwQnVmLCAwLCBzaXplb2YocEJzc0hULT5iZEhUQ2FwQnVmKSk7CisJcEJzc0hULT5iZEhUQ2FwTGVuID0gMDsKKwltZW1zZXQocEJzc0hULT5iZEhUSW5mb0J1ZiwgMCwgc2l6ZW9mKHBCc3NIVC0+YmRIVEluZm9CdWYpKTsKKwlwQnNzSFQtPmJkSFRJbmZvTGVuID0gMDsKKworCXBCc3NIVC0+YmRIVFNwZWNWZXI9IEhUX1NQRUNfVkVSX0lFRUU7CisKKwlwQnNzSFQtPmJkUlQyUlRBZ2dyZWdhdGlvbiA9IGZhbHNlOworCXBCc3NIVC0+YmRSVDJSVExvbmdTbG90VGltZSA9IGZhbHNlOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgaW5pdGlhbGl6ZSBCc3MgSFQgc3RydWN0dXJlKHN0cnVjdCBQQlNTX0hUKQorICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlIAkqaWVlZQorICogICAJICAgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgCSpwTmV0d29yayAvL3VzdWFsbHkgY3VycmVudCBuZXR3b3JrIHdlIGFyZSBsaXZlIGluCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICBub3RpY2U6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIE9OTFkgYmUgY2FsbGVkIGJlZm9yZSBhc3NvY2lhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhUUmVzZXRTZWxmQW5kU2F2ZVBlZXJTZXR0aW5nKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCAJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICogcE5ldHdvcmspCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVAkJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisvLwl1MTYJCQkJCQluTWF4QU1TRFVTaXplOworLy8JUEhUX0NBUEFCSUxJVFlfRUxFCQlwUGVlckhUQ2FwID0gKFBIVF9DQVBBQklMSVRZX0VMRSlwTmV0d29yay0+YnNzaHQuYmRIVENhcEJ1ZjsKKy8vCVBIVF9JTkZPUk1BVElPTl9FTEUJCXBQZWVySFRJbmZvID0gKFBIVF9JTkZPUk1BVElPTl9FTEUpcE5ldHdvcmstPmJzc2h0LmJkSFRJbmZvQnVmOworLy8JdTgqCXBNY3NGaWx0ZXI7CisJdTgJYklPVEFjdGlvbiA9IDA7CisKKwkvLworCS8vICBTYXZlIFBlZXIgU2V0dGluZyBiZWZvcmUgQXNzb2NpYXRpb24KKwkvLworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICI9PT09PT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCS8qdW5tYXJrIGJFbmFibGVIVCBmbGFnIGhlcmUgaXMgdGhlIHNhbWUgcmVhc29uIHdoeSB1bm1hcmtlZCBpbiBmdW5jdGlvbiBpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0LiBXQiAyMDA4LjA5LjEwKi8KKy8vCWlmKCBwSFRJbmZvLT5iRW5hYmxlSFQgJiYgIHBOZXR3b3JrLT5ic3NodC5iZFN1cHBvcnRIVCkKKwlpZiAocE5ldHdvcmstPmJzc2h0LmJkU3VwcG9ydEhUKQorCXsKKwkJcEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPSB0cnVlOworCQlwSFRJbmZvLT5lUGVlckhUU3BlY1ZlciA9IHBOZXR3b3JrLT5ic3NodC5iZEhUU3BlY1ZlcjsKKworCQkvLyBTYXZlIEhUQ2FwIGFuZCBIVEluZm8gaW5mb3JtYXRpb24gRWxlbWVudAorCQlpZihwTmV0d29yay0+YnNzaHQuYmRIVENhcExlbiA+IDAgJiYgCXBOZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuIDw9IHNpemVvZihwSFRJbmZvLT5QZWVySFRDYXBCdWYpKQorCQkJbWVtY3B5KHBIVEluZm8tPlBlZXJIVENhcEJ1ZiwgcE5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYsIHBOZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuKTsKKworCQlpZihwTmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4gPiAwICYmIHBOZXR3b3JrLT5ic3NodC5iZEhUSW5mb0xlbiA8PSBzaXplb2YocEhUSW5mby0+UGVlckhUSW5mb0J1ZikpCisJCQltZW1jcHkocEhUSW5mby0+UGVlckhUSW5mb0J1ZiwgcE5ldHdvcmstPmJzc2h0LmJkSFRJbmZvQnVmLCBwTmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4pOworCisJCS8vIENoZWNrIHdoZXRoZXIgUlQgdG8gUlQgYWdncmVnYXRpb24gbW9kZSBpcyBlbmFibGVkCisJCWlmKHBIVEluZm8tPmJSZWdSVDJSVEFnZ3JlZ2F0aW9uKQorCQl7CisJCQlwSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24gPSBwTmV0d29yay0+YnNzaHQuYmRSVDJSVEFnZ3JlZ2F0aW9uOworCQkJcEhUSW5mby0+YkN1cnJlbnRSVDJSVExvbmdTbG90VGltZSA9IHBOZXR3b3JrLT5ic3NodC5iZFJUMlJUTG9uZ1Nsb3RUaW1lOworCQl9CisJCWVsc2UKKwkJeworCQkJcEhUSW5mby0+YkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uID0gZmFsc2U7CisJCQlwSFRJbmZvLT5iQ3VycmVudFJUMlJUTG9uZ1Nsb3RUaW1lID0gZmFsc2U7CisJCX0KKworCQkvLyBEZXRlcm1pbmUgdGhlIElPVCBQZWVyIFZlbmRvci4KKwkJSFRJT1RQZWVyRGV0ZXJtaW5lKGllZWUpOworCisJCS8vIERlY2lkZSBJT1QgQWN0aW9uCisJCS8vIE11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBwYXJhbWV0ZXIgb2YgcEhUSW5mby0+YkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uIGlzIGRlY2lkZWQKKwkJcEhUSW5mby0+SU9UQWN0aW9uID0gMDsKKwkJYklPVEFjdGlvbiA9IEhUSU9UQWN0SXNEaXNhYmxlTUNTMTQoaWVlZSwgcE5ldHdvcmstPmJzc2lkKTsKKwkJaWYoYklPVEFjdGlvbikKKwkJCXBIVEluZm8tPklPVEFjdGlvbiB8PSBIVF9JT1RfQUNUX0RJU0FCTEVfTUNTMTQ7CisKKwkJYklPVEFjdGlvbiA9IEhUSU9UQWN0SXNEaXNhYmxlTUNTMTUoaWVlZSk7CisJCWlmKGJJT1RBY3Rpb24pCisJCQlwSFRJbmZvLT5JT1RBY3Rpb24gfD0gSFRfSU9UX0FDVF9ESVNBQkxFX01DUzE1OworCisJCWJJT1RBY3Rpb24gPSBIVElPVEFjdElzRGlzYWJsZU1DU1R3b1NwYXRpYWxTdHJlYW0oaWVlZSwgcE5ldHdvcmstPmJzc2lkKTsKKwkJaWYoYklPVEFjdGlvbikKKwkJCXBIVEluZm8tPklPVEFjdGlvbiB8PSBIVF9JT1RfQUNUX0RJU0FCTEVfQUxMXzJTUzsKKworCisJCWJJT1RBY3Rpb24gPSBIVElPVEFjdElzRGlzYWJsZUVEQ0FUdXJibyhpZWVlLCBwTmV0d29yay0+YnNzaWQpOworCQlpZihiSU9UQWN0aW9uKQorCQkJcEhUSW5mby0+SU9UQWN0aW9uIHw9IEhUX0lPVF9BQ1RfRElTQUJMRV9FRENBX1RVUkJPOworCisJCWJJT1RBY3Rpb24gPSBIVElPVEFjdElzTWdudFVzZUNDSzZNKHBOZXR3b3JrKTsKKwkJaWYoYklPVEFjdGlvbikKKwkJCXBIVEluZm8tPklPVEFjdGlvbiB8PSBIVF9JT1RfQUNUX01HTlRfVVNFX0NDS182TTsKKworCQliSU9UQWN0aW9uID0gSFRJT1RBY3RJc0NDREZzeW5jKHBOZXR3b3JrLT5ic3NpZCk7CisJCWlmKGJJT1RBY3Rpb24pCisJCQlwSFRJbmZvLT5JT1RBY3Rpb24gfD0gSFRfSU9UX0FDVF9DRERfRlNZTkM7CisKKworCX0KKwllbHNlCisJeworCQlwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9IGZhbHNlOworCQlwSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24gPSBmYWxzZTsKKwkJcEhUSW5mby0+YkN1cnJlbnRSVDJSVExvbmdTbG90VGltZSA9IGZhbHNlOworCisJCXBIVEluZm8tPklPVEFjdGlvbiA9IDA7CisJfQorCit9CisKK3ZvaWQgSFRVcGRhdGVTZWxmQW5kUGVlclNldHRpbmcoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIAlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBwTmV0d29yaykKK3sKKwlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworLy8JUEhUX0NBUEFCSUxJVFlfRUxFCQlwUGVlckhUQ2FwID0gKFBIVF9DQVBBQklMSVRZX0VMRSlwTmV0d29yay0+YnNzaHQuYmRIVENhcEJ1ZjsKKwlQSFRfSU5GT1JNQVRJT05fRUxFCQlwUGVlckhUSW5mbyA9IChQSFRfSU5GT1JNQVRJT05fRUxFKXBOZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1ZjsKKworCWlmKHBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0KQorCXsKKwkJLy8KKwkJLy8gQ29uZmlnIGN1cnJlbnQgb3BlcmF0aW9uIG1vZGUuCisJCS8vCisJCWlmKHBOZXR3b3JrLT5ic3NodC5iZEhUSW5mb0xlbiAhPSAwKQorCQkJcEhUSW5mby0+Q3VycmVudE9wTW9kZSA9IHBQZWVySFRJbmZvLT5PcHRNb2RlOworCisJCS8vCisJCS8vIDxUT0RPOiBDb25maWcgYWNjb3JkaW5nIHRvIE9CU1Mgbm9uLUhUIFNUQSBwcmVzZW50ISE+CisJCS8vCisJfQorfQorCit2b2lkIEhUVXNlRGVmYXVsdFNldHRpbmcoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVCBwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKy8vCXU4CXJlZ0J3T3BNb2RlOworCisJaWYocEhUSW5mby0+YkVuYWJsZUhUKQorCXsKKwkJcEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPSB0cnVlOworCisJCXBIVEluZm8tPmJDdXJTdXBwQ0NLID0gcEhUSW5mby0+YlJlZ1N1cHBDQ0s7CisKKwkJcEhUSW5mby0+YkN1ckJXNDBNSHogPSBwSFRJbmZvLT5iUmVnQlc0ME1IejsKKworCQlwSFRJbmZvLT5iQ3VyU2hvcnRHSTIwTUh6PSBwSFRJbmZvLT5iUmVnU2hvcnRHSTIwTUh6OworCisJCXBIVEluZm8tPmJDdXJTaG9ydEdJNDBNSHo9IHBIVEluZm8tPmJSZWdTaG9ydEdJNDBNSHo7CisKKwkJcEhUSW5mby0+YkN1cnJlbnRfQU1TRFVfU3VwcG9ydCA9IHBIVEluZm8tPmJBTVNEVV9TdXBwb3J0OworCisJCXBIVEluZm8tPm5DdXJyZW50X0FNU0RVX01heFNpemUgPSBwSFRJbmZvLT5uQU1TRFVfTWF4U2l6ZTsKKworCQlwSFRJbmZvLT5iQ3VycmVudEFNUERVRW5hYmxlID0gcEhUSW5mby0+YkFNUERVRW5hYmxlOworCisJCXBIVEluZm8tPkN1cnJlbnRBTVBEVUZhY3RvciA9IHBIVEluZm8tPkFNUERVX0ZhY3RvcjsKKworCQlwSFRJbmZvLT5DdXJyZW50TVBEVURlbnNpdHkgPSBwSFRJbmZvLT5DdXJyZW50TVBEVURlbnNpdHk7CisKKwkJLy8gU2V0IEJXT3BNb2RlIHJlZ2lzdGVyCisKKwkJLy91cGRhdGUgUkFUUiBpbmRleDAKKwkJSFRGaWx0ZXJNQ1NSYXRlKGllZWUsIGllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQpOworCS8vZnVuY3Rpb24gYmVsb3cgaXMgbm90IGltcGxlbWVudGVkIGF0IGFsbC4gV0IKKyNpZmRlZiBUT0RPCisJCUFkYXB0ZXItPkhhbEZ1bmMuSW5pdEhhbFJBVFJUYWJsZUhhbmRsZXIoIEFkYXB0ZXIsICZwTWdudEluZm8tPmRvdDExT3BlcmF0aW9uYWxSYXRlU2V0LCBwTWdudEluZm8tPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQpOworI2VuZGlmCisJCWllZWUtPkhUSGlnaGVzdE9wZXJhUmF0ZSA9IEhUR2V0SGlnaGVzdE1DU1JhdGUoaWVlZSwgaWVlZS0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCwgTUNTX0ZJTFRFUl9BTEwpOworCQlpZWVlLT5IVEN1cnJlbnRPcGVyYVJhdGUgPSBpZWVlLT5IVEhpZ2hlc3RPcGVyYVJhdGU7CisKKwl9CisJZWxzZQorCXsKKwkJcEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPSBmYWxzZTsKKwl9CisJcmV0dXJuOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgY2hlY2sgd2hldGhlciBIVCBjb250cm9sIGZpZWxkIGV4aXN0cworICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlIAkqaWVlZQorICogICAJICAgICB1OCoJCQlwRnJhbWUgLy9jb21pbmcgc2tiLT5kYXRhCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIHJldHVybiB0cnVlIGlmIEhUIGNvbnRyb2wgZmllbGQgZXhpc3RzKGZhbHNlIG90aGVyd2lzZSkKKyAqICBub3RpY2U6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IEhUQ0NoZWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCoJcEZyYW1lKQoreworCWlmKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0KQorCXsKKwkJaWYoIChJc1FvU0RhdGFGcmFtZShwRnJhbWUpICYmIEZyYW1lX09yZGVyKHBGcmFtZSkpID09IDEpCisJCXsKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJIVCBDT05UUk9MIEZJTEVEIEVYSVNUISFcbiIpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvLworLy8gVGhpcyBmdW5jdGlvbiBzZXQgYmFuZHdpZHRoIG1vZGUgaW4gcHJvdG9jb2wgbGF5ZXIuCisvLwordm9pZCBIVFNldENvbm5lY3RCd01vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIEhUX0NIQU5ORUxfV0lEVEgJQmFuZHdpZHRoLCBIVF9FWFRDSE5MX09GRlNFVAlPZmZzZXQpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVCBwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKy8vCXUzMiBmbGFncyA9IDA7CisKKwlpZihwSFRJbmZvLT5iUmVnQlc0ME1IeiA9PSBmYWxzZSkKKwkJcmV0dXJuOworCisKKworCS8vIFRvIHJlZHVjZSBkdW1teSBvcGVyYXRpb24KKy8vCWlmKChwSFRJbmZvLT5iQ3VyQlc0ME1Iej09ZmFsc2UgJiYgQmFuZHdpZHRoPT1IVF9DSEFOTkVMX1dJRFRIXzIwKSB8fAorLy8JICAgKHBIVEluZm8tPmJDdXJCVzQwTUh6PT10cnVlICYmIEJhbmR3aWR0aD09SFRfQ0hBTk5FTF9XSURUSF8yMF80MCAmJiBPZmZzZXQ9PXBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQpKQorLy8JCXJldHVybjsKKworLy8Jc3Bpbl9sb2NrX2lycXNhdmUoJihpZWVlLT5id19zcGlubG9jayksIGZsYWdzKTsKKwlpZihwSFRJbmZvLT5iU3dCd0luUHJvZ3Jlc3MpIHsKKy8vCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+Yndfc3BpbmxvY2spLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJLy9pZiBpbiBoYWxmIE4gbW9kZSwgc2V0IHRvIDIwTSBiYW5kd2lkdGggcGxlYXNlIDA5LjA4LjIwMDggV0IuCisJaWYoQmFuZHdpZHRoPT1IVF9DSEFOTkVMX1dJRFRIXzIwXzQwICYmICghaWVlZS0+R2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcihpZWVlLT5kZXYpKSkKKwkgeworCQkJLy8gSGFuZGxlIElsbGVnYWwgZXh0ZW50aW9uIGNoYW5uZWwgb2Zmc2V0ISEKKwkJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw8MiAmJiBPZmZzZXQ9PUhUX0VYVENITkxfT0ZGU0VUX0xPV0VSKQorCQkJT2Zmc2V0ID0gSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUOworCQlpZihPZmZzZXQ9PUhUX0VYVENITkxfT0ZGU0VUX1VQUEVSIHx8IE9mZnNldD09SFRfRVhUQ0hOTF9PRkZTRVRfTE9XRVIpIHsKKwkJCXBIVEluZm8tPmJDdXJCVzQwTUh6ID0gdHJ1ZTsKKwkJCXBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQgPSBPZmZzZXQ7CisJCX0gZWxzZSB7CisJCQlwSFRJbmZvLT5iQ3VyQlc0ME1IeiA9IGZhbHNlOworCQkJcEhUSW5mby0+Q3VyU1RBRXh0Q2hubE9mZnNldCA9IEhUX0VYVENITkxfT0ZGU0VUX05PX0VYVDsKKwkJfQorCX0gZWxzZSB7CisJCXBIVEluZm8tPmJDdXJCVzQwTUh6ID0gZmFsc2U7CisJCXBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQgPSBIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQ7CisJfQorCisJcEhUSW5mby0+YlN3QndJblByb2dyZXNzID0gdHJ1ZTsKKworCS8vIFRPRE86IDIwMDcuNy4xMyBieSBFbWlseSBXYWl0IDIwMDBtcyAgaW4gb3JkZXIgdG8gZ2FyYW50ZWUgdGhhdCBzd2l0Y2hpbmcKKwkvLyAgIGJhbmR3aWR0aCBpcyBleGVjdXRlZCBhZnRlciBzY2FuIGlzIGZpbmlzaGVkLiBJdCBpcyBhIHRlbXBvcmFsIHNvbHV0aW9uCisJLy8gICBiZWNhdXNlIHNvZnR3YXJlIHNob3VsZCBnYW5yYW50ZWUgdGhlIGxhc3Qgb3BlcmF0aW9uIG9mIHN3aXRjaGluZyBiYW5kd2lkdGgKKwkvLyAgIGlzIGV4ZWN1dGVkIHByb3BlcmxseS4KKwlIVFNldENvbm5lY3RCd01vZGVDYWxsYmFjayhpZWVlKTsKKworLy8Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGllZWUtPmJ3X3NwaW5sb2NrKSwgZmxhZ3MpOworfQorCit2b2lkIEhUU2V0Q29ubmVjdEJ3TW9kZUNhbGxiYWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKQoreworCVBSVF9ISUdIX1RIUk9VR0hQVVQgcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiPT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZihwSFRJbmZvLT5iQ3VyQlc0ME1IeikKKwl7CisJCWlmKHBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQ9PUhUX0VYVENITkxfT0ZGU0VUX1VQUEVSKQorCQkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCsyKTsKKwkJZWxzZSBpZihwSFRJbmZvLT5DdXJTVEFFeHRDaG5sT2Zmc2V0PT1IVF9FWFRDSE5MX09GRlNFVF9MT1dFUikKKwkJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwtMik7CisJCWVsc2UKKwkJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCisJCWllZWUtPlNldEJXTW9kZUhhbmRsZXIoaWVlZS0+ZGV2LCBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwLCBwSFRJbmZvLT5DdXJTVEFFeHRDaG5sT2Zmc2V0KTsKKwl9IGVsc2UgeworCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwkJaWVlZS0+U2V0QldNb2RlSGFuZGxlcihpZWVlLT5kZXYsIEhUX0NIQU5ORUxfV0lEVEhfMjAsIEhUX0VYVENITkxfT0ZGU0VUX05PX0VYVCk7CisJfQorCisJcEhUSW5mby0+YlN3QndJblByb2dyZXNzID0gZmFsc2U7Cit9CisKK0VYUE9SVF9TWU1CT0woSFRVcGRhdGVTZWxmQW5kUGVlclNldHRpbmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X1Fvcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X1Fvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYjFlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfUW9zLmgKQEAgLTAsMCArMSw1ODMgQEAKKyNpZm5kZWYgX19JTkNfUU9TX1RZUEVfSAorI2RlZmluZSBfX0lOQ19RT1NfVFlQRV9ICisKKy8vI2luY2x1ZGUgIkVuZGlhbkZyZWUuaCIKKyNkZWZpbmUgQklUMCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBCSVQxICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEJJVDIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQklUMyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBCSVQ0ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEJJVDUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQklUNiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBCSVQ3ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEJJVDggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgQklUOSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBCSVQxMCAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEJJVDExICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgQklUMTIgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBCSVQxMyAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEJJVDE0ICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgQklUMTUgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBCSVQxNiAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEJJVDE3ICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgQklUMTggICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBCSVQxOSAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIEJJVDIwICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgQklUMjEgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBCSVQyMiAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEJJVDIzICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgQklUMjQgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBCSVQyNSAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIEJJVDI2ICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgQklUMjcgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBCSVQyOCAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIEJJVDI5ICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgQklUMzAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBCSVQzMSAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisKKyNkZWZpbmUJTUFYX1dNTUVMRV9MRU5HVEgJNjQKKworLy8KKy8vIFFvUyBtb2RlLgorLy8gZW51bSAwLCAxLCAyLCA0OiBzaW5jZSB3ZSBjYW4gdXNlIHRoZSBPUih8KSBvcGVyYXRpb24uCisvLworLy8gUU9TX01PREUgaXMgcmVkZWZpbmVkIGZvciBlbnVtIGNhbid0IGJlICsrLCB8IHVuZGVyIEMrKyBjb21waWxlciwgMjAwNi4wNS4xNywgYnkgcmNuamtvLgorLy90eXBlZGVmCWVudW0gX1FPU19NT0RFeworLy8JUU9TX0RJU0FCTEUJCT0gMCwKKy8vCVFPU19XTU0JCQk9IDEsCisvLwlRT1NfRURDQQkJCT0gMiwKKy8vCVFPU19IQ0NBCQkJPSA0LAorLy99UU9TX01PREUsKlBRT1NfTU9ERTsKKy8vCit0eXBlZGVmIHUzMiBRT1NfTU9ERSwgKlBRT1NfTU9ERTsKKyNkZWZpbmUgUU9TX0RJU0FCTEUJCTAKKyNkZWZpbmUgUU9TX1dNTQkJCTEKKyNkZWZpbmUgUU9TX1dNTVNBCQkyCisjZGVmaW5lIFFPU19FRENBCQk0CisjZGVmaW5lIFFPU19IQ0NBCQk4CisjZGVmaW5lIFFPU19XTU1fVUFQU0QJCTE2ICAgLy9XTU0gUG93ZXIgU2F2ZSwgMjAwNi0wNi0xNCBJc2FpYWgKKworI2RlZmluZSBBQ19QQVJBTV9TSVpFCTQKKyNkZWZpbmUgV01NX1BBUkFNX0VMRV9CT0RZX0xFTgkxOAorCisvLworLy8gUW9TIEFDSyBQb2xpY3kgRmllbGQgVmFsdWVzCisvLyBSZWY6IFdNTSBzcGVjIDIuMS42OiBRb1MgQ29udHJvbCBGaWVsZCwgcC4xMC4KKy8vCit0eXBlZGVmCWVudW0gX0FDS19QT0xJQ1l7CisJZUFja1BsYzBfQUNLCQk9IDB4MDAsCisJZUFja1BsYzFfTm9BQ0sJCT0gMHgwMSwKK31BQ0tfUE9MSUNZLCpQQUNLX1BPTElDWTsKKworI2RlZmluZSBXTU1fUEFSQU1fRUxFTUVOVF9TSVpFCSg4Kyg0KkFDX1BBUkFNX1NJWkUpKQorCisvLworLy8gUW9TIENvbnRyb2wgRmllbGQKKy8vIFJlZjoKKy8vCTEuIFdNTSBzcGVjIDIuMS42OiBRb1MgQ29udHJvbCBGaWVsZCwgcC45LgorLy8JMi4gODAyLjExZS9EMTMuMCA3LjEuMy41LCBwLjI2LgorLy8KK3R5cGVkZWYJdW5pb24gX1FPU19DVFJMX0ZJRUxEeworCXU4CWNoYXJEYXRhWzJdOworCXUxNglzaG9ydERhdGE7CisKKwkvLyBXTU0gc3BlYworCXN0cnVjdAorCXsKKwkJdTgJCVVQOjM7CisJCXU4CQl1c1JzdmQxOjE7CisJCXU4CQlFT1NQOjE7CisJCXU4CQlBY2tQb2xpY3k6MjsKKwkJdTgJCXVzUnN2ZDI6MTsKKwkJdTgJCXVjUnN2ZEJ5dGU7CisJfVdNTTsKKworCS8vIDgwMi4xMWU6IFFvUyBkYXRhIHR5cGUgZnJhbWUgc2VudCBieSBub24tQVAgUVNUQXMuCisJc3RydWN0CisJeworCQl1OAkJVElEOjQ7CisJCXU4CQliSXNRc2l6ZToxOy8vIDA6IEJJVFs4OjE1XSBpcyBUWE9QIER1cmF0aW9uIFJlcXVlc3RlZCwgMTogQklUWzg6MTVdIGlzIFF1ZXVlIFNpemUuCisJCXU4CQlBY2tQb2xpY3k6MjsKKwkJdTgJCXVzUnN2ZDoxOworCQl1OAkJVHhvcE9yUXNpemU7CS8vIChCSVQ0PTApVFhPUCBEdXJhdGlvbiBSZXF1ZXN0ZWQgb3IgKEJJVDQ9MSlRdWV1ZSBTaXplLgorCX1CeVN0YTsKKworCS8vIDgwMi4xMWU6IFFvUyBkYXRhLCBRb1MgTnVsbCwgYW5kIFFvUyBEYXRhK0NGLUFjayBmcmFtZXMgc2VudCBieSBIQy4KKwlzdHJ1Y3QKKwl7CisJCXU4CQlUSUQ6NDsKKwkJdTgJCUVPU1A6MTsKKwkJdTgJCUFja1BvbGljeToyOworCQl1OAkJdXNSc3ZkOjE7CisJCXU4CQlQU0J1ZlN0YXRlOwkJLy8gUUFQIFBTIEJ1ZmZlciBTdGF0ZS4KKwl9QnlIY19EYXRhOworCisJLy8gODAyLjExZTogUW9TICgrKSBDRi1Qb2xsIGZyYW1lcyBzZW50IGJ5IEhDLgorCXN0cnVjdAorCXsKKwkJdTgJCVRJRDo0OworCQl1OAkJRU9TUDoxOworCQl1OAkJQWNrUG9saWN5OjI7CisJCXU4CQl1c1JzdmQ6MTsKKwkJdTgJCVR4b3BMaW1pdDsJCS8vIFRYT1AgTGltaXQuCisJfUJ5SGNfQ0ZQOworCit9UU9TX0NUUkxfRklFTEQsICpQUU9TX0NUUkxfRklFTEQ7CisKKworLy8KKy8vIFFvUyBJbmZvIEZpZWxkCisvLyBSZWY6CisvLwkxLiBXTU0gc3BlYyAyLjIuMTogV01FIEluZm9ybWF0aW9uIEVsZW1lbnQsIHAuMTEuCisvLwkyLiA4MTg1IFFvUyBjb2RlOiBRT1NfSU5GTyBbZGVmLiBpbiBRb1NfbXAuaF0KKy8vCit0eXBlZGVmCXVuaW9uIF9RT1NfSU5GT19GSUVMRHsKKwl1OAljaGFyRGF0YTsKKworCXN0cnVjdAorCXsKKwkJdTgJCXVjUGFyYW1ldGVyU2V0Q291bnQ6NDsKKwkJdTgJCXVjUmVzZXJ2ZWQ6NDsKKwl9V01NOworCisJc3RydWN0CisJeworCQkvL1JlZiBXTU1fU3BlY2lmaWNhdGlvbl8xLTEucGRmLCAyMDA2LTA2LTEzIElzYWlhaAorCQl1OAkJdWNBQ19WT19VQVBTRDoxOworCQl1OAkJdWNBQ19WSV9VQVBTRDoxOworCQl1OAkJdWNBQ19CRV9VQVBTRDoxOworCQl1OAkJdWNBQ19CS19VQVBTRDoxOworCQl1OAkJdWNSZXNlcnZlZDE6MTsKKwkJdTgJCXVjTWF4U1BMZW46MjsKKwkJdTgJCXVjUmVzZXJ2ZWQyOjE7CisKKwl9QnlXbW1Qc1N0YTsKKworCXN0cnVjdAorCXsKKwkJLy9SZWYgV01NX1NwZWNpZmljYXRpb25fMS0xLnBkZiwgMjAwNi0wNi0xMyBJc2FpYWgKKwkJdTgJCXVjUGFyYW1ldGVyU2V0Q291bnQ6NDsKKwkJdTgJCXVjUmVzZXJ2ZWQ6MzsKKwkJdTgJCXVjQXBVYXBzZDoxOworCX1CeVdtbVBzQXA7CisKKwlzdHJ1Y3QKKwl7CisJCXU4CQl1Y0FDM19VQVBTRDoxOworCQl1OAkJdWNBQzJfVUFQU0Q6MTsKKwkJdTgJCXVjQUMxX1VBUFNEOjE7CisJCXU4CQl1Y0FDMF9VQVBTRDoxOworCQl1OAkJdWNRQWNrOjE7CisJCXU4CQl1Y01heFNQTGVuOjI7CisJCXU4CQl1Y01vcmVEYXRhQWNrOjE7CisJfSBCeTExZVN0YTsKKworCXN0cnVjdAorCXsKKwkJdTgJCXVjUGFyYW1ldGVyU2V0Q291bnQ6NDsKKwkJdTgJCXVjUUFjazoxOworCQl1OAkJdWNRdWV1ZVJlcToxOworCQl1OAkJdWNUWE9QUmVxOjE7CisJCXU4CQl1Y1Jlc2VydmVkOjE7CisJfSBCeTExZUFwOworCisJc3RydWN0CisJeworCQl1OAkJdWNSZXNlcnZlZDE6NDsKKwkJdTgJCXVjUUFjazoxOworCQl1OAkJdWNSZXNlcnZlZDI6MjsKKwkJdTgJCXVjTW9yZURhdGFBY2s6MTsKKwl9IEJ5V21tc2FTdGE7CisKKwlzdHJ1Y3QKKwl7CisJCXU4CQl1Y1Jlc2VydmVkMTo0OworCQl1OAkJdWNRQWNrOjE7CisJCXU4CQl1Y1F1ZXVlUmVxOjE7CisJCXU4CQl1Y1RYT1BSZXE6MTsKKwkJdTgJCXVjUmVzZXJ2ZWQyOjE7CisJfSBCeVdtbXNhQXA7CisKKwlzdHJ1Y3QKKwl7CisJCXU4CQl1Y0FDM19VQVBTRDoxOworCQl1OAkJdWNBQzJfVUFQU0Q6MTsKKwkJdTgJCXVjQUMxX1VBUFNEOjE7CisJCXU4CQl1Y0FDMF9VQVBTRDoxOworCQl1OAkJdWNRQWNrOjE7CisJCXU4CQl1Y01heFNQTGVuOjI7CisJCXU4CQl1Y01vcmVEYXRhQWNrOjE7CisJfSBCeUFsbFN0YTsKKworCXN0cnVjdAorCXsKKwkJdTgJCXVjUGFyYW1ldGVyU2V0Q291bnQ6NDsKKwkJdTgJCXVjUUFjazoxOworCQl1OAkJdWNRdWV1ZVJlcToxOworCQl1OAkJdWNUWE9QUmVxOjE7CisJCXU4CQl1Y0FwVWFwc2Q6MTsKKwl9IEJ5QWxsQXA7CisKK31RT1NfSU5GT19GSUVMRCwgKlBRT1NfSU5GT19GSUVMRDsKKworCisvLworLy8gQUNJIHRvIEFDIGNvZGluZy4KKy8vIFJlZjogV01NIHNwZWMgMi4yLjI6IFdNRSBQYXJhbWV0ZXIgRWxlbWVudCwgcC4xMy4KKy8vCisvLyBBQ19DT0RJTkcgaXMgcmVkZWZpbmVkIGZvciBlbnVtIGNhbid0IGJlICsrLCB8IHVuZGVyIEMrKyBjb21waWxlciwgMjAwNi4wNS4xNywgYnkgcmNuamtvLgorLy90eXBlZGVmCWVudW0gX0FDX0NPRElOR3sKKy8vCUFDMF9CRQk9IDAsCQkvLyBBQ0k6IDB4MDAJLy8gQmVzdCBFZmZvcnQKKy8vCUFDMV9CSwk9IDEsCQkvLyBBQ0k6IDB4MDEJLy8gQmFja2dyb3VuZAorLy8JQUMyX1ZJCT0gMiwJCS8vIEFDSTogMHgxMAkvLyBWaWRlbworLy8JQUMzX1ZPCT0gMywJCS8vIEFDSTogMHgxMQkvLyBWb2ljZQorLy8JQUNfTUFYID0gNCwJCS8vIE1heDogZGVmaW5lIHRvdGFsIG51bWJlcjsgU2hvdWxkIG5vdCB0byBiZSB1c2VkIGFzIGEgcmVhbCBlbnVtLgorLy99QUNfQ09ESU5HLCpQQUNfQ09ESU5HOworLy8KK3R5cGVkZWYgdTMyIEFDX0NPRElORzsKKyNkZWZpbmUgQUMwX0JFCTAJCS8vIEFDSTogMHgwMAkvLyBCZXN0IEVmZm9ydAorI2RlZmluZSBBQzFfQksJMQkJLy8gQUNJOiAweDAxCS8vIEJhY2tncm91bmQKKyNkZWZpbmUgQUMyX1ZJCTIJCS8vIEFDSTogMHgxMAkvLyBWaWRlbworI2RlZmluZSBBQzNfVk8JMwkJLy8gQUNJOiAweDExCS8vIFZvaWNlCisjZGVmaW5lIEFDX01BWAk0CQkvLyBNYXg6IGRlZmluZSB0b3RhbCBudW1iZXI7IFNob3VsZCBub3QgdG8gYmUgdXNlZCBhcyBhIHJlYWwgZW51bS4KKworLy8KKy8vIEFDSS9BSUZTTiBGaWVsZC4KKy8vIFJlZjogV01NIHNwZWMgMi4yLjI6IFdNRSBQYXJhbWV0ZXIgRWxlbWVudCwgcC4xMi4KKy8vCit0eXBlZGVmCXVuaW9uIF9BQ0lfQUlGU057CisJdTgJY2hhckRhdGE7CisKKwlzdHJ1Y3QKKwl7CisJCXU4CUFJRlNOOjQ7CisJCXU4CUFDTToxOworCQl1OAlBQ0k6MjsKKwkJdTgJUmVzZXJ2ZWQ6MTsKKwl9ZjsJLy8gRmllbGQKK31BQ0lfQUlGU04sICpQQUNJX0FJRlNOOworCisvLworLy8gRUNXbWluL0VDV21heCBmaWVsZC4KKy8vIFJlZjogV01NIHNwZWMgMi4yLjI6IFdNRSBQYXJhbWV0ZXIgRWxlbWVudCwgcC4xMy4KKy8vCit0eXBlZGVmCXVuaW9uIF9FQ1d7CisJdTgJY2hhckRhdGE7CisJc3RydWN0CisJeworCQl1OAlFQ1dtaW46NDsKKwkJdTgJRUNXbWF4OjQ7CisJfWY7CS8vIEZpZWxkCit9RUNXLCAqUEVDVzsKKworLy8KKy8vIEFDIFBhcmFtZXRlcnMgUmVjb3JkIEZvcm1hdC4KKy8vIFJlZjogV01NIHNwZWMgMi4yLjI6IFdNRSBQYXJhbWV0ZXIgRWxlbWVudCwgcC4xMi4KKy8vCit0eXBlZGVmCXVuaW9uIF9BQ19QQVJBTXsKKwl1MzIJbG9uZ0RhdGE7CisJdTgJY2hhckRhdGFbNF07CisKKwlzdHJ1Y3QKKwl7CisJCUFDSV9BSUZTTglBY2lBaWZzbjsKKwkJRUNXCQlFY3c7CisJCXUxNgkJVFhPUExpbWl0OworCX1mOwkvLyBGaWVsZAorfUFDX1BBUkFNLCAqUEFDX1BBUkFNOworCisKKworLy8KKy8vIFFvUyBlbGVtZW50IHN1YnR5cGUKKy8vCit0eXBlZGVmCWVudW0gX1FPU19FTEVfU1VCVFlQRXsKKwlRT1NFTEVfVFlQRV9JTkZPCT0gMHgwMCwJCS8vIDB4MDA6IEluZm9ybWF0aW9uIGVsZW1lbnQKKwlRT1NFTEVfVFlQRV9QQVJBTQk9IDB4MDEsCQkvLyAweDAxOiBwYXJhbWV0ZXIgZWxlbWVudAorfVFPU19FTEVfU1VCVFlQRSwqUFFPU19FTEVfU1VCVFlQRTsKKworCisvLworLy8gRGlyZWN0aW9uIEZpZWxkIFZhbHVlcy4KKy8vIFJlZjogV01NIHNwZWMgMi4yLjExOiBXTUUgVFNQRUMgRWxlbWVudCwgcC4xOC4KKy8vCit0eXBlZGVmCWVudW0gX0RJUkVDVElPTl9WQUxVRXsKKwlESVJfVVAJCQk9IDAsCQkvLyAweDAwCS8vIFVwTGluaworCURJUl9ET1dOCQk9IDEsCQkvLyAweDAxCS8vIERvd25MaW5rCisJRElSX0RJUkVDVAkJPSAyLAkJLy8gMHgxMAkvLyBEaXJlY3RMaW5rCisJRElSX0JJX0RJUgkJPSAzLAkJLy8gMHgxMQkvLyBCaS1EaXJlY3Rpb24KK31ESVJFQ1RJT05fVkFMVUUsKlBESVJFQ1RJT05fVkFMVUU7CisKKworLy8KKy8vIFRTIEluZm8gZmllbGQgaW4gV01NIFRTUEVDIEVsZW1lbnQuCisvLyBSZWY6CisvLwkxLiBXTU0gc3BlYyAyLjIuMTE6IFdNRSBUU1BFQyBFbGVtZW50LCBwLjE4LgorLy8JMi4gODE4NSBRb1MgY29kZTogUU9TX1RTSU5GTyBbZGVmLiBpbiBRb1NfbXAuaF0KKy8vCit0eXBlZGVmIHVuaW9uIF9RT1NfVFNJTkZPeworCXU4CQljaGFyRGF0YVszXTsKKwlzdHJ1Y3QgeworCQl1OAkJdWNUcmFmZmljVHlwZToxOwkJCS8vV01NIGlzIHJlc2VydmVkCisJCXU4CQl1Y1RTSUQ6NDsKKwkJdTgJCXVjRGlyZWN0aW9uOjI7CisJCXU4CQl1Y0FjY2Vzc1BvbGljeToyOwkvL1dNTTogYml0OD0wLCBiaXQ3PTEKKwkJdTgJCXVjQWdncmVnYXRpb246MTsJCS8vV01NIGlzIHJlc2VydmVkCisJCXU4CQl1Y1BTQjoxOwkJCQkvL1dNTVNBIGlzIEFQU0QKKwkJdTgJCXVjVVA6MzsKKwkJdTgJCXVjVFNJbmZvQWNrUG9saWN5OjI7CQkvL1dNTSBpcyByZXNlcnZlZAorCQl1OAkJdWNTY2hlZHVsZToxOwkJCS8vV01NIGlzIHJlc2VydmVkCisJCXU4CQl1Y1Jlc2VydmVkOjc7CisJfWZpZWxkOworfVFPU19UU0lORk8sICpQUU9TX1RTSU5GTzsKKworLy8KKy8vIFdNTSBUU1BFQyBCb2R5LgorLy8gUmVmOiBXTU0gc3BlYyAyLjIuMTE6IFdNRSBUU1BFQyBFbGVtZW50LCBwLjE2LgorLy8KK3R5cGVkZWYgdW5pb24gX1RTUEVDX0JPRFl7CisJdTgJCWNoYXJEYXRhWzU1XTsKKworCXN0cnVjdAorCXsKKwkJUU9TX1RTSU5GTwlUU0luZm87CS8vdTgJVFNJbmZvWzNdOworCQl1MTYJTm9taW5hbE1TRFVzaXplOworCQl1MTYJTWF4TVNEVXNpemU7CisJCXUzMglNaW5TZXJ2aWNlSXR2OworCQl1MzIJTWF4U2VydmljZUl0djsKKwkJdTMyCUluYWN0aXZpdHlJdHY7CisJCXUzMglTdXNwZW5JdHY7CisJCXUzMglTZXJ2aWNlU3RhcnRUaW1lOworCQl1MzIJTWluRGF0YVJhdGU7CisJCXUzMglNZWFuRGF0YVJhdGU7CisJCXUzMglQZWFrRGF0YVJhdGU7CisJCXUzMglNYXhCdXJzdFNpemU7CisJCXUzMglEZWxheUJvdW5kOworCQl1MzIJTWluUGh5UmF0ZTsKKwkJdTE2CVN1cnBsdXNCYW5kd2lkdGhBbGxvd2FuY2U7CisJCXUxNglNZWRpdW1UaW1lOworCX0gZjsJLy8gRmllbGQKK31UU1BFQ19CT0RZLCAqUFRTUEVDX0JPRFk7CisKKworLy8KKy8vIFdNTSBUU1BFQyBFbGVtZW50LgorLy8gUmVmOiBXTU0gc3BlYyAyLjIuMTE6IFdNRSBUU1BFQyBFbGVtZW50LCBwLjE2LgorLy8KK3R5cGVkZWYgc3RydWN0IF9XTU1fVFNQRUN7CisJdTgJCUlEOworCXU4CQlMZW5ndGg7CisJdTgJCU9VSVszXTsKKwl1OAkJT1VJX1R5cGU7CisJdTgJCU9VSV9TdWJUeXBlOworCXU4CQlWZXJzaW9uOworCVRTUEVDX0JPRFkJQm9keTsKK30gV01NX1RTUEVDLCAqUFdNTV9UU1BFQzsKKworLy8KKy8vIEFDTSBpbXBsZW1lbnRhdGlvbiBtZXRob2QuCisvLyBBbm5pZSwgMjAwNS0xMi0xMy4KKy8vCit0eXBlZGVmCWVudW0gX0FDTV9NRVRIT0R7CisJZUFjbVdheTBfU3dBbmRIdwkJPSAwLAkJLy8gQnkgU1cgYW5kIEhXLgorCWVBY21XYXkxX0hXCQkJPSAxLAkJLy8gQnkgSFcuCisJZUFjbVdheTJfU1cJCQk9IDIsCQkvLyBCeSBTVy4KK31BQ01fTUVUSE9ELCpQQUNNX01FVEhPRDsKKworCit0eXBlZGVmIHN0cnVjdCBfQUNNeworLy8JdTgJCVJlZ0VuYWJsZUFDTTsKKwl1NjQJCVVzZWRUaW1lOworCXU2NAkJTWVkaXVtVGltZTsKKwl1OAkJSHdBY21DdGw7CS8vIFRSVUU6IFVzZWRUaW1lIGV4Y2VlZCA9PiBEbyBOT1QgVVNFIHRoaXMgQUMuIEl0IHdsbCBiZSB3cml0dGVuIHRvIEFDTV9DT05UUk9MKDB4QkYgQklUIDAvMS8yIGluIDgxODVCKS4KK31BQ00sICpQQUNNOworCit0eXBlZGVmCXU4CQlBQ19VQVBTRCwgKlBBQ19VQVBTRDsKKworI2RlZmluZQlHRVRfVk9fVUFQU0QoX2Fwc2QpICgoX2Fwc2QpICYgQklUMCkKKyNkZWZpbmUJU0VUX1ZPX1VBUFNEKF9hcHNkKSAoKF9hcHNkKSB8PSBCSVQwKQorCisjZGVmaW5lCUdFVF9WSV9VQVBTRChfYXBzZCkgKChfYXBzZCkgJiBCSVQxKQorI2RlZmluZQlTRVRfVklfVUFQU0QoX2Fwc2QpICgoX2Fwc2QpIHw9IEJJVDEpCisKKyNkZWZpbmUJR0VUX0JLX1VBUFNEKF9hcHNkKSAoKF9hcHNkKSAmIEJJVDIpCisjZGVmaW5lCVNFVF9CS19VQVBTRChfYXBzZCkgKChfYXBzZCkgfD0gQklUMikKKworI2RlZmluZQlHRVRfQkVfVUFQU0QoX2Fwc2QpICgoX2Fwc2QpICYgQklUMykKKyNkZWZpbmUJU0VUX0JFX1VBUFNEKF9hcHNkKSAoKF9hcHNkKSB8PSBCSVQzKQorCisKKy8vdHlwZWRlZiBzdHJ1Y3QgX1RDTEFTU3sKKy8vIFRPRE8KKy8vfSBUQ0xBU1MsICpQVENMQVNTOwordHlwZWRlZiB1bmlvbiBfUU9TX1RDTEFTeworCisJc3RydWN0IF9UWVBFX0dFTkVSQUx7CisJCXU4CQlQcmlvcml0eTsKKwkJdTggCQlDbGFzc2lmaWVyVHlwZTsKKwkJdTggCQlNYXNrOworCX0gVFlQRV9HRU5FUkFMOworCisJc3RydWN0IF9UWVBFMF9FVEh7CisJCXU4CQlQcmlvcml0eTsKKwkJdTggCQlDbGFzc2lmaWVyVHlwZTsKKwkJdTggCQlNYXNrOworCQl1OAkJU3JjQWRkcls2XTsKKwkJdTgJCURzdEFkZHJbNl07CisJCXUxNgkJVHlwZTsKKwl9IFRZUEUwX0VUSDsKKworCXN0cnVjdCBfVFlQRTFfSVBWNHsKKwkJdTgJCVByaW9yaXR5OworCQl1OCAJCUNsYXNzaWZpZXJUeXBlOworCQl1OCAJCU1hc2s7CisJCXU4IAkJVmVyc2lvbjsKKwkJdTgJCVNyY0lQWzRdOworCQl1OAkJRHN0SVBbNF07CisJCXUxNgkJU3JjUG9ydDsKKwkJdTE2CQlEc3RQb3J0OworCQl1OAkJRFNDUDsKKwkJdTgJCVByb3RvY29sOworCQl1OAkJUmVzZXJ2ZWQ7CisJfSBUWVBFMV9JUFY0OworCisJc3RydWN0IF9UWVBFMV9JUFY2eworCQl1OAkJUHJpb3JpdHk7CisJCXU4IAkJQ2xhc3NpZmllclR5cGU7CisJCXU4IAkJTWFzazsKKwkJdTggCQlWZXJzaW9uOworCQl1OAkJU3JjSVBbMTZdOworCQl1OAkJRHN0SVBbMTZdOworCQl1MTYJCVNyY1BvcnQ7CisJCXUxNgkJRHN0UG9ydDsKKwkJdTgJCUZsb3dMYWJlbFszXTsKKwl9IFRZUEUxX0lQVjY7CisKKwlzdHJ1Y3QgX1RZUEUyXzgwMjFReworCQl1OAkJUHJpb3JpdHk7CisJCXU4IAkJQ2xhc3NpZmllclR5cGU7CisJCXU4IAkJTWFzazsKKwkJdTE2CQlUYWdUeXBlOworCX0gVFlQRTJfODAyMVE7Cit9IFFPU19UQ0xBUywgKlBRT1NfVENMQVM7CisKKy8vdHlwZWRlZiBzdHJ1Y3QgX1dNTV9UU1RSRUFNeworLy8KKy8vLSBUU1BFQworLy8tIEFDICh3aGljaCB0byBtYXBwaW5nKQorLy99IFdNTV9UU1RSRUFNLCAqUFdNTV9UU1RSRUFNOwordHlwZWRlZiBzdHJ1Y3QgX1FPU19UU1RSRUFNeworCXU4CQkJQUM7CisJV01NX1RTUEVDCQlUU3BlYzsKKwlRT1NfVENMQVMJCVRDbGFzczsKK30gUU9TX1RTVFJFQU0sICpQUU9TX1RTVFJFQU07CisKKy8vdHlwZWRlZiBzdHJ1Y3QgX1VfQVBTRHsKKy8vLSBUcmlnZ2VyRW5hYmxlIFs0XQorLy8tIE1heFNQTGVuZ3RoCisvLy0gSGlnaGVzdEFjQnVmZmVyZWQKKy8vfSBVX0FQU0QsICpQVV9BUFNEOworCisvL2pvc2VwaCBUT0RPOgorLy8JVUFQU0QgZnVuY3Rpb24gc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IDIgZGF0YSBzdHJ1Y3R1cmUKKy8vCSJRb3MgY29udHJvbCBmaWVsZCIgYW5kICJRb3MgaW5mbyBmaWVsZCIKKy8vdHlwZWRlZiBzdHJ1Y3QgX1FPU19VQVBTRHsKKy8vCXU4CQkJYlRyaWdnZXJFbmFibGVbNF07CisvLwl1OCAJCQlNYXhTUExlbmd0aDsKKy8vCXU4CQkJSGlnaGVzdEJ1ZkFDOworLy99IFFPU19VQVBTRCwgKlBRT1NfQVBTRDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgIDgwMi4xMSBNYW5hZ2VtZW50IGZyYW1lIFN0YXR1cyBDb2RlIGZpZWxkCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3R5cGVkZWYgc3RydWN0IF9PQ1RFVF9TVFJJTkd7CisJdTggICAgICAgIAkqT2N0ZXQ7CisJdTE2ICAgICAgICAgICAgIExlbmd0aDsKK31PQ1RFVF9TVFJJTkcsICpQT0NURVRfU1RSSU5HOworLy8KKy8vIFNUQSBRb1MgZGF0YS4KKy8vIFJlZjogRE9UMTFfUU9TIGluIDgxODUgY29kZS4gW2RlZi4gaW4gUW9TX21wLmhdCisvLwordHlwZWRlZiBzdHJ1Y3QgX1NUQV9RT1N7CisJLy9ERUNMQVJFX1JUX09CSkVDVChTVEFfUU9TKTsKKwl1OAkJCQlXTU1JRUJ1ZltNQVhfV01NRUxFX0xFTkdUSF07CisJdTgqCQkJCVdNTUlFOworCisJLy8gUGFydCAxLiBTZWxmIFFvUyBNb2RlLgorCVFPU19NT0RFCQkJUW9zQ2FwYWJpbGl0eTsgLy9Rb1MgQ2FwYWJpbGl0eSwgMjAwNi0wNi0xNCBJc2FpYWgKKwlRT1NfTU9ERQkJCUN1cnJlbnRRb3NNb2RlOworCisJLy8gRm9yIFdNTSBQb3dlciBTYXZlIE1vZGUgOgorCS8vIEFDcyBhcmUgdHJpZ2dlci9kZWxpdmVyeSBlbmFibGVkIG9yIGxlZ2FjeSBwb3dlciBzYXZlIGVuYWJsZWQuIDIwMDYtMDYtMTMgSXNhaWFoCisJQUNfVUFQU0QJCQliNGFjX1VhcHNkOyAgLy9Wb1VhcHNkKGJpdDApLCBWaVVhcHNkKGJpdDEpLCAgQmtVYXBzZChiaXQyKSwgQmVVYXBzZChiaXQzKSwKKwlBQ19VQVBTRAkJCUN1cnI0YWNVYXBzZDsKKwl1OAkJCQliSW5TZXJ2aWNlUGVyaW9kOworCXU4CQkJCU1heFNQTGVuZ3RoOworCWludCAJCQkJTnVtQmNuQmVmb3JlVHJpZ2dlcjsKKworCS8vIFBhcnQgMi4gRURDQSBQYXJhbWV0ZXIgKHBlckFDKQorCXU4ICoJCQkJcFdNTUluZm9FbGU7CisJdTgJCQkJV01NUGFyYW1FbGVbV01NX1BBUkFNX0VMRU1FTlRfU0laRV07CisJdTgJCQkJV01NUEVMZW5ndGg7CisKKwkvLyA8QnJ1Y2VfTm90ZT4KKwkvLzIgVG9EbzogcmVtb3ZlIHRoZSBRb3MgSW5mbyBGaWVsZCBhbmQgcmVwbGFjZSBpdCBieSB0aGUgYWJvdmUgV01NIEluZm8gZWxlbWVudC4KKwkvLyBCeSBCcnVjZSwgMjAwOC0wMS0zMC4KKwkvLyBQYXJ0IDIuIEVEQ0EgUGFyYW1ldGVyIChwZXJBQykKKwlRT1NfSU5GT19GSUVMRAkJCVFvc0luZm9GaWVsZF9TVEE7IAkvLyBNYWludGFpbmVkIGJ5IFNUQQorCVFPU19JTkZPX0ZJRUxECQkJUW9zSW5mb0ZpZWxkX0FQOwkvLyBSZXRyaWV2ZWQgZnJvbSBBUAorCisJQUNfUEFSQU0JCQlDdXJBY1BhcmFtZXRlcnNbNF07CisKKwkvLyBQYXJ0IDMuIEFDTQorCUFDTQkJCQlhY21bNF07CisJQUNNX01FVEhPRAkJCUFjbU1ldGhvZDsKKworCS8vIFBhcnQgNC4gUGVyIFRJRCAoUGFydCA1OiBUQ0xBU1Mgd2lsbCBiZSBkZXNjcmliZWQgYnkgVFN0cmVhbSkKKwlRT1NfVFNUUkVBTQkJCVRTdHJlYW1bMTZdOworCVdNTV9UU1BFQwkJCVRTcGVjOworCisJdTMyCQkJCVFCc3NXaXJlbGVzc01vZGU7CisKKwkvLyBObyBBY2sgU2V0dGluZworCXU4CQkJCWJOb0FjazsKKworCS8vIEVuYWJsZS9EaXNhYmxlIFJ4IGltbWVkaWF0ZSBCQSBjYXBhYmlsaXR5LgorCXU4CQkJCWJFbmFibGVSeEltbUJBOworCit9U1RBX1FPUywgKlBTVEFfUU9TOworCisvLworLy8gQlNTIFFPUyBkYXRhLgorLy8gUmVmOiBCc3NEc2NyIGluIDgxODUgY29kZS4gW2RlZi4gaW4gQnNzRHNjci5oXQorLy8KK3R5cGVkZWYgc3RydWN0IF9CU1NfUU9TeworCVFPU19NT0RFCQliZFFvU01vZGU7CisKKwl1OAkJCWJkV01NSUVCdWZbTUFYX1dNTUVMRV9MRU5HVEhdOworCXU4KgkJYmRXTU1JRTsKKworCVFPU19FTEVfU1VCVFlQRQkJRWxlU3ViVHlwZTsKKworCXU4ICoJCQlwV01NSW5mb0VsZTsKKwl1OCAqCQkJcFdNTVBhcmFtRWxlOworCisJUU9TX0lORk9fRklFTEQJCVFvc0luZm9GaWVsZDsKKwlBQ19QQVJBTQkJQWNQYXJhbWV0ZXJbNF07Cit9QlNTX1FPUywgKlBCU1NfUU9TOworCisKKy8vCisvLyBSZWY6IHNRb1NDdGxMbmcgYW5kIFFvU0N0bCBkZWZpbml0aW9uIGluIDgxODUgUW9TIGNvZGUuCisvLyNkZWZpbmUgUW9TQ3RsICAgKCgJKEFkYXB0ZXItPmJSZWdRb1MpICYmIChBZGFwdGVyLT5kb3QxMVFvUy5Rb1NNb2RlICYoUU9TX0VEQ0F8UU9TX0hDQ0EpKQkgICkgID9zUW9TQ3RsTG5nOjApCisvLworI2RlZmluZSBzUW9TQ3RsTG5nCQkJMgorI2RlZmluZQlRT1NfQ1RSTF9MRU4oX1Fvc01vZGUpCQkoKF9Rb3NNb2RlID4gUU9TX0RJU0FCTEUpPyBzUW9TQ3RsTG5nIDogMCkKKworCisvL0FkZGVkIGJ5IGpvc2VwaAorLy9VUCBNYXBwaW5nIHRvIEFDLCB1c2luZyBpbiBNZ250UXVlcnlfU2VxdWVuY2VOdW1iZXIoKSBhbmQgbWF5YmUgZm9yIERTQ1AKKy8vI2RlZmluZSBVUDJBQyh1cCkJCQkoKHVwPDMpPygodXA9PTApPzE6MCk6KHVwPj4xKSkKKyNkZWZpbmUgSXNBQ1ZhbGlkKGFjKQkJCSgoYWM8PTcgKT90cnVlOmZhbHNlICkKKworI2VuZGlmIC8vICNpZm5kZWYgX19JTkNfUU9TX1RZUEVfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X1RTLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfVFMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWFhYzIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X1RTLmgKQEAgLTAsMCArMSw1NiBAQAorI2lmbmRlZiBfVFNUWVBFX0hfCisjZGVmaW5lIF9UU1RZUEVfSF8KKyNpbmNsdWRlICJydGw4MTl4X1Fvcy5oIgorI2RlZmluZSBUU19TRVRVUF9USU1FT1VUCTYwICAvLyBJbiBtaWxsaXNlY29uZAorI2RlZmluZSBUU19JTkFDVF9USU1FT1VUCTYwCisjZGVmaW5lIFRTX0FEREJBX0RFTEFZCQk2MAorCisjZGVmaW5lIFRPVEFMX1RTX05VTQkJMTYKKyNkZWZpbmUgVENMQVNfTlVNCQk0CisKKy8vIFRoaXMgZGVmaW5lIHRoZSBUeC9SeCBkaXJlY3Rpb25zCit0eXBlZGVmIGVudW0gX1RSX1NFTEVDVCB7CisJVFhfRElSID0gMCwKKwlSWF9ESVIgPSAxLAorfSBUUl9TRUxFQ1QsICpQVFJfU0VMRUNUOworCit0eXBlZGVmIHN0cnVjdCBfVFNfQ09NTU9OX0lORk97CisJc3RydWN0IGxpc3RfaGVhZAkJTGlzdDsKKwlzdHJ1Y3QgdGltZXJfbGlzdAkJU2V0dXBUaW1lcjsKKwlzdHJ1Y3QgdGltZXJfbGlzdAkJSW5hY3RUaW1lcjsKKwl1OAkJCQlBZGRyWzZdOworCVRTUEVDX0JPRFkJCQlUU3BlYzsKKwlRT1NfVENMQVMJCQlUQ2xhc3NbVENMQVNfTlVNXTsKKwl1OAkJCQlUQ2xhc1Byb2M7CisJdTgJCQkJVENsYXNOdW07Cit9IFRTX0NPTU1PTl9JTkZPLCAqUFRTX0NPTU1PTl9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBfVFhfVFNfUkVDT1JEeworCVRTX0NPTU1PTl9JTkZPCQlUc0NvbW1vbkluZm87CisJdTE2CQkJCVR4Q3VyU2VxOworCUJBX1JFQ09SRAkJCVR4UGVuZGluZ0JBUmVjb3JkOyAgCS8vIEZvciBCQSBPcmlnaW5hdG9yCisJQkFfUkVDT1JECQkJVHhBZG1pdHRlZEJBUmVjb3JkOwkvLyBGb3IgQkEgT3JpZ2luYXRvcgorLy8JUU9TX0RMX1JFQ09SRAkJRExSZWNvcmQ7CisJdTgJCQkJYkFkZEJhUmVxSW5Qcm9ncmVzczsKKwl1OAkJCQliQWRkQmFSZXFEZWxheWVkOworCXU4CQkJCWJVc2luZ0JhOworCXN0cnVjdCB0aW1lcl9saXN0CQlUc0FkZEJhVGltZXI7CisJdTgJCQkJbnVtOworfSBUWF9UU19SRUNPUkQsICpQVFhfVFNfUkVDT1JEOworCit0eXBlZGVmIHN0cnVjdCBfUlhfVFNfUkVDT1JEIHsKKwlUU19DT01NT05fSU5GTwkJVHNDb21tb25JbmZvOworCXUxNgkJCQlSeEluZGljYXRlU2VxOworCXUxNgkJCQlSeFRpbWVvdXRJbmRpY2F0ZVNlcTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlSeFBlbmRpbmdQa3RMaXN0OworCXN0cnVjdCB0aW1lcl9saXN0CQlSeFBrdFBlbmRpbmdUaW1lcjsKKwlCQV9SRUNPUkQJCQlSeEFkbWl0dGVkQkFSZWNvcmQ7CSAvLyBGb3IgQkEgUmVjZXBpZW50CisJdTE2CQkJCVJ4TGFzdFNlcU51bTsKKwl1OAkJCQlSeExhc3RGcmFnTnVtOworCXU4CQkJCW51bTsKKy8vCVFPU19ETF9SRUNPUkQJCURMUmVjb3JkOworfSBSWF9UU19SRUNPUkQsICpQUlhfVFNfUkVDT1JEOworCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfVFNQcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfVFNQcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM3M2Q1NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9UU1Byb2MuYwpAQCAtMCwwICsxLDYyOCBAQAorI2luY2x1ZGUgImllZWU4MDIxMS5oIgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSAicnRsODE5eF9UUy5oIgorCit2b2lkIFRzU2V0dXBUaW1lT3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwkvLyBOb3QgaW1wbGVtZW50IHlldAorCS8vIFRoaXMgaXMgdXNlZCBmb3IgV01NU0EgYW5kIEFDTSAsIHRoYXQgd291bGQgc2VuZCBBRERUU1JlcSBmcmFtZS4KK30KKwordm9pZCBUc0luYWN0VGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJLy8gTm90IGltcGxlbWVudCB5ZXQKKwkvLyBUaGlzIGlzIHVzZWQgZm9yIFdNTVNBIGFuZCBBQ00uCisJLy8gVGhpcyBmdW5jdGlvbiB3b3VsZCBiZSBjYWxsIHdoZW4gVFMgaXMgbm8gVHgvUnggZm9yIHNvbWUgcGVyaW9kIG9mIHRpbWUuCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIEkgc3RpbGwgbm90IHVuZGVyc3RhbmQgdGhpcyBmdW5jdGlvbiwgc28gd2FpdCBmb3IgZnVydGhlciBpbXBsZW1lbnRhdGlvbgorICogICBpbnB1dDogIHVuc2lnbmVkIGxvbmcJIGRhdGEJCS8vYWN0dXJhbGx5IHdlIHNlbmQgVFhfVFNfUkVDT1JEIG9yIFJYX1RTX1JFQ09SRCB0byB0aGVzZSB0aW1lcgorICogIHJldHVybjogIE5VTEwKKyAqICBub3RpY2U6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUnhQa3RQZW5kaW5nVGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJUFJYX1RTX1JFQ09SRAlwUnhUcyA9IChQUlhfVFNfUkVDT1JEKWRhdGE7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YocFJ4VHMsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBSeFRzUmVjb3JkW3BSeFRzLT5udW1dKTsKKworCVBSWF9SRU9SREVSX0VOVFJZIAlwUmVvcmRlckVudHJ5ID0gTlVMTDsKKworCS8vdTMyIGZsYWdzID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4YiAqc3RhdHNfSW5kaWNhdGVBcnJheVtSRU9SREVSX1dJTl9TSVpFXTsKKwl1OCBpbmRleCA9IDA7CisJYm9vbCBiUGt0SW5CdWYgPSBmYWxzZTsKKworCisJc3Bpbl9sb2NrX2lycXNhdmUoJihpZWVlLT5yZW9yZGVyX3NwaW5sb2NrKSwgZmxhZ3MpOworCS8vUGxhdGZvcm1BY3F1aXJlU3BpbkxvY2soQWRhcHRlciwgUlRfUlhfU1BJTkxPQ0spOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwiPT09PT09PT09PT09PT09PT09PiVzKClcbiIsX19GVU5DVElPTl9fKTsKKwlpZihwUnhUcy0+UnhUaW1lb3V0SW5kaWNhdGVTZXEgIT0gMHhmZmZmKQorCXsKKwkJLy8gSW5kaWNhdGUgdGhlIHBlbmRpbmcgcGFja2V0cyBzZXF1ZW50aWFsbHkgYWNjb3JkaW5nIHRvIFNlcU51bSB1bnRpbCBtZWV0IHRoZSBnYXAuCisJCXdoaWxlKCFsaXN0X2VtcHR5KCZwUnhUcy0+UnhQZW5kaW5nUGt0TGlzdCkpCisJCXsKKwkJCXBSZW9yZGVyRW50cnkgPSAoUFJYX1JFT1JERVJfRU5UUlkpbGlzdF9lbnRyeShwUnhUcy0+UnhQZW5kaW5nUGt0TGlzdC5wcmV2LFJYX1JFT1JERVJfRU5UUlksTGlzdCk7CisJCQlpZihpbmRleCA9PSAwKQorCQkJCXBSeFRzLT5SeEluZGljYXRlU2VxID0gcFJlb3JkZXJFbnRyeS0+U2VxTnVtOworCisJCQlpZiggU05fTEVTUyhwUmVvcmRlckVudHJ5LT5TZXFOdW0sIHBSeFRzLT5SeEluZGljYXRlU2VxKSB8fAorCQkJCVNOX0VRVUFMKHBSZW9yZGVyRW50cnktPlNlcU51bSwgcFJ4VHMtPlJ4SW5kaWNhdGVTZXEpCSkKKwkJCXsKKwkJCQlsaXN0X2RlbF9pbml0KCZwUmVvcmRlckVudHJ5LT5MaXN0KTsKKworCQkJCWlmKFNOX0VRVUFMKHBSZW9yZGVyRW50cnktPlNlcU51bSwgcFJ4VHMtPlJ4SW5kaWNhdGVTZXEpKQorCQkJCQlwUnhUcy0+UnhJbmRpY2F0ZVNlcSA9IChwUnhUcy0+UnhJbmRpY2F0ZVNlcSArIDEpICUgNDA5NjsKKworCQkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwiUnhQa3RQZW5kaW5nVGltZW91dCgpOiBJbmRpY2F0ZVNlcTogJWRcbiIsIHBSZW9yZGVyRW50cnktPlNlcU51bSk7CisJCQkJc3RhdHNfSW5kaWNhdGVBcnJheVtpbmRleF0gPSBwUmVvcmRlckVudHJ5LT5wcnhiOworCQkJCWluZGV4Kys7CisKKwkJCQlsaXN0X2FkZF90YWlsKCZwUmVvcmRlckVudHJ5LT5MaXN0LCAmaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQliUGt0SW5CdWYgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYoaW5kZXg+MCkKKwl7CisJCS8vIFNldCBSeFRpbWVvdXRJbmRpY2F0ZVNlcSB0byAweGZmZmYgdG8gaW5kaWNhdGUgbm8gcGVuZGluZyBwYWNrZXRzIGluIGJ1ZmZlciBub3cuCisJCXBSeFRzLT5SeFRpbWVvdXRJbmRpY2F0ZVNlcSA9IDB4ZmZmZjsKKworCQkvLyBJbmRpY2F0ZSBwYWNrZXRzCisJCWlmKGluZGV4ID4gUkVPUkRFUl9XSU5fU0laRSl7CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIlJ4UmVvcmRlckluZGljYXRlUGFja2V0KCk6IFJ4IFJlb3JlciBidWZmZXIgZnVsbCEhIFxuIik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZWVlODAyMTFfaW5kaWNhdGVfcGFja2V0cyhpZWVlLCBzdGF0c19JbmRpY2F0ZUFycmF5LCBpbmRleCk7CisJfQorCisJaWYoYlBrdEluQnVmICYmIChwUnhUcy0+UnhUaW1lb3V0SW5kaWNhdGVTZXE9PTB4ZmZmZikpCisJeworCQlwUnhUcy0+UnhUaW1lb3V0SW5kaWNhdGVTZXEgPSBwUnhUcy0+UnhJbmRpY2F0ZVNlcTsKKwkJaWYodGltZXJfcGVuZGluZygmcFJ4VHMtPlJ4UGt0UGVuZGluZ1RpbWVyKSkKKwkJCWRlbF90aW1lcl9zeW5jKCZwUnhUcy0+UnhQa3RQZW5kaW5nVGltZXIpOworCQlwUnhUcy0+UnhQa3RQZW5kaW5nVGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBpZWVlLT5wSFRJbmZvLT5SeFJlb3JkZXJQZW5kaW5nVGltZTsKKwkJYWRkX3RpbWVyKCZwUnhUcy0+UnhQa3RQZW5kaW5nVGltZXIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksIGZsYWdzKTsKKwkvL1BsYXRmb3JtUmVsZWFzZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1JYX1NQSU5MT0NLKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgQWRkIEJBIHRpbWVyIGZ1bmN0aW9uCisgKiAgIGlucHV0OiAgdW5zaWduZWQgbG9uZwkgZGF0YQkJLy9hY3R1cmFsbHkgd2Ugc2VuZCBUWF9UU19SRUNPUkQgb3IgUlhfVFNfUkVDT1JEIHRvIHRoZXNlIHRpbWVyCisgKiAgcmV0dXJuOiAgTlVMTAorICogIG5vdGljZToKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBUc0FkZEJhUHJvY2Vzcyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJUFRYX1RTX1JFQ09SRAlwVHhUcyA9IChQVFhfVFNfUkVDT1JEKWRhdGE7CisJdTggbnVtID0gcFR4VHMtPm51bTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihwVHhUcywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIFR4VHNSZWNvcmRbbnVtXSk7CisKKwlUc0luaXRBZGRCQShpZWVlLCBwVHhUcywgQkFfUE9MSUNZX0lNTUVESUFURSwgZmFsc2UpOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfQkEsICJUc0FkZEJhUHJvY2VzcygpOiBBRERCQSBSZXEgaXMgc3RhcnRlZCEhIFxuIik7Cit9CisKKwordm9pZCBSZXNldFRzQ29tbW9uSW5mbyhQVFNfQ09NTU9OX0lORk8JcFRzQ29tbW9uSW5mbykKK3sKKwltZW1zZXQocFRzQ29tbW9uSW5mby0+QWRkciwgMCwgNik7CisJbWVtc2V0KCZwVHNDb21tb25JbmZvLT5UU3BlYywgMCwgc2l6ZW9mKFRTUEVDX0JPRFkpKTsKKwltZW1zZXQoJnBUc0NvbW1vbkluZm8tPlRDbGFzcywgMCwgc2l6ZW9mKFFPU19UQ0xBUykqVENMQVNfTlVNKTsKKwlwVHNDb21tb25JbmZvLT5UQ2xhc1Byb2MgPSAwOworCXBUc0NvbW1vbkluZm8tPlRDbGFzTnVtID0gMDsKK30KKwordm9pZCBSZXNldFR4VHNFbnRyeShQVFhfVFNfUkVDT1JEIHBUUykKK3sKKwlSZXNldFRzQ29tbW9uSW5mbygmcFRTLT5Uc0NvbW1vbkluZm8pOworCXBUUy0+VHhDdXJTZXEgPSAwOworCXBUUy0+YkFkZEJhUmVxSW5Qcm9ncmVzcyA9IGZhbHNlOworCXBUUy0+YkFkZEJhUmVxRGVsYXllZCA9IGZhbHNlOworCXBUUy0+YlVzaW5nQmEgPSBmYWxzZTsKKwlSZXNldEJhRW50cnkoJnBUUy0+VHhBZG1pdHRlZEJBUmVjb3JkKTsgLy9Gb3IgQkEgT3JpZ2luYXRvcgorCVJlc2V0QmFFbnRyeSgmcFRTLT5UeFBlbmRpbmdCQVJlY29yZCk7Cit9CisKK3ZvaWQgUmVzZXRSeFRzRW50cnkoUFJYX1RTX1JFQ09SRCBwVFMpCit7CisJUmVzZXRUc0NvbW1vbkluZm8oJnBUUy0+VHNDb21tb25JbmZvKTsKKwlwVFMtPlJ4SW5kaWNhdGVTZXEgPSAweGZmZmY7IC8vIFRoaXMgaW5kaWNhdGUgdGhlIFJ4SW5kaWNhdGVTZXEgaXMgbm90IHVzZWQgbm93ISEKKwlwVFMtPlJ4VGltZW91dEluZGljYXRlU2VxID0gMHhmZmZmOyAvLyBUaGlzIGluZGljYXRlIHRoZSBSeFRpbWVvdXRJbmRpY2F0ZVNlcSBpcyBub3QgdXNlZCBub3chIQorCVJlc2V0QmFFbnRyeSgmcFRTLT5SeEFkbWl0dGVkQkFSZWNvcmQpOwkgIC8vIEZvciBCQSBSZWNlcGllbnQKK30KKwordm9pZCBUU0luaXRpYWxpemUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJUFRYX1RTX1JFQ09SRAkJcFR4VFMgID0gaWVlZS0+VHhUc1JlY29yZDsKKwlQUlhfVFNfUkVDT1JECQlwUnhUUyAgPSBpZWVlLT5SeFRzUmVjb3JkOworCVBSWF9SRU9SREVSX0VOVFJZCXBSeFJlb3JkZXJFbnRyeSA9IGllZWUtPlJ4UmVvcmRlckVudHJ5OworCXU4CQkJCWNvdW50ID0gMDsKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RTLCAiPT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCS8vIEluaXRpYWxpemUgVHggVFMgcmVsYXRlZCBpbmZvLgorCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5UeF9UU19BZG1pdF9MaXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+VHhfVFNfUGVuZGluZ19MaXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+VHhfVFNfVW51c2VkX0xpc3QpOworCisJZm9yKGNvdW50ID0gMDsgY291bnQgPCBUT1RBTF9UU19OVU07IGNvdW50KyspCisJeworCQkvLworCQlwVHhUUy0+bnVtID0gY291bnQ7CisJCS8vIFRoZSB0aW1lcnMgZm9yIHRoZSBvcGVyYXRpb24gb2YgVHJhZmZpYyBTdHJlYW0gYW5kIEJsb2NrIEFjay4KKwkJLy8gRExTIHJlbGF0ZWQgdGltZXIgd2lsbCBiZSBhZGQgaGVyZSBpbiB0aGUgZnV0dXJlISEKKwkJaW5pdF90aW1lcigmcFR4VFMtPlRzQ29tbW9uSW5mby5TZXR1cFRpbWVyKTsKKwkJcFR4VFMtPlRzQ29tbW9uSW5mby5TZXR1cFRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVHhUUzsKKwkJcFR4VFMtPlRzQ29tbW9uSW5mby5TZXR1cFRpbWVyLmZ1bmN0aW9uID0gVHNTZXR1cFRpbWVPdXQ7CisKKwkJaW5pdF90aW1lcigmcFR4VFMtPlRzQ29tbW9uSW5mby5JbmFjdFRpbWVyKTsKKwkJcFR4VFMtPlRzQ29tbW9uSW5mby5JbmFjdFRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVHhUUzsKKwkJcFR4VFMtPlRzQ29tbW9uSW5mby5JbmFjdFRpbWVyLmZ1bmN0aW9uID0gVHNJbmFjdFRpbWVvdXQ7CisKKwkJaW5pdF90aW1lcigmcFR4VFMtPlRzQWRkQmFUaW1lcik7CisJCXBUeFRTLT5Uc0FkZEJhVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBUeFRTOworCQlwVHhUUy0+VHNBZGRCYVRpbWVyLmZ1bmN0aW9uID0gVHNBZGRCYVByb2Nlc3M7CisKKwkJaW5pdF90aW1lcigmcFR4VFMtPlR4UGVuZGluZ0JBUmVjb3JkLlRpbWVyKTsKKwkJcFR4VFMtPlR4UGVuZGluZ0JBUmVjb3JkLlRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVHhUUzsKKwkJcFR4VFMtPlR4UGVuZGluZ0JBUmVjb3JkLlRpbWVyLmZ1bmN0aW9uID0gQmFTZXR1cFRpbWVPdXQ7CisKKwkJaW5pdF90aW1lcigmcFR4VFMtPlR4QWRtaXR0ZWRCQVJlY29yZC5UaW1lcik7CisJCXBUeFRTLT5UeEFkbWl0dGVkQkFSZWNvcmQuVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBUeFRTOworCQlwVHhUUy0+VHhBZG1pdHRlZEJBUmVjb3JkLlRpbWVyLmZ1bmN0aW9uID0gVHhCYUluYWN0VGltZW91dDsKKworCQlSZXNldFR4VHNFbnRyeShwVHhUUyk7CisJCWxpc3RfYWRkX3RhaWwoJnBUeFRTLT5Uc0NvbW1vbkluZm8uTGlzdCwgJmllZWUtPlR4X1RTX1VudXNlZF9MaXN0KTsKKwkJcFR4VFMrKzsKKwl9CisKKwkvLyBJbml0aWFsaXplIFJ4IFRTIHJlbGF0ZWQgaW5mby4KKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+UnhfVFNfQWRtaXRfTGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmllZWUtPlJ4X1RTX1BlbmRpbmdfTGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmllZWUtPlJ4X1RTX1VudXNlZF9MaXN0KTsKKwlmb3IoY291bnQgPSAwOyBjb3VudCA8IFRPVEFMX1RTX05VTTsgY291bnQrKykKKwl7CisJCXBSeFRTLT5udW0gPSBjb3VudDsKKwkJSU5JVF9MSVNUX0hFQUQoJnBSeFRTLT5SeFBlbmRpbmdQa3RMaXN0KTsKKworCQlpbml0X3RpbWVyKCZwUnhUUy0+VHNDb21tb25JbmZvLlNldHVwVGltZXIpOworCQlwUnhUUy0+VHNDb21tb25JbmZvLlNldHVwVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBSeFRTOworCQlwUnhUUy0+VHNDb21tb25JbmZvLlNldHVwVGltZXIuZnVuY3Rpb24gPSBUc1NldHVwVGltZU91dDsKKworCQlpbml0X3RpbWVyKCZwUnhUUy0+VHNDb21tb25JbmZvLkluYWN0VGltZXIpOworCQlwUnhUUy0+VHNDb21tb25JbmZvLkluYWN0VGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBSeFRTOworCQlwUnhUUy0+VHNDb21tb25JbmZvLkluYWN0VGltZXIuZnVuY3Rpb24gPSBUc0luYWN0VGltZW91dDsKKworCQlpbml0X3RpbWVyKCZwUnhUUy0+UnhBZG1pdHRlZEJBUmVjb3JkLlRpbWVyKTsKKwkJcFJ4VFMtPlJ4QWRtaXR0ZWRCQVJlY29yZC5UaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFJ4VFM7CisJCXBSeFRTLT5SeEFkbWl0dGVkQkFSZWNvcmQuVGltZXIuZnVuY3Rpb24gPSBSeEJhSW5hY3RUaW1lb3V0OworCisJCWluaXRfdGltZXIoJnBSeFRTLT5SeFBrdFBlbmRpbmdUaW1lcik7CisJCXBSeFRTLT5SeFBrdFBlbmRpbmdUaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFJ4VFM7CisJCXBSeFRTLT5SeFBrdFBlbmRpbmdUaW1lci5mdW5jdGlvbiA9IFJ4UGt0UGVuZGluZ1RpbWVvdXQ7CisKKwkJUmVzZXRSeFRzRW50cnkocFJ4VFMpOworCQlsaXN0X2FkZF90YWlsKCZwUnhUUy0+VHNDb21tb25JbmZvLkxpc3QsICZpZWVlLT5SeF9UU19VbnVzZWRfTGlzdCk7CisJCXBSeFRTKys7CisJfQorCS8vIEluaXRpYWxpemUgdW51c2VkIFJ4IFJlb3JkZXIgTGlzdC4KKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0KTsKKy8vI2lmZGVmIFRPX0RPX0xJU1QKKwlmb3IoY291bnQgPSAwOyBjb3VudCA8IFJFT1JERVJfRU5UUllfTlVNOyBjb3VudCsrKQorCXsKKwkJbGlzdF9hZGRfdGFpbCggJnBSeFJlb3JkZXJFbnRyeS0+TGlzdCwmaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0KTsKKwkJaWYoY291bnQgPT0gKFJFT1JERVJfRU5UUllfTlVNLTEpKQorCQkJYnJlYWs7CisJCXBSeFJlb3JkZXJFbnRyeSA9ICZpZWVlLT5SeFJlb3JkZXJFbnRyeVtjb3VudCsxXTsKKwl9CisvLyNlbmRpZgorCit9CisKK3ZvaWQgQWRtaXRUUyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgUFRTX0NPTU1PTl9JTkZPIHBUc0NvbW1vbkluZm8sIHUzMiBJbmFjdFRpbWUpCit7CisJZGVsX3RpbWVyX3N5bmMoJnBUc0NvbW1vbkluZm8tPlNldHVwVGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZwVHNDb21tb25JbmZvLT5JbmFjdFRpbWVyKTsKKworCWlmKEluYWN0VGltZSE9MCkKKwkJbW9kX3RpbWVyKCZwVHNDb21tb25JbmZvLT5JbmFjdFRpbWVyLCBqaWZmaWVzICsgTVNFQ1MoSW5hY3RUaW1lKSk7Cit9CisKKworUFRTX0NPTU1PTl9JTkZPIFNlYXJjaEFkbWl0VFJTdHJlYW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4KglBZGRyLCB1OCBUSUQsIFRSX1NFTEVDVAlUeFJ4U2VsZWN0KQoreworCS8vRElSRUNUSU9OX1ZBTFVFIAlkaXI7CisJdTggCWRpcjsKKwlib29sCQkJCXNlYXJjaF9kaXJbNF0gPSB7MCwgMCwgMCwgMH07CisJc3RydWN0IGxpc3RfaGVhZCoJCXBzZWFyY2hfbGlzdDsgLy9GSVhNRQorCVBUU19DT01NT05fSU5GTwlwUmV0ID0gTlVMTDsKKwlpZihpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSAvL2FwIG1vZGUKKwl7CisJCWlmKFR4UnhTZWxlY3QgPT0gVFhfRElSKQorCQl7CisJCQlzZWFyY2hfZGlyW0RJUl9ET1dOXSA9IHRydWU7CisJCQlzZWFyY2hfZGlyW0RJUl9CSV9ESVJdPSB0cnVlOworCQl9CisJCWVsc2UKKwkJeworCQkJc2VhcmNoX2RpcltESVJfVVBdIAk9IHRydWU7CisJCQlzZWFyY2hfZGlyW0RJUl9CSV9ESVJdPSB0cnVlOworCQl9CisJfQorCWVsc2UgaWYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCXsKKwkJaWYoVHhSeFNlbGVjdCA9PSBUWF9ESVIpCisJCQlzZWFyY2hfZGlyW0RJUl9VUF0gCT0gdHJ1ZTsKKwkJZWxzZQorCQkJc2VhcmNoX2RpcltESVJfRE9XTl0gPSB0cnVlOworCX0KKwllbHNlCisJeworCQlpZihUeFJ4U2VsZWN0ID09IFRYX0RJUikKKwkJeworCQkJc2VhcmNoX2RpcltESVJfVVBdIAk9IHRydWU7CisJCQlzZWFyY2hfZGlyW0RJUl9CSV9ESVJdPSB0cnVlOworCQkJc2VhcmNoX2RpcltESVJfRElSRUNUXT0gdHJ1ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXNlYXJjaF9kaXJbRElSX0RPV05dID0gdHJ1ZTsKKwkJCXNlYXJjaF9kaXJbRElSX0JJX0RJUl09IHRydWU7CisJCQlzZWFyY2hfZGlyW0RJUl9ESVJFQ1RdPSB0cnVlOworCQl9CisJfQorCisJaWYoVHhSeFNlbGVjdCA9PSBUWF9ESVIpCisJCXBzZWFyY2hfbGlzdCA9ICZpZWVlLT5UeF9UU19BZG1pdF9MaXN0OworCWVsc2UKKwkJcHNlYXJjaF9saXN0ID0gJmllZWUtPlJ4X1RTX0FkbWl0X0xpc3Q7CisKKwkvL2ZvcihkaXIgPSBESVJfVVA7IGRpciA8PSBESVJfQklfRElSOyBkaXIrKykKKwlmb3IoZGlyID0gMDsgZGlyIDw9IERJUl9CSV9ESVI7IGRpcisrKQorCXsKKwkJaWYoc2VhcmNoX2RpcltkaXJdID09ZmFsc2UgKQorCQkJY29udGludWU7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocFJldCwgcHNlYXJjaF9saXN0LCBMaXN0KXsKKwkvLwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9UUywgIkFERDoiTUFDX0ZNVCIsIFRJRDolZCwgZGlyOiVkXG4iLCBNQUNfQVJHKHBSZXQtPkFkZHIpLCBwUmV0LT5UU3BlYy5mLlRTSW5mby5maWVsZC51Y1RTSUQsIHBSZXQtPlRTcGVjLmYuVFNJbmZvLmZpZWxkLnVjRGlyZWN0aW9uKTsKKwkJCWlmIChtZW1jbXAocFJldC0+QWRkciwgQWRkciwgNikgPT0gMCkKKwkJCQlpZiAocFJldC0+VFNwZWMuZi5UU0luZm8uZmllbGQudWNUU0lEID09IFRJRCkKKwkJCQkJaWYocFJldC0+VFNwZWMuZi5UU0luZm8uZmllbGQudWNEaXJlY3Rpb24gPT0gZGlyKQorCQkJCQl7CisJLy8JCQkJCXByaW50aygiQmluZ28hIGdvdCBpdFxuIik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCX0KKwkJaWYoJnBSZXQtPkxpc3QgICE9IHBzZWFyY2hfbGlzdCkKKwkJCWJyZWFrOworCX0KKworCWlmKCZwUmV0LT5MaXN0ICAhPSBwc2VhcmNoX2xpc3QpeworCQlyZXR1cm4gcFJldCA7CisJfQorCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgTWFrZVRTRW50cnkoCisJCVBUU19DT01NT05fSU5GTwlwVHNDb21tb25JbmZvLAorCQl1OCoJCUFkZHIsCisJCVBUU1BFQ19CT0RZCXBUU1BFQywKKwkJUFFPU19UQ0xBUwlwVENMQVMsCisJCXU4CQlUQ0xBU19OdW0sCisJCXU4CQlUQ0xBU19Qcm9jCisJKQoreworCXU4CWNvdW50OworCisJaWYocFRzQ29tbW9uSW5mbyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwltZW1jcHkocFRzQ29tbW9uSW5mby0+QWRkciwgQWRkciwgNik7CisKKwlpZihwVFNQRUMgIT0gTlVMTCkKKwkJbWVtY3B5KCh1OCopKCYocFRzQ29tbW9uSW5mby0+VFNwZWMpKSwgKHU4KilwVFNQRUMsIHNpemVvZihUU1BFQ19CT0RZKSk7CisKKwlmb3IoY291bnQgPSAwOyBjb3VudCA8IFRDTEFTX051bTsgY291bnQrKykKKwkJbWVtY3B5KCh1OCopKCYocFRzQ29tbW9uSW5mby0+VENsYXNzW2NvdW50XSkpLCAodTgqKXBUQ0xBUywgc2l6ZW9mKFFPU19UQ0xBUykpOworCisJcFRzQ29tbW9uSW5mby0+VENsYXNQcm9jID0gVENMQVNfUHJvYzsKKwlwVHNDb21tb25JbmZvLT5UQ2xhc051bSA9IFRDTEFTX051bTsKK30KKworCitib29sIEdldFRzKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKglpZWVlLAorCVBUU19DT01NT05fSU5GTwkJCSpwcFRTLAorCXU4KgkJCQlBZGRyLAorCXU4CQkJCVRJRCwKKwlUUl9TRUxFQ1QJCQlUeFJ4U2VsZWN0LCAgLy9SeDoxLCBUeDowCisJYm9vbAkJCQliQWRkTmV3VHMKKwkpCit7CisJdTgJVVAgPSAwOworCS8vCisJLy8gV2UgZG8gbm90IGJ1aWxkIGFueSBUUyBmb3IgQnJvYWRjYXN0IG9yIE11bHRpY2FzdCBzdHJlYW0uCisJLy8gU28gcmVqZWN0IHRoZXNlIGtpbmRzIG9mIHNlYXJjaCBoZXJlLgorCS8vCisJaWYoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoQWRkcikgfHwgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoQWRkcikpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImdldCBUUyBmb3IgQnJvYWRjYXN0IG9yIE11bHRpY2FzdFxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5zdXBwb3J0ZWQgPT0gMCkKKwkJVVAgPSAwOworCWVsc2UKKwl7CisJCS8vIEluIFdNTSBjYXNlOiB3ZSB1c2UgNCBUSUQgb25seQorCQlpZiAoIUlzQUNWYWxpZChUSUQpKQorCQl7CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIiBpbiAlcygpLCBUSUQoJWQpIGlzIG5vdCB2YWxpZFxuIiwgX19GVU5DVElPTl9fLCBUSUQpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJc3dpdGNoKFRJRCkKKwkJeworCQljYXNlIDA6CisJCWNhc2UgMzoKKwkJCVVQID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgMToKKwkJY2FzZSAyOgorCQkJVVAgPSAyOworCQkJYnJlYWs7CisKKwkJY2FzZSA0OgorCQljYXNlIDU6CisJCQlVUCA9IDU7CisJCQlicmVhazsKKworCQljYXNlIDY6CisJCWNhc2UgNzoKKwkJCVVQID0gNzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJKnBwVFMgPSBTZWFyY2hBZG1pdFRSU3RyZWFtKAorCQkJaWVlZSwKKwkJCUFkZHIsCisJCQlVUCwKKwkJCVR4UnhTZWxlY3QpOworCWlmKCpwcFRTICE9IE5VTEwpCisJeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJZWxzZQorCXsKKwkJaWYoYkFkZE5ld1RzID09IGZhbHNlKQorCQl7CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RTLCAiYWRkIG5ldyBUUyBmYWlsZWQodGlkOiVkKVxuIiwgVVApOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8KKwkJCS8vIENyZWF0ZSBhIG5ldyBUcmFmZmljIHN0cmVhbSBmb3IgY3VycmVudCBUeC9SeAorCQkJLy8gVGhpcyBpcyBmb3IgRURDQSBhbmQgV01NIHRvIGFkZCBhIG5ldyBUUy4KKwkJCS8vIEZvciBIQ0NBIG9yIFdNTVNBLCBUUyBjYW5ub3QgYmUgYWRkbWl0IHdpdGhvdXQgbmVnb3RpYXRpb24uCisJCQkvLworCQkJVFNQRUNfQk9EWQlUU3BlYzsKKwkJCVBRT1NfVFNJTkZPCQlwVFNJbmZvID0gJlRTcGVjLmYuVFNJbmZvOworCQkJc3RydWN0IGxpc3RfaGVhZCoJcFVudXNlZExpc3QgPQorCQkJCQkJCQkoVHhSeFNlbGVjdCA9PSBUWF9ESVIpPworCQkJCQkJCQkoJmllZWUtPlR4X1RTX1VudXNlZF9MaXN0KToKKwkJCQkJCQkJKCZpZWVlLT5SeF9UU19VbnVzZWRfTGlzdCk7CisKKwkJCXN0cnVjdCBsaXN0X2hlYWQqCXBBZGRtaXRMaXN0ID0KKwkJCQkJCQkJKFR4UnhTZWxlY3QgPT0gVFhfRElSKT8KKwkJCQkJCQkJKCZpZWVlLT5UeF9UU19BZG1pdF9MaXN0KToKKwkJCQkJCQkJKCZpZWVlLT5SeF9UU19BZG1pdF9MaXN0KTsKKworCQkJRElSRUNUSU9OX1ZBTFVFCQlEaXIgPQkJKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpPworCQkJCQkJCQkoKFR4UnhTZWxlY3Q9PVRYX0RJUik/RElSX0RPV046RElSX1VQKToKKwkJCQkJCQkJKChUeFJ4U2VsZWN0PT1UWF9ESVIpP0RJUl9VUDpESVJfRE9XTik7CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RTLCAidG8gYWRkIFRzXG4iKTsKKwkJCWlmKCFsaXN0X2VtcHR5KHBVbnVzZWRMaXN0KSkKKwkJCXsKKwkJCQkoKnBwVFMpID0gbGlzdF9lbnRyeShwVW51c2VkTGlzdC0+bmV4dCwgVFNfQ09NTU9OX0lORk8sIExpc3QpOworCQkJCWxpc3RfZGVsX2luaXQoJigqcHBUUyktPkxpc3QpOworCQkJCWlmKFR4UnhTZWxlY3Q9PVRYX0RJUikKKwkJCQl7CisJCQkJCVBUWF9UU19SRUNPUkQgdG1wID0gY29udGFpbmVyX29mKCpwcFRTLCBUWF9UU19SRUNPUkQsIFRzQ29tbW9uSW5mbyk7CisJCQkJCVJlc2V0VHhUc0VudHJ5KHRtcCk7CisJCQkJfQorCQkJCWVsc2V7CisJCQkJCVBSWF9UU19SRUNPUkQgdG1wID0gY29udGFpbmVyX29mKCpwcFRTLCBSWF9UU19SRUNPUkQsIFRzQ29tbW9uSW5mbyk7CisJCQkJCVJlc2V0UnhUc0VudHJ5KHRtcCk7CisJCQkJfQorCisJCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9UUywgInRvIGluaXQgY3VycmVudCBUUywgVVA6JWQsIERpcjolZCwgYWRkcjoiTUFDX0ZNVCJcbiIsIFVQLCBEaXIsIE1BQ19BUkcoQWRkcikpOworCQkJCS8vIFByZXBhcmUgVFMgSW5mbyByZWxlYXRlZCBmaWVsZAorCQkJCXBUU0luZm8tPmZpZWxkLnVjVHJhZmZpY1R5cGUgPSAwOwkJCS8vIFRyYWZmaWMgdHlwZTogV01NIGlzIHJlc2VydmVkIGluIHRoaXMgZmllbGQKKwkJCQlwVFNJbmZvLT5maWVsZC51Y1RTSUQgPSBVUDsJCQkvLyBUU0lECisJCQkJcFRTSW5mby0+ZmllbGQudWNEaXJlY3Rpb24gPSBEaXI7CQkJLy8gRGlyZWN0aW9uOiBpZiB0aGVyZSBpcyBEaXJlY3RMaW5rLCB0aGlzIG5lZWQgYWRkaXRpb25hbCBjb25zaWRlcmF0aW9uLgorCQkJCXBUU0luZm8tPmZpZWxkLnVjQWNjZXNzUG9saWN5ID0gMTsJCS8vIEFjY2VzcyBwb2xpY3kKKwkJCQlwVFNJbmZvLT5maWVsZC51Y0FnZ3JlZ2F0aW9uID0gMDsgCQkvLyBBZ2dyZWdhdGlvbgorCQkJCXBUU0luZm8tPmZpZWxkLnVjUFNCID0gMDsgCQkJCS8vIEFnZ3JlZ2F0aW9uCisJCQkJcFRTSW5mby0+ZmllbGQudWNVUCA9IFVQOwkJCQkvLyBVc2VyIHByaW9yaXR5CisJCQkJcFRTSW5mby0+ZmllbGQudWNUU0luZm9BY2tQb2xpY3kgPSAwOwkJLy8gQWNrIHBvbGljeQorCQkJCXBUU0luZm8tPmZpZWxkLnVjU2NoZWR1bGUgPSAwOwkJCS8vIFNjaGVkdWxlCisKKwkJCQlNYWtlVFNFbnRyeSgqcHBUUywgQWRkciwgJlRTcGVjLCBOVUxMLCAwLCAwKTsKKwkJCQlBZG1pdFRTKGllZWUsICpwcFRTLCAwKTsKKwkJCQlsaXN0X2FkZF90YWlsKCYoKCpwcFRTKS0+TGlzdCksIHBBZGRtaXRMaXN0KTsKKwkJCQkvLyBpZiB0aGVyZSBpcyBEaXJlY3RMaW5rLCB3ZSBuZWVkIHRvIGRvIGFkZGl0aW9uYWwgb3BlcmF0aW9uIGhlcmUhIQorCisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJpbiBmdW5jdGlvbiAlcygpIFRoZXJlIGlzIG5vdCBlbm91Z2ggVFMgcmVjb3JkIHRvIGJlIHVzZWQhISIsIF9fRlVOQ1RJT05fXyk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJfQorfQorCit2b2lkIFJlbW92ZVRzRW50cnkoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqCWllZWUsCisJUFRTX0NPTU1PTl9JTkZPCQkJcFRzLAorCVRSX1NFTEVDVAkJCVR4UnhTZWxlY3QKKwkpCit7CisJLy91MzIgZmxhZ3MgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWRlbF90aW1lcl9zeW5jKCZwVHMtPlNldHVwVGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZwVHMtPkluYWN0VGltZXIpOworCVRzSW5pdERlbEJBKGllZWUsIHBUcywgVHhSeFNlbGVjdCk7CisKKwlpZihUeFJ4U2VsZWN0ID09IFJYX0RJUikKKwl7CisvLyNpZmRlZiBUT19ET19MSVNUCisJCVBSWF9SRU9SREVSX0VOVFJZCXBSeFJlb3JkZXJFbnRyeTsKKwkJUFJYX1RTX1JFQ09SRCAJCXBSeFRTID0gKFBSWF9UU19SRUNPUkQpcFRzOworCQlpZih0aW1lcl9wZW5kaW5nKCZwUnhUUy0+UnhQa3RQZW5kaW5nVGltZXIpKQorCQkJZGVsX3RpbWVyX3N5bmMoJnBSeFRTLT5SeFBrdFBlbmRpbmdUaW1lcik7CisKKwkJd2hpbGUoIWxpc3RfZW1wdHkoJnBSeFRTLT5SeFBlbmRpbmdQa3RMaXN0KSkKKwkJeworCQkvLyAgICAgIFBsYXRmb3JtQWNxdWlyZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1JYX1NQSU5MT0NLKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksIGZsYWdzKTsKKwkJCS8vcFJ4UmVvcmRlckVudHJ5ID0gbGlzdF9lbnRyeSgmcFJ4VFMtPlJ4UGVuZGluZ1BrdExpc3QucHJldixSWF9SRU9SREVSX0VOVFJZLExpc3QpOworCQkJcFJ4UmVvcmRlckVudHJ5ID0gKFBSWF9SRU9SREVSX0VOVFJZKWxpc3RfZW50cnkocFJ4VFMtPlJ4UGVuZGluZ1BrdExpc3QucHJldixSWF9SRU9SREVSX0VOVFJZLExpc3QpOworCQkJbGlzdF9kZWxfaW5pdCgmcFJ4UmVvcmRlckVudHJ5LT5MaXN0KTsKKwkJCXsKKwkJCQlpbnQgaSA9IDA7CisJCQkJc3RydWN0IGllZWU4MDIxMV9yeGIgKiBwcnhiID0gcFJ4UmVvcmRlckVudHJ5LT5wcnhiOworCQkJCWlmICh1bmxpa2VseSghcHJ4YikpCisJCQkJeworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksIGZsYWdzKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlmb3IoaSA9MDsgaSA8IHByeGItPm5yX3N1YmZyYW1lczsgaSsrKSB7CisJCQkJCWRldl9rZnJlZV9za2IocHJ4Yi0+c3ViZnJhbWVzW2ldKTsKKwkJCQl9CisJCQkJa2ZyZWUocHJ4Yik7CisJCQkJcHJ4YiA9IE5VTEw7CisJCQl9CisJCQlsaXN0X2FkZF90YWlsKCZwUnhSZW9yZGVyRW50cnktPkxpc3QsJmllZWUtPlJ4UmVvcmRlcl9VbnVzZWRfTGlzdCk7CisJCQkvL1BsYXRmb3JtUmVsZWFzZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1JYX1NQSU5MT0NLKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpZWVlLT5yZW9yZGVyX3NwaW5sb2NrKSwgZmxhZ3MpOworCQl9CisKKy8vI2VuZGlmCisJfQorCWVsc2UKKwl7CisJCVBUWF9UU19SRUNPUkQgcFR4VFMgPSAoUFRYX1RTX1JFQ09SRClwVHM7CisJCWRlbF90aW1lcl9zeW5jKCZwVHhUUy0+VHNBZGRCYVRpbWVyKTsKKwl9Cit9CisKK3ZvaWQgUmVtb3ZlUGVlclRTKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogQWRkcikKK3sKKwlQVFNfQ09NTU9OX0lORk8JcFRTLCBwVG1wVFM7CisJcHJpbnRrKCI9PT09PT09PT09PT5SZW1vdmVQZWVyVFMsIk1BQ19GTVQiXG4iLCBNQUNfQVJHKEFkZHIpKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocFRTLCBwVG1wVFMsICZpZWVlLT5UeF9UU19QZW5kaW5nX0xpc3QsIExpc3QpCisJeworCQlpZiAobWVtY21wKHBUUy0+QWRkciwgQWRkciwgNikgPT0gMCkKKwkJeworCQkJUmVtb3ZlVHNFbnRyeShpZWVlLCBwVFMsIFRYX0RJUik7CisJCQlsaXN0X2RlbF9pbml0KCZwVFMtPkxpc3QpOworCQkJbGlzdF9hZGRfdGFpbCgmcFRTLT5MaXN0LCAmaWVlZS0+VHhfVFNfVW51c2VkX0xpc3QpOworCQl9CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBUUywgcFRtcFRTLCAmaWVlZS0+VHhfVFNfQWRtaXRfTGlzdCwgTGlzdCkKKwl7CisJCWlmIChtZW1jbXAocFRTLT5BZGRyLCBBZGRyLCA2KSA9PSAwKQorCQl7CisJCQlwcmludGsoIj09PT0+cmVtb3ZlIFR4X1RTX2FkbWluX2xpc3RcbiIpOworCQkJUmVtb3ZlVHNFbnRyeShpZWVlLCBwVFMsIFRYX0RJUik7CisJCQlsaXN0X2RlbF9pbml0KCZwVFMtPkxpc3QpOworCQkJbGlzdF9hZGRfdGFpbCgmcFRTLT5MaXN0LCAmaWVlZS0+VHhfVFNfVW51c2VkX0xpc3QpOworCQl9CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBUUywgcFRtcFRTLCAmaWVlZS0+UnhfVFNfUGVuZGluZ19MaXN0LCBMaXN0KQorCXsKKwkJaWYgKG1lbWNtcChwVFMtPkFkZHIsIEFkZHIsIDYpID09IDApCisJCXsKKwkJCVJlbW92ZVRzRW50cnkoaWVlZSwgcFRTLCBSWF9ESVIpOworCQkJbGlzdF9kZWxfaW5pdCgmcFRTLT5MaXN0KTsKKwkJCWxpc3RfYWRkX3RhaWwoJnBUUy0+TGlzdCwgJmllZWUtPlJ4X1RTX1VudXNlZF9MaXN0KTsKKwkJfQorCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwVFMsIHBUbXBUUywgJmllZWUtPlJ4X1RTX0FkbWl0X0xpc3QsIExpc3QpCisJeworCQlpZiAobWVtY21wKHBUUy0+QWRkciwgQWRkciwgNikgPT0gMCkKKwkJeworCQkJUmVtb3ZlVHNFbnRyeShpZWVlLCBwVFMsIFJYX0RJUik7CisJCQlsaXN0X2RlbF9pbml0KCZwVFMtPkxpc3QpOworCQkJbGlzdF9hZGRfdGFpbCgmcFRTLT5MaXN0LCAmaWVlZS0+UnhfVFNfVW51c2VkX0xpc3QpOworCQl9CisJfQorfQorCit2b2lkIFJlbW92ZUFsbFRTKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKQoreworCVBUU19DT01NT05fSU5GTyBwVFMsIHBUbXBUUzsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocFRTLCBwVG1wVFMsICZpZWVlLT5UeF9UU19QZW5kaW5nX0xpc3QsIExpc3QpCisJeworCQlSZW1vdmVUc0VudHJ5KGllZWUsIHBUUywgVFhfRElSKTsKKwkJbGlzdF9kZWxfaW5pdCgmcFRTLT5MaXN0KTsKKwkJbGlzdF9hZGRfdGFpbCgmcFRTLT5MaXN0LCAmaWVlZS0+VHhfVFNfVW51c2VkX0xpc3QpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwVFMsIHBUbXBUUywgJmllZWUtPlR4X1RTX0FkbWl0X0xpc3QsIExpc3QpCisJeworCQlSZW1vdmVUc0VudHJ5KGllZWUsIHBUUywgVFhfRElSKTsKKwkJbGlzdF9kZWxfaW5pdCgmcFRTLT5MaXN0KTsKKwkJbGlzdF9hZGRfdGFpbCgmcFRTLT5MaXN0LCAmaWVlZS0+VHhfVFNfVW51c2VkX0xpc3QpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwVFMsIHBUbXBUUywgJmllZWUtPlJ4X1RTX1BlbmRpbmdfTGlzdCwgTGlzdCkKKwl7CisJCVJlbW92ZVRzRW50cnkoaWVlZSwgcFRTLCBSWF9ESVIpOworCQlsaXN0X2RlbF9pbml0KCZwVFMtPkxpc3QpOworCQlsaXN0X2FkZF90YWlsKCZwVFMtPkxpc3QsICZpZWVlLT5SeF9UU19VbnVzZWRfTGlzdCk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBUUywgcFRtcFRTLCAmaWVlZS0+UnhfVFNfQWRtaXRfTGlzdCwgTGlzdCkKKwl7CisJCVJlbW92ZVRzRW50cnkoaWVlZSwgcFRTLCBSWF9ESVIpOworCQlsaXN0X2RlbF9pbml0KCZwVFMtPkxpc3QpOworCQlsaXN0X2FkZF90YWlsKCZwVFMtPkxpc3QsICZpZWVlLT5SeF9UU19VbnVzZWRfTGlzdCk7CisJfQorfQorCit2b2lkIFRzU3RhcnRBZGRCYVByb2Nlc3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIFBUWF9UU19SRUNPUkQJcFR4VFMpCit7CisJaWYocFR4VFMtPmJBZGRCYVJlcUluUHJvZ3Jlc3MgPT0gZmFsc2UpCisJeworCQlwVHhUUy0+YkFkZEJhUmVxSW5Qcm9ncmVzcyA9IHRydWU7CisJCWlmKHBUeFRTLT5iQWRkQmFSZXFEZWxheWVkKQorCQl7CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0JBLCAiVHNTdGFydEFkZEJhUHJvY2VzcygpOiBEZWxheWVkIFN0YXJ0IEFEREJBIGFmdGVyIDYwIHNlYyEhXG4iKTsKKwkJCW1vZF90aW1lcigmcFR4VFMtPlRzQWRkQmFUaW1lciwgamlmZmllcyArIE1TRUNTKFRTX0FEREJBX0RFTEFZKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0JBLCJUc1N0YXJ0QWRkQmFQcm9jZXNzKCk6IEltbWVkaWF0ZWx5IFN0YXJ0IEFEREJBIG5vdyEhXG4iKTsKKwkJCW1vZF90aW1lcigmcFR4VFMtPlRzQWRkQmFUaW1lciwgamlmZmllcysxMCk7IC8vc2V0IDEwIHRpY2tzCisJCX0KKwl9CisJZWxzZQorCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIiVzKCk9PT5CQSB0aW1lciBpcyBhbHJlYWR5IGFkZGVkXG4iLCBfX0ZVTkNUSU9OX18pOworfQorRVhQT1JUX1NZTUJPTChSZW1vdmVQZWVyVFMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGxfY3J5cHRvLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bF9jcnlwdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Y2YWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGxfY3J5cHRvLmgKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKiBTY2F0dGVybGlzdCBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICoKKyAqIFBvcnRpb25zIGRlcml2ZWQgZnJvbSBDcnlwdG9hcGksIGJ5IEFsZXhhbmRlciBLamVsZGFhcyA8YXN0b3JAZmFzdC5ubz4KKyAqIGFuZCBOZXR0bGUsIGJ5IE5pZWxzIE3psIhsZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpZm5kZWYgX0xJTlVYX0NSWVBUT19ICisjZGVmaW5lIF9MSU5VWF9DUllQVE9fSAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworI2RlZmluZSBjcnlwdG9fcmVnaXN0ZXJfYWxnIGNyeXB0b19yZWdpc3Rlcl9hbGdfcnNsCisjZGVmaW5lIGNyeXB0b191bnJlZ2lzdGVyX2FsZyBjcnlwdG9fdW5yZWdpc3Rlcl9hbGdfcnNsCisjZGVmaW5lIGNyeXB0b19hbGxvY190Zm0gY3J5cHRvX2FsbG9jX3RmbV9yc2wKKyNkZWZpbmUgY3J5cHRvX2ZyZWVfdGZtIGNyeXB0b19mcmVlX3RmbV9yc2wKKyNkZWZpbmUgY3J5cHRvX2FsZ19hdmFpbGFibGUgY3J5cHRvX2FsZ19hdmFpbGFibGVfcnNsCisKKy8qCisgKiBBbGdvcml0aG0gbWFza3MgYW5kIHR5cGVzLgorICovCisjZGVmaW5lIENSWVBUT19BTEdfVFlQRV9NQVNLCQkweDAwMDAwMGZmCisjZGVmaW5lIENSWVBUT19BTEdfVFlQRV9DSVBIRVIJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0RJR0VTVAkJMHgwMDAwMDAwMgorI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1MJMHgwMDAwMDAwNAorCisvKgorICogVHJhbnNmb3JtIG1hc2tzIGFuZCB2YWx1ZXMgKGZvciBjcnRfZmxhZ3MpLgorICovCisjZGVmaW5lIENSWVBUT19URk1fTU9ERV9NQVNLCQkweDAwMDAwMGZmCisjZGVmaW5lIENSWVBUT19URk1fUkVRX01BU0sJCTB4MDAwZmZmMDAKKyNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfTUFTSwkJMHhmZmYwMDAwMAorCisjZGVmaW5lIENSWVBUT19URk1fTU9ERV9FQ0IJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0NCQwkJMHgwMDAwMDAwMgorI2RlZmluZSBDUllQVE9fVEZNX01PREVfQ0ZCCQkweDAwMDAwMDA0CisjZGVmaW5lIENSWVBUT19URk1fTU9ERV9DVFIJCTB4MDAwMDAwMDgKKworI2RlZmluZSBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWQkJMHgwMDAwMDEwMAorI2RlZmluZSBDUllQVE9fVEZNX1JFU19XRUFLX0tFWQkJMHgwMDEwMDAwMAorI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTiAgIAkweDAwMjAwMDAwCisjZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9LRVlfU0NIRUQgCTB4MDA0MDAwMDAKKyNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0JMT0NLX0xFTiAJMHgwMDgwMDAwMAorI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfRkxBR1MgCTB4MDEwMDAwMDAKKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgc3R1ZmYuCisgKi8KKyNkZWZpbmUgQ1JZUFRPX1VOU1BFQwkJCTAKKyNkZWZpbmUgQ1JZUFRPX01BWF9BTEdfTkFNRQkJNjQKKworc3RydWN0IHNjYXR0ZXJsaXN0OworCisvKgorICogQWxnb3JpdGhtczogbW9kdWxhciBjcnlwdG8gYWxnb3JpdGhtIGltcGxlbWVudGF0aW9ucywgbWFuYWdlZAorICogdmlhIGNyeXB0b19yZWdpc3Rlcl9hbGcoKSBhbmQgY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCkuCisgKi8KK3N0cnVjdCBjaXBoZXJfYWxnIHsKKwl1bnNpZ25lZCBpbnQgY2lhX21pbl9rZXlzaXplOworCXVuc2lnbmVkIGludCBjaWFfbWF4X2tleXNpemU7CisJaW50ICgqY2lhX3NldGtleSkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LAorCSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpOworCXZvaWQgKCpjaWFfZW5jcnlwdCkodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKKwl2b2lkICgqY2lhX2RlY3J5cHQpKHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7Cit9OworCitzdHJ1Y3QgZGlnZXN0X2FsZyB7CisJdW5zaWduZWQgaW50IGRpYV9kaWdlc3RzaXplOworCXZvaWQgKCpkaWFfaW5pdCkodm9pZCAqY3R4KTsKKwl2b2lkICgqZGlhX3VwZGF0ZSkodm9pZCAqY3R4LCBjb25zdCB1OCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbik7CisJdm9pZCAoKmRpYV9maW5hbCkodm9pZCAqY3R4LCB1OCAqb3V0KTsKKwlpbnQgKCpkaWFfc2V0a2V5KSh2b2lkICpjdHgsIGNvbnN0IHU4ICprZXksCisJICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncyk7Cit9OworCitzdHJ1Y3QgY29tcHJlc3NfYWxnIHsKKwlpbnQgKCpjb2FfaW5pdCkodm9pZCAqY3R4KTsKKwl2b2lkICgqY29hX2V4aXQpKHZvaWQgKmN0eCk7CisJaW50ICgqY29hX2NvbXByZXNzKSh2b2lkICpjdHgsIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorCSAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKKwlpbnQgKCpjb2FfZGVjb21wcmVzcykodm9pZCAqY3R4LCBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKKwkgICAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKK307CisKKyNkZWZpbmUgY3JhX2NpcGhlcgljcmFfdS5jaXBoZXIKKyNkZWZpbmUgY3JhX2RpZ2VzdAljcmFfdS5kaWdlc3QKKyNkZWZpbmUgY3JhX2NvbXByZXNzCWNyYV91LmNvbXByZXNzCisKK3N0cnVjdCBjcnlwdG9fYWxnIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNyYV9saXN0OworCXUzMiBjcmFfZmxhZ3M7CisJdW5zaWduZWQgaW50IGNyYV9ibG9ja3NpemU7CisJdW5zaWduZWQgaW50IGNyYV9jdHhzaXplOworCWNvbnN0IGNoYXIgY3JhX25hbWVbQ1JZUFRPX01BWF9BTEdfTkFNRV07CisKKwl1bmlvbiB7CisJCXN0cnVjdCBjaXBoZXJfYWxnIGNpcGhlcjsKKwkJc3RydWN0IGRpZ2VzdF9hbGcgZGlnZXN0OworCQlzdHJ1Y3QgY29tcHJlc3NfYWxnIGNvbXByZXNzOworCX0gY3JhX3U7CisKKwlzdHJ1Y3QgbW9kdWxlICpjcmFfbW9kdWxlOworfTsKKworLyoKKyAqIEFsZ29yaXRobSByZWdpc3RyYXRpb24gaW50ZXJmYWNlLgorICovCitpbnQgY3J5cHRvX3JlZ2lzdGVyX2FsZyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKTsKK2ludCBjcnlwdG9fdW5yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZyk7CisKKy8qCisgKiBBbGdvcml0aG0gcXVlcnkgaW50ZXJmYWNlLgorICovCitpbnQgY3J5cHRvX2FsZ19hdmFpbGFibGUoY29uc3QgY2hhciAqbmFtZSwgdTMyIGZsYWdzKTsKKworLyoKKyAqIFRyYW5zZm9ybXM6IHVzZXItaW5zdGFudGlhdGVkIG9iamVjdHMgd2hpY2ggZW5jYXBzdWxhdGUgYWxnb3JpdGhtcworICogYW5kIGNvcmUgcHJvY2Vzc2luZyBsb2dpYy4gIE1hbmFnZWQgdmlhIGNyeXB0b19hbGxvY190Zm0oKSBhbmQKKyAqIGNyeXB0b19mcmVlX3RmbSgpLCBhcyB3ZWxsIGFzIHRoZSB2YXJpb3VzIGhlbHBlcnMgYmVsb3cuCisgKi8KK3N0cnVjdCBjcnlwdG9fdGZtOworCitzdHJ1Y3QgY2lwaGVyX3RmbSB7CisJdm9pZCAqY2l0X2l2OworCXVuc2lnbmVkIGludCBjaXRfaXZzaXplOworCXUzMiBjaXRfbW9kZTsKKwlpbnQgKCpjaXRfc2V0a2V5KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCSAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pOworCWludCAoKmNpdF9lbmNyeXB0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpOworCWludCAoKmNpdF9lbmNyeXB0X2l2KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCSAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdik7CisJaW50ICgqY2l0X2RlY3J5cHQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcyk7CisJaW50ICgqY2l0X2RlY3J5cHRfaXYpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KTsKKwl2b2lkICgqY2l0X3hvcl9ibG9jaykodTggKmRzdCwgY29uc3QgdTggKnNyYyk7Cit9OworCitzdHJ1Y3QgZGlnZXN0X3RmbSB7CisJdm9pZCAoKmRpdF9pbml0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKKwl2b2lkICgqZGl0X3VwZGF0ZSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZyk7CisJdm9pZCAoKmRpdF9maW5hbCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCk7CisJdm9pZCAoKmRpdF9kaWdlc3QpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuc2csIHU4ICpvdXQpOworCWludCAoKmRpdF9zZXRrZXkpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbik7CisjaWZkZWYgQ09ORklHX0NSWVBUT19ITUFDCisJdm9pZCAqZGl0X2htYWNfYmxvY2s7CisjZW5kaWYKK307CisKK3N0cnVjdCBjb21wcmVzc190Zm0geworCWludCAoKmNvdF9jb21wcmVzcykoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorCSAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKKwlpbnQgKCpjb3RfZGVjb21wcmVzcykoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCisJICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbik7Cit9OworCisjZGVmaW5lIGNydF9jaXBoZXIJY3J0X3UuY2lwaGVyCisjZGVmaW5lIGNydF9kaWdlc3QJY3J0X3UuZGlnZXN0CisjZGVmaW5lIGNydF9jb21wcmVzcwljcnRfdS5jb21wcmVzcworCitzdHJ1Y3QgY3J5cHRvX3RmbSB7CisKKwl1MzIgY3J0X2ZsYWdzOworCisJdW5pb24geworCQlzdHJ1Y3QgY2lwaGVyX3RmbSBjaXBoZXI7CisJCXN0cnVjdCBkaWdlc3RfdGZtIGRpZ2VzdDsKKwkJc3RydWN0IGNvbXByZXNzX3RmbSBjb21wcmVzczsKKwl9IGNydF91OworCisJc3RydWN0IGNyeXB0b19hbGcgKl9fY3J0X2FsZzsKK307CisKKy8qCisgKiBUcmFuc2Zvcm0gdXNlciBpbnRlcmZhY2UuCisgKi8KKworLyoKKyAqIGNyeXB0b19hbGxvY190Zm0oKSB3aWxsIGZpcnN0IGF0dGVtcHQgdG8gbG9jYXRlIGFuIGFscmVhZHkgbG9hZGVkIGFsZ29yaXRobS4KKyAqIElmIHRoYXQgZmFpbHMgYW5kIHRoZSBrZXJuZWwgc3VwcG9ydHMgZHluYW1pY2FsbHkgbG9hZGFibGUgbW9kdWxlcywgaXQKKyAqIHdpbGwgdGhlbiBhdHRlbXB0IHRvIGxvYWQgYSBtb2R1bGUgb2YgdGhlIHNhbWUgbmFtZSBvciBhbGlhcy4gIEEgcmVmY291bnQKKyAqIGlzIGdyYWJiZWQgb24gdGhlIGFsZ29yaXRobSB3aGljaCBpcyB0aGVuIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IHRyYW5zZm9ybS4KKyAqCisgKiBjcnlwdG9fZnJlZV90Zm0oKSBmcmVlcyB1cCB0aGUgdHJhbnNmb3JtIGFuZCBhbnkgYXNzb2NpYXRlZCByZXNvdXJjZXMsCisgKiB0aGVuIGRyb3BzIHRoZSByZWZjb3VudCBvbiB0aGUgYXNzb2NpYXRlZCBhbGdvcml0aG0uCisgKi8KK3N0cnVjdCBjcnlwdG9fdGZtICpjcnlwdG9fYWxsb2NfdGZtKGNvbnN0IGNoYXIgKmFsZ19uYW1lLCB1MzIgdGZtX2ZsYWdzKTsKK3ZvaWQgY3J5cHRvX2ZyZWVfdGZtKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOworCisvKgorICogVHJhbnNmb3JtIGhlbHBlcnMgd2hpY2ggcXVlcnkgdGhlIHVuZGVybHlpbmcgYWxnb3JpdGhtLgorICovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNyeXB0b190Zm1fYWxnX25hbWUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9uYW1lOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNyeXB0b190Zm1fYWxnX21vZG5hbWUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnID0gdGZtLT5fX2NydF9hbGc7CisKKwlpZiAoYWxnLT5jcmFfbW9kdWxlKQorCQlyZXR1cm4gYWxnLT5jcmFfbW9kdWxlLT5uYW1lOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGNyeXB0b190Zm1fYWxnX3R5cGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9mbGFncyAmIENSWVBUT19BTEdfVFlQRV9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19taW5fa2V5c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9taW5fa2V5c2l6ZTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfbWF4X2tleXNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfbWF4X2tleXNpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2l2c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfaXZzaXplOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9ibG9ja3NpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2RpZ2VzdHNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOworCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfZGlnZXN0c2l6ZTsKK30KKworLyoKKyAqIEFQSSB3cmFwcGVycy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19kaWdlc3RfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7CisJdGZtLT5jcnRfZGlnZXN0LmRpdF9pbml0KHRmbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZGlnZXN0X3VwZGF0ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5zZykKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOworCXRmbS0+Y3J0X2RpZ2VzdC5kaXRfdXBkYXRlKHRmbSwgc2csIG5zZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZGlnZXN0X2ZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKKwl0Zm0tPmNydF9kaWdlc3QuZGl0X2ZpbmFsKHRmbSwgb3V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19kaWdlc3RfZGlnZXN0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnNnLCB1OCAqb3V0KQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7CisJdGZtLT5jcnRfZGlnZXN0LmRpdF9kaWdlc3QodGZtLCBzZywgbnNnLCBvdXQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fZGlnZXN0X3NldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOworCWlmICh0Zm0tPmNydF9kaWdlc3QuZGl0X3NldGtleSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT1NZUzsKKwlyZXR1cm4gdGZtLT5jcnRfZGlnZXN0LmRpdF9zZXRrZXkodGZtLCBrZXksIGtleWxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfc2V0a2V5KHRmbSwga2V5LCBrZXlsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZW5jcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2VuY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwlCVUdfT04odGZtLT5jcnRfY2lwaGVyLmNpdF9tb2RlID09IENSWVBUT19URk1fTU9ERV9FQ0IpOworCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2VuY3J5cHRfaXYodGZtLCBkc3QsIHNyYywgbmJ5dGVzLCBpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9kZWNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZGVjcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCUJVR19PTih0Zm0tPmNydF9jaXBoZXIuY2l0X21vZGUgPT0gQ1JZUFRPX1RGTV9NT0RFX0VDQik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZGVjcnlwdF9pdih0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsIGl2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19jaXBoZXJfc2V0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IGxlbikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCW1lbWNweSh0Zm0tPmNydF9jaXBoZXIuY2l0X2l2LCBzcmMsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fY2lwaGVyX2dldF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCBsZW4pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwltZW1jcHkoZHN0LCB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2LCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY29tcF9jb21wcmVzcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1MpOworCXJldHVybiB0Zm0tPmNydF9jb21wcmVzcy5jb3RfY29tcHJlc3ModGZtLCBzcmMsIHNsZW4sIGRzdCwgZGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jb21wX2RlY29tcHJlc3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DT01QUkVTUyk7CisJcmV0dXJuIHRmbS0+Y3J0X2NvbXByZXNzLmNvdF9kZWNvbXByZXNzKHRmbSwgc3JjLCBzbGVuLCBkc3QsIGRsZW4pOworfQorCisvKgorICogSE1BQyBzdXBwb3J0LgorICovCisjaWZkZWYgQ09ORklHX0NSWVBUT19ITUFDCit2b2lkIGNyeXB0b19obWFjX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmtleSwgdW5zaWduZWQgaW50ICprZXlsZW4pOwordm9pZCBjcnlwdG9faG1hY191cGRhdGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuc2cpOwordm9pZCBjcnlwdG9faG1hY19maW5hbChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmtleWxlbiwgdTggKm91dCk7Cit2b2lkIGNyeXB0b19obWFjKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICprZXksIHVuc2lnbmVkIGludCAqa2V5bGVuLAorICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnLCB1OCAqb3V0KTsKKyNlbmRpZgkvKiBDT05GSUdfQ1JZUFRPX0hNQUMgKi8KKworI2VuZGlmCS8qIF9MSU5VWF9DUllQVE9fSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3NjYXR0ZXJ3YWxrLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3NjYXR0ZXJ3YWxrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmNDAxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvc2NhdHRlcndhbGsuYwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIENpcGhlciBvcGVyYXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqICAgICAgICAgICAgICAgMjAwMiBBZGFtIEouIFJpY2h0ZXIgPGFkYW1AeWdnZHJhc2lsLmNvbT4KKyAqICAgICAgICAgICAgICAgMjAwNCBKZWFuLUx1YyBDb29rZSA8amxjb29rZUBjZXJ0YWlua2V5LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2luY2x1ZGUgImttYXBfdHlwZXMuaCIKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInNjYXR0ZXJ3YWxrLmgiCisKK2VudW0ga21fdHlwZSBjcnlwdG9fa21fdHlwZXNbXSA9IHsKKwlLTV9VU0VSMCwKKwlLTV9VU0VSMSwKKwlLTV9TT0ZUSVJRMCwKKwlLTV9TT0ZUSVJRMSwKK307CisKK3ZvaWQgKnNjYXR0ZXJ3YWxrX3doaWNoYnVmKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIHVuc2lnbmVkIGludCBuYnl0ZXMsIHZvaWQgKnNjcmF0Y2gpCit7CisJaWYgKG5ieXRlcyA8PSB3YWxrLT5sZW5fdGhpc19wYWdlICYmCisJICAgICgoKHVuc2lnbmVkIGxvbmcpd2Fsay0+ZGF0YSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpICsgbmJ5dGVzIDw9CisJICAgIFBBR0VfQ0FDSEVfU0laRSkKKwkJcmV0dXJuIHdhbGstPmRhdGE7CisJZWxzZQorCQlyZXR1cm4gc2NyYXRjaDsKK30KKworc3RhdGljIHZvaWQgbWVtY3B5X2Rpcih2b2lkICpidWYsIHZvaWQgKnNnZGF0YSwgc2l6ZV90IG5ieXRlcywgaW50IG91dCkKK3sKKwlpZiAob3V0KQorCQltZW1jcHkoc2dkYXRhLCBidWYsIG5ieXRlcyk7CisJZWxzZQorCQltZW1jcHkoYnVmLCBzZ2RhdGEsIG5ieXRlcyk7Cit9CisKK3ZvaWQgc2NhdHRlcndhbGtfc3RhcnQoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2Fsaywgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKK3sKKwl1bnNpZ25lZCBpbnQgcmVzdF9vZl9wYWdlOworCisJd2Fsay0+c2cgPSBzZzsKKworCXdhbGstPnBhZ2UgPSBzZy0+cGFnZTsKKwl3YWxrLT5sZW5fdGhpc19zZWdtZW50ID0gc2ctPmxlbmd0aDsKKworCXJlc3Rfb2ZfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSAtIChzZy0+b2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsKKwl3YWxrLT5sZW5fdGhpc19wYWdlID0gbWluKHNnLT5sZW5ndGgsIHJlc3Rfb2ZfcGFnZSk7CisJd2Fsay0+b2Zmc2V0ID0gc2ctPm9mZnNldDsKK30KKwordm9pZCBzY2F0dGVyd2Fsa19tYXAoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgaW50IG91dCkKK3sKKwl3YWxrLT5kYXRhID0gY3J5cHRvX2ttYXAod2Fsay0+cGFnZSwgb3V0KSArIHdhbGstPm9mZnNldDsKK30KKworc3RhdGljIHZvaWQgc2NhdHRlcndhbGtfcGFnZWRvbmUoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgaW50IG91dCwKKwkJCQkgdW5zaWduZWQgaW50IG1vcmUpCit7CisJLyogd2Fsay0+ZGF0YSBtYXkgYmUgcG9pbnRpbmcgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG5leHQgcGFnZTsKKwkgICBob3dldmVyLCB3ZSBrbm93IHdlIHRyYW5zZmVyZWQgYXQgbGVhc3Qgb25lIGJ5dGUuICBTbywKKwkgICB3YWxrLT5kYXRhIC0gMSB3aWxsIGJlIGEgdmlydHVhbCBhZGRyZXNzIGluIHRoZSBtYXBwZWQgcGFnZS4gKi8KKworCWlmIChvdXQpCisJCWZsdXNoX2RjYWNoZV9wYWdlKHdhbGstPnBhZ2UpOworCisJaWYgKG1vcmUpIHsKKwkJd2Fsay0+bGVuX3RoaXNfc2VnbWVudCAtPSB3YWxrLT5sZW5fdGhpc19wYWdlOworCisJCWlmICh3YWxrLT5sZW5fdGhpc19zZWdtZW50KSB7CisJCQl3YWxrLT5wYWdlKys7CisJCQl3YWxrLT5sZW5fdGhpc19wYWdlID0gbWluKHdhbGstPmxlbl90aGlzX3NlZ21lbnQsCisJCQkJCQkgICh1bnNpZ25lZClQQUdFX0NBQ0hFX1NJWkUpOworCQkJd2Fsay0+b2Zmc2V0ID0gMDsKKwkJfQorCQllbHNlCisJCQlzY2F0dGVyd2Fsa19zdGFydCh3YWxrLCBzZ19uZXh0KHdhbGstPnNnKSk7CisJfQorfQorCit2b2lkIHNjYXR0ZXJ3YWxrX2RvbmUoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgaW50IG91dCwgaW50IG1vcmUpCit7CisJY3J5cHRvX2t1bm1hcCh3YWxrLT5kYXRhLCBvdXQpOworCWlmICh3YWxrLT5sZW5fdGhpc19wYWdlID09IDAgfHwgIW1vcmUpCisJCXNjYXR0ZXJ3YWxrX3BhZ2Vkb25lKHdhbGssIG91dCwgbW9yZSk7Cit9CisKKy8qCisgKiBEbyBub3QgY2FsbCB0aGlzIHVubGVzcyB0aGUgdG90YWwgbGVuZ3RoIG9mIGFsbCBvZiB0aGUgZnJhZ21lbnRzCisgKiBoYXMgYmVlbiB2ZXJpZmllZCBhcyBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS4KKyAqLworaW50IHNjYXR0ZXJ3YWxrX2NvcHljaHVua3Modm9pZCAqYnVmLCBzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLAorCQkJICAgc2l6ZV90IG5ieXRlcywgaW50IG91dCkKK3sKKwlpZiAoYnVmICE9IHdhbGstPmRhdGEpIHsKKwkJd2hpbGUgKG5ieXRlcyA+IHdhbGstPmxlbl90aGlzX3BhZ2UpIHsKKwkJCW1lbWNweV9kaXIoYnVmLCB3YWxrLT5kYXRhLCB3YWxrLT5sZW5fdGhpc19wYWdlLCBvdXQpOworCQkJYnVmICs9IHdhbGstPmxlbl90aGlzX3BhZ2U7CisJCQluYnl0ZXMgLT0gd2Fsay0+bGVuX3RoaXNfcGFnZTsKKworCQkJY3J5cHRvX2t1bm1hcCh3YWxrLT5kYXRhLCBvdXQpOworCQkJc2NhdHRlcndhbGtfcGFnZWRvbmUod2Fsaywgb3V0LCAxKTsKKwkJCXNjYXR0ZXJ3YWxrX21hcCh3YWxrLCBvdXQpOworCQl9CisKKwkJbWVtY3B5X2RpcihidWYsIHdhbGstPmRhdGEsIG5ieXRlcywgb3V0KTsKKwl9CisKKwl3YWxrLT5vZmZzZXQgKz0gbmJ5dGVzOworCXdhbGstPmxlbl90aGlzX3BhZ2UgLT0gbmJ5dGVzOworCXdhbGstPmxlbl90aGlzX3NlZ21lbnQgLT0gbmJ5dGVzOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9zY2F0dGVyd2Fsay5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9zY2F0dGVyd2Fsay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNjQ0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3NjYXR0ZXJ3YWxrLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBBZGFtIEouIFJpY2h0ZXIgPGFkYW1AeWdnZHJhc2lsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwNCBKZWFuLUx1YyBDb29rZSA8amxjb29rZUBjZXJ0YWlua2V5LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9DUllQVE9fU0NBVFRFUldBTEtfSAorI2RlZmluZSBfQ1JZUFRPX1NDQVRURVJXQUxLX0gKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorCitzdHJ1Y3Qgc2NhdHRlcl93YWxrIHsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnOworCXN0cnVjdCBwYWdlCQkqcGFnZTsKKwl2b2lkCQkJKmRhdGE7CisJdW5zaWduZWQgaW50CQlsZW5fdGhpc19wYWdlOworCXVuc2lnbmVkIGludAkJbGVuX3RoaXNfc2VnbWVudDsKKwl1bnNpZ25lZCBpbnQJCW9mZnNldDsKK307CisKKy8qIERlZmluZSBzZ19uZXh0IGlzIGFuIGlubGluZSByb3V0aW5lIG5vdyBpbiBjYXNlIHdlIHdhbnQgdG8gY2hhbmdlCisgICBzY2F0dGVybGlzdCB0byBhIGxpbmtlZCBsaXN0IGxhdGVyLiAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX25leHQoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKK3sKKwlyZXR1cm4gc2cgKyAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBzY2F0dGVyd2Fsa19zYW1lYnVmKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGtfaW4sCisJCQkJICAgICAgc3RydWN0IHNjYXR0ZXJfd2FsayAqd2Fsa19vdXQsCisJCQkJICAgICAgdm9pZCAqc3JjX3AsIHZvaWQgKmRzdF9wKQoreworCXJldHVybiB3YWxrX2luLT5wYWdlID09IHdhbGtfb3V0LT5wYWdlICYmCisJICAgICAgIHdhbGtfaW4tPm9mZnNldCA9PSB3YWxrX291dC0+b2Zmc2V0ICYmCisJICAgICAgIHdhbGtfaW4tPmRhdGEgPT0gc3JjX3AgJiYgd2Fsa19vdXQtPmRhdGEgPT0gZHN0X3A7Cit9CisKK3ZvaWQgKnNjYXR0ZXJ3YWxrX3doaWNoYnVmKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIHVuc2lnbmVkIGludCBuYnl0ZXMsIHZvaWQgKnNjcmF0Y2gpOwordm9pZCBzY2F0dGVyd2Fsa19zdGFydChzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKTsKK2ludCBzY2F0dGVyd2Fsa19jb3B5Y2h1bmtzKHZvaWQgKmJ1Ziwgc3RydWN0IHNjYXR0ZXJfd2FsayAqd2Fsaywgc2l6ZV90IG5ieXRlcywgaW50IG91dCk7Cit2b2lkIHNjYXR0ZXJ3YWxrX21hcChzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBpbnQgb3V0KTsKK3ZvaWQgc2NhdHRlcndhbGtfZG9uZShzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBpbnQgb3V0LCBpbnQgbW9yZSk7CisKKyNlbmRpZiAgLyogX0NSWVBUT19TQ0FUVEVSV0FMS19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExX2NyeXB0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExX2NyeXB0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU4YTNiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTFfY3J5cHQuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogT3JpZ2luYWwgY29kZSBiYXNlZCBvbiBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcyBMQU4gYWNjZXNzIHBvaW50KSBkcml2ZXIKKyAqIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBBZGFwdGlvbiB0byBhIGdlbmVyaWMgSUVFRSA4MDIuMTEgc3RhY2sgYnkgSmFtZXMgS2V0cmVub3MKKyAqIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGllZWU4MDIxMSBjcnlwdG8gbW9kdWxlLgorICovCisjaWZuZGVmIElFRUU4MDIxMV9DUllQVF9ICisjZGVmaW5lIElFRUU4MDIxMV9DUllQVF9ICisKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzIHsKKwljb25zdCBjaGFyICpuYW1lOworCisJLyogaW5pdCBuZXcgY3J5cHRvIGNvbnRleHQgKGUuZy4sIGFsbG9jYXRlIHByaXZhdGUgZGF0YSBzcGFjZSwKKwkgKiBzZWxlY3QgSVYsIGV0Yy4pOyByZXR1cm5zIE5VTEwgb24gZmFpbHVyZSBvciBwb2ludGVyIHRvIGFsbG9jYXRlZAorCSAqIHByaXZhdGUgZGF0YSBvbiBzdWNjZXNzICovCisJdm9pZCAqICgqaW5pdCkoaW50IGtleWlkeCk7CisKKwkvKiBkZWluaXRpYWxpemUgY3J5cHRvIGNvbnRleHQgYW5kIGZyZWUgYWxsb2NhdGVkIHByaXZhdGUgZGF0YSAqLworCXZvaWQgKCpkZWluaXQpKHZvaWQgKnByaXYpOworCisJLyogZW5jcnlwdC9kZWNyeXB0IHJldHVybiA8IDAgb24gZXJyb3Igb3IgPj0gMCBvbiBzdWNjZXNzLiBUaGUgcmV0dXJuCisJICogdmFsdWUgZnJvbSBkZWNyeXB0X21wZHUgaXMgcGFzc2VkIGFzIHRoZSBrZXlpZHggdmFsdWUgZm9yCisJICogZGVjcnlwdF9tc2R1LiBza2IgbXVzdCBoYXZlIGVub3VnaCBoZWFkIGFuZCB0YWlsIHJvb20gZm9yIHRoZQorCSAqIGVuY3J5cHRpb247IGlmIG5vdCwgZXJyb3Igd2lsbCBiZSByZXR1cm5lZDsgdGhlc2UgZnVuY3Rpb25zIGFyZQorCSAqIGNhbGxlZCBmb3IgYWxsIE1QRFVzIChpLmUuLCBmcmFnbWVudHMpLgorCSAqLworCWludCAoKmVuY3J5cHRfbXBkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOworCWludCAoKmRlY3J5cHRfbXBkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOworCisJLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgZm9yIGZ1bGwgTVNEVXMsIGkuZS4gZnVsbCBmcmFtZXMuCisJICogVGhlc2UgY2FuIGJlIE5VTEwgaWYgZnVsbCBNU0RVIG9wZXJhdGlvbnMgYXJlIG5vdCBuZWVkZWQuICovCisJaW50ICgqZW5jcnlwdF9tc2R1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdik7CisJaW50ICgqZGVjcnlwdF9tc2R1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQga2V5aWR4LCBpbnQgaGRyX2xlbiwKKwkJCSAgICB2b2lkICpwcml2KTsKKworCWludCAoKnNldF9rZXkpKHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdik7CisJaW50ICgqZ2V0X2tleSkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KTsKKworCS8qIHByb2NmcyBoYW5kbGVyIGZvciBwcmludGluZyBvdXQga2V5IGluZm9ybWF0aW9uIGFuZCBwb3NzaWJsZQorCSAqIHN0YXRpc3RpY3MgKi8KKwljaGFyICogKCpwcmludF9zdGF0cykoY2hhciAqcCwgdm9pZCAqcHJpdik7CisKKwkvKiBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBhZGRlZCBieSBlbmNyeXB0aW9uOyBlbmNyeXB0IGJ1ZiBpcworCSAqIGFsbG9jYXRlZCB3aXRoIGV4dHJhX3ByZWZpeF9sZW4gYnl0ZXMsIGNvcHkgb2YgaW5fYnVmLCBhbmQKKwkgKiBleHRyYV9wb3N0Zml4X2xlbjsgZW5jcnlwdCBuZWVkIG5vdCB1c2UgYWxsIHRoaXMgc3BhY2UsIGJ1dAorCSAqIHRoZSByZXN1bHQgbXVzdCBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgYW5kIGNvcnJlY3QKKwkgKiBsZW5ndGggbXVzdCBiZSByZXR1cm5lZCAqLworCWludCBleHRyYV9wcmVmaXhfbGVuLCBleHRyYV9wb3N0Zml4X2xlbjsKKworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworfTsKKworc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7IC8qIGRlbGF5ZWQgZGVsZXRpb24gbGlzdCAqLworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOworCXZvaWQgKnByaXY7CisJYXRvbWljX3QgcmVmY250OworfTsKKworaW50IGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKTsKK2ludCBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKTsKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqIGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICosIGludCk7Cit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcih1bnNpZ25lZCBsb25nKTsKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwXzkzY3g2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfOTNjeDYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODc4Y2ZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwXzkzY3g2LmMKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgICBUaGlzIGZpbGVzIGNvbnRhaW5zIGNhcmQgZWVwcm9tICg5M2M0NiBvciA5M2M1NikgcHJvZ3JhbW1pbmcgcm91dGluZXMsCisgICBtZW1vcnkgaXMgYWRkcmVzc2VkIGJ5IDE2IGJpdHMgd29yZHMuCisKKyAgIFRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyLgorICAgQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgICBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZQorICAgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIuCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KKyAgIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbi4KKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyLgorCisgICBXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHRob3NlIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIKKyAgIHByb2plY3QgQXV0aG9ycy4KKyovCisKKyNpbmNsdWRlICJyODE4MF85M2N4Ni5oIgorCit2b2lkIGVwcm9tX2NzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGJpdCkKK3sKKwlpZihiaXQpCisJCXdyaXRlX25pY19ieXRlX0UoZGV2LCBFUFJPTV9DTUQsCisJCQkgICAgICAgKDE8PEVQUk9NX0NTX1NISUZUKSB8IFwKKwkJCSAgICAgICByZWFkX25pY19ieXRlX0UoZGV2LCBFUFJPTV9DTUQpKTsgLy9lbmFibGUgRVBST00KKwllbHNlCisJCXdyaXRlX25pY19ieXRlX0UoZGV2LCBFUFJPTV9DTUQsIHJlYWRfbmljX2J5dGVfRShkZXYsIEVQUk9NX0NNRClcCisJCQkgICAgICAgJn4oMTw8RVBST01fQ1NfU0hJRlQpKTsgLy9kaXNhYmxlIEVQUk9NCisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheShFUFJPTV9ERUxBWSk7Cit9CisKKwordm9pZCBlcHJvbV9ja19jeWNsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdyaXRlX25pY19ieXRlX0UoZGV2LCBFUFJPTV9DTUQsCisJCSAgICAgICAoMTw8RVBST01fQ0tfU0hJRlQpIHwgcmVhZF9uaWNfYnl0ZV9FKGRldixFUFJPTV9DTUQpKTsKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheShFUFJPTV9ERUxBWSk7CisJd3JpdGVfbmljX2J5dGVfRShkZXYsIEVQUk9NX0NNRCwKKwkJICAgICAgIHJlYWRfbmljX2J5dGVfRShkZXYsIEVQUk9NX0NNRCkgJn4gKDE8PEVQUk9NX0NLX1NISUZUKSk7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoRVBST01fREVMQVkpOworfQorCisKK3ZvaWQgZXByb21fdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGJpdCkKK3sKKwlpZihiaXQpCisJCXdyaXRlX25pY19ieXRlX0UoZGV2LCBFUFJPTV9DTUQsICgxPDxFUFJPTV9XX1NISUZUKSB8IFwKKwkJCSAgICAgICByZWFkX25pY19ieXRlX0UoZGV2LEVQUk9NX0NNRCkpOworCWVsc2UKKwkJd3JpdGVfbmljX2J5dGVfRShkZXYsIEVQUk9NX0NNRCwgcmVhZF9uaWNfYnl0ZV9FKGRldixFUFJPTV9DTUQpXAorCQkJICAgICAgICZ+KDE8PEVQUk9NX1dfU0hJRlQpKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KEVQUk9NX0RFTEFZKTsKK30KKworCitzaG9ydCBlcHJvbV9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2hvcnQgYml0OworCisJYml0PShyZWFkX25pY19ieXRlX0UoZGV2LCBFUFJPTV9DTUQpICYgKDE8PEVQUk9NX1JfU0hJRlQpICk7CisJdWRlbGF5KEVQUk9NX0RFTEFZKTsKKworCWlmKGJpdCkgcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBlcHJvbV9zZW5kX2JpdHNfc3RyaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGJbXSwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWZvcihpPTA7IGk8bGVuOyBpKyspeworCQllcHJvbV93KGRldiwgYltpXSk7CisJCWVwcm9tX2NrX2N5Y2xlKGRldik7CisJfQorfQorCisKK3UzMiBlcHJvbV9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhZGRyKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzaG9ydCByZWFkX2NtZFtdPXsxLDEsMH07CisJc2hvcnQgYWRkcl9zdHJbOF07CisJaW50IGk7CisJaW50IGFkZHJfbGVuOworCXUzMiByZXQ7CisKKwlyZXQ9MDsKKyAgICAgICAgLy9lbmFibGUgRVBST00gcHJvZ3JhbW1pbmcKKwl3cml0ZV9uaWNfYnl0ZV9FKGRldiwgRVBST01fQ01ELAorCQkgICAgICAgKEVQUk9NX0NNRF9QUk9HUkFNPDxFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfU0hJRlQpKTsKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheShFUFJPTV9ERUxBWSk7CisKKwlpZiAocHJpdi0+ZXByb210eXBlPT1FUFJPTV85M2M1Nil7CisJCWFkZHJfc3RyWzddPWFkZHIgJiAxOworCQlhZGRyX3N0cls2XT1hZGRyICYgKDE8PDEpOworCQlhZGRyX3N0cls1XT1hZGRyICYgKDE8PDIpOworCQlhZGRyX3N0cls0XT1hZGRyICYgKDE8PDMpOworCQlhZGRyX3N0clszXT1hZGRyICYgKDE8PDQpOworCQlhZGRyX3N0clsyXT1hZGRyICYgKDE8PDUpOworCQlhZGRyX3N0clsxXT1hZGRyICYgKDE8PDYpOworCQlhZGRyX3N0clswXT1hZGRyICYgKDE8PDcpOworCQlhZGRyX2xlbj04OworCX1lbHNleworCQlhZGRyX3N0cls1XT1hZGRyICYgMTsKKwkJYWRkcl9zdHJbNF09YWRkciAmICgxPDwxKTsKKwkJYWRkcl9zdHJbM109YWRkciAmICgxPDwyKTsKKwkJYWRkcl9zdHJbMl09YWRkciAmICgxPDwzKTsKKwkJYWRkcl9zdHJbMV09YWRkciAmICgxPDw0KTsKKwkJYWRkcl9zdHJbMF09YWRkciAmICgxPDw1KTsKKwkJYWRkcl9sZW49NjsKKwl9CisJZXByb21fY3MoZGV2LCAxKTsKKwllcHJvbV9ja19jeWNsZShkZXYpOworCWVwcm9tX3NlbmRfYml0c19zdHJpbmcoZGV2LCByZWFkX2NtZCwgMyk7CisJZXByb21fc2VuZF9iaXRzX3N0cmluZyhkZXYsIGFkZHJfc3RyLCBhZGRyX2xlbik7CisKKwkvL2tlZXAgY2hpcCBwaW4gRCB0byBsb3cgc3RhdGUgd2hpbGUgcmVhZGluZy4KKwkvL0knbSB1bnN1cmUgaWYgaXQgaXMgbmVjZXNzYXJ5LCBidXQgYW55d2F5IHNob3VsZG4ndCBodXJ0CisJZXByb21fdyhkZXYsIDApOworCisJZm9yKGk9MDtpPDE2O2krKyl7CisJCS8vZWVwcm9tIG5lZWRzIGEgY2xrIGN5Y2xlIGJldHdlZW4gd3JpdGluZyBvcGNvZGUmYWRyCisJCS8vYW5kIHJlYWRpbmcgZGF0YS4gKGVlcHJvbSBvdXRzIGEgZHVtbXkgMCkKKwkJZXByb21fY2tfY3ljbGUoZGV2KTsKKwkJcmV0IHw9IChlcHJvbV9yKGRldik8PCgxNS1pKSk7CisJfQorCisJZXByb21fY3MoZGV2LCAwKTsKKwllcHJvbV9ja19jeWNsZShkZXYpOworCisJLy9kaXNhYmxlIEVQUk9NIHByb2dyYW1taW5nCisJd3JpdGVfbmljX2J5dGVfRShkZXYsIEVQUk9NX0NNRCwKKwkJICAgICAgIChFUFJPTV9DTURfTk9STUFMPDxFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfU0hJRlQpKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwXzkzY3g2LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfOTNjeDYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjNhYzk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwXzkzY3g2LmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKwlUaGlzIGlzIHBhcnQgb2YgcnRsODE4NyBPcGVuU291cmNlIGRyaXZlcgorCUNvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNC0yMDA1ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisJUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbiBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIKKworCVdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2Ygc3VjaCBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyIHByb2plY3QgQXV0aG9ycy4KKyovCisKKy8qVGhpcyBmaWxlcyBjb250YWlucyBjYXJkIGVlcHJvbSAoOTNjNDYgb3IgOTNjNTYpIHByb2dyYW1taW5nIHJvdXRpbmVzKi8KKy8qbWVtb3J5IGlzIGFkZHJlc3NlZCBieSBXT1JEUyovCisKKyNpbmNsdWRlICJyODE5MlUuaCIKKyNpbmNsdWRlICJyODE5MlVfaHcuaCIKKworI2RlZmluZSBFUFJPTV9ERUxBWSAxMAorCisjZGVmaW5lIEVQUk9NX0FOQVBBUkFNX0FERFJMV09SRCAweGQKKyNkZWZpbmUgRVBST01fQU5BUEFSQU1fQUREUkhXT1JEIDB4ZQorCisjZGVmaW5lIEVQUk9NX1JGQ0hJUElEIDB4NgorI2RlZmluZSBFUFJPTV9UWFBXX0JBU0UgMHgwNQorI2RlZmluZSBFUFJPTV9SRkNISVBJRF9SVEw4MjI1VSA1CisjZGVmaW5lIEVQUk9NX1JGX1BBUkFNIDB4NAorI2RlZmluZSBFUFJPTV9DT05GSUcyIDB4YworCisjZGVmaW5lIEVQUk9NX1ZFUlNJT04gMHgxRQorI2RlZmluZSBNQUNfQURSIDB4NworCisjZGVmaW5lIENJUyAweDE4CisKKyNkZWZpbmUgRVBST01fVFhQVzAgMHgxNgorI2RlZmluZSBFUFJPTV9UWFBXMiAweDFiCisjZGVmaW5lIEVQUk9NX1RYUFcxIDB4M2QKKworCit1MzIgZXByb21fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHUzMiBhZGRyKTsgLy9yZWFkcyBhIDE2IGJpdHMgd29yZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwX3BtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzU4ZDBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwX3BtLmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAgIFBvd2VyIG1hbmFnZW1lbnQgaW50ZXJmYWNlIHJvdXRpbmVzLgorICAgV3JpdHRlbiBieSBNYXJpdXN6IE1hdHVzemVrLgorICAgVGhpcyBjb2RlIGlzIGN1cnJlbnRseSBqdXN0IGEgcGxhY2Vob2xkZXIgZm9yIGxhdGVyIHdvcmsgYW5kCisgICBkb2VzIG5vdCBkbyBhbnl0aGluZyB1c2VmdWwuCisKKyAgIFRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyLgorICAgQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgICBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorKi8KKworI2lmZGVmIENPTkZJR19SVEw4MTgwX1BNCisKKworI2luY2x1ZGUgInI4MTgwX2h3LmgiCisjaW5jbHVkZSAicjgxODBfcG0uaCIKKworaW50IHJ0bDgxODBfc2F2ZV9zdGF0ZSAoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIHN0YXRlKQoreworCXByaW50ayhLRVJOX05PVElDRSAicjgxODAgc2F2ZSBzdGF0ZSBjYWxsIChzdGF0ZSAldSkuXG4iLCBzdGF0ZSk7CisJcmV0dXJuKC1FQUdBSU4pOworfQorCisKK2ludCBydGw4MTgwX3N1c3BlbmQgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUzMiBzdGF0ZSkKK3sKKwlwcmludGsoS0VSTl9OT1RJQ0UgInI4MTgwIHN1c3BlbmQgY2FsbCAoc3RhdGUgJXUpLlxuIiwgc3RhdGUpOworCXJldHVybigtRUFHQUlOKTsKK30KKworCitpbnQgcnRsODE4MF9yZXN1bWUgKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJcHJpbnRrKEtFUk5fTk9USUNFICJyODE4MCByZXN1bWUgY2FsbC5cbiIpOworCXJldHVybigtRUFHQUlOKTsKK30KKworCitpbnQgcnRsODE4MF9lbmFibGVfd2FrZSAoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIHN0YXRlLCBpbnQgZW5hYmxlKQoreworCXByaW50ayhLRVJOX05PVElDRSAicjgxODAgZW5hYmxlIHdha2UgY2FsbCAoc3RhdGUgJXUsIGVuYWJsZSAlZCkuXG4iLAorCSAgICAgICBzdGF0ZSwgZW5hYmxlKTsKKwlyZXR1cm4oLUVBR0FJTik7Cit9CisKKworCisjZW5kaWYgLy9DT05GSUdfUlRMODE4MF9QTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwX3BtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfcG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2QxOGE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwX3BtLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAgICAgICAgUG93ZXIgbWFuYWdlbWVudCBpbnRlcmZhY2Ugcm91dGluZXMuCisJV3JpdHRlbiBieSBNYXJpdXN6IE1hdHVzemVrLgorCVRoaXMgY29kZSBpcyBjdXJyZW50bHkganVzdCBhIHBsYWNlaG9sZGVyIGZvciBsYXRlciB3b3JrIGFuZAorCWRvZXMgbm90IGRvIGFueXRoaW5nIHVzZWZ1bC4KKworCVRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyLgorCUNvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNCAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKyovCisKKyNpZmRlZiBDT05GSUdfUlRMODE4MF9QTQorCisjaWZuZGVmIFI4MTgwX1BNX0gKKyNkZWZpbmUgUjgxODBfUE1fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworaW50IHJ0bDgxODBfc2F2ZV9zdGF0ZSAoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIHN0YXRlKTsKK2ludCBydGw4MTgwX3N1c3BlbmQgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUzMiBzdGF0ZSk7CitpbnQgcnRsODE4MF9yZXN1bWUgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworaW50IHJ0bDgxODBfZW5hYmxlX3dha2UgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUzMiBzdGF0ZSwgaW50IGVuYWJsZSk7CisKKyNlbmRpZiAvL1I4MTgwX1BNX0gKKworI2VuZGlmIC8vIENPTkZJR19SVEw4MTgwX1BNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTBfcnRsODI1Ni5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkwX3J0bDgyNTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGZmMzM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkwX3J0bDgyNTYuYwpAQCAtMCwwICsxLDMxMiBAQAorLyoKKyAgVGhpcyBpcyBwYXJ0IG9mIHRoZSBydGw4MTkyIGRyaXZlcgorICByZWxlYXNlZCB1bmRlciB0aGUgR1BMIChTZWUgZmlsZSBDT1BZSU5HIGZvciBkZXRhaWxzKS4KKworICBUaGlzIGZpbGVzIGNvbnRhaW5zIHByb2dyYW1taW5nIGNvZGUgZm9yIHRoZSBydGw4MjU2CisgIHJhZGlvIGZyb250ZW5kLgorCisgICpNYW55KiB0aGFua3MgdG8gUmVhbHRlayBDb3JwLiBmb3IgdGhlaXIgZ3JlYXQgc3VwcG9ydCEKKworKi8KKworI2luY2x1ZGUgInI4MTkyVS5oIgorI2luY2x1ZGUgInI4MTkyVV9ody5oIgorI2luY2x1ZGUgInI4MTl4VV9waHlyZWcuaCIKKyNpbmNsdWRlICJyODE5eFVfcGh5LmgiCisjaW5jbHVkZSAicjgxOTBfcnRsODI1Ni5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPdmVydmlldzogICAJc2V0IFJGIGJhbmQgd2lkdGggKDIwTSBvciA0ME0pCisgKiBJbnB1dDogICAgICAgc3RydWN0IG5ldF9kZXZpY2UqCWRldgorICogCQlXSVJFTEVTU19CQU5EV0lEVEhfRQlCYW5kd2lkdGgJLy8yME0gb3IgNDBNCisgKiBPdXRwdXQ6ICAgICAgTk9ORQorICogUmV0dXJuOiAgICAgIE5PTkUKKyAqIE5vdGU6CTgyMjYgc3VwcG9ydCBib3RoIDIwTSAgYW5kIDQwIE1IegorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYgLCBIVF9DSEFOTkVMX1dJRFRIIEJhbmR3aWR0aCkJLy8yME0gb3IgNDBNCit7CisJdTgJZVJGUGF0aDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwkvL2ZvcihlUkZQYXRoID0gUkY5MF9QQVRIX0E7IGVSRlBhdGggPHBIYWxEYXRhLT5OdW1Ub3RhbFJGUGF0aDsgZVJGUGF0aCsrKQorCWZvcihlUkZQYXRoID0gMDsgZVJGUGF0aCA8UkY5MF9QQVRIX01BWDsgZVJGUGF0aCsrKQorCXsKKwkJaWYgKCFydGw4MTkyX3BoeV9DaGVja0lzTGVnYWxSRlBhdGgoZGV2LCBlUkZQYXRoKSkKKwkJCQljb250aW51ZTsKKworCQlzd2l0Y2goQmFuZHdpZHRoKQorCQl7CisJCQljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjA6CisJCQkJaWYocHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPT0gVkVSU0lPTl84MTl4VV9BIHx8IHByaXYtPmNhcmRfODE5Ml92ZXJzaW9uID09IFZFUlNJT05fODE5eFVfQikvLyA4MjU2IEQtY3V0LCBFLWN1dCwgeGlvbmc6IGNvbnNpZGVyIGl0IGxhdGVyIQorCQkJCXsKKwkJCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgMHgwYiwgYk1hc2sxMkJpdHMsIDB4MTAwKTsgLy9waHkgcGFyYToxYmEKKwkJCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgMHgyYywgYk1hc2sxMkJpdHMsIDB4M2Q3KTsKKwkJCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgMHgwZSwgYk1hc2sxMkJpdHMsIDB4MDIxKTsKKworCQkJCQkvL2Nvc2EgYWRkIGZvciBzZDMncyByZXF1ZXN0IDAxLzIzLzIwMDgKKwkJCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgMHgxNCwgYk1hc2sxMkJpdHMsIDB4NWFiKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKCk6IHVua25vd24gaGFyZHdhcmUgdmVyc2lvblxuIik7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjBfNDA6CisJCQkJaWYocHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPT0gVkVSU0lPTl84MTl4VV9BIHx8cHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPT0gVkVSU0lPTl84MTl4VV9CKS8vIDgyNTYgRC1jdXQsIEUtY3V0LCB4aW9uZzogY29uc2lkZXIgaXQgbGF0ZXIhCisJCQkJeworCQkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCAweDBiLCBiTWFzazEyQml0cywgMHgzMDApOyAvL3BoeSBwYXJhOjNiYQorCQkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCAweDJjLCBiTWFzazEyQml0cywgMHgzZGYpOworCQkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCAweDBlLCBiTWFzazEyQml0cywgMHgwYTEpOworCisJCQkJCS8vY29zYSBhZGQgZm9yIHNkMydzIHJlcXVlc3QgMDEvMjMvMjAwOAorCQkJCQlpZihwcml2LT5jaGFuID09IDMgfHwgcHJpdi0+Y2hhbiA9PSA5KSAvL0kgbmVlZCB0byBzZXQgcHJpdi0+Y2hhbiB3aGVuZXZlciBjdXJyZW50IGNoYW5uZWwgY2hhbmdlcworCQkJCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgMHgxNCwgYk1hc2sxMkJpdHMsIDB4NTliKTsKKwkJCQkJZWxzZQorCQkJCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgMHgxNCwgYk1hc2sxMkJpdHMsIDB4NWFiKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKCk6IHVua25vd24gaGFyZHdhcmUgdmVyc2lvblxuIik7CisJCQkJfQorCisKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKCk6IHVua25vd24gQmFuZHdpZHRoOiAlI1hcbiIsQmFuZHdpZHRoICk7CisJCQkJYnJlYWs7CisKKwkJfQorCX0KKwlyZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPdmVydmlldzogICAgSW50ZXJmYWNlIHRvIGNvbmZpZyA4MjU2CisgKiBJbnB1dDogICAgICAgc3RydWN0IG5ldF9kZXZpY2UqCWRldgorICogT3V0cHV0OiAgICAgIE5PTkUKKyAqIFJldHVybjogICAgICBOT05FCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIFBIWV9SRjgyNTZfQ29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vIEluaXRpYWxpemUgZ2VuZXJhbCBnbG9iYWwgdmFsdWUKKwkvLworCS8vIFRPRE86IEV4dGVuZCBSRl9QQVRIX0MgYW5kIFJGX1BBVEhfRCBpbiB0aGUgZnV0dXJlCisJcHJpdi0+TnVtVG90YWxSRlBhdGggPSBSVEw4MTlYX1RPVEFMX1JGX1BBVEg7CisJLy8gQ29uZmlnIEJCIGFuZCBSRgorCXBoeV9SRjgyNTZfQ29uZmlnX1BhcmFGaWxlKGRldik7CisKKwlyZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPdmVydmlldzogICAgSW50ZXJmYWNlIHRvIGNvbmZpZyA4MjU2CisgKiBJbnB1dDogICAgICAgc3RydWN0IG5ldF9kZXZpY2UqCWRldgorICogT3V0cHV0OiAgICAgIE5PTkUKKyAqIFJldHVybjogICAgICBOT05FCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHBoeV9SRjgyNTZfQ29uZmlnX1BhcmFGaWxlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJdTMyIAl1NFJlZ1ZhbHVlID0gMDsKKwkvL3N0YXRpYyBzMUJ5dGUJCQkJc3pSYWRpb0FGaWxlW10gPSBSVEw4MTlYX1BIWV9SQURJT19BOworCS8vc3RhdGljIHMxQnl0ZQkJCQlzelJhZGlvQkZpbGVbXSA9IFJUTDgxOVhfUEhZX1JBRElPX0I7CisJLy9zdGF0aWMgczFCeXRlCQkJCXN6UmFkaW9DRmlsZVtdID0gUlRMODE5WF9QSFlfUkFESU9fQzsKKwkvL3N0YXRpYyBzMUJ5dGUJCQkJc3pSYWRpb0RGaWxlW10gPSBSVEw4MTlYX1BIWV9SQURJT19EOworCXU4IAllUkZQYXRoOworCUJCX1JFR0lTVEVSX0RFRklOSVRJT05fVAkqcFBoeVJlZzsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyCVJlZ09mZlNldFRvQmVDaGVjayA9IDB4MzsKKwl1MzIgCVJlZ1ZhbHVlVG9CZUNoZWNrID0gMHg3ZjE7CisJdTMyCVJGM19GaW5hbF9WYWx1ZSA9IDA7CisJdTgJQ29uc3RSZXRyeVRpbWVzID0gNSwgUmV0cnlUaW1lcyA9IDU7CisJdTggcmV0ID0gMDsKKwkvLzMvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8zLy8gPDI+IEluaXRpYWxpemUgUkYKKwkvLzMvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJZm9yKGVSRlBhdGggPSAoUkY5MF9SQURJT19QQVRIX0UpUkY5MF9QQVRIX0E7IGVSRlBhdGggPHByaXYtPk51bVRvdGFsUkZQYXRoOyBlUkZQYXRoKyspCisJeworCQlpZiAoIXJ0bDgxOTJfcGh5X0NoZWNrSXNMZWdhbFJGUGF0aChkZXYsIGVSRlBhdGgpKQorCQkJCWNvbnRpbnVlOworCisJCXBQaHlSZWcgPSAmcHJpdi0+UEhZUmVnRGVmW2VSRlBhdGhdOworCisJCS8vIEpvc2VwaCB0ZXN0IGZvciBzaG9ydGVuIFJGIGNvbmZpZworCS8vCXBIYWxEYXRhLT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSA9ICBydGw4MTkyX3BoeV9RdWVyeVJGUmVnKGRldiwgKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgsIHJHbG9iYWxDdHJsLCBiTWFza0RXb3JkKTsKKworCQkvKi0tLS1TdG9yZSBvcmlnaW5hbCBSRkVOViBjb250cm9sIHR5cGUtLS0tKi8KKwkJc3dpdGNoKGVSRlBhdGgpCisJCXsKKwkJY2FzZSBSRjkwX1BBVEhfQToKKwkJY2FzZSBSRjkwX1BBVEhfQzoKKwkJCXU0UmVnVmFsdWUgPSBydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCBwUGh5UmVnLT5yZmludGZzLCBiUkZTSV9SRkVOVik7CisJCQlicmVhazsKKwkJY2FzZSBSRjkwX1BBVEhfQiA6CisJCWNhc2UgUkY5MF9QQVRIX0Q6CisJCQl1NFJlZ1ZhbHVlID0gcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgcFBoeVJlZy0+cmZpbnRmcywgYlJGU0lfUkZFTlY8PDE2KTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyotLS0tU2V0IFJGX0VOViBlbmFibGUtLS0tKi8KKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmaW50ZmUsIGJSRlNJX1JGRU5WPDwxNiwgMHgxKTsKKworCQkvKi0tLS1TZXQgUkZfRU5WIG91dHB1dCBoaWdoLS0tLSovCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBwUGh5UmVnLT5yZmludGZvLCBiUkZTSV9SRkVOViwgMHgxKTsKKworCQkvKiBTZXQgYml0IG51bWJlciBvZiBBZGRyZXNzIGFuZCBEYXRhIGZvciBSRiByZWdpc3RlciAqLworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmZIU1NJUGFyYTIsIGIzV2lyZUFkZHJlc3NMZW5ndGgsIDB4MCk7IAkvLyBTZXQgMCB0byA0IGJpdHMgZm9yIFotc2VyaWFsIGFuZCBzZXQgMSB0byA2IGJpdHMgZm9yIDgyNTgKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmSFNTSVBhcmEyLCBiM1dpcmVEYXRhTGVuZ3RoLCAweDApOwkvLyBTZXQgMCB0byAxMiBiaXRzIGZvciBaLXNlcmlhbCBhbmQgODI1OCwgYW5kIHNldCAxIHRvIDE0IGJpdHMgZm9yID8/PworCisJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKGRldiwgKFJGOTBfUkFESU9fUEFUSF9FKSBlUkZQYXRoLCAweDAsIGJNYXNrMTJCaXRzLCAweGJmKTsKKworCQkvKi0tLS1DaGVjayBSRiBibG9jayAoZm9yIEZQR0EgcGxhdGZvcm0gb25seSktLS0tKi8KKwkJLy8gVE9ETzogdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgcmVtb3ZlZCBvbiBBU0lDICwgRW1pbHkgMjAwNy4yLjIKKwkJaWYgKHJ0bDgxOTJfcGh5X2NoZWNrQkJBbmRSRihkZXYsIEhXOTBfQkxPQ0tfUkYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoKSkKKwkJeworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFlfUkY4MjU2X0NvbmZpZygpOkNoZWNrIFJhZGlvWyVkXSBGYWlsISFcbiIsIGVSRlBhdGgpOworCQkJZ290byBwaHlfUkY4MjU2X0NvbmZpZ19QYXJhRmlsZV9GYWlsOworCQl9CisKKwkJUmV0cnlUaW1lcyA9IENvbnN0UmV0cnlUaW1lczsKKwkJUkYzX0ZpbmFsX1ZhbHVlID0gMDsKKwkJLyotLS0tSW5pdGlhbGl6ZSBSRiBmb20gY29ubmZpZ3VyYXRpb24gZmlsZS0tLS0qLworCQlzd2l0Y2goZVJGUGF0aCkKKwkJeworCQljYXNlIFJGOTBfUEFUSF9BOgorCQkJd2hpbGUoUkYzX0ZpbmFsX1ZhbHVlIT1SZWdWYWx1ZVRvQmVDaGVjayAmJiBSZXRyeVRpbWVzIT0wKQorCQkJeworCQkJCXJldCA9IHJ0bDgxOTJfcGh5X0NvbmZpZ1JGV2l0aEhlYWRlckZpbGUoZGV2LChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoKTsKKwkJCQlSRjNfRmluYWxfVmFsdWUgPSBydGw4MTkyX3BoeV9RdWVyeVJGUmVnKGRldiwgKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgsIFJlZ09mZlNldFRvQmVDaGVjaywgYk1hc2sxMkJpdHMpOworCQkJCVJUX1RSQUNFKENPTVBfUkYsICJSRiAlZCAlZCByZWdpc3RlciBmaW5hbCB2YWx1ZTogJXhcbiIsIGVSRlBhdGgsIFJlZ09mZlNldFRvQmVDaGVjaywgUkYzX0ZpbmFsX1ZhbHVlKTsKKwkJCQlSZXRyeVRpbWVzLS07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSRjkwX1BBVEhfQjoKKwkJCXdoaWxlKFJGM19GaW5hbF9WYWx1ZSE9UmVnVmFsdWVUb0JlQ2hlY2sgJiYgUmV0cnlUaW1lcyE9MCkKKwkJCXsKKwkJCQlyZXQgPSBydGw4MTkyX3BoeV9Db25maWdSRldpdGhIZWFkZXJGaWxlKGRldiwoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCk7CisJCQkJUkYzX0ZpbmFsX1ZhbHVlID0gcnRsODE5Ml9waHlfUXVlcnlSRlJlZyhkZXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCBSZWdPZmZTZXRUb0JlQ2hlY2ssIGJNYXNrMTJCaXRzKTsKKwkJCQlSVF9UUkFDRShDT01QX1JGLCAiUkYgJWQgJWQgcmVnaXN0ZXIgZmluYWwgdmFsdWU6ICV4XG4iLCBlUkZQYXRoLCBSZWdPZmZTZXRUb0JlQ2hlY2ssIFJGM19GaW5hbF9WYWx1ZSk7CisJCQkJUmV0cnlUaW1lcy0tOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUkY5MF9QQVRIX0M6CisJCQl3aGlsZShSRjNfRmluYWxfVmFsdWUhPVJlZ1ZhbHVlVG9CZUNoZWNrICYmIFJldHJ5VGltZXMhPTApCisJCQl7CisJCQkJcmV0ID0gcnRsODE5Ml9waHlfQ29uZmlnUkZXaXRoSGVhZGVyRmlsZShkZXYsKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgpOworCQkJCVJGM19GaW5hbF9WYWx1ZSA9IHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgUmVnT2ZmU2V0VG9CZUNoZWNrLCBiTWFzazEyQml0cyk7CisJCQkJUlRfVFJBQ0UoQ09NUF9SRiwgIlJGICVkICVkIHJlZ2lzdGVyIGZpbmFsIHZhbHVlOiAleFxuIiwgZVJGUGF0aCwgUmVnT2ZmU2V0VG9CZUNoZWNrLCBSRjNfRmluYWxfVmFsdWUpOworCQkJCVJldHJ5VGltZXMtLTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJGOTBfUEFUSF9EOgorCQkJd2hpbGUoUkYzX0ZpbmFsX1ZhbHVlIT1SZWdWYWx1ZVRvQmVDaGVjayAmJiBSZXRyeVRpbWVzIT0wKQorCQkJeworCQkJCXJldCA9IHJ0bDgxOTJfcGh5X0NvbmZpZ1JGV2l0aEhlYWRlckZpbGUoZGV2LChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoKTsKKwkJCQlSRjNfRmluYWxfVmFsdWUgPSBydGw4MTkyX3BoeV9RdWVyeVJGUmVnKGRldiwgKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgsIFJlZ09mZlNldFRvQmVDaGVjaywgYk1hc2sxMkJpdHMpOworCQkJCVJUX1RSQUNFKENPTVBfUkYsICJSRiAlZCAlZCByZWdpc3RlciBmaW5hbCB2YWx1ZTogJXhcbiIsIGVSRlBhdGgsIFJlZ09mZlNldFRvQmVDaGVjaywgUkYzX0ZpbmFsX1ZhbHVlKTsKKwkJCQlSZXRyeVRpbWVzLS07CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8qLS0tLVJlc3RvcmUgUkZFTlYgY29udHJvbCB0eXBlLS0tLSovOworCQlzd2l0Y2goZVJGUGF0aCkKKwkJeworCQljYXNlIFJGOTBfUEFUSF9BOgorCQljYXNlIFJGOTBfUEFUSF9DOgorCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmaW50ZnMsIGJSRlNJX1JGRU5WLCB1NFJlZ1ZhbHVlKTsKKwkJCWJyZWFrOworCQljYXNlIFJGOTBfUEFUSF9CIDoKKwkJY2FzZSBSRjkwX1BBVEhfRDoKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBwUGh5UmVnLT5yZmludGZzLCBiUkZTSV9SRkVOVjw8MTYsIHU0UmVnVmFsdWUpOworCQkJYnJlYWs7CisJCX0KKworCQlpZihyZXQpeworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJwaHlfUkY4MjU2X0NvbmZpZ19QYXJhRmlsZSgpOlJhZGlvWyVkXSBGYWlsISEiLCBlUkZQYXRoKTsKKwkJCWdvdG8gcGh5X1JGODI1Nl9Db25maWdfUGFyYUZpbGVfRmFpbDsKKwkJfQorCisJfQorCisJUlRfVFJBQ0UoQ09NUF9QSFksICJQSFkgSW5pdGlhbGl6YXRpb24gU3VjY2Vzc1xuIikgOworCXJldHVybiA7CisKK3BoeV9SRjgyNTZfQ29uZmlnX1BhcmFGaWxlX0ZhaWw6CisJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFkgSW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKSA7CisJcmV0dXJuIDsKK30KKworCit2b2lkIFBIWV9TZXRSRjgyNTZDQ0tUeFBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlKglkZXYsIHU4CXBvd2VybGV2ZWwpCit7CisJdTMyCVR4QUdDPTA7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vbW9kaWZpZWQgYnkgdml2aSwgMjAwODAxMDkKKwlUeEFHQyA9IHBvd2VybGV2ZWw7CisKKwlpZihwcml2LT5iRHluYW1pY1R4TG93UG93ZXIgPT0gVFJVRSApIC8vY29zYSAwNS8yMi8yMDA4IGZvciBzY2FuCisJeworCQlpZihwcml2LT5DdXN0b21lcklEID09IFJUX0NJRF84MTl4X05ldGNvcmUpCisJCQlUeEFHQyA9IDB4MjI7CisJCWVsc2UKKwkJVHhBR0MgKz0gcHJpdi0+Q2NrUHdFbmw7CisJfQorCisJaWYoVHhBR0MgPiAweDI0KQorCQlUeEFHQyA9IDB4MjQ7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJUeEFHQ19DQ0tfTWNzMzIsIGJUeEFHQ1JhdGVDQ0ssIFR4QUdDKTsKK30KKworCit2b2lkIFBIWV9TZXRSRjgyNTZPRkRNVHhQb3dlcihzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1OCBwb3dlcmxldmVsKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL0pvc2VwaCBUeFBvd2VyIGZvciA4MTkyIHRlc3RpbmcKKwl1MzIgd3JpdGVWYWwsIHBvd2VyQmFzZTAsIHBvd2VyQmFzZTEsIHdyaXRlVmFsX3RtcDsKKwl1OCBpbmRleCA9IDA7CisJdTE2IFJlZ09mZnNldFs2XSA9IHsweGUwMCwgMHhlMDQsIDB4ZTEwLCAweGUxNCwgMHhlMTgsIDB4ZTFjfTsKKwl1OCBieXRlMCwgYnl0ZTEsIGJ5dGUyLCBieXRlMzsKKworCXBvd2VyQmFzZTAgPSBwb3dlcmxldmVsICsgcHJpdi0+VHhQb3dlckRpZmY7CS8vT0ZETSByYXRlcworCXBvd2VyQmFzZTAgPSAocG93ZXJCYXNlMDw8MjQpIHwgKHBvd2VyQmFzZTA8PDE2KSB8KHBvd2VyQmFzZTA8PDgpIHxwb3dlckJhc2UwOworCXBvd2VyQmFzZTEgPSBwb3dlcmxldmVsOwkJCQkJCQkvL01DUyByYXRlcworCXBvd2VyQmFzZTEgPSAocG93ZXJCYXNlMTw8MjQpIHwgKHBvd2VyQmFzZTE8PDE2KSB8KHBvd2VyQmFzZTE8PDgpIHxwb3dlckJhc2UxOworCisJZm9yKGluZGV4PTA7IGluZGV4PDY7IGluZGV4KyspCisJeworCQl3cml0ZVZhbCA9IHByaXYtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2luZGV4XSArICgoaW5kZXg8Mik/cG93ZXJCYXNlMDpwb3dlckJhc2UxKTsKKwkJYnl0ZTAgPSAodTgpKHdyaXRlVmFsICYgMHg3Zik7CisJCWJ5dGUxID0gKHU4KSgod3JpdGVWYWwgJiAweDdmMDApPj44KTsKKwkJYnl0ZTIgPSAodTgpKCh3cml0ZVZhbCAmIDB4N2YwMDAwKT4+MTYpOworCQlieXRlMyA9ICh1OCkoKHdyaXRlVmFsICYgMHg3ZjAwMDAwMCk+PjI0KTsKKwkJaWYoYnl0ZTAgPiAweDI0KQkvLyBNYXggcG93ZXIgaW5kZXggPSAweDI0CisJCQlieXRlMCA9IDB4MjQ7CisJCWlmKGJ5dGUxID4gMHgyNCkKKwkJCWJ5dGUxID0gMHgyNDsKKwkJaWYoYnl0ZTIgPiAweDI0KQorCQkJYnl0ZTIgPSAweDI0OworCQlpZihieXRlMyA+IDB4MjQpCisJCQlieXRlMyA9IDB4MjQ7CisKKwkJLy9mb3IgdHggcG93ZXIgdHJhY2sKKwkJaWYoaW5kZXggPT0gMykKKwkJeworCQkJd3JpdGVWYWxfdG1wID0gKGJ5dGUzPDwyNCkgfCAoYnl0ZTI8PDE2KSB8KGJ5dGUxPDw4KSB8Ynl0ZTA7CisJCQlwcml2LT5Qd3JfVHJhY2sgPSB3cml0ZVZhbF90bXA7CisJCX0KKworCQlpZihwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyID09IFRSVUUpICAgICAvL0FkZCBieSBKYWNrZW4gMjAwOC8wMy8wNgorCQl7CisJCQkvLyBFbWlseSwgMjAwODA2MTMuIFNldCBsb3cgdHggcG93ZXIgZm9yIGJvdGggTUNTIGFuZCBsZWdhY3kgT0ZETQorCQkJd3JpdGVWYWwgPSAweDAzMDMwMzAzOworCQl9CisJCWVsc2UKKwkJeworCQkJd3JpdGVWYWwgPSAoYnl0ZTM8PDI0KSB8IChieXRlMjw8MTYpIHwoYnl0ZTE8PDgpIHxieXRlMDsKKwkJfQorCQlydGw4MTkyX3NldEJCcmVnKGRldiwgUmVnT2Zmc2V0W2luZGV4XSwgMHg3ZjdmN2Y3Ziwgd3JpdGVWYWwpOworCX0KKwlyZXR1cm47CisKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkwX3J0bDgyNTYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MF9ydGw4MjU2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMxZjY1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MF9ydGw4MjU2LmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAgVGhpcyBpcyBwYXJ0IG9mIHRoZSBydGw4MTgwLXNhMjQwMCBkcml2ZXIKKyAgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCAoU2VlIGZpbGUgQ09QWUlORyBmb3IgZGV0YWlscykuCisgIENvcHlyaWdodCAoYykgMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisKKyAgVGhpcyBmaWxlcyBjb250YWlucyBwcm9ncmFtbWluZyBjb2RlIGZvciB0aGUgcnRsODI1NgorICByYWRpbyBmcm9udGVuZC4KKworICAqTWFueSogdGhhbmtzIHRvIFJlYWx0ZWsgQ29ycC4gZm9yIHRoZWlyIGdyZWF0IHN1cHBvcnQhCisKKyovCisKKyNpZm5kZWYgUlRMODIyNUgKKyNkZWZpbmUgUlRMODIyNUgKKworI2lmZGVmIFJUTDgxOTBQCisjZGVmaW5lIFJUTDgxOVhfVE9UQUxfUkZfUEFUSCA0IC8vZm9yIDkwUAorI2Vsc2UKKyNkZWZpbmUgUlRMODE5WF9UT1RBTF9SRl9QQVRIIDIgLy9mb3IgODE5MlUKKyNlbmRpZgorZXh0ZXJuIHZvaWQgUEhZX1NldFJGODI1NkJhbmR3aWR0aChzdHJ1Y3QgbmV0X2RldmljZSogZGV2ICwgSFRfQ0hBTk5FTF9XSURUSCBCYW5kd2lkdGgpOworZXh0ZXJuIHZvaWQgUEhZX1JGODI1Nl9Db25maWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitleHRlcm4gdm9pZCBwaHlfUkY4MjU2X0NvbmZpZ19QYXJhRmlsZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK2V4dGVybiB2b2lkIFBIWV9TZXRSRjgyNTZDQ0tUeFBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlKglkZXYsIHU4CXBvd2VybGV2ZWwpOworZXh0ZXJuIHZvaWQgUEhZX1NldFJGODI1Nk9GRE1UeFBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHU4IHBvd2VybGV2ZWwpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWEyNzIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVS5oCkBAIC0wLDAgKzEsMTI2MyBAQAorLyoKKyAgIFRoaXMgaXMgcGFydCBvZiBydGw4MTg3IE9wZW5Tb3VyY2UgZHJpdmVyLgorICAgQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAgIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlCisgICBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxOTIgZHJpdmVyIHNrZWxldG9uCisgICBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyCisKKyAgIFdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2YgdGhvc2UgcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlcgorICAgcHJvamVjdCBBdXRob3JzLgorKi8KKworI2lmbmRlZiBSODE5eFVfSAorI2RlZmluZSBSODE5eFVfSAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4JLy9mb3IgcnRubF9sb2NrKCkKKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgkvLyBOZWNlc3NhcnkgYmVjYXVzZSB3ZSB1c2UgdGhlIHByb2MgZnMKKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKKyNkZWZpbmUgUlRMODE5MlUKKyNkZWZpbmUgUlRMODE5eFVfTU9EVUxFX05BTUUgInJ0bDgxOXhVIgorLy9hZGRlZCBmb3IgSFcgc2VjdXJpdHksIGpvaG4uMDYyOQorI2RlZmluZSBGQUxTRSAwCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBNQVhfS0VZX0xFTiAgICAgNjEKKyNkZWZpbmUgS0VZX0JVRl9TSVpFICAgIDUKKworI2RlZmluZSBCSVQwICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBCSVQxICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBCSVQyICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBCSVQzICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBCSVQ0ICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBCSVQ1ICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBCSVQ2ICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBCSVQ3ICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBCSVQ4ICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBCSVQ5ICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBCSVQxMCAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBCSVQxMSAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBCSVQxMiAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBCSVQxMyAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBCSVQxNCAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBCSVQxNSAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBCSVQxNiAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBCSVQxNyAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBCSVQxOCAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBCSVQxOSAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBCSVQyMCAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBCSVQyMSAgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBCSVQyMiAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBCSVQyMyAgICAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBCSVQyNCAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBCSVQyNSAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBCSVQyNiAgICAgICAgICAgMHgwNDAwMDAwMAorI2RlZmluZSBCSVQyNyAgICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBCSVQyOCAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBCSVQyOSAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBCSVQzMCAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBCSVQzMSAgICAgICAgICAgMHg4MDAwMDAwMAorCisvLyBSeCBzbW9vdGggZmFjdG9yCisjZGVmaW5lCVJ4X1Ntb290aF9GYWN0b3IJCTIwCisjZGVmaW5lIERNRVNHKHgsYS4uLikKKyNkZWZpbmUgRE1FU0dXKHgsYS4uLikKKyNkZWZpbmUgRE1FU0dFKHgsYS4uLikKK2V4dGVybiB1MzIgcnRfZ2xvYmFsX2RlYnVnX2NvbXBvbmVudDsKKyNkZWZpbmUgUlRfVFJBQ0UoY29tcG9uZW50LCB4LCBhcmdzLi4uKSBcCitkbyB7IGlmKHJ0X2dsb2JhbF9kZWJ1Z19jb21wb25lbnQgJiBjb21wb25lbnQpIFwKKwlwcmludGsoS0VSTl9ERUJVRyBSVEw4MTl4VV9NT0RVTEVfTkFNRSAiOiIgeCAiXG4iICwgXAorCSAgICAgICAjI2FyZ3MpO1wKK313aGlsZSgwKTsKKworI2RlZmluZSBDT01QX1RSQUNFCQkJCUJJVDAJCS8vIEZvciBmdW5jdGlvbiBjYWxsIHRyYWNpbmcuCisjZGVmaW5lIENPTVBfREJHCQkJCUJJVDEJCS8vIE9ubHkgZm9yIHRlbXBvcmFyeSBkZWJ1ZyBtZXNzYWdlLgorI2RlZmluZSBDT01QX0lOSVQJCQkJQklUMgkJLy8gZHVyaW5nIGRyaXZlciBpbml0aWFsaXphdGlvbiAvIGhhbHQgLyByZXNldC4KKworCisjZGVmaW5lIENPTVBfUkVDVgkJCQlCSVQzCQkvLyBSZXZlaXZlIHBhcnQgZGF0YSBwYXRoLgorI2RlZmluZSBDT01QX1NFTkQJCQkJQklUNAkJLy8gU2VuZCBwYXJ0IHBhdGguCisjZGVmaW5lIENPTVBfSU8JCQkJCUJJVDUJCS8vIEkvTyBSZWxhdGVkLiBBZGRlZCBieSBBbm5pZSwgMjAwNi0wMy0wMi4KKyNkZWZpbmUgQ09NUF9QT1dFUgkJCQlCSVQ2CQkvLyA4MDIuMTEgUG93ZXIgU2F2ZSBtb2RlIG9yIFN5c3RlbS9EZXZpY2UgUG93ZXIgc3RhdGUgcmVsYXRlZC4KKyNkZWZpbmUgQ09NUF9FUFJPTQkJCQlCSVQ3CQkvLyA4MDIuMTEgbGluayByZWxhdGVkOiBqb2luL3N0YXJ0IEJTUywgbGVhdmUgQlNTLgorI2RlZmluZSBDT01QX1NXQlcJCQkJQklUOAkvLyBGb3IgYmFuZHdpZHRoIHN3aXRjaC4KKyNkZWZpbmUgQ09NUF9QT1dFUl9UUkFDS0lORwkJCUJJVDkJLy9GT1IgODE5MCBUWCBQT1dFUiBUUkFDS0lORworI2RlZmluZSBDT01QX1RVUkJPCQkJCUJJVDEwCS8vIEZvciBUdXJibyBNb2RlIHJlbGF0ZWQuIEJ5IEFubmllLCAyMDA1LTEwLTIxLgorI2RlZmluZSBDT01QX1FPUwkJCQlCSVQxMQkvLyBGb3IgUW9TLgorI2RlZmluZSBDT01QX1JBVEUJCQkJQklUMTIJLy8gRm9yIFJhdGUgQWRhcHRpdmUgbWVjaGFuaXNtLCAyMDA2LjA3LjAyLCBieSByY25qa28uCisjZGVmaW5lIENPTVBfUk0JCQkJCUJJVDEzCS8vIEZvciBSYWRpbyBNZWFzdXJlbWVudC4KKyNkZWZpbmUgQ09NUF9ESUcJCQkJQklUMTQJLy8gRm9yIERJRywgMjAwNi4wOS4yNSwgYnkgcmNuamtvLgorI2RlZmluZSBDT01QX1BIWQkgCQkJQklUMTUKKyNkZWZpbmUgQ09NUF9DSAkJCQkJQklUMTYJLy9jaGFubmVsIHNldHRpbmcgZGVidWcKKyNkZWZpbmUgQ09NUF9UWEFHQwkJCQlCSVQxNwkvLyBGb3IgVHggcG93ZXIsIDA2MDkyOCwgYnkgcmNuamtvLgorI2RlZmluZSBDT01QX0hJUFdSCQkJCUJJVDE4CS8vIEZvciBIaWdoIFBvd2VyIE1lY2hhbmlzbSwgMDYwOTI4LCBieSByY25qa28uCisjZGVmaW5lIENPTVBfSEFMRE0JCQkJQklUMTkJLy8gRm9yIEhXIER5bmFtaWMgTWVjaGFuaXNtLCAwNjEwMTAsIGJ5IHJjbmprby4KKyNkZWZpbmUgQ09NUF9TRUMJCQkgICAgICAgIEJJVDIwCS8vIEV2ZW50IGhhbmRsaW5nCisjZGVmaW5lIENPTVBfTEVECQkJCUJJVDIxCS8vIEZvciBMRUQuCisjZGVmaW5lIENPTVBfUkYJCQkJCUJJVDIyCS8vIEZvciBSRi4KKy8vMSEhISEhISEhISEhISEhISEhISEhISEhISEhIQorI2RlZmluZSBDT01QX1JYREVTQwkJCQlCSVQyMwkvLyBTaG93IFJ4IGRlc2MgaW5mb3JtYXRpb24gZm9yIFNEMyBkZWJ1Zy4gQWRkZWQgYnkgQW5uaWUsIDIwMDYtMDctMTUuCisvLzEvLzFBdHRlbnRpb24gUGxlYXNlISEhPDExbiBvciA4MTkwIHNwZWNpZmljIGNvZGUgc2hvdWxkIGJlIHB1dCBiZWxvdyB0aGlzIGxpbmU+CisvLzEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKworI2RlZmluZSBDT01QX0ZJUk1XQVJFCQkJCUJJVDI0CS8vZm9yIGZpcm13YXJlIGRvd25sb2FkaW5nCisjZGVmaW5lIENPTVBfSFQJCQkJCUJJVDI1CS8vIEZvciA4MDIuMTFuIEhUIHJlbGF0ZWQgaW5mb3JtYXRpb24uIGJ5IEVtaWx5IDIwMDYtOC0xMQorI2RlZmluZSBDT01QX0FNU0RVCQkJCUJJVDI2CS8vIEZvciBBLU1TRFUgRGVidWdnaW5nCisKKyNkZWZpbmUgQ09NUF9TQ0FOCQkJCUJJVDI3CisvLyNkZWZpbmUgQ09NUF9SRVNFVAkJCQlCSVQyOAorI2RlZmluZSBDT01QX0RPV04JCQkJQklUMjkgIC8vZm9yIHJtIGRyaXZlciBtb2R1bGUKKyNkZWZpbmUgQ09NUF9SRVNFVAkJCQlCSVQzMCAgLy9mb3Igc2lsZW50IHJlc2V0CisjZGVmaW5lIENPTVBfRVJSCQkJCUJJVDMxIC8vZm9yIGVycm9yIG91dCwgYWx3YXlzIG9uCisKKyNkZWZpbmUgUlRMODE5eF9ERUJVRworI2lmZGVmIFJUTDgxOXhfREVCVUcKKyNkZWZpbmUgYXNzZXJ0KGV4cHIpIFwKKyAgICAgICAgaWYgKCEoZXhwcikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHByaW50ayggIkFzc2VydGlvbiBmYWlsZWQhICVzLCVzLCVzLGxpbmU9JWRcbiIsIFwKKyAgICAgICAgICAgICAgICAjZXhwcixfX0ZJTEVfXyxfX0ZVTkNUSU9OX18sX19MSU5FX18pOyAgICAgICAgICBcCisgICAgICAgIH0KKy8vd2IgYWRkZWQgdG8gZGVidWcgb3V0IGRhdGEgYnVmCisvL2lmIHlvdSB3YW50IHByaW50IERBVEEgYnVmZmVyIHJlbGF0ZWQgQkEsIHBsZWFzZSBzZXQgaWVlZTgwMjExX2RlYnVnX2xldmVsIHRvIERBVEF8QkEKKyNkZWZpbmUgUlRfREVCVUdfREFUQShsZXZlbCwgZGF0YSwgZGF0YWxlbikgICAgICBcCisgICAgICAgIGRveyBpZiAoKHJ0X2dsb2JhbF9kZWJ1Z19jb21wb25lbnQgJiAobGV2ZWwpKSA9PSAobGV2ZWwpKSAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB1OCogcGRhdGEgPSAodTgqKSBkYXRhOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgUlRMODE5eFVfTU9EVUxFX05BTUUgIjogJXMoKVxuIiwgX19GVU5DVElPTl9fKTsgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPChpbnQpKGRhdGFsZW4pOyBpKyspICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiJTJ4ICIsIHBkYXRhW2ldKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaSsxKSUxNiA9PSAwKSBwcmludGsoIlxuIik7ICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiXG4iKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBhc3NlcnQoZXhwcikgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIFJUX0RFQlVHX0RBVEEobGV2ZWwsIGRhdGEsIGRhdGFsZW4pIGRvIHt9IHdoaWxlKDApCisjZW5kaWYgLyogUlRMODE2OV9ERUJVRyAqLworCisKKy8vCisvLyBRdWV1ZSBTZWxlY3QgVmFsdWUgaW4gVHhEZXNjCisvLworI2RlZmluZSBRU0xUX0JLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFTTFRfQkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgUVNMVF9WSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBRU0xUX1ZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2CisjZGVmaW5lIFFTTFRfQkVBQ09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIFFTTFRfSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExCisjZGVmaW5lIFFTTFRfTUdOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyCisjZGVmaW5lIFFTTFRfQ01EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEzCisKKyNkZWZpbmUgREVTQzkwX1JBVEUxTSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgREVTQzkwX1JBVEUyTSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgREVTQzkwX1JBVEU1XzVNICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgREVTQzkwX1JBVEUxMU0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgREVTQzkwX1JBVEU2TSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgREVTQzkwX1JBVEU5TSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgREVTQzkwX1JBVEUxMk0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgREVTQzkwX1JBVEUxOE0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgREVTQzkwX1JBVEUyNE0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgREVTQzkwX1JBVEUzNk0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgREVTQzkwX1JBVEU0OE0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGEKKyNkZWZpbmUgREVTQzkwX1JBVEU1NE0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1M0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1M1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1M2ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1M3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1M4ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1M5ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MxMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGEKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MxMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MxMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MxMyAgICAgICAgICAgICAgICAgICAgICAgIDB4MGQKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MxNCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGUKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MxNSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGYKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MzMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAKKworI2RlZmluZSBSVEw4MTlYX0RFRkFVTFRfUkZfVFlQRSBSRl8xVDJSCisKKyNkZWZpbmUgSUVFRTgwMjExX1dBVENIX0RPR19USU1FICAgIDIwMDAKKyNkZWZpbmUJCVBIWV9CZWFjb25fUlNTSV9TTElEX1dJTl9NQVgJCTEwCisvL2ZvciB0eHBvd2VydHJhY2tpbmcgYnkgYW15CisjZGVmaW5lIAlPRkRNX1RhYmxlX0xlbmd0aAkxOQorI2RlZmluZQlDQ0tfVGFibGVfbGVuZ3RoCTEyCisKKy8qIGZvciBydGw4MTl4ICovCit0eXBlZGVmIHN0cnVjdCBfdHhfZGVzY184MTl4X3VzYiB7CisgICAgICAgIC8vRFdPUkQgMAorICAgICAgICB1MTYJUGt0U2l6ZTsKKyAgICAgICAgdTgJT2Zmc2V0OworICAgICAgICB1OAlSZXNlcnZlZDA6MzsKKyAgICAgICAgdTgJQ21kSW5pdDoxOworICAgICAgICB1OAlMYXN0U2VnOjE7CisgICAgICAgIHU4CUZpcnN0U2VnOjE7CisgICAgICAgIHU4CUxJTklQOjE7CisgICAgICAgIHU4CU9XTjoxOworCisgICAgICAgIC8vRFdPUkQgMQorICAgICAgICB1OAlUeEZXSW5mb1NpemU7CisgICAgICAgIHU4CVJBVGlkOjM7CisgICAgICAgIHU4CURJU0ZCOjE7CisgICAgICAgIHU4CVVTRVJBVEU6MTsKKyAgICAgICAgdTgJTU9SRUZSQUc6MTsKKyAgICAgICAgdTgJTm9FbmM6MTsKKyAgICAgICAgdTgJUElGUzoxOworICAgICAgICB1OAlRdWV1ZVNlbGVjdDo1OworICAgICAgICB1OAlOb0FDTToxOworICAgICAgICB1OAlSZXNlcnZlZDE6MjsKKyAgICAgICAgdTgJU2VjQ0FNSUQ6NTsKKyAgICAgICAgdTgJU2VjRGVzY0Fzc2lnbjoxOworICAgICAgICB1OAlTZWNUeXBlOjI7CisKKyAgICAgICAgLy9EV09SRCAyCisgICAgICAgIHUxNglUeEJ1ZmZlclNpemU7CisgICAgICAgIC8vdTE2IFJlc2VydmVkMjsKKyAgICAgICAgdTgJUmVzdkZvclBhZGRpbmdMZW46NzsKKyAgICAgICAgdTgJUmVzZXJ2ZWQzOjE7CisgICAgICAgIHU4CVJlc2VydmVkNDsKKworICAgICAgICAvL0RXT1JEIDMsIDQsIDUKKyAgICAgICAgdTMyCVJlc2VydmVkNTsKKyAgICAgICAgdTMyCVJlc2VydmVkNjsKKyAgICAgICAgdTMyCVJlc2VydmVkNzsKK310eF9kZXNjXzgxOXhfdXNiLCAqcHR4X2Rlc2NfODE5eF91c2I7CisKKyNpZmRlZiBVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQordHlwZWRlZiBzdHJ1Y3QgX3R4X2Rlc2NfODE5eF91c2JfYWdncl9zdWJmcmFtZSB7CisJLy9EV09SRCAwCisJdTE2CVBrdFNpemU7CisJdTgJT2Zmc2V0OworCXU4CVR4RldJbmZvU2l6ZTsKKworCS8vRFdPUkQgMQorCXU4CVJBVGlkOjM7CisJdTgJRElTRkI6MTsKKwl1OAlVU0VSQVRFOjE7CisJdTgJTU9SRUZSQUc6MTsKKwl1OAlOb0VuYzoxOworCXU4CVBJRlM6MTsKKwl1OAlRdWV1ZVNlbGVjdDo1OworCXU4CU5vQUNNOjE7CisJdTgJUmVzZXJ2ZWQxOjI7CisJdTgJU2VjQ0FNSUQ6NTsKKwl1OAlTZWNEZXNjQXNzaWduOjE7CisJdTgJU2VjVHlwZToyOworCXU4CVBhY2tldElEOjc7CisJdTgJT1dOOjE7Cit9dHhfZGVzY184MTl4X3VzYl9hZ2dyX3N1YmZyYW1lLCAqcHR4X2Rlc2NfODE5eF91c2JfYWdncl9zdWJmcmFtZTsKKyNlbmRpZgorCisKKwordHlwZWRlZiBzdHJ1Y3QgX3R4X2Rlc2NfY21kXzgxOXhfdXNiIHsKKyAgICAgICAgLy9EV09SRCAwCisJdTE2CVJlc2VydmVkMDsKKwl1OAlSZXNlcnZlZDE7CisJdTgJUmVzZXJ2ZWQyOjM7CisJdTgJQ21kSW5pdDoxOworCXU4CUxhc3RTZWc6MTsKKwl1OAlGaXJzdFNlZzoxOworCXU4CUxJTklQOjE7CisJdTgJT1dOOjE7CisKKyAgICAgICAgLy9ET1dSRCAxCisJLy91MzIJUmVzZXJ2ZWQzOworCXU4CVR4RldJbmZvU2l6ZTsKKwl1OAlSZXNlcnZlZDM7CisJdTgJUXVldWVTZWxlY3Q7CisJdTgJUmVzZXJ2ZWQ0OworCisgICAgICAgIC8vRE9XUkQgMgorCXUxNiAJVHhCdWZmZXJTaXplOworCXUxNglSZXNlcnZlZDU7CisKKyAgICAgICAvL0RXT1JEIDMsNCw1CisJLy91MzIJVHhCdWZmZXJBZGRyOworCS8vdTMyCU5leHREZXNjQWRkcmVzczsKKwl1MzIJUmVzZXJ2ZWQ2OworCXUzMglSZXNlcnZlZDc7CisJdTMyCVJlc2VydmVkODsKK310eF9kZXNjX2NtZF84MTl4X3VzYiwgKnB0eF9kZXNjX2NtZF84MTl4X3VzYjsKKworCit0eXBlZGVmIHN0cnVjdCBfdHhfZndpbmZvXzgxOXhfdXNiIHsKKyAgICAgICAgLy9ET1dSRCAwCisgICAgICAgIHU4CQlUeFJhdGU6NzsKKyAgICAgICAgdTgJCUN0c0VuYWJsZToxOworICAgICAgICB1OAkJUnRzUmF0ZTo3OworICAgICAgICB1OAkJUnRzRW5hYmxlOjE7CisgICAgICAgIHU4CQlUeEhUOjE7CisgICAgICAgIHU4CQlTaG9ydDoxOyAgICAgICAgICAgICAgICAvL1Nob3J0IFBMQ1AgZm9yIENDSywgb3Igc2hvcnQgR0kgZm9yIDExbiBNQ1MKKyAgICAgICAgdTgJCVR4QmFuZHdpZHRoOjE7ICAgICAgICAgIC8vIFRoaXMgaXMgdXNlZCBmb3IgSFQgTUNTIHJhdGUgb25seS4KKyAgICAgICAgdTgJCVR4U3ViQ2FycmllcjoyOyAgICAgICAgIC8vIFRoaXMgaXMgdXNlZCBmb3IgbGVnYWN5IE9GRE0gcmF0ZSBvbmx5LgorICAgICAgICB1OAkJU1RCQzoyOworICAgICAgICB1OAkJQWxsb3dBZ2dyZWdhdGlvbjoxOworICAgICAgICB1OAkJUnRzSFQ6MTsgICAgICAgICAgICAgICAgLy9JbnRlcnByZSBSdHNSYXRlIGZpZWxkIGFzIGhpZ2ggdGhyb3VnaHB1dCBkYXRhIHJhdGUKKyAgICAgICAgdTgJCVJ0c1Nob3J0OjE7ICAgICAgICAgICAgIC8vU2hvcnQgUExDUCBmb3IgQ0NLLCBvciBzaG9ydCBHSSBmb3IgMTFuIE1DUworICAgICAgICB1OAkJUnRzQmFuZHdpZHRoOjE7ICAgICAgICAgLy8gVGhpcyBpcyB1c2VkIGZvciBIVCBNQ1MgcmF0ZSBvbmx5LgorICAgICAgICB1OAkJUnRzU3ViY2FycmllcjoyOyAgICAgICAgLy8gVGhpcyBpcyB1c2VkIGZvciBsZWdhY3kgT0ZETSByYXRlIG9ubHkuCisgICAgICAgIHU4CQlSdHNTVEJDOjI7CisgICAgICAgIHU4CQlFbmFibGVDUFVEdXI6MTsgICAgICAgICAvL0VuYWJsZSBmaXJtd2FyZSB0byByZWNhbGN1bGF0ZSBhbmQgYXNzaWduIHBhY2tldCBkdXJhdGlvbgorCisgICAgICAgIC8vRFdPUkQgMQorICAgICAgICB1MzIJCVJ4TUY6MjsKKyAgICAgICAgdTMyCQlSeEFNRDozOworICAgICAgICB1MzIJCVR4UGVyUGt0SW5mb0ZlZWRiYWNrOjE7Ly8xIGluZGljYXRlIFR4IGluZm8gZ2F0aHRlcmVkIGJ5IGZpcm13YXJlIGFuZCByZXR1cm5lZCBieSBSeCBDbWQKKyAgICAgICAgdTMyCQlSZXNlcnZlZDE6MjsKKyAgICAgICAgdTMyCQlUeEFHQ09mZlNldDo0OworICAgICAgICB1MzIJCVR4QUdDU2lnbjoxOworICAgICAgICB1MzIJCVR4X0lORk9fUlNWRDo2OworCXUzMgkJUGFja2V0SUQ6MTM7CisgICAgICAgIC8vdTMyICAgICAgICAgICAgICAgIFJlc2VydmVkOworfXR4X2Z3aW5mb184MTl4X3VzYiwgKnB0eF9md2luZm9fODE5eF91c2I7CisKK3R5cGVkZWYgc3RydWN0IHJ0bDgxOTJfcnhfaW5mbyB7CisJc3RydWN0IHVyYiAqdXJiOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdTggb3V0X3BpcGU7Cit9cnRsODE5Ml9yeF9pbmZvIDsKKwordHlwZWRlZiBzdHJ1Y3QgcnhfZGVzY184MTl4X3VzYnsKKwkvL0RPV1JEIDAKKwl1MTYgICAgICAgICAgICAgICAgIExlbmd0aDoxNDsKKwl1MTYgICAgICAgICAgICAgICAgIENSQzMyOjE7CisJdTE2ICAgICAgICAgICAgICAgICBJQ1Y6MTsKKwl1OCAgICAgICAgICAgICAgICAgIFJ4RHJ2SW5mb1NpemU7CisJdTggICAgICAgICAgICAgICAgICBTaGlmdDoyOworCXU4ICAgICAgICAgICAgICAgICAgUEhZU3RhdHVzOjE7CisJdTggICAgICAgICAgICAgICAgICBTV0RlYzoxOworCS8vdTggICAgICAgICAgICAgICAgTGFzdFNlZzoxOworCS8vdTggICAgICAgICAgICAgICAgRmlyc3RTZWc6MTsKKwkvL3U4ICAgICAgICAgICAgICAgIEVPUjoxOworCS8vdTggICAgICAgICAgICAgICAgT1dOOjE7CisJdTggICAgICAgICAgICAgICAgICBSZXNlcnZlZDE6NDsKKworCS8vRFdPUkQgMQorCXUzMiAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOworCisJLy9EV09SRCAyCisJLy91MzIgICAgICAgICAgICAgICBSZXNlcnZlZDM7CisKKwkvL0RXT1JEIDMKKwkvL3UzMiAgICAgICAgICAgICAgICBCdWZmZXJBZGRyZXNzOworCit9cnhfZGVzY184MTl4X3VzYiwgKnByeF9kZXNjXzgxOXhfdXNiOworCisjaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKK3R5cGVkZWYgc3RydWN0IF9yeF9kZXNjXzgxOXhfdXNiX2FnZ3Jfc3ViZnJhbWV7CisJLy9ET1dSRCAwCisJdTE2CQkJTGVuZ3RoOjE0OworCXUxNgkJCUNSQzMyOjE7CisJdTE2CQkJSUNWOjE7CisJdTgJCQlPZmZzZXQ7CisJdTgJCQlSeERydkluZm9TaXplOworCS8vRE9XUkQgMQorCXU4CQkJU2hpZnQ6MjsKKwl1OAkJCVBIWVN0YXR1czoxOworCXU4CQkJU1dEZWM6MTsKKwl1OAkJCVJlc2VydmVkMTo0OworCXU4CQkJUmVzZXJ2ZWQyOworCXUxNgkJCVJlc2VydmVkMzsKKwkvL0RXT1JEIDIKKwkvL3U0Qnl0ZQkJUmVzZXJ2ZWQzOworCS8vRFdPUkQgMworCS8vdTRCeXRlICAgICAgICAgICAJQnVmZmVyQWRkcmVzczsKK31yeF9kZXNjXzgxOXhfdXNiX2FnZ3Jfc3ViZnJhbWUsICpwcnhfZGVzY184MTl4X3VzYl9hZ2dyX3N1YmZyYW1lOworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHJ4X2RydmluZm9fODE5eF91c2J7CisJLy9EV09SRCAwCisJdTE2ICAgICAgICAgICAgICAgICBSZXNlcnZlZDE6MTI7CisJdTE2ICAgICAgICAgICAgICAgICBQYXJ0QWdncjoxOworCXUxNiAgICAgICAgICAgICAgICAgRmlyc3RBR0dSOjE7CisJdTE2ICAgICAgICAgICAgICAgICBSZXNlcnZlZDI6MjsKKworCXU4ICAgICAgICAgICAgICAgICAgUnhSYXRlOjc7CisJdTggICAgICAgICAgICAgICAgICBSeEhUOjE7CisKKwl1OCAgICAgICAgICAgICAgICAgIEJXOjE7CisJdTggICAgICAgICAgICAgICAgICBTUExDUDoxOworCXU4ICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOjI7CisJdTggICAgICAgICAgICAgICAgICBQQU06MTsKKwl1OCAgICAgICAgICAgICAgICAgIE1jYXN0OjE7CisJdTggICAgICAgICAgICAgICAgICBCY2FzdDoxOworCXU4ICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ0OjE7CisKKwkvL0RXT1JEIDEKKwl1MzIgICAgICAgICAgICAgICAgICBUU0ZMOworCit9cnhfZHJ2aW5mb184MTl4X3VzYiwgKnByeF9kcnZpbmZvXzgxOXhfdXNiOworCisKKyNkZWZpbmUgTUFYX0RFVl9BRERSX1NJWkUJCTggIC8qIHN1cHBvcnQgdGlsbCA2NCBiaXQgYnVzIHdpZHRoIE9TICovCisjZGVmaW5lIE1BWF9GSVJNV0FSRV9JTkZPUk1BVElPTl9TSVpFICAgMzIgLyoyMDA2LzA0LzMwIGJ5IEVtaWx5IGZvclJUTDgxOTAqLworI2RlZmluZSBNQVhfODAyXzExX0hFQURFUl9MRU5HVEggICAgICAgICg0MCArIE1BWF9GSVJNV0FSRV9JTkZPUk1BVElPTl9TSVpFKQorI2RlZmluZSBFTkNSWVBUSU9OX01BWF9PVkVSSEVBRAkJMTI4CisjZGVmaW5lCVVTQl9IV0RFU0NfSEVBREVSX0xFTgkJc2l6ZW9mKHR4X2Rlc2NfODE5eF91c2IpCisjZGVmaW5lIFRYX1BBQ0tFVF9TSElGVF9CWVRFUyAJICAJKFVTQl9IV0RFU0NfSEVBREVSX0xFTiArIHNpemVvZih0eF9md2luZm9fODE5eF91c2IpKQorI2RlZmluZSBNQVhfRlJBR01FTlRfQ09VTlQJCTgKKyNpZmRlZiBSVEw4MTkyVQorI2lmZGVmIFVTQl9UWF9EUklWRVJfQUdHUkVHQVRJT05fRU5BQkxFCisjZGVmaW5lIE1BWF9UUkFOU01JVF9CVUZGRVJfU0laRQkJCTMyMDAwCisjZWxzZQorI2RlZmluZSBNQVhfVFJBTlNNSVRfQlVGRkVSX1NJWkUJCQk4MDAwCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIE1BWF9UUkFOU01JVF9CVUZGRVJfU0laRSAgCSgxNjAwKyhNQVhfODAyXzExX0hFQURFUl9MRU5HVEgrRU5DUllQVElPTl9NQVhfT1ZFUkhFQUQpKk1BWF9GUkFHTUVOVF9DT1VOVCkKKyNlbmRpZgorI2lmZGVmIFVTQl9UWF9EUklWRVJfQUdHUkVHQVRJT05fRU5BQkxFCisjZGVmaW5lIFRYX1BBQ0tFVF9EUlZBR0dSX1NVQkZSQU1FX1NISUZUX0JZVEVTIChzaXplb2YodHhfZGVzY184MTl4X3VzYl9hZ2dyX3N1YmZyYW1lKSArIHNpemVvZih0eF9md2luZm9fODE5eF91c2IpKQorI2VuZGlmCisjZGVmaW5lIHNjcmNsbmcJCQkJCTQJCS8vIG9jdGV0cyBmb3IgY3JjMzIgKEZDUywgSUNWKQorCit0eXBlZGVmIGVudW0gcmZfb3B0eXBlCit7CisJUkZfT1BfQnlfU1dfM3dpcmUgPSAwLAorCVJGX09QX0J5X0ZXLAorCVJGX09QX01BWAorfXJmX29wX3R5cGU7CisvKiA4MTkwIExvb3BiYWNrIE1vZGUgZGVmaW5pdGlvbiAqLwordHlwZWRlZiBlbnVtIF9ydGw4MTl4VXNiX2xvb3BiYWNreworCVJUTDgxOXhVX05PX0xPT1BCQUNLID0gMCwKKwlSVEw4MTl4VV9NQUNfTE9PUEJBQ0sgPSAxLAorCVJUTDgxOXhVX0RNQV9MT09QQkFDSyA9IDIsCisJUlRMODE5eFVfQ0NLX0xPT1BCQUNLID0gMywKK31ydGw4MTl4VXNiX2xvb3BiYWNrX2U7CisKKy8qIGR1ZSB0byBydGw4MTkyIGZpcm13YXJlICovCit0eXBlZGVmIGVudW0gX2Rlc2NfcGFja2V0X3R5cGVfZXsKKwlERVNDX1BBQ0tFVF9UWVBFX0lOSVQgPSAwLAorCURFU0NfUEFDS0VUX1RZUEVfTk9STUFMID0gMSwKK31kZXNjX3BhY2tldF90eXBlX2U7CisKK3R5cGVkZWYgZW51bSBfZmlybXdhcmVfc291cmNleworCUZXX1NPVVJDRV9JTUdfRklMRSA9IDAsCisJRldfU09VUkNFX0hFQURFUl9GSUxFID0gMSwJCS8vZnJvbSBoZWFkZXIgZmlsZQorfWZpcm13YXJlX3NvdXJjZV9lLCAqcGZpcm13YXJlX3NvdXJjZV9lOworCit0eXBlZGVmIGVudW0gX2Zpcm13YXJlX3N0YXR1c3sKKwlGV19TVEFUVVNfMF9JTklUID0gMCwKKwlGV19TVEFUVVNfMV9NT1ZFX0JPT1RfQ09ERSA9IDEsCisJRldfU1RBVFVTXzJfTU9WRV9NQUlOX0NPREUgPSAyLAorCUZXX1NUQVRVU18zX1RVUk5PTl9DUFUgPSAzLAorCUZXX1NUQVRVU180X01PVkVfREFUQV9DT0RFID0gNCwKKwlGV19TVEFUVVNfNV9SRUFEWSA9IDUsCit9ZmlybXdhcmVfc3RhdHVzX2U7CisKK3R5cGVkZWYgc3RydWN0IF9ydF9maXJtYXJlX3NlZ19jb250YWluZXIgeworCXUxNglzZWdfc2l6ZTsKKwl1OAkqc2VnX3B0cjsKK31md19zZWdfY29udGFpbmVyLCAqcGZ3X3NlZ19jb250YWluZXI7Cit0eXBlZGVmIHN0cnVjdCBfcnRfZmlybXdhcmV7CisJZmlybXdhcmVfc3RhdHVzX2UgZmlybXdhcmVfc3RhdHVzOworCXUxNiAgICAgICAgICAgICAgIGNtZHBhY2tldF9mcmFnX3RocmVzb2xkOworI2RlZmluZSBSVEw4MTkwX01BWF9GSVJNV0FSRV9DT0RFX1NJWkUgIDY0MDAwICAgLy82NGsKKwl1OCAgICAgICAgICAgICAgICBmaXJtd2FyZV9idWZbUlRMODE5MF9NQVhfRklSTVdBUkVfQ09ERV9TSVpFXTsKKwl1MTYgICAgICAgICAgICAgICBmaXJtd2FyZV9idWZfc2l6ZTsKK31ydF9maXJtd2FyZSwgKnBydF9maXJtd2FyZTsKKworLy8rYnkgYW15IDA4MDUwNworI2RlZmluZSBNQVhfUkVDRUlWRV9CVUZGRVJfU0laRQk5MTAwCS8vIEFkZCB0aGlzIHRvIDkxMDAgYnl0ZXMgdG8gcmVjZWl2ZSBBLU1TRFUgZnJvbSBSVC1BUAorCit0eXBlZGVmIHN0cnVjdCBfcnRfZmlybXdhcmVfaW5mb184MTl4VXNieworCXU4CQlzel9pbmZvWzE2XTsKK31ydF9maXJtd2FyZV9pbmZvXzgxOXhVc2IsICpwcnRfZmlybXdhcmVfaW5mb184MTl4VXNiOworCisvKiBGaXJtd2FyZSBRdWV1ZSBMYXlvdXQgKi8KKyNkZWZpbmUgTlVNX09GX0ZJUk1XQVJFX1FVRVVFCQkxMAorI2RlZmluZSBOVU1fT0ZfUEFHRVNfSU5fRlcJCTB4MTAwCisKKyNpZmRlZiBVU0VfT05FX1BJUEUKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQkUJMHgwMDAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQksJMHgwMDAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVkkJMHgwZmYKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVk8JMHgwMDAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfSENDQQkwCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0NNRAkweDAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfTUdOVAkweDAwCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0hJR0gJMAorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CQ04JMHgwCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1BVQgkweDAwCisjZWxzZQorCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JFCTB4MDIwCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JLCTB4MDIwCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZJCTB4MDQwCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZPCTB4MDQwCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0hDQ0EJMAorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9DTUQJMHg0CisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX01HTlQJMHgyMAorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9ISUdICTAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQkNOCTB4NAorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9QVUIJMHgxOAorCisjZW5kaWYKKworI2RlZmluZSBBUFBMSUVEX1JFU0VSVkVEX1FVRVVFX0lOX0ZXCTB4ODAwMDAwMDAKKyNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX0JLX1NISUZUCTB4MDAKKyNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX0JFX1NISUZUCTB4MDgKKyNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX1ZJX1NISUZUCTB4MTAKKyNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX1ZPX1NISUZUCTB4MTgKKyNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX01HTlRfU0hJRlQJMHgxMAorI2RlZmluZSBSU1ZEX0ZXX1FVRVVFX1BBR0VfQ01EX1NISUZUCTB4MDgKKyNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX0JDTl9TSElGVAkweDAwCisjZGVmaW5lIFJTVkRfRldfUVVFVUVfUEFHRV9QVUJfU0hJRlQJMHgwOAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjZGVmaW5lIEVQUk9NXzkzYzQ2IDAKKyNkZWZpbmUgRVBST01fOTNjNTYgMQorCisjZGVmaW5lIERFRkFVTFRfRlJBR19USFJFU0hPTEQgMjM0MlUKKyNkZWZpbmUgTUlOX0ZSQUdfVEhSRVNIT0xEICAgICAyNTZVCisjZGVmaW5lIERFRkFVTFRfQkVBQ09OSU5URVJWQUwgMHg2NFUKKyNkZWZpbmUgREVGQVVMVF9CRUFDT05fRVNTSUQgIlJ0bDgxOXhVIgorCisjZGVmaW5lIERFRkFVTFRfU1NJRCAiIgorI2RlZmluZSBERUZBVUxUX1JFVFJZX1JUUyA3CisjZGVmaW5lIERFRkFVTFRfUkVUUllfREFUQSA3CisjZGVmaW5lIFBSSVNNX0hEUl9TSVpFIDY0CisKKyNkZWZpbmUJCVBIWV9SU1NJX1NMSURfV0lOX01BWAkJCQkxMDAKKworCit0eXBlZGVmIGVudW0gX1dJUkVMRVNTX01PREUgeworCVdJUkVMRVNTX01PREVfVU5LTk9XTiA9IDB4MDAsCisJV0lSRUxFU1NfTU9ERV9BID0gMHgwMSwKKwlXSVJFTEVTU19NT0RFX0IgPSAweDAyLAorCVdJUkVMRVNTX01PREVfRyA9IDB4MDQsCisJV0lSRUxFU1NfTU9ERV9BVVRPID0gMHgwOCwKKwlXSVJFTEVTU19NT0RFX05fMjRHID0gMHgxMCwKKwlXSVJFTEVTU19NT0RFX05fNUcgPSAweDIwCit9IFdJUkVMRVNTX01PREU7CisKKworI2RlZmluZSBSVExfSU9DVExfV1BBX1NVUFBMSUNBTlQJCVNJT0NJV0ZJUlNUUFJJViszMAorCit0eXBlZGVmIHN0cnVjdCBidWZmZXIKK3sKKwlzdHJ1Y3QgYnVmZmVyICpuZXh0OworCXUzMiAqYnVmOworCit9IGJ1ZmZlcjsKKwordHlwZWRlZiBzdHJ1Y3QgcnRsX3JlZ19kZWJ1Z3sKKyAgICAgICAgdW5zaWduZWQgaW50ICBjbWQ7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYWRkcjsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHBhZ2U7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBsZW5ndGg7CisgICAgICAgIH0gaGVhZDsKKyAgICAgICAgdW5zaWduZWQgY2hhciBidWZbMHhmZl07Cit9cnRsX3JlZ19kZWJ1ZzsKKworCisKKworCisKK3R5cGVkZWYgc3RydWN0IF9ydF85eF90eF9yYXRlX2hpc3RvcnkgeworCXUzMiAgICAgICAgICAgICBjY2tbNF07CisJdTMyICAgICAgICAgICAgIG9mZG1bOF07CisJLy8gSFRfTUNTWzBdW106IEJXPTAgU0c9MAorCS8vIEhUX01DU1sxXVtdOiBCVz0xIFNHPTAKKwkvLyBIVF9NQ1NbMl1bXTogQlc9MCBTRz0xCisJLy8gSFRfTUNTWzNdW106IEJXPTEgU0c9MQorCXUzMiAgICAgICAgICAgICBodF9tY3NbNF1bMTZdOworfXJ0X3R4X3JhaGlzX3QsICpwcnRfdHhfcmFoaXNfdDsKK3R5cGVkZWYgc3RydWN0IF9SVF9TTU9PVEhfREFUQV80UkYgeworCWNoYXIgICAgZWxlbWVudHNbNF1bMTAwXTsvL2FycmF5IHRvIHN0b3JlIHZhbHVlcworCXUzMiAgICAgaW5kZXg7ICAgICAgICAgICAgICAgICAgLy9pbmRleCB0byBjdXJyZW50IGFycmF5IHRvIHN0b3JlCisJdTMyICAgICBUb3RhbE51bTsgICAgICAgICAgICAgICAvL251bSBvZiB2YWxpZCBlbGVtZW50cworCXUzMiAgICAgVG90YWxWYWxbNF07ICAgICAgICAgICAgLy9zdW0gb2YgdmFsaWQgZWxlbWVudHMKK31SVF9TTU9PVEhfREFUQV80UkYsICpQUlRfU01PT1RIX0RBVEFfNFJGOworCisjZGVmaW5lIE1BWF84MTkyVV9SWF9TSVpFCQkJODE5MiAgICAvLyBUaGlzIG1heWJlIGNoYW5nZWQgZm9yIEQtY3V0IGxhcmdlciBhZ2dyZWdhdGlvbiBzaXplCisvL3N0YXRzIHNlZW1zIG1lc3NlZCB1cCwgY2xlYW4gaXQgQVNBUAordHlwZWRlZiBzdHJ1Y3QgU3RhdHMKK3sKKwl1bnNpZ25lZCBsb25nIHR4cmR1OworLy8JdW5zaWduZWQgbG9uZyByeHJkdTsKKwkvL3Vuc2lnbmVkIGxvbmcgcnhub2xhc3Q7CisJLy91bnNpZ25lZCBsb25nIHJ4bm9kYXRhOworLy8JdW5zaWduZWQgbG9uZyByeHJlc2V0OworLy8JdW5zaWduZWQgbG9uZyByeG5vcG9pbnRlcjsKKwl1bnNpZ25lZCBsb25nIHJ4b2s7CisJdW5zaWduZWQgbG9uZyByeGZyYW1nbWVudDsKKwl1bnNpZ25lZCBsb25nIHJ4Y21kcGt0WzRdOwkJLy8wOC8wNS8wOCBhbXkgcnggY21kIGVsZW1lbnQgdHhmZWVkYmFjay9iY24gcmVwb3J0L2NmZyBzZXQvcXVlcnkKKwl1bnNpZ25lZCBsb25nIHJ4dXJiZXJyOworCXVuc2lnbmVkIGxvbmcgcnhzdGF0ZXJyOworCXVuc2lnbmVkIGxvbmcgcmVjZWl2ZWRfcmF0ZV9oaXN0b2dyYW1bNF1bMzJdOwkvLzA6IFRvdGFsLCAxOk9LLCAyOkNSQywgMzpJQ1YsIDIwMDcgMDcgMDMgY29zYQorCXVuc2lnbmVkIGxvbmcgcmVjZWl2ZWRfcHJlYW1ibGVfR0lbMl1bMzJdOwkJLy8wOiBMb25nIHByZWFtYmxlL0dJLCAxOlNob3J0IHByZWFtYmxlL0dJCisJdW5zaWduZWQgbG9uZyByeF9BTVBEVXNpemVfaGlzdG9ncmFtWzVdOyAvLyBsZXZlbDogKDw0SyksICg0S344SyksICg4S34xNkspLCAoMTZLfjMySyksICgzMkt+NjRLKQorCXVuc2lnbmVkIGxvbmcgcnhfQU1QRFVudW1faGlzdG9ncmFtWzVdOyAvLyBsZXZlbDogKDw1KSwgKDV+MTApLCAoMTB+MjApLCAoMjB+NDApLCAoPjQwKQorCXVuc2lnbmVkIGxvbmcgbnVtcGFja2V0X21hdGNoYnNzaWQ7CS8vIGRlYnVnIHVzZSBvbmx5LgorCXVuc2lnbmVkIGxvbmcgbnVtcGFja2V0X3Rvc2VsZjsJCS8vIGRlYnVnIHVzZSBvbmx5LgorCXVuc2lnbmVkIGxvbmcgbnVtX3Byb2Nlc3NfcGh5aW5mbzsJCS8vIGRlYnVnIHVzZSBvbmx5LgorCXVuc2lnbmVkIGxvbmcgbnVtcXJ5X3BoeXN0YXR1czsKKwl1bnNpZ25lZCBsb25nIG51bXFyeV9waHlzdGF0dXNDQ0s7CisJdW5zaWduZWQgbG9uZyBudW1xcnlfcGh5c3RhdHVzSFQ7CisJdW5zaWduZWQgbG9uZyByZWNlaXZlZF9id3R5cGVbNV07ICAgICAgICAgICAgICAvLzA6IDIwTSwgMTogZnVubjQwTSwgMjogdXBwZXIyME0sIDM6IGxvd2VyMjBNLCA0OiBkdXBsaWNhdGUKKwl1bnNpZ25lZCBsb25nIHR4bnBlcnI7CisJdW5zaWduZWQgbG9uZyB0eG5wZHJvcDsKKwl1bnNpZ25lZCBsb25nIHR4cmVzdW1lZDsKKy8vCXVuc2lnbmVkIGxvbmcgcnhlcnI7CisvLwl1bnNpZ25lZCBsb25nIHJ4b3ZlcmZsb3c7CisvLwl1bnNpZ25lZCBsb25nIHJ4aW50OworCXVuc2lnbmVkIGxvbmcgdHhucG9raW50OworLy8JdW5zaWduZWQgbG9uZyB0eGhwb2tpbnQ7CisvLwl1bnNpZ25lZCBsb25nIHR4aHBlcnI7CisvLwl1bnNpZ25lZCBsb25nIGludHM7CisvLwl1bnNpZ25lZCBsb25nIHNoaW50czsKKwl1bnNpZ25lZCBsb25nIHR4b3ZlcmZsb3c7CisvLwl1bnNpZ25lZCBsb25nIHJ4ZG1hZmFpbDsKKy8vCXVuc2lnbmVkIGxvbmcgdHhiZWFjb247CisvLwl1bnNpZ25lZCBsb25nIHR4YmVhY29uZXJyOworCXVuc2lnbmVkIGxvbmcgdHhscG9raW50OworCXVuc2lnbmVkIGxvbmcgdHhscGRyb3A7CisJdW5zaWduZWQgbG9uZyB0eGxwZXJyOworCXVuc2lnbmVkIGxvbmcgdHhiZW9raW50OworCXVuc2lnbmVkIGxvbmcgdHhiZWRyb3A7CisJdW5zaWduZWQgbG9uZyB0eGJlZXJyOworCXVuc2lnbmVkIGxvbmcgdHhia29raW50OworCXVuc2lnbmVkIGxvbmcgdHhia2Ryb3A7CisJdW5zaWduZWQgbG9uZyB0eGJrZXJyOworCXVuc2lnbmVkIGxvbmcgdHh2aW9raW50OworCXVuc2lnbmVkIGxvbmcgdHh2aWRyb3A7CisJdW5zaWduZWQgbG9uZyB0eHZpZXJyOworCXVuc2lnbmVkIGxvbmcgdHh2b29raW50OworCXVuc2lnbmVkIGxvbmcgdHh2b2Ryb3A7CisJdW5zaWduZWQgbG9uZyB0eHZvZXJyOworCXVuc2lnbmVkIGxvbmcgdHhiZWFjb25va2ludDsKKwl1bnNpZ25lZCBsb25nIHR4YmVhY29uZHJvcDsKKwl1bnNpZ25lZCBsb25nIHR4YmVhY29uZXJyOworCXVuc2lnbmVkIGxvbmcgdHhtYW5hZ2Vva2ludDsKKwl1bnNpZ25lZCBsb25nIHR4bWFuYWdlZHJvcDsKKwl1bnNpZ25lZCBsb25nIHR4bWFuYWdlZXJyOworCXVuc2lnbmVkIGxvbmcgdHhkYXRhcGt0OworCXVuc2lnbmVkIGxvbmcgdHhmZWVkYmFjazsKKwl1bnNpZ25lZCBsb25nIHR4ZmVlZGJhY2tvazsKKworCXVuc2lnbmVkIGxvbmcgdHhva3RvdGFsOworCXVuc2lnbmVkIGxvbmcgdHhva2J5dGVzdG90YWw7CisJdW5zaWduZWQgbG9uZyB0eG9raW5wZXJpb2Q7CisJdW5zaWduZWQgbG9uZyB0eG11bHRpY2FzdDsKKwl1bnNpZ25lZCBsb25nIHR4Ynl0ZXNtdWx0aWNhc3Q7CisJdW5zaWduZWQgbG9uZyB0eGJyb2FkY2FzdDsKKwl1bnNpZ25lZCBsb25nIHR4Ynl0ZXNicm9hZGNhc3Q7CisJdW5zaWduZWQgbG9uZyB0eHVuaWNhc3Q7CisJdW5zaWduZWQgbG9uZyB0eGJ5dGVzdW5pY2FzdDsKKworCXVuc2lnbmVkIGxvbmcgcnhva3RvdGFsOworCXVuc2lnbmVkIGxvbmcgcnhieXRlc3VuaWNhc3Q7CisJdW5zaWduZWQgbG9uZyB0eGZlZWRiYWNrZmFpbDsKKwl1bnNpZ25lZCBsb25nIHR4ZXJydG90YWw7CisJdW5zaWduZWQgbG9uZyB0eGVycmJ5dGVzdG90YWw7CisJdW5zaWduZWQgbG9uZyB0eGVycm11bHRpY2FzdDsKKwl1bnNpZ25lZCBsb25nIHR4ZXJyYnJvYWRjYXN0OworCXVuc2lnbmVkIGxvbmcgdHhlcnJ1bmljYXN0OworCXVuc2lnbmVkIGxvbmcgdHhyZXRyeWNvdW50OworCXVuc2lnbmVkIGxvbmcgdHhmZWVkYmFja3JldHJ5OworCXU4CSAgICAgIGxhc3RfcGFja2V0X3JhdGU7CisJdW5zaWduZWQgbG9uZyBzbGlkZV9zaWduYWxfc3RyZW5ndGhbMTAwXTsKKwl1bnNpZ25lZCBsb25nIHNsaWRlX2V2bVsxMDBdOworCXVuc2lnbmVkIGxvbmcgc2xpZGVfcnNzaV90b3RhbDsJLy8gRm9yIHJlY29yZGluZyBzbGlkaW5nIHdpbmRvdydzIFJTU0kgdmFsdWUKKwl1bnNpZ25lZCBsb25nIHNsaWRlX2V2bV90b3RhbDsJLy8gRm9yIHJlY29yZGluZyBzbGlkaW5nIHdpbmRvdydzIEVWTSB2YWx1ZQorCWxvbmcgc2lnbmFsX3N0cmVuZ3RoOyAvLyBUcmFuc2Zvcm1lZCwgaW4gZGJtLiBCZWF1dGlmaWVkIHNpZ25hbCBzdHJlbmd0aCBmb3IgVUksIG5vdCBjb3JyZWN0LgorCWxvbmcgc2lnbmFsX3F1YWxpdHk7CisJbG9uZyBsYXN0X3NpZ25hbF9zdHJlbmd0aF9pbnBlcmNlbnQ7CisJbG9uZyByZWN2X3NpZ25hbF9wb3dlcjsJLy8gQ29ycmVjdCBzbW9vdGhlZCBzcyBpbiBEYm0sIG9ubHkgdXNlZCBpbiBkcml2ZXIgdG8gcmVwb3J0IHJlYWwgcG93ZXIgbm93LgorCXU4IHJ4X3Jzc2lfcGVyY2VudGFnZVs0XTsKKwl1OCByeF9ldm1fcGVyY2VudGFnZVsyXTsKKwlsb25nIHJ4U05SZEJbNF07CisJcnRfdHhfcmFoaXNfdCB0eHJhdGU7CisJdTMyIFNsaWRlX0JlYWNvbl9wd2RiWzEwMF07ICAgICAvL2Nvc2EgYWRkIGZvciBiZWFjb24gcnNzaQorCXUzMiBTbGlkZV9CZWFjb25fVG90YWw7ICAgICAgICAgLy9jb3NhIGFkZCBmb3IgYmVhY29uIHJzc2kKKwlSVF9TTU9PVEhfREFUQV80UkYgICAgICAgICAgICAgIGNja19hZGNfcHdkYjsKKworCXUzMglDdXJyZW50U2hvd1R4YXRlOworfSBTdGF0czsKKworCisvLyBCYW5kd2lkdGggT2Zmc2V0CisjZGVmaW5lIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUJCTAKKyNkZWZpbmUgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSCQkJMQorI2RlZmluZSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVIJCQkyCisKKy8vK2J5IGFteSAwODA1MDcKKwordHlwZWRlZiBzdHJ1Y3QgCUNobmxBY2Nlc3NTZXR0aW5nIHsKKwl1MTYgU0lGU19UaW1lcjsKKwl1MTYgRElGU19UaW1lcjsKKwl1MTYgU2xvdFRpbWVUaW1lcjsKKwl1MTYgRUlGU19UaW1lcjsKKwl1MTYgQ1dtaW5JbmRleDsKKwl1MTYgQ1dtYXhJbmRleDsKK30qUENIQU5ORUxfQUNDRVNTX1NFVFRJTkcsQ0hBTk5FTF9BQ0NFU1NfU0VUVElORzsKKwordHlwZWRlZiBzdHJ1Y3QgX0JCX1JFR0lTVEVSX0RFRklOSVRJT057CisJdTMyIHJmaW50ZnM7IAkJCS8vIHNldCBzb2Z0d2FyZSBjb250cm9sOiAvLwkJMHg4NzB+MHg4NzdbOCBieXRlc10KKwl1MzIgcmZpbnRmaTsgCQkJLy8gcmVhZGJhY2sgZGF0YTogLy8JCTB4OGUwfjB4OGU3WzggYnl0ZXNdCisJdTMyIHJmaW50Zm87IAkJCS8vIG91dHB1dCBkYXRhOiAvLwkJMHg4NjB+MHg4NmYgWzE2IGJ5dGVzXQorCXUzMiByZmludGZlOyAJCQkvLyBvdXRwdXQgZW5hYmxlOiAvLwkJMHg4NjB+MHg4NmYgWzE2IGJ5dGVzXQorCXUzMiByZjN3aXJlT2Zmc2V0OyAJCS8vIExTU0kgZGF0YTogLy8JCTB4ODQwfjB4ODRmIFsxNiBieXRlc10KKwl1MzIgcmZMU1NJX1NlbGVjdDsgCQkvLyBCQiBCYW5kIFNlbGVjdDogLy8JCTB4ODc4fjB4ODdmIFs4IGJ5dGVzXQorCXUzMiByZlR4R2FpblN0YWdlOwkJLy8gVHggZ2FpbiBzdGFnZTogLy8JCTB4ODBjfjB4ODBmIFs0IGJ5dGVzXQorCXUzMiByZkhTU0lQYXJhMTsgCQkvLyB3aXJlIHBhcmFtZXRlciBjb250cm9sMSA6IC8vCQkweDgyMH4weDgyMywweDgyOH4weDgyYiwgMHg4MzB+MHg4MzMsIDB4ODM4fjB4ODNiIFsxNiBieXRlc10KKwl1MzIgcmZIU1NJUGFyYTI7IAkJLy8gd2lyZSBwYXJhbWV0ZXIgY29udHJvbDIgOiAvLwkJMHg4MjR+MHg4MjcsMHg4MmN+MHg4MmYsIDB4ODM0fjB4ODM3LCAweDgzY34weDgzZiBbMTYgYnl0ZXNdCisJdTMyIHJmU3dpdGNoQ29udHJvbDsgCS8vVHggUnggYW50ZW5uYSBjb250cm9sIDogLy8JCTB4ODU4fjB4ODVmIFsxNiBieXRlc10KKwl1MzIgcmZBR0NDb250cm9sMTsgCS8vQUdDIHBhcmFtZXRlciBjb250cm9sMSA6IC8vCQkweGM1MH4weGM1MywweGM1OH4weGM1YiwgMHhjNjB+MHhjNjMsIDB4YzY4fjB4YzZiIFsxNiBieXRlc10KKwl1MzIgcmZBR0NDb250cm9sMjsgCS8vQUdDIHBhcmFtZXRlciBjb250cm9sMiA6IC8vCQkweGM1NH4weGM1NywweGM1Y34weGM1ZiwgMHhjNjR+MHhjNjcsIDB4YzZjfjB4YzZmIFsxNiBieXRlc10KKwl1MzIgcmZSeElRSW1iYWxhbmNlOyAJLy9PRkRNIFJ4IElRIGltYmFsYW5jZSBtYXRyaXggOiAvLwkJMHhjMTR+MHhjMTcsMHhjMWN+MHhjMWYsIDB4YzI0fjB4YzI3LCAweGMyY34weGMyZiBbMTYgYnl0ZXNdCisJdTMyIHJmUnhBRkU7ICAJCQkvL1J4IElRIERDIG9mc2V0IGFuZCBSeCBkaWdpdGFsIGZpbHRlciwgUnggREMgbm90Y2ggZmlsdGVyIDogLy8JCTB4YzEwfjB4YzEzLDB4YzE4fjB4YzFiLCAweGMyMH4weGMyMywgMHhjMjh+MHhjMmIgWzE2IGJ5dGVzXQorCXUzMiByZlR4SVFJbWJhbGFuY2U7IAkvL09GRE0gVHggSVEgaW1iYWxhbmNlIG1hdHJpeCAvLwkJMHhjODB+MHhjODMsMHhjODh+MHhjOGIsIDB4YzkwfjB4YzkzLCAweGM5OH4weGM5YiBbMTYgYnl0ZXNdCisJdTMyIHJmVHhBRkU7IAkJCS8vVHggSVEgREMgT2Zmc2V0IGFuZCBUeCBERklSIHR5cGUgLy8JCTB4Yzg0fjB4Yzg3LDB4YzhjfjB4YzhmLCAweGM5NH4weGM5NywgMHhjOWN+MHhjOWYgWzE2IGJ5dGVzXQorCXUzMiByZkxTU0lSZWFkQmFjazsgCS8vTFNTSSBSRiByZWFkYmFjayBkYXRhIC8vCQkweDhhMH4weDhhZiBbMTYgYnl0ZXNdCit9QkJfUkVHSVNURVJfREVGSU5JVElPTl9ULCAqUEJCX1JFR0lTVEVSX0RFRklOSVRJT05fVDsKKwordHlwZWRlZiBlbnVtIF9SVF9SRl9UWVBFXzgxOXhVeworICAgICAgICBSRl9UWVBFX01JTiA9IDAsCisgICAgICAgIFJGXzgyMjUsCisgICAgICAgIFJGXzgyNTYsCisgICAgICAgIFJGXzgyNTgsCisgICAgICAgIFJGX1BTRVVET18xMU4gPSA0LAorfVJUX1JGX1RZUEVfODE5eFUsICpQUlRfUkZfVFlQRV84MTl4VTsKKwordHlwZWRlZiBzdHJ1Y3QgX3JhdGVfYWRhcHRpdmUKK3sKKwl1OAkJCQlyYXRlX2FkYXB0aXZlX2Rpc2FibGVkOworCXU4CQkJCXJhdHJfc3RhdGU7CisJdTE2CQkJCXJlc2VydmU7CisKKwl1MzIJCQkJaGlnaF9yc3NpX3RocmVzaF9mb3JfcmE7CisJdTMyCQkJCWhpZ2gybG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTsKKwl1OAkJCQlsb3cyaGlnaF9yc3NpX3RocmVzaF9mb3JfcmE0ME07CisJdTMyCQkJCWxvd19yc3NpX3RocmVzaF9mb3JfcmE0ME07CisJdTgJCQkJbG93MmhpZ2hfcnNzaV90aHJlc2hfZm9yX3JhMjBNOworCXUzMgkJCQlsb3dfcnNzaV90aHJlc2hfZm9yX3JhMjBNOworCXUzMgkJCQl1cHBlcl9yc3NpX3RocmVzaG9sZF9yYXRyOworCXUzMgkJCQltaWRkbGVfcnNzaV90aHJlc2hvbGRfcmF0cjsKKwl1MzIJCQkJbG93X3Jzc2lfdGhyZXNob2xkX3JhdHI7CisJdTMyCQkJCWxvd19yc3NpX3RocmVzaG9sZF9yYXRyXzQwTTsKKwl1MzIJCQkJbG93X3Jzc2lfdGhyZXNob2xkX3JhdHJfMjBNOworCXU4CQkJCXBpbmdfcnNzaV9lbmFibGU7CS8vY29zYSBhZGQgZm9yIHRlc3QKKwl1MzIJCQkJcGluZ19yc3NpX3JhdHI7CS8vY29zYSBhZGQgZm9yIHRlc3QKKwl1MzIJCQkJcGluZ19yc3NpX3RocmVzaF9mb3JfcmE7Ly9jb3NhIGFkZCBmb3IgdGVzdAorCXUzMgkJCQlsYXN0X3JhdHI7CisKK30gcmF0ZV9hZGFwdGl2ZSwgKnByYXRlX2FkYXB0aXZlOworCisjZGVmaW5lIFR4QkJHYWluVGFibGVMZW5ndGggMzcKKyNkZWZpbmUJQ0NLVHhCQkdhaW5UYWJsZUxlbmd0aCAyMworCit0eXBlZGVmIHN0cnVjdCBfdHhiYmdhaW5fc3RydWN0Cit7CisJbG9uZwl0eGJiX2lxX2FtcGxpZnlnYWluOworCXUzMgl0eGJiZ2Fpbl92YWx1ZTsKK30gdHhiYmdhaW5fc3RydWN0LCAqcHR4YmJnYWluX3N0cnVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2Nja3R4YmJnYWluX3N0cnVjdAoreworCS8vVGhlIFZhbHVlIGlzIGZyb20gYTIyIHRvIGEyOSBvbmUgQnl0ZSBvbmUgdGltZSBpcyBtdWNoIFNhZmVyCisJdTgJY2NrdHhiYl92YWx1ZWFycmF5WzhdOworfSBjY2t0eGJiZ2Fpbl9zdHJ1Y3QsKnBjY2t0eGJiZ2Fpbl9zdHJ1Y3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgX2luaXRfZ2FpbgoreworCXU4CQkJCXhhYWdjY29yZTE7CisJdTgJCQkJeGJhZ2Njb3JlMTsKKwl1OAkJCQl4Y2FnY2NvcmUxOworCXU4CQkJCXhkYWdjY29yZTE7CisJdTgJCQkJY2NhOworCit9IGluaXRfZ2FpbiwgKnBpbml0X2dhaW47CisvL2J5IGFteSAwNjA2CisKK3R5cGVkZWYgc3RydWN0IF9waHlfb2ZkbV9yeF9zdGF0dXNfcmVwb3J0XzgxOXh1c2IKK3sKKwl1OAl0cnN3X2dhaW5fWFs0XTsKKwl1OAlwd2RiX2FsbDsKKwl1OAljZm9zaG9fWFs0XTsKKwl1OAljZm90YWlsX1hbNF07CisJdTgJcnhldm1fWFsyXTsKKwl1OAlyeHNucl9YWzRdOworCXU4CXBkc25yX1hbMl07CisJdTgJY3NpX2N1cnJlbnRfWFsyXTsKKwl1OAljc2lfdGFyZ2V0X1hbMl07CisJdTgJc2lnZXZtOworCXU4CW1heF9leF9wd3I7CisJdTgJc2dpX2VuOworCXU4ICByeHNjX3NnaWVuX2V4ZmxnOworfXBoeV9zdHNfb2ZkbV84MTl4dXNiX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9waHlfY2NrX3J4X3N0YXR1c19yZXBvcnRfODE5eHVzYgoreworCS8qIEZvciBDQ0sgcmF0ZSBkZXNjcmlwdG9yLiBUaGlzIGlzIGEgdW5zaWduZWQgODoxIHZhcmlhYmxlLiBMU0IgYml0IHByZXNlbmQKKwkgICAwLjUuIEFuZCBNU0IgNyBidHMgcHJlc2VuZCBhIHNpZ25lZCB2YWx1ZS4gUmFuZ2UgZnJvbSAtNjR+KzYzLjUuICovCisJdTgJYWRjX3B3ZGJfWFs0XTsKKwl1OAlzcV9ycHQ7CisJdTgJY2NrX2FnY19ycHQ7Cit9cGh5X3N0c19jY2tfODE5eHVzYl90OworCisKK3R5cGVkZWYgc3RydWN0IF9waHlfb2ZkbV9yeF9zdGF0dXNfcnhzY19zZ2llbl9leGludGZmbGFneworCXU4CQkJcmVzZXJ2ZWQ6NDsKKwl1OAkJCXJ4c2M6MjsKKwl1OAkJCXNnaV9lbjoxOworCXU4CQkJZXhfaW50Zl9mbGFnOjE7Cit9cGh5X29mZG1fcnhfc3RhdHVzX3J4c2Nfc2dpZW5fZXhpbnRmZmxhZzsKKwordHlwZWRlZiBlbnVtIF9SVF9DVVNUT01FUl9JRAoreworCVJUX0NJRF9ERUZBVUxUID0gMCwKKwlSVF9DSURfODE4N19BTFBIQTAgPSAxLAorCVJUX0NJRF84MTg3X1NFUkNPTU1fUFMgPSAyLAorCVJUX0NJRF84MTg3X0hXX0xFRCA9IDMsCisJUlRfQ0lEXzgxODdfTkVUR0VBUiA9IDQsCisJUlRfQ0lEX1dIUUwgPSA1LAorCVJUX0NJRF84MTl4X0NBTUVPICA9IDYsCisJUlRfQ0lEXzgxOXhfUlVOVE9QID0gNywKKwlSVF9DSURfODE5eF9TZW5hbyA9IDgsCisJUlRfQ0lEX1RPU0hJQkEgPSA5LAkvLyBNZXJnZSBieSBKYWNrZW4sIDIwMDgvMDEvMzEuCisJUlRfQ0lEXzgxOXhfTmV0Y29yZSA9IDEwLAorCVJUX0NJRF9OZXR0cm9uaXggPSAxMSwKKwlSVF9DSURfRExJTksgPSAxMiwKKwlSVF9DSURfUFJPTkVUID0gMTMsCit9UlRfQ1VTVE9NRVJfSUQsICpQUlRfQ1VTVE9NRVJfSUQ7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExFRCBjdXN0b21pemF0aW9uLgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit0eXBlZGVmCWVudW0gX0xFRF9TVFJBVEVHWV84MTkweworCVNXX0xFRF9NT0RFMCwgLy8gU1cgY29udHJvbCAxIExFRCB2aWEgR1BJTzAuIEl0IGlzIGRlZmF1bHQgb3B0aW9uLgorCVNXX0xFRF9NT0RFMSwgLy8gU1cgY29udHJvbCBmb3IgUENJIEV4cHJlc3MKKwlTV19MRURfTU9ERTIsIC8vIFNXIGNvbnRyb2wgZm9yIENhbWVvLgorCVNXX0xFRF9NT0RFMywgLy8gU1cgY29udG9ybCBmb3IgUnVuVG9wLgorCVNXX0xFRF9NT0RFNCwgLy8gU1cgY29udHJvbCBmb3IgTmV0Y29yZQorCUhXX0xFRCwgLy8gSFcgY29udHJvbCAyIExFRHMsIExFRDAgYW5kIExFRDEgKHRoZXJlIGFyZSA0IGRpZmZlcmVudCBjb250cm9sIG1vZGVzKQorfUxFRF9TVFJBVEVHWV84MTkwLCAqUExFRF9TVFJBVEVHWV84MTkwOworCit0eXBlZGVmIGVudW0gX1JFU0VUX1RZUEUgeworCVJFU0VUX1RZUEVfTk9SRVNFVCA9IDB4MDAsCisJUkVTRVRfVFlQRV9OT1JNQUwgPSAweDAxLAorCVJFU0VUX1RZUEVfU0lMRU5UID0gMHgwMgorfSBSRVNFVF9UWVBFOworCisvKiBUaGUgc2ltcGxlIHR4IGNvbW1hbmQgT1AgY29kZS4gKi8KK3R5cGVkZWYgZW51bSBfdGFnX1R4Q21kX0NvbmZpZ19JbmRleHsKKwlUWENNRF9UWFJBX0hJU1RPUllfQ1RSTAkJCQk9IDB4RkY5MDAwMDAsCisJVFhDTURfUkVTRVRfVFhfUEtUX0JVRkYJCQkJPSAweEZGOTAwMDAxLAorCVRYQ01EX1JFU0VUX1JYX1BLVF9CVUZGCQkJCT0gMHhGRjkwMDAwMiwKKwlUWENNRF9TRVRfVFhfRFVSQVRJT04JCQkJPSAweEZGOTAwMDAzLAorCVRYQ01EX1NFVF9SWF9SU1NJCQkJCQkJPSAweEZGOTAwMDA0LAorCVRYQ01EX1NFVF9UWF9QV1JfVFJBQ0tJTkcJCQk9IDB4RkY5MDAwMDUsCisJVFhDTURfWFhYWF9DVFJMLAorfURDTURfVFhDTURfT1A7CisKK3R5cGVkZWYgc3RydWN0IHI4MTkyX3ByaXYKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwkvL2FkZGVkIGZvciBtYWludGFpbiBpbmZvIGZyb20gZWVwcm9tCisJc2hvcnQgZXByb210eXBlOworCXUxNiBlZXByb21fdmlkOworCXUxNiBlZXByb21fcGlkOworCXU4ICBlZXByb21fQ3VzdG9tZXJJRDsKKwl1OCAgZWVwcm9tX0NoYW5uZWxQbGFuOworCVJUX0NVU1RPTUVSX0lEIEN1c3RvbWVySUQ7CisJTEVEX1NUUkFURUdZXzgxOTAJTGVkU3RyYXRlZ3k7CisJdTggIHR4cXVldWVfdG9fb3V0cGlwZW1hcFs5XTsKKwlpbnQgaXJxOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTE7CisKKwlzaG9ydCBjYXJkXzgxOTI7IC8qIE86IHJ0bDgxOTIsIDE6cnRsODE4NSBWIEIvQywgMjpydGw4MTg1IFYgRCAqLworCXU4IGNhcmRfODE5Ml92ZXJzaW9uOyAvKiBpZiBUQ1IgcmVwb3J0cyBjYXJkIFYgQi9DIHRoaXMgZGlzY3JpbWluYXRlcyAqLworLy8Jc2hvcnQgcGh5X3ZlcjsgLyogbWVhbmluZ2Z1bCBmb3IgcnRsODIyNSAxOkEgMjpCIDM6QyAqLworCXNob3J0IGVuYWJsZV9ncGlvMDsKKwllbnVtIGNhcmRfdHlwZSB7UENJLE1JTklQQ0ksQ0FSREJVUyxVU0J9Y2FyZF90eXBlOworCXNob3J0IGh3X3BsY3BfbGVuOworCXNob3J0IHBsY3BfcHJlYW1ibGVfbW9kZTsKKworCXNwaW5sb2NrX3QgaXJxX2xvY2s7CisvLwlzcGlubG9ja190IGlycV90aF9sb2NrOworCXNwaW5sb2NrX3QgdHhfbG9jazsKKyAgICAgICAgc3RydWN0IG11dGV4IG11dGV4OworCS8vc3BpbmxvY2tfdCByZl9sb2NrOyAvL3VzZWQgdG8gbG9jayByZiB3cml0ZSBvcGVyYXRpb24gYWRkZWQgYnkgd2IKKworCXUxNiBpcnFfbWFzazsKKy8vCXNob3J0IGlycV9lbmFibGVkOworLy8Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsgLy9jb21tZW50IHRoaXMgb3V0LgorCXNob3J0IGNoYW47CisJc2hvcnQgc2VuczsKKwlzaG9ydCBtYXhfc2VuczsKKworCisJLy8JdTggY2h0eHB3clsxNV07IC8vY2hhbm5lbHMgZnJvbSAxIHRvIDE0LCAwIG5vdCB1c2VkCisvLwl1OCBjaHR4cHdyX29mZG1bMTVdOyAvL2NoYW5uZWxzIGZyb20gMSB0byAxNCwgMCBub3QgdXNlZAorLy8JdTggY2NrX3R4cHdyX2Jhc2U7CisvLwl1OCBvZmRtX3R4cHdyX2Jhc2U7CisvLwl1OCBjaGFsbG93WzE1XTsgLy9jaGFubmVscyBmcm9tIDEgdG8gMTQsIDAgbm90IHVzZWQKKwlzaG9ydCB1cDsKKwlzaG9ydCBjcmNtb247IC8vaWYgMSBhbGxvdyBiYWQgY3JjIGZyYW1lIHJlY2VwdGlvbiBpbiBtb25pdG9yIG1vZGUKKy8vCXNob3J0IHByaXNtX2hkcjsKKworLy8Jc3RydWN0IHRpbWVyX2xpc3Qgc2Nhbl90aW1lcjsKKwkvKnNob3J0IHNjYW5wZW5kaW5nOworCXNob3J0IHN0b3BzY2FuOyovCisvLwlzcGlubG9ja190IHNjYW5fbG9jazsKKy8vCXU4IGFjdGl2ZV9wcm9iZTsKKwkvL3U4IGFjdGl2ZV9zY2FuX251bTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHd4X3NlbTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHJmX3NlbTsgLy91c2VkIHRvIGxvY2sgcmYgd3JpdGUgb3BlcmF0aW9uIGFkZGVkIGJ5IHdiLCBtb2RpZmllZCBieSBkYXZpZAorLy8Jc2hvcnQgaHdfd2VwOworCisvLwlzaG9ydCBkaWdwaHk7CisvLwlzaG9ydCBhbnRiOworLy8Jc2hvcnQgZGl2ZXJzaXR5OworLy8JdTggY3NfdHJlc2hvbGQ7CisvLwlzaG9ydCByY3JfY3NlbnNlOworCXU4IHJmX3R5cGU7IC8vMCBtZWFucyAxVDJSLCAxIG1lYW5zIDJUNFIKKwlSVF9SRl9UWVBFXzgxOXhVIHJmX2NoaXA7CisKKy8vCXUzMiBrZXkwWzRdOworCXNob3J0ICgqcmZfc2V0X3NlbnMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgc2Vucyk7CisJdTggKCpyZl9zZXRfY2hhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldix1OCBjaCk7CisJdm9pZCAoKnJmX2Nsb3NlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqcmZfaW5pdCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJLy9zaG9ydCByYXRlOworCXNob3J0IHByb21pc2M7CisJLypzdGF0cyovCisJc3RydWN0IFN0YXRzIHN0YXRzOworCXN0cnVjdCBpd19zdGF0aXN0aWNzIHdzdGF0czsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpcl9kZXY7CisKKwkvKlJYIHN0dWZmKi8KKy8vCXUzMiAqcnhyaW5nOworLy8JdTMyICpyeHJpbmd0YWlsOworLy8JZG1hX2FkZHJfdCByeHJpbmdkbWE7CisJc3RydWN0IHVyYiAqKnJ4X3VyYjsKKwlzdHJ1Y3QgdXJiICoqcnhfY21kX3VyYjsKKyNpZmRlZiBUSE9NQVNfQkVBQ09OCisJdTMyICpvbGRhZGRyOworI2VuZGlmCisjaWZkZWYgVEhPTUFTX1RBU0tMRVQKKwlhdG9taWNfdCBpcnRfY291bnRlcjsvL2NvdW50IGZvciBpcnFfcnhfdGFza2xldAorI2VuZGlmCisjaWZkZWYgSkFDS1NPTl9ORVdfUlgKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKipwcF9yeHNrYjsKKyAgICAgICAgaW50ICAgICByeF9pbng7CisjZW5kaWYKKworLyogbW9kaWZpZWQgYnkgZGF2YWQgZm9yIFJ4IHByb2Nlc3MgKi8KKyAgICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJ4X3F1ZXVlOworICAgICAgIHN0cnVjdCBza19idWZmX2hlYWQgc2tiX3F1ZXVlOworICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBxb3NfYWN0aXZhdGU7CisJc2hvcnQgIHR4X3VyYl9pbmRleDsKKwlhdG9taWNfdCB0eF9wZW5kaW5nWzB4MTBdOy8vVUFSVF9QUklPUklUWSsxCisKKworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBpcnFfcnhfdGFza2xldDsKKwlzdHJ1Y3QgdXJiICpyeHVyYl90YXNrOworCisJLy8yIFR4IFJlbGF0ZWQgdmFyaWFibGVzCisJdTE2CVNob3J0UmV0cnlMaW1pdDsKKwl1MTYJTG9uZ1JldHJ5TGltaXQ7CisJdTMyCVRyYW5zbWl0Q29uZmlnOworCXU4CVJlZ0NXaW5NaW47CQkvLyBGb3IgdHVyYm8gbW9kZSBDVyBhZGFwdGl2ZS4gQWRkZWQgYnkgQW5uaWUsIDIwMDUtMTAtMjcuCisKKwl1MzIgICAgIExhc3RSeERlc2NUU0ZIaWdoOworCXUzMiAgICAgTGFzdFJ4RGVzY1RTRkxvdzsKKworCisJLy8yIFJ4IFJlbGF0ZWQgdmFyaWFibGVzCisJdTE2CUVhcmx5UnhUaHJlc2hvbGQ7CisJdTMyCVJlY2VpdmVDb25maWc7CisJdTgJQWNtQ29udHJvbDsKKworCXU4CVJGUHJvZ1R5cGU7CisKKwl1OCByZXRyeV9kYXRhOworCXU4IHJldHJ5X3J0czsKKwl1MTYgcnRzOworCisJc3RydWN0IAlDaG5sQWNjZXNzU2V0dGluZyAgQ2hhbm5lbEFjY2Vzc1NldHRpbmc7CisJc3RydWN0IHdvcmtfc3RydWN0IHJlc2V0X3dxOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvL2ZvciBydGw4MTl4VXNiCisJdTE2ICAgICBiYXNpY19yYXRlOworCXU4ICAgICAgc2hvcnRfcHJlYW1ibGU7CisJdTggICAgICBzbG90X3RpbWU7CisJYm9vbCAJYkRjdXQ7CisJYm9vbCBiQ3VycmVudFJ4QWdnckVuYWJsZTsKKwl1OCBSZl9Nb2RlOyAvL2FkZCBmb3IgRmlybXdhcmUgUkYgLVIvVyBzd2l0Y2gKKwlwcnRfZmlybXdhcmUJCXBGaXJtd2FyZTsKKwlydGw4MTl4VXNiX2xvb3BiYWNrX2UJTG9vcGJhY2tNb2RlOworCWZpcm13YXJlX3NvdXJjZV9lCWZpcm13YXJlX3NvdXJjZTsKKwl1MTYgRUVQUk9NVHhQb3dlckRpZmY7CisJdTggRUVQUk9NVGhlcm1hbE1ldGVyOworCXU4IEVFUFJPTVB3RGlmZjsKKwl1OCBFRVBST01DcnlzdGFsQ2FwOworCXU4IEVFUFJPTV9EZWZfVmVyOworCXU4IEVFUFJPTVR4UG93ZXJMZXZlbENDSzsvLyBDQ0sgY2hhbm5lbCAxfjE0CisJdTggRUVQUk9NVHhQb3dlckxldmVsQ0NLX1YxWzNdOworCXU4IEVFUFJPTVR4UG93ZXJMZXZlbE9GRE0yNEdbM107IC8vIE9GRE0gMi40RyBjaGFubmVsIDF+MTQKKwl1OCBFRVBST01UeFBvd2VyTGV2ZWxPRkRNNUdbMjRdOwkvLyBPRkRNIDVHCisKKy8qUEhZIHJlbGF0ZWQqLworCUJCX1JFR0lTVEVSX0RFRklOSVRJT05fVAlQSFlSZWdEZWZbNF07CS8vUmFkaW8gQS9CL0MvRAorCS8vIFJlYWQvd3JpdGUgYXJlIGFsbG93IGZvciBmb2xsb3dpbmcgaGFyZHdhcmUgaW5mb3JtYXRpb24gdmFyaWFibGVzCisJdTMyCU1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WzZdOworCXUzMglDQ0tUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldDsKKwl1OAlUeFBvd2VyTGV2ZWxDQ0tbMTRdOwkJCS8vIENDSyBjaGFubmVsIDF+MTQKKwl1OAlUeFBvd2VyTGV2ZWxPRkRNMjRHWzE0XTsJCS8vIE9GRE0gMi40RyBjaGFubmVsIDF+MTQKKwl1OAlUeFBvd2VyTGV2ZWxPRkRNNUdbMTRdOwkJCS8vIE9GRE0gNUcKKwl1MzIJUHdyX1RyYWNrOworCXU4CVR4UG93ZXJEaWZmOworCXU4CUFudGVubmFUeFB3RGlmZlsyXTsJCQkJLy8gQW50ZW5uYSBnYWluIG9mZnNldCwgaW5kZXggMCBmb3IgQiwgMSBmb3IgQywgYW5kIDIgZm9yIEQKKwl1OAlDcnlzdGFsQ2FwOwkJCQkJCS8vIENyeXN0YWxDYXAuCisJdTgJVGhlcm1hbE1ldGVyWzJdOwkJCQkvLyBUaGVybWFsTWV0ZXIsIGluZGV4IDAgZm9yIFJGSUMwLCBhbmQgMSBmb3IgUkZJQzEKKworCXU4CUNja1B3RW5sOworCS8vIFVzZSB0byBjYWxjdWxhdGUgUFdCRC4KKwl1OAliQ2NrSGlnaFBvd2VyOworCWxvbmcJdW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYjsKKworCS8vZm9yIHNldCBjaGFubmVsCisJdTgJU3dDaG5sSW5Qcm9ncmVzczsKKwl1OCAJU3dDaG5sU3RhZ2U7CisJdTgJU3dDaG5sU3RlcDsKKwl1OAlTZXRCV01vZGVJblByb2dyZXNzOworCUhUX0NIQU5ORUxfV0lEVEgJCUN1cnJlbnRDaGFubmVsQlc7CisJdTggICAgICBDaGFubmVsUGxhbjsKKwkvLyA4MTkwIDQwTUh6IG1vZGUKKwkvLworCXU4CW5DdXI0ME1oelByaW1lU0M7CS8vIENvbnRyb2wgY2hhbm5lbCBzdWItY2FycmllcgorCS8vIEpvc2VwaCB0ZXN0IGZvciBzaG9ydGVuIFJGIGNvbmZpZ3VyYXRpb24gdGltZS4KKwkvLyBXZSBzYXZlIFJGIHJlZzAgaW4gdGhpcyB2YXJpYWJsZSB0byByZWR1Y2UgUkYgcmVhZGluZy4KKwkvLworCXUzMgkJCQkJUmZSZWcwVmFsdWVbNF07CisJdTggCQkJCQlOdW1Ub3RhbFJGUGF0aDsKKwlib29sIAkJCQlicmZwYXRoX3J4ZW5hYmxlWzRdOworCS8vUkYgc2V0IHJlbGF0ZWQKKwlib29sCQkJCVNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3M7CisvLytieSBhbXkgMDgwNTA3CisJc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hfZG9nX3RpbWVyOworCisvLytieSBhbXkgMDgwNTE1IGZvciBkeW5hbWljIG1lY2hlbmlzbQorCS8vQWRkIGJ5IGFteSBUeCBQb3dlciBDb250cm9sIGZvciBOZWFyL0ZhciBSYW5nZSAyMDA4LzA1LzE1CisJYm9vbAliZHluYW1pY190eHBvd2VyOyAgLy9iRHluYW1pY1R4UG93ZXIKKwlib29sCWJEeW5hbWljVHhIaWdoUG93ZXI7ICAvLyBUeCBoaWdoIHBvd2VyIHN0YXRlCisJYm9vbAliRHluYW1pY1R4TG93UG93ZXI7ICAvLyBUeCBsb3cgcG93ZXIgc3RhdGUKKwlib29sCWJMYXN0RFRQRmxhZ19IaWdoOworCWJvb2wJYkxhc3REVFBGbGFnX0xvdzsKKworCWJvb2wJYnN0b3JlX2xhc3RfZHRwZmxhZzsKKwlib29sCWJzdGFydF90eGN0cmxfYnlkdHA7ICAgLy9EZWZpbmUgdG8gZGlzY3JpbWluYXRlIG9uIEhpZ2ggcG93ZXIgU3RhdGUgb3Igb24gc2l0ZXN1dmV5IHRvIGNoYW5nZSBUeCBnYWluIGluZGV4CisJLy9BZGQgYnkgYW15IGZvciBSYXRlIEFkYXB0aXZlCisJcmF0ZV9hZGFwdGl2ZSByYXRlX2FkYXB0aXZlOworCS8vQWRkIGJ5IGFteSBmb3IgVFggcG93ZXIgdHJhY2tpbmcKKwkvLzIwMDgvMDUvMTUgIE1hcnMgT1BFTi9DTE9TRSBUWCBQT1dFUiBUUkFDS0lORworICAgICAgIHR4YmJnYWluX3N0cnVjdCB0eGJiZ2Fpbl90YWJsZVtUeEJCR2FpblRhYmxlTGVuZ3RoXTsKKwl1OAkJCSAgIHR4cG93ZXJfY291bnQ7Ly9Gb3IgNiBzZWMgZG8gdHJhY2tpbmcgYWdhaW4KKwlib29sCQkJICAgYnR4cG93ZXJfdHJhY2tpbmdJbml0OworCXU4CQkJICAgT0ZETV9pbmRleDsKKwl1OAkJCSAgIENDS19pbmRleDsKKwkvLzIwMDcvMDkvMTAgTWFycyBBZGQgQ0NLIFRYIFBvd2VyIFRyYWNraW5nCisJY2NrdHhiYmdhaW5fc3RydWN0CWNja190eGJiZ2Fpbl90YWJsZVtDQ0tUeEJCR2FpblRhYmxlTGVuZ3RoXTsKKwljY2t0eGJiZ2Fpbl9zdHJ1Y3QJY2NrX3R4YmJnYWluX2NoMTRfdGFibGVbQ0NLVHhCQkdhaW5UYWJsZUxlbmd0aF07CisJdTggcmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4OworCXU4IHJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsOworCXU4IHJmYV90eHBvd2VydHJhY2tpbmdfZGVmYXVsdDsKKwl1OCByZmNfdHhwb3dlcnRyYWNraW5naW5kZXg7CisJdTggcmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWw7CisKKwlzOCBjY2tfcHJlc2VudF9hdHRlbnR1YXRpb247CisJdTggY2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXzIwTWRlZmF1bHQ7CisJdTggY2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXzQwTWRlZmF1bHQ7CisJY2hhciBjY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fZGlmZmVyZW5jZTsKKwlib29sIGJ0eHBvd2VyX3RyYWNraW5nOworCWJvb2wgYmNja19pbl9jaDE0OworCWJvb2wgYnR4cG93ZXJkYXRhX3JlYWRmcm9tRUVQT1JNOworCXUxNiAJVFNTSV8xM2RCbTsKKwkvL0ZvciBCYWNrdXAgSW5pdGlhbCBHYWluCisJaW5pdF9nYWluIGluaXRnYWluX2JhY2t1cDsKKwl1OCBEZWZhdWx0SW5pdGlhbEdhaW5bNF07CisJLy8gRm9yIEVEQ0EgVHVyYm8gbW9kZSwgQWRkZWQgYnkgYW15IDA4MDUxNS4KKwlib29sCQliaXNfYW55X25vbmJlcGt0czsKKwlib29sCQliY3VycmVudF90dXJib19FRENBOworCWJvb2wJCWJpc19jdXJfcmRsc3RhdGU7CisJc3RydWN0IHRpbWVyX2xpc3QgZnN5bmNfdGltZXI7CisJYm9vbCBiZnN5bmNfcHJvY2Vzc2luZzsJLy8gNTAwbXMgRnN5bmMgdGltZXIgaXMgYWN0aXZlIG9yIG5vdAorCXUzMiAJcmF0ZV9yZWNvcmQ7CisJdTMyIAlyYXRlQ291bnREaWZmUmVjb3JkOworCXUzMglDb250aXVuZURpZmZDb3VudDsKKwlib29sIGJzd2l0Y2hfZnN5bmM7CisKKwl1OAlmcmFtZXN5bmM7CisJdTMyIAlmcmFtZXN5bmNDMzQ7CisJdTggICAJZnJhbWVzeW5jTW9uaXRvcjsKKyAgICAgICAgCS8vQWRkZWQgYnkgYW15IDA4MDUxNiAgZm9yIFJYIHJlbGF0ZWQKKwl1MTYgCW5yeEFNUERVX3NpemU7CisJdTggCW5yeEFNUERVX2FnZ3JfbnVtOworCisJLy9ieSBhbXkgZm9yIGdwaW8KKwkgYm9vbCBiSHdSYWRpb09mZjsKKworCS8vYnkgYW15IGZvciByZXNldF9jb3VudAorCXUzMiByZXNldF9jb3VudDsKKwlib29sIGJwYmNfcHJlc3NlZDsKKwkvL2J5IGFteSBmb3IgZGVidWcKKwl1MzIgdHhwb3dlcl9jaGVja2NudDsKKwl1MzIgdHhwb3dlcl90cmFja2luZ19jYWxsYmFja19jbnQ7CisJdTggdGhlcm1hbF9yZWFkX3ZhbFs0MF07CisJdTggdGhlcm1hbF9yZWFkYmFja19pbmRleDsKKwl1MzIgY2NrdHhwb3dlcl9hZGp1c3RjbnRfbm90X2NoMTQ7CisJdTMyIGNja3R4cG93ZXJfYWRqdXN0Y250X2NoMTQ7CisJdTggdHhfZndpbmZvX2ZvcmNlX3N1YmNhcnJpZXJtb2RlOworCXU4IHR4X2Z3aW5mb19mb3JjZV9zdWJjYXJyaWVydmFsOworCS8vYnkgYW15IGZvciBzaWxlbnQgcmVzZXQKKwlSRVNFVF9UWVBFCVJlc2V0UHJvZ3Jlc3M7CisJYm9vbAkJYkZvcmNlZFNpbGVudFJlc2V0OworCWJvb2wJCWJEaXNhYmxlTm9ybWFsUmVzZXRDaGVjazsKKwl1MTYJCVR4Q291bnRlcjsKKwl1MTYJCVJ4Q291bnRlcjsKKwlpbnQJCUlycFBlbmRpbmdDb3VudDsKKwlib29sCQliUmVzZXRJblByb2dyZXNzOworCWJvb2wJCWZvcmNlX3Jlc2V0OworCXU4CQlJbml0aWFsR2Fpbk9wZXJhdGVUeXBlOworCisJdTE2CQlTaWZzVGltZTsKKworCS8vZGVmaW5lIHdvcmsgaXRlbSBieSBhbXkgMDgwNTI2CisKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHVwZGF0ZV9iZWFjb25fd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayB3YXRjaF9kb2dfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayB0eHBvd2VyX3RyYWNraW5nX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgcmZwYXRoX2NoZWNrX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgZ3Bpb19jaGFuZ2VfcmZfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBpbml0aWFsZ2Fpbl9vcGVyYXRlX3dxOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpwcml2X3dxOworfXI4MTkyX3ByaXY7CisKKy8vIGZvciBydGw4MTg3CisvLyBub3cgbWlyZ2luZyB0byBydGw4MTg3QgorLyoKK3R5cGVkZWYgZW51bXsKKwlMT1dfUFJJT1JJVFkgPSAweDAyLAorCU5PUk1fUFJJT1JJVFkKKwl9IHByaW9yaXR5X3Q7CisqLworLy9mb3IgcnRsODE4N0IKK3R5cGVkZWYgZW51bXsKKwlCVUxLX1BSSU9SSVRZID0gMHgwMSwKKwkvL1JTVkQwLAorCS8vUlNWRDEsCisJTE9XX1BSSU9SSVRZLAorCU5PUk1fUFJJT1JJVFksCisJVk9fUFJJT1JJVFksCisJVklfUFJJT1JJVFksIC8vMHgwNQorCUJFX1BSSU9SSVRZLAorCUJLX1BSSU9SSVRZLAorCVJTVkQyLAorCVJTVkQzLAorCUJFQUNPTl9QUklPUklUWSwgLy8weDBBCisJSElHSF9QUklPUklUWSwKKwlNQU5BR0VfUFJJT1JJVFksCisJUlNWRDQsCisJUlNWRDUsCisJVUFSVF9QUklPUklUWSAvLzB4MEYKK30gcHJpb3JpdHlfdDsKKwordHlwZWRlZiBlbnVteworCU5JQ184MTkyVSA9IDEsCisJTklDXzgxOTBQID0gMiwKKwlOSUNfODE5MkUgPSAzLAorCX0gbmljX3Q7CisKKworI2lmZGVmIEpPSE5fSFdTRUMKK3N0cnVjdCBzc2lkX3RocmVhZCB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICAgICAJdTggbmFtZVtJV19FU1NJRF9NQVhfU0laRSArIDFdOworfTsKKyNlbmRpZgorCitib29sIGluaXRfZmlybXdhcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzaG9ydCBydGw4MTl4VV90eF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzaG9ydCBydGw4MTkyX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmKiBza2IpOworCit1MzIgcmVhZF9jYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRkcik7Cit2b2lkIHdyaXRlX2NhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZGRyLCB1MzIgZGF0YSk7CisKK3U4IHJlYWRfbmljX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpOwordTggcmVhZF9uaWNfYnl0ZV9FKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KTsKK3UzMiByZWFkX25pY19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCk7Cit1MTYgcmVhZF9uaWNfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkgOwordm9pZCB3cml0ZV9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCx1OCB5KTsKK3ZvaWQgd3JpdGVfbmljX2J5dGVfRShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCx1OCB5KTsKK3ZvaWQgd3JpdGVfbmljX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsdTE2IHkpOwordm9pZCB3cml0ZV9uaWNfZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsdTMyIHkpOwordm9pZCBmb3JjZV9wY2lfcG9zdGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwordm9pZCBydGw4MTkyX3J0eF9kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICopOwordm9pZCBydGw4MTkyX3J4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3ZvaWQgcnRsODE5Ml90eF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKik7CisKK3ZvaWQgcnRsODE5Ml9kaXNhc3NvY2lhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvL3ZvaWQgZml4X3J4X2ZpZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODVfc2V0X3JmX3BpbnNfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTMyIGEpOworCit2b2lkIHJ0bDgxOTJfc2V0X2FuYXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTMyIGEpOwordm9pZCBydGw4MTg1X3NldF9hbmFwYXJhbTIoc3RydWN0IG5ldF9kZXZpY2UgKmRldix1MzIgYSk7Cit2b2lkIHJ0bDgxOTJfdXBkYXRlX21zcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBydGw4MTkyX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgcnRsODE5Ml91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE5Ml9jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxOTJfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7Cit2b2lkIHdyaXRlX3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHU4IGRhdGEpOwordm9pZCB3cml0ZV9waHlfY2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTMyIGRhdGEpOwordm9pZCB3cml0ZV9waHlfb2ZkbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUzMiBkYXRhKTsKK3ZvaWQgcnRsODE4NV90eF9hbnRlbm5hKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFudCk7Cit2b2lkIHJ0bDgxOTJfc2V0X3J4Y29uZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8vc2hvcnQgY2hlY2tfbmljX2Vub3VnaF9kZXNjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHByaW9yaXR5X3QgcHJpb3JpdHkpOworZXh0ZXJuIHZvaWQgcnRsODE5eHVzYl9iZWFjb25fdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldix1MTYgIHR4X3JhdGUpOworCit2b2lkIEVuYWJsZUhXU2VjdXJpdHlDb25maWc4MTkyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBzZXRLZXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggRW50cnlObywgdTggS2V5SW5kZXgsIHUxNiBLZXlUeXBlLCB1OCAqTWFjQWRkciwgdTggRGVmYXVsdEtleSwgdTMyICpLZXlDb250ZW50ICk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYWRlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYwpAQCAtMCwwICsxLDYwODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogTGludXggZGV2aWNlIGRyaXZlciBmb3IgUlRMODE5MlUKKyAqCisgKiBCYXNlZCBvbiB0aGUgcjgxODcgZHJpdmVyLCB3aGljaCBpczoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDUgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PiwgZXQgYWwuCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIEplcnJ5IGNodWFuZyA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqLworCisjaWZuZGVmIENPTkZJR19GT1JDRV9IQVJEX0ZMT0FUCitkb3VibGUgX19mbG9hdHNpZGYgKGludCBpKSB7IHJldHVybiBpOyB9Cit1bnNpZ25lZCBpbnQgX19maXh1bnNkZnNpIChkb3VibGUgZCkgeyByZXR1cm4gZDsgfQorZG91YmxlIF9fYWRkZGYzKGRvdWJsZSBhLCBkb3VibGUgYikgeyByZXR1cm4gYStiOyB9Citkb3VibGUgX19hZGRzZjMoZmxvYXQgYSwgZmxvYXQgYikgeyByZXR1cm4gYStiOyB9Citkb3VibGUgX19zdWJkZjMoZG91YmxlIGEsIGRvdWJsZSBiKSB7IHJldHVybiBhLWI7IH0KK2RvdWJsZSBfX2V4dGVuZHNmZGYyKGZsb2F0IGEpIHtyZXR1cm4gYTt9CisjZW5kaWYKKworI3VuZGVmIExPT1BfVEVTVAorI3VuZGVmIERVTVBfUlgKKyN1bmRlZiBEVU1QX1RYCisjdW5kZWYgREVCVUdfVFhfREVTQzIKKyN1bmRlZiBSWF9ET05UX1BBU1NfVUwKKyN1bmRlZiBERUJVR19FUFJPTQorI3VuZGVmIERFQlVHX1JYX1ZFUkJPU0UKKyN1bmRlZiBEVU1NWV9SWAorI3VuZGVmIERFQlVHX1pFUk9fUlgKKyN1bmRlZiBERUJVR19SWF9TS0IKKyN1bmRlZiBERUJVR19UWF9GUkFHCisjdW5kZWYgREVCVUdfUlhfRlJBRworI3VuZGVmIERFQlVHX1RYX0ZJTExERVNDCisjdW5kZWYgREVCVUdfVFgKKyN1bmRlZiBERUJVR19JUlEKKyN1bmRlZiBERUJVR19SWAorI3VuZGVmIERFQlVHX1JYQUxMT0MKKyN1bmRlZiBERUJVR19SRUdJU1RFUlMKKyN1bmRlZiBERUJVR19SSU5HCisjdW5kZWYgREVCVUdfSVJRX1RBU0tMRVQKKyN1bmRlZiBERUJVR19UWF9BTExPQworI3VuZGVmIERFQlVHX1RYX0RFU0MKKworI2RlZmluZSBDT05GSUdfUlRMODE5Ml9JT19NQVAKKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSAicjgxOTJVX2h3LmgiCisjaW5jbHVkZSAicjgxOTJVLmgiCisjaW5jbHVkZSAicjgxOTBfcnRsODI1Ni5oIiAvKiBSVEw4MjI1IFJhZGlvIGZyb250ZW5kICovCisjaW5jbHVkZSAicjgxODBfOTNjeDYuaCIgICAvKiBDYXJkIEVFUFJPTSAqLworI2luY2x1ZGUgInI4MTkyVV93eC5oIgorI2luY2x1ZGUgInI4MTl4VV9waHkuaCIgLy9hZGRlZCBieSBXQiA0LjMwLjIwMDgKKyNpbmNsdWRlICJyODE5eFVfcGh5cmVnLmgiCisjaW5jbHVkZSAicjgxOXhVX2NtZHBrdC5oIgorI2luY2x1ZGUgInI4MTkyVV9kbS5oIgorLy8jaW5jbHVkZSAicjgxOTJ4VV9waHlyZWcuaCIKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKy8vIEZJWE1FOiBjaGVjayBpZiAyLjYuNyBpcyBvaworCisjaWZkZWYgQ09ORklHX1JUTDgxOTJfUE0KKyNpbmNsdWRlICJyODE5Ml9wbS5oIgorI2VuZGlmCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiZG90MTFkLmgiCisjZW5kaWYKKy8vc2V0IGhlcmUgdG8gb3BlbiB5b3VyIHRyYWNlIGNvZGUuIC8vV0IKK3UzMiBydF9nbG9iYWxfZGVidWdfY29tcG9uZW50ID0gXAorCQkJLy8JQ09NUF9JTklUICAgIAl8CisvLwkJCQlDT01QX0RCRwl8CisJCQkvLwlDT01QX0VQUk9NICAgCXwKKy8vCQkJCUNPTVBfUEhZCXwKKwkJCS8vCUNPTVBfUkYJCXwKKy8vCQkJCUNPTVBfRklSTVdBUkUJfAorLy8JCQkJQ09NUF9DSAkJfAorCQkJLy8JQ09NUF9QT1dFUl9UUkFDS0lORyB8CisvLwkJCQlDT01QX1JBVEUJfAorCQkJLy8JQ09NUF9UWEFHQwl8CisJCS8vCQlDT01QX1RSQUNFCXwKKwkJCQlDT01QX0RPV04JfAorCQkvLwkJQ09NUF9SRUNWCXwKKwkJLy8gICAgICAgICAgICAgIENPTVBfU1dCVwl8CisJCQkJQ09NUF9TRUMJfAorCS8vCQkJQ09NUF9SRVNFVAl8CisJCS8vCQlDT01QX1NFTkQJfAorCQkJLy8JQ09NUF9FVkVOVFMJfAorCQkJCUNPTVBfRVJSIDsgLy9hbHdheXMgb3BlbiBlcnIgZmxhZ3Mgb24KKworI2RlZmluZSBUT1RBTF9DQU1fRU5UUlkgMzIKKyNkZWZpbmUgQ0FNX0NPTlRFTlRfQ09VTlQgOAorCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgcnRsODE5Ml91c2JfaWRfdGJsW10gPSB7CisJLyogUmVhbHRlayAqLworCXtVU0JfREVWSUNFKDB4MGJkYSwgMHg4MTkyKX0sCisJe1VTQl9ERVZJQ0UoMHgwYmRhLCAweDg3MDkpfSwKKwkvKiBDb3JlZ2EgKi8KKwl7VVNCX0RFVklDRSgweDA3YWEsIDB4MDA0Myl9LAorCS8qIEJlbGtpbiAqLworCXtVU0JfREVWSUNFKDB4MDUwZCwgMHg4MDVFKX0sCisJLyogU2l0ZWNvbSAqLworCXtVU0JfREVWSUNFKDB4MGRmNiwgMHgwMDMxKX0sCisJLyogRW5HZW5pdXMgKi8KKwl7VVNCX0RFVklDRSgweDE3NDAsIDB4OTIwMSl9LAorCS8qIERsaW5rICovCisJe1VTQl9ERVZJQ0UoMHgyMDAxLCAweDMzMDEpfSwKKwkvKiBaaW53ZWxsICovCisJe1VTQl9ERVZJQ0UoMHg1YTU3LCAweDAyOTApfSwKKwl7fQorfTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIlYgMS4xIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgcnRsODE5Ml91c2JfaWRfdGJsKTsKK01PRFVMRV9ERVNDUklQVElPTigiTGludXggZHJpdmVyIGZvciBSZWFsdGVrIFJUTDgxOTIgVVNCIFdpRmkgY2FyZHMiKTsKKworc3RhdGljIGNoYXIqIGlmbmFtZSA9ICJ3bGFuJWQiOworc3RhdGljIGludCBod3dlcCA9IDE7ICAvL2RlZmF1bHQgdXNlIGh3LiBzZXQgMCB0byB1c2Ugc29mdHdhcmUgc2VjdXJpdHkKK3N0YXRpYyBpbnQgY2hhbm5lbHMgPSAweDNmZmY7CisKKworCittb2R1bGVfcGFyYW0oaWZuYW1lLCBjaGFycCwgU19JUlVHT3xTX0lXVVNSICk7CisvL21vZHVsZV9wYXJhbShod3NlcW51bSxpbnQsIFNfSVJVR098U19JV1VTUik7Cittb2R1bGVfcGFyYW0oaHd3ZXAsaW50LCBTX0lSVUdPfFNfSVdVU1IpOworbW9kdWxlX3BhcmFtKGNoYW5uZWxzLGludCwgU19JUlVHT3xTX0lXVVNSKTsKKworTU9EVUxFX1BBUk1fREVTQyhpZm5hbWUsIiBOZXQgaW50ZXJmYWNlIG5hbWUsIHdsYW4lZD1kZWZhdWx0Iik7CisvL01PRFVMRV9QQVJNX0RFU0MoaHdzZXFudW0sIiBUcnkgdG8gdXNlIGhhcmR3YXJlIDgwMi4xMSBoZWFkZXIgc2VxdWVuY2UgbnVtYmVycy4gWmVybz1kZWZhdWx0Iik7CitNT0RVTEVfUEFSTV9ERVNDKGh3d2VwLCIgVHJ5IHRvIHVzZSBoYXJkd2FyZSBzZWN1cml0eSBzdXBwb3J0LiAiKTsKK01PRFVMRV9QQVJNX0RFU0MoY2hhbm5lbHMsIiBDaGFubmVsIGJpdG1hc2sgZm9yIHNwZWNpZmljIGxvY2FsZXMuIE5ZSSIpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBydGw4MTkyX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCSBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOworc3RhdGljIHZvaWQgX19kZXZleGl0IHJ0bDgxOTJfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBydGw4MTkyX3VzYl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gUlRMODE5eFVfTU9EVUxFX05BTUUsCQkgIC8qIERyaXZlciBuYW1lICAgKi8KKwkuaWRfdGFibGUJPSBydGw4MTkyX3VzYl9pZF90YmwsCQkgIC8qIFBDSV9JRCB0YWJsZSAgKi8KKwkucHJvYmUJCT0gcnRsODE5Ml91c2JfcHJvYmUsCQkgIC8qIHByb2JlIGZuICAgICAgKi8KKwkuZGlzY29ubmVjdAk9IHJ0bDgxOTJfdXNiX2Rpc2Nvbm5lY3QsCSAgLyogcmVtb3ZlIGZuICAgICAqLworI2lmZGVmIENPTkZJR19SVEw4MTkyX1BNCisJLnN1c3BlbmQJPSBydGw4MTkyX3N1c3BlbmQsCQkgIC8qIFBNIHN1c3BlbmQgZm4gKi8KKwkucmVzdW1lCQk9IHJ0bDgxOTJfcmVzdW1lLCAgICAgICAgICAgICAgICAgLyogUE0gcmVzdW1lIGZuICAqLworI2Vsc2UKKwkuc3VzcGVuZAk9IE5VTEwsCQkJCSAgLyogUE0gc3VzcGVuZCBmbiAqLworCS5yZXN1bWUgICAgICAJPSBOVUxMLAkJCQkgIC8qIFBNIHJlc3VtZSBmbiAgKi8KKyNlbmRpZgorfTsKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwordHlwZWRlZiBzdHJ1Y3QgX0NIQU5ORUxfTElTVAoreworCXU4CUNoYW5uZWxbMzJdOworCXU4CUxlbjsKK31DSEFOTkVMX0xJU1QsICpQQ0hBTk5FTF9MSVNUOworCitzdGF0aWMgQ0hBTk5FTF9MSVNUIENoYW5uZWxQbGFuW10gPSB7CisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NCwxNDksMTUzLDE1NywxNjEsMTY1fSwyNH0sICAJCS8vRkNDCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMX0sMTF9LCAgICAgICAgICAgICAgICAgICAgCQkJCS8vSUMKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMX0sICAJLy9FVFNJCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxM30sMTN9LCAgICAvL1NwYWluLiBDaGFuZ2UgdG8gRVRTSS4KKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzfSwxM30sICAJLy9GcmFuY2UuIENoYW5nZSB0byBFVFNJLgorCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIyfSwJLy9NS0sJCQkJCS8vTUtLCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjJ9LC8vTUtLMQorCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTN9LDEzfSwJLy9Jc3JhZWwuCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjJ9LAkJCS8vIEZvciAxMWEgLCBURUxFQworCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LCAyMn0sICAgIC8vTUlDCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNH0sMTR9CQkJCQkvL0ZvciBHbG9iYWwgRG9tYWluLiAxLTExOmFjdGl2ZSBzY2FuLCAxMi0xNCBwYXNzaXZlIHNjYW4uIC8vK1lKLCAwODA2MjYKK307CisKK3N0YXRpYyB2b2lkIHJ0bDgxOXhfc2V0X2NoYW5uZWxfbWFwKHU4IGNoYW5uZWxfcGxhbiwgc3RydWN0IHI4MTkyX3ByaXYqIHByaXYpCit7CisJaW50IGksIG1heF9jaGFuPS0xLCBtaW5fY2hhbj0tMTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwlzd2l0Y2ggKGNoYW5uZWxfcGxhbikKKwl7CisJCWNhc2UgQ09VTlRSWV9DT0RFX0ZDQzoKKwkJY2FzZSBDT1VOVFJZX0NPREVfSUM6CisJCWNhc2UgQ09VTlRSWV9DT0RFX0VUU0k6CisJCWNhc2UgQ09VTlRSWV9DT0RFX1NQQUlOOgorCQljYXNlIENPVU5UUllfQ09ERV9GUkFOQ0U6CisJCWNhc2UgQ09VTlRSWV9DT0RFX01LSzoKKwkJY2FzZSBDT1VOVFJZX0NPREVfTUtLMToKKwkJY2FzZSBDT1VOVFJZX0NPREVfSVNSQUVMOgorCQljYXNlIENPVU5UUllfQ09ERV9URUxFQzoKKwkJY2FzZSBDT1VOVFJZX0NPREVfTUlDOgorCQl7CisJCQlEb3QxMWRfSW5pdChpZWVlKTsKKwkJCWllZWUtPmJHbG9iYWxEb21haW4gPSBmYWxzZTsKKwkJCS8vYWN0dXJhbGx5IDgyMjUgJiA4MjU2IHJmIGNoaXAgb25seSBzdXBwb3J0IEIsRywyNE4gbW9kZQorCQkJaWYgKChwcml2LT5yZl9jaGlwID09IFJGXzgyMjUpIHx8IChwcml2LT5yZl9jaGlwID09IFJGXzgyNTYpKQorCQkJeworCQkJCW1pbl9jaGFuID0gMTsKKwkJCQltYXhfY2hhbiA9IDE0OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAidW5rbm93biByZiBjaGlwLCBjYW4ndCBzZXQgY2hhbm5lbCBtYXAgaW4gZnVuY3Rpb246JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCX0KKwkJCWlmIChDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkxlbiAhPSAwKXsKKwkJCQkvLyBDbGVhciBvbGQgY2hhbm5lbCBtYXAKKwkJCQltZW1zZXQoR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCwgMCwgc2l6ZW9mKEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXApKTsKKwkJCQkvLyBTZXQgbmV3IGNoYW5uZWwgbWFwCisJCQkJZm9yIChpPTA7aTxDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkxlbjtpKyspCisJCQkJeworCQkJCQlpZiAoQ2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5DaGFubmVsW2ldIDwgbWluX2NoYW4gfHwgQ2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5DaGFubmVsW2ldID4gbWF4X2NoYW4pCisJCQkJCWJyZWFrOworCQkJCQlHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwW0NoYW5uZWxQbGFuW2NoYW5uZWxfcGxhbl0uQ2hhbm5lbFtpXV0gPSAxOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQ09VTlRSWV9DT0RFX0dMT0JBTF9ET01BSU46CisJCXsKKwkJCUdFVF9ET1QxMURfSU5GTyhpZWVlKS0+YkVuYWJsZWQgPSAwOy8vdGhpcyBmbGFnIGVuYWJsZWQgdG8gZm9sbG93IDExZCBjb3VudHJ5IElFIHNldHRpbmcsIG90aGVyd2lzZSwgaXQgc2hhbGwgZm9sbG93IGdsb2JhbCBkb21haW4gc2V0dGluZ3MuCisJCQlEb3QxMWRfUmVzZXQoaWVlZSk7CisJCQlpZWVlLT5iR2xvYmFsRG9tYWluID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisJcmV0dXJuOworfQorI2VuZGlmCisKKyNkZWZpbmUgZXFNYWNBZGRyKGEsYikgKCAoKGEpWzBdPT0oYilbMF0gJiYgKGEpWzFdPT0oYilbMV0gJiYgKGEpWzJdPT0oYilbMl0gJiYgKGEpWzNdPT0oYilbM10gJiYgKGEpWzRdPT0oYilbNF0gJiYgKGEpWzVdPT0oYilbNV0pID8gMTowICkKKworI2RlZmluZSAJcnhfaGFsX2lzX2Nja19yYXRlKF9wZHJ2aW5mbylcCisJCQkoX3BkcnZpbmZvLT5SeFJhdGUgPT0gREVTQzkwX1JBVEUxTSB8fFwKKwkJCV9wZHJ2aW5mby0+UnhSYXRlID09IERFU0M5MF9SQVRFMk0gfHxcCisJCQlfcGRydmluZm8tPlJ4UmF0ZSA9PSBERVNDOTBfUkFURTVfNU0gfHxcCisJCQlfcGRydmluZm8tPlJ4UmF0ZSA9PSBERVNDOTBfUkFURTExTSkgJiZcCisJCQkhX3BkcnZpbmZvLT5SeEhUXAorCisKK3ZvaWQgQ2FtUmVzZXRBbGxFbnRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXUzMiB1bGNvbW1hbmQgPSAwOworCS8vMjAwNC8wMi8xMSAgSW4gc3RhdGljIFdFUCwgT0lEX0FERF9LRVkgb3IgT0lEX0FERF9XRVAgYXJlIHNldCBiZWZvcmUgU1RBIGFzc29jaWF0ZSB0byBBUC4KKwkvLyBIb3dldmVyLCBSZXNldEtleSBpcyBjYWxsZWQgb24gT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFIGFuZCBNbG1lQXNzb2NpYXRlUmVxdWVzdAorCS8vIEluIHRoaXMgY29uZGl0aW9uLCBDYW0gY2FuIG5vdCBiZSByZXNldCBiZWNhdXNlIHVwcGVyIGxheWVyIHdpbGwgbm90IHNldCB0aGlzIHN0YXRpYyBrZXkgYWdhaW4uCisJLy9pZihBZGFwdGVyLT5FbmNBbGdvcml0aG0gPT0gV0VQX0VuY3J5cHRpb24pCisJLy8gICAgICByZXR1cm47CisvL2RlYnVnCisJLy9EYmdQcmludCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJLy9EYmdQcmludCgiICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGwgUmVzZXRBbGxFbnRyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOworCS8vRGJnUHJpbnQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuIik7CisJdWxjb21tYW5kIHw9IEJJVDMxfEJJVDMwOworCXdyaXRlX25pY19kd29yZChkZXYsIFJXQ0FNLCB1bGNvbW1hbmQpOworCit9CisKKwordm9pZCB3cml0ZV9jYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRkciwgdTMyIGRhdGEpCit7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgV0NBTUksIGRhdGEpOworCXdyaXRlX25pY19kd29yZChkZXYsIFJXQ0FNLCBCSVQzMXxCSVQxNnwoYWRkciYweGZmKSApOworfQorCit1MzIgcmVhZF9jYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRkcikKK3sKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSV0NBTSwgMHg4MDAwMDAwMHwoYWRkciYweGZmKSApOworCXJldHVybiByZWFkX25pY19kd29yZChkZXYsIDB4YTgpOworfQorCit2b2lkIHdyaXRlX25pY19ieXRlX0Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluZHgsIHU4IGRhdGEpCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBwcml2LT51ZGV2OworCisJc3RhdHVzID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCSAgICAgICBSVEw4MTg3X1JFUV9TRVRfUkVHUywgUlRMODE4N19SRVFUX1dSSVRFLAorCQkJICAgICAgIGluZHh8MHhmZTAwLCAwLCAmZGF0YSwgMSwgSFogLyAyKTsKKworCWlmIChzdGF0dXMgPCAwKQorCXsKKwkJcHJpbnRrKCJ3cml0ZV9uaWNfYnl0ZV9FIFRpbWVPdXQhIHN0YXR1czolZFxuIiwgc3RhdHVzKTsKKwl9Cit9CisKK3U4IHJlYWRfbmljX2J5dGVfRShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5keCkKK3sKKwlpbnQgc3RhdHVzOworCXU4IGRhdGE7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcHJpdi0+dWRldjsKKworCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCisJCQkgICAgICAgUlRMODE4N19SRVFfR0VUX1JFR1MsIFJUTDgxODdfUkVRVF9SRUFELAorCQkJICAgICAgIGluZHh8MHhmZTAwLCAwLCAmZGF0YSwgMSwgSFogLyAyKTsKKworCWlmIChzdGF0dXMgPCAwKQorCXsKKwkJcHJpbnRrKCJyZWFkX25pY19ieXRlX0UgVGltZU91dCEgc3RhdHVzOiVkXG4iLCBzdGF0dXMpOworCX0KKworCXJldHVybiBkYXRhOworfQorLy9hcyA5MlUgaGFzIGV4dGVuZCBwYWdlIGZyb20gNCB0byAxNiwgc28gbW9kaWZ5IGZ1bmN0aW9ucyBiZWxvdy4KK3ZvaWQgd3JpdGVfbmljX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluZHgsIHU4IGRhdGEpCit7CisJaW50IHN0YXR1czsKKworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHByaXYtPnVkZXY7CisKKwlzdGF0dXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAorCQkJICAgICAgIFJUTDgxODdfUkVRX1NFVF9SRUdTLCBSVEw4MTg3X1JFUVRfV1JJVEUsCisJCQkgICAgICAgKGluZHgmMHhmZil8MHhmZjAwLCAoaW5keD4+OCkmMHgwZiwgJmRhdGEsIDEsIEhaIC8gMik7CisKKwlpZiAoc3RhdHVzIDwgMCkKKwl7CisJCXByaW50aygid3JpdGVfbmljX2J5dGUgVGltZU91dCEgc3RhdHVzOiVkXG4iLCBzdGF0dXMpOworCX0KKworCit9CisKKwordm9pZCB3cml0ZV9uaWNfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5keCwgdTE2IGRhdGEpCit7CisKKwlpbnQgc3RhdHVzOworCisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcHJpdi0+dWRldjsKKworCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCQkgICAgICAgUlRMODE4N19SRVFfU0VUX1JFR1MsIFJUTDgxODdfUkVRVF9XUklURSwKKwkJCSAgICAgICAoaW5keCYweGZmKXwweGZmMDAsIChpbmR4Pj44KSYweDBmLCAmZGF0YSwgMiwgSFogLyAyKTsKKworCWlmIChzdGF0dXMgPCAwKQorCXsKKwkJcHJpbnRrKCJ3cml0ZV9uaWNfd29yZCBUaW1lT3V0ISBzdGF0dXM6JWRcbiIsIHN0YXR1cyk7CisJfQorCit9CisKKwordm9pZCB3cml0ZV9uaWNfZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluZHgsIHUzMiBkYXRhKQoreworCisJaW50IHN0YXR1czsKKworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHByaXYtPnVkZXY7CisKKwlzdGF0dXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAorCQkJICAgICAgIFJUTDgxODdfUkVRX1NFVF9SRUdTLCBSVEw4MTg3X1JFUVRfV1JJVEUsCisJCQkgICAgICAgKGluZHgmMHhmZil8MHhmZjAwLCAoaW5keD4+OCkmMHgwZiwgJmRhdGEsIDQsIEhaIC8gMik7CisKKworCWlmIChzdGF0dXMgPCAwKQorCXsKKwkJcHJpbnRrKCJ3cml0ZV9uaWNfZHdvcmQgVGltZU91dCEgc3RhdHVzOiVkXG4iLCBzdGF0dXMpOworCX0KKworfQorCisKKwordTggcmVhZF9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5keCkKK3sKKwl1OCBkYXRhOworCWludCBzdGF0dXM7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcHJpdi0+dWRldjsKKworCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCisJCQkgICAgICAgUlRMODE4N19SRVFfR0VUX1JFR1MsIFJUTDgxODdfUkVRVF9SRUFELAorCQkJICAgICAgIChpbmR4JjB4ZmYpfDB4ZmYwMCwgKGluZHg+PjgpJjB4MGYsICZkYXRhLCAxLCBIWiAvIDIpOworCisJaWYgKHN0YXR1cyA8IDApCisJeworCQlwcmludGsoInJlYWRfbmljX2J5dGUgVGltZU91dCEgc3RhdHVzOiVkXG4iLCBzdGF0dXMpOworCX0KKworCXJldHVybiBkYXRhOworfQorCisKKwordTE2IHJlYWRfbmljX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluZHgpCit7CisJdTE2IGRhdGE7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBwcml2LT51ZGV2OworCisJc3RhdHVzID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCSAgICAgICBSVEw4MTg3X1JFUV9HRVRfUkVHUywgUlRMODE4N19SRVFUX1JFQUQsCisJCQkgICAgICAgKGluZHgmMHhmZil8MHhmZjAwLCAoaW5keD4+OCkmMHgwZiwgJmRhdGEsIDIsIEhaIC8gMik7CisKKwlpZiAoc3RhdHVzIDwgMCkKKwl7CisJCXByaW50aygicmVhZF9uaWNfd29yZCBUaW1lT3V0ISBzdGF0dXM6JWRcbiIsIHN0YXR1cyk7CisJfQorCisKKwlyZXR1cm4gZGF0YTsKK30KKwordTE2IHJlYWRfbmljX3dvcmRfRShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5keCkKK3sKKwl1MTYgZGF0YTsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHByaXYtPnVkZXY7CisKKwlzdGF0dXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLAorCQkJICAgICAgIFJUTDgxODdfUkVRX0dFVF9SRUdTLCBSVEw4MTg3X1JFUVRfUkVBRCwKKwkJCSAgICAgICBpbmR4fDB4ZmUwMCwgMCwgJmRhdGEsIDIsIEhaIC8gMik7CisKKwlpZiAoc3RhdHVzIDwgMCkKKwl7CisJCXByaW50aygicmVhZF9uaWNfd29yZCBUaW1lT3V0ISBzdGF0dXM6JWRcbiIsIHN0YXR1cyk7CisJfQorCisKKwlyZXR1cm4gZGF0YTsKK30KKwordTMyIHJlYWRfbmljX2R3b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbmR4KQoreworCXUzMiBkYXRhOworCWludCBzdGF0dXM7CisvLwlpbnQgcmVzdWx0OworCisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcHJpdi0+dWRldjsKKworCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCisJCQkgICAgICAgUlRMODE4N19SRVFfR0VUX1JFR1MsIFJUTDgxODdfUkVRVF9SRUFELAorCQkJICAgICAgIChpbmR4JjB4ZmYpfDB4ZmYwMCwgKGluZHg+PjgpJjB4MGYsICZkYXRhLCA0LCBIWiAvIDIpOworLy8JaWYoMCAhPSByZXN1bHQpIHsKKy8vCSAgcHJpbnRrKEtFUk5fV0FSTklORyAicmVhZCBzaXplIG9mIGRhdGEgPSAlZFwsIGRhdGUgPSAlZFxuIiwgcmVzdWx0LCBkYXRhKTsKKy8vCX0KKworCWlmIChzdGF0dXMgPCAwKQorCXsKKwkJcHJpbnRrKCJyZWFkX25pY19kd29yZCBUaW1lT3V0ISBzdGF0dXM6JWRcbiIsIHN0YXR1cyk7CisJfQorCisKKworCXJldHVybiBkYXRhOworfQorCisKKy8vdTggcmVhZF9waHlfY2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkcik7CisvL3U4IHJlYWRfcGh5X29mZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyKTsKKy8qIHRoaXMgbWlnaHQgc3RpbGwgY2FsbGVkIGluIHdoYXQgd2FzIHRoZSBQSFkgcnRsODE4NS9ydGw4MTkyIGNvbW1vbiBjb2RlCisgKiBwbGFucyBhcmUgdG8gcG9zc2liaWx0eSB0dXJuIGl0IGFnYWluIGluIG9uZSBjb21tb24gY29kZS4uLgorICovCitpbmxpbmUgdm9pZCBmb3JjZV9wY2lfcG9zdGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcnRsODE5Ml9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE5Ml9jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvL3ZvaWQgcnRsODE5Ml9yZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTkyX3Jlc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKy8vdm9pZCBydGw4MTkyX3JxX3R4X2FjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCit2b2lkIHdhdGNoX2RvZ190aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1QUk9DRlMgU1RVRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcnRsODE5Ml9wcm9jID0gTlVMTDsKKworCisKK3N0YXRpYyBpbnQgcHJvY19nZXRfc3RhdHNfYXAoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqdGFyZ2V0OworCisJaW50IGxlbiA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdldCwgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgeworCisJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJIiVzICIsIHRhcmdldC0+c3NpZCk7CisKKwkJaWYodGFyZ2V0LT53cGFfaWVfbGVuPjAgfHwgdGFyZ2V0LT5yc25faWVfbGVuPjApeworCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIldQQVxuIik7CisJCX0KKwkJZWxzZXsKKwkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJub25fV1BBXG4iKTsKKwkJfQorCisJfQorCisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBwcm9jX2dldF9yZWdpc3RlcnMoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisvLwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlpbnQgbGVuID0gMDsKKwlpbnQgaSxuOworCisJaW50IG1heD0weGZmOworCisJLyogVGhpcyBkdW1wIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHBhZ2UgKi8KK2xlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjcGFnZSAwIyMjIyMjIyMjIyMjIyMjIyMjXG4gIik7CisKKwlmb3Iobj0wO248PW1heDspCisJeworCQkvL3ByaW50ayggIlxuRDogJTJ4PiAiLCBuKTsKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIlxuRDogICUyeCA+ICIsbik7CisKKwkJZm9yKGk9MDtpPDE2ICYmIG48PW1heDtpKyssbisrKQorCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkiJTJ4ICIscmVhZF9uaWNfYnl0ZShkZXYsMHgwMDB8bikpOworCisJCS8vCXByaW50aygiJTJ4ICIscmVhZF9uaWNfYnl0ZShkZXYsbikpOworCX0KK2xlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjcGFnZSAxIyMjIyMjIyMjIyMjIyMjIyMjXG4gIik7CisJZm9yKG49MDtuPD1tYXg7KQorCXsKKwkJLy9wcmludGsoICJcbkQ6ICUyeD4gIiwgbik7CisJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbkQ6ICAlMnggPiAiLG4pOworCisJCWZvcihpPTA7aTwxNiAmJiBuPD1tYXg7aSsrLG4rKykKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIiUyeCAiLHJlYWRfbmljX2J5dGUoZGV2LDB4MTAwfG4pKTsKKworCQkvLyAgICAgIHByaW50aygiJTJ4ICIscmVhZF9uaWNfYnl0ZShkZXYsbikpOworCX0KK2xlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjcGFnZSAzIyMjIyMjIyMjIyMjIyMjIyMjXG4gIik7CisJZm9yKG49MDtuPD1tYXg7KQorCXsKKwkJLy9wcmludGsoICJcbkQ6ICUyeD4gIiwgbik7CisJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbkQ6ICAlMnggPiAiLG4pOworCisJCWZvcihpPTA7aTwxNiAmJiBuPD1tYXg7aSsrLG4rKykKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIiUyeCAiLHJlYWRfbmljX2J5dGUoZGV2LDB4MzAwfG4pKTsKKworCQkvLyAgICAgIHByaW50aygiJTJ4ICIscmVhZF9uaWNfYnl0ZShkZXYsbikpOworCX0KKworCisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCJcbiIpOworCSplb2YgPSAxOworCXJldHVybiBsZW47CisKK30KKworCisKKworCitzdGF0aWMgaW50IHByb2NfZ2V0X3N0YXRzX3R4KGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKKwkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWludCBsZW4gPSAwOworCisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkiVFggVkkgcHJpb3JpdHkgb2sgaW50OiAlbHVcbiIKKwkJIlRYIFZJIHByaW9yaXR5IGVycm9yIGludDogJWx1XG4iCisJCSJUWCBWTyBwcmlvcml0eSBvayBpbnQ6ICVsdVxuIgorCQkiVFggVk8gcHJpb3JpdHkgZXJyb3IgaW50OiAlbHVcbiIKKwkJIlRYIEJFIHByaW9yaXR5IG9rIGludDogJWx1XG4iCisJCSJUWCBCRSBwcmlvcml0eSBlcnJvciBpbnQ6ICVsdVxuIgorCQkiVFggQksgcHJpb3JpdHkgb2sgaW50OiAlbHVcbiIKKwkJIlRYIEJLIHByaW9yaXR5IGVycm9yIGludDogJWx1XG4iCisJCSJUWCBNQU5BR0UgcHJpb3JpdHkgb2sgaW50OiAlbHVcbiIKKwkJIlRYIE1BTkFHRSBwcmlvcml0eSBlcnJvciBpbnQ6ICVsdVxuIgorCQkiVFggQkVBQ09OIHByaW9yaXR5IG9rIGludDogJWx1XG4iCisJCSJUWCBCRUFDT04gcHJpb3JpdHkgZXJyb3IgaW50OiAlbHVcbiIKKy8vCQkiVFggaGlnaCBwcmlvcml0eSBvayBpbnQ6ICVsdVxuIgorLy8JCSJUWCBoaWdoIHByaW9yaXR5IGZhaWxlZCBlcnJvciBpbnQ6ICVsdVxuIgorCQkiVFggcXVldWUgcmVzdW1lOiAlbHVcbiIKKwkJIlRYIHF1ZXVlIHN0b3BwZWQ/OiAlZFxuIgorCQkiVFggZmlmbyBvdmVyZmxvdzogJWx1XG4iCisvLwkJIlRYIGJlYWNvbjogJWx1XG4iCisJCSJUWCBWSSBxdWV1ZTogJWRcbiIKKwkJIlRYIFZPIHF1ZXVlOiAlZFxuIgorCQkiVFggQkUgcXVldWU6ICVkXG4iCisJCSJUWCBCSyBxdWV1ZTogJWRcbiIKKy8vCQkiVFggSFcgcXVldWU6ICVkXG4iCisJCSJUWCBWSSBkcm9wcGVkOiAlbHVcbiIKKwkJIlRYIFZPIGRyb3BwZWQ6ICVsdVxuIgorCQkiVFggQkUgZHJvcHBlZDogJWx1XG4iCisJCSJUWCBCSyBkcm9wcGVkOiAlbHVcbiIKKwkJIlRYIHRvdGFsIGRhdGEgcGFja2V0cyAlbHVcbiIsCisvLwkJIlRYIGJlYWNvbiBhYm9ydGVkOiAlbHVcbiIsCisJCXByaXYtPnN0YXRzLnR4dmlva2ludCwKKwkJcHJpdi0+c3RhdHMudHh2aWVyciwKKwkJcHJpdi0+c3RhdHMudHh2b29raW50LAorCQlwcml2LT5zdGF0cy50eHZvZXJyLAorCQlwcml2LT5zdGF0cy50eGJlb2tpbnQsCisJCXByaXYtPnN0YXRzLnR4YmVlcnIsCisJCXByaXYtPnN0YXRzLnR4Ymtva2ludCwKKwkJcHJpdi0+c3RhdHMudHhia2VyciwKKwkJcHJpdi0+c3RhdHMudHhtYW5hZ2Vva2ludCwKKwkJcHJpdi0+c3RhdHMudHhtYW5hZ2VlcnIsCisJCXByaXYtPnN0YXRzLnR4YmVhY29ub2tpbnQsCisJCXByaXYtPnN0YXRzLnR4YmVhY29uZXJyLAorLy8JCXByaXYtPnN0YXRzLnR4aHBva2ludCwKKy8vCQlwcml2LT5zdGF0cy50eGhwZXJyLAorCQlwcml2LT5zdGF0cy50eHJlc3VtZWQsCisJCW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSwKKwkJcHJpdi0+c3RhdHMudHhvdmVyZmxvdywKKy8vCQlwcml2LT5zdGF0cy50eGJlYWNvbiwKKwkJYXRvbWljX3JlYWQoJihwcml2LT50eF9wZW5kaW5nW1ZJX1BSSU9SSVRZXSkpLAorCQlhdG9taWNfcmVhZCgmKHByaXYtPnR4X3BlbmRpbmdbVk9fUFJJT1JJVFldKSksCisJCWF0b21pY19yZWFkKCYocHJpdi0+dHhfcGVuZGluZ1tCRV9QUklPUklUWV0pKSwKKwkJYXRvbWljX3JlYWQoJihwcml2LT50eF9wZW5kaW5nW0JLX1BSSU9SSVRZXSkpLAorLy8JCXJlYWRfbmljX2J5dGUoZGV2LCBUWEZJRk9DT1VOVCksCisJCXByaXYtPnN0YXRzLnR4dmlkcm9wLAorCQlwcml2LT5zdGF0cy50eHZvZHJvcCwKKwkJcHJpdi0+c3RhdHMudHhiZWRyb3AsCisJCXByaXYtPnN0YXRzLnR4Ymtkcm9wLAorCQlwcml2LT5zdGF0cy50eGRhdGFwa3QKKy8vCQlwcml2LT5zdGF0cy50eGJlYWNvbmVycgorCQkpOworCisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKK30KKworCisKK3N0YXRpYyBpbnQgcHJvY19nZXRfc3RhdHNfcngoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJaW50IGxlbiA9IDA7CisKKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCSJSWCBwYWNrZXRzOiAlbHVcbiIKKwkJIlJYIHVyYiBzdGF0dXMgZXJyb3I6ICVsdVxuIgorCQkiUlggaW52YWxpZCB1cmIgZXJyb3I6ICVsdVxuIiwKKwkJcHJpdi0+c3RhdHMucnhva3RvdGFsLAorCQlwcml2LT5zdGF0cy5yeHN0YXRlcnIsCisJCXByaXYtPnN0YXRzLnJ4dXJiZXJyKTsKKworCSplb2YgPSAxOworCXJldHVybiBsZW47Cit9Cit2b2lkIHJ0bDgxOTJfcHJvY19tb2R1bGVfaW5pdCh2b2lkKQoreworCVJUX1RSQUNFKENPTVBfSU5JVCwgIkluaXRpYWxpemluZyBwcm9jIGZpbGVzeXN0ZW0iKTsKKwlydGw4MTkyX3Byb2M9Y3JlYXRlX3Byb2NfZW50cnkoUlRMODE5eFVfTU9EVUxFX05BTUUsIFNfSUZESVIsIGluaXRfbmV0LnByb2NfbmV0KTsKK30KKworCit2b2lkIHJ0bDgxOTJfcHJvY19tb2R1bGVfcmVtb3ZlKHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoUlRMODE5eFVfTU9EVUxFX05BTUUsIGluaXRfbmV0LnByb2NfbmV0KTsKK30KKworCit2b2lkIHJ0bDgxOTJfcHJvY19yZW1vdmVfb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisKKwlpZiAocHJpdi0+ZGlyX2RldikgeworCS8vCXJlbW92ZV9wcm9jX2VudHJ5KCJzdGF0cy1odyIsIHByaXYtPmRpcl9kZXYpOworCQlyZW1vdmVfcHJvY19lbnRyeSgic3RhdHMtdHgiLCBwcml2LT5kaXJfZGV2KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInN0YXRzLXJ4IiwgcHJpdi0+ZGlyX2Rldik7CisJLy8JcmVtb3ZlX3Byb2NfZW50cnkoInN0YXRzLWllZWUiLCBwcml2LT5kaXJfZGV2KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInN0YXRzLWFwIiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJyZWdpc3RlcnMiLCBwcml2LT5kaXJfZGV2KTsKKwkvLwlyZW1vdmVfcHJvY19lbnRyeSgiY2NrLXJlZ2lzdGVycyIscHJpdi0+ZGlyX2Rldik7CisJLy8JcmVtb3ZlX3Byb2NfZW50cnkoIm9mZG0tcmVnaXN0ZXJzIixwcml2LT5kaXJfZGV2KTsKKwkJLy9yZW1vdmVfcHJvY19lbnRyeShkZXYtPm5hbWUsIHJ0bDgxOTJfcHJvYyk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJ3bGFuMCIsIHJ0bDgxOTJfcHJvYyk7CisJCXByaXYtPmRpcl9kZXYgPSBOVUxMOworCX0KK30KKworCit2b2lkIHJ0bDgxOTJfcHJvY19pbml0X29uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJcHJpdi0+ZGlyX2RldiA9IGNyZWF0ZV9wcm9jX2VudHJ5KGRldi0+bmFtZSwKKwkJCQkJICBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR08sCisJCQkJCSAgcnRsODE5Ml9wcm9jKTsKKwlpZiAoIXByaXYtPmRpcl9kZXYpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSAvcHJvYy9uZXQvcnRsODE5Mi8lc1xuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdHMtcngiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9zdGF0c19yeCwgZGV2KTsKKworCWlmICghZSkgeworCQlSVF9UUkFDRShDT01QX0VSUiwiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxOTIvJXMvc3RhdHMtcnhcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJfQorCisKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdHMtdHgiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9zdGF0c190eCwgZGV2KTsKKworCWlmICghZSkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTkyLyVzL3N0YXRzLXR4XG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCX0KKworCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzdGF0cy1hcCIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3N0YXRzX2FwLCBkZXYpOworCisJaWYgKCFlKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxOTIvJXMvc3RhdHMtYXBcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJfQorCisJZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInJlZ2lzdGVycyIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3JlZ2lzdGVycywgZGV2KTsKKwlpZiAoIWUpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCisJCSAgICAgICIvcHJvYy9uZXQvcnRsODE5Mi8lcy9yZWdpc3RlcnNcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTUlTQyBTVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB0aGlzIGlzIG9ubHkgZm9yIGRlYnVnZ2luZyAqLwordm9pZCBwcmludF9idWZmZXIodTMyICpidWZmZXIsIGludCBsZW4pCit7CisJaW50IGk7CisJdTggKmJ1ZiA9KHU4KilidWZmZXI7CisKKwlwcmludGsoIkFTQ0lJIEJVRkZFUiBEVU1QIChsZW46ICV4KTpcbiIsbGVuKTsKKworCWZvcihpPTA7aTxsZW47aSsrKQorCQlwcmludGsoIiVjIixidWZbaV0pOworCisJcHJpbnRrKCJcbkJJTkFSWSBCVUZGRVIgRFVNUCAobGVuOiAleCk6XG4iLGxlbik7CisKKwlmb3IoaT0wO2k8bGVuO2krKykKKwkJcHJpbnRrKCIleCIsYnVmW2ldKTsKKworCXByaW50aygiXG4iKTsKK30KKworLy9zaG9ydCBjaGVja19uaWNfZW5vdWdoX2Rlc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgcHJpb3JpdHlfdCBwcmlvcml0eSkKK3Nob3J0IGNoZWNrX25pY19lbm91Z2hfZGVzYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCBxdWV1ZV9pbmRleCkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHVzZWQgPSBhdG9taWNfcmVhZCgmcHJpdi0+dHhfcGVuZGluZ1txdWV1ZV9pbmRleF0pOworCisJcmV0dXJuICh1c2VkIDwgTUFYX1RYX1VSQik7Cit9CisKK3ZvaWQgdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL3J0bDgxOTJfY29tbWl0KGRldik7CisKKwlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93cSk7CisJLy9ETUVTRygiVFhUSU1FT1VUIik7Cit9CisKKworLyogdGhpcyBpcyBvbmx5IGZvciBkZWJ1ZyAqLwordm9pZCBkdW1wX2Vwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJZm9yKGk9MDsgaTw2MzsgaSsrKQorCQlSVF9UUkFDRShDT01QX0VQUk9NLCAiRUVQUk9NIGFkZHIgJXggOiAleCIsIGksIGVwcm9tX3JlYWQoZGV2LGkpKTsKK30KKworLyogdGhpcyBpcyBvbmx5IGZvciBkZWJ1ZyAqLwordm9pZCBydGw4MTkyX2R1bXBfcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJaW50IG47CisJaW50IG1heD0weDFmZjsKKworCVJUX1RSQUNFKENPTVBfUEhZLCAiRHVtcGluZyBOSUMgcmVnaXN0ZXIgbWFwIik7CisKKwlmb3Iobj0wO248PW1heDspCisJeworCQlwcmludGsoICJcbkQ6ICUyeD4gIiwgbik7CisJCWZvcihpPTA7aTwxNiAmJiBuPD1tYXg7aSsrLG4rKykKKwkJCXByaW50aygiJTJ4ICIscmVhZF9uaWNfYnl0ZShkZXYsbikpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1IVyBTVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwordm9pZCBydGw4MTkyX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsaW50IG1vZGUpCit7CisJdTggZWNtZDsKKwllY21kPXJlYWRfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQpOworCWVjbWQ9ZWNtZCAmfiBFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfTUFTSzsKKwllY21kPWVjbWQgfCAobW9kZTw8RVBST01fQ01EX09QRVJBVElOR19NT0RFX1NISUZUKTsKKwllY21kPWVjbWQgJn4gKDE8PEVQUk9NX0NTX1NISUZUKTsKKwllY21kPWVjbWQgJn4gKDE8PEVQUk9NX0NLX1NISUZUKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwgZWNtZCk7Cit9CisKKwordm9pZCBydGw4MTkyX3VwZGF0ZV9tc3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggbXNyOworCisJbXNyICA9IHJlYWRfbmljX2J5dGUoZGV2LCBNU1IpOworCW1zciAmPSB+IE1TUl9MSU5LX01BU0s7CisKKwkvKiBkbyBub3QgY2hhbmdlIGluIGxpbmtfc3RhdGUgIT0gV0xBTl9MSU5LX0FTU09DSUFURUQuCisJICogbXNyIG11c3QgYmUgdXBkYXRlZCBpZiB0aGUgc3RhdGUgaXMgQVNTT0NJQVRJTkcuCisJICogdGhpcyBpcyBpbnRlbnRpb25hbCBhbmQgbWFrZSBzZW5zZSBmb3IgYWQtaG9jIGFuZAorCSAqIG1hc3RlciAoc2VlIHRoZSBjcmVhdGUgQlNTL0lCU1MgZnVuYykKKwkgKi8KKwlpZiAocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKXsKKworCQlpZiAocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpCisJCQltc3IgfD0gKE1TUl9MSU5LX01BTkFHRUQ8PE1TUl9MSU5LX1NISUZUKTsKKwkJZWxzZSBpZiAocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJCQltc3IgfD0gKE1TUl9MSU5LX0FESE9DPDxNU1JfTElOS19TSElGVCk7CisJCWVsc2UgaWYgKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikKKwkJCW1zciB8PSAoTVNSX0xJTktfTUFTVEVSPDxNU1JfTElOS19TSElGVCk7CisKKwl9ZWxzZQorCQltc3IgfD0gKE1TUl9MSU5LX05PTkU8PE1TUl9MSU5LX1NISUZUKTsKKworCXdyaXRlX25pY19ieXRlKGRldiwgTVNSLCBtc3IpOworfQorCit2b2lkIHJ0bDgxOTJfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisvLwl1MzIgdHg7CisJUlRfVFJBQ0UoQ09NUF9DSCwgIj09PT09PiVzKCk9PT09Y2g6JWRcbiIsIF9fRlVOQ1RJT05fXywgY2gpOworCXByaXYtPmNoYW49Y2g7CisKKwkvKiB0aGlzIGhhY2sgc2hvdWxkIGF2b2lkIGZyYW1lIFRYIGR1cmluZyBjaGFubmVsIHNldHRpbmcqLworCisKKy8vCXR4ID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX0NPTkYpOworLy8JdHggJj0gflRYX0xPT1BCQUNLX01BU0s7CisKKyNpZm5kZWYgTE9PUF9URVNUCisvLwl3cml0ZV9uaWNfZHdvcmQoZGV2LFRYX0NPTkYsIHR4IHwoIFRYX0xPT1BCQUNLX01BQzw8VFhfTE9PUEJBQ0tfU0hJRlQpKTsKKworCS8vbmVlZCB0byBpbXBsZW1lbnQgcmYgc2V0IGNoYW5uZWwgaGVyZSBXQgorCisJaWYgKHByaXYtPnJmX3NldF9jaGFuKQorCXByaXYtPnJmX3NldF9jaGFuKGRldixwcml2LT5jaGFuKTsKKwltZGVsYXkoMTApOworLy8Jd3JpdGVfbmljX2R3b3JkKGRldixUWF9DT05GLHR4IHwgKFRYX0xPT1BCQUNLX05PTkU8PFRYX0xPT1BCQUNLX1NISUZUKSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgcnRsODE5Ml9yeF9pc3Ioc3RydWN0IHVyYiAqdXJiKTsKKy8vc3RhdGljIHZvaWQgcnRsODE5Ml9yeF9pc3Ioc3RydWN0IHVyYiAqcnhfdXJiKTsKKwordTMyIGdldF9yeHBhY2tldF9zaGlmdGJ5dGVzXzgxOXh1c2Ioc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcHN0YXRzKQoreworCisjaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKKwlpZiAocHN0YXRzLT5iaXNyeGFnZ3JzdWJmcmFtZSkKKwkJcmV0dXJuIChzaXplb2YocnhfZGVzY184MTl4X3VzYikgKyBwc3RhdHMtPlJ4RHJ2SW5mb1NpemUKKwkJCSsgcHN0YXRzLT5SeEJ1ZlNoaWZ0ICsgOCk7CisJZWxzZQorI2VuZGlmCisJCXJldHVybiAoc2l6ZW9mKHJ4X2Rlc2NfODE5eF91c2IpICsgcHN0YXRzLT5SeERydkluZm9TaXplCisJCQkJKyBwc3RhdHMtPlJ4QnVmU2hpZnQpOworCit9CitzdGF0aWMgaW50IHJ0bDgxOTJfcnhfaW5pdGlhdGUoc3RydWN0IG5ldF9kZXZpY2UqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdXJiICplbnRyeTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBydGw4MTkyX3J4X2luZm8gKmluZm87CisKKwkvKiBub21hbCBwYWNrZXQgcnggcHJvY2VkdXJlICovCisJd2hpbGUgKHNrYl9xdWV1ZV9sZW4oJnByaXYtPnJ4X3F1ZXVlKSA8IE1BWF9SWF9VUkIpIHsKKwkJc2tiID0gX19kZXZfYWxsb2Nfc2tiKFJYX1VSQl9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFza2IpCisJCQlicmVhazsKKwkJZW50cnkgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCQlpZiAoIWVudHJ5KSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCWJyZWFrOworCQl9CisvLwkJcHJpbnRrKCJub21hbCBwYWNrZXQgSU4gcmVxdWVzdCFcbiIpOworCQl1c2JfZmlsbF9idWxrX3VyYihlbnRyeSwgcHJpdi0+dWRldiwKKwkJCQkgIHVzYl9yY3ZidWxrcGlwZShwcml2LT51ZGV2LCAzKSwgc2tiX3RhaWxfcG9pbnRlcihza2IpLAorCQkJCSAgUlhfVVJCX1NJWkUsIHJ0bDgxOTJfcnhfaXNyLCBza2IpOworCQlpbmZvID0gKHN0cnVjdCBydGw4MTkyX3J4X2luZm8gKikgc2tiLT5jYjsKKwkJaW5mby0+dXJiID0gZW50cnk7CisJCWluZm8tPmRldiA9IGRldjsKKwkJaW5mby0+b3V0X3BpcGUgPSAzOyAvL2Rlbm90ZSByeCBub3JtYWwgcGFja2V0IHF1ZXVlCisJCXNrYl9xdWV1ZV90YWlsKCZwcml2LT5yeF9xdWV1ZSwgc2tiKTsKKwkJdXNiX3N1Ym1pdF91cmIoZW50cnksIEdGUF9LRVJORUwpOworCX0KKworCS8qIGNvbW1hbmQgcGFja2V0IHJ4IHByb2NlZHVyZSAqLworCXdoaWxlIChza2JfcXVldWVfbGVuKCZwcml2LT5yeF9xdWV1ZSkgPCBNQVhfUlhfVVJCICsgMykgeworLy8JCXByaW50aygiY29tbWFuZCBwYWNrZXQgSU4gcmVxdWVzdCFcbiIpOworCQlza2IgPSBfX2Rldl9hbGxvY19za2IoUlhfVVJCX1NJWkUgLEdGUF9LRVJORUwpOworCQlpZiAoIXNrYikKKwkJCWJyZWFrOworCQllbnRyeSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJCWlmICghZW50cnkpIHsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJYnJlYWs7CisJCX0KKwkJdXNiX2ZpbGxfYnVsa191cmIoZW50cnksIHByaXYtPnVkZXYsCisJCQkJICB1c2JfcmN2YnVsa3BpcGUocHJpdi0+dWRldiwgOSksIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKKwkJCQkgIFJYX1VSQl9TSVpFLCBydGw4MTkyX3J4X2lzciwgc2tiKTsKKwkJaW5mbyA9IChzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvICopIHNrYi0+Y2I7CisJCWluZm8tPnVyYiA9IGVudHJ5OworCQlpbmZvLT5kZXYgPSBkZXY7CisJCSAgIGluZm8tPm91dF9waXBlID0gOTsgLy9kZW5vdGUgcnggY21kIHBhY2tldCBxdWV1ZQorCQlza2JfcXVldWVfdGFpbCgmcHJpdi0+cnhfcXVldWUsIHNrYik7CisJCXVzYl9zdWJtaXRfdXJiKGVudHJ5LCBHRlBfS0VSTkVMKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBydGw4MTkyX3NldF9yeGNvbmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIHJ4Y29uZjsKKworCXJ4Y29uZj1yZWFkX25pY19kd29yZChkZXYsUkNSKTsKKwlyeGNvbmYgPSByeGNvbmYgJn4gTUFDX0ZJTFRFUl9NQVNLOworCXJ4Y29uZiA9IHJ4Y29uZiB8IFJDUl9BTUY7CisJcnhjb25mID0gcnhjb25mIHwgUkNSX0FERjsKKwlyeGNvbmYgPSByeGNvbmYgfCBSQ1JfQUI7CisJcnhjb25mID0gcnhjb25mIHwgUkNSX0FNOworCS8vcnhjb25mID0gcnhjb25mIHwgUkNSX0FDRjsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHtETUVTRyAoIk5JQyBpbiBwcm9taXNjIG1vZGUiKTt9CisKKwlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SIHx8IFwKKwkgICBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpeworCQlyeGNvbmYgPSByeGNvbmYgfCBSQ1JfQUFQOworCX0gLyplbHNlIGlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUil7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfQUxMTUFDX0ZSQU1FX1NISUZUKTsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PFJYX0NIRUNLX0JTU0lEX1NISUZUKTsKKwl9Ki9lbHNleworCQlyeGNvbmYgPSByeGNvbmYgfCBSQ1JfQVBNOworCQlyeGNvbmYgPSByeGNvbmYgfCBSQ1JfQ0JTU0lEOworCX0KKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUil7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8IFJDUl9BSUNWOworCQlyeGNvbmYgPSByeGNvbmYgfCBSQ1JfQVBXUk1HVDsKKwl9CisKKwlpZiggcHJpdi0+Y3JjbW9uID09IDEgJiYgcHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwkJcnhjb25mID0gcnhjb25mIHwgUkNSX0FDUkMzMjsKKworCisJcnhjb25mID0gcnhjb25mICZ+IFJYX0ZJRk9fVEhSRVNIT0xEX01BU0s7CisJcnhjb25mID0gcnhjb25mIHwgKFJYX0ZJRk9fVEhSRVNIT0xEX05PTkU8PFJYX0ZJRk9fVEhSRVNIT0xEX1NISUZUKTsKKwlyeGNvbmYgPSByeGNvbmYgJn4gTUFYX1JYX0RNQV9NQVNLOworCXJ4Y29uZiA9IHJ4Y29uZiB8ICgodTMyKTc8PFJDUl9NWERNQV9PRkZTRVQpOworCisvLwlyeGNvbmYgPSByeGNvbmYgfCAoMTw8UlhfQVVUT1JFU0VUUEhZX1NISUZUKTsKKwlyeGNvbmYgPSByeGNvbmYgfCBSQ1JfT05MWUVSTFBLVDsKKworLy8Jcnhjb25mID0gcnhjb25mICZ+IFJDUl9DU19NQVNLOworLy8Jcnhjb25mID0gcnhjb25mIHwgKDE8PFJDUl9DU19TSElGVCk7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSQ1IsIHJ4Y29uZik7CisKKwkjaWZkZWYgREVCVUdfUlgKKwlETUVTRygicnhjb25mOiAleCAleCIscnhjb25mICxyZWFkX25pY19kd29yZChkZXYsUkNSKSk7CisJI2VuZGlmCit9CisvL3dhaXQgdG8gYmUgcmVtb3ZlZAordm9pZCBydGw4MTkyX3J4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8vdTggY21kOworCisJLy9zdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlydGw4MTkyX3J4X2luaXRpYXRlKGRldik7CisKKy8vCXJ0bDgxOTJfc2V0X3J4Y29uZihkZXYpOworfQorCisKK3ZvaWQgcnRsODE5Ml90eF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKK30KKworCisKK3ZvaWQgcnRsODE5Ml9ydHhfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4IGNtZDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvICppbmZvOworCisJY21kPXJlYWRfbmljX2J5dGUoZGV2LENNRFIpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ01EUiwgY21kICZ+IFwKKwkJKENSX1RFfENSX1JFKSk7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMTApOworCisJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZwcml2LT5yeF9xdWV1ZSkpKSB7CisJCWluZm8gPSAoc3RydWN0IHJ0bDgxOTJfcnhfaW5mbyAqKSBza2ItPmNiOworCQlpZiAoIWluZm8tPnVyYikKKwkJCWNvbnRpbnVlOworCisJCXVzYl9raWxsX3VyYihpbmZvLT51cmIpOworCQlrZnJlZV9za2Ioc2tiKTsKKwl9CisKKwlpZiAoc2tiX3F1ZXVlX2xlbigmcHJpdi0+c2tiX3F1ZXVlKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJza2JfcXVldWUgbm90IGVtcHR5XG4iKTsKKwl9CisKKwlza2JfcXVldWVfcHVyZ2UoJnByaXYtPnNrYl9xdWV1ZSk7CisJcmV0dXJuOworfQorCisKK2ludCBhbGxvY190eF9iZWFjb25fZGVzY19yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCkKK3sKKwlyZXR1cm4gMDsKK30KKworaW5saW5lIHUxNiBpZWVlcmF0ZTJydGxyYXRlKGludCByYXRlKQoreworCXN3aXRjaChyYXRlKXsKKwljYXNlIDEwOgorCXJldHVybiAwOworCWNhc2UgMjA6CisJcmV0dXJuIDE7CisJY2FzZSA1NToKKwlyZXR1cm4gMjsKKwljYXNlIDExMDoKKwlyZXR1cm4gMzsKKwljYXNlIDYwOgorCXJldHVybiA0OworCWNhc2UgOTA6CisJcmV0dXJuIDU7CisJY2FzZSAxMjA6CisJcmV0dXJuIDY7CisJY2FzZSAxODA6CisJcmV0dXJuIDc7CisJY2FzZSAyNDA6CisJcmV0dXJuIDg7CisJY2FzZSAzNjA6CisJcmV0dXJuIDk7CisJY2FzZSA0ODA6CisJcmV0dXJuIDEwOworCWNhc2UgNTQwOgorCXJldHVybiAxMTsKKwlkZWZhdWx0OgorCXJldHVybiAzOworCisJfQorfQorc3RhdGljIHUxNiBydGxfcmF0ZVtdID0gezEwLDIwLDU1LDExMCw2MCw5MCwxMjAsMTgwLDI0MCwzNjAsNDgwLDU0MH07CitpbmxpbmUgdTE2IHJ0bDgxOTJfcmF0ZTJyYXRlKHNob3J0IHJhdGUpCit7CisJaWYgKHJhdGUgPjExKSByZXR1cm4gMDsKKwlyZXR1cm4gcnRsX3JhdGVbcmF0ZV07Cit9CisKKworLyogVGhlIHByb3R5cGUgb2YgcnhfaXNyIGhhcyBjaGFuZ2VkIHNpbmNlIG9uZSB2ZXJpb24gb2YgTGludXggS2VybmVsICovCitzdGF0aWMgdm9pZCBydGw4MTkyX3J4X2lzcihzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHJ0bDgxOTJfcnhfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvICopc2tiLT5jYjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaW5mby0+ZGV2OworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgb3V0X3BpcGUgPSBpbmZvLT5vdXRfcGlwZTsKKwlpbnQgZXJyOworCWlmKCFwcml2LT51cCkKKwkJcmV0dXJuOworCWlmICh1bmxpa2VseSh1cmItPnN0YXR1cykpIHsKKwkJaW5mby0+dXJiID0gTlVMTDsKKwkJcHJpdi0+c3RhdHMucnhzdGF0ZXJyKys7CisJCXByaXYtPmllZWU4MDIxMS0+c3RhdHMucnhfZXJyb3JzKys7CisJCXVzYl9mcmVlX3VyYih1cmIpOworCS8vCXByaW50aygiJXMoKTpyeCBzdGF0dXMgZXJyXG4iLF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJc2tiX3VubGluayhza2IsICZwcml2LT5yeF9xdWV1ZSk7CisJc2tiX3B1dChza2IsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisKKwlza2JfcXVldWVfdGFpbCgmcHJpdi0+c2tiX3F1ZXVlLCBza2IpOworCXRhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV9yeF90YXNrbGV0KTsKKworCXNrYiA9IGRldl9hbGxvY19za2IoUlhfVVJCX1NJWkUpOworCWlmICh1bmxpa2VseSghc2tiKSkgeworCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJcHJpbnRrKCIlcygpOmNhbix0IGFsbG9jIHNrYlxuIixfX0ZVTkNUSU9OX18pOworCQkvKiBUT0RPIGNoZWNrIHJ4IHF1ZXVlIGxlbmd0aCBhbmQgcmVmaWxsICpzb21ld2hlcmUqICovCisJCXJldHVybjsKKwl9CisKKwl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHByaXYtPnVkZXYsCisJCQl1c2JfcmN2YnVsa3BpcGUocHJpdi0+dWRldiwgb3V0X3BpcGUpLCBza2JfdGFpbF9wb2ludGVyKHNrYiksCisJCQlSWF9VUkJfU0laRSwgcnRsODE5Ml9yeF9pc3IsIHNrYik7CisKKwlpbmZvID0gKHN0cnVjdCBydGw4MTkyX3J4X2luZm8gKikgc2tiLT5jYjsKKwlpbmZvLT51cmIgPSB1cmI7CisJaW5mby0+ZGV2ID0gZGV2OworCWluZm8tPm91dF9waXBlID0gb3V0X3BpcGU7CisKKwl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKKwl1cmItPmNvbnRleHQgPSBza2I7CisJc2tiX3F1ZXVlX3RhaWwoJnByaXYtPnJ4X3F1ZXVlLCBza2IpOworCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYoZXJyICYmIGVyciAhPSBFUEVSTSkKKwkJcHJpbnRrKCJjYW4gbm90IHN1Ym1pdCByeHVyYiwgZXJyIGlzICV4LFVSQiBzdGF0dXMgaXMgJXhcbiIsZXJyLHVyYi0+c3RhdHVzKTsKK30KKwordTMyCitydGw4MTl4dXNiX3J4X2NvbW1hbmRfcGFja2V0KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcHN0YXRzCisJKQoreworCXUzMglzdGF0dXM7CisKKwkvL1JUX1RSQUNFKENPTVBfUkVDViwgREJHX1RSQUNFLCAoIi0tLT4gUnhDb21tYW5kUGFja2V0SGFuZGxlODE5eFVzYigpXG4iKSk7CisKKwlzdGF0dXMgPSBjbXBrX21lc3NhZ2VfaGFuZGxlX3J4KGRldiwgcHN0YXRzKTsKKwlpZiAoc3RhdHVzKQorCXsKKwkJRE1FU0coInJ4Y29tbWFuZHBhY2tldGhhbmRsZTgxOXh1c2I6IEl0IGlzIGEgY29tbWFuZCBwYWNrZXRcbiIpOworCX0KKwllbHNlCisJeworCQkvL1JUX1RSQUNFKENPTVBfUkVDViwgREJHX1RSQUNFLCAoIlJ4Q29tbWFuZFBhY2tldEhhbmRsZTgxOXhVc2I6IEl0IGlzIG5vdCBhIGNvbW1hbmQgcGFja2V0XG4iKSk7CisJfQorCisJLy9SVF9UUkFDRShDT01QX1JFQ1YsIERCR19UUkFDRSwgKCI8LS0tIFJ4Q29tbWFuZFBhY2tldEhhbmRsZTgxOXhVc2IoKVxuIikpOworCXJldHVybiBzdGF0dXM7Cit9CisKKwordm9pZCBydGw4MTkyX2RhdGFfaGFyZF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLy9GSVhNRSAhIQorfQorCisKK3ZvaWQgcnRsODE5Ml9kYXRhX2hhcmRfcmVzdW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLy8gRklYTUUgISEKK30KKworLyogdGhpcyBmdW5jdGlvbiBUWCBkYXRhIGZyYW1lcyB3aGVuIHRoZSBpZWVlODAyMTEgc3RhY2sgcmVxdWlyZXMgdGhpcy4KKyAqIEl0IGNoZWNrcyBhbHNvIGlmIHdlIG5lZWQgdG8gc3RvcCB0aGUgaWVlZSB0eCBxdWV1ZSwgZXZlbnR1YWxseSBkbyBpdAorICovCit2b2lkIHJ0bDgxOTJfaGFyZF9kYXRhX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJhdGUpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJdTggcXVldWVfaW5kZXggPSB0Y2JfZGVzYy0+cXVldWVfaW5kZXg7CisKKwkvKiBzaGFsbCBub3QgYmUgcmVmZXJyZWQgYnkgY29tbWFuZCBwYWNrZXQgKi8KKwlhc3NlcnQocXVldWVfaW5kZXggIT0gVFhDTURfUVVFVUUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCisJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopKHNrYi0+Y2IpLCZkZXYsc2l6ZW9mKGRldikpOworLy8JdGNiX2Rlc2MtPlJBVFJJbmRleCA9IDc7CisvLwl0Y2JfZGVzYy0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayA9IDE7CisvLwl0Y2JfZGVzYy0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlID0gMTsKKwl0Y2JfZGVzYy0+YlR4RW5hYmxlRndDYWxjRHVyID0gMTsKKwlza2JfcHVzaChza2IsIHByaXYtPmllZWU4MDIxMS0+dHhfaGVhZHJvb20pOworCXJldCA9IHJ0bDgxOTJfdHgoZGV2LCBza2IpOworCisJLy9wcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X2J5dGVzKz0oc2tiLT5sZW4gLSBwcml2LT5pZWVlODAyMTEtPnR4X2hlYWRyb29tKTsKKwkvL3ByaXYtPmllZWU4MDIxMS0+c3RhdHMudHhfcGFja2V0cysrOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKKy8vCXJldHVybiByZXQ7CisJcmV0dXJuOworfQorCisvKiBUaGlzIGlzIGEgcm91Z2ggYXR0ZW1wdCB0byBUWCBhIGZyYW1lCisgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgaWVlZSA4MDIxMSBzdGFjayB0byBUWCBtYW5hZ2VtZW50IGZyYW1lcy4KKyAqIElmIHRoZSByaW5nIGlzIGZ1bGwgcGFja2V0IGFyZSBkcm9wcGVkIChmb3IgZGF0YSBmcmFtZSB0aGUgcXVldWUKKyAqIGlzIHN0b3BwZWQgYmVmb3JlIHRoaXMgY2FuIGhhcHBlbikuCisgKi8KK2ludCBydGw4MTkyX2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJdTggcXVldWVfaW5kZXggPSB0Y2JfZGVzYy0+cXVldWVfaW5kZXg7CisKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKKworCW1lbWNweSgodW5zaWduZWQgY2hhciAqKShza2ItPmNiKSwmZGV2LHNpemVvZihkZXYpKTsKKwlpZihxdWV1ZV9pbmRleCA9PSBUWENNRF9RVUVVRSkgeworCQlza2JfcHVzaChza2IsIFVTQl9IV0RFU0NfSEVBREVSX0xFTik7CisJCXJ0bDgxOXhVX3R4X2NtZChkZXYsIHNrYik7CisJCXJldCA9IDE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCXNrYl9wdXNoKHNrYiwgcHJpdi0+aWVlZTgwMjExLT50eF9oZWFkcm9vbSk7CisJCXJldCA9IHJ0bDgxOTJfdHgoZGV2LCBza2IpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworCit2b2lkIHJ0bDgxOTJfdHJ5X3dha2VfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByaSk7CisKKyNpZmRlZiBVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQordTE2IERydkFnZ3JfUGFkZGluZ0FkZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXUxNiAgICAgUGFkZGluZ051bSA9ICAyNTYgLSAoKHNrYi0+bGVuICsgVFhfUEFDS0VUX0RSVkFHR1JfU1VCRlJBTUVfU0hJRlRfQllURVMpICUgMjU2KTsKKwlyZXR1cm4gIChQYWRkaW5nTnVtJjB4ZmYpOworfQorCit1OCBNUmF0ZVRvSHdSYXRlODE5MFBjaSh1OCByYXRlKTsKK3U4IFF1ZXJ5SXNTaG9ydCh1OCBUeEhULCB1OCBUeFJhdGUsIGNiX2Rlc2MgKnRjYl9kZXNjKTsKK3U4IE1hcEh3UXVldWVUb0Zpcm13YXJlUXVldWUodTggUXVldWVJRCk7CitzdHJ1Y3Qgc2tfYnVmZiAqRHJ2QWdncl9BZ2dyZWdhdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWVlZTgwMjExX2Rydl9hZ2dfdHhiICpwU2VuZExpc3QpCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwljYl9kZXNjIAkqdGNiX2Rlc2MgPSBOVUxMOworCXU4IAkJaTsKKwl1MzIJCVRvdGFsTGVuZ3RoOworCXN0cnVjdCBza19idWZmCSpza2I7CisJc3RydWN0IHNrX2J1ZmYgICphZ2dfc2tiOworCXR4X2Rlc2NfODE5eF91c2JfYWdncl9zdWJmcmFtZSAqdHhfYWdnX2Rlc2MgPSBOVUxMOworCXR4X2Z3aW5mb184MTl4X3VzYgkgICAgICAgKnR4X2Z3aW5mbyA9IE5VTEw7CisKKwkvLworCS8vIExvY2FsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uLgorCS8vCisJLyogZmlyc3Qgc2tiIGluaXRpYWxpemF0aW9uICovCisJc2tiID0gcFNlbmRMaXN0LT50eF9hZ2dfZnJhbWVzWzBdOworCVRvdGFsTGVuZ3RoID0gc2tiLT5sZW47CisKKwkvKiBHZXQgdGhlIHRvdGFsIGFnZ3JlZ2F0aW9uIGxlbmd0aCBpbmNsdWRpbmcgdGhlIHBhZGRpbmcgc3BhY2UgYW5kCisJICogc3ViIGZyYW1lIGhlYWRlci4KKwkgKi8KKwlmb3IoaSA9IDE7IGkgPCBwU2VuZExpc3QtPm5yX2Rydl9hZ2dfZnJhbWVzOyBpKyspIHsKKwkJVG90YWxMZW5ndGggKz0gRHJ2QWdncl9QYWRkaW5nQWRkKGRldiwgc2tiKTsKKwkJc2tiID0gcFNlbmRMaXN0LT50eF9hZ2dfZnJhbWVzW2ldOworCQlUb3RhbExlbmd0aCArPSAoc2tiLT5sZW4gKyBUWF9QQUNLRVRfRFJWQUdHUl9TVUJGUkFNRV9TSElGVF9CWVRFUyk7CisJfQorCisJLyogYWxsb2NhdGUgc2tiIHRvIGNvbnRhaW4gdGhlIGFnZ3JlZ2F0ZWQgcGFja2V0cyAqLworCWFnZ19za2IgPSBkZXZfYWxsb2Nfc2tiKFRvdGFsTGVuZ3RoICsgaWVlZS0+dHhfaGVhZHJvb20pOworCW1lbXNldChhZ2dfc2tiLT5kYXRhLCAwLCBhZ2dfc2tiLT5sZW4pOworCXNrYl9yZXNlcnZlKGFnZ19za2IsIGllZWUtPnR4X2hlYWRyb29tKTsKKworLy8JUlRfREVCVUdfREFUQShDT01QX1NFTkQsIHNrYi0+Y2IsIHNpemVvZihza2ItPmNiKSk7CisJLyogcmVzZXJ2ZSBpbmZvIGZvciBmaXJzdCBzdWJmcmFtZSBUeCBkZXNjcmlwdG9yIHRvIGJlIHNldCBpbiB0aGUgdHggZnVuY3Rpb24gKi8KKwlza2IgPSBwU2VuZExpc3QtPnR4X2FnZ19mcmFtZXNbMF07CisJdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCXRjYl9kZXNjLT5kcnZfYWdnX2VuYWJsZSA9IDE7CisJdGNiX2Rlc2MtPnBrdF9zaXplID0gc2tiLT5sZW47CisJdGNiX2Rlc2MtPkRydkFnZ3JOdW0gPSBwU2VuZExpc3QtPm5yX2Rydl9hZ2dfZnJhbWVzOworCXByaW50aygiRHJ2QWdnTnVtID0gJWRcbiIsIHRjYl9kZXNjLT5EcnZBZ2dyTnVtKTsKKy8vCVJUX0RFQlVHX0RBVEEoQ09NUF9TRU5ELCBza2ItPmNiLCBzaXplb2Yoc2tiLT5jYikpOworLy8JcHJpbnRrKCI9PT09PT09PT5za2ItPmRhdGEgPT09PT09PiBcbiIpOworLy8JUlRfREVCVUdfREFUQShDT01QX1NFTkQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCW1lbWNweShhZ2dfc2tiLT5jYiwgc2tiLT5jYiwgc2l6ZW9mKHNrYi0+Y2IpKTsKKwltZW1jcHkoc2tiX3B1dChhZ2dfc2tiLHNrYi0+bGVuKSxza2ItPmRhdGEsc2tiLT5sZW4pOworCisJZm9yKGkgPSAxOyBpIDwgcFNlbmRMaXN0LT5ucl9kcnZfYWdnX2ZyYW1lczsgaSsrKSB7CisJCS8qIHB1c2ggdGhlIG5leHQgc3ViIGZyYW1lIHRvIGJlIDI1NiBieXRlIGFsaW5lICovCisJCXNrYl9wdXQoYWdnX3NrYixEcnZBZ2dyX1BhZGRpbmdBZGQoZGV2LHNrYikpOworCisJCS8qIFN1YmZyYW1lIGRydiBUeCBkZXNjcmlwdG9yIGFuZCBmaXJtd2FyZSBpbmZvIHNldHRpbmcgKi8KKwkJc2tiID0gcFNlbmRMaXN0LT50eF9hZ2dfZnJhbWVzW2ldOworCQl0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJCXR4X2FnZ19kZXNjID0gKHR4X2Rlc2NfODE5eF91c2JfYWdncl9zdWJmcmFtZSAqKWFnZ19za2ItPnRhaWw7CisJCXR4X2Z3aW5mbyA9ICh0eF9md2luZm9fODE5eF91c2IgKikoYWdnX3NrYi0+dGFpbCArIHNpemVvZih0eF9kZXNjXzgxOXhfdXNiX2FnZ3Jfc3ViZnJhbWUpKTsKKworCQltZW1zZXQodHhfZndpbmZvLDAsc2l6ZW9mKHR4X2Z3aW5mb184MTl4X3VzYikpOworCQkvKiBEV09SRCAwICovCisJCXR4X2Z3aW5mby0+VHhIVCA9ICh0Y2JfZGVzYy0+ZGF0YV9yYXRlJjB4ODApPzE6MDsKKwkJdHhfZndpbmZvLT5UeFJhdGUgPSBNUmF0ZVRvSHdSYXRlODE5MFBjaSh0Y2JfZGVzYy0+ZGF0YV9yYXRlKTsKKwkJdHhfZndpbmZvLT5FbmFibGVDUFVEdXIgPSB0Y2JfZGVzYy0+YlR4RW5hYmxlRndDYWxjRHVyOworCQl0eF9md2luZm8tPlNob3J0ID0gUXVlcnlJc1Nob3J0KHR4X2Z3aW5mby0+VHhIVCwgdHhfZndpbmZvLT5UeFJhdGUsIHRjYl9kZXNjKTsKKwkJaWYodGNiX2Rlc2MtPmJBTVBEVUVuYWJsZSkgey8vQU1QRFUgZW5hYmxlZAorCQkJdHhfZndpbmZvLT5BbGxvd0FnZ3JlZ2F0aW9uID0gMTsKKwkJCS8qIERXT1JEIDEgKi8KKwkJCXR4X2Z3aW5mby0+UnhNRiA9IHRjYl9kZXNjLT5hbXBkdV9mYWN0b3I7CisJCQl0eF9md2luZm8tPlJ4QU1EID0gdGNiX2Rlc2MtPmFtcGR1X2RlbnNpdHkmMHgwNzsvL2FtcGR1ZGVuc2l0eQorCQl9IGVsc2UgeworCQkJdHhfZndpbmZvLT5BbGxvd0FnZ3JlZ2F0aW9uID0gMDsKKwkJCS8qIERXT1JEIDEgKi8KKwkJCXR4X2Z3aW5mby0+UnhNRiA9IDA7CisJCQl0eF9md2luZm8tPlJ4QU1EID0gMDsKKwkJfQorCisJCS8qIFByb3RlY3Rpb24gbW9kZSByZWxhdGVkICovCisJCXR4X2Z3aW5mby0+UnRzRW5hYmxlID0gKHRjYl9kZXNjLT5iUlRTRW5hYmxlKT8xOjA7CisJCXR4X2Z3aW5mby0+Q3RzRW5hYmxlID0gKHRjYl9kZXNjLT5iQ1RTRW5hYmxlKT8xOjA7CisJCXR4X2Z3aW5mby0+UnRzU1RCQyA9ICh0Y2JfZGVzYy0+YlJUU1NUQkMpPzE6MDsKKwkJdHhfZndpbmZvLT5SdHNIVCA9ICh0Y2JfZGVzYy0+cnRzX3JhdGUmMHg4MCk/MTowOworCQl0eF9md2luZm8tPlJ0c1JhdGUgPSAgTVJhdGVUb0h3UmF0ZTgxOTBQY2koKHU4KXRjYl9kZXNjLT5ydHNfcmF0ZSk7CisJCXR4X2Z3aW5mby0+UnRzU3ViY2FycmllciA9ICh0eF9md2luZm8tPlJ0c0hUPT0wKT8odGNiX2Rlc2MtPlJUU1NDKTowOworCQl0eF9md2luZm8tPlJ0c0JhbmR3aWR0aCA9ICh0eF9md2luZm8tPlJ0c0hUPT0xKT8oKHRjYl9kZXNjLT5iUlRTQlcpPzE6MCk6MDsKKwkJdHhfZndpbmZvLT5SdHNTaG9ydCA9ICh0eF9md2luZm8tPlJ0c0hUPT0wKT8odGNiX2Rlc2MtPmJSVFNVc2VTaG9ydFByZWFtYmxlPzE6MCk6XAorCQkJCSAgICAgICh0Y2JfZGVzYy0+YlJUU1VzZVNob3J0R0k/MTowKTsKKworCQkvKiBTZXQgQmFuZHdpZHRoIGFuZCBzdWItY2hhbm5lbCBzZXR0aW5ncy4gKi8KKwkJaWYocHJpdi0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwKQorCQl7CisJCQlpZih0Y2JfZGVzYy0+YlBhY2tldEJXKSB7CisJCQkJdHhfZndpbmZvLT5UeEJhbmR3aWR0aCA9IDE7CisJCQkJdHhfZndpbmZvLT5UeFN1YkNhcnJpZXIgPSAwOyAgICAvL0J5IFNEMydzIEplcnJ5IHN1Z2dlc3Rpb24sIHVzZSBkdXBsaWNhdGVkIG1vZGUKKwkJCX0gZWxzZSB7CisJCQkJdHhfZndpbmZvLT5UeEJhbmR3aWR0aCA9IDA7CisJCQkJdHhfZndpbmZvLT5UeFN1YkNhcnJpZXIgPSBwcml2LT5uQ3VyNDBNaHpQcmltZVNDOworCQkJfQorCQl9IGVsc2UgeworCQkJdHhfZndpbmZvLT5UeEJhbmR3aWR0aCA9IDA7CisJCQl0eF9md2luZm8tPlR4U3ViQ2FycmllciA9IDA7CisJCX0KKworCQkvKiBGaWxsIFR4IGRlc2NyaXB0b3IgKi8KKwkJbWVtc2V0KHR4X2FnZ19kZXNjLCAwLCBzaXplb2YodHhfZGVzY184MTl4X3VzYl9hZ2dyX3N1YmZyYW1lKSk7CisJCS8qIERXT1JEIDAgKi8KKwkJLy90eF9hZ2dfZGVzYy0+TElOSVAgPSAwOworCQkvL3R4X2FnZ19kZXNjLT5DbWRJbml0ID0gMTsKKwkJdHhfYWdnX2Rlc2MtPk9mZnNldCA9ICBzaXplb2YodHhfZndpbmZvXzgxOXhfdXNiKSArIDg7CisJCS8qIGFscmVhZHkgcmF3IGRhdGEsIG5lZWQgbm90IHRvIHN1YnN0cmFjdCBoZWFkZXIgbGVuZ3RoICovCisJCXR4X2FnZ19kZXNjLT5Qa3RTaXplID0gc2tiLT5sZW4gJiAweGZmZmY7CisKKwkJLypEV09SRCAxKi8KKwkJdHhfYWdnX2Rlc2MtPlNlY0NBTUlEPSAwOworCQl0eF9hZ2dfZGVzYy0+UkFUaWQgPSB0Y2JfZGVzYy0+UkFUUkluZGV4OworCQl7CisJCQkvL01QRFVPdmVyaGVhZCA9IDA7CisJCQl0eF9hZ2dfZGVzYy0+Tm9FbmMgPSAxOworCQl9CisJCXR4X2FnZ19kZXNjLT5TZWNUeXBlID0gMHgwOworCisJCWlmICh0Y2JfZGVzYy0+Ykh3U2VjKSB7CisJCQlzd2l0Y2ggKHByaXYtPmllZWU4MDIxMS0+cGFpcndpc2Vfa2V5X3R5cGUpCisJCQl7CisJCQkJY2FzZSBLRVlfVFlQRV9XRVA0MDoKKwkJCQljYXNlIEtFWV9UWVBFX1dFUDEwNDoKKwkJCQkJdHhfYWdnX2Rlc2MtPlNlY1R5cGUgPSAweDE7CisJCQkJCXR4X2FnZ19kZXNjLT5Ob0VuYyA9IDA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgS0VZX1RZUEVfVEtJUDoKKwkJCQkJdHhfYWdnX2Rlc2MtPlNlY1R5cGUgPSAweDI7CisJCQkJCXR4X2FnZ19kZXNjLT5Ob0VuYyA9IDA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgS0VZX1RZUEVfQ0NNUDoKKwkJCQkJdHhfYWdnX2Rlc2MtPlNlY1R5cGUgPSAweDM7CisJCQkJCXR4X2FnZ19kZXNjLT5Ob0VuYyA9IDA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgS0VZX1RZUEVfTkE6CisJCQkJCXR4X2FnZ19kZXNjLT5TZWNUeXBlID0gMHgwOworCQkJCQl0eF9hZ2dfZGVzYy0+Tm9FbmMgPSAxOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXR4X2FnZ19kZXNjLT5RdWV1ZVNlbGVjdCA9IE1hcEh3UXVldWVUb0Zpcm13YXJlUXVldWUodGNiX2Rlc2MtPnF1ZXVlX2luZGV4KTsKKwkJdHhfYWdnX2Rlc2MtPlR4RldJbmZvU2l6ZSA9ICBzaXplb2YodHhfZndpbmZvXzgxOXhfdXNiKTsKKworCQl0eF9hZ2dfZGVzYy0+RElTRkIgPSB0Y2JfZGVzYy0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjazsKKwkJdHhfYWdnX2Rlc2MtPlVTRVJBVEUgPSB0Y2JfZGVzYy0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlOworCisJCXR4X2FnZ19kZXNjLT5PV04gPSAxOworCisJCS8vRFdPUkQgMgorCQkvKiBBY2NvcmRpbmcgd2luZG93cyBkcml2ZXIsIGl0IHNlZW1zIHRoYXQgdGhlcmUgbm8gbmVlZCB0byBmaWxsIHRoaXMgZmllbGQgKi8KKwkJLy90eF9hZ2dfZGVzYy0+VHhCdWZmZXJTaXplPSAodTMyKShza2ItPmxlbiAtIFVTQl9IV0RFU0NfSEVBREVSX0xFTik7CisKKwkJLyogdG8gZmlsbCBuZXh0IHBhY2tldCAqLworCQlza2JfcHV0KGFnZ19za2IsVFhfUEFDS0VUX0RSVkFHR1JfU1VCRlJBTUVfU0hJRlRfQllURVMpOworCQltZW1jcHkoc2tiX3B1dChhZ2dfc2tiLHNrYi0+bGVuKSxza2ItPmRhdGEsc2tiLT5sZW4pOworCX0KKworCWZvcihpID0gMDsgaSA8IHBTZW5kTGlzdC0+bnJfZHJ2X2FnZ19mcmFtZXM7IGkrKykgeworCQlkZXZfa2ZyZWVfc2tiX2FueShwU2VuZExpc3QtPnR4X2FnZ19mcmFtZXNbaV0pOworCX0KKworCXJldHVybiBhZ2dfc2tiOworfQorCisvKiBOT1RFOgorCVRoaXMgZnVuY3Rpb24gcmV0dXJuIGEgbGlzdCBvZiBQVENCIHdoaWNoIGlzIHByb3BlciB0byBiZSBhZ2dyZWdhdGUgd2l0aCB0aGUgaW5wdXQgVENCLgorCUlmIG5vIHByb3BlciBUQ0IgaXMgZm91bmQgdG8gZG8gYWdncmVnYXRpb24sIFNlbmRMaXN0IHdpbGwgb25seSBjb250YWluIHRoZSBpbnB1dCBUQ0IuCisqLwordTggRHJ2QWdncl9HZXRBZ2dyZWdhdGlibGVMaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCisJCXN0cnVjdCBpZWVlODAyMTFfZHJ2X2FnZ190eGIgKnBTZW5kTGlzdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwl1MTYJCW5NYXhBZ2dyTnVtID0gcEhUSW5mby0+VXNiVHhBZ2dyTnVtOworCWNiX2Rlc2MgCSp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJdTgJCVF1ZXVlSUQgPSB0Y2JfZGVzYy0+cXVldWVfaW5kZXg7CisKKwlkbyB7CisJCXBTZW5kTGlzdC0+dHhfYWdnX2ZyYW1lc1twU2VuZExpc3QtPm5yX2Rydl9hZ2dfZnJhbWVzKytdID0gc2tiOworCQlpZihwU2VuZExpc3QtPm5yX2Rydl9hZ2dfZnJhbWVzID49IG5NYXhBZ2dyTnVtKSB7CisJCQlicmVhazsKKwkJfQorCisJfSB3aGlsZSgoc2tiID0gc2tiX2RlcXVldWUoJmllZWUtPnNrYl9kcnZfYWdnUVtRdWV1ZUlEXSkpKTsKKworCVJUX1RSQUNFKENPTVBfQU1TRFUsICJEcnZBZ2dyX0dldEFnZ3JlZ2F0aWJsZUxpc3QsIG5BZ2dyVGNiTnVtID0gJWQgXG4iLCBwU2VuZExpc3QtPm5yX2Rydl9hZ2dfZnJhbWVzKTsKKwlyZXR1cm4gcFNlbmRMaXN0LT5ucl9kcnZfYWdnX2ZyYW1lczsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBydGw4MTkyX3R4X2lzcihzdHJ1Y3QgdXJiICp0eF91cmIpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiopdHhfdXJiLT5jb250ZXh0OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gTlVMTDsKKwljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJdTggIHF1ZXVlX2luZGV4ID0gdGNiX2Rlc2MtPnF1ZXVlX2luZGV4OworLy8JYm9vbCBiVG9TZW5kMEJ5dGU7CisvLwl1MTYgQnVmTGVuID0gc2tiLT5sZW47CisKKwltZW1jcHkoJmRldiwoc3RydWN0IG5ldF9kZXZpY2UqKShza2ItPmNiKSxzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2UqKSk7CisJcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZih0Y2JfZGVzYy0+cXVldWVfaW5kZXggIT0gVFhDTURfUVVFVUUpIHsKKwkJaWYodHhfdXJiLT5zdGF0dXMgPT0gMCkgeworCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQkvLyBBcyBhY3QgYXMgc3RhdGlvbiBtb2RlLCBkZXN0aW9uIHNoYWxsIGJlICB1bmljYXN0IGFkZHJlc3MuCisJCQkvL3ByaXYtPmllZWU4MDIxMS0+c3RhdHMudHhfYnl0ZXMrPShza2ItPmxlbiAtIHByaXYtPmllZWU4MDIxMS0+dHhfaGVhZHJvb20pOworCQkJLy9wcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCXByaXYtPnN0YXRzLnR4b2t0b3RhbCsrOworCQkJcHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5OdW1UeE9rSW5QZXJpb2QrKzsKKwkJCXByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0ICs9IChza2ItPmxlbiAtIHByaXYtPmllZWU4MDIxMS0+dHhfaGVhZHJvb20pOworCQl9IGVsc2UgeworCQkJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCS8vcHJpdi0+c3RhdHMudHhtYW5hZ2VlcnIrKzsKKwkJCS8qIFRPRE8gKi8KKwkJfQorCX0KKworCS8qIGZyZWUgc2tiIGFuZCB0eF91cmIgKi8KKwlpZihza2IgIT0gTlVMTCkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQl1c2JfZnJlZV91cmIodHhfdXJiKTsKKwkJYXRvbWljX2RlYygmcHJpdi0+dHhfcGVuZGluZ1txdWV1ZV9pbmRleF0pOworCX0KKworCXsKKwkJLy8KKwkJLy8gSGFuZGxlIEhXIEJlYWNvbjoKKwkJLy8gV2UgaGFkIHRyYW5zZmVyIG91ciBiZWFjb24gZnJhbWUgdG8gaG9zdCBjb250cm9sZXIgYXQgdGhpcyBtb21lbnQuCisJCS8vCisJCS8vCisJCS8vIENhdXRpb246CisJCS8vIEhhbmRsaW5nIHRoZSB3YWl0IHF1ZXVlIG9mIGNvbW1hbmQgcGFja2V0cy4KKwkJLy8gRm9yIFR4IGNvbW1hbmQgcGFja2V0cywgd2UgbXVzdCBub3QgZG8gVENCIGZyYWdtZW50IGJlY2F1c2UgaXQgaXMgbm90IGhhbmRsZWQgcmlnaHQgbm93LgorCQkvLyBXZSBtdXN0IGN1dCB0aGUgcGFja2V0cyB0byBtYXRjaCB0aGUgc2l6ZSBvZiBUWF9DTURfUEtUIGJlZm9yZSB3ZSBzZW5kIGl0LgorCQkvLworCisJCS8qIEhhbmRsZSBNUERVIGluIHdhaXQgcXVldWUuICovCisJCWlmKHF1ZXVlX2luZGV4ICE9IEJFQUNPTl9RVUVVRSkgeworCQkJLyogRG9uJ3Qgc2VuZCBkYXRhIGZyYW1lIGR1cmluZyBzY2FubmluZy4qLworCQkJaWYoKHNrYl9xdWV1ZV9sZW4oJnByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRW3F1ZXVlX2luZGV4XSkgIT0gMCkmJlwKKwkJCQkJKCEocHJpdi0+aWVlZTgwMjExLT5xdWV1ZV9zdG9wKSkpIHsKKwkJCQlpZihOVUxMICE9IChza2IgPSBza2JfZGVxdWV1ZSgmKHByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRW3F1ZXVlX2luZGV4XSkpKSkKKwkJCQkJcHJpdi0+aWVlZTgwMjExLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsIGRldik7CisKKwkJCQlyZXR1cm47IC8vbW9kaWZpZWQgYnkgZGF2aWQgdG8gYXZvaWQgZnVydGhlciBwcm9jZXNzaW5nIEFNU0RVCisJCQl9CisjaWZkZWYgVVNCX1RYX0RSSVZFUl9BR0dSRUdBVElPTl9FTkFCTEUKKwkJCWVsc2UgaWYgKChza2JfcXVldWVfbGVuKCZwcml2LT5pZWVlODAyMTEtPnNrYl9kcnZfYWdnUVtxdWV1ZV9pbmRleF0pIT0gMCkmJlwKKwkJCQkoIShwcml2LT5pZWVlODAyMTEtPnF1ZXVlX3N0b3ApKSkgeworCQkJCS8vIFR4IERyaXZlciBBZ2dyZWdhdGlvbiBwcm9jZXNzCisJCQkJLyogVGhlIGRyaXZlciB3aWxsIGFnZ3JlZ2F0aW9uIHRoZSBwYWNrZXRzIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHN0ZXRzCisJCQkJICogMS4gY2hlY2sgd2hldGhlciB0aGVyZSdzIHR4IGlycSBhdmFpbGFibGUsIGZvciBpdCdzIGEgY29tcGxldGlvbiByZXR1cm4KKwkJCQkgKiAgICBmdW5jdGlvbiwgaXQgc2hvdWxkIGNvbnRhaW4gZW5vdWdoIHR4IGlycTsKKwkJCQkgKiAyLiBjaGVjayBwYWtjZXQgdHlwZTsKKwkJCQkgKiAzLiBpbnRpYWxpemUgc2VuZGxpc3QsIGNoZWNrIHdoZXRoZXIgdGhlIHRvLWJlIHNlbmQgcGFja2V0IG5vIGdyZWF0ZXIgdGhhbiAxCisJCQkJICogNC4gYWdncmVnYXRpb24gdGhlIHBhY2tldHMsIGFuZCBmaWxsIGZpcm13YXJlIGluZm8gYW5kIHR4IGRlc2MgdG8gaXQsIGV0Yy4KKwkJCQkgKiA1LiBjaGVjayB3aGVodGVyIHRoZSBwYWNrZXQgY291bGQgYmUgc2VudCwgb3RoZXJ3aXNlIGp1c3QgaW5zZXJ0IHRvIHdhaXQgaGVhZAorCQkJCSAqICovCisJCQkJc2tiID0gc2tiX2RlcXVldWUoJnByaXYtPmllZWU4MDIxMS0+c2tiX2Rydl9hZ2dRW3F1ZXVlX2luZGV4XSk7CisJCQkJaWYoIWNoZWNrX25pY19lbm91Z2hfZGVzYyhkZXYsIHF1ZXVlX2luZGV4KSkgeworCQkJCQlza2JfcXVldWVfaGVhZCgmKHByaXYtPmllZWU4MDIxMS0+c2tiX2Rydl9hZ2dRW3F1ZXVlX2luZGV4XSksIHNrYik7CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQl7CisJCQkJCS8qVE9ETyovCisJCQkJCS8qCisJCQkJCXU4KiBwSGVhZGVyID0gc2tiLT5kYXRhOworCisJCQkJCWlmKElzTWdudFFvc0RhdGEocEhlYWRlcikgfHwKKwkJCQkJICAgIElzTWdudFFEYXRhX0FjayhwSGVhZGVyKSB8fAorCQkJCQkgICAgSXNNZ250UURhdGFfUG9sbChwSGVhZGVyKSB8fAorCQkJCQkgICAgSXNNZ250UURhdGFfUG9sbF9BY2socEhlYWRlcikKKwkJCQkJICApCisJCQkJCSovCisJCQkJCXsKKwkJCQkJCXN0cnVjdCBpZWVlODAyMTFfZHJ2X2FnZ190eGIgU2VuZExpc3Q7CisKKwkJCQkJCW1lbXNldCgmU2VuZExpc3QsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Rydl9hZ2dfdHhiKSk7CisJCQkJCQlpZihEcnZBZ2dyX0dldEFnZ3JlZ2F0aWJsZUxpc3QoZGV2LCBza2IsICZTZW5kTGlzdCkgPiAxKSB7CisJCQkJCQkJc2tiID0gRHJ2QWdncl9BZ2dyZWdhdGlvbihkZXYsICZTZW5kTGlzdCk7CisKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlwcml2LT5pZWVlODAyMTEtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYiwgZGV2KTsKKwkJCQl9CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKworfQorCit2b2lkIHJ0bDgxOTJfYmVhY29uX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCBtc3IsIG1zcm0sIG1zcjI7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJbXNyICA9IHJlYWRfbmljX2J5dGUoZGV2LCBNU1IpOworCW1zcm0gPSBtc3IgJiBNU1JfTElOS19NQVNLOworCW1zcjIgPSBtc3IgJiB+TVNSX0xJTktfTUFTSzsKKworCWlmKE5JQ184MTkyVSA9PSBwcml2LT5jYXJkXzgxOTIpIHsKKwkJdXNiX2tpbGxfdXJiKHByaXYtPnJ4X3VyYltNQVhfUlhfVVJCXSk7CisJfQorCWlmICgobXNybSA9PSAoTVNSX0xJTktfQURIT0M8PE1TUl9MSU5LX1NISUZUKSB8fAorCQkobXNybSA9PSAoTVNSX0xJTktfTUFTVEVSPDxNU1JfTElOS19TSElGVCkpKSl7CisJCXdyaXRlX25pY19ieXRlKGRldiwgTVNSLCBtc3IyIHwgTVNSX0xJTktfTk9ORSk7CisJCXdyaXRlX25pY19ieXRlKGRldiwgTVNSLCBtc3IpOworCX0KK30KKwordm9pZCBydGw4MTkyX2NvbmZpZ19yYXRlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHUxNiogcmF0ZV9jb25maWcpCit7CisJIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQ7CisJIHU4IGk9MCwgYmFzaWNfcmF0ZSA9IDA7CisJIG5ldCA9ICYgcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcms7CisKKwkgZm9yIChpPTA7IGk8bmV0LT5yYXRlc19sZW47IGkrKykKKwkgeworCQkgYmFzaWNfcmF0ZSA9IG5ldC0+cmF0ZXNbaV0mMHg3ZjsKKwkJIHN3aXRjaChiYXNpY19yYXRlKQorCQkgeworCQkJIGNhc2UgTUdOXzFNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl8xTTsJYnJlYWs7CisJCQkgY2FzZSBNR05fMk06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzJNOwlicmVhazsKKwkJCSBjYXNlIE1HTl81XzVNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl81XzVNOwlicmVhazsKKwkJCSBjYXNlIE1HTl8xMU06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzExTTsJYnJlYWs7CisJCQkgY2FzZSBNR05fNk06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzZNOwlicmVhazsKKwkJCSBjYXNlIE1HTl85TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfOU07CWJyZWFrOworCQkJIGNhc2UgTUdOXzEyTToJKnJhdGVfY29uZmlnIHw9IFJSU1JfMTJNOwlicmVhazsKKwkJCSBjYXNlIE1HTl8xOE06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzE4TTsJYnJlYWs7CisJCQkgY2FzZSBNR05fMjRNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl8yNE07CWJyZWFrOworCQkJIGNhc2UgTUdOXzM2TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfMzZNOwlicmVhazsKKwkJCSBjYXNlIE1HTl80OE06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzQ4TTsJYnJlYWs7CisJCQkgY2FzZSBNR05fNTRNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl81NE07CWJyZWFrOworCQkgfQorCSB9CisJIGZvciAoaT0wOyBpPG5ldC0+cmF0ZXNfZXhfbGVuOyBpKyspCisJIHsKKwkJIGJhc2ljX3JhdGUgPSBuZXQtPnJhdGVzX2V4W2ldJjB4N2Y7CisJCSBzd2l0Y2goYmFzaWNfcmF0ZSkKKwkJIHsKKwkJCSBjYXNlIE1HTl8xTToJKnJhdGVfY29uZmlnIHw9IFJSU1JfMU07CWJyZWFrOworCQkJIGNhc2UgTUdOXzJNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl8yTTsJYnJlYWs7CisJCQkgY2FzZSBNR05fNV81TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfNV81TTsJYnJlYWs7CisJCQkgY2FzZSBNR05fMTFNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl8xMU07CWJyZWFrOworCQkJIGNhc2UgTUdOXzZNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl82TTsJYnJlYWs7CisJCQkgY2FzZSBNR05fOU06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzlNOwlicmVhazsKKwkJCSBjYXNlIE1HTl8xMk06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzEyTTsJYnJlYWs7CisJCQkgY2FzZSBNR05fMThNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl8xOE07CWJyZWFrOworCQkJIGNhc2UgTUdOXzI0TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfMjRNOwlicmVhazsKKwkJCSBjYXNlIE1HTl8zNk06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzM2TTsJYnJlYWs7CisJCQkgY2FzZSBNR05fNDhNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl80OE07CWJyZWFrOworCQkJIGNhc2UgTUdOXzU0TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfNTRNOwlicmVhazsKKwkJIH0KKwkgfQorfQorCisKKyNkZWZpbmUgU0hPUlRfU0xPVF9USU1FIDkKKyNkZWZpbmUgTk9OX1NIT1JUX1NMT1RfVElNRSAyMAorCit2b2lkIHJ0bDgxOTJfdXBkYXRlX2NhcChzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1MTYgY2FwKQoreworCXUzMiB0bXAgPSAwOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCA9ICZwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yazsKKwlwcml2LT5zaG9ydF9wcmVhbWJsZSA9IGNhcCAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRTsKKwl0bXAgPSBwcml2LT5iYXNpY19yYXRlOworCWlmIChwcml2LT5zaG9ydF9wcmVhbWJsZSkKKwkJdG1wIHw9IEJSU1JfQWNrU2hvcnRQbWI7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUlJTUiwgdG1wKTsKKworCWlmIChuZXQtPm1vZGUgJiAoSUVFRV9HfElFRUVfTl8yNEcpKQorCXsKKwkJdTggc2xvdF90aW1lID0gMDsKKwkJaWYgKChjYXAgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCkmJighcHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvLT5iQ3VycmVudFJUMlJUTG9uZ1Nsb3RUaW1lKSkKKwkJey8vc2hvcnQgc2xvdCB0aW1lCisJCQlzbG90X3RpbWUgPSBTSE9SVF9TTE9UX1RJTUU7CisJCX0KKwkJZWxzZSAvL2xvbmcgc2xvdCB0aW1lCisJCQlzbG90X3RpbWUgPSBOT05fU0hPUlRfU0xPVF9USU1FOworCQlwcml2LT5zbG90X3RpbWUgPSBzbG90X3RpbWU7CisJCXdyaXRlX25pY19ieXRlKGRldiwgU0xPVF9USU1FLCBzbG90X3RpbWUpOworCX0KKworfQordm9pZCBydGw4MTkyX25ldF91cGRhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldDsKKwl1MTYgQmNuVGltZUNmZyA9IDAsIEJjbkNXID0gNiwgQmNuSUZTID0gMHhmOworCXUxNiByYXRlX2NvbmZpZyA9IDA7CisJbmV0ID0gJiBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yazsKKworCXJ0bDgxOTJfY29uZmlnX3JhdGUoZGV2LCAmcmF0ZV9jb25maWcpOworCXByaXYtPmJhc2ljX3JhdGUgPSByYXRlX2NvbmZpZyAmPSAweDE1ZjsKKworCXdyaXRlX25pY19kd29yZChkZXYsQlNTSURSLCgodTMyKiluZXQtPmJzc2lkKVswXSk7CisJd3JpdGVfbmljX3dvcmQoZGV2LEJTU0lEUis0LCgodTE2KiluZXQtPmJzc2lkKVsyXSk7CisJLy9mb3IoaT0wO2k8RVRIX0FMRU47aSsrKQorCS8vCXdyaXRlX25pY19ieXRlKGRldixCU1NJRCtpLG5ldC0+YnNzaWRbaV0pOworCisJcnRsODE5Ml91cGRhdGVfbXNyKGRldik7CisvLwlydGw4MTkyX3VwZGF0ZV9jYXAoZGV2LCBuZXQtPmNhcGFiaWxpdHkpOworCWlmIChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwl7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBBVElNV05ELCAyKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIEJDTl9ETUFUSU1FLCAxMDIzKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIEJDTl9JTlRFUlZBTCwgbmV0LT5iZWFjb25faW50ZXJ2YWwpOworLy8Jd3JpdGVfbmljX3dvcmQoZGV2LCBCY25JbnRUaW1lLCAxMDApOworCXdyaXRlX25pY193b3JkKGRldiwgQkNOX0RSVl9FQVJMWV9JTlQsIDEpOworCXdyaXRlX25pY19ieXRlKGRldiwgQkNOX0VSUl9USFJFU0gsIDEwMCk7CisJCUJjblRpbWVDZmcgfD0gKEJjbkNXPDxCQ05fVENGR19DV19TSElGVCk7CisJLy8gVE9ETzogQmNuSUZTIG1heSByZXF1aXJlZCB0byBiZSBjaGFuZ2VkIG9uIEFTSUMKKwkJQmNuVGltZUNmZyB8PSBCY25JRlM8PEJDTl9UQ0ZHX0lGUzsKKworCXdyaXRlX25pY193b3JkKGRldiwgQkNOX1RDRkcsIEJjblRpbWVDZmcpOworCX0KKworCisKK30KKworLy90ZW1wb3JhcnkgaHcgYmVhY29uIGlzIG5vdCB1c2VkIGFueSBtb3JlLgorLy9vcGVuIGl0IHdoZW4gbmVjZXNzYXJ5Cit2b2lkIHJ0bDgxOXh1c2JfYmVhY29uX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTE2ICB0eF9yYXRlKQoreworCit9CitpbmxpbmUgdTggcnRsODE5Ml9Jc1dpcmVsZXNzQk1vZGUodTE2IHJhdGUpCit7CisJaWYoICgocmF0ZSA8PSAxMTApICYmIChyYXRlICE9IDYwKSAmJiAocmF0ZSAhPSA5MCkpIHx8IChyYXRlID09IDIyMCkgKQorCQlyZXR1cm4gMTsKKwllbHNlIHJldHVybiAwOworfQorCit1MTYgTl9EQlBTT2ZSYXRlKHUxNiBEYXRhUmF0ZSk7CisKK3UxNiBDb21wdXRlVHhUaW1lKAorCXUxNgkJRnJhbWVMZW5ndGgsCisJdTE2CQlEYXRhUmF0ZSwKKwl1OAkJYk1hbmFnZW1lbnRGcmFtZSwKKwl1OAkJYlNob3J0UHJlYW1ibGUKKykKK3sKKwl1MTYJRnJhbWVUaW1lOworCXUxNglOX0RCUFM7CisJdTE2CUNlaWxpbmc7CisKKwlpZiggcnRsODE5Ml9Jc1dpcmVsZXNzQk1vZGUoRGF0YVJhdGUpICkKKwl7CisJCWlmKCBiTWFuYWdlbWVudEZyYW1lIHx8ICFiU2hvcnRQcmVhbWJsZSB8fCBEYXRhUmF0ZSA9PSAxMCApCisJCXsJLy8gbG9uZyBwcmVhbWJsZQorCQkJRnJhbWVUaW1lID0gKHUxNikoMTQ0KzQ4KyhGcmFtZUxlbmd0aCo4LyhEYXRhUmF0ZS8xMCkpKTsKKwkJfQorCQllbHNlCisJCXsJLy8gU2hvcnQgcHJlYW1ibGUKKwkJCUZyYW1lVGltZSA9ICh1MTYpKDcyKzI0KyhGcmFtZUxlbmd0aCo4LyhEYXRhUmF0ZS8xMCkpKTsKKwkJfQorCQlpZiggKCBGcmFtZUxlbmd0aCo4ICUgKERhdGFSYXRlLzEwKSApICE9IDAgKSAvL0dldCB0aGUgQ2VpbGxpbmcKKwkJCQlGcmFtZVRpbWUgKys7CisJfSBlbHNlIHsJLy84MDIuMTFnIERTU1MtT0ZETSBQTENQIGxlbmd0aCBmaWVsZCBjYWxjdWxhdGlvbi4KKwkJTl9EQlBTID0gTl9EQlBTT2ZSYXRlKERhdGFSYXRlKTsKKwkJQ2VpbGluZyA9ICgxNiArIDgqRnJhbWVMZW5ndGggKyA2KSAvIE5fREJQUworCQkJCSsgKCgoMTYgKyA4KkZyYW1lTGVuZ3RoICsgNikgJSBOX0RCUFMpID8gMSA6IDApOworCQlGcmFtZVRpbWUgPSAodTE2KSgxNiArIDQgKyA0KkNlaWxpbmcgKyA2KTsKKwl9CisJcmV0dXJuIEZyYW1lVGltZTsKK30KKwordTE2IE5fREJQU09mUmF0ZSh1MTYgRGF0YVJhdGUpCit7CisJIHUxNiBOX0RCUFMgPSAyNDsKKworCSBzd2l0Y2goRGF0YVJhdGUpCisJIHsKKwkgY2FzZSA2MDoKKwkgIE5fREJQUyA9IDI0OworCSAgYnJlYWs7CisKKwkgY2FzZSA5MDoKKwkgIE5fREJQUyA9IDM2OworCSAgYnJlYWs7CisKKwkgY2FzZSAxMjA6CisJICBOX0RCUFMgPSA0ODsKKwkgIGJyZWFrOworCisJIGNhc2UgMTgwOgorCSAgTl9EQlBTID0gNzI7CisJICBicmVhazsKKworCSBjYXNlIDI0MDoKKwkgIE5fREJQUyA9IDk2OworCSAgYnJlYWs7CisKKwkgY2FzZSAzNjA6CisJICBOX0RCUFMgPSAxNDQ7CisJICBicmVhazsKKworCSBjYXNlIDQ4MDoKKwkgIE5fREJQUyA9IDE5MjsKKwkgIGJyZWFrOworCisJIGNhc2UgNTQwOgorCSAgTl9EQlBTID0gMjE2OworCSAgYnJlYWs7CisKKwkgZGVmYXVsdDoKKwkgIGJyZWFrOworCSB9CisKKwkgcmV0dXJuIE5fREJQUzsKK30KKwordm9pZCBydGw4MTl4VV9jbWRfaXNyKHN0cnVjdCB1cmIgKnR4X2NtZF91cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVzYl9mcmVlX3VyYih0eF9jbWRfdXJiKTsKK30KKwordW5zaWduZWQgaW50IHR4cXVldWUyb3V0cGlwZShzdHJ1Y3QgcjgxOTJfcHJpdiogcHJpdix1bnNpZ25lZCBpbnQgdHhfcXVldWUpIHsKKworCWlmKHR4X3F1ZXVlID49IDkpCisJeworCQlSVF9UUkFDRShDT01QX0VSUiwiJXMoKTpVbmtub3duIHF1ZXVlIElEISEhXG4iLF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAweDA0OworCX0KKwlyZXR1cm4gcHJpdi0+dHhxdWV1ZV90b19vdXRwaXBlbWFwW3R4X3F1ZXVlXTsKK30KKworc2hvcnQgcnRsODE5eFVfdHhfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vdTgJCQkqdHg7CisJaW50CQkJc3RhdHVzOworCXN0cnVjdCB1cmIJCSp0eF91cmI7CisJLy9pbnQJCQl1cmJfYnVmX2xlbjsKKwl1bnNpZ25lZCBpbnQgCQlpZHhfcGlwZTsKKwl0eF9kZXNjX2NtZF84MTl4X3VzYiAqcGRlc2MgPSAodHhfZGVzY19jbWRfODE5eF91c2IgKilza2ItPmRhdGE7CisJY2JfZGVzYyAqdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCXU4IHF1ZXVlX2luZGV4ID0gdGNiX2Rlc2MtPnF1ZXVlX2luZGV4OworCisJLy9wcmludGsoIlxuICVzOjpxdWV1ZV9pbmRleCA9ICVkXG4iLF9fRlVOQ1RJT05fXywgcXVldWVfaW5kZXgpOworCWF0b21pY19pbmMoJnByaXYtPnR4X3BlbmRpbmdbcXVldWVfaW5kZXhdKTsKKwl0eF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsR0ZQX0FUT01JQyk7CisJaWYoIXR4X3VyYil7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KHBkZXNjLCAwLCBVU0JfSFdERVNDX0hFQURFUl9MRU4pOworCS8qIFR4IGRlc2NyaXB0b3Igb3VnaHQgdG8gYmUgc2V0IGFjY29yZGluZyB0byB0aGUgc2tiLT5jYiAqLworCXBkZXNjLT5GaXJzdFNlZyA9IDE7Ly9iRmlyc3RTZWc7CisJcGRlc2MtPkxhc3RTZWcgPSAxOy8vYkxhc3RTZWc7CisJcGRlc2MtPkNtZEluaXQgPSB0Y2JfZGVzYy0+YkNtZE9ySW5pdDsKKwlwZGVzYy0+VHhCdWZmZXJTaXplID0gdGNiX2Rlc2MtPnR4YnVmX3NpemU7CisJcGRlc2MtPk9XTiA9IDE7CisJcGRlc2MtPkxJTklQID0gdGNiX2Rlc2MtPmJMYXN0SW5pUGt0OworCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gRmlsbCB1cCBVU0JfT1VUX0NPTlRFWFQuCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gR2V0IGluZGV4IHRvIG91dCBwaXBlIGZyb20gc3BlY2lmaWVkIFF1ZXVlSUQuCisjaWZuZGVmIFVTRV9PTkVfUElQRQorCWlkeF9waXBlID0gdHhxdWV1ZTJvdXRwaXBlKHByaXYscXVldWVfaW5kZXgpOworI2Vsc2UKKwlpZHhfcGlwZSA9IDB4MDQ7CisjZW5kaWYKKyNpZmRlZiBKT0hOX0RVTVBfVFhERVNDCisJaW50IGk7CisJcHJpbnRrKCI8VHggZGVzY3JpcHRvcj4tLXJhdGUgJXgtLS0iLHJhdGUpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXByaW50aygiJTh4ICIsIHR4W2ldKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKwl1c2JfZmlsbF9idWxrX3VyYih0eF91cmIscHJpdi0+dWRldiwgdXNiX3NuZGJ1bGtwaXBlKHByaXYtPnVkZXYsaWR4X3BpcGUpLCBcCisJCQlza2ItPmRhdGEsIHNrYi0+bGVuLCBydGw4MTkyX3R4X2lzciwgc2tiKTsKKworCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHR4X3VyYiwgR0ZQX0FUT01JQyk7CisKKwlpZiAoIXN0YXR1cyl7CisJCXJldHVybiAwOworCX1lbHNleworCQlETUVTR0UoIkVycm9yIFRYIENNRCBVUkIsIGVycm9yICVkIiwKKwkJCQlzdGF0dXMpOworCQlyZXR1cm4gLTE7CisJfQorfQorCisvKgorICogTWFwcGluZyBTb2Z0d2FyZS9IYXJkd2FyZSBkZXNjcmlwdG9yIHF1ZXVlIGlkIHRvICJRdWV1ZSBTZWxlY3QgRmllbGQiCisgKiBpbiBUeEZ3SW5mbyBkYXRhIHN0cnVjdHVyZQorICogMjAwNi4xMC4zMCBieSBFbWlseQorICoKKyAqIFxwYXJhbSBRVUVVRUlEICAgICAgIFNvZnR3YXJlIFF1ZXVlCisqLwordTggTWFwSHdRdWV1ZVRvRmlybXdhcmVRdWV1ZSh1OCBRdWV1ZUlEKQoreworCXU4IFF1ZXVlU2VsZWN0ID0gMHgwOyAgICAgICAvL2RlZnVhbHQgc2V0IHRvCisKKwlzd2l0Y2goUXVldWVJRCkgeworCQljYXNlIEJFX1FVRVVFOgorCQkJUXVldWVTZWxlY3QgPSBRU0xUX0JFOyAgLy9vciBRU2VsZWN0ID0gcFRjYi0+cHJpb3JpdHk7CisJCQlicmVhazsKKworCQljYXNlIEJLX1FVRVVFOgorCQkJUXVldWVTZWxlY3QgPSBRU0xUX0JLOyAgLy9vciBRU2VsZWN0ID0gcFRjYi0+cHJpb3JpdHk7CisJCQlicmVhazsKKworCQljYXNlIFZPX1FVRVVFOgorCQkJUXVldWVTZWxlY3QgPSBRU0xUX1ZPOyAgLy9vciBRU2VsZWN0ID0gcFRjYi0+cHJpb3JpdHk7CisJCQlicmVhazsKKworCQljYXNlIFZJX1FVRVVFOgorCQkJUXVldWVTZWxlY3QgPSBRU0xUX1ZJOyAgLy9vciBRU2VsZWN0ID0gcFRjYi0+cHJpb3JpdHk7CisJCQlicmVhazsKKwkJY2FzZSBNR05UX1FVRVVFOgorCQkJUXVldWVTZWxlY3QgPSBRU0xUX01HTlQ7CisJCQlicmVhazsKKworCQljYXNlIEJFQUNPTl9RVUVVRToKKwkJCVF1ZXVlU2VsZWN0ID0gUVNMVF9CRUFDT047CisJCQlicmVhazsKKworCQkJLy8gVE9ETzogMjAwNi4xMC4zMCBtYXJrIG90aGVyIHF1ZXVlIHNlbGVjdGlvbiB1bnRpbCB3ZSB2ZXJpZnkgaXQgaXMgT0sKKwkJCS8vIFRPRE86IFJlbW92ZSBBc3NlcnRpb25zCisvLyNpZiAoUlRMODE5WF9GUEdBX1ZFUiAmIFJUTDgxOVhfRlBHQV9HVUFOR0FOXzA3MDUwMikKKwkJY2FzZSBUWENNRF9RVUVVRToKKwkJCVF1ZXVlU2VsZWN0ID0gUVNMVF9DTUQ7CisJCQlicmVhazsKKy8vI2VuZGlmCisJCWNhc2UgSElHSF9RVUVVRToKKwkJCVF1ZXVlU2VsZWN0ID0gUVNMVF9ISUdIOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCAiVHJhbnNtaXRUQ0IoKTogSW1wb3NzaWJsZSBRdWV1ZSBTZWxlY3Rpb246ICVkIFxuIiwgUXVldWVJRCk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIFF1ZXVlU2VsZWN0OworfQorCit1OCBNUmF0ZVRvSHdSYXRlODE5MFBjaSh1OCByYXRlKQoreworCXU4ICByZXQgPSBERVNDOTBfUkFURTFNOworCisJc3dpdGNoKHJhdGUpIHsKKwkJY2FzZSBNR05fMU06ICAgIHJldCA9IERFU0M5MF9SQVRFMU07ICAgIGJyZWFrOworCQljYXNlIE1HTl8yTTogICAgcmV0ID0gREVTQzkwX1JBVEUyTTsgICAgYnJlYWs7CisJCWNhc2UgTUdOXzVfNU06ICByZXQgPSBERVNDOTBfUkFURTVfNU07ICBicmVhazsKKwkJY2FzZSBNR05fMTFNOiAgIHJldCA9IERFU0M5MF9SQVRFMTFNOyAgIGJyZWFrOworCQljYXNlIE1HTl82TTogICAgcmV0ID0gREVTQzkwX1JBVEU2TTsgICAgYnJlYWs7CisJCWNhc2UgTUdOXzlNOiAgICByZXQgPSBERVNDOTBfUkFURTlNOyAgICBicmVhazsKKwkJY2FzZSBNR05fMTJNOiAgIHJldCA9IERFU0M5MF9SQVRFMTJNOyAgIGJyZWFrOworCQljYXNlIE1HTl8xOE06ICAgcmV0ID0gREVTQzkwX1JBVEUxOE07ICAgYnJlYWs7CisJCWNhc2UgTUdOXzI0TTogICByZXQgPSBERVNDOTBfUkFURTI0TTsgICBicmVhazsKKwkJY2FzZSBNR05fMzZNOiAgIHJldCA9IERFU0M5MF9SQVRFMzZNOyAgIGJyZWFrOworCQljYXNlIE1HTl80OE06ICAgcmV0ID0gREVTQzkwX1JBVEU0OE07ICAgYnJlYWs7CisJCWNhc2UgTUdOXzU0TTogICByZXQgPSBERVNDOTBfUkFURTU0TTsgICBicmVhazsKKworCQkvLyBIVCByYXRlIHNpbmNlIGhlcmUKKwkJY2FzZSBNR05fTUNTMDogIHJldCA9IERFU0M5MF9SQVRFTUNTMDsgIGJyZWFrOworCQljYXNlIE1HTl9NQ1MxOiAgcmV0ID0gREVTQzkwX1JBVEVNQ1MxOyAgYnJlYWs7CisJCWNhc2UgTUdOX01DUzI6ICByZXQgPSBERVNDOTBfUkFURU1DUzI7ICBicmVhazsKKwkJY2FzZSBNR05fTUNTMzogIHJldCA9IERFU0M5MF9SQVRFTUNTMzsgIGJyZWFrOworCQljYXNlIE1HTl9NQ1M0OiAgcmV0ID0gREVTQzkwX1JBVEVNQ1M0OyAgYnJlYWs7CisJCWNhc2UgTUdOX01DUzU6ICByZXQgPSBERVNDOTBfUkFURU1DUzU7ICBicmVhazsKKwkJY2FzZSBNR05fTUNTNjogIHJldCA9IERFU0M5MF9SQVRFTUNTNjsgIGJyZWFrOworCQljYXNlIE1HTl9NQ1M3OiAgcmV0ID0gREVTQzkwX1JBVEVNQ1M3OyAgYnJlYWs7CisJCWNhc2UgTUdOX01DUzg6ICByZXQgPSBERVNDOTBfUkFURU1DUzg7ICBicmVhazsKKwkJY2FzZSBNR05fTUNTOTogIHJldCA9IERFU0M5MF9SQVRFTUNTOTsgIGJyZWFrOworCQljYXNlIE1HTl9NQ1MxMDogcmV0ID0gREVTQzkwX1JBVEVNQ1MxMDsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzExOiByZXQgPSBERVNDOTBfUkFURU1DUzExOyBicmVhazsKKwkJY2FzZSBNR05fTUNTMTI6IHJldCA9IERFU0M5MF9SQVRFTUNTMTI7IGJyZWFrOworCQljYXNlIE1HTl9NQ1MxMzogcmV0ID0gREVTQzkwX1JBVEVNQ1MxMzsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzE0OiByZXQgPSBERVNDOTBfUkFURU1DUzE0OyBicmVhazsKKwkJY2FzZSBNR05fTUNTMTU6IHJldCA9IERFU0M5MF9SQVRFTUNTMTU7IGJyZWFrOworCQljYXNlICgweDgwfDB4MjApOiByZXQgPSBERVNDOTBfUkFURU1DUzMyOyBicmVhazsKKworCQlkZWZhdWx0OiAgICAgICBicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCit1OCBRdWVyeUlzU2hvcnQodTggVHhIVCwgdTggVHhSYXRlLCBjYl9kZXNjICp0Y2JfZGVzYykKK3sKKwl1OCAgIHRtcF9TaG9ydDsKKworCXRtcF9TaG9ydCA9IChUeEhUPT0xKT8oKHRjYl9kZXNjLT5iVXNlU2hvcnRHSSk/MTowKTooKHRjYl9kZXNjLT5iVXNlU2hvcnRQcmVhbWJsZSk/MTowKTsKKworCWlmKFR4SFQ9PTEgJiYgVHhSYXRlICE9IERFU0M5MF9SQVRFTUNTMTUpCisJCXRtcF9TaG9ydCA9IDA7CisKKwlyZXR1cm4gdG1wX1Nob3J0OworfQorCitzdGF0aWMgdm9pZCB0eF96ZXJvX2lzcihzdHJ1Y3QgdXJiICp0eF91cmIpCit7CisJcmV0dXJuOworfQorCisvKgorICogVGhlIHR4IHByb2NlZHVyZSBpcyBqdXN0IGFzIGZvbGxvd2luZywKKyAqIHNrYi0+Y2Igd2lsbCBjb250YWluIGFsbCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uLAorICogcHJpb3JpdHksIG1vcmVmcmFnLCByYXRlLCAmZGV2LgorICogKi8KK3Nob3J0IHJ0bDgxOTJfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYqIHNrYikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJY2JfZGVzYyAqdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCXR4X2Rlc2NfODE5eF91c2IgKnR4X2Rlc2MgPSAodHhfZGVzY184MTl4X3VzYiAqKXNrYi0+ZGF0YTsKKwl0eF9md2luZm9fODE5eF91c2IgKnR4X2Z3aW5mbyA9ICh0eF9md2luZm9fODE5eF91c2IgKikoc2tiLT5kYXRhICsgVVNCX0hXREVTQ19IRUFERVJfTEVOKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHByaXYtPnVkZXY7CisJaW50IHBlbmQ7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgdXJiICp0eF91cmIgPSBOVUxMLCAqdHhfdXJiX3plcm8gPSBOVUxMOworCS8vaW50IHVyYl9sZW47CisJdW5zaWduZWQgaW50IGlkeF9waXBlOworLy8JUlRfREVCVUdfREFUQShDT01QX1NFTkQsIHRjYl9kZXNjLCBzaXplb2YoY2JfZGVzYykpOworLy8JcHJpbnRrKCI9PT09PT09PT09PT09PiAlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlwZW5kID0gYXRvbWljX3JlYWQoJnByaXYtPnR4X3BlbmRpbmdbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSk7CisJLyogd2UgYXJlIGxvY2tlZCBoZXJlIHNvIHRoZSB0d28gYXRvbWljX3JlYWQgYW5kIGluYyBhcmUgZXhlY3V0ZWQKKwkgKiB3aXRob3V0IGludGVybGVhdmVzCisJICogISEhIEZvciBkZWJ1ZyBwdXJwb3NlCisJICovCisJaWYoIHBlbmQgPiBNQVhfVFhfVVJCKXsKKwkJcHJpbnRrKCJUbyBkaXNjYXJkIHNrYiBwYWNrZXQhXG4iKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXR4X3VyYiA9IHVzYl9hbGxvY191cmIoMCxHRlBfQVRPTUlDKTsKKwlpZighdHhfdXJiKXsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogRmlsbCBUeCBmaXJtd2FyZSBpbmZvICovCisJbWVtc2V0KHR4X2Z3aW5mbywwLHNpemVvZih0eF9md2luZm9fODE5eF91c2IpKTsKKwkvKiBEV09SRCAwICovCisJdHhfZndpbmZvLT5UeEhUID0gKHRjYl9kZXNjLT5kYXRhX3JhdGUmMHg4MCk/MTowOworCXR4X2Z3aW5mby0+VHhSYXRlID0gTVJhdGVUb0h3UmF0ZTgxOTBQY2kodGNiX2Rlc2MtPmRhdGFfcmF0ZSk7CisJdHhfZndpbmZvLT5FbmFibGVDUFVEdXIgPSB0Y2JfZGVzYy0+YlR4RW5hYmxlRndDYWxjRHVyOworCXR4X2Z3aW5mby0+U2hvcnQgPSBRdWVyeUlzU2hvcnQodHhfZndpbmZvLT5UeEhULCB0eF9md2luZm8tPlR4UmF0ZSwgdGNiX2Rlc2MpOworCWlmKHRjYl9kZXNjLT5iQU1QRFVFbmFibGUpIHsvL0FNUERVIGVuYWJsZWQKKwkJdHhfZndpbmZvLT5BbGxvd0FnZ3JlZ2F0aW9uID0gMTsKKwkJLyogRFdPUkQgMSAqLworCQl0eF9md2luZm8tPlJ4TUYgPSB0Y2JfZGVzYy0+YW1wZHVfZmFjdG9yOworCQl0eF9md2luZm8tPlJ4QU1EID0gdGNiX2Rlc2MtPmFtcGR1X2RlbnNpdHkmMHgwNzsvL2FtcGR1ZGVuc2l0eQorCX0gZWxzZSB7CisJCXR4X2Z3aW5mby0+QWxsb3dBZ2dyZWdhdGlvbiA9IDA7CisJCS8qIERXT1JEIDEgKi8KKwkJdHhfZndpbmZvLT5SeE1GID0gMDsKKwkJdHhfZndpbmZvLT5SeEFNRCA9IDA7CisJfQorCisJLyogUHJvdGVjdGlvbiBtb2RlIHJlbGF0ZWQgKi8KKwl0eF9md2luZm8tPlJ0c0VuYWJsZSA9ICh0Y2JfZGVzYy0+YlJUU0VuYWJsZSk/MTowOworCXR4X2Z3aW5mby0+Q3RzRW5hYmxlID0gKHRjYl9kZXNjLT5iQ1RTRW5hYmxlKT8xOjA7CisJdHhfZndpbmZvLT5SdHNTVEJDID0gKHRjYl9kZXNjLT5iUlRTU1RCQyk/MTowOworCXR4X2Z3aW5mby0+UnRzSFQgPSAodGNiX2Rlc2MtPnJ0c19yYXRlJjB4ODApPzE6MDsKKwl0eF9md2luZm8tPlJ0c1JhdGUgPSAgTVJhdGVUb0h3UmF0ZTgxOTBQY2koKHU4KXRjYl9kZXNjLT5ydHNfcmF0ZSk7CisJdHhfZndpbmZvLT5SdHNTdWJjYXJyaWVyID0gKHR4X2Z3aW5mby0+UnRzSFQ9PTApPyh0Y2JfZGVzYy0+UlRTU0MpOjA7CisJdHhfZndpbmZvLT5SdHNCYW5kd2lkdGggPSAodHhfZndpbmZvLT5SdHNIVD09MSk/KCh0Y2JfZGVzYy0+YlJUU0JXKT8xOjApOjA7CisJdHhfZndpbmZvLT5SdHNTaG9ydCA9ICh0eF9md2luZm8tPlJ0c0hUPT0wKT8odGNiX2Rlc2MtPmJSVFNVc2VTaG9ydFByZWFtYmxlPzE6MCk6XAorCQkJCSh0Y2JfZGVzYy0+YlJUU1VzZVNob3J0R0k/MTowKTsKKworCS8qIFNldCBCYW5kd2lkdGggYW5kIHN1Yi1jaGFubmVsIHNldHRpbmdzLiAqLworCWlmKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMF80MCkKKwl7CisJCWlmKHRjYl9kZXNjLT5iUGFja2V0QlcpIHsKKwkJCXR4X2Z3aW5mby0+VHhCYW5kd2lkdGggPSAxOworCQkJdHhfZndpbmZvLT5UeFN1YkNhcnJpZXIgPSAwOyAgICAvL0J5IFNEMydzIEplcnJ5IHN1Z2dlc3Rpb24sIHVzZSBkdXBsaWNhdGVkIG1vZGUKKwkJfSBlbHNlIHsKKwkJCXR4X2Z3aW5mby0+VHhCYW5kd2lkdGggPSAwOworCQkJdHhfZndpbmZvLT5UeFN1YkNhcnJpZXIgPSBwcml2LT5uQ3VyNDBNaHpQcmltZVNDOworCQl9CisJfSBlbHNlIHsKKwkJdHhfZndpbmZvLT5UeEJhbmR3aWR0aCA9IDA7CisJCXR4X2Z3aW5mby0+VHhTdWJDYXJyaWVyID0gMDsKKwl9CisKKyNpZmRlZiBVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQorCWlmICh0Y2JfZGVzYy0+ZHJ2X2FnZ19lbmFibGUpCisJeworCQl0eF9md2luZm8tPlR4X0lORk9fUlNWRCA9ICh0Y2JfZGVzYy0+RHJ2QWdnck51bSAmIDB4MWYpIDw8IDE7CisJfQorI2VuZGlmCisJLyogRmlsbCBUeCBkZXNjcmlwdG9yICovCisJbWVtc2V0KHR4X2Rlc2MsIDAsIHNpemVvZih0eF9kZXNjXzgxOXhfdXNiKSk7CisJLyogRFdPUkQgMCAqLworCXR4X2Rlc2MtPkxJTklQID0gMDsKKwl0eF9kZXNjLT5DbWRJbml0ID0gMTsKKwl0eF9kZXNjLT5PZmZzZXQgPSAgc2l6ZW9mKHR4X2Z3aW5mb184MTl4X3VzYikgKyA4OworCisjaWZkZWYgVVNCX1RYX0RSSVZFUl9BR0dSRUdBVElPTl9FTkFCTEUKKwlpZiAodGNiX2Rlc2MtPmRydl9hZ2dfZW5hYmxlKSB7CisJCXR4X2Rlc2MtPlBrdFNpemUgPSB0Y2JfZGVzYy0+cGt0X3NpemU7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCXR4X2Rlc2MtPlBrdFNpemUgPSAoc2tiLT5sZW4gLSBUWF9QQUNLRVRfU0hJRlRfQllURVMpICYgMHhmZmZmOworCX0KKworCS8qRFdPUkQgMSovCisJdHhfZGVzYy0+U2VjQ0FNSUQ9IDA7CisJdHhfZGVzYy0+UkFUaWQgPSB0Y2JfZGVzYy0+UkFUUkluZGV4OworCXsKKwkJLy9NUERVT3ZlcmhlYWQgPSAwOworCQl0eF9kZXNjLT5Ob0VuYyA9IDE7CisJfQorCXR4X2Rlc2MtPlNlY1R5cGUgPSAweDA7CisJCWlmICh0Y2JfZGVzYy0+Ykh3U2VjKQorCQkJeworCQkJCXN3aXRjaCAocHJpdi0+aWVlZTgwMjExLT5wYWlyd2lzZV9rZXlfdHlwZSkKKwkJCQl7CisJCQkJCWNhc2UgS0VZX1RZUEVfV0VQNDA6CisJCQkJCWNhc2UgS0VZX1RZUEVfV0VQMTA0OgorCQkJCQkJIHR4X2Rlc2MtPlNlY1R5cGUgPSAweDE7CisJCQkJCQkgdHhfZGVzYy0+Tm9FbmMgPSAwOworCQkJCQkJIGJyZWFrOworCQkJCQljYXNlIEtFWV9UWVBFX1RLSVA6CisJCQkJCQkgdHhfZGVzYy0+U2VjVHlwZSA9IDB4MjsKKwkJCQkJCSB0eF9kZXNjLT5Ob0VuYyA9IDA7CisJCQkJCQkgYnJlYWs7CisJCQkJCWNhc2UgS0VZX1RZUEVfQ0NNUDoKKwkJCQkJCSB0eF9kZXNjLT5TZWNUeXBlID0gMHgzOworCQkJCQkJIHR4X2Rlc2MtPk5vRW5jID0gMDsKKwkJCQkJCSBicmVhazsKKwkJCQkJY2FzZSBLRVlfVFlQRV9OQToKKwkJCQkJCSB0eF9kZXNjLT5TZWNUeXBlID0gMHgwOworCQkJCQkJIHR4X2Rlc2MtPk5vRW5jID0gMTsKKwkJCQkJCSBicmVhazsKKwkJCQl9CisJCQl9CisKKwl0eF9kZXNjLT5RdWV1ZVNlbGVjdCA9IE1hcEh3UXVldWVUb0Zpcm13YXJlUXVldWUodGNiX2Rlc2MtPnF1ZXVlX2luZGV4KTsKKwl0eF9kZXNjLT5UeEZXSW5mb1NpemUgPSAgc2l6ZW9mKHR4X2Z3aW5mb184MTl4X3VzYik7CisKKwl0eF9kZXNjLT5ESVNGQiA9IHRjYl9kZXNjLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrOworCXR4X2Rlc2MtPlVTRVJBVEUgPSB0Y2JfZGVzYy0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlOworCisJLyogRmlsbCBmaWVsZHMgdGhhdCBhcmUgcmVxdWlyZWQgdG8gYmUgaW5pdGlhbGl6ZWQgaW4gYWxsIG9mIHRoZSBkZXNjcmlwdG9ycyAqLworCS8vRFdPUkQgMAorCXR4X2Rlc2MtPkZpcnN0U2VnID0gMTsKKwl0eF9kZXNjLT5MYXN0U2VnID0gMTsKKwl0eF9kZXNjLT5PV04gPSAxOworCisjaWZkZWYgVVNCX1RYX0RSSVZFUl9BR0dSRUdBVElPTl9FTkFCTEUKKwlpZiAodGNiX2Rlc2MtPmRydl9hZ2dfZW5hYmxlKSB7CisJCXR4X2Rlc2MtPlR4QnVmZmVyU2l6ZSA9IHRjYl9kZXNjLT5wa3Rfc2l6ZSArIHNpemVvZih0eF9md2luZm9fODE5eF91c2IpOworCX0gZWxzZQorI2VuZGlmCisJeworCQkvL0RXT1JEIDIKKwkJdHhfZGVzYy0+VHhCdWZmZXJTaXplID0gKHUzMikoc2tiLT5sZW4gLSBVU0JfSFdERVNDX0hFQURFUl9MRU4pOworCX0KKwkvKiBHZXQgaW5kZXggdG8gb3V0IHBpcGUgZnJvbSBzcGVjaWZpZWQgUXVldWVJRCAqLworI2lmbmRlZiBVU0VfT05FX1BJUEUKKwlpZHhfcGlwZSA9IHR4cXVldWUyb3V0cGlwZShwcml2LHRjYl9kZXNjLT5xdWV1ZV9pbmRleCk7CisjZWxzZQorCWlkeF9waXBlID0gMHg1OworI2VuZGlmCisKKwkvL1JUX0RFQlVHX0RBVEEoQ09NUF9TRU5ELHR4X2Z3aW5mbyxzaXplb2YodHhfZndpbmZvXzgxOXhfdXNiKSk7CisJLy9SVF9ERUJVR19EQVRBKENPTVBfU0VORCx0eF9kZXNjLHNpemVvZih0eF9kZXNjXzgxOXhfdXNiKSk7CisKKwkvKiBUbyBzdWJtaXQgYnVsayB1cmIgKi8KKwl1c2JfZmlsbF9idWxrX3VyYih0eF91cmIsdWRldiwKKwkJCXVzYl9zbmRidWxrcGlwZSh1ZGV2LGlkeF9waXBlKSwgc2tiLT5kYXRhLAorCQkJc2tiLT5sZW4sIHJ0bDgxOTJfdHhfaXNyLCBza2IpOworCisJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodHhfdXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXN0YXR1cyl7CisvL3dlIG5lZWQgdG8gc2VuZCAwIGJ5dGUgcGFja2V0IHdoZW5ldmVyIDUxMk4gYnl0ZXMvNjROKEhJR04gU1BFRUQvTk9STUFMIFNQRUVEKSBieXRlcyBwYWNrZXQgaGFzIGJlZW4gdHJhbnNtaXR0ZWQuIE90aGVyd2lzZSwgaXQgd2lsbCBiZSBoYWx0IHRvIHdhaXQgZm9yIGFub3RoZXIgcGFja2V0LiBXQi4gMjAwOC4wOC4yNworCQlib29sIGJTZW5kMEJ5dGUgPSBmYWxzZTsKKwkJdTggemVybyA9IDA7CisJCWlmKHVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQorCQl7CisJCQlpZiAoc2tiLT5sZW4gPiAwICYmIHNrYi0+bGVuICUgNTEyID09IDApCisJCQkJYlNlbmQwQnl0ZSA9IHRydWU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoc2tiLT5sZW4gPiAwICYmIHNrYi0+bGVuICUgNjQgPT0gMCkKKwkJCQliU2VuZDBCeXRlID0gdHJ1ZTsKKwkJfQorCQlpZiAoYlNlbmQwQnl0ZSkKKwkJeworCQkJdHhfdXJiX3plcm8gPSB1c2JfYWxsb2NfdXJiKDAsR0ZQX0FUT01JQyk7CisJCQlpZighdHhfdXJiX3plcm8peworCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiY2FuJ3QgYWxsb2MgdXJiIGZvciB6ZXJvIGJ5dGVcbiIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJdXNiX2ZpbGxfYnVsa191cmIodHhfdXJiX3plcm8sdWRldiwKKwkJCQkJdXNiX3NuZGJ1bGtwaXBlKHVkZXYsaWR4X3BpcGUpLCAmemVybywKKwkJCQkJMCwgdHhfemVyb19pc3IsIGRldik7CisJCQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih0eF91cmJfemVybywgR0ZQX0FUT01JQyk7CisJCQlpZiAoc3RhdHVzKXsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCAiRXJyb3IgVFggVVJCIGZvciB6ZXJvIGJ5dGUgJWQsIGVycm9yICVkIiwgYXRvbWljX3JlYWQoJnByaXYtPnR4X3BlbmRpbmdbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSksIHN0YXR1cyk7CisJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCWF0b21pY19pbmMoJnByaXYtPnR4X3BlbmRpbmdbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSk7CisJCXJldHVybiAwOworCX1lbHNleworCQlSVF9UUkFDRShDT01QX0VSUiwgIkVycm9yIFRYIFVSQiAlZCwgZXJyb3IgJWQiLCBhdG9taWNfcmVhZCgmcHJpdi0+dHhfcGVuZGluZ1t0Y2JfZGVzYy0+cXVldWVfaW5kZXhdKSwKKwkJCQlzdGF0dXMpOworCQlyZXR1cm4gLTE7CisJfQorfQorCitzaG9ydCBydGw4MTkyX3VzYl9pbml0ZW5kcG9pbnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJcHJpdi0+cnhfdXJiID0gKHN0cnVjdCB1cmIqKikga21hbGxvYyAoc2l6ZW9mKHN0cnVjdCB1cmIqKSAqIChNQVhfUlhfVVJCKzEpLCBHRlBfS0VSTkVMKTsKKworI2lmbmRlZiBKQUNLU09OX05FV19SWAorCWZvcihpPTA7aTwoTUFYX1JYX1VSQisxKTtpKyspeworCisJCXByaXYtPnJ4X3VyYltpXSA9IHVzYl9hbGxvY191cmIoMCxHRlBfS0VSTkVMKTsKKworCQlwcml2LT5yeF91cmJbaV0tPnRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2MoUlhfVVJCX1NJWkUsIEdGUF9LRVJORUwpOworCisJCXByaXYtPnJ4X3VyYltpXS0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IFJYX1VSQl9TSVpFOworCX0KKyNlbmRpZgorCisjaWZkZWYgVEhPTUFTX0JFQUNPTgoreworCWxvbmcgYWxpZ24gPSAwOworCXZvaWQgKm9sZGFkZHIsICpuZXdhZGRyOworCisJcHJpdi0+cnhfdXJiWzE2XSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJcHJpdi0+b2xkYWRkciA9IGttYWxsb2MoMTYsIEdGUF9LRVJORUwpOworCW9sZGFkZHIgPSBwcml2LT5vbGRhZGRyOworCWFsaWduID0gKChsb25nKW9sZGFkZHIpICYgMzsKKwlpZiAoYWxpZ24pIHsKKwkJbmV3YWRkciA9IG9sZGFkZHIgKyA0IC0gYWxpZ247CisJCXByaXYtPnJ4X3VyYlsxNl0tPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAxNiAtIDQgKyBhbGlnbjsKKwl9IGVsc2UgeworCQluZXdhZGRyID0gb2xkYWRkcjsKKwkJcHJpdi0+cnhfdXJiWzE2XS0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDE2OworCX0KKwlwcml2LT5yeF91cmJbMTZdLT50cmFuc2Zlcl9idWZmZXIgPSBuZXdhZGRyOworfQorI2VuZGlmCisKKwltZW1zZXQocHJpdi0+cnhfdXJiLCAwLCBzaXplb2Yoc3RydWN0IHVyYiopICogTUFYX1JYX1VSQik7CisJcHJpdi0+cHBfcnhza2IgPSAoc3RydWN0IHNrX2J1ZmYgKiopa21hbGxvYyhzaXplb2Yoc3RydWN0IHNrX2J1ZmYgKikgKiBNQVhfUlhfVVJCLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJpdi0+cHBfcnhza2IgPT0gTlVMTCkKKwkJZ290byBkZXN0cm95OworCisJbWVtc2V0KHByaXYtPnBwX3J4c2tiLCAwLCBzaXplb2Yoc3RydWN0IHNrX2J1ZmYqKSAqIE1BWF9SWF9VUkIpOworCisJZ290byBfbWlkZGxlOworCisKK2Rlc3Ryb3k6CisJaWYgKHByaXYtPnBwX3J4c2tiKSB7CisJCWtmcmVlKHByaXYtPnBwX3J4c2tiKTsKKwl9CisJaWYgKHByaXYtPnJ4X3VyYikgeworCQlrZnJlZShwcml2LT5yeF91cmIpOworCX0KKworCXByaXYtPnBwX3J4c2tiID0gTlVMTDsKKwlwcml2LT5yeF91cmIgPSBOVUxMOworCisJRE1FU0dFKCJFbmRwb2ludCBBbGxvYyBGYWlsdXJlIik7CisJcmV0dXJuIC1FTk9NRU07CisKKworX21pZGRsZToKKworCXByaW50aygiRW5kIG9mIGluaXRlbmRwb2ludHNcbiIpOworCXJldHVybiAwOworCit9CisjaWZkZWYgVEhPTUFTX0JFQUNPTgordm9pZCBydGw4MTkyX3VzYl9kZWxldGVlbmRwb2ludHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZihwcml2LT5yeF91cmIpeworCQlmb3IoaT0wO2k8KE1BWF9SWF9VUkIrMSk7aSsrKXsKKwkJCXVzYl9raWxsX3VyYihwcml2LT5yeF91cmJbaV0pOworCQkJdXNiX2ZyZWVfdXJiKHByaXYtPnJ4X3VyYltpXSk7CisJCX0KKwkJa2ZyZWUocHJpdi0+cnhfdXJiKTsKKwkJcHJpdi0+cnhfdXJiID0gTlVMTDsKKwl9CisJaWYocHJpdi0+b2xkYWRkcil7CisJCWtmcmVlKHByaXYtPm9sZGFkZHIpOworCQlwcml2LT5vbGRhZGRyID0gTlVMTDsKKwl9CisJaWYgKHByaXYtPnBwX3J4c2tiKSB7CisJCWtmcmVlKHByaXYtPnBwX3J4c2tiKTsKKwkJcHJpdi0+cHBfcnhza2IgPSAwOworCX0KK30KKyNlbHNlCit2b2lkIHJ0bDgxOTJfdXNiX2RlbGV0ZWVuZHBvaW50cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworI2lmbmRlZiBKQUNLU09OX05FV19SWAorCisJaWYocHJpdi0+cnhfdXJiKXsKKwkJZm9yKGk9MDtpPChNQVhfUlhfVVJCKzEpO2krKyl7CisJCQl1c2Jfa2lsbF91cmIocHJpdi0+cnhfdXJiW2ldKTsKKwkJCWtmcmVlKHByaXYtPnJ4X3VyYltpXS0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJCXVzYl9mcmVlX3VyYihwcml2LT5yeF91cmJbaV0pOworCQl9CisJCWtmcmVlKHByaXYtPnJ4X3VyYik7CisJCXByaXYtPnJ4X3VyYiA9IE5VTEw7CisKKwl9CisjZWxzZQorCWlmKHByaXYtPnJ4X3VyYil7CisJCWtmcmVlKHByaXYtPnJ4X3VyYik7CisJCXByaXYtPnJ4X3VyYiA9IE5VTEw7CisJfQorCWlmKHByaXYtPm9sZGFkZHIpeworCQlrZnJlZShwcml2LT5vbGRhZGRyKTsKKwkJcHJpdi0+b2xkYWRkciA9IE5VTEw7CisJfQorCWlmIChwcml2LT5wcF9yeHNrYikgeworCQlrZnJlZShwcml2LT5wcF9yeHNrYik7CisJCXByaXYtPnBwX3J4c2tiID0gMDsKKworCX0KKworI2VuZGlmCit9CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgcnRsODE5Ml91cGRhdGVfcmF0cl90YWJsZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3ZvaWQgcnRsODE5Ml9saW5rX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworLy8JaW50IGk7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJLy93cml0ZV9uaWNfd29yZChkZXYsIEJDTl9JTlRSX0lUViwgbmV0LT5iZWFjb25faW50ZXJ2YWwpOworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCXsKKwkJcnRsODE5Ml9uZXRfdXBkYXRlKGRldik7CisJCXJ0bDgxOTJfdXBkYXRlX3JhdHJfdGFibGUoZGV2KTsKKwkJLy9hZGQgdGhpcyBhcyBpbiBwdXJlIE4gbW9kZSwgd2VwIGVuY3J5cHRpb24gd2lsbCB1c2Ugc29mdHdhcmUgd2F5LCBidXQgdGhlcmUgaXMgbm8gY2hhbmNlIHRvIHNldCB0aGlzIGFzIHdlcCB3aWxsIG5vdCBzZXQgZ3JvdXAga2V5IGluIHdleHQuIFdCLjIwMDguMDcuMDgKKwkJaWYgKChLRVlfVFlQRV9XRVA0MCA9PSBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSkgfHwgKEtFWV9UWVBFX1dFUDEwNCA9PSBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSkpCisJCUVuYWJsZUhXU2VjdXJpdHlDb25maWc4MTkyKGRldik7CisJfQorCS8qdXBkYXRlIHRpbWluZyBwYXJhbXMqLworLy8JUlRfVFJBQ0UoQ09NUF9DSCwgIj09PT09PT09PiVzKCksIGNoYW46JWRcbiIsIF9fRlVOQ1RJT05fXywgcHJpdi0+Y2hhbik7CisvLwlydGw4MTkyX3NldF9jaGFuKGRldiwgcHJpdi0+Y2hhbik7CisJIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEgfHwgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgdTMyIHJlZyA9IDA7CisgICAgICAgICAgICAgICAgcmVnID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBSQ1IpOworICAgICAgICAgICAgICAgIGlmIChwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCisgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5SZWNlaXZlQ29uZmlnID0gcmVnIHw9IFJDUl9DQlNTSUQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpdi0+UmVjZWl2ZUNvbmZpZyA9IHJlZyAmPSB+UkNSX0NCU1NJRDsKKyAgICAgICAgICAgICAgICB3cml0ZV9uaWNfZHdvcmQoZGV2LCBSQ1IsIHJlZyk7CisgICAgICAgIH0KKworLy8JcnRsODE5Ml9zZXRfcnhjb25mKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJzIGRlZl9xb3NfcGFyYW1ldGVycyA9IHsKKyAgICAgICAgezMsMywzLDN9LC8qIGN3X21pbiAqLworICAgICAgICB7Nyw3LDcsN30sLyogY3dfbWF4ICovCisgICAgICAgIHsyLDIsMiwyfSwvKiBhaWZzICovCisgICAgICAgIHswLDAsMCwwfSwvKiBmbGFncyAqLworICAgICAgICB7MCwwLDAsMH0gLyogdHhfb3BfbGltaXQgKi8KK307CisKKwordm9pZCBydGw4MTkyX3VwZGF0ZV9iZWFjb24oc3RydWN0IHdvcmtfc3RydWN0ICogd29yaykKK3sKKyAgICAgICAgc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHI4MTkyX3ByaXYsIHVwZGF0ZV9iZWFjb25fd3Eud29yayk7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5pZWVlODAyMTEtPmRldjsKKyAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKiBuZXQgPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOworCisJaWYgKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0KQorCQlIVFVwZGF0ZVNlbGZBbmRQZWVyU2V0dGluZyhpZWVlLCBuZXQpOworCWllZWUtPnBIVEluZm8tPmJDdXJyZW50UlQyUlRMb25nU2xvdFRpbWUgPSBuZXQtPmJzc2h0LmJkUlQyUlRMb25nU2xvdFRpbWU7CisJcnRsODE5Ml91cGRhdGVfY2FwKGRldiwgbmV0LT5jYXBhYmlsaXR5KTsKK30KKy8qCisqIGJhY2tncm91bmQgc3VwcG9ydCB0byBydW4gUW9TIGFjdGl2YXRlIGZ1bmN0aW9uYWxpdHkKKyovCitpbnQgV0RDQVBBUkFfQUREW10gPSB7RURDQVBBUkFfQkUsRURDQVBBUkFfQkssRURDQVBBUkFfVkksRURDQVBBUkFfVk99Owordm9pZCBydGw4MTkyX3Fvc19hY3RpdmF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKiB3b3JrKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByODE5Ml9wcml2LCBxb3NfYWN0aXZhdGUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5pZWVlODAyMTEtPmRldjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJzICpxb3NfcGFyYW1ldGVycyA9ICZwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5wYXJhbWV0ZXJzOworCXU4IG1vZGUgPSBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5tb2RlOworCS8vdTMyIHNpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVycyk7CisJdTggIHUxYkFJRlM7CisJdTMyIHU0YkFjUGFyYW07CisJaW50IGk7CisKKwlpZiAocHJpdiA9PSBOVUxMKQorCQlyZXR1cm47CisKKyAgICAgICBtdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKQorCQlnb3RvIHN1Y2Nlc3M7CisJUlRfVFJBQ0UoQ09NUF9RT1MsInFvcyBhY3RpdmUgcHJvY2VzcyB3aXRoIGFzc29jaWF0ZSByZXNwb25zZSByZWNlaXZlZFxuIik7CisJLyogSXQgYmV0dGVyIHNldCBzbG90IHRpbWUgYXQgZmlyc3QgKi8KKwkvKiBGb3Igd2UganVzdCBzdXBwb3J0IGIvZyBtb2RlIGF0IHByZXNlbnQsIGxldCB0aGUgc2xvdCB0aW1lIGF0IDkvMjAgc2VsZWN0aW9uICovCisJLyogdXBkYXRlIHRoZSBhYyBwYXJhbWV0ZXIgdG8gcmVsYXRlZCByZWdpc3RlcnMgKi8KKwlmb3IoaSA9IDA7IGkgPCAgUU9TX1FVRVVFX05VTTsgaSsrKSB7CisJCS8vTW9kZSBHL0E6IHNsb3RUaW1lVGltZXIgPSA5OyBNb2RlIEI6IDIwCisJCXUxYkFJRlMgPSBxb3NfcGFyYW1ldGVycy0+YWlmc1tpXSAqICgobW9kZSYoSUVFRV9HfElFRUVfTl8yNEcpKSA/OToyMCkgKyBhU2lmc1RpbWU7CisJCXU0YkFjUGFyYW0gPSAoKCgodTMyKShxb3NfcGFyYW1ldGVycy0+dHhfb3BfbGltaXRbaV0pKTw8IEFDX1BBUkFNX1RYT1BfTElNSVRfT0ZGU0VUKXwKKwkJCQkoKCh1MzIpKHFvc19wYXJhbWV0ZXJzLT5jd19tYXhbaV0pKTw8IEFDX1BBUkFNX0VDV19NQVhfT0ZGU0VUKXwKKwkJCQkoKCh1MzIpKHFvc19wYXJhbWV0ZXJzLT5jd19taW5baV0pKTw8IEFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUKXwKKwkJCQkoKHUzMil1MWJBSUZTIDw8IEFDX1BBUkFNX0FJRlNfT0ZGU0VUKSk7CisKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgV0RDQVBBUkFfQUREW2ldLCB1NGJBY1BhcmFtKTsKKwkJLy93cml0ZV9uaWNfZHdvcmQoZGV2LCBXRENBUEFSQV9BRERbaV0sIDB4MDA1ZTQzMzIpOworCX0KKworc3VjY2VzczoKKyAgICAgICBtdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKK30KKworc3RhdGljIGludCBydGw4MTkyX3Fvc19oYW5kbGVfcHJvYmVfcmVzcG9uc2Uoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsCisJCWludCBhY3RpdmVfbmV0d29yaywKKwkJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrKQoreworCWludCByZXQgPSAwOworCXUzMiBzaXplID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMpOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSAhPUlFRUU4MDIxMV9MSU5LRUQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBKSkKKwkJcmV0dXJuIHJldDsKKworCWlmIChuZXR3b3JrLT5mbGFncyAmIE5FVFdPUktfSEFTX1FPU19NQVNLKSB7CisJCWlmIChhY3RpdmVfbmV0d29yayAmJgorCQkJCShuZXR3b3JrLT5mbGFncyAmIE5FVFdPUktfSEFTX1FPU19QQVJBTUVURVJTKSkKKwkJCW5ldHdvcmstPnFvc19kYXRhLmFjdGl2ZSA9IG5ldHdvcmstPnFvc19kYXRhLnN1cHBvcnRlZDsKKworCQlpZiAoKG5ldHdvcmstPnFvc19kYXRhLmFjdGl2ZSA9PSAxKSAmJiAoYWN0aXZlX25ldHdvcmsgPT0gMSkgJiYKKwkJCQkobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0hBU19RT1NfUEFSQU1FVEVSUykgJiYKKwkJCQkobmV0d29yay0+cW9zX2RhdGEub2xkX3BhcmFtX2NvdW50ICE9CisJCQkJIG5ldHdvcmstPnFvc19kYXRhLnBhcmFtX2NvdW50KSkgeworCQkJbmV0d29yay0+cW9zX2RhdGEub2xkX3BhcmFtX2NvdW50ID0KKwkJCQluZXR3b3JrLT5xb3NfZGF0YS5wYXJhbV9jb3VudDsKKwkJCXF1ZXVlX3dvcmsocHJpdi0+cHJpdl93cSwgJnByaXYtPnFvc19hY3RpdmF0ZSk7CisJCQlSVF9UUkFDRSAoQ09NUF9RT1MsICJRb1MgcGFyYW1ldGVycyBjaGFuZ2UgY2FsbCAiCisJCQkJCSJxb3NfYWN0aXZhdGVcbiIpOworCQl9CisJfSBlbHNlIHsKKwkJbWVtY3B5KCZwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5wYXJhbWV0ZXJzLFwKKwkJICAgICAgICZkZWZfcW9zX3BhcmFtZXRlcnMsIHNpemUpOworCisJCWlmICgobmV0d29yay0+cW9zX2RhdGEuYWN0aXZlID09IDEpICYmIChhY3RpdmVfbmV0d29yayA9PSAxKSkgeworCQkJcXVldWVfd29yayhwcml2LT5wcml2X3dxLCAmcHJpdi0+cW9zX2FjdGl2YXRlKTsKKwkJCVJUX1RSQUNFKENPTVBfUU9TLCAiUW9TIHdhcyBkaXNhYmxlZCBjYWxsIHFvc19hY3RpdmF0ZSBcbiIpOworCQl9CisJCW5ldHdvcmstPnFvc19kYXRhLmFjdGl2ZSA9IDA7CisJCW5ldHdvcmstPnFvc19kYXRhLnN1cHBvcnRlZCA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGhhbmRsZSBtYW5hZ2UgZnJhbWUgZnJhbWUgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZSAqLworc3RhdGljIGludCBydGw4MTkyX2hhbmRsZV9iZWFjb24oc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2JlYWNvbiAqIGJlYWNvbiwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqIG5ldHdvcmspCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJcnRsODE5Ml9xb3NfaGFuZGxlX3Byb2JlX3Jlc3BvbnNlKHByaXYsMSxuZXR3b3JrKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+cHJpdl93cSwgJnByaXYtPnVwZGF0ZV9iZWFjb25fd3EsIDApOworCXJldHVybiAwOworCit9CisKKy8qCisqIGhhbmRsaW5nIHRoZSBiZWFjb25pbmcgcmVzcG9uc2VzLiBpZiB3ZSBnZXQgZGlmZmVyZW50IFFvUyBzZXR0aW5nCisqIG9mZiB0aGUgbmV0d29yayBmcm9tIHRoZSBhc3NvY2lhdGVkIHNldHRpbmcsIGFkanVzdCB0aGUgUW9TCisqIHNldHRpbmcKKyovCitzdGF0aWMgaW50IHJ0bDgxOTJfcW9zX2Fzc29jaWF0aW9uX3Jlc3Aoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaykKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBzaXplID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMpOworCWludCBzZXRfcW9zX3BhcmFtID0gMDsKKworCWlmICgocHJpdiA9PSBOVUxMKSB8fCAobmV0d29yayA9PSBOVUxMKSkKKwkJcmV0dXJuIHJldDsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgIT1JRUVFODAyMTFfTElOS0VEKQorCQlyZXR1cm4gcmV0OworCisJaWYgKChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSkpCisJCXJldHVybiByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aWVlZTgwMjExLT5sb2NrLCBmbGFncyk7CisJaWYobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0hBU19RT1NfUEFSQU1FVEVSUykgeworCQltZW1jcHkoJnByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnBhcmFtZXRlcnMsXAorCQkJICZuZXR3b3JrLT5xb3NfZGF0YS5wYXJhbWV0ZXJzLFwKKwkJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJzKSk7CisJCXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSA9IDE7CisJCSB7CisJCQlzZXRfcW9zX3BhcmFtID0gMTsKKwkJCS8qIHVwZGF0ZSBxb3MgcGFyYW1ldGVyIGZvciBjdXJyZW50IG5ldHdvcmsgKi8KKwkJCXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLm9sZF9wYXJhbV9jb3VudCA9IFwKKwkJCQkgcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEucGFyYW1fY291bnQ7CisJCQlwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5wYXJhbV9jb3VudCA9IFwKKwkJCQkgbmV0d29yay0+cW9zX2RhdGEucGFyYW1fY291bnQ7CisJCX0KKwl9IGVsc2UgeworCQltZW1jcHkoJnByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnBhcmFtZXRlcnMsXAorCQkgICAgICAgJmRlZl9xb3NfcGFyYW1ldGVycywgc2l6ZSk7CisJCXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSA9IDA7CisJCXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnN1cHBvcnRlZCA9IDA7CisJCXNldF9xb3NfcGFyYW0gPSAxOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmllZWU4MDIxMS0+bG9jaywgZmxhZ3MpOworCisJUlRfVFJBQ0UoQ09NUF9RT1MsICIlczogbmV0d29yay0+ZmxhZ3MgPSAlZCwlZFxuIixfX0ZVTkNUSU9OX18sbmV0d29yay0+ZmxhZ3MgLHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSk7CisJaWYgKHNldF9xb3NfcGFyYW0gPT0gMSkKKwkJcXVldWVfd29yayhwcml2LT5wcml2X3dxLCAmcHJpdi0+cW9zX2FjdGl2YXRlKTsKKworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHJ0bDgxOTJfaGFuZGxlX2Fzc29jX3Jlc3BvbnNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICpyZXNwLAorCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlydGw4MTkyX3Fvc19hc3NvY2lhdGlvbl9yZXNwKHByaXYsIG5ldHdvcmspOworCXJldHVybiAwOworfQorCisKK3ZvaWQgcnRsODE5Ml91cGRhdGVfcmF0cl90YWJsZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQorCS8vCVBPQ1RFVF9TVFJJTkcJcG9zTGVnYWN5UmF0ZSwKKwkvLwl1OCoJCQlwTWNzUmF0ZSkKKwkvLwlQUlRfV0xBTl9TVEEJcEVudHJ5KQoreworCXN0cnVjdCByODE5Ml9wcml2KiBwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwl1OCogcE1jc1JhdGUgPSBpZWVlLT5kb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0OworCS8vc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQgPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOworCXUzMiByYXRyX3ZhbHVlID0gMDsKKwl1OCByYXRlX2luZGV4ID0gMDsKKwlydGw4MTkyX2NvbmZpZ19yYXRlKGRldiwgKHUxNiopKCZyYXRyX3ZhbHVlKSk7CisJcmF0cl92YWx1ZSB8PSAoKih1MTYqKShwTWNzUmF0ZSkpIDw8IDEyOworLy8Jc3dpdGNoIChuZXQtPm1vZGUpCisJc3dpdGNoIChpZWVlLT5tb2RlKQorCXsKKwkJY2FzZSBJRUVFX0E6CisJCQlyYXRyX3ZhbHVlICY9IDB4MDAwMDBGRjA7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFX0I6CisJCQlyYXRyX3ZhbHVlICY9IDB4MDAwMDAwMEY7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFX0c6CisJCQlyYXRyX3ZhbHVlICY9IDB4MDAwMDBGRjc7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFX05fMjRHOgorCQljYXNlIElFRUVfTl81RzoKKwkJCWlmIChpZWVlLT5wSFRJbmZvLT5QZWVyTWltb1BzID09IDApIC8vTUlNT19QU19TVEFUSUMKKwkJCQlyYXRyX3ZhbHVlICY9IDB4MDAwN0YwMDc7CisJCQllbHNleworCQkJCWlmIChwcml2LT5yZl90eXBlID09IFJGXzFUMlIpCisJCQkJCXJhdHJfdmFsdWUgJj0gMHgwMDBGRjAwNzsKKwkJCQllbHNlCisJCQkJCXJhdHJfdmFsdWUgJj0gMHgwRjgxRjAwNzsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCXJhdHJfdmFsdWUgJj0gMHgwRkZGRkZGRjsKKwlpZihpZWVlLT5wSFRJbmZvLT5iQ3VyVHhCVzQwTUh6ICYmIGllZWUtPnBIVEluZm8tPmJDdXJTaG9ydEdJNDBNSHopeworCQlyYXRyX3ZhbHVlIHw9IDB4ODAwMDAwMDA7CisJfWVsc2UgaWYoIWllZWUtPnBIVEluZm8tPmJDdXJUeEJXNDBNSHogJiYgaWVlZS0+cEhUSW5mby0+YkN1clNob3J0R0kyME1Ieil7CisJCXJhdHJfdmFsdWUgfD0gMHg4MDAwMDAwMDsKKwl9CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUkFUUjArcmF0ZV9pbmRleCo0LCByYXRyX3ZhbHVlKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFVGV1AsIDEpOworfQorCitzdGF0aWMgdTggY2NtcF9pZVs0XSA9IHsweDAwLDB4NTAsMHhmMiwweDA0fTsKK3N0YXRpYyB1OCBjY21wX3Jzbl9pZVs0XSA9IHsweDAwLCAweDBmLCAweGFjLCAweDA0fTsKK2Jvb2wgR2V0Tm1vZGVTdXBwb3J0QnlTZWNDZmc4MTkyKHN0cnVjdCBuZXRfZGV2aWNlKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiogcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICogbmV0d29yayA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisJaW50IHdwYV9pZV9sZW49IGllZWUtPndwYV9pZV9sZW47CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdDsKKwlpbnQgZW5jcnlwdDsKKworCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKwkvL3dlIHVzZSBjb25uZWN0aW5nIEFQJ3MgY2FwYWJpbGl0eSBpbnN0ZWFkIG9mIG9ubHkgc2VjdXJpdHkgY29uZmlnIG9uIG91ciBkcml2ZXIgdG8gZGlzdGluZ3Vpc2ggd2hldGhlciBpdCBzaG91bGQgdXNlIE4gbW9kZSBvciBHIG1vZGUKKwllbmNyeXB0ID0gKG5ldHdvcmstPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkgfHwgKGllZWUtPmhvc3RfZW5jcnlwdCAmJiBjcnlwdCAmJiBjcnlwdC0+b3BzICYmICgwID09IHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCJXRVAiKSkpOworCisJLyogc2ltcGx5IGp1ZGdlICAqLworCWlmKGVuY3J5cHQgJiYgKHdwYV9pZV9sZW4gPT0gMCkpIHsKKwkJLyogd2VwIGVuY3J5cHRpb24sIG5vIE4gbW9kZSBzZXR0aW5nICovCisJCXJldHVybiBmYWxzZTsKKy8vCX0gZWxzZSBpZigod3BhX2llX2xlbiAhPSAwKSYmKG1lbWNtcCgmKGllZWUtPndwYV9pZVsxNF0pLGNjbXBfaWUsNCkpKSB7CisJfSBlbHNlIGlmKCh3cGFfaWVfbGVuICE9IDApKSB7CisJCS8qIHBhcnNlIHBhaXJ3aXNlIGtleSB0eXBlICovCisJCS8vaWYoKHBhaXJ3aXNla2V5ID0gV0VQNDApfHwocGFpcndpc2VrZXkgPSBXRVAxMDQpfHwocGFpcndpc2VrZXkgPSBUS0lQKSkKKwkJaWYgKCgoaWVlZS0+d3BhX2llWzBdID09IDB4ZGQpICYmICghbWVtY21wKCYoaWVlZS0+d3BhX2llWzE0XSksY2NtcF9pZSw0KSkpIHx8ICgoaWVlZS0+d3BhX2llWzBdID09IDB4MzApICYmICghbWVtY21wKCZpZWVlLT53cGFfaWVbMTBdLGNjbXBfcnNuX2llLCA0KSkpKQorCQkJcmV0dXJuIHRydWU7CisJCWVsc2UKKwkJCXJldHVybiBmYWxzZTsKKwl9IGVsc2UgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBHZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHM4MTl4VXNiKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJYm9vbAkJCVJldmFsOworCXN0cnVjdCByODE5Ml9wcml2KiBwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKworCWlmKGllZWUtPmJIYWxmV2lyZWxlc3NOMjRHTW9kZSA9PSB0cnVlKQorCQlSZXZhbCA9IHRydWU7CisJZWxzZQorCQlSZXZhbCA9ICBmYWxzZTsKKworCXJldHVybiBSZXZhbDsKK30KKwordm9pZCBydGw4MTkyX3JlZnJlc2hfc3VwcG9ydHJhdGUoc3RydWN0IHI4MTkyX3ByaXYqIHByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJLy93ZSBkb25vdCBjb25zaWRlciBzZXQgc3VwcG9ydCByYXRlIGZvciBBQkcgbW9kZSwgb25seSBIVCBNQ1MgcmF0ZSBpcyBzZXQgaGVyZS4KKwlpZiAoaWVlZS0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX05fMjRHIHx8IGllZWUtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9OXzVHKQorCXsKKwkJbWVtY3B5KGllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIGllZWUtPlJlZ0hUU3VwcFJhdGVTZXQsIDE2KTsKKwkJLy9SVF9ERUJVR19EQVRBKENPTVBfSU5JVCwgaWVlZS0+UmVnSFRTdXBwUmF0ZVNldCwgMTYpOworCQkvL1JUX0RFQlVHX0RBVEEoQ09NUF9JTklULCBpZWVlLT5SZWdkb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0LCAxNik7CisJfQorCWVsc2UKKwkJbWVtc2V0KGllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIDAsIDE2KTsKKwlyZXR1cm47Cit9CisKK3U4IHJ0bDgxOTJfZ2V0U3VwcG9ydGVkV2lyZWxlZU1vZGUoc3RydWN0IG5ldF9kZXZpY2UqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCByZXQgPSAwOworCXN3aXRjaChwcml2LT5yZl9jaGlwKQorCXsKKwkJY2FzZSBSRl84MjI1OgorCQljYXNlIFJGXzgyNTY6CisJCWNhc2UgUkZfUFNFVURPXzExTjoKKwkJCXJldCA9IChXSVJFTEVTU19NT0RFX05fMjRHfFdJUkVMRVNTX01PREVfR3xXSVJFTEVTU19NT0RFX0IpOworCQkJYnJlYWs7CisJCWNhc2UgUkZfODI1ODoKKwkJCXJldCA9IChXSVJFTEVTU19NT0RFX0F8V0lSRUxFU1NfTU9ERV9OXzVHKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gV0lSRUxFU1NfTU9ERV9COworCQkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9Cit2b2lkIHJ0bDgxOTJfU2V0V2lyZWxlc3NNb2RlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHU4IHdpcmVsZXNzX21vZGUpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IGJTdXBwb3J0TW9kZSA9IHJ0bDgxOTJfZ2V0U3VwcG9ydGVkV2lyZWxlZU1vZGUoZGV2KTsKKworCWlmICgod2lyZWxlc3NfbW9kZSA9PSBXSVJFTEVTU19NT0RFX0FVVE8pIHx8ICgod2lyZWxlc3NfbW9kZSZiU3VwcG9ydE1vZGUpPT0wKSkKKwl7CisJCWlmKGJTdXBwb3J0TW9kZSAmIFdJUkVMRVNTX01PREVfTl8yNEcpCisJCXsKKwkJCXdpcmVsZXNzX21vZGUgPSBXSVJFTEVTU19NT0RFX05fMjRHOworCQl9CisJCWVsc2UgaWYoYlN1cHBvcnRNb2RlICYgV0lSRUxFU1NfTU9ERV9OXzVHKQorCQl7CisJCQl3aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfTU9ERV9OXzVHOworCQl9CisJCWVsc2UgaWYoKGJTdXBwb3J0TW9kZSAmIFdJUkVMRVNTX01PREVfQSkpCisJCXsKKwkJCXdpcmVsZXNzX21vZGUgPSBXSVJFTEVTU19NT0RFX0E7CisJCX0KKwkJZWxzZSBpZigoYlN1cHBvcnRNb2RlICYgV0lSRUxFU1NfTU9ERV9HKSkKKwkJeworCQkJd2lyZWxlc3NfbW9kZSA9IFdJUkVMRVNTX01PREVfRzsKKwkJfQorCQllbHNlIGlmKChiU3VwcG9ydE1vZGUgJiBXSVJFTEVTU19NT0RFX0IpKQorCQl7CisJCQl3aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfTU9ERV9COworCQl9CisJCWVsc2V7CisJCQlSVF9UUkFDRShDT01QX0VSUiwgIiVzKCksIE5vIHZhbGlkIHdpcmVsZXNzIG1vZGUgc3VwcG9ydGVkLCBTdXBwb3J0ZWRXaXJlbGVzc01vZGUoJXgpISEhXG4iLCBfX0ZVTkNUSU9OX18sYlN1cHBvcnRNb2RlKTsKKwkJCXdpcmVsZXNzX21vZGUgPSBXSVJFTEVTU19NT0RFX0I7CisJCX0KKwl9CisjaWZkZWYgVE9fRE9fTElTVCAvLy8vIFRPRE86IHRoaXMgZnVuY3Rpb24gZG9lc24ndCB3b3JrIHdlbGwgYXQgdGhpcyB0aW1lLCB3ZSBzaG91ZCB3YWl0IGZvciBGUEdBCisJQWN0VXBkYXRlQ2hhbm5lbEFjY2Vzc1NldHRpbmcoIHBBZGFwdGVyLCBwSGFsRGF0YS0+Q3VycmVudFdpcmVsZXNzTW9kZSwgJnBBZGFwdGVyLT5NZ250SW5mby5JbmZvODE4NS5DaGFubmVsQWNjZXNzU2V0dGluZyApOworI2VuZGlmCisJcHJpdi0+aWVlZTgwMjExLT5tb2RlID0gd2lyZWxlc3NfbW9kZTsKKworCWlmICgod2lyZWxlc3NfbW9kZSA9PSBXSVJFTEVTU19NT0RFX05fMjRHKSB8fCAgKHdpcmVsZXNzX21vZGUgPT0gV0lSRUxFU1NfTU9ERV9OXzVHKSkKKwkJcHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvLT5iRW5hYmxlSFQgPSAxOworCWVsc2UKKwkJcHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvLT5iRW5hYmxlSFQgPSAwOworCVJUX1RSQUNFKENPTVBfSU5JVCwgIkN1cnJlbnQgV2lyZWxlc3MgTW9kZSBpcyAleFxuIiwgd2lyZWxlc3NfbW9kZSk7CisJcnRsODE5Ml9yZWZyZXNoX3N1cHBvcnRyYXRlKHByaXYpOworCit9CisvL2luaXQgcHJpdiB2YXJpYWJsZXMgaGVyZS4gb25seSBub25femVybyB2YWx1ZSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgaGVyZS4KK3N0YXRpYyB2b2lkIHJ0bDgxOTJfaW5pdF9wcml2X3ZhcmlhYmxlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IGk7CisJcHJpdi0+Y2FyZF84MTkyID0gTklDXzgxOTJVOworCXByaXYtPmNoYW4gPSAxOyAvL3NldCB0byBjaGFubmVsIDEKKwlwcml2LT5pZWVlODAyMTEtPm1vZGUgPSBXSVJFTEVTU19NT0RFX0FVVE87IC8vU0VUIEFVVE8KKwlwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPSBJV19NT0RFX0lORlJBOworCXByaXYtPmllZWU4MDIxMS0+aWVlZV91cD0wOworCXByaXYtPnJldHJ5X3J0cyA9IERFRkFVTFRfUkVUUllfUlRTOworCXByaXYtPnJldHJ5X2RhdGEgPSBERUZBVUxUX1JFVFJZX0RBVEE7CisJcHJpdi0+aWVlZTgwMjExLT5ydHMgPSBERUZBVUxUX1JUU19USFJFU0hPTEQ7CisJcHJpdi0+aWVlZTgwMjExLT5yYXRlID0gMTEwOyAvLzExIG1icHMKKwlwcml2LT5pZWVlODAyMTEtPnNob3J0X3Nsb3QgPSAxOworCXByaXYtPnByb21pc2MgPSAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSA/IDE6MDsKKwlwcml2LT5DY2tQd0VubCA9IDY7CisJLy9mb3Igc2lsZW50IHJlc2V0CisJcHJpdi0+SXJwUGVuZGluZ0NvdW50ID0gMTsKKwlwcml2LT5SZXNldFByb2dyZXNzID0gUkVTRVRfVFlQRV9OT1JFU0VUOworCXByaXYtPmJGb3JjZWRTaWxlbnRSZXNldCA9IDA7CisJcHJpdi0+YkRpc2FibGVOb3JtYWxSZXNldENoZWNrID0gZmFsc2U7CisJcHJpdi0+Zm9yY2VfcmVzZXQgPSBmYWxzZTsKKworCXByaXYtPmllZWU4MDIxMS0+RndSV1JGID0gMDsgCS8vd2UgZG9uJ3QgdXNlIEZXIHJlYWQvd3JpdGUgUkYgdW50aWwgc3RhYmxlIGZpcm13YXJlIGlzIGF2YWlsYWJsZS4KKwlwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgPSBERUZBVUxUX0JFQUNPTklOVEVSVkFMOworCXByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9IElXX01PREVfSU5GUkE7CisJcHJpdi0+aWVlZTgwMjExLT5zb2Z0bWFjX2ZlYXR1cmVzICA9IElFRUVfU09GVE1BQ19TQ0FOIHwKKwkJSUVFRV9TT0ZUTUFDX0FTU09DSUFURSB8IElFRUVfU09GVE1BQ19QUk9CRVJRIHwKKwkJSUVFRV9TT0ZUTUFDX1BST0JFUlMgfCBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgfAorCQlJRUVFX1NPRlRNQUNfQkVBQ09OUzsvL2FkZGVkIGJ5IGFteSAwODA2MDQgLy98ICAvL0lFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUU7CisKKwlwcml2LT5pZWVlODAyMTEtPmFjdGl2ZV9zY2FuID0gMTsKKwlwcml2LT5pZWVlODAyMTEtPm1vZHVsYXRpb24gPSBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04gfCBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OOworCXByaXYtPmllZWU4MDIxMS0+aG9zdF9lbmNyeXB0ID0gMTsKKwlwcml2LT5pZWVlODAyMTEtPmhvc3RfZGVjcnlwdCA9IDE7CisJcHJpdi0+aWVlZTgwMjExLT5zdGFydF9zZW5kX2JlYWNvbnMgPSBOVUxMOy8vcnRsODE5eHVzYl9iZWFjb25fdHg7Ly8tYnkgYW15IDA4MDYwNAorCXByaXYtPmllZWU4MDIxMS0+c3RvcF9zZW5kX2JlYWNvbnMgPSBOVUxMOy8vcnRsODE5Ml9iZWFjb25fc3RvcDsvLy1ieSBhbXkgMDgwNjA0CisJcHJpdi0+aWVlZTgwMjExLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdCA9IHJ0bDgxOTJfaGFyZF9zdGFydF94bWl0OworCXByaXYtPmllZWU4MDIxMS0+c2V0X2NoYW4gPSBydGw4MTkyX3NldF9jaGFuOworCXByaXYtPmllZWU4MDIxMS0+bGlua19jaGFuZ2UgPSBydGw4MTkyX2xpbmtfY2hhbmdlOworCXByaXYtPmllZWU4MDIxMS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCA9IHJ0bDgxOTJfaGFyZF9kYXRhX3htaXQ7CisJcHJpdi0+aWVlZTgwMjExLT5kYXRhX2hhcmRfc3RvcCA9IHJ0bDgxOTJfZGF0YV9oYXJkX3N0b3A7CisJcHJpdi0+aWVlZTgwMjExLT5kYXRhX2hhcmRfcmVzdW1lID0gcnRsODE5Ml9kYXRhX2hhcmRfcmVzdW1lOworCXByaXYtPmllZWU4MDIxMS0+aW5pdF93bW1wYXJhbV9mbGFnID0gMDsKKwlwcml2LT5pZWVlODAyMTEtPmZ0cyA9IERFRkFVTFRfRlJBR19USFJFU0hPTEQ7CisJcHJpdi0+aWVlZTgwMjExLT5jaGVja19uaWNfZW5vdWdoX2Rlc2MgPSBjaGVja19uaWNfZW5vdWdoX2Rlc2M7CisJcHJpdi0+aWVlZTgwMjExLT50eF9oZWFkcm9vbSA9IFRYX1BBQ0tFVF9TSElGVF9CWVRFUzsKKwlwcml2LT5pZWVlODAyMTEtPnFvc19zdXBwb3J0ID0gMTsKKworCS8vYWRkZWQgYnkgV0IKKy8vCXByaXYtPmllZWU4MDIxMS0+U3dDaG5sQnlUaW1lckhhbmRsZXIgPSBydGw4MTkyX3BoeV9Td0Nobmw7CisJcHJpdi0+aWVlZTgwMjExLT5TZXRCV01vZGVIYW5kbGVyID0gcnRsODE5Ml9TZXRCV01vZGU7CisJcHJpdi0+aWVlZTgwMjExLT5oYW5kbGVfYXNzb2NfcmVzcG9uc2UgPSBydGw4MTkyX2hhbmRsZV9hc3NvY19yZXNwb25zZTsKKwlwcml2LT5pZWVlODAyMTEtPmhhbmRsZV9iZWFjb24gPSBydGw4MTkyX2hhbmRsZV9iZWFjb247CisJLy9hZGRlZCBieSBkYXZpZAorCXByaXYtPmllZWU4MDIxMS0+R2V0Tm1vZGVTdXBwb3J0QnlTZWNDZmcgPSBHZXRObW9kZVN1cHBvcnRCeVNlY0NmZzgxOTI7CisJcHJpdi0+aWVlZTgwMjExLT5HZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyID0gR2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzODE5eFVzYjsKKwlwcml2LT5pZWVlODAyMTEtPlNldFdpcmVsZXNzTW9kZSA9IHJ0bDgxOTJfU2V0V2lyZWxlc3NNb2RlOworCS8vYWRkZWQgYnkgYW15CisJcHJpdi0+aWVlZTgwMjExLT5Jbml0aWFsR2FpbkhhbmRsZXIgPSBJbml0aWFsR2FpbjgxOXhVc2I7CisJcHJpdi0+Y2FyZF90eXBlID0gVVNCOworI2lmZGVmIFRPX0RPX0xJU1QKKwlpZihBZGFwdGVyLT5iSW5IY3RUZXN0KQorCXsKKwkJcEhhbERhdGEtPlNob3J0UmV0cnlMaW1pdCA9IDc7CisJCXBIYWxEYXRhLT5Mb25nUmV0cnlMaW1pdCA9IDc7CisJfQorI2VuZGlmCisJeworCQlwcml2LT5TaG9ydFJldHJ5TGltaXQgPSAweDMwOworCQlwcml2LT5Mb25nUmV0cnlMaW1pdCA9IDB4MzA7CisJfQorCXByaXYtPkVhcmx5UnhUaHJlc2hvbGQgPSA3OworCXByaXYtPmVuYWJsZV9ncGlvMCA9IDA7CisJcHJpdi0+VHJhbnNtaXRDb25maWcgPQorCS8vCVRDUl9EdXJQcm9jTW9kZSB8CS8vZm9yIFJUTDgxODVCLCBkdXJhdGlvbiBzZXR0aW5nIGJ5IEhXCisJLy8/CVRDUl9ESVNSZXFRc2l6ZSB8CisJCShUQ1JfTVhETUFfMjA0ODw8VENSX01YRE1BX09GRlNFVCl8ICAvLyBNYXggRE1BIEJ1cnN0IFNpemUgcGVyIFR4IERNQSBCdXJzdCwgNzogcmVzZXJ2aWVkLgorCQkocHJpdi0+U2hvcnRSZXRyeUxpbWl0PDxUQ1JfU1JMX09GRlNFVCl8CS8vIFNob3J0IHJldHJ5IGxpbWl0CisJCShwcml2LT5Mb25nUmV0cnlMaW1pdDw8VENSX0xSTF9PRkZTRVQpIHwJLy8gTG9uZyByZXRyeSBsaW1pdAorCQkoZmFsc2UgPyBUQ1JfU0FUOiAwKTsJLy8gRkFMU0U6IEhXIHByb3ZpZXMgUExDUCBsZW5ndGggYW5kIExFTkdFWFQsIFRVUkU6IFNXIHByb2l2ZWRzIHRoZW0KKyNpZmRlZiBUT19ET19MSVNUCisJaWYoQWRhcHRlci0+YkluSGN0VGVzdCkKKwkJcEhhbERhdGEtPlJlY2VpdmVDb25maWcJPQlwSGFsRGF0YS0+Q1NNZXRob2QgfAorCQkJCQkJUkNSX0FNRiB8IFJDUl9BREYgfAkvL1JDUl9BQVAgfCAJLy9hY2NlcHQgbWFuYWdlbWVudC9kYXRhCisJCQkJCQkvL2d1YW5nYW4yMDA3MTAKKwkJCQkJCVJDUl9BQ0YgfAkvL2FjY2VwdCBjb250cm9sIGZyYW1lIGZvciBTVyBBUCBuZWVkcyBQUy1wb2xsLCAyMDA1LjA3LjA3LCBieSByY25qa28uCisJCQkJCQlSQ1JfQUIgfCBSQ1JfQU0gfCBSQ1JfQVBNIHwJCS8vYWNjZXB0IEJDL01DL1VDCisJCQkJCQlSQ1JfQUlDViB8IFJDUl9BQ1JDMzIgfCAJCS8vYWNjZXB0IElDVi9DUkMgZXJyb3IgcGFja2V0CisJCQkJCQkoKHUzMik3PDxSQ1JfTVhETUFfT0ZGU0VUKSB8IC8vIE1heCBETUEgQnVyc3QgU2l6ZSBwZXIgUnggRE1BIEJ1cnN0LCA3OiB1bmxpbWl0ZWQuCisJCQkJCQkocEhhbERhdGEtPkVhcmx5UnhUaHJlc2hvbGQ8PFJDUl9GSUZPX09GRlNFVCkgfCAvLyBSeCBGSUZPIFRocmVzaG9sZCwgNzogTm8gUnggdGhyZXNob2xkLgorCQkJCQkJKHBIYWxEYXRhLT5FYXJseVJ4VGhyZXNob2xkID09IDcgPyBSQ1JfT25seUVybFBrdDowKTsKKwllbHNlCisKKyNlbmRpZgorCXByaXYtPlJlY2VpdmVDb25maWcJPQorCQlSQ1JfQU1GIHwgUkNSX0FERiB8CQkvL2FjY2VwdCBtYW5hZ2VtZW50L2RhdGEKKwkJUkNSX0FDRiB8CQkJLy9hY2NlcHQgY29udHJvbCBmcmFtZSBmb3IgU1cgQVAgbmVlZHMgUFMtcG9sbCwgMjAwNS4wNy4wNywgYnkgcmNuamtvLgorCQlSQ1JfQUIgfCBSQ1JfQU0gfCBSQ1JfQVBNIHwJLy9hY2NlcHQgQkMvTUMvVUMKKwkJLy9SQ1JfQUlDViB8IFJDUl9BQ1JDMzIgfCAJLy9hY2NlcHQgSUNWL0NSQyBlcnJvciBwYWNrZXQKKwkJKCh1MzIpNzw8UkNSX01YRE1BX09GRlNFVCl8IC8vIE1heCBETUEgQnVyc3QgU2l6ZSBwZXIgUnggRE1BIEJ1cnN0LCA3OiB1bmxpbWl0ZWQuCisJCShwcml2LT5FYXJseVJ4VGhyZXNob2xkPDxSWF9GSUZPX1RIUkVTSE9MRF9TSElGVCkgfCAvLyBSeCBGSUZPIFRocmVzaG9sZCwgNzogTm8gUnggdGhyZXNob2xkLgorCQkocHJpdi0+RWFybHlSeFRocmVzaG9sZCA9PSA3ID8gUkNSX09OTFlFUkxQS1Q6MCk7CisKKwlwcml2LT5BY21Db250cm9sID0gMDsKKwlwcml2LT5wRmlybXdhcmUgPSAocnRfZmlybXdhcmUqKWttYWxsb2Moc2l6ZW9mKHJ0X2Zpcm13YXJlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYtPnBGaXJtd2FyZSkKKwltZW1zZXQocHJpdi0+cEZpcm13YXJlLCAwLCBzaXplb2YocnRfZmlybXdhcmUpKTsKKworCS8qIHJ4IHJlbGF0ZWQgcXVldWUgKi8KKwlza2JfcXVldWVfaGVhZF9pbml0KCZwcml2LT5yeF9xdWV1ZSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcHJpdi0+c2tiX3F1ZXVlKTsKKworCS8qIFR4IHJlbGF0ZWQgcXVldWUgKi8KKwlmb3IoaSA9IDA7IGkgPCBNQVhfUVVFVUVfU0laRTsgaSsrKSB7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRIFtpXSk7CisJfQorCWZvcihpID0gMDsgaSA8IE1BWF9RVUVVRV9TSVpFOyBpKyspIHsKKwkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcHJpdi0+aWVlZTgwMjExLT5za2JfYWdnUSBbaV0pOworCX0KKwlmb3IoaSA9IDA7IGkgPCBNQVhfUVVFVUVfU0laRTsgaSsrKSB7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnByaXYtPmllZWU4MDIxMS0+c2tiX2Rydl9hZ2dRIFtpXSk7CisJfQorCXByaXYtPnJmX3NldF9jaGFuID0gcnRsODE5Ml9waHlfU3dDaG5sOworfQorCisvL2luaXQgbG9jayBoZXJlCitzdGF0aWMgdm9pZCBydGw4MTkyX2luaXRfcHJpdl9sb2NrKHN0cnVjdCByODE5Ml9wcml2KiBwcml2KQoreworCXNwaW5fbG9ja19pbml0KCZwcml2LT50eF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+aXJxX2xvY2spOy8vYWRkZWQgYnkgdGhvbWFzCisJLy9zcGluX2xvY2tfaW5pdCgmcHJpdi0+cmZfbG9jayk7CisJc2VtYV9pbml0KCZwcml2LT53eF9zZW0sMSk7CisJc2VtYV9pbml0KCZwcml2LT5yZl9zZW0sMSk7CisJbXV0ZXhfaW5pdCgmcHJpdi0+bXV0ZXgpOworfQorCitleHRlcm4gIHZvaWQgICAgcnRsODE5eF93YXRjaGRvZ193cWNhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKK3ZvaWQgcnRsODE5Ml9pcnFfcnhfdGFza2xldChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7CisvL2luaXQgdGFza2xldCBhbmQgd2FpdF9xdWV1ZSBoZXJlLiBvbmx5IDIuNiBhYm92ZSBrZXJuZWwgaXMgY29uc2lkZXJlZAorI2RlZmluZSBEUlZfTkFNRSAid2xhbjAiCitzdGF0aWMgdm9pZCBydGw4MTkyX2luaXRfcHJpdl90YXNrKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisjaWZkZWYgUEZfU1lOQ1RIUkVBRAorCXByaXYtPnByaXZfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKERSVl9OQU1FLDApOworI2Vsc2UKKwlwcml2LT5wcml2X3dxID0gY3JlYXRlX3dvcmtxdWV1ZShEUlZfTkFNRSk7CisjZW5kaWYKKworCUlOSVRfV09SSygmcHJpdi0+cmVzZXRfd3EsIHJ0bDgxOTJfcmVzdGFydCk7CisKKwkvL0lOSVRfREVMQVlFRF9XT1JLKCZwcml2LT53YXRjaF9kb2dfd3EsIGhhbF9kbV93YXRjaGRvZyk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPndhdGNoX2RvZ193cSwgcnRsODE5eF93YXRjaGRvZ193cWNhbGxiYWNrKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+dHhwb3dlcl90cmFja2luZ193cSwgIGRtX3R4cG93ZXJfdHJhY2tpbmdjYWxsYmFjayk7CisvLwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+Z3Bpb19jaGFuZ2VfcmZfd3EsICBkbV9ncGlvX2NoYW5nZV9yZl9jYWxsYmFjayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPnJmcGF0aF9jaGVja193cSwgIGRtX3JmX3BhdGhjaGVja193b3JraXRlbWNhbGxiYWNrKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+dXBkYXRlX2JlYWNvbl93cSwgcnRsODE5Ml91cGRhdGVfYmVhY29uKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+aW5pdGlhbGdhaW5fb3BlcmF0ZV93cSwgSW5pdGlhbEdhaW5PcGVyYXRlV29ya0l0ZW1DYWxsQmFjayk7CisJLy9JTklUX1dPUksoJnByaXYtPlN3Q2hubFdvcmtJdGVtLCAgcnRsODE5Ml9Td0NobmxfV29ya0l0ZW0pOworCS8vSU5JVF9XT1JLKCZwcml2LT5TZXRCV01vZGVXb3JrSXRlbSwgIHJ0bDgxOTJfU2V0QldNb2RlV29ya0l0ZW0pOworCUlOSVRfV09SSygmcHJpdi0+cW9zX2FjdGl2YXRlLCBydGw4MTkyX3Fvc19hY3RpdmF0ZSk7CisKKwl0YXNrbGV0X2luaXQoJnByaXYtPmlycV9yeF90YXNrbGV0LAorCSAgICAgKHZvaWQoKikodW5zaWduZWQgbG9uZykpcnRsODE5Ml9pcnFfcnhfdGFza2xldCwKKwkgICAgICh1bnNpZ25lZCBsb25nKXByaXYpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTkyX2dldF9lZXByb21fc2l6ZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXUxNiBjdXJDUiA9IDA7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCVJUX1RSQUNFKENPTVBfRVBST00sICI9PT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCWN1ckNSID0gcmVhZF9uaWNfd29yZF9FKGRldixFUFJPTV9DTUQpOworCVJUX1RSQUNFKENPTVBfRVBST00sICJyZWFkIGZyb20gUmVnIEVQUk9NX0NNRCgleCk6JXhcbiIsIEVQUk9NX0NNRCwgY3VyQ1IpOworCS8vd2hldGhlciBuZWVkIEkgY29uc2lkZXIgQklUNT8KKwlwcml2LT5lcHJvbXR5cGUgPSAoY3VyQ1IgJiBDbWQ5MzQ2Q1JfOTM1NlNFTCkgPyBFUFJPTV85M2M1NiA6IEVQUk9NXzkzYzQ2OworCVJUX1RSQUNFKENPTVBfRVBST00sICI8PT09PT09PT09PT0lcygpLCBlcHJvbXR5cGU6JWRcbiIsIF9fRlVOQ1RJT05fXywgcHJpdi0+ZXByb210eXBlKTsKK30KKworLy91c2VkIHRvIHN3YXAgZW5kaWFuLiBhcyBudG9obCAmIGh0b25sIGFyZSBub3QgbmVjY2Vzc2FyeSB0byBzd2FwIGVuZGlhbiwgc28gdXNlIHRoaXMgaW5zdGVhZC4KK3N0YXRpYyBpbmxpbmUgdTE2IGVuZGlhbl9zd2FwKHUxNiogZGF0YSkKK3sKKwl1MTYgdG1wID0gKmRhdGE7CisJKmRhdGEgPSAodG1wID4+IDgpIHwgKHRtcCA8PCA4KTsKKwlyZXR1cm4gKmRhdGE7Cit9CitzdGF0aWMgdm9pZCBydGw4MTkyX3JlYWRfZWVwcm9tX2luZm8oc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl1MTYgd0VQUk9NX0lEID0gMDsKKwl1OCBiTWFjX1RtcF9BZGRyWzZdID0gezB4MDAsIDB4ZTAsIDB4NGMsIDB4MDAsIDB4MDAsIDB4MDJ9OworCXU4IGJMb2FkX0Zyb21fRUVQT00gPSBmYWxzZTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTE2IHRtcFZhbHVlID0gMDsKKwlSVF9UUkFDRShDT01QX0VQUk9NLCAiPT09PT09PT09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwl3RVBST01fSUQgPSBlcHJvbV9yZWFkKGRldiwgMCk7IC8vZmlyc3QgcmVhZCBFRVBST00gSUQgb3V0OworCVJUX1RSQUNFKENPTVBfRVBST00sICJFRVBST00gSUQgaXMgMHgleFxuIiwgd0VQUk9NX0lEKTsKKworCWlmICh3RVBST01fSUQgIT0gUlRMODE5MF9FRVBST01fSUQpCisJeworCQlSVF9UUkFDRShDT01QX0VSUiwgIkVFUFJPTSBJRCBpcyBpbnZhbGlkKGlzIDB4JXgoc2hvdWxkIGJlIDB4JXgpXG4iLCB3RVBST01fSUQsIFJUTDgxOTBfRUVQUk9NX0lEKTsKKwl9CisJZWxzZQorCQliTG9hZF9Gcm9tX0VFUE9NID0gdHJ1ZTsKKworCWlmIChiTG9hZF9Gcm9tX0VFUE9NKQorCXsKKwkJdG1wVmFsdWUgPSBlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9WSUQ+PjEpKTsKKwkJcHJpdi0+ZWVwcm9tX3ZpZCA9IGVuZGlhbl9zd2FwKCZ0bXBWYWx1ZSk7CisJCXByaXYtPmVlcHJvbV9waWQgPSBlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9QSUQ+PjEpKTsKKwkJdG1wVmFsdWUgPSBlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9DaGFubmVsUGxhbj4+MSkpOworCQlwcml2LT5lZXByb21fQ2hhbm5lbFBsYW4gPSgodG1wVmFsdWUmMHhmZjAwKT4+OCk7CisJCXByaXYtPmJ0eHBvd2VyZGF0YV9yZWFkZnJvbUVFUE9STSA9IHRydWU7CisJCXByaXYtPmVlcHJvbV9DdXN0b21lcklEID0gZXByb21fcmVhZChkZXYsIChFRVBST01fQ3VzdG9tZXJfSUQ+PjEpKSA+Pjg7CisJfQorCWVsc2UKKwl7CisJCXByaXYtPmVlcHJvbV92aWQgPSAwOworCQlwcml2LT5lZXByb21fcGlkID0gMDsKKwkJcHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPSBWRVJTSU9OXzgxOXhVX0I7CisJCXByaXYtPmVlcHJvbV9DaGFubmVsUGxhbiA9IDA7CisJCXByaXYtPmVlcHJvbV9DdXN0b21lcklEID0gMDsKKwl9CisJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgInZpZDoweCU0eCwgcGlkOjB4JTR4LCBDdXN0b21JRDoweCUyeCwgQ2hhblBsYW46MHgleFxuIiwgcHJpdi0+ZWVwcm9tX3ZpZCwgcHJpdi0+ZWVwcm9tX3BpZCwgcHJpdi0+ZWVwcm9tX0N1c3RvbWVySUQsIHByaXYtPmVlcHJvbV9DaGFubmVsUGxhbik7CisJLy9zZXQgY2hhbm5lbHBsYW4gZnJvbSBlZXByb20KKwlwcml2LT5DaGFubmVsUGxhbiA9IHByaXYtPmVlcHJvbV9DaGFubmVsUGxhbjsKKwlpZiAoYkxvYWRfRnJvbV9FRVBPTSkKKwl7CisJCWludCBpOworCQlmb3IgKGk9MDsgaTw2OyBpKz0yKQorCQl7CisJCQl1MTYgdG1wID0gMDsKKwkJCXRtcCA9IGVwcm9tX3JlYWQoZGV2LCAodTE2KSgoRUVQUk9NX05PREVfQUREUkVTU19CWVRFXzAgKyBpKT4+MSkpOworCQkJKih1MTYqKSgmZGV2LT5kZXZfYWRkcltpXSkgPSB0bXA7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGJNYWNfVG1wX0FkZHIsIDYpOworCQkvL3Nob3VsZCBJIHNldCBJRFIwIGhlcmU/CisJfQorCVJUX1RSQUNFKENPTVBfRVBST00sICJNQUMgYWRkcjoiTUFDX0ZNVCJcbiIsIE1BQ19BUkcoZGV2LT5kZXZfYWRkcikpOworCXByaXYtPnJmX3R5cGUgPSBSVEw4MTlYX0RFRkFVTFRfUkZfVFlQRTsgLy9kZWZhdWx0IDFUMlIKKwlwcml2LT5yZl9jaGlwID0gUkZfODI1NjsKKworCWlmIChwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA9PSAodTgpVkVSU0lPTl84MTl4VV9BKQorCXsKKwkJLy9yZWFkIFR4IHBvd2VyIGdhaW4gb2Zmc2V0IG9mIGxlZ2FjeSBPRkRNIHRvIEhUIHJhdGUKKwkJaWYgKGJMb2FkX0Zyb21fRUVQT00pCisJCQlwcml2LT5FRVBST01UeFBvd2VyRGlmZiA9IChlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9UeFBvd2VyRGlmZj4+MSkpJjB4ZmYwMCkgPj4gODsKKwkJZWxzZQorCQkJcHJpdi0+RUVQUk9NVHhQb3dlckRpZmYgPSBFRVBST01fRGVmYXVsdF9UeFBvd2VyOworCQlSVF9UUkFDRShDT01QX0VQUk9NLCAiVHhQb3dlckRpZmY6JWRcbiIsIHByaXYtPkVFUFJPTVR4UG93ZXJEaWZmKTsKKwkJLy9yZWFkIFRoZXJtYWxNZXRlciBmcm9tIEVFUFJPTQorCQlpZiAoYkxvYWRfRnJvbV9FRVBPTSkKKwkJCXByaXYtPkVFUFJPTVRoZXJtYWxNZXRlciA9ICh1OCkoZXByb21fcmVhZChkZXYsIChFRVBST01fVGhlcm1hbE1ldGVyPj4xKSkmMHgwMGZmKTsKKwkJZWxzZQorCQkJcHJpdi0+RUVQUk9NVGhlcm1hbE1ldGVyID0gRUVQUk9NX0RlZmF1bHRfVGhlcm1hbE1ldGVyOworCQlSVF9UUkFDRShDT01QX0VQUk9NLCAiVGhlcm1hbE1ldGVyOiVkXG4iLCBwcml2LT5FRVBST01UaGVybWFsTWV0ZXIpOworCQkvL3ZpdmksIGZvciB0eCBwb3dlciB0cmFjaworCQlwcml2LT5UU1NJXzEzZEJtID0gcHJpdi0+RUVQUk9NVGhlcm1hbE1ldGVyICoxMDA7CisJCS8vcmVhZCBhbnRlbm5hIHR4IHBvd2VyIG9mZnNldCBvZiBCL0MvRCB0byBBIGZyb20gRUVQUk9NCisJCWlmIChiTG9hZF9Gcm9tX0VFUE9NKQorCQkJcHJpdi0+RUVQUk9NUHdEaWZmID0gKGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX1B3RGlmZj4+MSkpJjB4MGYwMCk+Pjg7CisJCWVsc2UKKwkJCXByaXYtPkVFUFJPTVB3RGlmZiA9IEVFUFJPTV9EZWZhdWx0X1B3RGlmZjsKKwkJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgIlR4UHdEaWZmOiVkXG4iLCBwcml2LT5FRVBST01Qd0RpZmYpOworCQkvLyBSZWFkIENyeXN0YWxDYXAgZnJvbSBFRVBST00KKwkJaWYgKGJMb2FkX0Zyb21fRUVQT00pCisJCQlwcml2LT5FRVBST01DcnlzdGFsQ2FwID0gKGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX0NyeXN0YWxDYXA+PjEpKSYweDBmKTsKKwkJZWxzZQorCQkJcHJpdi0+RUVQUk9NQ3J5c3RhbENhcCA9IEVFUFJPTV9EZWZhdWx0X0NyeXN0YWxDYXA7CisJCVJUX1RSQUNFKENPTVBfRVBST00sICJDcnlzdGFsQ2FwID0gJWRcbiIsIHByaXYtPkVFUFJPTUNyeXN0YWxDYXApOworCQkvL2dldCBwZXItY2hhbm5lbCBUeCBwb3dlciBsZXZlbAorCQlpZiAoYkxvYWRfRnJvbV9FRVBPTSkKKwkJCXByaXYtPkVFUFJPTV9EZWZfVmVyID0gKGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX1R4UHdJbmRleF9WZXI+PjEpKSYweGZmMDApPj44OworCQllbHNlCisJCQlwcml2LT5FRVBST01fRGVmX1ZlciA9IDE7CisJCVJUX1RSQUNFKENPTVBfRVBST00sICJFRVBST01fREVGX1ZFUjolZFxuIiwgcHJpdi0+RUVQUk9NX0RlZl9WZXIpOworCQlpZiAocHJpdi0+RUVQUk9NX0RlZl9WZXIgPT0gMCkgLy9vbGQgZWVwcm9tIGRlZmluaXRpb24KKwkJeworCQkJaW50IGk7CisJCQlpZiAoYkxvYWRfRnJvbV9FRVBPTSkKKwkJCQlwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0sgPSAoZXByb21fcmVhZChkZXYsIChFRVBST01fVHhQd0luZGV4X0NDSz4+MSkpJjB4ZmYpID4+IDg7CisJCQllbHNlCisJCQkJcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsQ0NLID0gMHgxMDsKKwkJCVJUX1RSQUNFKENPTVBfRVBST00sICJDQ0sgVHggUG93ZXIgTGV2bDogMHglMDJ4XG4iLCBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0spOworCQkJZm9yIChpPTA7IGk8MzsgaSsrKQorCQkJeworCQkJCWlmIChiTG9hZF9Gcm9tX0VFUE9NKQorCQkJCXsKKwkJCQkJdG1wVmFsdWUgPSBlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9UeFB3SW5kZXhfT0ZETV8yNEcraSk+PjEpOworCQkJCQlpZiAoKChFRVBST01fVHhQd0luZGV4X09GRE1fMjRHK2kpICUgMikgPT0gMCkKKwkJCQkJCXRtcFZhbHVlID0gdG1wVmFsdWUgJiAweDAwZmY7CisJCQkJCWVsc2UKKwkJCQkJCXRtcFZhbHVlID0gKHRtcFZhbHVlICYgMHhmZjAwKSA+PiA4OworCQkJCX0KKwkJCQllbHNlCisJCQkJCXRtcFZhbHVlID0gMHgxMDsKKwkJCQlwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxPRkRNMjRHW2ldID0gKHU4KSB0bXBWYWx1ZTsKKwkJCQlSVF9UUkFDRShDT01QX0VQUk9NLCAiT0ZETSAyLjRHIFR4IFBvd2VyIExldmVsLCBJbmRleCAlZCA9IDB4JTAyeFxuIiwgaSwgcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsQ0NLKTsKKwkJCX0KKwkJfS8vZW5kIGlmIEVFUFJPTV9ERUZfVkVSID09IDAKKwkJZWxzZSBpZiAocHJpdi0+RUVQUk9NX0RlZl9WZXIgPT0gMSkKKwkJeworCQkJaWYgKGJMb2FkX0Zyb21fRUVQT00pCisJCQl7CisJCQkJdG1wVmFsdWUgPSBlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9UeFB3SW5kZXhfQ0NLX1YxPj4xKSk7CisJCQkJdG1wVmFsdWUgPSAodG1wVmFsdWUgJiAweGZmMDApID4+IDg7CisJCQl9CisJCQllbHNlCisJCQkJdG1wVmFsdWUgPSAweDEwOworCQkJcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsQ0NLX1YxWzBdID0gKHU4KXRtcFZhbHVlOworCisJCQlpZiAoYkxvYWRfRnJvbV9FRVBPTSkKKwkJCQl0bXBWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX1R4UHdJbmRleF9DQ0tfVjEgKyAyKT4+MSk7CisJCQllbHNlCisJCQkJdG1wVmFsdWUgPSAweDEwMTA7CisJCQkqKCh1MTYqKSgmcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsQ0NLX1YxWzFdKSkgPSB0bXBWYWx1ZTsKKwkJCWlmIChiTG9hZF9Gcm9tX0VFUE9NKQorCQkJCXRtcFZhbHVlID0gZXByb21fcmVhZChkZXYsIChFRVBST01fVHhQd0luZGV4X09GRE1fMjRHX1YxPj4xKSk7CisJCQllbHNlCisJCQkJdG1wVmFsdWUgPSAweDEwMTA7CisJCQkqKCh1MTYqKSgmcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1swXSkpID0gdG1wVmFsdWU7CisJCQlpZiAoYkxvYWRfRnJvbV9FRVBPTSkKKwkJCQl0bXBWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX1R4UHdJbmRleF9PRkRNXzI0R19WMSsyKT4+MSk7CisJCQllbHNlCisJCQkJdG1wVmFsdWUgPSAweDEwOworCQkJcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1syXSA9ICh1OCl0bXBWYWx1ZTsKKwkJfS8vZW5kaWYgRUVQUk9NX0RlZl9WZXIgPT0gMQorCisJCS8vdXBkYXRlIEhBTCB2YXJpYWJsZXMKKwkJLy8KKwkJeworCQkJaW50IGk7CisJCQlmb3IgKGk9MDsgaTwxNDsgaSsrKQorCQkJeworCQkJCWlmIChpPD0zKQorCQkJCQlwcml2LT5UeFBvd2VyTGV2ZWxPRkRNMjRHW2ldID0gcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1swXTsKKwkJCQllbHNlIGlmIChpPj00ICYmIGk8PTkpCisJCQkJCXByaXYtPlR4UG93ZXJMZXZlbE9GRE0yNEdbaV0gPSBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxPRkRNMjRHWzFdOworCQkJCWVsc2UKKwkJCQkJcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R1tpXSA9IHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbE9GRE0yNEdbMl07CisJCQl9CisKKwkJCWZvciAoaT0wOyBpPDE0OyBpKyspCisJCQl7CisJCQkJaWYgKHByaXYtPkVFUFJPTV9EZWZfVmVyID09IDApCisJCQkJeworCQkJCQlpZiAoaTw9MykKKwkJCQkJCXByaXYtPlR4UG93ZXJMZXZlbENDS1tpXSA9IHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbE9GRE0yNEdbMF0gKyAocHJpdi0+RUVQUk9NVHhQb3dlckxldmVsQ0NLIC0gcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1sxXSk7CisJCQkJCWVsc2UgaWYgKGk+PTQgJiYgaTw9OSkKKwkJCQkJCXByaXYtPlR4UG93ZXJMZXZlbENDS1tpXSA9IHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbENDSzsKKwkJCQkJZWxzZQorCQkJCQkJcHJpdi0+VHhQb3dlckxldmVsQ0NLW2ldID0gcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1syXSArIChwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0sgLSBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxPRkRNMjRHWzFdKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAocHJpdi0+RUVQUk9NX0RlZl9WZXIgPT0gMSkKKwkJCQl7CisJCQkJCWlmIChpPD0zKQorCQkJCQkJcHJpdi0+VHhQb3dlckxldmVsQ0NLW2ldID0gcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsQ0NLX1YxWzBdOworCQkJCQllbHNlIGlmIChpPj00ICYmIGk8PTkpCisJCQkJCQlwcml2LT5UeFBvd2VyTGV2ZWxDQ0tbaV0gPSBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0tfVjFbMV07CisJCQkJCWVsc2UKKwkJCQkJCXByaXYtPlR4UG93ZXJMZXZlbENDS1tpXSA9IHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbENDS19WMVsyXTsKKwkJCQl9CisJCQl9CisJCX0vL2VuZCB1cGRhdGUgSEFMIHZhcmlhYmxlcworCQlwcml2LT5UeFBvd2VyRGlmZiA9IHByaXYtPkVFUFJPTVB3RGlmZjsKKy8vIEFudGVubmEgQiBnYWluIG9mZnNldCB0byBhbnRlbm5hIEEsIGJpdDB+MworCQlwcml2LT5BbnRlbm5hVHhQd0RpZmZbMF0gPSAocHJpdi0+RUVQUk9NVHhQb3dlckRpZmYgJiAweGYpOworCQkvLyBBbnRlbm5hIEMgZ2FpbiBvZmZzZXQgdG8gYW50ZW5uYSBBLCBiaXQ0fjcKKwkJcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzFdID0gKChwcml2LT5FRVBST01UeFBvd2VyRGlmZiAmIDB4ZjApPj40KTsKKwkJLy8gQ3J5c3RhbENhcCwgYml0MTJ+MTUKKwkJcHJpdi0+Q3J5c3RhbENhcCA9IHByaXYtPkVFUFJPTUNyeXN0YWxDYXA7CisJCS8vIFRoZXJtYWxNZXRlciwgYml0MH4zIGZvciBSRklDMSwgYml0NH43IGZvciBSRklDMgorCQkvLyA5MlUgZG9lcyBub3QgZW5hYmxlIFRYIHBvd2VyIHRyYWNraW5nLgorCQlwcml2LT5UaGVybWFsTWV0ZXJbMF0gPSBwcml2LT5FRVBST01UaGVybWFsTWV0ZXI7CisJfS8vZW5kIGlmIFZlcnNpb25JRCA9PSBWRVJTSU9OXzgxOXhVX0EKKworLy9hZGRlZCBieSB2aXZpLCBmb3IgZGxpbmsgbGVkLCAyMDA4MDQxNgorCXN3aXRjaChwcml2LT5lZXByb21fQ3VzdG9tZXJJRCkKKwl7CisJCWNhc2UgRUVQUk9NX0NJRF9SVU5UT1A6CisJCQlwcml2LT5DdXN0b21lcklEID0gUlRfQ0lEXzgxOXhfUlVOVE9QOworCQkJYnJlYWs7CisKKwkJY2FzZSBFRVBST01fQ0lEX0RMSU5LOgorCQkJcHJpdi0+Q3VzdG9tZXJJRCA9IFJUX0NJRF9ETElOSzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcml2LT5DdXN0b21lcklEID0gUlRfQ0lEX0RFRkFVTFQ7CisJCQlicmVhazsKKworCX0KKworCXN3aXRjaChwcml2LT5DdXN0b21lcklEKQorCXsKKwkJY2FzZSBSVF9DSURfODE5eF9SVU5UT1A6CisJCQlwcml2LT5MZWRTdHJhdGVneSA9IFNXX0xFRF9NT0RFMjsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfQ0lEX0RMSU5LOgorCQkJcHJpdi0+TGVkU3RyYXRlZ3kgPSBTV19MRURfTU9ERTQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpdi0+TGVkU3RyYXRlZ3kgPSBTV19MRURfTU9ERTA7CisJCQlicmVhazsKKworCX0KKworCisJaWYocHJpdi0+cmZfdHlwZSA9PSBSRl8xVDJSKQorCXsKKwkJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgIlxuMVQyUiBjb25maWdcbiIpOworCX0KKwllbHNlCisJeworCQlSVF9UUkFDRShDT01QX0VQUk9NLCAiXG4yVDRSIGNvbmZpZ1xuIik7CisJfQorCisJLy8gMjAwOC8wMS8xNiBNSCBXZSBjYW4gb25seSBrbm93IFJGIHR5cGUgaW4gdGhlIGZ1bmN0aW9uLiBTbyB3ZSBoYXZlIHRvIGluaXQKKwkvLyBESUcgUkFUUiB0YWJsZSBhZ2Fpbi4KKwlpbml0X3JhdGVfYWRhcHRpdmUoZGV2KTsKKwkvL3dlIG5lZWQgaW5pdCBESUcgUkFUUiB0YWJsZSBoZXJlIGFnYWluLgorCisJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgIjw9PT09PT09PT09PSVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuOworfQorCitzaG9ydCBydGw4MTkyX2dldF9jaGFubmVsX21hcChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKHByaXYtPkNoYW5uZWxQbGFuID4gQ09VTlRSWV9DT0RFX0dMT0JBTF9ET01BSU4peworCQlwcmludGsoInJ0bDgxODBfaW5pdDpFcnJvciBjaGFubmVsIHBsYW4hIFNldCB0byBkZWZhdWx0LlxuIik7CisJCXByaXYtPkNoYW5uZWxQbGFuPSAwOworCX0KKwlSVF9UUkFDRShDT01QX0lOSVQsICJDaGFubmVsIHBsYW4gaXMgJWRcbiIscHJpdi0+Q2hhbm5lbFBsYW4pOworCisJcnRsODE5eF9zZXRfY2hhbm5lbF9tYXAocHJpdi0+Q2hhbm5lbFBsYW4sIHByaXYpOworI2Vsc2UKKwlpbnQgY2gsaTsKKwkvL1NldCBEZWZhdWx0IENoYW5uZWwgUGxhbgorCWlmKCFjaGFubmVscyl7CisJCURNRVNHKCJObyBjaGFubmVscywgYWJvcnRpbmciKTsKKwkJcmV0dXJuIC0xOworCX0KKwljaD1jaGFubmVsczsKKwlwcml2LT5DaGFubmVsUGxhbj0gMDsvL2hpa2FydQorCSAvLyBzZXQgY2hhbm5lbHMgMS4uMTQgYWxsb3dlZCBpbiBnaXZlbiBsb2NhbGUKKwlmb3IgKGk9MTsgaTw9MTQ7IGkrKykgeworCQkocHJpdi0+aWVlZTgwMjExLT5jaGFubmVsX21hcClbaV0gPSAodTgpKGNoICYgMHgwMSk7CisJCWNoID4+PSAxOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitzaG9ydCBydGw4MTkyX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCW1lbXNldCgmKHByaXYtPnN0YXRzKSwwLHNpemVvZihzdHJ1Y3QgU3RhdHMpKTsKKwltZW1zZXQocHJpdi0+dHhxdWV1ZV90b19vdXRwaXBlbWFwLDAsOSk7CisjaWZkZWYgUElQRTEyCisJeworCQlpbnQgaT0wOworCQl1OCBxdWV1ZXRvcGlwZVtdPXszLDIsMSwwLDQsOCw3LDYsNX07CisJCW1lbWNweShwcml2LT50eHF1ZXVlX3RvX291dHBpcGVtYXAscXVldWV0b3BpcGUsOSk7CisvKgkJZm9yKGk9MDtpPDk7aSsrKQorCQkJcHJpbnRrKCIlZCAiLHByaXYtPnR4cXVldWVfdG9fb3V0cGlwZW1hcFtpXSk7CisJCXByaW50aygiXG4iKTsqLworCX0KKyNlbHNlCisJeworCQl1OCBxdWV1ZXRvcGlwZVtdPXszLDIsMSwwLDQsNCwwLDQsNH07CisJCW1lbWNweShwcml2LT50eHF1ZXVlX3RvX291dHBpcGVtYXAscXVldWV0b3BpcGUsOSk7CisvKgkJZm9yKGk9MDtpPDk7aSsrKQorCQkJcHJpbnRrKCIlZCAiLHByaXYtPnR4cXVldWVfdG9fb3V0cGlwZW1hcFtpXSk7CisJCXByaW50aygiXG4iKTsqLworCX0KKyNlbmRpZgorCXJ0bDgxOTJfaW5pdF9wcml2X3ZhcmlhYmxlKGRldik7CisJcnRsODE5Ml9pbml0X3ByaXZfbG9jayhwcml2KTsKKwlydGw4MTkyX2luaXRfcHJpdl90YXNrKGRldik7CisJcnRsODE5Ml9nZXRfZWVwcm9tX3NpemUoZGV2KTsKKwlydGw4MTkyX3JlYWRfZWVwcm9tX2luZm8oZGV2KTsKKwlydGw4MTkyX2dldF9jaGFubmVsX21hcChkZXYpOworCWluaXRfaGFsX2RtKGRldik7CisJaW5pdF90aW1lcigmcHJpdi0+d2F0Y2hfZG9nX3RpbWVyKTsKKwlwcml2LT53YXRjaF9kb2dfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlwcml2LT53YXRjaF9kb2dfdGltZXIuZnVuY3Rpb24gPSB3YXRjaF9kb2dfdGltZXJfY2FsbGJhY2s7CisJaWYocnRsODE5Ml91c2JfaW5pdGVuZHBvaW50cyhkZXYpIT0wKXsKKwkJRE1FU0coIkVuZG9wb2ludHMgaW5pdGlhbGl6YXRpb24gZmFpbGVkIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8vcnRsODE5Ml9hZGFwdGVyX3N0YXJ0KGRldik7CisjaWZkZWYgREVCVUdfRVBST00KKwlkdW1wX2Vwcm9tKGRldik7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gYWN0dWFsbHkgb25seSBzZXQgUlJTUiwgUkFUUiBhbmQgQldfT1BNT0RFIHJlZ2lzdGVycworICoJICAgICBub3QgdG8gZG8gYWxsIHRoZSBodyBjb25maWcgYXMgaXRzIG5hbWUgc2F5cworICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2CisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICBub3RpY2U6ICBUaGlzIHBhcnQgbmVlZCB0byBtb2RpZmllZCBhY2NvcmRpbmcgdG8gdGhlIHJhdGUgc2V0IHdlIGZpbHRlcmVkCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX2h3Y29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJdTMyIHJlZ1JBVFIgPSAwLCByZWdSUlNSID0gMDsKKwl1OCByZWdCd09wTW9kZSA9IDAsIHJlZ1RtcCA9IDA7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisvLyBTZXQgUlJTUiwgUkFUUiwgYW5kIEJXX09QTU9ERSByZWdpc3RlcnMKKwkvLworCXN3aXRjaChwcml2LT5pZWVlODAyMTEtPm1vZGUpCisJeworCWNhc2UgV0lSRUxFU1NfTU9ERV9COgorCQlyZWdCd09wTW9kZSA9IEJXX09QTU9ERV8yME1IWjsKKwkJcmVnUkFUUiA9IFJBVEVfQUxMX0NDSzsKKwkJcmVnUlJTUiA9IFJBVEVfQUxMX0NDSzsKKwkJYnJlYWs7CisJY2FzZSBXSVJFTEVTU19NT0RFX0E6CisJCXJlZ0J3T3BNb2RlID0gQldfT1BNT0RFXzVHIHxCV19PUE1PREVfMjBNSFo7CisJCXJlZ1JBVFIgPSBSQVRFX0FMTF9PRkRNX0FHOworCQlyZWdSUlNSID0gUkFURV9BTExfT0ZETV9BRzsKKwkJYnJlYWs7CisJY2FzZSBXSVJFTEVTU19NT0RFX0c6CisJCXJlZ0J3T3BNb2RlID0gQldfT1BNT0RFXzIwTUhaOworCQlyZWdSQVRSID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRzsKKwkJcmVnUlJTUiA9IFJBVEVfQUxMX0NDSyB8IFJBVEVfQUxMX09GRE1fQUc7CisJCWJyZWFrOworCWNhc2UgV0lSRUxFU1NfTU9ERV9BVVRPOgorI2lmZGVmIFRPX0RPX0xJU1QKKwkJaWYgKEFkYXB0ZXItPmJJbkhjdFRlc3QpCisJCXsKKwkJICAgIHJlZ0J3T3BNb2RlID0gQldfT1BNT0RFXzIwTUhaOworCQkgICAgcmVnUkFUUiA9IFJBVEVfQUxMX0NDSyB8IFJBVEVfQUxMX09GRE1fQUc7CisJCSAgICByZWdSUlNSID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRzsKKwkJfQorCQllbHNlCisjZW5kaWYKKwkJeworCQkgICAgcmVnQndPcE1vZGUgPSBCV19PUE1PREVfMjBNSFo7CisJCSAgICByZWdSQVRSID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRyB8IFJBVEVfQUxMX09GRE1fMVNTIHwgUkFURV9BTExfT0ZETV8yU1M7CisJCSAgICByZWdSUlNSID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRzsKKwkJfQorCQlicmVhazsKKwljYXNlIFdJUkVMRVNTX01PREVfTl8yNEc6CisJCS8vIEl0IHN1cHBvcnQgQ0NLIHJhdGUgYnkgZGVmYXVsdC4KKwkJLy8gQ0NLIHJhdGUgd2lsbCBiZSBmaWx0ZXJlZCBvdXQgb25seSB3aGVuIGFzc29jaWF0ZWQgQVAgZG9lcyBub3Qgc3VwcG9ydCBpdC4KKwkJcmVnQndPcE1vZGUgPSBCV19PUE1PREVfMjBNSFo7CisJCQlyZWdSQVRSID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRyB8IFJBVEVfQUxMX09GRE1fMVNTIHwgUkFURV9BTExfT0ZETV8yU1M7CisJCQlyZWdSUlNSID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRzsKKwkJYnJlYWs7CisJY2FzZSBXSVJFTEVTU19NT0RFX05fNUc6CisJCXJlZ0J3T3BNb2RlID0gQldfT1BNT0RFXzVHOworCQlyZWdSQVRSID0gUkFURV9BTExfT0ZETV9BRyB8IFJBVEVfQUxMX09GRE1fMVNTIHwgUkFURV9BTExfT0ZETV8yU1M7CisJCXJlZ1JSU1IgPSBSQVRFX0FMTF9PRkRNX0FHOworCQlicmVhazsKKwl9CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEJXX09QTU9ERSwgcmVnQndPcE1vZGUpOworCXsKKwkJdTMyIHJhdHJfdmFsdWUgPSAwOworCQlyYXRyX3ZhbHVlID0gcmVnUkFUUjsKKwkJaWYgKHByaXYtPnJmX3R5cGUgPT0gUkZfMVQyUikKKwkJeworCQkJcmF0cl92YWx1ZSAmPSB+KFJBVEVfQUxMX09GRE1fMlNTKTsKKwkJfQorCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSQVRSMCwgcmF0cl92YWx1ZSk7CisJCXdyaXRlX25pY19ieXRlKGRldiwgVUZXUCwgMSk7CisJfQorCXJlZ1RtcCA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDMxMyk7CisJcmVnUlJTUiA9ICgocmVnVG1wKSA8PCAyNCkgfCAocmVnUlJTUiAmIDB4MDBmZmZmZmYpOworCXdyaXRlX25pY19kd29yZChkZXYsIFJSU1IsIHJlZ1JSU1IpOworCisJLy8KKwkvLyBTZXQgUmV0cnkgTGltaXQgaGVyZQorCS8vCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRVRSWV9MSU1JVCwKKwkJCXByaXYtPlNob3J0UmV0cnlMaW1pdCA8PCBSRVRSWV9MSU1JVF9TSE9SVF9TSElGVCB8IFwKKwkJCXByaXYtPkxvbmdSZXRyeUxpbWl0IDw8IFJFVFJZX0xJTUlUX0xPTkdfU0hJRlQpOworCS8vIFNldCBDb250ZW50aW9uIFdpbmRvdyBoZXJlCisKKwkvLyBTZXQgVHggQUdDCisKKwkvLyBTZXQgVHggQW50ZW5uYSBpbmNsdWRpbmcgRmVlZGJhY2sgY29udHJvbAorCisJLy8gU2V0IEF1dG8gUmF0ZSBmYWxsYmFjayBjb250cm9sCisKKworfQorCisKKy8vSW5pdGlhbGl6ZUFkYXB0ZXIgYW5kIFBoeUNmZworYm9vbCBydGw4MTkyX2FkYXB0ZXJfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIGR3UmVnUmVhZCA9IDA7CisJYm9vbCBpbml0X3N0YXR1cyA9IHRydWU7CisJUlRfVFJBQ0UoQ09NUF9JTklULCAiPT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCXByaXYtPlJmX01vZGUgPSBSRl9PUF9CeV9TV18zd2lyZTsKKwkvL2ZvciBBU0lDIHBvd2VyIG9uIHNlcXVlbmNlCisJd3JpdGVfbmljX2J5dGVfRShkZXYsIDB4NWYsIDB4ODApOworCW1kZWxheSg1MCk7CisJd3JpdGVfbmljX2J5dGVfRShkZXYsIDB4NWYsIDB4ZjApOworCXdyaXRlX25pY19ieXRlX0UoZGV2LCAweDVkLCAweDAwKTsKKwl3cml0ZV9uaWNfYnl0ZV9FKGRldiwgMHg1ZSwgMHg4MCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCAweDE3LCAweDM3KTsKKwltZGVsYXkoMTApOworLy8jaWZkZWYgVE9fRE9fTElTVAorCXByaXYtPnBGaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID0gRldfU1RBVFVTXzBfSU5JVDsKKwkvL2NvbmZpZyBDUFVSZXNldCBSZWdpc3RlcgorCS8vRmlybXdhcmUgUmVzZXQgb3Igbm90PworCWR3UmVnUmVhZCA9IHJlYWRfbmljX2R3b3JkKGRldiwgQ1BVX0dFTik7CisJaWYgKHByaXYtPnBGaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID09IEZXX1NUQVRVU18wX0lOSVQpCisJCWR3UmVnUmVhZCB8PSBDUFVfR0VOX1NZU1RFTV9SRVNFVDsgLy9kbyBub3RoaW5nIGhlcmU/CisJZWxzZSBpZiAocHJpdi0+cEZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPT0gRldfU1RBVFVTXzVfUkVBRFkpCisJCWR3UmVnUmVhZCB8PSBDUFVfR0VOX0ZJUk1XQVJFX1JFU0VUOworCWVsc2UKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJFUlJPUiBpbiAlcygpOiB1bmRlZmluZWQgZmlybXdhcmUgc3RhdGUoJWQpXG4iLCBfX0ZVTkNUSU9OX18sICAgcHJpdi0+cEZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMpOworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgQ1BVX0dFTiwgZHdSZWdSZWFkKTsKKwkvL21kZWxheSgzMCk7CisJLy9jb25maWcgQkIuCisJcnRsODE5Ml9CQkNvbmZpZyhkZXYpOworCisJLy9Mb29wYmFjayBtb2RlIG9yIG5vdAorCXByaXYtPkxvb3BiYWNrTW9kZSA9IFJUTDgxOXhVX05PX0xPT1BCQUNLOworLy8JcHJpdi0+TG9vcGJhY2tNb2RlID0gUlRMODE5eFVfTUFDX0xPT1BCQUNLOworCisJZHdSZWdSZWFkID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBDUFVfR0VOKTsKKwlpZiAocHJpdi0+TG9vcGJhY2tNb2RlID09IFJUTDgxOXhVX05PX0xPT1BCQUNLKQorCQlkd1JlZ1JlYWQgPSAoKGR3UmVnUmVhZCAmIENQVV9HRU5fTk9fTE9PUEJBQ0tfTVNLKSB8IENQVV9HRU5fTk9fTE9PUEJBQ0tfU0VUKTsKKwllbHNlIGlmIChwcml2LT5Mb29wYmFja01vZGUgPT0gUlRMODE5eFVfTUFDX0xPT1BCQUNLKQorCQlkd1JlZ1JlYWQgfD0gQ1BVX0NDS19MT09QQkFDSzsKKwllbHNlCisJCVJUX1RSQUNFKENPTVBfRVJSLCAiU2VyaW91cyBlcnJvciBpbiAlcygpOiB3cm9uZyBsb29wYmFjayBtb2RlIHNldHRpbmcoJWQpXG4iLCBfX0ZVTkNUSU9OX18sICBwcml2LT5Mb29wYmFja01vZGUpOworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgQ1BVX0dFTiwgZHdSZWdSZWFkKTsKKworCS8vYWZ0ZXIgcmVzZXQgY3B1LCB3ZSBuZWVkIHdhaXQgZm9yIGEgc2Vjb25kcyB0byB3cml0ZSBpbiByZWdpc3Rlci4KKwl1ZGVsYXkoNTAwKTsKKworCS8veGlvbmcgYWRkIGZvciBuZXcgYml0ZmlsZTp1c2Igc3VzcGVuZCByZXNldCBwaW4gc2V0IHRvIDEuIC8vZG8gd2UgbmVlZD8KKwl3cml0ZV9uaWNfYnl0ZV9FKGRldiwgMHg1ZiwgKHJlYWRfbmljX2J5dGVfRShkZXYsIDB4NWYpfDB4MjApKTsKKworCS8vU2V0IEhhcmR3YXJlCisJcnRsODE5Ml9od2NvbmZpZyhkZXYpOworCisJLy90dXJuIG9uIFR4L1J4CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDTURSLCBDUl9SRXxDUl9URSk7CisKKwkvL3NldCBJRFIwIGhlcmUKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBNQUMwLCAoKHUzMiopZGV2LT5kZXZfYWRkcilbMF0pOworCXdyaXRlX25pY193b3JkKGRldiwgTUFDNCwgKCh1MTYqKShkZXYtPmRldl9hZGRyICsgNCkpWzBdKTsKKworCS8vc2V0IFJDUgorCXdyaXRlX25pY19kd29yZChkZXYsIFJDUiwgcHJpdi0+UmVjZWl2ZUNvbmZpZyk7CisKKwkvL0luaXRpYWxpemUgTnVtYmVyIG9mIFJlc2VydmVkIFBhZ2VzIGluIEZpcm13YXJlIFF1ZXVlCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUlFQTjEsICBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CSyA8PCBSU1ZEX0ZXX1FVRVVFX1BBR0VfQktfU0hJRlQgfFwKKwkJCQkJCU5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JFIDw8IFJTVkRfRldfUVVFVUVfUEFHRV9CRV9TSElGVCB8IFwKKwkJCQkJCU5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZJIDw8IFJTVkRfRldfUVVFVUVfUEFHRV9WSV9TSElGVCB8IFwKKwkJCQkJCU5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZPIDw8UlNWRF9GV19RVUVVRV9QQUdFX1ZPX1NISUZUKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSUVBOMiwgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfTUdOVCA8PCBSU1ZEX0ZXX1FVRVVFX1BBR0VfTUdOVF9TSElGVCB8XAorCQkJCQkJTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQ01EIDw8IFJTVkRfRldfUVVFVUVfUEFHRV9DTURfU0hJRlQpOworCXdyaXRlX25pY19kd29yZChkZXYsIFJRUE4zLCBBUFBMSUVEX1JFU0VSVkVEX1FVRVVFX0lOX0ZXfCBcCisJCQkJCQlOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CQ048PFJTVkRfRldfUVVFVUVfUEFHRV9CQ05fU0hJRlQKKy8vCQkJCQkJfCBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9QVUI8PFJTVkRfRldfUVVFVUVfUEFHRV9QVUJfU0hJRlQKKwkJCQkJCSk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUkFUUjArNCo3LCAoUkFURV9BTExfT0ZETV9BRyB8IFJBVEVfQUxMX0NDSykpOworCisJLy9TZXQgQWNrVGltZW91dAorCS8vIFRPRE86IChpdCB2YWx1ZSBpcyBvbmx5IGZvciBGUEdBIHZlcnNpb24pLiBuZWVkIHRvIGJlIGNoYW5nZWQhITIwMDYuMTIuMTgsIGJ5IEVtaWx5CisJd3JpdGVfbmljX2J5dGUoZGV2LCBBQ0tfVElNRU9VVCwgMHgzMCk7CisKKy8vCVJUX1RSQUNFKENPTVBfSU5JVCwgIiVzKCk6cHJpdi0+UmVzZXRQcm9ncmVzcyBpcyAlZFxuIiwgX19GVU5DVElPTl9fLHByaXYtPlJlc2V0UHJvZ3Jlc3MpOworCWlmKHByaXYtPlJlc2V0UHJvZ3Jlc3MgPT0gUkVTRVRfVFlQRV9OT1JFU0VUKQorCXJ0bDgxOTJfU2V0V2lyZWxlc3NNb2RlKGRldiwgcHJpdi0+aWVlZTgwMjExLT5tb2RlKTsKKwlpZihwcml2LT5SZXNldFByb2dyZXNzID09IFJFU0VUX1RZUEVfTk9SRVNFVCl7CisJQ2FtUmVzZXRBbGxFbnRyeShkZXYpOworCXsKKwkJdTggU0VDUl92YWx1ZSA9IDB4MDsKKwkJU0VDUl92YWx1ZSB8PSBTQ1JfVHhFbmNFbmFibGU7CisJCVNFQ1JfdmFsdWUgfD0gU0NSX1J4RGVjRW5hYmxlOworCQlTRUNSX3ZhbHVlIHw9IFNDUl9Ob1NLTUM7CisJCXdyaXRlX25pY19ieXRlKGRldiwgU0VDUiwgU0VDUl92YWx1ZSk7CisJfQorCX0KKworCS8vQmVhY29uIHJlbGF0ZWQKKwl3cml0ZV9uaWNfd29yZChkZXYsIEFUSU1XTkQsIDIpOworCXdyaXRlX25pY193b3JkKGRldiwgQkNOX0lOVEVSVkFMLCAxMDApOworCisJeworI2RlZmluZSBERUZBVUxUX0VEQ0EgMHgwMDVlNDMzMgorCQlpbnQgaTsKKwkJZm9yIChpPTA7IGk8UU9TX1FVRVVFX05VTTsgaSsrKQorCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRENBUEFSQV9BRERbaV0sIERFRkFVTFRfRURDQSk7CisJfQorI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCisJLy8zIEZvciB1c2IgcnggZmlybXdhcmUgYWdncmVnYXRpb24gY29udHJvbAorCWlmKHByaXYtPlJlc2V0UHJvZ3Jlc3MgPT0gUkVTRVRfVFlQRV9OT1JFU0VUKQorCXsKKwkJdTMyIHVsVmFsdWU7CisJCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IHByaXYtPmllZWU4MDIxMS0+cEhUSW5mbzsKKwkJdWxWYWx1ZSA9IChwSFRJbmZvLT5Vc2JSeEZ3QWdnckVuPDwyNCkgfCAocEhUSW5mby0+VXNiUnhGd0FnZ3JQYWdlTnVtPDwxNikgfAorCQkJCQkocEhUSW5mby0+VXNiUnhGd0FnZ3JQYWNrZXROdW08PDgpIHwgKHBIVEluZm8tPlVzYlJ4RndBZ2dyVGltZW91dCk7CisJCS8qCisJCSAqIElmIHVzYiByeCBmaXJtd2FyZSBhZ2dyZWdhdGlvbiBpcyBlbmFibGVkLAorCQkgKiB3aGVuIGFueW9uZSBvZiB0aHJlZSB0aHJlc2hvbGQgY29uZGl0aW9ucyBhYm92ZSBpcyByZWFjaGVkLAorCQkgKiBmaXJtd2FyZSB3aWxsIHNlbmQgYWdncmVnYXRlZCBwYWNrZXQgdG8gZHJpdmVyLgorCQkgKi8KKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgMHgxYTgsIHVsVmFsdWUpOworCQlwcml2LT5iQ3VycmVudFJ4QWdnckVuYWJsZSA9IHRydWU7CisJfQorI2VuZGlmCisKKwlydGw4MTkyX3BoeV9jb25maWdtYWMoZGV2KTsKKworCWlmIChwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA9PSAodTgpIFZFUlNJT05fODE5eFVfQSkKKwl7CisJCXJ0bDgxOTJfcGh5X2dldFR4UG93ZXIoZGV2KTsKKwkJcnRsODE5Ml9waHlfc2V0VHhQb3dlcihkZXYsIHByaXYtPmNoYW4pOworCX0KKworCS8vRmlybXdhcmUgZG93bmxvYWQKKwlpbml0X3N0YXR1cyA9IGluaXRfZmlybXdhcmUoZGV2KTsKKwlpZighaW5pdF9zdGF0dXMpCisJeworCQlSVF9UUkFDRShDT01QX0VSUiwiRVJSISEhICVzKCk6IEZpcm13YXJlIGRvd25sb2FkIGlzIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIGluaXRfc3RhdHVzOworCX0KKwlSVF9UUkFDRShDT01QX0lOSVQsICIlcygpOmFmdGVyIGZpcm13YXJlIGRvd25sb2FkXG4iLCBfX0ZVTkNUSU9OX18pOworCS8vCisjaWZkZWYgVE9fRE9fTElTVAoraWYoQWRhcHRlci0+UmVzZXRQcm9ncmVzcyA9PSBSRVNFVF9UWVBFX05PUkVTRVQpCisJeworCQlpZihwTWdudEluZm8tPlJlZ1JmT2ZmID09IFRSVUUpCisJCXsgLy8gVXNlciBkaXNhYmxlIFJGIHZpYSByZWdpc3RyeS4KKwkJCVJUX1RSQUNFKChDT01QX0lOSVR8Q09NUF9SRiksIERCR19MT1VELCAoIkluaXRpYWxpemVBZGFwdGVyODE5eFVzYigpOiBUdXJuIG9mZiBSRiBmb3IgUmVnUmZPZmYgLS0tLS0tLS0tLVxuIikpOworCQkJTWdudEFjdFNldF9SRl9TdGF0ZShBZGFwdGVyLCBlUmZPZmYsIFJGX0NIQU5HRV9CWV9TVyk7CisJCQkvLyBUaG9zZSBhY3Rpb24gd2lsbCBiZSBkaXNjYXJkIGluIE1nbnRBY3RTZXRfUkZfU3RhdGUgYmVjYXVzZSBvZmYgdGhlIHNhbWUgc3RhdGUKKwkJCWZvcihlUkZQYXRoID0gMDsgZVJGUGF0aCA8cEhhbERhdGEtPk51bVRvdGFsUkZQYXRoOyBlUkZQYXRoKyspCisJCQkJUEhZX1NldFJGUmVnKEFkYXB0ZXIsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCAweDQsIDB4QzAwLCAweDApOworCQl9CisJCWVsc2UgaWYocE1nbnRJbmZvLT5SZk9mZlJlYXNvbiA+IFJGX0NIQU5HRV9CWV9QUykKKwkJeyAvLyBIL1cgb3IgUy9XIFJGIE9GRiBiZWZvcmUgc2xlZXAuCisJCQlSVF9UUkFDRSgoQ09NUF9JTklUfENPTVBfUkYpLCBEQkdfTE9VRCwgKCJJbml0aWFsaXplQWRhcHRlcjgxOXhVc2IoKTogVHVybiBvZmYgUkYgZm9yIFJmT2ZmUmVhc29uKCVkKSAtLS0tLS0tLS0tXG4iLCBwTWdudEluZm8tPlJmT2ZmUmVhc29uKSk7CisJCQlNZ250QWN0U2V0X1JGX1N0YXRlKEFkYXB0ZXIsIGVSZk9mZiwgcE1nbnRJbmZvLT5SZk9mZlJlYXNvbik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwSGFsRGF0YS0+ZVJGUG93ZXJTdGF0ZSA9IGVSZk9uOworCQkJcE1nbnRJbmZvLT5SZk9mZlJlYXNvbiA9IDA7CisJCQlSVF9UUkFDRSgoQ09NUF9JTklUfENPTVBfUkYpLCBEQkdfTE9VRCwgKCJJbml0aWFsaXplQWRhcHRlcjgxOXhVc2IoKTogUkYgaXMgb24gLS0tLS0tLS0tLVxuIikpOworCQl9CisJfQorCWVsc2UKKwl7CisJCWlmKHBIYWxEYXRhLT5lUkZQb3dlclN0YXRlID09IGVSZk9mZikKKwkJeworCQkJTWdudEFjdFNldF9SRl9TdGF0ZShBZGFwdGVyLCBlUmZPZmYsIHBNZ250SW5mby0+UmZPZmZSZWFzb24pOworCQkJLy8gVGhvc2UgYWN0aW9uIHdpbGwgYmUgZGlzY2FyZCBpbiBNZ250QWN0U2V0X1JGX1N0YXRlIGJlY2F1c2Ugb2ZmIHRoZSBzYW1lIHN0YXRlCisJCQlmb3IoZVJGUGF0aCA9IDA7IGVSRlBhdGggPHBIYWxEYXRhLT5OdW1Ub3RhbFJGUGF0aDsgZVJGUGF0aCsrKQorCQkJCVBIWV9TZXRSRlJlZyhBZGFwdGVyLCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgMHg0LCAweEMwMCwgMHgwKTsKKwkJfQorCX0KKyNlbmRpZgorCS8vY29uZmlnIFJGLgorCWlmKHByaXYtPlJlc2V0UHJvZ3Jlc3MgPT0gUkVTRVRfVFlQRV9OT1JFU0VUKXsKKwlydGw4MTkyX3BoeV9SRkNvbmZpZyhkZXYpOworCVJUX1RSQUNFKENPTVBfSU5JVCwgIiVzKCk6YWZ0ZXIgcGh5IFJGIGNvbmZpZ1xuIiwgX19GVU5DVElPTl9fKTsKKwl9CisKKworCWlmKHByaXYtPmllZWU4MDIxMS0+RndSV1JGKQorCQkvLyBXZSBjYW4gZm9yY2UgZmlybXdhcmUgdG8gZG8gUkYtUi9XCisJCXByaXYtPlJmX01vZGUgPSBSRl9PUF9CeV9GVzsKKwllbHNlCisJCXByaXYtPlJmX01vZGUgPSBSRl9PUF9CeV9TV18zd2lyZTsKKworCisJcnRsODE5Ml9waHlfdXBkYXRlSW5pdEdhaW4oZGV2KTsKKwkvKi0tc2V0IENDSyBhbmQgT0ZETSBCbG9jayAiT04iLS0qLworCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfUkZNT0QsIGJDQ0tFbiwgMHgxKTsKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX1JGTU9ELCBiT0ZETUVuLCAweDEpOworCisJaWYocHJpdi0+UmVzZXRQcm9ncmVzcyA9PSBSRVNFVF9UWVBFX05PUkVTRVQpCisJeworCQkvL2lmIEQgb3IgQyBjdXQKKwkJdTggdG1wdmFsdWUgPSByZWFkX25pY19ieXRlKGRldiwgMHgzMDEpOworCQlpZih0bXB2YWx1ZSA9PTB4MDMpCisJCXsKKwkJCXByaXYtPmJEY3V0ID0gVFJVRTsKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJELWN1dFxuIik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcml2LT5iRGN1dCA9IEZBTFNFOworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIkMtY3V0XG4iKTsKKwkJfQorCQlkbV9pbml0aWFsaXplX3R4cG93ZXJfdHJhY2tpbmcoZGV2KTsKKworCQlpZihwcml2LT5iRGN1dCA9PSBUUlVFKQorCQl7CisJCQl1MzIgaSwgVGVtcENDazsKKwkJCXUzMiB0bXBSZWdBPSBydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsYk1hc2tEV29yZCk7CisJCS8vCXUzMiB0bXBSZWdDPSBydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LHJPRkRNMF9YQ1R4SVFJbWJhbGFuY2UsYk1hc2tEV29yZCk7CisJCQlmb3IoaSA9IDA7IGk8VHhCQkdhaW5UYWJsZUxlbmd0aDsgaSsrKQorCQkJeworCQkJCWlmKHRtcFJlZ0EgPT0gcHJpdi0+dHhiYmdhaW5fdGFibGVbaV0udHhiYmdhaW5fdmFsdWUpCisJCQkJeworCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXg9ICh1OClpOworCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbD0gKHU4KWk7CisJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdfZGVmYXVsdD0gcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4OworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCVRlbXBDQ2sgPSBydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjEsIGJNYXNrQnl0ZTIpOworCisJCQlmb3IoaT0wIDsgaTxDQ0tUeEJCR2FpblRhYmxlTGVuZ3RoIDsgaSsrKQorCQkJeworCisJCQkJaWYoVGVtcENDayA9PSBwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbaV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdKQorCQkJCXsKKwkJCQkJcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXzIwTWRlZmF1bHQ9KHU4KSBpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fNDBNZGVmYXVsdD0gMDsKKwkJCXByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl9kaWZmZXJlbmNlPSAwOworCQkJcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uID0gcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXzIwTWRlZmF1bHQ7CisKKwkvLwkJcE1nbnRJbmZvLT5iVFhQb3dlclRyYWNraW5nID0gRkFMU0U7Ly9URU1QTFkgRElTQUJMRQorCQl9CisJfQorCXdyaXRlX25pY19ieXRlKGRldiwgMHg4NywgMHgwKTsKKworCisJcmV0dXJuIGluaXRfc3RhdHVzOworfQorCisvKiB0aGlzIGNvbmZpZ3VyZXMgcmVnaXN0ZXJzIGZvciBiZWFjb24gdHggYW5kIGVuYWJsZXMgaXQgdmlhCisgKiBydGw4MTkyX2JlYWNvbl90eF9lbmFibGUoKS4gcnRsODE5Ml9iZWFjb25fdHhfZGlzYWJsZSgpIG1pZ2h0CisgKiBiZSB1c2VkIHRvIHN0b3AgYmVhY29uIHRyYW5zbWlzc2lvbgorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLU5FVCBTVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnJ0bDgxOTJfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlyZXR1cm4gJnByaXYtPmllZWU4MDIxMS0+c3RhdHM7Cit9CisKK2Jvb2wKK0hhbFR4Q2hlY2tTdHVjazgxOXhVc2IoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorCSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTE2IAkJUmVnVHhDb3VudGVyID0gcmVhZF9uaWNfd29yZChkZXYsIDB4MTI4KTsKKwlib29sCQliU3R1Y2sgPSBGQUxTRTsKKwlSVF9UUkFDRShDT01QX1JFU0VULCIlcygpOlJlZ1R4Q291bnRlciBpcyAlZCxUeENvdW50ZXIgaXMgJWRcbiIsX19GVU5DVElPTl9fLFJlZ1R4Q291bnRlcixwcml2LT5UeENvdW50ZXIpOworCWlmKHByaXYtPlR4Q291bnRlcj09UmVnVHhDb3VudGVyKQorCQliU3R1Y2sgPSBUUlVFOworCisJcHJpdi0+VHhDb3VudGVyID0gUmVnVHhDb3VudGVyOworCisJcmV0dXJuIGJTdHVjazsKK30KKworLyoKKyoJPEFzc3VtcHRpb246IFJUX1RYX1NQSU5MT0NLIGlzIGFjcXVpcmVkLj4KKyoJRmlyc3QgYWRkZWQ6IDIwMDYuMTEuMTkgYnkgZW1pbHkKKyovCitSRVNFVF9UWVBFCitUeENoZWNrU3R1Y2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTgJCQlRdWV1ZUlEOworLy8JUFJUX1RDQgkJCXBUY2I7CisvLwl1OAkJCVJlc2V0VGhyZXNob2xkOworCWJvb2wJCQliQ2hlY2tGd1R4Q250ID0gZmFsc2U7CisJLy91bnNpZ25lZCBsb25nIGZsYWdzOworCisJLy8KKwkvLyBEZWNpZGUgU3R1Y2ggdGhyZXNob2xkIGFjY29yZGluZyB0byBjdXJyZW50IHBvd2VyIHNhdmUgbW9kZQorCS8vCisKKy8vICAgICBSVF9UUkFDRShDT01QX1JFU0VULCAiID09PiBUeENoZWNrU3R1Y2soKVxuIik7CisvLwkgICAgIFBsYXRmb3JtQWNxdWlyZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1RYX1NQSU5MT0NLKTsKKy8vCSAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmllZWU4MDIxMS0+bG9jayxmbGFncyk7CisJICAgICBmb3IgKFF1ZXVlSUQgPSAwOyBRdWV1ZUlEPD1CRUFDT05fUVVFVUU7UXVldWVJRCArKykKKwkgICAgIHsKKwkgICAgIAkJaWYoUXVldWVJRCA9PSBUWENNRF9RVUVVRSkKKwkJICAgICAgICAgY29udGludWU7CisjaWZkZWYgVVNCX1RYX0RSSVZFUl9BR0dSRUdBVElPTl9FTkFCTEUKKwkJCWlmKChza2JfcXVldWVfbGVuKCZwcml2LT5pZWVlODAyMTEtPnNrYl93YWl0UVtRdWV1ZUlEXSkgPT0gMCkgJiYgKHNrYl9xdWV1ZV9sZW4oJnByaXYtPmllZWU4MDIxMS0+c2tiX2FnZ1FbUXVldWVJRF0pID09IDApICYmIChza2JfcXVldWVfbGVuKCZwcml2LT5pZWVlODAyMTEtPnNrYl9kcnZfYWdnUVtRdWV1ZUlEXSkgPT0gMCkpCisjZWxzZQorCQkgICAgIAlpZigoc2tiX3F1ZXVlX2xlbigmcHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFFbUXVldWVJRF0pID09IDApICAmJiAoc2tiX3F1ZXVlX2xlbigmcHJpdi0+aWVlZTgwMjExLT5za2JfYWdnUVtRdWV1ZUlEXSkgPT0gMCkpCisjZW5kaWYKKwkJCSAJY29udGludWU7CisKKwkgICAgICAgICAgICAgYkNoZWNrRndUeENudCA9IHRydWU7CisJICAgICB9CisvLwkgICAgIFBsYXRmb3JtUmVsZWFzZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1RYX1NQSU5MT0NLKTsKKy8vCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmllZWU4MDIxMS0+bG9jayxmbGFncyk7CisvLwlSVF9UUkFDRShDT01QX1JFU0VULCJiQ2hlY2tGd1R4Q250IGlzICVkXG4iLGJDaGVja0Z3VHhDbnQpOworCWlmKGJDaGVja0Z3VHhDbnQpCisJeworCQlpZihIYWxUeENoZWNrU3R1Y2s4MTl4VXNiKGRldikpCisJCXsKKwkJCVJUX1RSQUNFKENPTVBfUkVTRVQsICJUeENoZWNrU3R1Y2soKTogRncgaW5kaWNhdGVzIG5vIFR4IGNvbmRpdGlvbiEgXG4iKTsKKwkJCXJldHVybiBSRVNFVF9UWVBFX1NJTEVOVDsKKwkJfQorCX0KKwlyZXR1cm4gUkVTRVRfVFlQRV9OT1JFU0VUOworfQorCitib29sCitIYWxSeENoZWNrU3R1Y2s4MTl4VXNiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTE2IAlSZWdSeENvdW50ZXIgPSByZWFkX25pY193b3JkKGRldiwgMHgxMzApOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlib29sIGJTdHVjayA9IEZBTFNFOworCXN0YXRpYyB1OAlyeF9jaGtfY250ID0gMDsKKwlSVF9UUkFDRShDT01QX1JFU0VULCIlcygpOiBSZWdSeENvdW50ZXIgaXMgJWQsUnhDb3VudGVyIGlzICVkXG4iLF9fRlVOQ1RJT05fXyxSZWdSeENvdW50ZXIscHJpdi0+UnhDb3VudGVyKTsKKwkvLyBJZiByc3NpIGlzIHNtYWxsLCB3ZSBzaG91bGQgY2hlY2sgcnggZm9yIGxvbmcgdGltZSBiZWNhdXNlIG9mIGJhZCByeC4KKwkvLyBvciBtYXliZSBpdCB3aWxsIGNvbnRpbnVvdXMgc2lsZW50IHJlc2V0IGV2ZXJ5IDIgc2Vjb25kcy4KKwlyeF9jaGtfY250Kys7CisJaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSAoUmF0ZUFkYXB0aXZlVEhfSGlnaCs1KSkKKwl7CisJCXJ4X2Noa19jbnQgPSAwOwkvL2hpZ2ggcnNzaSwgY2hlY2sgcnggc3R1Y2sgcmlnaHQgbm93LgorCX0KKwllbHNlIGlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCAoUmF0ZUFkYXB0aXZlVEhfSGlnaCs1KSAmJgorCQkoKHByaXYtPkN1cnJlbnRDaGFubmVsQlchPUhUX0NIQU5ORUxfV0lEVEhfMjAmJnByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGI+PVJhdGVBZGFwdGl2ZVRIX0xvd180ME0pIHx8CisJCShwcml2LT5DdXJyZW50Q2hhbm5lbEJXPT1IVF9DSEFOTkVMX1dJRFRIXzIwJiZwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiPj1SYXRlQWRhcHRpdmVUSF9Mb3dfMjBNKSkgKQorCXsKKwkJaWYocnhfY2hrX2NudCA8IDIpCisJCXsKKwkJCXJldHVybiBiU3R1Y2s7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyeF9jaGtfY250ID0gMDsKKwkJfQorCX0KKwllbHNlIGlmKCgocHJpdi0+Q3VycmVudENoYW5uZWxCVyE9SFRfQ0hBTk5FTF9XSURUSF8yMCYmcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYjxSYXRlQWRhcHRpdmVUSF9Mb3dfNDBNKSB8fAorCQkocHJpdi0+Q3VycmVudENoYW5uZWxCVz09SFRfQ0hBTk5FTF9XSURUSF8yMCYmcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYjxSYXRlQWRhcHRpdmVUSF9Mb3dfMjBNKSkgJiYKKwkJcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSBWZXJ5TG93UlNTSSkKKwl7CisJCWlmKHJ4X2Noa19jbnQgPCA0KQorCQl7CisJCQkvL0RiZ1ByaW50KCJSU1NJIDwgJWQgJiYgUlNTSSA+PSAlZCwgbm8gY2hlY2sgdGhpcyB0aW1lIFxuIiwgUmF0ZUFkYXB0aXZlVEhfTG93LCBWZXJ5TG93UlNTSSk7CisJCQlyZXR1cm4gYlN0dWNrOworCQl9CisJCWVsc2UKKwkJeworCQkJcnhfY2hrX2NudCA9IDA7CisJCQkvL0RiZ1ByaW50KCJSU1NJIDwgJWQgJiYgUlNTSSA+PSAlZCwgY2hlY2sgdGhpcyB0aW1lIFxuIiwgUmF0ZUFkYXB0aXZlVEhfTG93LCBWZXJ5TG93UlNTSSk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYocnhfY2hrX2NudCA8IDgpCisJCXsKKwkJCS8vRGJnUHJpbnQoIlJTU0kgPD0gJWQsIG5vIGNoZWNrIHRoaXMgdGltZSBcbiIsIFZlcnlMb3dSU1NJKTsKKwkJCXJldHVybiBiU3R1Y2s7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyeF9jaGtfY250ID0gMDsKKwkJCS8vRGJnUHJpbnQoIlJTU0kgPD0gJWQsIGNoZWNrIHRoaXMgdGltZSBcbiIsIFZlcnlMb3dSU1NJKTsKKwkJfQorCX0KKworCWlmKHByaXYtPlJ4Q291bnRlcj09UmVnUnhDb3VudGVyKQorCQliU3R1Y2sgPSBUUlVFOworCisJcHJpdi0+UnhDb3VudGVyID0gUmVnUnhDb3VudGVyOworCisJcmV0dXJuIGJTdHVjazsKK30KKworUkVTRVRfVFlQRQorUnhDaGVja1N0dWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vaW50ICAgICAgICAgICAgICAgICAgICAgaTsKKwlib29sICAgICAgICBiUnhDaGVjayA9IEZBTFNFOworCisvLyAgICAgICBSVF9UUkFDRShDT01QX1JFU0VULCIgPT0+IFJ4Q2hlY2tTdHVjaygpXG4iKTsKKwkvL1BsYXRmb3JtQWNxdWlyZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1JYX1NQSU5MT0NLKTsKKworCSBpZihwcml2LT5JcnBQZW5kaW5nQ291bnQgPiAxKQorCQliUnhDaGVjayA9IFRSVUU7CisgICAgICAgLy9QbGF0Zm9ybVJlbGVhc2VTcGluTG9jayhBZGFwdGVyLCBSVF9SWF9TUElOTE9DSyk7CisKKy8vICAgICAgIFJUX1RSQUNFKENPTVBfUkVTRVQsImJSeENoZWNrIGlzICVkIFxuIixiUnhDaGVjayk7CisJaWYoYlJ4Q2hlY2spCisJeworCQlpZihIYWxSeENoZWNrU3R1Y2s4MTl4VXNiKGRldikpCisJCXsKKwkJCVJUX1RSQUNFKENPTVBfUkVTRVQsICJSeFN0dWNrIENvbmRpdGlvblxuIik7CisJCQlyZXR1cm4gUkVTRVRfVFlQRV9TSUxFTlQ7CisJCX0KKwl9CisJcmV0dXJuIFJFU0VUX1RZUEVfTk9SRVNFVDsKK30KKworCisvKioKKyoJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQ2hlY2tmb3JoYW5nIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIGFzayBPUyB0byByZXNldCBkcml2ZXIKKyoKKyoJXHBhcmFtIHBBZGFwdGVyCVRoZSBhZGFwdGVyIGNvbnRleHQgZm9yIHRoaXMgbWluaXBvcnQKKyoKKyoJTm90ZTpOSUMgd2l0aCBVU0IgaW50ZXJmYWNlIHNob2x1ZCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGJlY2F1c2Ugd2UgY2Fubm90IHNjYW4gZGVzY3JpcHRvcgorKgl0byBqdWRnZSB3aGV0aGVyIHRoZXJlIGlzIHR4IHN0dWNrLgorKglOb3RlOiBUaGlzIGZ1bmN0aW9uIG1heSBiZSByZXF1aXJlZCB0byBiZSByZXdyaXRlIGZvciBWaXN0YSBPUy4KKyoJPDw8QXNzdW1wdGlvbjogVHggc3BpbmxvY2sgaGFzIGJlZW4gYWNxdWlyZWQgPj4+CisqCisqCTgxODUgYW5kIDgxODViIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLiBUaGlzIGlzIGFkZGVkIGJ5IEVtaWx5IGF0IDIwMDYuMTEuMjQKKyovCitSRVNFVF9UWVBFCitydGw4MTl4X2lmY2hlY2tfcmVzZXRvcm5vdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlSRVNFVF9UWVBFCVR4UmVzZXRUeXBlID0gUkVTRVRfVFlQRV9OT1JFU0VUOworCVJFU0VUX1RZUEUJUnhSZXNldFR5cGUgPSBSRVNFVF9UWVBFX05PUkVTRVQ7CisJUlRfUkZfUE9XRVJfU1RBVEUgCXJmU3RhdGU7CisKKwlyZlN0YXRlID0gcHJpdi0+aWVlZTgwMjExLT5lUkZQb3dlclN0YXRlOworCisJVHhSZXNldFR5cGUgPSBUeENoZWNrU3R1Y2soZGV2KTsKKwlpZiggcmZTdGF0ZSAhPSBlUmZPZmYgfHwKKwkJLypBREFQVEVSX1RFU1RfU1RBVFVTX0ZMQUcoQWRhcHRlciwgQURBUFRFUl9TVEFUVVNfRldfRE9XTkxPQURfRkFJTFVSRSkpICYmKi8KKwkJKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSAhPSBJV19NT0RFX0FESE9DKSkKKwl7CisJCS8vIElmIGRyaXZlciBpcyBpbiB0aGUgc3RhdHVzIG9mIGZpcm13YXJlIGRvd25sb2FkIGZhaWx1cmUgLCBkcml2ZXIgc2tpcHMgUkYgaW5pdGlhbGl6YXRpb24gYW5kIFJGIGlzCisJCS8vIGluIHR1cm5lZCBvZmYgc3RhdGUuIERyaXZlciBzaG91bGQgY2hlY2sgd2hldGhlciBSeCBzdHVjayBhbmQgZG8gc2lsZW50IHJlc2V0LiBBbmQKKwkJLy8gaWYgZHJpdmVyIGlzIGluIGZpcm13YXJlIGRvd25sb2FkIGZhaWx1cmUgc3RhdHVzLCBkcml2ZXIgc2hvdWxkIGluaXRpYWxpemUgUkYgaW4gdGhlIGZvbGxvd2luZworCQkvLyBzaWxlbnQgcmVzZXQgcHJvY2VkdXJlIEVtaWx5LCAyMDA4LjAxLjIxCisKKwkJLy8gRHJpdmVyIHNob3VsZCBub3QgY2hlY2sgUlggc3R1Y2sgaW4gSUJTUyBtb2RlIGJlY2F1c2UgaXQgaXMgcmVxdWlyZWQgdG8KKwkJLy8gc2V0IENoZWNrIEJTU0lEIGluIG9yZGVyIHRvIHNlbmQgYmVhY29uLCBob3dldmVyLCBpZiBjaGVjayBCU1NJRCBpcworCQkvLyBzZXQsIFNUQSBjYW5ub3QgaGVhciBhbnkgcGFja2V0IGEgYWxsLiBFbWlseSwgMjAwOC4wNC4xMgorCQlSeFJlc2V0VHlwZSA9IFJ4Q2hlY2tTdHVjayhkZXYpOworCX0KKwlpZihUeFJlc2V0VHlwZT09UkVTRVRfVFlQRV9OT1JNQUwgfHwgUnhSZXNldFR5cGU9PVJFU0VUX1RZUEVfTk9STUFMKQorCQlyZXR1cm4gUkVTRVRfVFlQRV9OT1JNQUw7CisJZWxzZSBpZihUeFJlc2V0VHlwZT09UkVTRVRfVFlQRV9TSUxFTlQgfHwgUnhSZXNldFR5cGU9PVJFU0VUX1RZUEVfU0lMRU5UKXsKKwkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwiJXMoKTpzaWxlbnQgcmVzZXRcbiIsX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIFJFU0VUX1RZUEVfU0lMRU5UOworCX0KKwllbHNlCisJCXJldHVybiBSRVNFVF9UWVBFX05PUkVTRVQ7CisKK30KKwordm9pZCBydGw4MTkyX2NhbmNlbF9kZWZlcnJlZF93b3JrKHN0cnVjdCByODE5Ml9wcml2KiBwcml2KTsKK2ludCBfcnRsODE5Ml91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBydGw4MTkyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisKKwordm9pZAorQ2FtUmVzdG9yZUFsbEVudHJ5KAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4IEVudHJ5SWQgPSAwOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCoJTWFjQWRkciA9IHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkOworCisJc3RhdGljIHU4CUNBTV9DT05TVF9BRERSWzRdWzZdID0geworCQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCisJCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxfSwKKwkJezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDJ9LAorCQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwM319OworCXN0YXRpYyB1OAlDQU1fQ09OU1RfQlJPQURbXSA9CisJCXsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKKworCVJUX1RSQUNFKENPTVBfU0VDLCAiQ2FtUmVzdG9yZUFsbEVudHJ5OiBcbiIpOworCisKKwlpZiAoKHByaXYtPmllZWU4MDIxMS0+cGFpcndpc2Vfa2V5X3R5cGUgPT0gS0VZX1RZUEVfV0VQNDApfHwKKwkgICAgKHByaXYtPmllZWU4MDIxMS0+cGFpcndpc2Vfa2V5X3R5cGUgPT0gS0VZX1RZUEVfV0VQMTA0KSkKKwl7CisKKwkJZm9yKEVudHJ5SWQ9MDsgRW50cnlJZDw0OyBFbnRyeUlkKyspCisJCXsKKwkJCXsKKwkJCQlNYWNBZGRyID0gQ0FNX0NPTlNUX0FERFJbRW50cnlJZF07CisJCQkJc2V0S2V5KGRldiwKKwkJCQkJCUVudHJ5SWQgLAorCQkJCQkJRW50cnlJZCwKKwkJCQkJCXByaXYtPmllZWU4MDIxMS0+cGFpcndpc2Vfa2V5X3R5cGUsCisJCQkJCQlNYWNBZGRyLAorCQkJCQkJMCwKKwkJCQkJCU5VTEwpOworCQkJfQorCQl9CisKKwl9CisJZWxzZSBpZihwcml2LT5pZWVlODAyMTEtPnBhaXJ3aXNlX2tleV90eXBlID09IEtFWV9UWVBFX1RLSVApCisJeworCisJCXsKKwkJCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCQkJCXNldEtleShkZXYsCisJCQkJCQk0LAorCQkJCQkJMCwKKwkJCQkJCXByaXYtPmllZWU4MDIxMS0+cGFpcndpc2Vfa2V5X3R5cGUsCisJCQkJCQkodTgqKWRldi0+ZGV2X2FkZHIsCisJCQkJCQkwLAorCQkJCQkJTlVMTCk7CisJCQllbHNlCisJCQkJc2V0S2V5KGRldiwKKwkJCQkJCTQsCisJCQkJCQkwLAorCQkJCQkJcHJpdi0+aWVlZTgwMjExLT5wYWlyd2lzZV9rZXlfdHlwZSwKKwkJCQkJCU1hY0FkZHIsCisJCQkJCQkwLAorCQkJCQkJTlVMTCk7CisJCX0KKwl9CisJZWxzZSBpZihwcml2LT5pZWVlODAyMTEtPnBhaXJ3aXNlX2tleV90eXBlID09IEtFWV9UWVBFX0NDTVApCisJeworCisJCXsKKwkJCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCQkJCXNldEtleShkZXYsCisJCQkJCQk0LAorCQkJCQkJMCwKKwkJCQkJCXByaXYtPmllZWU4MDIxMS0+cGFpcndpc2Vfa2V5X3R5cGUsCisJCQkJCQkodTgqKWRldi0+ZGV2X2FkZHIsCisJCQkJCQkwLAorCQkJCQkJTlVMTCk7CisJCQllbHNlCisJCQkJc2V0S2V5KGRldiwKKwkJCQkJCTQsCisJCQkJCQkwLAorCQkJCQkJcHJpdi0+aWVlZTgwMjExLT5wYWlyd2lzZV9rZXlfdHlwZSwKKwkJCQkJCU1hY0FkZHIsCisJCQkJCQkwLAorCQkJCQkJTlVMTCk7CisJCX0KKwl9CisKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5ncm91cF9rZXlfdHlwZSA9PSBLRVlfVFlQRV9US0lQKQorCXsKKwkJTWFjQWRkciA9IENBTV9DT05TVF9CUk9BRDsKKwkJZm9yKEVudHJ5SWQ9MSA7IEVudHJ5SWQ8NCA7IEVudHJ5SWQrKykKKwkJeworCQkJeworCQkJCXNldEtleShkZXYsCisJCQkJCQlFbnRyeUlkLAorCQkJCQkJRW50cnlJZCwKKwkJCQkJCXByaXYtPmllZWU4MDIxMS0+Z3JvdXBfa2V5X3R5cGUsCisJCQkJCQlNYWNBZGRyLAorCQkJCQkJMCwKKwkJCQkJCU5VTEwpOworCQkJfQorCQl9CisJCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCQkJCXNldEtleShkZXYsCisJCQkJCQkwLAorCQkJCQkJMCwKKwkJCQkJCXByaXYtPmllZWU4MDIxMS0+Z3JvdXBfa2V5X3R5cGUsCisJCQkJCQlDQU1fQ09OU1RfQUREUlswXSwKKwkJCQkJCTAsCisJCQkJCQlOVUxMKTsKKwl9CisJZWxzZSBpZihwcml2LT5pZWVlODAyMTEtPmdyb3VwX2tleV90eXBlID09IEtFWV9UWVBFX0NDTVApCisJeworCQlNYWNBZGRyID0gQ0FNX0NPTlNUX0JST0FEOworCQlmb3IoRW50cnlJZD0xOyBFbnRyeUlkPDQgOyBFbnRyeUlkKyspCisJCXsKKwkJCXsKKwkJCQlzZXRLZXkoZGV2LAorCQkJCQkJRW50cnlJZCAsCisJCQkJCQlFbnRyeUlkLAorCQkJCQkJcHJpdi0+aWVlZTgwMjExLT5ncm91cF9rZXlfdHlwZSwKKwkJCQkJCU1hY0FkZHIsCisJCQkJCQkwLAorCQkJCQkJTlVMTCk7CisJCQl9CisJCX0KKworCQlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwkJCQlzZXRLZXkoZGV2LAorCQkJCQkJMCAsCisJCQkJCQkwLAorCQkJCQkJcHJpdi0+aWVlZTgwMjExLT5ncm91cF9rZXlfdHlwZSwKKwkJCQkJCUNBTV9DT05TVF9BRERSWzBdLAorCQkJCQkJMCwKKwkJCQkJCU5VTEwpOworCX0KK30KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZml4IFR4L1J4IHN0b3AgYnVnIHRlbXBvcmFyaWx5LgorLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGRvICJzeXN0ZW0gcmVzZXQiIHRvIE5JQyB3aGVuIFR4IG9yIFJ4IGlzIHN0dWNrLgorLy8gVGhlIG1ldGhvZCBjaGVja2luZyBUeC9SeCBzdHVjayBvZiB0aGlzIGZ1bmN0aW9uIGlzIHN1cHBvcnRlZCBieSBGVywKKy8vIHdoaWNoIHJlcG9ydHMgVHggYW5kIFJ4IGNvdW50ZXIgdG8gcmVnaXN0ZXIgMHgxMjggYW5kIDB4MTMwLgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3ZvaWQKK3J0bDgxOXhfaWZzaWxlbnRyZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8vT0NURVRfU1RSSU5HIGFzb2NwZHU7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4CXJlc2V0X3RpbWVzID0gMDsKKwlpbnQgcmVzZXRfc3RhdHVzID0gMDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKworCisJLy8gMjAwNy4wNy4yMC4gSWYgd2UgbmVlZCB0byBjaGVjayBDQ0sgc3RvcCwgcGxlYXNlIHVuY29tbWVudCB0aGlzIGxpbmUuCisJLy9iU3R1Y2sgPSBBZGFwdGVyLT5IYWxGdW5jLkNoZWNrSFdTdG9wSGFuZGxlcihBZGFwdGVyKTsKKworCWlmKHByaXYtPlJlc2V0UHJvZ3Jlc3M9PVJFU0VUX1RZUEVfTk9SRVNFVCkKKwl7CitSRVNFVF9TVEFSVDoKKworCQlSVF9UUkFDRShDT01QX1JFU0VULCI9PT09PT09PT0+UmVzZXQgcHJvZ3Jlc3MhISBcbiIpOworCisJCS8vIFNldCB0aGUgdmFyaWFibGUgZm9yIHJlc2V0LgorCQlwcml2LT5SZXNldFByb2dyZXNzID0gUkVTRVRfVFlQRV9TSUxFTlQ7CisvLwkJcnRsODE5Ml9jbG9zZShkZXYpOworCQlkb3duKCZwcml2LT53eF9zZW0pOworCQlpZihwcml2LT51cCA9PSAwKQorCQl7CisJCQlSVF9UUkFDRShDT01QX0VSUiwiJXMoKTp0aGUgZHJpdmVyIGlzIG5vdCB1cCEgcmV0dXJuXG4iLF9fRlVOQ1RJT05fXyk7CisJCQl1cCgmcHJpdi0+d3hfc2VtKTsKKwkJCXJldHVybiA7CisJCX0KKwkJcHJpdi0+dXAgPSAwOworCQlSVF9UUkFDRShDT01QX1JFU0VULCIlcygpOj09PT09PT5zdGFydCB0byBkb3duIHRoZSBkcml2ZXJcbiIsX19GVU5DVElPTl9fKTsKKy8vCQlpZighbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQorLy8JCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkJcnRsODE5Ml9ydHhfZGlzYWJsZShkZXYpOworCQlydGw4MTkyX2NhbmNlbF9kZWZlcnJlZF93b3JrKHByaXYpOworCQlkZWluaXRfaGFsX2RtKGRldik7CisJCWRlbF90aW1lcl9zeW5jKCZwcml2LT53YXRjaF9kb2dfdGltZXIpOworCisJCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKKwkJaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKKwkJeworCQkJZG93bigmaWVlZS0+d3hfc2VtKTsKKwkJCXByaW50aygiaWVlZS0+c3RhdGUgaXMgSUVFRTgwMjExX0xJTktFRFxuIik7CisJCQlpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMocHJpdi0+aWVlZTgwMjExKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxKTsKKwkJCWllZWU4MDIxMV9zdG9wX3NjYW4oaWVlZSk7CisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQkJdXAoJmllZWUtPnd4X3NlbSk7CisJCX0KKwkJZWxzZXsKKwkJCXByaW50aygiaWVlZS0+c3RhdGUgaXMgTk9UIExJTktFRFxuIik7CisJCQlpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKHByaXYtPmllZWU4MDIxMSk7CQkJfQorCQl1cCgmcHJpdi0+d3hfc2VtKTsKKwkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwiJXMoKTo8PT09PT09PT09PWRvd24gcHJvY2VzcyBpcyBmaW5pc2hlZFxuIixfX0ZVTkNUSU9OX18pOworCS8vcnRsODE5Ml9pcnFfZGlzYWJsZShkZXYpOworCQlSVF9UUkFDRShDT01QX1JFU0VULCIlcygpOj09PT09PT09PT09PnN0YXJ0IHRvIHVwIHRoZSBkcml2ZXJcbiIsX19GVU5DVElPTl9fKTsKKwkJcmVzZXRfc3RhdHVzID0gX3J0bDgxOTJfdXAoZGV2KTsKKworCQlSVF9UUkFDRShDT01QX1JFU0VULCIlcygpOjw9PT09PT09PT09PXVwIHByb2Nlc3MgaXMgZmluaXNoZWRcbiIsX19GVU5DVElPTl9fKTsKKwkJaWYocmVzZXRfc3RhdHVzID09IC1FQUdBSU4pCisJCXsKKwkJCWlmKHJlc2V0X3RpbWVzIDwgMykKKwkJCXsKKwkJCQlyZXNldF90aW1lcysrOworCQkJCWdvdG8gUkVTRVRfU1RBUlQ7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsIiBFUlIhISEgJXMoKTogIFJlc2V0IEZhaWxlZCEhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJfQorCQl9CisJCWllZWUtPmlzX3NpbGVudF9yZXNldCA9IDE7CisJCUVuYWJsZUhXU2VjdXJpdHlDb25maWc4MTkyKGRldik7CisJCWlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgJiYgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQorCQl7CisJCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKworCQkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSk7CisKKwkJfQorCQllbHNlIGlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgJiYgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCQl7CisJCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwkJCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CisKKwkJLy8Jbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCisJCQlpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKGllZWUpOworCisJCQlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisJCQluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7CisJCX0KKworCQlDYW1SZXN0b3JlQWxsRW50cnkoZGV2KTsKKworCQlwcml2LT5SZXNldFByb2dyZXNzID0gUkVTRVRfVFlQRV9OT1JFU0VUOworCQlwcml2LT5yZXNldF9jb3VudCsrOworCisJCXByaXYtPmJGb3JjZWRTaWxlbnRSZXNldCA9ZmFsc2U7CisJCXByaXYtPmJSZXNldEluUHJvZ3Jlc3MgPSBmYWxzZTsKKworCQkvLyBGb3IgdGVzdCAtLT4gZm9yY2Ugd3JpdGUgVUZXUC4KKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBVRldQLCAxKTsKKwkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwgIlJlc2V0IGZpbmlzaGVkISEgPT09PT5bJWRdXG4iLCBwcml2LT5yZXNldF9jb3VudCk7CisJfQorfQorCit2b2lkIENBTV9yZWFkX2VudHJ5KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTMyCSAJCWlJbmRleAorKQoreworIAl1MzIgdGFyZ2V0X2NvbW1hbmQ9MDsKKwkgdTMyIHRhcmdldF9jb250ZW50PTA7CisJIHU4IGVudHJ5X2k9MDsKKwkgdTMyIHVsU3RhdHVzOworCXMzMiBpPTEwMDsKKy8vCXByaW50aygiPT09PT09PT5zdGFydCByZWFkIENBTVxuIik7CisgCWZvcihlbnRyeV9pPTA7ZW50cnlfaTxDQU1fQ09OVEVOVF9DT1VOVDtlbnRyeV9pKyspCisgCXsKKyAgIAkvLyBwb2xsaW5nIGJpdCwgYW5kIE5vIFdyaXRlIGVuYWJsZSwgYW5kIGFkZHJlc3MKKwkJdGFyZ2V0X2NvbW1hbmQ9IGVudHJ5X2krQ0FNX0NPTlRFTlRfQ09VTlQqaUluZGV4OworCQl0YXJnZXRfY29tbWFuZD0gdGFyZ2V0X2NvbW1hbmQgfCBCSVQzMTsKKworCS8vQ2hlY2sgcG9sbGluZyBiaXQgaXMgY2xlYXIKKy8vCW1kZWxheSgxKTsKKwkJd2hpbGUoKGktLSk+PTApCisJCXsKKwkJCXVsU3RhdHVzID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBSV0NBTSk7CisJCQlpZih1bFN0YXR1cyAmIEJJVDMxKXsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWVsc2V7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgUldDQU0sIHRhcmdldF9jb21tYW5kKTsKKwkJUlRfVFJBQ0UoQ09NUF9TRUMsIkNBTV9yZWFkX2VudHJ5KCk6IFdSSVRFIEEwOiAleCBcbiIsdGFyZ2V0X2NvbW1hbmQpOworCSAvLwlwcmludGsoIkNBTV9yZWFkX2VudHJ5KCk6IFdSSVRFIEEwOiAlbHggXG4iLHRhcmdldF9jb21tYW5kKTsKKwkJdGFyZ2V0X2NvbnRlbnQgPSByZWFkX25pY19kd29yZChkZXYsIFJDQU1PKTsKKwkJUlRfVFJBQ0UoQ09NUF9TRUMsICJDQU1fcmVhZF9lbnRyeSgpOiBXUklURSBBODogJXggXG4iLHRhcmdldF9jb250ZW50KTsKKwkgLy8JcHJpbnRrKCJDQU1fcmVhZF9lbnRyeSgpOiBXUklURSBBODogJWx4IFxuIix0YXJnZXRfY29udGVudCk7CisJfQorCXByaW50aygiXG4iKTsKK30KKwordm9pZCBydGw4MTl4X3VwZGF0ZV9yeGNvdW50cygKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwKKwl1MzIqIFRvdGFsUnhCY25OdW0sCisJdTMyKiBUb3RhbFJ4RGF0YU51bQorKQoreworCXUxNiAJCQlTbG90SW5kZXg7CisJdTgJCQlpOworCisJKlRvdGFsUnhCY25OdW0gPSAwOworCSpUb3RhbFJ4RGF0YU51bSA9IDA7CisKKwlTbG90SW5kZXggPSAocHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5TbG90SW5kZXgrKyklKHByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uU2xvdE51bSk7CisJcHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5SeEJjbk51bVtTbG90SW5kZXhdID0gcHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2QmNuSW5QZXJpb2Q7CisJcHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5SeERhdGFOdW1bU2xvdEluZGV4XSA9IHByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZDsKKwlmb3IoIGk9MDsgaTxwcml2LT5pZWVlODAyMTEtPkxpbmtEZXRlY3RJbmZvLlNsb3ROdW07IGkrKyApeworCQkqVG90YWxSeEJjbk51bSArPSBwcml2LT5pZWVlODAyMTEtPkxpbmtEZXRlY3RJbmZvLlJ4QmNuTnVtW2ldOworCQkqVG90YWxSeERhdGFOdW0gKz0gcHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5SeERhdGFOdW1baV07CisJfQorfQorCisKK2V4dGVybgl2b2lkCXJ0bDgxOXhfd2F0Y2hkb2dfd3FjYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOworICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGR3b3JrLHN0cnVjdCByODE5Ml9wcml2LHdhdGNoX2RvZ193cSk7CisgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPmllZWU4MDIxMS0+ZGV2OworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlID0gcHJpdi0+aWVlZTgwMjExOworCVJFU0VUX1RZUEUJUmVzZXRUeXBlID0gUkVTRVRfVFlQRV9OT1JFU0VUOworCXN0YXRpYyB1OAljaGVja19yZXNldF9jbnQ9MDsKKwlib29sIGJCdXN5VHJhZmZpYyA9IGZhbHNlOworCisJaWYoIXByaXYtPnVwKQorCQlyZXR1cm47CisJaGFsX2RtX3dhdGNoZG9nKGRldik7CisKKwl7Ly90byBnZXQgYnVzeSB0cmFmZmljIGNvbmRpdGlvbgorCQlpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCQl7CisJCQlpZigJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUnhPa0luUGVyaW9kPiA2NjYgfHwKKwkJCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1UeE9rSW5QZXJpb2Q+IDY2NiApIHsKKwkJCQliQnVzeVRyYWZmaWMgPSB0cnVlOworCQkJfQorCQkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUnhPa0luUGVyaW9kID0gMDsKKwkJCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVR4T2tJblBlcmlvZCA9IDA7CisJCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5iQnVzeVRyYWZmaWMgPSBiQnVzeVRyYWZmaWM7CisJCX0KKwl9CisJLy9hZGRlZCBieSBhbXkgZm9yIEFQIHJvYW1pbmcKKwl7CisJCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCAmJiBwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkKKwkJeworCQkJdTMyCVRvdGFsUnhCY25OdW0gPSAwOworCQkJdTMyCVRvdGFsUnhEYXRhTnVtID0gMDsKKworCQkJcnRsODE5eF91cGRhdGVfcnhjb3VudHMocHJpdiwgJlRvdGFsUnhCY25OdW0sICZUb3RhbFJ4RGF0YU51bSk7CisJCQlpZigoVG90YWxSeEJjbk51bStUb3RhbFJ4RGF0YU51bSkgPT0gMCkKKwkJCXsKKwkJCQkjaWZkZWYgVE9ETworCQkJCWlmKHJmU3RhdGUgPT0gZVJmT2ZmKQorCQkJCQlSVF9UUkFDRShDT01QX0VSUiwiPT09PT09PT0+JXMoKVxuIixfX0ZVTkNUSU9OX18pOworCQkJCSNlbmRpZgorCQkJCXByaW50aygiPT09PiVzKCk6IEFQIGlzIHBvd2VyIG9mZixjb25uZWN0IGFub3RoZXIgb25lXG4iLF9fRlVOQ1RJT05fXyk7CisJCQkvLwlEb3QxMWRfUmVzZXQoZGV2KTsKKwkJCQlwcml2LT5pZWVlODAyMTEtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HOworCQkJCW5vdGlmeV93eF9hc3NvY19ldmVudChwcml2LT5pZWVlODAyMTEpOworCQkJCVJlbW92ZVBlZXJUUyhwcml2LT5pZWVlODAyMTEscHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnNzaWQpOworCQkJCXByaXYtPmllZWU4MDIxMS0+bGlua19jaGFuZ2UoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLCAmcHJpdi0+aWVlZTgwMjExLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKKworCQkJfQorCQl9CisJCXByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kPTA7CisJCXByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZD0wOworCX0KKy8vCUNBTV9yZWFkX2VudHJ5KGRldiw0KTsKKwkvL2NoZWNrIGlmIHJlc2V0IHRoZSBkcml2ZXIKKwlpZihjaGVja19yZXNldF9jbnQrKyA+PSAzKQorCXsKKyAgICAJCVJlc2V0VHlwZSA9IHJ0bDgxOXhfaWZjaGVja19yZXNldG9ybm90KGRldik7CisJCWNoZWNrX3Jlc2V0X2NudCA9IDM7CisJCS8vRGJnUHJpbnQoIlN0YXJ0IHRvIGNoZWNrIHNpbGVudCByZXNldFxuIik7CisJfQorCS8vCVJUX1RSQUNFKENPTVBfUkVTRVQsIiVzKCk6cHJpdi0+Zm9yY2VfcmVzZXQgaXMgJWQscHJpdi0+UmVzZXRQcm9ncmVzcyBpcyAlZCwgcHJpdi0+YkZvcmNlZFNpbGVudFJlc2V0IGlzICVkLHByaXYtPmJEaXNhYmxlTm9ybWFsUmVzZXRDaGVjayBpcyAlZCxSZXNldFR5cGUgaXMgJWRcbiIsX19GVU5DVElPTl9fLHByaXYtPmZvcmNlX3Jlc2V0LHByaXYtPlJlc2V0UHJvZ3Jlc3MscHJpdi0+YkZvcmNlZFNpbGVudFJlc2V0LHByaXYtPmJEaXNhYmxlTm9ybWFsUmVzZXRDaGVjayxSZXNldFR5cGUpOworCWlmKCAocHJpdi0+Zm9yY2VfcmVzZXQpIHx8IChwcml2LT5SZXNldFByb2dyZXNzPT1SRVNFVF9UWVBFX05PUkVTRVQgJiYKKwkJKHByaXYtPmJGb3JjZWRTaWxlbnRSZXNldCB8fAorCQkoIXByaXYtPmJEaXNhYmxlTm9ybWFsUmVzZXRDaGVjayAmJiBSZXNldFR5cGU9PVJFU0VUX1RZUEVfU0lMRU5UKSkpKSAvLyBUaGlzIGlzIGNvbnRyb2wgYnkgT0lEIHNldCBpbiBQb21lbG8KKwl7CisJCVJUX1RSQUNFKENPTVBfUkVTRVQsIiVzKCk6cHJpdi0+Zm9yY2VfcmVzZXQgaXMgJWQscHJpdi0+UmVzZXRQcm9ncmVzcyBpcyAlZCwgcHJpdi0+YkZvcmNlZFNpbGVudFJlc2V0IGlzICVkLHByaXYtPmJEaXNhYmxlTm9ybWFsUmVzZXRDaGVjayBpcyAlZCxSZXNldFR5cGUgaXMgJWRcbiIsX19GVU5DVElPTl9fLHByaXYtPmZvcmNlX3Jlc2V0LHByaXYtPlJlc2V0UHJvZ3Jlc3MscHJpdi0+YkZvcmNlZFNpbGVudFJlc2V0LHByaXYtPmJEaXNhYmxlTm9ybWFsUmVzZXRDaGVjayxSZXNldFR5cGUpOworCQlydGw4MTl4X2lmc2lsZW50cmVzZXQoZGV2KTsKKwl9CisJcHJpdi0+Zm9yY2VfcmVzZXQgPSBmYWxzZTsKKwlwcml2LT5iRm9yY2VkU2lsZW50UmVzZXQgPSBmYWxzZTsKKwlwcml2LT5iUmVzZXRJblByb2dyZXNzID0gZmFsc2U7CisJUlRfVFJBQ0UoQ09NUF9UUkFDRSwgIiA8PT1SdFVzYkNoZWNrRm9ySGFuZ1dvcmtJdGVtQ2FsbGJhY2soKVxuIik7CisKK30KKwordm9pZCB3YXRjaF9kb2dfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGEpOworCS8vcHJpbnRrKCI9PT09PT09PT09PT09PT0+d2F0Y2hfZG9nICB0aW1lclxuIik7CisJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPnByaXZfd3EsJnByaXYtPndhdGNoX2RvZ193cSwgMCk7CisJbW9kX3RpbWVyKCZwcml2LT53YXRjaF9kb2dfdGltZXIsIGppZmZpZXMgKyBNU0VDUyhJRUVFODAyMTFfV0FUQ0hfRE9HX1RJTUUpKTsKK30KK2ludCBfcnRsODE5Ml91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL2ludCBpOworCWludCBpbml0X3N0YXR1cyA9IDA7CisJcHJpdi0+dXA9MTsKKwlwcml2LT5pZWVlODAyMTEtPmllZWVfdXA9MTsKKwlSVF9UUkFDRShDT01QX0lOSVQsICJCcmluZ2luZyB1cCBpZmFjZSIpOworCWluaXRfc3RhdHVzID0gcnRsODE5Ml9hZGFwdGVyX3N0YXJ0KGRldik7CisJaWYoIWluaXRfc3RhdHVzKQorCXsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIkVSUiEhISAlcygpOiBpbml0aWFsaXphdGlvbiBpcyBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlwcml2LT51cD1wcml2LT5pZWVlODAyMTEtPmllZWVfdXAgPSAwOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJUlRfVFJBQ0UoQ09NUF9JTklULCAic3RhcnQgYWRhcHRlciBmaW5pc2hlZFxuIik7CisJcnRsODE5Ml9yeF9lbmFibGUoZGV2KTsKKy8vCXJ0bDgxOTJfdHhfZW5hYmxlKGRldik7CisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKQorCWllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKHByaXYtPmllZWU4MDIxMSk7CisJaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKHByaXYtPmllZWU4MDIxMSk7CisJd2F0Y2hfZG9nX3RpbWVyX2NhbGxiYWNrKCh1bnNpZ25lZCBsb25nKSBkZXYpOworCWlmKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJZWxzZQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgcnRsODE5Ml9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ7CisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlyZXQgPSBydGw4MTkyX3VwKGRldik7CisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKKworfQorCisKK2ludCBydGw4MTkyX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYgKHByaXYtPnVwID09IDEpIHJldHVybiAtMTsKKworCXJldHVybiBfcnRsODE5Ml91cChkZXYpOworfQorCisKK2ludCBydGw4MTkyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gcnRsODE5Ml9kb3duKGRldik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7CisKK30KKworaW50IHJ0bDgxOTJfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCWlmIChwcml2LT51cCA9PSAwKSByZXR1cm4gLTE7CisKKwlwcml2LT51cD0wOworCXByaXYtPmllZWU4MDIxMS0+aWVlZV91cCA9IDA7CisJUlRfVFJBQ0UoQ09NUF9ET1dOLCAiPT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworLyogRklYTUUgKi8KKwlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJcnRsODE5Ml9ydHhfZGlzYWJsZShkZXYpOworCS8vcnRsODE5Ml9pcnFfZGlzYWJsZShkZXYpOworCisgLyogVHggcmVsYXRlZCBxdWV1ZSByZWxlYXNlICovCisJZm9yKGkgPSAwOyBpIDwgTUFYX1FVRVVFX1NJWkU7IGkrKykgeworCQlza2JfcXVldWVfcHVyZ2UoJnByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRIFtpXSk7CisJfQorCWZvcihpID0gMDsgaSA8IE1BWF9RVUVVRV9TSVpFOyBpKyspIHsKKwkJc2tiX3F1ZXVlX3B1cmdlKCZwcml2LT5pZWVlODAyMTEtPnNrYl9hZ2dRIFtpXSk7CisJfQorCisJZm9yKGkgPSAwOyBpIDwgTUFYX1FVRVVFX1NJWkU7IGkrKykgeworCQlza2JfcXVldWVfcHVyZ2UoJnByaXYtPmllZWU4MDIxMS0+c2tiX2Rydl9hZ2dRIFtpXSk7CisJfQorCisJLy9hcyBjYW5jZWxfZGVsYXllZF93b3JrIHdpbGwgZGVsIHdvcmstPnRpbWVyLCBzbyBpZiB3b3JrIGlzIG5vdCBkZWZpbmVkYXMgc3RydWN0IGRlbGF5ZWRfd29yaywgaXQgd2lsbCBjb3JydXB0CisvLwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCXJ0bDgxOTJfY2FuY2VsX2RlZmVycmVkX3dvcmsocHJpdik7CisJZGVpbml0X2hhbF9kbShkZXYpOworCWRlbF90aW1lcl9zeW5jKCZwcml2LT53YXRjaF9kb2dfdGltZXIpOworCisKKwlpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKHByaXYtPmllZWU4MDIxMSk7CisJbWVtc2V0KCZwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yaywgMCAsIG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaywgbGlzdCkpOworCVJUX1RSQUNFKENPTVBfRE9XTiwgIjw9PT09PT09PT09JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCQlyZXR1cm4gMDsKK30KKworCit2b2lkIHJ0bDgxOTJfY29tbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXNldF9zdGF0dXMgPSAwOworCS8vdTggcmVzZXRfdGltZXMgPSAwOworCWlmIChwcml2LT51cCA9PSAwKSByZXR1cm4gOworCXByaXYtPnVwID0gMDsKKworCXJ0bDgxOTJfY2FuY2VsX2RlZmVycmVkX3dvcmsocHJpdik7CisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPndhdGNoX2RvZ190aW1lcik7CisJLy9jYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5Td0NobmxXb3JrSXRlbSk7CisKKwlpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKHByaXYtPmllZWU4MDIxMSk7CisKKwkvL3J0bDgxOTJfaXJxX2Rpc2FibGUoZGV2KTsKKwlydGw4MTkyX3J0eF9kaXNhYmxlKGRldik7CisJcmVzZXRfc3RhdHVzID0gX3J0bDgxOTJfdXAoZGV2KTsKKworfQorCisvKgordm9pZCBydGw4MTkyX3Jlc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisqLwordm9pZCBydGw4MTkyX3Jlc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByODE5Ml9wcml2LCByZXNldF93cSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPmllZWU4MDIxMS0+ZGV2OworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJ0bDgxOTJfY29tbWl0KGRldik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKK30KKworc3RhdGljIHZvaWQgcjgxOTJfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzaG9ydCBwcm9taXNjOworCisJLy9kb3duKCZwcml2LT53eF9zZW0pOworCisJLyogRklYTUUgRklYTUUgKi8KKworCXByb21pc2MgPSAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSA/IDE6MDsKKworCWlmIChwcm9taXNjICE9IHByaXYtPnByb21pc2MpCisJLy8JcnRsODE5Ml9jb21taXQoZGV2KTsKKworCXByaXYtPnByb21pc2MgPSBwcm9taXNjOworCisJLy9zY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93cSk7CisJLy91cCgmcHJpdi0+d3hfc2VtKTsKK30KKworCitpbnQgcjgxOTJfc2V0X21hY19hZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqbWFjKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBtYWM7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKKworCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlc2V0X3dxKTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorCisvKiBiYXNlZCBvbiBpcHcyMjAwIGRyaXZlciAqLworaW50IHJ0bDgxOTJfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcnE7CisJaW50IHJldD0tMTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwl1MzIga2V5WzRdOworCXU4IGJyb2FkY2FzdF9hZGRyWzZdID0gezB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmfTsKKwlzdHJ1Y3QgaXdfcG9pbnQgKnAgPSAmd3JxLT51LmRhdGE7CisJc3RydWN0IGllZWVfcGFyYW0gKmlwdyA9IE5VTEw7Ly8oc3RydWN0IGllZWVfcGFyYW0gKil3cnEtPnUuZGF0YS5wb2ludGVyOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCisgICAgIGlmIChwLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGllZWVfcGFyYW0pIHx8ICFwLT5wb2ludGVyKXsKKwkgICAgIHJldCA9IC1FSU5WQUw7CisJICAgICBnb3RvIG91dDsKKwl9CisKKyAgICAgaXB3ID0gKHN0cnVjdCBpZWVlX3BhcmFtICopa21hbGxvYyhwLT5sZW5ndGgsIEdGUF9LRVJORUwpOworICAgICBpZiAoaXB3ID09IE5VTEwpeworCSAgICAgcmV0ID0gLUVOT01FTTsKKwkgICAgIGdvdG8gb3V0OworICAgICB9CisgICAgIGlmIChjb3B5X2Zyb21fdXNlcihpcHcsIHAtPnBvaW50ZXIsIHAtPmxlbmd0aCkpIHsKKwkJa2ZyZWUoaXB3KTsKKwkgICAgcmV0ID0gLUVGQVVMVDsKKwkgICAgZ290byBvdXQ7CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwkgICAgY2FzZSBSVExfSU9DVExfV1BBX1NVUFBMSUNBTlQ6CisJLy9wYXJzZSBoZXJlIGZvciBIVyBzZWN1cml0eQorCQkJaWYgKGlwdy0+Y21kID09IElFRUVfQ01EX1NFVF9FTkNSWVBUSU9OKQorCQkJeworCQkJCWlmIChpcHctPnUuY3J5cHQuc2V0X3R4KQorCQkJCXsKKwkJCQkJaWYgKHN0cmNtcChpcHctPnUuY3J5cHQuYWxnLCAiQ0NNUCIpID09IDApCisJCQkJCQlpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX0NDTVA7CisJCQkJCWVsc2UgaWYgKHN0cmNtcChpcHctPnUuY3J5cHQuYWxnLCAiVEtJUCIpID09IDApCisJCQkJCQlpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX1RLSVA7CisJCQkJCWVsc2UgaWYgKHN0cmNtcChpcHctPnUuY3J5cHQuYWxnLCAiV0VQIikgPT0gMCkKKwkJCQkJeworCQkJCQkJaWYgKGlwdy0+dS5jcnlwdC5rZXlfbGVuID09IDEzKQorCQkJCQkJCWllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfV0VQMTA0OworCQkJCQkJZWxzZSBpZiAoaXB3LT51LmNyeXB0LmtleV9sZW4gPT0gNSkKKwkJCQkJCQlpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX1dFUDQwOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCWllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfTkE7CisKKwkJCQkJaWYgKGllZWUtPnBhaXJ3aXNlX2tleV90eXBlKQorCQkJCQl7CisJCQkJCQltZW1jcHkoKHU4KilrZXksIGlwdy0+dS5jcnlwdC5rZXksIDE2KTsKKwkJCQkJCUVuYWJsZUhXU2VjdXJpdHlDb25maWc4MTkyKGRldik7CisJCQkJCS8vd2UgZmlsbCBib3RoIGluZGV4IGVudHJ5IGFuZCA0dGggZW50cnkgZm9yIHBhaXJ3aXNlIGtleSBhcyBpbiBJUFcgaW50ZXJmYWNlLCBhZGhvYyB3aWxsIG9ubHkgZ2V0IGhlcmUsIHNvIHdlIG5lZWQgaW5kZXggZW50cnkgZm9yIGl0cyBkZWZhdWx0IGtleSBzZXJjaGluZyEKKwkJCQkJLy9hZGRlZCBieSBXQi4KKwkJCQkJCXNldEtleShkZXYsIDQsIGlwdy0+dS5jcnlwdC5pZHgsIGllZWUtPnBhaXJ3aXNlX2tleV90eXBlLCAodTgqKWllZWUtPmFwX21hY19hZGRyLCAwLCBrZXkpOworCQkJCQkJaWYgKGllZWUtPmF1dGhfbW9kZSAhPSAyKQorCQkJCQkJc2V0S2V5KGRldiwgaXB3LT51LmNyeXB0LmlkeCwgaXB3LT51LmNyeXB0LmlkeCwgaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUsICh1OCopaWVlZS0+YXBfbWFjX2FkZHIsIDAsIGtleSk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSAvL2lmIChpcHctPnUuY3J5cHQuaWR4KSAvL2dyb3VwIGtleSB1c2UgaWR4ID4gMAorCQkJCXsKKwkJCQkJbWVtY3B5KCh1OCopa2V5LCBpcHctPnUuY3J5cHQua2V5LCAxNik7CisJCQkJCWlmIChzdHJjbXAoaXB3LT51LmNyeXB0LmFsZywgIkNDTVAiKSA9PSAwKQorCQkJCQkJaWVlZS0+Z3JvdXBfa2V5X3R5cGU9IEtFWV9UWVBFX0NDTVA7CisJCQkJCWVsc2UgaWYgKHN0cmNtcChpcHctPnUuY3J5cHQuYWxnLCAiVEtJUCIpID09IDApCisJCQkJCQlpZWVlLT5ncm91cF9rZXlfdHlwZSA9IEtFWV9UWVBFX1RLSVA7CisJCQkJCWVsc2UgaWYgKHN0cmNtcChpcHctPnUuY3J5cHQuYWxnLCAiV0VQIikgPT0gMCkKKwkJCQkJeworCQkJCQkJaWYgKGlwdy0+dS5jcnlwdC5rZXlfbGVuID09IDEzKQorCQkJCQkJCWllZWUtPmdyb3VwX2tleV90eXBlID0gS0VZX1RZUEVfV0VQMTA0OworCQkJCQkJZWxzZSBpZiAoaXB3LT51LmNyeXB0LmtleV9sZW4gPT0gNSkKKwkJCQkJCQlpZWVlLT5ncm91cF9rZXlfdHlwZSA9IEtFWV9UWVBFX1dFUDQwOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCWllZWUtPmdyb3VwX2tleV90eXBlID0gS0VZX1RZUEVfTkE7CisKKwkJCQkJaWYgKGllZWUtPmdyb3VwX2tleV90eXBlKQorCQkJCQl7CisJCQkJCQkJc2V0S2V5KAlkZXYsCisJCQkJCQkJCWlwdy0+dS5jcnlwdC5pZHgsCisJCQkJCQkJCWlwdy0+dS5jcnlwdC5pZHgsCQkvL0tleUluZGV4CisJCQkJCQkgICAgIAkJaWVlZS0+Z3JvdXBfa2V5X3R5cGUsCS8vS2V5VHlwZQorCQkJCQkJICAgICAgICAgICAgCWJyb2FkY2FzdF9hZGRyLAkvL01hY0FkZHIKKwkJCQkJCQkJMCwJCS8vRGVmYXVsdEtleQorCQkJCQkJCSAgICAgIAlrZXkpOwkJLy9LZXlDb250ZW50CisJCQkJCX0KKwkJCQl9CisJCQl9CisjaWZkZWYgSk9ITl9IV1NFQ19ERUJVRworCQkvL2pvaG4ncyB0ZXN0IDA3MTEKKwkJcHJpbnRrKCJAQCB3cnEtPnUgcG9pbnRlciA9ICIpOworCQlmb3IoaT0wO2k8d3JxLT51LmRhdGEubGVuZ3RoO2krKyl7CisJCQlpZihpJTEwPT0wKSBwcmludGsoIlxuIik7CisJCQlwcmludGsoICIlOHh8IiwgKCh1MzIqKXdycS0+dS5kYXRhLnBvaW50ZXIpW2ldICk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworI2VuZGlmIC8qSk9ITl9IV1NFQ19ERUJVRyovCisJCXJldCA9IGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bChwcml2LT5pZWVlODAyMTEsICZ3cnEtPnUuZGF0YSk7CisJCWJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKwl9CisJa2ZyZWUoaXB3KTsKKwlpcHcgPSBOVUxMOworb3V0OgorCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKK3U4IEh3UmF0ZVRvTVJhdGU5MChib29sIGJJc0hULCB1OCByYXRlKQoreworCXU4ICByZXRfcmF0ZSA9IDB4ZmY7CisKKwlpZighYklzSFQpIHsKKwkJc3dpdGNoKHJhdGUpIHsKKwkJCWNhc2UgREVTQzkwX1JBVEUxTTogICByZXRfcmF0ZSA9IE1HTl8xTTsgICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEUyTTogICByZXRfcmF0ZSA9IE1HTl8yTTsgICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEU1XzVNOiByZXRfcmF0ZSA9IE1HTl81XzVNOyAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEUxMU06ICByZXRfcmF0ZSA9IE1HTl8xMU07ICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEU2TTogICByZXRfcmF0ZSA9IE1HTl82TTsgICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEU5TTogICByZXRfcmF0ZSA9IE1HTl85TTsgICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEUxMk06ICByZXRfcmF0ZSA9IE1HTl8xMk07ICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEUxOE06ICByZXRfcmF0ZSA9IE1HTl8xOE07ICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEUyNE06ICByZXRfcmF0ZSA9IE1HTl8yNE07ICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEUzNk06ICByZXRfcmF0ZSA9IE1HTl8zNk07ICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEU0OE06ICByZXRfcmF0ZSA9IE1HTl80OE07ICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEU1NE06ICByZXRfcmF0ZSA9IE1HTl81NE07ICAgICAgICBicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlyZXRfcmF0ZSA9IDB4ZmY7CisJCQkJUlRfVFJBQ0UoQ09NUF9SRUNWLCAiSHdSYXRlVG9NUmF0ZTkwKCk6IE5vbiBzdXBwb3J0ZWQgUmF0ZSBbJXhdLCBiSXNIVCA9ICVkISEhXG4iLCByYXRlLCBiSXNIVCk7CisJCQkJYnJlYWs7CisJCX0KKworCX0gZWxzZSB7CisJCXN3aXRjaChyYXRlKSB7CisJCQljYXNlIERFU0M5MF9SQVRFTUNTMDogICByZXRfcmF0ZSA9IE1HTl9NQ1MwOyAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEVNQ1MxOiAgIHJldF9yYXRlID0gTUdOX01DUzE7ICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURU1DUzI6ICAgcmV0X3JhdGUgPSBNR05fTUNTMjsgICAgYnJlYWs7CisJCQljYXNlIERFU0M5MF9SQVRFTUNTMzogICByZXRfcmF0ZSA9IE1HTl9NQ1MzOyAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEVNQ1M0OiAgIHJldF9yYXRlID0gTUdOX01DUzQ7ICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURU1DUzU6ICAgcmV0X3JhdGUgPSBNR05fTUNTNTsgICAgYnJlYWs7CisJCQljYXNlIERFU0M5MF9SQVRFTUNTNjogICByZXRfcmF0ZSA9IE1HTl9NQ1M2OyAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEVNQ1M3OiAgIHJldF9yYXRlID0gTUdOX01DUzc7ICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURU1DUzg6ICAgcmV0X3JhdGUgPSBNR05fTUNTODsgICAgYnJlYWs7CisJCQljYXNlIERFU0M5MF9SQVRFTUNTOTogICByZXRfcmF0ZSA9IE1HTl9NQ1M5OyAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEVNQ1MxMDogIHJldF9yYXRlID0gTUdOX01DUzEwOyAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURU1DUzExOiAgcmV0X3JhdGUgPSBNR05fTUNTMTE7ICAgYnJlYWs7CisJCQljYXNlIERFU0M5MF9SQVRFTUNTMTI6ICByZXRfcmF0ZSA9IE1HTl9NQ1MxMjsgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEVNQ1MxMzogIHJldF9yYXRlID0gTUdOX01DUzEzOyAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURU1DUzE0OiAgcmV0X3JhdGUgPSBNR05fTUNTMTQ7ICAgYnJlYWs7CisJCQljYXNlIERFU0M5MF9SQVRFTUNTMTU6ICByZXRfcmF0ZSA9IE1HTl9NQ1MxNTsgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEVNQ1MzMjogIHJldF9yYXRlID0gKDB4ODB8MHgyMCk7IGJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXJldF9yYXRlID0gMHhmZjsKKwkJCQlSVF9UUkFDRShDT01QX1JFQ1YsICJId1JhdGVUb01SYXRlOTAoKTogTm9uIHN1cHBvcnRlZCBSYXRlIFsleF0sIGJJc0hUID0gJWQhISFcbiIscmF0ZSwgYklzSFQpOworCQkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldF9yYXRlOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiAgICAgVXBkYXRlUnhQa3RUaW1lU3RhbXAKKyAqIE92ZXJ2aWV3OiAgICAgUmVjb3JlZCBkb3duIHRoZSBUU0YgdGltZSBzdGFtcCB3aGVuIHJlY2VpdmluZyBhIHBhY2tldAorICoKKyAqIElucHV0OgorICogICAgICAgUEFEQVBURVIgICAgICAgIEFkYXB0ZXIKKyAqICAgICAgIFBSVF9SRkQgICAgICAgICBwUmZkLAorICoKKyAqIE91dHB1dDoKKyAqICAgICAgIFBSVF9SRkQgICAgICAgICBwUmZkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFJmZC0+U3RhdHVzLlRpbWVTdGFtcEhpZ2ggaXMgdXBkYXRlZCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUmZkLT5TdGF0dXMuVGltZVN0YW1wTG93IGlzIHVwZGF0ZWQpCisgKiBSZXR1cm46CisgKiAgICAgICAgICAgICAgIE5vbmUKKyAqLwordm9pZCBVcGRhdGVSeFBrdFRpbWVTdGFtcDgxOTAgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKHN0YXRzLT5iSXNBTVBEVSAmJiAhc3RhdHMtPmJGaXJzdE1QRFUpIHsKKwkJc3RhdHMtPm1hY190aW1lWzBdID0gcHJpdi0+TGFzdFJ4RGVzY1RTRkxvdzsKKwkJc3RhdHMtPm1hY190aW1lWzFdID0gcHJpdi0+TGFzdFJ4RGVzY1RTRkhpZ2g7CisJfSBlbHNlIHsKKwkJcHJpdi0+TGFzdFJ4RGVzY1RTRkxvdyA9IHN0YXRzLT5tYWNfdGltZVswXTsKKwkJcHJpdi0+TGFzdFJ4RGVzY1RTRkhpZ2ggPSBzdGF0cy0+bWFjX3RpbWVbMV07CisJfQorfQorCisvL2J5IGFteSAwODA2MDYKKworbG9uZyBydGw4MTl4X3RyYW5zbGF0ZV90b2RibSh1OCBzaWduYWxfc3RyZW5ndGhfaW5kZXgJKS8vIDAtMTAwIGluZGV4LgoreworCWxvbmcJc2lnbmFsX3Bvd2VyOyAvLyBpbiBkQm0uCisKKwkvLyBUcmFuc2xhdGUgdG8gZEJtICh4PTAuNXktOTUpLgorCXNpZ25hbF9wb3dlciA9IChsb25nKSgoc2lnbmFsX3N0cmVuZ3RoX2luZGV4ICsgMSkgPj4gMSk7CisJc2lnbmFsX3Bvd2VyIC09IDk1OworCisJcmV0dXJuIHNpZ25hbF9wb3dlcjsKK30KKworCisvKiAyMDA4LzAxLzIyIE1IIFdlIGNhbiBub3QgZGVsY2FyZSBSU1NJL0VWTSB0b3RhbCB2YWx1ZSBvZiBzbGlkaW5nIHdpbmRvdyB0bworICAgIGJlIGEgbG9jYWwgc3RhdGljLiBPdGhlcndpc2UsIGl0IG1heSBpbmNyZWFzZSB3aGVuIHdlIHJldHVybiBmcm9tIFMzL1M0LiBUaGUKKyAgICB2YWx1ZSB3aWxsIGJlIGtlcHQgaW4gbWVtb3J5IG9yIGRpc2suIFdlIG11c3QgZGVsY2FyZSB0aGUgdmFsdWUgaW4gYWRhcHRlcgorICAgIGFuZCBpdCB3aWxsIGJlIHJlaW5pdGlhbGl6ZWQgd2hlbiByZXR1cm4gZnJvbSBTMy9TNC4gKi8KK3ZvaWQgcnRsODE5Ml9wcm9jZXNzX3BoeWluZm8oc3RydWN0IHI4MTkyX3ByaXYgKiBwcml2LHU4KiBidWZmZXIsIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKiBwcHJldmlvdXNfc3RhdHMsIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKiBwY3VycmVudF9zdGF0cykKK3sKKwlib29sIGJjaGVjayA9IGZhbHNlOworCXU4CXJmcGF0aDsKKwl1MzIJbnNwYXRpYWxfc3RyZWFtLCB0bXBfdmFsOworCS8vdTgJaTsKKwlzdGF0aWMgdTMyIHNsaWRlX3Jzc2lfaW5kZXg9MCwgc2xpZGVfcnNzaV9zdGF0aXN0aWNzPTA7CisJc3RhdGljIHUzMiBzbGlkZV9ldm1faW5kZXg9MCwgc2xpZGVfZXZtX3N0YXRpc3RpY3M9MDsKKwlzdGF0aWMgdTMyIGxhc3RfcnNzaT0wLCBsYXN0X2V2bT0wOworCisJc3RhdGljIHUzMiBzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXg9MCwgc2xpZGVfYmVhY29uX2FkY19wd2RiX3N0YXRpc3RpY3M9MDsKKwlzdGF0aWMgdTMyIGxhc3RfYmVhY29uX2FkY19wd2RiPTA7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaGRyOworCXUxNiBzYyA7CisJdW5zaWduZWQgaW50IGZyYWcsc2VxOworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKWJ1ZmZlcjsKKwlzYyA9IGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0bCk7CisJZnJhZyA9IFdMQU5fR0VUX1NFUV9GUkFHKHNjKTsKKwlzZXEgPSBXTEFOX0dFVF9TRVFfU0VRKHNjKTsKKwkvL2Nvc2EgYWRkIDA0MjkyMDA4IHRvIHJlY29yZCB0aGUgc2VxdWVuY2UgbnVtYmVyCisJcGN1cnJlbnRfc3RhdHMtPlNlcV9OdW0gPSBzZXE7CisJLy8KKwkvLyBDaGVjayB3aGV0aGVyIHdlIHNob3VsZCB0YWtlIHRoZSBwcmV2aW91cyBwYWNrZXQgaW50byBhY2NvdW50aW5nCisJLy8KKwlpZighcHByZXZpb3VzX3N0YXRzLT5iSXNBTVBEVSkKKwl7CisJCS8vIGlmIHByZXZpb3VzIHBhY2tldCBpcyBub3QgYWdncmVnYXRlZCBwYWNrZXQKKwkJYmNoZWNrID0gdHJ1ZTsKKwl9ZWxzZQorCXsKKwl9CisKKworCWlmKHNsaWRlX3Jzc2lfc3RhdGlzdGljcysrID49IFBIWV9SU1NJX1NMSURfV0lOX01BWCkKKwl7CisJCXNsaWRlX3Jzc2lfc3RhdGlzdGljcyA9IFBIWV9SU1NJX1NMSURfV0lOX01BWDsKKwkJbGFzdF9yc3NpID0gcHJpdi0+c3RhdHMuc2xpZGVfc2lnbmFsX3N0cmVuZ3RoW3NsaWRlX3Jzc2lfaW5kZXhdOworCQlwcml2LT5zdGF0cy5zbGlkZV9yc3NpX3RvdGFsIC09IGxhc3RfcnNzaTsKKwl9CisJcHJpdi0+c3RhdHMuc2xpZGVfcnNzaV90b3RhbCArPSBwcHJldmlvdXNfc3RhdHMtPlNpZ25hbFN0cmVuZ3RoOworCisJcHJpdi0+c3RhdHMuc2xpZGVfc2lnbmFsX3N0cmVuZ3RoW3NsaWRlX3Jzc2lfaW5kZXgrK10gPSBwcHJldmlvdXNfc3RhdHMtPlNpZ25hbFN0cmVuZ3RoOworCWlmKHNsaWRlX3Jzc2lfaW5kZXggPj0gUEhZX1JTU0lfU0xJRF9XSU5fTUFYKQorCQlzbGlkZV9yc3NpX2luZGV4ID0gMDsKKworCS8vIDwxPiBTaG93ZWQgb24gVUkgZm9yIHVzZXIsIGluIGRibQorCXRtcF92YWwgPSBwcml2LT5zdGF0cy5zbGlkZV9yc3NpX3RvdGFsL3NsaWRlX3Jzc2lfc3RhdGlzdGljczsKKwlwcml2LT5zdGF0cy5zaWduYWxfc3RyZW5ndGggPSBydGw4MTl4X3RyYW5zbGF0ZV90b2RibSgodTgpdG1wX3ZhbCk7CisJcGN1cnJlbnRfc3RhdHMtPnJzc2kgPSBwcml2LT5zdGF0cy5zaWduYWxfc3RyZW5ndGg7CisJLy8KKwkvLyBJZiB0aGUgcHJldmlvdXMgcGFja2V0IGRvZXMgbm90IG1hdGNoIHRoZSBjcml0ZXJpYSwgbmVnbGVjdCBpdAorCS8vCisJaWYoIXBwcmV2aW91c19zdGF0cy0+YlBhY2tldE1hdGNoQlNTSUQpCisJeworCQlpZighcHByZXZpb3VzX3N0YXRzLT5iVG9TZWxmQkEpCisJCQlyZXR1cm47CisJfQorCisJaWYoIWJjaGVjaykKKwkJcmV0dXJuOworCisKKwkvL3J0bDgxOTBfcHJvY2Vzc19jY2tfcnhwYXRoc2VsKHByaXYscHByZXZpb3VzX3N0YXRzKTsvL29ubHkgcnRsODE5MCBzdXBwb3J0ZWQKKworCS8vCisJLy8gQ2hlY2sgUlNTSQorCS8vCisJcHJpdi0+c3RhdHMubnVtX3Byb2Nlc3NfcGh5aW5mbysrOworCisJLyogcmVjb3JkIHRoZSBnZW5lcmFsIHNpZ25hbCBzdHJlbmd0aCB0byB0aGUgc2xpZGluZyB3aW5kb3cuICovCisKKworCS8vIDwyPiBTaG93ZWQgb24gVUkgZm9yIGVuZ2luZWVyaW5nCisJLy8gaGFyZHdhcmUgZG9lcyBub3QgcHJvdmlkZSByc3NpIGluZm9ybWF0aW9uIGZvciBlYWNoIHJmIHBhdGggaW4gQ0NLCisJaWYoIXBwcmV2aW91c19zdGF0cy0+YklzQ0NLICYmIChwcHJldmlvdXNfc3RhdHMtPmJQYWNrZXRUb1NlbGYgfHwgcHByZXZpb3VzX3N0YXRzLT5iVG9TZWxmQkEpKQorCXsKKwkJZm9yIChyZnBhdGggPSBSRjkwX1BBVEhfQTsgcmZwYXRoIDwgcHJpdi0+TnVtVG90YWxSRlBhdGg7IHJmcGF0aCsrKQorCQl7CisJCSAgICAgaWYgKCFydGw4MTkyX3BoeV9DaGVja0lzTGVnYWxSRlBhdGgocHJpdi0+aWVlZTgwMjExLT5kZXYsIHJmcGF0aCkpCisJCQkJIGNvbnRpbnVlOworCisJCQkvL0ZpeGVkIGJ5IEphY2tlbiAyMDA4LTAzLTIwCisJCQlpZihwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSA9PSAwKQorCQkJeworCQkJCXByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdID0gcHByZXZpb3VzX3N0YXRzLT5SeE1JTU9TaWduYWxTdHJlbmd0aFtyZnBhdGhdOworCQkJCS8vRGJnUHJpbnQoIk1JTU8gUlNTSSBpbml0aWFsaXplIFxuIik7CisJCQl9CisJCQlpZihwcHJldmlvdXNfc3RhdHMtPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW3JmcGF0aF0gID4gcHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0pCisJCQl7CisJCQkJcHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0gPQorCQkJCQkoIChwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSooUnhfU21vb3RoX0ZhY3Rvci0xKSkgKworCQkJCQkocHByZXZpb3VzX3N0YXRzLT5SeE1JTU9TaWduYWxTdHJlbmd0aFtyZnBhdGhdKSkgLyhSeF9TbW9vdGhfRmFjdG9yKTsKKwkJCQlwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSA9IHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdICArIDE7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0gPQorCQkJCQkoIChwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSooUnhfU21vb3RoX0ZhY3Rvci0xKSkgKworCQkJCQkocHByZXZpb3VzX3N0YXRzLT5SeE1JTU9TaWduYWxTdHJlbmd0aFtyZnBhdGhdKSkgLyhSeF9TbW9vdGhfRmFjdG9yKTsKKwkJCX0KKwkJCVJUX1RSQUNFKENPTVBfREJHLCJwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZQYXRoXSAgPSAlZCBcbiIgLHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdICk7CisJCX0KKwl9CisKKworCS8vCisJLy8gQ2hlY2sgUFdEQi4KKwkvLworCVJUX1RSQUNFKENPTVBfUlhERVNDLCAiU21vb3RoICVzIFBXREIgPSAlZFxuIiwKKwkJCQlwcHJldmlvdXNfc3RhdHMtPmJJc0NDSz8gIkNDSyI6ICJPRkRNIiwKKwkJCQlwcHJldmlvdXNfc3RhdHMtPlJ4UFdEQkFsbCk7CisKKwlpZihwcHJldmlvdXNfc3RhdHMtPmJQYWNrZXRCZWFjb24pCisJeworLyogcmVjb3JkIHRoZSBiZWFjb24gcHdkYiB0byB0aGUgc2xpZGluZyB3aW5kb3cuICovCisJCWlmKHNsaWRlX2JlYWNvbl9hZGNfcHdkYl9zdGF0aXN0aWNzKysgPj0gUEhZX0JlYWNvbl9SU1NJX1NMSURfV0lOX01BWCkKKwkJeworCQkJc2xpZGVfYmVhY29uX2FkY19wd2RiX3N0YXRpc3RpY3MgPSBQSFlfQmVhY29uX1JTU0lfU0xJRF9XSU5fTUFYOworCQkJbGFzdF9iZWFjb25fYWRjX3B3ZGIgPSBwcml2LT5zdGF0cy5TbGlkZV9CZWFjb25fcHdkYltzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXhdOworCQkJcHJpdi0+c3RhdHMuU2xpZGVfQmVhY29uX1RvdGFsIC09IGxhc3RfYmVhY29uX2FkY19wd2RiOworCQkJLy9EYmdQcmludCgic2xpZGVfYmVhY29uX2FkY19wd2RiX2luZGV4ID0gJWQsIGxhc3RfYmVhY29uX2FkY19wd2RiID0gJWQsIEFkYXB0ZXItPlJ4U3RhdHMuU2xpZGVfQmVhY29uX1RvdGFsID0gJWRcbiIsCisJCQkvLwlzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXgsIGxhc3RfYmVhY29uX2FkY19wd2RiLCBBZGFwdGVyLT5SeFN0YXRzLlNsaWRlX0JlYWNvbl9Ub3RhbCk7CisJCX0KKwkJcHJpdi0+c3RhdHMuU2xpZGVfQmVhY29uX1RvdGFsICs9IHBwcmV2aW91c19zdGF0cy0+UnhQV0RCQWxsOworCQlwcml2LT5zdGF0cy5TbGlkZV9CZWFjb25fcHdkYltzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXhdID0gcHByZXZpb3VzX3N0YXRzLT5SeFBXREJBbGw7CisJCS8vRGJnUHJpbnQoInNsaWRlX2JlYWNvbl9hZGNfcHdkYl9pbmRleCA9ICVkLCBwUHJldmlvdXNSZmQtPlN0YXR1cy5SeFBXREJBbGwgPSAlZFxuIiwgc2xpZGVfYmVhY29uX2FkY19wd2RiX2luZGV4LCBwUHJldmlvdXNSZmQtPlN0YXR1cy5SeFBXREJBbGwpOworCQlzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXgrKzsKKwkJaWYoc2xpZGVfYmVhY29uX2FkY19wd2RiX2luZGV4ID49IFBIWV9CZWFjb25fUlNTSV9TTElEX1dJTl9NQVgpCisJCQlzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXggPSAwOworCQlwcHJldmlvdXNfc3RhdHMtPlJ4UFdEQkFsbCA9IHByaXYtPnN0YXRzLlNsaWRlX0JlYWNvbl9Ub3RhbC9zbGlkZV9iZWFjb25fYWRjX3B3ZGJfc3RhdGlzdGljczsKKwkJaWYocHByZXZpb3VzX3N0YXRzLT5SeFBXREJBbGwgPj0gMykKKwkJCXBwcmV2aW91c19zdGF0cy0+UnhQV0RCQWxsIC09IDM7CisJfQorCisJUlRfVFJBQ0UoQ09NUF9SWERFU0MsICJTbW9vdGggJXMgUFdEQiA9ICVkXG4iLAorCQkJCXBwcmV2aW91c19zdGF0cy0+YklzQ0NLPyAiQ0NLIjogIk9GRE0iLAorCQkJCXBwcmV2aW91c19zdGF0cy0+UnhQV0RCQWxsKTsKKworCisJaWYocHByZXZpb3VzX3N0YXRzLT5iUGFja2V0VG9TZWxmIHx8IHBwcmV2aW91c19zdGF0cy0+YlBhY2tldEJlYWNvbiB8fCBwcHJldmlvdXNfc3RhdHMtPmJUb1NlbGZCQSkKKwl7CisJCWlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCAwKQkvLyBpbml0aWFsaXplCisJCXsKKwkJCXByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPSBwcHJldmlvdXNfc3RhdHMtPlJ4UFdEQkFsbDsKKwkJCS8vRGJnUHJpbnQoIkZpcnN0IHB3ZGIgaW5pdGlhbGl6ZSBcbiIpOworCQl9CisJCWlmKHBwcmV2aW91c19zdGF0cy0+UnhQV0RCQWxsID4gKHUzMilwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiKQorCQl7CisJCQlwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0KKwkJCQkJKCAoKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIpKihSeF9TbW9vdGhfRmFjdG9yLTEpKSArCisJCQkJCShwcHJldmlvdXNfc3RhdHMtPlJ4UFdEQkFsbCkpIC8oUnhfU21vb3RoX0ZhY3Rvcik7CisJCQlwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0gcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiArIDE7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0KKwkJCQkJKCAoKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIpKihSeF9TbW9vdGhfRmFjdG9yLTEpKSArCisJCQkJCShwcHJldmlvdXNfc3RhdHMtPlJ4UFdEQkFsbCkpIC8oUnhfU21vb3RoX0ZhY3Rvcik7CisJCX0KKworCX0KKworCS8vCisJLy8gQ2hlY2sgRVZNCisJLy8KKwkvKiByZWNvcmQgdGhlIGdlbmVyYWwgRVZNIHRvIHRoZSBzbGlkaW5nIHdpbmRvdy4gKi8KKwlpZihwcHJldmlvdXNfc3RhdHMtPlNpZ25hbFF1YWxpdHkgPT0gMCkKKwl7CisJfQorCWVsc2UKKwl7CisJCWlmKHBwcmV2aW91c19zdGF0cy0+YlBhY2tldFRvU2VsZiB8fCBwcHJldmlvdXNfc3RhdHMtPmJQYWNrZXRCZWFjb24gfHwgcHByZXZpb3VzX3N0YXRzLT5iVG9TZWxmQkEpeworCQkJaWYoc2xpZGVfZXZtX3N0YXRpc3RpY3MrKyA+PSBQSFlfUlNTSV9TTElEX1dJTl9NQVgpeworCQkJCXNsaWRlX2V2bV9zdGF0aXN0aWNzID0gUEhZX1JTU0lfU0xJRF9XSU5fTUFYOworCQkJCWxhc3RfZXZtID0gcHJpdi0+c3RhdHMuc2xpZGVfZXZtW3NsaWRlX2V2bV9pbmRleF07CisJCQkJcHJpdi0+c3RhdHMuc2xpZGVfZXZtX3RvdGFsIC09IGxhc3RfZXZtOworCQkJfQorCisJCQlwcml2LT5zdGF0cy5zbGlkZV9ldm1fdG90YWwgKz0gcHByZXZpb3VzX3N0YXRzLT5TaWduYWxRdWFsaXR5OworCisJCQlwcml2LT5zdGF0cy5zbGlkZV9ldm1bc2xpZGVfZXZtX2luZGV4KytdID0gcHByZXZpb3VzX3N0YXRzLT5TaWduYWxRdWFsaXR5OworCQkJaWYoc2xpZGVfZXZtX2luZGV4ID49IFBIWV9SU1NJX1NMSURfV0lOX01BWCkKKwkJCQlzbGlkZV9ldm1faW5kZXggPSAwOworCisJCQkvLyA8MT4gU2hvd2VkIG9uIFVJIGZvciB1c2VyLCBpbiBwZXJjZW50YWdlLgorCQkJdG1wX3ZhbCA9IHByaXYtPnN0YXRzLnNsaWRlX2V2bV90b3RhbC9zbGlkZV9ldm1fc3RhdGlzdGljczsKKwkJCXByaXYtPnN0YXRzLnNpZ25hbF9xdWFsaXR5ID0gdG1wX3ZhbDsKKwkJCS8vY29zYSBhZGQgMTAvMTEvMjAwNywgU2hvd2VkIG9uIFVJIGZvciB1c2VyIGluIFdpbmRvd3MgVmlzdGEsIGZvciBMaW5rIHF1YWxpdHkuCisJCQlwcml2LT5zdGF0cy5sYXN0X3NpZ25hbF9zdHJlbmd0aF9pbnBlcmNlbnQgPSB0bXBfdmFsOworCQl9CisKKwkJLy8gPDI+IFNob3dlZCBvbiBVSSBmb3IgZW5naW5lZXJpbmcKKwkJaWYocHByZXZpb3VzX3N0YXRzLT5iUGFja2V0VG9TZWxmIHx8IHBwcmV2aW91c19zdGF0cy0+YlBhY2tldEJlYWNvbiB8fCBwcHJldmlvdXNfc3RhdHMtPmJUb1NlbGZCQSkKKwkJeworCQkJZm9yKG5zcGF0aWFsX3N0cmVhbSA9IDA7IG5zcGF0aWFsX3N0cmVhbTwyIDsgbnNwYXRpYWxfc3RyZWFtKyspIC8vIDIgc3BhdGlhbCBzdHJlYW0KKwkJCXsKKwkJCQlpZihwcHJldmlvdXNfc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbbnNwYXRpYWxfc3RyZWFtXSAhPSAtMSkKKwkJCQl7CisJCQkJCWlmKHByaXYtPnN0YXRzLnJ4X2V2bV9wZXJjZW50YWdlW25zcGF0aWFsX3N0cmVhbV0gPT0gMCkJLy8gaW5pdGlhbGl6ZQorCQkJCQl7CisJCQkJCQlwcml2LT5zdGF0cy5yeF9ldm1fcGVyY2VudGFnZVtuc3BhdGlhbF9zdHJlYW1dID0gcHByZXZpb3VzX3N0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5W25zcGF0aWFsX3N0cmVhbV07CisJCQkJCX0KKwkJCQkJcHJpdi0+c3RhdHMucnhfZXZtX3BlcmNlbnRhZ2VbbnNwYXRpYWxfc3RyZWFtXSA9CisJCQkJCQkoIChwcml2LT5zdGF0cy5yeF9ldm1fcGVyY2VudGFnZVtuc3BhdGlhbF9zdHJlYW1dKiAoUnhfU21vb3RoX0ZhY3Rvci0xKSkgKworCQkJCQkJKHBwcmV2aW91c19zdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVtuc3BhdGlhbF9zdHJlYW1dKiAxKSkgLyAoUnhfU21vb3RoX0ZhY3Rvcik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CXJ0bDgxOXhfcXVlcnlfcnhwd3JwZXJjZW50YWdlKCkKKyAqCisgKiBPdmVydmlldzoKKyAqCisgKiBJbnB1dDoJCWNoYXIJCWFudHBvd2VyCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCTAtMTAwIHBlcmNlbnRhZ2UKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDUvMjYvMjAwOAlhbXkJCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdTggcnRsODE5eF9xdWVyeV9yeHB3cnBlcmNlbnRhZ2UoCisJY2hhcgkJYW50cG93ZXIKKwkpCit7CisJaWYgKChhbnRwb3dlciA8PSAtMTAwKSB8fCAoYW50cG93ZXIgPj0gMjApKQorCXsKKwkJcmV0dXJuCTA7CisJfQorCWVsc2UgaWYgKGFudHBvd2VyID49IDApCisJeworCQlyZXR1cm4JMTAwOworCX0KKwllbHNlCisJeworCQlyZXR1cm4JKDEwMCthbnRwb3dlcik7CisJfQorCit9CS8qIFF1ZXJ5UnhQd3JQZXJjZW50YWdlICovCisKK3N0YXRpYyB1OAorcnRsODE5eF9ldm1fZGJ0b3BlcmNlbnRhZ2UoCisgICAgY2hhciB2YWx1ZQorICAgICkKK3sKKyAgICBjaGFyIHJldF92YWw7CisKKyAgICByZXRfdmFsID0gdmFsdWU7CisKKyAgICBpZihyZXRfdmFsID49IDApCisgICAgICAgIHJldF92YWwgPSAwOworICAgIGlmKHJldF92YWwgPD0gLTMzKQorICAgICAgICByZXRfdmFsID0gLTMzOworICAgIHJldF92YWwgPSAwIC0gcmV0X3ZhbDsKKyAgICByZXRfdmFsKj0zOworCWlmKHJldF92YWwgPT0gOTkpCisJCXJldF92YWwgPSAxMDA7CisgICAgcmV0dXJuKHJldF92YWwpOworfQorLy8KKy8vCURlc2NyaXB0aW9uOgorLy8gCVdlIHdhbnQgZ29vZC1sb29raW5nIGZvciBzaWduYWwgc3RyZW5ndGgvcXVhbGl0eQorLy8JMjAwNy83LzE5IDAxOjA5LCBieSBjb3NhLgorLy8KK2xvbmcKK3J0bDgxOXhfc2lnbmFsX3NjYWxlX21hcHBpbmcoCisJbG9uZyBjdXJyc2lnCisJKQoreworCWxvbmcgcmV0c2lnOworCisJLy8gU3RlcCAxLiBTY2FsZSBtYXBwaW5nLgorCWlmKGN1cnJzaWcgPj0gNjEgJiYgY3VycnNpZyA8PSAxMDApCisJeworCQlyZXRzaWcgPSA5MCArICgoY3VycnNpZyAtIDYwKSAvIDQpOworCX0KKwllbHNlIGlmKGN1cnJzaWcgPj0gNDEgJiYgY3VycnNpZyA8PSA2MCkKKwl7CisJCXJldHNpZyA9IDc4ICsgKChjdXJyc2lnIC0gNDApIC8gMik7CisJfQorCWVsc2UgaWYoY3VycnNpZyA+PSAzMSAmJiBjdXJyc2lnIDw9IDQwKQorCXsKKwkJcmV0c2lnID0gNjYgKyAoY3VycnNpZyAtIDMwKTsKKwl9CisJZWxzZSBpZihjdXJyc2lnID49IDIxICYmIGN1cnJzaWcgPD0gMzApCisJeworCQlyZXRzaWcgPSA1NCArIChjdXJyc2lnIC0gMjApOworCX0KKwllbHNlIGlmKGN1cnJzaWcgPj0gNSAmJiBjdXJyc2lnIDw9IDIwKQorCXsKKwkJcmV0c2lnID0gNDIgKyAoKChjdXJyc2lnIC0gNSkgKiAyKSAvIDMpOworCX0KKwllbHNlIGlmKGN1cnJzaWcgPT0gNCkKKwl7CisJCXJldHNpZyA9IDM2OworCX0KKwllbHNlIGlmKGN1cnJzaWcgPT0gMykKKwl7CisJCXJldHNpZyA9IDI3OworCX0KKwllbHNlIGlmKGN1cnJzaWcgPT0gMikKKwl7CisJCXJldHNpZyA9IDE4OworCX0KKwllbHNlIGlmKGN1cnJzaWcgPT0gMSkKKwl7CisJCXJldHNpZyA9IDk7CisJfQorCWVsc2UKKwl7CisJCXJldHNpZyA9IGN1cnJzaWc7CisJfQorCisJcmV0dXJuIHJldHNpZzsKK30KKworc3RhdGljIHZvaWQgcnRsODE5Ml9xdWVyeV9yeHBoeXN0YXR1cygKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqIHByaXYsCisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqIHBzdGF0cywKKwlyeF9kcnZpbmZvXzgxOXhfdXNiICAqIHBkcnZpbmZvLAorCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKiBwcmVjb3JkX3N0YXRzLAorCWJvb2wgYnBhY2tldF9tYXRjaF9ic3NpZCwKKwlib29sIGJwYWNrZXRfdG9zZWxmLAorCWJvb2wgYlBhY2tldEJlYWNvbiwKKwlib29sIGJUb1NlbGZCQQorCSkKK3sKKwkvL1BSVF9SRkRfU1RBVFVTCQlwUnRSZmRTdGF0dXMgPSAmKHBSZmQtPlN0YXR1cyk7CisJcGh5X3N0c19vZmRtXzgxOXh1c2JfdCoJcG9mZG1fYnVmOworCXBoeV9zdHNfY2NrXzgxOXh1c2JfdAkqCXBjY2tfYnVmOworCXBoeV9vZmRtX3J4X3N0YXR1c19yeHNjX3NnaWVuX2V4aW50ZmZsYWcqIHByeHNjOworCXU4CQkJCSpwcnhwa3Q7CisJdTgJCQkJaSwgbWF4X3NwYXRpYWxfc3RyZWFtLCB0bXBfcnhzbnIsIHRtcF9yeGV2bSwgcnhzY19zZ2llbl9leGZsZzsKKwljaGFyCQkJCXJ4X3B3cls0XSwgcnhfcHdyX2FsbD0wOworCS8vbG9uZwkJCQlyeF9hdmdfcHdyID0gMDsKKwljaGFyCQkJCXJ4X3NuclgsIHJ4X2V2bVg7CisJdTgJCQkJZXZtLCBwd2RiX2FsbDsKKwl1MzIJCQkJUlNTSSwgdG90YWxfcnNzaT0wOy8vLCB0b3RhbF9ldm09MDsKKy8vCWxvbmcJCQkJc2lnbmFsX3N0cmVuZ3RoX2luZGV4ID0gMDsKKwl1OAkJCQlpc19jY2tfcmF0ZT0wOworCXU4CQkJCXJmX3J4X251bSA9IDA7CisKKworCXByaXYtPnN0YXRzLm51bXFyeV9waHlzdGF0dXMrKzsKKworCWlzX2Nja19yYXRlID0gcnhfaGFsX2lzX2Nja19yYXRlKHBkcnZpbmZvKTsKKworCS8vIFJlY29yZCBpdCBmb3IgbmV4dCBwYWNrZXQgcHJvY2Vzc2luZworCW1lbXNldChwcmVjb3JkX3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cykpOworCXBzdGF0cy0+YlBhY2tldE1hdGNoQlNTSUQgPSBwcmVjb3JkX3N0YXRzLT5iUGFja2V0TWF0Y2hCU1NJRCA9IGJwYWNrZXRfbWF0Y2hfYnNzaWQ7CisJcHN0YXRzLT5iUGFja2V0VG9TZWxmID0gcHJlY29yZF9zdGF0cy0+YlBhY2tldFRvU2VsZiA9IGJwYWNrZXRfdG9zZWxmOworCXBzdGF0cy0+YklzQ0NLID0gcHJlY29yZF9zdGF0cy0+YklzQ0NLID0gaXNfY2NrX3JhdGU7Ly9SWF9IQUxfSVNfQ0NLX1JBVEUocERydkluZm8pOworCXBzdGF0cy0+YlBhY2tldEJlYWNvbiA9IHByZWNvcmRfc3RhdHMtPmJQYWNrZXRCZWFjb24gPSBiUGFja2V0QmVhY29uOworCXBzdGF0cy0+YlRvU2VsZkJBID0gcHJlY29yZF9zdGF0cy0+YlRvU2VsZkJBID0gYlRvU2VsZkJBOworCisJcHJ4cGt0ID0gKHU4KilwZHJ2aW5mbzsKKworCS8qIE1vdmUgcG9pbnRlciB0byB0aGUgMTZ0aCBieXRlcy4gUGh5IHN0YXR1cyBzdGFydCBhZGRyZXNzLiAqLworCXByeHBrdCArPSBzaXplb2YocnhfZHJ2aW5mb184MTl4X3VzYik7CisKKwkvKiBJbml0aWFsIHRoZSBjY2sgYW5kIG9mZG0gYnVmZmVyIHBvaW50ZXIgKi8KKwlwY2NrX2J1ZiA9IChwaHlfc3RzX2Nja184MTl4dXNiX3QgKilwcnhwa3Q7CisJcG9mZG1fYnVmID0gKHBoeV9zdHNfb2ZkbV84MTl4dXNiX3QgKilwcnhwa3Q7CisKKwlwc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbMF0gPSAtMTsKKwlwc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbMV0gPSAtMTsKKwlwcmVjb3JkX3N0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5WzBdID0gLTE7CisJcHJlY29yZF9zdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVsxXSA9IC0xOworCisJaWYoaXNfY2NrX3JhdGUpCisJeworCQkvLworCQkvLyAoMSlIYXJkd2FyZSBkb2VzIG5vdCBwcm92aWRlIFJTU0kgZm9yIENDSworCQkvLworCisJCS8vCisJCS8vICgyKVBXREIsIEF2ZXJhZ2UgUFdEQiBjYWNsdWF0ZWQgYnkgaGFyZHdhcmUgKGZvciByYXRlIGFkYXB0aXZlKQorCQkvLworCQl1OCByZXBvcnQ7Ly8sIGNja19hZ2NfcnB0OworCisJCXByaXYtPnN0YXRzLm51bXFyeV9waHlzdGF0dXNDQ0srKzsKKworCQlpZighcHJpdi0+YkNja0hpZ2hQb3dlcikKKwkJeworCQkJcmVwb3J0ID0gcGNja19idWYtPmNja19hZ2NfcnB0ICYgMHhjMDsKKwkJCXJlcG9ydCA9IHJlcG9ydD4+NjsKKwkJCXN3aXRjaChyZXBvcnQpCisJCQl7CisJCQkJLy9GaXhlZCBieSBKYWNrZW4gZnJvbSBCcnlhbnQgMjAwOC0wMy0yMAorCQkJCS8vT3JpZ2luYWwgdmFsdWUgaXMgLTM4ICwgLTI2ICwgLTE0ICwgLTIKKwkJCQkvL0ZpeGVkIHZhbHVlIGlzIC0zNSAsIC0yMyAsIC0xMSAsIDYKKwkJCQljYXNlIDB4MzoKKwkJCQkJcnhfcHdyX2FsbCA9IC0zNSAtIChwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJiAweDNlKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDI6CisJCQkJCXJ4X3B3cl9hbGwgPSAtMjMgLSAocGNja19idWYtPmNja19hZ2NfcnB0ICYgMHgzZSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMHgxOgorCQkJCQlyeF9wd3JfYWxsID0gLTExIC0gKHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmIDB4M2UpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MDoKKwkJCQkJcnhfcHdyX2FsbCA9IDYgLSAocGNja19idWYtPmNja19hZ2NfcnB0ICYgMHgzZSk7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJcmVwb3J0ID0gcGNja19idWYtPmNja19hZ2NfcnB0ICYgMHg2MDsKKwkJCXJlcG9ydCA9IHJlcG9ydD4+NTsKKwkJCXN3aXRjaChyZXBvcnQpCisJCQl7CisJCQkJY2FzZSAweDM6CisJCQkJCXJ4X3B3cl9hbGwgPSAtMzUgLSAoKHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmIDB4MWYpPDwxKSA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMHgyOgorCQkJCQlyeF9wd3JfYWxsID0gLTIzIC0gKChwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJiAweDFmKTw8MSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMHgxOgorCQkJCQlyeF9wd3JfYWxsID0gLTExIC0gKChwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJiAweDFmKTw8MSkgOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MDoKKwkJCQkJcnhfcHdyX2FsbCA9IDYgLSAoKHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmIDB4MWYpPDwxKSA7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcHdkYl9hbGwgPSBydGw4MTl4X3F1ZXJ5X3J4cHdycGVyY2VudGFnZShyeF9wd3JfYWxsKTsKKwkJcHN0YXRzLT5SeFBXREJBbGwgPSBwcmVjb3JkX3N0YXRzLT5SeFBXREJBbGwgPSBwd2RiX2FsbDsKKwkJcHN0YXRzLT5SZWN2U2lnbmFsUG93ZXIgPSBwd2RiX2FsbDsKKworCQkvLworCQkvLyAoMykgR2V0IFNpZ25hbCBRdWFsaXR5IChFVk0pCisJCS8vCisJCS8vaWYoYnBhY2tldF9tYXRjaF9ic3NpZCkKKwkJeworCQkJdTgJc3E7CisKKwkJCWlmKHBzdGF0cy0+UnhQV0RCQWxsID4gNDApCisJCQl7CisJCQkJc3EgPSAxMDA7CisJCQl9ZWxzZQorCQkJeworCQkJCXNxID0gcGNja19idWYtPnNxX3JwdDsKKworCQkJCWlmKHBjY2tfYnVmLT5zcV9ycHQgPiA2NCkKKwkJCQkJc3EgPSAwOworCQkJCWVsc2UgaWYgKHBjY2tfYnVmLT5zcV9ycHQgPCAyMCkKKwkJCQkJc3EgPSAxMDA7CisJCQkJZWxzZQorCQkJCQlzcSA9ICgoNjQtc3EpICogMTAwKSAvIDQ0OworCQkJfQorCQkJcHN0YXRzLT5TaWduYWxRdWFsaXR5ID0gcHJlY29yZF9zdGF0cy0+U2lnbmFsUXVhbGl0eSA9IHNxOworCQkJcHN0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5WzBdID0gcHJlY29yZF9zdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVswXSA9IHNxOworCQkJcHN0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5WzFdID0gcHJlY29yZF9zdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVsxXSA9IC0xOworCQl9CisJfQorCWVsc2UKKwl7CisJCXByaXYtPnN0YXRzLm51bXFyeV9waHlzdGF0dXNIVCsrOworCQkvLworCQkvLyAoMSlHZXQgUlNTSSBmb3IgSFQgcmF0ZQorCQkvLworCQlmb3IoaT1SRjkwX1BBVEhfQTsgaTxwcml2LT5OdW1Ub3RhbFJGUGF0aDsgaSsrKQorCQl7CisJCQkvLyAyMDA4LzAxLzMwIE1IIHdlIHdpbGwganVkZ2UgUkYgUlggcGF0aCBub3cuCisJCQlpZiAocHJpdi0+YnJmcGF0aF9yeGVuYWJsZVtpXSkKKwkJCQlyZl9yeF9udW0rKzsKKwkJCWVsc2UKKwkJCQljb250aW51ZTsKKworCQlpZiAoIXJ0bDgxOTJfcGh5X0NoZWNrSXNMZWdhbFJGUGF0aChwcml2LT5pZWVlODAyMTEtPmRldiwgaSkpCisJCQkJY29udGludWU7CisKKwkJCS8vRml4ZWQgYnkgSmFja2VuIGZyb20gQnJ5YW50IDIwMDgtMDMtMjAKKwkJCS8vT3JpZ2luYWwgdmFsdWUgaXMgMTA2CisJCQlyeF9wd3JbaV0gPSAoKHBvZmRtX2J1Zi0+dHJzd19nYWluX1hbaV0mMHgzRikqMikgLSAxMDY7CisKKwkJCS8vR2V0IFJ4IHNuciB2YWx1ZSBpbiBEQgorCQkJdG1wX3J4c25yID0JcG9mZG1fYnVmLT5yeHNucl9YW2ldOworCQkJcnhfc25yWCA9IChjaGFyKSh0bXBfcnhzbnIpOworCQkJLy9yeF9zbnJYID4+PSAxOzsKKwkJCXJ4X3NuclggLz0gMjsKKwkJCXByaXYtPnN0YXRzLnJ4U05SZEJbaV0gPSAobG9uZylyeF9zbnJYOworCisJCQkvKiBUcmFuc2xhdGUgREJNIHRvIHBlcmNlbnRhZ2UuICovCisJCQlSU1NJID0gcnRsODE5eF9xdWVyeV9yeHB3cnBlcmNlbnRhZ2UocnhfcHdyW2ldKTsKKwkJCXRvdGFsX3Jzc2kgKz0gUlNTSTsKKworCQkJLyogUmVjb3JkIFNpZ25hbCBTdHJlbmd0aCBmb3IgbmV4dCBwYWNrZXQgKi8KKwkJCS8vaWYoYnBhY2tldF9tYXRjaF9ic3NpZCkKKwkJCXsKKwkJCQlwc3RhdHMtPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW2ldID0odTgpIFJTU0k7CisJCQkJcHJlY29yZF9zdGF0cy0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbaV0gPSh1OCkgUlNTSTsKKwkJCX0KKwkJfQorCisKKwkJLy8KKwkJLy8gKDIpUFdEQiwgQXZlcmFnZSBQV0RCIGNhY2x1YXRlZCBieSBoYXJkd2FyZSAoZm9yIHJhdGUgYWRhcHRpdmUpCisJCS8vCisJCS8vRml4ZWQgYnkgSmFja2VuIGZyb20gQnJ5YW50IDIwMDgtMDMtMjAKKwkJLy9PcmlnaW5hbCB2YWx1ZSBpcyAxMDYKKwkJcnhfcHdyX2FsbCA9ICgoKHBvZmRtX2J1Zi0+cHdkYl9hbGwgKSA+PiAxICkmIDB4N2YpIC0xMDY7CisJCXB3ZGJfYWxsID0gcnRsODE5eF9xdWVyeV9yeHB3cnBlcmNlbnRhZ2UocnhfcHdyX2FsbCk7CisKKwkJcHN0YXRzLT5SeFBXREJBbGwgPSBwcmVjb3JkX3N0YXRzLT5SeFBXREJBbGwgPSBwd2RiX2FsbDsKKwkJcHN0YXRzLT5SeFBvd2VyID0gcHJlY29yZF9zdGF0cy0+UnhQb3dlciA9ICByeF9wd3JfYWxsOworCisJCS8vCisJCS8vICgzKUVWTSBvZiBIVCByYXRlCisJCS8vCisJCWlmKHBkcnZpbmZvLT5SeEhUICYmIHBkcnZpbmZvLT5SeFJhdGU+PURFU0M5MF9SQVRFTUNTOCAmJgorCQkJcGRydmluZm8tPlJ4UmF0ZTw9REVTQzkwX1JBVEVNQ1MxNSkKKwkJCW1heF9zcGF0aWFsX3N0cmVhbSA9IDI7IC8vYm90aCBzcGF0aWFsIHN0cmVhbSBtYWtlIHNlbnNlCisJCWVsc2UKKwkJCW1heF9zcGF0aWFsX3N0cmVhbSA9IDE7IC8vb25seSBzcGF0aWFsIHN0cmVhbSAxIG1ha2VzIHNlbnNlCisKKwkJZm9yKGk9MDsgaTxtYXhfc3BhdGlhbF9zdHJlYW07IGkrKykKKwkJeworCQkJdG1wX3J4ZXZtID0JcG9mZG1fYnVmLT5yeGV2bV9YW2ldOworCQkJcnhfZXZtWCA9IChjaGFyKSh0bXBfcnhldm0pOworCisJCQkvLyBEbyBub3QgdXNlIHNoaWZ0IG9wZXJhdGlvbiBsaWtlICJyeF9ldm1YID4+PSAxIiBiZWNhdXNlIHRoZSBjb21waWxvciBvZiBmcmVlIGJ1aWxkIGVudmlyb25tZW50CisJCQkvLyBmaWxsIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHRvICJ6ZXJvIiB3aGVuIGRvaW5nIHNoaWZ0aW5nIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlIGEgbmVnYXRpdmUKKwkJCS8vIHZhbHVlIHRvIHBvc2l0aXZlIG9uZSwgdGhlbiB0aGUgZGJtIHZhbHVlICh3aGljaCBpcyBzdXBwb3NlZCB0byBiZSBuZWdhdGl2ZSkgIGlzIG5vdCBjb3JyZWN0IGFueW1vcmUuCisJCQlyeF9ldm1YIC89IDI7CS8vZGJtCisKKwkJCWV2bSA9IHJ0bDgxOXhfZXZtX2RidG9wZXJjZW50YWdlKHJ4X2V2bVgpOworCQkJLy9pZihicGFja2V0X21hdGNoX2Jzc2lkKQorCQkJeworCQkJCWlmKGk9PTApIC8vIEZpbGwgdmFsdWUgaW4gUkZELCBHZXQgdGhlIGZpcnN0IHNwYXRpYWwgc3RyZWFtIG9ubHkKKwkJCQkJcHN0YXRzLT5TaWduYWxRdWFsaXR5ID0gcHJlY29yZF9zdGF0cy0+U2lnbmFsUXVhbGl0eSA9ICh1OCkoZXZtICYgMHhmZik7CisJCQkJcHN0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5W2ldID0gcHJlY29yZF9zdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVtpXSA9ICh1OCkoZXZtICYgMHhmZik7CisJCQl9CisJCX0KKworCisJCS8qIHJlY29yZCByeCBzdGF0aXN0aWNzIGZvciBkZWJ1ZyAqLworCQlyeHNjX3NnaWVuX2V4ZmxnID0gcG9mZG1fYnVmLT5yeHNjX3NnaWVuX2V4ZmxnOworCQlwcnhzYyA9CShwaHlfb2ZkbV9yeF9zdGF0dXNfcnhzY19zZ2llbl9leGludGZmbGFnICopJnJ4c2Nfc2dpZW5fZXhmbGc7CisJCWlmKHBkcnZpbmZvLT5CVykJLy80ME0gY2hhbm5lbAorCQkJcHJpdi0+c3RhdHMucmVjZWl2ZWRfYnd0eXBlWzErcHJ4c2MtPnJ4c2NdKys7CisJCWVsc2UJCQkJLy8yME0gY2hhbm5lbAorCQkJcHJpdi0+c3RhdHMucmVjZWl2ZWRfYnd0eXBlWzBdKys7CisJfQorCisJLy9VSSBCU1MgTGlzdCBzaWduYWwgc3RyZW5ndGgoaW4gcGVyY2VudGFnZSksIG1ha2UgaXQgZ29vZCBsb29raW5nLCBmcm9tIDB+MTAwLgorCS8vSXQgaXMgYXNzaWduZWQgdG8gdGhlIEJTUyBMaXN0IGluIEdldFZhbHVlRnJvbUJlYWNvbk9yUHJvYmVSc3AoKS4KKwlpZihpc19jY2tfcmF0ZSkKKwl7CisJCXBzdGF0cy0+U2lnbmFsU3RyZW5ndGggPSBwcmVjb3JkX3N0YXRzLT5TaWduYWxTdHJlbmd0aCA9ICh1OCkocnRsODE5eF9zaWduYWxfc2NhbGVfbWFwcGluZygobG9uZylwd2RiX2FsbCkpOy8vUFdEQl9BTEw7CisKKwl9CisJZWxzZQorCXsKKwkJLy9wUmZkLT5TdGF0dXMuU2lnbmFsU3RyZW5ndGggPSBwUmVjb3JkUmZkLT5TdGF0dXMuU2lnbmFsU3RyZW5ndGggPSAodTgpKFNpZ25hbFNjYWxlTWFwcGluZyh0b3RhbF9yc3NpLz1SRjkwX1BBVEhfTUFYKSk7Ly8odTgpKHRvdGFsX3Jzc2kvPVJGOTBfUEFUSF9NQVgpOworCQkvLyBXZSBjYW4ganVkZ2UgUlggcGF0aCBudW1iZXIgbm93LgorCQlpZiAocmZfcnhfbnVtICE9IDApCisJCQlwc3RhdHMtPlNpZ25hbFN0cmVuZ3RoID0gcHJlY29yZF9zdGF0cy0+U2lnbmFsU3RyZW5ndGggPSAodTgpKHJ0bDgxOXhfc2lnbmFsX3NjYWxlX21hcHBpbmcoKGxvbmcpKHRvdGFsX3Jzc2kvPXJmX3J4X251bSkpKTsKKwl9Cit9CS8qIFF1ZXJ5UnhQaHlTdGF0dXM4MTkwUGNpICovCisKK3ZvaWQKK3J0bDgxOTJfcmVjb3JkX3J4ZGVzY19mb3JsYXRlcnVzZSgKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICoJcHNyY19zdGF0cywKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICoJcHRhcmdldF9zdGF0cworKQoreworCXB0YXJnZXRfc3RhdHMtPmJJc0FNUERVID0gcHNyY19zdGF0cy0+YklzQU1QRFU7CisJcHRhcmdldF9zdGF0cy0+YkZpcnN0TVBEVSA9IHBzcmNfc3RhdHMtPmJGaXJzdE1QRFU7CisJcHRhcmdldF9zdGF0cy0+U2VxX051bSA9IHBzcmNfc3RhdHMtPlNlcV9OdW07Cit9CisKKwordm9pZCBUcmFuc2xhdGVSeFNpZ25hbFN0dWZmODE5eFVzYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKiBwc3RhdHMsCisJCQkJICAgcnhfZHJ2aW5mb184MTl4X3VzYiAgKnBkcnZpbmZvKQoreworCS8vIFRPRE86IFdlIG11c3Qgb25seSBjaGVjayBwYWNrZXQgZm9yIGN1cnJlbnQgTUFDIGFkZHJlc3MuIE5vdCBmaW5pc2gKKwlydGw4MTkyX3J4X2luZm8gKmluZm8gPSAoc3RydWN0IHJ0bDgxOTJfcnhfaW5mbyAqKXNrYi0+Y2I7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldj1pbmZvLT5kZXY7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCWJvb2wgYnBhY2tldF9tYXRjaF9ic3NpZCwgYnBhY2tldF90b3NlbGY7CisJYm9vbCBiUGFja2V0QmVhY29uPUZBTFNFLCBiVG9TZWxmQkE9RkFMU0U7CisJc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgIHByZXZpb3VzX3N0YXRzOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoZHI7Ly9ieSBhbXkKKyAgICAgICB1MTYgZmMsdHlwZTsKKworCS8vIEdldCBTaWduYWwgUXVhbGl0eSBmb3Igb25seSBSWCBkYXRhIHF1ZXVlIChidXQgbm90IGNvbW1hbmQgcXVldWUpCisKKwl1OCogdG1wX2J1ZjsKKwkvL3UxNiB0bXBfYnVmX2xlbiA9IDA7CisJdTggICpwcmFkZHI7CisKKwkvKiBHZXQgTUFDIGZyYW1lIHN0YXJ0IGFkZHJlc3MuICovCisJdG1wX2J1ZiA9ICh1OCopc2tiLT5kYXRhOy8vICsgZ2V0X3J4cGFja2V0X3NoaWZ0Ynl0ZXNfODE5eHVzYihwc3RhdHMpOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopdG1wX2J1ZjsKKwlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKwl0eXBlID0gV0xBTl9GQ19HRVRfVFlQRShmYyk7CisJcHJhZGRyID0gaGRyLT5hZGRyMTsKKworCS8qIENoZWNrIGlmIHRoZSByZWNlaXZlZCBwYWNrZXQgaXMgYWNjZXB0YWJlLiAqLworCWJwYWNrZXRfbWF0Y2hfYnNzaWQgPSAoKElFRUU4MDIxMV9GVFlQRV9DVEwgIT0gdHlwZSkgJiYKKwkJCQkJCQkoZXFNYWNBZGRyKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCAgKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUyk/IGhkci0+YWRkcjEgOiAoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMgKT8gaGRyLT5hZGRyMiA6IGhkci0+YWRkcjMpKQorCQkJCQkJCQkgJiYgKCFwc3RhdHMtPmJId0Vycm9yKSAmJiAoIXBzdGF0cy0+YkNSQykmJiAoIXBzdGF0cy0+YklDVikpOworCWJwYWNrZXRfdG9zZWxmID0gIGJwYWNrZXRfbWF0Y2hfYnNzaWQgJiAoZXFNYWNBZGRyKHByYWRkciwgcHJpdi0+aWVlZTgwMjExLT5kZXYtPmRldl9hZGRyKSk7CisKKwkJaWYoV0xBTl9GQ19HRVRfRlJBTUVUWVBFKGZjKT09IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pCisJCXsKKwkJCWJQYWNrZXRCZWFjb24gPSB0cnVlOworCQkJLy9EYmdQcmludCgiQmVhY29uIDIsIE1hdGNoQlNTSUQgPSAlZCwgVG9TZWxmID0gJWQgXG4iLCBiUGFja2V0TWF0Y2hCU1NJRCwgYlBhY2tldFRvU2VsZik7CisJCX0KKwkJaWYoV0xBTl9GQ19HRVRfRlJBTUVUWVBFKGZjKSA9PSBJRUVFODAyMTFfU1RZUEVfQkxPQ0tBQ0spCisJCXsKKwkJCWlmKChlcU1hY0FkZHIocHJhZGRyLGRldi0+ZGV2X2FkZHIpKSkKKwkJCQliVG9TZWxmQkEgPSB0cnVlOworCQkJCS8vRGJnUHJpbnQoIkJsb2NrQWNrLCBNYXRjaEJTU0lEID0gJWQsIFRvU2VsZiA9ICVkIFxuIiwgYlBhY2tldE1hdGNoQlNTSUQsIGJQYWNrZXRUb1NlbGYpOworCQl9CisKKworCisJaWYoYnBhY2tldF9tYXRjaF9ic3NpZCkKKwl7CisJCXByaXYtPnN0YXRzLm51bXBhY2tldF9tYXRjaGJzc2lkKys7CisJfQorCWlmKGJwYWNrZXRfdG9zZWxmKXsKKwkJcHJpdi0+c3RhdHMubnVtcGFja2V0X3Rvc2VsZisrOworCX0KKwkvLworCS8vIFByb2Nlc3MgUEhZIGluZm9ybWF0aW9uIGZvciBwcmV2aW91cyBwYWNrZXQgKFJTU0kvUFdEQi9FVk0pCisJLy8KKwkvLyBCZWNhdXNlIHBoeSBpbmZvcm1hdGlvbiBpcyBjb250YWluZWQgaW4gdGhlIGxhc3QgcGFja2V0IG9mIEFNUERVIG9ubHksIHNvIGRyaXZlcgorCS8vIHNob3VsZCBwcm9jZXNzIHBoeSBpbmZvcm1hdGlvbiBvZiBwcmV2aW91cyBwYWNrZXQKKwlydGw4MTkyX3Byb2Nlc3NfcGh5aW5mbyhwcml2LCB0bXBfYnVmLCAmcHJldmlvdXNfc3RhdHMsIHBzdGF0cyk7CisJcnRsODE5Ml9xdWVyeV9yeHBoeXN0YXR1cyhwcml2LCBwc3RhdHMsIHBkcnZpbmZvLCAmcHJldmlvdXNfc3RhdHMsIGJwYWNrZXRfbWF0Y2hfYnNzaWQsYnBhY2tldF90b3NlbGYsYlBhY2tldEJlYWNvbixiVG9TZWxmQkEpOworCXJ0bDgxOTJfcmVjb3JkX3J4ZGVzY19mb3JsYXRlcnVzZShwc3RhdHMsICZwcmV2aW91c19zdGF0cyk7CisKK30KKworLyoqCisqIEZ1bmN0aW9uOglVcGRhdGVSZWNlaXZlZFJhdGVIaXN0b2dyYW1TdGF0aXN0aWNzCisqIE92ZXJ2aWV3OglSZWNvcmVkIGRvd24gdGhlIHJlY2VpdmVkIGRhdGEgcmF0ZQorKgorKiBJbnB1dDoKKyogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKyoJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMKKyoKKyogT3V0cHV0OgorKgorKgkJCShwcml2LT5zdGF0cy5SZWNlaXZlZFJhdGVIaXN0b2dyYW1bXSBpcyB1cGRhdGVkKQorKiBSZXR1cm46CisqCQlOb25lCisqLwordm9pZAorVXBkYXRlUmVjZWl2ZWRSYXRlSGlzdG9ncmFtU3RhdGlzdGljczgxOTAoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cworCSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIHJjdlR5cGU9MTsgICAvLzA6IFRvdGFsLCAxOk9LLCAyOkNSQywgMzpJQ1YKKwl1MzIgcmF0ZUluZGV4OworCXUzMiBwcmVhbWJsZV9ndWFyZGludGVydmFsOyAgLy8xOiBzaG9ydCBwcmVhbWJsZS9HSSwgMDogbG9uZyBwcmVhbWJsZS9HSQorCisKKwlpZihzdGF0cy0+YkNSQykKKwlyY3ZUeXBlID0gMjsKKwllbHNlIGlmKHN0YXRzLT5iSUNWKQorCXJjdlR5cGUgPSAzOworCisJaWYoc3RhdHMtPmJTaG9ydFByZWFtYmxlKQorCXByZWFtYmxlX2d1YXJkaW50ZXJ2YWwgPSAxOy8vIHNob3J0CisJZWxzZQorCXByZWFtYmxlX2d1YXJkaW50ZXJ2YWwgPSAwOy8vIGxvbmcKKworCXN3aXRjaChzdGF0cy0+cmF0ZSkKKwl7CisJCS8vCisJCS8vIENDSyByYXRlCisJCS8vCisJCWNhc2UgTUdOXzFNOiAgICByYXRlSW5kZXggPSAwOyAgYnJlYWs7CisJCWNhc2UgTUdOXzJNOiAgICByYXRlSW5kZXggPSAxOyAgYnJlYWs7CisJCWNhc2UgTUdOXzVfNU06ICByYXRlSW5kZXggPSAyOyAgYnJlYWs7CisJCWNhc2UgTUdOXzExTTogICByYXRlSW5kZXggPSAzOyAgYnJlYWs7CisJCS8vCisJCS8vIExlZ2FjeSBPRkRNIHJhdGUKKwkJLy8KKwkJY2FzZSBNR05fNk06ICAgIHJhdGVJbmRleCA9IDQ7ICBicmVhazsKKwkJY2FzZSBNR05fOU06ICAgIHJhdGVJbmRleCA9IDU7ICBicmVhazsKKwkJY2FzZSBNR05fMTJNOiAgIHJhdGVJbmRleCA9IDY7ICBicmVhazsKKwkJY2FzZSBNR05fMThNOiAgIHJhdGVJbmRleCA9IDc7ICBicmVhazsKKwkJY2FzZSBNR05fMjRNOiAgIHJhdGVJbmRleCA9IDg7ICBicmVhazsKKwkJY2FzZSBNR05fMzZNOiAgIHJhdGVJbmRleCA9IDk7ICBicmVhazsKKwkJY2FzZSBNR05fNDhNOiAgIHJhdGVJbmRleCA9IDEwOyBicmVhazsKKwkJY2FzZSBNR05fNTRNOiAgIHJhdGVJbmRleCA9IDExOyBicmVhazsKKwkJLy8KKwkJLy8gMTFuIEhpZ2ggdGhyb3VnaHB1dCByYXRlCisJCS8vCisJCWNhc2UgTUdOX01DUzA6ICByYXRlSW5kZXggPSAxMjsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzE6ICByYXRlSW5kZXggPSAxMzsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzI6ICByYXRlSW5kZXggPSAxNDsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzM6ICByYXRlSW5kZXggPSAxNTsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzQ6ICByYXRlSW5kZXggPSAxNjsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzU6ICByYXRlSW5kZXggPSAxNzsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzY6ICByYXRlSW5kZXggPSAxODsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzc6ICByYXRlSW5kZXggPSAxOTsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzg6ICByYXRlSW5kZXggPSAyMDsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzk6ICByYXRlSW5kZXggPSAyMTsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzEwOiByYXRlSW5kZXggPSAyMjsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzExOiByYXRlSW5kZXggPSAyMzsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzEyOiByYXRlSW5kZXggPSAyNDsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzEzOiByYXRlSW5kZXggPSAyNTsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzE0OiByYXRlSW5kZXggPSAyNjsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzE1OiByYXRlSW5kZXggPSAyNzsgYnJlYWs7CisJCWRlZmF1bHQ6ICAgICAgICByYXRlSW5kZXggPSAyODsgYnJlYWs7CisJfQorICAgIHByaXYtPnN0YXRzLnJlY2VpdmVkX3ByZWFtYmxlX0dJW3ByZWFtYmxlX2d1YXJkaW50ZXJ2YWxdW3JhdGVJbmRleF0rKzsKKyAgICBwcml2LT5zdGF0cy5yZWNlaXZlZF9yYXRlX2hpc3RvZ3JhbVswXVtyYXRlSW5kZXhdKys7IC8vdG90YWwKKyAgICBwcml2LT5zdGF0cy5yZWNlaXZlZF9yYXRlX2hpc3RvZ3JhbVtyY3ZUeXBlXVtyYXRlSW5kZXhdKys7Cit9CisKKwordm9pZCBxdWVyeV9yeGRlc2Nfc3RhdHVzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzLCBib29sIGJJc1J4QWdnclN1YmZyYW1lKQoreworCXJ0bDgxOTJfcnhfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvICopc2tiLT5jYjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2PWluZm8tPmRldjsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJLy9yeF9kZXNjXzgxOXhfdXNiICpkZXNjID0gKHJ4X2Rlc2NfODE5eF91c2IgKilza2ItPmRhdGE7CisJcnhfZHJ2aW5mb184MTl4X3VzYiAgKmRyaXZlcl9pbmZvID0gTlVMTDsKKworCS8vCisJLy9HZXQgUnggRGVzY3JpcHRvciBJbmZvcm1hdGlvbgorCS8vCisjaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKKwlpZiAoYklzUnhBZ2dyU3ViZnJhbWUpCisJeworCQlyeF9kZXNjXzgxOXhfdXNiX2FnZ3Jfc3ViZnJhbWUgKmRlc2MgPSAocnhfZGVzY184MTl4X3VzYl9hZ2dyX3N1YmZyYW1lICopc2tiLT5kYXRhOworCQlzdGF0cy0+TGVuZ3RoID0gZGVzYy0+TGVuZ3RoIDsKKwkJc3RhdHMtPlJ4RHJ2SW5mb1NpemUgPSBkZXNjLT5SeERydkluZm9TaXplOworCQlzdGF0cy0+UnhCdWZTaGlmdCA9IDA7IC8vUnhCdWZTaGlmdCA9IDIgaW4gUnhEZXNjLCBidXQgdXNiIGRpZG4ndCBzaGlmdCBieXRlcyBpbiBmYWN0LgorCQlzdGF0cy0+YklDViA9IGRlc2MtPklDVjsKKwkJc3RhdHMtPmJDUkMgPSBkZXNjLT5DUkMzMjsKKwkJc3RhdHMtPmJId0Vycm9yID0gc3RhdHMtPmJDUkN8c3RhdHMtPmJJQ1Y7CisJCXN0YXRzLT5EZWNyeXB0ZWQgPSAhZGVzYy0+U1dEZWM7Ly9SVEw4MTkwIHNldCB0aGlzIGJpdCB0byBpbmRpY2F0ZSB0aGF0IEh3IGRvZXMgbm90IGRlY3J5cHQgcGFja2V0CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCXJ4X2Rlc2NfODE5eF91c2IgKmRlc2MgPSAocnhfZGVzY184MTl4X3VzYiAqKXNrYi0+ZGF0YTsKKworCQlzdGF0cy0+TGVuZ3RoID0gZGVzYy0+TGVuZ3RoOworCQlzdGF0cy0+UnhEcnZJbmZvU2l6ZSA9IGRlc2MtPlJ4RHJ2SW5mb1NpemU7CisJCXN0YXRzLT5SeEJ1ZlNoaWZ0ID0gMDsvL2Rlc2MtPlNoaWZ0JjB4MDM7CisJCXN0YXRzLT5iSUNWID0gZGVzYy0+SUNWOworCQlzdGF0cy0+YkNSQyA9IGRlc2MtPkNSQzMyOworCQlzdGF0cy0+Ykh3RXJyb3IgPSBzdGF0cy0+YkNSQ3xzdGF0cy0+YklDVjsKKwkJLy9SVEw4MTkwIHNldCB0aGlzIGJpdCB0byBpbmRpY2F0ZSB0aGF0IEh3IGRvZXMgbm90IGRlY3J5cHQgcGFja2V0CisJCXN0YXRzLT5EZWNyeXB0ZWQgPSAhZGVzYy0+U1dEZWM7CisJfQorCisJaWYoKHByaXYtPmllZWU4MDIxMS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPT0gdHJ1ZSkgJiYgKHByaXYtPmllZWU4MDIxMS0+cGFpcndpc2Vfa2V5X3R5cGUgPT0gS0VZX1RZUEVfQ0NNUCkpCisJeworCQlzdGF0cy0+Ykh3RXJyb3IgPSBmYWxzZTsKKwl9CisJZWxzZQorCXsKKwkJc3RhdHMtPmJId0Vycm9yID0gc3RhdHMtPmJDUkN8c3RhdHMtPmJJQ1Y7CisJfQorCisJaWYoc3RhdHMtPkxlbmd0aCA8IDI0IHx8IHN0YXRzLT5MZW5ndGggPiBNQVhfODE5MlVfUlhfU0laRSkKKwkJc3RhdHMtPmJId0Vycm9yIHw9IDE7CisJLy8KKwkvL0dldCBEcml2ZXIgSW5mbworCS8vCisJLy8gVE9ETzogTmVlZCB0byB2ZXJpZnkgaXQgb24gRkdQQSBwbGF0Zm9ybQorCS8vRHJpdmVyIGluZm8gYXJlIHdyaXR0ZW4gdG8gdGhlIFJ4QnVmZmVyIGZvbGxvd2luZyByeCBkZXNjCisJaWYgKHN0YXRzLT5SeERydkluZm9TaXplICE9IDApIHsKKwkJZHJpdmVyX2luZm8gPSAocnhfZHJ2aW5mb184MTl4X3VzYiAqKShza2ItPmRhdGEgKyBzaXplb2YocnhfZGVzY184MTl4X3VzYikgKyBcCisJCQkJc3RhdHMtPlJ4QnVmU2hpZnQpOworCQkvKiB1bml0OiAwLjVNICovCisJCS8qIFRPRE8gKi8KKwkJaWYoIXN0YXRzLT5iSHdFcnJvcil7CisJCQl1OAlyZXRfcmF0ZTsKKwkJCXJldF9yYXRlID0gSHdSYXRlVG9NUmF0ZTkwKGRyaXZlcl9pbmZvLT5SeEhULCBkcml2ZXJfaW5mby0+UnhSYXRlKTsKKwkJCWlmKHJldF9yYXRlID09IDB4ZmYpCisJCQl7CisJCQkJLy8gQWJub3JtYWwgQ2FzZTogUmVjZWl2ZSBDUkMgT0sgcGFja2V0IHdpdGggUnggZGVzY3JpcHRvciBpbmRpY2F0aW5nIG5vbiBzdXBwb3J0ZWQgcmF0ZS4KKwkJCQkvLyBTcGVjaWFsIEVycm9yIEhhbmRsaW5nIGhlcmUsIDIwMDguMDUuMTYsIGJ5IEVtaWx5CisKKwkJCQlzdGF0cy0+Ykh3RXJyb3IgPSAxOworCQkJCXN0YXRzLT5yYXRlID0gTUdOXzFNOwkvL1NldCAxTSByYXRlIGJ5IGRlZmF1bHQKKwkJCX1lbHNlCisJCQl7CisJCQkJc3RhdHMtPnJhdGUgPSByZXRfcmF0ZTsKKwkJCX0KKwkJfQorCQllbHNlCisJCQlzdGF0cy0+cmF0ZSA9IDB4MDI7CisKKwkJc3RhdHMtPmJTaG9ydFByZWFtYmxlID0gZHJpdmVyX2luZm8tPlNQTENQOworCisKKwkJVXBkYXRlUmVjZWl2ZWRSYXRlSGlzdG9ncmFtU3RhdGlzdGljczgxOTAoZGV2LCBzdGF0cyk7CisKKwkJc3RhdHMtPmJJc0FNUERVID0gKGRyaXZlcl9pbmZvLT5QYXJ0QWdncj09MSk7CisJCXN0YXRzLT5iRmlyc3RNUERVID0gKGRyaXZlcl9pbmZvLT5QYXJ0QWdncj09MSkgJiYgKGRyaXZlcl9pbmZvLT5GaXJzdEFHR1I9PTEpOworCQlzdGF0cy0+VGltZVN0YW1wTG93ID0gZHJpdmVyX2luZm8tPlRTRkw7CisJCS8vIHhpb25nIG1hc2sgaXQsIDA3MDUxNAorCQkvL3BSZmQtPlN0YXR1cy5UaW1lU3RhbXBIaWdoID0gUGxhdGZvcm1FRklPUmVhZDRCeXRlKEFkYXB0ZXIsIFRTRlIrNCk7CisJCS8vIHN0YXRzLT5UaW1lU3RhbXBIaWdoID0gcmVhZF9uaWNfZHdvcmQoZGV2LCAgVFNGUis0KTsKKworCQlVcGRhdGVSeFBrdFRpbWVTdGFtcDgxOTAoZGV2LCBzdGF0cyk7CisKKwkJLy8KKwkJLy8gUnggQS1NUERVCisJCS8vCisJCWlmKGRyaXZlcl9pbmZvLT5GaXJzdEFHR1I9PTEgfHwgZHJpdmVyX2luZm8tPlBhcnRBZ2dyID09IDEpCisJCQlSVF9UUkFDRShDT01QX1JYREVTQywgImRyaXZlcl9pbmZvLT5GaXJzdEFHR1IgPSAlZCwgZHJpdmVyX2luZm8tPlBhcnRBZ2dyID0gJWRcbiIsCisJCQkJCWRyaXZlcl9pbmZvLT5GaXJzdEFHR1IsIGRyaXZlcl9pbmZvLT5QYXJ0QWdncik7CisKKwl9CisKKwlza2JfcHVsbChza2Isc2l6ZW9mKHJ4X2Rlc2NfODE5eF91c2IpKTsKKwkvLworCS8vIEdldCBUb3RhbCBvZmZzZXQgb2YgTVBEVSBGcmFtZSBCb2R5CisJLy8KKwlpZigoc3RhdHMtPlJ4QnVmU2hpZnQgKyBzdGF0cy0+UnhEcnZJbmZvU2l6ZSkgPiAwKSB7CisJCXN0YXRzLT5iU2hpZnQgPSAxOworCQlza2JfcHVsbChza2Isc3RhdHMtPlJ4QnVmU2hpZnQgKyBzdGF0cy0+UnhEcnZJbmZvU2l6ZSk7CisJfQorCisjaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKKwkvKiBmb3IgdGhlIHJ4IGFnZ3JlZ2F0ZWQgc3ViIGZyYW1lLCB0aGUgcmVkdW5kYW50IHNwYWNlIHRydWVsbHkgY29udGFpbmVkIGluIHRoZSBwYWNrZXQgKi8KKwlpZihiSXNSeEFnZ3JTdWJmcmFtZSkgeworCQlza2JfcHVsbChza2IsIDgpOworCX0KKyNlbmRpZgorCS8qIGZvciBkZWJ1ZyAyMDA4LjUuMjkgKi8KKworCS8vYWRkZWQgYnkgdml2aSwgZm9yIE1QLCAyMDA4MDEwOAorCXN0YXRzLT5SeElzNDBNSHpQYWNrZXQgPSBkcml2ZXJfaW5mby0+Qlc7CisJaWYoc3RhdHMtPlJ4RHJ2SW5mb1NpemUgIT0gMCkKKwkJVHJhbnNsYXRlUnhTaWduYWxTdHVmZjgxOXhVc2Ioc2tiLCBzdGF0cywgZHJpdmVyX2luZm8pOworCit9CisKK3UzMiBHZXRSeFBhY2tldFNoaWZ0Qnl0ZXM4MTl4VXNiKHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgICpTdGF0dXMsIGJvb2wgYklzUnhBZ2dyU3ViZnJhbWUpCit7CisjaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKKwlpZiAoYklzUnhBZ2dyU3ViZnJhbWUpCisJCXJldHVybiAoc2l6ZW9mKHJ4X2Rlc2NfODE5eF91c2IpICsgU3RhdHVzLT5SeERydkluZm9TaXplCisJCQkrIFN0YXR1cy0+UnhCdWZTaGlmdCArIDgpOworCWVsc2UKKyNlbmRpZgorCQlyZXR1cm4gKHNpemVvZihyeF9kZXNjXzgxOXhfdXNiKSArIFN0YXR1cy0+UnhEcnZJbmZvU2l6ZQorCQkJCSsgU3RhdHVzLT5SeEJ1ZlNoaWZ0KTsKK30KKwordm9pZCBydGw4MTkyX3J4X25vbWFsKHN0cnVjdCBza19idWZmKiBza2IpCit7CisJcnRsODE5Ml9yeF9pbmZvICppbmZvID0gKHN0cnVjdCBydGw4MTkyX3J4X2luZm8gKilza2ItPmNiOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY9aW5mby0+ZGV2OworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHN0YXRzID0geworCQkuc2lnbmFsID0gMCwKKwkJLm5vaXNlID0gLTk4LAorCQkucmF0ZSA9IDAsCisJCS8vICAgICAgLm1hY190aW1lID0gamlmZmllcywKKwkJLmZyZXEgPSBJRUVFODAyMTFfMjRHSFpfQkFORCwKKwl9OworCXUzMiByeF9wa3RfbGVuID0gMDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8xYWRkciAqaWVlZTgwMjExX2hkciA9IE5VTEw7CisJYm9vbCB1bmljYXN0X3BhY2tldCA9IGZhbHNlOworI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCisJc3RydWN0IHNrX2J1ZmYgKmFnZ19za2IgPSBOVUxMOworCXUzMiAgVG90YWxMZW5ndGggPSAwOworCXUzMiAgVGVtcERXb3JkID0gMDsKKwl1MzIgIFBhY2tldExlbmd0aCA9IDA7CisJdTMyICBQYWNrZXRPY2N1cGllZExlbmR0aCA9IDA7CisJdTggICBUZW1wQnl0ZSA9IDA7CisJdTMyICBQYWNrZXRTaGlmdEJ5dGVzID0gMDsKKwlyeF9kZXNjXzgxOXhfdXNiX2FnZ3Jfc3ViZnJhbWUgKlJ4RGVzY3IgPSBOVUxMOworCXU4ICBQYWRkaW5nQnl0ZXMgPSAwOworCS8vYWRkIGp1c3QgZm9yIHRlc3RpbmcKKwl1OCAgIHRlc3Rpbmc7CisKKyNlbmRpZgorCisJLyogMjAgaXMgZm9yIHBzLXBvbGwgKi8KKwlpZigoc2tiLT5sZW4gPj0oMjAgKyBzaXplb2YocnhfZGVzY184MTl4X3VzYikpKSAmJiAoc2tiLT5sZW4gPCBSWF9VUkJfU0laRSkpIHsKKyNpZmRlZiBVU0JfUlhfQUdHUkVHQVRJT05fU1VQUE9SVAorCQlUZW1wQnl0ZSA9ICooc2tiLT5kYXRhICsgc2l6ZW9mKHJ4X2Rlc2NfODE5eF91c2IpKTsKKyNlbmRpZgorCQkvKiBmaXJzdCBwYWNrZXQgc2hvdWxkIG5vdCBjb250YWluIFJ4IGFnZ3JlZ2F0aW9uIGhlYWRlciAqLworCQlxdWVyeV9yeGRlc2Nfc3RhdHVzKHNrYiwgJnN0YXRzLCBmYWxzZSk7CisJCS8qIFRPRE8gKi8KKwkJLyogaGFyZHdhcmUgcmVsYXRlZCBpbmZvICovCisjaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKKwkJaWYgKFRlbXBCeXRlICYgQklUMCkgeworCQkJYWdnX3NrYiA9IHNrYjsKKwkJCS8vVG90YWxMZW5ndGggPSBhZ2dfc2tiLT5sZW4gLSA0OyAvKnNDcmNMbmcqLworCQkJVG90YWxMZW5ndGggPSBzdGF0cy5MZW5ndGggLSA0OyAvKnNDcmNMbmcqLworCQkJLy9SVF9UUkFDRShDT01QX1JFQ1YsICIlczpmaXJzdCBhZ2dyZWdhdGVkIHBhY2tldCFMZW5ndGg9JWRcbiIsX19GVU5DVElPTl9fLFRvdGFsTGVuZ3RoKTsKKwkJCS8qIHRob3VnaCB0aGUgaGVhZCBwb2ludGVyIGhhcyBwYXNzZWQgdGhpcyBwb3NpdGlvbiAgKi8KKwkJCVRlbXBEV29yZCA9ICoodTMyICopKGFnZ19za2ItPmRhdGEgLSA0KTsKKwkJCVBhY2tldExlbmd0aCA9ICh1MTYpKFRlbXBEV29yZCAmIDB4M0ZGRik7IC8qc0NyY0xuZyovCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKFBhY2tldExlbmd0aCk7CisJCQltZW1jcHkoc2tiX3B1dChza2IsUGFja2V0TGVuZ3RoKSxhZ2dfc2tiLT5kYXRhLFBhY2tldExlbmd0aCk7CisJCQlQYWNrZXRTaGlmdEJ5dGVzID0gR2V0UnhQYWNrZXRTaGlmdEJ5dGVzODE5eFVzYigmc3RhdHMsIGZhbHNlKTsKKwkJfQorI2VuZGlmCisJCS8qIFByb2Nlc3MgdGhlIE1QRFUgcmVjZXZpZWQgKi8KKwkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDQvKnNDcmNMbmcqLyk7CisKKwkJcnhfcGt0X2xlbiA9IHNrYi0+bGVuOworCQlpZWVlODAyMTFfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzFhZGRyICopc2tiLT5kYXRhOworCQl1bmljYXN0X3BhY2tldCA9IGZhbHNlOworCQlpZihpc19icm9hZGNhc3RfZXRoZXJfYWRkcihpZWVlODAyMTFfaGRyLT5hZGRyMSkpIHsKKwkJCS8vVE9ETworCQl9ZWxzZSBpZihpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihpZWVlODAyMTFfaGRyLT5hZGRyMSkpeworCQkJLy9UT0RPCisJCX1lbHNlIHsKKwkJCS8qIHVuaWNhc3QgcGFja2V0ICovCisJCQl1bmljYXN0X3BhY2tldCA9IHRydWU7CisJCX0KKworCQlpZighaWVlZTgwMjExX3J4KHByaXYtPmllZWU4MDIxMSxza2IsICZzdGF0cykpIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCX0gZWxzZSB7CisJCQlwcml2LT5zdGF0cy5yeG9rdG90YWwrKzsKKwkJCWlmKHVuaWNhc3RfcGFja2V0KSB7CisJCQkJcHJpdi0+c3RhdHMucnhieXRlc3VuaWNhc3QgKz0gcnhfcGt0X2xlbjsKKwkJCX0KKwkJfQorI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCisJCXRlc3RpbmcgPSAxOworCQkvLyAoUGlwZUluZGV4ID09IDApICYmIChUZW1wQnl0ZSAmIEJJVDApID0+IFRvdGFsTGVuZ3RoID4gMC4KKwkJaWYgKFRvdGFsTGVuZ3RoID4gMCkgeworCQkJUGFja2V0T2NjdXBpZWRMZW5kdGggPSBQYWNrZXRMZW5ndGggKyAoUGFja2V0U2hpZnRCeXRlcyArIDgpOworCQkJaWYgKChQYWNrZXRPY2N1cGllZExlbmR0aCAmIDB4RkYpICE9IDApCisJCQkJUGFja2V0T2NjdXBpZWRMZW5kdGggPSAoUGFja2V0T2NjdXBpZWRMZW5kdGggJiAweEZGRkZGRjAwKSArIDI1NjsKKwkJCVBhY2tldE9jY3VwaWVkTGVuZHRoIC09IDg7CisJCQlUZW1wRFdvcmQgPSBQYWNrZXRPY2N1cGllZExlbmR0aCAtIFBhY2tldFNoaWZ0Qnl0ZXM7IC8qLSBQYWNrZXRMZW5ndGggKi8KKwkJCWlmIChhZ2dfc2tiLT5sZW4gPiBUZW1wRFdvcmQpCisJCQkJc2tiX3B1bGwoYWdnX3NrYiwgVGVtcERXb3JkKTsKKwkJCWVsc2UKKwkJCQlhZ2dfc2tiLT5sZW4gPSAwOworCisJCQl3aGlsZSAoYWdnX3NrYi0+bGVuPj1HZXRSeFBhY2tldFNoaWZ0Qnl0ZXM4MTl4VXNiKCZzdGF0cywgdHJ1ZSkpIHsKKwkJCQl1OCB0bXBDUkMgPSAwLCB0bXBJQ1YgPSAwOworCQkJCS8vUlRfVFJBQ0UoQ09NUF9SRUNWLCIlczphZ2dyZWQgcGt0LHRvdGFsX2xlbiA9ICVkXG4iLF9fRlVOQ1RJT05fXyxhZ2dfc2tiLT5sZW4pOworCQkJCVJ4RGVzY3IgPSAocnhfZGVzY184MTl4X3VzYl9hZ2dyX3N1YmZyYW1lICopKGFnZ19za2ItPmRhdGEpOworCQkJCXRtcENSQyA9IFJ4RGVzY3ItPkNSQzMyOworCQkJCXRtcElDViA9IFJ4RGVzY3ItPklDVjsKKwkJCQltZW1jcHkoYWdnX3NrYi0+ZGF0YSwgJmFnZ19za2ItPmRhdGFbNDRdLCAyKTsKKwkJCQlSeERlc2NyLT5DUkMzMiA9IHRtcENSQzsKKwkJCQlSeERlc2NyLT5JQ1YgPSB0bXBJQ1Y7CisKKwkJCQltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cykpOworCQkJCXN0YXRzLnNpZ25hbCA9IDA7CisJCQkJc3RhdHMubm9pc2UgPSAtOTg7CisJCQkJc3RhdHMucmF0ZSA9IDA7CisJCQkJc3RhdHMuZnJlcSA9IElFRUU4MDIxMV8yNEdIWl9CQU5EOworCQkJCXF1ZXJ5X3J4ZGVzY19zdGF0dXMoYWdnX3NrYiwgJnN0YXRzLCB0cnVlKTsKKwkJCQlQYWNrZXRMZW5ndGggPSBzdGF0cy5MZW5ndGg7CisKKwkJCQlpZihQYWNrZXRMZW5ndGggPiBhZ2dfc2tiLT5sZW4pIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIFByb2Nlc3MgdGhlIE1QRFUgcmVjZXZpZWQgKi8KKwkJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKFBhY2tldExlbmd0aCk7CisJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLFBhY2tldExlbmd0aCksYWdnX3NrYi0+ZGF0YSwgUGFja2V0TGVuZ3RoKTsKKwkJCQlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gNC8qc0NyY0xuZyovKTsKKworCQkJCXJ4X3BrdF9sZW4gPSBza2ItPmxlbjsKKwkJCQlpZWVlODAyMTFfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzFhZGRyICopc2tiLT5kYXRhOworCQkJCXVuaWNhc3RfcGFja2V0ID0gZmFsc2U7CisJCQkJaWYoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaWVlZTgwMjExX2hkci0+YWRkcjEpKSB7CisJCQkJCS8vVE9ETworCQkJCX1lbHNlIGlmKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGllZWU4MDIxMV9oZHItPmFkZHIxKSl7CisJCQkJCS8vVE9ETworCQkJCX1lbHNlIHsKKwkJCQkJLyogdW5pY2FzdCBwYWNrZXQgKi8KKwkJCQkJdW5pY2FzdF9wYWNrZXQgPSB0cnVlOworCQkJCX0KKwkJCQlpZighaWVlZTgwMjExX3J4KHByaXYtPmllZWU4MDIxMSxza2IsICZzdGF0cykpIHsKKwkJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcml2LT5zdGF0cy5yeG9rdG90YWwrKzsKKwkJCQkJaWYodW5pY2FzdF9wYWNrZXQpIHsKKwkJCQkJCXByaXYtPnN0YXRzLnJ4Ynl0ZXN1bmljYXN0ICs9IHJ4X3BrdF9sZW47CisJCQkJCX0KKwkJCQl9CisJCQkJLyogc2hvdWxkIHRyaW0gdGhlIHBhY2tldCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgdG8gdGFyZ2V0IHNrYiAqLworCQkJCXNrYl9wdWxsKGFnZ19za2IsIFBhY2tldExlbmd0aCk7CisJCQkJUGFja2V0U2hpZnRCeXRlcyA9IEdldFJ4UGFja2V0U2hpZnRCeXRlczgxOXhVc2IoJnN0YXRzLCB0cnVlKTsKKwkJCQlQYWNrZXRPY2N1cGllZExlbmR0aCA9IFBhY2tldExlbmd0aCArIFBhY2tldFNoaWZ0Qnl0ZXM7CisJCQkJaWYgKChQYWNrZXRPY2N1cGllZExlbmR0aCAmIDB4RkYpICE9IDApIHsKKwkJCQkJUGFkZGluZ0J5dGVzID0gMjU2IC0gKFBhY2tldE9jY3VwaWVkTGVuZHRoICYgMHhGRik7CisJCQkJCWlmIChhZ2dfc2tiLT5sZW4gPiBQYWRkaW5nQnl0ZXMpCisJCQkJCQlza2JfcHVsbChhZ2dfc2tiLCBQYWRkaW5nQnl0ZXMpOworCQkJCQllbHNlCisJCQkJCQlhZ2dfc2tiLT5sZW4gPSAwOworCQkJCX0KKwkJCX0KKwkJCWRldl9rZnJlZV9za2IoYWdnX3NrYik7CisJCX0KKyNlbmRpZgorCX0gZWxzZSB7CisJCXByaXYtPnN0YXRzLnJ4dXJiZXJyKys7CisJCXByaW50aygiYWN0dWFsX2xlbmd0aDolZFxuIiwgc2tiLT5sZW4pOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0KKworfQorCit2b2lkCitydGw4MTl4dXNiX3Byb2Nlc3NfcmVjZWl2ZWRfcGFja2V0KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcHN0YXRzCisJKQoreworLy8JYm9vbCBiZnJlZXJmZD1mYWxzZSwgYnF1ZXVlZD1mYWxzZTsKKwl1OCogCWZyYW1lOworCXUxNiAgICAgZnJhbWVfbGVuPTA7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworLy8JdTgJCQlpbmRleCA9IDA7CisvLwl1OAkJCVRJRCA9IDA7CisJLy91MTYJCQlzZXFudW0gPSAwOworCS8vUFJYX1RTX1JFQ09SRAlwdHMgPSBOVUxMOworCisJLy8gR2V0IHNoaWZ0ZWQgYnl0ZXMgb2YgU3RhcnRpbmcgYWRkcmVzcyBvZiA4MDIuMTEgaGVhZGVyLiAyMDA2LjA5LjI4LCBieSBFbWlseQorCS8vcG9ydGluZyBieSBhbXkgMDgwNTA4CisJcHN0YXRzLT52aXJ0dWFsX2FkZHJlc3MgKz0gZ2V0X3J4cGFja2V0X3NoaWZ0Ynl0ZXNfODE5eHVzYihwc3RhdHMpOworCWZyYW1lID0gcHN0YXRzLT52aXJ0dWFsX2FkZHJlc3M7CisJZnJhbWVfbGVuID0gcHN0YXRzLT5wYWNrZXRsZW5ndGg7CisjaWZkZWYgVE9ETwkvLyBieSBhbXkgYWJvdXQgSENUCisJaWYoIUFkYXB0ZXItPmJJbkhjdFRlc3QpCisJCUNvdW50UnhFcnJTdGF0aXN0aWNzKEFkYXB0ZXIsIHBSZmQpOworI2VuZGlmCisJeworCSNpZmRlZiBFTkFCTEVfUFMgIC8vYnkgYW15IGZvciBhZGRpbmcgcHMgZnVuY3Rpb24gaW4gZnV0dXJlCisJCVJUX1JGX1BPV0VSX1NUQVRFIHJ0U3RhdGU7CisJCS8vIFdoZW4gUkYgaXMgb2ZmLCB3ZSBzaG91bGQgbm90IGNvdW50IHRoZSBwYWNrZXQgZm9yIGh3L3N3IHN5bmNocm9uaXplCisJCS8vIHJlYXNvbiwgaWUuIHRoZXJlIG1heSBiZSBhIGR1cmF0aW9uIHdoaWxlIHN3IHN3aXRjaCBpcyBjaGFuZ2VkIGFuZCBodworCQkvLyBzd2l0Y2ggaXMgYmVpbmcgY2hhbmdlZC4gMjAwNi4xMi4wNCwgYnkgc2hpZW4gY2hhbmcuCisJCUFkYXB0ZXItPkhhbEZ1bmMuR2V0SHdSZWdIYW5kbGVyKEFkYXB0ZXIsIEhXX1ZBUl9SRl9TVEFURSwgKHU4KiApKCZydFN0YXRlKSk7CisJCWlmIChydFN0YXRlID09IGVSZk9mZikKKwkJeworCQkJcmV0dXJuOworCQl9CisJI2VuZGlmCisJcHJpdi0+c3RhdHMucnhmcmFtZ21lbnQrKzsKKworCX0KKyNpZmRlZiBUT0RPCisJUm1Nb25pdG9yU2lnbmFsU3RyZW5ndGgoQWRhcHRlciwgcFJmZCk7CisjZW5kaWYKKwkvKiAyMDA3LzAxLzE2IE1IIEFkZCBSWCBjb21tYW5kIHBhY2tldCBoYW5kbGUgaGVyZS4gKi8KKwkvKiAyMDA3LzAzLzAxIE1IIFdlIGhhdmUgdG8gcmVsZWFzZSBSRkQgYW5kIHJldHVybiBpZiByeCBwa3QgaXMgY21kIHBrdC4gKi8KKwlpZiAocnRsODE5eHVzYl9yeF9jb21tYW5kX3BhY2tldChkZXYsIHBzdGF0cykpCisJeworCQlyZXR1cm47CisJfQorCisjaWZkZWYgU1dfQ1JDX0NIRUNLCisJU3dDcmNDaGVjaygpOworI2VuZGlmCisKKworfQorCit2b2lkIHF1ZXJ5X3J4X2NtZHBrdF9kZXNjX3N0YXR1cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKK3sKKy8vCXJ0bDgxOTJfcnhfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvICopc2tiLT5jYjsKKy8vCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY9aW5mby0+ZGV2OworLy8Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXJ4X2Rlc2NfODE5eF91c2IgKmRlc2MgPSAocnhfZGVzY184MTl4X3VzYiAqKXNrYi0+ZGF0YTsKKy8vCXJ4X2RydmluZm9fODE5eF91c2IgICpkcml2ZXJfaW5mbzsKKworCS8vCisJLy9HZXQgUnggRGVzY3JpcHRvciBJbmZvcm1hdGlvbgorCS8vCisJc3RhdHMtPnZpcnR1YWxfYWRkcmVzcyA9ICh1OCopc2tiLT5kYXRhOworCXN0YXRzLT5MZW5ndGggPSBkZXNjLT5MZW5ndGg7CisJc3RhdHMtPlJ4RHJ2SW5mb1NpemUgPSAwOworCXN0YXRzLT5SeEJ1ZlNoaWZ0ID0gMDsKKwlzdGF0cy0+cGFja2V0bGVuZ3RoID0gc3RhdHMtPkxlbmd0aC1zY3JjbG5nOworCXN0YXRzLT5mcmFnbGVuZ3RoID0gc3RhdHMtPnBhY2tldGxlbmd0aDsKKwlzdGF0cy0+ZnJhZ29mZnNldCA9IDA7CisJc3RhdHMtPm50b3RhbGZyYWcgPSAxOworfQorCisKK3ZvaWQgcnRsODE5Ml9yeF9jbWQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvICppbmZvID0gKHN0cnVjdCBydGw4MTkyX3J4X2luZm8gKilza2ItPmNiOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbmZvLT5kZXY7CisJLy9pbnQgcmV0OworLy8Jc3RydWN0IHVyYiAqcnhfdXJiID0gaW5mby0+dXJiOworCS8qIFRPRE8gKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHN0YXRzID0geworCQkuc2lnbmFsID0gMCwKKwkJLm5vaXNlID0gLTk4LAorCQkucmF0ZSA9IDAsCisJCS8vICAgICAgLm1hY190aW1lID0gamlmZmllcywKKwkJLmZyZXEgPSBJRUVFODAyMTFfMjRHSFpfQkFORCwKKwl9OworCisJaWYoKHNrYi0+bGVuID49KDIwICsgc2l6ZW9mKHJ4X2Rlc2NfODE5eF91c2IpKSkgJiYgKHNrYi0+bGVuIDwgUlhfVVJCX1NJWkUpKQorCXsKKworCQlxdWVyeV9yeF9jbWRwa3RfZGVzY19zdGF0dXMoc2tiLCZzdGF0cyk7CisJCS8vIHRoaXMgaXMgdG8gYmUgZG9uZSBieSBhbXkgMDgwNTA4ICAgICBwcmZkLT5xdWV1ZV9pZCA9IDE7CisKKworCQkvLworCQkvLyAgUHJvY2VzcyB0aGUgY29tbWFuZCBwYWNrZXQgcmVjZWl2ZWQuCisJCS8vCisKKwkJcnRsODE5eHVzYl9wcm9jZXNzX3JlY2VpdmVkX3BhY2tldChkZXYsJnN0YXRzKTsKKworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0KKwllbHNlCisJCTsKKworCit9CisKK3ZvaWQgcnRsODE5Ml9pcnFfcnhfdGFza2xldChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBydGw4MTkyX3J4X2luZm8gKmluZm87CisKKwl3aGlsZSAoTlVMTCAhPSAoc2tiID0gc2tiX2RlcXVldWUoJnByaXYtPnNrYl9xdWV1ZSkpKSB7CisJCWluZm8gPSAoc3RydWN0IHJ0bDgxOTJfcnhfaW5mbyAqKXNrYi0+Y2I7CisJCXN3aXRjaCAoaW5mby0+b3V0X3BpcGUpIHsKKwkJLyogTm9tYWwgcGFja2V0IHBpcGUgKi8KKwkJCWNhc2UgMzoKKwkJCQkvL1JUX1RSQUNFKENPTVBfUkVDViwgIm5vcm1hbCBpbi1waXBlIGluZGV4KCVkKVxuIixpbmZvLT5vdXRfcGlwZSk7CisJCQkJcHJpdi0+SXJwUGVuZGluZ0NvdW50LS07CisJCQkJcnRsODE5Ml9yeF9ub21hbChza2IpOworCQkJCWJyZWFrOworCisJCQkJLyogQ29tbWFuZCBwYWNrZXQgcGlwZSAqLworCQkJY2FzZSA5OgorCQkJCVJUX1RSQUNFKENPTVBfUkVDViwgImNvbW1hbmQgaW4tcGlwZSBpbmRleCglZClcbiIsXAorCQkJCQkJaW5mby0+b3V0X3BpcGUpOworCisJCQkJcnRsODE5Ml9yeF9jbWQoc2tiKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDogLyogc2hvdWxkIG5ldmVyIGdldCBoZXJlISAqLworCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiVW5rbm93biBpbi1waXBlIGluZGV4KCVkKVxuIixcCisJCQkJCQlpbmZvLT5vdXRfcGlwZSk7CisJCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJCWJyZWFrOworCisJCX0KKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgcnRsODE5Ml9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiAgICAgICAgICAgICAgID0gcnRsODE5Ml9vcGVuLAorCS5uZG9fc3RvcCAgICAgICAgICAgICAgID0gcnRsODE5Ml9jbG9zZSwKKwkubmRvX2dldF9zdGF0cyAgICAgICAgICA9IHJ0bDgxOTJfc3RhdHMsCisJLm5kb190eF90aW1lb3V0ICAgICAgICAgPSB0eF90aW1lb3V0LAorCS5uZG9fZG9faW9jdGwgICAgICAgICAgID0gcnRsODE5Ml9pb2N0bCwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IHI4MTkyX3NldF9tdWx0aWNhc3QsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgICAgPSByODE5Ml9zZXRfbWFjX2FkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIgICAgICA9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fY2hhbmdlX210dSAgICAgICAgID0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zdGFydF94bWl0ICAgICAgICAgPSBpZWVlODAyMTFfeG1pdCwKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0JfU1RVRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBydGw4MTkyX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCSBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisvLwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXY9IE5VTEw7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCVJUX1RSQUNFKENPTVBfSU5JVCwgIk9vcHM6IGknbSBjb21pbmdcbiIpOworCisJZGV2ID0gYWxsb2NfaWVlZTgwMjExKHNpemVvZihzdHJ1Y3QgcjgxOTJfcHJpdikpOworCisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmaW50Zi0+ZGV2KTsKKwlwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlwcml2LT5pZWVlODAyMTEgPSBuZXRkZXZfcHJpdihkZXYpOworCXByaXYtPnVkZXY9dWRldjsKKworCWRldi0+bmV0ZGV2X29wcyA9ICZydGw4MTkyX25ldGRldl9vcHM7CisKKwkgLy9ETUVTRygiT29wczogaSdtIGNvbWluZ1xuIik7CisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKwlkZXYtPmdldF93aXJlbGVzc19zdGF0cyA9IHI4MTkyX2dldF93aXJlbGVzc19zdGF0czsKKyNlbmRpZgorCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopICZyODE5Ml93eF9oYW5kbGVyc19kZWY7CisjZW5kaWYKKwlkZXYtPnR5cGU9QVJQSFJEX0VUSEVSOworCisJZGV2LT53YXRjaGRvZ190aW1lbyA9IEhaKjM7CS8vbW9kaWZpZWQgYnkgam9obiwgMDgwNQorCisJaWYgKGRldl9hbGxvY19uYW1lKGRldiwgaWZuYW1lKSA8IDApeworCQlSVF9UUkFDRShDT01QX0lOSVQsICJPb3BzOiBkZXZuYW1lIGFscmVhZHkgdGFrZW4hIFRyeWluZyB3bGFuJSVkLi4uXG4iKTsKKwkJaWZuYW1lID0gIndsYW4lZCI7CisJCWRldl9hbGxvY19uYW1lKGRldiwgaWZuYW1lKTsKKwl9CisKKwlSVF9UUkFDRShDT01QX0lOSVQsICJEcml2ZXIgcHJvYmUgY29tcGxldGVkMVxuIik7CisJaWYocnRsODE5Ml9pbml0KGRldikhPTApeworCQlSVF9UUkFDRShDT01QX0VSUiwgIkluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCQlnb3RvIGZhaWw7CisJfQorCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJUlRfVFJBQ0UoQ09NUF9JTklULCAiZGV2IG5hbWU9PT09PT09PiAlc1xuIixkZXYtPm5hbWUpOworCXJ0bDgxOTJfcHJvY19pbml0X29uZShkZXYpOworCisKKwlSVF9UUkFDRShDT01QX0lOSVQsICJEcml2ZXIgcHJvYmUgY29tcGxldGVkXG4iKTsKKwlyZXR1cm4gMDsKKworCitmYWlsOgorCWZyZWVfaWVlZTgwMjExKGRldik7CisKKwlSVF9UUkFDRShDT01QX0VSUiwgIndsYW4gZHJpdmVyIGxvYWQgZmFpbGVkXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKKworfQorCisvL2RldGFjaCBhbGwgdGhlIHdvcmsgYW5kIHRpbWVyIHN0cnVjdHVyZSBkZWNsYXJlZCBvciBpbml0aXRpYWxpemUgaW4gcjgxOTJVX2luaXQgZnVuY3Rpb24uCit2b2lkIHJ0bDgxOTJfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IHI4MTkyX3ByaXYqIHByaXYpCit7CisKKwljYW5jZWxfd29ya19zeW5jKCZwcml2LT5yZXNldF93cSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+d2F0Y2hfZG9nX3dxKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT51cGRhdGVfYmVhY29uX3dxKTsKKwljYW5jZWxfd29ya19zeW5jKCZwcml2LT5xb3NfYWN0aXZhdGUpOworCS8vY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+U2V0QldNb2RlV29ya0l0ZW0pOworCS8vY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+U3dDaG5sV29ya0l0ZW0pOworCit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IHJ0bDgxOTJfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaWYoZGV2KXsKKworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJCVJUX1RSQUNFKENPTVBfRE9XTiwgIj09PT09PT09PT09PT0+d2xhbiBkcml2ZXIgdG8gYmUgcmVtb3ZlZFxuIik7CisJCXJ0bDgxOTJfcHJvY19yZW1vdmVfb25lKGRldik7CisKKwkJCXJ0bDgxOTJfZG93bihkZXYpOworCQlpZiAocHJpdi0+cEZpcm13YXJlKQorCQl7CisJCQlrZnJlZShwcml2LT5wRmlybXdhcmUpOworCQkJcHJpdi0+cEZpcm13YXJlID0gTlVMTDsKKwkJfQorCS8vCXByaXYtPnJmX2Nsb3NlKGRldik7CisvLwkJcnRsODE5Ml9TZXRSRlBvd2VyU3RhdGUoZGV2LCBlUmZPZmYpOworCQlydGw4MTkyX3VzYl9kZWxldGVlbmRwb2ludHMoZGV2KTsKKwkJZGVzdHJveV93b3JrcXVldWUocHJpdi0+cHJpdl93cSk7CisJCS8vcnRsODE5Ml9pcnFfZGlzYWJsZShkZXYpOworCQkvL3J0bDgxOTJfcmVzZXQoZGV2KTsKKwkJbWRlbGF5KDEwKTsKKworCX0KKwlmcmVlX2llZWU4MDIxMShkZXYpOworCVJUX1RSQUNFKENPTVBfRE9XTiwgIndsYW4gZHJpdmVyIHJlbW92ZWRcbiIpOworfQorCisvKiBmdW4gd2l0aCB0aGUgYnVpbHQtaW4gaWVlZTgwMjExIHN0YWNrLi4uICovCitleHRlcm4gaW50IGllZWU4MDIxMV9kZWJ1Z19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2RlYnVnX2V4aXQodm9pZCk7CitleHRlcm4gaW50IGllZWU4MDIxMV9jcnlwdG9faW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jcnlwdG9fZGVpbml0KHZvaWQpOworZXh0ZXJuIGludCBpZWVlODAyMTFfY3J5cHRvX3RraXBfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jcnlwdG9fdGtpcF9leGl0KHZvaWQpOworZXh0ZXJuIGludCBpZWVlODAyMTFfY3J5cHRvX2NjbXBfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jcnlwdG9fY2NtcF9leGl0KHZvaWQpOworZXh0ZXJuIGludCBpZWVlODAyMTFfY3J5cHRvX3dlcF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NyeXB0b193ZXBfZXhpdCh2b2lkKTsKKworc3RhdGljIGludCBfX2luaXQgcnRsODE5Ml91c2JfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCXJldCA9IGllZWU4MDIxMV9kZWJ1Z19pbml0KCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImllZWU4MDIxMV9kZWJ1Z19pbml0KCkgZmFpbGVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKyNlbmRpZgorCXJldCA9IGllZWU4MDIxMV9jcnlwdG9faW5pdCgpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZWVlODAyMTFfY3J5cHRvX2luaXQoKSBmYWlsZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gaWVlZTgwMjExX2NyeXB0b190a2lwX2luaXQoKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWVlZTgwMjExX2NyeXB0b190a2lwX2luaXQoKSBmYWlsZWQgJWRcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KCkgZmFpbGVkICVkXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBpZWVlODAyMTFfY3J5cHRvX3dlcF9pbml0KCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImllZWU4MDIxMV9jcnlwdG9fd2VwX2luaXQoKSBmYWlsZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiXG5MaW51eCBrZXJuZWwgZHJpdmVyIGZvciBSVEw4MTkyIGJhc2VkIFdMQU4gY2FyZHNcbiIpOworCXByaW50ayhLRVJOX0lORk8gIkNvcHlyaWdodCAoYykgMjAwNy0yMDA4LCBSZWFsc2lsIFdsYW5cbiIpOworCVJUX1RSQUNFKENPTVBfSU5JVCwgIkluaXRpYWxpemluZyBtb2R1bGUiKTsKKwlSVF9UUkFDRShDT01QX0lOSVQsICJXaXJlbGVzcyBleHRlbnNpb25zIHZlcnNpb24gJWQiLCBXSVJFTEVTU19FWFQpOworCXJ0bDgxOTJfcHJvY19tb2R1bGVfaW5pdCgpOworCXJldHVybiB1c2JfcmVnaXN0ZXIoJnJ0bDgxOTJfdXNiX2RyaXZlcik7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHJ0bDgxOTJfdXNiX21vZHVsZV9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJnJ0bDgxOTJfdXNiX2RyaXZlcik7CisKKwlSVF9UUkFDRShDT01QX0RPV04sICJFeGl0aW5nIik7CisvLwlydGw4MTkyX3Byb2NfbW9kdWxlX3JlbW92ZSgpOworfQorCisKK3ZvaWQgcnRsODE5Ml90cnlfd2FrZV9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcHJpKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2hvcnQgZW5vdWdoX2Rlc2M7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCWVub3VnaF9kZXNjID0gY2hlY2tfbmljX2Vub3VnaF9kZXNjKGRldixwcmkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCisJaWYoZW5vdWdoX2Rlc2MpCisJCWllZWU4MDIxMV93YWtlX3F1ZXVlKHByaXYtPmllZWU4MDIxMSk7Cit9CisKK3ZvaWQgRW5hYmxlSFdTZWN1cml0eUNvbmZpZzgxOTIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCBTRUNSX3ZhbHVlID0gMHgwOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJU0VDUl92YWx1ZSA9IFNDUl9UeEVuY0VuYWJsZSB8IFNDUl9SeERlY0VuYWJsZTsKKwlpZiAoKChLRVlfVFlQRV9XRVA0MCA9PSBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSkgfHwgKEtFWV9UWVBFX1dFUDEwNCA9PSBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSkpICYmIChwcml2LT5pZWVlODAyMTEtPmF1dGhfbW9kZSAhPSAyKSkKKwl7CisJCVNFQ1JfdmFsdWUgfD0gU0NSX1J4VXNlREs7CisJCVNFQ1JfdmFsdWUgfD0gU0NSX1R4VXNlREs7CisJfQorCWVsc2UgaWYgKChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpICYmIChpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSAmIChLRVlfVFlQRV9DQ01QIHwgS0VZX1RZUEVfVEtJUCkpKQorCXsKKwkJU0VDUl92YWx1ZSB8PSBTQ1JfUnhVc2VESzsKKwkJU0VDUl92YWx1ZSB8PSBTQ1JfVHhVc2VESzsKKwl9CisJLy9hZGQgSFdTZWMgYWN0aXZlIGVuYWJsZSBoZXJlLgorLy9kZWZhdWx0IHVzaW5nIGh3c2VjLiB3aGVuIHBlZXIgQVAgaXMgaW4gTiBtb2RlIG9ubHkgYW5kIHBhaXJ3aXNlX2tleV90eXBlIGlzIG5vbmVfYWVzKHdoaWNoIEhUX0lPVF9BQ1RfUFVSRV9OX01PREUgaW5kaWNhdGVzIGl0KSwgdXNlIHNvZnR3YXJlIHNlY3VyaXR5LiB3aGVuIHBlZXIgQVAgaXMgaW4gYixnLG4gbW9kZSBtaXhlZCBhbmQgcGFpcndpc2Vfa2V5X3R5cGUgaXMgbm9uZV9hZXMsIHVzZSBnIG1vZGUgaHcgc2VjdXJpdHkuIFdCIG9uIDIwMDguNy40CisKKwlpZWVlLT5od3NlY19hY3RpdmUgPSAxOworCisJaWYgKChpZWVlLT5wSFRJbmZvLT5JT1RBY3Rpb24mSFRfSU9UX0FDVF9QVVJFX05fTU9ERSkgfHwgIWh3d2VwKS8vIWllZWUtPmh3c2VjX3N1cHBvcnQpIC8vYWRkIGh3c2VjX3N1cHBvcnQgZmxhZyB0byB0b3RvbCBjb250cm9sIGh3X3NlYyBvbi9vZmYKKwl7CisJCWllZWUtPmh3c2VjX2FjdGl2ZSA9IDA7CisJCVNFQ1JfdmFsdWUgJj0gflNDUl9SeERlY0VuYWJsZTsKKwl9CisJUlRfVFJBQ0UoQ09NUF9TRUMsIiVzOiwgaHdzZWM6JWQsIHBhaXJ3aXNlX2tleTolZCwgU0VDUl92YWx1ZToleFxuIiwgX19GVU5DVElPTl9fLCBcCisJCQlpZWVlLT5od3NlY19hY3RpdmUsIGllZWUtPnBhaXJ3aXNlX2tleV90eXBlLCBTRUNSX3ZhbHVlKTsKKwl7CisJCXdyaXRlX25pY19ieXRlKGRldiwgU0VDUiwgIFNFQ1JfdmFsdWUpOy8vU0VDUl92YWx1ZSB8ICBTQ1JfVXNlREsgKTsKKwl9Cit9CisKKwordm9pZCBzZXRLZXkoCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCXU4IEVudHJ5Tm8sCisJCXU4IEtleUluZGV4LAorCQl1MTYgS2V5VHlwZSwKKwkJdTggKk1hY0FkZHIsCisJCXU4IERlZmF1bHRLZXksCisJCXUzMiAqS2V5Q29udGVudCApCit7CisJdTMyIFRhcmdldENvbW1hbmQgPSAwOworCXUzMiBUYXJnZXRDb250ZW50ID0gMDsKKwl1MTYgdXNDb25maWcgPSAwOworCXU4IGk7CisJaWYgKEVudHJ5Tm8gPj0gVE9UQUxfQ0FNX0VOVFJZKQorCQlSVF9UUkFDRShDT01QX0VSUiwgImNhbSBlbnRyeSBleGNlZWRzIGluIHNldEtleSgpXG4iKTsKKworCVJUX1RSQUNFKENPTVBfU0VDLCAiPT09PT50byBzZXRLZXkoKSwgZGV2OiVwLCBFbnRyeU5vOiVkLCBLZXlJbmRleDolZCwgS2V5VHlwZTolZCwgTWFjQWRkciJNQUNfRk1UIlxuIiwgZGV2LEVudHJ5Tm8sIEtleUluZGV4LCBLZXlUeXBlLCBNQUNfQVJHKE1hY0FkZHIpKTsKKworCWlmIChEZWZhdWx0S2V5KQorCQl1c0NvbmZpZyB8PSBCSVQxNSB8IChLZXlUeXBlPDwyKTsKKwllbHNlCisJCXVzQ29uZmlnIHw9IEJJVDE1IHwgKEtleVR5cGU8PDIpIHwgS2V5SW5kZXg7CisvLwl1c0NvbmZpZyB8PSBCSVQxNSB8IChLZXlUeXBlPDwyKSB8IChEZWZhdWx0S2V5PDw1KSB8IEtleUluZGV4OworCisKKwlmb3IoaT0wIDsgaTxDQU1fQ09OVEVOVF9DT1VOVDsgaSsrKXsKKwkJVGFyZ2V0Q29tbWFuZCAgPSBpK0NBTV9DT05URU5UX0NPVU5UKkVudHJ5Tm87CisJCVRhcmdldENvbW1hbmQgfD0gQklUMzF8QklUMTY7CisKKwkJaWYoaT09MCl7Ly9NQUN8Q29uZmlnCisJCQlUYXJnZXRDb250ZW50ID0gKHUzMikoKihNYWNBZGRyKzApKSA8PCAxNnwKKwkJCQkJKHUzMikoKihNYWNBZGRyKzEpKSA8PCAyNHwKKwkJCQkJKHUzMil1c0NvbmZpZzsKKworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgV0NBTUksIFRhcmdldENvbnRlbnQpOworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUldDQU0sIFRhcmdldENvbW1hbmQpOworCS8vCQlwcmludGsoInNldGtleSBjYW0gPSU4eFxuIiwgcmVhZF9jYW0oZGV2LCBpKzYqRW50cnlObykpOworCQl9CisJCWVsc2UgaWYoaT09MSl7Ly9NQUMKKwkJCVRhcmdldENvbnRlbnQgPSAodTMyKSgqKE1hY0FkZHIrMikpIAkgfAorCQkJCQkodTMyKSgqKE1hY0FkZHIrMykpIDw8ICA4fAorCQkJCQkodTMyKSgqKE1hY0FkZHIrNCkpIDw8IDE2fAorCQkJCQkodTMyKSgqKE1hY0FkZHIrNSkpIDw8IDI0OworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgV0NBTUksIFRhcmdldENvbnRlbnQpOworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUldDQU0sIFRhcmdldENvbW1hbmQpOworCQl9CisJCWVsc2UgeworCQkJLy9LZXkgTWF0ZXJpYWwKKwkJCWlmKEtleUNvbnRlbnQgIT1OVUxMKXsKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFdDQU1JLCAodTMyKSgqKEtleUNvbnRlbnQraS0yKSkgKTsKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFJXQ0FNLCBUYXJnZXRDb21tYW5kKTsKKwkJfQorCX0KKwl9CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tIG1vZHVsZSBpbml0IC8gZXhpdCBzdHVicyAtLS0tLS0tLS0tLS0tLS0tCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbW9kdWxlX2luaXQocnRsODE5Ml91c2JfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQocnRsODE5Ml91c2JfbW9kdWxlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZGU5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmMKQEAgLTAsMCArMSwzODkwIEBACisvKisrCitDb3B5cmlnaHQtYyBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworTW9kdWxlIE5hbWU6CisJcjgxOTJVX2RtLmMKKworQWJzdHJhY3Q6CisJSFcgZHluYW1pYyBtZWNoYW5pc20uCisKK01ham9yIENoYW5nZSBIaXN0b3J5OgorCVdoZW4gICAgICAJV2hvCQkJCVdoYXQKKwktLS0tLS0tLS0tCS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJMjAwOC0wNS0xNAlhbXkgICAgICAgICAgICAgICAgICAgICBjcmVhdGUgdmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisKKy0tKi8KKyNpbmNsdWRlICJyODE5MlUuaCIKKyNpbmNsdWRlICJyODE5MlVfZG0uaCIKKyNpbmNsdWRlICJyODE5MlVfaHcuaCIKKyNpbmNsdWRlICJyODE5eFVfcGh5LmgiCisjaW5jbHVkZSAicjgxOXhVX3BoeXJlZy5oIgorI2luY2x1ZGUgInI4MTkwX3J0bDgyNTYuaCIKKyNpbmNsdWRlICJyODE5eFVfY21kcGt0LmgiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBMb2NhbCBDb25zdGFudC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLworLy8gSW5kaWNhdGUgZGlmZmVyZW50IEFQIHZlbmRvciBmb3IgSU9UIGlzc3VlLgorLy8KK3N0YXRpYyB1MzIgZWRjYV9zZXR0aW5nX0RMW0hUX0lPVF9QRUVSX01BWF0gPQorCQl7IDB4NWU0MzIyLCAJMHg1ZTQzMjIsIAkweDVlNDMyMiwgCTB4NjA0MzIyLCAJMHhhNDRmLCAJMHg1ZWE0NGZ9Oworc3RhdGljIHUzMiBlZGNhX3NldHRpbmdfVUxbSFRfSU9UX1BFRVJfTUFYXSA9CisJCXsgMHg1ZTQzMjIsIAkweGE0NGYsIAkweDVlNDMyMiwgCTB4NjA0MzIyLCAJMHg1ZWE0NGYsIAkweDVlYTQ0Zn07CisKKworI2RlZmluZSBSVEtfVUxfRURDQSAweGE0NGYKKyNkZWZpbmUgUlRLX0RMX0VEQ0EgMHg1ZTQzMjIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIExvY2FsIENvbnN0YW50LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLyBEZWJ1ZyB2YXJpYWJsZSA/CitkaWdfdAlkbV9kaWd0YWJsZTsKKy8vIFN0b3JlIGN1cnJlbnQgc2hvZnR3YXJlIHdyaXRlIHJlZ2lzdGVyIGNvbnRlbnQgZm9yIE1BQyBQSFkuCit1OAkJZG1fc2hhZG93WzE2XVsyNTZdID0ge3swfX07CisvLyBGb3IgRHluYW1pYyBSeCBQYXRoIFNlbGVjdGlvbiBieSBTaWduYWwgU3RyZW5ndGgKK0RSeFBhdGhTZWwJRE1fUnhQYXRoU2VsVGFibGU7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgbG9jYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgbG9jYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZXhwb3J0IGZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybgl2b2lkCWluaXRfaGFsX2RtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuCXZvaWQgZGVpbml0X2hhbF9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworZXh0ZXJuIHZvaWQgaGFsX2RtX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisKK2V4dGVybgl2b2lkCWluaXRfcmF0ZV9hZGFwdGl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybgl2b2lkCWRtX3R4cG93ZXJfdHJhY2tpbmdjYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCitleHRlcm4Jdm9pZAlkbV9jY2tfdHhwb3dlcl9hZGp1c3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldixib29sICBiaW5jaDE0KTsKK2V4dGVybgl2b2lkCWRtX3Jlc3RvcmVfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4Jdm9pZAlkbV9iYWNrdXBfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4Jdm9pZAlkbV9jaGFuZ2VfZHluYW1pY19pbml0Z2Fpbl90aHJlc2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCQkJdTMyCQlkbV90eXBlLAorCQkJCQkJCQl1MzIJCWRtX3ZhbHVlKTsKK2V4dGVybgl2b2lkCURNX0NoYW5nZUZzeW5jU2V0dGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJCQkJCQkJczMyCQlETV9UeXBlLAorCQkJCQkJCQkJCQkJczMyCQlETV9WYWx1ZSk7CitleHRlcm4Jdm9pZCBkbV9mb3JjZV90eF9md19pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkJCQkJdTMyCQlmb3JjZV90eXBlLAorCQkJCQkJCQkJCXUzMgkJZm9yY2VfdmFsdWUpOworZXh0ZXJuCXZvaWQJZG1faW5pdF9lZGNhX3R1cmJvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuCXZvaWQJZG1fcmZfb3BlcmF0aW9uX3Rlc3RfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKTsKK2V4dGVybgl2b2lkCWRtX3JmX3BhdGhjaGVja193b3JraXRlbWNhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitleHRlcm4Jdm9pZCBkbV9mc3luY190aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOworZXh0ZXJuCXZvaWQgZG1fY2hlY2tfZnN5bmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4Jdm9pZAlkbV9zaGFkb3dfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGV4cG9ydCBmdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8gRE0gLS0+IFJhdGUgQWRhcHRpdmUKK3N0YXRpYwl2b2lkCWRtX2NoZWNrX3JhdGVfYWRhcHRpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8vIERNIC0tPiBCYW5kd2lkdGggc3dpdGNoCitzdGF0aWMJdm9pZAlkbV9pbml0X2JhbmR3aWR0aF9hdXRvc3dpdGNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljCXZvaWQJZG1fYmFuZHdpZHRoX2F1dG9zd2l0Y2goCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvLyBETSAtLT4gVFggcG93ZXIgY29udHJvbAorLy9zdGF0aWMJdm9pZAlkbV9pbml0aWFsaXplX3R4cG93ZXJfdHJhY2tpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYwl2b2lkCWRtX2NoZWNrX3R4cG93ZXJfdHJhY2tpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworCisvL3N0YXRpYwl2b2lkCWRtX3R4cG93ZXJfcmVzZXRfcmVjb3Zlcnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworLy8gRE0gLS0+IEJCIGluaXQgZ2FpbiByZXN0b3JlCisjaWZuZGVmIFJUTDgxOTJVCitzdGF0aWMJdm9pZAlkbV9iYl9pbml0aWFsZ2Fpbl9yZXN0b3JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisKKy8vIERNIC0tPiBCQiBpbml0IGdhaW4gYmFja3VwCitzdGF0aWMJdm9pZAlkbV9iYl9pbml0aWFsZ2Fpbl9iYWNrdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKKy8vIERNIC0tPiBEeW5hbWljIEluaXQgR2FpbiBieSBSU1NJCitzdGF0aWMJdm9pZAlkbV9kaWdfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYwl2b2lkCWRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljCXZvaWQJZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfaGlnaHB3cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYwl2b2lkCWRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpX2J5X2RyaXZlcnJzc2koCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljCXZvaWQJZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfYnlfZndmYWxzZV9hbGFybShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYwl2b2lkCWRtX2luaXRpYWxfZ2FpbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYwl2b2lkCWRtX3BkX3RoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljCXZvaWQJZG1fY3NfcmF0aW8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYwl2b2lkIGRtX2luaXRfY3RzdG9zZWxmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworLy8gRE0gLS0+IEVEQ0EgdHVyYm9lIG1vZGUgY29udHJvbAorc3RhdGljCXZvaWQJZG1fY2hlY2tfZWRjYV90dXJibyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLy8gRE0gLS0+IEhXIFJGIGNvbnRyb2wKK3N0YXRpYwl2b2lkCWRtX2NoZWNrX3JmY3RybF9ncGlvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisjaWZuZGVmIFJUTDgxOTBQCisvL3N0YXRpYwl2b2lkCWRtX2dwaW9fY2hhbmdlX3JmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisvLyBETSAtLT4gQ2hlY2sgUEJDCitzdGF0aWMJdm9pZCBkbV9jaGVja19wYmNfZ3BpbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCisvLyBETSAtLT4gQ2hlY2sgY3VycmVudCBSWCBSRiBwYXRoIHN0YXRlCitzdGF0aWMJdm9pZAlkbV9jaGVja19yeF9wYXRoX3NlbGVjdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyAJdm9pZCBkbV9pbml0X3J4cGF0aF9zZWxlY3Rpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMJdm9pZCBkbV9yeHBhdGhfc2VsX2J5cnNzaShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCisvLyBETSAtLT4gRnN5bmMgZm9yIGJyb2FkY29tIGFwCitzdGF0aWMgdm9pZCBkbV9pbml0X2ZzeW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZG1fZGVJbml0X2ZzeW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvL0FkZGVkIGJ5IHZpdmksIDIwMDgwNTIyCitzdGF0aWMJdm9pZAlkbV9jaGVja190eHJhdGVhbmRyZXRyeWNvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIG9mIFR4IFBvd2VyIENvbnRyb2wgRm9yIE5lYXIvRmFyIFJhbmdlIC0tLS0tLS0tKi8gICAvL0FkZCBieSBKYWNrZW4gMjAwOC8wMi8xOAorc3RhdGljCXZvaWQJZG1faW5pdF9keW5hbWljX3R4cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMJdm9pZAlkbV9keW5hbWljX3R4cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworLy8gRE0gLS0+IEZvciByYXRlIGFkYXB0aXZlIGFuZCBESUcsIHdlIG11c3Qgc2VuZCBSU1NJIHRvIGZpcm13YXJlCitzdGF0aWMJdm9pZCBkbV9zZW5kX3Jzc2lfdG9mdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYwl2b2lkCWRtX2N0c3Rvc2VsZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLwlIVyBEeW5hbWljIG1lY2hhbmlzbSBpbnRlcmZhY2UuCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlQcmVwYXJlIFNXIHJlc291cmNlIGZvciBIVyBkeW5hbWljIG1lY2hhbmlzbS4KKy8vCisvLwlBc3N1bXB0aW9uOgorLy8JCVRoaXMgZnVuY3Rpb24gaXMgb25seSBpbnZva2VkIGF0IGRyaXZlciBpbnRpYWxpemF0aW9uIG9uY2UuCisvLworLy8KK2V4dGVybgl2b2lkCitpbml0X2hhbF9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCS8vIFVuZGVjb3JhdGVkIFNtb290aGVkIFNpZ25hbCBTdHJlbmd0aCwgaXQgY2FuIHV0aWxpemVkIHRvIGR5bmFtaWMgbWVjaGFuaXNtLgorCXByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPSAtMTsKKworCS8vSW5pdGlhbCBUWCBQb3dlciBDb250cm9sIGZvciBuZWFyL2ZhciByYW5nZSAsIGFkZCBieSBhbXkgMjAwOC8wNS8xNSwgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKwlkbV9pbml0X2R5bmFtaWNfdHhwb3dlcihkZXYpOworCWluaXRfcmF0ZV9hZGFwdGl2ZShkZXYpOworCS8vZG1faW5pdGlhbGl6ZV90eHBvd2VyX3RyYWNraW5nKGRldik7CisJZG1fZGlnX2luaXQoZGV2KTsKKwlkbV9pbml0X2VkY2FfdHVyYm8oZGV2KTsKKwlkbV9pbml0X2JhbmR3aWR0aF9hdXRvc3dpdGNoKGRldik7CisJZG1faW5pdF9mc3luYyhkZXYpOworCWRtX2luaXRfcnhwYXRoX3NlbGVjdGlvbihkZXYpOworCWRtX2luaXRfY3RzdG9zZWxmKGRldik7CisKK30JLy8gSW5pdEhhbERtCisKK2V4dGVybiB2b2lkIGRlaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCWRtX2RlSW5pdF9mc3luYyhkZXYpOworCit9CisKKworI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCit2b2lkIGRtX0NoZWNrUnhBZ2dyZWdhdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdigoc3RydWN0IG5ldF9kZXZpY2UgKilkZXYpOworCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IHByaXYtPmllZWU4MDIxMS0+cEhUSW5mbzsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZwlsYXN0VHhPa0NudCA9IDA7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcJbGFzdFJ4T2tDbnQgPSAwOworCXVuc2lnbmVkIGxvbmcJCWN1clR4T2tDbnQgPSAwOworCXVuc2lnbmVkIGxvbmcJCWN1clJ4T2tDbnQgPSAwOworCisvKgorCWlmIChwSGFsRGF0YS0+YkZvcmNlZFVzYlJ4QWdncikgeworCQlpZiAocEhhbERhdGEtPkZvcmNlZFVzYlJ4QWdnckluZm8gPT0gMCkgeworCQkJaWYgKHBIYWxEYXRhLT5iQ3VycmVudFJ4QWdnckVuYWJsZSkgeworCQkJCUFkYXB0ZXItPkhhbEZ1bmMuSGFsVXNiUnhBZ2dySGFuZGxlcihBZGFwdGVyLCBGQUxTRSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoIXBIYWxEYXRhLT5iQ3VycmVudFJ4QWdnckVuYWJsZSB8fCAocEhhbERhdGEtPkZvcmNlZFVzYlJ4QWdnckluZm8gIT0gcEhhbERhdGEtPkxhc3RVc2JSeEFnZ3JJbmZvU2V0dGluZykpIHsKKwkJCQlBZGFwdGVyLT5IYWxGdW5jLkhhbFVzYlJ4QWdnckhhbmRsZXIoQWRhcHRlciwgVFJVRSk7CisJCQl9CisJCX0KKwkJcmV0dXJuOworCX0KKworKi8KKwljdXJUeE9rQ250ID0gcHJpdi0+c3RhdHMudHhieXRlc3VuaWNhc3QgLSBsYXN0VHhPa0NudDsKKwljdXJSeE9rQ250ID0gcHJpdi0+c3RhdHMucnhieXRlc3VuaWNhc3QgLSBsYXN0UnhPa0NudDsKKworCWlmKChjdXJUeE9rQ250ICsgY3VyUnhPa0NudCkgPCAxNTAwMDAwMCkgeworCQlyZXR1cm47CisJfQorCisJaWYoY3VyVHhPa0NudCA+IDQqY3VyUnhPa0NudCkgeworCQlpZiAocHJpdi0+YkN1cnJlbnRSeEFnZ3JFbmFibGUpIHsKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIDB4MWE4LCAwKTsKKwkJCXByaXYtPmJDdXJyZW50UnhBZ2dyRW5hYmxlID0gZmFsc2U7CisJCX0KKwl9ZWxzZXsKKwkJaWYgKCFwcml2LT5iQ3VycmVudFJ4QWdnckVuYWJsZSAmJiAhcEhUSW5mby0+YkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uKSB7CisJCQl1MzIgdWxWYWx1ZTsKKwkJCXVsVmFsdWUgPSAocEhUSW5mby0+VXNiUnhGd0FnZ3JFbjw8MjQpIHwgKHBIVEluZm8tPlVzYlJ4RndBZ2dyUGFnZU51bTw8MTYpIHwKKwkJCQkocEhUSW5mby0+VXNiUnhGd0FnZ3JQYWNrZXROdW08PDgpIHwgKHBIVEluZm8tPlVzYlJ4RndBZ2dyVGltZW91dCk7CisJCQkvKgorCQkJICogSWYgdXNiIHJ4IGZpcm13YXJlIGFnZ3JlZ2F0aW9uIGlzIGVuYWJsZWQsCisJCQkgKiB3aGVuIGFueW9uZSBvZiB0aHJlZSB0aHJlc2hvbGQgY29uZGl0aW9ucyBhYm92ZSBpcyByZWFjaGVkLAorCQkJICogZmlybXdhcmUgd2lsbCBzZW5kIGFnZ3JlZ2F0ZWQgcGFja2V0IHRvIGRyaXZlci4KKwkJCSAqLworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgMHgxYTgsIHVsVmFsdWUpOworCQkJcHJpdi0+YkN1cnJlbnRSeEFnZ3JFbmFibGUgPSB0cnVlOworCQl9CisJfQorCisJbGFzdFR4T2tDbnQgPSBwcml2LT5zdGF0cy50eGJ5dGVzdW5pY2FzdDsKKwlsYXN0UnhPa0NudCA9IHByaXYtPnN0YXRzLnJ4Ynl0ZXN1bmljYXN0OworfQkvLyBkbV9DaGVja0VkY2FUdXJibworI2VuZGlmCisKKworCitleHRlcm4gIHZvaWQgICAgaGFsX2RtX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLy9zdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwkvL3N0YXRpYyB1OCAJcHJldmlvdXNfYnNzaWRbNl0gPXswfTsKKworCS8qQWRkIGJ5IGFteSAyMDA4LzA1LzE1ICxwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLiovCisJZG1fY2hlY2tfcmF0ZV9hZGFwdGl2ZShkZXYpOworCWRtX2R5bmFtaWNfdHhwb3dlcihkZXYpOworCWRtX2NoZWNrX3R4cmF0ZWFuZHJldHJ5Y291bnQoZGV2KTsKKwlkbV9jaGVja190eHBvd2VyX3RyYWNraW5nKGRldik7CisJZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2koZGV2KTsKKwlkbV9jaGVja19lZGNhX3R1cmJvKGRldik7CisJZG1fYmFuZHdpZHRoX2F1dG9zd2l0Y2goZGV2KTsKKwlkbV9jaGVja19yZmN0cmxfZ3BpbyhkZXYpOworCWRtX2NoZWNrX3J4X3BhdGhfc2VsZWN0aW9uKGRldik7CisJZG1fY2hlY2tfZnN5bmMoZGV2KTsKKworCS8vIEFkZCBieSBhbXkgMjAwOC0wNS0xNSBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorCWRtX2NoZWNrX3BiY19ncGlvKGRldik7CisJZG1fc2VuZF9yc3NpX3RvZncoZGV2KTsKKwlkbV9jdHN0b3NlbGYoZGV2KTsKKyNpZmRlZiBVU0JfUlhfQUdHUkVHQVRJT05fU1VQUE9SVAorCWRtX0NoZWNrUnhBZ2dyZWdhdGlvbihkZXYpOworI2VuZGlmCit9CS8vSGFsRG1XYXRjaERvZworCisKKy8qCisgICogRGVjaWRlIFJhdGUgQWRhcHRpdmUgU2V0IGFjY29yZGluZyB0byBkaXN0YW5jZSAoc2lnbmFsIHN0cmVuZ3RoKQorICAqCTAxLzExLzIwMDgJTUhDCQlNb2RpZnkgaW5wdXQgYXJndW1lbnRzIGFuZCBSQVRSIHRhYmxlIGxldmVsLgorICAqCTAxLzE2LzIwMDgJTUhDCQlSRl9UeXBlIGlzIGFzc2lnbmVkIGluIFJlYWRBZGFwdGVySW5mbygpLiBXZSBtdXN0IGNhbGwKKyAgKgkJCQkJCXRoZSBmdW5jdGlvbiBhZnRlciBtYWtpbmcgc3VyZSBSRl9UeXBlLgorICAqLworZXh0ZXJuIHZvaWQgaW5pdF9yYXRlX2FkYXB0aXZlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXByYXRlX2FkYXB0aXZlCXByYSA9IChwcmF0ZV9hZGFwdGl2ZSkmcHJpdi0+cmF0ZV9hZGFwdGl2ZTsKKworCXByYS0+cmF0cl9zdGF0ZSA9IERNX1JBVFJfU1RBX01BWDsKKwlwcmEtPmhpZ2gybG93X3Jzc2lfdGhyZXNoX2Zvcl9yYSA9IFJhdGVBZGFwdGl2ZVRIX0hpZ2g7CisJcHJhLT5sb3cyaGlnaF9yc3NpX3RocmVzaF9mb3JfcmEyME0gPSBSYXRlQWRhcHRpdmVUSF9Mb3dfMjBNKzU7CisJcHJhLT5sb3cyaGlnaF9yc3NpX3RocmVzaF9mb3JfcmE0ME0gPSBSYXRlQWRhcHRpdmVUSF9Mb3dfNDBNKzU7CisKKwlwcmEtPmhpZ2hfcnNzaV90aHJlc2hfZm9yX3JhID0gUmF0ZUFkYXB0aXZlVEhfSGlnaCs1OworCXByYS0+bG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTIwTSA9IFJhdGVBZGFwdGl2ZVRIX0xvd18yME07CisJcHJhLT5sb3dfcnNzaV90aHJlc2hfZm9yX3JhNDBNID0gUmF0ZUFkYXB0aXZlVEhfTG93XzQwTTsKKworCWlmKHByaXYtPkN1c3RvbWVySUQgPT0gUlRfQ0lEXzgxOXhfTmV0Y29yZSkKKwkJcHJhLT5waW5nX3Jzc2lfZW5hYmxlID0gMTsKKwllbHNlCisJCXByYS0+cGluZ19yc3NpX2VuYWJsZSA9IDA7CisJcHJhLT5waW5nX3Jzc2lfdGhyZXNoX2Zvcl9yYSA9IDE1OworCisKKwlpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8yVDRSKQorCXsKKwkJLy8gMDcvMTAvMDggTUggTW9kaWZ5IGZvciBSQSBzbW9vdGggc2NoZW1lLgorCQkvKiAyMDA4LzAxLzExIE1IIE1vZGlmeSAyVCBSQVRSIHRhYmxlIGZvciBkaWZmZXJlbnQgUlNTSS4gMDgwNTE1IHBvcnRpbmcgYnkgYW15IGZyb20gd2luZG93cyBjb2RlLiovCisJCXByYS0+dXBwZXJfcnNzaV90aHJlc2hvbGRfcmF0cgkJPSAJMHg4ZjBmMDAwMDsKKwkJcHJhLT5taWRkbGVfcnNzaV90aHJlc2hvbGRfcmF0cgkJPSAJMHg4ZjBmZjAwMDsKKwkJcHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0cgkJPSAJMHg4ZjBmZjAwMTsKKwkJcHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0cl80ME0JPSAJMHg4ZjBmZjAwNTsKKwkJcHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0cl8yME0JPSAJMHg4ZjBmZjAwMTsKKwkJcHJhLT5waW5nX3Jzc2lfcmF0cgk9IAkweDAwMDAwMDBkOy8vY29zYSBhZGQgZm9yIHRlc3QKKwl9CisJZWxzZSBpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8xVDJSKQorCXsKKwkJcHJhLT51cHBlcl9yc3NpX3RocmVzaG9sZF9yYXRyCQk9IAkweDAwMGYwMDAwOworCQlwcmEtPm1pZGRsZV9yc3NpX3RocmVzaG9sZF9yYXRyCQk9IAkweDAwMGZmMDAwOworCQlwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyCQk9IAkweDAwMGZmMDAxOworCQlwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyXzQwTQk9IAkweDAwMGZmMDA1OworCQlwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyXzIwTQk9IAkweDAwMGZmMDAxOworCQlwcmEtPnBpbmdfcnNzaV9yYXRyCT0gCTB4MDAwMDAwMGQ7Ly9jb3NhIGFkZCBmb3IgdGVzdAorCX0KKworfQkvLyBJbml0UmF0ZUFkYXB0aXZlCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CWRtX2NoZWNrX3JhdGVfYWRhcHRpdmUoKQorICoKKyAqIE92ZXJ2aWV3OgorICoKKyAqIElucHV0OgkJTk9ORQorICoKKyAqIE91dHB1dDoJCU5PTkUKKyAqCisgKiBSZXR1cm46CQlOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICoJV2hlbgkJV2hvCQlSZW1hcmsKKyAqCTA1LzI2LzA4CWFteSAJQ3JlYXRlIHZlcnNpb24gMCBwcm90aW5nIGZyb20gd2luZG93cyBjb2RlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGRtX2NoZWNrX3JhdGVfYWRhcHRpdmUoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IHByaXYtPmllZWU4MDIxMS0+cEhUSW5mbzsKKwlwcmF0ZV9hZGFwdGl2ZQkJCXByYSA9IChwcmF0ZV9hZGFwdGl2ZSkmcHJpdi0+cmF0ZV9hZGFwdGl2ZTsKKwl1MzIJCQkJCQljdXJyZW50UkFUUiwgdGFyZ2V0UkFUUiA9IDA7CisJdTMyCQkJCQkJTG93UlNTSVRocmVzaEZvclJBID0gMCwgSGlnaFJTU0lUaHJlc2hGb3JSQSA9IDA7CisJYm9vbAkJCQkJCWJzaG9ydF9naV9lbmFibGVkID0gZmFsc2U7CisJc3RhdGljIHU4CQkJCQlwaW5nX3Jzc2lfc3RhdGU9MDsKKworCisJaWYoIXByaXYtPnVwKQorCXsKKwkJUlRfVFJBQ0UoQ09NUF9SQVRFLCAiPC0tLS0gZG1fY2hlY2tfcmF0ZV9hZGFwdGl2ZSgpOiBkcml2ZXIgaXMgZ29pbmcgdG8gdW5sb2FkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmKHByYS0+cmF0ZV9hZGFwdGl2ZV9kaXNhYmxlZCkvL3RoaXMgdmFyaWFibGUgaXMgc2V0IGJ5IGlvY3RsLgorCQlyZXR1cm47CisKKwkvLyBUT0RPOiBPbmx5IDExbiBtb2RlIGlzIGltcGxlbWVudGVkIGN1cnJlbnRseSwKKwlpZiggIShwcml2LT5pZWVlODAyMTEtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9OXzI0RyB8fAorCQkgcHJpdi0+aWVlZTgwMjExLT5tb2RlID09IFdJUkVMRVNTX01PREVfTl81RykpCisJCSByZXR1cm47CisKKwlpZiggcHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEICkKKwl7CisJLy8JUlRfVFJBQ0UoQ09NUF9SQVRFLCAiZG1fQ2hlY2tSYXRlQWRhcHRpdmUoKTogXHQiKTsKKworCQkvLworCQkvLyBDaGVjayB3aGV0aGVyIFNob3J0IEdJIGlzIGVuYWJsZWQKKwkJLy8KKwkJYnNob3J0X2dpX2VuYWJsZWQgPSAocEhUSW5mby0+YkN1clR4Qlc0ME1IeiAmJiBwSFRJbmZvLT5iQ3VyU2hvcnRHSTQwTUh6KSB8fAorCQkJKCFwSFRJbmZvLT5iQ3VyVHhCVzQwTUh6ICYmIHBIVEluZm8tPmJDdXJTaG9ydEdJMjBNSHopOworCisKKwkJcHJhLT51cHBlcl9yc3NpX3RocmVzaG9sZF9yYXRyID0KKwkJCQkocHJhLT51cHBlcl9yc3NpX3RocmVzaG9sZF9yYXRyICYgKH5CSVQzMSkpIHwgKChic2hvcnRfZ2lfZW5hYmxlZCk/IEJJVDMxOjApIDsKKworCQlwcmEtPm1pZGRsZV9yc3NpX3RocmVzaG9sZF9yYXRyID0KKwkJCQkocHJhLT5taWRkbGVfcnNzaV90aHJlc2hvbGRfcmF0ciAmICh+QklUMzEpKSB8ICgoYnNob3J0X2dpX2VuYWJsZWQpPyBCSVQzMTowKSA7CisKKwkJaWYgKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgIT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkKKwkJeworCQkJcHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0ciA9CisJCQkJKHByYS0+bG93X3Jzc2lfdGhyZXNob2xkX3JhdHJfNDBNICYgKH5CSVQzMSkpIHwgKChic2hvcnRfZ2lfZW5hYmxlZCk/IEJJVDMxOjApIDsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByYS0+bG93X3Jzc2lfdGhyZXNob2xkX3JhdHIgPQorCQkJKHByYS0+bG93X3Jzc2lfdGhyZXNob2xkX3JhdHJfMjBNICYgKH5CSVQzMSkpIHwgKChic2hvcnRfZ2lfZW5hYmxlZCk/IEJJVDMxOjApIDsKKwkJfQorCQkvL2Nvc2EgYWRkIGZvciB0ZXN0CisJCXByYS0+cGluZ19yc3NpX3JhdHIgPQorCQkJCShwcmEtPnBpbmdfcnNzaV9yYXRyICYgKH5CSVQzMSkpIHwgKChic2hvcnRfZ2lfZW5hYmxlZCk/IEJJVDMxOjApIDsKKworCQkvKiAyMDA3LzEwLzA4IE1IIFdlIHN1cHBvcnQgUkEgc21vb3RoIHNjaGVtZSBub3cuIFdoZW4gaXQgaXMgdGhlIGZpcnN0CisJCSAgIHRpbWUgdG8gbGluayB3aXRoIEFQLiBXZSB3aWxsIG5vdCBjaGFuZ2UgdXBwZXIvbG93ZXIgdGhyZXNob2xkLiBJZgorCQkgICBTVEEgc3RheSBpbiBoaWdoIG9yIGxvdyBsZXZlbCwgd2UgbXVzdCBjaGFuZ2UgdHdvIGRpZmZlcmVudCB0aHJlc2hvbGQKKwkJICAgdG8gcHJldmVudCBqdW1waW5nIGZyZXF1ZW50bHkuICovCisJCWlmIChwcmEtPnJhdHJfc3RhdGUgPT0gRE1fUkFUUl9TVEFfSElHSCkKKwkJeworCQkJSGlnaFJTU0lUaHJlc2hGb3JSQSAJPSBwcmEtPmhpZ2gybG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTsKKwkJCUxvd1JTU0lUaHJlc2hGb3JSQQk9IChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApPworCQkJCQkocHJhLT5sb3dfcnNzaV90aHJlc2hfZm9yX3JhNDBNKToocHJhLT5sb3dfcnNzaV90aHJlc2hfZm9yX3JhMjBNKTsKKwkJfQorCQllbHNlIGlmIChwcmEtPnJhdHJfc3RhdGUgPT0gRE1fUkFUUl9TVEFfTE9XKQorCQl7CisJCQlIaWdoUlNTSVRocmVzaEZvclJBCT0gcHJhLT5oaWdoX3Jzc2lfdGhyZXNoX2Zvcl9yYTsKKwkJCUxvd1JTU0lUaHJlc2hGb3JSQSAJPSAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKT8KKwkJCQkJKHByYS0+bG93MmhpZ2hfcnNzaV90aHJlc2hfZm9yX3JhNDBNKToocHJhLT5sb3cyaGlnaF9yc3NpX3RocmVzaF9mb3JfcmEyME0pOworCQl9CisJCWVsc2UKKwkJeworCQkJSGlnaFJTU0lUaHJlc2hGb3JSQQk9IHByYS0+aGlnaF9yc3NpX3RocmVzaF9mb3JfcmE7CisJCQlMb3dSU1NJVGhyZXNoRm9yUkEJPSAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKT8KKwkJCQkJKHByYS0+bG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTQwTSk6KHByYS0+bG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTIwTSk7CisJCX0KKworCQkvL0RiZ1ByaW50KCJbRE1dIFRIcmVzaCBIL0w9JWQvJWRcblxyIiwgUkFUUi5IaWdoUlNTSVRocmVzaEZvclJBLCBSQVRSLkxvd1JTU0lUaHJlc2hGb3JSQSk7CisJCWlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gKGxvbmcpSGlnaFJTU0lUaHJlc2hGb3JSQSkKKwkJeworCQkJLy9EYmdQcmludCgiW0RNXSBSU1NJPSVkIFNUQT1ISUdIXG5cciIsIHBIYWxEYXRhLT5VbmRlY29yYXRlZFNtb290aGVkUFdEQik7CisJCQlwcmEtPnJhdHJfc3RhdGUgPSBETV9SQVRSX1NUQV9ISUdIOworCQkJdGFyZ2V0UkFUUiA9IHByYS0+dXBwZXJfcnNzaV90aHJlc2hvbGRfcmF0cjsKKwkJfWVsc2UgaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSAobG9uZylMb3dSU1NJVGhyZXNoRm9yUkEpCisJCXsKKwkJCS8vRGJnUHJpbnQoIltETV0gUlNTST0lZCBTVEE9TWlkZGxlXG5cciIsIHBIYWxEYXRhLT5VbmRlY29yYXRlZFNtb290aGVkUFdEQik7CisJCQlwcmEtPnJhdHJfc3RhdGUgPSBETV9SQVRSX1NUQV9NSURETEU7CisJCQl0YXJnZXRSQVRSID0gcHJhLT5taWRkbGVfcnNzaV90aHJlc2hvbGRfcmF0cjsKKwkJfWVsc2UKKwkJeworCQkJLy9EYmdQcmludCgiW0RNXSBSU1NJPSVkIFNUQT1MT1dcblxyIiwgcEhhbERhdGEtPlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCKTsKKwkJCXByYS0+cmF0cl9zdGF0ZSA9IERNX1JBVFJfU1RBX0xPVzsKKwkJCXRhcmdldFJBVFIgPSBwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyOworCQl9CisKKwkJCS8vY29zYSBhZGQgZm9yIHRlc3QKKwkJaWYocHJhLT5waW5nX3Jzc2lfZW5hYmxlKQorCQl7CisJCQkvL3BIYWxEYXRhLT5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IDE5OworCQkJaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IChsb25nKShwcmEtPnBpbmdfcnNzaV90aHJlc2hfZm9yX3JhKzUpKQorCQkJeworCQkJCWlmKCAocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IChsb25nKXByYS0+cGluZ19yc3NpX3RocmVzaF9mb3JfcmEpIHx8CisJCQkJCXBpbmdfcnNzaV9zdGF0ZSApCisJCQkJeworCQkJCQkvL0RiZ1ByaW50KCJUZXN0UlNTSSA9ICVkLCBzZXQgUkFUUiB0byAweCV4IFxuIiwgcEhhbERhdGEtPlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCLCBwUkEtPlRlc3RSU1NJUkFUUik7CisJCQkJCXByYS0+cmF0cl9zdGF0ZSA9IERNX1JBVFJfU1RBX0xPVzsKKwkJCQkJdGFyZ2V0UkFUUiA9IHByYS0+cGluZ19yc3NpX3JhdHI7CisJCQkJCXBpbmdfcnNzaV9zdGF0ZSA9IDE7CisJCQkJfQorCQkJCS8vZWxzZQorCQkJCS8vCURiZ1ByaW50KCJUZXN0UlNTSSBpcyBiZXR3ZWVuIHRoZSByYW5nZS4gXG4iKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvL0RiZ1ByaW50KCJUZXN0UlNTSSBSZWNvdmVyIHRvIDB4JXggXG4iLCB0YXJnZXRSQVRSKTsKKwkJCQlwaW5nX3Jzc2lfc3RhdGUgPSAwOworCQkJfQorCQl9CisKKwkJLy8gMjAwOC4wNC4wMQorCQkvLyBGb3IgUlRMODE5WCwgaWYgcGFpcndpc2VrZXkgPSB3ZXAvdGtpcCwgd2Ugc3VwcG9ydCBvbmx5IE1DUzB+Ny4KKwkJaWYocHJpdi0+aWVlZTgwMjExLT5HZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyKGRldikpCisJCQl0YXJnZXRSQVRSICY9ICAweGYwMGZmZmZmOworCisJCS8vCisJCS8vIENoZWNrIHdoZXRoZXIgdXBkYXRpbmcgb2YgUkFUUjAgaXMgcmVxdWlyZWQKKwkJLy8KKwkJY3VycmVudFJBVFIgPSByZWFkX25pY19kd29yZChkZXYsIFJBVFIwKTsKKwkJaWYoIHRhcmdldFJBVFIgIT0gIGN1cnJlbnRSQVRSICkKKwkJeworCQkJdTMyIHJhdHJfdmFsdWU7CisJCQlyYXRyX3ZhbHVlID0gdGFyZ2V0UkFUUjsKKwkJCVJUX1RSQUNFKENPTVBfUkFURSwiY3VycmVudFJBVFIgPSAleCwgdGFyZ2V0UkFUUiA9ICV4XG4iLCBjdXJyZW50UkFUUiwgdGFyZ2V0UkFUUik7CisJCQlpZihwcml2LT5yZl90eXBlID09IFJGXzFUMlIpCisJCQl7CisJCQkJcmF0cl92YWx1ZSAmPSB+KFJBVEVfQUxMX09GRE1fMlNTKTsKKwkJCX0KKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFJBVFIwLCByYXRyX3ZhbHVlKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgVUZXUCwgMSk7CisKKwkJCXByYS0+bGFzdF9yYXRyID0gdGFyZ2V0UkFUUjsKKwkJfQorCisJfQorCWVsc2UKKwl7CisJCXByYS0+cmF0cl9zdGF0ZSA9IERNX1JBVFJfU1RBX01BWDsKKwl9CisKK30JLy8gZG1fQ2hlY2tSYXRlQWRhcHRpdmUKKworCitzdGF0aWMgdm9pZCBkbV9pbml0X2JhbmR3aWR0aF9hdXRvc3dpdGNoKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXByaXYtPmllZWU4MDIxMS0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLnRocmVzaG9sZF8yME1oenRvNDBNaHogPSBCV19BVVRPX1NXSVRDSF9MT1dfSElHSDsKKwlwcml2LT5pZWVlODAyMTEtPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC50aHJlc2hvbGRfNDBNaHp0bzIwTWh6ID0gQldfQVVUT19TV0lUQ0hfSElHSF9MT1c7CisJcHJpdi0+aWVlZTgwMjExLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmZvcmNlZF90eDIwTWh6ID0gZmFsc2U7CisJcHJpdi0+aWVlZTgwMjExLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmF1dG9zd2l0Y2hfZW5hYmxlID0gZmFsc2U7CisKK30JLy8gZG1faW5pdF9iYW5kd2lkdGhfYXV0b3N3aXRjaAorCisKK3N0YXRpYyB2b2lkIGRtX2JhbmR3aWR0aF9hdXRvc3dpdGNoKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCB8fCFwcml2LT5pZWVlODAyMTEtPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC5iYXV0b3N3aXRjaF9lbmFibGUpeworCQlyZXR1cm47CisJfWVsc2V7CisJCWlmKHByaXYtPmllZWU4MDIxMS0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLmJmb3JjZWRfdHgyME1oeiA9PSBmYWxzZSl7Ly9JZiBzZW5kIHBhY2tldHMgaW4gNDAgTWh6IGluIDIwLzQwCisJCQlpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDw9IHByaXYtPmllZWU4MDIxMS0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLnRocmVzaG9sZF80ME1oenRvMjBNaHopCisJCQkJcHJpdi0+aWVlZTgwMjExLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmZvcmNlZF90eDIwTWh6ID0gdHJ1ZTsKKwkJfWVsc2V7Ly9pbiBmb3JjZSBzZW5kIHBhY2tldHMgaW4gMjAgTWh6IGluIDIwLzQwCisJCQlpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IHByaXYtPmllZWU4MDIxMS0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLnRocmVzaG9sZF8yME1oenRvNDBNaHopCisJCQkJcHJpdi0+aWVlZTgwMjExLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmZvcmNlZF90eDIwTWh6ID0gZmFsc2U7CisKKwkJfQorCX0KK30JLy8gZG1fQmFuZHdpZHRoQXV0b1N3aXRjaAorCisvL09GRE0gZGVmYXVsdCBhdCAwZGIsIGluZGV4PTYuCitzdGF0aWMgdTMyIE9GRE1Td2luZ1RhYmxlW09GRE1fVGFibGVfTGVuZ3RoXSA9IHsKKwkweDdmODAwMWZlLAkvLyAwLCArNmRiCisJMHg3MWMwMDFjNywJLy8gMSwgKzVkYgorCTB4NjU0MDAxOTUsCS8vIDIsICs0ZGIKKwkweDVhNDAwMTY5LAkvLyAzLCArM2RiCisJMHg1MDgwMDE0MiwJLy8gNCwgKzJkYgorCTB4NDdjMDAxMWYsCS8vIDUsICsxZGIKKwkweDQwMDAwMTAwLAkvLyA2LCArMGRiID09PT4gZGVmYXVsdCwgdXBwZXIgZm9yIGhpZ2hlciB0ZW1wcmF0dXJlLCBsb3dlciBmb3IgbG93IHRlbXByYXR1cmUKKwkweDM5MDAwMGU0LAkvLyA3LCAtMWRiCisJMHgzMmMwMDBjYiwJLy8gOCwgLTJkYgorCTB4MmQ0MDAwYjUsCS8vIDksIC0zZGIKKwkweDI4ODAwMGEyLAkvLyAxMCwgLTRkYgorCTB4MjQwMDAwOTAsCS8vIDExLCAtNWRiCisJMHgyMDAwMDA4MCwJLy8gMTIsIC02ZGIKKwkweDFjODAwMDcyLAkvLyAxMywgLTdkYgorCTB4MTk4MDAwNjYsCS8vIDE0LCAtOGRiCisJMHgyNmMwMDA1YiwJLy8gMTUsIC05ZGIKKwkweDI0NDAwMDUxLAkvLyAxNiwgLTEwZGIKKwkweDEyMDAwMDQ4LAkvLyAxNywgLTExZGIKKwkweDEwMDAwMDQwCS8vIDE4LCAtMTJkYgorfTsKKworc3RhdGljIHU4CUNDS1N3aW5nVGFibGVfQ2gxX0NoMTNbQ0NLX1RhYmxlX2xlbmd0aF1bOF0gPSB7CisJezB4MzYsIDB4MzUsIDB4MmUsIDB4MjUsIDB4MWMsIDB4MTIsIDB4MDksIDB4MDR9LAkvLyAwLCArMGRiID09PT4gQ0NLNDBNIGRlZmF1bHQKKwl7MHgzMCwgMHgyZiwgMHgyOSwgMHgyMSwgMHgxOSwgMHgxMCwgMHgwOCwgMHgwM30sCS8vIDEsIC0xZGIKKwl7MHgyYiwgMHgyYSwgMHgyNSwgMHgxZSwgMHgxNiwgMHgwZSwgMHgwNywgMHgwM30sCS8vIDIsIC0yZGIKKwl7MHgyNiwgMHgyNSwgMHgyMSwgMHgxYiwgMHgxNCwgMHgwZCwgMHgwNiwgMHgwM30sCS8vIDMsIC0zZGIKKwl7MHgyMiwgMHgyMSwgMHgxZCwgMHgxOCwgMHgxMSwgMHgwYiwgMHgwNiwgMHgwMn0sCS8vIDQsIC00ZGIKKwl7MHgxZiwgMHgxZSwgMHgxYSwgMHgxNSwgMHgxMCwgMHgwYSwgMHgwNSwgMHgwMn0sCS8vIDUsIC01ZGIKKwl7MHgxYiwgMHgxYSwgMHgxNywgMHgxMywgMHgwZSwgMHgwOSwgMHgwNCwgMHgwMn0sCS8vIDYsIC02ZGIgPT09PiBDQ0syME0gZGVmYXVsdAorCXsweDE4LCAweDE3LCAweDE1LCAweDExLCAweDBjLCAweDA4LCAweDA0LCAweDAyfSwJLy8gNywgLTdkYgorCXsweDE2LCAweDE1LCAweDEyLCAweDBmLCAweDBiLCAweDA3LCAweDA0LCAweDAxfSwJLy8gOCwgLThkYgorCXsweDEzLCAweDEzLCAweDEwLCAweDBkLCAweDBhLCAweDA2LCAweDAzLCAweDAxfSwJLy8gOSwgLTlkYgorCXsweDExLCAweDExLCAweDBmLCAweDBjLCAweDA5LCAweDA2LCAweDAzLCAweDAxfSwJLy8gMTAsIC0xMGRiCisJezB4MGYsIDB4MGYsIDB4MGQsIDB4MGIsIDB4MDgsIDB4MDUsIDB4MDMsIDB4MDF9CS8vIDExLCAtMTFkYgorfTsKKworc3RhdGljIHU4CUNDS1N3aW5nVGFibGVfQ2gxNFtDQ0tfVGFibGVfbGVuZ3RoXVs4XSA9IHsKKwl7MHgzNiwgMHgzNSwgMHgyZSwgMHgxYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDAsICswZGIgID09PT4gQ0NLNDBNIGRlZmF1bHQKKwl7MHgzMCwgMHgyZiwgMHgyOSwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDEsIC0xZGIKKwl7MHgyYiwgMHgyYSwgMHgyNSwgMHgxNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDIsIC0yZGIKKwl7MHgyNiwgMHgyNSwgMHgyMSwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDMsIC0zZGIKKwl7MHgyMiwgMHgyMSwgMHgxZCwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDQsIC00ZGIKKwl7MHgxZiwgMHgxZSwgMHgxYSwgMHgwZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDUsIC01ZGIKKwl7MHgxYiwgMHgxYSwgMHgxNywgMHgwZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDYsIC02ZGIgID09PT4gQ0NLMjBNIGRlZmF1bHQKKwl7MHgxOCwgMHgxNywgMHgxNSwgMHgwYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDcsIC03ZGIKKwl7MHgxNiwgMHgxNSwgMHgxMiwgMHgwYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDgsIC04ZGIKKwl7MHgxMywgMHgxMywgMHgxMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDksIC05ZGIKKwl7MHgxMSwgMHgxMSwgMHgwZiwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDEwLCAtMTBkYgorCXsweDBmLCAweDBmLCAweDBkLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwfQkvLyAxMSwgLTExZGIKK307CisKK3N0YXRpYyB2b2lkIGRtX1RYUG93ZXJUcmFja2luZ0NhbGxiYWNrX1RTU0koc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWJvb2wJCQkJCQliSGlnaHBvd2Vyc3RhdGUsIHZpdmlmbGFnID0gRkFMU0U7CisJRENNRF9UWENNRF9UCQkJdHhfY21kOworCXU4CQkJCQkJcG93ZXJsZXZlbE9GRE0yNEc7CisJaW50CQkJCQkJaSA9MCwgaiA9IDAsIGsgPSAwOworCXU4CQkJCQkJUkZfVHlwZSwgdG1wX3JlcG9ydFs1XT17MCwgMCwgMCwgMCwgMH07CisJdTMyCQkJCQkJVmFsdWU7CisJdTgJCQkJCQlQd3JfRmxhZzsKKwl1MTYJCQkJCQlBdmdfVFNTSV9NZWFzLCBUU1NJXzEzZEJtLCBBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyPTA7CisJLy9SVF9TVEFUVVMgCQkJCXJ0U3RhdHVzID0gUlRfU1RBVFVTX1NVQ0NFU1M7CisJYm9vbCBydFN0YXR1cyA9IHRydWU7CisJdTMyCQkJCQkJZGVsdGE9MDsKKworCXdyaXRlX25pY19ieXRlKGRldiwgMHgxYmEsIDApOworCisJcHJpdi0+aWVlZTgwMjExLT5iZHluYW1pY190eHBvd2VyX2VuYWJsZSA9IGZhbHNlOworCWJIaWdocG93ZXJzdGF0ZSA9IHByaXYtPmJEeW5hbWljVHhIaWdoUG93ZXI7CisKKwlwb3dlcmxldmVsT0ZETTI0RyA9ICh1OCkocHJpdi0+UHdyX1RyYWNrPj4yNCk7CisJUkZfVHlwZSA9IHByaXYtPnJmX3R5cGU7CisJVmFsdWUgPSAoUkZfVHlwZTw8OCkgfCBwb3dlcmxldmVsT0ZETTI0RzsKKworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwb3dlcmxldmVsT0ZETTI0RyA9ICV4XG4iLCBwb3dlcmxldmVsT0ZETTI0Ryk7CisKKwlmb3IoaiA9IDA7IGo8PTMwOyBqKyspCit7CS8vZmlsbCB0eF9jbWQKKworCXR4X2NtZC5PcAkJPSBUWENNRF9TRVRfVFhfUFdSX1RSQUNLSU5HOworCXR4X2NtZC5MZW5ndGgJPSA0OworCXR4X2NtZC5WYWx1ZQkJPSBWYWx1ZTsKKyNpZmRlZiBSVEw4MTkyVQorCXJ0U3RhdHVzID0gU2VuZFR4Q29tbWFuZFBhY2tldChkZXYsICZ0eF9jbWQsIDEyKTsKKwlpZiAocnRTdGF0dXMgPT0gUlRfU1RBVFVTX0ZBSUxVUkUpCisJeworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiU2V0IGNvbmZpZ3VyYXRpb24gd2l0aCB0eCBjbWQgcXVldWUgZmFpbCFcbiIpOworCX0KKyNlbHNlCisJY21wa19tZXNzYWdlX2hhbmRsZV90eChkZXYsICh1OCopJnR4X2NtZCwKKwkJCQkJCQkJREVTQ19QQUNLRVRfVFlQRV9JTklULCBzaXplb2YoRENNRF9UWENNRF9UKSk7CisjZW5kaWYKKwltZGVsYXkoMSk7CisJLy9EYmdQcmludCgiaGksIHZpdmksIHN0cmFuZ2VcbiIpOworCWZvcihpID0gMDtpIDw9IDMwOyBpKyspCisJeworCQlQd3JfRmxhZyA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDFiYSk7CisKKwkJaWYgKFB3cl9GbGFnID09IDApCisJCXsKKwkJCW1kZWxheSgxKTsKKwkJCWNvbnRpbnVlOworCQl9CisjaWZkZWYgUlRMODE5MFAKKwkJQXZnX1RTU0lfTWVhcyA9IHJlYWRfbmljX3dvcmQoZGV2LCAweDFiYyk7CisjZWxzZQorCQlBdmdfVFNTSV9NZWFzID0gcmVhZF9uaWNfd29yZChkZXYsIDB4MTNjKTsKKyNlbmRpZgorCQlpZihBdmdfVFNTSV9NZWFzID09IDApCisJCXsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHgxYmEsIDApOworCQkJYnJlYWs7CisJCX0KKworCQlmb3IoayA9IDA7ayA8IDU7IGsrKykKKwkJeworI2lmZGVmIFJUTDgxOTBQCisJCQl0bXBfcmVwb3J0W2tdID0gcmVhZF9uaWNfYnl0ZShkZXYsIDB4MWQ4K2spOworI2Vsc2UKKwkJCWlmKGsgIT00KQorCQkJCXRtcF9yZXBvcnRba10gPSByZWFkX25pY19ieXRlKGRldiwgMHgxMzQrayk7CisJCQllbHNlCisJCQkJdG1wX3JlcG9ydFtrXSA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDEzZSk7CisjZW5kaWYKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJUU1NJX3JlcG9ydF92YWx1ZSA9ICVkXG4iLCB0bXBfcmVwb3J0W2tdKTsKKwkJfQorCisJCS8vY2hlY2sgaWYgdGhlIHJlcG9ydCB2YWx1ZSBpcyByaWdodAorCQlmb3IoayA9IDA7ayA8IDU7IGsrKykKKwkJeworCQkJaWYodG1wX3JlcG9ydFtrXSA8PSAyMCkKKwkJCXsKKwkJCQl2aXZpZmxhZyA9VFJVRTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZih2aXZpZmxhZyA9PVRSVUUpCisJCXsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHgxYmEsIDApOworCQkJdml2aWZsYWcgPSBGQUxTRTsKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJ3ZSBmaWx0ZWQgdGhpcyBkYXRhXG4iKTsKKwkJCWZvcihrID0gMDtrIDwgNTsgaysrKQorCQkJCXRtcF9yZXBvcnRba10gPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlmb3IoayA9IDA7ayA8IDU7IGsrKykKKwkJeworCQkJQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlciArPSB0bXBfcmVwb3J0W2tdOworCQl9CisKKwkJQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlciA9IEF2Z19UU1NJX01lYXNfZnJvbV9kcml2ZXIqMTAwLzU7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyID0gJWRcbiIsIEF2Z19UU1NJX01lYXNfZnJvbV9kcml2ZXIpOworCQlUU1NJXzEzZEJtID0gcHJpdi0+VFNTSV8xM2RCbTsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlRTU0lfMTNkQm0gPSAlZFxuIiwgVFNTSV8xM2RCbSk7CisKKwkJLy9pZihhYnMoQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlciAtIFRTU0lfMTNkQm0pIDw9IEVfRk9SX1RYX1BPV0VSX1RSQUNLKQorCQkvLyBGb3IgTWFjT1MtY29tcGF0aWJsZQorCQlpZihBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyID4gVFNTSV8xM2RCbSkKKwkJCWRlbHRhID0gQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlciAtIFRTU0lfMTNkQm07CisJCWVsc2UKKwkJCWRlbHRhID0gVFNTSV8xM2RCbSAtIEF2Z19UU1NJX01lYXNfZnJvbV9kcml2ZXI7CisKKwkJaWYoZGVsdGEgPD0gRV9GT1JfVFhfUE9XRVJfVFJBQ0spCisJCXsKKwkJCXByaXYtPmllZWU4MDIxMS0+YmR5bmFtaWNfdHhwb3dlcl9lbmFibGUgPSBUUlVFOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDFiYSwgMCk7CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAidHggcG93ZXIgdHJhY2sgaXMgZG9uZVxuIik7CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4ID0gJWRcbiIsIHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCk7CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgPSAlZFxuIiwgcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwpOworI2lmZGVmIFJUTDgxOTBQCisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4ID0gJWRcbiIsIHByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleCk7CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgPSAlZFxuIiwgcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwpOworI2VuZGlmCisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UgPSAlZFxuIiwgcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UpOworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbiA9ICVkXG4iLCBwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24pOworCQkJcmV0dXJuOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYoQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlciA8IFRTU0lfMTNkQm0gLSBFX0ZPUl9UWF9QT1dFUl9UUkFDSykKKwkJCXsKKwkJCQlpZigocHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4ID4gMCkKKyNpZmRlZiBSVEw4MTkwUAorCQkJCQkmJihwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXggPiAwKQorI2VuZGlmCisJCQkJKQorCQkJCXsKKwkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4LS07CisJCQkJCWlmKHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsID4gNCkKKwkJCQkJeworCQkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwtLTsKKwkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWEFUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkLCBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbF0udHhiYmdhaW5fdmFsdWUpOworCQkJCQl9CisjaWZkZWYgUlRMODE5MFAKKwkJCQkJcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4LS07CisJCQkJCWlmKHByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsID4gNCkKKwkJCQkJeworCQkJCQkJcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwtLTsKKwkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWENUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkLCBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbF0udHhiYmdhaW5fdmFsdWUpOworCQkJCQl9CisjZW5kaWYKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoKHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCA8IDM2KQorI2lmZGVmIFJUTDgxOTBQCisJCQkJCSYmKHByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleCA8IDM2KQorI2VuZGlmCisJCQkJCSkKKwkJCQl7CisJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCsrOworCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCsrOworCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwgYk1hc2tEV29yZCwgcHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWxdLnR4YmJnYWluX3ZhbHVlKTsKKworI2lmZGVmIFJUTDgxOTBQCisJCQkJCXByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleCsrOworCQkJCQlwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCsrOworCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hDVHhJUUltYmFsYW5jZSwgYk1hc2tEV29yZCwgcHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWxdLnR4YmJnYWluX3ZhbHVlKTsKKyNlbmRpZgorCQkJCX0KKwkJCX0KKwkJCXByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl9kaWZmZXJlbmNlCisJCQkJPSBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXggLSBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5nX2RlZmF1bHQ7CisKKwkJCWlmKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkKKwkJCQlwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24KKwkJCQk9IHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl8yME1kZWZhdWx0ICsgcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2U7CisJCQllbHNlCisJCQkJcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uCisJCQkJPSBwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fNDBNZGVmYXVsdCArIHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl9kaWZmZXJlbmNlOworCisJCQlpZihwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24gPiAtMSYmcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uIDwyMykKKwkJCXsKKwkJCQlpZihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IDE0ICYmICFwcml2LT5iY2NrX2luX2NoMTQpCisJCQkJeworCQkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSBUUlVFOworCQkJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QoZGV2LHByaXYtPmJjY2tfaW5fY2gxNCk7CisJCQkJfQorCQkJCWVsc2UgaWYocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCAhPSAxNCAmJiBwcml2LT5iY2NrX2luX2NoMTQpCisJCQkJeworCQkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSBGQUxTRTsKKwkJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldixwcml2LT5iY2NrX2luX2NoMTQpOworCQkJCX0KKwkJCQllbHNlCisJCQkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYscHJpdi0+YmNja19pbl9jaDE0KTsKKwkJCX0KKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCA9ICVkXG4iLCBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXgpOworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgPSAlZFxuIiwgcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwpOworI2lmZGVmIFJUTDgxOTBQCisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXggPSAlZFxuIiwgcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4KTsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsID0gJWRcbiIsIHByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsKTsKKyNlbmRpZgorCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UgPSAlZFxuIiwgcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UpOworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uID0gJWRcbiIsIHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbik7CisKKwkJaWYgKHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl9kaWZmZXJlbmNlIDw9IC0xMnx8cHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UgPj0gMjQpCisJCXsKKwkJCXByaXYtPmllZWU4MDIxMS0+YmR5bmFtaWNfdHhwb3dlcl9lbmFibGUgPSBUUlVFOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDFiYSwgMCk7CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAidHggcG93ZXIgdHJhY2stLS0+bGltaXRlZFxuIik7CisJCQlyZXR1cm47CisJCX0KKworCisJfQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MWJhLCAwKTsKKwkJQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlciA9IDA7CisJCWZvcihrID0gMDtrIDwgNTsgaysrKQorCQkJdG1wX3JlcG9ydFtrXSA9IDA7CisJCWJyZWFrOworCX0KK30KKwkJcHJpdi0+aWVlZTgwMjExLT5iZHluYW1pY190eHBvd2VyX2VuYWJsZSA9IFRSVUU7CisJCXdyaXRlX25pY19ieXRlKGRldiwgMHgxYmEsIDApOworfQorCitzdGF0aWMgdm9pZCBkbV9UWFBvd2VyVHJhY2tpbmdDYWxsYmFja19UaGVybWFsTWV0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisjZGVmaW5lIFRoZXJtYWxNZXRlclZhbAk5CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiB0bXBSZWdBLCBUZW1wQ0NrOworCXU4IHRtcE9GRE1pbmRleCwgdG1wQ0NLaW5kZXgsIHRtcENDSzIwTWluZGV4LCB0bXBDQ0s0ME1pbmRleCwgdG1wdmFsOworCWludCBpID0wLCBDQ0tTd2luZ05lZWRVcGRhdGU9MDsKKworCWlmKCFwcml2LT5idHhwb3dlcl90cmFja2luZ0luaXQpCisJeworCQkvL1F1ZXJ5IE9GRE0gZGVmYXVsdCBzZXR0aW5nCisJCXRtcFJlZ0E9IHJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQpOworCQlmb3IoaT0wOyBpPE9GRE1fVGFibGVfTGVuZ3RoOyBpKyspCS8vZmluZCB0aGUgaW5kZXgKKwkJeworCQkJaWYodG1wUmVnQSA9PSBPRkRNU3dpbmdUYWJsZVtpXSkKKwkJCXsKKwkJCQlwcml2LT5PRkRNX2luZGV4PSAodTgpaTsKKwkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiSW5pdGlhbCByZWcweCV4ID0gMHgleCwgT0ZETV9pbmRleD0weCV4XG4iLAorCQkJCQlyT0ZETTBfWEFUeElRSW1iYWxhbmNlLCB0bXBSZWdBLCBwcml2LT5PRkRNX2luZGV4KTsKKwkJCX0KKwkJfQorCisJCS8vUXVlcnkgQ0NLIGRlZmF1bHQgc2V0dGluZyBGcm9tIDB4YTIyCisJCVRlbXBDQ2sgPSBydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjEsIGJNYXNrQnl0ZTIpOworCQlmb3IoaT0wIDsgaTxDQ0tfVGFibGVfbGVuZ3RoIDsgaSsrKQorCQl7CisJCQlpZihUZW1wQ0NrID09ICh1MzIpQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tpXVswXSkKKwkJCXsKKwkJCQlwcml2LT5DQ0tfaW5kZXggPSh1OCkgaTsKKwkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiSW5pdGlhbCByZWcweCV4ID0gMHgleCwgQ0NLX2luZGV4PTB4JXhcbiIsCisJCQkJCXJDQ0swX1R4RmlsdGVyMSwgVGVtcENDaywgcHJpdi0+Q0NLX2luZGV4KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlwcml2LT5idHhwb3dlcl90cmFja2luZ0luaXQgPSBUUlVFOworCQkvL3BIYWxEYXRhLT5UWFBvd2VyY291bnQgPSAwOworCQlyZXR1cm47CisJfQorCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIHRoaXMgaXMgb25seSBmb3IgdGVzdCwgc2hvdWxkIGJlIG1hc2tlZAorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8vIHJlYWQgYW5kIGZpbHRlciBvdXQgdW5yZWFzb25hYmxlIHZhbHVlCisJdG1wUmVnQSA9IHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoZGV2LCBSRjkwX1BBVEhfQSwgMHgxMiwgMHgwNzgpOwkvLyAweDEyOiBSRiBSZWdbMTA6N10KKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiUmVhZGJhY2sgVGhlcm1hbE1ldGVyQSA9ICVkIFxuIiwgdG1wUmVnQSk7CisJaWYodG1wUmVnQSA8IDMgfHwgdG1wUmVnQSA+IDEzKQorCQlyZXR1cm47CisJaWYodG1wUmVnQSA+PSAxMikJLy8gaWYgb3ZlciAxMiwgVFAgd2lsbCBiZSBiYWQgd2hlbiBoaWdoIHRlbXByYXR1cmUKKwkJdG1wUmVnQSA9IDEyOworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJWYWxpZCBUaGVybWFsTWV0ZXJBID0gJWQgXG4iLCB0bXBSZWdBKTsKKwlwcml2LT5UaGVybWFsTWV0ZXJbMF0gPSBUaGVybWFsTWV0ZXJWYWw7CS8vV2UgdXNlIGZpeGVkIHZhbHVlIGJ5IEJyeWFudCdzIHN1Z2dlc3Rpb24KKwlwcml2LT5UaGVybWFsTWV0ZXJbMV0gPSBUaGVybWFsTWV0ZXJWYWw7CS8vV2UgdXNlIGZpeGVkIHZhbHVlIGJ5IEJyeWFudCdzIHN1Z2dlc3Rpb24KKworCS8vR2V0IGN1cnJlbnQgUkYtQSB0ZW1wcmF0dXJlIGluZGV4CisJaWYocHJpdi0+VGhlcm1hbE1ldGVyWzBdID49ICh1OCl0bXBSZWdBKQkvL2xvd2VyIHRlbXByYXR1cmUKKwl7CisJCXRtcE9GRE1pbmRleCA9IHRtcENDSzIwTWluZGV4ID0gNisocHJpdi0+VGhlcm1hbE1ldGVyWzBdLSh1OCl0bXBSZWdBKTsKKwkJdG1wQ0NLNDBNaW5kZXggPSB0bXBDQ0syME1pbmRleCAtIDY7CisJCWlmKHRtcE9GRE1pbmRleCA+PSBPRkRNX1RhYmxlX0xlbmd0aCkKKwkJCXRtcE9GRE1pbmRleCA9IE9GRE1fVGFibGVfTGVuZ3RoLTE7CisJCWlmKHRtcENDSzIwTWluZGV4ID49IENDS19UYWJsZV9sZW5ndGgpCisJCQl0bXBDQ0syME1pbmRleCA9IENDS19UYWJsZV9sZW5ndGgtMTsKKwkJaWYodG1wQ0NLNDBNaW5kZXggPj0gQ0NLX1RhYmxlX2xlbmd0aCkKKwkJCXRtcENDSzQwTWluZGV4ID0gQ0NLX1RhYmxlX2xlbmd0aC0xOworCX0KKwllbHNlCisJeworCQl0bXB2YWwgPSAoKHU4KXRtcFJlZ0EgLSBwcml2LT5UaGVybWFsTWV0ZXJbMF0pOworCQlpZih0bXB2YWwgPj0gNikJCQkJCQkJCS8vIGhpZ2hlciB0ZW1wcmF0dXJlCisJCQl0bXBPRkRNaW5kZXggPSB0bXBDQ0syME1pbmRleCA9IDA7CQkvLyBtYXggdG8gKzZkQgorCQllbHNlCisJCQl0bXBPRkRNaW5kZXggPSB0bXBDQ0syME1pbmRleCA9IDYgLSB0bXB2YWw7CisJCXRtcENDSzQwTWluZGV4ID0gMDsKKwl9CisJLy9EYmdQcmludCgiJWRkYiwgdG1wT0ZETWluZGV4ID0gJWQsIHRtcENDSzIwTWluZGV4ID0gJWQsIHRtcENDSzQwTWluZGV4ID0gJWQiLAorCQkvLygodTFCeXRlKXRtcFJlZ0EgLSBwSGFsRGF0YS0+VGhlcm1hbE1ldGVyWzBdKSwKKwkJLy90bXBPRkRNaW5kZXgsIHRtcENDSzIwTWluZGV4LCB0bXBDQ0s0ME1pbmRleCk7CisJaWYocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKQkvLzQwTQorCQl0bXBDQ0tpbmRleCA9IHRtcENDSzQwTWluZGV4OworCWVsc2UKKwkJdG1wQ0NLaW5kZXggPSB0bXBDQ0syME1pbmRleDsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPT0gMTQgJiYgIXByaXYtPmJjY2tfaW5fY2gxNCkKKwl7CisJCXByaXYtPmJjY2tfaW5fY2gxNCA9IFRSVUU7CisJCUNDS1N3aW5nTmVlZFVwZGF0ZSA9IDE7CisJfQorCWVsc2UgaWYocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCAhPSAxNCAmJiBwcml2LT5iY2NrX2luX2NoMTQpCisJeworCQlwcml2LT5iY2NrX2luX2NoMTQgPSBGQUxTRTsKKwkJQ0NLU3dpbmdOZWVkVXBkYXRlID0gMTsKKwl9CisKKwlpZihwcml2LT5DQ0tfaW5kZXggIT0gdG1wQ0NLaW5kZXgpCisJeworCQlwcml2LT5DQ0tfaW5kZXggPSB0bXBDQ0tpbmRleDsKKwkJQ0NLU3dpbmdOZWVkVXBkYXRlID0gMTsKKwl9CisKKwlpZihDQ0tTd2luZ05lZWRVcGRhdGUpCisJeworCQkvL0RiZ1ByaW50KCJVcGRhdGUgQ0NLIFN3aW5nLCBDQ0tfaW5kZXggPSAlZFxuIiwgcEhhbERhdGEtPkNDS19pbmRleCk7CisJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYsIHByaXYtPmJjY2tfaW5fY2gxNCk7CisJfQorCWlmKHByaXYtPk9GRE1faW5kZXggIT0gdG1wT0ZETWluZGV4KQorCXsKKwkJcHJpdi0+T0ZETV9pbmRleCA9IHRtcE9GRE1pbmRleDsKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQsIE9GRE1Td2luZ1RhYmxlW3ByaXYtPk9GRE1faW5kZXhdKTsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlVwZGF0ZSBPRkRNU3dpbmdbJWRdID0gMHgleFxuIiwKKwkJCXByaXYtPk9GRE1faW5kZXgsIE9GRE1Td2luZ1RhYmxlW3ByaXYtPk9GRE1faW5kZXhdKTsKKwl9CisJcHJpdi0+dHhwb3dlcl9jb3VudCA9IDA7Cit9CisKK2V4dGVybgl2b2lkCWRtX3R4cG93ZXJfdHJhY2tpbmdjYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOworICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGR3b3JrLHN0cnVjdCByODE5Ml9wcml2LHR4cG93ZXJfdHJhY2tpbmdfd3EpOworICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5pZWVlODAyMTEtPmRldjsKKworI2lmZGVmIFJUTDgxOTBQCisJZG1fVFhQb3dlclRyYWNraW5nQ2FsbGJhY2tfVFNTSShkZXYpOworI2Vsc2UKKwlpZihwcml2LT5iRGN1dCA9PSBUUlVFKQorCQlkbV9UWFBvd2VyVHJhY2tpbmdDYWxsYmFja19UU1NJKGRldik7CisJZWxzZQorCQlkbV9UWFBvd2VyVHJhY2tpbmdDYWxsYmFja19UaGVybWFsTWV0ZXIoZGV2KTsKKyNlbmRpZgorfQorCisKK3N0YXRpYyB2b2lkIGRtX0luaXRpYWxpemVUWFBvd2VyVHJhY2tpbmdfVFNTSShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJLy9Jbml0aWFsIHRoZSBUeCBCQiBpbmRleCBhbmQgbWFwcGluZyB2YWx1ZQorCXByaXYtPnR4YmJnYWluX3RhYmxlWzBdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCQkxMjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVswXS50eGJiZ2Fpbl92YWx1ZT0weDdmODAwMWZlOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzFdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCQkxMTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxXS50eGJiZ2Fpbl92YWx1ZT0weDc4ODAwMWUyOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzJdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCQkxMDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyXS50eGJiZ2Fpbl92YWx1ZT0weDcxYzAwMWM3OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzNdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCQk5OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzNdLnR4YmJnYWluX3ZhbHVlPTB4NmI4MDAxYWU7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbNF0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAgIDg7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbNF0udHhiYmdhaW5fdmFsdWU9MHg2NTQwMDE5NTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVs1XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgICAgNzsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVs1XS50eGJiZ2Fpbl92YWx1ZT0weDVmYzAwMTdmOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzZdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgICA2OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzZdLnR4YmJnYWluX3ZhbHVlPTB4NWE0MDAxNjk7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbN10udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAgIDU7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbN10udHhiYmdhaW5fdmFsdWU9MHg1NTQwMDE1NTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVs4XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgICAgNDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVs4XS50eGJiZ2Fpbl92YWx1ZT0weDUwODAwMTQyOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzldLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgICAzOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzldLnR4YmJnYWluX3ZhbHVlPTB4NGMwMDAxMzA7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMTBdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgICAyOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzEwXS50eGJiZ2Fpbl92YWx1ZT0weDQ3YzAwMTFmOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzExXS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgICAgMTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxMV0udHhiYmdhaW5fdmFsdWU9MHg0M2MwMDEwZjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxMl0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAgIDA7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMTJdLnR4YmJnYWluX3ZhbHVlPTB4NDAwMDAxMDA7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMTNdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgICAtMTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxM10udHhiYmdhaW5fdmFsdWU9MHgzYzgwMDBmMjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxNF0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtMjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxNF0udHhiYmdhaW5fdmFsdWU9MHgzOTAwMDBlNDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxNV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtMzsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxNV0udHhiYmdhaW5fdmFsdWU9MHgzNWMwMDBkNzsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxNl0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtNDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxNl0udHhiYmdhaW5fdmFsdWU9MHgzMmMwMDBjYjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxN10udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtNTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxN10udHhiYmdhaW5fdmFsdWU9MHgzMDAwMDBjMDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxOF0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJCSAgICAtNjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxOF0udHhiYmdhaW5fdmFsdWU9MHgyZDQwMDBiNTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxOV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtNzsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxOV0udHhiYmdhaW5fdmFsdWU9MHgyYWMwMDBhYjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyMF0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtODsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyMF0udHhiYmdhaW5fdmFsdWU9MHgyODgwMDBhMjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyMV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtOTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyMV0udHhiYmdhaW5fdmFsdWU9MHgyNjAwMDA5ODsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyMl0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtMTA7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjJdLnR4YmJnYWluX3ZhbHVlPTB4MjQwMDAwOTA7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjNdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgLTExOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzIzXS50eGJiZ2Fpbl92YWx1ZT0weDIyMDAwMDg4OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzI0XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC0xMjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyNF0udHhiYmdhaW5fdmFsdWU9MHgyMDAwMDA4MDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyNV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtMTM7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjVdLnR4YmJnYWluX3ZhbHVlPTB4MWEwMDAwNmM7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjZdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgLTE0OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzI2XS50eGJiZ2Fpbl92YWx1ZT0weDFjODAwMDcyOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzI3XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC0xNTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyN10udHhiYmdhaW5fdmFsdWU9MHgxODAwMDA2MDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyOF0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtMTY7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjhdLnR4YmJnYWluX3ZhbHVlPTB4MTk4MDAwNjY7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjldLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgLTE3OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzI5XS50eGJiZ2Fpbl92YWx1ZT0weDE1ODAwMDU2OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzMwXS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC0xODsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVszMF0udHhiYmdhaW5fdmFsdWU9MHgyNmMwMDA1YjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVszMV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtMTk7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMzFdLnR4YmJnYWluX3ZhbHVlPTB4MTQ0MDAwNTE7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMzJdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgLTIwOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzMyXS50eGJiZ2Fpbl92YWx1ZT0weDI0NDAwMDUxOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzMzXS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC0yMTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVszM10udHhiYmdhaW5fdmFsdWU9MHgxMzAwMDA0YzsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVszNF0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtMjI7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMzRdLnR4YmJnYWluX3ZhbHVlPTB4MTIwMDAwNDg7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMzVdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgLTIzOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzM1XS50eGJiZ2Fpbl92YWx1ZT0weDExMDAwMDQ0OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzM2XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC0yNDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVszNl0udHhiYmdhaW5fdmFsdWU9MHgxMDAwMDA0MDsKKworCS8vY2NrdHhiYl92YWx1ZWFycmF5WzBdIGlzIDB4QTIyIFsxXSBpcyAweEEyNCAuLi5bN10gaXMgMHhBMjkKKwkvL1RoaXMgVGFibGUgaXMgZm9yIENIMX5DSDEzCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MzY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MzU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MmU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MjU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MWM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MTI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDk7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDQ7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgzMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgzMjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgyYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgyMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgxYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgxMTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwNDsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDMwOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDJmOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDI5OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDIxOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDE5OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDEwOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAzOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MmQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MmQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4Mjc7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MWY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MTg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MGY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDM7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgyYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgyNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxZTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgxNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwZTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMzsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDI4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDI4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDIyOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDFjOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDE1OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDBkOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA3OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAzOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MjY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MjU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MjE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MWI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MTQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MGQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDM7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgyNDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxZjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxOTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgxMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwYzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMzsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDIyOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDIxOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDFkOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDE4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDExOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDBiOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA2OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAyOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MjA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MjA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MWI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDI7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTBdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MWY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDFlOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMF0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTBdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDEwOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMF0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTBdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAyOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzExXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDFkOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxYzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzExXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDE0OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwZjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MGE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzExXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA1OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMjsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTJdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MWE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDE3OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTJdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MGU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDA5OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwNDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTJdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDI7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTNdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MWE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDE5OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxM10uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTNdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDBkOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxM10uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwOTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTNdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAyOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDE4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDExOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwYzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA0OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMjsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTVdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDEzOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTVdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MGM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDA4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwNDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTVdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDI7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTZdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDE1OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNl0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxMjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTZdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDBiOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNl0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTZdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAxOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDE0OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxN10uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxNDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBlOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxN10uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDc7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAzOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxN10uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMjsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMThdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDEwOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwZDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMThdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MGE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDA2OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMThdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDE7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTldLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDEyOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOV0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgwZjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTldLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDA5OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOV0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTldLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAxOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDExOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxMTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MGY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBjOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwOTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAzOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMTsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjFdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDBlOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjFdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDA1OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjFdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDE7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MGY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMl0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgwZDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDA4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMl0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAxOworCisJLy9jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gaXMgMHhBMjIgWzFdIGlzIDB4QTI0IC4uLls3XSBpcyAweEEyOQorCS8vVGhpcyBUYWJsZSBpcyBmb3IgQ0gxNAorCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MzY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgzNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVswXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDJlOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MWI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVswXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzFdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MzM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgzMjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDJiOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzFdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTk7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzFdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzJdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MzA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyZjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDI5OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzJdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzJdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MmQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyZDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVszXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDI3OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTc7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVszXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzRdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MmI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDI1OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzRdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzRdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzVdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4Mjg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDIyOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzVdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzVdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MjY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDIxOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzddLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MjQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDFmOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzddLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzddLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzhdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MjI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyMTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDFkOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzhdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzhdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MjA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDFiOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDFmOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDFlOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDFhOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MWQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MWM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDA7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwZTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDFhOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDE5OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDE2OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBkOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTc7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDA7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDE2OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDE1OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDEyOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBiOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDA7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDEyOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDEyOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDA5OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MGY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MDk7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDA7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgwZTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDBkOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDA4OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmcgPSBUUlVFOworCXByaXYtPnR4cG93ZXJfY291bnQgICAgICAgPSAwOworCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nSW5pdCA9IEZBTFNFOworCit9CisKK3N0YXRpYyB2b2lkIGRtX0luaXRpYWxpemVUWFBvd2VyVHJhY2tpbmdfVGhlcm1hbE1ldGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJLy8gVHggUG93ZXIgdHJhY2tpbmcgYnkgVGhlcmVtYWwgTWV0ZXIgcmVxdWlyZSBGaXJtd2FyZSBSL1cgMy13aXJlLiBUaGlzIG1lY2hhbmlzbQorCS8vIGNhbiBiZSBlbmFibGVkIG9ubHkgd2hlbiBGaXJtd2FyZSBSL1cgMy13aXJlIGlzIGVuYWJsZWQuIE90aGVyd2lzZSwgZnJlcXVlbnQgci93CisJLy8gMy13aXJlIGJ5IGRyaXZlciBjYXVzZSBSRiBnb2VzIGludG8gd3Jvbmcgc3RhdGUuCisJaWYocHJpdi0+aWVlZTgwMjExLT5Gd1JXUkYpCisJCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nID0gVFJVRTsKKwllbHNlCisJCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nID0gRkFMU0U7CisJcHJpdi0+dHhwb3dlcl9jb3VudCAgICAgICA9IDA7CisJcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmdJbml0ID0gRkFMU0U7Cit9CisKKwordm9pZCBkbV9pbml0aWFsaXplX3R4cG93ZXJfdHJhY2tpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisjaWZkZWYgUlRMODE5MFAKKwlkbV9Jbml0aWFsaXplVFhQb3dlclRyYWNraW5nX1RTU0koZGV2KTsKKyNlbHNlCisJaWYocHJpdi0+YkRjdXQgPT0gVFJVRSkKKwkJZG1fSW5pdGlhbGl6ZVRYUG93ZXJUcmFja2luZ19UU1NJKGRldik7CisJZWxzZQorCQlkbV9Jbml0aWFsaXplVFhQb3dlclRyYWNraW5nX1RoZXJtYWxNZXRlcihkZXYpOworI2VuZGlmCit9Ly8gZG1fSW5pdGlhbGl6ZVRYUG93ZXJUcmFja2luZworCisKK3N0YXRpYyB2b2lkIGRtX0NoZWNrVFhQb3dlclRyYWNraW5nX1RTU0koc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RhdGljIHUzMiB0eF9wb3dlcl90cmFja19jb3VudGVyID0gMDsKKworCWlmKCFwcml2LT5idHhwb3dlcl90cmFja2luZykKKwkJcmV0dXJuOworCWVsc2UKKwl7CisJCWlmKCh0eF9wb3dlcl90cmFja19jb3VudGVyICUgMzAgPT0gMCkmJih0eF9wb3dlcl90cmFja19jb3VudGVyICE9IDApKQorCQl7CisJCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPnByaXZfd3EsJnByaXYtPnR4cG93ZXJfdHJhY2tpbmdfd3EsMCk7CisJCX0KKwkJdHhfcG93ZXJfdHJhY2tfY291bnRlcisrOworCX0KKworfQorCisKK3N0YXRpYyB2b2lkIGRtX0NoZWNrVFhQb3dlclRyYWNraW5nX1RoZXJtYWxNZXRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdGF0aWMgdTggCVRNX1RyaWdnZXI9MDsKKwkvL0RiZ1ByaW50KCJkbV9DaGVja1RYUG93ZXJUcmFja2luZygpIFxuIik7CisJaWYoIXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nKQorCQlyZXR1cm47CisJZWxzZQorCXsKKwkJaWYocHJpdi0+dHhwb3dlcl9jb3VudCAgPD0gMikKKwkJeworCQkJcHJpdi0+dHhwb3dlcl9jb3VudCsrOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYoIVRNX1RyaWdnZXIpCisJeworCQkvL0F0dGVudGlvbiEhIFlvdSBoYXZlIHRvIHdpcnRlIGFsbCAxMmJpdHMgZGF0YSB0byBSRiwgb3IgaXQgbWF5IGNhdXNlIFJGIHRvIGNyYXNoCisJCS8vYWN0dWFsbHkgd3JpdGUgcmVnMHgwMiBiaXQxPTAsIHRoZW4gYml0MT0xLgorCQkvL0RiZ1ByaW50KCJUcmlnZ2VyIFRoZXJtYWxNZXRlciwgd3JpdGUgUkYgcmVnMHgyID0gMHg0ZCB0byAweDRmXG4iKTsKKwkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCBSRjkwX1BBVEhfQSwgMHgwMiwgYk1hc2sxMkJpdHMsIDB4NGQpOworCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIFJGOTBfUEFUSF9BLCAweDAyLCBiTWFzazEyQml0cywgMHg0Zik7CisJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKGRldiwgUkY5MF9QQVRIX0EsIDB4MDIsIGJNYXNrMTJCaXRzLCAweDRkKTsKKwkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCBSRjkwX1BBVEhfQSwgMHgwMiwgYk1hc2sxMkJpdHMsIDB4NGYpOworCQlUTV9UcmlnZ2VyID0gMTsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJeworCQkvL0RiZ1ByaW50KCJTY2hlZHVsZSBUeFBvd2VyVHJhY2tpbmdXb3JrSXRlbVxuIik7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+cHJpdl93cSwmcHJpdi0+dHhwb3dlcl90cmFja2luZ193cSwwKTsKKwkJVE1fVHJpZ2dlciA9IDA7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGRtX2NoZWNrX3R4cG93ZXJfdHJhY2tpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy9zdGF0aWMgdTMyIHR4X3Bvd2VyX3RyYWNrX2NvdW50ZXIgPSAwOworCisjaWZkZWYgIFJUTDgxOTBQCisJZG1fQ2hlY2tUWFBvd2VyVHJhY2tpbmdfVFNTSShkZXYpOworI2Vsc2UKKwlpZihwcml2LT5iRGN1dCA9PSBUUlVFKQorCQlkbV9DaGVja1RYUG93ZXJUcmFja2luZ19UU1NJKGRldik7CisJZWxzZQorCQlkbV9DaGVja1RYUG93ZXJUcmFja2luZ19UaGVybWFsTWV0ZXIoZGV2KTsKKyNlbmRpZgorCit9CS8vIGRtX0NoZWNrVFhQb3dlclRyYWNraW5nCisKKworc3RhdGljIHZvaWQgZG1fQ0NLVHhQb3dlckFkanVzdF9UU1NJKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJvb2wgIGJJbkNIMTQpCit7CisJdTMyIFRlbXBWYWw7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vV3JpdGUgMHhhMjIgMHhhMjMKKwlUZW1wVmFsID0gMDsKKwlpZighYkluQ0gxNCl7CisJCS8vV3JpdGUgMHhhMjIgMHhhMjMKKwkJVGVtcFZhbCA9IAlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gKworCQkJCQkocHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlW3ByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl0uY2NrdHhiYl92YWx1ZWFycmF5WzFdPDw4KSA7CisKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX1R4RmlsdGVyMSxiTWFza0hXb3JkLCBUZW1wVmFsKTsKKwkJLy9Xcml0ZSAweGEyNCB+IDB4YTI3CisJCVRlbXBWYWwgPSAwOworCQlUZW1wVmFsID0gCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVsyXSArCisJCQkJCShwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM108PDgpICsKKwkJCQkJKHByaXYtPmNja190eGJiZ2Fpbl90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVs0XTw8MTYgKSsKKwkJCQkJKHByaXYtPmNja190eGJiZ2Fpbl90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVs1XTw8MjQpOworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfVHhGaWx0ZXIyLGJNYXNrRFdvcmQsIFRlbXBWYWwpOworCQkvL1dyaXRlIDB4YTI4ICAweGEyOQorCQlUZW1wVmFsID0gMDsKKwkJVGVtcFZhbCA9IAlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gKworCQkJCQkocHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlW3ByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl0uY2NrdHhiYl92YWx1ZWFycmF5WzddPDw4KSA7CisKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX0RlYnVnUG9ydCxiTWFza0xXb3JkLCBUZW1wVmFsKTsKKwl9CisJZWxzZQorCXsKKwkJVGVtcFZhbCA9IAlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVswXSArCisJCQkJCShwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVsxXTw8OCkgOworCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjEsYk1hc2tIV29yZCwgVGVtcFZhbCk7CisJCS8vV3JpdGUgMHhhMjQgfiAweGEyNworCQlUZW1wVmFsID0gMDsKKwkJVGVtcFZhbCA9IAlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVsyXSArCisJCQkJCShwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVszXTw8OCkgKworCQkJCQkocHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF08PDE2ICkrCisJCQkJCShwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVs1XTw8MjQpOworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfVHhGaWx0ZXIyLGJNYXNrRFdvcmQsIFRlbXBWYWwpOworCQkvL1dyaXRlIDB4YTI4ICAweGEyOQorCQlUZW1wVmFsID0gMDsKKwkJVGVtcFZhbCA9IAlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVs2XSArCisJCQkJCShwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVs3XTw8OCkgOworCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9EZWJ1Z1BvcnQsYk1hc2tMV29yZCwgVGVtcFZhbCk7CisJfQorCisKK30KKworc3RhdGljIHZvaWQgZG1fQ0NLVHhQb3dlckFkanVzdF9UaGVybWFsTWV0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwJYm9vbCAgYkluQ0gxNCkKK3sKKwl1MzIgVGVtcFZhbDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlUZW1wVmFsID0gMDsKKwlpZighYkluQ0gxNCkKKwl7CisJCS8vV3JpdGUgMHhhMjIgMHhhMjMKKwkJVGVtcFZhbCA9IAlDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW3ByaXYtPkNDS19pbmRleF1bMF0gKworCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzFdPDw4KSA7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjEsIGJNYXNrSFdvcmQsIFRlbXBWYWwpOworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiQ0NLIG5vdCBjaG5sIDE0LCByZWcgMHgleCA9IDB4JXhcbiIsCisJCQlyQ0NLMF9UeEZpbHRlcjEsIFRlbXBWYWwpOworCQkvL1dyaXRlIDB4YTI0IH4gMHhhMjcKKwkJVGVtcFZhbCA9IDA7CisJCVRlbXBWYWwgPSAJQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzJdICsKKwkJCQkJKENDS1N3aW5nVGFibGVfQ2gxX0NoMTNbcHJpdi0+Q0NLX2luZGV4XVszXTw8OCkgKworCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzRdPDwxNiApKworCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzVdPDwyNCk7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjIsIGJNYXNrRFdvcmQsIFRlbXBWYWwpOworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiQ0NLIG5vdCBjaG5sIDE0LCByZWcgMHgleCA9IDB4JXhcbiIsCisJCQlyQ0NLMF9UeEZpbHRlcjIsIFRlbXBWYWwpOworCQkvL1dyaXRlIDB4YTI4ICAweGEyOQorCQlUZW1wVmFsID0gMDsKKwkJVGVtcFZhbCA9IAlDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW3ByaXYtPkNDS19pbmRleF1bNl0gKworCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzddPDw4KSA7CisKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX0RlYnVnUG9ydCwgYk1hc2tMV29yZCwgVGVtcFZhbCk7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJDQ0sgbm90IGNobmwgMTQsIHJlZyAweCV4ID0gMHgleFxuIiwKKwkJCXJDQ0swX0RlYnVnUG9ydCwgVGVtcFZhbCk7CisJfQorCWVsc2UKKwl7CisvLwkJcHJpdi0+Q0NLVHhQb3dlckFkanVzdENudE5vdENoMTQrKzsJLy9jb3NhIGFkZCBmb3IgZGVidWcuCisJCS8vV3JpdGUgMHhhMjIgMHhhMjMKKwkJVGVtcFZhbCA9IAlDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVswXSArCisJCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVsxXTw8OCkgOworCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjEsIGJNYXNrSFdvcmQsIFRlbXBWYWwpOworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiQ0NLIGNobmwgMTQsIHJlZyAweCV4ID0gMHgleFxuIiwKKwkJCXJDQ0swX1R4RmlsdGVyMSwgVGVtcFZhbCk7CisJCS8vV3JpdGUgMHhhMjQgfiAweGEyNworCQlUZW1wVmFsID0gMDsKKwkJVGVtcFZhbCA9IAlDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVsyXSArCisJCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVszXTw8OCkgKworCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDE0W3ByaXYtPkNDS19pbmRleF1bNF08PDE2ICkrCisJCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVs1XTw8MjQpOworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfVHhGaWx0ZXIyLCBiTWFza0RXb3JkLCBUZW1wVmFsKTsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIkNDSyBjaG5sIDE0LCByZWcgMHgleCA9IDB4JXhcbiIsCisJCQlyQ0NLMF9UeEZpbHRlcjIsIFRlbXBWYWwpOworCQkvL1dyaXRlIDB4YTI4ICAweGEyOQorCQlUZW1wVmFsID0gMDsKKwkJVGVtcFZhbCA9IAlDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVs2XSArCisJCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVs3XTw8OCkgOworCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9EZWJ1Z1BvcnQsIGJNYXNrTFdvcmQsIFRlbXBWYWwpOworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCJDQ0sgY2hubCAxNCwgcmVnIDB4JXggPSAweCV4XG4iLAorCQkJckNDSzBfRGVidWdQb3J0LCBUZW1wVmFsKTsKKwl9Cit9CisKKworCitleHRlcm4gdm9pZCBkbV9jY2tfdHhwb3dlcl9hZGp1c3QoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlib29sICBiaW5jaDE0CispCit7CS8vIGRtX0NDS1R4UG93ZXJBZGp1c3QKKworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKyNpZmRlZiBSVEw4MTkwUAorCWRtX0NDS1R4UG93ZXJBZGp1c3RfVFNTSShkZXYsIGJpbmNoMTQpOworI2Vsc2UKKwlpZihwcml2LT5iRGN1dCA9PSBUUlVFKQorCQlkbV9DQ0tUeFBvd2VyQWRqdXN0X1RTU0koZGV2LCBiaW5jaDE0KTsKKwllbHNlCisJCWRtX0NDS1R4UG93ZXJBZGp1c3RfVGhlcm1hbE1ldGVyKGRldiwgYmluY2gxNCk7CisjZW5kaWYKK30KKworCisjaWZuZGVmICBSVEw4MTkyVQorc3RhdGljIHZvaWQgZG1fdHhwb3dlcl9yZXNldF9yZWNvdmVyeSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CispCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlN0YXJ0IFJlc2V0IFJlY292ZXJ5ID09PlxuIik7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQsIHByaXYtPnR4YmJnYWluX3RhYmxlW3ByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF0udHhiYmdhaW5fdmFsdWUpOworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJSZXNldCBSZWNvdmVyeTogRmlsbCBpbiAweGM4MCBpcyAlMDh4XG4iLHByaXYtPnR4YmJnYWluX3RhYmxlW3ByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF0udHhiYmdhaW5fdmFsdWUpOworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJSZXNldCBSZWNvdmVyeTogRmlsbCBpbiBSRkFfdHhQb3dlclRyYWNraW5nSW5kZXggaXMgJXhcbiIscHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4KTsKKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiUmVzZXQgUmVjb3ZlcnkgOiBSRiBBIEkvUSBBbXBsaWZ5IEdhaW4gaXMgJWxkXG4iLHByaXYtPnR4YmJnYWluX3RhYmxlW3ByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF0udHhiYl9pcV9hbXBsaWZ5Z2Fpbik7CisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlJlc2V0IFJlY292ZXJ5OiBDQ0sgQXR0ZW51YXRpb24gaXMgJWQgZEJcbiIscHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uKTsKKwlkbV9jY2tfdHhwb3dlcl9hZGp1c3QoZGV2LHByaXYtPmJjY2tfaW5fY2gxNCk7CisKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hDVHhJUUltYmFsYW5jZSwgYk1hc2tEV29yZCwgcHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4XS50eGJiZ2Fpbl92YWx1ZSk7CisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlJlc2V0IFJlY292ZXJ5OiBGaWxsIGluIDB4YzkwIGlzICUwOHhcbiIscHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4XS50eGJiZ2Fpbl92YWx1ZSk7CisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlJlc2V0IFJlY292ZXJ5OiBGaWxsIGluIFJGQ190eFBvd2VyVHJhY2tpbmdJbmRleCBpcyAleFxuIixwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXgpOworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJSZXNldCBSZWNvdmVyeSA6IFJGIEMgSS9RIEFtcGxpZnkgR2FpbiBpcyAlbGRcbiIscHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4XS50eGJiX2lxX2FtcGxpZnlnYWluKTsKKworfQkvLyBkbV9UWFBvd2VyUmVzZXRSZWNvdmVyeQorCitleHRlcm4gdm9pZCBkbV9yZXN0b3JlX2R5bmFtaWNfbWVjaGFuaXNtX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiAJcmVnX3JhdHIgPSBwcml2LT5yYXRlX2FkYXB0aXZlLmxhc3RfcmF0cjsKKworCWlmKCFwcml2LT51cCkKKwl7CisJCVJUX1RSQUNFKENPTVBfUkFURSwgIjwtLS0tIGRtX3Jlc3RvcmVfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoKTogZHJpdmVyIGlzIGdvaW5nIHRvIHVubG9hZFxuIik7CisJCXJldHVybjsKKwl9CisKKwkvLworCS8vIFJlc3RvcmUgcHJldmlvdXMgc3RhdGUgZm9yIHJhdGUgYWRhcHRpdmUKKwkvLworCWlmKHByaXYtPnJhdGVfYWRhcHRpdmUucmF0ZV9hZGFwdGl2ZV9kaXNhYmxlZCkKKwkJcmV0dXJuOworCS8vIFRPRE86IE9ubHkgMTFuIG1vZGUgaXMgaW1wbGVtZW50ZWQgY3VycmVudGx5LAorCWlmKCAhKHByaXYtPmllZWU4MDIxMS0+bW9kZT09V0lSRUxFU1NfTU9ERV9OXzI0RyB8fAorCQkgcHJpdi0+aWVlZTgwMjExLT5tb2RlPT1XSVJFTEVTU19NT0RFX05fNUcpKQorCQkgcmV0dXJuOworCXsKKwkJCS8qIDIwMDcvMTEvMTUgTUggQ29weSBmcm9tIDgxOTBQQ0kuICovCisJCQl1MzIgcmF0cl92YWx1ZTsKKwkJCXJhdHJfdmFsdWUgPSByZWdfcmF0cjsKKwkJCWlmKHByaXYtPnJmX3R5cGUgPT0gUkZfMVQyUikJLy8gMVQyUiwgU3BhdGlhbCBTdHJlYW0gMiBzaG91bGQgYmUgZGlzYWJsZWQKKwkJCXsKKwkJCQlyYXRyX3ZhbHVlICY9fiAoUkFURV9BTExfT0ZETV8yU1MpOworCQkJCS8vRGJnUHJpbnQoIkhXX1ZBUl9UQVRSXzAgZnJvbSAweCV4ID09PiAweCV4XG4iLCAoKHB1NEJ5dGUpKHZhbCkpWzBdLCByYXRyX3ZhbHVlKTsKKwkJCX0KKwkJCS8vRGJnUHJpbnQoInNldCBIV19WQVJfVEFUUl8wID0gMHgleFxuIiwgcmF0cl92YWx1ZSk7CisJCQkvL2Nvc2EgUGxhdGZvcm1FRklPV3JpdGU0Qnl0ZShBZGFwdGVyLCBSQVRSMCwgKChwdTRCeXRlKSh2YWwpKVswXSk7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSQVRSMCwgcmF0cl92YWx1ZSk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFVGV1AsIDEpOworCX0KKwkvL1Jlc29yZSBUWCBQb3dlciBUcmFja2luZyBJbmRleAorCWlmKHByaXYtPmJ0eHBvd2VyX3RyYWNraW5nSW5pdCAmJiBwcml2LT5idHhwb3dlcl90cmFja2luZyl7CisJCWRtX3R4cG93ZXJfcmVzZXRfcmVjb3ZlcnkoZGV2KTsKKwl9CisKKwkvLworCS8vUmVzdG9yZSBCQiBJbml0aWFsIEdhaW4KKwkvLworCWRtX2JiX2luaXRpYWxnYWluX3Jlc3RvcmUoZGV2KTsKKworfQkvLyBETV9SZXN0b3JlRHluYW1pY01lY2hhbmlzbVN0YXRlCisKK3N0YXRpYyB2b2lkIGRtX2JiX2luaXRpYWxnYWluX3Jlc3RvcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIGJpdF9tYXNrID0gMHg3ZjsgLy9CaXQwfiBCaXQ2CisKKwlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtID09IERJR19BTEdPX0JZX1JTU0kpCisJCXJldHVybjsKKworCS8vRGlzYWJsZSBJbml0aWFsIEdhaW4KKwkvL1BIWV9TZXRCQlJlZyhBZGFwdGVyLCBVRldQLCBiTWFza0xXb3JkLCAweDgwMCk7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIFVGV1AsIGJNYXNrQnl0ZTEsIDB4OCk7CS8vIE9ubHkgY2xlYXIgYnl0ZSAxIGFuZCByZXdyaXRlLgorCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSwgYml0X21hc2ssICh1MzIpcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhhYWdjY29yZTEpOworCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWEJBR0NDb3JlMSwgYml0X21hc2ssICh1MzIpcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhiYWdjY29yZTEpOworCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWENBR0NDb3JlMSwgYml0X21hc2ssICh1MzIpcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEpOworCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWERBR0NDb3JlMSwgYml0X21hc2ssICh1MzIpcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhkYWdjY29yZTEpOworCWJpdF9tYXNrICA9IGJNYXNrQnl0ZTI7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX0NDQSwgYml0X21hc2ssICh1MzIpcHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSk7CisKKwlSVF9UUkFDRShDT01QX0RJRywgImRtX0JCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzUwIGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54YWFnY2NvcmUxKTsKKwlSVF9UUkFDRShDT01QX0RJRywgImRtX0JCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzU4IGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54YmFnY2NvcmUxKTsKKwlSVF9UUkFDRShDT01QX0RJRywgImRtX0JCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzYwIGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54Y2FnY2NvcmUxKTsKKwlSVF9UUkFDRShDT01QX0RJRywgImRtX0JCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzY4IGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54ZGFnY2NvcmUxKTsKKwlSVF9UUkFDRShDT01QX0RJRywgImRtX0JCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YTBhIGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC5jY2EpOworCS8vRW5hYmxlIEluaXRpYWwgR2FpbgorCS8vUEhZX1NldEJCUmVnKEFkYXB0ZXIsIFVGV1AsIGJNYXNrTFdvcmQsIDB4MTAwKTsKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgVUZXUCwgYk1hc2tCeXRlMSwgMHgxKTsJLy8gT25seSBjbGVhciBieXRlIDEgYW5kIHJld3JpdGUuCisKK30JLy8gZG1fQkJJbml0aWFsR2FpblJlc3RvcmUKKworCitleHRlcm4gdm9pZCBkbV9iYWNrdXBfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwkvLyBGc3luYyB0byBhdm9pZCByZXNldAorCXByaXYtPmJzd2l0Y2hfZnN5bmMgID0gZmFsc2U7CisJcHJpdi0+YmZzeW5jX3Byb2Nlc3NpbmcgPSBmYWxzZTsKKwkvL0JhY2t1cCBCQiBJbml0aWFsR2FpbgorCWRtX2JiX2luaXRpYWxnYWluX2JhY2t1cChkZXYpOworCit9CS8vIERNX0JhY2t1cER5bmFtaWNNZWNoYW5pc21TdGF0ZQorCisKK3N0YXRpYyB2b2lkIGRtX2JiX2luaXRpYWxnYWluX2JhY2t1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgYml0X21hc2sgPSBiTWFza0J5dGUwOyAvL0JpdDB+IEJpdDYKKworCWlmKGRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG0gPT0gRElHX0FMR09fQllfUlNTSSkKKwkJcmV0dXJuOworCisJLy9QSFlfU2V0QkJSZWcoQWRhcHRlciwgVUZXUCwgYk1hc2tMV29yZCwgMHg4MDApOworCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBVRldQLCBiTWFza0J5dGUxLCAweDgpOwkvLyBPbmx5IGNsZWFyIGJ5dGUgMSBhbmQgcmV3cml0ZS4KKwlwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSA9ICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSwgYml0X21hc2spOworCXByaXYtPmluaXRnYWluX2JhY2t1cC54YmFnY2NvcmUxID0gKHU4KXJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsIHJPRkRNMF9YQkFHQ0NvcmUxLCBiaXRfbWFzayk7CisJcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEgPSAodTgpcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgck9GRE0wX1hDQUdDQ29yZTEsIGJpdF9tYXNrKTsKKwlwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSA9ICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByT0ZETTBfWERBR0NDb3JlMSwgYml0X21hc2spOworCWJpdF9tYXNrICA9IGJNYXNrQnl0ZTI7CisJcHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSA9ICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByQ0NLMF9DQ0EsIGJpdF9tYXNrKTsKKworCVJUX1RSQUNFKENPTVBfRElHLCAiQkJJbml0aWFsR2FpbkJhY2t1cCAweGM1MCBpcyAleFxuIixwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSk7CisJUlRfVFJBQ0UoQ09NUF9ESUcsICJCQkluaXRpYWxHYWluQmFja3VwIDB4YzU4IGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54YmFnY2NvcmUxKTsKKwlSVF9UUkFDRShDT01QX0RJRywgIkJCSW5pdGlhbEdhaW5CYWNrdXAgMHhjNjAgaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEpOworCVJUX1RSQUNFKENPTVBfRElHLCAiQkJJbml0aWFsR2FpbkJhY2t1cCAweGM2OCBpcyAleFxuIixwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSk7CisJUlRfVFJBQ0UoQ09NUF9ESUcsICJCQkluaXRpYWxHYWluQmFja3VwIDB4YTBhIGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC5jY2EpOworCit9ICAgLy8gZG1fQkJJbml0aWFsR2FpbkJha2N1cAorCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOglkbV9jaGFuZ2VfZHluYW1pY19pbml0Z2Fpbl90aHJlc2goKQorICoKKyAqIE92ZXJ2aWV3OgorICoKKyAqIElucHV0OgkJTk9ORQorICoKKyAqIE91dHB1dDoJCU5PTkUKKyAqCisgKiBSZXR1cm46CQlOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICoJV2hlbgkJV2hvCQlSZW1hcmsKKyAqCTA1LzI5LzIwMDgJYW15CQlDcmVhdGUgVmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIHZvaWQgZG1fY2hhbmdlX2R5bmFtaWNfaW5pdGdhaW5fdGhyZXNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkJCXUzMgkJZG1fdHlwZSwKKwkJCQkJCQkJdTMyCQlkbV92YWx1ZSkKK3sKKwlpZiAoZG1fdHlwZSA9PSBESUdfVFlQRV9USFJFU0hfSElHSCkKKwl7CisJCWRtX2RpZ3RhYmxlLnJzc2lfaGlnaF90aHJlc2ggPSBkbV92YWx1ZTsKKwl9CisJZWxzZSBpZiAoZG1fdHlwZSA9PSBESUdfVFlQRV9USFJFU0hfTE9XKQorCXsKKwkJZG1fZGlndGFibGUucnNzaV9sb3dfdGhyZXNoID0gZG1fdmFsdWU7CisJfQorCWVsc2UgaWYgKGRtX3R5cGUgPT0gRElHX1RZUEVfVEhSRVNIX0hJR0hQV1JfSElHSCkKKwl7CisJCWRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9oaWdodGhyZXNoID0gZG1fdmFsdWU7CisJfQorCWVsc2UgaWYgKGRtX3R5cGUgPT0gRElHX1RZUEVfVEhSRVNIX0hJR0hQV1JfSElHSCkKKwl7CisJCWRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9oaWdodGhyZXNoID0gZG1fdmFsdWU7CisJfQorCWVsc2UgaWYgKGRtX3R5cGUgPT0gRElHX1RZUEVfRU5BQkxFKQorCXsKKwkJZG1fZGlndGFibGUuZGlnX3N0YXRlCQk9IERNX1NUQV9ESUdfTUFYOworCQlkbV9kaWd0YWJsZS5kaWdfZW5hYmxlX2ZsYWcJPSB0cnVlOworCX0KKwllbHNlIGlmIChkbV90eXBlID09IERJR19UWVBFX0RJU0FCTEUpCisJeworCQlkbV9kaWd0YWJsZS5kaWdfc3RhdGUJCT0gRE1fU1RBX0RJR19NQVg7CisJCWRtX2RpZ3RhYmxlLmRpZ19lbmFibGVfZmxhZwk9IGZhbHNlOworCX0KKwllbHNlIGlmIChkbV90eXBlID09IERJR19UWVBFX0RCR19NT0RFKQorCXsKKwkJaWYoZG1fdmFsdWUgPj0gRE1fREJHX01BWCkKKwkJCWRtX3ZhbHVlID0gRE1fREJHX09GRjsKKwkJZG1fZGlndGFibGUuZGJnX21vZGUJCT0gKHU4KWRtX3ZhbHVlOworCX0KKwllbHNlIGlmIChkbV90eXBlID09IERJR19UWVBFX1JTU0kpCisJeworCQlpZihkbV92YWx1ZSA+IDEwMCkKKwkJCWRtX3ZhbHVlID0gMzA7CisJCWRtX2RpZ3RhYmxlLnJzc2lfdmFsCQkJPSAobG9uZylkbV92YWx1ZTsKKwl9CisJZWxzZSBpZiAoZG1fdHlwZSA9PSBESUdfVFlQRV9BTEdPUklUSE0pCisJeworCQlpZiAoZG1fdmFsdWUgPj0gRElHX0FMR09fTUFYKQorCQkJZG1fdmFsdWUgPSBESUdfQUxHT19CWV9GQUxTRV9BTEFSTTsKKwkJaWYoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobSAhPSAodTgpZG1fdmFsdWUpCisJCQlkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCA9IDE7CisJCWRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG0JPSAodTgpZG1fdmFsdWU7CisJfQorCWVsc2UgaWYgKGRtX3R5cGUgPT0gRElHX1RZUEVfQkFDS09GRikKKwl7CisJCWlmKGRtX3ZhbHVlID4gMzApCisJCQlkbV92YWx1ZSA9IDMwOworCQlkbV9kaWd0YWJsZS5iYWNrb2ZmX3ZhbAkJPSAodTgpZG1fdmFsdWU7CisJfQorCWVsc2UgaWYoZG1fdHlwZSA9PSBESUdfVFlQRV9SWF9HQUlOX01JTikKKwl7CisJCWlmKGRtX3ZhbHVlID09IDApCisJCQlkbV92YWx1ZSA9IDB4MTsKKwkJZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9taW4gPSAodTgpZG1fdmFsdWU7CisJfQorCWVsc2UgaWYoZG1fdHlwZSA9PSBESUdfVFlQRV9SWF9HQUlOX01BWCkKKwl7CisJCWlmKGRtX3ZhbHVlID4gMHg1MCkKKwkJCWRtX3ZhbHVlID0gMHg1MDsKKwkJZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9tYXggPSAodTgpZG1fdmFsdWU7CisJfQorfQkvKiBETV9DaGFuZ2VEeW5hbWljSW5pdEdhaW5UaHJlc2ggKi8KK2V4dGVybgl2b2lkCitkbV9jaGFuZ2VfZnN5bmNfc2V0dGluZygKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXMzMgkJRE1fVHlwZSwKKwlzMzIJCURNX1ZhbHVlKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmIChETV9UeXBlID09IDApCS8vIG1vbml0b3IgMHhjMzggcmVnaXN0ZXIKKwl7CisJCWlmKERNX1ZhbHVlID4gMSkKKwkJCURNX1ZhbHVlID0gMTsKKwkJcHJpdi0+ZnJhbWVzeW5jTW9uaXRvciA9ICh1OClETV9WYWx1ZTsKKwkJLy9EYmdQcmludCgicEhhbERhdGEtPmZyYW1lc3luY01vbml0b3IgPSAlZCIsIHBIYWxEYXRhLT5mcmFtZXN5bmNNb25pdG9yKTsKKwl9Cit9CisKK2V4dGVybiB2b2lkCitkbV9jaGFuZ2VfcnhwYXRoX3NlbGVjdGlvbl9zZXR0aW5nKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJczMyCQlETV9UeXBlLAorCXMzMgkJRE1fVmFsdWUpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXByYXRlX2FkYXB0aXZlIAlwUkEgPSAocHJhdGVfYWRhcHRpdmUpJihwcml2LT5yYXRlX2FkYXB0aXZlKTsKKworCisJaWYoRE1fVHlwZSA9PSAwKQorCXsKKwkJaWYoRE1fVmFsdWUgPiAxKQorCQkJRE1fVmFsdWUgPSAxOworCQlETV9SeFBhdGhTZWxUYWJsZS5FbmFibGUgPSAodTgpRE1fVmFsdWU7CisJfQorCWVsc2UgaWYoRE1fVHlwZSA9PSAxKQorCXsKKwkJaWYoRE1fVmFsdWUgPiAxKQorCQkJRE1fVmFsdWUgPSAxOworCQlETV9SeFBhdGhTZWxUYWJsZS5EYmdNb2RlID0gKHU4KURNX1ZhbHVlOworCX0KKwllbHNlIGlmKERNX1R5cGUgPT0gMikKKwl7CisJCWlmKERNX1ZhbHVlID4gNDApCisJCQlETV9WYWx1ZSA9IDQwOworCQlETV9SeFBhdGhTZWxUYWJsZS5TU19USF9sb3cgPSAodTgpRE1fVmFsdWU7CisJfQorCWVsc2UgaWYoRE1fVHlwZSA9PSAzKQorCXsKKwkJaWYoRE1fVmFsdWUgPiAyNSkKKwkJCURNX1ZhbHVlID0gMjU7CisJCURNX1J4UGF0aFNlbFRhYmxlLmRpZmZfVEggPSAodTgpRE1fVmFsdWU7CisJfQorCWVsc2UgaWYoRE1fVHlwZSA9PSA0KQorCXsKKwkJaWYoRE1fVmFsdWUgPj0gQ0NLX1J4X1ZlcnNpb25fTUFYKQorCQkJRE1fVmFsdWUgPSBDQ0tfUnhfVmVyc2lvbl8xOworCQlETV9SeFBhdGhTZWxUYWJsZS5jY2tfbWV0aG9kPSAodTgpRE1fVmFsdWU7CisJfQorCWVsc2UgaWYoRE1fVHlwZSA9PSAxMCkKKwl7CisJCWlmKERNX1ZhbHVlID4gMTAwKQorCQkJRE1fVmFsdWUgPSA1MDsKKwkJRE1fUnhQYXRoU2VsVGFibGUucmZfcnNzaVswXSA9ICh1OClETV9WYWx1ZTsKKwl9CisJZWxzZSBpZihETV9UeXBlID09IDExKQorCXsKKwkJaWYoRE1fVmFsdWUgPiAxMDApCisJCQlETV9WYWx1ZSA9IDUwOworCQlETV9SeFBhdGhTZWxUYWJsZS5yZl9yc3NpWzFdID0gKHU4KURNX1ZhbHVlOworCX0KKwllbHNlIGlmKERNX1R5cGUgPT0gMTIpCisJeworCQlpZihETV9WYWx1ZSA+IDEwMCkKKwkJCURNX1ZhbHVlID0gNTA7CisJCURNX1J4UGF0aFNlbFRhYmxlLnJmX3Jzc2lbMl0gPSAodTgpRE1fVmFsdWU7CisJfQorCWVsc2UgaWYoRE1fVHlwZSA9PSAxMykKKwl7CisJCWlmKERNX1ZhbHVlID4gMTAwKQorCQkJRE1fVmFsdWUgPSA1MDsKKwkJRE1fUnhQYXRoU2VsVGFibGUucmZfcnNzaVszXSA9ICh1OClETV9WYWx1ZTsKKwl9CisJZWxzZSBpZihETV9UeXBlID09IDIwKQorCXsKKwkJaWYoRE1fVmFsdWUgPiAxKQorCQkJRE1fVmFsdWUgPSAxOworCQlwUkEtPnBpbmdfcnNzaV9lbmFibGUgPSAodTgpRE1fVmFsdWU7CisJfQorCWVsc2UgaWYoRE1fVHlwZSA9PSAyMSkKKwl7CisJCWlmKERNX1ZhbHVlID4gMzApCisJCQlETV9WYWx1ZSA9IDMwOworCQlwUkEtPnBpbmdfcnNzaV90aHJlc2hfZm9yX3JhID0gRE1fVmFsdWU7CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOglkbV9kaWdfaW5pdCgpCisgKgorICogT3ZlcnZpZXc6CVNldCBESUcgc2NoZW1lIGluaXQgdmFsdWUuCisgKgorICogSW5wdXQ6CQlOT05FCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCU5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDUvMTUvMjAwOAlhbXkJCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBkbV9kaWdfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvKiAyMDA3LzEwLzA1IE1IIERpc2FibGUgRElHIHNjaGVtZSBub3cuIE5vdCB0ZXN0ZWQuICovCisJZG1fZGlndGFibGUuZGlnX2VuYWJsZV9mbGFnCT0gdHJ1ZTsKKwlkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtID0gRElHX0FMR09fQllfUlNTSTsKKwlkbV9kaWd0YWJsZS5kYmdfbW9kZSA9IERNX0RCR19PRkY7CS8vb2ZmPWJ5IHJlYWwgcnNzaSB2YWx1ZSwgb249YnkgRE1fRGlnVGFibGUuUnNzaV92YWwgZm9yIG5ldyBkaWcKKwlkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCA9IDA7CisKKwkvKiAyMDA3LzEwLzA0IE1IIERlZmluZSBpbml0IGdhaW4gdGhyZXNob2wuICovCisJZG1fZGlndGFibGUuZGlnX3N0YXRlCQk9IERNX1NUQV9ESUdfTUFYOworCWRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlCT0gRE1fU1RBX0RJR19NQVg7CisJZG1fZGlndGFibGUuaW5pdGlhbGdhaW5fbG93ZXJib3VuZF9zdGF0ZSA9IGZhbHNlOworCisJZG1fZGlndGFibGUucnNzaV9sb3dfdGhyZXNoIAk9IERNX0RJR19USFJFU0hfTE9XOworCWRtX2RpZ3RhYmxlLnJzc2lfaGlnaF90aHJlc2ggCT0gRE1fRElHX1RIUkVTSF9ISUdIOworCisJZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2xvd3RocmVzaCA9IERNX0RJR19ISUdIX1BXUl9USFJFU0hfTE9XOworCWRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9oaWdodGhyZXNoID0gRE1fRElHX0hJR0hfUFdSX1RIUkVTSF9ISUdIOworCisJZG1fZGlndGFibGUucnNzaV92YWwgPSA1MDsJLy9mb3IgbmV3IGRpZyBkZWJ1ZyByc3NpIHZhbHVlCisJZG1fZGlndGFibGUuYmFja29mZl92YWwgPSBETV9ESUdfQkFDS09GRjsKKwlkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21heCA9IERNX0RJR19NQVg7CisJaWYocHJpdi0+Q3VzdG9tZXJJRCA9PSBSVF9DSURfODE5eF9OZXRjb3JlKQorCQlkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21pbiA9IERNX0RJR19NSU5fTmV0Y29yZTsKKwllbHNlCisJCWRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWluID0gRE1fRElHX01JTjsKKworfQkvKiBkbV9kaWdfaW5pdCAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOglkbV9jdHJsX2luaXRnYWluX2J5cnNzaSgpCisgKgorICogT3ZlcnZpZXc6CURyaXZlciBtdXN0IG1vbml0b3IgUlNTSSBhbmQgbm90aWZ5IGZpcm13YXJlIHRvIGNoYW5nZSBpbml0aWFsCisgKgkJCQlnYWluIGFjY29yZGluZyB0byBkaWZmZXJlbnQgdGhyZXNob2xkLiBCQiB0ZWFtIHByb3ZpZGUgdGhlCisgKgkJCQlzdWdnZXN0ZWQgc29sdXRpb24uCisgKgorICogSW5wdXQ6CQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorICoKKyAqIE91dHB1dDoJCU5PTkUKKyAqCisgKiBSZXR1cm46CQlOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICoJV2hlbgkJV2hvCQlSZW1hcmsKKyAqCTA1LzI3LzIwMDgJYW15CQlDcmVhdGUgVmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBkbV9jdHJsX2luaXRnYWluX2J5cnNzaShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJaWYgKGRtX2RpZ3RhYmxlLmRpZ19lbmFibGVfZmxhZyA9PSBmYWxzZSkKKwkJcmV0dXJuOworCisJaWYoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobSA9PSBESUdfQUxHT19CWV9GQUxTRV9BTEFSTSkKKwkJZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfYnlfZndmYWxzZV9hbGFybShkZXYpOworCWVsc2UgaWYoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobSA9PSBESUdfQUxHT19CWV9SU1NJKQorCQlkbV9jdHJsX2luaXRnYWluX2J5cnNzaV9ieV9kcml2ZXJyc3NpKGRldik7CisvLwkJOworCWVsc2UKKwkJcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkIGRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpX2J5X2RyaXZlcnJzc2koCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggaTsKKwlzdGF0aWMgdTggCWZ3X2RpZz0wOworCisJaWYgKGRtX2RpZ3RhYmxlLmRpZ19lbmFibGVfZmxhZyA9PSBmYWxzZSkKKwkJcmV0dXJuOworCisJLy9EYmdQcmludCgiRGlnIGJ5IFN3IFJzc2kgXG4iKTsKKwlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCkJLy8gaWYgc3dpdGhlZCBhbGdvcml0aG0sIHdlIGhhdmUgdG8gZGlzYWJsZSBGVyBEaWcuCisJCWZ3X2RpZyA9IDA7CisJaWYoZndfZGlnIDw9IDMpCS8vIGV4ZWN1dGUgc2V2ZXJhbCB0aW1lcyB0byBtYWtlIHN1cmUgdGhlIEZXIERpZyBpcyBkaXNhYmxlZAorCXsvLyBGVyBESUcgT2ZmCisJCWZvcihpPTA7IGk8MzsgaSsrKQorCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIFVGV1AsIGJNYXNrQnl0ZTEsIDB4OCk7CS8vIE9ubHkgY2xlYXIgYnl0ZSAxIGFuZCByZXdyaXRlLgorCQlmd19kaWcrKzsKKwkJZG1fZGlndGFibGUuZGlnX3N0YXRlID0gRE1fU1RBX0RJR19PRkY7CS8vZncgZGlnIG9mZi4KKwl9CisKKwlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCisJCWRtX2RpZ3RhYmxlLmN1cl9jb25uZWN0X3N0YXRlID0gRElHX0NPTk5FQ1Q7CisJZWxzZQorCQlkbV9kaWd0YWJsZS5jdXJfY29ubmVjdF9zdGF0ZSA9IERJR19ESVNDT05ORUNUOworCisJLy9EYmdQcmludCgiRE1fRGlnVGFibGUuUHJlQ29ubmVjdFN0YXRlID0gJWQsIERNX0RpZ1RhYmxlLkN1ckNvbm5lY3RTdGF0ZSA9ICVkIFxuIiwKKwkJLy9ETV9EaWdUYWJsZS5QcmVDb25uZWN0U3RhdGUsIERNX0RpZ1RhYmxlLkN1ckNvbm5lY3RTdGF0ZSk7CisKKwlpZihkbV9kaWd0YWJsZS5kYmdfbW9kZSA9PSBETV9EQkdfT0ZGKQorCQlkbV9kaWd0YWJsZS5yc3NpX3ZhbCA9IHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGI7CisJLy9EYmdQcmludCgiRE1fRGlnVGFibGUuUnNzaV92YWwgPSAlZCBcbiIsIERNX0RpZ1RhYmxlLlJzc2lfdmFsKTsKKwlkbV9pbml0aWFsX2dhaW4oZGV2KTsKKwlkbV9wZF90aChkZXYpOworCWRtX2NzX3JhdGlvKGRldik7CisJaWYoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobV9zd2l0Y2gpCisJCWRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG1fc3dpdGNoID0gMDsKKwlkbV9kaWd0YWJsZS5wcmVfY29ubmVjdF9zdGF0ZSA9IGRtX2RpZ3RhYmxlLmN1cl9jb25uZWN0X3N0YXRlOworCit9CS8qIGRtX0N0cmxJbml0R2FpbkJ5UnNzaSAqLworCitzdGF0aWMgdm9pZCBkbV9jdHJsX2luaXRnYWluX2J5cnNzaV9ieV9md2ZhbHNlX2FsYXJtKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0YXRpYyB1MzIgcmVzZXRfY250ID0gMDsKKwl1OCBpOworCisJaWYgKGRtX2RpZ3RhYmxlLmRpZ19lbmFibGVfZmxhZyA9PSBmYWxzZSkKKwkJcmV0dXJuOworCisJaWYoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobV9zd2l0Y2gpCisJeworCQlkbV9kaWd0YWJsZS5kaWdfc3RhdGUgPSBETV9TVEFfRElHX01BWDsKKwkJLy8gRncgRElHIE9uLgorCQlmb3IoaT0wOyBpPDM7IGkrKykKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBVRldQLCBiTWFza0J5dGUxLCAweDEpOwkvLyBPbmx5IGNsZWFyIGJ5dGUgMSBhbmQgcmV3cml0ZS4KKwkJZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobV9zd2l0Y2ggPSAwOworCX0KKworCWlmIChwcml2LT5pZWVlODAyMTEtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQpCisJCXJldHVybjsKKworCS8vIEZvciBzbW9vdGgsIHdlIGNhbiBub3QgY2hhbmdlIERJRyBzdGF0ZS4KKwlpZiAoKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPiBkbV9kaWd0YWJsZS5yc3NpX2xvd190aHJlc2gpICYmCisJCShwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDwgZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCkpCisJeworCQlyZXR1cm47CisJfQorCS8vRGJnUHJpbnQoIkRpZyBieSBGdyBGYWxzZSBBbGFybVxuIik7CisJLy9pZiAoRE1fRGlnVGFibGUuRGlnX1N0YXRlID09IERNX1NUQV9ESUdfT0ZGKQorCS8qRGJnUHJpbnQoIkRJRyBDaGVja1xuXHIgUlNTST0lZCBMT1c9JWQgSElHSD0lZCBTVEFURT0lZCIsCisJcEhhbERhdGEtPlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCLCBETV9EaWdUYWJsZS5Sc3NpTG93VGhyZXNoLAorCURNX0RpZ1RhYmxlLlJzc2lIaWdoVGhyZXNoLCBETV9EaWdUYWJsZS5EaWdfU3RhdGUpOyovCisJLyogMS4gV2hlbiBSU1NJIGRlY3JlYXNlLCBXZSBoYXZlIHRvIGp1ZGdlIGlmIGl0IGlzIHNtYWxsZXIgdGhhbiBhIHRyZXNob2xkCisJCSAgYW5kIHRoZW4gZXhlY3V0ZSBiZWxvdyBzdGVwLiAqLworCWlmICgocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8PSBkbV9kaWd0YWJsZS5yc3NpX2xvd190aHJlc2gpKQorCXsKKwkJLyogMjAwOC8wMi8wNSBNSCBXaGVuIHdlIGV4ZWN1dGUgc2lsZW50IHJlc2V0LCB0aGUgRElHIFBIWSBwYXJhbWV0ZXJzCisJCSAgIHdpbGwgYmUgcmVzZXQgdG8gaW5pdCB2YWx1ZS4gV2UgbXVzdCBwcmV2ZW50IHRoZSBjb25kaXRpb24uICovCisJCWlmIChkbV9kaWd0YWJsZS5kaWdfc3RhdGUgPT0gRE1fU1RBX0RJR19PRkYgJiYKKwkJCShwcml2LT5yZXNldF9jb3VudCA9PSByZXNldF9jbnQpKQorCQl7CisJCQlyZXR1cm47CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXNldF9jbnQgPSBwcml2LT5yZXNldF9jb3VudDsKKwkJfQorCisJCS8vIElmIERJRyBpcyBvZmYsIERJRyBoaWdoIHBvd2VyIHN0YXRlIG11c3QgcmVzZXQuCisJCWRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlID0gRE1fU1RBX0RJR19NQVg7CisJCWRtX2RpZ3RhYmxlLmRpZ19zdGF0ZSA9IERNX1NUQV9ESUdfT0ZGOworCisJCS8vIDEuMSBESUcgT2ZmLgorCQlydGw4MTkyX3NldEJCcmVnKGRldiwgVUZXUCwgYk1hc2tCeXRlMSwgMHg4KTsJLy8gT25seSBjbGVhciBieXRlIDEgYW5kIHJld3JpdGUuCisKKwkJLy8gMS4yIFNldCBpbml0aWFsIGdhaW4uCisJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hBQUdDQ29yZTEsIDB4MTcpOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQkFHQ0NvcmUxLCAweDE3KTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWENBR0NDb3JlMSwgMHgxNyk7CisJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hEQUdDQ29yZTEsIDB4MTcpOworCisJCS8vIDEuMyBMb3dlciBQRF9USCBmb3IgT0ZETS4KKwkJaWYgKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgIT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkKKwkJeworCQkJLyogMjAwOC8wMS8xMSBNSCA0ME1IWiA5MC85MiByZWdpc3RlciBhcmUgbm90IHRoZSBzYW1lLiAqLworCQkJLy8gMjAwOC8wMi8wNSBNSCBTRDMtSmVycnkgOTJVLzkyRSBQRF9USCBhcmUgdGhlIHNhbWUuCisJCQkjaWZkZWYgUlRMODE5MFAKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0MCk7CisJCQkjZWxzZQorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgKHJPRkRNMF9YQVR4QUZFKzMpLCAweDAwKTsKKwkJCSNlbmRpZgorCQkJLyplbHNlIGlmIChwcml2LT5jYXJkXzgxOTIgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkwUCkKKwkJCQl3cml0ZV9uaWNfYnl0ZShwQWRhcHRlciwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQwKTsKKwkJCSovCisJCQkvL2Vsc2UgaWYgKHBBZGFwdGVyLT5IYXJkd2FyZVR5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkyRSkKKworCisJCQkvL2Vsc2UKKwkJCQkvL1BsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocEFkYXB0ZXIsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0MCk7CisJCX0KKwkJZWxzZQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDIpOworCisJCS8vIDEuNCBMb3dlciBDUyByYXRpbyBmb3IgQ0NLLgorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4YTBhLCAweDA4KTsKKworCQkvLyAxLjUgSGlnaGVyIEVEQ0NBLgorCQkvL1BsYXRmb3JtRUZJT1dyaXRlNEJ5dGUocEFkYXB0ZXIsIHJPRkRNMF9FQ0NBVGhyZXNob2xkLCAweDMyNSk7CisJCXJldHVybjsKKworCX0KKworCS8qIDIuIFdoZW4gUlNTSSBpbmNyZWFzZSwgV2UgaGF2ZSB0byBqdWRnZSBpZiBpdCBpcyBsYXJnZXIgdGhhbiBhIHRyZXNob2xkCisJCSAgYW5kIHRoZW4gZXhlY3V0ZSBiZWxvdyBzdGVwLiAgKi8KKwlpZiAoKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCkgKQorCXsKKwkJdTggcmVzZXRfZmxhZyA9IDA7CisKKwkJaWYgKGRtX2RpZ3RhYmxlLmRpZ19zdGF0ZSA9PSBETV9TVEFfRElHX09OICYmCisJCQkocHJpdi0+cmVzZXRfY291bnQgPT0gcmVzZXRfY250KSkKKwkJeworCQkJZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfaGlnaHB3cihkZXYpOworCQkJcmV0dXJuOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKHByaXYtPnJlc2V0X2NvdW50ICE9IHJlc2V0X2NudCkKKwkJCQlyZXNldF9mbGFnID0gMTsKKworCQkJcmVzZXRfY250ID0gcHJpdi0+cmVzZXRfY291bnQ7CisJCX0KKworCQlkbV9kaWd0YWJsZS5kaWdfc3RhdGUgPSBETV9TVEFfRElHX09OOworCQkvL0RiZ1ByaW50KCJESUcgT05cblxyIik7CisKKwkJLy8gMi4xIFNldCBpbml0aWFsIGdhaW4uCisJCS8vIDIwMDgvMDIvMjYgTUggU0QzLUplcnJ5IHN1Z2dlc3QgdG8gcHJldmVudCBkaXJ0eSBlbnZpcm9ubWVudC4KKwkJaWYgKHJlc2V0X2ZsYWcgPT0gMSkKKwkJeworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSwgMHgyYyk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQkFHQ0NvcmUxLCAweDJjKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hDQUdDQ29yZTEsIDB4MmMpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWERBR0NDb3JlMSwgMHgyYyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQUFHQ0NvcmUxLCAweDIwKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hCQUdDQ29yZTEsIDB4MjApOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWENBR0NDb3JlMSwgMHgyMCk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YREFHQ0NvcmUxLCAweDIwKTsKKwkJfQorCisJCS8vIDIuMiBIaWdoZXIgUERfVEggZm9yIE9GRE0uCisJCWlmIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApCisJCXsKKwkJCS8qIDIwMDgvMDEvMTEgTUggNDBNSFogOTAvOTIgcmVnaXN0ZXIgYXJlIG5vdCB0aGUgc2FtZS4gKi8KKwkJCS8vIDIwMDgvMDIvMDUgTUggU0QzLUplcnJ5IDkyVS85MkUgUERfVEggYXJlIHRoZSBzYW1lLgorCQkJI2lmZGVmIFJUTDgxOTBQCisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDIpOworCQkJI2Vsc2UKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIChyT0ZETTBfWEFUeEFGRSszKSwgMHgyMCk7CisJCQkjZW5kaWYKKwkJCS8qCisJCQllbHNlIGlmIChwcml2LT5jYXJkXzgxOTIgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkwUCkKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0Mik7CisJCQkqLworCQkJLy9lbHNlIGlmIChwQWRhcHRlci0+SGFyZHdhcmVUeXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODE5MkUpCisKKwkJCS8vZWxzZQorCQkJCS8vUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwQWRhcHRlciwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQyKTsKKwkJfQorCQllbHNlCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0NCk7CisKKwkJLy8gMi4zIEhpZ2hlciBDUyByYXRpbyBmb3IgQ0NLLgorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4YTBhLCAweGNkKTsKKworCQkvLyAyLjQgTG93ZXIgRURDQ0EuCisJCS8qIDIwMDgvMDEvMTEgTUggOTAvOTIgc2VyaWVzIGFyZSB0aGUgc2FtZS4gKi8KKwkJLy9QbGF0Zm9ybUVGSU9Xcml0ZTRCeXRlKHBBZGFwdGVyLCByT0ZETTBfRUNDQVRocmVzaG9sZCwgMHgzNDYpOworCisJCS8vIDIuNSBESUcgT24uCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBVRldQLCBiTWFza0J5dGUxLCAweDEpOwkvLyBPbmx5IGNsZWFyIGJ5dGUgMSBhbmQgcmV3cml0ZS4KKworCX0KKworCWRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpX2hpZ2hwd3IoZGV2KTsKKworfQkvKiBkbV9DdHJsSW5pdEdhaW5CeVJzc2kgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjoJZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfaGlnaHB3cigpCisgKgorICogT3ZlcnZpZXc6CisgKgorICogSW5wdXQ6CQlOT05FCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCU5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDUvMjgvMjAwOAlhbXkJCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBkbV9jdHJsX2luaXRnYWluX2J5cnNzaV9oaWdocHdyKAorCXN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdGF0aWMgdTMyIHJlc2V0X2NudF9oaWdocHdyID0gMDsKKworCS8vIEZvciBzbW9vdGgsIHdlIGNhbiBub3QgY2hhbmdlIGhpZ2ggcG93ZXIgRElHIHN0YXRlIGluIHRoZSByYW5nZS4KKwlpZiAoKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPiBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfcG93ZXJfbG93dGhyZXNoKSAmJgorCQkocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9oaWdodGhyZXNoKSkKKwl7CisJCXJldHVybjsKKwl9CisKKwkvKiAzLiBXaGVuIFJTU0kgPjc1JSBvciA8NzAlLCBpdCBpcyBhIGhpZ2ggcG93ZXIgaXNzdWUuIFdlIGhhdmUgdG8ganVkZ2UgaWYKKwkJICBpdCBpcyBsYXJnZXIgdGhhbiBhIHRyZXNob2xkIGFuZCB0aGVuIGV4ZWN1dGUgYmVsb3cgc3RlcC4gICovCisJLy8gMjAwOC8wMi8wNSBNSCBTRDMtSmVycnkgTW9kaWZ5IFBEX1RIIGZvciBoaWdoIHBvd2VyIGlzc3VlLgorCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9oaWdodGhyZXNoKQorCXsKKwkJaWYgKGRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlID09IERNX1NUQV9ESUdfT04gJiYKKwkJCShwcml2LT5yZXNldF9jb3VudCA9PSByZXNldF9jbnRfaGlnaHB3cikpCisJCQlyZXR1cm47CisJCWVsc2UKKwkJCWRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlID0gRE1fU1RBX0RJR19PTjsKKworCQkvLyAzLjEgSGlnaGVyIFBEX1RIIGZvciBPRkRNIGZvciBoaWdoIHBvd2VyIHN0YXRlLgorCQlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKQorCQl7CisJCQkjaWZkZWYgUlRMODE5MFAKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0MSk7CisJCQkjZWxzZQorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgKHJPRkRNMF9YQVR4QUZFKzMpLCAweDEwKTsKKwkJCSNlbmRpZgorCisJCQkvKmVsc2UgaWYgKHByaXYtPmNhcmRfODE5MiA9PSBIQVJEV0FSRV9UWVBFX1JUTDgxOTBQKQorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQxKTsKKwkJCSovCisKKwkJfQorCQllbHNlCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0Myk7CisJfQorCWVsc2UKKwl7CisJCWlmIChkbV9kaWd0YWJsZS5kaWdfaGlnaHB3cl9zdGF0ZSA9PSBETV9TVEFfRElHX09GRiYmCisJCQkocHJpdi0+cmVzZXRfY291bnQgPT0gcmVzZXRfY250X2hpZ2hwd3IpKQorCQkJcmV0dXJuOworCQllbHNlCisJCQlkbV9kaWd0YWJsZS5kaWdfaGlnaHB3cl9zdGF0ZSA9IERNX1NUQV9ESUdfT0ZGOworCisJCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDwgZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2xvd3RocmVzaCAmJgorCQkJIHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCkKKwkJeworCQkJLy8gMy4yIFJlY292ZXIgUERfVEggZm9yIE9GRE0gZm9yIG5vcm1hbCBwb3dlciByZWdpb24uCisJCQlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKQorCQkJeworCQkJCSNpZmRlZiBSVEw4MTkwUAorCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0Mik7CisJCQkJI2Vsc2UKKwkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAock9GRE0wX1hBVHhBRkUrMyksIDB4MjApOworCQkJCSNlbmRpZgorCQkJCS8qZWxzZSBpZiAocHJpdi0+Y2FyZF84MTkyID09IEhBUkRXQVJFX1RZUEVfUlRMODE5MFApCisJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQyKTsKKwkJCQkqLworCisJCQl9CisJCQllbHNlCisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDQpOworCQl9CisJfQorCisJcmVzZXRfY250X2hpZ2hwd3IgPSBwcml2LT5yZXNldF9jb3VudDsKKworfQkvKiBkbV9DdHJsSW5pdEdhaW5CeVJzc2lIaWdoUHdyICovCisKKworc3RhdGljIHZvaWQgZG1faW5pdGlhbF9nYWluKAorCXN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OAkJCQkJaW5pdGlhbF9nYWluPTA7CisJc3RhdGljIHU4CQkJCWluaXRpYWxpemVkPTAsIGZvcmNlX3dyaXRlPTA7CisJc3RhdGljIHUzMgkJCXJlc2V0X2NudD0wOworCisJaWYoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobV9zd2l0Y2gpCisJeworCQlpbml0aWFsaXplZCA9IDA7CisJCXJlc2V0X2NudCA9IDA7CisJfQorCisJaWYoZG1fZGlndGFibGUucHJlX2Nvbm5lY3Rfc3RhdGUgPT0gZG1fZGlndGFibGUuY3VyX2Nvbm5lY3Rfc3RhdGUpCisJeworCQlpZihkbV9kaWd0YWJsZS5jdXJfY29ubmVjdF9zdGF0ZSA9PSBESUdfQ09OTkVDVCkKKwkJeworCQkJaWYoKGRtX2RpZ3RhYmxlLnJzc2lfdmFsKzEwLWRtX2RpZ3RhYmxlLmJhY2tvZmZfdmFsKSA+IGRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWF4KQorCQkJCWRtX2RpZ3RhYmxlLmN1cl9pZ192YWx1ZSA9IGRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWF4OworCQkJZWxzZSBpZigoZG1fZGlndGFibGUucnNzaV92YWwrMTAtZG1fZGlndGFibGUuYmFja29mZl92YWwpIDwgZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9taW4pCisJCQkJZG1fZGlndGFibGUuY3VyX2lnX3ZhbHVlID0gZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9taW47CisJCQllbHNlCisJCQkJZG1fZGlndGFibGUuY3VyX2lnX3ZhbHVlID0gZG1fZGlndGFibGUucnNzaV92YWwrMTAtZG1fZGlndGFibGUuYmFja29mZl92YWw7CisJCX0KKwkJZWxzZQkJLy9jdXJyZW50IHN0YXRlIGlzIGRpc2Nvbm5lY3RlZAorCQl7CisJCQlpZihkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWUgPT0gMCkKKwkJCQlkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWUgPSBwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMF07CisJCQllbHNlCisJCQkJZG1fZGlndGFibGUuY3VyX2lnX3ZhbHVlID0gZG1fZGlndGFibGUucHJlX2lnX3ZhbHVlOworCQl9CisJfQorCWVsc2UJLy8gZGlzY29ubmVjdGVkIC0+IGNvbm5lY3RlZCBvciBjb25uZWN0ZWQgLT4gZGlzY29ubmVjdGVkCisJeworCQlkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWUgPSBwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMF07CisJCWRtX2RpZ3RhYmxlLnByZV9pZ192YWx1ZSA9IDA7CisJfQorCS8vRGJnUHJpbnQoIkRNX0RpZ1RhYmxlLkN1cklHVmFsdWUgPSAweCV4LCBETV9EaWdUYWJsZS5QcmVJR1ZhbHVlID0gMHgleFxuIiwgRE1fRGlnVGFibGUuQ3VySUdWYWx1ZSwgRE1fRGlnVGFibGUuUHJlSUdWYWx1ZSk7CisKKwkvLyBpZiBzaWxlbnQgcmVzZXQgaGFwcGVuZWQsIHdlIHNob3VsZCByZXdyaXRlIHRoZSB2YWx1ZXMgYmFjaworCWlmKHByaXYtPnJlc2V0X2NvdW50ICE9IHJlc2V0X2NudCkKKwl7CisJCWZvcmNlX3dyaXRlID0gMTsKKwkJcmVzZXRfY250ID0gcHJpdi0+cmVzZXRfY291bnQ7CisJfQorCisJaWYoZG1fZGlndGFibGUucHJlX2lnX3ZhbHVlICE9IHJlYWRfbmljX2J5dGUoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSkpCisJCWZvcmNlX3dyaXRlID0gMTsKKworCXsKKwkJaWYoKGRtX2RpZ3RhYmxlLnByZV9pZ192YWx1ZSAhPSBkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWUpCisJCQl8fCAhaW5pdGlhbGl6ZWQgfHwgZm9yY2Vfd3JpdGUpCisJCXsKKwkJCWluaXRpYWxfZ2FpbiA9ICh1OClkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWU7CisJCQkvL0RiZ1ByaW50KCJXcml0ZSBpbml0aWFsIGdhaW4gPSAweCV4XG4iLCBpbml0aWFsX2dhaW4pOworCQkJLy8gU2V0IGluaXRpYWwgZ2Fpbi4KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hBQUdDQ29yZTEsIGluaXRpYWxfZ2Fpbik7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQkFHQ0NvcmUxLCBpbml0aWFsX2dhaW4pOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWENBR0NDb3JlMSwgaW5pdGlhbF9nYWluKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hEQUdDQ29yZTEsIGluaXRpYWxfZ2Fpbik7CisJCQlkbV9kaWd0YWJsZS5wcmVfaWdfdmFsdWUgPSBkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWU7CisJCQlpbml0aWFsaXplZCA9IDE7CisJCQlmb3JjZV93cml0ZSA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRtX3BkX3RoKAorCXN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdGF0aWMgdTgJCQkJaW5pdGlhbGl6ZWQ9MCwgZm9yY2Vfd3JpdGU9MDsKKwlzdGF0aWMgdTMyCQkJcmVzZXRfY250ID0gMDsKKworCWlmKGRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG1fc3dpdGNoKQorCXsKKwkJaW5pdGlhbGl6ZWQgPSAwOworCQlyZXNldF9jbnQgPSAwOworCX0KKworCWlmKGRtX2RpZ3RhYmxlLnByZV9jb25uZWN0X3N0YXRlID09IGRtX2RpZ3RhYmxlLmN1cl9jb25uZWN0X3N0YXRlKQorCXsKKwkJaWYoZG1fZGlndGFibGUuY3VyX2Nvbm5lY3Rfc3RhdGUgPT0gRElHX0NPTk5FQ1QpCisJCXsKKwkJCWlmIChkbV9kaWd0YWJsZS5yc3NpX3ZhbCA+PSBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfcG93ZXJfaGlnaHRocmVzaCkKKwkJCQlkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID0gRElHX1BEX0FUX0hJR0hfUE9XRVI7CisJCQllbHNlIGlmICgoZG1fZGlndGFibGUucnNzaV92YWwgPD0gZG1fZGlndGFibGUucnNzaV9sb3dfdGhyZXNoKSkKKwkJCQlkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID0gRElHX1BEX0FUX0xPV19QT1dFUjsKKwkJCWVsc2UgaWYgKChkbV9kaWd0YWJsZS5yc3NpX3ZhbCA+PSBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfdGhyZXNoKSAmJgorCQkJCQkoZG1fZGlndGFibGUucnNzaV92YWwgPCBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfcG93ZXJfbG93dGhyZXNoKSkKKwkJCQlkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID0gRElHX1BEX0FUX05PUk1BTF9QT1dFUjsKKwkJCWVsc2UKKwkJCQlkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID0gZG1fZGlndGFibGUucHJlcGRfdGhzdGF0ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWRtX2RpZ3RhYmxlLmN1cnBkX3Roc3RhdGUgPSBESUdfUERfQVRfTE9XX1BPV0VSOworCQl9CisJfQorCWVsc2UJLy8gZGlzY29ubmVjdGVkIC0+IGNvbm5lY3RlZCBvciBjb25uZWN0ZWQgLT4gZGlzY29ubmVjdGVkCisJeworCQlkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID0gRElHX1BEX0FUX0xPV19QT1dFUjsKKwl9CisKKwkvLyBpZiBzaWxlbnQgcmVzZXQgaGFwcGVuZWQsIHdlIHNob3VsZCByZXdyaXRlIHRoZSB2YWx1ZXMgYmFjaworCWlmKHByaXYtPnJlc2V0X2NvdW50ICE9IHJlc2V0X2NudCkKKwl7CisJCWZvcmNlX3dyaXRlID0gMTsKKwkJcmVzZXRfY250ID0gcHJpdi0+cmVzZXRfY291bnQ7CisJfQorCisJeworCQlpZigoZG1fZGlndGFibGUucHJlcGRfdGhzdGF0ZSAhPSBkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlKSB8fAorCQkJKGluaXRpYWxpemVkPD0zKSB8fCBmb3JjZV93cml0ZSkKKwkJeworCQkJLy9EYmdQcmludCgiV3JpdGUgUERfVEggc3RhdGUgPSAlZFxuIiwgRE1fRGlnVGFibGUuQ3VyUERfVEhTdGF0ZSk7CisJCQlpZihkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID09IERJR19QRF9BVF9MT1dfUE9XRVIpCisJCQl7CisJCQkJLy8gTG93ZXIgUERfVEggZm9yIE9GRE0uCisJCQkJaWYgKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgIT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkKKwkJCQl7CisJCQkJCS8qIDIwMDgvMDEvMTEgTUggNDBNSFogOTAvOTIgcmVnaXN0ZXIgYXJlIG5vdCB0aGUgc2FtZS4gKi8KKwkJCQkJLy8gMjAwOC8wMi8wNSBNSCBTRDMtSmVycnkgOTJVLzkyRSBQRF9USCBhcmUgdGhlIHNhbWUuCisJCQkJCSNpZmRlZiBSVEw4MTkwUAorCQkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDApOworCQkJCQkjZWxzZQorCQkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAock9GRE0wX1hBVHhBRkUrMyksIDB4MDApOworCQkJCQkjZW5kaWYKKwkJCQkJLyplbHNlIGlmIChwcml2LT5jYXJkXzgxOTIgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkwUCkKKwkJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQwKTsKKwkJCQkJKi8KKwkJCQl9CisJCQkJZWxzZQorCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0Mik7CisJCQl9CisJCQllbHNlIGlmKGRtX2RpZ3RhYmxlLmN1cnBkX3Roc3RhdGUgPT0gRElHX1BEX0FUX05PUk1BTF9QT1dFUikKKwkJCXsKKwkJCQkvLyBIaWdoZXIgUERfVEggZm9yIE9GRE0uCisJCQkJaWYgKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgIT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkKKwkJCQl7CisJCQkJCS8qIDIwMDgvMDEvMTEgTUggNDBNSFogOTAvOTIgcmVnaXN0ZXIgYXJlIG5vdCB0aGUgc2FtZS4gKi8KKwkJCQkJLy8gMjAwOC8wMi8wNSBNSCBTRDMtSmVycnkgOTJVLzkyRSBQRF9USCBhcmUgdGhlIHNhbWUuCisJCQkJCSNpZmRlZiBSVEw4MTkwUAorCQkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDIpOworCQkJCQkjZWxzZQorCQkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAock9GRE0wX1hBVHhBRkUrMyksIDB4MjApOworCQkJCQkjZW5kaWYKKwkJCQkJLyplbHNlIGlmIChwcml2LT5jYXJkXzgxOTIgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkwUCkKKwkJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQyKTsKKwkJCQkJKi8KKwkJCQl9CisJCQkJZWxzZQorCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0NCk7CisJCQl9CisJCQllbHNlIGlmKGRtX2RpZ3RhYmxlLmN1cnBkX3Roc3RhdGUgPT0gRElHX1BEX0FUX0hJR0hfUE9XRVIpCisJCQl7CisJCQkJLy8gSGlnaGVyIFBEX1RIIGZvciBPRkRNIGZvciBoaWdoIHBvd2VyIHN0YXRlLgorCQkJCWlmIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApCisJCQkJeworCQkJCQkjaWZkZWYgUlRMODE5MFAKKwkJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQxKTsKKwkJCQkJI2Vsc2UKKwkJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgKHJPRkRNMF9YQVR4QUZFKzMpLCAweDEwKTsKKwkJCQkJI2VuZGlmCisJCQkJCS8qZWxzZSBpZiAocHJpdi0+Y2FyZF84MTkyID09IEhBUkRXQVJFX1RZUEVfUlRMODE5MFApCisJCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0MSk7CisJCQkJCSovCisJCQkJfQorCQkJCWVsc2UKKwkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDMpOworCQkJfQorCQkJZG1fZGlndGFibGUucHJlcGRfdGhzdGF0ZSA9IGRtX2RpZ3RhYmxlLmN1cnBkX3Roc3RhdGU7CisJCQlpZihpbml0aWFsaXplZCA8PSAzKQorCQkJCWluaXRpYWxpemVkKys7CisJCQlmb3JjZV93cml0ZSA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYwl2b2lkIGRtX2NzX3JhdGlvKAorCXN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdGF0aWMgdTgJCQkJaW5pdGlhbGl6ZWQ9MCxmb3JjZV93cml0ZT0wOworCXN0YXRpYyB1MzIJCQlyZXNldF9jbnQgPSAwOworCisJaWYoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobV9zd2l0Y2gpCisJeworCQlpbml0aWFsaXplZCA9IDA7CisJCXJlc2V0X2NudCA9IDA7CisJfQorCisJaWYoZG1fZGlndGFibGUucHJlX2Nvbm5lY3Rfc3RhdGUgPT0gZG1fZGlndGFibGUuY3VyX2Nvbm5lY3Rfc3RhdGUpCisJeworCQlpZihkbV9kaWd0YWJsZS5jdXJfY29ubmVjdF9zdGF0ZSA9PSBESUdfQ09OTkVDVCkKKwkJeworCQkJaWYgKChkbV9kaWd0YWJsZS5yc3NpX3ZhbCA8PSBkbV9kaWd0YWJsZS5yc3NpX2xvd190aHJlc2gpKQorCQkJCWRtX2RpZ3RhYmxlLmN1cmNzX3JhdGlvX3N0YXRlID0gRElHX0NTX1JBVElPX0xPV0VSOworCQkJZWxzZSBpZiAoKGRtX2RpZ3RhYmxlLnJzc2lfdmFsID49IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF90aHJlc2gpICkKKwkJCQlkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSA9IERJR19DU19SQVRJT19ISUdIRVI7CisJCQllbHNlCisJCQkJZG1fZGlndGFibGUuY3VyY3NfcmF0aW9fc3RhdGUgPSBkbV9kaWd0YWJsZS5wcmVjc19yYXRpb19zdGF0ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWRtX2RpZ3RhYmxlLmN1cmNzX3JhdGlvX3N0YXRlID0gRElHX0NTX1JBVElPX0xPV0VSOworCQl9CisJfQorCWVsc2UJLy8gZGlzY29ubmVjdGVkIC0+IGNvbm5lY3RlZCBvciBjb25uZWN0ZWQgLT4gZGlzY29ubmVjdGVkCisJeworCQlkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSA9IERJR19DU19SQVRJT19MT1dFUjsKKwl9CisKKwkvLyBpZiBzaWxlbnQgcmVzZXQgaGFwcGVuZWQsIHdlIHNob3VsZCByZXdyaXRlIHRoZSB2YWx1ZXMgYmFjaworCWlmKHByaXYtPnJlc2V0X2NvdW50ICE9IHJlc2V0X2NudCkKKwl7CisJCWZvcmNlX3dyaXRlID0gMTsKKwkJcmVzZXRfY250ID0gcHJpdi0+cmVzZXRfY291bnQ7CisJfQorCisKKwl7CisJCWlmKChkbV9kaWd0YWJsZS5wcmVjc19yYXRpb19zdGF0ZSAhPSBkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSkgfHwKKwkJCSFpbml0aWFsaXplZCB8fCBmb3JjZV93cml0ZSkKKwkJeworCQkJLy9EYmdQcmludCgiV3JpdGUgQ1NfcmF0aW8gc3RhdGUgPSAlZFxuIiwgRE1fRGlnVGFibGUuQ3VyQ1NfcmF0aW9TdGF0ZSk7CisJCQlpZihkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSA9PSBESUdfQ1NfUkFUSU9fTE9XRVIpCisJCQl7CisJCQkJLy8gTG93ZXIgQ1MgcmF0aW8gZm9yIENDSy4KKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4YTBhLCAweDA4KTsKKwkJCX0KKwkJCWVsc2UgaWYoZG1fZGlndGFibGUuY3VyY3NfcmF0aW9fc3RhdGUgPT0gRElHX0NTX1JBVElPX0hJR0hFUikKKwkJCXsKKwkJCQkvLyBIaWdoZXIgQ1MgcmF0aW8gZm9yIENDSy4KKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4YTBhLCAweGNkKTsKKwkJCX0KKwkJCWRtX2RpZ3RhYmxlLnByZWNzX3JhdGlvX3N0YXRlID0gZG1fZGlndGFibGUuY3VyY3NfcmF0aW9fc3RhdGU7CisJCQlpbml0aWFsaXplZCA9IDE7CisJCQlmb3JjZV93cml0ZSA9IDA7CisJCX0KKwl9Cit9CisKK2V4dGVybiB2b2lkIGRtX2luaXRfZWRjYV90dXJibyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlwcml2LT5iY3VycmVudF90dXJib19FRENBID0gZmFsc2U7CisJcHJpdi0+aWVlZTgwMjExLT5iaXNfYW55X25vbmJlcGt0cyA9IGZhbHNlOworCXByaXYtPmJpc19jdXJfcmRsc3RhdGUgPSBmYWxzZTsKK30JLy8gZG1faW5pdF9lZGNhX3R1cmJvCisKK3N0YXRpYyB2b2lkIGRtX2NoZWNrX2VkY2FfdHVyYm8oCisJc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IHByaXYtPmllZWU4MDIxMS0+cEhUSW5mbzsKKwkvL1BTVEFfUU9TCQkJcFN0YVFvcyA9IHBNZ250SW5mby0+cFN0YVFvczsKKworCS8vIEtlZXAgcGFzdCBUeC9SeCBwYWNrZXQgY291bnQgZm9yIFJULXRvLVJUIEVEQ0EgdHVyYm8uCisJc3RhdGljIHVuc2lnbmVkIGxvbmcJCQlsYXN0VHhPa0NudCA9IDA7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcJCQlsYXN0UnhPa0NudCA9IDA7CisJdW5zaWduZWQgbG9uZwkJCQljdXJUeE9rQ250ID0gMDsKKwl1bnNpZ25lZCBsb25nCQkJCWN1clJ4T2tDbnQgPSAwOworCisJLy8KKwkvLyBEbyBub3QgYmUgVHVyYm8gaWYgaXQncyB1bmRlciBXaUZpIGNvbmZpZyBhbmQgUW9zIEVuYWJsZWQsIGJlY2F1c2UgdGhlIEVEQ0EgcGFyYW1ldGVycworCS8vIHNob3VsZCBmb2xsb3cgdGhlIHNldHRpbmdzIGZyb20gUUFQLiBCeSBCcnVjZSwgMjAwNy0xMi0wNy4KKwkvLworCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkKKwkJZ290byBkbV9DaGVja0VkY2FUdXJib19FWElUOworCS8vIFdlIGRvIG5vdCB0dXJuIG9uIEVEQ0EgdHVyYm8gbW9kZSBmb3Igc29tZSBBUCB0aGF0IGhhcyBJT1QgaXNzdWUKKwlpZihwcml2LT5pZWVlODAyMTEtPnBIVEluZm8tPklPVEFjdGlvbiAmIEhUX0lPVF9BQ1RfRElTQUJMRV9FRENBX1RVUkJPKQorCQlnb3RvIGRtX0NoZWNrRWRjYVR1cmJvX0VYSVQ7CisKKy8vCXByaW50aygiPT09PT09PT0+JXMoKTpiaXNfYW55X25vbmJlcGt0cyBpcyAlZFxuIixfX0ZVTkNUSU9OX18scHJpdi0+YmlzX2FueV9ub25iZXBrdHMpOworCS8vIENoZWNrIHRoZSBzdGF0dXMgZm9yIGN1cnJlbnQgY29uZGl0aW9uLgorCWlmKCFwcml2LT5pZWVlODAyMTEtPmJpc19hbnlfbm9uYmVwa3RzKQorCXsKKwkJY3VyVHhPa0NudCA9IHByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0IC0gbGFzdFR4T2tDbnQ7CisJCWN1clJ4T2tDbnQgPSBwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdCAtIGxhc3RSeE9rQ250OworCQkvLyBGb3IgUlQtQVAsIHdlIG5lZWRzIHRvIHR1cm4gaXQgb24gd2hlbiBSeD5UeAorCQlpZihjdXJSeE9rQ250ID4gNCpjdXJUeE9rQ250KQorCQl7CisJCQkvL3ByaW50aygiJXMoKTpjdXJSeE9rQ250ID4gNCpjdXJUeE9rQ250XG4iKTsKKwkJCWlmKCFwcml2LT5iaXNfY3VyX3JkbHN0YXRlIHx8ICFwcml2LT5iY3VycmVudF90dXJib19FRENBKQorCQkJeworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEVEQ0FQQVJBX0JFLCBlZGNhX3NldHRpbmdfRExbcEhUSW5mby0+SU9UUGVlcl0pOworCQkJCXByaXYtPmJpc19jdXJfcmRsc3RhdGUgPSB0cnVlOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCisJCQkvL3ByaW50aygiJXMoKTpjdXJSeE9rQ250IDwgNCpjdXJUeE9rQ250XG4iKTsKKwkJCWlmKHByaXYtPmJpc19jdXJfcmRsc3RhdGUgfHwgIXByaXYtPmJjdXJyZW50X3R1cmJvX0VEQ0EpCisJCQl7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgRURDQVBBUkFfQkUsIGVkY2Ffc2V0dGluZ19VTFtwSFRJbmZvLT5JT1RQZWVyXSk7CisJCQkJcHJpdi0+YmlzX2N1cl9yZGxzdGF0ZSA9IGZhbHNlOworCQkJfQorCisJCX0KKworCQlwcml2LT5iY3VycmVudF90dXJib19FRENBID0gdHJ1ZTsKKwl9CisJZWxzZQorCXsKKwkJLy8KKwkJLy8gVHVybiBPZmYgRURDQSB0dXJibyBoZXJlLgorCQkvLyBSZXN0b3JlIG9yaWdpbmFsIEVEQ0EgYWNjb3JkaW5nIHRvIHRoZSBkZWNsYXJhdGlvbiBvZiBBUC4KKwkJLy8KKwkJIGlmKHByaXYtPmJjdXJyZW50X3R1cmJvX0VEQ0EpCisJCXsKKworCQkJeworCQkJCXU4CQl1MWJBSUZTOworCQkJCXUzMgkJdTRiQWNQYXJhbTsKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJzICpxb3NfcGFyYW1ldGVycyA9ICZwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5wYXJhbWV0ZXJzOworCQkJCXU4IG1vZGUgPSBwcml2LT5pZWVlODAyMTEtPm1vZGU7CisKKwkJCS8vIEZvciBFYWNoIHRpbWUgdXBkYXRpbmcgRURDQSBwYXJhbWV0ZXIsIHJlc2V0IEVEQ0EgdHVyYm8gbW9kZSBzdGF0dXMuCisJCQkJZG1faW5pdF9lZGNhX3R1cmJvKGRldik7CisJCQkJdTFiQUlGUyA9IHFvc19wYXJhbWV0ZXJzLT5haWZzWzBdICogKChtb2RlJihJRUVFX0d8SUVFRV9OXzI0RykpID85OjIwKSArIGFTaWZzVGltZTsKKwkJCQl1NGJBY1BhcmFtID0gKCgoKHUzMikocW9zX3BhcmFtZXRlcnMtPnR4X29wX2xpbWl0WzBdKSk8PCBBQ19QQVJBTV9UWE9QX0xJTUlUX09GRlNFVCl8CisJCQkJCSgoKHUzMikocW9zX3BhcmFtZXRlcnMtPmN3X21heFswXSkpPDwgQUNfUEFSQU1fRUNXX01BWF9PRkZTRVQpfAorCQkJCQkoKCh1MzIpKHFvc19wYXJhbWV0ZXJzLT5jd19taW5bMF0pKTw8IEFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUKXwKKwkJCQkJKCh1MzIpdTFiQUlGUyA8PCBBQ19QQVJBTV9BSUZTX09GRlNFVCkpOworCQkJLy93cml0ZV9uaWNfZHdvcmQoZGV2LCBXRENBUEFSQV9BRERbaV0sIHU0YkFjUGFyYW0pOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEVEQ0FQQVJBX0JFLCAgdTRiQWNQYXJhbSk7CisKKwkJCS8vIENoZWNrIEFDTSBiaXQuCisJCQkvLyBJZiBpdCBpcyBzZXQsIGltbWVkaWF0ZWx5IHNldCBBQ00gY29udHJvbCBiaXQgdG8gZG93bmdyYWRpbmcgQUMgZm9yIHBhc3NpbmcgV01NIHRlc3RwbGFuLiBBbm5pZSwgMjAwNS0xMi0xMy4KKwkJCQl7CisJCQkvLyBUT0RPOiAgTW9kaWZpZWQgdGhpcyBwYXJ0IGFuZCB0cnkgdG8gc2V0IGFjbSBjb250cm9sIGluIG9ubHkgMSBJTyBwcm9jZXNzaW5nISEKKworCQkJCQlQQUNJX0FJRlNOCXBBY2lBaWZzbiA9IChQQUNJX0FJRlNOKSYocW9zX3BhcmFtZXRlcnMtPmFpZnNbMF0pOworCQkJCQl1OAkJQWNtQ3RybCA9IHJlYWRfbmljX2J5dGUoIGRldiwgQWNtSHdDdHJsICk7CisJCQkJCWlmKCBwQWNpQWlmc24tPmYuQUNNICkKKwkJCQkJeyAvLyBBQ00gYml0IGlzIDEuCisJCQkJCQlBY21DdHJsIHw9IEFjbUh3X0JlcUVuOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeyAvLyBBQ00gYml0IGlzIDAuCisJCQkJCQlBY21DdHJsICY9ICh+QWNtSHdfQmVxRW4pOworCQkJCQl9CisKKwkJCQkJUlRfVFJBQ0UoIENPTVBfUU9TLCJTZXRId1JlZzgxOTBwY2koKTogW0hXX1ZBUl9BQ01fQ1RSTF0gV3JpdGUgMHglWFxuIiwgQWNtQ3RybCApIDsKKwkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBBY21Id0N0cmwsIEFjbUN0cmwgKTsKKwkJCQl9CisJCQl9CisJCQlwcml2LT5iY3VycmVudF90dXJib19FRENBID0gZmFsc2U7CisJCX0KKwl9CisKKworZG1fQ2hlY2tFZGNhVHVyYm9fRVhJVDoKKwkvLyBTZXQgdmFyaWFibGVzIGZvciBuZXh0IHRpbWUuCisJcHJpdi0+aWVlZTgwMjExLT5iaXNfYW55X25vbmJlcGt0cyA9IGZhbHNlOworCWxhc3RUeE9rQ250ID0gcHJpdi0+c3RhdHMudHhieXRlc3VuaWNhc3Q7CisJbGFzdFJ4T2tDbnQgPSBwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdDsKK30JLy8gZG1fQ2hlY2tFZGNhVHVyYm8KKworZXh0ZXJuIHZvaWQgRE1fQ1RTVG9TZWxmU2V0dGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldix1MzIgRE1fVHlwZSwgdTMyIERNX1ZhbHVlKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2KTsKKworCWlmIChETV9UeXBlID09IDApCS8vIENUUyB0byBzZWxmIGRpc2FibGUvZW5hYmxlCisJeworCQlpZihETV9WYWx1ZSA+IDEpCisJCQlETV9WYWx1ZSA9IDE7CisJCXByaXYtPmllZWU4MDIxMS0+YkNUU1RvU2VsZkVuYWJsZSA9IChib29sKURNX1ZhbHVlOworCQkvL0RiZ1ByaW50KCJwTWdudEluZm8tPmJDVFNUb1NlbGZFbmFibGUgPSAlZFxuIiwgcE1nbnRJbmZvLT5iQ1RTVG9TZWxmRW5hYmxlKTsKKwl9CisJZWxzZSBpZihETV9UeXBlID09IDEpIC8vQ1RTIHRvIHNlbGYgVGgKKwl7CisJCWlmKERNX1ZhbHVlID49IDUwKQorCQkJRE1fVmFsdWUgPSA1MDsKKwkJcHJpdi0+aWVlZTgwMjExLT5DVFNUb1NlbGZUSCA9ICh1OClETV9WYWx1ZTsKKwkJLy9EYmdQcmludCgicE1nbnRJbmZvLT5DVFNUb1NlbGZUSCA9ICVkXG4iLCBwTWdudEluZm8tPkNUU1RvU2VsZlRIKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRtX2luaXRfY3RzdG9zZWxmKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2KTsKKworCXByaXYtPmllZWU4MDIxMS0+YkNUU1RvU2VsZkVuYWJsZSA9IFRSVUU7CisJcHJpdi0+aWVlZTgwMjExLT5DVFNUb1NlbGZUSCA9IENUU1RvU2VsZlRIVmFsOworfQorCitzdGF0aWMgdm9pZCBkbV9jdHN0b3NlbGYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldik7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gcHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvOworCXN0YXRpYyB1bnNpZ25lZCBsb25nCQkJCWxhc3RUeE9rQ250ID0gMDsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZwkJCQlsYXN0UnhPa0NudCA9IDA7CisJdW5zaWduZWQgbG9uZwkJCQkJCWN1clR4T2tDbnQgPSAwOworCXVuc2lnbmVkIGxvbmcJCQkJCQljdXJSeE9rQ250ID0gMDsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+YkNUU1RvU2VsZkVuYWJsZSAhPSBUUlVFKQorCXsKKwkJcEhUSW5mby0+SU9UQWN0aW9uICY9IH5IVF9JT1RfQUNUX0ZPUkNFRF9DVFMyU0VMRjsKKwkJcmV0dXJuOworCX0KKwkvKgorCTEuIFVwbGluaworCTIuIExpbmtzeXMzNTAvTGlua3N5czMwME4KKwkzLiA8NTAgZGlzYWJsZSwgPjU1IGVuYWJsZQorCSovCisKKwlpZihwSFRJbmZvLT5JT1RQZWVyID09IEhUX0lPVF9QRUVSX0JST0FEQ09NKQorCXsKKwkJY3VyVHhPa0NudCA9IHByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0IC0gbGFzdFR4T2tDbnQ7CisJCWN1clJ4T2tDbnQgPSBwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdCAtIGxhc3RSeE9rQ250OworCQlpZihjdXJSeE9rQ250ID4gNCpjdXJUeE9rQ250KQkvL2Rvd25saW5rLCBkaXNhYmxlIENUUyB0byBzZWxmCisJCXsKKwkJCXBIVEluZm8tPklPVEFjdGlvbiAmPSB+SFRfSU9UX0FDVF9GT1JDRURfQ1RTMlNFTEY7CisJCQkvL0RiZ1ByaW50KCJkbV9DVFNUb1NlbGYoKSA9PT4gQ1RTIHRvIHNlbGYgZGlzYWJsZWQgLS0gZG93bmxpbmtcbiIpOworCQl9CisJCWVsc2UJLy91cGxpbmsKKwkJeworCQkJcEhUSW5mby0+SU9UQWN0aW9uIHw9IEhUX0lPVF9BQ1RfRk9SQ0VEX0NUUzJTRUxGOworCQl9CisKKwkJbGFzdFR4T2tDbnQgPSBwcml2LT5zdGF0cy50eGJ5dGVzdW5pY2FzdDsKKwkJbGFzdFJ4T2tDbnQgPSBwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdDsKKwl9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CWRtX2NoZWNrX3JmY3RybF9ncGlvKCkKKyAqCisgKiBPdmVydmlldzoJQ29weSA4MTg3QiB0ZW1wbGF0ZSBmb3IgOXhzZXJpZXMuCisgKgorICogSW5wdXQ6CQlOT05FCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCU5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDUvMjgvMjAwOAlhbXkJCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBkbV9jaGVja19yZmN0cmxfZ3BpbyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwkvL3N0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCS8vIFdhbGsgYXJvdW5kIGZvciBEVE0gdGVzdCwgd2Ugd2lsbCBub3QgZW5hYmxlIEhXIC0gcmFkaW8gb24vb2ZmIGJlY2F1c2Ugci93CisJLy8gcGFnZSAxIHJlZ2lzdGVyIGJlZm9yZSBMZXh0cmEgYnVzIGlzIGVuYWJsZWQgY2F1c2Ugc3lzdGVtIGZhaWxzIHdoZW4gcmVzdW1pbmcKKwkvLyBmcm9tIFM0LiAyMDA4MDIxOCwgRW1pbHkKKworCS8vIFN0b3AgdG8gZXhlY3V0ZSB3b3JraXRlbSB0byBwcmV2ZW50IFMzL1M0IGJ1Zy4KKyNpZmRlZiBSVEw4MTkwUAorCXJldHVybjsKKyNlbmRpZgorI2lmZGVmIFJUTDgxOTJVCisJcmV0dXJuOworI2VuZGlmCisjaWZkZWYgUlRMODE5MkUKKwkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPnByaXZfd3EsJnByaXYtPmdwaW9fY2hhbmdlX3JmX3dxLDApOworI2VuZGlmCisKK30JLyogZG1fQ2hlY2tSZkN0cmxHUElPICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOglkbV9jaGVja19wYmNfZ3BpbygpCisgKgorICogT3ZlcnZpZXc6CUNoZWNrIGlmIFBCQyBidXR0b24gaXMgcHJlc3NlZC4KKyAqCisgKiBJbnB1dDoJCU5PTkUKKyAqCisgKiBPdXRwdXQ6CQlOT05FCisgKgorICogUmV0dXJuOgkJTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqCVdoZW4JCVdobwkJUmVtYXJrCisgKgkwNS8yOC8yMDA4CWFteSAJQ3JlYXRlIFZlcnNpb24gMCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwl2b2lkCWRtX2NoZWNrX3BiY19ncGlvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisjaWZkZWYgUlRMODE5MlUKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggdG1wMWJ5dGU7CisKKworCXRtcDFieXRlID0gcmVhZF9uaWNfYnl0ZShkZXYsR1BJKTsKKwlpZih0bXAxYnl0ZSA9PSAweGZmKQorCQlyZXR1cm47CisKKwlpZiAodG1wMWJ5dGUmQklUNiB8fCB0bXAxYnl0ZSZCSVQwKQorCXsKKwkJLy8gSGVyZSB3ZSBvbmx5IHNldCBiUGJjUHJlc3NlZCB0byBUUlVFCisJCS8vIEFmdGVyIHRyaWdnZXIgUEJDLCB0aGUgdmFyaWFibGUgd2lsbCBiZSBzZXQgdG8gRkFMU0UKKwkJUlRfVFJBQ0UoQ09NUF9JTywgIkNoZWNrUGJjR1BJTyAtIFBCQyBpcyBwcmVzc2VkXG4iKTsKKwkJcHJpdi0+YnBiY19wcmVzc2VkID0gdHJ1ZTsKKwl9CisjZW5kaWYKKworfQorCisjaWZkZWYgUlRMODE5MkUKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CWRtX0dQSU9DaGFuZ2VSRgorICogT3ZlcnZpZXc6CVBDSSB3aWxsIG5vdCBzdXBwb3J0IHdvcmtpdGVtIGNhbGwgYmFjayBIVyByYWRpbyBvbi1vZmYgY29udHJvbC4KKyAqCisgKiBJbnB1dDoJCU5PTkUKKyAqCisgKiBPdXRwdXQ6CQlOT05FCisgKgorICogUmV0dXJuOgkJTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqCVdoZW4JCVdobwkJUmVtYXJrCisgKgkwMi8yMS8yMDA4CU1IQwkJQ3JlYXRlIFZlcnNpb24gMC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4Jdm9pZAlkbV9ncGlvX2NoYW5nZV9yZl9jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOworICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGR3b3JrLHN0cnVjdCByODE5Ml9wcml2LGdwaW9fY2hhbmdlX3JmX3dxKTsKKyAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+aWVlZTgwMjExLT5kZXY7CisJdTggdG1wMWJ5dGU7CisJUlRfUkZfUE9XRVJfU1RBVEUJZVJmUG93ZXJTdGF0ZVRvU2V0OworCWJvb2wgYkFjdHVhbGx5U2V0ID0gZmFsc2U7CisKKwlkb3sKKwkJYkFjdHVhbGx5U2V0PWZhbHNlOworCisJCWlmKCFwcml2LT51cCkKKwkJeworCQkJUlRfVFJBQ0UoKENPTVBfSU5JVCB8IENPTVBfUE9XRVIgfCBDT01QX1JGKSwiZG1fZ3Bpb19jaGFuZ2VfcmZfY2FsbGJhY2soKTogQ2FsbGJhY2sgZnVuY3Rpb24gYnJlYWtzIG91dCEhXG4iKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIDB4MTA4IEdQSU8gaW5wdXQgcmVnaXN0ZXIgaXMgcmVhZCBvbmx5CisJCQkvL3NldCAweDEwOCBCMT0gMTogUkYtT047IDA6IFJGLU9GRi4KKwkJCXRtcDFieXRlID0gcmVhZF9uaWNfYnl0ZShkZXYsR1BJKTsKKworCQkJZVJmUG93ZXJTdGF0ZVRvU2V0ID0gKHRtcDFieXRlJkJJVDEpID8gIGVSZk9uIDogZVJmT2ZmOworCisJCQlpZiggKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpICYmIChlUmZQb3dlclN0YXRlVG9TZXQgPT0gZVJmT24pKQorCQkJeworCQkJCVJUX1RSQUNFKENPTVBfUkYsICJncGlvY2hhbmdlUkYgIC0gSFcgUmFkaW8gT05cbiIpOworCisJCQkJcHJpdi0+Ykh3UmFkaW9PZmYgPSBmYWxzZTsKKwkJCQliQWN0dWFsbHlTZXQgPSB0cnVlOworCQkJfQorCQkJZWxzZSBpZiAoIChwcml2LT5iSHdSYWRpb09mZiA9PSBmYWxzZSkgJiYgKGVSZlBvd2VyU3RhdGVUb1NldCA9PSBlUmZPZmYpKQorCQkJeworCQkJCVJUX1RSQUNFKENPTVBfUkYsICJncGlvY2hhbmdlUkYgIC0gSFcgUmFkaW8gT0ZGXG4iKTsKKwkJCQlwcml2LT5iSHdSYWRpb09mZiA9IHRydWU7CisJCQkJYkFjdHVhbGx5U2V0ID0gdHJ1ZTsKKwkJCX0KKworCQkJaWYoYkFjdHVhbGx5U2V0KQorCQkJeworCQkJCSNpZmRlZiBUT19ETworCQkJCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBlUmZQb3dlclN0YXRlVG9TZXQsIFJGX0NIQU5HRV9CWV9IVyk7CisJCQkJLy9EcnZJRkluZGljYXRlQ3VycmVudFBoeVN0YXR1cyhwQWRhcHRlcik7CisJCQkJI2VuZGlmCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXNsZWVwKDIwMDApOworCQkJfQorCisJCX0KKwl9d2hpbGUoVFJVRSkKKworfQkvKiBkbV9HUElPQ2hhbmdlUkYgKi8KKworI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjoJRE1fUkZQYXRoQ2hlY2tXb3JrSXRlbUNhbGxCYWNrKCkKKyAqCisgKiBPdmVydmlldzoJQ2hlY2sgaWYgQ3VycmVudCBSRiBSWCBwYXRoIGlzIGVuYWJsZWQKKyAqCisgKiBJbnB1dDoJCU5PTkUKKyAqCisgKiBPdXRwdXQ6CQlOT05FCisgKgorICogUmV0dXJuOgkJTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqCVdoZW4JCVdobwkJUmVtYXJrCisgKgkwMS8zMC8yMDA4CU1IQwkJQ3JlYXRlIFZlcnNpb24gMC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4Jdm9pZAlkbV9yZl9wYXRoY2hlY2tfd29ya2l0ZW1jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOworICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGR3b3JrLHN0cnVjdCByODE5Ml9wcml2LHJmcGF0aF9jaGVja193cSk7CisgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9cHJpdi0+aWVlZTgwMjExLT5kZXY7CisJLy9ib29sIGJhY3R1YWxseV9zZXQgPSBmYWxzZTsKKwl1OCByZnBhdGggPSAwLCBpOworCisKKwkvKiAyMDA4LzAxLzMwIE1IIEFmdGVyIGRpc2N1c3Npbmcgd2l0aCBTRDMgSmVycnksIDB4YzA0LzB4ZDA0IHJlZ2lzdGVyIHdpbGwKKwkgICBhbHdheXMgYmUgdGhlIHNhbWUuIFdlIG9ubHkgcmVhZCAweGMwNCBub3cuICovCisJcmZwYXRoID0gcmVhZF9uaWNfYnl0ZShkZXYsIDB4YzA0KTsKKworCS8vIENoZWNrIEJpdCAwLTMsIGl0IG1lYW5zIGlmIFJGIEEtRCBpcyBlbmFibGVkLgorCWZvciAoaSA9IDA7IGkgPCBSRjkwX1BBVEhfTUFYOyBpKyspCisJeworCQlpZiAocmZwYXRoICYgKDB4MDE8PGkpKQorCQkJcHJpdi0+YnJmcGF0aF9yeGVuYWJsZVtpXSA9IDE7CisJCWVsc2UKKwkJCXByaXYtPmJyZnBhdGhfcnhlbmFibGVbaV0gPSAwOworCX0KKwlpZighRE1fUnhQYXRoU2VsVGFibGUuRW5hYmxlKQorCQlyZXR1cm47CisKKwlkbV9yeHBhdGhfc2VsX2J5cnNzaShkZXYpOworfQkvKiBETV9SRlBhdGhDaGVja1dvcmtJdGVtQ2FsbEJhY2sgKi8KKworc3RhdGljIHZvaWQgZG1faW5pdF9yeHBhdGhfc2VsZWN0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXU4IGk7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCURNX1J4UGF0aFNlbFRhYmxlLkVuYWJsZSA9IDE7CS8vZGVmYXVsdCBlbmFibGVkCisJRE1fUnhQYXRoU2VsVGFibGUuU1NfVEhfbG93ID0gUnhQYXRoU2VsZWN0aW9uX1NTX1RIX2xvdzsKKwlETV9SeFBhdGhTZWxUYWJsZS5kaWZmX1RIID0gUnhQYXRoU2VsZWN0aW9uX2RpZmZfVEg7CisJaWYocHJpdi0+Q3VzdG9tZXJJRCA9PSBSVF9DSURfODE5eF9OZXRjb3JlKQorCQlETV9SeFBhdGhTZWxUYWJsZS5jY2tfbWV0aG9kID0gQ0NLX1J4X1ZlcnNpb25fMjsKKwllbHNlCisJCURNX1J4UGF0aFNlbFRhYmxlLmNja19tZXRob2QgPSBDQ0tfUnhfVmVyc2lvbl8xOworCURNX1J4UGF0aFNlbFRhYmxlLkRiZ01vZGUgPSBETV9EQkdfT0ZGOworCURNX1J4UGF0aFNlbFRhYmxlLmRpc2FibGVkUkYgPSAwOworCWZvcihpPTA7IGk8NDsgaSsrKQorCXsKKwkJRE1fUnhQYXRoU2VsVGFibGUucmZfcnNzaVtpXSA9IDUwOworCQlETV9SeFBhdGhTZWxUYWJsZS5jY2tfcHdkYl9zdGFbaV0gPSAtNjQ7CisJCURNX1J4UGF0aFNlbFRhYmxlLnJmX2VuYWJsZV9yc3NpX3RoW2ldID0gMTAwOworCX0KK30KKworc3RhdGljIHZvaWQgZG1fcnhwYXRoX3NlbF9ieXJzc2koc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4CQkJCWksIG1heF9yc3NpX2luZGV4PTAsIG1pbl9yc3NpX2luZGV4PTAsIHNlY19yc3NpX2luZGV4PTAsIHJmX251bT0wOworCXU4CQkJCXRtcF9tYXhfcnNzaT0wLCB0bXBfbWluX3Jzc2k9MCwgdG1wX3NlY19yc3NpPTA7CisJdTgJCQkJY2NrX2RlZmF1bHRfUng9MHgyOwkvL1JGLUMKKwl1OAkJCQljY2tfb3B0aW9uYWxfUng9MHgzOy8vUkYtRAorCWxvbmcJCQkJdG1wX2Nja19tYXhfcHdkYj0wLCB0bXBfY2NrX21pbl9wd2RiPTAsIHRtcF9jY2tfc2VjX3B3ZGI9MDsKKwl1OAkJCQljY2tfcnhfdmVyMl9tYXhfaW5kZXg9MCwgY2NrX3J4X3ZlcjJfbWluX2luZGV4PTAsIGNja19yeF92ZXIyX3NlY19pbmRleD0wOworCXU4CQkJCWN1cl9yZl9yc3NpOworCWxvbmcJCQkJY3VyX2Nja19wd2RiOworCXN0YXRpYyB1OAkJCWRpc2FibGVkX3JmX2NudD0wLCBjY2tfUnhfUGF0aF9pbml0aWFsaXplZD0wOworCXU4CQkJCXVwZGF0ZV9jY2tfcnhfcGF0aDsKKworCWlmKHByaXYtPnJmX3R5cGUgIT0gUkZfMlQ0UikKKwkJcmV0dXJuOworCisJaWYoIWNja19SeF9QYXRoX2luaXRpYWxpemVkKQorCXsKKwkJRE1fUnhQYXRoU2VsVGFibGUuY2NrX1J4X3BhdGggPSAocmVhZF9uaWNfYnl0ZShkZXYsIDB4YTA3KSYweGYpOworCQljY2tfUnhfUGF0aF9pbml0aWFsaXplZCA9IDE7CisJfQorCisJRE1fUnhQYXRoU2VsVGFibGUuZGlzYWJsZWRSRiA9IDB4ZjsKKwlETV9SeFBhdGhTZWxUYWJsZS5kaXNhYmxlZFJGICY9fiAocmVhZF9uaWNfYnl0ZShkZXYsIDB4YzA0KSk7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9CKQorCXsKKwkJRE1fUnhQYXRoU2VsVGFibGUuY2NrX21ldGhvZCA9IENDS19SeF9WZXJzaW9uXzI7CS8vcHVyZSBCIG1vZGUsIGZpeGVkIGNjayB2ZXJzaW9uMgorCQkvL0RiZ1ByaW50KCJQdXJlIEIgbW9kZSwgdXNlIGNjayByeCB2ZXJzaW9uMiBcbiIpOworCX0KKworCS8vZGVjaWRlIG1heC9zZWMvbWluIHJzc2kgaW5kZXgKKwlmb3IgKGk9MDsgaTxSRjkwX1BBVEhfTUFYOyBpKyspCisJeworCQlpZighRE1fUnhQYXRoU2VsVGFibGUuRGJnTW9kZSkKKwkJCURNX1J4UGF0aFNlbFRhYmxlLnJmX3Jzc2lbaV0gPSBwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbaV07CisKKwkJaWYocHJpdi0+YnJmcGF0aF9yeGVuYWJsZVtpXSkKKwkJeworCQkJcmZfbnVtKys7CisJCQljdXJfcmZfcnNzaSA9IERNX1J4UGF0aFNlbFRhYmxlLnJmX3Jzc2lbaV07CisKKwkJCWlmKHJmX251bSA9PSAxKQkvLyBmaW5kIGZpcnN0IGVuYWJsZWQgcmYgcGF0aCBhbmQgdGhlIHJzc2kgdmFsdWVzCisJCQl7CS8vaW5pdGlhbGl6ZSwgc2V0IGFsbCByc3NpIGluZGV4IHRvIHRoZSBzYW1lIG9uZQorCQkJCW1heF9yc3NpX2luZGV4ID0gbWluX3Jzc2lfaW5kZXggPSBzZWNfcnNzaV9pbmRleCA9IGk7CisJCQkJdG1wX21heF9yc3NpID0gdG1wX21pbl9yc3NpID0gdG1wX3NlY19yc3NpID0gY3VyX3JmX3Jzc2k7CisJCQl9CisJCQllbHNlIGlmKHJmX251bSA9PSAyKQorCQkJewkvLyB3ZSBwaWNrIHVwIHRoZSBtYXggaW5kZXggZmlyc3QsIGFuZCBsZXQgc2VjIGFuZCBtaW4gdG8gYmUgdGhlIHNhbWUgb25lCisJCQkJaWYoY3VyX3JmX3Jzc2kgPj0gdG1wX21heF9yc3NpKQorCQkJCXsKKwkJCQkJdG1wX21heF9yc3NpID0gY3VyX3JmX3Jzc2k7CisJCQkJCW1heF9yc3NpX2luZGV4ID0gaTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdG1wX3NlY19yc3NpID0gdG1wX21pbl9yc3NpID0gY3VyX3JmX3Jzc2k7CisJCQkJCXNlY19yc3NpX2luZGV4ID0gbWluX3Jzc2lfaW5kZXggPSBpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZihjdXJfcmZfcnNzaSA+IHRtcF9tYXhfcnNzaSkKKwkJCQl7CisJCQkJCXRtcF9zZWNfcnNzaSA9IHRtcF9tYXhfcnNzaTsKKwkJCQkJc2VjX3Jzc2lfaW5kZXggPSBtYXhfcnNzaV9pbmRleDsKKwkJCQkJdG1wX21heF9yc3NpID0gY3VyX3JmX3Jzc2k7CisJCQkJCW1heF9yc3NpX2luZGV4ID0gaTsKKwkJCQl9CisJCQkJZWxzZSBpZihjdXJfcmZfcnNzaSA9PSB0bXBfbWF4X3Jzc2kpCisJCQkJewkvLyBsZXQgc2VjIGFuZCBtaW4gcG9pbnQgdG8gdGhlIGRpZmZlcmVudCBpbmRleAorCQkJCQl0bXBfc2VjX3Jzc2kgPSBjdXJfcmZfcnNzaTsKKwkJCQkJc2VjX3Jzc2lfaW5kZXggPSBpOworCQkJCX0KKwkJCQllbHNlIGlmKChjdXJfcmZfcnNzaSA8IHRtcF9tYXhfcnNzaSkgJiYoY3VyX3JmX3Jzc2kgPiB0bXBfc2VjX3Jzc2kpKQorCQkJCXsKKwkJCQkJdG1wX3NlY19yc3NpID0gY3VyX3JmX3Jzc2k7CisJCQkJCXNlY19yc3NpX2luZGV4ID0gaTsKKwkJCQl9CisJCQkJZWxzZSBpZihjdXJfcmZfcnNzaSA9PSB0bXBfc2VjX3Jzc2kpCisJCQkJeworCQkJCQlpZih0bXBfc2VjX3Jzc2kgPT0gdG1wX21pbl9yc3NpKQorCQkJCQl7CS8vIGxldCBzZWMgYW5kIG1pbiBwb2ludCB0byB0aGUgZGlmZmVyZW50IGluZGV4CisJCQkJCQl0bXBfc2VjX3Jzc2kgPSBjdXJfcmZfcnNzaTsKKwkJCQkJCXNlY19yc3NpX2luZGV4ID0gaTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vIFRoaXMgY2FzZSB3ZSBkb24ndCBuZWVkIHRvIHNldCBhbnkgaW5kZXgKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKChjdXJfcmZfcnNzaSA8IHRtcF9zZWNfcnNzaSkgJiYgKGN1cl9yZl9yc3NpID4gdG1wX21pbl9yc3NpKSkKKwkJCQl7CisJCQkJCS8vIFRoaXMgY2FzZSB3ZSBkb24ndCBuZWVkIHRvIHNldCBhbnkgaW5kZXgKKwkJCQl9CisJCQkJZWxzZSBpZihjdXJfcmZfcnNzaSA9PSB0bXBfbWluX3Jzc2kpCisJCQkJeworCQkJCQlpZih0bXBfc2VjX3Jzc2kgPT0gdG1wX21pbl9yc3NpKQorCQkJCQl7CS8vIGxldCBzZWMgYW5kIG1pbiBwb2ludCB0byB0aGUgZGlmZmVyZW50IGluZGV4CisJCQkJCQl0bXBfbWluX3Jzc2kgPSBjdXJfcmZfcnNzaTsKKwkJCQkJCW1pbl9yc3NpX2luZGV4ID0gaTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vIFRoaXMgY2FzZSB3ZSBkb24ndCBuZWVkIHRvIHNldCBhbnkgaW5kZXgKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKGN1cl9yZl9yc3NpIDwgdG1wX21pbl9yc3NpKQorCQkJCXsKKwkJCQkJdG1wX21pbl9yc3NpID0gY3VyX3JmX3Jzc2k7CisJCQkJCW1pbl9yc3NpX2luZGV4ID0gaTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZl9udW0gPSAwOworCS8vIGRlY2lkZSBtYXgvc2VjL21pbiBjY2sgcHdkYiBpbmRleAorCWlmKERNX1J4UGF0aFNlbFRhYmxlLmNja19tZXRob2QgPT0gQ0NLX1J4X1ZlcnNpb25fMikKKwl7CisJCWZvciAoaT0wOyBpPFJGOTBfUEFUSF9NQVg7IGkrKykKKwkJeworCQkJaWYocHJpdi0+YnJmcGF0aF9yeGVuYWJsZVtpXSkKKwkJCXsKKwkJCQlyZl9udW0rKzsKKwkJCQljdXJfY2NrX3B3ZGIgPSAgRE1fUnhQYXRoU2VsVGFibGUuY2NrX3B3ZGJfc3RhW2ldOworCisJCQkJaWYocmZfbnVtID09IDEpCS8vIGZpbmQgZmlyc3QgZW5hYmxlZCByZiBwYXRoIGFuZCB0aGUgcnNzaSB2YWx1ZXMKKwkJCQl7CS8vaW5pdGlhbGl6ZSwgc2V0IGFsbCByc3NpIGluZGV4IHRvIHRoZSBzYW1lIG9uZQorCQkJCQljY2tfcnhfdmVyMl9tYXhfaW5kZXggPSBjY2tfcnhfdmVyMl9taW5faW5kZXggPSBjY2tfcnhfdmVyMl9zZWNfaW5kZXggPSBpOworCQkJCQl0bXBfY2NrX21heF9wd2RiID0gdG1wX2Nja19taW5fcHdkYiA9IHRtcF9jY2tfc2VjX3B3ZGIgPSBjdXJfY2NrX3B3ZGI7CisJCQkJfQorCQkJCWVsc2UgaWYocmZfbnVtID09IDIpCisJCQkJewkvLyB3ZSBwaWNrIHVwIHRoZSBtYXggaW5kZXggZmlyc3QsIGFuZCBsZXQgc2VjIGFuZCBtaW4gdG8gYmUgdGhlIHNhbWUgb25lCisJCQkJCWlmKGN1cl9jY2tfcHdkYiA+PSB0bXBfY2NrX21heF9wd2RiKQorCQkJCQl7CisJCQkJCQl0bXBfY2NrX21heF9wd2RiID0gY3VyX2Nja19wd2RiOworCQkJCQkJY2NrX3J4X3ZlcjJfbWF4X2luZGV4ID0gaTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXRtcF9jY2tfc2VjX3B3ZGIgPSB0bXBfY2NrX21pbl9wd2RiID0gY3VyX2Nja19wd2RiOworCQkJCQkJY2NrX3J4X3ZlcjJfc2VjX2luZGV4ID0gY2NrX3J4X3ZlcjJfbWluX2luZGV4ID0gaTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpZihjdXJfY2NrX3B3ZGIgPiB0bXBfY2NrX21heF9wd2RiKQorCQkJCQl7CisJCQkJCQl0bXBfY2NrX3NlY19wd2RiID0gdG1wX2Nja19tYXhfcHdkYjsKKwkJCQkJCWNja19yeF92ZXIyX3NlY19pbmRleCA9IGNja19yeF92ZXIyX21heF9pbmRleDsKKwkJCQkJCXRtcF9jY2tfbWF4X3B3ZGIgPSBjdXJfY2NrX3B3ZGI7CisJCQkJCQljY2tfcnhfdmVyMl9tYXhfaW5kZXggPSBpOworCQkJCQl9CisJCQkJCWVsc2UgaWYoY3VyX2Nja19wd2RiID09IHRtcF9jY2tfbWF4X3B3ZGIpCisJCQkJCXsJLy8gbGV0IHNlYyBhbmQgbWluIHBvaW50IHRvIHRoZSBkaWZmZXJlbnQgaW5kZXgKKwkJCQkJCXRtcF9jY2tfc2VjX3B3ZGIgPSBjdXJfY2NrX3B3ZGI7CisJCQkJCQljY2tfcnhfdmVyMl9zZWNfaW5kZXggPSBpOworCQkJCQl9CisJCQkJCWVsc2UgaWYoKGN1cl9jY2tfcHdkYiA8IHRtcF9jY2tfbWF4X3B3ZGIpICYmKGN1cl9jY2tfcHdkYiA+IHRtcF9jY2tfc2VjX3B3ZGIpKQorCQkJCQl7CisJCQkJCQl0bXBfY2NrX3NlY19wd2RiID0gY3VyX2Nja19wd2RiOworCQkJCQkJY2NrX3J4X3ZlcjJfc2VjX2luZGV4ID0gaTsKKwkJCQkJfQorCQkJCQllbHNlIGlmKGN1cl9jY2tfcHdkYiA9PSB0bXBfY2NrX3NlY19wd2RiKQorCQkJCQl7CisJCQkJCQlpZih0bXBfY2NrX3NlY19wd2RiID09IHRtcF9jY2tfbWluX3B3ZGIpCisJCQkJCQl7CS8vIGxldCBzZWMgYW5kIG1pbiBwb2ludCB0byB0aGUgZGlmZmVyZW50IGluZGV4CisJCQkJCQkJdG1wX2Nja19zZWNfcHdkYiA9IGN1cl9jY2tfcHdkYjsKKwkJCQkJCQljY2tfcnhfdmVyMl9zZWNfaW5kZXggPSBpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCS8vIFRoaXMgY2FzZSB3ZSBkb24ndCBuZWVkIHRvIHNldCBhbnkgaW5kZXgKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlIGlmKChjdXJfY2NrX3B3ZGIgPCB0bXBfY2NrX3NlY19wd2RiKSAmJiAoY3VyX2Nja19wd2RiID4gdG1wX2Nja19taW5fcHdkYikpCisJCQkJCXsKKwkJCQkJCS8vIFRoaXMgY2FzZSB3ZSBkb24ndCBuZWVkIHRvIHNldCBhbnkgaW5kZXgKKwkJCQkJfQorCQkJCQllbHNlIGlmKGN1cl9jY2tfcHdkYiA9PSB0bXBfY2NrX21pbl9wd2RiKQorCQkJCQl7CisJCQkJCQlpZih0bXBfY2NrX3NlY19wd2RiID09IHRtcF9jY2tfbWluX3B3ZGIpCisJCQkJCQl7CS8vIGxldCBzZWMgYW5kIG1pbiBwb2ludCB0byB0aGUgZGlmZmVyZW50IGluZGV4CisJCQkJCQkJdG1wX2Nja19taW5fcHdkYiA9IGN1cl9jY2tfcHdkYjsKKwkJCQkJCQljY2tfcnhfdmVyMl9taW5faW5kZXggPSBpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCS8vIFRoaXMgY2FzZSB3ZSBkb24ndCBuZWVkIHRvIHNldCBhbnkgaW5kZXgKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlIGlmKGN1cl9jY2tfcHdkYiA8IHRtcF9jY2tfbWluX3B3ZGIpCisJCQkJCXsKKwkJCQkJCXRtcF9jY2tfbWluX3B3ZGIgPSBjdXJfY2NrX3B3ZGI7CisJCQkJCQljY2tfcnhfdmVyMl9taW5faW5kZXggPSBpOworCQkJCQl9CisJCQkJfQorCisJCQl9CisJCX0KKwl9CisKKworCS8vIFNldCBDQ0sgUnggcGF0aAorCS8vIHJlZzB4QTA3WzM6Ml09Y2NrIGRlZmF1bHQgcnggcGF0aCwgcmVnMHhhMDdbMTowXT1jY2sgb3B0aW9uYWwgcnggcGF0aC4KKwl1cGRhdGVfY2NrX3J4X3BhdGggPSAwOworCWlmKERNX1J4UGF0aFNlbFRhYmxlLmNja19tZXRob2QgPT0gQ0NLX1J4X1ZlcnNpb25fMikKKwl7CisJCWNja19kZWZhdWx0X1J4ID0gY2NrX3J4X3ZlcjJfbWF4X2luZGV4OworCQljY2tfb3B0aW9uYWxfUnggPSBjY2tfcnhfdmVyMl9zZWNfaW5kZXg7CisJCWlmKHRtcF9jY2tfbWF4X3B3ZGIgIT0gLTY0KQorCQkJdXBkYXRlX2Nja19yeF9wYXRoID0gMTsKKwl9CisKKwlpZih0bXBfbWluX3Jzc2kgPCBETV9SeFBhdGhTZWxUYWJsZS5TU19USF9sb3cgJiYgZGlzYWJsZWRfcmZfY250IDwgMikKKwl7CisJCWlmKCh0bXBfbWF4X3Jzc2kgLSB0bXBfbWluX3Jzc2kpID49IERNX1J4UGF0aFNlbFRhYmxlLmRpZmZfVEgpCisJCXsKKwkJCS8vcmVjb3JkIHRoZSBlbmFibGVkIHJzc2kgdGhyZXNob2xkCisJCQlETV9SeFBhdGhTZWxUYWJsZS5yZl9lbmFibGVfcnNzaV90aFttaW5fcnNzaV9pbmRleF0gPSB0bXBfbWF4X3Jzc2krNTsKKwkJCS8vZGlzYWJsZSB0aGUgQkIgUnggcGF0aCwgT0ZETQorCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLCAweDE8PG1pbl9yc3NpX2luZGV4LCAweDApOwkvLyAweGMwNFszOjBdCisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0xX1RSeFBhdGhFbmFibGUsIDB4MTw8bWluX3Jzc2lfaW5kZXgsIDB4MCk7CS8vIDB4ZDA0WzM6MF0KKwkJCWRpc2FibGVkX3JmX2NudCsrOworCQl9CisJCWlmKERNX1J4UGF0aFNlbFRhYmxlLmNja19tZXRob2QgPT0gQ0NLX1J4X1ZlcnNpb25fMSkKKwkJeworCQkJY2NrX2RlZmF1bHRfUnggPSBtYXhfcnNzaV9pbmRleDsKKwkJCWNja19vcHRpb25hbF9SeCA9IHNlY19yc3NpX2luZGV4OworCQkJaWYodG1wX21heF9yc3NpKQorCQkJCXVwZGF0ZV9jY2tfcnhfcGF0aCA9IDE7CisJCX0KKwl9CisKKwlpZih1cGRhdGVfY2NrX3J4X3BhdGgpCisJeworCQlETV9SeFBhdGhTZWxUYWJsZS5jY2tfUnhfcGF0aCA9IChjY2tfZGVmYXVsdF9SeDw8Mil8KGNja19vcHRpb25hbF9SeCk7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9BRkVTZXR0aW5nLCAweDBmMDAwMDAwLCBETV9SeFBhdGhTZWxUYWJsZS5jY2tfUnhfcGF0aCk7CisJfQorCisJaWYoRE1fUnhQYXRoU2VsVGFibGUuZGlzYWJsZWRSRikKKwl7CisJCWZvcihpPTA7IGk8NDsgaSsrKQorCQl7CisJCQlpZigoRE1fUnhQYXRoU2VsVGFibGUuZGlzYWJsZWRSRj4+aSkgJiAweDEpCS8vZGlzYWJsZWQgcmYKKwkJCXsKKwkJCQlpZih0bXBfbWF4X3Jzc2kgPj0gRE1fUnhQYXRoU2VsVGFibGUucmZfZW5hYmxlX3Jzc2lfdGhbaV0pCisJCQkJeworCQkJCQkvL2VuYWJsZSB0aGUgQkIgUnggcGF0aAorCQkJCQkvL0RiZ1ByaW50KCJSRi0lZCBpcyBlbmFibGVkLiBcbiIsIDB4MTw8aSk7CisJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfVFJ4UGF0aEVuYWJsZSwgMHgxPDxpLCAweDEpOwkvLyAweGMwNFszOjBdCisJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTFfVFJ4UGF0aEVuYWJsZSwgMHgxPDxpLCAweDEpOwkvLyAweGQwNFszOjBdCisJCQkJCURNX1J4UGF0aFNlbFRhYmxlLnJmX2VuYWJsZV9yc3NpX3RoW2ldID0gMTAwOworCQkJCQlkaXNhYmxlZF9yZl9jbnQtLTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOglkbV9jaGVja19yeF9wYXRoX3NlbGVjdGlvbigpCisgKgorICogT3ZlcnZpZXc6CUNhbGwgYSB3b3JraXRlbSB0byBjaGVjayBjdXJyZW50IFJYUkYgcGF0aCBhbmQgUnggUGF0aCBzZWxlY3Rpb24gYnkgUlNTSS4KKyAqCisgKiBJbnB1dDoJCU5PTkUKKyAqCisgKiBPdXRwdXQ6CQlOT05FCisgKgorICogUmV0dXJuOgkJTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqCVdoZW4JCVdobwkJUmVtYXJrCisgKgkwNS8yOC8yMDA4CWFteQkJQ3JlYXRlIFZlcnNpb24gMCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwl2b2lkCWRtX2NoZWNrX3J4X3BhdGhfc2VsZWN0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5wcml2X3dxLCZwcml2LT5yZnBhdGhfY2hlY2tfd3EsMCk7Cit9CS8qIGRtX0NoZWNrUnhSRlBhdGggKi8KKworCitzdGF0aWMgdm9pZCBkbV9pbml0X2ZzeW5jIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfdGltZV9pbnRlcnZhbCA9IDUwMDsKKwlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3JhdGVfYml0bWFwID0gMHgwZjAwMDgwMDsKKwlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3Jzc2lfdGhyZXNob2xkID0gMzA7CisjaWZkZWYgUlRMODE5MFAKKwlwcml2LT5pZWVlODAyMTEtPmJmc3luY19lbmFibGUgPSB0cnVlOworI2Vsc2UKKwlwcml2LT5pZWVlODAyMTEtPmJmc3luY19lbmFibGUgPSBmYWxzZTsKKyNlbmRpZgorCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfbXVsdGlwbGVfdGltZWludGVydmFsID0gMzsKKwlwcml2LT5pZWVlODAyMTEtPmZzeW5jX2ZpcnN0ZGlmZl9yYXRldGhyZXNob2xkPSAxMDA7CisJcHJpdi0+aWVlZTgwMjExLT5mc3luY19zZWNvbmRkaWZmX3JhdGV0aHJlc2hvbGQ9IDIwMDsKKwlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3N0YXRlID0gRGVmYXVsdF9Gc3luYzsKKwlwcml2LT5mcmFtZXN5bmNNb25pdG9yID0gMTsJLy8gY3VycmVudCBkZWZhdWx0IDB4YzM4IG1vbml0b3Igb24KKworCWluaXRfdGltZXIoJnByaXYtPmZzeW5jX3RpbWVyKTsKKwlwcml2LT5mc3luY190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXByaXYtPmZzeW5jX3RpbWVyLmZ1bmN0aW9uID0gZG1fZnN5bmNfdGltZXJfY2FsbGJhY2s7Cit9CisKKworc3RhdGljIHZvaWQgZG1fZGVJbml0X2ZzeW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWRlbF90aW1lcl9zeW5jKCZwcml2LT5mc3luY190aW1lcik7Cit9CisKK2V4dGVybiB2b2lkIGRtX2ZzeW5jX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpOworCXUzMiByYXRlX2luZGV4LCByYXRlX2NvdW50ID0gMCwgcmF0ZV9jb3VudF9kaWZmPTA7CisJYm9vbAkJYlN3aXRjaEZyb21Db3VudERpZmYgPSBmYWxzZTsKKwlib29sCQliRG91YmxlVGltZUludGVydmFsID0gZmFsc2U7CisKKwlpZigJcHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEICYmCisJCXByaXYtPmllZWU4MDIxMS0+YmZzeW5jX2VuYWJsZSAmJgorCQkocHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvLT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX0NERF9GU1lOQykpCisJeworCQkgLy8gQ291bnQgcmF0ZSA1NCwgTUNTIFs3XSwgWzEyLCAxMywgMTQsIDE1XQorCQl1MzIgcmF0ZV9iaXRtYXA7CisJCWZvcihyYXRlX2luZGV4ID0gMDsgcmF0ZV9pbmRleCA8PSAyNzsgcmF0ZV9pbmRleCsrKQorCQl7CisJCQlyYXRlX2JpdG1hcCAgPSAxIDw8IHJhdGVfaW5kZXg7CisJCQlpZihwcml2LT5pZWVlODAyMTEtPmZzeW5jX3JhdGVfYml0bWFwICYgIHJhdGVfYml0bWFwKQorCQkJCXJhdGVfY291bnQrPSBwcml2LT5zdGF0cy5yZWNlaXZlZF9yYXRlX2hpc3RvZ3JhbVsxXVtyYXRlX2luZGV4XTsKKwkJfQorCisJCWlmKHJhdGVfY291bnQgPCBwcml2LT5yYXRlX3JlY29yZCkKKwkJCXJhdGVfY291bnRfZGlmZiA9IDB4ZmZmZmZmZmYgLSByYXRlX2NvdW50ICsgcHJpdi0+cmF0ZV9yZWNvcmQ7CisJCWVsc2UKKwkJCXJhdGVfY291bnRfZGlmZiA9IHJhdGVfY291bnQgLSBwcml2LT5yYXRlX3JlY29yZDsKKwkJaWYocmF0ZV9jb3VudF9kaWZmIDwgcHJpdi0+cmF0ZUNvdW50RGlmZlJlY29yZCkKKwkJeworCisJCQl1MzIgRGlmZk51bSA9IHByaXYtPnJhdGVDb3VudERpZmZSZWNvcmQgLSByYXRlX2NvdW50X2RpZmY7CisJCQkvLyBDb250aXVuZSBjb3VudAorCQkJaWYoRGlmZk51bSA+PSBwcml2LT5pZWVlODAyMTEtPmZzeW5jX3NlY29uZGRpZmZfcmF0ZXRocmVzaG9sZCkKKwkJCQlwcml2LT5Db250aXVuZURpZmZDb3VudCsrOworCQkJZWxzZQorCQkJCXByaXYtPkNvbnRpdW5lRGlmZkNvdW50ID0gMDsKKworCQkJLy8gQ29udGl1bmUgY291bnQgb3ZlcgorCQkJaWYocHJpdi0+Q29udGl1bmVEaWZmQ291bnQgPj0yKQorCQkJeworCQkJCWJTd2l0Y2hGcm9tQ291bnREaWZmID0gdHJ1ZTsKKwkJCQlwcml2LT5Db250aXVuZURpZmZDb3VudCA9IDA7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBTdG9wIGNvbnRpdW5lIGNvdW50CisJCQlwcml2LT5Db250aXVuZURpZmZDb3VudCA9IDA7CisJCX0KKworCQkvL0lmIENvdW50IGRpZmYgPD0gRnN5bmNSYXRlQ291bnRUaHJlc2hvbGQKKwkJaWYocmF0ZV9jb3VudF9kaWZmIDw9IHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfZmlyc3RkaWZmX3JhdGV0aHJlc2hvbGQpCisJCXsKKwkJCWJTd2l0Y2hGcm9tQ291bnREaWZmID0gdHJ1ZTsKKwkJCXByaXYtPkNvbnRpdW5lRGlmZkNvdW50ID0gMDsKKwkJfQorCQlwcml2LT5yYXRlX3JlY29yZCA9IHJhdGVfY291bnQ7CisJCXByaXYtPnJhdGVDb3VudERpZmZSZWNvcmQgPSByYXRlX2NvdW50X2RpZmY7CisJCVJUX1RSQUNFKENPTVBfSEFMRE0sICJyYXRlUmVjb3JkICVkIHJhdGVDb3VudCAlZCwgcmF0ZUNvdW50ZGlmZiAlZCBiU3dpdGNoRnN5bmMgJWRcbiIsIHByaXYtPnJhdGVfcmVjb3JkLCByYXRlX2NvdW50LCByYXRlX2NvdW50X2RpZmYgLCBwcml2LT5ic3dpdGNoX2ZzeW5jKTsKKwkJLy8gaWYgd2UgbmV2ZXIgcmVjZWl2ZSB0aG9zZSBtY3MgcmF0ZSBhbmQgcnNzaSA+IDMwICUgdGhlbiBzd2l0Y2ggZnN5bgorCQlpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID4gcHJpdi0+aWVlZTgwMjExLT5mc3luY19yc3NpX3RocmVzaG9sZCAmJiBiU3dpdGNoRnJvbUNvdW50RGlmZikKKwkJeworCQkJYkRvdWJsZVRpbWVJbnRlcnZhbCA9IHRydWU7CisJCQlwcml2LT5ic3dpdGNoX2ZzeW5jID0gIXByaXYtPmJzd2l0Y2hfZnN5bmM7CisJCQlpZihwcml2LT5ic3dpdGNoX2ZzeW5jKQorCQkJeworCQkJI2lmZGVmIFJUTDgxOTBQCisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweEMzNiwgMHgwMCk7CisJCQkjZWxzZQorCQkJCXdyaXRlX25pY19ieXRlKGRldiwweEMzNiwgMHgxYyk7CisJCQkjZW5kaWYKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4QzNlLCAweDkwKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCSNpZmRlZiBSVEw4MTkwUAorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhDMzYsIDB4NDApOworCQkJI2Vsc2UKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4QzM2LCAweDVjKTsKKwkJCSNlbmRpZgorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhDM2UsIDB4OTYpOworCQkJfQorCQl9CisJCWVsc2UgaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8PSBwcml2LT5pZWVlODAyMTEtPmZzeW5jX3Jzc2lfdGhyZXNob2xkKQorCQl7CisJCQlpZihwcml2LT5ic3dpdGNoX2ZzeW5jKQorCQkJeworCQkJCXByaXYtPmJzd2l0Y2hfZnN5bmMgID0gZmFsc2U7CisJCQkjaWZkZWYgUlRMODE5MFAKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4QzM2LCAweDQwKTsKKwkJCSNlbHNlCisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweEMzNiwgMHg1Yyk7CisJCQkjZW5kaWYKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4QzNlLCAweDk2KTsKKwkJCX0KKwkJfQorCQlpZihiRG91YmxlVGltZUludGVydmFsKXsKKwkJCWlmKHRpbWVyX3BlbmRpbmcoJnByaXYtPmZzeW5jX3RpbWVyKSkKKwkJCQlkZWxfdGltZXJfc3luYygmcHJpdi0+ZnN5bmNfdGltZXIpOworCQkJcHJpdi0+ZnN5bmNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBNU0VDUyhwcml2LT5pZWVlODAyMTEtPmZzeW5jX3RpbWVfaW50ZXJ2YWwqcHJpdi0+aWVlZTgwMjExLT5mc3luY19tdWx0aXBsZV90aW1laW50ZXJ2YWwpOworCQkJYWRkX3RpbWVyKCZwcml2LT5mc3luY190aW1lcik7CisJCX0KKwkJZWxzZXsKKwkJCWlmKHRpbWVyX3BlbmRpbmcoJnByaXYtPmZzeW5jX3RpbWVyKSkKKwkJCQlkZWxfdGltZXJfc3luYygmcHJpdi0+ZnN5bmNfdGltZXIpOworCQkJcHJpdi0+ZnN5bmNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBNU0VDUyhwcml2LT5pZWVlODAyMTEtPmZzeW5jX3RpbWVfaW50ZXJ2YWwpOworCQkJYWRkX3RpbWVyKCZwcml2LT5mc3luY190aW1lcik7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLy8gTGV0IFJlZ2lzdGVyIHJldHVybiB0byBkZWZhdWx0IHZhbHVlOworCQlpZihwcml2LT5ic3dpdGNoX2ZzeW5jKQorCQl7CisJCQlwcml2LT5ic3dpdGNoX2ZzeW5jICA9IGZhbHNlOworCQkjaWZkZWYgUlRMODE5MFAKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhDMzYsIDB4NDApOworCQkjZWxzZQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweEMzNiwgMHg1Yyk7CisJCSNlbmRpZgorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweEMzZSwgMHg5Nik7CisJCX0KKwkJcHJpdi0+Q29udGl1bmVEaWZmQ291bnQgPSAwOworCSNpZmRlZiBSVEw4MTkwUAorCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjIsIDB4MTY0MDUyY2QpOworCSNlbHNlCisJCXdyaXRlX25pY19kd29yZChkZXYsIHJPRkRNMF9SeERldGVjdG9yMiwgMHg0NjVjNTJjZCk7CisJI2VuZGlmCisJfQorCVJUX1RSQUNFKENPTVBfSEFMRE0sICJDb250aXVuZURpZmZDb3VudCAlZFxuIiwgcHJpdi0+Q29udGl1bmVEaWZmQ291bnQpOworCVJUX1RSQUNFKENPTVBfSEFMRE0sICJyYXRlUmVjb3JkICVkIHJhdGVDb3VudCAlZCwgcmF0ZUNvdW50ZGlmZiAlZCBiU3dpdGNoRnN5bmMgJWRcbiIsIHByaXYtPnJhdGVfcmVjb3JkLCByYXRlX2NvdW50LCByYXRlX2NvdW50X2RpZmYgLCBwcml2LT5ic3dpdGNoX2ZzeW5jKTsKK30KKworc3RhdGljIHZvaWQgZG1fU3RhcnRIV0ZzeW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJUlRfVFJBQ0UoQ09NUF9IQUxETSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCXdyaXRlX25pY19kd29yZChkZXYsIHJPRkRNMF9SeERldGVjdG9yMiwgMHg0NjVjMTJjZik7CisJd3JpdGVfbmljX2J5dGUoZGV2LCAweGMzYiwgMHg0MSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtX0VuZFNXRnN5bmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlSVF9UUkFDRShDT01QX0hBTERNLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZGVsX3RpbWVyX3N5bmMoJihwcml2LT5mc3luY190aW1lcikpOworCisJLy8gTGV0IFJlZ2lzdGVyIHJldHVybiB0byBkZWZhdWx0IHZhbHVlOworCWlmKHByaXYtPmJzd2l0Y2hfZnN5bmMpCisJeworCQlwcml2LT5ic3dpdGNoX2ZzeW5jICA9IGZhbHNlOworCisJCSNpZmRlZiBSVEw4MTkwUAorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweEMzNiwgMHg0MCk7CisJCSNlbHNlCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4QzM2LCAweDVjKTsKKwkJI2VuZGlmCisKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCAweEMzZSwgMHg5Nik7CisJfQorCisJcHJpdi0+Q29udGl1bmVEaWZmQ291bnQgPSAwOworI2lmbmRlZiBSVEw4MTkwUAorCXdyaXRlX25pY19kd29yZChkZXYsIHJPRkRNMF9SeERldGVjdG9yMiwgMHg0NjVjNTJjZCk7CisjZW5kaWYKKworfQorCitzdGF0aWMgdm9pZCBkbV9TdGFydFNXRnN5bmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIAkJCXJhdGVJbmRleDsKKwl1MzIgCQkJcmF0ZUJpdG1hcDsKKworCVJUX1RSQUNFKENPTVBfSEFMRE0sIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCS8vIEluaXRpYWwgcmF0ZSByZWNvcmQgdG8gemVybywgc3RhcnQgdG8gcmVjb3JkLgorCXByaXYtPnJhdGVfcmVjb3JkID0gMDsKKwkvLyBJbml0aWFsIGNvbnRpdW5lIGRpZmYgY291bnQgdG8gemVybywgc3RhcnQgdG8gcmVjb3JkLgorCXByaXYtPkNvbnRpdW5lRGlmZkNvdW50ID0gMDsKKwlwcml2LT5yYXRlQ291bnREaWZmUmVjb3JkID0gMDsKKwlwcml2LT5ic3dpdGNoX2ZzeW5jICA9IGZhbHNlOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5tb2RlID09IFdJUkVMRVNTX01PREVfTl8yNEcpCisJeworCQlwcml2LT5pZWVlODAyMTEtPmZzeW5jX2ZpcnN0ZGlmZl9yYXRldGhyZXNob2xkPSA2MDA7CisJCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc2Vjb25kZGlmZl9yYXRldGhyZXNob2xkID0gMHhmZmZmOworCX0KKwllbHNlCisJeworCQlwcml2LT5pZWVlODAyMTEtPmZzeW5jX2ZpcnN0ZGlmZl9yYXRldGhyZXNob2xkPSAyMDA7CisJCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc2Vjb25kZGlmZl9yYXRldGhyZXNob2xkID0gMjAwOworCX0KKwlmb3IocmF0ZUluZGV4ID0gMDsgcmF0ZUluZGV4IDw9IDI3OyByYXRlSW5kZXgrKykKKwl7CisJCXJhdGVCaXRtYXAgID0gMSA8PCByYXRlSW5kZXg7CisJCWlmKHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfcmF0ZV9iaXRtYXAgJiAgcmF0ZUJpdG1hcCkKKwkJCXByaXYtPnJhdGVfcmVjb3JkICs9IHByaXYtPnN0YXRzLnJlY2VpdmVkX3JhdGVfaGlzdG9ncmFtWzFdW3JhdGVJbmRleF07CisJfQorCWlmKHRpbWVyX3BlbmRpbmcoJnByaXYtPmZzeW5jX3RpbWVyKSkKKwkJZGVsX3RpbWVyX3N5bmMoJnByaXYtPmZzeW5jX3RpbWVyKTsKKwlwcml2LT5mc3luY190aW1lci5leHBpcmVzID0gamlmZmllcyArIE1TRUNTKHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfdGltZV9pbnRlcnZhbCk7CisJYWRkX3RpbWVyKCZwcml2LT5mc3luY190aW1lcik7CisKKyNpZm5kZWYgUlRMODE5MFAKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjIsIDB4NDY1YzEyY2QpOworI2VuZGlmCisKK30KKworc3RhdGljIHZvaWQgZG1fRW5kSFdGc3luYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCVJUX1RSQUNFKENPTVBfSEFMRE0sIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCXdyaXRlX25pY19kd29yZChkZXYsIHJPRkRNMF9SeERldGVjdG9yMiwgMHg0NjVjNTJjZCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCAweGMzYiwgMHg0OSk7CisKK30KKwordm9pZCBkbV9jaGVja19mc3luYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworI2RlZmluZQlSZWdDMzhfRGVmYXVsdAkJCQkwCisjZGVmaW5lCVJlZ0MzOF9Ob25Gc3luY19PdGhlcl9BUAkxCisjZGVmaW5lCVJlZ0MzOF9Gc3luY19BUF9CQ00JCTIKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy91MzIgCQkJZnJhbWVzeW5jQzM0OworCXN0YXRpYyB1OAkJcmVnX2MzOF9TdGF0ZT1SZWdDMzhfRGVmYXVsdDsKKwlzdGF0aWMgdTMyCXJlc2V0X2NudD0wOworCisJUlRfVFJBQ0UoQ09NUF9IQUxETSwgIlJTU0kgJWQgVGltZUludGVydmFsICVkIE11bHRpcGxlVGltZUludGVydmFsICVkXG4iLCBwcml2LT5pZWVlODAyMTEtPmZzeW5jX3Jzc2lfdGhyZXNob2xkLCBwcml2LT5pZWVlODAyMTEtPmZzeW5jX3RpbWVfaW50ZXJ2YWwsIHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfbXVsdGlwbGVfdGltZWludGVydmFsKTsKKwlSVF9UUkFDRShDT01QX0hBTERNLCAiUmF0ZUJpdG1hcCAweCV4IEZpcnN0RGlmZlJhdGVUaHJlc2hvbGQgJWQgU2Vjb25kRGlmZlJhdGVUaHJlc2hvbGQgJWRcbiIsIHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfcmF0ZV9iaXRtYXAsIHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfZmlyc3RkaWZmX3JhdGV0aHJlc2hvbGQsIHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc2Vjb25kZGlmZl9yYXRldGhyZXNob2xkKTsKKworCWlmKAlwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgJiYKKwkJKHByaXYtPmllZWU4MDIxMS0+cEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9DRERfRlNZTkMpKQorCXsKKwkJaWYocHJpdi0+aWVlZTgwMjExLT5iZnN5bmNfZW5hYmxlID09IDApCisJCXsKKwkJCXN3aXRjaChwcml2LT5pZWVlODAyMTEtPmZzeW5jX3N0YXRlKQorCQkJeworCQkJCWNhc2UgRGVmYXVsdF9Gc3luYzoKKwkJCQkJZG1fU3RhcnRIV0ZzeW5jKGRldik7CisJCQkJCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc3RhdGUgPSBIV19Gc3luYzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTV19Gc3luYzoKKwkJCQkJZG1fRW5kU1dGc3luYyhkZXYpOworCQkJCQlkbV9TdGFydEhXRnN5bmMoZGV2KTsKKwkJCQkJcHJpdi0+aWVlZTgwMjExLT5mc3luY19zdGF0ZSA9IEhXX0ZzeW5jOworCQkJCQlicmVhazsKKwkJCQljYXNlIEhXX0ZzeW5jOgorCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJc3dpdGNoKHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc3RhdGUpCisJCQl7CisJCQkJY2FzZSBEZWZhdWx0X0ZzeW5jOgorCQkJCQlkbV9TdGFydFNXRnN5bmMoZGV2KTsKKwkJCQkJcHJpdi0+aWVlZTgwMjExLT5mc3luY19zdGF0ZSA9IFNXX0ZzeW5jOworCQkJCQlicmVhazsKKwkJCQljYXNlIEhXX0ZzeW5jOgorCQkJCQlkbV9FbmRIV0ZzeW5jKGRldik7CisJCQkJCWRtX1N0YXJ0U1dGc3luYyhkZXYpOworCQkJCQlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3N0YXRlID0gU1dfRnN5bmM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU1dfRnN5bmM6CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisKKwkJCX0KKwkJfQorCQlpZihwcml2LT5mcmFtZXN5bmNNb25pdG9yKQorCQl7CisJCQlpZihyZWdfYzM4X1N0YXRlICE9IFJlZ0MzOF9Gc3luY19BUF9CQ00pCisJCQl7CS8vRm9yIGJyb2FkY29tIEFQIHdlIHdyaXRlIGRpZmZlcmVudCBkZWZhdWx0IHZhbHVlCisJCQkJI2lmZGVmIFJUTDgxOTBQCisJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IzLCAweDE1KTsKKwkJCQkjZWxzZQorCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMywgMHg5NSk7CisJCQkJI2VuZGlmCisKKwkJCQlyZWdfYzM4X1N0YXRlID0gUmVnQzM4X0ZzeW5jX0FQX0JDTTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlzd2l0Y2gocHJpdi0+aWVlZTgwMjExLT5mc3luY19zdGF0ZSkKKwkJeworCQkJY2FzZSBIV19Gc3luYzoKKwkJCQlkbV9FbmRIV0ZzeW5jKGRldik7CisJCQkJcHJpdi0+aWVlZTgwMjExLT5mc3luY19zdGF0ZSA9IERlZmF1bHRfRnN5bmM7CisJCQkJYnJlYWs7CisJCQljYXNlIFNXX0ZzeW5jOgorCQkJCWRtX0VuZFNXRnN5bmMoZGV2KTsKKwkJCQlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3N0YXRlID0gRGVmYXVsdF9Gc3luYzsKKwkJCQlicmVhazsKKwkJCWNhc2UgRGVmYXVsdF9Gc3luYzoKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKworCQlpZihwcml2LT5mcmFtZXN5bmNNb25pdG9yKQorCQl7CisJCQlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCisJCQl7CisJCQkJaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8PSBSZWdDMzhfVEgpCisJCQkJeworCQkJCQlpZihyZWdfYzM4X1N0YXRlICE9IFJlZ0MzOF9Ob25Gc3luY19PdGhlcl9BUCkKKwkJCQkJeworCQkJCQkJI2lmZGVmIFJUTDgxOTBQCisJCQkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjMsIDB4MTApOworCQkJCQkJI2Vsc2UKKwkJCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMywgMHg5MCk7CisJCQkJCQkjZW5kaWYKKworCQkJCQkJcmVnX2MzOF9TdGF0ZSA9IFJlZ0MzOF9Ob25Gc3luY19PdGhlcl9BUDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gKFJlZ0MzOF9USCs1KSkKKwkJCQl7CisJCQkJCWlmKHJlZ19jMzhfU3RhdGUpCisJCQkJCXsKKwkJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IzLCBwcml2LT5mcmFtZXN5bmMpOworCQkJCQkJcmVnX2MzOF9TdGF0ZSA9IFJlZ0MzOF9EZWZhdWx0OworCQkJCQkJLy9EYmdQcmludCgiRnN5bmMgaXMgaWRsZSwgcnNzaT49NDAsIHdyaXRlIDB4YzM4ID0gMHgleCBcbiIsIHBIYWxEYXRhLT5mcmFtZXN5bmMpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKHJlZ19jMzhfU3RhdGUpCisJCQkJeworCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMywgcHJpdi0+ZnJhbWVzeW5jKTsKKwkJCQkJcmVnX2MzOF9TdGF0ZSA9IFJlZ0MzOF9EZWZhdWx0OworCQkJCQkvL0RiZ1ByaW50KCJGc3luYyBpcyBpZGxlLCBub3QgY29ubmVjdGVkLCB3cml0ZSAweGMzOCA9IDB4JXggXG4iLCBwSGFsRGF0YS0+ZnJhbWVzeW5jKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYocHJpdi0+ZnJhbWVzeW5jTW9uaXRvcikKKwl7CisJCWlmKHByaXYtPnJlc2V0X2NvdW50ICE9IHJlc2V0X2NudCkKKwkJewkvL0FmdGVyIHNpbGVudCByZXNldCwgdGhlIHJlZ19jMzhfU3RhdGUgd2lsbCBiZSByZXR1cm5lZCB0byBkZWZhdWx0IHZhbHVlCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMywgcHJpdi0+ZnJhbWVzeW5jKTsKKwkJCXJlZ19jMzhfU3RhdGUgPSBSZWdDMzhfRGVmYXVsdDsKKwkJCXJlc2V0X2NudCA9IHByaXYtPnJlc2V0X2NvdW50OworCQkJLy9EYmdQcmludCgicmVnX2MzOF9TdGF0ZSA9IDAgZm9yIHNpbGVudCByZXNldC4gXG4iKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZihyZWdfYzM4X1N0YXRlKQorCQl7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMywgcHJpdi0+ZnJhbWVzeW5jKTsKKwkJCXJlZ19jMzhfU3RhdGUgPSBSZWdDMzhfRGVmYXVsdDsKKwkJCS8vRGJnUHJpbnQoImZyYW1lc3luYyBubyBtb25pdG9yLCB3cml0ZSAweGMzOCA9IDB4JXggXG4iLCBwSGFsRGF0YS0+ZnJhbWVzeW5jKTsKKwkJfQorCX0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjoJZG1fc2hhZG93X2luaXQoKQorICoKKyAqIE92ZXJ2aWV3OglTdG9yZSBhbGwgTklDIE1BQy9CQiByZWdpc3RlciBjb250ZW50LgorICoKKyAqIElucHV0OgkJTk9ORQorICoKKyAqIE91dHB1dDoJCU5PTkUKKyAqCisgKiBSZXR1cm46CQlOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICoJV2hlbgkJV2hvCQlSZW1hcmsKKyAqCTA1LzI5LzIwMDgJYW15CQlDcmVhdGUgVmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIHZvaWQgZG1fc2hhZG93X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OAlwYWdlOworCXUxNglvZmZzZXQ7CisKKwlmb3IgKHBhZ2UgPSAwOyBwYWdlIDwgNTsgcGFnZSsrKQorCQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IDI1Njsgb2Zmc2V0KyspCisJCXsKKwkJCWRtX3NoYWRvd1twYWdlXVtvZmZzZXRdID0gcmVhZF9uaWNfYnl0ZShkZXYsIG9mZnNldCtwYWdlKjI1Nik7CisJCQkvL0RiZ1ByaW50KCJQLSVkL08tJTAyeD0lMDJ4XHJcbiIsIHBhZ2UsIG9mZnNldCwgRE1fU2hhZG93W3BhZ2VdW29mZnNldF0pOworCQl9CisKKwlmb3IgKHBhZ2UgPSA4OyBwYWdlIDwgMTE7IHBhZ2UrKykKKwkJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCAyNTY7IG9mZnNldCsrKQorCQkJZG1fc2hhZG93W3BhZ2VdW29mZnNldF0gPSByZWFkX25pY19ieXRlKGRldiwgb2Zmc2V0K3BhZ2UqMjU2KTsKKworCWZvciAocGFnZSA9IDEyOyBwYWdlIDwgMTU7IHBhZ2UrKykKKwkJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCAyNTY7IG9mZnNldCsrKQorCQkJZG1fc2hhZG93W3BhZ2VdW29mZnNldF0gPSByZWFkX25pY19ieXRlKGRldiwgb2Zmc2V0K3BhZ2UqMjU2KTsKKworfSAgIC8qIGRtX3NoYWRvd19pbml0ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjoJRE1fRHluYW1pY1R4UG93ZXIoKQorICoKKyAqIE92ZXJ2aWV3OglEZXRlY3QgU2lnbmFsIHN0cmVuZ3RoIHRvIGNvbnRyb2wgVFggUmVnaXN0cnkKKwkJCVR4IFBvd2VyIENvbnRyb2wgRm9yIE5lYXIvRmFyIFJhbmdlCisgKgorICogSW5wdXQ6CQlOT05FCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCU5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDMvMDYvMjAwOAlKYWNrZW4JQ3JlYXRlIFZlcnNpb24gMC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBkbV9pbml0X2R5bmFtaWNfdHhwb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCS8vSW5pdGlhbCBUWCBQb3dlciBDb250cm9sIGZvciBuZWFyL2ZhciByYW5nZSAsIGFkZCBieSBhbXkgMjAwOC8wNS8xNSwgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKwlwcml2LT5pZWVlODAyMTEtPmJkeW5hbWljX3R4cG93ZXJfZW5hYmxlID0gdHJ1ZTsgICAgLy9EZWZhdWx0IHRvIGVuYWJsZSBUeCBQb3dlciBDb250cm9sCisJcHJpdi0+Ykxhc3REVFBGbGFnX0hpZ2ggPSBmYWxzZTsKKwlwcml2LT5iTGFzdERUUEZsYWdfTG93ID0gZmFsc2U7CisJcHJpdi0+YkR5bmFtaWNUeEhpZ2hQb3dlciA9IGZhbHNlOworCXByaXYtPmJEeW5hbWljVHhMb3dQb3dlciA9IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBkbV9keW5hbWljX3R4cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdW5zaWduZWQgaW50IHR4aGlwb3dlcl90aHJlc2hob2xkPTA7CisJdW5zaWduZWQgaW50IHR4bG93cG93ZXJfdGhyZXNob2xkPTA7CisJaWYocHJpdi0+aWVlZTgwMjExLT5iZHluYW1pY190eHBvd2VyX2VuYWJsZSAhPSB0cnVlKQorCXsKKwkJcHJpdi0+YkR5bmFtaWNUeEhpZ2hQb3dlciA9IGZhbHNlOworCQlwcml2LT5iRHluYW1pY1R4TG93UG93ZXIgPSBmYWxzZTsKKwkJcmV0dXJuOworCX0KKwkvL3ByaW50aygicHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsudW5rbm93bl9jYXBfZXhpc3QgaXMgJWQgLHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJyb2FkY29tX2NhcF9leGlzdCBpcyAlZFxuIixwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay51bmtub3duX2NhcF9leGlzdCxwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5icm9hZGNvbV9jYXBfZXhpc3QpOworCWlmKChwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5hdGhlcm9zX2NhcF9leGlzdCApICYmIChwcml2LT5pZWVlODAyMTEtPm1vZGUgPT0gSUVFRV9HKSl7CisJCXR4aGlwb3dlcl90aHJlc2hob2xkID0gVFhfUE9XRVJfQVRIRVJPQVBfVEhSRVNIX0hJR0g7CisJCXR4bG93cG93ZXJfdGhyZXNob2xkID0gVFhfUE9XRVJfQVRIRVJPQVBfVEhSRVNIX0xPVzsKKwl9CisJZWxzZQorCXsKKwkJdHhoaXBvd2VyX3RocmVzaGhvbGQgPSBUWF9QT1dFUl9ORUFSX0ZJRUxEX1RIUkVTSF9ISUdIOworCQl0eGxvd3Bvd2VyX3RocmVzaG9sZCA9IFRYX1BPV0VSX05FQVJfRklFTERfVEhSRVNIX0xPVzsKKwl9CisKKy8vCXByaW50aygiPT09PT09PT4lcygpOiB0eGhpcG93ZXJfdGhyZXNoaG9sZCBpcyAlZCx0eGxvd3Bvd2VyX3RocmVzaG9sZCBpcyAlZFxuIixfX0ZVTkNUSU9OX18sdHhoaXBvd2VyX3RocmVzaGhvbGQsdHhsb3dwb3dlcl90aHJlc2hvbGQpOworCVJUX1RSQUNFKENPTVBfVFhBR0MsInByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPSAlbGQgXG4iICwgcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYik7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCisJeworCQlpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IHR4aGlwb3dlcl90aHJlc2hob2xkKQorCQl7CisJCQlwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyID0gdHJ1ZTsKKwkJCXByaXYtPmJEeW5hbWljVHhMb3dQb3dlciA9IGZhbHNlOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gaGlnaCBwb3dlciBzdGF0ZSBjaGVjaworCQkJaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IHR4bG93cG93ZXJfdGhyZXNob2xkICYmIHByaXYtPmJEeW5hbWljVHhIaWdoUG93ZXIgPT0gdHJ1ZSkKKwkJCXsKKwkJCQlwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyID0gZmFsc2U7CisJCQl9CisJCQkvLyBsb3cgcG93ZXIgc3RhdGUgY2hlY2sKKwkJCWlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCAzNSkKKwkJCXsKKwkJCQlwcml2LT5iRHluYW1pY1R4TG93UG93ZXIgPSB0cnVlOworCQkJfQorCQkJZWxzZSBpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IDQwKQorCQkJeworCQkJCXByaXYtPmJEeW5hbWljVHhMb3dQb3dlciA9IGZhbHNlOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCS8vcEhhbERhdGEtPmJUWFBvd2VyQ3RybGZvck5lYXJGYXJSYW5nZSA9ICFwSGFsRGF0YS0+YlRYUG93ZXJDdHJsZm9yTmVhckZhclJhbmdlOworCQlwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyID0gZmFsc2U7CisJCXByaXYtPmJEeW5hbWljVHhMb3dQb3dlciA9IGZhbHNlOworCX0KKworCWlmKCAocHJpdi0+YkR5bmFtaWNUeEhpZ2hQb3dlciAhPSBwcml2LT5iTGFzdERUUEZsYWdfSGlnaCApIHx8CisJCShwcml2LT5iRHluYW1pY1R4TG93UG93ZXIgIT0gcHJpdi0+Ykxhc3REVFBGbGFnX0xvdyApICkKKwl7CisJCVJUX1RSQUNFKENPTVBfVFhBR0MsIlNldFR4UG93ZXJMZXZlbDgxOTAoKSAgY2hhbm5lbCA9ICVkIFxuIiAsIHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCisjaWYgIGRlZmluZWQoUlRMODE5MFApIHx8IGRlZmluZWQoUlRMODE5MkUpCisJCVNldFR4UG93ZXJMZXZlbDgxOTAoQWRhcHRlcixwSGFsRGF0YS0+Q3VycmVudENoYW5uZWwpOworI2VuZGlmCisKKyNpZmRlZiBSVEw4MTkyVQorCQlydGw4MTkyX3BoeV9zZXRUeFBvd2VyKGRldixwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwkJLy9wSGFsRGF0YS0+YlN0YXJ0VHhDdHJsQnlUUENORlIgPSBGQUxTRTsgICAgLy9DbGVhciB0aCBmbGFnIG9mIFNldCBUWCBQb3dlciBmcm9tIFNpdGVzdXJ2ZXkKKyNlbmRpZgorCX0KKwlwcml2LT5iTGFzdERUUEZsYWdfSGlnaCA9IHByaXYtPmJEeW5hbWljVHhIaWdoUG93ZXI7CisJcHJpdi0+Ykxhc3REVFBGbGFnX0xvdyA9IHByaXYtPmJEeW5hbWljVHhMb3dQb3dlcjsKKworfQkvKiBkbV9keW5hbWljX3R4cG93ZXIgKi8KKworLy9hZGRlZCBieSB2aXZpLCBmb3IgcmVhZCB0eCByYXRlIGFuZCByZXRyeWNvdW50CitzdGF0aWMgdm9pZCBkbV9jaGVja190eHJhdGVhbmRyZXRyeWNvdW50KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwkvL2ZvciAxMW4gdHggcmF0ZQorLy8JcHJpdi0+c3RhdHMuQ3VycmVudFNob3dUeGF0ZSA9IHJlYWRfbmljX2J5dGUoZGV2LCBDdXJyZW50X1R4X1JhdGVfUmVnKTsKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLkN1cnJlbnRTaG93VHhhdGUgPSByZWFkX25pY19ieXRlKGRldiwgQ3VycmVudF9UeF9SYXRlX1JlZyk7CisJLy9wcmludGsoIj09PT09PT09PT09PT0+dHhfcmF0ZV9yZWc6JXhcbiIsIGllZWUtPnNvZnRtYWNfc3RhdHMuQ3VycmVudFNob3dUeGF0ZSk7CisJLy9mb3IgaW5pdGlhbCB0eCByYXRlCisvLwlwcml2LT5zdGF0cy5sYXN0X3BhY2tldF9yYXRlID0gcmVhZF9uaWNfYnl0ZShkZXYsIEluaXRpYWxfVHhfUmF0ZV9SZWcpOworCWllZWUtPnNvZnRtYWNfc3RhdHMubGFzdF9wYWNrZXRfcmF0ZSA9IHJlYWRfbmljX2J5dGUoZGV2ICxJbml0aWFsX1R4X1JhdGVfUmVnKTsKKwkvL2ZvciB0eCB0eCByZXRyeSBjb3VudAorLy8JcHJpdi0+c3RhdHMudHhyZXRyeWNvdW50ID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBUeF9SZXRyeV9Db3VudF9SZWcpOworCWllZWUtPnNvZnRtYWNfc3RhdHMudHhyZXRyeWNvdW50ID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBUeF9SZXRyeV9Db3VudF9SZWcpOworfQorCitzdGF0aWMgdm9pZCBkbV9zZW5kX3Jzc2lfdG9mdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCURDTURfVFhDTURfVAkJCXR4X2NtZDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwkvLyBJZiB3ZSB0ZXN0IGNoYXJpb3QsIHdlIHNob3VsZCBzdG9wIHRoZSBUWCBjb21tYW5kID8KKwkvLyBCZWNhdXNlIDkyRSB3aWxsIGFsd2F5cyBzaWxlbnQgcmVzZXQgd2hlbiB3ZSBzZW5kIHR4IGNvbW1hbmQuIFdlIHVzZSByZWdpc3RlcgorCS8vIDB4MWUwKGJ5dGUpIHRvIGJvdGlmeSBkcml2ZXIuCisJd3JpdGVfbmljX2J5dGUoZGV2LCBEUklWRVJfUlNTSSwgKHU4KXByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIpOworCXJldHVybjsKKwl0eF9jbWQuT3AJCT0gVFhDTURfU0VUX1JYX1JTU0k7CisJdHhfY21kLkxlbmd0aAk9IDQ7CisJdHhfY21kLlZhbHVlCQk9IHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGI7CisKKwljbXBrX21lc3NhZ2VfaGFuZGxlX3R4KGRldiwgKHU4KikmdHhfY21kLAorCQkJCQkJCQlERVNDX1BBQ0tFVF9UWVBFX0lOSVQsIHNpemVvZihEQ01EX1RYQ01EX1QpKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZWI1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmgKQEAgLTAsMCArMSwyNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJQ29weXJpZ2h0KGMpIDIwMDcsICBSZWFsVEVLIFRlY2hub2xvZ3kgSW5jLiBBbGwgUmlnaHQgUmVzZXJ2ZWQuCisgKgorICogTW9kdWxlOgkJSGFsODE5eFVzYkRNLmgJKFJUTDgxOTIgIEhlYWRlciBIIEZpbGUpCisgKgorICoKKyAqIE5vdGU6CQlGb3IgZHluYW1pYyBjb250cm9sIGRlZmluaXRpb24gY29uc3RhbnQgc3RydWN0dXJlLgorICoKKyAqCisgKiBFeHBvcnQ6CisgKgorICogQWJicmV2OgorICoKKyAqIEhpc3Rvcnk6CisgKglEYXRhCQlXaG8JCVJlbWFyaworICoJMTAvMDQvMjAwNyAgTUhDICAgIAlDcmVhdGUgaW5pdGlhbCB2ZXJzaW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAvKiBDaGVjayB0byBzZWUgaWYgdGhlIGZpbGUgaGFzIGJlZW4gaW5jbHVkZWQgYWxyZWFkeS4gICovCisjaWZuZGVmCV9fUjgxOTJVRE1fSF9fCisjZGVmaW5lIF9fUjgxOTJVRE1fSF9fCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBQYXJhbWV0ZXJzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlETV9ESUdfVEhSRVNIX0hJR0gJCQkJCTQwCisjZGVmaW5lCQlETV9ESUdfVEhSRVNIX0xPVwkJCQkJMzUKKworI2RlZmluZQkJRE1fRElHX0hJR0hfUFdSX1RIUkVTSF9ISUdICQk3NQorI2RlZmluZQkJRE1fRElHX0hJR0hfUFdSX1RIUkVTSF9MT1cJCTcwCisKKyNkZWZpbmUJCUJXX0FVVE9fU1dJVENIX0hJR0hfTE9XCQkJMjUKKyNkZWZpbmUJCUJXX0FVVE9fU1dJVENIX0xPV19ISUdICQkJMzAKKworI2RlZmluZQkJRE1fY2hlY2tfZnN5bmNfdGltZV9pbnRlcnZhbAkJCQk1MDAKKworCisjZGVmaW5lCQlETV9ESUdfQkFDS09GRgkJCQkxMgorI2RlZmluZQkJRE1fRElHX01BWAkJCQkJMHgzNgorI2RlZmluZQkJRE1fRElHX01JTgkJCQkJMHgxYworI2RlZmluZQkJRE1fRElHX01JTl9OZXRjb3JlCQkJMHgxMgorCisjZGVmaW5lCQlSeFBhdGhTZWxlY3Rpb25fU1NfVEhfbG93CQkzMAorI2RlZmluZQkJUnhQYXRoU2VsZWN0aW9uX2RpZmZfVEgJCQkxOAorCisjZGVmaW5lCQlSYXRlQWRhcHRpdmVUSF9IaWdoCQkJNTAKKyNkZWZpbmUJCVJhdGVBZGFwdGl2ZVRIX0xvd18yME0JCTMwCisjZGVmaW5lCQlSYXRlQWRhcHRpdmVUSF9Mb3dfNDBNCQkxMAorI2RlZmluZQkJVmVyeUxvd1JTU0kJCQkJCTE1CisjZGVmaW5lCQlDVFNUb1NlbGZUSFZhbAkJCQkJMzAKKworLy9kZWZpbmVkIGJ5IHZpdmksIGZvciB0eCBwb3dlciB0cmFjaworI2RlZmluZQkJRV9GT1JfVFhfUE9XRVJfVFJBQ0sgICAgICAgICAgICAgICAzMDAKKy8vRHluYW1pYyBUeCBQb3dlciBDb250cm9sIFRocmVzaG9sZAorI2RlZmluZQkJVFhfUE9XRVJfTkVBUl9GSUVMRF9USFJFU0hfSElHSAkJNjgKKyNkZWZpbmUJCVRYX1BPV0VSX05FQVJfRklFTERfVEhSRVNIX0xPVwkJNjIKKy8vYWRkZWQgYnkgYW15IGZvciBhdGhlcm9zIEFQCisjZGVmaW5lICAgICAgICAgVFhfUE9XRVJfQVRIRVJPQVBfVEhSRVNIX0hJR0ggICAgICAgICAgIDc4CisjZGVmaW5lIAlUWF9QT1dFUl9BVEhFUk9BUF9USFJFU0hfTE9XCQk3MgorCisvL2RlZmluZWQgYnkgdml2aSwgZm9yIHNob3dpbmcgb24gVUkKKyNkZWZpbmUgCQlDdXJyZW50X1R4X1JhdGVfUmVnICAgICAgICAgMHgxYjgKKyNkZWZpbmUgCQlJbml0aWFsX1R4X1JhdGVfUmVnICAgICAgICAgCSAgMHgxYjkKKyNkZWZpbmUgCQlUeF9SZXRyeV9Db3VudF9SZWcgICAgICAgICAweDFhYworI2RlZmluZQkJUmVnQzM4X1RICQkJCSAyMAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBQYXJhbWV0ZXJzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgc3RydWN0dXJlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAyMDA3LzEwLzA0IE1IIERlZmluZSB1cHBlciBhbmQgbG93ZXIgdGhyZXNob2xkIG9mIERJRyBlbmFibGUgb3IgZGlzYWJsZS4gKi8KK3R5cGVkZWYgc3RydWN0IF9keW5hbWljX2luaXRpYWxfZ2Fpbl90aHJlc2hvbGRfCit7CisJdTgJCWRpZ19lbmFibGVfZmxhZzsKKwl1OAkJZGlnX2FsZ29yaXRobTsKKwl1OAkJZGJnX21vZGU7CisJdTgJCWRpZ19hbGdvcml0aG1fc3dpdGNoOworCisJbG9uZwkJcnNzaV9sb3dfdGhyZXNoOworCWxvbmcJCXJzc2lfaGlnaF90aHJlc2g7CisKKwlsb25nCQlyc3NpX2hpZ2hfcG93ZXJfbG93dGhyZXNoOworCWxvbmcJCXJzc2lfaGlnaF9wb3dlcl9oaWdodGhyZXNoOworCisJdTgJCWRpZ19zdGF0ZTsKKwl1OAkJZGlnX2hpZ2hwd3Jfc3RhdGU7CisJdTgJCWN1cl9jb25uZWN0X3N0YXRlOworCXU4CQlwcmVfY29ubmVjdF9zdGF0ZTsKKworCXU4CQljdXJwZF90aHN0YXRlOworCXU4CQlwcmVwZF90aHN0YXRlOworCXU4CQljdXJjc19yYXRpb19zdGF0ZTsKKwl1OAkJcHJlY3NfcmF0aW9fc3RhdGU7CisKKwl1MzIJCXByZV9pZ192YWx1ZTsKKwl1MzIJCWN1cl9pZ192YWx1ZTsKKworCXU4CQliYWNrb2ZmX3ZhbDsKKwl1OAkJcnhfZ2Fpbl9yYW5nZV9tYXg7CisJdTgJCXJ4X2dhaW5fcmFuZ2VfbWluOworCWJvb2wJCWluaXRpYWxnYWluX2xvd2VyYm91bmRfc3RhdGU7CisKKwlsb25nCQlyc3NpX3ZhbDsKK31kaWdfdDsKKwordHlwZWRlZiBlbnVtIHRhZ19keW5hbWljX2luaXRfZ2Fpbl9zdGF0ZV9kZWZpbml0aW9uCit7CisJRE1fU1RBX0RJR19PRkYgPSAwLAorCURNX1NUQV9ESUdfT04sCisJRE1fU1RBX0RJR19NQVgKK31kbV9kaWdfc3RhX2U7CisKKworLyogMjAwNy8xMC8wOCBNSCBEZWZpbmUgUkFUUiBzdGF0ZS4gKi8KK3R5cGVkZWYgZW51bSB0YWdfZHluYW1pY19yYXRyX3N0YXRlX2RlZmluaXRpb24KK3sKKwlETV9SQVRSX1NUQV9ISUdIID0gMCwKKwlETV9SQVRSX1NUQV9NSURETEUgPSAxLAorCURNX1JBVFJfU1RBX0xPVyA9IDIsCisJRE1fUkFUUl9TVEFfTUFYCit9ZG1fcmF0cl9zdGFfZTsKKworLyogMjAwNy8xMC8xMSBNSCBEZWZpbmUgRElHIG9wZXJhdGlvbiB0eXBlLiAqLwordHlwZWRlZiBlbnVtIHRhZ19keW5hbWljX2luaXRfZ2Fpbl9vcGVyYXRpb25fdHlwZV9kZWZpbml0aW9uCit7CisJRElHX1RZUEVfVEhSRVNIX0hJR0gJPSAwLAorCURJR19UWVBFX1RIUkVTSF9MT1cJPSAxLAorCURJR19UWVBFX1RIUkVTSF9ISUdIUFdSX0hJR0gJPSAyLAorCURJR19UWVBFX1RIUkVTSF9ISUdIUFdSX0xPVwk9IDMsCisJRElHX1RZUEVfREJHX01PREUJCQkJPSA0LAorCURJR19UWVBFX1JTU0kJCQkJCQk9IDUsCisJRElHX1RZUEVfQUxHT1JJVEhNCQkJCT0gNiwKKwlESUdfVFlQRV9CQUNLT0ZGCQkJCQk9IDcsCisJRElHX1RZUEVfUFdEQl9GQUNUT1IJCQk9IDgsCisJRElHX1RZUEVfUlhfR0FJTl9NSU4JCQkJPSA5LAorCURJR19UWVBFX1JYX0dBSU5fTUFYCQkJCT0gMTAsCisJRElHX1RZUEVfRU5BQkxFIAkJPSAyMCwKKwlESUdfVFlQRV9ESVNBQkxFIAkJPSAzMCwKKwlESUdfT1BfVFlQRV9NQVgKK31kbV9kaWdfb3BfZTsKKwordHlwZWRlZiBlbnVtIHRhZ19kaWdfYWxnb3JpdGhtX2RlZmluaXRpb24KK3sKKwlESUdfQUxHT19CWV9GQUxTRV9BTEFSTSA9IDAsCisJRElHX0FMR09fQllfUlNTSQk9IDEsCisJRElHX0FMR09fTUFYCit9ZG1fZGlnX2FsZ19lOworCit0eXBlZGVmIGVudW0gdGFnX2RpZ19kYmdtb2RlX2RlZmluaXRpb24KK3sKKwlESUdfREJHX09GRiA9IDAsCisJRElHX0RCR19PTiA9IDEsCisJRElHX0RCR19NQVgKK31kbV9kaWdfZGJnX2U7CisKK3R5cGVkZWYgZW51bSB0YWdfZGlnX2Nvbm5lY3RfZGVmaW5pdGlvbgoreworCURJR19ESVNDT05ORUNUID0gMCwKKwlESUdfQ09OTkVDVCA9IDEsCisJRElHX0NPTk5FQ1RfTUFYCit9ZG1fZGlnX2Nvbm5lY3RfZTsKKwordHlwZWRlZiBlbnVtIHRhZ19kaWdfcGFja2V0ZGV0ZWN0aW9uX3RocmVzaG9sZF9kZWZpbml0aW9uCit7CisJRElHX1BEX0FUX0xPV19QT1dFUiA9IDAsCisJRElHX1BEX0FUX05PUk1BTF9QT1dFUiA9IDEsCisJRElHX1BEX0FUX0hJR0hfUE9XRVIgPSAyLAorCURJR19QRF9NQVgKK31kbV9kaWdfcGRfdGhfZTsKKwordHlwZWRlZiBlbnVtIHRhZ19kaWdfY2NrX2NzX3JhdGlvX3N0YXRlX2RlZmluaXRpb24KK3sKKwlESUdfQ1NfUkFUSU9fTE9XRVIgPSAwLAorCURJR19DU19SQVRJT19ISUdIRVIgPSAxLAorCURJR19DU19NQVgKK31kbV9kaWdfY3NfcmF0aW9fZTsKK3R5cGVkZWYgc3RydWN0IF9EeW5hbWljX1J4X1BhdGhfU2VsZWN0aW9uXworeworCXU4CQlFbmFibGU7CisJdTgJCURiZ01vZGU7CisJdTgJCWNja19tZXRob2Q7CisJdTgJCWNja19SeF9wYXRoOworCisJdTgJCVNTX1RIX2xvdzsKKwl1OAkJZGlmZl9USDsKKwl1OAkJZGlzYWJsZWRSRjsKKwl1OAkJcmVzZXJ2ZWQ7CisKKwl1OAkJcmZfcnNzaVs0XTsKKwl1OAkJcmZfZW5hYmxlX3Jzc2lfdGhbNF07CisJbG9uZwkJY2NrX3B3ZGJfc3RhWzRdOworfURSeFBhdGhTZWw7CisKK3R5cGVkZWYgZW51bSB0YWdfQ0NLX1J4X1BhdGhfTWV0aG9kX0RlZmluaXRpb24KK3sKKwlDQ0tfUnhfVmVyc2lvbl8xID0gMCwKKwlDQ0tfUnhfVmVyc2lvbl8yPSAxLAorCUNDS19SeF9WZXJzaW9uX01BWAorfURNX0NDS19SeF9QYXRoX01ldGhvZDsKKwordHlwZWRlZiBlbnVtIHRhZ19ETV9EYmdNb2RlX0RlZmluaXRpb24KK3sKKwlETV9EQkdfT0ZGID0gMCwKKwlETV9EQkdfT04gPSAxLAorCURNX0RCR19NQVgKK31ETV9EQkdfRTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnX1R4X0NvbmZpZ19DbWRfRm9ybWF0Cit7CisJdTMyCU9wOwkJCQkJCQkJCQkvKiBDb21tYW5kIHBhY2tldCB0eXBlLiAqLworCXUzMglMZW5ndGg7CQkJCQkJCQkJLyogQ29tbWFuZCBwYWNrZXQgbGVuZ3RoLiAqLworCXUzMglWYWx1ZTsKK31EQ01EX1RYQ01EX1QsICpQRENNRF9UWENNRF9UOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgc3RydWN0dXJlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4JZGlnX3QJZG1fZGlndGFibGU7CitleHRlcm4JdTgJCWRtX3NoYWRvd1sxNl1bMjU2XTsKK2V4dGVybiBEUnhQYXRoU2VsICAgICAgRE1fUnhQYXRoU2VsVGFibGU7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBNYXJjbyBEZWZpbml0aW9uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgTWFyY28gRGVmaW5pdGlvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydGVkIEZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4gIHZvaWQgICAgaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gIHZvaWQgZGVpbml0X2hhbF9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworZXh0ZXJuIHZvaWQgaGFsX2RtX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitleHRlcm4gIHZvaWQgICAgaW5pdF9yYXRlX2FkYXB0aXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuICB2b2lkICAgIGRtX3R4cG93ZXJfdHJhY2tpbmdjYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworZXh0ZXJuICB2b2lkICAgIGRtX3Jlc3RvcmVfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gIHZvaWQgICAgZG1fYmFja3VwX2R5bmFtaWNfbWVjaGFuaXNtX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuICB2b2lkICAgIGRtX2NoYW5nZV9keW5hbWljX2luaXRnYWluX3RocmVzaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJCQl1MzIgZG1fdHlwZSwgdTMyIGRtX3ZhbHVlKTsKK2V4dGVybiAgdm9pZCAgICBkbV9mb3JjZV90eF9md19pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTMyIGZvcmNlX3R5cGUsIHUzMiBmb3JjZV92YWx1ZSk7CitleHRlcm4gIHZvaWQgICAgZG1faW5pdF9lZGNhX3R1cmJvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuICB2b2lkICAgIGRtX3JmX29wZXJhdGlvbl90ZXN0X2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gIHZvaWQgICAgZG1fcmZfcGF0aGNoZWNrX3dvcmtpdGVtY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK2V4dGVybiAgdm9pZCBkbV9mc3luY190aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOworZXh0ZXJuCXZvaWQJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsYm9vbCAgYmluY2gxNCk7CitleHRlcm4gIHZvaWQgICAgZG1fc2hhZG93X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkbV9pbml0aWFsaXplX3R4cG93ZXJfdHJhY2tpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0ZWQgRnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisjZW5kaWYJLypfX1I4MTkyVURNX0hfXyAqLworCisKKy8qIEVuZCBvZiByODE5MlVfZG0uaCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2h3LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2h3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg5YWFmNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfaHcuaApAQCAtMCwwICsxLDQxMSBAQAorLyoKKwlUaGlzIGlzIHBhcnQgb2YgcnRsODE4NyBPcGVuU291cmNlIGRyaXZlci4KKwlDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZQorCW9mZmljaWFsIFJlYWx0ZWsgZHJpdmVyLgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KKwlmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24uCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MKKwkyMTAwIEdQTCBkcml2ZXIuCisKKwlXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHRob3NlIHByb2plY3RzCisJYW5kIHRoZSBOZGlzd3JhcHBlciBwcm9qZWN0IEF1dGhvcnMuCisqLworCisvKiBNYXJpdXN6IE1hdHVzemVrIGFkZGVkIGZ1bGwgcmVnaXN0ZXJzIGRlZmluaXRpb24gd2l0aCBSZWFsdGVrJ3MgbmFtZSAqLworCisvKiB0aGlzIGZpbGUgY29udGFpbnMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBydGw4MTg3IE1BQyBjb250cm9sbGVyICovCisjaWZuZGVmIFI4MTkyX0hXCisjZGVmaW5lIFI4MTkyX0hXCisKK3R5cGVkZWYgZW51bSBfVkVSU0lPTl84MTl4VXsKKwlWRVJTSU9OXzgxOXhVX0EsIC8vIEEtY3V0CisJVkVSU0lPTl84MTl4VV9CLCAvLyBCLWN1dAorCVZFUlNJT05fODE5eFVfQywvLyBDLWN1dAorfVZFUlNJT05fODE5eFUsKlBWRVJTSU9OXzgxOXhVOworLy9hZGRlZCBmb3IgZGlmZmVyZW50IFJGIHR5cGUKK3R5cGVkZWYgZW51bSBfUlRfUkZfVFlQRV9ERUYKK3sKKwlSRl8xVDJSID0gMCwKKwlSRl8yVDRSLAorCisJUkZfODE5WF9NQVhfVFlQRQorfVJUX1JGX1RZUEVfREVGOworCisKK3R5cGVkZWYgZW51bSBfQmFzZUJhbmRfQ29uZmlnX1R5cGV7CisJQmFzZUJhbmRfQ29uZmlnX1BIWV9SRUcgPSAwLAkJCS8vUmFkaW8gUGF0aCBBCisJQmFzZUJhbmRfQ29uZmlnX0FHQ19UQUIgPSAxLAkJCS8vUmFkaW8gUGF0aCBCCit9QmFzZUJhbmRfQ29uZmlnX1R5cGUsICpQQmFzZUJhbmRfQ29uZmlnX1R5cGU7CisjZGVmaW5lCVJUTDgxODdfUkVRVF9SRUFECTB4YzAKKyNkZWZpbmUJUlRMODE4N19SRVFUX1dSSVRFCTB4NDAKKyNkZWZpbmUJUlRMODE4N19SRVFfR0VUX1JFR1MJMHgwNQorI2RlZmluZQlSVEw4MTg3X1JFUV9TRVRfUkVHUwkweDA1CisKKyNkZWZpbmUgTUFYX1RYX1VSQiA1CisjZGVmaW5lIE1BWF9SWF9VUkIgMTYKKworI2RlZmluZSBSODE4MF9NQVhfUkVUUlkgMjU1CisvLyNkZWZpbmUgTUFYX1JYX05PUk1BTF9VUkIgMworLy8jZGVmaW5lIE1BWF9SWF9DT01NQU5EX1VSQiAyCisjZGVmaW5lIFJYX1VSQl9TSVpFIDkxMDAKKworI2RlZmluZSBCQl9BTlRBVFRFTl9DSEFOMTQJMHgwYworI2RlZmluZSBCQl9BTlRFTk5BX0IgMHg0MAorCisjZGVmaW5lIEJCX0hPU1RfQkFORyAoMTw8MzApCisjZGVmaW5lIEJCX0hPU1RfQkFOR19FTiAoMTw8MikKKyNkZWZpbmUgQkJfSE9TVF9CQU5HX0NMSyAoMTw8MSkKKyNkZWZpbmUgQkJfSE9TVF9CQU5HX1JXICgxPDwzKQorI2RlZmluZSBCQl9IT1NUX0JBTkdfREFUQQkgMQorCisvLyNpZiAoUlRMODE5WF9GUEdBX1ZFUiAmIFJUTDgxOVhfRlBHQV9WSVZJXzA3MDkyMCkKKyNkZWZpbmUgQUZSCQkJMHgwMTAKKyNkZWZpbmUgQUZSX0NhcmRCRW4JCSgxPDwwKQorI2RlZmluZSBBRlJfQ0xLUlVOX1NFTAkJKDE8PDEpCisjZGVmaW5lIEFGUl9GdW5jUmVnRW4JCSgxPDwyKQorI2RlZmluZSBSVEw4MTkwX0VFUFJPTV9JRAkweDgxMjkKKyNkZWZpbmUgRUVQUk9NX1ZJRAkJMHgwMgorI2RlZmluZSBFRVBST01fUElECQkweDA0CisjZGVmaW5lIEVFUFJPTV9OT0RFX0FERFJFU1NfQllURV8wCTB4MEMKKworI2RlZmluZSBFRVBST01fVHhQb3dlckRpZmYJMHgxRgorI2RlZmluZSBFRVBST01fVGhlcm1hbE1ldGVyCTB4MjAKKyNkZWZpbmUgRUVQUk9NX1B3RGlmZgkJMHgyMQkvLzB4MjEKKyNkZWZpbmUgRUVQUk9NX0NyeXN0YWxDYXAJMHgyMgkvLzB4MjIKKworI2RlZmluZSBFRVBST01fVHhQd0luZGV4X0NDSwkweDIzCS8vMHgyMworI2RlZmluZSBFRVBST01fVHhQd0luZGV4X09GRE1fMjRHCTB4MjQJLy8weDI0fjB4MjYKKyNkZWZpbmUgRUVQUk9NX1R4UHdJbmRleF9DQ0tfVjEJCTB4MjkJLy8weDI5fjB4MkIKKyNkZWZpbmUgRUVQUk9NX1R4UHdJbmRleF9PRkRNXzI0R19WMQkweDJDCS8vMHgyQ34weDJFCisjZGVmaW5lIEVFUFJPTV9UeFB3SW5kZXhfVmVyCQkweDI3CS8vMHgyNworCisjZGVmaW5lIEVFUFJPTV9EZWZhdWx0X1R4UG93ZXJEaWZmCQkweDAKKyNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfVGhlcm1hbE1ldGVyCQkweDcKKyNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfUHdEaWZmCQkJMHg0CisjZGVmaW5lIEVFUFJPTV9EZWZhdWx0X0NyeXN0YWxDYXAJCTB4NQorI2RlZmluZSBFRVBST01fRGVmYXVsdF9UeFBvd2VyCQkJMHgxMDEwCisjZGVmaW5lIEVFUFJPTV9DdXN0b21lcl9JRAkJCTB4N0IJLy8weDdCOkN1c3RvbWVySUQKKyNkZWZpbmUgRUVQUk9NX0NoYW5uZWxQbGFuCQkJMHgxNgkvLzB4N0MKKyNkZWZpbmUgRUVQUk9NX0lDX1ZFUgkJCQkweDdkCS8vMHg3RAorI2RlZmluZSBFRVBST01fQ1JDCQkJCTB4N2UJLy8weDdFfjB4N0YKKworI2RlZmluZSBFRVBST01fQ0lEX0RFRkFVTFQJCQkweDAKKyNkZWZpbmUgRUVQUk9NX0NJRF9DQU1FTwkJCQkweDEKKyNkZWZpbmUgRUVQUk9NX0NJRF9SVU5UT1AJCQkJMHgyCisjZGVmaW5lIEVFUFJPTV9DSURfU2VuYW8JCQkJMHgzCisjZGVmaW5lIEVFUFJPTV9DSURfVE9TSElCQQkJCQkweDQJLy8gVG9zaGliYSBzZXR0aW5nLCBNZXJnZSBieSBKYWNrZW4sIDIwMDgvMDEvMzEKKyNkZWZpbmUgRUVQUk9NX0NJRF9OZXRDb3JlCQkJCTB4NQorI2RlZmluZSBFRVBST01fQ0lEX05ldHRyb25peAkJCTB4NgorI2RlZmluZSBFRVBST01fQ0lEX1Byb25ldAkJCQkweDcKKyNkZWZpbmUgRUVQUk9NX0NJRF9ETElOSwkJCQkweDgKKworI2RlZmluZSBBQ19QQVJBTV9UWE9QX0xJTUlUX09GRlNFVAkxNgorI2RlZmluZSBBQ19QQVJBTV9FQ1dfTUFYX09GRlNFVAkJMTIKKyNkZWZpbmUgQUNfUEFSQU1fRUNXX01JTl9PRkZTRVQJCTgKKyNkZWZpbmUgQUNfUEFSQU1fQUlGU19PRkZTRVQJCTAKKworLy8jZW5kaWYKK2VudW0gX1JUTDgxOTJVc2JfSFcgeworCisJUENJRgkJCT0gMHgwMDksIC8vIFBDSSBGdW5jdGlvbiBSZWdpc3RlciAweDAwMDlofjB4MDAwYmgKKyNkZWZpbmUJQkJfR0xPQkFMX1JFU0VUX0JJVAkweDEKKwlCQl9HTE9CQUxfUkVTRVQJCT0gMHgwMjAsIC8vIEJhc2ViYW5kR2xvYmFsIFJlc2V0IFJlZ2lzdGVyCisJQlNTSURSCQkJPSAweDAyRSwgLy8gQlNTSUQgUmVnaXN0ZXIKKwlDTURSCQkJPSAweDAzNywgLy8gQ29tbWFuZCByZWdpc3RlcgorI2RlZmluZSBDUl9SU1QJCQkweDEwCisjZGVmaW5lIENSX1JFCQkJMHgwOAorI2RlZmluZSBDUl9URQkJCTB4MDQKKyNkZWZpbmUgQ1JfTXVsUlcJCTB4MDEKKwlTSUZTCQkJPSAweDAzRSwgLy8gU0lGUyByZWdpc3RlcgorCVRDUgkJCT0gMHgwNDAsIC8vIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKworI2RlZmluZSBUQ1JfTVhETUFfMjA0OCAJCTcKKyNkZWZpbmUgVENSX0xSTF9PRkZTRVQJCTAKKyNkZWZpbmUgVENSX1NSTF9PRkZTRVQJCTgKKyNkZWZpbmUgVENSX01YRE1BX09GRlNFVAkyMQorI2RlZmluZSBUQ1JfU0FUCQkJQklUMjQJCS8vIEVuYWJsZSBSYXRlIGRlcGVkZW50IGFjayB0aW1lb3V0IHRpbWVyCisJUkNSCQkJPSAweDA0NCwgLy8gUmVjZWl2ZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisjZGVmaW5lIE1BQ19GSUxURVJfTUFTSyAoKDE8PDApIHwgKDE8PDEpIHwgKDE8PDIpIHwgKDE8PDMpIHwgKDE8PDUpIHwgXAorCQkoMTw8MTIpIHwgKDE8PDE4KSB8ICgxPDwxOSkgfCAoMTw8MjApIHwgKDE8PDIxKSB8ICgxPDwyMikgfCAoMTw8MjMpKQorI2RlZmluZSBSWF9GSUZPX1RIUkVTSE9MRF9NQVNLICgoMTw8MTMpIHwgKDE8PDE0KSB8ICgxPDwxNSkpCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEX1NISUZUIDEzCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEXzEyOCAzCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEXzI1NiA0CisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEXzUxMiA1CisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEXzEwMjQgNgorI2RlZmluZSBSWF9GSUZPX1RIUkVTSE9MRF9OT05FIDcKKyNkZWZpbmUgTUFYX1JYX0RNQV9NQVNLICgoMTw8OCkgfCAoMTw8OSkgfCAoMTw8MTApKQorI2RlZmluZSBSQ1JfTVhETUFfT0ZGU0VUCTgKKyNkZWZpbmUgUkNSX0ZJRk9fT0ZGU0VUCQkxMworI2RlZmluZSBSQ1JfT05MWUVSTFBLVAkJQklUMzEJCQkvLyBFYXJseSBSZWNlaXZpbmcgYmFzZWQgb24gUGFja2V0IFNpemUuCisjZGVmaW5lIFJDUl9FTkNTMgkJQklUMzAJCQkvLyBFbmFibGUgQ2FycmllciBTZW5zZSBEZXRlY3Rpb24gTWV0aG9kIDIKKyNkZWZpbmUgUkNSX0VOQ1MxCQlCSVQyOQkJCS8vIEVuYWJsZSBDYXJyaWVyIFNlbnNlIERldGVjdGlvbiBNZXRob2QgMQorI2RlZmluZSBSQ1JfRU5NQklECQlCSVQyNwkJCS8vIEVuYWJsZSBNdWx0aXBsZSBCc3NJZC4KKyNkZWZpbmUgUkNSX0FDS1RYQlcJCShCSVQyNHxCSVQyNSkJCS8vIFRYQlcgU2V0dGluZyBvZiBBQ0sgZnJhbWVzCisjZGVmaW5lIFJDUl9DQlNTSUQJCUJJVDIzCQkJLy8gQWNjZXB0IEJTU0lEIG1hdGNoIHBhY2tldAorI2RlZmluZSBSQ1JfQVBXUk1HVAkJQklUMjIJCQkvLyBBY2NlcHQgcG93ZXIgbWFuYWdlbWVudCBwYWNrZXQKKyNkZWZpbmUJUkNSX0FERDMJCUJJVDIxCQkJLy8gQWNjZXB0IGFkZHJlc3MgMyBtYXRjaCBwYWNrZXQKKyNkZWZpbmUgUkNSX0FNRgkJCUJJVDIwCQkJLy8gQWNjZXB0IG1hbmFnZW1lbnQgdHlwZSBmcmFtZQorI2RlZmluZSBSQ1JfQUNGCQkJQklUMTkJCQkvLyBBY2NlcHQgY29udHJvbCB0eXBlIGZyYW1lCisjZGVmaW5lIFJDUl9BREYJCQlCSVQxOAkJCS8vIEFjY2VwdCBkYXRhIHR5cGUgZnJhbWUKKyNkZWZpbmUgUkNSX1JYRlRICQlCSVQxMwkJCS8vIFJ4IEZJRk8gVGhyZXNob2xkCisjZGVmaW5lIFJDUl9BSUNWCQlCSVQxMgkJCS8vIEFjY2VwdCBJQ1YgZXJyb3IgcGFja2V0CisjZGVmaW5lCVJDUl9BQ1JDMzIJCUJJVDUJCQkvLyBBY2NlcHQgQ1JDMzIgZXJyb3IgcGFja2V0CisjZGVmaW5lCVJDUl9BQgkJCUJJVDMJCQkvLyBBY2NlcHQgYnJvYWRjYXN0IHBhY2tldAorI2RlZmluZQlSQ1JfQU0JCQlCSVQyCQkJLy8gQWNjZXB0IG11bHRpY2FzdCBwYWNrZXQKKyNkZWZpbmUJUkNSX0FQTQkJCUJJVDEJCQkvLyBBY2NlcHQgcGh5c2ljYWwgbWF0Y2ggcGFja2V0CisjZGVmaW5lCVJDUl9BQVAJCQlCSVQwCQkJLy8gQWNjZXB0IGFsbCB1bmljYXN0IHBhY2tldAorCVNMT1RfVElNRQkJPSAweDA0OSwgLy8gU2xvdCBUaW1lIFJlZ2lzdGVyCisJQUNLX1RJTUVPVVQJCT0gMHgwNGMsIC8vIEFjayBUaW1lb3V0IFJlZ2lzdGVyCisJUElGU19USU1FCQk9IDB4MDRkLCAvLyBQSUZTIHRpbWUKKwlVU1RJTUUJCQk9IDB4MDRlLCAvLyBNaWNyb3NlY29uZCBUdW5pbmcgUmVnaXN0ZXIsIFNldHMgdGhlIG1pY3Jvc2Vjb25kIHRpbWUgdW5pdCB1c2VkIGJ5IE1BQyBjbG9jay4KKwlFRENBUEFSQV9CRQkJPSAweDA1MCwgLy8gRURDQSBQYXJhbWV0ZXIgb2YgQUMgQkUKKwlFRENBUEFSQV9CSwkJPSAweDA1NCwgLy8gRURDQSBQYXJhbWV0ZXIgb2YgQUMgQksKKwlFRENBUEFSQV9WTwkJPSAweDA1OCwgLy8gRURDQSBQYXJhbWV0ZXIgb2YgQUMgVk8KKwlFRENBUEFSQV9WSQkJPSAweDA1QywgLy8gRURDQSBQYXJhbWV0ZXIgb2YgQUMgVkkKKwlSRlBDCQkJPSAweDA1RiwgLy8gUnggRklGTyBQYWNrZXQgQ291bnQKKwlDV1JSCQkJPSAweDA2MCwgLy8gQ29udGVudGlvbiBXaW5kb3cgUmVwb3J0IFJlZ2lzdGVyCisJQkNOX1RDRkcJCT0gMHgwNjIsIC8vIEJlYWNvbiBUaW1lIENvbmZpZ3VyYXRpb24KKyNkZWZpbmUgQkNOX1RDRkdfQ1dfU0hJRlQJCTgKKyNkZWZpbmUgQkNOX1RDRkdfSUZTCQkJMAorCUJDTl9JTlRFUlZBTAkJPSAweDA3MCwgLy8gQmVhY29uIEludGVydmFsIChUVSkKKwlBVElNV05ECQkJPSAweDA3MiwgLy8gQVRJTSBXaW5kb3cgU2l6ZSAoVFUpCisJQkNOX0RSVl9FQVJMWV9JTlQJPSAweDA3NCwgLy8gRHJpdmVyIEVhcmx5IEludGVycnVwdCBUaW1lIChUVSkuIFRpbWUgdG8gc2VuZCBpbnRlcnJ1cHQgdG8gbm90aWZ5IHRvIGNoYW5nZSBiZWFjb24gY29udGVudCBiZWZvcmUgVEJUVAorCUJDTl9ETUFUSU1FCQk9IDB4MDc2LCAvLyBCZWFjb24gRE1BIGFuZCBBVElNIGludGVycnVwdCB0aW1lIChVUykuIEluZGljYXRlcyB0aGUgdGltZSBiZWZvcmUgVEJUVCB0byBwZXJmb3JtIGJlYWNvbiBxdWV1ZSBETUEKKwlCQ05fRVJSX1RIUkVTSAkJPSAweDA3OCwgLy8gQmVhY29uIEVycm9yIFRocmVzaG9sZAorCVJXQ0FNCQkJPSAweDBBMCwgLy9JTiA4MTkwIERhdGEgU2hlZXQgaXMgY2FsbGVkIENBTWNtZAorCVdDQU1JCQkJPSAweDBBNCwgLy8gU29mdHdhcmUgd3JpdGUgQ0FNIGlucHV0IGNvbnRlbnQKKwlSQ0FNTwkJCT0gMHgwQTgsIC8vIFNvZnR3YXJlIHJlYWQvd3JpdGUgQ0FNIGNvbmZpZworCVNFQ1IJCQk9IDB4MEIwLCAvL1NlY3VyaXR5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyNkZWZpbmUJU0NSX1R4VXNlREsJCUJJVDAJCQkvL0ZvcmNlIFR4IFVzZSBEZWZhdWx0IEtleQorI2RlZmluZSBTQ1JfUnhVc2VESwkJQklUMQkJCS8vRm9yY2UgUnggVXNlIERlZmF1bHQgS2V5CisjZGVmaW5lIFNDUl9UeEVuY0VuYWJsZQkJQklUMgkJCS8vRW5hYmxlIFR4IEVuY3J5cHRpb24KKyNkZWZpbmUgU0NSX1J4RGVjRW5hYmxlCQlCSVQzCQkJLy9FbmFibGUgUnggRGVjcnlwdGlvbgorI2RlZmluZSBTQ1JfU0tCeUEyCQlCSVQ0CQkJLy9TZWFyY2gga0VZIEJZIEEyCisjZGVmaW5lIFNDUl9Ob1NLTUMJCUJJVDUJCQkvL05vIEtleSBTZWFyY2ggZm9yIE11bHRpY2FzdAorI2RlZmluZSBTQ1JfVXNlREsJCTB4MDEKKyNkZWZpbmUgU0NSX1R4U2VjRW5hYmxlCQkweDAyCisjZGVmaW5lIFNDUl9SeFNlY0VuYWJsZQkJMHgwNAorCVRQUG9sbAkJCT0gMHgwZmQsIC8vIFRyYW5zbWl0IHByaW9yaXR5IHBvbGxpbmcgcmVnaXN0ZXIKKwlQU1IJCQk9IDB4MGZmLCAvLyBQYWdlIFNlbGVjdCBSZWdpc3RlcgorI2RlZmluZSBDUFVfQ0NLX0xPT1BCQUNLCTB4MDAwMzAwMDAKKyNkZWZpbmUgQ1BVX0dFTl9TWVNURU1fUkVTRVQJMHgwMDAwMDAwMQorI2RlZmluZSBDUFVfR0VOX0ZJUk1XQVJFX1JFU0VUCTB4MDAwMDAwMDgKKyNkZWZpbmUgQ1BVX0dFTl9CT09UX1JEWQkweDAwMDAwMDEwCisjZGVmaW5lIENQVV9HRU5fRklSTV9SRFkJMHgwMDAwMDAyMAorI2RlZmluZSBDUFVfR0VOX1BVVF9DT0RFX09LCTB4MDAwMDAwODAKKyNkZWZpbmUgQ1BVX0dFTl9CQl9SU1QJCTB4MDAwMDAxMDAKKyNkZWZpbmUgQ1BVX0dFTl9QV1JfU1RCX0NQVQkweDAwMDAwMDA0CisjZGVmaW5lIENQVV9HRU5fTk9fTE9PUEJBQ0tfTVNLCTB4RkZGOEZGRkYJCS8vIFNldCBiaXQxOCwxNywxNiB0byAwLiBTZXQgYml0MTkKKyNkZWZpbmUgQ1BVX0dFTl9OT19MT09QQkFDS19TRVQJMHgwMDA4MDAwMAkJLy8gU2V0IEJJVDE5IHRvIDEKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICA4MTkwIENQVSBHZW5lcmFsIFJlZ2lzdGVyCQkob2Zmc2V0IDB4MTAwLCA0IGJ5dGUpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUJQ1BVX0NDS19MT09QQkFDSwkweDAwMDMwMDAwCisjZGVmaW5lCUNQVV9HRU5fU1lTVEVNX1JFU0VUCTB4MDAwMDAwMDEKKyNkZWZpbmUJQ1BVX0dFTl9GSVJNV0FSRV9SRVNFVAkweDAwMDAwMDA4CisjZGVmaW5lCUNQVV9HRU5fQk9PVF9SRFkJMHgwMDAwMDAxMAorI2RlZmluZQlDUFVfR0VOX0ZJUk1fUkRZCTB4MDAwMDAwMjAKKyNkZWZpbmUJQ1BVX0dFTl9QVVRfQ09ERV9PSwkweDAwMDAwMDgwCisjZGVmaW5lCUNQVV9HRU5fQkJfUlNUCQkweDAwMDAwMTAwCisjZGVmaW5lCUNQVV9HRU5fUFdSX1NUQl9DUFUJMHgwMDAwMDAwNAorI2RlZmluZSBDUFVfR0VOX05PX0xPT1BCQUNLX01TSwkweEZGRjhGRkZGIC8vIFNldCBiaXQxOCwxNywxNiB0byAwLiBTZXQgYml0MTkKKyNkZWZpbmUgQ1BVX0dFTl9OT19MT09QQkFDS19TRVQJMHgwMDA4MDAwMCAvLyBTZXQgQklUMTkgdG8gMQorCUNQVV9HRU4JCQk9IDB4MTAwLCAvLyBDUFUgUmVzZXQgUmVnaXN0ZXIKKwlMRUQxQ2ZnCQkJPQkJMHgxNTQsLy8gTEVEMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisJTEVEMENmZwkJCT0JCTB4MTU1LC8vIExFRDAgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorCisJQWNtQXZnCQkJPSAweDE3MCwgLy8gQUNNIEF2ZXJhZ2UgUGVyaW9kIFJlZ2lzdGVyCisJQWNtSHdDdHJsCQk9IDB4MTcxLCAvLyBBQ00gSGFyZHdhcmUgQ29udHJvbCBSZWdpc3RlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8vCisvLy8vICAgICAgIDgxOTAgQWNtSHdDdHJsIGJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2Zmc2V0IDB4MTcxLCAxIGJ5dGUpCisvLy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKyNkZWZpbmUgQWNtSHdfSHdFbiAgICAgICAgICAgICAgQklUMAorI2RlZmluZSBBY21Id19CZXFFbiAgICAgICAgICAgICBCSVQxCisjZGVmaW5lIEFjbUh3X1ZpcUVuICAgICAgICAgICAgIEJJVDIKKyNkZWZpbmUgQWNtSHdfVm9xRW4gICAgICAgICAgICAgQklUMworI2RlZmluZSBBY21Id19CZXFTdGF0dXMgICAgICAgICBCSVQ0CisjZGVmaW5lIEFjbUh3X1ZpcVN0YXR1cyAgICAgICAgIEJJVDUKKyNkZWZpbmUgQWNtSHdfVm9xU3RhdHVzICAgICAgICAgQklUNgorCisJQWNtRndDdHJsCQk9IDB4MTcyLCAvLyBBQ00gRmlybXdhcmUgQ29udHJvbCBSZWdpc3RlcgorCUFFU18xMU5fRklYCQk9IDB4MTczLAorCVZPQWRtVGltZQkJPSAweDE3NCwgLy8gVk8gUXVldWUgQWRtaXR0ZWQgVGltZSBSZWdpc3RlcgorCVZJQWRtVGltZQkJPSAweDE3OCwgLy8gVkkgUXVldWUgQWRtaXR0ZWQgVGltZSBSZWdpc3RlcgorCUJFQWRtVGltZQkJPSAweDE3QywgLy8gQkUgUXVldWUgQWRtaXR0ZWQgVGltZSBSZWdpc3RlcgorCVJRUE4xCQkJPSAweDE4MCwgLy8gUmVzZXJ2ZWQgUXVldWUgUGFnZSBOdW1iZXIgLCBWbyBWaSwgQmUsIEJrCisJUlFQTjIJCQk9IDB4MTg0LCAvLyBSZXNlcnZlZCBRdWV1ZSBQYWdlIE51bWJlciwgSENDQSwgQ21kLCBNZ250LCBIaWdoCisJUlFQTjMJCQk9IDB4MTg4LCAvLyBSZXNlcnZlZCBRdWV1ZSBQYWdlIE51bWJlciwgQmNuLCBQdWJsaWMsCisvLwlRUFJSCQkJPSAweDFFMCwgLy8gUXVldWUgUGFnZSBSZXBvcnQgcGVyIFRJRAorCVFQTlIJCQk9IDB4MUQwLCAvLzB4MUYwLCAvLyBRdWV1ZSBQYWNrZXQgTnVtYmVyIHJlcG9ydCBwZXIgVElECisJQlFEQQkJCT0gMHgyMDAsIC8vIEJlYWNvbiBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MKKwlIUURBCQkJPSAweDIwNCwgLy8gSGlnaCBQcmlvcml0eSBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MKKwlDUURBCQkJPSAweDIwOCwgLy8gQ29tbWFuZCBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MKKwlNUURBCQkJPSAweDIwQywgLy8gTWFuYWdlbWVudCBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MKKwlIQ0NBUURBCQkJPSAweDIxMCwgLy8gSENDQSBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MKKwlWT1FEQQkJCT0gMHgyMTQsIC8vIFZPIFF1ZXVlIERlc2NyaXB0b3IgQWRkcmVzcworCVZJUURBCQkJPSAweDIxOCwgLy8gVkkgUXVldWUgRGVzY3JpcHRvciBBZGRyZXNzCisJQkVRREEJCQk9IDB4MjFDLCAvLyBCRSBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MKKwlCS1FEQQkJCT0gMHgyMjAsIC8vIEJLIFF1ZXVlIERlc2NyaXB0b3IgQWRkcmVzcworCVJDUURBCQkJPSAweDIyNCwgLy8gUmVjZWl2ZSBjb21tYW5kIFF1ZXVlIERlc2NyaXB0b3IgQWRkcmVzcworCVJEUURBCQkJPSAweDIyOCwgLy8gUmVjZWl2ZSBRdWV1ZSBEZXNjcmlwdG9yIFN0YXJ0IEFkZHJlc3MKKworCU1BUjAJCQk9IDB4MjQwLCAvLyBNdWx0aWNhc3QgZmlsdGVyLgorCU1BUjQJCQk9IDB4MjQ0LAorCisJQ0NYX1BFUklPRAkJPSAweDI1MCwgLy8gQ0NYIE1lYXN1cmVtZW50IFBlcmlvZCBSZWdpc3RlciwgaW4gdW5pdCBvZiBUVS4KKwlDTE1fUkVTVUxUCQk9IDB4MjUxLCAvLyBDQ0EgQnVzeSBmcmFjdGlvbiByZWdpc3Rlci4KKwlOSE1fUEVSSU9ECQk9IDB4MjUyLCAvLyBOSE0gTWVhc3VyZW1lbnQgUGVyaW9kIHJlZ2lzdGVyLCBpbiB1bml0IG9mIFRVLgorCisJTkhNX1RIUkVTSE9MRDAJCT0gMHgyNTMsIC8vIE5vaXNlIEhpc3RvZ3JhbSBNZWFzaG9yZW1lbnQwLgorCU5ITV9USFJFU0hPTEQxCQk9IDB4MjU0LCAvLyBOb2lzZSBIaXN0b2dyYW0gTWVhc2hvcmVtZW50MS4KKwlOSE1fVEhSRVNIT0xEMgkJPSAweDI1NSwgLy8gTm9pc2UgSGlzdG9ncmFtIE1lYXNob3JlbWVudDIuCisJTkhNX1RIUkVTSE9MRDMJCT0gMHgyNTYsIC8vIE5vaXNlIEhpc3RvZ3JhbSBNZWFzaG9yZW1lbnQzLgorCU5ITV9USFJFU0hPTEQ0CQk9IDB4MjU3LCAvLyBOb2lzZSBIaXN0b2dyYW0gTWVhc2hvcmVtZW50NC4KKwlOSE1fVEhSRVNIT0xENQkJPSAweDI1OCwgLy8gTm9pc2UgSGlzdG9ncmFtIE1lYXNob3JlbWVudDUuCisJTkhNX1RIUkVTSE9MRDYJCT0gMHgyNTksIC8vIE5vaXNlIEhpc3RvZ3JhbSBNZWFzaG9yZW1lbnQ2CisKKwlNQ1RSTAkJCT0gMHgyNUEsIC8vIE1lYXN1cmVtZW50IENvbnRyb2wKKworCU5ITV9SUElfQ09VTlRFUjAJPSAweDI2NCwgLy8gTm9pc2UgSGlzdG9ncmFtIFJQSSBjb3VudGVyMCwgdGhlIGZyYWN0aW9uIG9mIHNpZ25hbCBzdHJlbmd0aCA8IE5ITV9USFJFU0hPTEQwLgorCU5ITV9SUElfQ09VTlRFUjEJPSAweDI2NSwgLy8gTm9pc2UgSGlzdG9ncmFtIFJQSSBjb3VudGVyMSwgdGhlIGZyYWN0aW9uIG9mIHNpZ25hbCBzdHJlbmd0aCBpbiAoTkhNX1RIUkVTSE9MRDAsIE5ITV9USFJFU0hPTEQxXS4KKwlOSE1fUlBJX0NPVU5URVIyCT0gMHgyNjYsIC8vIE5vaXNlIEhpc3RvZ3JhbSBSUEkgY291bnRlcjIsIHRoZSBmcmFjdGlvbiBvZiBzaWduYWwgc3RyZW5ndGggaW4gKE5ITV9USFJFU0hPTEQxLCBOSE1fVEhSRVNIT0xEMl0uCisJTkhNX1JQSV9DT1VOVEVSMwk9IDB4MjY3LCAvLyBOb2lzZSBIaXN0b2dyYW0gUlBJIGNvdW50ZXIzLCB0aGUgZnJhY3Rpb24gb2Ygc2lnbmFsIHN0cmVuZ3RoIGluIChOSE1fVEhSRVNIT0xEMiwgTkhNX1RIUkVTSE9MRDNdLgorCU5ITV9SUElfQ09VTlRFUjQJPSAweDI2OCwgLy8gTm9pc2UgSGlzdG9ncmFtIFJQSSBjb3VudGVyNCwgdGhlIGZyYWN0aW9uIG9mIHNpZ25hbCBzdHJlbmd0aCBpbiAoTkhNX1RIUkVTSE9MRDMsIE5ITV9USFJFU0hPTEQ0XS4KKwlOSE1fUlBJX0NPVU5URVI1CT0gMHgyNjksIC8vIE5vaXNlIEhpc3RvZ3JhbSBSUEkgY291bnRlcjUsIHRoZSBmcmFjdGlvbiBvZiBzaWduYWwgc3RyZW5ndGggaW4gKE5ITV9USFJFU0hPTEQ0LCBOSE1fVEhSRVNIT0xENV0uCisJTkhNX1JQSV9DT1VOVEVSNgk9IDB4MjZBLCAvLyBOb2lzZSBIaXN0b2dyYW0gUlBJIGNvdW50ZXI2LCB0aGUgZnJhY3Rpb24gb2Ygc2lnbmFsIHN0cmVuZ3RoIGluIChOSE1fVEhSRVNIT0xENSwgTkhNX1RIUkVTSE9MRDZdLgorCU5ITV9SUElfQ09VTlRFUjcJPSAweDI2QiwgLy8gTm9pc2UgSGlzdG9ncmFtIFJQSSBjb3VudGVyNywgdGhlIGZyYWN0aW9uIG9mIHNpZ25hbCBzdHJlbmd0aCBpbiAoTkhNX1RIUkVTSE9MRDYsIE5ITV9USFJFU0hPTEQ3XS4KKyNkZWZpbmUJQldfT1BNT0RFXzExSgkJCUJJVDAKKyNkZWZpbmUJQldfT1BNT0RFXzVHCQkJQklUMQorI2RlZmluZQlCV19PUE1PREVfMjBNSFoJCQlCSVQyCisJQldfT1BNT0RFCQk9IDB4MzAwLCAvLyBCYW5kd2lkdGggb3BlcmF0aW9uIG1vZGUKKwlNU1IJCQk9IDB4MzAzLCAvLyBNZWRpYSBTdGF0dXMgcmVnaXN0ZXIKKyNkZWZpbmUgTVNSX0xJTktfTUFTSyAgICAgICgoMTw8MCl8KDE8PDEpKQorI2RlZmluZSBNU1JfTElOS19NQU5BR0VEICAgMgorI2RlZmluZSBNU1JfTElOS19OT05FICAgICAgMAorI2RlZmluZSBNU1JfTElOS19TSElGVCAgICAgMAorI2RlZmluZSBNU1JfTElOS19BREhPQyAgICAgMQorI2RlZmluZSBNU1JfTElOS19NQVNURVIgICAgMworI2RlZmluZSBNU1JfTElOS19FTkVEQ0EJICAgKDE8PDQpCisJUkVUUllfTElNSVQJCT0gMHgzMDQsIC8vIFJldHJ5IExpbWl0IFsxNTo4XS1zaG9ydCwgWzc6MF0tbG9uZworI2RlZmluZSBSRVRSWV9MSU1JVF9TSE9SVF9TSElGVCA4CisjZGVmaW5lIFJFVFJZX0xJTUlUX0xPTkdfU0hJRlQgMAorCVRTRlIJCQk9IDB4MzA4LAorCVJSU1IJCQk9IDB4MzEwLCAvLyBSZXNwb25zZSBSYXRlIFNldAorI2RlZmluZSBSUlNSX1JTQ19PRkZTRVQJCQkyMQorI2RlZmluZSBSUlNSX1NIT1JUX09GRlNFVAkJCTIzCisjZGVmaW5lIFJSU1JfUlNDX0RVUExJQ0FURQkJCTB4NjAwMDAwCisjZGVmaW5lIFJSU1JfUlNDX0xPV1NVQkNITkwJCTB4NDAwMDAwCisjZGVmaW5lIFJSU1JfUlNDX1VQU1VCQ0hBTkwJCTB4MjAwMDAwCisjZGVmaW5lIFJSU1JfU0hPUlQJCQkJCTB4ODAwMDAwCisjZGVmaW5lIFJSU1JfMU0JCQkJCQlCSVQwCisjZGVmaW5lIFJSU1JfMk0JCQkJCQlCSVQxCisjZGVmaW5lIFJSU1JfNV81TQkJCQkJQklUMgorI2RlZmluZSBSUlNSXzExTQkJCQkJQklUMworI2RlZmluZSBSUlNSXzZNCQkJCQkJQklUNAorI2RlZmluZSBSUlNSXzlNCQkJCQkJQklUNQorI2RlZmluZSBSUlNSXzEyTQkJCQkJQklUNgorI2RlZmluZSBSUlNSXzE4TQkJCQkJQklUNworI2RlZmluZSBSUlNSXzI0TQkJCQkJQklUOAorI2RlZmluZSBSUlNSXzM2TQkJCQkJQklUOQorI2RlZmluZSBSUlNSXzQ4TQkJCQkJQklUMTAKKyNkZWZpbmUgUlJTUl81NE0JCQkJCUJJVDExCisjZGVmaW5lIFJSU1JfTUNTMAkJCQkJQklUMTIKKyNkZWZpbmUgUlJTUl9NQ1MxCQkJCQlCSVQxMworI2RlZmluZSBSUlNSX01DUzIJCQkJCUJJVDE0CisjZGVmaW5lIFJSU1JfTUNTMwkJCQkJQklUMTUKKyNkZWZpbmUgUlJTUl9NQ1M0CQkJCQlCSVQxNgorI2RlZmluZSBSUlNSX01DUzUJCQkJCUJJVDE3CisjZGVmaW5lIFJSU1JfTUNTNgkJCQkJQklUMTgKKyNkZWZpbmUgUlJTUl9NQ1M3CQkJCQlCSVQxOQorI2RlZmluZSBCUlNSX0Fja1Nob3J0UG1iCQkJQklUMjMJCS8vIENDSyBBQ0s6IHVzZSBTaG9ydCBQcmVhbWJsZSBvciBub3QuCisJUkFUUjAJCQk9IDB4MzIwLCAvLyBSYXRlIEFkYXB0aXZlIFRhYmxlIHJlZ2lzdGVyMQorCVVGV1AJCQk9IDB4MzE4LAorCURSSVZFUl9SU1NJCQk9IDB4MzJjLAkJCQkJLy8gRHJpdmVyIHRlbGwgRmlybXdhcmUgY3VycmVudCBSU1NJCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgIDgxOTAgUmF0ZSBBZGFwdGl2ZSBUYWJsZSBSZWdpc3Rlcgkob2Zmc2V0IDB4MzIwLCA0IGJ5dGUpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vQ0NLCisjZGVmaW5lCVJBVFJfMU0JCQkweDAwMDAwMDAxCisjZGVmaW5lCVJBVFJfMk0JCQkweDAwMDAwMDAyCisjZGVmaW5lCVJBVFJfNTVNCQkweDAwMDAwMDA0CisjZGVmaW5lCVJBVFJfMTFNCQkweDAwMDAwMDA4CisvL09GRE0KKyNkZWZpbmUJUkFUUl82TQkJCTB4MDAwMDAwMTAKKyNkZWZpbmUJUkFUUl85TQkJCTB4MDAwMDAwMjAKKyNkZWZpbmUJUkFUUl8xMk0JCTB4MDAwMDAwNDAKKyNkZWZpbmUJUkFUUl8xOE0JCTB4MDAwMDAwODAKKyNkZWZpbmUJUkFUUl8yNE0JCTB4MDAwMDAxMDAKKyNkZWZpbmUJUkFUUl8zNk0JCTB4MDAwMDAyMDAKKyNkZWZpbmUJUkFUUl80OE0JCTB4MDAwMDA0MDAKKyNkZWZpbmUJUkFUUl81NE0JCTB4MDAwMDA4MDAKKy8vTUNTIDEgU3BhdGlhbCBTdHJlYW0KKyNkZWZpbmUJUkFUUl9NQ1MwCQkweDAwMDAxMDAwCisjZGVmaW5lCVJBVFJfTUNTMQkJMHgwMDAwMjAwMAorI2RlZmluZQlSQVRSX01DUzIJCTB4MDAwMDQwMDAKKyNkZWZpbmUJUkFUUl9NQ1MzCQkweDAwMDA4MDAwCisjZGVmaW5lCVJBVFJfTUNTNAkJMHgwMDAxMDAwMAorI2RlZmluZQlSQVRSX01DUzUJCTB4MDAwMjAwMDAKKyNkZWZpbmUJUkFUUl9NQ1M2CQkweDAwMDQwMDAwCisjZGVmaW5lCVJBVFJfTUNTNwkJMHgwMDA4MDAwMAorLy9NQ1MgMiBTcGF0aWFsIFN0cmVhbQorI2RlZmluZQlSQVRSX01DUzgJCTB4MDAxMDAwMDAKKyNkZWZpbmUJUkFUUl9NQ1M5CQkweDAwMjAwMDAwCisjZGVmaW5lCVJBVFJfTUNTMTAJCTB4MDA0MDAwMDAKKyNkZWZpbmUJUkFUUl9NQ1MxMQkJMHgwMDgwMDAwMAorI2RlZmluZQlSQVRSX01DUzEyCQkweDAxMDAwMDAwCisjZGVmaW5lCVJBVFJfTUNTMTMJCTB4MDIwMDAwMDAKKyNkZWZpbmUJUkFUUl9NQ1MxNAkJMHgwNDAwMDAwMAorI2RlZmluZQlSQVRSX01DUzE1CQkweDA4MDAwMDAwCisvLyBBTEwgQ0NLIFJhdGUKKyNkZWZpbmUgUkFURV9BTExfQ0NLCQlSQVRSXzFNfFJBVFJfMk18UkFUUl81NU18UkFUUl8xMU0KKyNkZWZpbmUgUkFURV9BTExfT0ZETV9BRwlSQVRSXzZNfFJBVFJfOU18UkFUUl8xMk18UkFUUl8xOE18UkFUUl8yNE1cCisJCQkJCQkJfFJBVFJfMzZNfFJBVFJfNDhNfFJBVFJfNTRNCisjZGVmaW5lIFJBVEVfQUxMX09GRE1fMVNTCVJBVFJfTUNTMHxSQVRSX01DUzF8UkFUUl9NQ1MyfFJBVFJfTUNTMyB8IFwKKwkJCQkJCQlSQVRSX01DUzR8UkFUUl9NQ1M1fFJBVFJfTUNTNnxSQVRSX01DUzcKKyNkZWZpbmUgUkFURV9BTExfT0ZETV8yU1MJUkFUUl9NQ1M4fFJBVFJfTUNTOQl8UkFUUl9NQ1MxMHxSQVRSX01DUzExfCBcCisJCQkJCQkJUkFUUl9NQ1MxMnxSQVRSX01DUzEzfFJBVFJfTUNTMTR8UkFUUl9NQ1MxNQorCisJTUNTX1RYQUdDCQk9IDB4MzQwLCAvLyBNQ1MgQUdDCisJQ0NLX1RYQUdDCQk9IDB4MzQ4LCAvLyBDQ0sgQUdDCisvLwlJU1IJCQk9IDB4MzUwLCAvLyBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyCisvLwlJTVIJCQk9IDB4MzU0LCAvLyBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlcgorLy8JSU1SX1BPTEwJCT0gMHgzNjAsCisJTWFjQmxrQ3RybAkJPSAweDQwMywgLy8gTWFjIGJsb2NrIG9uL29mZiBjb250cm9sIHJlZ2lzdGVyCisKKwlFUFJPTV9DTUQgCQk9IDB4ZmU1OCwKKyNkZWZpbmUgQ21kOTM0NkNSXzkzNTZTRUwJKDE8PDQpCisjZGVmaW5lIEVQUk9NX0NNRF9SRVNFUlZFRF9NQVNLICgxPDw1KQorI2RlZmluZSBFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfU0hJRlQgNgorI2RlZmluZSBFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfTUFTSyAoKDE8PDcpfCgxPDw2KSkKKyNkZWZpbmUgRVBST01fQ01EX0NPTkZJRyAweDMKKyNkZWZpbmUgRVBST01fQ01EX05PUk1BTCAwCisjZGVmaW5lIEVQUk9NX0NNRF9MT0FEIDEKKyNkZWZpbmUgRVBST01fQ01EX1BST0dSQU0gMgorI2RlZmluZSBFUFJPTV9DU19TSElGVCAzCisjZGVmaW5lIEVQUk9NX0NLX1NISUZUIDIKKyNkZWZpbmUgRVBST01fV19TSElGVCAxCisjZGVmaW5lIEVQUk9NX1JfU0hJRlQgMAorCU1BQzAgCQkJPSAweDAwMCwKKwlNQUMxIAkJCT0gMHgwMDEsCisJTUFDMiAJCQk9IDB4MDAyLAorCU1BQzMgCQkJPSAweDAwMywKKwlNQUM0IAkJCT0gMHgwMDQsCisJTUFDNSAJCQk9IDB4MDA1LAorCit9OworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICA4MTh4QiBBbmFQYXJtICYgQW5hUGFybTIgUmVnaXN0ZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8jZGVmaW5lIEFOQVBBUk1fQVNJQ19PTiAgICAweDQ1MDkwNjU4CisvLyNkZWZpbmUgQU5BUEFSTTJfQVNJQ19PTiAgIDB4NzI3ZjNmNTIKKyNkZWZpbmUgR1BJIDB4MTA4CisjZGVmaW5lIEdQTyAweDEwOQorI2RlZmluZSBHUEUgMHgxMGEKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV93eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZDVjODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX3d4LmMKQEAgLTAsMCArMSwxMjI4IEBACisvKgorICAgVGhpcyBmaWxlIGNvbnRhaW5zIHdpcmVsZXNzIGV4dGVuc2lvbiBoYW5kbGVycy4KKworICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIuCisgICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydAorICAgb2YgdGhlIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyLgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uCisgICBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24uCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlci4KKworICAgV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiB0aG9zZSBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyCisgICBwcm9qZWN0IEF1dGhvcnMuCisqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSAicjgxOTJVLmgiCisjaW5jbHVkZSAicjgxOTJVX2h3LmgiCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiZG90MTFkLmgiCisjZW5kaWYKKworI2RlZmluZSBSQVRFX0NPVU5UIDEyCit1MzIgcnRsODE4MF9yYXRlc1tdID0gezEwMDAwMDAsMjAwMDAwMCw1NTAwMDAwLDExMDAwMDAwLAorCTYwMDAwMDAsOTAwMDAwMCwxMjAwMDAwMCwxODAwMDAwMCwyNDAwMDAwMCwzNjAwMDAwMCw0ODAwMDAwMCw1NDAwMDAwMH07CisKKworI2lmbmRlZiBFTkVURE9XTgorI2RlZmluZSBFTkVURE9XTiAxCisjZW5kaWYKKworc3RhdGljIGludCByODE5Ml93eF9nZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X2ZyZXEocHJpdi0+aWVlZTgwMjExLGEsd3JxdSxiKTsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXY9aWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X21vZGUocHJpdi0+aWVlZTgwMjExLGEsd3JxdSxiKTsKK30KKworCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X3JhdGUocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxleHRyYSk7Cit9CisKKworCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfcmF0ZShwcml2LT5pZWVlODAyMTEsaW5mbyx3cnF1LGV4dHJhKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9ydHMocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfcnRzKHByaXYtPmllZWU4MDIxMSxpbmZvLHdycXUsZXh0cmEpOworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyKHByaXYtPmllZWU4MDIxMSxpbmZvLHdycXUsZXh0cmEpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfcG93ZXIocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxleHRyYSk7Cit9CisKKyNpZmRlZiBKT0hOX0lPQ1RMCit1MTYgcmVhZF9ydGw4MjI1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkZHIpOwordm9pZCB3cml0ZV9ydGw4MjI1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTE2IGRhdGEpOwordTMyIGpvaG5fcmVhZF9ydGw4MjI1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkcik7Cit2b2lkIF93cml0ZV9ydGw4MjI1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTE2IGRhdGEpOworCitzdGF0aWMgaW50IHI4MTkyX3d4X3JlYWRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IGFkZHI7CisJdTE2IGRhdGExOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCisJZ2V0X3VzZXIoYWRkciwodTgqKXdycXUtPmRhdGEucG9pbnRlcik7CisJZGF0YTEgPSByZWFkX3J0bDgyMjUoZGV2LCBhZGRyKTsKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IGRhdGExOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludCByODE5Ml93eF93cml0ZV9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggYWRkcjsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlnZXRfdXNlcihhZGRyLCAodTgqKXdycXUtPmRhdGEucG9pbnRlcik7CisJd3JpdGVfcnRsODIyNShkZXYsIGFkZHIsIHdycXUtPmRhdGEubGVuZ3RoKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiAwOworCit9CisKK3ZvaWQgcnRsODE4N193cml0ZV9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MzIgZGF0YSk7Cit1OCBydGw4MTg3X3JlYWRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTggYWRyLCB1MzIgZGF0YSk7CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfcmVhZF9iYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IGRhdGFiYjsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlkYXRhYmIgPSBydGw4MTg3X3JlYWRfcGh5KGRldiwgKHU4KXdycXUtPmRhdGEubGVuZ3RoLCAweDAwMDAwMDAwKTsKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IGRhdGFiYjsKKworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiAwOworfQorCit2b2lkIHJ0bDgxODdfd3JpdGVfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTMyIGRhdGEpOworc3RhdGljIGludCByODE5Ml93eF93cml0ZV9iYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IGRhdGFiYjsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlnZXRfdXNlcihkYXRhYmIsICh1OCopd3JxdS0+ZGF0YS5wb2ludGVyKTsKKwlydGw4MTg3X3dyaXRlX3BoeShkZXYsIHdycXUtPmRhdGEubGVuZ3RoLCBkYXRhYmIpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIDA7CisKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X3dyaXRlX25pY2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgYWRkcjsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlnZXRfdXNlcihhZGRyLCAodTMyKil3cnF1LT5kYXRhLnBvaW50ZXIpOworCXdyaXRlX25pY19ieXRlKGRldiwgYWRkciwgd3JxdS0+ZGF0YS5sZW5ndGgpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIDA7CisKK30KK3N0YXRpYyBpbnQgcjgxOTJfd3hfcmVhZF9uaWNiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIGFkZHI7CisJdTE2IGRhdGExOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCWdldF91c2VyKGFkZHIsKHUzMiopd3JxdS0+ZGF0YS5wb2ludGVyKTsKKwlkYXRhMSA9IHJlYWRfbmljX2J5dGUoZGV2LCBhZGRyKTsKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IGRhdGExOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X2FwX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqdGFyZ2V0OworCWludCBuYW1lX2xlbjsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwkvL2NvdW50IHRoZSBsZW5ndGggb2YgaW5wdXQgc3NpZAorCWZvcihuYW1lX2xlbj0wIDsgKChjaGFyKil3cnF1LT5kYXRhLnBvaW50ZXIpW25hbWVfbGVuXSE9J1wwJyA7IG5hbWVfbGVuKyspOworCisJLy9zZWFyY2ggZm9yIHRoZSBjb3JyZXNwb2RpbmcgaW5mbyB3aGljaCBpcyByZWNlaXZlZAorCWxpc3RfZm9yX2VhY2hfZW50cnkodGFyZ2V0LCAmaWVlZS0+bmV0d29ya19saXN0LCBsaXN0KSB7CisJCWlmICggKHRhcmdldC0+c3NpZF9sZW4gPT0gbmFtZV9sZW4pICYmCisJCSAgICAgKHN0cm5jbXAodGFyZ2V0LT5zc2lkLCAoY2hhciopd3JxdS0+ZGF0YS5wb2ludGVyLCBuYW1lX2xlbik9PTApKXsKKwkJCWlmKHRhcmdldC0+d3BhX2llX2xlbj4wIHx8IHRhcmdldC0+cnNuX2llX2xlbj4wICkKKwkJCQkvL3NldCBmbGFncz0xIHRvIGluZGljYXRlIHRoaXMgYXAgaXMgV1BBCisJCQkJd3JxdS0+ZGF0YS5mbGFncyA9IDE7CisJCQllbHNlIHdycXUtPmRhdGEuZmxhZ3MgPSAwOworCisKKwkJYnJlYWs7CisJCX0KKwl9CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gMDsKK30KKworCisKKyNlbmRpZgorc3RhdGljIGludCByODE5Ml93eF9mb3JjZV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcHJpbnRrKCIlcygpOiBmb3JjZSByZXNldCAhIGV4dHJhIGlzICVkXG4iLF9fRlVOQ1RJT05fXywgKmV4dHJhKTsKKwlwcml2LT5mb3JjZV9yZXNldCA9ICpleHRyYTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gMDsKKworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X3Jhd3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X3Jhd3R4KHByaXYtPmllZWU4MDIxMSwgaW5mbywgd3JxdSwgZXh0cmEpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworCit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X2NyY21vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCAqcGFybXMgPSAoaW50ICopZXh0cmE7CisJaW50IGVuYWJsZSA9IChwYXJtc1swXSA+IDApOworCXNob3J0IHByZXYgPSBwcml2LT5jcmNtb247CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJaWYoZW5hYmxlKQorCQlwcml2LT5jcmNtb249MTsKKwllbHNlCisJCXByaXYtPmNyY21vbj0wOworCisJRE1FU0coImJhZCBDUkMgaW4gbW9uaXRvciBtb2RlIGFyZSAlcyIsCisJICAgICAgcHJpdi0+Y3JjbW9uID8gImFjY2VwdGVkIiA6ICJyZWplY3RlZCIpOworCisJaWYocHJldiAhPSBwcml2LT5jcmNtb24gJiYgcHJpdi0+dXApeworCQkvL3J0bDgxODBfZG93bihkZXYpOworCQkvL3J0bDgxODBfdXAoZGV2KTsKKwl9CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ7CisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfbW9kZShwcml2LT5pZWVlODAyMTEsYSx3cnF1LGIpOworCisJcnRsODE5Ml9zZXRfcnhjb25mKGRldik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgIGl3X3JhbmdlX3dpdGhfc2Nhbl9jYXBhCit7CisJLyogSW5mb3JtYXRpdmUgc3R1ZmYgKHRvIGNob29zZSBiZXR3ZWVuIGRpZmZlcmVudCBpbnRlcmZhY2UpICovCisJX191MzIgICAgICAgICAgIHRocm91Z2hwdXQ7ICAgICAvKiBUbyBnaXZlIGFuIGlkZWEuLi4gKi8KKwkvKiBJbiB0aGVvcnkgdGhpcyB2YWx1ZSBzaG91bGQgYmUgdGhlIG1heGltdW0gYmVuY2htYXJrZWQKKwkgKiBUQ1AvSVAgdGhyb3VnaHB1dCwgYmVjYXVzZSB3aXRoIG1vc3Qgb2YgdGhlc2UgZGV2aWNlcyB0aGUKKwkgKiBiaXQgcmF0ZSBpcyBtZWFuaW5nbGVzcyAob3ZlcmhlYWQgYW4gY28pIHRvIGVzdGltYXRlIGhvdworCSAqIGZhc3QgdGhlIGNvbm5lY3Rpb24gd2lsbCBnbyBhbmQgcGljayB0aGUgZmFzdGVzdCBvbmUuCisJICogSSBzdWdnZXN0IHBlb3BsZSB0byBwbGF5IHdpdGggTmV0cGVyZiBvciBhbnkgYmVuY2htYXJrLi4uCisJICovCisKKwkvKiBOV0lEIChvciBkb21haW4gaWQpICovCisJX191MzIgICAgICAgICAgIG1pbl9ud2lkOyAgICAgICAvKiBNaW5pbWFsIE5XSUQgd2UgYXJlIGFibGUgdG8gc2V0ICovCisJX191MzIgICAgICAgICAgIG1heF9ud2lkOyAgICAgICAvKiBNYXhpbWFsIE5XSUQgd2UgYXJlIGFibGUgdG8gc2V0ICovCisKKwkvKiBPbGQgRnJlcXVlbmN5IChiYWNrd2FyZCBjb21wYXQgLSBtb3ZlZCBsb3dlciApICovCisJX191MTYgICAgICAgICAgIG9sZF9udW1fY2hhbm5lbHM7CisJX191OCAgICAgICAgICAgIG9sZF9udW1fZnJlcXVlbmN5OworCisJLyogU2NhbiBjYXBhYmlsaXRpZXMgKi8KKwlfX3U4ICAgICAgICAgICAgc2Nhbl9jYXBhOworfTsKK3N0YXRpYyBpbnQgcnRsODE4MF93eF9nZXRfcmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopZXh0cmE7CisJc3RydWN0IGl3X3JhbmdlX3dpdGhfc2Nhbl9jYXBhKiB0bXAgPSAoc3RydWN0IGl3X3JhbmdlX3dpdGhfc2Nhbl9jYXBhKilyYW5nZTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTE2IHZhbDsKKwlpbnQgaTsKKworCXdycXUtPmRhdGEubGVuZ3RoID0gc2l6ZW9mKCpyYW5nZSk7CisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2YoKnJhbmdlKSk7CisKKwkvKiBMZXQncyB0cnkgdG8ga2VlcCB0aGlzIHN0cnVjdCBpbiB0aGUgc2FtZSBvcmRlciBhcyBpbgorCSAqIGxpbnV4L2luY2x1ZGUvd2lyZWxlc3MuaAorCSAqLworCisJLyogVE9ETzogU2VlIHdoYXQgdmFsdWVzIHdlIGNhbiBzZXQsIGFuZCByZW1vdmUgdGhlIG9uZXMgd2UgY2FuJ3QKKwkgKiBzZXQsIG9yIGZpbGwgdGhlbSB3aXRoIHNvbWUgZGVmYXVsdCBkYXRhLgorCSAqLworCisJLyogfjUgTWIvcyByZWFsICg4MDIuMTFiKSAqLworCXJhbmdlLT50aHJvdWdocHV0ID0gNSAqIDEwMDAgKiAxMDAwOworCisJLy8gVE9ETzogTm90IHVzZWQgaW4gODAyLjExYj8KKy8vCXJhbmdlLT5taW5fbndpZDsJLyogTWluaW1hbCBOV0lEIHdlIGFyZSBhYmxlIHRvIHNldCAqLworCS8vIFRPRE86IE5vdCB1c2VkIGluIDgwMi4xMWI/CisvLwlyYW5nZS0+bWF4X253aWQ7CS8qIE1heGltYWwgTldJRCB3ZSBhcmUgYWJsZSB0byBzZXQgKi8KKworCS8qIE9sZCBGcmVxdWVuY3kgKGJhY2t3YXJkIGNvbXBhdCAtIG1vdmVkIGxvd2VyICkgKi8KKy8vCXJhbmdlLT5vbGRfbnVtX2NoYW5uZWxzOworLy8JcmFuZ2UtPm9sZF9udW1fZnJlcXVlbmN5OworLy8JcmFuZ2UtPm9sZF9mcmVxWzZdOyAvKiBGaWxsZXIgdG8ga2VlcCAidmVyc2lvbiIgYXQgdGhlIHNhbWUgb2Zmc2V0ICovCisJaWYocHJpdi0+cmZfc2V0X3NlbnMgIT0gTlVMTCkKKwkJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gcHJpdi0+bWF4X3NlbnM7CS8qIHNpZ25hbCBsZXZlbCB0aHJlc2hvbGQgcmFuZ2UgKi8KKworCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOworCS8qIFRPRE86IEZpbmQgcmVhbCBtYXggUlNTSSBhbmQgc3RpY2sgaGVyZSAqLworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDA7CisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gLTk4OworCXJhbmdlLT5tYXhfcXVhbC51cGRhdGVkID0gNzsgLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KKworCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gOTI7IC8qID4gOCUgbWlzc2VkIGJlYWNvbnMgaXMgJ2JhZCcgKi8KKwkvKiBUT0RPOiBGaW5kIHJlYWwgJ2dvb2QnIHRvICdiYWQnIHRocmVzaG9sIHZhbHVlIGZvciBSU1NJICovCisJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gMjAgKyAtOTg7CisJcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gMDsKKwlyYW5nZS0+YXZnX3F1YWwudXBkYXRlZCA9IDc7IC8qIFVwZGF0ZWQgYWxsIHRocmVlICovCisKKwlyYW5nZS0+bnVtX2JpdHJhdGVzID0gUkFURV9DT1VOVDsKKworCWZvciAoaSA9IDA7IGkgPCBSQVRFX0NPVU5UICYmIGkgPCBJV19NQVhfQklUUkFURVM7IGkrKykgeworCQlyYW5nZS0+Yml0cmF0ZVtpXSA9IHJ0bDgxODBfcmF0ZXNbaV07CisJfQorCisJcmFuZ2UtPm1pbl9mcmFnID0gTUlOX0ZSQUdfVEhSRVNIT0xEOworCXJhbmdlLT5tYXhfZnJhZyA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKworCXJhbmdlLT5taW5fcG1wPTA7CisJcmFuZ2UtPm1heF9wbXAgPSA1MDAwMDAwOworCXJhbmdlLT5taW5fcG10ID0gMDsKKwlyYW5nZS0+bWF4X3BtdCA9IDY1NTM1KjEwMDA7CisJcmFuZ2UtPnBtcF9mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKKwlyYW5nZS0+cG10X2ZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKKwlyYW5nZS0+cG1fY2FwYSA9IElXX1BPV0VSX1BFUklPRCB8IElXX1BPV0VSX1RJTUVPVVQgfCBJV19QT1dFUl9BTExfUjsKKworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDE2OworCisvLwlyYW5nZS0+cmV0cnlfY2FwYTsJLyogV2hhdCByZXRyeSBvcHRpb25zIGFyZSBzdXBwb3J0ZWQgKi8KKy8vCXJhbmdlLT5yZXRyeV9mbGFnczsJLyogSG93IHRvIGRlY29kZSBtYXgvbWluIHJldHJ5IGxpbWl0ICovCisvLwlyYW5nZS0+cl90aW1lX2ZsYWdzOwkvKiBIb3cgdG8gZGVjb2RlIG1heC9taW4gcmV0cnkgbGlmZSAqLworLy8JcmFuZ2UtPm1pbl9yZXRyeTsJLyogTWluaW1hbCBudW1iZXIgb2YgcmV0cmllcyAqLworLy8JcmFuZ2UtPm1heF9yZXRyeTsJLyogTWF4aW1hbCBudW1iZXIgb2YgcmV0cmllcyAqLworLy8JcmFuZ2UtPm1pbl9yX3RpbWU7CS8qIE1pbmltYWwgcmV0cnkgbGlmZXRpbWUgKi8KKy8vCXJhbmdlLT5tYXhfcl90aW1lOwkvKiBNYXhpbWFsIHJldHJ5IGxpZmV0aW1lICovCisKKworCWZvciAoaSA9IDAsIHZhbCA9IDA7IGkgPCAxNDsgaSsrKSB7CisKKwkJLy8gSW5jbHVkZSBvbmx5IGxlZ2FsIGZyZXF1ZW5jaWVzIGZvciBzb21lIGNvdW50cmllcworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJaWYgKChHRVRfRE9UMTFEX0lORk8ocHJpdi0+aWVlZTgwMjExKS0+Y2hhbm5lbF9tYXApW2krMV0pIHsKKyNlbHNlCisJCWlmICgocHJpdi0+aWVlZTgwMjExLT5jaGFubmVsX21hcClbaSsxXSkgeworI2VuZGlmCisJCQlyYW5nZS0+ZnJlcVt2YWxdLmkgPSBpICsgMTsKKwkJCXJhbmdlLT5mcmVxW3ZhbF0ubSA9IGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzW2ldICogMTAwMDAwOworCQkJcmFuZ2UtPmZyZXFbdmFsXS5lID0gMTsKKwkJCXZhbCsrOworCQl9IGVsc2UgeworCQkJLy8gRklYTUU6IGRvIHdlIG5lZWQgdG8gc2V0IGFueXRoaW5nIGZvciBjaGFubmVscworCQkJLy8gd2UgZG9uJ3QgdXNlID8KKwkJfQorCisJCWlmICh2YWwgPT0gSVdfTUFYX0ZSRVFVRU5DSUVTKQorCQlicmVhazsKKwl9CisJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB2YWw7CisJcmFuZ2UtPm51bV9jaGFubmVscyA9IHZhbDsKKyNpZiBXSVJFTEVTU19FWFQgPiAxNworCXJhbmdlLT5lbmNfY2FwYSA9IElXX0VOQ19DQVBBX1dQQXxJV19FTkNfQ0FQQV9XUEEyfAorCQkJICBJV19FTkNfQ0FQQV9DSVBIRVJfVEtJUHxJV19FTkNfQ0FQQV9DSVBIRVJfQ0NNUDsKKyNlbmRpZgorCXRtcC0+c2Nhbl9jYXBhID0gMHgwMTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlID0gcHJpdi0+aWVlZTgwMjExOworCWludCByZXQgPSAwOworCisJaWYoIXByaXYtPnVwKSByZXR1cm4gLUVORVRET1dOOworCisJaWYgKHByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uYkJ1c3lUcmFmZmljID09IHRydWUpCisJCXJldHVybiAtRUFHQUlOOworCWlmICh3cnF1LT5kYXRhLmZsYWdzICYgSVdfU0NBTl9USElTX0VTU0lEKQorCXsKKwkJc3RydWN0IGl3X3NjYW5fcmVxKiByZXEgPSAoc3RydWN0IGl3X3NjYW5fcmVxKiliOworCQlpZiAocmVxLT5lc3NpZF9sZW4pCisJCXsKKwkJCS8vcHJpbnRrKCI9PSoqJiomKiYqKj09PT5zY2FuIHNldCBzc2lkOiVzXG4iLCByZXEtPmVzc2lkKTsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IHJlcS0+ZXNzaWRfbGVuOworCQkJbWVtY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCByZXEtPmVzc2lkLCByZXEtPmVzc2lkX2xlbik7CisJCQkvL3ByaW50aygiPT09PT0+bmV0d29yayBzc2lkOiVzXG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCk7CisJCX0KKwl9CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCl7CisJCXByaXYtPmllZWU4MDIxMS0+c2Nhbm5pbmcgPSAwOworCQlpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybyhwcml2LT5pZWVlODAyMTEpOworCQlyZXQgPSAwOworCX0KKwllbHNlCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9zY2FuKHByaXYtPmllZWU4MDIxMSxhLHdycXUsYik7CisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisKKwlpbnQgcmV0OworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKCFwcml2LT51cCkgcmV0dXJuIC1FTkVURE9XTjsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlyZXQgPSBpZWVlODAyMTFfd3hfZ2V0X3NjYW4ocHJpdi0+aWVlZTgwMjExLGEsd3JxdSxiKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByODE5Ml93eF9zZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X2Vzc2lkKHByaXYtPmllZWU4MDIxMSxhLHdycXUsYik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKKworCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlyZXQgPSBpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkKHByaXYtPmllZWU4MDIxMSwgYSwgd3JxdSwgYik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCByODE5Ml93eF9zZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCWludCByZXQ7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfZnJlcShwcml2LT5pZWVlODAyMTEsIGEsIHdycXUsIGIpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByODE5Ml93eF9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfbmFtZShwcml2LT5pZWVlODAyMTEsIGluZm8sIHdycXUsIGV4dHJhKTsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmICh3cnF1LT5mcmFnLmRpc2FibGVkKQorCQlwcml2LT5pZWVlODAyMTEtPmZ0cyA9IERFRkFVTFRfRlJBR19USFJFU0hPTEQ7CisJZWxzZSB7CisJCWlmICh3cnF1LT5mcmFnLnZhbHVlIDwgTUlOX0ZSQUdfVEhSRVNIT0xEIHx8CisJCSAgICB3cnF1LT5mcmFnLnZhbHVlID4gTUFYX0ZSQUdfVEhSRVNIT0xEKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcHJpdi0+aWVlZTgwMjExLT5mdHMgPSB3cnF1LT5mcmFnLnZhbHVlICYgfjB4MTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXdycXUtPmZyYWcudmFsdWUgPSBwcml2LT5pZWVlODAyMTEtPmZ0czsKKwl3cnF1LT5mcmFnLmZpeGVkID0gMDsJLyogbm8gYXV0byBzZWxlY3QgKi8KKwl3cnF1LT5mcmFnLmRpc2FibGVkID0gKHdycXUtPmZyYWcudmFsdWUgPT0gREVGQVVMVF9GUkFHX1RIUkVTSE9MRCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF93YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHVuaW9uIGl3cmVxX2RhdGEgKmF3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisKKwlpbnQgcmV0OworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKy8vICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKnRlbXAgPSAoc3RydWN0IHNvY2thZGRyICopYXdycTsKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF93YXAocHJpdi0+aWVlZTgwMjExLGluZm8sYXdycSxleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7CisKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF93YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X3dhcChwcml2LT5pZWVlODAyMTEsaW5mbyx3cnF1LGV4dHJhKTsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9lbmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF9lbmNvZGUocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBrZXkpOworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9lbmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJaW50IHJldDsKKworCS8vdTMyIFRhcmdldENvbnRlbnQ7CisJdTMyIGh3a2V5WzRdPXswLDAsMCwwfTsKKwl1OCBtYXNrPTB4ZmY7CisJdTMyIGtleV9pZHg9MDsKKwkvL3U4IGJyb2FkY2FzdF9hZGRyWzZdID17CTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmfTsKKwl1OCB6ZXJvX2FkZHJbNF1bNl0gPXsJezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfSwKKwkJCQl7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDF9LAorCQkJCXsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMn0sCisJCQkJezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzfSB9OworCWludCBpOworCisgICAgICAgaWYoIXByaXYtPnVwKSByZXR1cm4gLUVORVRET1dOOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCVJUX1RSQUNFKENPTVBfU0VDLCAiU2V0dGluZyBTVyB3ZXAga2V5Iik7CisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9lbmNvZGUocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxrZXkpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKworCisJLy9zb21ldGltZXMsIHRoZSBsZW5ndGggaXMgemVybyB3aGlsZSB3ZSBkbyBub3QgdHlwZSBrZXkgdmFsdWUKKwlpZih3cnF1LT5lbmNvZGluZy5sZW5ndGghPTApeworCisJCWZvcihpPTAgOyBpPDQgOyBpKyspeworCQkJaHdrZXlbaV0gfD0gIGtleVs0KmkrMF0mbWFzazsKKwkJCWlmKGk9PTEmJig0KmkrMSk9PXdycXUtPmVuY29kaW5nLmxlbmd0aCkgbWFzaz0weDAwOworCQkJaWYoaT09MyYmKDQqaSsxKT09d3JxdS0+ZW5jb2RpbmcubGVuZ3RoKSBtYXNrPTB4MDA7CisJCQlod2tleVtpXSB8PSAoa2V5WzQqaSsxXSZtYXNrKTw8ODsKKwkJCWh3a2V5W2ldIHw9IChrZXlbNCppKzJdJm1hc2spPDwxNjsKKwkJCWh3a2V5W2ldIHw9IChrZXlbNCppKzNdJm1hc2spPDwyNDsKKwkJfQorCisJCSNkZWZpbmUgQ09ORl9XRVA0MCAgMHg0CisJCSNkZWZpbmUgQ09ORl9XRVAxMDQgMHgxNAorCisJCXN3aXRjaCh3cnF1LT5lbmNvZGluZy5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCl7CisJCQljYXNlIDA6IGtleV9pZHggPSBpZWVlLT50eF9rZXlpZHg7IGJyZWFrOworCQkJY2FzZSAxOglrZXlfaWR4ID0gMDsgYnJlYWs7CisJCQljYXNlIDI6CWtleV9pZHggPSAxOyBicmVhazsKKwkJCWNhc2UgMzoJa2V5X2lkeCA9IDI7IGJyZWFrOworCQkJY2FzZSA0OglrZXlfaWR4CT0gMzsgYnJlYWs7CisJCQlkZWZhdWx0OiBicmVhazsKKwkJfQorCisJCWlmKHdycXUtPmVuY29kaW5nLmxlbmd0aD09MHg1KXsKKwkJCQlpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX1dFUDQwOworCQkJRW5hYmxlSFdTZWN1cml0eUNvbmZpZzgxOTIoZGV2KTsKKworCQkJc2V0S2V5KCBkZXYsCisJCQkJa2V5X2lkeCwgICAgICAgICAgICAgICAgLy9FbnRyeU5vCisJCQkJa2V5X2lkeCwgICAgICAgICAgICAgICAgLy9LZXlJbmRleAorCQkJCUtFWV9UWVBFX1dFUDQwLCAgICAgICAgIC8vS2V5VHlwZQorCQkJCXplcm9fYWRkcltrZXlfaWR4XSwKKwkJCQkwLCAgICAgICAgICAgICAgICAgICAgICAvL0RlZmF1bHRLZXkKKwkJCQlod2tleSk7ICAgICAgICAgICAgICAgICAvL0tleUNvbnRlbnQKKworCQl9CisKKwkJZWxzZSBpZih3cnF1LT5lbmNvZGluZy5sZW5ndGg9PTB4ZCl7CisJCQkJaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBLRVlfVFlQRV9XRVAxMDQ7CisJCQkJRW5hYmxlSFdTZWN1cml0eUNvbmZpZzgxOTIoZGV2KTsKKworCQkJc2V0S2V5KCBkZXYsCisJCQkJa2V5X2lkeCwgICAgICAgICAgICAgICAgLy9FbnRyeU5vCisJCQkJa2V5X2lkeCwgICAgICAgICAgICAgICAgLy9LZXlJbmRleAorCQkJCUtFWV9UWVBFX1dFUDEwNCwgICAgICAgIC8vS2V5VHlwZQorCQkJCXplcm9fYWRkcltrZXlfaWR4XSwKKwkJCQkwLCAgICAgICAgICAgICAgICAgICAgICAvL0RlZmF1bHRLZXkKKwkJCQlod2tleSk7ICAgICAgICAgICAgICAgICAvL0tleUNvbnRlbnQKKworCQl9CisJCWVsc2UgcHJpbnRrKCJ3cm9uZyB0eXBlIGluIFdFUCwgbm90IFdFUDQwIGFuZCBXRVAxMDRcbiIpOworCisJfQorCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9zY2FuX3R5cGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYWEsIHVuaW9uCisgaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqcCl7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50ICpwYXJtcz0oaW50KilwOworCWludCBtb2RlPXBhcm1zWzBdOworCisJcHJpdi0+aWVlZTgwMjExLT5hY3RpdmVfc2NhbiA9IG1vZGU7CisKKwlyZXR1cm4gMTsKK30KKworCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IGVyciA9IDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTElGRVRJTUUgfHwKKwkgICAgd3JxdS0+cmV0cnkuZGlzYWJsZWQpeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCWlmICghKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTElNSVQpKXsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCWlmKHdycXUtPnJldHJ5LnZhbHVlID4gUjgxODBfTUFYX1JFVFJZKXsKKwkJZXJyPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCWlmICh3cnF1LT5yZXRyeS5mbGFncyAmIElXX1JFVFJZX01BWCkgeworCQlwcml2LT5yZXRyeV9ydHMgPSB3cnF1LT5yZXRyeS52YWx1ZTsKKwkJRE1FU0coIlNldHRpbmcgcmV0cnkgZm9yIFJUUy9DVFMgZGF0YSB0byAlZCIsIHdycXUtPnJldHJ5LnZhbHVlKTsKKworCX1lbHNlIHsKKwkJcHJpdi0+cmV0cnlfZGF0YSA9IHdycXUtPnJldHJ5LnZhbHVlOworCQlETUVTRygiU2V0dGluZyByZXRyeSBmb3Igbm9uIFJUUy9DVFMgZGF0YSB0byAlZCIsIHdycXUtPnJldHJ5LnZhbHVlKTsKKwl9CisKKwkvKiBGSVhNRSAhCisJICogV2UgbWlnaHQgdHJ5IHRvIHdyaXRlIGRpcmVjdGx5IHRoZSBUWCBjb25maWcgcmVnaXN0ZXIKKwkgKiBvciB0byByZXN0YXJ0IGp1c3QgdGhlIChSKVRYIHByb2Nlc3MuCisJICogSSdtIHVuc3VyZSBpZiB3aG9sZSByZXNldCBpcyByZWFsbHkgbmVlZGVkCisJICovCisKKwlydGw4MTkyX2NvbW1pdChkZXYpOworCS8qCisJaWYocHJpdi0+dXApeworCQlydGw4MTgwX3J0eF9kaXNhYmxlKGRldik7CisJCXJ0bDgxODBfcnhfZW5hYmxlKGRldik7CisJCXJ0bDgxODBfdHhfZW5hYmxlKGRldik7CisKKwl9CisJKi8KK2V4aXQ6CisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKwl3cnF1LT5yZXRyeS5kaXNhYmxlZCA9IDA7IC8qIGNhbid0IGJlIGRpc2FibGVkICovCisKKwlpZiAoKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfVFlQRSkgPT0KKwkgICAgSVdfUkVUUllfTElGRVRJTUUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTUFYKSB7CisJCXdycXUtPnJldHJ5LmZsYWdzID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9NQVg7CisJCXdycXUtPnJldHJ5LnZhbHVlID0gcHJpdi0+cmV0cnlfcnRzOworCX0gZWxzZSB7CisJCXdycXUtPnJldHJ5LmZsYWdzID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9NSU47CisJCXdycXUtPnJldHJ5LnZhbHVlID0gcHJpdi0+cmV0cnlfZGF0YTsKKwl9CisJLy9wcmludGsoInJldHVybmluZyAlZCIsd3JxdS0+cmV0cnkudmFsdWUpOworCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByODE5Ml93eF9nZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWlmKHByaXYtPnJmX3NldF9zZW5zID09IE5VTEwpCisJCXJldHVybiAtMTsgLyogd2UgaGF2ZSBub3QgdGhpcyBzdXBwb3J0IGZvciB0aGlzIHJhZGlvICovCisJd3JxdS0+c2Vucy52YWx1ZSA9IHByaXYtPnNlbnM7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCByODE5Ml93eF9zZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlzaG9ydCBlcnIgPSAwOworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJLy9ETUVTRygiYXR0ZW1wdCB0byBzZXQgc2Vuc2l2aXR5IHRvICVkZGIiLHdycXUtPnNlbnMudmFsdWUpOworCWlmKHByaXYtPnJmX3NldF9zZW5zID09IE5VTEwpIHsKKwkJZXJyPSAtMTsgLyogd2UgaGF2ZSBub3QgdGhpcyBzdXBwb3J0IGZvciB0aGlzIHJhZGlvICovCisJCWdvdG8gZXhpdDsKKwl9CisJaWYocHJpdi0+cmZfc2V0X3NlbnMoZGV2LCB3cnF1LT5zZW5zLnZhbHVlKSA9PSAwKQorCQlwcml2LT5zZW5zID0gd3JxdS0+c2Vucy52YWx1ZTsKKwllbHNlCisJCWVycj0gLUVJTlZBTDsKKworZXhpdDoKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiBlcnI7Cit9CisKKyNpZiAoV0lSRUxFU1NfRVhUID49IDE4KQorLy9odyBzZWN1cml0eSBuZWVkIHRvIHJlb3JnYW5pemVkLgorc3RhdGljIGludCByODE5Ml93eF9zZXRfZW5jX2V4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0PTA7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlID0gcHJpdi0+aWVlZTgwMjExOworCS8vcHJpbnRrKCI9PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9leHQocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBleHRyYSk7CisKKwl7CisJCXU4IGJyb2FkY2FzdF9hZGRyWzZdID0gezB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmfTsKKwkJdTggemVyb1s2XSA9IHswfTsKKwkJdTMyIGtleVs0XSA9IHswfTsKKwkJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOworCQlzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworCQl1OCBpZHggPSAwLCBhbGcgPSAwLCBncm91cCA9IDA7CisJCWlmICgoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB8fAorCQlleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX05PTkUpIC8vbm9uZSBpcyBub3QgYWxsb3dlZCB0byB1c2UgaHdzZWMgV0IgMjAwOC4wNy4wMQorCQkJZ290byBlbmRfaHdfc2VjOworCisJCWFsZyA9ICAoZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19DQ01QKT9LRVlfVFlQRV9DQ01QOmV4dC0+YWxnOyAvLyBhcyBJV19FTkNPREVfQUxHX0NDTVAgaXMgZGVmaW5lZCB0byBiZSAzIGFuZCBLRVlfVFlQRV9DQ01QIGlzIGRlZmluZWQgdG8gNDsKKwkJaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCQlpZiAoaWR4KQorCQkJaWR4IC0tOworCQlncm91cCA9IGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVk7CisKKwkJaWYgKCghZ3JvdXApIHx8IChJV19NT0RFX0FESE9DID09IGllZWUtPml3X21vZGUpIHx8IChhbGcgPT0gIEtFWV9UWVBFX1dFUDQwKSkKKwkJeworCQkJaWYgKChleHQtPmtleV9sZW4gPT0gMTMpICYmIChhbGcgPT0gS0VZX1RZUEVfV0VQNDApICkKKwkJCQlhbGcgPSBLRVlfVFlQRV9XRVAxMDQ7CisJCQlpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IGFsZzsKKwkJCUVuYWJsZUhXU2VjdXJpdHlDb25maWc4MTkyKGRldik7CisJCX0KKwkJbWVtY3B5KCh1OCopa2V5LCBleHQtPmtleSwgMTYpOyAvL3dlIG9ubHkgZ2V0IDE2IGJ5dGVzIGtleS53aHk/IFdCIDIwMDguNy4xCisKKwkJaWYgKChhbGcgJiBLRVlfVFlQRV9XRVA0MCkgJiYgKGllZWUtPmF1dGhfbW9kZSAhPTIpICkKKwkJeworCisJCQlzZXRLZXkoIGRldiwKKwkJCQkJaWR4LC8vRW50cnlObworCQkJCQlpZHgsIC8vS2V5SW5kZXgKKwkJCQkJYWxnLCAgLy9LZXlUeXBlCisJCQkJCXplcm8sIC8vTWFjQWRkcgorCQkJCQkwLCAgICAgICAgICAgICAgLy9EZWZhdWx0S2V5CisJCQkJCWtleSk7ICAgICAgICAgICAvL0tleUNvbnRlbnQKKwkJfQorCQllbHNlIGlmIChncm91cCkKKwkJeworCQkJaWVlZS0+Z3JvdXBfa2V5X3R5cGUgPSBhbGc7CisJCQlzZXRLZXkoIGRldiwKKwkJCQkJaWR4LC8vRW50cnlObworCQkJCQlpZHgsIC8vS2V5SW5kZXgKKwkJCQkJYWxnLCAgLy9LZXlUeXBlCisJCQkJCWJyb2FkY2FzdF9hZGRyLCAvL01hY0FkZHIKKwkJCQkJMCwgICAgICAgICAgICAgIC8vRGVmYXVsdEtleQorCQkJCQlrZXkpOyAgICAgICAgICAgLy9LZXlDb250ZW50CisJCX0KKwkJZWxzZSAvL3BhaXJ3aXNlIGtleQorCQl7CisJCQlzZXRLZXkoIGRldiwKKwkJCQkJNCwvL0VudHJ5Tm8KKwkJCQkJaWR4LCAvL0tleUluZGV4CisJCQkJCWFsZywgIC8vS2V5VHlwZQorCQkJCQkodTgqKWllZWUtPmFwX21hY19hZGRyLCAvL01hY0FkZHIKKwkJCQkJMCwgICAgICAgICAgICAgIC8vRGVmYXVsdEtleQorCQkJCQlrZXkpOyAgICAgICAgICAgLy9LZXlDb250ZW50CisJCX0KKworCisJfQorCitlbmRfaHdfc2VjOgorCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKKworfQorc3RhdGljIGludCByODE5Ml93eF9zZXRfYXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCQl1bmlvbiBpd3JlcV9kYXRhICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0PTA7CisJLy9wcmludGsoIj09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X2F1dGgocHJpdi0+aWVlZTgwMjExLCBpbmZvLCAmKGRhdGEtPnBhcmFtKSwgZXh0cmEpOworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJLy9wcmludGsoIj09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWludCByZXQ9MDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X21sbWUocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9nZW5faWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkJdW5pb24gaXdyZXFfZGF0YSAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJICAgLy9wcmludGsoIj09PT0+JXMoKSwgbGVuOiVkXG4iLCBfX0ZVTkNUSU9OX18sIGRhdGEtPmxlbmd0aCk7CisJaW50IHJldD0wOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKHByaXYtPmllZWU4MDIxMSwgZXh0cmEsIGRhdGEtPmRhdGEubGVuZ3RoKTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwkvL3ByaW50aygiPD09PT09PSVzKCksIHJldDolZFxuIiwgX19GVU5DVElPTl9fLCByZXQpOworCXJldHVybiByZXQ7CisKKworfQorCitzdGF0aWMgaW50IGR1bW15KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LGNoYXIgKmIpCit7CisJcmV0dXJuIC0xOworfQorCisKK3N0YXRpYyBpd19oYW5kbGVyIHI4MTkyX3d4X2hhbmRsZXJzW10gPQoreworCU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV0NPTU1JVCAqLworCXI4MTkyX3d4X2dldF9uYW1lLCAgIAkgIC8qIFNJT0NHSVdOQU1FICovCisJZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXTldJRCAqLworCWR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV05XSUQgKi8KKwlyODE5Ml93eF9zZXRfZnJlcSwgICAgICAgIC8qIFNJT0NTSVdGUkVRICovCisJcjgxOTJfd3hfZ2V0X2ZyZXEsICAgICAgICAvKiBTSU9DR0lXRlJFUSAqLworCXI4MTkyX3d4X3NldF9tb2RlLCAgICAgICAgLyogU0lPQ1NJV01PREUgKi8KKwlyODE5Ml93eF9nZXRfbW9kZSwgICAgICAgIC8qIFNJT0NHSVdNT0RFICovCisJcjgxOTJfd3hfc2V0X3NlbnMsICAgICAgICAvKiBTSU9DU0lXU0VOUyAqLworCXI4MTkyX3d4X2dldF9zZW5zLCAgICAgICAgLyogU0lPQ0dJV1NFTlMgKi8KKwlOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSQU5HRSAqLworCXJ0bDgxODBfd3hfZ2V0X3JhbmdlLAkgIC8qIFNJT0NHSVdSQU5HRSAqLworCU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1BSSVYgKi8KKwlOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdQUklWICovCisJTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1RBVFMgKi8KKwlOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTVEFUUyAqLworCWR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NQWSAqLworCWR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NQWSAqLworCU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1RIUlNQWSAqLworCU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1dJV1RIUlNQWSAqLworCXI4MTkyX3d4X3NldF93YXAsICAgICAgCSAgLyogU0lPQ1NJV0FQICovCisJcjgxOTJfd3hfZ2V0X3dhcCwgICAgICAgICAvKiBTSU9DR0lXQVAgKi8KKyNpZiAoV0lSRUxFU1NfRVhUID49IDE4KQorCXI4MTkyX3d4X3NldF9tbG1lLCAgICAgICAgICAgICAgICAgICAgIC8qIE1MTUUtLSAqLworI2Vsc2UKKwkgTlVMTCwKKyNlbmRpZgorCWR1bW15LCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdBUExJU1QgLS0gZGVwcmljYXRlZCAqLworCXI4MTkyX3d4X3NldF9zY2FuLCAgICAgICAgLyogU0lPQ1NJV1NDQU4gKi8KKwlyODE5Ml93eF9nZXRfc2NhbiwgICAgICAgIC8qIFNJT0NHSVdTQ0FOICovCisJcjgxOTJfd3hfc2V0X2Vzc2lkLCAgICAgICAvKiBTSU9DU0lXRVNTSUQgKi8KKwlyODE5Ml93eF9nZXRfZXNzaWQsICAgICAgIC8qIFNJT0NHSVdFU1NJRCAqLworCWR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV05JQ0tOICovCisJZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXTklDS04gKi8KKwlOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKwlyODE5Ml93eF9zZXRfcmF0ZSwgICAgICAgIC8qIFNJT0NTSVdSQVRFICovCisJcjgxOTJfd3hfZ2V0X3JhdGUsICAgICAgICAvKiBTSU9DR0lXUkFURSAqLworCXI4MTkyX3d4X3NldF9ydHMsICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUlRTICovCisJcjgxOTJfd3hfZ2V0X3J0cywgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdSVFMgKi8KKwlyODE5Ml93eF9zZXRfZnJhZywgICAgICAgIC8qIFNJT0NTSVdGUkFHICovCisJcjgxOTJfd3hfZ2V0X2ZyYWcsICAgICAgICAvKiBTSU9DR0lXRlJBRyAqLworCWR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1RYUE9XICovCisJZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXVFhQT1cgKi8KKwlyODE5Ml93eF9zZXRfcmV0cnksICAgICAgIC8qIFNJT0NTSVdSRVRSWSAqLworCXI4MTkyX3d4X2dldF9yZXRyeSwgICAgICAgLyogU0lPQ0dJV1JFVFJZICovCisJcjgxOTJfd3hfc2V0X2VuYywgICAgICAgICAvKiBTSU9DU0lXRU5DT0RFICovCisJcjgxOTJfd3hfZ2V0X2VuYywgICAgICAgICAvKiBTSU9DR0lXRU5DT0RFICovCisJcjgxOTJfd3hfc2V0X3Bvd2VyLCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1BPV0VSICovCisJcjgxOTJfd3hfZ2V0X3Bvd2VyLCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1BPV0VSICovCisJTlVMTCwJCQkvKi0tLWhvbGUtLS0qLworCU5VTEwsIAkJCS8qLS0taG9sZS0tLSovCisJcjgxOTJfd3hfc2V0X2dlbl9pZSwvL05VTEwsIAkJCS8qIFNJT0NTSVdHRU5JRSAqLworCU5VTEwsIAkJCS8qIFNJT0NTSVdHRU5JRSAqLworCisjaWYgKFdJUkVMRVNTX0VYVCA+PSAxOCkKKwlyODE5Ml93eF9zZXRfYXV0aCwvL05VTEwsIAkJCS8qIFNJT0NTSVdBVVRIICovCisJTlVMTCwvL3I4MTkyX3d4X2dldF9hdXRoLC8vTlVMTCwgCQkJLyogU0lPQ1NJV0FVVEggKi8KKwlyODE5Ml93eF9zZXRfZW5jX2V4dCwgCQkJLyogU0lPQ1NJV0VOQ09ERUVYVCAqLworCU5VTEwsLy9yODE5Ml93eF9nZXRfZW5jX2V4dCwvL05VTEwsIAkJCS8qIFNJT0NTSVdFTkNPREVFWFQgKi8KKyNlbHNlCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKyNlbmRpZgorCU5VTEwsIAkJCS8qIFNJT0NTSVdQTUtTQSAqLworCU5VTEwsIAkJCSAvKi0tLWhvbGUtLS0qLworCit9OworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzIHI4MTkyX3ByaXZhdGVfYXJnc1tdID0geworCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDAsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiYmFkY3JjIgorCX0sCisKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MSwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJhY3RpdmVzY2FuIgorCisJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MiwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJyYXd0eCIKKwl9CisjaWZkZWYgSk9ITl9JT0NUTAorCSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MywKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJyZWFkUkYiCisJfQorCSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4NCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJ3cml0ZVJGIgorCX0KKwksCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDUsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAicmVhZEJCIgorCX0KKwksCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDYsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAid3JpdGVCQiIKKwl9CisJLAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHg3LAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInJlYWRuaWNiIgorCX0KKwksCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDgsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAid3JpdGVuaWNiIgorCX0KKwksCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDksCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiYXBpbmZvIgorCX0KKworI2VuZGlmCisJLAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgzLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImZvcmNlcmVzZXQiCisKKwl9CisKK307CisKKworc3RhdGljIGl3X2hhbmRsZXIgcjgxOTJfcHJpdmF0ZV9oYW5kbGVyW10gPSB7CisvLwlyODE5Ml93eF9zZXRfbW9uaXRvciwgIC8qIFNJT0NJV0ZJUlNUUFJJViAqLworCXI4MTkyX3d4X3NldF9jcmNtb24sICAgLypTSU9DSVdTRUNPTkRQUklWKi8KKy8vCXI4MTkyX3d4X3NldF9mb3JjZWFzc29jaWF0ZSwKKy8vCXI4MTkyX3d4X3NldF9iZWFjb25pbnRlcnZhbCwKKy8vCXI4MTkyX3d4X3NldF9tb25pdG9yX3R5cGUsCisJcjgxOTJfd3hfc2V0X3NjYW5fdHlwZSwKKwlyODE5Ml93eF9zZXRfcmF3dHgsCisjaWZkZWYgSk9ITl9JT0NUTAorCXI4MTkyX3d4X3JlYWRfcmVncywKKwlyODE5Ml93eF93cml0ZV9yZWdzLAorCXI4MTkyX3d4X3JlYWRfYmIsCisJcjgxOTJfd3hfd3JpdGVfYmIsCisJcjgxOTJfd3hfcmVhZF9uaWNiLAorCXI4MTkyX3d4X3dyaXRlX25pY2IsCisJcjgxOTJfd3hfZ2V0X2FwX3N0YXR1cywKKyNlbmRpZgorCS8vcjgxOTJfd3hfbnVsbCwKKwlyODE5Ml93eF9mb3JjZV9yZXNldCwKK307CisKKy8vI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworc3RydWN0IGl3X3N0YXRpc3RpY3MgKnI4MTkyX2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyogd3N0YXRzID0gJnByaXYtPndzdGF0czsKKwlpbnQgdG1wX2xldmVsID0gMDsKKwlpbnQgdG1wX3F1YWwgPSAwOworCWludCB0bXBfbm9pc2UgPSAwOworCWlmKGllZWUtPnN0YXRlIDwgSUVFRTgwMjExX0xJTktFRCkKKwl7CisJCXdzdGF0cy0+cXVhbC5xdWFsID0gMDsKKwkJd3N0YXRzLT5xdWFsLmxldmVsID0gMDsKKwkJd3N0YXRzLT5xdWFsLm5vaXNlID0gMDsKKwkJd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX0FMTF9VUERBVEVEIHwgSVdfUVVBTF9EQk07CisJCXJldHVybiB3c3RhdHM7CisJfQorCisgICAgICAgdG1wX2xldmVsID0gKCZpZWVlLT5jdXJyZW50X25ldHdvcmspLT5zdGF0cy5yc3NpOworCXRtcF9xdWFsID0gKCZpZWVlLT5jdXJyZW50X25ldHdvcmspLT5zdGF0cy5zaWduYWw7CisJdG1wX25vaXNlID0gKCZpZWVlLT5jdXJyZW50X25ldHdvcmspLT5zdGF0cy5ub2lzZTsKKwkvL3ByaW50aygibGV2ZWw6JWQsIHF1YWw6JWQsIG5vaXNlOiVkXG4iLCB0bXBfbGV2ZWwsIHRtcF9xdWFsLCB0bXBfbm9pc2UpOworCisJd3N0YXRzLT5xdWFsLmxldmVsID0gdG1wX2xldmVsOworCXdzdGF0cy0+cXVhbC5xdWFsID0gdG1wX3F1YWw7CisJd3N0YXRzLT5xdWFsLm5vaXNlID0gdG1wX25vaXNlOworCXdzdGF0cy0+cXVhbC51cGRhdGVkID0gSVdfUVVBTF9BTExfVVBEQVRFRHwgSVdfUVVBTF9EQk07CisJcmV0dXJuIHdzdGF0czsKK30KKy8vI2VuZGlmCisKKworc3RydWN0IGl3X2hhbmRsZXJfZGVmICByODE5Ml93eF9oYW5kbGVyc19kZWY9eworCS5zdGFuZGFyZCA9IHI4MTkyX3d4X2hhbmRsZXJzLAorCS5udW1fc3RhbmRhcmQgPSBzaXplb2YocjgxOTJfd3hfaGFuZGxlcnMpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5wcml2YXRlID0gcjgxOTJfcHJpdmF0ZV9oYW5kbGVyLAorCS5udW1fcHJpdmF0ZSA9IHNpemVvZihyODE5Ml9wcml2YXRlX2hhbmRsZXIpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5udW1fcHJpdmF0ZV9hcmdzID0gc2l6ZW9mKHI4MTkyX3ByaXZhdGVfYXJncykgLyBzaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisJLmdldF93aXJlbGVzc19zdGF0cyA9IHI4MTkyX2dldF93aXJlbGVzc19zdGF0cywKKyNlbmRpZgorCS5wcml2YXRlX2FyZ3MgPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKXI4MTkyX3ByaXZhdGVfYXJncywKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX3d4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX3d4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmN2E1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfd3guaApAQCAtMCwwICsxLDIzIEBACisvKgorCVRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyIC0gdiAwLjMKKwlDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKwlSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlcgorCisJV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiBzdWNoIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIgcHJvamVjdCBBdXRob3JzLgorKi8KKworLyogdGhpcyBmaWxlICh3aWxsKSBjb250YWlucyB3aXJlbGVzcyBleHRlbnNpb24gaGFuZGxlcnMqLworCisjaWZuZGVmIFI4MTgwX1dYX0gKKyNkZWZpbmUgUjgxODBfV1hfSAorLy8jaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKy8vI2luY2x1ZGUgImllZWU4MDIxMS5oIgorZXh0ZXJuIHN0cnVjdCBpd19oYW5kbGVyX2RlZiByODE5Ml93eF9oYW5kbGVyc19kZWY7CisvKiBFbmFibGUgIHRoZSBydGw4MTl4X2NvcmUuYyB0byBzaGFyZSB0aGlzIGZ1bmN0aW9uLCBkYXZpZCAyMDA4LjkuMjIgKi8KK2V4dGVybiBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcjgxOTJfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfSFRHZW4uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfSFRHZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzdiNmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9IVEdlbi5oCkBAIC0wLDAgKzEsMTMgQEAKKy8vCisvLyBJT1QgQWN0aW9uIGZvciBkaWZmZXJlbnQgQVAKKy8vCit0eXBlZGVmIGVudW0gX0hUX0lPVF9BQ1RJT057CisJSFRfSU9UX0FDVF9UWF9VU0VfQU1TRFVfNEsgPSAweDAwMDAwMDAxLAorCUhUX0lPVF9BQ1RfVFhfVVNFX0FNU0RVXzhLID0gMHgwMDAwMDAwMiwKKwlIVF9JT1RfQUNUX0RFQ0xBUkVfTUNTMTMgPSAweDAwMDAwMDA0LAorCUhUX0lPVF9BQ1RfRElTQUJMRV9FRENBX1RVUkJPID0gMHgwMDAwMDAwOCwKKwlIVF9JT1RfQUNUX01HTlRfVVNFX0NDS182TSA9IDB4MDAwMDAwMTAsCisJSFRfSU9UX0FDVF9DRERfRlNZTkMgPSAweDAwMDAwMDIwLAorCUhUX0lPVF9BQ1RfUFVSRV9OX01PREUgPSAweDAwMDAwMDQwLAorfUhUX0lPVF9BQ1RJT05fRSwgKlBIVF9JT1RfQUNUSU9OX0U7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfSFRUeXBlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX0hUVHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZjU4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX0hUVHlwZS5oCkBAIC0wLDAgKzEsMzkxIEBACisjaWZuZGVmIF9SODE5WFVfSFRUWVBFX0hfCisjZGVmaW5lIF9SODE5WFVfSFRUWVBFX0hfCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBIVCBDYXBhYmlsaXR5IGVsZW1lbnQgaXMgcHJlc2VudCBpbiBiZWFjb25zLCBhc3NvY2lhdGlvbiByZXF1ZXN0LAorLy8JcmVhc3NvY2lhdGlvbiByZXF1ZXN0IGFuZCBwcm9iZSByZXNwb25zZSBmcmFtZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vCisvLyBPcGVyYXRpb24gbW9kZSB2YWx1ZQorLy8KKyNkZWZpbmUgSFRfT1BNT0RFX05PX1BST1RFQ1QJCTAKKyNkZWZpbmUgSFRfT1BNT0RFX09QVElPTkFMCQkxCisjZGVmaW5lIEhUX09QTU9ERV80ME1IWl9QUk9URUNUCTIKKyNkZWZpbmUgSFRfT1BNT0RFX01JWEVECQkJMworCisvLworLy8gTUlNTyBQb3dlciBTYXZlIFNldGluZ3MKKy8vCisjZGVmaW5lIE1JTU9fUFNfU1RBVElDCQkJCTAKKyNkZWZpbmUgTUlNT19QU19EWU5BTUlDCQkJMQorI2RlZmluZSBNSU1PX1BTX05PTElNSVQJCQkzCisKKworLy8KKy8vCVRoZXJlIHNob3VsZCBiZSAxMjggYml0cyB0byBjb3ZlciBhbGwgb2YgdGhlIE1DUyByYXRlcy4gSG93ZXZlciwgc2luY2UKKy8vCTgxOTAgZG9lcyBub3Qgc3VwcG9ydCB0b28gbXVjaCByYXRlcywgb25lIGludGVnZXIgaXMgcXVpdGUgZW5vdWdoLgorLy8KKworI2RlZmluZSBzSFRDTG5nCTQKKworCisjZGVmaW5lIEhUX1NVUFBPUlRFRF9NQ1NfMVNTX0JJVE1BUAkJCQkJMHgwMDAwMDBmZgorI2RlZmluZSBIVF9TVVBQT1JURURfTUNTXzJTU19CSVRNQVAJCQkJCTB4MDAwMGZmMDAKKyNkZWZpbmUgSFRfU1VQUE9SVEVEX01DU18xU1NfMlNTX0JJVE1BUAkJCUhUX01DU18xU1NfQklUTUFQfEhUX01DU18xU1NfMlNTX0JJVE1BUAorCisKK3R5cGVkZWYgZW51bSBfSFRfTUNTX1JBVEV7CisJSFRfTUNTMCAgID0gMHgwMDAwMDAwMSwKKwlIVF9NQ1MxICAgPSAweDAwMDAwMDAyLAorCUhUX01DUzIgICA9IDB4MDAwMDAwMDQsCisJSFRfTUNTMyAgID0gMHgwMDAwMDAwOCwKKwlIVF9NQ1M0ICAgPSAweDAwMDAwMDEwLAorCUhUX01DUzUgICA9IDB4MDAwMDAwMjAsCisJSFRfTUNTNiAgID0gMHgwMDAwMDA0MCwKKwlIVF9NQ1M3ICAgPSAweDAwMDAwMDgwLAorCUhUX01DUzggICA9IDB4MDAwMDAxMDAsCisJSFRfTUNTOSAgID0gMHgwMDAwMDIwMCwKKwlIVF9NQ1MxMCA9IDB4MDAwMDA0MDAsCisJSFRfTUNTMTEgPSAweDAwMDAwODAwLAorCUhUX01DUzEyID0gMHgwMDAwMTAwMCwKKwlIVF9NQ1MxMyA9IDB4MDAwMDIwMDAsCisJSFRfTUNTMTQgPSAweDAwMDA0MDAwLAorCUhUX01DUzE1ID0gMHgwMDAwODAwMCwKKwkvLyBEbyBub3QgZGVmaW5lIE1DUzMyIGhlcmUgYWx0aG91Z2ggODE5MCBzdXBwb3J0IE1DUzMyCit9SFRfTUNTX1JBVEUsKlBIVF9NQ1NfUkFURTsKKworLy8KKy8vIFJlcHJlc2VudCBDaGFubmVsIFdpZHRoIGluIEhUIENhcGFiaWxpdGllcworLy8KK3R5cGVkZWYgZW51bSBfSFRfQ0hBTk5FTF9XSURUSHsKKwlIVF9DSEFOTkVMX1dJRFRIXzIwID0gMCwKKwlIVF9DSEFOTkVMX1dJRFRIXzIwXzQwID0gMSwKK31IVF9DSEFOTkVMX1dJRFRILCAqUEhUX0NIQU5ORUxfV0lEVEg7CisKKy8vCisvLyBSZXByZXNlbnQgRXh0ZW50aW9uIENoYW5uZWwgT2Zmc2V0IGluIEhUIENhcGFiaWxpdGllcworLy8gVGhpcyBpcyBhdmFpbGFibGUgb25seSBpbiA0ME1oeiBtb2RlLgorLy8KK3R5cGVkZWYgZW51bSBfSFRfRVhUQ0hOTF9PRkZTRVR7CisJSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUID0gMCwKKwlIVF9FWFRDSE5MX09GRlNFVF9VUFBFUiA9IDEsCisJSFRfRVhUQ0hOTF9PRkZTRVRfTk9fREVGID0gMiwKKwlIVF9FWFRDSE5MX09GRlNFVF9MT1dFUiA9IDMsCit9SFRfRVhUQ0hOTF9PRkZTRVQsICpQSFRfRVhUQ0hOTF9PRkZTRVQ7CisKK3R5cGVkZWYgZW51bSBfQ0hOTE9QeworCUNITkxPUF9OT05FID0gMCwgLy8gTm8gQWN0aW9uIG5vdworCUNITkxPUF9TQ0FOID0gMSwgLy8gU2NhbiBpbiBwcm9ncmVzcworCUNITkxPUF9TV0JXID0gMiwgLy8gQmFuZHdpZHRoIHN3aXRjaGluZyBpbiBwcm9ncmVzcworCUNITkxPUF9TV0NITkwgPSAzLCAvLyBTb2Z0d2FyZSBDaGFubmVsIHN3aXRjaGluZyBpbiBwcm9ncmVzcworfSBDSE5MT1AsICpQQ0hOTE9QOworCisvLyBEZXRlcm1pbmUgaWYgdGhlIENoYW5uZWwgT3BlcmF0aW9uIGlzIGluIHByb2dyZXNzCisjZGVmaW5lIENISExPUF9JTl9QUk9HUkVTUyhfcEhUSW5mbykJXAorCQkoKF9wSFRJbmZvKS0+Q2hubE9wID4gQ0hOTE9QX05PTkUpID8gVFJVRSA6IEZBTFNFCisKKwordHlwZWRlZiBlbnVtIF9IVF9BQ1RJT057CisJQUNUX1JFQ09NTUFORF9XSURUSAkJPSAwLAorCUFDVF9NSU1PX1BXUl9TQVZFIAkJPSAxLAorCUFDVF9QU01QCQkJCQk9IDIsCisJQUNUX1NFVF9QQ09fUEhBU0UJCT0gMywKKwlBQ1RfTUlNT19DSExfTUVBU1VSRQk9IDQsCisJQUNUX1JFQ0lQUk9DSVRZX0NPUlJFQ1QJPSA1LAorCUFDVF9NSU1PX0NTSV9NQVRSSUNTCQk9IDYsCisJQUNUX01JTU9fTk9DT01QUl9TVEVFUgk9IDcsCisJQUNUX01JTU9fQ09NUFJfU1RFRVIJCT0gOCwKKwlBQ1RfQU5URU5OQV9TRUxFQ1QJCT0gOSwKK30gSFRfQUNUSU9OLCAqUEhUX0FDVElPTjsKKworCisvKiAyMDA3LzA2LzA3IE1IIERlZmluZSBzdWItY2FycmllciBtb2RlIGZvciA0ME1IWi4gKi8KK3R5cGVkZWYgZW51bSBfSFRfQmFuZHdpZHRoXzQwTUhaX1N1Yl9DYXJyaWVyeworCVNDX01PREVfRFVQTElDQVRFID0gMCwKKwlTQ19NT0RFX0xPV0VSID0gMSwKKwlTQ19NT0RFX1VQUEVSID0gMiwKKwlTQ19NT0RFX0ZVTEw0ME1IWiA9IDMsCit9SFRfQlc0MF9TQ19FOworCit0eXBlZGVmCXN0cnVjdCBfSFRfQ0FQQUJJTElUWV9FTEV7CisKKwkvL0hUIGNhcGFiaWxpdHkgaW5mbworCXU4CUFkdkNvZGluZzoxOworCXU4CUNobFdpZHRoOjE7CisJdTgJTWltb1B3clNhdmU6MjsKKwl1OAlHcmVlbkZpZWxkOjE7CisJdTgJU2hvcnRHSTIwTWh6OjE7CisJdTgJU2hvcnRHSTQwTWh6OjE7CisJdTgJVHhTVEJDOjE7CisJdTgJUnhTVEJDOjI7CisJdTgJRGVsYXlCQToxOworCXU4CU1heEFNU0RVU2l6ZToxOworCXU4CURzc0NDazoxOworCXU4CVBTTVA6MTsKKwl1OAlSc3ZkMToxOworCXU4CUxTaWdUeG9wUHJvdGVjdDoxOworCisJLy9NQUMgSFQgcGFyYW1ldGVycyBpbmZvCisJdTgJTWF4UnhBTVBEVUZhY3RvcjoyOworCXU4CU1QRFVEZW5zaXR5OjM7CisJdTgJUnN2ZDI6MzsKKworCS8vU3VwcG9ydGVkIE1DUyBzZXQKKwl1OAlNQ1NbMTZdOworCisKKwkvL0V4dGVuZGVkIEhUIENhcGFiaWxpdHkgSW5mbworCXUxNglFeHRIVENhcEluZm87CisKKwkvL1RYQkYgQ2FwYWJpbGl0aWVzCisJdTgJVHhCRkNhcFs0XTsKKworCS8vQW50ZW5uYSBTZWxlY3Rpb24gQ2FwYWJpbGl0aWVzCisJdTgJQVNDYXA7CisKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBIVF9DQVBBQklMSVRZX0VMRSwgKlBIVF9DQVBBQklMSVRZX0VMRTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBIVCBJbmZvcm1hdGlvbiBlbGVtZW50IGlzIHByZXNlbnQgaW4gYmVhY29ucworLy8gT25seSBBUCBpcyByZXF1aXJlZCB0byBpbmNsdWRlIHRoaXMgZWxlbWVudAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgX0hUX0lORk9STUFUSU9OX0VMRXsKKwl1OAlDb250cm9sQ2hsOworCisJdTgJRXh0Q2hsT2Zmc2V0OjI7CisJdTgJUmVjb21tZW1kZWRUeFdpZHRoOjE7CisJdTgJUklGUzoxOworCXU4CVBTTVBBY2Nlc3NPbmx5OjE7CisJdTgJU3J2SW50R3JhbnVsYXJpdHk6MzsKKworCXU4CU9wdE1vZGU6MjsKKwl1OAlOb25HRkRldlByZXNlbnQ6MTsKKwl1OAlSZXZkMTo1OworCXU4CVJldmQyOjg7CisKKwl1OAlSc3ZkMzo2OworCXU4CUR1YWxCZWFjb246MTsKKwl1OAlEdWFsQ1RTUHJvdGVjdDoxOworCisJdTgJU2Vjb25kYXJ5QmVhY29uOjE7CisJdTgJTFNpZ1R4b3BQcm90ZWN0RnVsbDoxOworCXU4CVBjb0FjdGl2ZToxOworCXU4CVBjb1BoYXNlOjE7CisJdTgJUnN2ZDQ6NDsKKworCXU4CUJhc2ljTVNDWzE2XTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBIVF9JTkZPUk1BVElPTl9FTEUsICpQSFRfSU5GT1JNQVRJT05fRUxFOworCisvLworLy8gTUlNTyBQb3dlciBTYXZlIGNvbnRyb2wgZmllbGQuCisvLyBUaGlzIGlzIGFwcGVhciBpbiBNSU1PIFBvd2VyIFNhdmUgQWN0aW9uIEZyYW1lCisvLwordHlwZWRlZiBzdHJ1Y3QgX01JTU9QU19DVFJMeworCXU4CU1pbW9Qc0VuYWJsZToxOworCXU4CU1pbW9Qc01vZGU6MTsKKwl1OAlSZXNlcnZlZDo2OworfSBNSU1PUFNfQ1RSTCwgKlBNSU1PUFNfQ1RSTDsKKwordHlwZWRlZiBlbnVtIF9IVF9TUEVDX1ZFUnsKKwlIVF9TUEVDX1ZFUl9JRUVFID0gMCwKKwlIVF9TUEVDX1ZFUl9FV0MgPSAxLAorfUhUX1NQRUNfVkVSLCAqUEhUX1NQRUNfVkVSOworCit0eXBlZGVmIGVudW0gX0hUX0FHR1JFX01PREVfRXsKKwlIVF9BR0dfQVVUTyA9IDAsCisJSFRfQUdHX0ZPUkNFX0VOQUJMRSA9IDEsCisJSFRfQUdHX0ZPUkNFX0RJU0FCTEUgPSAyLAorfUhUX0FHR1JFX01PREVfRSwgKlBIVF9BR0dSRV9NT0RFX0U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgVGhlIERhdGEgc3RydWN0dXJlIGlzIHVzZWQgdG8ga2VlcCBIVCByZWxhdGVkIHZhcmlhYmxlcyB3aGVuIGNhcmQgaXMKKy8vICBjb25maWd1cmVkIGFzIG5vbi1BUCBTVEEgbW9kZS4gICoqTm90ZSoqICBDdXJyZW50X3h4eCBzaG91bGQgYmUgc2V0CisvLwl0byBkZWZhdWx0IHZhbHVlIGluIEhUSW5pdGlhbGl6ZUhUSW5mbygpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCBfUlRfSElHSF9USFJPVUdIUFVUeworLy8JREVDTEFSRV9SVF9PQkpFQ1QoX1JUX0hJR0hfVEhST1VHSFBVVCk7CisJdTgJCQkJYkVuYWJsZUhUOworCXU4CQkJCWJDdXJyZW50SFRTdXBwb3J0OworCisJdTgJCQkJYlJlZ0JXNDBNSHo7CQkJCS8vIFR4IDQwTUh6IGNoYW5uZWwgY2FwYWJsaXR5CisJdTgJCQkJYkN1ckJXNDBNSHo7CQkJCS8vIFR4IDQwTUh6IGNoYW5uZWwgY2FwYWJpbGl0eQorCisJdTgJCQkJYlJlZ1Nob3J0R0k0ME1IejsJCQkvLyBUeCBTaG9ydCBHSSBmb3IgNDBNaHoKKwl1OAkJCQliQ3VyU2hvcnRHSTQwTUh6OwkJCS8vIFR4IFNob3J0IEdJIGZvciA0ME1IegorCisJdTgJCQkJYlJlZ1Nob3J0R0kyME1IejsJCQkvLyBUeCBTaG9ydCBHSSBmb3IgMjBNSHoKKwl1OAkJCQliQ3VyU2hvcnRHSTIwTUh6OwkJCS8vIFR4IFNob3J0IEdJIGZvciAyME1IegorCisJdTgJCQkJYlJlZ1N1cHBDQ0s7CQkJCS8vIFR4IENDSyByYXRlIGNhcGFiaWxpdHkKKwl1OAkJCQliQ3VyU3VwcENDSzsJCQkJLy8gVHggQ0NLIHJhdGUgY2FwYWJpbGl0eQorCisJLy8gODAyLjExbiBzcGVjIHZlcnNpb24gZm9yICJwZWVyIgorCUhUX1NQRUNfVkVSCQkJZVBlZXJIVFNwZWNWZXI7CisKKworCS8vIEhUIHJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yICJTZWxmIgorCUhUX0NBUEFCSUxJVFlfRUxFCVNlbGZIVENhcDsJCQkJCS8vIFRoaXMgaXMgSFQgY2FwIGVsZW1lbnQgc2VudCB0byBwZWVyIFNUQSwgd2hpY2ggYWxzbyBpbmRpY2F0ZSBIVCBSeCBjYXBhYmlsaXRpZXMuCisJSFRfSU5GT1JNQVRJT05fRUxFCVNlbGZIVEluZm87CQkJCQkvLyBUaGlzIGlzIEhUIGluZm8gZWxlbWVudCBzZW50IHRvIHBlZXIgU1RBLCB3aGljaCBhbHNvIGluZGljYXRlIEhUIFJ4IGNhcGFiaWxpdGllcy4KKworCS8vIEhUIHJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yICJQZWVyIgorCXU4CQkJCVBlZXJIVENhcEJ1ZlszMl07CisJdTgJCQkJUGVlckhUSW5mb0J1ZlszMl07CisKKworCS8vIEEtTVNEVSByZWxhdGVkCisJdTgJCQkJYkFNU0RVX1N1cHBvcnQ7CQkJLy8gVGhpcyBpbmRpY2F0ZXMgVHggQS1NU0RVIGNhcGFiaWxpdHkKKwl1MTYJCQkJbkFNU0RVX01heFNpemU7CQkJLy8gVGhpcyBpbmRpY2F0ZXMgVHggQS1NU0RVIGNhcGFiaWxpdHkKKwl1OAkJCQliQ3VycmVudF9BTVNEVV9TdXBwb3J0OwkvLyBUaGlzIGluZGljYXRlcyBUeCBBLU1TRFUgY2FwYWJpbGl0eQorCXUxNgkJCQluQ3VycmVudF9BTVNEVV9NYXhTaXplOwkvLyBUaGlzIGluZGljYXRlcyBUeCBBLU1TRFUgY2FwYWJpbGl0eQorCisKKwkvLyBBTVBEVSAgcmVsYXRlZCA8MjAwNi4wOC4xMCBFbWlseT4KKwl1OAkJCQliQU1QRFVFbmFibGU7CQkJCS8vIFRoaXMgaW5kaWNhdGUgVHggQS1NUERVIGNhcGFiaWxpdHkKKwl1OAkJCQliQ3VycmVudEFNUERVRW5hYmxlOwkJLy8gVGhpcyBpbmRpY2F0ZSBUeCBBLU1QRFUgY2FwYWJpbGl0eQorCXU4CQkJCUFNUERVX0ZhY3RvcjsJCQkJLy8gVGhpcyBpbmRpY2F0ZSBUeCBBLU1QRFUgY2FwYWJpbGl0eQorCXU4CQkJCUN1cnJlbnRBTVBEVUZhY3RvcjsJCS8vIFRoaXMgaW5kaWNhdGUgVHggQS1NUERVIGNhcGFiaWxpdHkKKwl1OAkJCQlNUERVX0RlbnNpdHk7CQkJCS8vIFRoaXMgaW5kaWNhdGUgVHggQS1NUERVIGNhcGFiaWxpdHkKKwl1OAkJCQlDdXJyZW50TVBEVURlbnNpdHk7CQkJLy8gVGhpcyBpbmRpY2F0ZSBUeCBBLU1QRFUgY2FwYWJpbGl0eQorCisJLy8gRm9yY2VkIEEtTVBEVSBlbmFibGUKKwlIVF9BR0dSRV9NT0RFX0UJRm9yY2VkQU1QRFVNb2RlOworCXU4CQkJCUZvcmNlZEFNUERVRmFjdG9yOworCXU4CQkJCUZvcmNlZE1QRFVEZW5zaXR5OworCisJLy8gRm9yY2VkIEEtTVNEVSBlbmFibGUKKwlIVF9BR0dSRV9NT0RFX0UJRm9yY2VkQU1TRFVNb2RlOworCXUxNgkJCQlGb3JjZWRBTVNEVU1heFNpemU7CisKKwl1OAkJCQliRm9yY2VkU2hvcnRHSTsKKworCXU4CQkJCUN1cnJlbnRPcE1vZGU7CisKKwkvLyBNSU1PIFBTIHJlbGF0ZWQKKwl1OAkJCQlTZWxmTWltb1BzOworCXU4CQkJCVBlZXJNaW1vUHM7CisKKwkvLyA0ME1IeiBDaGFubmVsIE9mZnNldCBzZXR0aW5ncy4KKwlIVF9FWFRDSE5MX09GRlNFVAlDdXJTVEFFeHRDaG5sT2Zmc2V0OworCXU4CQkJCWJDdXJUeEJXNDBNSHo7CS8vIElmIHdlIHVzZSA0MCBNSHogdG8gVHgKKwl1OAkJCQlQZWVyQmFuZHdpZHRoOworCisJLy8gRm9yIEJhbmR3aWR0aCBTd2l0Y2hpbmcKKwl1OAkJCQliU3dCd0luUHJvZ3Jlc3M7CisJQ0hOTE9QCQkJCUNobmxPcDsgLy8gc29mdHdhcmUgc3dpdGNoaW5nIGNoYW5uZWwgaW4gcHJvZ3Jlc3MuIEJ5IEJydWNlLCAyMDA4LTAyLTE1LgorCXU4CQkJCVN3QndTdGVwOworCS8vUlRfVElNRVIJCQlTd0J3VGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QJCVN3QndUaW1lcjsKKworCS8vIEZvciBSZWFsdGVrIHByb3ByaWV0YXJ5IEEtTVBEVSBmYWN0b3IgZm9yIGFnZ3JlZ2F0aW9uCisJdTgJCQkJYlJlZ1JUMlJUQWdncmVnYXRpb247CisJdTgJCQkJYkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uOworCXU4CQkJCWJDdXJyZW50UlQyUlRMb25nU2xvdFRpbWU7CisJdTgJCQkJc3pSVDJSVEFnZ0J1ZmZlclsxMF07CisKKwkvLyBSeCBSZW9yZGVyIGNvbnRyb2wKKwl1OAkJCQliUmVnUnhSZW9yZGVyRW5hYmxlOworCXU4CQkJCWJDdXJSeFJlb3JkZXJFbmFibGU7CisJdTgJCQkJUnhSZW9yZGVyV2luU2l6ZTsKKwl1OAkJCQlSeFJlb3JkZXJQZW5kaW5nVGltZTsKKwl1MTYJCQkJUnhSZW9yZGVyRHJvcENvdW50ZXI7CisKKyNpZmRlZiBVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQorCXU4CQkJCVVzYlR4QWdnck51bTsKKyNlbmRpZgorI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCisJdTgJCQkJVXNiUnhGd0FnZ3JFbjsKKwl1OAkJCQlVc2JSeEZ3QWdnclBhZ2VOdW07CisJdTgJCQkJVXNiUnhGd0FnZ3JQYWNrZXROdW07CisJdTgJCQkJVXNiUnhGd0FnZ3JUaW1lb3V0OworI2VuZGlmCisKKwkvLyBBZGQgZm9yIEJyb2FkY29tKExpbmtzeXMpIElPVC4gSm9zZXBoCisJdTgJCQkJYklzUGVlckJjbTsKKworCS8vIEZvciBJT1QgaXNzdWUuCisJdTMyCQkJCQlJT1RBY3Rpb247Cit9UlRfSElHSF9USFJPVUdIUFVULCAqUFJUX0hJR0hfVEhST1VHSFBVVDsKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlIERhdGEgc3RydWN0dXJlIGlzIHVzZWQgdG8ga2VlcCBIVCByZWxhdGVkIHZhcmlhYmxlIGZvciAiZWFjaCBTdGEiCisvLyB3aGVuIGNhcmQgaXMgY29uZmlndXJlZCBhcyAiQVAgbW9kZSIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IF9SVF9IVElORk9fU1RBX0VOVFJZeworCXU4CQkJYkVuYWJsZUhUOworCisJdTgJCQliU3VwcG9ydENjazsKKworCXUxNgkJCUFNU0RVX01heFNpemU7CisKKwl1OAkJCUFNUERVX0ZhY3RvcjsKKwl1OAkJCU1QRFVfRGVuc2l0eTsKKworCXU4CQkJSFRIaWdoZXN0T3BlcmFSYXRlOworCisJdTgJCQliQnc0ME1IejsKKworCXU4CQkJTWltb1BzOworCisJdTgJCQlNY3NSYXRlU2V0WzE2XTsKKworCit9UlRfSFRJTkZPX1NUQV9FTlRSWSwgKlBSVF9IVElORk9fU1RBX0VOVFJZOworCisKKworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgRGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBrZWVwIEhUIHJlbGF0ZWQgdmFyaWFibGUgZm9yICJlYWNoIEFQIgorLy8gd2hlbiBjYXJkIGlzIGNvbmZpZ3VyZWQgYXMgIlNUQSBtb2RlIgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgX0JTU19IVHsKKworCXU4CQkJCWJkU3VwcG9ydEhUOworCisJLy8gSFQgcmVsYXRlZCBlbGVtZW50cworCXU4CQkJCQliZEhUQ2FwQnVmWzMyXTsKKwl1MTYJCQkJCWJkSFRDYXBMZW47CisJdTgJCQkJCWJkSFRJbmZvQnVmWzMyXTsKKwl1MTYJCQkJCWJkSFRJbmZvTGVuOworCisJSFRfU1BFQ19WRVIJCQkJYmRIVFNwZWNWZXI7CisJLy9IVF9DQVBBQklMSVRZX0VMRQkJCWJkSFRDYXBFbGU7CisJLy9IVF9JTkZPUk1BVElPTl9FTEUJCWJkSFRJbmZvRWxlOworCisJdTgJCQkJCWJkUlQyUlRBZ2dyZWdhdGlvbjsKKwl1OAkJCQkJYmRSVDJSVExvbmdTbG90VGltZTsKK31CU1NfSFQsICpQQlNTX0hUOworCit0eXBlZGVmIHN0cnVjdCBfTUlNT19SU1NJeworCXUzMglFbmFibGVBbnRlbm5hOworCXUzMglBbnRlbm5hQTsKKwl1MzIgCUFudGVubmFCOworCXUzMiAJQW50ZW5uYUM7CisJdTMyIAlBbnRlbm5hRDsKKwl1MzIJQXZlcmFnZTsKK31NSU1PX1JTU0ksICpQTUlNT19SU1NJOworCit0eXBlZGVmIHN0cnVjdCBfTUlNT19FVk17CisJdTMyCUVWTTE7CisJdTMyICAgIEVWTTI7Cit9TUlNT19FVk0sICpQTUlNT19FVk07CisKK3R5cGVkZWYgc3RydWN0IF9GQUxTRV9BTEFSTV9TVEFUSVNUSUNTeworCXUzMglDbnRfUGFyaXR5X0ZhaWw7CisJdTMyICAgIENudF9SYXRlX0lsbGVnYWw7CisJdTMyCUNudF9DcmM4X2ZhaWw7CisJdTMyCUNudF9hbGw7Cit9RkFMU0VfQUxBUk1fU1RBVElTVElDUywgKlBGQUxTRV9BTEFSTV9TVEFUSVNUSUNTOworCisKKworI2VuZGlmIC8vX19JTkNfSFRUWVBFX0gKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9jbWRwa3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfY21kcGt0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQxOWE4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfY21kcGt0LmMKQEAgLTAsMCArMSw3OTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAoYykgQ29weXJpZ2h0IDIwMDgsIFJlYWxURUsgVGVjaG5vbG9naWVzIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIE1vZHVsZToJcjgxOXh1c2JfY21kcGt0LmMJKFJUTDgxOTAgVFgvUlggY29tbWFuZCBwYWNrZXQgaGFuZGxlciBTb3VyY2UgQyBGaWxlKQorCisgTm90ZTogICAgICBUaGUgbW9kdWxlIGlzIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBUWCBhbmQgUlggY29tbWFuZCBwYWNrZXQuCisJCQkxLiBUWCA6IFNlbmQgc2V0IGFuZCBxdWVyeSBjb25maWd1cmF0aW9uIGNvbW1hbmQgcGFja2V0LgorCQkJMi4gUlggOiBSZWNlaXZlIHR4IGZlZWRiYWNrLCBiZWFjb24gc3RhdGUsIHF1ZXJ5IGNvbmZpZ3VyYXRpb24KKwkJCQljb21tYW5kIHBhY2tldC4KKworIEZ1bmN0aW9uOgorCisgRXhwb3J0OgorCisgQWJicmV2OgorCisgSGlzdG9yeToKKwlEYXRhCQlXaG8JCVJlbWFyaworCisJMDUvMDYvMjAwOCAgYW15ICAgIAlDcmVhdGUgaW5pdGlhbCB2ZXJzaW9uIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGRyaXZlci4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInI4MTkyVS5oIgorI2luY2x1ZGUgInI4MTl4VV9jbWRwa3QuaCIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIExvY2FsIENvbnN0YW50LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIERlYnVnIGNvbnN0YW50Ki8KKyNkZWZpbmUJCUNNUEtfREVCT1VOQ0VfQ05UCQkJMQorLyogMjAwNy8xMC8yNCBNSCBBZGQgZm9yIHByaW50aW5nIGEgcmFuZ2Ugb2YgZGF0YS4gKi8KKyNkZWZpbmUJCUNNUEtfUFJJTlQoQWRkcmVzcylcCit7XAorCXVuc2lnbmVkIGNoYXIJaTtcCisJdTMyCXRlbXBbMTBdO1wKKwlcCisJbWVtY3B5KHRlbXAsIEFkZHJlc3MsIDQwKTtcCisJZm9yIChpID0gMDsgaSA8NDA7IGkrPTQpXAorCQlwcmludGsoIlxyXG4gJTA4eCIsIHRlbXBbaV0pO1wKK31cCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBmdW5jdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitydF9zdGF0dXMKK1NlbmRUeENvbW1hbmRQYWNrZXQoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl2b2lkKiAJCQlwRGF0YSwKKwl1MzIJCQkJRGF0YUxlbgorCSkKK3sKKwlydF9zdGF0dXMJcnRTdGF0dXMgPSBSVF9TVEFUVVNfU1VDQ0VTUzsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAgICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2tfYnVmZgkgICAgKnNrYjsKKwljYl9kZXNjCQkgICAgKnRjYl9kZXNjOworCXVuc2lnbmVkIGNoYXIJICAgICpwdHJfYnVmOworCS8vYm9vbAliTGFzdEluaXRQYWNrZXQgPSBmYWxzZTsKKworCS8vUGxhdGZvcm1BY3F1aXJlU3BpbkxvY2soQWRhcHRlciwgUlRfVFhfU1BJTkxPQ0spOworCisJLy9HZXQgVENCIGFuZCBsb2NhbCBidWZmZXIgZnJvbSBjb21tb24gcG9vbC4gKEl0IGlzIHNoYXJlZCBieSBDbWRRLCBNZ250USwgYW5kIFVTQiBjb2FsZXNjZSBEYXRhUSkKKwlza2IgID0gZGV2X2FsbG9jX3NrYihVU0JfSFdERVNDX0hFQURFUl9MRU4gKyBEYXRhTGVuICsgNCk7CisJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopKHNrYi0+Y2IpLCZkZXYsc2l6ZW9mKGRldikpOworCXRjYl9kZXNjID0gKGNiX2Rlc2MqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9IFRYQ01EX1FVRVVFOworCXRjYl9kZXNjLT5iQ21kT3JJbml0ID0gREVTQ19QQUNLRVRfVFlQRV9OT1JNQUw7CisJdGNiX2Rlc2MtPmJMYXN0SW5pUGt0ID0gMDsKKwlza2JfcmVzZXJ2ZShza2IsIFVTQl9IV0RFU0NfSEVBREVSX0xFTik7CisJcHRyX2J1ZiA9IHNrYl9wdXQoc2tiLCBEYXRhTGVuKTsKKwltZW1zZXQocHRyX2J1ZiwwLERhdGFMZW4pOworCW1lbWNweShwdHJfYnVmLHBEYXRhLERhdGFMZW4pOworCXRjYl9kZXNjLT50eGJ1Zl9zaXplPSAodTE2KURhdGFMZW47CisKKwlpZighcHJpdi0+aWVlZTgwMjExLT5jaGVja19uaWNfZW5vdWdoX2Rlc2MoZGV2LHRjYl9kZXNjLT5xdWV1ZV9pbmRleCl8fAorCQkJKCFza2JfcXVldWVfZW1wdHkoJnByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF0pKXx8XAorCQkJKHByaXYtPmllZWU4MDIxMS0+cXVldWVfc3RvcCkgKSB7CisJCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCI9PT09PT09PT09PT09PT09PT09TlVMTCBwYWNrZXQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PiB0eCBmdWxsIVxuIik7CisJCQlza2JfcXVldWVfdGFpbCgmcHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFFbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSwgc2tiKTsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPmllZWU4MDIxMS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQoc2tiLGRldik7CisJCX0KKworCS8vUGxhdGZvcm1SZWxlYXNlU3BpbkxvY2soQWRhcHRlciwgUlRfVFhfU1BJTkxPQ0spOworCXJldHVybiBydFN0YXR1czsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CWNtcGtfbWVzc2FnZV9oYW5kbGVfdHgoKQorICoKKyAqIE92ZXJ2aWV3OglEcml2ZXIgaW50ZXJuYWwgbW9kdWxlIGNhbiBjYWxsIHRoZSBBUEkgdG8gc2VuZCBtZXNzYWdlIHRvCisgKgkJCQlmaXJtd2FyZSBzaWRlLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBzZW5kIGEgZGVidWcgY29tbWFuZCBwYWNrZXQuCisgKgkJCQlPciB5b3UgY2FuIHNlbmQgYSByZXF1ZXN0IGZvciBGVyB0byBtb2RpZnkgUkxYNDE4MSBMQlVTIEhXIGJhbmsuCisgKgkJCQlPdGhlcndpc2UsIHlvdSBjYW4gY2hhbmdlIE1BQy9QSFQvUkYgcmVnaXN0ZXIgYnkgZmlybXdhcmUgYXQKKyAqCQkJCXJ1biB0aW1lLiBXZSBkbyBub3Qgc3VwcG9ydCBtZXNzYWdlIG1vcmUgdGhhbiBvbmUgc2VnbWVudCBub3cuCisgKgorICogSW5wdXQ6CQlOT05FCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCU5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDUvMDYvMjAwOAlhbXkJCXBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworIGV4dGVybglydF9zdGF0dXMJY21wa19tZXNzYWdlX2hhbmRsZV90eCgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4Kgljb2RldmlydHVhbGFkZHJlc3MsCisJdTMyCXBhY2tldHR5cGUsCisJdTMyCWJ1ZmZlcl9sZW4pCit7CisKKwlib29sIAkgICAgcnRfc3RhdHVzID0gdHJ1ZTsKKyNpZmRlZiBSVEw4MTkyVQorCXJldHVybiBydF9zdGF0dXM7CisjZWxzZQorCXN0cnVjdCByODE5Ml9wcml2ICAgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUxNgkJICAgIGZyYWdfdGhyZXNob2xkOworCXUxNgkJICAgIGZyYWdfbGVuZ3RoLCBmcmFnX29mZnNldCA9IDA7CisJLy91MTYJCSAgICB0b3RhbF9zaXplOworCS8vaW50CQkgICAgaTsKKworCXJ0X2Zpcm13YXJlCSAgICAqcGZpcm13YXJlID0gcHJpdi0+cEZpcm13YXJlOworCXN0cnVjdCBza19idWZmCSAgICAqc2tiOworCXVuc2lnbmVkIGNoYXIJICAgICpzZWdfcHRyOworCWNiX2Rlc2MJCSAgICAqdGNiX2Rlc2M7CisJdTggICAgICAgICAgICAgICAgICBiTGFzdEluaVBrdDsKKworCWZpcm13YXJlX2luaXRfcGFyYW0oZGV2KTsKKwkvL0ZyYWdtZW50YXRpb24gbWlnaHQgYmUgcmVxdWlyZWQKKwlmcmFnX3RocmVzaG9sZCA9IHBmaXJtd2FyZS0+Y21kcGFja2V0X2ZyYWdfdGhyZXNvbGQ7CisJZG8geworCQlpZigoYnVmZmVyX2xlbiAtIGZyYWdfb2Zmc2V0KSA+IGZyYWdfdGhyZXNob2xkKSB7CisJCQlmcmFnX2xlbmd0aCA9IGZyYWdfdGhyZXNob2xkIDsKKwkJCWJMYXN0SW5pUGt0ID0gMDsKKworCQl9IGVsc2UgeworCQkJZnJhZ19sZW5ndGggPSBidWZmZXJfbGVuIC0gZnJhZ19vZmZzZXQ7CisJCQliTGFzdEluaVBrdCA9IDE7CisKKwkJfQorCisJCS8qIEFsbG9jYXRlIHNrYiBidWZmZXIgdG8gY29udGFpbiBmaXJtd2FyZSBpbmZvIGFuZCB0eCBkZXNjcmlwdG9yIGluZm8KKwkJICogYWRkIDQgdG8gYXZvaWQgcGFja2V0IGFwcGVuZGluZyBvdmVyZmxvdy4KKwkJICogKi8KKwkJI2lmZGVmIFJUTDgxOTJVCisJCXNrYiAgPSBkZXZfYWxsb2Nfc2tiKFVTQl9IV0RFU0NfSEVBREVSX0xFTiArIGZyYWdfbGVuZ3RoICsgNCk7CisJCSNlbHNlCisJCXNrYiAgPSBkZXZfYWxsb2Nfc2tiKGZyYWdfbGVuZ3RoICsgNCk7CisJCSNlbmRpZgorCQltZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikoc2tiLT5jYiksJmRldixzaXplb2YoZGV2KSk7CisJCXRjYl9kZXNjID0gKGNiX2Rlc2MqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCQl0Y2JfZGVzYy0+cXVldWVfaW5kZXggPSBUWENNRF9RVUVVRTsKKwkJdGNiX2Rlc2MtPmJDbWRPckluaXQgPSBwYWNrZXR0eXBlOworCQl0Y2JfZGVzYy0+Ykxhc3RJbmlQa3QgPSBiTGFzdEluaVBrdDsKKworCQkjaWZkZWYgUlRMODE5MlUKKwkJc2tiX3Jlc2VydmUoc2tiLCBVU0JfSFdERVNDX0hFQURFUl9MRU4pOworCQkjZW5kaWYKKworCQlzZWdfcHRyID0gc2tiX3B1dChza2IsIGJ1ZmZlcl9sZW4pOworCQkvKgorCQkgKiBUcmFuc2Zvcm0gZnJvbSBsaXR0bGUgZW5kaWFuIHRvIGJpZyBlbmRpYW4KKwkJICogYW5kIHBlbmRpbmcgIHplcm8KKwkJICovCisJCW1lbWNweShzZWdfcHRyLGNvZGV2aXJ0dWFsYWRkcmVzcyxidWZmZXJfbGVuKTsKKwkJdGNiX2Rlc2MtPnR4YnVmX3NpemU9ICh1MTYpYnVmZmVyX2xlbjsKKworCisJCWlmKCFwcml2LT5pZWVlODAyMTEtPmNoZWNrX25pY19lbm91Z2hfZGVzYyhkZXYsdGNiX2Rlc2MtPnF1ZXVlX2luZGV4KXx8CisJCQkoIXNrYl9xdWV1ZV9lbXB0eSgmcHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFFbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSkpfHxcCisJCQkocHJpdi0+aWVlZTgwMjExLT5xdWV1ZV9zdG9wKSApIHsKKwkJCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PiB0eCBmdWxsIVxuIik7CisJCQlza2JfcXVldWVfdGFpbCgmcHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFFbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSwgc2tiKTsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPmllZWU4MDIxMS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQoc2tiLGRldik7CisJCX0KKworCQljb2RldmlydHVhbGFkZHJlc3MgKz0gZnJhZ19sZW5ndGg7CisJCWZyYWdfb2Zmc2V0ICs9IGZyYWdfbGVuZ3RoOworCisJfXdoaWxlKGZyYWdfb2Zmc2V0IDwgYnVmZmVyX2xlbik7CisKKwlyZXR1cm4gcnRfc3RhdHVzOworCisKKyNlbmRpZgorfQkvKiBDTVBLX01lc3NhZ2VfSGFuZGxlX1R4ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiAgICBjbXBrX2NvdW50dHhzdGF0aXN0aWMoKQorICoKKyAqIE92ZXJ2aWV3OgorICoKKyAqIElucHV0OiAgICAgICBQQURBUFRFUiAJcEFkYXB0ZXIJCS0JLgorICoJCQkJQ01QS19UWEZCX1QgKnBzVHhfRkIJLQkuCisgKgorICogT3V0cHV0OiAgICAgIE5PTkUKKyAqCisgKiBSZXR1cm46ICAgICAgTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqICBXaGVuCQlXaG8JCVJlbWFyaworICogIDA1LzEyLzIwMDgJYW15IAlDcmVhdGUgVmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCXZvaWQKK2NtcGtfY291bnRfdHhzdGF0aXN0aWMoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwljbXBrX3R4ZmJfdAkqcHN0eF9mYikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisjaWZkZWYgRU5BQkxFX1BTCisJUlRfUkZfUE9XRVJfU1RBVEUJcnRTdGF0ZTsKKworCXBBZGFwdGVyLT5IYWxGdW5jLkdldEh3UmVnSGFuZGxlcihwQWRhcHRlciwgSFdfVkFSX1JGX1NUQVRFLCAocHUxQnl0ZSkoJnJ0U3RhdGUpKTsKKworCS8vIFdoZW4gUkYgaXMgb2ZmLCB3ZSBzaG91bGQgbm90IGNvdW50IHRoZSBwYWNrZXQgZm9yIGh3L3N3IHN5bmNocm9uaXplCisJLy8gcmVhc29uLCBpZS4gdGhlcmUgbWF5IGJlIGEgZHVyYXRpb24gd2hpbGUgc3cgc3dpdGNoIGlzIGNoYW5nZWQgYW5kIGh3CisJLy8gc3dpdGNoIGlzIGJlaW5nIGNoYW5nZWQuIDIwMDYuMTIuMDQsIGJ5IHNoaWVuIGNoYW5nLgorCWlmIChydFN0YXRlID09IGVSZk9mZikKKwl7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworI2lmZGVmIFRPRE8KKwlpZihwQWRhcHRlci0+YkluSGN0VGVzdCkKKwkJcmV0dXJuOworI2VuZGlmCisJLyogV2UgY2FuIG5vdCBrbm93IHRoZSBwYWNrZXQgbGVuZ3RoIGFuZCB0cmFuc21pdCB0eXBlOiBicm9hZGNhc3Qgb3IgdW5pCisJICAgb3IgbXVsdGljYXN0LiBTbyB0aGUgcmVsYXRpdmUgc3RhdGlzdGljcyBtdXN0IGJlIGNvbGxlY3RlZCBpbiB0eAorCSAgIGZlZWRiYWNrIGluZm8uICovCisJaWYgKHBzdHhfZmItPnRvaykKKwl7CisJCXByaXYtPnN0YXRzLnR4ZmVlZGJhY2tvaysrOworCQlwcml2LT5zdGF0cy50eG9rdG90YWwrKzsKKwkJcHJpdi0+c3RhdHMudHhva2J5dGVzdG90YWwgKz0gcHN0eF9mYi0+cGt0X2xlbmd0aDsKKwkJcHJpdi0+c3RhdHMudHhva2lucGVyaW9kKys7CisKKwkJLyogV2UgY2FuIG5vdCBtYWtlIHN1cmUgYnJvYWRjYXN0L211bHRpY2FzdCBvciB1bmljYXN0IG1vZGUuICovCisJCWlmIChwc3R4X2ZiLT5wa3RfdHlwZSA9PSBQQUNLRVRfTVVMVElDQVNUKQorCQl7CisJCQlwcml2LT5zdGF0cy50eG11bHRpY2FzdCsrOworCQkJcHJpdi0+c3RhdHMudHhieXRlc211bHRpY2FzdCArPSBwc3R4X2ZiLT5wa3RfbGVuZ3RoOworCQl9CisJCWVsc2UgaWYgKHBzdHhfZmItPnBrdF90eXBlID09IFBBQ0tFVF9CUk9BRENBU1QpCisJCXsKKwkJCXByaXYtPnN0YXRzLnR4YnJvYWRjYXN0Kys7CisJCQlwcml2LT5zdGF0cy50eGJ5dGVzYnJvYWRjYXN0ICs9IHBzdHhfZmItPnBrdF9sZW5ndGg7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcml2LT5zdGF0cy50eHVuaWNhc3QrKzsKKwkJCXByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0ICs9IHBzdHhfZmItPnBrdF9sZW5ndGg7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcHJpdi0+c3RhdHMudHhmZWVkYmFja2ZhaWwrKzsKKwkJcHJpdi0+c3RhdHMudHhlcnJ0b3RhbCsrOworCQlwcml2LT5zdGF0cy50eGVycmJ5dGVzdG90YWwgKz0gcHN0eF9mYi0+cGt0X2xlbmd0aDsKKworCQkvKiBXZSBjYW4gbm90IG1ha2Ugc3VyZSBicm9hZGNhc3QvbXVsdGljYXN0IG9yIHVuaWNhc3QgbW9kZS4gKi8KKwkJaWYgKHBzdHhfZmItPnBrdF90eXBlID09IFBBQ0tFVF9NVUxUSUNBU1QpCisJCXsKKwkJCXByaXYtPnN0YXRzLnR4ZXJybXVsdGljYXN0Kys7CisJCX0KKwkJZWxzZSBpZiAocHN0eF9mYi0+cGt0X3R5cGUgPT0gUEFDS0VUX0JST0FEQ0FTVCkKKwkJeworCQkJcHJpdi0+c3RhdHMudHhlcnJicm9hZGNhc3QrKzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaXYtPnN0YXRzLnR4ZXJydW5pY2FzdCsrOworCQl9CisJfQorCisJcHJpdi0+c3RhdHMudHhyZXRyeWNvdW50ICs9IHBzdHhfZmItPnJldHJ5X2NudDsKKwlwcml2LT5zdGF0cy50eGZlZWRiYWNrcmV0cnkgKz0gcHN0eF9mYi0+cmV0cnlfY250OworCit9CS8qIGNtcGtfQ291bnRUeFN0YXRpc3RpYyAqLworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246ICAgIGNtcGtfaGFuZGxlX3R4X2ZlZWRiYWNrKCkKKyAqCisgKiBPdmVydmlldzoJVGhlIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBleHRyYWN0IHRoZSBtZXNzYWdlIGluc2lkZSBUWAorICoJCQkJZmVlZGJjayBtZXNzYWdlIGZyb20gZmlybXdhcmUuIEl0IHdpbGwgY29udGFpbiBkZWRpY2F0ZWQgaW5mbyBpbgorICoJCQkJd3MtMDYtMDA2My1ydGw4MTkwLWNvbW1hbmQtcGFja2V0LXNwZWNpZmljYXRpb24uIFBsZWFzZQorICoJCQkJcmVmZXIgdG8gY2hhcHRlciAiVFggRmVlZGJhY2sgRWxlbWVudCIuIFdlIGhhdmUgdG8gcmVhZCAyMCBieXRlcworICoJCQkJaW4gdGhlIGNvbW1hbmQgcGFja2V0LgorICoKKyAqIElucHV0OiAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqICAgIGRldgorICoJCQkJdTggCSoJcG1zZwkJLQlNc2cgUHRyIG9mIHRoZSBjb21tYW5kIHBhY2tldC4KKyAqCisgKiBPdXRwdXQ6ICAgICAgTk9ORQorICoKKyAqIFJldHVybjogICAgICBOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICogIFdoZW4JCVdobwkJUmVtYXJrCisgKiAgMDUvMDgvMjAwOAlhbXkJCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMJdm9pZAorY21wa19oYW5kbGVfdHhfZmVlZGJhY2soCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1OAkqCXBtc2cpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWNtcGtfdHhmYl90CQlyeF90eF9mYjsJLyogKi8KKworCXByaXYtPnN0YXRzLnR4ZmVlZGJhY2srKzsKKworCS8qIDAuIERpc3BsYXkgcmVjZWl2ZWQgbWVzc2FnZS4gKi8KKwkvL2NtcGtfRGlzcGxheV9NZXNzYWdlKENNUEtfUlhfVFhfRkJfU0laRSwgcE1zZyk7CisKKwkvKiAxLiBFeHRyYWN0IFRYIGZlZWRiYWNrIGluZm8gZnJvbSBSRkQgdG8gdGVtcCBzdHJ1Y3R1cmUgYnVmZmVyLiAqLworCS8qIEl0IHNlZW1zIHRoYXQgRlcgdXNlIGJpZyBlbmRpYW4oTUlQUykgYW5kIERSViB1c2UgbGl0dGxlIGVuZGlhbiBpbgorCSAgIHdpbmRvd3MgT1MuIFNvIHdlIGhhdmUgdG8gcmVhZCB0aGUgY29udGVudCBieXRlIGJ5IGJ5dGUgb3IgdHJhbnNmZXIKKwkgICBlbmRpYW4gdHlwZSBiZWZvcmUgY29weSB0aGUgbWVzc2FnZSBjb3B5LiAqLworCS8qIDIwMDcvMDcvMDUgTUggVXNlIHBvaW50ZXIgdG8gdHJhbnNmZXIgc3RydWN0dXJlIG1lbW9yeS4gKi8KKwkvL21lbWNweSgoVUlOVDggKikmcnhfdHhfZmIsIHBNc2csIHNpemVvZihDTVBLX1RYRkJfVCkpOworCW1lbWNweSgodTgqKSZyeF90eF9mYiwgcG1zZywgc2l6ZW9mKGNtcGtfdHhmYl90KSk7CisJLyogMi4gVXNlIHR4IGZlZWRiYWNrIGluZm8gdG8gY291bnQgVFggc3RhdGlzdGljcy4gKi8KKwljbXBrX2NvdW50X3R4c3RhdGlzdGljKGRldiwgJnJ4X3R4X2ZiKTsKKwkvKiAyMDA3LzAxLzE3IE1IIENvbW1lbnQgcHJldmlvdXMgbWV0aG9kIGZvciBUWCBzdGF0aXN0aWMgZnVuY3Rpb24uICovCisJLyogQ29sbGVjdCBpbmZvIFRYIGZlZWRiYWNrIHBhY2tldCB0byBmaWxsIFRDQi4gKi8KKwkvKiBXZSBjYW4gbm90IGtub3cgdGhlIHBhY2tldCBsZW5ndGggYW5kIHRyYW5zbWl0IHR5cGU6IGJyb2FkY2FzdCBvciB1bmkKKwkgICBvciBtdWx0aWNhc3QuICovCisJLy9Db3VudFR4U3RhdGlzdGljcyggcEFkYXB0ZXIsICZ0Y2IgKTsKKworfQkvKiBjbXBrX0hhbmRsZV9UeF9GZWVkYmFjayAqLworCit2b2lkCitjbWRwa3RfYmVhY29udGltZXJpbnRlcnJ1cHRfODE5eHVzYigKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CispCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUxNiB0eF9yYXRlOworCXsKKwkJLy8KKwkJLy8gMDcwMTE3LCByY25qa286IDg3QiBoYXZlIHRvIFMvVyBiZWFjb24gZm9yIERUTSBlbmNyeXB0aW9uX2Ntbi4KKwkJLy8KKwkJaWYocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX0EgIHx8CisJCQlwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfTl81RyB8fAorCQkJKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9OXzI0RyAgJiYgKCFwcml2LT5pZWVlODAyMTEtPnBIVEluZm8tPmJDdXJTdXBwQ0NLKSkpCisJCXsKKwkJCXR4X3JhdGUgPSA2MDsKKwkJCURNRVNHKCJzZW5kIGJlYWNvbiBmcmFtZSAgdHggcmF0ZSBpcyA2TWJwbVxuIik7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0eF9yYXRlID0xMDsKKwkJCURNRVNHKCJzZW5kIGJlYWNvbiBmcmFtZSAgdHggcmF0ZSBpcyAxTWJwbVxuIik7CisJCX0KKworCQlydGw4MTl4dXNiX2JlYWNvbl90eChkZXYsdHhfcmF0ZSk7IC8vIEhXIEJlYWNvbgorCisJfQorCit9CisKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiAgICBjbXBrX2hhbmRsZV9pbnRlcnJ1cHRfc3RhdHVzKCkKKyAqCisgKiBPdmVydmlldzogICAgVGhlIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBleHRyYWN0IHRoZSBtZXNzYWdlIGZyb20KKyAqCQkJCWZpcm13YXJlLiBJdCB3aWxsIGNvbnRhaW4gZGVkaWNhdGVkIGluZm8gaW4KKyAqCQkJCXdzLTA3LTAwNjMtdjA2LXJ0bDgxOXgtY29tbWFuZC1wYWNrZXQtc3BlY2lmaWNhdGlvbi0wNzAzMTUuZG9jLgorICogCQkJCVBsZWFzZSByZWZlciB0byBjaGFwdGVyICJJbnRlcnJ1cHQgU3RhdHVzIEVsZW1lbnQiLgorICoKKyAqIElucHV0OiAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICoJCQl1OCoJcG1zZwkJLQlNZXNzYWdlIFBvaW50ZXIgb2YgdGhlIGNvbW1hbmQgcGFja2V0LgorICoKKyAqIE91dHB1dDogICAgICBOT05FCisgKgorICogUmV0dXJuOiAgICAgIE5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKiAgV2hlbgkJCVdobwkJCVJlbWFyaworICogIDA1LzEyLzIwMDgJYW15CQlBZGQgdGhpcyBmb3IgcnRsODE5MiBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwl2b2lkCitjbXBrX2hhbmRsZV9pbnRlcnJ1cHRfc3RhdHVzKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTgqCXBtc2cpCit7CisJY21wa19pbnRyX3N0YV90CQlyeF9pbnRyX3N0YXR1czsJLyogKi8KKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlETUVTRygiLS0tPiBjbXBrX0hhbmRsZV9JbnRlcnJ1cHRfU3RhdHVzKClcbiIpOworCisJLyogMC4gRGlzcGxheSByZWNlaXZlZCBtZXNzYWdlLiAqLworCS8vY21wa19EaXNwbGF5X01lc3NhZ2UoQ01QS19SWF9CRUFDT05fU1RBVEVfU0laRSwgcE1zZyk7CisKKwkvKiAxLiBFeHRyYWN0IFRYIGZlZWRiYWNrIGluZm8gZnJvbSBSRkQgdG8gdGVtcCBzdHJ1Y3R1cmUgYnVmZmVyLiAqLworCS8qIEl0IHNlZW1zIHRoYXQgRlcgdXNlIGJpZyBlbmRpYW4oTUlQUykgYW5kIERSViB1c2UgbGl0dGxlIGVuZGlhbiBpbgorCSAgIHdpbmRvd3MgT1MuIFNvIHdlIGhhdmUgdG8gcmVhZCB0aGUgY29udGVudCBieXRlIGJ5IGJ5dGUgb3IgdHJhbnNmZXIKKwkgICBlbmRpYW4gdHlwZSBiZWZvcmUgY29weSB0aGUgbWVzc2FnZSBjb3B5LiAqLworCS8vcnhfYmNuX3N0YXRlLkVsZW1lbnRfSUQgCT0gcE1zZ1swXTsKKwkvL3J4X2Jjbl9zdGF0ZS5MZW5ndGggCQk9IHBNc2dbMV07CisJcnhfaW50cl9zdGF0dXMubGVuZ3RoID0gcG1zZ1sxXTsKKwlpZiAocnhfaW50cl9zdGF0dXMubGVuZ3RoICE9IChzaXplb2YoY21wa19pbnRyX3N0YV90KSAtIDIpKQorCXsKKwkJRE1FU0coImNtcGtfSGFuZGxlX0ludGVycnVwdF9TdGF0dXM6IHdyb25nIGxlbmd0aCFcbiIpOworCQlyZXR1cm47CisJfQorCisKKwkvLyBTdGF0aXN0aWNzIG9mIGJlYWNvbiBmb3IgYWQtaG9jIG1vZGUuCisJaWYoCXByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCXsKKwkJLy8yIG1heWJlIG5lZWQgZW5kaWFuIHRyYW5zZm9ybT8KKwkJcnhfaW50cl9zdGF0dXMuaW50ZXJydXB0X3N0YXR1cyA9ICooKHUzMiAqKShwbXNnICsgNCkpOworCQkvL3J4X2ludHJfc3RhdHVzLkludGVycnVwdFN0YXR1cyA9IE4ySDRCWVRFKCooKFVJTlQzMiAqKShwTXNnICsgNCkpKTsKKworCQlETUVTRygiaW50ZXJydXB0IHN0YXR1cyA9IDB4JXhcbiIsIHJ4X2ludHJfc3RhdHVzLmludGVycnVwdF9zdGF0dXMpOworCisJCWlmIChyeF9pbnRyX3N0YXR1cy5pbnRlcnJ1cHRfc3RhdHVzICYgSVNSX1R4QmNuT2spCisJCXsKKwkJCXByaXYtPmllZWU4MDIxMS0+Ymlic3Njb29yZGluYXRvciA9IHRydWU7CisJCQlwcml2LT5zdGF0cy50eGJlYWNvbm9raW50Kys7CisJCX0KKwkJZWxzZSBpZiAocnhfaW50cl9zdGF0dXMuaW50ZXJydXB0X3N0YXR1cyAmIElTUl9UeEJjbkVycikKKwkJeworCQkJcHJpdi0+aWVlZTgwMjExLT5iaWJzc2Nvb3JkaW5hdG9yID0gZmFsc2U7CisJCQlwcml2LT5zdGF0cy50eGJlYWNvbmVycisrOworCQl9CisKKwkJaWYgKHJ4X2ludHJfc3RhdHVzLmludGVycnVwdF9zdGF0dXMgJiBJU1JfQmNuVGltZXJJbnRyKQorCQl7CisJCQljbWRwa3RfYmVhY29udGltZXJpbnRlcnJ1cHRfODE5eHVzYihkZXYpOworCQl9CisKKwl9CisKKwkgLy8gT3RoZXIgaW5mb3JtYXRpb25zIGluIGludGVycnVwdCBzdGF0dXMgd2UgbmVlZD8KKworCisJRE1FU0coIjwtLS0tIGNtcGtfaGFuZGxlX2ludGVycnVwdF9zdGF0dXMoKVxuIik7CisKK30JLyogY21wa19oYW5kbGVfaW50ZXJydXB0X3N0YXR1cyAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiAgICBjbXBrX2hhbmRsZV9xdWVyeV9jb25maWdfcngoKQorICoKKyAqIE92ZXJ2aWV3OiAgICBUaGUgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGV4dHJhY3QgdGhlIG1lc3NhZ2UgZnJvbQorICoJCQkJZmlybXdhcmUuIEl0IHdpbGwgY29udGFpbiBkZWRpY2F0ZWQgaW5mbyBpbgorICoJCQkJd3MtMDYtMDA2My1ydGw4MTkwLWNvbW1hbmQtcGFja2V0LXNwZWNpZmljYXRpb24uIFBsZWFzZQorICoJCQkJcmVmZXIgdG8gY2hhcHRlciAiQmVhY29uIFN0YXRlIEVsZW1lbnQiLgorICoKKyAqIElucHV0OiAgICAgICB1OCAqICBwbXNnCS0JTWVzc2FnZSBQb2ludGVyIG9mIHRoZSBjb21tYW5kIHBhY2tldC4KKyAqCisgKiBPdXRwdXQ6ICAgICAgTk9ORQorICoKKyAqIFJldHVybjogICAgICBOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICogIFdoZW4JCVdobwkJUmVtYXJrCisgKiAgMDUvMTIvMjAwOAlhbXkJCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMJdm9pZAorY21wa19oYW5kbGVfcXVlcnlfY29uZmlnX3J4KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTgqCSAgIHBtc2cpCit7CisJY21wa19xdWVyeV9jZmdfdAlyeF9xdWVyeV9jZmc7CS8qICovCisKKwkvKiAwLiBEaXNwbGF5IHJlY2VpdmVkIG1lc3NhZ2UuICovCisJLy9jbXBrX0Rpc3BsYXlfTWVzc2FnZShDTVBLX1JYX0JFQUNPTl9TVEFURV9TSVpFLCBwTXNnKTsKKworCS8qIDEuIEV4dHJhY3QgVFggZmVlZGJhY2sgaW5mbyBmcm9tIFJGRCB0byB0ZW1wIHN0cnVjdHVyZSBidWZmZXIuICovCisJLyogSXQgc2VlbXMgdGhhdCBGVyB1c2UgYmlnIGVuZGlhbihNSVBTKSBhbmQgRFJWIHVzZSBsaXR0bGUgZW5kaWFuIGluCisJICAgd2luZG93cyBPUy4gU28gd2UgaGF2ZSB0byByZWFkIHRoZSBjb250ZW50IGJ5dGUgYnkgYnl0ZSBvciB0cmFuc2ZlcgorCSAgIGVuZGlhbiB0eXBlIGJlZm9yZSBjb3B5IHRoZSBtZXNzYWdlIGNvcHkuICovCisJLy9yeF9xdWVyeV9jZmcuRWxlbWVudF9JRCAJPSBwTXNnWzBdOworCS8vcnhfcXVlcnlfY2ZnLkxlbmd0aCAJCT0gcE1zZ1sxXTsKKwlyeF9xdWVyeV9jZmcuY2ZnX2FjdGlvbiAJPSAocG1zZ1s0XSAmIDB4ODAwMDAwMDApPj4zMTsKKwlyeF9xdWVyeV9jZmcuY2ZnX3R5cGUgCQk9IChwbXNnWzRdICYgMHg2MCkgPj4gNTsKKwlyeF9xdWVyeV9jZmcuY2ZnX3NpemUgCQk9IChwbXNnWzRdICYgMHgxOCkgPj4gMzsKKwlyeF9xdWVyeV9jZmcuY2ZnX3BhZ2UgCQk9IChwbXNnWzZdICYgMHgwRikgPj4gMDsKKwlyeF9xdWVyeV9jZmcuY2ZnX29mZnNldCAJCT0gcG1zZ1s3XTsKKwlyeF9xdWVyeV9jZmcudmFsdWUgCQkJPSAocG1zZ1s4XSA8PCAyNCkgfCAocG1zZ1s5XSA8PCAxNikgfAorCQkJCQkJCQkgIChwbXNnWzEwXSA8PCA4KSB8IChwbXNnWzExXSA8PCAwKTsKKwlyeF9xdWVyeV9jZmcubWFzayAJCQk9IChwbXNnWzEyXSA8PCAyNCkgfCAocG1zZ1sxM10gPDwgMTYpIHwKKwkJCQkJCQkJICAocG1zZ1sxNF0gPDwgOCkgfCAocG1zZ1sxNV0gPDwgMCk7CisKK30JLyogY21wa19IYW5kbGVfUXVlcnlfQ29uZmlnX1J4ICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CWNtcGtfY291bnRfdHhfc3RhdHVzKCkKKyAqCisgKiBPdmVydmlldzoJQ291bnQgYWdncmVnYXRlZCB0eCBzdGF0dXMgZnJvbSBmaXJtd2FyIG9mIG9uZSB0eXBlIHJ4IGNvbW1hbmQKKyAqCQkJCXBhY2tldCBlbGVtZW50IGlkID0gUlhfVFhfU1RBVFVTLgorICoKKyAqIElucHV0OgkJTk9ORQorICoKKyAqIE91dHB1dDoJCU5PTkUKKyAqCisgKiBSZXR1cm46CQlOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICoJV2hlbgkJV2hvCQlSZW1hcmsKKyAqCTA1LzEyLzIwMDgJYW15CQlDcmVhdGUgVmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCXZvaWQJY21wa19jb3VudF90eF9zdGF0dXMoCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkJCQljbXBrX3R4X3N0YXR1c190IAkqcHN0eF9zdGF0dXMpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisjaWZkZWYgRU5BQkxFX1BTCisKKwlSVF9SRl9QT1dFUl9TVEFURQlydHN0YXRlOworCisJcEFkYXB0ZXItPkhhbEZ1bmMuR2V0SHdSZWdIYW5kbGVyKHBBZGFwdGVyLCBIV19WQVJfUkZfU1RBVEUsIChwdTFCeXRlKSgmcnRTdGF0ZSkpOworCisJLy8gV2hlbiBSRiBpcyBvZmYsIHdlIHNob3VsZCBub3QgY291bnQgdGhlIHBhY2tldCBmb3IgaHcvc3cgc3luY2hyb25pemUKKwkvLyByZWFzb24sIGllLiB0aGVyZSBtYXkgYmUgYSBkdXJhdGlvbiB3aGlsZSBzdyBzd2l0Y2ggaXMgY2hhbmdlZCBhbmQgaHcKKwkvLyBzd2l0Y2ggaXMgYmVpbmcgY2hhbmdlZC4gMjAwNi4xMi4wNCwgYnkgc2hpZW4gY2hhbmcuCisJaWYgKHJ0U3RhdGUgPT0gZVJmT2ZmKQorCXsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJcHJpdi0+c3RhdHMudHhmZWVkYmFja29rCSs9IHBzdHhfc3RhdHVzLT50eG9rOworCXByaXYtPnN0YXRzLnR4b2t0b3RhbAkJKz0gcHN0eF9zdGF0dXMtPnR4b2s7CisKKwlwcml2LT5zdGF0cy50eGZlZWRiYWNrZmFpbAkrPSBwc3R4X3N0YXR1cy0+dHhmYWlsOworCXByaXYtPnN0YXRzLnR4ZXJydG90YWwJCSs9IHBzdHhfc3RhdHVzLT50eGZhaWw7CisKKwlwcml2LT5zdGF0cy50eHJldHJ5Y291bnQJCSs9IHBzdHhfc3RhdHVzLT50eHJldHJ5OworCXByaXYtPnN0YXRzLnR4ZmVlZGJhY2tyZXRyeQkrPSBwc3R4X3N0YXR1cy0+dHhyZXRyeTsKKworCS8vcEFkYXB0ZXItPlR4U3RhdHMuTnVtVHhPa0J5dGVzVG90YWwgKz0gcHNUeF9GQi0+cGt0X2xlbmd0aDsKKwkvL3BBZGFwdGVyLT5UeFN0YXRzLk51bVR4RXJyQnl0ZXNUb3RhbCArPSBwc1R4X0ZCLT5wa3RfbGVuZ3RoOworCS8vcEFkYXB0ZXItPk1nbnRJbmZvLkxpbmtEZXRlY3RJbmZvLk51bVR4T2tJblBlcmlvZCsrOworCisJcHJpdi0+c3RhdHMudHhtdWx0aWNhc3QJKz0gcHN0eF9zdGF0dXMtPnR4bWNvazsKKwlwcml2LT5zdGF0cy50eGJyb2FkY2FzdAkrPSBwc3R4X3N0YXR1cy0+dHhiY29rOworCXByaXYtPnN0YXRzLnR4dW5pY2FzdAkJKz0gcHN0eF9zdGF0dXMtPnR4dWNvazsKKworCXByaXYtPnN0YXRzLnR4ZXJybXVsdGljYXN0CSs9IHBzdHhfc3RhdHVzLT50eG1jZmFpbDsKKwlwcml2LT5zdGF0cy50eGVycmJyb2FkY2FzdAkrPSBwc3R4X3N0YXR1cy0+dHhiY2ZhaWw7CisJcHJpdi0+c3RhdHMudHhlcnJ1bmljYXN0CSs9IHBzdHhfc3RhdHVzLT50eHVjZmFpbDsKKworCXByaXYtPnN0YXRzLnR4Ynl0ZXNtdWx0aWNhc3QJKz0gcHN0eF9zdGF0dXMtPnR4bWNsZW5ndGg7CisJcHJpdi0+c3RhdHMudHhieXRlc2Jyb2FkY2FzdAkrPSBwc3R4X3N0YXR1cy0+dHhiY2xlbmd0aDsKKwlwcml2LT5zdGF0cy50eGJ5dGVzdW5pY2FzdAkJKz0gcHN0eF9zdGF0dXMtPnR4dWNsZW5ndGg7CisKKwlwcml2LT5zdGF0cy5sYXN0X3BhY2tldF9yYXRlCQk9IHBzdHhfc3RhdHVzLT5yYXRlOworfQkvKiBjbXBrX0NvdW50VHhTdGF0dXMgKi8KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOgljbXBrX2hhbmRsZV90eF9zdGF0dXMoKQorICoKKyAqIE92ZXJ2aWV3OglGaXJtd2FyZSBhZGQgYSBuZXcgdHggZmVlZGJhY2sgc3RhdHVzIHRvIHJlZHVjZSByeCBjb21tYW5kCisgKgkJCQlwYWNrZXQgYnVmZmVyIG9wZXJhdGlvbiBsb2FkLgorICoKKyAqIElucHV0OgkJTk9ORQorICoKKyAqIE91dHB1dDoJCU5PTkUKKyAqCisgKiBSZXR1cm46CQlOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICoJV2hlbgkJV2hvCQlSZW1hcmsKKyAqCTA1LzEyLzIwMDgJYW15CQlDcmVhdGUgVmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCXZvaWQKK2NtcGtfaGFuZGxlX3R4X3N0YXR1cygKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4KgkgICBwbXNnKQoreworCWNtcGtfdHhfc3RhdHVzX3QJcnhfdHhfc3RzOwkvKiAqLworCisJbWVtY3B5KCh2b2lkKikmcnhfdHhfc3RzLCAodm9pZCopcG1zZywgc2l6ZW9mKGNtcGtfdHhfc3RhdHVzX3QpKTsKKwkvKiAyLiBVc2UgdHggZmVlZGJhY2sgaW5mbyB0byBjb3VudCBUWCBzdGF0aXN0aWNzLiAqLworCWNtcGtfY291bnRfdHhfc3RhdHVzKGRldiwgJnJ4X3R4X3N0cyk7CisKK30JLyogY21wa19IYW5kbGVfVHhfU3RhdHVzICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CWNtcGtfaGFuZGxlX3R4X3JhdGVfaGlzdG9yeSgpCisgKgorICogT3ZlcnZpZXc6CUZpcm13YXJlIGFkZCBhIG5ldyB0eCByYXRlIGhpc3RvcnkKKyAqCisgKiBJbnB1dDoJCU5PTkUKKyAqCisgKiBPdXRwdXQ6CQlOT05FCisgKgorICogUmV0dXJuOgkJTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqCVdoZW4JCVdobwkJUmVtYXJrCisgKgkwNS8xMi8yMDA4CWFteQkJQ3JlYXRlIFZlcnNpb24gMCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwl2b2lkCitjbXBrX2hhbmRsZV90eF9yYXRlX2hpc3RvcnkoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1OCoJICAgcG1zZykKK3sKKwljbXBrX3R4X3JhaGlzX3QJKnB0eHJhdGU7CisvLwlSVF9SRl9QT1dFUl9TVEFURQlydFN0YXRlOworCXU4CQkJCWksIGo7CisJdTE2CQkJCWxlbmd0aCA9IHNpemVvZihjbXBrX3R4X3JhaGlzX3QpOworCXUzMgkJCQkqcHRlbXA7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKyNpZmRlZiBFTkFCTEVfUFMKKwlwQWRhcHRlci0+SGFsRnVuYy5HZXRId1JlZ0hhbmRsZXIocEFkYXB0ZXIsIEhXX1ZBUl9SRl9TVEFURSwgKHB1MUJ5dGUpKCZydFN0YXRlKSk7CisKKwkvLyBXaGVuIFJGIGlzIG9mZiwgd2Ugc2hvdWxkIG5vdCBjb3VudCB0aGUgcGFja2V0IGZvciBody9zdyBzeW5jaHJvbml6ZQorCS8vIHJlYXNvbiwgaWUuIHRoZXJlIG1heSBiZSBhIGR1cmF0aW9uIHdoaWxlIHN3IHN3aXRjaCBpcyBjaGFuZ2VkIGFuZCBodworCS8vIHN3aXRjaCBpcyBiZWluZyBjaGFuZ2VkLiAyMDA2LjEyLjA0LCBieSBzaGllbiBjaGFuZy4KKwlpZiAocnRTdGF0ZSA9PSBlUmZPZmYpCisJeworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKwlwdGVtcCA9ICh1MzIgKilwbXNnOworCisJLy8KKwkvLyBEbyBlbmRpYW4gdHJhbnNmZXIgdG8gd29yZCBhbGlnbm1lbnQoMTYgYml0cykgZm9yIHdpbmRvd3Mgc3lzdGVtLgorCS8vIFlvdSBtdXN0IGRvIGRpZmZlcmVudCBlbmRpYW4gdHJhbnNmZXIgZm9yIGxpbnV4IGFuZCBNQUMgT1MKKwkvLworCWZvciAoaSA9IDA7IGkgPCAobGVuZ3RoLzQpOyBpKyspCisJeworCQl1MTYJIHRlbXAxLCB0ZW1wMjsKKworCQl0ZW1wMSA9IHB0ZW1wW2ldJjB4MDAwMEZGRkY7CisJCXRlbXAyID0gcHRlbXBbaV0+PjE2OworCQlwdGVtcFtpXSA9ICh0ZW1wMTw8MTYpfHRlbXAyOworCX0KKworCXB0eHJhdGUgPSAoY21wa190eF9yYWhpc190ICopcG1zZzsKKworCWlmIChwdHhyYXRlID09IE5VTEwgKQorCXsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCXsKKwkJLy8gQ29sbGVjdCBDQ0sgcmF0ZSBwYWNrZXQgbnVtCisJCWlmIChpIDwgNCkKKwkJCXByaXYtPnN0YXRzLnR4cmF0ZS5jY2tbaV0gKz0gcHR4cmF0ZS0+Y2NrW2ldOworCisJCS8vIENvbGxlY3QgT0ZETSByYXRlIHBhY2tldCBudW0KKwkJaWYgKGk8IDgpCisJCQlwcml2LT5zdGF0cy50eHJhdGUub2ZkbVtpXSArPSBwdHhyYXRlLT5vZmRtW2ldOworCisJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspCisJCQlwcml2LT5zdGF0cy50eHJhdGUuaHRfbWNzW2pdW2ldICs9IHB0eHJhdGUtPmh0X21jc1tqXVtpXTsKKwl9CisKK30JLyogY21wa19IYW5kbGVfVHhfUmF0ZV9IaXN0b3J5ICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246ICAgIGNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKQorICoKKyAqIE92ZXJ2aWV3OiAgICBJbiB0aGUgZnVuY3Rpb24sIHdlIHdpbGwgY2FwdHVyZSBkaWZmZXJlbnQgUlggY29tbWFuZCBwYWNrZXQKKyAqCQkJCWluZm8uIEV2ZXJ5IFJYIGNvbW1hbmQgcGFja2V0IGVsZW1lbnQgaGFzIGRpZmZlcmVudCBtZXNzYWdlCisgKgkJCQlsZW5ndGggYW5kIG1lYW5pbmcgaW4gY29udGVudC4gV2Ugb25seSBzdXBwb3J0IHRocmVlIHR5cGUgb2YgUlgKKyAqCQkJCWNvbW1hbmQgcGFja2V0IG5vdy4gUGxlYXNlIHJlZmVyIHRvIGRvY3VtZW50CisgKgkJCQl3cy0wNi0wMDYzLXJ0bDgxOTAtY29tbWFuZC1wYWNrZXQtc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBJbnB1dDogICAgICAgTk9ORQorICoKKyAqIE91dHB1dDogICAgICBOT05FCisgKgorICogUmV0dXJuOiAgICAgIE5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKiAgV2hlbgkJV2hvCQlSZW1hcmsKKyAqICAwNS8wNi8yMDA4CWFteQkJQ3JlYXRlIFZlcnNpb24gMCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybgl1MzIKK2NtcGtfbWVzc2FnZV9oYW5kbGVfcngoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpwc3RhdHMpCit7CisvLwl1MzIJCQlkZWJ1Z19sZXZlbCA9IERCR19MT1VEOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQJCQl0b3RhbF9sZW5ndGg7CisJdTgJCQljbWRfbGVuZ3RoLCBleGVfY250ID0gMDsKKwl1OAkJCWVsZW1lbnRfaWQ7CisJdTgJCQkqcGNtZF9idWZmOworCisJLyogMC4gQ2hlY2sgaW5wdCBhcmd1bWVudHMuIElmIGlzIGlzIGEgY29tbWFuZCBxdWV1ZSBtZXNzYWdlIG9yIHBvaW50ZXIgaXMKKwkgICAgICBudWxsLiAqLworCWlmICgvKihwcmZkLT5xdWV1ZV9pZCAhPSBDTVBLX1JYX1FVRVVFX0lEKSB8fCAqLyhwc3RhdHM9PSBOVUxMKSkKKwl7CisJCS8qIFByaW50IGVycm9yIG1lc3NhZ2UuICovCisJCS8qUlRfVFJBQ0UoQ09NUF9TRU5ELCBEZWJ1Z0xldmVsLAorCQkJCSgiXG5ccltDTVBLXS0tPkVyciBxdWV1ZSBpZCBvciBwb2ludGVyIikpOyovCisJCXJldHVybiAwOwkvKiBUaGlzIGlzIG5vdCBhIGNvbW1hbmQgcGFja2V0LiAqLworCX0KKworCS8qIDEuIFJlYWQgcmVjZWl2ZWQgY29tbWFuZCBwYWNrZXQgbWVzc2FnZSBsZW5ndGggZnJvbSBSRkQuICovCisJdG90YWxfbGVuZ3RoID0gcHN0YXRzLT5MZW5ndGg7CisKKwkvKiAyLiBSZWFkIHZpcnR1YWwgYWRkcmVzcyBmcm9tIFJGRC4gKi8KKwlwY21kX2J1ZmYgPSBwc3RhdHMtPnZpcnR1YWxfYWRkcmVzczsKKworCS8qIDMuIFJlYWQgY29tbWFuZCBwYWtjZXQgZWxlbWVudCBpZCBhbmQgbGVuZ3RoLiAqLworCWVsZW1lbnRfaWQgPSBwY21kX2J1ZmZbMF07CisJLypSVF9UUkFDRShDT01QX1NFTkQsIERlYnVnTGV2ZWwsCisJCQkoIlxuXHJbQ01QS10tLT5lbGVtZW50IElEPSVkIExlbj0lZCIsIGVsZW1lbnRfaWQsIHRvdGFsX2xlbmd0aCkpOyovCisKKwkvKiA0LiBDaGVjayBldmVyeSByZWNlaXZlZCBjb21tYW5kIHBhY2tldCBjb25lbnQgYWNjb3JkaW5nIHRvIGRpZmZlcmVudAorCSAgICAgIGVsZW1lbnQgdHlwZS4gQmVjYXVzZSBGVyBtYXkgYWdncmVnYXRlIFJYIGNvbW1hbmQgcGFja2V0IHRvIG1pbmltaXplCisJICAgICAgdHJhbnNtaXQgdGltZSBiZXR3ZWVuIERSViBhbmQgRlcuKi8KKwkvLyBBZGQgYSBjb3VudGVyIHRvIHByZXZlbnQgdG8gbG9ja2VkIGluIHRoZSBsb29wIHRvbyBsb25nCisJd2hpbGUgKHRvdGFsX2xlbmd0aCA+IDAgfHwgZXhlX2NudCsrID4xMDApCisJeworCQkvKiAyMDA3LzAxLzE3IE1IIFdlIHN1cHBvcnQgYWdncmVnYXRpb24gb2YgZGlmZmVyZW50IGNtZCBpbiB0aGUgc2FtZSBwYWNrZXQuICovCisJCWVsZW1lbnRfaWQgPSBwY21kX2J1ZmZbMF07CisKKwkJc3dpdGNoKGVsZW1lbnRfaWQpCisJCXsKKwkJCWNhc2UgUlhfVFhfRkVFREJBQ0s6CisJCQkJY21wa19oYW5kbGVfdHhfZmVlZGJhY2sgKGRldiwgcGNtZF9idWZmKTsKKwkJCQljbWRfbGVuZ3RoID0gQ01QS19SWF9UWF9GQl9TSVpFOworCQkJCWJyZWFrOworCisJCQljYXNlIFJYX0lOVEVSUlVQVF9TVEFUVVM6CisJCQkJY21wa19oYW5kbGVfaW50ZXJydXB0X3N0YXR1cyhkZXYsIHBjbWRfYnVmZik7CisJCQkJY21kX2xlbmd0aCA9IHNpemVvZihjbXBrX2ludHJfc3RhX3QpOworCQkJCWJyZWFrOworCisJCQljYXNlIEJPVEhfUVVFUllfQ09ORklHOgorCQkJCWNtcGtfaGFuZGxlX3F1ZXJ5X2NvbmZpZ19yeChkZXYsIHBjbWRfYnVmZik7CisJCQkJY21kX2xlbmd0aCA9IENNUEtfQk9USF9RVUVSWV9DT05GSUdfU0laRTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSWF9UWF9TVEFUVVM6CisJCQkJY21wa19oYW5kbGVfdHhfc3RhdHVzKGRldiwgcGNtZF9idWZmKTsKKwkJCQljbWRfbGVuZ3RoID0gQ01QS19SWF9UWF9TVFNfU0laRTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSWF9UWF9QRVJfUEtUX0ZFRURCQUNLOgorCQkJCS8vIFlvdSBtdXN0IGF0IGxlYXNlIGFkZCBhIHN3aXRjaCBjYXNlIGVsZW1lbnQgaGVyZSwKKwkJCQkvLyBPdGhlcndpc2UsIHdlIHdpbGwganVtcCB0byBkZWZhdWx0IGNhc2UuCisJCQkJLy9EYmdQcmludCgiQ0NYIFRlc3RcclxuIik7CisJCQkJY21kX2xlbmd0aCA9IENNUEtfUlhfVFhfRkJfU0laRTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSWF9UWF9SQVRFX0hJU1RPUlk6CisJCQkJLy9EYmdQcmludCgiIHJ4IHR4IHJhdGUgaGlzdG9yeVxyXG4iKTsKKwkJCQljbXBrX2hhbmRsZV90eF9yYXRlX2hpc3RvcnkoZGV2LCBwY21kX2J1ZmYpOworCQkJCWNtZF9sZW5ndGggPSBDTVBLX1RYX1JBSElTX1NJWkU7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisKKwkJCQlSVF9UUkFDRShDT01QX0VSUiwgIi0tLS0+Y21wa19tZXNzYWdlX2hhbmRsZV9yeCgpOnVua25vdyBDTUQgRWxlbWVudFxuIik7CisJCQkJcmV0dXJuIDE7CS8qIFRoaXMgaXMgYSBjb21tYW5kIHBhY2tldC4gKi8KKwkJfQorCQkvLyAyMDA3LzAxLzIyIE1IIERpc3BsYXkgcmVjZWl2ZWQgcnggY29tbWFuZCBwYWNrZXQgaW5mby4KKwkJLy9jbXBrX0Rpc3BsYXlfTWVzc2FnZShjbWRfbGVuZ3RoLCBwY21kX2J1ZmYpOworCisJCS8vIDIwMDcvMDEvMjIgTUggQWRkIHRvIGRpc3BsYXkgdHggc3RhdGlzdGljLgorCQkvL2NtcGtfRGlzcGxheVR4U3RhdGlzdGljKHBBZGFwdGVyKTsKKworCQkvKiAyMDA3LzAzLzA5IE1IIENvbGxlY3Qgc2lkZGVyZW50IGNtZCBlbGVtZW50IHBrdCBudW0uICovCisJCXByaXYtPnN0YXRzLnJ4Y21kcGt0W2VsZW1lbnRfaWRdKys7CisKKwkJdG90YWxfbGVuZ3RoIC09IGNtZF9sZW5ndGg7CisJCXBjbWRfYnVmZiAgICArPSBjbWRfbGVuZ3RoOworCX0JLyogd2hpbGUgKHRvdGFsX2xlbmd0aCA+IDApICovCisJcmV0dXJuCTE7CS8qIFRoaXMgaXMgYSBjb21tYW5kIHBhY2tldC4gKi8KKworfQkvKiBDTVBLX01lc3NhZ2VfSGFuZGxlX1J4ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2NtZHBrdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9jbWRwa3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODg1NWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9jbWRwa3QuaApAQCAtMCwwICsxLDIwNyBAQAorI2lmbmRlZiBSODE5WFVTQl9DTURQS1RfSAorI2RlZmluZSBSODE5WFVTQl9DTURQS1RfSAorLyogRGlmZmVyZW50IGNvbW1hbmQgcGFja2V0IGhhdmUgZGVkaWNhdGVkIG1lc3NhZ2UgbGVuZ3RoIGFuZCBkZWZpbml0aW9uLiAqLworI2RlZmluZQkJQ01QS19SWF9UWF9GQl9TSVpFCQkJCQlzaXplb2YoY21wa190eGZiX3QpCQkvLzIwCisjZGVmaW5lCQlDTVBLX1RYX1NFVF9DT05GSUdfU0laRQkJCQlzaXplb2YoY21wa19zZXRfY2ZnX3QpCS8vMTYKKyNkZWZpbmUJCUNNUEtfQk9USF9RVUVSWV9DT05GSUdfU0laRQkJCXNpemVvZihjbXBrX3NldF9jZmdfdCkJLy8xNgorI2RlZmluZQkJQ01QS19SWF9UWF9TVFNfU0laRQkJCQkJc2l6ZW9mKGNtcGtfdHhfc3RhdHVzX3QpLy8KKyNkZWZpbmUJCUNNUEtfUlhfREJHX01TR19TSVpFCQkJc2l6ZW9mKGNtcGtfcnhfZGJnaW5mb190KS8vCisjZGVmaW5lCQlDTVBLX1RYX1JBSElTX1NJWkUJCQlzaXplb2YoY21wa190eF9yYWhpc190KQorCisvKiAyMDA4LzA1LzA4IGFteSBGb3IgVVNCIGNvbnN0YW50LiAqLworI2RlZmluZSBJU1JfVHhCY25PawkJCQkJQklUMjcJCQkvLyBUcmFuc21pdCBCZWFjb24gT0sKKyNkZWZpbmUgSVNSX1R4QmNuRXJyCQkJCUJJVDI2CQkJLy8gVHJhbnNtaXQgQmVhY29uIEVycm9yCisjZGVmaW5lIElTUl9CY25UaW1lckludHIJCQlCSVQxMwkJCS8vIEJlYWNvbiBUaW1lciBJbnRlcnJ1cHQKKworCisvKiBEZWZpbmUgZWxlbWVudCBJRCBvZiBjb21tYW5kIHBhY2tldC4gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgc3RydWN0dXJlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBEZWZpbmUgZGlmZmVyZW50IGNvbW1hbmQgcGFja2V0IHN0cnVjdHVyZS4gKi8KKy8qIDEuIFJYIHNpZGU6IFRYIGZlZWRiYWNrIHBhY2tldC4gKi8KK3R5cGVkZWYgc3RydWN0IHRhZ19jbWRfcGt0X3R4X2ZlZWRiYWNrCit7CisJLy8gRFdPUkQgMAorCXU4CWVsZW1lbnRfaWQ7CQkJLyogQ29tbWFuZCBwYWNrZXQgdHlwZS4gKi8KKwl1OAlsZW5ndGg7CQkJCS8qIENvbW1hbmQgcGFja2V0IGxlbmd0aC4gKi8KKwkvKiAyMDA3LzA3LzA1IE1IIENoYW5nZSB0eCBmZWVkYmFjayBpbmZvIGZpZWxkLiAqLworCS8qLS0tLS0tVFggRmVlZGJhY2sgSW5mbyBGaWVsZCAqLworCXU4CVRJRDo0OwkJCQkvKiAqLworCXU4CWZhaWxfcmVhc29uOjM7CQkvKiAqLworCXU4CXRvazoxOwkJCQkvKiBUcmFuc21pdCBvay4gKi8KKwl1OAlyZXNlcnZlMTo0OwkJCS8qICovCisJdTgJcGt0X3R5cGU6MjsJCS8qICovCisJdTgJYmFuZHdpZHRoOjE7CQkvKiAqLworCXU4CXFvc19wa3Q6MTsJCQkvKiAqLworCisJLy8gRFdPUkQgMQorCXU4CXJlc2VydmUyOwkJCS8qICovCisJLyotLS0tLS1UWCBGZWVkYmFjayBJbmZvIEZpZWxkICovCisJdTgJcmV0cnlfY250OwkJCS8qICovCisJdTE2CXBrdF9pZDsJCQkJLyogKi8KKworCS8vIERXT1JEIDMKKwl1MTYJc2VxX251bTsJCQkvKiAqLworCXU4CXNfcmF0ZTsJCQkJLyogU3RhcnQgcmF0ZS4gKi8KKwl1OAlmX3JhdGU7CQkJCS8qIEZpbmFsIHJhdGUuICovCisKKwkvLyBEV09SRCA0CisJdTgJc19ydHNfcmF0ZTsJCQkvKiAqLworCXU4CWZfcnRzX3JhdGU7CQkJLyogKi8KKwl1MTYJcGt0X2xlbmd0aDsJCQkvKiAqLworCisJLy8gRFdPUkQgNQorCXUxNglyZXNlcnZlMzsJCQkvKiAqLworCXUxNglkdXJhdGlvbjsJCQkvKiAqLworfWNtcGtfdHhmYl90OworCisvKiAyLiBSWCBzaWRlOiBJbnRlcnJ1cHQgc3RhdHVzIHBhY2tldC4gSXQgaW5jbHVkZXMgQmVhY29uIFN0YXRlLAorCSAgQmVhY29uIFRpbWVyIEludGVycnVwdCBhbmQgb3RoZXIgdXNlZnVsIGluZm9ybWF0aW9ucyBpbiBNQUMgSVNSIFJlZy4gKi8KK3R5cGVkZWYgc3RydWN0IHRhZ19jbWRfcGt0X2ludGVycnVwdF9zdGF0dXMKK3sKKwl1OAllbGVtZW50X2lkOwkJCS8qIENvbW1hbmQgcGFja2V0IHR5cGUuICovCisJdTgJbGVuZ3RoOwkJCQkvKiBDb21tYW5kIHBhY2tldCBsZW5ndGguICovCisJdTE2CXJlc2VydmU7CisJdTMyCWludGVycnVwdF9zdGF0dXM7CQkJCS8qIEludGVycnVwdCBTdGF0dXMuICovCit9Y21wa19pbnRyX3N0YV90OworCisKKy8qIDMuIFRYIHNpZGU6IFNldCBjb25maWd1cmF0aW9uIHBhY2tldC4gKi8KK3R5cGVkZWYgc3RydWN0IHRhZ19jbWRfcGt0X3NldF9jb25maWd1cmF0aW9uCit7CisJdTgJZWxlbWVudF9pZDsJCQkvKiBDb21tYW5kIHBhY2tldCB0eXBlLiAqLworCXU4CWxlbmd0aDsJCQkJLyogQ29tbWFuZCBwYWNrZXQgbGVuZ3RoLiAqLworCXUxNglyZXNlcnZlMTsJCQkvKiAqLworCXU4IAljZmdfcmVzZXJ2ZTE6MzsKKwl1OAljZmdfc2l6ZToyOwkJCS8qIENvbmZpZ3VyYXRpb24gaW5mby4gKi8KKwl1OAljZmdfdHlwZToyOwkJCS8qIENvbmZpZ3VyYXRpb24gaW5mby4gKi8KKwl1OAljZmdfYWN0aW9uOjE7CQkvKiBDb25maWd1cmF0aW9uIGluZm8uICovCisJdTgJY2ZnX3Jlc2VydmUyOwkJLyogQ29uZmlndXJhdGlvbiBpbmZvLiAqLworCXU4CWNmZ19wYWdlOjQ7CQkJLyogQ29uZmlndXJhdGlvbiBpbmZvLiAqLworCXU4CWNmZ19yZXNlcnZlMzo0OwkJLyogQ29uZmlndXJhdGlvbiBpbmZvLiAqLworCXU4CWNmZ19vZmZzZXQ7CQkJLyogQ29uZmlndXJhdGlvbiBpbmZvLiAqLworCXUzMgl2YWx1ZTsJCQkJLyogKi8KKwl1MzIJbWFzazsJCQkJLyogKi8KK31jbXBrX3NldF9jZmdfdDsKKworLyogNC4gQm90aCBzaWRlIDogVFgvUlggcXVlcnkgY29uZmlndXJhdG9uIHBhY2tldC4gVGhlIHF1ZXJ5IHN0cnVjdHVyZSBpcyB0aGUKKyAgICAgIHNhbWUgYXMgc2V0IGNvbmZpZ3VyYXRpb24uICovCisjZGVmaW5lCQljbXBrX3F1ZXJ5X2NmZ190CWNtcGtfc2V0X2NmZ190CisKKy8qIDUuIE11bHRpIHBhY2tldCBmZWVkYmFjayBzdGF0dXMuICovCit0eXBlZGVmIHN0cnVjdCB0YWdfdHhfc3RhdHNfZmVlZGJhY2sgLy8gUEogcXVpY2sgcnhjbWQgMDkwNDIwMDcKK3sKKwkvLyBGb3IgZW5kaWFuIHRyYW5zZmVyIC0tPiBEcml2ZXIgd2lsbCBub3QgdGhlIHNhbWUgYXMgZmlybXdhcmUgc3RydWN0dXJlLgorCS8vIERXIDAKKwl1MTYJcmVzZXJ2ZTE7CisJdTggCWxlbmd0aDsJCQkJLy8gQ29tbWFuZCBwYWNrZXQgbGVuZ3RoCisJdTggCWVsZW1lbnRfaWQ7CQkJLy8gQ29tbWFuZCBwYWNrZXQgdHlwZQorCisJLy8gRFcgMQorCXUxNgl0eGZhaWw7CQkJCS8vIFR4IEZhaWwgY291bnQKKwl1MTYgCXR4b2s7CQkJCS8vIFR4IG9rIGNvdW50CisKKwkvLyBEVyAyCisJdTE2CXR4bWNvazsgIAkJCS8vIHR4IG11bHRpY2FzdAorCXUxNiAJdHhyZXRyeTsJCQkvLyBUeCBSZXRyeSBjb3VudAorCisJLy8gRFcgMworCXUxNiAgdHh1Y29rOwkJCQkvLyB0eCB1bmljYXN0CisJdTE2CXR4YmNvazsgIAkJCS8vIHR4IGJyb2FkY2FzdAorCisJLy8gRFcgNAorCXUxNgl0eGJjZmFpbDsJCQkvLworCXUxNgl0eG1jZmFpbDsJCQkvLworCisJLy8gRFcgNQorCXUxNglyZXNlcnZlMjsJCQkvLworCXUxNgl0eHVjZmFpbDsJCQkvLworCisJLy8gRFcgNi04CisJdTMyCXR4bWNsZW5ndGg7CisJdTMyCXR4YmNsZW5ndGg7CisJdTMyCXR4dWNsZW5ndGg7CisKKwkvLyBEVyA5CisJdTE2CXJlc2VydmUzXzIzOworCXU4CXJlc2VydmUzXzE7CisJdTgJcmF0ZTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBjbXBrX3R4X3N0YXR1c190OworCisvKiA2LiBEZWJ1ZyBmZWVkYmFjayBtZXNzYWdlLiAqLworLyogMjAwNy8xMC8yMyBNSCBEZWZpbmUgUlggZGVidWcgbWVzc2FnZSAgKi8KK3R5cGVkZWYgc3RydWN0IHRhZ19yeF9kZWJ1Z19tZXNzYWdlX2ZlZWRiYWNrCit7CisJLy8gRm9yIGVuZGlhbiB0cmFuc2ZlciAtLT4gZm9yIGRyaXZlcgorCS8vIERXIDAKKwl1MTYJcmVzZXJ2ZTE7CisJdTggCWxlbmd0aDsJCQkJLy8gQ29tbWFuZCBwYWNrZXQgbGVuZ3RoCisJdTggCWVsZW1lbnRfaWQ7CQkJLy8gQ29tbWFuZCBwYWNrZXQgdHlwZQorCisJLy8gRFcgMS0/PworCS8vIFZhcmlhYmxlIGRlYnVnIG1lc3NhZ2UuCisKK31jbXBrX3J4X2RiZ2luZm9fdDsKKworLyogMjAwOC8wMy8yMCBNSCBEZWZpbmUgdHJhbnNtaXQgcmF0ZSBoaXN0b3J5LiBGb3IgYmlnIGVuZGlhbiBmb3JtYXQuICovCit0eXBlZGVmIHN0cnVjdCB0YWdfdHhfcmF0ZV9oaXN0b3J5Cit7CisJLy8gRm9yIGVuZGlhbiB0cmFuc2ZlciAtLT4gZm9yIGRyaXZlcgorCS8vIERXIDAKKwl1OCAJZWxlbWVudF9pZDsJCQkvLyBDb21tYW5kIHBhY2tldCB0eXBlCisJdTggCWxlbmd0aDsJCQkJLy8gQ29tbWFuZCBwYWNrZXQgbGVuZ3RoCisJdTE2CXJlc2VydmVkMTsKKworCS8vIERXIDEtMglDQ0sgcmF0ZSBjb3VudGVyCisJdTE2IAljY2tbNF07CisKKwkvLyBEVyAzLTYKKwl1MTYgCW9mZG1bOF07CisKKwkvLyBEVyA3LTE0CisJLy9VSU5UMTYJTUNTX0JXMF9TRzBbMTZdOworCisJLy8gRFcgMTUtMjIKKwkvL1VJTlQxNglNQ1NfQlcxX1NHMFsxNl07CisKKwkvLyBEVyAyMy0zMAorCS8vVUlOVDE2CU1DU19CVzBfU0cxWzE2XTsKKworCS8vIERXIDMxLTM4CisJLy9VSU5UMTYJTUNTX0JXMV9TRzFbMTZdOworCisJLy8gRFcgNy0xNAlCVz0wIFNHPTAKKwkvLyBEVyAxNS0yMglCVz0xIFNHPTAKKwkvLyBEVyAyMy0zMAlCVz0wIFNHPTEKKwkvLyBEVyAzMS0zOAlCVz0xIFNHPTEKKwl1MTYJaHRfbWNzWzRdWzE2XTsKKworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGNtcGtfdHhfcmFoaXNfdDsKKwordHlwZWRlZiBlbnVtIHRhZ19jb21tYW5kX3BhY2tldF9kaXJlY3RvcmllcworeworICAgIFJYX1RYX0ZFRURCQUNLID0gMCwKKyAgICBSWF9JTlRFUlJVUFRfU1RBVFVTCQk9IDEsCisgICAgVFhfU0VUX0NPTkZJRwkJCQk9IDIsCisgICAgQk9USF9RVUVSWV9DT05GSUcJCQk9IDMsCisgICAgUlhfVFhfU1RBVFVTCQkJCT0gNCwKKyAgICBSWF9EQkdJTkZPX0ZFRURCQUNLCQk9IDUsCisgICAgUlhfVFhfUEVSX1BLVF9GRUVEQkFDSwkJPSA2LAorICAgIFJYX1RYX1JBVEVfSElTVE9SWQkJPSA3LAorICAgIFJYX0NNRF9FTEVfTUFYCit9Y21wa19lbGVtZW50X2U7CisKK3R5cGVkZWYgZW51bSBfcnRfc3RhdHVzeworCVJUX1NUQVRVU19TVUNDRVNTLAorCVJUX1NUQVRVU19GQUlMVVJFLAorCVJUX1NUQVRVU19QRU5ESU5HLAorCVJUX1NUQVRVU19SRVNPVVJDRQorfXJ0X3N0YXR1cywqcHJ0X3N0YXR1czsKKworZXh0ZXJuIHJ0X3N0YXR1cyBjbXBrX21lc3NhZ2VfaGFuZGxlX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4KiBjb2RldmlydHVhbGFkZHJlc3MsIHUzMiBwYWNrZXR0eXBlLCB1MzIgYnVmZmVyX2xlbik7CisKK2V4dGVybiAgdTMyIGNtcGtfbWVzc2FnZV9oYW5kbGVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqIHBzdGF0cyk7CitleHRlcm4gcnRfc3RhdHVzIFNlbmRUeENvbW1hbmRQYWNrZXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQqIHBEYXRhLCB1MzIgRGF0YUxlbik7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjMmQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmUuYwpAQCAtMCwwICsxLDQzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcm9jZWR1cmU6ICAgIEluaXQgYm9vdCBjb2RlL2Zpcm13YXJlIGNvZGUvZGF0YSBzZXNzaW9uCisgKgorICogRGVzY3JpcHRpb246IFRoaXMgcm91dGluZSB3aWxsIGludGlhbGl6ZSBmaXJtd2FyZS4gSWYgYW55IGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uCisgKiAJCXByb2Nlc3MsIHRoZSByb3V0aW5lIHNoYWxsIHRlcm1pbmF0ZSBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIGZhaWwuCisgKgkJTklDIGRyaXZlciBzaG91bGQgY2FsbCBOZGlzT3BlbkZpbGUgb25seSBmcm9tIE1pbmlwb3J0SW5pdGlhbGl6ZS4KKyAqCisgKiBBcmd1bWVudHM6ICAgVGhlIHBvaW50ZXIgb2YgdGhlIGFkYXB0ZXIKKworICogUmV0dXJuczoKKyAqICAgICAgICBORElTX1NUQVRVU19GQUlMVVJFIC0gdGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHNob3VsZCBiZSB0ZXJtaW5hdGVkCisgKiAgICAgICAgTkRJU19TVEFUVVNfU1VDQ0VTUyAtIGlmIGZpcm13YXJlIGluaXRpYWxpemF0aW9uIHByb2Nlc3Mgc3VjY2VzcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKyNpbmNsdWRlICJyODE5MlUuaCIKKyNpbmNsdWRlICJyODE5MlVfaHcuaCIKKyNpbmNsdWRlICJyODE5eFVfZmlybXdhcmVfaW1nLmgiCisjaW5jbHVkZSAicjgxOXhVX2Zpcm13YXJlLmgiCisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KK3ZvaWQgZmlybXdhcmVfaW5pdF9wYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2IAkqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcnRfZmlybXdhcmUJCSpwZmlybXdhcmUgPSBwcml2LT5wRmlybXdhcmU7CisKKwlwZmlybXdhcmUtPmNtZHBhY2tldF9mcmFnX3RocmVzb2xkID0gR0VUX0NPTU1BTkRfUEFDS0VUX0ZSQUdfVEhSRVNIT0xEKE1BWF9UUkFOU01JVF9CVUZGRVJfU0laRSk7Cit9CisKKy8qCisgKiBzZWdtZW50IHRoZSBpbWcgYW5kIHVzZSB0aGUgcHRyIGFuZCBsZW5ndGggdG8gcmVtZW1iZXIgaW5mbyBvbiBlYWNoIHNlZ21lbnQKKyAqCisgKi8KK2Jvb2wgZndfZG93bmxvYWRfY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqY29kZV92aXJ0dWFsX2FkZHJlc3MsIHUzMiBidWZmZXJfbGVuKQoreworCXN0cnVjdCByODE5Ml9wcml2ICAgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWJvb2wgCQkgICAgcnRfc3RhdHVzID0gdHJ1ZTsKKwl1MTYJCSAgICBmcmFnX3RocmVzaG9sZDsKKwl1MTYJCSAgICBmcmFnX2xlbmd0aCwgZnJhZ19vZmZzZXQgPSAwOworCS8vdTE2CQkgICAgdG90YWxfc2l6ZTsKKwlpbnQJCSAgICBpOworCisJcnRfZmlybXdhcmUJICAgICpwZmlybXdhcmUgPSBwcml2LT5wRmlybXdhcmU7CisJc3RydWN0IHNrX2J1ZmYJICAgICpza2I7CisJdW5zaWduZWQgY2hhcgkgICAgKnNlZ19wdHI7CisJY2JfZGVzYwkJICAgICp0Y2JfZGVzYzsKKwl1OCAgICAgICAgICAgICAgICAgIGJMYXN0SW5pUGt0OworCisJZmlybXdhcmVfaW5pdF9wYXJhbShkZXYpOworCS8vRnJhZ21lbnRhdGlvbiBtaWdodCBiZSByZXF1aXJlZAorCWZyYWdfdGhyZXNob2xkID0gcGZpcm13YXJlLT5jbWRwYWNrZXRfZnJhZ190aHJlc29sZDsKKwlkbyB7CisJCWlmKChidWZmZXJfbGVuIC0gZnJhZ19vZmZzZXQpID4gZnJhZ190aHJlc2hvbGQpIHsKKwkJCWZyYWdfbGVuZ3RoID0gZnJhZ190aHJlc2hvbGQgOworCQkJYkxhc3RJbmlQa3QgPSAwOworCisJCX0gZWxzZSB7CisJCQlmcmFnX2xlbmd0aCA9IGJ1ZmZlcl9sZW4gLSBmcmFnX29mZnNldDsKKwkJCWJMYXN0SW5pUGt0ID0gMTsKKworCQl9CisKKwkJLyogQWxsb2NhdGUgc2tiIGJ1ZmZlciB0byBjb250YWluIGZpcm13YXJlIGluZm8gYW5kIHR4IGRlc2NyaXB0b3IgaW5mbworCQkgKiBhZGQgNCB0byBhdm9pZCBwYWNrZXQgYXBwZW5kaW5nIG92ZXJmbG93LgorCQkgKiAqLworCQkjaWZkZWYgUlRMODE5MlUKKwkJc2tiICA9IGRldl9hbGxvY19za2IoVVNCX0hXREVTQ19IRUFERVJfTEVOICsgZnJhZ19sZW5ndGggKyA0KTsKKwkJI2Vsc2UKKwkJc2tiICA9IGRldl9hbGxvY19za2IoZnJhZ19sZW5ndGggKyA0KTsKKwkJI2VuZGlmCisJCW1lbWNweSgodW5zaWduZWQgY2hhciAqKShza2ItPmNiKSwmZGV2LHNpemVvZihkZXYpKTsKKwkJdGNiX2Rlc2MgPSAoY2JfZGVzYyopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9IFRYQ01EX1FVRVVFOworCQl0Y2JfZGVzYy0+YkNtZE9ySW5pdCA9IERFU0NfUEFDS0VUX1RZUEVfSU5JVDsKKwkJdGNiX2Rlc2MtPmJMYXN0SW5pUGt0ID0gYkxhc3RJbmlQa3Q7CisKKwkJI2lmZGVmIFJUTDgxOTJVCisJCXNrYl9yZXNlcnZlKHNrYiwgVVNCX0hXREVTQ19IRUFERVJfTEVOKTsKKwkJI2VuZGlmCisJCXNlZ19wdHIgPSBza2ItPmRhdGE7CisJCS8qCisJCSAqIFRyYW5zZm9ybSBmcm9tIGxpdHRsZSBlbmRpYW4gdG8gYmlnIGVuZGlhbgorCQkgKiBhbmQgcGVuZGluZyAgemVybworCQkgKi8KKwkJZm9yKGk9MCA7IGkgPCBmcmFnX2xlbmd0aDsgaSs9NCkgeworCQkJKnNlZ19wdHIrKyA9ICgoaSswKTxmcmFnX2xlbmd0aCk/Y29kZV92aXJ0dWFsX2FkZHJlc3NbaSszXTowOworCQkJKnNlZ19wdHIrKyA9ICgoaSsxKTxmcmFnX2xlbmd0aCk/Y29kZV92aXJ0dWFsX2FkZHJlc3NbaSsyXTowOworCQkJKnNlZ19wdHIrKyA9ICgoaSsyKTxmcmFnX2xlbmd0aCk/Y29kZV92aXJ0dWFsX2FkZHJlc3NbaSsxXTowOworCQkJKnNlZ19wdHIrKyA9ICgoaSszKTxmcmFnX2xlbmd0aCk/Y29kZV92aXJ0dWFsX2FkZHJlc3NbaSswXTowOworCQl9CisJCXRjYl9kZXNjLT50eGJ1Zl9zaXplPSAodTE2KWk7CisJCXNrYl9wdXQoc2tiLCBpKTsKKworCQlpZighcHJpdi0+aWVlZTgwMjExLT5jaGVja19uaWNfZW5vdWdoX2Rlc2MoZGV2LHRjYl9kZXNjLT5xdWV1ZV9pbmRleCl8fAorCQkJKCFza2JfcXVldWVfZW1wdHkoJnByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF0pKXx8XAorCQkJKHByaXYtPmllZWU4MDIxMS0+cXVldWVfc3RvcCkgKSB7CisJCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT4gdHggZnVsbCFcbiIpOworCQkJc2tiX3F1ZXVlX3RhaWwoJnByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF0sIHNrYik7CisJCX0gZWxzZSB7CisJCQlwcml2LT5pZWVlODAyMTEtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYixkZXYpOworCQl9CisKKwkJY29kZV92aXJ0dWFsX2FkZHJlc3MgKz0gZnJhZ19sZW5ndGg7CisJCWZyYWdfb2Zmc2V0ICs9IGZyYWdfbGVuZ3RoOworCisJfXdoaWxlKGZyYWdfb2Zmc2V0IDwgYnVmZmVyX2xlbik7CisKKwlyZXR1cm4gcnRfc3RhdHVzOworCit9CisKK2Jvb2wKK2Z3U2VuZE51bGxQYWNrZXQoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1MzIJCQlMZW5ndGgKKykKK3sKKwlib29sCXJ0U3RhdHVzID0gdHJ1ZTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAgICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2tfYnVmZgkgICAgKnNrYjsKKwljYl9kZXNjCQkgICAgKnRjYl9kZXNjOworCXVuc2lnbmVkIGNoYXIJICAgICpwdHJfYnVmOworCWJvb2wJYkxhc3RJbml0UGFja2V0ID0gZmFsc2U7CisKKwkvL1BsYXRmb3JtQWNxdWlyZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1RYX1NQSU5MT0NLKTsKKworCS8vR2V0IFRDQiBhbmQgbG9jYWwgYnVmZmVyIGZyb20gY29tbW9uIHBvb2wuIChJdCBpcyBzaGFyZWQgYnkgQ21kUSwgTWdudFEsIGFuZCBVU0IgY29hbGVzY2UgRGF0YVEpCisJc2tiICA9IGRldl9hbGxvY19za2IoTGVuZ3RoKyA0KTsKKwltZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikoc2tiLT5jYiksJmRldixzaXplb2YoZGV2KSk7CisJdGNiX2Rlc2MgPSAoY2JfZGVzYyopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJdGNiX2Rlc2MtPnF1ZXVlX2luZGV4ID0gVFhDTURfUVVFVUU7CisJdGNiX2Rlc2MtPmJDbWRPckluaXQgPSBERVNDX1BBQ0tFVF9UWVBFX0lOSVQ7CisJdGNiX2Rlc2MtPmJMYXN0SW5pUGt0ID0gYkxhc3RJbml0UGFja2V0OworCXB0cl9idWYgPSBza2JfcHV0KHNrYiwgTGVuZ3RoKTsKKwltZW1zZXQocHRyX2J1ZiwwLExlbmd0aCk7CisJdGNiX2Rlc2MtPnR4YnVmX3NpemU9ICh1MTYpTGVuZ3RoOworCisJaWYoIXByaXYtPmllZWU4MDIxMS0+Y2hlY2tfbmljX2Vub3VnaF9kZXNjKGRldix0Y2JfZGVzYy0+cXVldWVfaW5kZXgpfHwKKwkJCSghc2tiX3F1ZXVlX2VtcHR5KCZwcml2LT5pZWVlODAyMTEtPnNrYl93YWl0UVt0Y2JfZGVzYy0+cXVldWVfaW5kZXhdKSl8fFwKKwkJCShwcml2LT5pZWVlODAyMTEtPnF1ZXVlX3N0b3ApICkgeworCQkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwiPT09PT09PT09PT09PT09PT09PU5VTEwgcGFja2V0PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT4gdHggZnVsbCFcbiIpOworCQkJc2tiX3F1ZXVlX3RhaWwoJnByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF0sIHNrYik7CisJCX0gZWxzZSB7CisJCQlwcml2LT5pZWVlODAyMTEtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYixkZXYpOworCQl9CisKKwkvL1BsYXRmb3JtUmVsZWFzZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1RYX1NQSU5MT0NLKTsKKwlyZXR1cm4gcnRTdGF0dXM7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHJvY2VkdXJlOiAgICBDaGVjayB3aGV0aGVyIG1haW4gY29kZSBpcyBkb3dubG9hZCBPSy4gSWYgT0ssIHR1cm4gb24gQ1BVCisvLworLy8gRGVzY3JpcHRpb246ICAgQ1BVIHJlZ2lzdGVyIGxvY2F0ZXMgaW4gZGlmZmVyZW50IHBhZ2UgYWdhaW5zdCBnZW5lcmFsIHJlZ2lzdGVyLgorLy8JCQkgICAgU3dpdGNoIHRvIENQVSByZWdpc3RlciBpbiB0aGUgYmVnaW4gYW5kIHN3aXRjaCBiYWNrIGJlZm9yZSByZXR1cm4KKy8vCisvLworLy8gQXJndW1lbnRzOiAgIFRoZSBwb2ludGVyIG9mIHRoZSBhZGFwdGVyCisvLworLy8gUmV0dXJuczoKKy8vICAgICAgICBORElTX1NUQVRVU19GQUlMVVJFIC0gdGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHNob3VsZCBiZSB0ZXJtaW5hdGVkCisvLyAgICAgICAgTkRJU19TVEFUVVNfU1VDQ0VTUyAtIGlmIGZpcm13YXJlIGluaXRpYWxpemF0aW9uIHByb2Nlc3Mgc3VjY2VzcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorYm9vbCBDUFVjaGVja19tYWluY29kZW9rX3R1cm5vbkNQVShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWJvb2wJCXJ0X3N0YXR1cyA9IHRydWU7CisJaW50CQljaGVja19wdXRjb2RlT0tfdGltZSA9IDIwMDAwMCwgY2hlY2tfYm9vdE9rX3RpbWUgPSAyMDAwMDA7CisJdTMyCQlDUFVfc3RhdHVzID0gMDsKKworCS8qIENoZWNrIHdoZXRoZXIgcHV0IGNvZGUgT0sgKi8KKwlkbyB7CisJCUNQVV9zdGF0dXMgPSByZWFkX25pY19kd29yZChkZXYsIENQVV9HRU4pOworCisJCWlmKENQVV9zdGF0dXMmQ1BVX0dFTl9QVVRfQ09ERV9PSykKKwkJCWJyZWFrOworCisJfXdoaWxlKGNoZWNrX3B1dGNvZGVPS190aW1lLS0pOworCisJaWYoIShDUFVfc3RhdHVzJkNQVV9HRU5fUFVUX0NPREVfT0spKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAiRG93bmxvYWQgRmlybXdhcmU6IFB1dCBjb2RlIGZhaWwhXG4iKTsKKwkJZ290byBDUFVDaGVja01haW5Db2RlT0tBbmRUdXJuT25DUFVfRmFpbDsKKwl9IGVsc2UgeworCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCAiRG93bmxvYWQgRmlybXdhcmU6IFB1dCBjb2RlIG9rIVxuIik7CisJfQorCisJLyogVHVybiBPbiBDUFUgKi8KKwlDUFVfc3RhdHVzID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBDUFVfR0VOKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENQVV9HRU4sICh1OCkoKENQVV9zdGF0dXN8Q1BVX0dFTl9QV1JfU1RCX0NQVSkmMHhmZikpOworCW1kZWxheSgxMDAwKTsKKworCS8qIENoZWNrIHdoZXRoZXIgQ1BVIGJvb3QgT0sgKi8KKwlkbyB7CisJCUNQVV9zdGF0dXMgPSByZWFkX25pY19kd29yZChkZXYsIENQVV9HRU4pOworCisJCWlmKENQVV9zdGF0dXMmQ1BVX0dFTl9CT09UX1JEWSkKKwkJCWJyZWFrOworCX13aGlsZShjaGVja19ib290T2tfdGltZS0tKTsKKworCWlmKCEoQ1BVX3N0YXR1cyZDUFVfR0VOX0JPT1RfUkRZKSkgeworCQlnb3RvIENQVUNoZWNrTWFpbkNvZGVPS0FuZFR1cm5PbkNQVV9GYWlsOworCX0gZWxzZSB7CisJCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsICJEb3dubG9hZCBGaXJtd2FyZTogQm9vdCByZWFkeSFcbiIpOworCX0KKworCXJldHVybiBydF9zdGF0dXM7CisKK0NQVUNoZWNrTWFpbkNvZGVPS0FuZFR1cm5PbkNQVV9GYWlsOgorCVJUX1RSQUNFKENPTVBfRVJSLCAiRVJSIGluICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJcnRfc3RhdHVzID0gRkFMU0U7CisJcmV0dXJuIHJ0X3N0YXR1czsKK30KKworYm9vbCBDUFVjaGVja19maXJtd2FyZV9yZWFkeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJYm9vbAkJcnRfc3RhdHVzID0gdHJ1ZTsKKwlpbnQJCWNoZWNrX3RpbWUgPSAyMDAwMDA7CisJdTMyCQlDUFVfc3RhdHVzID0gMDsKKworCS8qIENoZWNrIEZpcm13YXJlIFJlYWR5ICovCisJZG8geworCQlDUFVfc3RhdHVzID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBDUFVfR0VOKTsKKworCQlpZihDUFVfc3RhdHVzJkNQVV9HRU5fRklSTV9SRFkpCisJCQlicmVhazsKKworCX13aGlsZShjaGVja190aW1lLS0pOworCisJaWYoIShDUFVfc3RhdHVzJkNQVV9HRU5fRklSTV9SRFkpKQorCQlnb3RvIENQVUNoZWNrRmlybXdhcmVSZWFkeV9GYWlsOworCWVsc2UKKwkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwgIkRvd25sb2FkIEZpcm13YXJlOiBGaXJtd2FyZSByZWFkeSFcbiIpOworCisJcmV0dXJuIHJ0X3N0YXR1czsKKworQ1BVQ2hlY2tGaXJtd2FyZVJlYWR5X0ZhaWw6CisJUlRfVFJBQ0UoQ09NUF9FUlIsICJFUlIgaW4gJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlydF9zdGF0dXMgPSBmYWxzZTsKKwlyZXR1cm4gcnRfc3RhdHVzOworCit9CisKK2Jvb2wgaW5pdF9maXJtd2FyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2IAkqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJYm9vbAkJCXJ0X3N0YXR1cyA9IFRSVUU7CisKKwl1OAkJCSpmaXJtd2FyZV9pbWdfYnVmWzNdID0geyAmcnRsODE5MF9md2Jvb3RfYXJyYXlbMF0sCisJCQkJCQkJICZydGw4MTkwX2Z3bWFpbl9hcnJheVswXSwKKwkJCQkJCQkgJnJ0bDgxOTBfZndkYXRhX2FycmF5WzBdfTsKKworCXUzMgkJCWZpcm13YXJlX2ltZ19sZW5bM10gPSB7IHNpemVvZihydGw4MTkwX2Z3Ym9vdF9hcnJheSksCisJCQkJCQkJc2l6ZW9mKHJ0bDgxOTBfZndtYWluX2FycmF5KSwKKwkJCQkJCQlzaXplb2YocnRsODE5MF9md2RhdGFfYXJyYXkpfTsKKwl1MzIJCQlmaWxlX2xlbmd0aCA9IDA7CisJdTgJCQkqbWFwcGVkX2ZpbGUgPSBOVUxMOworCXUzMgkJCWluaXRfc3RlcCA9IDA7CisJb3B0X3JzdF90eXBlX2UJcnN0X29wdCA9IE9QVF9TWVNURU1fUkVTRVQ7CisJZmlybXdhcmVfaW5pdF9zdGVwX2UgCXN0YXJ0aW5nX3N0YXRlID0gRldfSU5JVF9TVEVQMF9CT09UOworCisJcnRfZmlybXdhcmUJCSpwZmlybXdhcmUgPSBwcml2LT5wRmlybXdhcmU7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlIAkqZndfZW50cnk7CisJY29uc3QgY2hhciAqZndfbmFtZVszXSA9IHsgIlJUTDgxOTJVL2Jvb3QuaW1nIiwKKwkJCSAgICJSVEw4MTkyVS9tYWluLmltZyIsCisJCQkgICAiUlRMODE5MlUvZGF0YS5pbWcifTsKKwlpbnQgcmM7CisKKwlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCAiIFBsYXRmb3JtSW5pdEZpcm13YXJlKCk9PT5cbiIpOworCisJaWYgKHBmaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID09IEZXX1NUQVRVU18wX0lOSVQgKSB7CisJCS8qIGl0IGlzIGNhbGxlZCBieSByZXNldCAqLworCQlyc3Rfb3B0ID0gT1BUX1NZU1RFTV9SRVNFVDsKKwkJc3RhcnRpbmdfc3RhdGUgPSBGV19JTklUX1NURVAwX0JPT1Q7CisJCS8vIFRPRE86IHN5c3RlbSByZXNldAorCisJfWVsc2UgaWYocGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPT0gRldfU1RBVFVTXzVfUkVBRFkpIHsKKwkJLyogaXQgaXMgY2FsbGVkIGJ5IEluaXRpYWxpemUgKi8KKwkJcnN0X29wdCA9IE9QVF9GSVJNV0FSRV9SRVNFVDsKKwkJc3RhcnRpbmdfc3RhdGUgPSBGV19JTklUX1NURVAyX0RBVEE7CisJfWVsc2UgeworCQkgUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwgIlBsYXRmb3JtSW5pdEZpcm13YXJlOiB1bmRlZmluZWQgZmlybXdhcmUgc3RhdGVcbiIpOworCX0KKworCS8qCisJICogRG93bmxvYWQgYm9vdCwgbWFpbiwgYW5kIGRhdGEgaW1hZ2UgZm9yIFN5c3RlbSByZXNldC4KKwkgKiBEb3dubG9hZCBkYXRhIGltYWdlIGZvciBmaXJtd2FyZSByZXNldGEKKwkgKi8KKwlwcml2LT5maXJtd2FyZV9zb3VyY2UgPSBGV19TT1VSQ0VfSU1HX0ZJTEU7CisJZm9yKGluaXRfc3RlcCA9IHN0YXJ0aW5nX3N0YXRlOyBpbml0X3N0ZXAgPD0gRldfSU5JVF9TVEVQMl9EQVRBOyBpbml0X3N0ZXArKykgeworCQkvKgorCQkgKiBPcGVuIEltYWdlIGZpbGUsIGFuZCBtYXAgZmlsZSB0byBjb250aW5lb3VzIG1lbW9yeSBpZiBvcGVuIGZpbGUgc3VjY2Vzcy4KKwkJICogb3IgcmVhZCBpbWFnZSBmaWxlIGZyb20gYXJyYXkuIERlZmF1bHQgbG9hZCBmcm9tIElNRyBmaWxlCisJCSAqLworCQlpZihyc3Rfb3B0ID09IE9QVF9TWVNURU1fUkVTRVQpIHsKKwkJCXN3aXRjaChwcml2LT5maXJtd2FyZV9zb3VyY2UpIHsKKwkJCQljYXNlIEZXX1NPVVJDRV9JTUdfRklMRToKKwkJCQkJcmMgPSByZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgZndfbmFtZVtpbml0X3N0ZXBdLCZwcml2LT51ZGV2LT5kZXYpOworCQkJCQlpZihyYyA8IDAgKSB7CisJCQkJCQlSVF9UUkFDRShDT01QX0VSUiwgInJlcXVlc3QgZmlybXdhcmUgZmFpbCFcbiIpOworCQkJCQkJZ290byBkb3dubG9hZF9maXJtd2FyZV9mYWlsOworCQkJCQl9CisKKwkJCQkJaWYoZndfZW50cnktPnNpemUgPiBzaXplb2YocGZpcm13YXJlLT5maXJtd2FyZV9idWYpKSB7CisJCQkJCQlSVF9UUkFDRShDT01QX0VSUiwgImltZyBmaWxlIHNpemUgZXhjZWVkIHRoZSBjb250YWluZXIgYnVmZmVyIGZhaWwhXG4iKTsKKwkJCQkJCWdvdG8gZG93bmxvYWRfZmlybXdhcmVfZmFpbDsKKwkJCQkJfQorCisJCQkJCWlmKGluaXRfc3RlcCAhPSBGV19JTklUX1NURVAxX01BSU4pIHsKKwkJCQkJCW1lbWNweShwZmlybXdhcmUtPmZpcm13YXJlX2J1Zixmd19lbnRyeS0+ZGF0YSxmd19lbnRyeS0+c2l6ZSk7CisJCQkJCQltYXBwZWRfZmlsZSA9IHBmaXJtd2FyZS0+ZmlybXdhcmVfYnVmOworCQkJCQkJZmlsZV9sZW5ndGggPSBmd19lbnRyeS0+c2l6ZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJI2lmZGVmIFJUTDgxOTBQCisJCQkJCQltZW1jcHkocGZpcm13YXJlLT5maXJtd2FyZV9idWYsZndfZW50cnktPmRhdGEsZndfZW50cnktPnNpemUpOworCQkJCQkJbWFwcGVkX2ZpbGUgPSBwZmlybXdhcmUtPmZpcm13YXJlX2J1ZjsKKwkJCQkJCWZpbGVfbGVuZ3RoID0gZndfZW50cnktPnNpemU7CisJCQkJCSNlbHNlCisJCQkJCQltZW1zZXQocGZpcm13YXJlLT5maXJtd2FyZV9idWYsMCwxMjgpOworCQkJCQkJbWVtY3B5KCZwZmlybXdhcmUtPmZpcm13YXJlX2J1ZlsxMjhdLGZ3X2VudHJ5LT5kYXRhLGZ3X2VudHJ5LT5zaXplKTsKKwkJCQkJCW1hcHBlZF9maWxlID0gcGZpcm13YXJlLT5maXJtd2FyZV9idWY7CisJCQkJCQlmaWxlX2xlbmd0aCA9IGZ3X2VudHJ5LT5zaXplICsgMTI4OworCQkJCQkjZW5kaWYKKwkJCQkJfQorCQkJCQlwZmlybXdhcmUtPmZpcm13YXJlX2J1Zl9zaXplID0gZmlsZV9sZW5ndGg7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBGV19TT1VSQ0VfSEVBREVSX0ZJTEU6CisJCQkJCW1hcHBlZF9maWxlID0gIGZpcm13YXJlX2ltZ19idWZbaW5pdF9zdGVwXTsKKwkJCQkJZmlsZV9sZW5ndGggID0gZmlybXdhcmVfaW1nX2xlbltpbml0X3N0ZXBdOworCQkJCQlpZihpbml0X3N0ZXAgPT0gRldfSU5JVF9TVEVQMl9EQVRBKSB7CisJCQkJCQltZW1jcHkocGZpcm13YXJlLT5maXJtd2FyZV9idWYsIG1hcHBlZF9maWxlLCBmaWxlX2xlbmd0aCk7CisJCQkJCQlwZmlybXdhcmUtPmZpcm13YXJlX2J1Zl9zaXplID0gZmlsZV9sZW5ndGg7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCX0KKworCisJCX1lbHNlIGlmKHJzdF9vcHQgPT0gT1BUX0ZJUk1XQVJFX1JFU0VUICkgeworCQkJLyogd2Ugb25seSBuZWVkIHRvIGRvd25sb2FkIGRhdGEuaW1nIGhlcmUgKi8KKwkJCW1hcHBlZF9maWxlID0gcGZpcm13YXJlLT5maXJtd2FyZV9idWY7CisJCQlmaWxlX2xlbmd0aCA9IHBmaXJtd2FyZS0+ZmlybXdhcmVfYnVmX3NpemU7CisJCX0KKworCQkvKiBEb3dubG9hZCBpbWFnZSBmaWxlICovCisJCS8qIFRoZSBmaXJtd2FyZSBkb3dubG9hZCBwcm9jZXNzIGlzIGp1c3QgYXMgZm9sbG93aW5nLAorCQkgKiAxLiB0aGF0IGlzIGVhY2ggcGFja2V0IHdpbGwgYmUgc2VnbWVudGVkIGFuZCBpbnNlcnRlZCB0byB0aGUgd2FpdCBxdWV1ZS4KKwkJICogMi4gZWFjaCBwYWNrZXQgc2VnbWVudCB3aWxsIGJlIHB1dCBpbiB0aGUgc2tiX2J1ZmYgcGFja2V0LgorCQkgKiAzLiBlYWNoIHNrYl9idWZmIHBhY2tldCBkYXRhIGNvbnRlbnQgd2lsbCBhbHJlYWR5IGluY2x1ZGUgdGhlIGZpcm13YXJlIGluZm8KKwkJICogICBhbmQgVHggZGVzY3JpcHRvciBpbmZvCisJCSAqICovCisJCXJ0X3N0YXR1cyA9IGZ3X2Rvd25sb2FkX2NvZGUoZGV2LG1hcHBlZF9maWxlLGZpbGVfbGVuZ3RoKTsKKwkJaWYocnN0X29wdCA9PSBPUFRfU1lTVEVNX1JFU0VUKSB7CisJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKKwkJfQorCisJCWlmKHJ0X3N0YXR1cyAhPSBUUlVFKSB7CisJCQlnb3RvIGRvd25sb2FkX2Zpcm13YXJlX2ZhaWw7CisJCX0KKworCQlzd2l0Y2goaW5pdF9zdGVwKSB7CisJCQljYXNlIEZXX0lOSVRfU1RFUDBfQk9PVDoKKwkJCQkvKiBEb3dubG9hZCBib290CisJCQkJICogaW5pdGlhbGl6ZSBjb21tYW5kIGRlc2NyaXB0b3IuCisJCQkJICogd2lsbCBzZXQgcG9sbGluZyBiaXQgd2hlbiBmaXJtd2FyZSBjb2RlIGlzIGFsc28gY29uZmlndXJlZAorCQkJCSAqLworCQkJCXBmaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID0gRldfU1RBVFVTXzFfTU9WRV9CT09UX0NPREU7CisjaWZkZWYgUlRMODE5MFAKKwkJCQkvLyBUbyBpbml0aWFsaXplIElNRU0sIENQVSBtb3ZlIGNvZGUgIGZyb20gMHg4MDAwMDA4MCwgaGVuY2UsIHdlIHNlbmQgMHg4MCBieXRlIHBhY2tldAorCQkJCXJ0X3N0YXR1cyA9IGZ3U2VuZE51bGxQYWNrZXQoZGV2LCBSVEw4MTkwX0NQVV9TVEFSVF9PRkZTRVQpOworCQkJCWlmKHJ0X3N0YXR1cyAhPSB0cnVlKQorCQkJCXsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9JTklULCAiZndTZW5kTnVsbFBhY2tldCgpIGZhaWwgISBcbiIpOworCQkJCQlnb3RvICBkb3dubG9hZF9maXJtd2FyZV9mYWlsOworCQkJCX0KKyNlbmRpZgorCQkJCS8vbWRlbGF5KDEwMDApOworCQkJCS8qCisJCQkJICogVG8gaW5pdGlhbGl6ZSBJTUVNLCBDUFUgbW92ZSBjb2RlICBmcm9tIDB4ODAwMDAwODAsCisJCQkJICogaGVuY2UsIHdlIHNlbmQgMHg4MCBieXRlIHBhY2tldAorCQkJCSAqLworCQkJCWJyZWFrOworCisJCQljYXNlIEZXX0lOSVRfU1RFUDFfTUFJTjoKKwkJCQkvKiBEb3dubG9hZCBmaXJtd2FyZSBjb2RlLiBXYWl0IHVudGlsIEJvb3QgUmVhZHkgYW5kIFR1cm4gb24gQ1BVICovCisJCQkJcGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPSBGV19TVEFUVVNfMl9NT1ZFX01BSU5fQ09ERTsKKworCQkJCS8qIENoZWNrIFB1dCBDb2RlIE9LIGFuZCBUdXJuIE9uIENQVSAqLworCQkJCXJ0X3N0YXR1cyA9IENQVWNoZWNrX21haW5jb2Rlb2tfdHVybm9uQ1BVKGRldik7CisJCQkJaWYocnRfc3RhdHVzICE9IFRSVUUpIHsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJDUFVjaGVja19tYWluY29kZW9rX3R1cm5vbkNQVSBmYWlsIVxuIik7CisJCQkJCWdvdG8gZG93bmxvYWRfZmlybXdhcmVfZmFpbDsKKwkJCQl9CisKKwkJCQlwZmlybXdhcmUtPmZpcm13YXJlX3N0YXR1cyA9IEZXX1NUQVRVU18zX1RVUk5PTl9DUFU7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRldfSU5JVF9TVEVQMl9EQVRBOgorCQkJCS8qIGRvd25sb2FkIGluaXRpYWwgZGF0YSBjb2RlICovCisJCQkJcGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPSBGV19TVEFUVVNfNF9NT1ZFX0RBVEFfQ09ERTsKKwkJCQltZGVsYXkoMSk7CisKKwkJCQlydF9zdGF0dXMgPSBDUFVjaGVja19maXJtd2FyZV9yZWFkeShkZXYpOworCQkJCWlmKHJ0X3N0YXR1cyAhPSBUUlVFKSB7CisJCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiQ1BVY2hlY2tfZmlybXdhcmVfcmVhZHkgZmFpbCglZCkhXG4iLHJ0X3N0YXR1cyk7CisJCQkJCWdvdG8gZG93bmxvYWRfZmlybXdhcmVfZmFpbDsKKwkJCQl9CisKKwkJCQkvKiB3YWl0IHVudGlsIGRhdGEgY29kZSBpcyBpbml0aWFsaXplZCByZWFkeS4qLworCQkJCXBmaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID0gRldfU1RBVFVTXzVfUkVBRFk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCAiRmlybXdhcmUgRG93bmxvYWQgU3VjY2Vzc1xuIik7CisJLy9hc3NlcnQocGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPT0gRldfU1RBVFVTXzVfUkVBRFksICgiRmlybXdhcmUgRG93bmxvYWQgRmFpbFxuIikpOworCisJcmV0dXJuIHJ0X3N0YXR1czsKKworZG93bmxvYWRfZmlybXdhcmVfZmFpbDoKKwlSVF9UUkFDRShDT01QX0VSUiwgIkVSUiBpbiAlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCXJ0X3N0YXR1cyA9IEZBTFNFOworCXJldHVybiBydF9zdGF0dXM7CisKK30KKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiY2VlZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlLmgKQEAgLTAsMCArMSwyNyBAQAorI2lmbmRlZiBfX0lOQ19GSVJNV0FSRV9ICisjZGVmaW5lIF9fSU5DX0ZJUk1XQVJFX0gKKworI2RlZmluZSBSVEw4MTkwX0NQVV9TVEFSVF9PRkZTRVQJMHg4MAorLyogVE9ETzogdGhpcyBkZWZpbml0aW9uIGlzIFRCRCAqLworLy8jZGVmaW5lIFVTQl9IV0RFU0NfSEVBREVSX0xFTgkwCisKKy8qIEl0IHNob3VsZCBiZSBkb3VibGUgd29yZCBhbGlnbm1lbnQgKi8KKy8vI2lmIERFVl9CVVNfVFlQRT09UENJX0lOVEVSRkFDRQorLy8jZGVmaW5lIEdFVF9DT01NQU5EX1BBQ0tFVF9GUkFHX1RIUkVTSE9MRCh2KQk0Kih2LzQpIC0gOAorLy8jZWxzZQorI2RlZmluZSBHRVRfQ09NTUFORF9QQUNLRVRfRlJBR19USFJFU0hPTEQodikJKDQqKHYvNCkgLSA4IC0gVVNCX0hXREVTQ19IRUFERVJfTEVOKQorLy8jZW5kaWYKKwordHlwZWRlZiBlbnVtIF9maXJtd2FyZV9pbml0X3N0ZXB7CisJRldfSU5JVF9TVEVQMF9CT09UID0gMCwKKwlGV19JTklUX1NURVAxX01BSU4gPSAxLAorCUZXX0lOSVRfU1RFUDJfREFUQSA9IDIsCit9ZmlybXdhcmVfaW5pdF9zdGVwX2U7CisKK3R5cGVkZWYgZW51bSBfb3B0X3JzdF90eXBleworCU9QVF9TWVNURU1fUkVTRVQgPSAwLAorCU9QVF9GSVJNV0FSRV9SRVNFVCA9IDEsCit9b3B0X3JzdF90eXBlX2U7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlX2ltZy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9maXJtd2FyZV9pbWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWI2NTZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9maXJtd2FyZV9pbWcuYwpAQCAtMCwwICsxLDM0NDcgQEAKKy8qQ3JlYXRlZCBvbiAgMjAwOC8gNy8xNiwgIDU6MzEqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3U4IHJ0bDgxOTBfZndib290X2FycmF5W10gPSB7CisweDEwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDA4LDB4YmYsMHhjMCwweDI1LDB4MDgsMHgwMCwweDA4LAorMHgzYywweDA5LDB4YjAsMHgwMywweGFkLDB4MjgsMHgwMCwweDIwLDB4NDAsMHg4MCwweDY4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4M2MsMHgwYSwweGQwLDB4MDAsMHg0MCwweDhhLDB4NjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwOCwweDgwLDB4MDEsCisweDI1LDB4MDgsMHhiMCwweDUwLDB4MjQsMHgwOSwweDAwLDB4MDEsMHgzYywweDAxLDB4N2YsMHhmZiwweDM0LDB4MjEsMHhmZiwweGZmLAorMHgwMSwweDAxLDB4NTAsMHgyNCwweDAwLDB4MDksMHg0OCwweDQwLDB4MzUsMHgyOSwweDAwLDB4MDEsMHgwMSwweDJhLDB4MTAsMHgyYiwKKzB4MTQsMHg0MCwweGZmLDB4ZmMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MGEsMHgwMCwweDAwLDB4MjUsMHg0YSwweDAwLDB4MDAsCisweDRjLDB4OGEsMHgwMCwweDAwLDB4NGMsMHg4OSwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDgsMHg4MCwweDAxLAorMHgyNSwweDA4LDB4YjAsMHg1MCwweDNjLDB4MDEsMHg4MCwweDAwLDB4MDEsMHgyMSwweDQ4LDB4MjUsMHgzYywweDBhLDB4YmYsMHhjMCwKKzB4MjUsMHg0YSwweDAwLDB4N2MsMHgzYywweDBiLDB4YjAsMHgwMywweGFkLDB4NmEsMHgwMCwweDIwLDB4YWQsMHgwMCwweDAwLDB4MDAsCisweDIxLDB4MDgsMHgwMCwweDA0LDB4MDEsMHgwOSwweDEwLDB4MmIsMHgxNCwweDQwLDB4ZmYsMHhmOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDA4LDB4ODAsMHgwMSwweDI1LDB4MDgsMHg3ZiwweGZmLDB4MjQsMHgwOSwweDAwLDB4MDEsMHgzYywweDAxLDB4N2YsMHhmZiwKKzB4MzQsMHgyMSwweGZmLDB4ZmYsMHgwMSwweDAxLDB4NTAsMHgyNCwweDAwLDB4MDksMHg0OCwweDQwLDB4MzUsMHgyOSwweDAwLDB4MDEsCisweDAxLDB4MmEsMHgxMCwweDJiLDB4MTQsMHg0MCwweGZmLDB4ZmMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MGEsMHg4MCwweDAxLAorMHgyNSwweDRhLDB4MDAsMHgwMCwweDNjLDB4MDEsMHg3ZiwweGZmLDB4MzQsMHgyMSwweGZmLDB4ZmYsMHgwMSwweDQxLDB4NTAsMHgyNCwKKzB4M2MsMHgwOSwweDAwLDB4MDEsMHgzNSwweDI5LDB4N2YsMHhmZiwweDRjLDB4OGEsMHgyMCwweDAwLDB4NGMsMHg4OSwweDI4LDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDgsMHgwNCwweDEwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDQwLDB4ODgsMHhhMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4M2MsMHgwOCwweGJmLDB4YzAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhkLDB4MDksMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MGEsMHhiZiwweGMwLDB4MjUsMHg0YSwweDAxLDB4MjAsMHgzYywweDBiLDB4YjAsMHgwMywweGFkLDB4NmEsMHgwMCwweDIwLAorMHgzYywweDA4LDB4YjAsMHgwMywweDhkLDB4MDksMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzNSwweDI5LDB4MDAsMHgxMCwKKzB4YWQsMHgwOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDgsMHg4MCwweDAwLDB4MjUsMHgwOCwweDRiLDB4ODQsCisweDAxLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsfTsKKwordTggcnRsODE5MF9md21haW5fYXJyYXlbXSA9IHsKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg0MCwweDA0LDB4NjgsMHgwMCwweDQwLDB4MDUsMHg3MCwweDAwLDB4NDAsMHgwNiwweDQwLDB4MDAsMHgwYywweDAwLDB4MTIsMHg5NCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwweDFhLDB4NjgsMHgwMCwweDMzLDB4NWIsMHgwMCwweDNjLDB4MTcsMHg2MCwweDAwLDB4MDksCisweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgxYiwweDYwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4NWIsMHhkMCwweDI0LAorMHg0MCwweDFhLDB4NzAsMHgwMCwweDAzLDB4NDAsMHgwMCwweDA4LDB4NDIsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4ZmYsMHhmZiwweDM0LDB4NDIsMHhmZiwweGZmLDB4OGMsMHg0MywweDAwLDB4MDAsCisweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgzNCwweDYzLDB4MDAsMHgyMCwweDI0LDB4NDIsMHgwMCwweGQwLAorMHhhYywweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyMCwweDIxLDB4MjcsMHg4NSwweDhiLDB4NjAsMHgwMCwweDg1LDB4MTgsMHgyMSwKKzB4MjQsMHg4NCwweDAwLDB4MDEsMHgyOCwweDgyLDB4MDAsMHgwYSwweDE0LDB4NDAsMHhmZiwweGZjLDB4YTAsMHg2MCwweDAwLDB4MDAsCisweDI3LDB4ODIsMHg4YiwweDZhLDB4MjQsMHgwNCwweDAwLDB4MDYsMHgyNCwweDg0LDB4ZmYsMHhmZiwweGE0LDB4NDAsMHgwMCwweDAwLAorMHgwNCwweDgxLDB4ZmYsMHhmZCwweDI0LDB4NDIsMHgwMCwweDAyLDB4MjQsMHgwMiwweDAwLDB4MDMsMHhhMywweDgyLDB4OGIsMHg2MCwKKzB4MjQsMHgwMiwweDA5LDB4YzQsMHgyNCwweDAzLDB4MDEsMHgwMCwweGE3LDB4ODIsMHg4YiwweDc2LDB4MjQsMHgwMiwweDA0LDB4MDAsCisweGFmLDB4ODMsMHg4YiwweDc4LDB4YWYsMHg4MiwweDhiLDB4N2MsMHgyNCwweDAzLDB4MDAsMHgwYSwweDI0LDB4MDIsMHgwMCwweDA0LAorMHgyNCwweDA1LDB4MDAsMHgwMiwweDI0LDB4MDQsMHgwMCwweDAxLDB4YTMsMHg4MywweDhiLDB4NjIsMHhhMywweDgyLDB4OGIsMHg2OCwKKzB4MjQsMHgwMywweDAwLDB4MDEsMHgyNCwweDAyLDB4MDIsMHgwMCwweGEzLDB4ODQsMHg4YiwweDY2LDB4YTMsMHg4NSwweDhiLDB4NjksCisweGE3LDB4ODIsMHg4YiwweDZhLDB4YTcsMHg4MywweDhiLDB4NmMsMHhhMywweDg0LDB4OGIsMHg2MSwweGEzLDB4ODAsMHg4YiwweDYzLAorMHhhMywweDgwLDB4OGIsMHg2NCwweGEzLDB4ODAsMHg4YiwweDY1LDB4YTMsMHg4NSwweDhiLDB4NjcsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MjQsMHg0MiwweDAxLDB4ODQsCisweDM0LDB4NjMsMHgwMCwweDIwLDB4YWMsMHg2MiwweDAwLDB4MDAsMHgyNywweDg0LDB4OGIsMHg4OCwweDAwLDB4MDAsMHgxMCwweDIxLAorMHgyNCwweDQyLDB4MDAsMHgwMSwweDAwLDB4MDIsMHgxNiwweDAwLDB4MDAsMHgwMiwweDE2LDB4MDMsMHgyOCwweDQzLDB4MDAsMHgwMywKKzB4YWMsMHg4MCwweGZmLDB4ZmMsMHhhMCwweDgwLDB4MDAsMHgwMCwweDE0LDB4NjAsMHhmZiwweGY5LDB4MjQsMHg4NCwweDAwLDB4MGMsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLAorMHgzNCwweDYzLDB4MDAsMHgyMCwweDI0LDB4NDIsMHgwMSwweGM4LDB4M2MsMHgwOCwweGIwLDB4MDMsMHhhYywweDYyLDB4MDAsMHgwMCwKKzB4MzUsMHgwOCwweDAwLDB4NzAsMHg4ZCwweDAyLDB4MDAsMHgwMCwweDAwLDB4YTAsMHg0OCwweDIxLDB4MDAsMHgwNCwweDI2LDB4MDAsCisweDAwLDB4MDIsMHgyYSwweDQzLDB4MDAsMHgwNiwweDM2LDB4MDAsMHgwMCwweDA3LDB4M2UsMHgwMCwweDAwLDB4MDIsMHgxMiwweDAzLAorMHgyOSwweDIzLDB4MDAsMHgwMywweDAwLDB4MDQsMHg1NiwweDAzLDB4MDAsMHgwNiwweDM2LDB4MDMsMHgwMCwweDA3LDB4M2UsMHgwMywKKzB4MzAsMHg0OCwweDAwLDB4MDEsMHgxMCwweDYwLDB4MDAsMHgxMSwweDMwLDB4YTUsMHgwMCwweDA3LDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDAwLDB4NDksMHgxMCwweDIzLDB4MDAsMHg0NSwweDEwLDB4MDcsMHgzMCwweDQyLDB4MDAsMHgwMSwweDEwLDB4NDAsMHgwMCwweDY2LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YTIsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MjEsMHg0MywKKzB4MTEsMHgwMCwweDAwLDB4MTAsMHgwMCwweDA3LDB4MjAsMHgwYiwweDE1LDB4MjAsMHgwMCwweDA2LDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDNjLDB4MDIsMHhiMCwweDA1LDB4MzQsMHg0MiwweDAxLDB4MjAsMHhhNCwweDQ0LDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDExLDB4MjIsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwNSwKKzB4MDgsMHgwMCwweDAwLDB4OTYsMHgzNCwweDQyLDB4MDEsMHgyNCwweDNjLDB4MDIsMHhiMCwweDA1LDB4MDgsMHgwMCwweDAwLDB4OTYsCisweDM0LDB4NDIsMHgwMSwweDIyLDB4MTUsMHgyMCwweDAwLDB4NTQsMHgyNCwweDAyLDB4MDAsMHgwMSwweDNjLDB4MDIsMHhiMCwweDAzLAorMHgzNCwweDQyLDB4MDAsMHg3NCwweDkwLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhZiwweDgzLDB4OGIsMHg4NCwKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDAsMHg3MCwweDkwLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NmIsMHgwMCwweDA4LDB4MTEsMHg2MCwweDAwLDB4MTgsMHgwMCwweDA5LDB4MjgsMHg0MCwweDAwLDB4MDAsMHg0MCwweDIxLAorMHgyNywweDg1LDB4OGIsMHg4MCwweDhjLDB4YTMsMHgwMCwweDAwLDB4OGMsMHhhMiwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHg2MiwweDM4LDB4MjMsMHgwMCwweDQzLDB4MTAsMHgyYSwweDEwLDB4NDAsMHgwMCwweDNkLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweGFjLDB4YTcsMHgwMCwweDAwLDB4MjUsMHgwMiwweDAwLDB4MDEsMHgwMCwweDAyLDB4MTYsMHgwMCwweDAwLDB4MDIsMHg0NiwweDAzLAorMHgyOSwweDAzLDB4MDAsMHgwMywweDE0LDB4NjAsMHhmZiwweGYzLDB4MjQsMHhhNSwweDAwLDB4MGMsMHgzYywweDAzLDB4YjAsMHgwMywKKzB4MzQsMHg2MywweDAwLDB4NzAsMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0YiwweDEwLDB4MjMsCisweGEwLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwOSwweDI4LDB4NDAsMHgwMCwweGE5LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgyNywweDgzLDB4OGIsMHg4OCwweDAwLDB4MGEsMHgyMCwweDBiLDB4MDAsMHg0MywweDE4LDB4MjEsMHgxMCwweGMwLDB4MDAsMHgwNSwKKzB4MDAsMHgwMCwweDM4LDB4MjEsMHg4MCwweDYyLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MDUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDAzLAorMHgwMCwweGE5LDB4MTAsMHgyMSwweDI0LDB4MDcsMHgwMCwweDAxLDB4MDAsMHhhOSwweDEwLDB4MjEsMHgwMCwweDAyLDB4MzAsMHg4MCwKKzB4MjcsMHg4MiwweDhiLDB4ODgsMHhhMCwweDY3LDB4MDAsMHgwMSwweDAwLDB4YzIsMHgzOCwweDIxLDB4ODAsMHhlMywweDAwLDB4MDEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg2MCwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODMsMHg4YiwweDgwLAorMHgwMCwweGMzLDB4MTgsMHgyMSwweDhjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ0LDB4MTAsMHgyMSwKKzB4YWMsMHg2MiwweDAwLDB4MDAsMHgyNywweDg1LDB4OGIsMHg4NCwweDI3LDB4ODIsMHg4YiwweDgwLDB4MDAsMHhjNSwweDI4LDB4MjEsCisweDAwLDB4YzIsMHgxMCwweDIxLDB4OGMsMHg0MywweDAwLDB4MDAsMHg4YywweGE0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDY0LDB4MTgsMHgyYSwweDE0LDB4NjAsMHgwMCwweDAzLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4YTAsMHhlMiwweDAwLDB4MDAsMHhhMCwweGUwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgwMCwweGI5LDB4YWMsMHhhMCwweDAwLDB4MDAsMHgxMSwweDIyLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMCwweDdjLDB4OTAsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4YWYsMHg4MywweDhiLDB4OWMsMHgwOCwweDAwLDB4MDAsMHhhOSwweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDM0LDB4NDIsMHgwMCwweDc4LDB4OTAsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGFmLDB4ODMsMHg4YiwweDkwLAorMHgwOCwweDAwLDB4MDAsMHhhOSwweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwKKzB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4MDQsMHgxOCwweDNjLDB4MDUsMHhiMCwweDAzLDB4YWMsMHg2MiwweDAwLDB4MDAsCisweDM0LDB4YTUsMHgwMCwweDcwLDB4OGMsMHhhMiwweDAwLDB4MDAsMHg5MCwweDg0LDB4MDAsMHgwOCwweDNjLDB4MDYsMHhiMCwweDAzLAorMHgwMCwweDAyLDB4MTYsMHgwMCwweDJjLDB4ODMsMHgwMCwweDAzLDB4MzQsMHhjNiwweDAwLDB4NzIsMHgyNCwweDA3LDB4MDAsMHgwMSwKKzB4MTAsMHg2MCwweDAwLDB4MTEsMHgwMCwweDAyLDB4MmYsMHhjMiwweDkwLDB4YzIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MjEsCisweDAwLDB4MDIsMHgxNiwweDAwLDB4MTAsMHhhNywweDAwLDB4MDksMHgwMCwweDAyLDB4MTYsMHgwMywweDE0LDB4ODAsMHgwMCwweDBjLAorMHgzMCwweDQzLDB4MDAsMHgwMywweDgzLDB4ODIsMHg4YiwweDg4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTAsMHg4MCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTYsMHgwMCwweDAwLDB4MDIsMHgxZSwweDAzLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDM0LDB4NDIsMHgwMCwweDcyLDB4YTAsMHg0MywweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDQ1LDB4MDAsMHgwNSwweDEwLDB4ODcsMHgwMCwweDA0LDB4MzAsMHg0MywweDAwLDB4MDYsMHg5MywweDgyLDB4OGIsMHhhMCwKKzB4MDgsMHgwMCwweDAxLDB4MjEsMHgwMCwweDQzLDB4MTAsMHgyMSwweDgzLDB4ODIsMHg4YiwweDk0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDIsMHgxMCwweDQwLDB4MDgsMHgwMCwweDAxLDB4MjEsMHgwMCwweDQ1LDB4MTAsMHgyMSwweDEwLDB4ODAsMHgwMCwweDA1LAorMHgwMCwweDAwLDB4MTgsMHgyMSwweDI0LDB4NjMsMHgwMCwweDAxLDB4MDAsMHg2NCwweDEwLDB4MmIsMHgxNCwweDQwLDB4ZmYsMHhmZCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDMsCisweDNjLDB4MDIsMHg4MCwweDAwLDB4MjQsMHg0MiwweDA0LDB4ZWMsMHgzYywweDA0LDB4YjAsMHgwMiwweDM0LDB4NjMsMHgwMCwweDIwLAorMHhhYywweDYyLDB4MDAsMHgwMCwweDM0LDB4ODQsMHgwMCwweDA4LDB4MjQsMHgwMiwweDAwLDB4MDEsMHhhZiwweDg0LDB4OGIsMHhiMCwKKzB4YTMsMHg4MiwweDhiLDB4YzAsMHhhNywweDgwLDB4OGIsMHhiNCwweGE3LDB4ODAsMHg4YiwweGI2LDB4YWYsMHg4MCwweDhiLDB4YjgsCisweGFmLDB4ODAsMHg4YiwweGJjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLAorMHgzYywweDAyLDB4ODAsMHgwMCwweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDA1LDB4MmMsMHgzYywweDA0LDB4YjAsMHgwMywKKzB4YWMsMHg2MiwweDAwLDB4MDAsMHgzNCwweDg0LDB4MDAsMHhhYywweDgwLDB4YTIsMHgwMCwweDE1LDB4OGMsMHg4MywweDAwLDB4MDAsCisweDI3LDB4YmQsMHhmZiwweGYwLDB4MDAsMHg0MywweDEwLDB4MjEsMHhhYywweDgyLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgxMCwweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMywweDgwLDB4MDAsMHgzNCwweDQyLDB4MDAsMHgyMCwKKzB4MjQsMHg2MywweDA1LDB4NjQsMHgyNywweGJkLDB4ZmYsMHhlMCwweGFjLDB4NDMsMHgwMCwweDAwLDB4YWYsMHhiMSwweDAwLDB4MTQsCisweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MTgsMHg4ZiwweDkwLDB4OGIsMHhiMCwweDBjLDB4MDAsMHgwMiwweDlhLAorMHgwMCwweDgwLDB4ODgsMHgyMSwweDE0LDB4NDAsMHgwMCwweDJhLDB4M2MsMHgwMiwweDAwLDB4ODAsMHgxNiwweDIwLDB4MDAsMHgwMiwKKzB4MzQsMHg0MiwweDAyLDB4MDEsMHgyNCwweDAyLDB4MDIsMHgwMSwweGFlLDB4MDIsMHgwMCwweDAwLDB4OTcsMHg4NCwweDhiLDB4YjQsCisweDk3LDB4ODIsMHg4YiwweGI2LDB4M2MsMHgwMywweGIwLDB4MDIsMHgwMCwweDgzLDB4MjAsMHgyMSwweDI0LDB4NDIsMHgwMCwweDA0LAorMHhhNywweDgyLDB4OGIsMHhiNiwweGE0LDB4ODIsMHgwMCwweDAwLDB4OGYsMHg4NCwweDhiLDB4YjgsMHg4ZiwweDgyLDB4OGIsMHhiMCwKKzB4OTMsMHg4NSwweDhiLDB4NjIsMHgyNCwweDg0LDB4MDAsMHgwMSwweDI0LDB4NDIsMHgwMCwweDA0LDB4MjQsMHgwMywweDhmLDB4ZmYsCisweDNjLDB4MDcsMHhiMCwweDA2LDB4M2MsMHgwNiwweGIwLDB4MDMsMHgwMCwweDQzLDB4MTAsMHgyNCwweDAwLDB4ODUsMHgyOCwweDJhLAorMHgzNCwweGU3LDB4ODAsMHgxOCwweGFmLDB4ODIsMHg4YiwweGIwLDB4YWYsMHg4NCwweDhiLDB4YjgsMHgxMCwweGEwLDB4MDAsMHgwOCwKKzB4MzQsMHhjNiwweDAxLDB4MDgsMHg4ZiwweDgzLDB4OGIsMHhiYywweDhmLDB4ODQsMHg4YiwweDdjLDB4OGMsMHhjMiwweDAwLDB4MDAsCisweDAwLDB4NjQsMHgxOCwweDIxLDB4MDAsMHg0MywweDEwLDB4MmIsMHgxNCwweDQwLDB4MDAsMHgwOSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4YywweGUyLDB4MDAsMHgwMCwweDNjLDB4MDMsMHgwZiwweDAwLDB4M2MsMHgwNCwweDA0LDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyNCwKKzB4MTAsMHg0NCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgwNCwweDk4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhmLDB4YmYsMHgwMCwweDE4LDB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDIwLAorMHgyNywweGJkLDB4ZmYsMHhkOCwweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMywweDgwLDB4MDAsMHgyNCwweDYzLDB4MDYsMHg1MCwKKzB4YWYsMHhiMCwweDAwLDB4MTAsMHgzNCwweDQyLDB4MDAsMHgyMCwweDhmLDB4OTAsMHg4YiwweGIwLDB4YWMsMHg0MywweDAwLDB4MDAsCisweGFmLDB4YjMsMHgwMCwweDFjLDB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4YmYsMHgwMCwweDIwLAorMHgwMCwweDgwLDB4ODgsMHgyMSwweDAwLDB4YTAsMHg5MCwweDIxLDB4MGMsMHgwMCwweDAyLDB4OWEsMHgwMCwweGMwLDB4OTgsMHgyMSwKKzB4MjQsMHgwNywweDhmLDB4ZmYsMHgxNCwweDQwLDB4MDAsMHgxOSwweDI2LDB4MDMsMHgwMCwweDA0LDB4MjQsMHgwMiwweDBlLDB4MDMsCisweGFlLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2NywweDgwLDB4MjQsMHgyNiwweDAyLDB4MDAsMHgwNCwweGFlLDB4MTEsMHgwMCwweDAwLAorMHgwMCwweDQ3LDB4ODAsMHgyNCwweDk3LDB4ODYsMHg4YiwweGI0LDB4MjYsMHgwMywweDAwLDB4MDQsMHhhZSwweDEyLDB4MDAsMHgwMCwKKzB4MDAsMHg2NywweDgwLDB4MjQsMHhhZSwweDEzLDB4MDAsMHgwMCwweDhmLDB4ODQsMHg4YiwweGIwLDB4M2MsMHgwMiwweGIwLDB4MDIsCisweDk3LDB4ODUsMHg4YiwweGI2LDB4MDAsMHhjMiwweDMwLDB4MjEsMHg4ZiwweDgyLDB4OGIsMHhiOCwweDI0LDB4ODQsMHgwMCwweDEwLAorMHgyNCwweGE1LDB4MDAsMHgxMCwweDAwLDB4ODcsMHgyMCwweDI0LDB4MjQsMHg0MiwweDAwLDB4MDEsMHhhNywweDg1LDB4OGIsMHhiNiwKKzB4YWYsMHg4NCwweDhiLDB4YjAsMHhhZiwweDgyLDB4OGIsMHhiOCwweGE0LDB4YzUsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MjAsCisweDdiLDB4YjIsMHgwMCwweGZjLDB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDI4LAorMHgyNywweGJkLDB4ZmYsMHhlOCwweGFmLDB4YmYsMHgwMCwweDEwLDB4OTQsMHg4MiwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweGUwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgxNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHg4MiwweDAwLDB4MDIsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmMsMHgwMCwweDgyLDB4MjgsMHgyMSwweDhjLDB4YTQsMHgwMCwweDAwLAorMHgzYywweDAyLDB4MDAsMHg3MCwweDhjLDB4YTYsMHgwMCwweDA4LDB4MDAsMHg4MiwweDEwLDB4MjEsMHgyYywweDQzLDB4MDAsMHgwNiwKKzB4MTAsMHg2MCwweDAwLDB4MDksMHgzYywweDAzLDB4ODAsMHgwMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MjQsMHg2MywweDAxLDB4ZTgsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweGFmLDB4ODYsMHg4MCwweDE0LDB4OGYsMHhiZiwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxOCwweDhjLDB4YTQsMHgwMCwweDAwLDB4MGMsMHgwMCwweDE3LDB4YjMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAxLDB4ZGUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgyNCwweGFhLAorMHgwMCwweGMwLDB4MjAsMHgyMSwweDA4LDB4MDAsMHgwMSwweGRlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4MzQsMHg0MiwweDAxLDB4MDgsMHg4YywweDQ0LDB4MDAsMHgwMCwweDhmLDB4ODIsMHg4MCwweDE4LDB4M2MsMHgwMywweDAwLDB4MGYsCisweDM0LDB4NjMsMHg0MiwweDQwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDgyLDB4MjAsMHgyYiwweDEwLDB4ODAsMHgwMCwweDA5LAorMHgyNCwweDAzLDB4MDAsMHgwNSwweDhmLDB4ODIsMHg4MywweDMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHgwMSwKKzB4YWYsMHg4MiwweDgzLDB4MzAsMHgxMCwweDQzLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDMsMHg4YywweDYzLDB4MDEsMHgwOCwweDI0LDB4MDIsMHgwMCwweDAxLAorMHhhMywweDgyLDB4ODAsMHgxMSwweGFmLDB4ODAsMHg4MywweDMwLDB4YWYsMHg4MywweDgwLDB4MTgsMHgwOCwweDAwLDB4MDEsMHhmYiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDg0LDB4MDAsMHhmZiwweDE0LDB4ODAsMHgwMCwweDJmLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhmLDB4ODIsMHg4MCwweDE0LDB4YTMsMHg4NSwweDgzLDB4NjMsMHgxMCwweDQwLDB4MDAsMHgyYiwweDJjLDB4YTIsMHgwMCwweDA0LAorMHgxNCwweDQwLDB4MDAsMHgwNiwweDAwLDB4MDUsMHgxMCwweDQwLDB4MjQsMHhhMiwweGZmLDB4ZmMsMHgyYywweDQyLDB4MDAsMHgwOCwKKzB4MTAsMHg0MCwweDAwLDB4MDksMHgyNCwweGEyLDB4ZmYsMHhmMCwweDAwLDB4MDUsMHgxMCwweDQwLDB4MjcsMHg4NCwweDgzLDB4NmMsCisweDAwLDB4NDQsMHgxMCwweDIxLDB4OTQsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NjMsMHgwMCwweDAxLAorMHgwMywweGUwLDB4MDAsMHgwOCwweGE0LDB4NDMsMHgwMCwweDAwLDB4MmMsMHg0MiwweDAwLDB4MTAsMHgxNCwweDQwLDB4MDAsMHgwYSwKKzB4MDAsMHgwNSwweDEwLDB4NDAsMHgyNCwweGEyLDB4ZmYsMHhlMCwweDJjLDB4NDIsMHgwMCwweDEwLDB4MTQsMHg0MCwweDAwLDB4MDYsCisweDAwLDB4MDUsMHgxMCwweDQwLDB4MjQsMHhhMiwweGZmLDB4ZDAsMHgyYywweDQyLDB4MDAsMHgxMCwweDEwLDB4NDAsMHgwMCwweDA5LAorMHgyNCwweGEyLDB4ZmYsMHhjMCwweDAwLDB4MDUsMHgxMCwweDQwLDB4MjcsMHg4NCwweDgzLDB4NmMsMHgwMCwweDQ0LDB4MTAsMHgyMSwKKzB4OTQsMHg0MywweGZmLDB4ZjgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NjMsMHgwMCwweDAxLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGE0LDB4NDMsMHhmZiwweGY4LDB4MmMsMHg0MiwweDAwLDB4MTAsMHgxMCwweDQwLDB4MDAsMHgwNywweDAwLDB4MDUsMHgxMCwweDQwLAorMHgyNywweDg0LDB4ODMsMHg2YywweDAwLDB4NDQsMHgxMCwweDIxLDB4OTQsMHg0MywweGZmLDB4ZjgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHg2MywweDAwLDB4MDEsMHhhNCwweDQzLDB4ZmYsMHhmOCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhmLDB4ODYsMHg4YiwweGIwLDB4OGYsMHg4MiwweDgwLDB4MTQsMHgyNywweGJkLDB4ZmYsMHhlOCwweGFmLDB4YmYsMHgwMCwweDEwLAorMHgxMCwweDQwLDB4MDAsMHgyYSwweDAwLDB4YzAsMHgzOCwweDIxLDB4MjQsMHgwMiwweDAwLDB4MDcsMHgyNCwweDAzLDB4ZmYsMHg5YywKKzB4YTMsMHg4MiwweDgzLDB4NmIsMHhhMywweDgzLDB4ODMsMHg2YSwweDI3LDB4OGEsMHg4MywweDY4LDB4MDAsMHgwMCwweDIwLDB4MjEsCisweDI0LDB4MDksMHg4ZiwweGZmLDB4MDAsMHgwNCwweDEwLDB4ODAsMHgwMCwweDRhLDB4MjgsMHgyMSwweDhjLDB4YTIsMHgwMCwweDAwLAorMHgyNCwweGUzLDB4MDAsMHgwNCwweDI0LDB4ODgsMHgwMCwweDAxLDB4YWMsMHhlMiwweDAwLDB4MDAsMHgxMCwweDgwLDB4MDAsMHgwMiwKKzB4MDAsMHg2OSwweDM4LDB4MjQsMHhhYywweGEwLDB4MDAsMHgwMCwweDMxLDB4MDQsMHgwMCwweGZmLDB4MmMsMHg4MiwweDAwLDB4MjcsCisweDE0LDB4NDAsMHhmZiwweGY1LDB4MDAsMHgwNCwweDEwLDB4ODAsMHg5NywweDgzLDB4OGIsMHhiNiwweDk3LDB4ODUsMHg4YiwweGI0LAorMHgzYywweDAyLDB4YjAsMHgwMiwweDI0LDB4NjMsMHgwMCwweDljLDB4MDAsMHhhMiwweDI4LDB4MjEsMHgzYywweDA0LDB4YjAsMHgwNiwKKzB4YTcsMHg4MywweDhiLDB4YjYsMHgzNCwweDg0LDB4ODAsMHgxOCwweGE0LDB4YTMsMHgwMCwweDAwLDB4OGMsMHg4NSwweDAwLDB4MDAsCisweDI0LDB4MDIsMHg4ZiwweGZmLDB4MjQsMHhjNiwweDAwLDB4OWMsMHgzYywweDAzLDB4MGYsMHgwMCwweDAwLDB4YzIsMHgzMCwweDI0LAorMHgwMCwweGEzLDB4MjgsMHgyNCwweDNjLDB4MDIsMHgwNCwweDAwLDB4YWYsMHg4NiwweDhiLDB4YjAsMHgxMCwweGEyLDB4MDAsMHgwMywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MDQsMHg5OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MTAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxOCwweDhmLDB4ODYsMHg4YiwweGIwLAorMHgyNywweGJkLDB4ZmYsMHhjOCwweDI0LDB4MDIsMHgwMCwweDA4LDB4MjQsMHgwMywweDAwLDB4MjAsMHhhZiwweGJmLDB4MDAsMHgzMCwKKzB4YTMsMHhhMiwweDAwLDB4MTMsMHhhMywweGEzLDB4MDAsMHgxMiwweGE3LDB4YTQsMHgwMCwweDEwLDB4MDAsMHhjMCwweDI4LDB4MjEsCisweDI3LDB4YTksMHgwMCwweDEwLDB4MDAsMHgwMCwweDM4LDB4MjEsMHgyNCwweDA4LDB4OGYsMHhmZiwweDAwLDB4MDcsMHgxMCwweDgwLAorMHgwMCwweDQ5LDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDAwLDB4MjQsMHhlMywweDAwLDB4MDEsMHgzMCwweDY3LDB4MDAsMHhmZiwKKzB4MjQsMHhhMiwweDAwLDB4MDQsMHgyYywweGUzLDB4MDAsMHgwOCwweGFjLDB4YTQsMHgwMCwweDAwLDB4MTQsMHg2MCwweGZmLDB4ZjcsCisweDAwLDB4NDgsMHgyOCwweDI0LDB4OTcsMHg4MywweDhiLDB4YjYsMHg5NywweDg1LDB4OGIsMHhiNCwweDNjLDB4MDIsMHhiMCwweDAyLAorMHgyNCwweDYzLDB4MDAsMHgyMCwweDAwLDB4YTIsMHgyOCwweDIxLDB4M2MsMHgwNCwweGIwLDB4MDYsMHhhNywweDgzLDB4OGIsMHhiNiwKKzB4MzQsMHg4NCwweDgwLDB4MTgsMHhhNCwweGEzLDB4MDAsMHgwMCwweDhjLDB4ODUsMHgwMCwweDAwLDB4MjQsMHgwMiwweDhmLDB4ZmYsCisweDI0LDB4YzYsMHgwMCwweDIwLDB4M2MsMHgwMywweDBmLDB4MDAsMHgwMCwweGMyLDB4MzAsMHgyNCwweDAwLDB4YTMsMHgyOCwweDI0LAorMHgzYywweDAyLDB4MDQsMHgwMCwweGFmLDB4ODYsMHg4YiwweGIwLDB4MTAsMHhhMiwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MGMsMHgwMCwweDA0LDB4OTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YmYsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MzgsMHg5MywweDgyLDB4OGIsMHhjMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMCwweDQwLDB4MDAsMHgxMSwweDI0LDB4MDYsMHgwMCwweDAxLDB4OGYsMHg4MiwweDhiLDB4YjgsMHgzYywweDA1LDB4YjAsMHgwNiwKKzB4M2MsMHgwNCwweGIwLDB4MDMsMHgzNCwweGE1LDB4ODAsMHgxOCwweDM0LDB4ODQsMHgwMSwweDA4LDB4MTQsMHg0MCwweDAwLDB4MDksCisweDAwLDB4MDAsMHgzMCwweDIxLDB4OTcsMHg4MiwweDhiLDB4YjQsMHg4YywweDg0LDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAyLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweGFmLDB4ODQsMHg4YiwweGJjLDB4YTcsMHg4MCwweDhiLDB4YjYsMHhhYywweDQwLDB4MDAsMHgwMCwKKzB4YWMsMHg0MCwweDAwLDB4MDQsMHg4YywweGEyLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHhjMCwweDEwLDB4MjEsCisweDhmLDB4ODYsMHg4YiwweGIwLDB4OGYsMHg4MiwweDhiLDB4YjgsMHgyNywweGJkLDB4ZmYsMHhlOCwweGFmLDB4YmYsMHgwMCwweDEwLAorMHgwMCwweGMwLDB4NDAsMHgyMSwweDE0LDB4NDAsMHgwMCwweDBhLDB4MDAsMHg0MCwweDUwLDB4MjEsMHgwMCwweDAwLDB4MzgsMHgyMSwKKzB4MjcsMHg4OSwweDgzLDB4MzgsMHgyNCwweGUyLDB4MDAsMHgwMSwweDAwLDB4MDcsMHgxOCwweDgwLDB4MzAsMHg0NywweDAwLDB4ZmYsCisweDAwLDB4NjksMHgxOCwweDIxLDB4MmMsMHhlMiwweDAwLDB4MGEsMHgxNCwweDQwLDB4ZmYsMHhmYSwweGFjLDB4NjAsMHgwMCwweDAwLAorMHgzYywweDAyLDB4MDAsMHg4MCwweDEwLDB4ODIsMHgwMCwweDZmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NywweDgyLDB4ODMsMHgzZSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHgwMSwweGE3LDB4ODIsMHg4MywweDNlLDB4OTAsMHhhMywweDAwLDB4MTUsCisweDk3LDB4ODIsMHg4MywweDQwLDB4MDAsMHgwMywweDFlLDB4MDAsMHgwMCwweDAzLDB4MWUsMHgwMywweDAwLDB4NDMsMHgxMCwweDIxLAorMHhhNywweDgyLDB4ODMsMHg0MCwweDhjLDB4YTQsMHgwMCwweDIwLDB4M2MsMHgwMiwweDAwLDB4NjAsMHgzYywweDAzLDB4MDAsMHgyMCwKKzB4MDAsMHg4MiwweDIwLDB4MjQsMHgxMCwweDgzLDB4MDAsMHg1NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg4MCwweDAwLDB4NDcsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTcsMHg4MiwweDgzLDB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDAxLAorMHhhNywweDgyLDB4ODMsMHg0NCwweDg0LDB4YTMsMHgwMCwweDA2LDB4OGYsMHg4MiwweDgzLDB4NTQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHhhZiwweDgyLDB4ODMsMHg1NCwweDI1LDB4NDIsMHgwMCwweDAxLDB4MjgsMHg0MywweDI3LDB4MTAsCisweGFmLDB4ODIsMHg4YiwweGI4LDB4MTAsMHg2MCwweDAwLDB4MDksMHgyNCwweDAyLDB4MDAsMHgwNCwweDkzLDB4ODMsMHg4MCwweDExLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4NjIsMHgwMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MDQsMHg4ZiwweGJmLDB4MDAsMHgxMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDE4LDB4MjQsMHgwMywweDAwLDB4MjgsCisweGEzLDB4ODMsMHg4MywweDNhLDB4YTMsMHg4MiwweDgzLDB4M2IsMHg5MCwweGEyLDB4MDAsMHgxOCwweDkzLDB4ODMsMHg4MywweDYzLAorMHgwMCwweDAwLDB4MzgsMHgyMSwweDAwLDB4MDIsMHgxNiwweDAwLDB4MDAsMHgwMiwweDE2LDB4MDMsMHhhNywweDgyLDB4ODMsMHg0ZSwKKzB4YTMsMHg4MywweDgzLDB4NWMsMHgyNywweDg5LDB4ODMsMHgzOCwweDI0LDB4MDUsMHg4ZiwweGZmLDB4MDAsMHgwNywweDEwLDB4ODAsCisweDAwLDB4NDksMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MDAsMHgyNCwweGUzLDB4MDAsMHgwMSwweDMwLDB4NjcsMHgwMCwweGZmLAorMHgyNSwweDAyLDB4MDAsMHgwNCwweDJjLDB4ZTMsMHgwMCwweDBhLDB4YWQsMHgwNCwweDAwLDB4MDAsMHgxNCwweDYwLDB4ZmYsMHhmNywKKzB4MDAsMHg0NSwweDQwLDB4MjQsMHg5NywweDgzLDB4OGIsMHhiNiwweDk3LDB4ODUsMHg4YiwweGI0LDB4M2MsMHgwMiwweGIwLDB4MDIsCisweDI0LDB4NjMsMHgwMCwweDI4LDB4MDAsMHhhMiwweDI4LDB4MjEsMHgzYywweDA0LDB4YjAsMHgwNiwweGE3LDB4ODMsMHg4YiwweGI2LAorMHgzNCwweDg0LDB4ODAsMHgxOCwweGE0LDB4YTMsMHgwMCwweDAwLDB4OGMsMHg4NSwweDAwLDB4MDAsMHgyNCwweDAyLDB4OGYsMHhmZiwKKzB4MjQsMHhjNiwweDAwLDB4MjgsMHgzYywweDAzLDB4MGYsMHgwMCwweDAwLDB4YzIsMHgzMCwweDI0LDB4MDAsMHhhMywweDI4LDB4MjQsCisweDNjLDB4MDIsMHgwNCwweDAwLDB4YWYsMHg4NiwweDhiLDB4YjAsMHgxMCwweGEyLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwYywweDAwLDB4MDQsMHg5OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDAyLDB4MzgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4YTMsMHg4MCwweDgwLDB4MTEsMHgwOCwweDAwLDB4MDIsMHhlNywweDAwLDB4MDAsMHgwMCwweDAwLDB4OTcsMHg4MiwweDgzLDB4NDYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4MDEsMHhhNywweDgyLDB4ODMsMHg0NiwweDg0LDB4YTMsMHgwMCwweDA2LAorMHg4ZiwweDgyLDB4ODMsMHg1OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MywweDEwLDB4MjEsMHhhZiwweDgyLDB4ODMsMHg1OCwKKzB4MDgsMHgwMCwweDAyLDB4ZGYsMHgyNSwweDQyLDB4MDAsMHgwMSwweDk3LDB4ODIsMHg4MywweDQyLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4NDIsMHgwMCwweDAxLDB4YTcsMHg4MiwweDgzLDB4NDIsMHg4NCwweGEzLDB4MDAsMHgwNiwweDhmLDB4ODIsMHg4MywweDUwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4YWYsMHg4MiwweDgzLDB4NTAsMHgwOCwweDAwLDB4MDIsMHhkZiwKKzB4MjUsMHg0MiwweDAwLDB4MDEsMHg5NywweDgyLDB4ODMsMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4MDEsCisweGE3LDB4ODIsMHg4MywweDNjLDB4MDgsMHgwMCwweDAyLDB4YzcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGQwLAorMHhhZiwweGJmLDB4MDAsMHgyOCwweDhjLDB4YTMsMHgwMCwweDIwLDB4OGYsMHg4YSwweDhiLDB4YjAsMHgzYywweDAyLDB4MDAsMHgxMCwKKzB4MDAsMHg2MiwweDEwLDB4MjQsMHgwMCwweGEwLDB4MzgsMHgyMSwweDAxLDB4NDAsMHg0OCwweDIxLDB4MTAsMHg0MCwweDAwLDB4M2QsCisweDAwLDB4ODAsMHgyOCwweDIxLDB4OGMsMHhlNCwweDAwLDB4MWMsMHgzNCwweGE1LDB4MTIsMHgwNiwweGFmLDB4YTUsMHgwMCwweDEwLAorMHg4YywweDgyLDB4MDAsMHgwOCwweDAwLDB4MDMsMHgxYywweDQyLDB4MzAsMHg2MywweDAwLDB4MzAsMHgwMCwweDAyLDB4MTMsMHgwMiwKKzB4MzAsMHg0MiwweDAwLDB4NDAsMHgwMCwweDQzLDB4MTAsMHgyNSwweDkwLDB4ZTYsMHgwMCwweDEwLDB4OTAsMHhlNCwweDAwLDB4MTMsCisweDk0LDB4ZTgsMHgwMCwweDBjLDB4OTQsMHhlMywweDAwLDB4MWEsMHgwMCwweDAyLDB4MTYsMHgwMCwweDkwLDB4ZTcsMHgwMCwweDEyLAorMHgwMCwweGEyLDB4MjgsMHgyNSwweDI0LDB4MDIsMHgxMiwweDM0LDB4YTcsMHhhMiwweDAwLDB4MWMsMHgyNCwweDAyLDB4NTYsMHg3OCwKKzB4YWYsMHhhNSwweDAwLDB4MTAsMHhhMywweGE2LDB4MDAsMHgxOCwweGEzLDB4YTcsMHgwMCwweDFmLDB4YTcsMHhhMywweDAwLDB4MWEsCisweGEzLDB4YTQsMHgwMCwweDE5LDB4YTcsMHhhOCwweDAwLDB4MjAsMHhhNywweGEyLDB4MDAsMHgyMiwweDAwLDB4MDAsMHgyOCwweDIxLAorMHgyNywweGE3LDB4MDAsMHgxMCwweDI0LDB4MDYsMHg4ZiwweGZmLDB4MDAsMHgwNSwweDEwLDB4ODAsMHgwMCwweDQ3LDB4MTAsMHgyMSwKKzB4OGMsMHg0NCwweDAwLDB4MDAsMHgyNCwweGEzLDB4MDAsMHgwMSwweDMwLDB4NjUsMHgwMCwweGZmLDB4MjUsMHgyMiwweDAwLDB4MDQsCisweDJjLDB4YTMsMHgwMCwweDA1LDB4YWQsMHgyNCwweDAwLDB4MDAsMHgxNCwweDYwLDB4ZmYsMHhmNywweDAwLDB4NDYsMHg0OCwweDI0LAorMHg5NywweDgzLDB4OGIsMHhiNiwweDk3LDB4ODUsMHg4YiwweGI0LDB4M2MsMHgwMiwweGIwLDB4MDIsMHgyNCwweDYzLDB4MDAsMHgxNCwKKzB4MDAsMHhhMiwweDI4LDB4MjEsMHgzYywweDA0LDB4YjAsMHgwNiwweGE3LDB4ODMsMHg4YiwweGI2LDB4MzQsMHg4NCwweDgwLDB4MTgsCisweGE0LDB4YTMsMHgwMCwweDAwLDB4OGMsMHg4NSwweDAwLDB4MDAsMHgyNCwweDAyLDB4OGYsMHhmZiwweDI1LDB4NDYsMHgwMCwweDE0LAorMHgzYywweDAzLDB4MGYsMHgwMCwweDAwLDB4YzIsMHg1MCwweDI0LDB4MDAsMHhhMywweDI4LDB4MjQsMHgzYywweDAyLDB4MDQsMHgwMCwKKzB4YWYsMHg4YSwweDhiLDB4YjAsMHgxMCwweGEyLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDA0LDB4OTgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MjgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgzMCwweDNjLDB4MDUsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHhjOCwKKzB4MDAsMHgwNCwweDIyLDB4MDAsMHgzNCwweGE1LDB4MDAsMHgyMCwweDI0LDB4NDIsMHgwZSwweDA0LDB4M2MsMHgwMywweGIwLDB4MDAsCisweGFmLDB4YjUsMHgwMCwweDI0LDB4YWYsMHhiNCwweDAwLDB4MjAsMHhhZiwweGIyLDB4MDAsMHgxOCwweGFmLDB4YjAsMHgwMCwweDEwLAorMHhhZiwweGJmLDB4MDAsMHgzMCwweDAwLDB4ODMsMHg4MCwweDIxLDB4YWYsMHhiNywweDAwLDB4MmMsMHhhZiwweGI2LDB4MDAsMHgyOCwKKzB4YWYsMHhiMywweDAwLDB4MWMsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFjLDB4YTIsMHgwMCwweDAwLDB4OGUsMHgwOSwweDAwLDB4MDAsCisweDAwLDB4MDAsMHg5MCwweDIxLDB4MjYsMHgxMCwweDAwLDB4MDgsMHgwMCwweDA5LDB4YTYsMHgwMiwweDEyLDB4ODAsMHgwMCwweDEzLAorMHgwMCwweDAwLDB4YTgsMHgyMSwweDI0LDB4MTMsMHgwMCwweDAyLDB4M2MsMHgxNiwweDAwLDB4ZmYsMHgzYywweDE3LDB4ZmYsMHgwMCwKKzB4OGUsMHgwOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDksMHgxMiwweDAyLDB4MjQsMHg0MiwweDAwLDB4MDIsCisweDMxLDB4MjUsMHgwMCwweGZmLDB4MTAsMHhiMywweDAwLDB4NzYsMHgzMCwweDUxLDB4MDAsMHhmZiwweDI0LDB4MDIsMHgwMCwweDAzLAorMHgxMCwweGEyLDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHg1MSwweDEwLDB4MjEsMHgzMCwweDUyLDB4ZmYsMHhmZiwKKzB4MDIsMHg1NCwweDE4LDB4MmIsMHgxNCwweDYwLDB4ZmYsMHhmMiwweDAyLDB4MTEsMHg4MCwweDIxLDB4MTIsMHhhMCwweDAwLDB4MGEsCisweDNjLDB4MDIsMHhiMCwweDA2LDB4MzQsMHg0MiwweDgwLDB4MTgsMHg4YywweDQzLDB4MDAsMHgwMCwweDNjLDB4MDQsMHgwZiwweDAwLAorMHgzYywweDAyLDB4MDQsMHgwMCwweDAwLDB4NjQsMHgxOCwweDI0LDB4MTAsMHg2MiwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MGMsMHgwMCwweDA0LDB4OTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YmYsMHgwMCwweDMwLDB4N2IsMHhiNiwweDAxLDB4N2MsCisweDdiLDB4YjQsMHgwMSwweDNjLDB4N2IsMHhiMiwweDAwLDB4ZmMsMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgzOCwweDhlLDB4MDksMHgwMCwweDA0LDB4MjQsMHgxNSwweDAwLDB4MDEsMHg4ZSwweDA2LDB4MDAsMHgwYywKKzB4MDAsMHgwOSwweDExLDB4NDIsMHgwMCwweDA5LDB4MTgsMHhjMiwweDMwLDB4NDgsMHgwMCwweDAzLDB4MDAsMHgwOSwweDE0LDB4MDIsCisweDMwLDB4NmMsMHgwMCwweDAzLDB4MDAsMHgwOSwweDI2LDB4MDIsMHgxMSwweDE1LDB4MDAsMHg0NSwweDMwLDB4NDMsMHgwMCwweDBmLAorMHgyOSwweDAyLDB4MDAsMHgwMiwweDE0LDB4NDAsMHgwMCwweDI2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMSwweDEzLDB4MDAsMHgwZiwKKzB4MDAsMHgwMCwweDM4LDB4MjEsMHgwMCwweDA3LDB4MjIsMHgwMiwweDMwLDB4ODQsMHhmZiwweDAwLDB4M2MsMHgwMywweDAwLDB4ZmYsCisweDAwLDB4MDcsMHgyZSwweDAyLDB4MDAsMHgwNywweDEyLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyNCwweDAwLDB4YTQsMHgyOCwweDI1LAorMHgwMCwweGEyLDB4MjgsMHgyNSwweDAwLDB4MDcsMHgxZSwweDAwLDB4MDAsMHhhMywweDI4LDB4MjUsMHgwYywweDAwLDB4MDEsMHg5NCwKKzB4MDEsMHgyMCwweDIwLDB4MjEsMHgwOCwweDAwLDB4MDMsMHhhNywweDAyLDB4NTEsMHgxMCwweDIxLDB4MTEsMHg5NSwweDAwLDB4MGYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTEsMHg4OCwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgxMCwweDgwLAorMHgyNywweDgzLDB4OGIsMHg2MCwweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHg0NywweDAwLDB4MTgsMHgwOCwweDAwLDB4MDMsMHhjZSwKKzB4MDAsMHgwNywweDIyLDB4MDIsMHgwMCwweDA0LDB4MTAsMHg0MCwweDI3LDB4ODMsMHg4YiwweDY4LDB4MDAsMHg0MywweDEwLDB4MjEsCisweDk0LDB4NDcsMHgwMCwweDAyLDB4MDgsMHgwMCwweDAzLDB4Y2UsMHgwMCwweDA3LDB4MjIsMHgwMiwweDI3LDB4ODIsMHg4YiwweDYwLAorMHgwMCwweDgyLDB4MTAsMHgyMSwweDkwLDB4NDcsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAzLDB4Y2UsMHgwMCwweDA3LDB4MjIsMHgwMiwKKzB4MTUsMHgwMCwweGZmLDB4ZGMsMHgwMCwweDAwLDB4MzgsMHgyMSwweDEwLDB4NzUsMHgwMCwweDA1LDB4MDAsMHg4MCwweDM4LDB4MjEsCisweDAwLDB4NjUsMHgxOCwweDI2LDB4MjQsMHg4MiwweDAxLDB4MDAsMHgwMCwweDAwLDB4MzgsMHgyMSwweDAwLDB4NDMsMHgzOCwweDBhLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDExLDB4ODIsMHgwMCwweDBlLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTEsMHg4MiwweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhiMCwweDAzLDB4MDAsMHhlMiwweDEwLDB4MjEsCisweDhjLDB4NDcsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAzLDB4Y2UsMHgwMCwweDA3LDB4MjIsMHgwMiwweDNjLDB4MDIsMHhiMCwweDAzLAorMHgwMCwweGUyLDB4MTAsMHgyMSwweDk0LDB4NDMsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAzLDB4Y2QsMHgzMCwweDY3LDB4ZmYsMHhmZiwKKzB4MDAsMHhlMiwweDEwLDB4MjEsMHg5MCwweDQzLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMywweGNkLDB4MzAsMHg2NywweDAwLDB4ZmYsCisweDMwLDB4NjIsMHgwMCwweDAzLDB4MDAsMHgwMiwweDEyLDB4MDAsMHgxMSwweDk1LDB4MDAsMHgwNywweDAwLDB4NDQsMHgzOCwweDIxLAorMHgxMSwweDkzLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAzLDB4ZmYsMHgzYywweDAyLDB4YjAsMHgwYSwKKzB4MDgsMHgwMCwweDA0LDB4MDQsMHgzYywweDAyLDB4YjAsMHgwYSwweDA4LDB4MDAsMHgwNCwweDA4LDB4M2MsMHgwMiwweGIwLDB4MGEsCisweDhlLDB4MDksMHgwMCwweDA0LDB4OGUsMHgwMiwweDAwLDB4MDgsMHg4ZSwweDAzLDB4MDAsMHgwYywweDAwLDB4MDksMHg0MSwweDQyLAorMHgwMCwweDAyLDB4MjIsMHgwMiwweDAwLDB4MDMsMHgzYSwweDAyLDB4MzAsMHg4NCwweGZmLDB4MDAsMHgzMCwweGU3LDB4ZmYsMHgwMCwKKzB4MDAsMHgwMiwweDVlLDB4MDIsMHgwMCwweDAyLDB4MzIsMHgwMCwweDAwLDB4MDMsMHg1NiwweDAyLDB4MDAsMHgwMywweDJhLDB4MDAsCisweDAxLDB4NjQsMHg1OCwweDI1LDB4MDAsMHhkNiwweDMwLDB4MjQsMHgwMSwweDQ3LDB4NTAsMHgyNSwweDAwLDB4MDIsMHgxNiwweDAwLAorMHgwMCwweGI2LDB4MjgsMHgyNCwweDAwLDB4MDMsMHgxZSwweDAwLDB4MDEsMHg2NiwweDU4LDB4MjUsMHgwMSwweDQ1LDB4NTAsMHgyNSwKKzB4MDAsMHg1NywweDEwLDB4MjQsMHgwMCwweDc3LDB4MTgsMHgyNCwweDAxLDB4NjIsMHgzOCwweDI1LDB4MDEsMHg0MywweDMwLDB4MjUsCisweDAwLDB4MDksMHgxMCwweGMyLDB4MDAsMHgwOSwweDFjLDB4MDIsMHgzMSwweDA4LDB4MDAsMHgwMywweDMwLDB4NGMsMHgwMCwweDAzLAorMHgzMCwweDYzLDB4MDAsMHgwZiwweDAwLDB4MDksMHgyNiwweDAyLDB4MDAsMHhlMCwweDU4LDB4MjEsMHgxNSwweDAwLDB4MDAsMHgyOCwKKzB4MDAsMHhjMCwweDUwLDB4MjEsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4NjIsMHgwMCwweDA2LDB4MDAsMHg4MCwweDI4LDB4MjEsCisweDI0LDB4MDIsMHgwMCwweDAzLDB4MTQsMHg2MiwweGZmLDB4NjksMHgwMiwweDUxLDB4MTAsMHgyMSwweDI0LDB4ODUsMHgwMSwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDExLDB4ODIsMHgwMCwweDE1LDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMSwweDgyLDB4MDAsMHgwYSwKKzB4M2MsMHgwMywweGIwLDB4MDMsMHgwMCwweGEzLDB4MTgsMHgyMSwweDhjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwYSwweDIwLDB4MjcsCisweDAxLDB4NmEsMHgyOCwweDI0LDB4MDAsMHg0NCwweDEwLDB4MjQsMHgwMCwweDQ1LDB4MTAsMHgyNSwweGFjLDB4NjIsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MDMsMHhhNywweDAyLDB4NTEsMHgxMCwweDIxLDB4MDAsMHhhMywweDE4LDB4MjEsMHg5NCwweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwYSwweDIwLDB4MjcsMHgwMSwweDZhLDB4MjgsMHgyNCwweDAwLDB4NDQsMHgxMCwweDI0LDB4MDAsMHg0NSwweDEwLDB4MjUsCisweGE0LDB4NjIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAzLDB4YTcsMHgwMiwweDUxLDB4MTAsMHgyMSwweDNjLDB4MDMsMHhiMCwweDAzLAorMHgwMCwweGEzLDB4MTgsMHgyMSwweDkwLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwYSwweDIwLDB4MjcsMHgwMSwweDZhLDB4MjgsMHgyNCwKKzB4MDAsMHg0NCwweDEwLDB4MjQsMHgwMCwweDQ1LDB4MTAsMHgyNSwweDA4LDB4MDAsMHgwMywweGE2LDB4YTAsMHg2MiwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MTEsMHgwMiwweDAwLDB4MjEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE1LDB4MTMsMHhmZiwweDQyLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDExLDB4ODIsMHgwMCwweDE3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMSwweDg4LDB4MDAsMHgwYiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDgzLDB4OGIsMHg2MCwweDAwLDB4MDQsMHgyMCwweDgwLDB4MDAsMHg4MywweDIwLDB4MjEsCisweDhjLDB4ODIsMHgwMCwweDE4LDB4MDAsMHgwNiwweDE4LDB4MjcsMHgwMCwweGU2LDB4MjgsMHgyNCwweDAwLDB4NDMsMHgxMCwweDI0LAorMHgwMCwweDQ1LDB4MTAsMHgyNSwweDA4LDB4MDAsMHgwMywweGE2LDB4YWMsMHg4MiwweDAwLDB4MTgsMHgyNywweDgzLDB4OGIsMHg2OCwKKzB4MDAsMHgwNCwweDIwLDB4NDAsMHgwMCwweDgzLDB4MjAsMHgyMSwweDk0LDB4ODIsMHgwMCwweDAyLDB4MDAsMHgwNiwweDE4LDB4MjcsCisweDAwLDB4ZTYsMHgyOCwweDI0LDB4MDAsMHg0MywweDEwLDB4MjQsMHgwMCwweDQ1LDB4MTAsMHgyNSwweDA4LDB4MDAsMHgwMywweGE2LAorMHhhNCwweDgyLDB4MDAsMHgwMiwweDI3LDB4ODMsMHg4YiwweDYwLDB4MDAsMHg4MywweDE4LDB4MjEsMHg5MCwweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwNiwweDIwLDB4MjcsMHgwOCwweDAwLDB4MDQsMHg1YywweDAwLDB4ZTYsMHgyOCwweDI0LDB4MzAsMHg2MiwweDAwLDB4MDcsCisweDAwLDB4MDIsMHgxMiwweDAwLDB4MTEsMHg4OCwweDAwLDB4MGYsMHgwMCwweDQ0LDB4MTAsMHgyMSwweDExLDB4OTMsMHgwMCwweDA3LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDBhLDB4MDAsMHg0MywweDE4LDB4MjEsMHg4YywweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwNiwweDIwLDB4MjcsMHgwOCwweDAwLDB4MDQsMHg0OSwweDAwLDB4ZTYsMHgyOCwweDI0LDB4M2MsMHgwMywweGIwLDB4MGEsCisweDAwLDB4NDMsMHgxOCwweDIxLDB4OTQsMHg2MiwweDAwLDB4MDAsMHgwMCwweDA2LDB4MjAsMHgyNywweDA4LDB4MDAsMHgwNCwweDUyLAorMHgwMCwweGU2LDB4MjgsMHgyNCwweDNjLDB4MDMsMHhiMCwweDBhLDB4MDgsMHgwMCwweDA0LDB4N2YsMHgwMCwweDQzLDB4MTgsMHgyMSwKKzB4OTcsMHg4NSwweDhiLDB4YjQsMHgzYywweDA3LDB4YjAsMHgwMiwweDNjLDB4MDQsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDAwLDB4YTcsMHgyOCwweDIxLDB4MzQsMHg4NCwweDAwLDB4MjAsMHgyNCwweDQyLDB4MTIsMHg2MCwweDI0LDB4MDMsMHhmZiwweDgwLAorMHhhYywweDgyLDB4MDAsMHgwMCwweGEwLDB4YTMsMHgwMCwweDA3LDB4OTcsMHg4MiwweDhiLDB4YjYsMHg5NywweDg1LDB4OGIsMHhiNCwKKzB4M2MsMHgwNiwweGIwLDB4MDYsMHgzMCwweDQyLDB4ZmYsMHhmOCwweDI0LDB4NDIsMHgwMCwweDEwLDB4MDAsMHhhMiwweDEwLDB4MjEsCisweDMwLDB4NDIsMHgwZiwweGZmLDB4MjQsMHg0NCwweDAwLDB4MDgsMHgzMCwweDg0LDB4MGYsMHhmZiwweDAwLDB4MDUsMHgyOCwweGMyLAorMHgzYywweDAzLDB4MDAsMHg0MCwweDAwLDB4YTMsMHgyOCwweDI1LDB4MDAsMHg4NywweDIwLDB4MjEsMHgzNCwweGM2LDB4ODAsMHgxOCwKKzB4YWMsMHhjNSwweDAwLDB4MDAsMHhhZiwweDg0LDB4OGIsMHhiMCwweGE3LDB4ODIsMHg4YiwweGI0LDB4YTcsMHg4MCwweDhiLDB4YjYsCisweGFmLDB4ODAsMHg4YiwweGI4LDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4YTUsMHgwMCwweGZmLAorMHgzMCwweDg0LDB4MDAsMHhmZiwweDI0LDB4MDIsMHgwMCwweDAxLDB4MDAsMHhlMCwweDQ4LDB4MjEsMHgzMCwweGM2LDB4MDAsMHhmZiwKKzB4OGYsMHhhNywweDAwLDB4MTAsMHgxMCwweDgyLDB4MDAsMHgwNywweDAwLDB4YTAsMHg0MCwweDIxLDB4MjQsMHgwMiwweDAwLDB4MDMsCisweDEwLDB4ODIsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweGE4LDB4MDEsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgwMCwweDA3LDB4MjAsMHgyNywKKzB4MDEsMHgyNywweDI4LDB4MjQsMHgxMCwweGMyLDB4MDAsMHgxNCwweDAxLDB4MDMsMHgxOCwweDIxLDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDEwLDB4YzIsMHgwMCwweDA5LDB4MDAsMHgwNywweDUwLDB4MjcsMHgzYywweDAzLDB4YjAsMHgwMywweDAxLDB4MDMsMHgxOCwweDIxLAorMHg4YywweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0YSwweDEwLDB4MjQsMHgwMCwweDQ1LDB4MTAsMHgyNSwKKzB4MDgsMHgwMCwweDA0LDB4ZTMsMHhhYywweDYyLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4MDEsMHgwMywweDE4LDB4MjEsCisweDk0LDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDRhLDB4MTAsMHgyNCwweDAwLDB4NDUsMHgxMCwweDI1LAorMHgwMywweGUwLDB4MDAsMHgwOCwweGE0LDB4NjIsMHgwMCwweDAwLDB4OTAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHg0NCwweDEwLDB4MjQsMHgwMCwweDQ1LDB4MTAsMHgyNSwweGEwLDB4NjIsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg4NCwweDAwLDB4MDcsMHgwMCwweDA0LDB4MjIsMHgwMCwweDMwLDB4YTUsMHgwMCwweGZmLAorMHgwMCwweDg1LDB4MjgsMHgyMSwweDNjLDB4MDIsMHhiMCwweDBhLDB4MDAsMHhhMiwweDQwLDB4MjEsMHgzMCwweGM2LDB4MDAsMHhmZiwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHg4ZiwweGE0LDB4MDAsMHgxMCwweDEwLDB4YzIsMHgwMCwweDE0LDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDAwLDB4MDQsMHg1MCwweDI3LDB4MTAsMHhjMiwweDAwLDB4MDksMHgwMCwweGU0LDB4NDgsMHgyNCwweDNjLDB4MDMsMHhiMCwweDBhLAorMHgwMCwweGEzLDB4MTgsMHgyMSwweDhjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDRhLDB4MTAsMHgyNCwKKzB4MDAsMHg0OSwweDEwLDB4MjUsMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4NjIsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MGEsCisweDAwLDB4YTMsMHgxOCwweDIxLDB4OTQsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NGEsMHgxMCwweDI0LAorMHgwMCwweDQ5LDB4MTAsMHgyNSwweDAzLDB4ZTAsMHgwMCwweDA4LDB4YTQsMHg2MiwweDAwLDB4MDAsMHg5MSwweDAyLDB4MDAsMHgwMCwKKzB4MDAsMHgwNCwweDE4LDB4MjcsMHgwMCwweGU0LDB4MjAsMHgyNCwweDAwLDB4NDMsMHgxMCwweDI0LDB4MDAsMHg0NCwweDEwLDB4MjUsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4YTEsMHgwMiwweDAwLDB4MDAsMHgzMCwweGE5LDB4MDAsMHhmZiwweDI3LDB4ODMsMHg4YiwweDYwLAorMHgzMCwweDg1LDB4MDAsMHhmZiwweDI0LDB4MDIsMHgwMCwweDAxLDB4MDAsMHgwNywweDUwLDB4MjcsMHgwMCwweGM3LDB4NDAsMHgyNCwKKzB4MTEsMHgyMiwweDAwLDB4MTcsMHgwMCwweGEzLDB4MTgsMHgyMSwweDAwLDB4MDUsMHgyMCwweDQwLDB4MjcsMHg4MiwweDhiLDB4NjAsCisweDAwLDB4MDUsMHgyOCwweDgwLDB4MjcsMHg4MywweDhiLDB4NjgsMHgwMCwweDgzLDB4NTAsMHgyMSwweDAwLDB4YTIsMHgyMCwweDIxLAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDAwLDB4MDcsMHg0MCwweDI3LDB4MTEsMHgyMiwweDAwLDB4MDcsMHgwMCwweGM3LDB4MjgsMHgyNCwKKzB4OGMsMHg4MiwweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDgsMHgxMCwweDI0LDB4MDAsMHg0NSwweDEwLDB4MjUsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4YWMsMHg4MiwweDAwLDB4MTgsMHg5NSwweDQyLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDQ4LDB4MTAsMHgyNCwweDAwLDB4NDUsMHgxMCwweDI1LDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhNSwweDQyLDB4MDAsMHgwMiwKKzB4OTAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NGEsMHgxMCwweDI0LDB4MDAsMHg0OCwweDEwLDB4MjUsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4YTAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDA0LDB4MzIsMHgwMiwweDMwLDB4YzYsMHhmZiwweDAwLAorMHgwMCwweDA0LDB4MTYsMHgwMiwweDAwLDB4MDQsMHgxYSwweDAwLDB4M2MsMHgwNSwweDAwLDB4ZmYsMHgwMCwweDY1LDB4MTgsMHgyNCwKKzB4MDAsMHg0NiwweDEwLDB4MjUsMHgwMCwweDQzLDB4MTAsMHgyNSwweDAwLDB4MDQsMHgyNiwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDAwLDB4NDQsMHgxMCwweDI1LDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGU4LAorMHgzNCwweDYzLDB4MDAsMHgyMCwweDI0LDB4NDIsMHgxNCwweGU0LDB4M2MsMHgwNCwweGIwLDB4MDMsMHhhZiwweGJmLDB4MDAsMHgxNCwKKzB4YWMsMHg2MiwweDAwLDB4MDAsMHhhZiwweGIwLDB4MDAsMHgxMCwweDM0LDB4ODQsMHgwMCwweDJjLDB4OGMsMHg4MywweDAwLDB4MDAsCisweGE3LDB4ODAsMHhiYiwweGYwLDB4MDAsMHgwMywweDEyLDB4MDIsMHgwMCwweDAzLDB4MmQsMHgwMiwweDMwLDB4NDIsMHgwZiwweGZmLAorMHhhMywweDgzLDB4YmIsMHhmOCwweGE3LDB4ODUsMHhiYiwweGZjLDB4YTcsMHg4MiwweGJiLDB4ZmEsMHhhNywweDgwLDB4YmIsMHhmMiwKKzB4YTcsMHg4MCwweGJiLDB4ZjQsMHhhNywweDgwLDB4YmIsMHhmNiwweDBjLDB4MDAsMHgwNiwweGNlLDB4MjQsMHgwNCwweDA1LDB4MDAsCisweDNjLDB4MDUsMHgwOCwweDAwLDB4MDAsMHg0NSwweDI4LDB4MjUsMHgyNCwweDA0LDB4MDUsMHgwMCwweDBjLDB4MDAsMHgwNiwweGMxLAorMHgwMCwweDQwLDB4ODAsMHgyMSwweDNjLDB4MDIsMHhmNywweGZmLDB4MzQsMHg0MiwweGZmLDB4ZmYsMHgwMiwweDAyLDB4ODAsMHgyNCwKKzB4MDIsMHgwMCwweDI4LDB4MjEsMHgwYywweDAwLDB4MDYsMHhjMSwweDI0LDB4MDQsMHgwNSwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDNjLDB4MDMsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAxLDB4MDgsMHgzNCwweDYzLDB4MDEsMHgxOCwweDhjLDB4NDUsMHgwMCwweDAwLAorMHg4YywweDY0LDB4MDAsMHgwMCwweDNjLDB4MDIsMHgwMCwweDBmLDB4M2MsMHgwMywweDAwLDB4NGMsMHgzMCwweDg0LDB4MDIsMHgwMCwKKzB4MzQsMHg2MywweDRiLDB4NDAsMHhhZiwweDg1LDB4YmMsMHgwMCwweDEwLDB4ODAsMHgwMCwweDA2LDB4MzQsMHg0MiwweDQyLDB4NDAsCisweGFmLDB4ODMsMHhiYywweDA0LDB4OGYsMHhiZiwweDAwLDB4MTQsMHg4ZiwweGIwLDB4MDAsMHgxMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgxOCwweGFmLDB4ODIsMHhiYywweDA0LDB4MDgsMHgwMCwweDA1LDB4NjksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGM4LDB4MzQsMHg2MywweDAwLDB4MjAsCisweDI0LDB4NDIsMHgxNSwweGMwLDB4MzAsMHg4NCwweDAwLDB4ZmYsMHhhZiwweGJmLDB4MDAsMHgzMCwweGFmLDB4YjcsMHgwMCwweDJjLAorMHhhZiwweGI2LDB4MDAsMHgyOCwweGFmLDB4YjUsMHgwMCwweDI0LDB4YWYsMHhiNCwweDAwLDB4MjAsMHhhZiwweGIzLDB4MDAsMHgxYywKKzB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4YjAsMHgwMCwweDEwLDB4YWMsMHg2MiwweDAwLDB4MDAsCisweDEwLDB4ODAsMHgwMCwweDFjLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweDgyLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4ZiwweGJmLDB4MDAsMHgzMCwweDdiLDB4YjYsMHgwMSwweDdjLDB4N2IsMHhiNCwweDAxLDB4M2MsMHg3YiwweGIyLDB4MDAsMHhmYywKKzB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDM4LDB4YTcsMHg4MCwweGJiLDB4ZjAsCisweGE3LDB4ODAsMHhiYiwweGYyLDB4YTcsMHg4MCwweGJiLDB4ZjQsMHhhNywweDgwLDB4YmIsMHhmNiwweDBjLDB4MDAsMHgwNiwweGNlLAorMHgyNCwweDA0LDB4MDUsMHgwMCwweDNjLDB4MDUsMHgwOCwweDAwLDB4MDAsMHg0NSwweDI4LDB4MjUsMHgyNCwweDA0LDB4MDUsMHgwMCwKKzB4MGMsMHgwMCwweDA2LDB4YzEsMHgwMCwweDQwLDB4ODAsMHgyMSwweDNjLDB4MDUsMHhmNywweGZmLDB4MzQsMHhhNSwweGZmLDB4ZmYsCisweDAyLDB4MDUsMHgyOCwweDI0LDB4MGMsMHgwMCwweDA2LDB4YzEsMHgyNCwweDA0LDB4MDUsMHgwMCwweDA4LDB4MDAsMHgwNSwweDg0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgwNiwweGNlLDB4MjQsMHgwNCwweDA1LDB4YTAsMHgyNCwweDA0LDB4MDUsMHhhNCwKKzB4MGMsMHgwMCwweDA2LDB4Y2UsMHgwMCwweDAyLDB4YmMsMHgwMiwweDI0LDB4MDQsMHgwNSwweGE4LDB4MDAsMHgwMiwweGI0LDB4MDIsCisweDBjLDB4MDAsMHgwNiwweGNlLDB4MzAsMHg1NSwweGZmLDB4ZmYsMHgwMCwweDQwLDB4ODAsMHgyMSwweDk3LDB4ODQsMHhiYiwweGYwLAorMHg5NywweDgyLDB4YmIsMHhmMiwweDk3LDB4ODMsMHhiYiwweGY2LDB4MDIsMHhlNCwweDIwLDB4MjMsMHgwMiwweGEyLDB4MTAsMHgyMywKKzB4MDAsMHg4MiwweDIwLDB4MjEsMHg5NywweDgyLDB4YmIsMHhmNCwweDMyLDB4MTQsMHhmZiwweGZmLDB4MDIsMHg4MywweDE4LDB4MjMsCisweDAyLDB4YzIsMHgxMCwweDIzLDB4MDAsMHg4MiwweDIwLDB4MjEsMHg5MywweDgyLDB4YmIsMHhmOCwweDAwLDB4ODMsMHgyMCwweDIxLAorMHgzMCwweDg0LDB4ZmYsMHhmZiwweDAwLDB4ODIsMHgxMCwweDJiLDB4MTQsMHg0MCwweDAwLDB4YWEsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OTcsMHg4MiwweGJiLDB4ZmMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDQsMHgxMCwweDJiLDB4MTQsMHg0MCwweDAwLDB4N2YsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTcsMHg4MiwweGJiLDB4ZmEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDQsMHgxMCwweDJiLAorMHgxMCwweDQwLDB4MDAsMHgzYSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDA2LDB4Y2UsMHgyNCwweDA0LDB4MDQsMHg1MCwKKzB4MzAsMHg1MSwweDAwLDB4N2YsMHgwMCwweDQwLDB4ODAsMHgyMSwweDJlLDB4MjIsMHgwMCwweDMyLDB4MTAsMHg0MCwweDAwLDB4MTMsCisweDI0LDB4MDIsMHgwMCwweDIwLDB4MTIsMHgyMiwweDAwLDB4MTcsMHgyNCwweDAyLDB4ZmYsMHg4MCwweDAyLDB4MDIsMHgxMCwweDI0LAorMHgyNiwweDMxLDB4MDAsMHgwMSwweDAwLDB4NTEsMHg4MCwweDI1LDB4MDIsMHgwMCwweDI4LDB4MjEsMHgwYywweDAwLDB4MDYsMHhjMSwKKzB4MjQsMHgwNCwweDA0LDB4NTAsMHgwMiwweDAwLDB4MjgsMHgyMSwweDBjLDB4MDAsMHgwNiwweGMxLDB4MjQsMHgwNCwweDA0LDB4NTgsCisweDAyLDB4MDAsMHgyOCwweDIxLDB4MGMsMHgwMCwweDA2LDB4YzEsMHgyNCwweDA0LDB4MDQsMHg2MCwweDAyLDB4MDAsMHgyOCwweDIxLAorMHgyNCwweDA0LDB4MDQsMHg2OCwweDBjLDB4MDAsMHgwNiwweGMxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhNywweDk3LDB4YmIsMHhmMCwKKzB4YTcsMHg5NSwweGJiLDB4ZjIsMHhhNywweDk2LDB4YmIsMHhmNCwweGE3LDB4OTQsMHhiYiwweGY2LDB4MDgsMHgwMCwweDA1LDB4ODQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDA2LDB4Y2UsMHgyNCwweDA0LDB4MDIsMHgwOCwweDNjLDB4MDQsMHgwMCwweGMwLAorMHgwMCwweDQwLDB4MjgsMHgyMSwweDAwLDB4NDQsMHgxMCwweDI0LDB4MDAsMHgwMiwweDE1LDB4ODIsMHgyNCwweDAzLDB4MDAsMHgwMywKKzB4MTAsMHg0MywweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhmZiwweDNmLDB4MzQsMHg0MiwweGZmLDB4ZmYsCisweDAwLDB4YTIsMHgxMCwweDI0LDB4MDAsMHg0NCwweDI4LDB4MjUsMHgwYywweDAwLDB4MDYsMHhjMSwweDI0LDB4MDQsMHgwMiwweDA4LAorMHgwYywweDAwLDB4MDYsMHhjZSwweDI0LDB4MDQsMHgwMiwweDJjLDB4MDAsMHg0MCwweDkwLDB4MjEsMHgzYywweDAyLDB4ZmYsMHhmZiwKKzB4MzQsMHg0MiwweDNmLDB4ZmYsMHgwMiwweDQyLDB4OTAsMHgyNCwweDAyLDB4NDAsMHgyOCwweDIxLDB4MGMsMHgwMCwweDA2LDB4YzEsCisweDI0LDB4MDQsMHgwMiwweDJjLDB4MDgsMHgwMCwweDA1LDB4Y2IsMHgyNCwweDAyLDB4ZmYsMHg4MCwweDBjLDB4MDAsMHgwNiwweGNlLAorMHgyNCwweDA0LDB4MDQsMHg1MCwweDMwLDB4NTEsMHgwMCwweDdmLDB4MjQsMHgwMiwweDAwLDB4MjAsMHgxNiwweDIyLDB4ZmYsMHhkYiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MDYsMHhjZSwweDI0LDB4MDQsMHgwMiwweDJjLDB4MzQsMHg1MiwweDQwLDB4MDAsCisweDAyLDB4NDAsMHgyOCwweDIxLDB4MGMsMHgwMCwweDA2LDB4YzEsMHgyNCwweDA0LDB4MDIsMHgyYywweDBjLDB4MDAsMHgwNiwweGNlLAorMHgyNCwweDA0LDB4MDIsMHg1OCwweDI0LDB4MDQsMHgwMiwweDVjLDB4MGMsMHgwMCwweDA2LDB4Y2UsMHgwMCwweDAyLDB4OWUsMHgwMiwKKzB4MzAsMHg0MywweDAwLDB4ZmYsMHgwMCwweDEzLDB4MTIsMHgwMCwweDAwLDB4NDMsMHgxMCwweDI1LDB4MmMsMHg0MywweDAwLDB4MDQsCisweDE0LDB4NjAsMHgwMCwweDFkLDB4MmMsMHg0MiwweDAwLDB4MTEsMHgxMCwweDQwLDB4MDAsMHgwYiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDAyLDB4ZmYsMHhmZiwweDM0LDB4NDIsMHgzZiwweGZmLDB4MDIsMHg0MiwweDkwLDB4MjQsMHgwMiwweDQwLDB4MjgsMHgyMSwKKzB4MjQsMHgwNCwweDAyLDB4MmMsMHgwYywweDAwLDB4MDYsMHhjMSwweDM2LDB4NTIsMHg4MCwweDAwLDB4MDIsMHg0MCwweDI4LDB4MjEsCisweDA4LDB4MDAsMHgwNSwweGQ5LDB4MjQsMHgwNCwweDAyLDB4MmMsMHgwYywweDAwLDB4MDYsMHhjZSwweDI0LDB4MDQsMHgwMiwweDA4LAorMHgzYywweDA0LDB4MDAsMHhjMCwweDAwLDB4NDAsMHgyOCwweDIxLDB4MDAsMHg0NCwweDEwLDB4MjQsMHgwMCwweDAyLDB4MTUsMHg4MiwKKzB4MjQsMHgwMywweDAwLDB4MDIsMHgxNCwweDQzLDB4ZmYsMHhlZSwweDNjLDB4MDIsMHhmZiwweDNmLDB4MzQsMHg0MiwweGZmLDB4ZmYsCisweDAwLDB4YTIsMHgxMCwweDI0LDB4MDAsMHg0NCwweDI4LDB4MjUsMHgwYywweDAwLDB4MDYsMHhjMSwweDI0LDB4MDQsMHgwMiwweDA4LAorMHgwOCwweDAwLDB4MDYsMHgxNSwweDNjLDB4MDIsMHhmZiwweGZmLDB4MGMsMHgwMCwweDA2LDB4Y2UsMHgyNCwweDA0LDB4MDIsMHgwOCwKKzB4MDAsMHg0MCwweDI4LDB4MjEsMHgwMCwweDAyLDB4MTUsMHg4MiwweDMwLDB4NDIsMHgwMCwweDAzLDB4MjQsMHgwMywweDAwLDB4MDMsCisweDE0LDB4NDMsMHhmZiwweGRmLDB4M2MsMHgwMiwweGZmLDB4M2YsMHgzNCwweDQyLDB4ZmYsMHhmZiwweDAwLDB4YTIsMHgxMCwweDI0LAorMHgzYywweDAzLDB4MDAsMHg4MCwweDA4LDB4MDAsMHgwNiwweDJhLDB4MDAsMHg0MywweDI4LDB4MjUsMHgwYywweDAwLDB4MDYsMHhjZSwKKzB4MjQsMHgwNCwweDA0LDB4NTAsMHgzMCwweDUxLDB4MDAsMHg3ZiwweDAwLDB4NDAsMHg4MCwweDIxLDB4MmUsMHgyMiwweDAwLDB4MzIsCisweDEwLDB4NDAsMHhmZiwweDlhLDB4MjQsMHgwMiwweDAwLDB4MjAsMHgxMiwweDIyLDB4MDAsMHgwNCwweDI0LDB4MDIsMHhmZiwweDgwLAorMHgwMiwweDAyLDB4MTAsMHgyNCwweDA4LDB4MDAsMHgwNSwweGNkLDB4MjYsMHgzMSwweDAwLDB4MDIsMHgwYywweDAwLDB4MDYsMHhjZSwKKzB4MjQsMHgwNCwweDAyLDB4MDgsMHgzYywweDA0LDB4MDAsMHhjMCwweDAwLDB4NDAsMHgyOCwweDIxLDB4MDAsMHg0NCwweDEwLDB4MjQsCisweDAwLDB4MDIsMHgxNSwweDgyLDB4MjQsMHgwMywweDAwLDB4MDMsMHgxMCwweDQzLDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDAyLDB4ZmYsMHgzZiwweDM0LDB4NDIsMHhmZiwweGZmLDB4MDAsMHhhMiwweDEwLDB4MjQsMHgwMCwweDQ0LDB4MjgsMHgyNSwKKzB4MGMsMHgwMCwweDA2LDB4YzEsMHgyNCwweDA0LDB4MDIsMHgwOCwweDBjLDB4MDAsMHgwNiwweGNlLDB4MjQsMHgwNCwweDAyLDB4MmMsCisweDAwLDB4NDAsMHg5MCwweDIxLDB4M2MsMHgwMiwweGZmLDB4ZmYsMHgzNCwweDQyLDB4M2YsMHhmZiwweDAyLDB4NDIsMHg5MCwweDI0LAorMHgwMiwweDQwLDB4MjgsMHgyMSwweDBjLDB4MDAsMHgwNiwweGMxLDB4MjQsMHgwNCwweDAyLDB4MmMsMHgwOCwweDAwLDB4MDYsMHg0NCwKKzB4MjQsMHgwMiwweGZmLDB4ODAsMHgwYywweDAwLDB4MDYsMHhjZSwweDI0LDB4MDQsMHgwNCwweDUwLDB4MDAsMHg0MCwweDgwLDB4MjEsCisweDMwLDB4NTEsMHgwMCwweDdmLDB4MjQsMHgwMiwweDAwLDB4MjAsMHgxMiwweDIyLDB4MDAsMHgxZCwweDJlLDB4MjIsMHgwMCwweDIxLAorMHgxNCwweDQwLDB4ZmYsMHg3MiwweDI0LDB4MDIsMHhmZiwweDgwLDB4MDIsMHgwMiwweDEwLDB4MjQsMHgyNiwweDMxLDB4ZmYsMHhmZiwKKzB4MDAsMHg1MSwweDgwLDB4MjUsMHgyNCwweDA0LDB4MDQsMHg1MCwweDBjLDB4MDAsMHgwNiwweGMxLDB4MDIsMHgwMCwweDI4LDB4MjEsCisweDI0LDB4MDQsMHgwNCwweDU4LDB4MGMsMHgwMCwweDA2LDB4YzEsMHgwMiwweDAwLDB4MjgsMHgyMSwweDI0LDB4MDQsMHgwNCwweDYwLAorMHgwYywweDAwLDB4MDYsMHhjMSwweDAyLDB4MDAsMHgyOCwweDIxLDB4MDIsMHgwMCwweDI4LDB4MjEsMHgwYywweDAwLDB4MDYsMHhjMSwKKzB4MjQsMHgwNCwweDA0LDB4NjgsMHgyNCwweDAyLDB4MDAsMHgyMCwweDE2LDB4MjIsMHhmZiwweDYwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDBjLDB4MDAsMHgwNiwweGNlLDB4MjQsMHgwNCwweDAyLDB4MmMsMHgwMCwweDQwLDB4OTAsMHgyMSwweDNjLDB4MDIsMHhmZiwweGZmLAorMHgzNCwweDQyLDB4M2YsMHhmZiwweDAyLDB4NDIsMHgxMCwweDI0LDB4MDgsMHgwMCwweDA2LDB4MWIsMHgzNCwweDUyLDB4ODAsMHgwMCwKKzB4MGMsMHgwMCwweDA2LDB4Y2UsMHgyNCwweDA0LDB4MDIsMHgyYywweDM0LDB4NTIsMHg0MCwweDAwLDB4MDIsMHg0MCwweDI4LDB4MjEsCisweDBjLDB4MDAsMHgwNiwweGMxLDB4MjQsMHgwNCwweDAyLDB4MmMsMHgwYywweDAwLDB4MDYsMHhjZSwweDI0LDB4MDQsMHgwMiwweDU4LAorMHgyNCwweDA0LDB4MDIsMHg1YywweDBjLDB4MDAsMHgwNiwweGNlLDB4MDAsMHgwMiwweDllLDB4MDIsMHgzMCwweDQzLDB4MDAsMHhmZiwKKzB4MDAsMHgxMywweDEyLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyNSwweDJjLDB4NDMsMHgwMCwweDA0LDB4MTQsMHg2MCwweDAwLDB4MjAsCisweDJjLDB4NDIsMHgwMCwweDExLDB4MTAsMHg0MCwweDAwLDB4MGQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhmZiwweGZmLAorMHgzNCwweDQyLDB4M2YsMHhmZiwweDAyLDB4NDIsMHg5MCwweDI0LDB4MDIsMHg0MCwweDI4LDB4MjEsMHgyNCwweDA0LDB4MDIsMHgyYywKKzB4MGMsMHgwMCwweDA2LDB4YzEsMHgzNiwweDUyLDB4ODAsMHgwMCwweDAyLDB4NDAsMHgyOCwweDIxLDB4MGMsMHgwMCwweDA2LDB4YzEsCisweDI0LDB4MDQsMHgwMiwweDJjLDB4MDgsMHgwMCwweDA2LDB4NjgsMHgyZSwweDIyLDB4MDAsMHgyMSwweDBjLDB4MDAsMHgwNiwweGNlLAorMHgyNCwweDA0LDB4MDIsMHgwOCwweDNjLDB4MDQsMHgwMCwweGMwLDB4MDAsMHg0MCwweDI4LDB4MjEsMHgwMCwweDQ0LDB4MTAsMHgyNCwKKzB4MDAsMHgwMiwweDE1LDB4ODIsMHgyNCwweDAzLDB4MDAsMHgwMiwweDE0LDB4NDMsMHhmZiwweGVjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHhmZiwweDNmLDB4MzQsMHg0MiwweGZmLDB4ZmYsMHgwMCwweGEyLDB4MTAsMHgyNCwweDAwLDB4NDQsMHgyOCwweDI1LAorMHgwYywweDAwLDB4MDYsMHhjMSwweDI0LDB4MDQsMHgwMiwweDA4LDB4MDgsMHgwMCwweDA2LDB4OTgsMHgzYywweDAyLDB4ZmYsMHhmZiwKKzB4MGMsMHgwMCwweDA2LDB4Y2UsMHgyNCwweDA0LDB4MDIsMHgwOCwweDAwLDB4NDAsMHgyOCwweDIxLDB4MDAsMHgwMiwweDE1LDB4ODIsCisweDMwLDB4NDIsMHgwMCwweDAzLDB4MjQsMHgwMywweDAwLDB4MDMsMHgxNCwweDQzLDB4ZmYsMHhkYywweDNjLDB4MDMsMHgwMCwweDgwLAorMHgzYywweDAyLDB4ZmYsMHgzZiwweDM0LDB4NDIsMHhmZiwweGZmLDB4MDAsMHhhMiwweDEwLDB4MjQsMHgwOCwweDAwLDB4MDYsMHhiMCwKKzB4MDAsMHg0MywweDI4LDB4MjUsMHgzMCwweDgzLDB4MDAsMHgwMywweDAwLDB4MDQsMHgyMCwweDQwLDB4MDAsMHg4MywweDIwLDB4MjMsCisweDNjLDB4MDIsMHhiMCwweDBhLDB4MDAsMHg4MiwweDIwLDB4MjEsMHhhYywweDg1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxOCwweDIxLAorMHgyNCwweDYzLDB4MDAsMHgwMSwweDJjLDB4NjIsMHgwMCwweDBhLDB4MTQsMHg0MCwweGZmLDB4ZmUsMHgyNCwweDYzLDB4MDAsMHgwMSwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNCwweDYzLDB4ZmYsMHhmZiwweDMwLDB4ODYsMHgwMCwweDAzLDB4MDAsMHgwNCwweDI4LDB4NDAsCisweDNjLDB4MDMsMHhiMCwweDBhLDB4MDAsMHhhNiwweDEwLDB4MjMsMHgwMCwweDQzLDB4MTAsMHgyMSwweDI0LDB4MDQsMHhmZiwweGZmLAorMHhhYywweDQ0LDB4MTAsMHgwMCwweDAwLDB4MDAsMHgxOCwweDIxLDB4MjQsMHg2MywweDAwLDB4MDEsMHgyYywweDYyLDB4MDAsMHgwYSwKKzB4MTQsMHg0MCwweGZmLDB4ZmUsMHgyNCwweDYzLDB4MDAsMHgwMSwweDI0LDB4NjMsMHhmZiwweGZmLDB4MDAsMHhhNiwweDE4LDB4MjMsCisweDNjLDB4MDIsMHhiMCwweDBhLDB4MDAsMHg2MiwweDE4LDB4MjEsMHg4YywweDYyLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDUsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgyNCwweDQyLDB4MWIsMHg4NCwKKzB4MjQsMHgwMywweDAwLDB4MDEsMHgzNCwweGE1LDB4MDAsMHgyMCwweDNjLDB4MDYsMHhiMCwweDAzLDB4YWMsMHhhMiwweDAwLDB4MDAsCisweDM0LDB4YzYsMHgwMSwweDA0LDB4YTAsMHg4MywweDAwLDB4NDgsMHhhMCwweDgwLDB4MDAsMHgwNCwweGEwLDB4ODAsMHgwMCwweDA1LAorMHhhMCwweDgwLDB4MDAsMHgwNiwweGEwLDB4ODAsMHgwMCwweDA3LDB4YTAsMHg4MCwweDAwLDB4MDgsMHhhMCwweDgwLDB4MDAsMHgwOSwKKzB4YTAsMHg4MCwweDAwLDB4MGEsMHhhMCwweDgwLDB4MDAsMHgxMSwweGEwLDB4ODAsMHgwMCwweDEzLDB4YTAsMHg4MCwweDAwLDB4NDksCisweDk0LDB4YzIsMHgwMCwweDAwLDB4YWMsMHg4MCwweDAwLDB4MDAsMHhhMCwweDgwLDB4MDAsMHg0ZSwweDAwLDB4MDIsMHgxNCwweDAwLAorMHgwMCwweDAyLDB4MTQsMHgwMywweDMwLDB4NDMsMHgwMCwweGZmLDB4MzAsMHg0MiwweGZmLDB4MDAsMHhhNCwweDgyLDB4MDAsMHg0NCwKKzB4YTQsMHg4MywweDAwLDB4NDYsMHhhYywweDgwLDB4MDAsMHgyNCwweGFjLDB4ODAsMHgwMCwweDI4LDB4YWMsMHg4MCwweDAwLDB4MmMsCisweGFjLDB4ODAsMHgwMCwweDMwLDB4YWMsMHg4MCwweDAwLDB4MzQsMHhhYywweDgwLDB4MDAsMHgzOCwweGFjLDB4ODAsMHgwMCwweDNjLAorMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4ODAsMHgwMCwweDQwLDB4ODQsMHg4MywweDAwLDB4MGMsMHgzYywweDA3LDB4YjAsMHgwMywKKzB4MzQsMHhlNywweDAwLDB4MjAsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDI3LDB4ODMsMHg4ZiwweGY0LDB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDQ4LDB4MDAsMHgxOCwweDNjLDB4MDIsMHg4MCwweDAwLAorMHgyNCwweDQyLDB4MWMsMHgxOCwweGFjLDB4ZTIsMHgwMCwweDAwLDB4OGQsMHgwMywweDAwLDB4MDgsMHg4MCwweDgyLDB4MDAsMHgxMywKKzB4MDAsMHgwNSwweDJjLDB4MDAsMHgwMCwweDAzLDB4MWUsMHgwMiwweDAwLDB4MDIsMHgxMiwweDAwLDB4MzAsMHg2MywweDAwLDB4N2UsCisweDAwLDB4NjIsMHgxOCwweDIxLDB4MDAsMHg2NSwweDE4LDB4MjEsMHgzYywweDAyLDB4YzAsMHgwMCwweDNjLDB4MDUsMHhiMCwweDA1LAorMHgzNCwweDQyLDB4MDQsMHgwMCwweDI0LDB4NjMsMHgwMCwweDAxLDB4M2MsMHgwNywweGIwLDB4MDUsMHgzYywweDA4LDB4YjAsMHgwNSwKKzB4MzQsMHhhNSwweDA0LDB4MjAsMHhhYywweGEzLDB4MDAsMHgwMCwweDAwLDB4YzIsMHgzMCwweDIxLDB4MzQsMHhlNywweDA0LDB4MjQsCisweDM1LDB4MDgsMHgwMiwweDI4LDB4MjQsMHgwMiwweDAwLDB4MDEsMHgyNCwweDAzLDB4MDAsMHgyMCwweGFjLDB4ZTYsMHgwMCwweDAwLAorMHhhYywweDgyLDB4MDAsMHgzYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4YTEsMHgwMywweDAwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHhhOCwKKzB4MDAsMHgwNywweDYwLDB4ODAsMHgyNywweDgyLDB4YjMsMHhmMCwweGFmLDB4YmUsMHgwMCwweDUwLDB4YWYsMHhiNywweDAwLDB4NGMsCisweGFmLDB4YjUsMHgwMCwweDQ0LDB4YWYsMHhiNCwweDAwLDB4NDAsMHhhZiwweGJmLDB4MDAsMHg1NCwweGFmLDB4YjYsMHgwMCwweDQ4LAorMHhhZiwweGIzLDB4MDAsMHgzYywweGFmLDB4YjIsMHgwMCwweDM4LDB4YWYsMHhiMSwweDAwLDB4MzQsMHhhZiwweGIwLDB4MDAsMHgzMCwKKzB4MDEsMHg4MiwweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgwMCwweDAwLDB4ZTAsMHg3MCwweDIxLDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDk0LDB4NzMsMHgwMCwweDE0LDB4M2MsMHgwNywweGIwLDB4MDMsMHgzNCwweGU3LDB4MDAsMHgyMCwweDI0LDB4NDIsMHgxYywweGFjLAorMHgzYywweDAzLDB4YjAsMHgwNSwweGFjLDB4ZTIsMHgwMCwweDAwLDB4MzQsMHg2MywweDAxLDB4MjgsMHg5MCwweDY3LDB4MDAsMHgwMCwKKzB4MDAsMHgxMywweGE4LDB4YzAsMHgwMiwweGIzLDB4MTgsMHgyMSwweDI3LDB4ODIsMHg4ZiwweGY0LDB4MDAsMHgwMywweDE4LDB4ODAsCisweDAwLDB4NjIsMHgxOCwweDIxLDB4MDAsMHgwNSwweDJjLDB4MDAsMHgwMCwweDA3LDB4M2UsMHgwMCwweDI4LDB4YzIsMHgwMCwweDAzLAorMHgwMCwweGMwLDB4YTAsMHgyMSwweDAwLDB4ODAsMHg3OCwweDIxLDB4MDAsMHgwNSwweGJjLDB4MDMsMHg4YywweDY4LDB4MDAsMHgxOCwKKzB4MDIsMHhhMCwweDU4LDB4MjEsMHgxMCwweDQwLDB4MDEsMHg4MSwweDAwLDB4MDcsMHhmNiwweDAzLDB4MDAsMHhkZSwweDEwLDB4MDcsCisweDMwLDB4NWUsMHgwMCwweDAxLDB4MDEsMHg3MywweDEwLDB4MjEsMHgyNywweDgzLDB4OGYsMHhmOCwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDgwLDB4NGQsMHgwMCwweDA2LDB4OGQsMHgwMywweDAwLDB4MDAsMHg4ZCwweDAyLDB4MDAsMHgwNCwKKzB4OGQsMHgwYSwweDAwLDB4MDgsMHg4ZCwweDAzLDB4MDAsMHgwYywweGFmLDB4YTIsMHgwMCwweDIwLDB4MTEsMHhhMCwweDAxLDB4NzEsCisweGFmLDB4YTMsMHgwMCwweDE4LDB4MjcsMHg4MiwweGIzLDB4ZjAsMHgwMSwweDgyLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDkwLDB4ODMsMHgwMCwweDE2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDYzLDB4MDAsMHgwNCwKKzB4MTQsMHg2MCwweDAwLDB4MTIsMHgwMCwweDAwLDB4YjAsMHgyMSwweDNjLDB4MDIsMHhiMCwweDA5LDB4MzQsMHg0MiwweDAxLDB4NDYsCisweDkwLDB4NDMsMHgwMCwweDAwLDB4MmEsMHg4NCwweDAwLDB4MDQsMHgxMCwweDgwLDB4MDEsMHg1NiwweDMwLDB4NjUsMHgwMCwweDAxLAorMHg5MSwweGUyLDB4MDAsMHgwOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTIsMHg4MiwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDI4LDB4MjEsMHgxNCwweGEwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgzOCwweDIxLDB4MTMsMHhjMCwweDAwLDB4MDMsCisweDM4LDB4ZjYsMHgwMCwweDAxLDB4MjQsMHgwNywweDAwLDB4MDEsMHgzOCwweGY2LDB4MDAsMHgwMSwweDAxLDB4NzMsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MzAsMHg4MCwweDI3LDB4ODMsMHg5MCwweDAwLDB4MDAsMHhjMywweDQ4LDB4MjEsMHg5MSwweDI1LDB4MDAsMHgwMCwKKzB4OGYsMHhhNCwweDAwLDB4MjAsMHgyYywweGEzLDB4MDAsMHgwNCwweDAwLDB4MDQsMHgxMSwweGMzLDB4MzAsMHg0MiwweDAwLDB4MDEsCisweDAwLDB4MDMsMHhiMCwweDBiLDB4MTIsMHhjMCwweDAwLDB4ZDgsMHhhZiwweGEyLDB4MDAsMHgyNCwweDkzLDB4OTAsMHhiYiwweGRhLAorMHgwMCwweDBhLDB4MTYsMHg0MiwweDMwLDB4NTIsMHgwMCwweDNmLDB4MmUsMHgwNiwweDAwLDB4MGMsMHgxMCwweGMwLDB4MDAsMHhjMCwKKzB4MDAsMHhhMCwweDIwLDB4MjEsMHgyYywweGEyLDB4MDAsMHgxMCwweDE0LDB4NDAsMHgwMCwweDA0LDB4MDAsMHg5MCwweDEwLDB4MmIsCisweDMwLDB4YTIsMHgwMCwweDA3LDB4MjQsMHg0NCwweDAwLDB4MDQsMHgwMCwweDkwLDB4MTAsMHgyYiwweDEwLDB4NDAsMHgwMCwweDBiLAorMHgwMSwweDczLDB4MTAsMHgyMSwweDI3LDB4ODUsMHhiYiwweDBjLDB4MDAsMHgxMCwweDEwLDB4NDAsMHgwMCwweDUwLDB4MTAsMHgyMSwKKzB4MDAsMHg0NSwweDEwLDB4MjEsMHg5MCwweDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MCwweDE4LDB4MmIsCisweDE0LDB4NjAsMHhmZiwweGZhLDB4MDAsMHgxMCwweDEwLDB4NDAsMHgwMSwweDczLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgyNywweDgzLDB4OGYsMHhmOCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MzEsMHhhNCwweDAwLDB4MDEsMHgxMCwweDgwLDB4MDAsMHhhNSwKKzB4YTAsMHg1MCwweDAwLDB4MDcsMHgzYywweDA0LDB4YjAsMHgwNSwweDM0LDB4ODQsMHgwMCwweDA4LDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDNjLDB4MDMsMHg4MCwweDAwLDB4YTEsMHhlMiwweDAwLDB4NGUsMHhhYywweDgzLDB4MDAsMHgwMCwweDhjLDB4ODUsMHgwMCwweDAwLAorMHgzYywweDAyLDB4MDAsMHhmMCwweDNjLDB4MDMsMHg0MCwweGYwLDB4MzQsMHg0MiwweGYwLDB4MDAsMHgzNCwweDYzLDB4ZjAsMHgwMCwKKzB4MjQsMHgxNywweDAwLDB4MGUsMHgyNCwweDEzLDB4MDEsMHgwNiwweGFjLDB4ODIsMHgwMCwweDAwLDB4YWMsMHg4MywweDAwLDB4MDAsCisweDI3LDB4ODIsMHhiMywweGYwLDB4MDEsMHg4MiwweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgwMCwweDI0LDB4MDUsMHgwMCwweDAxLAorMHhhZiwweGE1LDB4MDAsMHgxYywweDkwLDB4NjIsMHgwMCwweDE2LDB4MDAsMHgxMywweGE4LDB4YzAsMHgzMiwweDUxLDB4MDAsMHgwMiwKKzB4MzQsMHg0MiwweDAwLDB4MDQsMHhhMCwweDYyLDB4MDAsMHgxNiwweDhmLDB4YTMsMHgwMCwweDIwLDB4OGYsMHhhNCwweDAwLDB4MTgsCisweDAwLDB4MDMsMHgxMywweDQzLDB4MDAsMHgwNCwweDFhLDB4MDIsMHgzMCwweDQ3LDB4MDAsMHgwMSwweDEyLDB4MjAsMHgwMCwweDA0LAorMHgzMCwweDY0LDB4MDcsMHhmZiwweDJlLDB4MDMsMHgwMCwweDA0LDB4MzIsMHg0MiwweDAwLDB4MzMsMHgwMCwweDQzLDB4OTAsMHgwYiwKKzB4OGYsMHhhNSwweDAwLDB4MjQsMHg4ZiwweGE2LDB4MDAsMHgxYywweDAwLDB4MTIsMHgxMCwweDQwLDB4MDAsMHgwNSwweDE5LDB4YzAsCisweDAwLDB4NDcsMHgxMCwweDIxLDB4MDAsMHgwNiwweDJhLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MTAsMHgzMiwweDAwLAorMHgwMCwweDA0LDB4MjQsMHg4MCwweDAyLDB4NjUsMHgyOCwweDIxLDB4MDAsMHhhNCwweDI4LDB4MjEsMHgwMCwweDQ2LDB4MTAsMHgyMSwKKzB4MDAsMHgxNywweDFjLDB4MDAsMHgzYywweDA0LDB4YzAsMHgwMCwweDAwLDB4NDMsMHgzMCwweDIxLDB4MTYsMHg4MCwweDAwLDB4MjksCisweDAwLDB4YTQsMHgyOCwweDIxLDB4M2MsMHgwMiwweGIwLDB4MDUsMHgzNCwweDQyLDB4MDQsMHgwMCwweDNjLDB4MDMsMHhiMCwweDA1LAorMHgzYywweDA0LDB4YjAsMHgwNSwweGFjLDB4NDYsMHgwMCwweDAwLDB4MzQsMHg2MywweDA0LDB4MDQsMHgzNCwweDg0LDB4MDIsMHgyOCwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHhhYywweDY1LDB4MDAsMHgwMCwweGEwLDB4ODIsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDksCisweDM0LDB4NDIsMHgwMSwweDQ2LDB4OTAsMHg0NCwweDAwLDB4MDAsMHg5MSwweGUzLDB4MDAsMHgwOSwweDMwLDB4ODYsMHgwMCwweDAxLAorMHgwMiwweDgzLDB4MTgsMHgyNiwweDAwLDB4MDMsMHgzMCwweDBiLDB4MTQsMHhjMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MjgsMHgyMSwKKzB4MTMsMHhjMCwweDAwLDB4MDMsMHgwMiwweGIzLDB4MTAsMHgyMSwweDI0LDB4MDUsMHgwMCwweDAxLDB4MDIsMHhiMywweDEwLDB4MjEsCisweDI3LDB4ODMsMHg4ZiwweGY4LDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDg0LDB4NDgsMHgwMCwweDA0LAorMHgwMCwweGEwLDB4MzAsMHgyMSwweDAwLDB4ZTAsMHgyMCwweDIxLDB4MDIsMHg4MCwweDI4LDB4MjEsMHgwMiwweGMwLDB4MzgsMHgyMSwKKzB4MGMsMHgwMCwweDAwLDB4NzIsMHhhZiwweGE4LDB4MDAsMHgxMCwweDdiLDB4YmUsMHgwMiwweGJjLDB4N2IsMHhiNiwweDAyLDB4N2MsCisweDdiLDB4YjQsMHgwMiwweDNjLDB4N2IsMHhiMiwweDAxLDB4ZmMsMHg3YiwweGIwLDB4MDEsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHg1OCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTIsMHg4MiwweDAwLDB4M2QsMHgzYywweDAyLDB4YjAsMHgwNSwKKzB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMiwweDgyLDB4MDAsMHgzMSwweDNjLDB4MDIsMHhiMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MDMsCisweDEyLDB4ODIsMHgwMCwweDI1LDB4M2MsMHgwMiwweGIwLDB4MDUsMHgyNCwweDAyLDB4MDAsMHgxMCwweDEyLDB4ODIsMHgwMCwweDE5LAorMHgzYywweDAyLDB4YjAsMHgwNSwweDI0LDB4MDIsMHgwMCwweDExLDB4MTIsMHg4MiwweDAwLDB4MGQsMHgzYywweDAyLDB4YjAsMHgwNSwKKzB4MjQsMHgwMiwweDAwLDB4MTIsMHgxNiwweDgyLDB4ZmYsMHhkMSwweDNjLDB4MDIsMHhiMCwweDA1LDB4M2MsMHgwMywweGIwLDB4MDUsCisweDM0LDB4NDIsMHgwNCwweDIwLDB4M2MsMHgwNCwweGIwLDB4MDUsMHgzNCwweDYzLDB4MDQsMHgyNCwweGFjLDB4NDYsMHgwMCwweDAwLAorMHgzNCwweDg0LDB4MDIsMHgyOCwweGFjLDB4NjUsMHgwMCwweDAwLDB4MDgsMHgwMCwweDA3LDB4ZTIsMHgyNCwweDAyLDB4MDAsMHgyMCwKKzB4MzQsMHg0MiwweDA0LDB4NDAsMHgzYywweDAzLDB4YjAsMHgwNSwweDNjLDB4MDQsMHhiMCwweDA1LDB4YWMsMHg0NiwweDAwLDB4MDAsCisweDM0LDB4NjMsMHgwNCwweDQ0LDB4MzQsMHg4NCwweDAyLDB4MjgsMHgyNCwweDAyLDB4MDAsMHg0MCwweDA4LDB4MDAsMHgwNywweGUyLAorMHhhYywweDY1LDB4MDAsMHgwMCwweDM0LDB4NDIsMHgwNCwweDI4LDB4M2MsMHgwMywweGIwLDB4MDUsMHgzYywweDA0LDB4YjAsMHgwNSwKKzB4YWMsMHg0NiwweDAwLDB4MDAsMHgzNCwweDYzLDB4MDQsMHgyYywweDM0LDB4ODQsMHgwMiwweDI4LDB4MjQsMHgwMiwweGZmLDB4ODAsCisweDA4LDB4MDAsMHgwNywweGUyLDB4YWMsMHg2NSwweDAwLDB4MDAsMHgzNCwweDQyLDB4MDQsMHgxOCwweDNjLDB4MDMsMHhiMCwweDA1LAorMHgzYywweDA0LDB4YjAsMHgwNSwweGFjLDB4NDYsMHgwMCwweDAwLDB4MzQsMHg2MywweDA0LDB4MWMsMHgzNCwweDg0LDB4MDIsMHgyOCwKKzB4MjQsMHgwMiwweDAwLDB4MDgsMHgwOCwweDAwLDB4MDcsMHhlMiwweGFjLDB4NjUsMHgwMCwweDAwLDB4MzQsMHg0MiwweDA0LDB4MTAsCisweDNjLDB4MDMsMHhiMCwweDA1LDB4M2MsMHgwNCwweGIwLDB4MDUsMHhhYywweDQ2LDB4MDAsMHgwMCwweDM0LDB4NjMsMHgwNCwweDE0LAorMHgzNCwweDg0LDB4MDIsMHgyOCwweDI0LDB4MDIsMHgwMCwweDA0LDB4MDgsMHgwMCwweDA3LDB4ZTIsMHhhYywweDY1LDB4MDAsMHgwMCwKKzB4MzQsMHg0MiwweDA0LDB4MDgsMHgzYywweDAzLDB4YjAsMHgwNSwweDNjLDB4MDQsMHhiMCwweDA1LDB4YWMsMHg0NiwweDAwLDB4MDAsCisweDM0LDB4NjMsMHgwNCwweDBjLDB4MzQsMHg4NCwweDAyLDB4MjgsMHgyNCwweDAyLDB4MDAsMHgwMiwweDA4LDB4MDAsMHgwNywweGUyLAorMHhhYywweDY1LDB4MDAsMHgwMCwweDI0LDB4MTcsMHgwMCwweDE0LDB4MDgsMHgwMCwweDA3LDB4YjQsMHgyNCwweDEzLDB4MDEsMHgwMiwKKzB4MzAsMHhhMiwweDAwLDB4MDcsMHgyNCwweDQ0LDB4MDAsMHgwYywweDAwLDB4OTAsMHgxOCwweDJiLDB4MTAsMHg2MCwweDAwLDB4MGMsCisweDI2LDB4MDIsMHgwMCwweDA0LDB4MjcsMHg4NSwweGJiLDB4MGMsMHgwMCwweDEwLDB4MTAsMHg0MCwweDAwLDB4NTAsMHgxMCwweDIxLAorMHgwMCwweDQ1LDB4MTAsMHgyMSwweDkwLDB4NTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkwLDB4MTgsMHgyYiwKKzB4MTQsMHg2MCwweGZmLDB4ZmEsMHgwMCwweDEwLDB4MTAsMHg0MCwweDJlLDB4MDYsMHgwMCwweDBjLDB4MjYsMHgwMiwweDAwLDB4MDQsCisweDA4LDB4MDAsMHgwNywweDllLDB4MDAsMHg0NiwweDgwLDB4MGEsMHgyNywweDgyLDB4YjMsMHhmMCwweDAxLDB4ODIsMHgyMCwweDIxLAorMHg4YywweDg3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHhlMiwweDAwLDB4MTksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTQsMHg0MCwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODIsMHg5MCwweDEwLDB4MDAsMHhjMiwweDEwLDB4MjEsCisweDkwLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDYwLDB4MDAsMHgxNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5MCwweGUzLDB4MDAsMHgxNiwweDI3LDB4ODIsMHg4ZiwweGY4LDB4MDAsMHhjMiwweDEwLDB4MjEsMHgzNCwweDYzLDB4MDAsMHgyMCwKKzB4OTAsMHg1MCwweDAwLDB4MDcsMHhhMCwweGUzLDB4MDAsMHgxNiwweDhjLDB4ODQsMHgwMCwweDAwLDB4MDAsMHgwYSwweDFlLDB4NDIsCisweDI0LDB4MDYsMHgwMCwweDAxLDB4OTAsMHg4MiwweDAwLDB4MTYsMHgzMCwweDcxLDB4MDAsMHgwMiwweDMwLDB4NzIsMHgwMCwweDNmLAorMHgzMCwweDQyLDB4MDAsMHhmYiwweDI0LDB4MTcsMHgwMCwweDE4LDB4MjQsMHgxMywweDAxLDB4MDMsMHgyNCwweDE1LDB4MDgsMHgxOCwKKzB4YWYsMHhhNiwweDAwLDB4MWMsMHgwOCwweDAwLDB4MDcsMHhiZSwweGEwLDB4ODIsMHgwMCwweDE2LDB4OGQsMHgwMiwweDAwLDB4MDQsCisweDAwLDB4MGEsMHgxYywweDQyLDB4MzAsMHg0MiwweDAwLDB4MTAsMHgxNCwweDQwLDB4MDAsMHgxNSwweDMwLDB4NzIsMHgwMCwweDNmLAorMHg4MSwweDIyLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MTEsMHgzMCwweDcyLDB4MDAsMHgzZSwKKzB4MjcsMHg4MywweDkwLDB4MDgsMHgwMCwweGMzLDB4MTgsMHgyMSwweDgwLDB4NjQsMHgwMCwweDAwLDB4MjcsMHg4MywweGI1LDB4NjgsCisweDAwLDB4MDQsMHgxMSwweDAwLDB4MDAsMHg0NCwweDEwLDB4MjMsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDQsMHgxMCwweDIzLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLDB4OTAsMHg0NCwweDAwLDB4MDUsMHg5MCwweDQzLDB4MDAsMHgwNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDY0LDB4MTgsMHgyNCwweDMwLDB4NjMsMHgwMCwweDAxLDB4MDIsMHg0MywweDkwLDB4MjUsCisweDI3LDB4ODUsMHhiMywweGYwLDB4MDEsMHg4NSwweDI4LDB4MjEsMHg4YywweGE2LDB4MDAsMHgwMCwweDAxLDB4NzMsMHgxMCwweDIxLAorMHgyNywweDgzLDB4OTAsMHgwMCwweDkwLDB4YzQsMHgwMCwweDE2LDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4MzAsMHg4NCwweDAwLDB4ZGYsMHg5MCwweDUwLDB4MDAsMHgwMCwweGEwLDB4YzQsMHgwMCwweDE2LDB4ODAsMHhjNiwweDAwLDB4MTIsCisweDhjLDB4YTMsMHgwMCwweDAwLDB4MmQsMHhjNCwweDAwLDB4MDIsMHhhZiwweGE2LDB4MDAsMHgxYywweDkwLDB4NjIsMHgwMCwweDE2LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweGZiLDB4MTQsMHg4MCwweDAwLDB4MDYsMHhhMCwweDYyLDB4MDAsMHgxNiwKKzB4MjQsMHgwMiwweDAwLDB4MDYsMHgxMSwweGMyLDB4MDAsMHgwMywweDI0LDB4MDIsMHgwMCwweDA0LDB4MTUsMHhjMiwweGZmLDB4MGUsCisweDMyLDB4NTEsMHgwMCwweDAyLDB4MzIsMHg1MSwweDAwLDB4MDIsMHgyZSwweDAyLDB4MDAsMHgwYywweDE0LDB4NDAsMHgwMCwweDBmLAorMHgwMCwweDExLDB4MTgsMHgyYiwweDMyLDB4MDIsMHgwMCwweDBmLDB4MzQsMHg0MiwweDAwLDB4MTAsMHgwMCwweDAzLDB4MTksMHgwMCwKKzB4MDAsMHg0MywweDE4LDB4MjEsMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMCwweGI4LDB4YTAsMHg0MywweDAwLDB4MDAsCisweDAwLDB4MDAsMHgyMCwweDIxLDB4MDIsMHgwMCwweDI4LDB4MjEsMHgwYywweDAwLDB4MDIsMHgwNSwweGFmLDB4YWYsMHgwMCwweDI4LAorMHg4ZiwweGFmLDB4MDAsMHgyOCwweDA4LDB4MDAsMHgwNywweGJlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDgsMHhiOSwKKzB4MzIsMHgwMywweDAwLDB4ZmYsMHgzYywweDAzLDB4YjAsMHgwNSwweDM0LDB4NjMsMHgwMiwweDQyLDB4OTAsMHg2MiwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MGYsMHgxNCwweDQwLDB4ZmUsMHhhYSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5MSwweGUyLDB4MDAsMHgwOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHg4MiwweDEwLDB4MjYsMHgwOCwweDAwLDB4MDcsMHg3NSwKKzB4MDAsMHgwMiwweDI4LDB4MGIsMHgwOCwweDAwLDB4MDcsMHg3YiwweDAwLDB4MDAsMHhiMCwweDIxLDB4MjQsMHgwMiwweDAwLDB4MTAsCisweDEwLDB4YzIsMHgwMCwweDA4LDB4MjQsMHgwMiwweDAwLDB4MTEsMHgxMCwweGMyLDB4ZmUsMHg3ZCwweDAwLDB4MDcsMHgxNywweDgzLAorMHgyNCwweDAyLDB4MDAsMHgxMiwweDE0LDB4YzIsMHhmZSwweDdiLDB4MDAsMHgwNywweDE3LDB4NDMsMHgwOCwweDAwLDB4MDcsMHg1NSwKKzB4MzAsMHg1ZSwweDAwLDB4MDEsMHgwOCwweDAwLDB4MDcsMHg1NSwweDAwLDB4MDcsMHhmNywweGMyLDB4MDAsMHgwNCwweDEwLDB4NDAsCisweDI3LDB4ODMsMHg4MCwweDFjLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDgwLDB4NDAsMHgyMSwweDk0LDB4NDQsMHgwMCwweDAwLAorMHgyZCwweDA3LDB4MDAsMHgwNCwweDI0LDB4YzIsMHgwMCwweDAzLDB4MDAsMHg0NywweDMwLDB4MGEsMHgwMCwweDg2LDB4MDAsMHgxOCwKKzB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDIzLDB4N2MsCisweGFjLDB4NjIsMHgwMCwweDAwLDB4MmQsMHgwNiwweDAwLDB4MTAsMHgwMCwweDAwLDB4MjAsMHgxMiwweDAwLDB4MDQsMHgyMiwweDQyLAorMHgyNCwweDg0LDB4MDAsMHgwMSwweDI0LDB4ODMsMHgwMCwweGMwLDB4MTAsMHhlMCwweDAwLDB4MGIsMHgyNCwweDgyLDB4MDAsMHg2MCwKKzB4MDAsMHg0MCwweDIwLDB4MjEsMHgwMCwweDY1LDB4MjAsMHgwYSwweDNjLDB4MDMsMHhiMCwweDAzLDB4MzQsMHg2MywweDAxLDB4MDAsCisweDkwLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHgwMSwweDAwLDB4NDQsMHgyMCwweDA0LAorMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4ODAsMHgxMCwweDIxLDB4MjQsMHg4NSwweDAwLDB4MjgsMHgyNCwweDgzLDB4MDAsMHgyNCwKKzB4MzEsMHgwMiwweDAwLDB4MDgsMHgxNCwweGMwLDB4ZmYsMHhmNCwweDI0LDB4ODQsMHgwMCwweDE0LDB4MDAsMHg2MCwweDIwLDB4MjEsCisweDA4LDB4MDAsMHgwOCwweGY2LDB4MDAsMHhhMiwweDIwLDB4MGIsMHgyNywweGJkLDB4ZmYsMHhlMCwweDNjLDB4MDMsMHhiMCwweDAzLAorMHgzYywweDAyLDB4ODAsMHgwMCwweGFmLDB4YjAsMHgwMCwweDEwLDB4MjQsMHg0MiwweDI0LDB4MTgsMHgwMCwweDgwLDB4ODAsMHgyMSwKKzB4MzQsMHg2MywweDAwLDB4MjAsMHgzYywweDA0LDB4YjAsMHgwMywweGFmLDB4YjIsMHgwMCwweDE4LDB4YWYsMHhiMSwweDAwLDB4MTQsCisweGFmLDB4YmYsMHgwMCwweDFjLDB4ODMsMHhiMSwweDAwLDB4MzMsMHg4MywweGE4LDB4MDAsMHgzNywweDM0LDB4ODQsMHgwMSwweDEwLAorMHhhYywweDYyLDB4MDAsMHgwMCwweDJlLDB4MDIsMHgwMCwweDEwLDB4MDAsMHhlMCwweDkwLDB4MjEsMHg4YywweDg3LDB4MDAsMHgwMCwKKzB4MTQsMHg0MCwweDAwLDB4MGMsMHgyZSwweDAyLDB4MDAsMHgwYywweDNjLDB4MDIsMHgwMCwweDBmLDB4MzQsMHg0MiwweGYwLDB4MDAsCisweDAwLDB4ZTIsMHgxMCwweDI0LDB4MTQsMHg0MCwweDAwLDB4MzcsMHgzMiwweDAyLDB4MDAsMHgwOCwweDMyLDB4MDIsMHgwMCwweDA3LAorMHgyNywweDgzLDB4ODAsMHhjYywweDAwLDB4NDMsMHgxMCwweDIxLDB4OTAsMHg1MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MmUsMHgwMiwweDAwLDB4MGMsMHgxNCwweDQwLDB4MDAsMHgwMywweDAyLDB4MDAsMHgyMCwweDIxLDB4MzIsMHgwMiwweDAwLDB4MGYsCisweDI0LDB4NDQsMHgwMCwweDBjLDB4MDAsMHg4NywweDEwLDB4MDYsMHgzMCwweDQyLDB4MDAsMHgwMSwweDE0LDB4NDAsMHgwMCwweDA3LAorMHgyYywweDgyLDB4MDAsMHgwYywweDAwLDB4MDQsMHgxMCwweDgwLDB4MjcsMHg4MywweGI0LDB4NDAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4OGMsMHg0NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDJjLDB4ODIsMHgwMCwweDBjLDB4MTQsMHg0MCwweDAwLDB4MDUsCisweDAwLDB4MDUsMHgxMCwweDQwLDB4MDAsMHg0NiwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTEsMHgwMCwweDAwLDB4ODIsMHgxMCwweDIxLAorMHgyNCwweDQ0LDB4MDAsMHgwNCwweDE1LDB4MDAsMHgwMCwweDAyLDB4MjQsMHgwNiwweDAwLDB4MjAsMHgyNCwweDA2LDB4MDAsMHgwZSwKKzB4MGMsMHgwMCwweDA4LDB4ZGYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgzMCwweDIxLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDM0LDB4NDIsMHgwMSwweDAwLDB4OTAsMHg0MywweDAwLDB4MDAsMHgyZSwweDA0LDB4MDAsMHgwNCwweDI0LDB4MDIsMHgwMCwweDEwLAorMHgyNCwweDA1LDB4MDAsMHgwYSwweDAwLDB4NDQsMHgyOCwweDBhLDB4MzAsMHg2MywweDAwLDB4MDEsMHgxNCwweDYwLDB4MDAsMHgwMiwKKzB4MDAsMHgwNSwweDEwLDB4NDAsMHgwMCwweGEwLDB4MTAsMHgyMSwweDMwLDB4NDUsMHgwMCwweGZmLDB4MDAsMHhjNSwweDEwLDB4MjEsCisweDI0LDB4NDYsMHgwMCwweDQ2LDB4MDIsMHgyNiwweDE4LDB4MDQsMHhhNiwweDQzLDB4MDAsMHgwMCwweDhmLDB4YmYsMHgwMCwweDFjLAorMHg4ZiwweGIyLDB4MDAsMHgxOCwweDdiLDB4YjAsMHgwMCwweGJjLDB4MDAsMHhjMCwweDEwLDB4MjEsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MjcsMHhiZCwweDAwLDB4MjAsMHgxMCwweDQwLDB4ZmYsMHhjZiwweDJlLDB4MDIsMHgwMCwweDBjLDB4MzIsMHgwMiwweDAwLDB4MDcsCisweDI3LDB4ODMsMHg4MCwweGM0LDB4MDAsMHg0MywweDEwLDB4MjEsMHg5MCwweDQ0LDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwOSwweDI0LAorMHgwMiwweDA0LDB4ODAsMHgyMywweDI3LDB4YmQsMHhmZiwweGI4LDB4MDAsMHgwNSwweDM4LDB4ODAsMHgyNywweDgyLDB4YjMsMHhmMCwKKzB4YWYsMHhiZSwweDAwLDB4NDAsMHhhZiwweGI2LDB4MDAsMHgzOCwweGFmLDB4YjMsMHgwMCwweDJjLDB4YWYsMHhiZiwweDAwLDB4NDQsCisweGFmLDB4YjcsMHgwMCwweDNjLDB4YWYsMHhiNSwweDAwLDB4MzQsMHhhZiwweGI0LDB4MDAsMHgzMCwweGFmLDB4YjIsMHgwMCwweDI4LAorMHhhZiwweGIxLDB4MDAsMHgyNCwweGFmLDB4YjAsMHgwMCwweDIwLDB4MDAsMHhlMiwweDM4LDB4MjEsMHg4YywweGU2LDB4MDAsMHgwMCwKKzB4YWYsMHhhNSwweDAwLDB4NGMsMHgzYywweDAyLDB4ODAsMHgwMCwweDNjLDB4MDUsMHhiMCwweDAzLDB4MzQsMHhhNSwweDAwLDB4MjAsCisweDI0LDB4NDIsMHgyNSwweDc0LDB4MjQsMHgwMywweDAwLDB4MDEsMHhhYywweGEyLDB4MDAsMHgwMCwweGEwLDB4YzMsMHgwMCwweDEyLAorMHg4YywweGU1LDB4MDAsMHgwMCwweDk0LDB4YzMsMHgwMCwweDA2LDB4OTAsMHhhMiwweDAwLDB4MTYsMHhhNCwweGMzLDB4MDAsMHgxNCwKKzB4MjcsMHg4MywweDhmLDB4ZjAsMHgzNCwweDQyLDB4MDAsMHgwOCwweGEwLDB4YTIsMHgwMCwweDE2LDB4OGMsMHhlOCwweDAwLDB4MDAsCisweGFmLDB4YTQsMHgwMCwweDQ4LDB4MjcsMHg4MiwweDhmLDB4ZjQsMHg5NSwweDExLDB4MDAsMHgxNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDExLDB4OTgsMHhjMCwweDAyLDB4NzEsMHgyMCwweDIxLDB4MDAsMHgwNCwweDIwLDB4ODAsMHgwMCwweDgyLDB4MTAsMHgyMSwKKzB4OGMsMHg1MiwweDAwLDB4MTgsMHgwMCwweDgzLDB4MTgsMHgyMSwweDg0LDB4NzUsMHgwMCwweDA2LDB4OGUsMHg0NSwweDAwLDB4MDgsCisweDhlLDB4NDYsMHgwMCwweDA0LDB4OGUsMHg0NywweDAwLDB4MDQsMHgwMCwweDA1LDB4MWMsMHg4MiwweDAwLDB4MDYsMHgzMSwweDQyLAorMHgyNywweDgyLDB4OTAsMHgwMCwweDMwLDB4NjMsMHgwMCwweDAxLDB4MzAsMHhjNiwweDAwLDB4MDEsMHgwMCwweDgyLDB4MjAsMHgyMSwKKzB4YTUsMHgxNSwweDAwLDB4MWEsMHgwMCwweDA1LDB4MTQsMHg0MiwweGFmLDB4YTMsMHgwMCwweDE4LDB4YWYsMHhhNiwweDAwLDB4MWMsCisweDMwLDB4ZTcsMHgwMCwweDEwLDB4MzAsMHg1NiwweDAwLDB4MDEsMHg4MCwweDk3LDB4MDAsMHgwNiwweDE0LDB4ZTAsMHgwMCwweDQ3LAorMHgwMCwweDA1LDB4ZjcsMHhjMiwweDgwLDB4ODIsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHg0NCwKKzB4MDIsMHg3MSwweDEwLDB4MjEsMHg5MywweDkwLDB4YmIsMHhkOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MmUsMHgwMiwweDAwLDB4MGMsCisweDE0LDB4NDAsMHgwMCwweDA2LDB4MDIsMHgwMCwweDIwLDB4MjEsMHgwMCwweDE2LDB4MTAsMHg0MCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTEsMHgwMCwweDAyLDB4MDIsMHgxMCwweDIxLDB4MjQsMHg0NCwweDAwLDB4MDQsMHgwMiwweDcxLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNywweDgzLDB4OTAsMHgwMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHg4MCwweDgwLDB4MjEsCisweGEwLDB4NDQsMHgwMCwweDAzLDB4YTAsMHg0NCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MjAsMHgyMSwweDAyLDB4YzAsMHgyOCwweDIxLAorMHgwYywweDAwLDB4MDgsMHhkZiwweDAyLDB4YTAsMHgzMCwweDIxLDB4MDIsMHg3MSwweDE4LDB4MjEsMHgwMCwweDAzLDB4ODgsMHg4MCwKKzB4MDAsMHg0MCwweGEwLDB4MjEsMHgyNywweDgyLDB4OTAsMHgxMCwweDAyLDB4MjIsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MDAsCisweDI2LDB4ZTMsMHgwMCwweDAyLDB4MDAsMHgwMywweDE3LDB4YzIsMHgwMCwweDYyLDB4MTgsMHgyMSwweDAwLDB4MDQsMHgyNSwweGMyLAorMHgwMCwweDAzLDB4MTgsMHg0MywweDMwLDB4ODQsMHgwMCwweDAxLDB4MDAsMHgwMywweDE4LDB4NDAsMHgwMywweGM0LDB4MjAsMHgyNCwKKzB4MTQsMHg4MCwweDAwLDB4MTUsMHgwMiwweDQzLDB4MzgsMHgyMSwweDNjLDB4MDgsMHhiMCwweDAzLDB4MzUsMHgwOCwweDAwLDB4MjgsCisweDhkLDB4MDMsMHgwMCwweDAwLDB4OGYsMHhhNiwweDAwLDB4NGMsMHg4ZiwweGE0LDB4MDAsMHg0OCwweDI3LDB4ODIsMHg4ZiwweGY4LAorMHgwMiwweDIyLDB4MTAsMHgyMSwweDI0LDB4NjMsMHgwMCwweDAxLDB4MDIsMHhhMCwweDI4LDB4MjEsMHhhNCwweDU0LDB4MDAsMHgwNCwKKzB4MDAsMHhjMCwweDM4LDB4MjEsMHgwYywweDAwLDB4MDcsMHgyYiwweGFkLDB4MDMsMHgwMCwweDAwLDB4N2IsMHhiZSwweDAyLDB4M2MsCisweDdiLDB4YjYsMHgwMSwweGZjLDB4N2IsMHhiNCwweDAxLDB4YmMsMHg3YiwweGIyLDB4MDEsMHg3YywweDdiLDB4YjAsMHgwMSwweDNjLAorMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDQ4LDB4OGYsMHhhMiwweDAwLDB4MWMsMHg4ZiwweGE2LDB4MDAsMHgxOCwKKzB4MDIsMHgwMCwweDIwLDB4MjEsMHgwMiwweGMwLDB4MjgsMHgyMSwweGFmLDB4YTIsMHgwMCwweDEwLDB4MGMsMHgwMCwweDA5LDB4MDYsCisweGFmLDB4YTAsMHgwMCwweDE0LDB4MDgsMHgwMCwweDA5LDB4YzIsMHgwMiwweDgyLDB4YTAsMHgyMSwweDAyLDB4NzEsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4ODMsMHg5MCwweDAwLDB4MDAsMHg0MywweDEwLDB4MjEsMHg5MCwweDUwLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDA5LDB4YWUsMHhhMCwweDUwLDB4MDAsMHgwMywweDI3LDB4YmQsMHhmZiwweGI4LDB4YWYsMHhiMSwweDAwLDB4MjQsCisweDhmLDB4YjEsMHgwMCwweDVjLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDM0LDB4NjMsMHgwMCwweDIwLAorMHgyNCwweDQyLDB4MjcsMHg5OCwweGFmLDB4YmUsMHgwMCwweDQwLDB4YWYsMHhiNywweDAwLDB4M2MsMHhhZiwweGI2LDB4MDAsMHgzOCwKKzB4YWYsMHhiNSwweDAwLDB4MzQsMHhhZiwweGI0LDB4MDAsMHgzMCwweGFmLDB4YTUsMHgwMCwweDRjLDB4OGYsMHhiNSwweDAwLDB4NTgsCisweGFmLDB4YmYsMHgwMCwweDQ0LDB4YWYsMHhiMywweDAwLDB4MmMsMHhhZiwweGIyLDB4MDAsMHgyOCwweGFmLDB4YjAsMHgwMCwweDIwLAorMHgwMCwweGUwLDB4YjAsMHgyMSwweGFjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHg4MCwweGYwLDB4MjEsMHgwMCwweDAwLDB4YjgsMHgyMSwKKzB4MTYsMHgyMCwweDAwLDB4MmIsMHgwMCwweDAwLDB4YTAsMHgyMSwweDI3LDB4ODUsMHhiMywweGYwLDB4MDAsMHgwNywweDEwLDB4ODAsCisweDAwLDB4NDUsMHgxMCwweDIxLDB4OGMsMHg1MywweDAwLDB4MDAsMHgwMCwweDE1LDB4MTgsMHg4MCwweDAwLDB4NjUsMHgxOCwweDIxLAorMHg5MiwweDYyLDB4MDAsMHgxNiwweDhjLDB4NzIsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MDMsMHgxNCwweDQwLDB4MDAsMHgyZCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MiwweDQyLDB4MDAsMHgxNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MDMsCisweDE0LDB4NDAsMHgwMCwweDI4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4YywweDgyLDB4MDAsMHgzNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNCwweDQwLDB4MDAsMHgxOCwweDAyLDB4MjAsMHgxMCwweDIxLDB4OGMsMHg4MiwweDAwLDB4MzgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTQsMHg0MCwweDAwLDB4MTQsMHgwMiwweDIwLDB4MTAsMHgyMSwweDhjLDB4ODIsMHgwMCwweDNjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE0LDB4NDAsMHgwMCwweDBmLDB4M2MsMHgwMywweGIwLDB4MDksMHgzYywweDA1LDB4YjAsMHgwNSwweDM0LDB4NjMsMHgwMSwweDQ0LAorMHgzNCwweGE1LDB4MDIsMHg1MiwweDk0LDB4NjYsMHgwMCwweDAwLDB4OTAsMHhhMiwweDAwLDB4MDAsMHg4ZiwweGEzLDB4MDAsMHg0YywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDYyLDB4MTAsMHgwNiwweDMwLDB4NDIsMHgwMCwweDAxLDB4MTAsMHg0MCwweDAwLDB4MDQsCisweDMwLDB4YzYsMHhmZiwweGZmLDB4MmMsMHhjMiwweDAwLDB4NDEsMHgxMCwweDQwLDB4MDAsMHgwOSwweDI0LDB4MDUsMHgwMCwweDE0LAorMHgwMiwweDIwLDB4MTAsMHgyMSwweDdiLDB4YmUsMHgwMiwweDNjLDB4N2IsMHhiNiwweDAxLDB4ZmMsMHg3YiwweGI0LDB4MDEsMHhiYywKKzB4N2IsMHhiMiwweDAxLDB4N2MsMHg3YiwweGIwLDB4MDEsMHgzYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4NDgsCisweDBjLDB4MDAsMHgwNywweDA2LDB4MjQsMHgwNiwweDAxLDB4MDcsMHgyNCwweDAyLDB4MDAsMHgwMSwweDA4LDB4MDAsMHgwYSwweDI4LAorMHhhMywweGMyLDB4MDAsMHgxMSwweDEwLDB4YzAsMHgwMCwweDFjLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGMyLDB4MDAsMHgxNywKKzB4MDAsMHhjMCwweDg4LDB4MjEsMHg5NiwweDU0LDB4MDAsMHgxYSwweDAyLDB4YTAsMHhiOCwweDIxLDB4MTIsMHgyMCwweGZmLDB4ZWQsCisweDAyLDB4MjAsMHgxMCwweDIxLDB4MjcsMHg4MywweGIzLDB4ZjAsMHgwMCwweDE3LDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHg4YywweDQ0LDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4MzQsMHg2MywweDAwLDB4MjgsMHg4MCwweDg2LDB4MDAsMHgxMiwKKzB4OGMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDE0LDB4MmMsMHgwMCwweDAwLDB4MDUsMHgyYywweDAzLDB4MDAsMHg0NiwweDEwLDB4MjEsCisweDhmLDB4YTYsMHgwMCwweDRjLDB4MDIsMHhlMCwweDM4LDB4MjEsMHgwMywweGMwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgwNywweDJiLAorMHhhYywweDYyLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwYSwweDI4LDB4YWYsMHhkMSwweDAwLDB4NDAsMHg5NiwweDc0LDB4MDAsMHgxYSwKKzB4MDgsMHgwMCwweDBhLDB4M2IsMHgwMiwweGMwLDB4YjgsMHgyMSwweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAxLDB4MDgsCisweDhjLDB4NTAsMHgwMCwweDAwLDB4MDIsMHg2MCwweDIwLDB4MjEsMHgwYywweDAwLDB4MWYsMHgxMSwweDAyLDB4MDAsMHgyOCwweDIxLAorMHgzMCwweDQyLDB4MDAsMHhmZiwweDAyLDB4MDAsMHgyOCwweDIxLDB4MDIsMHg0MCwweDIwLDB4MjEsMHgwYywweDAwLDB4MWYsMHgxMSwKKzB4YWYsMHhhMiwweDAwLDB4MTgsMHg4ZiwweGE0LDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg4MCwweDAwLDB4ZWQsCisweDMwLDB4NTAsMHgwMCwweGZmLDB4MTIsMHgwMCwweDAwLDB4MTgsMHgyNCwweDExLDB4MDAsMHgwMSwweDk2LDB4NjMsMHgwMCwweDE0LAorMHg5NiwweDQ0LDB4MDAsMHgxNCwweDI3LDB4ODUsMHg4ZiwweGYwLDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ1LDB4MTAsMHgyMSwweDAwLDB4MDQsMHgxOCwweGMwLDB4OGMsMHg0NiwweDAwLDB4MDgsCisweDAwLDB4NjQsMHgxOCwweDIxLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY1LDB4MTgsMHgyMSwweDAwLDB4MDYsMHgxNywweDAyLAorMHgyNCwweDA0LDB4MDAsMHhmZiwweDhjLDB4NjMsMHgwMCwweDA4LDB4MTAsMHg0NCwweDAwLDB4ZDYsMHgwMCwweDAzLDB4MTcsMHgwMiwKKzB4MTAsMHg0NCwweDAwLDB4ZDUsMHgzYywweDAyLDB4ODAsMHgwMCwweDAwLDB4NjYsMHgxOCwweDJiLDB4MjQsMHgxMSwweDAwLDB4MDIsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MDAsMHg0MywweDg4LDB4MGEsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEyLDB4MjIsMHgwMCwweDVhLAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDE2LDB4MjIsMHhmZiwweGJkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NiwweDQ5LDB4MDAsMHgxNCwKKzB4MjcsMHg4MiwweDhmLDB4ZjQsMHgwMiwweGEwLDB4YjgsMHgyMSwweDAwLDB4MDksMHg1MCwweGMwLDB4MDEsMHg0OSwweDE4LDB4MjEsCisweDAwLDB4MDMsMHg0MCwweDgwLDB4MDEsMHgwMiwweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4YywweDY1LDB4MDAsMHgwOCwweDhjLDB4NjIsMHgwMCwweDBjLDB4OGMsMHg2MiwweDAwLDB4MDQsMHgwMCwweDA1LDB4MjQsMHg0MiwKKzB4MDAsMHgwNSwweDFjLDB4ODIsMHgzMCwweDQyLDB4MDAsMHgxMCwweDMwLDB4NjYsMHgwMCwweDAxLDB4MTQsMHg0MCwweDAwLDB4NDEsCisweDMwLDB4ODcsMHgwMCwweDAxLDB4MjcsMHg4MiwweDkwLDB4MDgsMHgwMSwweDAyLDB4MTAsMHgyMSwweDgwLDB4NDQsMHgwMCwweDAwLAorMHgyNywweDgyLDB4YjUsMHg2OCwweDAwLDB4MDQsMHgxOSwweDAwLDB4MDAsMHg2NCwweDE4LDB4MjMsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MDAsMHg2NCwweDE4LDB4MjMsMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjIsMHgxMCwweDIxLDB4OTAsMHg0NSwweDAwLDB4MDUsCisweDI3LDB4ODQsMHhiNCwweDkwLDB4MDAsMHg2NCwweDE4LDB4MjEsMHg5MCwweDYzLDB4MDAsMHgwMCwweDEwLDB4YTAsMHgwMCwweDJiLAorMHgyYywweDY0LDB4MDAsMHgwYywweDE0LDB4ODAsMHgwMCwweDA0LDB4MDAsMHg2MCwweDEwLDB4MjEsMHgwMCwweDA2LDB4MTEsMHgwMCwKKzB4MDAsMHg2MiwweDEwLDB4MjEsMHgyNCwweDQyLDB4MDAsMHgyNCwweDNjLDB4MDEsMHhiMCwweDAzLDB4YTAsMHgyMiwweDAwLDB4YjksCisweDE0LDB4ODAsMHgwMCwweDA2LDB4MDAsMHg2MCwweDI4LDB4MjEsMHgwMCwweDA3LDB4MTAsMHg0MCwweDAwLDB4NDYsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTEsMHgwMCwweDAwLDB4NjIsMHgxMCwweDIxLDB4MjQsMHg0NSwweDAwLDB4MDQsMHgwMSwweDQ5LDB4MTAsMHgyMSwKKzB4MjcsMHg4MywweDkwLDB4MDAsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHhhMCwweDE4LDB4MjEsCisweGEwLDB4NDUsMHgwMCwweDAzLDB4YTAsMHg0NSwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwOCwweDEyLDB4MDIsMHgwMCwweDBiLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDAwLDB4NjAsMHgyOCwweDIxLDB4MDIsMHg0MCwweDIwLDB4MjEsMHgwYywweDAwLDB4MWYsMHg4ZCwKKzB4YWYsMHhhMiwweDAwLDB4MTAsMHgzMCwweDU0LDB4ZmYsMHhmZiwweDkyLDB4NDIsMHgwMCwweDE2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAyLDB4MDIsMHgxMCwweDI1LDB4MDgsMHgwMCwweDBhLDB4M2IsMHhhMiwweDQyLDB4MDAsMHgxNiwweDAwLDB4NjAsMHgyOCwweDIxLAorMHgwMiwweDQwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgxZiwweDNlLDB4YWYsMHhhMCwweDAwLDB4MTAsMHgwOCwweDAwLDB4MGEsMHhiZSwKKzB4MzAsMHg1NCwweGZmLDB4ZmYsMHgwOCwweDAwLDB4MGEsMHhhNiwweDAwLDB4NjAsMHgxMCwweDIxLDB4MTQsMHg4MCwweGZmLDB4ZmQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNiwweDExLDB4MDAsMHgwMCwweDYyLDB4MTAsMHgyMSwweDA4LDB4MDAsMHgwYSwweGE2LAorMHgyNCwweDQyLDB4MDAsMHgwNCwweDI3LDB4ODIsMHg5MCwweDAwLDB4MDEsMHgwMiwweDEwLDB4MjEsMHg5MCwweDQzLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDBhLDB4YjYsMHhhMCwweDQzLDB4MDAsMHgwMywweDk2LDB4NjksMHgwMCwweDE0LDB4MDIsMHhjMCwweGI4LDB4MjEsCisweDI0LDB4MGIsMHgwMCwweDAxLDB4MDAsMHgwOSwweDEwLDB4YzAsMHgwMCwweDQ5LDB4MTgsMHgyMSwweDAwLDB4MDMsMHg0MCwweDgwLAorMHgwMCwweDQwLDB4NTAsMHgyMSwweDI3LDB4ODIsMHg4ZiwweGY0LDB4MDEsMHgwMiwweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgxOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4YywweDY1LDB4MDAsMHgwOCwweDhjLDB4NjIsMHgwMCwweDBjLDB4OGMsMHg2MiwweDAwLDB4MDQsCisweDAwLDB4MDUsMHgyNCwweDQyLDB4MDAsMHgwNSwweDFjLDB4ODIsMHgzMCwweDQyLDB4MDAsMHgxMCwweDMwLDB4NjYsMHgwMCwweDAxLAorMHgxMCwweDQwLDB4MDAsMHgwZCwweDMwLDB4ODcsMHgwMCwweDAxLDB4MjcsMHg4MiwweDkwLDB4MDgsMHgwMSwweDAyLDB4MTAsMHgyMSwKKzB4ODAsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4NTgsMHgyMSwweDAwLDB4MDMsMHgxMSwweDAwLDB4MDAsMHg0MywweDEwLDB4MjMsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjMsMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4ODMsMHhiNSwweDYwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweGEwLDB4NDAsMHgwMCwweDA0LDB4MTEsMHg2MCwweDAwLDB4NGYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDEsMHg0OSwweDEwLDB4MjEsMHgwMCwweDAyLDB4MjAsMHg4MCwweDI3LDB4ODUsMHg5MCwweDAwLDB4MDAsMHg4NSwweDEwLDB4MjEsCisweDgwLDB4NDMsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDYwLDB4MDAsMHg0MiwweDAxLDB4NDksMHgxMCwweDIxLAorMHgyNywweDgyLDB4OTAsMHgwOCwweDAwLDB4ODIsMHgxMCwweDIxLDB4ODAsMHg0NCwweDAwLDB4MDAsMHgyNywweDgyLDB4YjUsMHg2OCwKKzB4MDAsMHgwNCwweDE5LDB4MDAsMHgwMCwweDY0LDB4MTgsMHgyMywweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2NCwweDE4LDB4MjMsCisweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2MiwweDEwLDB4MjEsMHg5MCwweDQ1LDB4MDAsMHgwNSwweDI3LDB4ODQsMHhiNCwweDkwLAorMHgwMCwweDY0LDB4MTgsMHgyMSwweDkwLDB4NjMsMHgwMCwweDAwLDB4MTAsMHhhMCwweDAwLDB4MmMsMHgyYywweDY0LDB4MDAsMHgwYywKKzB4MTQsMHg4MCwweDAwLDB4MDQsMHgwMCwweDYwLDB4MTAsMHgyMSwweDAwLDB4MDYsMHgxMSwweDAwLDB4MDAsMHg2MiwweDEwLDB4MjEsCisweDI0LDB4NDIsMHgwMCwweDI0LDB4M2MsMHgwMSwweGIwLDB4MDMsMHhhMCwweDIyLDB4MDAsMHhiOSwweDE0LDB4ODAsMHgwMCwweDA2LAorMHgwMCwweDYwLDB4MjgsMHgyMSwweDAwLDB4MDcsMHgxMCwweDQwLDB4MDAsMHg0NiwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTEsMHgwMCwKKzB4MDAsMHg2MiwweDEwLDB4MjEsMHgyNCwweDQ1LDB4MDAsMHgwNCwweDAxLDB4NDksMHgxMCwweDIxLDB4MjcsMHg4MywweDkwLDB4MDAsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweGEwLDB4MTgsMHgyMSwweGEwLDB4NDUsMHgwMCwweDAzLAorMHhhMCwweDQ1LDB4MDAsMHgwMCwweDhmLDB4YTQsMHgwMCwweDE4LDB4MjQsMHgwMiwweDAwLDB4MDgsMHgxMCwweDgyLDB4MDAsMHgwYywKKzB4MDAsMHg2MCwweDI4LDB4MjEsMHgyNCwweDAyLDB4MDAsMHgwMSwweDAyLDB4NjAsMHgyMCwweDIxLDB4MGMsMHgwMCwweDFmLDB4OGQsCisweGFmLDB4YTIsMHgwMCwweDEwLDB4OGYsMHhhMywweDAwLDB4MTgsMHgzMCwweDU0LDB4ZmYsMHhmZiwweDkyLDB4NjIsMHgwMCwweDE2LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NjIsMHgxMCwweDI1LDB4MDgsMHgwMCwweDBhLDB4M2IsMHhhMiwweDYyLDB4MDAsMHgxNiwKKzB4MDIsMHg2MCwweDIwLDB4MjEsMHgwYywweDAwLDB4MWYsMHgzZSwweGFmLDB4YTAsMHgwMCwweDEwLDB4MDgsMHgwMCwweDBiLDB4MmQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDBiLDB4MTUsMHgwMCwweDYwLDB4MTAsMHgyMSwweDE0LDB4ODAsMHhmZiwweGZkLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDYsMHgxMSwweDAwLDB4MDAsMHg2MiwweDEwLDB4MjEsMHgwOCwweDAwLDB4MGIsMHgxNSwKKzB4MjQsMHg0MiwweDAwLDB4MDQsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDUsMHgxMCwweDIxLDB4OTAsMHg0MywweDAwLDB4MDAsCisweDA4LDB4MDAsMHgwYiwweDI1LDB4YTAsMHg0MywweDAwLDB4MDMsMHgyNywweDg1LDB4OTAsMHgwMCwweDA4LDB4MDAsMHgwYiwweDQxLAorMHgwMSwweDQ5LDB4MTAsMHgyMSwweDNjLDB4MDIsMHg4MCwweDAwLDB4MDAsMHg2MiwweDE4LDB4MjYsMHgwOCwweDAwLDB4MGEsMHg3NiwKKzB4MDAsMHhjMiwweDMwLDB4MjYsMHgxMiwweDAwLDB4ZmYsMHgyZCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MDgsMHgwMCwweDBhLDB4N2IsCisweDI0LDB4MTEsMHgwMCwweDAyLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGQwLAorMHgyNCwweDQyLDB4MmQsMHg0NCwweDM0LDB4NjMsMHgwMCwweDIwLDB4M2MsMHgwNSwweGIwLDB4MDUsMHhhZiwweGIzLDB4MDAsMHgyNCwKKzB4YWYsMHhiMiwweDAwLDB4MjAsMHhhZiwweGIxLDB4MDAsMHgxYywweGFmLDB4YmYsMHgwMCwweDI4LDB4YWYsMHhiMCwweDAwLDB4MTgsCisweGFjLDB4NjIsMHgwMCwweDAwLDB4MzQsMHhhNSwweDAyLDB4NDIsMHg5MCwweGEyLDB4MDAsMHgwMCwweDAwLDB4ODAsMHg5MCwweDIxLAorMHgyNCwweDExLDB4MDAsMHgxMCwweDMwLDB4NTMsMHgwMCwweGZmLDB4MjQsMHgwMiwweDAwLDB4MTAsMHgxMiwweDIyLDB4MDAsMHhjZiwKKzB4MDAsMHgwMCwweDE4LDB4MjEsMHgyNCwweDAyLDB4MDAsMHgxMSwweDEyLDB4MjIsMHgwMCwweGMxLDB4MjQsMHgwMiwweDAwLDB4MTIsCisweDEyLDB4MjIsMHgwMCwweGI0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDYwLDB4MDAsMHhhZCwweGFlLDB4NDMsMHgwMCwweDQwLAorMHgzYywweDAyLDB4YjAsMHgwNSwweDM0LDB4NDIsMHgwMiwweDJjLDB4OGMsMHg0NCwweDAwLDB4MDAsMHgzYywweDAzLDB4MDAsMHgwMiwKKzB4MzQsMHg2MywweDAwLDB4ZmYsMHgwMCwweDgzLDB4ODAsMHgyNCwweDAwLDB4MTAsMHgxNCwweDQzLDB4MTAsMHg0MCwweDAwLDB4MDUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGUsMHg0MiwweDAwLDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDkyLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDkzLDB4ODMsMHg4YiwweDYxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDYyLDB4MDAsMHgwMiwKKzB4MTAsMHg0MCwweDAwLDB4MDQsMHgzMiwweDEwLDB4MDAsMHhmZiwweDAwLDB4MTAsMHgxMSwweGMzLDB4MTQsMHg0MCwweDAwLDB4ODYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTYsMHgwMCwweDAwLDB4MTUsMHgwMiwweDAwLDB4MTAsMHgyMSwweDI2LDB4MjIsMHgwMCwweDAxLAorMHgzMCwweDUxLDB4MDAsMHhmZiwweDJlLDB4MjMsMHgwMCwweDEzLDB4MTQsMHg2MCwweGZmLDB4ZGIsMHgyNCwweDAzLDB4MDAsMHgwMiwKKzB4MTIsMHg2MywweDAwLDB4NzMsMHgyNCwweDAyLDB4MDAsMHgwNSwweDJhLDB4NjIsMHgwMCwweDAzLDB4MTAsMHg0MCwweDAwLDB4NTgsCisweDI0LDB4MDIsMHgwMCwweDA0LDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMiwweDYyLDB4MDAsMHg0YiwweDAyLDB4NDAsMHgyMCwweDIxLAorMHgzYywweDAyLDB4YjAsMHgwNSwweDM0LDB4NDIsMHgwMiwweDJjLDB4OGMsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg3MCwweDAwLDB4ZmYsMHgxMiwweDAwLDB4MDAsMHgwNiwweDAyLDB4MDAsMHgxMCwweDIxLDB4OGYsMHhiZiwweDAwLDB4MjgsCisweDdiLDB4YjIsMHgwMSwweDNjLDB4N2IsMHhiMCwweDAwLDB4ZmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDMwLAorMHg5MiwweDQ2LDB4MDAsMHgwNCwweDhlLDB4NDMsMHgwMCwweDI0LDB4MjQsMHgwMiwweDAwLDB4MDcsMHgwMiwweDQwLDB4MjAsMHgyMSwKKzB4MDAsMHgwMCwweDI4LDB4MjEsMHgyNCwweDA3LDB4MDAsMHgwNiwweGFmLDB4YTIsMHgwMCwweDEwLDB4MGMsMHgwMCwweDA5LDB4ZTYsCisweGFmLDB4YTMsMHgwMCwweDE0LDB4YWUsMHg0MiwweDAwLDB4MjQsMHgzYywweDAyLDB4YjAsMHgwNSwweDhjLDB4NDIsMHgwMiwweDJjLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NTAsMHgwMCwweGZmLDB4MTYsMHgwMCwweGZmLDB4ZWMsMHgwMiwweDAwLDB4MTAsMHgyMSwKKzB4OTIsMHg0NiwweDAwLDB4MDUsMHg4ZSwweDQzLDB4MDAsMHgyOCwweDI0LDB4MDIsMHgwMCwweDA1LDB4MDIsMHg0MCwweDIwLDB4MjEsCisweDI0LDB4MDUsMHgwMCwweDAxLDB4MjQsMHgwNywweDAwLDB4MDQsMHhhZiwweGEyLDB4MDAsMHgxMCwweDBjLDB4MDAsMHgwOSwweGU2LAorMHhhZiwweGEzLDB4MDAsMHgxNCwweGFlLDB4NDIsMHgwMCwweDI4LDB4M2MsMHgwMiwweGIwLDB4MDUsMHg4YywweDQyLDB4MDIsMHgyYywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDUwLDB4MDAsMHhmZiwweDE2LDB4MDAsMHhmZiwweGRjLDB4MDIsMHgwMCwweDEwLDB4MjEsCisweDkyLDB4NDYsMHgwMCwweDA2LDB4OGUsMHg0MywweDAwLDB4MmMsMHgyNCwweDAyLDB4MDAsMHgwMywweDAyLDB4NDAsMHgyMCwweDIxLAorMHgyNCwweDA1LDB4MDAsMHgwMiwweDAwLDB4MDAsMHgzOCwweDIxLDB4YWYsMHhhMiwweDAwLDB4MTAsMHgwYywweDAwLDB4MDksMHhlNiwKKzB4YWYsMHhhMywweDAwLDB4MTQsMHhhZSwweDQyLDB4MDAsMHgyYywweDNjLDB4MDIsMHhiMCwweDA1LDB4OGMsMHg0MiwweDAyLDB4MmMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg1MCwweDAwLDB4ZmYsMHgxNiwweDAwLDB4ZmYsMHhjYywweDAyLDB4MDAsMHgxMCwweDIxLAorMHg5MiwweDQ2LDB4MDAsMHgwNywweDhlLDB4NDMsMHgwMCwweDMwLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgwMiwweDQwLDB4MjAsMHgyMSwKKzB4MjQsMHgwNSwweDAwLDB4MDMsMHgyNCwweDA3LDB4MDAsMHgwMSwweGFmLDB4YTIsMHgwMCwweDEwLDB4MGMsMHgwMCwweDA5LDB4ZTYsCisweGFmLDB4YTMsMHgwMCwweDE0LDB4YWUsMHg0MiwweDAwLDB4MzAsMHgzYywweDAyLDB4YjAsMHgwNSwweDhjLDB4NDIsMHgwMiwweDJjLAorMHgwOCwweDAwLDB4MGIsMHg5NywweDMwLDB4NDIsMHgwMCwweGZmLDB4OTIsMHg0NiwweDAwLDB4MDQsMHg4ZSwweDQzLDB4MDAsMHgyNCwKKzB4MjQsMHgwMiwweDAwLDB4MDcsMHgwMCwweDAwLDB4MjgsMHgyMSwweDI0LDB4MDcsMHgwMCwweDA2LDB4YWYsMHhhMiwweDAwLDB4MTAsCisweDBjLDB4MDAsMHgwOSwweGU2LDB4YWYsMHhhMywweDAwLDB4MTQsMHgwOCwweDAwLDB4MGIsMHg5MCwweGFlLDB4NDIsMHgwMCwweDI0LAorMHgxMiwweDYyLDB4MDAsMHgwZCwweDI0LDB4MDIsMHgwMCwweDAzLDB4MjQsMHgwMiwweDAwLDB4MDgsMHgxNiwweDYyLDB4ZmYsMHhhOCwKKzB4MDIsMHg0MCwweDIwLDB4MjEsMHg5MiwweDQ2LDB4MDAsMHgwNywweDhlLDB4NDIsMHgwMCwweDMwLDB4MjQsMHgwNSwweDAwLDB4MDMsCisweDI0LDB4MDcsMHgwMCwweDAxLDB4YWYsMHhhMywweDAwLDB4MTAsMHgwYywweDAwLDB4MDksMHhlNiwweGFmLDB4YTIsMHgwMCwweDE0LAorMHgwOCwweDAwLDB4MGIsMHg5MCwweGFlLDB4NDIsMHgwMCwweDMwLDB4OTIsMHg0NiwweDAwLDB4MDYsMHg4ZSwweDQzLDB4MDAsMHgyYywKKzB4MDIsMHg0MCwweDIwLDB4MjEsMHgyNCwweDA1LDB4MDAsMHgwMiwweDAwLDB4MDAsMHgzOCwweDIxLDB4YWYsMHhhMiwweDAwLDB4MTAsCisweDBjLDB4MDAsMHgwOSwweGU2LDB4YWYsMHhhMywweDAwLDB4MTQsMHgwOCwweDAwLDB4MGIsMHg5MCwweGFlLDB4NDIsMHgwMCwweDJjLAorMHg5MiwweDQ2LDB4MDAsMHgwNSwweDhlLDB4NDMsMHgwMCwweDI4LDB4MDIsMHg0MCwweDIwLDB4MjEsMHgyNCwweDA1LDB4MDAsMHgwMSwKKzB4MjQsMHgwNywweDAwLDB4MDQsMHhhZiwweGEyLDB4MDAsMHgxMCwweDBjLDB4MDAsMHgwOSwweGU2LDB4YWYsMHhhMywweDAwLDB4MTQsCisweDA4LDB4MDAsMHgwYiwweDkwLDB4YWUsMHg0MiwweDAwLDB4MjgsMHgwYywweDAwLDB4MDEsMHg1OSwweDI0LDB4MDQsMHgwMCwweDAxLAorMHgwOCwweDAwLDB4MGIsMHg4MSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHg4NCwweGI0LDB4MzAsMHhhZSwweDQwLDB4MDAsMHgzNCwKKzB4OTQsMHg4NSwweDAwLDB4MTQsMHgwYywweDAwLDB4MWIsMHg4NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTMsMHg4MywweDhiLDB4NjEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MiwweDAwLDB4MDIsMHgxMCwweDQwLDB4ZmYsMHg2OSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwYywweDAwLDB4MDEsMHg1OSwweDAwLDB4MDAsMHgyMCwweDIxLDB4MDgsMHgwMCwweDBiLDB4NzksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDIsMHg0MCwweDIwLDB4MjEsMHgwYywweDAwLDB4MDksMHg1ZCwweDAyLDB4MjAsMHgyOCwweDIxLDB4MDgsMHgwMCwweDBiLDB4NmQsCisweDNjLDB4MDIsMHhiMCwweDA1LDB4OGUsMHg0MiwweDAwLDB4M2MsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHhmZiwweDRhLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4ODIsMHhiNCwweDM4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MCwweDQyLDB4MDAsMHgwYSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTgsMHgyYiwweDA4LDB4MDAsMHgwYiwweDZhLDB4YWUsMHg0MywweDAwLDB4M2MsCisweDhlLDB4NDIsMHgwMCwweDM4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4ZmYsMHgzZCwweDI0LDB4MDIsMHgwMCwweDEyLAorMHg4ZiwweDgyLDB4YjQsMHgzNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHg0MiwweDAwLDB4MGEsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMiwweDE4LDB4MmIsMHgwOCwweDAwLDB4MGIsMHg2YSwweGFlLDB4NDMsMHgwMCwweDM4LDB4OGUsMHg0MiwweDAwLDB4MzQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweGZmLDB4MzAsMHgyNCwweDAyLDB4MDAsMHgxMSwweDhmLDB4ODIsMHhiNCwweDMwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDkwLDB4NDIsMHgwMCwweDBhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTgsMHgyYiwKKzB4MDgsMHgwMCwweDBiLDB4NmEsMHhhZSwweDQzLDB4MDAsMHgzNCwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDI3LDB4YmQsMHhmZiwweGUwLDB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4MzAsMHhmOCwweDNjLDB4MDgsMHhiMCwweDAzLAorMHhhZiwweGIxLDB4MDAsMHgxNCwweGFjLDB4NjIsMHgwMCwweDAwLDB4MzUsMHgwOCwweDAxLDB4MDAsMHhhZiwweGJmLDB4MDAsMHgxOCwKKzB4YWYsMHhiMCwweDAwLDB4MTAsMHg5MSwweDAzLDB4MDAsMHgwMCwweDAwLDB4YTAsMHg0OCwweDIxLDB4MjQsMHgxMSwweDAwLDB4MGEsCisweDJjLDB4YTUsMHgwMCwweDA0LDB4MjQsMHgwMiwweDAwLDB4MTAsMHgwMCwweDQ1LDB4ODgsMHgwYSwweDMwLDB4NjMsMHgwMCwweDAxLAorMHgwMCwweGMwLDB4MjgsMHgyMSwweDE0LDB4NjAsMHgwMCwweDAyLDB4MDAsMHgxMSwweDQwLDB4NDAsMHgwMiwweDIwLDB4NDAsMHgyMSwKKzB4ODQsMHg4MywweDAwLDB4MGMsMHgzMSwweDExLDB4MDAsMHhmZiwweDAxLDB4MjAsMHgyMCwweDIxLDB4MDAsMHgwMywweDEwLDB4YzAsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNywweDgzLDB4OGYsMHhmOCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHg4NCwweDQzLDB4MDAsMHgwNCwweDI0LDB4MDYsMHgwMCwweDBlLDB4MTAsMHhlMCwweDAwLDB4MDYsMHgwMiwweDIzLDB4ODAsMHgyMSwKKzB4MDIsMHgwMCwweDEwLDB4MjEsMHg4ZiwweGJmLDB4MDAsMHgxOCwweDdiLDB4YjAsMHgwMCwweGJjLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDIwLDB4MGMsMHgwMCwweDA4LDB4ZGYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTEsMHgxOCwweDIxLAorMHgwOCwweDAwLDB4MGMsMHg2MCwweDAwLDB4NjIsMHg4MCwweDIxLDB4MjcsMHhiZCwweGZmLDB4ZDAsMHhhZiwweGJmLDB4MDAsMHgyOCwKKzB4YWYsMHhiNCwweDAwLDB4MjAsMHhhZiwweGIzLDB4MDAsMHgxYywweGFmLDB4YjIsMHgwMCwweDE4LDB4YWYsMHhiNSwweDAwLDB4MjQsCisweGFmLDB4YjEsMHgwMCwweDE0LDB4YWYsMHhiMCwweDAwLDB4MTAsMHg4NCwweDgyLDB4MDAsMHgwYywweDNjLDB4MDYsMHhiMCwweDAzLAorMHgzNCwweGM2LDB4MDAsMHgyMCwweDAwLDB4MDIsMHgxOCwweGMwLDB4MDAsMHg2MiwweDE4LDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MjcsMHg4MiwweDhmLDB4ZjQsMHgwMCwweDYyLDB4MTAsMHgyMSwweDhjLDB4NTUsMHgwMCwweDE4LDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDI0LDB4NDIsMHgzMSwweGE4LDB4YWMsMHhjMiwweDAwLDB4MDAsMHg4ZSwweGIwLDB4MDAsMHgwOCwweDI3LDB4ODIsMHg4ZiwweGY4LAorMHgwMCwweDYyLDB4MTgsMHgyMSwweDkwLDB4NzEsMHgwMCwweDA3LDB4MDAsMHgxMCwweDg2LDB4NDMsMHgzMiwweDEwLDB4MDAsMHgwMSwKKzB4MDAsMHhhMCwweDM4LDB4MjEsMHgwMiwweDAwLDB4MzAsMHgyMSwweDAwLDB4YTAsMHg5OCwweDIxLDB4MDIsMHgyMCwweDI4LDB4MjEsCisweDBjLDB4MDAsMHgwYywweDNlLDB4MDAsMHg4MCwweDkwLDB4MjEsMHgwMiwweDIwLDB4MjAsMHgyMSwweDAyLDB4MDAsMHgyOCwweDIxLAorMHgyNCwweDA2LDB4MDAsMHgxNCwweDBjLDB4MDAsMHgwOCwweGRmLDB4MDAsMHg0MCwweGEwLDB4MjEsMHg4NiwweDQzLDB4MDAsMHgwYywKKzB4M2MsMHgwOSwweGIwLDB4MDksMHgzYywweDA4LDB4YjAsMHgwOSwweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4MywweDkwLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDgwLDB4NDMsMHgwMCwweDA2LAorMHgzYywweDA3LDB4YjAsMHgwOSwweDNjLDB4MDUsMHhiMCwweDA5LDB4MjgsMHg2MiwweDAwLDB4MDAsMHgyNCwweDY0LDB4MDAsMHgwMywKKzB4MDAsMHg4MiwweDE4LDB4MGIsMHgwMCwweDAzLDB4MTgsMHg4MywweDNjLDB4MDIsMHhiMCwweDA5LDB4MDAsMHgwMywweDE4LDB4ODAsCisweDM0LDB4NDIsMHgwMSwweDAyLDB4MzUsMHgyOSwweDAxLDB4MTAsMHgzNSwweDA4LDB4MDEsMHgxNCwweDM0LDB4ZTcsMHgwMSwweDIwLAorMHgzNCwweGE1LDB4MDEsMHgyNCwweGE0LDB4NTQsMHgwMCwweDAwLDB4MTIsMHg2MCwweDAwLDB4MTEsMHgwMiwweGEzLDB4YTgsMHgyMSwKKzB4OGUsMHhhMiwweDAwLDB4MGMsMHg4ZSwweGEzLDB4MDAsMHgwOCwweDAwLDB4MDIsMHgxNCwweDAwLDB4MDAsMHgwMywweDFjLDB4MDIsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4YWQsMHgyMiwweDAwLDB4MDAsMHg4ZSwweGEzLDB4MDAsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAzLDB4MWMsMHgwMiwweGE1LDB4MDMsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MjgsMHg3YiwweGI0LDB4MDEsMHgzYywKKzB4N2IsMHhiMiwweDAwLDB4ZmMsMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MzAsCisweDhlLDB4YTIsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhZCwweDIyLDB4MDAsMHgwMCwweDhlLDB4YTQsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweGE1LDB4MDQsMHgwMCwweDAwLDB4N2EsMHhhMiwweDAwLDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMywweDFjLDB4MDAsMHgwMCwweDAyLDB4MTQsMHgwMiwweDAwLDB4NjIsMHgxOCwweDIxLDB4YWMsMHhlMywweDAwLDB4MDAsCisweDhlLDB4YTIsMHgwMCwweDBjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTQsMHgwMiwweDA4LDB4MDAsMHgwYywweGIyLAorMHhhNCwweGEyLDB4MDAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGUwLDB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGIwLDB4MDAsMHgxMCwKKzB4YWYsMHhiZiwweDAwLDB4MWMsMHhhZiwweGIxLDB4MDAsMHgxNCwweDg0LDB4ODIsMHgwMCwweDBjLDB4MDAsMHg4MCwweDkwLDB4MjEsCisweDNjLDB4MDUsMHhiMCwweDAzLDB4MDAsMHgwMiwweDIwLDB4YzAsMHgwMCwweDgyLDB4MjAsMHgyMSwweDAwLDB4MDQsMHgyMCwweDgwLAorMHgyNywweDgyLDB4OGYsMHhmNCwweDAwLDB4ODIsMHgxMCwweDIxLDB4OGMsMHg1MSwweDAwLDB4MTgsMHgzYywweDAyLDB4ODAsMHgwMCwKKzB4MzQsMHhhNSwweDAwLDB4MjAsMHgyNCwweDQyLDB4MzMsMHgyNCwweDI3LDB4ODMsMHg4ZiwweGY4LDB4YWMsMHhhMiwweDAwLDB4MDAsCisweDAwLDB4ODMsMHgyMCwweDIxLDB4M2MsMHgwMiwweGIwLDB4MDMsMHg5MCwweDg2LDB4MDAsMHgwNywweDM0LDB4NDIsMHgwMSwweDAwLAorMHg4ZSwweDIzLDB4MDAsMHgwOCwweDkwLDB4NDQsMHgwMCwweDAwLDB4MmMsMHhjNSwweDAwLDB4MDQsMHgyNCwweDAyLDB4MDAsMHgxMCwKKzB4MjQsMHgxMCwweDAwLDB4MGEsMHgwMCwweDQ1LDB4ODAsMHgwYSwweDAwLDB4MDMsMHgxZSwweDQzLDB4MzAsMHg4NCwweDAwLDB4MDEsCisweDMwLDB4NjUsMHgwMCwweDAxLDB4MTQsMHg4MCwweDAwLDB4MDIsMHgwMCwweDEwLDB4MTAsMHg0MCwweDAyLDB4MDAsMHgxMCwweDIxLAorMHgwMCwweGMwLDB4MjAsMHgyMSwweDI0LDB4MDYsMHgwMCwweDIwLDB4MGMsMHgwMCwweDA4LDB4ZGYsMHgzMCwweDUwLDB4MDAsMHhmZiwKKzB4ODYsMHg0NCwweDAwLDB4MGMsMHgyNywweDg1LDB4OTAsMHgwMCwweDNjLDB4MDYsMHhiMCwweDA5LDB4MDAsMHgwNCwweDE4LDB4YzAsCisweDAwLDB4NjQsMHgxOCwweDIxLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY1LDB4MTgsMHgyMSwweDgwLDB4NjQsMHgwMCwweDA2LAorMHgwMCwweDUwLDB4MTAsMHgyMSwweDM0LDB4YzYsMHgwMSwweDAyLDB4MjQsMHg4NSwweDAwLDB4MDMsMHgyOCwweDgzLDB4MDAsMHgwMCwKKzB4MDAsMHhhMywweDIwLDB4MGIsMHgwMCwweDA0LDB4MjAsMHg4MywweDAwLDB4MDQsMHgyMCwweDgwLDB4YTQsMHhjMiwweDAwLDB4MDAsCisweDAyLDB4MjQsMHgyMCwweDIxLDB4OGMsMHg4MywweDAwLDB4MDQsMHgzYywweDAyLDB4YjAsMHgwOSwweDM0LDB4NDIsMHgwMSwweDEwLAorMHhhYywweDQzLDB4MDAsMHgwMCwweDhjLDB4ODYsMHgwMCwweDA4LDB4M2MsMHgwMiwweGIwLDB4MDksMHgzNCwweDQyLDB4MDEsMHgxNCwKKzB4YTQsMHg0NiwweDAwLDB4MDAsMHg4YywweDg1LDB4MDAsMHgwYywweDhjLDB4ODIsMHgwMCwweDA4LDB4M2MsMHgwNiwweGIwLDB4MDksCisweDAwLDB4MDUsMHgyYywweDAwLDB4MDAsMHgwMiwweDE0LDB4MDIsMHgwMCwweGEyLDB4MjgsMHgyMSwweDM0LDB4YzYsMHgwMSwweDIwLAorMHhhYywweGM1LDB4MDAsMHgwMCwweDhjLDB4ODMsMHgwMCwweDBjLDB4M2MsMHgwNSwweGIwLDB4MDksMHgzNCwweGE1LDB4MDEsMHgyNCwKKzB4MDAsMHgwMywweDFjLDB4MDIsMHhhNCwweGEzLDB4MDAsMHgwMCwweDkyLDB4NDIsMHgwMCwweDBhLDB4M2MsMHgwMywweGIwLDB4MDksCisweDM0LDB4NjMsMHgwMSwweDMwLDB4MDAsMHgwMiwweDEzLDB4MDAsMHgyNCwweDQyLDB4MDAsMHgwNCwweDMwLDB4NDIsMHhmZiwweGZmLAorMHhhNCwweDYyLDB4MDAsMHgwMCwweDg2LDB4NDQsMHgwMCwweDBjLDB4MjcsMHg4MywweDkwLDB4MDgsMHg4ZiwweGJmLDB4MDAsMHgxYywKKzB4MDAsMHgwNCwweDEwLDB4YzAsMHgwMCwweDQ0LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDk0LDB4NDQsMHgwMCwweDAyLDB4OGYsMHhiMiwweDAwLDB4MTgsMHg3YiwweGIwLDB4MDAsMHhiYywweDNjLDB4MDUsMHhiMCwweDA5LAorMHgzNCwweGE1LDB4MDEsMHgzMiwweGE0LDB4YTQsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgyMCwKKzB4MjcsMHhiZCwweGZmLDB4ZTAsMHgzYywweDAyLDB4YjAsMHgwMywweDNjLDB4MDMsMHg4MCwweDAwLDB4YWYsMHhiMCwweDAwLDB4MTAsCisweDM0LDB4NDIsMHgwMCwweDIwLDB4MDAsMHhhMCwweDgwLDB4MjEsMHgyNCwweDYzLDB4MzQsMHhiMCwweDAwLDB4MDUsMHgyYywweDQzLAorMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4YmYsMHgwMCwweDE4LDB4YWMsMHg0MywweDAwLDB4MDAsMHgxMCwweGEwLDB4MDAsMHgwNSwKKzB4MDAsMHg4MCwweDg4LDB4MjEsMHg4YywweDgyLDB4MDAsMHgzNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4YjYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzIsMHgxMCwweDAwLDB4ZmYsMHgxMiwweDAwLDB4MDAsMHg0YywweDAwLDB4MDAsMHgxMCwweDIxLAorMHgyNCwweDAyLDB4MDAsMHgwOCwweDEyLDB4MDIsMHgwMCwweGEzLDB4MmEsMHgwMiwweDAwLDB4MDksMHgxMCwweDQwLDB4MDAsMHg4OSwKKzB4MjQsMHgwMiwweDAwLDB4NDAsMHgyNCwweDA0LDB4MDAsMHgwMiwweDEyLDB4MDQsMHgwMCwweDc5LDB4MmEsMHgwMiwweDAwLDB4MDMsCisweDEwLDB4NDAsMHgwMCwweDY5LDB4MjQsMHgwMiwweDAwLDB4MDQsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEyLDB4MDIsMHgwMCwweDVhLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhiMCwweDA1LDB4MzQsMHg0MiwweDAwLDB4MDgsMHgzYywweDAzLDB4ODAsMHgwMCwKKzB4YTIsMHgyMCwweDAwLDB4NGUsMHhhYywweDQzLDB4MDAsMHgwMCwweDgyLDB4MjQsMHgwMCwweDExLDB4OTIsMHgyNywweDAwLDB4MTEsCisweDEwLDB4ODAsMHgwMCwweDRlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MiwweDI2LDB4MDAsMHgwYSwweDI0LDB4MDIsMHgwMCwweDEyLAorMHgxMCwweDQ2LDB4MDAsMHgwOSwweDMwLDB4YzIsMHgwMCwweGZmLDB4MjcsMHg4MywweGIzLDB4ZjAsMHgwMCwweDAyLDB4MTAsMHg4MCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTQsMHg4MywweDAwLDB4MTQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4YTYsMHgyMywweDAwLDB4MGMsMHgzYywweDAyLDB4YjAsMHgwOSwweDM0LDB4NDIsMHgwMCwweDQwLAorMHg5MCwweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MywweDAwLDB4MDMsMHhhMiwweDIzLDB4MDAsMHgxMCwKKzB4MTQsMHg2MCwweDAwLDB4MmIsMHgzMCwweDY1LDB4MDAsMHgwMSwweDMwLDB4YzIsMHgwMCwweGZmLDB4MjcsMHg4MywweGIzLDB4ZjAsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgwMCwweDgyLDB4MjMsMHgwMCwweDEyLAorMHg5MCwweDgyLDB4MDAsMHgxNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDExLDB4NDIsMHgzMCwweDQyLDB4MDAsMHgwMSwKKzB4MDAsMHg2MiwweDE4LDB4MjEsMHgwMCwweDAzLDB4MjYsMHgwMCwweDE0LDB4ODAsMHgwMCwweDE4LDB4YTIsMHgyMywweDAwLDB4MTIsCisweDAwLDB4MDcsMHgxNiwweDAwLDB4MTQsMHg0MCwweDAwLDB4MTEsMHgyNCwweDAyLDB4MDAsMHgwMSwweDk2LDB4MjMsMHgwMCwweDBjLAorMHgyNywweDg0LDB4OTAsMHgwMCwweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwKKzB4MDAsMHg0NCwweDEwLDB4MjEsMHg4MCwweDQ1LDB4MDAsMHgwNiwweDAwLDB4MDMsMHgxYSwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDAsCisweDAwLDB4NjUsMHgxOCwweDIxLDB4MDAsMHg2MiwweDE4LDB4MjEsMHg5MCwweDY0LDB4MDAsMHgwMCwweDkwLDB4NjIsMHgwMCwweDA0LAorMHhhMiwweDIwLDB4MDAsMHgxNSwweGEzLDB4ODAsMHg4YiwweGM0LDB4MjQsMHgwMiwweDAwLDB4MDEsMHg4ZiwweGJmLDB4MDAsMHgxOCwKKzB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDIwLDB4MGMsMHgwMCwweDBjLDB4YzksCisweDAyLDB4MjAsMHgyMCwweDIxLDB4OTIsMHgyNywweDAwLDB4MTEsMHgwOCwweDAwLDB4MGQsMHg3OSwweDAwLDB4MDcsMHgxNiwweDAwLAorMHgwYywweDAwLDB4MGMsMHg2YSwweDAyLDB4MjAsMHgyMCwweDIxLDB4ODYsMHgyMywweDAwLDB4MGMsMHgyNywweDg0LDB4OGYsMHhmOCwKKzB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NCwweDIwLDB4MjEsCisweDkwLDB4ODUsMHgwMCwweDA3LDB4MjcsMHg4MywweDkwLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyMSwweGEyLDB4MjUsMHgwMCwweDEzLAorMHg5MCwweDgzLDB4MDAsMHgwNywweDA4LDB4MDAsMHgwZCwweDkxLDB4YTAsMHg0MywweDAwLDB4MDIsMHg5MiwweDI2LDB4MDAsMHgwYSwKKzB4MDgsMHgwMCwweDBkLDB4NWEsMHgzMCwweGMyLDB4MDAsMHhmZiwweDhlLDB4MjIsMHgwMCwweDI0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4NTAsMHgwMCwweDA3LDB4YTIsMHgyMCwweDAwLDB4MDgsMHgyNCwweDAyLDB4MDAsMHgwNywweGEyLDB4MjIsMHgwMCwweDBhLAorMHg5MiwweDIyLDB4MDAsMHgyNywweGFlLDB4MjAsMHgwMCwweDI0LDB4MDgsMHgwMCwweDBkLDB4NGQsMHhhMiwweDIyLDB4MDAsMHgwNCwKKzB4MDgsMHgwMCwweDBkLDB4YWIsMHgyNCwweDAyLDB4MDAsMHgwNiwweDE2LDB4MDIsMHhmZiwweDliLDB4M2MsMHgwMiwweGIwLDB4MDUsCisweDhlLDB4MjMsMHgwMCwweDJjLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweDYyLDB4MDAsMHgwNywweGEyLDB4MjQsMHgwMCwweDA4LAorMHgyNCwweDAyLDB4MDAsMHgwMywweGEyLDB4MjIsMHgwMCwweDBhLDB4OTIsMHgyMiwweDAwLDB4MmYsMHhhZSwweDIwLDB4MDAsMHgyYywKKzB4MDgsMHgwMCwweDBkLDB4NGQsMHhhMiwweDIyLDB4MDAsMHgwNiwweDA4LDB4MDAsMHgwZCwweGJhLDB4YTIsMHgyMCwweDAwLDB4MGEsCisweDhlLDB4MjIsMHgwMCwweDI4LDB4MjQsMHgwMywweDAwLDB4MDEsMHgyNCwweDA0LDB4MDAsMHgwMSwweDEwLDB4NDQsMHgwMCwweDA3LAorMHhhMiwweDIzLDB4MDAsMHgwOCwweDI0LDB4MDIsMHgwMCwweDA1LDB4YTIsMHgyMiwweDAwLDB4MGEsMHg5MiwweDIyLDB4MDAsMHgyYiwKKzB4YWUsMHgyMCwweDAwLDB4MjgsMHgwOCwweDAwLDB4MGQsMHg0ZCwweGEyLDB4MjIsMHgwMCwweDA1LDB4MDgsMHgwMCwweDBkLDB4YzYsCisweDI0LDB4MDIsMHgwMCwweDA0LDB4MTIsMHgwMiwweDAwLDB4MTIsMHgyYSwweDAyLDB4MDAsMHg0MSwweDEwLDB4NDAsMHgwMCwweDA5LAorMHgyNCwweDAyLDB4MDAsMHg4MCwweDI0LDB4MDIsMHgwMCwweDIwLDB4MTYsMHgwMiwweGZmLDB4N2IsMHgzYywweDAyLDB4YjAsMHgwNSwKKzB4MjQsMHgwMiwweDAwLDB4MTIsMHhhMiwweDIyLDB4MDAsMHgwYSwweGEyLDB4MjIsMHgwMCwweDA4LDB4MDgsMHgwMCwweDBkLDB4NGQsCisweGFlLDB4MjAsMHgwMCwweDNjLDB4MTYsMHgwMiwweGZmLDB4NzQsMHgzYywweDAyLDB4YjAsMHgwNSwweDI0LDB4MDIsMHgwMCwweDEwLAorMHhhMiwweDIyLDB4MDAsMHgwYSwweGEyLDB4MjIsMHgwMCwweDA4LDB4MDgsMHgwMCwweDBkLDB4NGQsMHhhZSwweDIwLDB4MDAsMHgzNCwKKzB4MjQsMHgwMiwweDAwLDB4MTEsMHhhMiwweDIyLDB4MDAsMHgwYSwweGEyLDB4MjIsMHgwMCwweDA4LDB4MDgsMHgwMCwweDBkLDB4NGQsCisweGFlLDB4MjAsMHgwMCwweDM4LDB4OGUsMHgyNCwweDAwLDB4MzAsMHgyNCwweDAyLDB4MDAsMHgwMywweDI0LDB4MDMsMHgwMCwweDAxLAorMHgxMCwweDgzLDB4MDAsMHgwNywweGEyLDB4MjIsMHgwMCwweDA4LDB4MjQsMHgwMiwweDAwLDB4MDIsMHhhMiwweDIyLDB4MDAsMHgwYSwKKzB4OTIsMHgyMiwweDAwLDB4MzMsMHhhZSwweDIwLDB4MDAsMHgzMCwweDA4LDB4MDAsMHgwZCwweDRkLDB4YTIsMHgyMiwweDAwLDB4MDcsCisweDA4LDB4MDAsMHgwZCwweGVjLDB4YTIsMHgyNCwweDAwLDB4MGEsMHg4ZiwweDg0LDB4YjQsMHgzMCwweGFlLDB4MjAsMHgwMCwweDM0LAorMHg5NCwweDg1LDB4MDAsMHgxNCwweDBjLDB4MDAsMHgxYiwweDg0LDB4MzIsMHgxMCwweDAwLDB4ZmYsMHgwOCwweDAwLDB4MGQsMHgzZSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MjQsMHg0MiwweDM3LDB4ZTQsCisweDM0LDB4NjMsMHgwMCwweDIwLDB4YWMsMHg2MiwweDAwLDB4MDAsMHg4MCwweGEyLDB4MDAsMHgxNSwweDNjLDB4MDYsMHhiMCwweDA1LAorMHgxMCwweDQwLDB4MDAsMHgwYSwweDM0LDB4YzYsMHgwMiwweDU0LDB4ODMsMHg4MywweDhiLDB4YzQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4YWMsMHg4MywweDAwLDB4MjQsMHg4YywweGMyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDE3LDB4NDIsCisweDMwLDB4NDIsMHgwMCwweDAxLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweDgyLDB4MDAsMHgyOCwweDhjLDB4ODIsMHgwMCwweDJjLAorMHgzYywweDA2LDB4YjAsMHgwNSwweDM0LDB4YzYsMHgwNCwweDUwLDB4MDAsMHgwMiwweDE4LDB4NDMsMHgzMCwweDYzLDB4MDAsMHgwMSwKKzB4MTAsMHg0MCwweDAwLDB4MDQsMHgzMCwweDQ1LDB4MDAsMHgwMSwweGFjLDB4ODMsMHgwMCwweDI4LDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGFjLDB4ODUsMHgwMCwweDI0LDB4OTAsMHhjMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweGZmLAorMHgzMCwweDQzLDB4MDAsMHgwMiwweDMwLDB4NDIsMHgwMCwweDAxLDB4YWMsMHg4MywweDAwLDB4MjgsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4YWMsMHg4MiwweDAwLDB4MjQsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MjcsMHhiZCwweGZmLDB4ZDgsCisweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDM4LDB4NzQsMHhhYywweDYyLDB4MDAsMHgwMCwweGFmLDB4YjEsMHgwMCwweDFjLAorMHhhZiwweGJmLDB4MDAsMHgyMCwweGFmLDB4YjAsMHgwMCwweDE4LDB4OTAsMHhhNiwweDAwLDB4MGEsMHgyNywweDgzLDB4YjMsMHhmMCwKKzB4MDAsMHhhMCwweDg4LDB4MjEsMHgwMCwweDA2LDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHg1MCwweDAwLDB4MDAsCisweDgwLDB4YTUsMHgwMCwweDExLDB4OTIsMHgwMywweDAwLDB4MTIsMHgxMCwweGEwLDB4MDAsMHgwNCwweGEyLDB4MjAsMHgwMCwweDE1LAorMHgyNCwweDAyLDB4MDAsMHgxMiwweDEwLDB4YzIsMHgwMCwweGRhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MiwweDIyLDB4MDAsMHgxMiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHg2NywweDAwLDB4MDAsMHgwMCwweDAwLDB4YTIsMHgyMCwweDAwLDB4MTIsCisweGEyLDB4MDAsMHgwMCwweDE5LDB4ODYsMHgyMywweDAwLDB4MGMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgxMCwweGMwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4MywweDkwLDB4MTAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4YTAsMHg0MCwweDAwLDB4MDAsMHg5MiwweDAzLDB4MDAsMHgxNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MywweDAwLDB4ZGYsCisweGEyLDB4MDMsMHgwMCwweDE2LDB4ODIsMHgwMiwweDAwLDB4MTIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDIwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDkyLDB4MjMsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDYwLDB4MDAsMHg0NSwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHhhMiwweDIwLDB4MDAsMHgwNCwweDkyLDB4MDgsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE1LDB4MDAsMHgwMCwweDFlLDB4MjQsMHgwMiwweDAwLDB4MDEsMHg5MiwweDA3LDB4MDAsMHgwYSwweGEyLDB4MDIsMHgwMCwweDE3LAorMHg5MiwweDAyLDB4MDAsMHgxNiwweDMwLDB4ZTMsMHgwMCwweGZmLDB4MzAsMHg0MiwweDAwLDB4ZTQsMHgxMCwweDYwLDB4MDAsMHgwMywKKzB4YTIsMHgwMiwweDAwLDB4MTYsMHgzNCwweDQyLDB4MDAsMHgwMSwweGEyLDB4MDIsMHgwMCwweDE2LDB4MTEsMHgwMCwweDAwLDB4MDUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTIsMHgwMiwweDAwLDB4MTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDM0LDB4NDIsMHgwMCwweDAyLAorMHhhMiwweDAyLDB4MDAsMHgxNiwweDkyLDB4MDIsMHgwMCwweDE3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NiwweDAyLDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4YTYsMHgwMiwweDAwLDB4MTQsCisweDhmLDB4YmYsMHgwMCwweDIwLDB4N2IsMHhiMCwweDAwLDB4ZmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDI4LAorMHg5NiwweDAyLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwZSwweDY4LDB4YTYsMHgwMiwweDAwLDB4MTQsMHg5MiwweDA3LDB4MDAsMHgwYSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweGUwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDBlLDB4NTQsCisweGEyLDB4MDAsMHgwMCwweDE3LDB4OTYsMHgwNCwweDAwLDB4MDAsMHg5NiwweDA1LDB4MDAsMHgwNiwweDI3LDB4ODYsMHg4ZiwweGYwLAorMHgwMCwweDA0LDB4MTgsMHhjMCwweDAwLDB4NjQsMHgxOCwweDIxLDB4MDAsMHgwNSwweDEwLDB4YzAsMHgwMCwweDQ1LDB4MTAsMHgyMSwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY2LDB4MTgsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NiwweDEwLDB4MjEsCisweDhjLDB4NjYsMHgwMCwweDA4LDB4OGMsMHg0NSwweDAwLDB4MDgsMHgzYywweDAzLDB4ODAsMHgwMCwweDAwLDB4YzMsMHgyMCwweDI0LAorMHgxMCwweDgwLDB4MDAsMHgwOCwweDAwLDB4YTMsMHgxMCwweDI0LDB4MTAsMHg0MCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MTgsMHgyMSwKKzB4MTAsMHg4MCwweDAwLDB4MDIsMHgyNCwweDAzLDB4MDAsMHgwMSwweDAwLDB4YTYsMHgxOCwweDJiLDB4MDgsMHgwMCwweDBlLDB4NTQsCisweGEyLDB4MDMsMHgwMCwweDE3LDB4MTAsMHg0MCwweGZmLDB4ZmQsMHgwMCwweGE2LDB4MTgsMHgyYiwweDA4LDB4MDAsMHgwZSwweDg4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NjIsMHgwMCwweDA5LDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweDYyLDB4MDAsMHgwNSwKKzB4MjQsMHgwMiwweDAwLDB4MDMsMHgxNCwweDYyLDB4ZmYsMHhiOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDBlLDB4NGUsCisweGEyLDB4MjAsMHgwMCwweDA3LDB4MDgsMHgwMCwweDBlLDB4NGUsMHhhMiwweDIwLDB4MDAsMHgwNiwweDA4LDB4MDAsMHgwZSwweDRlLAorMHhhMiwweDIwLDB4MDAsMHgwNSwweDgyLDB4MjIsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHg2OSwKKzB4MmMsMHg2MiwweDAwLDB4MDIsMHgxMCwweDQwLDB4MDAsMHg0OSwweDNjLDB4MDIsMHhiMCwweDA5LDB4OTIsMHgyNSwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHhhNiwweDAwLDB4ZmYsMHgyYywweGMyLDB4MDAsMHgwNCwweDEwLDB4NDAsMHgwMCwweDNiLAorMHgyYywweGMyLDB4MDAsMHgxMCwweDNjLDB4MDQsMHhiMCwweDA1LDB4MzQsMHg4NCwweDAyLDB4MjksMHg5MCwweDgzLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHgwMCwweGMyLDB4MTAsMHgwNCwweDAwLDB4MDIsMHgxMCwweDI3LDB4MDAsMHg2MiwweDE4LDB4MjQsCisweGEwLDB4ODMsMHgwMCwweDAwLDB4ODYsMHgyMywweDAwLDB4MGMsMHg5NiwweDI2LDB4MDAsMHgwYywweDAwLDB4MDMsMHgxMCwweGMwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgyOCwweDgwLDB4MjcsMHg4MywweDhmLDB4ZjQsMHgwMCwweGEzLDB4MTgsMHgyMSwKKzB4OGMsMHg2NCwweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4ODIsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NDIsMHgwMCwweDEwLDB4MTAsMHg0MCwweDAwLDB4MTgsMHgyNCwweDA3LDB4MDAsMHgwMSwweDkzLDB4ODIsMHg4YiwweDYxLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDAxLDB4MTQsMHg0MCwweDAwLDB4MGEsMHgyNCwweDA1LDB4MDAsMHgyNCwKKzB4MDAsMHgwNiwweDJjLDB4MDAsMHgwMCwweDA1LDB4MmMsMHgwMywweDBjLDB4MDAsMHgxYiwweDg0LDB4MDIsMHgwMCwweDIwLDB4MjEsCisweDkyLDB4MDIsMHgwMCwweDE2LDB4YTIsMHgwMCwweDAwLDB4MTIsMHgzMCwweDQyLDB4MDAsMHhlNywweDA4LDB4MDAsMHgwZSwweDQ1LAorMHhhMiwweDAyLDB4MDAsMHgxNiwweGYwLDB4YzUsMHgwMCwweDA2LDB4MDAsMHgwMCwweDI4LDB4MTIsMHgyNywweDgyLDB4OGYsMHhmMCwKKzB4MDAsMHhhMiwweDI4LDB4MjEsMHgwYywweDAwLDB4MDEsMHg0YiwweDNjLDB4MDQsMHgwMCwweDgwLDB4OTYsMHgyNiwweDAwLDB4MGMsCisweDA4LDB4MDAsMHgwZSwweGM1LDB4MDAsMHgwNiwweDJjLDB4MDAsMHgyNywweDgzLDB4OTAsMHgwMCwweDI3LDB4ODIsMHg5MCwweDA4LAorMHgwMCwweGEyLDB4MTAsMHgyMSwweDAwLDB4YTMsMHgxOCwweDIxLDB4OTAsMHg0NCwweDAwLDB4MDAsMHg5MCwweDY1LDB4MDAsMHgwNSwKKzB4OTMsMHg4MiwweDgwLDB4MTAsMHgwMCwweDAwLDB4MzAsMHgyMSwweDBjLDB4MDAsMHgyMSwweGY1LDB4YWYsMHhhMiwweDAwLDB4MTAsCisweDk2LDB4MjYsMHgwMCwweDBjLDB4MDgsMHgwMCwweDBlLDB4YmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHhmZiwweGNkLAorMHgzYywweDA0LDB4YjAsMHgwNSwweDM0LDB4ODQsMHgwMiwweDI5LDB4OTAsMHg4MywweDAwLDB4MDAsMHgzMCwweGE1LDB4MDAsMHgwZiwKKzB4MjQsMHgwMiwweDAwLDB4ODAsMHgwOCwweDAwLDB4MGUsMHhhZSwweDAwLDB4YTIsMHgxMCwweDA3LDB4ODYsMHgyNiwweDAwLDB4MGMsCisweDNjLDB4MDMsMHhiMCwweDA5LDB4MzQsMHg0MiwweDAxLDB4NzIsMHgzNCwweDYzLDB4MDEsMHg3OCwweDk0LDB4NDcsMHgwMCwweDAwLAorMHg4YywweDY1LDB4MDAsMHgwMCwweDAwLDB4MDYsMHgxMCwweGMwLDB4MDAsMHg0NiwweDEwLDB4MjEsMHgzYywweDA0LDB4YjAsMHgwOSwKKzB4YWUsMHgyNSwweDAwLDB4MWMsMHgzNCwweDg0LDB4MDEsMHg3YywweDI3LDB4ODMsMHg4ZiwweGY0LDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDhjLDB4ODUsMHgwMCwweDAwLDB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgxOCwweGFlLDB4MjUsMHgwMCwweDIwLAorMHhhNiwweDI3LDB4MDAsMHgxOCwweDhjLDB4NjYsMHgwMCwweDA4LDB4MDIsMHgyMCwweDIwLDB4MjEsMHgwYywweDAwLDB4MGYsMHgxNSwKKzB4MDAsMHgwMCwweDI4LDB4MjEsMHg4NiwweDI1LDB4MDAsMHgxOCwweDhlLDB4MjYsMHgwMCwweDFjLDB4OGUsMHgyNywweDAwLDB4MjAsCisweDAyLDB4MjAsMHgyMCwweDIxLDB4MGMsMHgwMCwweDFjLDB4ODYsMHhhZiwweGEyLDB4MDAsMHgxMCwweDA4LDB4MDAsMHgwZSwweDQ1LAorMHhhMiwweDAyLDB4MDAsMHgxMiwweDkyLDB4MjIsMHgwMCwweDA4LDB4MDgsMHgwMCwweDBlLDB4NDUsMHhhMiwweDIyLDB4MDAsMHgwOSwKKzB4YTIsMHgyMCwweDAwLDB4MTEsMHg4MCwweDgyLDB4MDAsMHg1MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MDMsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAwLDB4ZDAsMHhhYywweDQwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwZSwweDQ1LAorMHhhMCwweDgwLDB4MDAsMHg1MCwweDk0LDB4OGEsMHgwMCwweDBjLDB4MjQsMHgwMywweDAwLDB4MjQsMHgwMCwweDgwLDB4NzAsMHgyMSwKKzB4M2MsMHgwMiwweDgwLDB4MDAsMHgzYywweDA0LDB4YjAsMHgwMywweDI0LDB4NDIsMHgzYywweDU0LDB4ZjEsMHg0MywweDAwLDB4MDYsCisweDM0LDB4ODQsMHgwMCwweDIwLDB4MDAsMHgwMCwweDE4LDB4MTIsMHgwMCwweGEwLDB4NjgsMHgyMSwweGFjLDB4ODIsMHgwMCwweDAwLAorMHgyNywweDg1LDB4OTAsMHgwMCwweDI3LDB4ODIsMHg4ZiwweGZmLDB4MjcsMHhiZCwweGZmLDB4ZjgsMHgwMCwweDYyLDB4NjAsMHgyMSwKKzB4MDAsMHg2NSwweDU4LDB4MjEsMHgwMCwweDAwLDB4YzAsMHgyMSwweDExLDB4YTAsMHgwMCwweGNjLDB4MDAsMHgwMCwweDc4LDB4MjEsCisweDAwLDB4MGEsMHgxYywweDAwLDB4MDAsMHgwMywweDFjLDB4MDMsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDUsMHgxMCwweDIxLDB4OTEsMHg4NywweDAwLDB4MDAsMHg4MCwweDQ4LDB4MDAsMHgwNCwKKzB4MDMsMHhhMCwweDYwLDB4MjEsMHgwMCwweDBhLDB4MWMsMHgwMCwweDAwLDB4MDMsMHgxYywweDAzLDB4MDAsMHgwMywweDEwLDB4YzAsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDQ4LDB4ODAsMHgyNywweDgzLDB4OGYsMHhmNCwweGEzLDB4YTcsMHgwMCwweDAwLAorMHgwMSwweDIzLDB4MTgsMHgyMSwweDhjLDB4NjQsMHgwMCwweDE4LDB4MjUsMHgwMiwweGZmLDB4ZmYsMHgwMCwweDQ4LDB4NDAsMHgwYiwKKzB4OGMsMHg4MywweDAwLDB4MDQsMHgyZCwweDA1LDB4MDAsMHgwNywweDI0LDB4MDIsMHgwMCwweDA2LDB4MzAsMHg2MywweDAwLDB4MDgsCisweDE0LDB4NjAsMHgwMCwweDM1LDB4MDAsMHg0NSwweDQwLDB4MGEsMHg5MywweGE3LDB4MDAsMHgwMCwweDI3LDB4ODIsMHg5MCwweDA4LAorMHgwMSwweDIyLDB4MTAsMHgyMSwweDMwLDB4ZTMsMHgwMCwweGYwLDB4MzgsMHg2MywweDAwLDB4NTAsMHgzMCwweGU1LDB4MDAsMHhmZiwKKzB4MDAsMHgwNSwweDIwLDB4MmIsMHgwMCwweDAzLDB4MTgsMHgyYiwweDAwLDB4NjQsMHgxOCwweDI0LDB4OTAsMHg0OSwweDAwLDB4MDAsCisweDEwLDB4NjAsMHgwMCwweDE2LDB4MzAsMHhlNCwweDAwLDB4MGYsMHgyNCwweDAyLDB4MDAsMHgwNCwweDEwLDB4YTIsMHgwMCwweDlkLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDExLDB4YTAsMHgwMCwweDNhLDB4MmMsMHhhMiwweDAwLDB4MGMsMHgxMCwweDQwLDB4MDAsMHgwMiwKKzB4MjQsMHg4NCwweDAwLDB4MGMsMHgwMCwweGUwLDB4MjAsMHgyMSwweDMwLDB4ODQsMHgwMCwweGZmLDB4MDAsMHgwNCwweDEwLDB4NDAsCisweDI3LDB4ODMsMHhiYiwweDBjLDB4MDAsMHg0NCwweDEwLDB4MjEsMHgwMCwweDQzLDB4MTAsMHgyMSwweDkwLDB4NDcsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDJjLDB4ZTMsMHgwMCwweDBjLDB4YTMsMHhhNywweDAwLDB4MDAsMHgxMCwweDYwLDB4MDAsMHgwMiwKKzB4MjQsMHhlMiwweDAwLDB4MDQsMHgwMCwweGUwLDB4MTAsMHgyMSwweGEzLDB4YTIsMHgwMCwweDAwLDB4OTEsMHg2NSwweDAwLDB4MDAsCisweDkxLDB4ODIsMHgwMCwweDAwLDB4MzAsMHhhMywweDAwLDB4ZmYsMHgwMCwweDYyLDB4MTAsMHgyYiwweDEwLDB4NDAsMHgwMCwweDBlLAorMHgyYywweDYyLDB4MDAsMHgwYywweDE0LDB4NDAsMHgwMCwweDAzLDB4MDAsMHg2MCwweDIwLDB4MjEsMHgzMCwweGEyLDB4MDAsMHgwZiwKKzB4MjQsMHg0NCwweDAwLDB4MGMsMHgwMCwweDA0LDB4MTAsMHg0MCwweDAwLDB4NDQsMHgyMCwweDIxLDB4MjcsMHg4MywweGJiLDB4MGMsCisweDAwLDB4ODMsMHgxOCwweDIxLDB4OTAsMHg2MiwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDA1LAorMHgwMCwweDA5LDB4MTEsMHgwMCwweGExLDB4ODUsMHgwMCwweDAwLDB4OTMsMHhhMiwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MjcsMHhiZCwweDAwLDB4MDgsMHgwMCwweDQ5LDB4MTAsMHgyMywweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0OSwweDEwLDB4MjMsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NCwweDEwLDB4MjEsMHgyNywweDgzLDB4YjQsMHg5OCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHg5MCwweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MmMsMHg4MywweDAwLDB4MGMsMHgxNCwweDYwLDB4MDAsMHgwNiwKKzB4MDAsMHg4MCwweDEwLDB4MjEsMHgwMCwweDE4LDB4MTAsMHg0MCwweDAwLDB4NGYsMHgxMCwweDIxLDB4MDAsMHgwMiwweDExLDB4MDAsCisweDAwLDB4ODIsMHgxMCwweDIxLDB4MjQsMHg0MiwweDAwLDB4MDQsMHgwOCwweDAwLDB4MGYsMHg3NiwweGExLDB4ODIsMHgwMCwweDAwLAorMHg4ZiwweDhkLDB4ODEsMHg1YywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHhhOCwweDEwLDB4MjEsMHg5MCwweDQzLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDYwLDB4ZmYsMHhkMSwweDAwLDB4MDAsMHgyOCwweDIxLDB4MDAsMHgwNiwweDc0LDB4ODIsCisweDMwLDB4ZTIsMHgwMCwweGZmLDB4MmMsMHg0MiwweDAwLDB4MGMsMHgxNCwweDQwLDB4MDAsMHgwMywweDAwLDB4ZTAsMHgxMCwweDIxLAorMHgzMCwweGUyLDB4MDAsMHgwZiwweDI0LDB4NDIsMHgwMCwweDBjLDB4MzAsMHg0NCwweDAwLDB4ZmYsMHhhMywweGEyLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MGMsMHgxMCwweDgyLDB4MDAsMHgwZCwweDAwLDB4MDksMHgxMSwweDAwLDB4MDAsMHg0OSwweDEwLDB4MjMsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHgwNCwweDE4LDB4NDAsMHgwMCwweDQ5LDB4MTAsMHgyMywweDAwLDB4NjQsMHgxOCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MjcsMHg4NCwweGI0LDB4OTgsMHgwMCwweDQ0LDB4MTAsMHgyMSwKKzB4OTAsMHg0NywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGEzLDB4YTcsMHgwMCwweDAwLDB4MDAsMHgwYSwweDFjLDB4MDAsCisweDAwLDB4MDMsMHgxYywweDAzLDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgyNywweDgzLDB4OGYsMHhmNCwweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGMsMHg4MywweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NjMsMHgwMCwweDEwLDB4MTQsMHg2MCwweDAwLDB4MzMsCisweDAwLDB4MDYsMHgxNCwweDQyLDB4MDAsMHgwOSwweDExLDB4MDAsMHgwMCwweDQ5LDB4MTAsMHgyMywweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQ5LDB4MTAsMHgyMywweDI3LDB4ODMsMHhiNSwweDY4LDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4OTAsMHg0NCwweDAwLDB4MDQsMHg5MCwweDQzLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg2NCwweGMwLDB4MjQsCisweDkzLDB4YTcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyYywweGUyLDB4MDAsMHgwZiwweDEwLDB4NDAsMHgwMCwweDBmLAorMHgzMSwweGNmLDB4MDAsMHgwMSwweDAwLDB4MGEsMHgxYywweDAwLDB4MDAsMHgwMywweDFjLDB4MDMsMHgwMCwweDAzLDB4MTAsMHhjMCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4ODQsMHg4ZiwweGYwLDB4MDAsMHg0NCwweDEwLDB4MjEsCisweDg0LDB4NDMsMHgwMCwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyOCwweDYzLDB4MDYsMHg0MSwweDE0LDB4NjAsMHgwMCwweDA0LAorMHgzMCwweGUyLDB4MDAsMHhmZiwweDI0LDB4MDcsMHgwMCwweDBmLDB4YTMsMHhhNywweDAwLDB4MDAsMHgzMCwweGUyLDB4MDAsMHhmZiwKKzB4MmMsMHg0MiwweDAwLDB4MGMsMHgxNCwweDQwLDB4MDAsMHgwNiwweDAwLDB4ZTAsMHgxMCwweDIxLDB4MDAsMHgxOCwweDEwLDB4NDAsCisweDAwLDB4NGYsMHgxMCwweDIxLDB4MDAsMHgwMiwweDExLDB4MDAsMHgwMCwweDQ3LDB4MTAsMHgyMSwweDI0LDB4NDIsMHgwMCwweDA0LAorMHhhMywweGEyLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgzOCwweDIxLDB4MDEsMHhhOCwweDEwLDB4MjEsMHg5MCwweDQzLDB4MDAsMHgwMCwKKzB4MjQsMHhhNCwweDAwLDB4MDEsMHgzMCwweDg1LDB4ZmYsMHhmZiwweDAwLDB4YTMsMHgxOCwweDJiLDB4MTQsMHg2MCwweGZmLDB4YWQsCisweDMwLDB4ZTIsMHgwMCwweGZmLDB4MDgsMHgwMCwweDBmLDB4NjMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwZiwweGM0LAorMHgzMCwweDU4LDB4MDAsMHgwMSwweDgxLDB4YzIsMHgwMCwweDQ4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4ZmYsMHg3MywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MGYsMHg1MSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwYSwweDFjLDB4MDAsCisweDAwLDB4MDMsMHgxYywweDAzLDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQ1LDB4MTAsMHgyMSwweDgwLDB4NDgsMHgwMCwweDA1LDB4OTEsMHg2NywweDAwLDB4MDAsMHgwOCwweDAwLDB4MGYsMHgzMSwKKzB4MDMsMHhhMCwweDU4LDB4MjEsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MzQsMHg2MywweDAwLDB4MjAsCisweDI0LDB4NDIsMHgzZiwweGY0LDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweDYyLDB4MDAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGMwLAorMHhhZiwweGI3LDB4MDAsMHgzNCwweGFmLDB4YjYsMHgwMCwweDMwLDB4YWYsMHhiNSwweDAwLDB4MmMsMHhhZiwweGI0LDB4MDAsMHgyOCwKKzB4YWYsMHhiMywweDAwLDB4MjQsMHhhZiwweGIyLDB4MDAsMHgyMCwweGFmLDB4YmYsMHgwMCwweDNjLDB4YWYsMHhiZSwweDAwLDB4MzgsCisweGFmLDB4YjEsMHgwMCwweDFjLDB4YWYsMHhiMCwweDAwLDB4MTgsMHg4NCwweDgyLDB4MDAsMHgwYywweDI3LDB4OTMsMHg4ZiwweGY0LAorMHgzYywweDA1LDB4YjAsMHgwMywweDAwLDB4MDIsMHgxOCwweGMwLDB4MDAsMHg2MiwweDE4LDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MDAsMHg3MywweDEwLDB4MjEsMHg4YywweDVlLDB4MDAsMHgxOCwweDNjLDB4MDIsMHg4MCwweDAwLDB4MzQsMHhhNSwweDAwLDB4MjAsCisweDI0LDB4NDIsMHg0MCwweDBjLDB4YWMsMHhhMiwweDAwLDB4MDAsMHg4ZiwweGQwLDB4MDAsMHgwOCwweDI3LDB4OTUsMHg5MCwweDAwLAorMHgwMCwweDc1LDB4MTgsMHgyMSwweDAwLDB4MDAsMHgyOCwweDIxLDB4MDIsMHgwMCwweDMwLDB4MjEsMHg5MCwweDcxLDB4MDAsMHgwMCwKKzB4MGMsMHgwMCwweDBmLDB4MTUsMHgwMCwweDgwLDB4YjAsMHgyMSwweDAwLDB4NDAsMHg5MCwweDIxLDB4MDAsMHgxMCwweDE0LDB4NDIsCisweDMwLDB4NTQsMHgwMCwweDAxLDB4MDIsMHg0MCwweDIwLDB4MjEsMHgwMCwweDEwLDB4MTQsMHg4MiwweDAyLDB4ODAsMHgyOCwweDIxLAorMHgxMiwweDUxLDB4MDAsMHgyMywweDAwLDB4MTAsMHhiZiwweGMyLDB4ODYsMHhjMywweDAwLDB4MGMsMHgzMCwweDUwLDB4MDAsMHgwMSwKKzB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg1NSwweDEwLDB4MjEsCisweGEwLDB4NTIsMHgwMCwweDAwLDB4ODYsMHhjMywweDAwLDB4MGMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgxMCwweGMwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg1MywweDMwLDB4MjEsMHg4YywweGM3LDB4MDAsMHgxOCwKKzB4MjcsMHg4MywweDhmLDB4ZjAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4ZTMsMHgwMCwweDA0LDB4ODQsMHg0NiwweDAwLDB4MDYsCisweDAwLDB4MDMsMHgxOSwweDQyLDB4MGMsMHgwMCwweDA4LDB4ZGYsMHgzMCwweDczLDB4MDAsMHgwMSwweDAwLDB4NDAsMHg4OCwweDIxLAorMHgwMiwweDQwLDB4MjAsMHgyMSwweDAyLDB4ODAsMHgyOCwweDIxLDB4MTYsMHhlMCwweDAwLDB4MTAsMHgwMiwweDAwLDB4MzAsMHgyMSwKKzB4ODYsMHhjMiwweDAwLDB4MGMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxOCwweGMwLDB4MDAsMHg2MiwweDE4LDB4MjEsCisweDAwLDB4MDMsMHgxOCwweDgwLDB4MjcsMHg4MiwweDhmLDB4ZjgsMHgwMCwweDYyLDB4MTgsMHgyMSwweGE0LDB4NzEsMHgwMCwweDA0LAorMHg3YiwweGJlLDB4MDEsMHhmYywweDdiLDB4YjYsMHgwMSwweGJjLDB4N2IsMHhiNCwweDAxLDB4N2MsMHg3YiwweGIyLDB4MDEsMHgzYywKKzB4N2IsMHhiMCwweDAwLDB4ZmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDQwLDB4ODYsMHhjMywweDAwLDB4MGMsCisweGFmLDB4YjMsMHgwMCwweDEwLDB4YWYsMHhhMCwweDAwLDB4MTQsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NTUsMHgxMCwweDIxLDB4ODAsMHg0NywweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHhlNywweDAwLDB4MDIsMHgwMCwweDA3LDB4MTcsMHhjMiwweDAwLDB4ZTIsMHgzOCwweDIxLDB4MDAsMHgwNywweDM4LDB4NDMsCisweDAwLDB4MDcsMHgzOCwweDQwLDB4MGMsMHgwMCwweDA5LDB4MDYsMHgwMywweGM3LDB4MzgsMHgyMSwweDA4LDB4MDAsMHgxMCwweDQ0LAorMHgwMiwweDIyLDB4ODgsMHgyMSwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHhkMCwKKzB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4NDEsMHg5NCwweGFmLDB4YjIsMHgwMCwweDIwLDB4YWMsMHg2MiwweDAwLDB4MDAsCisweGFmLDB4YmYsMHgwMCwweDI4LDB4YWYsMHhiMywweDAwLDB4MjQsMHhhZiwweGIxLDB4MDAsMHgxYywweGFmLDB4YjAsMHgwMCwweDE4LAorMHgzYywweDAyLDB4YjAsMHgwMywweDkwLDB4ODMsMHgwMCwweDBhLDB4MzQsMHg0MiwweDAxLDB4MDQsMHg5NCwweDQ1LDB4MDAsMHgwMCwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgyNywweDgyLDB4YjMsMHhmMCwweDAwLDB4NjIsMHgxOCwweDIxLDB4MzAsMHhhNiwweGZmLDB4ZmYsCisweDhjLDB4NzEsMHgwMCwweDAwLDB4ODAsMHg4NSwweDAwLDB4MTIsMHgzMCwweGM5LDB4MDAsMHhmZiwweDAwLDB4MDYsMHgzMiwweDAyLAorMHhhNCwweDg2LDB4MDAsMHg0NCwweGE0LDB4ODksMHgwMCwweDQ2LDB4ODIsMHgyMiwweDAwLDB4MTIsMHgwMCwweDgwLDB4OTAsMHgyMSwKKzB4MTAsMHhhMCwweDAwLDB4MWIsMHhhMCwweDgwLDB4MDAsMHgxNSwweDAwLDB4YzUsMHgxMCwweDJhLDB4MTAsMHg0MCwweDAwLDB4MTQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4YTIsMHgyMCwweDAwLDB4MTksMHg4NCwweDgzLDB4MDAsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNywweDgzLDB4OTAsMHgxMCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHhhMCwweDQwLDB4MDAsMHgwMCwweGEwLDB4ODAsMHgwMCwweDEyLDB4OTIsMHgyMiwweDAwLDB4MTYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZGYsMHhhMiwweDIyLDB4MDAsMHgxNiwweDhmLDB4YmYsMHgwMCwweDI4LAorMHg3YiwweGIyLDB4MDEsMHgzYywweDdiLDB4YjAsMHgwMCwweGZjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgzMCwKKzB4MGMsMHgwMCwweDBmLDB4ZmQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxMCwweDkzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI4LDB4NDIsMHgwMCwweDAyLDB4MTAsMHg0MCwweDAxLDB4NzYsMHgwMCwweDAwLDB4MjgsMHgyMSwweDk0LDB4ODcsMHgwMCwweDBjLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZTAsMHgxMCwweDIxLDB4MDAsMHgwMiwweDE0LDB4MDAsMHgwMCwweDAyLDB4MTQsMHgwMywKKzB4MDAsMHgwNywweDI0LDB4MDAsMHgwMCwweDA0LDB4MjQsMHgwMywweDAwLDB4MDIsMHgxOCwweGMwLDB4MDAsMHg2MiwweDE4LDB4MjEsCisweDAwLDB4MDQsMHgyOCwweGMwLDB4MDAsMHhhNCwweDI4LDB4MjEsMHgyNywweDgyLDB4OTAsMHgxMCwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgwMCwweDYyLDB4MTgsMHgyMSwweDAwLDB4MDUsMHgyOCwweDgwLDB4MjcsMHg4MiwweDhmLDB4ZjgsMHgwMCwweGEyLDB4MTAsMHgyMSwKKzB4OGMsMHg2OCwweDAwLDB4MDAsMHg4MCwweDQ0LDB4MDAsMHgwNiwweDI3LDB4ODIsMHg5MCwweDAwLDB4MDAsMHgwOCwweDFkLDB4MDIsCisweDAwLDB4YTIsMHgyOCwweDIxLDB4MzgsMHg4NCwweDAwLDB4MDAsMHgzMCwweDYzLDB4MDAsMHgwMSwweDAxLDB4MjQsMHgzMCwweDBiLAorMHg4MCwweGFhLDB4MDAsMHgwNCwweDgwLDB4YTksMHgwMCwweDA1LDB4MTAsMHg2MCwweDAwLDB4MDIsMHgwMCwweDA4LDB4MTQsMHgwMiwKKzB4MzAsMHg0NiwweDAwLDB4MGYsMHgxNSwweDIwLDB4MDAsMHgyOCwweDAxLDB4NDksMHgxMCwweDIxLDB4MTUsMHg0MCwweDAwLDB4MTEsCisweDMwLDB4ZTMsMHhmZiwweGZmLDB4OTIsMHg0NSwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4YTgsMHgwMCwweGZmLAorMHgyZCwweDAyLDB4MDAsMHgwNCwweDEwLDB4NDAsMHgwMSwweDQ2LDB4MmQsMHgwMiwweDAwLDB4MTAsMHgzYywweDA0LDB4YjAsMHgwNSwKKzB4MzQsMHg4NCwweDAyLDB4MjksMHg5MCwweDgzLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MDEsMHgwMiwweDEwLDB4MDQsCisweDAwLDB4NjIsMHgxOCwweDI1LDB4YTAsMHg4MywweDAwLDB4MDAsMHg5NiwweDQ3LDB4MDAsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweGUzLDB4ZmYsMHhmZiwweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgyNywweDg0LDB4OTAsMHgwMCwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ0LDB4MTAsMHgyMSwweDgwLDB4NDUsMHgwMCwweDA2LDB4MDAsMHgwMywweDFhLDB4MDAsCisweDNjLDB4MDQsMHhiMCwweDAwLDB4MDAsMHg2NSwweDE4LDB4MjEsMHgwMCwweDY0LDB4MjAsMHgyMSwweDk0LDB4ODIsMHgwMCwweDAwLAorMHg4MiwweDQzLDB4MDAsMHgxMCwweDAwLDB4MDIsMHgxNCwweDAwLDB4MTQsMHg2MCwweDAwLDB4MDYsMHgwMCwweDAyLDB4M2MsMHgwMywKKzB4MzAsMHhlMiwweDAwLDB4MDQsMHgxNCwweDQwLDB4MDAsMHgwNCwweDAxLDB4NDksMHgxMCwweDIxLDB4MzQsMHhlMiwweDA4LDB4MDAsCisweGE0LDB4ODIsMHgwMCwweDAwLDB4MDEsMHg0OSwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTYsMHgwMCwweDAwLDB4MDIsMHgxNiwweDAzLAorMHgwMCwweDQ2LDB4MTAsMHgyYSwweDEwLDB4NDAsMHgwMCwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MiwweDQyLDB4MDAsMHgxMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODYsMHg0MywweDAwLDB4MGMsCisweDI1LDB4NDQsMHgwMCwweDAxLDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgyNywweDgzLDB4OTAsMHgwMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4YTAsMHg0NCwweDAwLDB4MDQsMHg5MiwweDIzLDB4MDAsMHgxNiwKKzB4MDIsMHg0MCwweDIwLDB4MjEsMHgzMCwweDYzLDB4MDAsMHhmYiwweDA4LDB4MDAsMHgxMCwweDk4LDB4YTIsMHgyMywweDAwLDB4MTYsCisweDg2LDB4NDMsMHgwMCwweDBjLDB4MjUsMHgyNCwweDAwLDB4MDEsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4ODMsMHg5MCwweDAwLDB4MDAsMHg0MywweDEwLDB4MjEsMHhhMCwweDQ0LDB4MDAsMHgwNSwKKzB4ODYsMHg0NSwweDAwLDB4MGMsMHgwYywweDAwLDB4MWYsMHgwOCwweDAyLDB4MjAsMHgyMCwweDIxLDB4MTAsMHg0MCwweDAwLDB4NWEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTIsMHg0NSwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4YTYsMHgwMCwweGZmLAorMHgyYywweGMyLDB4MDAsMHgwNCwweDEwLDB4NDAsMHgwMCwweDRjLDB4MmMsMHhjMiwweDAwLDB4MTAsMHgzYywweDA0LDB4YjAsMHgwNSwKKzB4MzQsMHg4NCwweDAyLDB4MjksMHg5MCwweDgzLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MDAsMHhjMiwweDEwLDB4MDQsCisweDAwLDB4MDIsMHgxMCwweDI3LDB4MDAsMHg2MiwweDE4LDB4MjQsMHhhMCwweDgzLDB4MDAsMHgwMCwweDkyLDB4NDUsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4YTUsMHgwMCwweGZmLDB4MTQsMHhhMCwweDAwLDB4MzMsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4YTIsMHg0MCwweDAwLDB4MDQsMHg5MiwweDIyLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MGMsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4YTIsMHgyMiwweDAwLDB4MTcsMHg5MiwweDIyLDB4MDAsMHgxNywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMCwweDQwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTYsMHgyMiwweDAwLDB4MDYsMHgwOCwweDAwLDB4MTAsMHg5MywKKzB4YTYsMHgyMiwweDAwLDB4MTQsMHg5NiwweDIyLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxMCwweDkzLDB4YTYsMHgyMiwweDAwLDB4MTQsCisweDkyLDB4MjIsMHgwMCwweDBhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MTEsMHgyMiwweGEyLDB4MjAsMHgwMCwweDE3LDB4OTYsMHgyNCwweDAwLDB4MDAsMHg5NiwweDI1LDB4MDAsMHgwNiwKKzB4MjcsMHg4NiwweDhmLDB4ZjAsMHgwMCwweDA0LDB4MTgsMHhjMCwweDAwLDB4NjQsMHgxOCwweDIxLDB4MDAsMHgwNSwweDEwLDB4YzAsCisweDAwLDB4NDUsMHgxMCwweDIxLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY2LDB4MTgsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQ2LDB4MTAsMHgyMSwweDhjLDB4NjUsMHgwMCwweDA4LDB4OGMsMHg0NCwweDAwLDB4MDgsMHgzYywweDAzLDB4ODAsMHgwMCwKKzB4MDAsMHhhMywweDMwLDB4MjQsMHgxMCwweGMwLDB4MDAsMHgwOCwweDAwLDB4ODMsMHgxMCwweDI0LDB4MTAsMHg0MCwweDAwLDB4MDQsCisweDAwLDB4MDAsMHgxOCwweDIxLDB4MTAsMHhjMCwweDAwLDB4MDIsMHgyNCwweDAzLDB4MDAsMHgwMSwweDAwLDB4ODUsMHgxOCwweDJiLAorMHgwOCwweDAwLDB4MTEsMHgyMiwweGEyLDB4MjMsMHgwMCwweDE3LDB4MTAsMHg0MCwweGZmLDB4ZmQsMHgwMCwweDg1LDB4MTgsMHgyYiwKKzB4MDgsMHgwMCwweDExLDB4NDUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTIsMHgwMCwweDA5LDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDEwLDB4YTIsMHgwMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MDMsMHgxNCwweGEyLDB4ZmYsMHhjYSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MTEsMHgxZCwweGEyLDB4NDAsMHgwMCwweDA3LDB4MDgsMHgwMCwweDExLDB4MWQsMHhhMiwweDQwLDB4MDAsMHgwNiwKKzB4MDgsMHgwMCwweDExLDB4MWQsMHhhMiwweDQwLDB4MDAsMHgwNSwweDE0LDB4NDAsMHhmZiwweGJlLDB4M2MsMHgwNCwweGIwLDB4MDUsCisweDM0LDB4ODQsMHgwMiwweDI5LDB4OTAsMHg4MywweDAwLDB4MDAsMHgzMCwweGE1LDB4MDAsMHgwZiwweDI0LDB4MDIsMHgwMCwweDgwLAorMHgwOCwweDAwLDB4MTEsMHgxNCwweDAwLDB4YTIsMHgxMCwweDA3LDB4MGMsMHgwMCwweDEwLDB4MDMsMHgwMiwweDQwLDB4MjAsMHgyMSwKKzB4MDgsMHgwMCwweDEwLDB4OTMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkyLDB4NDUsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4YTYsMHgwMCwweGZmLDB4MmMsMHhjMiwweDAwLDB4MDQsMHgxMCwweDQwLDB4MDAsMHg5OSwweDJjLDB4YzIsMHgwMCwweDEwLAorMHgzYywweDA0LDB4YjAsMHgwNSwweDM0LDB4ODQsMHgwMiwweDI5LDB4OTAsMHg4MywweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MDAsMHhjMiwweDEwLDB4MDQsMHgwMCwweDAyLDB4MTAsMHgyNywweDAwLDB4NjIsMHgxOCwweDI0LDB4YTAsMHg4MywweDAwLDB4MDAsCisweDkyLDB4NDUsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweGE1LDB4MDAsMHhmZiwweDE0LDB4YTAsMHgwMCwweDgwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweGEyLDB4NDAsMHgwMCwweDA0LDB4ODYsMHg0MywweDAwLDB4MGMsMHgyNywweDkzLDB4OGYsMHhmNCwKKzB4OTYsMHg0NywweDAwLDB4MGMsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDI4LDB4ODAsCisweDAwLDB4YjMsMHgxOCwweDIxLDB4OGMsMHg2NCwweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4ODIsMHgwMCwweDA0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDEwLDB4MTAsMHg0MCwweDAwLDB4NjQsMHgwMCwweDAwLDB4MzAsMHgyMSwKKzB4MDAsMHgwNywweDFjLDB4MDAsMHgwMCwweDAzLDB4MWMsMHgwMywweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg1MywweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgxOCwweDkzLDB4ODIsMHg4YiwweDYxLAorMHg4YywweDY0LDB4MDAsMHgwNCwweDMwLDB4NDIsMHgwMCwweDAxLDB4MDAsMHgwNCwweDIxLDB4NDIsMHgxNCwweDQwLDB4MDAsMHg0ZCwKKzB4MzAsMHg5MCwweDAwLDB4MDEsMHgwMCwweDA3LDB4MmMsMHgwMCwweDAwLDB4MDUsMHgyYywweDAzLDB4MGMsMHgwMCwweDFiLDB4ODQsCisweDAyLDB4MjAsMHgyMCwweDIxLDB4OTYsMHgyNiwweDAwLDB4MDYsMHgxMiwweDAwLDB4MDAsMHgxNCwweDMwLDB4YzUsMHhmZiwweGZmLAorMHgwMiwweDYwLDB4OTAsMHgyMSwweDAwLDB4MDUsMHgxMCwweGMwLDB4MDAsMHg0NSwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwKKzB4MDAsMHg1MiwweDE4LDB4MjEsMHg5MiwweDIyLDB4MDAsMHgwYSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MGIsCisweDAyLDB4MjAsMHgyMCwweDIxLDB4OGMsMHg2MywweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4NjIsMHgwMCwweDA0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxMSwweDQyLDB4MGMsMHgwMCwweDFiLDB4ODQsMHgzMCwweDUwLDB4MDAsMHgwMSwKKzB4OTYsMHgyNiwweDAwLDB4MDYsMHgxNiwweDAwLDB4ZmYsMHhlZiwweDMwLDB4YzUsMHhmZiwweGZmLDB4OTIsMHgyMiwweDAwLDB4MDQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MGQsMHgyNCwweDAyLDB4MDAsMHgwMSwweGEyLDB4MjIsMHgwMCwweDE3LAorMHg5MiwweDIyLDB4MDAsMHgxNywweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4YTYsMHgyNiwweDAwLDB4MTQsMHg5MiwweDIyLDB4MDAsMHgxNiwweDA4LDB4MDAsMHgxMCwweDkyLDB4MzAsMHg0MiwweDAwLDB4YzMsCisweDk2LDB4MjIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDExLDB4YjksMHhhNiwweDIyLDB4MDAsMHgxNCwweDkyLDB4MjIsMHgwMCwweDBhLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTEsMHhiNCwKKzB4YTIsMHgyMCwweDAwLDB4MTcsMHg5NiwweDI0LDB4MDAsMHgwMCwweDMwLDB4YzUsMHhmZiwweGZmLDB4MDAsMHgwNSwweDE4LDB4YzAsCisweDAwLDB4MDQsMHgxMCwweGMwLDB4MDAsMHg0NCwweDEwLDB4MjEsMHgwMCwweDY1LDB4MTgsMHgyMSwweDI3LDB4ODQsMHg4ZiwweGYwLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDQsMHgxMCwweDIxLDB4MDAsMHgwMywweDE4LDB4ODAsMHg4YywweDQ1LDB4MDAsMHgwOCwKKzB4MDAsMHg2NCwweDE4LDB4MjEsMHg4YywweDY0LDB4MDAsMHgwOCwweDNjLDB4MDIsMHg4MCwweDAwLDB4MDAsMHhhMiwweDM4LDB4MjQsCisweDEwLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHg4MiwweDEwLDB4MjQsMHgxMCwweDQwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgxOCwweDIxLAorMHgxMCwweGUwLDB4MDAsMHgwMiwweDI0LDB4MDMsMHgwMCwweDAxLDB4MDAsMHg4NSwweDE4LDB4MmIsMHgwOCwweDAwLDB4MTEsMHhiNCwKKzB4YTIsMHgyMywweDAwLDB4MTcsMHgxMCwweDQwLDB4ZmYsMHhmZCwweDAwLDB4ODUsMHgxOCwweDJiLDB4MDgsMHgwMCwweDExLDB4ZDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwNSwweDAwLDB4MjQsMHhmMCwweGU1LDB4MDAsMHgwNiwweDAwLDB4MDAsMHgyOCwweDEyLAorMHgyNywweDgyLDB4OGYsMHhmMCwweDAwLDB4YTIsMHgyOCwweDIxLDB4MGMsMHgwMCwweDAxLDB4NGIsMHgwMCwweDAwLDB4MjAsMHgyMSwKKzB4OTYsMHg0NywweDAwLDB4MGMsMHgwOCwweDAwLDB4MTEsMHg5NiwweDAwLDB4MDcsMHgyYywweDAwLDB4MjcsMHg4MywweDkwLDB4MDAsCisweDI3LDB4ODIsMHg5MCwweDA4LDB4MDAsMHhhMiwweDEwLDB4MjEsMHgwMCwweGEzLDB4MTgsMHgyMSwweDkwLDB4NDQsMHgwMCwweDAwLAorMHg5MCwweDY1LDB4MDAsMHgwNSwweDkzLDB4ODIsMHg4MCwweDEwLDB4MjQsMHgwNywweDAwLDB4MDEsMHgwYywweDAwLDB4MjEsMHhmNSwKKzB4YWYsMHhhMiwweDAwLDB4MTAsMHg5NiwweDQ3LDB4MDAsMHgwYywweDA4LDB4MDAsMHgxMSwweDg5LDB4MDAsMHgwNywweDFjLDB4MDAsCisweDEwLDB4YTIsMHgwMCwweDA5LDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4MDAsMHgwNSwweDI0LDB4MDIsMHgwMCwweDAzLAorMHgxNCwweGEyLDB4ZmYsMHg3ZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDExLDB4N2EsMHhhMiwweDQwLDB4MDAsMHgwNywKKzB4MDgsMHgwMCwweDExLDB4N2EsMHhhMiwweDQwLDB4MDAsMHgwNiwweDA4LDB4MDAsMHgxMSwweDdhLDB4YTIsMHg0MCwweDAwLDB4MDUsCisweDE0LDB4NDAsMHhmZiwweDcxLDB4M2MsMHgwNCwweGIwLDB4MDUsMHgzNCwweDg0LDB4MDIsMHgyOSwweDkwLDB4ODMsMHgwMCwweDAwLAorMHgzMCwweGE1LDB4MDAsMHgwZiwweDI0LDB4MDIsMHgwMCwweDgwLDB4MDgsMHgwMCwweDExLDB4NzEsMHgwMCwweGEyLDB4MTAsMHgwNywKKzB4MTQsMHg0MCwweGZlLDB4YzMsMHgzYywweDA0LDB4YjAsMHgwNSwweDM0LDB4ODQsMHgwMiwweDI5LDB4OTAsMHg4MywweDAwLDB4MDAsCisweDMwLDB4YTUsMHgwMCwweDBmLDB4MjQsMHgwMiwweDAwLDB4ODAsMHgwOCwweDAwLDB4MTAsMHhjYywweDAwLDB4YTIsMHgxMCwweDA3LAorMHg4NCwweDgzLDB4MDAsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNywweDgzLDB4OGYsMHhmNCwweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHg0NywweDAwLDB4MTgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHhlNiwweDAwLDB4MDgsMHgwYywweDAwLDB4MGYsMHgxNSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMiwweDQwLDB4MjAsMHgyMSwweDAwLDB4MDAsMHgyOCwweDIxLDB4MDAsMHgwMCwweDMwLDB4MjEsMHgwMCwweDAwLDB4MzgsMHgyMSwKKzB4MGMsMHgwMCwweDFjLDB4ODYsMHhhZiwweGEyLDB4MDAsMHgxMCwweDAwLDB4MDIsMHgxZSwweDAwLDB4MTQsMHg2MCwweGZlLDB4NmIsCisweGEyLDB4MjIsMHgwMCwweDEyLDB4OTIsMHg0MywweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NjAsMHgwMCwweDQwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweGEyLDB4NDAsMHgwMCwweDA0LDB4OTIsMHgyOCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTUsMHgwMCwweDAwLDB4MTksMHgyNCwweDAyLDB4MDAsMHgwMSwweDkyLDB4MjcsMHgwMCwweDBhLDB4YTIsMHgyMiwweDAwLDB4MTcsCisweDkyLDB4MjIsMHgwMCwweDE3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5NiwweDIyLDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4YTYsMHgyMiwweDAwLDB4MTQsMHg5MiwweDIyLDB4MDAsMHgxNiwKKzB4MzAsMHhlMywweDAwLDB4ZmYsMHgzMCwweDQyLDB4MDAsMHhjMCwweDEwLDB4NjAsMHgwMCwweDAzLDB4YTIsMHgyMiwweDAwLDB4MTYsCisweDM0LDB4NDIsMHgwMCwweDAxLDB4YTIsMHgyMiwweDAwLDB4MTYsMHgxMSwweDAwLDB4ZmUsMHg1MCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5MiwweDIyLDB4MDAsMHgxNiwweDA4LDB4MDAsMHgxMCwweDkyLDB4MzQsMHg0MiwweDAwLDB4MDIsMHg5NiwweDIyLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDEyLDB4M2IsMHhhNiwweDIyLDB4MDAsMHgxNCwweDkyLDB4MjcsMHgwMCwweDBhLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE0LDB4ZTAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTIsMHgzNCwweGEyLDB4MjAsMHgwMCwweDE3LAorMHg5NiwweDI0LDB4MDAsMHgwMCwweDk2LDB4MjUsMHgwMCwweDA2LDB4MjcsMHg4NiwweDhmLDB4ZjAsMHgwMCwweDA0LDB4MTgsMHhjMCwKKzB4MDAsMHg2NCwweDE4LDB4MjEsMHgwMCwweDA1LDB4MTAsMHhjMCwweDAwLDB4NDUsMHgxMCwweDIxLDB4MDAsMHgwMywweDE4LDB4ODAsCisweDAwLDB4NjYsMHgxOCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ2LDB4MTAsMHgyMSwweDhjLDB4NjUsMHgwMCwweDA4LAorMHg4YywweDQ0LDB4MDAsMHgwOCwweDNjLDB4MDMsMHg4MCwweDAwLDB4MDAsMHhhMywweDMwLDB4MjQsMHgxMCwweGMwLDB4MDAsMHgwOCwKKzB4MDAsMHg4MywweDEwLDB4MjQsMHgxMCwweDQwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgxOCwweDIxLDB4MTAsMHhjMCwweDAwLDB4MDIsCisweDI0LDB4MDMsMHgwMCwweDAxLDB4MDAsMHg4NSwweDE4LDB4MmIsMHgwOCwweDAwLDB4MTIsMHgzNCwweGEyLDB4MjMsMHgwMCwweDE3LAorMHgxMCwweDQwLDB4ZmYsMHhmZCwweDAwLDB4ODUsMHgxOCwweDJiLDB4MDgsMHgwMCwweDEyLDB4NjMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHg2MiwweDAwLDB4MDksMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4NjIsMHgwMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MDMsCisweDE0LDB4NjIsMHhmZiwweGJkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTIsMHgyZSwweGEyLDB4NDAsMHgwMCwweDA3LAorMHgwOCwweDAwLDB4MTIsMHgyZSwweGEyLDB4NDAsMHgwMCwweDA2LDB4MDgsMHgwMCwweDEyLDB4MmUsMHhhMiwweDQwLDB4MDAsMHgwNSwKKzB4M2MsMHgwMiwweDgwLDB4MDAsMHgwMCwweDgyLDB4MzAsMHgyNCwweDEwLDB4YzAsMHgwMCwweDA4LDB4MDAsMHhhMiwweDE4LDB4MjQsCisweDEwLDB4NjAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDEwLDB4MjEsMHgxMCwweGMwLDB4MDAsMHgwMiwweDI0LDB4MDIsMHgwMCwweDAxLAorMHgwMCwweGE0LDB4MTAsMHgyYiwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDYwLDB4ZmYsMHhmZCwKKzB4MDAsMHhhNCwweDEwLDB4MmIsMHgwOCwweDAwLDB4MTIsMHg3ZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg4MiwweGZmLDB4ZmYsCisweDAwLDB4MDIsMHgxOCwweGMwLDB4MDAsMHg2MiwweDE4LDB4MjEsMHgyNywweDg0LDB4OTAsMHgwMCwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgwMCwweDY0LDB4MTgsMHgyMSwweDgwLDB4NjYsMHgwMCwweDA2LDB4MDAsMHgwMiwweDEyLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwMCwKKzB4MDAsMHg0NiwweDEwLDB4MjEsMHgwMCwweDQ1LDB4MTAsMHgyMSwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHg0MywweDEwLDB4MjEsCisweDI3LDB4YmQsMHhmZiwweGUwLDB4MzAsMHg4MiwweDAwLDB4N2MsMHgzMCwweDg0LDB4ZmYsMHgwMCwweGFmLDB4YmYsMHgwMCwweDFjLAorMHhhZiwweGIyLDB4MDAsMHgxOCwweGFmLDB4YjEsMHgwMCwweDE0LDB4YWYsMHhiMCwweDAwLDB4MTAsMHgxNCwweDQwLDB4MDAsMHg0MSwKKzB4MDAsMHgwNCwweDIyLDB4MDMsMHgyNCwweDAyLDB4MDAsMHgwNCwweDNjLDB4MTAsMHhiMCwweDAzLDB4OGUsMHgxMCwweDAwLDB4MDAsCisweDEwLDB4ODIsMHgwMCwweDMyLDB4MjQsMHgwMiwweDAwLDB4MDgsMHgxMCwweDgyLDB4MDAsMHgwMywweDMyLDB4MDIsMHgwMCwweDIwLAorMHgwOCwweDAwLDB4MTIsMHhhNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MTcsMHgzYywweDAyLDB4YjAsMHgwNiwKKzB4MzQsMHg0MiwweDgwLDB4MjQsMHg4YywweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2NywweDAwLDB4ZmYsCisweDEwLDB4ZTAsMHgwMCwweDIzLDB4MDAsMHgwMCwweDg4LDB4MjEsMHg4ZiwweDg1LDB4OGYsMHhkMCwweDAwLDB4NDAsMHgzMCwweDIxLAorMHg5NCwweGEyLDB4MDAsMHgwOCwweDhjLDB4YzMsMHgwMCwweDAwLDB4MjYsMHgzMSwweDAwLDB4MDEsMHgyNCwweDQyLDB4MDAsMHgwMiwKKzB4MzAsMHg0MiwweDAxLDB4ZmYsMHgzNCwweDYzLDB4MDEsMHgwMCwweDAyLDB4MjcsMHgyMCwweDJhLDB4YTQsMHhhMiwweDAwLDB4MDgsCisweDE0LDB4ODAsMHhmZiwweGY3LDB4YWMsMHhjMywweDAwLDB4MDAsMHg4NCwweGEzLDB4MDAsMHgwOCwweDNjLDB4MDIsMHhiMCwweDAzLAorMHgzNCwweDQyLDB4MDAsMHgzMCwweGFjLDB4NDMsMHgwMCwweDAwLDB4MjcsMHg5MiwweGIzLDB4ZjAsMHgyNCwweDExLDB4MDAsMHgxMiwKKzB4OGUsMHg0NCwweDAwLDB4MDAsMHgyNiwweDMxLDB4ZmYsMHhmZiwweDkwLDB4ODIsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4NDAsMHgwMCwweDAzLDB4MjYsMHg1MiwweDAwLDB4MDQsMHgwYywweDAwLDB4MjAsMHhkMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwNiwweDIxLDB4ZmYsMHhmNywweDI0LDB4MDIsMHhmZiwweGRmLDB4MDIsMHgwMiwweDgwLDB4MjQsMHgzYywweDAxLDB4YjAsMHgwMywKKzB4MGMsMHgwMCwweDEzLDB4MTgsMHhhYywweDMwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxMiwweGE0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhmLDB4ODUsMHg4ZiwweGQwLDB4MDgsMHgwMCwweDEyLDB4YmEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHhmZiwweDk1LAorMHgzYywweDAzLDB4YjAsMHgwMywweDAyLDB4MDIsMHg4MCwweDI0LDB4MzQsMHg2MywweDAwLDB4MzAsMHgzYywweDAxLDB4YjAsMHgwMywKKzB4YWMsMHgzMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MTIsMHhlMSwweGFjLDB4NjAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDEyLDB4YTQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDAsMHg1MCwweDA4LDB4MDAsMHgxMiwweGE0LAorMHhhYywweDQ2LDB4MDAsMHgwMCwweDNjLDB4MGEsMHg4MCwweDAwLDB4MjUsMHg0YSwweDRiLDB4ODQsMHgzYywweDBiLDB4YjAsMHgwMywKKzB4YWQsMHg2YSwweDAwLDB4MjAsMHgzYywweDA4LDB4ODAsMHgwMSwweDI1LDB4MDgsMHgwMCwweDAwLDB4M2MsMHgwOSwweDgwLDB4MDEsCisweDI1LDB4MjksMHgwMywweDFjLDB4MTEsMHgwOSwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MGEsMHg4MCwweDAwLAorMHgyNSwweDRhLDB4NGIsMHhhYywweDNjLDB4MGIsMHhiMCwweDAzLDB4YWQsMHg2YSwweDAwLDB4MjAsMHgzYywweDA4LDB4YjAsMHgwNiwKKzB4MzUsMHgwOCwweDgwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGQsMHgwOSwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzEsMHgyOSwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDEsMHgwMCwweDAxLAorMHgxNSwweDIxLDB4ZmYsMHhmMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwYSwweDgwLDB4MDAsMHgyNSwweDRhLDB4NGIsMHhlOCwKKzB4M2MsMHgwYiwweGIwLDB4MDMsMHhhZCwweDZhLDB4MDAsMHgyMCwweDNjLDB4MDIsMHhiMCwweDAzLDB4OGMsMHg0MywweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzQsMHg2MywweDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGFjLDB4NDMsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MGEsMHg4MCwweDAwLDB4MjUsMHg0YSwweDRjLDB4MTQsMHgzYywweDBiLDB4YjAsMHgwMywKKzB4YWQsMHg2YSwweDAwLDB4MjAsMHgzYywweDAyLDB4ODAsMHgwMSwweDI0LDB4NDIsMHgwMCwweDAwLDB4M2MsMHgwMywweDgwLDB4MDEsCisweDI0LDB4NjMsMHgwMywweDFjLDB4M2MsMHgwNCwweGIwLDB4MDAsMHg4YywweDg1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHhhYywweDQ1LDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDA0LDB4MjQsMHg4NCwweDAwLDB4MDQsMHgwMCwweDQzLDB4MDgsMHgyYSwKKzB4MTQsMHgyMCwweGZmLDB4ZjksMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgxMywweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MGEsMHg4MCwweDAwLDB4MjUsMHg0YSwweDRjLDB4NjAsMHgzYywweDBiLDB4YjAsMHgwMywweGFkLDB4NmEsMHgwMCwweDIwLAorMHgzYywweDAyLDB4ODAsMHgwMSwweDI0LDB4NDIsMHgwMywweDIwLDB4M2MsMHgwMywweDgwLDB4MDEsMHgyNCwweDYzLDB4M2YsMHgxNCwKKzB4YWMsMHg0MCwweDAwLDB4MDAsMHhhYywweDQwLDB4MDAsMHgwNCwweGFjLDB4NDAsMHgwMCwweDA4LDB4YWMsMHg0MCwweDAwLDB4MGMsCisweDI0LDB4NDIsMHgwMCwweDEwLDB4MDAsMHg0MywweDA4LDB4MmEsMHgxNCwweDIwLDB4ZmYsMHhmOSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDBhLDB4ODAsMHgwMCwweDI1LDB4NGEsMHg0YywweGEwLDB4M2MsMHgwYiwweGIwLDB4MDMsMHhhZCwweDZhLDB4MDAsMHgyMCwKKzB4M2MsMHgxYywweDgwLDB4MDEsMHgyNywweDljLDB4N2YsMHhmMCwweDI3LDB4OWQsMHg4YiwweGQwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI3LDB4OWQsMHg4ZiwweGI4LDB4M2MsMHgwYSwweDgwLDB4MDAsMHgyNSwweDRhLDB4NGMsMHhjNCwweDNjLDB4MGIsMHhiMCwweDAzLAorMHhhZCwweDZhLDB4MDAsMHgyMCwweDQwLDB4ODAsMHg2OCwweDAwLDB4NDAsMHgwOCwweDYwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzUsMHgwOCwweGZmLDB4MDEsMHg0MCwweDg4LDB4NjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDE1LDB4NjUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg4NCwweGY4LDB4MDAsMHgzMCwweDg3LDB4MDAsMHgwMywweDAwLDB4MDQsMHgzMCwweDQwLAorMHgwMCwweGM3LDB4MjAsMHgyMywweDNjLDB4MDIsMHhiMCwweDBhLDB4MjcsMHhiZCwweGZmLDB4ZTAsMHgyNCwweDAzLDB4ZmYsMHhmZiwKKzB4MDAsMHg4MiwweDIwLDB4MjEsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFjLDB4ODMsMHgxMCwweDAwLDB4YWYsMHhiZiwweDAwLDB4MTgsCisweGFmLDB4YjAsMHgwMCwweDEwLDB4MDAsMHhhMCwweDg4LDB4MjEsMHgyNCwweDAzLDB4MDAsMHgwMSwweDhjLDB4ODIsMHgxMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDMsMHhmZiwweGZkLDB4MDAsMHhjNywweDEwLDB4MjMsMHgzYywweDAzLDB4YjAsMHgwYSwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDUwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgxMywweDk1LDB4MDIsMHgyMCwweDIwLDB4MjEsCisweDAyLDB4MTEsMHg4MCwweDI0LDB4MDAsMHg1MCwweDgwLDB4MDYsMHgwMiwweDAwLDB4MTAsMHgyMSwweDhmLDB4YmYsMHgwMCwweDE4LAorMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjAsMHgyNywweGJkLDB4ZmYsMHhkOCwKKzB4YWYsMHhiMiwweDAwLDB4MTgsMHgwMCwweGEwLDB4OTAsMHgyMSwweDI0LDB4MDUsMHhmZiwweGZmLDB4YWYsMHhiMywweDAwLDB4MWMsCisweGFmLDB4YmYsMHgwMCwweDIwLDB4YWYsMHhiMSwweDAwLDB4MTQsMHhhZiwweGIwLDB4MDAsMHgxMCwweDAwLDB4YzAsMHg5OCwweDIxLAorMHgxMiwweDQ1LDB4MDAsMHgyMywweDI0LDB4ODQsMHhmOCwweDAwLDB4MzAsMHg4MywweDAwLDB4MDMsMHgwMCwweDA0LDB4MTAsMHg0MCwKKzB4MDAsMHg0MCwweDg4LDB4MjEsMHgwMCwweDYwLDB4MjAsMHgyMSwweDAwLDB4NDMsMHgxMCwweDIzLDB4M2MsMHgwMywweGIwLDB4MGEsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4YWMsMHg0NSwweDEwLDB4MDAsMHgwMCwweDQwLDB4MTgsMHgyMSwweDI0LDB4MDUsMHgwMCwweDAxLAorMHg4YywweDYyLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0NSwweGZmLDB4ZmQsMHgzYywweDAyLDB4YjAsMHgwYSwKKzB4MDIsMHgyNCwweDg4LDB4MjMsMHgwMiwweDIyLDB4ODgsMHgyMSwweDhlLDB4MzAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDEzLDB4OTUsCisweDAyLDB4NDAsMHgyMCwweDIxLDB4MDAsMHgxMiwweDE4LDB4MjcsMHgwMiwweDAzLDB4ODAsMHgyNCwweDAwLDB4NTMsMHgxMCwweDA0LAorMHgwMiwweDAyLDB4ODAsMHgyNSwweGFlLDB4MzAsMHgwMCwweDAwLDB4MjQsMHgwMywweDAwLDB4MDEsMHg4ZSwweDIyLDB4MTAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQzLDB4ZmYsMHhmZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MjAsCisweDdiLDB4YjIsMHgwMCwweGZjLDB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDI4LAorMHgzMCwweDgyLDB4MDAsMHgwMywweDAwLDB4MDQsMHgxOCwweDQwLDB4MDAsMHg2MiwweDE4LDB4MjMsMHgzYywweDA0LDB4YjAsMHgwYSwKKzB4MDAsMHg2NCwweDE4LDB4MjEsMHhhYywweDY2LDB4MDAsMHgwMCwweDI0LDB4MDQsMHgwMCwweDAxLDB4OGMsMHg2MiwweDEwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0NCwweGZmLDB4ZmQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxMywweDgzLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxOCwweDIxLDB4MDAsMHg2NCwweDEwLDB4MDYsMHgzMCwweDQyLDB4MDAsMHgwMSwKKzB4MTQsMHg0MCwweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NjMsMHgwMCwweDAxLDB4MmMsMHg2MiwweDAwLDB4MjAsCisweDE0LDB4NDAsMHhmZiwweGY5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4NjAsMHgxMCwweDIxLAorMHgyNywweGJkLDB4ZmYsMHhlMCwweDNjLDB4MDMsMHhiMCwweDA1LDB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGIxLDB4MDAsMHgxNCwKKzB4YWYsMHhiMCwweDAwLDB4MTAsMHhhZiwweGJmLDB4MDAsMHgxYywweDAwLDB4ODAsMHg5MCwweDIxLDB4MDAsMHhhMCwweDgwLDB4MjEsCisweDAwLDB4YzAsMHg4OCwweDIxLDB4MzQsMHg2MywweDAyLDB4MmUsMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDQyLDB4MDAsMHgwMSwweDE0LDB4NDAsMHhmZiwweGZjLDB4MjQsMHgwNCwweDA4LDB4MjQsMHgzYywweDA1LDB4MDAsMHhjMCwKKzB4MGMsMHgwMCwweDEzLDB4NWIsMHgyNCwweDA2LDB4MDAsMHgwMywweDI0LDB4MDQsMHgwOCwweDM0LDB4M2MsMHgwNSwweDAwLDB4YzAsCisweDBjLDB4MDAsMHgxMywweDViLDB4MjQsMHgwNiwweDAwLDB4MDMsMHgzYywweDAyLDB4YzAsMHgwMCwweDAwLDB4MTAsMHgxYywweDAwLAorMHgzNCwweDQyLDB4MDQsMHgwMCwweDNjLDB4MDQsMHhiMCwweDA1LDB4M2MsMHgwNSwweGIwLDB4MDUsMHgyNCwweDYzLDB4MTYsMHgwOSwKKzB4MDIsMHgyMiwweDEwLDB4MjEsMHgzNCwweDg0LDB4MDQsMHgyMCwweDM0LDB4YTUsMHgwNCwweDI0LDB4M2MsMHgwNiwweGIwLDB4MDUsCisweGFjLDB4ODMsMHgwMCwweDAwLDB4MjQsMHgwNywweDAwLDB4MDEsMHhhYywweGEyLDB4MDAsMHgwMCwweDM0LDB4YzYsMHgwMiwweDI4LAorMHgyNCwweDAyLDB4MDAsMHgyMCwweGFlLDB4NDcsMHgwMCwweDNjLDB4MjQsMHgwNCwweDA4LDB4MjQsMHhhMCwweGMyLDB4MDAsMHgwMCwKKzB4M2MsMHgwNSwweDAwLDB4YzAsMHhhMiwweDQ3LDB4MDAsMHgxMSwweDBjLDB4MDAsMHgxMywweDViLDB4MjQsMHgwNiwweDAwLDB4MDEsCisweDI0LDB4MDQsMHgwOCwweDM0LDB4M2MsMHgwNSwweDAwLDB4YzAsMHgwYywweDAwLDB4MTMsMHg1YiwweDI0LDB4MDYsMHgwMCwweDAxLAorMHg4ZiwweGJmLDB4MDAsMHgxYywweDhmLDB4YjIsMHgwMCwweDE4LDB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MjcsMHhiZCwweDAwLDB4MjAsMHgyNCwweDAyLDB4MDAsMHgwNiwweGFjLDB4ODIsMHgwMCwweDBjLDB4YTAsMHg4MCwweDAwLDB4NTAsCisweGFjLDB4ODAsMHgwMCwweDAwLDB4YWMsMHg4MCwweDAwLDB4MDQsMHhhYywweDgwLDB4MDAsMHgwOCwweGFjLDB4ODAsMHgwMCwweDE0LAorMHhhYywweDgwLDB4MDAsMHgxOCwweGFjLDB4ODAsMHgwMCwweDFjLDB4YTQsMHg4MCwweDAwLDB4MjAsMHhhYywweDgwLDB4MDAsMHgyNCwKKzB4YWMsMHg4MCwweDAwLDB4MjgsMHhhYywweDgwLDB4MDAsMHgyYywweGEwLDB4ODAsMHgwMCwweDMwLDB4YTAsMHg4MCwweDAwLDB4MzEsCisweGFjLDB4ODAsMHgwMCwweDM0LDB4YWMsMHg4MCwweDAwLDB4MzgsMHhhMCwweDgwLDB4MDAsMHgzYywweGFjLDB4ODIsMHgwMCwweDEwLAorMHhhMCwweDgwLDB4MDAsMHg0NCwweGFjLDB4ODAsMHgwMCwweDQ4LDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweDgwLDB4MDAsMHg0YywKKzB4M2MsMHgwNCwweGIwLDB4MDYsMHgzNCwweDg0LDB4ODAsMHgwMCwweDhjLDB4ODMsMHgwMCwweDAwLDB4M2MsMHgwMiwweDEyLDB4MDAsCisweDNjLDB4MDUsMHhiMCwweDAzLDB4MDAsMHg2MiwweDE4LDB4MjUsMHgzNCwweGE1LDB4MDAsMHg4YiwweDI0LDB4MDIsMHhmZiwweDgwLAorMHhhYywweDgzLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4YTAsMHhhMiwweDAwLDB4MDAsMHgzYywweDA0LDB4YjAsMHgwMywKKzB4MzQsMHg4NCwweDAwLDB4MGIsMHgyNCwweDAyLDB4MDAsMHgyMiwweDNjLDB4MDUsMHhiMCwweDAxLDB4M2MsMHgwNiwweDQ1LDB4NjcsCisweDNjLDB4MGEsMHhiMCwweDA5LDB4YTAsMHg4MiwweDAwLDB4MDAsMHgzNCwweGE1LDB4MDAsMHgwNCwweDM0LDB4YzYsMHg4OSwweGFhLAorMHgzNSwweDRhLDB4MDAsMHgwNCwweDI0LDB4MDIsMHgwMSwweDIzLDB4M2MsMHgwYiwweGIwLDB4MDksMHgzYywweDA3LDB4MDEsMHgyMywKKzB4M2MsMHgwYywweGIwLDB4MDksMHgzYywweDAxLDB4YjAsMHgwMSwweGFjLDB4MjAsMHgwMCwweDAwLDB4MjcsMHhiZCwweGZmLDB4ZTAsCisweGFjLDB4YTAsMHgwMCwweDAwLDB4MzUsMHg2YiwweDAwLDB4MDgsMHgzYywweDAxLDB4YjAsMHgwOSwweGFjLDB4MjYsMHgwMCwweDAwLAorMHgzNCwweGU3LDB4NDUsMHg2NiwweGE1LDB4NDIsMHgwMCwweDAwLDB4MzUsMHg4YywweDAwLDB4MGMsMHgyNCwweDAyLDB4Y2QsMHhlZiwKKzB4M2MsMHgwZCwweGIwLDB4MDksMHgzYywweDA4LDB4Y2QsMHhlZiwweDNjLDB4MGUsMHhiMCwweDA5LDB4YWQsMHg2NywweDAwLDB4MDAsCisweGFmLDB4YjcsMHgwMCwweDFjLDB4YTUsMHg4MiwweDAwLDB4MDAsMHhhZiwweGI2LDB4MDAsMHgxOCwweGFmLDB4YjUsMHgwMCwweDE0LAorMHhhZiwweGI0LDB4MDAsMHgxMCwweGFmLDB4YjMsMHgwMCwweDBjLDB4YWYsMHhiMiwweDAwLDB4MDgsMHhhZiwweGIxLDB4MDAsMHgwNCwKKzB4YWYsMHhiMCwweDAwLDB4MDAsMHgzNSwweGFkLDB4MDAsMHgxMCwweDM1LDB4MDgsMHgwMSwweDIyLDB4MzUsMHhjZSwweDAwLDB4MTQsCisweDI0LDB4MDIsMHg4OSwweGFiLDB4M2MsMHgwZiwweGIwLDB4MDksMHgzYywweDA5LDB4ODksMHhhYiwweDNjLDB4MTAsMHhiMCwweDA5LAorMHgzYywweDExLDB4YjAsMHgwOSwweDNjLDB4MTIsMHhiMCwweDA5LDB4M2MsMHgxMywweGIwLDB4MDksMHgzYywweDE0LDB4YjAsMHgwOSwKKzB4M2MsMHgxNSwweGIwLDB4MDksMHgzYywweDE2LDB4YjAsMHgwOSwweDNjLDB4MTcsMHhiMCwweDA5LDB4YWQsMHhhOCwweDAwLDB4MDAsCisweDI0LDB4MDMsMHhmZiwweGZmLDB4YTUsMHhjMiwweDAwLDB4MDAsMHgzNSwweGVmLDB4MDAsMHgxOCwweDM1LDB4MjksMHhjZCwweGVlLAorMHgzNiwweDEwLDB4MDAsMHgxYywweDM2LDB4MzEsMHgwMCwweDIwLDB4MzYsMHg1MiwweDAwLDB4MjQsMHgzNiwweDczLDB4MDAsMHgyOCwKKzB4MzYsMHg5NCwweDAwLDB4MmMsMHgzNiwweGI1LDB4MDAsMHgzMCwweDM2LDB4ZDYsMHgwMCwweDM0LDB4MzYsMHhmNywweDAwLDB4MzgsCisweDI0LDB4MDIsMHg0NSwweDY3LDB4YWQsMHhlOSwweDAwLDB4MDAsMHhhNiwweDAyLDB4MDAsMHgwMCwweGFlLDB4MjMsMHgwMCwweDAwLAorMHg4ZiwweGIwLDB4MDAsMHgwMCwweGE2LDB4NDMsMHgwMCwweDAwLDB4OGYsMHhiMSwweDAwLDB4MDQsMHhhZSwweDYzLDB4MDAsMHgwMCwKKzB4OGYsMHhiMiwweDAwLDB4MDgsMHhhNiwweDgzLDB4MDAsMHgwMCwweDhmLDB4YjMsMHgwMCwweDBjLDB4YWUsMHhhMywweDAwLDB4MDAsCisweDhmLDB4YjQsMHgwMCwweDEwLDB4YTYsMHhjMywweDAwLDB4MDAsMHg4ZiwweGI1LDB4MDAsMHgxNCwweGFlLDB4ZTMsMHgwMCwweDAwLAorMHg3YiwweGI2LDB4MDAsMHhmYywweDNjLDB4MTgsMHhiMCwweDA5LDB4MzcsMHgxOCwweDAwLDB4M2MsMHhhNywweDAzLDB4MDAsMHgwMCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgyMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDUxLDB4MzgsMHhhYywweDYyLDB4MDAsMHgwMCwweDhjLDB4ODMsMHgwMCwweDM0LAorMHgzNCwweDAyLDB4ZmYsMHhmZiwweDAwLDB4NDMsMHgxMCwweDJhLDB4MTQsMHg0MCwweDAxLDB4MGIsMHgwMCwweDgwLDB4MzAsMHgyMSwKKzB4OGMsMHg4NCwweDAwLDB4MDgsMHgyNCwweDAyLDB4MDAsMHgwMywweDEwLDB4ODIsMHgwMCwweGZlLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhjLDB4YzIsMHgwMCwweDJjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHg0NywweDI0LDB4MDIsMHgwMCwweDA2LAorMHgzYywweDAzLDB4YjAsMHgwNSwweDM0LDB4NjMsMHgwNCwweDUwLDB4OTAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4ZmYsMHgxNCwweDQwLDB4MDAsMHhlNCwweGFjLDB4YzIsMHgwMCwweDJjLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDEwLDB4ODIsMHgwMCwweGUzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4ODIsMHgwMCwweGQxLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4YzcsMHgwMCwweDA0LDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGUyLDB4MDAsMHhjNywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4YywweGMyLDB4MDAsMHgxNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MDksCisweDI0LDB4MDIsMHgwMCwweDAxLDB4M2MsMHgwMywweGIwLDB4MDksMHgzNCwweDYzLDB4MDEsMHg2MCwweDkwLDB4NjIsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweGZmLDB4MTAsMHg0MCwweDAwLDB4MDUsMHhhYywweGMyLDB4MDAsMHgxNCwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHhhYywweGMyLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4YWMsMHhjMCwweDAwLDB4MTQsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAwLDB4ZDAsMHg4YywweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwNCwweDYxLDB4MDAsMHgxNiwweDNjLDB4MDMsMHhiMCwweDA1LDB4MzQsMHg2MywweDAyLDB4MmUsMHg5MCwweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHgwMSwweDE0LDB4NDAsMHgwMCwweDEwLDB4M2MsMHgwMiwweGIwLDB4MDUsCisweDM0LDB4NDIsMHgwMiwweDQyLDB4OTAsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NjAsMHgwMCwweDBiLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDgwLDB4YzIsMHgwMCwweDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwNywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDgwLDB4MDAsMHgwNSwweDI0LDB4MDIsMHgwMCwweDBlLDB4MjQsMHgwMywweDAwLDB4MDEsCisweGFjLDB4YzIsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhMCwweGMzLDB4MDAsMHg1MCwweDgwLDB4YzIsMHgwMCwweDMxLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDBhLDB4M2MsMHgwMiwweGIwLDB4MDYsMHgzNCwweDQyLDB4ODAsMHgxOCwKKzB4OGMsMHg0MywweDAwLDB4MDAsMHgzYywweDA0LDB4ZjAsMHgwMCwweDNjLDB4MDIsMHg4MCwweDAwLDB4MDAsMHg2NCwweDE4LDB4MjQsCisweDEwLDB4NjIsMHgwMCwweDAzLDB4MjQsMHgwMiwweDAwLDB4MDksMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4YzIsMHgwMCwweDAwLAorMHg4YywweGMyLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHg2MCwweDAwLDB4MDksMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHhiMCwweDA1LDB4MzQsMHg0MiwweDAyLDB4MmMsCisweDhjLDB4NDMsMHgwMCwweDAwLDB4M2MsMHgwNCwweDAwLDB4MDIsMHgwMCwweDY0LDB4MTgsMHgyNCwweDE0LDB4NjAsMHhmZiwweGYyLAorMHgyNCwweDAyLDB4MDAsMHgxMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4MzQsMHg2MywweDAyLDB4MDEsMHg5MCwweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHg4MCwweDEwLDB4NDAsMHgwMCwweDBlLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhjLDB4YzMsMHgwMCwweDBjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhYywweGMzLDB4MDAsMHgxMCwweDNjLDB4MDIsMHhiMCwweDAzLAorMHg5MCwweDQyLDB4MDIsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MGYsMHhhYywweGMyLDB4MDAsMHgwYywKKzB4OTAsMHhjMywweDAwLDB4MGYsMHgyNCwweDAyLDB4MDAsMHgwZCwweDNjLDB4MDEsMHhiMCwweDAzLDB4MDgsMHgwMCwweDE0LDB4YTYsCisweGEwLDB4MjMsMHgwMiwweDAxLDB4M2MsMHgwMiwweGIwLDB4MDksMHgzNCwweDQyLDB4MDEsMHg4MCwweDkwLDB4NDQsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgxZSwweDAwLDB4MDAsMHgwMywweDFlLDB4MDMsMHgxMCwweDYwLDB4MDAsMHgxNSwKKzB4YTAsMHhjNCwweDAwLDB4NDQsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4NjIsMHgwMCwweDBiLDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDEwLDB4NjIsMHgwMCwweDAzLDB4MjQsMHgwMywweDAwLDB4MGQsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4YywweGMyLDB4MDAsMHgwYywweGFjLDB4YzMsMHgwMCwweDAwLDB4MjQsMHgwMywweDAwLDB4MDQsMHhhYywweGMyLDB4MDAsMHgxMCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweGMzLDB4MDAsMHgwYywweDI0LDB4MDIsMHgwMCwweDBkLDB4YWMsMHhjMiwweDAwLDB4MDAsCisweDI0LDB4MDMsMHgwMCwweDA0LDB4MjQsMHgwMiwweDAwLDB4MDYsMHhhYywweGMzLDB4MDAsMHgxMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHhhYywweGMyLDB4MDAsMHgwYywweDhjLDB4YzMsMHgwMCwweDM4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyYywweDYyLDB4MDAsMHgwNiwKKzB4MTAsMHg0MCwweDAwLDB4MmUsMHgwMCwweDAzLDB4MTAsMHg4MCwweDNjLDB4MDMsMHg4MCwweDAxLDB4MjQsMHg2MywweDAyLDB4MDAsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhlMiwweDAwLDB4MDYsMHgyNCwweDAyLDB4MDAsMHgwMywKKzB4OGMsMHhhMiwweDAyLDB4YmMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDA2LDB4M2MsMHgwMywweGIwLDB4MDYsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4YWMsMHhjMiwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHhhYywweGMyLDB4MDAsMHgzOCwweDM0LDB4NjMsMHg4MCwweDI0LDB4OGMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4ZmYsMHgxMCwweDQwLDB4MDAsMHgwNSwweGFjLDB4YzIsMHgwMCwweDE4LDB4MjQsMHgwMiwweDAwLDB4MDIsCisweGFjLDB4YzIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDE0LDB4ZmEsMHhhYywweGMwLDB4MDAsMHgxOCwweDA4LDB4MDAsMHgxNCwweGZhLAorMHhhYywweGMwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MjQsMHgwMywweDAwLDB4MGIsMHhhYywweGMyLDB4MDAsMHgzOCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweGMzLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhlMiwweDAwLDB4MDUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MGMsMHhhYywweGMyLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxNCwweGZiLAorMHgyNCwweDAyLDB4MDAsMHgwNCwweDA4LDB4MDAsMHgxNSwweDEyLDB4MjQsMHgwMiwweDAwLDB4MDMsMHhhYywweGMwLDB4MDAsMHgzOCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweGMwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhlMiwweDAwLDB4MDUsCisweDI0LDB4MDIsMHgwMCwweDAzLDB4ODAsMHhjMiwweDAwLDB4MzAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDA4LAorMHgyNCwweDAyLDB4MDAsMHgwNCwweGFjLDB4YzIsMHgwMCwweDAwLDB4OTMsMHg4MiwweDg2LDB4M2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTQsMHg0MCwweGZmLDB4ZDYsMHgyNCwweDAyLDB4MDAsMHgwNSwweDAzLDB4ZTAsMHgwMCwweDA4LDB4YWMsMHhjMCwweDAwLDB4MzgsCisweDA4LDB4MDAsMHgxNSwweDIyLDB4YWMsMHhjMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwNiwweDM0LDB4NDIsMHg4MCwweDE4LAorMHg4YywweDQzLDB4MDAsMHgwMCwweDNjLDB4MDQsMHhmMCwweDAwLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgwMCwweDY0LDB4MTgsMHgyNCwKKzB4MTAsMHg2MiwweDAwLDB4MDMsMHgyNCwweDAyLDB4MDAsMHgwOSwweDA4LDB4MDAsMHgxNSwweDI2LDB4YWMsMHhjMiwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDA1LDB4MDgsMHgwMCwweDE1LDB4MTgsMHhhYywweGMyLDB4MDAsMHgzOCwweDgwLDB4YzIsMHgwMCwweDMwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHhmZiwweDM3LDB4MjQsMHgwMiwweDAwLDB4MDQsMHgwOCwweDAwLDB4MTQsMHhhNiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4NCwweGMyLDB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweGZmLDB4NjYsCisweDI0LDB4MDIsMHgwMCwweDA2LDB4M2MsMHgwMiwweGIwLDB4MDUsMHgzNCwweDQyLDB4MDIsMHgyZSwweDkwLDB4NDMsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NjMsMHgwMCwweDAxLDB4MzAsMHg2MywweDAwLDB4ZmYsMHgwMCwweDYwLDB4MTAsMHgyMSwKKzB4MTQsMHg0MCwweGZmLDB4MjQsMHhhNCwweGMzLDB4MDAsMHgyMCwweDA4LDB4MDAsMHgxNCwweGE2LDB4MjQsMHgwMiwweDAwLDB4MDYsCisweDhjLDB4YzIsMHgwMCwweDFjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4ZmYsMHg1NywweDI0LDB4MDIsMHgwMCwweDA1LAorMHgzYywweDAzLDB4YjAsMHgwNSwweDM0LDB4NjMsMHgwMiwweDJjLDB4OGMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4ZmYsMHgxMCwweDQwLDB4ZmYsMHgxNCwweGFjLDB4YzIsMHgwMCwweDFjLDB4MDgsMHgwMCwweDE0LDB4YTYsCisweDI0LDB4MDIsMHgwMCwweDA1LDB4M2MsMHgwMiwweGIwLDB4MDUsMHg4YywweDQyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAyLDB4MTcsMHg0MiwweDMwLDB4NDIsMHgwMCwweDAxLDB4MTQsMHg0MCwweGZmLDB4NDcsMHgyNCwweDAyLDB4MDAsMHgwNiwKKzB4MDgsMHgwMCwweDE0LDB4NWMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDBhLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGFjLDB4ODIsMHgwMCwweDAwLDB4MjcsMHhiZCwweGZmLDB4ZDgsMHhhZiwweGIwLDB4MDAsMHgxMCwweDI3LDB4OTAsMHg4NiwweDQ4LAorMHhhZiwweGJmLDB4MDAsMHgyMCwweGFmLDB4YjMsMHgwMCwweDFjLDB4YWYsMHhiMiwweDAwLDB4MTgsMHgwYywweDAwLDB4MmIsMHhlOCwKKzB4YWYsMHhiMSwweDAwLDB4MTQsMHhhZiwweDkwLDB4OGYsMHhkMCwweDQ4LDB4MDIsMHgwMCwweDAwLDB4MGMsMHgwMCwweDEzLDB4ZWMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDE4LDB4NGUsMHgwMiwweDAwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgwMCwweDM0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgxMywweGY3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODQsMHg2OCwKKzB4MGMsMHgwMCwweDI3LDB4YzEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkzLDB4ODQsMHg4MCwweDEwLDB4MGMsMHgwMCwweDIxLDB4OWEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4NCwweDg5LDB4MDgsMHgwYywweDAwLDB4MDYsMHhlMSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwYywweDAwLDB4MDEsMHgzYiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4NCwweDg0LDB4MTAsMHgwYywweDAwLDB4MTMsMHhkNSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDgyLDB4ODksMHgzYywweGFmLDB4ODIsMHg4NCwweDUwLDB4MGMsMHgwMCwweDAwLDB4NjEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzNCwweDYzLDB4MDEsMHgwOCwweDNjLDB4MDQsMHhiMCwweDA5LAorMHgzYywweDA1LDB4YjAsMHgwOSwweDhjLDB4NjYsMHgwMCwweDAwLDB4MzQsMHg4NCwweDAxLDB4NjgsMHgyNCwweDAyLDB4YzgsMHg4MCwKKzB4MzQsMHhhNSwweDAxLDB4NDAsMHgyNCwweDAzLDB4MDAsMHgwYSwweGE0LDB4ODIsMHgwMCwweDAwLDB4YTQsMHhhMywweDAwLDB4MDAsCisweDNjLDB4MDQsMHhiMCwweDAzLDB4OGMsMHg4MiwweDAwLDB4MDAsMHg4ZiwweDg3LDB4ODQsMHgxMCwweGFmLDB4ODYsMHg4NCwweDA4LAorMHgzNCwweDQyLDB4MDAsMHgyMCwweGFjLDB4ODIsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDAsMHg1OCwKKzB4OGMsMHg0MywweDAwLDB4MDAsMHgyYywweGU0LDB4MDAsMHgxMSwweDM0LDB4NjMsMHgwMSwweDAwLDB4YWMsMHg0MywweDAwLDB4MDAsCisweDEwLDB4ODAsMHhmZiwweGZhLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAzLDB4ODAsMHgwMSwweDAwLDB4MDcsMHgxMCwweDgwLAorMHgyNCwweDYzLDB4MDIsMHgxOCwweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHg4MCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODQsMHg4NCwweDY4LDB4MGMsMHgwMCwweDI2LDB4ZTUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4NCwweDg0LDB4MTAsMHgyNywweDg1LDB4ODYsMHg0OCwweDBjLDB4MDAsMHgxNCwweDRlLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhiMCwweDA5LDB4MzQsMHg0MiwweDAwLDB4MDcsMHgzYywweDAzLDB4YjAsMHgwNiwKKzB4OTAsMHg0NCwweDAwLDB4MDAsMHgzNCwweDYzLDB4ODAsMHgxOCwweDhjLDB4NjUsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDM0LDB4NDIsMHgwMCwweGVjLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzMCwweDg2LDB4MDAsMHhmZiwweGEwLDB4NDYsMHgwMCwweDAwLAorMHgwMCwweDA1LDB4MmYsMHgwMiwweDM0LDB4NjMsMHgwMCwweGVkLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGMyLDB4MDAsMHgyYywKKzB4YTAsMHg2NSwweDAwLDB4MDAsMHhhMywweDgwLDB4ODEsMHg1OCwweDkzLDB4ODMsMHg4MSwweGYxLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDEwLDB4NjIsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweDg3LDB4ODQsMHgxMCwweDhmLDB4ODIsMHg4NCwweDQ0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDAxLDB4YWYsMHg4MiwweDg0LDB4NDQsMHgwOCwweDAwLDB4MTUsMHg5YiwKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHg4ZiwweDg3LDB4ODQsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHhlMiwweGZmLDB4ZmMsCisweDJjLDB4NDIsMHgwMCwweDAzLDB4MTQsMHg0MCwweDAwLDB4MGEsMHgzYywweDAzLDB4YjAsMHgwNiwweDkzLDB4ODIsMHg4NiwweDNjLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDA3LDB4MzQsMHg2MywweDgwLDB4MTgsMHgyNywweDg0LDB4ODQsMHg2OCwKKzB4MGMsMHgwMCwweDI3LDB4NzUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4ODcsMHg4NCwweDEwLDB4M2MsMHgwMywweGIwLDB4MDYsCisweDM0LDB4NjMsMHg4MCwweDE4LDB4OGMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxNywweDAyLAorMHgxMCwweDQwLDB4ZmYsMHhlNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHg4MiwweGJjLDB4MTAsMHg4ZiwweDg0LDB4YmMsMHgxOCwKKzB4M2MsMHgwNSwweGIwLDB4MDEsMHgwMCwweDQ1LDB4MTAsMHgyMSwweGFjLDB4NDQsMHgwMCwweDAwLDB4OGYsMHg4MywweGJjLDB4MTAsCisweDhmLDB4ODIsMHhiYywweDE0LDB4MDAsMHg2NSwweDE4LDB4MjEsMHgwOCwweDAwLDB4MTUsMHhjNywweGFjLDB4NjIsMHgwMCwweDA0LAorMHgxNCwweGEwLDB4ZmYsMHhkNCwweDNjLDB4MDIsMHhiMCwweDAzLDB4OTMsMHg4MywweDgxLDB4NTgsMHgzNCwweDQyLDB4MDAsMHhlZSwKKzB4MjQsMHg2MywweDAwLDB4MDEsMHgzMCwweDY0LDB4MDAsMHhmZiwweDJjLDB4ODQsMHgwMCwweGYxLDB4YTAsMHg0MywweDAwLDB4MDAsCisweGEzLDB4ODMsMHg4MSwweDU4LDB4MTQsMHg4MCwweGZmLDB4Y2MsMHgwMCwweDAwLDB4MDAsMHgwMCwweGFmLDB4ODYsMHg4NCwweDI0LAorMHhhMywweDg2LDB4ODYsMHgyMywweDA4LDB4MDAsMHgxNSwweGMxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODQsMHg2OCwKKzB4MGMsMHgwMCwweDI5LDB4NmUsMHgwMCwweDAwLDB4MDAsMHgwMCwweGEzLDB4ODIsMHg4NCwweDQxLDB4OGYsMHg4MiwweDg0LDB4NDQsCisweGFmLDB4ODAsMHg4NCwweDEwLDB4MjQsMHg0MiwweDAwLDB4MDEsMHhhZiwweDgyLDB4ODQsMHg0NCwweDA4LDB4MDAsMHgxNSwweDlhLAorMHgwMCwweDAwLDB4MzgsMHgyMSwweDI3LDB4ODQsMHg4NiwweDQ4LDB4MGMsMHgwMCwweDE5LDB4MTksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4ZmYsMHgxNCwweDQwLDB4MDAsMHgwNSwweDNjLDB4MDMsMHhiMCwweDA1LDB4YWYsMHg4MCwweDg0LDB4MTAsCisweGFmLDB4ODAsMHg4NCwweDE0LDB4MDgsMHgwMCwweDE1LDB4YzYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDM0LDB4NjMsMHgwNCwweDUwLAorMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmYsMHhhZiwweDgyLDB4ODQsMHgzYywKKzB4MTQsMHg0MCwweDAwLDB4MjAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDhmLDB4ODQsMHg4NCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4ODIsMHgwMCwweDIwLDB4M2MsMHgwMywweGIwLDB4MDksMHgzNCwweDYzLDB4MDEsMHg2MCwweDkwLDB4NjIsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweGZmLDB4YWYsMHg4MiwweDg0LDB4MjQsMHgxNCwweDQwLDB4MDAsMHgxNSwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4ODIsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDcsMHgwMCwweDAzLDB4MjQsMHgwMiwweDAwLDB4MDEsMHhhZiwweDgyLDB4ODQsMHgxNCwweGFmLDB4ODcsMHg4NCwweDEwLAorMHgwOCwweDAwLDB4MTUsMHhjNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDUsMHgzNCwweDQyLDB4MDIsMHgyZSwKKzB4OTAsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NjMsMHgwMCwweDAxLDB4MzAsMHg2MywweDAwLDB4ZmYsCisweDAwLDB4NjAsMHgxMCwweDIxLDB4YTcsMHg4MywweDg0LDB4MzAsMHgxNCwweDQwLDB4ZmYsMHhmMSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweGFmLDB4ODIsMHg4NCwweDE0LDB4YWYsMHg4MCwweDg0LDB4MTAsMHgwOCwweDAwLDB4MTUsMHhjNiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwNSwweDM0LDB4NjMsMHgwMiwweDJjLDB4OGMsMHg2MiwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmYsMHhhZiwweDgyLDB4ODQsMHgyYywweDE0LDB4NDAsMHhmZiwweGY1LAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDA4LDB4MDAsMHgxNiwweDFhLDB4M2MsMHgwMywweGIwLDB4MDksMHgyNywweDg0LDB4ODYsMHg0OCwKKzB4MGMsMHgwMCwweDFhLDB4ZGUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgzLDB4ODIsMHg4NCwweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE0LDB4NDAsMHhmZiwweGVjLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgzYywweDAzLDB4YjAsMHgwNSwweDM0LDB4NjMsMHgwNCwweDUwLAorMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmYsMHhhZiwweDgyLDB4ODQsMHgzYywKKzB4MTQsMHg0MCwweGZmLDB4ZTQsMHgyNCwweDAyLDB4MDAsMHgwMiwweDhmLDB4ODQsMHg4NCwweDE4LDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDEwLDB4ODIsMHgwMCwweDEyLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweDgyLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDA3LDB4MDAsMHgwNCwweDA4LDB4MDAsMHgxNiwweDI2LDB4MjQsMHgwMiwweDAwLDB4MDIsMHgzYywweDAyLDB4YjAsMHgwNSwKKzB4MzQsMHg0MiwweDAyLDB4MmUsMHg5MCwweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MywweDAwLDB4MDEsCisweDMwLDB4NjMsMHgwMCwweGZmLDB4MDAsMHg2MCwweDEwLDB4MjEsMHhhNywweDgzLDB4ODQsMHgzMCwweDE0LDB4NDAsMHhmZiwweGY0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxNiwweDM1LDB4MjQsMHgwMiwweDAwLDB4MDIsMHgzYywweDAzLDB4YjAsMHgwNSwKKzB4MzQsMHg2MywweDAyLDB4MmMsMHg4YywweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmYsCisweGFmLDB4ODIsMHg4NCwweDJjLDB4MTQsMHg0MCwweGZmLDB4ZjcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxNiwweDU2LAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDI3LDB4ODQsMHg4OSwweDA4LDB4MGMsMHgwMCwweDBiLDB4NTEsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGYsMHg4MywweDg0LDB4MTQsMHhhZiwweDgyLDB4ODQsMHgyYywweDM4LDB4NjQsMHgwMCwweDAyLDB4MDAsMHgwNCwweDE4LDB4MGEsCisweGFmLDB4ODMsMHg4NCwweDE0LDB4MTQsMHg0MCwweGZmLDB4YWQsMHgyNCwweDA3LDB4MDAsMHgwNSwweDhmLDB4ODIsMHg4OSwweDQ4LAorMHhhZiwweDgwLDB4ODQsMHgxMCwweDEwLDB4NDAsMHgwMCwweDAyLDB4MjQsMHgwNCwweDAwLDB4MDEsMHhhZiwweDg0LDB4ODQsMHgxOCwKKzB4OTMsMHg4MiwweDg5LDB4NTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHhmZiwweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHhiMCwweDA1LDB4MzQsMHg0MiwweDAwLDB4MDgsMHg4YywweDQzLDB4MDAsMHgwMCwweDNjLDB4MDQsMHgyMCwweDAwLAorMHgwMCwweDY0LDB4MTgsMHgyNCwweDEwLDB4NjAsMHhmZiwweDNjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4MzQsMHg0MiwweDAwLDB4YTAsMHg4YywweDQzLDB4MDAsMHgwMCwweDNjLDB4MDQsMHg4MCwweDAwLDB4YWYsMHg4MCwweDg5LDB4MzAsCisweDI0LDB4NjMsMHgwMCwweDAxLDB4YWMsMHg0MywweDAwLDB4MDAsMHgzYywweDAxLDB4YjAsMHgwNSwweGFjLDB4MjQsMHgwMCwweDA4LAorMHhhZiwweDgwLDB4ODksMHgyYywweGFmLDB4ODAsMHg4OSwweDM0LDB4YWYsMHg4MCwweDg5LDB4MzgsMHhhZiwweDgwLDB4ODksMHg0NCwKKzB4YWYsMHg4MCwweDg5LDB4M2MsMHgwOCwweDAwLDB4MTUsMHhjNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODMsMHg4MiwweDg0LDB4NjAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MDIsMHgyNCwweDAyLDB4MDAsMHgyMCwweGFmLDB4ODIsMHg4NCwweDJjLAorMHg4ZiwweDg1LDB4ODQsMHgyYywweDI3LDB4ODQsMHg4OSwweDA4LDB4MGMsMHgwMCwweDBkLDB4MmMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMiwweDFlLDB4MDAsMHhhMywweDgyLDB4ODQsMHg0MCwweGFmLDB4ODAsMHg4NCwweDJjLDB4MTAsMHg2MCwweGZmLDB4OGUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDUsMHgzNCwweDQyLDB4MDIsMHgyZSwweDkwLDB4NDMsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NjMsMHgwMCwweDAxLDB4MzAsMHg2MywweDAwLDB4ZmYsMHgwMCwweDYwLDB4MTAsMHgyMSwKKzB4YTcsMHg4MywweDg0LDB4MzAsMHgxMCwweDQwLDB4MDAsMHgwNCwweDI0LDB4MDQsMHgwMCwweDAyLDB4YWYsMHg4NCwweDg0LDB4MTgsCisweDA4LDB4MDAsMHgxNiwweDM2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTYsMHgyNywweDI0LDB4MDcsMHgwMCwweDA2LAorMHgyNywweDg0LDB4ODQsMHgxMCwweDI3LDB4ODUsMHg4OSwweDA4LDB4MGMsMHgwMCwweDBkLDB4ZjksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGYsMHg4MiwweDg0LDB4MzQsMHhhZiwweDgwLDB4ODQsMHgzYywweDE0LDB4NDAsMHgwMCwweDE5LDB4MDAsMHg0MCwweDE4LDB4MjEsCisweDhmLDB4ODIsMHg4NCwweDM4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgxNSwweDI0LDB4MDIsMHgwMCwweDAyLAorMHg4ZiwweDgzLDB4ODQsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg2MiwweDAwLDB4MGIsMHgzYywweDAyLDB4NDAsMHgwMCwKKzB4OGYsMHg4MywweDg0LDB4MTQsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4NjIsMHgwMCwweDAyLDB4MjQsMHgwNywweDAwLDB4MDMsCisweDI0LDB4MDcsMHgwMCwweDA2LDB4YWYsMHg4NywweDg0LDB4MTAsMHgyNCwweDA0LDB4MDAsMHgwMywweGFmLDB4ODQsMHg4NCwweDE4LAorMHgwOCwweDAwLDB4MTUsMHhjNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzQsMHg0MiwweDAwLDB4MTQsMHgzYywweDAxLDB4YjAsMHgwNSwKKzB4YWMsMHgyMiwweDAwLDB4MDAsMHhhZiwweDgwLDB4ODQsMHgxMCwweDA4LDB4MDAsMHgxNiwweGNmLDB4MjQsMHgwNCwweDAwLDB4MDMsCisweDEwLDB4NjAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODQsMHgxMCwweDI3LDB4ODUsMHg4OSwweDA4LAorMHgwYywweDAwLDB4MGUsMHgxZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHg4MywweDg0LDB4MTQsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4YTMsMHg4MCwweDg0LDB4NDAsMHhhZiwweDgwLDB4ODQsMHgxOCwweDEwLDB4NjIsMHgwMCwweDAyLDB4MjQsMHgwNywweDAwLDB4MDMsCisweDI0LDB4MDcsMHgwMCwweDA0LDB4YWYsMHg4NywweDg0LDB4MTAsMHhhZiwweDgwLDB4ODQsMHgzNCwweDA4LDB4MDAsMHgxNSwweGM2LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDgzLDB4ODIsMHg4NCwweDYwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODksMHgwOCwweDBjLDB4MDAsMHgxMCwweDY1LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhmLDB4ODIsMHg4NCwweDE0LDB4YTMsMHg4MCwweDg0LDB4NDAsMHhhZiwweDgwLDB4ODQsMHgxMCwweGFmLDB4ODAsMHg4NCwweDE4LAorMHgxNCwweDQwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsMHhhZiwweDgyLDB4ODQsMHgxNCwKKzB4YWYsMHg4MCwweDg0LDB4MzgsMHgwOCwweDAwLDB4MTUsMHhjNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4NCwweDg0LDB4MTAsCisweDI3LDB4ODUsMHg4OSwweDA4LDB4MGMsMHgwMCwweDBlLDB4MWQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4ODIsMHg4NCwweDE0LAorMHhhMywweDgwLDB4ODQsMHg0MCwweGFmLDB4ODAsMHg4NCwweDEwLDB4YWYsMHg4MCwweDg0LDB4MTgsMHgxNCwweDQwLDB4ZmUsMHhjMiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwweGFmLDB4ODIsMHg4NCwweDE0LDB4MDgsMHgwMCwweDE1LDB4YzYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4NCwweDg5LDB4MDgsMHgwYywweDAwLDB4MTAsMHg2NSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MTYsMHhmZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4NCwweDg0LDB4NjgsMHgwYywweDAwLDB4MmEsMHg5NiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTUsMHhmZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDI0LDB4NjYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDI3LDB4NTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgxOCwweDQwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODQsMHg4NCwweDY4LDB4MGMsMHgwMCwweDI3LDB4NjQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OTMsMHg4MywweGJjLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NjAsMHgwMCwweDJiLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDM0LDB4NDIsMHgwMSwweDA4LDB4OGMsMHg0NCwweDAwLDB4MDAsMHg4ZiwweDgzLDB4YmMsMHgwMCwweDhmLDB4ODIsMHhiYywweDA0LAorMHgwMCwweDgzLDB4MTgsMHgyMywweDAwLDB4NDMsMHgxMCwweDJiLDB4MTAsMHg0MCwweDAwLDB4MjMsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4MjQsMHgwNCwweDA1LDB4YTAsMHgzNCwweDQyLDB4MDEsMHgxOCwweDhjLDB4NDIsMHgwMCwweDAwLDB4MGMsMHgwMCwweDA2LDB4Y2UsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwNCwweDA1LDB4YTQsMHgwYywweDAwLDB4MDYsMHhjZSwweDAwLDB4MDIsMHg4NCwweDAyLAorMHgzMCwweDUxLDB4ZmYsMHhmZiwweDI0LDB4MDQsMHgwNSwweGE4LDB4MDAsMHgwMiwweDk0LDB4MDIsMHgwYywweDAwLDB4MDYsMHhjZSwKKzB4M2EsMHgxMCwweGZmLDB4ZmYsMHgzYSwweDMxLDB4ZmYsMHhmZiwweDMwLDB4NDIsMHhmZiwweGZmLDB4MmUsMHgxMCwweDAwLDB4MDEsCisweDJlLDB4MzEsMHgwMCwweDAxLDB4M2EsMHg1MiwweGZmLDB4ZmYsMHgwMiwweDExLDB4ODAsMHgyNSwweDJlLDB4NTIsMHgwMCwweDAxLAorMHgzOCwweDQyLDB4ZmYsMHhmZiwweDAyLDB4MTIsMHg4MCwweDI1LDB4MmMsMHg0MiwweDAwLDB4MDEsMHgwMiwweDAyLDB4ODAsMHgyNSwKKzB4MTYsMHgwMCwweDAwLDB4MDIsMHgyNCwweDA0LDB4MDAsMHgwMiwweDAwLDB4MDAsMHgyMCwweDIxLDB4MGMsMHgwMCwweDA1LDB4NzAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDEsMHgwOCwweDhjLDB4NDMsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweGFmLDB4ODMsMHhiYywweDAwLDB4MGMsMHgwMCwweDAxLDB4ZWIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4YWYsMHg4MCwweDg0LDB4MTAsMHhhZiwweDgwLDB4ODQsMHg0NCwweDA4LDB4MDAsMHgxNSwweDlhLDB4MDAsMHgwMCwweDM4LDB4MjEsCisweDI3LDB4OTAsMHhiMywweGYwLDB4MjQsMHgxMSwweDAwLDB4MTIsMHg4ZSwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5MCwweDgyLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MGMsMHgwMCwweDIwLDB4ZDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI2LDB4MzEsMHhmZiwweGZmLDB4MDYsMHgyMSwweGZmLDB4ZjYsCisweDI2LDB4MTAsMHgwMCwweDA0LDB4YWYsMHg4MCwweDg0LDB4MTAsMHgwOCwweDAwLDB4MTUsMHhjNywweDAwLDB4MDAsMHgzOCwweDIxLAorMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMSwweDA4LDB4OGMsMHg0NCwweDAwLDB4MDAsMHg4ZiwweDgyLDB4ODQsMHgwOCwKKzB4MDAsMHgwNCwweDE5LDB4YzIsMHgwMCwweDAyLDB4MTEsMHhjMiwweDEwLDB4NjIsMHhmZiwweGY2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAxLDB4MDIsMHg5MCwweDQzLDB4MDAsMHgwMCwweDNjLDB4MTIsMHhiMCwweDA1LAorMHhhZiwweDg0LDB4ODQsMHgwOCwweDMwLDB4NjMsMHgwMCwweGZmLDB4MDAsMHgwMywweDExLDB4NDAsMHgwMCwweDQzLDB4MTAsMHgyMywKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHg5OSwweDAwLDB4MDAsMHgwMCwweDg4LDB4MjEsCisweDM2LDB4NTIsMHgwMiwweDJjLDB4MjcsMHg5MCwweGIzLDB4ZjAsMHg4ZSwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5MCwweDgzLDB4MDAsMHgxNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MiwweDAwLDB4MDMsMHgxMCwweDQwLDB4MDAsMHgwNiwKKzB4MzAsMHg2MiwweDAwLDB4MWMsMHgxNCwweDQwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHg4NSwweDg0LDB4MDgsCisweDBjLDB4MDAsMHgxZSwweGIyLDB4MDIsMHg2MCwweDMwLDB4MjEsMHg4ZSwweDQyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDQyLDB4MDAsMHhmZiwweDE0LDB4NDAsMHhmZiwweGQ3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNiwweDMxLDB4MDAsMHgwMSwKKzB4MmEsMHgyMiwweDAwLDB4MTMsMHgxNCwweDQwLDB4ZmYsMHhlYywweDI2LDB4MTAsMHgwMCwweDA0LDB4MDgsMHgwMCwweDE3LDB4NWQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHg4NCwweDg0LDB4MWMsMHgyNywweDg1LDB4ODksMHgwOCwweDBjLDB4MDAsMHgxNywweGQzLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4ODMsMHg4NCwweDFjLDB4MjQsMHgwMiwweDAwLDB4MDQsMHgxNCwweDYyLDB4ZmUsMHhhMiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTYsMHgyNywweDI0LDB4MDcsMHgwMCwweDA1LDB4MjcsMHg4NCwweDg5LDB4MDgsCisweDBjLDB4MDAsMHgyNCwweDhkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDA3LDB4MDAsMHgwNSwweGFmLDB4ODcsMHg4NCwweDEwLAorMHgwOCwweDAwLDB4MTUsMHhjNywweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHg4MiwweDg5LDB4M2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHg0MCwweDAwLDB4MGQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4ODQsMHhiNCwweDMwLDB4YWYsMHg4MCwweDg5LDB4M2MsCisweDk0LDB4ODUsMHgwMCwweDE0LDB4MGMsMHgwMCwweDFiLDB4ODQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkzLDB4ODIsMHg4YiwweDYxLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDAyLDB4MTAsMHg0MCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MGMsMHgwMCwweDAxLDB4NTksMHgwMCwweDAwLDB4MjAsMHgyMSwweDhmLDB4ODQsMHhiNCwweDMwLDB4MGMsMHgwMCwweDIwLDB4ZDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDE3LDB4NWQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhmZiwweDkwLAorMHgyNywweGJkLDB4ZmYsMHhlOCwweDAwLDB4ODAsMHgxOCwweDIxLDB4MzQsMHg0MiwweDAwLDB4MDEsMHgyNywweDg0LDB4ODksMHgwOCwKKzB4MTAsMHg2MiwweDAwLDB4MDUsMHhhZiwweGJmLDB4MDAsMHgxMCwweDhmLDB4YmYsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsMHgwYywweDAwLDB4MDYsMHhlMSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNywweDg0LDB4ODYsMHg0OCwweDBjLDB4MDAsMHgxOCwweDRlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODQsMHgxMCwKKzB4MGMsMHgwMCwweDEzLDB4ZDUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxNywweGJhLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhmLDB4ODIsMHg4OSwweDQ4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgxOCwweDIxLAorMHg4ZiwweDgyLDB4ODQsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMywweDAwLDB4MDEsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4NjAsMHgxMCwweDIxLDB4MjcsMHhiZCwweGZmLDB4ZTAsCisweDNjLDB4MDYsMHhiMCwweDAzLDB4YWYsMHhiMSwweDAwLDB4MTQsMHhhZiwweGIwLDB4MDAsMHgxMCwweDM0LDB4YzYsMHgwMCwweDVmLAorMHhhZiwweGJmLDB4MDAsMHgxOCwweDkwLDB4YzMsMHgwMCwweDAwLDB4M2MsMHgwNywweGIwLDB4MDMsMHgzNCwweGU3LDB4MDAsMHg1ZCwKKzB4MzQsMHg2MywweDAwLDB4MDEsMHgzYywweDA5LDB4YjAsMHgwMywweDI0LDB4MDIsMHgwMCwweDAxLDB4YTAsMHhjMywweDAwLDB4MDAsCisweDAwLDB4ODAsMHg4MCwweDIxLDB4YTAsMHhlMiwweDAwLDB4MDAsMHgwMCwweGEwLDB4ODgsMHgyMSwweDM1LDB4MjksMHgwMCwweDVlLAorMHgwMCwweGUwLDB4NDAsMHgyMSwweDI0LDB4MDQsMHgwMCwweDAxLDB4OTEsMHgyMiwweDAwLDB4MDAsMHg5MSwweDAzLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4MDEsMHgxNCwweDgzLDB4MDAsMHgwMywweDMwLDB4NDIsMHgwMCwweDAxLDB4MTQsMHg0MCwweGZmLDB4ZmEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDQsMHgxMiwweDAyLDB4MDAsMHgyYywweDI0LDB4MDUsMHgwZiwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwNiwweDEyLDB4MDIsMHgwMCwweDA4LDB4MjQsMHgwNSwweDAwLDB4MGYsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4MzQsMHg0MiwweDAyLDB4MDAsMHhhMCwweDUwLDB4MDAsMHgwMCwweDhmLDB4YmYsMHgwMCwweDE4LDB4N2IsMHhiMCwweDAwLDB4YmMsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjAsMHgyNCwweDA0LDB4MGMsMHgwNCwweDBjLDB4MDAsMHgxMywweDViLAorMHgyNCwweDA2LDB4MDAsMHgwZiwweDI0LDB4MDQsMHgwZCwweDA0LDB4MjQsMHgwNSwweDAwLDB4MGYsMHgwYywweDAwLDB4MTMsMHg1YiwKKzB4MjQsMHgwNiwweDAwLDB4MGYsMHgyNCwweDA0LDB4MDgsMHg4MCwweDI0LDB4MDUsMHgxZSwweDAwLDB4MGMsMHgwMCwweDEzLDB4NWIsCisweDI0LDB4MDYsMHgwMCwweDBmLDB4MjQsMHgwNCwweDA4LDB4OGMsMHgyNCwweDA1LDB4MGYsMHgwMCwweDBjLDB4MDAsMHgxMywweDViLAorMHgyNCwweDA2LDB4MDAsMHgwZiwweDI0LDB4MDQsMHgwOCwweDI0LDB4M2MsMHgwNSwweDAwLDB4MzAsMHgwYywweDAwLDB4MTMsMHg1YiwKKzB4MjQsMHgwNiwweDAwLDB4MDIsMHgyNCwweDA0LDB4MDgsMHgyYywweDNjLDB4MDUsMHgwMCwweDMwLDB4MGMsMHgwMCwweDEzLDB4NWIsCisweDI0LDB4MDYsMHgwMCwweDAyLDB4MjQsMHgwNCwweDA4LDB4MzQsMHgzYywweDA1LDB4MDAsMHgzMCwweDBjLDB4MDAsMHgxMywweDViLAorMHgyNCwweDA2LDB4MDAsMHgwMiwweDI0LDB4MDQsMHgwOCwweDNjLDB4M2MsMHgwNSwweDAwLDB4MzAsMHgwYywweDAwLDB4MTMsMHg1YiwKKzB4MjQsMHgwNiwweDAwLDB4MDIsMHgwOCwweDAwLDB4MTcsMHhmNCwweDNjLDB4MDIsMHhiMCwweDAzLDB4MjQsMHgwNCwweDA4LDB4OGMsCisweDBjLDB4MDAsMHgxMywweDViLDB4MjQsMHgwNiwweDAwLDB4MDQsMHgyNCwweDA0LDB4MDgsMHg4MCwweDI0LDB4MDUsMHgxZSwweDAwLAorMHgwYywweDAwLDB4MTMsMHg1YiwweDI0LDB4MDYsMHgwMCwweDA0LDB4MjQsMHgwNCwweDBjLDB4MDQsMHgyNCwweDA1LDB4MDAsMHgwZiwKKzB4MGMsMHgwMCwweDEzLDB4NWIsMHgyNCwweDA2LDB4MDAsMHgwNCwweDI0LDB4MDQsMHgwZCwweDA0LDB4MjQsMHgwNSwweDAwLDB4MGYsCisweDBjLDB4MDAsMHgxMywweDViLDB4MjQsMHgwNiwweDAwLDB4MDQsMHgyNCwweDA0LDB4MDgsMHgyNCwweDNjLDB4MDUsMHgwMCwweDMwLAorMHgwYywweDAwLDB4MTMsMHg1YiwweDI0LDB4MDYsMHgwMCwweDAzLDB4MjQsMHgwNCwweDA4LDB4MmMsMHgzYywweDA1LDB4MDAsMHgzMCwKKzB4MGMsMHgwMCwweDEzLDB4NWIsMHgyNCwweDA2LDB4MDAsMHgwMywweDI0LDB4MDQsMHgwOCwweDM0LDB4M2MsMHgwNSwweDAwLDB4MzAsCisweDBjLDB4MDAsMHgxMywweDViLDB4MjQsMHgwNiwweDAwLDB4MDIsMHgzYywweDA1LDB4MDAsMHgzMCwweDI0LDB4MDYsMHgwMCwweDAzLAorMHgwYywweDAwLDB4MTMsMHg1YiwweDI0LDB4MDQsMHgwOCwweDNjLDB4MDIsMHgyMCwweDIwLDB4MjEsMHgyNCwweDA1LDB4MDAsMHgxNCwKKzB4MGMsMHgwMCwweDEzLDB4YTAsMHgyNCwweDA2LDB4MDEsMHgwNywweDA4LDB4MDAsMHgxNywweGY0LDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDNjLDB4MDMsMHhiMCwweDAzLDB4MzQsMHg2MywweDAwLDB4NzMsMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDQyLDB4MDAsMHgwMiwweDE0LDB4NDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhMywweDgwLDB4ODEsMHg1OSwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4YTMsMHg4MiwweDgxLDB4NTksCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLAorMHgwMCwweDgwLDB4NzAsMHgyMSwweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDYxLDB4MzgsMHgzYywweDA0LDB4YjAsMHgwMywKKzB4YWMsMHg2MiwweDAwLDB4MDAsMHgzNCwweDg0LDB4MDAsMHgzMCwweGFkLDB4YzAsMHgwMiwweGJjLDB4YWQsMHhjMCwweDAyLDB4YjgsCisweDhjLDB4ODMsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4ZmYsMHhhNSwweGMwLDB4MDAsMHgwYSwweDAwLDB4MDAsMHgzMCwweDIxLAorMHhhNywweDgyLDB4OGYsMHhlMCwweDI3LDB4ODgsMHg4ZiwweGYwLDB4YTUsMHhjMywweDAwLDB4MDgsMHgzYywweDA3LDB4YjAsMHgwOCwKKzB4MzAsMHhjMiwweGZmLDB4ZmYsMHgwMCwweDAyLDB4MjAsMHhjMCwweDI0LDB4YzMsMHgwMCwweDAxLDB4MDAsMHg4MiwweDEwLDB4MjEsCisweDAwLDB4NjAsMHgzMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgzMCwweDYzLDB4ZmYsMHhmZiwweDAwLDB4NDgsMHgxMCwweDIxLAorMHgwMCwweDg3LDB4MjAsMHgyMSwweDI4LDB4YzUsMHgwMCwweGZmLDB4YWMsMHg4MywweDAwLDB4MDAsMHgxNCwweGEwLDB4ZmYsMHhmNCwKKzB4YTQsMHg0MywweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwOCwweDM0LDB4MDMsMHhmZiwweGZmLDB4MjUsMHhjNCwweDAwLDB4MGMsCisweDI0LDB4MGEsMHgwMCwweDAyLDB4MzQsMHg0MiwweDA3LDB4ZjgsMHgzYywweDA2LDB4YjAsMHgwMywweGE3LDB4ODMsMHhiMywweGNjLAorMHhhYywweDQzLDB4MDAsMHgwMCwweGFmLDB4ODQsMHhiMywweGYwLDB4MzQsMHhjNiwweDAwLDB4NjQsMHhhMCwweDhhLDB4MDAsMHgxOCwKKzB4OTQsMHhjNSwweDAwLDB4MDAsMHg4ZiwweDgyLDB4YjMsMHhmMCwweDI1LDB4YzQsMHgwMCwweDMwLDB4MjQsMHgwOCwweDAwLDB4MDMsCisweDNjLDB4MDMsMHhiMCwweDAzLDB4YTAsMHg0NSwweDAwLDB4MjEsMHgzNCwweDYzLDB4MDAsMHg2NiwweGFmLDB4ODQsMHhiMywweGY0LAorMHhhMCwweDg4LDB4MDAsMHgxOCwweDk0LDB4NjUsMHgwMCwweDAwLDB4OGYsMHg4MiwweGIzLDB4ZjQsMHgyNSwweGM0LDB4MDAsMHg1NCwKKzB4MjUsMHhjNywweDAwLDB4NzgsMHhhMCwweDQ1LDB4MDAsMHgyMSwweGFmLDB4ODQsMHhiMywweGY4LDB4YTAsMHg4OCwweDAwLDB4MTgsCisweDk0LDB4NjUsMHgwMCwweDAwLDB4OGYsMHg4MiwweGIzLDB4ZjgsMHgyNSwweGM4LDB4MDAsMHg5YywweDI0LDB4MDksMHgwMCwweDAxLAorMHhhMCwweDQ1LDB4MDAsMHgyMSwweGFmLDB4ODcsMHhiMywweGZjLDB4YTAsMHhlYSwweDAwLDB4MTgsMHg5NCwweGM0LDB4MDAsMHgwMCwKKzB4OGYsMHg4MiwweGIzLDB4ZmMsMHgzYywweDAzLDB4YjAsMHgwMywweDM0LDB4NjMsMHgwMCwweDYyLDB4YTAsMHg0NCwweDAwLDB4MjEsCisweGFmLDB4ODgsMHhiNCwweDAwLDB4YTEsMHgwOSwweDAwLDB4MTgsMHg5NCwweDY1LDB4MDAsMHgwMCwweDhmLDB4ODIsMHhiNCwweDAwLAorMHgyNSwweGM0LDB4MDAsMHhjMCwweDNjLDB4MDYsMHhiMCwweDAzLDB4YTAsMHg0NSwweDAwLDB4MjEsMHhhZiwweDg0LDB4YjQsMHgwNCwKKzB4YTAsMHg4OSwweDAwLDB4MTgsMHg5NCwweDY1LDB4MDAsMHgwMCwweDhmLDB4ODIsMHhiNCwweDA0LDB4MjUsMHhjNCwweDAwLDB4ZTQsCisweDM0LDB4YzYsMHgwMCwweDYwLDB4YTAsMHg0NSwweDAwLDB4MjEsMHhhZiwweDg0LDB4YjQsMHgwOCwweGEwLDB4ODAsMHgwMCwweDE4LAorMHg5NCwweGM1LDB4MDAsMHgwMCwweDhmLDB4ODIsMHhiNCwweDA4LDB4MjUsMHhjMywweDAxLDB4MDgsMHgyNSwweGM3LDB4MDEsMHgyYywKKzB4YTAsMHg0NSwweDAwLDB4MjEsMHhhZiwweDgzLDB4YjQsMHgwYywweGEwLDB4NjAsMHgwMCwweDE4LDB4OTQsMHhjOCwweDAwLDB4MDAsCisweDhmLDB4ODIsMHhiNCwweDBjLDB4MjUsMHhjNCwweDAxLDB4NTAsMHgyNSwweGM1LDB4MDEsMHg3NCwweGEwLDB4NDgsMHgwMCwweDIxLAorMHgyNSwweGM2LDB4MDEsMHg5OCwweDI1LDB4YzksMHgwMSwweGJjLDB4MjUsMHhjYSwweDAxLDB4ZTAsMHgyNSwweGNiLDB4MDIsMHgwNCwKKzB4MjUsMHhjYywweDAyLDB4MjgsMHgyNSwweGNkLDB4MDIsMHg0YywweDI0LDB4MDIsMHgwMCwweDEwLDB4M2MsMHgwMywweGIwLDB4MDMsCisweGFmLDB4ODcsMHhiNCwweDEwLDB4MzQsMHg2MywweDAwLDB4MzgsMHhhMCwweGUwLDB4MDAsMHgxOCwweGFmLDB4ODQsMHhiNCwweDE0LAorMHhhMCwweDgwLDB4MDAsMHgxOCwweGFmLDB4ODUsMHhiNCwweDE4LDB4YTAsMHhhMCwweDAwLDB4MTgsMHhhZiwweDg2LDB4YjQsMHgxYywKKzB4YTAsMHhjMCwweDAwLDB4MTgsMHhhZiwweDg5LDB4YjQsMHgyMCwweGExLDB4MjAsMHgwMCwweDE4LDB4YWYsMHg4YSwweGI0LDB4MjQsCisweGExLDB4NDAsMHgwMCwweDE4LDB4YWYsMHg4YiwweGI0LDB4MjgsMHhhMSwweDYwLDB4MDAsMHgxOCwweGFmLDB4OGMsMHhiNCwweDJjLAorMHhhMSwweDgwLDB4MDAsMHgxOCwweGFmLDB4OGQsMHhiNCwweDMwLDB4YTEsMHhhMiwweDAwLDB4MTgsMHg5NCwweDY0LDB4MDAsMHgwMCwKKzB4OGYsMHg4MiwweGI0LDB4MzAsMHgyNSwweGM1LDB4MDIsMHg3MCwweDNjLDB4MDMsMHhiMCwweDAzLDB4YTAsMHg0NCwweDAwLDB4MjEsCisweDI0LDB4MDIsMHgwMCwweDExLDB4YWYsMHg4NSwweGI0LDB4MzQsMHgzNCwweDYzLDB4MDAsMHg2ZSwweGEwLDB4YTIsMHgwMCwweDE4LAorMHg5NCwweDY0LDB4MDAsMHgwMCwweDhmLDB4ODIsMHhiNCwweDM0LDB4MjUsMHhjNSwweDAyLDB4OTQsMHgzYywweDAzLDB4YjAsMHgwMywKKzB4YTAsMHg0NCwweDAwLDB4MjEsMHgyNCwweDAyLDB4MDAsMHgxMiwweGFmLDB4ODUsMHhiNCwweDM4LDB4MzQsMHg2MywweDAwLDB4NmMsCisweGEwLDB4YTIsMHgwMCwweDE4LDB4OTQsMHg2NCwweDAwLDB4MDAsMHg4ZiwweDgyLDB4YjQsMHgzOCwweDI0LDB4MDUsMHhmZiwweGZmLAorMHgyNCwweDA3LDB4MDAsMHgwMSwweGEwLDB4NDQsMHgwMCwweDIxLDB4MjQsMHgwNiwweDAwLDB4MTIsMHgyNywweDg0LDB4YjMsMHhmMCwKKzB4OGMsMHg4MiwweDAwLDB4MDAsMHgyNCwweGM2LDB4ZmYsMHhmZiwweGEwLDB4NDAsMHgwMCwweDA0LDB4OGMsMHg4MywweDAwLDB4MDAsCisweGE0LDB4NDUsMHgwMCwweDAwLDB4YTQsMHg0NSwweDAwLDB4MDIsMHhhMCwweDYwLDB4MDAsMHgwYSwweDhjLDB4ODIsMHgwMCwweDAwLAorMHhhNCwweDY1LDB4MDAsMHgwNiwweGE0LDB4NjUsMHgwMCwweDA4LDB4YTAsMHg0MCwweDAwLDB4MTAsMHg4YywweDgzLDB4MDAsMHgwMCwKKzB4YTQsMHg0NSwweDAwLDB4MGMsMHhhNCwweDQ1LDB4MDAsMHgwZSwweGEwLDB4NjAsMHgwMCwweDEyLDB4OGMsMHg4MiwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4YTAsMHg0MCwweDAwLDB4MTYsMHg4YywweDgzLDB4MDAsMHgwMCwweGE0LDB4NDUsMHgwMCwweDE0LAorMHhhMCwweDY3LDB4MDAsMHgxNywweDhjLDB4ODIsMHgwMCwweDAwLDB4MjQsMHg4NCwweDAwLDB4MDQsMHhhMCwweDQwLDB4MDAsMHgyMCwKKzB4MDQsMHhjMSwweGZmLDB4ZTcsMHhhYywweDQwLDB4MDAsMHgxYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgzNCwweDYzLDB4MDAsMHgyMCwweDI0LDB4NDIsMHg2NCwweDAwLAorMHgwMCwweDA1LDB4MjgsMHg0MCwweGFjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHhhNiwweDI4LDB4MjEsMHgyYywweGUyLDB4MDAsMHgxMCwKKzB4MTQsMHg4MCwweDAwLDB4MDYsMHgwMCwweDAwLDB4MTgsMHgyMSwweDEwLDB4NDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4ZTAsMHgxOCwweDIxLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDYwLDB4MTAsMHgyMSwweDI0LDB4MDIsMHgwMCwweDIwLAorMHgxMCwweGUyLDB4MDAsMHgwNiwweDJjLDB4ZTQsMHgwMCwweDEwLDB4MjQsMHhhMiwweDAwLDB4MDEsMHgxMCwweDgwLDB4ZmYsMHhmOSwKKzB4MDAsMHgwMiwweDExLDB4MDAsMHgwOCwweDAwLDB4MTksMHgwZCwweDAwLDB4NDcsMHgxOCwweDIxLDB4MDgsMHgwMCwweDE5LDB4MGQsCisweDI0LDB4YTMsMHgwMCwweDUwLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGM4LAorMHgzNCwweDYzLDB4MDAsMHgyMCwweDI0LDB4NDIsMHg2NCwweDY0LDB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGJmLDB4MDAsMHgzNCwKKzB4YWYsMHhiZSwweDAwLDB4MzAsMHhhZiwweGI3LDB4MDAsMHgyYywweGFmLDB4YjYsMHgwMCwweDI4LDB4YWYsMHhiNSwweDAwLDB4MjQsCisweGFmLDB4YjQsMHgwMCwweDIwLDB4YWYsMHhiMywweDAwLDB4MWMsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4YjAsMHgwMCwweDEwLAorMHhhYywweDYyLDB4MDAsMHgwMCwweDhjLDB4ODYsMHgwMiwweGJjLDB4MDAsMHg4MCwweDkwLDB4MjEsMHgxNCwweGMwLDB4MDEsMHg2NiwKKzB4MDAsMHhjMCwweDM4LDB4MjEsMHg4NCwweDgyLDB4MDAsMHgwOCwweDNjLDB4MDMsMHhiMCwweDA2LDB4OTQsMHg4NCwweDAwLDB4MDgsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDQ1LDB4MDAsMHgwMCwweDhjLDB4NDMsMHgwMCwweDAwLAorMHgyNCwweDg0LDB4MDAsMHgwMiwweDMwLDB4ODQsMHgwMSwweGZmLDB4MzAsMHhiMSwweGZmLDB4ZmYsMHgwMCwweDAzLDB4NDQsMHgwMiwKKzB4YTYsMHg0NCwweDAwLDB4MDgsMHgxNCwweGUwLDB4MDAsMHgwOCwweDNjLDB4MDMsMHhiMCwweDA2LDB4MzQsMHg2MywweDgwLDB4MjQsCisweDhjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzNCwweDQyLDB4MDEsMHgwMCwweGFjLDB4NjIsMHgwMCwweDAwLAorMHg4ZSwweDQ2LDB4MDIsMHhiYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHhjMCwweDAxLDB4NGMsMHgwMCwweDExLDB4OTgsMHhjMCwKKzB4MDAsMHgxMSwweDNhLDB4MDAsMHgzYywweDA0LDB4YjAsMHgwMCwweDAwLDB4ZTQsMHgyMCwweDIxLDB4OGMsMHg4MywweDAwLDB4MGMsCisweDAwLDB4MTEsMHg5OCwweGMwLDB4MDIsMHg3MSwweDEwLDB4MjEsMHgwMCwweDAzLDB4MWIsMHg4MiwweDMwLDB4NjMsMHgwMCwweDFmLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4OWUsMHg4ZiwweGY0LDB4MDAsMHg1ZSwweDEwLDB4MjEsMHgwMCwweDYwLDB4MzAsMHgyMSwKKzB4YWMsMHg0NCwweDAwLDB4MTgsMHhhZSwweDQzLDB4MDIsMHhiYywweDE0LDB4YzAsMHgwMCwweDEwLDB4M2MsMHgwMiwweGIwLDB4MDAsCisweDAwLDB4MDgsMHgxMCwweGMwLDB4MDAsMHg0OCwweDEwLDB4MjEsMHgyNywweDg0LDB4OGYsMHhmMCwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQ0LDB4MTAsMHgyMSwweDk0LDB4NDUsMHgwMCwweDAwLDB4MDIsMHg3MSwweDE4LDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MDAsMHg2NCwweDE4LDB4MjEsMHgyNCwweDAyLDB4ZmYsMHhmZiwweGE0LDB4NjIsMHgwMCwweDAyLDB4YTQsMHg2OCwweDAwLDB4MDQsCisweGFlLDB4NTEsMHgwMiwweGI4LDB4YTYsMHg0NSwweDAwLDB4MGEsMHgzYywweDAyLDB4YjAsMHgwMCwweDAwLDB4ZTIsMHg0MCwweDIxLAorMHg4ZCwweDE2LDB4MDAsMHgwMCwweDhkLDB4MTQsMHgwMCwweDA0LDB4MDIsMHg3MSwweDEwLDB4MjEsMHgwMCwweDAyLDB4MzgsMHg4MCwKKzB4MDAsMHgxNCwweDFhLDB4MDIsMHgyNywweDg0LDB4OTAsMHgwMCwweDMwLDB4NjMsMHgwMCwweDFmLDB4MjQsMHgwMiwweDAwLDB4MTAsCisweDAwLDB4ZTQsMHgyMCwweDIxLDB4YTYsMHg0MywweDAwLDB4MDYsMHg4ZCwweDEwLDB4MDAsMHgwOCwweGEwLDB4ODIsMHgwMCwweDA2LAorMHg4NiwweDQ1LDB4MDAsMHgwNiwweDAwLDB4ZmUsMHgxMCwweDIxLDB4MjQsMHgwMywweDAwLDB4MTMsMHgxMCwweGEzLDB4MDEsMHgxNSwKKzB4YWMsMHg0OCwweDAwLDB4MTgsMHgzYywweDAzLDB4YjAsMHgwMywweDM0LDB4NjMsMHgwMSwweDAwLDB4YTYsMHg0MCwweDAwLDB4MDIsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4OTAsMHg2NCwweDAwLDB4MDAsMHgzNCwweDQyLDB4MDEsMHgwOCwweDhjLDB4NDUsMHgwMCwweDAwLAorMHgwMCwweDEwLDB4MWIsMHhjMiwweDI3LDB4ODIsMHg4ZiwweGYwLDB4MDAsMHgwNCwweDIwLDB4ODIsMHgwMCwweGUyLDB4MTAsMHgyMSwKKzB4MzAsMHg2MywweDAwLDB4MDEsMHhhYywweDQ1LDB4MDAsMHgwOCwweDEwLDB4NjAsMHgwMCwweGVjLDB4MzAsMHg5NywweDAwLDB4MDEsCisweDAwLDB4MTAsMHgxNiwweDgyLDB4MzAsMHg0NiwweDAwLDB4MDEsMHgwMCwweDEwLDB4MTIsMHgwMiwweDAwLDB4MTAsMHgxOSwweGMyLAorMHgwMCwweDEwLDB4MjYsMHgwMiwweDAwLDB4MTAsMHgyZSwweDQyLDB4MzAsMHg0NywweDAwLDB4N2YsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MzAsMHg3NSwweDAwLDB4MDEsMHgzMCwweDg0LDB4MDAsMHgwMSwweDEwLDB4YzIsMHgwMCwweGQ5LDB4MzAsMHhhMywweDAwLDB4MDEsCisweDBjLDB4MDAsMHgxOSwweDAwLDB4MDAsMHg2MCwweDI4LDB4MjEsMHgwMiwweDcxLDB4MTgsMHgyMSwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgyYywweDQ2LDB4MDAsMHg1NCwweDI3LDB4ODUsMHg5MCwweDAwLDB4MjcsMHg4NCwweDhmLDB4ZjgsMHgwMCwweDA2LDB4MTAsMHgwYSwKKzB4MDAsMHg2NSwweDI4LDB4MjEsMHgyNiwweGE2LDB4MDAsMHgwMiwweDAwLDB4NjQsMHgxOCwweDIxLDB4YTAsMHhhMiwweDAwLDB4MDIsCisweGEwLDB4NjYsMHgwMCwweDA2LDB4YTAsMHg2MiwweDAwLDB4MDcsMHhhMCwweGEyLDB4MDAsMHgwMSwweDAyLDB4NzEsMHgyMCwweDIxLAorMHgwMCwweDA0LDB4MjAsMHg4MCwweDAwLDB4OWUsMHg2MCwweDIxLDB4OGQsMHg4NSwweDAwLDB4MTgsMHgwMCwweDEwLDB4MTUsMHhjMiwKKzB4MzAsMHg0MiwweDAwLDB4MDEsMHg4YywweGEzLDB4MDAsMHgwYywweGE2LDB4NDIsMHgwMCwweDAwLDB4MjcsMHg4MiwweDkwLDB4MTAsCisweDAwLDB4ODIsMHg1MCwweDIxLDB4YTYsMHg1NiwweDAwLDB4MDQsMHg4ZCwweDQ1LDB4MDAsMHgwMCwweDAwLDB4MDMsMHgxOSwweDQyLAorMHgzYywweDAyLDB4ZmYsMHhlZiwweDM0LDB4NDIsMHhmZiwweGZmLDB4MzAsMHg2MywweDAwLDB4MDEsMHgwMCwweGEyLDB4NDgsMHgyNCwKKzB4MDAsMHgwMywweDFkLDB4MDAsMHgwMSwweDIzLDB4NDgsMHgyNSwweDAwLDB4MDksMHgxNSwweDAyLDB4MjYsMHhjNSwweDAwLDB4MTAsCisweDAwLDB4MTQsMHgxOSwweDgyLDB4MDAsMHgxNCwweDI1LDB4ODIsMHgwMCwweDEwLDB4MzQsMHgwMiwweDAwLDB4MTAsMHgzYywweDQyLAorMHgwMCwweDEwLDB4NDQsMHg4MiwweDMwLDB4NDIsMHgwMCwweDAxLDB4MzAsMHhiNSwweGZmLDB4ZmYsMHgzMCwweGNlLDB4MDAsMHgwMSwKKzB4MzAsMHhlNSwweDAwLDB4MDEsMHgzMCwweDZkLDB4MDAsMHgwMSwweDMwLDB4OGIsMHgwMCwweDAzLDB4MzIsMHg5NCwweDAwLDB4MDcsCisweDMxLDB4MDYsMHgwMCwweDAxLDB4YWQsMHg0OSwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwYiwweDMyLDB4MDcsMHgwMCwweDdmLAorMHg4ZCwweDg0LDB4MDAsMHgxOCwweDNjLDB4MDMsMHhmZiwweGYwLDB4MzQsMHg2MywweGZmLDB4ZmYsMHg4YywweDgyLDB4MDAsMHgwYywKKzB4MDEsMHgyMywweDE4LDB4MjQsMHgwMCwweDAyLDB4MTMsMHg4MiwweDMwLDB4NDIsMHgwMCwweDBmLDB4MDAsMHgwMiwweDE0LDB4MDAsCisweDAwLDB4NjIsMHgxOCwweDI1LDB4YWQsMHg0MywweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YzIsMHgwMCwweDkwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE1LDB4YTAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNSwweDYwLDB4MDAsMHg4MSwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHg5NiwweDQyLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4MDQsCisweGE2LDB4NDIsMHgwMCwweDA0LDB4MGMsMHgwMCwweDE5LDB4MDAsMHgwMSwweGMwLDB4MjAsMHgyMSwweDAyLDB4NzEsMHgxOCwweDIxLAorMHgwMCwweDAzLDB4MzgsMHg4MCwweDJjLDB4NDUsMHgwMCwweDU0LDB4MjcsMHg4NCwweDkwLDB4MDAsMHgwMCwweGU0LDB4MjAsMHgyMSwKKzB4MDAsMHgwNSwweDEwLDB4MGEsMHhhMCwweDgyLDB4MDAsMHgwMCwweGEwLDB4ODAsMHgwMCwweDA0LDB4YTAsMHg4MCwweDAwLDB4MDUsCisweDk2LDB4NDUsMHgwMCwweDA0LDB4MjcsMHg4MiwweDhmLDB4ZjAsMHgwMCwweGUyLDB4MTAsMHgyMSwweGE0LDB4NDUsMHgwMCwweDA2LAorMHgwMCwweGZlLDB4MTgsMHgyMSwweDkyLDB4NDUsMHgwMCwweDAxLDB4OGMsMHg2NiwweDAwLDB4MTgsMHgyNywweDgyLDB4OTAsMHgxMCwKKzB4MDAsMHhlMiwweDEwLDB4MjEsMHhhMCwweDQwLDB4MDAsMHgwMCwweGEwLDB4ODUsMHgwMCwweDA3LDB4OTQsMHhjMywweDAwLDB4MTAsCisweDI0LDB4MDIsMHgwMCwweDA0LDB4MzAsMHg2MywweDAwLDB4MGYsMHgxMCwweDYyLDB4MDAsMHg1ZSwweDI0LDB4YzYsMHgwMCwweDEwLAorMHg5NCwweGMzLDB4MDAsMHgxNiwweDI3LDB4ODUsMHg5MCwweDA4LDB4MDAsMHhlNSwweDEwLDB4MjEsMHhhNCwweDQzLDB4MDAsMHgwMiwKKzB4OTQsMHhjMiwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDAxLDB4MTQsMHg0MCwweDAwLDB4NGMsCisweDAyLDB4NzEsMHgyMCwweDIxLDB4OTQsMHhjMiwweDAwLDB4MDAsMHgyNCwweDAzLDB4MDAsMHhhNCwweDMwLDB4NDIsMHgwMCwweGZmLAorMHgxMCwweDQzLDB4MDAsMHg0NywweDAwLDB4MDAsMHgwMCwweDAwLDB4OTQsMHhjMiwweDAwLDB4MDAsMHgyNCwweDAzLDB4MDAsMHg4OCwKKzB4MzAsMHg0MiwweDAwLDB4ODgsMHgxMCwweDQzLDB4MDAsMHgzYywweDAyLDB4NzEsMHgxOCwweDIxLDB4MjcsMHg4NCwweDkwLDB4MTAsCisweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2NCwweDE4LDB4MjEsMHg4YywweDYyLDB4MDAsMHgwMCwweDNjLDB4MDQsMHgwMCwweDgwLAorMHgwMCwweDQ0LDB4MTAsMHgyNSwweGFjLDB4NjIsMHgwMCwweDAwLDB4MDIsMHg3MSwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwKKzB4MDAsMHg0NSwweDEwLDB4MjEsMHhhMCwweDU0LDB4MDAsMHgwMCwweDkyLDB4NDMsMHgwMiwweGJmLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDM0LDB4NDIsMHgwMCwweGMzLDB4YTAsMHg0MywweDAwLDB4MDAsMHg4ZSwweDRiLDB4MDIsMHhiYywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMSwweDYwLDB4MDAsMHgxYywweDMyLDB4YTIsMHgwMCwweGZmLDB4MDAsMHgxNSwweDFhLDB4MDIsMHgzMCwweDY0LDB4ZmYsMHhmZiwKKzB4MzgsMHg0MiwweDAwLDB4MDAsMHgyNCwweDY1LDB4MDAsMHgwMSwweDAwLDB4ODIsMHgyOCwweDBhLDB4MDIsMHgyMCwweDMwLDB4MjEsCisweDEwLDB4YTAsMHgwMCwweDEyLDB4MDAsMHgwMCwweDM4LDB4MjEsMHgwMiwweDcxLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgyNywweDgzLDB4OGYsMHhmMCwweDAwLDB4NDMsMHgyMCwweDIxLDB4MjQsMHhhOSwweGZmLDB4ZmYsMHgzYywweDBhLDB4YjAsMHgwOCwKKzB4MjQsMHgwYywweGZmLDB4ZmYsMHgwMCwweDA2LDB4MTAsMHhjMCwweDAwLDB4NGEsMHgxMCwweDIxLDB4OGMsMHg0MywweDAwLDB4MDAsCisweDI0LDB4ZTgsMHgwMCwweDAxLDB4MTAsMHhlOSwweDAwLDB4MGYsMHgzMCwweDYzLDB4MDAsMHhmZiwweDMxLDB4MDcsMHhmZiwweGZmLAorMHgwMCwweGU1LDB4MTAsMHgyYiwweDE0LDB4NDAsMHhmZiwweGY3LDB4MDAsMHg2MCwweDMwLDB4MjEsMHgyNSwweDYyLDB4ZmYsMHhmZiwKKzB4YWUsMHg0MiwweDAyLDB4YmMsMHg3YiwweGJlLDB4MDEsMHhiYywweDdiLDB4YjYsMHgwMSwweDdjLDB4N2IsMHhiNCwweDAxLDB4M2MsCisweDdiLDB4YjIsMHgwMCwweGZjLDB4N2IsMHhiMCwweDAwLDB4YmMsMHgyNCwweDAyLDB4MDAsMHgwMSwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgzOCwweGE0LDB4ODYsMHgwMCwweDA0LDB4YTQsMHg4YywweDAwLDB4MDIsMHhhZSwweDUxLDB4MDIsMHhiOCwKKzB4MDgsMHgwMCwweDFhLDB4MmYsMHhhNiwweDQzLDB4MDAsMHgwYSwweDk0LDB4YzIsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NDIsMHgwMCwweDYwLDB4MTAsMHg0MCwweGZmLDB4YzEsMHgwMiwweDcxLDB4MTgsMHgyMSwweDAyLDB4NzEsMHgyMCwweDIxLAorMHgyNywweDgyLDB4OTAsMHgxMCwweDAwLDB4MDQsMHgyMCwweDgwLDB4MDAsMHg4MiwweDIwLDB4MjEsMHg4YywweDgzLDB4MDAsMHgwMCwKKzB4M2MsMHgwMiwweGZmLDB4N2YsMHgzNCwweDQyLDB4ZmYsMHhmZiwweDAwLDB4NjIsMHgxOCwweDI0LDB4MDgsMHgwMCwweDFhLDB4MGUsCisweGFjLDB4ODMsMHgwMCwweDAwLDB4MjcsMHg4NSwweDkwLDB4MDgsMHgwMCwweGU1LDB4MTAsMHgyMSwweDA4LDB4MDAsMHgxOSwweGY4LAorMHhhNCwweDQwLDB4MDAsMHgwMiwweDExLDB4NjIsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDYyLDB4MDAsMHgwMiwKKzB4MTQsMHg0MCwweGZmLDB4ODAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDk2LDB4NDIsMHgwMCwweDA0LDB4MDgsMHgwMCwweDE5LDB4ZDgsCisweDI0LDB4NDIsMHgwMCwweDBjLDB4OTYsMHg0MiwweDAwLDB4MDQsMHgwOCwweDAwLDB4MTksMHhkOCwweDI0LDB4NDIsMHgwMCwweDA4LAorMHgxNiwweGU2LDB4ZmYsMHg3MCwweDNjLDB4MDIsMHhmZiwweGZiLDB4OGQsMHg4MywweDAwLDB4MTgsMHgzNCwweDQyLDB4ZmYsMHhmZiwKKzB4MDIsMHgwMiwweDEwLDB4MjQsMHhhYywweDYyLDB4MDAsMHgwOCwweDA4LDB4MDAsMHgxOSwweGQxLDB4MDAsMHgwMCwweDMwLDB4MjEsCisweDE2LDB4ZTYsMHhmZiwweDI3LDB4M2MsMHgwMiwweGZiLDB4ZmYsMHgzNCwweDQyLDB4ZmYsMHhmZiwweDAyLDB4MDIsMHgxMCwweDI0LAorMHhhZCwweDAyLDB4MDAsMHgwOCwweDA4LDB4MDAsMHgxOSwweDkwLDB4MDAsMHgwMCwweDMwLDB4MjEsMHg5MywweDg4LDB4YmIsMHgwNCwKKzB4MDAsMHgxMCwweDFlLDB4NDIsMHgwMCwweDEwLDB4MjYsMHg4MiwweDI3LDB4ODIsMHg4ZiwweGY4LDB4MmQsMHgwNSwweDAwLDB4MGMsCisweDAwLDB4ZTIsMHg0OCwweDIxLDB4MzAsMHg2MywweDAwLDB4MDEsMHgzMCwweDg2LDB4MDAsMHgwMSwweDE0LDB4YTAsMHgwMCwweDA2LAorMHgwMSwweDAwLDB4MzgsMHgyMSwweDAwLDB4MDMsMHgxMCwweDQwLDB4MDAsMHg0NiwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTEsMHgwMCwKKzB4MDEsMHgwMiwweDEwLDB4MjEsMHgyNCwweDQ3LDB4MDAsMHgwNCwweDAyLDB4NzEsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDI3LDB4ODQsMHg5MCwweDAwLDB4MjcsMHg4MywweDhmLDB4ZjgsMHgwMCwweDQ0LDB4MjAsMHgyMSwweDAwLDB4NDMsMHgxMCwweDIxLAorMHhhMSwweDI3LDB4MDAsMHgwNywweGEwLDB4NDAsMHgwMCwweDA2LDB4YTAsMHg4MCwweDAwLDB4MDIsMHgwOCwweDAwLDB4MTksMHg5ZiwKKzB4YTAsMHg4MCwweDAwLDB4MDEsMHgyNCwweDAyLDB4MDAsMHgwMSwweGE2LDB4NDIsMHgwMCwweDAyLDB4MGMsMHgwMCwweDAxLDB4YzQsCisweDAxLDB4MDAsMHgyMCwweDIxLDB4MDgsMHgwMCwweDFhLDB4MzUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4OWUsMHg4ZiwweGY0LAorMHgwOCwweDAwLDB4MTksMHg1MiwweDAwLDB4MTEsMHgzYSwweDAwLDB4OTQsMHg5MSwweDAwLDB4MGEsMHgwOCwweDAwLDB4MTksMHgzOSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweGE5LDB4ZmYsMHhmZiwweDAwLDB4MDksMHgxOCwweGMwLDB4MDAsMHg2OSwweDE4LDB4MjEsCisweDNjLDB4MDYsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgyNCwweDQyLDB4NmEsMHg1NCwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgzNCwweGM2LDB4MDAsMHgyMCwweDI3LDB4ODUsMHg5MCwweDAwLDB4YWMsMHhjMiwweDAwLDB4MDAsMHgwMCwweDY1LDB4MTgsMHgyMSwKKzB4ODAsMHg2MiwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDMyLDB4MjQsMHg4OCwweDAwLDB4MDYsCisweDkwLDB4ODIsMHgwMCwweDE2LDB4MDAsMHg4MCwweDQwLDB4MjEsMHgzNCwweDQyLDB4MDAsMHgwMiwweDMwLDB4NDMsMHgwMCwweDAxLAorMHgxNCwweDYwLDB4MDAsMHgwMiwweGEwLDB4ODIsMHgwMCwweDE2LDB4YTAsMHg4MCwweDAwLDB4MTcsMHg5NSwweDAzLDB4MDAsMHgwMiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDY5LDB4MDAsMHgyMiwweDNjLDB4MDIsMHgzNCwweDM0LDB4OTEsMHgwMiwweDAwLDB4MDQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MDYsMHgwMCwweDAzLDB4MjAsMHhjMCwweDI0LDB4MDIsMHgwMCwweDAxLAorMHhhMSwweDAyLDB4MDAsMHgwNCwweGE1LDB4MDksMHgwMCwweDAyLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhNSwweDA5LDB4MDAsMHgwMCwKKzB4MDAsMHg4MywweDIwLDB4MjEsMHgyNywweDg3LDB4OGYsMHhmMCwweDAwLDB4MDQsMHgyMCwweDgwLDB4MDAsMHg4NywweDIwLDB4MjEsCisweDk0LDB4ODMsMHgwMCwweDA0LDB4M2MsMHgwMiwweGIwLDB4MDgsMHgzYywweDA2LDB4YjAsMHgwMywweDAwLDB4MDMsMHgyOCwweGMwLAorMHgwMCwweGEzLDB4MTgsMHgyMSwweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHhhMiwweDI4LDB4MjEsMHgzYywweDAyLDB4ODAsMHgwMSwKKzB4MjQsMHg0MiwweDgyLDB4ZTQsMHgwMCwweDY3LDB4MTgsMHgyMSwweDM0LDB4YzYsMHgwMCwweDIwLDB4YWMsMHhjMiwweDAwLDB4MDAsCisweGE0LDB4NjksMHgwMCwweDAwLDB4YTQsMHg4OSwweDAwLDB4MDIsMHhhYywweGE5LDB4MDAsMHgwMCwweDkxLDB4MDIsMHgwMCwweDA0LAorMHhhNSwweDA5LDB4MDAsMHgwMiwweDI0LDB4NDIsMHgwMCwweDAxLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhMSwweDAyLDB4MDAsMHgwNCwKKzB4M2MsMHgwMywweGIwLDB4MDMsMHgzNCwweDYzLDB4MDAsMHhiMCwweDM0LDB4NDIsMHgzNCwweDM0LDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGFjLDB4NjIsMHgwMCwweDAwLDB4OTAsMHg4MiwweDAwLDB4MTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDM0LDB4NDIsMHgwMCwweDAxLAorMHgzMCwweDQzLDB4MDAsMHgwMiwweDE0LDB4NjAsMHhmZiwweGQxLDB4YTAsMHg4MiwweDAwLDB4MTYsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MDgsMHgwMCwweDFhLDB4YWIsMHhhMCwweDgyLDB4MDAsMHgxNywweDI3LDB4YmQsMHhmZiwweGU4LDB4YWYsMHhiZiwweDAwLDB4MTAsCisweDAwLDB4ODAsMHgzOCwweDIxLDB4ODQsMHg4NCwweDAwLDB4MDIsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLAorMHgzYywweDBhLDB4YjAsMHgwNiwweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDZiLDB4NzgsMHgzYywweDBiLDB4YjAsMHgwOCwKKzB4MjcsMHg4OSwweDhmLDB4ZjAsMHgzNCwweDBjLDB4ZmYsMHhmZiwweDM1LDB4NGEsMHg4MCwweDIwLDB4MTAsMHg4MCwweDAwLDB4MzAsCisweGFjLDB4NjIsMHgwMCwweDAwLDB4OTcsMHg4MiwweDhmLDB4ZTAsMHg5NCwweGU2LDB4MDIsMHhiYSwweDAwLDB4MDIsMHgxOCwweGMwLAorMHgwMCwweDZiLDB4MjgsMHgyMSwweGFjLDB4YTYsMHgwMCwweDAwLDB4OGMsMHhlNCwweDAyLDB4YjgsMHgwMCwweDYyLDB4MTgsMHgyMSwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDA0LDB4MTAsMHhjMCwweDAwLDB4NDQsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDAwLDB4NDksMHgxMCwweDIxLDB4OTQsMHg0OCwweDAwLDB4MDQsMHgwMCwweDY5LDB4MTgsMHgyMSwweGE0LDB4NjYsMHgwMCwweDAwLAorMHgwMCwweDA4LDB4MjgsMHhjMCwweDAwLDB4YWIsMHgxMCwweDIxLDB4YWMsMHg0YywweDAwLDB4MDAsMHg4YywweGU0LDB4MDIsMHhiOCwKKzB4MjcsMHg4MiwweDhmLDB4ZjQsMHgwMCwweGE4LDB4MjgsMHgyMSwweDAwLDB4MDQsMHgxOCwweGMwLDB4MDAsMHg2NCwweDE4LDB4MjEsCisweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2MiwweDEwLDB4MjEsMHg4YywweDQ2LDB4MDAsMHgxOCwweDI3LDB4ODQsMHg5MCwweDAwLAorMHgwMCwweDY0LDB4MTgsMHgyMSwweDhjLDB4YzIsMHgwMCwweDAwLDB4ODAsMHg2NywweDAwLDB4MDYsMHgwMCwweDA1LDB4MjgsMHg4MCwKKzB4MzAsMHg0MiwweGZmLDB4ZmYsMHgwMCwweDQ3LDB4MTAsMHgyMSwweDMwLDB4NDMsMHgwMCwweGZmLDB4MDAsMHgwMywweDE4LDB4MmIsCisweDAwLDB4MDIsMHgxMiwweDAyLDB4MDAsMHg0MywweDEwLDB4MjEsMHgzYywweDA0LDB4MDAsMHgwNCwweDAwLDB4YTksMHgyOCwweDIxLAorMHgwMCwweDQ0LDB4MTAsMHgyNSwweGE0LDB4YWMsMHgwMCwweDAwLDB4YWQsMHg0MiwweDAwLDB4MDAsMHhhNywweDg4LDB4OGYsMHhlMCwKKzB4OGYsMHhiZiwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsCisweDg0LDB4ZTMsMHgwMCwweDA2LDB4MjcsMHg4MiwweGIzLDB4ZjAsMHg5NCwweGU1LDB4MDIsMHhiYSwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgwMCwweDYyLDB4MTgsMHgyMSwweDhjLDB4NjQsMHgwMCwweDAwLDB4MGMsMHgwMCwweDFhLDB4OTUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDFiLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDk0LDB4ODgsMHgwMCwweDAwLDB4MDAsMHg4MCwweDU4LDB4MjEsCisweDI3LDB4OGEsMHg4ZiwweGYwLDB4MDAsMHgwOCwweDE4LDB4YzAsMHgwMCwweDY4LDB4MTgsMHgyMSwweDNjLDB4MDQsMHhiMCwweDAzLAorMHgwMCwweDAzLDB4MTgsMHg4MCwweDNjLDB4MDIsMHg4MCwweDAwLDB4MDAsMHg2YSwweDE4LDB4MjEsMHgzNCwweDg0LDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweDZjLDB4OTgsMHgzMCwweGE1LDB4ZmYsMHhmZiwweGFjLDB4ODIsMHgwMCwweDAwLDB4OTQsMHg2NywweDAwLDB4MDIsCisweDExLDB4MDUsMHgwMCwweDM1LDB4MjQsMHgwNCwweDAwLDB4MDEsMHg5MSwweDY2LDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDg2LDB4MTAsMHgyYSwweDEwLDB4NDAsMHgwMCwweDEwLDB4MDAsMHhjMCwweDQ4LDB4MjEsMHgzYywweDBkLDB4YjAsMHgwMywKKzB4MDEsMHg0MCwweDYwLDB4MjEsMHgzNSwweGFkLDB4MDAsMHgyMCwweDEwLDB4ZTUsMHgwMCwweDBkLDB4MjQsMHg4NCwweDAwLDB4MDEsCisweDAwLDB4MDcsMHgxMCwweGMwLDB4MDAsMHg0NywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAxLDB4MjAsMHgzMCwweDIxLAorMHgwMCwweDRhLDB4MTAsMHgyMSwweDAwLDB4ODYsMHgxOCwweDJhLDB4MDAsMHhlMCwweDQwLDB4MjEsMHg5NCwweDQ3LDB4MDAsMHgwMiwKKzB4MTQsMHg2MCwweGZmLDB4ZjUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDEwLDB4MjEsCisweDAwLDB4MDgsMHgyMCwweGMwLDB4MDAsMHg4OCwweDIwLDB4MjEsMHgyNCwweGMyLDB4ZmYsMHhmZiwweDAwLDB4MDQsMHgyMCwweDgwLAorMHhhMSwweDYyLDB4MDAsMHgwNCwweDAwLDB4OGMsMHgyMCwweDIxLDB4OTQsMHg4MywweDAwLDB4MDQsMHgwMCwweDA3LDB4MTAsMHhjMCwKKzB4MDAsMHg0NywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NGMsMHgxMCwweDIxLDB4MDAsMHgwMywweDI4LDB4YzAsCisweDk0LDB4NDYsMHgwMCwweDAyLDB4MDAsMHhhMywweDE4LDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NmMsMHgxOCwweDIxLAorMHhhNCwweDY2LDB4MDAsMHgwMCwweGE0LDB4ODYsMHgwMCwweDAyLDB4OTUsMHg2NCwweDAwLDB4MDIsMHgzYywweDAzLDB4YjAsMHgwOCwKKzB4M2MsMHgwMiwweDgwLDB4MDEsMHgwMCwweGEzLDB4MjgsMHgyMSwweDI0LDB4NDIsMHg4MiwweGU0LDB4YWQsMHhhMiwweDAwLDB4MDAsCisweDEwLDB4ODcsMHgwMCwweDAzLDB4YWMsMHhhNiwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweDI0LDB4MDIsMHgwMCwweDAxLAorMHgwOCwweDAwLDB4MWIsMHg2NiwweGE1LDB4NjgsMHgwMCwweDAyLDB4OTEsMHg2MiwweDAwLDB4MDQsMHhhNSwweDY3LDB4MDAsMHgwMCwKKzB4MjQsMHg0MiwweGZmLDB4ZmYsMHgzMCwweDQzLDB4MDAsMHhmZiwweDE0LDB4NjAsMHgwMCwweDAzLDB4YTEsMHg2MiwweDAwLDB4MDQsCisweDI0LDB4MDIsMHhmZiwweGZmLDB4YTUsMHg2MiwweDAwLDB4MDIsMHg5MSwweDY1LDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMCwweGEwLDB4ZmYsMHhmMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTUsMHg2NiwweDAwLDB4MDAsMHgzNCwweDAyLDB4ZmYsMHhmZiwKKzB4MTQsMHhjMiwweGZmLDB4ZWQsMHgzYywweDAzLDB4YjAsMHgwMywweDk1LDB4NjQsMHgwMCwweDAyLDB4M2MsMHgwMiwweGVlLDB4ZWUsCisweDAwLDB4YTIsMHgxMCwweDI1LDB4MzQsMHg2MywweDAwLDB4YmMsMHhhYywweDYyLDB4MDAsMHgwMCwweDEwLDB4ODYsMHhmZiwweGU2LAorMHhhMSwweDYwLDB4MDAsMHgwNCwweDI0LDB4MDIsMHhmZiwweGZmLDB4MDgsMHgwMCwweDFiLDB4NjYsMHhhNSwweDYyLDB4MDAsMHgwMiwKKzB4MDAsMHgwNSwweDQwLDB4YzAsMHgwMSwweDA1LDB4MzAsMHgyMSwweDI3LDB4YmQsMHhmZiwweGQ4LDB4MDAsMHgwNiwweDMwLDB4ODAsCisweDI3LDB4ODIsMHg4ZiwweGY0LDB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4YmYsMHgwMCwweDIwLAorMHhhZiwweGIzLDB4MDAsMHgxYywweGFmLDB4YjAsMHgwMCwweDEwLDB4MDAsMHhjMiwweDEwLDB4MjEsMHg4YywweDQ3LDB4MDAsMHgxOCwKKzB4MDAsMHhhMCwweDkwLDB4MjEsMHgzYywweDAyLDB4ODAsMHgwMCwweDNjLDB4MDUsMHhiMCwweDAzLDB4MzQsMHhhNSwweDAwLDB4MjAsCisweDI0LDB4NDIsMHg2ZSwweDEwLDB4YWMsMHhhMiwweDAwLDB4MDAsMHgyNywweDgzLDB4OTAsMHgwMCwweDAwLDB4YzMsMHgzMCwweDIxLAorMHg4YywweGUyLDB4MDAsMHgwMCwweDgwLDB4YzUsMHgwMCwweDA2LDB4MDAsMHg4MCwweDg4LDB4MjEsMHgzMCwweDQyLDB4ZmYsMHhmZiwKKzB4MDAsMHg0NSwweDEwLDB4MjEsMHgzMCwweDQzLDB4MDAsMHhmZiwweDEwLDB4NjAsMHgwMCwweDAyLDB4MDAsMHgwMiwweDEyLDB4MDIsCisweDI0LDB4NDIsMHgwMCwweDAxLDB4MzAsMHg1MywweDAwLDB4ZmYsMHgwMSwweDEyLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgyNywweDgzLDB4OTAsMHgwMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4ODAsMHg0NCwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHg4MCwweDAwLDB4NGIsMHgyNiwweDI0LDB4MDAsMHgwNiwweDMyLDB4NTAsMHhmZiwweGZmLDB4MDIsMHgyMCwweDIwLDB4MjEsCisweDBjLDB4MDAsMHgxYiwweDI2LDB4MDIsMHgwMCwweDI4LDB4MjEsMHg5MiwweDIyLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNCwweDQwLDB4MDAsMHgyZSwweDNjLDB4MDMsMHhiMCwweDA4LDB4M2MsMHgwOSwweDgwLDB4MDEsMHgyNywweDg4LDB4OGYsMHhmMCwKKzB4YTYsMHgzMiwweDAwLDB4MGMsMHgwMCwweDEwLDB4MjAsMHhjMCwweDAwLDB4OTAsMHgyMCwweDIxLDB4MDAsMHgwNCwweDIwLDB4ODAsCisweDAwLDB4ODgsMHgyMCwweDIxLDB4OTQsMHg4MiwweDAwLDB4MDQsMHgzYywweDAzLDB4YjAsMHgwOCwweDNjLDB4MDcsMHhiMCwweDAzLAorMHgwMCwweDAyLDB4MjgsMHhjMCwweDAwLDB4YTIsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ4LDB4MTAsMHgyMSwKKzB4MDAsMHhhMywweDI4LDB4MjEsMHgyNSwweDI2LDB4ODIsMHhlNCwweDM0LDB4MDMsMHhmZiwweGZmLDB4MzQsMHhlNywweDAwLDB4MjAsCisweGFjLDB4ZTYsMHgwMCwweDAwLDB4YTQsMHg4MywweDAwLDB4MDIsMHhhNCwweDQzLDB4MDAsMHgwMCwweGFjLDB4YTMsMHgwMCwweDAwLAorMHg5MiwweDIyLDB4MDAsMHgxMCwweDkyLDB4MjMsMHgwMCwweDBhLDB4YTYsMHgzMiwweDAwLDB4MGUsMHgwMiwweDYyLDB4MTAsMHgyMSwKKzB4MTQsMHg2MCwweDAwLDB4MDUsMHhhMiwweDIyLDB4MDAsMHgxMCwweDkyLDB4MjIsMHgwMCwweDE2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NDIsMHgwMCwweGZlLDB4YTIsMHgyMiwweDAwLDB4MTYsMHg5MiwweDIyLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNCwweDQwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTIsMHgyMiwweDAwLDB4MTYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4ZmQsMHhhMiwweDIyLDB4MDAsMHgxNiwweDhmLDB4YmYsMHgwMCwweDIwLDB4N2IsMHhiMiwweDAwLDB4ZmMsCisweDdiLDB4YjAsMHgwMCwweGJjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgyOCwweDk2LDB4MjIsMHgwMCwweDBlLAorMHgyNywweDg4LDB4OGYsMHhmMCwweDAwLDB4MDIsMHgyMCwweGMwLDB4MDAsMHg4MiwweDIwLDB4MjEsMHgwMCwweDA0LDB4MjAsMHg4MCwKKzB4MDAsMHg4OCwweDIwLDB4MjEsMHg5NCwweDgyLDB4MDAsMHgwNCwweDNjLDB4MDYsMHhiMCwweDAzLDB4M2MsMHgwOSwweDgwLDB4MDEsCisweDAwLDB4MDIsMHgyOCwweGMwLDB4MDAsMHhhMiwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4YTMsMHgyOCwweDIxLAorMHgwMCwweDQ4LDB4MTAsMHgyMSwweDM0LDB4YzYsMHgwMCwweDIwLDB4MjUsMHgyMywweDgyLDB4ZTQsMHhhYywweGMzLDB4MDAsMHgwMCwKKzB4YTQsMHg1MCwweDAwLDB4MDAsMHhhYywweGIwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxYiwweGI1LDB4YTQsMHg5MCwweDAwLDB4MDIsCisweDA4LDB4MDAsMHgxYiwweGFjLDB4MzIsMHg1MCwweGZmLDB4ZmYsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLAorMHgyNCwweDQyLDB4NmYsMHhkOCwweDM0LDB4NjMsMHgwMCwweDIwLDB4YWMsMHg2MiwweDAwLDB4MDAsMHg5MCwweDgyLDB4MDAsMHgwNCwKKzB4OTcsMHhhYSwweDAwLDB4MTIsMHgwMCwweDgwLDB4NjAsMHgyMSwweDMwLDB4YTgsMHhmZiwweGZmLDB4MDAsMHg0YSwweDIwLDB4MjMsCisweDM0LDB4MDksMHhmZiwweGZmLDB4MzAsMHhjZiwweGZmLDB4ZmYsMHgzMCwweGVlLDB4ZmYsMHhmZiwweDExLDB4MDksMHgwMCwweDczLAorMHhhMSwweDg0LDB4MDAsMHgwNCwweDAwLDB4MGUsMHhjMCwweGMwLDB4MDAsMHgwOCwweDEwLDB4YzAsMHgwMCwweDQ4LDB4MTAsMHgyMSwKKzB4MDMsMHgwZSwweDIwLDB4MjEsMHgyNywweDhkLDB4OGYsMHhmMCwweDAwLDB4MDQsMHgyMCwweDgwLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDAwLDB4NGQsMHgxMCwweDIxLDB4MDAsMHg4ZCwweDIwLDB4MjEsMHg5NCwweDg2LDB4MDAsMHgwMiwweDk0LDB4NDMsMHgwMCwweDA0LAorMHgzYywweDE5LDB4ODAsMHgwMSwweGE0LDB4NDYsMHgwMCwweDAyLDB4MDAsMHgwMywweDI4LDB4YzAsMHgwMCwweGEzLDB4MTgsMHgyMSwKKzB4OTQsMHg4NywweDAwLDB4MDIsMHgzYywweDAyLDB4YjAsMHgwOCwweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHhhMiwweDI4LDB4MjEsCisweDAwLDB4NmQsMHgxOCwweDIxLDB4MjcsMHgyMiwweDgyLDB4ZTQsMHgzYywweDAxLDB4YjAsMHgwMywweGFjLDB4MjIsMHgwMCwweDIwLAorMHhhNCwweDY2LDB4MDAsMHgwMCwweDEwLDB4ZTksMHgwMCwweDU3LDB4YWMsMHhhNiwweDAwLDB4MDAsMHgwMSwweGUwLDB4MzAsMHgyMSwKKzB4MTEsMHg0MCwweDAwLDB4MWQsMHgwMCwweDAwLDB4NDgsMHgyMSwweDAxLDB4NDAsMHgzOCwweDIxLDB4MjcsMHg4YiwweDhmLDB4ZjQsCisweDI3LDB4OGEsMHg5MCwweDAwLDB4MDAsMHgwNiwweDQwLDB4YzAsMHgwMSwweDA2LDB4MTgsMHgyMSwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgwMCwweDZiLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDE4LDB4MDAsMHg2YSwweDE4LDB4MjEsMHg4MCwweDY1LDB4MDAsMHgwNiwKKzB4OGMsMHg4MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHhmZiwweGZmLDB4MDAsMHg0NSwweDEwLDB4MjEsCisweDMwLDB4NDQsMHgwMCwweGZmLDB4MDAsMHgwMiwweDEyLDB4MDIsMHgwMSwweDIyLDB4MTgsMHgyMSwweDI0LDB4NjIsMHgwMCwweDAxLAorMHgxNCwweDgwLDB4MDAsMHgwMiwweDMwLDB4NDksMHgwMCwweGZmLDB4MzAsMHg2OSwweDAwLDB4ZmYsMHgwMSwweDA2LDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDRkLDB4MTAsMHgyMSwweDI0LDB4ZTcsMHhmZiwweGZmLDB4OTQsMHg0NiwweDAwLDB4MDIsCisweDE0LDB4ZTAsMHhmZiwweGU5LDB4MDAsMHgwNiwweDQwLDB4YzAsMHg5MSwweDgyLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNCwweDQwLDB4MDAsMHgyMCwweDNjLDB4MDYsMHhiMCwweDAzLDB4YTUsMHg4ZiwweDAwLDB4MGMsMHgwMywweDBlLDB4MjAsMHgyMSwKKzB4MDAsMHgwNCwweDIwLDB4ODAsMHgwMCwweDhkLDB4MjAsMHgyMSwweDk0LDB4ODIsMHgwMCwweDA0LDB4M2MsMHgwMywweGIwLDB4MDgsCisweDNjLDB4MDcsMHhiMCwweDAzLDB4MDAsMHgwMiwweDI4LDB4YzAsMHgwMCwweGEyLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDRkLDB4MTAsMHgyMSwweDAwLDB4YTMsMHgyOCwweDIxLDB4MjcsMHgyNiwweDgyLDB4ZTQsMHgzNCwweDAzLDB4ZmYsMHhmZiwKKzB4MzQsMHhlNywweDAwLDB4MjAsMHhhYywweGU2LDB4MDAsMHgwMCwweGE0LDB4ODMsMHgwMCwweDAyLDB4YTQsMHg0MywweDAwLDB4MDAsCisweGFjLDB4YTMsMHgwMCwweDAwLDB4OTEsMHg4MiwweDAwLDB4MTAsMHg5MSwweDgzLDB4MDAsMHgwNCwweGE1LDB4OGUsMHgwMCwweDBlLAorMHgwMSwweDIyLDB4MTAsMHgyMSwweDE0LDB4NjAsMHgwMCwweDA1LDB4YTEsMHg4MiwweDAwLDB4MTAsMHg5MSwweDgyLDB4MDAsMHgxNiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHhmZCwweGExLDB4ODIsMHgwMCwweDE2LDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTUsMHg4MiwweDAwLDB4MGUsMHgzYywweDAzLDB4YjAsMHgwOCwweDAwLDB4MDIsMHgyMCwweGMwLAorMHgwMCwweDgyLDB4MjAsMHgyMSwweDAwLDB4MDQsMHgyMCwweDgwLDB4MDAsMHg4ZCwweDIwLDB4MjEsMHg5NCwweDgyLDB4MDAsMHgwNCwKKzB4MzQsMHhjNiwweDAwLDB4MjAsMHgyNywweDI3LDB4ODIsMHhlNCwweDAwLDB4MDIsMHgyOCwweGMwLDB4MDAsMHhhMiwweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHhhMywweDI4LDB4MjEsMHgwMCwweDRkLDB4MTAsMHgyMSwweGFjLDB4YzcsMHgwMCwweDAwLAorMHhhNCwweDhmLDB4MDAsMHgwMiwweGE0LDB4NGYsMHgwMCwweDAwLDB4YWMsMHhhZiwweDAwLDB4MDAsMHgwOCwweDAwLDB4MWMsMHg0NCwKKzB4MDMsMHgwZSwweDIwLDB4MjEsMHgwOCwweDAwLDB4MWMsMHgxZiwweGE1LDB4ODgsMHgwMCwweDAyLDB4MDAsMHgwZSwweGMwLDB4YzAsCisweDAzLDB4MGUsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNywweDhkLDB4OGYsMHhmMCwweDAwLDB4NGQsMHgxMCwweDIxLAorMHg5NCwweDQzLDB4MDAsMHgwMiwweDMwLDB4ODQsMHgwMCwweGZmLDB4MTQsMHg4MCwweDAwLDB4MDUsMHhhNSwweDgzLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweGZmLDB4ZmYsMHgzYywweDE5LDB4ODAsMHgwMSwweDA4LDB4MDAsMHgxYywweDFmLDB4YTUsMHg4MiwweDAwLDB4MDIsCisweDA4LDB4MDAsMHgxYywweDFmLDB4M2MsMHgxOSwweDgwLDB4MDEsMHgzYywweDA4LDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLAorMHgyNywweGJkLDB4ZmYsMHg3OCwweDM1LDB4MDgsMHgwMCwweDIwLDB4MjQsMHg0MiwweDcyLDB4MTgsMHhhZiwweGIyLDB4MDAsMHg2OCwKKzB4YWYsMHhiMSwweDAwLDB4NjQsMHhhZiwweGIwLDB4MDAsMHg2MCwweGFkLDB4MDIsMHgwMCwweDAwLDB4YWYsMHhiZiwweDAwLDB4ODQsCisweGFmLDB4YmUsMHgwMCwweDgwLDB4YWYsMHhiNywweDAwLDB4N2MsMHhhZiwweGI2LDB4MDAsMHg3OCwweGFmLDB4YjUsMHgwMCwweDc0LAorMHhhZiwweGI0LDB4MDAsMHg3MCwweGFmLDB4YjMsMHgwMCwweDZjLDB4YWYsMHhhNCwweDAwLDB4ODgsMHg5MCwweDgzLDB4MDAsMHgwYSwKKzB4MjcsMHg4MiwweGIzLDB4ZjAsMHhhZiwweGE2LDB4MDAsMHg5MCwweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2MiwweDE4LDB4MjEsCisweDhjLDB4NjMsMHgwMCwweDAwLDB4YWYsMHhhNywweDAwLDB4OTQsMHgyNywweDg2LDB4OGYsMHhmNCwweGFmLDB4YTMsMHgwMCwweDFjLAorMHg5NCwweDYzLDB4MDAsMHgxNCwweDMwLDB4YjEsMHhmZiwweGZmLDB4MjQsMHgwOCwweDAwLDB4MDEsMHgwMCwweDAzLDB4MjAsMHhjMCwKKzB4YWYsMHhhMywweDAwLDB4MTgsMHgwMCwweDgzLDB4MTgsMHgyMSwweGFmLDB4YTQsMHgwMCwweDU0LDB4MDAsMHgwMywweDE4LDB4ODAsCisweDI3LDB4ODQsMHg5MCwweDAwLDB4MDAsMHg2NCwweDIwLDB4MjEsMHg4MCwweDgyLDB4MDAsMHgwNiwweDAwLDB4NjYsMHgxOCwweDIxLAorMHg4YywweDY2LDB4MDAsMHgxOCwweDI0LDB4NDIsMHgwMCwweDAyLDB4MDAsMHgwMiwweDFmLDB4YzIsMHg4YywweGM0LDB4MDAsMHgwOCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg0MywweDAwLDB4MDIsMHgxMCwweDQwLDB4MDAsMHgwNCwweDJmLDB4YzIsCisweDAwLDB4MDQsMHgxYywweDgyLDB4MDAsMHhjMiwweDM4LDB4MjEsMHgwMCwweDA0LDB4MjQsMHg0MiwweDhmLDB4YTIsMHgwMCwweDFjLAorMHgzMCwweDYzLDB4MDAsMHgwMSwweDMwLDB4ODQsMHgwMCwweDAxLDB4YWYsMHhhNSwweDAwLDB4M2MsMHhhZiwweGEzLDB4MDAsMHgzNCwKKzB4YWYsMHhhNCwweDAwLDB4MzgsMHhhZiwweGEwLDB4MDAsMHg0MCwweGFmLDB4YTAsMHgwMCwweDQ0LDB4YWYsMHhhMCwweDAwLDB4NTAsCisweGFmLDB4YTgsMHgwMCwweDIwLDB4ODAsMHg0MiwweDAwLDB4MTIsMHg4ZiwweGIyLDB4MDAsMHgxOCwweGFmLDB4YTIsMHgwMCwweDI4LAorMHg4YywweGQwLDB4MDAsMHgwYywweDE0LDB4YTAsMHgwMSwweGU0LDB4MDAsMHg2MCwweDMwLDB4MjEsMHgwMCwweDEwLDB4MTAsMHg4MiwKKzB4MzAsMHg0NSwweDAwLDB4MDcsMHgxMCwweGEwLDB4MDAsMHgxMSwweGFmLDB4YTAsMHgwMCwweDMwLDB4OGYsMHhhNCwweDAwLDB4OTgsCisweDI3LDB4ODIsMHg4MCwweDFjLDB4MDAsMHgwNCwweDE4LDB4NDAsMHgwMCwweDYyLDB4MTgsMHgyMSwweDI0LDB4YTIsMHgwMCwweDA2LAorMHg4ZiwweGE1LDB4MDAsMHgyMCwweDk0LDB4NjQsMHgwMCwweDAwLDB4MDAsMHg0NSwweDEwLDB4MDQsMHgwMCwweDQ0LDB4MDAsMHgxYSwKKzB4MTQsMHg4MCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDcsMHgwMCwweDBkLDB4MDAsMHgwMCwweDEwLDB4MTIsCisweDI0LDB4NDIsMHgwMCwweDIwLDB4MzAsMHg0MiwweGZmLDB4ZmMsMHhhZiwweGEyLDB4MDAsMHgzMCwweDhmLDB4YTMsMHgwMCwweDE4LAorMHg4ZiwweGE0LDB4MDAsMHgyOCwweDM0LDB4MDIsMHhmZiwweGZmLDB4YWYsMHhhMCwweDAwLDB4MmMsMHhhZiwweGEyLDB4MDAsMHg0OCwKKzB4YWYsMHhhMywweDAwLDB4NGMsMHgwMCwweDYwLDB4ZjAsMHgyMSwweDAwLDB4MDAsMHhiOCwweDIxLDB4MTgsMHg4MCwweDAwLDB4NDgsCisweGFmLDB4YTAsMHgwMCwweDI0LDB4MDAsMHgxMSwweDg5LDB4MDIsMHhhZiwweGIxLDB4MDAsMHg1OCwweDAwLDB4ODAsMHhhOCwweDIxLAorMHgwMCwweDEyLDB4MTAsMHhjMCwweDAwLDB4NTIsMHgxOCwweDIxLDB4MDAsMHgwMywweDgwLDB4ODAsMHgyNywweDg1LDB4OGYsMHhmMCwKKzB4MDIsMHg0MCwweDIwLDB4MjEsMHgwMCwweDQwLDB4YTAsMHgyMSwweDAyLDB4MDUsMHgxMCwweDIxLDB4OTQsMHg1NiwweDAwLDB4MDIsCisweDBjLDB4MDAsMHgxMiwweDg3LDB4MDAsMHgwMCwweDI4LDB4MjEsMHg5MCwweDQyLDB4MDAsMHgwMCwweDI0LDB4MDMsMHgwMCwweDA4LAorMHgzMCwweDQyLDB4MDAsMHgwYywweDEwLDB4NDMsMHgwMSwweDllLDB4MjQsMHgwNCwweDAwLDB4MDEsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MTAsMHg4MiwweDAxLDB4N2MsMHgzYywweDAyLDB4YjAsMHgwMywweDhmLDB4YTYsMHgwMCwweDg4LDB4MzQsMHg0MiwweDAxLDB4MDQsCisweDg0LDB4YzUsMHgwMCwweDBjLDB4MDIsMHg5MiwweDE4LDB4MjEsMHg5NCwweDQ2LDB4MDAsMHgwMCwweDAwLDB4MDUsMHgyMCwweGMwLAorMHgwMCwweDg1LDB4MjAsMHgyMSwweDAwLDB4MDMsMHgxOCwweDgwLDB4MjcsMHg4MiwweDkwLDB4MDAsMHgyNywweDg1LDB4OGYsMHhmOCwKKzB4MDAsMHg2NSwweDI4LDB4MjEsMHgwMCwweDYyLDB4MTgsMHgyMSwweDgwLDB4NzEsMHgwMCwweDA1LDB4ODAsMHg3MywweDAwLDB4MDQsCisweDhmLDB4YTMsMHgwMCwweDg4LDB4MzAsMHhkMCwweGZmLDB4ZmYsMHgwMCwweDEwLDB4M2EsMHgwMywweDMyLDB4MDgsMHgwMCwweGZmLAorMHgyNywweDgyLDB4OTAsMHgxMCwweDAwLDB4MDQsMHgyMCwweDgwLDB4ODAsMHhhNiwweDAwLDB4MDYsMHgwMCwweDgyLDB4MjAsMHgyMSwKKzB4YTQsMHg2NywweDAwLDB4NDQsMHhhNCwweDY4LDB4MDAsMHg0NiwweDhjLDB4ODQsMHgwMCwweDAwLDB4MzgsMHhjNiwweDAwLDB4MDAsCisweDAxLDB4MDAsMHg4MCwweDIxLDB4MDAsMHgwNCwweDE1LDB4MDIsMHgzMCwweDQyLDB4MDAsMHgwMSwweDEwLDB4NDAsMHgwMCwweDAzLAorMHgwMCwweGU2LDB4ODAsMHgwYSwweDAwLDB4MDQsMHgxNCwweDAyLDB4MzAsMHg1MCwweDAwLDB4MGYsMHgxMiwweDIwLDB4MDEsMHg1MCwKKzB4MDIsMHg0MCwweDIwLDB4MjEsMHgwMiwweDcxLDB4MTAsMHgyMSwweDAwLDB4NTAsMHgxMCwweDJhLDB4MTQsMHg0MCwweDAwLDB4ZWQsCisweDAyLDB4OTIsMHgxMCwweDIxLDB4OTMsMHg4MiwweDhiLDB4NjEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDAxLAorMHgxNCwweDQwLDB4MDAsMHhlMCwweDAyLDB4OTIsMHgyOCwweDIxLDB4MjYsMHhlMiwweDAwLDB4MDEsMHgzMCwweDU3LDB4ZmYsMHhmZiwKKzB4MDIsMHg0MCwweGYwLDB4MjEsMHgyNiwweGI1LDB4ZmYsMHhmZiwweDE2LDB4YTAsMHhmZiwweGJkLDB4MDIsMHhjMCwweDkwLDB4MjEsCisweDE2LDB4ZTAsMHgwMCwweGQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweGEzLDB4MDAsMHg5OCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyYywweDYyLDB4MDAsMHgxMCwweDEwLDB4NDAsMHgwMCwweDJlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweGE0LDB4MDAsMHgyNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxOCwweDgwLDB4MDAsMHgyYSwweDI0LDB4MDMsMHgwMCwweDAxLDB4OGYsMHhhNSwweDAwLDB4MWMsCisweDI3LDB4ODQsMHg4ZiwweGY0LDB4OTQsMHhiMiwweDAwLDB4MTQsMHhhMCwweGEzLDB4MDAsMHgxMiwweDhmLDB4YTYsMHgwMCwweDNjLAorMHgwMCwweDEyLDB4MTAsMHhjMCwweDAwLDB4NTIsMHgxMCwweDIxLDB4MDAsMHgwMiwweDgwLDB4ODAsMHgyNywweDgyLDB4OTAsMHgwMCwKKzB4MDIsMHgwMiwweDEwLDB4MjEsMHg4MCwweDQzLDB4MDAsMHgwNiwweDAyLDB4MDQsMHgyMCwweDIxLDB4OGMsMHg4NSwweDAwLDB4MTgsCisweDI0LDB4NjMsMHgwMCwweDAyLDB4MDAsMHgwMywweDE3LDB4YzIsMHgwMCwweDYyLDB4MTgsMHgyMSwweDAwLDB4MDMsMHgxOCwweDQzLAorMHgwMCwweDAzLDB4MTgsMHg0MCwweDE0LDB4YzAsMHgwMCwweDBlLDB4MDAsMHhhMywweDM4LDB4MjEsMHgyNywweDgyLDB4OGYsMHhmMCwKKzB4MDIsMHgwMiwweDEwLDB4MjEsMHg5NCwweDQzLDB4MDAsMHgwNiwweDhmLDB4YTgsMHgwMCwweDFjLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweGE1LDB4MDMsMHgwMCwweDFhLDB4N2IsMHhiZSwweDA0LDB4M2MsMHg3YiwweGI2LDB4MDMsMHhmYywweDdiLDB4YjQsMHgwMywweGJjLAorMHg3YiwweGIyLDB4MDMsMHg3YywweDdiLDB4YjAsMHgwMywweDNjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHg4OCwKKzB4OGYsMHhhNCwweDAwLDB4OTgsMHg4ZiwweGE1LDB4MDAsMHgzOCwweDhmLDB4YTYsMHgwMCwweDM0LDB4YWYsMHhhMCwweDAwLDB4MTAsCisweDBjLDB4MDAsMHgwOSwweDA2LDB4YWYsMHhhMCwweDAwLDB4MTQsMHgwOCwweDAwLDB4MWQsMHg0YiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4ZiwweGEzLDB4MDAsMHg0NCwweDkzLDB4ODIsMHg4MSwweDU5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHg2MSwKKzB4MzAsMHg2OSwweDAwLDB4MDMsMHg4ZiwweGE0LDB4MDAsMHgyNCwweDhmLDB4YTUsMHgwMCwweDI4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4ODUsMHgxMCwweDJhLDB4MTAsMHg0MCwweDAwLDB4OGYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YTYsMHgwMCwweDFjLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDkwLDB4YzQsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDgzLDB4MDAsMHhmZiwKKzB4MDAsMHhhMywweDEwLDB4MmEsMHgxMCwweDQwLDB4MDAsMHg4NywweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhhOCwweDAwLDB4MjQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTEsMHgwMCwweDAwLDB4ODMsMHgwMCwweDY1LDB4MTAsMHgyMywweDAwLDB4YTgsMHgxOCwweDIzLAorMHgwMCwweDYyLDB4MTAsMHgyYSwweDE0LDB4NDAsMHgwMCwweDdkLDB4MzAsMHg2MywweDAwLDB4ZmYsMHgwMCwweDg1LDB4MTAsMHgyMywKKzB4MzAsMHg0MiwweDAwLDB4ZmYsMHhhZiwweGEyLDB4MDAsMHg1MCwweDhmLDB4YTIsMHgwMCwweDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4NDAsMHgwMCwweDczLDB4MDAsMHgwMCwweGE4LDB4MjEsMHgyNywweDhjLDB4OGYsMHhmMCwweDNjLDB4MGIsMHg4MCwweGZmLAorMHgyNCwweDEwLDB4MDAsMHgwNCwweDI3LDB4OTEsMHg4ZiwweGY0LDB4MzUsMHg2YiwweGZmLDB4ZmYsMHgzYywweDBkLDB4N2YsMHgwMCwKKzB4MjcsMHg4ZSwweDkwLDB4MDAsMHgwMSwweDgwLDB4NzgsMHgyMSwweDAwLDB4MTIsMHgzMCwweGMwLDB4MDAsMHhkMiwweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0YywweDEwLDB4MjEsMHg5NCwweDQyLDB4MDAsMHgwNiwweDhmLDB4YTMsMHgwMCwweDJjLAorMHg4ZiwweGE0LDB4MDAsMHgzMCwweGFmLDB4YTIsMHgwMCwweDQ0LDB4OGYsMHhhNSwweDAwLDB4NDQsMHgzMCwweDQ5LDB4MDAsMHgwMywKKzB4MDIsMHgwOSwweDEwLDB4MjMsMHgzMCwweDQyLDB4MDAsMHgwMywweDAwLDB4YTIsMHgxMCwweDIxLDB4OGYsMHhhOCwweDAwLDB4MzAsCisweDI0LDB4NDIsMHgwMCwweDA0LDB4MzAsMHg0MiwweGZmLDB4ZmYsMHgwMCwweDY0LDB4MzgsMHgyMSwweDAxLDB4MDIsMHgyOCwweDIzLAorMHgwMCwweDYyLDB4MTgsMHgyMSwweDAwLDB4NDgsMHgxMCwweDJiLDB4MTAsMHg0MCwweDAwLDB4NTIsMHgwMCwweDAwLDB4MjAsMHgyMSwKKzB4MzAsMHhlNywweGZmLDB4ZmYsMHgzMCwweGE0LDB4ZmYsMHhmZiwweGFmLDB4YTcsMHgwMCwweDJjLDB4MDAsMHhkMiwweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg1MSwweDE4LDB4MjEsMHg4YywweDY1LDB4MDAsMHgxOCwweDAwLDB4MDQsMHgyNSwweDQwLAorMHgwMCwweDhkLDB4MjAsMHgyNCwweDhjLDB4YTgsMHgwMCwweDA0LDB4MDAsMHg0ZSwweDE4LDB4MjEsMHgwMCwweDRmLDB4NTAsMHgyMSwKKzB4MDEsMHgwYiwweDQwLDB4MjQsMHgwMSwweDA0LDB4NDAsMHgyNSwweGFjLDB4YTgsMHgwMCwweDA0LDB4OGYsMHhhNCwweDAwLDB4OTgsCisweDhmLDB4YTIsMHgwMCwweDUwLDB4MjYsMHhiNSwweDAwLDB4MDEsMHhhMCwweDY0LDB4MDAsMHgwMCwweDhjLDB4YTQsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4ODEsMHgwMCwweDBjLDB4MDIsMHhhMiwweDMwLDB4MmEsMHg4MCwweDYyLDB4MDAsMHgwNiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHgwMiwweDAwLDB4MDIsMHgxZiwweGMyLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDQzLDB4MDAsMHgwMiwweDEwLDB4NDAsMHgwMCwweGEyLDB4MzgsMHgyMSwweDhmLDB4YTUsMHgwMCwweDQwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweGE0LDB4ZTUsMHgwMCwweDAwLDB4OTUsMHg1MiwweDAwLDB4MDIsMHgxNCwweGMwLDB4ZmYsMHhjNywKKzB4MDAsMHgxMiwweDMwLDB4YzAsMHg4ZiwweGE0LDB4MDAsMHgyNCwweDhmLDB4YTUsMHgwMCwweDUwLDB4OGYsMHhhNiwweDAwLDB4MWMsCisweDhmLDB4YTMsMHgwMCwweDJjLDB4MDAsMHg4NSwweDgwLDB4MjEsMHhhMCwweGQwLDB4MDAsMHgxMiwweDAwLDB4MDksMHgxMCwweDIzLAorMHgzMCwweDQyLDB4MDAsMHgwMywweDhmLDB4YTgsMHgwMCwweDg4LDB4MDAsMHg2MiwweDEwLDB4MjMsMHhhNCwweGMyLDB4MDAsMHgxYSwKKzB4ODUsMHgwMywweDAwLDB4MGMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4MywweDhmLDB4ZjQsMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDE4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4ODMsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDYzLDB4MDAsMHgxMCwKKzB4MTQsMHg2MCwweGZmLDB4NzQsMHgwMiwweDAwLDB4MTAsMHgyMSwweDhmLDB4YTMsMHgwMCwweDU0LDB4OGYsMHhhNCwweDAwLDB4MTgsCisweDhmLDB4YTUsMHgwMCwweDI0LDB4MDAsMHg2NCwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4ODMsMHg5MCwweDA4LAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDkwLDB4NDQsMHgwMCwweDAwLDB4MTAsMHhhMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MzAsMHgyMSwKKzB4MDgsMHgwMCwweDFkLDB4NTEsMHgwMiwweDAwLDB4MTAsMHgyMSwweDkzLDB4ODIsMHg4MCwweDEwLDB4MDAsMHgwMCwweDI4LDB4MjEsCisweDAwLDB4MDAsMHgzOCwweDIxLDB4MGMsMHgwMCwweDIxLDB4ZjUsMHhhZiwweGEyLDB4MDAsMHgxMCwweDA4LDB4MDAsMHgxZCwweDUxLAorMHgwMiwweDAwLDB4MTAsMHgyMSwweDMwLDB4NjMsMHhmZiwweGZmLDB4MDgsMHgwMCwweDFkLDB4YTMsMHhhZiwweGEzLDB4MDAsMHgyYywKKzB4OGYsMHhhOCwweDAwLDB4NDQsMHgwOCwweDAwLDB4MWQsMHhjNSwweDMxLDB4MDksMHgwMCwweDAzLDB4MDgsMHgwMCwweDFkLDB4N2UsCisweGFmLDB4YTMsMHgwMCwweDUwLDB4OGYsMHhhNiwweDAwLDB4NDQsMHhhZiwweGEwLDB4MDAsMHg1MCwweDA4LDB4MDAsMHgxZCwweGM1LAorMHgzMCwweGM5LDB4MDAsMHgwMywweDhmLDB4YTUsMHgwMCwweDQ4LDB4OGYsMHhhNiwweDAwLDB4NGMsMHg4ZiwweGE0LDB4MDAsMHgxYywKKzB4MDMsMHhjMCwweDM4LDB4MjEsMHgwYywweDAwLDB4MWIsMHhmNiwweGFmLDB4YjcsMHgwMCwweDEwLDB4MDgsMHgwMCwweDFkLDB4MmUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNSwweDI4LDB4ODAsMHgyNywweDgyLDB4OGYsMHhmMCwweDAwLDB4YTIsMHgyOCwweDIxLAorMHgwMCwweDAwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgwMSwweDRiLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MWQsMHgyNywKKzB4MjYsMHhlMiwweDAwLDB4MDEsMHgwMCwweDAyLDB4ODAsMHg4MCwweDI3LDB4ODMsMHg5MCwweDAwLDB4OGYsMHhhNCwweDAwLDB4MWMsCisweDAyLDB4MDMsMHgxOCwweDIxLDB4MjYsMHgzMSwweDAwLDB4MDEsMHgwMiwweDQwLDB4MjgsMHgyMSwweDBjLDB4MDAsMHgxZiwweDA4LAorMHhhMCwweDcxLDB4MDAsMHgwNSwweDE0LDB4NDAsMHhmZiwweDEzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNiwweGUwLDB4MDAsMHg0ZCwKKzB4MDMsMHhjMCwweDM4LDB4MjEsMHg4ZiwweGE0LDB4MDAsMHgyNCwweDhmLDB4YTUsMHgwMCwweDIwLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDI0LDB4ODQsMHgwMCwweDAxLDB4YWYsMHhiMiwweDAwLDB4NDgsMHhhZiwweGI2LDB4MDAsMHg0YywweDAyLDB4YzAsMHhmMCwweDIxLAorMHgxMCwweGEyLDB4MDAsMHg0MSwweGFmLDB4YTQsMHgwMCwweDI0LDB4MjcsMHg4MiwweDhmLDB4ZjAsMHgwMiwweDAyLDB4MTAsMHgyMSwKKzB4OTQsMHg0MiwweDAwLDB4MDYsMHg4ZiwweGE0LDB4MDAsMHgzMCwweGFmLDB4YTAsMHgwMCwweDIwLDB4YWYsMHhhMiwweDAwLDB4NDQsCisweDMwLDB4NDksMHgwMCwweDAzLDB4OGYsMHhhOCwweDAwLDB4NDQsMHgwMCwweDA5LDB4MTAsMHgyMywweDMwLDB4NDIsMHgwMCwweDAzLAorMHgwMSwweDAyLDB4MTAsMHgyMSwweDI0LDB4NDIsMHgwMCwweDA0LDB4MzAsMHg0MiwweGZmLDB4ZmYsMHgwMCwweDQ0LDB4MTgsMHgyYiwKKzB4MTAsMHg2MCwweDAwLDB4MmIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YTUsMHgwMCwweDJjLDB4MDAsMHg4MiwweDEwLDB4MjMsCisweDAwLDB4YTQsMHgxOCwweDIxLDB4MzAsMHg2MywweGZmLDB4ZmYsMHgzMCwweDQ0LDB4ZmYsMHhmZiwweGFmLDB4YTMsMHgwMCwweDJjLAorMHgwMiwweDkyLDB4MjgsMHgyMSwweDAwLDB4MDUsMHgyOCwweDgwLDB4MjcsMHg4MiwweDhmLDB4ZjQsMHgwMCwweGEyLDB4MTAsMHgyMSwKKzB4OGMsMHg0NiwweDAwLDB4MTgsMHgzYywweDAzLDB4ODAsMHhmZiwweDNjLDB4MDIsMHg3ZiwweDAwLDB4OGMsMHhjOCwweDAwLDB4MDQsCisweDAwLDB4MDQsMHgyNSwweDQwLDB4MzQsMHg2MywweGZmLDB4ZmYsMHgwMCwweDgyLDB4MjAsMHgyNCwweDAxLDB4MDMsMHg0MCwweDI0LAorMHgwMSwweDA0LDB4NDAsMHgyNSwweGFjLDB4YzgsMHgwMCwweDA0LDB4OGYsMHhhOCwweDAwLDB4OTgsMHgyNywweDgyLDB4OTAsMHgwMCwKKzB4MDAsMHhhMiwweDEwLDB4MjEsMHhhMCwweDQ4LDB4MDAsMHgwMCwweDhjLDB4YzQsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDQsMHgyNywweGMyLDB4MTAsMHg4MCwweGZlLDB4ZGIsMHhhZiwweGE0LDB4MDAsMHgzYywweDgwLDB4NDIsMHgwMCwweDA2LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDAyLDB4MDAsMHgwMiwweDFmLDB4YzIsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4NDMsMHgwMCwweDAyLDB4MTAsMHg0MCwweDAwLDB4YzIsMHgzOCwweDIxLDB4OGYsMHhhMiwweDAwLDB4NDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4YTQsMHhlMiwweDAwLDB4MDAsMHgwOCwweDAwLDB4MWQsMHgyYSwweDI2LDB4YjUsMHhmZiwweGZmLAorMHg4ZiwweGE2LDB4MDAsMHgyYywweDAwLDB4MDAsMHgyMCwweDIxLDB4MDAsMHhjMiwweDEwLDB4MjEsMHgzMCwweDQyLDB4ZmYsMHhmZiwKKzB4MDgsMHgwMCwweDFlLDB4MzgsMHhhZiwweGEyLDB4MDAsMHgyYywweDhmLDB4YTYsMHgwMCwweDFjLDB4MDgsMHgwMCwweDFlLDB4MjIsCisweGE0LDB4ZDIsMHgwMCwweDE0LDB4OGYsMHhhNSwweDAwLDB4NDgsMHg4ZiwweGE2LDB4MDAsMHg0YywweDhmLDB4YTQsMHgwMCwweDFjLAorMHgwYywweDAwLDB4MWIsMHhmNiwweGFmLDB4YjcsMHgwMCwweDEwLDB4MDgsMHgwMCwweDFlLDB4MTksMHgwMCwweDAwLDB4YjgsMHgyMSwKKzB4MGMsMHgwMCwweDEyLDB4ODcsMHgwMCwweDAwLDB4MjgsMHgyMSwweDAwLDB4NDAsMHgxOCwweDIxLDB4OTQsMHg0MiwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzQsMHg0MiwweDA4LDB4MDAsMHhhNCwweDYyLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxZCwweDFlLAorMHgwMiwweDcxLDB4MTAsMHgyMSwweDAyLDB4OTIsMHgxOCwweDIxLDB4MDAsMHgwMywweDgwLDB4ODAsMHgyNywweDgyLDB4OGYsMHhmNCwKKzB4MDIsMHgwMiwweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHg4MywweDAwLDB4MDQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MywweDAwLDB4MTAsMHgxMCwweDYwLDB4MDAsMHgwOSwweDI0LDB4MDYsMHgwMCwweDAxLAorMHg5MywweDgyLDB4OGIsMHg2MSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MDEsMHgxMCwweDQwLDB4ZmUsMHhhMiwKKzB4M2MsMHgwNCwweDAwLDB4ODAsMHgyNywweDg1LDB4OGYsMHhmMCwweDA4LDB4MDAsMHgxZSwweDA5LDB4MDIsMHgwNSwweDI4LDB4MjEsCisweDI3LDB4ODMsMHg5MCwweDA4LDB4MjcsMHg4MiwweDkwLDB4MDAsMHgwMiwweDAzLDB4MTgsMHgyMSwweDAyLDB4MDIsMHgxMCwweDIxLAorMHg5MCwweDY0LDB4MDAsMHgwMCwweDkwLDB4NDUsMHgwMCwweDA1LDB4OTMsMHg4MywweDgwLDB4MTAsMHgwMCwweDAwLDB4MzgsMHgyMSwKKzB4MGMsMHgwMCwweDIxLDB4ZjUsMHhhZiwweGEzLDB4MDAsMHgxMCwweDA4LDB4MDAsMHgxZSwweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI3LDB4ODIsMHg5MCwweDA4LDB4MDIsMHgwMiwweDEwLDB4MjEsMHg5NCwweDQzLDB4MDAsMHgwMiwweDhmLDB4YTYsMHgwMCwweDU4LAorMHgwMCwweDAzLDB4MTksMHgwMiwweDAwLDB4NjYsMHgxOCwweDIzLDB4MzAsMHg2MywweDBmLDB4ZmYsMHgyOCwweDYyLDB4MDAsMHgyMCwKKzB4MTAsMHg0MCwweDAwLDB4MDYsMHgyOCwweDYyLDB4MDAsMHg0MCwweDhmLDB4YTgsMHgwMCwweDkwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4NjgsMHgxMCwweDA2LDB4MDgsMHgwMCwweDFjLDB4ZjcsMHgzMCwweDQ0LDB4MDAsMHgwMSwweDEwLDB4NDAsMHgwMCwweDA0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YTQsMHgwMCwweDk0LDB4MDgsMHgwMCwweDFlLDB4YTEsMHgwMCwweDY0LDB4MTAsMHgwNiwKKzB4MDgsMHgwMCwweDFjLDB4ZjcsMHgwMCwweDAwLDB4MjAsMHgyMSwweDhmLDB4YTQsMHgwMCwweDk4LDB4OGYsMHhhNSwweDAwLDB4MzgsCisweGFmLDB4YTAsMHgwMCwweDEwLDB4MGMsMHgwMCwweDA5LDB4MDYsMHhhZiwweGE4LDB4MDAsMHgxNCwweDMwLDB4NDIsMHhmZiwweGZmLAorMHgwOCwweDAwLDB4MWMsMHhjNywweGFmLDB4YTIsMHgwMCwweDQwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAzLDB4ODAsMHgwMCwKKzB4MjcsMHhiZCwweGZmLDB4ZTAsMHgzNCwweDQyLDB4MDAsMHgyMCwweDI0LDB4NjMsMHg3YSwweGM4LDB4YWYsMHhiMSwweDAwLDB4MTQsCisweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MTgsMHhhYywweDQzLDB4MDAsMHgwMCwweDkwLDB4ODIsMHgwMCwweDBhLAorMHgwMCwweDgwLDB4ODAsMHgyMSwweDE0LDB4NDAsMHgwMCwweDQ1LDB4MDAsMHgwMCwweDg4LDB4MjEsMHg5MiwweDAyLDB4MDAsMHgwNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MTIsMHgyMCwweDAwLDB4MTgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTIsMHgwMiwweDAwLDB4MTYsMHg5MiwweDA1LDB4MDAsMHgwYSwweDMwLDB4NDIsMHgwMCwweGZjLAorMHgxMCwweGEwLDB4MDAsMHgwMywweGEyLDB4MDIsMHgwMCwweDE2LDB4MzQsMHg0MiwweDAwLDB4MDEsMHhhMiwweDAyLDB4MDAsMHgxNiwKKzB4OTIsMHgwNCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4ODMsMHgwMCwweGZmLDB4MTAsMHg2MCwweDAwLDB4MDUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTIsMHgwMiwweDAwLDB4MTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDM0LDB4NDIsMHgwMCwweDAyLAorMHhhMiwweDAyLDB4MDAsMHgxNiwweDEwLDB4NjAsMHgwMCwweDBhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweGEwLDB4MDAsMHgwOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NiwweDAyLDB4MDAsMHgwMCwweGEyLDB4MDAsMHgwMCwweDE3LDB4YTYsMHgwMiwweDAwLDB4MTQsCisweDhmLDB4YmYsMHgwMCwweDE4LDB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDIwLAorMHgxNCwweDgwLDB4MDAsMHgwNSwweDI0LDB4MDIsMHgwMCwweDAxLDB4OTYsMHgwMywweDAwLDB4MDYsMHhhMiwweDAyLDB4MDAsMHgxNywKKzB4MDgsMHgwMCwweDFlLDB4ZGMsMHhhNiwweDAzLDB4MDAsMHgxNCwweDk2LDB4MDQsMHgwMCwweDAwLDB4OTYsMHgwNSwweDAwLDB4MDYsCisweDI3LDB4ODYsMHg4ZiwweGYwLDB4MDAsMHgwNCwweDEwLDB4YzAsMHgwMCwweDA1LDB4MTgsMHhjMCwweDAwLDB4NDQsMHgxMCwweDIxLAorMHgwMCwweDY1LDB4MTgsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY2LDB4MTgsMHgyMSwKKzB4MDAsMHg0NiwweDEwLDB4MjEsMHg4YywweDY1LDB4MDAsMHgwOCwweDhjLDB4NDQsMHgwMCwweDA4LDB4MGMsMHgwMCwweDEyLDB4NzgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MywweDAwLDB4ZmYsMHgxMCwweDYwLDB4MDAsMHgwNCwweGEyLDB4MDIsMHgwMCwweDE3LAorMHg5NiwweDAyLDB4MDAsMHgwNiwweDA4LDB4MDAsMHgxZSwweGRjLDB4YTYsMHgwMiwweDAwLDB4MTQsMHg5NiwweDAyLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDFlLDB4ZGMsMHhhNiwweDAyLDB4MDAsMHgxNCwweDk2LDB4MDUsMHgwMCwweDAwLDB4MGMsMHgwMCwweDFmLDB4MDgsCisweDAyLDB4MDAsMHgyMCwweDIxLDB4MDgsMHgwMCwweDFlLDB4YzMsMHgwMiwweDIyLDB4ODgsMHgyMSwweDk0LDB4ODUsMHgwMCwweDA2LAorMHgwYywweDAwLDB4MWYsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDFlLDB4YmYsMHgwMCwweDQwLDB4ODgsMHgyMSwKKzB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDdjLDB4MjAsCisweDI3LDB4YmQsMHhmZiwweGYwLDB4YWMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgyMSwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgxMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgzNCwweDYzLDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweDdjLDB4NDQsMHhhYywweDYyLDB4MDAsMHgwMCwweDkwLDB4ODksMHgwMCwweDBhLDB4MDAsMHg4MCwweDMwLDB4MjEsCisweDExLDB4MjAsMHgwMCwweDA1LDB4MDAsMHhhMCwweDUwLDB4MjEsMHg5MCwweDgyLDB4MDAsMHgxNywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNCwweDQwLDB4MDAsMHgxYiwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHhjNywweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHhlMCwweDAwLDB4MWIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDk0LDB4YzgsMHgwMCwweDAwLDB4MjcsMHg4MywweDhmLDB4ZjAsCisweDkzLDB4ODUsMHg4YiwweDYwLDB4MDAsMHgwOCwweDEwLDB4YzAsMHgwMCwweDQ4LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDA4LDB4MDAsMHhlNSwweDI4LDB4MmIsMHgxMCwweGEwLDB4MDAsMHgwNiwKKzB4MDEsMHg0NCwweDE4LDB4MjMsMHg4ZiwweDgyLDB4OGIsMHg3OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MywweDEwLDB4MmIsCisweDEwLDB4NDAsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAzLDB4MDAsMHgxMCwweGE0LDB4YzgsMHgwMCwweDE0LAorMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4NjAsMHgxMCwweDIxLDB4MTEsMHgyMCwweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OTQsMHhjMiwweDAwLDB4MDYsMHgyNCwweDAzLDB4MDAsMHgwOCwweDA4LDB4MDAsMHgxZiwweDM0LDB4YTQsMHhjMiwweDAwLDB4MTQsCisweDA4LDB4MDAsMHgxZiwweDM0LDB4MDAsMHgwMCwweDE4LDB4MjEsMHgyNywweGJkLDB4ZmYsMHhjOCwweGFmLDB4YjUsMHgwMCwweDJjLAorMHhhZiwweGI0LDB4MDAsMHgyOCwweGFmLDB4YjMsMHgwMCwweDI0LDB4YWYsMHhiMCwweDAwLDB4MTgsMHhhZiwweGJmLDB4MDAsMHgzMCwKKzB4YWYsMHhiMiwweDAwLDB4MjAsMHhhZiwweGIxLDB4MDAsMHgxYywweDk0LDB4OTEsMHgwMCwweDA2LDB4MDAsMHg4MCwweGEwLDB4MjEsCisweDNjLDB4MDIsMHg4MCwweDAwLDB4M2MsMHgwNCwweGIwLDB4MDMsMHgwMCwweDExLDB4YTgsMHhjMCwweDM0LDB4ODQsMHgwMCwweDIwLAorMHgyNCwweDQyLDB4N2MsMHhmOCwweDAyLDB4YjEsMHg0OCwweDIxLDB4YWMsMHg4MiwweDAwLDB4MDAsMHgwMCwweDA5LDB4NDgsMHg4MCwKKzB4MjQsMHgwMywweDAwLDB4MDEsMHgyNywweDgyLDB4OTAsMHgwMCwweGEyLDB4ODMsMHgwMCwweDEyLDB4MDEsMHgyMiwweDEwLDB4MjEsCisweDI3LDB4ODQsMHg4ZiwweGY0LDB4MDEsMHgyNCwweDIwLDB4MjEsMHg4MCwweDQ4LDB4MDAsMHgwNiwweDhjLDB4OGEsMHgwMCwweDE4LAorMHgyNywweDgzLDB4OTAsMHgxMCwweDAxLDB4MjMsMHg0OCwweDIxLDB4OGQsMHgyNCwweDAwLDB4MDAsMHgyNSwweDA4LDB4MDAsMHgwMiwKKzB4OGQsMHg0MiwweDAwLDB4MDAsMHg4ZCwweDQ5LDB4MDAsMHgwNCwweDAwLDB4MDgsMHgxNywweGMyLDB4OGQsMHg0MywweDAwLDB4MDgsCisweDAxLDB4MDIsMHg0MCwweDIxLDB4MDAsMHgwNCwweDI1LDB4YzIsMHgwMCwweDA4LDB4NDAsMHg0MywweDMwLDB4ODQsMHgwMCwweDAxLAorMHgwMCwweDAzLDB4MWYsMHhjMiwweDAwLDB4MDgsMHg0MCwweDQwLDB4MDAsMHhlMCwweDgwLDB4MjEsMHgwMCwweDY0LDB4MTgsMHgyNCwKKzB4MDAsMHgwOSwweDQ5LDB4NDIsMHgwMSwweDQ4LDB4MTAsMHgyMSwweDAwLDB4YTAsMHg5OCwweDIxLDB4MDAsMHhhMCwweDIwLDB4MjEsCisweDAwLDB4NDAsMHgzOCwweDIxLDB4MDIsMHgwMCwweDI4LDB4MjEsMHgxNCwweDYwLDB4MDAsMHgxOSwweDMxLDB4MjksMHgwMCwweDAxLAorMHg5NCwweDQyLDB4MDAsMHgwMCwweDAyLDB4YjEsMHg4OCwweDIxLDB4MDIsMHgwMCwweDI4LDB4MjEsMHgwMCwweDExLDB4ODgsMHg4MCwKKzB4MjcsMHg5MCwweDhmLDB4ZjAsMHgwMiwweDMwLDB4ODAsMHgyMSwweDk2LDB4MDMsMHgwMCwweDA2LDB4MzAsMHg1MiwweGZmLDB4ZmYsCisweDAyLDB4NjAsMHgyMCwweDIxLDB4MDAsMHg2MCwweDMwLDB4MjEsMHhhNiwweDgzLDB4MDAsMHgxYSwweDI3LDB4ODIsMHg4ZiwweGY4LAorMHgwYywweDAwLDB4MDgsMHhkZiwweDAyLDB4MjIsMHg4OCwweDIxLDB4MDAsMHg1MiwweDEwLDB4MjEsMHg5NiwweDAzLDB4MDAsMHgwNiwKKzB4YTYsMHgyMiwweDAwLDB4MDQsMHg4ZiwweGJmLDB4MDAsMHgzMCwweDdiLDB4YjQsMHgwMSwweDdjLDB4N2IsMHhiMiwweDAxLDB4M2MsCisweDdiLDB4YjAsMHgwMCwweGZjLDB4MDAsMHg2MCwweDEwLDB4MjEsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDM4LAorMHhhZiwweGE5LDB4MDAsMHgxMCwweDBjLDB4MDAsMHgwOSwweDA2LDB4YWYsMHhhMCwweDAwLDB4MTQsMHgwOCwweDAwLDB4MWYsMHg3MiwKKzB4MDIsMHhiMSwweDg4LDB4MjEsMHgyNywweGJkLDB4ZmYsMHhjMCwweGFmLDB4YmUsMHgwMCwweDM4LDB4YWYsMHhiNywweDAwLDB4MzQsCisweGFmLDB4YjYsMHgwMCwweDMwLDB4YWYsMHhiNSwweDAwLDB4MmMsMHhhZiwweGIzLDB4MDAsMHgyNCwweGFmLDB4YjEsMHgwMCwweDFjLAorMHhhZiwweGJmLDB4MDAsMHgzYywweGFmLDB4YjQsMHgwMCwweDI4LDB4YWYsMHhiMiwweDAwLDB4MjAsMHhhZiwweGIwLDB4MDAsMHgxOCwKKzB4OTQsMHg5MCwweDAwLDB4MDAsMHgzYywweDA4LDB4YjAsMHgwMywweDM1LDB4MDgsMHgwMCwweDIwLDB4MDAsMHgxMCwweDEwLDB4YzAsCisweDAwLDB4NTAsMHgxOCwweDIxLDB4MDAsMHg0MCwweDg4LDB4MjEsMHgzYywweDAyLDB4ODAsMHgwMCwweDAwLDB4MDMsMHg0OCwweDgwLAorMHgyNCwweDQyLDB4N2UsMHgzNCwweDAwLDB4ODAsMHg5OCwweDIxLDB4MjcsMHg4NCwweDkwLDB4MDAsMHgwMSwweDI0LDB4MjAsMHgyMSwKKzB4OTMsMHhiNywweDAwLDB4NTMsMHhhZCwweDAyLDB4MDAsMHgwMCwweDgwLDB4ODMsMHgwMCwweDA2LDB4MjcsMHg4MiwweDhmLDB4ZjQsCisweDAxLDB4MjIsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MTgsMHgyNCwweDYzLDB4MDAsMHgwMiwweDAwLDB4MDMsMHgxNywweGMyLAorMHg4YywweDg4LDB4MDAsMHgwOCwweDAwLDB4NjIsMHgxOCwweDIxLDB4MDAsMHgwMywweDE4LDB4NDMsMHgwMCwweDAzLDB4MTgsMHg0MCwKKzB4YWYsMHhhNywweDAwLDB4NGMsMHgyYywweGEyLDB4MDAsMHgxMCwweDAwLDB4YTAsMHhhOCwweDIxLDB4MDAsMHg4MywweDUwLDB4MjEsCisweDAwLDB4MDgsMHg0NywweGMyLDB4MDAsMHhjMCwweDU4LDB4MjEsMHgwMCwweDAwLDB4YjAsMHgyMSwweDhjLDB4OTIsMHgwMCwweDBjLAorMHgxNCwweDQwLDB4MDAsMHgxMywweDAwLDB4MDAsMHhmMCwweDIxLDB4OTIsMHg2NywweDAwLDB4MDQsMHgyNCwweDE0LDB4MDAsMHgwMSwKKzB4MTIsMHg4NywweDAwLDB4MTAsMHgwMiwweDMwLDB4MTAsMHgyMSwweDI3LDB4ODMsMHg5MCwweDA4LDB4MDEsMHgyMywweDE4LDB4MjEsCisweDgwLDB4NjQsMHgwMCwweDAwLDB4MjcsMHg4MywweGI1LDB4NjAsMHgwMCwweDA0LDB4MTEsMHgwMCwweDAwLDB4NDQsMHgxMCwweDIzLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDQsMHgxMCwweDIzLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4OTAsMHg0NCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4ODAsMHgwMCwweDIzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAyLDB4MzAsMHgxMCwweDIxLDB4MDAsMHgwMiwweDgwLDB4ODAsMHgyNCwweDA0LDB4MDAsMHgwMSwweDI3LDB4ODMsMHg5MCwweDEwLAorMHhhMiwweDY0LDB4MDAsMHgxMiwweDAyLDB4MDMsMHgxOCwweDIxLDB4OGMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMiwweDE1LDB4YzIsMHgzMCwweDQyLDB4MDAsMHgwMSwweDAxLDB4MDIsMHgxMCwweDI0LDB4MTQsMHg0MCwweDAwLDB4MGUsCisweDAyLDB4YTAsMHgyMCwweDIxLDB4MjcsMHg4MiwweDhmLDB4ZjAsMHgwMiwweDAyLDB4MTAsMHgyMSwweDk0LDB4NDMsMHgwMCwweDA2LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweGE2LDB4NjMsMHgwMCwweDFhLDB4OTQsMHg0MiwweDAwLDB4MDYsMHg3YiwweGJlLDB4MDEsMHhmYywKKzB4N2IsMHhiNiwweDAxLDB4YmMsMHg3YiwweGI0LDB4MDEsMHg3YywweDdiLDB4YjIsMHgwMSwweDNjLDB4N2IsMHhiMCwweDAwLDB4ZmMsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4NDAsMHg4ZiwweGE1LDB4MDAsMHg0YywweDAxLDB4NjAsMHgzMCwweDIxLAorMHgwMSwweDQwLDB4MzgsMHgyMSwweGFmLDB4YTAsMHgwMCwweDEwLDB4MGMsMHgwMCwweDA5LDB4MDYsMHhhZiwweGEwLDB4MDAsMHgxNCwKKzB4MDgsMHgwMCwweDFmLDB4ZDksMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODMsMHg5MCwweDEwLDB4MDEsMHgyMywweDE4LDB4MjEsCisweDhjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTUsMHhjMiwweDMwLDB4NDIsMHgwMCwweDAxLAorMHgwMSwweDAyLDB4MTAsMHgyNCwweDE0LDB4NDAsMHgwMCwweGFmLDB4MDAsMHhhMCwweDIwLDB4MjEsMHgzMiwweDRmLDB4MDAsMHgwMywKKzB4MDAsMHgxMiwweDEwLDB4ODIsMHgyNSwweGUzLDB4MDAsMHgwZCwweDMwLDB4NDUsMHgwMCwweDA3LDB4MDAsMHg3NCwweDc4LDB4MDQsCisweDEwLDB4YTAsMHgwMCwweDBlLDB4MDAsMHgwMCwweDkwLDB4MjEsMHgyNywweDgyLDB4ODAsMHgxYywweDAwLDB4MTUsMHgxOCwweDQwLAorMHgwMCwweDYyLDB4MTgsMHgyMSwweDk0LDB4NjQsMHgwMCwweDAwLDB4MjQsMHhhMiwweDAwLDB4MDYsMHgwMCwweDU0LDB4MTAsMHgwNCwKKzB4MDAsMHg0NCwweDAwLDB4MWEsMHgxNCwweDgwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNywweDAwLDB4MGQsCisweDAwLDB4MDAsMHgxMCwweDEyLDB4MjQsMHg0MiwweDAwLDB4MjAsMHgzMCwweDUyLDB4ZmYsMHhmYywweDAyLDB4MzAsMHgxMCwweDIxLAorMHgyNywweDgzLDB4OTAsMHgwMCwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsMHg5MCwweDQ0LDB4MDAsMHgwMywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDgzLDB4MDAsMHhmZiwweDJjLDB4NjIsMHgwMCwweDBjLDB4MTQsMHg0MCwweDAwLDB4MDQsCisweDJjLDB4NjIsMHgwMCwweDE5LDB4MzAsMHg4MiwweDAwLDB4MGYsMHgyNCwweDQzLDB4MDAsMHgwYywweDJjLDB4NjIsMHgwMCwweDE5LAorMHgxMCwweDQwLDB4MDAsMHgxOSwweDI0LDB4MGUsMHgwMCwweDIwLDB4MjQsMHg2MiwweGZmLDB4ZTksMHgyYywweDQyLDB4MDAsMHgwMiwKKzB4MTQsMHg0MCwweDAwLDB4MTUsMHgyNCwweDBlLDB4MDAsMHgxMCwweDI0LDB4NjIsMHhmZiwweGViLDB4MmMsMHg0MiwweDAwLDB4MDIsCisweDE0LDB4NDAsMHgwMCwweDExLDB4MjQsMHgwZSwweDAwLDB4MDgsMHgyNCwweDAyLDB4MDAsMHgxNCwweDEwLDB4NjIsMHgwMCwweDBlLAorMHgyNCwweDBlLDB4MDAsMHgwMiwweDI0LDB4NjIsMHhmZiwweGVmLDB4MmMsMHg0MiwweDAwLDB4MDMsMHgxNCwweDQwLDB4MDAsMHgwYSwKKzB4MjQsMHgwZSwweDAwLDB4MTAsMHgyNCwweDYyLDB4ZmYsMHhmMSwweDJjLDB4NDIsMHgwMCwweDAyLDB4MTQsMHg0MCwweDAwLDB4MDYsCisweDI0LDB4MGUsMHgwMCwweDA4LDB4MjQsMHg2MiwweGZmLDB4ZjMsMHgyYywweDQyLDB4MDAsMHgwMiwweDI0LDB4MGUsMHgwMCwweDA0LAorMHgyNCwweDAzLDB4MDAsMHgwMiwweDAwLDB4NjIsMHg3MCwweDBhLDB4MzAsMHhlMiwweDAwLDB4ZmYsMHgwMCwweDAwLDB4NDgsMHgyMSwKKzB4MDAsMHgwMCwweDY4LDB4MjEsMHgxMCwweDQwLDB4MDAsMHg2ZCwweDAwLDB4MDAsMHg1OCwweDIxLDB4M2MsMHgxNCwweDgwLDB4ZmYsCisweDI3LDB4OTksMHg4ZiwweGYwLDB4MDEsMHhmMiwweGMwLDB4MjMsMHgzNiwweDk0LDB4ZmYsMHhmZiwweDAxLDB4YzksMHgxMCwweDJhLAorMHgxNCwweDQwLDB4MDAsMHg2NCwweDI0LDB4MDMsMHgwMCwweDA0LDB4MDAsMHgxMCwweDI4LDB4YzAsMHgwMCwweGIwLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDU5LDB4MTAsMHgyMSwweDk0LDB4NTYsMHgwMCwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMyLDB4Y2MsMHgwMCwweDAzLDB4MDAsMHg2YywweDEwLDB4MjMsMHgzMCwweDQyLDB4MDAsMHgwMywweDAyLDB4YzIsMHgxMCwweDIxLAorMHgyNCwweDQyLDB4MDAsMHgwNCwweDMwLDB4NTEsMHhmZiwweGZmLDB4MDIsMHgzMiwweDE4LDB4MmIsMHgxMCwweDYwLDB4MDAsMHg0ZCwKKzB4MDEsMHhmMSwweDEwLDB4MjMsMHgwMiwweDUxLDB4MTAsMHgyMywweDAxLDB4NzgsMHgxOCwweDJiLDB4MTAsMHg2MCwweDAwLDB4MzQsCisweDMwLDB4NDQsMHhmZiwweGZmLDB4MjksMHgyMiwweDAwLDB4NDAsMHgxMCwweDQwLDB4MDAsMHgzMSwweDAxLDB4NzIsMHgxOCwweDIxLAorMHgyNSwweDIyLDB4MDAsMHgwMSwweDAwLDB4MDIsMHgxNiwweDAwLDB4MDAsMHgwMiwweDRlLDB4MDMsMHgwMCwweGIwLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDMwLDB4ODAsMHgyNywweDgyLDB4OGYsMHhmNCwweDMwLDB4NmIsMHhmZiwweGZmLDB4MDAsMHhjMiwweDE4LDB4MjEsCisweDhjLDB4NjcsMHgwMCwweDE4LDB4MDAsMHgwNCwweDI1LDB4NDAsMHgzYywweDAzLDB4N2YsMHgwMCwweDhjLDB4ZTIsMHgwMCwweDA0LAorMHgwMCwweDgzLDB4MjAsMHgyNCwweDI3LDB4ODMsMHg5MCwweDAwLDB4MDAsMHg1NCwweDEwLDB4MjQsMHgwMCwweGMzLDB4MjgsMHgyMSwKKzB4MDAsMHg0NCwweDEwLDB4MjUsMHhhYywweGUyLDB4MDAsMHgwNCwweDE2LDB4ZTAsMHgwMCwweDAyLDB4YTAsMHhiNSwweDAwLDB4MDAsCisweGEwLDB4YjUsMHgwMCwweDAzLDB4MjcsMHg4NCwweDkwLDB4MTAsMHgwMCwweGM0LDB4MTgsMHgyMSwweDhjLDB4NjIsMHgwMCwweDAwLAorMHg4YywweGU4LDB4MDAsMHgwOCwweDAwLDB4MDIsMHgxNSwweGMyLDB4MDAsMHgwOCwweDQ3LDB4YzIsMHgzMCwweDQyLDB4MDAsMHgwMSwKKzB4MDEsMHgwMiwweDEwLDB4MjQsMHgxMCwweDQwLDB4MDAsMHgwYSwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHhhMiwweDAwLDB4MDYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4MDIsMHgwMCwweDAyLDB4MWYsMHhjMiwweDAwLDB4NDMsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg0MywweDAwLDB4MDIsMHgxMCwweDQwLDB4MDAsMHhlMiwweDUwLDB4MjEsMHhhNSwweDVlLDB4MDAsMHgwMCwKKzB4OTIsMHg2MiwweDAwLDB4MDQsMHgyNSwweGFkLDB4MDAsMHgwMSwweDI3LDB4ODQsMHg4ZiwweGYwLDB4MDAsMHhjNCwweDE4LDB4MjEsCisweDAxLDB4YTIsMHgxMCwweDJhLDB4OTQsMHg3MCwweDAwLDB4MDIsMHgxNCwweDQwLDB4ZmYsMHhiOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5NiwweDYzLDB4MDAsMHgxNCwweDAwLDB4MGMsMHgxMCwweDIzLDB4YTIsMHg2OSwweDAwLDB4MTIsMHgzMCwweDQyLDB4MDAsMHgwMywKKzB4MDEsMHg2MiwweDEwLDB4MjMsMHgwMCwweDAzLDB4ODAsMHhjMCwweDhmLDB4YTUsMHgwMCwweDRjLDB4MzAsMHg0YiwweGZmLDB4ZmYsCisweDAyLDB4MDMsMHg4MCwweDIxLDB4MjcsMHg4MiwweDhmLDB4ZjgsMHgwMCwweDEwLDB4ODAsMHg4MCwweGE2LDB4NmIsMHgwMCwweDFhLAorMHgwMiwweGEwLDB4MjAsMHgyMSwweDAxLDB4NjAsMHgzMCwweDIxLDB4MDEsMHg2MCwweDg4LDB4MjEsMHgwYywweDAwLDB4MDgsMHhkZiwKKzB4MDIsMHgwMiwweDgwLDB4MjEsMHgwMCwweDVlLDB4MTAsMHgyMSwweGE2LDB4MDIsMHgwMCwweDA0LDB4MDgsMHgwMCwweDFmLDB4ZGYsCisweDAyLDB4MjAsMHgxMCwweDIxLDB4MDEsMHg2MiwweDEwLDB4MmIsMHgxMCwweDQwLDB4ZmYsMHhlOSwweDAwLDB4MDAsMHgyMCwweDIxLAorMHgyOSwweDIyLDB4MDAsMHg0MCwweDEwLDB4NDAsMHhmZiwweGU2LDB4MDEsMHg3MSwweDE4LDB4MjEsMHgwOCwweDAwLDB4MjAsMHg1NSwKKzB4MjUsMHgyMiwweDAwLDB4MDEsMHgwOCwweDAwLDB4MjAsMHg4NCwweDMyLDB4Y2MsMHgwMCwweDAzLDB4MDgsMHgwMCwweDIwLDB4ODQsCisweDAwLDB4MDAsMHg2MCwweDIxLDB4OGYsMHhhNSwweDAwLDB4NGMsMHgwMSwweDQwLDB4MzgsMHgyMSwweGFmLDB4YTAsMHgwMCwweDEwLAorMHgwYywweDAwLDB4MDksMHgwNiwweGFmLDB4YjQsMHgwMCwweDE0LDB4OTIsMHg2NywweDAwLDB4MDQsMHgwOCwweDAwLDB4MWYsMHhmNywKKzB4MzAsMHg1ZSwweGZmLDB4ZmYsMHgzMCwweDg0LDB4ZmYsMHhmZiwweDAwLDB4MDQsMHgzMCwweGMwLDB4MDAsMHhjNCwweDIwLDB4MjEsCisweDAwLDB4MDQsMHgyMCwweDgwLDB4MjcsMHg4MiwweDhmLDB4ZjAsMHgzYywweDAzLDB4YjAsMHgwOCwweDMwLDB4YTUsMHhmZiwweGZmLAorMHgwMCwweDgyLDB4MjAsMHgyMSwweDAwLDB4YzMsMHgzMCwweDIxLDB4YWMsMHhjNSwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4YTQsMHg4NSwweDAwLDB4MDAsMHgzMCwweDg0LDB4ZmYsMHhmZiwweDAwLDB4MDQsMHgzMCwweGMwLDB4MDAsMHhjNCwweDMwLDB4MjEsCisweDI3LDB4ODgsMHg4ZiwweGYwLDB4MDAsMHgwNiwweDMwLDB4ODAsMHgwMCwweGM4LDB4MzAsMHgyMSwweDk0LDB4YzMsMHgwMCwweDA0LAorMHgzYywweDAyLDB4YjAsMHgwOCwweDNjLDB4MDcsMHhiMCwweDAzLDB4MDAsMHgwMywweDIwLDB4YzAsMHgwMCwweDgzLDB4MTgsMHgyMSwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDgyLDB4MjAsMHgyMSwweDNjLDB4MDIsMHg4MCwweDAxLDB4MzAsMHhhNSwweGZmLDB4ZmYsCisweDAwLDB4NjgsMHgxOCwweDIxLDB4MzQsMHhlNywweDAwLDB4MjAsMHgyNCwweDQyLDB4ODIsMHhlNCwweGFjLDB4ZTIsMHgwMCwweDAwLAorMHhhNCwweGM1LDB4MDAsMHgwMiwweGE0LDB4NjUsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweDg1LDB4MDAsMHgwMCwKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAzLDB4ODAsMHgwMSwweDM0LDB4NDIsMHgwMCwweDIwLDB4MjQsMHg2MywweDgzLDB4NDAsCisweGFjLDB4NDMsMHgwMCwweDAwLDB4OTAsMHg4MiwweDAwLDB4MTAsMHgzYywweDA4LDB4YjAsMHgwMywweDNjLDB4MDksMHhiMCwweDA2LAorMHgyNywweDg3LDB4OGYsMHhmMCwweDNjLDB4MGQsMHhiMCwweDA4LDB4MzQsMHgwZSwweGZmLDB4ZmYsMHgzNSwweDA4LDB4MDAsMHg2MiwKKzB4MDAsMHg4MCwweDMwLDB4MjEsMHgyNCwweDBjLDB4ZmYsMHhmZiwweDEwLDB4NDAsMHgwMCwweDJjLDB4MzUsMHgyOSwweDgwLDB4MjAsCisweDk3LDB4ODIsMHg4ZiwweGUwLDB4OTQsMHg4NSwweDAwLDB4MGMsMHgzYywweDBiLDB4YjAsMHgwMywweDAwLDB4MDIsMHgxOCwweGMwLAorMHgwMCwweDYyLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NywweDEwLDB4MjEsMHhhNCwweDQ1LDB4MDAsMHgwMCwKKzB4OTQsMHg4NCwweDAwLDB4MGUsMHgwMCwweDZkLDB4MTgsMHgyMSwweGFjLDB4NjUsMHgwMCwweDAwLDB4MDAsMHgwNCwweDEwLDB4YzAsCisweDAwLDB4NDQsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ3LDB4MTAsMHgyMSwweDk0LDB4NDUsMHgwMCwweDA0LAorMHgzYywweDBhLDB4NzcsMHg3NywweDM1LDB4NmIsMHgwMCwweGI0LDB4MDAsMHgwNSwweDEwLDB4YzAsMHgwMCwweDQ1LDB4MTgsMHgyMSwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY3LDB4MTgsMHgyMSwweDAwLDB4NGQsMHgxMCwweDIxLDB4YWMsMHg0ZSwweDAwLDB4MDAsCisweGE0LDB4NmUsMHgwMCwweDAwLDB4OTUsMHgwNCwweDAwLDB4MDAsMHg5MCwweGMzLDB4MDAsMHgxMCwweDI0LDB4MDIsMHgwMCwweGZmLAorMHgwMCwweDQ0LDB4MTAsMHgyMywweDAwLDB4NDMsMHgxMCwweDJhLDB4YTcsMHg4NSwweDhmLDB4ZTAsMHgxMCwweDQwLDB4MDAsMHgwNCwKKzB4MzUsMHg0YSwweDg4LDB4ODgsMHhhZCwweDZhLDB4MDAsMHgwMCwweDkwLDB4YzMsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NjMsMHgwMCwweGZmLDB4M2MsMHgwMiwweDAwLDB4NDAsMHgwMCwweDYyLDB4MTgsMHgyNSwweGFkLDB4MjMsMHgwMCwweDAwLAorMHhhNCwweGNjLDB4MDAsMHgwZSwweGE0LDB4Y2MsMHgwMCwweDBjLDB4YTAsMHhjMCwweDAwLDB4MTAsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDg0LDB4ZmYsMHhmZiwweDAwLDB4MDQsMHgxMCwweGMwLDB4MDAsMHg0NCwweDEwLDB4MjEsCisweDI3LDB4ODksMHg4ZiwweGYwLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ5LDB4MTAsMHgyMSwweDk3LDB4ODMsMHg4ZiwweGUwLAorMHg5NCwweDRhLDB4MDAsMHgwNCwweDNjLDB4MDIsMHhiMCwweDA4LDB4MDAsMHgwMywweDM4LDB4YzAsMHgwMCwweDBhLDB4NDAsMHhjMCwKKzB4MDAsMHhlMywweDE4LDB4MjEsMHgwMSwweDBhLDB4MjgsMHgyMSwweDAwLDB4ZTIsMHgzOCwweDIxLDB4MDEsMHgwMiwweDQwLDB4MjEsCisweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHgwNSwweDI4LDB4ODAsMHgzYywweDA2LDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAxLAorMHgwMCwweGE5LDB4MjgsMHgyMSwweDAwLDB4NjksMHgxOCwweDIxLDB4MzQsMHhjNiwweDAwLDB4MjAsMHgzNCwweDA5LDB4ZmYsMHhmZiwKKzB4MjQsMHg0MiwweDg0LDB4MzQsMHhhYywweGMyLDB4MDAsMHgwMCwweGE0LDB4NjQsMHgwMCwweDAwLDB4YWMsMHhlNCwweDAwLDB4MDAsCisweGE0LDB4YTksMHgwMCwweDAwLDB4YWQsMHgwOSwweDAwLDB4MDAsMHhhNywweDhhLDB4OGYsMHhlMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDEsMHgzNCwweDYzLDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweDg0LDB4YjQsMHgzYywweDA0LDB4YjAsMHgwMywweGFjLDB4NjIsMHgwMCwweDAwLDB4MzQsMHg4NCwweDAxLDB4MTAsCisweDhjLDB4ODIsMHgwMCwweDAwLDB4OTcsMHg4MywweDgxLDB4NjAsMHgzMCwweDQyLDB4ZmYsMHhmZiwweDEwLDB4NjIsMHgwMCwweDE2LAorMHgyNCwweDBhLDB4MDAsMHgwMSwweGE3LDB4ODIsMHg4MSwweDYwLDB4YWYsMHg4MCwweGI0LDB4NDAsMHgwMCwweDQwLDB4MjgsMHgyMSwKKzB4MjQsMHgwNiwweDAwLDB4MDEsMHgyNywweDg0LDB4YjQsMHg0NCwweDI1LDB4NDMsMHhmZiwweGZmLDB4MDAsMHg2NiwweDEwLDB4MDQsCisweDAwLDB4YTIsMHgxMCwweDI0LDB4MTQsMHg0MCwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4ODMsMHhmZiwweGZjLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NjYsMHgxMCwweDA0LDB4MDAsMHhhMiwweDEwLDB4MjQsMHgzOCwweDQyLDB4MDAsMHgwMCwKKzB4MDEsMHg0MiwweDE4LDB4MGEsMHgyNSwweDRhLDB4MDAsMHgwMSwweDJkLDB4NDIsMHgwMCwweDE0LDB4YWMsMHg4MywweDAwLDB4MDAsCisweDE0LDB4NDAsMHhmZiwweGYxLDB4MjQsMHg4NCwweDAwLDB4MDQsMHgzYywweDBiLDB4YjAsMHgwMywweDAwLDB4MDAsMHg1MCwweDIxLAorMHgzYywweDBjLDB4ODAsMHgwMCwweDI3LDB4ODksMHhiNCwweDkwLDB4MzUsMHg2YiwweDAxLDB4MjAsMHg4ZCwweDY4LDB4MDAsMHgwMCwKKzB4OGQsMHgyMywweDAwLDB4MDQsMHgwMSwweDBjLDB4MTAsMHgyNCwweDAwLDB4MDIsMHgxNywweGMyLDB4MTEsMHgwMywweDAwLDB4MzcsCisweGExLDB4MjIsMHgwMCwweGRjLDB4YTEsMHgyMCwweDAwLDB4ZDUsMHhhMSwweDIwLDB4MDAsMHhkNiwweDAxLDB4MjAsMHgzMCwweDIxLAorMHgwMCwweDAwLDB4MzgsMHgyMSwweDAwLDB4MDAsMHgyOCwweDIxLDB4MDEsMHgyMCwweDIwLDB4MjEsMHgwMCwweGE4LDB4MTAsMHgwNiwKKzB4MzAsMHg0MiwweDAwLDB4MDEsMHgxMCwweGUwLDB4MDAsMHgxMCwweGEwLDB4ODIsMHgwMCwweDBhLDB4OTAsMHg4MiwweDAwLDB4MDcsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MzEsMHgyNCwweGEyLDB4ZmYsMHhmZiwweGEwLDB4ODIsMHgwMCwweDA4LAorMHg5MCwweDgyLDB4MDAsMHgwYSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MDksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OTAsMHg4MywweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgxMCwweDQwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDAwLDB4NDYsMHgxMCwweDIxLDB4YTAsMHg0NSwweDAwLDB4MDksMHg5MCwweDgyLDB4MDAsMHgwYSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMCwweDQwLDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHhlMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4YTAsMHhjNSwweDAwLDB4ZDUsMHgyNCwweDA3LDB4MDAsMHgwMSwweGEwLDB4ODUsMHgwMCwweDA4LDB4YTAsMHhjNSwweDAwLDB4ZDYsCisweDI0LDB4YTUsMHgwMCwweDAxLDB4MmMsMHhhMiwweDAwLDB4MWMsMHgxNCwweDQwLDB4ZmYsMHhlMCwweDI0LDB4ODQsMHgwMCwweDAzLAorMHg5MCwweGM0LDB4MDAsMHhkNSwweDAwLDB4MDAsMHgyOCwweDIxLDB4MDAsMHhhNCwweDEwLDB4MmIsMHgxMCwweDQwLDB4MDAsMHgwYiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGMwLDB4MTgsMHgyMSwweGEwLDB4NjQsMHgwMCwweDA4LDB4OTAsMHhjMiwweDAwLDB4ZDUsCisweDI0LDB4YTUsMHgwMCwweDAxLDB4YTAsMHg2MiwweDAwLDB4MDksMHg5MCwweGM0LDB4MDAsMHhkNSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweGE0LDB4MTAsMHgyYiwweDE0LDB4NDAsMHhmZiwweGY4LDB4MjQsMHg2MywweDAwLDB4MDMsMHgyNSwweDRhLDB4MDAsMHgwMSwKKzB4MmQsMHg0MiwweDAwLDB4MDgsMHhhZCwweDI4LDB4MDAsMHgwNCwweDI1LDB4NmIsMHgwMCwweDA0LDB4MTQsMHg0MCwweGZmLDB4YmYsCisweDI1LDB4MjksMHgwMCwweGVjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkwLDB4ODIsMHgwMCwweDA1LAorMHgwOCwweDAwLDB4MjEsMHg2OCwweGEwLDB4ODIsMHgwMCwweDA4LDB4OTcsMHg4NSwweDhiLDB4NmEsMHgzYywweDAzLDB4YjAsMHgwMywKKzB4M2MsMHgwMiwweDgwLDB4MDEsMHgyNywweGJkLDB4ZmYsMHhlOCwweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDg2LDB4NjgsCisweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MTQsMHhhYywweDYyLDB4MDAsMHgwMCwweDMwLDB4OTAsMHgwMCwweGZmLAorMHgwMCwweDA1LDB4MjgsMHg0MiwweDAwLDB4MDAsMHg0OCwweDIxLDB4MjcsMHg4ZiwweGI0LDB4OTQsMHgwMCwweDAwLDB4NTAsMHgyMSwKKzB4MDAsMHgwMCwweDU4LDB4MjEsMHgyNywweDk4LDB4YjUsMHg3NCwweDI3LDB4OTksMHhiNSwweDcwLDB4MjcsMHg4ZSwweGI1LDB4NmUsCisweDI3LDB4OGMsMHhiNCwweDk4LDB4MjcsMHg4ZCwweGI0LDB4ZjAsMHgyNywweDg4LDB4YjUsMHg2OCwweDAwLDB4MGEsMHgxOCwweDgwLAorMHgwMSwweDZmLDB4MTAsMHgyMSwweGFjLDB4NDAsMHgwMCwweDAwLDB4YWMsMHg0NSwweDAwLDB4NTgsMHgwMCwweDZlLDB4MjAsMHgyMSwKKzB4MDAsMHg3OCwweDEwLDB4MjEsMHhhMSwweDAwLDB4ZmYsMHhmYywweGFkLDB4MDAsMHgwMCwweDAwLDB4YTEsMHgwMCwweDAwLDB4MDQsCisweGExLDB4MDAsMHgwMCwweDA1LDB4YWQsMHgwMCwweGZmLDB4ZjgsMHgwMCwweDc5LDB4MTgsMHgyMSwweDI0LDB4MDYsMHgwMCwweDAxLAorMHgyNCwweGM2LDB4ZmYsMHhmZiwweGEwLDB4ODAsMHgwMCwweDAwLDB4YTQsMHg2MCwweDAwLDB4MDAsMHhhYywweDQwLDB4MDAsMHgwMCwKKzB4MjQsMHg2MywweDAwLDB4MDIsMHgyNCwweDQyLDB4MDAsMHgwNCwweDA0LDB4YzEsMHhmZiwweGY5LDB4MjQsMHg4NCwweDAwLDB4MDEsCisweDAwLDB4MGEsMHgxMCwweDgwLDB4MDAsMHg0ZCwweDIwLDB4MjEsMHgwMCwweDAwLDB4MzAsMHgyMSwweDAwLDB4NGMsMHgxOCwweDIxLAorMHgyNywweDg3LDB4ODEsMHg2NCwweDhjLDB4ZTIsMHgwMCwweDAwLDB4MjQsMHhlNywweDAwLDB4MDQsMHhhYywweDgyLDB4MDAsMHgwMCwKKzB4YTAsMHg2NiwweDAwLDB4MDAsMHhhMCwweDY2LDB4MDAsMHgwMSwweDI0LDB4YzYsMHgwMCwweDAxLDB4MjgsMHhjMiwweDAwLDB4MWMsCisweGEwLDB4NjAsMHgwMCwweDAyLDB4MjQsMHg4NCwweDAwLDB4MDQsMHgxNCwweDQwLDB4ZmYsMHhmNiwweDI0LDB4NjMsMHgwMCwweDAzLAorMHgyNSwweDI5LDB4MDAsMHgwMSwweDI5LDB4MjIsMHgwMCwweDA4LDB4MjUsMHg0YSwweDAwLDB4M2IsMHgyNSwweDA4LDB4MDAsMHhlYywKKzB4MTQsMHg0MCwweGZmLDB4ZDYsMHgyNSwweDZiLDB4MDAsMHhlYywweGE3LDB4ODAsMHg4MSwweDYwLDB4MDAsMHgwMCwweDQ4LDB4MjEsCisweDI3LDB4ODMsMHhiNCwweDQwLDB4YWMsMHg2OSwweDAwLDB4MDAsMHgyNSwweDI5LDB4MDAsMHgwMSwweDI5LDB4MjIsMHgwMCwweDBjLAorMHgxNCwweDQwLDB4ZmYsMHhmYywweDI0LDB4NjMsMHgwMCwweDA0LDB4MGMsMHgwMCwweDIxLDB4MmQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MmUsMHgwNCwweDAwLDB4MTQsMHgyNywweDgzLDB4YjQsMHg5MCwweDI0LDB4MDksMHgwMCwweDA3LDB4MTAsMHg4MCwweDAwLDB4MGEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHg2MiwweDAwLDB4ZDUsMHgyNSwweDI5LDB4ZmYsMHhmZiwweGEwLDB4NjIsMHgwMCwweDAwLAorMHgwNSwweDIxLDB4ZmYsMHhmYSwweDI0LDB4NjMsMHgwMCwweGVjLDB4OGYsMHhiZiwweDAwLDB4MTQsMHg4ZiwweGIwLDB4MDAsMHgxMCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxOCwweDkwLDB4NjIsMHgwMCwweGQ2LDB4MDgsMHgwMCwweDIxLDB4ZWIsCisweDI1LDB4MjksMHhmZiwweGZmLDB4MzAsMHg4NCwweDAwLDB4ZmYsMHgwMCwweDA0LDB4MTEsMHgwMCwweDAwLDB4NDQsMHgxMCwweDIzLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDQsMHgxMCwweDIzLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNywweDgzLDB4YjQsMHg5MCwKKzB4MDAsMHg0MywweDYwLDB4MjEsMHgzYywweDA0LDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAxLDB4MzQsMHg4NCwweDAwLDB4MjAsCisweDI0LDB4NDIsMHg4NywweGQ0LDB4MzAsMHhjNiwweDAwLDB4ZmYsMHg5MywweGE5LDB4MDAsMHgxMywweDMwLDB4YTUsMHgwMCwweGZmLAorMHgzMCwweGU3LDB4MDAsMHhmZiwweGFjLDB4ODIsMHgwMCwweDAwLDB4MTAsMHhjMCwweDAwLDB4ZWIsMHgyNSwweDhmLDB4MDAsMHhkMCwKKzB4OTEsMHg4MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHhmZiwweGZjLDB4MmMsMHg0MywweDAwLDB4MTgsCisweDEwLDB4NjAsMHgwMCwweGNmLDB4M2MsMHgwMywweDgwLDB4MDEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDI0LDB4NjMsMHgwMiwweDVjLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgwLDB4MDAsMHgwOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDIyLDB4MDAsMHgyZCwweDEwLDB4NDAsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4YTAsMHgwMCwweDBmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHgwMCwweDA5LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHhmZiwweGQwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGFkLDB4ODIsMHgwMCwweGQwLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjIsMHgyMywweDI0LDB4NDIsMHhmZiwweGUwLAorMHg4ZCwweDgyLDB4MDAsMHhkMCwweDA4LDB4MDAsMHgyMiwweDIzLDB4MjQsMHg0MiwweDAwLDB4MDEsMHgxMCwweGEwLDB4MDAsMHgwZiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweGY5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAzLAorMHgxNCwweGEyLDB4ZmYsMHhmMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjIsMHgyMywKKzB4MjQsMHg0MiwweGZmLDB4ZTgsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGQsMHg4MiwweDAwLDB4ZDAsCisweDA4LDB4MDAsMHgyMiwweDIzLDB4MjQsMHg0MiwweDAwLDB4MDIsMHgxMCwweGEwLDB4ZmYsMHhmYywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweGU2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTAsMHhhMiwweGZmLDB4ZjQsMHgyNCwweDAyLDB4MDAsMHgwMywweDE0LDB4YTIsMHhmZiwweGVmLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhkLDB4ODIsMHgwMCwweGQwLDB4MDgsMHgwMCwweDIyLDB4MjMsMHgyNCwweDQyLDB4ZmYsMHhmOCwweDJkLDB4MjIsMHgwMCwweDE5LAorMHgxNCwweDQwLDB4ZmYsMHhkZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhhMCwweGZmLDB4ZWMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGEyLDB4ZmYsMHhkNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDEwLDB4YTIsMHhmZiwweGU0LDB4MjQsMHgwMiwweDAwLDB4MDMsMHgxMCwweGEyLDB4ZmYsMHhmMSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4ZCwweDgyLDB4MDAsMHhkMCwweDA4LDB4MDAsMHgyMiwweDIzLDB4MjQsMHg0MiwweGZmLDB4ZjAsMHgyZCwweDIyLDB4MDAsMHgxYiwKKzB4MTAsMHg0MCwweGZmLDB4ZjEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweGRjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4YzYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLAorMHgxNCwweGEyLDB4ZmYsMHhjZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjIsMHgyMywKKzB4MjQsMHg0MiwweGZmLDB4ZjQsMHgyZCwweDIyLDB4MDAsMHgxZSwweDEwLDB4NDAsMHhmZiwweGUzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4YTAsMHhmZiwweGNlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweGM5LAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweGQ2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjIsMHgzNCwKKzB4MjQsMHgwMiwweDAwLDB4MDMsMHgyZCwweDIyLDB4MDAsMHgyMywweDEwLDB4NDAsMHhmZiwweGQ3LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4YTAsMHhmZiwweGFmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweGJkLAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweGRhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMywKKzB4MTQsMHhhMiwweGZmLDB4OWYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMiwweDI1LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDJkLDB4MjIsMHgwMCwweDI1LDB4MTAsMHg0MCwweGZmLDB4YzgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweGEwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4ZmYsMHg5NywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDIyLDB4ODAsCisweDI0LDB4MDIsMHgwMCwweDAzLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjIsMHgyMywweDI0LDB4NDIsMHhmZiwweGZjLAorMHgyZCwweDIyLDB4MDAsMHgxNiwweDE0LDB4NDAsMHgwMCwweDBlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweGEwLDB4ZmYsMHhhMywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDhkLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4OWIsMHgyNCwweDAyLDB4MDAsMHgwMywweDE0LDB4YTIsMHhmZiwweGE4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhkLDB4ODIsMHgwMCwweGQwLDB4MDgsMHgwMCwweDIyLDB4MjMsMHgyNCwweDQyLDB4ZmYsMHhmYSwKKzB4MTAsMHhhMCwweGZmLDB4OTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4ODAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4ZmYsMHg4ZSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MjIsMHg0OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MmQsMHgyMiwweDAwLDB4MTcsMHgxNCwweDQwLDB4ZmYsMHg5ZSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjIsMHg5NywweDAwLDB4MDAsMHgwMCwweDAwLDB4MmQsMHgyMiwweDAwLDB4MTksCisweDEwLDB4NDAsMHhmZiwweGUyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweGEwLDB4ZmYsMHg4NCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDZlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTAsMHhhMiwweGZmLDB4N2MsMHgyNCwweDAyLDB4MDAsMHgwMywweDEwLDB4YTIsMHhmZiwweDg5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyMiwweDI1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjIsMHhiNCwweDJkLDB4MjIsMHgwMCwweDFiLAorMHgyZCwweDIyLDB4MDAsMHgxZSwweDEwLDB4NDAsMHhmZiwweGRlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweGEwLDB4ZmYsMHg3MywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDVkLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4NmIsMHgyNCwweDAyLDB4MDAsMHgwMywweDEwLDB4YTIsMHhmZiwweDg4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMiwweDI1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDIyLDB4MDAsMHgyMywKKzB4MTQsMHg0MCwweGZmLDB4ZjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMiwweDRlLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyMiwweDRjLDB4MmQsMHgyMiwweDAwLDB4MjUsMHgwOCwweDAwLDB4MjIsMHg4NSwweDJkLDB4MjIsMHgwMCwweDI3LAorMHgxMCwweGEwLDB4ZmYsMHg1ZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGEyLDB4ZmYsMHg0OCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweDU2LDB4MjQsMHgwMiwweDAwLDB4MDMsCisweDE0LDB4YTIsMHhmZiwweDYzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjIsMHg5MSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyZCwweDIyLDB4MDAsMHgyNywweDE0LDB4NDAsMHhmZiwweDhlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjIsMHgzZSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDIyLDB4MDAsMHgyOSwweDE0LDB4NDAsMHhmZiwweDg5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyMiwweDJiLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MSwweDg2LDB4MDAsMHgwMCwweDkxLDB4ODMsMHgwMCwweGQ0LAorMHgyNSwweDhkLDB4MDAsMHg1YywweDMwLDB4YzQsMHgwMCwweGZmLDB4MDAsMHgwNCwweDEwLDB4NDAsMHgwMCwweDQ0LDB4MTAsMHgyMSwKKzB4MDAsMHgwNCwweDUwLDB4ODAsMHgwMSwweDgyLDB4NTgsMHgyMSwweDAxLDB4OGEsMHg0MCwweDIxLDB4MjUsMHg3OCwweDAwLDB4MDgsCisweDEwLDB4NjAsMHgwMCwweDM3LDB4MjUsMHgwZSwweDAwLDB4NjAsMHgyYywweGEyLDB4MDAsMHgwMywweDE0LDB4NDAsMHgwMCwweDI1LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDkxLDB4ODIsMHgwMCwweGRkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgxZSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg3LDB4ODEsMHg2NCwweDAxLDB4NDcsMHgxMCwweDIxLDB4OGMsMHg0MywweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4YWQsMHgwMywweDAwLDB4NjAsMHg5MSwweDYyLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDQwLDB4MzAsMHgyMSwweGExLDB4ODIsMHgwMCwweDAwLDB4MzAsMHhjMiwweDAwLDB4ZmYsMHgwMCwweDAyLDB4MTAsMHg4MCwKKzB4MDAsMHg0NywweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweDE4LDB4NDIsCisweGFkLDB4YTMsMHgwMCwweDAwLDB4OTEsMHg4NCwweDAwLDB4MDAsMHg4ZCwweGM1LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgyMCwweDgwLAorMHgwMCwweDg3LDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwNSwweDI4LDB4NDAsMHgwMCwweDhjLDB4MjAsMHgyMSwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweGEzLDB4MTAsMHgyYiwweDAwLDB4NjIsMHgyOCwweDBhLDB4YWMsMHg4NSwweDAwLDB4NjAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4YTEsMHg4MCwweDAwLDB4ZDQsMHgyNywweDg3LDB4ODEsMHg2NCwweDA4LDB4MDAsMHgyMywweDBlLAorMHhhMSwweDgwLDB4MDAsMHhkZCwweDI3LDB4ODIsMHg4MSwweGQ0LDB4OGQsMHg4MywweDAwLDB4ZDgsMHgwMCwweDgyLDB4MTAsMHgyMSwKKzB4OTAsMHg0NCwweDAwLDB4MDAsMHgyNCwweDYzLDB4MDAsMHgwMSwweDAwLDB4NjQsMHgyMCwweDJiLDB4MTQsMHg4MCwweGZmLDB4MGQsCisweGFkLDB4ODMsMHgwMCwweGQ4LDB4OGQsMHgwMiwweDAwLDB4NjAsMHhhMSwweDgwLDB4MDAsMHhkNCwweDAwLDB4MDIsMHgxZiwweGMyLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDQzLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhZCwweDgyLDB4MDAsMHg1YywKKzB4MTAsMHhlMCwweDAwLDB4MWEsMHgyNCwweDgzLDB4ZmYsMHhmYywweDJjLDB4NjIsMHgwMCwweDE4LDB4MTAsMHg0MCwweDAxLDB4MTgsCisweDAwLDB4MDMsMHgxMCwweDgwLDB4M2MsMHgwMywweDgwLDB4MDEsMHgyNCwweDYzLDB4MDIsMHhiYywweDAwLDB4NDMsMHgxMCwweDIxLAorMHg4YywweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MmQsMHgyMiwweDAwLDB4MmQsMHgxMCwweDQwLDB4MDAsMHg1ZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhhMCwweDAwLDB4NWEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGEyLDB4MDAsMHg1NCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHgwMCwweDUxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZCwweDgyLDB4MDAsMHhkMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDQyLDB4ZmYsMHhkMCwweGFkLDB4ODIsMHgwMCwweGQwLDB4OGQsMHhlMywweDAwLDB4MDAsCisweDhkLDB4YTIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyMSwweGFkLDB4YTIsMHgwMCwweDAwLAorMHhhZCwweGUwLDB4MDAsMHgwMCwweDhkLDB4YTMsMHgwMCwweDAwLDB4OGQsMHhjNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHg4MywweDEwLDB4MmEsMHgxMCwweDQwLDB4MDAsMHgyMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTMsMHgwNSwweDAwLDB4MDEsCisweDkxLDB4ODIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQ1LDB4MDAsMHgwNSwweDI0LDB4MDIsMHgwMCwweDAxLAorMHhhMSwweDg1LDB4MDAsMHgwMCwweGExLDB4ODIsMHgwMCwweGQ0LDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhZCwweDgwLDB4MDAsMHhkOCwKKzB4OTEsMHg4MiwweDAwLDB4ZGQsMHgyNCwweDAzLDB4MDAsMHgwMSwweDEwLDB4NDMsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweGExLDB4ODMsMHgwMCwweGQ0LDB4YWQsMHg4MCwweDAwLDB4ZDgsMHgwMywweGUwLDB4MDAsMHgwOCwweGExLDB4ODMsMHgwMCwweGRkLAorMHgwMCwweDA0LDB4MTcsMHhjMiwweDAwLDB4ODIsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4NDMsMHhhZCwweGEyLDB4MDAsMHgwMCwKKzB4OTEsMHg4MywweDAwLDB4MDAsMHgyNywweDgyLDB4ODEsMHg2NCwweDhkLDB4YzUsMHgwMCwweDAwLDB4MDAsMHgwMywweDE4LDB4ODAsCisweDAwLDB4NjIsMHgxOCwweDIxLDB4OGMsMHg2NCwweDAwLDB4MDAsMHgwMCwweDA1LDB4MjgsMHg0MCwweDAwLDB4MDQsMHgxOCwweDgwLAorMHgwMCwweGEzLDB4MTAsMHgyYiwweDAwLDB4NjIsMHgyOCwweDBhLDB4MDgsMHgwMCwweDIzLDB4MjAsMHhhZCwweGM1LDB4MDAsMHgwMCwKKzB4OTcsMHg4MiwweDhiLDB4NmMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NjIsMHgxMCwweDJhLDB4MTAsMHg0MCwweGZlLDB4YjksCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTEsMHg4MiwweDAwLDB4ZGQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDE1LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDkxLDB4ODMsMHgwMCwweDAwLDB4MjcsMHg4MiwweDgxLDB4NjQsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MDAsMHg2MiwweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgwMCwweDAwLDB4NmMsMHgxOCwweDIxLDB4YWMsMHg2NCwweDAwLDB4NjAsCisweDkzLDB4MDUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA1LDB4MTAsMHg4MCwweDAxLDB4ODIsMHgxMCwweDIxLAorMHgyNCwweDRlLDB4MDAsMHg2MCwweGExLDB4ODUsMHgwMCwweDAwLDB4OGQsMHhjMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMiwweDFmLDB4YzIsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDQzLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGFkLDB4YTIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDIzLDB4OTIsMHhhMSwweDgwLDB4MDAsMHhkZCwweDhkLDB4ODIsMHgwMCwweGQwLAorMHgwOCwweDAwLDB4MjMsMHg0ZSwweDI0LDB4NDIsMHhmZiwweGUwLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjMsMHg0ZSwKKzB4MjQsMHg0MiwweDAwLDB4MDEsMHgxMCwweGEwLDB4MDAsMHgwZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDEwLDB4YTIsMHhmZiwweGY5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweGE3LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTQsMHhhMiwweGZmLDB4ZjAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjMsMHg0ZSwweDI0LDB4NDIsMHhmZiwweGU4LDB4OGQsMHg4MiwweDAwLDB4ZDAsCisweDA4LDB4MDAsMHgyMywweDRlLDB4MjQsMHg0MiwweDAwLDB4MDIsMHgxMCwweGEwLDB4ZmYsMHhmYywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweGU4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTAsMHhhMiwweGZmLDB4OTYsMHgyNCwweDAyLDB4MDAsMHgwMywweDE0LDB4YTIsMHhmZiwweGYxLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhkLDB4ODIsMHgwMCwweGQwLDB4MDgsMHgwMCwweDIzLDB4NGUsMHgyNCwweDQyLDB4ZmYsMHhmOCwweDJkLDB4MjIsMHgwMCwweDE5LAorMHgxNCwweDQwLDB4ZmYsMHhlMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhhMCwweGZmLDB4ZWMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGEyLDB4ZmYsMHhkOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDEwLDB4YTIsMHhmZiwweDg2LDB4MjQsMHgwMiwweDAwLDB4MDMsMHgxMCwweGEyLDB4ZmYsMHhmMSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4ZCwweDgyLDB4MDAsMHhkMCwweDA4LDB4MDAsMHgyMywweDRlLDB4MjQsMHg0MiwweGZmLDB4ZjAsMHgyZCwweDIyLDB4MDAsMHgxYiwKKzB4MTAsMHg0MCwweGZmLDB4ZjEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweGRjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4YzgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLAorMHgxNCwweGEyLDB4ZmYsMHhkMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjMsMHg0ZSwKKzB4MjQsMHg0MiwweGZmLDB4ZjQsMHgyZCwweDIyLDB4MDAsMHgxZSwweDEwLDB4NDAsMHhmZiwweGUzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4YTAsMHhmZiwweGNlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDZiLAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweGQ2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjMsMHhhYSwKKzB4MjQsMHgwMiwweDAwLDB4MDMsMHgyZCwweDIyLDB4MDAsMHgyMywweDEwLDB4NDAsMHhmZiwweGQ3LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4YTAsMHhmZiwweGIxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDVmLAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweGRhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMywKKzB4MTQsMHhhMiwweGZmLDB4NTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMywweDliLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDJkLDB4MjIsMHgwMCwweDI1LDB4MTAsMHg0MCwweGZmLDB4YzgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweGEyLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4ZmYsMHg5OSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDIzLDB4ZjQsCisweDI0LDB4MDIsMHgwMCwweDAzLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjMsMHg0ZSwweDI0LDB4NDIsMHhmZiwweGZjLAorMHgyZCwweDIyLDB4MDAsMHgxNiwweDE0LDB4NDAsMHgwMCwweDBlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweGEwLDB4ZmYsMHhhMywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDhmLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4M2QsMHgyNCwweDAyLDB4MDAsMHgwMywweDE0LDB4YTIsMHhmZiwweGE4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhkLDB4ODIsMHgwMCwweGQwLDB4MDgsMHgwMCwweDIzLDB4NGUsMHgyNCwweDQyLDB4ZmYsMHhmYSwKKzB4MTAsMHhhMCwweGZmLDB4OTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4ODIsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4ZmYsMHgzMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MjMsMHhiYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MmQsMHgyMiwweDAwLDB4MTcsMHgxNCwweDQwLDB4ZmYsMHg5ZSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjQsMHgwYiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MmQsMHgyMiwweDAwLDB4MTksCisweDEwLDB4NDAsMHhmZiwweGUyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweGEwLDB4ZmYsMHg4NCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDcwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTAsMHhhMiwweGZmLDB4MWUsMHgyNCwweDAyLDB4MDAsMHgwMywweDEwLDB4YTIsMHhmZiwweDg5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyMywweDliLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjQsMHgyOCwweDJkLDB4MjIsMHgwMCwweDFiLAorMHgyZCwweDIyLDB4MDAsMHgxZSwweDEwLDB4NDAsMHhmZiwweGRlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweGEwLDB4ZmYsMHg3MywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDVmLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4MGQsMHgyNCwweDAyLDB4MDAsMHgwMywweDEwLDB4YTIsMHhmZiwweDg4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMywweDliLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDIyLDB4MDAsMHgyMywKKzB4MTQsMHg0MCwweGZmLDB4ZjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMywweGMyLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyMywweGMwLDB4MmQsMHgyMiwweDAwLDB4MjUsMHgwOCwweDAwLDB4MjMsMHhmOSwweDJkLDB4MjIsMHgwMCwweDI3LAorMHgxMCwweGEwLDB4ZmYsMHg1ZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGEyLDB4ZmYsMHg0YSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZSwweGY4LDB4MjQsMHgwMiwweDAwLDB4MDMsCisweDE0LDB4YTIsMHhmZiwweDYzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjQsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyZCwweDIyLDB4MDAsMHgyNywweDE0LDB4NDAsMHhmZiwweDhlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjMsMHhiMiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDIyLDB4MDAsMHgyOSwweDE0LDB4NDAsMHhmZiwweDg5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyMywweGExLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHhlOCwweDNjLDB4MDIsMHhiMCwweDAzLAorMHhhZiwweGJmLDB4MDAsMHgxNCwweGFmLDB4YjAsMHgwMCwweDEwLDB4MzQsMHg0MiwweDAxLDB4MTgsMHgzYywweDAzLDB4YjAsMHgwMywKKzB4OGMsMHg1MCwweDAwLDB4MDAsMHgzNCwweDYzLDB4MDEsMHgyYywweDkwLDB4NjIsMHgwMCwweDAwLDB4MzIsMHgwNSwweDAwLDB4MDEsCisweGEzLDB4ODIsMHg4MCwweDEwLDB4MTQsMHhhMCwweDAwLDB4MTQsMHgzMCwweDQ0LDB4MDAsMHhmZiwweDMyLDB4MDIsMHgwMSwweDAwLAorMHgxNCwweDQwLDB4MDAsMHgwOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzIsMHgwMiwweDA4LDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwMiwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHhhMywweDgyLDB4YmMsMHgwOCwweDhmLDB4YmYsMHgwMCwweDE0LDB4OGYsMHhiMCwweDAwLDB4MTAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsMHgwYywweDAwLDB4MDUsMHgzOSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNiwweDAyLDB4ZmYsMHgwMCwweGEzLDB4ODAsMHhiYywweDA4LDB4M2MsMHgwMSwweGIwLDB4MDMsMHhhYywweDIyLDB4MDEsMHgxOCwKKzB4MDgsMHgwMCwweDI0LDB4NzcsMHgzMiwweDAyLDB4MDgsMHgwMCwweDBjLDB4MDAsMHgyMSwweDlhLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI2LDB4MDIsMHhmZiwweGZmLDB4M2MsMHgwMSwweGIwLDB4MDMsMHhhYywweDIyLDB4MDEsMHgxOCwweDA4LDB4MDAsMHgyNCwweDc0LAorMHgzMiwweDAyLDB4MDEsMHgwMCwweDI3LDB4YmQsMHhmZiwweGUwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDAsMHhkMCwKKzB4YWYsMHhiZiwweDAwLDB4MTgsMHg4YywweDQzLDB4MDAsMHgwMCwweDNjLDB4MDIsMHgwMCwweDQwLDB4MjQsMHgwNywweDBmLDB4ZmYsCisweDAwLDB4MDMsMHgzMywweDAyLDB4MDAsMHgwMywweDJkLDB4MDIsMHgwMCwweDAzLDB4NDMsMHgwMiwweDMwLDB4NjksMHgwZiwweGZmLAorMHgwMCwweDYyLDB4MTgsMHgyNCwweDMwLDB4YTUsMHgwMCwweDAzLDB4MzAsMHhjNiwweDAwLDB4ZmYsMHgxMCwweDYwLDB4MDAsMHgwOCwKKzB4MzEsMHgwOCwweDAwLDB4ZmYsMHgwMSwweDAwLDB4MzAsMHgyMSwweDBjLDB4MDAsMHgyNSwweDM4LDB4YWYsMHhhOSwweDAwLDB4MTAsCisweDhmLDB4YmYsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDIwLAorMHgwYywweDAwLDB4MjUsMHg4YSwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzNCwweDYzLDB4MDAsMHhkNCwKKzB4MDgsMHgwMCwweDI0LDB4YTAsMHhhYywweDYyLDB4MDAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGMwLDB4YWYsMHhiNiwweDAwLDB4MzAsCisweGFmLDB4YjMsMHgwMCwweDI0LDB4YWYsMHhiMSwweDAwLDB4MWMsMHhhZiwweGIwLDB4MDAsMHgxOCwweGFmLDB4YmYsMHgwMCwweDNjLAorMHhhZiwweGJlLDB4MDAsMHgzOCwweGFmLDB4YjcsMHgwMCwweDM0LDB4YWYsMHhiNSwweDAwLDB4MmMsMHhhZiwweGI0LDB4MDAsMHgyOCwKKzB4YWYsMHhiMiwweDAwLDB4MjAsMHgwYywweDAwLDB4MTcsMHhjOCwweDAwLDB4ODAsMHg4MCwweDIxLDB4MDAsMHgwMCwweGIwLDB4MjEsCisweDAwLDB4MDAsMHg4OCwweDIxLDB4MTAsMHg0MCwweDAwLDB4MTIsMHgwMCwweDAwLDB4OTgsMHgyMSwweDNjLDB4MDIsMHhiMCwweDAzLAorMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDQsMHhiMCwweDAzLDB4MjQsMHgwNSwweDAwLDB4MDEsMHgzNCwweDQyLDB4MDAsMHhiYywKKzB4MzQsMHg2MywweDAwLDB4YmIsMHgzNCwweDg0LDB4MDAsMHhiYSwweGE0LDB4NDAsMHgwMCwweDAwLDB4YTAsMHg2NSwweDAwLDB4MDAsCisweGEwLDB4ODUsMHgwMCwweDAwLDB4N2IsMHhiZSwweDAxLDB4ZmMsMHg3YiwweGI2LDB4MDEsMHhiYywweDdiLDB4YjQsMHgwMSwweDdjLAorMHg3YiwweGIyLDB4MDEsMHgzYywweDdiLDB4YjAsMHgwMCwweGZjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHg0MCwKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDEsMHg0NywweDkwLDB4NDQsMHgwMCwweDAwLDB4MDAsMHgxMCwweDFhLDB4MDIsCisweDNjLDB4MTUsMHhmZCwweGZmLDB4MzAsMHg4NCwweDAwLDB4ZmYsMHhhMCwweDUwLDB4MDAsMHgwMCwweDMwLDB4NzQsMHgwMCwweDBmLAorMHhhZiwweGE0LDB4MDAsMHgxMCwweDAwLDB4MDAsMHg5MCwweDIxLDB4M2MsMHgxNywweDAyLDB4MDAsMHgzNiwweGI1LDB4ZmYsMHhmZiwKKzB4M2MsMHgxZSwweGIwLDB4MDMsMHgwYywweDAwLDB4MDYsMHhjZSwweDI0LDB4MDQsMHgwNCwweDAwLDB4MDAsMHg1NywweDEwLDB4MjUsCisweDAwLDB4NDAsMHgyOCwweDIxLDB4MGMsMHgwMCwweDA2LDB4YzEsMHgyNCwweDA0LDB4MDQsMHgwMCwweDAwLDB4MDAsMHg4MCwweDIxLAorMHgwYywweDAwLDB4MjYsMHg1MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjYsMHgwMywweDAwLDB4MDEsMHgzMCwweDcwLDB4MDAsMHhmZiwKKzB4MTAsMHg0MCwweDAwLDB4NDcsMHgyZSwweDAzLDB4MDAsMHgwMiwweDE0LDB4NjAsMHhmZiwweGY5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDBjLDB4MDAsMHgwNiwweGNlLDB4MjQsMHgwNCwweDA0LDB4MDAsMHgwMCwweDU1LDB4MTAsMHgyNCwweDAwLDB4NDAsMHgyOCwweDIxLAorMHgwYywweDAwLDB4MDYsMHhjMSwweDI0LDB4MDQsMHgwNCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMiwweDgyLDB4MDAsMHgzOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMiwweDgwLDB4MDAsMHgzNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzIsMHgyMiwweDAwLDB4NjAsCisweDMyLDB4MjMsMHgwYywweDAwLDB4MDAsMHgwMywweDFhLDB4MDIsMHgzYywweDA1LDB4MDAsMHg2MCwweDAwLDB4MDIsMHgxMSwweDQyLAorMHgwMiwweDI1LDB4MjAsMHgyNCwweDAwLDB4NDMsMHgxMCwweDI1LDB4M2MsMHgwMywweDA0LDB4MDAsMHgwMiwweDIzLDB4MjgsMHgyNCwKKzB4MDAsMHgwNCwweDI0LDB4NDIsMHgwMCwweDQ0LDB4MTAsMHgyNSwweDAwLDB4MDUsMHgyZCwweDAyLDB4MDAsMHg0NSwweDg4LDB4MjUsCisweDEyLDB4MjAsMHgwMCwweDA1LDB4MjYsMHg0MiwweDAwLDB4MDEsMHgyNiwweGMyLDB4MDAsMHgwMSwweDMwLDB4NTYsMHgwMCwweGZmLAorMHgwMiwweDcxLDB4OTgsMHgyMSwweDI2LDB4NDIsMHgwMCwweDAxLDB4MDIsMHg1ZSwweDIwLDB4MjEsMHgzMCwweDUyLDB4MDAsMHhmZiwKKzB4MmUsMHg0MywweDAwLDB4MDUsMHhhMCwweDkxLDB4MDAsMHhkOCwweDE0LDB4NjAsMHhmZiwweGNlLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDhmLDB4YTUsMHgwMCwweDEwLDB4MzQsMHg0MiwweDAxLDB4NDcsMHhhMCwweDQ1LDB4MDAsMHgwMCwweDEyLDB4NjAsMHgwMCwweDBlLAorMHgzYywweDAyLDB4YjAsMHgwMywweDEyLDB4YzAsMHgwMCwweDBkLDB4MzQsMHg0MiwweDAwLDB4YmMsMHgwMCwweDEzLDB4MTAsMHg0MCwKKzB4MDAsMHg1MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHhjMCwweDAwLDB4NTMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDk4LDB4ODAsCisweDAyLDB4NzYsMHgwMCwweDFiLDB4MTYsMHhjMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDcsMHgwMCwweDBkLAorMHgwMCwweDAwLDB4OTgsMHgxMiwweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAwLDB4YmMsMHgzYywweDAzLDB4YjAsMHgwMywKKzB4M2MsMHgwNCwweGIwLDB4MDMsMHhhNCwweDUzLDB4MDAsMHgwMCwweDM0LDB4NjMsMHgwMCwweGJiLDB4MzQsMHg4NCwweDAwLDB4YmEsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4YTAsMHg2MCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjQsMHhjNSwweGEwLDB4ODIsMHgwMCwweDAwLAorMHgwYywweDAwLDB4MDYsMHhjZSwweDI0LDB4MDQsMHgwNCwweGZjLDB4MDgsMHgwMCwweDI0LDB4ZjMsMHgwMCwweDQwLDB4ODgsMHgyMSwKKzB4M2MsMHgwMywweGIwLDB4MDMsMHgzNCwweDYzLDB4MDAsMHhiYywweDNjLDB4MDQsMHhiMCwweDAzLDB4M2MsMHgwNSwweGIwLDB4MDMsCisweGE0LDB4NjAsMHgwMCwweDAwLDB4MzQsMHg4NCwweDAwLDB4YmIsMHgzNCwweGE1LDB4MDAsMHhiYSwweDI0LDB4MDIsMHgwMCwweDAyLAorMHgyNCwweDAzLDB4MDAsMHgwMSwweGEwLDB4ODIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDI0LDB4YzUsMHhhMCwweGEzLDB4MDAsMHgwMCwKKzB4MjcsMHhiZCwweGZmLDB4ZDgsMHhhZiwweGIwLDB4MDAsMHgxMCwweDMwLDB4ZDAsMHgwMCwweGZmLDB4MmUsMHgwMiwweDAwLDB4MmUsCisweGFmLDB4YjIsMHgwMCwweDE4LDB4YWYsMHhiMSwweDAwLDB4MTQsMHhhZiwweGJmLDB4MDAsMHgyMCwweGFmLDB4YjMsMHgwMCwweDFjLAorMHgzMCwweGIxLDB4MDAsMHhmZiwweDE0LDB4NDAsMHgwMCwweDA2LDB4MDAsMHg4MCwweDkwLDB4MjEsMHg4ZiwweGJmLDB4MDAsMHgyMCwKKzB4N2IsMHhiMiwweDAwLDB4ZmMsMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjgsCisweDJlLDB4MTMsMHgwMCwweDEwLDB4MjQsMHgwNSwweDAwLDB4MTQsMHgwYywweDAwLDB4MTMsMHhhMCwweDI0LDB4MDYsMHgwMSwweDA3LAorMHgxMiwweDYwLDB4MDAsMHgzOCwweDAyLDB4MDAsMHgzMCwweDIxLDB4OGYsMHhhMiwweDAwLDB4MzgsMHgzMCwweGMzLDB4MDAsMHgzZiwKKzB4M2MsMHgwNCwweGIwLDB4MDksMHgwMCwweDAyLDB4MTQsMHgwMCwweDAwLDB4NDMsMHgzMCwweDI1LDB4MzQsMHg4NCwweDAxLDB4NjAsCisweDkwLDB4ODIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4ZmYsMHhmZCwweDI0LDB4MDIsMHgwMCwweDAxLAorMHgxMiwweDIyLDB4MDAsMHgyYSwweDJhLDB4MjIsMHgwMCwweDAyLDB4MTQsMHg0MCwweDAwLDB4MjQsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTIsMHgyMiwweDAwLDB4MjAsMHgyNCwweDAyLDB4MDAsMHgwMywweDEyLDB4MjIsMHgwMCwweDE5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE2LDB4NjAsMHhmZiwweGUyLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMiwweDIyLDB4MDAsMHgxMywweDJhLDB4MjIsMHgwMCwweDAyLAorMHgxNCwweDQwLDB4MDAsMHgwZCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTIsMHgyMiwweDAwLDB4MDksMHgyNCwweDAyLDB4MDAsMHgwMywKKzB4MTYsMHgyMiwweGZmLDB4ZGEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDQsMHgwOCwweDRjLDB4MjQsMHgwNSwweGZmLDB4ZmYsCisweDBjLDB4MDAsMHgxMywweDViLDB4M2MsMHgwNiwweDBjLDB4YjgsMHgwOCwweDAwLDB4MjUsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MjUsMHg2YiwweDI0LDB4MDQsMHgwOCwweDQ4LDB4MTYsMHgyMCwweGZmLDB4ZDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDI1LDB4NmIsMHgyNCwweDA0LDB4MDgsMHg0MCwweDA4LDB4MDAsMHgyNSwweDZiLDB4MjQsMHgwNCwweDA4LDB4NDQsCisweDI0LDB4MDQsMHgwOCwweDRjLDB4MGMsMHgwMCwweDEzLDB4NWIsMHgyNCwweDA1LDB4ZmYsMHhmZiwweDA4LDB4MDAsMHgyNSwweDYwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyNSwweDc5LDB4MjQsMHgwNCwweDA4LDB4NDgsMHgxNiwweDIwLDB4ZmYsMHhlMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjUsMHg3OSwweDI0LDB4MDQsMHgwOCwweDQwLDB4MDgsMHgwMCwweDI1LDB4NzksCisweDI0LDB4MDQsMHgwOCwweDQ0LDB4MDIsMHg0MCwweDIwLDB4MjEsMHgwYywweDAwLDB4MjUsMHhjYSwweDAyLDB4MjAsMHgyOCwweDIxLAorMHgwOCwweDAwLDB4MjUsMHg0ZSwweDAwLDB4NDAsMHgzMCwweDIxLDB4MjcsMHhiZCwweGZmLDB4ZDgsMHgyYywweGMyLDB4MDAsMHgyZSwKKzB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MjAsCisweGFmLDB4YjMsMHgwMCwweDFjLDB4MDAsMHhjMCwweDgwLDB4MjEsMHgzMCwweGIxLDB4MDAsMHhmZiwweDAwLDB4ODAsMHg5MCwweDIxLAorMHgxNCwweDQwLDB4MDAsMHgwNywweDAwLDB4MDAsMHgxOCwweDIxLDB4OGYsMHhiZiwweDAwLDB4MjAsMHg3YiwweGIyLDB4MDAsMHhmYywKKzB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMCwweDYwLDB4MTAsMHgyMSwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjgsCisweDJlLDB4MTMsMHgwMCwweDEwLDB4MjQsMHgwNSwweDAwLDB4MTQsMHgwYywweDAwLDB4MTMsMHhhMCwweDI0LDB4MDYsMHgwMSwweDA3LAorMHgxMiwweDYwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgzMCwweDIxLDB4M2MsMHgwMywweGIwLDB4MDksMHgzNCwweDYzLDB4MDEsMHg2MCwKKzB4OTAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHhmZiwweGZkLDB4MzAsMHhjNSwweDAwLDB4M2YsCisweDBjLDB4MDAsMHgyNiwweDA3LDB4MDIsMHgyMCwweDIwLDB4MjEsMHgxNiwweDYwLDB4MDAsMHgwYSwweDAwLDB4NDAsMHg4MCwweDIxLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDEyLDB4MjIsMHgwMCwweDE1LDB4MmEsMHgyMiwweDAwLDB4MDIsMHgxNCwweDQwLDB4MDAsMHgwZiwKKzB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMiwweDIyLDB4MDAsMHgwYiwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTIsMHgyMiwweDAwLDB4MDMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDI1LDB4OTYsMHgwMiwweDAwLDB4MTgsMHgyMSwweDI0LDB4MDQsMHgwOCwweDRjLAorMHgyNCwweDA1LDB4ZmYsMHhmZiwweDBjLDB4MDAsMHgxMywweDViLDB4M2MsMHgwNiwweDBjLDB4YjgsMHgwOCwweDAwLDB4MjUsMHg5NiwKKzB4MDIsMHgwMCwweDE4LDB4MjEsMHgwOCwweDAwLDB4MjUsMHhiOCwweDI0LDB4MDQsMHgwOCwweDQ4LDB4MTYsMHgyMCwweGZmLDB4ZjUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDI1LDB4YjgsMHgyNCwweDA0LDB4MDgsMHg0MCwweDA4LDB4MDAsMHgyNSwweGI4LAorMHgyNCwweDA0LDB4MDgsMHg0NCwweDAyLDB4NDAsMHgyMCwweDIxLDB4MGMsMHgwMCwweDI1LDB4Y2EsMHgwMiwweDIwLDB4MjgsMHgyMSwKKzB4MDgsMHgwMCwweDI1LDB4YTIsMHgwMCwweDQwLDB4MzAsMHgyMSwweDI3LDB4YmQsMHhmZiwweGU4LDB4MmMsMHhjMiwweDAwLDB4MWYsCisweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MTQsMHgwMCwweGMwLDB4ODAsMHgyMSwweDE0LDB4NDAsMHgwMCwweDFkLAorMHgzMCwweGE1LDB4MDAsMHhmZiwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweDAwLDB4MTgsMHgyOCwweGEyLDB4MDAsMHgwMiwKKzB4MTQsMHg0MCwweDAwLDB4MTIsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHgwMCwweDBlLDB4MjQsMHgwMiwweDAwLDB4MDMsCisweDEwLDB4YTIsMHgwMCwweDA3LDB4MjQsMHgwNCwweDA4LDB4NGMsMHgyNiwweDEwLDB4ZmYsMHhlMiwweDAyLDB4MDAsMHgxMCwweDIxLAorMHg4ZiwweGJmLDB4MDAsMHgxNCwweDhmLDB4YjAsMHgwMCwweDEwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxOCwKKzB4MjQsMHgwNSwweGZmLDB4ZmYsMHgwYywweDAwLDB4MTMsMHg1YiwweDNjLDB4MDYsMHgwZCwweGY4LDB4MDgsMHgwMCwweDI1LDB4ZGIsCisweDI2LDB4MTAsMHhmZiwweGUyLDB4MDgsMHgwMCwweDI1LDB4ZTAsMHgyNCwweDA0LDB4MDgsMHg0OCwweDE0LDB4YTAsMHhmZiwweGYyLAorMHgyNCwweDA0LDB4MDgsMHg0MCwweDA4LDB4MDAsMHgyNSwweGUxLDB4MjQsMHgwNSwweGZmLDB4ZmYsMHgwOCwweDAwLDB4MjUsMHhlMCwKKzB4MjQsMHgwNCwweDA4LDB4NDQsMHgyYywweGMyLDB4MDAsMHgxMCwweDE0LDB4NDAsMHhmZiwweGVjLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDEwLDB4YTIsMHgwMCwweDE0LDB4MjgsMHhhMiwweDAwLDB4MDIsMHgxNCwweDQwLDB4MDAsMHgwZSwweDI0LDB4MDIsMHgwMCwweDAyLAorMHgxMCwweGEyLDB4MDAsMHgwYSwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTAsMHhhMiwweDAwLDB4MDMsMHgyNCwweDA0LDB4MDgsMHg0YywKKzB4MDgsMHgwMCwweDI1LDB4ZGIsMHgyNiwweDEwLDB4ZmYsMHhmMSwweDI0LDB4MDUsMHhmZiwweGZmLDB4MGMsMHgwMCwweDEzLDB4NWIsCisweDNjLDB4MDYsMHgwZCwweGI4LDB4MDgsMHgwMCwweDI1LDB4ZGIsMHgyNiwweDEwLDB4ZmYsMHhmMSwweDA4LDB4MDAsMHgyNSwweGZhLAorMHgyNCwweDA0LDB4MDgsMHg0OCwweDE0LDB4YTAsMHhmZiwweGY2LDB4MjQsMHgwNCwweDA4LDB4NDAsMHgwOCwweDAwLDB4MjUsMHhmYiwKKzB4MjQsMHgwNSwweGZmLDB4ZmYsMHgwOCwweDAwLDB4MjUsMHhmYSwweDI0LDB4MDQsMHgwOCwweDQ0LDB4MjcsMHhiZCwweGZmLDB4ZTgsCisweDMwLDB4ODQsMHgwMCwweGZmLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweDgyLDB4MDAsMHgzOSwweGFmLDB4YmYsMHgwMCwweDEwLAorMHgyOCwweDgyLDB4MDAsMHgwMiwweDE0LDB4NDAsMHgwMCwweDI3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTAsMHg4MiwweDAwLDB4MTcsMHgwMCwweGEwLDB4MzAsMHgyMSwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTAsMHg4MiwweDAwLDB4MDUsCisweDI0LDB4MDQsMHgwOCwweDNjLDB4OGYsMHhiZiwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgxOCwweDBjLDB4MDAsMHgxMywweDViLDB4M2MsMHgwNSwweDNmLDB4MDAsMHgyNCwweDA0LDB4MDgsMHgzYywKKzB4M2MsMHgwNSwweDgwLDB4MDAsMHgwYywweDAwLDB4MTMsMHg1YiwweDAwLDB4MDAsMHgzMCwweDIxLDB4MjQsMHgwNCwweDA4LDB4M2MsCisweDNjLDB4MDUsMHg4MCwweDAwLDB4MGMsMHgwMCwweDEzLDB4NWIsMHgyNCwweDA2LDB4MDAsMHgwMSwweDI0LDB4MDQsMHgwOCwweGFjLAorMHgwYywweDAwLDB4MTMsMHgzZCwweDI0LDB4MDUsMHgwZiwweGZmLDB4MDgsMHgwMCwweDI2LDB4MTUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwNCwweDA4LDB4MzQsMHgwYywweDAwLDB4MTMsMHg1YiwweDNjLDB4MDUsMHgzZiwweDAwLDB4MjQsMHgwNCwweDA4LDB4MzQsCisweDNjLDB4MDUsMHg4MCwweDAwLDB4MGMsMHgwMCwweDEzLDB4NWIsMHgwMCwweDAwLDB4MzAsMHgyMSwweDI0LDB4MDQsMHgwOCwweDM0LAorMHgzYywweDA1LDB4ODAsMHgwMCwweDBjLDB4MDAsMHgxMywweDViLDB4MjQsMHgwNiwweDAwLDB4MDEsMHgwOCwweDAwLDB4MjYsMHgyNCwKKzB4MjQsMHgwNCwweDA4LDB4YTgsMHgxNCwweDgwLDB4ZmYsMHhkZiwweDAwLDB4YTAsMHgzMCwweDIxLDB4MjQsMHgwNCwweDA4LDB4MjQsCisweDBjLDB4MDAsMHgxMywweDViLDB4M2MsMHgwNSwweDNmLDB4MDAsMHgyNCwweDA0LDB4MDgsMHgyNCwweDNjLDB4MDUsMHg4MCwweDAwLAorMHgwYywweDAwLDB4MTMsMHg1YiwweDAwLDB4MDAsMHgzMCwweDIxLDB4MjQsMHgwNCwweDA4LDB4MjQsMHgzYywweDA1LDB4ODAsMHgwMCwKKzB4MGMsMHgwMCwweDEzLDB4NWIsMHgyNCwweDA2LDB4MDAsMHgwMSwweDA4LDB4MDAsMHgyNiwweDI0LDB4MjQsMHgwNCwweDA4LDB4YTAsCisweDAwLDB4YTAsMHgzMCwweDIxLDB4MjQsMHgwNCwweDA4LDB4MmMsMHgwYywweDAwLDB4MTMsMHg1YiwweDNjLDB4MDUsMHgzZiwweDAwLAorMHgyNCwweDA0LDB4MDgsMHgyYywweDNjLDB4MDUsMHg4MCwweDAwLDB4MGMsMHgwMCwweDEzLDB4NWIsMHgwMCwweDAwLDB4MzAsMHgyMSwKKzB4MjQsMHgwNCwweDA4LDB4MmMsMHgzYywweDA1LDB4ODAsMHgwMCwweDBjLDB4MDAsMHgxMywweDViLDB4MjQsMHgwNiwweDAwLDB4MDEsCisweDA4LDB4MDAsMHgyNiwweDI0LDB4MjQsMHgwNCwweDA4LDB4YTQsMHgzYywweDA1LDB4MDAsMHgxNCwweDNjLDB4MDIsMHhiMCwweDA1LAorMHgzNCwweDQyLDB4MDQsMHgyMCwweDNjLDB4MDYsMHhjMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDUsMHgzYywweDA0LDB4YjAsMHgwNSwKKzB4MzQsMHhhNSwweDE3LDB4MDksMHhhYywweDQ1LDB4MDAsMHgwMCwweDM0LDB4YzYsMHgwNSwweDA3LDB4MzQsMHg2MywweDA0LDB4MjQsCisweDM0LDB4ODQsMHgwMiwweDI4LDB4M2MsMHgwNywweGIwLDB4MDUsMHgyNCwweDAyLDB4MDAsMHgyMCwweGFjLDB4NjYsMHgwMCwweDAwLAorMHgzNCwweGU3LDB4MDQsMHg1MCwweGEwLDB4ODIsMHgwMCwweDAwLDB4OTAsMHhlMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4MDMsMHgxMCwweDQwLDB4ZmYsMHhmYywweDI0LDB4MDIsMHgwMCwweDAxLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTMsMHg4NSwweDgxLDB4ZjEsMHgyNCwweDAyLDB4MDAsMHgwMSwweDE0LDB4YTIsMHgwMCwweDUxLAorMHgwMCwweDgwLDB4NDAsMHgyMSwweDhjLDB4ODksMHgwMCwweDA0LDB4M2MsMHgwMywweGIwLDB4MDEsMHgwMSwweDIzLDB4MzAsMHgyMSwKKzB4OGMsMHhjMiwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDA4LDB4MTAsMHg0NSwweDAwLDB4NTksCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTQsMHhjMiwweDAwLDB4MzgsMHgyNCwweDAzLDB4MDAsMHhiNCwweDMwLDB4NDQsMHgwMCwweGZmLAorMHgxMCwweDgzLDB4MDAsMHg2MSwweDI0LDB4MDIsMHgwMCwweGM0LDB4MTAsMHg4MiwweDAwLDB4NTQsMHgyNCwweDAyLDB4MDAsMHg5NCwKKzB4MTAsMHg4MiwweDAwLDB4NDUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDk0LDB4YzIsMHgwMCwweDM4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NDcsMHhmZiwweGZmLDB4MzAsMHhlMywweDQwLDB4ZmYsMHgyNCwweDAyLDB4NDAsMHg4OCwweDE0LDB4NjIsMHgwMCwweDM5LAorMHgzMCwweGUzLDB4MDMsMHgwMCwweDI0LDB4MDIsMHgwMywweDAwLDB4MTAsMHg2MiwweDAwLDB4MzgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OTQsMHhjMiwweDAwLDB4NTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDcsMHhmZiwweGZmLDB4MzAsMHhlMiwweDAwLDB4ODAsCisweDE0LDB4NDAsMHgwMCwweDMwLDB4M2MsMHgwMiwweGIwLDB4MDEsMHgwMSwweDIyLDB4MzAsMHgyMSwweDk0LDB4YzMsMHgwMCwweDYwLAorMHgyNCwweDAyLDB4MDAsMHgwOCwweDE0LDB4NDMsMHgwMCwweDNiLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MCwweGMyLDB4MDAsMHg2MiwKKzB4MjQsMHgwMywweDAwLDB4MDQsMHgwMCwweDAyLDB4MzksMHgwMiwweDEwLDB4ZTMsMHgwMCwweDE1LDB4MjQsMHgwMiwweDAwLDB4MDYsCisweDE0LDB4ZTIsMHgwMCwweDM0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZCwweDA1LDB4MDEsMHhhYywweDk0LDB4YzQsMHgwMCwweDY2LAorMHgyNywweDgyLDB4ODksMHg1OCwweDAwLDB4MDUsMHgyOCwweDgwLDB4MzAsMHg4NywweGZmLDB4ZmYsMHgwMCwweGEyLDB4MjgsMHgyMSwKKzB4MDAsMHgwNywweDFhLDB4MDAsMHg4YywweGE0LDB4MDAsMHgwMCwweDAwLDB4MDcsMHgxMiwweDAyLDB4MDAsMHg0MywweDEwLDB4MjUsCisweDI0LDB4NDIsMHgwMCwweDVlLDB4MjQsMHgwMywweGMwLDB4MDAsMHgzMCwweDQ3LDB4ZmYsMHhmZiwweDAwLDB4ODMsMHgyMCwweDI0LAorMHgwMCwweDg3LDB4MjAsMHgyNSwweGFjLDB4YTQsMHgwMCwweDAwLDB4MDgsMHgwMCwweDI2LDB4Y2QsMHhhZCwweDA3LDB4MDAsMHgxMCwKKzB4OGQsMHgwNSwweDAxLDB4YWMsMHg5NCwweGM0LDB4MDAsMHg2NCwweDI3LDB4ODIsMHg4OSwweDU4LDB4MDAsMHgwNSwweDI4LDB4ODAsCisweDMwLDB4ODcsMHhmZiwweGZmLDB4MDAsMHhhMiwweDI4LDB4MjEsMHgwMCwweDA3LDB4MWEsMHgwMCwweDhjLDB4YTQsMHgwMCwweDAwLAorMHgwMCwweDA3LDB4MTIsMHgwMiwweDAwLDB4NDMsMHgxMCwweDI1LDB4MjQsMHg0MiwweDAwLDB4MzYsMHgzYywweDAzLDB4ZmYsMHhmZiwKKzB4MzAsMHg0NywweGZmLDB4ZmYsMHgwMCwweDgzLDB4MjAsMHgyNCwweDAwLDB4ODcsMHgyMCwweDI1LDB4YWMsMHhhNCwweDAwLDB4MDAsCisweGFkLDB4MDcsMHgwMCwweDEwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDk0LDB4YzIsMHgwMCwweDUwLAorMHgwOCwweDAwLDB4MjYsMHg4YiwweDMwLDB4NDcsMHhmZiwweGZmLDB4OGQsMHgwNCwweDAxLDB4YWMsMHgyNywweDgzLDB4ODksMHg1OCwKKzB4MDAsMHgwNCwweDIwLDB4ODAsMHgwMCwweDgzLDB4MjAsMHgyMSwweDhjLDB4ODIsMHgwMCwweDAwLDB4M2MsMHgwMywweGZmLDB4ZmYsCisweDAwLDB4NDMsMHgxMCwweDI0LDB4MzQsMHg0MiwweDAwLDB4MmUsMHhhYywweDgyLDB4MDAsMHgwMCwweDI0LDB4MDMsMHgwMCwweDJlLAorMHhhZCwweDAzLDB4MDAsMHgxMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZCwweDA0LDB4MDEsMHhhYywKKzB4MjcsMHg4MywweDg5LDB4NTgsMHgwMCwweDA0LDB4MjAsMHg4MCwweDAwLDB4ODMsMHgyMCwweDIxLDB4OGMsMHg4MiwweDAwLDB4MDAsCisweDNjLDB4MDMsMHhmZiwweGZmLDB4MDAsMHg0MywweDEwLDB4MjQsMHgzNCwweDQyLDB4MDAsMHgwZSwweDI0LDB4MDMsMHgwMCwweDBlLAorMHgwOCwweDAwLDB4MjYsMHhjYywweGFjLDB4ODIsMHgwMCwweDAwLDB4OGQsMHgwNCwweDAxLDB4YWMsMHgyNywweDgzLDB4ODksMHg1OCwKKzB4MDAsMHgwNCwweDIwLDB4ODAsMHgwMCwweDgzLDB4MjAsMHgyMSwweDhjLDB4ODIsMHgwMCwweDAwLDB4M2MsMHgwMywweGZmLDB4ZmYsCisweDAwLDB4NDMsMHgxMCwweDI0LDB4MzQsMHg0MiwweDAwLDB4MTQsMHgyNCwweDAzLDB4MDAsMHgxNCwweDA4LDB4MDAsMHgyNiwweGNjLAorMHhhYywweDgyLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweGM2LDB4MDAsMHhmZiwKKzB4MDAsMHgwNiwweDQ4LDB4NDAsMHgwMSwweDI2LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4YiwweGJjLDB4MjAsCisweDI3LDB4ODMsMHhiYywweDI2LDB4MDAsMHg0YiwweDQwLDB4MjEsMHgwMCwweDQzLDB4MTAsMHgyMSwweDk0LDB4NDcsMHgwMCwweDAwLAorMHgzMCwweGEyLDB4M2YsMHhmZiwweDEwLDB4ZTIsMHgwMCwweDI5LDB4MzAsMHg4YSwweGZmLDB4ZmYsMHg5NSwweDAyLDB4MDAsMHgwMiwKKzB4MjQsMHgwMywweDAwLDB4MDEsMHgwMCwweDAyLDB4MTEsMHg4MiwweDMwLDB4NDIsMHgwMCwweDAxLDB4MTAsMHg0MywweDAwLDB4MTgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgyNiwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NGIsMHgzMCwweDIxLAorMHg5NCwweGM0LDB4MDAsMHgwMiwweDI3LDB4ODMsMHhiYywweDI2LDB4MjcsMHg4NSwweGJjLDB4MjQsMHgwMCwweDQ1LDB4MjgsMHgyMSwKKzB4MzAsMHg4NCwweGZmLDB4ZGYsMHgwMCwweDQzLDB4MTAsMHgyMSwweGE0LDB4YzQsMHgwMCwweDAyLDB4YTQsMHg0MCwweDAwLDB4MDAsCisweGE0LDB4YTAsMHgwMCwweDAwLDB4OTQsMHhjMywweDAwLDB4MDIsMHgzYywweDA0LDB4YjAsMHgwMSwweDAxLDB4NDQsMHgyMCwweDIxLAorMHgzMCwweDYzLDB4ZmYsMHhiZiwweGE0LDB4YzMsMHgwMCwweDAyLDB4YTAsMHhjMCwweDAwLDB4MDAsMHg4YywweDgyLDB4MDAsMHgwNCwKKzB4MjQsMHgwMywweGYwLDB4ZmYsMHgwMCwweDQzLDB4MTAsMHgyNCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4YWMsMHg4MiwweDAwLDB4MDQsCisweDI0LDB4MDIsMHhjMCwweDAwLDB4OTEsMHgwNCwweDAwLDB4MDEsMHgwMCwweGEyLDB4MTAsMHgyNCwweDAwLDB4NDcsMHgyOCwweDI1LAorMHgzYywweDAzLDB4YjAsMHgwMSwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTQsMHg4MiwweGZmLDB4ZTIsMHgwMSwweDQzLDB4MTgsMHgyMSwKKzB4YWMsMHg2NSwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjYsMHhmYSwweDAxLDB4MjYsMHgxMCwweDIxLDB4MDgsMHgwMCwweDI2LDB4ZmEsCisweDAxLDB4MjYsMHgxMCwweDIxLDB4OTMsMHg4MywweDgxLDB4ZjEsMHgyNCwweDAyLDB4MDAsMHgwMSwweDE0LDB4NjIsMHgwMCwweDBkLAorMHgzYywweDAyLDB4YjAsMHgwMSwweDhjLDB4ODQsMHgwMCwweDA0LDB4M2MsMHgwNiwweGIwLDB4MDksMHgwMCwweDgyLDB4MjAsMHgyMSwKKzB4OGMsMHg4NSwweDAwLDB4MDgsMHg4YywweDgzLDB4MDAsMHgwNCwweDNjLDB4MDIsMHgwMSwweDAwLDB4MzQsMHhjNiwweDAxLDB4MDAsCisweDAwLDB4NjIsMHgxOCwweDI0LDB4MTQsMHg2MCwweDAwLDB4MDUsMHgzMCwweGE1LDB4MjAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDA2LAorMHhhMCwweGMyLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwOSwKKzB4MTAsMHhhMCwweGZmLDB4ZmMsMHgzNCwweDYzLDB4MDEsMHgwMCwweDI0LDB4MDIsMHgwMCwweDBlLDB4MDgsMHgwMCwweDI3LDB4MmQsCisweGEwLDB4NjIsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDEsMHgzMCwweGE1LDB4ZmYsMHhmZiwweDAwLDB4YTIsMHgyOCwweDIxLAorMHg4YywweGEzLDB4MDAsMHgwMCwweDNjLDB4MDIsMHgxMCwweDAwLDB4MDAsMHg4MCwweDMwLDB4MjEsMHgwMCwweDYyLDB4MTgsMHgyNCwKKzB4OGMsMHhhMiwweDAwLDB4MDQsMHgxMCwweDYwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDgwLDB4MDAsCisweDEwLDB4NDAsMHgwMCwweDEzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4YywweGMyLDB4MDEsMHhhOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDQ0LDB4MDAsMHgwMSwweDI4LDB4ODMsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4NDAsMHgwMCwweDgzLDB4MTAsMHgwYSwKKzB4OTMsMHg4MywweDgxLDB4ZjAsMHgwMCwweDAyLDB4MTEsMHg4MywweDAwLDB4MDIsMHgxMSwweDgwLDB4MDAsMHg4MiwweDIwLDB4MjMsCisweDI0LDB4NjMsMHhmZiwweGZmLDB4YWMsMHhjNCwweDAxLDB4YTgsMHhhMywweDgzLDB4ODEsMHhmMCwweDhjLDB4YzQsMHgwMSwweGFjLAorMHg4YywweGMyLDB4MDEsMHhhOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NCwweDEwLDB4MjYsMHgwMCwweDAyLDB4MTAsMHgyYiwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4MzQsMHg2MywweDAwLDB4NzMsCisweDkwLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHgwMSwweDE0LDB4NDAsMHgwMCwweDA0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweGEzLDB4ODAsMHg4MSwweGYxLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHhhMywweDgyLDB4ODEsMHhmMSwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAwLDB4YTgsMHg4YywweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDYyLDB4MDAsMHhmZiwweDAwLDB4MDMsMHgyZSwweDAyLDB4MDAsMHgwMiwweDM5LDB4ODAsMHgyYywweGEyLDB4MDAsMHgwMiwKKzB4MDAsMHgwMywweDM0LDB4MDIsMHgxMCwweDQwLDB4MDAsMHgwNSwweDAwLDB4MDMsMHgxYSwweDAyLDB4YTQsMHg4NywweDAxLDB4ZDgsCisweGEwLDB4ODUsMHgwMSwweGQ0LDB4YTAsMHg4NiwweDAxLDB4ZDUsMHhhMCwweDgzLDB4MDEsMHhkNiwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4ODIsMHgwMCwweDA0LDB4M2MsMHgwNSwweGIwLDB4MDEsMHgwMCwweDgwLDB4NTAsMHgyMSwKKzB4MDAsMHg0NSwweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgwNCwweDI0LDB4MDIsMHgwMCwweDA1LDB4MDAsMHgwMywweDFhLDB4MDIsCisweDMwLDB4NjksMHgwMCwweDBmLDB4MTEsMHgyMiwweDAwLDB4MGIsMHgyNCwweDAyLDB4MDAsMHgwNywweDExLDB4MjIsMHgwMCwweDA5LAorMHgyNCwweDAyLDB4MDAsMHgwYSwweDExLDB4MjIsMHgwMCwweDA3LDB4MjQsMHgwMiwweDAwLDB4MGIsMHgxMSwweDIyLDB4MDAsMHgwNSwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHg5MywweDgzLDB4ODEsMHhmMCwweDNjLDB4MDQsMHhiMCwweDA2LDB4MTAsMHg2MiwweDAwLDB4MDMsCisweDM0LDB4ODQsMHg4MCwweDE4LDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4ODIsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxNywweDAyLDB4MTQsMHg0MCwweGZmLDB4ZmEsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGQsMHg0MywweDAxLDB4YTgsMHgyNywweDgyLDB4ODksMHg1OCwweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2YSwweDIwLDB4MjEsCisweDhjLDB4ODcsMHgwMCwweGE4LDB4MDAsMHg2MiwweDE4LDB4MjEsMHg4YywweDY4LDB4MDAsMHgwMCwweDAwLDB4ZTUsMHgyOCwweDIxLAorMHg4YywweGE5LDB4MDAsMHgwMCwweDNjLDB4MDIsMHhmZiwweGZmLDB4MjcsMHg4MywweDhhLDB4NTgsMHgwMSwweDIyLDB4MTAsMHgyNCwKKzB4MDAsMHg0OCwweDEwLDB4MjUsMHhhYywweGEyLDB4MDAsMHgwMCwweDhkLDB4NDQsMHgwMSwweGE4LDB4MDAsMHgwNywweDMwLDB4YzIsCisweDNjLDB4MDIsMHgwMCwweDgwLDB4MDAsMHgwNCwweDIwLDB4ODAsMHgwMCwweDgzLDB4MjAsMHgyMSwweDAwLDB4MDYsMHgzMiwweDAwLAorMHg4YywweGE5LDB4MDAsMHgwNCwweDAwLDB4YzIsMHgzMCwweDI1LDB4OGMsMHg4MiwweDAwLDB4MDAsMHgzYywweDAzLDB4ODAsMHgwMCwKKzB4MDEsMHgyMiwweDEwLDB4MjUsMHgwMCwweDQzLDB4MTAsMHgyNSwweGFjLDB4YTIsMHgwMCwweDA0LDB4YWYsMHg4NywweGJjLDB4MTAsCisweDhjLDB4YTIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhZiwweDgyLDB4YmMsMHgxOCwweDhjLDB4YTMsMHgwMCwweDA0LAorMHgzYywweDAxLDB4YjAsMHgwNywweGFjLDB4MjYsMHg4MCwweDE4LDB4OGQsMHg0MiwweDAxLDB4YTgsMHhhZiwweDgzLDB4YmMsMHgxNCwKKzB4OTMsMHg4NSwweDgxLDB4ZjAsMHgyNCwweDQ0LDB4MDAsMHgwMSwweDI4LDB4ODMsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4NDAsCisweDAwLDB4ODMsMHgxMCwweDBhLDB4MDAsMHgwMiwweDExLDB4ODMsMHgwMCwweDAyLDB4MTEsMHg4MCwweDI0LDB4YTUsMHhmZiwweGZmLAorMHgwMCwweDgyLDB4MjAsMHgyMywweGFkLDB4NDQsMHgwMSwweGE4LDB4YTMsMHg4NSwweDgxLDB4ZjAsMHgwOCwweDAwLDB4MjcsMHg4OSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDA1LDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAxLDB4MjQsMHg0MiwweDlmLDB4MDQsCisweDM0LDB4YTUsMHgwMCwweDIwLDB4YWMsMHhhMiwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwweDI0LDB4MDMsMHgwMCwweDIwLAorMHhhYywweDgyLDB4MDAsMHg2NCwweDNjLDB4MDIsMHg4MCwweDAxLDB4YWMsMHg4MywweDAwLDB4NjAsMHgwMCwweDgwLDB4MzgsMHgyMSwKKzB4YWMsMHg4MCwweDAwLDB4MDAsMHhhYywweDgwLDB4MDAsMHgwNCwweGFjLDB4ODAsMHgwMCwweDA4LDB4YWMsMHg4MCwweDAwLDB4NGMsCisweGFjLDB4ODAsMHgwMCwweDUwLDB4YWMsMHg4MCwweDAwLDB4NTQsMHhhYywweDgwLDB4MDAsMHgwYywweGFjLDB4ODAsMHgwMCwweDU4LAorMHhhMCwweDgwLDB4MDAsMHg1YywweDI0LDB4ODMsMHgwMCwweDY4LDB4MjQsMHg0MiwweGEwLDB4MTQsMHgyNCwweDA0LDB4MDAsMHgwZiwKKzB4MjQsMHg4NCwweGZmLDB4ZmYsMHhhYywweDYyLDB4MDAsMHgwMCwweDA0LDB4ODEsMHhmZiwweGZkLDB4MjQsMHg2MywweDAwLDB4MDQsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAwLDB4YTgsMHhhYywweGUwLDB4MDEsMHhhOCwweGFjLDB4ZTAsMHgwMSwweGFjLAorMHhhYywweGUwLDB4MDEsMHhiMCwweGFjLDB4ZTAsMHgwMSwweGI0LDB4YTAsMHhlMCwweDAxLDB4YjgsMHhhMCwweGUwLDB4MDEsMHhiOSwKKzB4YTAsMHhlMCwweDAxLDB4YmEsMHhhMCwweGUwLDB4MDEsMHhjMCwweGEwLDB4ZTAsMHgwMSwweGMxLDB4YWMsMHhlMCwweDAxLDB4YzQsCisweGFjLDB4ZTAsMHgwMSwweGM4LDB4YWMsMHhlMCwweDAxLDB4Y2MsMHhhYywweGUwLDB4MDEsMHhkMCwweDhjLDB4NDQsMHgwMCwweDAwLAorMHgzYywweDAyLDB4ODAsMHgwMSwweDI0LDB4NDIsMHhhMCwweGZjLDB4MzAsMHg4MywweDAwLDB4ZmYsMHgwMCwweDAzLDB4MTksMHg4MCwKKzB4YTQsMHhlMywweDAxLDB4ZDgsMHhhYywweGUyLDB4MDAsMHg3OCwweDNjLDB4MDMsMHg4MCwweDAxLDB4M2MsMHgwMiwweDgwLDB4MDEsCisweDI0LDB4NjMsMHhhMiwweDg4LDB4MjQsMHg0MiwweGExLDB4ZjQsMHhhYywweGUzLDB4MDAsMHg4OCwweGFjLDB4ZTIsMHgwMCwweDk4LAorMHgzYywweDAzLDB4ODAsMHgwMSwweDNjLDB4MDIsMHg4MCwweDAxLDB4MDAsMHgwNCwweDJlLDB4MDMsMHgwMCwweDA0LDB4MzQsMHgwMywKKzB4MjQsMHg2MywweGEzLDB4MzAsMHgwMCwweDA0LDB4MjIsMHgwMywweDI0LDB4NDIsMHhhNCwweDc0LDB4YWMsMHhlMywweDAwLDB4YTAsCisweGFjLDB4ZTIsMHgwMCwweGE0LDB4YTAsMHhlNSwweDAxLDB4ZDQsMHhhMCwweGU2LDB4MDEsMHhkNSwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHhhMCwweGU0LDB4MDEsMHhkNiwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDEsMHgzNCwweDYzLDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweGEwLDB4MTQsMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4NjIsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDNjLDB4MDMsMHg4MCwweDAxLDB4MzQsMHg0MiwweDAwLDB4MjAsMHgyNCwweDYzLDB4YTAsMHgyYywweGFjLDB4NDMsMHgwMCwweDAwLAorMHg4YywweDgyLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MTEsMHgwMCwweDgwLDB4MjgsMHgyMSwKKzB4OGMsMHg4MiwweDAwLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDBkLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhjLDB4ODQsMHgwMCwweDEwLDB4OGMsMHhhMywweDAwLDB4MTQsMHg4YywweGEyLDB4MDAsMHgwNCwweDAwLDB4ODMsMHgyMCwweDIxLAorMHgwMCwweDQ0LDB4MTAsMHgyMSwweDMwLDB4NDMsMHgwMCwweGZmLDB4MDAsMHgwMywweDE4LDB4MmIsMHgwMCwweDAyLDB4MTIsMHgwMiwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTIsMHgwMCwweDMwLDB4NDIsMHgzZiwweGZmLDB4YWMsMHhhMiwweDAwLDB4MDQsCisweGFjLDB4YTAsMHgwMCwweDAwLDB4YWMsMHhhMCwweDAwLDB4NGMsMHhhYywweGEwLDB4MDAsMHg1MCwweGFjLDB4YTAsMHgwMCwweDU0LAorMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4YTAsMHgwMCwweDBjLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMSwKKzB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4YTAsMHhhOCwweGFjLDB4NjIsMHgwMCwweDAwLDB4OGMsMHg4NiwweDAwLDB4MDQsCisweDNjLDB4MDIsMHhiMCwweDAxLDB4MjQsMHgwMywweDAwLDB4MDEsMHgwMCwweGMyLDB4MTAsMHgyMSwweDhjLDB4NDUsMHgwMCwweDAwLAorMHhhYywweDgzLDB4MDAsMHg0YywweDAwLDB4MDUsMHgxNCwweDAyLDB4MzAsMHhhMywweDNmLDB4ZmYsMHgzMCwweDQyLDB4MDAsMHhmZiwKKzB4YWMsMHg4MywweDAwLDB4MTAsMHhhYywweDgyLDB4MDAsMHgxNCwweDhjLDB4ODMsMHgwMCwweDE0LDB4YWMsMHg4NSwweDAwLDB4NDAsCisweDAwLDB4YzMsMHgzMCwweDIxLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweDg2LDB4MDAsMHgwOCwweDNjLDB4MDIsMHhiMCwweDAzLAorMHgzYywweDAzLDB4ODAsMHgwMSwweDI3LDB4YmQsMHhmZiwweGU4LDB4MzQsMHg0MiwweDAwLDB4MjAsMHgyNCwweDYzLDB4YTAsMHhmYywKKzB4YWYsMHhiMCwweDAwLDB4MTAsMHhhZiwweGJmLDB4MDAsMHgxNCwweGFjLDB4NDMsMHgwMCwweDAwLDB4OGMsMHg4MiwweDAwLDB4NGMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MGEsMHgwMCwweDgwLDB4ODAsMHgyMSwweGFlLDB4MDAsMHgwMCwweDAwLAorMHhhZSwweDAwLDB4MDAsMHg0YywweGFlLDB4MDAsMHgwMCwweDUwLDB4YWUsMHgwMCwweDAwLDB4NTQsMHhhZSwweDAwLDB4MDAsMHgwYywKKzB4OGYsMHhiZiwweDAwLDB4MTQsMHg4ZiwweGIwLDB4MDAsMHgxMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsCisweDBjLDB4MDAsMHgyOCwweDJhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjgsMHg0YywweGFlLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDAyLDB4YjAsMHgwMywweDNjLDB4MDMsMHg4MCwweDAxLDB4MjcsMHhiZCwweGZmLDB4ZTgsMHgzNCwweDQyLDB4MDAsMHgyMCwKKzB4MjQsMHg2MywweGExLDB4NjAsMHhhZiwweGIwLDB4MDAsMHgxMCwweGFmLDB4YmYsMHgwMCwweDE0LDB4YWMsMHg0MywweDAwLDB4MDAsCisweDhjLDB4ODIsMHgwMCwweDRjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgxNiwweDAwLDB4ODAsMHg4MCwweDIxLAorMHg4ZSwweDAzLDB4MDAsMHgwOCwweDNjLDB4MDIsMHhiMCwweDAxLDB4OGUsMHgwNCwweDAwLDB4NDQsMHgwMCwweDYyLDB4MTgsMHgyMSwKKzB4OTAsMHg2NSwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweGFlLDB4MDIsMHgwMCwweDUwLDB4MzAsMHhhMywweDAwLDB4ZmYsCisweDAwLDB4MDMsMHgxMCwweDgyLDB4MDAsMHgwNCwweDIzLDB4MDIsMHgzMCwweDg0LDB4MDAsMHgwZiwweDMwLDB4NDIsMHgwMCwweDAzLAorMHgwMCwweDAzLDB4MTksMHgwMiwweGFlLDB4MDQsMHgwMCwweDM0LDB4YWUsMHgwMiwweDAwLDB4MmMsMHhhZSwweDAzLDB4MDAsMHgzMCwKKzB4YTIsMHgwNSwweDAwLDB4NDgsMHg4ZiwweGJmLDB4MDAsMHgxNCwweDhmLDB4YjAsMHgwMCwweDEwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDE4LDB4MGMsMHgwMCwweDI4LDB4MmEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyOCwweDY0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMywweDgwLDB4MDEsMHgyNywweGJkLDB4ZmYsMHhlOCwKKzB4MzQsMHg0MiwweDAwLDB4MjAsMHgyNCwweDYzLDB4YTEsMHhmNCwweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MTQsCisweGFjLDB4NDMsMHgwMCwweDAwLDB4OGMsMHg4MiwweDAwLDB4NTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDE2LAorMHgwMCwweDgwLDB4ODAsMHgyMSwweDkyLDB4MDMsMHgwMCwweDQ0LDB4OGUsMHgwMiwweDAwLDB4NDAsMHg4MywweDg1LDB4OGIsMHhjNCwKKzB4OTIsMHgwNCwweDAwLDB4NDEsMHgzMCwweDYzLDB4MDAsMHgwMSwweDAwLDB4MDIsMHgxNiwweDAyLDB4YWUsMHgwNCwweDAwLDB4MTQsCisweDAwLDB4MDAsMHgzMCwweDIxLDB4YWUsMHgwMiwweDAwLDB4MTgsMHgxMCwweGEwLDB4MDAsMHgwNCwweGFlLDB4MDMsMHgwMCwweDNjLAorMHgxMCwweDYwLDB4MDAsMHgwMywweDI0LDB4MDIsMHgwMCwweDAxLDB4MjQsMHgwNiwweDAwLDB4MDEsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4YTMsMHg4NiwweDhiLDB4YzQsMHg4ZiwweGJmLDB4MDAsMHgxNCwweGFlLDB4MDIsMHgwMCwweDU0LDB4OGYsMHhiMCwweDAwLDB4MTAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsMHgwYywweDAwLDB4MjgsMHg1OCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MjgsMHg4OSwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAzLDB4ODAsMHgwMSwKKzB4MjcsMHhiZCwweGZmLDB4ZTgsMHgzNCwweDQyLDB4MDAsMHgyMCwweDI0LDB4NjMsMHhhMiwweDg4LDB4YWYsMHhiMCwweDAwLDB4MTAsCisweGFmLDB4YmYsMHgwMCwweDE0LDB4YWMsMHg0MywweDAwLDB4MDAsMHg4YywweDgyLDB4MDAsMHg1MCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMCwweDQwLDB4MDAsMHgxYiwweDAwLDB4ODAsMHg4MCwweDIxLDB4M2MsMHgwMiwweGIwLDB4MDMsMHg4YywweDQyLDB4MDAsMHgwMCwKKzB4OTIsMHgwNCwweDAwLDB4NDQsMHg4ZSwweDAzLDB4MDAsMHg0MCwweDgzLDB4ODYsMHg4YiwweGM0LDB4OTIsMHgwNSwweDAwLDB4NDEsCisweDMwLDB4NDIsMHgwOCwweDAwLDB4MzAsMHg4NCwweDAwLDB4MDEsMHgwMCwweDAyLDB4MTIsMHhjMiwweDAwLDB4MDMsMHgxZSwweDAyLAorMHgwMCwweDgyLDB4MjAsMHgyNSwweGFlLDB4MDUsMHgwMCwweDE0LDB4MDAsMHgwMCwweDM4LDB4MjEsMHhhZSwweDAzLDB4MDAsMHgxOCwKKzB4MTAsMHhjMCwweDAwLDB4MDQsMHhhZSwweDA0LDB4MDAsMHgzYywweDEwLDB4ODAsMHgwMCwweDAzLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDI0LDB4MDcsMHgwMCwweDAxLDB4MjQsMHgwMiwweDAwLDB4MDEsMHhhMywweDg3LDB4OGIsMHhjNCwweDhmLDB4YmYsMHgwMCwweDE0LAorMHhhZSwweDAyLDB4MDAsMHg1NCwweDhmLDB4YjAsMHgwMCwweDEwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxOCwKKzB4MGMsMHgwMCwweDI4LDB4NTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyOCwweGFlLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMywweDgwLDB4MDEsMHgyNywweGJkLDB4ZmYsMHhlOCwweDM0LDB4NDIsMHgwMCwweDIwLAorMHgyNCwweDYzLDB4YTMsMHgzMCwweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MTQsMHhhYywweDQzLDB4MDAsMHgwMCwKKzB4OGMsMHg4MiwweDAwLDB4NTQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDQyLDB4MDAsMHg4MCwweDgwLDB4MjEsCisweDhlLDB4MDQsMHgwMCwweDA0LDB4OGUsMHgwMywweDAwLDB4NDQsMHgzYywweDAyLDB4ODAsMHgwMCwweDNjLDB4MDgsMHhiMCwweDAxLAorMHgzNCwweDQyLDB4MDAsMHgxMCwweDAwLDB4ODgsMHgyMCwweDIxLDB4MDAsMHg2MiwweDE4LDB4MjUsMHhhYywweDgzLDB4MDAsMHgwNCwKKzB4OGUsMHgwMiwweDAwLDB4MDQsMHg4ZSwweDAzLDB4MDEsMHhhYywweDI3LDB4ODksMHg4OSwweDU4LDB4MDAsMHg0OCwweDEwLDB4MjEsCisweDhjLDB4NDUsMHgwMCwweDAwLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY5LDB4MTgsMHgyMSwweGFjLDB4NjUsMHgwMCwweDAwLAorMHg4ZSwweDAyLDB4MDAsMHgwNCwweDhlLDB4MDMsMHgwMSwweGFjLDB4MjcsMHg4NywweDhhLDB4NTgsMHgwMCwweDQ4LDB4MTAsMHgyMSwKKzB4OGMsMHg0NSwweDAwLDB4MDQsMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjcsMHgxOCwweDIxLDB4YWMsMHg2NSwweDAwLDB4MDAsCisweDhlLDB4MDIsMHgwMSwweGFjLDB4OGUsMHgwNiwweDAwLDB4MDQsMHgwMiwweDAwLDB4MjAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQ3LDB4MzgsMHgyMSwweDk0LDB4ZTMsMHgwMCwweDAyLDB4MDAsMHg0OSwweDEwLDB4MjEsMHg5MCwweDQ1LDB4MDAsMHgwMCwKKzB4MDAsMHgwMywweDFhLDB4MDAsMHgwMCwweGM4LDB4MzAsMHgyMSwweDAwLDB4YTMsMHgyOCwweDI1LDB4MGMsMHgwMCwweDI2LDB4NjksCisweGE0LDB4YzUsMHgwMCwweDJlLDB4OGUsMHgwMywweDAxLDB4YWMsMHg4ZSwweDA3LDB4MDAsMHgwNCwweDNjLDB4MDYsMHhiMCwweDAzLAorMHgyNCwweDY1LDB4MDAsMHgwMSwweDI4LDB4YTQsMHgwMCwweDAwLDB4MjQsMHg2MiwweDAwLDB4NDAsMHgwMCwweGE0LDB4MTAsMHgwYSwKKzB4MDAsMHgwMiwweDExLDB4ODMsMHgwMCwweDAyLDB4MTEsMHg4MCwweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHhhMiwweDI4LDB4MjMsCisweDAwLDB4NzAsMHgxOCwweDIxLDB4YWUsMHgwNSwweDAxLDB4YWMsMHhhYywweDY3LDB4MDAsMHhhOCwweDM0LDB4YzYsMHgwMCwweDMwLAorMHg4YywweGMzLDB4MDAsMHgwMCwweDkzLDB4ODIsMHg4MSwweGYwLDB4MDIsMHgwMCwweDIwLDB4MjEsMHgyNCwweDYzLDB4MDAsMHgwMSwKKzB4MjQsMHg0MiwweDAwLDB4MDEsMHhhYywweGMzLDB4MDAsMHgwMCwweGEzLDB4ODIsMHg4MSwweGYwLDB4MGMsMHgwMCwweDI4LDB4MGIsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MTQsMHg4ZiwweGIwLDB4MDAsMHgxMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgxOCwweDBjLDB4MDAsMHgyOCwweGEyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjgsMHhkOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMywweDNjLDB4MDMsMHg4MCwweDAxLDB4MjcsMHhiZCwweGZmLDB4ZTgsCisweDM0LDB4NDIsMHgwMCwweDIwLDB4MjQsMHg2MywweGE0LDB4NzQsMHhhZiwweGIwLDB4MDAsMHgxMCwweGFmLDB4YmYsMHgwMCwweDE0LAorMHhhYywweDQzLDB4MDAsMHgwMCwweDhjLDB4ODIsMHgwMCwweDU0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHg0MiwKKzB4MDAsMHg4MCwweDgwLDB4MjEsMHg4ZSwweDA0LDB4MDAsMHgwNCwweDhlLDB4MDMsMHgwMCwweDQ0LDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDNjLDB4MDgsMHhiMCwweDAxLDB4MzQsMHg0MiwweDAwLDB4MTAsMHgwMCwweDg4LDB4MjAsMHgyMSwweDAwLDB4NjIsMHgxOCwweDI1LAorMHhhYywweDgzLDB4MDAsMHgwNCwweDhlLDB4MDIsMHgwMCwweDA0LDB4OGUsMHgwMywweDAxLDB4YWMsMHgyNywweDg5LDB4ODksMHg1OCwKKzB4MDAsMHg0OCwweDEwLDB4MjEsMHg4YywweDQ1LDB4MDAsMHgwMCwweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2OSwweDE4LDB4MjEsCisweGFjLDB4NjUsMHgwMCwweDAwLDB4OGUsMHgwMiwweDAwLDB4MDQsMHg4ZSwweDAzLDB4MDEsMHhhYywweDI3LDB4ODcsMHg4YSwweDU4LAorMHgwMCwweDQ4LDB4MTAsMHgyMSwweDhjLDB4NDUsMHgwMCwweDA0LDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY3LDB4MTgsMHgyMSwKKzB4YWMsMHg2NSwweDAwLDB4MDAsMHg4ZSwweDAyLDB4MDEsMHhhYywweDhlLDB4MDYsMHgwMCwweDA0LDB4MDIsMHgwMCwweDIwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NywweDM4LDB4MjEsMHg5NCwweGUzLDB4MDAsMHgwMiwweDAwLDB4NDksMHgxMCwweDIxLAorMHg5MCwweDQ1LDB4MDAsMHgwMCwweDAwLDB4MDMsMHgxYSwweDAwLDB4MDAsMHhjOCwweDMwLDB4MjEsMHgwMCwweGEzLDB4MjgsMHgyNSwKKzB4MGMsMHgwMCwweDI2LDB4NjksMHhhNCwweGM1LDB4MDAsMHgyZSwweDhlLDB4MDMsMHgwMSwweGFjLDB4OGUsMHgwNywweDAwLDB4MDQsCisweDNjLDB4MDYsMHhiMCwweDAzLDB4MjQsMHg2NSwweDAwLDB4MDEsMHgyOCwweGE0LDB4MDAsMHgwMCwweDI0LDB4NjIsMHgwMCwweDQwLAorMHgwMCwweGE0LDB4MTAsMHgwYSwweDAwLDB4MDIsMHgxMSwweDgzLDB4MDAsMHgwMiwweDExLDB4ODAsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MDAsMHhhMiwweDI4LDB4MjMsMHgwMCwweDcwLDB4MTgsMHgyMSwweGFlLDB4MDUsMHgwMSwweGFjLDB4YWMsMHg2NywweDAwLDB4YTgsCisweDM0LDB4YzYsMHgwMCwweDMwLDB4OGMsMHhjMywweDAwLDB4MDAsMHg5MywweDgyLDB4ODEsMHhmMCwweDAyLDB4MDAsMHgyMCwweDIxLAorMHgyNCwweDYzLDB4MDAsMHgwMSwweDI0LDB4NDIsMHgwMCwweDAxLDB4YWMsMHhjMywweDAwLDB4MDAsMHhhMywweDgyLDB4ODEsMHhmMCwKKzB4MGMsMHgwMCwweDI4LDB4MGIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YmYsMHgwMCwweDE0LDB4OGYsMHhiMCwweDAwLDB4MTAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsMHgwYywweDAwLDB4MjgsMHhhMiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MjksMHgyOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAzLDB4ODAsMHgwMSwKKzB4MjcsMHhiZCwweGZmLDB4ZDgsMHgzNCwweDQyLDB4MDAsMHgyMCwweDI0LDB4NjMsMHhhNSwweGI4LDB4YWYsMHhiMiwweDAwLDB4MTgsCisweGFjLDB4NDMsMHgwMCwweDAwLDB4M2MsMHgxMiwweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMSwweGFmLDB4YjQsMHgwMCwweDIwLAorMHhhZiwweGIzLDB4MDAsMHgxYywweGFmLDB4YjEsMHgwMCwweDE0LDB4YWYsMHhiMCwweDAwLDB4MTAsMHhhZiwweGJmLDB4MDAsMHgyNCwKKzB4MDAsMHg4MCwweDgwLDB4MjEsMHgyNCwweDU0LDB4YTAsMHgxNCwweDAwLDB4MDAsMHg4OCwweDIxLDB4M2MsMHgxMywweGIwLDB4MDEsCisweDM2LDB4NTIsMHgwMCwweGVmLDB4M2MsMHgwMiwweGIwLDB4MDksMHgzNCwweDQyLDB4MDAsMHgwNiwweDkwLDB4NDMsMHgwMCwweDAwLAorMHg4ZSwweDA0LDB4MDAsMHgwNCwweDkyLDB4MDIsMHgwMSwweGJiLDB4MzAsMHg2OSwweDAwLDB4ZmYsMHgwMCwweDA0LDB4NDIsMHgwMiwKKzB4MTAsMHg0MCwweDAwLDB4MWUsMHgwMCwweDAwLDB4MzgsMHgyMSwweDhlLDB4MDMsMHgwMSwweGE4LDB4M2MsMHgwNiwweDI4LDB4MzgsCisweDM0LDB4YzYsMHgwMCwweDIwLDB4MjQsMHg2NCwweDAwLDB4M2QsMHgyOCwweDgyLDB4MDAsMHgwMCwweDI0LDB4NjMsMHgwMCwweDdjLAorMHgwMCwweDgyLDB4MTgsMHgwYSwweDAwLDB4MDMsMHgxOSwweDgzLDB4MDAsMHgwMywweDE5LDB4ODAsMHgwMCwweDgzLDB4MjAsMHgyMywKKzB4MDAsMHgwNCwweDEwLDB4ODAsMHgwMCwweDUwLDB4MTAsMHgyMSwweDhjLDB4NDUsMHgwMCwweGE4LDB4YWUsMHgwNCwweDAxLDB4YWMsCisweGFlLDB4MDQsMHgwMSwweGE4LDB4MDAsMHhiMywweDE4LDB4MjEsMHhhZSwweDA1LDB4MDAsMHgwNCwweGFjLDB4NjYsMHgwMCwweDAwLAorMHg4ZSwweDAyLDB4MDAsMHgwNCwweDNjLDB4MDMsMHg4MCwweDAwLDB4MzQsMHg2MywweDRlLDB4MDAsMHgwMCwweDUzLDB4MTAsMHgyMSwKKzB4YWMsMHg0MywweDAwLDB4MDQsMHhhMiwweDAwLDB4MDEsMHhiYiwweDkzLDB4ODMsMHg4MSwweGY3LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4NjIsMHgwMCwweDAxLDB4YTMsMHg4MiwweDgxLDB4ZjcsMHhhMiwweDQzLDB4MDAsMHgwMCwweDAxLDB4MjgsMHgxMCwweDIzLAorMHgyNCwweDQ0LDB4MDAsMHg0MCwweDI4LDB4ODMsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4N2YsMHgwMCwweDgzLDB4MTAsMHgwYSwKKzB4MDAsMHgwMiwweDExLDB4ODMsMHgwMCwweDAyLDB4MTEsMHg4MCwweDI0LDB4ODQsMHhmZiwweGZmLDB4MTAsMHg0NCwweDAwLDB4NmIsCisweDNjLDB4MDIsMHhiMCwweDAxLDB4OGUsMHgwMywweDAwLDB4MDQsMHgzYywweDA0LDB4N2MsMHgwMCwweDAwLDB4NjIsMHgxOCwweDIxLAorMHg4YywweDY1LDB4MDAsMHgwNCwweDM0LDB4ODQsMHgwMCwweGYwLDB4MDAsMHgwMCwweDMwLDB4MjEsMHhhZSwweDA1LDB4MDAsMHg0NCwKKzB4MDAsMHhhNCwweDIwLDB4MjQsMHg4YywweDYzLDB4MDAsMHgwMCwweDEwLDB4ODAsMHgwMCwweDZiLDB4M2MsMHgwMiwweGZmLDB4ZmYsCisweDNjLDB4MDksMHhiMCwweDAzLDB4M2MsMHgwNSwweDdjLDB4MDAsMHgzNSwweDI5LDB4MDAsMHg5OSwweDNjLDB4MGEsMHhiMCwweDAxLAorMHgyNCwweDA4LDB4MDAsMHg0MCwweDM0LDB4YTUsMHgwMCwweGYwLDB4M2MsMHgwYiwweGZmLDB4ZmYsMHgzYywweDBjLDB4MjgsMHgzOCwKKzB4MTYsMHgyMCwweDAwLDB4MDYsMHgyNCwweGU3LDB4MDAsMHgwMSwweDkzLDB4ODIsMHg4MSwweGY2LDB4MjQsMHgxMSwweDAwLDB4MDEsCisweDI0LDB4NDIsMHgwMCwweDAxLDB4YTEsMHgyMiwweDAwLDB4MDAsMHhhMywweDgyLDB4ODEsMHhmNiwweDhlLDB4MDIsMHgwMCwweDA0LAorMHgyNCwweDA2LDB4MDAsMHgwMSwweDI0LDB4NDIsMHgwMSwweDAwLDB4MzAsMHg0MiwweDNmLDB4ZmYsMHhhZSwweDAyLDB4MDAsMHgwNCwKKzB4MDAsMHg0YSwweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4YWUsMHgwMywweDAwLDB4NDQsCisweDAwLDB4NjUsMHgyMCwweDI0LDB4OGMsMHg0MywweDAwLDB4MDAsMHgxMCwweGU4LDB4MDAsMHgyZCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNCwweDgwLDB4ZmYsMHhlYiwweDAwLDB4NmIsMHgxMCwweDI0LDB4MTQsMHg0YywweGZmLDB4ZTksMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MTAsMHhjMiwweDAwLDB4MzAsMHgzYywweDAzLDB4YjAsMHgwOSwweDhlLDB4MDIsMHgwMCwweDQ0LDB4OGUsMHgwNCwweDAwLDB4NjAsCisweDAwLDB4MDIsMHgxZSwweDQyLDB4MDAsMHgwMiwweDEyLDB4MDIsMHgzMCwweDQyLDB4MDAsMHgwZiwweDMwLDB4NjMsMHgwMCwweDAxLAorMHhhZSwweDAyLDB4MDAsMHgwMCwweDEwLDB4NDQsMHgwMCwweDFhLDB4YWUsMHgwMywweDAwLDB4NTgsMHg4ZSwweDAyLDB4MDAsMHg2NCwKKzB4OGUsMHgwNCwweDAwLDB4NTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4ODIsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweGFlLDB4MDAsMHgwMCwweDRjLDB4YWUsMHgwMCwweDAwLDB4NTAsMHhhZSwweDAwLDB4MDAsMHg1NCwweGFlLDB4MDAsMHgwMCwweDBjLAorMHg4ZSwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweDEwLDB4ODAsMHgwMCwweDUwLDB4MTAsMHgyMSwKKzB4OGMsMHg0MiwweDAwLDB4NjgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NTQsMHgwMCwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4NDAsMHhmOCwweDA5LDB4MDIsMHgwMCwweDIwLDB4MjEsMHg4ZSwweDA0LDB4MDAsMHg1OCwweDhlLDB4MDMsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweGFlLDB4MDMsMHgwMCwweDYwLDB4MDgsMHgwMCwweDI5LDB4ODEsMHhhZSwweDA0LDB4MDAsMHg2NCwKKzB4OGUsMHgwMiwweDAwLDB4NjQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NjIsMHhmZiwweGU1LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDdhLDB4MDIsMHgwZCwweDdjLDB4OGYsMHhiZiwweDAwLDB4MjQsMHg4ZiwweGI0LDB4MDAsMHgyMCwweDdiLDB4YjIsMHgwMCwweGZjLAorMHg3YiwweGIwLDB4MDAsMHhiYywweDAwLDB4NDMsMHgxMCwweDI2LDB4MDAsMHgwMiwweDEwLDB4MmIsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MjcsMHhiZCwweDAwLDB4MjgsMHg4ZSwweDA0LDB4MDAsMHgwNCwweDM0LDB4NjMsMHgwMCwweDA2LDB4OTAsMHg2MiwweDAwLDB4MDAsCisweDAwLDB4MDQsMHg0MiwweDAyLDB4MDAsMHg0OCwweDEwLDB4MjMsMHgyNCwweDQ0LDB4MDAsMHg0MCwweDI4LDB4ODMsMHgwMCwweDAwLAorMHgyNCwweDQyLDB4MDAsMHg3ZiwweDAwLDB4ODMsMHgxMCwweDBhLDB4MDAsMHgwMiwweDExLDB4ODMsMHgwMCwweDAyLDB4MTEsMHg4MCwKKzB4MDAsMHg4MiwweDIwLDB4MjMsMHgxNCwweDg2LDB4ZmYsMHhjNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGUsMHgwMywweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MmMsMHg2MiwweDAwLDB4MDMsMHgxNCwweDQwLDB4MDAsMHgwNSwweDI0LDB4MDIsMHgwMCwweDBkLAorMHgxMCwweDYyLDB4MDAsMHgwMywweDI0LDB4MDIsMHgwMCwweDAxLDB4MDgsMHgwMCwweDJhLDB4MDQsMHhhMiwweDAyLDB4MDAsMHg1YywKKzB4MDgsMHgwMCwweDJhLDB4MDQsMHhhMiwweDAwLDB4MDAsMHg1YywweDAwLDB4NjIsMHgxMCwweDI0LDB4M2MsMHgwMywweDI4LDB4MzgsCisweDE0LDB4NDMsMHhmZiwweDkzLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgwOCwweDAwLDB4MjksMHhkYywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDAyLDB4YjAsMHgwMSwweDAwLDB4YTIsMHg0MCwweDIxLDB4MDAsMHhhMCwweDQ4LDB4MjEsMHg4ZCwweDA1LDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweGMwLDB4MDAsMHgwMCwweDA5LDB4MzgsMHhjMiwweDAwLDB4YTIsMHgyOCwweDI0LDB4MjQsMHhjMiwweGZmLDB4ZmYsCisweDAwLDB4MDcsMHgzYSwweDAwLDB4M2MsMHgwYSwweGIwLDB4MDYsMHgzYywweDAzLDB4MDAsMHg4MCwweDAwLDB4YTYsMHgyOCwweDI1LAorMHgyYywweDQyLDB4MWYsMHhmZiwweDAwLDB4ZTMsMHgzOCwweDI1LDB4MzUsMHg0YSwweDgwLDB4MTgsMHgxMCwweDQwLDB4MDAsMHgwZSwKKzB4YWQsMHgwNSwweDAwLDB4MDAsMHhhZiwweDg5LDB4YmMsMHgxMCwweDhkLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweGFmLDB4ODIsMHhiYywweDE4LDB4OGQsMHgwMywweDAwLDB4MDQsMHhhZCwweDQ3LDB4MDAsMHgwMCwweGFmLDB4ODMsMHhiYywweDE0LAorMHhhYywweDgwLDB4MDEsMHhkMCwweGFjLDB4ODAsMHgwMSwweGM0LDB4YTAsMHg4MCwweDAxLDB4YzAsMHhhMCwweDgwLDB4MDEsMHhjMSwKKzB4YWMsMHg4MCwweDAxLDB4YzgsMHhhYywweDgwLDB4MDEsMHhjYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI3LDB4YmQsMHhmZiwweGU4LDB4YWYsMHhiZiwweDAwLDB4MTAsMHg4YywweDgzLDB4MDEsMHhjNCwweDAwLDB4ODAsMHgzOCwweDIxLAorMHg5MCwweDg0LDB4MDEsMHhjMCwweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2NywweDE4LDB4MjEsMHg4YywweDY1LDB4MDAsMHhhOCwKKzB4M2MsMHgwMiwweGIwLDB4MDEsMHgyNCwweDAzLDB4MDAsMHgwMSwweDAwLDB4YTIsMHgxMCwweDIxLDB4OGMsMHg0MiwweDAwLDB4MDAsCisweDEwLDB4ODMsMHgwMCwweDE4LDB4MDAsMHgwMiwweDE0LDB4MDIsMHg4YywweGU5LDB4MDEsMHhjYywweDhjLDB4ZWEsMHgwMSwweGM4LAorMHgzMCwweDQ2LDB4MDAsMHhmZiwweDAxLDB4MmEsMHgxOCwweDIxLDB4MzAsMHg2NCwweDAwLDB4ZmYsMHgwMCwweDAzLDB4MWEsMHgwMiwKKzB4MjQsMHg2MiwweDAwLDB4MDEsMHgxNCwweDgwLDB4MDAsMHgwMiwweDMwLDB4NDgsMHgwMCwweGZmLDB4MzAsMHg2OCwweDAwLDB4ZmYsCisweDkwLDB4ZTIsMHgwMSwweGMxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ4LDB4MTAsMHgyMywweDAwLDB4MDIsMHgxMiwweDAwLAorMHgwMCwweDQ5LDB4MTAsMHgyMSwweDAwLDB4NGEsMHgxMCwweDIxLDB4MDAsMHg0NiwweDMwLDB4MjMsMHgwYywweDAwLDB4MmEsMHgyYywKKzB4MDAsMHhlMCwweDIwLDB4MjEsMHg4ZiwweGJmLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDE4LDB4OGMsMHhlNiwweDAxLDB4YzgsMHgwOCwweDAwLDB4MmEsMHg2YiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNywweGJkLDB4ZmYsMHhlOCwweGFmLDB4YmYsMHgwMCwweDE0LDB4YWYsMHhiMCwweDAwLDB4MTAsMHg4YywweDgyLDB4MDEsMHhjNCwKKzB4OTAsMHg4NywweDAxLDB4YzEsMHgwMCwweDgwLDB4ODAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NCwweDEwLDB4MjEsCisweDhjLDB4NDgsMHgwMCwweGE4LDB4M2MsMHgwMiwweGIwLDB4MDEsMHgwMCwweDA3LDB4M2EsMHgwMCwweDAxLDB4MDIsMHgxMCwweDIxLAorMHg4YywweDQzLDB4MDAsMHgwMCwweDAwLDB4ZTUsMHgzOCwweDIxLDB4MDAsMHhlNiwweDM4LDB4MjEsMHgwMCwweDAzLDB4MWMsMHgwMiwKKzB4MzAsMHg2MywweDAwLDB4ZmYsMHgwMCwweGUzLDB4MzgsMHgyMywweDAxLDB4MDAsMHgyOCwweDIxLDB4MGMsMHgwMCwweDJhLDB4MmMsCisweDAwLDB4ZTAsMHgzMCwweDIxLDB4OGUsMHgwMiwweDAxLDB4YTgsMHg4ZiwweGJmLDB4MDAsMHgxNCwweDI0LDB4NDQsMHgwMCwweDAxLAorMHgyOCwweDgzLDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDQwLDB4MDAsMHg4MywweDEwLDB4MGEsMHgwMCwweDAyLDB4MTEsMHg4MywKKzB4MDAsMHgwMiwweDExLDB4ODAsMHgwMCwweDgyLDB4MjAsMHgyMywweGFlLDB4MDQsMHgwMSwweGE4LDB4OGYsMHhiMCwweDAwLDB4MTAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsMHgzYywweDAyLDB4YjAsMHgwMywweDNjLDB4MDMsMHg4MCwweDAxLAorMHgyNywweGJkLDB4ZmYsMHhlOCwweDM0LDB4NDIsMHgwMCwweDIwLDB4MjQsMHg2MywweGFhLDB4NTgsMHhhZiwweGIwLDB4MDAsMHgxMCwKKzB4YWYsMHhiZiwweDAwLDB4MTQsMHhhYywweDQzLDB4MDAsMHgwMCwweDkwLDB4ODIsMHgwMSwweGQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE0LDB4NDAsMHgwMCwweDZhLDB4MDAsMHg4MCwweDgwLDB4MjEsMHg5MCwweDgyLDB4MDEsMHhjMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNCwweDQwLDB4MDAsMHg2MSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHg4MywweDAxLDB4YTgsMHg4YywweDgyLDB4MDEsMHhhYywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDYyLDB4MDAsMHgyMiwweDAwLDB4MDAsMHgyOCwweDIxLDB4OTMsMHg4MiwweDgxLDB4ZjEsCisweDAwLDB4MDMsMHgzMCwweDgwLDB4MDAsMHhjNCwweDE4LDB4MjEsMHgyNCwweDA0LDB4MDAsMHgwMSwweDhjLDB4NjcsMHgwMCwweGE4LAorMHgxMCwweDQ0LDB4MDAsMHgyMCwweDNjLDB4MDQsMHhiMCwweDAxLDB4YWYsMHg4NywweGJjLDB4MTAsMHgwMCwweGU0LDB4MjAsMHgyMSwKKzB4OGMsMHg4NiwweDAwLDB4MDAsMHgwMCwweDA3LDB4MTgsMHhjMiwweDNjLDB4MDIsMHgwMCwweDgwLDB4YWYsMHg4NiwweGJjLDB4MTgsCisweDhjLDB4ODYsMHgwMCwweDA0LDB4MDAsMHgwMywweDFhLDB4MDAsMHgzYywweDA1LDB4YjAsMHgwNiwweDAwLDB4NjIsMHgxOCwweDI1LAorMHgzNCwweGE1LDB4ODAsMHgxOCwweGFjLDB4YTMsMHgwMCwweDAwLDB4OGUsMHgwMiwweDAxLDB4YTgsMHg4ZSwweDA5LDB4MDEsMHhhYywKKzB4YWYsMHg4NiwweGJjLDB4MTQsMHgyNCwweDQ0LDB4MDAsMHgwMSwweDI4LDB4ODMsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4NDAsCisweDAwLDB4ODMsMHgxMCwweDBhLDB4MDAsMHgwMiwweDExLDB4ODMsMHgwMCwweDAyLDB4MTEsMHg4MCwweDAwLDB4ODIsMHgyMCwweDIzLAorMHgwMCwweDgwLDB4MzAsMHgyMSwweGFlLDB4MDQsMHgwMSwweGE4LDB4MDAsMHhjOSwweDEwLDB4MjYsMHgwMCwweDAyLDB4MjgsMHgyYiwKKzB4OGYsMHhiZiwweDAwLDB4MTQsMHg4ZiwweGIwLDB4MDAsMHgxMCwweDAwLDB4YTAsMHgxMCwweDIxLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDE4LDB4OTMsMHg4MiwweDgxLDB4ZjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDJjLDB4NDIsMHgwMCwweDAyLAorMHgxNCwweDQwLDB4ZmYsMHhmNywweDAwLDB4MDAsMHgyOCwweDIxLDB4M2MsMHgwNSwweGIwLDB4MDEsMHgwMCwweGU1LDB4MjgsMHgyMSwKKzB4MjcsMHg4MywweDg5LDB4NTgsMHgwMCwweGMzLDB4MTgsMHgyMSwweDhjLDB4YTYsMHgwMCwweDAwLDB4OGMsMHg2NCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHhjMCwweDAwLDB4MDAsMHhjMiwweDEwLDB4MjQsMHgwMCwweDQ0LDB4MTAsMHgyNSwweGFjLDB4YTIsMHgwMCwweDAwLAorMHg4ZSwweDAzLDB4MDEsMHhhOCwweDI3LDB4ODQsMHg4YSwweDU4LDB4OGMsMHhhNiwweDAwLDB4MDQsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MDAsMHg2NCwweDE4LDB4MjEsMHg4YywweDYyLDB4MDAsMHgwMCwweDNjLDB4MDMsMHg4MCwweDAwLDB4MDAsMHgwNywweDIwLDB4YzIsCisweDAwLDB4YzIsMHgxMCwweDI1LDB4MDAsMHg0MywweDEwLDB4MjUsMHhhYywweGEyLDB4MDAsMHgwNCwweGFmLDB4ODcsMHhiYywweDEwLAorMHg4YywweGE2LDB4MDAsMHgwMCwweDNjLDB4MDIsMHgwMCwweDgwLDB4MDAsMHgwNCwweDIyLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwNiwKKzB4YWYsMHg4NiwweGJjLDB4MTgsMHgwMCwweDgyLDB4MjAsMHgyNSwweDM0LDB4NjMsMHg4MCwweDE4LDB4OGMsMHhhNiwweDAwLDB4MDQsCisweGFjLDB4NjQsMHgwMCwweDAwLDB4OGUsMHgwMiwweDAxLDB4YTgsMHhhZiwweDg2LDB4YmMsMHgxNCwweDI0LDB4NDQsMHgwMCwweDAxLAorMHgyOCwweDgzLDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDQwLDB4MDAsMHg4MywweDEwLDB4MGEsMHg5MywweDgzLDB4ODEsMHhmMCwKKzB4MDAsMHgwMiwweDExLDB4ODMsMHgwMCwweDAyLDB4MTEsMHg4MCwweDAwLDB4ODIsMHgyMCwweDIzLDB4MjQsMHg2MywweGZmLDB4ZmYsCisweGFlLDB4MDQsMHgwMSwweGE4LDB4YTMsMHg4MywweDgxLDB4ZjAsMHg4ZSwweDA0LDB4MDEsMHhhYywweDhlLDB4MDIsMHgwMSwweGE4LAorMHgwOCwweDAwLDB4MmEsMHhjYiwweDAwLDB4NDQsMHgxMCwweDI2LDB4MGMsMHgwMCwweDJhLDB4NGMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4N2EsMHgwMiwweDBkLDB4N2MsMHgwOCwweDAwLDB4MmEsMHhjYiwweDAwLDB4NDMsMHgxMCwweDI2LDB4OGMsMHg4NiwweDAxLDB4YTgsCisweDhjLDB4ODksMHgwMSwweGFjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweGM5LDB4MDAsMHhiNCwweDAwLDB4YzAsMHg2OCwweDIxLAorMHgwMCwweDA2LDB4MTAsMHg4MCwweDI3LDB4ODMsMHg4OSwweDU4LDB4MDAsMHg0MywweDE4LDB4MjEsMHgwMCwweDQ0LDB4MTAsMHgyMSwKKzB4OGMsMHg0NywweDAwLDB4YTgsMHg5NCwweDY1LDB4MDAsMHgwMiwweDNjLDB4MDIsMHhiMCwweDAxLDB4MDAsMHhlMiwweDEwLDB4MjEsCisweDMwLDB4YTUsMHgzZiwweGZmLDB4YTQsMHg0NSwweDAwLDB4MmMsMHg5MCwweDhhLDB4MDEsMHhjMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMSwweDQwLDB4MDAsMHgwYywweDAwLDB4MDcsMHgzMiwweDAyLDB4OGMsMHg4MywweDAxLDB4YzQsMHg5MCwweDg1LDB4MDEsMHhjMSwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY0LDB4MTgsMHgyMSwweDhjLDB4NjIsMHgwMCwweGE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDIsMHgxMiwweDAyLDB4MDAsMHg0NSwweDEwLDB4MjEsMHgzMCwweDQyLDB4MDAsMHgzZiwweDE0LDB4YzIsMHhmZiwweGRlLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDQsMHhiMCwweDAxLDB4MDAsMHhlNCwweDQwLDB4MjEsMHg4ZCwweDA2LDB4MDAsMHgwMCwKKzB4MDAsMHgwZCwweDI4LDB4ODAsMHgwMCwweDA2LDB4MTQsMHgwMiwweDMwLDB4NGIsMHgwMCwweGZmLDB4MDAsMHhlYiwweDcwLDB4MjEsCisweDAxLDB4YzQsMHgyMCwweDIxLDB4OTAsMHg4MywweDAwLDB4MDAsMHgyNywweDgyLDB4ODksMHg1OCwweDAwLDB4YTIsMHgyOCwweDIxLAorMHg4YywweGE0LDB4MDAsMHgwMCwweDAwLDB4MDMsMHgxOCwweDgyLDB4MzAsMHg2MywweDAwLDB4MDMsMHgyYywweDYyLDB4MDAsMHgwMiwKKzB4MTQsMHg0MCwweDAwLDB4NjYsMHgzMCwweDhjLDB4M2YsMHhmZiwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHg2MiwweDAwLDB4NjEsCisweDJkLDB4ODIsMHgwOCwweDAwLDB4MTUsMHg0MCwweDAwLDB4MzYsMHgwMSwweDZjLDB4MTAsMHgyMSwweDAxLDB4NmMsMHgxOCwweDIxLAorMHgzMCwweDYyLDB4MDAsMHhmZiwweDAwLDB4MDIsMHgxMCwweDJiLDB4MDAsMHgwMywweDFhLDB4MDIsMHgzYywweDA0LDB4YjAsMHgwMSwKKzB4MDAsMHg2MiwweDE4LDB4MjEsMHgwMCwweGU0LDB4MjAsMHgyMSwweDI0LDB4MDIsMHgwMCwweDAxLDB4YTIsMHgwMywweDAxLDB4YzEsCisweGEwLDB4ODIsMHgwMCwweDA4LDB4OGUsMHgwNiwweDAxLDB4YTgsMHgzYywweDAzLDB4YjAsMHgwMCwweDM0LDB4NjMsMHhmZiwweGY0LAorMHgyNCwweGM1LDB4MDAsMHgwMSwweDI4LDB4YTQsMHgwMCwweDAwLDB4MjQsMHhjMiwweDAwLDB4NDAsMHgwMCwweGE0LDB4MTAsMHgwYSwKKzB4MDEsMHhjMywweDE4LDB4MjEsMHhhNCwweDZjLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxMSwweDgzLDB4MDAsMHgwMiwweDExLDB4ODAsCisweDkyLDB4MDQsMHgwMSwweGMwLDB4MDAsMHhhMiwweDM4LDB4MjMsMHgzYywweDAzLDB4YjAsMHgwMywweGFlLDB4MGIsMHgwMSwweGNjLAorMHhhZSwweDBjLDB4MDEsMHhjOCwweGFlLDB4MDYsMHgwMSwweGM0LDB4YWUsMHgwNywweDAxLDB4YTgsMHgzNCwweDYzLDB4MDEsMHgwOCwKKzB4OTIsMHgwNSwweDAxLDB4ZDYsMHg4YywweDY2LDB4MDAsMHgwMCwweDI0LDB4ODQsMHgwMCwweDAxLDB4MzAsMHg4MiwweDAwLDB4ZmYsCisweDAwLDB4NDUsMHgxMCwweDJiLDB4YWUsMHgwNiwweDAxLDB4ZDAsMHgxMCwweDQwLDB4MDAsMHgwNywweGEyLDB4MDQsMHgwMSwweGMwLAorMHg5MiwweDAyLDB4MDEsMHhkNSwweDkyLDB4MDMsMHgwMSwweGMxLDB4MjQsMHg0MiwweGZmLDB4ZmMsMHgwMCwweDYyLDB4MTgsMHgyYSwKKzB4MTQsMHg2MCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgyMCwweDIxLDB4MGMsMHgwMCwweDJhLDB4NGMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGUsMHgwOSwweDAxLDB4YWMsMHg4ZSwweDA2LDB4MDEsMHhhOCwweDA4LDB4MDAsMHgyYSwweGNiLAorMHgwMCwweGM5LDB4MTAsMHgyNiwweDhlLDB4MDksMHgwMSwweGFjLDB4MDgsMHgwMCwweDJhLDB4Y2EsMHgwMCwweGUwLDB4MzAsMHgyMSwKKzB4MzAsMHg0MywweDAwLDB4ZmYsMHg5MiwweDA3LDB4MDEsMHhjMSwweDAwLDB4MDIsMHgxMiwweDAyLDB4MzAsMHg0NCwweDAwLDB4ZmYsCisweDM4LDB4NjMsMHgwMCwweDAwLDB4MjQsMHg0NiwweDAwLDB4MDEsMHg5MiwweDA1LDB4MDEsMHhkNSwweDAwLDB4ODMsMHgzMCwweDBhLAorMHgwMCwweGM3LDB4MTgsMHgyMSwweDAwLDB4YTMsMHgxMCwweDJhLDB4MTQsMHg0MCwweGZmLDB4ZWIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHhhMiwweGZmLDB4ZmMsMHgwMCwweDYyLDB4MTAsMHgyYSwweDEwLDB4NDAsMHgwMCwweDA3LDB4MDEsMHg4MCwweDI4LDB4MjEsCisweDkyLDB4MDMsMHgwMSwweGQ2LDB4MjUsMHg0MiwweDAwLDB4MDEsMHgwMCwweDQzLDB4MTAsMHgyYSwweDE0LDB4NDAsMHgwMCwweDA3LAorMHgyNSwweGE0LDB4MDAsMHgwMSwweDAxLDB4ODAsMHgyOCwweDIxLDB4MDEsMHg2MCwweDMwLDB4MjEsMHgwYywweDAwLDB4MmEsMHg3NCwKKzB4MDIsMHgwMCwweDIwLDB4MjEsMHgwOCwweDAwLDB4MmIsMHg2ZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjgsMHg4MywweDAwLDB4MDAsCisweDI1LDB4YTIsMHgwMCwweDQwLDB4MDAsMHg4MywweDEwLDB4MGEsMHgwMCwweDAyLDB4MTEsMHg4MywweDAwLDB4MDIsMHgxMSwweDgwLAorMHgwMCwweDgyLDB4MjAsMHgyMywweDAwLDB4YzcsMHgxOCwweDIxLDB4MjUsMHg0MiwweDAwLDB4MDEsMHgwMCwweDgwLDB4MzAsMHgyMSwKKzB4YTIsMHgwMywweDAxLDB4YzEsMHhhZSwweDBiLDB4MDEsMHhjYywweGFlLDB4MGMsMHgwMSwweGM4LDB4MDgsMHgwMCwweDJhLDB4YzksCisweGEyLDB4MDIsMHgwMSwweGMwLDB4MTQsMHg0MCwweGZmLDB4OWYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE1LDB4NDAsMHgwMCwweDE0LAorMHgyNCwweDAyLDB4YzAsMHgwMCwweDAwLDB4YzIsMHgxMCwweDI0LDB4MDAsMHg0YywweDEwLDB4MjUsMHhhZCwweDAyLDB4MDAsMHgwMCwKKzB4YWYsMHg4NywweGJjLDB4MTAsMHg4ZCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDcsMHgxOCwweGMyLDB4M2MsMHgwMiwweDAwLDB4ODAsCisweDAwLDB4MDMsMHgxYSwweDAwLDB4M2MsMHgwNCwweGIwLDB4MDYsMHhhZiwweDg1LDB4YmMsMHgxOCwweDAwLDB4NjIsMHgxOCwweDI1LAorMHgzNCwweDg0LDB4ODAsMHgxOCwweDhkLDB4MDUsMHgwMCwweDA0LDB4YWMsMHg4MywweDAwLDB4MDAsMHg4ZSwweDAyLDB4MDEsMHhhOCwKKzB4OGUsMHgwOSwweDAxLDB4YWMsMHhhZiwweDg1LDB4YmMsMHgxNCwweDA4LDB4MDAsMHgyYSwweGMyLDB4MjQsMHg0NCwweDAwLDB4MDEsCisweDAxLDB4NmMsMHgxMCwweDIxLDB4MzAsMHg0NSwweDAwLDB4ZmYsMHg5MiwweDA0LDB4MDEsMHhjMSwweDAwLDB4MDIsMHgxMiwweDAyLAorMHgzMCwweDQ2LDB4MDAsMHhmZiwweDM4LDB4YTUsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4MDEsMHg5MiwweDAzLDB4MDEsMHhkNSwKKzB4MDAsMHhjNSwweDEwLDB4MGEsMHgwMCwweDgyLDB4MjAsMHgyMSwweDAwLDB4NjQsMHgxOCwweDJhLDB4MTAsMHg2MCwweGZmLDB4Y2EsCisweDAxLDB4ODAsMHgyOCwweDIxLDB4MDgsMHgwMCwweDJiLDB4NmIsMHgwMiwweDAwLDB4MjAsMHgyMSwweDkwLDB4ODcsMHgwMSwweGMwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4ZTAsMHhmZiwweDA2LDB4MDAsMHgwMCwweDI4LDB4MjEsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4MzQsMHg0MiwweDAxLDB4MDgsMHg5NCwweDgzLDB4MDEsMHhkOCwweDhjLDB4ODgsMHgwMSwweGQwLDB4OGMsMHg0NSwweDAwLDB4MDAsCisweDAxLDB4MDMsMHgxOCwweDIxLDB4MDAsMHhhMywweDEwLDB4MmIsMHgxMCwweDQwLDB4MDAsMHgwYiwweDJjLDB4ZTIsMHgwMCwweDAyLAorMHgwMCwweGE4LDB4MTAsMHgyYiwweDEwLDB4NDAsMHhmZSwweGY5LDB4MDAsMHhjOSwweDEwLDB4MjYsMHgzYywweDAyLDB4ODAsMHgwMCwKKzB4MDAsMHg2MiwweDE4LDB4MjEsMHgwMCwweGEyLDB4MTAsMHgyMSwweDAwLDB4NDMsMHgxMCwweDJiLDB4MTQsMHg0MCwweGZlLDB4ZjMsCisweDAwLDB4YzksMHgxMCwweDI2LDB4MmMsMHhlMiwweDAwLDB4MDIsMHgxMCwweDQwLDB4ZmYsMHg5MCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDE0LDB4ZTIsMHhmZSwweGVkLDB4MDAsMHhjOSwweDEwLDB4MjYsMHgzYywweDAzLDB4YjAsMHgwNiwKKzB4MzQsMHg2MywweDgwLDB4MTgsMHg4YywweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDE3LDB4MDIsCisweDE0LDB4NDAsMHhmZSwweGU1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MmIsMHg2YiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDA0LDB4YjAsMHgwMywweDNjLDB4MDYsMHhiMCwweDA3LDB4M2MsMHgwMiwweDgwLDB4MDEsMHgzNCwweGM2LDB4MDAsMHgxOCwKKzB4MzQsMHg4NCwweDAwLDB4MjAsMHgyNCwweDQyLDB4YWYsMHhhMCwweDI0LDB4MDMsMHhmZiwweDgzLDB4YWMsMHg4MiwweDAwLDB4MDAsCisweGEwLDB4YzMsMHgwMCwweDAwLDB4OTAsMHhjNCwweDAwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHhmOCwweDNjLDB4MDMsMHhiMCwweDA3LAorMHgyNCwweDAyLDB4ZmYsMHg4MiwweGEzLDB4YTQsMHgwMCwweDAwLDB4YTAsMHg2MiwweDAwLDB4MDAsMHg5MCwweDY0LDB4MDAsMHgwMCwKKzB4M2MsMHgwMiwweGIwLDB4MDcsMHgzNCwweDQyLDB4MDAsMHgwOCwweGEzLDB4YTQsMHgwMCwweDAxLDB4YTAsMHg0MCwweDAwLDB4MDAsCisweDkwLDB4NDMsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDMsMHgzYywweDA1LDB4YjAsMHgwNywweGEzLDB4YTMsMHgwMCwweDAwLAorMHhhMCwweGMyLDB4MDAsMHgwMCwweDkwLDB4YzQsMHgwMCwweDAwLDB4MzQsMHhhNSwweDAwLDB4MTAsMHgyNCwweDAyLDB4MDAsMHgwNiwKKzB4M2MsMHgwMywweGIwLDB4MDcsMHhhMywweGE0LDB4MDAsMHgwMCwweDM0LDB4NjMsMHgwMCwweDM4LDB4YTAsMHhhMiwweDAwLDB4MDAsCisweDkwLDB4NjQsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDcsMHgzNCwweDQyLDB4MDAsMHgyMCwweGEzLDB4YTQsMHgwMCwweDAwLAorMHhhMCwweGEwLDB4MDAsMHgwMCwweDkwLDB4YTMsMHgwMCwweDAwLDB4YWYsMHg4MiwweGJmLDB4MjAsMHhhMywweGEzLDB4MDAsMHgwMCwKKzB4YTAsMHg0MCwweDAwLDB4MDAsMHg5MCwweDQzLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MDgsCit9OworCit1OCBydGw4MTkwX2Z3ZGF0YV9hcnJheVtdID17CisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwOCwweDAwLAorMHgwMiwweGU5LDB4MDEsMHg3NCwweDAyLDB4YWIsMHgwMSwweGM3LDB4MDEsMHg1NSwweDAwLDB4ZTQsMHgwMCwweGFiLDB4MDAsMHg3MiwKKzB4MDAsMHg1NSwweDAwLDB4NGMsMHgwMCwweDRjLDB4MDAsMHg0YywweDAwLDB4NGMsMHgwMCwweDRjLDB4MDIsMHg3NiwweDAxLDB4M2IsCisweDAwLDB4ZDIsMHgwMCwweDllLDB4MDAsMHg2OSwweDAwLDB4NGYsMHgwMCwweDQ2LDB4MDAsMHgzZiwweDAxLDB4M2IsMHgwMCwweDllLAorMHgwMCwweDY5LDB4MDAsMHg0ZiwweDAwLDB4MzUsMHgwMCwweDI3LDB4MDAsMHgyMywweDAwLDB4MjAsMHgwMSwweDJmLDB4MDAsMHg5OCwKKzB4MDAsMHg2NSwweDAwLDB4NGMsMHgwMCwweDMzLDB4MDAsMHgyNiwweDAwLDB4MjIsMHgwMCwweDFlLDB4MDAsMHg5OCwweDAwLDB4NGMsCisweDAwLDB4MzMsMHgwMCwweDI2LDB4MDAsMHgxOSwweDAwLDB4MTMsMHgwMCwweDExLDB4MDAsMHgwZiwweDAyLDB4MzksMHgwMSwweDFjLAorMHgwMCwweGJkLDB4MDAsMHg4ZSwweDAwLDB4NWYsMHgwMCwweDQ3LDB4MDAsMHgzZiwweDAwLDB4MzksMHgwMSwweDFjLDB4MDAsMHg4ZSwKKzB4MDAsMHg1ZiwweDAwLDB4NDcsMHgwMCwweDJmLDB4MDAsMHgyMywweDAwLDB4MjAsMHgwMCwweDFjLDB4MDEsMHgxMSwweDAwLDB4ODksCisweDAwLDB4NWIsMHgwMCwweDQ0LDB4MDAsMHgyZSwweDAwLDB4MjIsMHgwMCwweDFlLDB4MDAsMHgxYiwweDAwLDB4ODksMHgwMCwweDQ0LAorMHgwMCwweDJlLDB4MDAsMHgyMiwweDAwLDB4MTcsMHgwMCwweDExLDB4MDAsMHgwZiwweDAwLDB4MGUsMHgwMiwweGFiLDB4MDIsMHhhYiwKKzB4MDIsMHg2NiwweDAyLDB4NjYsMHgwNywweDA2LDB4MDYsMHgwNiwweDA1LDB4MDYsMHgwNywweDA4LDB4MDQsMHgwNiwweDA3LDB4MDgsCisweDA5LDB4MGEsMHgwYiwweDBiLDB4NDksMHg2ZSwweDc0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1NCwweDRjLAorMHg0MiwweDRkLDB4NGYsMHg0NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NTQsMHg0YywweDQyLDB4NGMsMHg1ZiwweDY0LDB4NjEsMHg3NCwKKzB4NjEsMHgwMCwweDU0LDB4NGMsMHg0MiwweDUzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDEsMHg2NCwweDQ1LDB4NGMsCisweDVmLDB4NjQsMHg2MSwweDc0LDB4NjEsMHgwMCwweDQxLDB4NjQsMHg0NSwweDUzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg0NSwweDc4LDB4NjMsMHg0MywweDZmLDB4NjQsMHg2NSwweDM2LDB4MDAsMHgwMCwweDQ1LDB4NzgsMHg2MywweDQzLDB4NmYsMHg2NCwKKzB4NjUsMHgzNywweDAwLDB4MDAsMHg1MywweDc5LDB4NzMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQyLDB4NzAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MiwweDQ5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4NDMsMHg3MCwweDU1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0ZiwweDc2LDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMSwweDBiLDB4NTMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDJjLAorMHgwMCwweDAwLDB4MDAsMHg1OCwweDAwLDB4MDAsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLDB4NDgsMHgwMCwweDAwLDB4MDAsMHg2MCwKKzB4MDAsMHgwMCwweDAwLDB4OTAsMHgwMCwweDAwLDB4MDAsMHhjMCwweDAwLDB4MDAsMHgwMSwweDIwLDB4MDAsMHgwMCwweDAxLDB4ODAsCisweDAwLDB4MDAsMHgwMSwweGIwLDB4MDAsMHgwMCwweDAwLDB4MzQsMHgwMCwweDAwLDB4MDAsMHg2OCwweDAwLDB4MDAsMHgwMCwweDljLAorMHgwMCwweDAwLDB4MDAsMHhkMCwweDAwLDB4MDAsMHgwMSwweDM4LDB4MDAsMHgwMCwweDAxLDB4YTAsMHgwMCwweDAwLDB4MDEsMHhkNCwKKzB4MDAsMHgwMCwweDAyLDB4MDgsMHgwMCwweDAwLDB4MDAsMHg2OCwweDAwLDB4MDAsMHgwMCwweGQwLDB4MDAsMHgwMCwweDAxLDB4MzgsCisweDAwLDB4MDAsMHgwMSwweGEwLDB4MDAsMHgwMCwweDAyLDB4NmYsMHgwMCwweDAwLDB4MDMsMHg0MCwweDAwLDB4MDAsMHgwMywweGE4LAorMHgwMCwweDAwLDB4MDQsMHgxMCwweDAxLDB4MDEsMHgwMSwweDAyLDB4MDEsMHgwMSwweDAyLDB4MDIsMHgwMywweDAzLDB4MDQsMHgwNCwKKzB4MDEsMHgwMSwweDAyLDB4MDIsMHgwMywweDAzLDB4MDQsMHgwNCwweDAyLDB4MDMsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDcsMHg3NCwweDgwLDB4MDAsMHgwNywweDg4LAorMHg4MCwweDAwLDB4MDcsMHg4OCwweDgwLDB4MDAsMHgwNywweDc4LDB4ODAsMHgwMCwweDA3LDB4NzgsMHg4MCwweDAwLDB4MDcsMHg5YywKKzB4ODAsMHgwMCwweDUzLDB4YzQsMHg4MCwweDAwLDB4NTQsMHgyNCwweDgwLDB4MDAsMHg1NCwweDM4LDB4ODAsMHgwMCwweDU0LDB4NWMsCisweDgwLDB4MDAsMHg1NCwweDY4LDB4ODAsMHgwMCwweDU0LDB4YTgsMHg4MCwweDAwLDB4NTYsMHhhOCwweDgwLDB4MDAsMHg1NywweGVjLAorMHg4MCwweDAwLDB4NTgsMHgxNCwweDgwLDB4MDAsMHg1OSwweDBjLDB4ODAsMHgwMCwweDU5LDB4YzQsMHg4MCwweDAwLDB4NWEsMHg2YywKKzB4ODAsMHgwMCwweDVhLDB4ZTAsMHg4MCwweDAwLDB4NWIsMHhlYywweDgwLDB4MDAsMHg1YywweDI0LDB4ODAsMHgwMCwweDVjLDB4MzgsCisweDgwLDB4MDAsMHg1YywweDRjLDB4ODAsMHgwMCwweDVkLDB4NDAsMHg4MCwweDAwLDB4NWQsMHg4MCwweDgwLDB4MDAsMHg1ZSwweDM0LAorMHg4MCwweDAwLDB4NWUsMHg1YywweDgwLDB4MDAsMHg1NiwweDY4LDB4ODAsMHgwMCwweDVlLDB4NzgsMHg4MCwweDAwLDB4ODgsMHhmOCwKKzB4ODAsMHgwMCwweDg4LDB4ZjgsMHg4MCwweDAwLDB4ODgsMHhmOCwweDgwLDB4MDAsMHg4OSwweDJjLDB4ODAsMHgwMCwweDg5LDB4NmMsCisweDgwLDB4MDAsMHg4OSwweGE0LDB4ODAsMHgwMCwweDg5LDB4ZDQsMHg4MCwweDAwLDB4OGEsMHgxMCwweDgwLDB4MDAsMHg4YSwweDUwLAorMHg4MCwweDAwLDB4OGEsMHhiOCwweDgwLDB4MDAsMHg4YSwweGNjLDB4ODAsMHgwMCwweDhiLDB4MDgsMHg4MCwweDAwLDB4OGIsMHgxMCwKKzB4ODAsMHgwMCwweDhiLDB4NGMsMHg4MCwweDAwLDB4OGIsMHg2MCwweDgwLDB4MDAsMHg4YiwweDY4LDB4ODAsMHgwMCwweDhiLDB4NzAsCisweDgwLDB4MDAsMHg4YiwweDcwLDB4ODAsMHgwMCwweDhiLDB4NzAsMHg4MCwweDAwLDB4OGIsMHg3MCwweDgwLDB4MDAsMHg4YSwweDkwLAorMHg4MCwweDAwLDB4OGIsMHhhMCwweDgwLDB4MDAsMHg4YiwweGI0LDB4ODAsMHgwMCwweDg4LDB4NTQsMHg4MCwweDAwLDB4OGUsMHhjOCwKKzB4ODAsMHgwMCwweDhlLDB4YzgsMHg4MCwweDAwLDB4OGUsMHhjOCwweDgwLDB4MDAsMHg4ZSwweGZjLDB4ODAsMHgwMCwweDhmLDB4M2MsCisweDgwLDB4MDAsMHg4ZiwweDc0LDB4ODAsMHgwMCwweDhmLDB4YTQsMHg4MCwweDAwLDB4OGYsMHhlMCwweDgwLDB4MDAsMHg5MCwweDIwLAorMHg4MCwweDAwLDB4OTAsMHg4OCwweDgwLDB4MDAsMHg5MCwweDljLDB4ODAsMHgwMCwweDkwLDB4ZDgsMHg4MCwweDAwLDB4OTAsMHhlMCwKKzB4ODAsMHgwMCwweDkxLDB4MWMsMHg4MCwweDAwLDB4OTEsMHgzMCwweDgwLDB4MDAsMHg5MSwweDM4LDB4ODAsMHgwMCwweDkxLDB4NDAsCisweDgwLDB4MDAsMHg5MSwweDQwLDB4ODAsMHgwMCwweDkxLDB4NDAsMHg4MCwweDAwLDB4OTEsMHg0MCwweDgwLDB4MDAsMHg5MCwweDYwLAorMHg4MCwweDAwLDB4OTEsMHg3MCwweDgwLDB4MDAsMHg5MSwweDg0LDB4ODAsMHgwMCwweDhkLDB4MDAsfTsKKwordTMyIFJ0bDgxOTJVc2JQSFlfUkVHQXJyYXlbXSA9IHsKKzB4MCwgfTsKKwordTMyIFJ0bDgxOTJVc2JQSFlfUkVHXzFUMlJBcnJheVtdID0geworMHg4MDAsMHgwMDAwMDAwMCwKKzB4ODA0LDB4MDAwMDAwMDEsCisweDgwOCwweDAwMDBmYzAwLAorMHg4MGMsMHgwMDAwMDAxYywKKzB4ODEwLDB4ODAxMDEwYWEsCisweDgxNCwweDAwODUxNGQwLAorMHg4MTgsMHgwMDAwMDA0MCwKKzB4ODFjLDB4MDAwMDAwMDAsCisweDgyMCwweDAwMDAwMDA0LAorMHg4MjQsMHgwMDY5MDAwMCwKKzB4ODI4LDB4MDAwMDAwMDQsCisweDgyYywweDAwZTkwMDAwLAorMHg4MzAsMHgwMDAwMDAwNCwKKzB4ODM0LDB4MDA2OTAwMDAsCisweDgzOCwweDAwMDAwMDA0LAorMHg4M2MsMHgwMGU5MDAwMCwKKzB4ODQwLDB4MDAwMDAwMDAsCisweDg0NCwweDAwMDAwMDAwLAorMHg4NDgsMHgwMDAwMDAwMCwKKzB4ODRjLDB4MDAwMDAwMDAsCisweDg1MCwweDAwMDAwMDAwLAorMHg4NTQsMHgwMDAwMDAwMCwKKzB4ODU4LDB4NjVhOTY1YTksCisweDg1YywweDY1YTk2NWE5LAorMHg4NjAsMHgwMDFmMDAxMCwKKzB4ODY0LDB4MDA3ZjAwMTAsCisweDg2OCwweDAwMWYwMDEwLAorMHg4NmMsMHgwMDdmMDAxMCwKKzB4ODcwLDB4MGYxMDBmNzAsCisweDg3NCwweDBmMTAwZjcwLAorMHg4NzgsMHgwMDAwMDAwMCwKKzB4ODdjLDB4MDAwMDAwMDAsCisweDg4MCwweDY4NzBlMzZjLAorMHg4ODQsMHhlMzU3MzYwMCwKKzB4ODg4LDB4NDI2MGMzNDAsCisweDg4YywweDAwMDBmZjAwLAorMHg4OTAsMHgwMDAwMDAwMCwKKzB4ODk0LDB4ZmZmZmZmZmUsCisweDg5OCwweDRjNDIzODJmLAorMHg4OWMsMHgwMDY1NjA1NiwKKzB4OGIwLDB4MDAwMDAwMDAsCisweDhlMCwweDAwMDAwMDAwLAorMHg4ZTQsMHgwMDAwMDAwMCwKKzB4OTAwLDB4MDAwMDAwMDAsCisweDkwNCwweDAwMDAwMDIzLAorMHg5MDgsMHgwMDAwMDAwMCwKKzB4OTBjLDB4MzExMjEzMTEsCisweGEwMCwweDAwZDBjN2Q4LAorMHhhMDQsMHg4MTFmMDAwOCwKKzB4YTA4LDB4ODBjZDgzMDAsCisweGEwYywweDJlNjI3NDBmLAorMHhhMTAsMHg5NTAwOWI3OCwKKzB4YTE0LDB4MTExNDUwMDgsCisweGExOCwweDAwODgxMTE3LAorMHhhMWMsMHg4OTE0MGZhMCwKKzB4YTIwLDB4MWExYjAwMDAsCisweGEyNCwweDA5MGUxMzE3LAorMHhhMjgsMHgwMDAwMDIwNCwKKzB4YTJjLDB4MDAwMDAwMDAsCisweGMwMCwweDAwMDAwMDQwLAorMHhjMDQsMHgwMDAwNTQzMywKKzB4YzA4LDB4MDAwMDAwZTQsCisweGMwYywweDZjNmM2YzZjLAorMHhjMTAsMHgwODgwMDAwMCwKKzB4YzE0LDB4NDAwMDAxMDAsCisweGMxOCwweDA4MDAwMDAwLAorMHhjMWMsMHg0MDAwMDEwMCwKKzB4YzIwLDB4MDgwMDAwMDAsCisweGMyNCwweDQwMDAwMTAwLAorMHhjMjgsMHgwODAwMDAwMCwKKzB4YzJjLDB4NDAwMDAxMDAsCisweGMzMCwweDZkZTlhYzQ0LAorMHhjMzQsMHg0NjVjNTJjZCwKKzB4YzM4LDB4NDk3ZjU5OTQsCisweGMzYywweDBhOTY5NzY0LAorMHhjNDAsMHgxZjdjNDAzZiwKKzB4YzQ0LDB4MDAwMTAwYjcsCisweGM0OCwweGVjMDIwMDAwLAorMHhjNGMsMHgwMDAwMDMwMCwKKzB4YzUwLDB4Njk1NDM0MjAsCisweGM1NCwweDQzM2MwMDk0LAorMHhjNTgsMHg2OTU0MzQyMCwKKzB4YzVjLDB4NDMzYzAwOTQsCisweGM2MCwweDY5NTQzNDIwLAorMHhjNjQsMHg0MzNjMDA5NCwKKzB4YzY4LDB4Njk1NDM0MjAsCisweGM2YywweDQzM2MwMDk0LAorMHhjNzAsMHgyYzdmMDAwZCwKKzB4Yzc0LDB4MDE4NjE3NWIsCisweGM3OCwweDAwMDAwMDFmLAorMHhjN2MsMHgwMGI5MTYxMiwKKzB4YzgwLDB4NDAwMDAxMDAsCisweGM4NCwweDIwMDAwMDAwLAorMHhjODgsMHg0MDAwMDEwMCwKKzB4YzhjLDB4MjAyMDAwMDAsCisweGM5MCwweDQwMDAwMTAwLAorMHhjOTQsMHgwMDAwMDAwMCwKKzB4Yzk4LDB4NDAwMDAxMDAsCisweGM5YywweDAwMDAwMDAwLAorMHhjYTAsMHgwMDQ5MjQ5MiwKKzB4Y2E0LDB4MDAwMDAwMDAsCisweGNhOCwweDAwMDAwMDAwLAorMHhjYWMsMHgwMDAwMDAwMCwKKzB4Y2IwLDB4MDAwMDAwMDAsCisweGNiNCwweDAwMDAwMDAwLAorMHhjYjgsMHgwMDAwMDAwMCwKKzB4Y2JjLDB4MDA0OTI0OTIsCisweGNjMCwweDAwMDAwMDAwLAorMHhjYzQsMHgwMDAwMDAwMCwKKzB4Y2M4LDB4MDAwMDAwMDAsCisweGNjYywweDAwMDAwMDAwLAorMHhjZDAsMHgwMDAwMDAwMCwKKzB4Y2Q0LDB4MDAwMDAwMDAsCisweGNkOCwweDY0YjIyNDI3LAorMHhjZGMsMHgwMDc2NjkzMiwKKzB4Y2UwLDB4MDAyMjIyMjIsCisweGQwMCwweDAwMDAwNzUwLAorMHhkMDQsMHgwMDAwMDQwMywKKzB4ZDA4LDB4MDAwMDkwN2YsCisweGQwYywweDAwMDAwMDAxLAorMHhkMTAsMHhhMDYzMzMzMywKKzB4ZDE0LDB4MzMzMzNjNjMsCisweGQxOCwweDZhOGY1YjZiLAorMHhkMWMsMHgwMDAwMDAwMCwKKzB4ZDIwLDB4MDAwMDAwMDAsCisweGQyNCwweDAwMDAwMDAwLAorMHhkMjgsMHgwMDAwMDAwMCwKKzB4ZDJjLDB4Y2M5Nzk5NzUsCisweGQzMCwweDAwMDAwMDAwLAorMHhkMzQsMHgwMDAwMDAwMCwKKzB4ZDM4LDB4MDAwMDAwMDAsCisweGQzYywweDAwMDI3MjkzLAorMHhkNDAsMHgwMDAwMDAwMCwKKzB4ZDQ0LDB4MDAwMDAwMDAsCisweGQ0OCwweDAwMDAwMDAwLAorMHhkNGMsMHgwMDAwMDAwMCwKKzB4ZDUwLDB4NjQzNzE0MGEsCisweGQ1NCwweDAyNGRiZDAyLAorMHhkNTgsMHgwMDAwMDAwMCwKKzB4ZDVjLDB4MDQwMzIwNjQsCisweGUwMCwweDE2MWExYTFhLAorMHhlMDQsMHgxMjEyMTQxNiwKKzB4ZTA4LDB4MDAwMDE4MDAsCisweGUwYywweDAwMDAwMDAwLAorMHhlMTAsMHgxNjFhMWExYSwKKzB4ZTE0LDB4MTIxMjE0MTYsCisweGUxOCwweDE2MWExYTFhLAorMHhlMWMsMHgxMjEyMTQxNiwKK307CisKK3UzMiBSdGw4MTkyVXNiUmFkaW9BX0FycmF5W10gPSB7CisweDAxOSwweDAwMDAwMDAzLAorMHgwMDAsMHgwMDAwMDBiZiwKKzB4MDAxLDB4MDAwMDBlZTAsCisweDAwMiwweDAwMDAwMDRjLAorMHgwMDMsMHgwMDAwMDdmMSwKKzB4MDA0LDB4MDAwMDA5NzUsCisweDAwNSwweDAwMDAwYzU4LAorMHgwMDYsMHgwMDAwMGFlNiwKKzB4MDA3LDB4MDAwMDAwY2EsCisweDAwOCwweDAwMDAwZTFjLAorMHgwMDksMHgwMDAwMDdmMCwKKzB4MDBhLDB4MDAwMDA5ZDAsCisweDAwYiwweDAwMDAwMWJhLAorMHgwMGMsMHgwMDAwMDI0MCwKKzB4MDBlLDB4MDAwMDAwMjAsCisweDAwZiwweDAwMDAwOTkwLAorMHgwMTIsMHgwMDAwMDgwNiwKKzB4MDE0LDB4MDAwMDA1YWIsCisweDAxNSwweDAwMDAwZjgwLAorMHgwMTYsMHgwMDAwMDAyMCwKKzB4MDE3LDB4MDAwMDA1OTcsCisweDAxOCwweDAwMDAwNTBhLAorMHgwMWEsMHgwMDAwMGY4MCwKKzB4MDFiLDB4MDAwMDBmNWUsCisweDAxYywweDAwMDAwMDA4LAorMHgwMWQsMHgwMDAwMDYwNywKKzB4MDFlLDB4MDAwMDA2Y2MsCisweDAxZiwweDAwMDAwMDAwLAorMHgwMjAsMHgwMDAwMDFhNSwKKzB4MDFmLDB4MDAwMDAwMDEsCisweDAyMCwweDAwMDAwMTY1LAorMHgwMWYsMHgwMDAwMDAwMiwKKzB4MDIwLDB4MDAwMDAwYzYsCisweDAxZiwweDAwMDAwMDAzLAorMHgwMjAsMHgwMDAwMDA4NiwKKzB4MDFmLDB4MDAwMDAwMDQsCisweDAyMCwweDAwMDAwMDQ2LAorMHgwMWYsMHgwMDAwMDAwNSwKKzB4MDIwLDB4MDAwMDAxZTYsCisweDAxZiwweDAwMDAwMDA2LAorMHgwMjAsMHgwMDAwMDFhNiwKKzB4MDFmLDB4MDAwMDAwMDcsCisweDAyMCwweDAwMDAwMTY2LAorMHgwMWYsMHgwMDAwMDAwOCwKKzB4MDIwLDB4MDAwMDAwYzcsCisweDAxZiwweDAwMDAwMDA5LAorMHgwMjAsMHgwMDAwMDA4NywKKzB4MDFmLDB4MDAwMDAwMGEsCisweDAyMCwweDAwMDAwMGY3LAorMHgwMWYsMHgwMDAwMDAwYiwKKzB4MDIwLDB4MDAwMDAwZDcsCisweDAxZiwweDAwMDAwMDBjLAorMHgwMjAsMHgwMDAwMDBiNywKKzB4MDFmLDB4MDAwMDAwMGQsCisweDAyMCwweDAwMDAwMDk3LAorMHgwMWYsMHgwMDAwMDAwZSwKKzB4MDIwLDB4MDAwMDAwNzcsCisweDAxZiwweDAwMDAwMDBmLAorMHgwMjAsMHgwMDAwMDA1NywKKzB4MDFmLDB4MDAwMDAwMTAsCisweDAyMCwweDAwMDAwMDM3LAorMHgwMWYsMHgwMDAwMDAxMSwKKzB4MDIwLDB4MDAwMDAwZmIsCisweDAxZiwweDAwMDAwMDEyLAorMHgwMjAsMHgwMDAwMDBkYiwKKzB4MDFmLDB4MDAwMDAwMTMsCisweDAyMCwweDAwMDAwMGJiLAorMHgwMWYsMHgwMDAwMDAxNCwKKzB4MDIwLDB4MDAwMDAwZmYsCisweDAxZiwweDAwMDAwMDE1LAorMHgwMjAsMHgwMDAwMDBlMywKKzB4MDFmLDB4MDAwMDAwMTYsCisweDAyMCwweDAwMDAwMGMzLAorMHgwMWYsMHgwMDAwMDAxNywKKzB4MDIwLDB4MDAwMDAwYTMsCisweDAxZiwweDAwMDAwMDE4LAorMHgwMjAsMHgwMDAwMDA4MywKKzB4MDFmLDB4MDAwMDAwMTksCisweDAyMCwweDAwMDAwMDYzLAorMHgwMWYsMHgwMDAwMDAxYSwKKzB4MDIwLDB4MDAwMDAwNDMsCisweDAxZiwweDAwMDAwMDFiLAorMHgwMjAsMHgwMDAwMDAyMywKKzB4MDFmLDB4MDAwMDAwMWMsCisweDAyMCwweDAwMDAwMDAzLAorMHgwMWYsMHgwMDAwMDAxZCwKKzB4MDIwLDB4MDAwMDAxZTMsCisweDAxZiwweDAwMDAwMDFlLAorMHgwMjAsMHgwMDAwMDFjMywKKzB4MDFmLDB4MDAwMDAwMWYsCisweDAyMCwweDAwMDAwMWEzLAorMHgwMWYsMHgwMDAwMDAyMCwKKzB4MDIwLDB4MDAwMDAxODMsCisweDAxZiwweDAwMDAwMDIxLAorMHgwMjAsMHgwMDAwMDE2MywKKzB4MDFmLDB4MDAwMDAwMjIsCisweDAyMCwweDAwMDAwMTQzLAorMHgwMWYsMHgwMDAwMDAyMywKKzB4MDIwLDB4MDAwMDAxMjMsCisweDAxZiwweDAwMDAwMDI0LAorMHgwMjAsMHgwMDAwMDEwMywKKzB4MDIzLDB4MDAwMDAyMDMsCisweDAyNCwweDAwMDAwMjAwLAorMHgwMGIsMHgwMDAwMDFiYSwKKzB4MDJjLDB4MDAwMDAzZDcsCisweDAyZCwweDAwMDAwZmYwLAorMHgwMDAsMHgwMDAwMDAzNywKKzB4MDA0LDB4MDAwMDAxNjAsCisweDAwNywweDAwMDAwMDgwLAorMHgwMDIsMHgwMDAwMDg4ZCwKKzB4MGZlLDB4MDAwMDAwMDAsCisweDBmZSwweDAwMDAwMDAwLAorMHgwMTYsMHgwMDAwMDIwMCwKKzB4MDE2LDB4MDAwMDAzODAsCisweDAxNiwweDAwMDAwMDIwLAorMHgwMTYsMHgwMDAwMDFhMCwKKzB4MDAwLDB4MDAwMDAwYmYsCisweDAwZCwweDAwMDAwMDFmLAorMHgwMGQsMHgwMDAwMGM5ZiwKKzB4MDAyLDB4MDAwMDAwNGQsCisweDAwMCwweDAwMDAwY2JmLAorMHgwMDQsMHgwMDAwMDk3NSwKKzB4MDA3LDB4MDAwMDA3MDAsCit9OworCit1MzIgUnRsODE5MlVzYlJhZGlvQl9BcnJheVtdID0geworMHgwMTksMHgwMDAwMDAwMywKKzB4MDAwLDB4MDAwMDAwYmYsCisweDAwMSwweDAwMDAwNmUwLAorMHgwMDIsMHgwMDAwMDA0YywKKzB4MDAzLDB4MDAwMDA3ZjEsCisweDAwNCwweDAwMDAwOTc1LAorMHgwMDUsMHgwMDAwMGM1OCwKKzB4MDA2LDB4MDAwMDBhZTYsCisweDAwNywweDAwMDAwMGNhLAorMHgwMDgsMHgwMDAwMGUxYywKKzB4MDAwLDB4MDAwMDAwYjcsCisweDAwYSwweDAwMDAwODUwLAorMHgwMDAsMHgwMDAwMDBiZiwKKzB4MDBiLDB4MDAwMDAxYmEsCisweDAwYywweDAwMDAwMjQwLAorMHgwMGUsMHgwMDAwMDAyMCwKKzB4MDE1LDB4MDAwMDBmODAsCisweDAxNiwweDAwMDAwMDIwLAorMHgwMTcsMHgwMDAwMDU5NywKKzB4MDE4LDB4MDAwMDA1MGEsCisweDAxYSwweDAwMDAwZTAwLAorMHgwMWIsMHgwMDAwMGY1ZSwKKzB4MDFkLDB4MDAwMDA2MDcsCisweDAxZSwweDAwMDAwNmNjLAorMHgwMGIsMHgwMDAwMDFiYSwKKzB4MDIzLDB4MDAwMDAyMDMsCisweDAyNCwweDAwMDAwMjAwLAorMHgwMDAsMHgwMDAwMDAzNywKKzB4MDA0LDB4MDAwMDAxNjAsCisweDAxNiwweDAwMDAwMjAwLAorMHgwMTYsMHgwMDAwMDM4MCwKKzB4MDE2LDB4MDAwMDAwMjAsCisweDAxNiwweDAwMDAwMWEwLAorMHgwMGQsMHgwMDAwMGNjYywKKzB4MDAwLDB4MDAwMDAwYmYsCisweDAwMiwweDAwMDAwMDRkLAorMHgwMDAsMHgwMDAwMGNiZiwKKzB4MDA0LDB4MDAwMDA5NzUsCisweDAwNywweDAwMDAwNzAwLAorfTsKKwordTMyIFJ0bDgxOTJVc2JSYWRpb0NfQXJyYXlbXSA9IHsKKzB4MCwgfTsKKwordTMyIFJ0bDgxOTJVc2JSYWRpb0RfQXJyYXlbXSA9IHsKKzB4MCwgfTsKKwordTMyIFJ0bDgxOTJVc2JNQUNQSFlfQXJyYXlbXSA9IHsKKzB4MDNjLDB4ZmZmZjAwMDAsMHgwMDAwMGYwZiwKKzB4MzQwLDB4ZmZmZmZmZmYsMHgxNjFhMWExYSwKKzB4MzQ0LDB4ZmZmZmZmZmYsMHgxMjEyMTQxNiwKKzB4MzQ4LDB4MDAwMGZmZmYsMHgwMDAwMTgxOCwKKzB4MTJjLDB4ZmZmZmZmZmYsMHgwNDAwMDgwMiwKKzB4MzE4LDB4MDAwMDBmZmYsMHgwMDAwMDEwMCwKK307CisKK3UzMiBSdGw4MTkyVXNiTUFDUEhZX0FycmF5X1BHW10gPSB7CisweDAzYywweGZmZmYwMDAwLDB4MDAwMDBmMGYsCisweGUwMCwweGZmZmZmZmZmLDB4MDYwOTA5MDksCisweGUwNCwweGZmZmZmZmZmLDB4MDAwMzAzMDYsCisweGUwOCwweDAwMDBmZjAwLDB4MDAwMDAwMDAsCisweGUxMCwweGZmZmZmZmZmLDB4MGEwYzBkMGYsCisweGUxNCwweGZmZmZmZmZmLDB4MDYwNzA4MDksCisweGUxOCwweGZmZmZmZmZmLDB4MGEwYzBkMGYsCisweGUxYywweGZmZmZmZmZmLDB4MDYwNzA4MDksCisweDEyYywweGZmZmZmZmZmLDB4MDQwMDA4MDIsCisweDMxOCwweDAwMDAwZmZmLDB4MDAwMDA4MDAsCit9OworCit1MzIgUnRsODE5MlVzYkFHQ1RBQl9BcnJheVtdID0geworMHhjNzgsMHg3ZDAwMDAwMSwKKzB4Yzc4LDB4N2QwMTAwMDEsCisweGM3OCwweDdkMDIwMDAxLAorMHhjNzgsMHg3ZDAzMDAwMSwKKzB4Yzc4LDB4N2QwNDAwMDEsCisweGM3OCwweDdkMDUwMDAxLAorMHhjNzgsMHg3YzA2MDAwMSwKKzB4Yzc4LDB4N2IwNzAwMDEsCisweGM3OCwweDdhMDgwMDAxLAorMHhjNzgsMHg3OTA5MDAwMSwKKzB4Yzc4LDB4NzgwYTAwMDEsCisweGM3OCwweDc3MGIwMDAxLAorMHhjNzgsMHg3NjBjMDAwMSwKKzB4Yzc4LDB4NzUwZDAwMDEsCisweGM3OCwweDc0MGUwMDAxLAorMHhjNzgsMHg3MzBmMDAwMSwKKzB4Yzc4LDB4NzIxMDAwMDEsCisweGM3OCwweDcxMTEwMDAxLAorMHhjNzgsMHg3MDEyMDAwMSwKKzB4Yzc4LDB4NmYxMzAwMDEsCisweGM3OCwweDZlMTQwMDAxLAorMHhjNzgsMHg2ZDE1MDAwMSwKKzB4Yzc4LDB4NmMxNjAwMDEsCisweGM3OCwweDZiMTcwMDAxLAorMHhjNzgsMHg2YTE4MDAwMSwKKzB4Yzc4LDB4NjkxOTAwMDEsCisweGM3OCwweDY4MWEwMDAxLAorMHhjNzgsMHg2NzFiMDAwMSwKKzB4Yzc4LDB4NjYxYzAwMDEsCisweGM3OCwweDY1MWQwMDAxLAorMHhjNzgsMHg2NDFlMDAwMSwKKzB4Yzc4LDB4NDkxZjAwMDEsCisweGM3OCwweDQ4MjAwMDAxLAorMHhjNzgsMHg0NzIxMDAwMSwKKzB4Yzc4LDB4NDYyMjAwMDEsCisweGM3OCwweDQ1MjMwMDAxLAorMHhjNzgsMHg0NDI0MDAwMSwKKzB4Yzc4LDB4NDMyNTAwMDEsCisweGM3OCwweDI4MjYwMDAxLAorMHhjNzgsMHgyNzI3MDAwMSwKKzB4Yzc4LDB4MjYyODAwMDEsCisweGM3OCwweDI1MjkwMDAxLAorMHhjNzgsMHgyNDJhMDAwMSwKKzB4Yzc4LDB4MjMyYjAwMDEsCisweGM3OCwweDIyMmMwMDAxLAorMHhjNzgsMHgyMTJkMDAwMSwKKzB4Yzc4LDB4MjAyZTAwMDEsCisweGM3OCwweDBhMmYwMDAxLAorMHhjNzgsMHgwODMwMDAwMSwKKzB4Yzc4LDB4MDYzMTAwMDEsCisweGM3OCwweDA1MzIwMDAxLAorMHhjNzgsMHgwNDMzMDAwMSwKKzB4Yzc4LDB4MDMzNDAwMDEsCisweGM3OCwweDAyMzUwMDAxLAorMHhjNzgsMHgwMTM2MDAwMSwKKzB4Yzc4LDB4MDAzNzAwMDEsCisweGM3OCwweDAwMzgwMDAxLAorMHhjNzgsMHgwMDM5MDAwMSwKKzB4Yzc4LDB4MDAzYTAwMDEsCisweGM3OCwweDAwM2IwMDAxLAorMHhjNzgsMHgwMDNjMDAwMSwKKzB4Yzc4LDB4MDAzZDAwMDEsCisweGM3OCwweDAwM2UwMDAxLAorMHhjNzgsMHgwMDNmMDAwMSwKKzB4Yzc4LDB4N2Q0MDAwMDEsCisweGM3OCwweDdkNDEwMDAxLAorMHhjNzgsMHg3ZDQyMDAwMSwKKzB4Yzc4LDB4N2Q0MzAwMDEsCisweGM3OCwweDdkNDQwMDAxLAorMHhjNzgsMHg3ZDQ1MDAwMSwKKzB4Yzc4LDB4N2M0NjAwMDEsCisweGM3OCwweDdiNDcwMDAxLAorMHhjNzgsMHg3YTQ4MDAwMSwKKzB4Yzc4LDB4Nzk0OTAwMDEsCisweGM3OCwweDc4NGEwMDAxLAorMHhjNzgsMHg3NzRiMDAwMSwKKzB4Yzc4LDB4NzY0YzAwMDEsCisweGM3OCwweDc1NGQwMDAxLAorMHhjNzgsMHg3NDRlMDAwMSwKKzB4Yzc4LDB4NzM0ZjAwMDEsCisweGM3OCwweDcyNTAwMDAxLAorMHhjNzgsMHg3MTUxMDAwMSwKKzB4Yzc4LDB4NzA1MjAwMDEsCisweGM3OCwweDZmNTMwMDAxLAorMHhjNzgsMHg2ZTU0MDAwMSwKKzB4Yzc4LDB4NmQ1NTAwMDEsCisweGM3OCwweDZjNTYwMDAxLAorMHhjNzgsMHg2YjU3MDAwMSwKKzB4Yzc4LDB4NmE1ODAwMDEsCisweGM3OCwweDY5NTkwMDAxLAorMHhjNzgsMHg2ODVhMDAwMSwKKzB4Yzc4LDB4Njc1YjAwMDEsCisweGM3OCwweDY2NWMwMDAxLAorMHhjNzgsMHg2NTVkMDAwMSwKKzB4Yzc4LDB4NjQ1ZTAwMDEsCisweGM3OCwweDQ5NWYwMDAxLAorMHhjNzgsMHg0ODYwMDAwMSwKKzB4Yzc4LDB4NDc2MTAwMDEsCisweGM3OCwweDQ2NjIwMDAxLAorMHhjNzgsMHg0NTYzMDAwMSwKKzB4Yzc4LDB4NDQ2NDAwMDEsCisweGM3OCwweDQzNjUwMDAxLAorMHhjNzgsMHgyODY2MDAwMSwKKzB4Yzc4LDB4Mjc2NzAwMDEsCisweGM3OCwweDI2NjgwMDAxLAorMHhjNzgsMHgyNTY5MDAwMSwKKzB4Yzc4LDB4MjQ2YTAwMDEsCisweGM3OCwweDIzNmIwMDAxLAorMHhjNzgsMHgyMjZjMDAwMSwKKzB4Yzc4LDB4MjE2ZDAwMDEsCisweGM3OCwweDIwNmUwMDAxLAorMHhjNzgsMHgwYTZmMDAwMSwKKzB4Yzc4LDB4MDg3MDAwMDEsCisweGM3OCwweDA2NzEwMDAxLAorMHhjNzgsMHgwNTcyMDAwMSwKKzB4Yzc4LDB4MDQ3MzAwMDEsCisweGM3OCwweDAzNzQwMDAxLAorMHhjNzgsMHgwMjc1MDAwMSwKKzB4Yzc4LDB4MDE3NjAwMDEsCisweGM3OCwweDAwNzcwMDAxLAorMHhjNzgsMHgwMDc4MDAwMSwKKzB4Yzc4LDB4MDA3OTAwMDEsCisweGM3OCwweDAwN2EwMDAxLAorMHhjNzgsMHgwMDdiMDAwMSwKKzB4Yzc4LDB4MDA3YzAwMDEsCisweGM3OCwweDAwN2QwMDAxLAorMHhjNzgsMHgwMDdlMDAwMSwKKzB4Yzc4LDB4MDA3ZjAwMDEsCisweGM3OCwweDJlMDAwMDFlLAorMHhjNzgsMHgyZTAxMDAxZSwKKzB4Yzc4LDB4MmUwMjAwMWUsCisweGM3OCwweDJlMDMwMDFlLAorMHhjNzgsMHgyZTA0MDAxZSwKKzB4Yzc4LDB4MmUwNTAwMWUsCisweGM3OCwweDMwMDYwMDFlLAorMHhjNzgsMHgzNDA3MDAxZSwKKzB4Yzc4LDB4MzkwODAwMWUsCisweGM3OCwweDNjMDkwMDFlLAorMHhjNzgsMHgzZjBhMDAxZSwKKzB4Yzc4LDB4NDIwYjAwMWUsCisweGM3OCwweDQ0MGMwMDFlLAorMHhjNzgsMHg0NTBkMDAxZSwKKzB4Yzc4LDB4NDYwZTAwMWUsCisweGM3OCwweDQ2MGYwMDFlLAorMHhjNzgsMHg0NzEwMDAxZSwKKzB4Yzc4LDB4NDgxMTAwMWUsCisweGM3OCwweDQ5MTIwMDFlLAorMHhjNzgsMHg0YTEzMDAxZSwKKzB4Yzc4LDB4NGIxNDAwMWUsCisweGM3OCwweDRiMTUwMDFlLAorMHhjNzgsMHg0YzE2MDAxZSwKKzB4Yzc4LDB4NGQxNzAwMWUsCisweGM3OCwweDRlMTgwMDFlLAorMHhjNzgsMHg0ZjE5MDAxZSwKKzB4Yzc4LDB4NGYxYTAwMWUsCisweGM3OCwweDUwMWIwMDFlLAorMHhjNzgsMHg1MTFjMDAxZSwKKzB4Yzc4LDB4NTIxZDAwMWUsCisweGM3OCwweDUyMWUwMDFlLAorMHhjNzgsMHg1MzFmMDAxZSwKKzB4Yzc4LDB4NTMyMDAwMWUsCisweGM3OCwweDU0MjEwMDFlLAorMHhjNzgsMHg1NTIyMDAxZSwKKzB4Yzc4LDB4NTUyMzAwMWUsCisweGM3OCwweDU2MjQwMDFlLAorMHhjNzgsMHg1NzI1MDAxZSwKKzB4Yzc4LDB4NTcyNjAwMWUsCisweGM3OCwweDU4MjcwMDFlLAorMHhjNzgsMHg1ODI4MDAxZSwKKzB4Yzc4LDB4NTkyOTAwMWUsCisweGM3OCwweDU5MmEwMDFlLAorMHhjNzgsMHg1YTJiMDAxZSwKKzB4Yzc4LDB4NWIyYzAwMWUsCisweGM3OCwweDVjMmQwMDFlLAorMHhjNzgsMHg1YzJlMDAxZSwKKzB4Yzc4LDB4NWQyZjAwMWUsCisweGM3OCwweDVlMzAwMDFlLAorMHhjNzgsMHg1ZjMxMDAxZSwKKzB4Yzc4LDB4NjAzMjAwMWUsCisweGM3OCwweDYwMzMwMDFlLAorMHhjNzgsMHg2MTM0MDAxZSwKKzB4Yzc4LDB4NjIzNTAwMWUsCisweGM3OCwweDYzMzYwMDFlLAorMHhjNzgsMHg2NDM3MDAxZSwKKzB4Yzc4LDB4NjQzODAwMWUsCisweGM3OCwweDY1MzkwMDFlLAorMHhjNzgsMHg2NjNhMDAxZSwKKzB4Yzc4LDB4NjczYjAwMWUsCisweGM3OCwweDY3M2MwMDFlLAorMHhjNzgsMHg2ODNkMDAxZSwKKzB4Yzc4LDB4NjkzZTAwMWUsCisweGM3OCwweDZhM2YwMDFlLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmVfaW1nLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlX2ltZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZDk1MTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlX2ltZy5oCkBAIC0wLDAgKzEsMzUgQEAKKyNpZm5kZWYgSU1HX0gKKyNkZWZpbmUgSU1HX0gKKworI2RlZmluZSBCT09UX0FSUl9MRU4gMzQ0CisjZGVmaW5lIE1BSU5fQVJSX0xFTiA0NTEzNgorI2RlZmluZSBEQVRBX0FSUl9MRU4gNzk2CisjZGVmaW5lIE1BQ1BIWV9BcnJheV9QR0xlbmd0aCAzMAorI2RlZmluZSBQSFlfUkVHXzFUMlJBcnJheUxlbmd0aCAyOTYKKyNkZWZpbmUgQUdDVEFCX0FycmF5TGVuZ3RoIDM4NAorI2RlZmluZSBNQUNQSFlfQXJyYXlMZW5ndGggMTgKKworI2RlZmluZSBSYWRpb0FfQXJyYXlMZW5ndGggMjQ2CisjZGVmaW5lIFJhZGlvQl9BcnJheUxlbmd0aCA3OAorI2RlZmluZSBSYWRpb0NfQXJyYXlMZW5ndGggMQorI2RlZmluZSBSYWRpb0RfQXJyYXlMZW5ndGggMQorI2RlZmluZSBQSFlfUkVHQXJyYXlMZW5ndGggMQorCisKK2V4dGVybiB1OCBydGw4MTkwX2Z3Ym9vdF9hcnJheVtCT09UX0FSUl9MRU5dOworZXh0ZXJuIHU4IHJ0bDgxOTBfZndtYWluX2FycmF5W01BSU5fQVJSX0xFTl07CitleHRlcm4gdTggcnRsODE5MF9md2RhdGFfYXJyYXlbREFUQV9BUlJfTEVOXTsKKworZXh0ZXJuIHUzMiBSdGw4MTkyVXNiUEhZX1JFR0FycmF5W107CitleHRlcm4gdTMyIFJ0bDgxOTJVc2JQSFlfUkVHXzFUMlJBcnJheVtdOworZXh0ZXJuIHUzMiBSdGw4MTkyVXNiUmFkaW9BX0FycmF5W107CitleHRlcm4gdTMyIFJ0bDgxOTJVc2JSYWRpb0JfQXJyYXlbXTsKK2V4dGVybiB1MzIgUnRsODE5MlVzYlJhZGlvQ19BcnJheVtdOworZXh0ZXJuIHUzMiBSdGw4MTkyVXNiUmFkaW9EX0FycmF5W107CitleHRlcm4gdTMyIFJ0bDgxOTJVc2JNQUNQSFlfQXJyYXlbXTsKK2V4dGVybiB1MzIgUnRsODE5MlVzYk1BQ1BIWV9BcnJheV9QR1tdOworZXh0ZXJuIHUzMiBSdGw4MTkyVXNiQUdDVEFCX0FycmF5W107CisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYWRhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeS5jCkBAIC0wLDAgKzEsMTc3NyBAQAorI2luY2x1ZGUgInI4MTkyVS5oIgorI2luY2x1ZGUgInI4MTkyVV9ody5oIgorI2luY2x1ZGUgInI4MTl4VV9waHkuaCIKKyNpbmNsdWRlICJyODE5eFVfcGh5cmVnLmgiCisjaW5jbHVkZSAicjgxOTBfcnRsODI1Ni5oIgorI2luY2x1ZGUgInI4MTkyVV9kbS5oIgorI2luY2x1ZGUgInI4MTl4VV9maXJtd2FyZV9pbWcuaCIKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKyNpbmNsdWRlICJkb3QxMWQuaCIKKyNlbmRpZgorc3RhdGljIHUzMiBSRl9DSEFOTkVMX1RBQkxFX1pFQlJBW10gPSB7CisJMCwKKwkweDA4NWMsIC8vMjQxMiAxCisJMHgwOGRjLCAvLzI0MTcgMgorCTB4MDk1YywgLy8yNDIyIDMKKwkweDA5ZGMsIC8vMjQyNyA0CisJMHgwYTVjLCAvLzI0MzIgNQorCTB4MGFkYywgLy8yNDM3IDYKKwkweDBiNWMsIC8vMjQ0MiA3CisJMHgwYmRjLCAvLzI0NDcgOAorCTB4MGM1YywgLy8yNDUyIDkKKwkweDBjZGMsIC8vMjQ1NyAxMAorCTB4MGQ1YywgLy8yNDYyIDExCisJMHgwZGRjLCAvLzI0NjcgMTIKKwkweDBlNWMsIC8vMjQ3MiAxMworCTB4MGY3MiwgLy8yNDg0Cit9OworCisKKyNkZWZpbmUgcnRsODE5WFBIWV9SRUdfMVQyUkFycmF5IFJ0bDgxOTJVc2JQSFlfUkVHXzFUMlJBcnJheQorI2RlZmluZSBydGw4MTlYTUFDUEhZX0FycmF5X1BHIFJ0bDgxOTJVc2JNQUNQSFlfQXJyYXlfUEcKKyNkZWZpbmUgcnRsODE5WE1BQ1BIWV9BcnJheSBSdGw4MTkyVXNiTUFDUEhZX0FycmF5CisjZGVmaW5lIHJ0bDgxOVhSYWRpb0FfQXJyYXkgIFJ0bDgxOTJVc2JSYWRpb0FfQXJyYXkKKyNkZWZpbmUgcnRsODE5WFJhZGlvQl9BcnJheSBSdGw4MTkyVXNiUmFkaW9CX0FycmF5CisjZGVmaW5lIHJ0bDgxOVhSYWRpb0NfQXJyYXkgUnRsODE5MlVzYlJhZGlvQ19BcnJheQorI2RlZmluZSBydGw4MTlYUmFkaW9EX0FycmF5IFJ0bDgxOTJVc2JSYWRpb0RfQXJyYXkKKyNkZWZpbmUgcnRsODE5WEFHQ1RBQl9BcnJheSBSdGw4MTkyVXNiQUdDVEFCX0FycmF5CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHJlYWQgQkIgcGFyYW1ldGVycyBmcm9tIEhlYWRlciBmaWxlIHdlIGdlbiwKKyAqCSAgICAgYW5kIGRvIHJlZ2lzdGVyIHJlYWQvd3JpdGUKKyAqICAgaW5wdXQ6ICB1MzIJZHdCaXRNYXNrICAvL3RhZ2V0IGJpdCBwb3MgaW4gdGhlIGFkZHIgdG8gYmUgbW9kaWZpZWQKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgdTMyCXJldHVybiB0aGUgc2hpZnQgYml0IGJpdCBwb3NpdGlvbiBvZiB0aGUgbWFzaworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KHUzMiBkd0JpdE1hc2spCit7CisJdTMyIGk7CisJZm9yIChpPTA7IGk8PTMxOyBpKyspCisJeworCQlpZiAoKChkd0JpdE1hc2s+PmkpJjB4MSkgPT0gMSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gaTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIGNoZWNrIGRpZmZlcmVudCBSRiB0eXBlIHRvIGV4ZWN1dGUgbGVnYWwganVkZ2VtZW50LiBJZiBSRiBQYXRoIGlzIGlsbGVnYWwsIHdlIHdpbGwgcmV0dXJuIGZhbHNlLgorICogICBpbnB1dDogIG5vbmUKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgMChpbGxlZ2FsLCBmYWxzZSksIDEobGVnYWwsdHJ1ZSkKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHJ0bDgxOTJfcGh5X0NoZWNrSXNMZWdhbFJGUGF0aChzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1MzIgZVJGUGF0aCkKK3sKKwl1OCByZXQgPSAxOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8yVDRSKQorCQlyZXQgPSAwOworCWVsc2UgaWYgKHByaXYtPnJmX3R5cGUgPT0gUkZfMVQyUikKKwl7CisJCWlmIChlUkZQYXRoID09IFJGOTBfUEFUSF9BIHx8IGVSRlBhdGggPT0gUkY5MF9QQVRIX0IpCisJCQlyZXQgPSAxOworCQllbHNlIGlmIChlUkZQYXRoID09IFJGOTBfUEFUSF9DIHx8IGVSRlBhdGggPT0gUkY5MF9QQVRIX0QpCisJCQlyZXQgPSAwOworCX0KKwlyZXR1cm4gcmV0OworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gc2V0IHNwZWNpZmljIGJpdHMgdG8gQkIgcmVnaXN0ZXIKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogICAgICAgICAgIHUzMglkd1JlZ0FkZHIgIC8vdGFyZ2V0IGFkZHIgdG8gYmUgbW9kaWZpZWQKKyAqICAgICAgICAgICB1MzIJZHdCaXRNYXNrICAvL3RhZ2V0IGJpdCBwb3MgaW4gdGhlIGFkZHIgdG8gYmUgbW9kaWZpZWQKKyAqICAgICAgICAgICB1MzIJZHdEYXRhICAgICAvL3ZhbHVlIHRvIGJlIHdyaXRlCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICBub3RpY2U6CisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX3NldEJCcmVnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHUzMiBkd1JlZ0FkZHIsIHUzMiBkd0JpdE1hc2ssIHUzMiBkd0RhdGEpCit7CisKKwl1MzIgT3JpZ2luYWxWYWx1ZSwgQml0U2hpZnQsIE5ld1ZhbHVlOworCisJaWYoZHdCaXRNYXNrIT0gYk1hc2tEV29yZCkKKwl7Ly9pZiBub3QgImRvdWJsZSB3b3JkIiB3cml0ZQorCQlPcmlnaW5hbFZhbHVlID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBkd1JlZ0FkZHIpOworCQlCaXRTaGlmdCA9IHJ0bDgxOTJfQ2FsY3VsYXRlQml0U2hpZnQoZHdCaXRNYXNrKTsKKwkJTmV3VmFsdWUgPSAoKChPcmlnaW5hbFZhbHVlKSAmICh+ZHdCaXRNYXNrKSkgfCAoZHdEYXRhIDw8IEJpdFNoaWZ0KSk7CisJCXdyaXRlX25pY19kd29yZChkZXYsIGR3UmVnQWRkciwgTmV3VmFsdWUpOworCX1lbHNlCisJCXdyaXRlX25pY19kd29yZChkZXYsIGR3UmVnQWRkciwgZHdEYXRhKTsKKwlyZXR1cm47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiByZWFkcyBzcGVjaWZpYyBiaXRzIGZyb20gQkIgcmVnaXN0ZXIKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogICAgICAgICAgIHUzMglkd1JlZ0FkZHIgIC8vdGFyZ2V0IGFkZHIgdG8gYmUgcmVhZGJhY2sKKyAqICAgICAgICAgICB1MzIJZHdCaXRNYXNrICAvL3RhZ2V0IGJpdCBwb3MgaW4gdGhlIGFkZHIgdG8gYmUgcmVhZGJhY2sKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgdTMyCURhdGEJLy90aGUgcmVhZGJhY2sgcmVnaXN0ZXIgdmFsdWUKKyAqICBub3RpY2U6CisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHJ0bDgxOTJfUXVlcnlCQlJlZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1MzIgZHdSZWdBZGRyLCB1MzIgZHdCaXRNYXNrKQoreworCXUzMiBSZXQgPSAwLCBPcmlnaW5hbFZhbHVlLCBCaXRTaGlmdDsKKworCU9yaWdpbmFsVmFsdWUgPSByZWFkX25pY19kd29yZChkZXYsIGR3UmVnQWRkcik7CisJQml0U2hpZnQgPSBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KGR3Qml0TWFzayk7CisJUmV0ID0oT3JpZ2luYWxWYWx1ZSAmIGR3Qml0TWFzaykgPj4gQml0U2hpZnQ7CisKKwlyZXR1cm4gKFJldCk7Cit9CitzdGF0aWMgIHUzMiBwaHlfRndSRlNlcmlhbFJlYWQoIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIFJGOTBfUkFESU9fUEFUSF9FICAgICAgIGVSRlBhdGgsIHUzMiBPZmZzZXQgICk7CisKK3N0YXRpYyB2b2lkIHBoeV9Gd1JGU2VyaWFsV3JpdGUoIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIFJGOTBfUkFESU9fUEFUSF9FICAgICAgIGVSRlBhdGgsIHUzMiAgT2Zmc2V0LCB1MzIgIERhdGEpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiByZWFkIHJlZ2lzdGVyIGZyb20gUkYgY2hpcAorICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2CisgKiAgIAkgICAgIFJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGggLy9yYWRpbyBwYXRoIG9mIEEvQi9DL0QKKyAqICAgICAgICAgICB1MzIJT2Zmc2V0ICAgICAvL3RhcmdldCBhZGRyZXNzIHRvIGJlIHJlYWQKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgdTMyIAlyZWFkYmFjayB2YWx1ZQorICogIG5vdGljZTogIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBzZXJpYWwgb3BlcmF0aW9uczooMSkgU29mdHdhcmUgc2VyaWFsIHdyaXRlLigyKUhhcmR3YXJlIExTU0ktTG93IFNwZWVkIFNlcmlhbCBJbnRlcmZhY2UuKDMpSGFyZHdhcmUgSFNTSS1IaWdoIHNwZWVkIHNlcmlhbCB3cml0ZS4gRHJpdmVyIGhlcmUgbmVlZCB0byBpbXBsZW1lbnQgKDEpIGFuZCAoMiktLS1uZWVkIG1vcmUgc3BlYyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgcnRsODE5Ml9waHlfUkZTZXJpYWxSZWFkKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIFJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGgsIHUzMiBPZmZzZXQpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiByZXQgPSAwOworCXUzMiBOZXdPZmZzZXQgPSAwOworCUJCX1JFR0lTVEVSX0RFRklOSVRJT05fVCogcFBoeVJlZyA9ICZwcml2LT5QSFlSZWdEZWZbZVJGUGF0aF07CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmTFNTSVJlYWRCYWNrLCBiTFNTSVJlYWRCYWNrRGF0YSwgMCk7CisJLy9tYWtlIHN1cmUgUkYgcmVnaXN0ZXIgb2Zmc2V0IGlzIGNvcnJlY3QKKwlPZmZzZXQgJj0gMHgzZjsKKworCS8vc3dpdGNoIHBhZ2UgZm9yIDgyNTYgUkYgSUMKKwlpZiAocHJpdi0+cmZfY2hpcCA9PSBSRl84MjU2KQorCXsKKwkJaWYgKE9mZnNldCA+PSAzMSkKKwkJeworCQkJcHJpdi0+UmZSZWcwVmFsdWVbZVJGUGF0aF0gfD0gMHgxNDA7CisJCQkvL1N3aXRjaCB0byBSZWdfTW9kZTIgZm9yIFJlZyAzMS00NQorCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmM3dpcmVPZmZzZXQsIGJNYXNrRFdvcmQsIChwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXTw8MTYpICk7CisJCQkvL21vZGlmeSBvZmZzZXQKKwkJCU5ld09mZnNldCA9IE9mZnNldCAtMzA7CisJCX0KKwkJZWxzZSBpZiAoT2Zmc2V0ID49IDE2KQorCQl7CisJCQlwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSB8PSAweDEwMDsKKwkJCXByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdICY9ICh+MHg0MCk7CisJCQkvL1N3aXRjaCB0byBSZWdfTW9kZSAxIGZvciBSZWcxNi0zMAorCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmM3dpcmVPZmZzZXQsIGJNYXNrRFdvcmQsIChwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXTw8MTYpICk7CisKKwkJCU5ld09mZnNldCA9IE9mZnNldCAtIDE1OworCQl9CisJCWVsc2UKKwkJCU5ld09mZnNldCA9IE9mZnNldDsKKwl9CisJZWxzZQorCXsKKwkJUlRfVFJBQ0UoKENPTVBfUEhZfENPTVBfRVJSKSwgImNoZWNrIFJGIHR5cGUgaGVyZSwgbmVlZCB0byBiZSA4MjU2XG4iKTsKKwkJTmV3T2Zmc2V0ID0gT2Zmc2V0OworCX0KKwkvL3B1dCBkZXNpcmVkIHJlYWQgYWRkciB0byBMU1NJIGNvbnRyb2wgUmVnaXN0ZXIKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmZIU1NJUGFyYTIsIGJMU1NJUmVhZEFkZHJlc3MsIE5ld09mZnNldCk7CisJLy9Jc3N1ZSBhIHBvc2VkZ2UgdHJpZ2dlcgorCS8vCisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmSFNTSVBhcmEyLCAgYkxTU0lSZWFkRWRnZSwgMHgwKTsKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmZIU1NJUGFyYTIsICBiTFNTSVJlYWRFZGdlLCAweDEpOworCisKKwkvLyBUT0RPOiB3ZSBzaG91bGQgbm90IGRlbGF5IHN1Y2ggYSAgbG9uZyB0aW1lLiBBc2sgaGVscCBmcm9tIFNEMworCW1zbGVlcCgxKTsKKworCXJldCA9IHJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsIHBQaHlSZWctPnJmTFNTSVJlYWRCYWNrLCBiTFNTSVJlYWRCYWNrRGF0YSk7CisKKworCS8vIFN3aXRjaCBiYWNrIHRvIFJlZ19Nb2RlMDsKKwlpZihwcml2LT5yZl9jaGlwID09IFJGXzgyNTYpCisJeworCQlwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSAmPSAweGViZjsKKworCQlydGw4MTkyX3NldEJCcmVnKAorCQkJZGV2LAorCQkJcFBoeVJlZy0+cmYzd2lyZU9mZnNldCwKKwkJCWJNYXNrRFdvcmQsCisJCQkocHJpdi0+UmZSZWcwVmFsdWVbZVJGUGF0aF0gPDwgMTYpKTsKKwl9CisKKwlyZXR1cm4gcmV0OworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHdyaXRlIGRhdGEgdG8gUkYgcmVnaXN0ZXIKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogICAJICAgICBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoIC8vcmFkaW8gcGF0aCBvZiBBL0IvQy9ECisgKiAgICAgICAgICAgdTMyCU9mZnNldCAgICAgLy90YXJnZXQgYWRkcmVzcyB0byBiZSB3cml0dGVuCisgKiAgICAgICAgICAgdTMyCURhdGEJLy9UaGUgbmV3IHJlZ2lzdGVyIGRhdGEgdG8gYmUgd3JpdHRlbgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiAgRm9yIFJGODI1NiBvbmx5LgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICpSZWcgTW9kZQlSZWdDVExbMV0JUmVnQ1RMWzBdCQlOb3RlCisgKgkJKFJlZzAwWzEyXSkJKFJlZzAwWzEwXSkKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqUmVnX01vZGUwCTAJCXgJCQlSZWcgMCB+MTUoMHgwIH4gMHhmKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqUmVnX01vZGUxCTEJCTAJCQlSZWcgMTYgfjMwKDB4MSB+IDB4ZikKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdfTW9kZTIJMQkJMQkJCVJlZyAzMSB+IDQ1KDB4MSB+IDB4ZikKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX3BoeV9SRlNlcmlhbFdyaXRlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIFJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGgsIHUzMiBPZmZzZXQsIHUzMiBEYXRhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgRGF0YUFuZEFkZHIgPSAwLCBOZXdPZmZzZXQgPSAwOworCUJCX1JFR0lTVEVSX0RFRklOSVRJT05fVAkqcFBoeVJlZyA9ICZwcml2LT5QSFlSZWdEZWZbZVJGUGF0aF07CisKKwlPZmZzZXQgJj0gMHgzZjsKKwkvL3NwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZl9sb2NrLCBmbGFncyk7CisvLwlkb3duKCZwcml2LT5yZl9zZW0pOworCWlmIChwcml2LT5yZl9jaGlwID09IFJGXzgyNTYpCisJeworCisJCWlmIChPZmZzZXQgPj0gMzEpCisJCXsKKwkJCXByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdIHw9IDB4MTQwOworCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmM3dpcmVPZmZzZXQsIGJNYXNrRFdvcmQsIChwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSA8PCAxNikpOworCQkJTmV3T2Zmc2V0ID0gT2Zmc2V0IC0gMzA7CisJCX0KKwkJZWxzZSBpZiAoT2Zmc2V0ID49IDE2KQorCQl7CisJCQlwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSB8PSAweDEwMDsKKwkJCXByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdICY9ICh+MHg0MCk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmYzd2lyZU9mZnNldCwgYk1hc2tEV29yZCwgKHByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdPDwxNikpOworCQkJTmV3T2Zmc2V0ID0gT2Zmc2V0IC0gMTU7CisJCX0KKwkJZWxzZQorCQkJTmV3T2Zmc2V0ID0gT2Zmc2V0OworCX0KKwllbHNlCisJeworCQlSVF9UUkFDRSgoQ09NUF9QSFl8Q09NUF9FUlIpLCAiY2hlY2sgUkYgdHlwZSBoZXJlLCBuZWVkIHRvIGJlIDgyNTZcbiIpOworCQlOZXdPZmZzZXQgPSBPZmZzZXQ7CisJfQorCisJLy8gUHV0IHdyaXRlIGFkZHIgaW4gWzU6MF0gIGFuZCB3cml0ZSBkYXRhIGluIFszMToxNl0KKwlEYXRhQW5kQWRkciA9IChEYXRhPDwxNikgfCAoTmV3T2Zmc2V0JjB4M2YpOworCisJLy8gV3JpdGUgT3BlcmF0aW9uCisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmM3dpcmVPZmZzZXQsIGJNYXNrRFdvcmQsIERhdGFBbmRBZGRyKTsKKworCisJaWYoT2Zmc2V0PT0weDApCisJCXByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdID0gRGF0YTsKKworCS8vIFN3aXRjaCBiYWNrIHRvIFJlZ19Nb2RlMDsKKwlpZihwcml2LT5yZl9jaGlwID09IFJGXzgyNTYpCisJeworCQlpZihPZmZzZXQgIT0gMCkKKwkJeworCQkJcHJpdi0+UmZSZWcwVmFsdWVbZVJGUGF0aF0gJj0gMHhlYmY7CisJCQlydGw4MTkyX3NldEJCcmVnKAorCQkJCWRldiwKKwkJCQlwUGh5UmVnLT5yZjN3aXJlT2Zmc2V0LAorCQkJCWJNYXNrRFdvcmQsCisJCQkJKHByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdIDw8IDE2KSk7CisJCX0KKwl9CisJLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZl9sb2NrLCBmbGFncyk7CisvLwl1cCgmcHJpdi0+cmZfc2VtKTsKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHNldCBzcGVjaWZpYyBiaXRzIHRvIFJGIHJlZ2lzdGVyCisgKiAgIGlucHV0OiAgbmV0X2RldmljZSBkZXYKKyAqICAgCSAgICAgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCAvL3JhZGlvIHBhdGggb2YgQS9CL0MvRAorICogICAgICAgICAgIHUzMglSZWdBZGRyICAvL3RhcmdldCBhZGRyIHRvIGJlIG1vZGlmaWVkCisgKiAgICAgICAgICAgdTMyCUJpdE1hc2sgIC8vdGFnZXQgYml0IHBvcyBpbiB0aGUgYWRkciB0byBiZSBtb2RpZmllZAorICogICAgICAgICAgIHUzMglEYXRhICAgICAvL3ZhbHVlIHRvIGJlIHdyaXRlCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICBub3RpY2U6CisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX3BoeV9TZXRSRlJlZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoLCB1MzIgUmVnQWRkciwgdTMyIEJpdE1hc2ssIHUzMiBEYXRhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgT3JpZ2luYWxfVmFsdWUsIEJpdFNoaWZ0LCBOZXdfVmFsdWU7CisvLwl1OAl0aW1lID0gMDsKKworCWlmICghcnRsODE5Ml9waHlfQ2hlY2tJc0xlZ2FsUkZQYXRoKGRldiwgZVJGUGF0aCkpCisJCXJldHVybjsKKworCWlmIChwcml2LT5SZl9Nb2RlID09IFJGX09QX0J5X0ZXKQorCXsKKwkJaWYgKEJpdE1hc2sgIT0gYk1hc2sxMkJpdHMpIC8vIFJGIGRhdGEgaXMgMTIgYml0cyBvbmx5CisJCXsKKwkJCU9yaWdpbmFsX1ZhbHVlID0gcGh5X0Z3UkZTZXJpYWxSZWFkKGRldiwgZVJGUGF0aCwgUmVnQWRkcik7CisJCQlCaXRTaGlmdCA9ICBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KEJpdE1hc2spOworCQkJTmV3X1ZhbHVlID0gKChPcmlnaW5hbF9WYWx1ZSkgJiAofkJpdE1hc2spKSB8IChEYXRhPDwgQml0U2hpZnQpOworCisJCQlwaHlfRndSRlNlcmlhbFdyaXRlKGRldiwgZVJGUGF0aCwgUmVnQWRkciwgTmV3X1ZhbHVlKTsKKwkJfWVsc2UKKwkJCXBoeV9Gd1JGU2VyaWFsV3JpdGUoZGV2LCBlUkZQYXRoLCBSZWdBZGRyLCBEYXRhKTsKKworCQl1ZGVsYXkoMjAwKTsKKworCX0KKwllbHNlCisJeworCQlpZiAoQml0TWFzayAhPSBiTWFzazEyQml0cykgLy8gUkYgZGF0YSBpcyAxMiBiaXRzIG9ubHkKKwkJeworCQkJT3JpZ2luYWxfVmFsdWUgPSBydGw4MTkyX3BoeV9SRlNlcmlhbFJlYWQoZGV2LCBlUkZQYXRoLCBSZWdBZGRyKTsKKwkJCUJpdFNoaWZ0ID0gIHJ0bDgxOTJfQ2FsY3VsYXRlQml0U2hpZnQoQml0TWFzayk7CisJCQlOZXdfVmFsdWUgPSAoKChPcmlnaW5hbF9WYWx1ZSkgJiAofkJpdE1hc2spKSB8IChEYXRhPDwgQml0U2hpZnQpKTsKKworCQkJcnRsODE5Ml9waHlfUkZTZXJpYWxXcml0ZShkZXYsIGVSRlBhdGgsIFJlZ0FkZHIsIE5ld19WYWx1ZSk7CisJCX1lbHNlCisJCQlydGw4MTkyX3BoeV9SRlNlcmlhbFdyaXRlKGRldiwgZVJGUGF0aCwgUmVnQWRkciwgRGF0YSk7CisJfQorCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gcmVhZHMgc3BlY2lmaWMgYml0cyBmcm9tIFJGIHJlZ2lzdGVyCisgKiAgIGlucHV0OiAgbmV0X2RldmljZSBkZXYKKyAqICAgICAgICAgICB1MzIJUmVnQWRkciAgLy90YXJnZXQgYWRkciB0byBiZSByZWFkYmFjaworICogICAgICAgICAgIHUzMglCaXRNYXNrICAvL3RhZ2V0IGJpdCBwb3MgaW4gdGhlIGFkZHIgdG8gYmUgcmVhZGJhY2sKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgdTMyCURhdGEJLy90aGUgcmVhZGJhY2sgcmVnaXN0ZXIgdmFsdWUKKyAqICBub3RpY2U6CisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrKQoreworCXUzMiBPcmlnaW5hbF9WYWx1ZSwgUmVhZGJhY2tfVmFsdWUsIEJpdFNoaWZ0OworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisJaWYgKCFydGw4MTkyX3BoeV9DaGVja0lzTGVnYWxSRlBhdGgoZGV2LCBlUkZQYXRoKSkKKwkJcmV0dXJuIDA7CisJaWYgKHByaXYtPlJmX01vZGUgPT0gUkZfT1BfQnlfRlcpCisJeworCQlPcmlnaW5hbF9WYWx1ZSA9IHBoeV9Gd1JGU2VyaWFsUmVhZChkZXYsIGVSRlBhdGgsIFJlZ0FkZHIpOworCQlCaXRTaGlmdCA9ICBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KEJpdE1hc2spOworCQlSZWFkYmFja19WYWx1ZSA9IChPcmlnaW5hbF9WYWx1ZSAmIEJpdE1hc2spID4+IEJpdFNoaWZ0OworCQl1ZGVsYXkoMjAwKTsKKwkJcmV0dXJuIChSZWFkYmFja19WYWx1ZSk7CisJfQorCWVsc2UKKwl7CisJCU9yaWdpbmFsX1ZhbHVlID0gcnRsODE5Ml9waHlfUkZTZXJpYWxSZWFkKGRldiwgZVJGUGF0aCwgUmVnQWRkcik7CisJCUJpdFNoaWZ0ID0gIHJ0bDgxOTJfQ2FsY3VsYXRlQml0U2hpZnQoQml0TWFzayk7CisJCVJlYWRiYWNrX1ZhbHVlID0gKE9yaWdpbmFsX1ZhbHVlICYgQml0TWFzaykgPj4gQml0U2hpZnQ7CisJCXJldHVybiAoUmVhZGJhY2tfVmFsdWUpOworCX0KK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBXZSBzdXBwb3J0IGZpcm13YXJlIHRvIGV4ZWN1dGUgUkYtUi9XLgorICogICBpbnB1dDogIGRldgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljCXUzMgorcGh5X0Z3UkZTZXJpYWxSZWFkKAorCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJUkY5MF9SQURJT19QQVRIX0UJZVJGUGF0aCwKKwl1MzIJCQkJT2Zmc2V0CSkKK3sKKwl1MzIJCXJldFZhbHVlID0gMDsKKwl1MzIJCURhdGEgPSAwOworCXU4CQl0aW1lID0gMDsKKwkvL0RiZ1ByaW50KCJGVyBSRiBDVFJMXG5cciIpOworCS8qIDIwMDcvMTEvMDIgTUggRmlybXdhcmUgUkYgV3JpdGUgY29udHJvbC4gQnkgRnJhbmNpcycgc3VnZ2VzdGlvbiwgd2UgY2FuCisJICAgbm90IGV4ZWN1dGUgdGhlIHNjaGVtZSBpbiB0aGUgaW5pdGlhbCBzdGVwLiBPdGhlcndpc2UsIFJGLVIvVyB3aWxsIHdhc3RlCisJICAgbXVjaCB0aW1lLiBUaGlzIGlzIG9ubHkgZm9yIHNpdGUgc3VydmV5LiAqLworCS8vIDEuIFJlYWQgb3BlcmF0aW9uIG5lZWQgbm90IGluc2VydCBkYXRhLiBiaXQgMC0xMQorCS8vRGF0YSAmPSBiTWFzazEyQml0czsKKwkvLyAyLiBXcml0ZSBSRiByZWdpc3RlciBhZGRyZXNzLiBCaXQgMTItMTkKKwlEYXRhIHw9ICgoT2Zmc2V0JjB4RkYpPDwxMik7CisJLy8gMy4gV3JpdGUgUkYgcGF0aC4gIGJpdCAyMC0yMQorCURhdGEgfD0gKChlUkZQYXRoJjB4Myk8PDIwKTsKKwkvLyA0LiBTZXQgUkYgcmVhZCBpbmRpY2F0b3IuIGJpdCAyMj0wCisJLy9EYXRhIHw9IDB4MDAwMDA7CisJLy8gNS4gVHJpZ2dlciBGdyB0byBvcGVyYXRlIHRoZSBjb21tYW5kLiBiaXQgMzEKKwlEYXRhIHw9IDB4ODAwMDAwMDA7CisJLy8gNi4gV2UgY2FuIG5vdCBleGVjdXRlIHJlYWQgb3BlcmF0aW9uIGlmIGJpdCAzMSBpcyAxLgorCXdoaWxlIChyZWFkX25pY19kd29yZChkZXYsIFFQTlIpJjB4ODAwMDAwMDApCisJeworCQkvLyBJZiBGVyBjYW4gbm90IGZpbmlzaCBSRi1SL1cgZm9yIG1vcmUgdGhhbiA/PyB0aW1lcy4gV2UgbXVzdCByZXNldCBGVy4KKwkJaWYgKHRpbWUrKyA8IDEwMCkKKwkJeworCQkJLy9EYmdQcmludCgiRlcgbm90IGZpbmlzaCBSRi1SIFRpbWU9JWRcblxyIiwgdGltZSk7CisJCQl1ZGVsYXkoMTApOworCQl9CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwkvLyA3LiBFeGVjdXRlIHJlYWQgb3BlcmF0aW9uLgorCXdyaXRlX25pY19kd29yZChkZXYsIFFQTlIsIERhdGEpOworCS8vIDguIENoZWNrIGlmIGZpcm1hd3JlIHNlbmQgYmFjayBSRiBjb250ZW50LgorCXdoaWxlIChyZWFkX25pY19kd29yZChkZXYsIFFQTlIpJjB4ODAwMDAwMDApCisJeworCQkvLyBJZiBGVyBjYW4gbm90IGZpbmlzaCBSRi1SL1cgZm9yIG1vcmUgdGhhbiA/PyB0aW1lcy4gV2UgbXVzdCByZXNldCBGVy4KKwkJaWYgKHRpbWUrKyA8IDEwMCkKKwkJeworCQkJLy9EYmdQcmludCgiRlcgbm90IGZpbmlzaCBSRi1XIFRpbWU9JWRcblxyIiwgdGltZSk7CisJCQl1ZGVsYXkoMTApOworCQl9CisJCWVsc2UKKwkJCXJldHVybgkoMCk7CisJfQorCXJldFZhbHVlID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBSRl9EQVRBKTsKKworCXJldHVybgkocmV0VmFsdWUpOworCit9CS8qIHBoeV9Gd1JGU2VyaWFsUmVhZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgV2Ugc3VwcG9ydCBmaXJtd2FyZSB0byBleGVjdXRlIFJGLVIvVy4KKyAqICAgaW5wdXQ6ICBkZXYKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogIG5vdGljZToKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitwaHlfRndSRlNlcmlhbFdyaXRlKAorCQlzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQlSRjkwX1JBRElPX1BBVEhfRQllUkZQYXRoLAorCQl1MzIJCQkJT2Zmc2V0LAorCQl1MzIJCQkJRGF0YQkpCit7CisJdTgJdGltZSA9IDA7CisKKwkvL0RiZ1ByaW50KCJOIEZXIFJGIENUUkwgUkYtJWQgT0YlMDJ4IERBVEE9JTAzeFxuXHIiLCBlUkZQYXRoLCBPZmZzZXQsIERhdGEpOworCS8qIDIwMDcvMTEvMDIgTUggRmlybXdhcmUgUkYgV3JpdGUgY29udHJvbC4gQnkgRnJhbmNpcycgc3VnZ2VzdGlvbiwgd2UgY2FuCisJICAgbm90IGV4ZWN1dGUgdGhlIHNjaGVtZSBpbiB0aGUgaW5pdGlhbCBzdGVwLiBPdGhlcndpc2UsIFJGLVIvVyB3aWxsIHdhc3RlCisJICAgbXVjaCB0aW1lLiBUaGlzIGlzIG9ubHkgZm9yIHNpdGUgc3VydmV5LiAqLworCisJLy8gMS4gU2V0IGRyaXZlciB3cml0ZSBiaXQgYW5kIDEyIGJpdCBkYXRhLiBiaXQgMC0xMQorCS8vRGF0YSAmPSBiTWFzazEyQml0czsJLy8gRG9uZSBieSB1cGVyIGxheWVyLgorCS8vIDIuIFdyaXRlIFJGIHJlZ2lzdGVyIGFkZHJlc3MuIGJpdCAxMi0xOQorCURhdGEgfD0gKChPZmZzZXQmMHhGRik8PDEyKTsKKwkvLyAzLiBXcml0ZSBSRiBwYXRoLiAgYml0IDIwLTIxCisJRGF0YSB8PSAoKGVSRlBhdGgmMHgzKTw8MjApOworCS8vIDQuIFNldCBSRiB3cml0ZSBpbmRpY2F0b3IuIGJpdCAyMj0xCisJRGF0YSB8PSAweDQwMDAwMDsKKwkvLyA1LiBUcmlnZ2VyIEZ3IHRvIG9wZXJhdGUgdGhlIGNvbW1hbmQuIGJpdCAzMT0xCisJRGF0YSB8PSAweDgwMDAwMDAwOworCisJLy8gNi4gV3JpdGUgb3BlcmF0aW9uLiBXZSBjYW4gbm90IHdyaXRlIGlmIGJpdCAzMSBpcyAxLgorCXdoaWxlIChyZWFkX25pY19kd29yZChkZXYsIFFQTlIpJjB4ODAwMDAwMDApCisJeworCQkvLyBJZiBGVyBjYW4gbm90IGZpbmlzaCBSRi1SL1cgZm9yIG1vcmUgdGhhbiA/PyB0aW1lcy4gV2UgbXVzdCByZXNldCBGVy4KKwkJaWYgKHRpbWUrKyA8IDEwMCkKKwkJeworCQkJLy9EYmdQcmludCgiRlcgbm90IGZpbmlzaCBSRi1XIFRpbWU9JWRcblxyIiwgdGltZSk7CisJCQl1ZGVsYXkoMTApOworCQl9CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwkvLyA3LiBObyBtYXR0ZXIgY2hlY2sgYml0LiBXZSBhbHdheXMgZm9yY2UgdGhlIHdyaXRlLiBCZWNhdXNlIEZXIHdpbGwKKwkvLyAgICBub3QgYWNjZXB0IHRoZSBjb21tYW5kLgorCXdyaXRlX25pY19kd29yZChkZXYsIFFQTlIsIERhdGEpOworCS8qIDIwMDcvMTEvMDIgTUggQWNvb3JkaW5nIHRvIHRlc3QsIHdlIG11c3QgZGVsYXkgMjB1cyB0byB3YWl0IGZpcm13YXJlCisJICAgdG8gZmluaXNoIFJGIHdyaXRlIG9wZXJhdGlvbi4gKi8KKwkvKiAyMDA4LzAxLzE3IE1IIFdlIHN1cHBvcnQgZGVsYXkgaW4gZmlybXdhcmUgc2lkZSBub3cuICovCisJLy9kZWxheV91cygyMCk7CisKK30JLyogcGh5X0Z3UkZTZXJpYWxXcml0ZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHJlYWQgQkIgcGFyYW1ldGVycyBmcm9tIEhlYWRlciBmaWxlIHdlIGdlbiwKKyAqCSAgICAgYW5kIGRvIHJlZ2lzdGVyIHJlYWQvd3JpdGUKKyAqICAgaW5wdXQ6ICBkZXYKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogIG5vdGljZTogIEJCIHBhcmFtZXRlcnMgbWF5IGNoYW5nZSBhbGwgdGhlIHRpbWUsIHNvIHBsZWFzZSBtYWtlCisgKiAgICAgICAgICAgc3VyZSBpdCBoYXMgYmVlbiBzeW5jZWQgd2l0aCB0aGUgbmV3ZXN0LgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX3BoeV9jb25maWdtYWMoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl1MzIgZHdBcnJheUxlbiA9IDAsIGk7CisJdTMyKiBwZHdBcnJheSA9IE5VTEw7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYocHJpdi0+YnR4cG93ZXJkYXRhX3JlYWRmcm9tRUVQT1JNKQorCXsKKwkJUlRfVFJBQ0UoQ09NUF9QSFksICJSdGw4MTlYTUFDUEhZX0FycmF5X1BHXG4iKTsKKwkJZHdBcnJheUxlbiA9IE1BQ1BIWV9BcnJheV9QR0xlbmd0aDsKKwkJcGR3QXJyYXkgPSBydGw4MTlYTUFDUEhZX0FycmF5X1BHOworCisJfQorCWVsc2UKKwl7CisJCVJUX1RSQUNFKENPTVBfUEhZLCAiUnRsODE5WE1BQ1BIWV9BcnJheVxuIik7CisJCWR3QXJyYXlMZW4gPSBNQUNQSFlfQXJyYXlMZW5ndGg7CisJCXBkd0FycmF5ID0gcnRsODE5WE1BQ1BIWV9BcnJheTsKKwl9CisJZm9yKGkgPSAwOyBpPGR3QXJyYXlMZW47IGk9aSszKXsKKwkJaWYocGR3QXJyYXlbaV0gPT0gMHgzMTgpCisJCXsKKwkJCXBkd0FycmF5W2krMl0gPSAweDAwMDAwODAwOworCQkJLy9EYmdQcmludCgicHRyQXJyYXlbaV0sIHB0ckFycmF5W2krMV0sIHB0ckFycmF5W2krMl0gPSAleCwgJXgsICV4XG4iLAorCQkJLy8JcHRyQXJyYXlbaV0sIHB0ckFycmF5W2krMV0sIHB0ckFycmF5W2krMl0pOworCQl9CisKKwkJUlRfVFJBQ0UoQ09NUF9EQkcsICJUaGUgUnRsODE5ME1BQ1BIWV9BcnJheVswXSBpcyAleCBSdGw4MTkwTUFDUEhZX0FycmF5WzFdIGlzICV4IFJ0bDgxOTBNQUNQSFlfQXJyYXlbMl0gaXMgJXhcbiIsCisJCQkJcGR3QXJyYXlbaV0sIHBkd0FycmF5W2krMV0sIHBkd0FycmF5W2krMl0pOworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgcGR3QXJyYXlbaV0sIHBkd0FycmF5W2krMV0sIHBkd0FycmF5W2krMl0pOworCX0KKwlyZXR1cm47CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gZG8gZGlydHkgd29yaworICogICBpbnB1dDogIGRldgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiAgQkIgcGFyYW1ldGVycyBtYXkgY2hhbmdlIGFsbCB0aGUgdGltZSwgc28gcGxlYXNlIG1ha2UKKyAqICAgICAgICAgICBzdXJlIGl0IGhhcyBiZWVuIHN5bmNlZCB3aXRoIHRoZSBuZXdlc3QuCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgcnRsODE5Ml9waHlDb25maWdCQihzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1OCBDb25maWdUeXBlKQoreworCXUzMiBpOworCisjaWZkZWYgVE9fRE9fTElTVAorCXUzMiAqcnRsODE5MlBoeVJlZ0FycmF5VGFibGUgPSBOVUxMLCAqcnRsODE5MkFnY1RhYkFycmF5VGFibGUgPSBOVUxMOworCWlmKEFkYXB0ZXItPmJJbkhjdFRlc3QpCisJeworCQlQSFlfUkVHQXJyYXlMZW4gPSBQSFlfUkVHQXJyYXlMZW5ndGhEVE07CisJCUFHQ1RBQl9BcnJheUxlbiA9IEFHQ1RBQl9BcnJheUxlbmd0aERUTTsKKwkJUnRsODE5MFBIWV9SRUdBcnJheV9UYWJsZSA9IFJ0bDgxOVhQSFlfUkVHQXJyYXlEVE07CisJCVJ0bDgxOTBBR0NUQUJfQXJyYXlfVGFibGUgPSBSdGw4MTlYQUdDVEFCX0FycmF5RFRNOworCX0KKyNlbmRpZgorCWlmIChDb25maWdUeXBlID09IEJhc2VCYW5kX0NvbmZpZ19QSFlfUkVHKQorCXsKKwkJZm9yIChpPTA7IGk8UEhZX1JFR18xVDJSQXJyYXlMZW5ndGg7IGkrPTIpCisJCXsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBydGw4MTlYUEhZX1JFR18xVDJSQXJyYXlbaV0sIGJNYXNrRFdvcmQsIHJ0bDgxOVhQSFlfUkVHXzFUMlJBcnJheVtpKzFdKTsKKwkJCVJUX1RSQUNFKENPTVBfREJHLCAiaTogJXgsIFRoZSBSdGw4MTl4VXNiUEhZX1JFR0FycmF5WzBdIGlzICV4IFJ0bDgxOXhVc2JQSFlfUkVHQXJyYXlbMV0gaXMgJXggXG4iLGksIHJ0bDgxOVhQSFlfUkVHXzFUMlJBcnJheVtpXSwgcnRsODE5WFBIWV9SRUdfMVQyUkFycmF5W2krMV0pOworCQl9CisJfQorCWVsc2UgaWYgKENvbmZpZ1R5cGUgPT0gQmFzZUJhbmRfQ29uZmlnX0FHQ19UQUIpCisJeworCQlmb3IgKGk9MDsgaTxBR0NUQUJfQXJyYXlMZW5ndGg7IGkrPTIpCisJCXsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBydGw4MTlYQUdDVEFCX0FycmF5W2ldLCBiTWFza0RXb3JkLCBydGw4MTlYQUdDVEFCX0FycmF5W2krMV0pOworCQkJUlRfVFJBQ0UoQ09NUF9EQkcsICJpOiV4LCBUaGUgcnRsODE5WEFHQ1RBQl9BcnJheVswXSBpcyAleCBydGw4MTlYQUdDVEFCX0FycmF5WzFdIGlzICV4IFxuIixpLCBydGw4MTlYQUdDVEFCX0FycmF5W2ldLCBydGw4MTlYQUdDVEFCX0FycmF5W2krMV0pOworCQl9CisJfQorCXJldHVybjsKKworCit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIFJlZ2lzdGVyIGRlZmluaXRpb24gb2Zmc2V0IGZvciBSYWRpbyBQYXRoCisgKgkgICAgIEEvQi9DL0QKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiAgSW5pdGlhbGl6YXRpb24gdmFsdWUgaGVyZSBpcyBjb25zdGFudCBhbmQgaXQgc2hvdWxkIG5ldmVyIGJlIGNoYW5nZWQKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcnRsODE5Ml9Jbml0QkJSRlJlZ0RlZihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKy8vIFJGIEludGVyZmFjZSBTb3dydHdhcmUgQ29udHJvbAorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZpbnRmcyA9IHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VTVzsgLy8gMTYgTFNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODcwCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZmludGZzID0gckZQR0EwX1hBQl9SRkludGVyZmFjZVNXOyAvLyAxNiBNU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NzAgKDE2LWJpdCBmb3IgMHg4NzIpCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZmludGZzID0gckZQR0EwX1hDRF9SRkludGVyZmFjZVNXOy8vIDE2IExTQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg3NAorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZpbnRmcyA9IHJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VTVzsvLyAxNiBNU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NzQgKDE2LWJpdCBmb3IgMHg4NzYpCisKKwkvLyBSRiBJbnRlcmZhY2UgUmVhZGJhY2sgVmFsdWUKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmaW50ZmkgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlUkI7IC8vIDE2IExTQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDhFMAorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZpbnRmaSA9IHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VSQjsvLyAxNiBNU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4RTAgKDE2LWJpdCBmb3IgMHg4RTIpCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZmludGZpID0gckZQR0EwX1hDRF9SRkludGVyZmFjZVJCOy8vIDE2IExTQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDhFNAorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZpbnRmaSA9IHJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VSQjsvLyAxNiBNU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4RTQgKDE2LWJpdCBmb3IgMHg4RTYpCisKKwkvLyBSRiBJbnRlcmZhY2UgT3V0cHV0IChhbmQgRW5hYmxlKQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZpbnRmbyA9IHJGUEdBMF9YQV9SRkludGVyZmFjZU9FOyAvLyAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NjAKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmaW50Zm8gPSByRlBHQTBfWEJfUkZJbnRlcmZhY2VPRTsgLy8gMTYgTFNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODY0CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZmludGZvID0gckZQR0EwX1hDX1JGSW50ZXJmYWNlT0U7Ly8gMTYgTFNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODY4CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZmludGZvID0gckZQR0EwX1hEX1JGSW50ZXJmYWNlT0U7Ly8gMTYgTFNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODZDCisKKwkvLyBSRiBJbnRlcmZhY2UgKE91dHB1dCBhbmQpICBFbmFibGUKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmaW50ZmUgPSByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRTsgLy8gMTYgTVNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODYwICgxNi1iaXQgZm9yIDB4ODYyKQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZpbnRmZSA9IHJGUEdBMF9YQl9SRkludGVyZmFjZU9FOyAvLyAxNiBNU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NjQgKDE2LWJpdCBmb3IgMHg4NjYpCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZmludGZlID0gckZQR0EwX1hDX1JGSW50ZXJmYWNlT0U7Ly8gMTYgTVNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODZBICgxNi1iaXQgZm9yIDB4ODZBKQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZpbnRmZSA9IHJGUEdBMF9YRF9SRkludGVyZmFjZU9FOy8vIDE2IE1TQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg2QyAoMTYtYml0IGZvciAweDg2RSkKKworCS8vQWRkciBvZiBMU1NJLiBXaXJ0ZSBSRiByZWdpc3RlciBieSBkcml2ZXIKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmM3dpcmVPZmZzZXQgPSByRlBHQTBfWEFfTFNTSVBhcmFtZXRlcjsgLy9MU1NJIFBhcmFtZXRlcgorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmYzd2lyZU9mZnNldCA9IHJGUEdBMF9YQl9MU1NJUGFyYW1ldGVyOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmYzd2lyZU9mZnNldCA9IHJGUEdBMF9YQ19MU1NJUGFyYW1ldGVyOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmYzd2lyZU9mZnNldCA9IHJGUEdBMF9YRF9MU1NJUGFyYW1ldGVyOworCisJLy8gUkYgcGFyYW1ldGVyCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZkxTU0lfU2VsZWN0ID0gckZQR0EwX1hBQl9SRlBhcmFtZXRlcjsgIC8vQkIgQmFuZCBTZWxlY3QKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmTFNTSV9TZWxlY3QgPSByRlBHQTBfWEFCX1JGUGFyYW1ldGVyOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmZMU1NJX1NlbGVjdCA9IHJGUEdBMF9YQ0RfUkZQYXJhbWV0ZXI7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZkxTU0lfU2VsZWN0ID0gckZQR0EwX1hDRF9SRlBhcmFtZXRlcjsKKworCS8vIFR4IEFHQyBHYWluIFN0YWdlIChzYW1lIGZvciBhbGwgcGF0aC4gU2hvdWxkIHdlIHJlbW92ZSB0aGlzPykKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmVHhHYWluU3RhZ2UgPSByRlBHQTBfVHhHYWluU3RhZ2U7IC8vVHggZ2FpbiBzdGFnZQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZUeEdhaW5TdGFnZSA9IHJGUEdBMF9UeEdhaW5TdGFnZTsgLy9UeCBnYWluIHN0YWdlCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZlR4R2FpblN0YWdlID0gckZQR0EwX1R4R2FpblN0YWdlOyAvL1R4IGdhaW4gc3RhZ2UKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmVHhHYWluU3RhZ2UgPSByRlBHQTBfVHhHYWluU3RhZ2U7IC8vVHggZ2FpbiBzdGFnZQorCisJLy8gVHJhbmNlaXZlciBBfkQgSFNTSSBQYXJhbWV0ZXItMQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZIU1NJUGFyYTEgPSByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjE7ICAvL3dpcmUgY29udHJvbCBwYXJhbWV0ZXIxCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZkhTU0lQYXJhMSA9IHJGUEdBMF9YQl9IU1NJUGFyYW1ldGVyMTsgIC8vd2lyZSBjb250cm9sIHBhcmFtZXRlcjEKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmSFNTSVBhcmExID0gckZQR0EwX1hDX0hTU0lQYXJhbWV0ZXIxOyAgLy93aXJlIGNvbnRyb2wgcGFyYW1ldGVyMQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZIU1NJUGFyYTEgPSByRlBHQTBfWERfSFNTSVBhcmFtZXRlcjE7ICAvL3dpcmUgY29udHJvbCBwYXJhbWV0ZXIxCisKKwkvLyBUcmFuY2VpdmVyIEF+RCBIU1NJIFBhcmFtZXRlci0yCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZkhTU0lQYXJhMiA9IHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMjsgIC8vd2lyZSBjb250cm9sIHBhcmFtZXRlcjIKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmSFNTSVBhcmEyID0gckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIyOyAgLy93aXJlIGNvbnRyb2wgcGFyYW1ldGVyMgorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmZIU1NJUGFyYTIgPSByRlBHQTBfWENfSFNTSVBhcmFtZXRlcjI7ICAvL3dpcmUgY29udHJvbCBwYXJhbWV0ZXIyCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZkhTU0lQYXJhMiA9IHJGUEdBMF9YRF9IU1NJUGFyYW1ldGVyMjsgIC8vd2lyZSBjb250cm9sIHBhcmFtZXRlcjEKKworCS8vIFJGIHN3aXRjaCBDb250cm9sCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZlN3aXRjaENvbnRyb2wgPSByRlBHQTBfWEFCX1N3aXRjaENvbnRyb2w7IC8vVFIvQW50IHN3aXRjaCBjb250cm9sCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZlN3aXRjaENvbnRyb2wgPSByRlBHQTBfWEFCX1N3aXRjaENvbnRyb2w7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZlN3aXRjaENvbnRyb2wgPSByRlBHQTBfWENEX1N3aXRjaENvbnRyb2w7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZlN3aXRjaENvbnRyb2wgPSByRlBHQTBfWENEX1N3aXRjaENvbnRyb2w7CisKKwkvLyBBR0MgY29udHJvbCAxCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZkFHQ0NvbnRyb2wxID0gck9GRE0wX1hBQUdDQ29yZTE7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZkFHQ0NvbnRyb2wxID0gck9GRE0wX1hCQUdDQ29yZTE7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZkFHQ0NvbnRyb2wxID0gck9GRE0wX1hDQUdDQ29yZTE7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZkFHQ0NvbnRyb2wxID0gck9GRE0wX1hEQUdDQ29yZTE7CisKKwkvLyBBR0MgY29udHJvbCAyCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZkFHQ0NvbnRyb2wyID0gck9GRE0wX1hBQUdDQ29yZTI7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZkFHQ0NvbnRyb2wyID0gck9GRE0wX1hCQUdDQ29yZTI7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZkFHQ0NvbnRyb2wyID0gck9GRE0wX1hDQUdDQ29yZTI7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZkFHQ0NvbnRyb2wyID0gck9GRE0wX1hEQUdDQ29yZTI7CisKKwkvLyBSWCBBRkUgY29udHJvbCAxCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZlJ4SVFJbWJhbGFuY2UgPSByT0ZETTBfWEFSeElRSW1iYWxhbmNlOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZSeElRSW1iYWxhbmNlID0gck9GRE0wX1hCUnhJUUltYmFsYW5jZTsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQ1J4SVFJbWJhbGFuY2U7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZlJ4SVFJbWJhbGFuY2UgPSByT0ZETTBfWERSeElRSW1iYWxhbmNlOworCisJLy8gUlggQUZFIGNvbnRyb2wgMQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZSeEFGRSA9IHJPRkRNMF9YQVJ4QUZFOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZSeEFGRSA9IHJPRkRNMF9YQlJ4QUZFOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmZSeEFGRSA9IHJPRkRNMF9YQ1J4QUZFOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZSeEFGRSA9IHJPRkRNMF9YRFJ4QUZFOworCisJLy8gVHggQUZFIGNvbnRyb2wgMQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hBVHhJUUltYmFsYW5jZTsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmVHhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQlR4SVFJbWJhbGFuY2U7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZlR4SVFJbWJhbGFuY2UgPSByT0ZETTBfWENUeElRSW1iYWxhbmNlOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hEVHhJUUltYmFsYW5jZTsKKworCS8vIFR4IEFGRSBjb250cm9sIDIKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmVHhBRkUgPSByT0ZETTBfWEFUeEFGRTsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmVHhBRkUgPSByT0ZETTBfWEJUeEFGRTsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmVHhBRkUgPSByT0ZETTBfWENUeEFGRTsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmVHhBRkUgPSByT0ZETTBfWERUeEFGRTsKKworCS8vIFRyYW5jZWl2ZXIgTFNTSSBSZWFkYmFjaworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZMU1NJUmVhZEJhY2sgPSByRlBHQTBfWEFfTFNTSVJlYWRCYWNrOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZMU1NJUmVhZEJhY2sgPSByRlBHQTBfWEJfTFNTSVJlYWRCYWNrOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmZMU1NJUmVhZEJhY2sgPSByRlBHQTBfWENfTFNTSVJlYWRCYWNrOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZMU1NJUmVhZEJhY2sgPSByRlBHQTBfWERfTFNTSVJlYWRCYWNrOworCit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBpcyB0byB3cml0ZSByZWdpc3RlciBhbmQgdGhlbiByZWFkYmFjayB0byBtYWtlIHN1cmUgd2hldGhlciBCQiBhbmQgUkYgaXMgT0sKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogICAJICAgICBIVzkwX0JMT0NLX0UgQ2hlY2tCbG9jaworICogICAJICAgICBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoICAvL29ubHkgdXNlZCB3aGVuIGNoZWNrYmxvY2sgaXMgSFc5MF9CTE9DS19SRgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICByZXR1cm4gd2hldGhlciBCQiBhbmQgUkYgaXMgb2soMDpPSzsgMTpGYWlsKQorICogIG5vdGljZTogIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHJlbW92ZWQgaW4gdGhlIEFTSUMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHJ0bDgxOTJfcGh5X2NoZWNrQkJBbmRSRihzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBIVzkwX0JMT0NLX0UgQ2hlY2tCbG9jaywgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCkKK3sKKy8vCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKy8vCUJCX1JFR0lTVEVSX0RFRklOSVRJT05fVCAqcFBoeVJlZyA9ICZwcml2LT5QSFlSZWdEZWZbZVJGUGF0aF07CisJdTggcmV0ID0gMDsKKwl1MzIgaSwgQ2hlY2tUaW1lcyA9IDQsIGR3UmVnUmVhZCA9IDA7CisJdTMyIFdyaXRlQWRkcls0XTsKKwl1MzIgV3JpdGVEYXRhW10gPSB7MHhmZmZmZjAyNywgMHhhYTU1YTAyZiwgMHgwMDAwMDAyNywgMHg1NWFhNTAyZn07CisJLy8gSW5pdGlhbGl6ZSByZWdpc3RlciBhZGRyZXNzIG9mZnNldCB0byBiZSBjaGVja2VkCisJV3JpdGVBZGRyW0hXOTBfQkxPQ0tfTUFDXSA9IDB4MTAwOworCVdyaXRlQWRkcltIVzkwX0JMT0NLX1BIWTBdID0gMHg5MDA7CisJV3JpdGVBZGRyW0hXOTBfQkxPQ0tfUEhZMV0gPSAweDgwMDsKKwlXcml0ZUFkZHJbSFc5MF9CTE9DS19SRl0gPSAweDM7CisJUlRfVFJBQ0UoQ09NUF9QSFksICI9PT09PT09PiVzKCksIENoZWNrQmxvY2s6JWRcbiIsIF9fRlVOQ1RJT05fXywgQ2hlY2tCbG9jayk7CisJZm9yKGk9MCA7IGkgPCBDaGVja1RpbWVzIDsgaSsrKQorCXsKKworCQkvLworCQkvLyBXcml0ZSBEYXRhIHRvIHJlZ2lzdGVyIGFuZCByZWFkYmFjaworCQkvLworCQlzd2l0Y2goQ2hlY2tCbG9jaykKKwkJeworCQljYXNlIEhXOTBfQkxPQ0tfTUFDOgorCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFlfQ2hlY2tCQlJGT0soKTogTmV2ZXIgV3JpdGUgMHgxMDAgaGVyZSEiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSFc5MF9CTE9DS19QSFkwOgorCQljYXNlIEhXOTBfQkxPQ0tfUEhZMToKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFdyaXRlQWRkcltDaGVja0Jsb2NrXSwgV3JpdGVEYXRhW2ldKTsKKwkJCWR3UmVnUmVhZCA9IHJlYWRfbmljX2R3b3JkKGRldiwgV3JpdGVBZGRyW0NoZWNrQmxvY2tdKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSFc5MF9CTE9DS19SRjoKKwkJCVdyaXRlRGF0YVtpXSAmPSAweGZmZjsKKwkJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKGRldiwgZVJGUGF0aCwgV3JpdGVBZGRyW0hXOTBfQkxPQ0tfUkZdLCBiTWFzazEyQml0cywgV3JpdGVEYXRhW2ldKTsKKwkJCS8vIFRPRE86IHdlIHNob3VsZCBub3QgZGVsYXkgZm9yIHN1Y2ggYSBsb25nIHRpbWUuIEFzayBTRDMKKwkJCW1zbGVlcCgxKTsKKwkJCWR3UmVnUmVhZCA9IHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoZGV2LCBlUkZQYXRoLCBXcml0ZUFkZHJbSFc5MF9CTE9DS19SRl0sIGJNYXNrMTJCaXRzKTsKKwkJCW1zbGVlcCgxKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCX0KKworCisJCS8vCisJCS8vIENoZWNrIHdoZXRoZXIgcmVhZGJhY2sgZGF0YSBpcyBjb3JyZWN0CisJCS8vCisJCWlmKGR3UmVnUmVhZCAhPSBXcml0ZURhdGFbaV0pCisJCXsKKwkJCVJUX1RSQUNFKChDT01QX1BIWXxDT01QX0VSUiksICI9PT09PmVycm9yPT09PT1kd1JlZ1JlYWQ6ICV4LCBXcml0ZURhdGE6ICV4IFxuIiwgZHdSZWdSZWFkLCBXcml0ZURhdGFbaV0pOworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIEJCJlJGCisgKiAgIGlucHV0OiAgbmV0X2RldmljZSBkZXYKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogIG5vdGljZTogIEluaXRpYWxpemF0aW9uIHZhbHVlIG1heSBjaGFuZ2UgYWxsIHRoZSB0aW1lLCBzbyBwbGVhc2UgbWFrZQorICogICAgICAgICAgIHN1cmUgaXQgaGFzIGJlZW4gc3luY2VkIHdpdGggdGhlIG5ld2VzdC4KKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcnRsODE5Ml9CQl9Db25maWdfUGFyYUZpbGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggYlJlZ1ZhbHVlID0gMCwgZUNoZWNrSXRlbSA9IDAsIHJ0U3RhdHVzID0gMDsKKwl1MzIgZHdSZWdWYWx1ZSA9IDA7CisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJLy88MT5Jbml0aWFsaXplIEJhc2VCYW5kCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKi0tc2V0IEJCIEdsb2JhbCBSZXNldC0tKi8KKwliUmVnVmFsdWUgPSByZWFkX25pY19ieXRlKGRldiwgQkJfR0xPQkFMX1JFU0VUKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEJCX0dMT0JBTF9SRVNFVCwoYlJlZ1ZhbHVlfEJCX0dMT0JBTF9SRVNFVF9CSVQpKTsKKwltZGVsYXkoNTApOworCS8qLS0tc2V0IEJCIHJlc2V0IEFjdGl2ZS0tLSovCisJZHdSZWdWYWx1ZSA9IHJlYWRfbmljX2R3b3JkKGRldiwgQ1BVX0dFTik7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgQ1BVX0dFTiwgKGR3UmVnVmFsdWUmKH5DUFVfR0VOX0JCX1JTVCkpKTsKKworCS8qLS0tLUNrZWNrIEZQR0FQSFkwIGFuZCBQSFkxIGJvYXJkIGlzIE9LLS0tLSovCisJLy8gVE9ETzogdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgcmVtb3ZlZCBvbiBBU0lDICwgRW1pbHkgMjAwNy4yLjIKKwlmb3IoZUNoZWNrSXRlbT0oSFc5MF9CTE9DS19FKUhXOTBfQkxPQ0tfUEhZMDsgZUNoZWNrSXRlbTw9SFc5MF9CTE9DS19QSFkxOyBlQ2hlY2tJdGVtKyspCisJeworCQlydFN0YXR1cyAgPSBydGw4MTkyX3BoeV9jaGVja0JCQW5kUkYoZGV2LCAoSFc5MF9CTE9DS19FKWVDaGVja0l0ZW0sIChSRjkwX1JBRElPX1BBVEhfRSkwKTsgLy9kb24ndCBjYXJlIFJGIHBhdGgKKwkJaWYocnRTdGF0dXMgIT0gMCkKKwkJeworCQkJUlRfVFJBQ0UoKENPTVBfRVJSIHwgQ09NUF9QSFkpLCAiUEhZX1JGODI1Nl9Db25maWcoKTpDaGVjayBQSFklZCBGYWlsISFcbiIsIGVDaGVja0l0ZW0tMSk7CisJCQlyZXR1cm4gOworCQl9CisJfQorCS8qLS0tLSBTZXQgQ0NLIGFuZCBPRkRNIEJsb2NrICJPRkYiLS0tLSovCisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9SRk1PRCwgYkNDS0VufGJPRkRNRW4sIDB4MCk7CisJLyotLS0tQkIgUmVnaXN0ZXIgSW5pdGlsYXphdGlvbi0tLS0qLworCS8vPT1tPT0+U2V0IFBIWSBSRUcgRnJvbSBIZWFkZXI8PT1tPT0KKwlydGw4MTkyX3BoeUNvbmZpZ0JCKGRldiwgQmFzZUJhbmRfQ29uZmlnX1BIWV9SRUcpOworCisJLyotLS0tU2V0IEJCIHJlc2V0IGRlLUFjdGl2ZS0tLS0qLworCWR3UmVnVmFsdWUgPSByZWFkX25pY19kd29yZChkZXYsIENQVV9HRU4pOworCXdyaXRlX25pY19kd29yZChkZXYsIENQVV9HRU4sIChkd1JlZ1ZhbHVlfENQVV9HRU5fQkJfUlNUKSk7CisKKwkvKi0tLS1CQiBBR0MgdGFibGUgSW5pdGlhbGl6YXRpb24tLS0tKi8KKwkvLz09bT09PlNldCBQSFkgUkVHIEZyb20gSGVhZGVyPD09bT09CisJcnRsODE5Ml9waHlDb25maWdCQihkZXYsIEJhc2VCYW5kX0NvbmZpZ19BR0NfVEFCKTsKKworCS8qLS0tLUVuYWJsZSBYU1RBTCAtLS0tKi8KKwl3cml0ZV9uaWNfYnl0ZV9FKGRldiwgMHg1ZSwgMHgwMCk7CisJaWYgKHByaXYtPmNhcmRfODE5Ml92ZXJzaW9uID09ICh1OClWRVJTSU9OXzgxOXhVX0EpCisJeworCQkvL0FudGVubmEgZ2FpbiBvZmZzZXQgZnJvbSBCL0MvRCB0byBBCisJCWR3UmVnVmFsdWUgPSAocHJpdi0+QW50ZW5uYVR4UHdEaWZmWzFdPDw0IHwgcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzBdKTsKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9UeEdhaW5TdGFnZSwgKGJYQlR4QUdDfGJYQ1R4QUdDKSwgZHdSZWdWYWx1ZSk7CisKKwkJLy9YU1RBTExDYXAKKwkJZHdSZWdWYWx1ZSA9IHByaXYtPkNyeXN0YWxDYXAgJiAweGY7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMSwgYlh0YWxDYXAsIGR3UmVnVmFsdWUpOworCX0KKworCS8vIENoZWNrIGlmIHRoZSBDQ0sgSGlnaFBvd2VyIGlzIHR1cm5lZCBPTi4KKwkvLyBUaGlzIGlzIHVzZWQgdG8gY2FsY3VsYXRlIFBXREIuCisJcHJpdi0+YkNja0hpZ2hQb3dlciA9ICh1OCkocnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyLCAweDIwMCkpOworCXJldHVybjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgQkImUkYKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiAgSW5pdGlhbGl6YXRpb24gdmFsdWUgbWF5IGNoYW5nZSBhbGwgdGhlIHRpbWUsIHNvIHBsZWFzZSBtYWtlCisgKiAgICAgICAgICAgc3VyZSBpdCBoYXMgYmVlbiBzeW5jZWQgd2l0aCB0aGUgbmV3ZXN0LgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX0JCQ29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJcnRsODE5Ml9Jbml0QkJSRlJlZ0RlZihkZXYpOworCS8vY29uZmlnIEJCJlJGLiBBcyBoYXJkQ29kZSBiYXNlZCBpbml0aWFsaXphdGlvbiBoYXMgbm90IGJlZW4gd2VsbAorCS8vaW1wbGVtZW50ZWQsIHNvIHVzZSBmaWxlIGZpcnN0LkZJWE1FOnNob3VsZCBpbXBsZW1lbnQgaXQgZm9yIGhhcmRjb2RlPworCXJ0bDgxOTJfQkJfQ29uZmlnX1BhcmFGaWxlKGRldik7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBvYnRhaW5zIHRoZSBpbml0aWFsaXphdGlvbiB2YWx1ZSBvZiBUeCBwb3dlciBMZXZlbCBvZmZzZXQKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJ0bDgxOTJfcGh5X2dldFR4UG93ZXIoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcHJpdi0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbMF0gPQorCQlyZWFkX25pY19kd29yZChkZXYsIHJUeEFHQ19SYXRlMThfMDYpOworCXByaXYtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WzFdID0KKwkJcmVhZF9uaWNfZHdvcmQoZGV2LCByVHhBR0NfUmF0ZTU0XzI0KTsKKwlwcml2LT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFsyXSA9CisJCXJlYWRfbmljX2R3b3JkKGRldiwgclR4QUdDX01jczAzX01jczAwKTsKKwlwcml2LT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFszXSA9CisJCXJlYWRfbmljX2R3b3JkKGRldiwgclR4QUdDX01jczA3X01jczA0KTsKKwlwcml2LT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFs0XSA9CisJCXJlYWRfbmljX2R3b3JkKGRldiwgclR4QUdDX01jczExX01jczA4KTsKKwlwcml2LT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFs1XSA9CisJCXJlYWRfbmljX2R3b3JkKGRldiwgclR4QUdDX01jczE1X01jczEyKTsKKworCS8vIHJlYWQgcnggaW5pdGlhbCBnYWluCisJcHJpdi0+RGVmYXVsdEluaXRpYWxHYWluWzBdID0gcmVhZF9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQUFHQ0NvcmUxKTsKKwlwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMV0gPSByZWFkX25pY19ieXRlKGRldiwgck9GRE0wX1hCQUdDQ29yZTEpOworCXByaXYtPkRlZmF1bHRJbml0aWFsR2FpblsyXSA9IHJlYWRfbmljX2J5dGUoZGV2LCByT0ZETTBfWENBR0NDb3JlMSk7CisJcHJpdi0+RGVmYXVsdEluaXRpYWxHYWluWzNdID0gcmVhZF9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YREFHQ0NvcmUxKTsKKwlSVF9UUkFDRShDT01QX0lOSVQsICJEZWZhdWx0IGluaXRpYWwgZ2FpbiAoYzUwPTB4JXgsIGM1OD0weCV4LCBjNjA9MHgleCwgYzY4PTB4JXgpIFxuIiwKKwkJcHJpdi0+RGVmYXVsdEluaXRpYWxHYWluWzBdLCBwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMV0sCisJCXByaXYtPkRlZmF1bHRJbml0aWFsR2FpblsyXSwgcHJpdi0+RGVmYXVsdEluaXRpYWxHYWluWzNdKTsKKworCS8vIHJlYWQgZnJhbWVzeW5jCisJcHJpdi0+ZnJhbWVzeW5jID0gcmVhZF9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMyk7CisJcHJpdi0+ZnJhbWVzeW5jQzM0ID0gcmVhZF9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMik7CisJUlRfVFJBQ0UoQ09NUF9JTklULCAiRGVmYXVsdCBmcmFtZXN5bmMgKDB4JXgpID0gMHgleCBcbiIsCisJCXJPRkRNMF9SeERldGVjdG9yMywgcHJpdi0+ZnJhbWVzeW5jKTsKKworCS8vIHJlYWQgU0lGUyAoc2F2ZSB0aGUgdmFsdWUgcmVhZCBmb21lIE1BQ1BIWV9SRUcudHh0KQorCXByaXYtPlNpZnNUaW1lID0gcmVhZF9uaWNfd29yZChkZXYsIFNJRlMpOworCisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBvYnRhaW5zIHRoZSBpbml0aWFsaXphdGlvbiB2YWx1ZSBvZiBUeCBwb3dlciBMZXZlbCBvZmZzZXQKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJ0bDgxOTJfcGh5X3NldFR4UG93ZXIoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTggY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTgJcG93ZXJsZXZlbCA9IHByaXYtPlR4UG93ZXJMZXZlbENDS1tjaGFubmVsLTFdOworCXU4CXBvd2VybGV2ZWxPRkRNMjRHID0gcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R1tjaGFubmVsLTFdOworCisJc3dpdGNoKHByaXYtPnJmX2NoaXApCisJeworCWNhc2UgUkZfODI1NjoKKwkJUEhZX1NldFJGODI1NkNDS1R4UG93ZXIoZGV2LCBwb3dlcmxldmVsKTsgLy9uZWVkIGZ1cnRoZXIgaW1wbGVtZW50CisJCVBIWV9TZXRSRjgyNTZPRkRNVHhQb3dlcihkZXYsIHBvd2VybGV2ZWxPRkRNMjRHKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKy8vCWNhc2UgUkZfODIyNToKKy8vCWNhc2UgUkZfODI1ODoKKwkJUlRfVFJBQ0UoKENPTVBfUEhZfENPTVBfRVJSKSwgImVycm9yIFJGIGNoaXBJRCg4MjI1IG9yIDgyNTgpIGluIGZ1bmN0aW9uICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIGNoZWNrIFJmIGNoaXAgdG8gZG8gUkYgY29uZmlnCisgKiAgIGlucHV0OiAgbmV0X2RldmljZSBkZXYKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgb25seSA4MjU2IGlzIHN1cHBvcnRlZAorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX3BoeV9SRkNvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXN3aXRjaChwcml2LT5yZl9jaGlwKQorCXsKKwkJY2FzZSBSRl84MjU2OgorCQkJUEhZX1JGODI1Nl9Db25maWcoZGV2KTsKKwkJCWJyZWFrOworCS8vCWNhc2UgUkZfODIyNToKKwkvLwljYXNlIFJGXzgyNTg6CisJCWRlZmF1bHQ6CisJCQlSVF9UUkFDRShDT01QX0VSUiwgImVycm9yIGNoaXAgaWRcbiIpOworCQkJYnJlYWs7CisJfQorCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gdXBkYXRlIEluaXRpYWwgZ2FpbgorICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2CisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIEFzIFdpbmRvd3MgaGFzIG5vdCBpbXBsZW1lbnRlZCB0aGlzLCB3YWl0IGZvciBjb21wbGVtZW50CisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJ0bDgxOTJfcGh5X3VwZGF0ZUluaXRHYWluKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiByZWFkIFJGIHBhcmFtZXRlcnMgZnJvbSBnZW5lcmFsIGhlYWQgZmlsZSwgYW5kIGRvIFJGIDMtd2lyZQorICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2CisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIHJldHVybiBjb2RlIHNob3cgaWYgUkYgY29uZmlndXJhdGlvbiBpcyBzdWNjZXNzZnVsKDA6cGFzcywgMTpmYWlsKQorICogICAgTm90ZTogIERlbGF5IG1heSBiZSByZXF1aXJlZCBmb3IgUkYgY29uZmlndXJhdGlvbgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggcnRsODE5Ml9waHlfQ29uZmlnUkZXaXRoSGVhZGVyRmlsZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBSRjkwX1JBRElPX1BBVEhfRQllUkZQYXRoKQoreworCisJaW50IGk7CisJLy91MzIqIHBSRkFycmF5OworCXU4IHJldCA9IDA7CisKKwlzd2l0Y2goZVJGUGF0aCl7CisJCWNhc2UgUkY5MF9QQVRIX0E6CisJCQlmb3IoaSA9IDA7aTxSYWRpb0FfQXJyYXlMZW5ndGg7IGk9aSsyKXsKKworCQkJCWlmKHJ0bDgxOVhSYWRpb0FfQXJyYXlbaV0gPT0gMHhmZSl7CisJCQkJCQltZGVsYXkoMTAwKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIGVSRlBhdGgsIHJ0bDgxOVhSYWRpb0FfQXJyYXlbaV0sIGJNYXNrMTJCaXRzLCBydGw4MTlYUmFkaW9BX0FycmF5W2krMV0pOworCQkJCW1kZWxheSgxKTsKKworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUkY5MF9QQVRIX0I6CisJCQlmb3IoaSA9IDA7aTxSYWRpb0JfQXJyYXlMZW5ndGg7IGk9aSsyKXsKKworCQkJCWlmKHJ0bDgxOVhSYWRpb0JfQXJyYXlbaV0gPT0gMHhmZSl7CisJCQkJCQltZGVsYXkoMTAwKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIGVSRlBhdGgsIHJ0bDgxOVhSYWRpb0JfQXJyYXlbaV0sIGJNYXNrMTJCaXRzLCBydGw4MTlYUmFkaW9CX0FycmF5W2krMV0pOworCQkJCW1kZWxheSgxKTsKKworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUkY5MF9QQVRIX0M6CisJCQlmb3IoaSA9IDA7aTxSYWRpb0NfQXJyYXlMZW5ndGg7IGk9aSsyKXsKKworCQkJCWlmKHJ0bDgxOVhSYWRpb0NfQXJyYXlbaV0gPT0gMHhmZSl7CisJCQkJCQltZGVsYXkoMTAwKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIGVSRlBhdGgsIHJ0bDgxOVhSYWRpb0NfQXJyYXlbaV0sIGJNYXNrMTJCaXRzLCBydGw4MTlYUmFkaW9DX0FycmF5W2krMV0pOworCQkJCW1kZWxheSgxKTsKKworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUkY5MF9QQVRIX0Q6CisJCQlmb3IoaSA9IDA7aTxSYWRpb0RfQXJyYXlMZW5ndGg7IGk9aSsyKXsKKworCQkJCWlmKHJ0bDgxOVhSYWRpb0RfQXJyYXlbaV0gPT0gMHhmZSl7CisJCQkJCQltZGVsYXkoMTAwKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIGVSRlBhdGgsIHJ0bDgxOVhSYWRpb0RfQXJyYXlbaV0sIGJNYXNrMTJCaXRzLCBydGw4MTlYUmFkaW9EX0FycmF5W2krMV0pOworCQkJCW1kZWxheSgxKTsKKworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OzsKKworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gc2V0IFR4IFBvd2VyIG9mIHRoZSBjaGFubmVsCisgKiAgIGlucHV0OiAgc3RydWN0IG5ldF9kZXZpY2UgKmRldgorICogICAJICAgICB1OCAJCWNoYW5uZWwKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogICAgTm90ZToKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcnRsODE5Ml9TZXRUeFBvd2VyTGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTgJcG93ZXJsZXZlbCA9IHByaXYtPlR4UG93ZXJMZXZlbENDS1tjaGFubmVsLTFdOworCXU4CXBvd2VybGV2ZWxPRkRNMjRHID0gcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R1tjaGFubmVsLTFdOworCisJc3dpdGNoKHByaXYtPnJmX2NoaXApCisJeworCWNhc2UgUkZfODIyNToKKyNpZmRlZiBUT19ET19MSVNUCisJCVBIWV9TZXRSRjgyMjVDY2tUeFBvd2VyKEFkYXB0ZXIsIHBvd2VybGV2ZWwpOworCQlQSFlfU2V0UkY4MjI1T2ZkbVR4UG93ZXIoQWRhcHRlciwgcG93ZXJsZXZlbE9GRE0yNEcpOworI2VuZGlmCisJCWJyZWFrOworCisJY2FzZSBSRl84MjU2OgorCQlQSFlfU2V0UkY4MjU2Q0NLVHhQb3dlcihkZXYsIHBvd2VybGV2ZWwpOworCQlQSFlfU2V0UkY4MjU2T0ZETVR4UG93ZXIoZGV2LCBwb3dlcmxldmVsT0ZETTI0Ryk7CisJCWJyZWFrOworCisJY2FzZSBSRl84MjU4OgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlSVF9UUkFDRShDT01QX0VSUiwgInVua25vd24gcmYgY2hpcCBJRCBpbiBydGw4MTkyX1NldFR4UG93ZXJMZXZlbCgpXG4iKTsKKwkJYnJlYWs7CisJfQorCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gc2V0IFJGIHN0YXRlIG9uIG9yIG9mZgorICogICBpbnB1dDogIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKyAqICAgCSAgICAgUlRfUkZfUE9XRVJfU1RBVEUgZVJGUG93ZXJTdGF0ZSAgLy9Qb3dlciBTdGF0ZSB0byBzZXQKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogICAgTm90ZToKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2wgcnRsODE5Ml9TZXRSRlBvd2VyU3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgUlRfUkZfUE9XRVJfU1RBVEUgZVJGUG93ZXJTdGF0ZSkKK3sKKwlib29sCQkJCWJSZXN1bHQgPSB0cnVlOworLy8JdTgJCQkJCWVSRlBhdGg7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYoZVJGUG93ZXJTdGF0ZSA9PSBwcml2LT5pZWVlODAyMTEtPmVSRlBvd2VyU3RhdGUpCisJCXJldHVybiBmYWxzZTsKKworCWlmKHByaXYtPlNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3MgPT0gdHJ1ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJcHJpdi0+U2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzcyA9IHRydWU7CisKKwlzd2l0Y2gocHJpdi0+cmZfY2hpcCkKKwl7CisJCWNhc2UgUkZfODI1NjoKKwkJc3dpdGNoKCBlUkZQb3dlclN0YXRlICkKKwkJeworCQkJY2FzZSBlUmZPbjoKKwkvL1JGLUEsIFJGLUIKKwkJCQkJLy9lbmFibGUgUkYtQ2hpcCBBL0IKKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCBCSVQ0LCAweDEpOwkvLyAweDg2MFs0XQorCQkJCQkvL2FuYWxvZyB0byBkaWdpdGFsIG9uCisJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNCwgMHgzMDAsIDB4Myk7Ly8gMHg4OGNbOTo4XQorCQkJCQkvL2RpZ2l0YWwgdG8gYW5hbG9nIG9uCisJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMSwgMHgxOCwgMHgzKTsgLy8gMHg4ODBbNDozXQorCQkJCQkvL3J4IGFudGVubmEgb24KKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLCAweDMsIDB4Myk7Ly8gMHhjMDRbMTowXQorCQkJCQkvL3J4IGFudGVubmEgb24KKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMV9UUnhQYXRoRW5hYmxlLCAweDMsIDB4Myk7Ly8gMHhkMDRbMTowXQorCQkJCQkvL2FuYWxvZyB0byBkaWdpdGFsIHBhcnQyIG9uCisJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMSwgMHg2MCwgMHgzKTsgLy8gMHg4ODBbNjo1XQorCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgZVJmU2xlZXA6CisKKwkJCQlicmVhazsKKworCQkJY2FzZSBlUmZPZmY6CisJCQkJCS8vUkYtQSwgUkYtQgorCQkJCQkvL2Rpc2FibGUgUkYtQ2hpcCBBL0IKKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCBCSVQ0LCAweDApOwkvLyAweDg2MFs0XQorCQkJCQkvL2FuYWxvZyB0byBkaWdpdGFsIG9mZiwgZm9yIHBvd2VyIHNhdmUKKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXI0LCAweGYwMCwgMHgwKTsvLyAweDg4Y1sxMTo4XQorCQkJCQkvL2RpZ2l0YWwgdG8gYW5hbG9nIG9mZiwgZm9yIHBvd2VyIHNhdmUKKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIxLCAweDE4LCAweDApOyAvLyAweDg4MFs0OjNdCisJCQkJCS8vcnggYW50ZW5uYSBvZmYKKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLCAweGYsIDB4MCk7Ly8gMHhjMDRbMzowXQorCQkJCQkvL3J4IGFudGVubmEgb2ZmCisJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTFfVFJ4UGF0aEVuYWJsZSwgMHhmLCAweDApOy8vIDB4ZDA0WzM6MF0KKwkJCQkJLy9hbmFsb2cgdG8gZGlnaXRhbCBwYXJ0MiBvZmYsIGZvciBwb3dlciBzYXZlCisJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMSwgMHg2MCwgMHgwKTsgLy8gMHg4ODBbNjo1XQorCisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYlJlc3VsdCA9IGZhbHNlOworCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiU2V0UkZQb3dlclN0YXRlODE5eFVzYigpOiB1bmtub3cgc3RhdGUgdG8gc2V0OiAweCVYISEhXG4iLCBlUkZQb3dlclN0YXRlKTsKKwkJCQlicmVhazsKKwkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlSVF9UUkFDRShDT01QX0VSUiwgIk5vdCBzdXBwb3J0IHJmX2NoaXAoJXgpXG4iLCBwcml2LT5yZl9jaGlwKTsKKwkJCWJyZWFrOworCX0KKyNpZmRlZiBUT19ET19MSVNUCisJaWYoYlJlc3VsdCkKKwl7CisJCS8vIFVwZGF0ZSBjdXJyZW50IFJGIHN0YXRlIHZhcmlhYmxlLgorCQlwSGFsRGF0YS0+ZVJGUG93ZXJTdGF0ZSA9IGVSRlBvd2VyU3RhdGU7CisJCXN3aXRjaChwSGFsRGF0YS0+UkZDaGlwSUQgKQorCQl7CisJCQljYXNlIFJGXzgyNTY6CisJCXN3aXRjaChwSGFsRGF0YS0+ZVJGUG93ZXJTdGF0ZSkKKwkJCQl7CisJCQkJY2FzZSBlUmZPZmY6CisJCQkJCS8vCisJCQkJCS8vSWYgUmYgb2ZmIHJlYXNvbiBpcyBmcm9tIElQUywgTGVkIHNob3VsZCBibGluayB3aXRoIG5vIGxpbmssIGJ5IE1hZGRlc3QgMDcxMDE1CisJCQkJCS8vCisJCQkJCWlmKHBNZ250SW5mby0+UmZPZmZSZWFzb249PVJGX0NIQU5HRV9CWV9JUFMgKQorCQkJCQl7CisJCQkJCQlBZGFwdGVyLT5IYWxGdW5jLkxlZENvbnRyb2xIYW5kbGVyKEFkYXB0ZXIsTEVEX0NUTF9OT19MSU5LKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vIFR1cm4gb2ZmIExFRCBpZiBSRiBpcyBub3QgT04uCisJCQkJCQlBZGFwdGVyLT5IYWxGdW5jLkxlZENvbnRyb2xIYW5kbGVyKEFkYXB0ZXIsIExFRF9DVExfUE9XRVJfT0ZGKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWNhc2UgZVJmT246CisJCQkJCS8vIFR1cm4gb24gUkYgd2UgYXJlIHN0aWxsIGxpbmtlZCwgd2hpY2ggbWlnaHQgaGFwcGVuIHdoZW4KKwkJCQkJLy8gd2UgcXVpY2tseSB0dXJuIG9mZiBhbmQgb24gSFcgUkYuIDIwMDYuMDUuMTIsIGJ5IHJjbmprby4KKwkJCQkJaWYoIHBNZ250SW5mby0+Yk1lZGlhQ29ubmVjdCA9PSBUUlVFICkKKwkJCQkJeworCQkJCQkJQWRhcHRlci0+SGFsRnVuYy5MZWRDb250cm9sSGFuZGxlcihBZGFwdGVyLCBMRURfQ1RMX0xJTkspOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy8gVHVybiBvZmYgTEVEIGlmIFJGIGlzIG5vdCBPTi4KKwkJCQkJCUFkYXB0ZXItPkhhbEZ1bmMuTGVkQ29udHJvbEhhbmRsZXIoQWRhcHRlciwgTEVEX0NUTF9OT19MSU5LKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCS8vIGRvIG5vdGhpbmcuCisJCQkJCWJyZWFrOworCQkJCX0vLyBTd2l0Y2ggUkYgc3RhdGUKKwkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCVJUX1RSQUNFKENPTVBfUkYsIERCR19MT1VELCAoIlNldFJGUG93ZXJTdGF0ZTgxOTAoKTogVW5rbm93biBSRiB0eXBlXG4iKSk7CisJCQkJCWJyZWFrOworCQkJfQorCisJfQorI2VuZGlmCisJcHJpdi0+U2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzcyA9IGZhbHNlOworCisJcmV0dXJuIGJSZXN1bHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBzZXQgY29tbWFuZCB0YWJsZSB2YXJpYWJsZShzdHJ1Y3QgU3dDaG5sQ21kKS4KKyAqICAgaW5wdXQ6ICBTd0NobmxDbWQqCQlDbWRUYWJsZSAJLy90YWJsZSB0byBiZSBzZXQuCisgKiAgIAkgICAgIHUzMgkJQ21kVGFibGVJZHggCS8vdmFyaWFibGUgaW5kZXggaW4gdGFibGUgdG8gYmUgc2V0CisgKiAgIAkgICAgIHUzMgkJQ21kVGFibGVTegkvL3RhYmxlIHNpemUuCisgKiAgIAkgICAgIFN3Q2hubENtZElECUNtZElECQkvL2NvbW1hbmQgSUQgdG8gc2V0LgorICoJICAgICB1MzIJCVBhcmExCisgKgkgICAgIHUzMgkJUGFyYTIKKyAqCSAgICAgdTMyCQltc0RlbGF5CisgKiAgb3V0cHV0OgorICogIHJldHVybjogIHRydWUgaWYgZmluaXNoZWQsIGZhbHNlIG90aGVyd2lzZQorICogICAgTm90ZToKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHJ0bDgxOTJfcGh5X1NldFN3Q2hubENtZEFycmF5KAorCVN3Q2hubENtZCoJCUNtZFRhYmxlLAorCXUzMgkJCUNtZFRhYmxlSWR4LAorCXUzMgkJCUNtZFRhYmxlU3osCisJU3dDaG5sQ21kSUQJCUNtZElELAorCXUzMgkJCVBhcmExLAorCXUzMgkJCVBhcmEyLAorCXUzMgkJCW1zRGVsYXkKKwkpCit7CisJU3dDaG5sQ21kKiBwQ21kOworCisJaWYoQ21kVGFibGUgPT0gTlVMTCkKKwl7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAicGh5X1NldFN3Q2hubENtZEFycmF5KCk6IENtZFRhYmxlIGNhbm5vdCBiZSBOVUxMLlxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYoQ21kVGFibGVJZHggPj0gQ21kVGFibGVTeikKKwl7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAicGh5X1NldFN3Q2hubENtZEFycmF5KCk6IEFjY2VzcyBpbnZhbGlkIGluZGV4LCBwbGVhc2UgY2hlY2sgc2l6ZSBvZiB0aGUgdGFibGUsIENtZFRhYmxlSWR4OiVkLCBDbWRUYWJsZVN6OiVkXG4iLAorCQkJCUNtZFRhYmxlSWR4LCBDbWRUYWJsZVN6KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXBDbWQgPSBDbWRUYWJsZSArIENtZFRhYmxlSWR4OworCXBDbWQtPkNtZElEID0gQ21kSUQ7CisJcENtZC0+UGFyYTEgPSBQYXJhMTsKKwlwQ21kLT5QYXJhMiA9IFBhcmEyOworCXBDbWQtPm1zRGVsYXkgPSBtc0RlbGF5OworCisJcmV0dXJuIHRydWU7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBzZXQgY2hhbm5lbCBzdGVwIGJ5IHN0ZXAKKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisgKiAgIAkgICAgIHU4IAkJY2hhbm5lbAorICogICAJICAgICB1OCogCQlzdGFnZSAvLzMgc3RhZ2VzCisgKiAgIAkgICAgIHU4KiAJCXN0ZXAgIC8vCisgKiAgIAkgICAgIHUzMiogCQlkZWxheSAvL3doZXRoZXIgbmVlZCB0byBkZWxheQorICogIG91dHB1dDogIHN0b3JlIG5ldyBzdGFnZSwgc3RlcCBhbmQgZGVsYXkgZm9yIG5leHQgc3RlcChjb21iaW5lIHdpdGggZnVuY3Rpb24gYWJvdmUpCisgKiAgcmV0dXJuOiAgdHJ1ZSBpZiBmaW5pc2hlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgKiAgICBOb3RlOiAgV2FpdCBmb3Igc2ltcGxlciBmdW5jdGlvbiB0byByZXBsYWNlIGl0IC8vd2IKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHJ0bDgxOTJfcGh5X1N3Q2hubFN0ZXBCeVN0ZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggY2hhbm5lbCwgdTgqIHN0YWdlLCB1OCogc3RlcCwgdTMyKiBkZWxheSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisvLwlQQ0hBTk5FTF9BQ0NFU1NfU0VUVElORwlwQ2hubEFjY2Vzc1NldHRpbmc7CisJU3dDaG5sQ21kCQkJCVByZUNvbW1vbkNtZFtNQVhfUFJFQ01EX0NOVF07CisJdTMyCQkJCQlQcmVDb21tb25DbWRDbnQ7CisJU3dDaG5sQ21kCQkJCVBvc3RDb21tb25DbWRbTUFYX1BPU1RDTURfQ05UXTsKKwl1MzIJCQkJCVBvc3RDb21tb25DbWRDbnQ7CisJU3dDaG5sQ21kCQkJCVJmRGVwZW5kQ21kW01BWF9SRkRFUEVORENNRF9DTlRdOworCXUzMgkJCQkJUmZEZXBlbmRDbWRDbnQ7CisJU3dDaG5sQ21kCQkJCSpDdXJyZW50Q21kID0gTlVMTDsKKwkvL1JGOTBfUkFESU9fUEFUSF9FCQllUkZQYXRoOworCXU4CQllUkZQYXRoOworLy8JdTMyCQlSZlJldFZhbDsKKy8vCXU4CQlSZXRyeUNudDsKKworCVJUX1RSQUNFKENPTVBfQ0gsICI9PT09PiVzKCk9PT09c3RhZ2U6JWQsIHN0ZXA6JWQsIGNoYW5uZWw6JWRcbiIsIF9fRlVOQ1RJT05fXywgKnN0YWdlLCAqc3RlcCwgY2hhbm5lbCk7CisvLwlSVF9BU1NFUlQoSXNMZWdhbENoYW5uZWwoQWRhcHRlciwgY2hhbm5lbCksICgiaWxsZWdhbCBjaGFubmVsOiAlZFxuIiwgY2hhbm5lbCkpOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZiAoIUlzTGVnYWxDaGFubmVsKHByaXYtPmllZWU4MDIxMSwgY2hhbm5lbCkpCisJeworCQlSVF9UUkFDRShDT01QX0VSUiwgIj09PT09PT09PT09PT0+c2V0IHRvIGlsbGVnYWwgY2hhbm5lbDolZFxuIiwgY2hhbm5lbCk7CisJCXJldHVybiB0cnVlOyAvL3JldHVybiB0cnVlIHRvIHRlbGwgdXBwZXIgY2FsbGVyIGZ1bmN0aW9uIHRoaXMgY2hhbm5lbCBzZXR0aW5nIGlzIGZpbmlzaGVkISBPciBpdCB3aWxsIGluIHdoaWxlIGxvb3AuCisJfQorI2VuZGlmCisvL0ZJWE1FOm5lZWQgdG8gY2hlY2sgd2hldGhlciBjaGFubmVsIGlzIGxlZ2FsIG9yIG5vdCBoZXJlLldCCisKKworCS8vZm9yKGVSRlBhdGggPSBSRjkwX1BBVEhfQTsgZVJGUGF0aCA8cEhhbERhdGEtPk51bVRvdGFsUkZQYXRoOyBlUkZQYXRoKyspCisvLwlmb3IoZVJGUGF0aCA9IDA7IGVSRlBhdGggPFJGOTBfUEFUSF9NQVg7IGVSRlBhdGgrKykKKy8vCXsKKy8vCQlpZiAoIXJ0bDgxOTJfcGh5X0NoZWNrSXNMZWdhbFJGUGF0aChkZXYsIGVSRlBhdGgpKQorLy8JCQljb250aW51ZTsKKwkJLy8gPDE+IEZpbGwgdXAgcHJlIGNvbW1vbiBjb21tYW5kLgorCQlQcmVDb21tb25DbWRDbnQgPSAwOworCQlydGw4MTkyX3BoeV9TZXRTd0NobmxDbWRBcnJheShQcmVDb21tb25DbWQsIFByZUNvbW1vbkNtZENudCsrLCBNQVhfUFJFQ01EX0NOVCwKKwkJCQkJQ21kSURfU2V0VHhQb3dlckxldmVsLCAwLCAwLCAwKTsKKwkJcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoUHJlQ29tbW9uQ21kLCBQcmVDb21tb25DbWRDbnQrKywgTUFYX1BSRUNNRF9DTlQsCisJCQkJCUNtZElEX0VuZCwgMCwgMCwgMCk7CisKKwkJLy8gPDI+IEZpbGwgdXAgcG9zdCBjb21tb24gY29tbWFuZC4KKwkJUG9zdENvbW1vbkNtZENudCA9IDA7CisKKwkJcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoUG9zdENvbW1vbkNtZCwgUG9zdENvbW1vbkNtZENudCsrLCBNQVhfUE9TVENNRF9DTlQsCisJCQkJCUNtZElEX0VuZCwgMCwgMCwgMCk7CisKKwkJLy8gPDM+IEZpbGwgdXAgUkYgZGVwZW5kZW50IGNvbW1hbmQuCisJCVJmRGVwZW5kQ21kQ250ID0gMDsKKwkJc3dpdGNoKCBwcml2LT5yZl9jaGlwICkKKwkJeworCQljYXNlIFJGXzgyMjU6CisJCQlpZiAoIShjaGFubmVsID49IDEgJiYgY2hhbm5lbCA8PSAxNCkpCisJCQl7CisJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJpbGxlZ2FsIGNoYW5uZWwgZm9yIFplYnJhIDgyMjU6ICVkXG4iLCBjaGFubmVsKTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCXJ0bDgxOTJfcGh5X1NldFN3Q2hubENtZEFycmF5KFJmRGVwZW5kQ21kLCBSZkRlcGVuZENtZENudCsrLCBNQVhfUkZERVBFTkRDTURfQ05ULAorCQkJCUNtZElEX1JGX1dyaXRlUmVnLCByWmVicmExX0NoYW5uZWwsIFJGX0NIQU5ORUxfVEFCTEVfWkVCUkFbY2hhbm5lbF0sIDEwKTsKKwkJCXJ0bDgxOTJfcGh5X1NldFN3Q2hubENtZEFycmF5KFJmRGVwZW5kQ21kLCBSZkRlcGVuZENtZENudCsrLCBNQVhfUkZERVBFTkRDTURfQ05ULAorCQkJCUNtZElEX0VuZCwgMCwgMCwgMCk7CisJCQlicmVhazsKKworCQljYXNlIFJGXzgyNTY6CisJCQkvLyBURVNUISEgVGhpcyBpcyBub3QgdGhlIHRhYmxlIGZvciA4MjU2ISEKKwkJCWlmICghKGNoYW5uZWwgPj0gMSAmJiBjaGFubmVsIDw9IDE0KSkKKwkJCXsKKwkJCQlSVF9UUkFDRShDT01QX0VSUiwgImlsbGVnYWwgY2hhbm5lbCBmb3IgWmVicmEgODI1NjogJWRcbiIsIGNoYW5uZWwpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoUmZEZXBlbmRDbWQsIFJmRGVwZW5kQ21kQ250KyssIE1BWF9SRkRFUEVORENNRF9DTlQsCisJCQkJQ21kSURfUkZfV3JpdGVSZWcsIHJaZWJyYTFfQ2hhbm5lbCwgY2hhbm5lbCwgMTApOworCQkJcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoUmZEZXBlbmRDbWQsIFJmRGVwZW5kQ21kQ250KyssIE1BWF9SRkRFUEVORENNRF9DTlQsCisJCQlDbWRJRF9FbmQsIDAsIDAsIDApOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRl84MjU4OgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCAiVW5rbm93biBSRkNoaXBJRDogJWRcbiIsIHByaXYtPnJmX2NoaXApOworCQkJcmV0dXJuIHRydWU7CisJCQlicmVhazsKKwkJfQorCisKKwkJZG97CisJCQlzd2l0Y2goKnN0YWdlKQorCQkJeworCQkJY2FzZSAwOgorCQkJCUN1cnJlbnRDbWQ9JlByZUNvbW1vbkNtZFsqc3RlcF07CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJQ3VycmVudENtZD0mUmZEZXBlbmRDbWRbKnN0ZXBdOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCUN1cnJlbnRDbWQ9JlBvc3RDb21tb25DbWRbKnN0ZXBdOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZihDdXJyZW50Q21kLT5DbWRJRD09Q21kSURfRW5kKQorCQkJeworCQkJCWlmKCgqc3RhZ2UpPT0yKQorCQkJCXsKKwkJCQkJKCpkZWxheSk9Q3VycmVudENtZC0+bXNEZWxheTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSgqc3RhZ2UpKys7CisJCQkJCSgqc3RlcCk9MDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCisJCQlzd2l0Y2goQ3VycmVudENtZC0+Q21kSUQpCisJCQl7CisJCQljYXNlIENtZElEX1NldFR4UG93ZXJMZXZlbDoKKwkJCQlpZihwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA9PSAodTgpVkVSU0lPTl84MTl4VV9BKSAvL3hpb25nOiBjb25zaWRlciBpdCBsYXRlciEKKwkJCQkJcnRsODE5Ml9TZXRUeFBvd2VyTGV2ZWwoZGV2LGNoYW5uZWwpOworCQkJCWJyZWFrOworCQkJY2FzZSBDbWRJRF9Xcml0ZVBvcnRVbG9uZzoKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBDdXJyZW50Q21kLT5QYXJhMSwgQ3VycmVudENtZC0+UGFyYTIpOworCQkJCWJyZWFrOworCQkJY2FzZSBDbWRJRF9Xcml0ZVBvcnRVc2hvcnQ6CisJCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBDdXJyZW50Q21kLT5QYXJhMSwgKHUxNilDdXJyZW50Q21kLT5QYXJhMik7CisJCQkJYnJlYWs7CisJCQljYXNlIENtZElEX1dyaXRlUG9ydFVjaGFyOgorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgQ3VycmVudENtZC0+UGFyYTEsICh1OClDdXJyZW50Q21kLT5QYXJhMik7CisJCQkJYnJlYWs7CisJCQljYXNlIENtZElEX1JGX1dyaXRlUmVnOgorCQkJCWZvcihlUkZQYXRoID0gMDsgZVJGUGF0aCA8IFJGOTBfUEFUSF9NQVg7IGVSRlBhdGgrKykKKwkJCQl7CisJCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgQ3VycmVudENtZC0+UGFyYTEsIGJaZWJyYTFfQ2hhbm5lbE51bSwgQ3VycmVudENtZC0+UGFyYTIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWJyZWFrOworCQl9d2hpbGUodHJ1ZSk7CisvLwl9Lypmb3IoTnVtYmVyIG9mIFJGIHBhdGhzKSovCisKKwkoKmRlbGF5KT1DdXJyZW50Q21kLT5tc0RlbGF5OworCSgqc3RlcCkrKzsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIGRvZXMgYWN0dXJhbGx5IHNldCBjaGFubmVsIHdvcmsKKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisgKiAgIAkgICAgIHU4IAkJY2hhbm5lbAorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub2luCisgKiAgICBOb3RlOiAgV2Ugc2hvdWxkIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcnRsODE5Ml9waHlfRmluaXNoU3dDaG5sTm93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGNoYW5uZWwpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMglkZWxheSA9IDA7CisKKwl3aGlsZSghcnRsODE5Ml9waHlfU3dDaG5sU3RlcEJ5U3RlcChkZXYsY2hhbm5lbCwmcHJpdi0+U3dDaG5sU3RhZ2UsJnByaXYtPlN3Q2hubFN0ZXAsJmRlbGF5KSkKKwl7CisJLy8JaWYoZGVsYXk+MCkKKwkvLwkJbXNsZWVwKGRlbGF5KTsvL29yIG1kZWxheT8gbmVlZCBmdXJ0aGVyIGNvbnNpZGVyYXRpb24KKwkJaWYoIXByaXYtPnVwKQorCQkJYnJlYWs7CisJfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIENhbGxiYWNrIHJvdXRpbmUgb2YgdGhlIHdvcmsgaXRlbSBmb3Igc3dpdGNoIGNoYW5uZWwuCisgKiAgIGlucHV0OgorICoKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9pbgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX1N3Q2hubF9Xb3JrSXRlbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJUlRfVFJBQ0UoQ09NUF9DSCwgIj09PiBTd0NobmxDYWxsYmFjazgxOXhVc2JXb3JrSXRlbSgpLCBjaGFuOiVkXG4iLCBwcml2LT5jaGFuKTsKKworCisJcnRsODE5Ml9waHlfRmluaXNoU3dDaG5sTm93KGRldiAsIHByaXYtPmNoYW4pOworCisJUlRfVFJBQ0UoQ09NUF9DSCwgIjw9PSBTd0NobmxDYWxsYmFjazgxOXhVc2JXb3JrSXRlbSgpXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gc2NoZWR1bGVkIGFjdHVyYWwgd29ya2l0ZW0gdG8gc2V0IGNoYW5uZWwKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogICAJICAgICB1OAkJY2hhbm5lbCAvL2NoYW5uZWwgdG8gc2V0CisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIHJldHVybiBjb2RlIHNob3cgaWYgd29ya2l0ZW0gaXMgc2NoZWR1bGVkKDE6cGFzcywgMDpmYWlsKQorICogICAgTm90ZTogIERlbGF5IG1heSBiZSByZXF1aXJlZCBmb3IgUkYgY29uZmlndXJhdGlvbgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggcnRsODE5Ml9waHlfU3dDaG5sKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHU4IGNoYW5uZWwpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCVJUX1RSQUNFKENPTVBfQ0gsICI9PT09PT4lcygpLCBTd0NobmxJblByb2dyZXNzOiVkXG4iLCBfX0ZVTkNUSU9OX18sIHByaXYtPlN3Q2hubEluUHJvZ3Jlc3MpOworCWlmKCFwcml2LT51cCkKKwkJcmV0dXJuIGZhbHNlOworCWlmKHByaXYtPlN3Q2hubEluUHJvZ3Jlc3MpCisJCXJldHVybiBmYWxzZTsKKworLy8JaWYocEhhbERhdGEtPlNldEJXTW9kZUluUHJvZ3Jlc3MpCisvLwkJcmV0dXJuOworaWYgKDApIC8vdG8gdGVzdCBjdXJyZW50IGNoYW5uZWwgZnJvbSBSRiByZWcgMHg3LgoreworCXU4CQllUkZQYXRoOworCWZvcihlUkZQYXRoID0gMDsgZVJGUGF0aCA8IDI7IGVSRlBhdGgrKyl7CisJcHJpbnRrKCI9PT09PnNldCBjaGFubmVsOiV4XG4iLHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgMHg3LCBiWmVicmExX0NoYW5uZWxOdW0pKTsKKwl1ZGVsYXkoMTApOworCX0KK30KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJc3dpdGNoKHByaXYtPmllZWU4MDIxMS0+bW9kZSkKKwl7CisJY2FzZSBXSVJFTEVTU19NT0RFX0E6CisJY2FzZSBXSVJFTEVTU19NT0RFX05fNUc6CisJCWlmIChjaGFubmVsPD0xNCl7CisJCQlSVF9UUkFDRShDT01QX0VSUiwgIldJUkVMRVNTX01PREVfQSBidXQgY2hhbm5lbDw9MTQiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdJUkVMRVNTX01PREVfQjoKKwkJaWYgKGNoYW5uZWw+MTQpeworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJXSVJFTEVTU19NT0RFX0IgYnV0IGNoYW5uZWw+MTQiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdJUkVMRVNTX01PREVfRzoKKwljYXNlIFdJUkVMRVNTX01PREVfTl8yNEc6CisJCWlmIChjaGFubmVsPjE0KXsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCAiV0lSRUxFU1NfTU9ERV9HIGJ1dCBjaGFubmVsPjE0Iik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJfQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXByaXYtPlN3Q2hubEluUHJvZ3Jlc3MgPSB0cnVlOworCWlmKGNoYW5uZWwgPT0gMCkKKwkJY2hhbm5lbCA9IDE7CisKKwlwcml2LT5jaGFuPWNoYW5uZWw7CisKKwlwcml2LT5Td0NobmxTdGFnZT0wOworCXByaXYtPlN3Q2hubFN0ZXA9MDsKKy8vCXNjaGVkdWxlX3dvcmsoJihwcml2LT5Td0NobmxXb3JrSXRlbSkpOworLy8JcnRsODE5Ml9Td0NobmxfV29ya0l0ZW0oZGV2KTsKKwlpZihwcml2LT51cCkgeworLy8JCXF1ZXVlX3dvcmsocHJpdi0+cHJpdl93cSwmKHByaXYtPlN3Q2hubFdvcmtJdGVtKSk7CisJcnRsODE5Ml9Td0NobmxfV29ya0l0ZW0oZGV2KTsKKwl9CisKKwlwcml2LT5Td0NobmxJblByb2dyZXNzID0gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CisKKworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBDYWxsYmFjayByb3V0aW5lIG9mIHRoZSB3b3JrIGl0ZW0gZm9yIHNldCBiYW5kd2lkdGggbW9kZS4KKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisgKiAgIAkgICAgIEhUX0NIQU5ORUxfV0lEVEgJQmFuZHdpZHRoICAvLzIwTSBvciA0ME0KKyAqICAgCSAgICAgSFRfRVhUQ0hOTF9PRkZTRVQgT2Zmc2V0IAkgICAvL1VwcGVyLCBMb3dlciwgb3IgRG9uJ3QgY2FyZQorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgICBOb3RlOiAgSSBkb3VidCB3aGV0aGVyIFNldEJXTW9kZUluUHJvZ3Jlc3MgZmxhZyBpcyBuZWNlc3NhcnkgYXMgd2UgY2FuCisgKiAgICAJICAgICB0ZXN0IHdoZXRoZXIgY3VycmVudCB3b3JrIGluIHRoZSBxdWV1ZSBvciBub3QuLy9kbyBJPworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX1NldEJXTW9kZVdvcmtJdGVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggcmVnQndPcE1vZGU7CisKKwlSVF9UUkFDRShDT01QX1NXQlcsICI9PT5ydGw4MTkyX1NldEJXTW9kZVdvcmtJdGVtKCkgIFN3aXRjaCB0byAlcyBiYW5kd2lkdGhcbiIsIFwKKwkJCQkJcHJpdi0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwPyIyME1IeiI6IjQwTUh6IikKKworCisJaWYocHJpdi0+cmZfY2hpcCA9PSBSRl9QU0VVRE9fMTFOKQorCXsKKwkJcHJpdi0+U2V0QldNb2RlSW5Qcm9ncmVzcz0gZmFsc2U7CisJCXJldHVybjsKKwl9CisKKwkvLzwxPlNldCBNQUMgcmVnaXN0ZXIKKwlyZWdCd09wTW9kZSA9IHJlYWRfbmljX2J5dGUoZGV2LCBCV19PUE1PREUpOworCisJc3dpdGNoKHByaXYtPkN1cnJlbnRDaGFubmVsQlcpCisJeworCQljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjA6CisJCQlyZWdCd09wTW9kZSB8PSBCV19PUE1PREVfMjBNSFo7CisJCSAgICAgICAvLyAyMDA3LzAyLzA3IE1hcmsgYnkgRW1pbHkgYmVjYXN1ZSB3ZSBoYXZlIG5vdCB2ZXJpZnkgd2hldGhlciB0aGlzIHJlZ2lzdGVyIHdvcmtzCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEJXX09QTU9ERSwgcmVnQndPcE1vZGUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwOgorCQkJcmVnQndPcE1vZGUgJj0gfkJXX09QTU9ERV8yME1IWjsKKwkJCS8vIDIwMDcvMDIvMDcgTWFyayBieSBFbWlseSBiZWNhc3VlIHdlIGhhdmUgbm90IHZlcmlmeSB3aGV0aGVyIHRoaXMgcmVnaXN0ZXIgd29ya3MKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQldfT1BNT0RFLCByZWdCd09wTW9kZSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJTZXRDaGFubmVsQmFuZHdpZHRoODE5eFVzYigpOiB1bmtub3duIEJhbmR3aWR0aDogJSNYXG4iLHByaXYtPkN1cnJlbnRDaGFubmVsQlcpOworCQkJYnJlYWs7CisJfQorCisJLy88Mj5TZXQgUEhZIHJlbGF0ZWQgcmVnaXN0ZXIKKwlzd2l0Y2gocHJpdi0+Q3VycmVudENoYW5uZWxCVykKKwl7CisJCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMDoKKwkJCS8vIEFkZCBieSBWaXZpIDIwMDcxMTE5CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX1JGTU9ELCBiUkZNT0QsIDB4MCk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0ExX1JGTU9ELCBiUkZNT0QsIDB4MCk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEsIDB4MDAxMDAwMDAsIDEpOworCisJCQkvLyBDb3JyZWN0IHRoZSB0eCBwb3dlciBmb3IgQ0NLIHJhdGUgaW4gMjBNLiBTdWdnZXN0IGJ5IFlOLCAyMDA3MTIwNworCQkJcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uID0KKwkJCQlwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fMjBNZGVmYXVsdCArIHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl9kaWZmZXJlbmNlOworCisJCQlpZihwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24gPiAyMikKKwkJCQlwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb249IDIyOworCQkJaWYocHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uPCAwKQorCQkJCXByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbiA9IDA7CisJCQlSVF9UUkFDRShDT01QX0lOSVQsICIyME0sIHBIYWxEYXRhLT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0gJWRcbiIsIHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbik7CisKKwkJCWlmKHByaXYtPmNoYW4gPT0gMTQgJiYgIXByaXYtPmJjY2tfaW5fY2gxNCkKKwkJCXsKKwkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSBUUlVFOworCQkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYscHJpdi0+YmNja19pbl9jaDE0KTsKKwkJCX0KKwkJCWVsc2UgaWYocHJpdi0+Y2hhbiAhPSAxNCAmJiBwcml2LT5iY2NrX2luX2NoMTQpCisJCQl7CisJCQkJcHJpdi0+YmNja19pbl9jaDE0ID0gRkFMU0U7CisJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldixwcml2LT5iY2NrX2luX2NoMTQpOworCQkJfQorCQkJZWxzZQorCQkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYscHJpdi0+YmNja19pbl9jaDE0KTsKKworCQkJYnJlYWs7CisJCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMF80MDoKKwkJCS8vIEFkZCBieSBWaXZpIDIwMDcxMTE5CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX1JGTU9ELCBiUkZNT0QsIDB4MSk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0ExX1JGTU9ELCBiUkZNT0QsIDB4MSk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfU3lzdGVtLCBiQ0NLU2lkZUJhbmQsIChwcml2LT5uQ3VyNDBNaHpQcmltZVNDPj4xKSk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEsIDB4MDAxMDAwMDAsIDApOworCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMV9MU1RGLCAweEMwMCwgcHJpdi0+bkN1cjQwTWh6UHJpbWVTQyk7CisJCQlwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24gPQorCQkJCXByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl80ME1kZWZhdWx0ICsgcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2U7CisKKwkJCWlmKHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbiA+IDIyKQorCQkJCXByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbiA9IDIyOworCQkJaWYocHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uIDwgMCkKKwkJCQlwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24gPSAwOworCisJCQlSVF9UUkFDRShDT01QX0lOSVQsICI0ME0sIHBIYWxEYXRhLT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0gJWRcbiIsIHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbik7CisJCQlpZihwcml2LT5jaGFuID09IDE0ICYmICFwcml2LT5iY2NrX2luX2NoMTQpCisJCQl7CisJCQkJcHJpdi0+YmNja19pbl9jaDE0ID0gdHJ1ZTsKKwkJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QoZGV2LHByaXYtPmJjY2tfaW5fY2gxNCk7CisJCQl9CisJCQllbHNlIGlmKHByaXYtPmNoYW4hPSAxNCAmJiBwcml2LT5iY2NrX2luX2NoMTQpCisJCQl7CisJCQkJcHJpdi0+YmNja19pbl9jaDE0ID0gZmFsc2U7CisJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldixwcml2LT5iY2NrX2luX2NoMTQpOworCQkJfQorCQkJZWxzZQorCQkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYscHJpdi0+YmNja19pbl9jaDE0KTsKKworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlSVF9UUkFDRShDT01QX0VSUiwgIlNldENoYW5uZWxCYW5kd2lkdGg4MTl4VXNiKCk6IHVua25vd24gQmFuZHdpZHRoOiAlI1hcbiIgLHByaXYtPkN1cnJlbnRDaGFubmVsQlcpOworCQkJYnJlYWs7CisKKwl9CisJLy9Ta2lwIG92ZXIgc2V0dGluZyBvZiBKLW1vZGUgaW4gQkIgcmVnaXN0ZXIgaGVyZS4gRGVmYXVsdCB2YWx1ZSBpcyAiTm9uZSBKIG1vZGUiLiBFbWlseSAyMDA3MDMxNQorCisJLy88Mz5TZXQgUkYgcmVsYXRlZCByZWdpc3RlcgorCXN3aXRjaCggcHJpdi0+cmZfY2hpcCApCisJeworCQljYXNlIFJGXzgyMjU6CisjaWZkZWYgVE9fRE9fTElTVAorCQkJUEhZX1NldFJGODIyNUJhbmR3aWR0aChBZGFwdGVyLCBwSGFsRGF0YS0+Q3VycmVudENoYW5uZWxCVyk7CisjZW5kaWYKKwkJCWJyZWFrOworCisJCWNhc2UgUkZfODI1NjoKKwkJCVBIWV9TZXRSRjgyNTZCYW5kd2lkdGgoZGV2LCBwcml2LT5DdXJyZW50Q2hhbm5lbEJXKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkZfODI1ODoKKwkJCS8vIFBIWV9TZXRSRjgyNThCYW5kd2lkdGgoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkZfUFNFVURPXzExTjoKKwkJCS8vIERvIE5vdGhpbmcKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlSVF9UUkFDRShDT01QX0VSUiwgIlVua25vd24gUkZDaGlwSUQ6ICVkXG4iLCBwcml2LT5yZl9jaGlwKTsKKwkJCWJyZWFrOworCX0KKwlwcml2LT5TZXRCV01vZGVJblByb2dyZXNzPSBmYWxzZTsKKworCVJUX1RSQUNFKENPTVBfU1dCVywgIjw9PVNldEJXTW9kZTgxOXhVc2IoKSwgJWQiLCBhdG9taWNfcmVhZCgmKHByaXYtPmllZWU4MDIxMS0+YXRtX3N3YncpKSApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBzY2hlZHVsZXMgYmFuZHdpdGggc3dpdGNoIHdvcmsuCisgKiAgIGlucHV0OiAgc3RydWN0IG5ldF9kZXZpY2UgKmRldgorICogICAJICAgICBIVF9DSEFOTkVMX1dJRFRICUJhbmR3aWR0aCAgLy8yME0gb3IgNDBNCisgKiAgIAkgICAgIEhUX0VYVENITkxfT0ZGU0VUIE9mZnNldCAJICAgLy9VcHBlciwgTG93ZXIsIG9yIERvbid0IGNhcmUKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogICAgTm90ZTogIEkgZG91YnQgd2hldGhlciBTZXRCV01vZGVJblByb2dyZXNzIGZsYWcgaXMgbmVjZXNzYXJ5IGFzIHdlIGNhbgorICogICAgCSAgICAgdGVzdCB3aGV0aGVyIGN1cnJlbnQgd29yayBpbiB0aGUgcXVldWUgb3Igbm90Li8vZG8gST8KKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcnRsODE5Ml9TZXRCV01vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgSFRfQ0hBTk5FTF9XSURUSAlCYW5kd2lkdGgsIEhUX0VYVENITkxfT0ZGU0VUIE9mZnNldCkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZihwcml2LT5TZXRCV01vZGVJblByb2dyZXNzKQorCQlyZXR1cm47CisJcHJpdi0+U2V0QldNb2RlSW5Qcm9ncmVzcz0gdHJ1ZTsKKworCXByaXYtPkN1cnJlbnRDaGFubmVsQlcgPSBCYW5kd2lkdGg7CisKKwlpZihPZmZzZXQ9PUhUX0VYVENITkxfT0ZGU0VUX0xPV0VSKQorCQlwcml2LT5uQ3VyNDBNaHpQcmltZVNDID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX1VQUEVSOworCWVsc2UgaWYoT2Zmc2V0PT1IVF9FWFRDSE5MX09GRlNFVF9VUFBFUikKKwkJcHJpdi0+bkN1cjQwTWh6UHJpbWVTQyA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUjsKKwllbHNlCisJCXByaXYtPm5DdXI0ME1oelByaW1lU0MgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOworCisJLy9xdWV1ZV93b3JrKHByaXYtPnByaXZfd3EsICYocHJpdi0+U2V0QldNb2RlV29ya0l0ZW0pKTsKKwkvLwlzY2hlZHVsZV93b3JrKCYocHJpdi0+U2V0QldNb2RlV29ya0l0ZW0pKTsKKwlydGw4MTkyX1NldEJXTW9kZVdvcmtJdGVtKGRldik7CisKK30KKwordm9pZCBJbml0aWFsR2FpbjgxOXhVc2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwJdTggT3BlcmF0aW9uKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXByaXYtPkluaXRpYWxHYWluT3BlcmF0ZVR5cGUgPSBPcGVyYXRpb247CisKKwlpZihwcml2LT51cCkKKwl7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5wcml2X3dxLCZwcml2LT5pbml0aWFsZ2Fpbl9vcGVyYXRlX3dxLDApOworCX0KK30KKworZXh0ZXJuIHZvaWQgSW5pdGlhbEdhaW5PcGVyYXRlV29ya0l0ZW1DYWxsQmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOworICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGR3b3JrLHN0cnVjdCByODE5Ml9wcml2LGluaXRpYWxnYWluX29wZXJhdGVfd3EpOworICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5pZWVlODAyMTEtPmRldjsKKyNkZWZpbmUgU0NBTl9SWF9JTklUSUFMX0dBSU4JMHgxNworI2RlZmluZSBQT1dFUl9ERVRFQ1RJT05fVEgJMHgwOAorCXUzMglCaXRNYXNrOworCXU4CWluaXRpYWxfZ2FpbjsKKwl1OAlPcGVyYXRpb247CisKKwlPcGVyYXRpb24gPSBwcml2LT5Jbml0aWFsR2Fpbk9wZXJhdGVUeXBlOworCisJc3dpdGNoKE9wZXJhdGlvbikKKwl7CisJCWNhc2UgSUdfQmFja3VwOgorCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiSUdfQmFja3VwLCBiYWNrdXAgdGhlIGluaXRpYWwgZ2Fpbi5cbiIpOworCQkJaW5pdGlhbF9nYWluID0gU0NBTl9SWF9JTklUSUFMX0dBSU47Ly9wcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMF07Ly8KKwkJCUJpdE1hc2sgPSBiTWFza0J5dGUwOworCQkJaWYoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobSA9PSBESUdfQUxHT19CWV9GQUxTRV9BTEFSTSkKKwkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgVUZXUCwgYk1hc2tCeXRlMSwgMHg4KTsJLy8gRlcgRElHIE9GRgorCQkJcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhhYWdjY29yZTEgPSAodTgpcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgck9GRE0wX1hBQUdDQ29yZTEsIEJpdE1hc2spOworCQkJcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhiYWdjY29yZTEgPSAodTgpcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgck9GRE0wX1hCQUdDQ29yZTEsIEJpdE1hc2spOworCQkJcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEgPSAodTgpcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgck9GRE0wX1hDQUdDQ29yZTEsIEJpdE1hc2spOworCQkJcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhkYWdjY29yZTEgPSAodTgpcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgck9GRE0wX1hEQUdDQ29yZTEsIEJpdE1hc2spOworCQkJQml0TWFzayAgPSBiTWFza0J5dGUyOworCQkJcHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYQkJPSAodTgpcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgckNDSzBfQ0NBLCBCaXRNYXNrKTsKKworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBJbml0aWFsR2FpbkJhY2t1cCAweGM1MCBpcyAleFxuIixwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEluaXRpYWxHYWluQmFja3VwIDB4YzU4IGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54YmFnY2NvcmUxKTsKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gSW5pdGlhbEdhaW5CYWNrdXAgMHhjNjAgaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEpOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBJbml0aWFsR2FpbkJhY2t1cCAweGM2OCBpcyAleFxuIixwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEluaXRpYWxHYWluQmFja3VwIDB4YTBhIGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC5jY2EpOworCisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJXcml0ZSBzY2FuIGluaXRpYWwgZ2FpbiA9IDB4JXggXG4iLCBpbml0aWFsX2dhaW4pOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSwgaW5pdGlhbF9nYWluKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hCQUdDQ29yZTEsIGluaXRpYWxfZ2Fpbik7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQ0FHQ0NvcmUxLCBpbml0aWFsX2dhaW4pOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWERBR0NDb3JlMSwgaW5pdGlhbF9nYWluKTsKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIldyaXRlIHNjYW4gMHhhMGEgPSAweCV4IFxuIiwgUE9XRVJfREVURUNUSU9OX1RIKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhhMGEsIFBPV0VSX0RFVEVDVElPTl9USCk7CisJCQlicmVhazsKKwkJY2FzZSBJR19SZXN0b3JlOgorCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiSUdfUmVzdG9yZSwgcmVzdG9yZSB0aGUgaW5pdGlhbCBnYWluLlxuIik7CisJCQlCaXRNYXNrID0gMHg3ZjsgLy9CaXQwfiBCaXQ2CisJCQlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtID09IERJR19BTEdPX0JZX0ZBTFNFX0FMQVJNKQorCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBVRldQLCBiTWFza0J5dGUxLCAweDgpOwkvLyBGVyBESUcgT0ZGCisKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSwgQml0TWFzaywgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hCQUdDQ29yZTEsIEJpdE1hc2ssICh1MzIpcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhiYWdjY29yZTEpOworCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQ0FHQ0NvcmUxLCBCaXRNYXNrLCAodTMyKXByaXYtPmluaXRnYWluX2JhY2t1cC54Y2FnY2NvcmUxKTsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWERBR0NDb3JlMSwgQml0TWFzaywgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSk7CisJCQlCaXRNYXNrICA9IGJNYXNrQnl0ZTI7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfQ0NBLCBCaXRNYXNrLCAodTMyKXByaXYtPmluaXRnYWluX2JhY2t1cC5jY2EpOworCisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEJCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzUwIGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54YWFnY2NvcmUxKTsKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gQkJJbml0aWFsR2FpblJlc3RvcmUgMHhjNTggaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLnhiYWdjY29yZTEpOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBCQkluaXRpYWxHYWluUmVzdG9yZSAweGM2MCBpcyAleFxuIixwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGNhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEJCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzY4IGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54ZGFnY2NvcmUxKTsKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gQkJJbml0aWFsR2FpblJlc3RvcmUgMHhhMGEgaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSk7CisKKyNpZmRlZiBSVEw4MTkwUAorCQkJU2V0VHhQb3dlckxldmVsODE5MChBZGFwdGVyLHByaXYtPkN1cnJlbnRDaGFubmVsKTsKKyNlbmRpZgorI2lmZGVmIFJUTDgxOTJFCisJCQlTZXRUeFBvd2VyTGV2ZWw4MTkwKEFkYXB0ZXIscHJpdi0+Q3VycmVudENoYW5uZWwpOworI2VuZGlmCisvLyNpZmRlZiBSVEw4MTkyVQorCQkJcnRsODE5Ml9waHlfc2V0VHhQb3dlcihkZXYscHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisvLyNlbmRpZgorCisJCQlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtID09IERJR19BTEdPX0JZX0ZBTFNFX0FMQVJNKQorCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBVRldQLCBiTWFza0J5dGUxLCAweDEpOwkvLyBGVyBESUcgT04KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiVW5rbm93biBJRyBPcGVyYXRpb24uIFxuIik7CisJCQlicmVhazsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlM2JjNTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeS5oCkBAIC0wLDAgKzEsOTAgQEAKKyNpZm5kZWYgX1I4MTlYVV9QSFlfSAorI2RlZmluZSBfUjgxOVhVX1BIWV9ICisKKy8qIENoYW5uZWwgc3dpdGNoOlRoZSBzaXplIG9mIGNvbW1hbmQgdGFibGVzIGZvciBzd2l0Y2ggY2hhbm5lbCovCisjZGVmaW5lIE1BWF9QUkVDTURfQ05UIDE2CisjZGVmaW5lIE1BWF9SRkRFUEVORENNRF9DTlQgMTYKKyNkZWZpbmUgTUFYX1BPU1RDTURfQ05UIDE2CisKK3R5cGVkZWYgZW51bSBfU3dDaG5sQ21kSUR7CisJQ21kSURfRW5kLAorCUNtZElEX1NldFR4UG93ZXJMZXZlbCwKKwlDbWRJRF9CQlJlZ1dyaXRlMTAsCisJQ21kSURfV3JpdGVQb3J0VWxvbmcsCisJQ21kSURfV3JpdGVQb3J0VXNob3J0LAorCUNtZElEX1dyaXRlUG9ydFVjaGFyLAorCUNtZElEX1JGX1dyaXRlUmVnLAorfVN3Q2hubENtZElEOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIHN0cnVjdHVyZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIDEuIFN3aXRjaCBjaGFubmVsIHJlbGF0ZWQgKi8KK3R5cGVkZWYgc3RydWN0IF9Td0NobmxDbWR7CisJU3dDaG5sQ21kSUQJQ21kSUQ7CisJdTMyCQkJUGFyYTE7CisJdTMyCQkJUGFyYTI7CisJdTMyCQkJbXNEZWxheTsKK31fX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgU3dDaG5sQ21kOworCitleHRlcm4gdTMyIHJ0bDgxOVhNQUNQSFlfQXJyYXlfUEdbXTsKK2V4dGVybiB1MzIgcnRsODE5WFBIWV9SRUdfMVQyUkFycmF5W107CitleHRlcm4gdTMyIHJ0bDgxOVhBR0NUQUJfQXJyYXlbXTsKK2V4dGVybiB1MzIgcnRsODE5WFJhZGlvQV9BcnJheVtdOworZXh0ZXJuIHUzMiBydGw4MTlYUmFkaW9CX0FycmF5W107CitleHRlcm4gdTMyIHJ0bDgxOVhSYWRpb0NfQXJyYXlbXTsKK2V4dGVybiB1MzIgcnRsODE5WFJhZGlvRF9BcnJheVtdOworCit0eXBlZGVmIGVudW0gX0hXOTBfQkxPQ0t7CisJSFc5MF9CTE9DS19NQUMgPSAwLAorCUhXOTBfQkxPQ0tfUEhZMCA9IDEsCisJSFc5MF9CTE9DS19QSFkxID0gMiwKKwlIVzkwX0JMT0NLX1JGID0gMywKKwlIVzkwX0JMT0NLX01BWElNVU0gPSA0LCAvLyBOZXZlciB1c2UgdGhpcworfUhXOTBfQkxPQ0tfRSwgKlBIVzkwX0JMT0NLX0U7CisKK3R5cGVkZWYgZW51bSBfUkY5MF9SQURJT19QQVRIeworCVJGOTBfUEFUSF9BID0gMCwJCQkvL1JhZGlvIFBhdGggQQorCVJGOTBfUEFUSF9CID0gMSwJCQkvL1JhZGlvIFBhdGggQgorCVJGOTBfUEFUSF9DID0gMiwJCQkvL1JhZGlvIFBhdGggQworCVJGOTBfUEFUSF9EID0gMywJCQkvL1JhZGlvIFBhdGggRAorCVJGOTBfUEFUSF9NQVgJCQkJLy9NYXggUkYgbnVtYmVyIDkyIHN1cHBvcnQKK31SRjkwX1JBRElPX1BBVEhfRSwgKlBSRjkwX1JBRElPX1BBVEhfRTsKKworI2RlZmluZSBiTWFza0J5dGUwICAgICAgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgYk1hc2tCeXRlMSAgICAgICAgICAgICAgICAweGZmMDAKKyNkZWZpbmUgYk1hc2tCeXRlMiAgICAgICAgICAgICAgICAweGZmMDAwMAorI2RlZmluZSBiTWFza0J5dGUzICAgICAgICAgICAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgYk1hc2tIV29yZCAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIGJNYXNrTFdvcmQgICAgICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBiTWFza0RXb3JkICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKworLy9leHRlcm4gdTMyIHJ0bDgxOTJfQ2FsY3VsYXRlQml0U2hpZnQodTMyIGR3Qml0TWFzayk7CitleHRlcm4gdTggcnRsODE5Ml9waHlfQ2hlY2tJc0xlZ2FsUkZQYXRoKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHUzMiBlUkZQYXRoKTsKK2V4dGVybiB2b2lkIHJ0bDgxOTJfc2V0QkJyZWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTMyIGR3UmVnQWRkciwgdTMyIGR3Qml0TWFzaywgdTMyIGR3RGF0YSk7CitleHRlcm4gdTMyIHJ0bDgxOTJfUXVlcnlCQlJlZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1MzIgZHdSZWdBZGRyLCB1MzIgZHdCaXRNYXNrKTsKKy8vZXh0ZXJuIHUzMiBydGw4MTkyX3BoeV9SRlNlcmlhbFJlYWQoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIE9mZnNldCk7CisvL2V4dGVybiB2b2lkIHJ0bDgxOTJfcGh5X1JGU2VyaWFsV3JpdGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIE9mZnNldCwgdTMyIERhdGEpOworZXh0ZXJuIHZvaWQgcnRsODE5Ml9waHlfU2V0UkZSZWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrLCB1MzIgRGF0YSk7CitleHRlcm4gdTMyIHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrKTsKK2V4dGVybiB2b2lkIHJ0bDgxOTJfcGh5X2NvbmZpZ21hYyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK2V4dGVybiB2b2lkIHJ0bDgxOTJfcGh5Q29uZmlnQkIoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTggQ29uZmlnVHlwZSk7CisvL2V4dGVybiB2b2lkIHJ0bDgxOTJfSW5pdEJCUkZSZWdEZWYoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitleHRlcm4gdTggcnRsODE5Ml9waHlfY2hlY2tCQkFuZFJGKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIEhXOTBfQkxPQ0tfRSBDaGVja0Jsb2NrLCBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoKTsKKy8vZXh0ZXJuIHZvaWQgcnRsODE5Ml9CQl9Db25maWdfUGFyYUZpbGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitleHRlcm4gdm9pZCBydGw4MTkyX0JCQ29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworZXh0ZXJuIHZvaWQgcnRsODE5Ml9waHlfZ2V0VHhQb3dlcihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK2V4dGVybiB2b2lkIHJ0bDgxOTJfcGh5X3NldFR4UG93ZXIoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTggY2hhbm5lbCk7CitleHRlcm4gdm9pZCBydGw4MTkyX3BoeV9SRkNvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK2V4dGVybiB2b2lkIHJ0bDgxOTJfcGh5X3VwZGF0ZUluaXRHYWluKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworZXh0ZXJuIHU4IHJ0bDgxOTJfcGh5X0NvbmZpZ1JGV2l0aEhlYWRlckZpbGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUkY5MF9SQURJT19QQVRIX0UJZVJGUGF0aCk7CisKK2V4dGVybiB1OCBydGw4MTkyX3BoeV9Td0Nobmwoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTggY2hhbm5lbCk7CitleHRlcm4gdm9pZCBydGw4MTkyX1NldEJXTW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBIVF9DSEFOTkVMX1dJRFRICUJhbmR3aWR0aCwgSFRfRVhUQ0hOTF9PRkZTRVQgT2Zmc2V0KTsKK2V4dGVybiB2b2lkIHJ0bDgxOTJfU3dDaG5sX1dvcmtJdGVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTkyX1NldEJXTW9kZVdvcmtJdGVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGJvb2wgcnRsODE5Ml9TZXRSRlBvd2VyU3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgUlRfUkZfUE9XRVJfU1RBVEUgZVJGUG93ZXJTdGF0ZSk7CisvL2FkZGVkIGJ5IGFteQorZXh0ZXJuIHZvaWQgSW5pdGlhbEdhaW44MTl4VXNiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCXU4IE9wZXJhdGlvbik7CisKK2V4dGVybiB2b2lkIEluaXRpYWxHYWluT3BlcmF0ZVdvcmtJdGVtQ2FsbEJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeXJlZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9waHlyZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmIwYjUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9waHlyZWcuaApAQCAtMCwwICsxLDg3MSBAQAorI2lmbmRlZiBfUjgxOVhVX1BIWVJFR19ICisjZGVmaW5lIF9SODE5WFVfUEhZUkVHX0gKKworCisjZGVmaW5lICAgUkZfREFUQQkJCQkweDFkNAkJCQkJLy8gRlcgd2lsbCB3cml0ZSBSRiBkYXRhIGluIHRoZSByZWdpc3Rlci4KKworLy9SZWdpc3RlciAgIC8vZHVwbGljYXRlIHJlZ2lzdGVyIGR1ZSB0byBjb25uZWN0aW9uOiBSRl9Nb2RlLCBUUnhSTiwgTnVtT2YgTC1TVEYKKy8vcGFnZSAxCisjZGVmaW5lIHJQTUFDX1Jlc2V0ICAgICAgICAgICAgICAgCQkweDEwMAorI2RlZmluZSByUE1BQ19UeFN0YXJ0ICAgICAgICAgICAgIAkJMHgxMDQKKyNkZWZpbmUgclBNQUNfVHhMZWdhY3lTSUcgICAgICAgICAJCTB4MTA4CisjZGVmaW5lIHJQTUFDX1R4SFRTSUcxICAgICAgICAgICAgCQkweDEwYworI2RlZmluZSByUE1BQ19UeEhUU0lHMiAgICAgICAgICAgIAkJMHgxMTAKKyNkZWZpbmUgclBNQUNfUEhZRGVidWcgICAgICAgICAgICAJCTB4MTE0CisjZGVmaW5lIHJQTUFDX1R4UGFja2V0TnVtICAgICAgICAgCQkweDExOAorI2RlZmluZSByUE1BQ19UeElkbGUgICAgICAgICAgICAgIAkJMHgxMWMKKyNkZWZpbmUgclBNQUNfVHhNQUNIZWFkZXIwICAgICAgIAkweDEyMAorI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjEgICAgICAgCTB4MTI0CisjZGVmaW5lIHJQTUFDX1R4TUFDSGVhZGVyMiAgICAgICAJMHgxMjgKKyNkZWZpbmUgclBNQUNfVHhNQUNIZWFkZXIzICAgICAgIAkweDEyYworI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjQgICAgICAgCTB4MTMwCisjZGVmaW5lIHJQTUFDX1R4TUFDSGVhZGVyNSAgICAgICAJMHgxMzQKKyNkZWZpbmUgclBNQUNfVHhEYXRhVHlwZSAgICAgICAgICAJCTB4MTM4CisjZGVmaW5lIHJQTUFDX1R4UmFuZG9tU2VlZCAgICAgIAkJMHgxM2MKKyNkZWZpbmUgclBNQUNfQ0NLUExDUFByZWFtYmxlICAJCTB4MTQwCisjZGVmaW5lIHJQTUFDX0NDS1BMQ1BIZWFkZXIgICAgIAkJMHgxNDQKKyNkZWZpbmUgclBNQUNfQ0NLQ1JDMTYgICAgICAgICAgICAJCTB4MTQ4CisjZGVmaW5lIHJQTUFDX09GRE1SeENSQzMyT0sgIAkJMHgxNzAKKyNkZWZpbmUgclBNQUNfT0ZETVJ4Q1JDMzJFciAgIAkJMHgxNzQKKyNkZWZpbmUgclBNQUNfT0ZETVJ4UGFyaXR5RXIgICAgCQkweDE3OAorI2RlZmluZSByUE1BQ19PRkRNUnhDUkM4RXIgICAgIAkJMHgxN2MKKyNkZWZpbmUgclBNQUNfQ0NLQ1J4UkMxNkVyICAgICAgIAkJMHgxODAKKyNkZWZpbmUgclBNQUNfQ0NLQ1J4UkMzMkVyICAgICAgIAkJMHgxODQKKyNkZWZpbmUgclBNQUNfQ0NLQ1J4UkMzMk9LICAgICAgCQkweDE4OAorI2RlZmluZSByUE1BQ19UeFN0YXR1cyAgICAgICAgICAgIAkJMHgxOGMKKworLy9wYWdlOAorI2RlZmluZSByRlBHQTBfUkZNT0QgICAgICAgICAgICAgIAkJMHg4MDAgIC8vUkYgbW9kZSAmIENDSyBUeFNDCisjZGVmaW5lIHJGUEdBMF9UeEluZm8gICAgICAgICAgICAgCQkweDgwNAorI2RlZmluZSByRlBHQTBfUFNERnVuY3Rpb24gICAgICAgIAkJMHg4MDgKKyNkZWZpbmUgckZQR0EwX1R4R2FpblN0YWdlICAgICAgICAJCTB4ODBjCisjZGVmaW5lIHJGUEdBMF9SRlRpbWluZzEgICAgICAgICAgCQkweDgxMAorI2RlZmluZSByRlBHQTBfUkZUaW1pbmcyICAgICAgICAgIAkJMHg4MTQKKy8vI2RlZmluZSByRlBHQTBfWENfUkZUaW1pbmcgICAgICAgIAkJMHg4MTgKKy8vI2RlZmluZSByRlBHQTBfWERfUkZUaW1pbmcgICAgICAgIAkJMHg4MWMKKyNkZWZpbmUgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIxICAJMHg4MjAKKyNkZWZpbmUgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyICAJMHg4MjQKKyNkZWZpbmUgckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIxICAJMHg4MjgKKyNkZWZpbmUgckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIyICAJMHg4MmMKKyNkZWZpbmUgckZQR0EwX1hDX0hTU0lQYXJhbWV0ZXIxICAJMHg4MzAKKyNkZWZpbmUgckZQR0EwX1hDX0hTU0lQYXJhbWV0ZXIyICAJMHg4MzQKKyNkZWZpbmUgckZQR0EwX1hEX0hTU0lQYXJhbWV0ZXIxICAJMHg4MzgKKyNkZWZpbmUgckZQR0EwX1hEX0hTU0lQYXJhbWV0ZXIyICAJMHg4M2MKKyNkZWZpbmUgckZQR0EwX1hBX0xTU0lQYXJhbWV0ZXIgICAJMHg4NDAKKyNkZWZpbmUgckZQR0EwX1hCX0xTU0lQYXJhbWV0ZXIgICAJMHg4NDQKKyNkZWZpbmUgckZQR0EwX1hDX0xTU0lQYXJhbWV0ZXIgICAJMHg4NDgKKyNkZWZpbmUgckZQR0EwX1hEX0xTU0lQYXJhbWV0ZXIgICAJMHg4NGMKKyNkZWZpbmUgckZQR0EwX1JGV2FrZVVwUGFyYW1ldGVyICAJMHg4NTAKKyNkZWZpbmUgckZQR0EwX1JGU2xlZXBVcFBhcmFtZXRlciAJMHg4NTQKKyNkZWZpbmUgckZQR0EwX1hBQl9Td2l0Y2hDb250cm9sICAJMHg4NTgKKyNkZWZpbmUgckZQR0EwX1hDRF9Td2l0Y2hDb250cm9sICAJMHg4NWMKKyNkZWZpbmUgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UgICAJMHg4NjAKKyNkZWZpbmUgckZQR0EwX1hCX1JGSW50ZXJmYWNlT0UgICAJMHg4NjQKKyNkZWZpbmUgckZQR0EwX1hDX1JGSW50ZXJmYWNlT0UgICAJMHg4NjgKKyNkZWZpbmUgckZQR0EwX1hEX1JGSW50ZXJmYWNlT0UgICAJMHg4NmMKKyNkZWZpbmUgckZQR0EwX1hBQl9SRkludGVyZmFjZVNXICAJMHg4NzAKKyNkZWZpbmUgckZQR0EwX1hDRF9SRkludGVyZmFjZVNXICAJMHg4NzQKKyNkZWZpbmUgckZQR0EwX1hBQl9SRlBhcmFtZXRlciAgICAJMHg4NzgKKyNkZWZpbmUgckZQR0EwX1hDRF9SRlBhcmFtZXRlciAgICAJMHg4N2MKKyNkZWZpbmUgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEgICAJMHg4ODAKKyNkZWZpbmUgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjIgICAJMHg4ODQKKyNkZWZpbmUgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjMgICAJMHg4ODgKKyNkZWZpbmUgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjQgICAJMHg4OGMKKyNkZWZpbmUgckZQR0EwX1hBX0xTU0lSZWFkQmFjayAgICAJMHg4YTAKKyNkZWZpbmUgckZQR0EwX1hCX0xTU0lSZWFkQmFjayAgICAJMHg4YTQKKyNkZWZpbmUgckZQR0EwX1hDX0xTU0lSZWFkQmFjayAgICAJMHg4YTgKKyNkZWZpbmUgckZQR0EwX1hEX0xTU0lSZWFkQmFjayAgICAJMHg4YWMKKyNkZWZpbmUgckZQR0EwX1BTRFJlcG9ydCAgICAgICAgICAJCTB4OGI0CisjZGVmaW5lIHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VSQiAgCTB4OGUwCisjZGVmaW5lIHJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VSQiAgCTB4OGU0CisKKy8vcGFnZSA5CisjZGVmaW5lIHJGUEdBMV9SRk1PRCAgICAgICAgICAgICAgCQkweDkwMCAgLy9SRiBtb2RlICYgT0ZETSBUeFNDCisjZGVmaW5lIHJGUEdBMV9UeEJsb2NrICAgICAgICAgICAgCQkweDkwNAorI2RlZmluZSByRlBHQTFfRGVidWdTZWxlY3QgICAgICAgIAkJMHg5MDgKKyNkZWZpbmUgckZQR0ExX1R4SW5mbyAgICAgICAgICAgICAJCTB4OTBjCisKKy8vcGFnZSBhCisjZGVmaW5lIHJDQ0swX1N5c3RlbSAgICAgICAgICAgICAgCQkweGEwMAorI2RlZmluZSByQ0NLMF9BRkVTZXR0aW5nICAgICAgICAgIAkJMHhhMDQKKyNkZWZpbmUgckNDSzBfQ0NBICAgICAgICAgICAgICAgICAJCQkweGEwOAorI2RlZmluZSByQ0NLMF9SeEFHQzEgICAgICAgICAgICAgIAkJMHhhMGMgIC8vQUdDIGRlZmF1bHQgdmFsdWUsIHNhdHVyYXRpb24gbGV2ZWwKKyNkZWZpbmUgckNDSzBfUnhBR0MyICAgICAgICAgICAgICAJCTB4YTEwICAvL0FHQyAmIERBR0MKKyNkZWZpbmUgckNDSzBfUnhIUCAgICAgICAgICAgICAgICAJCTB4YTE0CisjZGVmaW5lIHJDQ0swX0RTUFBhcmFtZXRlcjEgICAgICAgCTB4YTE4ICAvL1RpbWluZyByZWNvdmVyeSAmIENoYW5uZWwgZXN0aW1hdGlvbiB0aHJlc2hvbGQKKyNkZWZpbmUgckNDSzBfRFNQUGFyYW1ldGVyMiAgICAgICAJMHhhMWMgIC8vU1EgdGhyZXNob2xkCisjZGVmaW5lIHJDQ0swX1R4RmlsdGVyMSAgICAgICAgICAgCQkweGEyMAorI2RlZmluZSByQ0NLMF9UeEZpbHRlcjIgICAgICAgICAgIAkJMHhhMjQKKyNkZWZpbmUgckNDSzBfRGVidWdQb3J0ICAgICAgICAgICAJCTB4YTI4ICAvL2RlYnVnIHBvcnQgYW5kIFR4IGZpbHRlcjMKKyNkZWZpbmUgckNDSzBfRmFsc2VBbGFybVJlcG9ydCAgICAJMHhhMmMgIC8vMHhhMmQKKyNkZWZpbmUgckNDSzBfVFJTU0lSZXBvcnQgICAgICAgICAJCTB4YTUwCisjZGVmaW5lIHJDQ0swX1J4UmVwb3J0ICAgICAgICAgICAgCQkweGE1NCAgLy8weGE1NworI2RlZmluZSByQ0NLMF9GQUNvdW50ZXJMb3dlciAgICAgIAkweGE1YyAgLy8weGE1YgorI2RlZmluZSByQ0NLMF9GQUNvdW50ZXJVcHBlciAgICAgIAkweGE1OCAgLy8weGE1YworCisvL3BhZ2UgYworI2RlZmluZSByT0ZETTBfTFNURiAgICAgICAgICAgICAgIAkJMHhjMDAKKyNkZWZpbmUgck9GRE0wX1RSeFBhdGhFbmFibGUgICAgICAJMHhjMDQKKyNkZWZpbmUgck9GRE0wX1RSTXV4UGFyICAgICAgICAgICAJCTB4YzA4CisjZGVmaW5lIHJPRkRNMF9UUlNXSXNvbGF0aW9uICAgICAgCQkweGMwYworI2RlZmluZSByT0ZETTBfWEFSeEFGRSAgICAgICAgICAgIAkJMHhjMTAgIC8vUnhJUSBEQyBvZmZzZXQsIFJ4IGRpZ2l0YWwgZmlsdGVyLCBEQyBub3RjaCBmaWx0ZXIKKyNkZWZpbmUgck9GRE0wX1hBUnhJUUltYmFsYW5jZSAgICAJMHhjMTQgIC8vUnhJUSBpbWJsYW5jZSBtYXRyaXgKKyNkZWZpbmUgck9GRE0wX1hCUnhBRkUgICAgICAgICAgICAJCTB4YzE4CisjZGVmaW5lIHJPRkRNMF9YQlJ4SVFJbWJhbGFuY2UgICAgCTB4YzFjCisjZGVmaW5lIHJPRkRNMF9YQ1J4QUZFICAgICAgICAgICAgCQkweGMyMAorI2RlZmluZSByT0ZETTBfWENSeElRSW1iYWxhbmNlICAgIAkweGMyNAorI2RlZmluZSByT0ZETTBfWERSeEFGRSAgICAgICAgICAgIAkJMHhjMjgKKyNkZWZpbmUgck9GRE0wX1hEUnhJUUltYmFsYW5jZSAgICAJMHhjMmMKKyNkZWZpbmUgck9GRE0wX1J4RGV0ZWN0b3IxICAgICAgICAJCTB4YzMwICAvL1BELEJXICYgU0JECisjZGVmaW5lIHJPRkRNMF9SeERldGVjdG9yMiAgICAgICAgCQkweGMzNCAgLy9TQkQgJiBGYW1lIFN5bmMuCisjZGVmaW5lIHJPRkRNMF9SeERldGVjdG9yMyAgICAgICAgCQkweGMzOCAgLy9GcmFtZSBTeW5jLgorI2RlZmluZSByT0ZETTBfUnhEZXRlY3RvcjQgICAgICAgIAkJMHhjM2MgIC8vUEQsIFNCRCwgRnJhbWUgU3luYyAmIFNob3J0LUdJCisjZGVmaW5lIHJPRkRNMF9SeERTUCAgICAgICAgICAgICAgCQkweGM0MCAgLy9SeCBTeW5jIFBhdGgKKyNkZWZpbmUgck9GRE0wX0NGT2FuZERBR0MgICAgICAgICAJMHhjNDQgIC8vQ0ZPICYgREFHQworI2RlZmluZSByT0ZETTBfQ0NBRHJvcFRocmVzaG9sZCAgIAkweGM0OCAvL0NDQSBEcm9wIHRocmVzaG9sZAorI2RlZmluZSByT0ZETTBfRUNDQVRocmVzaG9sZCAgICAgIAkweGM0YyAvLyBlbmVyZ3kgQ0NBCisjZGVmaW5lIHJPRkRNMF9YQUFHQ0NvcmUxICAgICAgICAgCTB4YzUwCisjZGVmaW5lIHJPRkRNMF9YQUFHQ0NvcmUyICAgICAgICAgCTB4YzU0CisjZGVmaW5lIHJPRkRNMF9YQkFHQ0NvcmUxICAgICAgICAgCTB4YzU4CisjZGVmaW5lIHJPRkRNMF9YQkFHQ0NvcmUyICAgICAgICAgCTB4YzVjCisjZGVmaW5lIHJPRkRNMF9YQ0FHQ0NvcmUxICAgICAgICAgCTB4YzYwCisjZGVmaW5lIHJPRkRNMF9YQ0FHQ0NvcmUyICAgICAgICAgCTB4YzY0CisjZGVmaW5lIHJPRkRNMF9YREFHQ0NvcmUxICAgICAgICAgCTB4YzY4CisjZGVmaW5lIHJPRkRNMF9YREFHQ0NvcmUyICAgICAgICAgCTB4YzZjCisjZGVmaW5lIHJPRkRNMF9BR0NQYXJhbWV0ZXIxICAgICAgCTB4YzcwCisjZGVmaW5lIHJPRkRNMF9BR0NQYXJhbWV0ZXIyICAgICAgCTB4Yzc0CisjZGVmaW5lIHJPRkRNMF9BR0NSU1NJVGFibGUgICAgICAgCTB4Yzc4CisjZGVmaW5lIHJPRkRNMF9IVFNURkFHQyAgICAgICAgICAgCQkweGM3YworI2RlZmluZSByT0ZETTBfWEFUeElRSW1iYWxhbmNlICAgCTB4YzgwCisjZGVmaW5lIHJPRkRNMF9YQVR4QUZFICAgICAgICAgICAgCQkweGM4NAorI2RlZmluZSByT0ZETTBfWEJUeElRSW1iYWxhbmNlICAgIAkweGM4OAorI2RlZmluZSByT0ZETTBfWEJUeEFGRSAgICAgICAgICAgIAkJMHhjOGMKKyNkZWZpbmUgck9GRE0wX1hDVHhJUUltYmFsYW5jZSAgICAJMHhjOTAKKyNkZWZpbmUgck9GRE0wX1hDVHhBRkUgICAgICAgICAgICAJCTB4Yzk0CisjZGVmaW5lIHJPRkRNMF9YRFR4SVFJbWJhbGFuY2UgICAgCTB4Yzk4CisjZGVmaW5lIHJPRkRNMF9YRFR4QUZFICAgICAgICAgICAgCQkweGM5YworI2RlZmluZSByT0ZETTBfUnhIUFBhcmFtZXRlciAgICAgIAkweGNlMAorI2RlZmluZSByT0ZETTBfVHhQc2V1ZG9Ob2lzZVdndCAgIAkweGNlNAorI2RlZmluZSByT0ZETTBfRnJhbWVTeW5jICAgICAgICAgIAkJMHhjZjAKKyNkZWZpbmUgck9GRE0wX0RGU1JlcG9ydCAgICAgICAgICAJCTB4Y2Y0CisjZGVmaW5lIHJPRkRNMF9UeENvZWZmMSAgICAgICAgICAgCQkweGNhNAorI2RlZmluZSByT0ZETTBfVHhDb2VmZjIgICAgICAgICAgIAkJMHhjYTgKKyNkZWZpbmUgck9GRE0wX1R4Q29lZmYzICAgICAgICAgICAJCTB4Y2FjCisjZGVmaW5lIHJPRkRNMF9UeENvZWZmNCAgICAgICAgICAgCQkweGNiMAorI2RlZmluZSByT0ZETTBfVHhDb2VmZjUgICAgICAgICAgIAkJMHhjYjQKKyNkZWZpbmUgck9GRE0wX1R4Q29lZmY2ICAgICAgICAgICAJCTB4Y2I4CisKKworLy9wYWdlIGQKKyNkZWZpbmUgck9GRE0xX0xTVEYgICAgICAgICAgICAgICAJCTB4ZDAwCisjZGVmaW5lIHJPRkRNMV9UUnhQYXRoRW5hYmxlICAgICAgCTB4ZDA0CisjZGVmaW5lIHJPRkRNMV9DRk8gICAgICAgICAgICAgICAgCQkweGQwOAorI2RlZmluZSByT0ZETTFfQ1NJMSAgICAgICAgICAgICAgIAkJMHhkMTAKKyNkZWZpbmUgck9GRE0xX1NCRCAgICAgICAgICAgICAgICAJCTB4ZDE0CisjZGVmaW5lIHJPRkRNMV9DU0kyICAgICAgICAgICAgICAgCQkweGQxOAorI2RlZmluZSByT0ZETTFfQ0ZPVHJhY2tpbmcgICAgICAgIAkJMHhkMmMKKyNkZWZpbmUgck9GRE0xX1RSeE1lc2F1cmUxICAgICAgICAJMHhkMzQKKyNkZWZpbmUgck9GRE0xX0ludGZEZXQgICAgICAgICAgICAJCTB4ZDNjCisjZGVmaW5lIHJPRkRNMV9Qc2V1ZG9Ob2lzZVN0YXRlQUIgMHhkNTAKKyNkZWZpbmUgck9GRE0xX1BzZXVkb05vaXNlU3RhdGVDRCAweGQ1NAorI2RlZmluZSByT0ZETTFfUnhQc2V1ZG9Ob2lzZVdndCAgIDB4ZDU4CisjZGVmaW5lIHJPRkRNX1BIWUNvdW50ZXIxICAgICAgICAgCQkweGRhMCAgLy9jY2EsIHBhcml0eSBmYWlsCisjZGVmaW5lIHJPRkRNX1BIWUNvdW50ZXIyICAgICAgICAgCQkweGRhNCAgLy9yYXRlIGlsbGVnYWwsIGNyYzggZmFpbAorI2RlZmluZSByT0ZETV9QSFlDb3VudGVyMyAgICAgICAgIAkJMHhkYTggIC8vTUNTIG5vdCBzdXBwb3J0CisjZGVmaW5lIHJPRkRNX1Nob3J0Q0ZPQUIgICAgICAgICAgCQkweGRhYworI2RlZmluZSByT0ZETV9TaG9ydENGT0NEICAgICAgICAgIAkJMHhkYjAKKyNkZWZpbmUgck9GRE1fTG9uZ0NGT0FCICAgICAgICAgICAJCTB4ZGI0CisjZGVmaW5lIHJPRkRNX0xvbmdDRk9DRCAgICAgICAgICAgCQkweGRiOAorI2RlZmluZSByT0ZETV9UYWlsQ0ZPQUIgICAgICAgICAgIAkJMHhkYmMKKyNkZWZpbmUgck9GRE1fVGFpbENGT0NEICAgICAgICAgICAJCTB4ZGMwCisjZGVmaW5lIHJPRkRNX1BXTWVhc3VyZTEgICAgICAgICAgCTB4ZGM0CisjZGVmaW5lIHJPRkRNX1BXTWVhc3VyZTIgICAgICAgICAgCTB4ZGM4CisjZGVmaW5lIHJPRkRNX0JXUmVwb3J0ICAgICAgICAgICAgCQkweGRjYworI2RlZmluZSByT0ZETV9BR0NSZXBvcnQgICAgICAgICAgIAkJMHhkZDAKKyNkZWZpbmUgck9GRE1fUnhTTlIgICAgICAgICAgICAgICAJCTB4ZGQ0CisjZGVmaW5lIHJPRkRNX1J4RVZNQ1NJICAgICAgICAgICAgCQkweGRkOAorI2RlZmluZSByT0ZETV9TSUdSZXBvcnQgICAgICAgICAgIAkJMHhkZGMKKworLy9wYWdlIGUKKyNkZWZpbmUgclR4QUdDX1JhdGUxOF8wNgkJCTB4ZTAwCisjZGVmaW5lIHJUeEFHQ19SYXRlNTRfMjQJCQkweGUwNAorI2RlZmluZSByVHhBR0NfQ0NLX01jczMyCQkJMHhlMDgKKyNkZWZpbmUgclR4QUdDX01jczAzX01jczAwCQkJMHhlMTAKKyNkZWZpbmUgclR4QUdDX01jczA3X01jczA0CQkJMHhlMTQKKyNkZWZpbmUgclR4QUdDX01jczExX01jczA4CQkJMHhlMTgKKyNkZWZpbmUgclR4QUdDX01jczE1X01jczEyCQkJMHhlMWMKKworCisvL1JGCisvL1plYnJhMQorI2RlZmluZSByWmVicmExX0hTU0lFbmFibGUgICAgICAgICAgICAJMHgwCisjZGVmaW5lIHJaZWJyYTFfVFJ4RW5hYmxlMSAgICAgICAgICAgIAkweDEKKyNkZWZpbmUgclplYnJhMV9UUnhFbmFibGUyICAgICAgICAgICAJMHgyCisjZGVmaW5lIHJaZWJyYTFfQUdDICAgICAgICAgICAgICAgICAgIAkJMHg0CisjZGVmaW5lIHJaZWJyYTFfQ2hhcmdlUHVtcCAgICAgICAgICAgIAkweDUKKyNkZWZpbmUgclplYnJhMV9DaGFubmVsICAgICAgICAgICAgICAgCQkweDcKKyNkZWZpbmUgclplYnJhMV9UeEdhaW4gICAgICAgICAgICAgICAJCTB4OAorI2RlZmluZSByWmVicmExX1R4TFBGICAgICAgICAgICAgICAgICAJCTB4OQorI2RlZmluZSByWmVicmExX1J4TFBGICAgICAgICAgICAgICAgICAJCTB4YgorI2RlZmluZSByWmVicmExX1J4SFBGQ29ybmVyICAgICAgICAgICAJMHhjCisKKy8vWmVicmE0CisjZGVmaW5lIHJHbG9iYWxDdHJsICAgICAgICAgICAgICAgICAgIAkJMAorI2RlZmluZSByUlRMODI1Nl9UeExQRiAgICAgICAgICAgICAgICAJCTE5CisjZGVmaW5lIHJSVEw4MjU2X1J4TFBGICAgICAgICAgICAgICAgIAkJMTEKKworLy9SVEw4MjU4CisjZGVmaW5lIHJSVEw4MjU4X1R4TFBGICAgICAgICAgICAgICAgIAkJMHgxMQorI2RlZmluZSByUlRMODI1OF9SeExQRiAgICAgICAgICAgICAgICAJCTB4MTMKKyNkZWZpbmUgclJUTDgyNThfUlNTSUxQRiAgICAgICAgICAgICAgCTB4YQorCisvL0JpdCBNYXNrCisvL3BhZ2UtMQorI2RlZmluZSBiQkJSZXNldEIgICAgICAgICAgICAgICAgIAkJCTB4MTAwCisjZGVmaW5lIGJHbG9iYWxSZXNldEIgICAgICAgICAgICAgCQkweDIwMAorI2RlZmluZSBiT0ZETVR4U3RhcnQgICAgICAgICAgICAgIAkJMHg0CisjZGVmaW5lIGJDQ0tUeFN0YXJ0ICAgICAgICAgICAgICAgCQkJMHg4CisjZGVmaW5lIGJDUkMzMkRlYnVnICAgICAgICAgICAgICAgCQkweDEwMAorI2RlZmluZSBiUE1BQ0xvb3BiYWNrICAgICAgICAgICAgIAkJMHgxMAorI2RlZmluZSBiVHhMU0lHICAgICAgICAgICAgICAgICAgIAkJCTB4ZmZmZmZmCisjZGVmaW5lIGJPRkRNVHhSYXRlICAgICAgICAgICAgICAgCQkweGYKKyNkZWZpbmUgYk9GRE1UeFJlc2VydmVkICAgICAgICAgICAJCTB4MTAKKyNkZWZpbmUgYk9GRE1UeExlbmd0aCAgICAgICAgICAgICAJCTB4MWZmZTAKKyNkZWZpbmUgYk9GRE1UeFBhcml0eSAgICAgICAgICAgICAJCTB4MjAwMDAKKyNkZWZpbmUgYlR4SFRTSUcxICAgICAgICAgICAgICAgICAJCQkweGZmZmZmZgorI2RlZmluZSBiVHhIVE1DU1JhdGUgICAgICAgICAgICAgIAkJMHg3ZgorI2RlZmluZSBiVHhIVEJXICAgICAgICAgICAgICAgICAgIAkJCTB4ODAKKyNkZWZpbmUgYlR4SFRMZW5ndGggICAgICAgICAgICAgICAJCTB4ZmZmZjAwCisjZGVmaW5lIGJUeEhUU0lHMiAgICAgICAgICAgICAgICAgCQkJMHhmZmZmZmYKKyNkZWZpbmUgYlR4SFRTbW9vdGhpbmcgICAgICAgICAgICAJCTB4MQorI2RlZmluZSBiVHhIVFNvdW5kaW5nICAgICAgICAgICAgIAkJMHgyCisjZGVmaW5lIGJUeEhUUmVzZXJ2ZWQgICAgICAgICAgICAgCQkweDQKKyNkZWZpbmUgYlR4SFRBZ2dyZWF0aW9uICAgICAgICAgICAJCTB4OAorI2RlZmluZSBiVHhIVFNUQkMgICAgICAgICAgICAgICAgIAkJCTB4MzAKKyNkZWZpbmUgYlR4SFRBZHZhbmNlQ29kaW5nICAgICAgICAJCTB4NDAKKyNkZWZpbmUgYlR4SFRTaG9ydEdJICAgICAgICAgICAgICAJCTB4ODAKKyNkZWZpbmUgYlR4SFROdW1iZXJIVF9MVEYgICAgICAgICAJCTB4MzAwCisjZGVmaW5lIGJUeEhUQ1JDOCAgICAgICAgICAgICAgICAgCQkJMHgzZmMwMAorI2RlZmluZSBiQ291bnRlclJlc2V0ICAgICAgICAgICAgIAkJMHgxMDAwMAorI2RlZmluZSBiTnVtT2ZPRkRNVHggICAgICAgICAgICAgIAkJMHhmZmZmCisjZGVmaW5lIGJOdW1PZkNDS1R4ICAgICAgICAgICAgICAgCQkweGZmZmYwMDAwCisjZGVmaW5lIGJUeElkbGVJbnRlcnZhbCAgICAgICAgICAgCQkJMHhmZmZmCisjZGVmaW5lIGJPRkRNU2VydmljZSAgICAgICAgICAgICAgCQkweGZmZmYwMDAwCisjZGVmaW5lIGJUeE1BQ0hlYWRlciAgICAgICAgICAgICAgCQkweGZmZmZmZmZmCisjZGVmaW5lIGJUeERhdGFJbml0ICAgICAgICAgICAgICAgCQkJMHhmZgorI2RlZmluZSBiVHhIVE1vZGUgICAgICAgICAgICAgICAgIAkJMHgxMDAKKyNkZWZpbmUgYlR4RGF0YVR5cGUgICAgICAgICAgICAgICAJCTB4MzAwMDAKKyNkZWZpbmUgYlR4UmFuZG9tU2VlZCAgICAgICAgICAgICAJCTB4ZmZmZmZmZmYKKyNkZWZpbmUgYkNDS1R4UHJlYW1ibGUgICAgICAgICAgIAkJMHgxCisjZGVmaW5lIGJDQ0tUeFNGRCAgICAgICAgICAgICAgICAgCQkJMHhmZmZmMDAwMAorI2RlZmluZSBiQ0NLVHhTSUcgICAgICAgICAgICAgICAgIAkJCTB4ZmYKKyNkZWZpbmUgYkNDS1R4U2VydmljZSAgICAgICAgICAgICAJCTB4ZmYwMAorI2RlZmluZSBiQ0NLTGVuZ3RoRXh0ICAgICAgICAgICAgIAkJMHg4MDAwCisjZGVmaW5lIGJDQ0tUeExlbmd0aCAgICAgICAgICAgICAgCQkweGZmZmYwMDAwCisjZGVmaW5lIGJDQ0tUeENSQzE2ICAgICAgICAgICAgICAgCQkweGZmZmYKKyNkZWZpbmUgYkNDS1R4U3RhdHVzICAgICAgICAgICAgICAJCTB4MQorI2RlZmluZSBiT0ZETVR4U3RhdHVzICAgICAgICAgICAgIAkJMHgyCisKKy8vcGFnZS04CisjZGVmaW5lIGJSRk1PRCAgICAgICAgICAgICAgICAgICAgCQkJMHgxCisjZGVmaW5lIGJKYXBhbk1vZGUgICAgICAgICAgICAgICAgCQkweDIKKyNkZWZpbmUgYkNDS1R4U0MgICAgICAgICAgICAgICAgICAJCQkweDMwCisjZGVmaW5lIGJDQ0tFbiAgICAgICAgICAgICAgICAgICAgCQkJMHgxMDAwMDAwCisjZGVmaW5lIGJPRkRNRW4gICAgICAgICAgICAgICAgICAgCQkJMHgyMDAwMDAwCisjZGVmaW5lIGJPRkRNUnhBRENQaGFzZSAgICAgICAgICAgCQkweDEwMDAwCisjZGVmaW5lIGJPRkRNVHhEQUNQaGFzZSAgICAgICAgICAgCQkweDQwMDAwCisjZGVmaW5lIGJYQVR4QUdDICAgICAgICAgICAgICAgICAgCQkJMHgzZgorI2RlZmluZSBiWEJUeEFHQyAgICAgICAgICAgICAgICAgIAkJCTB4ZjAwCisjZGVmaW5lIGJYQ1R4QUdDICAgICAgICAgICAgICAgICAgCQkJMHhmMDAwCisjZGVmaW5lIGJYRFR4QUdDICAgICAgICAgICAgICAgICAgCQkJMHhmMDAwMAorI2RlZmluZSBiUEFTdGFydCAgICAgICAgICAgICAgICAgIAkJCTB4ZjAwMDAwMDAKKyNkZWZpbmUgYlRSU3RhcnQgICAgICAgICAgICAgICAgICAJCQkweDAwZjAwMDAwCisjZGVmaW5lIGJSRlN0YXJ0ICAgICAgICAgICAgICAgICAgCQkJMHgwMDAwZjAwMAorI2RlZmluZSBiQkJTdGFydCAgICAgICAgICAgICAgICAgIAkJCTB4MDAwMDAwZjAKKyNkZWZpbmUgYkJCQ0NLU3RhcnQgICAgICAgICAgICAgICAJCTB4MDAwMDAwMGYKKyNkZWZpbmUgYlBBRW5kICAgICAgICAgICAgICAgICAgICAJCQkweGYgICAgICAgICAgLy9SZWcweDgxNAorI2RlZmluZSBiVFJFbmQgICAgICAgICAgICAgICAgICAgIAkJCTB4MGYwMDAwMDAKKyNkZWZpbmUgYlJGRW5kICAgICAgICAgICAgICAgICAgICAJCQkweDAwMGYwMDAwCisjZGVmaW5lIGJDQ0FNYXNrICAgICAgICAgICAgICAgICAgCQkJMHgwMDAwMDBmMCAgIC8vVDJSCisjZGVmaW5lIGJSMlJDQ0FNYXNrICAgICAgICAgICAgICAgCQkweDAwMDAwZjAwCisjZGVmaW5lIGJIU1NJX1IyVERlbGF5ICAgICAgICAgICAgCQkweGY4MDAwMDAwCisjZGVmaW5lIGJIU1NJX1QyUkRlbGF5ICAgICAgICAgICAgCQkweGY4MDAwMAorI2RlZmluZSBiQ29udFR4SFNTSSAgICAgICAgICAgICAgIAkJMHg0MDAgICAgIC8vY2hhbmUgZ2FpbiBhdCBjb250aW51ZSBUeAorI2RlZmluZSBiSUdGcm9tQ0NLICAgICAgICAgICAgICAgIAkJMHgyMDAKKyNkZWZpbmUgYkFHQ0FkZHJlc3MgICAgICAgICAgICAgICAJCTB4M2YKKyNkZWZpbmUgYlJ4SFBUeCAgICAgICAgICAgICAgICAgICAJCQkweDcwMDAKKyNkZWZpbmUgYlJ4SFBUMlIgICAgICAgICAgICAgICAgICAJCQkweDM4MDAwCisjZGVmaW5lIGJSeEhQQ0NLSW5pICAgICAgICAgICAgICAgCQkweGMwMDAwCisjZGVmaW5lIGJBR0NUeENvZGUgICAgICAgICAgICAgICAgCQkweGMwMDAwMAorI2RlZmluZSBiQUdDUnhDb2RlICAgICAgICAgICAgICAgIAkJMHgzMDAwMDAKKyNkZWZpbmUgYjNXaXJlRGF0YUxlbmd0aCAgICAgICAgICAJCTB4ODAwCisjZGVmaW5lIGIzV2lyZUFkZHJlc3NMZW5ndGggICAgICAgCQkweDQwMAorI2RlZmluZSBiM1dpcmVSRlBvd2VyRG93biAgICAgICAgIAkJMHgxCisvLyNkZWZpbmUgYkhXU0lTZWxlY3QgICAgICAgICAgICAgICAJCTB4OAorI2RlZmluZSBiNUdQQVBFUG9sYXJpdHkgICAgICAgICAgIAkJMHg0MDAwMDAwMAorI2RlZmluZSBiMkdQQVBFUG9sYXJpdHkgICAgICAgICAgIAkJMHg4MDAwMDAwMAorI2RlZmluZSBiUkZTV19UeERlZmF1bHRBbnQgICAgICAgIAkJMHgzCisjZGVmaW5lIGJSRlNXX1R4T3B0aW9uQW50ICAgICAgICAgCQkweDMwCisjZGVmaW5lIGJSRlNXX1J4RGVmYXVsdEFudCAgICAgICAgCQkweDMwMAorI2RlZmluZSBiUkZTV19SeE9wdGlvbkFudCAgICAgICAgIAkJMHgzMDAwCisjZGVmaW5lIGJSRlNJXzNXaXJlRGF0YSAgICAgICAgICAgCQkweDEKKyNkZWZpbmUgYlJGU0lfM1dpcmVDbG9jayAgICAgICAgICAJCTB4MgorI2RlZmluZSBiUkZTSV8zV2lyZUxvYWQgICAgICAgICAgIAkJMHg0CisjZGVmaW5lIGJSRlNJXzNXaXJlUlcgICAgICAgICAgICAgCQkweDgKKyNkZWZpbmUgYlJGU0lfM1dpcmUgICAgICAgICAgICAgICAJCQkweGYgIC8vMy13aXJlIHRvdGFsIGNvbnRyb2wKKyNkZWZpbmUgYlJGU0lfUkZFTlYgICAgICAgICAgICAgICAJCTB4MTAKKyNkZWZpbmUgYlJGU0lfVFJTVyAgICAgICAgICAgICAgICAJCTB4MjAKKyNkZWZpbmUgYlJGU0lfVFJTV0IgICAgICAgICAgICAgICAJCTB4NDAKKyNkZWZpbmUgYlJGU0lfQU5UU1cgICAgICAgICAgICAgICAJCTB4MTAwCisjZGVmaW5lIGJSRlNJX0FOVFNXQiAgICAgICAgICAgICAgCQkweDIwMAorI2RlZmluZSBiUkZTSV9QQVBFICAgICAgICAgICAgICAgIAkJCTB4NDAwCisjZGVmaW5lIGJSRlNJX1BBUEU1RyAgICAgICAgICAgICAgCQkweDgwMAorI2RlZmluZSBiQmFuZFNlbGVjdCAgICAgICAgICAgICAgIAkJCTB4MQorI2RlZmluZSBiSFRTSUcyX0dJICAgICAgICAgICAgICAgIAkJCTB4ODAKKyNkZWZpbmUgYkhUU0lHMl9TbW9vdGhpbmcgICAgICAgICAJCTB4MDEKKyNkZWZpbmUgYkhUU0lHMl9Tb3VuZGluZyAgICAgICAgICAJCTB4MDIKKyNkZWZpbmUgYkhUU0lHMl9BZ2dyZWF0b24gICAgICAgICAJCTB4MDgKKyNkZWZpbmUgYkhUU0lHMl9TVEJDICAgICAgICAgICAgICAJCTB4MzAKKyNkZWZpbmUgYkhUU0lHMl9BZHZDb2RpbmcgICAgICAgICAJCTB4NDAKKyNkZWZpbmUgYkhUU0lHMl9OdW1PZkhUTFRGICAgICAgICAJMHgzMDAKKyNkZWZpbmUgYkhUU0lHMl9DUkM4ICAgICAgICAgICAgICAJCTB4M2ZjCisjZGVmaW5lIGJIVFNJRzFfTUNTICAgICAgICAgICAgICAgCQkweDdmCisjZGVmaW5lIGJIVFNJRzFfQmFuZFdpZHRoICAgICAgICAgCQkweDgwCisjZGVmaW5lIGJIVFNJRzFfSFRMZW5ndGggICAgICAgICAgCQkweGZmZmYKKyNkZWZpbmUgYkxTSUdfUmF0ZSAgICAgICAgICAgICAgICAJCQkweGYKKyNkZWZpbmUgYkxTSUdfUmVzZXJ2ZWQgICAgICAgICAgICAJCTB4MTAKKyNkZWZpbmUgYkxTSUdfTGVuZ3RoICAgICAgICAgICAgICAJCTB4MWZmZmUKKyNkZWZpbmUgYkxTSUdfUGFyaXR5ICAgICAgICAgICAgICAJCQkweDIwCisjZGVmaW5lIGJDQ0tSeFBoYXNlICAgICAgICAgICAgICAgCQkweDQKKyNkZWZpbmUgYkxTU0lSZWFkQWRkcmVzcyAgICAgICAgICAJCTB4M2YwMDAwMDAgICAvL0xTU0kgIlJlYWQiIEFkZHJlc3MKKyNkZWZpbmUgYkxTU0lSZWFkRWRnZSAgICAgICAgICAgICAJCTB4ODAwMDAwMDAgICAvL0xTU0kgIlJlYWQiIGVkZ2Ugc2lnbmFsCisjZGVmaW5lIGJMU1NJUmVhZEJhY2tEYXRhICAgICAgICAgCQkweGZmZgorI2RlZmluZSBiTFNTSVJlYWRPS0ZsYWcgICAgICAgICAgIAkJMHgxMDAwCisjZGVmaW5lIGJDQ0tTYW1wbGVSYXRlICAgICAgICAgICAgCQkweDggICAgICAgLy8wOiA0NE1IeiwgMTo4OE1IegorCisjZGVmaW5lIGJSZWd1bGF0b3IwU3RhbmRieSAgICAgICAgCQkweDEKKyNkZWZpbmUgYlJlZ3VsYXRvclBMTFN0YW5kYnkgICAgICAJCTB4MgorI2RlZmluZSBiUmVndWxhdG9yMVN0YW5kYnkgICAgICAgIAkJMHg0CisjZGVmaW5lIGJQTExQb3dlclVwICAgICAgICAgICAgICAgCQkweDgKKyNkZWZpbmUgYkRQTExQb3dlclVwICAgICAgICAgICAgICAJCTB4MTAKKyNkZWZpbmUgYkRBMTBQb3dlclVwICAgICAgICAgICAgICAJCTB4MjAKKyNkZWZpbmUgYkFEN1Bvd2VyVXAgICAgICAgICAgICAgICAJCTB4MjAwCisjZGVmaW5lIGJEQTZQb3dlclVwICAgICAgICAgICAgICAgCQkweDIwMDAKKyNkZWZpbmUgYlh0YWxQb3dlclVwICAgICAgICAgICAgICAJCTB4NDAwMAorI2RlZmluZSBiNDBNRENsa1Bvd2VyVVAgICAgICAgICAgIAkJMHg4MDAwCisjZGVmaW5lIGJEQTZEZWJ1Z01vZGUgICAgICAgICAgICAgCQkweDIwMDAwCisjZGVmaW5lIGJEQTZTd2luZyAgICAgICAgICAgICAgICAgCQkJMHgzODAwMDAKKyNkZWZpbmUgYkFEQ2xrUGhhc2UgICAgICAgICAgICAgICAJCTB4NDAwMDAwMAorI2RlZmluZSBiODBNQ2xrRGVsYXkgICAgICAgICAgICAgIAkJMHgxODAwMDAwMAorI2RlZmluZSBiQUZFV2F0Y2hEb2dFbmFibGUgICAgICAgIAkJMHgyMDAwMDAwMAorI2RlZmluZSBiWHRhbENhcCAgICAgICAgICAgICAgICAJCQkweDBmMDAwMDAwCisjZGVmaW5lIGJJbnREaWZDbGtFbmFibGUgICAgICAgICAgCQkweDQwMAorI2RlZmluZSBiRXh0U2lnQ2xrRW5hYmxlICAgICAgICAgCQkweDgwMAorI2RlZmluZSBiQmFuZGdhcE1iaWFzUG93ZXJVcCAgICAgIAkweDEwMDAwCisjZGVmaW5lIGJBRDExU0hHYWluICAgICAgICAgICAgICAgCQkweGMwMDAwCisjZGVmaW5lIGJBRDExSW5wdXRSYW5nZSAgICAgICAgICAgCQkweDcwMDAwMAorI2RlZmluZSBiQUQxMU9QQ3VycmVudCAgICAgICAgICAgIAkJMHgzODAwMDAwCisjZGVmaW5lIGJJUGF0aExvb3BiYWNrICAgICAgICAgICAgCQkweDQwMDAwMDAKKyNkZWZpbmUgYlFQYXRoTG9vcGJhY2sgICAgICAgICAgICAJCTB4ODAwMDAwMAorI2RlZmluZSBiQUZFTG9vcGJhY2sgICAgICAgICAgICAgIAkJMHgxMDAwMDAwMAorI2RlZmluZSBiREExMFN3aW5nICAgICAgICAgICAgICAgIAkJMHg3ZTAKKyNkZWZpbmUgYkRBMTBSZXZlcnNlICAgICAgICAgICAgICAJCTB4ODAwCisjZGVmaW5lIGJEQUNsa1NvdXJjZSAgICAgICAgICAgICAgCQkweDEwMDAKKyNkZWZpbmUgYkFEN0lucHV0UmFuZ2UgICAgICAgICAgICAJCTB4NjAwMAorI2RlZmluZSBiQUQ3R2FpbiAgICAgICAgICAgICAgICAgIAkJCTB4MzgwMDAKKyNkZWZpbmUgYkFEN091dHB1dENNTW9kZSAgICAgICAgICAJCTB4NDAwMDAKKyNkZWZpbmUgYkFEN0lucHV0Q01Nb2RlICAgICAgICAgICAJCTB4MzgwMDAwCisjZGVmaW5lIGJBRDdDdXJyZW50ICAgICAgICAgICAgICAgCQkJMHhjMDAwMDAKKyNkZWZpbmUgYlJlZ3VsYXRvckFkanVzdCAgICAgICAgICAJCTB4NzAwMDAwMAorI2RlZmluZSBiQUQxMVBvd2VyVXBBdFR4ICAgICAgICAgIAkJMHgxCisjZGVmaW5lIGJEQTEwUFNBdFR4ICAgICAgICAgICAgICAgCQkweDEwCisjZGVmaW5lIGJBRDExUG93ZXJVcEF0UnggICAgICAgICAgCQkweDEwMAorI2RlZmluZSBiREExMFBTQXRSeCAgICAgICAgICAgICAgIAkJMHgxMDAwCisKKyNkZWZpbmUgYkNDS1J4QUdDRm9ybWF0ICAgICAgICAgICAJCTB4MjAwCisKKyNkZWZpbmUgYlBTREZGVFNhbXBsZXBQb2ludCAgICAgICAJCTB4YzAwMAorI2RlZmluZSBiUFNEQXZlcmFnZU51bSAgICAgICAgICAgIAkJMHgzMDAwCisjZGVmaW5lIGJJUVBhdGhDb250cm9sICAgICAgICAgICAgCQkweGMwMAorI2RlZmluZSBiUFNERnJlcSAgICAgICAgICAgICAgICAgIAkJCTB4M2ZmCisjZGVmaW5lIGJQU0RBbnRlbm5hUGF0aCAgICAgICAgICAgCQkweDMwCisjZGVmaW5lIGJQU0RJUVN3aXRjaCAgICAgICAgICAgICAgCQkweDQwCisjZGVmaW5lIGJQU0RSeFRyaWdnZXIgICAgICAgICAgICAgCQkweDQwMDAwMAorI2RlZmluZSBiUFNEVHhUcmlnZ2VyICAgICAgICAgICAgIAkJMHg4MDAwMDAwMAorI2RlZmluZSBiUFNEU2luZVRvbmVTY2FsZSAgICAgICAgCQkweDdmMDAwMDAwCisjZGVmaW5lIGJQU0RSZXBvcnQgICAgICAgICAgICAgICAgCQkJMHhmZmZmCisKKy8vcGFnZS05CisjZGVmaW5lIGJPRkRNVHhTQyAgICAgICAgICAgICAgICAgCQkweDMwMDAwMDAwCisjZGVmaW5lIGJDQ0tUeE9uICAgICAgICAgICAgICAgICAgCQkJMHgxCisjZGVmaW5lIGJPRkRNVHhPbiAgICAgICAgICAgICAgICAgCQkweDIKKyNkZWZpbmUgYkRlYnVnUGFnZSAgICAgICAgICAgICAgICAJCTB4ZmZmICAvL3Jlc2V0IGRlYnVnIHBhZ2UgYW5kIGFsc28gSFdvcmQsIExXb3JkCisjZGVmaW5lIGJEZWJ1Z0l0ZW0gICAgICAgICAgICAgICAgCQkweGZmICAgLy9yZXNldCBkZWJ1ZyBwYWdlIGFuZCBMV29yZAorI2RlZmluZSBiQW50TCAgICAgICAgICAgICAgCQkJMHgxMAorI2RlZmluZSBiQW50Tm9uSFQgICAgICAgICAgIAkJCQkweDEwMAorI2RlZmluZSBiQW50SFQxICAgICAgICAgICAgICAgCQkJMHgxMDAwCisjZGVmaW5lIGJBbnRIVDIgICAgICAgICAgICAgICAgICAgCQkJMHgxMDAwMAorI2RlZmluZSBiQW50SFQxUzEgICAgICAgICAgICAgICAgIAkJCTB4MTAwMDAwCisjZGVmaW5lIGJBbnROb25IVFMxICAgICAgICAgICAgICAgCQkweDEwMDAwMDAKKworLy9wYWdlLWEKKyNkZWZpbmUgYkNDS0JCTW9kZSAgICAgICAgICAgICAgICAJCTB4MworI2RlZmluZSBiQ0NLVHhQb3dlclNhdmluZyAgICAgICAgIAkJMHg4MAorI2RlZmluZSBiQ0NLUnhQb3dlclNhdmluZyAgICAgICAgIAkJMHg0MAorI2RlZmluZSBiQ0NLU2lkZUJhbmQgICAgICAgICAgICAgIAkJMHgxMAorI2RlZmluZSBiQ0NLU2NyYW1ibGUgICAgICAgICAgICAgIAkJMHg4CisjZGVmaW5lIGJDQ0tBbnREaXZlcnNpdHkgICAgCQkJMHg4MDAwCisjZGVmaW5lIGJDQ0tDYXJyaWVyUmVjb3ZlcnkgICAJCTB4NDAwMAorI2RlZmluZSBiQ0NLVHhSYXRlICAgICAgICAgICAJCQkweDMwMDAKKyNkZWZpbmUgYkNDS0RDQ2FuY2VsICAgICAgICAgICAgIAkJMHgwODAwCisjZGVmaW5lIGJDQ0tJU0lDYW5jZWwgICAgICAgICAgICAgCQkweDA0MDAKKyNkZWZpbmUgYkNDS01hdGNoRmlsdGVyICAgICAgICAgICAJCTB4MDIwMAorI2RlZmluZSBiQ0NLRXF1YWxpemVyICAgICAgICAgICAgIAkJMHgwMTAwCisjZGVmaW5lIGJDQ0tQcmVhbWJsZURldGVjdCAgICAgICAJCTB4ODAwMDAwCisjZGVmaW5lIGJDQ0tGYXN0RmFsc2VDQ0EgICAgICAgICAgCQkweDQwMDAwMAorI2RlZmluZSBiQ0NLQ2hFc3RTdGFydCAgICAgICAgICAgIAkJMHgzMDAwMDAKKyNkZWZpbmUgYkNDS0NDQUNvdW50ICAgICAgICAgICAgICAJCTB4MDgwMDAwCisjZGVmaW5lIGJDQ0tjc19saW0gICAgICAgICAgICAgICAgCQkJMHgwNzAwMDAKKyNkZWZpbmUgYkNDS0Jpc3RNb2RlICAgICAgICAgICAgICAJCTB4ODAwMDAwMDAKKyNkZWZpbmUgYkNDS0NDQU1hc2sgICAgICAgICAgICAgCQkweDQwMDAwMDAwCisjZGVmaW5lIGJDQ0tUeERBQ1BoYXNlICAgICAgICAgCQkweDQKKyNkZWZpbmUgYkNDS1J4QURDUGhhc2UgICAgICAgICAJCTB4MjAwMDAwMDAgICAvL3JfcnhfY2xrCisjZGVmaW5lIGJDQ0tyX2NwX21vZGUwICAgICAgICAgCQkweDAxMDAKKyNkZWZpbmUgYkNDS1R4RENPZmZzZXQgICAgICAgICAgIAkJMHhmMAorI2RlZmluZSBiQ0NLUnhEQ09mZnNldCAgICAgICAgICAgCQkweGYKKyNkZWZpbmUgYkNDS0NDQU1vZGUgICAgICAgICAgICAgIAkJMHhjMDAwCisjZGVmaW5lIGJDQ0tGYWxzZUNTX2xpbSAgICAgICAgICAgCQkweDNmMDAKKyNkZWZpbmUgYkNDS0NTX3JhdGlvICAgICAgICAgICAgICAJCTB4YzAwMDAwCisjZGVmaW5lIGJDQ0tDb3JnQml0X3NlbCAgICAgICAgICAgCQkweDMwMDAwMAorI2RlZmluZSBiQ0NLUERfbGltICAgICAgICAgICAgICAgIAkJCTB4MGYwMDAwCisjZGVmaW5lIGJDQ0tOZXdDQ0EgICAgICAgICAgICAgICAgCQkweDgwMDAwMDAwCisjZGVmaW5lIGJDQ0tSeEhQb2ZJRyAgICAgICAgICAgICAgCQkweDgwMDAKKyNkZWZpbmUgYkNDS1J4SUcgICAgICAgICAgICAgICAgICAJCQkweDdmMDAKKyNkZWZpbmUgYkNDS0xOQVBvbGFyaXR5ICAgICAgICAgICAJCTB4ODAwMDAwCisjZGVmaW5lIGJDQ0tSeDFzdEdhaW4gICAgICAgICAgICAgCQkweDdmMDAwMAorI2RlZmluZSBiQ0NLUkZFeHRlbmQgICAgICAgICAgICAgIAkJMHgyMDAwMDAwMCAvL0NDSyBSeCBJaW5pdGFsIGdhaW4gcG9sYXJpdHkKKyNkZWZpbmUgYkNDS1J4QUdDU2F0TGV2ZWwgICAgICAgIAkJMHgxZjAwMDAwMAorI2RlZmluZSBiQ0NLUnhBR0NTYXRDb3VudCAgICAgICAJCTB4ZTAKKyNkZWZpbmUgYkNDS1J4UkZTZXR0bGUgICAgICAgICAgICAJCTB4MWYgICAgICAgLy9BR0NzYW1wX2RseQorI2RlZmluZSBiQ0NLRml4ZWRSeEFHQyAgICAgICAgICAgCQkweDgwMDAKKy8vI2RlZmluZSBiQ0NLUnhBR0NGb3JtYXQgICAgICAgICAJCTB4NDAwMCAgIC8vcmVtb3ZlIHRvIEhTU0kgcmVnaXN0ZXIgMHg4MjQKKyNkZWZpbmUgYkNDS0FudGVubmFQb2xhcml0eSAgICAgIAkJMHgyMDAwCisjZGVmaW5lIGJDQ0tUeEZpbHRlclR5cGUgICAgICAgICAgCQkweDBjMDAKKyNkZWZpbmUgYkNDS1J4QUdDUmVwb3J0VHlwZSAgIAkJMHgwMzAwCisjZGVmaW5lIGJDQ0tSeERBR0NFbiAgICAgICAgICAgICAgCQkweDgwMDAwMDAwCisjZGVmaW5lIGJDQ0tSeERBR0NQZXJpb2QgICAgICAgIAkJMHgyMDAwMDAwMAorI2RlZmluZSBiQ0NLUnhEQUdDU2F0TGV2ZWwgICAgIAkJMHgxZjAwMDAwMAorI2RlZmluZSBiQ0NLVGltaW5nUmVjb3ZlcnkgICAgICAgCQkweDgwMDAwMAorI2RlZmluZSBiQ0NLVHhDMCAgICAgICAgICAgICAgICAgIAkJCTB4M2YwMDAwCisjZGVmaW5lIGJDQ0tUeEMxICAgICAgICAgICAgICAgICAgCQkJMHgzZjAwMDAwMAorI2RlZmluZSBiQ0NLVHhDMiAgICAgICAgICAgICAgICAgIAkJCTB4M2YKKyNkZWZpbmUgYkNDS1R4QzMgICAgICAgICAgICAgICAgICAJCQkweDNmMDAKKyNkZWZpbmUgYkNDS1R4QzQgICAgICAgICAgICAgICAgICAJCQkweDNmMDAwMAorI2RlZmluZSBiQ0NLVHhDNSAgICAgICAgICAgICAgICAgIAkJCTB4M2YwMDAwMDAKKyNkZWZpbmUgYkNDS1R4QzYgICAgICAgICAgICAgICAgICAJCQkweDNmCisjZGVmaW5lIGJDQ0tUeEM3ICAgICAgICAgICAgICAgICAgCQkJMHgzZjAwCisjZGVmaW5lIGJDQ0tEZWJ1Z1BvcnQgICAgICAgICAgICAgCQkweGZmMDAwMAorI2RlZmluZSBiQ0NLREFDRGVidWcgICAgICAgICAgICAgIAkJMHgwZjAwMDAwMAorI2RlZmluZSBiQ0NLRmFsc2VBbGFybUVuYWJsZSAgICAgIAkJMHg4MDAwCisjZGVmaW5lIGJDQ0tGYWxzZUFsYXJtUmVhZCAgICAgICAgCQkweDQwMDAKKyNkZWZpbmUgYkNDS1RSU1NJICAgICAgICAgICAgICAgICAJCQkweDdmCisjZGVmaW5lIGJDQ0tSeEFHQ1JlcG9ydCAgICAgICAgICAgCQkweGZlCisjZGVmaW5lIGJDQ0tSeFJlcG9ydF9BbnRTZWwgICAgICAgCQkweDgwMDAwMDAwCisjZGVmaW5lIGJDQ0tSeFJlcG9ydF9NRk9mZiAgICAgICAgCQkweDQwMDAwMDAwCisjZGVmaW5lIGJDQ0tSeFJ4UmVwb3J0X1NRTG9zcyAgICAgCTB4MjAwMDAwMDAKKyNkZWZpbmUgYkNDS1J4UmVwb3J0X1BrdGxvc3MgICAgICAJCTB4MTAwMDAwMDAKKyNkZWZpbmUgYkNDS1J4UmVwb3J0X0xvY2tlZGJpdCAgICAJMHgwODAwMDAwMAorI2RlZmluZSBiQ0NLUnhSZXBvcnRfUmF0ZUVycm9yICAgIAkweDA0MDAwMDAwCisjZGVmaW5lIGJDQ0tSeFJlcG9ydF9SeFJhdGUgICAgICAgCQkweDAzMDAwMDAwCisjZGVmaW5lIGJDQ0tSeEZBQ291bnRlckxvd2VyICAgICAgCTB4ZmYKKyNkZWZpbmUgYkNDS1J4RkFDb3VudGVyVXBwZXIgICAgICAJMHhmZjAwMDAwMAorI2RlZmluZSBiQ0NLUnhIUEFHQ1N0YXJ0ICAgICAgICAgIAkJMHhlMDAwCisjZGVmaW5lIGJDQ0tSeEhQQUdDRmluYWwgICAgICAgICAgCQkweDFjMDAKKworI2RlZmluZSBiQ0NLUnhGYWxzZUFsYXJtRW5hYmxlICAgIAkweDgwMDAKKyNkZWZpbmUgYkNDS0ZBQ291bnRlckZyZWV6ZSAgICAgICAJCTB4NDAwMAorCisjZGVmaW5lIGJDQ0tUeFBhdGhTZWwgICAgICAgICAgICAgCQkweDEwMDAwMDAwCisjZGVmaW5lIGJDQ0tEZWZhdWx0UnhQYXRoICAgICAgICAgCQkweGMwMDAwMDAKKyNkZWZpbmUgYkNDS09wdGlvblJ4UGF0aCAgICAgICAgICAJCTB4MzAwMDAwMAorCisvL3BhZ2UgYworI2RlZmluZSBiTnVtT2ZTVEYgICAgICAgICAgICAgICAgCQkJMHgzCisjZGVmaW5lIGJTaGlmdF9MICAgICAgICAgICAgICAgICAJCQkweGMwCisjZGVmaW5lIGJHSV9USCAgICAgICAgICAgICAgICAgICAJCQkweGMKKyNkZWZpbmUgYlJ4UGF0aEEgICAgICAgICAgICAgICAgIAkJCTB4MQorI2RlZmluZSBiUnhQYXRoQiAgICAgICAgICAgICAgICAgCQkJMHgyCisjZGVmaW5lIGJSeFBhdGhDICAgICAgICAgICAgICAgICAJCQkweDQKKyNkZWZpbmUgYlJ4UGF0aEQgICAgICAgICAgICAgICAgIAkJCTB4OAorI2RlZmluZSBiVHhQYXRoQSAgICAgICAgICAgICAgICAgCQkJMHgxCisjZGVmaW5lIGJUeFBhdGhCICAgICAgICAgICAgICAgICAJCQkweDIKKyNkZWZpbmUgYlR4UGF0aEMgICAgICAgICAgICAgICAgIAkJCTB4NAorI2RlZmluZSBiVHhQYXRoRCAgICAgICAgICAgICAgICAgCQkJMHg4CisjZGVmaW5lIGJUUlNTSUZyZXEgICAgICAgICAgICAgICAJCQkweDIwMAorI2RlZmluZSBiQURDQmFja29mZiAgICAgICAgICAgICAgCQkJMHgzMDAwCisjZGVmaW5lIGJERklSQmFja29mZiAgICAgICAgICAgICAJCQkweGMwMDAKKyNkZWZpbmUgYlRSU1NJTGF0Y2hQaGFzZSAgICAgICAgIAkJMHgxMDAwMAorI2RlZmluZSBiUnhJRENPZmZzZXQgICAgICAgICAgICAgCQkJMHhmZgorI2RlZmluZSBiUnhRRENPZmZzZXQgICAgICAgICAgICAgCQkJMHhmZjAwCisjZGVmaW5lIGJSeERGSVJNb2RlICAgICAgICAgICAgICAJCTB4MTgwMDAwMAorI2RlZmluZSBiUnhEQ05GVHlwZSAgICAgICAgICAgICAgCQkweGUwMDAwMDAKKyNkZWZpbmUgYlJYSVFJbWJfQSAgICAgICAgICAgICAgIAkJCTB4M2ZmCisjZGVmaW5lIGJSWElRSW1iX0IgICAgICAgICAgICAgICAJCQkweGZjMDAKKyNkZWZpbmUgYlJYSVFJbWJfQyAgICAgICAgICAgICAgIAkJCTB4M2YwMDAwCisjZGVmaW5lIGJSWElRSW1iX0QgICAgICAgICAgICAgICAJCQkweGZmYzAwMDAwCisjZGVmaW5lIGJEQ19kY19Ob3RjaCAgICAgICAgICAgICAJCTB4NjAwMDAKKyNkZWZpbmUgYlJ4TkJJTm90Y2ggICAgICAgICAgICAgIAkJCTB4MWYwMDAwMDAKKyNkZWZpbmUgYlBEX1RIICAgICAgICAgICAgICAgICAgIAkJCTB4ZgorI2RlZmluZSBiUERfVEhfT3B0MiAgICAgICAgICAgICAgCQkweGMwMDAKKyNkZWZpbmUgYlBXRURfVEggICAgICAgICAgICAgICAgIAkJCTB4NzAwCisjZGVmaW5lIGJJZk1GX1dpbl9MICAgICAgICAgICAgICAJCQkweDgwMAorI2RlZmluZSBiUERfT3B0aW9uICAgICAgICAgICAgICAgCQkJMHgxMDAwCisjZGVmaW5lIGJNRl9XaW5fTCAgICAgICAgICAgICAgICAJCQkweGUwMDAKKyNkZWZpbmUgYkJXX1NlYXJjaF9MICAgICAgICAgICAgIAkJMHgzMDAwMAorI2RlZmluZSBid2luX2VuaF9MICAgICAgICAgICAgICAgCQkJMHhjMDAwMAorI2RlZmluZSBiQldfVEggICAgICAgICAgICAgICAgICAgCQkJMHg3MDAwMDAKKyNkZWZpbmUgYkVEX1RIMiAgICAgICAgICAgICAgICAgIAkJCTB4MzgwMDAwMAorI2RlZmluZSBiQldfb3B0aW9uICAgICAgICAgICAgICAgCQkJMHg0MDAwMDAwCisjZGVmaW5lIGJSYXRpb19USCAgICAgICAgICAgICAgICAJCQkweDE4MDAwMDAwCisjZGVmaW5lIGJXaW5kb3dfTCAgICAgICAgICAgICAgICAJCQkweGUwMDAwMDAwCisjZGVmaW5lIGJTQkRfT3B0aW9uICAgICAgICAgICAgICAJCQkweDEKKyNkZWZpbmUgYkZyYW1lX1RIICAgICAgICAgICAgICAgIAkJCTB4MWMKKyNkZWZpbmUgYkZTX09wdGlvbiAgICAgICAgICAgICAgIAkJCTB4NjAKKyNkZWZpbmUgYkRDX1Nsb3BlX2NoZWNrICAgICAgICAgIAkJMHg4MAorI2RlZmluZSBiRkd1YXJkX0NvdW50ZXJfRENfTCAgICAgCQkweGUwMAorI2RlZmluZSBiRnJhbWVfV2VpZ2h0X1Nob3J0ICAgICAgCQkweDcwMDAKKyNkZWZpbmUgYlN1Yl9UdW5lICAgICAgICAgICAgICAgIAkJCTB4ZTAwMDAwCisjZGVmaW5lIGJGcmFtZV9EQ19MZW5ndGggICAgICAgICAJCTB4ZTAwMDAwMAorI2RlZmluZSBiU0JEX3N0YXJ0X29mZnNldCAgICAgICAgCQkweDMwMDAwMDAwCisjZGVmaW5lIGJGcmFtZV9USF8yICAgICAgICAgICAgICAJCTB4NworI2RlZmluZSBiRnJhbWVfR0kyX1RIICAgICAgICAgICAgCQkweDM4CisjZGVmaW5lIGJHSTJfU3luY19lbiAgICAgICAgICAgICAJCTB4NDAKKyNkZWZpbmUgYlNhcmNoX1Nob3J0X0Vhcmx5ICAgICAgIAkJMHgzMDAKKyNkZWZpbmUgYlNhcmNoX1Nob3J0X0xhdGUgICAgICAgIAkJMHhjMDAKKyNkZWZpbmUgYlNhcmNoX0dJMl9MYXRlICAgICAgICAgIAkJMHg3MDAwMAorI2RlZmluZSBiQ0ZPQW50U3VtICAgICAgICAgICAgICAgCQkweDEKKyNkZWZpbmUgYkNGT0FjYyAgICAgICAgICAgICAgICAgIAkJCTB4MgorI2RlZmluZSBiQ0ZPU3RhcnRPZmZzZXQgICAgICAgICAgCQkweGMKKyNkZWZpbmUgYkNGT0xvb2tCYWNrICAgICAgICAgICAgIAkJMHg3MAorI2RlZmluZSBiQ0ZPU3VtV2VpZ2h0ICAgICAgICAgICAgCQkweDgwCisjZGVmaW5lIGJEQUdDRW5hYmxlICAgICAgICAgICAgICAJCQkweDEwMDAwCisjZGVmaW5lIGJUWElRSW1iX0EgICAgICAgICAgICAgICAJCQkweDNmZgorI2RlZmluZSBiVFhJUUltYl9CICAgICAgICAgICAgICAgCQkJMHhmYzAwCisjZGVmaW5lIGJUWElRSW1iX0MgICAgICAgICAgICAgICAJCQkweDNmMDAwMAorI2RlZmluZSBiVFhJUUltYl9EICAgICAgICAgICAgICAgCQkJMHhmZmMwMDAwMAorI2RlZmluZSBiVHhJRENPZmZzZXQgICAgICAgICAgICAgCQkJMHhmZgorI2RlZmluZSBiVHhRRENPZmZzZXQgICAgICAgICAgICAgCQkJMHhmZjAwCisjZGVmaW5lIGJUeERGSVJNb2RlICAgICAgICAgICAgICAJCTB4MTAwMDAKKyNkZWZpbmUgYlR4UGVzdWRvTm9pc2VPbiAgICAgICAgIAkJMHg0MDAwMDAwCisjZGVmaW5lIGJUeFBlc3Vkb05vaXNlX0EgICAgICAgICAJCTB4ZmYKKyNkZWZpbmUgYlR4UGVzdWRvTm9pc2VfQiAgICAgICAgIAkJMHhmZjAwCisjZGVmaW5lIGJUeFBlc3Vkb05vaXNlX0MgICAgICAgICAJCTB4ZmYwMDAwCisjZGVmaW5lIGJUeFBlc3Vkb05vaXNlX0QgICAgICAgICAJCTB4ZmYwMDAwMDAKKyNkZWZpbmUgYkNDQURyb3BPcHRpb24gICAgICAgICAgIAkJMHgyMDAwMAorI2RlZmluZSBiQ0NBRHJvcFRocmVzICAgICAgICAgICAgCQkweGZmZjAwMDAwCisjZGVmaW5lIGJFRENDQV9IICAgICAgICAgICAgICAgICAJCQkweGYKKyNkZWZpbmUgYkVEQ0NBX0wgICAgICAgICAgICAgICAgIAkJCTB4ZjAKKyNkZWZpbmUgYkxhbWJkYV9FRCAgICAgICAgICAgICAgIDB4MzAwCisjZGVmaW5lIGJSeEluaXRpYWxHYWluICAgICAgICAgICAweDdmCisjZGVmaW5lIGJSeEFudERpdkVuICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIGJSeEFHQ0FkZHJlc3NGb3JMTkEgICAgICAweDdmMDAKKyNkZWZpbmUgYlJ4SGlnaFBvd2VyRmxvdyAgICAgICAgIDB4ODAwMAorI2RlZmluZSBiUnhBR0NGcmVlemVUaHJlcyAgICAgICAgMHhjMDAwMAorI2RlZmluZSBiUnhGcmVlemVTdGVwX0FHQzEgICAgICAgMHgzMDAwMDAKKyNkZWZpbmUgYlJ4RnJlZXplU3RlcF9BR0MyICAgICAgIDB4YzAwMDAwCisjZGVmaW5lIGJSeEZyZWV6ZVN0ZXBfQUdDMyAgICAgICAweDMwMDAwMDAKKyNkZWZpbmUgYlJ4RnJlZXplU3RlcF9BR0MwICAgICAgIDB4YzAwMDAwMAorI2RlZmluZSBiUnhSc3NpX0NtcF9FbiAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBiUnhRdWlja0FHQ0VuICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBiUnhBR0NGcmVlemVUaHJlc01vZGUgICAgMHg0MDAwMDAwMAorI2RlZmluZSBiUnhPdmVyRmxvd0NoZWNrVHlwZSAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBiUnhBR0NTaGlmdCAgICAgICAgICAgICAgMHg3ZgorI2RlZmluZSBiVFJTV19UcmlfT25seSAgICAgICAgICAgMHg4MAorI2RlZmluZSBiUG93ZXJUaHJlcyAgICAgICAgICAgICAgMHgzMDAKKyNkZWZpbmUgYlJ4QUdDRW4gICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBiUnhBR0NUb2dldGhlckVuICAgICAgICAgMHgyCisjZGVmaW5lIGJSeEFHQ01pbiAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgYlJ4SFBfSW5pICAgICAgICAgICAgICAgIDB4NworI2RlZmluZSBiUnhIUF9UUkxOQSAgICAgICAgICAgICAgMHg3MAorI2RlZmluZSBiUnhIUF9SU1NJICAgICAgICAgICAgICAgMHg3MDAKKyNkZWZpbmUgYlJ4SFBfQkJQMSAgICAgICAgICAgICAgIDB4NzAwMAorI2RlZmluZSBiUnhIUF9CQlAyICAgICAgICAgICAgICAgMHg3MDAwMAorI2RlZmluZSBiUnhIUF9CQlAzICAgICAgICAgICAgICAgMHg3MDAwMDAKKyNkZWZpbmUgYlJTU0lfSCAgICAgICAgICAgICAgICAgIDB4N2YwMDAwICAgICAvL3RoZSB0aHJlc2hvbGQgZm9yIGhpZ2ggcG93ZXIKKyNkZWZpbmUgYlJTU0lfR2VuICAgICAgICAgICAgICAgIDB4N2YwMDAwMDAgICAvL3RoZSB0aHJlc2hvbGQgZm9yIGFudCBkaXZlcnNpdHkKKyNkZWZpbmUgYlJ4U2V0dGxlX1RSU1cgICAgICAgICAgIDB4NworI2RlZmluZSBiUnhTZXR0bGVfTE5BICAgICAgICAgICAgMHgzOAorI2RlZmluZSBiUnhTZXR0bGVfUlNTSSAgICAgICAgICAgMHgxYzAKKyNkZWZpbmUgYlJ4U2V0dGxlX0JCUCAgICAgICAgICAgIDB4ZTAwCisjZGVmaW5lIGJSeFNldHRsZV9SeEhQICAgICAgICAgICAweDcwMDAKKyNkZWZpbmUgYlJ4U2V0dGxlX0FudFNXX1JTU0kgICAgIDB4MzgwMDAKKyNkZWZpbmUgYlJ4U2V0dGxlX0FudFNXICAgICAgICAgIDB4YzAwMDAKKyNkZWZpbmUgYlJ4UHJvY2Vzc1RpbWVfREFHQyAgICAgIDB4MzAwMDAwCisjZGVmaW5lIGJSeFNldHRsZV9IU1NJICAgICAgICAgICAweDQwMDAwMAorI2RlZmluZSBiUnhQcm9jZXNzVGltZV9CQlBQVyAgICAgMHg4MDAwMDAKKyNkZWZpbmUgYlJ4QW50ZW5uYVBvd2VyU2hpZnQgICAgIDB4MzAwMDAwMAorI2RlZmluZSBiUlNTSVRhYmxlU2VsZWN0ICAgICAgICAgMHhjMDAwMDAwCisjZGVmaW5lIGJSeEhQX0ZpbmFsICAgICAgICAgICAgICAweDcwMDAwMDAKKyNkZWZpbmUgYlJ4SFRTZXR0bGVfQkJQICAgICAgICAgIDB4NworI2RlZmluZSBiUnhIVFNldHRsZV9IU1NJICAgICAgICAgMHg4CisjZGVmaW5lIGJSeEhUU2V0dGxlX1J4SFAgICAgICAgICAweDcwCisjZGVmaW5lIGJSeEhUU2V0dGxlX0JCUFBXICAgICAgICAweDgwCisjZGVmaW5lIGJSeEhUU2V0dGxlX0lkbGUgICAgICAgICAweDMwMAorI2RlZmluZSBiUnhIVFNldHRsZV9SZXNlcnZlZCAgICAgMHgxYzAwCisjZGVmaW5lIGJSeEhUUnhIUEVuICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgYlJ4SFRBR0NGcmVlemVUaHJlcyAgICAgIDB4MzAwMDAKKyNkZWZpbmUgYlJ4SFRBR0NUb2dldGhlckVuICAgICAgIDB4NDAwMDAKKyNkZWZpbmUgYlJ4SFRBR0NNaW4gICAgICAgICAgICAgIDB4ODAwMDAKKyNkZWZpbmUgYlJ4SFRBR0NFbiAgICAgICAgICAgICAgIDB4MTAwMDAwCisjZGVmaW5lIGJSeEhUREFHQ0VuICAgICAgICAgICAgICAweDIwMDAwMAorI2RlZmluZSBiUnhIVFJ4SFBfQkJQICAgICAgICAgICAgMHgxYzAwMDAwCisjZGVmaW5lIGJSeEhUUnhIUF9GaW5hbCAgICAgICAgICAweGUwMDAwMDAwCisjZGVmaW5lIGJSeFBXUmF0aW9USCAgICAgICAgICAgICAweDMKKyNkZWZpbmUgYlJ4UFdSYXRpb0VuICAgICAgICAgICAgIDB4NAorI2RlZmluZSBiUnhNRkhvbGQgICAgICAgICAgICAgICAgMHgzODAwCisjZGVmaW5lIGJSeFBEX0RlbGF5X1RIMSAgICAgICAgICAweDM4CisjZGVmaW5lIGJSeFBEX0RlbGF5X1RIMiAgICAgICAgICAweDFjMAorI2RlZmluZSBiUnhQRF9EQ19DT1VOVF9NQVggICAgICAgMHg2MDAKKy8vI2RlZmluZSBiUnhNRl9Ib2xkICAgICAgICAgICAgICAgMHgzODAwCisjZGVmaW5lIGJSeFBEX0RlbGF5X1RIICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgYlJ4UHJvY2Vzc19EZWxheSAgICAgICAgIDB4ZjAwMDAKKyNkZWZpbmUgYlJ4U2VhcmNocmFuZ2VfR0kyX0Vhcmx5IDB4NzAwMDAwCisjZGVmaW5lIGJSeEZyYW1lX0d1YXJkX0NvdW50ZXJfTCAweDM4MDAwMDAKKyNkZWZpbmUgYlJ4U0dJX0d1YXJkX0wgICAgICAgICAgIDB4YzAwMDAwMAorI2RlZmluZSBiUnhTR0lfU2VhcmNoX0wgICAgICAgICAgMHgzMDAwMDAwMAorI2RlZmluZSBiUnhTR0lfVEggICAgICAgICAgICAgICAgMHhjMDAwMDAwMAorI2RlZmluZSBiREZTQ250MCAgICAgICAgICAgICAgICAgMHhmZgorI2RlZmluZSBiREZTQ250MSAgICAgICAgICAgICAgICAgMHhmZjAwCisjZGVmaW5lIGJERlNGbGFnICAgICAgICAgICAgICAgICAweGYwMDAwCisKKyNkZWZpbmUgYk1GV2VpZ2h0U3VtICAgICAgICAgICAgIDB4MzAwMDAwCisjZGVmaW5lIGJNaW5JZHhUSCAgICAgICAgICAgICAgICAweDdmMDAwMDAwCisKKyNkZWZpbmUgYkRBRm9ybWF0ICAgICAgICAgICAgICAgIDB4NDAwMDAKKworI2RlZmluZSBiVHhDaEVtdUVuYWJsZSAgICAgICAgICAgMHgwMTAwMDAwMAorCisjZGVmaW5lIGJUUlNXSXNvbGF0aW9uX0EgICAgICAgICAweDdmCisjZGVmaW5lIGJUUlNXSXNvbGF0aW9uX0IgICAgICAgICAweDdmMDAKKyNkZWZpbmUgYlRSU1dJc29sYXRpb25fQyAgICAgICAgIDB4N2YwMDAwCisjZGVmaW5lIGJUUlNXSXNvbGF0aW9uX0QgICAgICAgICAweDdmMDAwMDAwCisKKyNkZWZpbmUgYkV4dExOQUdhaW4gICAgICAgICAgICAgIDB4N2MwMAorCisvL3BhZ2UgZAorI2RlZmluZSBiU1RCQ0VuICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lIGJBbnRlbm5hTWFwcGluZyAgICAgICAgICAweDEwCisjZGVmaW5lIGJOc3MgICAgICAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIGJDRk9BbnRTdW1EICAgICAgICAgICAgICAweDIwMAorI2RlZmluZSBiUEhZQ291bnRlclJlc2V0ICAgICAgICAgMHg4MDAwMDAwCisjZGVmaW5lIGJDRk9SZXBvcnRHZXQgICAgICAgICAgICAweDQwMDAwMDAKKyNkZWZpbmUgYk9GRE1Db250aW51ZVR4ICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgYk9GRE1TaW5nbGVDYXJyaWVyICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgYk9GRE1TaW5nbGVUb25lICAgICAgICAgIDB4NDAwMDAwMDAKKy8vI2RlZmluZSBiUnhQYXRoMSAgICAgICAgICAgICAgICAgMHgwMQorLy8jZGVmaW5lIGJSeFBhdGgyICAgICAgICAgICAgICAgICAweDAyCisvLyNkZWZpbmUgYlJ4UGF0aDMgICAgICAgICAgICAgICAgIDB4MDQKKy8vI2RlZmluZSBiUnhQYXRoNCAgICAgICAgICAgICAgICAgMHgwOAorLy8jZGVmaW5lIGJUeFBhdGgxICAgICAgICAgICAgICAgICAweDEwCisvLyNkZWZpbmUgYlR4UGF0aDIgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgYkhURGV0ZWN0ICAgICAgICAgICAgICAgIDB4MTAwCisjZGVmaW5lIGJDRk9FbiAgICAgICAgICAgICAgICAgICAweDEwMDAwCisjZGVmaW5lIGJDRk9WYWx1ZSAgICAgICAgICAgICAgICAweGZmZjAwMDAwCisjZGVmaW5lIGJTaWdUb25lX1JlICAgICAgICAgICAgICAweDNmCisjZGVmaW5lIGJTaWdUb25lX0ltICAgICAgICAgICAgICAweDdmMDAKKyNkZWZpbmUgYkNvdW50ZXJfQ0NBICAgICAgICAgICAgIDB4ZmZmZgorI2RlZmluZSBiQ291bnRlcl9QYXJpdHlGYWlsICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBiQ291bnRlcl9SYXRlSWxsZWdhbCAgICAgMHhmZmZmCisjZGVmaW5lIGJDb3VudGVyX0NSQzhGYWlsICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIGJDb3VudGVyX01DU05vU3VwcG9ydCAgICAweGZmZmYKKyNkZWZpbmUgYkNvdW50ZXJfRmFzdFN5bmMgICAgICAgIDB4ZmZmZgorI2RlZmluZSBiU2hvcnRDRk8gICAgICAgICAgICAgICAgMHhmZmYKKyNkZWZpbmUgYlNob3J0Q0ZPVExlbmd0aCAgICAgICAgIDEyICAgLy90b3RhbAorI2RlZmluZSBiU2hvcnRDRk9GTGVuZ3RoICAgICAgICAgMTEgICAvL2ZyYWN0aW9uCisjZGVmaW5lIGJMb25nQ0ZPICAgICAgICAgICAgICAgICAweDdmZgorI2RlZmluZSBiTG9uZ0NGT1RMZW5ndGggICAgICAgICAgMTEKKyNkZWZpbmUgYkxvbmdDRk9GTGVuZ3RoICAgICAgICAgIDExCisjZGVmaW5lIGJUYWlsQ0ZPICAgICAgICAgICAgICAgICAweDFmZmYKKyNkZWZpbmUgYlRhaWxDRk9UTGVuZ3RoICAgICAgICAgIDEzCisjZGVmaW5lIGJUYWlsQ0ZPRkxlbmd0aCAgICAgICAgICAxMgorCisjZGVmaW5lIGJtYXhfZW5fcHdkQiAgICAgICAgICAgICAweGZmZmYKKyNkZWZpbmUgYkNDX3Bvd2VyX2RCICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgYm5vaXNlX3B3ZEIgICAgICAgICAgICAgIDB4ZmZmZgorI2RlZmluZSBiUG93ZXJNZWFzVExlbmd0aCAgICAgICAgMTAKKyNkZWZpbmUgYlBvd2VyTWVhc0ZMZW5ndGggICAgICAgIDMKKyNkZWZpbmUgYlJ4X0hUX0JXICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBiUnhTQyAgICAgICAgICAgICAgICAgICAgMHg2CisjZGVmaW5lIGJSeF9IVCAgICAgICAgICAgICAgICAgICAweDgKKworI2RlZmluZSBiTkJfaW50Zl9kZXRfb24gICAgICAgICAgMHgxCisjZGVmaW5lIGJJbnRmX3dpbl9sZW5fY2ZnICAgICAgICAweDMwCisjZGVmaW5lIGJOQl9JbnRmX1RIX2NmZyAgICAgICAgICAweDFjMAorCisjZGVmaW5lIGJSRkdhaW4gICAgICAgICAgICAgICAgICAweDNmCisjZGVmaW5lIGJUYWJsZVNlbCAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIGJUUlNXICAgICAgICAgICAgICAgICAgICAweDgwCisKKyNkZWZpbmUgYlJ4U05SX0EgICAgICAgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgYlJ4U05SX0IgICAgICAgICAgICAgICAgIDB4ZmYwMAorI2RlZmluZSBiUnhTTlJfQyAgICAgICAgICAgICAgICAgMHhmZjAwMDAKKyNkZWZpbmUgYlJ4U05SX0QgICAgICAgICAgICAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgYlNOUkVWTVRMZW5ndGggICAgICAgICAgIDgKKyNkZWZpbmUgYlNOUkVWTUZMZW5ndGggICAgICAgICAgIDEKKworI2RlZmluZSBiQ1NJMXN0ICAgICAgICAgICAgICAgICAgMHhmZgorI2RlZmluZSBiQ1NJMm5kICAgICAgICAgICAgICAgICAgMHhmZjAwCisjZGVmaW5lIGJSeEVWTTFzdCAgICAgICAgICAgICAgICAweGZmMDAwMAorI2RlZmluZSBiUnhFVk0ybmQgICAgICAgICAgICAgICAgMHhmZjAwMDAwMAorCisjZGVmaW5lIGJTSUdFVk0gICAgICAgICAgICAgICAgICAweGZmCisjZGVmaW5lIGJQV0RCICAgICAgICAgICAgICAgICAgICAweGZmMDAKKyNkZWZpbmUgYlNHSUVOICAgICAgICAgICAgICAgICAgIDB4MTAwMDAKKworI2RlZmluZSBiU0ZhY3RvclFBTTEgICAgICAgICAgICAgMHhmCisjZGVmaW5lIGJTRmFjdG9yUUFNMiAgICAgICAgICAgICAweGYwCisjZGVmaW5lIGJTRmFjdG9yUUFNMyAgICAgICAgICAgICAweGYwMAorI2RlZmluZSBiU0ZhY3RvclFBTTQgICAgICAgICAgICAgMHhmMDAwCisjZGVmaW5lIGJTRmFjdG9yUUFNNSAgICAgICAgICAgICAweGYwMDAwCisjZGVmaW5lIGJTRmFjdG9yUUFNNiAgICAgICAgICAgICAweGYwMDAwCisjZGVmaW5lIGJTRmFjdG9yUUFNNyAgICAgICAgICAgICAweGYwMDAwMAorI2RlZmluZSBiU0ZhY3RvclFBTTggICAgICAgICAgICAgMHhmMDAwMDAwCisjZGVmaW5lIGJTRmFjdG9yUUFNOSAgICAgICAgICAgICAweGYwMDAwMDAwCisjZGVmaW5lIGJDU0lTY2hlbWUgICAgICAgICAgICAgICAweDEwMDAwMAorCisjZGVmaW5lIGJOb2lzZUx2bFRvcFNldCAgICAgICAgICAweDMKKyNkZWZpbmUgYkNoU21vb3RoICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBiQ2hTbW9vdGhDZmcxICAgICAgICAgICAgMHgzOAorI2RlZmluZSBiQ2hTbW9vdGhDZmcyICAgICAgICAgICAgMHgxYzAKKyNkZWZpbmUgYkNoU21vb3RoQ2ZnMyAgICAgICAgICAgIDB4ZTAwCisjZGVmaW5lIGJDaFNtb290aENmZzQgICAgICAgICAgICAweDcwMDAKKyNkZWZpbmUgYk1SQ01vZGUgICAgICAgICAgICAgICAgIDB4ODAwMDAwCisjZGVmaW5lIGJUSEVWTUNmZyAgICAgICAgICAgICAgICAweDcwMDAwMDAKKworI2RlZmluZSBiTG9vcEZpdFR5cGUgICAgICAgICAgICAgMHgxCisjZGVmaW5lIGJVcGRDRk8gICAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIGJVcGRDRk9PZmZEYXRhICAgICAgICAgICAweDgwCisjZGVmaW5lIGJBZHZVcGRDRk8gICAgICAgICAgICAgICAweDEwMAorI2RlZmluZSBiQWR2VGltZUN0cmwgICAgICAgICAgICAgMHg4MDAKKyNkZWZpbmUgYlVwZENsa28gICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBiRkMgICAgICAgICAgICAgICAgICAgICAgMHg2MDAwCisjZGVmaW5lIGJUcmFja2luZ01vZGUgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgYlBoQ21wRW5hYmxlICAgICAgICAgICAgIDB4MTAwMDAKKyNkZWZpbmUgYlVwZENsa29MVEYgICAgICAgICAgICAgIDB4MjAwMDAKKyNkZWZpbmUgYkNvbUNoQ0ZPICAgICAgICAgICAgICAgIDB4NDAwMDAKKyNkZWZpbmUgYkNTSUVzdGlNb2RlICAgICAgICAgICAgIDB4ODAwMDAKKyNkZWZpbmUgYkFkdlVwZEVxeiAgICAgICAgICAgICAgIDB4MTAwMDAwCisjZGVmaW5lIGJVQ2hDZmcgICAgICAgICAgICAgICAgICAweDcwMDAwMDAKKyNkZWZpbmUgYlVwZEVxeiAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMAorCisvL3BhZ2UgZQorI2RlZmluZSBiVHhBR0NSYXRlMThfMDYJCQkweDdmN2Y3ZjdmCisjZGVmaW5lIGJUeEFHQ1JhdGU1NF8yNAkJCTB4N2Y3ZjdmN2YKKyNkZWZpbmUgYlR4QUdDUmF0ZU1DUzMyCQkweDdmCisjZGVmaW5lIGJUeEFHQ1JhdGVDQ0sJCQkweDdmMDAKKyNkZWZpbmUgYlR4QUdDUmF0ZU1DUzNfTUNTMAkweDdmN2Y3ZjdmCisjZGVmaW5lIGJUeEFHQ1JhdGVNQ1M3X01DUzQJMHg3ZjdmN2Y3ZgorI2RlZmluZSBiVHhBR0NSYXRlTUNTMTFfTUNTOAkweDdmN2Y3ZjdmCisjZGVmaW5lIGJUeEFHQ1JhdGVNQ1MxNV9NQ1MxMgkweDdmN2Y3ZjdmCisKKworLy9SeCBQc2VkdW8gbm9pc2UKKyNkZWZpbmUgYlJ4UGVzdWRvTm9pc2VPbiAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgYlJ4UGVzdWRvTm9pc2VfQSAgICAgICAgIDB4ZmYKKyNkZWZpbmUgYlJ4UGVzdWRvTm9pc2VfQiAgICAgICAgIDB4ZmYwMAorI2RlZmluZSBiUnhQZXN1ZG9Ob2lzZV9DICAgICAgICAgMHhmZjAwMDAKKyNkZWZpbmUgYlJ4UGVzdWRvTm9pc2VfRCAgICAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgYlBlc3Vkb05vaXNlU3RhdGVfQSAgICAgIDB4ZmZmZgorI2RlZmluZSBiUGVzdWRvTm9pc2VTdGF0ZV9CICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBiUGVzdWRvTm9pc2VTdGF0ZV9DICAgICAgMHhmZmZmCisjZGVmaW5lIGJQZXN1ZG9Ob2lzZVN0YXRlX0QgICAgICAweGZmZmYwMDAwCisKKy8vUkYKKy8vWmVicmExCisjZGVmaW5lIGJaZWJyYTFfSFNTSUVuYWJsZSAgICAgICAgMHg4CisjZGVmaW5lIGJaZWJyYTFfVFJ4Q29udHJvbCAgICAgICAgMHhjMDAKKyNkZWZpbmUgYlplYnJhMV9UUnhHYWluU2V0dGluZyAgICAweDA3ZgorI2RlZmluZSBiWmVicmExX1J4Q29ybmVyICAgICAgICAgIDB4YzAwCisjZGVmaW5lIGJaZWJyYTFfVHhDaGFyZ2VQdW1wICAgICAgMHgzOAorI2RlZmluZSBiWmVicmExX1J4Q2hhcmdlUHVtcCAgICAgIDB4NworI2RlZmluZSBiWmVicmExX0NoYW5uZWxOdW0gICAgICAgIDB4ZjgwCisjZGVmaW5lIGJaZWJyYTFfVHhMUEZCVyAgICAgICAgICAgMHg0MDAKKyNkZWZpbmUgYlplYnJhMV9SeExQRkJXICAgICAgICAgICAweDYwMAorCisvL1plYnJhNAorI2RlZmluZSBiUlRMODI1NlJlZ01vZGVDdHJsMSAgICAgIDB4MTAwCisjZGVmaW5lIGJSVEw4MjU2UmVnTW9kZUN0cmwwICAgICAgMHg0MAorI2RlZmluZSBiUlRMODI1Nl9UeExQRkJXICAgICAgICAgIDB4MTgKKyNkZWZpbmUgYlJUTDgyNTZfUnhMUEZCVyAgICAgICAgICAweDYwMAorCisvL1JUTDgyNTgKKyNkZWZpbmUgYlJUTDgyNThfVHhMUEZCVyAgICAgICAgICAweGMKKyNkZWZpbmUgYlJUTDgyNThfUnhMUEZCVyAgICAgICAgICAweGMwMAorI2RlZmluZSBiUlRMODI1OF9SU1NJTFBGQlcgICAgICAgIDB4YzAKKworLy9ieXRlIGVuZGFibGUgZm9yIHNiX3dyaXRlCisjZGVmaW5lIGJCeXRlMCAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIGJCeXRlMSAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIGJCeXRlMiAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lIGJCeXRlMyAgICAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lIGJXb3JkMCAgICAgICAgICAgICAgICAgICAgMHgzCisjZGVmaW5lIGJXb3JkMSAgICAgICAgICAgICAgICAgICAgMHhjCisjZGVmaW5lIGJEV29yZCAgICAgICAgICAgICAgICAgICAgMHhmCisKKy8vZm9yIFB1dFJlZ3NldHRpbmcgJiBHZXRSZWdTZXR0aW5nIEJpdE1hc2sKKyNkZWZpbmUgYk1hc2tCeXRlMCAgICAgICAgICAgICAgICAweGZmCisjZGVmaW5lIGJNYXNrQnl0ZTEgICAgICAgICAgICAgICAgMHhmZjAwCisjZGVmaW5lIGJNYXNrQnl0ZTIgICAgICAgICAgICAgICAgMHhmZjAwMDAKKyNkZWZpbmUgYk1hc2tCeXRlMyAgICAgICAgICAgICAgICAweGZmMDAwMDAwCisjZGVmaW5lIGJNYXNrSFdvcmQgICAgICAgICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBiTWFza0xXb3JkICAgICAgICAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgYk1hc2tEV29yZCAgICAgICAgICAgICAgICAweGZmZmZmZmZmCisKKy8vZm9yIFB1dFJGUmVnc2V0dGluZyAmIEdldFJGUmVnU2V0dGluZyBCaXRNYXNrCisjZGVmaW5lIGJNYXNrMTJCaXRzICAgICAgICAgICAgICAgMHhmZmYKKworI2RlZmluZSBiRW5hYmxlICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBiRGlzYWJsZSAgICAgICAgICAgICAgICAgIDB4MAorCisjZGVmaW5lIExlZnRBbnRlbm5hICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIFJpZ2h0QW50ZW5uYSAgICAgICAgICAgICAgMHgxCisKKyNkZWZpbmUgdENoZWNrVHhTdGF0dXMgICAgICAgICAgICA1MDAgICAvLzUwMG1zCisjZGVmaW5lIHRVcGRhdGVSeENvdW50ZXIgICAgICAgICAgMTAwICAgLy8xMDBtcworCisjZGVmaW5lIHJhdGVDQ0sgICAgIDAKKyNkZWZpbmUgcmF0ZU9GRE0gICAgMQorI2RlZmluZSByYXRlSFQgICAgICAyCisKKy8vZGVmaW5lIFJlZ2lzdGVyLUVuZAorI2RlZmluZSBiUE1BQ19FbmQgICAgICAgICAgICAgICAgIDB4MWZmCisjZGVmaW5lIGJGUEdBUEhZMF9FbmQgICAgICAgICAgICAgMHg4ZmYKKyNkZWZpbmUgYkZQR0FQSFkxX0VuZCAgICAgICAgICAgICAweDlmZgorI2RlZmluZSBiQ0NLUEhZMF9FbmQgICAgICAgICAgICAgIDB4YWZmCisjZGVmaW5lIGJPRkRNUEhZMF9FbmQgICAgICAgICAgICAgMHhjZmYKKyNkZWZpbmUgYk9GRE1QSFkxX0VuZCAgICAgICAgICAgICAweGRmZgorCisvL2RlZmluZSBtYXggZGVidWcgaXRlbSBpbiBlYWNoIGRlYnVnIHBhZ2UKKy8vI2RlZmluZSBiTWF4SXRlbV9GUEdBX1BIWTAgICAgICAgIDB4OQorLy8jZGVmaW5lIGJNYXhJdGVtX0ZQR0FfUEhZMSAgICAgICAgMHgzCisvLyNkZWZpbmUgYk1heEl0ZW1fUEhZXzExQiAgICAgICAgICAweDE2CisvLyNkZWZpbmUgYk1heEl0ZW1fT0ZETV9QSFkwICAgICAgICAweDI5CisvLyNkZWZpbmUgYk1heEl0ZW1fT0ZETV9QSFkxICAgICAgICAweDAKKworI2RlZmluZSBiUE1BQ0NvbnRyb2wgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBiV01BQ0NvbnRyb2wgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBiV05JQ0NvbnRyb2wgICAgICAgICAgICAgIDB4MgorCisjZGVmaW5lIFBhdGhBICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIFBhdGhCICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFBhdGhDICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIFBhdGhEICAgICAgICAgICAgICAgICAgICAgMHgzCisKKyNkZWZpbmUJclJUTDgyNTZSeE1peGVyUG9sZQkJMHhiCisjZGVmaW5lIAliWmVicmFSeE1peGVyUG9sZQkJMHg2CisjZGVmaW5lIAlyUlRMODI1NlR4QkJPUEJpYXMgICAgICAgIDB4OQorI2RlZmluZSAJYlJUTDgyNTZUeEJCT1BCaWFzICAgICAgIDB4NDAwCisjZGVmaW5lIAlyUlRMODI1NlR4QkJCVyAgICAgICAgICAgICAxOQorI2RlZmluZSAJYlJUTDgyNTZUeEJCQlcgICAgICAgICAgICAJMHgxOAorCisjZW5kaWYJLy9fX0lOQ19IQUw4MTkwUENJUEhZUkVHX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYW1zdW5nLWxhcHRvcC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3NhbXN1bmctbGFwdG9wL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3YzYwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zYW1zdW5nLWxhcHRvcC9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKK2NvbmZpZyBTQU1TVU5HX0xBUFRPUAorCXRyaXN0YXRlICJTYW1zdW5nIExhcHRvcCBkcml2ZXIiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBSRktJTEwgJiYgQkFDS0xJR0hUX0NMQVNTX0RFVklDRSAmJiBYODYKKwloZWxwCisJICBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGEgZHJpdmVyIGZvciB0aGUgTjEyOCBTYW1zdW5nIExhcHRvcAorCSAgcHJvdmlkaW5nIGNvbnRyb2wgb3ZlciB0aGUgV2lyZWxlc3MgTEVEIGFuZCB0aGUgTENEIGJhY2tsaWdodAorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UKKwkgIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzYW1zdW5nLWxhcHRvcC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYW1zdW5nLWxhcHRvcC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9zYW1zdW5nLWxhcHRvcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzZmNDIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NhbXN1bmctbGFwdG9wL01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai0kKENPTkZJR19TQU1TVU5HX0xBUFRPUCkJKz0gc2Ftc3VuZy1sYXB0b3AubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NhbXN1bmctbGFwdG9wL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvc2Ftc3VuZy1sYXB0b3AvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2E2ZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NhbXN1bmctbGFwdG9wL1RPRE8KQEAgLTAsMCArMSw1IEBACitUT0RPOgorCS0gcmV2aWV3IGZyb20gb3RoZXIgZGV2ZWxvcGVycworCS0gZmlndXJlIG91dCBBQ1BJIHZpZGVvIGlzc3VlcworCitQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2Ftc3VuZy1sYXB0b3Avc2Ftc3VuZy1sYXB0b3AuYyBiL2RyaXZlcnMvc3RhZ2luZy9zYW1zdW5nLWxhcHRvcC9zYW1zdW5nLWxhcHRvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NzcxMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2Ftc3VuZy1sYXB0b3Avc2Ftc3VuZy1sYXB0b3AuYwpAQCAtMCwwICsxLDU0MiBAQAorLyoKKyAqIFNhbXN1bmcgTjEzMCBMYXB0b3AgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdyZWcgS3JvYWgtSGFydG1hbiAoZ3JlZ2toQHN1c2UuZGUpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm92ZWxsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmZraWxsLmg+CisKKy8qCisgKiBUaGlzIGRyaXZlciBpcyBuZWVkZWQgYmVjYXVzZSBhIG51bWJlciBvZiBTYW1zdW5nIGxhcHRvcHMgZG8gbm90IGhvb2sKKyAqIHRoZWlyIGNvbnRyb2wgc2V0dGluZ3MgdGhyb3VnaCBBQ1BJLiAgU28gd2UgaGF2ZSB0byBwb2tlIGFyb3VuZCBpbiB0aGUKKyAqIEJJT1MgdG8gZG8gdGhpbmdzIGxpa2UgYnJpZ2h0bmVzcyB2YWx1ZXMsIGFuZCAic3BlY2lhbCIga2V5IGNvbnRyb2xzLgorICovCisKKy8qCisgKiBXZSBoYXZlIDAgLSA4IGFzIHZhbGlkIGJyaWdodG5lc3MgbGV2ZWxzLiAgVGhlIHNwZWNzIHNheSB0aGF0IGxldmVsIDAgc2hvdWxkCisgKiBiZSByZXNlcnZlZCBieSB0aGUgQklPUyAod2hpY2ggcmVhbGx5IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlKSwgd2UgdGVsbAorICogdXNlcnNwYWNlIHRoYXQgdGhlIHZhbHVlIGlzIDAgLSA3IGFuZCB0aGVuIGp1c3QgdGVsbCB0aGUgaGFyZHdhcmUgMSAtIDgKKyAqLworI2RlZmluZSBNQVhfQlJJR0hUCTB4MDcKKworLyogQnJpZ2h0bmVzcyBpcyAwIC0gOCwgYXMgZGVzY3JpYmVkIGFib3ZlLiAgVmFsdWUgMCBpcyBmb3IgdGhlIEJJT1MgdG8gdXNlICovCisjZGVmaW5lIEdFVF9CUklHSFRORVNTCQkJMHgwMAorI2RlZmluZSBTRVRfQlJJR0hUTkVTUwkJCTB4MDEKKworLyogZmlyc3QgYnl0ZToKKyAqIDB4MDAgLSB3aXJlbGVzcyBpcyBvZmYKKyAqIDB4MDEgLSB3aXJlbGVzcyBpcyBvbgorICogc2Vjb25kIGJ5dGU6CisgKiAweDAyIC0gM0cgaXMgb2ZmCisgKiAweDAzIC0gM0cgaXMgb24KKyAqIFRPRE8sIHZlcmlmeSAzRyBpcyBjb3JyZWN0LCB0aGF0IGRvZXNuJ3Qgc2VlbSByaWdodC4uLgorICovCisjZGVmaW5lIEdFVF9XSVJFTEVTU19CVVRUT04JCTB4MDIKKyNkZWZpbmUgU0VUX1dJUkVMRVNTX0JVVFRPTgkJMHgwMworCisvKiAwIGlzIG9mZiwgMSBpcyBvbiAqLworI2RlZmluZSBHRVRfQkFDS0xJR0hUCQkJMHgwNAorI2RlZmluZSBTRVRfQkFDS0xJR0hUCQkJMHgwNQorCisvKgorICogMHg4MCBvciAweDAwIC0gbm8gYWN0aW9uCisgKiAweDgxIC0gcmVjb3Zlcnkga2V5IHByZXNzZWQKKyAqLworI2RlZmluZSBHRVRfUkVDT1ZFUllfTUVUSE9ECQkweDA2CisjZGVmaW5lIFNFVF9SRUNPVkVSWV9NRVRIT0QJCTB4MDcKKworLyogMCBpcyBsb3csIDEgaXMgaGlnaCAqLworI2RlZmluZSBHRVRfUEVSRk9STUFOQ0VfTEVWRUwJCTB4MDgKKyNkZWZpbmUgU0VUX1BFUkZPUk1BTkNFX0xFVkVMCQkweDA5CisKKy8qCisgKiBUZWxsIHRoZSBCSU9TIHRoYXQgTGludXggaXMgcnVubmluZyBvbiB0aGlzIG1hY2hpbmUuCisgKiA4MSBpcyBvbiwgODAgaXMgb2ZmCisgKi8KKyNkZWZpbmUgU0VUX0xJTlVYCQkJMHgwYQorCisKKyNkZWZpbmUgTUFJTl9GVU5DVElPTgkJCTB4NGM0OQorCisjZGVmaW5lIFNBQklfSEVBREVSX1BPUlQJCTB4MDAKKyNkZWZpbmUgU0FCSV9IRUFERVJfUkVfTUVNCQkweDAyCisjZGVmaW5lIFNBQklfSEVBREVSX0lGQUNFRlVOQwkJMHgwMworI2RlZmluZSBTQUJJX0hFQURFUl9FTl9NRU0JCTB4MDQKKyNkZWZpbmUgU0FCSV9IRUFERVJfREFUQV9PRkZTRVQJCTB4MDUKKyNkZWZpbmUgU0FCSV9IRUFERVJfREFUQV9TRUdNRU5UCTB4MDcKKworI2RlZmluZSBTQUJJX0lGQUNFX01BSU4JCQkweDAwCisjZGVmaW5lIFNBQklfSUZBQ0VfU1VCCQkJMHgwMgorI2RlZmluZSBTQUJJX0lGQUNFX0NPTVBMRVRFCQkweDA0CisjZGVmaW5lIFNBQklfSUZBQ0VfREFUQQkJCTB4MDUKKworLyogU3RydWN0dXJlIHRvIGdldCBkYXRhIGJhY2sgdG8gdGhlIGNhbGxpbmcgZnVuY3Rpb24gKi8KK3N0cnVjdCBzYWJpX3JldHZhbCB7CisJdTggcmV0dmFsWzIwXTsKK307CisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnNhYmk7CitzdGF0aWMgdm9pZCBfX2lvbWVtICpzYWJpX2lmYWNlOworc3RhdGljIHZvaWQgX19pb21lbSAqZjAwMDBfc2VnbWVudDsKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmFja2xpZ2h0X2RldmljZTsKK3N0YXRpYyBzdHJ1Y3QgbXV0ZXggc2FiaV9tdXRleDsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzZGV2Oworc3RhdGljIHN0cnVjdCByZmtpbGwgKnJmazsKKworc3RhdGljIGludCBmb3JjZTsKK21vZHVsZV9wYXJhbShmb3JjZSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlLCAiRGlzYWJsZSB0aGUgRE1JIGNoZWNrIGFuZCBmb3JjZXMgdGhlIGRyaXZlciB0byBiZSBsb2FkZWQiKTsKKworc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGVuYWJsZWQgb3Igbm90Iik7CisKK3N0YXRpYyBpbnQgc2FiaV9nZXRfY29tbWFuZCh1OCBjb21tYW5kLCBzdHJ1Y3Qgc2FiaV9yZXR2YWwgKnNyZXR2YWwpCit7CisJaW50IHJldHZhbCA9IDA7CisJdTE2IHBvcnQgPSByZWFkdyhzYWJpICsgU0FCSV9IRUFERVJfUE9SVCk7CisKKwltdXRleF9sb2NrKCZzYWJpX211dGV4KTsKKworCS8qIGVuYWJsZSBtZW1vcnkgdG8gYmUgYWJsZSB0byB3cml0ZSB0byBpdCAqLworCW91dGIocmVhZGIoc2FiaSArIFNBQklfSEVBREVSX0VOX01FTSksIHBvcnQpOworCisJLyogd3JpdGUgb3V0IHRoZSBjb21tYW5kICovCisJd3JpdGV3KE1BSU5fRlVOQ1RJT04sIHNhYmlfaWZhY2UgKyBTQUJJX0lGQUNFX01BSU4pOworCXdyaXRldyhjb21tYW5kLCBzYWJpX2lmYWNlICsgU0FCSV9JRkFDRV9TVUIpOworCXdyaXRlYigwLCBzYWJpX2lmYWNlICsgU0FCSV9JRkFDRV9DT01QTEVURSk7CisJb3V0YihyZWFkYihzYWJpICsgU0FCSV9IRUFERVJfSUZBQ0VGVU5DKSwgcG9ydCk7CisKKwkvKiB3cml0ZSBwcm90ZWN0IG1lbW9yeSB0byBtYWtlIGl0IHNhZmUgKi8KKwlvdXRiKHJlYWRiKHNhYmkgKyBTQUJJX0hFQURFUl9SRV9NRU0pLCBwb3J0KTsKKworCS8qIHNlZSBpZiB0aGUgY29tbWFuZCBhY3R1YWxseSBzdWNjZWVkZWQgKi8KKwlpZiAocmVhZGIoc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfQ09NUExFVEUpID09IDB4YWEgJiYKKwkgICAgcmVhZGIoc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfREFUQSkgIT0gMHhmZikgeworCQkvKgorCQkgKiBJdCBkaWQhCisJCSAqIFNhdmUgb2ZmIHRoZSBkYXRhIGludG8gYSBzdHJ1Y3R1cmUgc28gdGhlIGNhbGxlciB1c2UgaXQuCisJCSAqIFJpZ2h0IG5vdyB3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGZpcnN0IDQgYnl0ZXMsCisJCSAqIEkgc3VwcG9zZSB0aGVyZSBhcmUgY29tbWFuZHMgdGhhdCBuZWVkIG1vcmUsIGJ1dCBJIGRvbid0CisJCSAqIGtub3cgYWJvdXQgdGhlbS4KKwkJICovCisJCXNyZXR2YWwtPnJldHZhbFswXSA9IHJlYWRiKHNhYmlfaWZhY2UgKyBTQUJJX0lGQUNFX0RBVEEpOworCQlzcmV0dmFsLT5yZXR2YWxbMV0gPSByZWFkYihzYWJpX2lmYWNlICsgU0FCSV9JRkFDRV9EQVRBICsgMSk7CisJCXNyZXR2YWwtPnJldHZhbFsyXSA9IHJlYWRiKHNhYmlfaWZhY2UgKyBTQUJJX0lGQUNFX0RBVEEgKyAyKTsKKwkJc3JldHZhbC0+cmV0dmFsWzNdID0gcmVhZGIoc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfREFUQSArIDMpOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogU29tZXRoaW5nIGJhZCBoYXBwZW5lZCwgc28gcmVwb3J0IGl0IGFuZCBlcnJvciBvdXQgKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HICJTQUJJIGNvbW1hbmQgMHglMDJ4IGZhaWxlZCB3aXRoIGNvbXBsZXRpb24gZmxhZyAweCUwMnggYW5kIG91dHB1dCAweCUwMnhcbiIsCisJCWNvbW1hbmQsIHJlYWRiKHNhYmlfaWZhY2UgKyBTQUJJX0lGQUNFX0NPTVBMRVRFKSwKKwkJcmVhZGIoc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfREFUQSkpOworCXJldHZhbCA9IC1FSU5WQUw7CitleGl0OgorCW11dGV4X3VubG9jaygmc2FiaV9tdXRleCk7CisJcmV0dXJuIHJldHZhbDsKKworfQorCitzdGF0aWMgaW50IHNhYmlfc2V0X2NvbW1hbmQodTggY29tbWFuZCwgdTggZGF0YSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwl1MTYgcG9ydCA9IHJlYWR3KHNhYmkgKyBTQUJJX0hFQURFUl9QT1JUKTsKKworCW11dGV4X2xvY2soJnNhYmlfbXV0ZXgpOworCisJLyogZW5hYmxlIG1lbW9yeSB0byBiZSBhYmxlIHRvIHdyaXRlIHRvIGl0ICovCisJb3V0YihyZWFkYihzYWJpICsgU0FCSV9IRUFERVJfRU5fTUVNKSwgcG9ydCk7CisKKwkvKiB3cml0ZSBvdXQgdGhlIGNvbW1hbmQgKi8KKwl3cml0ZXcoTUFJTl9GVU5DVElPTiwgc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfTUFJTik7CisJd3JpdGV3KGNvbW1hbmQsIHNhYmlfaWZhY2UgKyBTQUJJX0lGQUNFX1NVQik7CisJd3JpdGViKDAsIHNhYmlfaWZhY2UgKyBTQUJJX0lGQUNFX0NPTVBMRVRFKTsKKwl3cml0ZWIoZGF0YSwgc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfREFUQSk7CisJb3V0YihyZWFkYihzYWJpICsgU0FCSV9IRUFERVJfSUZBQ0VGVU5DKSwgcG9ydCk7CisKKwkvKiB3cml0ZSBwcm90ZWN0IG1lbW9yeSB0byBtYWtlIGl0IHNhZmUgKi8KKwlvdXRiKHJlYWRiKHNhYmkgKyBTQUJJX0hFQURFUl9SRV9NRU0pLCBwb3J0KTsKKworCS8qIHNlZSBpZiB0aGUgY29tbWFuZCBhY3R1YWxseSBzdWNjZWVkZWQgKi8KKwlpZiAocmVhZGIoc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfQ09NUExFVEUpID09IDB4YWEgJiYKKwkgICAgcmVhZGIoc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfREFUQSkgIT0gMHhmZikgeworCQkvKiBpdCBkaWQhICovCisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBTb21ldGhpbmcgYmFkIGhhcHBlbmVkLCBzbyByZXBvcnQgaXQgYW5kIGVycm9yIG91dCAqLworCXByaW50ayhLRVJOX1dBUk5JTkcgIlNBQkkgY29tbWFuZCAweCUwMnggZmFpbGVkIHdpdGggY29tcGxldGlvbiBmbGFnIDB4JTAyeCBhbmQgb3V0cHV0IDB4JTAyeFxuIiwKKwkJY29tbWFuZCwgcmVhZGIoc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfQ09NUExFVEUpLAorCQlyZWFkYihzYWJpX2lmYWNlICsgU0FCSV9JRkFDRV9EQVRBKSk7CisJcmV0dmFsID0gLUVJTlZBTDsKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZzYWJpX211dGV4KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2JhY2tsaWdodCh2b2lkKQoreworCXN0cnVjdCBzYWJpX3JldHZhbCBzcmV0dmFsOworCisJc2FiaV9nZXRfY29tbWFuZChHRVRfQkFDS0xJR0hULCAmc3JldHZhbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgImJhY2tsaWdodCA9IDB4JTAyeFxuIiwgc3JldHZhbC5yZXR2YWxbMF0pOworCisJc2FiaV9zZXRfY29tbWFuZChTRVRfQkFDS0xJR0hULCAwKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiYmFja2xpZ2h0IHNob3VsZCBiZSBvZmZcbiIpOworCisJc2FiaV9nZXRfY29tbWFuZChHRVRfQkFDS0xJR0hULCAmc3JldHZhbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgImJhY2tsaWdodCA9IDB4JTAyeFxuIiwgc3JldHZhbC5yZXR2YWxbMF0pOworCisJbXNsZWVwKDEwMDApOworCisJc2FiaV9zZXRfY29tbWFuZChTRVRfQkFDS0xJR0hULCAxKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiYmFja2xpZ2h0IHNob3VsZCBiZSBvblxuIik7CisKKwlzYWJpX2dldF9jb21tYW5kKEdFVF9CQUNLTElHSFQsICZzcmV0dmFsKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiYmFja2xpZ2h0ID0gMHglMDJ4XG4iLCBzcmV0dmFsLnJldHZhbFswXSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfd2lyZWxlc3Modm9pZCkKK3sKKwlzdHJ1Y3Qgc2FiaV9yZXR2YWwgc3JldHZhbDsKKworCXNhYmlfZ2V0X2NvbW1hbmQoR0VUX1dJUkVMRVNTX0JVVFRPTiwgJnNyZXR2YWwpOworCXByaW50ayhLRVJOX0RFQlVHICJ3aXJlbGVzcyBsZWQgPSAweCUwMnhcbiIsIHNyZXR2YWwucmV0dmFsWzBdKTsKKworCXNhYmlfc2V0X2NvbW1hbmQoU0VUX1dJUkVMRVNTX0JVVFRPTiwgMCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIndpcmVsZXNzIGxlZCBzaG91bGQgYmUgb2ZmXG4iKTsKKworCXNhYmlfZ2V0X2NvbW1hbmQoR0VUX1dJUkVMRVNTX0JVVFRPTiwgJnNyZXR2YWwpOworCXByaW50ayhLRVJOX0RFQlVHICJ3aXJlbGVzcyBsZWQgPSAweCUwMnhcbiIsIHNyZXR2YWwucmV0dmFsWzBdKTsKKworCW1zbGVlcCgxMDAwKTsKKworCXNhYmlfc2V0X2NvbW1hbmQoU0VUX1dJUkVMRVNTX0JVVFRPTiwgMSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIndpcmVsZXNzIGxlZCBzaG91bGQgYmUgb25cbiIpOworCisJc2FiaV9nZXRfY29tbWFuZChHRVRfV0lSRUxFU1NfQlVUVE9OLCAmc3JldHZhbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIndpcmVsZXNzIGxlZCA9IDB4JTAyeFxuIiwgc3JldHZhbC5yZXR2YWxbMF0pOworfQorCitzdGF0aWMgdTggcmVhZF9icmlnaHRuZXNzKHZvaWQpCit7CisJc3RydWN0IHNhYmlfcmV0dmFsIHNyZXR2YWw7CisJaW50IHVzZXJfYnJpZ2h0bmVzcyA9IDA7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHNhYmlfZ2V0X2NvbW1hbmQoR0VUX0JSSUdIVE5FU1MsICZzcmV0dmFsKTsKKwlpZiAoIXJldHZhbCkKKwkJdXNlcl9icmlnaHRuZXNzID0gc3JldHZhbC5yZXR2YWxbMF07CisJCWlmICh1c2VyX2JyaWdodG5lc3MgIT0gMCkKKwkJCS0tdXNlcl9icmlnaHRuZXNzOworCXJldHVybiB1c2VyX2JyaWdodG5lc3M7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9icmlnaHRuZXNzKHU4IHVzZXJfYnJpZ2h0bmVzcykKK3sKKwlzYWJpX3NldF9jb21tYW5kKFNFVF9CUklHSFRORVNTLCB1c2VyX2JyaWdodG5lc3MgKyAxKTsKK30KKworc3RhdGljIGludCBnZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJcmV0dXJuIChpbnQpcmVhZF9icmlnaHRuZXNzKCk7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJc2V0X2JyaWdodG5lc3MoYmQtPnByb3BzLmJyaWdodG5lc3MpOworCisJaWYgKGJkLT5wcm9wcy5wb3dlciA9PSBGQl9CTEFOS19VTkJMQU5LKQorCQlzYWJpX3NldF9jb21tYW5kKFNFVF9CQUNLTElHSFQsIDEpOworCWVsc2UKKwkJc2FiaV9zZXRfY29tbWFuZChTRVRfQkFDS0xJR0hULCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIGJhY2tsaWdodF9vcHMgPSB7CisJLmdldF9icmlnaHRuZXNzCT0gZ2V0X2JyaWdodG5lc3MsCisJLnVwZGF0ZV9zdGF0dXMJPSB1cGRhdGVfc3RhdHVzLAorfTsKKworc3RhdGljIGludCByZmtpbGxfc2V0KHZvaWQgKmRhdGEsIGJvb2wgYmxvY2tlZCkKK3sKKwkvKiBEbyBzb21ldGhpbmcgd2l0aCBibG9ja2VkLi4uKi8KKwkvKgorCSAqIGJsb2NrZWQgPT0gZmFsc2UgaXMgb24KKwkgKiBibG9ja2VkID09IHRydWUgaXMgb2ZmCisJICovCisJaWYgKGJsb2NrZWQpCisJCXNhYmlfc2V0X2NvbW1hbmQoU0VUX1dJUkVMRVNTX0JVVFRPTiwgMCk7CisJZWxzZQorCQlzYWJpX3NldF9jb21tYW5kKFNFVF9XSVJFTEVTU19CVVRUT04sIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmZraWxsX29wcyByZmtpbGxfb3BzID0geworCS5zZXRfYmxvY2sgPSByZmtpbGxfc2V0LAorfTsKKworc3RhdGljIGludCBpbml0X3dpcmVsZXNzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNkZXYpCit7CisJaW50IHJldHZhbDsKKworCXJmayA9IHJma2lsbF9hbGxvYygic2Ftc3VuZy13aWZpIiwgJnNkZXYtPmRldiwgUkZLSUxMX1RZUEVfV0xBTiwKKwkJCSAgICZyZmtpbGxfb3BzLCBOVUxMKTsKKwlpZiAoIXJmaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR2YWwgPSByZmtpbGxfcmVnaXN0ZXIocmZrKTsKKwlpZiAocmV0dmFsKSB7CisJCXJma2lsbF9kZXN0cm95KHJmayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X3dpcmVsZXNzKHZvaWQpCit7CisJcmZraWxsX3VucmVnaXN0ZXIocmZrKTsKKwlyZmtpbGxfZGVzdHJveShyZmspOworfQorCitzdGF0aWMgc3NpemVfdCBnZXRfc2lsZW50X3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzYWJpX3JldHZhbCBzcmV0dmFsOworCWludCByZXR2YWw7CisKKwkvKiBSZWFkIHRoZSBzdGF0ZSAqLworCXJldHZhbCA9IHNhYmlfZ2V0X2NvbW1hbmQoR0VUX1BFUkZPUk1BTkNFX0xFVkVMLCAmc3JldHZhbCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCS8qIFRoZSBsb2dpYyBpcyBiYWNrd2FyZHMsIHllYWgsIGxvdHMgb2YgZnVuLi4uICovCisJaWYgKHNyZXR2YWwucmV0dmFsWzBdID09IDApCisJCXJldHZhbCA9IDE7CisJZWxzZQorCQlyZXR2YWwgPSAwOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZXR2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfc2lsZW50X3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCkKK3sKKwljaGFyIHZhbHVlOworCisJaWYgKGNvdW50ID49IDEpIHsKKwkJdmFsdWUgPSBidWZbMF07CisJCWlmICgodmFsdWUgPT0gJzAnKSB8fCAodmFsdWUgPT0gJ24nKSB8fCAodmFsdWUgPT0gJ04nKSkgeworCQkJLyogVHVybiBzcGVlZCB1cCAqLworCQkJc2FiaV9zZXRfY29tbWFuZChTRVRfUEVSRk9STUFOQ0VfTEVWRUwsIDB4MDEpOworCQl9IGVsc2UgaWYgKCh2YWx1ZSA9PSAnMScpIHx8ICh2YWx1ZSA9PSAneScpIHx8ICh2YWx1ZSA9PSAnWScpKSB7CisJCQkvKiBUdXJuIHNwZWVkIGRvd24gKi8KKwkJCXNhYmlfc2V0X2NvbW1hbmQoU0VUX1BFUkZPUk1BTkNFX0xFVkVMLCAweDAwKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihzaWxlbnQsIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBnZXRfc2lsZW50X3N0YXRlLCBzZXRfc2lsZW50X3N0YXRlKTsKKworCitzdGF0aWMgaW50IF9faW5pdCBkbWlfY2hlY2tfY2IoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkKQoreworCXByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUgIjogZm91bmQgbGFwdG9wIG1vZGVsICclcydcbiIsCisJCWlkLT5pZGVudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIHNhbXN1bmdfZG1pX3RhYmxlW10gPSB7CisJeworCQkuaWRlbnQgPSAiTjEyOCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU0FNU1VORyBFTEVDVFJPTklDUyBDTy4sIExURC4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTjEyOCIpLAorCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiTjEyOCIpLAorCQl9LAorCQkuY2FsbGJhY2sgPSBkbWlfY2hlY2tfY2IsCisJfSwKKwl7CisJCS5pZGVudCA9ICJOMTMwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJTQU1TVU5HIEVMRUNUUk9OSUNTIENPLiwgTFRELiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJOMTMwIiksCisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJOMTMwIiksCisJCX0sCisJCS5jYWxsYmFjayA9IGRtaV9jaGVja19jYiwKKwl9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGRtaSwgc2Ftc3VuZ19kbWlfdGFibGUpOworCitzdGF0aWMgaW50IF9faW5pdCBzYW1zdW5nX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc2FiaV9yZXR2YWwgc3JldHZhbDsKKwljb25zdCBjaGFyICp0ZXN0U3RyID0gIlNFQ0xJTlVYIjsKKwl2b2lkIF9faW9tZW0gKm1lbWNoZWNrOworCXVuc2lnbmVkIGludCBpZmFjZVA7CisJaW50IHBTdHI7CisJaW50IGxvY2E7CisJaW50IHJldHZhbDsKKworCW11dGV4X2luaXQoJnNhYmlfbXV0ZXgpOworCisJaWYgKCFmb3JjZSAmJiAhZG1pX2NoZWNrX3N5c3RlbShzYW1zdW5nX2RtaV90YWJsZSkpCisJCXJldHVybiAtRU5PREVWOworCisJZjAwMDBfc2VnbWVudCA9IGlvcmVtYXAoMHhmMDAwMCwgMHhmZmZmKTsKKwlpZiAoIWYwMDAwX3NlZ21lbnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBtYXAgdGhlIHNlZ21lbnQgYXQgMHhmMDAwMFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFRyeSB0byBmaW5kIHRoZSBzaWduYXR1cmUgIlNFQ0xJTlVYIiBpbiBtZW1vcnkgdG8gZmluZCB0aGUgaGVhZGVyICovCisJcFN0ciA9IDA7CisJbWVtY2hlY2sgPSBmMDAwMF9zZWdtZW50OworCWZvciAobG9jYSA9IDA7IGxvY2EgPCAweGZmZmY7IGxvY2ErKykgeworCQljaGFyIHRlbXAgPSByZWFkYihtZW1jaGVjayArIGxvY2EpOworCisJCWlmICh0ZW1wID09IHRlc3RTdHJbcFN0cl0pIHsKKwkJCWlmIChwU3RyID09IHN0cmxlbih0ZXN0U3RyKS0xKQorCQkJCWJyZWFrOworCQkJKytwU3RyOworCQl9IGVsc2UgeworCQkJcFN0ciA9IDA7CisJCX0KKwl9CisJaWYgKGxvY2EgPT0gMHhmZmZmKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVGhpcyBjb21wdXRlciBkb2VzIG5vdCBzdXBwb3J0IFNBQklcbiIpOworCQlnb3RvIGVycm9yX25vX3NpZ25hdHVyZTsKKwkJfQorCisJLyogcG9pbnQgdG8gdGhlIFNNSSBwb3J0IE51bWJlciAqLworCWxvY2EgKz0gMTsKKwlzYWJpID0gKG1lbWNoZWNrICsgbG9jYSk7CisKKwlpZiAoZGVidWcpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlRoaXMgY29tcHV0ZXIgc3VwcG9ydHMgU0FCST09JXhcbiIsCisJCQlsb2NhICsgMHhmMDAwMCAtIDYpOworCQlwcmludGsoS0VSTl9ERUJVRyAiU0FCSSBoZWFkZXI6XG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiBTTUkgUG9ydCBOdW1iZXIgPSAweCUwNHhcbiIsCisJCQlyZWFkdyhzYWJpICsgU0FCSV9IRUFERVJfUE9SVCkpOworCQlwcmludGsoS0VSTl9ERUJVRyAiIFNNSSBJbnRlcmZhY2UgRnVuY3Rpb24gPSAweCUwMnhcbiIsCisJCQlyZWFkYihzYWJpICsgU0FCSV9IRUFERVJfSUZBQ0VGVU5DKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIgU01JIGVuYWJsZSBtZW1vcnkgYnVmZmVyID0gMHglMDJ4XG4iLAorCQkJcmVhZGIoc2FiaSArIFNBQklfSEVBREVSX0VOX01FTSkpOworCQlwcmludGsoS0VSTl9ERUJVRyAiIFNNSSByZXN0b3JlIG1lbW9yeSBidWZmZXIgPSAweCUwMnhcbiIsCisJCQlyZWFkYihzYWJpICsgU0FCSV9IRUFERVJfUkVfTUVNKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIgU0FCSSBkYXRhIG9mZnNldCA9IDB4JTA0eFxuIiwKKwkJCXJlYWR3KHNhYmkgKyBTQUJJX0hFQURFUl9EQVRBX09GRlNFVCkpOworCQlwcmludGsoS0VSTl9ERUJVRyAiIFNBQkkgZGF0YSBzZWdtZW50ID0gMHglMDR4XG4iLAorCQkJcmVhZHcoc2FiaSArIFNBQklfSEVBREVSX0RBVEFfU0VHTUVOVCkpOworCX0KKworCS8qIEdldCBhIHBvaW50ZXIgdG8gdGhlIFNBQkkgSW50ZXJmYWNlICovCisJaWZhY2VQID0gKHJlYWR3KHNhYmkgKyBTQUJJX0hFQURFUl9EQVRBX1NFR01FTlQpICYgMHgwZmZmZikgPDwgNDsKKwlpZmFjZVAgKz0gcmVhZHcoc2FiaSArIFNBQklfSEVBREVSX0RBVEFfT0ZGU0VUKSAmIDB4MGZmZmY7CisJc2FiaV9pZmFjZSA9IGlvcmVtYXAoaWZhY2VQLCAxNik7CisJaWYgKCFzYWJpX2lmYWNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgcmVtYXAgJXhcbiIsIGlmYWNlUCk7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKGRlYnVnKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZmFjZVAgPSAweCUwOHhcbiIsIGlmYWNlUCk7CisJCXByaW50ayhLRVJOX0RFQlVHICJzYWJpX2lmYWNlID0gJXBcbiIsIHNhYmlfaWZhY2UpOworCisJCXRlc3RfYmFja2xpZ2h0KCk7CisJCXRlc3Rfd2lyZWxlc3MoKTsKKworCQlyZXR2YWwgPSBzYWJpX2dldF9jb21tYW5kKEdFVF9CUklHSFRORVNTLCAmc3JldHZhbCk7CisJCXByaW50ayhLRVJOX0RFQlVHICJicmlnaHRuZXNzID0gMHglMDJ4XG4iLCBzcmV0dmFsLnJldHZhbFswXSk7CisJfQorCisJLyogVHVybiBvbiAiTGludXgiIG1vZGUgaW4gdGhlIEJJT1MgKi8KKwlyZXR2YWwgPSBzYWJpX3NldF9jb21tYW5kKFNFVF9MSU5VWCwgMHg4MSk7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsoS0VSTl9FUlIgS0JVSUxEX01PRE5BTUUgIjogTGludXggbW9kZSB3YXMgbm90IHNldCFcbiIpOworCQlnb3RvIGVycm9yX25vX3BsYXRmb3JtOworCX0KKworCS8qIGtub2NrIHVwIGEgcGxhdGZvcm0gZGV2aWNlIHRvIGhhbmcgc3R1ZmYgb2ZmIG9mICovCisJc2RldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInNhbXN1bmciLCAtMSwgTlVMTCwgMCk7CisJaWYgKElTX0VSUihzZGV2KSkKKwkJZ290byBlcnJvcl9ub19wbGF0Zm9ybTsKKworCS8qIGNyZWF0ZSBhIGJhY2tsaWdodCBkZXZpY2UgdG8gdGFsayB0byB0aGlzIG9uZSAqLworCWJhY2tsaWdodF9kZXZpY2UgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKCJzYW1zdW5nIiwgJnNkZXYtPmRldiwKKwkJCQkJCSAgICAgTlVMTCwgJmJhY2tsaWdodF9vcHMpOworCWlmIChJU19FUlIoYmFja2xpZ2h0X2RldmljZSkpCisJCWdvdG8gZXJyb3Jfbm9fYmFja2xpZ2h0OworCisJYmFja2xpZ2h0X2RldmljZS0+cHJvcHMubWF4X2JyaWdodG5lc3MgPSBNQVhfQlJJR0hUOworCWJhY2tsaWdodF9kZXZpY2UtPnByb3BzLmJyaWdodG5lc3MgPSByZWFkX2JyaWdodG5lc3MoKTsKKwliYWNrbGlnaHRfZGV2aWNlLT5wcm9wcy5wb3dlciA9IEZCX0JMQU5LX1VOQkxBTks7CisJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoYmFja2xpZ2h0X2RldmljZSk7CisKKwlyZXR2YWwgPSBpbml0X3dpcmVsZXNzKHNkZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3Jfbm9fcmZrOworCisJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZzZGV2LT5kZXYsICZkZXZfYXR0cl9zaWxlbnQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3JfZmlsZV9jcmVhdGU7CisKK2V4aXQ6CisJcmV0dXJuIDA7CisKK2Vycm9yX2ZpbGVfY3JlYXRlOgorCWRlc3Ryb3lfd2lyZWxlc3MoKTsKKworZXJyb3Jfbm9fcmZrOgorCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihiYWNrbGlnaHRfZGV2aWNlKTsKKworZXJyb3Jfbm9fYmFja2xpZ2h0OgorCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNkZXYpOworCitlcnJvcl9ub19wbGF0Zm9ybToKKwlpb3VubWFwKHNhYmlfaWZhY2UpOworCitlcnJvcl9ub19zaWduYXR1cmU6CisJaW91bm1hcChmMDAwMF9zZWdtZW50KTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNhbXN1bmdfZXhpdCh2b2lkKQoreworCS8qIFR1cm4gb2ZmICJMaW51eCIgbW9kZSBpbiB0aGUgQklPUyAqLworCXNhYmlfc2V0X2NvbW1hbmQoU0VUX0xJTlVYLCAweDgwKTsKKworCWRldmljZV9yZW1vdmVfZmlsZSgmc2Rldi0+ZGV2LCAmZGV2X2F0dHJfc2lsZW50KTsKKwliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmFja2xpZ2h0X2RldmljZSk7CisJZGVzdHJveV93aXJlbGVzcygpOworCWlvdW5tYXAoc2FiaV9pZmFjZSk7CisJaW91bm1hcChmMDAwMF9zZWdtZW50KTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihzZGV2KTsKK30KKworbW9kdWxlX2luaXQoc2Ftc3VuZ19pbml0KTsKK21vZHVsZV9leGl0KHNhbXN1bmdfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgQmFja2xpZ2h0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZHJpdmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXIuYwppbmRleCBmODkwYTE2Li5lN2JjOWVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXIuYwpAQCAtMjczLDcgKzI3Myw4IEBACiAJCQkJCQl2b2lkICp2aXJ0X2FkZHJlc3MpCiB7CiAJZG1hX2FkZHJfdCBwYSA9IHNlcC0+c2hhcmVkX2J1cyArICh2aXJ0X2FkZHJlc3MgLSBzZXAtPnNoYXJlZF9hZGRyKTsKLQllZGJnKCJzZXA6IHZpcnQgdG8gYnVzIGIgJTA4bGx4IHYgJXBcbiIsIHBhLCB2aXJ0X2FkZHJlc3MpOworCWVkYmcoInNlcDogdmlydCB0byBidXMgYiAlMDhsbHggdiAlcFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylwYSwgdmlydF9hZGRyZXNzKTsKIAlyZXR1cm4gcGE7CiB9CiAKQEAgLTE3ODgsNiArMTc4OSw3IEBACiAJZmlyc3RfdGFibGVfZGF0YS5waHlzaWNhbF9hZGRyZXNzID0gMHhmZmZmZmZmZjsKIAogCS8qIGZpbmQgdGhlIGZyZWUgc3RydWN0dXJlIGZvciBmbG93IGRhdGEgKi8KKwllcnJvciA9IC1FSU5WQUw7CiAJZmxvd19jb250ZXh0X3B0ciA9IHNlcF9maW5kX2Zsb3dfY29udGV4dChzZXAsIFNFUF9GUkVFX0ZMT1dfSUQpOwogCWlmIChmbG93X2NvbnRleHRfcHRyID09IE5VTEwpCiAJCWdvdG8gZW5kX2Z1bmN0aW9uOwpAQCAtMjQ0Nyw3ICsyNDQ5LDcgQEAKICNlbmRpZgogCiAvKgotICBGdW5jdGlvbiB0aGF0IGlzIGFjdGl2YWVkIG9uIHRoZSBzdWNjZXNmdWwgcHJvYmUgb2YgdGhlIFNFUCBkZXZpY2UKKyAgRnVuY3Rpb24gdGhhdCBpcyBhY3RpdmF0ZWQgb24gdGhlIHN1Y2Nlc3NmdWwgcHJvYmUgb2YgdGhlIFNFUCBkZXZpY2UKICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzZXBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2VycXRfdXNiMi9zZXJxdF91c2IyLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2VycXRfdXNiMi9zZXJxdF91c2IyLmMKaW5kZXggNTJhZjQ0Yy4uMDYwZTlkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NlcnF0X3VzYjIvc2VycXRfdXNiMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zZXJxdF91c2IyL3NlcnF0X3VzYjIuYwpAQCAtOTI5LDcgKzkyOSw3IEBACiAJZGJnKF9fRklMRV9fICJxdF9zZXR1YXJ0IGNvbXBsZXRlZC5cbiIpOwogCiAJLyoKLQkgKiBQdXQgdGhpcyBoZXJlIHRvIG1ha2UgaXQgcmVzcG9uc2l2ZSB0byBzdHR5IGFuZCBkZWZhdWxzIHNldCBieQorCSAqIFB1dCB0aGlzIGhlcmUgdG8gbWFrZSBpdCByZXNwb25zaXZlIHRvIHN0dHkgYW5kIGRlZmF1bHRzIHNldCBieQogCSAqIHRoZSB0dHkgbGF5ZXIKIAkgKi8KIAkvKiBGSVhNRTogaXMgdGhpcyBuZWVkZWQ/ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMKaW5kZXggZTY3YTEzMC4uNWIxOTFhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYwpAQCAtMzU0LDcgKzM1NCw2IEBACiAJLm5kb19nZXRfc3RhdHMJCT0gc2xpY19nZXRfc3RhdHMsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QJPSBzbGljX21jYXN0X3NldF9saXN0LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAotCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAogCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX2hjZC5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMKaW5kZXggNmU5MWZjMi4uZWY0MzcxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMKQEAgLTU2LDcgKzU2LDcgQEAKIHN0YXRpYyBpbnQgdmhjaV9nZXRfZnJhbWVfbnVtYmVyKHN0cnVjdCB1c2JfaGNkICpoY2QpOwogCiBzdGF0aWMgY29uc3QgY2hhciBkcml2ZXJfbmFtZVtdID0gInZoY2lfaGNkIjsKLXN0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9kZXNjW10gPSAiVVNCL0lQIFZpcnR1YWwgSG9zdCBDb250b3JvbGxlciI7CitzdGF0aWMgY29uc3QgY2hhciBkcml2ZXJfZGVzY1tdID0gIlVTQi9JUCBWaXJ0dWFsIEhvc3QgQ29udHJvbGxlciI7CiAKIHN0cnVjdCB2aGNpX2hjZCAqdGhlX2NvbnRyb2xsZXI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvVE9ETwppbmRleCBhZGM1ZmNhLi4yMjAxZmY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9UT0RPCkBAIC0xMSw3ICsxMSw3IEBACiBzdWl0YWJpbGl0eSBvZiBhIERNQSBjb250cm9sbGVyIGJhc2VkIG9uIGl0J3Mgc3VwcG9ydGVkIG1vZGVzIG9mIG9wZXJhdGlvbiwgYXMKIG9wcG9zZWQgdG8gdGhlIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtcyBmb3IgbWFzdGVyIGFuZCBzbGF2ZSB3aW5kb3dzOgogCi0Jc3RydWN0IHZtZV9yZXNvdXJjZSAqdm1lX3JlcXVlc3RfZG1hKHN0cnVjdCBkZXZpY2UgKmRldik7CisJc3RydWN0IHZtZV9yZXNvdXJjZSAqdm1lX2RtYV9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKmRldik7CiAKIEFzIG9wcG9zZWQgdG86CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYwppbmRleCBlMTM5ZWFlLi4xY2YzZTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5jCkBAIC0xNSw3ICsxNSw2IEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtNTQsOSArNTMsNiBAQAogCQkJICogT25seSBvbmUgVk1FIGludGVycnVwdCBjYW4gYmUKIAkJCSAqIGdlbmVyYXRlZCBhdCBhIHRpbWUsIHByb3ZpZGUgbG9ja2luZwogCQkJICovCi1zdHJ1Y3QgbXV0ZXggdm1lX2lycTsgICAvKiBMb2NraW5nIGZvciBWTUUgaXJxIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24gKi8KLQotCiAKIHN0YXRpYyBjaGFyIGRyaXZlcl9uYW1lW10gPSAidm1lX2NhOTFjeDQyIjsKIApAQCAtMTU4LDIzICsxNTQsMTMgQEAKIHN0YXRpYyB1MzIgY2E5MWN4NDJfVklSUV9pcnFoYW5kbGVyKGludCBzdGF0KQogewogCWludCB2ZWMsIGksIHNlcnZpY2VkID0gMDsKLQl2b2lkICgqY2FsbCkoaW50LCBpbnQsIHZvaWQgKik7Ci0Jdm9pZCAqcHJpdl9kYXRhOwogCiAJZm9yIChpID0gNzsgaSA+IDA7IGktLSkgewogCQlpZiAoc3RhdCAmICgxIDw8IGkpKSB7CiAJCQl2ZWMgPSBpb3JlYWQzMihjYTkxY3g0Ml9icmlkZ2UtPmJhc2UgKwogCQkJCUNBOTFDWDQyX1ZfU1RBVElEW2ldKSAmIDB4ZmY7CiAKLQkJCWNhbGwgPSBjYTkxY3g0Ml9icmlkZ2UtPmlycVtpIC0gMV0uY2FsbGJhY2tbdmVjXS5mdW5jOwotCQkJcHJpdl9kYXRhID0KLQkJCWNhOTFjeDQyX2JyaWRnZS0+aXJxW2kgLSAxXS5jYWxsYmFja1t2ZWNdLnByaXZfZGF0YTsKLQotCQkJaWYgKGNhbGwgIT0gTlVMTCkKLQkJCQljYWxsKGksIHZlYywgcHJpdl9kYXRhKTsKLQkJCWVsc2UKLQkJCQlwcmludGsoIlNwdXJpbG91cyBWTUUgaW50ZXJydXB0LCBsZXZlbDoleCwgIgotCQkJCQkidmVjdG9yOiV4XG4iLCBpLCB2ZWMpOworCQkJdm1lX2lycV9oYW5kbGVyKGNhOTFjeDQyX2JyaWRnZSwgaSwgdmVjKTsKIAogCQkJc2VydmljZWQgfD0gKDEgPDwgaSk7CiAJCX0KQEAgLTIzNSw2ICsyMjEsOCBAQAogCS8qIEluaXRpYWxpc2UgbGlzdCBmb3IgVk1FIGJ1cyBlcnJvcnMgKi8KIAlJTklUX0xJU1RfSEVBRCgmKGJyaWRnZS0+dm1lX2Vycm9ycykpOwogCisJbXV0ZXhfaW5pdCgmKGJyaWRnZS0+aXJxX210eCkpOworCiAJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGZyb20gUENJIHRvIFZNRSAqLwogCWlvd3JpdGUzMigwLCBicmlkZ2UtPmJhc2UgKyBWSU5UX0VOKTsKIApAQCAtMjgyLDY2ICsyNzAsMzEgQEAKIC8qCiAgKiBTZXQgdXAgYW4gVk1FIGludGVycnVwdAogICovCi1pbnQgY2E5MWN4NDJfcmVxdWVzdF9pcnEoaW50IGxldmVsLCBpbnQgc3RhdGlkLAotCXZvaWQgKCpjYWxsYmFjaykoaW50IGxldmVsLCBpbnQgdmVjdG9yLCB2b2lkICpwcml2X2RhdGEpLAotCXZvaWQgKnByaXZfZGF0YSkKK3ZvaWQgY2E5MWN4NDJfaXJxX3NldChpbnQgbGV2ZWwsIGludCBzdGF0ZSwgaW50IHN5bmMpCisKIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAl1MzIgdG1wOwogCi0JbXV0ZXhfbG9jaygmKHZtZV9pcnEpKTsKLQotCWlmIChjYTkxY3g0Ml9icmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNhbGxiYWNrW3N0YXRpZF0uZnVuYykgewotCQltdXRleF91bmxvY2soJih2bWVfaXJxKSk7Ci0JCXByaW50aygiVk1FIEludGVycnVwdCBhbHJlYWR5IHRha2VuXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQotCWNhOTFjeDQyX2JyaWRnZS0+aXJxW2xldmVsIC0gMV0uY291bnQrKzsKLQljYTkxY3g0Ml9icmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNhbGxiYWNrW3N0YXRpZF0ucHJpdl9kYXRhID0gcHJpdl9kYXRhOwotCWNhOTFjeDQyX2JyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5mdW5jID0gY2FsbGJhY2s7Ci0KIAkvKiBFbmFibGUgSVJRIGxldmVsICovCiAJdG1wID0gaW9yZWFkMzIoY2E5MWN4NDJfYnJpZGdlLT5iYXNlICsgTElOVF9FTik7Ci0JdG1wIHw9IENBOTFDWDQyX0xJTlRfVklSUVtsZXZlbF07CisKKwlpZiAoc3RhdGUgPT0gMCkKKwkJdG1wICY9IH5DQTkxQ1g0Ml9MSU5UX1ZJUlFbbGV2ZWxdOworCWVsc2UKKwkJdG1wIHw9IENBOTFDWDQyX0xJTlRfVklSUVtsZXZlbF07CisKIAlpb3dyaXRlMzIodG1wLCBjYTkxY3g0Ml9icmlkZ2UtPmJhc2UgKyBMSU5UX0VOKTsKIAotCW11dGV4X3VubG9jaygmKHZtZV9pcnEpKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogRnJlZSBWTUUgaW50ZXJydXB0Ci0gKi8KLXZvaWQgY2E5MWN4NDJfZnJlZV9pcnEoaW50IGxldmVsLCBpbnQgc3RhdGlkKQotewotCXUzMiB0bXA7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0KLQltdXRleF9sb2NrKCYodm1lX2lycSkpOwotCi0JY2E5MWN4NDJfYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jb3VudC0tOwotCi0JLyogRGlzYWJsZSBJUlEgbGV2ZWwgaWYgbm8gbW9yZSBpbnRlcnJ1cHRzIGF0dGFjaGVkIGF0IHRoaXMgbGV2ZWwqLwotCWlmIChjYTkxY3g0Ml9icmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNvdW50ID09IDApIHsKLQkJdG1wID0gaW9yZWFkMzIoY2E5MWN4NDJfYnJpZGdlLT5iYXNlICsgTElOVF9FTik7Ci0JCXRtcCAmPSB+Q0E5MUNYNDJfTElOVF9WSVJRW2xldmVsXTsKLQkJaW93cml0ZTMyKHRtcCwgY2E5MWN4NDJfYnJpZGdlLT5iYXNlICsgTElOVF9FTik7Ci0KKwlpZiAoKHN0YXRlID09IDApICYmIChzeW5jICE9IDApKSB7CiAJCXBkZXYgPSBjb250YWluZXJfb2YoY2E5MWN4NDJfYnJpZGdlLT5wYXJlbnQsIHN0cnVjdCBwY2lfZGV2LAogCQkJZGV2KTsKIAogCQlzeW5jaHJvbml6ZV9pcnEocGRldi0+aXJxKTsKIAl9Ci0KLQljYTkxY3g0Ml9icmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNhbGxiYWNrW3N0YXRpZF0uZnVuYyA9IE5VTEw7Ci0JY2E5MWN4NDJfYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLnByaXZfZGF0YSA9IE5VTEw7Ci0KLQltdXRleF91bmxvY2soJih2bWVfaXJxKSk7CiB9CiAKLWludCBjYTkxY3g0Ml9nZW5lcmF0ZV9pcnEoaW50IGxldmVsLCBpbnQgc3RhdGlkKQoraW50IGNhOTFjeDQyX2lycV9nZW5lcmF0ZShpbnQgbGV2ZWwsIGludCBzdGF0aWQpCiB7CiAJdTMyIHRtcDsKIApAQCAtMTA2NSw3ICsxMDE4LDYgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkbWFfcXVldWUpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlhY2tfcXVldWUpOwogCW11dGV4X2luaXQoJih2bWVfaW50KSk7Ci0JbXV0ZXhfaW5pdCgmKHZtZV9pcnEpKTsKIAltdXRleF9pbml0KCYodm1lX3JtdykpOwogCiAJY2E5MWN4NDJfYnJpZGdlLT5wYXJlbnQgPSAmKHBkZXYtPmRldik7CkBAIC0xMTgyLDkgKzExMzQsOCBAQAogCWNhOTFjeDQyX2JyaWRnZS0+ZG1hX2xpc3RfZXhlYyA9IGNhOTFjeDQyX2RtYV9saXN0X2V4ZWM7CiAJY2E5MWN4NDJfYnJpZGdlLT5kbWFfbGlzdF9lbXB0eSA9IGNhOTFjeDQyX2RtYV9saXN0X2VtcHR5OwogI2VuZGlmCi0JY2E5MWN4NDJfYnJpZGdlLT5yZXF1ZXN0X2lycSA9IGNhOTFjeDQyX3JlcXVlc3RfaXJxOwotCWNhOTFjeDQyX2JyaWRnZS0+ZnJlZV9pcnEgPSBjYTkxY3g0Ml9mcmVlX2lycTsKLQljYTkxY3g0Ml9icmlkZ2UtPmdlbmVyYXRlX2lycSA9IGNhOTFjeDQyX2dlbmVyYXRlX2lycTsKKwljYTkxY3g0Ml9icmlkZ2UtPmlycV9zZXQgPSBjYTkxY3g0Ml9pcnFfc2V0OworCWNhOTFjeDQyX2JyaWRnZS0+aXJxX2dlbmVyYXRlID0gY2E5MWN4NDJfaXJxX2dlbmVyYXRlOwogI2lmIDAKIAljYTkxY3g0Ml9icmlkZ2UtPmxtX3NldCA9IGNhOTFjeDQyX2xtX3NldDsKIAljYTkxY3g0Ml9icmlkZ2UtPmxtX2dldCA9IGNhOTFjeDQyX2xtX2dldDsKQEAgLTEyMjAsNyArMTE3MSw5IEBACiAJdm1lX3VucmVnaXN0ZXJfYnJpZGdlKGNhOTFjeDQyX2JyaWRnZSk7CiBlcnJfcmVnOgogCWNhOTFjeDQyX2NyY3NyX2V4aXQocGRldik7CisjaWYgMAogZXJyX2NyY3NyOgorI2VuZGlmCiBlcnJfbG06CiAJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCiAJbGlzdF9mb3JfZWFjaChwb3MsICYoY2E5MWN4NDJfYnJpZGdlLT5sbV9yZXNvdXJjZXMpKSB7CkBAIC0xMjc1LDcgKzEyMjgsNiBAQAogCXN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UgKnNsYXZlX2ltYWdlOwogCXN0cnVjdCB2bWVfZG1hX3Jlc291cmNlICpkbWFfY3RybHI7CiAJc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG07Ci0JaW50IGk7CiAKIAkvKiBUdXJuIG9mZiBJbnRzICovCiAJaW93cml0ZTMyKDAsIGNhOTFjeDQyX2JyaWRnZS0+YmFzZSArIExJTlRfRU4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMKaW5kZXggMDBmZTA4MC4uODlhN2RjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5jCkBAIC0xMyw3ICsxMyw2IEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpAQCAtNzgsOCArNzcsNiBAQAogCQkJCSAqIE9ubHkgb25lIFZNRSBpbnRlcnJ1cHQgY2FuIGJlCiAJCQkJICogZ2VuZXJhdGVkIGF0IGEgdGltZSwgcHJvdmlkZSBsb2NraW5nCiAJCQkJICovCi1zdHJ1Y3QgbXV0ZXggdm1lX2lycTsJLyogTG9ja2luZyBmb3IgVk1FIGlycSBjYWxsYmFjayBjb25maWd1cmF0aW9uICovCi0KIAogc3RhdGljIGNoYXIgZHJpdmVyX25hbWVbXSA9ICJ2bWVfdHNpMTQ4IjsKIApAQCAtMjQwLDcgKzIzNyw2IEBACiAgKi8KIHN0YXRpYyB1MzIgdHNpMTQ4X0lBQ0tfaXJxaGFuZGxlcih2b2lkKQogewotCXByaW50aygidHNpMTQ4X0lBQ0tfaXJxaGFuZGxlclxuIik7CiAJd2FrZV91cCgmaWFja19xdWV1ZSk7CiAKIAlyZXR1cm4gVFNJMTQ4X0xDU1JfSU5UQ19JQUNLQzsKQEAgLTI1Miw4ICsyNDgsNiBAQAogc3RhdGljIHUzMiB0c2kxNDhfVklSUV9pcnFoYW5kbGVyKHUzMiBzdGF0KQogewogCWludCB2ZWMsIGksIHNlcnZpY2VkID0gMDsKLQl2b2lkICgqY2FsbCkoaW50LCBpbnQsIHZvaWQgKik7Ci0Jdm9pZCAqcHJpdl9kYXRhOwogCiAJZm9yIChpID0gNzsgaSA+IDA7IGktLSkgewogCQlpZiAoc3RhdCAmICgxIDw8IGkpKSB7CkBAIC0yNjYsMTUgKzI2MCw3IEBACiAJCQl2ZWMgPSBpb3JlYWQ4KHRzaTE0OF9icmlkZ2UtPmJhc2UgKwogCQkJCVRTSTE0OF9MQ1NSX1ZJQUNLW2ldICsgMyk7CiAKLQkJCWNhbGwgPSB0c2kxNDhfYnJpZGdlLT5pcnFbaSAtIDFdLmNhbGxiYWNrW3ZlY10uZnVuYzsKLQkJCXByaXZfZGF0YSA9Ci0JCQkJdHNpMTQ4X2JyaWRnZS0+aXJxW2ktMV0uY2FsbGJhY2tbdmVjXS5wcml2X2RhdGE7Ci0KLQkJCWlmIChjYWxsICE9IE5VTEwpCi0JCQkJY2FsbChpLCB2ZWMsIHByaXZfZGF0YSk7Ci0JCQllbHNlCi0JCQkJcHJpbnRrKCJTcHVyaWxvdXMgVk1FIGludGVycnVwdCwgbGV2ZWw6JXgsICIKLQkJCQkJInZlY3RvcjoleFxuIiwgaSwgdmVjKTsKKwkJCXZtZV9pcnFfaGFuZGxlcih0c2kxNDhfYnJpZGdlLCBpLCB2ZWMpOwogCiAJCQlzZXJ2aWNlZCB8PSAoMSA8PCBpKTsKIAkJfQpAQCAtMzU0LDYgKzM0MCw4IEBACiAJLyogSW5pdGlhbGlzZSBsaXN0IGZvciBWTUUgYnVzIGVycm9ycyAqLwogCUlOSVRfTElTVF9IRUFEKCYoYnJpZGdlLT52bWVfZXJyb3JzKSk7CiAKKwltdXRleF9pbml0KCYoYnJpZGdlLT5pcnFfbXR4KSk7CisKIAlyZXN1bHQgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsCiAJCQkgICAgIHRzaTE0OF9pcnFoYW5kbGVyLAogCQkJICAgICBJUlFGX1NIQVJFRCwKQEAgLTQzMyw1NSArNDIxLDE1IEBACiB9CiAKIC8qCi0gKiBTZXQgdXAgYW4gVk1FIGludGVycnVwdAorICogQ29uZmlndXJlIFZNRSBpbnRlcnJ1cHQKICAqLwotaW50IHRzaTE0OF9yZXF1ZXN0X2lycShpbnQgbGV2ZWwsIGludCBzdGF0aWQsCi0Jdm9pZCAoKmNhbGxiYWNrKShpbnQgbGV2ZWwsIGludCB2ZWN0b3IsIHZvaWQgKnByaXZfZGF0YSksCi0gICAgICAgIHZvaWQgKnByaXZfZGF0YSkKK3ZvaWQgdHNpMTQ4X2lycV9zZXQoaW50IGxldmVsLCBpbnQgc3RhdGUsIGludCBzeW5jKQogewotCXUzMiB0bXA7Ci0KLQltdXRleF9sb2NrKCYodm1lX2lycSkpOwotCi0JaWYodHNpMTQ4X2JyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5mdW5jKSB7Ci0JCW11dGV4X3VubG9jaygmKHZtZV9pcnEpKTsKLQkJcHJpbnRrKCJWTUUgSW50ZXJydXB0IGFscmVhZHkgdGFrZW5cbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCi0JdHNpMTQ4X2JyaWRnZS0+aXJxW2xldmVsIC0gMV0uY291bnQrKzsKLQl0c2kxNDhfYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLnByaXZfZGF0YSA9IHByaXZfZGF0YTsKLQl0c2kxNDhfYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLmZ1bmMgPSBjYWxsYmFjazsKLQotCS8qIEVuYWJsZSBJUlEgbGV2ZWwgKi8KLQl0bXAgPSBpb3JlYWQzMmJlKHRzaTE0OF9icmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRFTyk7Ci0JdG1wIHw9IFRTSTE0OF9MQ1NSX0lOVEVPX0lSUUVPW2xldmVsIC0gMV07Ci0JaW93cml0ZTMyYmUodG1wLCB0c2kxNDhfYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU8pOwotCi0JdG1wID0gaW9yZWFkMzJiZSh0c2kxNDhfYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU4pOwotCXRtcCB8PSBUU0kxNDhfTENTUl9JTlRFTl9JUlFFTltsZXZlbCAtIDFdOwotCWlvd3JpdGUzMmJlKHRtcCwgdHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVOKTsKLQotCW11dGV4X3VubG9jaygmKHZtZV9pcnEpKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogRnJlZSBWTUUgaW50ZXJydXB0Ci0gKi8KLXZvaWQgdHNpMTQ4X2ZyZWVfaXJxKGludCBsZXZlbCwgaW50IHN0YXRpZCkKLXsKLQl1MzIgdG1wOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXUzMiB0bXA7CiAKLQltdXRleF9sb2NrKCYodm1lX2lycSkpOwotCi0JdHNpMTQ4X2JyaWRnZS0+aXJxW2xldmVsIC0gMV0uY291bnQtLTsKLQotCS8qIERpc2FibGUgSVJRIGxldmVsIGlmIG5vIG1vcmUgaW50ZXJydXB0cyBhdHRhY2hlZCBhdCB0aGlzIGxldmVsKi8KLQlpZiAodHNpMTQ4X2JyaWRnZS0+aXJxW2xldmVsIC0gMV0uY291bnQgPT0gMCkgeworCS8qIFdlIG5lZWQgdG8gZG8gdGhlIG9yZGVyaW5nIGRpZmZlcmVudGx5IGZvciBlbmFibGluZyBhbmQgZGlzYWJsaW5nICovCisJaWYgKHN0YXRlID09IDApIHsKIAkJdG1wID0gaW9yZWFkMzJiZSh0c2kxNDhfYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU4pOwogCQl0bXAgJj0gflRTSTE0OF9MQ1NSX0lOVEVOX0lSUUVOW2xldmVsIC0gMV07CiAJCWlvd3JpdGUzMmJlKHRtcCwgdHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVOKTsKQEAgLTQ5MCwyMiArNDM4LDI4IEBACiAJCXRtcCAmPSB+VFNJMTQ4X0xDU1JfSU5URU9fSVJRRU9bbGV2ZWwgLSAxXTsKIAkJaW93cml0ZTMyYmUodG1wLCB0c2kxNDhfYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU8pOwogCi0JCXBkZXYgPSBjb250YWluZXJfb2YodHNpMTQ4X2JyaWRnZS0+cGFyZW50LCBzdHJ1Y3QgcGNpX2RldiwgZGV2KTsKKwkJaWYgKHN5bmMgIT0gMCkgeworCQkJcGRldiA9IGNvbnRhaW5lcl9vZih0c2kxNDhfYnJpZGdlLT5wYXJlbnQsCisJCQkJc3RydWN0IHBjaV9kZXYsIGRldik7CiAKLQkJc3luY2hyb25pemVfaXJxKHBkZXYtPmlycSk7CisJCQlzeW5jaHJvbml6ZV9pcnEocGRldi0+aXJxKTsKKwkJfQorCX0gZWxzZSB7CisJCXRtcCA9IGlvcmVhZDMyYmUodHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVPKTsKKwkJdG1wIHw9IFRTSTE0OF9MQ1NSX0lOVEVPX0lSUUVPW2xldmVsIC0gMV07CisJCWlvd3JpdGUzMmJlKHRtcCwgdHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVPKTsKKworCQl0bXAgPSBpb3JlYWQzMmJlKHRzaTE0OF9icmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRFTik7CisJCXRtcCB8PSBUU0kxNDhfTENTUl9JTlRFTl9JUlFFTltsZXZlbCAtIDFdOworCQlpb3dyaXRlMzJiZSh0bXAsIHRzaTE0OF9icmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRFTik7CiAJfQotCi0JdHNpMTQ4X2JyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5mdW5jID0gTlVMTDsKLQl0c2kxNDhfYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLnByaXZfZGF0YSA9IE5VTEw7Ci0KLQltdXRleF91bmxvY2soJih2bWVfaXJxKSk7CiB9CiAKIC8qCiAgKiBHZW5lcmF0ZSBhIFZNRSBidXMgaW50ZXJydXB0IGF0IHRoZSByZXF1ZXN0ZWQgbGV2ZWwgJiB2ZWN0b3IuIFdhaXQgZm9yCiAgKiBpbnRlcnJ1cHQgdG8gYmUgYWNrZWQuCiAgKi8KLWludCB0c2kxNDhfZ2VuZXJhdGVfaXJxKGludCBsZXZlbCwgaW50IHN0YXRpZCkKK2ludCB0c2kxNDhfaXJxX2dlbmVyYXRlKGludCBsZXZlbCwgaW50IHN0YXRpZCkKIHsKIAl1MzIgdG1wOwogCkBAIC04OTEsNyArODQ1LDcgQEAKIAkJaW1hZ2UtPnBjaV9yZXNvdXJjZS5zdGFydCk7CiAKIAkvKiBJZiB0aGUgZXhpc3Rpbmcgc2l6ZSBpcyBPSywgcmV0dXJuICovCi0JaWYgKGV4aXN0aW5nX3NpemUgPT0gKHNpemUgLSAxKSkKKwlpZiAoKHNpemUgIT0gMCkgJiYgKGV4aXN0aW5nX3NpemUgPT0gKHNpemUgLSAxKSkpCiAJCXJldHVybiAwOwogCiAJaWYgKGV4aXN0aW5nX3NpemUgIT0gMCkgewpAQCAtOTAzLDYgKzg1NywxMSBAQAogCQltZW1zZXQoJihpbWFnZS0+cGNpX3Jlc291cmNlKSwgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwogCX0KIAorCS8qIEV4aXQgaGVyZSBpZiBzaXplIGlzIHplcm8gKi8KKwlpZiAoc2l6ZSA9PSAwKSB7CisJCXJldHVybiAwOworCX0KKwogCWlmIChpbWFnZS0+cGNpX3Jlc291cmNlLm5hbWUgPT0gTlVMTCkgewogCQlpbWFnZS0+cGNpX3Jlc291cmNlLm5hbWUgPSBrbWFsbG9jKFZNRU5BTVNJWiszLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGltYWdlLT5wY2lfcmVzb3VyY2UubmFtZSA9PSBOVUxMKSB7CkBAIC05ODEsMTIgKzk0MCwxMyBAQAogCiAJLyogVmVyaWZ5IGlucHV0IGRhdGEgKi8KIAlpZiAodm1lX2Jhc2UgJiAweEZGRkYpIHsKLQkJcHJpbnRrKCJJbnZhbGlkIFZNRSBXaW5kb3cgYWxpZ25tZW50XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIFZNRSBXaW5kb3cgYWxpZ25tZW50XG4iKTsKIAkJcmV0dmFsID0gLUVJTlZBTDsKIAkJZ290byBlcnJfd2luZG93OwogCX0KLQlpZiAoc2l6ZSA8IDB4MTAwMDApIHsKLQkJcHJpbnRrKCJJbnZhbGlkIFZNRSBXaW5kb3cgc2l6ZVxuIik7CisKKwlpZiAoKHNpemUgPT0gMCkgJiYgKGVuYWJsZWQgIT0gMCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTaXplIG11c3QgYmUgbm9uLXplcm8gZm9yIGVuYWJsZWQgd2luZG93c1xuIik7CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX3dpbmRvdzsKIAl9CkBAIC05OTQsMjYgKzk1NCwzMSBAQAogCXNwaW5fbG9jaygmKGltYWdlLT5sb2NrKSk7CiAKIAkvKiBMZXQncyBhbGxvY2F0ZSB0aGUgcmVzb3VyY2UgaGVyZSByYXRoZXIgdGhhbiBmdXJ0aGVyIHVwIHRoZSBzdGFjayBhcwotCSAqIGl0IGF2b2lkcyBwdXNoaW5nIGxvYWRzIG9mIGJ1cyBkZXBlbmRhbnQgc3R1ZmYgdXAgdGhlIHN0YWNrCisJICogaXQgYXZvaWRzIHB1c2hpbmcgbG9hZHMgb2YgYnVzIGRlcGVuZGFudCBzdHVmZiB1cCB0aGUgc3RhY2suIElmIHNpemUKKwkgKiBpcyB6ZXJvLCBhbnkgZXhpc3RpbmcgcmVzb3VyY2Ugd2lsbCBiZSBmcmVlZC4KIAkgKi8KIAlyZXR2YWwgPSB0c2kxNDhfYWxsb2NfcmVzb3VyY2UoaW1hZ2UsIHNpemUpOwogCWlmIChyZXR2YWwpIHsKIAkJc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOwotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlc291cmNlICIKLQkJCSJuYW1lXG4iKTsKLQkJcmV0dmFsID0gLUVOT01FTTsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAiCisJCQkicmVzb3VyY2VcbiIpOwogCQlnb3RvIGVycl9yZXM7CiAJfQogCi0JcGNpX2Jhc2UgPSAodW5zaWduZWQgbG9uZyBsb25nKWltYWdlLT5wY2lfcmVzb3VyY2Uuc3RhcnQ7CisJaWYgKHNpemUgPT0gMCkgeworCQlwY2lfYmFzZSA9IDA7CisJCXBjaV9ib3VuZCA9IDA7CisJCXZtZV9vZmZzZXQgPSAwOworCX0gZWxzZSB7CisJCXBjaV9iYXNlID0gKHVuc2lnbmVkIGxvbmcgbG9uZylpbWFnZS0+cGNpX3Jlc291cmNlLnN0YXJ0OwogCi0KLQkvKgotCSAqIEJvdW5kIGFkZHJlc3MgaXMgYSB2YWxpZCBhZGRyZXNzIGZvciB0aGUgd2luZG93LCBhZGp1c3QKLQkgKiBhY2NvcmRpbmcgdG8gd2luZG93IGdyYW51bGFyaXR5LgotCSAqLwotCXBjaV9ib3VuZCA9IHBjaV9iYXNlICsgKHNpemUgLSAweDEwMDAwKTsKLQl2bWVfb2Zmc2V0ID0gdm1lX2Jhc2UgLSBwY2lfYmFzZTsKKwkJLyoKKwkJICogQm91bmQgYWRkcmVzcyBpcyBhIHZhbGlkIGFkZHJlc3MgZm9yIHRoZSB3aW5kb3csIGFkanVzdAorCQkgKiBhY2NvcmRpbmcgdG8gd2luZG93IGdyYW51bGFyaXR5LgorCQkgKi8KKwkJcGNpX2JvdW5kID0gcGNpX2Jhc2UgKyAoc2l6ZSAtIDB4MTAwMDApOworCQl2bWVfb2Zmc2V0ID0gdm1lX2Jhc2UgLSBwY2lfYmFzZTsKKwl9CiAKIAkvKiBDb252ZXJ0IDY0LWJpdCB2YXJpYWJsZXMgdG8gMnggMzItYml0IHZhcmlhYmxlcyAqLwogCXJlZ19zcGxpdChwY2lfYmFzZSwgJnBjaV9iYXNlX2hpZ2gsICZwY2lfYmFzZV9sb3cpOwpAQCAtMTAyMiwxOSArOTg3LDE5IEBACiAKIAlpZiAocGNpX2Jhc2VfbG93ICYgMHhGRkZGKSB7CiAJCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKLQkJcHJpbnRrKCJJbnZhbGlkIFBDSSBiYXNlIGFsaWdubWVudFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBQQ0kgYmFzZSBhbGlnbm1lbnRcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9ncmFuOwogCX0KIAlpZiAocGNpX2JvdW5kX2xvdyAmIDB4RkZGRikgewogCQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7Ci0JCXByaW50aygiSW52YWxpZCBQQ0kgYm91bmQgYWxpZ25tZW50XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIFBDSSBib3VuZCBhbGlnbm1lbnRcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9ncmFuOwogCX0KIAlpZiAodm1lX29mZnNldF9sb3cgJiAweEZGRkYpIHsKIAkJc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOwotCQlwcmludGsoIkludmFsaWQgVk1FIE9mZnNldCBhbGlnbm1lbnRcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgVk1FIE9mZnNldCBhbGlnbm1lbnRcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9ncmFuOwogCX0KQEAgLTEwOTQsNyArMTA1OSw4IEBACiAJCXRlbXBfY3RsIHw9IFRTSTE0OF9MQ1NSX09UQVRfVE1fMmVTU1Q7CiAJfQogCWlmIChjeWNsZSAmIFZNRV8yZVNTVEIpIHsKLQkJcHJpbnRrKCJDdXJyZW50bHkgbm90IHNldHRpbmcgQnJvYWRjYXN0IFNlbGVjdCBSZWdpc3RlcnNcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJDdXJyZW50bHkgbm90IHNldHRpbmcgQnJvYWRjYXN0IFNlbGVjdCAiCisJCQkiUmVnaXN0ZXJzXG4iKTsKIAkJdGVtcF9jdGwgJj0gflRTSTE0OF9MQ1NSX09UQVRfVE1fTTsKIAkJdGVtcF9jdGwgfD0gVFNJMTQ4X0xDU1JfT1RBVF9UTV8yZVNTVEI7CiAJfQpAQCAtMTExMCw3ICsxMDc2LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOwotCQlwcmludGsoIkludmFsaWQgZGF0YSB3aWR0aFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBkYXRhIHdpZHRoXG4iKTsKIAkJcmV0dmFsID0gLUVJTlZBTDsKIAkJZ290byBlcnJfZHdpZHRoOwogCX0KQEAgLTExNDcsNyArMTExMyw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKLQkJcHJpbnRrKCJJbnZhbGlkIGFkZHJlc3Mgc3BhY2VcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgYWRkcmVzcyBzcGFjZVxuIik7CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2FzcGFjZTsKIAkJYnJlYWs7CkBAIC0yMTU0LDcgKzIxMjAsNyBAQAogCWlvd3JpdGUzMmJlKHRtcCwgdHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVPKTsKIAogCWlvd3JpdGUzMmJlKFRTSTE0OF9MQ1NSX0lOVENfTE1DW21vbml0b3JdLAotCQkgdHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVPKTsKKwkJIHRzaTE0OF9icmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRDKTsKIAogCS8qIERldGFjaCBjYWxsYmFjayAqLwogCWxtX2NhbGxiYWNrW21vbml0b3JdID0gTlVMTDsKQEAgLTIzMzQsNyArMjMwMCw2IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZG1hX3F1ZXVlWzFdKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpYWNrX3F1ZXVlKTsKIAltdXRleF9pbml0KCYodm1lX2ludCkpOwotCW11dGV4X2luaXQoJih2bWVfaXJxKSk7CiAJbXV0ZXhfaW5pdCgmKHZtZV9ybXcpKTsKIAogCXRzaTE0OF9icmlkZ2UtPnBhcmVudCA9ICYocGRldi0+ZGV2KTsKQEAgLTI0ODIsOSArMjQ0Nyw4IEBACiAJdHNpMTQ4X2JyaWRnZS0+ZG1hX2xpc3RfYWRkID0gdHNpMTQ4X2RtYV9saXN0X2FkZDsKIAl0c2kxNDhfYnJpZGdlLT5kbWFfbGlzdF9leGVjID0gdHNpMTQ4X2RtYV9saXN0X2V4ZWM7CiAJdHNpMTQ4X2JyaWRnZS0+ZG1hX2xpc3RfZW1wdHkgPSB0c2kxNDhfZG1hX2xpc3RfZW1wdHk7Ci0JdHNpMTQ4X2JyaWRnZS0+cmVxdWVzdF9pcnEgPSB0c2kxNDhfcmVxdWVzdF9pcnE7Ci0JdHNpMTQ4X2JyaWRnZS0+ZnJlZV9pcnEgPSB0c2kxNDhfZnJlZV9pcnE7Ci0JdHNpMTQ4X2JyaWRnZS0+Z2VuZXJhdGVfaXJxID0gdHNpMTQ4X2dlbmVyYXRlX2lycTsKKwl0c2kxNDhfYnJpZGdlLT5pcnFfc2V0ID0gdHNpMTQ4X2lycV9zZXQ7CisJdHNpMTQ4X2JyaWRnZS0+aXJxX2dlbmVyYXRlID0gdHNpMTQ4X2lycV9nZW5lcmF0ZTsKIAl0c2kxNDhfYnJpZGdlLT5sbV9zZXQgPSB0c2kxNDhfbG1fc2V0OwogCXRzaTE0OF9icmlkZ2UtPmxtX2dldCA9IHRzaTE0OF9sbV9nZXQ7CiAJdHNpMTQ4X2JyaWRnZS0+bG1fYXR0YWNoID0gdHNpMTQ4X2xtX2F0dGFjaDsKQEAgLTI2MTcsMTMgKzI1ODEsNiBAQAogCX0KIAogCS8qCi0JICogIERpc2FibGUgYW5kIGNsZWFyIGFsbCBpbnRlcnJ1cHRzLgotCSAqLwotCWlvd3JpdGUzMmJlKDB4MCwgdHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVPKTsKLQlpb3dyaXRlMzJiZSgweEZGRkZGRkZGLCB0c2kxNDhfYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5UQyk7Ci0JaW93cml0ZTMyYmUoMHhGRkZGRkZGRiwgdHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVOKTsKLQotCS8qCiAJICogIE1hcCBhbGwgSW50ZXJydXB0cyB0byBQQ0kgSU5UQQogCSAqLwogCWlvd3JpdGUzMmJlKDB4MCwgdHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVE0xKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfdXNlci5jIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMKaW5kZXggNzg5MTI4OC4uZTIyODk0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNjI1LDcgKzYyNCw3IEBACiBzdGF0aWMgaW50IF9faW5pdCB2bWVfdXNlcl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBjdXJfYnVzLCBpbnQgY3VyX3Nsb3QpCiB7CiAJaW50IGksIGVycjsKLQljaGFyIG5hbWVbOF07CisJY2hhciBuYW1lWzEyXTsKIAogCS8qIFNhdmUgcG9pbnRlciB0byB0aGUgYnJpZGdlIGRldmljZSAqLwogCWlmICh2bWVfdXNlcl9icmlkZ2UgIT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWUuYyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lLmMKaW5kZXggNDc3YTFhZC4uOTk0ZmRiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZS5jCkBAIC0xMyw3ICsxMyw2IEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpAQCAtNjQ0LDcgKzY0Myw3IEBACiAgKiBSZXF1ZXN0IGEgRE1BIGNvbnRyb2xsZXIgd2l0aCBzcGVjaWZpYyBhdHRyaWJ1dGVzLCByZXR1cm4gc29tZSB1bmlxdWUKICAqIGlkZW50aWZpZXIuCiAgKi8KLXN0cnVjdCB2bWVfcmVzb3VyY2UgKnZtZV9yZXF1ZXN0X2RtYShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdHJ1Y3Qgdm1lX3Jlc291cmNlICp2bWVfZG1hX3JlcXVlc3Qoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCB2bWVfYnJpZGdlICpicmlkZ2U7CiAJc3RydWN0IGxpc3RfaGVhZCAqZG1hX3BvcyA9IE5VTEw7CkBAIC03MDUsNyArNzA0LDcgQEAKIGVycl9idXM6CiAJcmV0dXJuIE5VTEw7CiB9Ci1FWFBPUlRfU1lNQk9MKHZtZV9yZXF1ZXN0X2RtYSk7CitFWFBPUlRfU1lNQk9MKHZtZV9kbWFfcmVxdWVzdCk7CiAKIC8qCiAgKiBTdGFydCBuZXcgbGlzdApAQCAtODgwLDcgKzg3OSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChtdXRleF90cnlsb2NrKCYobGlzdC0+bXR4KSkpIHsKKwlpZiAoIW11dGV4X3RyeWxvY2soJihsaXN0LT5tdHgpKSkgewogCQlwcmludGsoIkxpbmsgTGlzdCBhbHJlYWR5IHN1Ym1pdHRlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTkyMyw3ICs5MjIsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAobXV0ZXhfdHJ5bG9jaygmKGxpc3QtPm10eCkpKSB7CisJaWYgKCFtdXRleF90cnlsb2NrKCYobGlzdC0+bXR4KSkpIHsKIAkJcHJpbnRrKCJMaW5rIExpc3QgaW4gdXNlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtOTU2LDcgKzk1NSw3IEBACiAKIAljdHJsciA9IGxpc3RfZW50cnkocmVzb3VyY2UtPmVudHJ5LCBzdHJ1Y3Qgdm1lX2RtYV9yZXNvdXJjZSwgbGlzdCk7CiAKLQlpZiAobXV0ZXhfdHJ5bG9jaygmKGN0cmxyLT5tdHgpKSkgeworCWlmICghbXV0ZXhfdHJ5bG9jaygmKGN0cmxyLT5tdHgpKSkgewogCQlwcmludGsoIlJlc291cmNlIGJ1c3ksIGNhbid0IGZyZWVcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTk3NSw3ICs5NzQsMjMgQEAKIH0KIEVYUE9SVF9TWU1CT0wodm1lX2RtYV9mcmVlKTsKIAotaW50IHZtZV9yZXF1ZXN0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBsZXZlbCwgaW50IHN0YXRpZCwKK3ZvaWQgdm1lX2lycV9oYW5kbGVyKHN0cnVjdCB2bWVfYnJpZGdlICpicmlkZ2UsIGludCBsZXZlbCwgaW50IHN0YXRpZCkKK3sKKwl2b2lkICgqY2FsbCkoaW50LCBpbnQsIHZvaWQgKik7CisJdm9pZCAqcHJpdl9kYXRhOworCisJY2FsbCA9IGJyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5mdW5jOworCXByaXZfZGF0YSA9IGJyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5wcml2X2RhdGE7CisKKwlpZiAoY2FsbCAhPSBOVUxMKQorCQljYWxsKGxldmVsLCBzdGF0aWQsIHByaXZfZGF0YSk7CisJZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJTcHVyaWxvdXMgVk1FIGludGVycnVwdCwgbGV2ZWw6JXgsICIKKwkJCSJ2ZWN0b3I6JXhcbiIsIGxldmVsLCBzdGF0aWQpOworfQorRVhQT1JUX1NZTUJPTCh2bWVfaXJxX2hhbmRsZXIpOworCitpbnQgdm1lX2lycV9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkLAogCXZvaWQgKCpjYWxsYmFjaykoaW50IGxldmVsLCBpbnQgdmVjdG9yLCB2b2lkICpwcml2X2RhdGEpLAogCXZvaWQgKnByaXZfZGF0YSkKIHsKQEAgLTk4OCwyMCArMTAwMywzNyBAQAogCX0KIAogCWlmKChsZXZlbCA8IDEpIHx8IChsZXZlbCA+IDcpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkludmFsaWQgaW50ZXJydXB0IGxldmVsXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCBsZXZlbFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChicmlkZ2UtPnJlcXVlc3RfaXJxID09IE5VTEwpIHsKLQkJcHJpbnRrKCJSZWdpc3RlcmluZyBpbnRlcnJ1cHRzIG5vdCBzdXBwb3J0ZWRcbiIpOworCWlmIChicmlkZ2UtPmlycV9zZXQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNvbmZpZ3VyaW5nIGludGVycnVwdHMgbm90IHN1cHBvcnRlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldHVybiBicmlkZ2UtPnJlcXVlc3RfaXJxKGxldmVsLCBzdGF0aWQsIGNhbGxiYWNrLCBwcml2X2RhdGEpOworCW11dGV4X2xvY2soJihicmlkZ2UtPmlycV9tdHgpKTsKKworCWlmIChicmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNhbGxiYWNrW3N0YXRpZF0uZnVuYykgeworCQltdXRleF91bmxvY2soJihicmlkZ2UtPmlycV9tdHgpKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVk1FIEludGVycnVwdCBhbHJlYWR5IHRha2VuXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlicmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNvdW50Kys7CisJYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLnByaXZfZGF0YSA9IHByaXZfZGF0YTsKKwlicmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNhbGxiYWNrW3N0YXRpZF0uZnVuYyA9IGNhbGxiYWNrOworCisJLyogRW5hYmxlIElSUSBsZXZlbCAqLworCWJyaWRnZS0+aXJxX3NldChsZXZlbCwgMSwgMSk7CisKKwltdXRleF91bmxvY2soJihicmlkZ2UtPmlycV9tdHgpKTsKKworCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTCh2bWVfcmVxdWVzdF9pcnEpOworRVhQT1JUX1NZTUJPTCh2bWVfaXJxX3JlcXVlc3QpOwogCi12b2lkIHZtZV9mcmVlX2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBsZXZlbCwgaW50IHN0YXRpZCkKK3ZvaWQgdm1lX2lycV9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkKQogewogCXN0cnVjdCB2bWVfYnJpZGdlICpicmlkZ2U7CiAKQEAgLTEwMTIsMjAgKzEwNDQsMzEgQEAKIAl9CiAKIAlpZigobGV2ZWwgPCAxKSB8fCAobGV2ZWwgPiA3KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJJbnZhbGlkIGludGVycnVwdCBsZXZlbFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgbGV2ZWxcbiIpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKGJyaWRnZS0+ZnJlZV9pcnEgPT0gTlVMTCkgewotCQlwcmludGsoIkZyZWVpbmcgaW50ZXJydXB0cyBub3Qgc3VwcG9ydGVkXG4iKTsKKwlpZiAoYnJpZGdlLT5pcnFfc2V0ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb25maWd1cmluZyBpbnRlcnJ1cHRzIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQlyZXR1cm47CiAJfQogCi0JYnJpZGdlLT5mcmVlX2lycShsZXZlbCwgc3RhdGlkKTsKKwltdXRleF9sb2NrKCYoYnJpZGdlLT5pcnFfbXR4KSk7CisKKwlicmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNvdW50LS07CisKKwkvKiBEaXNhYmxlIElSUSBsZXZlbCBpZiBubyBtb3JlIGludGVycnVwdHMgYXR0YWNoZWQgYXQgdGhpcyBsZXZlbCovCisJaWYgKGJyaWRnZS0+aXJxW2xldmVsIC0gMV0uY291bnQgPT0gMCkKKwkJYnJpZGdlLT5pcnFfc2V0KGxldmVsLCAwLCAxKTsKKworCWJyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5mdW5jID0gTlVMTDsKKwlicmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNhbGxiYWNrW3N0YXRpZF0ucHJpdl9kYXRhID0gTlVMTDsKKworCW11dGV4X3VubG9jaygmKGJyaWRnZS0+aXJxX210eCkpOwogfQotRVhQT1JUX1NZTUJPTCh2bWVfZnJlZV9pcnEpOworRVhQT1JUX1NZTUJPTCh2bWVfaXJxX2ZyZWUpOwogCi1pbnQgdm1lX2dlbmVyYXRlX2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBsZXZlbCwgaW50IHN0YXRpZCkKK2ludCB2bWVfaXJxX2dlbmVyYXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkKQogewogCXN0cnVjdCB2bWVfYnJpZGdlICpicmlkZ2U7CiAKQEAgLTEwNDAsMTQgKzEwODMsMTQgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGJyaWRnZS0+Z2VuZXJhdGVfaXJxID09IE5VTEwpIHsKKwlpZiAoYnJpZGdlLT5pcnFfZ2VuZXJhdGUgPT0gTlVMTCkgewogCQlwcmludGsoIkludGVycnVwdCBnZW5lcmF0aW9uIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyZXR1cm4gYnJpZGdlLT5nZW5lcmF0ZV9pcnEobGV2ZWwsIHN0YXRpZCk7CisJcmV0dXJuIGJyaWRnZS0+aXJxX2dlbmVyYXRlKGxldmVsLCBzdGF0aWQpOwogfQotRVhQT1JUX1NZTUJPTCh2bWVfZ2VuZXJhdGVfaXJxKTsKK0VYUE9SVF9TWU1CT0wodm1lX2lycV9nZW5lcmF0ZSk7CiAKIC8qCiAgKiBSZXF1ZXN0IHRoZSBsb2NhdGlvbiBtb25pdG9yLCByZXR1cm4gcmVzb3VyY2Ugb3IgTlVMTApAQCAtMTE0OCw3ICsxMTkxLDcgQEAKIAogCS8qIFhYWCBDaGVjayBwYXJhbWV0ZXJzICovCiAKLQlyZXR1cm4gbG0tPnBhcmVudC0+bG1fc2V0KGxtLCBsbV9iYXNlLCBhc3BhY2UsIGN5Y2xlKTsKKwlyZXR1cm4gYnJpZGdlLT5sbV9zZXQobG0sIGxtX2Jhc2UsIGFzcGFjZSwgY3ljbGUpOwogfQogRVhQT1JUX1NZTUJPTCh2bWVfbG1fc2V0KTsKIApAQCAtMTIyOCwxNiArMTI3MSwxOCBAQAogCiAJbG0gPSBsaXN0X2VudHJ5KHJlc291cmNlLT5lbnRyeSwgc3RydWN0IHZtZV9sbV9yZXNvdXJjZSwgbGlzdCk7CiAKLQlpZiAobXV0ZXhfdHJ5bG9jaygmKGxtLT5tdHgpKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlJlc291cmNlIGJ1c3ksIGNhbid0IGZyZWVcbiIpOwotCQlyZXR1cm47Ci0JfQorCW11dGV4X2xvY2soJihsbS0+bXR4KSk7CiAKLQkvKiBYWFggQ2hlY2sgdG8gc2VlIHRoYXQgdGhlcmUgYXJlbid0IGFueSBjYWxsYmFja3Mgc3RpbGwgYXR0YWNoZWQgKi8KKwkvKiBYWFgKKwkgKiBDaGVjayB0byBzZWUgdGhhdCB0aGVyZSBhcmVuJ3QgYW55IGNhbGxiYWNrcyBzdGlsbCBhdHRhY2hlZCwgaWYKKwkgKiB0aGVyZSBhcmUgd2Ugc2hvdWxkIHByb2JhYmx5IGJlIGRldGFjaGluZyB0aGVtIQorCSAqLwogCiAJbG0tPmxvY2tlZCA9IDA7CiAKIAltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisKKwlrZnJlZShyZXNvdXJjZSk7CiB9CiBFWFBPUlRfU1lNQk9MKHZtZV9sbV9mcmVlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWUuaCBiL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lLmgKaW5kZXggNjIwNmU5MS4uOTdkYzIyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZS5oCkBAIC0xMjMsNyArMTIzLDcgQEAKIAl1bnNpZ25lZCBpbnQsIGxvZmZfdCk7CiB2b2lkIHZtZV9tYXN0ZXJfZnJlZShzdHJ1Y3Qgdm1lX3Jlc291cmNlICopOwogCi1zdHJ1Y3Qgdm1lX3Jlc291cmNlICp2bWVfcmVxdWVzdF9kbWEoc3RydWN0IGRldmljZSAqKTsKK3N0cnVjdCB2bWVfcmVzb3VyY2UgKnZtZV9kbWFfcmVxdWVzdChzdHJ1Y3QgZGV2aWNlICopOwogc3RydWN0IHZtZV9kbWFfbGlzdCAqdm1lX25ld19kbWFfbGlzdChzdHJ1Y3Qgdm1lX3Jlc291cmNlICopOwogc3RydWN0IHZtZV9kbWFfYXR0ciAqdm1lX2RtYV9wYXR0ZXJuX2F0dHJpYnV0ZSh1MzIsIHZtZV9wYXR0ZXJuX3QpOwogc3RydWN0IHZtZV9kbWFfYXR0ciAqdm1lX2RtYV9wY2lfYXR0cmlidXRlKGRtYV9hZGRyX3QpOwpAQCAtMTM2LDEwICsxMzYsMTAgQEAKIGludCB2bWVfZG1hX2xpc3RfZnJlZShzdHJ1Y3Qgdm1lX2RtYV9saXN0ICopOwogaW50IHZtZV9kbWFfZnJlZShzdHJ1Y3Qgdm1lX3Jlc291cmNlICopOwogCi1pbnQgdm1lX3JlcXVlc3RfaXJxKHN0cnVjdCBkZXZpY2UgKiwgaW50LCBpbnQsCitpbnQgdm1lX2lycV9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKiwgaW50LCBpbnQsCiAJdm9pZCAoKmNhbGxiYWNrKShpbnQsIGludCwgdm9pZCAqKSwgdm9pZCAqKTsKLXZvaWQgdm1lX2ZyZWVfaXJxKHN0cnVjdCBkZXZpY2UgKiwgaW50LCBpbnQpOwotaW50IHZtZV9nZW5lcmF0ZV9pcnEoc3RydWN0IGRldmljZSAqLCBpbnQsIGludCk7Cit2b2lkIHZtZV9pcnFfZnJlZShzdHJ1Y3QgZGV2aWNlICosIGludCwgaW50KTsKK2ludCB2bWVfaXJxX2dlbmVyYXRlKHN0cnVjdCBkZXZpY2UgKiwgaW50LCBpbnQpOwogCiBzdHJ1Y3Qgdm1lX3Jlc291cmNlICogdm1lX2xtX3JlcXVlc3Qoc3RydWN0IGRldmljZSAqKTsKIGludCB2bWVfbG1fY291bnQoc3RydWN0IHZtZV9yZXNvdXJjZSAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lX2FwaS50eHQgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZV9hcGkudHh0CmluZGV4IDU5MWViYTUuLmE1YzFiMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lX2FwaS50eHQKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWVfYXBpLnR4dApAQCAtNzcsNyArNzcsNyBAQAogCXN0cnVjdCB2bWVfcmVzb3VyY2UgKiB2bWVfc2xhdmVfcmVxdWVzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXZtZV9hZGRyZXNzX3QgYXNwYWNlLCB2bWVfY3ljbGVfdCBjeWNsZSk7CiAKLQlzdHJ1Y3Qgdm1lX3Jlc291cmNlICp2bWVfcmVxdWVzdF9kbWEoc3RydWN0IGRldmljZSAqZGV2KTsKKwlzdHJ1Y3Qgdm1lX3Jlc291cmNlICp2bWVfZG1hX3JlcXVlc3Qoc3RydWN0IGRldmljZSAqZGV2KTsKIAogRm9yIHNsYXZlIHdpbmRvd3MgdGhlc2UgYXR0cmlidXRlcyBhcmUgc3BsaXQgaW50byB0aG9zZSBvZiB0eXBlICd2bWVfYWRkcmVzc190JwogYW5kICd2bWVfY3ljbGVfdCcuIE1hc3RlciB3aW5kb3dzIGFkZCBhIGZ1cnRoZXIgc2V0IG9mIGF0dHJpYnV0ZXMgJ3ZtZV9jeWNsZV90Jy4KQEAgLTI5MCwxMCArMjkwLDEwIEBACiBjYWxsYmFjayBmdW5jdGlvbi4gQSB2b2lkIHBvaW50ZXIgcGFyYW1ldGVyIGlzIHByb3ZpZGVkLCB0aGUgdmFsdWUgb2Ygd2hpY2ggaXMKIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24sIHRoZSB1c2Ugb2YgdGhpcyBwb2ludGVyIGlzIHVzZXIgdW5kZWZpbmVkOgogCi0JaW50IHZtZV9yZXF1ZXN0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBsZXZlbCwgaW50IHN0YXRpZCwKKwlpbnQgdm1lX2lycV9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkLAogCQl2b2lkICgqY2FsbGJhY2spKGludCwgaW50LCB2b2lkICopLCB2b2lkICpwcml2KTsKIAotCXZvaWQgdm1lX2ZyZWVfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkKTsKKwl2b2lkIHZtZV9pcnFfZnJlZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBsZXZlbCwgaW50IHN0YXRpZCk7CiAKIFRoZSBjYWxsYmFjayBwYXJhbWV0ZXJzIGFyZSBhcyBmb2xsb3dzLiBDYXJlIG11c3QgYmUgdGFrZW4gaW4gd3JpdGluZyBhIGNhbGxiYWNrCiBmdW5jdGlvbiwgY2FsbGJhY2sgZnVuY3Rpb25zIHJ1biBpbiBpbnRlcnJ1cHQgY29udGV4dDoKQEAgLTMwNyw3ICszMDcsNyBAQAogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhIFZNRSBpbnRlcnJ1cHQgYXQgYSBnaXZlbiBWTUUKIGxldmVsIGFuZCBWTUUgc3RhdHVzIElEOgogCi0JaW50IHZtZV9nZW5lcmF0ZV9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbGV2ZWwsIGludCBzdGF0aWQpOworCWludCB2bWVfaXJxX2dlbmVyYXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkKTsKIAogCiBMb2NhdGlvbiBtb25pdG9ycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWVfYnJpZGdlLmggYi9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZV9icmlkZ2UuaAppbmRleCBlNDNjYzE5Li44NTFmYTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZV9icmlkZ2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZV9icmlkZ2UuaApAQCAtMTIwLDYgKzEyMCw4IEBACiAKIAkvKiBJbnRlcnJ1cHQgY2FsbGJhY2tzICovCiAJc3RydWN0IHZtZV9pcnEgaXJxWzddOworCS8qIExvY2tpbmcgZm9yIFZNRSBpcnEgY2FsbGJhY2sgY29uZmlndXJhdGlvbiAqLworCXN0cnVjdCBtdXRleCBpcnFfbXR4OwogCiAJLyogU2xhdmUgRnVuY3Rpb25zICovCiAJaW50ICgqc2xhdmVfZ2V0KSAoc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSAqLCBpbnQgKiwKQEAgLTE0OSw5ICsxNTEsOCBAQAogCWludCAoKmRtYV9saXN0X2VtcHR5KSAoc3RydWN0IHZtZV9kbWFfbGlzdCAqKTsKIAogCS8qIEludGVycnVwdCBGdW5jdGlvbnMgKi8KLQlpbnQgKCpyZXF1ZXN0X2lycSkgKGludCwgaW50LCB2b2lkICgqY2JhY2spKGludCwgaW50LCB2b2lkKiksIHZvaWQgKik7Ci0Jdm9pZCAoKmZyZWVfaXJxKSAoaW50LCBpbnQpOwotCWludCAoKmdlbmVyYXRlX2lycSkgKGludCwgaW50KTsKKwl2b2lkICgqaXJxX3NldCkgKGludCwgaW50LCBpbnQpOworCWludCAoKmlycV9nZW5lcmF0ZSkgKGludCwgaW50KTsKIAogCS8qIExvY2F0aW9uIG1vbml0b3IgZnVuY3Rpb25zICovCiAJaW50ICgqbG1fc2V0KSAoc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqLCB1bnNpZ25lZCBsb25nIGxvbmcsCkBAIC0xNzUsNiArMTc2LDggQEAKICNlbmRpZgogfTsKIAordm9pZCB2bWVfaXJxX2hhbmRsZXIoc3RydWN0IHZtZV9icmlkZ2UgKiwgaW50LCBpbnQpOworCiBpbnQgdm1lX3JlZ2lzdGVyX2JyaWRnZSAoc3RydWN0IHZtZV9icmlkZ2UgKik7CiB2b2lkIHZtZV91bnJlZ2lzdGVyX2JyaWRnZSAoc3RydWN0IHZtZV9icmlkZ2UgKik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RldmljZS5oCmluZGV4IGZhN2YwZmMuLmNkZTQ0ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXZpY2UuaApAQCAtNDQsNyArNDQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CkBAIC03OSw3ICs3OCw2IEBACiAvLyBkZXZpY2Ugc3BlY2lmaWMKIC8vCiAKLSNpbmNsdWRlICJrY29tcGF0LmgiCiAjaW5jbHVkZSAiZGV2aWNlX2NmZy5oIgogI2luY2x1ZGUgInR0eXBlLmgiCiAjaW5jbHVkZSAiODAyMTFoZHIuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX21haW4uYwppbmRleCA1MzQ1MGI0Li4wZGI4ZDdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RldmljZV9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXZpY2VfbWFpbi5jCkBAIC02NjEsNyArNjYxLDcgQEAKICAgIGlmKHpvbmV0eXBlIT1wRGV2aWNlLT5hYnlFRVBST01bRUVQX09GU19aT05FVFlQRV0pCiAgICAgICBwcmludGsoInpvbmV0eXBlIGluIGZpbGVbJTAyeF0gbWlzbWF0Y2ggd2l0aCBpbiBFRVBST01bJTAyeF1cbiIsem9uZXR5cGUscERldmljZS0+YWJ5RUVQUk9NW0VFUF9PRlNfWk9ORVRZUEVdKTsKICAgIGVsc2UKLSAgICAgIHByaW50aygiUmVhZCBab25ldHlwZSBmaWxlIHN1Y2Vzcyx1c2UgZGVmYXVsdCB6b25ldHlwZSBzZXR0aW5nWyUwMnhdXG4iLHpvbmV0eXBlKTsKKyAgICAgIHByaW50aygiUmVhZCBab25ldHlwZSBmaWxlIHN1Y2Nlc3MsdXNlIGRlZmF1bHQgem9uZXR5cGUgc2V0dGluZ1slMDJ4XVxuIix6b25ldHlwZSk7CiAgfQogIAl9CiAgIGVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvaW9jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvaW9jdGwuYwppbmRleCBmYzljYmUwLi5kOWE1ZmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2lvY3RsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9pb2N0bC5jCkBAIC0xNTksNyArMTU5LDcgQEAKIAkgZWxzZSBpZih6b25ldHlwZSA9PSAweDAyKSB7IC8vRXVyb3BlCiAgICAgICAgICAgICAgc1pvbmVUeXBlQ21kLlpvbmVUeXBlID0gWm9uZVR5cGVfRXVyb3BlOwogCSB9Ci0JIGVsc2UgeyAvL1Vua25vdyBab25lVHlwZQorCSBlbHNlIHsgLy9Vbmtub3duIFpvbmVUeXBlCiAJICAgICAgICBwcmludGsoIkVycm9yOlpvbmVUeXBlWyV4XSBVbmtub3duID8/P1xuIix6b25ldHlwZSk7CiAJICAgICAgICAgcmVzdWx0ID0gLUVGQVVMVDsKIAkJYnJlYWs7CkBAIC02OTIsNyArNjkyLDcgQEAKICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwRGV2aWNlLT5kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBwSXRlbVNTSUQtPmFieVNTSUQpOwogICAgfQogICAgI2VuZGlmCi0gICAgICAgICBwRGV2aWNlLT5mV1BBX0F1dGhlbmVkID0gVFJVRTsgICAgICAgICAgIC8vaXMgc3VjZXNzZnVsIHBlZXIgdG8gd3BhX1Jlc3VsdC5hdXRoZW50aWNhdGVkPworICAgICAgICAgcERldmljZS0+ZldQQV9BdXRoZW5lZCA9IFRSVUU7ICAgICAgICAgICAvL2lzIHN1Y2Nlc3NmdWwgcGVlciB0byB3cGFfUmVzdWx0LmF1dGhlbnRpY2F0ZWQ/CiB9CiAKICAgICAgICAgLy9wcmludGsoImdldCBwcml2YXRlIHdwYV9zdXBwbGljYW50IGFubm91bmNlIFdQQSBTTVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2tjb21wYXQuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2NvbXBhdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2Y2MzRjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2NvbXBhdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwgMjAwMyBWSUEgTmV0d29ya2luZywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICoKLSAqIEZpbGU6IGtjb21wYXQuaAotICoKLSAqIFB1cnBvc2U6IGRlZmluZSBrZXJuZWwgY29tcGF0aWJpbGl0eSBoZWFkZXIKLSAqCi0gKiBBdXRob3I6IEx5bmRvbiBDaGVuCi0gKgotICogRGF0ZTogQXByIDgsIDIwMDIKLSAqCi0gKi8KLQotI2lmbmRlZiBfS0NPTVBBVF9ICi0jZGVmaW5lIF9LQ09NUEFUX0gKLQotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLQotI2lmbmRlZiBIQVZFX05FVERFVl9QUklWCi0jZGVmaW5lIG5ldGRldl9wcml2KGRldikgKGRldi0+cHJpdikKLSNlbmRpZgotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9taWIuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWliLmgKaW5kZXggNjllMDRmNy4uMmFhMmI5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9taWIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pYi5oCkBAIC0zMjUsMTAgKzMyNSwxMCBAQAogICAgI2lmZGVmIENhbGN1X0xpbmtRdWFsCiAgICAgICAgLy9UeCBjb3VudDoKICAgICBVTE9ORyBUeE5vUmV0cnlPa0NvdW50OyAgICAgICAgIC8vc3VjY2VzcyB0eCBubyByZXRyeSAhCi0gICAgVUxPTkcgVHhSZXRyeU9rQ291bnQ7ICAgICAgICAgICAgICAvL3N1Y2VzcyB0eCBidXQgcmV0cnkgIQorICAgIFVMT05HIFR4UmV0cnlPa0NvdW50OyAgICAgICAgICAgICAgLy9zdWNjZXNzIHR4IGJ1dCByZXRyeSAhCiAgICAgVUxPTkcgVHhGYWlsQ291bnQ7ICAgICAgICAgICAgICAgICAgICAgIC8vZmFpbCB0eCA/CiAgICAgICAvL1J4IGNvdW50OgotICAgIFVMT05HIFJ4T2tDbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvL3N1Y2VzcyByeCAhCisgICAgVUxPTkcgUnhPa0NudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3VjY2VzcyByeCAhCiAgICAgVUxPTkcgUnhGY3NFcnJDbnQ7ICAgICAgICAgICAgICAgICAgICAvL2ZhaWwgcnggPwogICAgICAgLy9zdGF0aXN0aWMKICAgICBVTE9ORyBTaWduYWxTdHJlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcnh0eC5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yeHR4LmgKaW5kZXggMTdiZDFiMS4uNWRhODE1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yeHR4LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yeHR4LmgKQEAgLTM1LDE3ICszNSwxMCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IENsYXNzZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IFZhcmlhYmxlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzc3VtZSBDIGRlY2xhcmF0aW9ucyBmb3IgQysrICovCi0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQogLyoKIFZPSUQgdkdlbmVyYXRlTUFDSGVhZGVyKAogICAgIElOIFBTRGV2aWNlIHBEZXZpY2UsCkBAIC0xMTEsMTQgKzEwNCw0IEBACiBDTURfU1RBVFVTIGNzTWdtdF94bWl0KFBTRGV2aWNlIHBEZXZpY2UsIFBTVHhNZ210UGFja2V0IHBQYWNrZXQpOwogQ01EX1NUQVRVUyBjc0JlYWNvbl94bWl0KFBTRGV2aWNlIHBEZXZpY2UsIFBTVHhNZ210UGFja2V0IHBQYWNrZXQpOwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgZXh0ZXJuICJDIiB7ICovCi0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCi0KLQogI2VuZGlmIC8vIF9fUlhUWF9IX18KLQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd2NtZC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93Y21kLmMKaW5kZXggZDgxZjViNy4uYzllYWJmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93Y21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93Y21kLmMKQEAgLTQ4LDcgKzQ4LDYgQEAKICNpbmNsdWRlICJ3bWdyLmgiCiAjaW5jbHVkZSAicG93ZXIuaCIKICNpbmNsdWRlICJ3Y3RsLmgiCi0jaW5jbHVkZSAiY2FyZC5oIgogI2luY2x1ZGUgImJhc2ViYW5kLmgiCiAjaW5jbHVkZSAicnh0eC5oIgogI2luY2x1ZGUgInJmLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dwYS5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGEuYwppbmRleCBmOTJkMzNmLi41ZGE2NzE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dwYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3BhLmMKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAgICAgICBpZiAocFJTTi0+bGVuID49IDEyKSAvL291aTEoNCkrdmVyKDIpK0dLUyg0KStQS1NDbnQoMikKICAgICAgICAgewogICAgICAgICAgICAgaiA9IDA7Ci0gICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIndQS0NvdW50OiAlZCwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlQS1R5cGUpOiAlbGRcbiIsIHBSU04tPndQS0NvdW50LCBzaXplb2YocEJTU0xpc3QtPmFieVBLVHlwZSkpOworICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJ3UEtDb3VudDogJWQsIHNpemVvZihwQlNTTGlzdC0+YWJ5UEtUeXBlKTogJXp1XG4iLCBwUlNOLT53UEtDb3VudCwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlQS1R5cGUpKTsKICAgICAgICAgICAgIGZvcihpID0gMDsgKGkgPCBwUlNOLT53UEtDb3VudCkgJiYgKGogPCBzaXplb2YocEJTU0xpc3QtPmFieVBLVHlwZSkvc2l6ZW9mKEJZVEUpKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYocFJTTi0+bGVuID49IDEyK2kqNCs0KSB7IC8vb3VpMSg0KSt2ZXIoMikrR0tTKDQpK1BLU0NudCgyKStQS1MoNCppKQogICAgICAgICAgICAgICAgICAgICBpZiAoICFtZW1jbXAocFJTTi0+UEtTTGlzdFtpXS5hYnlPVUksIGFieU9VSTAwLCA0KSkKQEAgLTE3OCw3ICsxNzgsNyBAQAogICAgICAgICAgICAgLy8gb3ZlcmxheSBJRV9SU05fQXV0aCBzdHJ1Y3R1cmUgaW50byBjb3JyZWN0IHBsYWNlCiAgICAgICAgICAgICBwSUVfUlNOX0F1dGggPSAoUFdMQU5fSUVfUlNOX0FVVEgpIHBSU04tPlBLU0xpc3RbbV0uYWJ5T1VJOwogICAgICAgICAgICAgaiA9IDA7Ci0gICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIndBdXRoQ291bnQ6ICVkLCBzaXplb2YocEJTU0xpc3QtPmFieUF1dGhUeXBlKTogJWxkXG4iLAorICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJ3QXV0aENvdW50OiAlZCwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlBdXRoVHlwZSk6ICV6dVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcElFX1JTTl9BdXRoLT53QXV0aENvdW50LCBzaXplb2YocEJTU0xpc3QtPmFieUF1dGhUeXBlKSk7CiAgICAgICAgICAgICBmb3IoaSA9IDA7IChpIDwgcElFX1JTTl9BdXRoLT53QXV0aENvdW50KSAmJiAoaiA8IHNpemVvZihwQlNTTGlzdC0+YWJ5QXV0aFR5cGUpL3NpemVvZihCWVRFKSk7IGkrKykgewogICAgICAgICAgICAgICAgIGlmKHBSU04tPmxlbiA+PSAxNCs0KyhtK2kpKjQpIHsgLy9vdWkxKDQpK3ZlcigyKStHS1MoNCkrUEtTQ250KDIpK1BLUyg0Km0pK0FLQygyKStBS1MoNCppKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cm91dGUuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3JvdXRlLmMKaW5kZXggYWI5OTE2MS4uMWQwMjA0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cm91dGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dyb3V0ZS5jCkBAIC0xMTMsNyArMTEzLDcgQEAKICAgICB9CiAKICAgICBpZiAocERldmljZS0+YkVuYWJsZUhvc3RXRVApIHsKLSAgICAgICAgaWYgKHVOb2RlSW5kZXggPj0gMCkgeworCWlmICh1Tm9kZUluZGV4IDwgTUFYX05PREVfTlVNICsgMSkgewogICAgICAgICAgICAgcFRyYW5zbWl0S2V5ID0gJlNUZW1wS2V5OwogICAgICAgICAgICAgcFRyYW5zbWl0S2V5LT5ieUNpcGhlclN1aXRlID0gcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS5ieUNpcGhlclN1aXRlOwogICAgICAgICAgICAgcFRyYW5zbWl0S2V5LT5kd0tleUluZGV4ID0gcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS5kd0tleUluZGV4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9iYXNlYmFuZC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9iYXNlYmFuZC5jCmluZGV4IDgyMGE3YjguLjdkYzAxZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYmFzZWJhbmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Jhc2ViYW5kLmMKQEAgLTQ2LDcgKzQ2LDYgQEAKICNpbmNsdWRlICJjb250cm9sLmgiCiAjaW5jbHVkZSAiZGF0YXJhdGUuaCIKICNpbmNsdWRlICJybmRpcy5oIgotI2luY2x1ZGUgImNvbnRyb2wuaCIKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFN0YXRpYyBEZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyBpbnQgICAgICAgICAgbXNnbGV2ZWwgICAgICAgICAgICAgICAgPU1TR19MRVZFTF9JTkZPOwpAQCAtMTA0MSw3ICsxMDQwLDcgQEAKICAgIGlmKHBEZXZpY2UtPmNvbmZpZ19maWxlLlpvbmVUeXBlICE9cERldmljZS0+YWJ5RUVQUk9NW0VFUF9PRlNfWk9ORVRZUEVdKQogICAgICAgcHJpbnRrKCJ6b25ldHlwZSBpbiBmaWxlWyUwMnhdIG1pc21hdGNoIHdpdGggaW4gRUVQUk9NWyUwMnhdXG4iLHBEZXZpY2UtPmNvbmZpZ19maWxlLlpvbmVUeXBlLHBEZXZpY2UtPmFieUVFUFJPTVtFRVBfT0ZTX1pPTkVUWVBFXSk7CiAgICBlbHNlCi0gICAgICBwcmludGsoIlJlYWQgWm9uZXR5cGUgZmlsZSBzdWNlc3MsdXNlIGRlZmF1bHQgem9uZXR5cGUgc2V0dGluZ1slMDJ4XVxuIixwRGV2aWNlLT5jb25maWdfZmlsZS5ab25lVHlwZSk7CisgICAgICBwcmludGsoIlJlYWQgWm9uZXR5cGUgZmlsZSBzdWNjZXNzLHVzZSBkZWZhdWx0IHpvbmV0eXBlIHNldHRpbmdbJTAyeF1cbiIscERldmljZS0+Y29uZmlnX2ZpbGUuWm9uZVR5cGUpOwogIH0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9jaGFubmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NoYW5uZWwuYwppbmRleCBlNDk3OTZmLi5mNzEzNmIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NoYW5uZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NoYW5uZWwuYwpAQCAtMTksNyArMTksNyBAQAogICoKICAqIEZpbGU6IGNoYW5uZWwuYwogICoKLSAqIFB1cnBvc2U6IENoYW5uZWwgbnVtYmVyIG1hcGluZworICogUHVycG9zZTogQ2hhbm5lbCBudW1iZXIgbWFwcGluZwogICoKICAqIEF1dGhvcjogTHVjYXMgTGluCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZGV2aWNlLmgKaW5kZXggYjAyY2EyZC4uOGI1NDFkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kZXZpY2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RldmljZS5oCkBAIC00NCw3ICs0NCw2IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KQEAgLTg4LDcgKzg3LDYgQEAKIC8vIGRldmljZSBzcGVjaWZpYwogLy8KIAotI2luY2x1ZGUgImtjb21wYXQuaCIKICNpbmNsdWRlICJkZXZpY2VfY2ZnLmgiCiAjaW5jbHVkZSAidHR5cGUuaCIKICNpbmNsdWRlICI4MDIxMWhkci5oIgpAQCAtMTAzLDcgKzEwMSw3IEBACiAjaW5jbHVkZSAiY2FyZC5oIgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBWTlRfVVNCX1ZFTkRPUl9JRCAgICAgICAgICAgICAgICAgICAgIDB4MTYwQQorI2RlZmluZSBWTlRfVVNCX1ZFTkRPUl9JRCAgICAgICAgICAgICAgICAgICAgIDB4MTYwYQogI2RlZmluZSBWTlRfVVNCX1BST0RVQ1RfSUQgICAgICAgICAgICAgICAgICAgIDB4MzE4NAogCiAjZGVmaW5lIE1BQ19NQVhfQ09OVEVYVF9SRUcgICAgICgyNTYrMTI4KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9maXJtd2FyZS5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9maXJtd2FyZS5jCmluZGV4IDUyZGFhM2IuLjU4NWI2YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZmlybXdhcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Zpcm13YXJlLmMKQEAgLTgwMSw3ICs4MDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBCdWZmZXJbaWldKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogCi0gICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIkRvd25sb2FkIGZpcm13YXJlLi4uJWQgJWxkXG4iLCBpaSwgc2l6ZW9mKGFieUZpcm13YXJlKSk7CisgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIkRvd25sb2FkIGZpcm13YXJlLi4uJWQgJXp1XG4iLCBpaSwgc2l6ZW9mKGFieUZpcm13YXJlKSk7CiAgICAgICAgICAgICBpZiAoTmRpc1N0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewogICAgICAgICAgICAgICAgIGlmIChwQnVmZmVyKQogICAgICAgICAgICAgICAgICAgICBrZnJlZShwQnVmZmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaG9zdGFwLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2hvc3RhcC5jCmluZGV4IDBjODI2N2EuLjEwNzhkNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaG9zdGFwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9ob3N0YXAuYwpAQCAtMzcsNyArMzcsNiBAQAogI2luY2x1ZGUgImJhc2ViYW5kLmgiCiAjaW5jbHVkZSAid3BhY3RsLmgiCiAjaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAibWFjLmgiCiAjaW5jbHVkZSAiZGF0YXJhdGUuaCIKIAogI2RlZmluZSBWSUFXR0VUX0hPU1RBUERfTUFYX0JVRl9TSVpFIDEwMjQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaW9jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaW9jdGwuYwppbmRleCBkOTQxMzFmLi42ZjMzMDA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2lvY3RsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pb2N0bC5jCkBAIC0xNTIsNyArMTUyLDcgQEAKIAkgZWxzZSBpZih6b25ldHlwZSA9PSAweDAyKSB7IC8vRXVyb3BlCiAgICAgICAgICAgICAgc1pvbmVUeXBlQ21kLlpvbmVUeXBlID0gWm9uZVR5cGVfRXVyb3BlOwogCSB9Ci0JIGVsc2UgeyAvL1Vua25vdyBab25lVHlwZQorCSBlbHNlIHsgLy9Vbmtub3duIFpvbmVUeXBlCiAJICAgICAgICBwcmludGsoIkVycm9yOlpvbmVUeXBlWyV4XSBVbmtub3duID8/P1xuIix6b25ldHlwZSk7CiAJICAgICAgICAgcmVzdWx0ID0gLUVGQVVMVDsKIAkJYnJlYWs7CkBAIC02NzksNyArNjc5LDcgQEAKICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwRGV2aWNlLT5kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBwSXRlbVNTSUQtPmFieVNTSUQpOwogICAgfQogICAgI2VuZGlmCi0gICAgICAgICBwRGV2aWNlLT5mV1BBX0F1dGhlbmVkID0gVFJVRTsgICAgICAgICAgIC8vaXMgc3VjZXNzZnVsIHBlZXIgdG8gd3BhX1Jlc3VsdC5hdXRoZW50aWNhdGVkPworICAgICAgICAgcERldmljZS0+ZldQQV9BdXRoZW5lZCA9IFRSVUU7ICAgICAgICAgICAvL2lzIHN1Y2Nlc3NmdWwgcGVlciB0byB3cGFfUmVzdWx0LmF1dGhlbnRpY2F0ZWQ/CiB9CiAKICAgICAgICAgLy9wcmludGsoImdldCBwcml2YXRlIHdwYV9zdXBwbGljYW50IGFubm91bmNlIFdQQSBTTVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2l3Y3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2l3Y3RsLmMKaW5kZXggYWE4ZDFhMi4uYjdjNmEyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pd2N0bC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaXdjdGwuYwpAQCAtMTcyNCw3ICsxNzI0LDcgQEAKIAljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6CiAJCS8vcERldmljZS0+YldQQURFVlVwID0gISEgd3JxLT52YWx1ZTsKIAkJLy9pZihwRGV2aWNlLT5iV1BBREVWVXA9PVRSVUUpCi0JCSAgLy8gcHJpbnRrKCJpd2N0bF9zaXdhdXRoOnNldCBXUEFERVYgdG8gZW5hYmxlIHN1Y2Vzc2Z1bCoqKioqKipcbiIpOworCQkgIC8vIHByaW50aygiaXdjdGxfc2l3YXV0aDpzZXQgV1BBREVWIHRvIGVuYWJsZSBzdWNjZXNzZnVsKioqKioqKlxuIik7CiAJCS8vZWxzZQogCQkgLy8gIHByaW50aygiaXdjdGxfc2l3YXV0aDpzZXQgV1BBREVWIHRvIGVuYWJsZSBmYWlsPz8/Pz9cbiIpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYva2NvbXBhdC5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9rY29tcGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZjYzNGMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9rY29tcGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk2LCAyMDAzIFZJQSBOZXR3b3JraW5nLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKgotICogRmlsZToga2NvbXBhdC5oCi0gKgotICogUHVycG9zZTogZGVmaW5lIGtlcm5lbCBjb21wYXRpYmlsaXR5IGhlYWRlcgotICoKLSAqIEF1dGhvcjogTHluZG9uIENoZW4KLSAqCi0gKiBEYXRlOiBBcHIgOCwgMjAwMgotICoKLSAqLwotCi0jaWZuZGVmIF9LQ09NUEFUX0gKLSNkZWZpbmUgX0tDT01QQVRfSAotCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotCi0jaWZuZGVmIEhBVkVfTkVUREVWX1BSSVYKLSNkZWZpbmUgbmV0ZGV2X3ByaXYoZGV2KSAoZGV2LT5wcml2KQotI2VuZGlmCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMKaW5kZXggMDUxODYxMS4uZWYxN2M0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWluX3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFpbl91c2IuYwpAQCAtNjQsMTEgKzY0LDkgQEAKICNpbmNsdWRlICJpb2N0bC5oIgogI2luY2x1ZGUgIml3Y3RsLmgiCiAjaW5jbHVkZSAiZHBjLmgiCi0jaW5jbHVkZSAiaW9jbWQuaCIKICNpbmNsdWRlICJkYXRhcmF0ZS5oIgogI2luY2x1ZGUgInJmLmgiCiAjaW5jbHVkZSAiZmlybXdhcmUuaCIKLSNpbmNsdWRlICJtYWMuaCIKICNpbmNsdWRlICJybmRpcy5oIgogI2luY2x1ZGUgImNvbnRyb2wuaCIKICNpbmNsdWRlICJjaGFubmVsLmgiCkBAIC04MDksMTIgKzgwNyw2IEBACiAgICAgICAgIGtmcmVlKHBEZXZpY2UpOwogICAgICAgICByZXR1cm4gLUVOT0RFVjsKICAgICB9Ci0JLy8yMDA4LTA2MjMtMDI8UmVtYXJrPmJ5IE1pa2VMaXUKLSAgICAgICAgLy8yMDA3LTA4MjEtMDE8QWRkPmJ5IE1pa2VMaXUKLSAgICAgICAvLyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpCi0gIAkvL3VzYl9zZXRfaW50ZmRhdGEoaW50ZiwgcERldmljZSk7Ci0JLy9TRVRfTkVUREVWX0RFVihuZXRkZXYsICZpbnRmLT5kZXYpOwotICAgICAgIC8vI2VuZGlmCiAKIC8vMjAwOC0wNy0yMS0wMTxBZGQ+YnkgTWlrZUxpdQogLy9yZWdpc3RlciB3cGFkZXYKQEAgLTE1NDUsNyArMTUzNyw3IEBACiAgIHJldHVybiBidWZmZXI7CiB9CiAKLS8vcmV0dXJuIC0tLT4tMTpmYWlsOyAgPj0wOnN1Y2Vzc2Z1bAorLy9yZXR1cm4gLS0tPi0xOmZhaWw7ICA+PTA6c3VjY2Vzc2Z1bAogc3RhdGljIGludCBSZWFkX2NvbmZpZ19maWxlKFBTRGV2aWNlIHBEZXZpY2UpIHsKICAgaW50IHJlc3VsdD0wOwogICBVQ0hBUiAgICAgIHRtcGJ1ZmZlclsxMDBdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9taWIuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWliLmgKaW5kZXggYjgwNmI0ZC4uYWM5OTZkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9taWIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21pYi5oCkBAIC0zNTcsMTAgKzM1NywxMCBAQAogICAgI2lmZGVmIENhbGN1X0xpbmtRdWFsCiAgICAgICAgLy9UeCBjb3VudDoKICAgICBVTE9ORyBUeE5vUmV0cnlPa0NvdW50OyAgICAgICAgIC8vc3VjY2VzcyB0eCBubyByZXRyeSAhCi0gICAgVUxPTkcgVHhSZXRyeU9rQ291bnQ7ICAgICAgICAgICAgICAvL3N1Y2VzcyB0eCBidXQgcmV0cnkgIQorICAgIFVMT05HIFR4UmV0cnlPa0NvdW50OyAgICAgICAgICAgICAgLy9zdWNjZXNzIHR4IGJ1dCByZXRyeSAhCiAgICAgVUxPTkcgVHhGYWlsQ291bnQ7ICAgICAgICAgICAgICAgICAgICAgIC8vZmFpbCB0eCA/CiAgICAgICAvL1J4IGNvdW50OgotICAgIFVMT05HIFJ4T2tDbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvL3N1Y2VzcyByeCAhCisgICAgVUxPTkcgUnhPa0NudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3VjY2VzcyByeCAhCiAgICAgVUxPTkcgUnhGY3NFcnJDbnQ7ICAgICAgICAgICAgICAgICAgICAvL2ZhaWwgcnggPwogICAgICAgLy9zdGF0aXN0aWMKICAgICBVTE9ORyBTaWduYWxTdHJlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmMKaW5kZXggOTRkZGY4Yi4uZDlmYTM2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmMKQEAgLTMxNTMsNyArMzE1Myw3IEBACiAgICAgfQogCiAgICAgaWYgKHBEZXZpY2UtPmJFbmFibGVIb3N0V0VQKSB7Ci0gICAgICAgIGlmICh1Tm9kZUluZGV4ID49IDApIHsKKyAgICAgICAgaWYgKHVOb2RlSW5kZXggPCBNQVhfTk9ERV9OVU0gKyAxKSB7CiAgICAgICAgICAgICBwVHJhbnNtaXRLZXkgPSAmU1RlbXBLZXk7CiAgICAgICAgICAgICBwVHJhbnNtaXRLZXktPmJ5Q2lwaGVyU3VpdGUgPSBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmJ5Q2lwaGVyU3VpdGU7CiAgICAgICAgICAgICBwVHJhbnNtaXRLZXktPmR3S2V5SW5kZXggPSBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmR3S2V5SW5kZXg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3djbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd2NtZC5jCmluZGV4IDY5MTIzNDQuLjUxYjJkY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd2NtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd2NtZC5jCkBAIC00OCw3ICs0OCw2IEBACiAjaW5jbHVkZSAid21nci5oIgogI2luY2x1ZGUgInBvd2VyLmgiCiAjaW5jbHVkZSAid2N0bC5oIgotI2luY2x1ZGUgImNhcmQuaCIKICNpbmNsdWRlICJiYXNlYmFuZC5oIgogI2luY2x1ZGUgImNvbnRyb2wuaCIKICNpbmNsdWRlICJyeHR4LmgiCkBAIC0xMzMyLDcgKzEzMzEsNyBAQAogICAgIH0KIAogICBzcGluX2xvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLSAgLy9pcyB3YXBfc3VwcGxpY2FudCBydW5uaW5nIHN1Y2Vzc2Z1bCBPUiBvbmx5IG9wZW4gJiYgc2hhcmVrZXkgbW9kZSEKKyAgLy9pcyB3YXBfc3VwcGxpY2FudCBydW5uaW5nIHN1Y2Nlc3NmdWwgT1Igb25seSBvcGVuICYmIHNoYXJla2V5IG1vZGUhCiAgICNpZiAxCiAgIGlmKCgocERldmljZS0+YkxpbmtQYXNzID09VFJVRSkmJihwTWdtdC0+ZUF1dGhlbk1vZGUgPCBXTUFDX0FVVEhfV1BBKSkgfHwgIC8vb3BlbiAmJiBzaGFyZWtleSBsaW5raW5nCiAgICAgICAocERldmljZS0+ZldQQV9BdXRoZW5lZCA9PSBUUlVFKSkgeyAgIC8vd3BhIGxpbmtpbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd3BhLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3dwYS5jCmluZGV4IGY5MmQzM2YuLjVkYTY3MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd3BhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93cGEuYwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAgICAgICAgIGlmIChwUlNOLT5sZW4gPj0gMTIpIC8vb3VpMSg0KSt2ZXIoMikrR0tTKDQpK1BLU0NudCgyKQogICAgICAgICB7CiAgICAgICAgICAgICBqID0gMDsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8id1BLQ291bnQ6ICVkLCBzaXplb2YocEJTU0xpc3QtPmFieVBLVHlwZSk6ICVsZFxuIiwgcFJTTi0+d1BLQ291bnQsIHNpemVvZihwQlNTTGlzdC0+YWJ5UEtUeXBlKSk7CisgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIndQS0NvdW50OiAlZCwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlQS1R5cGUpOiAlenVcbiIsIHBSU04tPndQS0NvdW50LCBzaXplb2YocEJTU0xpc3QtPmFieVBLVHlwZSkpOwogICAgICAgICAgICAgZm9yKGkgPSAwOyAoaSA8IHBSU04tPndQS0NvdW50KSAmJiAoaiA8IHNpemVvZihwQlNTTGlzdC0+YWJ5UEtUeXBlKS9zaXplb2YoQllURSkpOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZihwUlNOLT5sZW4gPj0gMTIraSo0KzQpIHsgLy9vdWkxKDQpK3ZlcigyKStHS1MoNCkrUEtTQ250KDIpK1BLUyg0KmkpCiAgICAgICAgICAgICAgICAgICAgIGlmICggIW1lbWNtcChwUlNOLT5QS1NMaXN0W2ldLmFieU9VSSwgYWJ5T1VJMDAsIDQpKQpAQCAtMTc4LDcgKzE3OCw3IEBACiAgICAgICAgICAgICAvLyBvdmVybGF5IElFX1JTTl9BdXRoIHN0cnVjdHVyZSBpbnRvIGNvcnJlY3QgcGxhY2UKICAgICAgICAgICAgIHBJRV9SU05fQXV0aCA9IChQV0xBTl9JRV9SU05fQVVUSCkgcFJTTi0+UEtTTGlzdFttXS5hYnlPVUk7CiAgICAgICAgICAgICBqID0gMDsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8id0F1dGhDb3VudDogJWQsIHNpemVvZihwQlNTTGlzdC0+YWJ5QXV0aFR5cGUpOiAlbGRcbiIsCisgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIndBdXRoQ291bnQ6ICVkLCBzaXplb2YocEJTU0xpc3QtPmFieUF1dGhUeXBlKTogJXp1XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwSUVfUlNOX0F1dGgtPndBdXRoQ291bnQsIHNpemVvZihwQlNTTGlzdC0+YWJ5QXV0aFR5cGUpKTsKICAgICAgICAgICAgIGZvcihpID0gMDsgKGkgPCBwSUVfUlNOX0F1dGgtPndBdXRoQ291bnQpICYmIChqIDwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlBdXRoVHlwZSkvc2l6ZW9mKEJZVEUpKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYocFJTTi0+bGVuID49IDE0KzQrKG0raSkqNCkgeyAvL291aTEoNCkrdmVyKDIpK0dLUyg0KStQS1NDbnQoMikrUEtTKDQqbSkrQUtDKDIpK0FLUyg0KmkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjA1M2ZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvS2NvbmZpZwpAQCAtMCwwICsxLDkgQEAKK2NvbmZpZyBXTEFHUzQ5X0gyCisJdHJpc3RhdGUgIkFnZXJlIFN5c3RlbXMgSEVSTUVTIElJIFdpcmVsZXNzIFBDIENhcmQgTW9kZWwgMDExMCIKKwlkZXBlbmRzIG9uIFdMQU5fODAyMTEgJiYgV0lSRUxFU1NfRVhUICYmIFBDTUNJQQorCXNlbGVjdCBXRVhUX1NQWQorCS0tLWhlbHAtLS0KKwkgIERyaXZlciBmb3Igd2lyZWxlc3MgY2FyZHMgdXNpbmcgQWdlcmUncyBIRVJNRVMgSUkgY2hpcHNldAorCSAgd2hpY2ggYXJlIGlkZW50aWZpZWQgd2l0aCBNYW51ZmFjdHVyZSBJRDogMDE1NiwwMDAzCisJICBUaGUgc29mdHdhcmUgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHdsX2xrbV83MjJfYWJnLnRhci5negorCSAgZnJvbSB0aGUgQWdlcmUgU3lzdGVtcyB3ZWJzaXRlLCBhZGRhcHRlZCBmb3IgVWJ1bnR1IDkuMDQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZDBhOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9NYWtlZmlsZQpAQCAtMCwwICsxLDgxIEBACisjCisjIE1ha2VmaWxlIGZvciB3bGFnczQ5X2gyX2NzLmtvIGFuZCB3bGFnczQ5X2gyNV9jcy5rbworIworIyBEZWZhdWx0IGJ1aWxkIGZvciBIZXJtZXMtSUkgYmFzZSBjYXJkcyAocG9zc2libHkgaWRlbnRpZmllZCB3aXRoCisjICJtYW5maWQ6IDB4MDE1NiwgMHgwMDAzIiBpbiAicGNjYXJkY3RsIGlkZW50IiBvdXRwdXQpLCBjb21tZW50CisjIC1ESEVSTUVTMjUgYmVsb3cKKyMKKyMgSWYgeW91IHdhbnQgdG8gYnVpbGQgZm9yIEhlcm1lcy1JSS41IGJhc2UgY2FyZHMgKHBvc3NpYmx5IGlkZW50aWZpZWQgd2l0aAorIyAibWFuZmlkOiAweDAxNTYsIDB4MDAwNCIgaW4gInBjY2FyZGN0bCBpZGVudCIgb3V0cHV0KSwgdW5jb21tZW50CisjIC1ESEVSTUVTMjUgYmVsb3cKKyMKKyMgIElmIHlvdSB3YW50IHRvIGJ1aWxkIEFQIHN1cHBvcnQgKHVudGVzdGVkKSwgY29tbWVudCBvdXQgLURTVEFfT05MWQorCitJTlNUQUxMRElSIDo9IC9saWIvbW9kdWxlcy8kKHNoZWxsIHVuYW1lIC1yKS9rZXJuZWwvZHJpdmVycy9uZXQvd2lyZWxlc3MKK0VYVFJBX0NGTEFHUyArPSAtSSQoS0VSTkVMRElSKS9pbmNsdWRlCitFWFRSQV9DRkxBR1MgKz0gLUkkKHNyYykgXAorCQktREJVU19QQ01DSUEgXAorCQktRFVTRV9XUEEgXAorCQktRFVTRV9XRVhUIFwKKwkJLURTVEFfT05MWSBcCisJCS1EV1ZMQU5fNDkgXAorIwkJLURIRVJNRVMyNSBcCisjCQktRERCRyBcCisjCQktRERCR19MVkw9NSBcCisjCQktRFVTRV9VSUwgXAorIwkJLURVU0VfUFJPRklMRSBcCisKK2lmZXEgKCQoZmluZHN0cmluZyBIRVJNRVMyNSwkKEVYVFJBX0NGTEFHUykpLCkKK1dMTkFNRSA6PSB3bGFnczQ5X2gyX2NzCiskKFdMTkFNRSkteSA6PSBzdGFfaDIubworaWZlcSAoJChmaW5kc3RyaW5nIFNUQV9PTkxZLCQoRVhUUkFfQ0ZMQUdTKSksKQorJChXTE5BTUUpLXkgKz0gYXBfaDIubworZW5kaWYKK2Vsc2UKK1dMTkFNRT13bGFnczQ5X2gyNV9jcworJChXTE5BTUUpLXkgOj0gc3RhX2gyNS5vCitpZmVxICgkKGZpbmRzdHJpbmcgU1RBX09OTFksJChFWFRSQV9DRkxBR1MpKSwpCiskKFdMTkFNRSkteSArPSBhcF9oMjUubworZW5kaWYKK2VuZGlmCisKKyMgSWYgS0VSTkVMUkVMRUFTRSBpcyBkZWZpbmVkLCB3ZSd2ZSBiZWVuIGludm9rZWQgZnJvbSB0aGUKKyMga2VybmVsIGJ1aWxkIHN5c3RlbSBhbmQgY2FuIHVzZSBpdHMgbGFuZ3VhZ2UuCitpZm5lcSAoJChLRVJORUxSRUxFQVNFKSwpCisKK29iai1tCQkrPSAkKFdMTkFNRSkubworCiskKFdMTkFNRSkteSArPQl3bF9wcm9maWxlLm8gXAorCQl3bF93ZXh0Lm8gXAorCQl3bF9wcml2Lm8gXAorCQl3bF9tYWluLm8gXAorCQl3bF9lbmMubyBcCisJCXdsX3V0aWwubyBcCisJCXdsX25ldGRldi5vIFwKKwkJd2xfY3MubyBcCisJCW1tZC5vIFwKKwkJaGNmLm8gXAorCQlkaGYubworCiskKFdMTkFNRSktJChDT05GSUdfU1lTRlMpCSs9IHdsX3N5c2ZzLm8KKworIyBPdGhlcndpc2Ugd2Ugd2VyZSBjYWxsZWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tbWFuZAorIyBsaW5lOyBpbnZva2UgdGhlIGtlcm5lbCBidWlsZCBzeXN0ZW0uCitlbHNlCisJS0VSTkVMRElSID89IC9saWIvbW9kdWxlcy8kKHNoZWxsIHVuYW1lIC1yKS9idWlsZAorCVBXRCA6PSAkKHNoZWxsIHB3ZCkKKworZGVmYXVsdDoKKwkkKE1BS0UpIC1DICQoS0VSTkVMRElSKSBNPSQoUFdEKSBtb2R1bGVzCitlbmRpZgorCitjbGVhbjoKKwlybSAtZnIgKi5vICoua28gKi5tb2QuYyAqLm1vZC5vIC4qLiouY21kIE1vZHVsZS5zeW12ZXJzIFwKKwkJTW9kdWxlLm1hcmtlcnMgbW9kdWxlcy5vcmRlciAudG1wX3ZlcnNpb25zCisKK2luc3RhbGw6IGRlZmF1bHQKKwktcm1tb2QgJChXTE5BTUUpCisJaW5zdGFsbCAtZCAkKElOU1RBTExESVIpCisJaW5zdGFsbCAtbSAwNjQ0IC1vIHJvb3QgLWcgcm9vdCAkKFdMTkFNRSkua28gJChJTlNUQUxMRElSKQorCS9zYmluL2RlcG1vZCAtYXEKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvUkVBRE1FLnVidW50dSBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL1JFQURNRS51YnVudHUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdiZWFlYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL1JFQURNRS51YnVudHUKQEAgLTAsMCArMSwxODAgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitXTEFOIGRyaXZlciBmb3IgY2FyZHMgdXNpbmcgdGhlIEhFUk1FUyBJSSBhbmQgSEVSTUVTIElJLjUgY2hpcHNldAorCitIRVJNRVMgSUkgQ2FyZAorCitQQ01DSUEgSW5mbzogIkFnZXJlIFN5c3RlbXMiICJXaXJlbGVzcyBQQyBDYXJkIE1vZGVsIDAxMTAiCisgICAgICAgICAgICAgTWFudWZhY3R1cmUgSUQ6IDAxNTYsMDAwMworCitIRVJNRVMgSUkuNSBDYXJkCisKK1BDTUNJQSBJbmZvOiAiTGlua3N5cyIgIldDRjU0R19XaXJlbGVzcy1HX0NvbXBhY3RGbGFzaF9DYXJkIgorICAgICAgICAgICAgIE1hbnVmYWN0dXJlIElEOiAwMTU2LDAwMDQKKworQmFzZWQgb24gQWdlcmUgU3lzdGVtcyBMaW51eCBMS00gV2lyZWxlc3MgRHJpdmVyIFNvdXJjZSBDb2RlLAorVmVyc2lvbiA3LjIyOyBjb21wbGllcyB3aXRoIE9wZW4gU291cmNlIEJTRCBMaWNlbnNlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworREVTQ1JJUFRJT04KKworVGhlIHNvZnR3YXJlIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB3bF9sa21fNzIyX2FiZy50YXIuZ3ogZnJvbSB0aGUKK0FnZXJlIFN5c3RlbXMgd2Vic2l0ZSwgYWRkYXB0ZWQgZm9yIFVidW50dSA5LjA0LgorCitNb2RpZmllZCBmb3Iga2VybmVsIDIuNiBieSBIZW5rIGRlIEdyb290IDxwZTFkbm5AYW1zYXQub3JnPgorQmFzZWQgb24gNy4xOCB2ZXJzaW9uIGJ5IEFuZHJleSBCb3J6ZW5rb3YgPGFydmlkamFhckBtYWlsLnJ1PiAkUmV2aXNpb246IDM5ICQKKworSU5TVEFMTEFUSU9OCisKK1VucGFjayBpbiBhIG5ldyBkaXJlY3RvcnkuCisKK09wZW4gYSB0ZXJtaW5hbCBzY3JlZW4uCisKK0NoYW5nZSBkaXJlY3RvcnkgdG8gdGhlIHNvdXJjZSBkaXJlY3RvcnkKKworVHlwZSBjb21tYW5kCisKK21ha2UKKworYW5kIHdhaXQgdW50aWwgaXQgaXMgZmluc2hlZC4gTm93IHlvdSBoYXZlIGJ1aWxkIHRoZSBtb2R1bGUKK3dsYWdzNDlfaDJfY3M7IHRoaXMgbW9kdWxlIGlzIG1lYW50IGZvciBhIEhFUk1FUyBJSSBjYXJkLgorCitUaGUgZHJpdmVyIGlzIHRlc3RlZCB3aXRoIGEgVGhvbXNvbiBTcGVlZFRvdWNoIDExMCBXaXJlbGVzcyBQQyBDYXJkLgorRm9yIHRoZSB0ZXN0IFN0YXRpb24gbW9kZSB3YXMgdXNlZCB3aXRoIFdFUC4gVGhlIGRyaXZlciBpcyBzdXBwb3NlZAordG8gc3VwcG9ydCBXQVAgYW5kIGFzIGFjY2Vzc3BvaW50IHRoYXQgaXMgTk9UIHRlc3RlZC4KKworSWYgeW91IGhhdmUgYSBjYXJkIHVzaW5nIHRoZSBIRVJNRVMgSUkuNSBjaGlwIHlvdSBoYXZlIHRvIG1ha2UKK2NoYW5nZXMgdG8gdGhlIE1ha2VmaWxlIGFuZCB1bmNvbW1lbnQgLURIRVJNRVMyNS4gVGhpcyB3aWxsIGJ1aWxkCitkcml2ZXIgd2xhZ3M0OV9oMjVfY3MuCisKK05vdGU6IFlvdSBjYW4gZGV0ZW1pbmUgdGhlIHR5cGUgd2l0aCBjb21tYW5kICJwY2NhcmRjdHJsIGluZm8iCisgICAgICAgIE1BTklGSUQ6IDAxNTYsMDAwMiA9IEhFUk1FUyAtIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIKKyAgICAgICAgTUFOSUZJRDogMDE1NiwwMDAzID0gSEVSTUVTIElJICAgKFdpcmVsZXNzIEIpCisgICAgICAgIE1BTklGSUQ6IDAxNTYsMDAwNCA9IEhFUk1FUyBJSS41IChXaXJlbGVzcyBCL0cpCisKK0FmdGVyIHN1Y2Nlc2Z1bGwgY29tcGlsZSB0eXBlIGNvbW1hbmQKKworc3VkbyBtYWtlIGluc3RhbGwKKwordG8gaW5zdGFsbCB0aGUgbW9kdWxlLgorCitOb3cgdGhlIGNhcmQgc2hvdWxkIGJlIHJlY29nbml6ZWQuIEl0IHNob3VsZCBiZSBhYmxlIHRvIGNvbmZpZ3VyZQorYW5kIHVzZSB0aGUgY2FyZCB3aXRoIE5ldHdvcmtNYW5hZ2VyLiBXcGFfc3VwcGxpY2FudCBhbHNvIHdvcmtzLCBhcyBkb2VzCittYW51YWwgY29uZmlndXJhdGlvbiB1c2luZyB0aGUgaXdjb25maWcvaXdsaXN0IHByb2dyYW1zLgorCitOb3RlOiBJIG9ubHkgdGVzdGVkIFN0YXRpb24gbW9kZSB3aXRoIFdFUCBidXQgaWYgSSBkaWRuJ3QgYnJlYWsgYW55dGhpbmcKK1dQQSBhbmQgQVAgbW9kZSBzaG91bGQgYWxzbyB3b3JrOyBub3RlIGhvd2V2ZXIgdGhhdCBXUEEgd2FzIGV4cGVyaW1lbnRhbAoraW4gdGhlIG9yaWdpbmFsIEFnZXJlIGRyaXZlciEKKworTm90ZTogdG8gY29tcGlsZSBhcyBBUCBjaGFuZ2UgdGhlIG1ha2VmaWxlIGFuZCByZW1vdmUgdGhlIGxpbmUKKy1EU1RBX09OTFkgXAorCisob3IgY29tbWVudCBpdCwgYnV0IGluIHRoYXQgY2FzZSBtYWtlIHN1cmUgdG8gbW92ZSBpdCBhZnRlciBhbGwgdGhlCisgZmxhZ3MgeW91IHdhbnQgdG8gdXNlKQorCitDSEFOR0VTCisKK1RoZSBIQ0YgZnVuY3Rpb25zIHRvIGNvbnRyb2wgdGhlIGNhcmQgYXJlIHZpcnR1YWxseSB1bmNoYW5nZWQsIHRoZSBvbmx5CitjaGFuZ2VzIGFyZSBtZWFudCB0byBmaXggY29tcGlsZXIgd2FybmluZ3MuIFRoZSBvbmx5IHJlYWwgY2hhbmdlIGlzIGluCitIQ0ZfV0FJVF9XSElMRSB3aGljaCBub3cgaGFzIGEgdWRlbGF5KDIpIGFkZGVkIHRvIGdpdmUgYSBzbWFsbCBkZWxheS4KKworVGhlIGxpbnV4IGRyaXZlciBmaWxlcyAod2xfeHh4eC5jKSBhcmUgY2hhbmdlZCBpbiB0aGUgZm9sbG93aW5nIHdheXM6CistIEFkZGFwdGF0aW9ucyBvZiBBbmRyZXkgQm9yemVua292IGFwcGxpZWQgdG8gNy4yMiBzb3VyY2UKKy0gQWx0ZXJhdGlvbnMgdG8gYXZvaWQgbW9zdCBIQ0ZfQVNTRVJUcworLS0gU3dpdGNoaW5nIGludGVycnVwdHMgb2ZmIGFuZCBvbiBpbiB0aGUgSENGCistLSBCdWdmaXhlcywgdGhpbmdzIHRoYXQgd2VyZSBhcGFyZW50bHkgd3JvbmcgbGlrZSByZXBvcnRpbmcgbGluayBzdGF0dXMKKyAgIGNoYW5nZSB3aGljaCBjaGVja2VkIGEgdmFyaWFibGUgdGhhdCB3YXMgbm90IGNoYW5nZWQgaW4gSENGIGFueW1vcmUuCistLSBVc2VkIG9uIFdFUCBidXQgc2V0dGluZyBrZXlzIHZpYSBTSU9DU0lXRU5DT0RFRVhUIHdhcyBub3Qgc3VwcG9ydGVkCistLSBSZWNvdmVyeSBhY3Rpb25zIGFkZGVkCisKK1RoZSBtYWpvciBwcm9ibGVtIHdhcyB0aGUgb3JkZXIgaW4gd2hpY2ggY2FsbHMgY2FuIGJlIG1hZGUuIFRoZSBvcmlnaW5hbAorbG9va3MgbGlrZSBhIHRyYWRpdG9uYWwgVU5JWCBkcml2ZXIuIFRvIGNhbGwgYW4gImlvY3RsIiBmdW5jdGlvbiB5b3UKK2hhdmUgdG8gIm9wZW4iIHRoZSBkZXZpY2UgZmlyc3QgdG8gZ2V0IGEgaGFuZGxlIGFuZCBhZnRlciAiY2xvc2UiIG5vCisiaW9jdGwiIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgYW55bW9yZS4gV2l0aCB0aGUgMi42IGRyaXZlciB0aGlzIGFsbAorY2hhbmdlZDsgdGhlIGZvcm1lciBpb2N0bCBmdW5jdGlvbnMgYXJlIG5vdyBjYWxsZWQgYmVmb3JlICJvcGVuIiBhbmQKK2FmdGVyICJjbG9zZSIsIHdoaWNoIHdhcyBub3QgZXhwZWN0ZWQuIE9uZSBvZiB0aGUgcHJvYmxlbXMgd2FzIGVuYWJsZS8KK2Rpc2FibGUgb2YgaW50ZXJydXB0cyBpbiB0aGUgSENGLiBJbnRlcnJ1cHQgaGFuZGxpbmcgc3RhcnRzIGF0ICJvcGVuIgorc28gaWYgYSBmb3JtZXIgImlvY3RsIiByb3V0aW5nZSBpcyBjYWxsZWQgYmVmb3JlICJvcGVuIiBvciBhZnRlciAiY2xvc2UiCit0aGVuIG5vdGhpbmcgc2hvdWxkIGJlIGRvbmUgd2l0aCBpbnRlcnJ1cHQgc3dpdGNoaW5nIGluIHRoZSBIQ0YuIE9uY2UKK3RoaXMgd2FzIHNvbHZlZCBtb3N0IEhDRl9BU1NFUlRTIHdlbnQgYXdheS4KKworVGhlIGxhc3QgcG9pbnQsIHJlY292ZXJ5IGFjdGlvbnMgYWRkZWQsIG5lZWRzIHNvbWUgY2xhcmlmaWNhdGlvbi4KK1N0YXJ0aW5nIHRoZSBjYXJkIHdvcmtzIG1vc3Qgb2YgdGhlIHRpbWUsIGJ1dCB1bmZvcnR1bmF0ZWx5IG5vdCBhbHdheXMuCitBdCBhIGZldyB0aW1lcyByZWNvdmVyeSBjb2RlIHdhcyBhZGRlZDsgd2hlbiB0aGUgY2FyZCBzdGFydHMgdG8KK21pc2JlaGF2ZSBvciB0aGUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBIQ0YgYW5kIHRoZSBjYXJkIGlzCitvdXQgb2Ygc3luYyBhbmQgdGhlIEhDRiBlbnRlcnMgREVGVU5DVCBtb2RlIGV2ZXJ5dGhpbmcgaXMgcmVzZXQgYW5kCityZWluaXRpYWxpemVkLiBOb3RlLCBoY2YuYyBjb250YWlucyBhIGxvdCBvZiBkb2N1bWVudGF0aW9uLiBJdCB0YWtlcworc29tZSB0aW1lIGJ1dCBzbG93bHkgc29tZSB0aGluZ3MgYmVjb21lIGNsZWFyLiBBbHNvIHNvbWUgdW5yZXNvbHZlZAoraXNzdWVzIGFyZSBtZW50aW9uZWQgaW4gaGNmLmMsIHNvIHRoZXJlIGFyZSBzdGlsbCB1bmtub3duIGJ1Z3MuCisKK1RoZSBjYXJkIHByb2JsZW1zIGFyZSBhbG1vc3QgaW4gYWxsIGNhc2VzIHdoZW4gc3RhcnRpbmcgdXAgYW5kIGJlZm9yZQordGhlIGZpcnN0IGFzc29jaWF0aW9uIHdpdGggYW4gQVAsIG9uY2UgdGhlIGNhcmQgaXMgaW4gb3BlcmF0aW9uIGl0CitzZWVtcyB0byBzdGF5IHRoYXQgd2F5OyB3aGVuIGRlYnVnZ2luZyBubyBIQ0ZfQVNTRVJUUyBhcHBlYXIgYW55bW9yZS4KK05vdGU6IHNvbWUgSENGX0FTU0VSVFMgc3RpbGwgYXBwZWFyLCBpbiBhIG51bWJlciBvZiBjYXNlcyBpdCBpcyBhIHJlYWwKK2Vycm9yLCBmb3IgZXhhbXBsZSBhdCBjYXJkIHJlbW92YWwgdGhlIG1pc3NpbmcgY2FyZCBpcyBkZXRlY3RlZC4KKworTElDRU5TRQorCitUaGUgQWdlcmUgU3lzdGVtcyBsaWNlbnNlIGFwcGxpZXMuIFRoaXMgaXMgd2h5IEkgaW5jbHVkZSB0aGUgb3JpZ2luYWwKK1JFQURNRS53bGFnczQ5LiBUaGUgaW5zdHJ1Y3Rpb25zIGluIHRoYXQgZmlsZSBhcmUgYm9ndXMgbm93LiBJIGFsc28KK2luY2x1ZGUgdGhlIG1hbiBwYWdlLiBFdmVudGhvdWdoIHNldHRpbmcgcGFyYW1ldGVycyBvbiB0aGUgbW9kdWxlCitkb2VzIG5vdCB3b3JrIGFueW1vcmUgYnV0IGl0IHByb3ZpZGVzIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgYWxsIHRoZQorc2V0dGluZ3MuCisKK0kgaGF2ZSBub3QgaGF2ZSBwZXJzb25hbCBjb250YWN0IHdpdGggQWdlcmUsIGJ1dCBvdGhlcnMgaGF2ZS4gQWdlcmUKK2FncmVlZCB0byBtYWtlIHRoZWlyIHNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgQlNEIGxpY2VuY2UuCitUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiB0aGUgNy4yMiB2ZXJzaW9uLgorCitUaGUgZm9sbG93aW5nIHdhcyBtYWlsZWQgYnkgQWdlcmUgdG8gQW5kcmV5IEJvcnplbmtvdiBhYm91dCB0aGlzOgorCisgICAgLS0tIEJlZ2luIE1lc3NhZ2UgLS0tCisKKyAgICAgICAgKiBGcm9tOiBUSiA8dGpAeHh4eHh4eHh4eHg+CisgICAgICAgICogRGF0ZTogTW9uLCAwNSBGZWIgMjAwNyAxOToyODo1OSArMDAwMAorCisgICAgSGkgQW5kcmV5LAorCisgICAgSSd2ZSBnb3Qgc29tZSBnb29kIG5ld3MgZm9yIHlvdS91cy90aGUgd29ybGQgb2YgSGVybWVzIDopCisKKyAgICBJIGdvdCBhIHJlcGx5IGZyb20gdGhlIGxlZ2FsIHJlcHJlc2VudGF0aXZlIGF0IEFnZXJlIGNvbmZpcm1pbmcgdGhhdAorICAgIHRoZWlyIHNvdXJjZS1jb2RlIGlzIEJTRCBsaWNlbnNlZCwgYW5kIEkndmUgaW5jbHVkZWQgdGhlIGNvbnRlbnRzIG9mIHRoZQorICAgIGVtYWlsIGhlcmUuCisKKyAgICBJIGhvcGUgdGhpcyByZS1hc3N1cmVzIHlvdSBzbyB0aGF0IHlvdXIgZXhjZWxsZW50IHdvcmsgb24gdGhlIGRyaXZlcnMKKyAgICBjYW4gYmUgbWFkZSB3aWRlbHkgYXZhaWxhYmxlIGZvciBvdGhlciBoYWNrZXJzIHRvIHdvcmsgd2l0aC4KKworICAgIFJlZ2FyZHMsCisKKyAgICBUSi4KKworICAgIC0tLS0tLS0tLQorICAgIE9uIE1vbiwgMjAwNy0wMi0wNSBhdCAxMzo1NCAtMDUwMCwgUGF0aGFyZSwgVmlyZW4gTSAoVmlyZW4pIHdyb3RlOgorCisKKyAgICAiSSB3b3VsZCBsaWtlIHRvIGNvbmZpcm0gdGhhdCB0aGUgdHdvIGRyaXZlcnM7IExpbnV4IExLTSBXaXJlbGVzcyBEcml2ZXIKKyAgICBTb3VyY2UgQ29kZSwgVmVyc2lvbiA3LjE4IGFuZCBMaW51eCBMS00gV2lyZWxlc3MgRHJpdmVyIFNvdXJjZSBDb2RlLAorICAgIFZlcnNpb24gNy4yMiBjb21wbHkgd2l0aCBPcGVuIFNvdXJjZSBCU0QgTGljZW5zZS4gVGhlcmVmb3JlIHRoZSBzb3VyY2UKKyAgICBjb2RlIGNhbiBiZSBkaXN0cmlidXRlZCBpbiB1bm1vZGlmaWVkIG9yIG1vZGlmaWVkIGZvcm0gY29uc2lzdGVudCB3aXRoCisgICAgdGhlIHRlcm1zIG9mIHRoZSBsaWNlbnNlLgorCisgICAgVGhlIExpbnV4IGRyaXZlciBhcmNoaXRlY3R1cmUgd2FzIGJhc2VkIG9uIHR3byBtb2R1bGVzLCB0aGUgTVNGIChNb2R1bGUKKyAgICBzcGVjaWZpYyBmdW5jdGlvbnMpIGFuZCB0aGUgSENGIChIYXJkd2FyZSBDb250cm9sIEZ1bmN0aW9ucykuIEluY2x1ZGVkCisgICAgaW4gdGhlIEhDRiBpcyBydW4tdGltZSBmaXJtd2FyZSAoYmluYXJ5IGZvcm1hdCkgd2hpY2ggaXMgZG93bmxvYWRlZCBpbnRvCisgICAgdGhlIFJBTSBvZiB0aGUgSGVybWVzIDEvMi8yLjUgV01BQy4KKworICAgIFRoaXMgaGV4IGNvZGVkIGZpcm13YXJlIGlzIG5vdCBiYXNlZCBvbiBhbnkgb3BlbiBzb3VyY2Ugc29mdHdhcmUgYW5kCisgICAgaGVuY2UgaXQgaXMgbm90IHN1YmplY3QgdG8gYW55IE9wZW4gU291cmNlIExpY2Vuc2UuIFRoZSBmaXJtd2FyZSB3YXMKKyAgICBkZXZlbG9wZWQgYnkgQWdlcmUgYW5kIHJ1bnMgb24gdGhlIERJU0MgcHJvY2Vzc29yIGVtYmVkZGVkIHdpdGhpbiB0aGUKKyAgICBIZXJtZXMgMS8yLzIuNSBXaXJlbGVzcyBNQUMgZGV2aWNlcy4KKworICAgIEhvcGUgdGhpcyBoZWxwcy4KKworICAgIFNpbmNlcmVseSwKKworICAgIFZpcmVuIFBhdGhhcmUKKyAgICBJbnRlbGxlY3R1YWwgUHJvcGVydHkgTGljZW5zaW5nIE1hbmFnZXIKKyAgICBBZ2VyZSIKKworCisKKyAgICAtLS0gRW5kIE1lc3NhZ2UgLS0tCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL1JFQURNRS53bGFnczQ5IGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvUkVBRE1FLndsYWdzNDkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4NmZkMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL1JFQURNRS53bGFnczQ5CkBAIC0wLDAgKzEsNjQxIEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FnZXJlIFN5c3RlbXMgSW5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEp1bHkgMjAwNAorUmVhZG1lIGZvciBMaW51eCBEcml2ZXIgU291cmNlIGZvciBXYXZlbGFuICAgICAgICAgICAgICAgICAgIFZlcnNpb246IDcuMjItYWJnCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyB0ZXh0IGZpbGUgaW5jbHVkZXMgdXBkYXRlIGluZm9ybWF0aW9uLCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLAorbGltaXRhdGlvbnMgdG8gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgcHJvZHVjdCwgYW5kIHN1Z2dlc3Rpb25zIHRvIHNvbHZlCitrbm93biBpc3N1ZXMgb3IgcHJvYmxlbXMuCisKKworVEFCTEUgT0YgQ09OVEVOVFMuCisKKzEuICBERVNDUklQVElPTgorMi4gIFNZU1RFTSBSRVFVSVJFTUVOVFMKKzMuICBORVcgSU4gVEhJUyBSRUxFQVNFCis0LiAgSU5TVEFMTEFUSU9OIE5PVEVTCis1LiAgVEVDSE5JQ0FMIENPTlNUUkFJTlRTCis2LiAgS05PV04gSVNTVUVTCis3LiAgVEVDSE5JQ0FMIFNVUFBPUlQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxLiAgREVTQ1JJUFRJT04KKworICAgIFdpdGggdGhpcyBwYWNrYWdlLCB5b3UgY2FuIGJ1aWxkIGFuZCBpbnN0YWxsIGEgV2lyZWxlc3MgZHJpdmVyIGZvciBhCisgICAgc3BlY2lmaWMgTGludXgga2VybmVsLgorCisgICAgVGhlIGRyaXZlciBpbiB0aGlzIHBhY2thZ2Ugc3VwcG9ydHMgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGNhcmRzIGJhc2VkIG9uOgorICAgICAtIFdMNjAwMTAsIGEuay5hLiBIZXJtZXMtSUkKKyAgICAgLSBXTDYwMDQwLCBhLmsuYS4gSGVybWVzLUlJLjUKKworICAgIEFsdGhvdWdoIGRlcml2ZWQgZnJvbSB0aGUgSGVybWVzLUkvSUkgTGludXggZHJpdmVyLCB0aGlzIHJlbGVhc2UgT05MWQorICAgIFN1cHBvcnRzIEhlcm1lcy1JSS9JSS41IGNoaXBzZXRzLiAgSGVybWVzLUkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KKworICAgIFRoZSBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiBhIGNvbXByZXNzZWQgc291cmNlIGZpbGUgYXJjaGl2ZToKKyAgICAgLSB3bF9sa21fN18yMl9hYmcudGFyLmd6CisKKyAgICBCZWNhdXNlIHRoaXMgcmVsZWFzZSBzdXBwb3J0cyBtb3JlIHRoYW4gb25lIEhlcm1lcyBDUFUgYW5kIGJ1cworICAgIGFyY2hpdGVjdHVyZSwgYSBuYW1pbmcgY29udmVudGlvbiBpcyB1c2VkIGZvciB0aGUgcmVzdWx0aW5nIGJpbmFyaWVzIHRoYXQKKyAgICBjYW4gYmUgYnVpbHQgZnJvbSB0aGlzIHNvdXJjZSBjb2RlLiBEcml2ZXIgYmluYXJpZXMgYXJlIG5hbWVkIGFzIGZvbGxvd3M6CisKKyAgICB3bGFnczQ5XzxoZXJtZXNfdHlwZT5fPGJ1c19hcmNoPi5vCisKKyAgICB3aGVyZSAnd2xhZ3M0OScgZGVub3RlcyBhbiBBZ2VyZSBXYXZlTGFuIExpbnV4IGJ1aWxkLAorCisgICAgPGhlcm1lc190eXBlPiBpczogJ2gyJyBmb3IgSGVybWVzLUlJLCAnaDI1JyBmb3IgSGVybWVzLUlJLjUKKworICAgIDxidXNfYXJjaD4gaXM6ICdjcycgZm9yIENhcmQgU2VydmljZXMgKFBDTUNJQSwgQ29tcGFjdCBGbGFzaCksIFBDSSBmb3IKKyAgICBQQ0kgb3IgTWluaVBDSS4KKworICAgIEZvciBleGFtcGxlLCBhIGRyaXZlciBidWlsdCBmb3IgSGVybWVzLUlJIENhcmQgU2VydmljZXMgKFBDTUNJQS9Db21wYWN0CisgICAgRmxhc2gpIGlzIG5hbWVkIHdsYWdzNDlfaDJfY3Mubywgd2hlcmVhcyBhIGRyaXZlciBidWlsdCBmb3IgSGVybWVzLUlJCisgICAgTWluaVBDSSBpcyBuYW1lZCB3bGFnczQ5X2gyX3BjaS5vLgorICAgIFRoZSBmb2xsb3dpbmcgc29mdHdhcmUgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbjoKKworICAgIEdlbmVyYWwgaW5mb3JtYXRpb246CisgICAgKiBSRUFETUUud2xhZ3M0OSAgICAgICAgICAgICAgVGhpcyBmaWxlCisgICAgKiBMSUNFTlNFLndsYWdzNDkgICAgICAgICAgICAgTGljZW5zZQorICAgICogd2xhZ3M0OS5tayAgICAgICAgICAgICAgICAgIFRvcCBsZXZlbCBNYWtlZmlsZQorICAgICogQnVpbGQgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdCB0byBidWlsZCBkcml2ZXIKKyAgICAqIEluc3RhbGwgICAgICAgICAgICAgICAgICAgICBTY3JpcHQgdG8gaW5zdGFsbCBkcml2ZXIKKworICAgIERyaXZlciBzb3VyY2U6CisgICAgKiB3aXJlbGVzcy8gICAgICAgICAgICAgICAgICAgTVNGIHNvdXJjZQorICAgICogaGNmLyAgICAgICAgICAgICAgICAgICAgICAgIEhDRiBhbmQgRi9XIHNvdXJjZQorICAgICogd2lyZWxlc3Mvd2xhZ3M0OV9jcy5tayAgICAgIERyaXZlciBNYWtlZmlsZSwgUEMgQ2FyZAorICAgICogd2lyZWxlc3Mvd2xhZ3M0OV9wY2kubWsgICAgIERyaXZlciBNYWtlZmlsZSwgUENJCisgICAgKiBpbmNsdWRlL2hjZi9kZWJ1Zy5oICAgICAgICAgRHJpdmVyIGRlYnVnIHN1cHBvcnQKKyAgICAqIGluY2x1ZGUvaGNmL2hjZmNmZy5oICAgICAgICBIZWFkZXIgdG8gY29uZmlndXJlIEhDRgorICAgICogaW5jbHVkZS93aXJlbGVzcy8qLmggICAgICAgIERyaXZlciBzb3VyY2UgaGVhZGVycworCisgICAgRHJpdmVyIG9ubGluZSBtYW51YWwgcGFnZToKKyAgICAqIG1hbi93bGFnczQ5LjQgICAgICAgICAgICAgICBEcml2ZXIgbWFudWFsIHBhZ2UKKworICAgIFBDTUNJQSBjb25maWd1cmF0aW9uIHVwZGF0ZToKKyAgICAqIGV0Yy93bGFnczQ5LmNvbmYgICAgICAgICAgICBBZGQtb24gY29uZmlnIGZpbGUKKyAgICAqIGV0Yy93bGFnczQ5Lm1rICAgICAgICAgICAgICBjb25maWcgdXBkYXRlIE1ha2VmaWxlCisgICAgKiBldGMvd2xhZ3M0OS5wYXRjaCAgICAgICAgICAgY29uZmlnIHVwZGF0ZSBwYXRjaCBmaWxlCisKKyAgICBUaGUgZHJpdmVyIGlzIGJ1aWxkIHVwIG9mIDIgbW9kdWxlczoKKyAgICAgLSBhIGhpZ2hlciBtb2R1bGUgY2FsbGVkIE1vZHVsZSBTcGVjaWZpYyBGdW5jdGlvbnMgKE1TRiksIHdoaWNoIGNvbnRhaW5zCisgICAgICAgdGhlIGZ1bmN0aW9ucyBvZiB0aGUgZHJpdmVyIHRoYXQgYXJlIG5ldHdvcmsgZHJpdmVyIGludGVyZmFjZSBhbmQKKyAgICAgICBPcGVyYXRpbmcgU3lzdGVtIHNwZWNpZmljLgorICAgICAtIGEgbG93ZXIgbW9kdWxlIGNhbGxlZCBIYXJkd2FyZSBDb250cm9sIEZ1bmN0aW9ucyAoSENGKSwgd2hpY2ggY29udGFpbnMKKyAgICAgICB0aGUgZnVuY3Rpb25zIHRvIGludGVyZmFjZSB0byB0aGUgTmV0d29yayBJbnRlcmZhY2UgQ2FyZCAoTklDKS4gIFRoZSBIQ0YKKyAgICAgICBwcm92aWRlcyBmb3IgYWxsIFdhdmVMQU4gTklDIHR5cGVzIG9uZSBzdGFuZGFyZCBpbnRlcmZhY2UgdG8gdGhlIE1TRi4KKyAgICAgICBUaGlzIEkvRiBpcyBjYWxsZWQgdGhlIFdpcmVsZXNzIENvbm5lY3Rpb24gSW50ZXJmYWNlIChXQ0kpIGFuZCBpcyB0aGUKKyAgICAgICBzdWJqZWN0IG9mIGEgc2VwZXJhdGUgZG9jdW1lbnQgKDAyNTcyNikuCisKKyAgICBUaGUgSENGIGRpcmVjdG9yeSBjb250YWlucyBmaXJtd2FyZSBpbWFnZXMgdG8gYWxsb3cgdGhlIGNhcmQgdG8gb3BlcmF0ZSBpbgorICAgIGVpdGhlciBzdGF0aW9uIChTVEEpIG9yIEFjY2VzcyBQb2ludCAoQVApIG1vZGUuIEluIHRoZSBidWlsZCBwcm9jZXNzLCB0aGUKKyAgICBmaWxlcyBmd19oMi5jIGFuZCBmd19oMjUuYyBhcmUgdXNlZCBmb3IgSGVybWVzLUlJIGFuZCBIZXJtZXMtSUkuNQorICAgIHJlc3BlY3RpdmVseS4gVGhlIGZpcm13YXJlIGltYWdlcyBpbiB0aGlzIHJlbGVhc2UgYXJlIGlkZW50aWZpZWQgYXM6CisJIC0gSElJIFN0YXRpb24gRi9XOiAgICAgIGZ3X2gyLmMuc3RhCisJIC0gSElJLjUgU3RhdGlvbiBGL1c6ICAgIGZ3X2gyNS5jLnN0YQorCSAtIEhJSSBBY2Nlc1BvaW50IEYvVzogICBmd19oMi5jLmFwCisJIC0gSElJLjUgQWNjZXNQb2ludCBGL1c6IGZ3X2gyNS5jLmFwCisJVG8gYnVpbGQgYSBTVEEgb3IgQVAgbW9kZSBkcml2ZXIsIHRoZSBzdWZmaXggLnN0YSBvciAuYXAgbXVzdCBiZSByZW1vdmVkLgorCVRoZSBmaWxlcyBhcyBkaXN0cmlidXRlZCBieSB0aGlzIHJlbGVhc2UgYnVpbGQgU1RBIGRyaXZlcnMgYnkgZGVmYXVsdC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyLiAgU1lTVEVNIFJFUVVJUkVNRU5UUworCisyLjEgT3BlcmF0aW5nIFN5c3RlbQorCisgICAgVGhpcyBzb2Z0d2FyZSBjYW4gYmUgY29tcGlsZWQgYW5kIGluc3RhbGxlZCB3aXRoIExpbnV4IGtlcm5lbCB2ZXJzaW9ucworICAgIDIuNC54LiBBbHRob3VnaCB0aGlzIGRyaXZlciBzaG91bGQgY29tcGlsZSBmb3Igb3RoZXIgQ1BVcyBhcyB3ZWxsLCBhcyBvZgorICAgIHRoZSBkYXRlIG9mIHRoaXMgcmVsZWFzZSwgbm8gQ1BVIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB4ODYgaGF2ZSBiZWVuCisgICAgdmVyaWZpZWQuCisKKyAgICB3bF9sa21fN18yMl9hYmcgaXMgdGVzdGVkIHdpdGggdGhlIGZvbGxvd2luZyBMaW51eCBEaXN0cmlidXRpb25zOgorICAgICogUmVkIEhhdCB2ZXJzaW9uIDkuMAorICAgICogU3VzZSAgICB2ZXJzaW9uIDkuMAorCisgICAgSWYgeW91J3JlIGJ1aWxkaW5nIGZvciBQQyBDYXJkIG9yIENvbXBhY3QgRmxhc2gsIHlvdSBuZWVkIHRoZSBDYXJkIFNlcnZpY2VzCisgICAgZnJvbSBEYXZpZCBIaW5kcy4KKworICAgIHdsX2xrbV83XzIyX2FiZyBpcyB0ZXN0ZWQgd2l0aDoKKyAgICAqIHBjbWNpYS1jcy0zLjIuNy50YXIuZ3oKKworMi4yIEZyZWUgRGlzayBTcGFjZQorCisgICAgVG8gY29tcGlsZSB0aGUgc29mdHdhcmUgeW91IG5lZWQgdG8gaGF2ZSB0aGUgZnVsbCBzZXQgb2YgTGludXgga2VybmVsCisgICAgc291cmNlIGZpbGVzIGluc3RhbGxlZCwgYXMgd2VsbCBhcyBhIHNhbmUgYnVpbGQgZW52aXJvbm1lbnQgd2hpY2ggaW5jbHVkZXMKKyAgICBhbGwgdG9vbHMgbmVjZXNzYXJ5IGZvciBjb21waWxpbmcgYW5kIGxpbmtpbmcgY29kZS4gRGVwZW5kaW5nIG9uIHRoZSBleGFjdAorICAgIHZlcnNpb24gb2YgdGhlIGtlcm5lbCwgeW91IG5lZWQgYXBwcm94aW1hdGVseSAxNTAgTUIgb2YgZnJlZSBkaXNrIHNwYWNlLgorICAgIE9uY2UgY29tcGlsZWQsIHRoZSBkcml2ZXIgdXNlcyBhYm91dCAxNTAtMjAwIEtCLiAgUGxlYXNlIG5vdGUsIHRoaXMgc2l6ZSBpcworICAgIGFwcHJveGltYXRlIGFuZCBjYW4gdmFyeSBkZXBlbmRpbmcgb24gd2hpY2ggdmVyc2lvbiBvZiB0aGUgZHJpdmVyIGlzIGJ1aWx0LgorICAgIEluIGFkZGl0aW9uLCBhZGRpbmcgZGVidWcgdHJhY2luZyBzdXBwb3J0IGluY3JlYXNlcyB0aGlzIHNpemUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMy4gIE5FVyBJTiBUSElTIFJFTEVBU0UKKworVmVyc2lvbiA3LjIyIGFiZyAtIEp1bHkgMjgsIDIwMDQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis0LiAgSU5TVEFMTEFUSU9OIE5PVEVTCisKKyAgICBUaGUgZHJpdmVyIGZpbGVzIGZvciB0aGUgTGludXggZHJpdmVyIGFyZSBub3QgInJlYWR5IiBmb3IgZGlyZWN0CisgICAgaW5zdGFsbGF0aW9uIG9udG8gYW55IExpbnV4IGNvbXB1dGVyLiAgVG8gYnVpbGQgYW5kIGluc3RhbGwgdGhlIGRyaXZlciB5b3UKKyAgICBuZWVkIHNvbWUgZXhwZXJ0aXNlIG9uIHRoZSBMaW51eCBvcGVyYXRpbmcgc3lzdGVtIGluIGdlbmVyYWwgYW5kIHRoZSB0eXBlCisgICAgYW5kIHZlcnNpb24gaW5zdGFsbGVkIG9mIHRoZSBrZXJuZWwgaW5zdGFsbGVkIG9uIHlvdXIgY29tcHV0ZXIuICBXaXRoIHRoaXMKKyAgICBrbm93bGVkZ2UgeW91IGNhbiB1c2UgdGhlIGRyaXZlciBzb3VyY2UgZmlsZXMgcHJvdmlkZWQgdG8gYnVpbGQgeW91ciBvd24KKyAgICBMaW51eCBkcml2ZXIgZm9yIHlvdXIgc3BlY2lmaWMgY29tcHV0ZXIgYW5kIGtlcm5lbC4KKworNC4xIEJlZm9yZSB5b3Ugc3RhcnQKKworICAgIDEpIERldGVybWluZSB0aGUgdHlwZSBhbmQgdmVyc2lvbiBvZiB0aGUgTGludXgga2VybmVsIG9mIHlvdXIgY29tcHV0ZXIgYW5kCisgICAgY2hlY2sgd2hldGhlciBpdCBtZWV0cyB0aGUgc3lzdGVtIHJlcXVpcmVtZW50cyBsaXN0ZWQgaW4gc2VjdGlvbiAyIG9mIHRoaXMKKyAgICBSRUFETUUuCisKKyAgICAyKSBJZiB5b3UncmUgYnVpbGRpbmcgZm9yIFBDIENhcmQgb3IgQ29tcGFjdCBGbGFzaCwgcmVhZCB0aGUgTGludXgKKyAgICBQQ01DSUEtSE9XVE8gYnkgRGF2aWQgSGluZHMuIFRoaXMgZG9jdW1lbnQgaXMgcHJvYmFibHkgcHJvdmlkZWQgb24gdGhlCisgICAgQ0QtUk9NIG9mIHlvdXIgTGludXggZGlzdHJpYnV0aW9uLiBZb3UgY2FuIGRvd25sb2FkIHRoZSBsYXRlc3QgdmVyc2lvbgorICAgIGZyb206CisKKyAgICAgICAgaHR0cDovL3BjbWNpYS1jcy5zb3VyY2Vmb3JnZS5uZXQKKworICAgUGxlYXNlIHJlYWQgdGhlIHNlY3Rpb24gdGl0bGVkICJQcmVyZXF1aXNpdGVzIGFuZCBrZXJuZWwgc2V0dXAiIG9mIHRoZQorICAgUENNQ0lBLUhPV1RPLgorCis0LjIgQnVpbGQgdGhlIGRyaXZlciBmb3IgUEMgQ2FyZCAvIENvbXBhY3QgRmxhc2gKKworICAgIDEpIE9idGFpbiBhIGNvcHkgb2YgdGhlIExpbnV4IFBDTUNJQSBwYWNrYWdlIGZyb20gYSBDRC1ST00gb2YgeW91ciBMaW51eAorICAgIGRpc3RyaWJ1dGlvbiBvciBkb3dubG9hZCB0aGUgbGF0ZXN0IHZlcnNpb24uCisgICAgRm9yIHlvdXIgY29udmVuaWVuY2UsIHRoZSBBZ2VyZSBTeXN0ZW1zIFdpcmVsZXNzIENELVJPTSBjb250YWlucyBhIGNvcHkgb2YKKyAgICB0aGUgUENNQ0lBIHBhY2thZ2UgaW4gc3ViLWRpcmVjdG9yeTogWHRyYXMvTGludXgvUENNQ0lBCisKKyAgICAyKSBUbyB1bnBhY2sgdGhlIExpbnV4IFBDTUNJQSBwYWNrYWdlLCBjb3B5IGl0IHRvIHRoZSBjdXJyZW50IHdvcmtpbmcKKyAgICBkaXJlY3RvcnkgYW5kIHR5cGU6CisgICAgICAgJSB0YXIgeHp2ZiBwY21jaWEtY3MteC55LnoudGFyLmd6CisgICAgICAgJSBtdiBwY21jaWEtY3MteC55LnogcGNtY2lhLWNzCisKKyAgICBOb3RlOiBJZiB5b3UgdXNlIHRoZSBhcmNoaXZlIHN1cHBsaWVkIG9uIHRoZSBDRFJPTSwgdXNlIGFyY2hpdmUgbmFtZQorICAgICJwYzNfMl8xLnRneiIgaW5zdGVhZCBvZiAicGNtY2lhLWNzLTMuMi43LnRhci5neiIuCisKKyAgICBOb3RlOiBldmVuIHRob3VnaCBQQ01DSUEgY29kZSBleGlzdHMgaW4gdGhlIGtlcm5lbCBzb3VyY2UgdHJlZSwgdGhlIFBDTUNJQQorICAgIENhcmQgU2VydmljZXMgcGFja2FnZSBuZWVkcyB0byBiZSB1bnBhY2tlZCBsb2NhbGx5IHRvIGJ1aWxkIGRyaXZlcnMgYmFzZWQKKyAgICBvbiBpdC4KKworICAgIDMpIEV4dHJhY3QgdGhlIHdsYWdzNDkgZGlzdHJpYnV0aW9uIGFyY2hpdmUgb24gdG9wIG9mIHRoZSBMaW51eCBQQ01DSUEKKyAgICBwYWNrYWdlLgorICAgICAgICUgY2QgcGNtY2lhLWNzCisgICAgICAgJSB0YXIgeHp2ZiAuLi93bF9sa21fN18yMl9hYmcudGFyLmd6CisKKyAgICA0KSBUbyBidWlsZCBhbmQgaW5zdGFsbCB0aGUgZHJpdmVyLCBmb2xsb3cgdGhlIHByb2NlZHVyZSBiZWxvdzoKKyAgICAgICAlIC4vQ29uZmlndXJlCisKKyAgICBBbnN3ZXIgdGhlIHByZXNlbnRlZCBxdWVzdGlvbnMuIFVzdWFsbHkgdGhlIGRlZmF1bHQgYW5zd2VycyBhcmUgT0sgYW5kCisgICAgcHJlc3NpbmcgIkVudGVyIiBpcyBlbm91Z2guCisgICAgT24gbmV3ZXIgUmVkSGF0IHN5c3RlbXMsIGhvd2V2ZXIsIHlvdSBzaG91bGQgc3BlY2lmeSAiL3Vzci9zcmMvbGludXgtMi40IgorICAgIGFzIHRoZSBMaW51eCBzb3VyY2UgZGlyZWN0b3J5IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgIi91c3Ivc3JjL2xpbnV4Ii4KKworICAgIEZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGNvbmZpZ3VyYXRpb24sIGJ1aWxkaW5nIGFuZCBpbnN0YWxsaW5nLAorICAgIHNlZSB0aGUgUENNQ0lBLUhPV1RPLgorCisgICAgVG8gYnVpbGQgdGhlIGRlZmF1bHQgZHJpdmVycywgd2hpY2ggc3VwcG9ydCBIZXJtZXMtSUkgaW4gc3RhdGlvbiBtb2RlLCBydW4KKyAgICB0aGUgQnVpbGQgc2NyaXB0OgorICAgICAgICUgLi9CdWlsZAorCisgICAgVGhpcyBzY3JpcHQgZGV0ZXJtaW5lcyB3aGV0aGVyIHlvdXIgc3lzdGVtIHVzZXMgaW4ta2VybmVsIFBDTUNJQSBhbmQgZWl0aGVyCisgICAgYnVpbGRzIHRoZSBmdWxsIFBDTUNJQSBwYWNrYWdlIG9yIGp1c3QgdGhlIGRyaXZlci4KKworICAgIEJlZm9yZSBpbnN0YWxsaW5nIHRoZSBkcml2ZXIgd2l0aCB0aGUgSW5zdGFsbCBzY3JpcHQsIHlvdSBtdXN0IGJlY29tZQorICAgICdyb290JzoKKyAgICAgICAlIHN1CisgICAgICAgLi4KKyAgICAgICAlIC4vSW5zdGFsbAorCisgICAgVGhpcyBzY3JpcHQgZGV0ZXJtaW5lcyB3aGV0aGVyIHlvdXIgc3lzdGVtIHVzZXMgaW4ta2VybmVsIFBDTUNJQSBhbmQgZWl0aGVyCisgICAgaW5zdGFsbHMgdGhlIGZ1bGwgUENNQ0lBIHBhY2thZ2Ugb3IganVzdCB0aGUgZHJpdmVyLgorCisgICAgNSkgSWYgaXQgYmVjb21lcyBuZWNlc3NhcnkgdG8gY2xlYW4gdGhlIGJ1aWxkLCBpc3N1ZSB0aGUgZm9sbG93aW5nCisgICAgY29tbWFuZHM6CisgICAgICAgJSBtYWtlIGNsZWFuCisgICAgICAgJSBtYWtlIC1DIGxpYiBjbGVhbgorCis0LjMgQnVpbGQgdGhlIGRyaXZlciBmb3IgUENJCisKKyAgICAxKSBFeHRyYWN0IHRoZSB3bGFnczQ5IHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorICAgICAgICUgdGFyIHh6dmYgd2xfbGttXzdfMjIudGFyLmd6CisKKyAgICBOb3RlOiB0aGVyZSBpcyBubyBuZWVkIHRvIHVucGFjayB0aGUgZHJpdmVyIHNvdXJjZSBpbnRvIGEgUENNQ0lBIGJ1aWxkCisgICAgZGlyZWN0b3J5LgorCisgICAgMikgVG8gYnVpbGQgdGhlIFBDSSBkcml2ZXI6CisgICAgICAgJSBtYWtlIC1mIHdsYWdzNDkubWsgd2xhZ3M0OV9oMl9wY2kKKyAgICAgICBvcgorICAgICAgICUgbWFrZSAtZiB3bGFnczQ5Lm1rIHdsYWdzNDlfaDI1X3BjaQorCisgICAgMykgSW5zdGFsbCB0aGUgZHJpdmVyLgorICAgICAgICUgaW5zbW9kIC4vd2lyZWxlc3Mvd2xhZ3M0OV9oMjUubworCisgICAgNCkgSWYgaXQgYmVjb21lcyBuZWNlc3NhcnkgdG8gY2xlYW4gdGhlIGJ1aWxkLgorICAgICAgICUgbWFrZSAtZiB3bGFnczQ5Lm1rIHBjaV9jbGVhbgorCis0LjQgQ29uZmlndXJlIHlvdXIgV2lyZWxlc3MgUEMgQ2FyZAorCisgICAgVGhlcmUgYXJlIDMgd2F5cyB0byBjb25maWd1cmUgdGhlIGRyaXZlcgorICAgIC0gbW9kdWxlIHBhcmFtZXRlcnMgKC9ldGMvcGNtY2lhL2NvbmZpZy5vcHRzKQorICAgIC0gd2lyZWxlc3MgZXh0ZW5zaW9uICgvZXRjL3BjbWNpYS93aXJlbGVzcy5vcHRzKQorICAgIC0gQWdlcmUgY29uZmlndXJhdGlvbiBmaWxlICgvZXRjL2FnZXJlL2l3Y29uZmlnLWV0aCMpCisKKworNC40LjEgQ29uZmlndXJlIHRocm91Z2ggL2V0Yy9wY21jaWEvY29uZmlnLm9wdHMKKworICAgIFRvIHVzZSB0aGlzIG1ldGhvZCwgbWFrZSBzdXJlIHRoYXQgL2V0Yy9wY21jaWEvd2lyZWxlc3Mub3B0cyBmaWxlIGlzIGVpdGhlcgorICAgIGFic2VudCBvciBjb250YWlucyBibGFuayBwYXJhbWV0ZXIgdmFsdWVzIGFzIHNob3duIGJlbG93LgorCisgICAgKiwqLCosMDA6NjA6MUQ6KnwqLCosKiwwMDowMjoyRDoqKQorICAgICAgICBJTkZPPSIiCisgICAgICAgIEVTU0lEPSIiCisgICAgICAgIE1PREU9IiIKKyAgICAgICAgS0VZPSIiCisgICAgOzsKKworICAgIDEpIFRvIGNvbmZpZ3VyZSB0aGUgV2lyZWxlc3MgUEMgQ2FyZCwgcGxlYXNlIHJlZmVyIHRvOgorICAgICAgICogVGhlIG9ubGluZSBtYW51YWwgcGFnZSAod2xhZ3M0OS40KQorICAgICAgICAgJSBtYW4gd2xhZ3M0OQorICAgICAgICogVGhlIG5ldHdvcmsgYWRhcHRlciBzZWN0aW9ucyBvZiB0aGUgUENNQ0lBIGRvY3VtZW50YXRpb24uCisgICAgICAgICAlIG1vcmUgUENNQ0lBLUhPV1RPCisKKyAgICAyKSBVc2UgYW4gZWRpdG9yIHRvIGNvbmZpZ3VyZSB0aGUgbW9kdWxlIHBhcmFtZXRlcnM6CisgICAgICAgIyB2aSAvZXRjL3BjbWNpYS9jb25maWcub3B0cworCisgICAgICAgYSkgVG8gY29ubmVjdCB5b3VyIGNvbXB1dGVyIHRvIGEgd2lyZWxlc3MgaW5mcmFzdHJ1Y3R1cmUgdGhhdCBpbmNsdWRlcworICAgICAgIGFjY2VzcyBwb2ludHMgc3VjaCBhcyB0aGUgQVAtMTAwMCBvciBBUC01MDAsIHlvdSBuZWVkIHRvIGlkZW50aWZ5IHRoZQorICAgICAgIG5ldHdvcmsgbmFtZSBvZiB0aGUgd2lyZWxlc3MgaW5mcmFzdHJ1Y3R1cmUuCisKKyAgICAgICBGb3IgZXhhbXBsZSBpZiB5b3VyIGluZnJhc3RydWN0dXJlIHVzZXMgdGhlIG5ldHdvcmsgbmFtZSAiTXkgTmV0d29yayIsCisgICAgICAgZWRpdCB0aGUgY29uZmlnLm9wdHMgZmlsZSB0byBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6CisKKyAgICAgICBtb2R1bGUgIjxkcml2ZXJfbmFtZT4iIG9wdHMgIm5ldHdvcmtfbmFtZT1NeVwgTmV0d29yayIKKworICAgICAgIE5vdGljZSB0aGF0IHRoZSBzcGFjZSBjaGFyYWN0ZXIgbmVlZHMgdG8gYmUgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoLgorCisgICAgICAgYikgVG8gY29ubmVjdCB5b3VyIGNvbXB1dGVyIHRvIGEgUmVzaWRlbnRpYWwgR2F0ZXdheSBSRy0xMDAwLCB5b3UgbmVlZAorICAgICAgIHRvIGtub3cgdGhlIFJHIElEICg9bmV0d29ya19uYW1lKSBhbmQgdGhlIGVuY3J5cHRpb24ga2V5LiAgWW91IGNhbiBmaW5kCisgICAgICAgdGhlIFJHIElEIG9uIGEgc21hbGwgbGFiZWwgb24gdGhlIHJlYXIgb2YgdGhlIHVuaXQuCisKKyAgICAgICBGb3IgZXhhbXBsZSBpZiB5b3VyIFJHLTEwMDAgaGFzIElEIDIyNWNjZiBhbmQgeW91IGRpZCBub3QgY2hhbmdlIHRoZQorICAgICAgIGVuY3J5cHRpb24ga2V5IHlldCwgZWRpdCB0aGUgY29uZmlnLm9wdHMgZmlsZSB0byBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6CisKKyAgICAgICBtb2R1bGUgIjxkcml2ZXJfbmFtZT4iIG9wdHMgIm5ldHdvcmtfbmFtZT1cIjIyNWNjZlwiIGtleV8xPVwiMjVjY2ZcIgorICAgICAgIGVuYWJsZV9lbmNyeXB0aW9uPVkiCisKKyAgICAgICBJZiB5b3UgY2hhbmdlZCB5b3VyIGVuY3J5cHRpb24ga2V5LCB5b3Ugc2hvdWxkIHNwZWNpZnkgdGhpcyBrZXkgYXMga2V5XzEKKyAgICAgICBvbiB0aGUgcGFyYW1ldGVyIGxpbmUuCisKKyAgICAgICBjKSBUbyBjb25uZWN0IHlvdXIgY29tcHV0ZXIgdG8gYSBwZWVyLXRvLXBlZXIgbmV0d29yaywgaW4gYW4gZW52aXJvbm1lbnQKKyAgICAgICB3aXRob3V0IGFjY2VzcyBwb2ludHMsIHRoZSBJQlNTIG1vZGUgaXMgcmVjb21tZW5kZWQuCisKKyAgICAgICBGb3IgZXhhbXBsZSB0byBjb25uZWN0IHRvIGEgcGVlci10by1wZWVyIG5ldHdvcmsgY2FsbGVkICJNeSBOZXR3b3JrIiwKKyAgICAgICBlbnRlciB0aGUgZm9sbG93aW5nIGluIHRoZSBjb25maWcub3B0cyBmaWxlOgorCisgICAgICAgbW9kdWxlICI8ZHJpdmVyX25hbWU+IiBvcHRzICJjcmVhdGVfaWJzcz1ZIG5ldHdvcmtfbmFtZT1NeVwgTmV0d29yayIKKworICAgICAgIGQpIE9wdGlvbmFsbHkgeW91IGNhbiBhbHNvIGluY2x1ZGUgYSAiU3RhdGlvbiBOYW1lIiB2YWx1ZSB0aGF0IGNhbiBiZQorICAgICAgIHVzZWQgdG8gaW5kZW50aWZ5IHlvdXIgY29tcHV0ZXIgb24gdGhlIHdpcmVsZXNzIG5ldHdvcmsuCisKKyAgICAgICBGb3IgZXhhbXBsZSBpZiB5b3Ugd2lzaCB0byBuYW1lIHlvdXIgY29tcHV0ZXIgIldhdmUxIiB3aGVuIGNvbm5lY3RpbmcgaXQKKyAgICAgICB0byBhIHdpcmVsZXNzIGluZnJhc3RydWN0dXJlLCAgZWRpdCB0aGUgY29uZmlnLm9wdHMgZmlsZSB0byBpbmNsdWRlIHRoZQorICAgICAgIGZvbGxvd2luZzoKKworICAgICAgIG1vZHVsZSAiPGRyaXZlcl9uYW1lPiIgb3B0cyAibmV0d29ya19uYW1lPU9jZWFuIHN0YXRpb25fbmFtZT1XYXZlMSIKKworICAgICAgIGUpIFRvIGNvbm5lY3QgeW91ciBjb21wdXRlciB0byBhbiBBZC1Ib2Mgd29ya2dyb3VwIG9mIHdpcmVsZXNzCisgICAgICAgY29tcHV0ZXJzLCBlbnRlciB0aGUgZm9sbG93aW5nIGluIHRoZSBjb25maWcub3B0cyBmaWxlOgorCisgICAgICAgbW9kdWxlICI8ZHJpdmVyX25hbWU+IiBvcHRzICJwb3J0X3R5cGU9MyIKKworICAgICAgIE5vdGUgdGhhdCB0aGUgIkFkLUhvYyBEZW1vIE1vZGUiIGlzIG5vdCB0aGUgcmVjb21tZW5kZWQgbW9kZSBmb3IgYQorICAgICAgIHBlZXItdG8tcGVlciBuZXR3b3JrLiAgVGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhpcyAgbm9uLWludGVyb3BlcmFibGUgbW9kZQorICAgICAgIGlzIG9ubHkgZXhwbGFpbmVkIGhlcmUgZm9yIHNwZWNpYWwgYXBwbGljYXRpb25zIChlLmcuIHJlc2VhcmNoLCBvcgorICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciAvIHByZXZpb3VzIFdhdmVMQU4vSUVFRSBwcm9kdWN0cykuCisKKyAgICAgICBUaGUgSUJTUyBtb2RlIGRlc2NyaWJlZCBpbiBjKSBpcyB0aGUgcHJlZmVycmVkIGFuZCBpbnRlcm9wZXJhYmxlIG1vZGUKKyAgICAgICBmb3IgY3JlYXRpbmcgYSBwZWVyLXRvLXBlZXIgbmV0d29yay4KKworICAgIDMpIFVzZSBhbiBlZGl0b3IgdG8gbW9kaWZ5IHRoZSBuZXR3b3JrIG9wdGlvbnMgZm9yIHlvdXIgYWRhcHRlci4KKyAgICAgICAjIHZpIC9ldGMvcGNtY2lhL25ldHdvcmsub3B0cworCisgICAgICAgVGhlIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBjb3JyZWN0IGZvciB0aGUgY29ubmVjdGVkIG5ldHdvcmsuIENoZWNrIHdpdGgKKyAgICAgICB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGZvciB0aGUgY29ycmVjdCBuZXR3b3JrIGluZm9ybWF0aW9uLiAgUmVmZXIgdG8KKyAgICAgICB0aGUgUENNQ0lBLUhPV1RPIGZvciBtb3JlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisKKyAgICAgICBGb3IgZXhhbXBsZToKKyAgICAgICAgICAgICosKiwqLCopCisgICAgICAgICAgICAgICAgSUZfUE9SVD0iIgorICAgICAgICAgICAgICAgIEJPT1RQPSJuIgorICAgICAgICAgICAgICAgIElQQUREUj0iMTAuMC4wLjUiCisgICAgICAgICAgICAgICAgTkVUTUFTSz0iMjU1LjI1NS4yNTUuMCIKKyAgICAgICAgICAgICAgICBORVRXT1JLPSIxMC4wLjAuMCIKKyAgICAgICAgICAgICAgICBCUk9BRENBU1Q9IjEwLjAuMC4yNTUiCisgICAgICAgICAgICAgICAgR0FURVdBWT0iMTAuMC4wLjEiCisgICAgICAgICAgICAgICAgRE9NQUlOPSJkb21haW4ub3JnIgorICAgICAgICAgICAgICAgIEROU18xPSJkbnMxLmRvbWFpbi5vcmciCisgICAgICAgICAgICAgICAgOzsKKworICAgICAgIFJlZEhhdCBhbmQgU3VzZSBkbyBub3QgdXNlIHRoZSBuZXR3b3JrLm9wdHMgdG8gY29uZmlndXJlIHRoZSBkcml2ZXIuCisgICAgICAgSW5zdGVhZCBSZWRIYXQgdXNlcyBhIEdVSS1iYXNlZCB0b29sIGNhbGxlZCAnbmVhdCcgKCduZXQuY2ZnJyBpbiBvbGRlcgorICAgICAgIHZlcnNpb25zKSBhbmQgU3VTRSBMaW51eCB1c2VzICdZYVNUJy4gVGhlc2UgdG9vbHMgY3JlYXRlcyBzY3JpcHRzLCBsaWtlCisgICAgICAgaWZjZmctZXRoMCwgaW4gdGhlIGRpcmVjdG9yeSAvZXRjL3N5c2NvbmZpZy9uZXR3b3JrLXNjcmlwdHMuIFVzaW5nIHRoZQorICAgICAgIGRlZmF1bHQgR05PTUUgbWVudSwgeW91IGNhbiBzdGFydCBuZXRjZmcgZnJvbTogUHJvZ3JhbXMtPlN5c3RlbS0+TmV0d29yaworICAgICAgIENvbmZpZ3VyYXRpb24uCisKKyAgICA0KSBSZXN0YXJ0IHRoZSBQQ01DSUEgc2VydmljZXMuCisgICAgICAgIyAvZXRjL3JjLmQvcmMucGNtY2lhIHJlc3RhcnQKKyAgICAgICAgIG9yCisgICAgICAgIyAvZXRjL3JjLmQvaW5pdC5kL3BjbWNpYSByZXN0YXJ0CisKKworICAgIEZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gYWJvdXQgdGhlIHZhcmlvdXMgY29uZmlndXJhdGlvbiBvcHRpb25zIGFuZAorICAgIGRlZmluaXRpb25zLCBwbGVhc2UgY29uc3VsdCB0aGUgV2lyZWxlc3MgZG9jdW1lbnRhdGlvbi4KKworNC40LjIgQ29uZmlndXJlIHRocm91Z2ggL2V0Yy9wY21jaWEvd2lyZWxlc3Mub3B0cworCisgICAgVGhpcyBkcml2ZXIgaGFzIHN1cHBvcnQgZm9yIHRoZSAiV2lyZWxlc3MgRXh0ZW5zaW9ucyIuICBUaGlzIGludGVyZmFjZQorICAgIGFsbG93cyB0aGUgIldpcmVsZXNzIFRvb2xzIiB0byBnZXQgc3RhdGlzdGljcyBmcm9tIHRoZSBkcml2ZXIgYW5kIGFsbG93cyB0bworICAgIGNoYW5nZSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgZHJpdmVyIG9uIHRoZSBmbHkuCisKKyAgICBUaGUgbGF0ZXN0IHZlcnNpb25zIG9mIHRoZSBQQ01DSUEgcGFja2FnZSBjb250YWluIHNjcmlwdHMgdGhhdCB1c2UgdGhlCisgICAgd2lyZWxlc3MgZXh0ZW5zaW9uIHRvIGNvbmZpZ3VyZSB0aGUgZHJpdmVyIGFzIGFuIGFsdGVybmF0aXZlIHRvIHRoZQorICAgIGNvbmZpZ3VyYXRpb24gdGhyb3VnaCBtb2R1bGUgcGFyYW1ldGVycyBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbiA0LjQuMS4KKyAgICBSZWFkIHRoZSAvZXRjL3BjbWNpYS93aXJlbGVzcy5vcHRzIGZpbGUgZm9yIHRoZSB0aGVvcnkgb2Ygb3BlcmF0aW9uLiAgV2hlbgorICAgIHRoZSBkcml2ZXIgaXMgY29uZmlndXJlZCwgZ28gdG8gc2VjdGlvbiA0LjQuMSBzdGVwIDMgdG8gY29uZmlndXJlIHRoZQorICAgIG5ldHdvcmsgcGFyYW1ldGVycy4KKworICAgIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgZm9sbG93aW5nIFdFQiBwYWdlczoKKyAgICBodHRwOi8vd3d3LmhwbC5ocC5jb20vcGVyc29uYWwvSmVhbl9Ub3VycmlsaGVzL0xpbnV4L0xpbnV4LldpcmVsZXNzLkV4dGVuc2lvbnMuaHRtbAorICAgIGh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvVG9vbHMuaHRtbAorCis0LjQuMyBDb25maWd1cmUgdGhyb3VnaCAvZXRjL2FnZXJlL2l3Y29uZmlnLWV0aCMKKworICAgIEluIGFkZGl0aW9uIHRvIHVzaW5nIGVpdGhlciB0aGUgbW9kdWxlIG9wdGlvbnMgb3IgdGhlIHdpcmVsZXNzIGV4dGVuc2lvbnMKKyAgICBtZXRob2RzIHRvIGNvbmZpZ3VyZSBhIHdpcmVsZXNzIGRldmljZSwgdGhpcyB2ZXJzaW9uIG9mIHRoZSBzb2Z0d2FyZSBhbHNvCisgICAgc3VwcG9ydHMgYW4gQWdlcmUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uIFRoaXMgd2FzIGRvbmUgYmVjYXVzZToKKyAgICAqIE1vZHVsZSBvcHRpb25zIGNvbmZpZ3VyZXMgbXVsdGlwbGUgZGV2aWNlcyB0aGUgc2FtZS4KKyAgICAqIFdpcmVsZXNzIGV4dGVuc2lvbnMgcGFyYW1ldGVycyBkbyBub3QgY292ZXIgYWxsIG9mIHRoZSBhdmFpbGFibGUgb3B0aW9ucworICAgICAgaW4gdGhlIGRyaXZlci4KKworICAgIEZvciBlYWNoIHdpcmVsZXNzIGV0aGVybmV0IGRldmljZSAoaWRlbnRpZmllZCBieSBldGg8bj4sIHdoZXJlIG4gaXMgYQorICAgIHBvc2l0aXZlIGludGVnZXIpLCBhIGZpbGUgL2V0Yy9hZ2VyZS9pd2NvbmZpZy1ldGg8bj4gY2FuIGJlIGNyZWF0ZWQgd2hpY2gKKyAgICBjb250YWlucyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIHdpcmVsZXNzIGRldmljZS4gRm9yIGV4YW1wbGUsIHRoZQorICAgIGZpbGUgL2V0Yy9hZ2VyZS9pd2NvbmZpZy1ldGgxIGlzIHRoZSBjb25maWcgZmlsZSBmb3IgZXRoMS4gVGhpcyBmaWxlIHNob3VsZAorICAgIGNvbnRhaW4gS2V5L1ZhbHVlIHBhaXJzIGluIHRoZSBmb3JtYXQ6CisKKyAgICA8S2V5Pj08VmFsdWU+CisKKyAgICB3aGVyZSA8S2V5PiBpcyB0aGUgcGFyYW1ldGVyIHRvIGNvbmZpZ3VyZSBhbmQgPFZhbHVlPiBpcyB0aGUgdmFsdWUgdG8KKyAgICBhc3NpZ24gaXQuIEZvciBleGFtcGxlLCBpZiB0aGUgY29uZmlnIGZpbGUgL2V0Yy9hZ2VyZS9pd2NvbmZpZy1ldGgxCisgICAgZGVzY3JpYmVkIGFib3ZlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmc6CisKKyAgICBEZXNpcmVkU1NJRD1zb21lX25ldHdvcmsKKyAgICBFbmFibGVFbmNyeXB0aW9uPVkKKyAgICBLZXkxPW5ldDAxCisgICAgVHhLZXk9MQorCisgICAgdGhpcyBjb25maWd1cmVzIGV0aDEgdG8gYXNzb2NpYXRlIHRvIHRoZSBFU1NJRCAnc29tZV9uZXR3b3JrJyB3aXRoCisgICAgZW5jcnlwdGlvbiBvbiwgd2hlcmUgdGhlIHRoZSBmaXJzdCBlbmNyeXB0aW9uIGtleSBpcyAnbmV0MDEnIGFuZCB0aGUga2V5IHRvCisgICAgdXNlIGZvciBlbmNyeXB0aW9uIGlzIEtleSAxLgorCisgICAgTm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyBvbiBBZ2VyZSBoYXJkd2FyZSB3aGljaCB1c2VzIHRoaXMgZHJpdmVyLiBGb3IKKyAgICBvdGhlciB3aXJlbGVzcyBkcml2ZXJzLCBvciBub24td2lyZWxlc3MgZGV2aWNlcywgdGhpcyBmaWxlIGNhbiBiZSBwcmVzZW50LAorICAgIGJ1dCBoYXMgbm8gZWZmZWN0LgorCisgICAgUGxlYXNlIHJlZmVyIHRvIHRoZSBtYW4gcGFnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGNvbmZpZ3VyYXRpb24KKyAgICBmaWxlIGFuZCB0aGUgcGFyYW1ldGVycyB0aGF0IGNhbiBiZSBzZXQuCisKKworNC41IENvbmZpZ3VyaW5nIHlvdXIgV2lyZWxlc3MgUENJIGNhcmQKKworICAgIE5vdGUgdGhhdCB0aGUgYWJvdmUgbWV0aG9kIG9mIGNvbmZpZ3VyaW5nIHRoZSBjYXJkIHVzaW5nCisgICAgL2V0Yy9wY21jaWEvY29uZmlnLm9wdHMgaXMgb25seSB2YWxpZCBmb3IgUENNQ0lBL0NGIGNhcmRzLiBGb3IgW21pbmldUENJCisgICAgYW5kIENhcmRCdXMgY2FyZHMsIHJlZmVyIHRvIHlvdXIgc3lzdGVtJ3MgZG9jdW1lbnRhdGlvbiBvbiBtb2R1bGVzLmNvbmYgdG8KKyAgICBsb2FkIHRoZSBkcml2ZXIgd2l0aCB0aGUgcHJvcGVyIG9wdGlvbnMgZm9yIGEgZ2l2ZW4gd2lyZWxlc3MgZXRoZXJuZXQKKyAgICBpbnRlcmZhY2UuIEluIGFkZGl0aW9uLCBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gdG9vbHMgbGlrZSAnbmV0Y2ZnJywgJ25lYXQnLAorICAgIG9yICdZYVNUJyAoc2VlIFNlY3Rpb24gNC40LjEsIFN0ZXAgMykgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBtaW5pUENJCisgICAgY2FyZC4gTGFzdGx5LCB0aGUgQWdlcmUgY29uZmlndXJhdGlvbiBmaWxlIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDQuNC4zIG1heQorICAgIGFsc28gYmUgdXNlZCBmb3IgW21pbmldUENJIGFuZCBDYXJkQnVzIGRldmljZXMuCisKKzQuNiBUcm91Ymxlc2hvb3RpbmcKKworICAgIFdoZW4gdGhlIFdpcmVsZXNzIFBDIENhcmQgaXMgaW5zZXJ0ZWQsIHRoZSBjYXJkIG1hbmFnZXIgZW1pdCBiZWVwcyBpbgorICAgIGRpZmZlcmVudCB0b25lcyB0byBpbmRpY2F0ZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgcGFydGljdWxhciBjb25maWd1cmF0aW9uCisgICAgc3RlcHMuCisgICAgICBhKSBUd28gaGlnaCBiZWVwcworICAgICAgICAgLSBUaGUgY2FyZCB3YXMgaWRlbnRpZmllZCBhbmQgY29uZmlndXJlZCBzdWNjZXNzZnVsbHkuCisgICAgICBiKSBPbmUgaGlnaCBiZWVwIGZvbGxvd2VkIGJ5IGEgbG93IGJlZXAKKyAgICAgICAgIC0gVGhlIGNhcmQgd2FzIGlkZW50aWZpZWQsIGJ1dCBjb3VsZCBub3QgYmUgY29uZmlndXJlZC4KKyAgICAgICAgIC0gRXhhbWluZSB0aGUgc3lzdGVtIGxvZyAoZG1lc2cpIGZvciBQQ01DSUEgZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlcy4KKyAgICAgIGMpIE9uZSBsb3cgYmVlcAorICAgICAgICAgLSBUaGUgY2FyZCBjb3VsZCBub3QgYmUgaWRlbnRpZmllZC4KKyAgICAgICAgIC0gRXhlY3V0ZSAiY2FyZGN0bCBpZGVudCIgdG8gZGlzcGxheSB0aGUgYWRhcHRlciBQblAgaW5mb3JtYXRpb24uCisgICAgICAgICAgIFZlcmlmeSB0aGUgUG5QIGluZm9ybWF0aW9uIG1hdGNoZXMgYW4gZW50cnkgaW4gdGhlIFBDTUNJQQorICAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGUgKC9ldGMvcGNtY2lhL2NvbmZpZykuCisgICAgICAgICAtIEV4YW1pbmUgdGhlIHN5c3RlbSBsb2cgKGRtZXNnKSBmb3IgUENNQ0lBIGVycm9yIG9yIHdhcm5pbmcgbWVzc2FnZXMuCisKKyAgICBUaGUgV2lyZWxlc3MgUEMgQ2FyZCBoYXMgdHdvIExFRHMgdGhhdCBpbmRpY2F0ZSB0aGUgc3RhdGUgb2YgdGhlIGFkYXB0ZXIKKyAgICBhbmQgbmV0d29yay4KKyAgICAgICogUG93ZXIgTEVEICh0b3dhcmQgdGhlIG1pZGRsZSBvZiB0aGUgYWRhcHRlcikKKyAgICAJLSBUaGlzIExFRCBpbmRpY2F0ZXMgcG93ZXIgaGFzIGJlZW4gYXBwbGllZCwgYW5kIHRoZSBjYXJkIGlzCisgICAgCSAgZnVuY3Rpb25hbC4gSW4gbm9ybWFsIG9wZXJhdGlvbiBtb2RlIHdpdGggQ2FyZCBQb3dlciBNYW5hZ2VtZW50CisgICAgCSAgZGlzYWJsZWQsIGl0IGlzIHN0ZWFkeS1vbi4gV2l0aCBDYXJkIFBvd2VyIE1hbmFnZW1lbnQgZW5hYmxlZCwgaXQKKyAgICAJICBibGlua3MgcmFwaWRseSAoc2V2ZXJhbCB0aW1lcyBwZXIgc2Vjb25kKS4KKyAgICAgICogVHJhbnNtaXQvUmVjZWl2ZSBMRUQgKGNsb3NlciB0byB0aGUgZWRnZSBvZiB0aGUgYWRhcHRlcikKKyAgICAgICAgLSBUaGlzIExFRCBmbGFzaGVzIHdoZW4gaXQgZGV0ZWN0cyB0cmFuc21pdCBvciByZWNlaXZlIHBhY2tldHMuCisKKyAgICAgICogQm90aCBMRURzIGJsaW5rIGF0IHRoZSBzYW1lIHRpbWUgZXZlcnkgMTAgc2Vjb25kcy4KKyAgICAJLSBUaGUgYWRhcHRlciB3YXMgdW5hYmxlIHRvIG1ha2UgY29udGFjdCB3aXRoIHRoZSBuYW1lZCB3aXJlbGVzcworICAgIAkgIG5ldHdvcmsuIFZlcmlmeSB0aGUgbmV0d29ya19uYW1lLCBpbiB0aGUgY29uZmlnLm9wdHMgZmlsZSBtYXRjaGVzIHRoZQorICAgIAkgIG5ldHdvcmsgbmFtZSBvZiB0aGUgYWNjZXNzIHBvaW50LgorICAgICAgKiBMRURzIGluZGljYXRlIG5vcm1hbCBvcGVyYXRpb24gd2l0aCB0aGUgUG93ZXIgTEVECisgICAgCXN0ZWFkeS1vbiBvciBibGlua2luZyByYXBpZGx5IGFuZCBUcmFuc21pdC9SZWNlaXZlIExFRCBmbGFzaGluZywgYnV0IG5vCisgICAgCXRyYWZmaWMuCisgICAgCS0gSWYgdGhlIG5ldHdvcmsgaXMgb3BlcmF0aW5nIGluIG5vcm1hbCBtb2RlIChpZS4gIHBvcnRfdHlwZSA9IDAgb3Igbm90CisgICAgCSAgc3BlY2lmaWVkKSwgYW5kIGEgbmV0d29ya19uYW1lIGhhcyBiZWVuIHNwZWNpZmllZCwgdmVyaWZ5IHRoZQorICAgIAkgIHdvcmtzdGF0aW9uIG5ldHdvcmsgcGFyYW1ldGVycyAoaWZjb25maWcsIHJvdXRlLCBldGMuKSBhcmUgY29ycmVjdAorICAgIAkgIGZvciB0aGUgd2lyZWxlc3MgbmV0d29yay4KKyAgICAJLSBJZiB0aGUgbmV0d29yayBpcyBvcGVyYXRpbmcgaW4gQWQtSG9jIChwZWVyLXRvLXBlZXIpIG1vZGUgKGllLgorICAgIAkgIHBvcnRfdHlwZSA9IDMpLCB0aGUgYWRhcHRlciBuZWVkcyBhbm90aGVyIHdvcmtzdGF0aW9uL2FkYXB0ZXIgdG8KKyAgICAJICBjb21tdW5pY2F0ZSB3aXRoLiAgVmVyaWZ5IHRoZSBuZXR3b3JrIHBhcmFtZXRlcnMgb24gYm90aCBvZiB0aGUKKyAgICAJICB3b3Jrc3RhdGlvbnMgKGlmY29uZmlnLCByb3V0ZSwgZXRjLikgYXJlIGNvcnJlY3QuCisKKyAgICBSZWZlciB0byB0aGUgb25saW5lIG1hbnVhbCBwYWdlIGZvciBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24sIGZlYXR1cmUgYW5kCisgICAgc3VwcG9ydCBpbmZvcm1hdGlvbi4KKyAgICAgICAlIG1hbiB3bGFnczQ5CisgICAgICAgICBvcgorICAgICAgICUgbWFuIDQgd2xhZ3M0OQorICAgICAgICAgb3IKKyAgICAgICAlIG5yb2ZmIC1tYW4gd2xhZ3M0OS40IHwgbW9yZQorCis0LjcgSWRlbnRpZnlpbmcgdGhlIHNvZnR3YXJlCisKKyAgICBUaGlzIHNlY3Rpb24gZXhwbGFpbnMgaG93IHRvIGlkZW50aWZ5IHRoZSB2ZXJzaW9uIG9mIHRoaXMgc29mdHdhcmUgb25jZSBpdAorICAgIGlzIHVucGFja2VkIG9yIGluc3RhbGxlZC4KKworICAgIFRoZSBMaW51eCBEcml2ZXIgU291cmNlL0xpYnJhcnkgZGlzdHJpYnV0aW9uIGNvbnNpc3Qgb2YgdHdvIG1haW4KKyAgICBjb21wb25lbnRzLCB0aGUgZHJpdmVyIHNvdXJjZSBhbmQgdGhlIEhDRiBtb2R1bGUuCisKKyAgICAqIFRvIHF1aWNrbHkgaWRlbnRpZnkgdGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSwgdHlwZToKKyAgICAgICUgZ3JlcCBEUlYuKlZFUlNJT04gaW5jbHVkZS93aXJlbGVzcy93bF92ZXJzaW9uLmgKKyAgICAgICNkZWZpbmUgRFJWX01BSk9SX1ZFUlNJT04gICA3CisgICAgICAjZGVmaW5lIERSVl9NSU5PUl9WRVJTSU9OICAgMjIKKworICAgICogVG8gaWRlbnRpZnkgdGhlIHJldmlzaW9uIG9mIHRoZSBIQ0YgbGlicmFyeSBjb250YWluZWQgaW4gdGhlIGRyaXZlciwKKyAgICAgIHR5cGU6CisgICAgICAlIGdyZXAgSENGLlJldmlzaW9uIGhjZi9oY2YuYworICAgICAgI2RlZmluZSBIQ0ZfVkVSU0lPTiAgVEVYVCggIkhDRiRSZXZpc2lvbjogMS44ICQiICkKKworICAgIFRvIGlkZW50aWZ5IGEgY29tcGlsZWQgd2xhZ3M0OSBkcml2ZXIsIGdvIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGRyaXZlcgorICAgIGlzIGxvY2F0ZWQuIENhcmQgU2VydmljZXMgZHJpdmVycyAod2xhZ3M0OV9oMl9jcy5vIGFuZCB3bGFnczQ5X2gyNV9jcy5vKQorICAgIGFyZSBsb2NhdGVkIGluOgorICAgIC9saWIvbW9kdWxlcy88a2VybmVsLXZlcnNpb24+L3BjbWNpYQorCisgICAgUENJIGRyaXZlcnMgKHdsYWdzNDlfaDIubykgYXJlIGxvY2F0ZWQgaW46CisgICAgL2xpYi9tb2R1bGVzLzxrZXJuZWwtdmVyc2lvbj4va2VybmVsL2RyaXZlcnMvbmV0CisKKyAgICAqIFRvIHJldHJpZXZlIHRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgdXNlZCB0byBjb21waWxlIHRoZSBkcml2ZXIsIHR5cGU6CisgICAgICAlIHN0cmluZ3MgPGRyaXZlcl9uYW1lPi5vIHwgZ3JlcCBBZ2VyZQorICAgICAgPGRyaXZlcl9uYW1lPiB2Ny4yMi1hYmctQmV0YSBmb3IgUENNQ0lBCisgICAgICA8ZHJpdmVyX25hbWU+IHY3LjIyLWFiZy1CZXRhIGZvciBQQ0kKKworICAgICogTGlrZXdpc2UsIHRvIHJldHJpZXZlIHRoZSByZXZpc2lvbiBvZiB0aGUgSENGIHVzZWQgdG8gY29tcGlsZSB0aGUgZHJpdmVyLAorICAgICAgdHlwZToKKyAgICAgICUgc3RyaW5ncyA8ZHJpdmVyX25hbWU+Lm8gfCBncmVwIFJldmlzaW9uCisgICAgICBIQ0YkUmV2aXNpb246IDUuMTUKKworICAgIEF0IHN0YXJ0dXAgdGhlIHdsYWdzNDkgZHJpdmVyIHJlcG9ydHMgaXRzIHZlcnNpb24gaW4gdGhlIHN5c3RlbSBsb2cgZmlsZQorICAgICgvdmFyL2xvZy9tZXNzYWdlcykuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorNS4gIFRFQ0hOSUNBTCBDT05TVFJBSU5UUworCisgICAgQXQgdGhlIHRpbWUgb2YgcmVsZWFzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGUgZm9sbG93aW5nIGNvbnN0cmFpbnRzIGFyZQorICAgIGlkZW50aWZpZWQ6CisKKzUuMSBVc2luZyB0aGUgSVNBIGFkYXB0ZXIKKworICAgIERlc2NyaXB0aW9uOiBUbyBhbGxvdyBvcGVyYXRpb24gaW4gZGVza3RvcCBjb21wdXRlcnMgQWdlcmUgYWxzbyBwcm92aWRlcyBhbgorICAgIG9wdGlvbmFsIElTQSBidXMgdG8gUEMgQ2FyZCBhZGFwdGVyIChhbHNvIHJlZmVycmVkIHRvIGFzICJzd2FwYm94IikuCisKKyAgICBUaGlzIElTQSBBZGFwdGVyIGNhbiBiZSBjb25maWd1cmVkIGZvciB0d28gZGlmZmVyZW50IEkvTyBBZGRyZXNzIHZhbHVlczoKKyAgICAgICogM0UyIChmYWN0b3J5LXNldCBkZWZhdWx0KQorICAgICAgKiAzRTAKKworICAgIEltcGFjdDogQnkgZGVmYXVsdCB0aGUgaTgyMzY1IG1vZHVsZSBvZiB0aGUgTGludXggcGNtY2lhIHBhY2thZ2Ugb25seQorICAgIHByb2JlcyBhdCAzRTAuCisKKyAgICBBY3Rpb25zOgorICAgIDEpIFJlYWQgdGhlIG1hbnVhbCBwYWdlIG9uIHRoZSBwcm9iaW5nIG9mIHRoZSBpODIzNjUgbW9kdWxlLCBieSB0eXBpbmcgdGhlCisgICAgY29tbWFuZDoKKyAgICAgICAgbWFuIGk4MjM2NQorCisgICAgMikgQXBwbHkgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nIG9wdGlvbnM6CisgICAgICAgYSkgQ2hhbmdlIHRoZSBJL08gYWRkcmVzcyBzdHJhcHBpbmcgb2YgdGhlIElTQSBhZGFwdGVyIGJ5IHJlcGxhY2luZyB0aGUKKyAgICAgICAgICBqdW1wZXIgb24gdGhlIElTQSBhZGFwdGVyLiAgVGhlIGNvcnJlY3QganVtcGVyIHNldHRpbmcgaXMgcGljdHVyZWQgaW4KKyAgICAgICAgICB0aGUgZWxlY3Ryb25pYyAiV2lyZWxlc3MgSVNBIEFkYXB0ZXIsIEdldHRpbmcgU3RhcnRlZCBHdWlkZSIgcHJvdmlkZWQKKyAgICAgICAgICBvbiB0aGUgV2lyZWxlc3MgU29mdHdhcmUgQ0QtUk9NLiBUaGlzIGd1aWRlIGlzIHByb3ZpZGVkIGluIEFkb2JlJ3MKKyAgICAgICAgICBBY3JvYmF0IFBERiBmb3JtYXQuCisKKyAgICAgICBiKSBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGxvYWQgdGhlIGk4MjM2NSBtb2R1bGUgd2l0aCB0aGUKKyAgICAgICAgICAiZXh0cmFfc29ja2V0cyIgcGFyYW1ldGVyIHNldCB0byAxLgorCisgICAgICAgICAgT24gYSBSZWRIYXQgNS54IHRocnUgNy54LCBzeXN0ZW0sIHB1dCB0aGlzIGluIHRoZSBmaWxlCisgICAgICAgICAgIi9ldGMvc3lzY29uZmlnL3BjbWNpYSI6CisgICAgICAgICAgICAgUENNQ0lBPXllcworICAgICAgICAgICAgIFBDSUM9aTgyMzY1CisgICAgICAgICAgICAgUENJQ19PUFRTPSJleHRyYV9zb2NrZXRzPTEiCisgICAgICAgICAgICAgQ09SRV9PUFRTPQorICAgICAgICAgICAgIENBUkRNR1JfT1BUUz0KKworICAgICAgICAgIEZvciBvdGhlciBMaW51eCBkaXN0cmlidXRpb25zLCB5b3UgYXJlIGFkdmlzZWQgdG8gY29uc3VsdCB0aGUKKyAgICAgICAgICAiUENNQ0lBLUhPV1RPIiBub3RlcyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgY2hhbmdpbmcgdGhlIEkvTyBBZGRyZXNzCisgICAgICAgICAgcHJvYmluZy4KKworNS4yIFVzaW5nIHRoZSBQQ0kgQWRhcHRlcgorCisgICAgRGVzY3JpcHRpb246IFRvIGFsbG93IG9wZXJhdGlvbiBpbiBkZXNrdG9wIGNvbXB1dGVycyBBZ2VyZSBhbHNvIHByb3ZpZGVzIGFuCisgICAgb3B0aW9uYWwgUENJIGJ1cyB0byBQQyBDYXJkIGFkYXB0ZXIgKGFsc28gcmVmZXJyZWQgdG8gYXMgInN3YXBib3giKS4KKworICAgIEZvciBjb3JyZWN0IGludGVycnVwdCBhc3NpZ25tZW50LCB0aGUgc3lzdGVtIHNob3VsZCBzdXBwb3J0IFBDSUJJT1MgMi4yLgorICAgIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBQQ01DSUEgcGFja2FnZSB2ZXJzaW9uIDMuMi43IG9yIGhpZ2hlci4KKworICAgIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIGludGVycnVwdCByb3V0aW5nIG1ldGhvZCBvZiB0aGUgUENJCisgICAgQWRhcHRlcidzIFRJIENhcmRCdXMgQ29udHJvbGxlciBpcyBpbmNvcnJlY3QuCisKKyAgICBBY3Rpb25zOgorICAgIDEpIFJlYWQgdGhlIG1hbnVhbCBwYWdlIG9uIHRoZSAiT3B0aW9ucyBzcGVjaWZpYyBmb3IgVEkgQ2FyZEJ1cworICAgIENvbnRyb2xsZXJzIiBvZiB0aGUgaTgyMzY1IG1vZHVsZSwgYnkgdHlwaW5nIHRoZSBjb21tYW5kOgorICAgICAgICBtYW4gaTgyMzY1CisKKyAgICAyKSBMb2FkIHRoZSBpODIzNjUgbW9kdWxlIHdpdGggdGhlICJpcnFfbW9kZSIgcGFyYW1ldGVyIHNldCB0byAwLgorICAgICAgIE9uIGEgUmVkSGF0IDUueCB0aHJ1IDcueCBzeXN0ZW0sIHB1dCB0aGlzIGluIHRoZSBmaWxlCisgICAgICAgIi9ldGMvc3lzY29uZmlnL3BjbWNpYSI6CisgICAgICAgICAgIFBDTUNJQT15ZXMKKyAgICAgICAgICAgUENJQz1pODIzNjUKKyAgICAgICAgICAgUENJQ19PUFRTPSJpcnFfbW9kZT0wIgorICAgICAgICAgICBDT1JFX09QVFM9CisgICAgICAgICAgIENBUkRNR1JfT1BUUz0KKworICAgRm9yIHRoZSBsb2NhdGlvbiBvZiB0aGUgUENNQ0lBIHNjcmlwdHMgb24gb3RoZXIgTGludXggZGlzdHJpYnV0aW9ucywgeW91CisgICBhcmUgYWR2aXNlZCB0byBjb25zdWx0IHRoZSAiUENNQ0lBLUhPV1RPIiwgIk5vdGVzIGFib3V0IHNwZWNpZmljIExpbnV4CisgICBkaXN0cmlidXRpb25zIi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis2LiAgS05PV04gSVNTVUVTCisKKyAgICBUaGlzIGlzIHRoZSBjdXJyZW50IGxpc3Qgb2Yga25vd24gaXNzdWVzIGZvciB0aGlzIHJlbGVhc2UsIGFuZCB3aWxsIGJlCisgICAgYWRkcmVzc2VkIGluIHRoZSBuZWFyIGZ1dHVyZToKKworICAgIDEuIFRoaXMgZHJpdmVyIHJlbGVhc2UgY29udGFpbnMgYSB2ZXJzaW9uIG9mIEhlcm1lcy1JSS41IGZpcm13YXJlIHdoaWNoCisgICAgUkVRVUlSRVMgY2FsaWJyYXRlZCBjYXJkcy4gSWYgdGhlcmUgaXMgbm8gY2FsaWJyYXRpb24gZGF0YSBwcmVzZW50IGluIHRoZQorICAgIFBEQSBvZiB0aGUgaGFyZHdhcmUsIHRoZSBmaXJtd2FyZSBkb2VzIG5vdCBvcGVyYXRlLgorCisgICAgMi4gV0RTIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLgorCisgICAgMy4gRE1BIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLgorCisgICAgNC4gV1BBIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLgorCisgICAgNS4gMzItYml0cyBJL08gaXMgbm90IHlldCBzdXBwb3J0ZWQuCisKKyAgICA2LiBUaGUgY3VycmVudCBCdWlsZCBzY3JpcHQgYWxzbyBidWlsZHMgdGhlIFBDSSBkcml2ZXJzLgorCisgICAgNy4gVGhlIGN1cnJlbnQgSW5zdGFsbCBzY3JpcHQgYWxzbyBjb3BpZXMgdGhlIFBDSSBkcml2ZXJzIHRvIHRoZSBsaWIKKyAgICBkaXJlY3RvcnkuCisKKwk4LiBJZiBGL1cgZmlsZXMgYXJlIHJlcXVpcmVkIGZyb20gb3V0c2lkZSB0aGlzIHJlbGVhc2UsIHRoZSBlbnRyeSBwb2ludHMKKwlpbnNpZGUgdGhlc2UgRi9XIGZpbGVzIGhhdmUgdG8gYmUgcmVuYW1lZCBmcm9tICJhcCIgYW5kICJzdGF0aW9uIiB0bworCSJmd19pbWFnZSIgYW5kIHRoZXkgaGF2ZSB0byBiZSByZW5hbWVkIHRvIGZ3X2gyLmMgYW5kIGZ3X2gyNS5jIGZvcgorCUhlcm1lcy1JSSBhbmQgSGVybWVzLUlJLjUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorNy4gIFRFQ0hOSUNBTCBTVVBQT1JUCisKKzcuMSBGaW5kaW5nIEluZm9ybWF0aW9uCisKKyAgICBPbiB0aGUgQWdlcmUgU3lzdGVtcyBXZWIgU2l0ZSB5b3UgY2FuIGZpbmQgdGhlIG1vc3QgcmVjZW50IGRldmljZSBkcml2ZXJzLAorICAgIHNvZnR3YXJlIHVwZGF0ZXMgYW5kIHVzZXIgZG9jdW1lbnRhdGlvbi4KKworICAgIFdvcmxkIFdpZGUgV2ViOiAgICBodHRwOi8vd3d3LmFnZXJlLmNvbQorCis3LjIgQ29udGFjdCBUZWNobmljYWwgU3VwcG9ydAorCisgICAgSWYgeW91IGVuY291bnRlciBwcm9ibGVtcyB3aGVuIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhpcyBwcm9kdWN0LCBvciB3b3VsZAorICAgIGxpa2UgaW5mb3JtYXRpb24gYWJvdXQgb3VyIG90aGVyICJXaXJlbGVzcyIgcHJvZHVjdHMsIHBsZWFzZSBjb250YWN0IHlvdXIKKyAgICBsb2NhbCBBdXRob3JpemVkICJXaXJlbGVzcyIgUmVzZWxsZXIgb3IgQWdlcmUgU3lzdGVtcyBzYWxlcyBvZmZpY2UuCisKKyAgICBBZGRyZXNzZXMgYW5kIHRlbGVwaG9uZSBudW1iZXJzIG9mIHRoZSBBZ2VyZSBTeXN0ZW1zIHNhbGVzIG9mZmljZXMgYXJlCisgICAgbGlzdGVkIG9uIG91ciBBZ2VyZSBTeXN0ZW1zIHdlYiBzaXRlLgorCisgICAgV2hlbiBjb250YWN0aW5nIFRlY2huaWNhbCBTdXBwb3J0LCBwbGVhc2UgdXNlIHRoZSBQcm9ibGVtIFJlcG9ydCBGb3JtIGFuZAorICAgIHNlbmQgaXQgdG8gdXMgYnkgRmF4IG9yIEUtTWFpbC4gIFRoZSBQcm9ibGVtIFJlcG9ydCBGb3JtICdSRVBPUlQuVFhUJworICAgIChQbGFpbiB0ZXh0IGZvcm1hdCkgaXMgaW5jbHVkZWQgb24gdGhlIGRpc2suIEFsdGVybmF0aXZlbHksIHlvdSBjYW4KKyAgICBkb3dubG9hZCB0aGUgUHJvYmxlbSBSZXBvcnQgRm9ybSBmcm9tIHRoZSBBZ2VyZSBTeXN0ZW1zIHdlYiBzaXRlLgorCisgICAgSW5jbHVkZSBQcm9kdWN0IE5hbWUsIFNlcmlhbCBOdW1iZXIgYW5kIHNvZnR3YXJlIHZlcnNpb24gbnVtYmVyIHdpdGggZWFjaAorICAgIHJlcXVlc3QgdG8gaGVscCB0aGUgU3VwcG9ydCBHcm91cCBoZWxwaW5nIHlvdS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGFhNDE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvVE9ETwpAQCAtMCwwICsxLDMzIEBACitGaXJzdCBvZiBhbGwsIHRoZSBiZXN0IHRoaW5nIHdvdWxkIGJlIHRoYXQgdGhpcyBkcml2ZXIgYmVjb21lcyBvYnNvbHRlIGJ5CithZGRpbmcgc3VwcG9ydCBmb3IgSGVybWVzIElJIGFuZCBIZXJtZXMgSUkuNSBjYXJkcyB0byB0aGUgZXhpc3Rpbmcgb3Jpbm9jbworZHJpdmVyLiBUaGUgb3Jpbm9jbyBkcml2ZXIgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgSGVybWVzIEkgYmFzZWQgY2FyZHMuCitTaW5jZSB0aGlzIHdpbGwgbm90IGhhcHBlbiBieSBtYWdpYyBhbmQgaGFzIG5vdCBoYXBwZW5kIHVudGlsIG5vdyB0aGlzCitkcml2ZXIgcHJvdmlkZXMgYSBzdG9wLWdhcCBzb2x1dGlvbiBmb3IgdGhlc2UgdHlwZSBvZiBjYXJkcy4KKworSGF2aW5nIHNhaWQgdGhhdCwgdGhlIGZvbGxvd2luZyB3aXNobGlzdCBjb21lcyB0byBtaW5kIHRvIG1ha2UgdGhlIGRyaXZlcgorc3VpdGFibGUgYXMgZnVsbHkgc3VwcG9ydGVkIGtlcm5lbCBkcml2ZXIuIEZlZWwgZnJlZSB0byBleHBhbmQvZW5oYW5jZSB0aGUKK2xpc3QuCisKK1RPRE86CisJLSB2ZXJpZnkgYWdhaW5zdCBhIEhlcm1lcyBJSS41IGNhcmQKKwktIHZlcmlmeSB3aXRoIFdQQSBlbmNyaXB0aW9uIChib3RoIHdpdGggSDIgYW5kIEgyLjUgY2FyZHMpCisJLSBzb21ldGltZXMgdGhlIGNhcmQgZG9lcyBub3QgaW5pdGlhbGl6ZSBjb3JyZWN0bHksIHJldHJ5IG1lY2hhbmlzbXMKKwkgIGFyZSBidWlsZCBpbiB0byBjYXRjaCBtb3N0IGNhc2VzIGJ1dCBub3QgYWxsCisJLSBvbmNlIHRoZSBkcml2ZXIgcnVucyBpdCBpcyB2ZXJ5IHN0YWJsZSwgYnV0IEkgaGF2ZSB0aGUgaW1wcmVzc2lvbgorCSAgc29tZSB0aGUgY3JpdHRpY2FsIHNlY3Rpb25zIHRha2UgdG8gbG9uZworCS0gdGhlIGRyaXZlciBpcyBzcGxpdCBpbnRvIGEgSGVybWVzIElJIGFuZCBhIEhlcm1lcyBJSS41IHBhcnQsIGl0CisJICB3b3VsZCBiZSBuaWNlIHRvIGhhbmRsZSBib3RoIHdpdGggb25lIG1vZHVsZSBpbnN0ZWFkIG9mIHR3bworCS0gcmV2aWV3IGJ5IHRoZSB3aXJlbGVzcyBkZXZlbG9wZXIgY29tbXVuaXR5CisJLSB2ZXJpZnkgdGhlIGNvZGUgYWdhaW5zdCB0aGUgY29kaW5nIHN0YW5kYXJkcyBmb3IgYSBwcm9wcGVyIGxpbnV4CisJICBkcml2ZXIKKwktIHJlc29sdmUgbGljZW5zZSBpc3N1ZXMgKD8pCisKK0RPTkU6CisJLSB2ZXJpZmllZCBhZ2FpbnN0IGEgSGVybWVzIElJIGNhcmQgKFRob21zb24gU3BlZWR0b3VjaCAxMTAgUENNQ0lBCisJICBjYXJkKQorCS0gdmVyaWZpZWQgd2l0aCBXRVAgZW5jcmlwdGlvbgorCitQbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyBvciBjb21wbGFpbnRzIGFib3V0IHRoaXMgZHJpdmVyIHRvIEdyZWcKK0tyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQgQ2M6IEhlbmsgZGUgR3Jvb3QgPHBlMWRubkBhbXNhdC5vcmc+CitEb24ndCBib3RoZXIgdGhlIHVwc3RyZWFtIHdpcmVsZXNzIGtlcm5lbCBkZXZlbG9wZXJzIGFib3V0IGl0LCB0aGV5Cit3YW50IG5vdGhpbmcgdG8gZG8gd2l0aCBpdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL1dBUk5JTkcudHh0IGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvV0FSTklORy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxMjk3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL1dBUk5JTkcudHh0CkBAIC0wLDAgKzEsMyBAQAorVGhlc2Ugc291cmNlcyBhcmUgc2hhcmVkIHdpdGggdGhlIHdsYWdzNDlfaDI1IGRyaXZlci4gU29tZSBmaWxlcyBhcmUgZXZlbgorZXhjbHVzaXZlbHkgdXNlZCBieSB0aGF0IGRyaXZlci4gRG8gbm90IGRlbGV0ZSB0aGVtIGhlcmUgd2l0aG91dCBsb29raW5nCithdCB0aGF0IG90aGVyIGRyaXZlci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2FwX2gyLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9hcF9oMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MTIzZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9hcF9oMi5jCkBAIC0wLDAgKzEsMzMzNyBAQAorLyoKKyAqIEZpbGU6CWFwX2gyNC4yMzYKKyAqCisgKiBBYnN0cmFjdDoJVGhpcyBmaWxlIGNvbnRhaW5zIG1lbW9yeSBpbWFnZSAnZndfaW1hZ2UnLgorICoKKyAqIENvbnRlbnRzOglUb3RhbCBzaXplIG9mIHRoZSBtZW1vcnkgaW1hZ2U6IDUxMDEwIGJ5dGVzLgorICoJCVRvdGFsIG51bWJlciBvZiBibG9ja3M6IDQgYmxvY2tzLgorICoJCUJsb2NrICAxIDogbG9hZCBhZGRyZXNzIDAwMDAwMDYwLCAzMjYgYnl0ZXMuCisgKgkJQmxvY2sgIDIgOiBsb2FkIGFkZHJlc3MgMDAwMDBDMTYsIDY0MjQgYnl0ZXMuCisgKgkJQmxvY2sgIDMgOiBsb2FkIGFkZHJlc3MgMDAxRTI1MkUsIDQ0NCBieXRlcy4KKyAqCQlCbG9jayAgNCA6IGxvYWQgYWRkcmVzcyAwMDFGNDAwMCwgNDM4MTYgYnl0ZXMuCisgKgorICogSWRlbnRpdHk6CWNvbXBvbmVudCBpZDogMzIgKHZhcmlhbnQgMikgdmVyc2lvbiAyLjM2CisgKgorICogQ29tcGF0aWJpbGl0eToKKyAqCQlzdXBwbHlpbmcgaW50ZXJmYWNlIDggKHZhcmlhbnQgMikgOiAyIC0gNAorICoJCWFjdGluZyBvbiBpbnRlcmZhY2UgMSAodmFyaWFudCA0KSA6IDYgLSA3CisgKgkJYWN0aW5nIG9uIGludGVyZmFjZSAxICh2YXJpYW50IDUpIDogNiAtIDcKKyAqCQlhY3Rpbmcgb24gaW50ZXJmYWNlIDEgKHZhcmlhbnQgNikgOiA2IC0gNworICoJCWFjdGluZyBvbiBpbnRlcmZhY2UgMiAodmFyaWFudCAyKSA6IDEgLSAyCisgKgorICogR2VuZXJhdGVkOglieSBnOlxmd1xmdXB1My5leGUgdmVyc2lvbiA0LjI2CisgKgorICogQ29tbWFuZGxpbmU6CWc6XGZ3XGZ1cHUzLmV4ZSAvZj00IC9uPWZ3X2ltYWdlIC9pPXQyMDIzNjAwLmhleAorICovCisKKworI2luY2x1ZGUgImhjZmNmZy5oIgkJCQkvLyB0byBnZXQgaGNmXzE2IGV0YyBkZWZpbmVkIGFzIHdlbGwgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libGUgc2V0dGluZ3Mgd2hpY2ggaW5sdWVuY2UgbWRkLmggb3IgZGhmLmgKKyNpbmNsdWRlICJtZGQuaCIgICAJCQkJLy90byBnZXQgQ09NUF9JRF9TVEEgZXRjIGRlZmluZWQKKyNpbmNsdWRlICJkaGYuaCIgICAJCQkJLy91c2VkIHRvIGJlICJmaGZtZW0uaCIsIHRvIGdldCBtZW1ibG9jayxwbHVncmVjb3JkLAorCitzdGF0aWMgY29uc3QgaGNmXzggZndfaW1hZ2VfMV9kYXRhW10gPSB7CisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUMsIDB4MEQsIDB4MDAsIDB4MDAsCisJIDB4M0EsIDB4MEMsIDB4MDAsIDB4MDAsIDB4M0EsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzgsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MDAsCisJIDB4MEEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4RUEsIDB4MDAsIDB4MDAsIDB4RkYsIDB4MDcsIDB4MDIsIDB4MDAsIDB4NjQsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MTAsIDB4MjcsIDB4MTAsIDB4MjcsCisJIDB4MTQsIDB4MDAsIDB4RDAsIDB4MDcsIDB4RDAsIDB4MDcsIDB4MTAsIDB4MjcsIDB4MkYsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MDUsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MTAsIDB4MjcsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MEEsIDB4MDAsCisJIDB4MDcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDksIDB4MkIsIDB4MDksIDB4MkIsIDB4MDksCisJIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NkUsIDB4MDAsIDB4MTQsIDB4MDEsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MzIsIDB4MDAsCisJIDB4MEEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisKK307ICAvKiBmd19pbWFnZV8xX2RhdGEgKi8KKworc3RhdGljIGNvbnN0IGhjZl84IGZ3X2ltYWdlXzJfZGF0YVtdID0geworCSAweDlCLCAweEE3LCAweDAwLCAweDBBLCAweDEwLCAweDAxLCAweDY4LCAweEE0LCAweEIwLCAweDAxLCAweDg0LCAweDAxLCAweDMwLCAweDMzLCAweDMxLCAweDMzLAorCSAweDQ0LCAweDQ0LCAweDMwLCAweDMzLCAweDMxLCAweDMzLCAweDMwLCAweDMzLCAweDMxLCAweDMzLCAweDMyLCAweDMzLCAweDMyLCAweDMzLCAweDkwLCAweDAwLAorCSAweDc4LCAweDA0LCAweEFFLCAweEU0LCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCLAorCSAweDBDLCAweDBELCAweDBFLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE1LCAweEM2LCAweDg0LCAweEY4LCAweDk5LCAweEVFLAorCSAweDhELCAweEY2LCAweDBELCAweEZGLCAweEJELCAweEQ2LCAweEIxLCAweERFLCAweDU0LCAweDkxLCAweDUwLCAweDYwLCAweDAzLCAweDAyLCAweEE5LCAweENFLAorCSAweDdELCAweDU2LCAweDE5LCAweEU3LCAweDYyLCAweEI1LCAweEU2LCAweDRELCAweDlBLCAweEVDLCAweDQ1LCAweDhGLCAweDlELCAweDFGLCAweDQwLCAweDg5LAorCSAweDg3LCAweEZBLCAweDE1LCAweEVGLCAweEVCLCAweEIyLCAweEM5LCAweDhFLCAweDBCLCAweEZCLCAweEVDLCAweDQxLCAweDY3LCAweEIzLCAweEZELCAweDVGLAorCSAweEVBLCAweDQ1LCAweEJGLCAweDIzLCAweEY3LCAweDUzLCAweDk2LCAweEU0LCAweDVCLCAweDlCLCAweEMyLCAweDc1LCAweDFDLCAweEUxLCAweEFFLCAweDNELAorCSAweDZBLCAweDRDLCAweDVBLCAweDZDLCAweDQxLCAweDdFLCAweDAyLCAweEY1LCAweDRGLCAweDgzLCAweDVDLCAweDY4LCAweEY0LCAweDUxLCAweDM0LCAweEQxLAorCSAweDA4LCAweEY5LCAweDkzLCAweEUyLCAweDczLCAweEFCLCAweDUzLCAweDYyLCAweDNGLCAweDJBLCAweDBDLCAweDA4LCAweDUyLCAweDk1LCAweDY1LCAweDQ2LAorCSAweDVFLCAweDlELCAweDI4LCAweDMwLCAweEExLCAweDM3LCAweDBGLCAweDBBLCAweEI1LCAweDJGLCAweDA5LCAweDBFLCAweDM2LCAweDI0LCAweDlCLCAweDFCLAorCSAweDNELCAweERGLCAweDI2LCAweENELCAweDY5LCAweDRFLCAweENELCAweDdGLCAweDlGLCAweEVBLCAweDFCLCAweDEyLCAweDlFLCAweDFELCAweDc0LCAweDU4LAorCSAweDJFLCAweDM0LCAweDJELCAweDM2LCAweEIyLCAweERDLCAweEVFLCAweEI0LCAweEZCLCAweDVCLCAweEY2LCAweEE0LCAweDRELCAweDc2LCAweDYxLCAweEI3LAorCSAweENFLCAweDdELCAweDdCLCAweDUyLCAweDNFLCAweERELCAweDcxLCAweDVFLCAweDk3LCAweDEzLCAweEY1LCAweEE2LCAweDY4LCAweEI5LCAweDAwLCAweDAwLAorCSAweDJDLCAweEMxLCAweDYwLCAweDQwLCAweDFGLCAweEUzLCAweEM4LCAweDc5LCAweEVELCAweEI2LCAweEJFLCAweEQ0LCAweDQ2LCAweDhELCAweEQ5LCAweDY3LAorCSAweDRCLCAweDcyLCAweERFLCAweDk0LCAweEQ0LCAweDk4LCAweEU4LCAweEIwLCAweDRBLCAweDg1LCAweDZCLCAweEJCLCAweDJBLCAweEM1LCAweEU1LCAweDRGLAorCSAweDE2LCAweEVELCAweEM1LCAweDg2LCAweEQ3LCAweDlBLCAweDU1LCAweDY2LCAweDk0LCAweDExLCAweENGLCAweDhBLCAweDEwLCAweEU5LCAweDA2LCAweDA0LAorCSAweDgxLCAweEZFLCAweEYwLCAweEEwLCAweDQ0LCAweDc4LCAweEJBLCAweDI1LCAweEUzLCAweDRCLCAweEYzLCAweEEyLCAweEZFLCAweDVELCAweEMwLCAweDgwLAorCSAweDhBLCAweDA1LCAweEFELCAweDNGLCAweEJDLCAweDIxLCAweDQ4LCAweDcwLCAweDA0LCAweEYxLCAweERGLCAweDYzLCAweEMxLCAweDc3LCAweDc1LCAweEFGLAorCSAweDYzLCAweDQyLCAweDMwLCAweDIwLCAweDFBLCAweEU1LCAweDBFLCAweEZELCAweDZELCAweEJGLCAweDRDLCAweDgxLCAweDE0LCAweDE4LCAweDM1LCAweDI2LAorCSAweDJGLCAweEMzLCAweEUxLCAweEJFLCAweEEyLCAweDM1LCAweENDLCAweDg4LCAweDM5LCAweDJFLCAweDU3LCAweDkzLCAweEYyLCAweDU1LCAweDgyLCAweEZDLAorCSAweDQ3LCAweDdBLCAweEFDLCAweEM4LCAweEU3LCAweEJBLCAweDJCLCAweDMyLCAweDk1LCAweEU2LCAweEEwLCAweEMwLCAweDk4LCAweDE5LCAweEQxLCAweDlFLAorCSAweDdGLCAweEEzLCAweDY2LCAweDQ0LCAweDdFLCAweDU0LCAweEFCLCAweDNCLCAweDgzLCAweDBCLCAweENBLCAweDhDLCAweDI5LCAweEM3LCAweEQzLCAweDZCLAorCSAweDNDLCAweDI4LCAweDc5LCAweEE3LCAweEUyLCAweEJDLCAweDFELCAweDE2LCAweDc2LCAweEFELCAweDNCLCAweERCLCAweDU2LCAweDY0LCAweDRFLCAweDc0LAorCSAweDFFLCAweDE0LCAweERCLCAweDkyLCAweDBBLCAweDBDLCAweDZDLCAweDQ4LCAweEU0LCAweEI4LCAweDVELCAweDlGLCAweDZFLCAweEJELCAweEVGLCAweDQzLAorCSAweEE2LCAweEM0LCAweEE4LCAweDM5LCAweEE0LCAweDMxLCAweDM3LCAweEQzLCAweDhCLCAweEYyLCAweDMyLCAweEQ1LCAweDQzLCAweDhCLCAweDU5LCAweDZFLAorCSAweEI3LCAweERBLCAweDhDLCAweDAxLCAweDY0LCAweEIxLCAweEQyLCAweDlDLCAweEUwLCAweDQ5LCAweEI0LCAweEQ4LCAweEZBLCAweEFDLCAweDA3LCAweEYzLAorCSAweDI1LCAweENGLCAweEFGLCAweENBLCAweDhFLCAweEY0LCAweEU5LCAweDQ3LCAweDE4LCAweDEwLCAweEQ1LCAweDZGLCAweDg4LCAweEYwLCAweDZGLCAweDRBLAorCSAweDcyLCAweDVDLCAweDI0LCAweDM4LCAweEYxLCAweDU3LCAweEM3LCAweDczLCAweDUxLCAweDk3LCAweDIzLCAweENCLCAweDdDLCAweEExLCAweDlDLCAweEU4LAorCSAweDIxLCAweDNFLCAweERELCAweDk2LCAweERDLCAweDYxLCAweDg2LCAweDBELCAweDg1LCAweDBGLCAweDkwLCAweEUwLCAweDQyLCAweDdDLCAweEM0LCAweDcxLAorCSAweEFBLCAweENDLCAweEQ4LCAweDkwLCAweDA1LCAweDA2LCAweDAxLCAweEY3LCAweDEyLCAweDFDLCAweEEzLCAweEMyLCAweDVGLCAweDZBLCAweEY5LCAweEFFLAorCSAweEQwLCAweDY5LCAweDkxLCAweDE3LCAweDU4LCAweDk5LCAweDI3LCAweDNBLCAweEI5LCAweDI3LCAweDM4LCAweEQ5LCAweDEzLCAweEVCLCAweEIzLCAweDJCLAorCSAweDMzLCAweDIyLCAweEJCLCAweEQyLCAweDcwLCAweEE5LCAweDg5LCAweDA3LCAweEE3LCAweDMzLCAweEI2LCAweDJELCAweDIyLCAweDNDLCAweDkyLCAweDE1LAorCSAweDIwLCAweEM5LCAweDQ5LCAweDg3LCAweEZGLCAweEFBLCAweDc4LCAweDUwLCAweDdBLCAweEE1LCAweDhGLCAweDAzLCAweEY4LCAweDU5LCAweDgwLCAweDA5LAorCSAweDE3LCAweDFBLCAweERBLCAweDY1LCAweDMxLCAweEQ3LCAweEM2LCAweDg0LCAweEI4LCAweEQwLCAweEMzLCAweDgyLCAweEIwLCAweDI5LCAweDc3LCAweDVBLAorCSAweDExLCAweDFFLCAweENCLCAweDdCLCAweEZDLCAweEE4LCAweEQ2LCAweDZELCAweDNBLCAweDJDLCAweDAwLCAweDMwLCAweDAwLCAweDMxLCAweDAwLCAweDMzLAorCSAweDAwLCAweDM0LCAweDAwLCAweDM1LCAweDAwLCAweDM2LCAweDAwLCAweDM3LCAweDAwLCAweDM4LCAweDAwLCAweDM4LCAweDAwLCAweDNBLCAweDAwLCAweDNCLAorCSAweDAwLCAweDNDLCAweDAwLCAweDNELCAweDAwLCAweDNFLCAweDAwLCAweDNGLCAweDAwLCAweDNGLCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDBBLCAweDAyLCAweDE0LAorCSAweDA1LCAweDMyLCAweDBCLCAweDM3LCAweDA4LCAweDUwLCAweDBCLCAweDZFLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDNGLCAweDAwLAorCSAweDBDLCAweDAwLCAweDMwLCAweDAwLCAweDAzLCAweDAwLCAweDBGLCAweDAwLCAweDNFLCAweDAwLCAweDNDLCAweDAwLCAweDAyLCAweDAwLCAweDA0LCAweDAwLAorCSAweDBBLCAweDAwLCAweDBCLCAweDAwLCAweDEwLCAweDAwLCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDYzLCAweDAwLCAweDYzLCAweDAwLCAweDIwLCAweDAwLCAweDYzLCAweDAwLCAweDYzLCAweDAwLCAweDIwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDBBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDUwLCAweDEwLAorCSAweDlFLCAweDEwLCAweDU2LCAweDEwLCAweDk4LCAweDEwLCAweDVDLCAweDEwLCAweDkyLCAweDEwLCAweDYyLCAweDEwLCAweDhDLCAweDEwLCAweDY4LCAweDEwLAorCSAweDg2LCAweDEwLCAweDZFLCAweDEwLCAweDgwLCAweDEwLCAweDc0LCAweDEwLCAweDdBLCAweDEwLCAweDA3LCAweDAxLCAweDAwLCAweDAwLCAweDBBLCAweDIyLAorCSAweDAwLCAweDA0LCAweDA4LCAweDAxLCAweDAwLCAweDAwLCAweDBBLCAweDI2LCAweDAwLCAweDA0LCAweDA5LCAweDAxLCAweDAwLCAweDAwLCAweDBBLCAweDJBLAorCSAweDAwLCAweDA0LCAweDBBLCAweDAxLCAweDAwLCAweDAwLCAweDBBLCAweDJFLCAweDAwLCAweDA0LCAweDBCLCAweDAxLCAweDAwLCAweDAwLCAweDEwLCAweDI0LAorCSAweDA0LCAweDA0LCAweDBDLCAweDAxLCAweDAwLCAweDAwLCAweDEwLCAweDI4LCAweDA0LCAweDA0LCAweDBELCAweDAxLCAweDAwLCAweDAwLCAweDEwLCAweDJDLAorCSAweDA0LCAweDA0LCAweDBFLCAweDAxLCAweDAwLCAweDAwLCAweDEwLCAweDMwLCAweDA0LCAweDA0LCAweDBGLCAweDAxLCAweDAwLCAweDAwLCAweDE2LCAweDM0LAorCSAweDA4LCAweDA0LCAweDEwLCAweDAxLCAweDAwLCAweDAwLCAweDE2LCAweDM4LCAweDA4LCAweDA0LCAweDExLCAweDAxLCAweDAwLCAweDAwLCAweDE2LCAweDNDLAorCSAweDA4LCAweDA0LCAweDEyLCAweDAxLCAweDAwLCAweDAwLCAweDE2LCAweDQwLCAweDA4LCAweDA0LCAweDEzLCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDY0LAorCSAweDBDLCAweDBCLCAweDE0LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDY4LCAweDBDLCAweDBCLCAweDE1LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDZDLAorCSAweDBDLCAweDBCLCAweDE2LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDcwLCAweDBDLCAweDBCLCAweDE3LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDc0LAorCSAweDBDLCAweDBCLCAweDE4LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDc4LCAweDBDLCAweDBCLCAweDE5LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDdDLAorCSAweDBDLCAweDBCLCAweDFBLCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDgwLCAweDBDLCAweDBCLCAweDFCLCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDg0LAorCSAweDBDLCAweDBCLCAweDFDLCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDg4LCAweDBDLCAweDBCLCAweDFELCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDhDLAorCSAweDBDLCAweDBCLCAweDFFLCAweDAxLCAweDAwLCAweDAwLCAweDFELCAweDk1LCAweDE3LCAweDA0LCAweDFGLCAweDAxLCAweDAwLCAweDAwLCAweDFELCAweDk5LAorCSAweDE3LCAweDA0LCAweDIwLCAweDAxLCAweDAwLCAweDAwLCAweDFELCAweDlELCAweDE3LCAweDA0LCAweDIxLCAweDAxLCAweDAwLCAweDAwLCAweDFELCAweEExLAorCSAweDE3LCAweDA0LCAweDIyLCAweDAxLCAweDAwLCAweDAwLCAweDBFLCAweEE1LCAweDAwLCAweDAwLCAweEMwLCAweDEwLCAweEUwLCAweDEwLCAweDAwLCAweDExLAorCSAweDIwLCAweDExLCAweDc4LCAweDExLCAweEM4LCAweDEwLCAweEU4LCAweDEwLCAweDA4LCAweDExLCAweDI4LCAweDExLCAweDgwLCAweDExLCAweEQwLCAweDEwLAorCSAweEYwLCAweDEwLCAweDEwLCAweDExLCAweDMwLCAweDExLCAweDg4LCAweDExLCAweEQ4LCAweDEwLCAweEY4LCAweDEwLCAweDE4LCAweDExLCAweDM4LCAweDExLAorCSAweDkwLCAweDExLCAweDQwLCAweDExLCAweDQ4LCAweDExLCAweDUwLCAweDExLCAweDU4LCAweDExLCAweDYwLCAweDExLCAweDY4LCAweDExLCAweDcwLCAweDExLAorCSAweDk4LCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQyLCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEVCLCAweEJBLCAweEVCLAorCSAweERGLCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLAorCSAweDU3LCAweEVCLCAweDkwLCAweEYxLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweEQ2LCAweEVELAorCSAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLAorCSAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDJGLCAweEVFLAorCSAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLAorCSAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweEE0LCAweEVELCAweEJFLCAweEVELAorCSAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDdGLCAweEY0LCAweDE5LCAweEVDLAorCSAweDJDLCAweEVDLCAweERDLCAweEVDLCAweEUwLCAweEVDLCAweDU3LCAweEVCLCAweDU3LCAweEVCLCAweDhGLCAweEVELCAweDg0LCAweEUzLCAweDU5LCAweEUzLAorCSAweEQ3LCAweEUzLCAweDI4LCAweEU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEVCLCAweEY2LCAweEVCLCAweDcyLCAweEYwLCAweDcyLCAweEYwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEZDLCAweDg5LCAweEVFLCAweDQ1LCAweEYwLCAweDVBLCAweDAwLCAweDAyLCAweDAwLCAweEY5LCAweEZGLAorCSAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweENDLCAweDAwLCAweDAyLCAweDAwLCAweEY3LCAweEZGLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweEI2LCAweDFGLAorCSAweDA2LCAweDAwLCAweEYwLCAweEZGLCAweDg5LCAweEVFLCAweDczLCAweEVFLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweEY2LCAweEZGLCAweDg5LCAweEVFLAorCSAweDlGLCAweEVFLCAweDZDLCAweDAwLCAweDAyLCAweDAwLCAweEY0LCAweEZGLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweDZBLCAweDAxLCAweDAyLCAweDAwLAorCSAweEY1LCAweEZGLCAweDg5LCAweEVFLCAweDRFLCAweEYwLCAweEE4LCAweDFGLCAweDAyLCAweDAwLCAweEUwLCAweEZGLCAweDg5LCAweEVFLCAweDlGLCAweEVFLAorCSAweEVFLCAweDIxLCAweDAyLCAweDAwLCAweEUxLCAweEZGLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweEYwLCAweDIxLCAweDAyLCAweDAwLCAweEUyLCAweEZGLAorCSAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweEYyLCAweDIxLCAweDAyLCAweDAwLCAweEUzLCAweEZGLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweEVBLCAweDIxLAorCSAweDAyLCAweDAwLCAweDAzLCAweEZDLCAweDg5LCAweEVFLCAweEU1LCAweEVGLCAweDdDLCAweDIxLCAweDAyLCAweDAwLCAweDA0LCAweEZDLCAweDg5LCAweEVFLAorCSAweDk5LCAweEVFLCAweEJFLCAweDFGLCAweDIyLCAweDAwLCAweDA2LCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweEE2LCAweDFGLCAweDAyLCAweDAwLAorCSAweDA3LCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweDAyLCAweDIwLCAweDAyLCAweDAwLCAweDBFLCAweEZDLCAweDg5LCAweEVFLCAweEY3LCAweEVGLAorCSAweDBDLCAweDIwLCAweDIyLCAweDAwLCAweEIxLCAweEZDLCAweDg5LCAweEVFLCAweDU4LCAweEYyLCAweDJDLCAweDIxLCAweDAyLCAweDAwLCAweDIwLCAweEZDLAorCSAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweDMyLCAweDIwLCAweDAyLCAweDAwLCAweDI1LCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweDNDLCAweDIwLAorCSAweDAyLCAweDAwLCAweDI2LCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweDNFLCAweDIwLCAweDAyLCAweDAwLCAweDI3LCAweEZDLCAweDg5LCAweEVFLAorCSAweDlGLCAweEVFLCAweDQwLCAweDIwLCAweDAyLCAweDAwLCAweEIyLCAweEZDLCAweDg5LCAweEVFLCAweDk5LCAweEVFLCAweDUwLCAweDIxLCAweDIyLCAweDAwLAorCSAweEMxLCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweDk4LCAweDIxLCAweDIwLCAweDAwLCAweEIwLCAweEZDLCAweDY5LCAweEVFLCAweDVELCAweEYyLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM0LCAweEZDLCAweDY5LCAweEVFLCAweDY4LCAweEYwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweEM4LCAweEZDLAorCSAweDY5LCAweEVFLCAweDYzLCAweEYwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweEI0LCAweEZDLCAweDY5LCAweEVFLCAweDlCLCAweEYyLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweEI2LCAweEZDLCAweDY5LCAweEVFLCAweDRFLCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI3LCAweEZDLCAweDY5LCAweEVFLAorCSAweDkwLCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI4LCAweEZDLCAweDY5LCAweEVFLCAweEVELCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweEI1LCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweEU2LCAweDIxLCAweDAyLCAweDAwLCAweEI5LCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLAorCSAweEU4LCAweDIxLCAweDAyLCAweDAwLCAweDkwLCAweEZELCAweDg5LCAweEVFLCAweDczLCAweEVFLCAweEVDLCAweDIxLCAweDAyLCAweDAwLCAweDIzLCAweEZDLAorCSAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweDM4LCAweDIwLCAweDAyLCAweDAwLCAweDI5LCAweEZDLCAweDQ4LCAweEVGLCAweEY1LCAweEVFLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweEMyLCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweDc0LCAweDIxLCAweDAyLCAweDAwLCAweDMyLCAweEZDLCAweDg5LCAweEVFLAorCSAweDlGLCAweEVFLCAweDYwLCAweDAxLCAweDAyLCAweDAwLCAweDMzLCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweDYyLCAweDAxLCAweDAyLCAweDAwLAorCSAweDEwLCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweEFFLCAweDFGLCAweDAyLCAweDAwLCAweDExLCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLAorCSAweDQ2LCAweDIwLCAweDA2LCAweDAwLCAweDEyLCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweDRDLCAweDIwLCAweDA2LCAweDAwLCAweDEzLCAweEZDLAorCSAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweDUyLCAweDIwLCAweDA2LCAweDAwLCAweDE0LCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweDU4LCAweDIwLAorCSAweDA2LCAweDAwLCAweDE1LCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweDVFLCAweDIwLCAweDA2LCAweDAwLCAweDE2LCAweEZDLCAweDg5LCAweEVFLAorCSAweDlGLCAweEVFLCAweDY0LCAweDIwLCAweDA2LCAweDAwLCAweDE3LCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweDJFLCAweDIwLCAweDAyLCAweDAwLAorCSAweDgzLCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweDZFLCAweDAxLCAweDAyLCAweDAwLCAweDk3LCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLAorCSAweDZDLCAweDAxLCAweDAyLCAweDAwLCAweDk4LCAweEZDLCAweDMxLCAweEYwLCAweDFGLCAweEYwLCAweEU0LCAweDAwLCAweDAyLCAweDAwLCAweDk5LCAweEZDLAorCSAweDMxLCAweEYwLCAweDFGLCAweEYwLCAweEU0LCAweDAyLCAweDAyLCAweDAwLCAweDlBLCAweEZDLCAweDMxLCAweEYwLCAweDFGLCAweEYwLCAweEU0LCAweDA0LAorCSAweDAyLCAweDAwLCAweDlCLCAweEZDLCAweDMxLCAweEYwLCAweDFGLCAweEYwLCAweEU0LCAweDA2LCAweDAyLCAweDAwLCAweDlDLCAweEZDLCAweDMxLCAweEYwLAorCSAweDFGLCAweEYwLCAweEU0LCAweDA4LCAweDAyLCAweDAwLCAweDlELCAweEZDLCAweDMxLCAweEYwLCAweDFGLCAweEYwLCAweEU0LCAweDBBLCAweDAyLCAweDAwLAorCSAweDE4LCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweDMwLCAweDIwLCAweDAyLCAweDAwLCAweDIyLCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLAorCSAweDM2LCAweDIwLCAweDAyLCAweDAwLCAweDI0LCAweEZDLCAweDg5LCAweEVFLCAweDlGLCAweEVFLCAweDNBLCAweDIwLCAweDAyLCAweDAwLCAweEMwLCAweEZDLAorCSAweDY5LCAweEVFLCAweDYxLCAweEYwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDlFLCAweEZDLCAweDg5LCAweEVFLCAweDE3LCAweEYwLCAweDcwLCAweDAxLAorCSAweDAyLCAweDAwLCAweDlGLCAweEZDLCAweDMxLCAweEYwLCAweDFGLCAweEYwLCAweEU2LCAweDAwLCAweDAyLCAweDAwLCAweEEwLCAweEZDLCAweDMxLCAweEYwLAorCSAweDFGLCAweEYwLCAweEU2LCAweDAyLCAweDAyLCAweDAwLCAweEExLCAweEZDLCAweDMxLCAweEYwLCAweDFGLCAweEYwLCAweEU2LCAweDA0LCAweDAyLCAweDAwLAorCSAweEEyLCAweEZDLCAweDMxLCAweEYwLCAweDFGLCAweEYwLCAweEU2LCAweDA2LCAweDAyLCAweDAwLCAweEEzLCAweEZDLCAweDMxLCAweEYwLCAweDFGLCAweEYwLAorCSAweEU2LCAweDA4LCAweDAyLCAweDAwLCAweEE0LCAweEZDLCAweDMxLCAweEYwLCAweDFGLCAweEYwLCAweEU2LCAweDBBLCAweDAyLCAweDAwLCAweDIwLCAweEZELAorCSAweEJBLCAweEVFLCAweDczLCAweEVFLCAweDUzLCAweEY1LCAweDA4LCAweDAwLCAweDIxLCAweEZELCAweEJBLCAweEVFLCAweDczLCAweEVFLCAweDU3LCAweEY1LAorCSAweDBBLCAweDAwLCAweDIyLCAweEZELCAweEJBLCAweEVFLCAweDczLCAweEVFLCAweDVDLCAweEY1LCAweDE2LCAweDAwLCAweDIzLCAweEZELCAweEJBLCAweEVFLAorCSAweDczLCAweEVFLCAweDY3LCAweEY1LCAweDBBLCAweDAwLCAweDEwLCAweEZELCAweDg5LCAweEVFLCAweDczLCAweEVFLCAweDM0LCAweDAxLCAweDAyLCAweDAwLAorCSAweDQ1LCAweEZELCAweDg5LCAweEVFLCAweDczLCAweEVFLCAweENDLCAweDAwLCAweDAyLCAweDAwLCAweDQ3LCAweEZELCAweDg5LCAweEVFLCAweDczLCAweEVFLAorCSAweDM4LCAweDAxLCAweDAyLCAweDAwLCAweDQ4LCAweEZELCAweDlFLCAweEVGLCAweDczLCAweEVFLCAweDYwLCAweDAxLCAweDAyLCAweDAwLCAweDQ5LCAweEZELAorCSAweDlFLCAweEVGLCAweDczLCAweEVFLCAweDYyLCAweDAxLCAweDAyLCAweDAwLCAweDRBLCAweEZELCAweDg5LCAweEVFLCAweDczLCAweEVFLCAweDU4LCAweDAxLAorCSAweDAyLCAweDAwLCAweDRCLCAweEZELCAweDg5LCAweEVFLCAweDczLCAweEVFLCAweDVBLCAweDAxLCAweDAyLCAweDAwLCAweDRELCAweEZELCAweEJBLCAweEVFLAorCSAweDczLCAweEVFLCAweDZDLCAweEY1LCAweDA0LCAweDAwLCAweDRGLCAweEZELCAweEIyLCAweEVGLCAweDczLCAweEVFLCAweDgwLCAweDIxLCAweDAyLCAweDAwLAorCSAweEMwLCAweEZELCAweEJBLCAweEVFLCAweDczLCAweEVFLCAweDZFLCAweEY1LCAweDAyLCAweDAwLCAweEMyLCAweEZELCAweEE4LCAweEVGLCAweDczLCAweEVFLAorCSAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweEMzLCAweEZELCAweEJBLCAweEVFLCAweDczLCAweEVFLCAweDZGLCAweEY1LCAweDAyLCAweDAwLCAweDQwLCAweEZELAorCSAweEIyLCAweEVFLCAweDczLCAweEVFLCAweDc4LCAweDAxLCAweDAyLCAweDAwLCAweDI0LCAweEZELCAweEQ4LCAweEVGLCAweDczLCAweEVFLCAweDAwLCAweDAwLAorCSAweDAyLCAweDAwLCAweDkxLCAweEZELCAweDg5LCAweEVFLCAweDczLCAweEVFLCAweDg2LCAweDFCLCAweDAyLCAweDAwLCAweDkzLCAweEZELCAweDg5LCAweEVFLAorCSAweDczLCAweEVFLCAweDhDLCAweDFCLCAweDAyLCAweDAwLCAweEMxLCAweEZELCAweDg5LCAweEVFLCAweDczLCAweEVFLCAweENBLCAweDAwLCAweDAyLCAweDAwLAorCSAweEM2LCAweEZELCAweEU3LCAweEVFLCAweDczLCAweEVFLCAweDhFLCAweDIxLCAweDBBLCAweDAwLCAweDg5LCAweEZELCAweDVGLCAweEVGLCAweDczLCAweEVFLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweEZELCAweEQ3LCAweEVFLCAweDczLCAweEVFLCAweEMwLCAweDIxLCAweDI0LCAweDAwLCAweDQ2LCAweEZELAorCSAweDg5LCAweEVFLCAweDczLCAweEVFLCAweDdBLCAweDAxLCAweDA2LCAweDAwLCAweDg2LCAweEZELCAweDg5LCAweEVFLCAweDczLCAweEVFLCAweEI2LCAweDFGLAorCSAweDA2LCAweDAwLCAweDg3LCAweEZELCAweDg5LCAweEVFLCAweDczLCAweEVFLCAweEI4LCAweDIxLCAweDA2LCAweDAwLCAweDhCLCAweEZELCAweDdBLCAweEYzLAorCSAweDczLCAweEVFLCAweDAwLCAweDAwLCAweDEyLCAweDAwLCAweDhFLCAweEZELCAweDg5LCAweEVFLCAweDczLCAweEVFLCAweEI4LCAweDEyLCAweDAyLCAweDAwLAorCSAweDgwLCAweEZELCAweEJDLCAweEVGLCAweDczLCAweEVFLCAweDFDLCAweDAwLCAweDAyLCAweDAwLCAweDgxLCAweEZELCAweEJDLCAweEVGLCAweDczLCAweEVFLAorCSAweDFDLCAweDAyLCAweDAyLCAweDAwLCAweDgyLCAweEZELCAweEJDLCAweEVGLCAweDczLCAweEVFLCAweDFDLCAweDA0LCAweDAyLCAweDAwLCAweDgzLCAweEZELAorCSAweEJDLCAweEVGLCAweDczLCAweEVFLCAweDFDLCAweDA2LCAweDAyLCAweDAwLCAweDg0LCAweEZELCAweEJDLCAweEVGLCAweDczLCAweEVFLCAweDFDLCAweDA4LAorCSAweDAyLCAweDAwLCAweDg1LCAweEZELCAweEJDLCAweEVGLCAweDczLCAweEVFLCAweDFDLCAweDBBLCAweDAyLCAweDAwLCAweDAwLCAweEYxLCAweDQ2LCAweDAwLAorCSAweDJELCAweEVFLCAweEY4LCAweDAwLCAweDAwLCAweDAzLCAweDhBLCAweEVBLCAweDFGLCAweDAwLCAweDM2LCAweDAxLCAweENBLCAweDAwLCAweDk2LCAweDAxLAorCSAweENFLCAweDAwLCAweEZDLCAweDAwLCAweDc4LCAweDAxLCAweERBLCAweDFFLCAweDFBLCAweDAxLCAweDg2LCAweDFCLCAweEM4LCAweDAwLCAweDAwLCAweDAwLAorCSAweENFLCAweDEyLCAweDAwLCAweDAwLCAweEQyLCAweDE0LCAweDE0LCAweDAxLCAweDAzLCAweDAwLCAweEFFLCAweDAwLCAweEU0LCAweDAwLCAweDNDLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDc3LCAweEI0LCAweEVBLCAweEIzLCAweDI2LCAweEI1LCAweDJGLCAweEI1LCAweEZCLCAweEIzLCAweEE0LCAweEI0LCAweDY5LCAweEI0LCAweEU3LCAweEM1LAorCSAweDRBLCAweEM1LCAweEU3LCAweEM1LCAweEJFLCAweEM1LCAweDU0LCAweEM1LCAweDQ4LCAweEM1LCAweDA2LCAweEM2LCAweDE3LCAweEM2LCAweDE3LCAweEM2LAorCSAweDE3LCAweEM2LCAweDIwLCAweEM2LCAweDNCLCAweEM2LCAweDk4LCAweEM2LCAweEI0LCAweEM2LCAweEJGLCAweEM1LCAweEQyLCAweEM1LCAweEE2LCAweEM1LAorCSAweDEwLCAweDAwLCAweDEyLCAweDAwLCAweDEzLCAweDAwLCAweDIwLCAweDAwLCAweDIxLCAweDAwLCAweDIyLCAweDAwLCAweDMwLCAweDAwLCAweDMxLCAweDAwLAorCSAweDMyLCAweDAwLCAweDMzLCAweDAwLCAweDM0LCAweDAwLCAweDM1LCAweDAwLCAweDM2LCAweDAwLCAweDM3LCAweDAwLCAweDM4LCAweDAwLCAweDM5LCAweDAwLAorCSAweDNBLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAxLCAweDE0LCAweDAxLCAweDE0LCAweDAxLCAweDE0LCAweDAxLCAweDE0LCAweDAxLCAweDE0LCAweDAxLAorCSAweDE0LCAweDAxLCAweDE0LCAweDAxLCAweEYzLCAweDAyLCAweEFELCAweDAzLCAweDYwLCAweDA0LCAweDA0LCAweDA1LCAweDA3LCAweDA2LCAweDA4LCAweDA3LAorCSAweDBBLCAweDA4LCAweDE2LCAweDA5LCAweDQ0LCAweDBBLCAweDA0LCAweDBCLCAweDQwLCAweDBDLCAweDgwLCAweDBELCAweDAwLCAweDBFLCAweDg0LCAweDBGLAorCSAweDAxLCAweDEwLCAweDEwLCAweDExLCAweDAyLCAweDE0LCAweDQwLCAweDIwLCAweDMyLCAweDIxLCAweDMyLCAweDIyLCAweDA0LCAweDIzLCAweDAxLCAweDI0LAorCSAweDBGLCAweDI1LCAweDAwLCAweDI2LCAweDAwLCAweDI3LCAweDAwLCAweDI4LCAweDAwLCAweDI5LCAweDAwLCAweDJBLCAweDAxLCAweDJCLCAweDA2LCAweDJDLAorCSAweDAwLCAweDM4LCAweDAwLCAweDM5LCAweEQ2LCAweDNBLCAweDAwLCAweDNCLCAweDAwLCAweDNDLCAweDE0LCAweDNELCAweDdGLCAweDNFLCAweDAwLCAweDNGLAorCSAweDY4LCAweDQwLCAweDc1LCAweDQxLCAweDA3LCAweDQyLCAweDA3LCAweDQzLCAweDAwLCAweDQ1LCAweDNCLCAweDRBLCAweDAwLCAweDRCLCAweDAwLCAweDRDLAorCSAweDBGLCAweDRELCAweDAyLCAweDc1LCAweDAwLCAweDc2LCAweDgwLCAweDAwLCAweDA4LCAweDAxLCAweDA5LCAweDAxLCAweDA5LCAweDAxLCAweDBBLCAweDAxLAorCSAweDBBLCAweDAxLCAweDBCLCAweDAxLCAweDBCLCAweDAxLCAweDBDLCAweDAxLCAweDBDLCAweDAxLCAweDBELCAweDAxLCAweDBELCAweDAxLCAweDBFLCAweDAxLAorCSAweDBFLCAweDAxLCAweDBGLCAweDAxLCAweDBGLCAweDAxLCAweDEwLCAweDAxLCAweDEwLCAweDAxLCAweDExLCAweDAxLCAweDExLCAweDAxLCAweDEyLCAweDAxLAorCSAweDEyLCAweDAxLCAweDEzLCAweDAxLCAweDEzLCAweDAxLCAweDE0LCAweDAxLCAweDE0LCAweDAxLCAweDE1LCAweDAxLCAweDE1LCAweDAxLCAweDE2LCAweDAxLAorCSAweDE2LCAweDAxLCAweDE3LCAweDAxLCAweDE3LCAweDAxLCAweDE4LCAweDAxLCAweDE4LCAweDAxLCAweDE5LCAweDAxLCAweDE5LCAweDAxLCAweDRELCAweDAxLAorCSAweDRELCAweDAxLCAweDRFLCAweDAxLCAweDRFLCAweDAxLCAweDRGLCAweDAxLCAweDRGLCAweDAxLCAweDUwLCAweDAxLCAweDUwLCAweDAxLCAweDUxLCAweDAxLAorCSAweDUxLCAweDAxLCAweDUyLCAweDAxLCAweDUyLCAweDAxLCAweDUzLCAweDAxLCAweDUzLCAweDAxLCAweDU0LCAweDAxLCAweDU0LCAweDAxLCAweDY1LCAweDAxLAorCSAweDY1LCAweDAxLCAweDY2LCAweDAxLCAweDY2LCAweDAxLCAweDY3LCAweDAxLCAweDY3LCAweDAxLCAweDY4LCAweDAxLCAweDY4LCAweDAxLCAweDY5LCAweDAxLAorCSAweDY5LCAweDAxLCAweDZBLCAweDAxLCAweDZBLCAweDAxLCAweDZCLCAweDAxLCAweDZCLCAweDAxLCAweDZDLCAweDAxLCAweDZDLCAweDAxLCAweDZELCAweDAxLAorCSAweDZELCAweDAxLCAweDZFLCAweDAxLCAweDZFLCAweDAxLCAweDZGLCAweDAxLCAweDZGLCAweDAxLCAweDcwLCAweDAxLCAweDcwLCAweDAxLCAweDcxLCAweDAxLAorCSAweDcxLCAweDAxLCAweDcyLCAweDAxLCAweDcyLCAweDAxLCAweDczLCAweDAxLCAweDczLCAweDAxLCAweDc0LCAweDAxLCAweDc0LCAweDAxLCAweDc1LCAweDAxLAorCSAweDc1LCAweDAxLCAweDc2LCAweDAxLCAweDc2LCAweDAxLCAweDc3LCAweDAxLCAweDc3LCAweDAxLCAweDc4LCAweDAxLCAweDc4LCAweDAxLCAweDc5LCAweDAxLAorCSAweDc5LCAweDAxLCAweDdBLCAweDAxLCAweDdBLCAweDAxLCAweDdCLCAweDAxLCAweDdCLCAweDAxLCAweDdDLCAweDAxLCAweDdDLCAweDAxLCAweDdELCAweDAxLAorCSAweDdELCAweDAxLCAweDdFLCAweDAxLCAweDdFLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLAorCSAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLAorCSAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLAorCSAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEyLAorCSAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEyLAorCSAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDgwLCAweDEzLAorCSAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDgwLCAweDEzLAorCSAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDUxLCAweDQ0LAorCSAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LAorCSAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LAorCSAweDIyLCAweDQ2LCAweDIzLCAweDQ2LCAweDIzLCAweDQ2LCAweDIzLCAweDQ2LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LAorCSAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LAorCSAweDFDLCAweDQ3LCAweDFELCAweDQ3LCAweDlBLCAweDQ4LCAweERBLCAweDQ4LCAweDFBLCAweDQ4LCAweDVBLCAweDQ4LCAweDlBLCAweDQ4LCAweERBLCAweDQ4LAorCSAweDFBLCAweDQ4LCAweDVBLCAweDQ4LCAweDlBLCAweDQ4LCAweERBLCAweDQ4LCAweDFBLCAweDQ4LCAweDVBLCAweDQ4LCAweDlBLCAweDQ4LCAweDMzLCAweDQ4LAorCSAweDc4LCAweDQ5LCAweDc4LCAweDQ5LCAweDc5LCAweDQ5LCAweDc5LCAweDQ5LCAweDc5LCAweDQ5LCAweDc5LCAweDQ5LCAweDdBLCAweDQ5LCAweDdBLCAweDQ5LAorCSAweDdBLCAweDQ5LCAweDdBLCAweDQ5LCAweDdCLCAweDQ5LCAweDdCLCAweDQ5LCAweDdCLCAweDQ5LCAweDdDLCAweDQ5LCAweDMyLCAweDAwLCAweDQ2LCAweDAwLAorCSAweDVBLCAweDAwLCAweDZFLCAweDAwLCAweDgyLCAweDAwLCAweDk2LCAweDAwLCAweEFBLCAweDAwLCAweEJFLCAweDAwLCAweEQyLCAweDAwLCAweEU2LCAweDAwLAorCSAweEZBLCAweDAwLCAweDBFLCAweDAxLCAweDIyLCAweDAxLCAweDUyLCAweDAxLCAweDA1LCAweDAwLCAweDA0LCAweDAwLCAweDA0LCAweDAwLCAweDA0LCAweDAwLAorCSAweDA0LCAweDAwLCAweDAzLCAweDAwLCAweDAzLCAweDAwLCAweDAzLCAweDAwLCAweDAzLCAweDAwLCAweDAzLCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLAorCSAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDE1LCAweDAwLCAweDZFLCAweDZGLCAweDZFLCAweDJELCAweDczLCAweDcwLAorCSAweDY1LCAweDYzLCAweDY5LCAweDY2LCAweDY5LCAweDY1LCAweDY0LCAweDIwLCAweDUzLCAweDUzLCAweDQ5LCAweDQ0LCAweDIwLCAweDIxLCAweDIxLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAxLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAwLCAweDA5LCAweDAwLCAweDAwLAorCSAweDAxLCAweDAwLCAweDY0LCAweDAwLCAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDQ1LCAweDUyLCAweDRELCAweDQ1LCAweDUzLCAweDIwLCAweDMyLAorCSAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAorCSAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDE1LCAweDAwLCAweDZFLCAweDZGLCAweDZFLCAweDJELCAweDczLCAweDcwLAorCSAweDY1LCAweDYzLCAweDY5LCAweDY2LCAweDY5LCAweDY1LCAweDY0LCAweDIwLCAweDUzLCAweDUzLCAweDQ5LCAweDQ0LCAweDIwLCAweDIxLCAweDIxLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAxLCAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAwLCAweDA5LCAweDAwLCAweDAwLAorCSAweDAxLCAweDAwLCAweDY0LCAweDAwLCAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDQ1LCAweDUyLCAweDRELCAweDQ1LCAweDUzLCAweDIwLCAweDMyLAorCSAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAorCSAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ2LCAweDY5LCAweDcyLCAweDczLCAweDc0LCAweDIwLAorCSAweDU3LCAweDYxLCAweDc2LCAweDY1LCAweDRDLCAweDQxLCAweDRFLCAweDIwLCAweDQ5LCAweDQ5LCAweDIwLCAweDUzLCAweDUzLCAweDQ5LCAweDQ0LCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDI4LCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE5LCAweDAwLCAweDAyLCAweDAxLCAweDgyLCAweDg0LCAweDhCLCAweDk2LCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDIwLCAweDAwLCAweDEwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLAorCSAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweERELCAweDAwLCAweDUwLCAweEYyLCAweDAxLAorCSAweDAxLCAweDAwLCAweDAwLCAweDUwLCAweEYyLCAweDA1LCAweDAyLCAweDAwLCAweDAwLCAweDUwLCAweEYyLCAweDAyLCAweDAwLCAweDUwLCAweEYyLCAweDA0LAorCSAweDAyLCAweDAwLCAweDAwLCAweDUwLCAweEYyLCAweDAwLCAweDAwLCAweDUwLCAweEYyLCAweDAxLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDA0LCAweDAwLAorCSAweDE1LCAweDAwLCAweDAyLCAweDAwLCAweDEwLCAweDAwLCAweDEwLCAweDAwLCAweDEwLCAweDAwLCAweDA0LCAweDAwLCAweDEwLCAweDAwLCAweDAyLCAweDAwLAorCSAweDAxLCAweDAwLCAweDA0LCAweDAwLCAweDE1LCAweDAwLCAweDIwLCAweDAwLCAweDExLCAweDAwLCAweDIwLCAweDAwLCAweDFFLCAweDFGLCAweDhFLCAweDIxLAorCSAweDAwLCAweDIzLCAweERBLCAweDIyLCAweDA0LCAweDIzLCAweEMwLCAweDIxLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDM0LCAweDIzLCAweDAwLCAweDAwLAorCSAweDUwLCAweDIxLCAweDhFLCAweDIxLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDFFLCAweDFGLCAweDhFLCAweDIxLCAweDAwLCAweDIzLCAweEZGLCAweEZGLAorCSAweDA0LCAweDIzLCAweEMwLCAweDIxLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDM0LCAweDIzLCAweDAwLCAweDAwLCAweDhFLCAweDIxLCAweDNDLCAweDIzLAorCSAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAzLCAweDAzLCAweDAwLCAweDA2LCAweDA3LAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDgwLAorCSAweDAwLCAweDYwLCAweDFELCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDgxLCAweDAwLCAweDYwLCAweDFELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCit9OyAgLyogZndfaW1hZ2VfMl9kYXRhICovCisKK3N0YXRpYyBjb25zdCBoY2ZfOCBmd19pbWFnZV8zX2RhdGFbXSA9IHsKKwkgMHgzRiwgMHg0MSwgMHhBNSwgMHg0QywgMHg1MCwgMHgzNywgMHgwNCwgMHgwMCwgMHgwMSwgMHhCOSwgMHg0MSwgMHg1RiwgMHhCNSwgMHg2MCwgMHg1NSwgMHhFMCwKKwkgMHgwQywgMHg2MCwgMHgxMCwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMSwgMHg2MCwgMHgwMSwgMHg2NSwgMHhENCwgMHg4MCwgMHg1QSwgMHhEMSwgMHgwRiwgMHgwMiwKKwkgMHg1QSwgMHhEMywgMHgzRSwgMHg2MCwgMHgwMCwgMHg2NiwgMHhFMCwgMHg4NywgMHg0MCwgMHg0QSwgMHhFQSwgMHg2MCwgMHg4OCwgMHg2MSwgMHg2NCwgMHg0NCwKKwkgMHhDOCwgMHg4NCwgMHgwQywgMHg2MywgMHhBQSwgMHg0NiwgMHg1OCwgMHhEMCwgMHhBQSwgMHg0NiwgMHg1OSwgMHhEOCwgMHhGQiwgMHgxRiwgMHgwOCwgMHg2MCwKKwkgMHgwMCwgMHg2MywgMHhGQSwgMHg2MCwgMHgwMCwgMHg2NSwgMHhCRCwgMHhEMywgMHhBMywgMHhEMywgMHgwMiwgMHhBOCwgMHhENCwgMHg4MCwgMHg2MSwgMHgwMiwKKwkgMHg2MCwgMHgwMiwgMHgyNiwgMHg2MCwgMHg2QSwgMHg2MSwgMHgzQywgMHg2MCwgMHgwMCwgMHg2NiwgMHg0MSwgMHg0QiwgMHgyQiwgMHg0MSwgMHgyNiwgMHg2MCwKKwkgMHhCMiwgMHg3QywgMHhEMSwgMHg4MCwgMHhBMSwgMHhEMiwgMHgyNSwgMHgwNSwgMHg1OSwgMHhEMCwgMHg2MCwgMHg0NSwgMHg1OSwgMHhEMiwgMHg0NCwgMHg0NywKKwkgMHhFMCwgMHg4NywgMHg0MCwgMHg0QSwgMHg1OSwgMHhEMiwgMHg1OSwgMHg4QiwgMHg0MCwgMHg0QywgMHgwOCwgMHg2MCwgMHgwMCwgMHg2MywgMHhCRSwgMHhEMywKKwkgMHhCRCwgMHhEMSwgMHhFQywgMHgxOCwgMHhENCwgMHg4MCwgMHhFQSwgMHgxOCwgMHgwMywgMHgwMywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhGNywgMHgwMSwKKwkgMHg2NywgMHg0NCwgMHhDMCwgMHg4NCwgMHhFMCwgMHg4NSwgMHgyQywgMHg0NCwgMHhENCwgMHg4MCwgMHg2MywgMHg0MSwgMHgwMSwgMHgwNiwgMHg2NSwgMHg0NCwKKwkgMHhDOCwgMHg4MywgMHhBQSwgMHg0NiwgMHg1OSwgMHhEMSwgMHgyNywgMHhEOCwgMHg1QSwgMHg4NywgMHhGQywgMHgxRiwgMHhBQSwgMHg0NiwgMHgyQiwgMHg0MSwKKwkgMHhENSwgMHgwMSwgMHgyNiwgMHg2MCwgMHhCMiwgMHg2MSwgMHg0MSwgMHg0QiwgMHgyQiwgMHg0MSwgMHgyNiwgMHg2MCwgMHhFQSwgMHg3QywgMHhEMSwgMHg4MCwKKwkgMHhBMSwgMHhEMiwgMHgyNywgMHgwNSwgMHg1OSwgMHhEMCwgMHg2MCwgMHg0NSwgMHg1OSwgMHhEMiwgMHg0NCwgMHg0NywgMHhFMCwgMHg4NywgMHg0MCwgMHg0QSwKKwkgMHg1OSwgMHhEMiwgMHg1OSwgMHg4QiwgMHg0MCwgMHg0QywgMHgwOCwgMHg2MCwgMHgwMCwgMHg2MywgMHhCRSwgMHhEMywgMHhCRCwgMHhEMSwgMHhFQywgMHgxOCwKKwkgMHhENCwgMHg4MCwgMHhFQSwgMHgxOCwgMHgwMywgMHgwMywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhGNywgMHgwMSwgMHgwNCwgMHhBMywgMHhBMywgMHhEMSwKKwkgMHg1QSwgMHg4OCwgMHgyQywgMHg0MywgMHhEMywgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNiwgMHg2NCwgMHg0MywgMHhDRiwgMHg4MywgMHhBQSwgMHg0NiwKKwkgMHg2MCwgMHhGRSwgMHgyOCwgMHhEMSwgMHg1RSwgMHg4OCwgMHgyNywgMHhEOCwgMHg1QSwgMHg4NywgMHhGQiwgMHgxRiwgMHgyMCwgMHhGRSwgMHhBQSwgMHg0NiwKKwkgMHhEMywgMHgwMSwgMHhCOCwgMHhGRSwgMHhCOSwgMHhGRSwgMHhCQSwgMHhGRSwgMHhCQiwgMHhGRSwgMHhCRCwgMHhGRSwgMHhCRiwgMHhGRSwgMHgyMSwgMHg2MCwKKwkgMHg4MCwgMHg2MiwgMHhBMiwgMHhEMywgMHgxMiwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwNSwgMHgwMCwgMHgwQiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRSwgMHgxRiwgMHhBMiwgMHg2MCwgMHg0OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGMSwgMHhGRiwgMHg5NCwgMHg0OCwKKwkgMHgxRiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhGMiwgMHhGRiwgMHg5OCwgMHg0OCwgMHgxRiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhGQiwgMHhGRiwgMHhBMCwgMHg0OCwKKwkgMHgxRiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhGMSwgMHhGRiwgMHhGMiwgMHg0RCwgMHgxRiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGNiwgMHg0RCwKKwkgMHgxRiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhGQiwgMHhGRiwgMHhGRSwgMHg0RCwgMHgxRiwgMHgwMCwgMHgwNCwgMHgwMCwgMHg4NiwgMHhGRCwgMHhCNiwgMHgxRiwKKwkgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgxMCwgMHhGRCwgMHgzNCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgxNCwgMHhGRCwgMHg3RSwgMHgyMSwKKwkgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHgyMCwgMHhGQSwgMHhGQSwgMHgxRCwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHgyMSwgMHhGQSwgMHhERSwgMHgxRCwKKwkgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHgyMiwgMHhGQSwgMHgxNiwgMHgxRSwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHgyMywgMHhGQSwgMHhDQSwgMHgxQywKKwkgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgyNCwgMHhGQSwgMHhCRSwgMHgxRSwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHgyNSwgMHhGQSwgMHhERSwgMHgxQywKKwkgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgyNiwgMHhGQSwgMHhDNCwgMHgxQywgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKKworfTsgIC8qIGZ3X2ltYWdlXzNfZGF0YSAqLworCitzdGF0aWMgY29uc3QgaGNmXzggZndfaW1hZ2VfNF9kYXRhW10gPSB7CisJIDB4QTYsIDB4NjAsIDB4MjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTYsIDB4NjAsIDB4MEIsIDB4NzgsIDB4NDEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTYsIDB4NjAsIDB4MTEsIDB4NzgsIDB4QzQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTUsIDB4NjAsIDB4NjEsIDB4NzgsIDB4NDMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NDQsIDB4RkYsIDB4MjAsIDB4NTQsIDB4Q0QsIDB4RTIsIDB4QTYsIDB4NjAsIDB4MjMsIDB4NzgsIDB4MDgsIDB4RTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTYsIDB4NjAsIDB4MjUsIDB4NzgsIDB4NDQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTYsIDB4NjAsIDB4MjUsIDB4NzgsIDB4NDYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTYsIDB4NjAsIDB4MjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QUMsIDB4NjAsIDB4ODEsIDB4NzgsIDB4NEMsIDB4NEUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QUMsIDB4NjAsIDB4MTgsIDB4NzgsIDB4NEMsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzQsIDB4RTIsIDB4ODQsIDB4RkYsIDB4MjIsIDB4NTgsIDB4ODIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTcsIDB4NjAsIDB4QzQsIDB4NzgsIDB4NDMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RTQsIDB4RTIsIDB4QUMsIDB4NjAsIDB4MzEsIDB4NzgsIDB4OTUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QkYsIDB4NjAsIDB4NzYsIDB4NzgsIDB4NjQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QUMsIDB4NjAsIDB4OEMsIDB4NzgsIDB4QTQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QUMsIDB4NjAsIDB4NzIsIDB4NzgsIDB4NDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjIsIDB4NjAsIDB4RDEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjIsIDB4NjAsIDB4RkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjEsIDB4NjAsIDB4OTAsIDB4NzgsIDB4NDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjEsIDB4NjAsIDB4QzAsIDB4NzgsIDB4NDMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjEsIDB4NjAsIDB4QzAsIDB4NzgsIDB4NDQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjQsIDB4NjAsIDB4NzMsIDB4NzgsIDB4NDUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjEsIDB4NjAsIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4ODMsIDB4NjQsIDB4ODAsIDB4MjksIDB4MDksIDB4RkIsIDB4QjIsIDB4NjAsIDB4OTksIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzAsIDB4NjAsIDB4MjksIDB4NzgsIDB4NDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QkYsIDB4NjAsIDB4QjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QkUsIDB4NjAsIDB4NzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QkQsIDB4NjAsIDB4RTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjUsIDB4NjAsIDB4OTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODMsIDB4M0UsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzAsIDB4NjAsIDB4OUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4NDEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4NDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QjAsIDB4RkYsIDB4QjEsIDB4RkYsIDB4NDAsIDB4RkYsIDB4NDMsIDB4RkYsIDB4QzAsIDB4NjAsIDB4OUEsIDB4NzgsIDB4NDQsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QzAsIDB4NjAsIDB4OUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QzYsIDB4NjAsIDB4NjYsIDB4NzgsIDB4NDUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QzAsIDB4NjAsIDB4OUEsIDB4NzgsIDB4ODQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QzAsIDB4NjAsIDB4OTksIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QzcsIDB4NjAsIDB4MjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RTUsIDB4NjAsIDB4MEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzcsIDB4NjAsIDB4MkUsIDB4NzgsIDB4NDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzcsIDB4NjAsIDB4MkUsIDB4NzgsIDB4MjQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RTMsIDB4NjAsIDB4NDUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzcsIDB4NjAsIDB4MkUsIDB4NzgsIDB4NDQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzcsIDB4NjAsIDB4MkUsIDB4NzgsIDB4ODQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzcsIDB4NjAsIDB4MkUsIDB4NzgsIDB4NDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RUIsIDB4NjAsIDB4NUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RUIsIDB4NjAsIDB4ODcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RUIsIDB4NjAsIDB4QTAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RUIsIDB4NjAsIDB4ODQsIDB4NzgsIDB4MjgsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RUIsIDB4NjAsIDB4ODQsIDB4NzgsIDB4NDQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RUIsIDB4NjAsIDB4ODQsIDB4NzgsIDB4NDUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RUIsIDB4NjAsIDB4ODQsIDB4NzgsIDB4NDYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4ODcsIDB4NjQsIDB4ODAsIDB4MjksIDB4MDksIDB4RkIsIDB4NDcsIDB4RkYsIDB4RUIsIDB4NjAsIDB4ODQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4ODcsIDB4RjMsIDB4ODgsIDB4RjMsIDB4REMsIDB4ODEsIDB4MDAsIDB4N0MsIDB4MDEsIDB4MDAsIDB4MDAsIDB4RkEsIDB4NjAsIDB4NDYsIDB4RkUsIDB4NjMsCisJIDB4QTMsIDB4RDgsIDB4RkUsIDB4MUYsIDB4Q0QsIDB4ODEsIDB4RDgsIDB4ODQsIDB4RjgsIDB4MDIsIDB4ODcsIDB4RjMsIDB4ODgsIDB4RjUsIDB4REMsIDB4ODEsCisJIDB4ODAsIDB4NjcsIDB4NDAsIDB4NEEsIDB4MTQsIDB4NjAsIDB4MDIsIDB4NjUsIDB4MDEsIDB4N0MsIDB4MDcsIDB4MTgsIDB4MkEsIDB4NDMsIDB4MDIsIDB4RkMsCisJIDB4NUYsIDB4OEEsIDB4OEUsIDB4RjgsIDB4NzAsIDB4RjgsIDB4MDAsIDB4RjQsIDB4RjgsIDB4MDEsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4ODksIDB4RjUsCisJIDB4MDYsIDB4NjQsIDB4NjYsIDB4NDMsIDB4MDAsIDB4N0MsIDB4NjMsIDB4NDYsIDB4RkUsIDB4NjMsIDB4QTMsIDB4RDgsIDB4RkUsIDB4MUYsIDB4Q0MsIDB4ODQsCisJIDB4NjYsIDB4NDMsIDB4REIsIDB4ODMsIDB4RjgsIDB4MDIsIDB4MTQsIDB4NjAsIDB4MDIsIDB4NjUsIDB4MDksIDB4NjAsIDB4MkIsIDB4N0MsIDB4ODksIDB4RjMsCisJIDB4MDYsIDB4NjEsIDB4NjAsIDB4NDYsIDB4MDEsIDB4NjMsIDB4NzIsIDB4RjgsIDB4MDAsIDB4RkMsIDB4NjMsIDB4NDcsIDB4MDYsIDB4RkEsIDB4NzIsIDB4RjgsCisJIDB4OEUsIDB4RjgsIDB4REYsIDB4ODMsIDB4NjYsIDB4NDQsIDB4Q0QsIDB4ODEsIDB4MDIsIDB4QTYsIDB4RjUsIDB4MDIsIDB4ODksIDB4RjMsIDB4MDYsIDB4NjEsCisJIDB4NjAsIDB4NDYsIDB4MDMsIDB4N0MsIDB4NzMsIDB4RjgsIDB4NjYsIDB4NDQsIDB4Q0QsIDB4ODEsIDB4MDIsIDB4QTYsIDB4RkIsIDB4MDIsIDB4MkUsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4M0YsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MEEsIDB4MDAsIDB4NDIsIDB4NjAsIDB4MDksIDB4RTAsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MkEsCisJIDB4MDMsIDB4MDAsIDB4NjAsIDB4NjAsIDB4MUMsIDB4RTAsIDB4MDIsIDB4MDAsIDB4ODAsIDB4NjAsIDB4MUMsIDB4RTAsIDB4NDAsIDB4RUMsIDB4MDAsIDB4RUQsCisJIDB4MDIsIDB4RUUsIDB4ODAsIDB4NjAsIDB4NTgsIDB4RUMsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUQsIDB4ODAsIDB4NjAsIDB4ODIsIDB4RUUsIDB4QzAsIDB4NjAsCisJIDB4NTksIDB4RUMsIDB4QzAsIDB4NjAsIDB4MDcsIDB4RUQsIDB4QUQsIDB4NEYsIDB4RkUsIDB4QjQsIDB4QTAsIDB4NUQsIDB4MDAsIDB4RjMsIDB4MjgsIDB4RkIsCisJIDB4NDAsIDB4NDQsIDB4QTQsIDB4NjAsIDB4NUQsIDB4N0MsIDB4MjAsIDB4RjksIDB4QTUsIDB4NjAsIDB4NDgsIDB4N0MsIDB4MjEsIDB4RjksIDB4QTcsIDB4NjAsCisJIDB4MzAsIDB4N0MsIDB4MjIsIDB4RjksIDB4QjAsIDB4NjAsIDB4Q0QsIDB4N0MsIDB4MjMsIDB4RjksIDB4QjUsIDB4NjAsIDB4NkMsIDB4N0MsIDB4MjQsIDB4RjksCisJIDB4QzAsIDB4NjAsIDB4ODgsIDB4N0MsIDB4MjUsIDB4RjksIDB4QzYsIDB4NjAsIDB4RTAsIDB4N0MsIDB4MjYsIDB4RjksIDB4OTEsIDB4NjAsIDB4MDAsIDB4RTgsCisJIDB4MjgsIDB4RTgsIDB4NDQsIDB4NjAsIDB4MDIsIDB4RTYsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NTIsIDB4MTAsIDB4NjAsIDB4MDQsIDB4RTYsIDB4MDgsIDB4NjAsCisJIDB4MDAsIDB4NjMsIDB4RkEsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4MDIsIDB4QTgsIDB4RDQsIDB4ODAsIDB4NDcsIDB4MDIsCisJIDB4NDYsIDB4MDIsIDB4REIsIDB4ODMsIDB4RkEsIDB4NjAsIDB4MjcsIDB4NjUsIDB4NUIsIDB4RDMsIDB4QkYsIDB4RDEsIDB4MUEsIDB4MTgsIDB4QzMsIDB4ODMsCisJIDB4RDQsIDB4ODAsIDB4QzMsIDB4ODMsIDB4RjksIDB4MDIsIDB4REIsIDB4ODMsIDB4RDMsIDB4ODMsIDB4RDMsIDB4ODYsIDB4NjQsIDB4NDEsIDB4Q0QsIDB4ODEsCisJIDB4QTYsIDB4RDEsIDB4REEsIDB4ODYsIDB4MUMsIDB4NjAsIDB4NjgsIDB4NjUsIDB4MDAsIDB4NjAsIDB4NzIsIDB4NjMsIDB4QTUsIDB4RDMsIDB4REEsIDB4ODUsCisJIDB4OTAsIDB4ODQsIDB4RkYsIDB4MjcsIDB4MDIsIDB4MDAsIDB4QTIsIDB4RDksIDB4MDEsIDB4MDAsIDB4RjgsIDB4MUYsIDB4Q0QsIDB4ODEsIDB4RkYsIDB4RkYsCisJIDB4RUYsIDB4MDIsIDB4MDgsIDB4NjAsIDB4MDYsIDB4NjMsIDB4RkEsIDB4NjAsIDB4MjgsIDB4NjUsIDB4NUIsIDB4RDMsIDB4QkYsIDB4RDEsIDB4MEIsIDB4MTgsCisJIDB4QzMsIDB4ODMsIDB4RDQsIDB4ODAsIDB4QzMsIDB4ODMsIDB4RjksIDB4MDIsIDB4QkYsIDB4RDMsIDB4MjEsIDB4NjAsIDB4NzIsIDB4NjIsIDB4MEUsIDB4QjQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDgsIDB4NjAsIDB4MDYsIDB4NjMsIDB4RkQsIDB4NjAsIDB4MEMsIDB4NjUsIDB4NUIsIDB4RDMsCisJIDB4QkYsIDB4RDEsIDB4MEQsIDB4MTgsIDB4QzMsIDB4ODMsIDB4RDQsIDB4ODAsIDB4QzMsIDB4ODMsIDB4RjksIDB4MDIsIDB4RkEsIDB4QTMsIDB4QTMsIDB4RDMsCisJIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjUsIDB4RjcsIDB4QTAsIDB4RkMsIDB4QTAsIDB4MEEsIDB4MDUsIDB4MDEsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MjEsIDB4NjAsCisJIDB4MDAsIDB4NjUsIDB4M0YsIDB4NDMsIDB4M0YsIDB4NDMsIDB4MjEsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QzAsIDB4NjAsIDB4OEYsIDB4RUUsIDB4QjcsIDB4ODQsCisJIDB4NDAsIDB4NUYsIDB4MDAsIDB4NjAsIDB4MzAsIDB4RTIsIDB4MDAsIDB4NjAsIDB4NTAsIDB4RTIsIDB4MDAsIDB4NjAsIDB4NzksIDB4RTIsIDB4MDAsIDB4NjAsCisJIDB4OTAsIDB4RTIsIDB4MDEsIDB4NjAsIDB4RDAsIDB4RTIsIDB4MDEsIDB4NjAsIDB4RjAsIDB4RTIsIDB4MDEsIDB4NjAsIDB4QjAsIDB4RTIsIDB4MjYsIDB4NjQsCisJIDB4MzUsIDB4RkIsIDB4MDEsIDB4NjAsIDB4MzAsIDB4NjQsIDB4MEEsIDB4QTQsIDB4MzgsIDB4RkIsIDB4NjAsIDB4NDUsIDB4MDAsIDB4NjAsIDB4RjgsIDB4NjQsCisJIDB4MEEsIDB4QTQsIDB4MzksIDB4RkIsIDB4MzUsIDB4RjEsIDB4MEEsIDB4NjQsIDB4QzQsIDB4ODQsIDB4MzYsIDB4RkIsIDB4QzAsIDB4ODQsIDB4MEEsIDB4QTQsCisJIDB4MzcsIDB4RkIsIDB4MDksIDB4NjAsIDB4MkEsIDB4NjQsIDB4OTksIDB4RkIsIDB4ODIsIDB4RkYsIDB4OTIsIDB4RkYsIDB4NUMsIDB4NDEsIDB4NUMsIDB4NDYsCisJIDB4NUMsIDB4NDcsIDB4MDAsIDB4RTEsIDB4QTcsIDB4NjAsIDB4OUIsIDB4NjMsIDB4MEMsIDB4NjAsIDB4MTYsIDB4NjQsIDB4QTAsIDB4REQsIDB4ODcsIDB4RkYsCisJIDB4OTcsIDB4RkYsIDB4MEMsIDB4NjAsIDB4MDIsIDB4NjQsIDB4NDAsIDB4NUEsIDB4MDYsIDB4QTQsIDB4NDAsIDB4NUIsIDB4NUMsIDB4NUUsIDB4NUMsIDB4NTEsCisJIDB4MUYsIDB4NjAsIDB4QUEsIDB4NjIsIDB4QTIsIDB4RDMsIDB4NjUsIDB4RkIsIDB4MjEsIDB4NjAsIDB4RUMsIDB4NjEsIDB4MjcsIDB4N0MsIDB4QTEsIDB4RDksCisJIDB4MjUsIDB4NjAsIDB4MkUsIDB4NjMsIDB4N0YsIDB4QTMsIDB4RTMsIDB4ODcsIDB4MDAsIDB4N0YsIDB4OEEsIDB4RkIsIDB4MDIsIDB4NjAsIDB4ODAsIDB4NjYsCisJIDB4MjIsIDB4NjAsIDB4MjIsIDB4NjQsIDB4NzcsIDB4NjAsIDB4NzcsIDB4NjMsIDB4MDAsIDB4RkEsIDB4MDEsIDB4RkMsIDB4MDAsIDB4RjAsIDB4MDEsIDB4RjAsCisJIDB4RDAsIDB4ODAsIDB4RDMsIDB4ODAsIDB4MUUsIDB4MDIsIDB4MUQsIDB4MDIsIDB4MDYsIDB4NjAsIDB4ODAsIDB4NjUsIDB4NDUsIDB4NEEsIDB4QUEsIDB4NDYsCisJIDB4MDAsIDB4RkMsIDB4MDEsIDB4RkEsIDB4QUEsIDB4NDYsIDB4MDAsIDB4RjAsIDB4MkEsIDB4NDEsIDB4NTAsIDB4NjUsIDB4RDMsIDB4ODAsIDB4Q0QsIDB4ODQsCisJIDB4MTMsIDB4MDMsIDB4MEEsIDB4NjAsIDB4ODAsIDB4NjUsIDB4NDUsIDB4NEEsIDB4QUEsIDB4NDYsIDB4MDAsIDB4RkMsIDB4MDEsIDB4RkEsIDB4QUEsIDB4NDYsCisJIDB4MDAsIDB4RjAsIDB4NjUsIDB4NDEsIDB4QzgsIDB4NjUsIDB4RDMsIDB4ODAsIDB4Q0QsIDB4ODQsIDB4MDYsIDB4MDMsIDB4MTIsIDB4NjAsIDB4N0YsIDB4NjQsCisJIDB4MDMsIDB4MDAsIDB4MTAsIDB4NjUsIDB4MDIsIDB4NjAsIDB4N0YsIDB4NjQsIDB4NjUsIDB4NDMsIDB4ODcsIDB4RkQsIDB4MUIsIDB4NjAsIDB4NzIsIDB4NjIsCisJIDB4QTIsIDB4REQsIDB4MDcsIDB4NjEsIDB4QzUsIDB4ODEsIDB4RTEsIDB4ODUsIDB4RDQsIDB4ODQsIDB4OEIsIDB4RkIsIDB4REMsIDB4ODQsIDB4ODksIDB4RkIsCisJIDB4MEMsIDB4QTQsIDB4ODgsIDB4RkIsIDB4MUIsIDB4NjAsIDB4NzQsIDB4NjIsIDB4QTIsIDB4REIsIDB4QTIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MUYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QTIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OEIsIDB4RjEsIDB4OEEsIDB4RjMsIDB4N0MsIDB4NjMsCisJIDB4OEQsIDB4RkIsIDB4NjAsIDB4NDYsIDB4MDEsIDB4RkMsIDB4REMsIDB4ODQsIDB4RDAsIDB4ODAsIDB4MDAsIDB4RkEsIDB4RkEsIDB4MDQsIDB4OEUsIDB4RkIsCisJIDB4NjAsIDB4NDYsIDB4MDAsIDB4NjQsIDB4MDAsIDB4RkEsIDB4NjMsIDB4NDQsIDB4ODAsIDB4N0YsIDB4MDEsIDB4RkEsIDB4OEIsIDB4RjMsIDB4OEEsIDB4RjEsCisJIDB4REMsIDB4ODQsIDB4RDAsIDB4ODQsIDB4OEMsIDB4RkIsIDB4MDMsIDB4NjAsIDB4MjYsIDB4NjEsIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NjQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4MkUsIDB4RkIsIDB4ODIsIDB4RkYsIDB4NDAsIDB4NDIsIDB4ODcsIDB4RkYsIDB4OEMsIDB4RjMsIDB4OTQsIDB4RkIsCisJIDB4MDAsIDB4NjQsIDB4MTIsIDB4NjAsIDB4QzgsIDB4NjMsIDB4QTMsIDB4REIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NTAsIDB4NjMsIDB4RkYsIDB4NjYsIDB4RkYsCisJIDB4NjUsIDB4RkYsIDB4NjQsIDB4RkYsIDB4NjEsIDB4RkYsIDB4NjIsIDB4RkYsIDB4NDksIDB4NjAsIDB4MDIsIDB4RTEsIDB4NTIsIDB4NjAsIDB4MDIsIDB4RTEsCisJIDB4NUIsIDB4NjAsIDB4MDIsIDB4RTEsIDB4NjUsIDB4NjAsIDB4MDIsIDB4RTEsIDB4NkMsIDB4NjAsIDB4MDIsIDB4RTEsIDB4NzYsIDB4NjAsIDB4MDIsIDB4RTEsCisJIDB4NDEsIDB4NjAsIDB4MDIsIDB4RTEsIDB4MDQsIDB4NjUsIDB4MjEsIDB4NjAsIDB4N0UsIDB4NjQsIDB4NDQsIDB4RDMsIDB4RUEsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4MDQsIDB4NjUsIDB4MEMsIDB4NjQsIDB4QTUsIDB4REIsIDB4QTMsIDB4NjAsIDB4RUQsIDB4NjQsCisJIDB4ODAsIDB4RkIsIDB4MkQsIDB4RkYsIDB4MEEsIDB4NjEsIDB4NDEsIDB4NEIsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjEsIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4NjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RjAsIDB4NjcsIDB4MEUsIDB4RkEsIDB4MUIsIDB4NjAsIDB4RTAsIDB4NjIsIDB4MUIsIDB4NjAsIDB4QzQsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MkIsIDB4NDEsCisJIDB4NEQsIDB4OEIsIDB4RkYsIDB4RkYsIDB4RTksIDB4MDIsIDB4MEEsIDB4NjEsIDB4NDEsIDB4NEIsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjEsIDB4QjMsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4NjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUIsIDB4NjAsIDB4RTAsIDB4NjIsIDB4MUIsIDB4NjAsIDB4QjgsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MkIsIDB4NDEsIDB4NEQsIDB4OEIsCisJIDB4RkYsIDB4RkYsIDB4RUIsIDB4MDIsIDB4RUIsIDB4NjAsIDB4NEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4RUEsIDB4MDAsIDB4RUIsIDB4NTAsIDB4NjAsCisJIDB4MDMsIDB4RUEsIDB4NTEsIDB4NjAsIDB4MTMsIDB4RUEsIDB4NTIsIDB4NjAsIDB4MzAsIDB4RUEsIDB4NTMsIDB4NjAsIDB4NDAsIDB4RUEsIDB4NTQsIDB4NjAsCisJIDB4NTIsIDB4RUEsIDB4NTUsIDB4NjAsIDB4NkQsIDB4RUEsIDB4NTYsIDB4NjAsIDB4NzEsIDB4RUEsIDB4NTcsIDB4NjAsIDB4OEIsIDB4RUEsIDB4NTgsIDB4NjAsCisJIDB4NDcsIDB4RUEsIDB4NTksIDB4NjAsIDB4QTAsIDB4RUEsIDB4NUEsIDB4NjAsIDB4QjIsIDB4RUEsIDB4NUIsIDB4NjAsIDB4QzEsIDB4RUEsIDB4NUMsIDB4NjAsCisJIDB4RDcsIDB4RUEsIDB4NUQsIDB4NjAsIDB4RUIsIDB4RUEsIDB4NUUsIDB4NjAsIDB4QTAsIDB4RUEsIDB4NTAsIDB4NjAsIDB4MzYsIDB4RUIsIDB4NTEsIDB4NjAsCisJIDB4MzcsIDB4RUIsIDB4NTIsIDB4NjAsIDB4MjAsIDB4RUIsIDB4NTMsIDB4NjAsIDB4RTQsIDB4RUIsIDB4NTQsIDB4NjAsIDB4MzQsIDB4RUIsIDB4NTUsIDB4NjAsCisJIDB4NTgsIDB4RUIsIDB4NTYsIDB4NjAsIDB4NDgsIDB4RUIsIDB4NTcsIDB4NjAsIDB4RDAsIDB4RUIsIDB4NTgsIDB4NjAsIDB4QzMsIDB4RUIsIDB4NTksIDB4NjAsCisJIDB4RkMsIDB4RUIsIDB4NUEsIDB4NjAsIDB4MzQsIDB4RUIsIDB4NUIsIDB4NjAsIDB4NTgsIDB4RUIsIDB4NUMsIDB4NjAsIDB4QzAsIDB4RUIsIDB4NUQsIDB4NjAsCisJIDB4RDAsIDB4RUIsIDB4NUUsIDB4NjAsIDB4OTEsIDB4RUIsIDB4MDAsIDB4RUEsIDB4MDAsIDB4RUIsIDB4RTAsIDB4NjAsIDB4MDIsIDB4RUEsIDB4RTAsIDB4NjAsCisJIDB4MDMsIDB4RUIsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUIsIDB4QjAsIDB4NjAsIDB4MDAsIDB4RUIsIDB4QUIsIDB4NDgsIDB4NDAsIDB4M0IsIDB4MDEsIDB4MDAsCisJIDB4RkMsIDB4MDEsIDB4MDAsIDB4RUIsIDB4MDMsIDB4NjAsIDB4MDIsIDB4NjIsIDB4NjIsIDB4NDQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjQsIDB4NjAsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4M0YsIDB4NDAsCisJIDB4NDAsIDB4MjYsIDB4MDgsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MTgsIDB4NjQsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4OTQsIDB4ODQsIDB4QTAsIDB4NTAsCisJIDB4MUQsIDB4NjAsIDB4MTksIDB4RTIsIDB4MjQsIDB4NDQsIDB4RkYsIDB4QjQsIDB4MDQsIDB4RkIsIDB4NTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDUsIDB4RkIsCisJIDB4MTAsIDB4NjAsIDB4MTAsIDB4NzUsIDB4RUIsIDB4NjAsIDB4ODQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODAsIDB4RkYsIDB4OTAsIDB4RkYsIDB4OTgsIDB4RkYsCisJIDB4MjMsIDB4NjAsIDB4NUMsIDB4NjMsIDB4MjAsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjIsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MjMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjYsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MjcsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjgsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjksIDB4NDQsIDB4QkQsIDB4REIsIDB4MkEsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MkIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkUsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MkYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjMsIDB4NjAsIDB4NTAsIDB4NjQsIDB4QTAsIDB4REQsIDB4MjQsIDB4NjAsIDB4N0MsIDB4NjMsIDB4MjMsIDB4NjAsCisJIDB4NTIsIDB4NjQsIDB4QTAsIDB4REQsIDB4MjMsIDB4NjAsIDB4NTQsIDB4NjMsIDB4MzAsIDB4NDQsIDB4QTMsIDB4REIsIDB4MjMsIDB4NjAsIDB4NTYsIDB4NjMsCisJIDB4MzEsIDB4NDQsIDB4QTMsIDB4REIsIDB4MjMsIDB4NjAsIDB4NTgsIDB4NjMsIDB4MzIsIDB4NDQsIDB4QTMsIDB4REIsIDB4MjMsIDB4NjAsIDB4NUEsIDB4NjMsCisJIDB4MzMsIDB4NDQsIDB4QTMsIDB4REIsIDB4ODEsIDB4RkYsIDB4OTEsIDB4RkYsIDB4NTgsIDB4NTEsIDB4NDgsIDB4MDAsIDB4ODIsIDB4RkYsIDB4OTIsIDB4RkYsCisJIDB4NTgsIDB4NTEsIDB4NDQsIDB4MDAsIDB4ODMsIDB4RkYsIDB4OTMsIDB4RkYsIDB4NTgsIDB4NTEsIDB4NDAsIDB4MDAsIDB4ODQsIDB4RkYsIDB4OTQsIDB4RkYsCisJIDB4NTgsIDB4NTEsIDB4M0MsIDB4MDAsIDB4ODUsIDB4RkYsIDB4OTUsIDB4RkYsIDB4NTgsIDB4NTEsIDB4MzgsIDB4MDAsIDB4ODYsIDB4RkYsIDB4OTYsIDB4RkYsCisJIDB4NTgsIDB4NTEsIDB4MzQsIDB4MDAsIDB4ODcsIDB4RkYsIDB4OTcsIDB4RkYsIDB4NTgsIDB4NTEsIDB4MzAsIDB4MDAsIDB4ODAsIDB4RkYsIDB4OTAsIDB4RkYsCisJIDB4OTksIDB4RkYsIDB4MjMsIDB4NjAsIDB4NTAsIDB4NjQsIDB4QTAsIDB4RDEsIDB4MzAsIDB4NDQsIDB4NjQsIDB4NDMsIDB4QkQsIDB4REIsIDB4MzEsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MzIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzUsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MzYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzcsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzgsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzksIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4M0EsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0IsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0MsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0QsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4M0UsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0YsIDB4NDQsIDB4QkQsIDB4REIsIDB4RTMsIDB4NjAsIDB4NTAsIDB4NjQsIDB4MEEsIDB4RkIsCisJIDB4NDAsIDB4MjEsIDB4RkUsIDB4MDEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NzgsIDB4MDEsIDB4RkYsIDB4RkYsIDB4NDIsIDB4NTAsIDB4NDAsIDB4NTMsCisJIDB4MjMsIDB4NjAsIDB4NTIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NTIsIDB4MzMsIDB4NDQsIDB4MzIsIDB4NDIsIDB4QTIsIDB4REIsCisJIDB4REEsIDB4ODIsIDB4QTIsIDB4REQsIDB4REEsIDB4ODMsIDB4NjUsIDB4NDQsIDB4QkQsIDB4REIsIDB4NjEsIDB4NDQsIDB4QkQsIDB4REIsIDB4NjYsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4QkQsIDB4RDksIDB4MzAsIDB4NDQsIDB4QkQsIDB4REIsIDB4OTksIDB4RkYsIDB4QTQsIDB4NEMsIDB4QkQsIDB4REIsIDB4QTUsIDB4NEMsCisJIDB4QkQsIDB4REIsIDB4QTAsIDB4NEMsIDB4QkQsIDB4REIsIDB4QTEsIDB4NEMsIDB4QkQsIDB4REIsIDB4OTgsIDB4RkYsIDB4MjMsIDB4NjAsIDB4NTIsIDB4NjQsCisJIDB4QTAsIDB4REQsIDB4MjMsIDB4NjAsIDB4NTQsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NTAsIDB4MjMsIDB4NjAsIDB4NTgsIDB4NjIsCisJIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NTIsIDB4MjMsIDB4NjAsIDB4NUEsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NTMsCisJIDB4MzEsIDB4NDEsIDB4MjMsIDB4NjAsIDB4NTYsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NTEsIDB4MjMsIDB4NjAsIDB4NTAsIDB4NjIsCisJIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsIDB4MjAsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjIsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MjMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjYsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MjcsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjgsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjksIDB4NDQsIDB4QkQsIDB4REIsIDB4MkEsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MkIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkUsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MkYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjMsIDB4NjAsIDB4NTAsIDB4NjQsIDB4QTAsIDB4REQsIDB4NjEsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MzAsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MDAsIDB4RTEsIDB4MDcsIDB4MDIsIDB4NjIsIDB4RkYsIDB4NjMsIDB4RkYsIDB4NjQsIDB4RkYsIDB4NjUsIDB4RkYsCisJIDB4NjYsIDB4RkYsIDB4QkYsIDB4RkUsIDB4QTEsIDB4RkYsIDB4ODIsIDB4RkYsIDB4ODgsIDB4RkYsIDB4NkMsIDB4NDAsIDB4NDEsIDB4RkYsIDB4QzQsIDB4RTIsCisJIDB4NDMsIDB4RkYsIDB4NUMsIDB4NDksIDB4MDgsIDB4RTEsIDB4QTUsIDB4NjAsIDB4NUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsCisJIDB4ODAsIDB4M0UsIDB4OUYsIDB4RkUsIDB4MDMsIDB4MDQsIDB4QTYsIDB4NjAsIDB4MjgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTIsIDB4RkUsIDB4NDAsIDB4MDUsCisJIDB4RTAsIDB4RkUsIDB4NUIsIDB4MDUsIDB4RTEsIDB4RkUsIDB4RjIsIDB4MDQsIDB4MjksIDB4NDAsIDB4MDgsIDB4MjYsIDB4RUYsIDB4MDEsIDB4NzIsIDB4NDQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4OTUsIDB4RjMsIDB4RTgsIDB4ODUsIDB4RkYsIDB4QjcsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QjQsIDB4ODUsIDB4NzMsIDB4NDQsIDB4RDQsIDB4ODQsIDB4MTAsIDB4NjUsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4MDQsIDB4M0YsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MTMsIDB4MDAsIDB4MEIsIDB4NjAsIDB4RjgsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsCisJIDB4MTAsIDB4NjQsIDB4OTAsIDB4ODQsIDB4QTAsIDB4NTAsIDB4RjgsIDB4QTIsIDB4QTIsIDB4RDEsIDB4MEEsIDB4NjAsIDB4MTksIDB4NjQsIDB4OTAsIDB4ODQsCisJIDB4QTAsIDB4NTIsIDB4MDYsIDB4QTIsIDB4QTIsIDB4RDEsIDB4NDYsIDB4NjAsIDB4MDksIDB4NjQsIDB4OTAsIDB4ODQsIDB4QTAsIDB4NTAsIDB4RDIsIDB4RjQsCisJIDB4MjUsIDB4NjAsIDB4MTYsIDB4N0MsIDB4NjMsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDgsIDB4MDAsIDB4QTQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QjQsCisJIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4QUQsIDB4NEYsIDB4RkUsIDB4QjQsIDB4QTAsIDB4NUQsIDB4MDIsIDB4RUUsIDB4QkQsIDB4RkUsIDB4QkUsIDB4MDEsCisJIDB4MjEsIDB4NDYsIDB4NUUsIDB4NjIsIDB4OUEsIDB4RkYsIDB4MDcsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MjUsIDB4MTAsIDB4MDAsCisJIDB4QTIsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4NjIsIDB4NjIsIDB4MDEsIDB4NUQsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsCisJIDB4N0EsIDB4REMsIDB4NDQsIDB4RkYsIDB4MDYsIDB4MjUsIDB4MDQsIDB4MDAsIDB4MEUsIDB4RTEsIDB4MDIsIDB4NjAsIDB4MDEsIDB4RTEsIDB4OUUsIDB4MDEsCisJIDB4NjIsIDB4RkYsIDB4QzQsIDB4RTIsIDB4NDEsIDB4RkYsIDB4MEEsIDB4RTEsIDB4OTksIDB4MDEsIDB4QzgsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4MjksIDB4NDQsCisJIDB4MDgsIDB4QkMsIDB4NDAsIDB4NDksIDB4MDUsIDB4RTEsIDB4MjUsIDB4NjAsIDB4MTgsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RDIsIDB4RjMsIDB4MDYsIDB4MTgsCisJIDB4MjgsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MjgsIDB4NDAsIDB4NDgsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MDIsIDB4QkMsIDB4RDIsIDB4RkIsCisJIDB4M0YsIDB4NDAsIDB4MDEsIDB4MkIsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NjcsIDB4NEMsIDB4MDYsIDB4NjEsIDB4Q0QsIDB4ODEsIDB4MDQsIDB4MjUsCisJIDB4MzAsIDB4MDAsIDB4ODcsIDB4NEMsIDB4RkIsIDB4MDIsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDIsIDB4MDAsIDB4MTUsIDB4NjAsIDB4NkYsIDB4NkIsCisJIDB4RjMsIDB4NjAsIDB4QTAsIDB4NjQsIDB4MDQsIDB4MjUsIDB4MjUsIDB4MDAsIDB4ODAsIDB4NEMsIDB4MzAsIDB4NjQsIDB4M0EsIDB4REIsIDB4NDQsIDB4RkYsCisJIDB4MDQsIDB4MjUsIDB4MUYsIDB4MDAsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjUsIDB4NDQsIDB4MzcsIDB4MzYsIDB4QjQsIDB4ODQsIDB4NkUsIDB4MzYsCisJIDB4QjQsIDB4ODQsIDB4ODAsIDB4NEUsIDB4MjQsIDB4NDEsIDB4MDQsIDB4MjUsIDB4MTQsIDB4MDAsIDB4NjEsIDB4NEMsIDB4NjQsIDB4QTEsIDB4NjEsIDB4NTQsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjUsIDB4MEQsIDB4MDAsIDB4NjcsIDB4NEUsIDB4MDcsIDB4NjQsIDB4MUMsIDB4RkIsIDB4MDAsIDB4RTEsCisJIDB4MDIsIDB4NjAsIDB4MDEsIDB4RTEsIDB4NTMsIDB4MDEsIDB4MzMsIDB4RjMsIDB4RkQsIDB4MTEsIDB4RkMsIDB4MTgsIDB4NDAsIDB4NjQsIDB4M0EsIDB4REIsCisJIDB4MEEsIDB4MDAsIDB4QzQsIDB4RTIsIDB4MjcsIDB4NDQsIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4NDIsIDB4NjQsIDB4M0EsIDB4REIsIDB4NjcsIDB4NEMsCisJIDB4MDIsIDB4MDAsIDB4NDEsIDB4NjQsIDB4M0EsIDB4REIsIDB4NjIsIDB4RkYsIDB4MDgsIDB4RTEsIDB4RTIsIDB4RkUsIDB4NzIsIDB4NTIsIDB4NUMsIDB4NDksCisJIDB4MzIsIDB4N0IsIDB4NEQsIDB4RTIsIDB4M0IsIDB4MDEsIDB4MDgsIDB4RTEsIDB4MzksIDB4MDEsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsCisJIDB4MDAsIDB4NjAsIDB4NDYsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4MDQsIDB4RTEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4RTEsIDB4M0YsIDB4NDQsIDB4NDAsIDB4MjYsCisJIDB4MEIsIDB4MDAsIDB4MDEsIDB4MkEsIDB4MDUsIDB4MDAsIDB4NDIsIDB4NjAsIDB4MDksIDB4RTAsIDB4NjAsIDB4NjAsIDB4MUMsIDB4RTAsIDB4MDQsIDB4MDAsCisJIDB4NDIsIDB4NjAsIDB4MDksIDB4RTAsIDB4ODAsIDB4NjAsIDB4MUMsIDB4RTAsIDB4MDQsIDB4MjksIDB4RkUsIDB4MDEsIDB4QzQsIDB4RTIsIDB4NDMsIDB4NjQsCisJIDB4M0EsIDB4REIsIDB4ODMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4M0YsIDB4NDQsIDB4MDIsIDB4MjcsIDB4ODQsIDB4MDAsIDB4MjAsIDB4MkIsCisJIDB4RkYsIDB4MDEsIDB4ODAsIDB4RTEsIDB4OTUsIDB4NjAsIDB4ODAsIDB4RTcsIDB4NjEsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MEQsIDB4MDAsIDB4MDUsIDB4NjMsCisJIDB4QTcsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4MUYsIDB4MDEsIDB4NjMsCisJIDB4QTcsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QjEsIDB4Q0QsIDB4ODEsIDB4RTEsIDB4ODUsIDB4MUUsIDB4NjAsCisJIDB4QTIsIDB4NjQsIDB4NDQsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDMsIDB4QTcsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QTcsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUUsIDB4NjAsIDB4QkUsIDB4NjEsCisJIDB4MjEsIDB4NjAsIDB4NzIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4NDUsIDB4RDEsIDB4NDcsIDB4QkMsIDB4RTAsIDB4ODQsIDB4NjIsIDB4NDUsIDB4NjQsIDB4NUYsCisJIDB4RTgsIDB4ODMsIDB4QTcsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODIsIDB4RjMsIDB4Q0QsIDB4RTIsIDB4NjAsIDB4NTQsCisJIDB4MDQsIDB4RTEsIDB4MDQsIDB4MjksIDB4RkUsIDB4MDEsIDB4QzQsIDB4RTIsIDB4MTUsIDB4NjAsIDB4QTIsIDB4RTcsIDB4MzgsIDB4NjksIDB4RkYsIDB4RkYsCisJIDB4NjgsIDB4NDQsIDB4MDEsIDB4MTYsIDB4RkQsIDB4MDEsIDB4MDEsIDB4MkEsIDB4MzYsIDB4MDAsIDB4MDMsIDB4NjAsIDB4ODAsIDB4N0MsIDB4QTMsIDB4ODMsCisJIDB4MjEsIDB4NjAsIDB4NzIsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NDMsIDB4QkIsIDB4QjMsIDB4ODMsIDB4OTUsIDB4NjAsIDB4ODAsIDB4RTcsIDB4QTcsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTMsIDB4ODMsIDB4MTUsIDB4NjAsIDB4QTIsIDB4RTcsIDB4MzgsIDB4NjksIDB4RkYsIDB4RkYsCisJIDB4NjgsIDB4NDEsIDB4MDEsIDB4MTYsIDB4RkQsIDB4MDEsIDB4NjMsIDB4NDcsIDB4NjEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4M0EsCisJIDB4Q0MsIDB4ODQsIDB4MDIsIDB4MDAsIDB4MDcsIDB4M0EsIDB4REMsIDB4ODQsIDB4RkYsIDB4QjQsIDB4QTUsIDB4REIsIDB4NjAsIDB4NDcsIDB4RTgsIDB4ODQsCisJIDB4NDcsIDB4NjUsIDB4MjEsIDB4NjAsIDB4NzIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4QjQsIDB4ODUsIDB4QjQsIDB4ODMsIDB4ODAsIDB4RTEsIDB4OTUsIDB4NjAsCisJIDB4ODAsIDB4RTcsIDB4QTcsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODIsIDB4RjMsIDB4Q0QsIDB4RTIsIDB4NjAsIDB4NTQsCisJIDB4MDQsIDB4MjksIDB4RkUsIDB4MDEsIDB4QzQsIDB4RTIsIDB4ODMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODAsIDB4MkIsIDB4MDQsIDB4MDAsCisJIDB4QTYsIDB4NjAsIDB4RjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsIDB4ODMsIDB4RjMsIDB4ODAsIDB4RTEsIDB4Q0MsIDB4ODQsIDB4RTAsIDB4ODUsCisJIDB4MTUsIDB4NjAsIDB4QTIsIDB4RTcsIDB4MUQsIDB4NjAsIDB4REUsIDB4NjQsIDB4NTgsIDB4NEYsIDB4NEYsIDB4MDAsIDB4MUQsIDB4NjAsIDB4RkEsIDB4NjQsCisJIDB4NTgsIDB4NEYsIDB4NEIsIDB4MDAsIDB4MUUsIDB4NjAsIDB4MTYsIDB4NjQsIDB4NTgsIDB4NEYsIDB4NDcsIDB4MDAsIDB4MUUsIDB4NjAsIDB4MzIsIDB4NjQsCisJIDB4NTgsIDB4NEYsIDB4NDMsIDB4MDAsIDB4MUUsIDB4NjAsIDB4NEUsIDB4NjQsIDB4NTgsIDB4NEYsIDB4M0YsIDB4MDAsIDB4MUUsIDB4NjAsIDB4NkEsIDB4NjQsCisJIDB4NTgsIDB4NEYsIDB4M0IsIDB4MDAsIDB4MUUsIDB4NjAsIDB4ODYsIDB4NjQsIDB4NTgsIDB4NEYsIDB4MzcsIDB4MDAsIDB4MDEsIDB4NjgsIDB4RkYsIDB4NkEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4M0YsIDB4NDQsIDB4MjAsIDB4MjcsIDB4MDAsIDB4MDAsIDB4M0YsIDB4NDAsIDB4NDAsIDB4MjYsCisJIDB4MDgsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MTgsIDB4NjQsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4OTQsIDB4ODQsIDB4QTAsIDB4NTAsIDB4MUQsIDB4NjAsCisJIDB4MTksIDB4RTIsIDB4QzQsIDB4RTIsIDB4MDAsIDB4NjMsIDB4ODIsIDB4RkQsIDB4MzIsIDB4N0IsIDB4NEQsIDB4RTIsIDB4QkYsIDB4RkUsIDB4QzQsIDB4RTIsCisJIDB4NDEsIDB4RkYsIDB4RTAsIDB4RkUsIDB4RTEsIDB4RkUsIDB4RTIsIDB4RkUsIDB4NDMsIDB4RkYsIDB4NDQsIDB4RkYsIDB4NDYsIDB4RkYsIDB4ODQsIDB4RjMsCisJIDB4NjIsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDUsIDB4MzYsIDB4MkQsIDB4RkYsIDB4MDcsIDB4MzYsIDB4RDUsIDB4RkUsIDB4MDgsIDB4RTEsIDB4ODgsIDB4NjAsCisJIDB4ODUsIDB4NzEsIDB4OEQsIDB4RTIsIDB4QTUsIDB4NjAsIDB4NUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTAsIDB4RUMsIDB4NjMsIDB4NEEsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NDAsIDB4RUMsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDQsIDB4RDMsIDB4ODAsIDB4N0MsIDB4NjAsIDB4NDgsCisJIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4QjAsIDB4OEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MzAsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MDAsIDB4RTEsIDB4MDIsIDB4MDIsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODIsIDB4RkYsIDB4ODgsIDB4RkYsCisJIDB4NDgsIDB4RTIsIDB4MDEsIDB4NzAsIDB4QUUsIDB4RjEsIDB4MDAsIDB4NkIsIDB4ODksIDB4RkYsIDB4NjQsIDB4NTQsIDB4ODgsIDB4RkYsIDB4OUYsIDB4RkUsCisJIDB4MDIsIDB4MDUsIDB4NjQsIDB4NDQsIDB4NjAsIDB4NTQsIDB4Q0QsIDB4RTIsIDB4QzIsIDB4NjQsIDB4M0EsIDB4REIsIDB4QkMsIDB4RkYsIDB4QjUsIDB4RkYsCisJIDB4MUQsIDB4RkYsIDB4MjYsIDB4NDQsIDB4MDIsIDB4QjQsIDB4NDAsIDB4NDYsIDB4M0MsIDB4NDQsIDB4MDAsIDB4QkMsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MDMsCisJIDB4MjcsIDB4NDAsIDB4MjYsIDB4MjIsIDB4MDMsIDB4MDAsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MjcsIDB4NDQsIDB4MjAsIDB4MkEsCisJIDB4MDQsIDB4MDAsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QjAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4NUMsIDB4NEQsIDB4MjcsIDB4NDQsIDB4MTgsIDB4QjQsCisJIDB4NDAsIDB4NDcsIDB4MDAsIDB4RTEsIDB4NkMsIDB4NDAsIDB4NDQsIDB4RTIsIDB4QzQsIDB4RTIsIDB4NDcsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsCisJIDB4MzIsIDB4RjEsIDB4MDgsIDB4MjksIDB4MDksIDB4MDAsIDB4NjQsIDB4NDAsIDB4MDcsIDB4MjIsIDB4MDYsIDB4MDAsIDB4NDMsIDB4RkYsIDB4MjcsIDB4NDQsCisJIDB4MTAsIDB4QkMsIDB4NDAsIDB4NDcsIDB4MDAsIDB4NjQsIDB4MzIsIDB4RkIsIDB4MzEsIDB4NDEsIDB4M0MsIDB4NDQsIDB4MDEsIDB4QjEsIDB4MDAsIDB4QkMsCisJIDB4MEEsIDB4MDIsIDB4MDksIDB4MDMsIDB4MzIsIDB4RjMsIDB4MDAsIDB4N0MsIDB4MDEsIDB4QjQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDMsIDB4MzIsIDB4RjksCisJIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4NDgsIDB4NjAsIDB4MkQsIDB4N0QsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NkIsIDB4MDAsIDB4NjQsCisJIDB4MzMsIDB4RkIsIDB4MEMsIDB4NjAsIDB4MTYsIDB4NjQsIDB4QTAsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzIsIDB4RjMsIDB4MDgsIDB4MjksCisJIDB4MEEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDcsIDB4MjIsIDB4MDcsIDB4MDAsIDB4RkUsIDB4QjQsIDB4MzIsIDB4RkIsIDB4MjcsIDB4NDQsIDB4MTAsIDB4QkMsCisJIDB4RjcsIDB4QjQsIDB4NDAsIDB4NDcsIDB4NDMsIDB4RkYsIDB4MDAsIDB4NjQsIDB4M0EsIDB4REIsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MzEsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MzMsIDB4RkIsIDB4MDEsIDB4NjAsIDB4MEEsIDB4RTEsIDB4RTUsIDB4RkUsIDB4MTMsIDB4MDUsCisJIDB4MjcsIDB4NDQsIDB4MTAsIDB4MjYsIDB4MTMsIDB4MDAsIDB4OUYsIDB4RkUsIDB4MDIsIDB4MDQsIDB4MDIsIDB4RTEsIDB4MDYsIDB4MDAsIDB4M0UsIDB4RTEsCisJIDB4MzEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDIsIDB4MDAsIDB4MDQsIDB4MEEsIDB4QkYsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsCisJIDB4QUYsIDB4NjAsIDB4MTksIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTgsIDB4NjAsIDB4MDksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDgsIDB4MjYsCisJIDB4RkYsIDB4RkYsIDB4QkYsIDB4NjAsIDB4MkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDgsIDB4RjMsIDB4MzIsIDB4RjEsIDB4MDAsIDB4NjMsIDB4NjQsIDB4NDAsCisJIDB4MDMsIDB4MjIsIDB4M0QsIDB4MDAsIDB4MzEsIDB4NDAsIDB4MDgsIDB4MjYsIDB4RjQsIDB4MDEsIDB4Q0QsIDB4RTIsIDB4ODQsIDB4RTEsIDB4NzAsIDB4NDEsCisJIDB4QUQsIDB4ODAsIDB4NzEsIDB4NDAsIDB4ODAsIDB4MjcsIDB4RUQsIDB4MTIsIDB4MDMsIDB4MDMsIDB4QkYsIDB4NjAsIDB4N0MsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QzQsIDB4RTIsIDB4MzIsIDB4RkQsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4REYsIDB4MDEsIDB4MDAsIDB4NjMsCisJIDB4MzIsIDB4RkQsIDB4NkMsIDB4NDAsIDB4M0MsIDB4NDYsIDB4M0UsIDB4RjIsIDB4MkEsIDB4RjAsIDB4MjcsIDB4NDEsIDB4NDQsIDB4NDgsIDB4MjAsIDB4QjksCisJIDB4MDEsIDB4QjQsIDB4RjcsIDB4QjEsIDB4MEEsIDB4MDMsIDB4NjQsIDB4NDAsIDB4MDgsIDB4MjcsIDB4MDcsIDB4MDAsIDB4MEYsIDB4NjAsIDB4OTIsIDB4NjMsCisJIDB4MDAsIDB4NjQsIDB4NDUsIDB4RkIsIDB4NDYsIDB4RkIsIDB4QkQsIDB4REIsIDB4QTMsIDB4REIsIDB4Q0IsIDB4MEEsIDB4NDEsIDB4NDcsIDB4M0YsIDB4NDAsCisJIDB4MDEsIDB4MkIsIDB4MDQsIDB4MDAsIDB4RjYsIDB4RkUsIDB4NjcsIDB4NEMsIDB4MDUsIDB4NjAsIDB4NjksIDB4NkIsIDB4MDIsIDB4RTEsIDB4MDEsIDB4NjAsCisJIDB4MDgsIDB4RTEsIDB4RjAsIDB4RkUsIDB4ODQsIDB4RkYsIDB4QkYsIDB4NjAsIDB4QUQsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4RTUsIDB4RkUsCisJIDB4MDMsIDB4MDQsIDB4QUMsIDB4NjAsIDB4NDEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTQsIDB4RkUsIDB4MEEsIDB4MDQsIDB4MUQsIDB4RkYsIDB4MDAsIDB4RUIsCisJIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsCisJIDB4NDMsIDB4RkYsIDB4RTYsIDB4RkUsIDB4MDMsIDB4MDUsIDB4QTcsIDB4NjAsIDB4OUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0MsIDB4NDQsIDB4NjAsIDB4NDYsCisJIDB4MEYsIDB4RjAsIDB4NDAsIDB4NDIsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4QUIsIDB4NjAsIDB4MDMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MEIsIDB4NjQsIDB4M0EsIDB4REIsIDB4MUMsIDB4NDIsIDB4MjIsIDB4NDYsIDB4MTMsIDB4RjIsIDB4RkYsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MkEsIDB4RjIsCisJIDB4NDAsIDB4NDUsIDB4NDAsIDB4NDgsIDB4MDQsIDB4MkIsIDB4MTcsIDB4MDAsIDB4MTYsIDB4RjIsIDB4MUQsIDB4RjIsIDB4NDAsIDB4NDMsIDB4MEYsIDB4RjIsCisJIDB4NDAsIDB4NDQsIDB4MjUsIDB4NUUsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NDAsIDB4NDUsIDB4MEYsIDB4NjQsIDB4MTQsIDB4RjAsIDB4MzUsIDB4RjIsCisJIDB4QTAsIDB4ODIsIDB4MEYsIDB4QjQsIDB4Q0EsIDB4ODUsIDB4RDQsIDB4ODAsIDB4MTAsIDB4RjIsIDB4MDEsIDB4MDIsIDB4MkIsIDB4RkEsIDB4MjcsIDB4NDQsCisJIDB4NDAsIDB4QkMsIDB4NDAsIDB4NDcsIDB4MTMsIDB4MDAsIDB4MTcsIDB4RjIsIDB4MkMsIDB4RjAsIDB4NDAsIDB4NDMsIDB4MUIsIDB4RjIsIDB4MUQsIDB4RkEsCisJIDB4NDAsIDB4NDQsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDIsIDB4MDAsIDB4QUIsIDB4RkMsIDB4MDUsIDB4MDAsIDB4MjgsIDB4NDAsIDB4QTQsIDB4MzYsCisJIDB4MDIsIDB4MDAsIDB4MTEsIDB4RjIsIDB4MkIsIDB4RkEsIDB4MjcsIDB4NDQsIDB4QkYsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsCisJIDB4RkYsIDB4RkYsIDB4QUYsIDB4NjAsIDB4MkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4NDYsIDB4MkMsIDB4RjAsIDB4MjcsIDB4NDQsIDB4REYsIDB4QjQsCisJIDB4NDAsIDB4NDcsIDB4QjUsIDB4RkYsIDB4QkMsIDB4RkYsIDB4NDcsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4NDgsIDB4NjAsIDB4MkQsIDB4N0QsCisJIDB4MDgsIDB4NjAsIDB4MDAsIDB4NkIsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDEsIDB4MDAsIDB4MTMsIDB4MDAsIDB4MkEsIDB4RjAsIDB4MDEsIDB4NjUsCisJIDB4NjQsIDB4NDAsIDB4QTQsIDB4M0EsIDB4MDQsIDB4NjUsIDB4MjcsIDB4NDQsIDB4MzQsIDB4ODcsIDB4MzYsIDB4RjMsIDB4QjQsIDB4RkYsIDB4NjAsIDB4NUIsCisJIDB4NEQsIDB4RTIsIDB4MDQsIDB4NjQsIDB4M0EsIDB4REIsIDB4MDEsIDB4NjAsIDB4MEEsIDB4RTEsIDB4MkIsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4ODEsIDB4M0UsIDB4MDYsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjIsIDB4NDYsIDB4MDEsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4QkYsIDB4NjAsCisJIDB4ODUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QjUsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDAsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDMsIDB4MDAsCisJIDB4NjcsIDB4NEMsIDB4MDUsIDB4NjAsIDB4NjksIDB4NkIsIDB4MDIsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4QzQsIDB4RTIsIDB4MDgsIDB4NjQsCisJIDB4M0EsIDB4REIsIDB4RjAsIDB4RkUsIDB4MjUsIDB4NDYsIDB4MDEsIDB4RjIsIDB4NjEsIDB4NDUsIDB4RDQsIDB4OUUsIDB4MjEsIDB4NDYsIDB4MTYsIDB4RkEsCisJIDB4MkEsIDB4NDQsIDB4NzIsIDB4NDUsIDB4MjQsIDB4RkEsIDB4OTUsIDB4RjMsIDB4MDYsIDB4MDQsIDB4RTQsIDB4RTIsIDB4REMsIDB4OUMsIDB4MjksIDB4NDAsCisJIDB4MDEsIDB4MjYsIDB4NjQsIDB4NDQsIDB4OTUsIDB4RjksIDB4MjUsIDB4RkEsIDB4OTYsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4OTYsIDB4RkIsCisJIDB4MjgsIDB4RkEsIDB4OTcsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4OTcsIDB4RkIsIDB4MjksIDB4RkEsIDB4MkQsIDB4NDQsIDB4MDQsIDB4MkEsCisJIDB4MDYsIDB4MDAsIDB4MjgsIDB4NDAsIDB4QTQsIDB4MzYsIDB4MDMsIDB4MDAsIDB4QTksIDB4NjAsIDB4QzksIDB4NzgsIDB4RkYsIDB4RkYsIDB4OTQsIDB4RkMsCisJIDB4MUYsIDB4NjAsIDB4OUEsIDB4NjUsIDB4QTUsIDB4RDEsIDB4MjgsIDB4NDQsIDB4MDgsIDB4MkEsIDB4NTEsIDB4MDAsIDB4MDMsIDB4MkIsIDB4MDEsIDB4MDAsCisJIDB4NEUsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4NEIsIDB4MDAsIDB4MzIsIDB4RjIsIDB4MkYsIDB4RjAsIDB4NTAsIDB4RkUsIDB4MDEsIDB4MkEsCisJIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjEsIDB4OEYsIDB4RjMsIDB4MzEsIDB4MDAsIDB4RDAsIDB4ODAsIDB4MzMsIDB4RjIsIDB4MzAsIDB4RjAsIDB4MzQsIDB4RjIsCisJIDB4RDAsIDB4ODAsIDB4MzEsIDB4RjAsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDcsIDB4MzQsIDB4MEMsIDB4RkYsIDB4QjQsIDB4MTIsIDB4NjAsCisJIDB4Q0UsIDB4NjUsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MTgsIDB4NjAsIDB4NDMsIDB4NTAsIDB4RkUsCisJIDB4NjYsIDB4NDEsIDB4MzIsIDB4RjAsIDB4NjMsIDB4NDYsIDB4MDMsIDB4RjIsIDB4NjEsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MzMsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4MDQsIDB4RjIsIDB4NjEsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MzQsIDB4RjAsIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4MEMsIDB4MDAsIDB4RjIsIDB4NjEsIDB4NDYsIDB4MUEsIDB4MTgsIDB4RTgsIDB4MDEsIDB4MDYsIDB4RjAsIDB4OEYsIDB4RjMsCisJIDB4NjEsIDB4NDYsIDB4MDIsIDB4NjEsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MTIsIDB4MDAsIDB4RkMsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MEUsCisJIDB4NjEsIDB4NDQsIDB4MTQsIDB4RkEsIDB4MTEsIDB4RkMsIDB4MEIsIDB4MDAsIDB4MkMsIDB4RjIsIDB4MkYsIDB4RkEsIDB4MkQsIDB4RjIsIDB4MzAsIDB4RkEsCisJIDB4MkUsIDB4RjIsIDB4MzEsIDB4RkEsIDB4MUQsIDB4RkYsIDB4MjYsIDB4NDQsIDB4MDIsIDB4QkMsIDB4NDAsIDB4NDYsIDB4MjAsIDB4MDAsIDB4MjYsIDB4NDMsCisJIDB4ODQsIDB4QkIsIDB4RkMsIDB4QjMsIDB4MjEsIDB4NDYsIDB4MDEsIDB4NUQsIDB4MEYsIDB4RkMsIDB4NUMsIDB4NDYsIDB4MjUsIDB4NDQsIDB4MDYsIDB4RkEsCisJIDB4MDUsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MTMsIDB4MDAsIDB4NTAsIDB4RkUsIDB4MjgsIDB4NDAsIDB4MDgsIDB4M0EsIDB4MTIsIDB4MDAsCisJIDB4MkYsIDB4RjIsIDB4MzAsIDB4RjAsIDB4NjAsIDB4NDMsIDB4MzEsIDB4RjIsIDB4MjIsIDB4NDYsIDB4NjQsIDB4NDEsIDB4MkMsIDB4RjAsIDB4MkQsIDB4RjAsCisJIDB4RDMsIDB4ODAsIDB4MkUsIDB4RjAsIDB4RDEsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MjcsIDB4NDQsIDB4MDksIDB4MEMsIDB4MDMsIDB4MDAsIDB4MjcsIDB4NDQsCisJIDB4MDYsIDB4MjIsIDB4MDUsIDB4MDAsIDB4QjgsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4RDQsIDB4NjQsCisJIDB4NDAsIDB4NDgsIDB4MEQsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjEsIDB4NDYsIDB4MUMsIDB4RjIsIDB4NjIsIDB4RjEsIDB4RkYsIDB4QjQsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDYsIDB4NjQsIDB4NDQsIDB4NDAsIDB4NDUsIDB4MEEsIDB4MzYsIDB4NzAsIDB4NjQsIDB4MTQsIDB4MzYsIDB4MzgsIDB4NjQsCisJIDB4MzcsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MDQsIDB4N0YsIDB4NDAsIDB4NDUsIDB4MTUsIDB4NjQsIDB4NkUsIDB4M0EsIDB4MDMsIDB4MDAsIDB4ODQsIDB4N0YsCisJIDB4NDAsIDB4NDUsIDB4MEIsIDB4NjQsIDB4NDAsIDB4NDQsIDB4MDAsIDB4NjMsIDB4MjgsIDB4NDQsIDB4QTQsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MDQsIDB4MkIsCisJIDB4MDUsIDB4MDAsIDB4MzAsIDB4RjMsIDB4MjQsIDB4NDUsIDB4RDQsIDB4ODQsIDB4Q0EsIDB4NjUsIDB4RDQsIDB4ODMsIDB4RDQsIDB4NjQsIDB4MUEsIDB4MDAsCisJIDB4MEYsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjEsIDB4NDYsIDB4NzAsIDB4NjMsIDB4MUMsIDB4RjIsIDB4Q0EsIDB4NjUsIDB4NDAsIDB4NDUsIDB4MEEsIDB4MzYsCisJIDB4NzAsIDB4NjQsIDB4MTQsIDB4MzYsIDB4MzgsIDB4NjQsIDB4MzcsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MDQsIDB4N0YsIDB4NDAsIDB4NDUsIDB4MTUsIDB4NjQsCisJIDB4NkUsIDB4M0EsIDB4MDMsIDB4MDAsIDB4ODQsIDB4N0YsIDB4NDAsIDB4NDUsIDB4MEIsIDB4NjQsIDB4NDAsIDB4NDQsIDB4MkIsIDB4RjIsIDB4QzQsIDB4ODUsCisJIDB4RDQsIDB4ODMsIDB4QzQsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MkYsIDB4RjAsIDB4QjAsIDB4RjAsIDB4QjEsIDB4RjIsIDB4MDAsIDB4RTEsIDB4QTEsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4ODAsIDB4NEUsIDB4ODMsIDB4NEMsIDB4OUEsIDB4RkYsIDB4ODQsIDB4NEMsIDB4ODUsIDB4NEMsIDB4ODEsIDB4NEMsIDB4QTEsIDB4RkYsCisJIDB4OTgsIDB4RkYsIDB4ODcsIDB4NEYsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEYsIDB4ODcsIDB4NEQsIDB4ODcsIDB4NEMsIDB4MDEsIDB4MDgsIDB4MDEsIDB4MDAsCisJIDB4RkYsIDB4RkYsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkEsIDB4NDQsCisJIDB4QkMsIDB4RkYsIDB4QzQsIDB4RTIsIDB4MEMsIDB4NzQsIDB4MDQsIDB4RTEsIDB4QTEsIDB4RkYsIDB4MzUsIDB4RjMsIDB4QzQsIDB4RTIsIDB4NjAsIDB4NTQsCisJIDB4ODksIDB4RkYsIDB4MTMsIDB4NzQsIDB4ODgsIDB4RkYsIDB4QjUsIDB4RkYsIDB4NDcsIDB4RkYsIDB4MjksIDB4NDQsIDB4RjcsIDB4QjQsIDB4NDAsIDB4NDksCisJIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4NDgsIDB4NjAsIDB4MkQsIDB4N0QsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NkIsIDB4MjcsIDB4NDQsIDB4MDEsIDB4MkEsCisJIDB4MDUsIDB4MDAsIDB4RkUsIDB4QjQsIDB4NDAsIDB4NDcsIDB4QTgsIDB4NjAsIDB4ODksIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTcsIDB4NjAsIDB4OEUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjgsIDB4NDAsIDB4QjQsIDB4M0EsIDB4MDksIDB4MDAsIDB4MjcsIDB4NDQsIDB4MDcsIDB4MjIsIDB4MDUsIDB4MDAsIDB4RjgsIDB4QjQsCisJIDB4NDAsIDB4NDcsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4OUIsIDB4MDEsIDB4MjgsIDB4NDQsIDB4RDQsIDB4MzYsIDB4MDMsIDB4MDAsCisJIDB4QUEsIDB4NjAsIDB4RUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDgsIDB4RTIsIDB4MjcsIDB4NDQsIDB4RkIsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MjEsIDB4NjAsCisJIDB4OTgsIDB4NjMsIDB4QTMsIDB4RDMsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzQsIDB4RkIsIDB4MUMsIDB4NDIsCisJIDB4MjIsIDB4NDYsIDB4MkEsIDB4RjAsIDB4RjcsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsCisJIDB4Q0MsIDB4MDAsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MjIsIDB4MjYsIDB4NDIsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MDMsIDB4MDAsCisJIDB4MDQsIDB4MjYsIDB4MDcsIDB4MDAsIDB4QzIsIDB4MDAsIDB4MDQsIDB4MkIsIDB4QzAsIDB4MDAsIDB4ODgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsCisJIDB4MDEsIDB4MDAsIDB4MDcsIDB4RjQsIDB4NDcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4NDcsIDB4RkEsIDB4MEQsIDB4NjAsIDB4M0UsIDB4NjIsCisJIDB4ODAsIDB4RkYsIDB4QzQsIDB4NjAsIDB4NzgsIDB4NDQsIDB4MDIsIDB4QTQsIDB4QTIsIDB4REIsIDB4N0QsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODIsIDB4RkYsCisJIDB4ODgsIDB4RjMsIDB4NjYsIDB4NUMsIDB4RDAsIDB4ODAsIDB4MDAsIDB4N0MsIDB4MDcsIDB4MDMsIDB4NjYsIDB4NDMsIDB4MjIsIDB4NDYsIDB4MjIsIDB4RjIsCisJIDB4NjMsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDEsIDB4MDAsIDB4M0MsIDB4RjEsIDB4NDcsIDB4RjAsIDB4NjQsIDB4NDEsIDB4NjQsIDB4NDcsCisJIDB4RkYsIDB4QjQsIDB4NjAsIDB4NUYsIDB4MjAsIDB4QkMsIDB4ODAsIDB4MjYsIDB4ODAsIDB4QUMsIDB4NjAsIDB4NDcsIDB4MjIsIDB4NDYsIDB4M0EsIDB4RkEsCisJIDB4NjQsIDB4NDQsIDB4MjAsIDB4N0YsIDB4MzQsIDB4OTQsIDB4M0IsIDB4RkEsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUEsIDB4MEYsIDB4NjQsIDB4NjAsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4ODUsIDB4MDAsCisJIDB4MkEsIDB4RjIsIDB4MDAsIDB4NjAsIDB4N0MsIDB4NjIsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MjcsIDB4MDAsIDB4QTIsIDB4RDMsIDB4MDAsIDB4NjEsCisJIDB4NjAsIDB4RkUsIDB4QTAsIDB4RDMsIDB4REUsIDB4ODIsIDB4QTIsIDB4RDEsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4NjQsIDB4NUYsIDB4REMsIDB4ODQsCisJIDB4RjEsIDB4ODEsIDB4QzAsIDB4MkIsIDB4MDQsIDB4MDAsIDB4ODAsIDB4MkEsIDB4MDIsIDB4MDAsIDB4N0YsIDB4QTQsIDB4REMsIDB4ODQsIDB4RkYsIDB4M0IsCisJIDB4MDMsIDB4MDAsIDB4NjAsIDB4NDcsIDB4REMsIDB4ODcsIDB4MDEsIDB4NjEsIDB4QzAsIDB4ODAsIDB4MDAsIDB4MzYsIDB4REMsIDB4ODQsIDB4NEUsIDB4REIsCisJIDB4NjAsIDB4RkUsIDB4REEsIDB4ODIsIDB4QTIsIDB4RDEsIDB4RkYsIDB4RkYsIDB4QzEsIDB4ODQsIDB4RjAsIDB4MjIsIDB4MTAsIDB4QTQsIDB4RjAsIDB4MkEsCisJIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4N0MsIDB4NjIsIDB4QTIsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDMsIDB4NUEsIDB4RDEsIDB4M0EsIDB4RkEsIDB4M0IsIDB4RjgsIDB4NzQsIDB4NjIsIDB4QTIsIDB4RDAsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDQsIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsCisJIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDEsIDB4NUEsIDB4RDEsCisJIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDQsIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTQsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsCisJIDB4NjQsIDB4NDQsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTYsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsCisJIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjUsIDB4NDAsIDB4MEQsIDB4M0EsIDB4MUMsIDB4MDAsIDB4NjQsIDB4NDcsIDB4RTgsIDB4N0YsIDB4NUEsIDB4RDEsCisJIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTksIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUEsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsCisJIDB4NjQsIDB4NDQsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUMsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsCisJIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUUsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUYsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUEsIDB4NjUsIDB4NDQsIDB4MDIsIDB4QTQsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4MEIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4N0YsIDB4QjQsCisJIDB4MEMsIDB4RjAsIDB4MDQsIDB4MDIsIDB4NjQsIDB4NDYsIDB4MDAsIDB4RjAsIDB4MDQsIDB4NjQsIDB4MjIsIDB4NDYsIDB4MDMsIDB4RkEsIDB4NjAsIDB4NDEsCisJIDB4NjQsIDB4NDYsIDB4MDEsIDB4RjIsIDB4RkMsIDB4QTEsIDB4NjEsIDB4NDUsIDB4RDQsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDIsIDB4MDAsIDB4RjAsCisJIDB4MDQsIDB4NjMsIDB4NjQsIDB4NDYsIDB4MDEsIDB4RjIsIDB4MjIsIDB4NDYsIDB4MUEsIDB4RkEsIDB4MDMsIDB4RkMsIDB4MDIsIDB4MDAsIDB4MjIsIDB4NDYsCisJIDB4MUEsIDB4RkEsIDB4MzUsIDB4RjIsIDB4MDQsIDB4RjgsIDB4REMsIDB4ODQsIDB4MzUsIDB4RkEsIDB4MTQsIDB4RjIsIDB4MEYsIDB4QjUsIDB4MEYsIDB4QjQsCisJIDB4Q0MsIDB4ODQsIDB4OTQsIDB4ODAsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MkEsIDB4RjIsIDB4MDEsIDB4MDIsIDB4OTQsIDB4ODQsIDB4MkEsIDB4RkEsCisJIDB4OTUsIDB4RkMsIDB4MDYsIDB4MDAsIDB4QzQsIDB4M0EsIDB4MDcsIDB4MDAsIDB4MjcsIDB4NDQsIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDcsIDB4NDgsIDB4RTIsCisJIDB4QTgsIDB4NjAsIDB4MjgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NDQsIDB4MDQsIDB4MjYsIDB4MDUsIDB4MDAsIDB4NjgsIDB4M0EsIDB4MDMsIDB4MDAsCisJIDB4MzIsIDB4NDQsIDB4MDAsIDB4MjcsIDB4MDMsIDB4MDAsIDB4QTcsIDB4NjAsIDB4OUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4NjQsIDB4M0EsIDB4REIsCisJIDB4QTcsIDB4NjAsIDB4OUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NjQsIDB4M0EsIDB4REIsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4M0MsIDB4NDYsCisJIDB4MkEsIDB4RjIsIDB4MTMsIDB4RjAsIDB4QTQsIDB4ODQsIDB4QjQsIDB4QkMsIDB4NDAsIDB4NDgsIDB4NjIsIDB4RjEsIDB4NjQsIDB4NDcsIDB4RkYsIDB4QjQsCisJIDB4NjAsIDB4NDUsIDB4RDAsIDB4ODAsIDB4NzAsIDB4NjEsIDB4MDEsIDB4MDYsIDB4NjQsIDB4NDQsIDB4MEEsIDB4MzYsIDB4NzAsIDB4NjQsIDB4MTQsIDB4MzYsCisJIDB4MzgsIDB4NjQsIDB4MzcsIDB4MzYsIDB4MTUsIDB4NjQsIDB4NkUsIDB4MzYsIDB4MEIsIDB4NjQsIDB4NDAsIDB4NEUsIDB4QTAsIDB4NjMsIDB4MEEsIDB4NjQsCisJIDB4NjUsIDB4NDAsIDB4MEEsIDB4MzYsIDB4MDMsIDB4MDAsIDB4MzgsIDB4NjEsIDB4MTQsIDB4NjQsIDB4RUIsIDB4ODMsIDB4NDAsIDB4NDUsIDB4NDMsIDB4NDQsCisJIDB4MDIsIDB4NjAsIDB4NUUsIDB4NjUsIDB4MkEsIDB4RjIsIDB4MkIsIDB4RjIsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MkIsIDB4MDQsIDB4MDAsIDB4MkUsIDB4NDUsCisJIDB4RDQsIDB4ODUsIDB4QzUsIDB4ODQsIDB4MDUsIDB4MDAsIDB4MUIsIDB4RjAsIDB4QzUsIDB4ODQsIDB4QzAsIDB4ODQsIDB4MkUsIDB4NDUsIDB4QzQsIDB4ODQsCisJIDB4NjAsIDB4NDMsIDB4MjgsIDB4NDQsIDB4MDAsIDB4RTEsIDB4QTEsIDB4RkYsIDB4ODAsIDB4NEUsIDB4ODMsIDB4NEMsIDB4OUEsIDB4RkYsIDB4NTYsIDB4NjIsCisJIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4NUMsIDB4NjIsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4QTEsIDB4RkYsCisJIDB4OTgsIDB4RkYsIDB4ODcsIDB4NEYsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEYsIDB4ODcsIDB4NEQsIDB4ODcsIDB4NEMsIDB4MDEsIDB4MDgsIDB4MDEsIDB4MDAsCisJIDB4RkYsIDB4RkYsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkEsIDB4NDQsCisJIDB4QkMsIDB4RkYsIDB4QjUsIDB4RkYsIDB4NDcsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDIsIDB4QkMsIDB4NDAsIDB4NDcsIDB4MzYsIDB4RjMsIDB4QjcsIDB4RkYsCisJIDB4QjQsIDB4RkYsIDB4NDgsIDB4NjAsIDB4MkQsIDB4N0QsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NkIsIDB4NjAsIDB4NUIsIDB4NEQsIDB4RTIsIDB4QTgsIDB4NjAsCisJIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjEsIDB4NDYsIDB4QjUsIDB4RkYsIDB4QkMsIDB4RkYsIDB4NDcsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsCisJIDB4NDgsIDB4NjAsIDB4MkQsIDB4N0QsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NkIsIDB4MjYsIDB4NDMsIDB4MjUsIDB4NDQsIDB4MDYsIDB4RkEsIDB4MkEsIDB4NDQsCisJIDB4NzIsIDB4NDUsIDB4MjQsIDB4RkEsIDB4OTUsIDB4RjMsIDB4MDYsIDB4MDQsIDB4RTQsIDB4RTIsIDB4REMsIDB4OUMsIDB4MjksIDB4NDAsIDB4MDEsIDB4MjYsCisJIDB4NjQsIDB4NDQsIDB4OTUsIDB4RjksIDB4MjUsIDB4RkEsIDB4OTYsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4OTYsIDB4RkIsIDB4MjgsIDB4RkEsCisJIDB4OTcsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4OTcsIDB4RkIsIDB4MjksIDB4RkEsIDB4MkQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEUsIDB4MDAsCisJIDB4MUQsIDB4RkYsIDB4MjYsIDB4NDQsIDB4MDIsIDB4QkMsIDB4NDAsIDB4NDYsIDB4MjcsIDB4NDQsIDB4MDcsIDB4MjIsIDB4MDUsIDB4MDAsIDB4RjgsIDB4QjQsCisJIDB4NDAsIDB4NDcsIDB4MDYsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MzAsIDB4RjEsIDB4NTAsIDB4MDAsIDB4RkMsIDB4QjMsIDB4MzIsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MEEsIDB4QkIsIDB4MEYsIDB4RkMsIDB4Q0IsIDB4RkUsIDB4QTcsIDB4NjAsIDB4OUIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MkQsIDB4NDQsIDB4MDQsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MEYsIDB4RkMsIDB4MDUsIDB4RkYsIDB4MzAsIDB4RjEsIDB4MjcsIDB4NDQsIDB4MDUsIDB4MjIsCisJIDB4MkQsIDB4MDAsIDB4RkEsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MkQsIDB4NDQsIDB4MTAsIDB4MkEsIDB4MjQsIDB4MDAsIDB4MjgsIDB4NDAsIDB4RDQsIDB4M0EsCisJIDB4MjEsIDB4MDAsIDB4MzEsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDAsIDB4N0MsIDB4MkIsIDB4NDQsIDB4RDAsIDB4ODAsIDB4NzAsIDB4NDUsIDB4MDIsIDB4MjgsCisJIDB4NjQsIDB4NDQsIDB4QzQsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjQsIDB4MDAsIDB4QjQsIDB4NjAsIDB4NTAsIDB4MDgsIDB4MjgsIDB4MDEsIDB4MDAsCisJIDB4MjAsIDB4MjksIDB4NkQsIDB4RTIsIDB4MTIsIDB4NjAsIDB4QzAsIDB4NjMsIDB4MUQsIDB4RjAsIDB4QzAsIDB4NjQsIDB4QzAsIDB4ODQsIDB4QTMsIDB4RDEsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4QzAsIDB4ODQsIDB4QTMsIDB4REIsIDB4QTgsIDB4NjAsCisJIDB4ODksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MDcsIDB4MDAsIDB4MDIsIDB4MkEsIDB4MDUsIDB4MDAsCisJIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDYsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MDUsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjgsIDB4NDQsCisJIDB4QTQsIDB4M0EsIDB4MDQsIDB4MDAsIDB4MzksIDB4RjEsIDB4MjUsIDB4NDQsIDB4MEEsIDB4MzYsIDB4MzgsIDB4RjEsIDB4MzEsIDB4NDAsIDB4MDgsIDB4MjYsCisJIDB4MDAsIDB4N0MsIDB4MkIsIDB4NDQsIDB4RDAsIDB4ODAsIDB4NzAsIDB4NDUsIDB4MDIsIDB4MjgsIDB4NjQsIDB4NDQsIDB4QzQsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MjQsIDB4MDAsIDB4QjQsIDB4MjgsIDB4NDAsIDB4RTQsIDB4MzYsIDB4MDAsIDB4QjQsIDB4NjAsIDB4NTAsIDB4MDgsIDB4MjgsIDB4MDEsIDB4MDAsCisJIDB4MjAsIDB4MjksIDB4NkQsIDB4RTIsIDB4QTcsIDB4NjAsIDB4OEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjEsIDB4NDYsIDB4QjUsIDB4RkYsIDB4QkMsIDB4RkYsCisJIDB4NDcsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4NDgsIDB4NjAsIDB4MkQsIDB4N0QsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NkIsIDB4MjcsIDB4NDQsCisJIDB4MDcsIDB4MjIsIDB4MDUsIDB4MDAsIDB4RjgsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDYsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4RUEsIDB4MDEsCisJIDB4MjcsIDB4NDQsIDB4MDUsIDB4MjIsIDB4MDksIDB4MDAsIDB4QkEsIDB4QjQsIDB4NDAsIDB4NDcsIDB4M0MsIDB4NDYsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsCisJIDB4QzAsIDB4RkUsIDB4QTcsIDB4NjAsIDB4OUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDIsIDB4MkEsIDB4MDYsIDB4MDAsIDB4RkQsIDB4QjQsCisJIDB4NDAsIDB4NDcsIDB4MDYsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4RjQsIDB4MDEsIDB4RjMsIDB4MEEsIDB4N0MsIDB4NTAsIDB4NkQsIDB4RTIsCisJIDB4RjAsIDB4MDEsIDB4NzIsIDB4NDUsIDB4REMsIDB4ODQsIDB4OTUsIDB4RkIsIDB4MTEsIDB4NjQsIDB4M0EsIDB4REIsIDB4OTYsIDB4RjMsIDB4MDYsIDB4MDQsCisJIDB4REMsIDB4ODQsIDB4OTYsIDB4RkIsIDB4OTcsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4OTcsIDB4RkIsIDB4QTcsIDB4NjAsIDB4QTYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjEsIDB4MTIsIDB4NjQsIDB4M0EsIDB4REIsIDB4MTYsIDB4NjAsIDB4QkEsIDB4NjMsIDB4QkQsIDB4RDMsIDB4NzIsIDB4NDUsCisJIDB4NDQsIDB4OEEsIDB4MDIsIDB4MjgsIDB4MDIsIDB4MDAsIDB4RTQsIDB4RTIsIDB4REQsIDB4ODEsIDB4MDIsIDB4MjgsIDB4MDIsIDB4MDAsIDB4RTQsIDB4RTIsCisJIDB4REQsIDB4ODEsIDB4QkQsIDB4RDMsIDB4OTUsIDB4RjEsIDB4NjEsIDB4NDUsIDB4QzAsIDB4ODQsIDB4MDAsIDB4NjEsIDB4MDIsIDB4MjQsIDB4MDEsIDB4QjksCisJIDB4QzQsIDB4ODQsIDB4NjAsIDB4NTUsIDB4MkEsIDB4NTIsIDB4OTUsIDB4RkIsIDB4MDIsIDB4MjQsIDB4MDEsIDB4QjksIDB4QkQsIDB4RDMsIDB4OTYsIDB4RjEsCisJIDB4NjEsIDB4NDUsIDB4QzAsIDB4ODQsIDB4MDAsIDB4NjEsIDB4MDIsIDB4MjQsIDB4MDEsIDB4QjksIDB4QzQsIDB4ODQsIDB4OTYsIDB4RkIsIDB4MDIsIDB4MjQsCisJIDB4MDEsIDB4QjksIDB4QkQsIDB4RDMsIDB4OTcsIDB4RjEsIDB4NjEsIDB4NDUsIDB4QzAsIDB4ODQsIDB4QzQsIDB4ODQsIDB4OTcsIDB4RkIsIDB4QTgsIDB4NjAsCisJIDB4MEMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QUUsIDB4MDEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MjUsIDB4MDksIDB4MDAsIDB4MDQsIDB4MjUsCisJIDB4MDMsIDB4MDAsIDB4NDcsIDB4RkYsIDB4MzIsIDB4NzQsIDB4QTUsIDB4MDEsIDB4QzQsIDB4RTIsIDB4QUYsIDB4NjAsIDB4MTksIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NEMsIDB4NEUsIDB4NDcsIDB4RkYsIDB4MzIsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4QUMsIDB4NjAsIDB4OEYsIDB4NzgsIDB4MDAsIDB4NjEsIDB4MTAsIDB4NjQsCisJIDB4M0EsIDB4REIsIDB4QTcsIDB4NjAsIDB4OUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTcsIDB4NjAsIDB4OUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUMsIDB4NEQsCisJIDB4MjYsIDB4NDQsIDB4MDIsIDB4MjYsIDB4MEMsIDB4MDAsIDB4M0UsIDB4NDYsIDB4MDksIDB4RjIsIDB4MUUsIDB4NDEsIDB4MDMsIDB4MUIsIDB4QUUsIDB4NjAsCisJIDB4Q0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NUUsIDB4RkQsIDB4RkIsIDB4MjEsIDB4NDQsIDB4MDIsIDB4NjQsIDB4NDAsIDB4NDYsIDB4NDEsIDB4NUQsCisJIDB4MjEsIDB4NDYsIDB4MDAsIDB4RjIsIDB4NDYsIDB4NDUsIDB4ODcsIDB4RkMsIDB4NEMsIDB4RTIsIDB4MDEsIDB4NjQsIDB4MzMsIDB4RkIsIDB4MDEsIDB4NjAsCisJIDB4MEUsIDB4RTEsIDB4MDMsIDB4RTEsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDAsIDB4MDAsIDB4MjEsIDB4NjksIDB4QjYsIDB4RkYsIDB4QTEsIDB4RkYsCisJIDB4NkMsIDB4NUUsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4NjAsIDB4NUMsIDB4MjAsIDB4NjQsIDB4M0EsIDB4REIsIDB4NjgsIDB4NDMsIDB4MjYsIDB4RkMsCisJIDB4MjIsIDB4NjksIDB4NjQsIDB4NDQsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkMsIDB4NUYsIDB4NjAsIDB4NDMsIDB4MjYsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4NjgsIDB4NUYsIDB4MjYsIDB4RkEsIDB4M0EsIDB4NjksIDB4MUQsIDB4RkMsIDB4MkUsIDB4NDQsIDB4MzYsIDB4RjEsIDB4MUMsIDB4RkEsIDB4QzMsIDB4OTQsCisJIDB4Q0QsIDB4RTIsIDB4MkUsIDB4NDQsIDB4MTQsIDB4MzYsIDB4MTIsIDB4MDAsIDB4MEEsIDB4MzYsIDB4MEYsIDB4MDAsIDB4NjMsIDB4NDUsIDB4RTMsIDB4ODMsCisJIDB4RTMsIDB4ODMsIDB4QzcsIDB4ODMsIDB4RTMsIDB4ODMsIDB4QzcsIDB4ODMsIDB4RkYsIDB4RkYsIDB4MzcsIDB4MzYsIDB4MDUsIDB4MDAsIDB4NkUsIDB4MzYsCisJIDB4MDQsIDB4MDAsIDB4QUUsIDB4NjAsIDB4RTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsCisJIDB4RkYsIDB4RkYsIDB4ODAsIDB4MjcsIDB4Q0YsIDB4ODMsIDB4MUIsIDB4RkMsIDB4MDEsIDB4NjQsIDB4NEYsIDB4RkIsIDB4QTEsIDB4RkYsIDB4MUMsIDB4RjIsCisJIDB4MjksIDB4NDEsIDB4RjksIDB4ODEsIDB4NTIsIDB4NEEsIDB4NzEsIDB4ODksIDB4NjgsIDB4NUYsIDB4MjcsIDB4RkEsIDB4NkMsIDB4NDAsIDB4MDMsIDB4MTUsCisJIDB4QUUsIDB4NjAsIDB4RjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODgsIDB4NjAsIDB4ODUsIDB4NzEsIDB4OEQsIDB4RTIsIDB4OTksIDB4RjEsIDB4RkMsIDB4QTMsCisJIDB4RDMsIDB4ODAsIDB4NDMsIDB4NDMsIDB4MDMsIDB4MDQsIDB4QUUsIDB4NjAsIDB4RUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDAsIDB4MDEsIDB4MkEsCisJIDB4NEMsIDB4MDAsIDB4OUEsIDB4RkYsIDB4MjMsIDB4NDMsIDB4MTgsIDB4NjEsIDB4QTEsIDB4RkYsIDB4OEMsIDB4NDQsIDB4Q0IsIDB4ODMsIDB4MkEsIDB4RkEsCisJIDB4NDAsIDB4NDgsIDB4NDAsIDB4MjcsIDB4MDQsIDB4QTEsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MkIsIDB4MDEsIDB4MDAsIDB4MDYsIDB4QTEsIDB4ODgsIDB4QjAsCisJIDB4ODgsIDB4MzYsIDB4RDksIDB4ODEsIDB4NjIsIDB4NDUsIDB4MjMsIDB4NDQsIDB4NTQsIDB4OTQsIDB4MjgsIDB4NDAsIDB4MDQsIDB4MjYsIDB4MDAsIDB4NjQsCisJIDB4M0YsIDB4RkEsIDB4QzksIDB4ODEsIDB4NjUsIDB4NDIsIDB4N0EsIDB4REMsIDB4MDAsIDB4QjksIDB4RkQsIDB4MUMsIDB4MDAsIDB4RjQsIDB4NkUsIDB4NjEsCisJIDB4MTAsIDB4NjIsIDB4MTQsIDB4MDIsIDB4MDUsIDB4MUQsIDB4MTIsIDB4MUUsIDB4MEMsIDB4MDAsIDB4MDAsIDB4RjQsIDB4N0MsIDB4NjEsIDB4MDIsIDB4NjIsCisJIDB4N0EsIDB4REMsIDB4NjMsIDB4NDAsIDB4RkQsIDB4MUMsIDB4RjksIDB4MUQsIDB4RkYsIDB4QjEsIDB4MDgsIDB4MUUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsCisJIDB4MDIsIDB4NjIsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDQsIDB4NUEsIDB4REEsIDB4OTgsIDB4RkYsIDB4MDEsIDB4NjAsCisJIDB4MDgsIDB4RTEsIDB4ODEsIDB4RTEsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDAsIDB4QTEsIDB4RkYsIDB4NDcsIDB4RkYsIDB4MjYsIDB4NDQsIDB4RkQsIDB4QjQsCisJIDB4ODQsIDB4QkMsIDB4MDEsIDB4MTUsIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDYsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDAsIDB4MTQsIDB4NjMsIDB4MDEsIDB4MTEsCisJIDB4MDEsIDB4MDAsIDB4RkQsIDB4MUYsIDB4QUUsIDB4NjAsIDB4NjEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OUEsIDB4RkYsIDB4NTQsIDB4NjMsIDB4MTIsIDB4NjQsCisJIDB4NDAsIDB4NDYsIDB4MDAsIDB4NjQsIDB4MEYsIDB4RkEsIDB4QTEsIDB4RkYsIDB4Q0IsIDB4RjEsIDB4MTIsIDB4NjEsIDB4NTAsIDB4RkUsIDB4OEMsIDB4NDQsCisJIDB4Q0MsIDB4RjAsIDB4QkQsIDB4REEsIDB4NDAsIDB4NDgsIDB4MDQsIDB4MjYsIDB4NDAsIDB4MDAsIDB4QTEsIDB4RkYsIDB4OEMsIDB4NDQsIDB4QkQsIDB4REEsCisJIDB4MzAsIDB4RkIsIDB4NkMsIDB4NDQsIDB4QkQsIDB4REEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MjYsIDB4MjQsIDB4MDAsIDB4RDAsIDB4ODAsIDB4QTEsIDB4RkYsCisJIDB4OEMsIDB4NDQsIDB4NkMsIDB4NUMsIDB4RjIsIDB4RkUsIDB4QkQsIDB4REEsIDB4Q0QsIDB4RjMsIDB4RDQsIDB4ODAsIDB4RDAsIDB4ODAsIDB4QkQsIDB4RDgsCisJIDB4MkQsIDB4NDQsIDB4MTUsIDB4MEMsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDcsIDB4MDAsIDB4MjgsIDB4NDIsIDB4MEMsIDB4QjIsIDB4MDgsIDB4M0EsCisJIDB4MDMsIDB4MDAsIDB4MTAsIDB4QkMsIDB4NDAsIDB4NEQsIDB4NEQsIDB4MDAsIDB4MDMsIDB4MEEsIDB4QUUsIDB4NjAsIDB4RjksIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTEsIDB4QkMsIDB4NDAsIDB4NEQsIDB4MjgsIDB4NDUsIDB4QkYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4MjQsIDB4ODgsIDB4NDIsIDB4MDAsIDB4MzAsIDB4QkMsCisJIDB4NDAsIDB4NEQsIDB4M0YsIDB4MDAsIDB4MjAsIDB4QjksIDB4NUMsIDB4OEUsIDB4QTEsIDB4RkYsIDB4OEMsIDB4NDQsIDB4QkQsIDB4REEsIDB4REMsIDB4OUMsCisJIDB4NkMsIDB4NDQsIDB4RjIsIDB4RkUsIDB4QkQsIDB4REEsIDB4MDgsIDB4MjgsIDB4NDQsIDB4NEUsIDB4REMsIDB4ODQsIDB4MkUsIDB4NUMsIDB4QjAsIDB4ODQsCisJIDB4RUYsIDB4QjEsIDB4MDgsIDB4MjQsIDB4NDAsIDB4QjksIDB4NDEsIDB4NDYsIDB4MkMsIDB4MDAsIDB4OEMsIDB4NDQsIDB4MDQsIDB4NjEsIDB4QkQsIDB4REEsCisJIDB4NTAsIDB4RkUsIDB4ODAsIDB4MjcsIDB4MDAsIDB4NjQsIDB4MzAsIDB4RkIsIDB4OEMsIDB4NDQsIDB4QkQsIDB4REEsIDB4RDAsIDB4ODAsIDB4OEMsIDB4NDQsCisJIDB4QkQsIDB4REEsIDB4RDQsIDB4ODAsIDB4MDAsIDB4NjUsIDB4OEMsIDB4NDQsIDB4Q0QsIDB4RjEsIDB4QkQsIDB4REEsIDB4RDAsIDB4ODAsIDB4MjgsIDB4NDQsCisJIDB4MDMsIDB4MEMsIDB4QTAsIDB4MkEsIDB4MEEsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MTAsIDB4NjUsIDB4NjAsIDB4NDAsIDB4QzQsIDB4MzYsIDB4MDQsIDB4MDAsCisJIDB4RDQsIDB4M0EsIDB4MDgsIDB4MDAsIDB4MjcsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MzAsIDB4NjUsIDB4MDAsIDB4NjQsIDB4M0YsIDB4RkEsIDB4NDYsIDB4NEUsCisJIDB4MzUsIDB4OEQsIDB4NUYsIDB4MDAsIDB4NDAsIDB4MjYsIDB4RjksIDB4MDEsIDB4MzAsIDB4NjUsIDB4OUQsIDB4REMsIDB4OUQsIDB4REMsIDB4OUQsIDB4REMsCisJIDB4RjQsIDB4MDEsIDB4MDAsIDB4RTEsIDB4MjMsIDB4NDMsIDB4RTgsIDB4QTMsIDB4NkEsIDB4NjIsIDB4OUEsIDB4RkYsIDB4QTEsIDB4RkYsIDB4MjgsIDB4NDQsCisJIDB4MDMsIDB4MkIsIDB4MDQsIDB4MDAsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4MjgsIDB4NDQsIDB4ODgsIDB4QjAsIDB4ODgsIDB4MkEsCisJIDB4MDMsIDB4MDAsIDB4NzAsIDB4NjIsIDB4N0EsIDB4REMsIDB4MjgsIDB4NDQsIDB4NDAsIDB4MkIsIDB4MTMsIDB4MDAsIDB4NzIsIDB4NjIsIDB4N0EsIDB4REMsCisJIDB4MDQsIDB4RTYsIDB4N0EsIDB4REMsIDB4M0IsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MjAsIDB4MkIsIDB4MDIsIDB4MDAsIDB4N0EsIDB4REMsCisJIDB4N0EsIDB4REMsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUIsIDB4RkMsIDB4QTMsIDB4MjUsIDB4RkYsIDB4M0YsIDB4RkMsIDB4MDQsIDB4QTMsIDB4QjAsIDB4RkYsCisJIDB4MDEsIDB4MDAsIDB4M0YsIDB4RkMsIDB4Q0YsIDB4ODMsIDB4REYsIDB4ODMsIDB4MDQsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MTAsIDB4NjIsIDB4NkMsIDB4NjEsCisJIDB4MUYsIDB4MDAsIDB4MjcsIDB4MDMsIDB4Q0IsIDB4ODMsIDB4RkYsIDB4NjAsIDB4RkUsIDB4NjUsIDB4MEUsIDB4QTMsIDB4QTcsIDB4ODQsIDB4RjIsIDB4QTMsCisJIDB4MDAsIDB4RjQsIDB4MTAsIDB4NjIsIDB4NkMsIDB4NjEsIDB4N0EsIDB4REMsIDB4RkUsIDB4MUMsIDB4MDMsIDB4MUQsIDB4N0MsIDB4QTgsIDB4RDksIDB4ODEsCisJIDB4MEEsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsIDB4QTcsIDB4ODQsIDB4N0EsIDB4NjEsIDB4N0EsIDB4REMsIDB4RkUsIDB4MUMsIDB4RjksIDB4MUQsCisJIDB4N0MsIDB4QTgsIDB4RDksIDB4ODEsIDB4RjYsIDB4MDMsIDB4RkYsIDB4QjEsIDB4MEMsIDB4MUUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsCisJIDB4QTEsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MEMsIDB4RTEsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QTEsIDB4RkYsIDB4Q0QsIDB4ODEsIDB4NkMsIDB4NDQsCisJIDB4NUEsIDB4REEsIDB4OTgsIDB4RkYsIDB4MDAsIDB4RTYsIDB4N0MsIDB4NDQsIDB4MzMsIDB4RkIsIDB4MDEsIDB4NjAsIDB4MEMsIDB4RTEsIDB4ODMsIDB4RTEsCisJIDB4QTEsIDB4RkYsIDB4OEMsIDB4NDQsIDB4NDYsIDB4NDUsIDB4QTEsIDB4RkYsIDB4MTQsIDB4NjMsIDB4MDEsIDB4MTAsIDB4RkUsIDB4MUYsIDB4MDEsIDB4NjAsCisJIDB4MDgsIDB4RTEsIDB4MEEsIDB4NjQsIDB4NjAsIDB4NTQsIDB4NDcsIDB4RkYsIDB4NTAsIDB4NEIsIDB4NjcsIDB4NTAsIDB4NjksIDB4RTIsIDB4NkEsIDB4NDAsCisJIDB4NDAsIDB4MkIsIDB4MDEsIDB4MTUsIDB4MjksIDB4MDAsIDB4NkMsIDB4NDAsIDB4MjgsIDB4NDAsIDB4MDMsIDB4MjYsIDB4MTUsIDB4MDAsIDB4MzEsIDB4NDAsCisJIDB4MjAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MjgsIDB4NDAsIDB4NTAsIDB4M0EsIDB4MEYsIDB4MDAsIDB4MkQsIDB4NDQsIDB4MjAsIDB4MkEsIDB4MEMsIDB4MDAsCisJIDB4MkIsIDB4NDQsIDB4QUMsIDB4ODAsIDB4MjgsIDB4NDAsIDB4QjQsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDMsIDB4MzAsIDB4RkIsIDB4MDQsIDB4MDAsCisJIDB4MkIsIDB4NTAsIDB4QTgsIDB4NjAsIDB4OTIsIDB4NzgsIDB4MDQsIDB4RTEsIDB4MDQsIDB4RTEsIDB4QTEsIDB4RkYsIDB4MzUsIDB4RjEsIDB4MjYsIDB4NDQsCisJIDB4NjQsIDB4NTQsIDB4Q0QsIDB4RTIsIDB4ODQsIDB4QkMsIDB4MkQsIDB4NDAsIDB4MEMsIDB4MjIsIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDYsIDB4MjMsIDB4NjQsCisJIDB4M0EsIDB4REIsIDB4QUIsIDB4NjAsIDB4NkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDAsIDB4MjYsIDB4MjIsIDB4MDQsIDB4MDAsIDB4MDIsIDB4NjQsCisJIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4NkMsIDB4NDAsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4NDgsIDB4NjAsIDB4MkQsIDB4N0QsCisJIDB4MDgsIDB4NjAsIDB4MDAsIDB4NkIsIDB4MzcsIDB4RjMsIDB4MkIsIDB4NDUsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MjgsIDB4NjUsIDB4NDQsCisJIDB4NjAsIDB4NTAsIDB4QTAsIDB4NEMsIDB4MjAsIDB4QkMsIDB4RkYsIDB4QjQsIDB4QTAsIDB4NTEsIDB4MzUsIDB4RjEsIDB4NzQsIDB4NDQsIDB4QzAsIDB4OTQsCisJIDB4MzIsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MTgsIDB4MDAsIDB4MjgsIDB4NDQsIDB4QTQsIDB4MzYsIDB4MDQsIDB4MDAsIDB4MEMsIDB4QjQsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MzYsIDB4MTEsIDB4MDAsIDB4MjYsIDB4NDMsIDB4RkQsIDB4QjMsIDB4MDQsIDB4QkIsIDB4NDMsIDB4NDYsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4MjgsIDB4NDcsIDB4NDAsIDB4QkYsIDB4NDAsIDB4NDgsIDB4MEEsIDB4QkIsIDB4MEYsIDB4RkMsIDB4NTAsIDB4NEIsIDB4NjcsIDB4NTAsIDB4MDAsIDB4NjQsCisJIDB4MzAsIDB4RkIsIDB4MDUsIDB4RkYsIDB4QzYsIDB4MDEsIDB4MjQsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjgsIDB4NDQsIDB4MDQsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4QTcsIDB4NjAsIDB4OEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUQsIDB4RkYsIDB4NDgsIDB4RTIsIDB4MjcsIDB4NDQsIDB4MDYsIDB4MjIsIDB4MDUsIDB4MDAsCisJIDB4RjksIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MjYsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MTgsIDB4MDAsCisJIDB4MjYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4QzAsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MTEsIDB4MEUsIDB4OTgsIDB4RjEsCisJIDB4MUUsIDB4NjAsIDB4RjgsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsCisJIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsCisJIDB4QUMsIDB4NjAsIDB4MDUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OTgsIDB4RjEsIDB4MUUsIDB4NjAsIDB4RkEsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsCisJIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MkEsIDB4NjQsIDB4M0EsIDB4REIsIDB4NUMsIDB4NDEsIDB4ODcsIDB4RTEsCisJIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDAsIDB4MDIsIDB4MDAsIDB4MjksIDB4NjQsIDB4M0EsIDB4REIsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4ODcsIDB4RTEsCisJIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDAsIDB4MTEsIDB4MDAsIDB4MUYsIDB4NjAsIDB4MEMsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjgsIDB4QTIsIDB4REIsIDB4RjEsIDB4MDEsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MjEsIDB4NjQsIDB4M0EsIDB4REIsCisJIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4NkMsIDB4NDAsIDB4MDAsIDB4NjQsIDB4MzMsIDB4RkIsIDB4MzIsIDB4NzQsIDB4NDAsIDB4NjMsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDEsIDB4NjgsIDB4MDEsIDB4MTEsIDB4MDksIDB4MDAsIDB4QTcsIDB4NkEsIDB4MjIsIDB4NjQsIDB4M0EsIDB4REIsCisJIDB4MDMsIDB4NjAsIDB4QzksIDB4NjMsIDB4MDEsIDB4MTEsIDB4MDIsIDB4MDAsIDB4NkMsIDB4NDAsIDB4RkMsIDB4MUYsIDB4NkMsIDB4NDAsIDB4QjUsIDB4RkYsCisJIDB4NkMsIDB4NDAsIDB4QkMsIDB4RkYsIDB4NkMsIDB4NDAsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4NDgsIDB4NjAsIDB4MkQsIDB4N0QsIDB4MDgsIDB4NjAsCisJIDB4MDAsIDB4NkIsIDB4MDMsIDB4MEEsIDB4QTcsIDB4NjAsIDB4OUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjQsIDB4NEYsIDB4RkIsIDB4MjcsIDB4NDQsCisJIDB4MDYsIDB4MjIsIDB4MDYsIDB4MDAsIDB4RjksIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4NDgsIDB4RTIsCisJIDB4MjcsIDB4NjQsIDB4M0EsIDB4REIsIDB4QjMsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4NTQsIDB4NjIsIDB4MjIsIDB4NDYsCisJIDB4QTIsIDB4RDAsIDB4MTYsIDB4NjMsIDB4N0MsIDB4NDEsIDB4NDQsIDB4NDgsIDB4ODAsIDB4MzYsIDB4MDQsIDB4NjEsIDB4MjgsIDB4NDAsIDB4NTAsIDB4MzYsCisJIDB4MDQsIDB4NjEsIDB4NDEsIDB4NEUsIDB4MjgsIDB4NDQsIDB4QTQsIDB4MzYsIDB4MEUsIDB4NjMsIDB4MTIsIDB4NjAsIDB4QzIsIDB4NjIsIDB4QTIsIDB4RDEsCisJIDB4MjQsIDB4NDQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4QzAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4OUEsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NTQsIDB4NjIsIDB4QTIsIDB4RDIsIDB4RkYsIDB4RkYsIDB4NkEsIDB4NDAsIDB4ODAsIDB4NEUsIDB4N0EsIDB4RDQsCisJIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MUQsCisJIDB4NzgsIDB4MDAsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4MjgsIDB4NDAsIDB4MDMsIDB4MkIsIDB4MDQsIDB4MDAsCisJIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4NkEsIDB4NDAsIDB4NzAsIDB4NjIsIDB4MjgsIDB4NDQsIDB4ODgsIDB4QjAsIDB4ODgsIDB4MzYsCisJIDB4N0EsIDB4RDQsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MEIsIDB4MDAsIDB4NzIsIDB4NjIsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4QTIsIDB4RDIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MDIsIDB4MDAsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4NDYsIDB4MDAsIDB4MjMsIDB4NDMsCisJIDB4Q0YsIDB4ODMsIDB4REYsIDB4ODMsIDB4MDIsIDB4MDMsIDB4NTUsIDB4MDMsIDB4MDQsIDB4MDAsIDB4MDMsIDB4RjAsIDB4MDQsIDB4RjQsIDB4NjQsIDB4NDIsCisJIDB4MzcsIDB4MDAsIDB4MkUsIDB4NDAsIDB4MDQsIDB4MkEsIDB4MjEsIDB4MDAsIDB4QTEsIDB4RkYsIDB4MDIsIDB4RkUsIDB4MTAsIDB4MjUsIDB4NDIsIDB4RkUsCisJIDB4NzIsIDB4NDUsIDB4NjUsIDB4NEMsIDB4OTUsIDB4RjMsIDB4MDMsIDB4MDQsIDB4RTQsIDB4RTIsIDB4REMsIDB4ODQsIDB4OTUsIDB4RkIsIDB4QTEsIDB4RkYsCisJIDB4ODAsIDB4NEMsIDB4OTYsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4OTYsIDB4RkIsIDB4ODAsIDB4NEMsIDB4OTcsIDB4RjMsIDB4MDIsIDB4MDQsCisJIDB4REMsIDB4ODQsIDB4OTcsIDB4RkIsIDB4ODAsIDB4NEMsIDB4NUMsIDB4NEUsIDB4RjgsIDB4QTMsIDB4MDMsIDB4RjIsIDB4OUEsIDB4RjIsIDB4MDQsIDB4RjQsCisJIDB4RkYsIDB4QjEsIDB4RjgsIDB4QTEsIDB4MDYsIDB4QTQsIDB4NjAsIDB4NDIsIDB4MDksIDB4MDAsIDB4MDMsIDB4RjIsIDB4OUEsIDB4RjIsIDB4MDQsIDB4RjQsCisJIDB4QzgsIDB4ODIsIDB4RkYsIDB4QjEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4RkYsIDB4QjEsIDB4N0EsIDB4RDQsIDB4RkYsIDB4RkYsCisJIDB4RkQsIDB4MUMsIDB4RjksIDB4MUQsIDB4RkYsIDB4QjEsIDB4MTcsIDB4MUUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4REEsIDB4ODIsIDB4REEsIDB4ODIsCisJIDB4QTIsIDB4RDIsIDB4QTEsIDB4RkYsIDB4MDksIDB4NzQsIDB4ODAsIDB4NEQsIDB4MEUsIDB4MDAsIDB4MDMsIDB4RjIsIDB4OUEsIDB4RjIsIDB4MDQsIDB4RjQsCisJIDB4MjMsIDB4NDMsIDB4QTEsIDB4RkYsIDB4QTAsIDB4RDIsIDB4RkUsIDB4QTEsIDB4Q0IsIDB4ODMsIDB4ODAsIDB4NEUsIDB4QUYsIDB4ODMsIDB4MDIsIDB4MUQsCisJIDB4MDIsIDB4MDMsIDB4RUQsIDB4MDEsIDB4RTMsIDB4MDEsIDB4QTEsIDB4RkYsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDIsIDB4MDAsIDB4OUMsIDB4NEUsCisJIDB4OUMsIDB4NEMsIDB4QTEsIDB4RkYsIDB4REEsIDB4ODMsIDB4NjYsIDB4NDQsIDB4MjIsIDB4NDYsIDB4MEMsIDB4RkEsIDB4MEIsIDB4RkMsIDB4ODcsIDB4NEYsCisJIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEYsIDB4ODcsIDB4NEQsIDB4ODcsIDB4NEMsIDB4MDEsIDB4MDgsIDB4MDEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4ODcsIDB4NEMsCisJIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkEsIDB4NDQsIDB4QkMsIDB4RkYsIDB4MDEsIDB4NjAsCisJIDB4MDgsIDB4RTEsIDB4MEMsIDB4NzQsIDB4MDQsIDB4RTEsIDB4QTEsIDB4RkYsIDB4MzUsIDB4RjMsIDB4QzQsIDB4RTIsIDB4NjAsIDB4NTQsIDB4ODksIDB4RkYsCisJIDB4MTMsIDB4NzQsIDB4ODgsIDB4RkYsIDB4MjksIDB4NDQsIDB4RjcsIDB4QjQsIDB4NDAsIDB4NDksIDB4MzQsIDB4NjQsIDB4M0EsIDB4REIsIDB4MDYsIDB4RTEsCisJIDB4NDcsIDB4RkYsIDB4QTgsIDB4NjAsIDB4NjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDgsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NDMsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MjgsIDB4RjMsIDB4NDcsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDcsIDB4MzcsIDB4NEIsIDB4MDAsCisJIDB4MDUsIDB4M0IsIDB4MDQsIDB4MDAsIDB4RkYsIDB4MEEsIDB4ODAsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MjksIDB4RjUsIDB4MkEsIDB4RjMsCisJIDB4NDcsIDB4RkYsIDB4M0YsIDB4RjAsIDB4MDEsIDB4MUIsIDB4MDEsIDB4NjQsIDB4NjAsIDB4NTYsIDB4QUQsIDB4RTIsIDB4QjUsIDB4RkYsIDB4NkMsIDB4NDAsCisJIDB4NDAsIDB4RTEsIDB4QTEsIDB4RkYsIDB4MDAsIDB4RjQsIDB4NkUsIDB4NjEsIDB4MTIsIDB4NjIsIDB4NjQsIDB4NDMsIDB4MDEsIDB4RTEsIDB4MDMsIDB4NjQsCisJIDB4RTIsIDB4RDAsIDB4QzksIDB4ODEsIDB4NjQsIDB4NEMsIDB4Q0MsIDB4ODQsIDB4REEsIDB4ODIsIDB4RkEsIDB4MDIsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NkIsCisJIDB4OUEsIDB4RkYsIDB4Q0EsIDB4ODIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4N0EsIDB4RDAsIDB4QTEsIDB4RkYsCisJIDB4NjQsIDB4NEMsIDB4RkMsIDB4MUMsIDB4RjgsIDB4MUQsIDB4MDAsIDB4QjksIDB4MDYsIDB4MUUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4REEsIDB4ODIsCisJIDB4NUEsIDB4RDIsIDB4QTEsIDB4RkYsIDB4NjAsIDB4NEQsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsIDB4MDgsIDB4MDAsIDB4MjgsIDB4RjMsIDB4QTUsIDB4NjAsCisJIDB4QzQsIDB4NjUsIDB4NjAsIDB4NDAsIDB4MEUsIDB4M0IsIDB4MDIsIDB4MDAsIDB4ODAsIDB4NEMsIDB4RkUsIDB4MDEsIDB4QTEsIDB4RkYsIDB4ODcsIDB4NEUsCisJIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4NjcsIDB4NEMsIDB4RkYsIDB4RkYsIDB4QkMsIDB4RkYsIDB4MDAsIDB4RTEsCisJIDB4RDUsIDB4RkUsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDYsIDB4NjAsIDB4NDEsIDB4QjUsIDB4RkYsIDB4QjcsIDB4RkYsCisJIDB4QjQsIDB4RkYsIDB4MjksIDB4RjUsIDB4M0YsIDB4RjAsIDB4MjQsIDB4RjIsIDB4NDQsIDB4NDMsIDB4NDAsIDB4NDQsIDB4MDAsIDB4RjQsIDB4RjMsIDB4NjAsCisJIDB4QTAsIDB4NjUsIDB4MTAsIDB4NjIsIDB4NUEsIDB4RDIsIDB4RDksIDB4ODEsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RkIsIDB4MDIsIDB4NjEsIDB4NDUsCisJIDB4MjQsIDB4NDQsIDB4RDQsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RkQsIDB4QTUsIDB4NDgsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QzQsIDB4OUQsIDB4MEQsIDB4NjAsIDB4MDAsIDB4NkIsIDB4MjQsIDB4NDQsIDB4QzAsIDB4ODMsIDB4QkIsIDB4RkYsIDB4MjksIDB4RjUsIDB4MDEsIDB4RTEsCisJIDB4MDAsIDB4RjQsIDB4NkMsIDB4NjEsIDB4MTAsIDB4NjIsIDB4MDUsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsCisJIDB4MDQsIDB4NjIsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTAsIDB4MUEsIDB4MDAsIDB4MjYsIDB4NDQsIDB4MDEsIDB4MjYsIDB4MEMsIDB4MDAsCisJIDB4MjQsIDB4NDQsIDB4QzgsIDB4ODQsIDB4NDAsIDB4NDQsIDB4MDIsIDB4MDMsIDB4NkMsIDB4NDUsIDB4RjMsIDB4MDEsIDB4MDMsIDB4MTUsIDB4MDEsIDB4NjQsCisJIDB4MDUsIDB4RkEsIDB4MTUsIDB4MDAsIDB4NkMsIDB4NDUsIDB4RUQsIDB4MDEsIDB4MjMsIDB4NDQsIDB4QzgsIDB4ODQsIDB4NDAsIDB4NDMsIDB4MDIsIDB4MDMsCisJIDB4NkMsIDB4NDUsIDB4RTcsIDB4MDEsIDB4MDAsIDB4NjQsIDB4MDEsIDB4MTUsIDB4MDEsIDB4NjQsIDB4NkMsIDB4NDUsIDB4MDUsIDB4RkIsIDB4RTIsIDB4RDIsCisJIDB4REEsIDB4ODIsIDB4QzksIDB4ODEsIDB4NjAsIDB4NEMsIDB4REQsIDB4MUMsIDB4RDcsIDB4MDMsIDB4QkMsIDB4RkYsIDB4REEsIDB4MDEsIDB4MDAsIDB4RTEsCisJIDB4RDUsIDB4RkUsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDgsIDB4RTEsIDB4QTEsIDB4RkYsIDB4NjcsIDB4NEMsIDB4NDMsIDB4RkYsIDB4QUQsIDB4NEYsCisJIDB4MDIsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUQsIDB4MDEsIDB4RTEsIDB4MDEsIDB4NjAsIDB4NjksIDB4NkIsIDB4QTUsIDB4NjAsIDB4QzQsIDB4NjQsCisJIDB4NjAsIDB4NEMsIDB4QkIsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NEMsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NEMsCisJIDB4RkMsIDB4MDEsIDB4MjksIDB4RjMsIDB4MkEsIDB4RjEsIDB4MDcsIDB4QjUsIDB4MDQsIDB4RTEsIDB4NjUsIDB4NDEsIDB4NjQsIDB4NTQsIDB4Q0QsIDB4RTIsCisJIDB4OTUsIDB4ODEsIDB4QTEsIDB4NUQsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjksIDB4MDEsIDB4MDAsIDB4RTEsIDB4MzAsIDB4NDAsIDB4MDIsIDB4MzYsCisJIDB4QTEsIDB4RkYsIDB4ODMsIDB4RkYsIDB4OEQsIDB4RkYsIDB4NUMsIDB4NDQsIDB4NUMsIDB4NDMsIDB4NUMsIDB4NDIsIDB4NUMsIDB4NDEsIDB4NUMsIDB4NDAsCisJIDB4QUMsIDB4RkYsIDB4QUQsIDB4RkYsIDB4RTcsIDB4RTEsIDB4QjEsIDB4NjAsIDB4QzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjEsIDB4N0YsIDB4NjAsCisJIDB4QzAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjMsIDB4MjYsIDB4MDIsIDB4OTgsIDB4RkUsIDB4MUEsIDB4MDUsIDB4MUIsIDB4NjAsCisJIDB4QjgsIDB4NjIsIDB4QTIsIDB4RDUsIDB4MEUsIDB4RjIsIDB4MTUsIDB4MTgsIDB4MDIsIDB4MTgsIDB4MDksIDB4RjQsIDB4RkIsIDB4MDEsIDB4MjMsIDB4NDQsCisJIDB4MDAsIDB4QTgsIDB4MDgsIDB4N0UsIDB4MEEsIDB4MDIsIDB4NjYsIDB4NDQsIDB4MTEsIDB4RkIsIDB4NDYsIDB4NDMsIDB4MjMsIDB4NDcsIDB4ODAsIDB4QkYsCisJIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MDgsIDB4QjksIDB4MTAsIDB4N0UsIDB4MDAsIDB4N0YsIDB4MEUsIDB4RkEsIDB4MDAsIDB4NjcsCisJIDB4MEEsIDB4MDAsIDB4MjAsIDB4NDQsIDB4REMsIDB4ODUsIDB4MEYsIDB4QjQsIDB4RjYsIDB4QTAsIDB4N0YsIDB4NjcsIDB4MDcsIDB4NjMsIDB4MDMsIDB4MDUsCisJIDB4NDUsIDB4NDAsIDB4MDAsIDB4NjcsIDB4RDgsIDB4RkUsIDB4RkYsIDB4MjcsIDB4MDUsIDB4RkQsIDB4MEEsIDB4N0UsIDB4MDQsIDB4RkIsIDB4NjEsIDB4NTUsCisJIDB4NEEsIDB4MDAsIDB4MjgsIDB4RkIsIDB4MDEsIDB4RjMsIDB4MjksIDB4RkIsIDB4NDQsIDB4NDYsIDB4NDAsIDB4NDUsIDB4MTAsIDB4NjEsIDB4N0UsIDB4NjAsCisJIDB4QzAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjMsIDB4MzEsIDB4MDIsIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MjIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjcsIDB4MDMsIDB4NjMsIDB4MkEsIDB4MDIsIDB4MjYsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MjQsIDB4MDAsIDB4OTgsIDB4RkUsCisJIDB4MTksIDB4MDUsIDB4MUIsIDB4NjAsIDB4QjgsIDB4NjIsIDB4QTIsIDB4RDUsIDB4MEUsIDB4RjIsIDB4MTQsIDB4MTgsIDB4MDIsIDB4MTgsIDB4MDksIDB4RjQsCisJIDB4RkIsIDB4MDEsIDB4MjMsIDB4NDQsIDB4MDAsIDB4QTgsIDB4MDgsIDB4N0UsIDB4MEEsIDB4MDIsIDB4NjYsIDB4NDQsIDB4MTEsIDB4RkIsIDB4NDYsIDB4NDMsCisJIDB4MjMsIDB4NDcsIDB4ODAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MDgsIDB4QjksIDB4MTAsIDB4N0UsIDB4MDAsIDB4N0YsCisJIDB4MEUsIDB4RkEsIDB4MDksIDB4MDAsIDB4MjAsIDB4NDQsIDB4REMsIDB4ODUsIDB4MEYsIDB4QjQsIDB4RjYsIDB4QTAsIDB4N0YsIDB4NjcsIDB4MDcsIDB4NjMsCisJIDB4MDUsIDB4MDUsIDB4NDUsIDB4NDAsIDB4RDgsIDB4RkUsIDB4MDAsIDB4NjcsIDB4RDAsIDB4RkUsIDB4RDksIDB4RkUsIDB4RkYsIDB4MjcsIDB4MDUsIDB4RkQsCisJIDB4MEIsIDB4N0UsIDB4MDQsIDB4RkIsIDB4MTIsIDB4NjAsIDB4QzgsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjAsIDB4QjAsIDB4ODAsIDB4QkMsCisJIDB4MDgsIDB4MjgsIDB4QTMsIDB4REIsIDB4NjEsIDB4NTUsIDB4NjMsIDB4MDAsIDB4MDQsIDB4QjUsIDB4ODIsIDB4QjUsIDB4MjUsIDB4MDIsIDB4MDQsIDB4MDMsCisJIDB4MjAsIDB4NDQsIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDAsIDB4QTMsIDB4RDMsIDB4OTksIDB4RkUsIDB4MDQsIDB4MDQsIDB4MDIsIDB4QkMsIDB4RkUsIDB4QjQsCisJIDB4QTMsIDB4REIsIDB4NTYsIDB4MDAsIDB4QkMsIDB4RjMsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MjYsIDB4NTIsIDB4MDAsIDB4QTMsIDB4RDMsIDB4RkYsIDB4QTAsCisJIDB4RjgsIDB4QjQsIDB4MDIsIDB4MDIsIDB4QTMsIDB4REIsIDB4MUMsIDB4MDAsIDB4MDQsIDB4QkMsIDB4QkYsIDB4QjQsIDB4QTMsIDB4REIsIDB4MDgsIDB4QjAsCisJIDB4MDEsIDB4NjQsIDB4MDgsIDB4MjQsIDB4MDIsIDB4NjQsIDB4MjgsIDB4RkIsIDB4MjAsIDB4NDQsIDB4ODAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4RDAsIDB4RkUsCisJIDB4M0YsIDB4MDAsIDB4QkYsIDB4QjQsIDB4QTMsIDB4REIsIDB4M0MsIDB4MDAsIDB4NDAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4RkEsIDB4MDIsIDB4RjgsIDB4QjQsCisJIDB4QTMsIDB4REIsIDB4MDgsIDB4QjUsIDB4MDcsIDB4N0MsIDB4MDEsIDB4MDIsIDB4QkMsIDB4RjksIDB4MjAsIDB4NDQsIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDAsCisJIDB4MTIsIDB4NjAsIDB4QzgsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjAsIDB4QjUsIDB4MDcsIDB4QjUsIDB4MDgsIDB4MjgsIDB4QzQsIDB4MDIsCisJIDB4OTksIDB4RkUsIDB4MjYsIDB4MDUsIDB4MjAsIDB4NDQsIDB4ODAsIDB4MjYsIDB4MjMsIDB4MDAsIDB4MjAsIDB4MkEsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MkEsCisJIDB4MUYsIDB4MDAsIDB4QkYsIDB4QjQsIDB4NDAsIDB4NDAsIDB4MDksIDB4MDAsIDB4QTgsIDB4RkYsIDB4MjAsIDB4NDQsIDB4OTksIDB4RkUsIDB4MDIsIDB4MDUsCisJIDB4ODAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4NDAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4MTMsIDB4MDAsIDB4MDAsIDB4RjEsIDB4ODAsIDB4QkMsIDB4NDAsIDB4NDAsCisJIDB4NjQsIDB4NDQsIDB4RTAsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MEEsIDB4MzYsIDB4MjksIDB4MDEsIDB4MEIsIDB4MzYsIDB4NUEsIDB4MDEsIDB4MjgsIDB4RkIsCisJIDB4MDEsIDB4RjEsIDB4MjksIDB4RjksIDB4MDIsIDB4RjEsIDB4MkEsIDB4RjksIDB4MDMsIDB4RjEsIDB4MkIsIDB4RjksIDB4RDAsIDB4RkUsIDB4QUUsIDB4RkYsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODIsIDB4M0UsIDB4NzUsIDB4NDQsIDB4MDIsIDB4QjAsIDB4MDEsIDB4QjAsIDB4MjgsIDB4MDIsIDB4REMsIDB4MDIsCisJIDB4MDQsIDB4QjAsIDB4MDgsIDB4QjAsIDB4MEIsIDB4MDIsIDB4MjAsIDB4MDIsIDB4NDAsIDB4MjYsIDB4QTcsIDB4RkYsIDB4OEMsIDB4RkYsIDB4NzUsIDB4NDAsCisJIDB4ODAsIDB4MkIsIDB4MDEsIDB4MDAsIDB4QUIsIDB4RkYsIDB4NzUsIDB4NDQsIDB4OEQsIDB4RkYsIDB4RUEsIDB4MDEsIDB4MEEsIDB4RjMsIDB4QUEsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MDIsIDB4MDAsIDB4NjAsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MEMsIDB4MDAsIDB4QzAsIDB4NjAsCisJIDB4MDAsIDB4N0MsIDB4QTAsIDB4ODQsIDB4ODAsIDB4M0IsIDB4MDIsIDB4MDAsIDB4QzAsIDB4NjcsIDB4MDMsIDB4MDAsIDB4NDAsIDB4M0IsIDB4MDIsIDB4MDAsCisJIDB4MDAsIDB4NjcsIDB4MEEsIDB4RkIsIDB4RDUsIDB4MDEsIDB4RDQsIDB4MDEsIDB4QUIsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RDEsIDB4MDEsIDB4NzksIDB4NjMsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4MUYsIDB4QTksIDB4RkYsIDB4NzcsIDB4NDQsIDB4NjAsIDB4NTcsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4NDAsIDB4NEEsCisJIDB4MDEsIDB4MkEsIDB4MUMsIDB4MDAsIDB4MjQsIDB4NDQsIDB4QUMsIDB4ODYsIDB4MDgsIDB4RjIsIDB4MTgsIDB4MDMsIDB4MUIsIDB4NjAsIDB4QkUsIDB4NjUsCisJIDB4RDQsIDB4ODAsIDB4MEUsIDB4RjIsIDB4MDIsIDB4MDMsIDB4QTUsIDB4RDUsIDB4MDQsIDB4MDAsIDB4MDEsIDB4QkMsIDB4MEUsIDB4RkEsIDB4MDksIDB4RjQsCisJIDB4RDEsIDB4RkUsIDB4NDYsIDB4NDQsIDB4MEIsIDB4MTgsIDB4NjYsIDB4NDQsIDB4MTAsIDB4RkIsIDB4NjYsIDB4NDcsIDB4MjAsIDB4QkYsIDB4M0IsIDB4NDIsCisJIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MEUsIDB4RjIsIDB4MDEsIDB4NzUsIDB4MTAsIDB4QkMsIDB4MEUsIDB4RkEsIDB4MkEsIDB4NDQsIDB4MDgsIDB4MkEsCisJIDB4MTgsIDB4MDAsIDB4MjMsIDB4NDQsIDB4MDAsIDB4QTgsIDB4NUMsIDB4NDMsIDB4MTQsIDB4MDMsIDB4MUIsIDB4NjAsIDB4QjgsIDB4NjIsIDB4QTIsIDB4RDUsCisJIDB4MDEsIDB4MDAsIDB4MDksIDB4RjQsIDB4MEUsIDB4RjIsIDB4MEQsIDB4MTgsIDB4MDgsIDB4QjAsIDB4MTgsIDB4QUMsIDB4RkEsIDB4MDMsIDB4MEUsIDB4RkEsCisJIDB4NjYsIDB4NDMsIDB4MTEsIDB4RkQsIDB4NDYsIDB4NDMsIDB4MjMsIDB4NDcsIDB4ODAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsCisJIDB4MDgsIDB4NzUsIDB4MkEsIDB4NDQsIDB4MDYsIDB4MjIsIDB4MkQsIDB4MDAsIDB4MjIsIDB4NDQsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MEUsIDB4RjIsCisJIDB4MjgsIDB4MDMsIDB4MTAsIDB4QjAsIDB4MDEsIDB4QkMsIDB4MDMsIDB4MDIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDIsIDB4MjIsIDB4MDAsIDB4MEUsIDB4RkEsCisJIDB4RDEsIDB4RkUsIDB4MUIsIDB4NjAsIDB4QjIsIDB4NjQsIDB4NDAsIDB4NDcsIDB4NTgsIDB4NEYsIDB4ODAsIDB4MDAsIDB4NDYsIDB4NDIsIDB4MTksIDB4MDIsCisJIDB4MjIsIDB4NDcsIDB4NDAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MjMsIDB4RjIsIDB4NjYsIDB4NDMsIDB4MDAsIDB4QTgsCisJIDB4MEUsIDB4RjIsIDB4MDgsIDB4MDIsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4RTQsIDB4MDEsIDB4MTIsIDB4RkQsIDB4MTAsIDB4NjQsIDB4MEUsIDB4RkEsCisJIDB4MDIsIDB4NzUsIDB4MDcsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MkEsIDB4REMsIDB4MDEsIDB4MTIsIDB4RkQsIDB4MTAsIDB4NjQsIDB4MEUsIDB4RkEsCisJIDB4MDQsIDB4NzUsIDB4MkEsIDB4NDQsIDB4ODAsIDB4MkEsIDB4MTksIDB4MDAsIDB4MjEsIDB4NDQsIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsIDB4MTUsIDB4MDMsCisJIDB4MDEsIDB4QkMsIDB4MEUsIDB4RkEsIDB4RDEsIDB4RkUsIDB4MUIsIDB4NjAsIDB4Q0EsIDB4NjQsIDB4NDAsIDB4NDcsIDB4NTgsIDB4NEYsIDB4NTYsIDB4MDAsCisJIDB4NDYsIDB4NDEsIDB4MEIsIDB4MDIsIDB4MjEsIDB4NDcsIDB4MTAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MEUsIDB4RjIsCisJIDB4NjYsIDB4NDMsIDB4MDgsIDB4RkQsIDB4MTAsIDB4QkMsIDB4MEUsIDB4RkEsIDB4ODAsIDB4NzUsIDB4MkEsIDB4NDQsIDB4MTAsIDB4QjAsIDB4MjAsIDB4NDQsCisJIDB4MTUsIDB4MDMsIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDAsIDB4MTIsIDB4NjAsIDB4QzgsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjAsIDB4QjAsCisJIDB4ODAsIDB4QjAsIDB4MDksIDB4MDMsIDB4MDgsIDB4MDMsIDB4NDAsIDB4QkMsIDB4N0YsIDB4QjQsIDB4MDQsIDB4QjAsIDB4QTMsIDB4REIsIDB4MDMsIDB4MDMsCisJIDB4MjAsIDB4NDQsIDB4ODAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4QjEsIDB4NjAsIDB4OTAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QjEsIDB4NjAsIDB4QzAsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RTgsIDB4RkUsIDB4MTQsIDB4MDUsIDB4RUEsIDB4RkUsIDB4MjQsIDB4MDUsIDB4RTksIDB4RkUsIDB4MUMsIDB4MDUsIDB4RTcsIDB4RkUsCisJIDB4MDksIDB4MDUsIDB4NDcsIDB4RkYsIDB4MjAsIDB4NDQsIDB4MEYsIDB4MjIsIDB4MDMsIDB4MDAsIDB4Q0MsIDB4ODQsIDB4NDAsIDB4NDAsIDB4MEYsIDB4MjIsCisJIDB4QjgsIDB4RkUsIDB4RUMsIDB4MDEsIDB4MjMsIDB4NDEsIDB4MDAsIDB4QjksIDB4NUMsIDB4NEEsIDB4RTgsIDB4MDIsIDB4NkUsIDB4MDEsIDB4MjQsIDB4NDEsCisJIDB4MDAsIDB4QjksIDB4MUIsIDB4NjAsIDB4QkUsIDB4NjUsIDB4NDUsIDB4NDcsIDB4RTEsIDB4MDIsIDB4NTgsIDB4NEYsIDB4MEYsIDB4MDAsIDB4REUsIDB4MDIsCisJIDB4NUMsIDB4NEEsIDB4NDYsIDB4NDQsIDB4NTAsIDB4MDEsIDB4MjIsIDB4NDEsIDB4MDAsIDB4QjksIDB4NUMsIDB4NEEsIDB4MDgsIDB4MjQsIDB4ODEsIDB4MDEsCisJIDB4RDUsIDB4MDEsIDB4MjEsIDB4NDEsIDB4MDAsIDB4QjksIDB4NUMsIDB4NEEsIDB4QTYsIDB4MDMsIDB4RDAsIDB4MDEsIDB4MjcsIDB4RDMsIDB4MDMsIDB4MDAsCisJIDB4MTAsIDB4QjAsIDB4MDksIDB4RjIsIDB4MDQsIDB4MDMsIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsIDB4RkEsIDB4MDIsIDB4MDgsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MEUsIDB4RjMsIDB4MEYsIDB4NjAsIDB4RkUsIDB4NjUsIDB4MEMsIDB4RjMsIDB4MjQsIDB4ODYsIDB4MjQsIDB4NDYsIDB4NjAsIDB4NDAsCisJIDB4RkIsIDB4M0IsIDB4MDcsIDB4MDAsIDB4ODAsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MDMsIDB4NEMsIDB4NDYsIDB4NjEsIDB4M0EsIDB4NjUsCisJIDB4MEMsIDB4MDAsIDB4MkUsIDB4RjMsIDB4NDAsIDB4NDUsIDB4RjgsIDB4MkIsIDB4MDIsIDB4MDAsIDB4NDAsIDB4NDUsIDB4MDMsIDB4MDAsIDB4NTgsIDB4NEYsCisJIDB4MzksIDB4MDAsIDB4MDcsIDB4MDIsIDB4NTgsIDB4NEYsIDB4NDUsIDB4MDAsIDB4MDQsIDB4MDUsIDB4NjYsIDB4NTAsIDB4NjUsIDB4NTIsIDB4NjEsIDB4NTEsCisJIDB4MDksIDB4MDAsIDB4MjYsIDB4NDcsIDB4MDAsIDB4QkYsIDB4MEUsIDB4RkIsIDB4MkUsIDB4RjUsIDB4MDUsIDB4RjAsIDB4ODAsIDB4NjAsIDB4NjQsIDB4NTAsCisJIDB4MDAsIDB4NzIsIDB4N0UsIDB4NzEsIDB4QUMsIDB4RkYsIDB4QjEsIDB4NjAsIDB4QzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OEUsIDB4RkYsIDB4MEYsIDB4RjMsCisJIDB4MEYsIDB4NjAsIDB4RkUsIDB4NjUsIDB4MjQsIDB4ODYsIDB4MEQsIDB4RjMsIDB4MkUsIDB4RjMsIDB4NDAsIDB4NDUsIDB4RjgsIDB4MkIsIDB4MDIsIDB4MDAsCisJIDB4NDAsIDB4NDUsIDB4MDMsIDB4MDAsIDB4NTgsIDB4NEYsIDB4MTYsIDB4MDAsIDB4MDcsIDB4MDIsIDB4NTgsIDB4NEYsIDB4MjIsIDB4MDAsIDB4MDQsIDB4MDUsCisJIDB4NjYsIDB4NTAsIDB4NjUsIDB4NTIsIDB4NjEsIDB4NTEsIDB4MDksIDB4MDAsIDB4MjYsIDB4NDcsIDB4MDAsIDB4QkYsIDB4MEYsIDB4RkIsIDB4MkUsIDB4RjUsCisJIDB4MDUsIDB4RjAsIDB4ODAsIDB4NjAsIDB4NjQsIDB4NTAsIDB4MDAsIDB4NzIsIDB4N0UsIDB4NzEsIDB4OEQsIDB4RkYsIDB4QUQsIDB4RkYsIDB4QjEsIDB4NjAsCisJIDB4QzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDQsIDB4OEEsIDB4RjEsIDB4OEIsIDB4RjEsIDB4RDAsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDcsIDB4MDQsCisJIDB4MDEsIDB4MDYsIDB4MDUsIDB4MDAsIDB4MjUsIDB4NDYsIDB4MDEsIDB4RjAsIDB4MDMsIDB4NjcsIDB4QTAsIDB4ODUsIDB4OTQsIDB4ODAsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDYsIDB4MjYsIDB4NDEsIDB4NDYsIDB4NjMsIDB4MDEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QjUsIDB4RDUsIDB4ODEsCisJIDB4MDAsIDB4RjIsIDB4MDUsIDB4MDQsIDB4MDQsIDB4NjMsIDB4NjAsIDB4NDYsIDB4RjcsIDB4MUIsIDB4NDIsIDB4RkUsIDB4MEQsIDB4MDAsIDB4NjEsIDB4NDQsCisJIDB4QzUsIDB4ODEsIDB4NjMsIDB4NDUsIDB4QzUsIDB4ODEsIDB4OUMsIDB4ODQsIDB4REMsIDB4ODQsIDB4MDEsIDB4RjIsIDB4RjAsIDB4ODUsIDB4RjAsIDB4ODAsCisJIDB4NjUsIDB4NDQsIDB4RjgsIDB4ODUsIDB4RkYsIDB4RkYsIDB4MDIsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MUIsIDB4NjAsCisJIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsIDB4MDcsIDB4MDMsIDB4MDAsIDB4QTgsIDB4MDksIDB4RjIsCisJIDB4RkEsIDB4MDIsIDB4MDEsIDB4NjcsIDB4MEUsIDB4RkEsIDB4MDgsIDB4RkUsIDB4MTcsIDB4MDAsIDB4OEMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4QTAsCisJIDB4MDAsIDB4QjQsIDB4MTIsIDB4MDYsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjEsIDB4NDEsIDB4NEEsIDB4N0MsIDB4QTEsIDB4MEUsIDB4QTEsIDB4QTIsIDB4RkYsCisJIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsIDB4MDYsIDB4MDMsIDB4MkEsIDB4NDMsIDB4QjMsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4QjgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDEsIDB4NEEsCisJIDB4N0MsIDB4QTEsIDB4MEUsIDB4QTEsIDB4QTIsIDB4RkYsIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsCisJIDB4MkEsIDB4NDMsIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QjgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4RkUsIDB4MEQsIDB4MDAsIDB4MUIsIDB4NjAsCisJIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsIDB4MDYsIDB4MDMsIDB4MDAsIDB4QTgsIDB4MDksIDB4RjIsCisJIDB4RkEsIDB4MDIsIDB4MDEsIDB4NjcsIDB4MEUsIDB4RkEsIDB4MDgsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4OEQsIDB4RjMsCisJIDB4N0MsIDB4NjMsIDB4MDAsIDB4QkUsIDB4NDAsIDB4NDUsIDB4MUEsIDB4MDMsIDB4MDAsIDB4NjUsIDB4NjUsIDB4NDQsIDB4REMsIDB4ODUsIDB4ODQsIDB4QTEsCisJIDB4MDAsIDB4RjIsIDB4MDYsIDB4MDYsIDB4MDEsIDB4RkMsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4RjcsIDB4MDIsIDB4NDAsIDB4NDUsIDB4MEUsIDB4MDAsCisJIDB4OEMsIDB4RjMsIDB4MDAsIDB4NjMsIDB4RDQsIDB4ODQsIDB4OEMsIDB4RkIsIDB4ODAsIDB4NjAsIDB4N0MsIDB4NjQsIDB4MDEsIDB4RkEsIDB4MDAsIDB4RjAsCisJIDB4MDAsIDB4RkMsIDB4RDMsIDB4ODAsIDB4OEQsIDB4RjksIDB4MDIsIDB4MDIsIDB4OEUsIDB4RjksIDB4MDgsIDB4RkUsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4NjYsIDB4NDQsIDB4MjUsIDB4NDYsIDB4MDUsIDB4RkEsIDB4MDYsIDB4RkEsIDB4MDEsIDB4RjAsIDB4MDMsIDB4NjcsIDB4MDIsIDB4RkMsIDB4QjAsIDB4ODQsCisJIDB4M0EsIDB4N0UsIDB4MDEsIDB4RkEsIDB4MTIsIDB4NjQsIDB4MDMsIDB4RkEsIDB4MDAsIDB4RjAsIDB4MDQsIDB4RjgsIDB4MDAsIDB4NjQsIDB4MEMsIDB4NjEsCisJIDB4MTAsIDB4NjMsIDB4NTksIDB4REEsIDB4RkUsIDB4MUYsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDMsIDB4RTMsIDB4ODEsIDB4RTksIDB4ODEsCisJIDB4MDMsIDB4MDUsIDB4MTYsIDB4MDMsIDB4MDAsIDB4NjEsIDB4MDEsIDB4MDAsIDB4RTQsIDB4NjMsIDB4NjEsIDB4NDYsIDB4QkYsIDB4RDIsIDB4MjcsIDB4NDUsCisJIDB4REMsIDB4ODQsIDB4QTIsIDB4REEsIDB4QkUsIDB4RDIsIDB4MjUsIDB4NDYsIDB4ODgsIDB4RjgsIDB4MDQsIDB4MUIsIDB4MjUsIDB4NDQsIDB4NjEsIDB4NDYsCisJIDB4QTMsIDB4REEsIDB4MDQsIDB4MDAsIDB4MEEsIDB4RkEsIDB4NjAsIDB4NDYsIDB4MjUsIDB4NDQsIDB4MDksIDB4RkEsIDB4NjEsIDB4NDYsIDB4QkUsIDB4REEsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDQsIDB4MDAsIDB4QTgsIDB4MDcsIDB4NEIsIDB4MEMsIDB4MDMsIDB4NTgsIDB4NEYsIDB4MzMsIDB4MDAsCisJIDB4MEIsIDB4NDcsIDB4MUIsIDB4NjAsIDB4QzQsIDB4NjUsIDB4MjcsIDB4NDQsIDB4RDQsIDB4ODAsIDB4MDAsIDB4NjQsIDB4MDEsIDB4MDIsIDB4MEYsIDB4RkEsCisJIDB4NTgsIDB4NEYsIDB4RDMsIDB4MDEsIDB4NzAsIDB4MDAsIDB4MjUsIDB4NDMsIDB4RTMsIDB4ODQsIDB4N0MsIDB4NDEsIDB4MDIsIDB4MDQsIDB4RTgsIDB4ODEsCisJIDB4RTQsIDB4NjMsIDB4NjEsIDB4NDYsIDB4QTMsIDB4RDIsIDB4MDAsIDB4N0MsIDB4NDAsIDB4NDUsIDB4QkYsIDB4RDgsIDB4QTMsIDB4RDgsIDB4QkUsIDB4RDgsCisJIDB4MjcsIDB4NDIsIDB4NUEsIDB4RDMsIDB4MjUsIDB4NUMsIDB4NjAsIDB4NDEsIDB4MDIsIDB4MUIsIDB4MjcsIDB4RDksIDB4MDUsIDB4MDAsIDB4MjUsIDB4NDYsCisJIDB4MEEsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MjUsIDB4NDQsIDB4MDksIDB4RkEsIDB4MjUsIDB4NDQsIDB4MjcsIDB4NDMsIDB4MDAsIDB4NjEsIDB4NjAsIDB4NDYsCisJIDB4MDksIDB4RjIsIDB4MDgsIDB4RkMsIDB4MDAsIDB4QTgsIDB4REQsIDB4ODEsIDB4RkEsIDB4MDIsIDB4QkYsIDB4RDEsIDB4NjYsIDB4NDQsIDB4QkUsIDB4REIsCisJIDB4QzEsIDB4ODQsIDB4QkYsIDB4REIsIDB4NDgsIDB4MDAsIDB4MjUsIDB4NDYsIDB4RTQsIDB4NjMsIDB4MDgsIDB4RjIsIDB4ODksIDB4RjIsIDB4MUUsIDB4MTgsCisJIDB4NDAsIDB4NDcsIDB4RTAsIDB4ODQsIDB4RTgsIDB4ODUsIDB4MDIsIDB4MDUsIDB4RTgsIDB4ODMsIDB4MDAsIDB4NjUsIDB4NjUsIDB4NDYsIDB4QkYsIDB4RDIsCisJIDB4NjEsIDB4NUMsIDB4Q0MsIDB4ODQsIDB4QTIsIDB4REEsIDB4MjUsIDB4NDYsIDB4MEEsIDB4RjIsIDB4MDAsIDB4QjksIDB4NjUsIDB4NDYsIDB4MDgsIDB4MjQsCisJIDB4QkUsIDB4REEsIDB4MDIsIDB4MUIsIDB4QTMsIDB4RDgsIDB4MDIsIDB4MDAsIDB4NjAsIDB4NDYsIDB4ODksIDB4RkEsIDB4MDAsIDB4QjksIDB4NjEsIDB4NDYsCisJIDB4MDgsIDB4MjgsIDB4MEEsIDB4RkEsIDB4MjUsIDB4NDYsIDB4ODksIDB4RkMsIDB4OEEsIDB4RkMsIDB4ODgsIDB4RkMsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjEsIDB4MjgsIDB4NjUsIDB4MjUsIDB4NDMsIDB4OEUsIDB4RjMsIDB4QUYsIDB4ODMsIDB4MDAsIDB4QkUsIDB4MTgsIDB4MDMsIDB4MDIsIDB4MDMsCisJIDB4MDAsIDB4RkMsIDB4MDEsIDB4MDAsIDB4OEQsIDB4RkQsIDB4NjMsIDB4NDYsIDB4NjUsIDB4NDQsIDB4Q0MsIDB4ODUsIDB4MDAsIDB4RjIsIDB4MDcsIDB4MDIsCisJIDB4OEUsIDB4RjUsIDB4MDAsIDB4NjQsIDB4MDAsIDB4RkEsIDB4REUsIDB4NjAsIDB4QUYsIDB4NjQsIDB4MDksIDB4RkIsIDB4MDgsIDB4MDAsIDB4NjYsIDB4NDMsCisJIDB4MDAsIDB4QkUsIDB4REQsIDB4ODEsIDB4RjEsIDB4MDIsIDB4OEMsIDB4RjEsIDB4OEUsIDB4RkQsIDB4QzEsIDB4ODQsIDB4OEMsIDB4RkIsIDB4MkUsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDUsIDB4MjksIDB4NDMsIDB4RkMsIDB4QTMsIDB4NjYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjUsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MDAsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDMsIDB4NjEsIDB4MEUsIDB4NjUsIDB4MUIsIDB4NjAsIDB4RDgsIDB4NjMsIDB4NDMsIDB4NDksCisJIDB4QTMsIDB4RDMsIDB4MDYsIDB4QTMsIDB4MDAsIDB4QTgsIDB4Q0QsIDB4ODEsIDB4MDQsIDB4MDIsIDB4RjksIDB4MDIsIDB4QjEsIDB4NjAsIDB4QzAsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MjYsIDB4RTYsIDB4MDEsIDB4RDQsIDB4ODAsIDB4NjAsIDB4NDUsIDB4RTMsIDB4MDUsIDB4RjYsIDB4QTMsIDB4QkQsIDB4RDEsCisJIDB4QkQsIDB4RDEsIDB4NDQsIDB4NDcsIDB4NDQsIDB4NDgsIDB4NDQsIDB4NDUsIDB4MUMsIDB4NjAsIDB4MTYsIDB4NjQsIDB4NDQsIDB4RDcsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4NDgsIDB4RkUsIDB4OEQsIDB4RjUsIDB4OEMsIDB4RjMsIDB4MEQsIDB4MTgsIDB4Q0MsIDB4ODQsIDB4OEMsIDB4RkIsIDB4ODAsIDB4NjAsCisJIDB4N0MsIDB4NjQsIDB4MDEsIDB4RkEsIDB4MDAsIDB4NjQsIDB4MDAsIDB4RjAsIDB4MDAsIDB4RkEsIDB4RDAsIDB4ODAsIDB4OEQsIDB4RjksIDB4MDIsIDB4MDIsCisJIDB4OEUsIDB4RjksIDB4MDgsIDB4RkUsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUIsIDB4NjAsIDB4ODgsIDB4NjMsIDB4MEQsIDB4NjUsIDB4MDAsIDB4NjEsCisJIDB4NDEsIDB4NDgsIDB4QTMsIDB4RDMsIDB4MDYsIDB4QTMsIDB4QUMsIDB4ODYsIDB4MDAsIDB4NjEsIDB4MDksIDB4MDMsIDB4MDAsIDB4RjIsIDB4MDksIDB4RjAsCisJIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsIDB4REQsIDB4ODEsIDB4RkMsIDB4MDIsIDB4NjQsIDB4NDQsIDB4QUMsIDB4ODYsIDB4RjYsIDB4MDEsIDB4NjEsIDB4NDQsCisJIDB4MjUsIDB4NDYsIDB4MjcsIDB4REEsIDB4NjUsIDB4NDQsIDB4MjgsIDB4NDUsIDB4NDUsIDB4ODgsIDB4Q0MsIDB4ODUsIDB4NUEsIDB4ODcsIDB4RTksIDB4MDIsCisJIDB4MDAsIDB4NjQsIDB4MjcsIDB4REEsIDB4NUEsIDB4REEsIDB4NUEsIDB4ODcsIDB4ODgsIDB4RjMsIDB4ODcsIDB4RjEsIDB4MDIsIDB4QTQsIDB4NjAsIDB4NDYsCisJIDB4NjAsIDB4NDUsIDB4MDAsIDB4NjEsIDB4MUUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsIDB4MDQsIDB4MDMsIDB4QUMsIDB4ODYsCisJIDB4MDAsIDB4RjIsIDB4REQsIDB4ODEsIDB4RkMsIDB4MDIsIDB4NjUsIDB4NDQsIDB4MDIsIDB4QTUsIDB4NjUsIDB4NDYsIDB4NjQsIDB4NDQsIDB4Q0MsIDB4OUMsCisJIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDIsIDB4NjEsIDB4NDQsIDB4MjUsIDB4NDYsIDB4MjcsIDB4REEsIDB4NUEsIDB4ODcsIDB4MjgsIDB4NDUsIDB4NDUsIDB4ODgsCisJIDB4ODgsIDB4RjMsIDB4ODcsIDB4RjEsIDB4MDIsIDB4QTQsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDUsIDB4MDAsIDB4NjEsIDB4NzIsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsIDB4MDksIDB4MDMsIDB4MDAsIDB4RjIsIDB4MDksIDB4RjAsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsIDB4REQsIDB4ODEsCisJIDB4RkMsIDB4MDIsIDB4NjQsIDB4NDQsIDB4QUMsIDB4ODYsIDB4RjYsIDB4MDEsIDB4NjUsIDB4NDQsIDB4MDIsIDB4QTUsIDB4NjUsIDB4NDYsIDB4NjQsIDB4NDQsCisJIDB4Q0MsIDB4OUMsIDB4NjEsIDB4NDQsIDB4RUIsIDB4MDIsIDB4MjUsIDB4NDYsIDB4MjcsIDB4REEsIDB4NUEsIDB4ODcsIDB4MjgsIDB4NDUsIDB4NDUsIDB4ODgsCisJIDB4MDYsIDB4NjAsIDB4NDAsIDB4NjUsIDB4OEQsIDB4RjMsIDB4MDEsIDB4NjEsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsIDB4MDMsIDB4MDMsIDB4RDUsIDB4ODAsCisJIDB4REQsIDB4ODEsIDB4RkEsIDB4MDQsIDB4Q0QsIDB4ODQsIDB4MjUsIDB4NDYsIDB4MjcsIDB4REEsIDB4MjgsIDB4NDUsIDB4QzQsIDB4ODQsIDB4NUEsIDB4REEsCisJIDB4REEsIDB4ODEsIDB4OEMsIDB4RjEsIDB4NTksIDB4RDgsIDB4MUIsIDB4NjAsIDB4ODYsIDB4NjQsIDB4MTgsIDB4NjMsIDB4QTAsIDB4RDEsIDB4MDYsIDB4QTQsCisJIDB4NTksIDB4RDgsIDB4RkMsIDB4MUYsIDB4MDAsIDB4NjQsIDB4NTksIDB4REEsIDB4NTksIDB4REEsIDB4MDEsIDB4NjAsIDB4MUMsIDB4NjQsIDB4MEEsIDB4NjMsCisJIDB4NTgsIDB4RDEsIDB4NTksIDB4RDgsIDB4RkQsIDB4MUYsIDB4N0UsIDB4RjEsIDB4NTksIDB4RDgsIDB4NDUsIDB4MDEsIDB4MDcsIDB4NEIsIDB4QjQsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4MjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4NDcsIDB4NTgsIDB4NEYsIDB4MjEsIDB4MDAsIDB4M0MsIDB4MDEsIDB4MDcsIDB4NEIsCisJIDB4QjQsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4NDcsIDB4MjcsIDB4NDQsIDB4MDAsIDB4QkUsIDB4MDgsIDB4RjAsCisJIDB4MTUsIDB4MDMsIDB4NjQsIDB4NDIsIDB4NEEsIDB4RDMsIDB4MDksIDB4RjIsIDB4REMsIDB4ODMsIDB4QTIsIDB4REQsIDB4MjUsIDB4NDMsIDB4MDksIDB4RkMsCisJIDB4NjMsIDB4NDYsIDB4MjcsIDB4NDMsIDB4MEEsIDB4RkMsIDB4MDksIDB4RkEsIDB4MDgsIDB4RjgsIDB4MDAsIDB4QTgsIDB4NjYsIDB4NDMsIDB4MDMsIDB4MDIsCisJIDB4NjQsIDB4NDQsIDB4NTgsIDB4REQsIDB4MDMsIDB4MDAsIDB4NjAsIDB4NDYsIDB4MjUsIDB4NDQsIDB4MEEsIDB4RkEsIDB4MUMsIDB4MDEsIDB4MjcsIDB4NDMsCisJIDB4RTMsIDB4ODEsIDB4RTksIDB4ODEsIDB4MDMsIDB4MDUsIDB4MTYsIDB4MDMsIDB4MDAsIDB4NjEsIDB4MDEsIDB4MDAsIDB4RTQsIDB4NjMsIDB4NjEsIDB4NDYsCisJIDB4QkYsIDB4RDIsIDB4MjcsIDB4NDUsIDB4REMsIDB4ODQsIDB4QTIsIDB4REEsIDB4QTMsIDB4RDIsIDB4MjUsIDB4NDYsIDB4ODgsIDB4RjgsIDB4MDQsIDB4MUIsCisJIDB4MjUsIDB4NDQsIDB4NjEsIDB4NDYsIDB4QkUsIDB4REEsIDB4MDQsIDB4MDAsIDB4MDksIDB4RkEsIDB4NjAsIDB4NDYsIDB4MjUsIDB4NDQsIDB4MEEsIDB4RkEsCisJIDB4NjEsIDB4NDYsIDB4QTMsIDB4REEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MzAsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MDAsIDB4RTEsIDB4MDMsIDB4MDIsCisJIDB4MjgsIDB4RTIsIDB4NDAsIDB4RkYsIDB4QTEsIDB4RkYsIDB4ODQsIDB4RkYsIDB4QkYsIDB4NjAsIDB4QUQsIDB4NjQsIDB4NDAsIDB4NDIsIDB4QjUsIDB4NjAsCisJIDB4QTIsIDB4NjQsIDB4NDAsIDB4NDAsIDB4OUQsIDB4RjMsIDB4NjYsIDB4RkIsIDB4MEYsIDB4NjAsIDB4OUEsIDB4NjMsIDB4QUEsIDB4RjMsIDB4QkQsIDB4REIsCisJIDB4MDAsIDB4NjAsIDB4OUEsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDIsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDQsIDB4NjQsIDB4QTMsIDB4REIsIDB4NUMsIDB4NDksCisJIDB4MEEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4NUMsIDB4NUMsIDB4MDEsIDB4NjAsIDB4MzksIDB4RTIsIDB4MDQsIDB4NjAsIDB4MDAsIDB4N0EsIDB4ODksIDB4RkYsCisJIDB4MDMsIDB4NjAsIDB4RkYsIDB4NzMsIDB4ODgsIDB4RkYsIDB4QjUsIDB4NjAsIDB4QTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RkUsIDB4MDcsIDB4MDUsCisJIDB4QTMsIDB4RkUsIDB4MDcsIDB4MDUsIDB4QTEsIDB4RkUsIDB4NTAsIDB4MDUsIDB4NjAsIDB4NjQsIDB4M0IsIDB4REIsIDB4MTAsIDB4MDAsIDB4MjAsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4RkEsIDB4MDEsIDB4MTIsIDB4NjAsIDB4Q0MsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RkIsIDB4QjQsIDB4QTMsIDB4REIsCisJIDB4QTAsIDB4NEMsIDB4NTksIDB4QkMsIDB4RkYsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTAsIDB4NEMsIDB4N0QsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTEsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4ODMsIDB4M0UsIDB4NDAsIDB4NjAsIDB4MEIsIDB4NjUsIDB4MkIsIDB4NDQsIDB4MDAsIDB4NjMsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsCisJIDB4MDIsIDB4MjQsIDB4OTQsIDB4ODQsIDB4RjMsIDB4ODMsIDB4Q0QsIDB4ODEsIDB4RkYsIDB4RkYsIDB4RjgsIDB4MDIsIDB4REYsIDB4ODMsIDB4MkYsIDB4NTgsCisJIDB4NDAsIDB4NEIsIDB4MDAsIDB4NjIsIDB4MDEsIDB4NjQsIDB4RDQsIDB4ODAsIDB4RTAsIDB4ODQsIDB4MUEsIDB4MDMsIDB4RDQsIDB4ODAsIDB4RTAsIDB4ODQsCisJIDB4MTUsIDB4MDMsIDB4NjEsIDB4NDQsIDB4MTEsIDB4NjEsIDB4RTAsIDB4ODQsIDB4Q0QsIDB4ODEsIDB4RkQsIDB4MDQsIDB4MDEsIDB4MDAsIDB4RTAsIDB4ODQsCisJIDB4RjIsIDB4ODIsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MjQsIDB4QzYsIDB4ODIsIDB4MDIsIDB4MjgsIDB4RDYsIDB4ODIsIDB4RTIsIDB4ODAsIDB4Q0QsIDB4ODEsCisJIDB4MDIsIDB4MjgsIDB4MDEsIDB4QkMsIDB4RjQsIDB4MDIsIDB4MDEsIDB4MkEsIDB4QzYsIDB4ODIsIDB4MDMsIDB4MDAsIDB4RTksIDB4ODEsIDB4RjIsIDB4ODIsCisJIDB4NjEsIDB4NDQsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4MTAsIDB4NjEsIDB4MDQsIDB4MDMsIDB4RjAsIDB4ODQsIDB4Q0QsIDB4ODEsCisJIDB4RkQsIDB4MDQsIDB4NjEsIDB4NDQsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4M0IsIDB4REIsIDB4MTYsIDB4NjAsIDB4QTgsIDB4NjMsCisJIDB4QkQsIDB4RDMsIDB4QTMsIDB4RDEsIDB4NjAsIDB4NDAsIDB4MDQsIDB4M0EsIDB4MkQsIDB4MDAsIDB4MDAsIDB4NjQsIDB4NEEsIDB4REIsIDB4MUIsIDB4NjAsCisJIDB4ODgsIDB4NjMsIDB4QTMsIDB4RDMsIDB4NDYsIDB4NDMsIDB4QUMsIDB4ODYsIDB4M0MsIDB4NDUsIDB4MjMsIDB4MDMsIDB4RDQsIDB4ODAsIDB4MDcsIDB4RjIsCisJIDB4MDIsIDB4MDIsIDB4MDksIDB4RjIsIDB4RjgsIDB4MDEsIDB4RDAsIDB4ODAsIDB4MDksIDB4RjIsIDB4RjUsIDB4MDIsIDB4NjAsIDB4NDMsIDB4ODAsIDB4NjcsCisJIDB4QjAsIDB4ODEsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4NjEsIDB4NDQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjUsIDB4MEUsIDB4RjIsIDB4MDIsIDB4RjIsIDB4NjAsIDB4NDAsCisJIDB4RjAsIDB4MzcsIDB4MDUsIDB4MDAsIDB4OTAsIDB4RjMsIDB4RDQsIDB4ODAsIDB4Q0MsIDB4ODQsIDB4MDEsIDB4MDIsIDB4OTAsIDB4RkIsIDB4NjMsIDB4NDQsCisJIDB4REEsIDB4MDEsIDB4MjMsIDB4NDYsIDB4M0MsIDB4NDQsIDB4QUMsIDB4ODAsIDB4RkYsIDB4RkYsIDB4ODksIDB4MDIsIDB4NkEsIDB4RjMsIDB4NkIsIDB4RjMsCisJIDB4MDIsIDB4QTgsIDB4MDIsIDB4QTgsIDB4MDgsIDB4MDIsIDB4MDAsIDB4NjQsIDB4NkMsIDB4RkIsIDB4NkEsIDB4RkIsIDB4NkIsIDB4RkIsIDB4MDAsIDB4NjQsCisJIDB4NkQsIDB4RkIsIDB4Q0EsIDB4RkUsIDB4OTcsIDB4MDAsIDB4MDMsIDB4MDIsIDB4MDAsIDB4NjQsIDB4NkIsIDB4RkIsIDB4Q0EsIDB4RkUsIDB4MDEsIDB4NjQsCisJIDB4M0IsIDB4REIsIDB4MUIsIDB4NjAsIDB4OEUsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MzUsIDB4MDMsCisJIDB4MkMsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4OEEsIDB4MDAsIDB4MkUsIDB4RjIsIDB4MTIsIDB4NjAsIDB4Q0UsIDB4NjUsCisJIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsCisJIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MkUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsCisJIDB4MkQsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MkMsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODgsIDB4RjMsCisJIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4NjMsIDB4MDIsIDB4NjYsIDB4NDUsIDB4NjMsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NjUsIDB4NDYsCisJIDB4ODAsIDB4QjAsIDB4MDksIDB4RjIsIDB4NUMsIDB4MDMsIDB4QUMsIDB4ODYsIDB4Q0EsIDB4MDEsIDB4NkIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QTgsCisJIDB4RkYsIDB4RkYsIDB4NTAsIDB4MDIsIDB4MUIsIDB4NjAsIDB4QTAsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsCisJIDB4MEYsIDB4MDMsIDB4NzcsIDB4RjEsIDB4MDcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4MDksIDB4RjIsIDB4MDMsIDB4MDIsIDB4QUMsIDB4ODYsCisJIDB4MDcsIDB4RjIsIDB4RkEsIDB4MDIsIDB4MDMsIDB4MDIsIDB4MDAsIDB4NjQsIDB4NzcsIDB4RkIsIDB4RUMsIDB4MDEsIDB4NDYsIDB4NUMsIDB4M0YsIDB4MDAsCisJIDB4MUIsIDB4NjAsIDB4QTYsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MDEsIDB4MDMsIDB4MzcsIDB4MDIsCisJIDB4NkMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDIsIDB4MUIsIDB4NjAsIDB4OTQsIDB4NjIsIDB4QTIsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MEIsIDB4MDMsIDB4MkEsIDB4RjAsIDB4MjAsIDB4NjcsIDB4MDksIDB4RjIsIDB4QjAsIDB4ODMsCisJIDB4MDAsIDB4QTgsIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDMsIDB4MkEsIDB4RkMsIDB4MDEsIDB4MDAsIDB4NkMsIDB4RkIsIDB4MjAsIDB4MDAsIDB4MDAsIDB4NjQsCisJIDB4NkMsIDB4RkIsIDB4MUIsIDB4NjAsIDB4ODgsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MTIsIDB4MDMsCisJIDB4MkEsIDB4RjAsIDB4MDgsIDB4NjcsIDB4QTAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MTIsIDB4MDMsIDB4NzcsIDB4RjEsIDB4MDcsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4RDAsIDB4ODAsIDB4MDksIDB4RjIsIDB4MDMsIDB4MDIsIDB4QUMsIDB4ODYsIDB4MDcsIDB4RjIsIDB4RkEsIDB4MDIsIDB4MDgsIDB4MDIsIDB4MDAsIDB4NjQsCisJIDB4NzcsIDB4RkIsIDB4RTcsIDB4MDEsIDB4MDAsIDB4NjQsIDB4NzcsIDB4RkIsIDB4QjUsIDB4NjAsIDB4QTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsCisJIDB4RkMsIDB4RkIsIDB4NDYsIDB4NUMsIDB4MjEsIDB4NjAsIDB4OTgsIDB4NjMsIDB4QTMsIDB4RDMsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RTMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEQsIDB4RjIsIDB4NjAsIDB4NUMsIDB4NjQsIDB4NUYsIDB4MEQsIDB4RkEsIDB4MDcsIDB4RjAsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4NzcsIDB4RjksIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkIsIDB4MDUsIDB4MDAsIDB4MDAsIDB4NjQsIDB4NDgsIDB4RkIsIDB4QjgsIDB4NjAsIDB4MkQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4ODgsIDB4RjMsIDB4MDcsIDB4MDIsIDB4MjMsIDB4RjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REEsIDB4QkQsIDB4NjAsIDB4MjgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4QjgsIDB4RjMsIDB4MDMsIDB4MDMsIDB4NjAsIDB4NDAsCisJIDB4MDMsIDB4M0EsIDB4MDAsIDB4MDAsIDB4MkEsIDB4RjIsIDB4MDAsIDB4NjMsIDB4NDAsIDB4NDcsIDB4NTAsIDB4MzYsIDB4MDEsIDB4MDAsIDB4MDEsIDB4NjMsCisJIDB4NDgsIDB4RkQsIDB4NEEsIDB4RjMsIDB4MzUsIDB4RkEsIDB4MTAsIDB4QTQsIDB4NEEsIDB4RkIsIDB4MDAsIDB4NjQsIDB4MTUsIDB4RkEsIDB4MTYsIDB4RkEsCisJIDB4MEYsIDB4RkEsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4MEUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4MDAsIDB4N0YsCisJIDB4NjQsIDB4NUUsIDB4NEIsIDB4RkIsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0UsIDB4QkIsIDB4RkIsIDB4MDcsIDB4RjAsIDB4ODgsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4QkIsIDB4RjMsIDB4QkEsIDB4RkIsIDB4NjAsIDB4NDEsIDB4MDMsIDB4RjIsIDB4MDAsIDB4RjQsCisJIDB4MDEsIDB4RjIsIDB4RkMsIDB4QTUsIDB4MDAsIDB4N0YsIDB4RDQsIDB4ODQsIDB4MjcsIDB4NDUsIDB4M0MsIDB4NDYsIDB4MUEsIDB4RkEsIDB4MjIsIDB4NjMsCisJIDB4N0IsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTQsIDB4ODQsIDB4MDMsIDB4MkIsIDB4MUMsIDB4NjMsIDB4MkEsIDB4RkEsIDB4NjAsIDB4NDAsIDB4QTQsIDB4MzYsCisJIDB4MTQsIDB4NjMsIDB4NDMsIDB4NEMsIDB4MDAsIDB4N0MsIDB4MjIsIDB4RjgsIDB4NjQsIDB4NDEsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsCisJIDB4MzYsIDB4RjIsIDB4NjMsIDB4NDYsIDB4RkYsIDB4QjQsIDB4MjIsIDB4RkEsIDB4NjAsIDB4NDAsIDB4MDAsIDB4MzYsIDB4OEUsIDB4MDAsIDB4MkEsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4M0EsIDB4ODksIDB4MDAsIDB4MDMsIDB4RjIsIDB4MDAsIDB4RjQsIDB4QTAsIDB4RDIsIDB4QUEsIDB4NjAsCisJIDB4QUEsIDB4NjUsIDB4NUEsIDB4RDAsIDB4RDQsIDB4ODAsIDB4MDMsIDB4NjQsIDB4MEEsIDB4MDIsIDB4RDAsIDB4ODAsIDB4MDAsIDB4NjQsIDB4NUEsIDB4RDAsCisJIDB4MDYsIDB4MDIsIDB4RDAsIDB4ODAsIDB4RjgsIDB4N0YsIDB4RDAsIDB4ODAsIDB4MDEsIDB4MDMsIDB4MDEsIDB4MDIsIDB4MDEsIDB4NjEsIDB4NjIsIDB4NDMsCisJIDB4NDYsIDB4NDMsIDB4M0MsIDB4NDYsIDB4MDcsIDB4RjQsIDB4MzYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4QTMsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MjIsIDB4MjYsCisJIDB4NDUsIDB4MDAsIDB4NjAsIDB4NDUsIDB4NjMsIDB4NDIsIDB4NUEsIDB4RDAsIDB4Q0QsIDB4ODEsIDB4M0MsIDB4NDYsIDB4MTQsIDB4MDIsIDB4NjQsIDB4NDQsCisJIDB4ODgsIDB4M0EsIDB4MTEsIDB4MDAsIDB4OEUsIDB4M0IsIDB4MEYsIDB4MDAsIDB4NjUsIDB4NDQsIDB4MDEsIDB4MjYsIDB4NUUsIDB4MDAsIDB4MDQsIDB4MjYsCisJIDB4MDMsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MDEsIDB4MDAsIDB4MkQsIDB4MDAsIDB4QTMsIDB4NDYsIDB4MzcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4ODAsIDB4MkIsIDB4NTMsIDB4MDAsIDB4M0EsIDB4MDAsIDB4QTMsIDB4NDYsIDB4NjUsIDB4NDQsIDB4MDEsIDB4MjYsIDB4MEIsIDB4MDAsIDB4MDQsIDB4MjYsCisJIDB4MDMsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MDEsIDB4MDAsIDB4MUQsIDB4MDAsIDB4MzcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MjcsCisJIDB4MkMsIDB4MDAsIDB4MTcsIDB4MDAsIDB4ODgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4MzYsIDB4RjIsIDB4NjYsIDB4NDMsIDB4RkYsIDB4QjQsCisJIDB4M0MsIDB4NDYsIDB4MjIsIDB4RjAsIDB4NjAsIDB4NDcsIDB4QjAsIDB4ODQsIDB4MjIsIDB4RkEsIDB4NjMsIDB4NDYsIDB4MzcsIDB4RjAsIDB4NjAsIDB4NDAsCisJIDB4MDQsIDB4MjcsIDB4MDMsIDB4MDAsIDB4MTAsIDB4MjcsIDB4MDEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NjQsIDB4NDAsIDB4ODAsIDB4MjcsIDB4MTUsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4M0MsIDB4NDYsIDB4MDIsIDB4NjUsIDB4QkMsIDB4NjAsIDB4NTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0QsIDB4ODEsIDB4NjMsIDB4NDIsCisJIDB4NUEsIDB4RDAsIDB4M0MsIDB4NDYsIDB4MEEsIDB4MDIsIDB4NjQsIDB4NDQsIDB4ODgsIDB4M0EsIDB4MDcsIDB4MDAsIDB4NzcsIDB4MzcsIDB4MUQsIDB4MDAsCisJIDB4NzgsIDB4MzcsIDB4MUIsIDB4MDAsIDB4OEUsIDB4MzcsIDB4MTksIDB4MDAsIDB4RjEsIDB4MDEsIDB4M0MsIDB4NDYsIDB4MjIsIDB4RjAsIDB4ODAsIDB4NjcsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjIsIDB4M0UsIDB4RjAsIDB4MDgsIDB4QTQsIDB4NjAsIDB4NDEsIDB4MjIsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDQsIDB4MkIsCisJIDB4MDQsIDB4MDAsIDB4NjEsIDB4NDQsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MjYsIDB4M0YsIDB4RkEsIDB4M0MsIDB4NDYsIDB4MkMsIDB4RjIsIDB4MjcsIDB4NDAsCisJIDB4MDEsIDB4MjcsIDB4MzIsIDB4RjIsIDB4QjUsIDB4RjEsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4NTMsIDB4MDAsIDB4MDksIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4RDAsIDB4ODAsIDB4M0YsIDB4RjIsIDB4MDksIDB4MDYsIDB4MkMsIDB4NDUsIDB4QzQsIDB4ODQsIDB4RDAsIDB4ODAsIDB4NDAsIDB4NEEsIDB4NDAsIDB4MDYsCisJIDB4NjAsIDB4NDMsIDB4NjQsIDB4NDQsIDB4NTQsIDB4ODgsIDB4MTgsIDB4MDAsIDB4NjAsIDB4NDUsIDB4MUYsIDB4NjAsIDB4OUMsIDB4NjQsIDB4QTAsIDB4RDMsCisJIDB4QkIsIDB4RjMsIDB4MDAsIDB4QkMsIDB4NjAsIDB4NDcsIDB4RUMsIDB4QTAsIDB4MzMsIDB4MDMsIDB4MzIsIDB4MDcsIDB4MkMsIDB4NDQsIDB4QzQsIDB4ODEsCisJIDB4MDIsIDB4NjAsIDB4MUMsIDB4NjUsIDB4NDUsIDB4NEEsIDB4RDUsIDB4ODAsIDB4MkMsIDB4NDUsIDB4MkEsIDB4MDYsIDB4MjcsIDB4NDAsIDB4MDQsIDB4MjcsCisJIDB4MzAsIDB4MDAsIDB4MkEsIDB4NDMsIDB4RDcsIDB4ODUsIDB4NDUsIDB4NDgsIDB4QjYsIDB4RjEsIDB4MEYsIDB4RjIsIDB4RDMsIDB4ODAsIDB4MDEsIDB4NjUsCisJIDB4MDEsIDB4MDcsIDB4MDAsIDB4NjUsIDB4QjQsIDB4ODQsIDB4MEYsIDB4RkEsIDB4MDAsIDB4NjMsIDB4M0YsIDB4RjIsIDB4MjgsIDB4NDUsIDB4NjAsIDB4NDEsCisJIDB4RDQsIDB4ODQsIDB4REYsIDB4ODMsIDB4RkMsIDB4MDcsIDB4MTQsIDB4RkMsIDB4NjEsIDB4NDQsIDB4MDEsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MDksIDB4M0EsCisJIDB4MDYsIDB4MDAsIDB4MjgsIDB4NDQsIDB4NDgsIDB4ODgsIDB4MkEsIDB4NDQsIDB4QzgsIDB4ODMsIDB4NDMsIDB4NEEsIDB4RTUsIDB4MDEsIDB4MTcsIDB4RkEsCisJIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MjcsIDB4NDUsIDB4QjQsIDB4ODQsIDB4MkEsIDB4RkEsIDB4MjgsIDB4NDMsIDB4MTYsIDB4RkMsIDB4MEQsIDB4MDAsCisJIDB4M0YsIDB4RjIsIDB4MkMsIDB4NDUsIDB4QjYsIDB4RjEsIDB4QzQsIDB4ODEsIDB4RDEsIDB4ODAsIDB4MEYsIDB4RjIsIDB4MDEsIDB4MDYsIDB4MDEsIDB4QkMsCisJIDB4MEYsIDB4RkEsIDB4M0YsIDB4RjIsIDB4MTcsIDB4RkEsIDB4MDEsIDB4NjQsIDB4MTQsIDB4RkEsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsCisJIDB4MEUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4MDAsIDB4N0YsIDB4NjQsIDB4NUUsIDB4NEIsIDB4RkIsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0UsIDB4QkIsIDB4RkIsCisJIDB4NjIsIDB4RjEsIDB4NjAsIDB4NDMsIDB4NjAsIDB4NDcsIDB4RDAsIDB4ODAsIDB4QzAsIDB4NjUsIDB4MDEsIDB4MDYsIDB4NjQsIDB4NDQsIDB4MEEsIDB4MzYsCisJIDB4NzAsIDB4NjQsIDB4MTQsIDB4MzYsIDB4MzgsIDB4NjQsIDB4MzcsIDB4MzYsIDB4MTUsIDB4NjQsIDB4NkUsIDB4MzYsIDB4MEIsIDB4NjQsIDB4NDQsIDB4ODYsCisJIDB4MkEsIDB4RjIsIDB4MDcsIDB4RjAsIDB4NjAsIDB4NDAsIDB4QjAsIDB4M0EsIDB4MDMsIDB4MDAsIDB4NDAsIDB4M0IsIDB4MDEsIDB4MDAsIDB4MTIsIDB4MDAsCisJIDB4MEMsIDB4QjQsIDB4MDgsIDB4M0EsIDB4NTUsIDB4MDAsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MkIsIDB4NTAsIDB4MDAsCisJIDB4MTcsIDB4RjIsIDB4MjIsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MjIsIDB4MjIsIDB4MDQsIDB4MDAsIDB4MDAsIDB4QTgsIDB4MDEsIDB4QTgsCisJIDB4NDcsIDB4MDMsIDB4NDYsIDB4MDMsIDB4M0MsIDB4NDYsIDB4MkEsIDB4RjAsIDB4NDAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NjAsIDB4NDUsCisJIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MEEsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDQsIDB4MjcsIDB4MDcsIDB4MDAsIDB4NjUsIDB4NDQsIDB4MkEsIDB4NjUsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MkIsIDB4MjQsIDB4NjUsCisJIDB4NDUsIDB4NEMsIDB4MkUsIDB4MDAsIDB4NjUsIDB4NDQsIDB4MkUsIDB4NjUsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MkIsIDB4MjgsIDB4NjUsIDB4NDUsIDB4NEMsCisJIDB4MDcsIDB4RjAsIDB4ODgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4MDAsIDB4N0MsIDB4MDMsIDB4MDMsIDB4NjMsIDB4NDAsIDB4MDEsIDB4MkEsCisJIDB4MDEsIDB4MDAsIDB4M0QsIDB4RjEsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDgsIDB4QjAsIDB4M0UsIDB4RjIsIDB4MTksIDB4MDMsIDB4NjAsIDB4NDcsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MDMsIDB4QjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MTEsIDB4MDMsIDB4MUIsIDB4NjAsCisJIDB4RDQsIDB4NjIsIDB4MUIsIDB4NjAsIDB4QUMsIDB4NjQsIDB4QTIsIDB4REIsIDB4M0MsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4NUMsIDB4NUMsIDB4RkMsIDB4RkMsIDB4Q0UsIDB4RkUsIDB4QjUsIDB4NjAsIDB4RUMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QkIsIDB4RjEsIDB4MkMsIDB4NDUsIDB4NjQsIDB4NDMsIDB4MTcsIDB4RjIsIDB4NEIsIDB4RjEsIDB4QzQsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODEsIDB4NjMsIDB4NDAsIDB4MzcsIDB4MzcsIDB4RTEsIDB4ODEsIDB4NjQsIDB4NDUsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QUUsIDB4ODIsIDB4RkMsIDB4QTIsIDB4MEEsIDB4MDMsIDB4NjMsIDB4NDAsIDB4NkUsIDB4M0IsIDB4MDYsIDB4MDAsIDB4NjAsIDB4NDEsCisJIDB4MDQsIDB4MEQsIDB4NjMsIDB4NDQsIDB4ODAsIDB4N0UsIDB4QkIsIDB4RkIsIDB4NjEsIDB4NDQsIDB4REMsIDB4ODQsIDB4MkIsIDB4RjAsIDB4MUIsIDB4RkEsCisJIDB4NjQsIDB4NDQsIDB4ODAsIDB4MjcsIDB4MzQsIDB4MDAsIDB4MTYsIDB4RjIsIDB4MEYsIDB4RjAsIDB4QUMsIDB4ODQsIDB4MkMsIDB4NDUsIDB4MjksIDB4MDMsCisJIDB4NEIsIDB4RjEsIDB4QzQsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODEsIDB4NjMsIDB4NDAsIDB4MzcsIDB4MzcsIDB4RTEsIDB4ODEsCisJIDB4NjQsIDB4NDUsIDB4MEYsIDB4RjAsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QUUsIDB4ODIsIDB4RkMsIDB4QTIsCisJIDB4MEEsIDB4MDMsIDB4NjMsIDB4NDAsIDB4NkUsIDB4M0IsIDB4MDYsIDB4MDAsIDB4NjAsIDB4NDEsIDB4MDQsIDB4MEQsIDB4ODAsIDB4NjcsIDB4QjAsIDB4ODQsCisJIDB4MEYsIDB4RkEsIDB4NjEsIDB4NDQsIDB4REMsIDB4ODQsIDB4MUQsIDB4RkEsIDB4REUsIDB4NjUsIDB4QzQsIDB4ODUsIDB4MjYsIDB4NDEsIDB4RTEsIDB4ODEsCisJIDB4QzUsIDB4ODQsIDB4MkIsIDB4RkEsIDB4MUIsIDB4RjAsIDB4REUsIDB4NjQsIDB4QzAsIDB4ODUsIDB4MjYsIDB4NDQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODQsCisJIDB4MTAsIDB4RkEsIDB4MjYsIDB4NDQsIDB4MkMsIDB4RjAsIDB4MEEsIDB4QTQsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDAsIDB4NjQsIDB4MTEsIDB4RkEsCisJIDB4QkIsIDB4RjMsIDB4MTMsIDB4RkEsIDB4RkYsIDB4RkYsIDB4MEQsIDB4RjIsIDB4M0UsIDB4RjAsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4NjQsIDB4NDEsCisJIDB4MDEsIDB4QjEsIDB4MDEsIDB4NjMsIDB4MUQsIDB4MDIsIDB4NjAsIDB4NDEsIDB4RkYsIDB4MjIsIDB4MDQsIDB4MDAsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4QjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4OTIsIDB4NjQsIDB4QTAsIDB4REQsIDB4MjEsIDB4NjAsIDB4OTgsIDB4NjIsIDB4QTIsIDB4RDMsCisJIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4MDEsIDB4NjMsIDB4NjEsIDB4NDAsIDB4RkYsIDB4MjIsCisJIDB4MDQsIDB4MDAsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4OTQsIDB4NjQsIDB4QTAsIDB4REQsCisJIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjcsIDB4MDMsIDB4MDAsIDB4QkEsIDB4NjAsIDB4NEEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjIsIDB4RjIsIDB4NDYsIDB4NDMsIDB4NjAsIDB4NDAsIDB4MjIsIDB4MjYsIDB4OEIsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MDQsIDB4MjYsCisJIDB4MEMsIDB4MDAsIDB4QkEsIDB4NjAsIDB4NEEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjcsIDB4MDMsIDB4MDAsIDB4QkEsIDB4NjAsIDB4NEEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4ODgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4MDIsIDB4MDAsIDB4MDcsIDB4RjQsIDB4RkYsIDB4RkYsIDB4QTMsIDB4NDYsCisJIDB4MkEsIDB4RjIsIDB4QTMsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjcsIDB4M0IsIDB4MDAsIDB4ODgsIDB4RjMsIDB4NjYsIDB4NUMsIDB4RDAsIDB4ODAsCisJIDB4MzcsIDB4RjAsIDB4MDgsIDB4MDMsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MTIsIDB4MDAsIDB4RkYsIDB4NjAsIDB4RUYsIDB4NjQsIDB4QTAsIDB4ODQsCisJIDB4MzcsIDB4RkEsIDB4MjQsIDB4MDAsIDB4M0QsIDB4RjMsIDB4MDEsIDB4NjEsIDB4NjAsIDB4NDMsIDB4Q0YsIDB4ODMsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MEQsCisJIDB4RTksIDB4ODEsIDB4QTEsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4OTEsIDB4ODQsIDB4MzcsIDB4RkEsIDB4MTcsIDB4MDAsIDB4NDcsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDQsIDB4RkYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4REMsIDB4ODQsIDB4NDcsIDB4RkEsCisJIDB4NDYsIDB4RjIsIDB4MTYsIDB4MDQsIDB4REMsIDB4ODQsIDB4NDYsIDB4RkEsIDB4NDUsIDB4RjIsIDB4MDgsIDB4MDQsIDB4REMsIDB4ODQsIDB4NDUsIDB4RkEsCisJIDB4MDUsIDB4MDQsIDB4MzcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MzcsIDB4RkEsIDB4MEQsIDB4NjAsIDB4M0UsIDB4NjIsCisJIDB4ODAsIDB4RkYsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4QTIsIDB4REIsIDB4QzQsIDB4NjAsIDB4MDUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODQsIDB4RkYsCisJIDB4MEQsIDB4NjAsIDB4M0UsIDB4NjIsIDB4ODAsIDB4RkYsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4QTIsIDB4REIsIDB4QzQsIDB4NjAsIDB4N0QsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4ODQsIDB4RkYsIDB4ODgsIDB4RjMsIDB4NjYsIDB4NUMsIDB4RDAsIDB4ODAsIDB4MDAsIDB4N0MsIDB4MDcsIDB4MDMsIDB4NjYsIDB4NDMsCisJIDB4M0MsIDB4NDYsIDB4MjIsIDB4RjIsIDB4NjMsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDEsIDB4MDAsIDB4M0MsIDB4RjEsIDB4NDcsIDB4RjAsCisJIDB4NjQsIDB4NDEsIDB4NjQsIDB4NDcsIDB4RkYsIDB4QjQsIDB4NjAsIDB4NUYsIDB4MjAsIDB4QkMsIDB4ODAsIDB4MjYsIDB4ODAsIDB4QUMsIDB4NjAsIDB4NDcsCisJIDB4QTMsIDB4NDYsIDB4M0EsIDB4RkEsIDB4NjQsIDB4NDQsIDB4MjAsIDB4N0YsIDB4MzQsIDB4OTQsIDB4M0IsIDB4RkEsIDB4QTMsIDB4NDYsIDB4NDYsIDB4RjIsCisJIDB4NDUsIDB4RjAsIDB4QTMsIDB4NDYsIDB4M0MsIDB4RkEsIDB4M0QsIDB4RjgsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUEsIDB4MEYsIDB4NjQsIDB4NjAsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4OEEsIDB4MDAsCisJIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjcsIDB4MzUsIDB4MDAsIDB4MkEsIDB4RjIsIDB4MDAsIDB4NjAsIDB4N0MsIDB4NjIsCisJIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MjcsIDB4MDAsIDB4QTIsIDB4RDMsIDB4MDAsIDB4NjEsIDB4NjAsIDB4RkUsIDB4QTAsIDB4RDMsIDB4REUsIDB4ODIsCisJIDB4QTIsIDB4RDEsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4NjQsIDB4NUYsIDB4REMsIDB4ODQsIDB4RjEsIDB4ODEsIDB4QzAsIDB4MkIsIDB4MDQsIDB4MDAsCisJIDB4ODAsIDB4MkEsIDB4MDIsIDB4MDAsIDB4N0YsIDB4QTQsIDB4REMsIDB4ODQsIDB4RkYsIDB4M0IsIDB4MDMsIDB4MDAsIDB4NjAsIDB4NDcsIDB4REMsIDB4ODcsCisJIDB4MDEsIDB4NjEsIDB4QzAsIDB4ODAsIDB4MDAsIDB4MzYsIDB4REMsIDB4ODQsIDB4NEUsIDB4REIsIDB4NjAsIDB4RkUsIDB4REEsIDB4ODIsIDB4QTIsIDB4RDEsCisJIDB4RkYsIDB4RkYsIDB4QzEsIDB4ODQsIDB4RjAsIDB4MjIsIDB4MTAsIDB4QTQsIDB4RjAsIDB4MkEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4N0MsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDMsIDB4NUEsIDB4RDEsCisJIDB4M0EsIDB4RkEsIDB4M0IsIDB4RjgsIDB4NzQsIDB4NjIsIDB4QTIsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4NjQsIDB4NDcsIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDAsIDB4NjAsCisJIDB4ODAsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDEsIDB4NUEsIDB4RDEsIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDQsIDB4RTMsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTQsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4NjQsIDB4NDcsIDB4RTYsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjUsIDB4NDAsCisJIDB4MEQsIDB4M0EsIDB4MUMsIDB4MDAsIDB4NjQsIDB4NDcsIDB4RTgsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTksIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUEsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4NjQsIDB4NDcsIDB4RUMsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsCisJIDB4RUUsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUYsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUEsCisJIDB4NjUsIDB4NDQsIDB4MDIsIDB4QTQsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsCisJIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4MDIsIDB4NjQsIDB4M0IsIDB4REIsIDB4QkQsIDB4NjAsIDB4RUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsCisJIDB4RkMsIDB4RkIsIDB4MDcsIDB4RjAsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4ODgsIDB4RjMsIDB4MTcsIDB4MDMsIDB4RDAsIDB4ODAsIDB4NjYsIDB4NDEsCisJIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4NjEsIDB4NDYsIDB4NkQsIDB4MDMsIDB4NjAsIDB4NDAsIDB4MDAsIDB4MzYsIDB4NkEsIDB4MDAsIDB4NDcsIDB4RjEsCisJIDB4MDcsIDB4RjAsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4MDMsIDB4MTIsIDB4QkIsIDB4NjAsIDB4NEUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RkMsIDB4MEEsIDB4QkMsIDB4NjAsIDB4NDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QkMsIDB4NjAsIDB4NDgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4M0UsIDB4RjIsIDB4NjAsIDB4NDUsIDB4NjAsIDB4NDcsIDB4MDcsIDB4QjAsIDB4MDAsIDB4M0EsIDB4MDEsIDB4MDAsIDB4QTYsIDB4MDAsIDB4NjUsIDB4NDQsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4NEUsIDB4MDAsIDB4MDIsIDB4MzYsIDB4NEYsIDB4MDAsIDB4MDMsIDB4MzYsIDB4MkQsIDB4MDAsIDB4MDQsIDB4MzYsCisJIDB4M0UsIDB4MDAsIDB4NTIsIDB4MDAsIDB4MDAsIDB4NjQsIDB4NEMsIDB4RkIsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4MDUsIDB4N0UsIDB4NkYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MDAsIDB4NjUsIDB4NjUsIDB4NDMsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RjIsCisJIDB4OEMsIDB4RkEsIDB4MDAsIDB4QTgsIDB4NkYsIDB4RjIsIDB4MTUsIDB4MDMsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4NzAsIDB4RjIsIDB4MDAsIDB4QkIsCisJIDB4RkYsIDB4QTAsIDB4MDcsIDB4MDMsIDB4MEUsIDB4MDYsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4RkIsIDB4MDQsCisJIDB4MDgsIDB4MDAsIDB4QjksIDB4ODEsIDB4RTgsIDB4ODQsIDB4RDksIDB4ODEsIDB4RkQsIDB4MDQsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsCisJIDB4MEUsIDB4RkEsIDB4MEMsIDB4RjQsIDB4RkYsIDB4RkYsIDB4MUQsIDB4MDAsIDB4NEMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4NEMsIDB4RkIsCisJIDB4QUIsIDB4RjMsIDB4NjAsIDB4NDUsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDIsIDB4MUMsIDB4NjAsIDB4MEMsIDB4NjIsIDB4MEYsIDB4NjAsCisJIDB4OTYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4QzMsIDB4MDEsIDB4NEMsIDB4RjMsCisJIDB4NjYsIDB4NDEsIDB4REMsIDB4ODQsIDB4NEMsIDB4RkIsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDMsIDB4N0UsIDB4NkYsIDB4RkEsCisJIDB4NjEsIDB4NDYsIDB4QkMsIDB4NjAsIDB4NDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4N0UsIDB4NkYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4RjUsIDB4MDEsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4OEMsIDB4RkEsCisJIDB4NjAsIDB4NDcsIDB4NzAsIDB4RjIsIDB4RkYsIDB4QjUsIDB4MDgsIDB4MTgsIDB4RTQsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsCisJIDB4RkIsIDB4MDQsIDB4MDEsIDB4NjQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MEMsIDB4RjQsIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsIDB4RTQsIDB4MDIsCisJIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4NzAsIDB4RjIsIDB4RkYsIDB4QjUsIDB4NjEsIDB4NDYsCisJIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MjksIDB4MDMsIDB4RTAsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MDMsIDB4NjYsIDB4NDEsCisJIDB4NjQsIDB4NDYsIDB4NzAsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MDEsIDB4NjUsIDB4NjUsIDB4NDMsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RjIsCisJIDB4OEMsIDB4RkEsIDB4MDAsIDB4QTgsIDB4NkYsIDB4RjIsIDB4MTUsIDB4MDMsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4NzAsIDB4RjIsIDB4MDAsIDB4QkIsCisJIDB4RkYsIDB4QTAsIDB4MDcsIDB4MDMsIDB4MEUsIDB4MDYsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4RkIsIDB4MDQsCisJIDB4MDgsIDB4MDAsIDB4QjksIDB4ODEsIDB4RTgsIDB4ODQsIDB4RDksIDB4ODEsIDB4RkQsIDB4MDQsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsCisJIDB4MEUsIDB4RkEsIDB4MEMsIDB4RjQsIDB4RkYsIDB4RkYsIDB4QTMsIDB4MDEsIDB4QTIsIDB4MDEsIDB4NjUsIDB4NDQsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsCisJIDB4QTgsIDB4MDEsIDB4MDIsIDB4MzYsIDB4MDEsIDB4MDAsIDB4QTUsIDB4MDEsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4N0UsIDB4NkYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MDAsIDB4NjUsIDB4NjUsIDB4NDMsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RjIsCisJIDB4OEMsIDB4RkEsIDB4MDAsIDB4QTgsIDB4NkYsIDB4RjIsIDB4MTUsIDB4MDMsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4NzAsIDB4RjIsIDB4MDAsIDB4QkIsCisJIDB4RkYsIDB4QTAsIDB4MDcsIDB4MDMsIDB4MEUsIDB4MDYsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4RkIsIDB4MDQsCisJIDB4MDgsIDB4MDAsIDB4QjksIDB4ODEsIDB4RTgsIDB4ODQsIDB4RDksIDB4ODEsIDB4RkQsIDB4MDQsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsCisJIDB4MEUsIDB4RkEsIDB4MEMsIDB4RjQsIDB4RkYsIDB4RkYsIDB4QkMsIDB4NjAsIDB4NDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0UsIDB4RjIsIDB4NjAsIDB4NDUsCisJIDB4NjAsIDB4NDcsIDB4MDcsIDB4QjAsIDB4MDAsIDB4M0EsIDB4MDEsIDB4MDAsIDB4QTMsIDB4MDAsIDB4NjUsIDB4NDQsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsCisJIDB4MEIsIDB4MDAsIDB4MDIsIDB4MzYsIDB4MTQsIDB4MDAsIDB4MDMsIDB4MzYsIDB4NDcsIDB4MDAsIDB4MDQsIDB4MzYsIDB4NUUsIDB4MDAsIDB4MDUsIDB4MzYsCisJIDB4MEUsIDB4MDAsIDB4QkMsIDB4NjAsIDB4NDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4N0UsIDB4NkYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4QkMsIDB4NjAsIDB4NDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsCisJIDB4MDEsIDB4NjUsIDB4NjUsIDB4NDMsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RjIsIDB4OEMsIDB4RkEsIDB4MDAsIDB4QTgsIDB4NkYsIDB4RjIsCisJIDB4MTUsIDB4MDMsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4NzAsIDB4RjIsIDB4MDAsIDB4QkIsIDB4RkYsIDB4QTAsIDB4MDcsIDB4MDMsIDB4MEUsIDB4MDYsCisJIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4RkIsIDB4MDQsIDB4MDgsIDB4MDAsIDB4QjksIDB4ODEsIDB4RTgsIDB4ODQsCisJIDB4RDksIDB4ODEsIDB4RkQsIDB4MDQsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MEUsIDB4RkEsIDB4MEMsIDB4RjQsIDB4RkYsIDB4RkYsCisJIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4MDAsIDB4NjMsIDB4MDMsIDB4N0UsIDB4NkYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4NEMsIDB4RkQsCisJIDB4MUMsIDB4NjAsIDB4MEMsIDB4NjIsIDB4MEYsIDB4NjAsIDB4OTYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4RkYsIDB4QkMsIDB4NjAsIDB4NDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RjIsIDB4NEMsIDB4RjMsCisJIDB4MDIsIDB4QjAsIDB4NjEsIDB4NDYsIDB4Q0MsIDB4ODQsIDB4MDUsIDB4MDMsIDB4MDQsIDB4MjgsIDB4NEMsIDB4RkIsIDB4QkMsIDB4NjAsIDB4NDgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjgsIDB4NEMsIDB4RkIsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4N0UsCisJIDB4NkYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4QkMsIDB4NjAsIDB4NDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4NzAsIDB4RjIsIDB4NjEsIDB4NDYsIDB4RkYsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDYsCisJIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4RkIsIDB4MDQsIDB4MjksIDB4MDAsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RkEsCisJIDB4MDEsIDB4NjUsIDB4NjUsIDB4NDMsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RjIsIDB4OEMsIDB4RkEsIDB4MDAsIDB4QTgsIDB4NkYsIDB4RjIsCisJIDB4MTUsIDB4MDMsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4NzAsIDB4RjIsIDB4MDAsIDB4QkIsIDB4RkYsIDB4QTAsIDB4MDcsIDB4MDMsIDB4MEUsIDB4MDYsCisJIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4RkIsIDB4MDQsIDB4MDgsIDB4MDAsIDB4QjksIDB4ODEsIDB4RTgsIDB4ODQsCisJIDB4RDksIDB4ODEsIDB4RkQsIDB4MDQsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MEUsIDB4RkEsIDB4MEMsIDB4RjQsIDB4RkYsIDB4RkYsCisJIDB4NkYsIDB4RjIsIDB4MDAsIDB4NjMsIDB4MDMsIDB4N0UsIDB4NkYsIDB4RkEsIDB4M0MsIDB4NDYsIDB4NEMsIDB4RkQsIDB4NTEsIDB4MDAsIDB4NTAsIDB4MDAsCisJIDB4NjUsIDB4NDQsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MzYsIDB4MTIsIDB4MDAsIDB4NDksIDB4MDAsIDB4NjYsIDB4NDEsCisJIDB4NjQsIDB4NDYsIDB4NzAsIDB4RjIsIDB4NjEsIDB4NDYsIDB4MDEsIDB4QjAsIDB4RkYsIDB4RkYsIDB4NDIsIDB4MDIsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDEsCisJIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDIsIDB4N0UsIDB4NkYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MzksIDB4MDAsIDB4MzgsIDB4MDAsCisJIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDEsIDB4N0UsIDB4NkYsIDB4RkEsIDB4NjAsIDB4NDcsCisJIDB4RkYsIDB4QjUsIDB4NzAsIDB4RjIsIDB4NjEsIDB4NDYsIDB4RkYsIDB4QTAsIDB4RkYsIDB4RkYsIDB4RjEsIDB4MDYsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4RkIsIDB4MDQsIDB4RUIsIDB4MDEsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RkEsIDB4NjEsIDB4NDYsCisJIDB4MDAsIDB4NjUsIDB4NjUsIDB4NDMsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RjIsIDB4OEMsIDB4RkEsIDB4MDAsIDB4QTgsIDB4NkYsIDB4RjIsCisJIDB4MTUsIDB4MDMsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4NzAsIDB4RjIsIDB4MDAsIDB4QkIsIDB4RkYsIDB4QTAsIDB4MDcsIDB4MDMsIDB4MEUsIDB4MDYsCisJIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4RkIsIDB4MDQsIDB4MDgsIDB4MDAsIDB4QjksIDB4ODEsIDB4RTgsIDB4ODQsCisJIDB4RDksIDB4ODEsIDB4RkQsIDB4MDQsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MEUsIDB4RkEsIDB4MEMsIDB4RjQsIDB4RkYsIDB4RkYsCisJIDB4MDMsIDB4NjQsIDB4M0IsIDB4REIsIDB4Q0EsIDB4RkUsIDB4NDcsIDB4RjEsIDB4MDEsIDB4NjUsIDB4MzIsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MDgsIDB4MDAsCisJIDB4MkMsIDB4RjIsIDB4NjQsIDB4NDUsIDB4MDIsIDB4MjIsIDB4MDQsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDEsIDB4MDAsIDB4RUMsIDB4MDAsCisJIDB4MTQsIDB4RjIsIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MUQsIDB4MDAsIDB4NjAsIDB4NDUsIDB4MDUsIDB4NjQsIDB4M0IsIDB4REIsIDB4NjUsIDB4NDQsCisJIDB4Q0MsIDB4ODUsIDB4OTgsIDB4RjEsIDB4MUUsIDB4NjAsIDB4REUsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4ODAsIDB4QzQsIDB4ODQsCisJIDB4MEIsIDB4MDMsIDB4MDcsIDB4MDUsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDksIDB4MDQsIDB4QzYsIDB4RkUsCisJIDB4MDcsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QjgsIDB4ODQsIDB4QTIsIDB4REIsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsCisJIDB4QUYsIDB4MDAsIDB4NjAsIDB4NDEsIDB4MkEsIDB4RjAsIDB4MDAsIDB4NjAsIDB4MEMsIDB4NjQsIDB4QTAsIDB4ODQsIDB4MDQsIDB4MzYsIDB4MDIsIDB4MDAsCisJIDB4MEMsIDB4M0EsIDB4MDEsIDB4MDAsIDB4QTUsIDB4MDAsIDB4NjEsIDB4NDUsIDB4NjAsIDB4NDEsIDB4OTgsIDB4RjEsIDB4MUUsIDB4NjAsIDB4REUsIDB4NjQsCisJIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4ODAsIDB4QzQsIDB4ODQsIDB4MEIsIDB4MDMsIDB4MDcsIDB4MDUsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsCisJIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDksIDB4MDQsIDB4QzYsIDB4RkUsIDB4MDcsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QjgsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4NjEsIDB4NDAsIDB4MDgsIDB4MzYsIDB4MDEsIDB4MDAsIDB4ODgsIDB4MDAsCisJIDB4MTQsIDB4RjIsIDB4MUMsIDB4NjUsIDB4NjAsIDB4NDEsIDB4MDAsIDB4NjMsIDB4Q0QsIDB4ODEsIDB4QzcsIDB4ODMsIDB4RkQsIDB4MDIsIDB4M0YsIDB4RjAsCisJIDB4MkMsIDB4RjIsIDB4QzMsIDB4ODMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MjksIDB4MDAsIDB4OTgsIDB4RjEsIDB4MUUsIDB4NjAsIDB4REMsIDB4NjQsCisJIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsCisJIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4OTgsIDB4RjEsIDB4MUUsIDB4NjAsCisJIDB4RTIsIDB4NjQsIDB4QTAsIDB4RDMsIDB4NjMsIDB4NDUsIDB4RDgsIDB4ODAsIDB4QzQsIDB4ODQsIDB4MEIsIDB4MDMsIDB4MDcsIDB4MDUsIDB4REMsIDB4ODAsCisJIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDksIDB4MDQsIDB4QzYsIDB4RkUsIDB4MDcsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QjgsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4NTIsIDB4MDAsIDB4OTgsIDB4RjEsIDB4MUUsIDB4NjAsCisJIDB4REEsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsCisJIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4OTgsIDB4RjEsCisJIDB4MUUsIDB4NjAsIDB4RTAsIDB4NjQsIDB4QTAsIDB4RDMsIDB4NjMsIDB4NDUsIDB4RDgsIDB4ODAsIDB4QzQsIDB4ODQsIDB4MEIsIDB4MDMsIDB4MDcsIDB4MDUsCisJIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDksIDB4MDQsIDB4QzYsIDB4RkUsIDB4MDcsIDB4MDAsIDB4MDAsIDB4NjQsCisJIDB4QjgsIDB4ODQsIDB4QTIsIDB4REIsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MTUsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4MEYsIDB4QjQsIDB4MDAsIDB4QTgsIDB4MDEsIDB4QTgsIDB4MjQsIDB4MDMsIDB4MTIsIDB4MDMsIDB4OTgsIDB4RjEsIDB4MUUsIDB4NjAsIDB4RTgsIDB4NjQsCisJIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsCisJIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MTEsIDB4MDAsIDB4OTgsIDB4RjEsCisJIDB4MUUsIDB4NjAsIDB4RTYsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsCisJIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsCisJIDB4MDQsIDB4NjQsIDB4M0IsIDB4REIsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MDYsIDB4RjAsIDB4RkYsIDB4NjAsIDB4NUYsIDB4NjQsCisJIDB4QTAsIDB4ODQsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MUIsIDB4NjAsIDB4RDQsIDB4NjIsIDB4MUIsIDB4NjAsIDB4QUMsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4M0MsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4NUMsIDB4NUMsIDB4RkMsIDB4RkMsCisJIDB4Q0UsIDB4RkUsIDB4QjUsIDB4NjAsIDB4RUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4NjQsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MDcsIDB4RjQsCisJIDB4MDYsIDB4RjIsIDB4MDIsIDB4QTgsIDB4M0MsIDB4NDYsIDB4MTAsIDB4MDMsIDB4MTAsIDB4QjAsIDB4MkEsIDB4RjIsIDB4MEQsIDB4MDMsIDB4MEUsIDB4RjIsCisJIDB4MEMsIDB4QjAsIDB4NjAsIDB4NDAsIDB4RjAsIDB4MzcsIDB4MjAsIDB4QkMsIDB4MDIsIDB4MDMsIDB4RkUsIDB4N0YsIDB4MEUsIDB4RkEsIDB4MjMsIDB4RjAsCisJIDB4MTAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4Q0MsIDB4MDEsIDB4MEYsIDB4RjAsIDB4MTUsIDB4RjIsIDB4NjQsIDB4NDEsIDB4MDEsIDB4MkEsCisJIDB4MDIsIDB4MDAsIDB4QjEsIDB4RjEsIDB4MDksIDB4MDAsIDB4MDMsIDB4NjUsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4MDYsIDB4RjAsCisJIDB4NjMsIDB4NDYsIDB4QjAsIDB4RjEsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsIDB4NjQsIDB4NDUsIDB4REMsIDB4ODQsIDB4RDQsIDB4ODAsIDB4MTUsIDB4RkEsCisJIDB4M0IsIDB4MDcsIDB4NjEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDksIDB4MDAsIDB4MUYsIDB4NjAsIDB4MEUsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjgsIDB4QTIsIDB4REIsIDB4MDgsIDB4MDAsIDB4MUYsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QTAsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjgsIDB4QTIsIDB4REIsIDB4MkEsIDB4RjAsIDB4MDgsIDB4NjcsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REEsIDB4MDgsIDB4RjAsIDB4MUIsIDB4NjAsIDB4OEUsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MDcsIDB4RjIsIDB4NDYsIDB4NDMsIDB4ODgsIDB4RjEsCisJIDB4MDYsIDB4MDMsIDB4NjAsIDB4NDYsIDB4ODYsIDB4RjQsIDB4RDAsIDB4ODAsIDB4ODAsIDB4QkIsIDB4MDEsIDB4MDMsIDB4MDYsIDB4RkMsIDB4MjMsIDB4NDYsCisJIDB4M0UsIDB4RjIsIDB4MDAsIDB4NjMsIDB4MDEsIDB4QjAsIDB4NDMsIDB4NUMsIDB4RkMsIDB4RkMsIDB4MEIsIDB4MDMsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsCisJIDB4MUIsIDB4NjAsIDB4QTYsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4QjUsIDB4NjAsIDB4RUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NDksIDB4RkIsIDB4OTgsIDB4RjEsIDB4MUUsIDB4NjAsCisJIDB4RTgsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsCisJIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4OTgsIDB4RjEsCisJIDB4MUUsIDB4NjAsIDB4RUEsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsCisJIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsCisJIDB4MjEsIDB4NjAsIDB4OTgsIDB4NjMsIDB4QTMsIDB4RDMsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEQsIDB4RjIsCisJIDB4NjAsIDB4NUMsIDB4NjQsIDB4NUYsIDB4MEQsIDB4RkEsIDB4MjMsIDB4RjAsIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MDcsIDB4RjAsCisJIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MDYsIDB4RjIsIDB4N0YsIDB4NjUsIDB4QTQsIDB4OUUsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4NDAsIDB4MDEsCisJIDB4QkUsIDB4NjAsIDB4NzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjEsIDB4NjQsIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsIDB4MDEsIDB4NjMsIDB4QzQsIDB4QjQsCisJIDB4MzEsIDB4RkIsIDB4MzIsIDB4RkQsIDB4QkUsIDB4NjAsIDB4MUMsIDB4NjIsIDB4NDIsIDB4NDAsIDB4QTAsIDB4NEMsIDB4NDAsIDB4QkMsIDB4N0QsIDB4QjQsCisJIDB4QTAsIDB4NTEsIDB4QTAsIDB4RkUsIDB4MUEsIDB4RkYsIDB4MUIsIDB4NjAsIDB4QTAsIDB4NjQsIDB4MDgsIDB4RjAsIDB4MDcsIDB4RjAsIDB4RDAsIDB4ODAsCisJIDB4MUIsIDB4NjAsIDB4QTYsIDB4NjIsIDB4MTQsIDB4MDIsIDB4QTIsIDB4RDMsIDB4MDEsIDB4NjMsIDB4QUMsIDB4ODYsIDB4MDcsIDB4RjIsIDB4MEYsIDB4MDMsCisJIDB4RDAsIDB4ODAsIDB4MDksIDB4RjIsIDB4RkEsIDB4MDIsIDB4MjMsIDB4RkMsIDB4MUIsIDB4NjAsIDB4RDQsIDB4NjIsIDB4MUIsIDB4NjAsIDB4QUMsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4M0MsIDB4NDYsCisJIDB4MDYsIDB4NjQsIDB4QTEsIDB4RkYsIDB4NDksIDB4RkIsIDB4ODMsIDB4M0UsIDB4MzEsIDB4RjMsIDB4ODcsIDB4NjAsIDB4ODAsIDB4NjEsIDB4MUQsIDB4RjAsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MTUsIDB4MDAsIDB4RkUsIDB4QjQsIDB4MzEsIDB4RkIsIDB4MDAsIDB4NjQsIDB4NDksIDB4RkIsIDB4MDEsIDB4NjQsCisJIDB4NDcsIDB4RkIsIDB4MjEsIDB4NjAsIDB4OTgsIDB4NjMsIDB4QTMsIDB4RDMsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RTMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NzEsIDB4NjQsIDB4NUYsIDB4MEQsIDB4RkEsIDB4NDAsIDB4NjQsIDB4M0IsIDB4REIsIDB4QkUsIDB4NjAsIDB4NzAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MkEsIDB4MUIsIDB4MDAsIDB4RDEsIDB4OTEsIDB4OEQsIDB4RTIsIDB4NDEsIDB4NjQsIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsIDB4MjEsIDB4NjAsCisJIDB4QTAsIDB4NjMsIDB4RkQsIDB4QjQsIDB4MzEsIDB4RkIsIDB4QTMsIDB4RDMsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RTMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4NjMsIDB4NjAsIDB4NUMsIDB4MEQsIDB4RjIsIDB4NDcsIDB4RkQsIDB4RkYsIDB4QjUsIDB4NjAsIDB4NDcsIDB4RDAsIDB4ODAsIDB4REMsIDB4ODQsCisJIDB4MUYsIDB4MDMsIDB4NjAsIDB4NDcsIDB4QjQsIDB4ODQsIDB4MEQsIDB4RkEsIDB4MUIsIDB4MDAsIDB4MDgsIDB4MkEsIDB4MDcsIDB4MDAsIDB4NDIsIDB4NjQsCisJIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RjcsIDB4QjQsIDB4MzEsIDB4RkIsIDB4MTIsIDB4MDAsIDB4MTAsIDB4MkEsIDB4MDksIDB4MDAsCisJIDB4NDMsIDB4NjQsIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RUYsIDB4QjQsIDB4MzEsIDB4RkIsIDB4QkQsIDB4NjAsIDB4RUIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NDQsIDB4NjQsIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REYsIDB4QjQsIDB4MzEsIDB4RkIsIDB4MDAsIDB4MDAsCisJIDB4MkEsIDB4NjQsIDB4M0IsIDB4REIsIDB4QjUsIDB4NjAsIDB4QTIsIDB4NjQsIDB4NDAsIDB4NDAsIDB4QkEsIDB4NjAsIDB4NEYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTIsIDB4NjAsIDB4Q0MsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QjUsIDB4MDQsIDB4QjUsIDB4MDQsIDB4MDMsIDB4MDMsIDB4MDMsCisJIDB4QkUsIDB4NjAsIDB4RjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RUIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzEsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MjksIDB4MDAsIDB4OUQsIDB4RkUsIDB4MjcsIDB4MDQsIDB4MjYsIDB4MEEsIDB4OUYsIDB4RkUsIDB4MjQsIDB4MDUsIDB4ODUsIDB4RkYsCisJIDB4MjAsIDB4NDQsIDB4ODQsIDB4RkYsIDB4NDAsIDB4MjYsIDB4MUYsIDB4MDAsIDB4M0YsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MUMsIDB4MDAsIDB4MzgsIDB4NjksCisJIDB4RkYsIDB4RkYsIDB4NjgsIDB4NDQsIDB4MDEsIDB4MTYsIDB4RkQsIDB4MDEsIDB4MDEsIDB4MkEsIDB4MTUsIDB4MDAsIDB4MUYsIDB4NjAsIDB4MUEsIDB4NjQsCisJIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjgsIDB4QTIsIDB4REIsIDB4NjUsIDB4RjEsIDB4MDIsIDB4NjAsCisJIDB4RUUsIDB4NjQsIDB4ODIsIDB4RkIsIDB4RkYsIDB4RkYsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4ODMsIDB4RkIsIDB4MDQsIDB4NjQsCisJIDB4ODQsIDB4RkIsIDB4REYsIDB4RkUsIDB4MTksIDB4RkYsIDB4MTAsIDB4NjQsIDB4M0IsIDB4REIsIDB4NjYsIDB4RjMsIDB4NzMsIDB4NDUsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4OTMsIDB4NzUsIDB4RjEsIDB4QzksIDB4RkUsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4M0QsIDB4MDAsCisJIDB4NDksIDB4RjMsIDB4M0MsIDB4NDYsIDB4MzMsIDB4MTgsIDB4Q0MsIDB4ODQsIDB4NDksIDB4RkIsIDB4MzAsIDB4MDIsIDB4QkYsIDB4NjAsIDB4QUQsIDB4NjQsCisJIDB4NDAsIDB4NDIsIDB4RkMsIDB4RkMsIDB4MDAsIDB4NjQsIDB4NUMsIDB4NUMsIDB4MzIsIDB4RkIsIDB4ODIsIDB4RkYsIDB4NUMsIDB4NDcsIDB4ODQsIDB4RkYsCisJIDB4NjIsIDB4RkYsIDB4MUYsIDB4NjAsIDB4MEEsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjgsCisJIDB4QTIsIDB4REIsIDB4MkEsIDB4RjIsIDB4MDcsIDB4RjAsIDB4MEMsIDB4QjQsIDB4MDgsIDB4M0EsIDB4MDcsIDB4MDAsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsCisJIDB4MDYsIDB4RjAsIDB4RkYsIDB4NjAsIDB4REYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4MDYsIDB4RkEsIDB4MjMsIDB4RjAsIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REEsIDB4MUIsIDB4NjAsIDB4RDQsIDB4NjIsIDB4MUIsIDB4NjAsIDB4QUMsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4Q0UsIDB4RkUsIDB4MDYsIDB4MDAsIDB4NjYsIDB4RjMsCisJIDB4NzMsIDB4NDUsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4OTMsIDB4MTIsIDB4NjAsIDB4QzgsIDB4NjMsIDB4QTMsIDB4RDMsCisJIDB4QUQsIDB4NDksIDB4MjAsIDB4QjUsIDB4MDgsIDB4QjEsIDB4MjMsIDB4MDMsIDB4RTEsIDB4ODEsIDB4MTAsIDB4QjUsIDB4OTUsIDB4ODEsIDB4NjAsIDB4NDEsCisJIDB4MTgsIDB4MDIsIDB4MTIsIDB4NjAsIDB4Q0EsIDB4N0MsIDB4QTQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4QTQsIDB4REIsIDB4MTcsIDB4MDIsCisJIDB4MEEsIDB4NjQsIDB4QTQsIDB4REIsIDB4NjEsIDB4NDQsIDB4MDcsIDB4QjQsIDB4RkYsIDB4RkYsIDB4MTEsIDB4MDIsIDB4MDgsIDB4QjEsIDB4RTEsIDB4ODEsCisJIDB4OTUsIDB4ODEsIDB4QTMsIDB4RDMsIDB4MEMsIDB4MDMsIDB4MDgsIDB4QUMsIDB4MDEsIDB4QkMsIDB4QTMsIDB4REIsIDB4RkYsIDB4RkYsIDB4MTMsIDB4RkYsCisJIDB4MDYsIDB4MDAsIDB4MTAsIDB4QUMsIDB4QTMsIDB4REIsIDB4MTIsIDB4NjAsIDB4Q0EsIDB4NjMsIDB4MEEsIDB4N0MsIDB4QTMsIDB4RDksIDB4QjUsIDB4NjAsCisJIDB4QUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDYsIDB4RjMsIDB4NDUsIDB4RjEsIDB4MDUsIDB4MUIsIDB4NjQsIDB4NDQsIDB4MDMsIDB4MUIsIDB4MEYsIDB4NjAsCisJIDB4OTIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4NDUsIDB4RkIsIDB4MDAsIDB4NjMsIDB4NDYsIDB4RkQsIDB4NjAsIDB4NDEsIDB4MjUsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4MjcsIDB4NDQsIDB4RUYsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDAsIDB4QjksIDB4NzEsIDB4NDAsIDB4ODAsIDB4MjcsIDB4MDEsIDB4MTIsIDB4MTksIDB4MDMsCisJIDB4QkYsIDB4NjAsIDB4NEQsIDB4NjIsIDB4ODQsIDB4RkYsIDB4NDIsIDB4NDIsIDB4ODIsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MTQsIDB4QkMsIDB4RkYsIDB4QjQsCisJIDB4QTAsIDB4NTEsIDB4MUYsIDB4MEEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4NzAsIDB4NDQsIDB4QUMsIDB4ODAsIDB4MTksIDB4MEEsCisJIDB4NzEsIDB4NDAsIDB4ODAsIDB4MjcsIDB4RjcsIDB4MTIsIDB4NDUsIDB4RjMsIDB4MjcsIDB4MDIsIDB4MDMsIDB4MTgsIDB4Q0MsIDB4ODQsIDB4NDUsIDB4RkIsCisJIDB4RjEsIDB4MDIsIDB4MDYsIDB4MEEsIDB4QTAsIDB4NEMsIDB4RkIsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTcsIDB4NjAsIDB4REYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4ODQsIDB4RkYsIDB4QkYsIDB4NjAsIDB4MkEsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MTQsIDB4QkMsIDB4RkYsIDB4QjQsCisJIDB4QTAsIDB4NTEsIDB4QUYsIDB4NjAsIDB4MTksIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0MsIDB4NDQsIDB4QUMsIDB4ODAsIDB4MzIsIDB4RjEsIDB4MTIsIDB4MDMsCisJIDB4NjQsIDB4NDAsIDB4MDcsIDB4MjIsIDB4MEYsIDB4MDAsIDB4QTcsIDB4NjAsIDB4QzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MUMsIDB4QkMsCisJIDB4REYsIDB4QjQsIDB4QTAsIDB4NTEsIDB4RjEsIDB4MDEsIDB4MDYsIDB4MDAsIDB4MjgsIDB4NjQsIDB4M0EsIDB4REIsIDB4QTAsIDB4NEMsIDB4MzAsIDB4QkMsCisJIDB4RjMsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4MjgsIDB4NjQsIDB4M0IsIDB4REIsIDB4MEYsIDB4NjAsCisJIDB4OTQsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MjcsIDB4MTYsIDB4MDAsIDB4NDYsIDB4RkIsIDB4MTQsIDB4MTgsIDB4QkYsIDB4NjAsCisJIDB4OUIsIDB4NjQsIDB4ODQsIDB4RkYsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MTQsIDB4QkMsIDB4RjcsIDB4QjQsIDB4QTAsIDB4NTEsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4NzAsIDB4NDQsIDB4QUMsIDB4ODAsIDB4NDYsIDB4RjMsIDB4Q0EsIDB4MEEsIDB4REMsIDB4MDIsCisJIDB4Q0MsIDB4ODQsIDB4NDYsIDB4RkIsIDB4RjUsIDB4MDIsIDB4ODQsIDB4RkYsIDB4QkYsIDB4NjAsIDB4QUQsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsCisJIDB4MjcsIDB4NDQsIDB4MDgsIDB4QkMsIDB4NDAsIDB4NDcsIDB4QkIsIDB4RTEsIDB4MDQsIDB4MDAsIDB4M0EsIDB4RTEsIDB4MzEsIDB4NDAsIDB4MDEsIDB4MjYsCisJIDB4QkIsIDB4RTEsIDB4QTcsIDB4NjAsIDB4QjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4RTIsIDB4MkQsIDB4RjMsIDB4MkMsIDB4RjMsIDB4MDAsIDB4QkQsCisJIDB4Q0MsIDB4ODQsIDB4MDgsIDB4MDMsIDB4MkMsIDB4RkIsIDB4MDYsIDB4MDIsIDB4NjUsIDB4NDQsIDB4MkMsIDB4RkIsIDB4OEEsIDB4RkYsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4RDIsIDB4RjMsIDB4MzEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4NDQsIDB4MDAsIDB4NjAsIDB4NDMsIDB4MDQsIDB4QjAsCisJIDB4MDIsIDB4QjAsIDB4MDgsIDB4MjQsIDB4MTYsIDB4MDIsIDB4MjksIDB4NDQsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4Q0MsIDB4ODEsIDB4MEUsIDB4MDMsCisJIDB4NDEsIDB4NDksIDB4MzcsIDB4MDIsIDB4NjMsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDksIDB4MDAsIDB4RjcsIDB4QjMsIDB4MjUsIDB4NjAsIDB4MUMsIDB4N0MsCisJIDB4QTQsIDB4RDEsIDB4QUQsIDB4NEYsIDB4RkQsIDB4QjQsIDB4QTAsIDB4NUQsIDB4NDQsIDB4NDksIDB4MkIsIDB4MDAsIDB4NjMsIDB4NDAsIDB4MDIsIDB4MkEsCisJIDB4MTQsIDB4MDAsIDB4MjUsIDB4NjAsIDB4MUUsIDB4NjQsIDB4QTAsIDB4RDMsIDB4MjUsIDB4NjAsIDB4MUEsIDB4N0MsIDB4QTQsIDB4REIsIDB4NDAsIDB4NDksCisJIDB4MjUsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QTAsIDB4RDMsIDB4MjUsIDB4NjAsIDB4MUMsIDB4N0MsIDB4QTQsIDB4REIsIDB4MEMsIDB4QkIsIDB4RkQsIDB4QjMsCisJIDB4QUQsIDB4NEYsIDB4MDIsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUQsIDB4MTQsIDB4MDAsIDB4MjUsIDB4NjAsIDB4MjIsIDB4NjQsIDB4QTAsIDB4RDMsCisJIDB4MjUsIDB4NjAsIDB4MUEsIDB4N0MsIDB4MEUsIDB4MTgsIDB4QTQsIDB4REIsIDB4NDAsIDB4NDksIDB4MjUsIDB4NjAsIDB4MjQsIDB4NjQsIDB4QTAsIDB4RDMsCisJIDB4MjUsIDB4NjAsIDB4MUMsIDB4N0MsIDB4QTQsIDB4REIsIDB4MDgsIDB4QkIsIDB4RkIsIDB4QjMsIDB4QUQsIDB4NEYsIDB4MDIsIDB4QkMsIDB4MDAsIDB4N0YsCisJIDB4QTAsIDB4NUQsIDB4RDIsIDB4RkQsIDB4MDEsIDB4NjAsIDB4MEMsIDB4NjEsIDB4QTEsIDB4RDMsIDB4NjEsIDB4NDMsIDB4MTcsIDB4MTgsIDB4NTgsIDB4RDMsCisJIDB4NjIsIDB4NDEsIDB4MDMsIDB4MTgsIDB4Q0MsIDB4ODQsIDB4QTEsIDB4REIsIDB4MTEsIDB4MDAsIDB4NDksIDB4RDMsIDB4QTMsIDB4REIsIDB4MDYsIDB4QTEsCisJIDB4QTEsIDB4RDMsIDB4NTksIDB4RDEsIDB4NjAsIDB4NDUsIDB4QTUsIDB4RDMsIDB4NTksIDB4RDEsIDB4QjAsIDB4ODQsIDB4QTUsIDB4REIsIDB4NjQsIDB4NDQsCisJIDB4MDYsIDB4MzYsIDB4Q0QsIDB4RkUsIDB4MDcsIDB4MzYsIDB4RDYsIDB4RkUsIDB4RTUsIDB4MDEsIDB4MjMsIDB4NDYsIDB4QjUsIDB4NjAsIDB4QUYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NDYsIDB4NDMsIDB4MUMsIDB4NjAsIDB4MEEsIDB4NjEsIDB4QTEsIDB4RDMsIDB4NTksIDB4RDEsIDB4MDYsIDB4MUIsIDB4NTksIDB4RDMsCisJIDB4NTksIDB4RDEsIDB4MDMsIDB4MUIsIDB4NTksIDB4RDMsIDB4NTksIDB4RDEsIDB4RjAsIDB4MTgsIDB4MDAsIDB4NjMsIDB4NDksIDB4REQsIDB4NjAsIDB4NDAsCisJIDB4MDIsIDB4MzYsIDB4MTEsIDB4MDAsIDB4MDMsIDB4MzYsIDB4MzIsIDB4MDAsIDB4MDEsIDB4MzYsIDB4MDgsIDB4MDAsIDB4MDUsIDB4M0EsIDB4RUEsIDB4MDEsCisJIDB4QTQsIDB4RDMsIDB4NUEsIDB4RDMsIDB4OUMsIDB4ODUsIDB4QTQsIDB4ODQsIDB4QTIsIDB4REIsIDB4RTQsIDB4MDEsIDB4MDEsIDB4NjAsIDB4MEMsIDB4NjEsCisJIDB4MDAsIDB4NjQsIDB4QTEsIDB4REIsIDB4REYsIDB4MDEsIDB4QzAsIDB4NjAsIDB4NEYsIDB4NjQsIDB4NDAsIDB4NDUsIDB4MjIsIDB4MDAsIDB4MDEsIDB4NjAsCisJIDB4MEMsIDB4NjYsIDB4QTYsIDB4RDMsIDB4MDQsIDB4QTEsIDB4NjAsIDB4NDMsIDB4QTEsIDB4RDMsIDB4QzksIDB4ODEsIDB4NjAsIDB4NDUsIDB4MDAsIDB4QkIsCisJIDB4QTEsIDB4REIsIDB4QkUsIDB4RDMsIDB4MDksIDB4MDMsIDB4RDQsIDB4ODQsIDB4OUMsIDB4ODQsIDB4REMsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MEUsCisJIDB4QTMsIDB4RDEsIDB4NjMsIDB4NDYsIDB4NjQsIDB4NDMsIDB4RjIsIDB4MDEsIDB4OUMsIDB4ODQsIDB4REMsIDB4ODUsIDB4NDksIDB4REQsIDB4NjEsIDB4NDQsCisJIDB4MDAsIDB4QkIsIDB4QTYsIDB4REIsIDB4MDIsIDB4MDMsIDB4NjUsIDB4NDQsIDB4QkUsIDB4REIsIDB4QkMsIDB4MDEsIDB4QzAsIDB4NjAsIDB4MkEsIDB4NjQsCisJIDB4NDAsIDB4NDUsIDB4MDEsIDB4NjAsIDB4MEMsIDB4NjYsIDB4QTYsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4MEYsIDB4MTgsIDB4MDIsIDB4MDMsCisJIDB4NjAsIDB4NDYsIDB4RjksIDB4MDEsIDB4NTgsIDB4RDMsIDB4QTQsIDB4RDMsIDB4NjAsIDB4NDUsIDB4MDAsIDB4NjMsIDB4QTQsIDB4REQsIDB4MDUsIDB4MTgsCisJIDB4NTgsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QzQsIDB4ODMsIDB4QTIsIDB4REQsIDB4Q0EsIDB4ODQsIDB4QTYsIDB4REIsIDB4MjUsIDB4NTgsIDB4NjQsIDB4NDEsCisJIDB4MzAsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MDAsIDB4RTEsIDB4MDYsIDB4MDIsIDB4NDAsIDB4RkYsIDB4NDIsIDB4RkYsIDB4NDMsIDB4RkYsIDB4NDQsIDB4RkYsCisJIDB4NDUsIDB4RkYsIDB4QTEsIDB4RkYsIDB4ODgsIDB4RkYsIDB4ODUsIDB4RkYsIDB4MjEsIDB4RTEsIDB4NUMsIDB4NDAsIDB4QzAsIDB4NjAsIDB4OUEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NDMsIDB4RkYsIDB4MzksIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODQsIDB4M0UsIDB4RkIsIDB4MDEsIDB4QTAsIDB4NEMsCisJIDB4M0QsIDB4NDYsIDB4MkEsIDB4RjIsIDB4NDYsIDB4NEQsIDB4MTAsIDB4MjUsIDB4MEUsIDB4MDAsIDB4MDksIDB4RTEsIDB4QTEsIDB4RkYsIDB4NjYsIDB4NDAsCisJIDB4MEYsIDB4RjIsIDB4MDEsIDB4MjksIDB4MDIsIDB4MDAsIDB4NDAsIDB4RkYsIDB4MEEsIDB4QkMsIDB4QTIsIDB4REEsIDB4MDgsIDB4MjUsIDB4RTksIDB4MDEsCisJIDB4Q0IsIDB4RkUsIDB4NUMsIDB4NUQsIDB4RTcsIDB4MDEsIDB4NDQsIDB4RkYsIDB4MDMsIDB4MkIsIDB4MjEsIDB4MDAsIDB4ODksIDB4RjMsIDB4MDYsIDB4NjEsCisJIDB4NjAsIDB4NDMsIDB4NjYsIDB4NDUsIDB4MzEsIDB4RjAsIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4NjUsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MzAsIDB4RjAsCisJIDB4MEYsIDB4MDIsIDB4NjMsIDB4NDYsIDB4MDQsIDB4RjIsIDB4NjUsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MkYsIDB4RjAsIDB4MDksIDB4MDIsIDB4NjMsIDB4NDYsCisJIDB4MDMsIDB4RjIsIDB4NjUsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4RkYsIDB4RkYsIDB4NDgsIDB4RkUsIDB4MDYsIDB4MDAsCisJIDB4Q0QsIDB4ODEsIDB4MDIsIDB4QTMsIDB4RTcsIDB4MDIsIDB4ODgsIDB4RjEsIDB4MDgsIDB4RkUsIDB4NjQsIDB4NDMsIDB4MjYsIDB4MDMsIDB4MzEsIDB4RjIsCisJIDB4MTIsIDB4NjAsIDB4Q0UsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsCisJIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MzEsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsCisJIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MzAsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsCisJIDB4MkYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsCisJIDB4RTgsIDB4MUIsIDB4ODgsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MDcsIDB4RkMsIDB4M0YsIDB4RjIsIDB4MDksIDB4NjAsCisJIDB4QjAsIDB4NjUsIDB4RDQsIDB4ODAsIDB4MkEsIDB4RjIsIDB4QTEsIDB4MDUsIDB4MDgsIDB4MjUsIDB4OTMsIDB4MDEsIDB4MDAsIDB4NjQsIDB4MEQsIDB4NjAsCisJIDB4MkMsIDB4NjEsIDB4NDAsIDB4NEIsIDB4QTEsIDB4REIsIDB4MkQsIDB4NDYsIDB4M0IsIDB4RjIsIDB4ODgsIDB4RjEsIDB4ODcsIDB4RjQsIDB4NjAsIDB4NDAsCisJIDB4MjAsIDB4MkIsIDB4MTIsIDB4MDAsIDB4RDMsIDB4ODAsIDB4MkMsIDB4RjAsIDB4OTAsIDB4MDMsIDB4MDcsIDB4RjQsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsCisJIDB4ODgsIDB4RjUsIDB4QjYsIDB4RjQsIDB4MkQsIDB4NDYsIDB4MDQsIDB4NjQsIDB4MDQsIDB4QjMsIDB4MjIsIDB4RkEsIDB4MDQsIDB4MDMsIDB4QzIsIDB4NjAsCisJIDB4MTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDAsIDB4RTAsIDB4MDAsIDB4NzQsIDB4NjIsIDB4QTIsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsCisJIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RTIsIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4N0MsIDB4NUYsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODUsIDB4MEMsIDB4NjAsIDB4M0EsIDB4NjQsIDB4NDQsIDB4RDMsCisJIDB4NUEsIDB4RDEsIDB4MDMsIDB4MUIsIDB4QzIsIDB4NjAsIDB4MDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDQsIDB4RTMsIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RTQsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUIsCisJIDB4NjQsIDB4NDcsIDB4RTYsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjUsIDB4NDAsCisJIDB4MEQsIDB4M0EsIDB4MUMsIDB4MDAsIDB4NjQsIDB4NDcsIDB4RTgsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RTksIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RUEsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUIsCisJIDB4NjQsIDB4NDcsIDB4RUMsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsCisJIDB4RUUsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RUYsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjUsIDB4NDQsIDB4RDgsIDB4ODQsCisJIDB4MDgsIDB4MjUsIDB4NzgsIDB4MDAsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUIsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUIsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUIsCisJIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUIsIDB4M0YsIDB4RjIsIDB4MDQsIDB4NjUsIDB4QzQsIDB4ODMsIDB4MEEsIDB4RTEsIDB4QjMsIDB4RkYsIDB4OUEsIDB4RkYsCisJIDB4Q0IsIDB4ODMsIDB4MDAsIDB4RjQsIDB4MTAsIDB4NjIsIDB4NkMsIDB4NjEsIDB4MEUsIDB4QTMsIDB4QUIsIDB4ODQsIDB4RjIsIDB4QTMsIDB4QTEsIDB4RkYsCisJIDB4MDgsIDB4MDAsIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4MDIsIDB4NjIsIDB4QzksIDB4ODEsIDB4QUIsIDB4ODQsIDB4QTEsIDB4RkYsIDB4MDEsIDB4MDAsCisJIDB4QTIsIDB4REMsIDB4N0EsIDB4RDQsIDB4RkQsIDB4MUMsIDB4QTIsIDB4REMsIDB4MDgsIDB4MjUsIDB4NTQsIDB4MDAsIDB4RjIsIDB4MUQsIDB4N0MsIDB4QTgsCisJIDB4RDksIDB4ODEsIDB4RUYsIDB4MDMsIDB4RkYsIDB4QjEsIDB4MDksIDB4MUUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsIDB4NUEsIDB4RDIsCisJIDB4ODksIDB4RkYsIDB4ODAsIDB4NEYsIDB4NkYsIDB4NDQsIDB4QTIsIDB4REEsIDB4ODgsIDB4RkYsIDB4OTgsIDB4RkYsIDB4MDksIDB4RTEsIDB4QTEsIDB4RkYsCisJIDB4M0QsIDB4NDYsIDB4MDgsIDB4MjUsIDB4M0YsIDB4MDAsIDB4NDAsIDB4RkYsIDB4MEYsIDB4RjAsIDB4MEEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4MTgsIDB4MTQsCisJIDB4RjcsIDB4QjQsIDB4QTIsIDB4REEsIDB4MEQsIDB4NjAsIDB4MkMsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsCisJIDB4MEMsIDB4MDAsIDB4RDEsIDB4RjUsIDB4RDAsIDB4RjQsIDB4MEQsIDB4NjAsIDB4MkMsIDB4NjEsIDB4NTksIDB4RDEsIDB4MzcsIDB4RjgsIDB4MDUsIDB4NjQsCisJIDB4NTksIDB4RDEsIDB4Q0MsIDB4ODQsIDB4QkQsIDB4RDgsIDB4RkMsIDB4MDIsIDB4MkQsIDB4NDYsIDB4QzAsIDB4NjAsIDB4QjAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QTIsIDB4REEsIDB4MkQsIDB4NDYsIDB4M0IsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MTgsIDB4MDAsIDB4RDEsIDB4RjUsCisJIDB4QjcsIDB4RjAsIDB4MkEsIDB4NDQsIDB4QTQsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MjYsIDB4MTAsIDB4MDAsIDB4MkQsIDB4NDYsIDB4NjQsIDB4NDQsCisJIDB4M0EsIDB4RjAsIDB4QkMsIDB4RjAsIDB4NjQsIDB4NUYsIDB4M0QsIDB4RjAsIDB4MDcsIDB4RjQsIDB4RDAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4QTMsCisJIDB4NUIsIDB4RDgsIDB4NjUsIDB4NUMsIDB4NUIsIDB4RDgsIDB4NUIsIDB4REEsIDB4MkQsIDB4NDYsIDB4MDEsIDB4MDAsIDB4MkQsIDB4NDYsIDB4QzAsIDB4NjAsCisJIDB4QjAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OTgsIDB4RkYsIDB4NDMsIDB4RkYsIDB4NDAsIDB4RkYsIDB4QjAsIDB4RkYsIDB4QjEsIDB4RkYsIDB4MkQsIDB4NDYsCisJIDB4MEQsIDB4NjAsIDB4MkMsIDB4NjEsIDB4QTEsIDB4RDMsIDB4MkQsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEEsIDB4MDAsIDB4RDEsIDB4RjUsCisJIDB4RDAsIDB4RjQsIDB4NTksIDB4RDEsIDB4MzcsIDB4RjgsIDB4MDUsIDB4NjQsIDB4NTksIDB4RDEsIDB4Q0MsIDB4ODQsIDB4QkQsIDB4RDgsIDB4RkMsIDB4MDIsCisJIDB4MkQsIDB4NDYsIDB4QzAsIDB4NjAsIDB4OUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OTgsIDB4RkYsIDB4MDksIDB4RTEsIDB4QTEsIDB4RkYsIDB4M0QsIDB4NDYsCisJIDB4MDgsIDB4MjUsIDB4RTAsIDB4MDEsIDB4MEYsIDB4RjIsIDB4NDAsIDB4RkYsIDB4MDIsIDB4QkMsIDB4QTIsIDB4REEsIDB4QzAsIDB4NjAsIDB4QjAsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4MEQsIDB4NjAsIDB4MkMsIDB4NjIsIDB4QTIsIDB4REIsIDB4MDQsIDB4NjQsIDB4MjIsIDB4RkEsIDB4ODcsIDB4RjQsCisJIDB4ODgsIDB4RjEsIDB4RkYsIDB4RkYsIDB4RDMsIDB4ODAsIDB4M0IsIDB4RjIsIDB4RTcsIDB4MDMsIDB4NjAsIDB4NDcsIDB4QzAsIDB4QjcsIDB4MDIsIDB4RkUsCisJIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4MDAsIDB4QTgsIDB4NDAsIDB4NEEsIDB4MTYsIDB4MDMsIDB4RTAsIDB4ODEsIDB4NjEsIDB4NDMsCisJIDB4NDIsIDB4RkUsIDB4MDAsIDB4NjQsIDB4RjAsIDB4ODQsIDB4RkUsIDB4MUYsIDB4NDAsIDB4NEEsIDB4RTEsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MkQsIDB4NDYsCisJIDB4MDcsIDB4RjQsIDB4RTAsIDB4ODEsIDB4MzcsIDB4RjAsIDB4MkEsIDB4NDcsIDB4MEMsIDB4NjAsIDB4N0EsIDB4NjMsIDB4QTAsIDB4ODQsIDB4NDcsIDB4OUMsCisJIDB4MTAsIDB4MDMsIDB4N0MsIDB4NDQsIDB4QTAsIDB4NjMsIDB4MTEsIDB4MDAsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEEsIDB4NjMsIDB4NDYsIDB4MzcsIDB4RjAsCisJIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDAsIDB4ODAsIDB4MkIsIDB4MDUsIDB4MDAsIDB4MDAsIDB4NjAsIDB4NzAsIDB4N0MsIDB4MDAsIDB4NjAsIDB4OTAsIDB4NjMsCisJIDB4MDQsIDB4MDAsIDB4MkQsIDB4NDYsIDB4QzIsIDB4NjAsIDB4MDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkQsIDB4NDYsIDB4Q0UsIDB4RkIsIDB4Q0YsIDB4RjksCisJIDB4RDAsIDB4RkQsIDB4MDcsIDB4RjIsIDB4RDEsIDB4RkIsIDB4NjAsIDB4NDYsIDB4MzcsIDB4RjAsIDB4MkEsIDB4NDQsIDB4MEQsIDB4NjAsIDB4MkMsIDB4NjIsCisJIDB4NUEsIDB4RDksIDB4MDAsIDB4NjUsIDB4NDUsIDB4NEIsIDB4QTAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4M0YsIDB4MjIsIDB4MDUsIDB4MDAsIDB4OTAsIDB4ODQsCisJIDB4MzcsIDB4RkEsIDB4MDEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MjEsIDB4MDAsIDB4QUQsIDB4NDYsIDB4MEEsIDB4QTMsIDB4M0QsIDB4RjIsIDB4QUQsIDB4NDYsCisJIDB4QTMsIDB4RDAsIDB4QUQsIDB4NDYsIDB4RDAsIDB4ODAsIDB4M0MsIDB4RjIsIDB4QUQsIDB4NDYsIDB4MDIsIDB4MDMsIDB4MTYsIDB4MDcsIDB4MTQsIDB4MDQsCisJIDB4NUIsIDB4RDAsIDB4QUQsIDB4NDYsIDB4RDAsIDB4ODAsIDB4M0IsIDB4RjIsIDB4MDMsIDB4MDMsIDB4QUQsIDB4NDYsIDB4MEUsIDB4MDcsIDB4MEMsIDB4MDQsCisJIDB4M0EsIDB4RjAsIDB4QUQsIDB4NDYsIDB4NUIsIDB4RDAsIDB4NjQsIDB4NUYsIDB4RDAsIDB4ODAsIDB4MkIsIDB4NDQsIDB4MTgsIDB4MDcsIDB4MDQsIDB4MDMsCisJIDB4RDAsIDB4ODQsIDB4MTAsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MTMsIDB4MDcsIDB4N0YsIDB4MDEsIDB4MDEsIDB4NjQsIDB4MEQsIDB4NjAsIDB4MkMsIDB4NjIsCisJIDB4QTIsIDB4REIsIDB4MkQsIDB4NDYsIDB4MEQsIDB4NjAsIDB4M0MsIDB4NjIsIDB4ODAsIDB4RkYsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4QTIsIDB4REIsCisJIDB4QzIsIDB4NjAsIDB4QUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODUsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MDgsIDB4MjUsIDB4NTMsIDB4MDEsIDB4MkQsIDB4NDYsCisJIDB4MEQsIDB4NjAsIDB4M0MsIDB4NjIsIDB4ODAsIDB4RkYsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4QTIsIDB4REIsIDB4QzMsIDB4NjAsIDB4MzMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4ODUsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MDgsIDB4MjUsIDB4NDUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MEYsIDB4NjQsIDB4QzEsIDB4NjAsCisJIDB4NzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjQsIDB4NjYsIDB4NDEsIDB4MDMsIDB4RjIsIDB4MDQsIDB4RjIsIDB4NDAsIDB4NDIsIDB4MDUsIDB4RjIsCisJIDB4NDAsIDB4NDMsIDB4NDAsIDB4NDQsIDB4NjEsIDB4NDYsIDB4M0MsIDB4RjIsIDB4M0QsIDB4RjIsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDEsIDB4MEQsIDB4NjAsCisJIDB4NzAsIDB4NjUsIDB4MDAsIDB4NjEsIDB4Q0YsIDB4RjEsIDB4Q0UsIDB4RjUsIDB4NDQsIDB4NEMsIDB4MkMsIDB4NUMsIDB4RTksIDB4ODAsIDB4MDAsIDB4NjQsCisJIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4QzAsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjQsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjAsIDB4NDQsIDB4NDAsIDB4ODAsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjAsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjEsIDB4NDQsIDB4NDAsIDB4ODEsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjEsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjIsIDB4NDQsIDB4NDAsIDB4ODIsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjIsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjMsIDB4NDQsIDB4NDAsIDB4ODMsIDB4RjIsIDB4QTMsIDB4QkQsIDB4RDIsIDB4MjMsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjQsIDB4NDQsIDB4QzAsIDB4OUMsIDB4NDEsIDB4ODQsIDB4REQsIDB4ODEsIDB4MDgsIDB4MkEsIDB4QTcsIDB4MDEsIDB4MEQsIDB4NjAsIDB4MkUsIDB4NjEsCisJIDB4MDUsIDB4NjQsIDB4RDAsIDB4RjQsIDB4RDEsIDB4RjUsIDB4RkUsIDB4QTMsIDB4NUIsIDB4RDAsIDB4Q0MsIDB4ODQsIDB4NTksIDB4RDksIDB4RkMsIDB4MDIsCisJIDB4RDAsIDB4RjMsIDB4RDEsIDB4RjUsIDB4NjAsIDB4NDIsIDB4MjAsIDB4NDQsIDB4QTIsIDB4REEsIDB4MjEsIDB4NDQsIDB4NUEsIDB4REEsIDB4MjIsIDB4NDQsCisJIDB4NUEsIDB4REEsIDB4MjMsIDB4NDQsIDB4NUEsIDB4REEsIDB4MjQsIDB4NDQsIDB4NUEsIDB4REEsIDB4NjEsIDB4NDYsIDB4MEQsIDB4NjAsIDB4M0MsIDB4NjIsCisJIDB4QTIsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDEsIDB4RDAsIDB4RjMsIDB4RDEsIDB4RjUsIDB4QTAsIDB4RDIsIDB4NUEsIDB4RDAsCisJIDB4NDAsIDB4NDAsIDB4NDQsIDB4NDEsIDB4NUEsIDB4RDIsIDB4NUEsIDB4RDAsIDB4NDAsIDB4NDIsIDB4NUEsIDB4RDAsIDB4NDQsIDB4NDMsIDB4NjEsIDB4NDYsCisJIDB4QkEsIDB4RjAsIDB4M0IsIDB4RjIsIDB4NDQsIDB4NDQsIDB4NjUsIDB4NUYsIDB4NDAsIDB4ODUsIDB4Q0YsIDB4RjQsIDB4Q0UsIDB4RjUsIDB4NDMsIDB4NEMsCisJIDB4MEQsIDB4NjAsIDB4NzAsIDB4NjUsIDB4QkQsIDB4RDIsIDB4MjUsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjAsIDB4NDQsCisJIDB4NDAsIDB4ODAsIDB4QkQsIDB4RDIsIDB4MjAsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjEsIDB4NDQsIDB4NDAsIDB4ODEsCisJIDB4QkQsIDB4RDIsIDB4MjEsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjIsIDB4NDQsIDB4NDAsIDB4ODIsIDB4QkQsIDB4RDIsCisJIDB4MjIsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjMsIDB4NDQsIDB4NDAsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjMsIDB4NUMsCisJIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjQsIDB4NDQsIDB4NDAsIDB4ODQsIDB4QkQsIDB4RDIsIDB4MjQsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjUsIDB4NDQsIDB4NDAsIDB4ODUsIDB4NjEsIDB4NDYsIDB4M0EsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsCisJIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RTIsIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4Q0UsIDB4RjUsIDB4QkQsIDB4RDIsIDB4MjUsIDB4NUMsIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsCisJIDB4MjAsIDB4NUMsIDB4NDAsIDB4ODAsIDB4MjAsIDB4NDQsIDB4RTQsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjAsIDB4NDcsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUIsCisJIDB4QkQsIDB4RDIsIDB4MjAsIDB4NUMsIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjEsIDB4NUMsIDB4NDAsIDB4ODEsIDB4MjEsIDB4NDQsCisJIDB4RTYsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjEsIDB4NDcsIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjEsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsCisJIDB4MjIsIDB4NUMsIDB4NDAsIDB4ODIsIDB4MjIsIDB4NDQsIDB4RTgsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjIsIDB4NDcsIDB4RTksIDB4N0YsIDB4QTAsIDB4NUIsCisJIDB4MjIsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjMsIDB4NUMsIDB4NDAsIDB4ODMsIDB4MjMsIDB4NDQsIDB4RUEsIDB4N0YsIDB4QTAsIDB4NUIsCisJIDB4MjMsIDB4NDcsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjMsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjQsIDB4NUMsIDB4NDAsIDB4ODQsCisJIDB4MjQsIDB4NDQsIDB4RUMsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjQsIDB4NDcsIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjQsIDB4NDQsIDB4RTgsIDB4ODAsCisJIDB4RjgsIDB4ODQsIDB4MjUsIDB4NUMsIDB4NDAsIDB4ODUsIDB4MjUsIDB4NDQsIDB4RUUsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjUsIDB4NDcsIDB4RUYsIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4MkMsIDB4NDMsIDB4QTMsIDB4RDIsIDB4MjUsIDB4NUMsIDB4OTAsIDB4ODEsIDB4RTksIDB4ODQsIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUIsCisJIDB4MEQsIDB4NjAsIDB4M0MsIDB4NjIsIDB4QTIsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0IsIDB4RjMsIDB4NUEsIDB4RDMsIDB4NDAsIDB4NDgsCisJIDB4NUEsIDB4RDMsIDB4NDAsIDB4NDksIDB4NDAsIDB4NEEsIDB4MDAsIDB4NjAsIDB4NzAsIDB4N0MsIDB4NDQsIDB4NEQsIDB4NDUsIDB4RjIsIDB4NDYsIDB4RjIsCisJIDB4NDAsIDB4NDcsIDB4NDAsIDB4NDYsIDB4MEQsIDB4NjAsIDB4NzAsIDB4NjUsIDB4MDAsIDB4NjEsIDB4MkQsIDB4NUMsIDB4RTksIDB4ODAsIDB4MDAsIDB4NjQsCisJIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4QzAsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MkEsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjYsIDB4NDQsIDB4NDAsIDB4ODYsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjYsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjcsIDB4NDQsIDB4NDAsIDB4ODcsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjcsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjgsIDB4NDQsIDB4NDAsIDB4ODgsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjgsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjksIDB4NDQsIDB4NDAsIDB4ODksIDB4RjIsIDB4QTMsIDB4QkQsIDB4RDIsIDB4MjksIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MkEsIDB4NDQsIDB4QzAsIDB4OUMsIDB4NDEsIDB4OEEsIDB4REQsIDB4ODEsIDB4MDgsIDB4MkEsIDB4QTcsIDB4MDEsIDB4MjYsIDB4NDQsIDB4NDAsIDB4RkEsCisJIDB4MjcsIDB4NDQsIDB4NDEsIDB4RkEsIDB4MjgsIDB4NDQsIDB4NDIsIDB4RkEsIDB4MjksIDB4NDQsIDB4NDMsIDB4RkEsIDB4MkEsIDB4NDQsIDB4NDQsIDB4RkEsCisJIDB4MEQsIDB4NjAsIDB4M0UsIDB4NjIsIDB4QTIsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4ODAsIDB4N0MsIDB4NDQsIDB4NEQsCisJIDB4MkQsIDB4NDIsIDB4QTIsIDB4RDIsIDB4NUEsIDB4RDAsIDB4NDAsIDB4NDYsIDB4NDQsIDB4NDcsIDB4NUEsIDB4RDIsIDB4NUEsIDB4RDAsIDB4NDAsIDB4NDgsCisJIDB4NUEsIDB4RDAsIDB4NDQsIDB4NDksIDB4NDcsIDB4RjIsIDB4NDQsIDB4NEEsIDB4NDAsIDB4OEIsIDB4NjAsIDB4NUMsIDB4NjQsIDB4NDcsIDB4RTAsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4RkYsIDB4QjQsIDB4MjAsIDB4QkMsIDB4N0YsIDB4QjQsIDB4RTEsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTIsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4MDAsIDB4NjAsIDB4NzAsIDB4NjMsIDB4MEQsIDB4NjAsIDB4NzAsIDB4NjUsIDB4QkQsIDB4RDIsIDB4MkIsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjYsIDB4NDQsIDB4NDAsIDB4ODYsIDB4QkQsIDB4RDIsIDB4MjYsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsCisJIDB4OTAsIDB4OUMsIDB4MjcsIDB4NDQsIDB4NDAsIDB4ODcsIDB4QkQsIDB4RDIsIDB4MjcsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjgsIDB4NDQsIDB4NDAsIDB4ODgsIDB4QkQsIDB4RDIsIDB4MjgsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjksIDB4NDQsCisJIDB4NDAsIDB4ODksIDB4QkQsIDB4RDIsIDB4MjksIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MkEsIDB4NDQsIDB4NDAsIDB4OEEsCisJIDB4QkQsIDB4RDIsIDB4MkEsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MkIsIDB4NDQsIDB4NDAsIDB4OEIsIDB4QkQsIDB4RDIsCisJIDB4MkIsIDB4NUMsIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjYsIDB4NUMsIDB4NDAsIDB4ODYsIDB4MjYsIDB4NDQsIDB4RTQsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4MjYsIDB4NDcsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUEsIDB4QkQsIDB4RDIsIDB4MjYsIDB4NUMsIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODAsCisJIDB4RjgsIDB4ODQsIDB4MjcsIDB4NUMsIDB4NDAsIDB4ODcsIDB4MjcsIDB4NDQsIDB4RTYsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjcsIDB4NDcsIDB4RTcsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4MjcsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjgsIDB4NUMsIDB4NDAsIDB4ODgsIDB4MjgsIDB4NDQsIDB4RTgsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4MjgsIDB4NDcsIDB4RTksIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjgsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjksIDB4NUMsCisJIDB4NDAsIDB4ODksIDB4MjksIDB4NDQsIDB4RUEsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjksIDB4NDcsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjksIDB4NDQsCisJIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MkEsIDB4NUMsIDB4NDAsIDB4OEEsIDB4MkEsIDB4NDQsIDB4RUMsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MkEsIDB4NDcsCisJIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MkEsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MkIsIDB4NUMsIDB4NDAsIDB4OEIsIDB4MkIsIDB4NDQsCisJIDB4RUUsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MkIsIDB4NDcsIDB4RUYsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MzgsIDB4RjAsIDB4MkIsIDB4NDQsIDB4OTAsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MEQsIDB4NjAsIDB4M0UsIDB4NjIsIDB4QTIsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NDIsIDB4RkYsIDB4NDAsIDB4RkYsIDB4REQsIDB4RkUsIDB4QUQsIDB4NEYsIDB4MDAsIDB4N0YsIDB4MDEsIDB4QkMsIDB4QTAsIDB4NUQsIDB4MDAsIDB4RUUsCisJIDB4MTksIDB4NjEsIDB4Q0QsIDB4ODEsIDB4RkYsIDB4RkYsIDB4RkQsIDB4MDIsIDB4NDMsIDB4NDUsIDB4MjAsIDB4NDQsIDB4NjAsIDB4QkMsIDB4NDAsIDB4NDAsCisJIDB4MDIsIDB4NjAsIDB4RUUsIDB4NjMsIDB4NjUsIDB4RjMsIDB4ODIsIDB4RkQsIDB4NDAsIDB4N0YsIDB4ODMsIDB4RkIsIDB4MDUsIDB4NjQsIDB4ODQsIDB4RkIsCisJIDB4REYsIDB4RkUsIDB4MTksIDB4RkYsIDB4QzUsIDB4NjAsIDB4NkQsIDB4NjQsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDIsIDB4MDAsIDB4QzUsIDB4NjAsCisJIDB4NkQsIDB4NjQsIDB4ODUsIDB4RkIsIDB4QzAsIDB4NjAsIDB4OUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RUUsIDB4QUQsIDB4NEYsIDB4MDAsIDB4N0YsCisJIDB4MDEsIDB4QkMsIDB4QTAsIDB4NUQsIDB4MTksIDB4NjEsIDB4Q0QsIDB4ODEsIDB4RkYsIDB4RkYsIDB4RkQsIDB4MDIsIDB4QUQsIDB4NEYsIDB4MDAsIDB4N0YsCisJIDB4MDEsIDB4QkMsIDB4QTAsIDB4NUQsIDB4MDAsIDB4RUUsIDB4MTUsIDB4NjAsIDB4QTIsIDB4RTcsIDB4MUMsIDB4NjAsIDB4NjgsIDB4NjMsIDB4MUMsIDB4NjAsCisJIDB4REMsIDB4NjUsIDB4REYsIDB4RkUsIDB4ODAsIDB4RTEsIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDgsIDB4NjAsIDB4NDcsIDB4ODAsIDB4QkMsCisJIDB4MDAsIDB4N0YsIDB4NjAsIDB4NEEsIDB4RDcsIDB4ODAsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjUsIDB4MDIsIDB4MUMsIDB4NjAsIDB4REMsIDB4NjMsCisJIDB4MUQsIDB4NjAsIDB4REUsIDB4NjUsIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDgsIDB4NjAsIDB4NDcsIDB4ODAsIDB4QkMsIDB4MDAsIDB4N0YsCisJIDB4NjAsIDB4NEEsIDB4RDcsIDB4ODAsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjUsIDB4MDIsIDB4M0YsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MDAsIDB4MDAsCisJIDB4MDEsIDB4NjgsIDB4RkYsIDB4NkEsIDB4QkYsIDB4RkUsIDB4QzYsIDB4NjAsIDB4NTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4NDAsIDB4MjAsIDB4MkIsCisJIDB4QUQsIDB4MDAsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MzgsIDB4NjksIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjgsIDB4NDQsIDB4MDEsIDB4MkEsCisJIDB4QTUsIDB4MDAsIDB4MUYsIDB4NjAsIDB4MUEsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjgsCisJIDB4QTIsIDB4REIsIDB4NjUsIDB4RjEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4OUMsIDB4MDEsIDB4MDAsIDB4NjUsIDB4RjEsIDB4REQsIDB4RkUsCisJIDB4QUQsIDB4NEYsIDB4MDAsIDB4N0YsIDB4MDEsIDB4QkMsIDB4QTAsIDB4NUQsIDB4MDAsIDB4RUUsIDB4NDMsIDB4NDUsIDB4MjAsIDB4NDQsIDB4MjAsIDB4QkMsCisJIDB4NDAsIDB4NDAsIDB4MDIsIDB4NjAsIDB4RUUsIDB4NjQsIDB4ODIsIDB4RkIsIDB4ODMsIDB4RjksIDB4MDUsIDB4NjQsIDB4ODQsIDB4RkIsIDB4REYsIDB4RkUsCisJIDB4MTksIDB4RkYsIDB4ODMsIDB4MDAsIDB4MjAsIDB4NDQsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4NDMsIDB4NDUsIDB4QTQsIDB4RDEsIDB4REEsIDB4ODMsCisJIDB4QzMsIDB4ODUsIDB4ODAsIDB4RTEsIDB4REYsIDB4RkUsIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDgsIDB4NjAsIDB4NDcsIDB4ODAsIDB4QkMsCisJIDB4MDAsIDB4N0YsIDB4NjAsIDB4NEEsIDB4RDcsIDB4ODAsIDB4QTEsIDB4RkYsIDB4RjYsIDB4MDIsIDB4QkYsIDB4RkUsIDB4NkUsIDB4MDAsIDB4M0YsIDB4NDAsCisJIDB4NDAsIDB4MjYsIDB4MTMsIDB4MDAsIDB4MEIsIDB4NjAsIDB4RjgsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4OTAsIDB4ODQsCisJIDB4QTAsIDB4NTAsIDB4RjgsIDB4QTIsIDB4QTIsIDB4RDEsIDB4MEEsIDB4NjAsIDB4MTksIDB4NjQsIDB4OTAsIDB4ODQsIDB4QTAsIDB4NTIsIDB4MDYsIDB4QTIsCisJIDB4QTIsIDB4RDEsIDB4NDYsIDB4NjAsIDB4MDksIDB4NjQsIDB4OTAsIDB4ODQsIDB4QTAsIDB4NTAsIDB4QUQsIDB4NEYsIDB4RkUsIDB4QjQsIDB4QTAsIDB4NUQsCisJIDB4QUQsIDB4NEYsIDB4RkQsIDB4QjQsIDB4QTAsIDB4NUQsIDB4MDIsIDB4RUUsIDB4QkQsIDB4RkUsIDB4NTAsIDB4MDAsIDB4ODAsIDB4RTEsIDB4MDEsIDB4MTYsCisJIDB4RkUsIDB4MDEsIDB4NjQsIDB4NDgsIDB4OTIsIDB4NkEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjgsIDB4NDAsIDB4MUYsIDB4NjAsIDB4MDgsIDB4NjQsCisJIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjgsIDB4QTIsIDB4REIsIDB4M0YsIDB4MDAsIDB4ODAsIDB4RTEsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDEsIDB4NjgsIDB4QTcsIDB4NkEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjgsIDB4NDAsIDB4MzYsIDB4MDAsCisJIDB4MjAsIDB4NDQsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4ODAsIDB4RTEsIDB4NjQsIDB4NDYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MjEsIDB4NjksCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjgsIDB4NUUsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MjIsIDB4NjksIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NjgsIDB4NUYsIDB4MjYsIDB4RkEsIDB4MUMsIDB4RjIsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4M0EsIDB4NjksIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NjgsIDB4NUYsIDB4MjcsIDB4RkEsIDB4MUIsIDB4MDAsIDB4MjAsIDB4NDQsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4NDMsIDB4NDUsIDB4QkUsIDB4RDUsCisJIDB4QTQsIDB4RDIsIDB4NUEsIDB4ODYsIDB4RUYsIDB4QTAsIDB4MTEsIDB4NjEsIDB4MDEsIDB4MDYsIDB4NjAsIDB4NDEsIDB4MUMsIDB4NjAsIDB4NDYsIDB4NjMsCisJIDB4ODAsIDB4RTEsIDB4QkQsIDB4RDMsIDB4MjYsIDB4NDIsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjAsIDB4NDksIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NjgsIDB4NDQsIDB4Q0QsIDB4ODEsIDB4QTIsIDB4REEsIDB4NUEsIDB4ODYsIDB4RjQsIDB4MDIsIDB4MjUsIDB4NDMsIDB4MjEsIDB4RTEsIDB4MDAsIDB4NjQsCisJIDB4QkYsIDB4REIsIDB4MjAsIDB4NDQsIDB4MjAsIDB4MkEsIDB4MDcsIDB4MDAsIDB4MDcsIDB4QjQsIDB4MDQsIDB4MzYsIDB4QzMsIDB4RkUsIDB4MDYsIDB4MzYsCisJIDB4Q0MsIDB4RkUsIDB4MDcsIDB4MzYsIDB4RDUsIDB4RkUsIDB4MjAsIDB4NDQsIDB4RDgsIDB4QjQsIDB4NDAsIDB4NDAsIDB4MjAsIDB4NDQsIDB4NDAsIDB4MkEsCisJIDB4MDcsIDB4MDAsIDB4OUYsIDB4RkUsIDB4MUUsIDB4MDUsIDB4QkYsIDB4QjQsIDB4NDAsIDB4NDAsIDB4ODUsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MUIsIDB4NjAsIDB4RTYsIDB4NjMsIDB4QkQsIDB4RDMsIDB4MDIsIDB4NjEsIDB4MTcsIDB4MUIsIDB4MDQsIDB4QTMsIDB4QkQsIDB4RDMsIDB4MDIsIDB4NjEsCisJIDB4MTMsIDB4MUIsIDB4MDQsIDB4QTMsIDB4QkQsIDB4RDMsIDB4MDIsIDB4NjEsIDB4MEYsIDB4MUIsIDB4MDQsIDB4QTMsIDB4QkQsIDB4RDMsIDB4MDQsIDB4NjEsCisJIDB4MEIsIDB4MUIsIDB4MDQsIDB4QTMsIDB4QkQsIDB4RDMsIDB4MDYsIDB4NjEsIDB4MDcsIDB4MUIsIDB4MDQsIDB4QTMsIDB4QkQsIDB4RDMsIDB4MDcsIDB4NjEsCisJIDB4MDMsIDB4MUIsIDB4QzAsIDB4NjAsIDB4OUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RDEsIDB4NDAsIDB4NDQsIDB4MjAsIDB4NDQsIDB4MDcsIDB4QjUsCisJIDB4RDQsIDB4ODUsIDB4MzUsIDB4ODAsIDB4MjQsIDB4NDUsIDB4MUMsIDB4NjAsIDB4MjIsIDB4NjQsIDB4NDQsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4ODAsIDB4RTEsIDB4NDMsIDB4NDUsIDB4MjAsIDB4NDQsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4NjQsIDB4NDMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDEsCisJIDB4NDAsIDB4NDQsIDB4MTAsIDB4MjcsIDB4MTAsIDB4MDAsIDB4RkYsIDB4NjAsIDB4N0YsIDB4NjUsIDB4MTUsIDB4NjAsIDB4QTIsIDB4NjQsIDB4MjQsIDB4NDAsCisJIDB4MDgsIDB4MkIsIDB4QTQsIDB4ODQsIDB4QTAsIDB4NTcsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDksIDB4RkYsIDB4RkYsIDB4NjgsIDB4NDQsIDB4MDEsIDB4MTYsCisJIDB4RkQsIDB4MDEsIDB4MDAsIDB4N0YsIDB4QTMsIDB4REIsIDB4QTEsIDB4MDEsIDB4ODAsIDB4RTEsIDB4NDMsIDB4NDUsIDB4MjAsIDB4NDQsIDB4MjAsIDB4QkMsCisJIDB4NDAsIDB4NDAsIDB4NjQsIDB4NDMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDEsIDB4NDAsIDB4NDQsIDB4MTAsIDB4MkIsIDB4MTEsIDB4MDAsIDB4QTMsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4ODAsIDB4RTcsIDB4MjQsIDB4NDAsIDB4MDcsIDB4MjcsIDB4MDIsIDB4MDAsIDB4NTAsIDB4RUMsIDB4MDAsIDB4MDAsCisJIDB4NjAsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MjQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4NDAsIDB4RUMsIDB4MEYsIDB4MDAsCisJIDB4MTUsIDB4NjAsIDB4MjIsIDB4NjQsIDB4MjQsIDB4NDAsIDB4MDgsIDB4MjcsIDB4ODAsIDB4QkMsIDB4QTMsIDB4RDMsIDB4QTAsIDB4NTcsIDB4NjAsIDB4NDgsCisJIDB4NjQsIDB4NDQsIDB4ODAsIDB4QkMsIDB4RkYsIDB4QjQsIDB4NjAsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NzUsIDB4MDEsCisJIDB4QTIsIDB4RkYsIDB4MzAsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MDAsIDB4RTEsIDB4MDEsIDB4MDIsIDB4QTEsIDB4RkYsIDB4ODYsIDB4RkYsIDB4ODgsIDB4RkYsCisJIDB4NUMsIDB4NDYsIDB4NUMsIDB4NDksIDB4NUMsIDB4NDAsIDB4REUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0UsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4MDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTcsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4REIsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4M0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTMsIDB4RTEsIDB4QTMsIDB4RkYsIDB4QzcsIDB4NjAsIDB4MkUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4NjAsIDB4ODcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4Q0UsIDB4NjIsIDB4QTIsIDB4RDEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MjIsIDB4MDAsIDB4NzUsIDB4RjMsIDB4MzEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MUUsIDB4MDAsCisJIDB4REMsIDB4ODQsIDB4MDEsIDB4QjQsIDB4NzUsIDB4RkIsIDB4MDksIDB4MDIsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsCisJIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTEsIDB4MDAsIDB4MEYsIDB4NjAsIDB4REMsIDB4NjIsIDB4QTIsIDB4RDEsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDgsIDB4MDAsIDB4QTksIDB4RkUsIDB4RTQsIDB4MDUsCisJIDB4QUIsIDB4RkUsIDB4MDcsIDB4MDUsIDB4QTgsIDB4RkUsIDB4RDQsIDB4MDUsIDB4QUEsIDB4RkUsIDB4RDUsIDB4MDUsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4ODUsIDB4M0UsIDB4MUIsIDB4NjAsIDB4QzQsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MDMsIDB4MDIsCisJIDB4QzcsIDB4NjAsIDB4MkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDUsIDB4RDQsIDB4ODAsIDB4MEYsIDB4RjAsIDB4RjksIDB4MDMsIDB4NjQsIDB4NDQsCisJIDB4NzAsIDB4QjAsIDB4NzAsIDB4MkEsIDB4MTQsIDB4MDAsIDB4MUYsIDB4NjAsIDB4MTgsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjgsIDB4QTIsIDB4REIsIDB4QTIsIDB4RkYsIDB4OEYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4RkUsIDB4QTAsCisJIDB4OEYsIDB4RkIsIDB4MDEsIDB4MDcsIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsIDB4Q0IsIDB4NjAsIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsCisJIDB4MDIsIDB4MjYsIDB4MDksIDB4MDAsIDB4NjYsIDB4NDUsIDB4MDksIDB4RjQsIDB4MEYsIDB4RjIsIDB4MDIsIDB4MTgsIDB4NjUsIDB4NDYsIDB4RTMsIDB4MUIsCisJIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDYsIDB4Q0IsIDB4MDEsIDB4QTIsIDB4RkYsIDB4OEYsIDB4RjMsIDB4NDYsIDB4NDYsIDB4Q0MsIDB4ODQsIDB4RkUsIDB4QTAsCisJIDB4OEYsIDB4RkIsIDB4MDEsIDB4MDcsIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MEYsIDB4RjAsIDB4QTMsIDB4RkMsIDB4NjQsIDB4NDQsIDB4ODAsIDB4MjYsCisJIDB4MjIsIDB4MDAsIDB4OTgsIDB4RjEsIDB4MUUsIDB4NjAsIDB4RjgsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsCisJIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsCisJIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MzIsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDcsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MDQsIDB4MDAsCisJIDB4MDIsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MjMsIDB4RkEsIDB4Q0IsIDB4NjAsIDB4QzgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4Q0IsIDB4NjAsIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjYsIDB4M0YsIDB4MDAsIDB4MkEsIDB4RjIsIDB4NjAsIDB4NjMsIDB4NjAsIDB4NDAsCisJIDB4MDIsIDB4MkIsIDB4NjYsIDB4NjMsIDB4QkUsIDB4RDIsIDB4NjksIDB4RjEsIDB4QTMsIDB4RDIsIDB4RDAsIDB4ODAsIDB4NjgsIDB4RjEsIDB4MTgsIDB4MDIsCisJIDB4QkYsIDB4RDIsIDB4RDAsIDB4ODAsIDB4NjcsIDB4RjEsIDB4MTQsIDB4MDIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MTEsIDB4MDIsIDB4OTgsIDB4RjEsCisJIDB4MUYsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsCisJIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsCisJIDB4MzIsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDcsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MkEsIDB4MDYsIDB4MDAsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4Q0IsIDB4NjAsIDB4QzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4QjAsIDB4M0EsIDB4MDYsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4QzgsIDB4NjAsIDB4NkQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4Q0IsIDB4NjAsIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDQsIDB4MDEsIDB4MkEsIDB4NEEsIDB4MDAsIDB4MjAsIDB4NjAsCisJIDB4NkMsIDB4NjMsIDB4QkYsIDB4RDMsIDB4MDAsIDB4NjUsIDB4QjQsIDB4ODEsIDB4REIsIDB4ODMsIDB4M0QsIDB4MDMsIDB4QkYsIDB4RDMsIDB4QTMsIDB4RDMsCisJIDB4NDAsIDB4NDgsIDB4QkUsIDB4RDMsIDB4NDAsIDB4NEEsIDB4MkUsIDB4RjAsIDB4NDAsIDB4NEMsIDB4RDAsIDB4ODAsIDB4MkQsIDB4RjAsIDB4MDgsIDB4MDIsCisJIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MkMsIDB4RjAsIDB4MDQsIDB4MDIsIDB4MjgsIDB4NDQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MkIsIDB4MDMsCisJIDB4MzEsIDB4RjAsIDB4MkMsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzAsIDB4RjAsIDB4MDgsIDB4MDIsIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MkYsIDB4RjAsCisJIDB4MDQsIDB4MDIsIDB4MjgsIDB4NDQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MUUsIDB4MDMsIDB4MzQsIDB4RjAsIDB4MkMsIDB4NDQsIDB4RDAsIDB4ODAsCisJIDB4MzMsIDB4RjAsIDB4MDgsIDB4MDIsIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzIsIDB4RjAsIDB4MDQsIDB4MDIsIDB4MjgsIDB4NDQsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MTEsIDB4MDMsIDB4MzgsIDB4RjAsIDB4MkMsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzcsIDB4RjAsIDB4MDgsIDB4MDIsIDB4MkEsIDB4NDQsCisJIDB4RDAsIDB4ODAsIDB4MzYsIDB4RjAsIDB4MDQsIDB4MDIsIDB4MjgsIDB4NDQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDMsIDB4RkEsIDB4QTEsCisJIDB4MDYsIDB4QTMsIDB4QjcsIDB4MDMsIDB4QzMsIDB4MDEsIDB4MDcsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MjMsIDB4RkEsIDB4Q0IsIDB4NjAsIDB4QzgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4MEYsIDB4RjAsIDB4NjAsIDB4NDUsIDB4QTQsIDB4MzYsIDB4MDgsIDB4MDAsIDB4MEMsIDB4QjQsIDB4MDQsIDB4MzYsCisJIDB4MDIsIDB4MDAsIDB4MEMsIDB4M0EsIDB4MDYsIDB4MDAsIDB4Q0IsIDB4NjAsIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QzksIDB4NjAsIDB4NDIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjYsIDB4RjIsIDB4NTAsIDB4RjEsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0UsIDB4RDAsIDB4ODQsIDB4MUYsIDB4QTQsIDB4MDYsIDB4MEUsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MDcsIDB4MDAsIDB4QzIsIDB4QTQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODcsIDB4RjgsIDB4QkYsIDB4QzAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MEYsIDB4RjAsCisJIDB4NjUsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MjIsIDB4MDAsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MUYsIDB4MDAsIDB4MDcsIDB4RjQsIDB4MzYsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4MzcsIDB4QjQsIDB4MjYsIDB4NDYsIDB4MTksIDB4MDIsIDB4MkMsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsCisJIDB4MTEsIDB4MDAsIDB4OTgsIDB4RjEsIDB4MUUsIDB4NjAsIDB4RkUsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsCisJIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsCisJIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4Q0IsIDB4NjAsIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4NjQsIDB4NDAsIDB4NjAsIDB4MjYsCisJIDB4MDMsIDB4MDAsIDB4QzksIDB4NjAsIDB4MUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4M0EsIDB4RjMsIDB4MDEsIDB4OTgsIDB4RjEsCisJIDB4MUUsIDB4NjAsIDB4RjIsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsCisJIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsCisJIDB4MjcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4M0IsIDB4MTIsIDB4MDAsIDB4OTgsIDB4RjEsIDB4MUYsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsCisJIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MTMsIDB4MDAsIDB4MDIsIDB4M0IsCisJIDB4MTEsIDB4MDAsIDB4OTgsIDB4RjEsIDB4MUYsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsCisJIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsCisJIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MkEsIDB4RjIsIDB4MjgsIDB4NDEsIDB4NDAsIDB4QTgsIDB4MDEsIDB4QjEsIDB4MDIsIDB4MDIsIDB4NUYsIDB4MDIsCisJIDB4ODksIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MkIsIDB4MDAsIDB4OTgsIDB4RjEsIDB4MUUsIDB4NjAsIDB4RjAsIDB4NjQsIDB4QTAsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsCisJIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MUIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsCisJIDB4OTgsIDB4RjEsIDB4MUUsIDB4NjAsIDB4RjYsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4ODAsIDB4QzQsIDB4ODQsIDB4MEIsIDB4MDMsCisJIDB4MDcsIDB4MDUsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDksIDB4MDQsIDB4QzYsIDB4RkUsIDB4MDcsIDB4MDAsCisJIDB4MDAsIDB4NjQsIDB4QjgsIDB4ODQsIDB4QTIsIDB4REIsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MEYsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MjgsIDB4MDAsIDB4MzIsIDB4NDQsIDB4MDIsIDB4MjYsIDB4MjUsIDB4MDAsIDB4MTAsIDB4MkIsCisJIDB4MjYsIDB4MDAsIDB4MjAsIDB4NjAsIDB4NkMsIDB4NjMsIDB4QkYsIDB4RDMsIDB4MkMsIDB4RjAsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDEsIDB4MEQsIDB4MDMsCisJIDB4NTAsIDB4RkUsIDB4QkQsIDB4RDMsIDB4MkQsIDB4RjAsIDB4RDAsIDB4ODAsIDB4QkQsIDB4RDMsIDB4MkUsIDB4RjAsIDB4RDAsIDB4ODAsIDB4QkQsIDB4RDMsCisJIDB4MkMsIDB4RjAsIDB4RDAsIDB4ODAsIDB4RkEsIDB4QTEsIDB4MTAsIDB4MEMsIDB4RjMsIDB4MDIsIDB4NTAsIDB4RkUsIDB4NjAsIDB4NjAsIDB4MDEsIDB4NjQsCisJIDB4RDAsIDB4ODAsIDB4MkQsIDB4RjAsIDB4MUQsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MkUsIDB4RjAsIDB4MDEsIDB4NjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDMsIDB4MEMsIDB4Q0IsIDB4NjAsIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDAsIDB4NDAsIDB4MkEsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4NjAsCisJIDB4QjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDAsIDB4NDAsIDB4MjYsIDB4RkEsIDB4MDEsIDB4MkEsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsCisJIDB4MDgsIDB4MkEsIDB4MjAsIDB4MDAsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MUQsIDB4MDAsIDB4MDMsIDB4NjcsIDB4QTAsIDB4ODQsIDB4MDAsIDB4MzcsCisJIDB4NjQsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MzcsIDB4NUUsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzcsIDB4NTgsIDB4NjMsIDB4NjAsIDB4NDAsCisJIDB4MDMsIDB4MzcsIDB4MEQsIDB4MDAsIDB4QkQsIDB4RDIsIDB4NjcsIDB4RjEsIDB4QkQsIDB4RDIsIDB4RDAsIDB4ODAsIDB4NjgsIDB4RjEsIDB4MDcsIDB4MDIsCisJIDB4RDAsIDB4ODAsIDB4QkQsIDB4RDIsIDB4NjksIDB4RjEsIDB4MDMsIDB4MDIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4Q0IsIDB4NjAsCisJIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4ODcsIDB4RjQsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MkIsIDB4MzEsIDB4MDAsIDB4ODksIDB4RjMsCisJIDB4MDYsIDB4NjEsIDB4NjAsIDB4NDMsIDB4NjYsIDB4NDUsIDB4MzEsIDB4RjAsIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4NjUsIDB4NDYsIDB4RDAsIDB4ODAsCisJIDB4MzAsIDB4RjAsIDB4MEYsIDB4MDIsIDB4NjMsIDB4NDYsIDB4MDQsIDB4RjIsIDB4NjUsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MkYsIDB4RjAsIDB4MDksIDB4MDIsCisJIDB4NjMsIDB4NDYsIDB4MDMsIDB4RjIsIDB4NjUsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4RkYsIDB4RkYsIDB4NDgsIDB4RkUsCisJIDB4MDYsIDB4MDAsIDB4Q0QsIDB4ODEsIDB4MDIsIDB4QTMsIDB4RTcsIDB4MDIsIDB4ODgsIDB4RjEsIDB4MDgsIDB4RkUsIDB4NjQsIDB4NDMsIDB4MDMsIDB4MDMsCisJIDB4Q0IsIDB4NjAsIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDMsIDB4NDMsIDB4MjMsIDB4NDYsIDB4MDYsIDB4RjAsIDB4MjYsIDB4NDYsIDB4MDcsIDB4NjcsCisJIDB4QTAsIDB4ODQsIDB4MjMsIDB4RkEsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MkIsIDB4MDAsIDB4Q0IsIDB4NjAsIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4MUIsIDB4MzEsIDB4RjIsIDB4MTIsIDB4NjAsIDB4Q0UsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsCisJIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MzEsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MzAsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsCisJIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MkYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsCisJIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODgsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4NDMsIDB4NDMsCisJIDB4MDcsIDB4RkMsIDB4NDMsIDB4NDMsIDB4MDIsIDB4RkUsIDB4MUQsIDB4RjAsIDB4MTIsIDB4NjAsIDB4QzAsIDB4NjIsIDB4QzAsIDB4NjQsIDB4QzAsIDB4ODQsCisJIDB4QTIsIDB4RDEsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4QzAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4NjMsIDB4NDUsIDB4MkEsIDB4RjIsIDB4MzUsIDB4RjAsIDB4NjAsIDB4NDAsIDB4QTQsIDB4MzYsIDB4MEIsIDB4MDAsIDB4MDgsIDB4MkIsIDB4MEMsIDB4MDAsCisJIDB4MjMsIDB4NDYsIDB4MjIsIDB4RjIsIDB4MjYsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MDIsIDB4Q0IsIDB4NjAsIDB4QkMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4Q0IsIDB4NjAsIDB4QjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4NDYsIDB4MUUsIDB4RjIsIDB4MjYsIDB4NDYsIDB4NDQsIDB4NEMsCisJIDB4MEYsIDB4MjYsIDB4MTksIDB4MDAsIDB4MDAsIDB4QkMsIDB4NDAsIDB4NDUsIDB4MEIsIDB4MDMsIDB4MDAsIDB4NjQsIDB4MjMsIDB4NDYsIDB4MUUsIDB4RkEsCisJIDB4MjYsIDB4NDYsIDB4QTIsIDB4RkYsIDB4QjQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4MkEsIDB4RjAsIDB4MkMsIDB4NDQsIDB4NjQsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MDYsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MjIsIDB4RkEsIDB4MjYsIDB4NDYsCisJIDB4Q0EsIDB4NjAsIDB4QjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjIsIDB4MDIsIDB4RkEsIDB4QTIsIDB4RkYsIDB4MTYsIDB4RjAsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDQsIDB4MDEsIDB4MjYsIDB4REMsIDB4OUMsIDB4OTMsIDB4RjMsIDB4MkEsIDB4RjIsIDB4REMsIDB4ODMsIDB4OTMsIDB4RkQsIDB4MDYsIDB4RjQsCisJIDB4MDEsIDB4RjgsIDB4MjYsIDB4NDYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MTgsIDB4MDAsIDB4NjQsIDB4NDQsIDB4MDAsIDB4NjUsIDB4RkYsIDB4QjQsCisJIDB4RkMsIDB4QTQsIDB4MDYsIDB4RjAsIDB4MDMsIDB4MDMsIDB4NjQsIDB4NDYsIDB4MEMsIDB4MEQsIDB4MDIsIDB4NjUsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4NjAsIDB4NDYsIDB4RjksIDB4MDEsIDB4MDEsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4RDQsIDB4ODQsIDB4MDEsIDB4RkEsIDB4NjYsIDB4NDQsIDB4MjYsIDB4NDYsIDB4MDYsIDB4RkEsIDB4MDYsIDB4RjQsIDB4MDAsIDB4RjIsIDB4ODAsIDB4RkMsCisJIDB4NDAsIDB4NDUsIDB4QjQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MkMsIDB4NDQsCisJIDB4MEYsIDB4MjYsIDB4MTAsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MjIsIDB4RkEsIDB4MjYsIDB4NDQsIDB4MUUsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MUIsIDB4NjAsCisJIDB4REEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4NkYsIDB4MDAsIDB4QTMsIDB4NDYsIDB4MjIsIDB4RjIsIDB4NjAsIDB4NDUsIDB4REMsIDB4ODQsIDB4RDQsIDB4ODAsIDB4MjIsIDB4RkEsCisJIDB4QTMsIDB4NDYsIDB4NkMsIDB4MDIsIDB4MkEsIDB4RjAsIDB4QTMsIDB4NDYsIDB4MUUsIDB4RjIsIDB4QTMsIDB4NDYsIDB4MDAsIDB4QkMsIDB4MDAsIDB4RjIsCisJIDB4MDEsIDB4MDIsIDB4NjQsIDB4MDAsIDB4NDQsIDB4NEMsIDB4M0YsIDB4RjAsIDB4NjAsIDB4NDMsIDB4MjMsIDB4NDYsIDB4MUUsIDB4RjQsIDB4MDksIDB4NjAsCisJIDB4MDAsIDB4NjUsIDB4M0YsIDB4RjIsIDB4MjYsIDB4NDYsIDB4QzAsIDB4ODQsIDB4RDQsIDB4ODAsIDB4NjAsIDB4NDUsIDB4NTcsIDB4MDcsIDB4ODAsIDB4RkMsCisJIDB4MUIsIDB4RjIsIDB4MDYsIDB4RjIsIDB4NjAsIDB4NDEsIDB4MjMsIDB4NDYsIDB4MUUsIDB4RjQsIDB4MUIsIDB4RjAsIDB4MDYsIDB4RjAsIDB4QzEsIDB4ODEsCisJIDB4MDYsIDB4RkEsIDB4MDUsIDB4RkEsIDB4OUIsIDB4RkEsIDB4NjUsIDB4NDQsIDB4M0YsIDB4RkEsIDB4NjQsIDB4NDYsIDB4MDAsIDB4RkMsIDB4NjMsIDB4NDYsCisJIDB4MDEsIDB4RjIsIDB4MTAsIDB4NjEsIDB4RjIsIDB4QTQsIDB4MDEsIDB4RkEsIDB4QzgsIDB4ODMsIDB4MDIsIDB4NjQsIDB4NTksIDB4RDAsIDB4NTgsIDB4RDgsCisJIDB4RkQsIDB4MUYsIDB4MDYsIDB4NDUsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjUsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjAsIDB4MEEsIDB4MTgsCisJIDB4NzAsIDB4NjcsIDB4QTAsIDB4ODAsIDB4RjAsIDB4NjcsIDB4MDYsIDB4MDMsIDB4QzAsIDB4ODQsIDB4MDEsIDB4RkEsIDB4MjUsIDB4NDYsIDB4MjUsIDB4NDQsCisJIDB4ODAsIDB4RkMsIDB4MDUsIDB4RkEsIDB4QjQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsCisJIDB4MkMsIDB4NDQsIDB4MDQsIDB4MjcsIDB4MTYsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MUUsIDB4RjIsIDB4OUUsIDB4RkMsIDB4NjAsIDB4NDYsIDB4NDYsIDB4NDYsCisJIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDcsIDB4MDgsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MkMsIDB4NDMsIDB4MkEsIDB4RkMsIDB4MDYsIDB4RjQsCisJIDB4MDAsIDB4NjQsIDB4MDAsIDB4RkEsIDB4MDEsIDB4RjAsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4MDEsIDB4RkEsIDB4MjYsIDB4NDYsCisJIDB4MUQsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4QzcsIDB4NjAsIDB4MzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4NDYsIDB4MUUsIDB4RjAsCisJIDB4OUUsIDB4RkMsIDB4MDAsIDB4NjMsIDB4MzMsIDB4ODUsIDB4QTMsIDB4NDYsIDB4MEQsIDB4MDMsIDB4QTMsIDB4NDYsIDB4MjIsIDB4RjIsIDB4MEYsIDB4NjUsCisJIDB4QTQsIDB4ODUsIDB4RDQsIDB4ODQsIDB4MjIsIDB4RkEsIDB4QTMsIDB4NDYsIDB4QTIsIDB4RkYsIDB4QjQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NDgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsIDB4MjYsIDB4NDYsIDB4Q0IsIDB4NjAsIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsIDB4ODgsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4MjYsIDB4NDYsIDB4NTAsIDB4MDMsIDB4NjAsIDB4NDAsIDB4MDAsIDB4MzYsCisJIDB4NEQsIDB4MDAsIDB4NjQsIDB4NDYsIDB4MEUsIDB4RjIsIDB4MjYsIDB4NDYsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4MjcsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4QjQsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4NDIsIDB4MDYsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4MjYsIDB4NDYsIDB4NjAsIDB4NDcsCisJIDB4RkYsIDB4QjUsIDB4NjUsIDB4NDEsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4MDAsIDB4NjQsIDB4RTksIDB4ODEsIDB4RDgsIDB4ODQsIDB4RkQsIDB4MDIsCisJIDB4QzgsIDB4ODQsIDB4NjAsIDB4NDMsIDB4NDQsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDcsIDB4RkYsIDB4QjUsIDB4MjcsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4QjQsIDB4RDQsIDB4ODAsIDB4NjQsIDB4NDQsIDB4MDYsIDB4MDYsIDB4MDcsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDYsIDB4MEUsIDB4RkEsCisJIDB4MjYsIDB4NDYsIDB4MTksIDB4MDAsIDB4MDAsIDB4NjEsIDB4MjcsIDB4RjAsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NjEsIDB4NDMsIDB4NDUsIDB4RDMsCisJIDB4NjQsIDB4NDEsIDB4RkYsIDB4QjEsIDB4NjEsIDB4NDUsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4REIsIDB4ODMsIDB4RDQsIDB4ODAsIDB4NjMsIDB4NDEsCisJIDB4RjMsIDB4MDIsIDB4Q0IsIDB4ODMsIDB4NjMsIDB4NDEsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MDcsIDB4RjAsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDYsIDB4MEUsIDB4RkEsIDB4MjYsIDB4NDYsIDB4QUYsIDB4ODQsIDB4RTgsIDB4ODEsIDB4MDUsIDB4MDMsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsCisJIDB4Q0QsIDB4ODEsIDB4RTAsIDB4ODQsIDB4RkQsIDB4MDIsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MkEsIDB4RjIsIDB4MzIsIDB4RjAsCisJIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4NUMsIDB4MDAsIDB4MDEsIDB4MkIsIDB4MkYsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MkMsIDB4MDAsCisJIDB4OTgsIDB4RjEsIDB4MUUsIDB4NjAsIDB4RjAsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsCisJIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsCisJIDB4ODgsIDB4RkYsIDB4MUIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsIDB4OTgsIDB4RjEsIDB4MUUsIDB4NjAsIDB4RjYsIDB4NjQsIDB4QTAsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4RDgsIDB4ODAsIDB4QzQsIDB4ODQsIDB4MEIsIDB4MDMsIDB4MDcsIDB4MDUsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsCisJIDB4QTIsIDB4REIsIDB4MDksIDB4MDQsIDB4QzYsIDB4RkUsIDB4MDcsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QjgsIDB4ODQsIDB4QTIsIDB4REIsIDB4OEEsIDB4RkYsCisJIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MkIsIDB4MDAsIDB4OTgsIDB4RjEsIDB4MUUsIDB4NjAsIDB4RUUsIDB4NjQsIDB4QTAsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsCisJIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MUIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsCisJIDB4OTgsIDB4RjEsIDB4MUUsIDB4NjAsIDB4RjQsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4ODAsIDB4QzQsIDB4ODQsIDB4MEIsIDB4MDMsCisJIDB4MDcsIDB4MDUsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDksIDB4MDQsIDB4QzYsIDB4RkUsIDB4MDcsIDB4MDAsCisJIDB4MDAsIDB4NjQsIDB4QjgsIDB4ODQsIDB4QTIsIDB4REIsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MDcsIDB4RjQsCisJIDB4RkYsIDB4RkYsIDB4MjIsIDB4RjIsIDB4MjYsIDB4NDYsIDB4MEYsIDB4QjQsIDB4REMsIDB4ODUsIDB4OTgsIDB4RjEsIDB4MUUsIDB4NjAsIDB4RjIsIDB4NjQsCisJIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4ODAsIDB4QzQsIDB4ODQsIDB4MEIsIDB4MDMsIDB4MDcsIDB4MDUsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsCisJIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDksIDB4MDQsIDB4QzYsIDB4RkUsIDB4MDcsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QjgsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MjcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4M0IsCisJIDB4MTIsIDB4MDAsIDB4OTgsIDB4RjEsIDB4MUYsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsCisJIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsCisJIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MTMsIDB4MDAsIDB4MDIsIDB4M0IsIDB4MTEsIDB4MDAsIDB4OTgsIDB4RjEsIDB4MUYsIDB4NjAsIDB4MDIsIDB4NjQsCisJIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsCisJIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4Q0MsIDB4NjAsIDB4MDYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QzcsIDB4NjAsIDB4MzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjAsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4NzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4QzcsIDB4NjAsIDB4MzEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4QkUsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjgsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4QzcsIDB4NjAsIDB4MzEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4NTgsIDB4NjMsIDB4NjAsIDB4NDcsIDB4MDEsIDB4MjcsIDB4NjQsIDB4NjMsIDB4MjUsIDB4NjAsIDB4MjYsIDB4NjIsCisJIDB4NjEsIDB4NUMsIDB4QTIsIDB4RDksIDB4QkQsIDB4RDAsIDB4QkQsIDB4RDAsIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDEsIDB4QkQsIDB4RDAsIDB4MDAsIDB4RjQsCisJIDB4MDQsIDB4RjgsIDB4ODMsIDB4RkEsIDB4ODIsIDB4RjgsIDB4QTYsIDB4NDYsIDB4MDIsIDB4QjAsIDB4NUUsIDB4NjMsIDB4MDQsIDB4MDMsIDB4NjQsIDB4NjMsCisJIDB4MDMsIDB4QjAsIDB4MDIsIDB4M0EsIDB4NkMsIDB4NjMsIDB4M0YsIDB4RjIsIDB4QkQsIDB4RDAsIDB4QkQsIDB4RDAsIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDEsCisJIDB4QkQsIDB4RDAsIDB4QTYsIDB4NDYsIDB4MDcsIDB4RjgsIDB4ODYsIDB4RkEsIDB4ODUsIDB4RjgsIDB4NjAsIDB4NDcsIDB4MDgsIDB4RkEsIDB4MjUsIDB4NjAsCisJIDB4MjYsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MjYsIDB4NDYsIDB4NjQsIDB4NDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4MkMsIDB4RjAsCisJIDB4MzEsIDB4NDAsIDB4MjAsIDB4MjYsIDB4MDksIDB4MDAsIDB4NjAsIDB4NDAsIDB4QTQsIDB4MzYsIDB4MjEsIDB4MDAsIDB4MDgsIDB4MjYsIDB4MDcsIDB4MDAsCisJIDB4N0UsIDB4RjEsIDB4Q0MsIDB4NjAsIDB4Q0YsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4NjAsIDB4RkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsCisJIDB4MDEsIDB4MjYsIDB4MTIsIDB4MDAsIDB4M0YsIDB4RjAsIDB4MzIsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MEEsIDB4MDAsIDB4NjQsIDB4NDEsIDB4NjAsIDB4NDAsCisJIDB4NDAsIDB4MjcsIDB4MDYsIDB4MDAsIDB4Q0QsIDB4ODEsIDB4REQsIDB4ODEsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDMsIDB4MDEsIDB4NjEsIDB4MDEsIDB4MDAsCisJIDB4MDAsIDB4NjEsIDB4NjAsIDB4NDAsIDB4MTgsIDB4M0EsIDB4MDMsIDB4MDAsIDB4Q0QsIDB4NjAsIDB4M0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjIsCisJIDB4ODgsIDB4RjEsIDB4NjYsIDB4NDUsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MDMsIDB4MDMsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MjYsIDB4MDcsIDB4MDAsIDB4REEsIDB4NjAsIDB4NTgsIDB4NEYsIDB4REIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0QsIDB4NjAsIDB4MzcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4QTQsIDB4M0EsIDB4MDcsIDB4MDAsIDB4REQsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4NDUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0QsIDB4NjAsIDB4MzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4Q0IsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4RDksIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjIsIDB4MDYsIDB4NjUsIDB4RDQsIDB4ODAsIDB4NjAsIDB4NDMsIDB4NTIsIDB4MDQsIDB4MDAsIDB4RjQsCisJIDB4QUEsIDB4NjAsIDB4QUEsIDB4NjUsIDB4MDksIDB4RjIsIDB4MEEsIDB4RjAsIDB4RDQsIDB4ODAsIDB4MDMsIDB4NjQsIDB4NEEsIDB4MDIsIDB4RDAsIDB4ODAsCisJIDB4MDAsIDB4NjQsIDB4MEIsIDB4RjAsIDB4NDYsIDB4MDIsIDB4NjQsIDB4NDUsIDB4RDQsIDB4ODAsIDB4RjgsIDB4N0YsIDB4MDgsIDB4MDIsIDB4MEMsIDB4RjAsCisJIDB4MjYsIDB4NDYsIDB4NjQsIDB4NDUsIDB4MjMsIDB4RjAsIDB4MjAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MEIsIDB4MDAsIDB4RDQsIDB4ODAsCisJIDB4MUQsIDB4NjAsIDB4NjAsIDB4NjQsIDB4MTEsIDB4MDIsIDB4MEMsIDB4RjAsIDB4MjYsIDB4NDYsIDB4NjQsIDB4NDUsIDB4MjMsIDB4RjAsIDB4NDAsIDB4NjcsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NjUsIDB4NDQsIDB4ODgsIDB4M0EsIDB4MkMsIDB4MDAsIDB4NzcsIDB4MzcsIDB4MDMsIDB4MDAsIDB4NzgsIDB4MzcsCisJIDB4MDEsIDB4MDAsIDB4OEUsIDB4MzcsIDB4MDAsIDB4NjEsIDB4MjUsIDB4MDAsIDB4RDQsIDB4ODAsIDB4MDgsIDB4NjUsIDB4MjIsIDB4MDIsIDB4RDcsIDB4ODAsCisJIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MEMsIDB4RjAsIDB4MUQsIDB4MDQsIDB4RDAsIDB4ODAsIDB4MEQsIDB4RjAsIDB4MUEsIDB4MDIsIDB4MjYsIDB4NDYsCisJIDB4MTQsIDB4RjIsIDB4MDEsIDB4NjMsIDB4MDIsIDB4QTgsIDB4NjQsIDB4NDcsIDB4MTQsIDB4MDMsIDB4N0YsIDB4QjQsIDB4RkQsIDB4QTAsIDB4MDYsIDB4MDMsCisJIDB4MTAsIDB4MDcsIDB4MjMsIDB4RjAsIDB4NjAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NkEsIDB4MDAsIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4QkMsIDB4RDIsIDB4RkIsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4OTQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0QsIDB4NjAsIDB4MzcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4NjEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MTIsIDB4MDAsIDB4OTgsIDB4RjEsIDB4MUYsIDB4NjAsIDB4MDYsIDB4NjQsCisJIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsCisJIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4N0MsIDB4MDAsIDB4REQsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4NDUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NDgsIDB4MzYsIDB4NzMsIDB4MDAsCisJIDB4Q0QsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0QsIDB4NjAsIDB4MzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MEMsIDB4MjYsIDB4NjksIDB4MDAsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4NjYsIDB4MDAsIDB4QjAsIDB4M0EsIDB4MDUsIDB4MDAsIDB4RDEsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4ODAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUIsIDB4MDAsIDB4MDAsIDB4M0EsIDB4MDUsIDB4MDAsIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4RjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTQsIDB4MDAsIDB4MjAsIDB4M0EsIDB4MDUsIDB4MDAsIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RjMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NEQsIDB4MDAsIDB4QzAsIDB4M0EsIDB4MDUsIDB4MDAsIDB4REEsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NDgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NDYsIDB4MDAsIDB4QTAsIDB4M0EsIDB4MDUsIDB4MDAsIDB4REEsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4MDAsCisJIDB4NDAsIDB4M0EsIDB4MEQsIDB4MDAsIDB4RTEsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MTAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzgsIDB4MDAsIDB4NjAsIDB4NDAsCisJIDB4NTAsIDB4M0EsIDB4MDUsIDB4MDAsIDB4RUEsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4MzMsIDB4MDAsCisJIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4RDIsIDB4RkIsIDB4MkEsIDB4RjIsIDB4M0IsIDB4RjAsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsCisJIDB4MTksIDB4MDAsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4QjQsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDMsIDB4QzAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MEYsIDB4MDAsIDB4QTAsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MjMsIDB4RjIsCisJIDB4MTAsIDB4QkQsIDB4QjQsIDB4OUMsIDB4M0YsIDB4RjIsIDB4MjMsIDB4RjgsIDB4RjgsIDB4QTQsIDB4M0YsIDB4RkEsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDcsCisJIDB4MDgsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4QkUsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjgsIDB4RkUsIDB4MEMsIDB4MDAsIDB4NjYsIDB4NDQsCisJIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4MDMsIDB4MjYsIDB4NDYsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjAsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4NzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4Q0IsIDB4NjAsIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTQsIDB4RjIsIDB4MDAsIDB4N0MsIDB4M0UsIDB4RjgsIDB4Q0MsIDB4ODQsIDB4Q0MsIDB4ODQsIDB4MTksIDB4MDMsIDB4NjAsIDB4MDIsIDB4MTEsIDB4RjIsCisJIDB4MDcsIDB4RkEsIDB4QUMsIDB4RjMsIDB4MTksIDB4RkEsIDB4Q0QsIDB4NjAsIDB4NTgsIDB4NEUsIDB4RTQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUIsIDB4NjAsCisJIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4OUEsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzgsIDB4RkUsIDB4RjIsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4NzksIDB4MDAsIDB4QTIsIDB4RkYsCisJIDB4NDYsIDB4NDUsIDB4QjQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsIDB4MTEsIDB4MDMsIDB4N0UsIDB4NjMsCisJIDB4NDYsIDB4NEIsIDB4MjUsIDB4NDYsIDB4QTMsIDB4RDAsIDB4MkIsIDB4NDYsIDB4QTMsIDB4RDgsIDB4RkIsIDB4MUYsIDB4ODksIDB4RkMsIDB4OEEsIDB4RkMsCisJIDB4ODgsIDB4RkMsIDB4MDUsIDB4MTgsIDB4NjQsIDB4NDYsIDB4MDEsIDB4RjAsIDB4MTAsIDB4NjcsIDB4QzAsIDB4ODQsIDB4MDEsIDB4RkEsIDB4MDgsIDB4RkUsCisJIDB4MkIsIDB4NDYsIDB4NDYsIDB4NDYsIDB4MjUsIDB4NDYsIDB4Q0QsIDB4NjAsIDB4NTgsIDB4NEUsIDB4RTQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsCisJIDB4OEUsIDB4NjIsIDB4QTIsIDB4RDMsIDB4ODgsIDB4RjMsIDB4MDAsIDB4QTgsIDB4MDcsIDB4RkEsIDB4MEYsIDB4MDMsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsCisJIDB4MUIsIDB4NjAsIDB4OTQsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjUsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4RjMsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4MEUsIDB4MDAsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsCisJIDB4ODgsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjUsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4RjQsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4MjYsIDB4NDQsIDB4MDAsIDB4QTgsIDB4QzEsIDB4RkUsIDB4MzEsIDB4MDMsIDB4RDIsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4RDIsIDB4RkIsIDB4MjYsIDB4NDYsIDB4MkEsIDB4RjIsIDB4M0IsIDB4RjAsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsCisJIDB4MTgsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MTUsIDB4MDAsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4QjQsIDB4RkYsIDB4RkYsCisJIDB4MTAsIDB4MDMsIDB4QzAsIDB4NjcsIDB4QTAsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MjMsIDB4RjIsIDB4MTAsIDB4QkQsCisJIDB4QjQsIDB4OUMsIDB4M0YsIDB4RjIsIDB4MjMsIDB4RjgsIDB4RjgsIDB4QTQsIDB4M0YsIDB4RkEsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDcsIDB4MDgsIDB4RkEsCisJIDB4MjYsIDB4NDYsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4QkUsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjgsIDB4RkUsIDB4RjEsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsCisJIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4ODIsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODcsCisJIDB4MDIsIDB4QkYsIDB4MkEsIDB4RkEsIDB4MUMsIDB4RjIsIDB4MTMsIDB4RkEsIDB4MzIsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzMsIDB4RjIsIDB4MkQsIDB4RkEsCisJIDB4MzQsIDB4RjIsIDB4MkUsIDB4RkEsIDB4MkYsIDB4RjIsIDB4MzIsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MzMsIDB4RkEsIDB4MzEsIDB4RjIsIDB4MzQsIDB4RkEsCisJIDB4NjcsIDB4RjMsIDB4MkYsIDB4RkEsIDB4NjgsIDB4RjMsIDB4MzAsIDB4RkEsIDB4NjksIDB4RjMsIDB4MzEsIDB4RkEsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MEYsIDB4NjAsIDB4RjgsIDB4NjIsIDB4RDAsIDB4NjAsIDB4N0IsIDB4NjQsIDB4QTIsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsCisJIDB4NjIsIDB4NjMsIDB4MjAsIDB4NjAsIDB4MDIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4QTMsIDB4REIsIDB4MUUsIDB4NjMsIDB4MUYsIDB4NjAsIDB4NkMsIDB4NjEsCisJIDB4MjAsIDB4NjAsIDB4MEMsIDB4NjQsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MUYsIDB4NjAsIDB4OEUsIDB4NjMsIDB4MjAsIDB4NjAsCisJIDB4MkUsIDB4NjIsIDB4QTIsIDB4RDMsIDB4QTMsIDB4REIsIDB4MUYsIDB4NjAsIDB4OTAsIDB4NjMsIDB4MjAsIDB4NjAsIDB4MzAsIDB4NjIsIDB4QTIsIDB4RDMsCisJIDB4QTMsIDB4REIsIDB4MUYsIDB4NjAsIDB4OUEsIDB4NjMsIDB4MjAsIDB4NjAsIDB4M0EsIDB4NjIsIDB4QTIsIDB4RDMsIDB4QTMsIDB4REIsIDB4MUYsIDB4NjAsCisJIDB4OUMsIDB4NjMsIDB4MjAsIDB4NjAsIDB4M0MsIDB4NjIsIDB4QTIsIDB4RDMsIDB4QTMsIDB4REIsIDB4MUYsIDB4NjAsIDB4OUUsIDB4NjMsIDB4MjAsIDB4NjAsCisJIDB4M0UsIDB4NjIsIDB4QTIsIDB4RDMsIDB4QTMsIDB4REIsIDB4MUYsIDB4NjAsIDB4QTAsIDB4NjMsIDB4MjAsIDB4NjAsIDB4NDAsIDB4NjIsIDB4QTIsIDB4RDMsCisJIDB4QTMsIDB4REIsIDB4MUYsIDB4NjAsIDB4OTIsIDB4NjMsIDB4MjAsIDB4NjAsIDB4MzIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4QTMsIDB4REIsIDB4MUYsIDB4NjAsCisJIDB4OTQsIDB4NjMsIDB4MjAsIDB4NjAsIDB4MzQsIDB4NjIsIDB4QTIsIDB4RDMsIDB4QTMsIDB4REIsIDB4MUYsIDB4NjAsIDB4OTYsIDB4NjMsIDB4MjAsIDB4NjAsCisJIDB4MzYsIDB4NjIsIDB4QTIsIDB4RDMsIDB4QTMsIDB4REIsIDB4MUYsIDB4NjAsIDB4QjYsIDB4NjMsIDB4QkQsIDB4RDEsIDB4Q0IsIDB4RjksIDB4NjcsIDB4RjksCisJIDB4QkQsIDB4RDEsIDB4Q0MsIDB4RjksIDB4NjgsIDB4RjksIDB4QTMsIDB4RDEsIDB4Q0QsIDB4RjksIDB4NjksIDB4RjksIDB4MDEsIDB4NjQsIDB4NkIsIDB4RkIsCisJIDB4MUYsIDB4NjAsIDB4QTgsIDB4NjIsIDB4QTIsIDB4RDMsIDB4QzQsIDB4RkIsIDB4MDAsIDB4NjMsIDB4NEEsIDB4RkQsIDB4NUEsIDB4RkQsIDB4NkMsIDB4RkQsCisJIDB4NkQsIDB4RkQsIDB4MjEsIDB4NjAsIDB4ODIsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RUEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NzgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjEsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QTAsIDB4RDEsIDB4MUYsIDB4NjAsIDB4OTIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4NjAsIDB4RTcsIDB4NjUsCisJIDB4MzIsIDB4NDEsIDB4QTUsIDB4ODEsIDB4RkYsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4MEIsIDB4MDAsIDB4MDgsIDB4NjUsIDB4QjUsIDB4ODEsCisJIDB4MUYsIDB4NjAsIDB4OTYsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDIsIDB4MDAsIDB4MTAsIDB4NjUsCisJIDB4QjUsIDB4ODEsIDB4NDEsIDB4NTIsIDB4ODgsIDB4RjUsIDB4MzIsIDB4NDQsIDB4MTAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDMsIDB4MjEsIDB4NjAsCisJIDB4MkMsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MDYsIDB4RjAsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4ODAsIDB4QkYsCisJIDB4QjAsIDB4ODQsIDB4MDYsIDB4RkEsIDB4MUYsIDB4NjAsIDB4OTIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MjIsIDB4N0MsIDB4RkYsIDB4QTAsIDB4RkQsIDB4QTAsCisJIDB4MDUsIDB4MDYsIDB4MDMsIDB4MDMsIDB4RkUsIDB4QTAsIDB4MDQsIDB4N0MsIDB4MDEsIDB4MDIsIDB4MzYsIDB4RjgsIDB4MEUsIDB4RjAsIDB4MEYsIDB4NjAsCisJIDB4QTIsIDB4NjUsIDB4MjAsIDB4NjAsIDB4MzgsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QTAsIDB4MDMsIDB4QTgsIDB4MTEsIDB4MDYsCisJIDB4NUYsIDB4RjEsIDB4MDYsIDB4MDIsIDB4NjQsIDB4NDQsIDB4MDgsIDB4MkEsIDB4MDksIDB4MDAsIDB4MDYsIDB4NjQsIDB4NDQsIDB4RDMsIDB4MEQsIDB4MDAsCisJIDB4NjQsIDB4NDQsIDB4MjAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MEEsIDB4NjQsIDB4NDQsIDB4RDMsIDB4MDcsIDB4MDAsIDB4MDEsIDB4NjQsIDB4NDQsIDB4RDMsCisJIDB4MDQsIDB4MDAsIDB4RTgsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4MDAsIDB4MDAsIDB4MEUsIDB4RkEsIDB4MUYsIDB4NjAsIDB4OUUsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4MjAsIDB4NDQsIDB4MjAsIDB4QjUsIDB4NjQsIDB4NDEsIDB4MDAsIDB4QjksIDB4RDQsIDB4ODQsIDB4MDgsIDB4MjgsIDB4MjAsIDB4QkMsCisJIDB4NDAsIDB4NDAsIDB4MTEsIDB4NjAsIDB4RjAsIDB4NjEsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QjgsIDB4MTAsIDB4NjAsIDB4MEMsIDB4NjUsCisJIDB4MEQsIDB4MDMsIDB4MTEsIDB4NjAsIDB4RjgsIDB4NjMsIDB4QzUsIDB4RjMsIDB4QTMsIDB4RDEsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODQsIDB4QTAsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4QzUsIDB4RjksIDB4NjUsIDB4RjksIDB4QzUsIDB4RjMsIDB4MDEsIDB4NjEsCisJIDB4Q0MsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4RTEsIDB4ODEsIDB4RkIsIDB4MDEsIDB4OUEsIDB4RjMsIDB4NjEsIDB4NDUsIDB4QTQsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDIsIDB4MDAsIDB4QjgsIDB4MDEsIDB4NjMsIDB4MDgsIDB4MDMsIDB4RTgsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MjQsCisJIDB4MDIsIDB4MDAsIDB4REYsIDB4ODMsIDB4RkEsIDB4MDEsIDB4QzUsIDB4RkQsIDB4NjUsIDB4RkQsIDB4MEEsIDB4NjQsIDB4MjUsIDB4NjAsIDB4MUUsIDB4NjMsCisJIDB4QTMsIDB4REIsIDB4MDEsIDB4NjQsIDB4MjUsIDB4NjAsIDB4MjAsIDB4NjMsIDB4QTMsIDB4REIsIDB4QjYsIDB4RjEsIDB4MDksIDB4NjAsIDB4MkEsIDB4NjQsCisJIDB4RDAsIDB4ODAsIDB4MDMsIDB4NjQsIDB4MDEsIDB4MDYsIDB4MDYsIDB4NjQsIDB4QjAsIDB4RkIsIDB4MEYsIDB4NjAsIDB4RDYsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEIsIDB4MDQsIDB4MEYsIDB4NjAsIDB4RDgsIDB4NjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4NjAsIDB4MDUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RDYsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjUsIDB4RjEsIDB4MUMsIDB4NjAsIDB4MDAsIDB4NjIsIDB4QTIsIDB4RDksIDB4MDgsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RDgsIDB4NjIsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4NjAsCisJIDB4MkQsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RDYsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4QkUsIDB4RkUsIDB4MEYsIDB4NjAsIDB4Q0UsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MjAsIDB4NDQsIDB4MDEsIDB4NjUsIDB4MzQsIDB4ODAsIDB4MUYsIDB4NjAsIDB4QTYsIDB4NjQsIDB4QTAsIDB4RDMsCisJIDB4QzMsIDB4RkIsIDB4NjAsIDB4NDAsIDB4MDUsIDB4M0EsIDB4MDMsIDB4MDAsIDB4RUIsIDB4NjAsIDB4MUEsIDB4NjEsIDB4MTEsIDB4MDAsIDB4MDQsIDB4M0EsCisJIDB4MDMsIDB4MDAsIDB4RUIsIDB4NjAsIDB4MEUsIDB4NjEsIDB4MEMsIDB4MDAsIDB4MDMsIDB4M0EsIDB4MDMsIDB4MDAsIDB4RUIsIDB4NjAsIDB4MDIsIDB4NjEsCisJIDB4MDcsIDB4MDAsIDB4MDIsIDB4M0EsIDB4MDMsIDB4MDAsIDB4RUEsIDB4NjAsIDB4RjYsIDB4NjEsIDB4MDIsIDB4MDAsIDB4RUEsIDB4NjAsIDB4RUEsIDB4NjEsCisJIDB4M0UsIDB4NjAsIDB4MDAsIDB4NjYsIDB4MDEsIDB4NjAsIDB4NzgsIDB4NjQsIDB4MEEsIDB4NjMsIDB4NTksIDB4RDAsIDB4NTgsIDB4RDksIDB4RkQsIDB4MUYsCisJIDB4MDAsIDB4NjYsIDB4QzQsIDB4RjMsIDB4NjAsIDB4NDEsIDB4MDAsIDB4QTgsIDB4RkEsIDB4QTEsIDB4MDEsIDB4MDMsIDB4QTEsIDB4REIsIDB4MDEsIDB4NjAsCisJIDB4N0EsIDB4NjMsIDB4MTYsIDB4NjAsIDB4QzQsIDB4NjEsIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjAsIDB4N0YsIDB4QTEsIDB4REIsIDB4QkQsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4MjEsIDB4N0YsIDB4NTksIDB4REIsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjIsIDB4N0YsIDB4NTksIDB4REIsIDB4MEYsIDB4NjAsCisJIDB4RDYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEIsIDB4MDQsIDB4MEYsIDB4NjAsIDB4RDgsIDB4NjIsIDB4NDAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4NjAsIDB4NzcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MUMsIDB4NjAsIDB4MDAsIDB4NjIsIDB4MTYsIDB4NjAsIDB4QzIsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjAsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RDgsIDB4NjIsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4NjAsIDB4OUMsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RDYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4NjUsIDB4RjEsIDB4MUMsIDB4NjAsIDB4MDAsIDB4NjIsIDB4QTIsIDB4RDksIDB4MDgsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsCisJIDB4MEYsIDB4NjAsIDB4RDgsIDB4NjIsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4NjAsIDB4QjMsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RDYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QkUsIDB4RkUsCisJIDB4MEYsIDB4NjAsIDB4Q0UsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MjAsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4RUIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsCisJIDB4RDYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NEUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTMsIDB4MUIsIDB4MUYsIDB4NjAsIDB4QUUsIDB4NjQsCisJIDB4QTAsIDB4RDMsIDB4QzcsIDB4RkIsIDB4MUYsIDB4NjAsIDB4MUUsIDB4NjUsIDB4MUYsIDB4NjAsIDB4QkMsIDB4NjEsIDB4MUYsIDB4NjAsIDB4MUMsIDB4NjQsCisJIDB4MjAsIDB4NjMsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDksIDB4QTUsIDB4RDksIDB4REEsIDB4ODUsIDB4RkIsIDB4MUYsIDB4RDAsIDB4NjAsIDB4NjIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4NjAsIDB4NDAsIDB4NjMsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODUsIDB4QzQsIDB4ODUsIDB4QzcsIDB4ODMsIDB4RkUsIDB4QTUsCisJIDB4ODksIDB4RjMsIDB4RkYsIDB4RkYsIDB4QzQsIDB4ODQsIDB4NjYsIDB4NDUsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDEsIDB4QkQsIDB4RDEsIDB4MDMsIDB4RjgsCisJIDB4QkQsIDB4RDEsIDB4MDQsIDB4RjgsIDB4QTMsIDB4RDEsIDB4MDUsIDB4RjgsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDIsIDB4N0UsIDB4MDYsIDB4RkEsCisJIDB4NUYsIDB4RjMsIDB4NjAsIDB4RkIsIDB4NzMsIDB4RjAsIDB4NjMsIDB4RjksIDB4NjYsIDB4NDMsIDB4MjEsIDB4NjAsIDB4MkMsIDB4NjIsIDB4MzIsIDB4NDAsCisJIDB4MDgsIDB4MkEsIDB4MDksIDB4MDAsIDB4QTIsIDB4RDMsIDB4MDYsIDB4RjAsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4ODAsIDB4QkYsIDB4QjAsIDB4ODQsIDB4MDYsIDB4RkEsIDB4NjMsIDB4NDQsIDB4NjMsIDB4RjMsIDB4NjAsIDB4NDUsIDB4NjYsIDB4NDEsIDB4NjUsIDB4NDYsCisJIDB4OEMsIDB4RkEsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDYsIDB4MDAsIDB4MDIsIDB4MzYsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MzYsIDB4MDIsIDB4MDAsCisJIDB4MDUsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MDEsIDB4MDAsIDB4MDEsIDB4NjQsIDB4NkYsIDB4RkEsIDB4NUYsIDB4RjMsIDB4NjAsIDB4RjEsCisJIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsIDB4NjUsIDB4NDMsIDB4MDIsIDB4MDIsIDB4NUYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4MEYsIDB4NjAsCisJIDB4QUUsIDB4NjUsIDB4NjMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjEsIDB4NDUsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MDIsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MDMsIDB4QTQsIDB4ODQsIDB4NjEsIDB4RkIsIDB4NkYsIDB4RjAsCisJIDB4NjAsIDB4NDcsIDB4OTAsIDB4ODQsIDB4NkYsIDB4RkEsIDB4NjAsIDB4NDcsIDB4NjAsIDB4NDUsIDB4ODAsIDB4NjQsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4RkMsIDB4MDMsIDB4QTQsIDB4ODQsIDB4NzAsIDB4RjAsIDB4NzAsIDB4RkEsIDB4MDAsIDB4NjEsIDB4RTgsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MDUsIDB4REQsIDB4ODEsIDB4RkIsIDB4MDEsIDB4RTEsIDB4ODEsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MEUsIDB4RkEsCisJIDB4NjYsIDB4NDMsIDB4MEMsIDB4RjQsIDB4QzUsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RDYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsCisJIDB4RDgsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MzAsIDB4NjQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4NjAsIDB4QzcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NEUsIDB4REYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsCisJIDB4MEYsIDB4NEUsIDB4REMsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4MEYsIDB4NEUsIDB4REIsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4RTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4MEYsIDB4NEUsIDB4REIsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NDIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4RDcsIDB4MDEsIDB4NEUsIDB4RjMsIDB4N0UsIDB4RjUsIDB4NjAsIDB4NDAsIDB4RkYsIDB4MjIsIDB4MEEsIDB4MDAsCisJIDB4ODksIDB4RjEsIDB4Q0MsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzAsIDB4ODYsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsCisJIDB4N0UsIDB4RjUsIDB4MDgsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RjQsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MTEsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4NEUsIDB4RjMsIDB4NjYsIDB4NDAsIDB4RkYsIDB4MjIsIDB4MDUsIDB4MDAsIDB4RkYsIDB4MjIsIDB4MzcsIDB4MDAsCisJIDB4RDEsIDB4NjAsIDB4MzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsIDB4NkEsIDB4RkIsIDB4RkYsIDB4RkYsIDB4QzEsIDB4RkUsIDB4NkEsIDB4RjMsCisJIDB4MDAsIDB4NjUsIDB4RDQsIDB4ODAsIDB4NEUsIDB4RjMsIDB4MEYsIDB4MDMsIDB4MEYsIDB4NjAsIDB4RDYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MEYsIDB4NjAsIDB4RDgsIDB4NjIsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDAsIDB4NjAsIDB4OUYsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RDYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsCisJIDB4MEIsIDB4MDQsIDB4MEYsIDB4NjAsIDB4RDgsIDB4NjIsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDAsIDB4NjAsIDB4QjMsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4MDAsIDB4NjIsIDB4MDYsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MjAsIDB4NDQsIDB4MDEsIDB4QjUsIDB4NTQsIDB4ODAsIDB4REEsIDB4RkUsIDB4QkUsIDB4RkUsIDB4ODgsIDB4RjEsCisJIDB4MDIsIDB4NjQsIDB4ODcsIDB4RjMsIDB4QzAsIDB4ODMsIDB4NDAsIDB4NDgsIDB4NzYsIDB4RkQsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OUQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjgsIDB4NDQsIDB4NEMsIDB4ODgsIDB4NzYsIDB4RjMsIDB4MDIsIDB4NjUsIDB4QzQsIDB4ODMsIDB4RjUsIDB4MDIsIDB4QTIsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4MDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTQsIDB4NjAsIDB4RDAsIDB4NjIsIDB4MTQsIDB4NjAsIDB4RDIsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MDAsIDB4NjQsIDB4NEEsIDB4REIsIDB4MDEsIDB4NjAsIDB4RkUsIDB4NjMsIDB4MTIsIDB4NjAsIDB4Q0MsIDB4NjEsIDB4MDAsIDB4NjQsIDB4NTksIDB4REIsCisJIDB4RkUsIDB4MUYsIDB4N0UsIDB4RjEsIDB4MUIsIDB4NjAsIDB4OUEsIDB4NjEsIDB4NjQsIDB4NDAsIDB4RkYsIDB4MjYsIDB4MzksIDB4MDAsIDB4RDEsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUIsIDB4NjAsIDB4ODgsIDB4NjEsIDB4RDEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MzMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MUIsIDB4NjAsIDB4OEUsIDB4NjEsIDB4RDEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUIsIDB4NjAsCisJIDB4QTAsIDB4NjEsIDB4RDEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUIsIDB4NjAsIDB4QTYsIDB4NjEsIDB4RDEsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUIsIDB4NjAsIDB4QjIsIDB4NjEsIDB4RDEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MzMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MUIsIDB4NjAsIDB4QkUsIDB4NjEsIDB4RDEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUIsIDB4NjAsCisJIDB4QUMsIDB4NjEsIDB4RDEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUIsIDB4NjAsIDB4OTQsIDB4NjEsIDB4RDEsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4NUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RDYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NUEsIDB4REIsCisJIDB4QzUsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RDMsIDB4MEUsIDB4NTcsIDB4MjQsIDB4MDAsIDB4MEUsIDB4RjIsIDB4NDQsIDB4NEMsCisJIDB4ODAsIDB4QjAsIDB4MTAsIDB4QjAsIDB4MEIsIDB4MDMsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MTMsIDB4MDAsIDB4MTIsIDB4MDIsIDB4RjAsIDB4MzcsCisJIDB4MDksIDB4MDAsIDB4MDIsIDB4RjAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsIDB4QTIsIDB4RkYsIDB4OTAsIDB4RjMsIDB4MDIsIDB4MDIsCisJIDB4Q0MsIDB4ODQsIDB4OTAsIDB4RkIsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjAsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MkMsIDB4NDQsIDB4QUMsIDB4ODYsIDB4MDksIDB4RjAsIDB4RDksIDB4MDIsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RDMsCisJIDB4MEUsIDB4NTcsIDB4MTksIDB4MDAsIDB4MEUsIDB4RjIsIDB4NDQsIDB4NEMsIDB4ODAsIDB4QjAsIDB4MTAsIDB4QjAsIDB4MEIsIDB4MDMsIDB4MUIsIDB4NjAsCisJIDB4REEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDcsIDB4MDIsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjAsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4NzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkMsIDB4NDQsIDB4QUMsIDB4ODYsIDB4MDksIDB4RjAsIDB4RTQsIDB4MDIsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4QjAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsCisJIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsIDB4MkUsIDB4RkEsIDB4Q0IsIDB4RjMsIDB4MkYsIDB4RkEsIDB4Q0MsIDB4RjMsIDB4MzAsIDB4RkEsIDB4Q0QsIDB4RjMsCisJIDB4MzEsIDB4RkEsIDB4NjcsIDB4RjMsIDB4MzIsIDB4RkEsIDB4NjgsIDB4RjMsIDB4MzMsIDB4RkEsIDB4NjksIDB4RjMsIDB4MzQsIDB4RkEsIDB4QUMsIDB4RjEsCisJIDB4MTksIDB4RjgsIDB4MDYsIDB4NjMsIDB4M0YsIDB4RkMsIDB4MUMsIDB4RjIsIDB4MTMsIDB4RkEsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4MDcsIDB4RjIsCisJIDB4ODgsIDB4RjEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MDMsIDB4NjAsIDB4NDYsIDB4MDYsIDB4RjIsIDB4MjYsIDB4NDYsCisJIDB4MDEsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4RDMsIDB4NjAsIDB4NjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDQsIDB4NjAsIDB4QkEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4RjQsIDB4MEEsIDB4RjIsIDB4MDksIDB4RjIsIDB4RkYsIDB4QTAsIDB4MDAsIDB4QTAsIDB4MTMsIDB4MDIsIDB4RkYsIDB4QTAsCisJIDB4MDQsIDB4MDMsIDB4MDgsIDB4MDMsIDB4RDEsIDB4NjAsIDB4RDUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsIDB4NTUsIDB4RkIsIDB4RDEsIDB4NjAsCisJIDB4RTAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjMsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MEYsIDB4MDAsIDB4NTUsIDB4RkQsIDB4RDEsIDB4NjAsCisJIDB4RTAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MEEsIDB4RjIsIDB4MEUsIDB4NjMsIDB4MDEsIDB4QTQsIDB4MEEsIDB4RkEsCisJIDB4MEIsIDB4RkMsIDB4NDMsIDB4NTksIDB4RDQsIDB4NjAsIDB4OTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MEEsIDB4RjIsCisJIDB4MEQsIDB4NjMsIDB4MDEsIDB4QTQsIDB4MEEsIDB4RkEsIDB4MEIsIDB4RkMsIDB4NDMsIDB4NTksIDB4RDQsIDB4NjAsIDB4OTMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4ODgsIDB4RjUsIDB4MDAsIDB4RjIsIDB4MjYsIDB4NDYsIDB4MDAsIDB4QTAsIDB4MkUsIDB4RjAsIDB4MzcsIDB4MDMsIDB4NjYsIDB4NDEsIDB4MTIsIDB4NjAsCisJIDB4Q0UsIDB4NjUsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4ODgsIDB4RjEsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjQsIDB4NDMsIDB4MTEsIDB4MTgsCisJIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MUIsIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjAsIDB4NjAsIDB4NDYsCisJIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NjUsIDB4NDMsIDB4ODAsIDB4RjAsIDB4MDEsIDB4RkEsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsCisJIDB4MEIsIDB4MDAsIDB4NjQsIDB4NDYsIDB4NjIsIDB4NDMsIDB4MDAsIDB4RjIsIDB4QTMsIDB4REIsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjAsIDB4ODEsIDB4RkMsCisJIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4ODcsIDB4RjEsIDB4MTQsIDB4NjAsIDB4Q0UsIDB4NjEsCisJIDB4QTEsIDB4RDMsIDB4REEsIDB4ODEsIDB4RDAsIDB4ODAsIDB4REMsIDB4OUMsIDB4MDUsIDB4MDUsIDB4QTEsIDB4RDMsIDB4NEEsIDB4RDksIDB4QTAsIDB4REQsCisJIDB4REEsIDB4OUMsIDB4QTEsIDB4RDksIDB4RDMsIDB4NjAsIDB4MkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTQsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4QTAsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4NjIsIDB4MTgsIDB4MTQsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MDQsIDB4QTUsIDB4QTAsIDB4RDEsIDB4NzIsIDB4NDQsIDB4RkYsIDB4QjQsCisJIDB4NjQsIDB4NDAsIDB4RTAsIDB4MjIsIDB4MUYsIDB4QjQsIDB4NjQsIDB4NDAsIDB4RjgsIDB4MjIsIDB4MDcsIDB4QjQsIDB4MDIsIDB4MDAsIDB4MDMsIDB4MDQsCisJIDB4RDAsIDB4ODQsIDB4RDAsIDB4ODAsIDB4RkMsIDB4MDEsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsIDB4NjYsIDB4NDEsCisJIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsCisJIDB4MTIsIDB4NjAsIDB4Q0UsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsCisJIDB4MDAsIDB4RjgsIDB4ODgsIDB4RjMsIDB4NjMsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsCisJIDB4RkEsIDB4MDQsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsCisJIDB4NjEsIDB4NDYsIDB4MkUsIDB4RjAsIDB4NjYsIDB4NDEsIDB4MTIsIDB4NjAsIDB4Q0UsIDB4NjUsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4ODgsIDB4RjEsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjQsIDB4NDMsIDB4MTEsIDB4MTgsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MUIsCisJIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjAsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NjUsIDB4NDMsIDB4ODAsIDB4RjAsCisJIDB4MDEsIDB4RkEsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4MEIsIDB4MDAsIDB4NjQsIDB4NDYsIDB4NjIsIDB4NDMsIDB4MDAsIDB4RjIsCisJIDB4QTMsIDB4REIsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjAsIDB4ODEsIDB4RkMsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjAsIDB4NDMsCisJIDB4NjEsIDB4NDYsIDB4RDMsIDB4NjAsIDB4MkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjEsIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODcsIDB4RjEsIDB4NzIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDQsCisJIDB4RDAsIDB4ODQsIDB4RkIsIDB4MDEsIDB4RTAsIDB4ODMsIDB4ODgsIDB4RjMsIDB4MDIsIDB4QTMsIDB4NDMsIDB4OTMsIDB4NjYsIDB4NDQsIDB4MDAsIDB4QTgsCisJIDB4NTYsIDB4RkQsIDB4MzcsIDB4MDMsIDB4MDAsIDB4NjQsIDB4MkIsIDB4RkEsIDB4MDAsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4NjYsIDB4NDUsCisJIDB4NjMsIDB4NDYsIDB4MDMsIDB4RjIsIDB4MDQsIDB4RjAsIDB4ODUsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MkMsIDB4RkEsIDB4MkQsIDB4RjgsIDB4QUUsIDB4RkEsCisJIDB4Q0IsIDB4RjMsIDB4MkYsIDB4RkEsIDB4MzIsIDB4RkEsIDB4Q0MsIDB4RjMsIDB4MzAsIDB4RkEsIDB4MzMsIDB4RkEsIDB4Q0QsIDB4RjMsIDB4MzEsIDB4RkEsCisJIDB4MzQsIDB4RkEsIDB4QUMsIDB4RjEsIDB4MTksIDB4RjgsIDB4RkYsIDB4NjcsIDB4MEUsIDB4RkEsIDB4NjYsIDB4NDUsIDB4NjMsIDB4NDYsIDB4MEUsIDB4RjIsCisJIDB4NjUsIDB4NDYsIDB4MDIsIDB4NjMsIDB4MDAsIDB4N0UsIDB4MTMsIDB4RkEsIDB4M0YsIDB4RkMsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4ODgsIDB4RjMsCisJIDB4MDcsIDB4RkEsIDB4NjYsIDB4NDEsIDB4MDAsIDB4RjQsIDB4MDUsIDB4NjQsIDB4MDksIDB4RkEsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsCisJIDB4OEUsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjEsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4QzEsIDB4RkUsIDB4NTYsIDB4RjMsIDB4QTMsIDB4RkYsIDB4NjAsIDB4NDMsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OUQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NTYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NTgsIDB4MDMsIDB4NjUsIDB4RTIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NTYsIDB4RjMsIDB4MjYsIDB4NDYsIDB4NjAsIDB4NDMsIDB4NjYsIDB4NDEsIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsIDB4ODEsIDB4RjAsCisJIDB4MDIsIDB4MTgsIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsIDB4MTIsIDB4NjAsIDB4Q0UsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RjgsIDB4ODgsIDB4RjMsIDB4NjMsIDB4NDUsIDB4NjAsIDB4NDYsCisJIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsIDB4RkEsIDB4MDQsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RkEsCisJIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MkUsIDB4RjAsIDB4NjYsIDB4NDEsIDB4MTIsIDB4NjAsCisJIDB4Q0UsIDB4NjUsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4ODgsIDB4RjEsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjQsIDB4NDMsIDB4MTEsIDB4MTgsCisJIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MUIsIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjAsIDB4NjAsIDB4NDYsCisJIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NjUsIDB4NDMsIDB4ODAsIDB4RjAsIDB4MDEsIDB4RkEsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsCisJIDB4MEIsIDB4MDAsIDB4NjQsIDB4NDYsIDB4NjIsIDB4NDMsIDB4MDAsIDB4RjIsIDB4QTMsIDB4REIsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjAsIDB4ODEsIDB4RkMsCisJIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MkMsIDB4RjIsIDB4MkQsIDB4RjAsIDB4QUUsIDB4RjIsCisJIDB4NjYsIDB4NDUsIDB4NjMsIDB4NDYsIDB4MDMsIDB4RkEsIDB4MDQsIDB4RjgsIDB4NTUsIDB4RjMsIDB4ODUsIDB4RkEsIDB4RkYsIDB4QTAsIDB4NjUsIDB4NDYsCisJIDB4MDMsIDB4MDMsIDB4RDQsIDB4NjAsIDB4RDYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OTUsIDB4RjMsIDB4NjYsIDB4NDUsIDB4NjMsIDB4NDYsIDB4MUIsIDB4RkEsCisJIDB4NjUsIDB4NDYsIDB4QkEsIDB4NjUsIDB4NjAsIDB4NDQsIDB4QzQsIDB4ODUsIDB4MDEsIDB4NjAsIDB4RkUsIDB4NjEsIDB4MDAsIDB4NjQsIDB4ODAsIDB4NjMsCisJIDB4QzcsIDB4ODUsIDB4OTQsIDB4ODQsIDB4NTksIDB4REIsIDB4RkMsIDB4MUYsIDB4MDAsIDB4NjAsIDB4ODgsIDB4NjQsIDB4M0YsIDB4RkEsIDB4MDAsIDB4RjQsCisJIDB4MDIsIDB4NjQsIDB4MEEsIDB4RkEsIDB4MDAsIDB4NjQsIDB4MEIsIDB4RkEsIDB4ODAsIDB4N0YsIDB4MTAsIDB4N0UsIDB4MEMsIDB4RkEsIDB4MUEsIDB4NjUsCisJIDB4ODAsIDB4NjEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4MEYsIDB4NEUsIDB4RjIsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NEEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MEUsIDB4NEYsIDB4RDQsIDB4NjAsIDB4QTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MjMsIDB4RjAsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4MDAsIDB4RjQsIDB4MDMsIDB4MDMsIDB4RDQsIDB4NjAsIDB4NTAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDksIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4QTAsIDB4MDAsIDB4QTAsIDB4MEMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4RDMsIDB4NjAsIDB4Q0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4RjIsCisJIDB4MjYsIDB4NDYsIDB4RkYsIDB4QTAsIDB4ODcsIDB4RjQsIDB4MTAsIDB4MDIsIDB4RDQsIDB4NjAsIDB4RDYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RkQsIDB4QTAsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDMsIDB4MDYsIDB4MDAsIDB4RDQsIDB4NjAsIDB4MEMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RDQsIDB4NjAsIDB4MTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjQsIDB4NjYsIDB4NDEsIDB4NjMsIDB4NDYsCisJIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsIDB4MTIsIDB4NjAsCisJIDB4Q0UsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RjgsCisJIDB4ODgsIDB4RjMsIDB4NjMsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsIDB4RkEsIDB4MDQsCisJIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsCisJIDB4MTQsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDMsIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsIDB4RDUsIDB4ODAsIDB4QTEsIDB4RDEsIDB4MTEsIDB4MDMsCisJIDB4RDMsIDB4ODAsIDB4RDksIDB4ODEsIDB4RkEsIDB4MDIsIDB4QzksIDB4ODEsIDB4QzgsIDB4ODUsIDB4RDUsIDB4ODAsIDB4QTUsIDB4RDMsIDB4MDgsIDB4MjgsCisJIDB4QTEsIDB4REIsIDB4MTQsIDB4NjAsIDB4RDAsIDB4NjIsIDB4NjUsIDB4NDQsIDB4QTIsIDB4REIsIDB4NEEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4RDEsIDB4NjAsIDB4Q0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjQsIDB4NjYsIDB4NDEsIDB4NjMsIDB4NDYsCisJIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsIDB4MTIsIDB4NjAsCisJIDB4Q0UsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RjgsCisJIDB4ODgsIDB4RjMsIDB4NjMsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsIDB4RkEsIDB4MDQsCisJIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsCisJIDB4MTQsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDMsIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsIDB4RDUsIDB4ODAsIDB4QTEsIDB4RDEsIDB4MTEsIDB4MDMsCisJIDB4RDMsIDB4ODAsIDB4RDksIDB4ODEsIDB4RkEsIDB4MDIsIDB4QzksIDB4ODEsIDB4QzgsIDB4ODUsIDB4RDUsIDB4ODAsIDB4QTUsIDB4RDMsIDB4MDgsIDB4MjgsCisJIDB4QTEsIDB4REIsIDB4MTQsIDB4NjAsIDB4RDAsIDB4NjIsIDB4NjUsIDB4NDQsIDB4QTIsIDB4REIsIDB4NEEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4RDEsIDB4NjAsIDB4RDUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MzIsIDB4NDQsIDB4MDgsIDB4QjAsIDB4ODcsIDB4RjQsCisJIDB4MDMsIDB4MDIsIDB4RDEsIDB4NjAsIDB4RDUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDMsIDB4NjAsIDB4M0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDQsCisJIDB4MjYsIDB4NDYsIDB4MDgsIDB4QjAsIDB4MDcsIDB4RjIsIDB4MDMsIDB4MDIsIDB4RDEsIDB4NjAsIDB4RDUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsCisJIDB4MUIsIDB4RjIsIDB4MjYsIDB4NDYsIDB4QkEsIDB4NjUsIDB4NjAsIDB4NDQsIDB4QzQsIDB4ODUsIDB4MDEsIDB4NjAsIDB4RkUsIDB4NjEsIDB4MDAsIDB4NjQsCisJIDB4ODAsIDB4NjMsIDB4QzcsIDB4ODUsIDB4OTQsIDB4ODQsIDB4NTksIDB4REIsIDB4RkMsIDB4MUYsIDB4MDAsIDB4RjQsIDB4MDEsIDB4NjAsIDB4RkUsIDB4NjEsCisJIDB4N0UsIDB4NjUsIDB4MTgsIDB4NjMsIDB4NUIsIDB4RDIsIDB4NTksIDB4RDEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RDcsIDB4ODAsIDB4MTgsIDB4MDIsCisJIDB4RjksIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjMsIDB4MEUsIDB4NjUsIDB4NUIsIDB4RDIsIDB4NTksIDB4RDEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsCisJIDB4RDcsIDB4ODAsIDB4MEUsIDB4MDIsIDB4RjksIDB4MDIsIDB4MjYsIDB4NDYsIDB4MDcsIDB4RjQsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDEsIDB4N0UsCisJIDB4MDYsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjQsIDB4MEEsIDB4RkEsIDB4MDAsIDB4NjQsIDB4MEIsIDB4RkEsIDB4NTcsIDB4MDAsCisJIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjQsIDB4NjYsIDB4NDEsIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsCisJIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsIDB4MTIsIDB4NjAsIDB4Q0UsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RjgsIDB4ODgsIDB4RjMsIDB4NjMsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsIDB4RkEsIDB4MDQsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MTQsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDMsIDB4REEsIDB4ODEsCisJIDB4NjAsIDB4NDUsIDB4RDUsIDB4ODAsIDB4QTEsIDB4RDEsIDB4MTEsIDB4MDMsIDB4RDMsIDB4ODAsIDB4RDksIDB4ODEsIDB4RkEsIDB4MDIsIDB4QzksIDB4ODEsCisJIDB4QzgsIDB4ODUsIDB4RDUsIDB4ODAsIDB4QTUsIDB4RDMsIDB4MDgsIDB4MjgsIDB4QTEsIDB4REIsIDB4MTQsIDB4NjAsIDB4RDAsIDB4NjIsIDB4NjUsIDB4NDQsCisJIDB4QTIsIDB4REIsIDB4NEEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjQsIDB4MEEsIDB4RkEsCisJIDB4MEYsIDB4NjQsIDB4MEIsIDB4RkEsIDB4NDAsIDB4NTksIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsIDB4NDEsIDB4NTgsIDB4MjYsIDB4NDYsIDB4MkMsIDB4RjIsCisJIDB4QTEsIDB4REIsIDB4MkQsIDB4RjIsIDB4NTksIDB4REIsIDB4MkUsIDB4RjIsIDB4NTksIDB4REIsIDB4MDMsIDB4NjUsIDB4RTIsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4NjUsIDB4RTIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4ODgsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4OEUsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4RjQsIDB4MEEsIDB4RjIsIDB4MDksIDB4RjIsIDB4RkYsIDB4QTAsIDB4MDAsIDB4QTAsIDB4MDYsIDB4MDIsCisJIDB4RkYsIDB4QTAsIDB4MDcsIDB4MDMsIDB4MDksIDB4MDMsIDB4RDMsIDB4NjAsIDB4Q0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDMsIDB4NjAsIDB4OEMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RDQsIDB4NjAsIDB4REIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MDcsIDB4RjQsIDB4MDYsIDB4RjIsIDB4NjYsIDB4NDMsCisJIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4MjYsIDB4NDYsIDB4RDMsIDB4NjAsIDB4M0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4MDYsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4N0UsIDB4MDYsIDB4RkEsIDB4MjYsIDB4NDYsIDB4ODgsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsCisJIDB4MEEsIDB4RkEsIDB4MDAsIDB4NjQsIDB4MEIsIDB4RkEsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4OEUsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsCisJIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsIDB4QUMsIDB4N0MsIDB4MkEsIDB4RjIsIDB4QTQsIDB4REIsIDB4MjIsIDB4NjAsCisJIDB4MkEsIDB4NjMsIDB4RkYsIDB4QjQsIDB4MDEsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4N0MsIDB4QTMsIDB4REIsIDB4NjAsIDB4NDAsIDB4MDAsIDB4MzYsCisJIDB4MDMsIDB4MDAsIDB4MDIsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MzAsIDB4N0MsIDB4NDEsIDB4NDcsIDB4MkEsIDB4RjgsIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsCisJIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsIDB4MkUsIDB4RkEsIDB4Q0IsIDB4RjMsIDB4MkYsIDB4RkEsIDB4Q0MsIDB4RjMsIDB4MzAsIDB4RkEsCisJIDB4Q0QsIDB4RjMsIDB4MzEsIDB4RkEsIDB4NjcsIDB4RjMsIDB4MzIsIDB4RkEsIDB4NjgsIDB4RjMsIDB4MzMsIDB4RkEsIDB4NjksIDB4RjMsIDB4MzQsIDB4RkEsCisJIDB4QUMsIDB4RjEsIDB4MTksIDB4RjgsIDB4MDAsIDB4N0MsIDB4M0UsIDB4RjgsIDB4MUMsIDB4RjAsIDB4MTMsIDB4RjgsIDB4MDcsIDB4RjIsIDB4ODgsIDB4RjEsCisJIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4RDksIDB4NjAsIDB4QTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NEIsCisJIDB4QUIsIDB4NDYsIDB4MDYsIDB4RjIsIDB4QUIsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MDEsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4RDksIDB4NjAsCisJIDB4QTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4NjAsIDB4MkMsIDB4NjMsIDB4MDksIDB4RjIsIDB4QkQsIDB4REIsIDB4NDMsIDB4NDQsIDB4MTAsIDB4QjAsCisJIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjMsIDB4MEQsIDB4MDMsIDB4MUYsIDB4NjAsIDB4OTIsIDB4NjIsIDB4QTIsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsCisJIDB4RkUsIDB4MjYsIDB4MDgsIDB4MDAsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDYsIDB4MDAsIDB4REEsIDB4NjAsIDB4MDIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MzIsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDAsIDB4NjMsIDB4QUIsIDB4NDYsIDB4MDYsIDB4RjAsIDB4N0YsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsCisJIDB4NjMsIDB4NDUsIDB4QjQsIDB4ODQsIDB4MDYsIDB4RkEsIDB4QUIsIDB4NDYsIDB4MEEsIDB4RjAsIDB4NTYsIDB4RjksIDB4MjQsIDB4NDMsIDB4QkQsIDB4RDksCisJIDB4NDMsIDB4NDQsIDB4MDEsIDB4NjMsIDB4MzIsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MTAsIDB4QkIsIDB4MUYsIDB4NjAsIDB4OTIsIDB4NjIsIDB4QTIsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4RkUsIDB4MjYsIDB4MTAsIDB4QkIsIDB4MDksIDB4RkMsIDB4MjcsIDB4NDQsIDB4RkUsIDB4QTAsIDB4RkYsIDB4RkYsCisJIDB4MDMsIDB4MDMsIDB4RDUsIDB4NjAsIDB4RkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsIDB4QTIsIDB4NjQsIDB4MjQsIDB4NDMsIDB4MEIsIDB4RjAsCisJIDB4QTAsIDB4RDksIDB4QkQsIDB4RDksIDB4MEMsIDB4RjAsIDB4NTgsIDB4RDksIDB4QkQsIDB4RDksIDB4MEQsIDB4RjAsIDB4NTgsIDB4RDksIDB4QkQsIDB4RDksCisJIDB4NDMsIDB4NDQsIDB4MUMsIDB4NjUsIDB4MkQsIDB4NjEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QTUsIDB4RDAsIDB4REEsIDB4ODUsIDB4NjQsIDB4NDQsCisJIDB4MDAsIDB4N0YsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsIDB4MDUsIDB4MDMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsCisJIDB4RjQsIDB4MDIsIDB4MDIsIDB4NjAsIDB4MDIsIDB4NjEsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODQsIDB4MDQsIDB4QTUsIDB4QzUsIDB4ODEsCisJIDB4QTEsIDB4RDMsIDB4MDAsIDB4NjUsIDB4NjAsIDB4NDMsIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4N0YsIDB4QjQsIDB4MDIsIDB4M0EsIDB4MDIsIDB4MDAsCisJIDB4MDEsIDB4NjQsIDB4MTUsIDB4MDAsIDB4MDQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjQsIDB4MTEsIDB4MDAsIDB4MEEsIDB4M0EsIDB4MDIsIDB4MDAsCisJIDB4MDQsIDB4NjQsIDB4MEQsIDB4MDAsIDB4MEIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjQsIDB4MDksIDB4MDAsIDB4MTAsIDB4M0EsIDB4MDIsIDB4MDAsCisJIDB4MTAsIDB4NjQsIDB4MDUsIDB4MDAsIDB4MTYsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MjAsIDB4NjQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjQsIDB4Q0YsIDB4ODMsCisJIDB4QjQsIDB4ODUsIDB4RTEsIDB4MDIsIDB4NjUsIDB4NDQsIDB4NjAsIDB4RkIsIDB4QjgsIDB4RjMsIDB4MkIsIDB4NDUsIDB4NjYsIDB4NDEsIDB4NjUsIDB4NDYsCisJIDB4OEMsIDB4RkEsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDYsIDB4MDAsIDB4MDIsIDB4MzYsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MzYsIDB4MDIsIDB4MDAsCisJIDB4MDUsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MDEsIDB4MDAsIDB4MDEsIDB4NjQsIDB4NkYsIDB4RkEsIDB4NUYsIDB4RjMsIDB4NjAsIDB4RjEsCisJIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsIDB4NjUsIDB4NDMsIDB4MDIsIDB4MDIsIDB4NUYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4MEYsIDB4NjAsCisJIDB4QUUsIDB4NjUsIDB4QjgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjEsIDB4NDUsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MDIsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MDMsIDB4QTQsIDB4ODQsIDB4NjEsIDB4RkIsIDB4NkYsIDB4RjAsCisJIDB4NjAsIDB4NDcsIDB4OTAsIDB4ODQsIDB4NkYsIDB4RkEsIDB4NjAsIDB4NDcsIDB4NjAsIDB4NDUsIDB4ODAsIDB4NjQsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4RkMsIDB4MDMsIDB4QTQsIDB4ODQsIDB4NzAsIDB4RjAsIDB4NzAsIDB4RkEsIDB4MDAsIDB4NjEsIDB4RTgsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MDUsIDB4REQsIDB4ODEsIDB4RkIsIDB4MDEsIDB4RTEsIDB4ODEsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MEUsIDB4RkEsCisJIDB4NjYsIDB4NDMsIDB4MEMsIDB4RjQsIDB4RkYsIDB4RkYsIDB4RDYsIDB4NjAsIDB4ODAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjUsIDB4MkQsIDB4NjEsCisJIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QTUsIDB4RDAsIDB4REEsIDB4ODUsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsCisJIDB4MDUsIDB4MDMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsIDB4RjQsIDB4MDIsIDB4MDIsIDB4NjAsIDB4MDIsIDB4NjEsCisJIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODQsIDB4MDQsIDB4QTUsIDB4QzUsIDB4ODEsIDB4QTEsIDB4RDMsIDB4MDAsIDB4NjUsIDB4NjAsIDB4NDMsCisJIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4N0YsIDB4QjQsIDB4MDIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjQsIDB4MTUsIDB4MDAsIDB4MDQsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjQsIDB4MTEsIDB4MDAsIDB4MEEsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjQsIDB4MEQsIDB4MDAsIDB4MEIsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjQsIDB4MDksIDB4MDAsIDB4MTAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTAsIDB4NjQsIDB4MDUsIDB4MDAsIDB4MTYsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MjAsIDB4NjQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjQsIDB4Q0YsIDB4ODMsIDB4QjQsIDB4ODUsIDB4RTEsIDB4MDIsIDB4NjUsIDB4NDQsCisJIDB4NjAsIDB4RkIsIDB4QjgsIDB4RjMsIDB4MkIsIDB4NDUsIDB4NjYsIDB4NDEsIDB4NjUsIDB4NDYsIDB4OEMsIDB4RkEsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsCisJIDB4MDYsIDB4MDAsIDB4MDIsIDB4MzYsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MDUsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjQsCisJIDB4MDEsIDB4MDAsIDB4MDEsIDB4NjQsIDB4NkYsIDB4RkEsIDB4NUYsIDB4RjMsIDB4NjAsIDB4RjEsIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsIDB4NjUsIDB4NDMsCisJIDB4MDIsIDB4MDIsIDB4NUYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4MEYsIDB4NjAsIDB4QUUsIDB4NjUsIDB4QjgsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjEsIDB4NDUsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDIsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4RkMsIDB4MDMsIDB4QTQsIDB4ODQsIDB4NjEsIDB4RkIsIDB4NkYsIDB4RjAsIDB4NjAsIDB4NDcsIDB4OTAsIDB4ODQsIDB4NkYsIDB4RkEsCisJIDB4NjAsIDB4NDcsIDB4NjAsIDB4NDUsIDB4ODAsIDB4NjQsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MDMsIDB4QTQsIDB4ODQsCisJIDB4NzAsIDB4RjAsIDB4NzAsIDB4RkEsIDB4MDAsIDB4NjEsIDB4RTgsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDUsIDB4REQsIDB4ODEsIDB4RkIsIDB4MDEsCisJIDB4RTEsIDB4ODEsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MEUsIDB4RkEsIDB4NjYsIDB4NDMsIDB4MEMsIDB4RjQsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4MTYsIDB4NjUsIDB4MjcsIDB4NDAsIDB4MDIsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MUMsIDB4NjUsCisJIDB4RjYsIDB4QTQsIDB4MDEsIDB4MDAsIDB4RkMsIDB4QTQsIDB4MjQsIDB4NDMsIDB4MjIsIDB4NjAsIDB4ODIsIDB4NjEsIDB4NUQsIDB4OTEsIDB4NTEsIDB4OTAsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjgsIDB4NjAsIDB4NDEsIDB4Q0QsIDB4ODQsIDB4NEMsIDB4OTEsIDB4NjAsIDB4NDMsIDB4NjAsIDB4RkUsIDB4QTUsIDB4RDIsCisJIDB4REUsIDB4ODUsIDB4N0YsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4NUQsIDB4OTMsIDB4QTMsIDB4REIsIDB4NUQsIDB4OTMsCisJIDB4QTUsIDB4RDIsIDB4RjYsIDB4MUYsIDB4NUQsIDB4OTMsIDB4MjAsIDB4RkUsIDB4REYsIDB4ODMsIDB4MjIsIDB4NjAsIDB4MjgsIDB4N0MsIDB4MDMsIDB4MUUsCisJIDB4NjAsIDB4RkUsIDB4QkQsIDB4REYsIDB4MjAsIDB4RkUsIDB4MjIsIDB4NjAsIDB4MkMsIDB4NjQsIDB4NTMsIDB4OTMsIDB4QTQsIDB4REQsIDB4MjYsIDB4NDYsCisJIDB4MDAsIDB4RjQsIDB4MUYsIDB4NjAsIDB4OTAsIDB4NjQsIDB4QTAsIDB4RDMsIDB4MDAsIDB4NjMsIDB4MDAsIDB4QjgsIDB4MEEsIDB4RkMsIDB4MDMsIDB4MDIsCisJIDB4RDcsIDB4NjAsIDB4MTQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4RjIsIDB4MjcsIDB4NDAsIDB4MDIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEUsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MDAsIDB4M0EsIDB4MjYsIDB4MDAsIDB4NjAsIDB4NDEsIDB4MDAsIDB4MzYsIDB4MjMsIDB4MDAsIDB4RTAsIDB4QTAsCisJIDB4REEsIDB4ODUsIDB4MjAsIDB4MDcsIDB4MUYsIDB4NjAsIDB4MUUsIDB4NjMsIDB4QTMsIDB4RDEsIDB4NjUsIDB4NDIsIDB4RDEsIDB4ODAsIDB4MUYsIDB4NjAsCisJIDB4MjAsIDB4NjMsIDB4MTgsIDB4MDIsIDB4NTAsIDB4RkUsIDB4NjEsIDB4NDAsIDB4RkUsIDB4MjIsIDB4MDgsIDB4MDAsIDB4NjIsIDB4NDUsIDB4QkQsIDB4RDMsCisJIDB4QTUsIDB4RDAsIDB4REEsIDB4ODIsIDB4RDAsIDB4ODAsIDB4QzksIDB4ODEsIDB4RjYsIDB4MEMsIDB4MEMsIDB4MDAsIDB4NjEsIDB4NDAsIDB4MDAsIDB4MzYsCisJIDB4MzMsIDB4MDAsIDB4NjIsIDB4NDUsIDB4QTMsIDB4RDMsIDB4QTUsIDB4RDAsIDB4RkYsIDB4RkYsIDB4OTAsIDB4ODAsIDB4RkYsIDB4MjYsIDB4MDIsIDB4MDAsCisJIDB4REUsIDB4ODIsIDB4MkEsIDB4MDAsIDB4MEMsIDB4NjMsIDB4MEEsIDB4RkMsIDB4MDAsIDB4NjQsIDB4MDksIDB4RkEsIDB4MEIsIDB4RkEsIDB4MDEsIDB4N0UsCisJIDB4MEMsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MDgsIDB4NjQsIDB4M0YsIDB4RkEsIDB4MDcsIDB4RjIsIDB4ODgsIDB4RjEsIDB4NDAsIDB4NTgsIDB4MDcsIDB4RjgsCisJIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4OEUsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4REEsIDB4NjAsIDB4MUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsCisJIDB4MjEsIDB4NjAsIDB4RTIsIDB4NjEsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjIsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4RDgsIDB4NjAsCisJIDB4OUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjMsIDB4RDcsIDB4MDEsIDB4MUYsIDB4NjAsIDB4OTIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MjAsIDB4MEQsIDB4MDAsIDB4RDgsIDB4NjAsIDB4OUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsCisJIDB4MjgsIDB4NDYsIDB4MkEsIDB4NDEsIDB4RkYsIDB4QjEsIDB4NjAsIDB4RkUsIDB4ODIsIDB4NjQsIDB4QTEsIDB4REEsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsCisJIDB4MTUsIDB4MDAsIDB4MjEsIDB4NjAsIDB4RUUsIDB4NjEsIDB4QTEsIDB4REYsIDB4RDksIDB4ODEsIDB4QTEsIDB4REYsIDB4RDksIDB4ODEsIDB4QTEsIDB4REYsCisJIDB4MDQsIDB4QTEsIDB4QTEsIDB4REYsIDB4RDksIDB4ODEsIDB4QTEsIDB4REYsIDB4RDksIDB4ODEsIDB4QTEsIDB4REYsIDB4RDksIDB4ODEsIDB4QTEsIDB4REYsCisJIDB4MkIsIDB4NDYsIDB4MzcsIDB4RjIsIDB4N0YsIDB4NjAsIDB4Q0YsIDB4NjUsIDB4QTQsIDB4ODQsIDB4QTIsIDB4REEsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjIsCisJIDB4MDAsIDB4RjQsIDB4MjcsIDB4NDAsIDB4MDIsIDB4M0EsIDB4NDAsIDB4MDAsIDB4NjAsIDB4NDMsIDB4RjYsIDB4QTMsIDB4MDAsIDB4NjAsIDB4MUIsIDB4NjEsCisJIDB4MDAsIDB4NjAsIDB4REQsIDB4NjUsIDB4NjAsIDB4RkUsIDB4ODEsIDB4QTEsIDB4N0YsIDB4QTEsIDB4MDIsIDB4MDYsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsCisJIDB4REQsIDB4ODEsIDB4QTEsIDB4RDIsIDB4Q0YsIDB4ODMsIDB4RDQsIDB4ODAsIDB4MkQsIDB4MDMsIDB4MTcsIDB4MDMsIDB4Q0YsIDB4ODMsIDB4NjEsIDB4NDQsCisJIDB4ODAsIDB4QTAsIDB4MjgsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDIsIDB4Q0YsIDB4ODMsCisJIDB4ODEsIDB4QTEsIDB4MjAsIDB4MDMsIDB4MDUsIDB4MDcsIDB4N0YsIDB4QTEsIDB4Q0MsIDB4ODQsIDB4REQsIDB4ODEsIDB4RTQsIDB4MDMsIDB4RjcsIDB4MDEsCisJIDB4MDAsIDB4RjQsIDB4MDAsIDB4QjgsIDB4MDQsIDB4NjEsIDB4RTQsIDB4MDMsIDB4RjIsIDB4MDEsIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjMsIDB4NDYsIDB4NDgsCisJIDB4NDEsIDB4NEEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDAsIDB4REYsIDB4ODMsIDB4QTMsIDB4RDksIDB4NjQsIDB4NDQsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDAsCisJIDB4REYsIDB4ODMsIDB4QTMsIDB4RDksIDB4Q0MsIDB4ODQsIDB4ODEsIDB4QTEsIDB4MDUsIDB4MDMsIDB4N0YsIDB4QTEsIDB4RjcsIDB4MDQsIDB4MDAsIDB4RjQsCisJIDB4MDMsIDB4NjEsIDB4RjQsIDB4MDEsIDB4MjAsIDB4RkUsIDB4M0YsIDB4MDAsIDB4NjAsIDB4NDMsIDB4RkMsIDB4QTMsIDB4MDAsIDB4NjAsIDB4MTUsIDB4NjEsCisJIDB4MDAsIDB4NjAsIDB4REQsIDB4NjUsIDB4NjAsIDB4RkUsIDB4ODEsIDB4QTEsIDB4N0YsIDB4QTEsIDB4MDIsIDB4MDYsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsCisJIDB4REQsIDB4ODEsIDB4QTEsIDB4RDIsIDB4Q0YsIDB4ODMsIDB4RDQsIDB4ODAsIDB4MkQsIDB4MDMsIDB4MTcsIDB4MDMsIDB4Q0YsIDB4ODMsIDB4NjEsIDB4NDQsCisJIDB4ODAsIDB4QTAsIDB4MjgsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDIsIDB4Q0YsIDB4ODMsCisJIDB4ODEsIDB4QTEsIDB4MjAsIDB4MDMsIDB4MDUsIDB4MDcsIDB4N0YsIDB4QTEsIDB4Q0MsIDB4ODQsIDB4REQsIDB4ODEsIDB4RTQsIDB4MDMsIDB4RjcsIDB4MDEsCisJIDB4MDAsIDB4RjQsIDB4MDAsIDB4QjgsIDB4MDQsIDB4NjEsIDB4RTQsIDB4MDMsIDB4RjIsIDB4MDEsIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjMsIDB4NDYsIDB4NDgsCisJIDB4NDEsIDB4NEEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDAsIDB4REYsIDB4ODMsIDB4QTMsIDB4RDksIDB4NjQsIDB4NDQsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDAsCisJIDB4REYsIDB4ODMsIDB4QTMsIDB4RDksIDB4Q0MsIDB4ODQsIDB4ODEsIDB4QTEsIDB4MDUsIDB4MDMsIDB4N0YsIDB4QTEsIDB4RjcsIDB4MDQsIDB4MDAsIDB4RjQsCisJIDB4MDMsIDB4NjEsIDB4RjQsIDB4MDEsIDB4MjAsIDB4RkUsIDB4MDAsIDB4QkIsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsIDB4MDgsIDB4MjQsIDB4RDcsIDB4MDAsCisJIDB4NjAsIDB4RkUsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RkEsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDUsIDB4NTAsIDB4MDEsIDB4REQsIDB4ODEsCisJIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDAsIDB4M0EsIDB4NEEsIDB4MDEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDAsIDB4NTAsIDB4M0EsIDB4NDQsIDB4MDEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4RjIsIDB4M0EsCisJIDB4M0UsIDB4MDEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4M0EsIDB4MjAsIDB4MDEsIDB4REQsIDB4ODEsCisJIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4M0EsIDB4MUEsIDB4MDEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MTQsIDB4MDEsIDB4NjAsIDB4NUMsIDB4MDAsIDB4MzYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4NjQsIDB4RDgsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4QzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjEsIDB4NjAsIDB4RjYsIDB4NjIsIDB4QTIsIDB4REIsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsCisJIDB4MkIsIDB4MDAsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDMsIDB4REQsIDB4ODEsIDB4RDgsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QzQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjEsIDB4NjAsIDB4RjgsIDB4NjIsIDB4QTIsIDB4REIsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MjQsIDB4MDAsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDMsCisJIDB4REQsIDB4ODEsIDB4RDgsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjEsIDB4NjAsIDB4RkEsIDB4NjIsIDB4QTIsIDB4REIsCisJIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MUQsIDB4MDAsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4MjEsIDB4NjAsIDB4RkMsIDB4NjIsIDB4QTIsIDB4RDksCisJIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4MjEsIDB4NjAsIDB4RkQsIDB4NjIsIDB4QTIsIDB4RDksIDB4MTksIDB4MDAsIDB4MjAsIDB4RkUsIDB4MjEsIDB4NjAsCisJIDB4RjYsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjAsIDB4RkUsIDB4MjEsIDB4NjAsIDB4RjgsIDB4NjIsIDB4MDAsIDB4NjAsCisJIDB4MDQsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjAsIDB4RkUsIDB4MjEsIDB4NjAsIDB4RkEsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MjAsIDB4RkUsIDB4MjEsIDB4NjAsIDB4RkMsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4MDAsIDB4MjAsIDB4RkUsCisJIDB4MjEsIDB4NjAsIDB4RTIsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MjEsIDB4NjAsIDB4RjYsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4MjYsIDB4MDksIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDksIDB4MDAsIDB4MjAsIDB4MjYsIDB4MDksIDB4MDAsIDB4MDIsIDB4MjYsCisJIDB4MDksIDB4MDAsIDB4RDcsIDB4NjAsIDB4MDcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4N0MsIDB4MDUsIDB4MDAsIDB4MDQsIDB4N0MsIDB4MDMsIDB4MDAsCisJIDB4MjAsIDB4N0MsIDB4MDEsIDB4MDAsIDB4MDIsIDB4N0MsIDB4MjEsIDB4NjAsIDB4RUUsIDB4NjEsIDB4QTEsIDB4RDksIDB4MjEsIDB4NjAsIDB4RTQsIDB4NjEsCisJIDB4QTEsIDB4RDEsIDB4MjEsIDB4NjAsIDB4RjgsIDB4NjEsIDB4QTEsIDB4RDMsIDB4MjEsIDB4NjAsIDB4RUUsIDB4NjEsIDB4QTAsIDB4ODQsIDB4QTEsIDB4RDEsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4MjYsIDB4MDcsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MEQsIDB4MDAsIDB4RDcsIDB4NjAsCisJIDB4MDcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4N0MsIDB4MDksIDB4MDAsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MjIsIDB4MDMsIDB4MDAsIDB4RDcsIDB4NjAsCisJIDB4MDcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4N0MsIDB4MDEsIDB4MDAsIDB4MDEsIDB4N0MsIDB4MjEsIDB4NjAsIDB4RjAsIDB4NjEsIDB4QTEsIDB4RDksCisJIDB4MjEsIDB4NjAsIDB4RTYsIDB4NjEsIDB4QTEsIDB4RDEsIDB4MjEsIDB4NjAsIDB4RkEsIDB4NjEsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsCisJIDB4MDIsIDB4MjYsIDB4MDcsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MDcsIDB4MDAsIDB4RDcsIDB4NjAsIDB4MDcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4N0MsIDB4MDMsIDB4MDAsIDB4MDQsIDB4N0MsIDB4MDEsIDB4MDAsIDB4MjAsIDB4N0MsIDB4MjEsIDB4NjAsIDB4RjIsIDB4NjEsCisJIDB4QTEsIDB4RDksIDB4MjEsIDB4NjAsIDB4RkMsIDB4NjEsIDB4QTEsIDB4RDEsIDB4MjEsIDB4NjAsIDB4RjQsIDB4NjEsIDB4QTEsIDB4RDksIDB4MjEsIDB4NjAsCisJIDB4RjIsIDB4NjEsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MjEsIDB4NjAsIDB4RjAsIDB4NjEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsCisJIDB4QjAsIDB4ODQsIDB4MUYsIDB4NjAsIDB4OTIsIDB4NjIsIDB4QTIsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MjIsIDB4QkMsCisJIDB4QUIsIDB4NDYsIDB4MzYsIDB4RkEsIDB4QUIsIDB4NDYsIDB4MjEsIDB4NjAsIDB4RUUsIDB4NjEsIDB4QTEsIDB4RDMsIDB4MUYsIDB4NjAsIDB4OTIsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MjIsIDB4QkMsIDB4ODgsIDB4RjEsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsCisJIDB4MzYsIDB4RkEsIDB4RkYsIDB4RkYsIDB4NjEsIDB4NDYsIDB4NTAsIDB4MDAsIDB4MjEsIDB4NjAsIDB4RkUsIDB4NjIsIDB4QTIsIDB4REIsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4MDMsIDB4MDIsIDB4MDEsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4MDIsIDB4QTUsIDB4NjQsIDB4NDQsIDB4RDQsIDB4OUMsCisJIDB4MjIsIDB4NjAsIDB4MDAsIDB4NjIsIDB4QTIsIDB4RDksIDB4MjIsIDB4NjAsIDB4MDIsIDB4NjIsIDB4QTIsIDB4REYsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsCisJIDB4MDAsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MDEsIDB4NjUsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsCisJIDB4NTAsIDB4M0EsIDB4MDEsIDB4NjUsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4RjIsIDB4M0EsIDB4MDEsIDB4NjUsCisJIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4NjUsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MTgsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4NjQsIDB4NDAsCisJIDB4MDAsIDB4MzYsIDB4MDEsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDIsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MzYsIDB4MDQsIDB4NjUsCisJIDB4NjQsIDB4NDAsIDB4MDQsIDB4MzYsIDB4MTAsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDUsIDB4MzYsIDB4MjAsIDB4NjUsIDB4NjUsIDB4NUMsIDB4MjIsIDB4NjAsCisJIDB4MDIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjEsIDB4NjAsIDB4RkUsIDB4NjIsIDB4QTIsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTQsIDB4QTIsIDB4REIsIDB4Q0EsIDB4MDIsIDB4MjIsIDB4NjAsIDB4MDIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MjIsIDB4NjAsCisJIDB4MDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QUIsIDB4NDYsIDB4ODIsIDB4RjAsIDB4QzAsIDB4NjcsIDB4QjQsIDB4ODQsCisJIDB4QUIsIDB4NDYsIDB4MEIsIDB4RkEsIDB4MUYsIDB4NjAsIDB4QTAsIDB4NjQsIDB4QTAsIDB4RDEsIDB4MjIsIDB4NjAsIDB4RDQsIDB4N0MsIDB4MDQsIDB4MUIsCisJIDB4RkYsIDB4NjAsIDB4RkYsIDB4NjMsIDB4QTQsIDB4REQsIDB4MjksIDB4MDAsIDB4MjMsIDB4NjAsIDB4M0MsIDB4NjMsIDB4QTQsIDB4REQsIDB4REIsIDB4ODMsCisJIDB4NjAsIDB4RkUsIDB4MDAsIDB4NjQsIDB4QkQsIDB4REIsIDB4NjAsIDB4NjQsIDB4QkQsIDB4REIsIDB4MUQsIDB4NjQsIDB4QkQsIDB4REIsIDB4QzMsIDB4RjMsCisJIDB4QkQsIDB4REIsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MDEsIDB4NjAsIDB4NzgsIDB4NjQsIDB4MDYsIDB4NjEsIDB4NTgsIDB4RDEsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDksIDB4MjAsIDB4RkUsIDB4Q0QsIDB4ODEsIDB4NjEsIDB4NDAsIDB4MDgsIDB4MjgsIDB4RjcsIDB4MDEsIDB4QjcsIDB4RjEsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDcsIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDksIDB4QkQsIDB4REIsIDB4MjAsIDB4RkUsIDB4MUYsIDB4NjAsIDB4OUMsIDB4NjQsCisJIDB4QTAsIDB4RDEsIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDksIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MjIsIDB4NjAsIDB4RDIsIDB4NjQsIDB4NDAsIDB4NDgsCisJIDB4MTgsIDB4NjEsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4RkYsIDB4NjAsIDB4RjIsIDB4NjQsIDB4RTEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RTUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RkMsIDB4MkIsIDB4NDYsIDB4NTYsIDB4RjEsIDB4MTYsIDB4NjAsIDB4QUMsIDB4NjEsIDB4MUIsIDB4RjgsCisJIDB4QTEsIDB4RDEsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4MDYsIDB4RjIsIDB4MEMsIDB4MDMsIDB4MTAsIDB4QkMsIDB4MDYsIDB4RkEsCisJIDB4ODcsIDB4RjMsIDB4MDAsIDB4NjAsIDB4RTIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4NjAsIDB4NDUsIDB4RDQsIDB4ODAsIDB4REMsIDB4ODQsIDB4MDcsIDB4MDcsCisJIDB4QTIsIDB4REIsIDB4MDUsIDB4MDAsIDB4MTAsIDB4QjUsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4RDQsIDB4ODQsIDB4MDYsIDB4RkEsIDB4MDcsIDB4RjIsCisJIDB4NjYsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MDIsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MTIsIDB4MDMsIDB4MjYsIDB4NDYsCisJIDB4ODgsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4OEUsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsCisJIDB4NEMsIDB4MDAsIDB4MjYsIDB4NDYsIDB4ODgsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4OEUsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsCisJIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MUEsIDB4MDAsIDB4MDAsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MDIsIDB4NjQsIDB4M0YsIDB4RkEsCisJIDB4ODgsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDksIDB4NjQsIDB4MDksIDB4RkEsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsCisJIDB4OEUsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkIsIDB4NDMsIDB4MTQsIDB4NjAsIDB4RDAsIDB4NjIsCisJIDB4QTIsIDB4RDMsIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsIDB4RDUsIDB4ODAsIDB4QTEsIDB4RDEsIDB4MTEsIDB4MDMsIDB4RDMsIDB4ODAsIDB4RDksIDB4ODEsCisJIDB4RkEsIDB4MDIsIDB4QzksIDB4ODEsIDB4QzgsIDB4ODUsIDB4RDUsIDB4ODAsIDB4QTUsIDB4RDMsIDB4MDgsIDB4MjgsIDB4QTEsIDB4REIsIDB4MTQsIDB4NjAsCisJIDB4RDAsIDB4NjIsIDB4NjUsIDB4NDQsIDB4QTIsIDB4REIsIDB4NEEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4QTIsIDB4REIsIDB4QUIsIDB4NDYsCisJIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4MDYsIDB4RkEsIDB4QUIsIDB4NDYsIDB4QUIsIDB4NDYsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjQsCisJIDB4MDIsIDB4RjAsIDB4NzIsIDB4RjEsIDB4QTAsIDB4ODQsIDB4RDAsIDB4ODAsIDB4MDIsIDB4RkEsIDB4QUIsIDB4NDYsIDB4MDEsIDB4MDYsIDB4NzIsIDB4RkIsCisJIDB4MjcsIDB4NDEsIDB4MDEsIDB4QjEsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDMsIDB4MkIsIDB4NDYsIDB4MEIsIDB4NTgsIDB4MDEsIDB4NjUsIDB4RTIsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4ODYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MkIsIDB4NDYsIDB4MEIsIDB4NTgsIDB4MTYsIDB4NjAsIDB4QTIsIDB4NjQsCisJIDB4NDAsIDB4NTksIDB4MDIsIDB4NjUsIDB4RTIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MDAsIDB4NjQsIDB4MDksIDB4RkEsIDB4MEIsIDB4RkEsIDB4MDEsIDB4N0UsCisJIDB4MEMsIDB4RkEsIDB4MEEsIDB4NjQsIDB4MEEsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MDgsIDB4NjQsIDB4M0YsIDB4RkEsIDB4MDcsIDB4RjIsIDB4ODgsIDB4RjEsCisJIDB4NDAsIDB4NTgsIDB4MDcsIDB4RjgsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4OEUsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4RkYsIDB4NjAsIDB4RkQsIDB4NjUsCisJIDB4MzgsIDB4NDYsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODMsIDB4MDYsIDB4RkMsIDB4MDIsIDB4QjAsIDB4MjYsIDB4NDYsIDB4MUMsIDB4MDMsCisJIDB4MzgsIDB4NDMsIDB4ODcsIDB4RjEsIDB4MTQsIDB4NjAsIDB4Q0UsIDB4NjEsIDB4QTEsIDB4RDMsIDB4REEsIDB4ODEsIDB4RDAsIDB4ODAsIDB4REMsIDB4OUMsCisJIDB4MDUsIDB4MDUsIDB4QTEsIDB4RDMsIDB4NEEsIDB4RDksIDB4QTAsIDB4REQsIDB4REEsIDB4OUMsIDB4QTEsIDB4RDksIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsCisJIDB4MkMsIDB4RjIsIDB4QTEsIDB4REIsIDB4MkQsIDB4RjIsIDB4NDEsIDB4NTgsIDB4NTksIDB4REIsIDB4MkUsIDB4RjIsIDB4NTksIDB4REIsIDB4MDMsIDB4NjUsCisJIDB4RTIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDcsIDB4RjIsIDB4ODgsIDB4RjEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4NDAsIDB4NDcsIDB4MDcsIDB4RjIsIDB4NjYsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MDIsIDB4QjAsIDB4RkYsIDB4RkYsCisJIDB4MUIsIDB4MDIsIDB4MjcsIDB4NDMsIDB4MTQsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDMsIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsIDB4RDUsIDB4ODAsCisJIDB4QTEsIDB4RDEsIDB4MTEsIDB4MDMsIDB4RDMsIDB4ODAsIDB4RDksIDB4ODEsIDB4RkEsIDB4MDIsIDB4QzksIDB4ODEsIDB4QzgsIDB4ODUsIDB4RDUsIDB4ODAsCisJIDB4QTUsIDB4RDMsIDB4MDgsIDB4MjgsIDB4QTEsIDB4REIsIDB4MTQsIDB4NjAsIDB4RDAsIDB4NjIsIDB4NjUsIDB4NDQsIDB4QTIsIDB4REIsIDB4NEEsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4QTIsIDB4REIsIDB4MEMsIDB4MDAsIDB4MjcsIDB4NDQsIDB4NDAsIDB4NTgsIDB4MDMsIDB4NjUsIDB4RTIsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4ODYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDMsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OUQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjQsIDB4NjYsIDB4NDEsIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsCisJIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsIDB4MTIsIDB4NjAsIDB4Q0UsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RjgsIDB4ODgsIDB4RjMsIDB4NjMsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsIDB4RkEsIDB4MDQsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjIsIDB4ODgsIDB4RjEsCisJIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NDcsIDB4MDcsIDB4RjIsCisJIDB4NjYsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MDIsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDYsIDB4MDYsIDB4RjAsIDB4RkYsIDB4NjAsIDB4RUQsIDB4NjQsIDB4QTAsIDB4ODQsIDB4MDYsIDB4RkEsIDB4MjcsIDB4NDMsCisJIDB4ODcsIDB4RjEsIDB4MTQsIDB4NjAsIDB4Q0UsIDB4NjEsIDB4QTEsIDB4RDMsIDB4REEsIDB4ODEsIDB4RDAsIDB4ODAsIDB4REMsIDB4OUMsIDB4MDUsIDB4MDUsCisJIDB4QTEsIDB4RDMsIDB4NEEsIDB4RDksIDB4QTAsIDB4REQsIDB4REEsIDB4OUMsIDB4QTEsIDB4RDksIDB4MDcsIDB4NTgsIDB4MDMsIDB4NjUsIDB4RTIsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4ODYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDMsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OUQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsCisJIDB4MzEsIDB4RjIsIDB4MkUsIDB4RkEsIDB4Q0IsIDB4RjMsIDB4MkYsIDB4RkEsIDB4Q0MsIDB4RjMsIDB4MzAsIDB4RkEsIDB4Q0QsIDB4RjMsIDB4MzEsIDB4RkEsCisJIDB4NjcsIDB4RjMsIDB4MzIsIDB4RkEsIDB4NjgsIDB4RjMsIDB4MzMsIDB4RkEsIDB4NjksIDB4RjMsIDB4MzQsIDB4RkEsIDB4QUMsIDB4RjEsIDB4MTksIDB4RjgsCisJIDB4MUMsIDB4RjIsIDB4MTMsIDB4RkEsIDB4MDIsIDB4NjMsIDB4M0YsIDB4RkMsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsCisJIDB4MkMsIDB4RjIsIDB4QTEsIDB4REIsIDB4MkQsIDB4RjIsIDB4NDEsIDB4NTgsIDB4NTksIDB4REIsIDB4MkUsIDB4RjIsIDB4NTksIDB4REIsIDB4MDYsIDB4NjMsCisJIDB4MDcsIDB4RjIsIDB4ODgsIDB4RjEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MEQsIDB4MDIsIDB4NDMsIDB4NTksIDB4MDIsIDB4NjUsCisJIDB4RTIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4QzAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MDAsIDB4RjQsCisJIDB4MDYsIDB4NjQsIDB4MDksIDB4RkEsIDB4MTUsIDB4MDAsIDB4MDcsIDB4RjIsIDB4NjYsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NjUsIDB4NDYsCisJIDB4MDIsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MUUsIDB4MDIsIDB4MDcsIDB4NjMsIDB4NDMsIDB4NTksIDB4MDEsIDB4NjUsIDB4RTIsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4QTAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDcsIDB4NjQsIDB4MDksIDB4RkEsCisJIDB4MjYsIDB4NDYsIDB4ODgsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4OEUsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsCisJIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RkUsIDB4NjIsIDB4REIsIDB4NjAsIDB4QjAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDMsIDB4NjQsIDB4QTIsIDB4REIsIDB4REIsIDB4NjAsCisJIDB4NEQsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RTgsIDB4NjIsIDB4QTIsIDB4RDEsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4NUEsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NzIsIDB4RjMsCisJIDB4ODgsIDB4RjUsIDB4REMsIDB4ODEsIDB4NjYsIDB4NDMsIDB4MDIsIDB4QTMsIDB4NjMsIDB4NDYsIDB4Q0QsIDB4ODEsIDB4MDYsIDB4RjIsIDB4RUQsIDB4MDMsCisJIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4RjcsIDB4MDEsIDB4MEMsIDB4QUMsIDB4MDYsIDB4RkEsIDB4NDYsIDB4NDksIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjEsCisJIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTAsIDB4MDMsIDB4MjUsIDB4NjAsIDB4MkMsIDB4NjEsIDB4QTEsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4MDMsIDB4MUIsIDB4MDAsIDB4NjAsIDB4QTAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MkEsIDB4RkEsCisJIDB4QUIsIDB4RkMsIDB4NjYsIDB4NDUsIDB4MjksIDB4NDQsIDB4MDcsIDB4RkEsIDB4MjksIDB4NDYsIDB4MDMsIDB4RjIsIDB4MDQsIDB4RjAsIDB4ODUsIDB4RjIsCisJIDB4NjUsIDB4NDYsIDB4MkMsIDB4RkEsIDB4MkQsIDB4RjgsIDB4QUUsIDB4RkEsIDB4Q0IsIDB4RjMsIDB4MkYsIDB4RkEsIDB4MzIsIDB4RkEsIDB4Q0MsIDB4RjMsCisJIDB4MzAsIDB4RkEsIDB4MzMsIDB4RkEsIDB4Q0QsIDB4RjMsIDB4MzEsIDB4RkEsIDB4MzQsIDB4RkEsIDB4QUMsIDB4RjEsIDB4MTksIDB4RjgsIDB4MTgsIDB4NjcsCisJIDB4MEUsIDB4RkEsIDB4NjYsIDB4NDUsIDB4NjMsIDB4NDYsIDB4MEUsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MDAsIDB4N0UsIDB4MTMsIDB4RkEsIDB4MDIsIDB4NjMsCisJIDB4M0YsIDB4RkMsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4NjYsIDB4NDEsIDB4MDAsIDB4RjQsIDB4MjUsIDB4NjAsIDB4MjgsIDB4NjIsIDB4QTIsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4MDksIDB4RkEsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4OUEsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjEsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzgsIDB4RkUsIDB4OUUsIDB4MDEsIDB4OTIsIDB4MDEsCisJIDB4MEYsIDB4NjAsIDB4RTgsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NUEsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDMsIDB4MTQsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDMsIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsIDB4RDUsIDB4ODAsCisJIDB4QTEsIDB4RDEsIDB4MDQsIDB4MDMsIDB4RDMsIDB4ODAsIDB4RDksIDB4ODEsIDB4RkEsIDB4MDIsIDB4MDksIDB4MDAsIDB4QTEsIDB4REQsIDB4MTQsIDB4NjAsCisJIDB4RDAsIDB4NjIsIDB4RDksIDB4ODQsIDB4QTIsIDB4REIsIDB4NEEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDUsCisJIDB4NjMsIDB4NDYsIDB4MDYsIDB4RjIsIDB4RkYsIDB4NjAsIDB4MDEsIDB4N0MsIDB4QTAsIDB4OUMsIDB4MDYsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NzEsIDB4RjMsCisJIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4Q0MsIDB4ODQsIDB4ODAsIDB4MkIsIDB4NzEsIDB4RkIsIDB4MEYsIDB4NjAsIDB4RTgsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MEYsIDB4NjAsIDB4REMsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4REUsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4REIsIDB4NjAsIDB4RjcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NzEsIDB4RjMsCisJIDB4NzIsIDB4RjMsIDB4MDAsIDB4QTgsIDB4NjAsIDB4ODgsIDB4NTAsIDB4MDMsIDB4RTAsIDB4ODMsIDB4NkMsIDB4MDMsIDB4Q0IsIDB4ODMsIDB4ODgsIDB4RjMsCisJIDB4NzMsIDB4RjEsIDB4MDIsIDB4QTQsIDB4NDAsIDB4NDcsIDB4NjQsIDB4NDUsIDB4MjcsIDB4NDYsIDB4NzIsIDB4RjQsIDB4MTIsIDB4RjIsIDB4NDAsIDB4MTgsCisJIDB4RDQsIDB4ODAsIDB4MDIsIDB4NjQsIDB4M0QsIDB4MDcsIDB4MjMsIDB4RkEsIDB4MkEsIDB4RjIsIDB4MEUsIDB4RjIsIDB4MEMsIDB4QjAsIDB4MDIsIDB4RjAsCisJIDB4MEQsIDB4MDIsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4OEUsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4RTYsIDB4MDEsIDB4NjAsIDB4NDAsIDB4RjAsIDB4MzcsCisJIDB4MDgsIDB4MDAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsIDB4QTIsIDB4RkYsIDB4OTAsIDB4RjMsIDB4MDIsIDB4MDIsIDB4REMsIDB4ODQsCisJIDB4OTAsIDB4RkIsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4QUMsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QTMsIDB4RkYsIDB4Q0UsIDB4RkUsIDB4OTgsIDB4RjEsIDB4MUUsIDB4NjAsCisJIDB4RUMsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsCisJIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4QkMsIDB4MDEsCisJIDB4MjcsIDB4NDQsIDB4MDIsIDB4QTQsIDB4NDAsIDB4NDcsIDB4QjgsIDB4MUYsIDB4MjgsIDB4NDMsIDB4Q0IsIDB4ODMsIDB4ODgsIDB4RjMsIDB4MUEsIDB4MEUsCisJIDB4MDIsIDB4QTQsIDB4NDAsIDB4NEMsIDB4NDMsIDB4NDgsIDB4MkMsIDB4NDYsIDB4MUUsIDB4RjIsIDB4NzMsIDB4RjEsIDB4QUMsIDB4ODYsIDB4MTIsIDB4RjIsCisJIDB4MEMsIDB4MDMsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDksIDB4MDcsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjAsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4NzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkMsIDB4NDYsIDB4OUUsIDB4RkMsIDB4MkMsIDB4NDQsIDB4MDIsIDB4QTQsIDB4MjgsIDB4NDMsCisJIDB4NDAsIDB4NEMsIDB4RTgsIDB4MUYsIDB4N0QsIDB4MDEsIDB4MDEsIDB4NjMsIDB4NjYsIDB4RjMsIDB4QUMsIDB4RjMsIDB4MDAsIDB4QkQsIDB4QUMsIDB4ODEsCisJIDB4MDYsIDB4MDMsIDB4MDUsIDB4MDMsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsIDB4NUIsIDB4RkQsCisJIDB4M0UsIDB4NjMsIDB4MTYsIDB4NjAsIDB4NjAsIDB4NjEsIDB4MDAsIDB4NjQsIDB4NTksIDB4REIsIDB4RkUsIDB4MUYsIDB4NzEsIDB4RkIsIDB4NzIsIDB4RkIsCisJIDB4MTYsIDB4NjAsIDB4QTgsIDB4NjUsIDB4MDAsIDB4NjQsIDB4QTUsIDB4REIsIDB4NUEsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUIsIDB4NjAsCisJIDB4OUEsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MDMsIDB4MDIsIDB4QzcsIDB4NjAsIDB4MkUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDUsIDB4NjQsIDB4NDYsIDB4MUIsIDB4RjIsIDB4NjUsIDB4NDYsIDB4NjQsIDB4NDUsIDB4NUIsIDB4RjEsCisJIDB4RTAsIDB4ODQsIDB4NzMsIDB4RjEsIDB4QzAsIDB4ODQsIDB4QzAsIDB4ODQsIDB4MTIsIDB4RkEsIDB4MkMsIDB4RjIsIDB4NzEsIDB4RjMsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MzYsIDB4MDAsIDB4MDAsIDB4QTgsIDB4MUYsIDB4NjAsIDB4OEUsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MzcsIDB4MDMsIDB4MDAsIDB4QTgsCisJIDB4RkYsIDB4RkYsIDB4MzQsIDB4MDMsIDB4REUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDYsIDB4MDksIDB4NjAsCisJIDB4MDgsIDB4NjEsIDB4QTIsIDB4RkYsIDB4MEUsIDB4RjIsIDB4MDIsIDB4RjAsIDB4NjAsIDB4NDAsIDB4RjAsIDB4MzcsIDB4MEQsIDB4MDAsIDB4OTIsIDB4RjMsCisJIDB4OTAsIDB4RjMsIDB4REMsIDB4ODMsIDB4RDEsIDB4ODAsIDB4OTIsIDB4RkQsIDB4MEMsIDB4MDMsIDB4OEMsIDB4RjMsIDB4Q0MsIDB4ODMsIDB4RDgsIDB4QTAsCisJIDB4OTAsIDB4RkQsIDB4MDcsIDB4MDQsIDB4RDQsIDB4RkUsIDB4MDUsIDB4MDAsIDB4RDEsIDB4ODAsIDB4OTMsIDB4RjMsIDB4MDIsIDB4MDMsIDB4REMsIDB4ODQsCisJIDB4OTMsIDB4RkIsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4OTQsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjUsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QTMsIDB4RkYsIDB4REMsIDB4NjAsIDB4ODcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjYsIDB4NDEsIDB4NjUsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NjEsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsIDB4NEMsIDB4MDAsIDB4ODAsIDB4NjcsCisJIDB4QjQsIDB4ODEsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4NjEsIDB4NDQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4REUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDYsCisJIDB4MkEsIDB4RjIsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjEsIDB4MEMsIDB4QjAsIDB4QTIsIDB4RkYsIDB4MTcsIDB4MDMsIDB4MEUsIDB4RjIsIDB4MDIsIDB4RjAsCisJIDB4NjAsIDB4NDAsIDB4RjAsIDB4MzcsIDB4MEQsIDB4MDAsIDB4OTAsIDB4RjMsIDB4OTIsIDB4RjMsIDB4Q0MsIDB4ODMsIDB4RDEsIDB4ODAsIDB4OTAsIDB4RkQsCisJIDB4MEMsIDB4MDMsIDB4OEMsIDB4RjMsIDB4REMsIDB4ODMsIDB4RDgsIDB4QTAsIDB4OTIsIDB4RkQsIDB4MDcsIDB4MDQsIDB4RDQsIDB4RkUsIDB4MDUsIDB4MDAsCisJIDB4RDEsIDB4ODAsIDB4OTMsIDB4RjMsIDB4MDIsIDB4MDMsIDB4REMsIDB4ODQsIDB4OTMsIDB4RkIsIDB4MDcsIDB4RjAsIDB4MEEsIDB4RjIsIDB4QTMsIDB4RkYsCisJIDB4NjQsIDB4NDUsIDB4MzAsIDB4MUIsIDB4NjYsIDB4NDEsIDB4NjUsIDB4NDYsIDB4MDIsIDB4RjAsIDB4NjEsIDB4NDYsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjEsCisJIDB4QTEsIDB4ODQsIDB4NjAsIDB4NDEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTEsIDB4ODIsIDB4MDcsIDB4QjQsIDB4MDEsIDB4NjEsCisJIDB4MDMsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsIDB4MTYsIDB4NjAsIDB4NjIsIDB4NjUsIDB4NDYsIDB4RDEsIDB4NjEsIDB4NDQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTcsIDB4MDAsIDB4MUIsIDB4NjAsIDB4OEUsIDB4NjEsIDB4MkEsIDB4RjIsIDB4M0UsIDB4RjIsIDB4MEMsIDB4QjAsCisJIDB4MDEsIDB4QjAsIDB4MDUsIDB4MDMsIDB4MUIsIDB4NjAsIDB4QTAsIDB4NjEsIDB4MDIsIDB4MDIsIDB4MUIsIDB4NjAsIDB4ODgsIDB4NjEsIDB4MUIsIDB4NjAsCisJIDB4REEsIDB4NjIsIDB4NjEsIDB4NDQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4REMsIDB4NjAsIDB4ODcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsIDB4MkIsIDB4RjIsIDB4MkEsIDB4RjIsCisJIDB4NjAsIDB4NDEsIDB4NDQsIDB4NDksIDB4NjAsIDB4NDUsIDB4QTQsIDB4M0EsIDB4MEQsIDB4MDAsIDB4NjEsIDB4NDAsIDB4QzAsIDB4M0IsIDB4N0IsIDB4MDAsCisJIDB4QTksIDB4NDYsIDB4MDYsIDB4RjIsIDB4QTksIDB4NDYsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MjYsIDB4NzUsIDB4MDAsIDB4MjAsIDB4QkMsIDB4QTksIDB4NDYsCisJIDB4MDYsIDB4RkEsIDB4QTksIDB4NDYsIDB4QTksIDB4NDYsIDB4MDYsIDB4RjAsIDB4QTksIDB4NDYsIDB4NjUsIDB4NDAsIDB4MTAsIDB4MkIsIDB4NkUsIDB4MDAsCisJIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MzYsIDB4MDAsIDB4NjUsIDB4NDAsIDB4QTQsIDB4M0EsIDB4NjUsIDB4MDAsIDB4MjksIDB4NDUsIDB4NjUsIDB4NDYsCisJIDB4NzIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MDQsIDB4MDIsIDB4NzgsIDB4MDAsIDB4REUsIDB4NjAsIDB4NTEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDksIDB4RjIsIDB4MkEsIDB4RjAsIDB4MDAsIDB4QTgsIDB4MjAsIDB4NjcsIDB4MDIsIDB4MDMsIDB4QjAsIDB4ODQsIDB4MkEsIDB4RkEsCisJIDB4MEUsIDB4RjIsIDB4MDIsIDB4RjAsIDB4NjAsIDB4NDAsIDB4RjAsIDB4MzcsIDB4MDgsIDB4MDAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsCisJIDB4QTIsIDB4RkYsIDB4OTAsIDB4RjMsIDB4MDIsIDB4MDIsIDB4REMsIDB4ODQsIDB4OTAsIDB4RkIsIDB4M0UsIDB4RjIsIDB4QTMsIDB4RkYsIDB4MDEsIDB4QjAsCisJIDB4MUIsIDB4NjAsIDB4QTAsIDB4NjEsIDB4MDIsIDB4MDIsIDB4MUIsIDB4NjAsIDB4OEUsIDB4NjEsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4NjEsIDB4NDQsCisJIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsCisJIDB4MTcsIDB4MDAsIDB4MTAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4REYsIDB4NjUsIDB4QTQsIDB4OUUsIDB4QTksIDB4NDYsIDB4MDYsIDB4RkEsIDB4QTksIDB4NDYsCisJIDB4QTIsIDB4RkYsIDB4MTYsIDB4NjAsIDB4QTgsIDB4NjIsIDB4MDQsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjksIDB4NDQsIDB4NUEsIDB4REIsIDB4NzEsIDB4RjMsCisJIDB4QzEsIDB4RkUsIDB4RDQsIDB4RkUsIDB4ODcsIDB4RjEsIDB4QTMsIDB4RkYsIDB4RDAsIDB4ODAsIDB4REMsIDB4ODQsIDB4MDEsIDB4MDcsIDB4NzEsIDB4RkIsCisJIDB4QTksIDB4NDYsIDB4NzIsIDB4RjIsIDB4QTksIDB4NDYsIDB4NjUsIDB4MTgsIDB4QTksIDB4NDYsIDB4MDIsIDB4RjAsIDB4QTksIDB4NDYsIDB4MEYsIDB4NjAsCisJIDB4RkYsIDB4NjEsIDB4QTEsIDB4ODQsIDB4NjAsIDB4NDEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTEsIDB4ODIsIDB4MDcsIDB4QjQsCisJIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsIDB4MTYsIDB4NjAsIDB4NjIsIDB4NjUsIDB4NDYsIDB4RDEsCisJIDB4RkYsIDB4RkYsIDB4QjEsIDB4ODQsIDB4QTIsIDB4REIsIDB4REUsIDB4NjAsIDB4NjgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsCisJIDB4RkEsIDB4MDEsIDB4RkYsIDB4NjAsIDB4RUYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTksIDB4NDYsIDB4MDYsIDB4RkEsIDB4QTksIDB4NDYsIDB4NjUsIDB4NDEsCisJIDB4NzEsIDB4RjMsIDB4MjksIDB4NDUsIDB4Q0MsIDB4ODQsIDB4ODAsIDB4MkIsIDB4NzEsIDB4RkIsIDB4NjUsIDB4NDYsIDB4NzIsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MzcsIDB4MDIsIDB4NjEsIDB4NDAsIDB4QTQsIDB4M0EsIDB4RTUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4M0EsIDB4NjEsCisJIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODEsIDB4MDMsIDB4MDIsIDB4NjAsIDB4NDgsIDB4NjQsIDB4MkEsIDB4RkEsCisJIDB4Q0IsIDB4RjEsIDB4MkYsIDB4RjgsIDB4Q0MsIDB4RjEsIDB4MzAsIDB4RjgsIDB4Q0QsIDB4RjEsIDB4MzEsIDB4RjgsIDB4NjcsIDB4RjEsIDB4MzIsIDB4RjgsCisJIDB4NjgsIDB4RjEsIDB4MzMsIDB4RjgsIDB4NjksIDB4RjEsIDB4MzQsIDB4RjgsIDB4QTksIDB4NDYsIDB4MDMsIDB4RjIsIDB4MDQsIDB4RjAsIDB4ODUsIDB4RjAsCisJIDB4QTksIDB4NDYsIDB4MkMsIDB4RkEsIDB4MkQsIDB4RjgsIDB4QUUsIDB4RjgsIDB4QUMsIDB4RjEsIDB4MTksIDB4RjgsIDB4RkYsIDB4NjcsIDB4MEUsIDB4RkEsCisJIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4M0YsIDB4RkEsIDB4MjksIDB4NDQsIDB4MDcsIDB4RkEsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsCisJIDB4OEUsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4QzEsIDB4RkUsIDB4MzcsIDB4MDAsIDB4ODAsIDB4NjcsIDB4QjQsIDB4ODMsIDB4MkEsIDB4RjIsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjUsIDB4MEMsIDB4QjAsCisJIDB4MDksIDB4RjAsIDB4MEQsIDB4MDIsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4OEUsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4OUQsIDB4MTgsIDB4NjQsIDB4NDYsIDB4M0UsIDB4RjIsCisJIDB4QTIsIDB4RkYsIDB4MDEsIDB4QjAsIDB4MUIsIDB4NjAsIDB4QTAsIDB4NjEsIDB4MDIsIDB4MDIsIDB4MUIsIDB4NjAsIDB4ODgsIDB4NjEsIDB4MDIsIDB4RjIsCisJIDB4MEUsIDB4RjAsIDB4RDQsIDB4ODAsIDB4MDksIDB4RjQsIDB4MDYsIDB4MDIsIDB4OTAsIDB4RjMsIDB4NjQsIDB4NDAsIDB4RjAsIDB4MzcsIDB4MDIsIDB4MDAsCisJIDB4REMsIDB4ODQsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsIDB4RjEsIDB4MDIsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsCisJIDB4NjEsIDB4NDQsIDB4QTIsIDB4REIsIDB4NUEsIDB4REQsIDB4MDgsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsCisJIDB4QTMsIDB4RkYsIDB4QTksIDB4NDYsIDB4MDIsIDB4RjAsIDB4QTksIDB4NDYsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjEsIDB4QTEsIDB4ODQsIDB4NjAsIDB4NDEsCisJIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTEsIDB4ODIsIDB4MDcsIDB4QjQsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsIDB4Q0MsIDB4ODQsCisJIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsIDB4MTYsIDB4NjAsIDB4NjIsIDB4NjUsIDB4NDYsIDB4RDMsIDB4OUQsIDB4ODUsIDB4QTQsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDYsIDB4NDUsIDB4M0YsIDB4RjIsIDB4MDUsIDB4NDgsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDEsCisJIDB4NjYsIDB4NDQsIDB4MEIsIDB4MDMsIDB4MEUsIDB4QTEsIDB4MDAsIDB4RjIsIDB4NDIsIDB4RkUsIDB4QUMsIDB4ODYsIDB4MDEsIDB4RjIsIDB4MUYsIDB4MDMsCisJIDB4N0YsIDB4QjUsIDB4RDUsIDB4ODEsIDB4NjYsIDB4NDQsIDB4RjcsIDB4MDcsIDB4MjUsIDB4NDYsIDB4MDUsIDB4RjAsIDB4MDYsIDB4RkEsIDB4MDUsIDB4RkEsCisJIDB4RDAsIDB4ODAsIDB4NjQsIDB4NDMsIDB4MTMsIDB4MDMsIDB4NjAsIDB4NDYsIDB4MDEsIDB4RjAsIDB4ODAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4MDEsIDB4RkEsCisJIDB4MDAsIDB4RjAsIDB4MDAsIDB4NjQsIDB4MDAsIDB4RkEsIDB4NDQsIDB4NDUsIDB4QTIsIDB4RkYsIDB4QjQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NDgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsIDB4MDgsIDB4NDUsIDB4MjUsIDB4NDYsIDB4MDEsIDB4NjQsIDB4MDIsIDB4RkEsIDB4MDIsIDB4RkUsIDB4MkQsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MDcsIDB4RjAsIDB4MTAsIDB4QjAsIDB4MTAsIDB4QUMsIDB4M0IsIDB4MDMsIDB4MjMsIDB4RkEsIDB4ODAsIDB4NjcsCisJIDB4QjAsIDB4ODEsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4NjEsIDB4NDQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDQsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4NDYsIDB4NDUsIDB4NjQsIDB4NDYsIDB4MDIsIDB4RjAsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjEsCisJIDB4QTEsIDB4ODQsIDB4NjAsIDB4NDEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTEsIDB4ODIsIDB4MDcsIDB4QjQsIDB4MDEsIDB4NjEsCisJIDB4MDMsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsIDB4MTYsIDB4NjAsIDB4NjIsIDB4NjUsIDB4NDYsIDB4RDEsIDB4RkYsIDB4RkYsCisJIDB4QjEsIDB4ODQsIDB4QTIsIDB4REIsIDB4OUIsIDB4RjIsIDB4MjUsIDB4NDYsIDB4RTEsIDB4ODEsIDB4NUIsIDB4RjEsIDB4NzMsIDB4RjEsIDB4QzEsIDB4ODEsCisJIDB4QzEsIDB4ODEsIDB4OTIsIDB4RkEsIDB4QTIsIDB4RkYsIDB4MDIsIDB4RjAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjEsIDB4RDEsIDB4ODAsIDB4MEUsIDB4RjIsCisJIDB4MDUsIDB4MDIsIDB4OTAsIDB4RjMsIDB4MjAsIDB4QjAsIDB4Q0MsIDB4ODQsIDB4MDEsIDB4MDIsIDB4OTAsIDB4RkIsIDB4QTMsIDB4RkYsIDB4NDgsIDB4RkUsCisJIDB4MDcsIDB4MDAsIDB4MEUsIDB4RjIsIDB4MDgsIDB4RkUsIDB4RjAsIDB4N0YsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MDAsIDB4N0YsIDB4MEUsIDB4RkEsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4QTAsIDB4NjEsIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjYsIDB4NDQsIDB4NTcsIDB4RkIsIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsIDB4ODAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4QUMsIDB4RjEsIDB4MTksIDB4RjgsCisJIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjQsIDB4MEUsIDB4RkEsIDB4ODgsIDB4RjEsIDB4MDcsIDB4RjgsIDB4NjcsIDB4NDQsCisJIDB4MkMsIDB4RkEsIDB4MkQsIDB4RkEsIDB4MkUsIDB4RkEsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4RTEsIDB4NjAsIDB4OUUsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MTAsIDB4NjAsIDB4MDIsIDB4NjIsIDB4RTAsIDB4NjAsIDB4MEQsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTYsIDB4NjAsIDB4QjIsIDB4NjMsIDB4NjUsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MTAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDIsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDYsIDB4NjQsIDB4QTMsIDB4REIsCisJIDB4RTYsIDB4NjAsIDB4NUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTcsIDB4RjUsCisJIDB4Q0IsIDB4RjEsIDB4MkYsIDB4RjgsIDB4Q0MsIDB4RjEsIDB4MzAsIDB4RjgsIDB4Q0QsIDB4RjEsIDB4MzEsIDB4RjgsIDB4NjcsIDB4RjEsIDB4MzIsIDB4RjgsCisJIDB4NjgsIDB4RjEsIDB4MzMsIDB4RjgsIDB4NjksIDB4RjEsIDB4MzQsIDB4RjgsIDB4MUYsIDB4NjAsIDB4OTIsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDEsIDB4NjQsCisJIDB4NjQsIDB4NDAsIDB4RkUsIDB4MjYsIDB4MTAsIDB4QkMsIDB4MzIsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MTAsIDB4QkMsIDB4MjMsIDB4NjAsIDB4NEMsIDB4NjIsCisJIDB4QTIsIDB4REIsIDB4MUYsIDB4NjAsIDB4OTAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MUYsIDB4NjAsIDB4MUUsIDB4NjQsIDB4MDIsIDB4MTgsIDB4MUYsIDB4NjAsCisJIDB4NDAsIDB4NjQsIDB4MjIsIDB4NjAsIDB4QTIsIDB4NjIsIDB4QTIsIDB4REIsIDB4MjIsIDB4NjAsIDB4QkUsIDB4NjIsIDB4QTIsIDB4REIsIDB4MjEsIDB4NjAsCisJIDB4QzYsIDB4NjEsIDB4MjAsIDB4NjAsIDB4MzIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MjIsIDB4NjAsIDB4ODIsIDB4NjUsIDB4RkUsIDB4QTQsIDB4RTAsIDB4ODQsCisJIDB4MDIsIDB4MDUsIDB4NjcsIDB4NDQsIDB4OTksIDB4MDAsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODUsIDB4MjEsIDB4NjAsIDB4RUMsIDB4NjIsIDB4QTIsIDB4RDMsCisJIDB4QTUsIDB4RDEsIDB4REEsIDB4ODUsIDB4MjEsIDB4NjAsIDB4RTQsIDB4NjIsIDB4QTAsIDB4ODMsIDB4QTIsIDB4REQsIDB4QTUsIDB4RDEsIDB4MjEsIDB4NjAsCisJIDB4RTIsIDB4NjIsIDB4QTAsIDB4ODMsIDB4QTIsIDB4REQsIDB4MjEsIDB4NjAsIDB4QzAsIDB4NjEsIDB4REQsIDB4NjAsIDB4MDYsIDB4NjQsIDB4QTEsIDB4REIsCisJIDB4MDYsIDB4QTEsIDB4MjEsIDB4NjAsIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MjEsIDB4NjAsIDB4RTIsIDB4NjIsIDB4NjAsIDB4NDAsIDB4RkQsIDB4QTAsCisJIDB4QTIsIDB4RDMsIDB4NzQsIDB4MDMsIDB4NTAsIDB4NjAsIDB4MDAsIDB4N0MsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjAsCisJIDB4RjIsIDB4NjMsIDB4MEUsIDB4MDAsIDB4MDQsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDIsIDB4NjAsIDB4RjIsIDB4NjMsIDB4MDksIDB4MDAsIDB4MTAsIDB4MkEsCisJIDB4MDMsIDB4MDAsIDB4MDQsIDB4NjAsIDB4RjIsIDB4NjMsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDUsIDB4NjAsIDB4RjIsIDB4NjMsCisJIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MjEsIDB4NjAsIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MjEsIDB4NjAsIDB4RTQsIDB4NjIsIDB4RkUsIDB4QTAsCisJIDB4QTIsIDB4RDMsIDB4NTQsIDB4MDMsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjMsIDB4NTksIDB4REQsIDB4NjEsIDB4NDUsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsCisJIDB4MDQsIDB4MDAsIDB4MDAsIDB4NjAsIDB4RjIsIDB4NjMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDQsIDB4MDAsCisJIDB4MDEsIDB4NjAsIDB4RjIsIDB4NjMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDIsIDB4NjAsCisJIDB4RjIsIDB4NjMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDQsIDB4NjAsIDB4RjIsIDB4NjMsCisJIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDUsIDB4NjAsIDB4RjIsIDB4NjMsIDB4NTksIDB4RDksCisJIDB4NTksIDB4REQsIDB4RDUsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4QTUsIDB4REQsIDB4MjEsIDB4NjAsIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDMsCisJIDB4MjEsIDB4NjAsIDB4RTYsIDB4NjIsIDB4RkYsIDB4QTAsIDB4QTIsIDB4RDMsIDB4MjEsIDB4MDMsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjMsIDB4NTksIDB4REQsCisJIDB4NjEsIDB4NDUsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDAsIDB4NjAsIDB4RjIsIDB4NjMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsCisJIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDEsIDB4NjAsIDB4RjIsIDB4NjMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4NjAsIDB4NDAsCisJIDB4MDQsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDIsIDB4NjAsIDB4RjIsIDB4NjMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4RDUsIDB4ODMsIDB4RUIsIDB4ODMsCisJIDB4RUIsIDB4ODMsIDB4QTUsIDB4REQsIDB4MjEsIDB4NjAsIDB4RTgsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NTksIDB4RDksIDB4MjEsIDB4NjAsIDB4QzAsIDB4NjUsCisJIDB4RDUsIDB4ODQsIDB4REQsIDB4N0YsIDB4QTUsIDB4REIsIDB4NjUsIDB4NDQsIDB4MjIsIDB4NjAsIDB4QUMsIDB4NjIsIDB4QTIsIDB4REIsIDB4MjIsIDB4NjAsCisJIDB4QzgsIDB4NjIsIDB4QTIsIDB4REIsIDB4NTcsIDB4RjUsIDB4Q0IsIDB4RjMsIDB4Q0MsIDB4RjEsIDB4MDAsIDB4NjMsIDB4QzAsIDB4ODcsIDB4Q0QsIDB4RjEsCisJIDB4NUEsIDB4RkQsIDB4QzAsIDB4ODUsIDB4NjUsIDB4NDcsIDB4QzQsIDB4ODQsIDB4MDcsIDB4QjUsIDB4MUMsIDB4NjAsIDB4MTAsIDB4NjIsIDB4MTYsIDB4NjAsCisJIDB4QUUsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RDIsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTAsIDB4NjAsCisJIDB4MTcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsCisJIDB4RDAsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NTcsIDB4RjUsIDB4MDAsIDB4NjQsIDB4OTUsIDB4RkIsIDB4OTYsIDB4RkIsIDB4OTcsIDB4RkIsCisJIDB4NzUsIDB4RkIsIDB4NjYsIDB4RjMsIDB4MDAsIDB4NzUsIDB4MDAsIDB4NzIsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4OTMsIDB4QzcsIDB4RjMsCisJIDB4RUQsIDB4RTIsIDB4Q0MsIDB4ODQsIDB4NUEsIDB4RkIsIDB4MEYsIDB4NjAsIDB4RDIsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4RTAsIDB4NjAsIDB4MzYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjUsIDB4RjEsIDB4MjMsIDB4NjAsIDB4MDIsIDB4NjIsIDB4QTIsIDB4RDksIDB4MjIsIDB4NjAsIDB4QUEsIDB4NjUsCisJIDB4RTIsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QTgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4RTIsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NDksIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTcsIDB4RjUsIDB4MDAsIDB4RjQsIDB4NjYsIDB4RjEsIDB4MDYsIDB4RjgsCisJIDB4MjMsIDB4NjAsIDB4NEMsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MDcsIDB4RkEsIDB4MjIsIDB4NjAsIDB4QTIsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MTAsIDB4NjEsCisJIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RTEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTcsIDB4RjUsIDB4M0YsIDB4RkMsCisJIDB4NUEsIDB4RjMsIDB4QzcsIDB4RjEsIDB4QUMsIDB4ODMsIDB4MDEsIDB4NjQsIDB4MDIsIDB4MDIsIDB4NkMsIDB4RkIsIDB4NjQsIDB4NDMsIDB4MUIsIDB4NjAsCisJIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4OEUsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDQsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4Q0YsIDB4ODMsIDB4NzMsIDB4RjMsIDB4NUEsIDB4RkQsIDB4REMsIDB4ODQsIDB4NzMsIDB4RkIsCisJIDB4NUMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4NUMsIDB4RkIsIDB4MDMsIDB4MDMsIDB4RTEsIDB4NjAsIDB4MEEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MEEsIDB4NjQsIDB4NUMsIDB4RkIsIDB4QTIsIDB4NEMsIDB4MjAsIDB4MjcsIDB4RjgsIDB4MDEsIDB4NDYsIDB4NjAsIDB4NTAsIDB4NjUsIDB4NzIsIDB4NDQsCisJIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RjIsIDB4MDQsIDB4NUQsIDB4RkIsIDB4NDAsIDB4NDgsIDB4OTUsIDB4RjMsIDB4NUUsIDB4RkIsIDB4NDAsIDB4NEEsCisJIDB4OTYsIDB4RjMsIDB4OTcsIDB4RjMsIDB4NDAsIDB4NEMsIDB4NjAsIDB4NDEsIDB4NjYsIDB4RjEsIDB4NDAsIDB4NjMsIDB4QUQsIDB4ODAsIDB4RjAsIDB4QTMsCisJIDB4MDksIDB4MDIsIDB4M0MsIDB4MDMsIDB4MkMsIDB4NDEsIDB4MkEsIDB4NDQsIDB4NDAsIDB4NEMsIDB4MjgsIDB4NDQsIDB4NDAsIDB4NEEsIDB4MDAsIDB4NjQsCisJIDB4NDAsIDB4NDgsIDB4RjQsIDB4MDEsIDB4RDEsIDB4ODAsIDB4MDEsIDB4MDIsIDB4MzEsIDB4MDQsIDB4MTAsIDB4QTMsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjUsCisJIDB4QTUsIDB4ODAsIDB4Q0YsIDB4ODMsIDB4MDgsIDB4MDIsIDB4MjgsIDB4NDQsIDB4NjAsIDB4ODgsIDB4MkEsIDB4NDQsIDB4NzAsIDB4OEEsIDB4MkMsIDB4NDQsCisJIDB4NzAsIDB4OEMsIDB4RjEsIDB4ODEsIDB4RjUsIDB4MDEsIDB4RTcsIDB4QTMsIDB4NjQsIDB4NDQsIDB4MDAsIDB4QTAsIDB4MDAsIDB4NjIsIDB4MDIsIDB4MDIsCisJIDB4MDAsIDB4NjEsIDB4MUMsIDB4MDAsIDB4RTAsIDB4ODQsIDB4REUsIDB4ODIsIDB4RkQsIDB4MDQsIDB4NDIsIDB4RkUsIDB4RjgsIDB4ODQsIDB4NjIsIDB4NDUsCisJIDB4QzcsIDB4ODMsIDB4NjAsIDB4NDUsIDB4MDIsIDB4RkUsIDB4RDUsIDB4ODQsIDB4MDIsIDB4MDUsIDB4MDEsIDB4MDUsIDB4NjEsIDB4NDQsIDB4Q0YsIDB4ODMsCisJIDB4NjAsIDB4NDEsIDB4MDgsIDB4MDMsIDB4MjgsIDB4NDQsIDB4NjAsIDB4ODgsIDB4MkEsIDB4NDQsIDB4NzAsIDB4OEEsIDB4MkMsIDB4NDQsIDB4NzAsIDB4OEMsCisJIDB4RjEsIDB4ODEsIDB4RjEsIDB4MDEsIDB4Q0UsIDB4ODIsIDB4RTksIDB4ODEsIDB4RkQsIDB4MDIsIDB4RjEsIDB4ODEsIDB4NjEsIDB4NDQsIDB4MDAsIDB4QTgsCisJIDB4RkYsIDB4RkYsIDB4MzAsIDB4MDMsIDB4NzMsIDB4NDAsIDB4NUQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4NUUsIDB4RjMsIDB4M0YsIDB4QjUsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4QjQsIDB4ODQsIDB4NjEsIDB4NDUsIDB4RDQsIDB4ODQsIDB4QzAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODEsCisJIDB4NjQsIDB4NDQsIDB4NzMsIDB4NDUsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODUsIDB4NjEsIDB4NDQsIDB4RDQsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4MDMsIDB4NjAsIDB4NTMsIDB4RDQsIDB4ODQsIDB4RkYsIDB4RkYsIDB4NzUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsCisJIDB4MDEsIDB4QjQsIDB4NzUsIDB4RkIsIDB4MUYsIDB4NjAsIDB4MTQsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4MjgsIDB4QTIsIDB4REIsIDB4RTYsIDB4NjAsIDB4QTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDksIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MDAsIDB4M0EsIDB4MUMsIDB4MDAsCisJIDB4NjAsIDB4NDMsIDB4MDAsIDB4MzYsIDB4MUMsIDB4MDAsIDB4RTAsIDB4QTAsIDB4REEsIDB4ODUsIDB4MTYsIDB4MDcsIDB4MUYsIDB4NjAsIDB4MUUsIDB4NjEsCisJIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4RDMsIDB4ODAsIDB4Q0IsIDB4ODMsIDB4MEYsIDB4MDIsIDB4MDcsIDB4MEUsIDB4NTksIDB4RDMsIDB4QTUsIDB4RDAsCisJIDB4REEsIDB4ODUsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDIsIDB4RjksIDB4MUYsIDB4MTMsIDB4MUUsIDB4QTUsIDB4RDAsIDB4NTksIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4OTAsIDB4ODAsIDB4RkYsIDB4MjIsIDB4MEQsIDB4MDAsIDB4RTEsIDB4NjAsIDB4OUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsCisJIDB4OTAsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MUYsIDB4NjAsIDB4NDAsIDB4NjQsCisJIDB4MDIsIDB4MDAsIDB4MUYsIDB4NjAsIDB4MUUsIDB4NjQsIDB4MjIsIDB4NjAsIDB4QkUsIDB4NjIsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDYsIDB4MkYsIDB4RjIsCisJIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsIDB4MkUsIDB4RkEsIDB4Q0IsIDB4RjEsIDB4MkYsIDB4RjgsIDB4Q0MsIDB4RjEsCisJIDB4MzAsIDB4RjgsIDB4Q0QsIDB4RjEsIDB4MzEsIDB4RjgsIDB4NjcsIDB4RjEsIDB4MzIsIDB4RjgsIDB4NjgsIDB4RjEsIDB4MzMsIDB4RjgsIDB4NjksIDB4RjEsCisJIDB4MzQsIDB4RjgsIDB4NTAsIDB4NjMsIDB4MkEsIDB4RkMsIDB4QUMsIDB4RjMsIDB4MTksIDB4RkEsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4ODgsIDB4RjMsCisJIDB4MDcsIDB4RkEsIDB4MDAsIDB4RjQsIDB4NjYsIDB4RjEsIDB4MDYsIDB4RjgsIDB4MjMsIDB4NjAsIDB4NEMsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MDcsIDB4RkEsCisJIDB4MjIsIDB4NjAsIDB4QzYsIDB4NjUsIDB4RTIsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4NjAsIDB4QkUsIDB4NjQsCisJIDB4NDAsIDB4NDgsIDB4MTAsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RTEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RTUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4M0YsIDB4RkMsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4OEUsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MjAsIDB4NDQsIDB4ODAsIDB4MjYsCisJIDB4MTEsIDB4MDAsIDB4ODAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4MDAsIDB4NjQsIDB4OTUsIDB4RkIsIDB4OTYsIDB4RkIsIDB4OTcsIDB4RkIsIDB4NzUsIDB4RkIsCisJIDB4NjYsIDB4RjMsIDB4MDAsIDB4NzUsIDB4MDAsIDB4NzIsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4OTMsIDB4QzcsIDB4RjMsIDB4RUQsIDB4RTIsCisJIDB4Q0MsIDB4ODQsIDB4NUEsIDB4RkIsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NUEsIDB4REIsIDB4MDAsIDB4NjQsIDB4NzMsIDB4RkIsIDB4NzUsIDB4RkIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4M0UsIDB4NjMsIDB4MTYsIDB4NjAsIDB4NjAsIDB4NjEsIDB4NTksIDB4RDEsIDB4NjEsIDB4NDYsIDB4MDgsIDB4MUIsIDB4RkMsIDB4MUYsIDB4MjIsIDB4NjAsCisJIDB4REUsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDEsIDB4NjUsIDB4MDAsIDB4NjEsIDB4MTcsIDB4MDAsIDB4MTYsIDB4NjAsIDB4QTIsIDB4NjEsCisJIDB4NDksIDB4RDEsIDB4Q0IsIDB4ODMsIDB4RkQsIDB4MTgsIDB4NjMsIDB4NDEsIDB4MDQsIDB4QTEsIDB4NjEsIDB4NDUsIDB4NjYsIDB4NDMsIDB4MjIsIDB4NjAsCisJIDB4REUsIDB4NjQsIDB4REMsIDB4ODQsIDB4NjAsIDB4RkUsIDB4QTMsIDB4RDEsIDB4REYsIDB4ODMsIDB4QTAsIDB4RDksIDB4Q0QsIDB4ODEsIDB4MjAsIDB4RkUsCisJIDB4RjgsIDB4MDIsIDB4NjYsIDB4NDQsIDB4MTYsIDB4NjAsIDB4NjIsIDB4N0MsIDB4RDAsIDB4ODEsIDB4NUEsIDB4RjMsIDB4QzcsIDB4RjEsIDB4MjIsIDB4NjAsCisJIDB4REMsIDB4NjMsIDB4MDAsIDB4QTAsIDB4NjQsIDB4NUYsIDB4QkQsIDB4REIsIDB4MUIsIDB4NjAsIDB4OTQsIDB4NjYsIDB4QTYsIDB4RDEsIDB4MDIsIDB4MDIsCisJIDB4MDEsIDB4MTgsIDB4MDEsIDB4QjksIDB4NjEsIDB4NDQsIDB4NjAsIDB4RkUsIDB4QTMsIDB4REIsIDB4RkMsIDB4QTMsIDB4NjUsIDB4NDQsIDB4MDMsIDB4QTQsCisJIDB4QTMsIDB4REIsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4NjAsIDB4NEUsIDB4NjIsIDB4QTIsIDB4REIsCisJIDB4Q0QsIDB4ODEsIDB4MjgsIDB4RDMsIDB4NUEsIDB4ODgsIDB4REMsIDB4ODMsIDB4MzksIDB4MTgsIDB4RkIsIDB4MDMsIDB4NjEsIDB4NDAsIDB4N0YsIDB4M0EsCisJIDB4MDcsIDB4MDAsIDB4MjMsIDB4NjAsIDB4NEUsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MDMsIDB4NjEsIDB4N0MsIDB4QTQsIDB4QTIsIDB4REIsIDB4MDAsIDB4RjQsCisJIDB4NjAsIDB4RkUsIDB4QTMsIDB4RDEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDgsIDB4NjEsIDB4NDAsIDB4N0YsIDB4M0EsIDB4MDksIDB4MDAsIDB4MjAsIDB4RkUsCisJIDB4MjMsIDB4NjAsIDB4NEUsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MDMsIDB4NjEsIDB4N0MsIDB4QTQsIDB4QTIsIDB4REIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4RkUsCisJIDB4Q0YsIDB4ODMsIDB4QTMsIDB4RDMsIDB4REQsIDB4ODEsIDB4QTEsIDB4REEsIDB4RkYsIDB4QjQsIDB4MDAsIDB4N0YsIDB4MTUsIDB4MDMsIDB4REIsIDB4ODMsCisJIDB4NjEsIDB4NDAsIDB4N0YsIDB4M0EsIDB4MEIsIDB4MDAsIDB4MjAsIDB4RkUsIDB4NjAsIDB4NDUsIDB4MjMsIDB4NjAsIDB4NEUsIDB4NjIsIDB4QTIsIDB4RDMsCisJIDB4MDMsIDB4NjEsIDB4N0MsIDB4QTQsIDB4QTIsIDB4REIsIDB4NjUsIDB4NDQsIDB4MDAsIDB4RjQsIDB4NjAsIDB4RkUsIDB4QTMsIDB4RDEsIDB4REYsIDB4ODMsCisJIDB4REQsIDB4ODEsIDB4Q0MsIDB4ODQsIDB4QTEsIDB4RDgsIDB4RUMsIDB4MDIsIDB4MjAsIDB4RkUsIDB4QzMsIDB4MDEsIDB4MjMsIDB4NjAsIDB4NEUsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4RkQsIDB4QTEsIDB4RkYsIDB4QjEsIDB4QzEsIDB4ODMsIDB4QTIsIDB4REQsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjcsIDB4NUMsCisJIDB4MTEsIDB4NjAsIDB4RjAsIDB4NjEsIDB4QTEsIDB4RDMsIDB4QTUsIDB4RDksIDB4MTIsIDB4MTgsIDB4NjAsIDB4NDMsIDB4MjMsIDB4NjAsIDB4MDQsIDB4NjQsCisJIDB4QTUsIDB4REIsIDB4NjAsIDB4RkUsIDB4QTAsIDB4REQsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4REMsIDB4ODQsIDB4Q0YsIDB4ODMsIDB4RTMsIDB4ODMsCisJIDB4NTksIDB4RDEsIDB4REMsIDB4ODQsIDB4NjAsIDB4RkUsIDB4QTAsIDB4RDksIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4RjksIDB4MUYsIDB4MkQsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MEQsIDB4MDAsIDB4MTIsIDB4NjAsIDB4QjgsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NTAsIDB4RjMsCisJIDB4MjMsIDB4NjAsIDB4MzksIDB4NjMsIDB4NjAsIDB4RkUsIDB4QTMsIDB4RDksIDB4REYsIDB4ODMsIDB4NjAsIDB4NDcsIDB4QTMsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MjAsIDB4RkUsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NTcsIDB4MzIsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MjUsIDB4MDAsIDB4NDUsIDB4NDgsCisJIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjEsIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUQsIDB4MDMsIDB4RjIsIDB4NjAsCisJIDB4MDIsIDB4NjQsIDB4MjQsIDB4RkEsIDB4MDAsIDB4NjAsIDB4NDgsIDB4NjEsIDB4MjgsIDB4NDQsIDB4NTksIDB4REEsIDB4MDMsIDB4NjQsIDB4MzgsIDB4NDMsCisJIDB4QkQsIDB4RDEsIDB4Q0MsIDB4ODQsIDB4NTksIDB4RDgsIDB4RkMsIDB4MDIsIDB4MzksIDB4NDQsIDB4NTksIDB4REEsIDB4MDYsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4Q0EsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NTcsIDB4MzIsIDB4NDAsCisJIDB4NDAsIDB4MjYsIDB4NTEsIDB4MDAsIDB4NDUsIDB4NDgsIDB4MDAsIDB4NjAsIDB4NjgsIDB4NjEsIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NDksIDB4MDMsIDB4RjIsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MjQsIDB4RkEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsIDB4NDYsIDB4NEEsCisJIDB4MzgsIDB4NDQsIDB4NTQsIDB4OTQsIDB4MDMsIDB4NjQsIDB4MDEsIDB4MDIsIDB4MDksIDB4MDAsIDB4MDYsIDB4NjMsIDB4NEEsIDB4NjEsIDB4MzgsIDB4NDYsCisJIDB4QkQsIDB4RDAsIDB4Q0MsIDB4ODQsIDB4MkEsIDB4NDYsIDB4NTksIDB4RDgsIDB4RkEsIDB4MDIsIDB4MDYsIDB4MDAsIDB4REEsIDB4ODEsIDB4MzgsIDB4NDMsCisJIDB4QkQsIDB4RDEsIDB4Q0MsIDB4ODQsIDB4NTksIDB4RDgsIDB4RkMsIDB4MDIsIDB4MDUsIDB4NjMsIDB4MjgsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MjUsIDB4RkEsCisJIDB4MDcsIDB4MDIsIDB4MDMsIDB4NjQsIDB4MzksIDB4NDMsIDB4QkQsIDB4RDEsIDB4Q0MsIDB4ODQsIDB4NTksIDB4RDgsIDB4RkMsIDB4MDIsIDB4MDgsIDB4NjMsCisJIDB4MjIsIDB4NjAsIDB4MjgsIDB4N0MsIDB4MjgsIDB4NDQsIDB4MDMsIDB4QTgsIDB4QTQsIDB4RDMsIDB4MEYsIDB4MDMsIDB4RTgsIDB4ODUsIDB4QzcsIDB4ODUsCisJIDB4NjAsIDB4NDMsIDB4RkUsIDB4QTMsIDB4MjIsIDB4NjAsIDB4MkEsIDB4NjQsIDB4NTgsIDB4RDEsIDB4RDksIDB4ODEsIDB4QTEsIDB4RDgsIDB4N0UsIDB4MkEsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjEsIDB4RjgsIDB4MUYsIDB4NjUsIDB4NDMsIDB4MkEsIDB4NDYsIDB4MjMsIDB4RkMsIDB4MUIsIDB4NjAsCisJIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4Q0EsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NTcsIDB4MzIsIDB4NDAsIDB4NDAsIDB4MjYsCisJIDB4MUMsIDB4MDAsIDB4NDUsIDB4NDgsIDB4MDAsIDB4NjAsIDB4MDYsIDB4NjEsIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTQsIDB4MDMsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4RjIsIDB4NjAsIDB4MDAsIDB4NjQsIDB4NUEsIDB4REEsIDB4MjgsIDB4NDQsIDB4NUEsIDB4REEsCisJIDB4RkYsIDB4RkYsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4Q0EsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsCisJIDB4MzIsIDB4NDAsIDB4NDAsIDB4MjYsIDB4M0UsIDB4MDAsIDB4N0MsIDB4RjMsIDB4NjcsIDB4NDMsIDB4REMsIDB4ODQsIDB4Q0MsIDB4ODQsIDB4MzksIDB4MDMsCisJIDB4NjAsIDB4NDYsIDB4MEEsIDB4MDIsIDB4N0MsIDB4RkQsIDB4MDAsIDB4NjAsIDB4NDYsIDB4NjEsIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4N0MsIDB4RkIsIDB4MkUsIDB4MDMsIDB4NDYsIDB4NEIsIDB4MUUsIDB4NjAsIDB4RDgsIDB4NjEsIDB4MTgsIDB4NjQsCisJIDB4MjMsIDB4RkEsIDB4RjEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MjQsIDB4RkEsIDB4NEEsIDB4NjUsIDB4QTIsIDB4RkYsIDB4MkMsIDB4NjMsIDB4MDAsIDB4NjQsCisJIDB4NTksIDB4RDEsIDB4QTIsIDB4REIsIDB4QTUsIDB4RDgsIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsCisJIDB4RjcsIDB4MUYsIDB4MTIsIDB4NjMsIDB4NTksIDB4RDEsIDB4QTUsIDB4RDgsIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsCisJIDB4MDQsIDB4NjUsIDB4RjgsIDB4MUYsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4Q0EsIDB4NjQsIDB4QTIsIDB4REIsIDB4MkIsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4QTYsIDB4RkUsIDB4MDAsIDB4NjQsCisJIDB4N0MsIDB4RkIsIDB4QTMsIDB4RkYsIDB4QzcsIDB4NjAsIDB4MkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTYsIDB4RkUsIDB4QjgsIDB4MDUsIDB4QTcsIDB4RkUsCisJIDB4MEEsIDB4MDUsIDB4QTUsIDB4RkUsIDB4MDMsIDB4MDQsIDB4RTMsIDB4NjAsIDB4RDMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTQsIDB4RkUsIDB4RjIsIDB4MDQsCisJIDB4RTQsIDB4NjAsIDB4NjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzYsIDB4NDUsIDB4MTcsIDB4NjAsIDB4NTIsIDB4NjQsIDB4NDQsIDB4RDcsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4MjgsIDB4RjMsIDB4N0UsIDB4RjEsIDB4NjAsIDB4NDcsIDB4MDcsIDB4QjQsIDB4NEUsIDB4RkIsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsCisJIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsIDB4OUQsIDB4ODQsIDB4QTEsIDB4ODAsIDB4QTAsIDB4ODMsIDB4MUEsIDB4MDMsIDB4N0UsIDB4RkQsCisJIDB4MEYsIDB4NjAsIDB4RjQsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4N0UsIDB4RjEsIDB4MzEsIDB4NDQsIDB4NjQsIDB4NDAsIDB4RkYsIDB4MjYsIDB4MDksIDB4MDAsIDB4RkUsIDB4QjQsIDB4NDAsIDB4NTEsIDB4MDEsIDB4N0MsCisJIDB4QkMsIDB4RjksIDB4NDksIDB4RjMsIDB4MDEsIDB4NjMsIDB4NjAsIDB4NDAsIDB4RkYsIDB4MjYsIDB4NDksIDB4RkQsIDB4QzcsIDB4NjAsIDB4MkUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RTMsIDB4NjAsIDB4RDMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4QjYsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDEsCisJIDB4QkQsIDB4RDEsIDB4QjAsIDB4ODQsIDB4QjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDIsIDB4NkIsIDB4RkIsIDB4MzEsIDB4NDQsIDB4RkUsIDB4QjQsCisJIDB4NDAsIDB4NTEsIDB4MEQsIDB4NjQsIDB4MDUsIDB4RkIsIDB4M0YsIDB4MDAsIDB4MjgsIDB4RjMsIDB4N0UsIDB4RjEsIDB4NjAsIDB4NDcsIDB4NjQsIDB4NDEsCisJIDB4MDcsIDB4QjEsIDB4MDcsIDB4QjQsIDB4MDgsIDB4MjQsIDB4NjcsIDB4NEMsIDB4NEUsIDB4RkIsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsIDB4Q0MsIDB4ODQsCisJIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsIDB4QTEsIDB4ODAsIDB4QjEsIDB4ODMsIDB4MkUsIDB4MDIsIDB4N0UsIDB4RkQsIDB4MUYsIDB4NjAsIDB4QUEsIDB4NjIsCisJIDB4QTIsIDB4RDMsIDB4QzUsIDB4RkIsIDB4NjUsIDB4RkIsIDB4N0UsIDB4RjMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODUsIDB4QTQsIDB4ODAsIDB4N0UsIDB4RkIsCisJIDB4MTcsIDB4MDIsIDB4MUIsIDB4NjAsIDB4QzQsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4NDYsIDB4NUUsCisJIDB4MzEsIDB4NDQsIDB4MDEsIDB4QkMsIDB4NDAsIDB4NTEsIDB4RUQsIDB4RTIsIDB4MEYsIDB4NEUsIDB4Q0UsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MDcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4MDEsIDB4NjUsIDB4RTIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4REQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDAsCisJIDB4MEYsIDB4NjAsIDB4RDYsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4RTUsIDB4NjAsIDB4MTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDcsIDB4RkUsIDB4QzcsIDB4NjAsIDB4MkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkUsIDB4RjUsCisJIDB4MjcsIDB4RjIsIDB4MTIsIDB4NjAsIDB4Q0UsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsCisJIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsCisJIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsCisJIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsCisJIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODgsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MjgsIDB4MDIsIDB4MTQsIDB4NjAsCisJIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDMsIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsIDB4RDUsIDB4ODAsIDB4QTEsIDB4RDEsIDB4MDQsIDB4MDMsIDB4RDMsIDB4ODAsCisJIDB4RDksIDB4ODEsIDB4RkEsIDB4MDIsIDB4MDksIDB4MDAsIDB4QTEsIDB4REQsIDB4MTQsIDB4NjAsIDB4RDAsIDB4NjIsIDB4RDksIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4NEEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDUsIDB4NjMsIDB4NDYsIDB4MDYsIDB4RjIsIDB4RkYsIDB4NjAsCisJIDB4MDEsIDB4N0MsIDB4QTAsIDB4OUMsIDB4MDYsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NzEsIDB4RjMsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4Q0MsIDB4ODQsIDB4ODAsIDB4MkIsIDB4NzEsIDB4RkIsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QUIsIDB4MDEsCisJIDB4MkUsIDB4RjUsIDB4MjUsIDB4NjAsIDB4MjgsIDB4NjEsIDB4MjgsIDB4RjAsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RDksIDB4MjcsIDB4RjIsIDB4MTIsIDB4NjAsCisJIDB4Q0UsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsCisJIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsCisJIDB4NjEsIDB4NDYsIDB4MjYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjAsCisJIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsCisJIDB4ODgsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MTMsIDB4MDIsIDB4NjMsIDB4NDYsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4QjAsIDB4MDgsIDB4QkMsIDB4MEQsIDB4MDMsIDB4MDYsIDB4RkEsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OUQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MEYsIDB4NjAsIDB4RTgsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4NkEsIDB4MDEsIDB4N0UsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDEsIDB4MDcsIDB4QjEsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjQsIDB4NjcsIDB4NEMsCisJIDB4MUIsIDB4NjAsIDB4QzQsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4NDYsIDB4NUUsIDB4MUYsIDB4NjAsCisJIDB4QUEsIDB4NjIsIDB4QTIsIDB4RDMsIDB4QzUsIDB4RkIsIDB4NjUsIDB4RkIsIDB4MUYsIDB4NjAsIDB4QjYsIDB4NjMsIDB4QkQsIDB4RDEsIDB4Q0IsIDB4RjksCisJIDB4NjcsIDB4RjksIDB4QkQsIDB4RDEsIDB4Q0MsIDB4RjksIDB4NjgsIDB4RjksIDB4QTMsIDB4RDEsIDB4Q0QsIDB4RjksIDB4NjksIDB4RjksIDB4MDEsIDB4NjQsCisJIDB4NkIsIDB4RkIsIDB4MzEsIDB4NDQsIDB4MjEsIDB4QkMsIDB4NDAsIDB4NTEsIDB4MjAsIDB4NDQsIDB4MDEsIDB4NjUsIDB4MzQsIDB4ODAsIDB4MDEsIDB4NjQsCisJIDB4NTEsIDB4RkIsIDB4MjEsIDB4NjAsIDB4NTAsIDB4NjQsIDB4NTIsIDB4RkIsIDB4MEYsIDB4NEUsIDB4RTgsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MDIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4QzcsIDB4NjAsIDB4MkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NTcsIDB4NjMsIDB4NDYsIDB4NDMsIDB4NDcsCisJIDB4MUUsIDB4RjIsIDB4NzIsIDB4RjIsIDB4MDIsIDB4MUIsIDB4MDEsIDB4MUIsIDB4MEMsIDB4MDAsIDB4NjAsIDB4NDYsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjQsCisJIDB4NDAsIDB4NEIsIDB4RjAsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDYsIDB4NzIsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4RjQsIDB4MUIsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUIsIDB4NjAsIDB4QUMsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsCisJIDB4NjAsIDB4NDYsIDB4MEUsIDB4RjIsIDB4NUIsIDB4MDMsIDB4NjAsIDB4NDAsIDB4RjAsIDB4MzcsIDB4NDgsIDB4MDAsIDB4RkYsIDB4MzcsIDB4M0QsIDB4MDAsCisJIDB4RkQsIDB4MzcsIDB4MzUsIDB4MDAsIDB4MTgsIDB4MzcsIDB4MjksIDB4MDAsIDB4RkUsIDB4MzcsIDB4MkMsIDB4MDAsIDB4RjgsIDB4MzcsIDB4MEEsIDB4MDAsCisJIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4NDYsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RDYsIDB4MDEsIDB4MDYsIDB4QjQsIDB4RkQsIDB4N0YsIDB4MEUsIDB4RkEsCisJIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4QjIsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjksIDB4RkUsIDB4QzYsIDB4MDEsIDB4REIsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QjcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDAsIDB4REUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4OTksIDB4NzgsIDB4RkYsIDB4RkYsIDB4QkMsIDB4MDMsIDB4MjMsIDB4RjAsCisJIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjYsIDB4RTIsIDB4MUIsIDB4MDIsIDB4MjYsIDB4RTAsIDB4MTgsIDB4QTIsIDB4RkYsIDB4MDIsIDB4RjAsIDB4MDksIDB4NjAsCisJIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsIDB4OTAsIDB4RjMsIDB4MDIsIDB4MDIsIDB4Q0MsIDB4ODQsIDB4OTAsIDB4RkIsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjQsCisJIDB4NDAsIDB4NEIsIDB4RjAsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTUsIDB4MDEsIDB4QUMsIDB4RkUsIDB4MDksIDB4MDUsCisJIDB4QUQsIDB4RkUsIDB4MTAsIDB4MDUsIDB4QUUsIDB4RkUsIDB4OUYsIDB4MDUsIDB4QUYsIDB4RkUsIDB4M0EsIDB4MDUsIDB4QzcsIDB4NjAsIDB4MkUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4Q0UsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4RjQsIDB4MDEsIDB4MTAsIDB4NjAsIDB4MDIsIDB4NjUsIDB4MDMsIDB4NjEsIDB4MDcsIDB4MDAsIDB4QTIsIDB4REQsIDB4NTgsIDB4NEYsCisJIDB4NjQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QjksIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDMsIDB4MDAsIDB4NjMsIDB4QTUsIDB4RDEsIDB4NUEsIDB4RDMsCisJIDB4REEsIDB4ODUsIDB4MDAsIDB4QTgsIDB4Q0QsIDB4ODEsIDB4RjIsIDB4MDIsIDB4RjgsIDB4MDIsIDB4RTAsIDB4MDEsIDB4MEYsIDB4NjAsIDB4Q0MsIDB4NjIsCisJIDB4MEYsIDB4NjAsIDB4RjIsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NEUsIDB4NjMsIDB4MDAsIDB4NjQsIDB4NUEsIDB4REIsIDB4RDYsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MDMsIDB4NUEsIDB4REIsIDB4NUEsIDB4REIsIDB4NUEsIDB4REQsIDB4RjksIDB4MDEsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MDAsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RDYsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4NUEsIDB4REQsIDB4RkIsIDB4MDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjQsIDB4NDAsIDB4NDEsIDB4MEYsIDB4NjAsIDB4Q0UsIDB4NjMsIDB4QTMsIDB4RDEsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsCisJIDB4MDYsIDB4NjEsIDB4MDgsIDB4MDMsIDB4QkQsIDB4REIsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsIDB4Q0QsIDB4ODEsIDB4QTMsIDB4REIsCisJIDB4MDYsIDB4QTMsIDB4RjksIDB4MDIsIDB4MEYsIDB4NjAsIDB4RjQsIDB4NjMsIDB4QTMsIDB4RDEsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MDcsIDB4NjEsCisJIDB4MTksIDB4MDMsIDB4QkQsIDB4REIsIDB4NjQsIDB4NDQsIDB4RkUsIDB4QTMsIDB4MDIsIDB4QTMsIDB4Q0QsIDB4ODEsIDB4RTgsIDB4ODQsIDB4RTMsIDB4MDMsCisJIDB4MDIsIDB4MDUsIDB4RTEsIDB4MDMsIDB4RjksIDB4MDEsIDB4NzgsIDB4RkIsIDB4N0EsIDB4RkQsIDB4NjEsIDB4NUMsIDB4QTMsIDB4RDMsIDB4NzksIDB4RjksCisJIDB4MDMsIDB4MTgsIDB4NTgsIDB4NEYsIDB4NjAsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0EsIDB4RjMsIDB4NzksIDB4RjEsIDB4NjAsIDB4NDMsIDB4NzgsIDB4RjMsCisJIDB4NjQsIDB4NDEsIDB4RUEsIDB4MDEsIDB4MjEsIDB4NDMsIDB4MEYsIDB4NjAsIDB4RjQsIDB4NjUsIDB4RDcsIDB4ODAsIDB4QkQsIDB4RDEsIDB4QkQsIDB4RDMsCisJIDB4MDMsIDB4MDIsIDB4QzcsIDB4NjAsIDB4MkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsIDB4QkQsIDB4RDEsIDB4NDMsIDB4NDEsIDB4RjUsIDB4MDMsCisJIDB4RTUsIDB4NjAsIDB4NTMsIDB4NjQsIDB4NjQsIDB4NTgsIDB4NDAsIDB4NEYsIDB4MkEsIDB4RjAsIDB4ODMsIDB4NjAsIDB4RkYsIDB4NjUsIDB4NjQsIDB4NDcsCisJIDB4MDMsIDB4MkIsIDB4MDEsIDB4MDAsIDB4MTcsIDB4MDAsIDB4MDMsIDB4MjYsIDB4MDMsIDB4QUMsIDB4NjAsIDB4NDcsIDB4QTQsIDB4ODQsIDB4MkEsIDB4RkEsCisJIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsIDB4MkUsIDB4RkEsIDB4NjQsIDB4NDEsIDB4Q0IsIDB4RjMsCisJIDB4MkYsIDB4RkEsIDB4NjAsIDB4NDMsIDB4Q0MsIDB4RjMsIDB4MzAsIDB4RkEsIDB4Q0QsIDB4RjEsIDB4MzEsIDB4RjgsIDB4MzIsIDB4RkMsIDB4MzMsIDB4RkEsCisJIDB4MzQsIDB4RjgsIDB4MTksIDB4MDAsIDB4NjAsIDB4NDcsIDB4QTQsIDB4ODQsIDB4MkEsIDB4RkEsIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsCisJIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsIDB4MkUsIDB4RkEsIDB4MzYsIDB4RjIsIDB4MzIsIDB4RkEsIDB4MzcsIDB4RjIsIDB4MzMsIDB4RkEsIDB4MzgsIDB4RjIsCisJIDB4MzQsIDB4RkEsIDB4Q0IsIDB4RjMsIDB4MkYsIDB4RkEsIDB4MzYsIDB4RkEsIDB4Q0MsIDB4RjMsIDB4MzAsIDB4RkEsIDB4MzcsIDB4RkEsIDB4Q0QsIDB4RjMsCisJIDB4MzEsIDB4RkEsIDB4MzgsIDB4RkEsIDB4NjQsIDB4NDEsIDB4MUMsIDB4RjIsIDB4MTMsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MEQsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4ODAsIDB4MkIsIDB4MjksIDB4MDAsIDB4MjYsIDB4NDYsIDB4MDQsIDB4NjMsIDB4MDMsIDB4RkMsIDB4MDAsIDB4RjQsIDB4MEQsIDB4RjIsCisJIDB4MDYsIDB4RkEsIDB4RTYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4RjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTAsIDB4NTksIDB4RjUsIDB4MUEsIDB4MDIsCisJIDB4MzksIDB4RjIsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDAsIDB4NjAsIDB4ODEsIDB4NjcsIDB4MEQsIDB4RkEsIDB4N0MsIDB4NjQsCisJIDB4MDEsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4OUEsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzgsIDB4RkUsCisJIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjAsIDB4NDIsIDB4NjQsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDQsIDB4M0YsIDB4RkEsIDB4MUMsIDB4RjIsIDB4MTMsIDB4RkEsIDB4MjYsIDB4RjIsIDB4MjcsIDB4RjAsIDB4NjAsIDB4NDcsCisJIDB4MDAsIDB4RjQsIDB4MUYsIDB4RkEsIDB4NjQsIDB4NDcsIDB4MjAsIDB4RkEsIDB4NjEsIDB4NDQsIDB4MjEsIDB4RkEsIDB4MDEsIDB4NjcsIDB4MEQsIDB4RkEsCisJIDB4MTAsIDB4NjEsIDB4MUYsIDB4NjAsIDB4NkMsIDB4NjQsIDB4MUUsIDB4NjMsIDB4NTgsIDB4RDEsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4RDgsIDB4RkMsIDB4MDIsCisJIDB4OUIsIDB4RjEsIDB4QjgsIDB4RjEsIDB4NjQsIDB4NUUsIDB4NjQsIDB4NUYsIDB4NDQsIDB4NjMsIDB4QkQsIDB4REEsIDB4MUYsIDB4NjAsIDB4NjYsIDB4NjIsCisJIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MDksIDB4QkMsIDB4NEEsIDB4RDMsIDB4NjAsIDB4NDUsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDMsIDB4NjQsIDB4MDIsIDB4MzYsIDB4MDEsIDB4NjQsIDB4QjQsIDB4ODQsIDB4MDYsIDB4QTIsIDB4QTIsIDB4RDEsCisJIDB4QkQsIDB4REEsIDB4NjQsIDB4NDcsIDB4QkQsIDB4REEsIDB4QjUsIDB4RjMsIDB4QjYsIDB4RjEsIDB4NjAsIDB4NDcsIDB4QkQsIDB4REEsIDB4NjQsIDB4NDcsCisJIDB4QzMsIDB4RjEsIDB4QkQsIDB4REEsIDB4NjQsIDB4NDQsIDB4QkQsIDB4REEsIDB4MjYsIDB4NDYsIDB4MDAsIDB4NjQsIDB4MjMsIDB4RjAsIDB4M0IsIDB4RjAsCisJIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDYsIDB4MDAsIDB4QzAsIDB4NjcsIDB4QTAsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4MTAsIDB4QkMsIDB4M0UsIDB4RkEsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4OUEsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzgsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4NjAsIDB4NUMsIDB4NjEsIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjYsIDB4NDQsIDB4NTksIDB4RkIsIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NTksIDB4RjUsIDB4QUMsIDB4RjEsCisJIDB4MTksIDB4RjgsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4MDgsIDB4NjQsIDB4MkEsIDB4RkEsIDB4ODAsIDB4N0UsIDB4RjgsIDB4N0YsIDB4MEUsIDB4RkEsCisJIDB4ODgsIDB4RjEsIDB4MDcsIDB4RjgsIDB4MDEsIDB4NjAsIDB4NjAsIDB4NjcsIDB4MkMsIDB4RkEsIDB4MUQsIDB4NjAsIDB4MDAsIDB4NjcsIDB4MkQsIDB4RkEsCisJIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjcsIDB4MkUsIDB4RkEsIDB4Q0IsIDB4RjEsIDB4MkYsIDB4RjgsIDB4MzIsIDB4RjgsIDB4Q0MsIDB4RjEsIDB4MzAsIDB4RjgsCisJIDB4MzMsIDB4RjgsIDB4Q0QsIDB4RjEsIDB4MzEsIDB4RjgsIDB4MzQsIDB4RjgsIDB4MDAsIDB4NjMsIDB4M0IsIDB4RkMsIDB4M0QsIDB4RkMsIDB4MDEsIDB4NjQsCisJIDB4M0EsIDB4RkEsIDB4NjYsIDB4NjQsIDB4MzksIDB4RkEsIDB4M0MsIDB4RkMsIDB4QUEsIDB4NjAsIDB4QUEsIDB4NjQsIDB4MDAsIDB4RjQsIDB4MDIsIDB4RkEsCisJIDB4MDAsIDB4NjAsIDB4MDMsIDB4NjQsIDB4NUEsIDB4REEsIDB4MUQsIDB4NjAsIDB4NjAsIDB4NjQsIDB4NUEsIDB4REEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4NUEsIDB4REEsIDB4ODIsIDB4N0YsIDB4MjQsIDB4N0UsIDB4MDgsIDB4RkEsIDB4MDEsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MEEsIDB4RkEsIDB4MDAsIDB4NjQsCisJIDB4MEUsIDB4RkEsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NTksIDB4RjUsIDB4M0QsIDB4RjIsIDB4M0MsIDB4RjIsIDB4Q0MsIDB4ODMsIDB4MDAsIDB4QTgsCisJIDB4MDMsIDB4MDMsIDB4MDgsIDB4MjgsIDB4M0QsIDB4RkMsIDB4NDUsIDB4MDAsIDB4M0QsIDB4RkEsIDB4M0EsIDB4RjIsIDB4M0IsIDB4RjAsIDB4MDAsIDB4NjMsCisJIDB4MDAsIDB4RjQsIDB4MDcsIDB4RkMsIDB4MDEsIDB4QjAsIDB4MEIsIDB4RkEsIDB4MUEsIDB4MDMsIDB4MUYsIDB4RjgsIDB4RkYsIDB4RkYsIDB4MUIsIDB4NjAsCisJIDB4REEsIDB4NjIsIDB4MTgsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MEEsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4MUYsIDB4RjIsIDB4MUUsIDB4RjAsIDB4NTksIDB4RjUsIDB4MDAsIDB4QTgsIDB4M0IsIDB4RjgsIDB4RDAsIDB4ODAsIDB4MDYsIDB4MDMsCisJIDB4MDUsIDB4MDMsIDB4MDQsIDB4NjAsIDB4NUMsIDB4NjMsIDB4MEYsIDB4NjQsIDB4M0EsIDB4RkEsIDB4MzksIDB4RkMsIDB4MDAsIDB4RjQsIDB4MDAsIDB4NjQsCisJIDB4MDYsIDB4RkEsIDB4RTYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4RjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTksIDB4RjUsIDB4MDAsIDB4RjQsIDB4ODEsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4MDYsIDB4RkEsIDB4MzIsIDB4NDcsIDB4MDQsIDB4QkMsIDB4MDcsIDB4RkEsIDB4QjgsIDB4RjEsIDB4MDAsIDB4N0YsIDB4NjQsIDB4NUUsCisJIDB4MDksIDB4RkEsIDB4NTksIDB4RjUsIDB4MDAsIDB4NjQsIDB4MTUsIDB4RkEsIDB4MzksIDB4RjIsIDB4M0YsIDB4RkEsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsCisJIDB4MUIsIDB4NjAsIDB4ODgsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4RTEsIDB4NjAsIDB4MEQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDUsIDB4MEUsIDB4RjIsIDB4MEYsIDB4RjAsIDB4MTAsIDB4RjAsCisJIDB4NjQsIDB4NDEsIDB4MDEsIDB4QTgsIDB4NTksIDB4RjUsIDB4MDksIDB4MDIsIDB4QUQsIDB4ODMsIDB4NjQsIDB4NDQsIDB4QUMsIDB4ODQsIDB4MDgsIDB4MjQsCisJIDB4MEEsIDB4NjMsIDB4M0MsIDB4RkMsIDB4M0QsIDB4RkMsIDB4MUEsIDB4MDIsIDB4MkQsIDB4MDAsIDB4MDMsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MDAsIDB4NjQsCisJIDB4M0MsIDB4RkEsIDB4MjksIDB4MDAsIDB4MDQsIDB4M0EsIDB4MDksIDB4MDAsIDB4MEEsIDB4NjQsIDB4M0MsIDB4RkEsIDB4MDEsIDB4NjQsIDB4M0EsIDB4RkEsCisJIDB4MDAsIDB4RjQsIDB4MDAsIDB4NjQsIDB4MUYsIDB4RkEsIDB4MUUsIDB4RkEsIDB4MUUsIDB4MDAsIDB4MDIsIDB4M0EsIDB4MUUsIDB4MDAsIDB4NjQsIDB4NDQsCisJIDB4QUQsIDB4ODMsIDB4QUMsIDB4ODQsIDB4MDIsIDB4MDMsIDB4M0MsIDB4RkMsIDB4M0QsIDB4RkMsIDB4MTUsIDB4MDMsIDB4M0EsIDB4RkEsIDB4RjgsIDB4NjUsCisJIDB4NTIsIDB4NjMsIDB4NjQsIDB4NDQsIDB4MDEsIDB4MzYsIDB4MEQsIDB4MDAsIDB4MTIsIDB4QTMsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDIsIDB4MDAsCisJIDB4QzcsIDB4ODMsIDB4QzcsIDB4ODMsIDB4NjQsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDEsIDB4MDAsIDB4QzcsIDB4ODMsIDB4NjQsIDB4NDAsIDB4MDQsIDB4MjYsCisJIDB4QzcsIDB4ODMsIDB4MzksIDB4RkMsIDB4MDAsIDB4NjQsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4M0IsIDB4RjAsIDB4M0EsIDB4RjIsIDB4NjUsIDB4NDYsCisJIDB4MDYsIDB4RjIsIDB4NDAsIDB4NDcsIDB4MUQsIDB4MTgsIDB4MzIsIDB4NDcsIDB4MDcsIDB4RkEsIDB4MjQsIDB4N0UsIDB4ODIsIDB4N0YsIDB4MDgsIDB4RkEsCisJIDB4MDEsIDB4NjAsIDB4MDEsIDB4NjMsIDB4QjgsIDB4RjMsIDB4MEEsIDB4RkMsIDB4MDAsIDB4N0YsIDB4MDksIDB4RkEsIDB4MjcsIDB4NDAsIDB4MDEsIDB4MkEsCisJIDB4MEYsIDB4MDAsIDB4MUYsIDB4RjgsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MTgsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MEEsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MUUsIDB4RjAsIDB4NTksIDB4RjUsIDB4M0IsIDB4RjgsIDB4NjUsIDB4NDYsCisJIDB4MjcsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MTMsIDB4MDAsIDB4NkUsIDB4NjEsIDB4RkYsIDB4NjAsIDB4RkUsIDB4NjQsCisJIDB4MDAsIDB4NjAsIDB4MEUsIDB4NjMsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDgsIDB4RkQsIDB4MUYsIDB4MDEsIDB4NjAsIDB4RUUsIDB4NjMsIDB4MDAsIDB4RjQsCisJIDB4MDIsIDB4NjEsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDgsIDB4N0UsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjEsIDB4RjksIDB4MUYsCisJIDB4MjcsIDB4NDAsIDB4MDQsIDB4MjYsIDB4MUIsIDB4MDAsIDB4NDYsIDB4NEIsIDB4MUIsIDB4NjAsIDB4ODgsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MEUsIDB4MDMsIDB4ODksIDB4RjAsIDB4RTcsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QUUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjUsIDB4NDQsIDB4QUMsIDB4ODYsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDMsIDB4RTcsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QUUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MDAsIDB4MkIsIDB4NDYsIDB4ODIsIDB4RkMsIDB4MDAsIDB4RjQsIDB4ODIsIDB4RkMsIDB4MDAsIDB4RjQsIDB4MjcsIDB4NDAsIDB4MDgsIDB4MjYsCisJIDB4MUEsIDB4MDAsIDB4NDYsIDB4NEIsIDB4MUIsIDB4NjAsIDB4QzQsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsCisJIDB4MEUsIDB4MDMsIDB4ODksIDB4RjAsIDB4RTcsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDQsIDB4QUMsIDB4ODYsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDMsIDB4RTcsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4NjUsIDB4NDYsCisJIDB4MDIsIDB4RkEsIDB4MDAsIDB4RjQsIDB4ODIsIDB4RkMsIDB4MDEsIDB4NjQsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjEsIDB4MDIsIDB4NjQsCisJIDB4N0EsIDB4NjMsIDB4NTgsIDB4RDAsIDB4QUIsIDB4NDYsIDB4QTAsIDB4RDgsIDB4QUIsIDB4NDYsIDB4RkIsIDB4MUYsIDB4QUIsIDB4NDYsIDB4MDAsIDB4RjQsCisJIDB4Q0QsIDB4ODEsIDB4QUIsIDB4NDYsIDB4MDAsIDB4RjQsIDB4RjMsIDB4MDIsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MkEsIDB4NjEsCisJIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4NTgsIDB4RkIsIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsCisJIDB4NjcsIDB4NDQsIDB4MkMsIDB4RkEsIDB4MkQsIDB4RkEsIDB4MkUsIDB4RkEsIDB4MzIsIDB4RkEsIDB4MzMsIDB4RkEsIDB4MzQsIDB4RkEsIDB4MTIsIDB4NjAsCisJIDB4ODAsIDB4NjQsIDB4ODgsIDB4RjEsIDB4MEUsIDB4RkEsIDB4MDcsIDB4RjgsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4MTEsIDB4NjAsIDB4RDgsIDB4NjMsCisJIDB4QTMsIDB4REIsIDB4MDYsIDB4QTMsIDB4MTAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDQsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDYsIDB4NjQsCisJIDB4QTMsIDB4REIsIDB4MTAsIDB4NjAsIDB4MDYsIDB4NjIsIDB4RUEsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTEsIDB4NjAsIDB4RTQsIDB4NjMsCisJIDB4MDAsIDB4NjQsIDB4QTMsIDB4REIsIDB4MDYsIDB4QTMsIDB4MTAsIDB4NjAsIDB4MEMsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDgsIDB4NjQsIDB4QkQsIDB4REIsCisJIDB4MDYsIDB4NjQsIDB4QTMsIDB4REIsIDB4MTAsIDB4NjAsIDB4MEEsIDB4NjIsIDB4RUEsIDB4NjAsIDB4MTIsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsCisJIDB4RkMsIDB4NjIsIDB4RTksIDB4NjAsIDB4RjIsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjQsIDB4MjUsIDB4NjAsIDB4MkEsIDB4NjIsIDB4QTIsIDB4REIsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NTgsIDB4RjUsIDB4Q0IsIDB4RjEsIDB4MkYsIDB4RjgsIDB4Q0MsIDB4RjEsIDB4MzAsIDB4RjgsIDB4Q0QsIDB4RjEsCisJIDB4MzEsIDB4RjgsIDB4QUMsIDB4RjEsIDB4MTksIDB4RjgsIDB4RUEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzAsIDB4NjQsCisJIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsIDB4RTIsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTYsIDB4NjAsIDB4Q0MsIDB4NjEsCisJIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NTksIDB4MTgsIDB4NTgsIDB4RjUsIDB4NDAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4NTIsIDB4RjMsIDB4MDAsIDB4RjQsCisJIDB4NjAsIDB4NDMsIDB4QkQsIDB4RDEsIDB4MDQsIDB4NjUsIDB4NjQsIDB4NDcsIDB4QTUsIDB4REEsIDB4NjQsIDB4NDEsIDB4REQsIDB4ODEsIDB4RTksIDB4ODEsCisJIDB4NjIsIDB4NDQsIDB4MDQsIDB4MDMsIDB4QkQsIDB4RDEsIDB4Q0QsIDB4ODEsIDB4NTgsIDB4RDgsIDB4RkMsIDB4MDIsIDB4NTgsIDB4OEIsIDB4MjEsIDB4NjAsCisJIDB4OEUsIDB4NjMsIDB4QTMsIDB4RDEsIDB4MkIsIDB4NDQsIDB4QzgsIDB4ODQsIDB4NjQsIDB4NDEsIDB4RkYsIDB4QjEsIDB4NjEsIDB4NDUsIDB4MDMsIDB4QTEsCisJIDB4RTksIDB4ODEsIDB4NDEsIDB4NEMsIDB4QkQsIDB4RDEsIDB4Q0QsIDB4ODEsIDB4NTgsIDB4RDgsIDB4RkMsIDB4MDIsIDB4MkIsIDB4RDIsIDB4MkIsIDB4NDMsCisJIDB4NjAsIDB4NDcsIDB4MDEsIDB4N0UsIDB4NTIsIDB4RjEsIDB4QTMsIDB4REEsIDB4QTQsIDB4RDMsIDB4Q0IsIDB4ODMsIDB4NDQsIDB4OEIsIDB4RjgsIDB4ODQsCisJIDB4MkMsIDB4NDEsIDB4MEMsIDB4MDQsIDB4QkUsIDB4RDIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4QkUsIDB4REEsIDB4MDAsIDB4N0UsIDB4QTMsIDB4RDIsCisJIDB4NjAsIDB4NDUsIDB4MDAsIDB4N0YsIDB4QjQsIDB4ODQsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REEsIDB4RjQsIDB4MDIsIDB4NTgsIDB4RjUsIDB4MkIsIDB4NDQsCisJIDB4MDQsIDB4QTQsIDB4M0YsIDB4RkEsIDB4NjUsIDB4RjMsIDB4NjQsIDB4RkIsIDB4MTYsIDB4NjAsIDB4Q0UsIDB4NjEsIDB4MDEsIDB4NjQsIDB4NTIsIDB4RjEsCisJIDB4QTEsIDB4REIsIDB4NjUsIDB4RkIsIDB4QTQsIDB4RDMsIDB4MDQsIDB4NjUsIDB4NTEsIDB4RjMsIDB4MDEsIDB4MTgsIDB4MEMsIDB4NjUsIDB4RjMsIDB4QjQsCisJIDB4QjQsIDB4ODQsIDB4NTEsIDB4RkIsIDB4MDIsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MTYsIDB4MDMsIDB4NjUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsCisJIDB4MEYsIDB4QjQsIDB4NjUsIDB4RkIsIDB4MDEsIDB4MDMsIDB4MEYsIDB4MDAsIDB4RTksIDB4NjAsIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTEsIDB4RjEsCisJIDB4NjUsIDB4RjMsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MjYsIDB4RjgsIDB4MDEsIDB4RjMsIDB4QTAsIDB4MDQsIDB4QTQsIDB4MDEsIDB4MDQsIDB4RjEsIDB4QTQsCisJIDB4MTAsIDB4MzYsIDB4RjIsIDB4MDEsIDB4NjUsIDB4RkIsIDB4NjUsIDB4RjMsIDB4MTYsIDB4NjAsIDB4Q0MsIDB4NjEsIDB4QTEsIDB4RDEsIDB4Q0MsIDB4ODQsCisJIDB4MDEsIDB4NjEsIDB4MDgsIDB4MjQsIDB4MDMsIDB4MDAsIDB4RTEsIDB4ODEsIDB4Q0MsIDB4ODQsIDB4RkIsIDB4MDEsIDB4QTEsIDB4ODQsIDB4NTEsIDB4RjEsCisJIDB4RTcsIDB4MDMsIDB4MTYsIDB4NjAsIDB4Q0UsIDB4NjEsIDB4QTEsIDB4REIsIDB4MDAsIDB4MDAsIDB4NjUsIDB4RjMsIDB4MDEsIDB4NjEsIDB4Q0MsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4RTEsIDB4ODEsIDB4RkIsIDB4MDEsIDB4OUEsIDB4RjMsIDB4NjEsIDB4NDUsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4RDcsIDB4MDMsIDB4MzEsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsIDB4RTIsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4REUsIDB4RkUsIDB4MEIsIDB4MDQsIDB4MEYsIDB4NjAsIDB4RTQsIDB4NjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTgsIDB4NjAsCisJIDB4OTUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjUsIDB4RjEsIDB4MUMsIDB4NjAsIDB4MDAsIDB4NjIsCisJIDB4QTIsIDB4RDksIDB4MUUsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RTQsIDB4NjIsIDB4MjAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTgsIDB4NjAsIDB4QzgsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4QkUsIDB4RkUsIDB4MEYsIDB4NjAsIDB4Q0UsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RTIsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NTgsIDB4RjUsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsCisJIDB4MUIsIDB4NjAsIDB4OEUsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NEYsIDB4RkIsIDB4MEYsIDB4NjAsIDB4RTQsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4RTgsIDB4NjAsIDB4RjIsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4QzEsIDB4RkUsIDB4MzMsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MzQsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsIDB4RTIsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4QTYsIDB4RjEsIDB4MTEsIDB4NjAsIDB4REMsIDB4NjIsIDB4QTIsIDB4RDksIDB4MUMsIDB4NjAsIDB4MTAsIDB4NjIsIDB4MTEsIDB4NjAsCisJIDB4RDgsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4QTcsIDB4RjEsIDB4MTEsIDB4NjAsCisJIDB4RTgsIDB4NjIsIDB4QTIsIDB4RDksIDB4MUMsIDB4NjAsIDB4MEUsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RkQsIDB4MUIsIDB4MUMsIDB4NjAsCisJIDB4MTAsIDB4NjIsIDB4MTEsIDB4NjAsIDB4RTQsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsCisJIDB4MEYsIDB4NjAsIDB4RTQsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTksIDB4NjAsIDB4MjMsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NEYsIDB4RjEsIDB4MEYsIDB4NjAsIDB4RTIsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4NjQsIDB4NDAsIDB4RkYsIDB4MjYsIDB4MDMsIDB4MDAsIDB4RTgsIDB4NjAsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MEEsIDB4MDAsIDB4NjQsCisJIDB4NEYsIDB4RkIsIDB4QTgsIDB4RjEsIDB4MTEsIDB4NjAsIDB4RTgsIDB4NjIsIDB4QTIsIDB4RDksIDB4MEYsIDB4NjAsIDB4RTQsIDB4NjIsIDB4MDAsIDB4NjAsCisJIDB4MEMsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTksIDB4NjAsIDB4NDksIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MUMsIDB4NjAsIDB4MTAsIDB4NjIsCisJIDB4MTEsIDB4NjAsIDB4RTQsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RTIsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsCisJIDB4MEMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MUMsIDB4NjAsIDB4MTAsIDB4NjIsIDB4MTEsIDB4NjAsIDB4RTQsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkYsIDB4NjAsIDB4RjcsIDB4NjQsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4NEYsIDB4RjMsIDB4REIsIDB4MEEsIDB4MDAsIDB4QTAsIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDMsIDB4NEYsIDB4RkIsIDB4RDYsIDB4MDEsCisJIDB4MUMsIDB4NjAsIDB4MTAsIDB4NjIsIDB4MTEsIDB4NjAsIDB4RDgsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4RkYsIDB4RTgsIDB4NjAsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzUsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MUMsIDB4NjAsCisJIDB4MTAsIDB4NjIsIDB4MTEsIDB4NjAsIDB4RDgsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsCisJIDB4NTEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RTMsIDB4QjQsIDB4NTEsIDB4RkIsIDB4MTYsIDB4NjAsIDB4Q0EsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4RkUsIDB4QjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjQsIDB4MjUsIDB4NjAsIDB4MkEsIDB4NjIsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RTIsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEUsIDB4MDQsIDB4MzIsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsCisJIDB4RTQsIDB4NjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTksIDB4NjAsIDB4OEUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4RjEsIDB4NjUsIDB4RjksIDB4MUMsIDB4NjAsIDB4MDAsIDB4NjIsIDB4QTIsIDB4RDksIDB4MUUsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RTQsIDB4NjIsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4RTksIDB4NjAsIDB4QjYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QkUsIDB4RkUsIDB4MEYsIDB4NjAsCisJIDB4Q0UsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MEYsIDB4NjAsCisJIDB4Q0UsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDAsIDB4NjAsCisJIDB4MDQsIDB4NjEsIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjQsIDB4MjMsIDB4RkEsIDB4RjEsIDB4NjAsCisJIDB4MDIsIDB4NjQsIDB4MjQsIDB4RkEsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4Q0EsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4RUEsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4MkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4NDQsIDB4MDEsIDB4QjUsIDB4NTQsIDB4ODAsIDB4MzEsIDB4NDQsIDB4REUsIDB4QjQsIDB4NDAsIDB4NTEsCisJIDB4MEYsIDB4NjAsIDB4RTIsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NUEsIDB4REIsIDB4M0UsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MUMsIDB4NjAsIDB4MTAsIDB4NjIsIDB4MTEsIDB4NjAsCisJIDB4RDgsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NTEsIDB4RkIsCisJIDB4MEYsIDB4NjAsIDB4RTIsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NUEsIDB4REIsIDB4QkUsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MEYsIDB4NjAsIDB4RTIsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RTIsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4MDEsIDB4NjAsIDB4N0EsIDB4NjEsIDB4MTYsIDB4NjAsCisJIDB4QzQsIDB4NjMsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjAsIDB4N0YsIDB4QkQsIDB4REIsIDB4MjEsIDB4NjAsIDB4MzIsIDB4NjQsIDB4QkQsIDB4REIsCisJIDB4MDQsIDB4QTEsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjIsIDB4N0YsIDB4QTMsIDB4REIsIDB4MTAsIDB4MDAsIDB4MDEsIDB4NjAsIDB4N0EsIDB4NjEsCisJIDB4MTYsIDB4NjAsIDB4QzQsIDB4NjMsIDB4QTEsIDB4RDMsIDB4MDAsIDB4NjYsIDB4MjAsIDB4N0YsIDB4QkQsIDB4REIsIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4MjEsIDB4N0YsIDB4QkQsIDB4REIsIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjIsIDB4N0YsIDB4QTMsIDB4REIsIDB4MEYsIDB4NjAsIDB4RTIsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4OUYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEIsIDB4MDQsIDB4MEYsIDB4NjAsCisJIDB4RTQsIDB4NjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RUEsIDB4NjAsIDB4M0UsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4MDAsIDB4NjIsIDB4MTYsIDB4NjAsIDB4QzIsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjAsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RTQsIDB4NjIsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4RUEsIDB4NjAsIDB4NjYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RTIsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4OUYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QkUsIDB4RkUsIDB4MEYsIDB4NjAsIDB4Q0UsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4NUYsIDB4RkIsIDB4QUMsIDB4ODUsIDB4NjAsIDB4NDEsIDB4MjAsIDB4MDMsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjMsIDB4MDgsIDB4NjQsIDB4RTksIDB4ODEsCisJIDB4Q0MsIDB4ODQsIDB4MDIsIDB4MjQsIDB4REYsIDB4ODMsIDB4RkIsIDB4MDIsIDB4MjEsIDB4NjAsIDB4OEUsIDB4NjQsIDB4QTAsIDB4REQsIDB4NjUsIDB4NDEsCisJIDB4MjEsIDB4NjAsIDB4OTAsIDB4NjMsIDB4MEYsIDB4NjAsIDB4QzAsIDB4NjQsIDB4RTksIDB4ODEsIDB4NTgsIDB4RDEsIDB4RkQsIDB4MDQsIDB4QTMsIDB4RDksCisJIDB4MEIsIDB4MDMsIDB4NTgsIDB4RDEsIDB4RTksIDB4ODEsIDB4NjAsIDB4NDUsIDB4RkMsIDB4MDQsIDB4QTMsIDB4RDEsIDB4NjQsIDB4NDcsIDB4QjAsIDB4ODQsCisJIDB4QkQsIDB4REIsIDB4MDAsIDB4QjksIDB4NjUsIDB4NDQsIDB4RjAsIDB4MDIsIDB4MjAsIDB4NjAsIDB4MzgsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4QTgsIDB4MDEsIDB4NjAsIDB4NzAsIDB4NjIsIDB4MDYsIDB4MDIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QTgsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MDMsIDB4MDIsIDB4NjQsIDB4NjAsIDB4NDEsIDB4MjEsIDB4NjAsIDB4OEUsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4QjUsCisJIDB4ODAsIDB4QkYsIDB4Q0QsIDB4ODEsIDB4NjUsIDB4NUMsIDB4MEYsIDB4MDMsIDB4ODAsIDB4QkYsIDB4QkQsIDB4REIsIDB4NjUsIDB4NDQsIDB4QzgsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4MEMsIDB4MDMsIDB4NjAsIDB4NDUsIDB4Q0QsIDB4ODEsIDB4QTMsIDB4RDMsIDB4MDgsIDB4MDMsIDB4ODAsIDB4QkYsIDB4Q0QsIDB4ODEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4ODAsIDB4QkMsIDB4NjAsIDB4NDcsIDB4QkQsIDB4REIsIDB4MDAsIDB4NjUsIDB4NjQsIDB4NDEsIDB4MjEsIDB4NjAsCisJIDB4OTAsIDB4NjMsIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4ODAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4NjAsIDB4NDUsIDB4NjAsIDB4NDcsCisJIDB4ODAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4NjAsIDB4NDUsIDB4Q0QsIDB4ODEsIDB4RkYsIDB4RkYsIDB4RjIsIDB4MDIsIDB4NjUsIDB4NDQsCisJIDB4N0YsIDB4QjQsIDB4MDIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEEsIDB4NjQsIDB4MTUsIDB4MDAsIDB4MDQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTQsIDB4NjQsCisJIDB4MTEsIDB4MDAsIDB4MEEsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MzIsIDB4NjQsIDB4MEQsIDB4MDAsIDB4MEIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MzcsIDB4NjQsCisJIDB4MDksIDB4MDAsIDB4MTAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4NTAsIDB4NjQsIDB4MDUsIDB4MDAsIDB4MTYsIDB4M0EsIDB4MDIsIDB4MDAsIDB4NkUsIDB4NjQsCisJIDB4MDEsIDB4MDAsIDB4MTQsIDB4NjQsIDB4NjIsIDB4RkIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4M0MsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4MzEsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MTgsIDB4MDAsIDB4M0YsIDB4RjIsIDB4NDcsIDB4NjUsIDB4QzQsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MjMsIDB4RkEsCisJIDB4RjEsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjQsIDB4RkEsIDB4MUIsIDB4NjAsIDB4REEsIDB4NjIsIDB4MUIsIDB4NjAsIDB4Q0EsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MDAsIDB4NjYsCisJIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEMsIDB4NjMsIDB4MTIsIDB4NjAsCisJIDB4QjYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkUsIDB4MUYsIDB4NTMsIDB4RkIsIDB4NTQsIDB4RkIsIDB4MTIsIDB4NjAsIDB4QkEsIDB4NjMsCisJIDB4MDIsIDB4NjQsIDB4QTMsIDB4REIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTIsIDB4NjAsIDB4QkUsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MDAsIDB4NjMsCisJIDB4RjAsIDB4QTAsIDB4MDEsIDB4QTQsIDB4MDMsIDB4MDMsIDB4QTIsIDB4REIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4REQsIDB4MTIsIDB4NjAsCisJIDB4QzAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4QTIsIDB4REQsIDB4NUEsIDB4RDMsIDB4QTIsIDB4REQsIDB4QzAsIDB4ODEsIDB4NjEsIDB4NDQsIDB4MDIsIDB4MjQsCisJIDB4RkYsIDB4RkYsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4NUEsIDB4RDMsIDB4RTksIDB4ODEsIDB4RTgsIDB4ODMsCisJIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODUsIDB4RDQsIDB4ODUsIDB4QzUsIDB4ODMsIDB4QTIsIDB4REQsIDB4MTIsIDB4NjAsCisJIDB4QjgsIDB4NjIsIDB4NjMsIDB4NDcsIDB4MDAsIDB4N0YsIDB4QTIsIDB4REIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4RTEsIDB4QTMsIDB4RkYsCisJIDB4MUIsIDB4NjAsIDB4NUEsIDB4NjMsIDB4MTcsIDB4RkQsIDB4QUUsIDB4RkYsIDB4RUIsIDB4NjAsIDB4ODQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjcsCisJIDB4MDEsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QjEsIDB4RkUsIDB4MDUsIDB4MDUsIDB4QjAsIDB4RkUsIDB4MDYsIDB4MDUsIDB4QjIsIDB4RkUsCisJIDB4QjMsIDB4RkUsIDB4MjIsIDB4MDAsIDB4RjAsIDB4NjAsIDB4RkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4RjMsIDB4MjksIDB4RjEsIDB4NDAsIDB4NDQsCisJIDB4NDQsIDB4NDUsIDB4MkEsIDB4RjEsIDB4MkIsIDB4RjEsIDB4NDQsIDB4NDYsIDB4NDQsIDB4NDcsIDB4M0YsIDB4QjQsIDB4RTAsIDB4ODUsIDB4MTYsIDB4NjAsCisJIDB4RDIsIDB4NjQsIDB4NDQsIDB4RDcsIDB4NTgsIDB4NDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsIDB4MTIsIDB4NjAsIDB4QzgsIDB4N0MsIDB4QTQsIDB4RDMsCisJIDB4NjEsIDB4NDMsIDB4MDQsIDB4QjQsIDB4MjQsIDB4NDQsIDB4MDIsIDB4MDMsIDB4MTMsIDB4RkYsIDB4MDYsIDB4MDAsIDB4M0YsIDB4QjQsIDB4QjQsIDB4ODQsCisJIDB4RkYsIDB4MjcsIDB4MDUsIDB4RkQsIDB4MDQsIDB4RkIsIDB4MTAsIDB4NzUsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODYsIDB4M0UsIDB4QjQsIDB4RkUsCisJIDB4MDksIDB4MDUsIDB4QjUsIDB4RkUsIDB4MDIsIDB4MjQsIDB4ODAsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QjcsIDB4RkUsIDB4MDUsIDB4MDUsCisJIDB4QjYsIDB4RkUsIDB4RjIsIDB4MDEsIDB4RjEsIDB4NjAsIDB4MzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzYsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RjQsIDB4QTAsCisJIDB4NjAsIDB4NDUsIDB4MDUsIDB4MDUsIDB4MTcsIDB4NjAsIDB4NUUsIDB4NjQsIDB4NDQsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RTQsIDB4MDEsCisJIDB4RTMsIDB4MDEsIDB4N0YsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MTAsIDB4MDIsCisJIDB4MTAsIDB4NjQsIDB4NDAsIDB4NDAsIDB4MDIsIDB4NjQsIDB4NDAsIDB4NTAsIDB4NjEsIDB4RkYsIDB4M0YsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MDQsIDB4MDAsCisJIDB4MTAsIDB4RTAsIDB4NDYsIDB4NjAsIDB4MDksIDB4RTAsIDB4MDAsIDB4MDAsIDB4MjcsIDB4RjEsIDB4MDAsIDB4NjYsIDB4MjAsIDB4NzgsIDB4NDIsIDB4RkUsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NzgsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsCisJIDB4MUMsIDB4MDIsIDB4MTIsIDB4NjAsIDB4QzgsIDB4NjMsIDB4QTMsIDB4RDMsIDB4MDcsIDB4N0MsIDB4MjAsIDB4QjUsIDB4MEMsIDB4QjUsIDB4MDQsIDB4MDMsCisJIDB4MDMsIDB4MDIsIDB4QkMsIDB4RjksIDB4MDAsIDB4NjcsIDB4MTEsIDB4MDAsIDB4MDAsIDB4NjEsIDB4NDEsIDB4NTYsIDB4QzcsIDB4RkUsIDB4QjQsIDB4MDEsCisJIDB4MzYsIDB4NDcsIDB4RkYsIDB4MjMsIDB4MDQsIDB4MDAsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDEsIDB4N0YsIDB4NjcsIDB4MDYsIDB4MDAsIDB4MDQsIDB4N0MsCisJIDB4QkMsIDB4RjksIDB4MjAsIDB4NDQsIDB4ODAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NzgsIDB4NjAsCisJIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MzEsIDB4MDIsIDB4MTIsIDB4NjAsIDB4QzgsIDB4NjMsCisJIDB4QTMsIDB4RDMsIDB4MDEsIDB4N0MsIDB4MjAsIDB4QjUsIDB4MEMsIDB4QjUsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDIsIDB4QkMsIDB4RjksIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4NjEsIDB4NDEsIDB4NTYsIDB4QzcsIDB4RkUsIDB4RUIsIDB4NjAsIDB4ODQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4N0UsIDB4RjEsIDB4MjAsIDB4NDQsCisJIDB4NjQsIDB4NDAsIDB4RkYsIDB4MjYsIDB4MUIsIDB4MDAsIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDAsIDB4NUMsIDB4NUUsIDB4ODIsIDB4RkYsIDB4MjYsIDB4NDQsCisJIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDYsIDB4NUMsIDB4NDEsIDB4ODcsIDB4RkYsIDB4NjIsIDB4RkYsIDB4MDAsIDB4NjMsIDB4MUIsIDB4NjAsIDB4QzQsIDB4NjIsCisJIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MDQsIDB4MDMsIDB4MDksIDB4RjIsIDB4MEYsIDB4RkMsIDB4QUMsIDB4ODYsCisJIDB4RkIsIDB4MDEsIDB4MUMsIDB4NjAsIDB4MDQsIDB4NjIsIDB4MDYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MkQsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDYsIDB4MDEsIDB4RjIsIDB4MDgsIDB4RjAsIDB4NjAsIDB4NDcsIDB4MDMsIDB4QjQsIDB4MDMsIDB4QUMsIDB4N0YsIDB4NjcsCisJIDB4MDMsIDB4NjEsIDB4MDgsIDB4MDIsIDB4MUIsIDB4NjAsIDB4RTAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjAsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4NDksIDB4MDAsIDB4MjUsIDB4NDQsCisJIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODUsIDB4RUMsIDB4NjAsIDB4MzYsIDB4NjQsIDB4QzQsIDB4OTgsIDB4RkYsIDB4RkYsIDB4QzAsIDB4RkUsIDB4M0QsIDB4MDAsCisJIDB4QzEsIDB4RkUsIDB4M0IsIDB4MDAsIDB4QzIsIDB4RkUsIDB4MzksIDB4MDAsIDB4QzMsIDB4RkUsIDB4MzcsIDB4MDAsIDB4QzQsIDB4RkUsIDB4MzUsIDB4MDAsCisJIDB4QzUsIDB4RkUsIDB4MzMsIDB4MDAsIDB4QzYsIDB4RkUsIDB4MzEsIDB4MDAsIDB4QzcsIDB4RkUsIDB4MkYsIDB4MDAsIDB4QzgsIDB4RkUsIDB4MkQsIDB4MDAsCisJIDB4QzksIDB4RkUsIDB4MkIsIDB4MDAsIDB4Q0EsIDB4RkUsIDB4MjksIDB4MDAsIDB4Q0IsIDB4RkUsIDB4MjcsIDB4MDAsIDB4Q0MsIDB4RkUsIDB4MjUsIDB4MDAsCisJIDB4Q0QsIDB4RkUsIDB4MjMsIDB4MDAsIDB4Q0UsIDB4RkUsIDB4MjEsIDB4MDAsIDB4Q0YsIDB4RkUsIDB4MUYsIDB4MDAsIDB4RDAsIDB4RkUsIDB4MUQsIDB4MDAsCisJIDB4RDEsIDB4RkUsIDB4MUIsIDB4MDAsIDB4RDIsIDB4RkUsIDB4MTksIDB4MDAsIDB4RDMsIDB4RkUsIDB4MTcsIDB4MDAsIDB4RDQsIDB4RkUsIDB4MTUsIDB4MDAsCisJIDB4RDUsIDB4RkUsIDB4MTMsIDB4MDAsIDB4RDYsIDB4RkUsIDB4MTEsIDB4MDAsIDB4RDcsIDB4RkUsIDB4MEYsIDB4MDAsIDB4RDgsIDB4RkUsIDB4MEQsIDB4MDAsCisJIDB4RDksIDB4RkUsIDB4MEIsIDB4MDAsIDB4REEsIDB4RkUsIDB4MDksIDB4MDAsIDB4REIsIDB4RkUsIDB4MDcsIDB4MDAsIDB4REMsIDB4RkUsIDB4MDUsIDB4MDAsCisJIDB4REQsIDB4RkUsIDB4MDMsIDB4MDAsIDB4REUsIDB4RkUsIDB4MDEsIDB4MDAsIDB4REYsIDB4RkUsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjQsIDB4OUYsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OUUsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OUQsIDB4RkUsCisJIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OUMsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OUIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4OUEsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTksIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTgsIDB4RkUsIDB4RjAsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4OTcsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTYsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTUsIDB4RkUsCisJIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTQsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTMsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4OTIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTEsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTAsIDB4RkUsIDB4RjAsIDB4ODQsCisJIDB4MDYsIDB4RkIsIDB4OEYsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OEUsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OEQsIDB4RkUsCisJIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OEMsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OEIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4OEEsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODksIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODgsIDB4RkUsIDB4RjAsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4ODcsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODYsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODUsIDB4RkUsCisJIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODQsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODMsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4ODIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODEsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODAsIDB4RkUsIDB4RjAsIDB4ODQsCisJIDB4MDUsIDB4RkIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NUMsIDB4NUMsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjQsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NTUsIDB4MDAsIDB4MDUsIDB4NjAsIDB4MDAsIDB4NjMsIDB4MDUsIDB4RkQsIDB4MzAsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MzEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzQsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MzUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzcsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzgsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MzksIDB4NDQsIDB4QkQsIDB4REIsIDB4M0EsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0IsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0MsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4M0QsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0UsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0YsIDB4NDQsIDB4QkQsIDB4REIsIDB4MDIsIDB4NjEsIDB4NjEsIDB4NDQsCisJIDB4MDIsIDB4MzYsIDB4ODIsIDB4RkYsIDB4MDMsIDB4MzYsIDB4ODMsIDB4RkYsIDB4MDQsIDB4MzYsIDB4ODQsIDB4RkYsIDB4MDUsIDB4MzYsIDB4ODUsIDB4RkYsCisJIDB4MDYsIDB4MzYsIDB4ODYsIDB4RkYsIDB4MDcsIDB4MzYsIDB4ODcsIDB4RkYsIDB4MjAsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjEsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MjIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjUsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MjYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjcsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjgsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjksIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MkEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkQsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MkUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkYsIDB4NDQsIDB4QkQsIDB4REIsIDB4REQsIDB4ODEsIDB4MDgsIDB4M0EsIDB4RDAsIDB4MDEsIDB4NTQsIDB4MDAsCisJIDB4MjcsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MzAsIDB4MDAsIDB4MjYsIDB4NDQsIDB4MDEsIDB4MzYsIDB4MkQsIDB4MDAsIDB4MDIsIDB4MzYsIDB4ODIsIDB4RkYsCisJIDB4MDMsIDB4MzYsIDB4ODMsIDB4RkYsIDB4MDQsIDB4MzYsIDB4ODQsIDB4RkYsIDB4MDUsIDB4MzYsIDB4ODUsIDB4RkYsIDB4MDYsIDB4MzYsIDB4ODYsIDB4RkYsCisJIDB4MjUsIDB4NDQsIDB4MDAsIDB4MzYsIDB4NDQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4NDQsIDB4NDEsIDB4MDIsIDB4MzYsIDB4NDQsIDB4NDIsIDB4MDMsIDB4MzYsCisJIDB4NDQsIDB4NDMsIDB4MDQsIDB4MzYsIDB4NDQsIDB4NDQsIDB4MDUsIDB4MzYsIDB4NDQsIDB4NDUsIDB4MDYsIDB4MzYsIDB4NDQsIDB4NDYsIDB4MDcsIDB4MzYsCisJIDB4NDQsIDB4NDcsIDB4MDgsIDB4MzYsIDB4NDQsIDB4NDgsIDB4MDksIDB4MzYsIDB4NDQsIDB4NDksIDB4MEEsIDB4MzYsIDB4NDQsIDB4NEEsIDB4MEIsIDB4MzYsCisJIDB4NDQsIDB4NEIsIDB4MEMsIDB4MzYsIDB4NDQsIDB4NEMsIDB4MEQsIDB4MzYsIDB4NDQsIDB4NEQsIDB4MEUsIDB4MzYsIDB4NDQsIDB4NEUsIDB4MEYsIDB4MzYsCisJIDB4NDQsIDB4NEYsIDB4ODcsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MjUsIDB4NDQsIDB4MTAsIDB4MzYsIDB4NDQsIDB4NTAsIDB4MTEsIDB4MzYsIDB4NDQsIDB4NTEsCisJIDB4MTIsIDB4MzYsIDB4NDQsIDB4NTIsIDB4MTMsIDB4MzYsIDB4NDQsIDB4NTMsIDB4MTQsIDB4MzYsIDB4NDQsIDB4NTQsIDB4MTUsIDB4MzYsIDB4NDQsIDB4NTUsCisJIDB4MTYsIDB4MzYsIDB4NDQsIDB4NTYsIDB4MTcsIDB4MzYsIDB4NDQsIDB4NTcsIDB4MTgsIDB4MzYsIDB4NDQsIDB4NTgsIDB4MTksIDB4MzYsIDB4NDQsIDB4NTksCisJIDB4MUEsIDB4MzYsIDB4NDQsIDB4NUEsIDB4MUIsIDB4MzYsIDB4NDQsIDB4NUIsIDB4MUMsIDB4MzYsIDB4NDQsIDB4NUMsIDB4MUQsIDB4MzYsIDB4NDQsIDB4NUQsCisJIDB4MUUsIDB4MzYsIDB4NDQsIDB4NUUsIDB4MUYsIDB4MzYsIDB4NDQsIDB4NUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDYsCisJIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4NjEsIDB4N0YsIDB4NjcsIDB4MEIsIDB4MDIsIDB4MDAsIDB4RjAsCisJIDB4MUIsIDB4NjAsIDB4RTAsIDB4NjIsIDB4MDQsIDB4NjQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDksIDB4MEEsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsCisJIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MTEsIDB4MDIsIDB4MUMsIDB4NjAsIDB4MDQsIDB4NjIsIDB4MUEsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsCisJIDB4NTAsIDB4NjMsIDB4NUEsIDB4REQsIDB4RUQsIDB4NjAsIDB4QjksIDB4NjQsIDB4ODAsIDB4RkIsIDB4MkQsIDB4RkYsIDB4RUIsIDB4NjAsIDB4ODQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjMsIDB4MDUsIDB4RkIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NjAsIDB4QzAsIDB4NjQsCisJIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MEYsIDB4MDIsIDB4MUMsIDB4NjAsIDB4MDQsIDB4NjIsIDB4MUMsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsIDB4NTAsIDB4NjMsIDB4NUEsIDB4REQsIDB4RUQsIDB4NjAsIDB4RDMsIDB4NjQsIDB4ODAsIDB4RkIsIDB4MkQsIDB4RkYsCisJIDB4RUIsIDB4NjAsIDB4ODQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjAsIDB4QzAsIDB4NjQsCisJIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4MDIsIDB4NjEsIDB4MzQsIDB4MDIsIDB4MjUsIDB4NDUsIDB4MjAsIDB4NDQsIDB4ODAsIDB4MkEsIDB4MzUsIDB4MDAsCisJIDB4RjEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4MjksIDB4MDAsIDB4MjEsIDB4NjAsIDB4NzQsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4OUEsIDB4RjMsIDB4MTYsIDB4NjAsIDB4Q0MsIDB4NjEsIDB4QTAsIDB4ODQsIDB4QTEsIDB4REIsIDB4MjUsIDB4NDUsIDB4MUIsIDB4NjAsCisJIDB4NTIsIDB4NjMsIDB4MDEsIDB4NjEsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDEsIDB4RDQsIDB4ODAsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDUsIDB4Q0QsIDB4ODEsCisJIDB4MDIsIDB4MDMsIDB4MTUsIDB4MDMsIDB4RjcsIDB4MDEsIDB4QTIsIDB4RkYsIDB4QTYsIDB4RDMsIDB4NDAsIDB4NEMsIDB4MDAsIDB4QTgsIDB4NjcsIDB4NDMsCisJIDB4MEMsIDB4MDIsIDB4QTIsIDB4REQsIDB4NDIsIDB4NDgsIDB4NjQsIDB4NDEsIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjYsIDB4NDQsIDB4MjgsIDB4REIsIDB4MDIsIDB4MDMsIDB4MkMsIDB4NTgsIDB4QTMsIDB4RkYsIDB4MEMsIDB4NjEsIDB4MDMsIDB4MDAsIDB4MDQsIDB4NjEsCisJIDB4N0YsIDB4NjcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RjEsIDB4NjAsIDB4MDIsIDB4NjQsIDB4RDQsIDB4ODAsCisJIDB4N0YsIDB4NjcsIDB4MDYsIDB4NjMsIDB4RjgsIDB4MDIsIDB4MzEsIDB4NDAsIDB4MjAsIDB4MjYsIDB4RjUsIDB4MDEsIDB4MjEsIDB4NjAsIDB4NzQsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4OUEsIDB4RjMsIDB4MTYsIDB4NjAsIDB4Q0MsIDB4NjEsIDB4QTAsIDB4ODQsIDB4QTEsIDB4REIsIDB4MTYsIDB4NjAsIDB4RDAsIDB4NjEsCisJIDB4MDEsIDB4NjQsIDB4QTEsIDB4REIsIDB4RkYsIDB4RkYsIDB4QzQsIDB4RkUsIDB4RTUsIDB4MDEsIDB4QzYsIDB4RkUsIDB4RTMsIDB4MDEsIDB4N0UsIDB4NjAsCisJIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4MDIsIDB4NjEsIDB4M0YsIDB4MDIsIDB4MjUsIDB4NDUsIDB4RjgsIDB4MkIsIDB4M0IsIDB4MDAsCisJIDB4MkUsIDB4RjUsIDB4NjcsIDB4NDQsIDB4RDQsIDB4ODAsIDB4MTcsIDB4NjAsIDB4NkEsIDB4NjMsIDB4MzksIDB4MDMsIDB4NjQsIDB4NjEsIDB4MjQsIDB4NDQsCisJIDB4MDEsIDB4MjcsIDB4MjksIDB4MDAsIDB4QTMsIDB4RkMsIDB4QTQsIDB4RjgsIDB4QkQsIDB4RDMsIDB4QTMsIDB4RDEsIDB4RDQsIDB4ODAsIDB4Q0QsIDB4ODEsCisJIDB4MDgsIDB4MjQsIDB4NjQsIDB4NTgsIDB4MDgsIDB4QTMsIDB4RjgsIDB4MDIsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QTMsIDB4RDEsCisJIDB4RkUsIDB4QTAsIDB4RkEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MTQsIDB4MDIsIDB4MTMsIDB4MDIsIDB4MDQsIDB4QTMsIDB4QkUsIDB4RDMsCisJIDB4QkQsIDB4RDEsIDB4MEYsIDB4MTgsIDB4RDQsIDB4ODAsIDB4MEQsIDB4MTgsIDB4MDMsIDB4MDMsIDB4QzMsIDB4ODMsIDB4QzMsIDB4ODMsIDB4RjcsIDB4MDEsCisJIDB4NjQsIDB4NDEsIDB4REQsIDB4ODEsIDB4RTEsIDB4ODEsIDB4Q0IsIDB4ODMsIDB4NDYsIDB4NjUsIDB4RjIsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NEEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MEEsIDB4MDAsIDB4QkQsIDB4RDMsIDB4QkUsIDB4RDEsIDB4RDQsIDB4ODAsIDB4Q0QsIDB4ODEsIDB4MDgsIDB4MjQsCisJIDB4NjQsIDB4NTgsIDB4MDgsIDB4QTMsIDB4RjgsIDB4MDIsIDB4MDQsIDB4NjEsIDB4N0YsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjQsCisJIDB4MjMsIDB4RkEsIDB4NjcsIDB4NDQsIDB4MjQsIDB4RkEsIDB4NjIsIDB4NDEsIDB4M0UsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MUEsIDB4NjMsIDB4RUEsIDB4NjAsCisJIDB4ODgsIDB4NjQsIDB4NjUsIDB4NDYsIDB4NTgsIDB4RDAsIDB4MkUsIDB4RjUsIDB4NTksIDB4RDgsIDB4RkIsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4NEIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4RTgsIDB4ODQsIDB4REMsIDB4ODQsIDB4MjMsIDB4RkEsIDB4QkYsIDB4RDEsCisJIDB4NEEsIDB4NjUsIDB4NjQsIDB4NDMsIDB4RjIsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NEEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RTAsIDB4QTAsIDB4MjAsIDB4NjQsIDB4MDEsIDB4MDYsIDB4MjUsIDB4RkEsIDB4MjMsIDB4RjIsCisJIDB4REYsIDB4RDEsIDB4Q0MsIDB4ODQsIDB4RTAsIDB4ODUsIDB4MEIsIDB4MDYsIDB4QkYsIDB4RDEsIDB4NjQsIDB4NDEsIDB4RDUsIDB4ODAsIDB4NjQsIDB4NDMsCisJIDB4MDEsIDB4MDYsIDB4NjUsIDB4NDEsIDB4NEEsIDB4NjUsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4ODcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QkMsIDB4RjMsIDB4MDIsIDB4NjMsIDB4MjMsIDB4RkMsIDB4MDcsIDB4QjQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NEIsIDB4RDMsIDB4QkYsIDB4RDMsIDB4NjAsIDB4NDEsIDB4QzksIDB4ODMsIDB4RTksIDB4ODEsIDB4REQsIDB4ODEsCisJIDB4QTMsIDB4RkEsIDB4RTAsIDB4ODEsIDB4M0MsIDB4NjAsIDB4MDAsIDB4NjcsIDB4MDIsIDB4MjQsIDB4MDIsIDB4QTQsIDB4NjAsIDB4NDcsIDB4NDAsIDB4NEIsCisJIDB4QzksIDB4ODEsIDB4NEEsIDB4NjUsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4QTUsIDB4RDgsIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjYsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTMsCisJIDB4QTMsIDB4RDEsIDB4NEMsIDB4NjUsIDB4QTQsIDB4RDMsIDB4REEsIDB4ODMsIDB4NjAsIDB4NDcsIDB4MjUsIDB4RkEsIDB4MDAsIDB4N0UsIDB4NjAsIDB4NDcsCisJIDB4MDEsIDB4MjYsIDB4REMsIDB4ODQsIDB4NjAsIDB4NDEsIDB4RTgsIDB4ODQsIDB4RDgsIDB4ODQsIDB4MjMsIDB4RkEsIDB4QUIsIDB4MDEsIDB4RkMsIDB4QTMsCisJIDB4QTMsIDB4RDEsIDB4NEMsIDB4NjUsIDB4QTQsIDB4RDMsIDB4REEsIDB4ODMsIDB4MDAsIDB4N0YsIDB4MjUsIDB4RkEsIDB4NjAsIDB4NDEsIDB4MDEsIDB4MjYsCisJIDB4REQsIDB4ODEsIDB4RTksIDB4ODQsIDB4RDgsIDB4ODQsIDB4MjMsIDB4RkEsIDB4OUQsIDB4MDEsIDB4MjMsIDB4RjIsIDB4MTIsIDB4NjAsIDB4QjgsIDB4NjUsCisJIDB4NjAsIDB4NDEsIDB4MTIsIDB4NjAsIDB4NTQsIDB4NjMsIDB4QTMsIDB4REIsIDB4RkYsIDB4QTEsIDB4NDgsIDB4NjQsIDB4NTgsIDB4RDAsIDB4N0UsIDB4QTgsCisJIDB4NUIsIDB4RDksIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4RkYsIDB4QTEsIDB4RDcsIDB4ODAsIDB4MDIsIDB4MDMsIDB4MDEsIDB4MDMsCisJIDB4RjUsIDB4MDEsIDB4MkUsIDB4RjUsIDB4MDAsIDB4NjAsIDB4MkYsIDB4NjUsIDB4MjUsIDB4RjIsIDB4MDAsIDB4NjMsIDB4Q0MsIDB4ODQsIDB4MDMsIDB4QTMsCisJIDB4RkQsIDB4MDUsIDB4NEEsIDB4NjQsIDB4RDcsIDB4ODAsIDB4MTEsIDB4NjAsIDB4RjAsIDB4NjEsIDB4MkYsIDB4MDUsIDB4QTEsIDB4REQsIDB4RTMsIDB4ODMsCisJIDB4RkUsIDB4QTMsIDB4NTgsIDB4RDAsIDB4N0UsIDB4QTgsIDB4NTksIDB4RDksIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4RjksIDB4MUYsCisJIDB4MDAsIDB4NjMsIDB4NTksIDB4REQsIDB4MkUsIDB4RjUsIDB4MTEsIDB4NjAsIDB4RjAsIDB4NjQsIDB4MjUsIDB4RjAsIDB4QTAsIDB4RDMsIDB4RDMsIDB4ODAsCisJIDB4MDEsIDB4QjAsIDB4MDQsIDB4MDMsIDB4MDEsIDB4QTQsIDB4MDMsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDEsIDB4MDAsIDB4QTIsIDB4REQsIDB4MTEsIDB4NjAsCisJIDB4RjgsIDB4NjMsIDB4MTAsIDB4NjAsIDB4MEEsIDB4NjUsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDEsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODIsIDB4MTAsIDB4NjAsCisJIDB4MkEsIDB4NjUsIDB4MDcsIDB4NjQsIDB4NjQsIDB4NDEsIDB4NUEsIDB4REIsIDB4RDYsIDB4ODAsIDB4Q0QsIDB4ODEsIDB4MDYsIDB4MDMsIDB4RkIsIDB4MDIsCisJIDB4MjUsIDB4RjIsIDB4MDIsIDB4QTMsIDB4Q0MsIDB4ODQsIDB4QTIsIDB4REEsIDB4RUMsIDB4MDIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MTIsIDB4NjAsIDB4NTQsIDB4NjEsIDB4QTEsIDB4RDMsIDB4MjMsIDB4RkEsIDB4RTAsIDB4ODMsIDB4NEEsIDB4NjUsIDB4MDQsIDB4MDIsIDB4MDIsIDB4NjMsCisJIDB4MjMsIDB4RkMsIDB4QTUsIDB4RkMsIDB4MDksIDB4MDAsIDB4REIsIDB4ODMsIDB4NTksIDB4RDEsIDB4QTUsIDB4RDgsIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjgsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTEsIDB4NjAsCisJIDB4RjAsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MDAsIDB4NjEsIDB4MDIsIDB4QTQsIDB4RkUsIDB4QTAsIDB4MjMsIDB4RkEsIDB4MUIsIDB4MDMsIDB4RkEsIDB4QTQsCisJIDB4RkQsIDB4QTQsIDB4MDEsIDB4QTEsIDB4RkQsIDB4MDcsIDB4NjEsIDB4NDMsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RkMsIDB4RTAsIDB4ODMsIDB4MDIsIDB4QTMsCisJIDB4MTEsIDB4NjAsIDB4RjAsIDB4NjEsIDB4MDAsIDB4NjAsIDB4NEEsIDB4NjQsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4N0UsIDB4M0EsIDB4MDIsIDB4MDAsCisJIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4RjksIDB4MUYsIDB4MjUsIDB4RjIsIDB4MjMsIDB4RjIsIDB4MDEsIDB4QjAsIDB4Q0MsIDB4ODQsIDB4MDQsIDB4MDIsCisJIDB4MjMsIDB4RkEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDEsIDB4NEIsCisJIDB4NjUsIDB4NDIsIDB4ODAsIDB4NjQsIDB4RDQsIDB4ODUsIDB4MkIsIDB4NDEsIDB4MDAsIDB4QTEsIDB4NTUsIDB4OEIsIDB4MEQsIDB4MDMsIDB4MDIsIDB4MDQsCisJIDB4NjUsIDB4NDEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4Q0EsIDB4ODQsIDB4NTgsIDB4RDAsIDB4QzksIDB4ODEsIDB4QkQsIDB4RDksCisJIDB4RkMsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RUMsIDB4MDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTMsIDB4QTMsIDB4RDMsCisJIDB4MDIsIDB4N0MsIDB4QTAsIDB4RDMsIDB4MjMsIDB4RjgsIDB4REMsIDB4ODQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4MDEsIDB4NjQsIDB4OUQsIDB4RkUsIDB4MDIsIDB4MjgsIDB4MDIsIDB4NjQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjEsIDB4NjAsIDB4ODAsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MDIsIDB4N0MsIDB4MjMsIDB4RjgsIDB4MDEsIDB4QjQsCisJIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTMsIDB4QTMsIDB4RDEsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4NjQsIDB4NDQsIDB4N0MsIDB4NUYsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDcsIDB4N0MsIDB4NUYsIDB4ODksIDB4RjEsIDB4NjYsIDB4NDEsIDB4QzAsIDB4ODYsCisJIDB4QTUsIDB4RDIsIDB4NjEsIDB4NDYsIDB4MDAsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MEEsIDB4MzcsIDB4MDEsIDB4NjMsIDB4MTQsIDB4MzcsIDB4MDIsIDB4NjMsCisJIDB4MzcsIDB4MzcsIDB4MDYsIDB4NjMsIDB4NkUsIDB4MzcsIDB4MEIsIDB4NjMsIDB4MjUsIDB4RkMsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4ODgsIDB4RkYsIDB4NzUsIDB4NDQsIDB4OEQsIDB4RkYsIDB4RTgsIDB4ODcsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4MDMsIDB4QjQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjAsIDB4MjEsIDB4NjAsIDB4N0MsIDB4NjUsCisJIDB4MjMsIDB4RjIsIDB4QTUsIDB4RDksIDB4MDIsIDB4QTgsIDB4NjQsIDB4NDQsIDB4MDcsIDB4MDIsIDB4MDAsIDB4QkMsIDB4RjIsIDB4QTQsIDB4MDQsIDB4MDMsCisJIDB4MDMsIDB4MDcsIDB4MUYsIDB4NjAsIDB4QUEsIDB4NjIsIDB4QTIsIDB4RDksIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4NjMsCisJIDB4MjAsIDB4NjAsIDB4MEEsIDB4NjEsIDB4NDgsIDB4NjQsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MjUsIDB4RjAsIDB4MjAsIDB4NjQsCisJIDB4RDAsIDB4ODEsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDcsIDB4MjUsIDB4RkEsIDB4MEYsIDB4MDAsIDB4MjAsIDB4NjAsIDB4MEUsIDB4NjMsIDB4QzMsIDB4ODMsCisJIDB4MDEsIDB4MkEsIDB4MDYsIDB4MDAsIDB4Q0YsIDB4ODMsIDB4QTMsIDB4RDMsIDB4Q0QsIDB4ODEsIDB4MDAsIDB4N0YsIDB4QkQsIDB4REIsIDB4MDQsIDB4MDMsCisJIDB4MDAsIDB4NjQsIDB4QzksIDB4ODEsIDB4QkQsIDB4REIsIDB4RkQsIDB4MDIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsCisJIDB4MjUsIDB4RjAsIDB4MDEsIDB4NjAsIDB4NzAsIDB4NjMsIDB4QTMsIDB4RDksIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTMsCisJIDB4QTUsIDB4RjAsIDB4QTMsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NUUsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDEsIDB4NjQsIDB4NDcsIDB4N0MsIDB4NUYsCisJIDB4ODksIDB4RjEsIDB4NjYsIDB4NDMsIDB4QzAsIDB4ODYsIDB4NjUsIDB4NDQsIDB4QTEsIDB4REEsIDB4NjMsIDB4NDYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTMsIDB4QTMsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NUUsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDcsCisJIDB4N0MsIDB4NUYsIDB4ODksIDB4RjEsIDB4NjYsIDB4NDEsIDB4QzAsIDB4ODYsIDB4NjUsIDB4NDQsIDB4QTAsIDB4RDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RkEsCisJIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjAsIDB4MDIsIDB4QTgsCisJIDB4MDAsIDB4NjcsIDB4MDIsIDB4MDIsIDB4MkQsIDB4RjksIDB4MkMsIDB4RjksIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4QTgsIDB4NjEsCisJIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjIsIDB4MDIsIDB4QTgsIDB4MDAsIDB4QTgsIDB4MDksIDB4MDIsIDB4MDcsIDB4MDMsIDB4RDAsIDB4QTAsIDB4MzAsIDB4NjUsCisJIDB4MDMsIDB4MDQsIDB4QTcsIDB4QTAsIDB4NTksIDB4NjUsIDB4MDEsIDB4MDYsIDB4NjUsIDB4NDQsIDB4QTEsIDB4REIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4NjEsIDB4MEEsIDB4MDAsIDB4MjUsIDB4NjAsIDB4MkMsIDB4NjEsIDB4MDEsIDB4NjQsIDB4QTEsIDB4REIsIDB4MDQsIDB4MDAsCisJIDB4MjUsIDB4NjAsIDB4MkMsIDB4NjEsIDB4MDAsIDB4NjQsIDB4QTEsIDB4REIsIDB4MDYsIDB4NjEsIDB4NDEsIDB4NTYsIDB4QzcsIDB4RkUsIDB4RUIsIDB4NjAsCisJIDB4ODQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4NDYsIDB4NDUsIDB4MDIsIDB4RjAsCisJIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjIsIDB4NjYsIDB4NUMsIDB4MjUsIDB4NDYsIDB4NTYsIDB4MDIsCisJIDB4NzAsIDB4MjcsIDB4NTQsIDB4MDAsIDB4MTIsIDB4NjQsIDB4MDMsIDB4RkEsIDB4MDQsIDB4RjgsIDB4MEUsIDB4RjIsIDB4ODcsIDB4RkMsIDB4OEQsIDB4RkMsCisJIDB4OEUsIDB4RkMsIDB4REEsIDB4ODIsIDB4MTYsIDB4NjEsIDB4MDAsIDB4NjMsIDB4QzksIDB4ODEsIDB4NUEsIDB4REMsIDB4RkQsIDB4MDIsIDB4NjAsIDB4NDAsCisJIDB4RjAsIDB4M0IsIDB4MTYsIDB4MDAsIDB4MzIsIDB4NDQsIDB4OEYsIDB4RjMsIDB4MDEsIDB4QjAsIDB4RjYsIDB4QTAsIDB4MDgsIDB4MjQsIDB4MkMsIDB4MDUsCisJIDB4REMsIDB4ODMsIDB4RjAsIDB4NjcsIDB4MEUsIDB4RkEsIDB4MUIsIDB4NjAsIDB4QzQsIDB4NjQsIDB4MkIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4OEYsIDB4RkQsIDB4MkIsIDB4RkYsIDB4RkUsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4NEYsIDB4MDAsCisJIDB4OTAsIDB4RjMsIDB4MEEsIDB4NjUsIDB4RDQsIDB4ODAsIDB4REMsIDB4ODMsIDB4MTcsIDB4MDUsIDB4OTAsIDB4RkQsIDB4OTgsIDB4RkUsIDB4MDQsIDB4MDQsCisJIDB4MDAsIDB4N0YsIDB4MDgsIDB4N0UsIDB4MEUsIDB4RkEsIDB4M0IsIDB4RkYsIDB4MUIsIDB4NjAsIDB4QjgsIDB4NjQsIDB4MkIsIDB4REIsIDB4NjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4MEUsIDB4RjIsIDB4MkIsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjYsIDB4RjcsIDB4RkUsCisJIDB4RkQsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4MzIsIDB4MDAsIDB4OEMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4QTAsIDB4RkYsIDB4RkYsCisJIDB4MEQsIDB4MDQsIDB4MUIsIDB4NjAsIDB4RDAsIDB4NjQsIDB4MkIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkMsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4MjEsIDB4MDAsIDB4NDYsIDB4NDUsIDB4MDAsIDB4NjQsCisJIDB4MkIsIDB4REIsIDB4MjUsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QTIsIDB4RkYsCisJIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjAsIDB4MEEsIDB4MTgsIDB4NzAsIDB4NjcsIDB4QTAsIDB4ODAsIDB4RjAsIDB4NjcsIDB4MDYsIDB4MDMsIDB4QzAsIDB4ODQsCisJIDB4MDEsIDB4RkEsIDB4MjUsIDB4NDYsIDB4MjUsIDB4NDQsIDB4ODAsIDB4RkMsIDB4MDUsIDB4RkEsIDB4QjQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NDgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsIDB4RkYsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsCisJIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUIsIDB4NjAsIDB4QkUsIDB4NjQsIDB4NDAsIDB4NDcsIDB4NTgsIDB4NEYsIDB4MEQsIDB4MDAsIDB4MUIsIDB4NjAsCisJIDB4QjIsIDB4NjQsIDB4NDAsIDB4NDcsIDB4NTgsIDB4NEYsIDB4MTgsIDB4MDAsIDB4MUIsIDB4NjAsIDB4Q0EsIDB4NjQsIDB4NDAsIDB4NDcsIDB4NTgsIDB4NEYsCisJIDB4MDMsIDB4MDAsIDB4RUIsIDB4NjAsIDB4ODQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RDUsIDB4MEUsIDB4RjIsIDB4MEIsIDB4MTgsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MDgsIDB4MDAsIDB4MUIsIDB4NjAsIDB4RTAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjAsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RjIsIDB4MDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RDUsIDB4MEUsIDB4RjIsIDB4MTQsIDB4MTgsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MTEsIDB4MDAsIDB4MDIsIDB4RjAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsIDB4QTIsIDB4RkYsIDB4OTAsIDB4RjMsCisJIDB4MDIsIDB4MDIsIDB4Q0MsIDB4ODQsIDB4OTAsIDB4RkIsIDB4MUIsIDB4NjAsIDB4RTAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjAsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4NzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTksIDB4MDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkIsIDB4NjQsIDB4M0EsIDB4NDIsIDB4NEEsIDB4REIsCisJIDB4QTIsIDB4RkYsIDB4OTMsIDB4RjMsIDB4OEYsIDB4RjMsIDB4Q0MsIDB4ODAsIDB4RkEsIDB4QTAsIDB4MDEsIDB4MTQsIDB4MUUsIDB4MDUsIDB4QjMsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4NEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MTgsIDB4MDMsIDB4RjAsIDB4NjcsIDB4MEUsIDB4RkEsIDB4MUIsIDB4NjAsCisJIDB4RTAsIDB4NjIsIDB4MUIsIDB4NjAsIDB4QzQsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjYsIDB4NjQsIDB4M0EsIDB4NDIsIDB4NEEsIDB4REIsIDB4OTMsIDB4RjMsIDB4OEYsIDB4RjMsIDB4Q0MsIDB4ODMsCisJIDB4REMsIDB4ODQsIDB4MDEsIDB4MTUsIDB4OTMsIDB4RkQsIDB4OEYsIDB4RkIsIDB4RDQsIDB4RkUsIDB4OTIsIDB4RjMsIDB4OTAsIDB4RjMsIDB4MDAsIDB4QTgsCisJIDB4OTEsIDB4RjEsIDB4MDMsIDB4MDIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MjcsIDB4MDUsIDB4QjMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NEUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MjEsIDB4MDMsIDB4MDAsIDB4NjMsIDB4OTIsIDB4RjMsIDB4MEUsIDB4RkMsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4M0EsCisJIDB4OTIsIDB4RkIsIDB4OTgsIDB4RkUsIDB4MDMsIDB4MDQsIDB4MDgsIDB4QkIsIDB4MEUsIDB4RkMsIDB4M0IsIDB4RkYsIDB4MUIsIDB4NjAsIDB4RTAsIDB4NjIsCisJIDB4MUIsIDB4NjAsIDB4QjgsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4RjcsIDB4NjQsIDB4M0EsIDB4NDIsIDB4NEEsIDB4REIsIDB4OTAsIDB4RjMsIDB4MEUsIDB4RjIsIDB4REMsIDB4ODMsIDB4MDgsIDB4QjAsCisJIDB4OTAsIDB4RkQsIDB4MDgsIDB4MjgsIDB4RjcsIDB4RkUsIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsIDB4RUIsIDB4NjAsIDB4ODQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QjksIDB4RkUsIDB4MTMsIDB4RkYsIDB4MjQsIDB4NDAsIDB4ODAsIDB4MkIsIDB4MEIsIDB4MDAsIDB4QTIsIDB4RkYsIDB4MjUsIDB4NDYsIDB4MDksIDB4RjQsCisJIDB4MEUsIDB4RjIsIDB4MDUsIDB4MTgsIDB4MDgsIDB4QkMsIDB4MEUsIDB4RkEsIDB4RkYsIDB4RkYsIDB4RjcsIDB4RkUsIDB4MDEsIDB4MDAsIDB4RDgsIDB4RkUsCisJIDB4QTMsIDB4RkYsIDB4MjUsIDB4NDYsIDB4M0UsIDB4RjIsIDB4MDAsIDB4RjQsIDB4MDgsIDB4RjAsIDB4MjUsIDB4NDYsIDB4MDYsIDB4QjQsIDB4RkYsIDB4N0YsCisJIDB4MTAsIDB4QkMsIDB4MDYsIDB4MjYsIDB4RkQsIDB4N0YsIDB4MEUsIDB4RkEsIDB4M0UsIDB4RjIsIDB4M0YsIDB4RjIsIDB4NjAsIDB4NDEsIDB4MDgsIDB4MkEsCisJIDB4NjQsIDB4NDcsIDB4M0YsIDB4RkEsIDB4NjAsIDB4NDUsIDB4MUYsIDB4NjAsIDB4NjIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4QTMsIDB4RkMsIDB4QUIsIDB4RkMsCisJIDB4OTEsIDB4RkMsIDB4RDQsIDB4ODAsIDB4RTAsIDB4NjAsIDB4QzEsIDB4NjUsIDB4QTUsIDB4ODAsIDB4MDEsIDB4MDQsIDB4MDcsIDB4MDMsIDB4MjMsIDB4RjAsCisJIDB4MDgsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4RjIsIDB4NjAsIDB4MjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RjQsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4MkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDQsIDB4MjMsIDB4RjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4OTgsIDB4RjEsCisJIDB4MUUsIDB4NjAsIDB4RkMsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsCisJIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDIsIDB4MDAsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4NDYsIDB4MDAsIDB4M0UsIDB4RjAsCisJIDB4ODksIDB4RjEsIDB4NjQsIDB4NDcsIDB4MDcsIDB4QjQsIDB4MDcsIDB4MzYsIDB4M0IsIDB4MDAsIDB4MDQsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4QzAsIDB4ODMsIDB4MkQsIDB4MDAsIDB4MkMsIDB4RjIsIDB4ODgsIDB4RjEsIDB4MDEsIDB4QjAsIDB4NjQsIDB4NDMsIDB4MzUsIDB4MDIsIDB4MkUsIDB4RjIsCisJIDB4MTIsIDB4NjAsIDB4Q0UsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsCisJIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MkUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsCisJIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MkQsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsCisJIDB4MkMsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsCisJIDB4RTgsIDB4MUIsIDB4ODgsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MDEsIDB4MDMsIDB4MDksIDB4MDAsIDB4NjYsIDB4NDUsCisJIDB4NjMsIDB4NDYsIDB4MDYsIDB4RjAsIDB4NjUsIDB4NDYsIDB4NjQsIDB4NDQsIDB4MEMsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MjYsIDB4MDQsIDB4MDAsCisJIDB4MjMsIDB4RjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MDcsIDB4RkMsIDB4MjMsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MUIsCisJIDB4MUIsIDB4NjAsIDB4RTAsIDB4NjIsIDB4MUIsIDB4NjAsIDB4OUEsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MEUsIDB4RjIsIDB4QzgsIDB4RkUsIDB4MTAsIDB4QUMsIDB4MEUsIDB4RkEsIDB4MEYsIDB4MDAsCisJIDB4MUIsIDB4NjAsIDB4RTAsIDB4NjIsIDB4MUIsIDB4NjAsIDB4QUMsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MEUsIDB4RjIsIDB4Q0UsIDB4RkUsIDB4MTAsIDB4QUMsIDB4MEUsIDB4RkEsIDB4RUIsIDB4NjAsCisJIDB4ODQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0IsIDB4ODQsIDB4QzksIDB4ODMsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDQsIDB4NTgsIDB4RDEsIDB4QTUsIDB4RDgsCisJIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjgsIDB4MUYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjUsIDB4RjAsIDB4MjEsIDB4NjAsIDB4MkMsIDB4NjIsIDB4QTIsIDB4RDksIDB4MTksIDB4MDAsIDB4MjEsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QTAsIDB4RDEsCisJIDB4N0YsIDB4RjksIDB4MEMsIDB4NjAsIDB4MzgsIDB4NjIsIDB4NDAsIDB4NjMsIDB4MDAsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkUsIDB4MUYsIDB4NjQsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MEMsIDB4MDAsIDB4MDQsIDB4NjUsIDB4MEMsIDB4NjAsIDB4MzgsIDB4NjEsIDB4NDgsIDB4NjQsIDB4M0UsIDB4NjMsIDB4N0MsIDB4QTgsCisJIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4RjksIDB4MUYsIDB4MjEsIDB4NjAsIDB4MkMsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4MEQsIDB4NjAsIDB4MUMsIDB4NjUsIDB4MDIsIDB4RkUsIDB4NjQsIDB4NDQsIDB4RjgsIDB4ODQsIDB4RjgsIDB4ODQsIDB4RjgsIDB4ODcsCisJIDB4NjAsIDB4NDEsIDB4NjQsIDB4NDQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODQsIDB4M0UsIDB4RkIsIDB4NjAsIDB4NDIsIDB4NjEsIDB4NDQsCisJIDB4MDMsIDB4QTIsIDB4NjAsIDB4RkUsIDB4QTIsIDB4REIsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4NjQsIDB4NDQsIDB4MEMsIDB4NjAsIDB4M0EsIDB4NjUsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODQsIDB4NDAsIDB4RkIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsCisJIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjEsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QTAsIDB4RDEsIDB4N0YsIDB4RjksIDB4MDAsIDB4NjQsCisJIDB4NDAsIDB4NDEsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4QTYsIDB4MDAsIDB4NEEsIDB4NjQsIDB4QTAsIDB4RDIsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NDIsCisJIDB4ODAsIDB4MkIsIDB4MDQsIDB4MDAsIDB4RkYsIDB4QjQsIDB4NDAsIDB4NDIsIDB4MDEsIDB4NjQsIDB4NDAsIDB4NDEsIDB4ODgsIDB4RjMsIDB4NDYsIDB4NEIsCisJIDB4ODcsIDB4RjMsIDB4NjAsIDB4NDYsIDB4RTAsIDB4ODMsIDB4QUIsIDB4NDYsIDB4MjYsIDB4RjAsIDB4QUIsIDB4NDYsIDB4NTUsIDB4RjgsIDB4QUIsIDB4NDYsCisJIDB4MjcsIDB4RjAsIDB4QUIsIDB4NDYsIDB4NTYsIDB4RjgsIDB4QUIsIDB4NDYsIDB4MjgsIDB4RjAsIDB4QUIsIDB4NDYsIDB4NTcsIDB4RjgsIDB4NjYsIDB4NDQsCisJIDB4MDIsIDB4QTYsIDB4RjEsIDB4MUYsIDB4ODgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4QUIsIDB4NDYsIDB4MEMsIDB4NjAsIDB4N0EsIDB4NjUsCisJIDB4MjIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODEsIDB4QzksIDB4ODEsCisJIDB4NTIsIDB4NjQsIDB4MEUsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDgsIDB4MDAsCisJIDB4QUIsIDB4NDYsIDB4RjAsIDB4QTEsIDB4NkUsIDB4NjQsIDB4MEUsIDB4NjMsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4RkQsIDB4MUYsIDB4QUIsIDB4NDYsCisJIDB4MjIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MEMsIDB4NjAsIDB4REMsIDB4NjUsIDB4QzQsIDB4ODEsCisJIDB4NjAsIDB4NDUsIDB4QzksIDB4ODEsIDB4NjIsIDB4NjQsIDB4MDYsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MjEsIDB4NDQsCisJIDB4MDEsIDB4MkEsIDB4MDgsIDB4MDAsIDB4QUIsIDB4NDYsIDB4RjgsIDB4QTEsIDB4QUUsIDB4NjQsIDB4MDYsIDB4NjMsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsCisJIDB4RkQsIDB4MUYsIDB4QUIsIDB4NDYsIDB4NjUsIDB4NDQsIDB4MEMsIDB4NjAsIDB4RkMsIDB4NjUsIDB4QzQsIDB4ODEsIDB4QzksIDB4ODEsIDB4NkEsIDB4NjQsCisJIDB4MDYsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MjIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODUsCisJIDB4QzQsIDB4ODQsIDB4MEMsIDB4NjAsIDB4QzIsIDB4NjUsIDB4QzQsIDB4ODEsIDB4NzIsIDB4NjQsIDB4MDQsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksCisJIDB4RkQsIDB4MUYsIDB4QUIsIDB4NDYsIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDYsIDB4MDAsIDB4RkEsIDB4QTEsIDB4ODgsIDB4NjQsIDB4MDQsIDB4NjMsCisJIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4RkQsIDB4MUYsIDB4MzcsIDB4RjAsIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MTMsIDB4MDAsIDB4MjIsIDB4NDQsCisJIDB4M0QsIDB4RkIsIDB4NjAsIDB4NDEsIDB4MDIsIDB4RkUsIDB4RjgsIDB4ODQsIDB4RjgsIDB4ODQsIDB4RjgsIDB4ODQsIDB4M0MsIDB4RkIsIDB4MEMsIDB4NjAsCisJIDB4QkUsIDB4NjMsIDB4ODgsIDB4RkYsIDB4Q0QsIDB4ODEsIDB4MDYsIDB4QTMsIDB4RkQsIDB4MEQsIDB4OEQsIDB4RkYsIDB4M0IsIDB4RkQsIDB4NjQsIDB4NDcsCisJIDB4ODAsIDB4QkYsIDB4NjAsIDB4NUMsIDB4MjIsIDB4NDMsIDB4ODAsIDB4NjEsIDB4ODgsIDB4RkYsIDB4Q0YsIDB4ODMsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MEQsCisJIDB4OEQsIDB4RkYsIDB4NjEsIDB4NDcsIDB4MzEsIDB4OTEsIDB4QjEsIDB4ODQsIDB4MzcsIDB4RkEsIDB4ODcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODMsCisJIDB4RTMsIDB4ODMsIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsIDB4MzcsIDB4RjAsIDB4NjYsIDB4NDQsIDB4QjEsIDB4OUMsIDB4MzcsIDB4RjgsIDB4MDIsIDB4QTYsCisJIDB4RkEsIDB4MUYsIDB4QUIsIDB4NDYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjAsCisJIDB4MDIsIDB4QTgsIDB4MDAsIDB4NjcsIDB4MjQsIDB4MDIsIDB4M0QsIDB4RjEsIDB4NjQsIDB4NDQsIDB4MDMsIDB4QjQsIDB4NDAsIDB4NDIsIDB4RDAsIDB4ODAsCisJIDB4ODgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4QjcsIDB4RjQsIDB4ODAsIDB4NjEsIDB4MDIsIDB4MDIsIDB4RTMsIDB4ODMsIDB4RUIsIDB4ODMsCisJIDB4MjIsIDB4NDQsIDB4ODgsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MEQsIDB4OEQsIDB4RkYsIDB4NjEsIDB4NDcsIDB4MzEsIDB4OTEsCisJIDB4OUQsIDB4ODUsIDB4QTcsIDB4ODMsIDB4MzcsIDB4RkMsIDB4ODcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODMsIDB4RTMsIDB4ODMsIDB4NjYsIDB4NDQsCisJIDB4MDIsIDB4QTYsIDB4QjcsIDB4RjIsIDB4NjYsIDB4NDQsIDB4QTUsIDB4ODEsIDB4QjcsIDB4RkEsIDB4MDIsIDB4QTYsIDB4RkEsIDB4MUYsIDB4MDAsIDB4NjcsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTEsIDB4NjQsIDB4MjMsIDB4RkEsIDB4MjUsIDB4NDQsIDB4MjQsIDB4RkEsIDB4MDQsIDB4NjQsIDB4NDAsIDB4NEIsCisJIDB4NjIsIDB4NDEsIDB4MEMsIDB4NjAsIDB4QzIsIDB4NjQsIDB4MDQsIDB4NjMsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDgsIDB4RkQsIDB4MUYsIDB4MkIsIDB4NDMsCisJIDB4MDAsIDB4N0MsIDB4NTksIDB4RDgsIDB4NEYsIDB4OEIsIDB4MDYsIDB4QTQsIDB4RjYsIDB4MDIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjEsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QTAsIDB4RDEsIDB4N0YsIDB4RjksIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4NEUsIDB4MDAsIDB4MjcsIDB4RjIsCisJIDB4MTIsIDB4NjAsIDB4Q0UsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsCisJIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsCisJIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsCisJIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsCisJIDB4RTgsIDB4MUIsIDB4ODgsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MDEsIDB4MDMsIDB4MkEsIDB4MDAsIDB4NDMsIDB4NEIsCisJIDB4QUIsIDB4NDYsIDB4MzcsIDB4RjIsIDB4ODAsIDB4NjAsIDB4MzAsIDB4N0MsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NEUsIDB4NjEsIDB4NkUsIDB4NjQsCisJIDB4MEUsIDB4NjMsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4ODgsIDB4NjQsIDB4MDQsIDB4NjMsCisJIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4RDksIDB4ODEsIDB4OTgsIDB4NjQsIDB4MDQsIDB4NjMsCisJIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4RDksIDB4ODEsIDB4QUUsIDB4NjQsIDB4MEUsIDB4NjMsCisJIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjcsIDB4MjAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjEsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QTAsIDB4RDEsCisJIDB4N0YsIDB4RjksIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MzEsIDB4MDAsIDB4MjcsIDB4RjIsIDB4MTIsIDB4NjAsIDB4Q0UsIDB4NjUsIDB4NjAsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsCisJIDB4NjEsIDB4NDYsIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjYsIDB4RjAsCisJIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODgsIDB4RjMsIDB4MDgsIDB4RkUsCisJIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MDEsIDB4MDMsIDB4MEQsIDB4MDAsIDB4NDMsIDB4NEIsIDB4QUIsIDB4NDYsIDB4MzcsIDB4RjIsIDB4ODAsIDB4NjAsCisJIDB4MzAsIDB4NjEsIDB4OUQsIDB4ODUsIDB4QTQsIDB4ODQsIDB4QTIsIDB4REEsIDB4QUIsIDB4NDYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjcsIDB4MjAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4M0UsIDB4RjIsIDB4QUMsIDB4RjEsIDB4MDgsIDB4QjAsCisJIDB4MTksIDB4RjgsIDB4NEEsIDB4MDIsIDB4MDcsIDB4MjMsIDB4MkIsIDB4MDAsIDB4NjAsIDB4NDcsIDB4MDcsIDB4QjQsIDB4ODksIDB4RjEsIDB4Q0MsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4NDAsIDB4OEEsIDB4QUEsIDB4NDYsIDB4MDMsIDB4RjIsIDB4MDQsIDB4RjAsIDB4MDUsIDB4RjIsIDB4NjAsIDB4NDMsIDB4QUEsIDB4NDYsCisJIDB4MkMsIDB4RkMsIDB4MkQsIDB4RjgsIDB4MkUsIDB4RkEsIDB4Q0IsIDB4RjEsIDB4MkYsIDB4RjgsIDB4Q0MsIDB4RjEsIDB4MzAsIDB4RjgsIDB4Q0QsIDB4RjEsCisJIDB4MzEsIDB4RjgsIDB4NDYsIDB4NEEsIDB4MDAsIDB4RjQsIDB4MDIsIDB4RjIsIDB4MDMsIDB4RjAsIDB4MDQsIDB4RjIsIDB4NjAsIDB4NDMsIDB4QUEsIDB4NDYsCisJIDB4MzIsIDB4RkMsIDB4MzMsIDB4RjgsIDB4MzQsIDB4RkEsIDB4QUEsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDYsIDB4RjAsIDB4MDcsIDB4RjIsIDB4NjAsIDB4NDMsCisJIDB4QUEsIDB4NDYsIDB4MzYsIDB4RkMsIDB4MzcsIDB4RjgsIDB4MzgsIDB4RkEsIDB4MDMsIDB4NjAsIDB4MDgsIDB4NjQsIDB4MUMsIDB4MDAsIDB4NjcsIDB4RjEsCisJIDB4MkYsIDB4RjgsIDB4NjgsIDB4RjEsIDB4MzAsIDB4RjgsIDB4NjksIDB4RjEsIDB4MzEsIDB4RjgsIDB4NDYsIDB4NEEsIDB4MDAsIDB4RjQsIDB4MDIsIDB4RjIsCisJIDB4MDMsIDB4RjAsIDB4MDQsIDB4RjIsIDB4NjAsIDB4NDMsIDB4QUEsIDB4NDYsIDB4MkMsIDB4RkMsIDB4MkQsIDB4RjgsIDB4MkUsIDB4RkEsIDB4QUEsIDB4NDYsCisJIDB4MDUsIDB4RjIsIDB4MDYsIDB4RjAsIDB4MDcsIDB4RjIsIDB4NjAsIDB4NDMsIDB4QUEsIDB4NDYsIDB4MzIsIDB4RkMsIDB4MzMsIDB4RjgsIDB4MzQsIDB4RkEsCisJIDB4MDIsIDB4NjAsIDB4MDgsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MkEsIDB4RkEsIDB4MDIsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MEYsIDB4QjQsIDB4NTksIDB4MDAsIDB4RkYsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsCisJIDB4MDQsIDB4NjUsIDB4MDQsIDB4NjQsIDB4QTUsIDB4REIsIDB4MTIsIDB4MDAsIDB4MUMsIDB4NjAsIDB4MDQsIDB4NjUsIDB4MEMsIDB4NjQsIDB4QTUsIDB4REIsCisJIDB4MEQsIDB4MDAsIDB4MUMsIDB4NjAsIDB4MDQsIDB4NjUsIDB4MDYsIDB4NjQsIDB4QTUsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MDAsIDB4NjcsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4MDQsIDB4NjUsIDB4MDgsIDB4NjQsIDB4QTUsIDB4REIsIDB4RjQsIDB4NjAsIDB4RDksIDB4NjQsCisJIDB4ODAsIDB4RkIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4RUIsIDB4NjAsIDB4ODQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjksIDB4RjMsIDB4NjUsIDB4RkIsCisJIDB4ODMsIDB4RkIsIDB4MDIsIDB4NjAsIDB4RUUsIDB4NjQsIDB4ODIsIDB4RkIsIDB4MDcsIDB4NjQsIDB4ODQsIDB4RkIsIDB4RjQsIDB4NjAsIDB4RDksIDB4NjQsCisJIDB4ODAsIDB4RkIsIDB4RkYsIDB4RkYsIDB4REYsIDB4RkUsIDB4MDAsIDB4NjQsIDB4MTksIDB4RkYsIDB4RUIsIDB4NjAsIDB4ODQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QUYsIDB4NjAsIDB4RkQsIDB4NjMsIDB4MEMsIDB4NjAsIDB4MTYsIDB4NjQsIDB4QTAsIDB4REQsIDB4NjIsIDB4RkYsIDB4RjQsIDB4NjAsIDB4QzYsIDB4NjMsCisJIDB4ODAsIDB4RkQsIDB4RkYsIDB4RkYsIDB4MUEsIDB4RkYsIDB4RUIsIDB4NjAsIDB4ODQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTcsIDB4NjAsIDB4OUIsIDB4NjMsCisJIDB4MEMsIDB4NjAsIDB4MTYsIDB4NjQsIDB4QTAsIDB4REQsIDB4NjIsIDB4RkYsIDB4MjksIDB4RjUsIDB4MUIsIDB4NjAsIDB4RTAsIDB4NjMsIDB4MUIsIDB4NjAsCisJIDB4QjIsIDB4NjQsIDB4QkQsIDB4REIsIDB4NjYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MDIsIDB4NjQsIDB4QTMsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4RjksIDB4RkUsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTcsIDB4MDEsIDB4MDAsIDB4MzYsIDB4QTgsIDB4MDEsIDB4MDEsIDB4MzYsCisJIDB4QUIsIDB4MDEsIDB4MDIsIDB4MzYsIDB4QUUsIDB4MDEsIDB4MDMsIDB4MzYsIDB4QjUsIDB4MDEsIDB4MDQsIDB4MzYsIDB4RDEsIDB4MDEsIDB4MDUsIDB4MzYsCisJIDB4Q0YsIDB4MDEsIDB4MDYsIDB4MzYsIDB4RjEsIDB4MDEsIDB4MDcsIDB4MzYsIDB4Q0IsIDB4MDEsIDB4MDgsIDB4MzYsIDB4QjcsIDB4MDEsIDB4MDksIDB4MzYsCisJIDB4MEMsIDB4MDAsIDB4MEEsIDB4MzYsIDB4MEQsIDB4MDAsIDB4MEIsIDB4MzYsIDB4MEUsIDB4MDAsIDB4MEMsIDB4MzYsIDB4MTcsIDB4MDAsIDB4MEQsIDB4MzYsCisJIDB4MEQsIDB4MDAsIDB4MEUsIDB4MzYsIDB4MUUsIDB4MDAsIDB4MEYsIDB4MzYsIDB4MzIsIDB4MDAsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4MDAsCisJIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDUsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4MzIsIDB4NDUsIDB4QjQsIDB4ODUsIDB4NDUsIDB4NTIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QjAsIDB4NjAsIDB4QzEsIDB4NjMsCisJIDB4MEMsIDB4NjAsIDB4MTYsIDB4NjQsIDB4QTAsIDB4REQsIDB4NjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MUEsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsIDB4MDUsIDB4MDAsIDB4OTAsIDB4NjAsIDB4MDAsIDB4RTgsIDB4QUYsIDB4NjAsIDB4RkQsIDB4NjMsCisJIDB4MDQsIDB4MDAsIDB4OTEsIDB4NjAsIDB4MDAsIDB4RTgsIDB4QjAsIDB4NjAsIDB4QUIsIDB4NjMsIDB4MjgsIDB4RTgsIDB4MEMsIDB4NjAsIDB4MTYsIDB4NjQsCisJIDB4QTAsIDB4REQsIDB4NjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MUEsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4OTEsIDB4NjAsCisJIDB4MDAsIDB4RTgsIDB4MjgsIDB4RTgsIDB4RDksIDB4NjAsIDB4RkUsIDB4NjQsIDB4MzIsIDB4NDUsIDB4QTQsIDB4ODUsIDB4NDUsIDB4NTIsIDB4OTksIDB4RkYsCisJIDB4QTUsIDB4NEYsIDB4RkYsIDB4QjQsIDB4MDcsIDB4RkIsIDB4OTgsIDB4RkYsIDB4QTcsIDB4NjAsIDB4OUIsIDB4NjMsIDB4MEMsIDB4NjAsIDB4MTYsIDB4NjQsCisJIDB4QTAsIDB4REQsIDB4NjIsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDIsIDB4NkYsIDB4NkYsIDB4NzQsIDB4NjMsIDB4NkYsCisJIDB4NjQsIDB4NjUsIDB4MjAsIDB4MjEsIDB4MjEsIDB4MjAsIDB4MjAsIDB4MDAsIDB4NTMsIDB4NTQsIDB4NDEsIDB4MkYsIDB4NDEsIDB4NTAsIDB4MjAsIDB4NDYsCisJIDB4NzUsIDB4NkUsIDB4NjMsIDB4MjcsIDB4NzMsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDgsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDYsIDB4MDAsCisJIDB4MDcsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4NDAsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MEEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MzIsIDB4MDAsCisJIDB4MzYsIDB4MDAsIDB4MEEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NDAsIDB4MDAsIDB4M0IsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MTcsIDB4MDAsCisJIDB4MDcsIDB4MDAsIDB4MDcsIDB4MDAsIDB4NEEsIDB4MDAsIDB4NDAsIDB4MDAsIDB4NEEsIDB4MDAsIDB4MUUsIDB4MDAsIDB4MEMsIDB4MDAsIDB4MDgsIDB4MDAsCisJIDB4NTcsIDB4MDAsIDB4NEQsIDB4MDAsIDB4NTcsIDB4MDAsIDB4MkIsIDB4MDAsIDB4MTksIDB4MDAsIDB4MDgsIDB4MDAsIDB4NUQsIDB4MDAsIDB4NTMsIDB4MDAsCisJIDB4NUQsIDB4MDAsIDB4MzEsIDB4MDAsIDB4MUYsIDB4MDAsIDB4MDgsIDB4MDAsCisKK307ICAvKiBmd19pbWFnZV80X2RhdGEgKi8KKworc3RhdGljIGNvbnN0IENGR19JREVOVElUWV9TVFJDVCBmd19pbWFnZV9pbmZvaWRlbnRpdHlbXSA9IHsKKwl7CisJCXNpemVvZiggQ0ZHX0lERU5USVRZX1NUUkNUICkgLyBzaXplb2YoaGNmXzE2KSAtIDEsCisJCUNGR19GV19JREVOVElUWSwKKwkJQ09NUF9JRF9GV19BUCwKKwkJMiwJCQkJCQkJLy9WYXJpYW50CisJCTIsCQkJCQkJCS8vTWFqb3IKKwkJMzYJCQkJCQkJLy9NaW5vcgorCX0sCisJeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwIH0JCS8vZW5kc2VudGluZWwKK307CisKK3N0YXRpYyBjb25zdCBDRkdfUFJPR19TVFJDVCBmd19pbWFnZV9jb2RlW10gPSB7CisJeworCQk4LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfVk9MQVRJTEUsCQkJLy8gbW9kZQorCQkweDAxNDYsCQkvLyBzaXplb2YoZndfaW1hZ2VfMV9kYXRhKSwKKwkJMHgwMDAwMDA2MCwJCQkJCS8vIFRhcmdldCBhZGRyZXNzIGluIE5JQyBNZW1vcnkKKwkJMHgwMDAwLAkJCQkJCS8vIENSQzogeWVzL25vCVRZUEU6IHByaW1hcnkvc3RhdGlvbi90ZXJ0aWFyeQorCQkoaGNmXzggRkFSICAgKikgZndfaW1hZ2VfMV9kYXRhCisJfSwKKwl7CisJCTgsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19WT0xBVElMRSwJCQkvLyBtb2RlCisJCTB4MTkxOCwJCS8vIHNpemVvZihmd19pbWFnZV8yX2RhdGEpLAorCQkweDAwMDAwQzE2LAkJCQkJLy8gVGFyZ2V0IGFkZHJlc3MgaW4gTklDIE1lbW9yeQorCQkweDAwMDAsCQkJCQkJLy8gQ1JDOiB5ZXMvbm8JVFlQRTogcHJpbWFyeS9zdGF0aW9uL3RlcnRpYXJ5CisJCShoY2ZfOCBGQVIgICAqKSBmd19pbWFnZV8yX2RhdGEKKwl9LAorCXsKKwkJOCwKKwkJQ0ZHX1BST0csCisJCUNGR19QUk9HX1ZPTEFUSUxFLAkJCS8vIG1vZGUKKwkJMHgwMWJjLAkJLy8gc2l6ZW9mKGZ3X2ltYWdlXzNfZGF0YSksCisJCTB4MDAxRTI1MkUsCQkJCQkvLyBUYXJnZXQgYWRkcmVzcyBpbiBOSUMgTWVtb3J5CisJCTB4MDAwMCwJCQkJCQkvLyBDUkM6IHllcy9ubwlUWVBFOiBwcmltYXJ5L3N0YXRpb24vdGVydGlhcnkKKwkJKGhjZl84IEZBUiAgICopIGZ3X2ltYWdlXzNfZGF0YQorCX0sCisJeworCQk4LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfVk9MQVRJTEUsCQkJLy8gbW9kZQorCQkweGFiMjgsCQkvLyBzaXplb2YoZndfaW1hZ2VfNF9kYXRhKSwKKwkJMHgwMDFGNDAwMCwJCQkJCS8vIFRhcmdldCBhZGRyZXNzIGluIE5JQyBNZW1vcnkKKwkJMHgwMDAwLAkJCQkJCS8vIENSQzogeWVzL25vCVRZUEU6IHByaW1hcnkvc3RhdGlvbi90ZXJ0aWFyeQorCQkoaGNmXzggRkFSICAgKikgZndfaW1hZ2VfNF9kYXRhCisJfSwKKwl7CisJCTUsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19TVE9QLAkJCQkvLyBtb2RlCisJCTAwMDAsCisgCTB4MDAwRjEyOTcsCQkJCQkvLyBTdGFydCBleGVjdXRpb24gYWRkcmVzcworCX0sCisJeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwMDAwMCwgMDAwMCwgMDAwMDAwMDB9Cit9OworCitzdGF0aWMgY29uc3QgQ0ZHX1JBTkdFMjBfU1RSQ1QgZndfaW1hZ2VfaW5mb2NvbXBhdFtdID0geworCXsJMyArICgoMjAgKiBzaXplb2YoQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QpKSAvIHNpemVvZihoY2ZfMTYpKSwKKwkJQ0ZHX0ZXX1NVUF9SQU5HRSwKKwkJQ09NUF9ST0xFX1NVUEwsCisJCUNPTVBfSURfQVBGLAorCQl7CisJCQl7IDIsIDIsIDQgfSAgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJfQorCX0sCisJewkzICsgKCgyMCAqIHNpemVvZihDRkdfUkFOR0VfU1BFQ19TVFJDVCkpIC8gc2l6ZW9mKGhjZl8xNikpLAorCQlDRkdfTUZJX0FDVF9SQU5HRVNfU1RBLAorCQlDT01QX1JPTEVfQUNULAorCQlDT01QX0lEX01GSSwKKwkJeworCQkJeyA0LCA2LCA3IH0sIAkJCQkvL3ZhcmlhbnQsIGJvdHRvbSwgdG9wCisJCQl7IDUsIDYsIDcgfSwgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJCXsgNiwgNiwgNyB9ICAJCQkJLy92YXJpYW50LCBib3R0b20sIHRvcAorCQl9CisJfSwKKwl7CTMgKyAoKDIwICogc2l6ZW9mKENGR19SQU5HRV9TUEVDX1NUUkNUKSkgLyBzaXplb2YoaGNmXzE2KSksCisJCUNGR19DRklfQUNUX1JBTkdFU19TVEEsCisJCUNPTVBfUk9MRV9BQ1QsCisJCUNPTVBfSURfQ0ZJLAorCQl7CisJCQl7IDIsIDEsIDIgfSAgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJfQorCX0sCisJeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCB7IHsgMDAwMCwgMDAwMCwgMDAwMCB9IH0gfQkJCS8vZW5kc2VudGluZWwKK307CisKK21lbWltYWdlIGZ3X2ltYWdlID0geworCSJGVVBVN0QzN2RoZndjaVwwMDFDIiwJCQkvL3NpZ25hdHVyZSwgPGZvcm1hdCBudW1iZXI+LCBDL0JpbiB0eXBlCisJKENGR19QUk9HX1NUUkNUICopIGZ3X2ltYWdlX2NvZGUsCisJMHgwMDBGMTI5NywKKwkwMDAwMDAwMCwJCQkJCS8vKGR1bW15KSBwZGFwbHVnCisJMDAwMDAwMDAsCQkJCQkvLyhkdW1teSkgcHJpcGx1ZworCShDRkdfUkFOR0UyMF9TVFJDVCAqKSBmd19pbWFnZV9pbmZvY29tcGF0LAorCShDRkdfSURFTlRJVFlfU1RSQ1QgKikgZndfaW1hZ2VfaW5mb2lkZW50aXR5LAorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvYXBfaDI1LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9hcF9oMjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDQ5MWNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvYXBfaDI1LmMKQEAgLTAsMCArMSw0MDk0IEBACisvKgorICogRmlsZToJYXBfaDU0LjEyNAorICoKKyAqIEFic3RyYWN0OglUaGlzIGZpbGUgY29udGFpbnMgbWVtb3J5IGltYWdlICdmd19pbWFnZScuCisgKgorICogQ29udGVudHM6CVRvdGFsIHNpemUgb2YgdGhlIG1lbW9yeSBpbWFnZTogNjMxNDYgYnl0ZXMuCisgKgkJVG90YWwgbnVtYmVyIG9mIGJsb2NrczogNCBibG9ja3MuCisgKgkJQmxvY2sgIDEgOiBsb2FkIGFkZHJlc3MgMDAwMDAwNjAsIDMyOCBieXRlcy4KKyAqCQlCbG9jayAgMiA6IGxvYWQgYWRkcmVzcyAwMDAwMEMxNiwgOTI2NiBieXRlcy4KKyAqCQlCbG9jayAgMyA6IGxvYWQgYWRkcmVzcyAwMDFFMzA0OCwgNjQ3NiBieXRlcy4KKyAqCQlCbG9jayAgNCA6IGxvYWQgYWRkcmVzcyAwMDFGNDAwMCwgNDcwNzYgYnl0ZXMuCisgKgorICogSWRlbnRpdHk6CWNvbXBvbmVudCBpZDogMzIgKHZhcmlhbnQgMykgdmVyc2lvbiAxLjI0CisgKgorICogQ29tcGF0aWJpbGl0eToKKyAqCQlzdXBwbHlpbmcgaW50ZXJmYWNlIDggKHZhcmlhbnQgNCkgOiAxIC0gMQorICoJCWFjdGluZyBvbiBpbnRlcmZhY2UgMSAodmFyaWFudCA3KSA6IDMgLSAzCisgKgkJYWN0aW5nIG9uIGludGVyZmFjZSAxICh2YXJpYW50IDgpIDogMSAtIDEKKyAqCQlhY3Rpbmcgb24gaW50ZXJmYWNlIDIgKHZhcmlhbnQgNCkgOiAxIC0gMgorICoKKyAqIEdlbmVyYXRlZDoJYnkgZzpcZndcZnVwdTMuZXhlIHZlcnNpb24gNC4yNgorICoKKyAqIENvbW1hbmRsaW5lOglnOlxmd1xmdXB1My5leGUgL2Y9NCAvbj1md19pbWFnZSAvaT10MzAxMjQwMC5oZXgKKyAqLworCisKKyNpbmNsdWRlICJoY2ZjZmcuaCIJCQkJLy8gdG8gZ2V0IGhjZl8xNiBldGMgZGVmaW5lZCBhcyB3ZWxsIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlIHNldHRpbmdzIHdoaWNoIGlubHVlbmNlIG1kZC5oIG9yIGRoZi5oCisjaW5jbHVkZSAibWRkLmgiICAgCQkJCS8vdG8gZ2V0IENPTVBfSURfU1RBIGV0YyBkZWZpbmVkCisjaW5jbHVkZSAiZGhmLmgiICAgCQkJCS8vdXNlZCB0byBiZSAiZmhmbWVtLmgiLCB0byBnZXQgbWVtYmxvY2sscGx1Z3JlY29yZCwKKworc3RhdGljIGNvbnN0IGhjZl84IGZ3X2ltYWdlXzFfZGF0YVtdID0geworCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERDLCAweDBDLCAweDAwLCAweDAwLAorCSAweDAyLCAweDBELCAweDAwLCAweDAwLCAweDAyLCAweDBELCAweEQ2LCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDFCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLAorCSAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM4LCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweDA5LCAweDAwLAorCSAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLAorCSAweDAwLCAweDAwLCAweEZGLCAweDA3LCAweDAyLCAweDAwLCAweDY0LCAweDAwLCAweDY0LCAweDAwLCAweDEwLCAweDI3LCAweDEwLCAweDI3LCAweDE0LCAweDAwLAorCSAweEQwLCAweDA3LCAweEQwLCAweDA3LCAweDEwLCAweDI3LCAweDJGLCAweDAwLCAweDMyLCAweDAwLCAweDMyLCAweDAwLCAweDA1LCAweDAwLCAweDAyLCAweDAwLAorCSAweDAyLCAweDAwLCAweDEwLCAweDI3LCAweDA1LCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDEzLCAweDAwLCAweDA3LCAweDAwLCAweDAzLCAweDAwLAorCSAweDMyLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDA5LCAweDJCLCAweDA5LCAweDJCLCAweDA5LCAweEZGLCAweDBGLAorCSAweEYwLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAxLCAweDAwLCAweDQwLCAweDAwLCAweDMyLCAweDAwLCAweDMyLCAweDAwLAorCSAweDBBLCAweDAwLCAweDAyLCAweDAwLCAweDA2LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCit9OyAgLyogZndfaW1hZ2VfMV9kYXRhICovCisKK3N0YXRpYyBjb25zdCBoY2ZfOCBmd19pbWFnZV8yX2RhdGFbXSA9IHsKKwkgMHg3QywgMHhBNCwgMHgwMCwgMHgxNiwgMHgwOCwgMHg0MCwgMHgwRiwgMHhEMiwgMHhFMSwgMHgyOCwgMHhBNSwgMHg3QywgMHg1MCwgMHgzMCwgMHhGMSwgMHg4NCwKKwkgMHg0NCwgMHgwOCwgMHhBQiwgMHhBRSwgMHhBNSwgMHhCOCwgMHhGQywgMHhCQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywKKwkgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNSwgMHhDNiwgMHg4NCwgMHhGOCwKKwkgMHg5OSwgMHhFRSwgMHg4RCwgMHhGNiwgMHgwRCwgMHhGRiwgMHhCRCwgMHhENiwgMHhCMSwgMHhERSwgMHg1NCwgMHg5MSwgMHg1MCwgMHg2MCwgMHgwMywgMHgwMiwKKwkgMHhBOSwgMHhDRSwgMHg3RCwgMHg1NiwgMHgxOSwgMHhFNywgMHg2MiwgMHhCNSwgMHhFNiwgMHg0RCwgMHg5QSwgMHhFQywgMHg0NSwgMHg4RiwgMHg5RCwgMHgxRiwKKwkgMHg0MCwgMHg4OSwgMHg4NywgMHhGQSwgMHgxNSwgMHhFRiwgMHhFQiwgMHhCMiwgMHhDOSwgMHg4RSwgMHgwQiwgMHhGQiwgMHhFQywgMHg0MSwgMHg2NywgMHhCMywKKwkgMHhGRCwgMHg1RiwgMHhFQSwgMHg0NSwgMHhCRiwgMHgyMywgMHhGNywgMHg1MywgMHg5NiwgMHhFNCwgMHg1QiwgMHg5QiwgMHhDMiwgMHg3NSwgMHgxQywgMHhFMSwKKwkgMHhBRSwgMHgzRCwgMHg2QSwgMHg0QywgMHg1QSwgMHg2QywgMHg0MSwgMHg3RSwgMHgwMiwgMHhGNSwgMHg0RiwgMHg4MywgMHg1QywgMHg2OCwgMHhGNCwgMHg1MSwKKwkgMHgzNCwgMHhEMSwgMHgwOCwgMHhGOSwgMHg5MywgMHhFMiwgMHg3MywgMHhBQiwgMHg1MywgMHg2MiwgMHgzRiwgMHgyQSwgMHgwQywgMHgwOCwgMHg1MiwgMHg5NSwKKwkgMHg2NSwgMHg0NiwgMHg1RSwgMHg5RCwgMHgyOCwgMHgzMCwgMHhBMSwgMHgzNywgMHgwRiwgMHgwQSwgMHhCNSwgMHgyRiwgMHgwOSwgMHgwRSwgMHgzNiwgMHgyNCwKKwkgMHg5QiwgMHgxQiwgMHgzRCwgMHhERiwgMHgyNiwgMHhDRCwgMHg2OSwgMHg0RSwgMHhDRCwgMHg3RiwgMHg5RiwgMHhFQSwgMHgxQiwgMHgxMiwgMHg5RSwgMHgxRCwKKwkgMHg3NCwgMHg1OCwgMHgyRSwgMHgzNCwgMHgyRCwgMHgzNiwgMHhCMiwgMHhEQywgMHhFRSwgMHhCNCwgMHhGQiwgMHg1QiwgMHhGNiwgMHhBNCwgMHg0RCwgMHg3NiwKKwkgMHg2MSwgMHhCNywgMHhDRSwgMHg3RCwgMHg3QiwgMHg1MiwgMHgzRSwgMHhERCwgMHg3MSwgMHg1RSwgMHg5NywgMHgxMywgMHhGNSwgMHhBNiwgMHg2OCwgMHhCOSwKKwkgMHgwMCwgMHgwMCwgMHgyQywgMHhDMSwgMHg2MCwgMHg0MCwgMHgxRiwgMHhFMywgMHhDOCwgMHg3OSwgMHhFRCwgMHhCNiwgMHhCRSwgMHhENCwgMHg0NiwgMHg4RCwKKwkgMHhEOSwgMHg2NywgMHg0QiwgMHg3MiwgMHhERSwgMHg5NCwgMHhENCwgMHg5OCwgMHhFOCwgMHhCMCwgMHg0QSwgMHg4NSwgMHg2QiwgMHhCQiwgMHgyQSwgMHhDNSwKKwkgMHhFNSwgMHg0RiwgMHgxNiwgMHhFRCwgMHhDNSwgMHg4NiwgMHhENywgMHg5QSwgMHg1NSwgMHg2NiwgMHg5NCwgMHgxMSwgMHhDRiwgMHg4QSwgMHgxMCwgMHhFOSwKKwkgMHgwNiwgMHgwNCwgMHg4MSwgMHhGRSwgMHhGMCwgMHhBMCwgMHg0NCwgMHg3OCwgMHhCQSwgMHgyNSwgMHhFMywgMHg0QiwgMHhGMywgMHhBMiwgMHhGRSwgMHg1RCwKKwkgMHhDMCwgMHg4MCwgMHg4QSwgMHgwNSwgMHhBRCwgMHgzRiwgMHhCQywgMHgyMSwgMHg0OCwgMHg3MCwgMHgwNCwgMHhGMSwgMHhERiwgMHg2MywgMHhDMSwgMHg3NywKKwkgMHg3NSwgMHhBRiwgMHg2MywgMHg0MiwgMHgzMCwgMHgyMCwgMHgxQSwgMHhFNSwgMHgwRSwgMHhGRCwgMHg2RCwgMHhCRiwgMHg0QywgMHg4MSwgMHgxNCwgMHgxOCwKKwkgMHgzNSwgMHgyNiwgMHgyRiwgMHhDMywgMHhFMSwgMHhCRSwgMHhBMiwgMHgzNSwgMHhDQywgMHg4OCwgMHgzOSwgMHgyRSwgMHg1NywgMHg5MywgMHhGMiwgMHg1NSwKKwkgMHg4MiwgMHhGQywgMHg0NywgMHg3QSwgMHhBQywgMHhDOCwgMHhFNywgMHhCQSwgMHgyQiwgMHgzMiwgMHg5NSwgMHhFNiwgMHhBMCwgMHhDMCwgMHg5OCwgMHgxOSwKKwkgMHhEMSwgMHg5RSwgMHg3RiwgMHhBMywgMHg2NiwgMHg0NCwgMHg3RSwgMHg1NCwgMHhBQiwgMHgzQiwgMHg4MywgMHgwQiwgMHhDQSwgMHg4QywgMHgyOSwgMHhDNywKKwkgMHhEMywgMHg2QiwgMHgzQywgMHgyOCwgMHg3OSwgMHhBNywgMHhFMiwgMHhCQywgMHgxRCwgMHgxNiwgMHg3NiwgMHhBRCwgMHgzQiwgMHhEQiwgMHg1NiwgMHg2NCwKKwkgMHg0RSwgMHg3NCwgMHgxRSwgMHgxNCwgMHhEQiwgMHg5MiwgMHgwQSwgMHgwQywgMHg2QywgMHg0OCwgMHhFNCwgMHhCOCwgMHg1RCwgMHg5RiwgMHg2RSwgMHhCRCwKKwkgMHhFRiwgMHg0MywgMHhBNiwgMHhDNCwgMHhBOCwgMHgzOSwgMHhBNCwgMHgzMSwgMHgzNywgMHhEMywgMHg4QiwgMHhGMiwgMHgzMiwgMHhENSwgMHg0MywgMHg4QiwKKwkgMHg1OSwgMHg2RSwgMHhCNywgMHhEQSwgMHg4QywgMHgwMSwgMHg2NCwgMHhCMSwgMHhEMiwgMHg5QywgMHhFMCwgMHg0OSwgMHhCNCwgMHhEOCwgMHhGQSwgMHhBQywKKwkgMHgwNywgMHhGMywgMHgyNSwgMHhDRiwgMHhBRiwgMHhDQSwgMHg4RSwgMHhGNCwgMHhFOSwgMHg0NywgMHgxOCwgMHgxMCwgMHhENSwgMHg2RiwgMHg4OCwgMHhGMCwKKwkgMHg2RiwgMHg0QSwgMHg3MiwgMHg1QywgMHgyNCwgMHgzOCwgMHhGMSwgMHg1NywgMHhDNywgMHg3MywgMHg1MSwgMHg5NywgMHgyMywgMHhDQiwgMHg3QywgMHhBMSwKKwkgMHg5QywgMHhFOCwgMHgyMSwgMHgzRSwgMHhERCwgMHg5NiwgMHhEQywgMHg2MSwgMHg4NiwgMHgwRCwgMHg4NSwgMHgwRiwgMHg5MCwgMHhFMCwgMHg0MiwgMHg3QywKKwkgMHhDNCwgMHg3MSwgMHhBQSwgMHhDQywgMHhEOCwgMHg5MCwgMHgwNSwgMHgwNiwgMHgwMSwgMHhGNywgMHgxMiwgMHgxQywgMHhBMywgMHhDMiwgMHg1RiwgMHg2QSwKKwkgMHhGOSwgMHhBRSwgMHhEMCwgMHg2OSwgMHg5MSwgMHgxNywgMHg1OCwgMHg5OSwgMHgyNywgMHgzQSwgMHhCOSwgMHgyNywgMHgzOCwgMHhEOSwgMHgxMywgMHhFQiwKKwkgMHhCMywgMHgyQiwgMHgzMywgMHgyMiwgMHhCQiwgMHhEMiwgMHg3MCwgMHhBOSwgMHg4OSwgMHgwNywgMHhBNywgMHgzMywgMHhCNiwgMHgyRCwgMHgyMiwgMHgzQywKKwkgMHg5MiwgMHgxNSwgMHgyMCwgMHhDOSwgMHg0OSwgMHg4NywgMHhGRiwgMHhBQSwgMHg3OCwgMHg1MCwgMHg3QSwgMHhBNSwgMHg4RiwgMHgwMywgMHhGOCwgMHg1OSwKKwkgMHg4MCwgMHgwOSwgMHgxNywgMHgxQSwgMHhEQSwgMHg2NSwgMHgzMSwgMHhENywgMHhDNiwgMHg4NCwgMHhCOCwgMHhEMCwgMHhDMywgMHg4MiwgMHhCMCwgMHgyOSwKKwkgMHg3NywgMHg1QSwgMHgxMSwgMHgxRSwgMHhDQiwgMHg3QiwgMHhGQywgMHhBOCwgMHhENiwgMHg2RCwgMHgzQSwgMHgyQywgMHgwMCwgMHgzMCwgMHgwMCwgMHgzMSwKKwkgMHgwMCwgMHgzMywgMHgwMCwgMHgzNCwgMHgwMCwgMHgzNSwgMHgwMCwgMHgzNiwgMHgwMCwgMHgzNywgMHgwMCwgMHgzOCwgMHgwMCwgMHgzOCwgMHgwMCwgMHgzQSwKKwkgMHgwMCwgMHgzQiwgMHgwMCwgMHgzQywgMHgwMCwgMHgzRCwgMHgwMCwgMHgzRSwgMHgwMCwgMHgzRiwgMHgwMCwgMHgzRiwgMHg1OSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1OSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQywgMHgyMSwgMHgxMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHgyMCwgMHgwMywgMHhFMCwgMHgwMSwgMHg0MCwgMHgwMSwgMHgyMCwgMHgwMywgMHhFMCwgMHgwMSwKKwkgMHg0MCwgMHgwMSwgMHgxOCwgMHgwOCwgMHhGMCwgMHgzRiwgMHhGQywgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwQSwgMHgwMiwgMHgxNCwgMHgwNSwgMHgzMiwgMHgwQiwgMHgzNywKKwkgMHgwOCwgMHg1MCwgMHgwQiwgMHg2RSwgMHgwMiwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwQiwgMHgwMCwgMHgxNiwgMHgwMCwgMHgwQywgMHgwMCwgMHgxMiwgMHgwMCwKKwkgMHgxOCwgMHgwMCwgMHgyNCwgMHgwMCwgMHgzMCwgMHgwMCwgMHg0OCwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzOSwgMHgwMCwgMHgzOSwgMHgwMCwgMHgyMCwgMHgwMCwgMHgzOSwgMHgwMCwKKwkgMHgzOSwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOSwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHhBNCwgMHgxMCwgMHhGMiwgMHgxMCwgMHhBQSwgMHgxMCwgMHhFQywgMHgxMCwgMHhCMCwgMHgxMCwgMHhFNiwgMHgxMCwgMHhCNiwgMHgxMCwKKwkgMHhFMCwgMHgxMCwgMHhCQywgMHgxMCwgMHhEQSwgMHgxMCwgMHhDMiwgMHgxMCwgMHhENCwgMHgxMCwgMHhDOCwgMHgxMCwgMHhDRSwgMHgxMCwgMHgwNywgMHgwMSwKKwkgMHgwMCwgMHgwMCwgMHgxNiwgMHgyMiwgMHgwMCwgMHgwNCwgMHgwOCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNiwgMHgyNiwgMHgwMCwgMHgwNCwgMHgwOSwgMHgwMSwKKwkgMHgwMCwgMHgwMCwgMHgxNiwgMHgyQSwgMHgwMCwgMHgwNCwgMHgwQSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNiwgMHgyRSwgMHgwMCwgMHgwNCwgMHgwQiwgMHgwMSwKKwkgMHgwMCwgMHgwMCwgMHgxMCwgMHgyNCwgMHgwNCwgMHgwNCwgMHgwQywgMHgwMSwgMHgwMCwgMHgwMCwgMHgxMCwgMHgyOCwgMHgwNCwgMHgwNCwgMHgwRCwgMHgwMSwKKwkgMHgwMCwgMHgwMCwgMHgxMCwgMHgyQywgMHgwNCwgMHgwNCwgMHgwRSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxMCwgMHgzMCwgMHgwNCwgMHgwNCwgMHgwRiwgMHgwMSwKKwkgMHgwMCwgMHgwMCwgMHgxNCwgMHgzNCwgMHgwOCwgMHg4NCwgMHgxMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNCwgMHgzOCwgMHgwOCwgMHg4NCwgMHgxMSwgMHgwMSwKKwkgMHgwMCwgMHgwMCwgMHgxNCwgMHgzQywgMHgwOCwgMHg4NCwgMHgxMiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNCwgMHg0MCwgMHgwOCwgMHg4NCwgMHgxMywgMHgwMSwKKwkgMHgwMCwgMHgwMCwgMHgxNywgMHg2NCwgMHgwQywgMHg4QiwgMHgxNCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNywgMHg2OCwgMHgwQywgMHg4QiwgMHgxNSwgMHgwMSwKKwkgMHgwMCwgMHgwMCwgMHgxNywgMHg2QywgMHgwQywgMHg4QiwgMHgxNiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNywgMHg3MCwgMHgwQywgMHg4QiwgMHgxNywgMHgwMSwKKwkgMHgwMCwgMHgwMCwgMHgxNywgMHg3NCwgMHgwQywgMHg4QiwgMHgxOCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNywgMHg3OCwgMHgwQywgMHg4QiwgMHgxOSwgMHgwMSwKKwkgMHgwMCwgMHgwMCwgMHgxNywgMHg3QywgMHgwQywgMHg4QiwgMHgxQSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNywgMHg4MCwgMHgwQywgMHg4QiwgMHgxQiwgMHgwMSwKKwkgMHgwMCwgMHgwMCwgMHgxNywgMHg4NCwgMHgwQywgMHg4QiwgMHgxQywgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNywgMHg4OCwgMHgwQywgMHg4QiwgMHgxRCwgMHgwMSwKKwkgMHgwMCwgMHgwMCwgMHgxNywgMHg4QywgMHgwQywgMHg4QiwgMHgxRSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwRSwgMHg5NSwgMHgxNywgMHgwNCwgMHgxRiwgMHgwMSwKKwkgMHgwMCwgMHgwMCwgMHgwRSwgMHg5OSwgMHgxNywgMHgwNCwgMHgyMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwRSwgMHg5RCwgMHgxNywgMHgwNCwgMHgyMSwgMHgwMSwKKwkgMHgwMCwgMHgwMCwgMHgwRSwgMHhBMSwgMHgxNywgMHgwNCwgMHgyMiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwRSwgMHhBNSwgMHgwMCwgMHgwMCwgMHgxNCwgMHgxMSwKKwkgMHgzNCwgMHgxMSwgMHg1NCwgMHgxMSwgMHg3NCwgMHgxMSwgMHhDQywgMHgxMSwgMHgxQywgMHgxMSwgMHgzQywgMHgxMSwgMHg1QywgMHgxMSwgMHg3QywgMHgxMSwKKwkgMHhENCwgMHgxMSwgMHgyNCwgMHgxMSwgMHg0NCwgMHgxMSwgMHg2NCwgMHgxMSwgMHg4NCwgMHgxMSwgMHhEQywgMHgxMSwgMHgyQywgMHgxMSwgMHg0QywgMHgxMSwKKwkgMHg2QywgMHgxMSwgMHg4QywgMHgxMSwgMHhFNCwgMHgxMSwgMHg5NCwgMHgxMSwgMHg5QywgMHgxMSwgMHhBNCwgMHgxMSwgMHhBQywgMHgxMSwgMHhCNCwgMHgxMSwKKwkgMHhCQywgMHgxMSwgMHhDNCwgMHgxMSwgMHhFQywgMHgxMSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwKKwkgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwKKwkgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwKKwkgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgwQSwgMHgwQSwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwKKwkgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgwQSwgMHgwQSwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkgMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHgxNCwKKwkgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwKKwkgMHgxNCwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHgwRSwgMHgwRSwgMHgwRSwgMHgwRSwgMHgwRSwgMHgxNCwgMHgxNCwKKwkgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNiwgMHgxNiwgMHgxNiwgMHgxNiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwKKwkgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHgwQSwgMHgwQSwgMHgwQSwKKwkgMHgwQSwgMHg3RiwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHg3RiwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwKKwkgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgwQSwgMHgwQSwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwKKwkgMHgxNCwgMHgxNCwgMHgxNCwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg5RCwgMHg5RCwgMHhBMSwgMHhBQSwgMHgxMCwgMHgxMCwKKwkgMHg5RCwgMHg5RCwgMHgwOCwgMHgwMiwgMHgwNiwgMHgwMCwgMHhBNSwgMHhBNSwgMHhBQSwgMHhBQSwgMHgxNywgMHgxNywgMHhBMiwgMHhBMiwgMHgxNSwgMHgwNSwKKwkgMHgwNywgMHgwMCwgMHhBQSwgMHhBQSwgMHhCNCwgMHhCNCwgMHgxQywgMHgxQywgMHhBNywgMHhBNywgMHgxQywgMHgwQSwgMHgwOCwgMHgwMCwgMHhCNywgMHhCNywKKwkgMHhDMSwgMHhDMSwgMHgwOSwgMHgwOSwgMHhCNCwgMHhCNCwgMHgyOSwgMHgxNywgMHgwOCwgMHgwMCwgMHhCRCwgMHhCRCwgMHhDNywgMHhDNywgMHgwRiwgMHgwRiwKKwkgMHhCQSwgMHhCQSwgMHgyRiwgMHgxRCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgxNywKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHhFNCwgMHhGMCwgMHhGRCwgMHhGMCwgMHgxRiwgMHhGMSwgMHg2MCwgMHhGNiwgMHg5QiwgMHhGMCwgMHg3OSwgMHhGNiwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwKKwkgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHhDQywgMHhGNywgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwKKwkgMHg5QiwgMHhGMCwgMHgxNSwgMHhGMywgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwKKwkgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwKKwkgMHg5QiwgMHhGMCwgMHg2NiwgMHhGMywgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwKKwkgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwKKwkgMHhFMywgMHhGMiwgMHhGRSwgMHhGMiwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwKKwkgMHhCNCwgMHgxQywgMHg1OSwgMHhGMSwgMHg2QywgMHhGMSwgMHgxQywgMHhGMiwgMHgyMCwgMHhGMiwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMCwgMHhDRiwgMHhGMiwKKwkgMHg2NCwgMHhFNiwgMHgzRSwgMHhFNiwgMHg5MiwgMHhFNiwgMHhFMSwgMHhFNiwgMHhBOSwgMHhFNywgMHhDRiwgMHhFNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgxMiwgMHhGMSwgMHgzNSwgMHhGMSwgMHg1RCwgMHhGNiwgMHg1RCwgMHhGNiwgMHg2RCwgMHhGNiwgMHg4NiwgMHhGNiwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhGQywgMHhDMCwgMHhGMywgMHhGMiwgMHhGNSwgMHg1QSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGOSwgMHhGRiwKKwkgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHhDQSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGNywgMHhGRiwgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHhCMCwgMHgyNiwKKwkgMHgwNiwgMHgwMCwgMHhGMCwgMHhGRiwgMHhDMCwgMHhGMywgMHhBQSwgMHhGMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHhGNiwgMHhGRiwgMHhDMCwgMHhGMywKKwkgMHhENiwgMHhGMywgMHg2QywgMHgwMCwgMHgwMiwgMHgwMCwgMHhGNCwgMHhGRiwgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHg2OCwgMHgwMSwgMHgwMiwgMHgwMCwKKwkgMHhGNSwgMHhGRiwgMHhDMCwgMHhGMywgMHhGQiwgMHhGNSwgMHhBMiwgMHgyNiwgMHgwMiwgMHgwMCwgMHhFRCwgMHhGRiwgMHhDMCwgMHhGMywgMHgwRCwgMHhGNiwKKwkgMHg5RSwgMHgyQiwgMHgwMiwgMHgwMCwgMHhFQywgMHhGRiwgMHhDMCwgMHhGMywgMHgzQiwgMHhGNiwgMHhBMCwgMHgyQiwgMHgwMiwgMHgwMCwgMHhFQiwgMHhGRiwKKwkgMHhDMCwgMHhGMywgMHg0MSwgMHhGNiwgMHhBMiwgMHgyQiwgMHgwMiwgMHgwMCwgMHhFRSwgMHhGRiwgMHhDMCwgMHhGMywgMHg0NywgMHhGNiwgMHhENiwgMHgyQiwKKwkgMHgwMiwgMHgwMCwgMHhEQSwgMHhGRiwgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHhEMCwgMHgxMywgMHgwQywgMHgwMCwgMHhFQSwgMHhGRiwgMHhDMCwgMHhGMywKKwkgMHhBQSwgMHhGMywgMHhFQywgMHgyQiwgMHgwNiwgMHgwMCwgMHhFOSwgMHhGRiwgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHhGMiwgMHgyQiwgMHgwMiwgMHgwMCwKKwkgMHhFOCwgMHhGRiwgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHhGNCwgMHgyQiwgMHgwMiwgMHgwMCwgMHhFNywgMHhGRiwgMHhDMCwgMHhGMywgMHhENiwgMHhGMywKKwkgMHhGNiwgMHgyQiwgMHgwMiwgMHgwMCwgMHhFNiwgMHhGRiwgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHhGOCwgMHgyQiwgMHgwMiwgMHgwMCwgMHhFNSwgMHhGRiwKKwkgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHhGQSwgMHgyQiwgMHgxMCwgMHgwMCwgMHhFNCwgMHhGRiwgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHgwQSwgMHgyQywKKwkgMHgxOCwgMHgwMCwgMHhEQiwgMHhGRiwgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHgyMiwgMHgyQywgMHgwMiwgMHgwMCwgMHhEQywgMHhGRiwgMHhDMCwgMHhGMywKKwkgMHhENiwgMHhGMywgMHgyNCwgMHgyQywgMHgwMiwgMHgwMCwgMHhFMSwgMHhGRiwgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHhDNiwgMHgyQywgMHgwMiwgMHgwMCwKKwkgMHhFMCwgMHhGRiwgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHhDNCwgMHgyQywgMHgwMiwgMHgwMCwgMHhFMywgMHhGRiwgMHhDMCwgMHhGMywgMHhENiwgMHhGMywKKwkgMHhBOCwgMHgyQywgMHgwMiwgMHgwMCwgMHhFMiwgMHhGRiwgMHgwRSwgMHhGNCwgMHhBQSwgMHhGMywgMHg3RSwgMHgyQywgMHgyNCwgMHgwMCwgMHgwMywgMHhGQywKKwkgMHhDMCwgMHhGMywgMHgzQSwgMHhGNSwgMHg5MiwgMHgyQiwgMHgwMiwgMHgwMCwgMHgwNCwgMHhGQywgMHhDMCwgMHhGMywgMHhEMCwgMHhGMywgMHhCQSwgMHgyNiwKKwkgMHgyMiwgMHgwMCwgMHgwNiwgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHhBMCwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwNywgMHhGQywgMHhDMCwgMHhGMywKKwkgMHhENiwgMHhGMywgMHhGRSwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwRSwgMHhGQywgMHhDMCwgMHhGMywgMHg2MywgMHhGNSwgMHgwOCwgMHgyNywgMHgyMiwgMHgwMCwKKwkgMHhCMSwgMHhGQywgMHhDMCwgMHhGMywgMHg4OCwgMHhGOCwgMHgyQSwgMHgyOCwgMHgwMiwgMHgwMCwgMHgyMCwgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywKKwkgMHgyRSwgMHgyNywgMHgwMiwgMHgwMCwgMHgyNSwgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHgzQSwgMHgyNywgMHgwMiwgMHgwMCwgMHgyNiwgMHhGQywKKwkgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHgzQywgMHgyNywgMHgwMiwgMHgwMCwgMHgyNywgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHgzRSwgMHgyNywKKwkgMHgwMiwgMHgwMCwgMHhCMiwgMHhGQywgMHhDMCwgMHhGMywgMHhEMCwgMHhGMywgMHg0RSwgMHgyOCwgMHgyMiwgMHgwMCwgMHhDMSwgMHhGQywgMHhDMCwgMHhGMywKKwkgMHhENiwgMHhGMywgMHg1NiwgMHgyQywgMHgyMCwgMHgwMCwgMHhCMCwgMHhGQywgMHhBMCwgMHhGMywgMHg4QywgMHhGOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHhDNCwgMHhGQywgMHhBMCwgMHhGMywgMHg1NCwgMHhGNiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHhDOCwgMHhGQywgMHhBMCwgMHhGMywgMHg1MiwgMHhGNiwKKwkgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHhCNCwgMHhGQywgMHhBMCwgMHhGMywgMHhDMCwgMHhGOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNiwgMHhGQywKKwkgMHhBMCwgMHhGMywgMHg2QSwgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNywgMHhGQywgMHhBMCwgMHhGMywgMHhBQywgMHhGOSwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHhCOCwgMHhGQywgMHhBMCwgMHhGMywgMHgwMiwgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQywgMHhGQywgMHhBMCwgMHhGMywKKwkgMHgzQiwgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCRCwgMHhGQywgMHhBMCwgMHhGMywgMHhDMywgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHhCRSwgMHhGQywgMHhBMCwgMHhGMywgMHhFRiwgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCRiwgMHhGQywgMHhBMCwgMHhGMywgMHgzQywgMHhGQiwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMywgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHhBMiwgMHgwRiwgMHgxMCwgMHgwMCwgMHhCNSwgMHhGQywKKwkgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHhBNCwgMHgyQywgMHgwMiwgMHgwMCwgMHhCOSwgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHhBNiwgMHgyQywKKwkgMHgwMiwgMHgwMCwgMHg5MCwgMHhGRCwgMHhDMCwgMHhGMywgMHhBQSwgMHhGMywgMHhBQSwgMHgyQywgMHgwMiwgMHgwMCwgMHg4OCwgMHhGQywgMHhDMCwgMHhGMywKKwkgMHhENiwgMHhGMywgMHg3OCwgMHgyQiwgMHgwNCwgMHgwMCwgMHg4OSwgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHg3QywgMHgyQiwgMHgwNCwgMHgwMCwKKwkgMHhDNSwgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHg4MCwgMHgyQiwgMHgwNCwgMHgwMCwgMHgyMywgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywKKwkgMHgzNCwgMHgyNywgMHgwNCwgMHgwMCwgMHgyQSwgMHhGQywgMHhDMCwgMHhGMywgMHgyQywgMHhGNCwgMHhCNiwgMHgyNiwgMHgwMiwgMHgwMCwgMHhDNywgMHhGRCwKKwkgMHhDMCwgMHhGMywgMHhBQSwgMHhGMywgMHhBNiwgMHgyQiwgMHgwQSwgMHgwMCwgMHgyOSwgMHhGQywgMHg3RiwgMHhGNCwgMHg0MywgMHhGNCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHhDMiwgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHg4NiwgMHgyQiwgMHgwOCwgMHgwMCwgMHgzMiwgMHhGQywgMHhDMCwgMHhGMywKKwkgMHhENiwgMHhGMywgMHg1QywgMHgwMSwgMHgwMiwgMHgwMCwgMHgzMywgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHg1RSwgMHgwMSwgMHgwMiwgMHgwMCwKKwkgMHgzNSwgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHg4RSwgMHgyQiwgMHgwMiwgMHgwMCwgMHhDNywgMHhGQywgMHhDMCwgMHhGMywgMHhFQiwgMHhGNSwKKwkgMHg5MCwgMHgyQiwgMHgwMiwgMHgwMCwgMHgxMCwgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHhBOCwgMHgyNiwgMHgwMiwgMHgwMCwgMHgxMSwgMHhGQywKKwkgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHg0NCwgMHgyNywgMHgwNiwgMHgwMCwgMHgxMiwgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHg0QSwgMHgyNywKKwkgMHgwNiwgMHgwMCwgMHgxMywgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHg1MCwgMHgyNywgMHgwNiwgMHgwMCwgMHgxNCwgMHhGQywgMHhDMCwgMHhGMywKKwkgMHhENiwgMHhGMywgMHg1NiwgMHgyNywgMHgwNiwgMHgwMCwgMHgxNSwgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHg1QywgMHgyNywgMHgwNiwgMHgwMCwKKwkgMHgxNiwgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHg2MiwgMHgyNywgMHgwNiwgMHgwMCwgMHgxNywgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywKKwkgMHgyQSwgMHgyNywgMHgwMiwgMHgwMCwgMHg4MywgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHg2QywgMHgwMSwgMHgwMiwgMHgwMCwgMHg5NywgMHhGQywKKwkgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHg2QSwgMHgwMSwgMHgwMiwgMHgwMCwgMHg5OCwgMHhGQywgMHhENywgMHhGNSwgMHhDNSwgMHhGNSwgMHhFQywgMHgwMCwKKwkgMHgwMiwgMHgwMCwgMHg5OSwgMHhGQywgMHhENywgMHhGNSwgMHhDNSwgMHhGNSwgMHhFQywgMHgwMiwgMHgwMiwgMHgwMCwgMHg5QSwgMHhGQywgMHhENywgMHhGNSwKKwkgMHhDNSwgMHhGNSwgMHhFQywgMHgwNCwgMHgwMiwgMHgwMCwgMHg5QiwgMHhGQywgMHhENywgMHhGNSwgMHhDNSwgMHhGNSwgMHhFQywgMHgwNiwgMHgwMiwgMHgwMCwKKwkgMHg5QywgMHhGQywgMHhENywgMHhGNSwgMHhDNSwgMHhGNSwgMHhFQywgMHgwOCwgMHgwMiwgMHgwMCwgMHg5RCwgMHhGQywgMHhENywgMHhGNSwgMHhDNSwgMHhGNSwKKwkgMHhFQywgMHgwQSwgMHgwMiwgMHgwMCwgMHgxOCwgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHgyQywgMHgyNywgMHgwMiwgMHgwMCwgMHgyMiwgMHhGQywKKwkgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHgzMiwgMHgyNywgMHgwMiwgMHgwMCwgMHgyNCwgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHgzOCwgMHgyNywKKwkgMHgwMiwgMHgwMCwgMHhDMCwgMHhGQywgMHhBMCwgMHhGMywgMHg1MCwgMHhGNiwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHg5RSwgMHhGQywgMHhDMCwgMHhGMywKKwkgMHg4MywgMHhGNSwgMHg2RSwgMHgwMSwgMHgwNCwgMHgwMCwgMHg5RiwgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHgzRSwgMHgyQywgMHgwNCwgMHgwMCwKKwkgMHhBMCwgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHg0MiwgMHgyQywgMHgwNCwgMHgwMCwgMHhBMSwgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywKKwkgMHg0NiwgMHgyQywgMHgwNCwgMHgwMCwgMHhBMiwgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHg0QSwgMHgyQywgMHgwNCwgMHgwMCwgMHhBMywgMHhGQywKKwkgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHg0RSwgMHgyQywgMHgwNCwgMHgwMCwgMHhBNCwgMHhGQywgMHhDMCwgMHhGMywgMHhENiwgMHhGMywgMHg1MiwgMHgyQywKKwkgMHgwNCwgMHgwMCwgMHgyMCwgMHhGRCwgMHhGMSwgMHhGMywgMHhBQSwgMHhGMywgMHhENSwgMHhGQiwgMHgwOCwgMHgwMCwgMHgyMSwgMHhGRCwgMHhGMSwgMHhGMywKKwkgMHhBQSwgMHhGMywgMHhEOSwgMHhGQiwgMHgwQSwgMHgwMCwgMHgyMiwgMHhGRCwgMHhGMSwgMHhGMywgMHhBQSwgMHhGMywgMHhERSwgMHhGQiwgMHgxNiwgMHgwMCwKKwkgMHgyMywgMHhGRCwgMHhGMSwgMHhGMywgMHhBQSwgMHhGMywgMHhFOSwgMHhGQiwgMHgwQSwgMHgwMCwgMHg0NSwgMHhGRCwgMHhDMCwgMHhGMywgMHhBQSwgMHhGMywKKwkgMHhDQSwgMHgwMCwgMHgwMiwgMHgwMCwgMHg0NywgMHhGRCwgMHhDMCwgMHhGMywgMHhBQSwgMHhGMywgMHgzNiwgMHgwMSwgMHgwMiwgMHgwMCwgMHg0OCwgMHhGRCwKKwkgMHhENCwgMHhGNCwgMHhBQSwgMHhGMywgMHg1QywgMHgwMSwgMHgwMiwgMHgwMCwgMHg0OSwgMHhGRCwgMHhENCwgMHhGNCwgMHhBQSwgMHhGMywgMHg1RSwgMHgwMSwKKwkgMHgwMiwgMHgwMCwgMHg0QSwgMHhGRCwgMHhDMCwgMHhGMywgMHhBQSwgMHhGMywgMHg1NiwgMHgwMSwgMHgwMiwgMHgwMCwgMHg0QiwgMHhGRCwgMHhDMCwgMHhGMywKKwkgMHhBQSwgMHhGMywgMHg1OCwgMHgwMSwgMHgwMiwgMHgwMCwgMHg0RCwgMHhGRCwgMHhGMSwgMHhGMywgMHhBQSwgMHhGMywgMHhFRSwgMHhGQiwgMHgwOCwgMHgwMCwKKwkgMHg0RiwgMHhGRCwgMHhFOCwgMHhGNCwgMHhBQSwgMHhGMywgMHg5NiwgMHgyQiwgMHgwMiwgMHgwMCwgMHhDMiwgMHhGRCwgMHhERSwgMHhGNCwgMHhBQSwgMHhGMywKKwkgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg0MCwgMHhGRCwgMHhFOSwgMHhGMywgMHhBQSwgMHhGMywgMHg3OCwgMHgwMSwgMHgwMiwgMHgwMCwgMHgyNCwgMHhGRCwKKwkgMHgwMSwgMHhGNSwgMHhBQSwgMHhGMywgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg5MSwgMHhGRCwgMHhDMCwgMHhGMywgMHhBQSwgMHhGMywgMHhDQywgMHgxRSwKKwkgMHgwMiwgMHgwMCwgMHg5MywgMHhGRCwgMHhDMCwgMHhGMywgMHhBQSwgMHhGMywgMHhEMiwgMHgxRSwgMHgwMiwgMHgwMCwgMHg4RiwgMHhGRCwgMHgwRSwgMHhGNSwKKwkgMHhBQSwgMHhGMywgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHhDMSwgMHhGRCwgMHg5MiwgMHhGNiwgMHhBQSwgMHhGMywgMHhDOCwgMHgwMCwgMHgwMiwgMHgwMCwKKwkgMHhDNiwgMHhGRCwgMHhDMCwgMHhGMywgMHhBQSwgMHhGMywgMHgyMCwgMHgzMCwgMHgwNCwgMHgwMCwgMHgyNSwgMHhGRCwgMHhDMCwgMHhGMywgMHhBQSwgMHhGMywKKwkgMHg2MiwgMHgwMSwgMHgwMiwgMHgwMCwgMHg4OSwgMHhGRCwgMHg5NiwgMHhGNCwgMHhBQSwgMHhGMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHhGRCwKKwkgMHgwRSwgMHhGNCwgMHhBQSwgMHhGMywgMHg3RSwgMHgyQywgMHgyNCwgMHgwMCwgMHg0NiwgMHhGRCwgMHhDMCwgMHhGMywgMHhBQSwgMHhGMywgMHg3QSwgMHgwMSwKKwkgMHgwNiwgMHgwMCwgMHg4NiwgMHhGRCwgMHhDMCwgMHhGMywgMHhBQSwgMHhGMywgMHhCMCwgMHgyNiwgMHgwNiwgMHgwMCwgMHg4NywgMHhGRCwgMHhDMCwgMHhGMywKKwkgMHhBQSwgMHhGMywgMHg3NiwgMHgyQywgMHgwNiwgMHgwMCwgMHg4QiwgMHhGRCwgMHg5NiwgMHhGOSwgMHhBQSwgMHhGMywgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwKKwkgMHg4QiwgMHhGRCwgMHg5NiwgMHhGOSwgMHhBQSwgMHhGMywgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwgMHg4RSwgMHhGRCwgMHhDMCwgMHhGMywgMHhBQSwgMHhGMywKKwkgMHhFRSwgMHgxNCwgMHgwMiwgMHgwMCwgMHg4MCwgMHhGRCwgMHhFRiwgMHhGNCwgMHhBQSwgMHhGMywgMHgyMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHg4MSwgMHhGRCwKKwkgMHhFRiwgMHhGNCwgMHhBQSwgMHhGMywgMHgyMiwgMHgwMiwgMHgwMiwgMHgwMCwgMHg4MiwgMHhGRCwgMHhFRiwgMHhGNCwgMHhBQSwgMHhGMywgMHgyMiwgMHgwNCwKKwkgMHgwMiwgMHgwMCwgMHg4MywgMHhGRCwgMHhFRiwgMHhGNCwgMHhBQSwgMHhGMywgMHgyMiwgMHgwNiwgMHgwMiwgMHgwMCwgMHg4NCwgMHhGRCwgMHhFRiwgMHhGNCwKKwkgMHhBQSwgMHhGMywgMHgyMiwgMHgwOCwgMHgwMiwgMHgwMCwgMHg4NSwgMHhGRCwgMHhFRiwgMHhGNCwgMHhBQSwgMHhGMywgMHgyMiwgMHgwQSwgMHgwMiwgMHgwMCwKKwkgMHgwMCwgMHhGMSwgMHg0NiwgMHgwMCwgMHg2NCwgMHhGMywgMHhGNiwgMHgwMCwgMHgwMCwgMHgwMywgMHg4RSwgMHhGNywgMHgxRiwgMHgwMCwgMHgzNCwgMHgwMSwKKwkgMHhDOCwgMHgwMCwgMHg5NiwgMHgwMSwgMHhDQywgMHgwMCwgMHhGQSwgMHgwMCwgMHg3OCwgMHgwMSwgMHhEMiwgMHgyNSwgMHgxOCwgMHgwMSwgMHhDQywgMHgxRSwKKwkgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgxNSwgMHgwMCwgMHgwMCwgMHgwNiwgMHgxNywgMHgxMiwgMHgwMSwgMHgwMywgMHgwMCwgMHhBRSwgMHgwMCwKKwkgMHhFQywgMHgwMCwgMHg0NCwgMHgwMCwgMHhEQywgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxQywgMHgwOSwgMHgwOCwgMHgyNCwgMHgyOCwgMHgwNiwKKwkgMHgwQywgMHgxOCwgMHgwOCwgMHgzMCwgMHgxNCwgMHgwQywgMHgwOCwgMHgzNiwgMHgxMCwgMHgxMiwgMHhBMSwgMHhCNiwgMHgxNCwgMHhCNiwgMHg1MCwgMHhCNywKKwkgMHg1OSwgMHhCNywgMHgyNSwgMHhCNiwgMHhDRSwgMHhCNiwgMHg5MywgMHhCNiwgMHgxNSwgMHgxQywgMHhEMCwgMHgxQSwgMHgxNSwgMHgxQywgMHg4QiwgMHgxQiwKKwkgMHhFRSwgMHgxQSwgMHhDQiwgMHgxQSwgMHhEMiwgMHgxQiwgMHhGMSwgMHgxQiwgMHgwNiwgMHgxQywgMHg0OCwgMHgxQywgMHg3NCwgMHgxQywgMHg3NCwgMHgxQiwKKwkgMHgyMiwgMHg0NiwgMHgyMiwgMHg0NiwgMHgyMiwgMHg0NiwgMHgyMiwgMHg0NiwgMHgyMiwgMHg0NiwgMHgyMiwgMHg0NiwgMHgyMiwgMHg0NiwgMHgyMiwgMHg0NiwKKwkgMHgyMiwgMHg0NiwgMHgyMiwgMHg0NiwgMHgyMiwgMHg0NiwgMHgyMywgMHg0NiwgMHgyMywgMHg0NiwgMHgyMywgMHg0NiwgMHgxQywgMHg0NywgMHgxQywgMHg0NywKKwkgMHgxQywgMHg0NywgMHgxQywgMHg0NywgMHgxQywgMHg0NywgMHgxQywgMHg0NywgMHgxQywgMHg0NywgMHgxQywgMHg0NywgMHgxQywgMHg0NywgMHgxQywgMHg0NywKKwkgMHgxQywgMHg0NywgMHgxQywgMHg0NywgMHgxQywgMHg0NywgMHgxRCwgMHg0NywgMHg5QSwgMHg0OCwgMHhEQSwgMHg0OCwgMHgxQSwgMHg0OCwgMHg1QSwgMHg0OCwKKwkgMHg5QSwgMHg0OCwgMHhEQSwgMHg0OCwgMHgxQSwgMHg0OCwgMHg1QSwgMHg0OCwgMHg5QSwgMHg0OCwgMHhEQSwgMHg0OCwgMHgxQSwgMHg0OCwgMHg1QSwgMHg0OCwKKwkgMHg5QSwgMHg0OCwgMHgzMywgMHg0OCwgMHg3OCwgMHg0OSwgMHg3OCwgMHg0OSwgMHg3OSwgMHg0OSwgMHg3OSwgMHg0OSwgMHg3OSwgMHg0OSwgMHg3OSwgMHg0OSwKKwkgMHg3QSwgMHg0OSwgMHg3QSwgMHg0OSwgMHg3QSwgMHg0OSwgMHg3QSwgMHg0OSwgMHg3QiwgMHg0OSwgMHg3QiwgMHg0OSwgMHg3QiwgMHg0OSwgMHg3QywgMHg0OSwKKwkgMHhEOCwgMHgwMywgMHhEQywgMHgwMywgMHhFMCwgMHgwMywgMHhFNCwgMHgwMywgMHhGMCwgMHgwMywgMHhGNCwgMHgwMywgMHhGOCwgMHgwMywgMHgwQSwgMHgwNCwKKwkgMHgwRSwgMHgwNCwgMHgxMiwgMHgwNCwgMHgxNiwgMHgwNCwgMHgwQywgMHgwNCwgMHgxMCwgMHgwNCwgMHgxNCwgMHgwNCwgMHgxOCwgMHgwNCwgMHgxQywgMHgwNCwKKwkgMHgyMCwgMHgwNCwgMHgyNCwgMHgwNCwgMHgyOCwgMHgwNCwgMHg0QywgMHgwNCwgMHg1MCwgMHgwNCwgMHg1NCwgMHgwNCwgMHg1OCwgMHgwNCwgMHg1QywgMHgwNCwKKwkgMHg2MCwgMHgwNCwgMHg2NCwgMHgwNCwgMHg2OCwgMHgwNCwgMHg2QywgMHgwNCwgMHg3MCwgMHgwNCwgMHg3NCwgMHgwNCwgMHg3RCwgMHgwNCwgMHg4MSwgMHgwNCwKKwkgMHg4NSwgMHgwNCwgMHg4OSwgMHgwNCwgMHg4RCwgMHgwNCwgMHgxMCwgMHgwMCwgMHg4RSwgMHgxOSwgMHhBQywgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHg4MCwgMHgzQywgMHgwQywgMHgwMCwgMHgwMCwgMHhGRiwgMHgzRiwgMHg0NCwgMHgwNCwgMHgwMCwgMHgwMCwgMHhEMywgMHgyMiwgMHg0NCwgMHgwNCwKKwkgMHg5QywgMHgwMiwgMHhDQiwgMHg1NCwgMHg0NCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHg0NCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywKKwkgMHgwMCwgMHgwQywgMHg3MSwgMHgwMCwgMHgzMCwgMHg1MCwgMHgyMCwgMHgwMCwgMHg4MCwgMHhCRiwgMHgxRiwgMHhBNiwgMHgyOCwgMHgwMCwgMHgwQiwgMHgwMiwKKwkgMHg2MCwgMHg4NCwgMHg0QywgMHgwMCwgMHgwMiwgMHgwMCwgMHg0QiwgMHgxQywgMHg5OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwQiwgMHgzNCwgMHgwNCwKKwkgMHhGRCwgMHgzNCwgMHgzNCwgMHgwMCwgMHgzOCwgMHgwNCwgMHhGRCwgMHgzNCwgMHgzNCwgMHgwMCwgMHgzQywgMHgwNCwgMHgwMSwgMHgwMCwgMHgxMCwgMHgwMCwKKwkgMHgwMCwgMHgwOCwgMHgwMCwgMHg1MiwgMHgxNCwgMHgwMCwgMHgwNCwgMHgwOCwgMHgwRSwgMHgzMiwgMHgwMCwgMHhBNiwgMHgxMCwgMHgwOCwgMHhDNCwgMHgwMywKKwkgMHg1MCwgMHg2MCwgMHgxOCwgMHgwOCwgMHhGMCwgMHgzRiwgMHhGQywgMHgwMSwgMHgxMCwgMHgwQywgMHgwMCwgMHgwMCwgMHg4MCwgMHgwNCwgMHgxNCwgMHgwQywKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MSwgMHgyMCwgMHgwQywgMHhCMCwgMHgwMCwgMHhCMCwgMHhCOCwgMHgyNCwgMHgwQywgMHgwMCwgMHgwMCwgMHhBQiwgMHgwNSwKKwkgMHgyQywgMHgwQywgMHg4MCwgMHgwNSwgMHgwMCwgMHhGRiwgMHgzMCwgMHgwQywgMHgwMCwgMHgwMCwgMHhCMCwgMHgwNCwgMHgzNCwgMHgwQywgMHgwMywgMHgwMCwKKwkgMHgwMCwgMHhFOCwgMHg0NCwgMHgwQywgMHgwNCwgMHgwMCwgMHhGRiwgMHgwRiwgMHgwMCwgMHgxMCwgMHgyRSwgMHgwMCwgMHgwQywgMHhFMywgMHg0NCwgMHgwNCwKKwkgMHgwMCwgMHgwMCwgMHgwMSwgMHgwNCwgMHg0NCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHg0NCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKKwkgMHg0NCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwNCwgMHg0NCwgMHgwNCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMywgMHg0OCwgMHgwQywgMHgwMCwgMHgwMCwKKwkgMHg3RiwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwOCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwOCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywKKwkgMHg3MSwgMHgwMCwgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHg1RSwgMHg0MCwgMHgwMSwgMHgwMCwgMHgxOCwgMHgwMCwgMHgzNiwgMHhDMCwgMHhFOCwgMHgwRSwKKwkgMHgxQywgMHgwMCwgMHg3OCwgMHhDOCwgMHhBNSwgMHg0MCwgMHgyNCwgMHgwMCwgMHg5RSwgMHhCMCwgMHhCOSwgMHg5NSwgMHgwOCwgMHgwOCwgMHgwMCwgMHhFQSwKKwkgMHg0MCwgMHgwMSwgMHgwQywgMHgwOCwgMHgwMCwgMHhFQSwgMHgwMCwgMHgwMCwgMHgxQywgMHgwOCwgMHgwMCwgMHgwMCwgMHg0MiwgMHgwNywgMHgyMCwgMHgwOCwKKwkgMHg3QiwgMHgwMCwgMHhENCwgMHgwOSwgMHgyQywgMHgwNCwgMHgxNCwgMHgwMCwgMHg1MCwgMHgxNCwgMHgzMCwgMHgwNCwgMHgyOCwgMHgwRiwgMHgyOCwgMHg3RiwKKwkgMHgxOCwgMHgwOCwgMHgyMCwgMHgwMCwgMHhGQywgMHgwMSwgMHgwNCwgMHgxMCwgMHg2OSwgMHgwMCwgMHhGRCwgMHhDMywgMHgwOCwgMHgxMCwgMHg2OSwgMHgwMCwKKwkgMHhGRCwgMHhDMywgMHgwOCwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0OCwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0OCwgMHgwQywKKwkgMHgwMCwgMHgwMCwgMHg3RiwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwOCwgMHg0OCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1RSwgMHg0OCwgMHgwMCwgMHgwMCwKKwkgMHgwNCwgMHgwNCwgMHgwOCwgMHg0MCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwQywgMHg3MSwgMHgwMCwgMHgzMCwgMHg1MCwgMHgwMCwgMHgwMCwgMHg1RSwgMHg0OCwKKwkgMHgwMSwgMHgwMCwgMHgxOCwgMHgwMCwgMHgzQSwgMHhDMCwgMHhFOCwgMHgwNCwgMHgxQywgMHgwMCwgMHg3OCwgMHhEMCwgMHhBNSwgMHg0MCwgMHgyNCwgMHgwMCwKKwkgMHg5RSwgMHhCMCwgMHhCOSwgMHg4NSwgMHgyQywgMHgwNCwgMHgxNCwgMHgwMCwgMHg1MCwgMHgxNCwgMHgzMCwgMHgwNCwgMHgyOCwgMHgwRiwgMHgyOCwgMHg3RiwKKwkgMHgwOCwgMHgwOCwgMHgwMCwgMHhFQSwgMHg0MCwgMHgwMSwgMHgwQywgMHgwOCwgMHgwMCwgMHhFQSwgMHgwMCwgMHgwMCwgMHgxQywgMHgwOCwgMHgwMCwgMHgwMCwKKwkgMHg0MiwgMHgwNywgMHgyMCwgMHgwOCwgMHg3QiwgMHgwMCwgMHhENCwgMHgwOSwgMHgxOCwgMHgwOCwgMHhGMCwgMHgzRiwgMHhGQywgMHgwMSwgMHgwNCwgMHgxMCwKKwkgMHg2OSwgMHgwMCwgMHhERCwgMHhDRCwgMHgwOCwgMHgxMCwgMHg2OSwgMHgwMCwgMHhERCwgMHhDRCwgMHgwOCwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHg0OCwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwNCwgMHg0MCwgMHgwMSwgMHg0MSwgMHgwMSwgMHgwQywgMHgwNCwgMHg0MCwgMHgwNCwKKwkgMHg0MSwgMHgwNCwgMHgxMCwgMHgwNCwgMHhENiwgMHgwOCwgMHg1NiwgMHgwQSwgMHgxNCwgMHgwNCwgMHg0MiwgMHgwMiwgMHg1NiwgMHgwQSwgMHgxOCwgMHgwNCwKKwkgMHg1NiwgMHgwQSwgMHg0MCwgMHgwMiwgMHgxQywgMHgwNCwgMHg0MiwgMHgwQSwgMHg0MiwgMHgyQSwgMHgyMCwgMHgwNCwgMHhDMiwgMHgwMCwgMHhENiwgMHgwOCwKKwkgMHgyNCwgMHgwNCwgMHhENiwgMHgwOCwgMHhDMCwgMHgwMCwgMHgyOCwgMHgwNCwgMHhDMiwgMHgwOCwgMHhDMiwgMHgyOCwgMHgwOCwgMHgwNCwgMHg0MCwgMHgwMSwKKwkgMHg0MSwgMHgwMSwgMHgwQywgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMSwgMHgxMCwgMHgwNCwgMHg1NiwgMHgwQSwgMHg1NiwgMHgwQSwgMHgxNCwgMHgwNCwKKwkgMHg0MiwgMHgwMiwgMHg1NiwgMHgwQSwgMHgxOCwgMHgwNCwgMHg1NiwgMHgwQSwgMHg0MCwgMHgwMiwgMHgxQywgMHgwNCwgMHg0MiwgMHgwQSwgMHg0MiwgMHgyQSwKKwkgMHgyMCwgMHgwNCwgMHg0MiwgMHgwMiwgMHg1NiwgMHgwQSwgMHgyNCwgMHgwNCwgMHg1NiwgMHgwQSwgMHg0MCwgMHgwMiwgMHgyOCwgMHgwNCwgMHg0MiwgMHgwQSwKKwkgMHg0MiwgMHgyQSwgMHgwOCwgMHgwNCwgMHg0MCwgMHgwMSwgMHg0MSwgMHgwMSwgMHgwQywgMHgwNCwgMHg0MCwgMHgwNCwgMHg0MSwgMHgwNCwgMHgxMCwgMHgwNCwKKwkgMHhDRSwgMHgwOCwgMHg0RSwgMHgwQSwgMHgxNCwgMHgwNCwgMHg0MiwgMHgwMiwgMHg0RSwgMHgwQSwgMHgxOCwgMHgwNCwgMHg0RSwgMHgwQSwgMHg0MCwgMHgwMiwKKwkgMHgxQywgMHgwNCwgMHg0MiwgMHgwQSwgMHg0MiwgMHgyQSwgMHgyMCwgMHgwNCwgMHhDMiwgMHgwMCwgMHhDRSwgMHgwOCwgMHgyNCwgMHgwNCwgMHhDRSwgMHgwOCwKKwkgMHhDMCwgMHgwMCwgMHgyOCwgMHgwNCwgMHhDMiwgMHgwOCwgMHhDMiwgMHgyOCwgMHgwOCwgMHgwNCwgMHg0MCwgMHgwMSwgMHg0MSwgMHgwMSwgMHgwQywgMHgwNCwKKwkgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMSwgMHgxMCwgMHgwNCwgMHg0RSwgMHgwQSwgMHg0RSwgMHgwQSwgMHgxNCwgMHgwNCwgMHg0MiwgMHgwMiwgMHg0RSwgMHgwQSwKKwkgMHgxOCwgMHgwNCwgMHg0RSwgMHgwQSwgMHg0MCwgMHgwMiwgMHgxQywgMHgwNCwgMHg0MiwgMHgwQSwgMHg0MiwgMHgyQSwgMHgyMCwgMHgwNCwgMHg0MiwgMHgwMiwKKwkgMHg0RSwgMHgwQSwgMHgyNCwgMHgwNCwgMHg0RSwgMHgwQSwgMHg0MCwgMHgwMiwgMHgyOCwgMHgwNCwgMHg0MiwgMHgwQSwgMHg0MiwgMHgyQSwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwKKwkgMHgwNSwgMHgwMCwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwKKwkgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwKKwkgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwKKwkgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNywgMHhBMCwgMHgxNywgMHhBMCwgMHgxNywKKwkgMHhBMCwgMHgxOCwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwKKwkgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwKKwkgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwKKwkgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwKKwkgMHhGRiwgMHgwNiwgMHgwMCwgMHgwMCwgMHg2NSwgMHgwMCwgMHg2NSwgMHgwMCwgMHg2NSwgMHgwMCwgMHg2NSwgMHgwMCwgMHg1RCwgMHgwMCwgMHg1MiwgMHgwMCwKKwkgMHg0OCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgzOCwgMHgwMCwgMHgzMSwgMHgwMCwgMHgyQywgMHgwMCwgMHgyNywgMHgwMCwgMHgyMywgMHgwMCwgMHgxRiwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHg2NSwgMHgwMCwgMHg2NSwgMHgwMCwgMHg2NSwgMHgwMCwgMHg2NSwgMHgwMCwgMHg1RCwgMHgwMCwgMHg1MiwgMHgwMCwgMHg0OCwgMHgwMCwKKwkgMHg0MCwgMHgwMCwgMHgzOCwgMHgwMCwgMHgzMSwgMHgwMCwgMHgyQywgMHgwMCwgMHgyNywgMHgwMCwgMHgyMywgMHgwMCwgMHgxRiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwKKwkgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHgwQywgMHgwMCwgMHgwQywgMHgwMCwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwKKwkgMHgxNSwgMHgwMCwgMHg2RSwgMHg2RiwgMHg2RSwgMHgyRCwgMHg3MywgMHg3MCwgMHg2NSwgMHg2MywgMHg2OSwgMHg2NiwgMHg2OSwgMHg2NSwgMHg2NCwgMHgyMCwKKwkgMHg1MywgMHg1MywgMHg0OSwgMHg0NCwgMHgyMCwgMHgyMSwgMHgyMSwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHg2NCwgMHgwMCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHg0OCwgMHg0NSwgMHg1MiwgMHg0RCwgMHg0NSwgMHg1MywgMHgyMCwgMHgzMiwgMHgwMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgxNCwgMHgwMCwgMHgwMywgMHgwMCwgMHgxNSwgMHgwMCwgMHg2RSwgMHg2RiwgMHg2RSwgMHgyRCwgMHg3MywgMHg3MCwgMHg2NSwgMHg2MywgMHg2OSwgMHg2NiwKKwkgMHg2OSwgMHg2NSwgMHg2NCwgMHgyMCwgMHg1MywgMHg1MywgMHg0OSwgMHg0NCwgMHgyMCwgMHgyMSwgMHgyMSwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgwMSwgMHgwMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHg2NCwgMHgwMCwKKwkgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0OCwgMHg0NSwgMHg1MiwgMHg0RCwgMHg0NSwgMHg1MywgMHgyMCwgMHgzMiwgMHgwMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNCwgMHgwMCwKKwkgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NiwgMHg2OSwgMHg3MiwgMHg3MywgMHg3NCwgMHgyMCwgMHg1NywgMHg2MSwKKwkgMHg3NiwgMHg2NSwgMHg0QywgMHg0MSwgMHg0RSwgMHgyMCwgMHg0OSwgMHg0OSwgMHgyMCwgMHg1MywgMHg1MywgMHg0OSwgMHg0NCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHhGRiwgMHgwRiwgMHhGMCwgMHgwRiwgMHgwRiwgMHgwMCwgMHg1MCwgMHgwMSwgMHgwMiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxNCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgzMCwgMHgwMCwgMHhGRiwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwOSwgMHgwMCwKKwkgMHgwQSwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwQiwgMHgwMCwgMHgwQiwgMHgwMCwgMHgxNCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwQSwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwQiwgMHgxNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMSwgMHg4MiwgMHg4NCwKKwkgMHg4QiwgMHg5NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMSwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgyMCwgMHgwMCwgMHgxQiwgMHgwMCwgMHgxNywgMHgwMCwgMHgxMSwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwQiwgMHgwMCwKKwkgMHgwQiwgMHgwMCwgMHgwOSwgMHgwMCwgMHgxNywgMHgwMCwgMHgxNCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwRCwgMHgwMCwgMHgwQiwgMHgwMCwgMHgwOSwgMHgwMCwKKwkgMHgwOCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwRCwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwNSwgMHgwMCwKKwkgMHhEOCwgMHgwQywgMHhDMCwgMHgwOCwgMHg5MCwgMHgwRCwgMHg2MCwgMHgwOSwgMHg0OCwgMHgwRSwgMHgzMCwgMHgwQSwgMHgyNCwgMHgwRiwgMHgxOCwgMHgwQiwKKwkgMHgwQiwgMHg2RSwgMHgwQiwgMHgzNywgMHgwMiwgMHgxNCwgMHgwMSwgMHgwQSwgMHhGRiwgMHgwRiwgMHhGMCwgMHgwRiwgMHhGRiwgMHgwRiwgMHhGMCwgMHgwRiwKKwkgMHhGRiwgMHgwRiwgMHhGMCwgMHgwRiwgMHhGRiwgMHgwRiwgMHhGMCwgMHgwRiwgMHhGRiwgMHgwRiwgMHhGMCwgMHgwRiwgMHhGRiwgMHgwRiwgMHhGMCwgMHgwRiwKKwkgMHgwNCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwNywgMHgwMCwgMHgwNywgMHgwMCwgMHgwNywgMHgwMCwgMHgwNywgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHhERCwgMHgwMCwgMHg1MCwgMHhGMiwgMHgwMSwgMHgwMSwgMHgwMCwKKwkgMHgwMCwgMHg1MCwgMHhGMiwgMHgwNSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg1MCwgMHhGMiwgMHgwMiwgMHgwMCwgMHg1MCwgMHhGMiwgMHgwNCwgMHgwMiwgMHgwMCwKKwkgMHgwMCwgMHg1MCwgMHhGMiwgMHgwMCwgMHgwMCwgMHg1MCwgMHhGMiwgMHgwMSwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgxNSwgMHgwMCwgMHgwMiwgMHgwMCwKKwkgMHgxMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwNCwgMHgwMCwKKwkgMHgxNSwgMHgwMCwgMHgyMCwgMHgwMCwgMHgxMSwgMHgwMCwgMHgyMCwgMHgwMCwgMHgxNiwgMHgyNiwgMHhFMiwgMHgyQiwgMHhFQSwgMHgyRCwgMHhDNCwgMHgyRCwKKwkgMHhFRSwgMHgyRCwgMHg3RSwgMHgyQywgMHgxRSwgMHgyRSwgMHgyMiwgMHgyRSwgMHhGRiwgMHhGRiwgMHgyQywgMHgyRSwgMHgwMCwgMHgwMCwgMHg0RSwgMHgyOCwKKwkgMHhEOCwgMHgyQiwgMHgyMiwgMHgyRSwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxNiwgMHgyNiwgMHhFMiwgMHgyQiwgMHhFQSwgMHgyRCwgMHhGRiwgMHhGRiwKKwkgMHhFRSwgMHgyRCwgMHg3RSwgMHgyQywgMHgxRSwgMHgyRSwgMHgyMiwgMHgyRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHgyQywgMHgyRSwgMHgwMCwgMHgwMCwgMHhFMiwgMHgyQiwgMHgzNCwgMHgyRSwgMHgyMiwgMHgyRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNSwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMywgMHgwMywgMHgwMCwgMHgwNiwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwOCwgMHgzMiwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHg4MCwgMHgwMCwgMHg2MCwgMHgxRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHg4MSwKKwkgMHgwMCwgMHg2MCwgMHgxRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHhERCwgMHgwMCwgMHhGRiwgMHhGRiwgMHg5NywgMHhEQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgxOSwgMHgwQSwgMHgwOSwgMHg0NiwgMHgxQywgMHg2MCwgMHgxOCwgMHgwMCwgMHgxOSwgMHgxRCwgMHgwOSwgMHg0MiwKKwkgMHgxQywgMHg2MCwKKworfTsgIC8qIGZ3X2ltYWdlXzJfZGF0YSAqLworCitzdGF0aWMgY29uc3QgaGNmXzggZndfaW1hZ2VfM19kYXRhW10gPSB7CisJIDB4MDAsIDB4NjAsIDB4NDYsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4MDQsIDB4RTEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4RTEsIDB4ODIsIDB4RjMsIDB4MjEsIDB4NjAsCisJIDB4Q0UsIDB4NjEsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDIsIDB4MDAsIDB4MjEsIDB4NjAsIDB4NTYsIDB4NjEsIDB4MEYsIDB4NjAsIDB4RTgsIDB4NjQsCisJIDB4NTksIDB4RDEsIDB4NTgsIDB4RDksIDB4NTksIDB4RDEsIDB4NTgsIDB4RDksIDB4M0YsIDB4NDQsIDB4NDAsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MTgsIDB4NjAsCisJIDB4MjIsIDB4RjMsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NTAsIDB4QTQsIDB4NTAsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsIDB4MDMsIDB4MDAsIDB4MTgsIDB4NjAsCisJIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjksIDB4RkUsIDB4MDEsIDB4QzQsIDB4RTIsIDB4NDMsIDB4NjQsIDB4M0EsIDB4REIsIDB4ODIsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4M0YsIDB4NDQsIDB4RkYsIDB4MDEsIDB4M0YsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MTgsIDB4NjAsCisJIDB4MjAsIDB4RjMsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NTAsIDB4QTQsIDB4NTIsIDB4QzQsIDB4RTIsIDB4MDAsIDB4NjMsIDB4ODEsIDB4RkQsIDB4MzIsIDB4N0IsCisJIDB4NEQsIDB4RTIsIDB4QkYsIDB4RkUsIDB4QzQsIDB4RTIsIDB4NDEsIDB4RkYsIDB4RTAsIDB4RkUsIDB4RTEsIDB4RkUsIDB4RTIsIDB4RkUsIDB4NDMsIDB4RkYsCisJIDB4NDQsIDB4RkYsIDB4NDYsIDB4RkYsIDB4ODMsIDB4RjMsIDB4NjIsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDUsIDB4MzYsIDB4MkQsIDB4RkYsIDB4MDcsIDB4MzYsCisJIDB4RDUsIDB4RkUsIDB4MDgsIDB4RTEsIDB4ODgsIDB4NjAsIDB4ODUsIDB4NzEsIDB4OEQsIDB4RTIsIDB4QTMsIDB4NjAsIDB4MzAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDEsIDB4QTksIDB4OUMsCisJIDB4NjAsIDB4NDUsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4ODgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODIsIDB4RjEsIDB4MDksIDB4NjAsIDB4QjQsIDB4NjEsCisJIDB4NjQsIDB4NDQsIDB4MDEsIDB4MjcsIDB4MjQsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MEUsIDB4M0EsIDB4MEQsIDB4MDAsIDB4MDEsIDB4N0MsIDB4MTAsIDB4NjAsCisJIDB4RjIsIDB4RjksIDB4NDQsIDB4NjAsIDB4MDgsIDB4N0MsIDB4MTAsIDB4NjAsIDB4QzQsIDB4RjksIDB4MTIsIDB4NjAsIDB4RTUsIDB4RjEsIDB4MDIsIDB4NjAsCisJIDB4QjAsIDB4NjEsIDB4QjEsIDB4OUMsIDB4MjYsIDB4MDAsIDB4MDAsIDB4N0MsIDB4MTAsIDB4NjAsIDB4RjIsIDB4RjksIDB4NDAsIDB4NjAsIDB4MDgsIDB4N0MsCisJIDB4MTAsIDB4NjAsIDB4QzQsIDB4RjksIDB4MTIsIDB4NjAsIDB4RTUsIDB4RjEsIDB4MDIsIDB4NjAsIDB4OTAsIDB4NjEsIDB4QjEsIDB4OUMsIDB4MDksIDB4NjAsCisJIDB4NjcsIDB4NjUsIDB4RkYsIDB4QjQsIDB4QzQsIDB4ODUsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODEsIDB4MTIsIDB4MDAsIDB4RkYsIDB4QjQsCisJIDB4RUQsIDB4QTAsIDB4MjUsIDB4NjAsIDB4Q0MsIDB4NjEsIDB4MDQsIDB4MDQsIDB4RTIsIDB4QTAsIDB4RDksIDB4ODEsIDB4MDEsIDB4MDQsIDB4RDksIDB4ODEsCisJIDB4QTEsIDB4RDEsIDB4MDIsIDB4NjAsIDB4NTAsIDB4NjEsIDB4MUYsIDB4NjAsIDB4RjYsIDB4NjUsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4QjEsIDB4OUMsCisJIDB4QzgsIDB4ODEsIDB4NjEsIDB4NDcsIDB4MDAsIDB4N0UsIDB4RTksIDB4ODEsIDB4MDcsIDB4NjAsIDB4RjAsIDB4NjUsIDB4QTUsIDB4ODEsIDB4MEIsIDB4QjksCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODUsIDB4QjUsIDB4ODUsIDB4MDQsIDB4NjAsIDB4NDQsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4ODgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODIsIDB4RjMsIDB4QzgsIDB4NjEsIDB4NjEsIDB4NTQsIDB4Q0QsIDB4RTIsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsCisJIDB4MkUsIDB4MDAsIDB4Q0MsIDB4ODQsIDB4RTAsIDB4ODUsIDB4MTUsIDB4NjAsIDB4QTIsIDB4RTcsIDB4MUYsIDB4NjAsIDB4ODYsIDB4NjQsIDB4MUEsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4N0QsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4QTIsIDB4NjQsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEYsIDB4N0QsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4QkUsIDB4NjQsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEYsIDB4N0QsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsCisJIDB4REEsIDB4NjQsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEYsIDB4N0QsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NzUsIDB4NjQsIDB4MDYsIDB4NjEsIDB4NjEsIDB4NDgsCisJIDB4NjAsIDB4NDQsIDB4ODAsIDB4QkMsIDB4RkYsIDB4QjQsIDB4NjAsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MjEsIDB4NjAsCisJIDB4RUMsIDB4N0MsIDB4MDcsIDB4NjAsIDB4RTksIDB4RjksIDB4MjEsIDB4NjAsIDB4NzQsIDB4NjMsIDB4MTQsIDB4NjEsIDB4MjEsIDB4MDAsIDB4MTEsIDB4NjAsCisJIDB4NjIsIDB4RjEsIDB4RkYsIDB4QjQsIDB4RUQsIDB4QTAsIDB4NjQsIDB4NDEsIDB4MDQsIDB4MDQsIDB4RTIsIDB4QTAsIDB4RDksIDB4ODEsIDB4MDEsIDB4MDQsCisJIDB4RDksIDB4ODEsIDB4QTEsIDB4RDEsIDB4MTAsIDB4NjAsIDB4OTEsIDB4RjMsIDB4NjQsIDB4NDEsIDB4RkYsIDB4QjEsIDB4RkYsIDB4NjAsIDB4MDAsIDB4NjUsCisJIDB4QTQsIDB4ODQsIDB4MzQsIDB4OTQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4NjQsIDB4NDEsIDB4QTUsIDB4ODEsIDB4RkYsIDB4QjQsIDB4MzQsIDB4OTQsCisJIDB4QTIsIDB4REIsIDB4MjIsIDB4NjAsIDB4NTgsIDB4N0MsIDB4MDcsIDB4NjAsIDB4RTksIDB4RjksIDB4MjEsIDB4NjAsIDB4MDIsIDB4NjMsIDB4MTMsIDB4NjEsCisJIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4NjAsIDB4RTksIDB4RjMsIDB4MzEsIDB4NDAsIDB4ODAsIDB4MjYsCisJIDB4MzYsIDB4QTQsIDB4MDcsIDB4NjAsIDB4RTksIDB4RkIsIDB4NjAsIDB4NDMsIDB4MDksIDB4NjEsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4ODIsIDB4RjMsIDB4MjIsIDB4NjAsIDB4QzQsIDB4NjEsIDB4MDAsIDB4N0MsIDB4N0UsIDB4NjMsIDB4NTksIDB4RDksIDB4RkUsIDB4MUYsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDMsIDB4MDAsIDB4MjMsIDB4NjAsIDB4NDYsIDB4NjUsIDB4MTUsIDB4MDAsIDB4RkYsIDB4QjQsIDB4RjksIDB4QTAsCisJIDB4MjMsIDB4NjAsIDB4NjgsIDB4NjUsIDB4MDEsIDB4N0MsIDB4MEQsIDB4MDQsIDB4RUQsIDB4QTAsIDB4MjMsIDB4NjAsIDB4OEEsIDB4NjUsIDB4MTEsIDB4N0MsCisJIDB4MDgsIDB4MDQsIDB4RTIsIDB4QTAsIDB4MjMsIDB4NjAsIDB4QUMsIDB4NjUsIDB4MjEsIDB4N0MsIDB4MDMsIDB4MDQsIDB4MjMsIDB4NjAsIDB4Q0UsIDB4NjUsCisJIDB4MzEsIDB4N0MsIDB4NjQsIDB4NUYsIDB4NjQsIDB4RkIsIDB4QTUsIDB4RDMsIDB4REEsIDB4ODUsIDB4RjAsIDB4QTAsIDB4MjIsIDB4NjAsIDB4QzQsIDB4NjEsCisJIDB4MDgsIDB4MDYsIDB4NDAsIDB4NTQsIDB4NTgsIDB4NTMsIDB4MDgsIDB4RkYsIDB4QTIsIDB4NjAsIDB4RTcsIDB4NjQsIDB4NDMsIDB4RkIsIDB4MDgsIDB4RkYsCisJIDB4RkYsIDB4MDEsIDB4NjAsIDB4NDMsIDB4NjAsIDB4NDYsIDB4QTUsIDB4RDEsIDB4REEsIDB4ODUsIDB4QTUsIDB4RDMsIDB4REEsIDB4ODUsIDB4NTksIDB4RDksCisJIDB4NTksIDB4REIsIDB4NTksIDB4RDksIDB4NTksIDB4REIsIDB4RkIsIDB4MUYsIDB4MEMsIDB4NjMsIDB4QTUsIDB4RDEsIDB4REEsIDB4ODUsIDB4QTUsIDB4RDMsCisJIDB4REEsIDB4ODUsIDB4NTksIDB4RDksIDB4NTksIDB4REIsIDB4NTksIDB4RDksIDB4NTksIDB4REIsIDB4RjcsIDB4MUYsIDB4NjYsIDB4NDQsIDB4MEUsIDB4NjMsCisJIDB4NTMsIDB4OTMsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MzYsIDB4MDcsIDB4MDAsIDB4NjUsIDB4NDQsIDB4NDgsIDB4RDMsIDB4NTksIDB4RDksIDB4NTksIDB4REIsCisJIDB4NTksIDB4RDksIDB4NTksIDB4REIsIDB4RkIsIDB4MUYsIDB4MTIsIDB4NjAsIDB4QkMsIDB4RjEsIDB4NjQsIDB4RjMsIDB4NjQsIDB4NDMsIDB4REIsIDB4ODEsCisJIDB4MjUsIDB4NjAsIDB4NUEsIDB4NjUsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzcsIDB4MTIsIDB4MDAsIDB4MTEsIDB4MzcsIDB4MTcsIDB4MDAsIDB4MjEsIDB4MzcsCisJIDB4MUQsIDB4MDAsIDB4MzEsIDB4MzcsIDB4MjIsIDB4MDAsIDB4QTMsIDB4RDEsIDB4MTIsIDB4NjAsIDB4QjcsIDB4RjUsIDB4NjQsIDB4NDQsIDB4RkYsIDB4QjQsCisJIDB4MTIsIDB4NjAsIDB4QjYsIDB4RkIsIDB4NjQsIDB4NDcsIDB4RkYsIDB4QjQsIDB4MTIsIDB4NjAsIDB4QUQsIDB4RjEsIDB4MUQsIDB4MDAsIDB4QTEsIDB4RDMsCisJIDB4MTIsIDB4NjAsIDB4QjgsIDB4RjUsIDB4RkYsIDB4QjQsIDB4MTIsIDB4NjAsIDB4QUUsIDB4RjEsIDB4MTYsIDB4MDAsIDB4QTEsIDB4RDMsIDB4MTIsIDB4NjAsCisJIDB4QjksIDB4RjUsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4MTIsIDB4NjAsIDB4QUYsIDB4RjEsIDB4MEUsIDB4MDAsIDB4NTksIDB4RDMsIDB4MTIsIDB4NjAsCisJIDB4QkEsIDB4RjUsIDB4RkYsIDB4QjQsIDB4MTIsIDB4NjAsIDB4QjAsIDB4RjEsIDB4MDcsIDB4MDAsIDB4NTksIDB4RDMsIDB4MTIsIDB4NjAsIDB4QkIsIDB4RjUsCisJIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4MTIsIDB4NjAsIDB4QjEsIDB4RjEsIDB4MTIsIDB4NjAsIDB4QjUsIDB4RkIsIDB4MTIsIDB4NjAsIDB4QjIsIDB4RjksCisJIDB4NjYsIDB4NDIsIDB4RkMsIDB4QTIsIDB4QTIsIDB4RDMsIDB4MjQsIDB4NjAsIDB4NDgsIDB4NjMsIDB4Q0MsIDB4ODQsIDB4RTgsIDB4ODQsIDB4Q0MsIDB4ODEsCisJIDB4NjMsIDB4NDUsIDB4QTYsIDB4RDMsIDB4REEsIDB4ODIsIDB4RkYsIDB4QjQsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MkIsCisJIDB4MDMsIDB4MDAsIDB4REEsIDB4ODYsIDB4Q0QsIDB4ODEsIDB4RjUsIDB4MDEsIDB4MDAsIDB4QjksIDB4QTYsIDB4RDMsIDB4MEIsIDB4MDMsIDB4NUEsIDB4RDEsCisJIDB4REEsIDB4ODYsIDB4RkYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODQsIDB4NUMsIDB4OTAsIDB4QkQsIDB4RDksIDB4RkQsIDB4MDIsIDB4Q0QsIDB4ODEsCisJIDB4NjYsIDB4NDIsIDB4RjIsIDB4MDIsIDB4NUEsIDB4RDMsIDB4MjQsIDB4NjAsIDB4ODYsIDB4NjUsIDB4RDcsIDB4ODAsIDB4QkQsIDB4REIsIDB4RkQsIDB4MDIsCisJIDB4NjQsIDB4RjMsIDB4MTUsIDB4NjAsIDB4REQsIDB4RjEsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDksIDB4MDAsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MjYsCisJIDB4MDYsIDB4MDAsIDB4MTMsIDB4NjQsIDB4QUQsIDB4RkIsIDB4MDEsIDB4NjAsIDB4NjcsIDB4NjQsIDB4MzcsIDB4RkIsIDB4MDksIDB4MDAsIDB4MDgsIDB4NjQsCisJIDB4QUQsIDB4RkIsIDB4ODIsIDB4RjMsIDB4MDEsIDB4NjAsIDB4NjcsIDB4N0MsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NUIsIDB4N0MsIDB4MzcsIDB4RjksCisJIDB4MTMsIDB4NjAsIDB4NUIsIDB4RjEsIDB4NjQsIDB4RjMsIDB4MTUsIDB4NjAsIDB4RDIsIDB4RjksIDB4MTUsIDB4NjAsIDB4RDYsIDB4RjksIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MjcsIDB4MEEsIDB4MDAsIDB4RkYsIDB4QjUsIDB4MTAsIDB4NjAsIDB4QTgsIDB4NjMsIDB4NjUsIDB4NDEsIDB4Q0QsIDB4ODEsIDB4MDYsIDB4QTMsCisJIDB4RkQsIDB4MDIsIDB4RkEsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MEYsIDB4MDAsIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4MTEsIDB4NjAsCisJIDB4MTQsIDB4NjEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4MDgsIDB4QTEsIDB4RkIsIDB4MDIsIDB4RkMsIDB4QTEsIDB4QTEsIDB4RDMsCisJIDB4MTUsIDB4NjAsIDB4RDIsIDB4RjEsIDB4RkYsIDB4QjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDcsIDB4MTUsIDB4NjAsIDB4RDIsIDB4RkIsCisJIDB4MTUsIDB4NjAsIDB4RDYsIDB4RkIsIDB4MjUsIDB4NjAsIDB4N0EsIDB4NjMsIDB4MjQsIDB4NjAsIDB4MDgsIDB4NjUsIDB4MTIsIDB4NjAsIDB4QjYsIDB4RjEsCisJIDB4MjMsIDB4NjAsIDB4RjAsIDB4NjEsIDB4MjUsIDB4NjAsIDB4NjgsIDB4NjQsIDB4NDAsIDB4NEYsIDB4MDQsIDB4NjQsIDB4QzMsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4MjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NjAsIDB4ODIsIDB4NjMsIDB4MTIsIDB4NjAsIDB4QjUsIDB4RjEsIDB4MjQsIDB4NjAsIDB4NDgsIDB4NjUsCisJIDB4MjUsIDB4NjAsIDB4NjYsIDB4NjQsIDB4NDAsIDB4NEYsIDB4MDgsIDB4NjQsIDB4QzMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4RjMsIDB4MDgsIDB4N0MsIDB4MzgsIDB4RjksIDB4MjQsIDB4NjAsIDB4RTAsIDB4NjEsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MEUsIDB4MDAsCisJIDB4MDEsIDB4MzcsIDB4MDYsIDB4MDAsIDB4MTEsIDB4MzcsIDB4MDMsIDB4MDAsIDB4MjEsIDB4M0IsIDB4MUUsIDB4QTEsIDB4MUUsIDB4QTEsIDB4MUUsIDB4QTEsCisJIDB4MUMsIDB4NjMsIDB4MjQsIDB4NjAsIDB4QzIsIDB4NjQsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDksIDB4RkQsIDB4MUYsIDB4MTIsIDB4NjAsIDB4QjIsIDB4RjMsCisJIDB4MDAsIDB4N0MsIDB4NjAsIDB4NDUsIDB4NzAsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4ODgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjksCisJIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjEsCisJIDB4QjEsIDB4OUMsIDB4NjAsIDB4NDUsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4ODgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTgsIDB4NjAsIDB4NTAsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NDQsIDB4RDMsIDB4ODAsIDB4N0MsIDB4NjAsIDB4NDgsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4QjAsIDB4OEEsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RDUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4NjIsIDB4NDcsIDB4ODAsIDB4QkYsCisJIDB4NjAsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjQsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsCisJIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4OTUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4N0MsIDB4QkQsIDB4RDMsIDB4RDUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4NjAsIDB4NDcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NEEsIDB4QkQsIDB4RDMsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4OTAsIDB4OEEsIDB4QkQsIDB4RDMsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4OTAsIDB4OEEsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4Q0QsIDB4ODEsIDB4OTUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4RUIsIDB4MDIsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4RDUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4NjIsIDB4NEEsIDB4MDIsIDB4NjQsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4RkQsIDB4MDIsIDB4N0MsIDB4NDksIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjgsIDB4NUMsIDB4N0MsIDB4NDksIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjgsIDB4NDQsIDB4OTUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDIsIDB4RkYsCisJIDB4NDAsIDB4RkYsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MjcsIDB4MzMsIDB4MDAsIDB4NDMsIDB4NDUsIDB4MjAsIDB4NDQsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsCisJIDB4M0YsIDB4NDAsIDB4MDIsIDB4MjcsIDB4MUIsIDB4MDAsIDB4NjAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4REQsIDB4RkUsIDB4MTgsIDB4NjAsIDB4MDcsIDB4RjEsCisJIDB4QUQsIDB4NEYsIDB4MDAsIDB4N0YsIDB4RkEsIDB4QjQsIDB4NjQsIDB4NDEsIDB4NjQsIDB4RjEsIDB4MDIsIDB4QjEsIDB4MDQsIDB4NjUsIDB4MDIsIDB4MDIsCisJIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDEsIDB4NjUsIDB4QjQsIDB4ODQsIDB4QTAsIDB4NUQsIDB4MDAsIDB4RUUsIDB4MTksIDB4NjEsIDB4Q0QsIDB4ODEsCisJIDB4RkYsIDB4RkYsIDB4RkQsIDB4MDIsIDB4NDMsIDB4NDUsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MjcsIDB4MTEsIDB4MDAsIDB4QUUsIDB4NEYsIDB4RkQsIDB4QjQsCisJIDB4MDQsIDB4QkMsIDB4QTAsIDB4NUUsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NzEsIDB4OEQsIDB4RTIsIDB4NDAsIDB4RTEsIDB4QTEsIDB4RkYsIDB4MDQsIDB4QUMsCisJIDB4QTAsIDB4NUUsIDB4MEYsIDB4NjAsIDB4QTAsIDB4NzEsIDB4OEQsIDB4RTIsIDB4QTEsIDB4RkYsIDB4REQsIDB4RkUsIDB4MUUsIDB4MDAsIDB4NDMsIDB4NDUsCisJIDB4MjAsIDB4NDQsIDB4NjAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4QUUsIDB4NEYsIDB4RkQsIDB4QjQsIDB4MDQsIDB4QkMsIDB4QTAsIDB4NUUsIDB4REQsIDB4RkUsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NzEsIDB4OEQsIDB4RTIsIDB4NDAsIDB4RTEsIDB4QTEsIDB4RkYsIDB4MDQsIDB4QUMsIDB4QTAsIDB4NUUsIDB4MDAsIDB4NjAsCisJIDB4QzgsIDB4NzEsIDB4OEQsIDB4RTIsIDB4QTEsIDB4RkYsIDB4MEMsIDB4NjAsIDB4MDAsIDB4NjIsIDB4MDAsIDB4NjAsIDB4NzEsIDB4N0MsIDB4MTAsIDB4NjAsCisJIDB4MDAsIDB4NjUsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4ODgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4NjAsIDB4M0MsIDB4NjMsIDB4MUUsIDB4NjEsCisJIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MTQsIDB4NzEsIDB4OEQsIDB4RTIsIDB4QTEsIDB4RkYsCisJIDB4MzEsIDB4NDQsIDB4NDAsIDB4MjYsIDB4MDIsIDB4MDAsIDB4ODAsIDB4MjYsIDB4MTcsIDB4MDAsIDB4MjEsIDB4NjAsIDB4RUMsIDB4NjMsIDB4MDcsIDB4NjAsCisJIDB4RTksIDB4RkQsIDB4MDksIDB4NjEsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzEsIDB4NDQsIDB4NDAsIDB4MkEsCisJIDB4MTQsIDB4MDAsIDB4MzEsIDB4NDQsIDB4N0YsIDB4QjQsIDB4NDAsIDB4NTEsIDB4QUUsIDB4NEMsIDB4MTAsIDB4MjYsIDB4MEUsIDB4MDAsIDB4MDcsIDB4NjAsCisJIDB4RUEsIDB4RkIsIDB4MzEsIDB4NDQsIDB4ODAsIDB4QkMsIDB4NDAsIDB4NTEsIDB4MjIsIDB4NjAsIDB4MjIsIDB4NjMsIDB4MDcsIDB4NjAsIDB4RTksIDB4RkQsCisJIDB4MDksIDB4NjEsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4NjAsIDB4RjAsIDB4NjMsIDB4MDMsIDB4NjEsCisJIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjIsIDB4MTksIDB4NjAsIDB4OEYsIDB4N0MsCisJIDB4MDAsIDB4NjAsIDB4QUMsIDB4NjUsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4ODgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODAsIDB4RTEsIDB4QkYsIDB4RkUsCisJIDB4QTEsIDB4NEYsIDB4NzAsIDB4QjQsIDB4NTAsIDB4MzYsIDB4QUYsIDB4MDAsIDB4MjAsIDB4MzYsIDB4MDMsIDB4MDAsIDB4MTgsIDB4NjAsIDB4MjQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MUEsIDB4RTEsIDB4REYsIDB4RkUsIDB4MTksIDB4RkYsIDB4MDAsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4M0YsIDB4NDAsIDB4MjAsIDB4MkIsIDB4QTEsIDB4MDAsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MzgsIDB4NjksIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NjgsIDB4NDQsIDB4MDEsIDB4MkEsIDB4OTksIDB4MDAsIDB4MTMsIDB4NjAsIDB4MDksIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4MDAsIDB4MzYsCisJIDB4MDAsIDB4M0IsIDB4QTIsIDB4REIsIDB4NjQsIDB4RjEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4OUMsIDB4NDcsIDB4MDAsIDB4NDMsIDB4NDUsCisJIDB4MjAsIDB4NDQsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4MTgsIDB4NjAsIDB4MjIsIDB4RjMsIDB4M0YsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MDEsIDB4MDAsCisJIDB4QTAsIDB4NTAsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsIDB4MjksIDB4MDAsIDB4QUUsIDB4NEYsIDB4RkQsIDB4QjQsIDB4QTAsIDB4NUUsIDB4REQsIDB4RkUsCisJIDB4QUMsIDB4NEYsIDB4MTAsIDB4QkMsIDB4QTAsIDB4NUMsIDB4RkYsIDB4RkYsIDB4MTAsIDB4QUMsIDB4QTAsIDB4NUMsIDB4MDAsIDB4NjAsIDB4QzgsIDB4NzEsCisJIDB4OEQsIDB4RTIsIDB4NDAsIDB4RTEsIDB4NDAsIDB4MjksIDB4RkUsIDB4MDEsIDB4MEMsIDB4NjAsIDB4MDAsIDB4NjIsIDB4MDAsIDB4NjAsIDB4NzEsIDB4N0MsCisJIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4ODgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4QzgsIDB4NzEsCisJIDB4OEQsIDB4RTIsIDB4NDAsIDB4RTEsIDB4NDAsIDB4MjksIDB4RkUsIDB4MDEsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4NjQsIDB4RjEsIDB4ODIsIDB4RjksCisJIDB4MDUsIDB4N0MsIDB4ODMsIDB4RjksIDB4REYsIDB4RkUsIDB4MTksIDB4RkYsIDB4RkYsIDB4RkYsIDB4MTgsIDB4NjAsIDB4MDcsIDB4RjEsIDB4QUQsIDB4NEYsCisJIDB4MDAsIDB4N0YsIDB4RkEsIDB4QjQsIDB4NjQsIDB4NDEsIDB4NjQsIDB4RjEsIDB4MDIsIDB4QjEsIDB4MDQsIDB4NjUsIDB4MDIsIDB4MDIsIDB4NjQsIDB4NDAsCisJIDB4MDEsIDB4MkIsIDB4MDEsIDB4NjUsIDB4QjQsIDB4ODQsIDB4QTAsIDB4NUQsIDB4QkYsIDB4RkUsIDB4NDUsIDB4MDAsIDB4MTgsIDB4NjAsIDB4MDcsIDB4RjEsCisJIDB4QUQsIDB4NEYsIDB4MDAsIDB4N0YsIDB4RkEsIDB4QjQsIDB4NjQsIDB4NDEsIDB4NjQsIDB4RjEsIDB4MDIsIDB4QjEsIDB4MDQsIDB4NjUsIDB4MDIsIDB4MDIsCisJIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDEsIDB4NjUsIDB4QjQsIDB4ODQsIDB4QTAsIDB4NUQsIDB4NDMsIDB4NDUsIDB4MjAsIDB4NDQsIDB4MjAsIDB4QkMsCisJIDB4NDAsIDB4NDAsIDB4MDIsIDB4NjAsIDB4RUUsIDB4NjQsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MjcsIDB4QzgsIDB4NjQsIDB4ODEsIDB4RkIsIDB4ODIsIDB4RjksCisJIDB4MDUsIDB4NjQsIDB4ODMsIDB4RkIsIDB4REYsIDB4RkUsIDB4MTksIDB4RkYsIDB4MjYsIDB4MDAsIDB4MjAsIDB4NDQsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsCisJIDB4NDMsIDB4NDUsIDB4QTQsIDB4RDEsIDB4REEsIDB4ODMsIDB4QzMsIDB4ODUsIDB4ODAsIDB4RTEsIDB4REYsIDB4RkUsIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDgsIDB4NjAsIDB4NDcsIDB4ODAsIDB4QkMsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NEEsIDB4RDcsIDB4ODAsIDB4QTEsIDB4RkYsIDB4RjYsIDB4MDIsCisJIDB4QkYsIDB4RkUsIDB4MTEsIDB4MDAsIDB4NDMsIDB4NDUsIDB4QTQsIDB4RDEsIDB4REEsIDB4ODMsIDB4MEQsIDB4MTgsIDB4NjQsIDB4NDQsIDB4MDAsIDB4NjEsCisJIDB4RkEsIDB4QTQsIDB4REQsIDB4ODEsIDB4RkQsIDB4MDIsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkUsCisJIDB4MDIsIDB4MDAsIDB4RjEsIDB4RkUsIDB4MDEsIDB4MDAsIDB4MjUsIDB4NDMsIDB4MjEsIDB4RTEsIDB4MDAsIDB4NjQsIDB4QkYsIDB4REIsIDB4MjAsIDB4NDQsCisJIDB4MjAsIDB4MkEsIDB4MDcsIDB4MDAsIDB4MDcsIDB4QjQsIDB4MDQsIDB4MzYsIDB4QzMsIDB4RkUsIDB4MDYsIDB4MzYsIDB4Q0MsIDB4RkUsIDB4MDcsIDB4MzYsCisJIDB4RDUsIDB4RkUsIDB4MjAsIDB4NDQsIDB4RDgsIDB4QjQsIDB4NDAsIDB4NDAsIDB4MUYsIDB4NjAsIDB4MkMsIDB4NjMsIDB4QkQsIDB4RDMsIDB4MDMsIDB4NjEsCisJIDB4MEYsIDB4MUIsIDB4MDQsIDB4QTMsIDB4QkQsIDB4RDMsIDB4MDQsIDB4NjEsIDB4MEIsIDB4MUIsIDB4MDQsIDB4QTMsIDB4QkQsIDB4RDMsIDB4MDYsIDB4NjEsCisJIDB4MDcsIDB4MUIsIDB4MDQsIDB4QTMsIDB4QkQsIDB4RDMsIDB4MDcsIDB4NjEsIDB4MDMsIDB4MUIsIDB4QzMsIDB4NjAsIDB4NTMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QTMsIDB4RDEsIDB4NDAsIDB4NDQsIDB4MjAsIDB4NDQsIDB4MDcsIDB4QjUsIDB4RDQsIDB4ODUsIDB4MzUsIDB4ODAsIDB4MjQsIDB4NDUsIDB4MUYsIDB4NjAsCisJIDB4NkMsIDB4NjQsIDB4NDQsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NDMsIDB4NDUsIDB4MjAsIDB4NDQsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsCisJIDB4NjQsIDB4NDMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDEsIDB4NDAsIDB4NDQsIDB4MTAsIDB4MjcsIDB4MTksIDB4MDAsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsCisJIDB4MDYsIDB4MDAsIDB4MjQsIDB4NDcsIDB4MDgsIDB4MkIsIDB4MTMsIDB4MDAsIDB4MDcsIDB4QjQsIDB4MDEsIDB4MzYsIDB4MTEsIDB4MDAsIDB4RkYsIDB4NjAsCisJIDB4N0YsIDB4NjUsIDB4MTUsIDB4NjAsIDB4QTIsIDB4NjQsIDB4MjQsIDB4NDAsIDB4MDgsIDB4MkIsIDB4QTQsIDB4ODQsIDB4QTAsIDB4NTcsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDksIDB4RkYsIDB4RkYsIDB4NjgsIDB4NDQsIDB4MDEsIDB4MTYsIDB4RkQsIDB4MDEsIDB4MDAsIDB4N0YsIDB4QTMsIDB4REIsIDB4QUIsIDB4MDEsCisJIDB4NjQsIDB4NDIsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QkQsIDB4RDksIDB4QTMsIDB4REIsIDB4QTMsIDB4MDEsCisJIDB4NDMsIDB4NDUsIDB4MjAsIDB4NDQsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4NjQsIDB4NDMsIDB4QkQsIDB4RDMsIDB4QTMsIDB4RDEsIDB4NDAsIDB4NDQsCisJIDB4MTAsIDB4MkIsIDB4MTYsIDB4MDAsIDB4QkUsIDB4RDEsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4ODAsIDB4RTcsIDB4MjQsIDB4NDAsIDB4MDcsIDB4MjcsCisJIDB4MDQsIDB4MDAsIDB4QUMsIDB4NEYsIDB4MTAsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUMsIDB4NjQsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsCisJIDB4RkUsIDB4MDEsIDB4MjQsIDB4NDAsIDB4MjAsIDB4MjcsIDB4MUQsIDB4MDAsIDB4QUMsIDB4NEYsIDB4RUYsIDB4QjQsIDB4QTAsIDB4NUMsIDB4MTksIDB4MDAsCisJIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsIDB4MDYsIDB4MDAsIDB4MjQsIDB4NDcsIDB4MDgsIDB4MkIsIDB4MTMsIDB4MDAsIDB4MDcsIDB4QjQsIDB4MDEsIDB4MzYsCisJIDB4MTEsIDB4MDAsIDB4MTUsIDB4NjAsIDB4MjIsIDB4NjQsIDB4MjQsIDB4NDAsIDB4MDgsIDB4MjcsIDB4ODAsIDB4QkMsIDB4N0MsIDB4NDgsIDB4QkUsIDB4RDMsCisJIDB4QTAsIDB4NTcsIDB4NjAsIDB4NDgsIDB4NjQsIDB4NDQsIDB4ODAsIDB4QkMsIDB4RkYsIDB4QjQsIDB4NjAsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsCisJIDB4RkUsIDB4MDEsIDB4NjksIDB4MDEsIDB4MDEsIDB4NjEsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjMsIDB4MDEsCisJIDB4MjgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MEYsIDB4QjQsIDB4OUEsIDB4MDAsIDB4RkYsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OUYsIDB4RkIsIDB4MjcsIDB4MDAsIDB4MEMsIDB4NjQsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsIDB4MjMsIDB4MDAsCisJIDB4MjksIDB4RjEsIDB4MEYsIDB4NjAsIDB4OUYsIDB4RkIsIDB4NUEsIDB4RDksIDB4MUMsIDB4NjAsIDB4RDAsIDB4NjQsIDB4N0YsIDB4RkIsIDB4RkYsIDB4RkYsCisJIDB4MkQsIDB4RkYsIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4NjAsIDB4MjIsIDB4NjMsIDB4MDksIDB4NjEsIDB4MUEsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4OUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NzcsIDB4MDAsIDB4RDMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4RDMsIDB4RkIsCisJIDB4MDYsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OUYsIDB4RkIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OUYsIDB4RkIsIDB4MUQsIDB4NjAsIDB4NEYsIDB4NjQsIDB4N0YsIDB4RkIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsCisJIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjksIDB4RjMsIDB4MTEsIDB4NjAsIDB4RjksIDB4NjUsIDB4NjAsIDB4NUMsIDB4M0YsIDB4NDAsCisJIDB4MDIsIDB4MkIsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MzcsIDB4MTEsIDB4MDAsIDB4MDEsIDB4M0IsIDB4NTUsIDB4MDAsIDB4MTEsIDB4NjAsIDB4MTksIDB4NjMsCisJIDB4RkYsIDB4QjcsIDB4NjAsIDB4NUMsIDB4QTMsIDB4RDMsIDB4MDgsIDB4QTMsIDB4MDAsIDB4N0UsIDB4RDAsIDB4ODAsIDB4RDcsIDB4ODAsIDB4MDIsIDB4MDMsCisJIDB4RjksIDB4MDIsIDB4NDksIDB4MDAsIDB4RjQsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDUsIDB4MDAsIDB4MDAsIDB4QkMsIDB4RjIsIDB4QTQsIDB4NDMsIDB4MDMsCisJIDB4NDIsIDB4MDcsIDB4NjQsIDB4NDQsIDB4NjQsIDB4RkIsIDB4ODIsIDB4RkIsIDB4QzgsIDB4NjQsIDB4ODEsIDB4RkIsIDB4MDcsIDB4NjQsIDB4ODMsIDB4RkIsCisJIDB4MUQsIDB4NjAsIDB4NEYsIDB4NjQsIDB4N0YsIDB4RkIsIDB4RkYsIDB4RkYsIDB4REYsIDB4RkUsIDB4MDAsIDB4NjQsIDB4MTksIDB4RkYsIDB4RjAsIDB4NjAsCisJIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODgsIDB4RkYsIDB4QkEsIDB4NjAsIDB4OTgsIDB4NzEsIDB4OEQsIDB4RTIsIDB4MDEsIDB4MTEsIDB4MDksIDB4MDAsCisJIDB4NzEsIDB4NDAsIDB4ODAsIDB4MjcsIDB4RkIsIDB4MDEsIDB4ODgsIDB4RTIsIDB4QkEsIDB4NjAsIDB4RDAsIDB4NjQsIDB4MDMsIDB4RkIsIDB4OEQsIDB4RkYsCisJIDB4MTUsIDB4MDAsIDB4OEQsIDB4RkYsIDB4QjEsIDB4NjAsIDB4RUQsIDB4NjMsIDB4MDYsIDB4NjAsIDB4MEIsIDB4RkQsIDB4RkYsIDB4RkYsIDB4NjIsIDB4RkYsCisJIDB4MUQsIDB4NjAsIDB4M0MsIDB4NjMsIDB4N0YsIDB4RkQsIDB4RkYsIDB4RkYsIDB4MUEsIDB4RkYsIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QTQsIDB4NjAsIDB4N0MsIDB4NjMsIDB4MDYsIDB4NjAsIDB4MEIsIDB4RkQsIDB4RkYsIDB4RkYsIDB4NjIsIDB4RkYsIDB4MjksIDB4RjUsIDB4MUYsIDB4NjAsCisJIDB4MjYsIDB4NjMsIDB4MUUsIDB4NjAsIDB4RjgsIDB4NjQsIDB4QkQsIDB4REIsIDB4NjYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MDIsIDB4NjQsIDB4QTMsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjksIDB4RkUsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4MDEsIDB4MDAsIDB4MzYsCisJIDB4NjcsIDB4MDEsIDB4MDEsIDB4MzYsIDB4NjksIDB4MDEsIDB4MDIsIDB4MzYsIDB4N0YsIDB4MDEsIDB4MDMsIDB4MzYsIDB4ODksIDB4MDEsIDB4MDQsIDB4MzYsCisJIDB4QzEsIDB4MDEsIDB4MDUsIDB4MzYsIDB4QkYsIDB4MDEsIDB4MDYsIDB4MzYsIDB4RjEsIDB4MDEsIDB4MDcsIDB4MzYsIDB4QkIsIDB4MDEsIDB4MDgsIDB4MzYsCisJIDB4OEEsIDB4MDEsIDB4MDksIDB4MzYsIDB4MEMsIDB4MDAsIDB4MEEsIDB4MzYsIDB4MEQsIDB4MDAsIDB4MEIsIDB4MzYsIDB4MEUsIDB4MDAsIDB4MEMsIDB4MzYsCisJIDB4MTcsIDB4MDAsIDB4MEQsIDB4MzYsIDB4MEQsIDB4MDAsIDB4MEUsIDB4MzYsIDB4MUQsIDB4MDAsIDB4MEYsIDB4MzYsIDB4NDEsIDB4MDAsIDB4MDIsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4MDgsIDB4MDAsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDUsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MDIsIDB4MDAsCisJIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MzIsIDB4NDUsIDB4QjQsIDB4ODUsIDB4NDUsIDB4NTIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4QjIsIDB4NjAsIDB4RDAsIDB4NjMsIDB4MDYsIDB4NjAsIDB4MEIsIDB4RkQsIDB4NjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MUEsIDB4RkYsIDB4MDAsIDB4NjcsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsIDB4MTUsIDB4MDAsIDB4ODgsIDB4RkYsIDB4QkEsIDB4NjAsIDB4OTgsIDB4NzEsCisJIDB4OEQsIDB4RTIsIDB4MDEsIDB4MTEsIDB4MDksIDB4MDAsIDB4NzEsIDB4NDAsIDB4ODAsIDB4MjcsIDB4RkIsIDB4MDEsIDB4ODgsIDB4RTIsIDB4QkEsIDB4NjAsCisJIDB4RDAsIDB4NjQsIDB4MDMsIDB4RkIsIDB4OEQsIDB4RkYsIDB4MTEsIDB4MDAsIDB4OEQsIDB4RkYsIDB4OTAsIDB4NjAsIDB4MDAsIDB4RTgsIDB4QjEsIDB4NjAsCisJIDB4RUQsIDB4NjMsIDB4MDQsIDB4MDAsIDB4OTEsIDB4NjAsIDB4MDAsIDB4RTgsIDB4QjIsIDB4NjAsIDB4QjYsIDB4NjMsIDB4MkEsIDB4RTgsIDB4MDYsIDB4NjAsCisJIDB4MEIsIDB4RkQsIDB4RkYsIDB4RkYsIDB4NjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MUEsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RUYsIDB4QjQsIDB4RDIsIDB4RkIsIDB4QUQsIDB4NEYsIDB4RkQsIDB4QjQsIDB4QTAsIDB4NUQsIDB4RDAsIDB4NjAsCisJIDB4MDAsIDB4RTgsIDB4MkEsIDB4RTgsIDB4RDksIDB4NjAsIDB4RkUsIDB4NjQsIDB4MzIsIDB4NDUsIDB4QTQsIDB4ODUsIDB4NDUsIDB4NTIsIDB4OTksIDB4RkYsCisJIDB4QTUsIDB4NEYsIDB4RkYsIDB4QjQsIDB4MDcsIDB4RkIsIDB4OTgsIDB4RkYsIDB4QTQsIDB4NjAsIDB4N0MsIDB4NjMsIDB4MDYsIDB4NjAsIDB4MEIsIDB4RkQsCisJIDB4NjIsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MzAsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MDAsIDB4RTEsIDB4MDcsIDB4MDIsCisJIDB4NjIsIDB4RkYsIDB4NjMsIDB4RkYsIDB4NjQsIDB4RkYsIDB4NjUsIDB4RkYsIDB4NjYsIDB4RkYsIDB4QkYsIDB4RkUsIDB4QTEsIDB4RkYsIDB4ODIsIDB4RkYsCisJIDB4ODgsIDB4RkYsIDB4NkMsIDB4NDAsIDB4NDEsIDB4RkYsIDB4QzQsIDB4RTIsIDB4NDMsIDB4RkYsIDB4NUMsIDB4NDksIDB4MDgsIDB4RTEsIDB4QTMsIDB4NjAsCisJIDB4MzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzAsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MDAsIDB4RTEsIDB4MDIsIDB4MDIsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4ODIsIDB4RkYsIDB4ODgsIDB4RkYsIDB4QTgsIDB4RTIsIDB4MDEsIDB4NzAsIDB4QUQsIDB4RjEsIDB4MDAsIDB4NkIsIDB4ODksIDB4RkYsIDB4NjQsIDB4NTQsCisJIDB4ODgsIDB4RkYsIDB4OUYsIDB4RkUsIDB4MDIsIDB4MDUsIDB4NjQsIDB4NDQsIDB4NjAsIDB4NTQsIDB4Q0QsIDB4RTIsIDB4QzIsIDB4NjQsIDB4M0EsIDB4REIsCisJIDB4QkMsIDB4RkYsIDB4QjUsIDB4RkYsIDB4MUQsIDB4RkYsIDB4MjYsIDB4NDQsIDB4MDIsIDB4QjQsIDB4NDAsIDB4NDYsIDB4M0MsIDB4NDQsIDB4MDAsIDB4QkMsCisJIDB4RkYsIDB4RkYsIDB4MDYsIDB4MDMsIDB4MjcsIDB4NDAsIDB4MjYsIDB4MjIsIDB4MDMsIDB4MDAsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsCisJIDB4MjcsIDB4NDQsIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QjAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4NUMsIDB4NDQsCisJIDB4MjcsIDB4NDQsIDB4MTgsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDAsIDB4RTEsIDB4QTQsIDB4RTIsIDB4QzQsIDB4RTIsIDB4NDcsIDB4RkYsIDB4QjYsIDB4RkYsCisJIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4MzIsIDB4RjEsIDB4MDgsIDB4MjksIDB4MDksIDB4MDAsIDB4NjQsIDB4NDAsIDB4MDcsIDB4MjIsIDB4MDYsIDB4MDAsCisJIDB4NDMsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MTAsIDB4QkMsIDB4NDAsIDB4NDcsIDB4MDAsIDB4NjQsIDB4MzIsIDB4RkIsIDB4MzEsIDB4NDEsIDB4M0MsIDB4NDQsCisJIDB4MDEsIDB4QjEsIDB4MDAsIDB4QkMsIDB4MEEsIDB4MDIsIDB4MDksIDB4MDMsIDB4MzIsIDB4RjMsIDB4MDAsIDB4N0MsIDB4MDEsIDB4QjQsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MDMsIDB4MzIsIDB4RjksIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsIDB4MDAsIDB4NjAsCisJIDB4MDAsIDB4NkIsIDB4MDAsIDB4NjQsIDB4MzMsIDB4RkIsIDB4MEMsIDB4NjAsIDB4MTYsIDB4NjQsIDB4QTAsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4RTEsIDB4MzAsIDB4NDAsIDB4MDIsIDB4MzYsIDB4QTEsIDB4RkYsIDB4ODMsIDB4RkYsIDB4OEQsIDB4RkYsIDB4NUMsIDB4NDQsIDB4NUMsIDB4NDMsCisJIDB4NUMsIDB4NDIsIDB4NUMsIDB4NDEsIDB4NUMsIDB4NDAsIDB4QUMsIDB4RkYsIDB4QUQsIDB4RkYsIDB4RTcsIDB4RTEsIDB4QjMsIDB4NjAsIDB4QkUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MzAsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MDAsIDB4RTEsIDB4MDMsIDB4MDIsIDB4MjgsIDB4RTIsIDB4NDAsIDB4RkYsIDB4QTEsIDB4RkYsCisJIDB4ODQsIDB4RkYsIDB4QzEsIDB4NjAsIDB4NkIsIDB4NjQsIDB4NDAsIDB4NDIsIDB4QjcsIDB4NjAsIDB4QTIsIDB4NjQsIDB4NDAsIDB4NDAsIDB4OUMsIDB4RjMsCisJIDB4NjUsIDB4RkIsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjMsIDB4QTksIDB4RjMsIDB4QkQsIDB4REIsIDB4MDAsIDB4NjAsIDB4OUEsIDB4NjQsIDB4QkQsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDQsIDB4NjQsIDB4QTMsIDB4REIsIDB4NUMsIDB4NDksIDB4MEEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4NUMsIDB4NUMsCisJIDB4MDEsIDB4NjAsIDB4MzksIDB4RTIsIDB4MDQsIDB4NjAsIDB4MDAsIDB4N0EsIDB4ODksIDB4RkYsIDB4MDMsIDB4NjAsIDB4RkYsIDB4NzMsIDB4ODgsIDB4RkYsCisJIDB4QjcsIDB4NjAsIDB4QTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzAsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MDAsIDB4RTEsIDB4MDYsIDB4MDIsIDB4NDAsIDB4RkYsCisJIDB4NDIsIDB4RkYsIDB4NDMsIDB4RkYsIDB4NDQsIDB4RkYsIDB4NDUsIDB4RkYsIDB4QTEsIDB4RkYsIDB4ODgsIDB4RkYsIDB4ODUsIDB4RkYsIDB4MjEsIDB4RTEsCisJIDB4NUMsIDB4NDAsIDB4QzMsIDB4NjAsIDB4NTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MzAsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MDAsIDB4RTEsCisJIDB4MDEsIDB4MDIsIDB4QTEsIDB4RkYsIDB4ODYsIDB4RkYsIDB4ODgsIDB4RkYsIDB4NUMsIDB4NDYsIDB4NUMsIDB4NDksIDB4NUMsIDB4NDAsIDB4RTEsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDAsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RUIsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4MTAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4REQsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4RTEsCisJIDB4QTMsIDB4RkYsIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4RTEsIDB4QTMsIDB4RkYsIDB4MUUsIDB4NjAsIDB4OUUsIDB4NjMsCisJIDB4MTcsIDB4RkQsIDB4QUUsIDB4RkYsIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODYsIDB4RjMsIDB4ODcsIDB4RjMsIDB4REMsIDB4ODEsCisJIDB4MDAsIDB4N0MsIDB4MDEsIDB4MDAsIDB4MDAsIDB4RkEsIDB4NjAsIDB4NDYsIDB4RkUsIDB4NjMsIDB4QTMsIDB4RDgsIDB4RkUsIDB4MUYsIDB4Q0QsIDB4ODEsCisJIDB4RDgsIDB4ODQsIDB4RjgsIDB4MDIsIDB4ODYsIDB4RjMsIDB4ODcsIDB4RjUsIDB4REMsIDB4ODEsIDB4ODAsIDB4NjcsIDB4NDAsIDB4NEEsIDB4MDUsIDB4MTgsCisJIDB4MkEsIDB4NDMsIDB4MDIsIDB4RkMsIDB4NUYsIDB4OEEsIDB4MDAsIDB4RjQsIDB4RkEsIDB4MDEsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4ODgsIDB4RjMsCisJIDB4MDYsIDB4NjEsIDB4MDAsIDB4N0MsIDB4NjAsIDB4NDYsIDB4RkUsIDB4NjMsIDB4QTMsIDB4RDgsIDB4RkUsIDB4MUYsIDB4Q0QsIDB4ODEsIDB4NjYsIDB4NDQsCisJIDB4RDgsIDB4ODQsIDB4RjgsIDB4MDIsIDB4MDksIDB4NjAsIDB4MkIsIDB4N0MsIDB4ODgsIDB4RjMsIDB4MDYsIDB4NjEsIDB4NjAsIDB4NDYsIDB4MDEsIDB4NjMsCisJIDB4NzYsIDB4RjgsIDB4MDAsIDB4RkMsIDB4NjMsIDB4NDcsIDB4MDYsIDB4RkEsIDB4NzYsIDB4RjgsIDB4MDMsIDB4NjQsIDB4NzcsIDB4RkEsIDB4REYsIDB4ODMsCisJIDB4NjYsIDB4NDQsIDB4Q0QsIDB4ODEsIDB4MDIsIDB4QTYsIDB4RjQsIDB4MDIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4OEEsIDB4RjEsIDB4ODksIDB4RjMsCisJIDB4N0MsIDB4NjMsIDB4OEMsIDB4RkIsIDB4NjAsIDB4NDYsIDB4MDEsIDB4RkMsIDB4REMsIDB4ODQsIDB4RDAsIDB4ODAsIDB4MDAsIDB4RkEsIDB4RkEsIDB4MDQsCisJIDB4OEQsIDB4RkIsIDB4NjAsIDB4NDYsIDB4MDAsIDB4NjQsIDB4MDAsIDB4RkEsIDB4NjMsIDB4NDQsIDB4ODAsIDB4N0YsIDB4MDEsIDB4RkEsIDB4OEEsIDB4RjMsCisJIDB4ODksIDB4RjEsIDB4REMsIDB4ODQsIDB4RDAsIDB4ODQsIDB4OEIsIDB4RkIsIDB4MDMsIDB4NjAsIDB4MjYsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4OEMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4MkUsIDB4RkIsIDB4ODIsIDB4RkYsIDB4NDAsIDB4NDIsIDB4ODcsIDB4RkYsIDB4OEIsIDB4RjMsCisJIDB4OTMsIDB4RkIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NTAsIDB4NjMsIDB4RkYsIDB4NjAsIDB4RkYsIDB4NjYsIDB4RkYsIDB4NjUsIDB4RkYsIDB4NjQsIDB4RkYsCisJIDB4NjEsIDB4RkYsIDB4NjIsIDB4RkYsIDB4NDksIDB4NjAsIDB4MDIsIDB4RTEsIDB4NTIsIDB4NjAsIDB4MDIsIDB4RTEsIDB4NUMsIDB4NjAsIDB4MDIsIDB4RTEsCisJIDB4NjUsIDB4NjAsIDB4MDIsIDB4RTEsIDB4NkIsIDB4NjAsIDB4MDIsIDB4RTEsIDB4NzYsIDB4NjAsIDB4MDIsIDB4RTEsIDB4NDEsIDB4NjAsIDB4MDIsIDB4RTEsCisJIDB4MDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OUYsIDB4RkIsIDB4MUYsIDB4NjAsIDB4NjQsIDB4NjQsIDB4N0YsIDB4RkIsIDB4MkQsIDB4RkYsIDB4MEEsIDB4NjEsCisJIDB4NDEsIDB4NEIsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OEMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RjAsIDB4NjcsCisJIDB4MEUsIDB4RkEsIDB4MUYsIDB4NjAsIDB4MEEsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTMsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MkIsIDB4NDEsIDB4NEQsIDB4OEIsIDB4RkYsIDB4RkYsIDB4RUEsIDB4MDIsIDB4MDksIDB4NjEsCisJIDB4NDEsIDB4NEIsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OEMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUUsIDB4NjAsCisJIDB4RkUsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTMsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4MkIsIDB4NDEsIDB4NEQsIDB4OEIsIDB4RkYsIDB4RkYsIDB4RUMsIDB4MDIsIDB4MUUsIDB4NjAsIDB4QjAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4RUEsIDB4MDAsIDB4RUIsIDB4NTAsIDB4NjAsIDB4MDMsIDB4RUEsIDB4NTEsIDB4NjAsIDB4MTMsIDB4RUEsIDB4NTIsIDB4NjAsIDB4MzAsIDB4RUEsCisJIDB4NTMsIDB4NjAsIDB4NDAsIDB4RUEsIDB4NTQsIDB4NjAsIDB4NTIsIDB4RUEsIDB4NTUsIDB4NjAsIDB4NkQsIDB4RUEsIDB4NTYsIDB4NjAsIDB4NzEsIDB4RUEsCisJIDB4NTcsIDB4NjAsIDB4OEIsIDB4RUEsIDB4NTgsIDB4NjAsIDB4NDcsIDB4RUEsIDB4NTksIDB4NjAsIDB4QTAsIDB4RUEsIDB4NUEsIDB4NjAsIDB4QjIsIDB4RUEsCisJIDB4NUIsIDB4NjAsIDB4QzEsIDB4RUEsIDB4NUMsIDB4NjAsIDB4RDcsIDB4RUEsIDB4NUQsIDB4NjAsIDB4RUIsIDB4RUEsIDB4NUUsIDB4NjAsIDB4QTAsIDB4RUEsCisJIDB4NTAsIDB4NjAsIDB4MzYsIDB4RUIsIDB4NTEsIDB4NjAsIDB4MzcsIDB4RUIsIDB4NTIsIDB4NjAsIDB4MjAsIDB4RUIsIDB4NTMsIDB4NjAsIDB4RTQsIDB4RUIsCisJIDB4NTQsIDB4NjAsIDB4MzQsIDB4RUIsIDB4NTUsIDB4NjAsIDB4NTgsIDB4RUIsIDB4NTYsIDB4NjAsIDB4NDgsIDB4RUIsIDB4NTcsIDB4NjAsIDB4RDAsIDB4RUIsCisJIDB4NTgsIDB4NjAsIDB4QzMsIDB4RUIsIDB4NTksIDB4NjAsIDB4RkMsIDB4RUIsIDB4NUEsIDB4NjAsIDB4MzQsIDB4RUIsIDB4NUIsIDB4NjAsIDB4NTgsIDB4RUIsCisJIDB4NUMsIDB4NjAsIDB4QzAsIDB4RUIsIDB4NUQsIDB4NjAsIDB4RDAsIDB4RUIsIDB4NUUsIDB4NjAsIDB4OTEsIDB4RUIsIDB4MDAsIDB4RUEsIDB4MDAsIDB4RUIsCisJIDB4RTAsIDB4NjAsIDB4MDIsIDB4RUEsIDB4RTAsIDB4NjAsIDB4MDMsIDB4RUIsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUIsIDB4QjAsIDB4NjAsIDB4MDAsIDB4RUIsCisJIDB4QUIsIDB4NDgsIDB4NDAsIDB4M0IsIDB4MDEsIDB4MDAsIDB4RkMsIDB4MDEsIDB4MDAsIDB4RUIsIDB4MDMsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTAsIDB4REIsCisJIDB4MEYsIDB4NjQsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsCisJIDB4MDAsIDB4RUEsIDB4MjQsIDB4NDQsIDB4RkYsIDB4QjQsIDB4MDQsIDB4RkIsIDB4NTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDUsIDB4RkIsIDB4MTAsIDB4NjAsCisJIDB4MTAsIDB4NzUsIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4NDAsIDB4NDAsIDB4MjYsIDB4NDAsIDB4MDAsIDB4MDUsIDB4NjAsCisJIDB4RjksIDB4RjEsIDB4NDIsIDB4NjAsIDB4MDgsIDB4NjQsIDB4MDksIDB4NjAsIDB4MTksIDB4NjMsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDQsIDB4MDAsCisJIDB4NDIsIDB4NjAsIDB4MDksIDB4NjQsIDB4MEEsIDB4NjAsIDB4MTksIDB4NjMsIDB4MTgsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDQsIDB4NjAsIDB4MDAsIDB4QkMsCisJIDB4MTgsIDB4NjAsIDB4MUUsIDB4RkIsIDB4MTgsIDB4NjAsIDB4MUQsIDB4RkQsIDB4MUQsIDB4NjAsIDB4MTksIDB4NjMsIDB4MTgsIDB4NjAsIDB4MjEsIDB4RkQsCisJIDB4ODAsIDB4NjAsIDB4MUMsIDB4NjQsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDIsIDB4MDAsIDB4NjAsIDB4NjAsIDB4MUMsIDB4NjQsIDB4MTgsIDB4NjAsCisJIDB4MjMsIDB4RkIsIDB4MTgsIDB4NjAsIDB4MUYsIDB4RkIsIDB4MTgsIDB4NjAsIDB4MjIsIDB4RjMsIDB4QTAsIDB4NTAsIDB4QTAsIDB4NTAsIDB4MEIsIDB4NjAsCisJIDB4RjgsIDB4NjMsIDB4QTMsIDB4RDEsIDB4MzAsIDB4NjAsIDB4MzgsIDB4NjEsIDB4QTEsIDB4RDMsIDB4RjgsIDB4QTMsIDB4OTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4QTMsIDB4RDEsIDB4NTksIDB4RDMsIDB4MDYsIDB4QTMsIDB4OTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QTMsIDB4RDEsIDB4NTksIDB4RDMsIDB4RkUsIDB4QTMsCisJIDB4OTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QTMsIDB4RDEsIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4OTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4ODAsIDB4NjAsCisJIDB4NTgsIDB4RUMsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUQsIDB4ODAsIDB4NjAsIDB4ODAsIDB4RUUsIDB4NDAsIDB4RUMsIDB4MDAsIDB4RUQsIDB4MDAsIDB4RUUsCisJIDB4QzAsIDB4NjAsIDB4NTksIDB4RUMsIDB4QzAsIDB4NjAsIDB4MDcsIDB4RUQsIDB4QzAsIDB4NjAsIDB4OEYsIDB4RUUsIDB4QUQsIDB4NEYsIDB4RkEsIDB4QjQsCisJIDB4QTAsIDB4NUQsIDB4MDAsIDB4RjMsIDB4MjgsIDB4RkIsIDB4NDAsIDB4NDQsIDB4QTIsIDB4NjAsIDB4RTgsIDB4N0MsIDB4MjAsIDB4RjksIDB4MUQsIDB4NjAsCisJIDB4RDAsIDB4N0MsIDB4MjEsIDB4RjksIDB4MUQsIDB4NjAsIDB4RTYsIDB4N0MsIDB4MjIsIDB4RjksIDB4MUUsIDB4NjAsIDB4NDQsIDB4N0MsIDB4MjMsIDB4RjksCisJIDB4MUUsIDB4NjAsIDB4NTUsIDB4N0MsIDB4MjQsIDB4RjksIDB4MUUsIDB4NjAsIDB4N0YsIDB4N0MsIDB4MjUsIDB4RjksIDB4MUUsIDB4NjAsIDB4OTAsIDB4N0MsCisJIDB4MjYsIDB4RjksIDB4RDAsIDB4NjAsIDB4MDAsIDB4RTgsIDB4MjgsIDB4RTgsIDB4NDQsIDB4NjAsIDB4MDEsIDB4RTYsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NTIsCisJIDB4MTAsIDB4NjAsIDB4MDQsIDB4RTYsIDB4MDgsIDB4NjAsIDB4MDYsIDB4NjMsIDB4RkQsIDB4NjAsIDB4MEMsIDB4NjUsIDB4NUIsIDB4RDMsIDB4QkYsIDB4RDEsCisJIDB4MEMsIDB4MTgsIDB4QzMsIDB4ODMsIDB4RDQsIDB4ODAsIDB4QzMsIDB4ODMsIDB4RjksIDB4MDIsIDB4RkEsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDIsIDB4NjAsCisJIDB4MDAsIDB4NjUsIDB4RjksIDB4QTAsIDB4RkMsIDB4QTAsIDB4MDksIDB4MDUsIDB4MDAsIDB4MDUsIDB4MjEsIDB4NjAsIDB4MDAsIDB4NjUsIDB4M0YsIDB4NDMsCisJIDB4MjEsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QzAsIDB4NjAsIDB4OEYsIDB4RUUsIDB4MDgsIDB4MDAsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MDAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4MTgsIDB4RkIsIDB4M0YsIDB4NDMsIDB4MTEsIDB4NjAsIDB4MTAsIDB4RTYsIDB4QjcsIDB4ODQsIDB4NDAsIDB4NUYsIDB4MzAsIDB4NjAsCisJIDB4MjAsIDB4NjMsIDB4M0YsIDB4NDAsIDB4MjAsIDB4MjcsIDB4MDYsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QkQsIDB4REIsIDB4MEYsIDB4NjAsCisJIDB4RjAsIDB4NjQsIDB4MDMsIDB4MDAsIDB4MEYsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDAsIDB4NjQsIDB4QTMsIDB4REIsIDB4MDAsIDB4NjAsIDB4MzAsIDB4RTIsCisJIDB4MDAsIDB4NjAsIDB4NTAsIDB4RTIsIDB4MDAsIDB4NjAsIDB4NzksIDB4RTIsIDB4MDAsIDB4NjAsIDB4OTAsIDB4RTIsIDB4MDEsIDB4NjAsIDB4RDAsIDB4RTIsCisJIDB4MDEsIDB4NjAsIDB4RjAsIDB4RTIsIDB4MDEsIDB4NjAsIDB4QjAsIDB4RTIsIDB4MTMsIDB4NjQsIDB4QUQsIDB4RkIsIDB4MDEsIDB4NjAsIDB4NjcsIDB4NjQsCisJIDB4MzcsIDB4RkIsIDB4MDAsIDB4NjAsIDB4NTAsIDB4NjQsIDB4MzYsIDB4RkIsIDB4MDksIDB4NjAsIDB4MkEsIDB4NjQsIDB4OTgsIDB4RkIsIDB4ODIsIDB4RkYsCisJIDB4OTIsIDB4RkYsIDB4NUMsIDB4NDEsIDB4NUMsIDB4NDYsIDB4NUMsIDB4NDcsIDB4MDAsIDB4RTEsIDB4QTQsIDB4NjAsIDB4N0MsIDB4NjMsIDB4MEMsIDB4NjAsCisJIDB4MTYsIDB4NjQsIDB4QTAsIDB4REQsIDB4ODcsIDB4RkYsIDB4OTcsIDB4RkYsIDB4MEMsIDB4NjAsIDB4MDIsIDB4NjQsIDB4NDAsIDB4NUEsIDB4MDYsIDB4QTQsCisJIDB4NDAsIDB4NUIsIDB4NUMsIDB4NUUsIDB4MTMsIDB4NjAsIDB4NTIsIDB4RjMsIDB4NjQsIDB4RkIsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MjIsIDB4MDMsIDB4MDAsCisJIDB4ODAsIDB4NjAsIDB4MzcsIDB4N0MsIDB4MDIsIDB4MDAsIDB4ODAsIDB4NjAsIDB4MjcsIDB4N0MsIDB4MTYsIDB4NjAsIDB4NTUsIDB4RjksIDB4MDAsIDB4NjAsCisJIDB4ODAsIDB4NjQsIDB4ODksIDB4RkIsIDB4MDIsIDB4NjAsIDB4ODAsIDB4NjYsIDB4MjIsIDB4NjAsIDB4MjIsIDB4NjQsIDB4NzcsIDB4NjAsIDB4NzcsIDB4NjMsCisJIDB4MDAsIDB4RkEsIDB4MDEsIDB4RkMsIDB4MDAsIDB4RjAsIDB4MDEsIDB4RjAsIDB4RDAsIDB4ODAsIDB4RDMsIDB4ODAsIDB4MUUsIDB4MDIsIDB4MUQsIDB4MDIsCisJIDB4MDYsIDB4NjAsIDB4ODAsIDB4NjUsIDB4NDUsIDB4NEEsIDB4QUEsIDB4NDYsIDB4MDAsIDB4RkMsIDB4MDEsIDB4RkEsIDB4QUEsIDB4NDYsIDB4MDAsIDB4RjAsCisJIDB4MkEsIDB4NDEsIDB4NTAsIDB4NjUsIDB4RDMsIDB4ODAsIDB4Q0QsIDB4ODQsIDB4MTMsIDB4MDMsIDB4MEEsIDB4NjAsIDB4ODAsIDB4NjUsIDB4NDUsIDB4NEEsCisJIDB4QUEsIDB4NDYsIDB4MDAsIDB4RkMsIDB4MDEsIDB4RkEsIDB4QUEsIDB4NDYsIDB4MDAsIDB4RjAsIDB4NjUsIDB4NDEsIDB4QzgsIDB4NjUsIDB4RDMsIDB4ODAsCisJIDB4Q0QsIDB4ODQsIDB4MDYsIDB4MDMsIDB4MTIsIDB4NjAsIDB4N0YsIDB4NjQsIDB4MDMsIDB4MDAsIDB4MTAsIDB4NjUsIDB4MDIsIDB4NjAsIDB4N0YsIDB4NjQsCisJIDB4NjUsIDB4NDMsIDB4ODYsIDB4RkQsIDB4MEYsIDB4NjAsIDB4NUIsIDB4RkQsIDB4MDcsIDB4NjEsIDB4QzUsIDB4ODEsIDB4RTEsIDB4ODUsIDB4RDQsIDB4ODQsCisJIDB4OEEsIDB4RkIsIDB4REMsIDB4ODQsIDB4ODgsIDB4RkIsIDB4MEMsIDB4QTQsIDB4ODcsIDB4RkIsIDB4MEYsIDB4NjAsIDB4NUMsIDB4RkIsIDB4MUUsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4RDMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4NDAsCisJIDB4NDAsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MTgsIDB4NjAsIDB4MjAsIDB4RjMsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NTAsIDB4QTQsIDB4NTIsIDB4MDAsIDB4NjQsCisJIDB4MEEsIDB4NjAsIDB4N0UsIDB4RkIsIDB4MUUsIDB4NjAsIDB4RjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUMsIDB4NTEsIDB4M0YsIDB4NDEsIDB4QTUsIDB4NEMsCisJIDB4NTAsIDB4MzcsIDB4MEIsIDB4MDAsIDB4MDEsIDB4QjksIDB4NDEsIDB4NUYsIDB4QjUsIDB4NjAsIDB4NTUsIDB4RTAsIDB4MDUsIDB4NjAsIDB4RjksIDB4RjEsCisJIDB4QzAsIDB4NjcsIDB4OTAsIDB4ODQsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MjYsIDB4QTAsIDB4NTAsIDB4MDYsIDB4NjAsIDB4MDgsIDB4RjMsIDB4MDEsIDB4NjAsCisJIDB4MDEsIDB4NjUsIDB4MDEsIDB4NjAsIDB4MDIsIDB4N0MsIDB4RDQsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDEsIDB4MDMsIDB4MTAsIDB4MDIsIDB4NUEsIDB4RDEsCisJIDB4NUEsIDB4RDMsIDB4M0UsIDB4NjAsIDB4MDAsIDB4NjYsIDB4RTAsIDB4ODcsIDB4NDAsIDB4NEEsIDB4RjcsIDB4NjAsIDB4OEMsIDB4NjEsIDB4NjQsIDB4NDQsCisJIDB4QzgsIDB4ODQsIDB4MEMsIDB4NjMsIDB4QUEsIDB4NDYsIDB4NTgsIDB4RDAsIDB4QUEsIDB4NDYsIDB4NTksIDB4RDgsIDB4RkIsIDB4MUYsIDB4MDgsIDB4NjAsCisJIDB4MDAsIDB4NjMsIDB4RkEsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QkQsIDB4RDMsIDB4QTMsIDB4RDMsIDB4MDIsIDB4QTgsIDB4RDQsIDB4ODAsIDB4MDcsIDB4MDIsCisJIDB4MDYsIDB4MDIsIDB4NDksIDB4NjAsIDB4NEMsIDB4NjEsIDB4M0MsIDB4NjAsIDB4MDAsIDB4NjYsIDB4NDEsIDB4NEIsIDB4MDMsIDB4MDAsIDB4MjQsIDB4NjAsCisJIDB4ODQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkIsIDB4NDEsIDB4NDksIDB4NjAsIDB4OTQsIDB4N0MsIDB4RDEsIDB4ODAsIDB4QTEsIDB4RDIsIDB4MjUsIDB4MDUsCisJIDB4NTksIDB4RDAsIDB4NjAsIDB4NDUsIDB4NTksIDB4RDIsIDB4NDQsIDB4NDcsIDB4RTAsIDB4ODcsIDB4NDAsIDB4NEEsIDB4NTksIDB4RDIsIDB4NTksIDB4OEIsCisJIDB4NDAsIDB4NEMsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QkUsIDB4RDMsIDB4QkQsIDB4RDEsIDB4RUMsIDB4MTgsIDB4RDQsIDB4ODAsIDB4RUEsIDB4MTgsCisJIDB4MDMsIDB4MDMsIDB4QzMsIDB4ODMsIDB4QzMsIDB4ODMsIDB4RjcsIDB4MDEsIDB4NjcsIDB4NDQsIDB4QzAsIDB4ODQsIDB4RTAsIDB4ODUsIDB4MkMsIDB4NDQsCisJIDB4RDQsIDB4ODAsIDB4NjMsIDB4NDEsIDB4MDEsIDB4MDYsIDB4NjUsIDB4NDQsIDB4QzgsIDB4ODMsIDB4QUEsIDB4NDYsIDB4NTksIDB4RDEsIDB4MjcsIDB4RDgsCisJIDB4NUEsIDB4ODcsIDB4RkMsIDB4MUYsIDB4QUEsIDB4NDYsIDB4MkIsIDB4NDEsIDB4RDUsIDB4MDEsIDB4NDksIDB4NjAsIDB4OTQsIDB4NjEsIDB4NDEsIDB4NEIsCisJIDB4MkIsIDB4NDEsIDB4NDksIDB4NjAsIDB4OTQsIDB4N0MsIDB4RDEsIDB4ODAsIDB4QTEsIDB4RDIsIDB4MjcsIDB4MDUsIDB4NTksIDB4RDAsIDB4NjAsIDB4NDUsCisJIDB4NTksIDB4RDIsIDB4NDQsIDB4NDcsIDB4RTAsIDB4ODcsIDB4NDAsIDB4NEEsIDB4NTksIDB4RDIsIDB4NTksIDB4OEIsIDB4NDAsIDB4NEMsIDB4MDgsIDB4NjAsCisJIDB4MDAsIDB4NjMsIDB4QkUsIDB4RDMsIDB4QkQsIDB4RDEsIDB4RUMsIDB4MTgsIDB4RDQsIDB4ODAsIDB4RUEsIDB4MTgsIDB4MDMsIDB4MDMsIDB4QzMsIDB4ODMsCisJIDB4QzMsIDB4ODMsIDB4RjcsIDB4MDEsIDB4MDQsIDB4QTMsIDB4QTMsIDB4RDEsIDB4NUEsIDB4ODgsIDB4MkMsIDB4NDMsIDB4RDMsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MDYsIDB4NjQsIDB4NDMsIDB4Q0YsIDB4ODMsIDB4QUEsIDB4NDYsIDB4NjAsIDB4RkUsIDB4MjgsIDB4RDEsIDB4NUUsIDB4ODgsIDB4MjcsIDB4RDgsCisJIDB4NUEsIDB4ODcsIDB4RkIsIDB4MUYsIDB4MjAsIDB4RkUsIDB4QUEsIDB4NDYsIDB4RDMsIDB4MDEsIDB4RkEsIDB4NjAsIDB4MzksIDB4NjUsIDB4MjQsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4QkUsIDB4RDEsIDB4MDcsIDB4NjAsIDB4RUQsIDB4RjksIDB4MDcsIDB4NjAsCisJIDB4RUQsIDB4RjMsIDB4MjAsIDB4NjAsIDB4MDAsIDB4N0MsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MDcsIDB4NjAsIDB4RUMsIDB4RjksCisJIDB4MDcsIDB4NjAsIDB4RUIsIDB4RjksIDB4MTIsIDB4MDAsIDB4MDQsIDB4QjAsIDB4MTAsIDB4NjAsIDB4NTUsIDB4RjMsIDB4MEUsIDB4MDMsIDB4MDIsIDB4QkMsCisJIDB4QTIsIDB4REIsIDB4MDcsIDB4NjAsIDB4RjUsIDB4RkIsIDB4MTAsIDB4NjAsIDB4RTgsIDB4RjMsIDB4MTAsIDB4NjAsIDB4QUMsIDB4RjMsIDB4MDIsIDB4QkQsCisJIDB4MDIsIDB4QkMsIDB4QTIsIDB4REIsIDB4NjUsIDB4NDQsIDB4MTAsIDB4NjAsIDB4RTgsIDB4RkIsIDB4MDcsIDB4NjAsIDB4RUQsIDB4RjMsIDB4MzEsIDB4NDEsCisJIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkEsIDB4NDAsIDB4QjksIDB4NDAsIDB4MjYsIDB4MDMsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4ODAsIDB4QjksCisJIDB4NDEsIDB4NTEsIDB4RkEsIDB4NjAsIDB4M0EsIDB4NjUsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsCisJIDB4MjMsIDB4NjAsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUIsIDB4RDMsIDB4RjgsIDB4NjAsIDB4M0YsIDB4NjUsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4MTAsIDB4NjAsIDB4RjcsIDB4RjMsIDB4RTAsIDB4OUMsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MTAsIDB4NjAsIDB4RkEsIDB4RjMsIDB4RTAsIDB4OUMsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjEsIDB4NjAsIDB4RkEsIDB4NjEsIDB4QTMsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QTEsIDB4RDMsIDB4RTAsIDB4OUMsIDB4QTQsIDB4ODQsCisJIDB4QjAsIDB4ODQsIDB4QTEsIDB4REIsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NTksIDB4RDMsCisJIDB4RTAsIDB4OUMsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTEsIDB4REIsIDB4MTEsIDB4NjAsIDB4MDAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTEsIDB4NjAsCisJIDB4MDMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTEsIDB4NjAsIDB4MDYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MTEsIDB4NjAsIDB4MDksIDB4RjMsIDB4RTAsIDB4OUMsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTEsIDB4NjAsIDB4MEMsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MTEsIDB4NjAsIDB4MEYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDIsIDB4QTMsIDB4QTMsIDB4RDMsIDB4RjgsIDB4NjAsIDB4M0YsIDB4NjUsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MTEsIDB4NjAsIDB4MTIsIDB4RjMsIDB4RTAsIDB4OUMsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MTEsIDB4NjAsIDB4MTUsIDB4RjMsIDB4RTAsIDB4OUMsIDB4QTQsIDB4ODQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjIsIDB4NjAsCisJIDB4MzAsIDB4NjEsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QTEsIDB4RDMsCisJIDB4RTAsIDB4OUMsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTEsIDB4REIsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4NTksIDB4RDMsIDB4RTAsIDB4OUMsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTEsIDB4REIsIDB4MTEsIDB4NjAsIDB4MUIsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MTEsIDB4NjAsIDB4MUUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTEsIDB4NjAsIDB4MjEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QTMsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MTEsIDB4NjAsIDB4MjQsIDB4RjMsIDB4RTAsIDB4OUMsCisJIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4MTEsIDB4NjAsIDB4MjcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTEsIDB4NjAsIDB4MkEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsIDB4NkEsIDB4NjMsCisJIDB4MjIsIDB4NjAsIDB4NTYsIDB4NjEsIDB4MjEsIDB4NjAsIDB4RUEsIDB4NjQsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MTEsIDB4NjAsCisJIDB4MzMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsCisJIDB4MTEsIDB4NjAsIDB4MzcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsIDB4MTEsIDB4NjAsIDB4MzksIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsIDB4MTEsIDB4NjAsIDB4NDAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsIDB4MTEsIDB4NjAsCisJIDB4NDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsIDB4MTEsIDB4NjAsIDB4NEUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsCisJIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsIDB4MTEsIDB4NjAsIDB4NTIsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsIDB4MTEsIDB4NjAsIDB4NTQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsIDB4MTEsIDB4NjAsCisJIDB4NUIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsIDB4MTEsIDB4NjAsIDB4NUQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsCisJIDB4QTIsIDB4REIsIDB4RkEsIDB4NjAsIDB4MkMsIDB4NjUsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4MDMsCisJIDB4NjMsIDB4NDUsIDB4MjMsIDB4NjAsIDB4RjAsIDB4NjMsIDB4MDYsIDB4NjEsIDB4QTUsIDB4RDEsIDB4REEsIDB4ODUsIDB4NjQsIDB4NDQsIDB4MEYsIDB4QjQsCisJIDB4QkQsIDB4REIsIDB4NjQsIDB4NDcsIDB4MEYsIDB4QjQsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsIDB4RjYsIDB4MDIsIDB4RkEsIDB4NjAsIDB4MzAsIDB4NjUsCisJIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDMsIDB4QkQsIDB4RDMsIDB4NjMsIDB4NDYsIDB4MjQsIDB4NjAsCisJIDB4ODgsIDB4NjMsIDB4MTIsIDB4NjAsIDB4NTMsIDB4RkIsIDB4REEsIDB4ODUsIDB4QkQsIDB4REIsIDB4MEUsIDB4NjEsIDB4QTYsIDB4RDEsIDB4REEsIDB4ODYsCisJIDB4NjQsIDB4NDQsIDB4RkYsIDB4QjQsIDB4QTUsIDB4REIsIDB4REEsIDB4ODUsIDB4NjQsIDB4NDcsIDB4RkYsIDB4QjQsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsCisJIDB4RjUsIDB4MDIsIDB4RkEsIDB4NjAsIDB4MzEsIDB4NjUsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4MDMsCisJIDB4QkQsIDB4RDMsIDB4MTIsIDB4NjAsIDB4NzEsIDB4RkIsIDB4NUEsIDB4ODEsIDB4MTIsIDB4NjAsIDB4ODAsIDB4RkIsIDB4NUEsIDB4ODIsIDB4MTIsIDB4NjAsCisJIDB4OEYsIDB4RkIsIDB4NUEsIDB4ODMsIDB4MTIsIDB4NjAsIDB4OUUsIDB4RkIsIDB4NUEsIDB4ODQsIDB4MEUsIDB4NjEsIDB4QkQsIDB4RDEsIDB4QkQsIDB4RDUsCisJIDB4NjQsIDB4NDQsIDB4RkYsIDB4QjQsIDB4MjEsIDB4REIsIDB4NUEsIDB4ODEsIDB4NjQsIDB4NDcsIDB4RkYsIDB4QjQsIDB4MjIsIDB4REIsIDB4NUEsIDB4ODIsCisJIDB4NjYsIDB4NDQsIDB4RkYsIDB4QjQsIDB4MjMsIDB4REIsIDB4NUEsIDB4ODMsIDB4NjYsIDB4NDcsIDB4RkYsIDB4QjQsIDB4MjQsIDB4REIsIDB4Q0QsIDB4ODEsCisJIDB4NUEsIDB4ODQsIDB4RUMsIDB4MDIsIDB4RkEsIDB4NjAsIDB4NDcsIDB4NjUsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTEsIDB4MDMsIDB4NjMsIDB4NDUsIDB4MjUsIDB4NjAsIDB4NUEsIDB4NjMsIDB4QTUsIDB4RDEsIDB4REEsIDB4ODUsIDB4QkQsIDB4RDksIDB4MDIsIDB4NjEsCisJIDB4QTUsIDB4RDEsIDB4REEsIDB4ODUsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0UsIDB4QkQsIDB4REIsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0UsIDB4Q0QsIDB4ODEsCisJIDB4QkQsIDB4REIsIDB4RjYsIDB4MDIsIDB4RkEsIDB4NjAsIDB4MkUsIDB4NjUsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MUYsIDB4MDMsIDB4NjMsIDB4NDYsIDB4RkMsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MjQsIDB4NjAsIDB4MDgsIDB4NjMsIDB4Q0MsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4Q0MsIDB4ODEsIDB4MDAsIDB4MzYsIDB4MEQsIDB4MDAsIDB4NjMsIDB4NDUsIDB4QTYsIDB4RDMsIDB4NUEsIDB4RDEsIDB4REEsIDB4ODYsIDB4RkYsIDB4QjQsCisJIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODQsIDB4NUMsIDB4OTAsIDB4QkQsIDB4RDksIDB4RkQsIDB4MDIsIDB4Q0QsIDB4ODEsIDB4NjYsIDB4NDIsIDB4RjQsIDB4MDIsCisJIDB4NjYsIDB4NDIsIDB4NUEsIDB4RDMsIDB4MjQsIDB4NjAsIDB4NDgsIDB4NjUsIDB4QkQsIDB4REIsIDB4RDcsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MDIsCisJIDB4MjUsIDB4NjAsIDB4NkUsIDB4NjEsIDB4RkEsIDB4NjAsIDB4NDYsIDB4NjUsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MDMsIDB4QTEsIDB4REQsIDB4RDksIDB4ODEsIDB4RkEsIDB4NjAsIDB4MkYsIDB4NjUsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OTcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4QTEsIDB4REQsIDB4RDksIDB4ODEsIDB4RkEsIDB4NjAsIDB4M0UsIDB4NjUsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4QTEsIDB4REQsIDB4RDksIDB4ODEsIDB4RkEsIDB4NjAsIDB4M0YsIDB4NjUsIDB4MjQsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4QTEsIDB4REQsIDB4RDksIDB4ODEsIDB4RkEsIDB4NjAsIDB4NDAsIDB4NjUsCisJIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4QTEsIDB4REQsIDB4RDksIDB4ODEsIDB4RkEsIDB4NjAsCisJIDB4M0IsIDB4NjUsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4QTEsIDB4REQsIDB4RkEsIDB4NjAsCisJIDB4NDgsIDB4NjUsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MDMsIDB4QkQsIDB4RDMsIDB4MjUsIDB4NjAsCisJIDB4Q0EsIDB4NjEsIDB4MEUsIDB4QjQsIDB4QkQsIDB4RDEsIDB4QTEsIDB4REIsIDB4NjQsIDB4NDcsIDB4MEUsIDB4QjQsIDB4QTMsIDB4RDEsIDB4NTksIDB4REIsCisJIDB4NjQsIDB4NDQsIDB4MEUsIDB4QjQsIDB4NTksIDB4REIsIDB4NjQsIDB4NDcsIDB4MEUsIDB4QjQsIDB4NTksIDB4REIsIDB4RkEsIDB4NjAsIDB4MjksIDB4NjUsCisJIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4MDQsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MjAsIDB4NjAsCisJIDB4MDAsIDB4NjUsIDB4QjQsIDB4ODQsIDB4MTAsIDB4NjAsIDB4MjksIDB4RkIsIDB4RkEsIDB4NjAsIDB4MkEsIDB4NjUsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzksIDB4MDMsIDB4MDQsIDB4QTMsIDB4QkQsIDB4RDEsIDB4MTAsIDB4NjAsIDB4Q0QsIDB4RjMsIDB4NjQsIDB4NDEsCisJIDB4NjQsIDB4NUUsIDB4QTIsIDB4REIsIDB4NjQsIDB4NDcsIDB4NUEsIDB4RDMsIDB4NjAsIDB4NUMsIDB4NjQsIDB4NUYsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsCisJIDB4RTMsIDB4RjMsIDB4RkYsIDB4NjAsIDB4QzAsIDB4QjUsIDB4NjEsIDB4NDAsIDB4ODAsIDB4MjcsIDB4MDUsIDB4MDAsIDB4RTksIDB4ODcsIDB4M0YsIDB4QjQsCisJIDB4QjQsIDB4ODQsIDB4QTIsIDB4REIsIDB4MUUsIDB4MDAsIDB4NjUsIDB4NDQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4REMsIDB4RjEsIDB4RTEsIDB4ODAsCisJIDB4RjksIDB4ODEsIDB4RTEsIDB4ODAsIDB4RjksIDB4ODQsIDB4RkYsIDB4NjAsIDB4ODAsIDB4QjQsIDB4QzAsIDB4OUMsIDB4QTIsIDB4RDksIDB4MTAsIDB4NjAsCisJIDB4REYsIDB4RjEsIDB4RkYsIDB4RkYsIDB4QzAsIDB4OUMsIDB4QTIsIDB4RDksIDB4MTAsIDB4NjAsIDB4RTYsIDB4RjEsIDB4MDEsIDB4N0UsIDB4NjAsIDB4NDcsCisJIDB4NjAsIDB4NDEsIDB4NjQsIDB4NDQsIDB4RkUsIDB4NjAsIDB4MDAsIDB4QjUsIDB4QzEsIDB4ODQsIDB4MDEsIDB4NjAsIDB4RkYsIDB4QjQsIDB4QjQsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4REIsIDB4ODMsIDB4MTEsIDB4NjAsIDB4NjIsIDB4RkQsIDB4RkEsIDB4NjAsIDB4MkIsIDB4NjUsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4MDQsIDB4QTMsIDB4QkQsIDB4RDMsIDB4MTAsIDB4NjAsIDB4RDAsIDB4RkIsIDB4QTMsIDB4RDMsCisJIDB4MTAsIDB4NjAsIDB4OTQsIDB4RkIsIDB4RkEsIDB4NjAsIDB4M0MsIDB4NjUsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MUYsIDB4MDMsIDB4QTMsIDB4RDMsIDB4RkMsIDB4NjAsIDB4RkMsIDB4NjUsIDB4QTQsIDB4ODQsIDB4NjAsIDB4NUMsIDB4MDAsIDB4N0UsIDB4QzAsIDB4NjAsCisJIDB4MDAsIDB4QTAsIDB4NjAsIDB4NDMsIDB4MDcsIDB4MDQsIDB4MTAsIDB4NjAsIDB4RDQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4NjAsIDB4RkYsIDB4QjQsCisJIDB4M0MsIDB4OTQsIDB4QTIsIDB4REIsIDB4MjEsIDB4NjAsIDB4MzAsIDB4NjEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4QzAsIDB4QTAsIDB4NjAsIDB4NDcsCisJIDB4MDcsIDB4MDQsIDB4NjAsIDB4NDMsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4NjAsIDB4RkYsIDB4QjQsIDB4M0MsIDB4OTQsIDB4QTEsIDB4REIsCisJIDB4QjgsIDB4RkUsIDB4QjksIDB4RkUsIDB4QkEsIDB4RkUsIDB4QkIsIDB4RkUsIDB4QkQsIDB4RkUsIDB4QkYsIDB4RkUsIDB4MTUsIDB4NjAsIDB4Q0IsIDB4RjMsCisJIDB4MTIsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDQsIDB4MDAsIDB4MEIsIDB4NjAsIDB4RUEsIDB4NjIsIDB4NUEsIDB4REYsIDB4RkUsIDB4MUYsCisJIDB4MUYsIDB4NjAsIDB4QzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MDYsIDB4NjMsIDB4QkUsIDB4RDMsIDB4QkQsIDB4RDEsIDB4MDcsIDB4MTgsCisJIDB4RDQsIDB4ODAsIDB4MDUsIDB4MTgsIDB4MDMsIDB4MDMsIDB4QzMsIDB4ODMsIDB4QzMsIDB4ODMsIDB4RjcsIDB4MDEsIDB4REIsIDB4ODMsIDB4MDAsIDB4QkMsCisJIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4ODYsIDB4RkQsIDB4QjAsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MTAsIDB4RkQsIDB4MzIsIDB4MDEsCisJIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MTQsIDB4RkQsIDB4OTQsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MDAsIDB4NDEsIDB4RkEsIDB4NDYsIDB4MjMsCisJIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NDIsIDB4RkEsIDB4NjgsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NDMsIDB4RkEsIDB4OEEsIDB4MjMsCisJIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NDQsIDB4RkEsIDB4QUMsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NDUsIDB4RkEsIDB4Q0UsIDB4MjMsCisJIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4MjUsIDB4RkQsIDB4NjIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsCisKK307ICAvKiBmd19pbWFnZV8zX2RhdGEgKi8KKworc3RhdGljIGNvbnN0IGhjZl84IGZ3X2ltYWdlXzRfZGF0YVtdID0geworCSAweDZDLCAweDQwLCAweEExLCAweEZGLCAweDk4LCAweEZGLCAweDgwLCAweDNFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDQxLCAweEZGLCAweDMzLCAweEYzLCAweDMyLCAweDExLCAweDMxLCAweDE4LCAweDQwLCAweDY0LCAweDNBLCAweERCLCAweDFDLCAweDAwLCAweEZGLCAweEZGLAorCSAweEM0LCAweEUyLCAweDI3LCAweDQ0LCAweDIwLCAweDJBLCAweDAxLCAweDAwLCAweEZGLCAweEZGLCAweDQyLCAweDY0LCAweDNBLCAweERCLCAweDIzLCAweDAwLAorCSAweDQxLCAweEZGLCAweEEzLCAweDYwLCAweDM0LCAweDc4LCAweEUyLCAweEZFLCAweDQwLCAweDQ5LCAweDAyLCAweDYwLCAweDAxLCAweEUxLCAweDFELCAweDAwLAorCSAweDQ0LCAweEZGLCAweDFCLCAweDA5LCAweDI5LCAweDQ0LCAweDEwLCAweDJBLCAweDA0LCAweDc0LCAweENELCAweEUyLCAweDEwLCAweDY1LCAweDBCLCAweDAwLAorCSAweEE0LCAweDYwLCAweDQ5LCAweDc4LCAweEE0LCAweEUyLCAweDI5LCAweDQ0LCAweDIwLCAweDJBLCAweDBELCAweDAwLCAweDIwLCAweEFDLCAweEVDLCAweDAxLAorCSAweEE0LCAweDYwLCAweDQ5LCAweDc4LCAweDQ2LCAweEZGLCAweEI0LCAweDg0LCAweDQwLCAweDQ5LCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDgwLCAweDNFLAorCSAweEE0LCAweDYwLCAweDQ5LCAweDc4LCAweEZGLCAweEZGLCAweDYyLCAweEZGLCAweDA4LCAweEUxLCAweEExLCAweEZGLCAweDk4LCAweEZGLCAweDgwLCAweDNFLAorCSAweEFBLCAweDYwLCAweEY0LCAweDc4LCAweDRDLCAweDRFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEFBLCAweDYwLCAweEZCLCAweDc4LCAweDQ0LCAweEUyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEM0LCAweEUyLCAweDg0LCAweEZGLCAweDIyLCAweDU4LCAweDgyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEE0LCAweDYwLCAweEI5LCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweEUxLCAweDAxLCAweEZGLCAweEZGLAorCSAweDEwLCAweDI5LCAweEZBLCAweDAxLCAweEU0LCAweEUyLCAweEFBLCAweDYwLCAweEIwLCAweDc4LCAweDk0LCAweEYzLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEMxLCAweDYwLCAweDM1LCAweDc4LCAweDY0LCAweEUyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEFBLCAweDYwLCAweDk3LCAweDc4LCAweEFDLCAweEUyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDgwLCAweDI5LCAweEUyLCAweDAxLCAweEFBLCAweDYwLCAweEYzLCAweDc4LCAweDQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEI0LCAweDYwLCAweEVGLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEI1LCAweDYwLCAweDFDLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEIzLCAweDYwLCAweDhCLCAweDc4LCAweDQyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEIzLCAweDYwLCAweEJFLCAweDc4LCAweDQzLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEIzLCAweDYwLCAweEJFLCAweDc4LCAweDQ0LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEI2LCAweDYwLCAweDlELCAweDc4LCAweDQ1LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEIzLCAweDYwLCAweEMxLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDAwLCAweDYwLCAweDgzLCAweDY0LCAweDgwLCAweDI5LCAweDA5LCAweEZCLCAweEI0LCAweDYwLCAweEI3LCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDk4LCAweEZGLCAweEMyLCAweDYwLCAweDY5LCAweDc4LCAweDQwLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEMxLCAweDYwLCAweEUwLCAweDc4LCAweDk4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEMwLCAweDYwLCAweDNELCAweDc4LCAweDk4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEJGLCAweDYwLCAweEI4LCAweDc4LCAweDk4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEI3LCAweDYwLCAweDk2LCAweDc4LCAweDk4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEExLCAweEZGLCAweDk4LCAweEZGLCAweDgzLCAweDNFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEMzLCAweDYwLCAweDU4LCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAxLAorCSAweDQxLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAxLAorCSAweDQyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAxLAorCSAweEIwLCAweEZGLCAweEIxLCAweEZGLCAweDQwLCAweEZGLCAweDQzLCAweEZGLCAweEMzLCAweDYwLCAweDUzLCAweDc4LCAweDQ0LCAweEZGLCAweEZGLCAweDAxLAorCSAweEMzLCAweDYwLCAweDU4LCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAxLAorCSAweDFDLCAweDYwLCAweDI4LCAweDc4LCAweDQ1LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAxLAorCSAweEMzLCAweDYwLCAweDUzLCAweDc4LCAweDg0LCAweEUyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAxLAorCSAweEMzLCAweDYwLCAweDUyLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAxLAorCSAweENBLCAweDYwLCAweDc2LCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEU4LCAweDYwLCAweDZDLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDQyLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDg1LCAweDNFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweENBLCAweDYwLCAweDdFLCAweDc4LCAweDI0LCAweEUyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEU2LCAweDYwLCAweDJBLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweENBLCAweDYwLCAweDdFLCAweDc4LCAweDQ0LCAweEUyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweENBLCAweDYwLCAweDdFLCAweDc4LCAweDg0LCAweEUyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweENBLCAweDYwLCAweDdFLCAweDc4LCAweDQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEYwLCAweDYwLCAweDlGLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEYwLCAweDYwLCAweENBLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEYwLCAweDYwLCAweEUzLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEYwLCAweDYwLCAweEM3LCAweDc4LCAweDI4LCAweEUyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEYwLCAweDYwLCAweEM3LCAweDc4LCAweDQ0LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEYwLCAweDYwLCAweEM3LCAweDc4LCAweDQ1LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEYwLCAweDYwLCAweEM3LCAweDc4LCAweDQ2LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDAwLCAweDYwLCAweDg3LCAweDY0LCAweDgwLCAweDI5LCAweDA5LCAweEZCLCAweDQ3LCAweEZGLCAweEYwLCAweDYwLCAweEM3LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDQzLCAweEY3LCAweEE3LCAweEZGLCAweDQxLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweEEyLCAweDYwLCAweDAwLCAweDc4LCAweDQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDJFLCAweDYwLCAweDU0LCAweDYzLCAweDIwLCAweDQ0LCAweEJELCAweERCLCAweDIxLCAweDQ0LCAweEJELCAweERCLCAweDIyLCAweDQ0LCAweEJELCAweERCLAorCSAweDIzLCAweDQ0LCAweEJELCAweERCLCAweDI0LCAweDQ0LCAweEJELCAweERCLCAweDI1LCAweDQ0LCAweEJELCAweERCLCAweDI2LCAweDQ0LCAweEJELCAweERCLAorCSAweDI3LCAweDQ0LCAweEJELCAweERCLCAweDI4LCAweDQ0LCAweEJELCAweERCLCAweDI5LCAweDQ0LCAweEJELCAweERCLCAweDJBLCAweDQ0LCAweEJELCAweERCLAorCSAweDJCLCAweDQ0LCAweEJELCAweERCLCAweDJDLCAweDQ0LCAweEJELCAweERCLCAweDJELCAweDQ0LCAweEJELCAweERCLCAweDJFLCAweDQ0LCAweEJELCAweERCLAorCSAweDJGLCAweDQ0LCAweEJELCAweERCLCAweDE3LCAweDYwLCAweDI0LCAweEZELCAweDJGLCAweDYwLCAweDc0LCAweDYzLCAweDE3LCAweDYwLCAweDI1LCAweEZELAorCSAweDMwLCAweDQ0LCAweDE3LCAweDYwLCAweDI2LCAweEZCLCAweDMxLCAweDQ0LCAweDE3LCAweDYwLCAweDI3LCAweEZCLCAweDMyLCAweDQ0LCAweDE3LCAweDYwLAorCSAweDI4LCAweEZCLCAweDMzLCAweDQ0LCAweDE3LCAweDYwLCAweDI5LCAweEZCLCAweDgxLCAweEZGLCAweDkxLCAweEZGLCAweDU4LCAweDUxLCAweDQ0LCAweDAwLAorCSAweDgyLCAweEZGLCAweDkyLCAweEZGLCAweDU4LCAweDUxLCAweDQwLCAweDAwLCAweDgzLCAweEZGLCAweDkzLCAweEZGLCAweDU4LCAweDUxLCAweDNDLCAweDAwLAorCSAweDg0LCAweEZGLCAweDk0LCAweEZGLCAweDU4LCAweDUxLCAweDM4LCAweDAwLCAweDg1LCAweEZGLCAweDk1LCAweEZGLCAweDU4LCAweDUxLCAweDM0LCAweDAwLAorCSAweDg2LCAweEZGLCAweDk2LCAweEZGLCAweDU4LCAweDUxLCAweDMwLCAweDAwLCAweDg3LCAweEZGLCAweDk3LCAweEZGLCAweDU4LCAweDUxLCAweDJDLCAweDAwLAorCSAweDgwLCAweEZGLCAweDkwLCAweEZGLCAweDk5LCAweEZGLCAweDE3LCAweDYwLCAweDI0LCAweEYxLCAweDMwLCAweDQ0LCAweDY0LCAweDQzLCAweEJELCAweERCLAorCSAweDMxLCAweDQ0LCAweEJELCAweERCLCAweDMyLCAweDQ0LCAweEJELCAweERCLCAweDMzLCAweDQ0LCAweEJELCAweERCLCAweDM0LCAweDQ0LCAweEJELCAweERCLAorCSAweDM1LCAweDQ0LCAweEJELCAweERCLCAweDM2LCAweDQ0LCAweEJELCAweERCLCAweDM3LCAweDQ0LCAweEJELCAweERCLCAweDM4LCAweDQ0LCAweEJELCAweERCLAorCSAweDM5LCAweDQ0LCAweEJELCAweERCLCAweDNBLCAweDQ0LCAweEJELCAweERCLCAweDNCLCAweDQ0LCAweEJELCAweERCLCAweDNDLCAweDQ0LCAweEJELCAweERCLAorCSAweDNELCAweDQ0LCAweEJELCAweERCLCAweDNFLCAweDQ0LCAweEJELCAweERCLCAweDNGLCAweDQ0LCAweEJELCAweERCLCAweEVFLCAweDYwLCAweDQ4LCAweDY0LAorCSAweDBBLCAweEZCLCAweDQwLCAweDIxLCAweEZFLCAweDAxLCAweDcwLCAweDAwLCAweDQyLCAweDUwLCAweDQwLCAweDUzLCAweDE3LCAweDYwLCAweDI1LCAweEYzLAorCSAweEZGLCAweEZGLCAweDQwLCAweDUyLCAweDMzLCAweDQ0LCAweDMyLCAweDQyLCAweEEyLCAweERCLCAweERBLCAweDgyLCAweEEyLCAweERELCAweERBLCAweDgzLAorCSAweDY1LCAweDQ0LCAweEJELCAweERCLCAweDYxLCAweDQ0LCAweEJELCAweERCLCAweDY2LCAweDQ0LCAweEJELCAweERCLCAweEJELCAweEQ5LCAweDMwLCAweDQ0LAorCSAweEJELCAweERCLCAweDk5LCAweEZGLCAweEE0LCAweDRDLCAweEJELCAweERCLCAweEE1LCAweDRDLCAweEJELCAweERCLCAweEEwLCAweDRDLCAweEJELCAweERCLAorCSAweEExLCAweDRDLCAweEJELCAweERCLCAweDk4LCAweEZGLCAweDE3LCAweDYwLCAweDI1LCAweEZELCAweDE3LCAweDYwLCAweDI2LCAweEYzLCAweEZGLCAweEZGLAorCSAweDQwLCAweDUwLCAweDE3LCAweDYwLCAweDI4LCAweEYzLCAweEZGLCAweEZGLCAweDQwLCAweDUyLCAweDE3LCAweDYwLCAweDI5LCAweEYzLCAweEZGLCAweEZGLAorCSAweDQwLCAweDUzLCAweDMxLCAweDQxLCAweDE3LCAweDYwLCAweDI3LCAweEYzLCAweEZGLCAweEZGLCAweDQwLCAweDUxLCAweDE3LCAweDYwLCAweDI0LCAweEYzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQzLCAweDIwLCAweDQ0LCAweEJELCAweERCLCAweDIxLCAweDQ0LCAweEJELCAweERCLCAweDIyLCAweDQ0LCAweEJELCAweERCLAorCSAweDIzLCAweDQ0LCAweEJELCAweERCLCAweDI0LCAweDQ0LCAweEJELCAweERCLCAweDI1LCAweDQ0LCAweEJELCAweERCLCAweDI2LCAweDQ0LCAweEJELCAweERCLAorCSAweDI3LCAweDQ0LCAweEJELCAweERCLCAweDI4LCAweDQ0LCAweEJELCAweERCLCAweDI5LCAweDQ0LCAweEJELCAweERCLCAweDJBLCAweDQ0LCAweEJELCAweERCLAorCSAweDJCLCAweDQ0LCAweEJELCAweERCLCAweDJDLCAweDQ0LCAweEJELCAweERCLCAweDJELCAweDQ0LCAweEJELCAweERCLCAweDJFLCAweDQ0LCAweEJELCAweERCLAorCSAweDJGLCAweDQ0LCAweEJELCAweERCLCAweDE3LCAweDYwLCAweDI0LCAweEZELCAweDYxLCAweDU4LCAweEZGLCAweEZGLCAweDI4LCAweDYwLCAweDc2LCAweDYzLAorCSAweEEzLCAweEQzLCAweDMzLCAweDVDLCAweDAyLCAweEE0LCAweEJELCAweERCLCAweEZFLCAweEI0LCAweEUwLCAweDg1LCAweEM0LCAweDg1LCAweDQ3LCAweEQ5LAorCSAweDM0LCAweDQ0LCAweDVCLCAweERCLCAweDQ0LCAweEYzLCAweDVCLCAweERCLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDg3LCAweDNFLCAweEZGLCAweDAxLAorCSAweDgyLCAweEUxLCAweDgwLCAweEZGLCAweDkwLCAweEZGLCAweDg4LCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDg3LCAweDNFLCAweDQxLCAweEZGLAorCSAweDAwLCAweDYwLCAweDAzLCAweEUxLCAweDIxLCAweDQ2LCAweDY2LCAweDQ1LCAweDAwLCAweEY0LCAweDJFLCAweDQ0LCAweDA5LCAweEZBLCAweDZBLCAweDYxLAorCSAweDdGLCAweDYwLCAweEZFLCAweDYzLCAweEExLCAweEZGLCAweDlBLCAweEZGLCAweDA1LCAweDExLCAweDBBLCAweDAwLCAweDAwLCAweEY0LCAweDAxLCAweEYyLAorCSAweDE3LCAweDE4LCAweDdBLCAweDYxLCAweDAyLCAweDI1LCAweDA0LCAweDAwLCAweDZDLCAweDQ0LCAweDdBLCAweERBLCAweEZCLCAweDFDLCAweEY2LCAweDExLAorCSAweEQ5LCAweDgxLCAweDQxLCAweEZGLCAweDAyLCAweDFDLCAweDAwLCAweEY0LCAweERBLCAweDgyLCAweDQxLCAweEZGLCAweEM5LCAweDgxLCAweENCLCAweDgzLAorCSAweDZDLCAweDQ0LCAweDVBLCAweERBLCAweDAyLCAweDFDLCAweDAwLCAweEY0LCAweDgxLCAweEYyLCAweDZDLCAweDQ0LCAweDVBLCAweERBLCAweENCLCAweDgzLAorCSAweDAyLCAweDc0LCAweDAyLCAweDYwLCAweDA0LCAweEUxLCAweDgwLCAweDYwLCAweDAwLCAweDYxLCAweDVELCAweDkzLCAweEI1LCAweEZGLCAweDk4LCAweEZGLAorCSAweDI2LCAweDQ0LCAweEZELCAweEI0LCAweDg0LCAweEJDLCAweDQwLCAweDQ2LCAweDY1LCAweDQ2LCAweDAwLCAweDY0LCAweDIzLCAweEZBLCAweDNGLCAweEZDLAorCSAweDYzLCAweDQ3LCAweDBBLCAweDYzLCAweDBGLCAweEZDLCAweDAwLCAweEY0LCAweDA4LCAweEZBLCAweENCLCAweEZFLCAweDE4LCAweEUxLCAweDQ0LCAweEZGLAorCSAweEExLCAweEZGLCAweDk4LCAweEZGLCAweDgwLCAweDNFLCAweEUyLCAweEZFLCAweDAzLCAweDA0LCAweEEzLCAweDYwLCAweDk5LCAweDc4LCAweEZGLCAweEZGLAorCSAweEUwLCAweEZFLCAweDAzLCAweDA0LCAweEEzLCAweDYwLCAweEFGLCAweDc4LCAweEZGLCAweEZGLCAweEUxLCAweEZFLCAweDA3LCAweDA1LCAweDlGLCAweEZFLAorCSAweDAzLCAweDA0LCAweDE4LCAweDYwLCAweDI0LCAweDc4LCAweEZGLCAweEZGLCAweDQzLCAweEZGLCAweEE5LCAweDAxLCAweEQzLCAweEYzLCAweEZGLCAweEZGLAorCSAweDAxLCAweEI0LCAweEZGLCAweEZGLCAweDA4LCAweDI0LCAweDE1LCAweDAwLCAweDI5LCAweDQ0LCAweDA4LCAweDI2LCAweEUxLCAweDAxLCAweDcyLCAweDQ0LAorCSAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDk0LCAweEYzLCAweEU4LCAweDg1LCAweEZGLCAweEI3LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEI0LCAweDg1LCAweDczLCAweDQ0LCAweEQ0LCAweDg0LCAweDEwLCAweDY1LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLAorCSAweDM3LCAweDA0LCAweDNGLCAweDQwLCAweDQwLCAweDI2LCAweDA5LCAweDAwLCAweDE4LCAweDYwLCAweDFDLCAweEYzLCAweDVBLCAweEQxLCAweEEwLCAweDUwLAorCSAweEE0LCAweDUyLCAweDVBLCAweEQzLCAweDVBLCAweEQxLCAweEEwLCAweDUwLCAweEE0LCAweDUwLCAweEJDLCAweEYzLCAweEQyLCAweEYxLCAweDAxLCAweEE4LAorCSAweDA3LCAweEE4LCAweDBBLCAweDAzLCAweDA5LCAweDAzLCAweDY0LCAweDQwLCAweDAxLCAweDI2LCAweDA5LCAweDAwLCAweDE4LCAweDYwLCAweDA3LCAweEYzLAorCSAweEZGLCAweEZGLCAweDAxLCAweEI0LCAweEZGLCAweEZGLCAweDAzLCAweDAyLCAweEFELCAweDRGLCAweEZBLCAweEI0LCAweEEwLCAweDVELCAweEFFLCAweDRGLAorCSAweDAyLCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVFLCAweDNGLCAweDQwLCAweDAyLCAweDJCLCAweDExLCAweDAwLCAweDBDLCAweDYwLCAweDAwLCAweDYyLAorCSAweDAwLCAweDYwLCAweDcxLCAweDdDLCAweDAwLCAweDYwLCAweEIxLCAweDY1LCAweDFBLCAweDYwLCAweDU4LCAweDRELCAweDg4LCAweDc4LCAweEZGLCAweEZGLAorCSAweDA4LCAweEUxLCAweDYyLCAweEZGLCAweEEzLCAweEZGLCAweEZGLCAweEZGLCAweEEyLCAweEZGLCAweDAyLCAweDYwLCAweDA4LCAweEUxLCAweEJELCAweEZFLAorCSAweDk3LCAweDAxLCAweDIxLCAweDQ2LCAweDAxLCAweDVELCAweDVDLCAweDYyLCAweDAzLCAweEUxLCAweDQ0LCAweEZGLCAweEExLCAweEZGLCAweDlBLCAweEZGLAorCSAweDdBLCAweERDLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDYyLCAweDYyLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweEExLCAweEZGLAorCSAweDVBLCAweERDLCAweDEyLCAweEUxLCAweDAyLCAweDYwLCAweDAxLCAweEUxLCAweEExLCAweEZGLCAweDk4LCAweEZGLCAweDgwLCAweDNFLCAweDI4LCAweDQwLAorCSAweDQwLCAweDJCLCAweDAzLCAweDAwLCAweDI5LCAweDQwLCAweDIwLCAweDI3LCAweDk3LCAweDAwLCAweEM4LCAweDc0LCAweENELCAweEUyLCAweDI5LCAweDQ0LAorCSAweDA4LCAweEJDLCAweDQwLCAweDQ5LCAweDQ0LCAweEZGLCAweDA1LCAweEUxLCAweDI4LCAweDQwLCAweDA4LCAweDJBLCAweDA3LCAweDAwLCAweDI4LCAweDQwLAorCSAweDQ4LCAweDM2LCAweDA0LCAweDAwLCAweEQyLCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEJDLCAweEQyLCAweEZCLCAweDI5LCAweDQ0LCAweEZGLCAweDYwLAorCSAweEVGLCAweDY1LCAweDI0LCAweDg5LCAweDQwLCAweDI3LCAweDNGLCAweDAwLCAweDAwLCAweDAwLCAweDI5LCAweDQwLCAweDgwLCAweDI3LCAweDBCLCAweDAwLAorCSAweDA3LCAweDYxLCAweEExLCAweEZGLCAweENELCAweDgxLCAweDA0LCAweDI1LCAweDYxLCAweDAwLCAweDg3LCAweDRDLCAweEZCLCAweDAyLCAweEYzLCAweDYwLAorCSAweEEwLCAweDY0LCAweDgwLCAweDRDLCAweDA3LCAweDAwLCAweEExLCAweEZGLCAweDlDLCAweDRDLCAweDlDLCAweDRDLCAweDlDLCAweDRELCAweDA1LCAweDYwLAorCSAweENGLCAweDY0LCAweDgwLCAweDRDLCAweDI4LCAweDQwLCAweDQwLCAweDJCLCAweDA1LCAweDAwLCAweDI5LCAweDQwLCAweDIwLCAweDI3LCAweDAyLCAweDAwLAorCSAweDE1LCAweDYwLCAweDZGLCAweDZCLCAweDA0LCAweDI1LCAweDRBLCAweDAwLCAweDMwLCAweDY0LCAweDNBLCAweERCLCAweDQ0LCAweEZGLCAweDA0LCAweDI1LAorCSAweDQ1LCAweDAwLCAweDA0LCAweDYwLCAweDAwLCAweDY1LCAweDI1LCAweDQ0LCAweEI0LCAweDg0LCAweDgwLCAweDRFLCAweDJELCAweDQxLCAweDA0LCAweDI1LAorCSAweDNELCAweDAwLCAweDYxLCAweDRDLCAweDAwLCAweDYwLCAweDhBLCAweDY1LCAweEM1LCAweDgxLCAweDYxLCAweDU0LCAweEExLCAweEZGLCAweEZGLCAweEZGLAorCSAweDA0LCAweDI1LCAweDM0LCAweDAwLCAweDY3LCAweDRFLCAweDA3LCAweDY0LCAweDFDLCAweEZCLCAweDAwLCAweEUxLCAweDAyLCAweDYwLCAweDA1LCAweEUxLAorCSAweEExLCAweEZGLCAweDk4LCAweEZGLCAweDgwLCAweDNFLCAweDI4LCAweDQwLCAweDQwLCAweDI3LCAweDBBLCAweDAwLCAweDFDLCAweDY1LCAweDI4LCAweDQwLAorCSAweEE0LCAweDM2LCAweDE0LCAweDY1LCAweDIzLCAweDQ0LCAweEM0LCAweDg0LCAweDI4LCAweDQwLCAweDA4LCAweDJBLCAweDBDLCAweDAwLCAweDA3LCAweDAwLAorCSAweDIzLCAweDQ0LCAweDFDLCAweEE0LCAweDI5LCAweDQwLCAweDIwLCAweDI3LCAweDAyLCAweDAwLCAweDExLCAweDYwLCAweDBGLCAweDZCLCAweDNDLCAweDQ2LAorCSAweDk4LCAweEYwLCAweDIzLCAweDQ0LCAweEM0LCAweDg0LCAweDA2LCAweDc0LCAweDI1LCAweDVDLCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweEIwLCAweDg0LCAweDgwLCAweDRDLCAweDlDLCAweDRDLCAweDQ0LCAweEZGLCAweDE4LCAweEUxLCAweDBBLCAweDY0LCAweDFFLCAweDc0LAorCSAweDAyLCAweDYwLCAweDA1LCAweEUxLCAweDQwLCAweDQwLCAweEExLCAweEZGLCAweDk4LCAweEZGLCAweDgwLCAweDNFLCAweEM0LCAweEUyLCAweDI3LCAweDQ0LAorCSAweDIwLCAweDJBLCAweDA2LCAweDAwLCAweDQyLCAweDY0LCAweDNBLCAweERCLCAweDY3LCAweDRDLCAweEIwLCAweDYwLCAweDgwLCAweDc4LCAweEZGLCAweEZGLAorCSAweDQxLCAweDY0LCAweDNBLCAweERCLCAweDYyLCAweEZGLCAweDA4LCAweEUxLCAweEUyLCAweEZFLCAweDcyLCAweDUyLCAweEExLCAweEZGLCAweDk4LCAweEZGLAorCSAweDgwLCAweDNFLCAweEExLCAweEZGLCAweDk4LCAweEZGLCAweDgwLCAweDNFLCAweDI4LCAweDQwLCAweDA4LCAweDI3LCAweDY2LCAweDAxLCAweDNDLCAweDQ2LAorCSAweDhCLCAweEZGLCAweDg0LCAweDYwLCAweDAwLCAweEU0LCAweDBGLCAweDYwLCAweDkyLCAweDY0LCAweEM5LCAweDYwLCAweDU4LCAweDRGLCAweDEwLCAweDc4LAorCSAweEZGLCAweEZGLCAweDNGLCAweEYyLCAweDAwLCAweDYwLCAweDE4LCAweDcwLCAweDE4LCAweDcxLCAweDIwLCAweDcyLCAweDAwLCAweEYyLCAweDYwLCAweDUzLAorCSAweDIwLCAweEUxLCAweEExLCAweEZGLCAweDg4LCAweDc1LCAweDAwLCAweEUxLCAweEZGLCAweEZGLCAweDYwLCAweDUwLCAweDc1LCAweDQ0LCAweDEyLCAweDcxLAorCSAweDZFLCAweDcyLCAweDgxLCAweDc1LCAweEZGLCAweEZGLCAweDg4LCAweEZGLCAweEEzLCAweDYwLCAweEI1LCAweDc4LCAweEZGLCAweEZGLCAweDMyLCAweEYzLAorCSAweDA4LCAweDI5LCAweDBBLCAweDAwLCAweDYwLCAweDQwLCAweDA3LCAweDIyLCAweDA3LCAweDAwLCAweEZFLCAweEI0LCAweDMyLCAweEZCLCAweDI3LCAweDQ0LAorCSAweDEwLCAweEJDLCAweEY3LCAweEI0LCAweDQwLCAweDQ3LCAweDQzLCAweEZGLCAweDAwLCAweDY0LCAweDNBLCAweERCLCAweDAxLCAweDYwLCAweDA4LCAweEUxLAorCSAweDMxLCAweDQwLCAweDAxLCAweDJBLCAweDA0LCAweDAwLCAweDAwLCAweDY0LCAweDMzLCAweEZCLCAweDAxLCAweDYwLCAweDBBLCAweEUxLCAweEU1LCAweEZFLAorCSAweDI3LCAweDA1LCAweDlGLCAweEZFLCAweDEyLCAweDA1LCAweDMxLCAweDQxLCAweDQwLCAweDJBLCAweDBGLCAweDAwLCAweDA3LCAweDYwLCAweEVBLCAweEYxLAorCSAweEFFLCAweDRDLCAweDkwLCAweDgwLCAweDEwLCAweDJBLCAweDA5LCAweDAwLCAweDdGLCAweEIxLCAweDA3LCAweDYwLCAweEVBLCAweEZCLCAweDYwLCAweDQwLAorCSAweDEwLCAweDJBLCAweDgwLCAweEI5LCAweDQxLCAweDUxLCAweERGLCAweEZFLCAweDE5LCAweEZGLCAweDI3LCAweDQ0LCAweDEwLCAweDI2LCAweDEzLCAweDAwLAorCSAweDlGLCAweEZFLCAweDAyLCAweDA0LCAweDQwLCAweEUxLCAweDA2LCAweDAwLCAweDdDLCAweEUxLCAweDMxLCAweDQ0LCAweDAxLCAweDJBLCAweDAyLCAweDAwLAorCSAweDA0LCAweDBBLCAweEZELCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDgxLCAweDNFLCAweEFGLCAweDYwLCAweDdCLCAweDc4LCAweEZGLCAweEZGLAorCSAweEFBLCAweDYwLCAweEMwLCAweDc4LCAweEZGLCAweEZGLCAweDI3LCAweDQ0LCAweDA4LCAweDI2LCAweEZGLCAweEZGLCAweEMwLCAweDYwLCAweEVBLCAweDc4LAorCSAweEZGLCAweEZGLCAweDQ4LCAweEYzLCAweDMyLCAweEYxLCAweDAwLCAweDYzLCAweDY0LCAweDQwLCAweDA3LCAweDI2LCAweDAzLCAweDAwLCAweEE1LCAweDYwLAorCSAweDZDLCAweDc4LCAweEZGLCAweEZGLCAweDMxLCAweDQwLCAweDA4LCAweDI2LCAweEYxLCAweDAxLCAweENELCAweEUyLCAweDg0LCAweEUxLCAweDcwLCAweDQxLAorCSAweEFELCAweDgwLCAweDcxLCAweDQwLCAweDgwLCAweDI3LCAweEVBLCAweDEyLCAweDAzLCAweDAzLCAweEMxLCAweDYwLCAweDNCLCAweDc4LCAweEZGLCAweEZGLAorCSAweEExLCAweEZGLCAweEZGLCAweEZGLCAweEM0LCAweEUyLCAweDMyLCAweEZELCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweERDLCAweDAxLCAweDNDLCAweDQ2LAorCSAweDNFLCAweEYyLCAweDJBLCAweEYwLCAweDI3LCAweDQxLCAweDQ0LCAweDQ4LCAweDIwLCAweEI5LCAweDAxLCAweEI0LCAweEY3LCAweEIxLCAweDBBLCAweDAzLAorCSAweDY0LCAweDQwLCAweDA4LCAweDI3LCAweDA3LCAweDAwLCAweDBGLCAweDYwLCAweEVFLCAweDYzLCAweDAwLCAweDY0LCAweDQ1LCAweEZCLCAweDQ2LCAweEZCLAorCSAweEJELCAweERCLCAweEEzLCAweERCLCAweENCLCAweDBBLCAweENBLCAweDExLCAweDQxLCAweDQ3LCAweDIyLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLAorCSAweDEwLCAweDI2LCAweDA0LCAweDAwLCAweDAxLCAweDJBLCAweDA1LCAweDAwLCAweDEwLCAweDJCLCAweDAzLCAweDAwLCAweDI5LCAweDQ3LCAweDIwLCAweEJGLAorCSAweDQwLCAweDQ5LCAweDA1LCAweEUxLCAweDAxLCAweDYwLCAweDA4LCAweEUxLCAweDJBLCAweEU4LCAweDNDLCAweDQ2LCAweDAwLCAweDYzLCAweDMyLCAweEZELAorCSAweDQzLCAweEZGLCAweDBGLCAweEYwLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAxLCAweDJBLCAweDAzLCAweDAwLCAweEE4LCAweDYwLCAweDc2LCAweDc4LAorCSAweEZGLCAweEZGLCAweDY0LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDBFLCAweDAwLCAweDFGLCAweEYyLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQwLCAweDQwLCAweDJCLCAweDA5LCAweDAwLCAweDE1LCAweDYwLCAweERELCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAyLCAweDJBLAorCSAweDAzLCAweDAwLCAweEE5LCAweDYwLCAweDgxLCAweDc4LCAweEZGLCAweEZGLCAweDFGLCAweEYyLCAweEMwLCAweDYwLCAweDAwLCAweDY1LCAweEE0LCAweDlDLAorCSAweDNGLCAweDYwLCAweENGLCAweDY1LCAweDI5LCAweDQ0LCAweEE0LCAweDg0LCAweDMwLCAweDg5LCAweDE1LCAweDYwLCAweEQ5LCAweEYzLCAweEZGLCAweEZGLAorCSAweDE1LCAweDYwLCAweEQ4LCAweEZCLCAweDFGLCAweEYyLCAweDM5LCAweEYxLCAweEUwLCAweDYwLCAweEZGLCAweEI1LCAweDBBLCAweDE4LCAweDYwLCAweDQ3LAorCSAweDFGLCAweEI0LCAweEQwLCAweDg0LCAweEUwLCAweEEwLCAweDAyLCAweDBELCAweDAwLCAweDY0LCAweDAyLCAweDAwLCAweDAxLCAweDA0LCAweDFGLCAweDY0LAorCSAweDYwLCAweDQ3LCAweEI0LCAweDgxLCAweDA3LCAweDYwLCAweEVCLCAweEYxLCAweEZGLCAweEZGLCAweEIxLCAweDhDLCAweDI5LCAweDQwLCAweDQwLCAweDJCLAorCSAweDEwLCAweDAwLCAweDIyLCAweDYwLCAweEM2LCAweDY1LCAweDYwLCAweDQ3LCAweDFGLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDQ0LCAweEQzLAorCSAweDVBLCAweEQxLCAweDAxLCAweDYwLCAweDAwLCAweEUxLCAweDAxLCAweDYwLCAweDA5LCAweDZCLCAweDYwLCAweDRDLCAweEI1LCAweEZGLCAweDY0LCAweDRDLAorCSAweDE0LCAweDAwLCAweDIyLCAweDYwLCAweEM2LCAweDY1LCAweDYwLCAweDQ3LCAweDFGLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDQ0LCAweEQzLAorCSAweDVBLCAweEQxLCAweDAxLCAweDYwLCAweDAwLCAweEUxLCAweDA1LCAweDYwLCAweDY5LCAweDZCLCAweDYwLCAweDRDLCAweEI1LCAweEZGLCAweDY0LCAweDRDLAorCSAweDdDLCAweDQ0LCAweDI5LCAweDQwLCAweDgwLCAweDJCLCAweDY3LCAweDQ0LCAweDYwLCAweDRDLCAweDAwLCAweEUxLCAweDg0LCAweEZGLCAweEMxLCAweDYwLAorCSAweDZCLCAweDY0LCAweDQwLCAweDQyLCAweDgyLCAweEZGLCAweDBELCAweDAwLCAweEU1LCAweEZFLCAweDAzLCAweDA0LCAweEFBLCAweDYwLCAweEMwLCAweDc4LAorCSAweEZGLCAweEZGLCAweDMyLCAweEYxLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDA3LCAweDIyLCAweDQzLCAweEZGLCAweEE0LCAweDYwLCAweDdDLCAweDc4LAorCSAweEZGLCAweEZGLCAweDNDLCAweDQ0LCAweDBCLCAweDY0LCAweDNBLCAweERCLCAweDAxLCAweDYwLCAweDBBLCAweEUxLCAweDFDLCAweDQyLCAweDIyLCAweDQ2LAorCSAweDEzLCAweEYyLCAweEZGLCAweDY1LCAweDYwLCAweDQ3LCAweDJBLCAweEYyLCAweDQwLCAweDQ1LCAweDQwLCAweDQ4LCAweDA0LCAweDJCLCAweDEzLCAweDAwLAorCSAweDE2LCAweEYyLCAweDFELCAweEYyLCAweDQwLCAweDQzLCAweDBGLCAweEYyLCAweDQwLCAweDRELCAweDBGLCAweDY0LCAweDE0LCAweEYwLCAweDM1LCAweEYyLAorCSAweEEwLCAweDgyLCAweDBGLCAweEI0LCAweENBLCAweDg1LCAweEQ0LCAweDgwLCAweDEwLCAweEYyLCAweDAxLCAweDAyLCAweDJCLCAweEZBLCAweDI3LCAweDQ0LAorCSAweDQwLCAweEJDLCAweDQwLCAweDQ3LCAweDEzLCAweDAwLCAweDE3LCAweEYyLCAweDJDLCAweEYwLCAweDQwLCAweDQzLCAweDFCLCAweEYyLCAweDFELCAweEZBLAorCSAweDQwLCAweDRELCAweDY0LCAweDQwLCAweDAxLCAweDJBLCAweDAyLCAweDAwLCAweEFCLCAweEZDLCAweDA1LCAweDAwLCAweDI4LCAweDQwLCAweEE0LCAweDM2LAorCSAweDAyLCAweDAwLCAweDExLCAweEYyLCAweDJCLCAweEZBLCAweDI3LCAweDQ0LCAweEJGLCAweEI0LCAweDQwLCAweDQ3LCAweEYwLCAweEZFLCAweEFGLCAweDYwLAorCSAweDg1LCAweDc4LCAweEZGLCAweEZGLCAweDIyLCAweDQ2LCAweDJDLCAweEYwLCAweDI3LCAweDQ0LCAweERGLCAweEI0LCAweDQwLCAweDQ3LCAweDY0LCAweDQwLAorCSAweDAxLCAweDI2LCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDExLCAweDAwLCAweDJBLCAweEYwLCAweDAxLCAweDY1LCAweDY0LCAweDQwLCAweEE0LCAweDNBLAorCSAweDA0LCAweDY1LCAweDI3LCAweDQ0LCAweDM0LCAweDg3LCAweDM2LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDU2LCAweEFELCAweEUyLCAweDA0LCAweDY0LAorCSAweDNBLCAweERCLCAweDY5LCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDgxLCAweDNFLCAweDA2LCAweDY0LCAweDNBLCAweERCLCAweDIyLCAweDQ2LAorCSAweDAxLCAweDY0LCAweDMxLCAweEZCLCAweEMwLCAweEZFLCAweEMxLCAweDYwLCAweDQ0LCAweDc4LCAweEZGLCAweEZGLCAweDI4LCAweDQwLCAweEM0LCAweDNBLAorCSAweDBDLCAweDAwLCAweDI3LCAweDQ0LCAweEZELCAweEI0LCAweDQwLCAweDQ3LCAweEE4LCAweEUyLCAweDA1LCAweEUxLCAweDAxLCAweDYwLCAweDA4LCAweEUxLAorCSAweDJBLCAweEU4LCAweDNDLCAweDQ2LCAweEE1LCAweDYwLCAweDFDLCAweDc4LCAweEZGLCAweEZGLCAweDNGLCAweDQwLCAweDAxLCAweDJCLCAweDA1LCAweDAwLAorCSAweDY3LCAweDRDLCAweDAxLCAweDYwLCAweDAwLCAweEUxLCAweDA1LCAweDYwLCAweDY5LCAweDZCLCAweDA3LCAweDYwLCAweEVDLCAweEYxLCAweDFGLCAweEYyLAorCSAweDJBLCAweEU4LCAweEIwLCAweDgxLCAweDI5LCAweDQwLCAweDQwLCAweDJCLCAweDE0LCAweDAwLCAweDYxLCAweDRDLCAweDIyLCAweDYwLCAweEM2LCAweDY1LAorCSAweDYxLCAweDQ3LCAweDFGLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDVBLCAweEQxLCAweDAxLCAweDYwLCAweDAwLCAweEUxLAorCSAweDAxLCAweDYwLCAweDA5LCAweDZCLCAweDYwLCAweDRDLCAweEI1LCAweEZGLCAweEZGLCAweDYwLCAweEYyLCAweDY0LCAweDY0LCAweDRDLCAweDQwLCAweDQzLAorCSAweDE4LCAweDAwLCAweDI5LCAweDQ3LCAweDgwLCAweEI3LCAweDM0LCAweDk0LCAweDYwLCAweDRDLCAweDIyLCAweDYwLCAweEM2LCAweDY1LCAweDYxLCAweDQ3LAorCSAweDFGLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDVBLCAweEQxLCAweDAxLCAweDYwLCAweDAwLCAweEUxLCAweDA1LCAweDYwLAorCSAweDY5LCAweDZCLCAweDYwLCAweDRDLCAweEI1LCAweEZGLCAweDY0LCAweDRDLCAweDdDLCAweDQ0LCAweDI5LCAweDQwLCAweDgwLCAweDJCLCAweDY3LCAweDQ0LAorCSAweDYwLCAweDRDLCAweDQwLCAweEUxLCAweDAxLCAweDYwLCAweDA4LCAweEUxLCAweDI4LCAweDQ1LCAweEJGLCAweDYwLCAweEZGLCAweDY0LCAweDI0LCAweDg4LAorCSAweEM0LCAweEUyLCAweDA4LCAweDY0LCAweDNBLCAweERCLCAweDIxLCAweDQ2LCAweDJBLCAweDQ0LCAweDcyLCAweDQ1LCAweDI0LCAweEZBLCAweDk0LCAweEYzLAorCSAweDA2LCAweDA0LCAweEU0LCAweEUyLCAweERDLCAweDlDLCAweDI5LCAweDQwLCAweDAxLCAweDI2LCAweDY0LCAweDQ0LCAweDk0LCAweEY5LCAweDI1LCAweEZBLAorCSAweDk1LCAweEYzLCAweDAyLCAweDA0LCAweERDLCAweDg0LCAweDk1LCAweEZCLCAweDI4LCAweEZBLCAweDk2LCAweEYzLCAweDAyLCAweDA0LCAweERDLCAweDg0LAorCSAweDk2LCAweEZCLCAweDI5LCAweEZBLCAweDI0LCAweDQ0LCAweDA0LCAweDJBLCAweDA2LCAweDAwLCAweDI4LCAweDQwLCAweEE0LCAweDM2LCAweDAzLCAweDAwLAorCSAweEE3LCAweDYwLCAweDQ2LCAweDc4LCAweEZGLCAweEZGLCAweDk0LCAweEZDLCAweDEzLCAweDYwLCAweDRBLCAweEYxLCAweDI4LCAweDQ0LCAweDA4LCAweDJBLAorCSAweDUxLCAweDAwLCAweDAzLCAweDJCLCAweDAxLCAweDAwLCAweDRFLCAweDAwLCAweDY0LCAweDQwLCAweDAwLCAweDM2LCAweDRCLCAweDAwLCAweDMyLCAweEYyLAorCSAweDJGLCAweEYwLCAweDUwLCAweEZFLCAweDAxLCAweDJBLCAweDAzLCAweDAwLCAweDAxLCAweDYxLCAweDhFLCAweEYzLCAweDMxLCAweDAwLCAweEQwLCAweDgwLAorCSAweDMzLCAweEYyLCAweDMwLCAweEYwLCAweDM0LCAweEYyLCAweEQwLCAweDgwLCAweDMxLCAweEYwLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweDYwLCAweDQ3LAorCSAweDM0LCAweDBDLCAweEZGLCAweEI0LCAweDE1LCAweDYwLCAweDAyLCAweDY1LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweEZGLCAweEZGLAorCSAweDMxLCAweDE4LCAweDYwLCAweDQzLCAweDUwLCAweEZFLCAweDY2LCAweDQxLCAweDMyLCAweEYwLCAweDYzLCAweDQ2LCAweDAzLCAweEYyLCAweDYxLCAweDQ2LAorCSAweEQwLCAweDgwLCAweDMzLCAweEYwLCAweDYzLCAweDQ2LCAweDA0LCAweEYyLCAweDYxLCAweDQ2LCAweEQwLCAweDgwLCAweDM0LCAweEYwLCAweDYzLCAweDQ2LAorCSAweDA1LCAweEYyLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA0LCAweDBDLCAweDAwLCAweEYyLCAweDYxLCAweDQ2LCAweDFBLCAweDE4LAorCSAweEU4LCAweDAxLCAweDA2LCAweEYwLCAweDhFLCAweEYzLCAweDYxLCAweDQ2LCAweDAyLCAweDYxLCAweDY0LCAweDQwLCAweDAyLCAweDJBLCAweDEyLCAweDAwLAorCSAweEZDLCAweEEwLCAweEZGLCAweEZGLCAweDA0LCAweDBFLCAweDYxLCAweDQ0LCAweDE0LCAweEZBLCAweDExLCAweEZDLCAweDBCLCAweDAwLCAweDJDLCAweEYyLAorCSAweDJGLCAweEZBLCAweDJELCAweEYyLCAweDMwLCAweEZBLCAweDJFLCAweEYyLCAweDMxLCAweEZBLCAweDFELCAweEZGLCAweDI2LCAweDQ0LCAweDAyLCAweEJDLAorCSAweDQwLCAweDQ2LCAweDFFLCAweDAwLCAweDI2LCAweDQzLCAweDg0LCAweEJCLCAweEZDLCAweEIzLCAweDIxLCAweDQ2LCAweDAxLCAweDVELCAweDBGLCAweEZDLAorCSAweDVDLCAweDQ2LCAweDA1LCAweEZGLCAweDI3LCAweDQ0LCAweDAxLCAweDJBLCAweDEzLCAweDAwLCAweDUwLCAweEZFLCAweDI4LCAweDQwLCAweDA4LCAweDNBLAorCSAweDEyLCAweDAwLCAweDJGLCAweEYyLCAweDMwLCAweEYwLCAweDYwLCAweDQzLCAweDMxLCAweEYyLCAweDIyLCAweDQ2LCAweDY0LCAweDQxLCAweDJDLCAweEYwLAorCSAweDJELCAweEYwLCAweEQzLCAweDgwLCAweDJFLCAweEYwLCAweEQxLCAweDgwLCAweEQwLCAweDgwLCAweDI3LCAweDQ0LCAweDA5LCAweDBDLCAweDAzLCAweDAwLAorCSAweDI3LCAweDQ0LCAweDA2LCAweDIyLCAweDA1LCAweDAwLCAweEI4LCAweEI0LCAweDQwLCAweDQ3LCAweDAyLCAweDY0LCAweDMxLCAweEZCLCAweEMwLCAweEZFLAorCSAweEQ0LCAweDY0LCAweDQwLCAweDQ4LCAweDBELCAweDY0LCAweDNBLCAweERCLCAweDIxLCAweDQ2LCAweDFDLCAweEYyLCAweDAwLCAweEUxLCAweEYwLCAweEZFLAorCSAweDAwLCAweDYzLCAweDI4LCAweDQ0LCAweEE0LCAweDM2LCAweDA3LCAweDAwLCAweDA0LCAweDJCLCAweDA1LCAweDAwLCAweDMwLCAweEYzLCAweDJELCAweDQ1LAorCSAweEQ0LCAweDg0LCAweENBLCAweDY1LCAweEQ0LCAweDgzLCAweEQ0LCAweDY0LCAweDM1LCAweDAwLCAweDBGLCAweDY0LCAweDNBLCAweERCLCAweDIxLCAweDQ2LAorCSAweDI5LCAweDQwLCAweDQwLCAweDI3LCAweDE1LCAweDAwLCAweDgwLCAweDI3LCAweDAyLCAweDAwLCAweENBLCAweDY1LCAweDAxLCAweDAwLCAweDZBLCAweDY1LAorCSAweDFDLCAweEYyLCAweEZGLCAweEZGLCAweDA0LCAweDdGLCAweDQwLCAweDQ1LCAweDBBLCAweDM2LCAweDcwLCAweDY0LCAweDE0LCAweDM2LCAweDM4LCAweDY0LAorCSAweDM3LCAweDM2LCAweDE1LCAweDY0LCAweDZFLCAweDNBLCAweDE3LCAweDAwLCAweDg0LCAweDdGLCAweDQwLCAweDQ1LCAweDBCLCAweDY0LCAweDEzLCAweDAwLAorCSAweDFDLCAweEYyLCAweDFFLCAweDY1LCAweDQwLCAweDQ1LCAweDBCLCAweDM2LCAweDFFLCAweDY0LCAweDBGLCAweDM2LCAweDE2LCAweDY0LCAweDBBLCAweDM2LAorCSAweDEyLCAweDY0LCAweDBFLCAweDM2LCAweDBFLCAweDY0LCAweDA5LCAweDM2LCAweDBFLCAweDY0LCAweDBELCAweDM2LCAweDBBLCAweDY0LCAweDA4LCAweDM2LAorCSAweDBBLCAweDY0LCAweDBDLCAweDM2LCAweDBBLCAweDY0LCAweDQwLCAweDRELCAweDAwLCAweEUxLCAweEYwLCAweEZFLCAweDJCLCAweEYyLCAweEM0LCAweDg1LAorCSAweEQ0LCAweDgzLCAweEM0LCAweDY0LCAweDQwLCAweDQ4LCAweDJGLCAweEYwLCAweEIwLCAweEYwLCAweEIxLCAweEYyLCAweEExLCAweEZGLCAweDEyLCAweDc0LAorCSAweENELCAweEUyLCAweDgwLCAweDRFLCAweDEyLCAweDc0LCAweDgzLCAweDRDLCAweDEyLCAweDc0LCAweDlBLCAweEZGLCAweDg0LCAweDRDLCAweDEyLCAweDc0LAorCSAweDg1LCAweDRDLCAweDEyLCAweDc0LCAweDgxLCAweDRDLCAweDEyLCAweDc0LCAweEExLCAweEZGLCAweDk4LCAweEZGLCAweEIxLCAweDYwLCAweDU4LCAweDRGLAorCSAweDAwLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDYwLCAweDE4LCAweEUxLCAweDc4LCAweDQ0LCAweDAzLCAweEE0LCAweDM1LCAweEZCLCAweEIxLCAweDYwLAorCSAweDQzLCAweDc4LCAweEZGLCAweEZGLCAweDI5LCAweDQ0LCAweEY3LCAweEI0LCAweDQwLCAweDQ5LCAweDI3LCAweDQ0LCAweDAxLCAweDJBLCAweDA1LCAweDAwLAorCSAweEZFLCAweEI0LCAweDQwLCAweDQ3LCAweEE1LCAweDYwLCAweENELCAweDc4LCAweEZGLCAweEZGLCAweDEzLCAweDYwLCAweDJFLCAweEYzLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQwLCAweDAyLCAweDM2LCAweEMxLCAweEZFLCAweEE0LCAweDYwLCAweDZGLCAweDc4LCAweEZGLCAweEZGLCAweDI4LCAweDQwLCAweEI0LCAweDNBLAorCSAweDBCLCAweDAwLCAweDI3LCAweDQ0LCAweDA3LCAweDIyLCAweDA1LCAweDAwLCAweEY4LCAweEI0LCAweDQwLCAweDQ3LCAweDAyLCAweDY0LCAweDMxLCAweEZCLAorCSAweEMwLCAweEZFLCAweEE2LCAweDYwLCAweERELCAweDc4LCAweEZGLCAweEZGLCAweDI4LCAweDQ0LCAweEQ0LCAweDM2LCAweDAzLCAweDAwLCAweEE4LCAweDYwLAorCSAweDVELCAweDc4LCAweEZGLCAweEZGLCAweEE4LCAweEUyLCAweDI3LCAweDQ0LCAweEZCLCAweEI0LCAweDQwLCAweDQ3LCAweDFDLCAweDQyLCAweDIyLCAweDQ2LAorCSAweDE2LCAweDYwLCAweDJCLCAweEYzLCAweEZGLCAweEZGLCAweDM0LCAweEZCLCAweDJBLCAweEYwLCAweEY3LCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LAorCSAweEEyLCAweERBLCAweDYwLCAweDQwLCAweDQwLCAweDJCLCAweEM0LCAweDAwLCAweDIyLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDIyLCAweDI2LAorCSAweDNGLCAweDAwLCAweDAxLCAweDI2LCAweDAzLCAweDAwLCAweDA0LCAweDI2LCAweDA1LCAweDAwLCAweEJBLCAweDAwLCAweDA0LCAweDJCLCAweEI4LCAweDAwLAorCSAweDg3LCAweEY1LCAweDAxLCAweDAwLCAweDA3LCAweEY0LCAweDRCLCAweEYyLCAweEZGLCAweEZGLCAweERDLCAweDg0LCAweDRCLCAweEZBLCAweDBDLCAweDYwLAorCSAweEZFLCAweDYyLCAweDgwLCAweEZGLCAweEM4LCAweDYwLCAweDc4LCAweDQ0LCAweDAyLCAweEE0LCAweEEyLCAweERCLCAweDQ2LCAweDc4LCAweEZGLCAweEZGLAorCSAweDgyLCAweEZGLCAweDg3LCAweEYzLCAweDY2LCAweDVDLCAweEQwLCAweDgwLCAweDAwLCAweDdDLCAweDA3LCAweDAzLCAweDY2LCAweDQzLCAweDIyLCAweDQ2LAorCSAweDIyLCAweEYyLCAweDYzLCAweDQ2LCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDAxLCAweDAwLCAweDNDLCAweEYxLCAweDRCLCAweEYwLCAweDY0LCAweDQxLAorCSAweDY0LCAweDQ3LCAweDYwLCAweDVGLCAweDIwLCAweEJDLCAweDgwLCAweDI2LCAweDgwLCAweEFDLCAweDYwLCAweDQ3LCAweDIyLCAweDQ2LCAweDNBLCAweEZBLAorCSAweDY0LCAweDQ0LCAweDIwLCAweDdGLCAweDM0LCAweDk0LCAweDNCLCAweEZBLCAweDA4LCAweDYwLCAweDAwLCAweEVBLCAweDBGLCAweDY0LCAweDYwLCAweDdGLAorCSAweEEwLCAweDVBLCAweDgwLCAweDYwLCAweDAwLCAweEVBLCAweEEwLCAweDYwLCAweDAwLCAweEVBLCAweEQxLCAweDYwLCAweDAwLCAweEVBLCAweDgwLCAweDAwLAorCSAweDJBLCAweEYyLCAweDAwLCAweDYwLCAweDdDLCAweDYyLCAweDYwLCAweDQwLCAweDQwLCAweDJCLCAweDI0LCAweDAwLCAweEEyLCAweEQzLCAweDAwLCAweDYxLAorCSAweDYwLCAweEZFLCAweEEwLCAweEQzLCAweDVFLCAweEQxLCAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweDY0LCAweDVGLCAweERDLCAweDg0LCAweEYxLCAweDgxLAorCSAweEMwLCAweDJCLCAweDA0LCAweDAwLCAweDgwLCAweDJBLCAweDAyLCAweDAwLCAweDdGLCAweEE0LCAweERDLCAweDg0LCAweEZGLCAweDNCLCAweDAzLCAweDAwLAorCSAweDYwLCAweDQ3LCAweERDLCAweDg3LCAweDAxLCAweDYxLCAweEMwLCAweDgwLCAweDAwLCAweDM2LCAweERDLCAweDg0LCAweDRFLCAweERCLCAweDYwLCAweEZFLAorCSAweDVBLCAweEQxLCAweEZGLCAweEZGLCAweEMxLCAweDg0LCAweEYwLCAweDIyLCAweDEwLCAweEE0LCAweEYwLCAweDJBLCAweDAxLCAweDAwLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweDIwLCAweEZFLCAweDAwLCAweDYwLCAweDNFLCAweEYzLCAweEZGLCAweEZGLCAweEEwLCAweEQzLCAweDVBLCAweEQxLCAweDNBLCAweEZBLAorCSAweDNCLCAweEY4LCAweDc0LCAweDYyLCAweEEyLCAweEQwLCAweEZGLCAweEZGLCAweDY0LCAweDQ0LCAweEUwLCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LAorCSAweEUxLCAweDdGLCAweDVBLCAweEQwLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEUyLCAweDdGLCAweEEwLCAweDVBLCAweDAwLCAweDYwLCAweDQwLCAweEYzLAorCSAweEZGLCAweEZGLCAweEEwLCAweEQxLCAweDVBLCAweEQxLCAweDY0LCAweDQ1LCAweDY0LCAweDQ0LCAweEUzLCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LAorCSAweEU0LCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEU1LCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEU2LCAweDdGLAorCSAweDVBLCAweEQxLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEU3LCAweDdGLCAweEEwLCAweDVBLCAweDY1LCAweDQwLCAweDBELCAweDNBLCAweDFDLCAweDAwLAorCSAweDY0LCAweDQ3LCAweEU4LCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEU5LCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LAorCSAweEVBLCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEVCLCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEVDLCAweDdGLAorCSAweDVBLCAweEQxLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEVELCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEVFLCAweDdGLCAweDVBLCAweEQxLAorCSAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEVGLCAweDdGLCAweEEwLCAweDVBLCAweDA4LCAweDYwLCAweDAwLCAweEVBLCAweDY1LCAweDQ0LCAweDAyLCAweEE0LAorCSAweDYwLCAweDdGLCAweEEwLCAweDVBLCAweDgwLCAweDYwLCAweDAwLCAweEVBLCAweEEwLCAweDYwLCAweDAwLCAweEVBLCAweEQxLCAweDYwLCAweDAwLCAweEVBLAorCSAweDBCLCAweEYyLCAweEZGLCAweEZGLCAweDdGLCAweEI0LCAweDBDLCAweEYwLCAweDA0LCAweDAyLCAweDY0LCAweDQ2LCAweDAwLCAweEYwLCAweDA0LCAweDY0LAorCSAweDIyLCAweDQ2LCAweDAzLCAweEZBLCAweDYwLCAweDQxLCAweDY0LCAweDQ2LCAweDAxLCAweEYyLCAweEZDLCAweEExLCAweDYxLCAweDQ1LCAweEQ0LCAweDg0LAorCSAweEZGLCAweEZGLCAweDA4LCAweDAyLCAweDAwLCAweEYwLCAweDA0LCAweDYzLCAweDY0LCAweDQ2LCAweDAxLCAweEYyLCAweDIyLCAweDQ2LCAweDFBLCAweEZBLAorCSAweDAzLCAweEZDLCAweDAyLCAweDAwLCAweDIyLCAweDQ2LCAweDFBLCAweEZBLCAweDM1LCAweEYyLCAweDA0LCAweEY4LCAweERDLCAweDg0LCAweDM1LCAweEZBLAorCSAweDE0LCAweEYyLCAweDBGLCAweEI1LCAweDBGLCAweEI0LCAweENDLCAweDg0LCAweDk0LCAweDgwLCAweDA0LCAweDYwLCAweDAwLCAweDY1LCAweDJBLCAweEYyLAorCSAweDAxLCAweDAyLCAweDk0LCAweDg0LCAweDJBLCAweEZBLCAweDk1LCAweEZDLCAweDA2LCAweDAwLCAweEM0LCAweDNBLCAweDA3LCAweDAwLCAweDI3LCAweDQ0LAorCSAweEZELCAweEI0LCAweDQwLCAweDQ3LCAweEE4LCAweEUyLCAweEE1LCAweDYwLCAweDdBLCAweDc4LCAweEZGLCAweEZGLCAweDI4LCAweDQ0LCAweDA0LCAweDI2LAorCSAweDA1LCAweDAwLCAweDY4LCAweDNBLCAweDAzLCAweDAwLCAweDMyLCAweDQ0LCAweDAwLCAweDI3LCAweDAzLCAweDAwLCAweEE0LCAweDYwLCAweDdDLCAweDc4LAorCSAweEZGLCAweEZGLCAweDBBLCAweDY0LCAweDNBLCAweERCLCAweEE0LCAweDYwLCAweDdDLCAweDc4LCAweEZGLCAweEZGLCAweDBFLCAweDY0LCAweDNBLCAweERCLAorCSAweDNDLCAweDQ0LCAweDYwLCAweDQ2LCAweDFFLCAweEYwLCAweDQwLCAweDQyLCAweDY0LCAweDQwLCAweDQwLCAweDI3LCAweDQ4LCAweDAwLCAweDFGLCAweEYyLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDQwLCAweDI3LCAweDNDLCAweDAwLCAweDgwLCAweDJCLCAweDBCLCAweDAwLCAweEJGLCAweDYwLCAweEZGLCAweDY1LAorCSAweDI5LCAweDQ0LCAweDI0LCAweDg5LCAweDgwLCAweDYwLCAweDAwLCAweDY1LCAweDI5LCAweDQ0LCAweDM0LCAweDg5LCAweDgwLCAweDYwLCAweDAwLCAweDYzLAorCSAweDA1LCAweDAwLCAweDNGLCAweDYwLCAweEZGLCAweDY1LCAweDI5LCAweDQ0LCAweDI0LCAweDg5LCAweDAwLCAweDYzLCAweDFFLCAweEYyLCAweDM5LCAweEYxLAorCSAweEMwLCAweDYwLCAweEZGLCAweEI1LCAweDBBLCAweDE4LCAweDYwLCAweDQ3LCAweDFGLCAweEI0LCAweEQwLCAweDg0LCAweEUwLCAweEEwLCAweDAyLCAweDBELAorCSAweDAwLCAweDY0LCAweDAyLCAweDAwLCAweDAxLCAweDA0LCAweDFGLCAweDY0LCAweDYwLCAweDQ3LCAweEI0LCAweDg0LCAweDA3LCAweDYwLCAweEVCLCAweEYxLAorCSAweDNDLCAweDk0LCAweEIwLCAweDg0LCAweDYwLCAweDRDLCAweDIyLCAweDYwLCAweEM2LCAweDY1LCAweDYwLCAweDQ3LCAweDFGLCAweEI0LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDVBLCAweEQxLCAweDAxLCAweDYwLCAweDAwLCAweEUxLCAweDA1LCAweDYwLCAweDY5LCAweDZCLCAweDYwLCAweDRDLAorCSAweEI1LCAweEZGLCAweDY0LCAweDRDLCAweDdDLCAweDQ0LCAweDI5LCAweDQwLCAweDgwLCAweDJCLCAweDY3LCAweDQ0LCAweDYwLCAweDRDLCAweDMyLCAweDAwLAorCSAweDE1LCAweDYwLCAweERELCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA0LCAweDI2LCAweENCLCAweDAxLCAweEJGLCAweDAxLCAweDQwLCAweDYwLAorCSAweDAwLCAweDY1LCAweDI5LCAweDQ0LCAweDM0LCAweDg5LCAweDQwLCAweDYwLCAweDAwLCAweDYzLCAweDlGLCAweEYyLCAweDFFLCAweEYyLCAweDM5LCAweEYxLAorCSAweEMwLCAweDYwLCAweEZGLCAweEI1LCAweDBBLCAweDE4LCAweDYwLCAweDQ3LCAweDFGLCAweEI0LCAweEQwLCAweDg0LCAweEUwLCAweEEwLCAweDAyLCAweDBELAorCSAweDAwLCAweDY0LCAweDAyLCAweDAwLCAweDAxLCAweDA0LCAweDFGLCAweDY0LCAweDYwLCAweDQ3LCAweEI0LCAweDg0LCAweDA3LCAweDYwLCAweEVCLCAweEYxLAorCSAweDNDLCAweDk0LCAweEIwLCAweDgxLCAweDYxLCAweDRDLCAweDIyLCAweDYwLCAweEM2LCAweDY1LCAweDYxLCAweDQ3LCAweDFGLCAweEI0LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDVBLCAweEQxLCAweDAxLCAweDYwLCAweDAwLCAweEUxLCAweDAxLCAweDYwLCAweDA5LCAweDZCLCAweDYwLCAweDRDLAorCSAweEI1LCAweEZGLCAweDY0LCAweDRDLCAweDQwLCAweEUxLCAweDAxLCAweDYwLCAweDA4LCAweEUxLCAweDg0LCAweEZGLCAweEMxLCAweDYwLCAweDZCLCAweDY0LAorCSAweDQwLCAweDQyLCAweDgyLCAweEZGLCAweDJBLCAweEYyLCAweDEwLCAweDYwLCAweDAwLCAweDY1LCAweEE0LCAweDg0LCAweEI0LCAweEJDLCAweDFFLCAweEYwLAorCSAweDQwLCAweDQ4LCAweDY0LCAweDQwLCAweDQwLCAweDI3LCAweDE3LCAweDAwLCAweDFDLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDBBLCAweDM2LAorCSAweDA2LCAweDAwLCAweDE0LCAweDM2LCAweDA3LCAweDAwLCAweDM3LCAweDM2LCAweDA4LCAweDAwLCAweDZFLCAweDM2LCAweDA5LCAweDAwLCAweDcwLCAweDdDLAorCSAweEEwLCAweDYzLCAweDBGLCAweDAwLCAweDM4LCAweDdDLCAweDUwLCAweDYzLCAweDBDLCAweDAwLCAweDE1LCAweDdDLCAweDFFLCAweDYzLCAweDA5LCAweDAwLAorCSAweDBCLCAweDdDLCAweDBGLCAweDYzLCAweDA2LCAweDAwLCAweDlDLCAweEY0LCAweEZGLCAweDY1LCAweDYzLCAweDQ3LCAweEE0LCAweDlDLCAweEE3LCAweDg0LAorCSAweDIzLCAweDAwLCAweDQwLCAweDQ1LCAweDQzLCAweDRELCAweDAwLCAweEUxLCAweEYwLCAweEZFLCAweDI5LCAweDQwLCAweDgwLCAweDJCLCAweDAzLCAweDAwLAorCSAweDAwLCAweDYwLCAweDZBLCAweDY1LCAweDAyLCAweDAwLCAweDAwLCAweDYwLCAweENBLCAweDY1LCAweDFGLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLAorCSAweDQwLCAweDI3LCAweDBFLCAweDAwLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA0LCAweDI3LCAweDAzLCAweDAwLCAweDY1LCAweDQ0LAorCSAweEUwLCAweDg1LCAweDEyLCAweDAwLCAweDJCLCAweEYyLCAweDExLCAweEYwLCAweEMwLCAweDg0LCAweEQwLCAweDg0LCAweEM0LCAweDgzLCAweDExLCAweDAwLAorCSAweDFFLCAweDY0LCAweEM0LCAweDg0LCAweDYwLCAweDQ1LCAweDA4LCAweDAwLCAweDQwLCAweDQ1LCAweEZGLCAweDYwLCAweEY4LCAweDY0LCAweDQwLCAweDQzLAorCSAweDAwLCAweEUxLCAweEYwLCAweEZFLCAweDAwLCAweDYwLCAweDNDLCAweDY1LCAweDkxLCAweEY0LCAweDFCLCAweEYwLCAweEMzLCAweDg0LCAweEM0LCAweDg0LAorCSAweEMwLCAweDgzLCAweDI4LCAweDQ0LCAweEExLCAweEZGLCAweDEyLCAweDc0LCAweDgwLCAweDRFLCAweDEyLCAweDc0LCAweDgzLCAweDRDLCAweDlBLCAweEZGLAorCSAweDEyLCAweDc0LCAweDU2LCAweDYyLCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LAorCSAweDVDLCAweDYyLCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweEExLCAweEZGLAorCSAweDk4LCAweEZGLCAweEIxLCAweDYwLCAweDU4LCAweDRGLCAweDAwLCAweDc4LCAweEZGLCAweEZGLCAweEJDLCAweEZGLCAweEI1LCAweEZGLCAweDAxLCAweDYwLAorCSAweDE4LCAweEUxLCAweDQ3LCAweEZGLCAweDI3LCAweDQ0LCAweDAyLCAweEJDLCAweDQwLCAweDQ3LCAweDM2LCAweEYzLCAweEI2LCAweEZGLCAweEI3LCAweEZGLAorCSAweEI0LCAweEZGLCAweEM4LCAweDYwLCAweDA5LCAweDdELCAweDdDLCAweDRCLCAweDYwLCAweDU2LCAweEFELCAweEUyLCAweEE1LCAweDYwLCAweEM3LCAweDc4LAorCSAweEZGLCAweEZGLCAweDE1LCAweDYwLCAweERELCAweEYzLCAweDE1LCAweDYwLCAweEJFLCAweEYzLCAweDYwLCAweDQwLCAweDA0LCAweDI2LCAweDBCLCAweDAwLAorCSAweDA3LCAweEI0LCAweDYwLCAweDQwLCAweDAxLCAweDM2LCAweDA3LCAweDAwLCAweDI5LCAweDQ0LCAweEJGLCAweDYwLCAweEZGLCAweEI3LCAweDgwLCAweEJGLAorCSAweDQwLCAweDQ5LCAweDgwLCAweDY3LCAweDA1LCAweDAwLCAweDNGLCAweDYwLCAweEZGLCAweDY1LCAweDI5LCAweDQ0LCAweDI0LCAweDg5LCAweDAwLCAweDY0LAorCSAweDEyLCAweDYwLCAweEQzLCAweEYxLCAweEZGLCAweEZGLCAweDE1LCAweDYwLCAweEQ4LCAweEY5LCAweDM5LCAweEYxLCAweDEyLCAweDYwLCAweEJGLCAweEYxLAorCSAweDY0LCAweDQxLCAweDY0LCAweDVFLCAweDYwLCAweDQ1LCAweDY0LCAweDQ3LCAweDFGLCAweEI0LCAweDU0LCAweDk0LCAweEUwLCAweEEwLCAweDAyLCAweDBELAorCSAweDAwLCAweDY0LCAweDAyLCAweDAwLCAweDAxLCAweDA0LCAweDFGLCAweDY0LCAweDYwLCAweDQ3LCAweDA3LCAweDYwLCAweEVCLCAweEYxLCAweEI0LCAweDg0LAorCSAweEIwLCAweDhDLCAweDIyLCAweDYwLCAweEM2LCAweDdDLCAweDYwLCAweDQ3LCAweDFGLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDQwLCAweEQzLAorCSAweDVBLCAweEQxLCAweDAxLCAweDYwLCAweDAwLCAweEUxLCAweDA1LCAweDYwLCAweDY5LCAweDZCLCAweDYwLCAweDRDLCAweEI1LCAweEZGLCAweDY0LCAweDRDLAorCSAweDdDLCAweDQ0LCAweDI5LCAweDQwLCAweDgwLCAweDJCLCAweDY3LCAweDQ0LCAweDYwLCAweDRDLCAweDQwLCAweEUxLCAweDAxLCAweDYwLCAweDA4LCAweEUxLAorCSAweDg0LCAweEZGLCAweEMxLCAweDYwLCAweDZCLCAweDY0LCAweDQwLCAweDQyLCAweDgyLCAweEZGLCAweDNDLCAweDQ0LCAweDYwLCAweDQ2LCAweDQwLCAweDQyLAorCSAweDEzLCAweDY0LCAweDNBLCAweERCLCAweDEwLCAweDYwLCAweDAwLCAweDY1LCAweDNDLCAweDQ2LCAweDJBLCAweEYyLCAweDE1LCAweDYwLCAweEJFLCAweEYxLAorCSAweEE0LCAweDg0LCAweEM0LCAweEJDLCAweDQwLCAweDQ4LCAweDY0LCAweDQ0LCAweDA0LCAweDI2LCAweDA5LCAweDAwLCAweDAyLCAweDI2LCAweDBBLCAweDAwLAorCSAweDAxLCAweDI2LCAweDBCLCAweDAwLCAweDA4LCAweDJBLCAweDAzLCAweDAwLCAweDBCLCAweDYzLCAweDZFLCAweDY0LCAweDA4LCAweDAwLCAweDE1LCAweDYzLAorCSAweDM3LCAweDY0LCAweDA1LCAweDAwLCAweDM4LCAweDYzLCAweDE0LCAweDY0LCAweDAyLCAweDAwLCAweDcwLCAweDYzLCAweDBBLCAweDY0LCAweDQzLCAweDRELAorCSAweDQwLCAweDQ1LCAweDAwLCAweEUxLCAweEYwLCAweEZFLCAweDAwLCAweDYwLCAweDFFLCAweDY0LCAweDFCLCAweEYwLCAweDExLCAweEYwLCAweEMwLCAweDg0LAorCSAweEMwLCAweDg0LCAweDYwLCAweDQzLCAweDI4LCAweDQ0LCAweEExLCAweEZGLCAweDEyLCAweDc0LCAweDgwLCAweDRFLCAweDEyLCAweDc0LCAweDgzLCAweDRDLAorCSAweDlBLCAweEZGLCAweDEyLCAweDc0LCAweDVDLCAweDYyLCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LAorCSAweDEyLCAweDc0LCAweEExLCAweEZGLCAweDk4LCAweEZGLCAweEIxLCAweDYwLCAweDU4LCAweDRGLCAweDAwLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDYwLAorCSAweDE4LCAweEUxLCAweDc4LCAweDQ0LCAweDAzLCAweEE0LCAweDM1LCAweEZCLCAweEIxLCAweDYwLCAweDQzLCAweDc4LCAweEZGLCAweEZGLCAweEM0LCAweEUyLAorCSAweDA4LCAweDY0LCAweDNBLCAweERCLCAweEE1LCAweDYwLCAweDFDLCAweDc4LCAweEZGLCAweEZGLCAweDI0LCAweDQwLCAweDAxLCAweDJBLCAweDBFLCAweDAwLAorCSAweDFELCAweEZGLCAweDI2LCAweDQ0LCAweDAyLCAweEJDLCAweDQwLCAweDQ2LCAweDI3LCAweDQ0LCAweDA3LCAweDIyLCAweDA1LCAweDAwLCAweEY4LCAweEI0LAorCSAweDQwLCAweDQ3LCAweDA2LCAweDY0LCAweDMxLCAweEZCLCAweEMwLCAweEZFLCAweDMwLCAweEYxLCAweDUyLCAweDAwLCAweEZDLCAweEIzLCAweDMyLCAweDQwLAorCSAweDAxLCAweDJBLCAweDA2LCAweDAwLCAweDBBLCAweEJCLCAweDBGLCAweEZDLCAweENCLCAweEZFLCAweEE0LCAweDYwLCAweDdDLCAweDc4LCAweEZGLCAweEZGLAorCSAweDI0LCAweDQ0LCAweDA0LCAweDI2LCAweDAyLCAweDAwLCAweDBGLCAweEZDLCAweDA1LCAweEZGLCAweDMwLCAweEYxLCAweDI3LCAweDQ0LCAweDA1LCAweDIyLAorCSAweDJDLCAweDAwLCAweEZBLCAweEI0LCAweDQwLCAweDQ3LCAweDI0LCAweDQ0LCAweDEwLCAweDJBLCAweDIzLCAweDAwLCAweDI4LCAweDQwLCAweEQ0LCAweDNBLAorCSAweDIwLCAweDAwLCAweDMxLCAweDQwLCAweDA4LCAweDI2LCAweDAwLCAweDdDLCAweDJCLCAweDQ0LCAweEQwLCAweDgwLCAweDcwLCAweDQ1LCAweDAyLCAweDI4LAorCSAweDY0LCAweDQ0LCAweEM0LCAweDg0LCAweEZGLCAweEZGLCAweDA0LCAweDI0LCAweDAwLCAweEI0LCAweDYwLCAweDUwLCAweDA4LCAweDI4LCAweDAxLCAweDAwLAorCSAweDIwLCAweDI5LCAweDZELCAweEUyLCAweDFELCAweEYwLCAweEMwLCAweDY0LCAweEMwLCAweDg0LCAweDBBLCAweDYwLCAweDdCLCAweEYxLCAweEU4LCAweDg0LAorCSAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEMwLCAweDg0LCAweEEyLCAweERCLCAweEE1LCAweDYwLCAweENELCAweDc4LAorCSAweEZGLCAweEZGLCAweDAyLCAweDY0LCAweDMxLCAweEZCLCAweEMwLCAweEZFLCAweDA3LCAweDAwLCAweDAyLCAweDJBLCAweDA1LCAweDAwLCAweEZELCAweEI0LAorCSAweDQwLCAweDQ3LCAweDA2LCAweDY0LCAweDMxLCAweEZCLCAweEMwLCAweEZFLCAweDA1LCAweDY0LCAweDNBLCAweERCLCAweDI4LCAweDQ0LCAweEE0LCAweDNBLAorCSAweDA3LCAweDAwLCAweDAxLCAweDYwLCAweDAyLCAweDdDLCAweDI1LCAweDQ0LCAweDBBLCAweDNBLCAweDAyLCAweDAwLCAweDAxLCAweDYwLCAweDNBLCAweDdDLAorCSAweDMxLCAweDQwLCAweDA4LCAweDI2LCAweDAwLCAweDdDLCAweDJCLCAweDQ0LCAweEQwLCAweDgwLCAweDcwLCAweDQ1LCAweDAyLCAweDI4LCAweDY0LCAweDQ0LAorCSAweEM0LCAweDg0LCAweEZGLCAweEZGLCAweDA0LCAweDI0LCAweDAwLCAweEI0LCAweDI4LCAweDQwLCAweEU0LCAweDM2LCAweDAwLCAweEI0LCAweDYwLCAweDUwLAorCSAweDA4LCAweDI4LCAweDAxLCAweDAwLCAweDIwLCAweDI5LCAweDZELCAweEUyLCAweEE0LCAweDYwLCAweDZGLCAweDc4LCAweEZGLCAweEZGLCAweDI3LCAweDQ0LAorCSAweDA1LCAweDIyLCAweDA5LCAweDAwLCAweEJBLCAweEI0LCAweDQwLCAweDQ3LCAweDNDLCAweDQ2LCAweDAyLCAweDY0LCAweDMxLCAweEZCLCAweEMwLCAweEZFLAorCSAweEE0LCAweDYwLCAweDdDLCAweDc4LCAweEZGLCAweEZGLCAweDI3LCAweDQ0LCAweDAyLCAweDJBLCAweDA2LCAweDAwLCAweEZELCAweEI0LCAweDQwLCAweDQ3LAorCSAweDA2LCAweDY0LCAweDMxLCAweEZCLCAweEMwLCAweEZFLCAweEY0LCAweDAxLCAweEYzLCAweDBBLCAweDdDLCAweDUwLCAweDZELCAweEUyLCAweEYwLCAweDAxLAorCSAweDcyLCAweDQ1LCAweERDLCAweDg0LCAweDk0LCAweEZCLCAweDExLCAweDY0LCAweDNBLCAweERCLCAweDk1LCAweEYzLCAweDA2LCAweDA0LCAweERDLCAweDg0LAorCSAweDk1LCAweEZCLCAweDk2LCAweEYzLCAweDAyLCAweDA0LCAweERDLCAweDg0LCAweDk2LCAweEZCLCAweEE0LCAweDYwLCAweDg3LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDYxLCAweDEyLCAweDY0LCAweDNBLCAweERCLCAweDE4LCAweDYwLCAweEVFLCAweDYzLCAweEJELCAweEQzLCAweDcyLCAweDQ1LCAweDQ0LCAweDhBLAorCSAweDAyLCAweDI4LCAweDAzLCAweDAwLCAweEU0LCAweEUyLCAweERELCAweDgxLCAweDA0LCAweDAwLCAweDAyLCAweDI4LCAweDAyLCAweDAwLCAweEU0LCAweEUyLAorCSAweERELCAweDgxLCAweEJELCAweEQzLCAweDk0LCAweEYxLCAweDYxLCAweDQ1LCAweEMwLCAweDg0LCAweDAwLCAweDYxLCAweDAyLCAweDI0LCAweDAxLCAweEI5LAorCSAweEM0LCAweDg0LCAweDYwLCAweDU1LCAweDJBLCAweDUyLCAweEU0LCAweEUyLCAweDk0LCAweEZCLCAweDAyLCAweDI0LCAweDAxLCAweEI5LCAweEJELCAweEQzLAorCSAweDk1LCAweEYxLCAweDYxLCAweDQ1LCAweEMwLCAweDg0LCAweDAwLCAweDYxLCAweDAyLCAweDI0LCAweDAxLCAweEI5LCAweEM0LCAweDg0LCAweDk1LCAweEZCLAorCSAweDAyLCAweDI0LCAweDAxLCAweEI5LCAweEJELCAweEQzLCAweDk2LCAweEYxLCAweDYxLCAweDQ1LCAweEMwLCAweDg0LCAweEM0LCAweDg0LCAweDk2LCAweEZCLAorCSAweEE1LCAweDYwLCAweDcxLCAweDc4LCAweEZGLCAweEZGLCAweEFDLCAweDAxLCAweDQ3LCAweEZGLCAweDQ0LCAweEZGLCAweEM4LCAweDc0LCAweENELCAweEUyLAorCSAweEFBLCAweDYwLCAweEZFLCAweDc4LCAweDAwLCAweDYxLCAweEE0LCAweDYwLCAweDdDLCAweDc4LCAweEZGLCAweEZGLCAweDVDLCAweDQ0LCAweDI2LCAweDQ0LAorCSAweDAyLCAweDI2LCAweDBDLCAweDAwLCAweDNFLCAweDQ2LCAweDA5LCAweEYyLCAweDFFLCAweDQxLCAweDAzLCAweDFCLCAweEFDLCAweDYwLCAweDE0LCAweDc4LAorCSAweEZGLCAweEZGLCAweDQwLCAweDVFLCAweEZELCAweEZCLCAweDIxLCAweDQ0LCAweDAyLCAweDY0LCAweDQwLCAweDQ2LCAweDQxLCAweDVELCAweDIxLCAweDQ2LAorCSAweDAwLCAweDY0LCAweDMxLCAweEZBLCAweDAwLCAweEYyLCAweDQ2LCAweDQ1LCAweDg3LCAweEZDLCAweEFDLCAweEUyLCAweDAxLCAweDY0LCAweDMzLCAweEZCLAorCSAweDMyLCAweDQwLCAweDAxLCAweDJBLCAweDIxLCAweDAwLCAweDE5LCAweEYzLCAweDAxLCAweDYwLCAweDFFLCAweEUxLCAweDFELCAweDE4LCAweDgwLCAweDY0LAorCSAweDQwLCAweDQ5LCAweDAwLCAweEUxLCAweDE5LCAweEZGLCAweDA4LCAweDY0LCAweDJBLCAweEZBLCAweDVBLCAweERBLCAweDJDLCAweEZBLCAweDVBLCAweERBLAorCSAweDVBLCAweERBLCAweEQyLCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEJDLCAweEQyLCAweEZCLCAweDcyLCAweDQ0LCAweDI0LCAweEZBLCAweDk0LCAweEYzLAorCSAweDI1LCAweEZBLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweEI2LCAweEZGLCAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweEM4LCAweDYwLCAweDA5LCAweDdELAorCSAweDdDLCAweDRCLCAweEE0LCAweDYwLCAweDdDLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweEUxLCAweDAxLCAweDYwLCAweDFBLCAweEUxLCAweDNGLCAweDYwLAorCSAweENGLCAweDY1LCAweDI5LCAweDQ0LCAweDI0LCAweDg5LCAweDJFLCAweDQ0LCAweDAwLCAweDM2LCAweDQxLCAweDAwLCAweDAxLCAweDNBLCAweEM5LCAweDAwLAorCSAweDg4LCAweEZGLCAweDQwLCAweDY3LCAweDI5LCAweDQ1LCAweDM0LCAweDg5LCAweDA0LCAweDY0LCAweDg5LCAweEZGLCAweDYwLCAweDU0LCAweDg4LCAweEZGLAorCSAweEExLCAweEZGLCAweDZDLCAweDQ1LCAweDY1LCAweDQ0LCAweDBGLCAweEI0LCAweDQwLCAweDQ1LCAweDFDLCAweEZBLCAweDY1LCAweDQ0LCAweDI5LCAweDQxLAorCSAweEY5LCAweDgxLCAweDUyLCAweDRBLCAweDcxLCAweDg5LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDgzLCAweDFELCAweEZDLAorCSAweDFCLCAweEZDLCAweDk4LCAweEYxLCAweEZDLCAweEEzLCAweEQzLCAweDgwLCAweDQzLCAweDQzLCAweDAzLCAweDA0LCAweEFDLCAweDYwLCAweDBBLCAweDc4LAorCSAweEZGLCAweEZGLCAweDA5LCAweDdDLCAweEQzLCAweDgwLCAweDlBLCAweEZGLCAweDAzLCAweDA3LCAweEFDLCAweDYwLCAweDBBLCAweDc4LCAweEZGLCAweEZGLAorCSAweDI1LCAweDQ0LCAweDAxLCAweDI2LCAweDBGLCAweEFDLCAweDFGLCAweDYwLCAweDUwLCAweDY1LCAweDQ0LCAweEQzLCAweDEyLCAweDY1LCAweDQ1LCAweDQ2LAorCSAweDYwLCAweDQ3LCAweDQwLCAweDdGLCAweDI3LCAweEZBLCAweDhGLCAweEZDLCAweDE4LCAweDYxLCAweENCLCAweEYxLCAweEExLCAweEZGLCAweDZDLCAweDQ0LAorCSAweERDLCAweDgwLCAweEZGLCAweEZGLCAweDIxLCAweDAzLCAweDUwLCAweEZFLCAweEFDLCAweDYwLCAweDIwLCAweDc4LCAweEZGLCAweEZGLCAweEM4LCAweDYwLAorCSAweDBCLCAweDdELCAweDA4LCAweDYwLCAweDAwLCAweDZCLCAweEI1LCAweEZGLCAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweEFBLCAweDc0LCAweENELCAweEUyLAorCSAweDAyLCAweDY0LCAweDg5LCAweEZGLCAweDYwLCAweDU0LCAweDg4LCAweEZGLCAweDAxLCAweDYwLCAweDA4LCAweEUxLCAweDA1LCAweEUxLCAweEExLCAweEZGLAorCSAweEZGLCAweEZGLCAweDA0LCAweDI1LCAweDc2LCAweDAwLCAweDZDLCAweDQ0LCAweDBBLCAweDM2LCAweDA3LCAweDAwLCAweDE0LCAweDM2LCAweDA1LCAweDAwLAorCSAweDM3LCAweDM2LCAweDAzLCAweDAwLCAweDZFLCAweDM2LCAweDAxLCAweDAwLCAweDZDLCAweDAwLCAweDQwLCAweDQ1LCAweDMyLCAweDc0LCAweEExLCAweEZGLAorCSAweDFDLCAweEZBLCAweDQwLCAweDRFLCAweDhDLCAweDQ0LCAweDYwLCAweDQzLCAweDFELCAweEZBLCAweDAxLCAweEUxLCAweDIwLCAweDY0LCAweDNBLCAweERCLAorCSAweDJFLCAweDQ0LCAweDE0LCAweDM2LCAweDEyLCAweDAwLCAweDBBLCAweDM2LCAweDBGLCAweDAwLCAweDYzLCAweDQ1LCAweEUzLCAweDgzLCAweEUzLCAweDgzLAorCSAweEM3LCAweDgzLCAweEUzLCAweDgzLCAweEM3LCAweDgzLCAweEZGLCAweEZGLCAweDM3LCAweDM2LCAweDA1LCAweDAwLCAweDZFLCAweDM2LCAweDA0LCAweDAwLAorCSAweEFDLCAweDYwLCAweDFFLCAweDc4LCAweEZGLCAweEZGLCAweEVCLCAweDgzLCAweEVCLCAweDgzLCAweEVCLCAweDgzLCAweEVCLCAweDgzLCAweEZGLCAweEZGLAorCSAweDgwLCAweDI3LCAweENGLCAweDgzLCAweDFCLCAweEZDLCAweDAxLCAweDY0LCAweDRGLCAweEZCLCAweEExLCAweEZGLCAweDI5LCAweDQxLCAweEY5LCAweDgxLAorCSAweDUyLCAweDRBLCAweDcxLCAweDg5LCAweDJFLCAweDQ0LCAweDI3LCAweEZBLCAweDk4LCAweEYxLCAweEZDLCAweEEzLCAweEQzLCAweDgwLCAweDQzLCAweDQzLAorCSAweDAzLCAweDA0LCAweEFDLCAweDYwLCAweDBBLCAweDc4LCAweEZGLCAweEZGLCAweDlBLCAweEZGLCAweDU0LCAweDYzLCAweDEyLCAweDY0LCAweDQwLCAweDQ2LAorCSAweDhGLCAweEZDLCAweDE4LCAweDYxLCAweENCLCAweEYxLCAweDUwLCAweEZFLCAweDZDLCAweDQwLCAweDlFLCAweDE1LCAweDAxLCAweDYwLCAweDA4LCAweEUxLAorCSAweDgwLCAweEUxLCAweDAwLCAweDY0LCAweDMzLCAweEZCLCAweDAxLCAweDYwLCAweDE4LCAweEUxLCAweDAxLCAweDExLCAweDBGLCAweDAwLCAweDI5LCAweDQ0LAorCSAweDIwLCAweEJDLCAweDQwLCAweDQ5LCAweDAxLCAweDY0LCAweDMzLCAweEZCLCAweEI2LCAweEZGLCAweDAwLCAweEUxLCAweDAxLCAweDYwLCAweDFBLCAweEUxLAorCSAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDZDLCAweDQwLCAweEZDLCAweDExLCAweDAxLCAweDYwLCAweDE4LCAweEUxLCAweEI1LCAweEZGLCAweEI2LCAweEZGLAorCSAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweEM4LCAweDYwLCAweDA5LCAweDdELCAweDdDLCAweDRCLCAweDM1LCAweEUxLCAweEFDLCAweEUyLCAweEFBLCAweDYwLAorCSAweDk3LCAweDc4LCAweEZGLCAweEZGLCAweDEzLCAweDYwLCAweDAyLCAweEYzLCAweEZGLCAweEZGLCAweERDLCAweDg0LCAweDAwLCAweDM2LCAweDAwLCAweDNCLAorCSAweEEyLCAweERCLCAweDIxLCAweDY0LCAweDNBLCAweERCLCAweEQyLCAweDAxLCAweDI1LCAweDYwLCAweEYyLCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLAorCSAweEM3LCAweDc4LCAweDk3LCAweEYxLCAweDJBLCAweDY0LCAweDNBLCAweERCLCAweDVDLCAweDQxLCAweEM4LCAweDAxLCAweDI5LCAweDY0LCAweDNBLCAweERCLAorCSAweDg4LCAweDYwLCAweDg1LCAweDcxLCAweDhELCAweEUyLCAweEEyLCAweEZDLCAweDMyLCAweDQwLCAweDAxLCAweDJBLCAweEE4LCAweDAwLCAweDAxLCAweDYwLAorCSAweDFBLCAweEUxLCAweDIzLCAweDQzLCAweEExLCAweEZGLCAweEVDLCAweDQ0LCAweDJBLCAweEZBLCAweDQwLCAweDQ4LCAweEExLCAweEZGLCAweDdBLCAweERDLAorCSAweDdFLCAweDM2LCAweDA0LCAweEEyLCAweEZDLCAweDFDLCAweDAzLCAweDFELCAweDAwLCAweDY0LCAweDNGLCAweEZBLCAweDJFLCAweDAwLCAweDAzLCAweDJCLAorCSAweDA0LCAweDAwLCAweEExLCAweEZGLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDhGLCAweEIwLCAweDg4LCAweDNBLCAweDAzLCAweDAwLAorCSAweDcwLCAweDYyLCAweEExLCAweEZGLCAweDdBLCAweERDLCAweDI4LCAweDQwLCAweDQwLCAweDJCLCAweDA2LCAweDAwLCAweDcyLCAweDYyLCAweEExLCAweEZGLAorCSAweDdBLCAweERDLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDNGLCAweEZDLCAweDAwLCAweEY0LCAweDEwLCAweDYyLCAweDZFLCAweDYxLAorCSAweEExLCAweEZGLCAweDA1LCAweDFELCAweDEyLCAweDFFLCAweDBDLCAweDAwLCAweDAwLCAweEY0LCAweDdDLCAweDYxLCAweDAyLCAweDYyLCAweDdBLCAweERDLAorCSAweDYzLCAweDQwLCAweEZELCAweDFDLCAweEY5LCAweDFELCAweEZGLCAweEIxLCAweDA4LCAweDFFLCAweDAyLCAweDAyLCAweDAwLCAweEY0LCAweDAyLCAweDYyLAorCSAweEI2LCAweEZGLCAweEI3LCAweEZGLCAweEExLCAweEZGLCAweDZDLCAweDQ0LCAweDVBLCAweERBLCAweDk4LCAweEZGLCAweEExLCAweEZGLCAweDZDLCAweDQwLAorCSAweEExLCAweEZGLCAweDQ3LCAweEZGLCAweDdDLCAweDQ0LCAweDMzLCAweEZCLCAweDI2LCAweDQ0LCAweEZELCAweEI0LCAweDg0LCAweEJDLCAweDAxLCAweDE1LAorCSAweDdGLCAweEI0LCAweDQwLCAweDQ2LCAweDZDLCAweDQwLCAweEI2LCAweEZGLCAweEI3LCAweEZGLCAweEExLCAweEZGLCAweDZDLCAweDQ1LCAweEExLCAweEZGLAorCSAweDdGLCAweDYwLCAweDdGLCAweDdDLCAweDZDLCAweDQ0LCAweEEwLCAweDg0LCAweDE1LCAweEE3LCAweDE1LCAweEE0LCAweDIxLCAweDQ2LCAweDI2LCAweEZBLAorCSAweDI5LCAweDQwLCAweDQwLCAweDJCLCAweDA3LCAweDAwLCAweEI2LCAweEZGLCAweDQwLCAweDYwLCAweDAwLCAweDY1LCAweEExLCAweEZGLCAweDZDLCAweDQ0LAorCSAweDFBLCAweEZBLCAweDA5LCAweDAwLCAweDY1LCAweDQ0LCAweDBGLCAweEI0LCAweDA2LCAweEE4LCAweDgwLCAweDYwLCAweDAwLCAweDY1LCAweDA4LCAweDI4LAorCSAweDdDLCAweDQ1LCAweDI5LCAweDQ0LCAweDM0LCAweDg5LCAweDI3LCAweEYwLCAweDY1LCAweDQ0LCAweDY0LCAweDVFLCAweDI3LCAweEZBLCAweDgxLCAweEUxLAorCSAweDAxLCAweDYwLCAweDE4LCAweEUxLCAweDAxLCAweDExLCAweDBGLCAweDAwLCAweDI5LCAweDQ0LCAweDIwLCAweEJDLCAweDQwLCAweDQ5LCAweDAxLCAweDY0LAorCSAweDMzLCAweEZCLCAweEI2LCAweEZGLCAweDAwLCAweEUxLCAweDAxLCAweDYwLCAweDFBLCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDZDLCAweDQwLAorCSAweEZDLCAweDExLCAweDAxLCAweDYwLCAweDE4LCAweEUxLCAweDIxLCAweDQ2LCAweEI1LCAweEZGLCAweEJDLCAweEZGLCAweDQ3LCAweEZGLCAweEI2LCAweEZGLAorCSAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweEM4LCAweDYwLCAweDA5LCAweDdELCAweDdDLCAweDRCLCAweDI2LCAweDQzLCAweDJBLCAweDQ0LCAweDcyLCAweDQ1LAorCSAweDI0LCAweEZBLCAweDk0LCAweEYzLCAweDA2LCAweDA0LCAweEU0LCAweEUyLCAweERDLCAweDlDLCAweDI5LCAweDQwLCAweDAxLCAweDI2LCAweDY0LCAweDQ0LAorCSAweDk0LCAweEY5LCAweDI1LCAweEZBLCAweDk1LCAweEYzLCAweDAyLCAweDA0LCAweERDLCAweDg0LCAweDk1LCAweEZCLCAweDI4LCAweEZBLCAweDk2LCAweEYzLAorCSAweDAyLCAweDA0LCAweERDLCAweDg0LCAweDk2LCAweEZCLCAweDI5LCAweEZBLCAweEFBLCAweDYwLCAweDFELCAweDc4LCAweEZGLCAweEZGLCAweEExLCAweEZGLAorCSAweDEyLCAweDYxLCAweDhDLCAweDQ0LCAweENDLCAweEYwLCAweDJBLCAweEZBLCAweDQwLCAweDQ4LCAweDA0LCAweDI2LCAweDQzLCAweDAwLCAweEExLCAweEZGLAorCSAweDhDLCAweDQ0LCAweDVBLCAweERBLCAweDMwLCAweEZCLCAweDZDLCAweDQ0LCAweDJDLCAweEZBLCAweEZGLCAweEZGLCAweDAxLCAweDI2LCAweDI2LCAweDAwLAorCSAweEQwLCAweDgwLCAweEExLCAweEZGLCAweDhDLCAweDQ0LCAweDZDLCAweDVDLCAweDAwLCAweEUxLCAweEYyLCAweEZFLCAweDJELCAweEZBLCAweENELCAweEYzLAorCSAweEQ0LCAweDgwLCAweEQwLCAweDgwLCAweDJFLCAweEY4LCAweDI0LCAweDQ0LCAweDE2LCAweDBDLCAweDMyLCAweDQwLCAweDAyLCAweDJBLCAweDA3LCAweDAwLAorCSAweDI4LCAweDQyLCAweDBDLCAweEIyLCAweDA4LCAweDNBLCAweDAzLCAweDAwLCAweDEwLCAweEJDLCAweDQwLCAweDQ0LCAweDVDLCAweDAwLCAweDA0LCAweDBBLAorCSAweEExLCAweEZGLCAweEFDLCAweDYwLCAweDEzLCAweDc4LCAweEZGLCAweEZGLCAweDExLCAweEJDLCAweDQwLCAweDQ0LCAweDI4LCAweDQ1LCAweEJGLCAweDYwLAorCSAweEZGLCAweDY0LCAweDI0LCAweDg4LCAweDUwLCAweDAwLCAweDMwLCAweEJDLCAweDQwLCAweDQ0LCAweDRELCAweDAwLCAweDIwLCAweEI5LCAweDVDLCAweDhFLAorCSAweEExLCAweEZGLCAweDhDLCAweDQ0LCAweDJELCAweEZBLCAweERDLCAweDlDLCAweDZDLCAweDQ0LCAweDAwLCAweEUxLCAweEYyLCAweEZFLCAweDJFLCAweEZBLAorCSAweDA4LCAweDI4LCAweDQ0LCAweDRFLCAweERDLCAweDg0LCAweDJFLCAweDVDLCAweEIwLCAweDg0LCAweEVGLCAweEIxLCAweDA4LCAweDI0LCAweDQwLCAweEI5LAorCSAweDQxLCAweDQ2LCAweDM5LCAweDAwLCAweDIzLCAweDQxLCAweDEzLCAweDY0LCAweDUxLCAweDkwLCAweDU2LCAweDYzLCAweDAzLCAweDA0LCAweEFDLCAweDYwLAorCSAweDBBLCAweDc4LCAweEZGLCAweEZGLCAweDhDLCAweDQ0LCAweDA0LCAweDYxLCAweDJCLCAweEZBLCAweDUwLCAweEZFLCAweDgwLCAweDI3LCAweDAwLCAweDY0LAorCSAweDMwLCAweEZCLCAweDhDLCAweDQ0LCAweDJDLCAweEZBLCAweEQwLCAweDgwLCAweDhDLCAweDQ0LCAweDJELCAweEZBLCAweEQ0LCAweDgwLCAweDAwLCAweDY1LAorCSAweDhDLCAweDQ0LCAweENELCAweEYxLCAweDJFLCAweEZBLCAweEQwLCAweDgwLCAweDI4LCAweDQ0LCAweDAzLCAweDBDLCAweEEwLCAweDJBLCAweDBBLCAweDAwLAorCSAweDExLCAweDAwLCAweDEwLCAweDY1LCAweDYwLCAweDQwLCAweEM0LCAweDM2LCAweDA0LCAweDAwLCAweEQ0LCAweDNBLCAweDA4LCAweDAwLCAweDI3LCAweDQwLAorCSAweDQwLCAweDI2LCAweDMwLCAweDY1LCAweDAwLCAweDY0LCAweDNGLCAweEZBLCAweDQ2LCAweDRFLCAweDM1LCAweDg0LCAweDY2LCAweDAwLCAweDQwLCAweDI2LAorCSAweEY5LCAweDAxLCAweDMwLCAweDY1LCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDA0LCAweDYxLCAweEYzLCAweDAxLCAweEExLCAweEZGLAorCSAweEFCLCAweDYwLCAweEU2LCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweDYwLCAweEZFLCAweDY1LCAweDIzLCAweDQzLCAweEU4LCAweEEzLCAweDgwLCAweDI3LAorCSAweEY2LCAweDAxLCAweDIwLCAweEU2LCAweDA4LCAweDYwLCAweDAwLCAweEVCLCAweDI4LCAweDQ0LCAweDAzLCAweDJCLCAweDA1LCAweDAwLCAweDZBLCAweDYyLAorCSAweDdBLCAweERDLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDI4LCAweDQ0LCAweDhGLCAweEIwLCAweDg4LCAweDNBLCAweDAzLCAweDAwLCAweDcwLCAweDYyLAorCSAweDdBLCAweERDLCAweDI4LCAweDQ0LCAweDQwLCAweDJCLCAweDBELCAweDAwLCAweDcyLCAweDYyLCAweDdBLCAweERDLCAweEExLCAweEZGLCAweDZDLCAweDVDLAorCSAweDVBLCAweEQ4LCAweEU0LCAweDQwLCAweDIwLCAweDJCLCAweDAzLCAweDAwLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweEY4LCAweEEzLCAweDI1LCAweEZGLAorCSAweEIwLCAweEZGLCAweDNGLCAweEZDLCAweDAwLCAweEY0LCAweDEwLCAweDYyLCAweDEwLCAweDYxLCAweDU3LCAweDkwLCAweDZDLCAweDYxLCAweEExLCAweEZGLAorCSAweDA5LCAweDA3LCAweDAyLCAweDFELCAweDJBLCAweDFFLCAweDIxLCAweDAwLCAweENCLCAweDgzLCAweDdBLCAweERDLCAweEZFLCAweDFDLCAweEQ5LCAweDgxLAorCSAweDI0LCAweDFFLCAweDFCLCAweDAwLCAweENCLCAweDgzLCAweDBFLCAweEEzLCAweEE3LCAweDg0LCAweEYyLCAweEEzLCAweDdBLCAweERDLCAweEZFLCAweDFDLAorCSAweDA1LCAweDFELCAweDAxLCAweDYwLCAweDE4LCAweEUxLCAweDdDLCAweEE4LCAweEQ5LCAweDgxLCAweDBBLCAweDAyLCAweDAwLCAweEY0LCAweDAyLCAweDYyLAorCSAweEE3LCAweDg0LCAweDdBLCAweDYxLCAweDdBLCAweERDLCAweEZFLCAweDFDLCAweEY5LCAweDFELCAweDdDLCAweEE4LCAweEQ5LCAweDgxLCAweEY2LCAweDAzLAorCSAweEZGLCAweEIxLCAweDBCLCAweDFFLCAweDAyLCAweDAyLCAweDAwLCAweEY0LCAweDAyLCAweDYyLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweEI2LCAweEZGLAorCSAweEI3LCAweEZGLCAweDZDLCAweDQ0LCAweDVBLCAweERBLCAweENELCAweDgxLCAweDY0LCAweDQwLCAweDQ2LCAweDQ1LCAweDI4LCAweDQ0LCAweDQwLCAweDJCLAorCSAweDBFLCAweDAwLCAweDY0LCAweDQwLCAweDIwLCAweDJCLCAweDBCLCAweDAwLCAweDAxLCAweEEyLCAweDYyLCAweDQ0LCAweDQ2LCAweDQ1LCAweDIxLCAweDQ2LAorCSAweDAwLCAweEY0LCAweDAyLCAweDYyLCAweDlBLCAweEZGLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDk4LCAweEZGLAorCSAweDAwLCAweEU2LCAweDAxLCAweEYyLCAweDYxLCAweDQ1LCAweEQ0LCAweDlFLCAweDIxLCAweDQ2LCAweDE2LCAweEZBLCAweDI1LCAweDQ0LCAweDA2LCAweEZBLAorCSAweEExLCAweEZGLCAweDhDLCAweDQ0LCAweEExLCAweEZGLCAweDQ3LCAweEZGLCAweDUwLCAweDRCLCAweDY3LCAweDUwLCAweDY5LCAweEUyLCAweDI1LCAweDQ2LAorCSAweDAxLCAweEYyLCAweDYxLCAweDQ1LCAweEQ0LCAweDlFLCAweDIxLCAweDQ2LCAweDE2LCAweEZBLCAweDI1LCAweDQ1LCAweDg2LCAweEY4LCAweEZGLCAweEZGLAorCSAweDZBLCAweDQ0LCAweDQwLCAweDJCLCAweDAzLCAweDE1LCAweEFGLCAweDYwLCAweDEwLCAweDc4LCAweEZGLCAweEZGLCAweDI5LCAweDQwLCAweDEwLCAweDI2LAorCSAweDA0LCAweDAwLCAweDA0LCAweDc0LCAweENELCAweEUyLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDZDLCAweDQ0LCAweEI2LCAweEZGLCAweEI3LCAweEZGLAorCSAweEM0LCAweEUyLCAweDAxLCAweDYwLCAweDE4LCAweEUxLCAweDA1LCAweDc2LCAweEFELCAweEUyLCAweDQxLCAweEUxLCAweEExLCAweEZGLCAweDZDLCAweDQ1LAorCSAweEExLCAweEZGLCAweDY1LCAweDQxLCAweDdGLCAweDYwLCAweDdGLCAweDdDLCAweDZDLCAweDQ0LCAweEEwLCAweDg0LCAweDE1LCAweEE3LCAweDE1LCAweEE0LAorCSAweDIxLCAweDQ2LCAweDI2LCAweEZBLCAweDIyLCAweDQ2LCAweDEwLCAweEZBLCAweDIxLCAweDQ2LCAweDI5LCAweDQwLCAweDQwLCAweDJCLCAweDA3LCAweDAwLAorCSAweEI2LCAweEZGLCAweEExLCAweEZGLCAweDQwLCAweDYwLCAweDAwLCAweDY1LCAweDZDLCAweDQ0LCAweDFBLCAweEZBLCAweDA5LCAweDAwLCAweDY1LCAweDQ0LAorCSAweDBGLCAweEI0LCAweDA2LCAweEE4LCAweDgwLCAweDYwLCAweDAwLCAweDY1LCAweDA4LCAweDI4LCAweDdDLCAweDQ1LCAweDI5LCAweDQ0LCAweDM0LCAweDg5LAorCSAweDI3LCAweEYwLCAweDY1LCAweDQ3LCAweDFGLCAweEIxLCAweDM0LCAweDk3LCAweDY0LCAweDVFLCAweDA3LCAweDYwLCAweEY1LCAweEYxLCAweDI5LCAweDQwLAorCSAweDQwLCAweDJCLCAweDA0LCAweDAwLCAweDY0LCAweDQwLCAweDAyLCAweDI2LCAweDEwLCAweDYwLCAweDAwLCAweEJDLCAweDI3LCAweEZBLCAweDAxLCAweDYwLAorCSAweDE4LCAweEUxLCAweDAwLCAweDY0LCAweDMzLCAweEZCLCAweEE4LCAweEUyLCAweDA1LCAweEUxLCAweDI4LCAweDQwLCAweDAzLCAweDI2LCAweENFLCAweDAwLAorCSAweDMxLCAweDQwLCAweDIwLCAweDJBLCAweDAzLCAweDAwLCAweDI4LCAweDQwLCAweDUwLCAweDNBLCAweEM4LCAweDAwLCAweDI0LCAweDQ0LCAweDIwLCAweDJBLAorCSAweEM1LCAweDAwLCAweDJCLCAweDQ0LCAweEFDLCAweDgwLCAweDI4LCAweDQwLCAweEI0LCAweDNBLCAweDAzLCAweDAwLCAweDAyLCAweDAzLCAweDMwLCAweEZCLAorCSAweEJELCAweDAwLCAweDI4LCAweDQ0LCAweEJGLCAweDYwLCAweEZGLCAweDY1LCAweEE0LCAweDg0LCAweDQwLCAweDQ4LCAweDJCLCAweDUwLCAweEExLCAweEZGLAorCSAweEZGLCAweEZGLCAweDAxLCAweDYwLCAweDA4LCAweEUxLCAweDFDLCAweEYyLCAweEM0LCAweEUyLCAweDQwLCAweDQ1LCAweDI4LCAweDQwLCAweEM0LCAweDM2LAorCSAweDlELCAweDAwLCAweDI5LCAweDQwLCAweDQwLCAweDJCLCAweDQ5LCAweDAwLCAweDJCLCAweDYwLCAweEJFLCAweDYzLCAweDYwLCAweDQwLCAweDBCLCAweDM2LAorCSAweDIwLCAweDAwLCAweDBGLCAweDM2LCAweDFCLCAweDAwLCAweDBBLCAweDM2LCAweDE2LCAweDAwLCAweDBFLCAweDM2LCAweDExLCAweDAwLCAweDA5LCAweDM2LAorCSAweDBDLCAweDAwLCAweDBELCAweDM2LCAweDA3LCAweDAwLCAweDA4LCAweDM2LCAweDAyLCAweDAwLCAweEEzLCAweEQzLCAweDE1LCAweDAwLCAweDAyLCAweEEzLAorCSAweEEzLCAweEQzLCAweDEyLCAweDAwLCAweDA0LCAweEEzLCAweEEzLCAweEQzLCAweDBGLCAweDAwLCAweDA2LCAweEEzLCAweEEzLCAweEQzLCAweDBDLCAweDAwLAorCSAweDA4LCAweEEzLCAweEEzLCAweEQzLCAweDA5LCAweDAwLCAweDBBLCAweEEzLCAweEEzLCAweEQzLCAweDA2LCAweDAwLCAweDBDLCAweEEzLCAweEEzLCAweEQzLAorCSAweDAzLCAweDAwLCAweDBFLCAweEEzLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweDI1LCAweDYwLCAweDgyLCAweDYzLCAweDYwLCAweDQwLCAweDBDLCAweDM2LAorCSAweDE5LCAweDAwLCAweDA4LCAweDM2LCAweDE1LCAweDAwLCAweDBELCAweDM2LCAweDExLCAweDAwLCAweDA5LCAweDM2LCAweDBELCAweDAwLCAweDBFLCAweDM2LAorCSAweDA5LCAweDAwLCAweDBBLCAweDM2LCAweDA1LCAweDAwLCAweDBGLCAweDM2LCAweDAxLCAweDAwLCAweDNBLCAweDAwLCAweDAyLCAweEEzLCAweDM4LCAweDAwLAorCSAweDA0LCAweEEzLCAweDM2LCAweDAwLCAweDA2LCAweEEzLCAweDM0LCAweDAwLCAweDA4LCAweEEzLCAweDMyLCAweDAwLCAweDBBLCAweEEzLCAweDMwLCAweDAwLAorCSAweDBDLCAweEEzLCAweDJFLCAweDAwLCAweDBFLCAweEEzLCAweDJDLCAweDAwLCAweDJCLCAweDAwLCAweDJCLCAweDYwLCAweENFLCAweDYzLCAweDI1LCAweDQ0LAorCSAweDBBLCAweDM2LCAweDBDLCAweDAwLCAweDE0LCAweDM2LCAweDA3LCAweDAwLCAweDM3LCAweDM2LCAweDAyLCAweDAwLCAweEEzLCAweEQzLCAweDA5LCAweDAwLAorCSAweDAyLCAweEEzLCAweEEzLCAweEQzLCAweDA2LCAweDAwLCAweDA0LCAweEEzLCAweEEzLCAweEQzLCAweDAzLCAweDAwLCAweDA2LCAweEEzLCAweEEzLCAweEQzLAorCSAweEZGLCAweEZGLCAweDQwLCAweDQ1LCAweDBBLCAweDM2LCAweDBELCAweDAwLCAweDE0LCAweDM2LCAweDM4LCAweDY0LCAweDM3LCAweDNBLCAweDAzLCAweDAwLAorCSAweDA0LCAweDdGLCAweDQwLCAweDQ1LCAweDE1LCAweDY0LCAweDZFLCAweDNBLCAweDA5LCAweDAwLCAweDg0LCAweDdGLCAweDQwLCAweDQ1LCAweDBCLCAweDY0LAorCSAweDA1LCAweDAwLCAweDI5LCAweDQ0LCAweDdGLCAweDYwLCAweEZGLCAweEI0LCAweDQwLCAweDQ5LCAweDcwLCAweDY0LCAweDQwLCAweDRELCAweDAyLCAweDAwLAorCSAweDQwLCAweDQ1LCAweDBBLCAweDAwLCAweDI1LCAweDYwLCAweDdBLCAweDYzLCAweDBBLCAweDM2LCAweDA2LCAweDAwLCAweDE0LCAweDM2LCAweDAyLCAweEEzLAorCSAweDM3LCAweDM2LCAweDA0LCAweEEzLCAweDZFLCAweDM2LCAweDA2LCAweEEzLCAweDI4LCAweEEzLCAweEEzLCAweEQxLCAweEQ4LCAweEEzLCAweDE1LCAweDYwLAorCSAweEQ4LCAweEY5LCAweDM5LCAweEYxLCAweEEzLCAweEQxLCAweDY0LCAweDQxLCAweDY0LCAweDVFLCAweDYwLCAweDQ1LCAweDY0LCAweDQ3LCAweDFGLCAweEI0LAorCSAweDU0LCAweDk0LCAweEUwLCAweEEwLCAweDAyLCAweDBELCAweDAwLCAweDY0LCAweDAyLCAweDAwLCAweDAxLCAweDA0LCAweDFGLCAweDY0LCAweDYwLCAweDQ3LAorCSAweEI0LCAweDg1LCAweDI5LCAweDQ0LCAweEMwLCAweDYwLCAweDAwLCAweEI0LCAweEI0LCAweDg0LCAweDFGLCAweEZBLCAweEI1LCAweEZGLCAweEExLCAweEZGLAorCSAweEFELCAweEYzLCAweEM0LCAweEUyLCAweDg5LCAweEZGLCAweDYwLCAweDU0LCAweDg4LCAweEZGLCAweERDLCAweDg0LCAweEUwLCAweDk0LCAweEZGLCAweDYwLAorCSAweENGLCAweDY1LCAweDI5LCAweDQ0LCAweDI0LCAweDg5LCAweEE1LCAweDYwLCAweEQ2LCAweDc4LCAweDA0LCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLAorCSAweEM0LCAweEUyLCAweEExLCAweEZGLCAweEZGLCAweDYwLCAweENGLCAweDY1LCAweDI5LCAweDQ0LCAweDI0LCAweDg5LCAweEFELCAweEYzLCAweEM0LCAweEUyLAorCSAweDg5LCAweEZGLCAweDYwLCAweDU0LCAweDg4LCAweEZGLCAweERDLCAweDg0LCAweEUwLCAweDk0LCAweDI2LCAweDQ0LCAweDg0LCAweEJDLCAweDI0LCAweDQwLAorCSAweDBDLCAweDIyLCAweEZELCAweEI0LCAweDQwLCAweDQ2LCAweDIzLCAweDY0LCAweDNBLCAweERCLCAweEFDLCAweDYwLCAweEFCLCAweDc4LCAweEZGLCAweEZGLAorCSAweDI3LCAweDQwLCAweDI2LCAweDIyLCAweDA1LCAweDAwLCAweEY4LCAweEI0LCAweDQwLCAweDQ3LCAweDA2LCAweDY0LCAweDMxLCAweEZCLCAweEMwLCAweEZFLAorCSAweDI5LCAweDQwLCAweDEwLCAweDI2LCAweDAyLCAweDAwLCAweDA0LCAweDc0LCAweENELCAweEUyLCAweDAxLCAweDYwLCAweDE4LCAweEUxLCAweDAxLCAweDYwLAorCSAweDE4LCAweEUxLCAweDAxLCAweDExLCAweDBGLCAweDAwLCAweDI5LCAweDQ0LCAweDIwLCAweEJDLCAweDQwLCAweDQ5LCAweDAxLCAweDY0LCAweDMzLCAweEZCLAorCSAweEI2LCAweEZGLCAweDAwLCAweEUxLCAweDAxLCAweDYwLCAweDFBLCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDZDLCAweDQwLCAweEZDLCAweDExLAorCSAweDAxLCAweDYwLCAweDE4LCAweEUxLCAweEI1LCAweEZGLCAweDQ3LCAweEZGLCAweEI2LCAweEZGLCAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweEM4LCAweDYwLAorCSAweDA5LCAweDdELCAweDdDLCAweDRCLCAweDM3LCAweEYzLCAweDJCLCAweDQ1LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDAyLCAweDI4LCAweDY1LCAweDQ0LAorCSAweDYwLCAweDUwLCAweEEwLCAweDRDLCAweDIwLCAweEJDLCAweEZGLCAweEI0LCAweEEwLCAweDUxLCAweDAwLCAweDYwLCAweDJFLCAweDdDLCAweDc0LCAweDQ0LAorCSAweEMwLCAweDk0LCAweDMyLCAweDQwLCAweDAyLCAweDJBLCAweDE5LCAweDAwLCAweDI4LCAweDQ0LCAweEE0LCAweDM2LCAweDAzLCAweDAwLCAweDBDLCAweEI0LAorCSAweDA0LCAweDM2LCAweDEzLCAweDAwLCAweDI2LCAweDQzLCAweEZELCAweEIzLCAweDA0LCAweEJCLCAweDQzLCAweDQ2LCAweDAxLCAweDJBLCAweDAzLCAweDAwLAorCSAweDI4LCAweDQ3LCAweDQwLCAweEJGLCAweDQwLCAweDQ4LCAweDBBLCAweEJCLCAweDBGLCAweEZDLCAweDUwLCAweDRCLCAweDY3LCAweDUwLCAweDAwLCAweDY0LAorCSAweDMwLCAweEZCLCAweDA1LCAweEZGLCAweEFDLCAweDYwLCAweEFCLCAweDc4LCAweEZGLCAweEZGLCAweDI0LCAweDY0LCAweDNBLCAweERCLCAweDI4LCAweDQ0LAorCSAweDA0LCAweDJBLCAweDAzLCAweDAwLCAweEE0LCAweDYwLCAweDZGLCAweDc4LCAweEZGLCAweEZGLCAweDFELCAweEZGLCAweEE4LCAweEUyLCAweDI2LCAweDQwLAorCSAweDEwLCAweDJBLCAweDA2LCAweDAwLCAweDI1LCAweDYwLCAweEYwLCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEM3LCAweDc4LCAweDk3LCAweEYxLAorCSAweEE0LCAweDYwLCAweDZGLCAweDc4LCAweEZGLCAweEZGLCAweDAzLCAweDBBLCAweEE0LCAweDYwLCAweDdDLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDY0LAorCSAweDRGLCAweEZCLCAweEUxLCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDgxLCAweDNFLCAweDU0LCAweDYyLCAweDIyLCAweDQ2LCAweEEyLCAweEQwLAorCSAweDE2LCAweDYzLCAweDdDLCAweDQxLCAweDQ0LCAweDQ4LCAweDgwLCAweDM2LCAweDA0LCAweDYxLCAweDI4LCAweDQwLCAweDUwLCAweDM2LCAweDA0LCAweDYxLAorCSAweDQxLCAweDRFLCAweDI4LCAweDQ0LCAweEE0LCAweDM2LCAweDBFLCAweDYzLCAweDBBLCAweDYwLCAweDdDLCAweEYxLCAweDJELCAweDQ0LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEMwLCAweDg0LCAweEEyLCAweERCLCAweDlBLCAweEZGLCAweEExLCAweEZGLAorCSAweDEyLCAweDc0LCAweENELCAweEUyLCAweDU0LCAweDYyLCAweEEyLCAweEQyLCAweEZGLCAweEZGLCAweDZBLCAweDQwLCAweDgwLCAweDRFLCAweDEyLCAweDc0LAorCSAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LAorCSAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweEZGLCAweEZGLCAweDAxLCAweDFELAorCSAweEIyLCAweDAwLCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LAorCSAweDEyLCAweDc0LCAweDI4LCAweDQwLCAweDAzLCAweDJCLCAweDA2LCAweDAwLCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LAorCSAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDcwLCAweDYyLCAweDI4LCAweDQ0LCAweDhGLCAweEIwLCAweDg4LCAweDNBLCAweDAyLCAweDAwLCAweDdBLCAweEQ0LAorCSAweDEyLCAweDc0LCAweDI4LCAweDQwLCAweDQwLCAweDJCLCAweDE2LCAweDAwLCAweDcyLCAweDYyLCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQyLAorCSAweDEyLCAweDc0LCAweDgwLCAweDRDLCAweDIwLCAweDJCLCAweDA1LCAweDAwLCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LAorCSAweDEyLCAweDc0LCAweDIyLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDEwLCAweDI2LCAweDA0LCAweDAwLCAweDI2LCAweDI2LCAweDRELCAweDAwLAorCSAweDI2LCAweDI3LCAweDRCLCAweDAwLCAweDIzLCAweDQzLCAweEZGLCAweEZGLCAweDA2LCAweDFELCAweDJFLCAweDFFLCAweDAwLCAweDAwLCAweDAzLCAweEYwLAorCSAweDA0LCAweEY0LCAweDY0LCAweDQyLCAweDNELCAweDAwLCAweDJFLCAweDQwLCAweDA0LCAweDJBLCAweDI3LCAweDAwLCAweEExLCAweEZGLCAweDAyLCAweEZFLAorCSAweDEwLCAweDI1LCAweDQyLCAweEZFLCAweDEyLCAweDc0LCAweDcyLCAweDQ1LCAweDY1LCAweDRDLCAweDk0LCAweEYzLCAweDAzLCAweDA0LCAweEU0LCAweEUyLAorCSAweERDLCAweDg0LCAweDk0LCAweEZCLCAweEExLCAweEZGLCAweDEyLCAweDc0LCAweDgwLCAweDRDLCAweDEyLCAweDc0LCAweDk1LCAweEYzLCAweDAyLCAweDA0LAorCSAweERDLCAweDg0LCAweDk1LCAweEZCLCAweDgwLCAweDRDLCAweDEyLCAweDc0LCAweDk2LCAweEYzLCAweDAyLCAweDA0LCAweERDLCAweDg0LCAweDk2LCAweEZCLAorCSAweDgwLCAweDRDLCAweDEyLCAweDc0LCAweDVDLCAweDRFLCAweEY4LCAweEEzLCAweDAzLCAweEYyLCAweDlBLCAweEYyLCAweDA0LCAweEY0LCAweEZGLCAweEIxLAorCSAweEY4LCAweEExLCAweDA2LCAweEE0LCAweDYwLCAweDQyLCAweDBBLCAweDAwLCAweDRFLCAweDAwLCAweDAzLCAweEYyLCAweDlBLCAweEYyLCAweDA0LCAweEY0LAorCSAweEM4LCAweDgyLCAweEZGLCAweEIxLCAweDAzLCAweDAwLCAweDAwLCAweEY0LCAweDgxLCAweEYyLCAweEZGLCAweEIxLCAweDdBLCAweEQ0LCAweDEyLCAweDc0LAorCSAweEZELCAweDFDLCAweEY5LCAweDFELCAweEZGLCAweEIxLCAweDFCLCAweDFFLCAweDAyLCAweDAyLCAweDAwLCAweEY0LCAweERBLCAweDgyLCAweERBLCAweDgyLAorCSAweEEyLCAweEQyLCAweEExLCAweEZGLCAweDA5LCAweDc0LCAweDYwLCAweDRELCAweDEyLCAweDAwLCAweDAzLCAweEYyLCAweDlBLCAweEYyLCAweDA0LCAweEY0LAorCSAweDIzLCAweDQzLCAweEExLCAweEZGLCAweDEyLCAweDc0LCAweEEwLCAweEQyLCAweEZFLCAweEExLCAweENCLCAweDgzLCAweDYwLCAweDRFLCAweEFGLCAweDgzLAorCSAweDAzLCAweDFELCAweDA1LCAweDAzLCAweDEyLCAweDc0LCAweEVCLCAweDAxLCAweEExLCAweEZGLCAweDEyLCAweDc0LCAweERGLCAweDAxLCAweDEyLCAweDc0LAorCSAweERBLCAweDgzLCAweDY2LCAweDQ0LCAweDIyLCAweDQ2LCAweDBDLCAweEZBLCAweDIyLCAweEYyLCAweDBCLCAweEZDLCAweDI4LCAweDQwLCAweDQwLCAweDJCLAorCSAweDFBLCAweDAwLCAweDEwLCAweDI2LCAweDA0LCAweDAwLCAweDI2LCAweDI2LCAweDBGLCAweDAwLCAweDI2LCAweDI3LCAweDBELCAweDAwLCAweDAwLCAweEY0LAorCSAweDAyLCAweDYyLCAweEExLCAweEZGLCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LAorCSAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDA3LCAweDAwLCAweEExLCAweEZGLCAweDEyLCAweDc0LCAweDlDLCAweDRFLCAweDEyLCAweDc0LAorCSAweDlDLCAweDRDLCAweDEyLCAweDc0LCAweDAwLCAweDAwLCAweDg4LCAweEZGLCAweEExLCAweEZGLCAweEIxLCAweDYwLCAweDU4LCAweDRGLCAweDAwLCAweDc4LAorCSAweEZGLCAweEZGLCAweDAxLCAweDYwLCAweDE4LCAweEUxLCAweDc4LCAweDQ0LCAweDAyLCAweEE0LCAweDM1LCAweEZCLCAweENDLCAweDAwLCAweDI5LCAweDQ0LAorCSAweEY3LCAweEI0LCAweDQwLCAweDQ5LCAweDM0LCAweDY0LCAweDNBLCAweERCLCAweDQ0LCAweEUxLCAweEE1LCAweDYwLCAweEIyLCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDZCLCAweEJDLCAweEZGLCAweDE1LCAweEYzLCAweEZGLCAweEZGLCAweERDLCAweDg0LCAweDE1LCAweEZCLCAweDc4LCAweDVDLCAweDA3LCAweDAwLAorCSAweDc4LCAweDVDLCAweDJGLCAweDAwLCAweDYyLCAweEZGLCAweEZGLCAweEZGLCAweEExLCAweEZGLCAweDk4LCAweEZGLCAweDgwLCAweDNFLCAweDgwLCAweDYwLAorCSAweDAxLCAweEUwLCAweEQ1LCAweDYwLCAweDg0LCAweEU3LCAweDgyLCAweEYzLCAweDQwLCAweDYwLCAweDYwLCAweDQwLCAweDAxLCAweDIzLCAweDQ4LCAweDYwLAorCSAweDVFLCAweDY1LCAweDgwLCAweDYwLCAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY1LCAweDRBLCAweEZGLCAweEZGLAorCSAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDAwLCAweDYwLCAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDgwLCAweDYwLAorCSAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY1LCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLAorCSAweDAwLCAweDYwLCAweDAxLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDk1LCAweDYwLCAweDg0LCAweEU3LCAweDY0LCAweDU4LAorCSAweEZGLCAweEZGLCAweDgwLCAweDYwLCAweDAxLCAweEUwLCAweEQ1LCAweDYwLCAweDg0LCAweEU3LCAweDgyLCAweEYzLCAweDdDLCAweDQ1LCAweDYwLCAweDQwLAorCSAweDAxLCAweDIzLCAweDAyLCAweDY1LCAweDhDLCAweDYwLCAweDQ4LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDAwLCAweDYwLAorCSAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDAwLCAweDYwLCAweDdGLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LAorCSAweEZFLCAweDAxLCAweDg0LCAweDYwLCAweDA0LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDQ4LCAweDYwLCAweDA4LCAweDZBLAorCSAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY1LCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDg0LCAweDYwLAorCSAweDA0LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDQwLCAweDYwLCAweDA4LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LAorCSAweEZFLCAweDAxLCAweDY1LCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDhDLCAweDYwLCAweDQ4LCAweDZBLCAweEZGLCAweEZGLAorCSAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDAwLCAweDYwLCAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDAwLCAweDYwLAorCSAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDk1LCAweDYwLCAweDg0LCAweEU3LCAweDY0LCAweDU4LCAweEZGLCAweEZGLAorCSAweDEyLCAweDc0LCAweDZBLCAweDQwLCAweDg3LCAweDRGLCAweDEyLCAweDc0LCAweDg3LCAweDRDLCAweDEyLCAweDc0LCAweDI5LCAweDQwLCAweDQwLCAweDJCLAorCSAweDA4LCAweDAwLCAweDBBLCAweDY0LCAweDg5LCAweEZGLCAweDYwLCAweDU0LCAweDg4LCAweEZGLCAweDg3LCAweDRELCAweDEyLCAweDc0LCAweDg3LCAweDRELAorCSAweDA5LCAweDAwLCAweDAzLCAweDY0LCAweDg5LCAweEZGLCAweDYwLCAweDU0LCAweDg4LCAweEZGLCAweDg3LCAweDRGLCAweDEyLCAweDc0LCAweDg3LCAweDRELAorCSAweDEyLCAweDc0LCAweDg3LCAweDRELCAweDdDLCAweDQ0LCAweDAxLCAweDA4LCAweDAxLCAweDAwLCAweDY3LCAweDQ0LCAweDEyLCAweDc0LCAweDg3LCAweDRDLAorCSAweDEyLCAweDc0LCAweDg3LCAweDRDLCAweDEyLCAweDc0LCAweDg3LCAweDRDLCAweDEyLCAweDc0LCAweDg3LCAweDRELCAweDEyLCAweDc0LCAweDg3LCAweDRELAorCSAweDEyLCAweDc0LCAweDg3LCAweDRELCAweDEyLCAweDc0LCAweDA0LCAweDIxLCAweDA0LCAweDAwLCAweEZGLCAweDJBLCAweDAxLCAweDAwLCAweDA0LCAweDAwLAorCSAweDAzLCAweDAwLCAweEZGLCAweDJBLCAweDBELCAweDAwLCAweDBDLCAweDAwLCAweEJDLCAweEZGLCAweDYxLCAweEZGLCAweDc4LCAweDVDLCAweDU3LCAweDAxLAorCSAweDc4LCAweDVDLCAweDdGLCAweDAxLCAweEI2LCAweEZGLCAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweEM4LCAweDYwLCAweDA5LCAweDdELCAweDdDLCAweDRCLAorCSAweDZBLCAweDQ0LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA0LCAweDc0LCAweEM0LCAweEUyLCAweDA0LCAweEUxLCAweDI5LCAweDQwLCAweDQwLCAweDJCLAorCSAweDA1LCAweDAwLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweEJDLCAweEZGLCAweDE0LCAweDc0LCAweDAxLCAweDAwLCAweDA0LCAweDc0LCAweEM0LCAweEUyLAorCSAweDA0LCAweEUxLCAweEJDLCAweEZGLCAweEI1LCAweEZGLCAweDQ3LCAweEZGLCAweEI2LCAweEZGLCAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweEM4LCAweDYwLAorCSAweDA5LCAweDdELCAweDdDLCAweDRCLCAweDI5LCAweDQwLCAweDQwLCAweDI3LCAweDA0LCAweDAwLCAweEMyLCAweDYwLCAweDU4LCAweDRGLCAweEM4LCAweDc4LAorCSAweEZGLCAweEZGLCAweEExLCAweEZGLCAweDI5LCAweDQwLCAweDEwLCAweDI2LCAweDZELCAweDAwLCAweDgwLCAweDYwLCAweDAxLCAweEUwLCAweEQ1LCAweDYwLAorCSAweDg0LCAweEU3LCAweDgyLCAweEYzLCAweDQwLCAweDYwLCAweDYwLCAweDQwLCAweDAxLCAweDIzLCAweDQ4LCAweDYwLCAweDVFLCAweDY1LCAweDgwLCAweDYwLAorCSAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY1LCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLAorCSAweDAwLCAweDYwLCAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDgwLCAweDYwLCAweDAwLCAweDZBLCAweEZGLCAweEZGLAorCSAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY1LCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDAwLCAweDYwLCAweDAxLCAweDZBLAorCSAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDk1LCAweDYwLCAweDg0LCAweEU3LCAweDgwLCAweDYwLCAweDAxLCAweEUwLCAweEQ1LCAweDYwLAorCSAweDg0LCAweEU3LCAweDgyLCAweEYzLCAweDdDLCAweDQ1LCAweDYwLCAweDQwLCAweDAxLCAweDIzLCAweDAyLCAweDY1LCAweDhDLCAweDYwLCAweDQ4LCAweDZBLAorCSAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDAwLCAweDYwLCAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLAorCSAweDAwLCAweDYwLCAweDdGLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDg0LCAweDYwLCAweDA0LCAweDZBLCAweEZGLCAweEZGLAorCSAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDQ4LCAweDYwLCAweDA4LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY1LCAweDRBLAorCSAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDg0LCAweDYwLCAweDA0LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLAorCSAweDQwLCAweDYwLCAweDA4LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY1LCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LAorCSAweEZFLCAweDAxLCAweDhDLCAweDYwLCAweDQ4LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDAwLCAweDYwLCAweDAwLCAweDZBLAorCSAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDAwLCAweDYwLCAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLAorCSAweDk1LCAweDYwLCAweDg0LCAweEU3LCAweDAxLCAweDYwLCAweDA4LCAweEUxLCAweEZGLCAweEZGLCAweEM0LCAweEUyLCAweDI5LCAweDQwLCAweDQwLCAweDJCLAorCSAweDA0LCAweDAwLCAweEMyLCAweDYwLCAweDU4LCAweDRGLCAweEM4LCAweDc4LCAweEZGLCAweEZGLCAweEMyLCAweDYwLCAweDU4LCAweDRGLCAweEQwLCAweDc4LAorCSAweEZGLCAweEZGLCAweEExLCAweEZGLCAweEFELCAweEYzLCAweEM0LCAweEUyLCAweDg5LCAweEZGLCAweDYwLCAweDU0LCAweDg4LCAweEZGLCAweERDLCAweDg0LAorCSAweEUwLCAweDk0LCAweDM1LCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAxLCAweDA4LCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLAorCSAweDQzLCAweEZGLCAweDAxLCAweDYwLCAweDAwLCAweEUxLCAweDI4LCAweEYzLCAweDQ3LCAweEZGLCAweDYwLCAweDQwLCAweDA3LCAweDM3LCAweDY2LCAweDAwLAorCSAweDA1LCAweDNCLCAweDA0LCAweDAwLCAweEZGLCAweDBBLCAweDgwLCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDE4LCAweDYwLCAweDA3LCAweEYxLAorCSAweEFELCAweDRGLCAweDAwLCAweDdGLCAweEZBLCAweEI0LCAweDY0LCAweDQxLCAweDY0LCAweEYxLCAweDAyLCAweEIxLCAweDA0LCAweDY1LCAweDAyLCAweDAyLAorCSAweDY0LCAweDQwLCAweDAxLCAweDJCLCAweDAxLCAweDY1LCAweEI0LCAweDg0LCAweEEwLCAweDVELCAweDI5LCAweEY1LCAweDJBLCAweEYzLCAweDQ3LCAweEZGLAorCSAweDNGLCAweEYwLCAweDAxLCAweDFCLCAweDAxLCAweDY0LCAweDYwLCAweDU2LCAweEFELCAweEUyLCAweEI1LCAweEZGLCAweDZDLCAweDQwLCAweDQwLCAweEUxLAorCSAweEExLCAweEZGLCAweDAwLCAweEY0LCAweDZFLCAweDYxLCAweDEyLCAweDYyLCAweDY0LCAweDQzLCAweDAxLCAweEUxLCAweDAzLCAweDY0LCAweEUyLCAweEQwLAorCSAweEM5LCAweDgxLCAweDY0LCAweDRDLCAweENDLCAweDg0LCAweERBLCAweDgyLCAweEZBLCAweDAyLCAweDAxLCAweDYwLCAweDAwLCAweDZCLCAweDlBLCAweEZGLAorCSAweENBLCAweDgyLCAweDAzLCAweDAwLCAweDAwLCAweEY0LCAweDgxLCAweEYyLCAweEZGLCAweEZGLCAweDdBLCAweEQwLCAweEExLCAweEZGLCAweDY0LCAweDRDLAorCSAweEZDLCAweDFDLCAweEY4LCAweDFELCAweDAwLCAweEI5LCAweDA2LCAweDFFLCAweDAyLCAweDAyLCAweDAwLCAweEY0LCAweERBLCAweDgyLCAweDVBLCAweEQyLAorCSAweEExLCAweEZGLCAweDYwLCAweDRELCAweDNGLCAweDQwLCAweDAyLCAweDJCLCAweDEwLCAweDAwLCAweDI4LCAweEYzLCAweEE1LCAweDYwLCAweEM0LCAweDY1LAorCSAweDYwLCAweDQwLCAweDBFLCAweDNCLCAweDBBLCAweDAwLCAweEQyLCAweEYzLCAweEZGLCAweEZGLCAweDEwLCAweEJDLCAweEQyLCAweEZCLCAweEFELCAweDRGLAorCSAweDAyLCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVELCAweDg1LCAweDRDLCAweEZFLCAweDAxLCAweEQyLCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEJDLAorCSAweEQyLCAweEZCLCAweEExLCAweEZGLCAweDg3LCAweDRFLCAweDg3LCAweDRDLCAweDg3LCAweDRDLCAweDg3LCAweDRDLCAweDg3LCAweDRDLCAweDY3LCAweDRDLAorCSAweEZGLCAweEZGLCAweEJDLCAweEZGLCAweDAwLCAweEUxLCAweEQ1LCAweEZFLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDQwLCAweDQ2LAorCSAweDYwLCAweDQxLCAweEI1LCAweEZGLCAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweDI5LCAweEY1LCAweDNGLCAweEYwLCAweDI0LCAweEYyLCAweDQ0LCAweDQzLAorCSAweDQwLCAweDRELCAweDAwLCAweEY0LCAweEYzLCAweDYwLCAweEEwLCAweDY1LCAweDEwLCAweDYyLCAweDVBLCAweEQyLCAweEQ5LCAweDgxLCAweEQ0LCAweDgwLAorCSAweEZGLCAweEZGLCAweEZCLCAweDAyLCAweDYxLCAweDQ1LCAweDJELCAweDQ0LCAweEQ0LCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LAorCSAweEZELCAweEE1LCAweDQ4LCAweDYwLCAweDAwLCAweDY0LCAweEM0LCAweDlELCAweDBELCAweDYwLCAweDAwLCAweDZCLCAweDJELCAweDQ0LCAweEMwLCAweDgzLAorCSAweEJCLCAweEZGLCAweDI5LCAweEY1LCAweDAxLCAweEUxLCAweDAwLCAweEY0LCAweDZDLCAweDYxLCAweDEwLCAweDYyLCAweDA1LCAweDAwLCAweDAwLCAweEY0LAorCSAweDAxLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweDA0LCAweDYyLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDAxLCAweDEwLCAweDFBLCAweDAwLAorCSAweDI2LCAweDQ0LCAweDAxLCAweDI2LCAweDBDLCAweDAwLCAweDJELCAweDQ0LCAweEM4LCAweDg0LCAweDQwLCAweDRELCAweDAyLCAweDAzLCAweDZDLCAweDQ1LAorCSAweEYzLCAweDAxLCAweDAzLCAweDE1LCAweDAxLCAweDY0LCAweDA1LCAweEZBLCAweDE1LCAweDAwLCAweDZDLCAweDQ1LCAweEVELCAweDAxLCAweDIzLCAweDQ0LAorCSAweEM4LCAweDg0LCAweDQwLCAweDQzLCAweDAyLCAweDAzLCAweDZDLCAweDQ1LCAweEU3LCAweDAxLCAweDAwLCAweDY0LCAweDAxLCAweDE1LCAweDAxLCAweDY0LAorCSAweDZDLCAweDQ1LCAweDA1LCAweEZCLCAweEUyLCAweEQyLCAweERBLCAweDgyLCAweEM5LCAweDgxLCAweDYwLCAweDRDLCAweERELCAweDFDLCAweEQ3LCAweDAzLAorCSAweEJDLCAweEZGLCAweERBLCAweDAxLCAweDAwLCAweEUxLCAweEQ1LCAweEZFLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDA4LCAweEUxLCAweEExLCAweEZGLAorCSAweDY3LCAweDRDLCAweDQzLCAweEZGLCAweEQyLCAweEYzLCAweEZGLCAweEZGLCAweDEwLCAweEJDLCAweEQyLCAweEZCLCAweEFELCAweDRGLCAweDAyLCAweEJDLAorCSAweDAwLCAweDdGLCAweEEwLCAweDVELCAweDAxLCAweEUxLCAweDAxLCAweDYwLCAweDY5LCAweDZCLCAweEE1LCAweDYwLCAweEM0LCAweDY0LCAweDYwLCAweDRDLAorCSAweEJCLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDYwLCAweDRDLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDYwLCAweDRDLCAweEZDLCAweDAxLAorCSAweDI5LCAweEYzLCAweDJBLCAweEYxLCAweDA3LCAweEI1LCAweDA0LCAweEUxLCAweDY1LCAweDQxLCAweDY0LCAweDU0LCAweENELCAweEUyLCAweDk1LCAweDgxLAorCSAweEExLCAweDVELCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweEY5LCAweDAxLCAweDEwLCAweDYxLCAweDdGLCAweDYwLCAweEMwLCAweDY0LCAweEEwLCAweDgwLAorCSAweDdGLCAweDY3LCAweDAyLCAweDYzLCAweDI1LCAweDAyLCAweDk4LCAweEZFLCAweDE5LCAweDA1LCAweDBGLCAweDYwLCAweDdGLCAweEY1LCAweDBFLCAweEYyLAorCSAweDE1LCAweDE4LCAweDAyLCAweDE4LCAweDA5LCAweEY0LCAweEZCLCAweDAxLCAweDIzLCAweDQ0LCAweDAwLCAweEE4LCAweDA4LCAweDdFLCAweDBBLCAweDAyLAorCSAweDY2LCAweDQ0LCAweDExLCAweEZCLCAweDQ2LCAweDQzLCAweDIzLCAweDQ3LCAweDgwLCAweEJGLCAweDNCLCAweDQyLCAweDA0LCAweEEyLCAweEEyLCAweERCLAorCSAweDI4LCAweEI5LCAweDEwLCAweDdFLCAweDAwLCAweDdGLCAweDBFLCAweEZBLCAweDAwLCAweDY3LCAweDBBLCAweDAwLCAweDIwLCAweDQ0LCAweERDLCAweDg1LAorCSAweDBGLCAweEI0LCAweEY3LCAweEEwLCAweDdGLCAweDY3LCAweDA3LCAweDYzLCAweDAzLCAweDA1LCAweDQ1LCAweDQwLCAweDAwLCAweDY3LCAweEQ4LCAweEZFLAorCSAweEZGLCAweDI3LCAweDA1LCAweEZELCAweDBBLCAweDdFLCAweDA0LCAweEZCLCAweDYxLCAweDU1LCAweDQ4LCAweDAwLCAweDI4LCAweEZCLCAweDAxLCAweEYzLAorCSAweDI5LCAweEZCLCAweDQ0LCAweDQ2LCAweDQwLCAweDQ1LCAweDEwLCAweDYxLCAweDdFLCAweDYwLCAweEMwLCAweDY0LCAweEEwLCAweDgwLCAweDdGLCAweDY3LAorCSAweDAyLCAweDYzLCAweDMwLCAweDAyLCAweEI1LCAweDYwLCAweDU4LCAweDRGLCAweDRCLCAweDc4LCAweEZGLCAweEZGLCAweDdGLCAweDY3LCAweDAzLCAweDYzLAorCSAweDI5LCAweDAyLCAweDI2LCAweDQwLCAweDAxLCAweDJCLCAweDIzLCAweDAwLCAweDk4LCAweEZFLCAweDE4LCAweDA1LCAweDBGLCAweDYwLCAweDdGLCAweEY1LAorCSAweDBFLCAweEYyLCAweDE0LCAweDE4LCAweDAyLCAweDE4LCAweDA5LCAweEY0LCAweEZCLCAweDAxLCAweDIzLCAweDQ0LCAweDAwLCAweEE4LCAweDA4LCAweDdFLAorCSAweDBBLCAweDAyLCAweDY2LCAweDQ0LCAweDExLCAweEZCLCAweDQ2LCAweDQzLCAweDIzLCAweDQ3LCAweDgwLCAweEJGLCAweDNCLCAweDQyLCAweDA0LCAweEEyLAorCSAweEEyLCAweERCLCAweDA4LCAweEI5LCAweDEwLCAweDdFLCAweDAwLCAweDdGLCAweDBFLCAweEZBLCAweDA5LCAweDAwLCAweDIwLCAweDQ0LCAweERDLCAweDg1LAorCSAweDBGLCAweEI0LCAweEY3LCAweEEwLCAweDdGLCAweDY3LCAweDA3LCAweDYzLCAweDA1LCAweDA1LCAweDQ1LCAweDQwLCAweEQ4LCAweEZFLCAweDAwLCAweDY3LAorCSAweEQwLCAweEZFLCAweEQ5LCAweEZFLCAweEZGLCAweDI3LCAweDA1LCAweEZELCAweDBCLCAweDdFLCAweDA0LCAweEZCLCAweDBBLCAweDYwLCAweDdFLCAweEYzLAorCSAweEZGLCAweEZGLCAweDIwLCAweEIwLCAweDgwLCAweEJDLCAweDA4LCAweDI4LCAweEEyLCAweERCLCAweDYxLCAweDU1LCAweDY2LCAweDAwLCAweDA0LCAweEI1LAorCSAweDgyLCAweEI1LCAweDI1LCAweDAyLCAweDA0LCAweDAzLCAweDIwLCAweDQ0LCAweDdGLCAweEI0LCAweDQwLCAweDQwLCAweEEzLCAweEQzLCAweDk5LCAweEZFLAorCSAweDA0LCAweDA0LCAweDAyLCAweEJDLCAweEZFLCAweEI0LCAweEEzLCAweERCLCAweDU5LCAweDAwLCAweEJDLCAweEYzLCAweDIwLCAweDQwLCAweDgwLCAweDI2LAorCSAweDU1LCAweDAwLCAweEEzLCAweEQzLCAweEZGLCAweEEwLCAweEY4LCAweEI0LCAweDAyLCAweDAyLCAweEEzLCAweERCLCAweDFDLCAweDAwLCAweDA0LCAweEJDLAorCSAweEJGLCAweEI0LCAweEEzLCAweERCLCAweDA4LCAweEIwLCAweDAxLCAweDY0LCAweDA4LCAweDI0LCAweDAyLCAweDY0LCAweDI4LCAweEZCLCAweDIwLCAweDQ0LAorCSAweDgwLCAweEJDLCAweDQwLCAweDQwLCAweEQwLCAweEZFLCAweDQyLCAweDAwLCAweEJGLCAweEI0LCAweEEzLCAweERCLCAweDNGLCAweDAwLCAweDQwLCAweEIwLAorCSAweEZGLCAweEZGLCAweEZBLCAweDAyLCAweEY4LCAweEI0LCAweEEzLCAweERCLCAweDA4LCAweEI1LCAweDA3LCAweDdDLCAweDAxLCAweDAyLCAweEJDLCAweEY5LAorCSAweDIwLCAweDQ0LCAweDdGLCAweEI0LCAweDQwLCAweDQwLCAweDE0LCAweDYwLCAweEZDLCAweDYzLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweDIwLCAweEI1LAorCSAweDA3LCAweEI1LCAweDA4LCAweDI4LCAweEM0LCAweDAyLCAweDk5LCAweEZFLCAweDI5LCAweDA1LCAweDIwLCAweDQ0LCAweDgwLCAweDI2LCAweDI2LCAweDAwLAorCSAweDIwLCAweDJBLCAweDAzLCAweDAwLCAweERGLCAweEI0LCAweDQwLCAweDQwLCAweDZBLCAweDAwLCAweDQwLCAweDJBLCAweDFGLCAweDAwLCAweEJGLCAweEI0LAorCSAweDQwLCAweDQwLCAweDA5LCAweDAwLCAweEE4LCAweEZGLCAweDIwLCAweDQ0LCAweDk5LCAweEZFLCAweDAyLCAweDA1LCAweDgwLCAweDJBLCAweDAzLCAweDAwLAorCSAweDQwLCAweEJDLCAweDQwLCAweDQwLCAweDEzLCAweDAwLCAweDAwLCAweEYxLCAweDgwLCAweEJDLCAweDQwLCAweDQwLCAweDY0LCAweDQ0LCAweEUwLCAweDg0LAorCSAweEU4LCAweDg0LCAweDBBLCAweDM2LCAweDI5LCAweDAxLCAweDBCLCAweDM2LCAweDU5LCAweDAxLCAweDI4LCAweEZCLCAweDAxLCAweEYxLCAweDI5LCAweEY5LAorCSAweDAyLCAweEYxLCAweDJBLCAweEY5LCAweDAzLCAweEYxLCAweDJCLCAweEY5LCAweEQwLCAweEZFLCAweEFFLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLAorCSAweDgyLCAweDNFLCAweDc1LCAweDQ0LCAweDAyLCAweEIwLCAweDAxLCAweEIwLCAweDRBLCAweDAyLCAweERDLCAweDAyLCAweDA0LCAweEIwLCAweDA4LCAweEIwLAorCSAweDBCLCAweDAyLCAweDIwLCAweDAyLCAweDQwLCAweDI2LCAweEE3LCAweEZGLCAweDhDLCAweEZGLCAweDc1LCAweDQwLCAweDgwLCAweDJCLCAweDAxLCAweDAwLAorCSAweEFCLCAweEZGLCAweDc1LCAweDQ0LCAweDhELCAweEZGLCAweEVBLCAweDAxLCAweDBBLCAweEYzLCAweEFBLCAweEZGLCAweDYwLCAweDQwLCAweDIwLCAweDJCLAorCSAweDAyLCAweDAwLCAweDM4LCAweEZGLCAweDBELCAweDAwLCAweDAxLCAweDI2LCAweDBDLCAweDAwLCAweEMwLCAweDYwLCAweDAwLCAweDdDLCAweEEwLCAweDg0LAorCSAweDgwLCAweDNCLCAweDAyLCAweDAwLCAweEMwLCAweDY3LCAweDAzLCAweDAwLCAweDQwLCAweDNCLCAweDAyLCAweDAwLCAweDAwLCAweDY3LCAweDBBLCAweEZCLAorCSAweEQ1LCAweDAxLCAweEQ0LCAweDAxLCAweDBCLCAweEYxLCAweEFCLCAweEZGLCAweDY0LCAweDQ0LCAweEZGLCAweDI3LCAweDFGLCAweDAwLCAweDIwLCAweDI2LAorCSAweDAzLCAweDAwLCAweDAyLCAweDYwLCAweDAwLCAweDc1LCAweDFBLCAweDAwLCAweDE5LCAweEYzLCAweEZGLCAweEZGLCAweDAzLCAweDFCLCAweDA0LCAweDYwLAorCSAweDAwLCAweDc1LCAweDBBLCAweDY0LCAweENDLCAweDg0LCAweDE5LCAweEZCLCAweDAxLCAweDYwLCAweDAwLCAweDc1LCAweDY0LCAweDQwLCAweDAzLCAweDIyLAorCSAweDBELCAweDAwLCAweDIwLCAweDQ0LCAweDgwLCAweDJBLCAweDAzLCAweDAwLCAweDIwLCAweEJDLCAweDQwLCAweDQwLCAweDA3LCAweDAwLCAweEQ5LCAweEZFLAorCSAweDgxLCAweDYwLCAweDBCLCAweDY0LCAweDI4LCAweEZCLCAweDJDLCAweDQ0LCAweDI5LCAweEZCLCAweEQwLCAweEZFLCAweEFGLCAweDAxLCAweEE5LCAweEZGLAorCSAweDc3LCAweDQ0LCAweDYwLCAweDU3LCAweDQwLCAweDRBLCAweDAxLCAweDJBLCAweDIwLCAweDAwLCAweDI0LCAweDQ0LCAweEFDLCAweDg2LCAweDA4LCAweEYyLAorCSAweDFDLCAweDAzLCAweDFGLCAweDYwLCAweDA0LCAweDY1LCAweEQ0LCAweDgwLCAweDBFLCAweEYyLCAweDAyLCAweDAzLCAweEE1LCAweEQ1LCAweDA0LCAweDAwLAorCSAweDAxLCAweEJDLCAweDBFLCAweEZBLCAweDA5LCAweEY0LCAweEQxLCAweEZFLCAweDQ2LCAweDQ0LCAweDBGLCAweDE4LCAweDNGLCAweEYyLCAweDQ4LCAweDY1LAorCSAweEM0LCAweDg0LCAweDEzLCAweEZCLCAweDY2LCAweDQ0LCAweDEwLCAweEZCLCAweDY2LCAweDQ3LCAweDIwLCAweEJGLCAweDNCLCAweDQyLCAweDA0LCAweEEyLAorCSAweEEyLCAweERCLCAweDBFLCAweEYyLCAweDQxLCAweDc1LCAweDEwLCAweEJDLCAweDBFLCAweEZBLCAweDJBLCAweDQ0LCAweDA4LCAweDJBLCAweDE3LCAweDAwLAorCSAweDIzLCAweDQ0LCAweDAwLCAweEE4LCAweDVDLCAweDQzLCAweDEzLCAweDAzLCAweDBGLCAweDYwLCAweDdGLCAweEY1LCAweDAxLCAweDAwLCAweDA5LCAweEY0LAorCSAweDBFLCAweEYyLCAweDBELCAweDE4LCAweDA4LCAweEIwLCAweDE4LCAweEFDLCAweEZBLCAweDAzLCAweDBFLCAweEZBLCAweDY2LCAweDQzLCAweDExLCAweEZELAorCSAweDQ2LCAweDQzLCAweDIzLCAweDQ3LCAweDgwLCAweEJGLCAweDNCLCAweDQyLCAweDA0LCAweEEyLCAweEEyLCAweERCLCAweDI4LCAweDc1LCAweDJBLCAweDQ0LAorCSAweDA2LCAweDIyLCAweDJELCAweDAwLCAweDIyLCAweDQ0LCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDBFLCAweEYyLCAweDI4LCAweDAzLCAweDEwLCAweEIwLAorCSAweDAxLCAweEJDLCAweDAzLCAweDAyLCAweDAwLCAweDY0LCAweDQwLCAweDQyLCAweDIyLCAweDAwLCAweDBFLCAweEZBLCAweEQxLCAweEZFLCAweDFFLCAweDYwLAorCSAweEY4LCAweDY0LCAweDQwLCAweDQ3LCAweDU4LCAweDRGLCAweDgwLCAweDAwLCAweDQ2LCAweDQyLCAweDE5LCAweDAyLCAweDIyLCAweDQ3LCAweDQwLCAweEJGLAorCSAweDNCLCAweDQyLCAweDA0LCAweEEyLCAweEEyLCAweERCLCAweDIzLCAweEYyLCAweDY2LCAweDQzLCAweDAwLCAweEE4LCAweDBFLCAweEYyLCAweDA4LCAweDAyLAorCSAweDYwLCAweDQwLCAweDAyLCAweDJBLCAweEU0LCAweDAxLCAweDEyLCAweEZELCAweDEwLCAweDY0LCAweDBFLCAweEZBLCAweDAyLCAweDc1LCAweDA3LCAweDAwLAorCSAweDYwLCAweDQwLCAweDA0LCAweDJBLCAweERDLCAweDAxLCAweDEyLCAweEZELCAweDEwLCAweDY0LCAweDBFLCAweEZBLCAweDA0LCAweDc1LCAweDJBLCAweDQ0LAorCSAweDgwLCAweDJBLCAweDE5LCAweDAwLCAweDIxLCAweDQ0LCAweEFDLCAweDg2LCAweDBFLCAweEYyLCAweDE1LCAweDAzLCAweDAxLCAweEJDLCAweDBFLCAweEZBLAorCSAweEQxLCAweEZFLCAweDFGLCAweDYwLCAweDEwLCAweDY0LCAweDQwLCAweDQ3LCAweDU4LCAweDRGLCAweDU2LCAweDAwLCAweDQ2LCAweDQxLCAweDBCLCAweDAyLAorCSAweDIxLCAweDQ3LCAweDEwLCAweEJGLCAweDNCLCAweDQyLCAweDA0LCAweEEyLCAweEEyLCAweERCLCAweDBFLCAweEYyLCAweDY2LCAweDQzLCAweDA4LCAweEZELAorCSAweDEwLCAweEJDLCAweDBFLCAweEZBLCAweDgwLCAweDc1LCAweDJBLCAweDQ0LCAweDEwLCAweEIwLCAweDIwLCAweDQ0LCAweDE1LCAweDAzLCAweDdGLCAweEI0LAorCSAweDQwLCAweDQwLCAweDE0LCAweDYwLCAweEZDLCAweDYzLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweDIwLCAweEIwLCAweDgwLCAweEIwLCAweDA5LCAweDAzLAorCSAweDA4LCAweDAzLCAweDQwLCAweEJDLCAweDdGLCAweEI0LCAweDA0LCAweEIwLCAweEEzLCAweERCLCAweDAzLCAweDAzLCAweDIwLCAweDQ0LCAweDgwLCAweEJDLAorCSAweDQwLCAweDQwLCAweEIzLCAweDYwLCAweDhCLCAweDc4LCAweEZGLCAweEZGLCAweEIzLCAweDYwLCAweEJFLCAweDc4LCAweEZGLCAweEZGLCAweEU4LCAweEZFLAorCSAweDE0LCAweDA1LCAweEVBLCAweEZFLCAweDI0LCAweDA1LCAweEU5LCAweEZFLCAweDFDLCAweDA1LCAweEU3LCAweEZFLCAweDA5LCAweDA1LCAweDQ3LCAweEZGLAorCSAweDIwLCAweDQ0LCAweDBGLCAweDIyLCAweDAzLCAweDAwLCAweENDLCAweDg0LCAweDQwLCAweDQwLCAweDBGLCAweDIyLCAweEI4LCAweEZFLCAweEVDLCAweDAxLAorCSAweDIzLCAweDQxLCAweDAwLCAweEI5LCAweDVDLCAweDRBLCAweEU4LCAweDAyLCAweDZGLCAweDAxLCAweDI0LCAweDQxLCAweDAwLCAweEI5LCAweDFGLCAweDYwLAorCSAweDA0LCAweDY1LCAweDQ1LCAweDQ3LCAweEUxLCAweDAyLCAweDU4LCAweDRGLCAweDBGLCAweDAwLCAweERFLCAweDAyLCAweDVDLCAweDRBLCAweDQ2LCAweDQ0LAorCSAweDRELCAweDAxLCAweDIyLCAweDQxLCAweDAwLCAweEI5LCAweDVDLCAweDRBLCAweDA4LCAweDI0LCAweDgxLCAweDAxLCAweEQ1LCAweDAxLCAweDIxLCAweDQxLAorCSAweDAwLCAweEI5LCAweDVDLCAweDRBLCAweEE2LCAweDAzLCAweEQwLCAweDAxLCAweDI3LCAweEQzLCAweDAzLCAweDAwLCAweDEwLCAweEIwLCAweDA5LCAweEYyLAorCSAweDA0LCAweDAzLCAweEFDLCAweDg2LCAweDBFLCAweEYyLCAweEZBLCAweDAyLCAweDA4LCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBFLCAweEYzLAorCSAweDBGLCAweDYwLCAweEZFLCAweDY1LCAweDBDLCAweEYzLCAweDI0LCAweDg2LCAweDI0LCAweDQ2LCAweDYwLCAweDQwLCAweEZCLCAweDNCLCAweDA3LCAweDAwLAorCSAweDgwLCAweDI2LCAweDAyLCAweDAwLCAweDIzLCAweDQ2LCAweDAzLCAweDRDLCAweDQ2LCAweDYxLCAweDNBLCAweDY1LCAweDBDLCAweDAwLCAweDJFLCAweEYzLAorCSAweDQwLCAweDQ1LCAweEY4LCAweDJCLCAweDAyLCAweDAwLCAweDQwLCAweDQ1LCAweDAzLCAweDAwLCAweDU4LCAweDRGLCAweDQ0LCAweDAwLCAweDA3LCAweDAyLAorCSAweDU4LCAweDRGLCAweDUwLCAweDAwLCAweDA0LCAweDA1LCAweDY2LCAweDUwLCAweDY1LCAweDUyLCAweDYxLCAweDUxLCAweDA5LCAweDAwLCAweDI2LCAweDQ3LAorCSAweDAwLCAweEJGLCAweDBFLCAweEZCLCAweDJFLCAweEY1LCAweDA1LCAweEYwLCAweDgwLCAweDYwLCAweDY0LCAweDUwLCAweDAwLCAweDcyLCAweDdFLCAweDcxLAorCSAweEFDLCAweEZGLCAweEIzLCAweDYwLCAweEJFLCAweDc4LCAweEZGLCAweEZGLCAweDhFLCAweEZGLCAweDBGLCAweEYzLCAweDBGLCAweDYwLCAweEZFLCAweDY1LAorCSAweDI0LCAweDg2LCAweDBELCAweEYzLCAweDI0LCAweDQ2LCAweDYwLCAweDQwLCAweEZCLCAweDNCLCAweDA3LCAweDAwLCAweDgwLCAweDI2LCAweDAyLCAweDAwLAorCSAweDIzLCAweDQ2LCAweDAzLCAweDRDLCAweDQ2LCAweDYxLCAweDNBLCAweDY1LCAweDBDLCAweDAwLCAweDJFLCAweEYzLCAweDQwLCAweDQ1LCAweEY4LCAweDJCLAorCSAweDAyLCAweDAwLCAweDQwLCAweDQ1LCAweDAzLCAweDAwLCAweDU4LCAweDRGLCAweDE2LCAweDAwLCAweDA3LCAweDAyLCAweDU4LCAweDRGLCAweDIyLCAweDAwLAorCSAweDA0LCAweDA1LCAweDY2LCAweDUwLCAweDY1LCAweDUyLCAweDYxLCAweDUxLCAweDA5LCAweDAwLCAweDI2LCAweDQ3LCAweDAwLCAweEJGLCAweDBGLCAweEZCLAorCSAweDJFLCAweEY1LCAweDA1LCAweEYwLCAweDgwLCAweDYwLCAweDY0LCAweDUwLCAweDAwLCAweDcyLCAweDdFLCAweDcxLCAweDhELCAweEZGLCAweEFELCAweEZGLAorCSAweEIzLCAweDYwLCAweEJFLCAweDc4LCAweEZGLCAweEZGLCAweDI1LCAweDQ0LCAweDg5LCAweEYxLCAweDhBLCAweEYxLCAweEQwLCAweDgwLCAweEQwLCAweDgwLAorCSAweDA3LCAweDA0LCAweDAxLCAweDA2LCAweDA1LCAweDAwLCAweDI1LCAweDQ2LCAweDAxLCAweEYwLCAweDAzLCAweDY3LCAweEEwLCAweDg1LCAweDk0LCAweDgwLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweDQ2LCAweDI2LCAweDQxLCAweDQ2LCAweDYzLCAweDAxLCAweEYyLCAweEZGLCAweEZGLCAweEZGLCAweEI1LAorCSAweEQ1LCAweDgxLCAweDAwLCAweEYyLCAweDA1LCAweDA0LCAweDA0LCAweDYzLCAweDYwLCAweDQ2LCAweEY3LCAweDFCLCAweDQyLCAweEZFLCAweDBELCAweDAwLAorCSAweDYxLCAweDQ0LCAweEM1LCAweDgxLCAweDYzLCAweDQ1LCAweEM1LCAweDgxLCAweDlDLCAweDg0LCAweERDLCAweDg0LCAweDAxLCAweEYyLCAweEYwLCAweDg1LAorCSAweEYwLCAweDgwLCAweDY1LCAweDQ0LCAweEY4LCAweDg1LCAweEZGLCAweEZGLCAweDAyLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEEyLCAweEZGLAorCSAweDBGLCAweDYwLCAweDhCLCAweEYzLCAweEZGLCAweEZGLCAweEFDLCAweDg2LCAweDBFLCAweEYyLCAweDA3LCAweDAzLCAweDAwLCAweEE4LCAweDA5LCAweEYyLAorCSAweEZBLCAweDAyLCAweDAxLCAweDY3LCAweDBFLCAweEZBLCAweDA4LCAweEZFLCAweDE3LCAweDAwLCAweDhCLCAweEYzLCAweEZGLCAweEZGLCAweEQ4LCAweEEwLAorCSAweDAwLCAweEI0LCAweDEyLCAweDA2LCAweDA5LCAweDYwLCAweDA4LCAweDYxLCAweDQxLCAweDRBLCAweDdDLCAweEExLCAweDBFLCAweEExLCAweEEyLCAweEZGLAorCSAweEI1LCAweDYwLCAweDU4LCAweDRFLCAweEMxLCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweEZGLCAweDA2LCAweDAzLCAweDJBLCAweDQzLCAweEI1LCAweDYwLAorCSAweDU4LCAweDRFLCAweEUyLCAweDc4LCAweEZGLCAweEZGLCAweDA4LCAweEZFLCAweEEzLCAweEZGLCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDQxLCAweDRBLAorCSAweDQyLCAweEExLCAweDAzLCAweDAwLCAweDQxLCAweDRBLCAweDdDLCAweEExLCAweDBFLCAweEExLCAweEEyLCAweEZGLCAweEI1LCAweDYwLCAweDU4LCAweDRFLAorCSAweEMxLCAweDc4LCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDJBLCAweDQzLCAweEI1LCAweDYwLCAweDU4LCAweDRFLCAweEUyLCAweDc4LCAweEZGLCAweEZGLAorCSAweDA4LCAweEZFLCAweDBDLCAweDAwLCAweDBGLCAweDYwLCAweDhCLCAweEYzLCAweEZGLCAweEZGLCAweEFDLCAweDg2LCAweDBFLCAweEYyLCAweDA2LCAweDAzLAorCSAweDAwLCAweEE4LCAweDA5LCAweEYyLCAweEZBLCAweDAyLCAweDAxLCAweDY3LCAweDBFLCAweEZBLCAweDA4LCAweEZFLCAweEEzLCAweEZGLCAweDJELCAweDU4LAorCSAweEZGLCAweEZGLCAweDhDLCAweEYzLCAweDdDLCAweDYzLCAweDAwLCAweEJFLCAweDQwLCAweDQ1LCAweDFBLCAweDAzLCAweDAwLCAweDY1LCAweDY1LCAweDQ0LAorCSAweERDLCAweDg1LCAweDg0LCAweEExLCAweDAwLCAweEYyLCAweDA2LCAweDA2LCAweDAxLCAweEZDLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweEY3LCAweDAyLAorCSAweDQwLCAweDQ1LCAweDBFLCAweDAwLCAweDhCLCAweEYzLCAweDAwLCAweDYzLCAweEQ0LCAweDg0LCAweDhCLCAweEZCLCAweDgwLCAweDYwLCAweDdDLCAweDY0LAorCSAweDAxLCAweEZBLCAweDAwLCAweEYwLCAweDAwLCAweEZDLCAweEQzLCAweDgwLCAweDhDLCAweEY5LCAweDAyLCAweDAyLCAweDhELCAweEY5LCAweDA4LCAweEZFLAorCSAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LCAweDI1LCAweDQ2LCAweDA1LCAweEZBLCAweDA2LCAweEZBLCAweDAxLCAweEYwLCAweDAzLCAweDY3LAorCSAweDAyLCAweEZDLCAweEIwLCAweDg0LCAweDNBLCAweDdFLCAweDAxLCAweEZBLCAweDEyLCAweDY0LCAweDAzLCAweEZBLCAweDAwLCAweEYwLCAweDA0LCAweEY4LAorCSAweDAwLCAweDY0LCAweDBDLCAweDYxLCAweDEwLCAweDYzLCAweDU5LCAweERBLCAweEZFLCAweDFGLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDI3LCAweDQzLAorCSAweEUzLCAweDgxLCAweEU5LCAweDgxLCAweDAzLCAweDA1LCAweDE2LCAweDAzLCAweDAwLCAweDYxLCAweDAxLCAweDAwLCAweEVDLCAweDYzLCAweDYxLCAweDQ2LAorCSAweEJGLCAweEQyLCAweDI3LCAweDQ1LCAweERDLCAweDg0LCAweEEyLCAweERBLCAweEJFLCAweEQyLCAweDI1LCAweDQ2LCAweDg4LCAweEY4LCAweDA0LCAweDFCLAorCSAweDI1LCAweDQ0LCAweDYxLCAweDQ2LCAweEEzLCAweERBLCAweDA0LCAweDAwLCAweDBBLCAweEZBLCAweDYwLCAweDQ2LCAweDI1LCAweDQ0LCAweDA5LCAweEZBLAorCSAweDYxLCAweDQ2LCAweEJFLCAweERBLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweDQ0LCAweDAwLCAweEE4LCAweDA3LCAweDRCLCAweDBDLCAweDAzLAorCSAweDU4LCAweDRGLCAweDMzLCAweDAwLCAweDBCLCAweDQ3LCAweDFGLCAweDYwLCAweDBBLCAweDY1LCAweDI3LCAweDQ0LCAweEQ0LCAweDgwLCAweDAwLCAweDY0LAorCSAweDAxLCAweDAyLCAweDBGLCAweEZBLCAweDU4LCAweDRGLCAweEQzLCAweDAxLCAweDcwLCAweDAwLCAweDI1LCAweDQzLCAweEUzLCAweDg0LCAweDdDLCAweDQxLAorCSAweDAyLCAweDA0LCAweEU4LCAweDgxLCAweEVDLCAweDYzLCAweDYxLCAweDQ2LCAweEEzLCAweEQyLCAweDAwLCAweDdDLCAweDQwLCAweDQ1LCAweEJGLCAweEQ4LAorCSAweEEzLCAweEQ4LCAweEJFLCAweEQ4LCAweDI3LCAweDQyLCAweDVBLCAweEQzLCAweDI1LCAweDVDLCAweDYwLCAweDQxLCAweDAyLCAweDFCLCAweDI3LCAweEQ5LAorCSAweDA1LCAweDAwLCAweDI1LCAweDQ2LCAweDBBLCAweEZBLCAweDYxLCAweDQ2LCAweDI1LCAweDQ0LCAweDA5LCAweEZBLCAweDI1LCAweDQ0LCAweDI3LCAweDQzLAorCSAweDAwLCAweDYxLCAweDYwLCAweDQ2LCAweDA5LCAweEYyLCAweDA4LCAweEZDLCAweDAwLCAweEE4LCAweERELCAweDgxLCAweEZBLCAweDAyLCAweEJGLCAweEQxLAorCSAweDY2LCAweDQ0LCAweEJFLCAweERCLCAweEMxLCAweDg0LCAweEJGLCAweERCLCAweDQ4LCAweDAwLCAweDI1LCAweDQ2LCAweEVDLCAweDYzLCAweDA4LCAweEYyLAorCSAweDg5LCAweEYyLCAweDFFLCAweDE4LCAweDQwLCAweDQ3LCAweEUwLCAweDg0LCAweEU4LCAweDg1LCAweDAyLCAweDA1LCAweEU4LCAweDgzLCAweDAwLCAweDY1LAorCSAweDY1LCAweDQ2LCAweEJGLCAweEQyLCAweDYxLCAweDVDLCAweENDLCAweDg0LCAweEEyLCAweERBLCAweDI1LCAweDQ2LCAweDBBLCAweEYyLCAweDAwLCAweEI5LAorCSAweDY1LCAweDQ2LCAweDA4LCAweDI0LCAweEJFLCAweERBLCAweDAyLCAweDFCLCAweEEzLCAweEQ4LCAweDAyLCAweDAwLCAweDYwLCAweDQ2LCAweDg5LCAweEZBLAorCSAweDAwLCAweEI5LCAweDYxLCAweDQ2LCAweDA4LCAweDI4LCAweDBBLCAweEZBLCAweDI1LCAweDQ2LCAweDg5LCAweEZDLCAweDhBLCAweEZDLCAweDg4LCAweEZDLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDYxLCAweDI4LCAweDY1LCAweDI1LCAweDQzLCAweDhELCAweEYzLCAweEFGLCAweDgzLCAweDAwLCAweEJFLAorCSAweDE4LCAweDAzLCAweDAyLCAweDAzLCAweDAwLCAweEZDLCAweDAxLCAweDAwLCAweDhDLCAweEZELCAweDYzLCAweDQ2LCAweDY1LCAweDQ0LCAweENDLCAweDg1LAorCSAweDAwLCAweEYyLCAweDA3LCAweDAyLCAweDhELCAweEY1LCAweDAwLCAweDY0LCAweDAwLCAweEZBLCAweERFLCAweDYwLCAweEFGLCAweDY0LCAweDA5LCAweEZCLAorCSAweDA4LCAweDAwLCAweDY2LCAweDQzLCAweDAwLCAweEJFLCAweERELCAweDgxLCAweEYxLCAweDAyLCAweDhCLCAweEYxLCAweDhELCAweEZELCAweEMxLCAweDg0LAorCSAweDhCLCAweEZCLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY2LCAweDQ2LCAweDQ1LCAweDI5LCAweDQzLCAweEZDLCAweEEzLCAweDY2LCAweDQ0LAorCSAweEJELCAweERCLCAweDI1LCAweDQ0LCAweEJELCAweERCLCAweDAwLCAweDY0LCAweEJELCAweERCLCAweDAzLCAweDYxLCAweDBFLCAweDY1LCAweDFGLCAweDYwLAorCSAweDFFLCAweDYzLCAweDQzLCAweDQ5LCAweEEzLCAweEQzLCAweDA2LCAweEEzLCAweDAwLCAweEE4LCAweENELCAweDgxLCAweDA0LCAweDAyLCAweEY5LCAweDAyLAorCSAweEIzLCAweDYwLCAweEJFLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDI2LCAweEU2LCAweDAxLCAweEQ0LCAweDgwLCAweDYwLCAweDQ1LCAweEUzLCAweDA1LAorCSAweEY2LCAweEEzLCAweEJELCAweEQxLCAweEJELCAweEQxLCAweDQ0LCAweDQ3LCAweDQ0LCAweDQ4LCAweDQ0LCAweDQ1LCAweDFGLCAweDYwLCAweDYwLCAweDY0LAorCSAweDQ0LCAweEQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDQ4LCAweEZFLCAweDhDLCAweEY1LCAweDhCLCAweEYzLCAweDBELCAweDE4LCAweENDLCAweDg0LAorCSAweDhCLCAweEZCLCAweDgwLCAweDYwLCAweDdDLCAweDY0LCAweDAxLCAweEZBLCAweDAwLCAweDY0LCAweDAwLCAweEYwLCAweDAwLCAweEZBLCAweEQwLCAweDgwLAorCSAweDhDLCAweEY5LCAweDAyLCAweDAyLCAweDhELCAweEY5LCAweDA4LCAweEZFLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDFFLCAweDYwLCAweENFLCAweDYzLAorCSAweDBELCAweDY1LCAweDAwLCAweDYxLCAweDQxLCAweDQ4LCAweEEzLCAweEQzLCAweDA2LCAweEEzLCAweEFDLCAweDg2LCAweDAwLCAweDYxLCAweDA5LCAweDAzLAorCSAweDAwLCAweEYyLCAweDA5LCAweEYwLCAweEFDLCAweDg2LCAweDAwLCAweEYyLCAweERELCAweDgxLCAweEZDLCAweDAyLCAweDY0LCAweDQ0LCAweEFDLCAweDg2LAorCSAweEY2LCAweDAxLCAweDYxLCAweDQ0LCAweDI1LCAweDQ2LCAweDI3LCAweERBLCAweDY1LCAweDQ0LCAweDI4LCAweDQ1LCAweDQ1LCAweDg4LCAweENDLCAweDg1LAorCSAweDVBLCAweDg3LCAweEU5LCAweDAyLCAweDAwLCAweDY0LCAweDI3LCAweERBLCAweDVBLCAweERBLCAweDVBLCAweDg3LCAweDg3LCAweEYzLCAweDg2LCAweEYxLAorCSAweDAyLCAweEE0LCAweDYwLCAweDQ2LCAweDYwLCAweDQ1LCAweDAwLCAweDYxLCAweDIyLCAweEYyLCAweEZGLCAweEZGLCAweEFDLCAweDg2LCAweDAwLCAweEYyLAorCSAweDA0LCAweDAzLCAweEFDLCAweDg2LCAweDAwLCAweEYyLCAweERELCAweDgxLCAweEZDLCAweDAyLCAweDY1LCAweDQ0LCAweDAyLCAweEE1LCAweDY1LCAweDQ2LAorCSAweDY0LCAweDQ0LCAweENDLCAweDlDLCAweEZGLCAweEZGLCAweEYwLCAweDAyLCAweDYxLCAweDQ0LCAweDI1LCAweDQ2LCAweDI3LCAweERBLCAweDVBLCAweDg3LAorCSAweDI4LCAweDQ1LCAweDQ1LCAweDg4LCAweDg3LCAweEYzLCAweDg2LCAweEYxLCAweDAyLCAweEE0LCAweDYwLCAweDQ2LCAweDYwLCAweDQ1LCAweDAwLCAweDYxLAorCSAweDc2LCAweEYyLCAweEZGLCAweEZGLCAweEFDLCAweDg2LCAweDAwLCAweEYyLCAweDA5LCAweDAzLCAweDAwLCAweEYyLCAweDA5LCAweEYwLCAweEFDLCAweDg2LAorCSAweDAwLCAweEYyLCAweERELCAweDgxLCAweEZDLCAweDAyLCAweDY0LCAweDQ0LCAweEFDLCAweDg2LCAweEY2LCAweDAxLCAweDY1LCAweDQ0LCAweDAyLCAweEE1LAorCSAweDY1LCAweDQ2LCAweDY0LCAweDQ0LCAweENDLCAweDlDLCAweDYxLCAweDQ0LCAweEVCLCAweDAyLCAweDI1LCAweDQ2LCAweDI3LCAweERBLCAweDVBLCAweDg3LAorCSAweDI4LCAweDQ1LCAweDQ1LCAweDg4LCAweDA2LCAweDYwLCAweDQwLCAweDY1LCAweDhDLCAweEYzLCAweDAxLCAweDYxLCAweEFDLCAweDg2LCAweDAwLCAweEYyLAorCSAweDAzLCAweDAzLCAweEQ1LCAweDgwLCAweERELCAweDgxLCAweEZBLCAweDA0LCAweENELCAweDg0LCAweDI1LCAweDQ2LCAweDI3LCAweERBLCAweDI4LCAweDQ1LAorCSAweEM0LCAweDg0LCAweDVBLCAweERBLCAweERBLCAweDgxLCAweDhCLCAweEYxLCAweDU5LCAweEQ4LCAweDFFLCAweDYwLCAweENDLCAweDY0LCAweDE4LCAweDYzLAorCSAweEEwLCAweEQxLCAweDA2LCAweEE0LCAweDU5LCAweEQ4LCAweEZDLCAweDFGLCAweDAwLCAweDY0LCAweDU5LCAweERBLCAweDU5LCAweERBLCAweDAxLCAweDYwLAorCSAweDFBLCAweDY0LCAweDBBLCAweDYzLCAweDU4LCAweEQxLCAweDU5LCAweEQ4LCAweEZELCAweDFGLCAweDdELCAweEYxLCAweDU5LCAweEQ4LCAweDQ1LCAweDAxLAorCSAweDA3LCAweDRCLCAweEI2LCAweDYwLCAweDU4LCAweDRGLCAweDRELCAweDc4LCAweEZGLCAweEZGLCAweDBCLCAweDQ3LCAweDU4LCAweDRGLCAweDIxLCAweDAwLAorCSAweDNDLCAweDAxLCAweDA3LCAweDRCLCAweEI2LCAweDYwLCAweDU4LCAweDRGLCAweDRELCAweDc4LCAweEZGLCAweEZGLCAweDBCLCAweDQ3LCAweDI3LCAweDQ0LAorCSAweDAwLCAweEJFLCAweDA4LCAweEYwLCAweDE1LCAweDAzLCAweDY0LCAweDQyLCAweDRBLCAweEQzLCAweDA5LCAweEYyLCAweERDLCAweDgzLCAweEEyLCAweERELAorCSAweDI1LCAweDQzLCAweDA5LCAweEZDLCAweDYzLCAweDQ2LCAweDI3LCAweDQzLCAweDBBLCAweEZDLCAweDA5LCAweEZBLCAweDA4LCAweEY4LCAweDAwLCAweEE4LAorCSAweDY2LCAweDQzLCAweDAzLCAweDAyLCAweDY0LCAweDQ0LCAweDU4LCAweERELCAweDAzLCAweDAwLCAweDYwLCAweDQ2LCAweDI1LCAweDQ0LCAweDBBLCAweEZBLAorCSAweDFDLCAweDAxLCAweDI3LCAweDQzLCAweEUzLCAweDgxLCAweEU5LCAweDgxLCAweDAzLCAweDA1LCAweDE2LCAweDAzLCAweDAwLCAweDYxLCAweDAxLCAweDAwLAorCSAweEVDLCAweDYzLCAweDYxLCAweDQ2LCAweEJGLCAweEQyLCAweDI3LCAweDQ1LCAweERDLCAweDg0LCAweEEyLCAweERBLCAweEEzLCAweEQyLCAweDI1LCAweDQ2LAorCSAweDg4LCAweEY4LCAweDA0LCAweDFCLCAweDI1LCAweDQ0LCAweDYxLCAweDQ2LCAweEJFLCAweERBLCAweDA0LCAweDAwLCAweDA5LCAweEZBLCAweDYwLCAweDQ2LAorCSAweDI1LCAweDQ0LCAweDBBLCAweEZBLCAweDYxLCAweDQ2LCAweEEzLCAweERBLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEEwLCAweEZFLCAweDA3LCAweDA1LAorCSAweEEzLCAweEZFLCAweDA3LCAweDA1LCAweEExLCAweEZFLCAweDQ2LCAweDA1LCAweDYwLCAweDY0LCAweDNCLCAweERCLCAweDBGLCAweDAwLCAweDIwLCAweDU4LAorCSAweEZGLCAweEZGLCAweEZBLCAweDAxLCAweDBBLCAweDYwLCAweDgwLCAweEYzLCAweEZGLCAweEZGLCAweEZCLCAweEI0LCAweEEyLCAweERCLCAweEEwLCAweDRDLAorCSAweDU5LCAweEJDLCAweEZGLCAweEI0LCAweEEwLCAweDUxLCAweEEwLCAweDRDLCAweDdELCAweEI0LCAweEEwLCAweDUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLAorCSAweDgzLCAweDNFLCAweDQwLCAweDYwLCAweDBCLCAweDY1LCAweDJCLCAweDQ0LCAweDAwLCAweDYzLCAweEU4LCAweDgwLCAweEY4LCAweDg0LCAweDAyLCAweDI0LAorCSAweDk0LCAweDg0LCAweEYzLCAweDgzLCAweENELCAweDgxLCAweEZGLCAweEZGLCAweEY4LCAweDAyLCAweERGLCAweDgzLCAweDJGLCAweDU4LCAweDQwLCAweDRCLAorCSAweDAwLCAweDYyLCAweDAxLCAweDY0LCAweEQ0LCAweDgwLCAweEUwLCAweDg0LCAweDFBLCAweDAzLCAweEQ0LCAweDgwLCAweEUwLCAweDg0LCAweDE1LCAweDAzLAorCSAweDYxLCAweDQ0LCAweDExLCAweDYxLCAweEUwLCAweDg0LCAweENELCAweDgxLCAweEZELCAweDA0LCAweDAxLCAweDAwLCAweEUwLCAweDg0LCAweEYyLCAweDgyLAorCSAweEZGLCAweEZGLCAweDAyLCAweDI0LCAweEM2LCAweDgyLCAweDAyLCAweDI4LCAweEQ2LCAweDgyLCAweEUyLCAweDgwLCAweENELCAweDgxLCAweDAyLCAweDI4LAorCSAweDAxLCAweEJDLCAweEY0LCAweDAyLCAweDAxLCAweDJBLCAweEM2LCAweDgyLCAweDAzLCAweDAwLCAweEU5LCAweDgxLCAweEYyLCAweDgyLCAweDYxLCAweDQ0LAorCSAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDNCLCAweERCLCAweDBDLCAweDYwLCAweDZFLCAweEYzLCAweDVBLCAweEQxLCAweDYwLCAweDQwLAorCSAweDA0LCAweDNBLCAweDJDLCAweDAwLCAweDAwLCAweDY0LCAweDRBLCAweERCLCAweDFFLCAweDYwLCAweENFLCAweDYzLCAweEEzLCAweEQzLCAweDQ2LCAweDQzLAorCSAweEFDLCAweDg2LCAweDNDLCAweDQ1LCAweDIyLCAweDAzLCAweEQ0LCAweDgwLCAweDA3LCAweEYyLCAweDAyLCAweDAyLCAweDA5LCAweEYyLCAweEY4LCAweDAxLAorCSAweEQwLCAweDgwLCAweDA5LCAweEYyLCAweEY1LCAweDAyLCAweDYwLCAweDQzLCAweDgwLCAweDY3LCAweEIwLCAweDgxLCAweDYxLCAweDQ0LCAweDBGLCAweDYwLAorCSAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDA5LCAweDYwLAorCSAweDA4LCAweDY1LCAweDBFLCAweEYyLCAweDAyLCAweEYyLCAweDYwLCAweDQwLCAweEYwLCAweDM3LCAweDA1LCAweDAwLCAweDhGLCAweEYzLCAweEQ0LCAweDgwLAorCSAweENDLCAweDg0LCAweDAxLCAweDAyLCAweDhGLCAweEZCLCAweDYzLCAweDQ0LCAweERCLCAweDAxLCAweDIzLCAweDQ2LCAweDNDLCAweDQ0LCAweEFDLCAweDgwLAorCSAweEZGLCAweEZGLCAweDk0LCAweDAyLCAweDY5LCAweEYzLCAweDZBLCAweEYzLCAweDAyLCAweEE4LCAweDAyLCAweEE4LCAweDA4LCAweDAyLCAweDAwLCAweDY0LAorCSAweDZCLCAweEZCLCAweDY5LCAweEZCLCAweDZBLCAweEZCLCAweDAwLCAweDY0LCAweDZDLCAweEZCLCAweENBLCAweEZFLCAweDkyLCAweDAwLCAweDAzLCAweDAyLAorCSAweDAwLCAweDY0LCAweDZBLCAweEZCLCAweENBLCAweEZFLCAweDAxLCAweDY0LCAweDNCLCAweERCLCAweDBGLCAweDYwLCAweDZBLCAweEYzLCAweEZGLCAweEZGLAorCSAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDM1LCAweDAzLCAweDJDLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDg2LCAweDAwLAorCSAweDJFLCAweEYyLCAweDE1LCAweDYwLCAweDAyLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLAorCSAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LCAweDYxLCAweDQ2LCAweDJFLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLAorCSAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDJELCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLAorCSAweDYxLCAweDQ2LCAweDJDLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLAorCSAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweDg3LCAweEYzLCAweDA4LCAweEZFLCAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDVGLCAweDAyLCAweDY2LCAweDQ1LAorCSAweDYzLCAweDQ2LCAweDA2LCAweEYyLCAweDY1LCAweDQ2LCAweDgwLCAweEIwLCAweDA5LCAweEYyLCAweDU4LCAweDAzLCAweEFDLCAweDg2LCAweENBLCAweDAxLAorCSAweDZBLCAweEYzLCAweEZGLCAweEZGLCAweDAxLCAweEE4LCAweEZGLCAweEZGLCAweDRDLCAweDAyLCAweDBGLCAweDYwLCAweDczLCAweEYzLCAweEZGLCAweEZGLAorCSAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDBGLCAweDAzLCAweDc2LCAweEYxLCAweDA3LCAweEYyLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweDA5LCAweEYyLAorCSAweDAzLCAweDAyLCAweEFDLCAweDg2LCAweDA3LCAweEYyLCAweEZBLCAweDAyLCAweDAzLCAweDAyLCAweDAwLCAweDY0LCAweDc2LCAweEZCLCAweEVELCAweDAxLAorCSAweDQ2LCAweDVDLCAweDNDLCAweDAwLCAweDBGLCAweDYwLCAweDc2LCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDAxLCAweDAzLAorCSAweDM1LCAweDAyLCAweDZCLCAweEYzLCAweEZGLCAweEZGLCAweDAxLCAweEE4LCAweEZGLCAweEZGLCAweDEzLCAweDAyLCAweDBGLCAweDYwLCAweDZELCAweEYzLAorCSAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDBCLCAweDAzLCAweDJBLCAweEYwLCAweDIwLCAweDY3LCAweDA5LCAweEYyLCAweEIwLCAweDgzLAorCSAweDAwLCAweEE4LCAweDAwLCAweDY0LCAweDAyLCAweDAzLCAweDJBLCAweEZDLCAweDAxLCAweDAwLCAweDZCLCAweEZCLCAweDFGLCAweDAwLCAweDAwLCAweDY0LAorCSAweDZCLCAweEZCLCAweDBGLCAweDYwLCAweDY3LCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDEyLCAweDAzLCAweDJBLCAweEYwLAorCSAweDA4LCAweDY3LCAweEEwLCAweDgwLCAweEZGLCAweEZGLCAweDEyLCAweDAzLCAweDc2LCAweEYxLCAweDA3LCAweEYyLCAweEZGLCAweEZGLCAweEQwLCAweDgwLAorCSAweDA5LCAweEYyLCAweDAzLCAweDAyLCAweEFDLCAweDg2LCAweDA3LCAweEYyLCAweEZBLCAweDAyLCAweDA4LCAweDAyLCAweDAwLCAweDY0LCAweDc2LCAweEZCLAorCSAweEU4LCAweDAxLCAweDAwLCAweDY0LCAweDc2LCAweEZCLCAweEI3LCAweDYwLCAweEEyLCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LCAweEZDLCAweEZCLAorCSAweDQ2LCAweDVDLCAweDE2LCAweDYwLCAweDJCLCAweEYzLCAweDBELCAweEYyLCAweDYwLCAweDVDLCAweDY0LCAweDVGLCAweDBELCAweEZBLCAweDA3LCAweEYwLAorCSAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDc2LCAweEY5LCAweDYwLCAweDQwLCAweDA4LCAweDJCLCAweDA1LCAweDAwLCAweDAwLCAweDY0LCAweDQ4LCAweEZCLAorCSAweEJBLCAweDYwLCAweDAzLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAyLCAweDIzLCAweEYwLAorCSAweDA0LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweEJGLCAweDYwLCAweDE2LCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweDAwLCAweDYzLAorCSAweDQwLCAweDQ3LCAweDUwLCAweDM2LCAweDAxLCAweDAwLCAweDAxLCAweDYzLCAweDQ4LCAweEZELCAweDRBLCAweEYzLCAweDM1LCAweEZBLCAweDEwLCAweEE0LAorCSAweDRBLCAweEZCLCAweDAwLCAweDY0LCAweDE1LCAweEZBLCAweDE2LCAweEZBLCAweDBGLCAweEZBLCAweDA3LCAweEYwLCAweDg3LCAweEYzLCAweEZGLCAweEZGLAorCSAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA1LCAweDAzLCAweDY2LCAweDQzLCAweDY0LCAweDQ2LCAweDExLCAweEYyLCAweEJBLCAweEZCLCAweDYzLCAweDQ2LAorCSAweDAzLCAweEYyLCAweDAwLCAweEY0LCAweDAxLCAweEYyLCAweEZDLCAweEE1LCAweDAwLCAweDdGLCAweEQ0LCAweDg0LCAweDI3LCAweDQ1LCAweDNDLCAweDQ2LAorCSAweDFBLCAweEZBLCAweDIyLCAweDYzLCAweDdCLCAweDYwLCAweEZGLCAweDY0LCAweEE0LCAweDg0LCAweDAzLCAweDJCLCAweDFDLCAweDYzLCAweDJBLCAweEZBLAorCSAweDhGLCAweEIwLCAweDg4LCAweDM2LCAweDAyLCAweEEzLCAweDYwLCAweDQwLCAweEE0LCAweDM2LCAweDE0LCAweDYzLCAweDQzLCAweDRDLCAweDE4LCAweEZDLAorCSAweDAwLCAweDdDLCAweDIyLCAweEY4LCAweDY0LCAweDQxLCAweDA3LCAweEYwLCAweDY2LCAweDQzLCAweDY0LCAweDQ2LCAweDNBLCAweEYyLCAweDYzLCAweDQ2LAorCSAweEZGLCAweEI0LCAweDIyLCAweEZBLCAweDYwLCAweDQwLCAweDAwLCAweDM2LCAweDkyLCAweDAwLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDBDLCAweEIwLAorCSAweDA4LCAweDNBLCAweDhELCAweDAwLCAweDYwLCAweDQwLCAweDQwLCAweDI2LCAweDhBLCAweDAwLCAweDAzLCAweEYyLCAweDAwLCAweEY0LCAweEEwLCAweEQyLAorCSAweEFBLCAweDYwLCAweEFBLCAweDY1LCAweDVBLCAweEQwLCAweEQ0LCAweDgwLCAweDAzLCAweDY0LCAweDBBLCAweDAyLCAweEQwLCAweDgwLCAweDAwLCAweDY0LAorCSAweDVBLCAweEQwLCAweDA2LCAweDAyLCAweEQwLCAweDgwLCAweEY4LCAweDdGLCAweEQwLCAweDgwLCAweDAxLCAweDAzLCAweDAxLCAweDAyLCAweDAxLCAweDYxLAorCSAweDYyLCAweDQzLCAweDQ2LCAweDQzLCAweDNDLCAweDQ2LCAweDA3LCAweEY0LCAweDNBLCAweEYyLCAweEZGLCAweEZGLCAweEEzLCAweDQ2LCAweDYwLCAweDQwLAorCSAweDIyLCAweDI2LCAweDQ5LCAweDAwLCAweDYwLCAweDQ1LCAweDYzLCAweDQyLCAweDVBLCAweEQwLCAweENELCAweDgxLCAweDNDLCAweDQ2LCAweDE4LCAweDAyLAorCSAweDY0LCAweDQ0LCAweDg4LCAweDNBLCAweDE1LCAweDAwLCAweDhFLCAweDM3LCAweDAwLCAweDAwLCAweDY1LCAweDQ0LCAweDAxLCAweDI2LCAweDVGLCAweDAwLAorCSAweDA0LCAweDI2LCAweDAzLCAweDAwLCAweDEwLCAweDI2LCAweDAxLCAweDAwLCAweDMxLCAweDAwLCAweEEzLCAweDQ2LCAweDNCLCAweEYyLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQwLCAweDgwLCAweDI3LCAweDNFLCAweDAwLCAweEEzLCAweDQ2LCAweDAwLCAweDdDLCAweDIyLCAweEY4LCAweEEzLCAweDQ2LCAweDRGLCAweDAwLAorCSAweEEzLCAweDQ2LCAweDY1LCAweDQ0LCAweDAxLCAweDI2LCAweDBCLCAweDAwLCAweDA0LCAweDI2LCAweDAzLCAweDAwLCAweDEwLCAweDI2LCAweDAxLCAweDAwLAorCSAweDFELCAweDAwLCAweDNCLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDgwLCAweDI3LCAweDJCLCAweDAwLCAweDE3LCAweDAwLCAweDg3LCAweEYzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQ2LCAweDNBLCAweEYyLCAweDY2LCAweDQzLCAweEZGLCAweEI0LCAweDNDLCAweDQ2LCAweDIyLCAweEYwLCAweDYwLCAweDQ3LAorCSAweEIwLCAweDg0LCAweDIyLCAweEZBLCAweDYzLCAweDQ2LCAweDNCLCAweEYwLCAweDYwLCAweDQwLCAweDA0LCAweDI3LCAweDAzLCAweDAwLCAweDEwLCAweDI3LAorCSAweDAxLCAweDAwLCAweDA0LCAweDAwLCAweDY0LCAweDQwLCAweDgwLCAweDI3LCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweDNDLCAweDQ2LCAweDAyLCAweDY1LAorCSAweEJFLCAweDYwLCAweEI2LCAweDc4LCAweEZGLCAweEZGLCAweENELCAweDgxLCAweDYzLCAweDQyLCAweDVBLCAweEQwLCAweDNDLCAweDQ2LCAweDA5LCAweDAyLAorCSAweDY0LCAweDQ0LCAweDg4LCAweDNBLCAweDA2LCAweDAwLCAweDc3LCAweDM3LCAweDFBLCAweDAwLCAweDc4LCAweDM3LCAweDE4LCAweDAwLCAweDhFLCAweDM3LAorCSAweDE2LCAweDAwLCAweDNDLCAweDQ2LCAweDIyLCAweEYwLCAweDgwLCAweDY3LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweEZGLCAweEZGLCAweDNGLCAweEYyLAorCSAweDNFLCAweEYwLCAweDA4LCAweEE0LCAweDYwLCAweDQxLCAweDIyLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDAzLCAweDAwLAorCSAweDA0LCAweDI2LCAweDAzLCAweDAwLCAweDA0LCAweDAwLCAweDA0LCAweDJCLCAweDAyLCAweDAwLCAweDYxLCAweDQ0LCAweDNGLCAweEZBLCAweDNDLCAweDQ2LAorCSAweDJDLCAweEYyLCAweDI3LCAweDQwLCAweDAxLCAweDI3LCAweDMyLCAweEYyLCAweEI0LCAweEYxLCAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDQ3LCAweDAwLAorCSAweDA5LCAweDYwLCAweDAwLCAweDY0LCAweEQwLCAweDgwLCAweDNGLCAweEYyLCAweDA5LCAweDA2LCAweDJDLCAweDQ1LCAweEM0LCAweDg0LCAweEQwLCAweDgwLAorCSAweDQwLCAweDRBLCAweDM0LCAweDA2LCAweDYwLCAweDQzLCAweDY0LCAweDQ0LCAweDU0LCAweDg4LCAweDE3LCAweDAwLCAweDYwLCAweDQ1LCAweDEzLCAweDYwLAorCSAweDRCLCAweEYzLCAweEJCLCAweEYzLCAweDAwLCAweEJDLCAweDYwLCAweDQ3LCAweEVDLCAweEEwLCAweDI4LCAweDAzLCAweDI3LCAweDA3LCAweDJDLCAweDQ0LAorCSAweEM0LCAweDgxLCAweDAyLCAweDYwLCAweDFDLCAweDY1LCAweDQ1LCAweDRBLCAweEQ1LCAweDgwLCAweDJDLCAweDQ1LCAweDFGLCAweDA2LCAweDI3LCAweDQwLAorCSAweDA0LCAweDI3LCAweDI1LCAweDAwLCAweDJBLCAweDQzLCAweEQ3LCAweDg1LCAweDQ1LCAweDQ4LCAweEI1LCAweEYxLCAweDBGLCAweEYyLCAweEQzLCAweDgwLAorCSAweDAxLCAweDY1LCAweDAxLCAweDA3LCAweDAwLCAweDY1LCAweEI0LCAweDg0LCAweDBGLCAweEZBLCAweDAwLCAweDYzLCAweDNGLCAweEYyLCAweDI4LCAweDQ1LAorCSAweDYwLCAweDQxLCAweEQ0LCAweDg0LCAweERGLCAweDgzLCAweEZDLCAweDA3LCAweDE0LCAweEZDLCAweDE3LCAweEZBLCAweDA0LCAweDYwLCAweDAwLCAweDY0LAorCSAweDI3LCAweDQ1LCAweEI0LCAweDg0LCAweDJBLCAweEZBLCAweDI4LCAweDQzLCAweDE2LCAweEZDLCAweDBELCAweDAwLCAweDNGLCAweEYyLCAweDJDLCAweDQ1LAorCSAweEI1LCAweEYxLCAweEM0LCAweDgxLCAweEQxLCAweDgwLCAweDBGLCAweEYyLCAweDAxLCAweDA2LCAweDAxLCAweEJDLCAweDBGLCAweEZBLCAweDNGLCAweEYyLAorCSAweDE3LCAweEZBLCAweDAxLCAweDY0LCAweDE0LCAweEZBLCAweDBGLCAweEYwLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAxLCAweDJBLCAweDZGLCAweDAwLAorCSAweDY0LCAweEYxLCAweDE1LCAweDYwLCAweERELCAweEYzLCAweDY0LCAweDQwLCAweDAxLCAweDI3LCAweDAzLCAweDAwLCAweDYwLCAweDQwLCAweDAyLCAweDI2LAorCSAweDE0LCAweDAwLCAweDA3LCAweEYwLCAweDY2LCAweDQzLCAweDY0LCAweDQ2LCAweDEyLCAweEYwLCAweDE1LCAweDYwLCAweERFLCAweEYzLCAweDYzLCAweDQ2LAorCSAweDY0LCAweDQwLCAweDEwLCAweDJBLCAweDIwLCAweDAwLCAweDYwLCAweDQwLCAweDAyLCAweDI2LCAweDA3LCAweDAwLCAweDAxLCAweDI2LCAweDA4LCAweDAwLAorCSAweDA0LCAweDI2LCAweDA5LCAweDAwLCAweDA2LCAweDYxLCAweDZFLCAweDYzLCAweDA4LCAweDAwLCAweDAyLCAweDYxLCAweDE0LCAweDYzLCAweDA1LCAweDAwLAorCSAweDAwLCAweDYxLCAweDBBLCAweDYzLCAweDAyLCAweDAwLCAweDA0LCAweDYxLCAweDM3LCAweDYzLCAweDAwLCAweDY0LCAweDI1LCAweDYwLCAweEEyLCAweDY1LAorCSAweDQ1LCAweEQxLCAweEQ1LCAweDgxLCAweDE1LCAweDYwLCAweERBLCAweEY5LCAweDI1LCAweDYwLCAweDdBLCAweDY1LCAweDQ1LCAweEQxLCAweDFDLCAweEZDLAorCSAweEIwLCAweDg0LCAweDFFLCAweEZBLCAweDNDLCAweDAwLCAweDYwLCAweDQwLCAweDEwLCAweDJBLCAweDA0LCAweDAwLCAweDA4LCAweDYxLCAweDFFLCAweDYwLAorCSAweDBCLCAweDYzLCAweDI3LCAweDAwLCAweDIwLCAweDJBLCAweDA0LCAweDAwLCAweDBBLCAweDYxLCAweDE2LCAweDYwLCAweDBGLCAweDYzLCAweDIxLCAweDAwLAorCSAweDQwLCAweDJBLCAweDA0LCAweDAwLCAweDBDLCAweDYxLCAweDEyLCAweDYwLCAweDBBLCAweDYzLCAweDFCLCAweDAwLCAweDgwLCAweDJBLCAweDA0LCAweDAwLAorCSAweDBFLCAweDYxLCAweDBFLCAweDYwLCAweDBFLCAweDYzLCAweDE1LCAweDAwLCAweDAxLCAweDJCLCAweDA0LCAweDAwLCAweDEwLCAweDYxLCAweDBFLCAweDYwLAorCSAweDA5LCAweDYzLCAweDBGLCAweDAwLCAweDAyLCAweDJCLCAweDA0LCAweDAwLCAweDEyLCAweDYxLCAweDBBLCAweDYwLCAweDBELCAweDYzLCAweDA5LCAweDAwLAorCSAweDA0LCAweDJCLCAweDA0LCAweDAwLCAweDE0LCAweDYxLCAweDBBLCAweDYwLCAweDA4LCAweDYzLCAweDAzLCAweDAwLCAweDE2LCAweDYxLCAweDBBLCAweDYwLAorCSAweDBDLCAweDYzLCAweDFFLCAweEYwLCAweDQwLCAweDY3LCAweDI1LCAweDYwLCAweEEyLCAweDY1LCAweDQ1LCAweEQxLCAweEQ1LCAweDgxLCAweDE1LCAweDYwLAorCSAweERBLCAweEY5LCAweDI1LCAweDYwLCAweDdBLCAweDY1LCAweDQ1LCAweEQxLCAweDFDLCAweEZDLCAweEIwLCAweDg0LCAweDFFLCAweEZBLCAweEFBLCAweEYyLAorCSAweDE1LCAweDYwLCAweEMyLCAweEYzLCAweDA3LCAweEYwLCAweDY2LCAweDQzLCAweDY0LCAweDQ2LCAweDQ0LCAweDQ0LCAweDYxLCAweDQwLCAweDA4LCAweDI2LAorCSAweDAyLCAweDAwLCAweDYxLCAweDQwLCAweDgwLCAweDM2LCAweDEyLCAweEYyLCAweDYzLCAweDQ2LCAweDJDLCAweDYwLCAweDI2LCAweDYxLCAweDAwLCAweDdGLAorCSAweDYwLCAweDQ1LCAweDQ1LCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDAwLCAweDdGLCAweDRCLCAweEZCLCAweDY1LCAweDQ0LCAweDAwLCAweDdFLAorCSAweEJCLCAweEZCLCAweDYyLCAweEYxLCAweDYwLCAweDQzLCAweDYwLCAweDQ3LCAweEQwLCAweDgwLCAweEMwLCAweDY1LCAweDAxLCAweDA2LCAweDY0LCAweDQ0LAorCSAweDBBLCAweDM2LCAweDcwLCAweDY0LCAweDE0LCAweDM2LCAweDM4LCAweDY0LCAweDM3LCAweDM2LCAweDE1LCAweDY0LCAweDZFLCAweDM2LCAweDBCLCAweDY0LAorCSAweDQ0LCAweDg2LCAweDJBLCAweEYyLCAweDA3LCAweEYwLCAweDYwLCAweDQwLCAweEIwLCAweDNBLCAweDAzLCAweDAwLCAweDQwLCAweDNCLCAweDAxLCAweDAwLAorCSAweDEyLCAweDAwLCAweDBDLCAweEI0LCAweDA4LCAweDNBLCAweDQ0LCAweDAwLCAweDIyLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDgwLCAweDJCLAorCSAweDNGLCAweDAwLCAweDE3LCAweEYyLCAweDIyLCAweEYwLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDIyLCAweDIyLCAweDA0LCAweDAwLCAweDAwLCAweEE4LAorCSAweDAxLCAweEE4LCAweDM2LCAweDAzLCAweDM1LCAweDAzLCAweDNDLCAweDQ2LCAweDJBLCAweEYwLCAweDQwLCAweDY3LCAweEIwLCAweDg0LCAweEEyLCAweERBLAorCSAweDYwLCAweDQ1LCAweDIyLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQzLCAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDA1LCAweDAwLCAweDA0LCAweDI2LAorCSAweDFELCAweDAwLCAweDEwLCAweDI2LCAweDEwLCAweDAwLCAweDA0LCAweDAwLCAweDA0LCAweDI3LCAweDE4LCAweDAwLCAweDEwLCAweDI3LCAweDBCLCAweDAwLAorCSAweDY1LCAweDQ0LCAweDJBLCAweDYxLCAweDYwLCAweDQwLCAweDAzLCAweDJCLCAweDI0LCAweDYxLCAweDhGLCAweEIwLCAweDg4LCAweDM2LCAweDAyLCAweEExLAorCSAweDQxLCAweDRDLCAweDk4LCAweEZBLCAweDE1LCAweDAwLCAweDY1LCAweDQ0LCAweDMyLCAweDYxLCAweDYwLCAweDQwLCAweDAzLCAweDJCLCAweDJDLCAweDYxLAorCSAweDhGLCAweEIwLCAweDg4LCAweDM2LCAweDAyLCAweEExLCAweDQxLCAweDRDLCAweDk4LCAweEZBLCAweDBBLCAweDAwLCAweDY1LCAweDQ0LCAweDJFLCAweDYxLAorCSAweDYwLCAweDQwLCAweDAzLCAweDJCLCAweDI4LCAweDYxLCAweDhGLCAweEIwLCAweDg4LCAweDM2LCAweDAyLCAweEExLCAweDQxLCAweDRDLCAweDk4LCAweEZBLAorCSAweEJCLCAweDYwLCAweEZCLCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ1LCAweEFBLCAweEYyLCAweDE1LCAweDYwLCAweEMyLCAweEYzLCAweDI0LCAweDQ2LAorCSAweDYxLCAweDQwLCAweDA4LCAweDI2LCAweDAyLCAweDAwLCAweDYxLCAweDQwLCAweDgwLCAweDM2LCAweDEyLCAweEYyLCAweDY1LCAweDQ2LCAweDYwLCAweDQwLAorCSAweDEwLCAweDI2LCAweDM0LCAweDAwLCAweDJDLCAweDQ1LCAweDE3LCAweEYyLCAweDRCLCAweEYxLCAweEM0LCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LAorCSAweEUwLCAweDgxLCAweDY0LCAweDQ1LCAweDE2LCAweEExLCAweEI3LCAweDYwLCAweDU4LCAweDRELCAweEMwLCAweDc4LCAweEZGLCAweEZGLCAweDY0LCAweEYxLAorCSAweDAxLCAweEE0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDY0LCAweDQwLCAweDAxLCAweDJCLCAweDA2LCAweEE0LCAweDFCLCAweEZBLCAweEJCLCAweEYzLAorCSAweDI1LCAweDYwLCAweDgyLCAweDY1LCAweDYwLCAweDQwLCAweDBCLCAweDM3LCAweDAwLCAweDYzLCAweDBGLCAweDM3LCAweDAyLCAweDYzLCAweDBBLCAweDM3LAorCSAweDA0LCAweDYzLCAweDBFLCAweDM3LCAweDA2LCAweDYzLCAweDA5LCAweDM3LCAweDA4LCAweDYzLCAweDBELCAweDM3LCAweDBBLCAweDYzLCAweDA4LCAweDM3LAorCSAweDBDLCAweDYzLCAweDBDLCAweDM3LCAweDBFLCAweDYzLCAweDI4LCAweEEzLCAweDQ3LCAweEQxLCAweEQ4LCAweEEzLCAweEQ3LCAweDgzLCAweDE1LCAweDYwLAorCSAweEQ5LCAweEY5LCAweDQ3LCAweEQxLCAweDQwLCAweDY3LCAweEIwLCAweDg0LCAweDFGLCAweEZBLCAweDU2LCAweDAwLCAweDJBLCAweEYyLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQwLCAweDgwLCAweDM2LCAweDE3LCAweDAwLCAweDUwLCAweDM2LCAweDE1LCAweDAwLCAweDEwLCAweDM2LCAweDEzLCAweDAwLCAweDMwLCAweDM2LAorCSAweDExLCAweDAwLCAweEEwLCAweDM2LCAweDBGLCAweDAwLCAweEIwLCAweDM2LCAweDBELCAweDAwLCAweEMwLCAweDM2LCAweDBCLCAweDAwLCAweEJCLCAweEYzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDBBLCAweDM3LCAweDA2LCAweDAwLCAweDE1LCAweDYwLCAweERELCAweEYzLCAweDgwLCAweDYwLCAweDAwLCAweDYxLAorCSAweDYwLCAweDQwLCAweDA0LCAweDI2LCAweDAwLCAweDYxLCAweEJCLCAweEYzLCAweDI1LCAweDYwLCAweDdBLCAweDY1LCAweDYwLCAweDQwLCAweDBBLCAweDM3LAorCSAweDAwLCAweDYzLCAweDE0LCAweDM3LCAweDAyLCAweDYzLCAweDM3LCAweDM3LCAweDA0LCAweDYzLCAweDZFLCAweDM3LCAweDA2LCAweDYzLCAweDI4LCAweEEzLAorCSAweDQ3LCAweEQxLCAweEQ4LCAweEEzLCAweEQ3LCAweDgzLCAweDE1LCAweDYwLCAweEQ5LCAweEY5LCAweDQ3LCAweEQxLCAweEZGLCAweEZGLCAweEIxLCAweDg0LAorCSAweDFGLCAweEZBLCAweEJCLCAweEYxLCAweDJDLCAweDQ1LCAweDY0LCAweDQzLCAweDE3LCAweEYyLCAweDRCLCAweEYxLCAweEM0LCAweDg0LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDgxLCAweDYzLCAweDQwLCAweDM3LCAweDM3LCAweEUxLCAweDgxLCAweDY0LCAweDQ1LCAweEI3LCAweDYwLCAweDU4LCAweDRELAorCSAweEMwLCAweDc4LCAweEZGLCAweEZGLCAweEFFLCAweDgyLCAweEZDLCAweEEyLCAweDBBLCAweDAzLCAweDYzLCAweDQwLCAweDZFLCAweDNCLCAweDA2LCAweDAwLAorCSAweDYwLCAweDQxLCAweDA0LCAweDBELCAweDYzLCAweDQ0LCAweDgwLCAweDdFLCAweEJCLCAweEZCLCAweDYxLCAweDQ0LCAweERDLCAweDg0LCAweDJCLCAweEYwLAorCSAweDFCLCAweEZBLCAweDY0LCAweDQ0LCAweDgwLCAweDI3LCAweDQ3LCAweDAwLCAweDA3LCAweEYwLCAweDY2LCAweDQ1LCAweDY0LCAweDQ2LCAweDEyLCAweEYyLAorCSAweDY1LCAweDQ2LCAweDYwLCAweDQwLCAweDEwLCAweDJBLCAweDJFLCAweDAwLCAweDE2LCAweEYyLCAweDBGLCAweEYwLCAweEFDLCAweDg0LCAweDJDLCAweDQ1LAorCSAweDI5LCAweDAzLCAweDRCLCAweEYxLCAweEM0LCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDgxLCAweDYzLCAweDQwLCAweDM3LCAweDM3LAorCSAweEUxLCAweDgxLCAweDY0LCAweDQ1LCAweDBGLCAweEYwLCAweEI3LCAweDYwLCAweDU4LCAweDRELCAweEMwLCAweDc4LCAweEZGLCAweEZGLCAweEFFLCAweDgyLAorCSAweEZDLCAweEEyLCAweDBBLCAweDAzLCAweDYzLCAweDQwLCAweDZFLCAweDNCLCAweDA2LCAweDAwLCAweDYwLCAweDQxLCAweDA0LCAweDBELCAweDgwLCAweDY3LAorCSAweEIwLCAweDg0LCAweDBGLCAweEZBLCAweDYxLCAweDQ0LCAweERDLCAweDg0LCAweDFELCAweEZBLCAweERFLCAweDY1LCAweEM0LCAweDg1LCAweDI2LCAweDQxLAorCSAweEUxLCAweDgxLCAweEM1LCAweDg0LCAweDJCLCAweEZBLCAweDFCLCAweEYwLCAweERFLCAweDY0LCAweEMwLCAweDg1LCAweDI2LCAweDQ0LCAweEUwLCAweDg0LAorCSAweEM0LCAweDg0LCAweDEwLCAweEZBLCAweDI2LCAweDQ0LCAweDJDLCAweEYwLCAweDBBLCAweEE0LCAweDY2LCAweDQ1LCAweDI0LCAweDQ2LCAweDkyLCAweEYyLAorCSAweDY1LCAweDQ2LCAweDlGLCAweEYwLCAweDYxLCAweDQwLCAweDEwLCAweDJBLCAweDAzLCAweDAwLCAweDY1LCAweDQwLCAweDgwLCAweDI3LCAweEEwLCAweEE0LAorCSAweDY0LCAweDQwLCAweDAxLCAweDI2LCAweDAwLCAweDY0LCAweDExLCAweEZBLCAweEJCLCAweEYzLCAweDEzLCAweEZBLCAweDdDLCAweDQ0LCAweDFELCAweEZBLAorCSAweEZGLCAweEZGLCAweDBELCAweEYyLCAweDNFLCAweEYwLCAweDYwLCAweDQ3LCAweEZGLCAweEI0LCAweDY0LCAweDQxLCAweDAxLCAweEIxLCAweDAxLCAweDYzLAorCSAweDE3LCAweDAyLCAweDYwLCAweDQxLCAweEZGLCAweDIyLCAweDA0LCAweDAwLCAweEI3LCAweDYwLCAweDU4LCAweDRGLCAweEIxLCAweDc4LCAweEZGLCAweEZGLAorCSAweDA3LCAweDYwLCAweEY3LCAweEZELCAweDE2LCAweDYwLCAweDJCLCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweDAxLCAweDYzLCAweDYxLCAweDQwLAorCSAweEZGLCAweDIyLCAweDA0LCAweDAwLCAweEI3LCAweDYwLCAweDU4LCAweDRGLCAweEIxLCAweDc4LCAweEZGLCAweEZGLCAweDA3LCAweDYwLCAweEY4LCAweEZELAorCSAweEJELCAweDYwLCAweDdBLCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDQwLCAweDI3LCAweDAzLCAweDAwLAorCSAweEJELCAweDYwLCAweDc1LCAweDc4LCAweEZGLCAweEZGLCAweDIyLCAweEYyLCAweDQ2LCAweDQzLCAweDYwLCAweDQwLCAweDIyLCAweDI2LCAweDA5LCAweDAwLAorCSAweDAxLCAweDI2LCAweDBBLCAweDAwLCAweDA0LCAweDI2LCAweDRCLCAweDAwLCAweDEwLCAweDI2LCAweDEwLCAweDAwLCAweEJELCAweDYwLCAweDc1LCAweDc4LAorCSAweEZGLCAweEZGLCAweEJDLCAweDYwLCAweEYwLCAweDc4LCAweEZGLCAweEZGLCAweDA0LCAweDI3LCAweDNELCAweDAwLCAweDEwLCAweDI3LCAweDAzLCAweDAwLAorCSAweEJELCAweDYwLCAweDc1LCAweDc4LCAweEZGLCAweEZGLCAweDg3LCAweEYzLCAweDNDLCAweEYxLCAweDAyLCAweDAwLCAweDA3LCAweEYyLCAweDAwLCAweDdDLAorCSAweDQwLCAweDQzLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA4LCAweDI3LCAweDIxLCAweDAwLCAweEEzLCAweDQ2LCAweDRCLCAweEYyLAorCSAweEZGLCAweEZGLCAweERDLCAweDg0LCAweDRCLCAweEZBLCAweDRBLCAweEYyLCAweDA4LCAweDA0LCAweERDLCAweDg0LCAweDRBLCAweEZBLCAweDQ5LCAweEYyLAorCSAweDA0LCAweDA0LCAweERDLCAweDg0LCAweDQ5LCAweEZBLCAweDAxLCAweDA0LCAweEZGLCAweEZGLCAweDg3LCAweEYzLCAweDY2LCAweDVDLCAweEQwLCAweDgwLAorCSAweDAwLCAweDdDLCAweDAxLCAweDAyLCAweDNDLCAweEYxLCAweDRCLCAweEYwLCAweDY0LCAweDQ3LCAweDIwLCAweEJGLCAweEEzLCAweDQ2LCAweDNBLCAweEY4LAorCSAweDNCLCAweEZBLCAweEEzLCAweDQ2LCAweDRBLCAweEYyLCAweDQ5LCAweEYwLCAweEEzLCAweDQ2LCAweDNDLCAweEZBLCAweDNELCAweEY4LCAweDBGLCAweDYwLAorCSAweEEwLCAweDY0LCAweEEzLCAweDQ2LCAweDc2LCAweDYxLCAweDBFLCAweDYzLCAweDU5LCAweEQwLCAweDU4LCAweEQ5LCAweEZELCAweDFGLCAweEEzLCAweDQ2LAorCSAweEJELCAweDYwLCAweDc1LCAweDc4LCAweEZGLCAweEZGLCAweDg3LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQ2LCAweDAyLCAweDAwLCAweDA3LCAweEY0LAorCSAweEZGLCAweEZGLCAweEEzLCAweDQ2LCAweDJBLCAweEYyLCAweEEzLCAweDQ2LCAweDYwLCAweDQwLCAweDA4LCAweDI3LCAweDQ4LCAweDAwLCAweDg3LCAweEYzLAorCSAweDY2LCAweDVDLCAweEQwLCAweDgwLCAweDNCLCAweEYwLCAweDA4LCAweDAzLCAweDY0LCAweDQwLCAweDEwLCAweDJBLCAweDEyLCAweDAwLCAweEZGLCAweDYwLAorCSAweEVGLCAweDY0LCAweEEwLCAweDg0LCAweDNCLCAweEZBLCAweDI0LCAweDAwLCAweDNELCAweEYzLCAweDAxLCAweDYxLCAweDYwLCAweDQzLCAweENGLCAweDgzLAorCSAweEUxLCAweDgxLCAweEZELCAweDBELCAweEU5LCAweDgxLCAweEExLCAweDgwLCAweEZGLCAweEZGLCAweDAzLCAweDAzLCAweDkxLCAweDg0LCAweDNCLCAweEZBLAorCSAweDE3LCAweDAwLCAweDRCLCAweEYyLCAweEZGLCAweEZGLCAweDEwLCAweEEwLCAweEZGLCAweEZGLCAweDAyLCAweDA0LCAweEZGLCAweDYwLCAweEZGLCAweDY0LAorCSAweERDLCAweDg0LCAweDRCLCAweEZBLCAweDRBLCAweEYyLCAweDE2LCAweDA0LCAweERDLCAweDg0LCAweDRBLCAweEZBLCAweDQ5LCAweEYyLCAweDA4LCAweDA0LAorCSAweERDLCAweDg0LCAweDQ5LCAweEZBLCAweDA1LCAweDA0LCAweDNCLCAweEYyLCAweEZGLCAweEZGLCAweEUwLCAweDg0LCAweEU4LCAweDg0LCAweDNCLCAweEZBLAorCSAweDBDLCAweDYwLCAweEZFLCAweDYyLCAweDgwLCAweEZGLCAweDc4LCAweDQ0LCAweDAzLCAweEE0LCAweEEyLCAweERCLCAweEM3LCAweDYwLCAweENGLCAweDc4LAorCSAweEZGLCAweEZGLCAweDg0LCAweEZGLCAweDA2LCAweDYwLCAweDE3LCAweEUxLCAweDc3LCAweDQwLCAweDhCLCAweEZGLCAweDAyLCAweDYwLCAweDAwLCAweDc1LAorCSAweEM5LCAweDYwLCAweDU4LCAweDRGLCAweDY3LCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDY0LCAweDA2LCAweDYwLCAweDgwLCAweEZCLCAweDBDLCAweDYwLAorCSAweEZFLCAweDYyLCAweDgwLCAweEZGLCAweDc4LCAweDQ0LCAweDAzLCAweEE0LCAweEEyLCAweERCLCAweEM4LCAweDYwLCAweDQ2LCAweDc4LCAweEZGLCAweEZGLAorCSAweDg0LCAweEZGLCAweDAwLCAweDdDLCAweDA2LCAweDYwLCAweDgwLCAweEYzLCAweEEyLCAweEQ5LCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDA0LCAweDAwLAorCSAweEM5LCAweDYwLCAweDU4LCAweDRGLCAweEFGLCAweDc4LCAweEZGLCAweEZGLCAweDNDLCAweDQ2LCAweDA3LCAweEY0LCAweDg3LCAweEYzLCAweDY2LCAweDVDLAorCSAweEQwLCAweDgwLCAweDAwLCAweDdDLCAweDA3LCAweDAzLCAweDY2LCAweDQzLCAweDNDLCAweDQ2LCAweDIyLCAweEYyLCAweDYzLCAweDQ2LCAweDYwLCAweDQwLAorCSAweDAxLCAweDJBLCAweDAxLCAweDAwLCAweDNDLCAweEYxLCAweDRCLCAweEYwLCAweDY0LCAweDQxLCAweDY0LCAweDQ3LCAweEZGLCAweEI0LCAweDYwLCAweDVGLAorCSAweDIwLCAweEJDLCAweDgwLCAweDI2LCAweDgwLCAweEFDLCAweDYwLCAweDQ3LCAweEEzLCAweDQ2LCAweDNBLCAweEZBLCAweDY0LCAweDQ0LCAweDIwLCAweDdGLAorCSAweDM0LCAweDk0LCAweDNCLCAweEZBLCAweEEzLCAweDQ2LCAweDRBLCAweEYyLCAweDQ5LCAweEYwLCAweEEzLCAweDQ2LCAweDNDLCAweEZBLCAweDNELCAweEY4LAorCSAweDgwLCAweDYwLCAweDEwLCAweEUwLCAweDA4LCAweDYwLCAweDAwLCAweEVBLCAweDBGLCAweDY0LCAweDYwLCAweDdGLCAweEEwLCAweDVBLCAweDgwLCAweDYwLAorCSAweDAwLCAweEVBLCAweEEwLCAweDYwLCAweDAwLCAweEVBLCAweEQxLCAweDYwLCAweDAwLCAweEVBLCAweEJELCAweDYwLCAweDc1LCAweDc4LCAweEZGLCAweEZGLAorCSAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA4LCAweDI3LCAweDMxLCAweDAwLCAweDJBLCAweEYyLCAweDAwLCAweDYwLCAweDdDLCAweDYyLAorCSAweDYwLCAweDQwLCAweDQwLCAweDJCLCAweDI0LCAweDAwLCAweEEyLCAweEQzLCAweDAwLCAweDYxLCAweDYwLCAweEZFLCAweEEwLCAweEQzLCAweDVFLCAweEQxLAorCSAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweDY0LCAweDVGLCAweERDLCAweDg0LCAweEYxLCAweDgxLCAweEMwLCAweDJCLCAweDA0LCAweDAwLCAweDgwLCAweDJBLAorCSAweDAyLCAweDAwLCAweDdGLCAweEE0LCAweERDLCAweDg0LCAweEZGLCAweDNCLCAweDAzLCAweDAwLCAweDYwLCAweDQ3LCAweERDLCAweDg3LCAweDAxLCAweDYxLAorCSAweEMwLCAweDgwLCAweDAwLCAweDM2LCAweERDLCAweDg0LCAweDRFLCAweERCLCAweDYwLCAweEZFLCAweDVBLCAweEQxLCAweEZGLCAweEZGLCAweEMxLCAweDg0LAorCSAweEYwLCAweDIyLCAweDEwLCAweEE0LCAweEYwLCAweDJBLCAweDAxLCAweDAwLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDIwLCAweEZFLCAweDAwLCAweDYwLAorCSAweDNFLCAweEYzLCAweEZGLCAweEZGLCAweEEwLCAweEQzLCAweDVBLCAweEQxLCAweDNBLCAweEZBLCAweDNCLCAweEY4LCAweDc0LCAweDYyLCAweEEyLCAweEQwLAorCSAweEZGLCAweEZGLCAweDY0LCAweDQ0LCAweEUwLCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEUxLCAweDdGLCAweDVBLCAweEQwLCAweEEwLCAweDVBLAorCSAweDY0LCAweDQ0LCAweEUyLCAweDdGLCAweEEwLCAweDVBLCAweDAwLCAweDYwLCAweDQwLCAweEYzLCAweEZGLCAweEZGLCAweEEwLCAweEQxLCAweDVBLCAweEQxLAorCSAweDY0LCAweDQ1LCAweDY0LCAweDQ0LCAweEUzLCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEU0LCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVBLAorCSAweDY0LCAweDQ0LCAweEU1LCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEU2LCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LAorCSAweEU3LCAweDdGLCAweEEwLCAweDVBLCAweDY1LCAweDQwLCAweDBELCAweDNBLCAweDFDLCAweDAwLCAweDY0LCAweDQ3LCAweEU4LCAweDdGLCAweDVBLCAweEQxLAorCSAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEU5LCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEVBLCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVBLAorCSAweDY0LCAweDQ0LCAweEVCLCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEVDLCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LAorCSAweEVELCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEVFLCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEVGLCAweDdGLAorCSAweEEwLCAweDVBLCAweDA4LCAweDYwLCAweDAwLCAweEVBLCAweDY1LCAweDQ0LCAweDAyLCAweEE0LCAweDYwLCAweDdGLCAweEEwLCAweDVBLCAweDgwLCAweDYwLAorCSAweDAwLCAweEVBLCAweEEwLCAweDYwLCAweDAwLCAweEVBLCAweEQxLCAweDYwLCAweDAwLCAweEVBLCAweDAyLCAweDY0LCAweDNCLCAweERCLCAweEJBLCAweDYwLAorCSAweEYzLCAweDc4LCAweEZGLCAweEZGLCAweEJGLCAweDYwLCAweEJCLCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LCAweEZDLCAweEZCLCAweDA3LCAweEYwLAorCSAweDAwLCAweDY0LCAweEQwLCAweDgwLCAweDg3LCAweEYzLCAweDBFLCAweDAzLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDBCLCAweDAzLCAweDQ3LCAweEYxLAorCSAweDA3LCAweEYwLCAweDY0LCAweDQwLCAweDAyLCAweDI2LCAweDAxLCAweDAwLCAweDA4LCAweDAwLCAweDAzLCAweDEyLCAweEJFLCAweDYwLCAweDQ2LCAweDc4LAorCSAweEZGLCAweEZGLCAweEZDLCAweDBBLCAweEJFLCAweDYwLCAweEE2LCAweDc4LCAweEZGLCAweEZGLCAweDg3LCAweEYwLCAweDg3LCAweEYzLCAweDEwLCAweEYwLAorCSAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDNELCAweDAzLCAweDY2LCAweDQzLCAweDY1LCAweDQ2LCAweEZGLCAweDY3LCAweDIwLCAweDg1LCAweDY0LCAweDVGLAorCSAweDQwLCAweDQ0LCAweDE1LCAweEYwLCAweDI1LCAweDQ0LCAweEQwLCAweDg0LCAweDAzLCAweEE0LCAweDAzLCAweDBFLCAweEU4LCAweDg0LCAweEU4LCAweDg0LAorCSAweDA0LCAweDAwLCAweEZBLCAweEE0LCAweEU4LCAweDg0LCAweEU4LCAweDg3LCAweEMwLCAweEJGLCAweEMwLCAweDg0LCAweDE1LCAweEZBLCAweDQwLCAweDQ1LAorCSAweDE0LCAweEYwLCAweDI0LCAweDQ0LCAweEQwLCAweDg0LCAweDFGLCAweEE0LCAweDA2LCAweDBFLCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDA3LCAweDAwLCAweEMyLCAweEE0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg3LCAweEY4LCAweEJGLCAweEMwLCAweDg0LCAweDE0LCAweEZBLCAweDYwLCAweDVDLCAweDJGLCAweDY3LCAweEQwLCAweDgwLCAweDYwLCAweDQ1LAorCSAweDAyLCAweDI4LCAweDY0LCAweDQ1LCAweDI1LCAweDVDLCAweDhCLCAweDY3LCAweEQwLCAweDgwLCAweDYwLCAweDQxLCAweDAyLCAweDI0LCAweDY0LCAweDQxLAorCSAweEQ1LCAweDg0LCAweDgwLCAweDY1LCAweEM0LCAweDg3LCAweDAxLCAweDA1LCAweDAwLCAweDY0LCAweEZGLCAweEI0LCAweDBFLCAweEZBLCAweDYzLCAweDQ2LAorCSAweDA3LCAweEYwLCAweDY2LCAweDQzLCAweDY0LCAweDQ2LCAweDE3LCAweEYyLCAweDYzLCAweDQ2LCAweDYwLCAweDQwLCAweDAwLCAweDM2LCAweDJFLCAweDAwLAorCSAweDAxLCAweDM2LCAweDFFLCAweDAwLCAweDAzLCAweDNBLCAweDI1LCAweDAwLCAweDY0LCAweDQ2LCAweDEwLCAweEYyLCAweDExLCAweEZBLCAweDEyLCAweEYyLAorCSAweDAwLCAweDYxLCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweDEyLCAweEZBLCAweDk3LCAweEZBLCAweDQ2LCAweDQ0LCAweDYzLCAweDQ2LCAweEMxLCAweDYwLAorCSAweDU4LCAweDRFLCAweDcyLCAweDc4LCAweEZGLCAweEZGLCAweDY1LCAweDQwLCAweDAwLCAweDNBLCAweDA0LCAweDAwLCAweEMxLCAweDYwLCAweDU4LCAweDRFLAorCSAweEJDLCAweDc4LCAweEZGLCAweEZGLCAweDA3LCAweEYwLCAweDY2LCAweDQzLCAweDY0LCAweDQ2LCAweDk2LCAweEZDLCAweDYzLCAweDQ2LCAweDQzLCAweDAwLAorCSAweDY0LCAweDQ2LCAweDE2LCAweEYyLCAweDAwLCAweDYxLCAweDIwLCAweDI4LCAweEZGLCAweEE0LCAweDk3LCAweEZBLCAweDE2LCAweEZBLCAweDYzLCAweDQ2LAorCSAweDNBLCAweDAwLCAweDY0LCAweDQ2LCAweDAwLCAweDYxLCAweDk3LCAweEZBLCAweDYzLCAweDQ2LCAweDM1LCAweDAwLCAweDA3LCAweEYwLCAweDY2LCAweDQxLAorCSAweDY0LCAweDQ2LCAweDE2LCAweEYyLCAweEZGLCAweEZGLCAweDIwLCAweDI4LCAweEZGLCAweEE0LCAweDE2LCAweEZBLCAweDkzLCAweEY0LCAweDEyLCAweEYyLAorCSAweDIwLCAweDI4LCAweEZGLCAweEEzLCAweDEzLCAweEZDLCAweDYxLCAweDQ2LCAweDYzLCAweDQwLCAweDAwLCAweDNBLCAweDI0LCAweDAwLCAweEMxLCAweDYwLAorCSAweDU4LCAweDRFLCAweDkzLCAweDc4LCAweEZGLCAweEZGLCAweDYxLCAweDQwLCAweEZGLCAweDM2LCAweDFELCAweDAwLCAweDY2LCAweDQxLCAweDY0LCAweDQ2LAorCSAweDEyLCAweEYyLCAweDkzLCAweEY0LCAweDYxLCAweDQ2LCAweDIwLCAweDI4LCAweDE2LCAweDAwLCAweDQ0LCAweDQ0LCAweEMxLCAweDYwLCAweDU4LCAweDRFLAorCSAweDcyLCAweDc4LCAweEZGLCAweEZGLCAweDI0LCAweDVDLCAweDY1LCAweDQwLCAweDAwLCAweDM2LCAweDA2LCAweDAwLCAweDY2LCAweDQxLCAweDY0LCAweDQ2LAorCSAweDAxLCAweDY0LCAweDE3LCAweEZBLCAweDYxLCAweDQ2LCAweDA3LCAweDAwLCAweDY2LCAweDQzLCAweDY0LCAweDQ2LCAweEMxLCAweDYwLCAweDU4LCAweDRFLAorCSAweEJDLCAweDc4LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEJFLCAweDYwLCAweEE2LCAweDc4LCAweEZGLCAweEZGLCAweDA3LCAweEYwLCAweDY2LCAweDQzLAorCSAweDY0LCAweDQ2LCAweDE3LCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweEZGLCAweDI3LCAweEZGLCAweEZGLCAweDAwLCAweDM2LCAweDA3LCAweDAwLAorCSAweDAxLCAweDM2LCAweDFDLCAweDAwLCAweDAyLCAweDM2LCAweDI0LCAweDAwLCAweDAzLCAweDM2LCAweDQzLCAweDAwLCAweEZGLCAweEZGLCAweDE1LCAweDYwLAorCSAweEY5LCAweEYxLCAweDE2LCAweEYyLCAweDQzLCAweDQ0LCAweEQwLCAweDgwLCAweDJDLCAweDYwLCAweDI0LCAweDYxLCAweDA5LCAweDAzLCAweEExLCAweEQxLAorCSAweDJDLCAweDYwLCAweDIyLCAweDYzLCAweEMwLCAweDg0LCAweDE2LCAweEZBLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweDEzLCAweEZBLCAweDM5LCAweDAwLAorCSAweDk2LCAweEZDLCAweEMxLCAweDYwLCAweDU4LCAweDRFLCAweEJDLCAweDc4LCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDQzLCAweDQ0LCAweEMxLCAweDYwLAorCSAweDU4LCAweDRFLCAweEJDLCAweDc4LCAweEZGLCAweEZGLCAweDE2LCAweDYwLCAweDExLCAweEYzLCAweDk2LCAweEZDLCAweDEzLCAweEZBLCAweDI5LCAweDAwLAorCSAweDYzLCAweDQ2LCAweDJCLCAweDYwLCAweEY0LCAweDYzLCAweEEzLCAweEQzLCAweDE1LCAweEYyLCAweDYwLCAweDQ1LCAweEQ0LCAweDgwLCAweDA3LCAweEYwLAorCSAweDBDLCAweDAzLCAweDY2LCAweDQxLCAweDQ0LCAweDQ0LCAweDY0LCAweDQ2LCAweDEyLCAweEYyLCAweDYxLCAweDQ2LCAweEMxLCAweDYwLCAweDU4LCAweDRFLAorCSAweDcyLCAweDc4LCAweEZGLCAweEZGLCAweDY1LCAweDQwLCAweDAwLCAweDNBLCAweDE5LCAweDAwLCAweDY2LCAweDQzLCAweDI0LCAweDQ2LCAweEMxLCAweDYwLAorCSAweDU4LCAweDRFLCAweEJDLCAweDc4LCAweEZGLCAweEZGLCAweDEyLCAweEYyLCAweDkxLCAweEYyLCAweDkwLCAweEZBLCAweDYwLCAweDVGLCAweDEyLCAweEZBLAorCSAweDA0LCAweDAwLCAweEMxLCAweDYwLCAweDU4LCAweDRFLCAweEJDLCAweDc4LCAweEZGLCAweEZGLCAweDAzLCAweDY0LCAweDE3LCAweEZBLCAweDYzLCAweDQ2LAorCSAweDA1LCAweDAwLCAweDI0LCAweDQzLCAweDAyLCAweDY0LCAweDE3LCAweEZBLCAweDYzLCAweDQ2LCAweDAwLCAweDAwLCAweDAzLCAweDY0LCAweDNCLCAweERCLAorCSAweENBLCAweEZFLCAweDQ3LCAweEYxLCAweDAxLCAweDY1LCAweDMyLCAweDQwLCAweDA0LCAweDI3LCAweDA4LCAweDAwLCAweDJDLCAweEYyLCAweDY0LCAweDQ1LAorCSAweDAyLCAweDIyLCAweDA0LCAweDAwLCAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDAxLCAweDAwLCAweDdCLCAweDAwLCAweDE0LCAweEYyLCAweDY1LCAweDQwLAorCSAweDAxLCAweDI2LCAweDBDLCAweDAwLCAweDYwLCAweDQ1LCAweDA1LCAweDY0LCAweDNCLCAweERCLCAweDY1LCAweDQ0LCAweENDLCAweDg1LCAweDI1LCAweDYwLAorCSAweEQ2LCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEQzLCAweDc4LCAweDk3LCAweEYxLCAweDUwLCAweDAwLCAweDYwLCAweDQxLCAweDJBLCAweEYwLAorCSAweDAwLCAweDYwLCAweDBDLCAweDY0LCAweEEwLCAweDg0LCAweDA0LCAweDM2LCAweDAyLCAweDAwLCAweDBDLCAweDNBLCAweDAxLCAweDAwLCAweDQ2LCAweDAwLAorCSAweDYxLCAweDQ1LCAweDYwLCAweDQzLCAweDI1LCAweDYwLCAweEQ2LCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEQzLCAweDc4LCAweDk3LCAweEYxLAorCSAweDYzLCAweDQwLCAweDA4LCAweDM2LCAweDAxLCAweDAwLCAweDNBLCAweDAwLCAweDE0LCAweEYyLCAweDFDLCAweDY1LCAweDYwLCAweDQxLCAweDAwLCAweDYzLAorCSAweENELCAweDgxLCAweEM3LCAweDgzLCAweEZELCAweDAyLCAweDNGLCAweEYwLCAweDJDLCAweEYyLCAweEMzLCAweDgzLCAweDYwLCAweDQwLCAweDAxLCAweDJBLAorCSAweDBELCAweDAwLCAweDI1LCAweDYwLCAweEQ0LCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEM3LCAweDc4LCAweDk3LCAweEYxLCAweDI1LCAweDYwLAorCSAweERBLCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEQyLCAweDc4LCAweDYzLCAweDQ1LCAweDIwLCAweDAwLCAweDI1LCAweDYwLCAweEQyLCAweDY0LAorCSAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEM3LCAweDc4LCAweDk3LCAweEYxLCAweDI1LCAweDYwLCAweEQ4LCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLAorCSAweEQyLCAweDc4LCAweDYzLCAweDQ1LCAweDE1LCAweEYyLCAweEZGLCAweEZGLCAweDBGLCAweEI0LCAweDAwLCAweEE4LCAweDAxLCAweEE4LCAweDBFLCAweDAzLAorCSAweDA3LCAweDAzLCAweDI1LCAweDYwLCAweEUwLCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEM3LCAweDc4LCAweDk3LCAweEYxLCAweDA2LCAweDAwLAorCSAweDI1LCAweDYwLCAweERFLCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEM3LCAweDc4LCAweDk3LCAweEYxLCAweDA0LCAweDY0LCAweDNCLCAweERCLAorCSAweDA3LCAweEYwLCAweDY2LCAweDQxLCAweDY0LCAweDQ2LCAweDA2LCAweEYwLCAweEZGLCAweDYwLCAweDVGLCAweDY0LCAweEEwLCAweDg0LCAweDA2LCAweEZBLAorCSAweDYxLCAweDQ2LCAweDFFLCAweDYwLCAweEYyLCAweDY0LCAweDBGLCAweDYwLCAweDhELCAweEZCLCAweDNDLCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDVDLCAweDVDLCAweEZDLCAweEZDLCAweENFLCAweEZFLCAweEI3LCAweDYwLCAweEUyLCAweDc4LAorCSAweEZGLCAweEZGLCAweDEzLCAweDYwLCAweDJFLCAweEYzLCAweDA3LCAweEY0LCAweDA2LCAweEYyLCAweDAyLCAweEE4LCAweDNDLCAweDQ2LCAweDEwLCAweDAzLAorCSAweDEwLCAweEIwLCAweDJBLCAweEYyLCAweDBELCAweDAzLCAweDBFLCAweEYyLCAweDBDLCAweEIwLCAweDYwLCAweDQwLCAweEYwLCAweDM3LCAweDIwLCAweEJDLAorCSAweDAyLCAweDAzLCAweEZFLCAweDdGLCAweDBFLCAweEZBLCAweDIzLCAweEYwLCAweDEwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweENFLCAweDAxLAorCSAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDUwLCAweEE4LCAweDAyLCAweDdDLCAweDEwLCAweDAzLCAweDBGLCAweEYwLCAweDE1LCAweEYyLCAweDY0LCAweDQxLAorCSAweDAxLCAweDJBLCAweDAyLCAweDAwLCAweEFGLCAweEYxLCAweDA5LCAweDAwLCAweDAzLCAweDY1LCAweDA3LCAweEYwLCAweDY2LCAweDQzLCAweDY0LCAweDQ2LAorCSAweDA2LCAweEYwLCAweDYzLCAweDQ2LCAweEFFLCAweEYxLCAweDY0LCAweDQwLCAweDEwLCAweDJBLCAweDY0LCAweDQ1LCAweERDLCAweDg0LCAweEQ0LCAweDgwLAorCSAweDE1LCAweEZBLCAweDM4LCAweDA3LCAweDYxLCAweDQwLCAweDAxLCAweDJBLCAweDA4LCAweDAwLCAweDEzLCAweDYwLCAweDAzLCAweEYzLCAweEZGLCAweEZGLAorCSAweERDLCAweDg0LCAweDAwLCAweDM2LCAweDAwLCAweDNCLCAweEEyLCAweERCLCAweDA3LCAweDAwLCAweDEzLCAweDYwLCAweDA0LCAweEYzLCAweEZGLCAweEZGLAorCSAweERDLCAweDg0LCAweDAwLCAweDM2LCAweDAwLCAweDNCLCAweEEyLCAweERCLCAweDJBLCAweEYwLCAweDA4LCAweDY3LCAweEIwLCAweDg0LCAweEEyLCAweERBLAorCSAweDA4LCAweEYwLCAweDFFLCAweDYwLCAweEQ0LCAweDY0LCAweEQwLCAweDgwLCAweDA3LCAweEYyLCAweDQ2LCAweDQzLCAweDg3LCAweEYxLCAweDA2LCAweDAzLAorCSAweDYwLCAweDQ2LCAweDg2LCAweEY0LCAweEQwLCAweDgwLCAweDgwLCAweEJCLCAweDAxLCAweDAzLCAweDA2LCAweEZDLCAweDIzLCAweDQ2LCAweDNFLCAweEYyLAorCSAweDAwLCAweDYzLCAweDAxLCAweEIwLCAweDQzLCAweDVDLCAweEZDLCAweEZDLCAweDBBLCAweDAzLCAweDFFLCAweDYwLCAweEVDLCAweDY0LCAweDBGLCAweDYwLAorCSAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEI3LCAweDYwLAorCSAweEUyLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDQ5LCAweEZCLCAweDI1LCAweDYwLCAweEUwLCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLAorCSAweEM3LCAweDc4LCAweDk3LCAweEYxLCAweDI1LCAweDYwLCAweEUyLCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEM3LCAweDc4LCAweDk3LCAweEYxLAorCSAweDI3LCAweDQ0LCAweEY3LCAweEI0LCAweDQwLCAweDQ3LCAweDIzLCAweEYwLCAweDAxLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDA3LCAweEYwLAorCSAweDY2LCAweDQxLCAweDY0LCAweDQ2LCAweDA2LCAweEYyLCAweDdGLCAweDY1LCAweEE0LCAweDlFLCAweDA2LCAweEZBLCAweDYxLCAweDQ2LCAweDVFLCAweDAxLAorCSAweEMwLCAweDYwLCAweDM1LCAweDc4LCAweEZGLCAweEZGLCAweDIxLCAweDY0LCAweDNCLCAweERCLCAweDMxLCAweEYzLCAweDAxLCAweDYzLCAweEM0LCAweEI0LAorCSAweDMxLCAweEZCLCAweDMyLCAweEZELCAweEJGLCAweDYwLCAweEVCLCAweDYyLCAweDQyLCAweDQwLCAweEEwLCAweDRDLCAweDQwLCAweEJDLCAweDdELCAweEI0LAorCSAweEEwLCAweDUxLCAweEEwLCAweEZFLCAweDFBLCAweEZGLCAweDFFLCAweDYwLCAweEU2LCAweDY0LCAweDA4LCAweEYwLCAweDA3LCAweEYwLCAweEQwLCAweDgwLAorCSAweDFFLCAweDYwLCAweEVDLCAweDYyLCAweDEzLCAweDAyLCAweEEyLCAweEQzLCAweDAxLCAweDYzLCAweEFDLCAweDg2LCAweDA3LCAweEYyLCAweDBFLCAweDAzLAorCSAweEQwLCAweDgwLCAweDA5LCAweEYyLCAweEZBLCAweDAyLCAweDIzLCAweEZDLCAweDFFLCAweDYwLCAweEYyLCAweDY0LCAweDBGLCAweDYwLCAweDhELCAweEZCLAorCSAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDNDLCAweDQ2LCAweDA2LCAweDY0LAorCSAweEExLCAweEZGLCAweDQ5LCAweEZCLCAweDgzLCAweDNFLCAweDMxLCAweEYzLCAweDg3LCAweDYwLCAweDgwLCAweDYxLCAweDFELCAweEYwLCAweDYwLCAweDQwLAorCSAweDAxLCAweDJBLCAweDBGLCAweDAwLCAweEZFLCAweEI0LCAweDMxLCAweEZCLCAweDAwLCAweDY0LCAweDQ5LCAweEZCLCAweDAxLCAweDY0LCAweDQ3LCAweEZCLAorCSAweDAwLCAweDcxLCAweDA1LCAweDY0LCAweDY0LCAweDVGLCAweDBELCAweEZBLCAweDQwLCAweDY0LCAweDNCLCAweERCLCAweEMwLCAweDYwLCAweDM1LCAweDc4LAorCSAweEZGLCAweEZGLCAweDAyLCAweDJBLCAweDE3LCAweDAwLCAweEQxLCAweDkxLCAweDhELCAweEUyLCAweDQxLCAweDY0LCAweDNCLCAweERCLCAweDMxLCAweEYzLAorCSAweDJDLCAweDYwLCAweDVFLCAweDYzLCAweEZELCAweEI0LCAweDMxLCAweEZCLCAweEEzLCAweEQzLCAweDAyLCAweDYzLCAweDYwLCAweDVDLCAweDBELCAweEYyLAorCSAweDQ3LCAweEZELCAweEZGLCAweEI1LCAweDYwLCAweDQ3LCAweEQwLCAweDgwLCAweERDLCAweDg0LCAweDFGLCAweDAzLCAweDYwLCAweDQ3LCAweEI0LCAweDg0LAorCSAweDBELCAweEZBLCAweDFCLCAweDAwLCAweDA4LCAweDJBLCAweDA3LCAweDAwLCAweDQyLCAweDY0LCAweDNCLCAweERCLCAweDMxLCAweEYzLCAweEZGLCAweEZGLAorCSAweEY3LCAweEI0LCAweDMxLCAweEZCLCAweDEyLCAweDAwLCAweDEwLCAweDJBLCAweDA5LCAweDAwLCAweDQzLCAweDY0LCAweDNCLCAweERCLCAweDMxLCAweEYzLAorCSAweEZGLCAweEZGLCAweEVGLCAweEI0LCAweDMxLCAweEZCLCAweEJGLCAweDYwLCAweEJCLCAweDc4LCAweEZGLCAweEZGLCAweDQ0LCAweDY0LCAweDNCLCAweERCLAorCSAweDMxLCAweEYzLCAweEZGLCAweEZGLCAweERGLCAweEI0LCAweDMxLCAweEZCLCAweDAwLCAweDAwLCAweDJBLCAweDY0LCAweDNCLCAweERCLCAweEI3LCAweDYwLAorCSAweEEyLCAweDY0LCAweDQwLCAweDQwLCAweEJELCAweDYwLCAweDdELCAweDc4LCAweEZGLCAweEZGLCAweDBBLCAweDYwLCAweDgwLCAweEYzLCAweEZGLCAweEZGLAorCSAweDAyLCAweEI1LCAweDA0LCAweEI1LCAweDA0LCAweDAzLCAweDAzLCAweDAzLCAweEMwLCAweDYwLCAweEI4LCAweDc4LCAweEZGLCAweEZGLCAweEYwLCAweDYwLAorCSAweDU4LCAweDRFLCAweDc0LCAweDc4LCAweEZGLCAweEZGLCAweDMxLCAweDQwLCAweDAxLCAweDJBLCAweDI4LCAweDAwLCAweDlELCAweEZFLCAweDI2LCAweDA0LAorCSAweDI1LCAweDBBLCAweDlGLCAweEZFLCAweDIzLCAweDA1LCAweDg1LCAweEZGLCAweDIwLCAweDQ0LCAweDg0LCAweEZGLCAweDQwLCAweDI2LCAweDFFLCAweDAwLAorCSAweDNGLCAweDQwLCAweDIwLCAweDJCLCAweDFCLCAweDAwLCAweDM4LCAweDY5LCAweEZGLCAweEZGLCAweDY4LCAweDQ0LCAweDAxLCAweDE2LCAweEZELCAweDAxLAorCSAweDAxLCAweDJBLCAweDE0LCAweDAwLCAweDEzLCAweDYwLCAweDA5LCAweEYzLCAweEZGLCAweEZGLCAweERDLCAweDg0LCAweDAwLCAweDM2LCAweDAwLCAweDNCLAorCSAweEEyLCAweERCLCAweDY0LCAweEYxLCAweDAyLCAweDYwLCAweEVFLCAweDY0LCAweDgxLCAweEZCLCAweEZGLCAweEZGLCAweDgwLCAweDYwLCAweDAwLCAweDY0LAorCSAweEIwLCAweDg0LCAweDgyLCAweEZCLCAweDA0LCAweDY0LCAweDgzLCAweEZCLCAweERGLCAweEZFLCAweDE5LCAweEZGLCAweDEwLCAweDY0LCAweDNCLCAweERCLAorCSAweDY1LCAweEYzLCAweDczLCAweDQ1LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEM0LCAweDkzLCAweDc0LCAweEYxLCAweEM5LCAweEZFLAorCSAweDY0LCAweDQwLCAweDAxLCAweDI2LCAweDNCLCAweDAwLCAweDQ5LCAweEYzLCAweDNDLCAweDQ2LCAweDMxLCAweDE4LCAweENDLCAweDg0LCAweDQ5LCAweEZCLAorCSAweDJFLCAweDAyLCAweEMxLCAweDYwLCAweDZCLCAweDY0LCAweDQwLCAweDQyLCAweEZDLCAweEZDLCAweDAwLCAweDY0LCAweDVDLCAweDVDLCAweDMyLCAweEZCLAorCSAweDgyLCAweEZGLCAweDVDLCAweDQ3LCAweDg0LCAweEZGLCAweDYyLCAweEZGLCAweDEzLCAweDYwLCAweDAxLCAweEYzLCAweEZGLCAweEZGLCAweERDLCAweDg0LAorCSAweDAwLCAweDM2LCAweDAwLCAweDNCLCAweEEyLCAweERCLCAweDJBLCAweEYyLCAweDA3LCAweEYwLCAweDBDLCAweEI0LCAweDA4LCAweDNBLCAweDA3LCAweDAwLAorCSAweDY2LCAweDQxLCAweDY0LCAweDQ2LCAweDA2LCAweEYwLCAweEZGLCAweDYwLCAweERGLCAweDY0LCAweEEwLCAweDg0LCAweDA2LCAweEZBLCAweDIzLCAweEYwLAorCSAweDAxLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDFFLCAweDYwLCAweEYyLCAweDY0LCAweDBGLCAweDYwLCAweDhELCAweEZCLCAweDY2LCAweDQ0LAorCSAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweENFLCAweEZFLCAweDA2LCAweDAwLAorCSAweDY1LCAweEYzLCAweDczLCAweDQ1LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEM0LCAweDkzLCAweDE0LCAweDYwLCAweEZDLCAweDYzLAorCSAweEEzLCAweEQzLCAweEFELCAweDQ5LCAweDIwLCAweEI1LCAweDA4LCAweEIxLCAweDIyLCAweDAzLCAweEUxLCAweDgxLCAweDEwLCAweEI1LCAweDk1LCAweDgxLAorCSAweDYwLCAweDQxLCAweDE4LCAweDAyLCAweDE0LCAweDYwLCAweEZFLCAweDdDLCAweEE0LCAweEQzLCAweEZGLCAweEZGLCAweENDLCAweDg0LCAweEE0LCAweERCLAorCSAweDE2LCAweDAyLCAweDBBLCAweDY0LCAweEE0LCAweERCLCAweDYxLCAweDQ0LCAweDA3LCAweEI0LCAweEZGLCAweEZGLCAweDEwLCAweDAyLCAweDA4LCAweEIxLAorCSAweEUxLCAweDgxLCAweDk1LCAweDgxLCAweEEzLCAweEQzLCAweDBCLCAweDAzLCAweDA4LCAweEFDLCAweDAxLCAweEJDLCAweEEzLCAweERCLCAweEZGLCAweEZGLAorCSAweDEzLCAweEZGLCAweDA1LCAweDAwLCAweDEwLCAweEFDLCAweEEzLCAweERCLCAweDBBLCAweDdDLCAweDBBLCAweDYwLCAweDdGLCAweEY5LCAweEI3LCAweDYwLAorCSAweEFFLCAweDc4LCAweEZGLCAweEZGLCAweDQ2LCAweEYzLCAweDQ1LCAweEYxLCAweDA0LCAweDFCLCAweDY0LCAweDQ0LCAweDAyLCAweDFCLCAweDA3LCAweDYwLAorCSAweEY3LCAweEYzLCAweDQ1LCAweEZCLCAweDAwLCAweDYzLCAweDQ2LCAweEZELCAweDYwLCAweDQxLCAweDI1LCAweDY0LCAweDNCLCAweERCLCAweDI3LCAweDQ0LAorCSAweEVGLCAweEI0LCAweDQwLCAweDQ3LCAweDAwLCAweEI5LCAweDcxLCAweDQwLCAweDgwLCAweDI3LCAweDAxLCAweDEyLCAweDE5LCAweDAzLCAweEMxLCAweDYwLAorCSAweDBDLCAweDYyLCAweDg0LCAweEZGLCAweDQyLCAweDQyLCAweDgyLCAweEZGLCAweEEwLCAweDRDLCAweDE0LCAweEJDLCAweEZGLCAweEI0LCAweEEwLCAweDUxLAorCSAweDFGLCAweDBBLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDgxLCAweDNFLCAweDcwLCAweDQ0LCAweEFDLCAweDgwLCAweDE5LCAweDBBLCAweDcxLCAweDQwLAorCSAweDgwLCAweDI3LCAweEY3LCAweDEyLCAweDQ1LCAweEYzLCAweDI3LCAweDAyLCAweDAzLCAweDE4LCAweENDLCAweDg0LCAweDQ1LCAweEZCLCAweEYxLCAweDAyLAorCSAweDA2LCAweDBBLCAweEEwLCAweDRDLCAweEZCLCAweEI0LCAweEEwLCAweDUxLCAweEE0LCAweDYwLCAweEQ3LCAweDc4LCAweEZGLCAweEZGLCAweDg0LCAweEZGLAorCSAweEMwLCAweDYwLCAweEVBLCAweDY0LCAweDQwLCAweDQyLCAweDgyLCAweEZGLCAweEEwLCAweDRDLCAweDE0LCAweEJDLCAweEZGLCAweEI0LCAweEEwLCAweDUxLAorCSAweEFGLCAweDYwLCAweDdCLCAweDc4LCAweEZGLCAweEZGLCAweDNDLCAweDQ0LCAweEFDLCAweDgwLCAweDMyLCAweEYxLCAweDEyLCAweDAzLCAweDY0LCAweDQwLAorCSAweDA3LCAweDIyLCAweDBGLCAweDAwLCAweEE0LCAweDYwLCAweEI2LCAweDc4LCAweEZGLCAweEZGLCAweEEwLCAweDRDLCAweDFDLCAweEJDLCAweERGLCAweEI0LAorCSAweEEwLCAweDUxLCAweEYxLCAweDAxLCAweDA2LCAweDAwLCAweDI4LCAweDY0LCAweDNBLCAweERCLCAweEEwLCAweDRDLCAweDMwLCAweEJDLCAweEYzLCAweEI0LAorCSAweEEwLCAweDUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDgxLCAweDNFLCAweDI4LCAweDY0LCAweDNCLCAweERCLCAweDA3LCAweDYwLCAweEY4LCAweEYzLAorCSAweDMyLCAweDQwLCAweDAyLCAweDI3LCAweDE2LCAweDAwLCAweDQ2LCAweEZCLCAweDE0LCAweDE4LCAweEMxLCAweDYwLCAweDU5LCAweDY0LCAweDg0LCAweEZGLAorCSAweDQwLCAweDQyLCAweDgyLCAweEZGLCAweEEwLCAweDRDLCAweDE1LCAweEJDLCAweEY3LCAweEI0LCAweEEwLCAweDUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLAorCSAweDgxLCAweDNFLCAweDcwLCAweDQ0LCAweEFDLCAweDgwLCAweDQ2LCAweEYzLCAweENCLCAweDBBLCAweERELCAweDAyLCAweENDLCAweDg0LCAweDQ2LCAweEZCLAorCSAweEY1LCAweDAyLCAweDg0LCAweEZGLCAweEMxLCAweDYwLCAweDZCLCAweDY0LCAweDQwLCAweDQyLCAweDgyLCAweEZGLCAweDI3LCAweDQ0LCAweDA4LCAweEJDLAorCSAweDQwLCAweDQ3LCAweEY5LCAweEUxLCAweDA0LCAweDAwLCAweDc4LCAweEUxLCAweDMxLCAweDQwLCAweDAxLCAweDI2LCAweEY5LCAweEUxLCAweEE0LCAweDYwLAorCSAweEFBLCAweDc4LCAweEZGLCAweEZGLCAweDE1LCAweDYwLCAweEZCLCAweEYxLCAweDYwLCAweDQ1LCAweDJDLCAweDYwLCAweDBBLCAweDYxLCAweEM1LCAweDgzLAorCSAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweDY2LCAweDQ1LCAweDI0LCAweDQ2LCAweDBFLCAweEYyLCAweDY1LCAweDQ2LCAweDY0LCAweDQ1LAorCSAweEQ1LCAweDgxLCAweDYxLCAweDQ1LCAweDAwLCAweDdGLCAweEQ0LCAweDgwLCAweDY0LCAweDQzLCAweDA4LCAweDA0LCAweEUzLCAweDgzLCAweDYzLCAweDQ1LAorCSAweEM1LCAweDgxLCAweDYxLCAweDQ1LCAweEQ0LCAweDgwLCAweDAyLCAweDY1LCAweDAzLCAweDA3LCAweDAzLCAweDAwLCAweDAwLCAweDY1LCAweDAxLCAweDAwLAorCSAweDAxLCAweDY1LCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDY2LCAweDQzLCAweDY0LCAweDQ2LCAweDhGLCAweEYwLCAweDEyLCAweEYyLCAweDkxLCAweEYyLAorCSAweDYwLCAweDQwLCAweDEwLCAweDM2LCAweDA1LCAweDAwLCAweDEyLCAweDM2LCAweDA4LCAweDAwLCAweDBDLCAweDM2LCAweDBCLCAweDAwLCAweDBGLCAweDAwLAorCSAweDQwLCAweDYxLCAweEE1LCAweDgwLCAweDBBLCAweDY0LCAweDEzLCAweDAyLCAweEYzLCAweDAxLCAweDEwLCAweDYxLCAweEE1LCAweDgwLCAweDBFLCAweDY0LAorCSAweDBFLCAweDAyLCAweEVFLCAweDAxLCAweDA4LCAweDYxLCAweEE1LCAweDgwLCAweDEwLCAweDY0LCAweDA5LCAweDAyLCAweEU5LCAweDAxLCAweEUxLCAweDgxLAorCSAweEE1LCAweDgwLCAweDAzLCAweDA1LCAweEM4LCAweDg0LCAweDAzLCAweDAyLCAweEUzLCAweDAxLCAweEZGLCAweDYxLCAweDAyLCAweDAwLCAweDEyLCAweEZBLAorCSAweDkxLCAweEZBLCAweDYzLCAweDQ2LCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDhGLCAweEYwLCAweDEyLCAweEYyLCAweDkxLCAweEYyLCAweDYwLCAweDQwLAorCSAweDBBLCAweDM2LCAweDA1LCAweDAwLCAweDBFLCAweDM2LCAweDA4LCAweDAwLCAweDEwLCAweDM2LCAweDBCLCAweDAwLCAweDBGLCAweDAwLCAweDA4LCAweDYxLAorCSAweEE1LCAweDgwLCAweDEwLCAweDdFLCAweDExLCAweDAyLCAweEYzLCAweDAxLCAweDA0LCAweDYxLCAweEE1LCAweDgwLCAweDEyLCAweDdFLCAweDBDLCAweDAyLAorCSAweEVFLCAweDAxLCAweDIwLCAweDYxLCAweEE1LCAweDgwLCAweDBDLCAweDdFLCAweDA3LCAweDAyLCAweEU5LCAweDAxLCAweEU5LCAweDgxLCAweEE1LCAweDgwLAorCSAweDA1LCAweDA1LCAweEQ4LCAweDg0LCAweDAxLCAweDAyLCAweEUzLCAweDAxLCAweDEyLCAweEZBLCAweDkxLCAweEZBLCAweDJFLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI0LCAweEUyLCAweDJELCAweEYzLCAweDJDLCAweEYzLCAweDAwLCAweEJELCAweENDLCAweDg0LCAweDA4LCAweDAzLCAweDJDLCAweEZCLCAweDA2LCAweDAyLAorCSAweDY1LCAweDQ0LCAweDJDLCAweEZCLCAweDhBLCAweEZGLCAweDgwLCAweDYwLCAweDAwLCAweDc1LCAweDg4LCAweEZGLCAweDQ0LCAweEYzLCAweEZGLCAweEZGLAorCSAweERDLCAweDg0LCAweDQ0LCAweEZCLCAweDI4LCAweDYwLCAweDcyLCAweDY1LCAweDI4LCAweDYwLCAweDcwLCAweDYxLCAweEE1LCAweEQzLCAweEExLCAweEQzLAorCSAweDExLCAweDE4LCAweENDLCAweDg0LCAweEExLCAweERCLCAweDBFLCAweDAyLCAweEE1LCAweEQzLCAweEExLCAweERCLCAweDE0LCAweDYwLCAweDNCLCAweEYzLAorCSAweDE0LCAweDYwLCAweDNBLCAweEYxLCAweEEyLCAweERCLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA0LCAweDAzLCAweDhBLCAweEZGLCAweDIwLCAweDYwLAorCSAweDAwLCAweDc1LCAweDg4LCAweEZGLCAweEQyLCAweEYzLCAweDMxLCAweDQwLCAweDAxLCAweDJBLCAweDNELCAweDAwLCAweDYwLCAweDQzLCAweDA0LCAweEIwLAorCSAweDAyLCAweEIwLCAweDA4LCAweDI0LCAweDE2LCAweDAyLCAweDEwLCAweEIwLCAweDI5LCAweDQ0LCAweDM0LCAweDAyLCAweDAwLCAweEE4LCAweENDLCAweDgxLAorCSAweDBELCAweDAzLCAweDQxLCAweDQ5LCAweDJGLCAweDAyLCAweDYzLCAweDQwLCAweDA4LCAweDJBLCAweDA4LCAweDAwLCAweEY3LCAweEIzLCAweDE4LCAweDYwLAorCSAweDBBLCAweEYxLCAweEFELCAweDRGLCAweEZELCAweEI0LCAweEEwLCAweDVELCAweDQ0LCAweDQ5LCAweDI0LCAweDAwLCAweDYzLCAweDQwLCAweDAyLCAweDJBLAorCSAweDEwLCAweDAwLCAweDE4LCAweDYwLCAweDBCLCAweEYzLCAweDE4LCAweDYwLCAweDA5LCAweEZCLCAweDQwLCAweDQ5LCAweDE4LCAweDYwLCAweDBDLCAweEYzLAorCSAweDE4LCAweDYwLCAweDBBLCAweEZCLCAweDBDLCAweEJCLCAweEZELCAweEIzLCAweEFELCAweDRGLCAweDAyLCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVELAorCSAweDExLCAweDAwLCAweDE4LCAweDYwLCAweDBELCAweEYzLCAweDMwLCAweDYwLCAweDEyLCAweDdDLCAweDBDLCAweDE4LCAweEE0LCAweERCLCAweDQwLCAweDQ5LAorCSAweDE4LCAweDYwLCAweDBFLCAweEYzLCAweDE4LCAweDYwLCAweDBBLCAweEZCLCAweDA4LCAweEJCLCAweEZCLCAweEIzLCAweEFELCAweDRGLCAweDAyLCAweEJDLAorCSAweDAwLCAweDdGLCAweEEwLCAweDVELCAweEQyLCAweEZELCAweDAwLCAweDYwLCAweDg1LCAweEYzLCAweDYyLCAweDQzLCAweDE3LCAweDE4LCAweDU4LCAweEQzLAorCSAweDYyLCAweDQxLCAweDAzLCAweDE4LCAweENDLCAweDg0LCAweEExLCAweERCLCAweDExLCAweDAwLCAweDQ5LCAweEQzLCAweEEzLCAweERCLCAweDA2LCAweEExLAorCSAweEExLCAweEQzLCAweDU5LCAweEQxLCAweDYwLCAweDQ1LCAweEE1LCAweEQzLCAweDU5LCAweEQxLCAweEIwLCAweDg0LCAweEE1LCAweERCLCAweDY0LCAweDQ0LAorCSAweDA2LCAweDM2LCAweENELCAweEZFLCAweDA3LCAweDM2LCAweEQ2LCAweEZFLCAweEU2LCAweDAxLCAweDIzLCAweDQ2LCAweEI3LCAweDYwLCAweEFFLCAweDc4LAorCSAweEZGLCAweEZGLCAweDQ2LCAweDQzLCAweDFGLCAweDYwLCAweDQ0LCAweDYxLCAweEExLCAweEQzLCAweDU5LCAweEQxLCAweDA2LCAweDFCLCAweDU5LCAweEQzLAorCSAweDU5LCAweEQxLCAweDAzLCAweDFCLCAweDU5LCAweEQzLCAweDU5LCAweEQxLCAweEYwLCAweDE4LCAweDAwLCAweDYzLCAweDQ5LCAweERELCAweDYwLCAweDQwLAorCSAweDAyLCAweDM2LCAweDExLCAweDAwLCAweDAzLCAweDM2LCAweDMyLCAweDAwLCAweDAxLCAweDM2LCAweDA4LCAweDAwLCAweDA1LCAweDNBLCAweEVBLCAweDAxLAorCSAweEE0LCAweEQzLCAweDVBLCAweEQzLCAweDlDLCAweDg1LCAweEE0LCAweDg0LCAweEEyLCAweERCLCAweEU0LCAweDAxLCAweDAxLCAweDYwLCAweDBBLCAweDYxLAorCSAweDAwLCAweDY0LCAweEExLCAweERCLCAweERGLCAweDAxLCAweEMyLCAweDYwLCAweDhGLCAweDY0LCAweDQwLCAweDQ1LCAweDIyLCAweDAwLCAweDAxLCAweDYwLAorCSAweDBBLCAweDY2LCAweEE2LCAweEQzLCAweDA0LCAweEExLCAweDYwLCAweDQzLCAweEExLCAweEQzLCAweEM5LCAweDgxLCAweDYwLCAweDQ1LCAweDAwLCAweEJCLAorCSAweEExLCAweERCLCAweEJFLCAweEQzLCAweDA5LCAweDAzLCAweEQ0LCAweDg0LCAweDlDLCAweDg0LCAweERDLCAweDg0LCAweEZGLCAweEZGLCAweDA0LCAweDBFLAorCSAweEEzLCAweEQxLCAweDYzLCAweDQ2LCAweDY0LCAweDQzLCAweEYyLCAweDAxLCAweDlDLCAweDg0LCAweERDLCAweDg1LCAweDQ5LCAweERELCAweDYxLCAweDQ0LAorCSAweDAwLCAweEJCLCAweEE2LCAweERCLCAweDAyLCAweDAzLCAweDY1LCAweDQ0LCAweEJFLCAweERCLCAweEJDLCAweDAxLCAweEMyLCAweDYwLCAweDZBLCAweDY0LAorCSAweDQwLCAweDQ1LCAweDAxLCAweDYwLCAweDBBLCAweDY2LCAweEE2LCAweEQzLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweDBGLCAweDE4LCAweDAyLCAweDAzLAorCSAweDYwLCAweDQ2LCAweEY5LCAweDAxLCAweDU4LCAweEQzLCAweEE0LCAweEQzLCAweDYwLCAweDQ1LCAweDAwLCAweDYzLCAweEE0LCAweERELCAweDA1LCAweDE4LAorCSAweDU4LCAweEQzLCAweEZGLCAweEZGLCAweEM0LCAweDgzLCAweEEyLCAweERELCAweENBLCAweDg0LCAweEE2LCAweERCLCAweDI1LCAweDU4LCAweDY0LCAweDQxLAorCSAweDA0LCAweDYwLCAweDQwLCAweDYyLCAweDFBLCAweDYwLCAweDU4LCAweDRELCAweEI0LCAweDc4LCAweEZGLCAweEZGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDY0LCAweDQwLCAweDAxLCAweDJCLCAweDUwLCAweDAwLCAweDI4LCAweDQwLCAweDA4LCAweDNBLCAweDRELCAweDAwLCAweEU4LCAweDg0LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDE1LCAweDYwLCAweEQ1LCAweEZCLCAweDY0LCAweEYxLCAweDI0LCAweDYwLCAweDg4LCAweDYzLCAweDY0LCAweDQwLAorCSAweDAxLCAweDI3LCAweDNDLCAweEEzLCAweDI5LCAweDQwLCAweDQwLCAweDJCLCAweDFFLCAweEEzLCAweEJELCAweEQxLCAweDYzLCAweDQ1LCAweDQ0LCAweDRFLAorCSAweDBFLCAweDYxLCAweEJELCAweEQxLCAweENELCAweDgxLCAweEQwLCAweDgwLCAweDAxLCAweDAzLCAweEZCLCAweDA0LCAweENCLCAweDgzLCAweDE1LCAweDYwLAorCSAweEQ4LCAweEYzLCAweDM5LCAweEYxLCAweEQ3LCAweDgzLCAweEVCLCAweDgzLCAweDJFLCAweDQxLCAweDVELCAweDkzLCAweERGLCAweDgzLCAweDE1LCAweDYwLAorCSAweEQ0LCAweEZELCAweDE1LCAweDYwLCAweEQzLCAweEZCLCAweDUzLCAweDkzLCAweERGLCAweDgwLCAweDEwLCAweDAzLCAweDM4LCAweEYzLCAweENGLCAweDgzLAorCSAweDA4LCAweDAzLCAweERGLCAweDgzLCAweDBCLCAweDAyLCAweERGLCAweDgzLCAweERDLCAweDg0LCAweEYwLCAweEEwLCAweDM4LCAweEZCLCAweDA2LCAweDAzLAorCSAweDAzLCAweDAwLCAweENDLCAweDg0LCAweDM4LCAweEZCLCAweDAyLCAweDAzLCAweDAwLCAweDYzLCAweDAyLCAweDAwLCAweDA4LCAweDY0LCAweDM4LCAweEZCLAorCSAweEUzLCAweDgwLCAweEZCLCAweDgzLCAweEMzLCAweDgzLCAweDYzLCAweDQ0LCAweEZDLCAweEEwLCAweDAyLCAweDBFLCAweDA4LCAweDA3LCAweDA4LCAweDAwLAorCSAweDA0LCAweEE0LCAweEZGLCAweEZGLCAweDA1LCAweDBELCAweEZDLCAweDY0LCAweEZGLCAweDdGLCAweDYwLCAweDQzLCAweDAxLCAweDAwLCAweDA0LCAweDYzLAorCSAweDM5LCAweEZELCAweDE1LCAweDYwLCAweEQ3LCAweEZELCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDE1LCAweDYwLCAweEQyLCAweEYzLCAweDQwLCAweDRFLAorCSAweDYwLCAweDQ2LCAweDJGLCAweERCLCAweDQ0LCAweDQ0LCAweEExLCAweEQzLCAweEQ5LCAweDgxLCAweDQ4LCAweDk0LCAweDI0LCAweDVDLCAweEQwLCAweDlDLAorCSAweDY2LCAweDQyLCAweDA0LCAweDA2LCAweEQyLCAweDlDLCAweDJGLCAweEQ5LCAweDY0LCAweDQ2LCAweDI0LCAweDQ0LCAweEUwLCAweDg0LCAweDQ0LCAweEQzLAorCSAweEEzLCAweERCLCAweEZGLCAweEI0LCAweDYwLCAweDVDLCAweDY2LCAweDQ0LCAweDIyLCAweEE0LCAweEQwLCAweDg0LCAweEUwLCAweEEwLCAweDAyLCAweDBELAorCSAweDAwLCAweDY0LCAweDAyLCAweDAwLCAweDAxLCAweDA0LCAweDFGLCAweDY0LCAweEEyLCAweEQzLCAweDYwLCAweDVDLCAweDY0LCAweDVFLCAweDYwLCAweDQ3LAorCSAweDJGLCAweEQxLCAweDI4LCAweEEzLCAweEEzLCAweEQ5LCAweEQ4LCAweEEzLCAweDJFLCAweDQyLCAweDRFLCAweDhFLCAweEJELCAweERCLCAweERCLCAweDAyLAorCSAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDQzLCAweEZGLCAweDM5LCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDg0LCAweDNFLCAweEZCLCAweDAxLAorCSAweDNELCAweDQ0LCAweDAwLCAweEE4LCAweEZGLCAweEZGLCAweDAzLCAweDAyLCAweDQwLCAweEZGLCAweDQ0LCAweEZGLCAweEY0LCAweDAxLCAweEEwLCAweDRDLAorCSAweDNELCAweDQ2LCAweDJBLCAweEYyLCAweDQ2LCAweDRELCAweDEwLCAweDI1LCAweDEyLCAweDAwLCAweDA5LCAweEUxLCAweEExLCAweEZGLCAweDJELCAweDQ2LAorCSAweDBGLCAweEYyLCAweDAxLCAweDI5LCAweDA2LCAweDAwLCAweDJBLCAweEYwLCAweDQwLCAweEZGLCAweDY0LCAweDQwLCAweDQwLCAweDJCLCAweDA4LCAweEJDLAorCSAweDAyLCAweEJDLCAweDBGLCAweEZBLCAweDA4LCAweDI1LCAweERFLCAweDAxLCAweENCLCAweEZFLCAweDVDLCAweDVELCAweERDLCAweDAxLCAweDQ0LCAweEZGLAorCSAweDAzLCAweDJCLCAweDIxLCAweDAwLCAweDg4LCAweEYzLCAweDA2LCAweDYxLCAweDYwLCAweDQzLCAweDY2LCAweDQ1LCAweDMxLCAweEYwLCAweDYzLCAweDQ2LAorCSAweDA1LCAweEYyLCAweDY1LCAweDQ2LCAweEQwLCAweDgwLCAweDMwLCAweEYwLCAweDBGLCAweDAyLCAweDYzLCAweDQ2LCAweDA0LCAweEYyLCAweDY1LCAweDQ2LAorCSAweEQwLCAweDgwLCAweDJGLCAweEYwLCAweDA5LCAweDAyLCAweDYzLCAweDQ2LCAweDAzLCAweEYyLCAweDY1LCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLAorCSAweDAzLCAweDAyLCAweEZGLCAweEZGLCAweDQ4LCAweEZFLCAweDA2LCAweDAwLCAweENELCAweDgxLCAweDAyLCAweEEzLCAweEU3LCAweDAyLCAweDg3LCAweEYxLAorCSAweDA4LCAweEZFLCAweDY0LCAweDQzLCAweDI2LCAweDAzLCAweDMxLCAweEYyLCAweDE1LCAweDYwLCAweDAyLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLCAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LCAweDYxLCAweDQ2LAorCSAweDMxLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDMwLCAweEYwLCAweDYzLCAweDQ2LAorCSAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLCAweDYxLCAweDQ2LCAweDJGLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLAorCSAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweDg3LCAweEYzLCAweDA4LCAweEZFLCAweDYwLCAweDQzLAorCSAweDYxLCAweDQ2LCAweDA3LCAweEZDLCAweDNGLCAweEYyLCAweDA5LCAweDYwLCAweEIwLCAweDY1LCAweEQ0LCAweDgwLCAweDJBLCAweEYyLCAweDlELCAweDA1LAorCSAweDA4LCAweDI1LCAweDg4LCAweDAxLCAweDVDLCAweDRCLCAweDBDLCAweDYwLCAweEVDLCAweDYxLCAweEExLCAweERGLCAweDJELCAweDQ2LCAweDNCLCAweEYyLAorCSAweDg3LCAweEYxLCAweDg3LCAweEY0LCAweDYwLCAweDQwLCAweDIwLCAweDJCLCAweEI3LCAweDAwLCAweEQzLCAweDgwLCAweDJDLCAweEYwLCAweDhELCAweDAzLAorCSAweDA3LCAweEY0LCAweDY0LCAweDQwLCAweDAxLCAweDI2LCAweDg3LCAweEY1LCAweEJBLCAweEY0LCAweDJELCAweDQ2LCAweDA0LCAweDY0LCAweDA0LCAweEIzLAorCSAweDIyLCAweEYwLCAweDA0LCAweDAzLCAweEM1LCAweDYwLCAweEJELCAweDc4LCAweEZGLCAweEZGLCAweEE2LCAweDAwLCAweDEwLCAweDY0LCAweEIwLCAweDlDLAorCSAweDNCLCAweEYyLCAweDIyLCAweEY4LCAweDYwLCAweDQ3LCAweEMwLCAweEI3LCAweDAyLCAweEZFLCAweEYwLCAweDg0LCAweEYwLCAweDg0LCAweEYwLCAweDg0LAorCSAweDAwLCAweEE4LCAweDQwLCAweDRBLCAweDE3LCAweDAzLCAweEUwLCAweDgxLCAweDYxLCAweDQzLCAweDQyLCAweEZFLCAweDAwLCAweDY0LCAweEYwLCAweDg0LAorCSAweEZFLCAweDFGLCAweDQwLCAweDRBLCAweEUxLCAweDg0LCAweEUwLCAweDg0LCAweDJELCAweDQ2LCAweDA3LCAweEY0LCAweEUwLCAweDgxLCAweDNCLCAweEYwLAorCSAweDJBLCAweDQ3LCAweDBDLCAweDYwLCAweDNBLCAweDYzLCAweEEwLCAweDg0LCAweDQ3LCAweDlDLCAweDEwLCAweDAzLCAweDdDLCAweDQ0LCAweDAwLCAweDYwLAorCSAweEIyLCAweDYzLCAweDE0LCAweDAwLCAweDA3LCAweEY0LCAweDNCLCAweEYwLCAweDY2LCAweDQ0LCAweDY0LCAweDQwLCAweDgwLCAweDJCLCAweDA2LCAweDAwLAorCSAweDAwLCAweDYwLCAweDc4LCAweDdDLCAweDAwLCAweDYwLCAweEEyLCAweDYzLCAweDQzLCAweDRDLCAweDA4LCAweDAwLCAweDJELCAweDQ2LCAweEM1LCAweDYwLAorCSAweEIwLCAweDc4LCAweEZGLCAweEZGLCAweDJELCAweDQ2LCAweEM1LCAweDYwLCAweEIwLCAweDc4LCAweEZGLCAweEZGLCAweENFLCAweEZCLCAweENGLCAweEY5LAorCSAweEQwLCAweEZELCAweEFELCAweDQ2LCAweDNELCAweEYyLCAweEFELCAweDQ2LCAweEEzLCAweEQwLCAweEFELCAweDQ2LCAweEQwLCAweDgwLCAweDNDLCAweEYyLAorCSAweEFELCAweDQ2LCAweDAyLCAweDAzLCAweDE1LCAweDA3LCAweEVFLCAweDA0LCAweDVCLCAweEQwLCAweEFELCAweDQ2LCAweEQwLCAweDgwLCAweDNBLCAweEYyLAorCSAweDAzLCAweDAzLCAweEFELCAweDQ2LCAweDBELCAweDA3LCAweEU2LCAweDA0LCAweDNBLCAweEYwLCAweEFELCAweDQ2LCAweDVCLCAweEQwLCAweDY0LCAweDQ0LAorCSAweEQwLCAweDgwLCAweDJCLCAweDQ0LCAweDA1LCAweDA3LCAweERFLCAweDAzLCAweEQwLCAweDg0LCAweDEwLCAweEE0LCAweEZGLCAweEZGLCAweDAwLCAweDA3LAorCSAweENGLCAweEYzLCAweENFLCAweEY1LCAweEZFLCAweEE0LCAweDBGLCAweDYwLCAweEMwLCAweDYxLCAweDBFLCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LAorCSAweEZELCAweDFGLCAweDJELCAweDQ2LCAweDhCLCAweEZGLCAweDJELCAweDQ2LCAweDBGLCAweDYwLCAweEIyLCAweDY0LCAweEM5LCAweDYwLCAweDU4LCAweDRGLAorCSAweDEwLCAweDc4LCAweEZGLCAweEZGLCAweDNGLCAweEYyLCAweDAwLCAweDYwLCAweDE4LCAweDcwLCAweDE4LCAweDcxLCAweDIwLCAweDcyLCAweDYwLCAweDUzLAorCSAweDg4LCAweDc1LCAweDAwLCAweEYyLCAweDA5LCAweEUxLCAweDYwLCAweDUwLCAweDEyLCAweDcxLCAweDZFLCAweDcyLCAweDgzLCAweDc1LCAweEExLCAweEZGLAorCSAweEZGLCAweEZGLCAweDA4LCAweDI1LCAweDFGLCAweDAwLCAweDQwLCAweEZGLCAweDAyLCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDc1LCAweDQwLAorCSAweDAzLCAweDJBLCAweDAzLCAweDAwLCAweDgwLCAweDc1LCAweDBBLCAweDY0LCAweDBCLCAweDAwLCAweDgwLCAweDc1LCAweDFCLCAweEYzLCAweDhCLCAweEZGLAorCSAweDAyLCAweDYwLCAweDAwLCAweDc1LCAweEZGLCAweEZGLCAweDAyLCAweDYwLCAweDAwLCAweDc1LCAweERDLCAweDg0LCAweEEyLCAweERCLCAweDAyLCAweDY0LAorCSAweDk4LCAweEZGLCAweDJELCAweDQ2LCAweDBGLCAweEYwLCAweEZGLCAweEZGLCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDg4LCAweEZGLCAweEMzLCAweDYwLAorCSAweDc0LCAweDc4LCAweEZGLCAweEZGLCAweDhCLCAweEZGLCAweDAyLCAweDYwLCAweDAwLCAweDc1LCAweEZGLCAweEZGLCAweDAyLCAweDYwLCAweDAwLCAweDc1LAorCSAweDg4LCAweEZGLCAweEM1LCAweDYwLCAweDk2LCAweDc4LCAweEZGLCAweEZGLCAweDIyLCAweEYwLCAweDIyLCAweDY0LCAweEIwLCAweDg0LCAweDIyLCAweEZBLAorCSAweDNBLCAweEYwLCAweEZGLCAweEZGLCAweDY0LCAweDQ0LCAweEUwLCAweDdGLCAweEEwLCAweDVCLCAweDY0LCAweDQ3LCAweEUxLCAweDdGLCAweDVBLCAweEQwLAorCSAweEEwLCAweDVCLCAweDY0LCAweDQ0LCAweEUyLCAweDdGLCAweEEwLCAweDVCLCAweDY0LCAweDQ3LCAweDdDLCAweDVGLCAweEU4LCAweDg0LCAweEU4LCAweDg1LAorCSAweDBELCAweDYwLCAweDAyLCAweDY0LCAweDQ0LCAweEQzLCAweDVBLCAweEQxLCAweDAzLCAweDFCLCAweEM1LCAweDYwLCAweEIwLCAweDc4LCAweEZGLCAweEZGLAorCSAweDYwLCAweDQ1LCAweDY0LCAweDQ0LCAweEUzLCAweDdGLCAweEEwLCAweDVCLCAweDY0LCAweDQ3LCAweEU0LCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVCLAorCSAweDY0LCAweDQ0LCAweEU1LCAweDdGLCAweEEwLCAweDVCLCAweDY0LCAweDQ3LCAweEU2LCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVCLCAweDY0LCAweDQ0LAorCSAweEU3LCAweDdGLCAweEEwLCAweDVCLCAweDY1LCAweDQwLCAweDBELCAweDNBLCAweDFDLCAweDAwLCAweDY0LCAweDQ3LCAweEU4LCAweDdGLCAweDVBLCAweEQxLAorCSAweEEwLCAweDVCLCAweDY0LCAweDQ0LCAweEU5LCAweDdGLCAweEEwLCAweDVCLCAweDY0LCAweDQ3LCAweEVBLCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVCLAorCSAweDY0LCAweDQ0LCAweEVCLCAweDdGLCAweEEwLCAweDVCLCAweDY0LCAweDQ3LCAweEVDLCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVCLCAweDY0LCAweDQ0LAorCSAweEVELCAweDdGLCAweEEwLCAweDVCLCAweDY0LCAweDQ3LCAweEVFLCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVCLCAweDY0LCAweDQ0LCAweEVGLCAweDdGLAorCSAweEEwLCAweDVCLCAweDY1LCAweDQ0LCAweEQ4LCAweDg0LCAweDA4LCAweDI1LCAweEI5LCAweDAwLCAweDYwLCAweDdGLCAweEEwLCAweDVCLCAweDgwLCAweDYwLAorCSAweDAwLCAweEVCLCAweEEwLCAweDYwLCAweDAwLCAweEVCLCAweEQxLCAweDYwLCAweDAwLCAweEVCLCAweDNGLCAweEYyLCAweDNCLCAweEYwLCAweDYwLCAweDQzLAorCSAweEZDLCAweEE0LCAweDY0LCAweDQwLCAweDIwLCAweDJCLCAweDAzLCAweDAwLCAweDA4LCAweEE0LCAweDNGLCAweEZBLCAweDA4LCAweEEzLCAweEY4LCAweEEzLAorCSAweDNGLCAweEZBLCAweDBBLCAweEUxLCAweEIzLCAweEZGLCAweDlBLCAweEZGLCAweENCLCAweDgzLCAweDAwLCAweEY0LCAweDEwLCAweDYyLCAweDZDLCAweDYxLAorCSAweDBFLCAweEEzLCAweEFCLCAweDg0LCAweEYyLCAweEEzLCAweEExLCAweEZGLCAweDA4LCAweDAwLCAweDAwLCAweEY0LCAweDgxLCAweEYyLCAweDZDLCAweDE4LAorCSAweDAyLCAweDYyLCAweEM5LCAweDgxLCAweEFCLCAweDg0LCAweDAxLCAweDAwLCAweEEyLCAweERDLCAweDdBLCAweEQ0LCAweEZELCAweDFDLCAweEEyLCAweERDLAorCSAweDA4LCAweDI1LCAweDhDLCAweDAwLCAweEYyLCAweDFELCAweDQxLCAweDQ0LCAweDdDLCAweEE4LCAweEQ5LCAweDgxLCAweEVFLCAweDAzLCAweEZGLCAweEIxLAorCSAweDk4LCAweEZGLCAweDA5LCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDA4LCAweDI1LCAweDgwLCAweDAwLCAweDQwLCAweEZGLCAweDQyLCAweDQyLAorCSAweDQ2LCAweDQzLCAweDA2LCAweDFFLCAweDA0LCAweDAyLCAweDAwLCAweEY0LCAweDAyLCAweDYyLCAweDQyLCAweDQyLCAweDQ2LCAweDQzLCAweDAxLCAweEEyLAorCSAweDYzLCAweDQ1LCAweDAxLCAweEEyLCAweDYyLCAweDQzLCAweDQ2LCAweDRDLCAweEM2LCAweDYwLCAweDU4LCAweDRGLCAweDRCLCAweDc4LCAweEZGLCAweEZGLAorCSAweDBBLCAweEUxLCAweDlBLCAweEZGLCAweDI0LCAweDQxLCAweDAyLCAweEExLCAweDY1LCAweDQzLCAweDA4LCAweEEzLCAweDIzLCAweDQ2LCAweDIyLCAweDQyLAorCSAweDdFLCAweDNBLCAweDBBLCAweDAwLCAweDAwLCAweEY0LCAweDgxLCAweEYyLCAweDM3LCAweDE4LCAweDAyLCAweDYyLCAweEM5LCAweDgxLCAweEFCLCAweDg0LAorCSAweDAzLCAweDAwLCAweEEyLCAweERDLCAweDdFLCAweDM2LCAweEY2LCAweDAxLCAweDdBLCAweEQ0LCAweEZGLCAweEZGLCAweEZBLCAweDFDLCAweEEyLCAweERDLAorCSAweEYxLCAweDFELCAweEQ5LCAweDgxLCAweEZGLCAweEIxLCAweDBCLCAweDFFLCAweDYyLCAweDQwLCAweDdFLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LAorCSAweDAyLCAweDYyLCAweDVBLCAweEQyLCAweDg5LCAweEZGLCAweDgwLCAweDRGLCAweDZGLCAweDQ0LCAweEEyLCAweERBLCAweDg4LCAweEZGLCAweDk4LCAweEZGLAorCSAweDNELCAweDQ2LCAweDBGLCAweEYwLCAweDBBLCAweDY0LCAweEIwLCAweDg0LCAweDE4LCAweDE0LCAweEY3LCAweEI0LCAweEEyLCAweERBLCAweDA2LCAweDYwLAorCSAweDc2LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDBDLCAweDAwLCAweEQxLCAweEY1LCAweEQwLCAweEY0LCAweDBDLCAweDYwLAorCSAweEVDLCAweDYxLCAweDU5LCAweEQxLCAweDNCLCAweEY4LCAweDA1LCAweDY0LCAweDU5LCAweEQxLCAweENDLCAweDg0LCAweEJELCAweEQ4LCAweEZDLCAweDAyLAorCSAweDJELCAweDQ2LCAweEMzLCAweDYwLCAweDc0LCAweDc4LCAweEZGLCAweEZGLCAweDI4LCAweDAwLCAweEEyLCAweERBLCAweDJELCAweDQ2LCAweDNCLCAweEYwLAorCSAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDIwLCAweDJCLCAweDFFLCAweDAwLCAweDA3LCAweEY0LCAweEJCLCAweEYwLCAweDJBLCAweDQ0LCAweEE0LCAweDg0LAorCSAweEZGLCAweEZGLCAweDJGLCAweDI2LCAweDE2LCAweDAwLCAweDJELCAweDQ2LCAweDY0LCAweDQ0LCAweDNBLCAweEYwLCAweEJDLCAweEYwLCAweDY0LCAweDVGLAorCSAweDNELCAweEYwLCAweDA3LCAweEY0LCAweEQwLCAweEY0LCAweEZGLCAweEZGLCAweDA4LCAweEEzLCAweDVCLCAweEQ4LCAweDY1LCAweDVDLCAweDVCLCAweEQ4LAorCSAweDVCLCAweERBLCAweDJELCAweDQ2LCAweENFLCAweEYzLCAweDNDLCAweEZBLCAweENGLCAweEYzLCAweDNELCAweEZBLCAweDJBLCAweDQ0LCAweDIzLCAweEZBLAorCSAweDAxLCAweDAwLCAweDJELCAweDQ2LCAweEMzLCAweDYwLCAweDc0LCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDk4LCAweEZGLCAweDQzLCAweEZGLAorCSAweDQwLCAweEZGLCAweEIwLCAweEZGLCAweEIxLCAweEZGLCAweDJELCAweDQ2LCAweDBDLCAweDYwLCAweEVDLCAweDYxLCAweEExLCAweEQzLCAweDJELCAweDQ2LAorCSAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDBBLCAweDAwLCAweEQxLCAweEY1LCAweEQwLCAweEY0LCAweDU5LCAweEQxLCAweDNCLCAweEY4LCAweDA1LCAweDY0LAorCSAweDU5LCAweEQxLCAweENDLCAweDg0LCAweEJELCAweEQ4LCAweEZDLCAweDAyLCAweDJELCAweDQ2LCAweEMzLCAweDYwLCAweDUzLCAweDc4LCAweEZGLCAweEZGLAorCSAweDk4LCAweEZGLCAweDA5LCAweEUxLCAweEExLCAweEZGLCAweDNELCAweDQ2LCAweDA4LCAweDI1LCAweEUwLCAweDAxLCAweDBGLCAweEYyLCAweDQwLCAweEZGLAorCSAweDAyLCAweEJDLCAweEEyLCAweERBLCAweEMzLCAweDYwLCAweDc0LCAweDc4LCAweEZGLCAweEZGLCAweEIwLCAweDg0LCAweDIyLCAweEZBLCAweDAwLCAweDYzLAorCSAweDNCLCAweEYyLCAweDA2LCAweDYwLCAweDc2LCAweEZELCAweDYwLCAweDQ3LCAweEMwLCAweEI3LCAweDAyLCAweEZFLCAweEYwLCAweDg0LCAweEYwLCAweDg0LAorCSAweEYwLCAweDg0LCAweDAwLCAweEE4LCAweDQwLCAweDRBLCAweDE2LCAweDAzLCAweEUwLCAweDgxLCAweDYxLCAweDQzLCAweDQyLCAweEZFLCAweDAwLCAweDY0LAorCSAweEYwLCAweDg0LCAweEZFLCAweDFGLCAweDQwLCAweDRBLCAweEUxLCAweDg0LCAweEUwLCAweDg0LCAweDJELCAweDQ2LCAweDA3LCAweEY0LCAweEUwLCAweDgxLAorCSAweDNCLCAweEYwLCAweDJBLCAweDQ3LCAweDBDLCAweDYwLCAweDNBLCAweDYzLCAweEEwLCAweDg0LCAweDQ3LCAweDlDLCAweDEwLCAweDAzLCAweDdDLCAweDQ0LAorCSAweEE4LCAweDYzLCAweDBGLCAweDAwLCAweDA3LCAweEY0LCAweDIwLCAweDY0LCAweDQwLCAweDRBLCAweDNCLCAweEYwLCAweDY2LCAweDQ0LCAweDY0LCAweDQwLAorCSAweDgwLCAweDJCLCAweDA1LCAweDAwLCAweDAwLCAweDYwLCAweDc4LCAweDdDLCAweDAwLCAweDYwLCAweDk4LCAweDYzLCAweDAyLCAweDAwLCAweDJELCAweDQ2LAorCSAweEJGLCAweDAxLCAweDJELCAweDQ2LCAweENFLCAweEZCLCAweENGLCAweEY5LCAweEQwLCAweEZELCAweDA3LCAweEYyLCAweEQxLCAweEZCLCAweDYwLCAweDQ2LAorCSAweDNCLCAweEYwLCAweDJBLCAweDQ0LCAweDA2LCAweDYwLCAweDc3LCAweEY5LCAweDVDLCAweDRCLCAweEEwLCAweDg0LCAweEZGLCAweEZGLCAweDNGLCAweDIyLAorCSAweDA1LCAweDAwLCAweDkwLCAweDg0LCAweDNCLCAweEZBLCAweDAxLCAweDY0LCAweDQwLCAweDRCLCAweDIxLCAweDAwLCAweEFELCAweDQ2LCAweDBBLCAweEEzLAorCSAweDNELCAweEYyLCAweEFELCAweDQ2LCAweEEzLCAweEQwLCAweEFELCAweDQ2LCAweEQwLCAweDgwLCAweDNDLCAweEYyLCAweEFELCAweDQ2LCAweDAyLCAweDAzLAorCSAweDE2LCAweDA3LCAweDE0LCAweDA0LCAweDVCLCAweEQwLCAweEFELCAweDQ2LCAweEQwLCAweDgwLCAweDNCLCAweEYyLCAweDAzLCAweDAzLCAweEFELCAweDQ2LAorCSAweDBFLCAweDA3LCAweDBDLCAweDA0LCAweDNBLCAweEYwLCAweEFELCAweDQ2LCAweDVCLCAweEQwLCAweDY0LCAweDVGLCAweEQwLCAweDgwLCAweDJCLCAweDQ0LAorCSAweDE3LCAweDA3LCAweDA0LCAweDAzLCAweEQwLCAweDg0LCAweDEwLCAweEE0LCAweEZGLCAweEZGLCAweDEyLCAweDA3LCAweDg5LCAweDAxLCAweDAxLCAweDY0LAorCSAweDA2LCAweDYwLCAweDc2LCAweEZCLCAweDJELCAweDQ2LCAweDBDLCAweDYwLCAweEZDLCAweDYyLCAweDgwLCAweEZGLCAweDc4LCAweDQ0LCAweDAzLCAweEE0LAorCSAweEEyLCAweERCLCAweEM2LCAweDYwLCAweDc2LCAweDc4LCAweEZGLCAweEZGLCAweDg1LCAweEZGLCAweDJELCAweDQ2LCAweDA4LCAweDI1LCAweDVFLCAweDAxLAorCSAweDJELCAweDQ2LCAweDBDLCAweDYwLCAweEZDLCAweDYyLCAweDgwLCAweEZGLCAweDc4LCAweDQ0LCAweDAzLCAweEE0LCAweEEyLCAweERCLCAweEM2LCAweDYwLAorCSAweEZFLCAweDc4LCAweEZGLCAweEZGLCAweDg1LCAweEZGLCAweDJELCAweDQ2LCAweDA4LCAweDI1LCAweDUwLCAweDAxLCAweDAwLCAweDYwLCAweDBGLCAweDY0LAorCSAweEM0LCAweDYwLCAweERCLCAweDc4LCAweEZGLCAweEZGLCAweDJELCAweDQ2LCAweDNCLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDIwLCAweDJCLAorCSAweDIzLCAweDAwLCAweDAwLCAweEY0LCAweDA4LCAweDYxLCAweDJELCAweDQ2LCAweDAwLCAweEY0LCAweDBBLCAweDYyLCAweDU2LCAweDkyLCAweDVBLCAweEQwLAorCSAweDJDLCAweDQ2LCAweDY0LCAweDQ3LCAweDYzLCAweDQwLCAweDdGLCAweDJBLCAweDAzLCAweDAwLCAweDAwLCAweEY0LCAweDAzLCAweDYzLCAweDQ2LCAweDRDLAorCSAweDYwLCAweEZFLCAweERFLCAweEQ4LCAweDdGLCAweDNBLCAweDAzLCAweDAwLCAweDAwLCAweEY0LCAweDAzLCAweDYzLCAweDQ2LCAweDRDLCAweERFLCAweERBLAorCSAweEZFLCAweEExLCAweDIwLCAweEZFLCAweEU4LCAweDAyLCAweDYzLCAweDQxLCAweEZELCAweEExLCAweDQ2LCAweDRDLCAweDAxLCAweEYyLCAweDJELCAweDQ2LAorCSAweDYxLCAweDVFLCAweDE2LCAweEZBLCAweDJDLCAweDQ0LCAweDA2LCAweEZBLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA3LCAweEY0LCAweDY2LCAweDQxLAorCSAweDAzLCAweEYyLCAweDA0LCAweEYyLCAweDQwLCAweDQyLCAweDA1LCAweEYyLCAweDQwLCAweDQzLCAweDQwLCAweDQ0LCAweDYxLCAweDQ2LCAweDNDLCAweEYyLAorCSAweDNELCAweEYyLCAweDQwLCAweDQwLCAweDQwLCAweDQxLCAweDBELCAweDYwLCAweDcyLCAweDY1LCAweDAwLCAweDYxLCAweENGLCAweEYxLCAweENFLCAweEY1LAorCSAweDQ0LCAweDRDLCAweDJDLCAweDVDLCAweEU5LCAweDgwLCAweDAwLCAweDY0LCAweEYwLCAweDg0LCAweEYwLCAweDg0LCAweEMwLCAweDgzLCAweEJELCAweEQyLAorCSAweDI0LCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDIwLCAweDQ0LCAweDQwLCAweDgwLCAweERCLCAweDgzLCAweEJELCAweEQyLAorCSAweDIwLCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDIxLCAweDQ0LCAweDQwLCAweDgxLCAweERCLCAweDgzLCAweEJELCAweEQyLAorCSAweDIxLCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDIyLCAweDQ0LCAweDQwLCAweDgyLCAweERCLCAweDgzLCAweEJELCAweEQyLAorCSAweDIyLCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDIzLCAweDQ0LCAweDQwLCAweDgzLCAweEYyLCAweEEzLCAweEJELCAweEQyLAorCSAweDIzLCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDI0LCAweDQ0LCAweEMwLCAweDlDLCAweDQxLCAweDg0LCAweERELCAweDgxLAorCSAweDA4LCAweDJBLCAweEE3LCAweDAxLCAweDBDLCAweDYwLCAweEVFLCAweDYxLCAweDA1LCAweDY0LCAweEQwLCAweEY0LCAweEQxLCAweEY1LCAweEZFLCAweEEzLAorCSAweDVCLCAweEQwLCAweENDLCAweDg0LCAweDU5LCAweEQ5LCAweEZDLCAweDAyLCAweEQwLCAweEYzLCAweEQxLCAweEY1LCAweDYwLCAweDQyLCAweDIwLCAweDQ0LAorCSAweEEyLCAweERBLCAweDIxLCAweDQ0LCAweDVBLCAweERBLCAweDIyLCAweDQ0LCAweDVBLCAweERBLCAweDIzLCAweDQ0LCAweDVBLCAweERBLCAweDI0LCAweDQ0LAorCSAweDVBLCAweERBLCAweDYxLCAweDQ2LCAweDA2LCAweDYwLCAweDdFLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDY2LCAweDQxLCAweEQwLCAweEYzLAorCSAweEQxLCAweEY1LCAweEEwLCAweEQyLCAweDVBLCAweEQwLCAweDQwLCAweDQwLCAweDQ0LCAweDQxLCAweDVBLCAweEQyLCAweDVBLCAweEQwLCAweDQwLCAweDQyLAorCSAweDVBLCAweEQwLCAweDQ0LCAweDQzLCAweDYxLCAweDQ2LCAweEJBLCAweEYwLCAweDNCLCAweEYyLCAweDQ0LCAweDQ0LCAweDY1LCAweDVGLCAweDQwLCAweDg1LAorCSAweENGLCAweEY0LCAweENFLCAweEY1LCAweDQzLCAweDRDLCAweDBELCAweDYwLCAweDcyLCAweDY1LCAweEJELCAweEQyLCAweDI1LCAweDVDLCAweDkwLCAweDlDLAorCSAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLAorCSAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDIwLCAweDQ0LCAweDQwLCAweDgwLCAweEJELCAweEQyLCAweDIwLCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LAorCSAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LAorCSAweDkwLCAweDlDLCAweDIxLCAweDQ0LCAweDQwLCAweDgxLCAweEJELCAweEQyLCAweDIxLCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLAorCSAweDIyLCAweDQ0LCAweDQwLCAweDgyLCAweEJELCAweEQyLCAweDIyLCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LAorCSAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDIzLCAweDQ0LAorCSAweDQwLCAweDgzLCAweEJELCAweEQyLCAweDIzLCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLAorCSAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDI0LCAweDQ0LCAweDQwLCAweDg0LAorCSAweEJELCAweEQyLCAweDI0LCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LAorCSAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDI1LCAweDQ0LCAweDQwLCAweDg1LCAweDYxLCAweDQ2LAorCSAweDNBLCAweEYwLCAweEZGLCAweEZGLCAweDY0LCAweDQ0LCAweEUwLCAweDdGLCAweEEwLCAweDVCLCAweDY0LCAweDQ3LCAweEUxLCAweDdGLCAweDVBLCAweEQwLAorCSAweEEwLCAweDVCLCAweDY0LCAweDQ0LCAweEUyLCAweDdGLCAweEEwLCAweDVCLCAweDY0LCAweDQ3LCAweENFLCAweEY1LCAweEJELCAweEQyLCAweDI1LCAweDVDLAorCSAweDkwLCAweDg0LCAweEU4LCAweDgwLCAweEY4LCAweDg0LCAweDIwLCAweDVDLCAweDQwLCAweDgwLCAweDIwLCAweDQ0LCAweEU0LCAweDdGLCAweEEwLCAweDVCLAorCSAweDIwLCAweDQ3LCAweEU1LCAweDdGLCAweEEwLCAweDVCLCAweEJELCAweEQyLCAweDIwLCAweDVDLCAweDkwLCAweDg0LCAweEU4LCAweDgwLCAweEY4LCAweDg0LAorCSAweDIxLCAweDVDLCAweDQwLCAweDgxLCAweDIxLCAweDQ0LCAweEU2LCAweDdGLCAweEEwLCAweDVCLCAweDIxLCAweDQ3LCAweEU3LCAweDdGLCAweEEwLCAweDVCLAorCSAweDIxLCAweDQ0LCAweEU4LCAweDgwLCAweEY4LCAweDg0LCAweDIyLCAweDVDLCAweDQwLCAweDgyLCAweDIyLCAweDQ0LCAweEU4LCAweDdGLCAweEEwLCAweDVCLAorCSAweDIyLCAweDQ3LCAweEU5LCAweDdGLCAweEEwLCAweDVCLCAweDIyLCAweDQ0LCAweEU4LCAweDgwLCAweEY4LCAweDg0LCAweDIzLCAweDVDLCAweDQwLCAweDgzLAorCSAweDIzLCAweDQ0LCAweEVBLCAweDdGLCAweEEwLCAweDVCLCAweDIzLCAweDQ3LCAweEVCLCAweDdGLCAweEEwLCAweDVCLCAweDIzLCAweDQ0LCAweEU4LCAweDgwLAorCSAweEY4LCAweDg0LCAweDI0LCAweDVDLCAweDQwLCAweDg0LCAweDI0LCAweDQ0LCAweEVDLCAweDdGLCAweEEwLCAweDVCLCAweDI0LCAweDQ3LCAweEVELCAweDdGLAorCSAweEEwLCAweDVCLCAweDI0LCAweDQ0LCAweEU4LCAweDgwLCAweEY4LCAweDg0LCAweDI1LCAweDVDLCAweDQwLCAweDg1LCAweDI1LCAweDQ0LCAweEVFLCAweDdGLAorCSAweEEwLCAweDVCLCAweDI1LCAweDQ3LCAweEVGLCAweDdGLCAweEEwLCAweDVCLCAweDJDLCAweDQzLCAweEEzLCAweEQyLCAweDI1LCAweDVDLCAweDkwLCAweDgxLAorCSAweEU5LCAweDg0LCAweEUzLCAweDdGLCAweEEwLCAweDVCLCAweDA2LCAweDYwLCAweDdFLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENCLCAweEYzLAorCSAweDVBLCAweEQzLCAweDQwLCAweDQ4LCAweDVBLCAweEQzLCAweDQwLCAweDQ5LCAweDQwLCAweDRBLCAweDAwLCAweDYwLCAweDc4LCAweDdDLCAweDQ0LCAweDRELAorCSAweDQ5LCAweEYyLCAweDRBLCAweEYyLCAweDQwLCAweDQ3LCAweDQwLCAweDQ2LCAweDBELCAweDYwLCAweDcyLCAweDY1LCAweDAwLCAweDYxLCAweDJELCAweDVDLAorCSAweEU5LCAweDgwLCAweDAwLCAweDY0LCAweEYwLCAweDg0LCAweEYwLCAweDg0LCAweEMwLCAweDgzLCAweEJELCAweEQyLCAweDJBLCAweDVDLCAweDkwLCAweDlDLAorCSAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLAorCSAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDI2LCAweDQ0LCAweDQwLCAweDg2LCAweERCLCAweDgzLCAweEJELCAweEQyLCAweDI2LCAweDVDLCAweDkwLCAweDlDLAorCSAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLAorCSAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDI3LCAweDQ0LCAweDQwLCAweDg3LCAweERCLCAweDgzLCAweEJELCAweEQyLCAweDI3LCAweDVDLCAweDkwLCAweDlDLAorCSAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLAorCSAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDI4LCAweDQ0LCAweDQwLCAweDg4LCAweERCLCAweDgzLCAweEJELCAweEQyLCAweDI4LCAweDVDLCAweDkwLCAweDlDLAorCSAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLAorCSAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDI5LCAweDQ0LCAweDQwLCAweDg5LCAweEYyLCAweEEzLCAweEJELCAweEQyLCAweDI5LCAweDVDLCAweDkwLCAweDlDLAorCSAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLAorCSAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDJBLCAweDQ0LCAweEMwLCAweDlDLCAweDQxLCAweDhBLCAweERELCAweDgxLCAweDA4LCAweDJBLCAweEE3LCAweDAxLAorCSAweDI2LCAweDQ0LCAweDQ0LCAweEZBLCAweDI3LCAweDQ0LCAweDQ1LCAweEZBLCAweDI4LCAweDQ0LCAweDQ2LCAweEZBLCAweDI5LCAweDQ0LCAweDQ3LCAweEZBLAorCSAweDJBLCAweDQ0LCAweDQ4LCAweEZBLCAweDA2LCAweDYwLCAweDdGLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDg4LCAweDdDLAorCSAweDQ0LCAweDRELCAweDJELCAweDQyLCAweEEyLCAweEQyLCAweDVBLCAweEQwLCAweDQwLCAweDQ2LCAweDQ0LCAweDQ3LCAweDVBLCAweEQyLCAweDVBLCAweEQwLAorCSAweDQwLCAweDQ4LCAweDVBLCAweEQwLCAweDQ0LCAweDQ5LCAweDRCLCAweEYyLCAweDQ0LCAweDRBLCAweDQwLCAweDhCLCAweDYwLCAweDVDLCAweDY0LCAweDQ3LAorCSAweEUwLCAweDdGLCAweEEwLCAweDVBLCAweEZGLCAweEI0LCAweDIwLCAweEJDLCAweDdGLCAweEI0LCAweEUxLCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LAorCSAweEUyLCAweDdGLCAweEEwLCAweDVBLCAweDAwLCAweDYwLCAweDc4LCAweDYzLCAweDBELCAweDYwLCAweDcyLCAweDY1LCAweEJELCAweEQyLCAweDJCLCAweDVDLAorCSAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LAorCSAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDI2LCAweDQ0LCAweDQwLCAweDg2LCAweEJELCAweEQyLCAweDI2LCAweDVDLCAweDkwLCAweDlDLAorCSAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLAorCSAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDI3LCAweDQ0LCAweDQwLCAweDg3LCAweEJELCAweEQyLCAweDI3LCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LAorCSAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LAorCSAweDkwLCAweDlDLCAweDI4LCAweDQ0LCAweDQwLCAweDg4LCAweEJELCAweEQyLCAweDI4LCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLAorCSAweDI5LCAweDQ0LCAweDQwLCAweDg5LCAweEJELCAweEQyLCAweDI5LCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LAorCSAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDJBLCAweDQ0LAorCSAweDQwLCAweDhBLCAweEJELCAweEQyLCAweDJBLCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLAorCSAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDJCLCAweDQ0LCAweDQwLCAweDhCLAorCSAweEJELCAweEQyLCAweDJCLCAweDVDLCAweDkwLCAweDg0LCAweEU4LCAweDgwLCAweEY4LCAweDg0LCAweDI2LCAweDVDLCAweDQwLCAweDg2LCAweDI2LCAweDQ0LAorCSAweEU0LCAweDdGLCAweEEwLCAweDVBLCAweDI2LCAweDQ3LCAweEU1LCAweDdGLCAweEEwLCAweDVBLCAweEJELCAweEQyLCAweDI2LCAweDVDLCAweDkwLCAweDg0LAorCSAweEU4LCAweDgwLCAweEY4LCAweDg0LCAweDI3LCAweDVDLCAweDQwLCAweDg3LCAweDI3LCAweDQ0LCAweEU2LCAweDdGLCAweEEwLCAweDVBLCAweDI3LCAweDQ3LAorCSAweEU3LCAweDdGLCAweEEwLCAweDVBLCAweDI3LCAweDQ0LCAweEU4LCAweDgwLCAweEY4LCAweDg0LCAweDI4LCAweDVDLCAweDQwLCAweDg4LCAweDI4LCAweDQ0LAorCSAweEU4LCAweDdGLCAweEEwLCAweDVBLCAweDI4LCAweDQ3LCAweEU5LCAweDdGLCAweEEwLCAweDVBLCAweDI4LCAweDQ0LCAweEU4LCAweDgwLCAweEY4LCAweDg0LAorCSAweDI5LCAweDVDLCAweDQwLCAweDg5LCAweDI5LCAweDQ0LCAweEVBLCAweDdGLCAweEEwLCAweDVBLCAweDI5LCAweDQ3LCAweEVCLCAweDdGLCAweEEwLCAweDVBLAorCSAweDI5LCAweDQ0LCAweEU4LCAweDgwLCAweEY4LCAweDg0LCAweDJBLCAweDVDLCAweDQwLCAweDhBLCAweDJBLCAweDQ0LCAweEVDLCAweDdGLCAweEEwLCAweDVBLAorCSAweDJBLCAweDQ3LCAweEVELCAweDdGLCAweEEwLCAweDVBLCAweDJBLCAweDQ0LCAweEU4LCAweDgwLCAweEY4LCAweDg0LCAweDJCLCAweDVDLCAweDQwLCAweDhCLAorCSAweDJCLCAweDQ0LCAweEVFLCAweDdGLCAweEEwLCAweDVBLCAweDJCLCAweDQ3LCAweEVGLCAweDdGLCAweEEwLCAweDVBLCAweDNDLCAweEYwLCAweDJCLCAweDQ0LAorCSAweDkwLCAweDg0LCAweEU4LCAweDg0LCAweEUzLCAweDdGLCAweEEwLCAweDVBLCAweDA2LCAweDYwLCAweDdGLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQ1LCAweDAwLCAweEYwLCAweDg0LCAweDYwLCAweDAwLCAweEUzLCAweDA0LCAweDcxLCAweDY0LCAweDUwLCAweDAxLCAweDJBLCAweDA0LCAweDcxLAorCSAweDVDLCAweDYxLCAweDA0LCAweDYzLCAweDU5LCAweEQwLCAweDU4LCAweEQ5LCAweEZELCAweDFGLCAweDNELCAweEYyLCAweDYwLCAweDQzLCAweDYwLCAweDQ3LAorCSAweDVCLCAweERCLCAweDNDLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweDVCLCAweERCLCAweDNBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQ3LAorCSAweDVCLCAweERCLCAweDNGLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweDVCLCAweERCLCAweDgxLCAweDYwLCAweDE4LCAweEUzLCAweDY1LCAweDQzLAorCSAweEUzLCAweDg0LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweDYwLCAweDUwLCAweDdGLCAweDY0LCAweDIzLCAweDk0LCAweDYwLCAweDUxLCAweDdDLCAweDcyLAorCSAweDA0LCAweDc1LCAweDBDLCAweDYwLCAweDE2LCAweDYxLCAweDE2LCAweDYwLCAweDAwLCAweDYzLCAweDU5LCAweERELCAweDJBLCAweEYyLCAweDg3LCAweDYwLAorCSAweDhGLCAweDY1LCAweEE0LCAweDg3LCAweDQwLCAweEJGLCAweDU5LCAweERCLCAweDU2LCAweDY0LCAweDBBLCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LAorCSAweEZELCAweDFGLCAweDYyLCAweDY0LCAweDA0LCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDM1LCAweEYyLCAweDBGLCAweDY1LAorCSAweEE0LCAweDlDLCAweDU5LCAweEQ5LCAweDA2LCAweDYzLCAweDU5LCAweERGLCAweEZFLCAweDFGLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LAorCSAweDAzLCAweDJCLCAweDA1LCAweDAwLCAweDZBLCAweDY0LCAweDA0LCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDY1LCAweDQwLAorCSAweDhGLCAweEIwLCAweDg4LCAweDNBLCAweDAyLCAweDAwLCAweDM5LCAweEYwLCAweDU5LCAweEQ5LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBDLCAweDYwLAorCSAweDE2LCAweDYxLCAweEEzLCAweDQ2LCAweDAwLCAweEY0LCAweDAyLCAweDY0LCAweDBBLCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLAorCSAweDU5LCAweERGLCAweDU5LCAweERGLCAweEEwLCAweDRDLCAweDA0LCAweEJDLCAweEZGLCAweEI0LCAweEEwLCAweDUxLCAweDIzLCAweDQ0LCAweDAxLCAweEE3LAorCSAweDgwLCAweEJGLCAweDYwLCAweDUwLCAweDgwLCAweDYwLCAweDM4LCAweDcxLCAweDgwLCAweDYwLCAweDdDLCAweDcyLCAweDAxLCAweDc2LCAweEZGLCAweEZGLAorCSAweDc2LCAweDQ0LCAweDAxLCAweDNBLCAweEZELCAweDAxLCAweDQwLCAweDc2LCAweDQyLCAweEZGLCAweEZGLCAweEZGLCAweDQwLCAweDc2LCAweDgwLCAweDYwLAorCSAweDE4LCAweDcwLCAweDgwLCAweDYwLCAweDE4LCAweDcxLCAweDgwLCAweDYwLCAweDdDLCAweDcyLCAweDgwLCAweDYwLCAweDEwLCAweDczLCAweDAyLCAweDc2LAorCSAweDc2LCAweDQ0LCAweEZGLCAweEZGLCAweDc2LCAweDQ0LCAweDAyLCAweDNBLCAweEZELCAweDAxLCAweDQwLCAweDc2LCAweDQyLCAweEZGLCAweDNDLCAweDQ2LAorCSAweDAwLCAweEYyLCAweDgwLCAweDYwLCAweDAwLCAweEJDLCAweDYwLCAweDUwLCAweDgwLCAweDYwLCAweDEyLCAweDcxLCAweDgwLCAweDYwLCAweDZFLCAweDcyLAorCSAweDNGLCAweEYyLCAweEZGLCAweEZGLCAweEY4LCAweEE3LCAweDgwLCAweEJGLCAweDYwLCAweDUzLCAweDA0LCAweDc2LCAweEZGLCAweEZGLCAweDg4LCAweEZGLAorCSAweDNDLCAweDQ2LCAweDA3LCAweEYyLCAweEZGLCAweEZGLCAweDQwLCAweDQzLCAweEEzLCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDc3LCAweDQwLAorCSAweDhCLCAweEZGLCAweEEwLCAweDRDLCAweDA0LCAweEUxLCAweEZGLCAweEZGLCAweDc2LCAweDQ0LCAweDA0LCAweDNBLCAweEZELCAweDAxLCAweDQwLCAweDc2LAorCSAweDQyLCAweEZGLCAweEZGLCAweEZGLCAweDEwLCAweDc2LCAweEZGLCAweEZGLCAweDc2LCAweDQ0LCAweDIwLCAweDNBLCAweEZELCAweDAxLCAweDQwLCAweDc2LAorCSAweDQyLCAweEZGLCAweEEwLCAweDQ4LCAweDAwLCAweDdGLCAweEEwLCAweDUxLCAweDAyLCAweDYwLCAweDAwLCAweDc1LCAweDg4LCAweEZGLCAweEEwLCAweDRDLAorCSAweEZCLCAweEI0LCAweEEwLCAweDUxLCAweDA2LCAweDYwLCAweDFGLCAweEUxLCAweDE2LCAweEZGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LAorCSAweDNGLCAweEYyLCAweEZGLCAweEZGLCAweEY4LCAweEE0LCAweDNGLCAweEZBLCAweDAwLCAweEY0LCAweDYwLCAweDQ3LCAweDA4LCAweEZBLCAweEEwLCAweDQ4LAorCSAweDA4LCAweDI2LCAweDA3LCAweDAwLCAweEEwLCAweDRDLCAweDA0LCAweEUxLCAweEZGLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDdGLAorCSAweEEwLCAweDUxLCAweDQyLCAweEZGLCAweDI2LCAweDQ2LCAweDhCLCAweEZGLCAweDAyLCAweDYwLCAweDAwLCAweDc1LCAweDNDLCAweEYyLCAweDQwLCAweDc2LAorCSAweDE0LCAweDFCLCAweDI2LCAweDQ2LCAweDNCLCAweEYyLCAweDBDLCAweDYwLCAweEJDLCAweDYzLCAweDYwLCAweDQ3LCAweEMwLCAweEI0LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDQzLCAweDkzLCAweEUzLCAweDlDLCAweDY0LCAweDQ3LCAweDgwLCAweDdDLCAweDY0LCAweDVGLCAweDYwLCAweDUwLAorCSAweDdGLCAweDY0LCAweDIzLCAweDk3LCAweDgwLCAweEJGLCAweDYwLCAweDUxLCAweDA3LCAweDAwLCAweDAxLCAweEE3LCAweDgwLCAweEJGLCAweDYwLCAweDUwLAorCSAweDgwLCAweDYwLCAweDQwLCAweDcxLCAweDgwLCAweDYwLCAweDdDLCAweDcyLCAweDAxLCAweDc2LCAweEZGLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLAorCSAweDBDLCAweDIxLCAweEZDLCAweDAxLCAweDA0LCAweDI1LCAweEQ1LCAweDAxLCAweDQwLCAweDc2LCAweDQzLCAweEZGLCAweDBDLCAweDYwLCAweDIyLCAweDYxLAorCSAweDI2LCAweDQ2LCAweDAwLCAweEY0LCAweDAyLCAweDY0LCAweDBBLCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDU5LCAweERGLAorCSAweDU5LCAweERGLCAweDgwLCAweDYwLCAweDE4LCAweDcwLCAweDgwLCAweDYwLCAweDI0LCAweDcxLCAweDgwLCAweDYwLCAweDdDLCAweDcyLCAweDgwLCAweDYwLAorCSAweDEwLCAweDczLCAweDAyLCAweDc2LCAweEZGLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDBDLCAweDIxLCAweEZDLCAweDAxLCAweDA0LCAweDI1LAorCSAweEI4LCAweDAxLCAweDQwLCAweDc2LCAweDQzLCAweEZGLCAweDI2LCAweDQ2LCAweDAwLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweDgwLCAweEJGLAorCSAweDYwLCAweDUwLCAweDgwLCAweDYwLCAweDEyLCAweDcxLCAweDNGLCAweEYyLCAweDgwLCAweDYwLCAweDZFLCAweDcyLCAweDYwLCAweDQ3LCAweDgwLCAweEJGLAorCSAweDYwLCAweDUzLCAweDA0LCAweDc2LCAweEZGLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDBDLCAweDIxLCAweEZDLCAweDAxLCAweDA0LCAweDI1LAorCSAweEEwLCAweDAxLCAweDQwLCAweDc2LCAweDQzLCAweEZGLCAweDA4LCAweDc2LCAweEZGLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDBDLCAweDIxLAorCSAweEZDLCAweDAxLCAweDA0LCAweDI1LCAweDk2LCAweDAxLCAweDc2LCAweDVDLCAweEZGLCAweEZGLCAweDQwLCAweDc2LCAweDQzLCAweEZGLCAweDg4LCAweEZGLAorCSAweDI2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweERGLCAweDYwLCAweDJBLCAweDc4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDExLCAweEYxLAorCSAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDIwLCAweDAwLCAweDc0LCAweEYzLCAweDMxLCAweDQwLAorCSAweDAxLCAweDJBLCAweDFDLCAweDAwLCAweERDLCAweDg0LCAweDAxLCAweEI0LCAweDc0LCAweEZCLCAweDA4LCAweDAyLCAweDA4LCAweDYwLCAweDEyLCAweEYxLAorCSAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDEwLCAweDAwLCAweDA4LCAweDYwLCAweDE4LCAweEYxLAorCSAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDA4LCAweDAwLCAweEE5LCAweEZFLCAweEU2LCAweDA1LAorCSAweEFCLCAweEZFLCAweDA3LCAweDA1LCAweEE4LCAweEZFLCAweEQ3LCAweDA1LCAweEFBLCAweEZFLCAweEQ4LCAweDA1LCAweEExLCAweEZGLCAweEZGLCAweEZGLAorCSAweDg1LCAweDNFLCAweDBGLCAweDYwLCAweDg1LCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDAzLCAweDAyLCAweENBLCAweDYwLAorCSAweDdFLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ1LCAweEQ0LCAweDgwLCAweDBGLCAweEYwLCAweEY5LCAweDAzLCAweDY0LCAweDQ0LCAweDcwLCAweEIwLAorCSAweDcwLCAweDJBLCAweDEzLCAweDAwLCAweDEzLCAweDYwLCAweDA4LCAweEYzLCAweEZGLCAweEZGLCAweERDLCAweDg0LCAweDAwLCAweDM2LCAweDAwLCAweDNCLAorCSAweEEyLCAweERCLCAweEEyLCAweEZGLCAweDhFLCAweEYzLCAweEZGLCAweEZGLCAweENDLCAweDg0LCAweEZFLCAweEEwLCAweDhFLCAweEZCLCAweDAxLCAweDA3LAorCSAweEQ0LCAweEZFLCAweEEzLCAweEZGLCAweENFLCAweDYwLCAweDM4LCAweDc4LCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAyLCAweDI2LCAweDA5LCAweDAwLAorCSAweDY2LCAweDQ1LCAweDA5LCAweEY0LCAweDBGLCAweEYyLCAweDAyLCAweDE4LCAweDY1LCAweDQ2LCAweEU0LCAweDFCLCAweDAwLCAweDY0LCAweDQwLCAweDQ2LAorCSAweENELCAweDAxLCAweEEyLCAweEZGLCAweDhFLCAweEYzLCAweDQ2LCAweDQ2LCAweENDLCAweDg0LCAweEZFLCAweEEwLCAweDhFLCAweEZCLCAweDAxLCAweDA3LAorCSAweEQ0LCAweEZFLCAweEEzLCAweEZGLCAweDBGLCAweEYwLCAweEEzLCAweEZDLCAweDY0LCAweDQ0LCAweDgwLCAweDI2LCAweDE3LCAweDAwLCAweDI1LCAweDYwLAorCSAweEYwLCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEM3LCAweDc4LCAweDk3LCAweEYxLCAweDMyLCAweDQ0LCAweDAxLCAweDJBLCAweDAzLCAweDAwLAorCSAweDA3LCAweDYwLCAweDAxLCAweDY0LCAweDA0LCAweDAwLCAweDAyLCAweDJBLCAweDA2LCAweDAwLCAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweDIzLCAweEZBLAorCSAweENFLCAweDYwLCAweDQ0LCAweDc4LCAweEZGLCAweEZGLCAweENFLCAweDYwLCAweDM4LCAweDc4LCAweEZGLCAweEZGLCAweDBGLCAweEYwLCAweEZGLCAweEZGLAorCSAweDY0LCAweDQ0LCAweDA4LCAweDI2LCAweDM0LCAweDAwLCAweDJBLCAweEYyLCAweDYwLCAweDYzLCAweDYwLCAweDQwLCAweDAyLCAweDJCLCAweDY2LCAweDYzLAorCSAweEJFLCAweEQyLCAweDY4LCAweEYxLCAweEEzLCAweEQyLCAweEQwLCAweDgwLCAweDY3LCAweEYxLCAweDBELCAweDAyLCAweEJGLCAweEQyLCAweEQwLCAweDgwLAorCSAweDY2LCAweEYxLCAweDA5LCAweDAyLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA2LCAweDAyLCAweDI1LCAweDYwLCAweEZDLCAweDY0LCAweEU1LCAweDYwLAorCSAweDc4LCAweDQxLCAweEM3LCAweDc4LCAweDk3LCAweEYxLCAweDMyLCAweDQ0LCAweDAxLCAweDJBLCAweDAzLCAweDAwLCAweDA3LCAweDYwLCAweDAyLCAweDY0LAorCSAweDA0LCAweDAwLCAweDAyLCAweDJBLCAweDA2LCAweDAwLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweDIzLCAweEZBLCAweENFLCAweDYwLCAweDQ0LCAweDc4LAorCSAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweEIwLCAweDNBLCAweDA2LCAweDAwLCAweDAwLCAweDYwLCAweDAyLCAweDY0LAorCSAweDIzLCAweEZBLCAweENCLCAweDYwLCAweDlELCAweDc4LCAweEZGLCAweEZGLCAweENFLCAweDYwLCAweDM4LCAweDc4LCAweEZGLCAweEZGLCAweDMyLCAweDQ0LAorCSAweDAxLCAweDJBLCAweDRBLCAweDAwLCAweDI3LCAweDYwLCAweDZBLCAweDYzLCAweEJGLCAweEQzLCAweDAwLCAweDY1LCAweEI0LCAweDgxLCAweERCLCAweDgzLAorCSAweDNELCAweDAzLCAweEJGLCAweEQzLCAweEEzLCAweEQzLCAweDQwLCAweDQ4LCAweEJFLCAweEQzLCAweDQwLCAweDRBLCAweDJFLCAweEYwLCAweDQwLCAweDRDLAorCSAweEQwLCAweDgwLCAweDJELCAweEYwLCAweDA4LCAweDAyLCAweDJBLCAweDQ0LCAweEQwLCAweDgwLCAweDJDLCAweEYwLCAweDA0LCAweDAyLCAweDI4LCAweDQ0LAorCSAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDJCLCAweDAzLCAweDMxLCAweEYwLCAweDJDLCAweDQ0LCAweEQwLCAweDgwLCAweDMwLCAweEYwLCAweDA4LCAweDAyLAorCSAweDJBLCAweDQ0LCAweEQwLCAweDgwLCAweDJGLCAweEYwLCAweDA0LCAweDAyLCAweDI4LCAweDQ0LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDFFLCAweDAzLAorCSAweDM0LCAweEYwLCAweDJDLCAweDQ0LCAweEQwLCAweDgwLCAweDMzLCAweEYwLCAweDA4LCAweDAyLCAweDJBLCAweDQ0LCAweEQwLCAweDgwLCAweDMyLCAweEYwLAorCSAweDA0LCAweDAyLCAweDI4LCAweDQ0LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDExLCAweDAzLCAweDM4LCAweEYwLCAweDJDLCAweDQ0LCAweEQwLCAweDgwLAorCSAweDM3LCAweEYwLCAweDA4LCAweDAyLCAweDJBLCAweDQ0LCAweEQwLCAweDgwLCAweDM2LCAweEYwLCAweDA0LCAweDAyLCAweDI4LCAweDQ0LCAweEQwLCAweDgwLAorCSAweEZGLCAweEZGLCAweDA0LCAweDAzLCAweEZBLCAweEExLCAweDA2LCAweEEzLCAweEI3LCAweDAzLCAweEMzLCAweDAxLCAweDA3LCAweDYwLCAweDAwLCAweDY0LAorCSAweDIzLCAweEZBLCAweENFLCAweDYwLCAweDQ0LCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweDBGLCAweEYwLCAweDYwLCAweDQ1LCAweEE0LCAweDM2LAorCSAweDA4LCAweDAwLCAweDBDLCAweEI0LCAweDA0LCAweDM2LCAweDAyLCAweDAwLCAweDBDLCAweDNBLCAweDA2LCAweDAwLCAweENFLCAweDYwLCAweDM4LCAweDc4LAorCSAweEZGLCAweEZGLCAweENDLCAweDYwLCAweDM1LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweEYyLCAweDUwLCAweEYxLCAweDYwLCAweDQ3LCAweDAwLCAweDdFLAorCSAweEQwLCAweDg0LCAweDFGLCAweEE0LCAweDA2LCAweDBFLCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LAorCSAweDA3LCAweDAwLCAweEMyLCAweEE0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg3LCAweEY4LCAweEJGLAorCSAweEMwLCAweDg0LCAweEEyLCAweERCLCAweDBGLCAweEYwLCAweDY1LCAweDQwLCAweDQwLCAweDJCLCAweDE3LCAweDAwLCAweDMyLCAweDQwLCAweDA4LCAweDI2LAorCSAweDE0LCAweDAwLCAweDA3LCAweEY0LCAweDNBLCAweEYyLCAweEZGLCAweEZGLCAweDM3LCAweEI0LCAweDI2LCAweDQ2LCAweDBFLCAweDAyLCAweDJDLCAweEYyLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDA2LCAweDAwLCAweDI1LCAweDYwLCAweEY2LCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLAorCSAweEM3LCAweDc4LCAweDk3LCAweEYxLCAweENFLCAweDYwLCAweDM4LCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweDY0LCAweDQwLCAweDYwLCAweDI2LAorCSAweDAzLCAweDAwLCAweENDLCAweDYwLCAweDBELCAweDc4LCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDQwLCAweDNBLCAweEYzLCAweDAxLCAweDI1LCAweDYwLAorCSAweEVBLCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEM3LCAweDc4LCAweDk3LCAweEYxLCAweDI3LCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLAorCSAweDAxLCAweDNCLCAweDA3LCAweDAwLCAweDI1LCAweDYwLCAweEY4LCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEM3LCAweDc4LCAweDk3LCAweEYxLAorCSAweDA4LCAweDAwLCAweDAyLCAweDNCLCAweDA2LCAweDAwLCAweDI1LCAweDYwLCAweEZBLCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEM3LCAweDc4LAorCSAweDk3LCAweEYxLCAweDJBLCAweEYyLCAweDI4LCAweDQxLCAweDQwLCAweEE4LCAweDAxLCAweEIxLCAweDAyLCAweDAyLCAweDQzLCAweDAyLCAweDZELCAweDAwLAorCSAweDYwLCAweDQwLCAweDA4LCAweDJBLCAweDBGLCAweDAwLCAweDI1LCAweDYwLCAweEU4LCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEM3LCAweDc4LAorCSAweDk3LCAweEYxLCAweDFCLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDI1LCAweDYwLCAweEVFLCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLAorCSAweEQzLCAweDc4LCAweDk3LCAweEYxLCAweDBGLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDQwLCAweDI2LCAweDI4LCAweDAwLCAweDMyLCAweDQ0LAorCSAweDAyLCAweDI2LCAweDI1LCAweDAwLCAweDEwLCAweDJCLCAweDI2LCAweDAwLCAweDI3LCAweDYwLCAweDZBLCAweDYzLCAweEJGLCAweEQzLCAweDJDLCAweEYwLAorCSAweDAwLCAweEE4LCAweDYwLCAweDQxLCAweDBELCAweDAzLCAweDUwLCAweEZFLCAweEJELCAweEQzLCAweDJELCAweEYwLCAweEQwLCAweDgwLCAweEJELCAweEQzLAorCSAweDJFLCAweEYwLCAweEQwLCAweDgwLCAweEJELCAweEQzLCAweDJDLCAweEYwLCAweEQwLCAweDgwLCAweEZBLCAweEExLCAweDEwLCAweDBDLCAweEYzLCAweDAyLAorCSAweDUwLCAweEZFLCAweDYwLCAweDYwLCAweDAxLCAweDY0LCAweEQwLCAweDgwLCAweDJELCAweEYwLCAweDFELCAweDY0LCAweEQwLCAweDgwLCAweDJFLCAweEYwLAorCSAweDAxLCAweDY0LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDAzLCAweDBDLCAweENFLCAweDYwLCAweDM4LCAweDc4LCAweEZGLCAweEZGLCAweDMyLCAweDQwLAorCSAweDQwLCAweDJBLCAweDAwLCAweDAwLCAweENELCAweDYwLCAweEVFLCAweDc4LCAweEZGLCAweEZGLCAweDMyLCAweDQwLCAweDQwLCAweDI2LCAweEZBLCAweDAxLAorCSAweDJBLCAweEYwLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDA4LCAweDJBLCAweDIwLCAweDAwLCAweDMyLCAweDQwLCAweDAyLCAweDJBLCAweDFELCAweDAwLAorCSAweDAzLCAweDY3LCAweEEwLCAweDg0LCAweDAwLCAweDM3LCAweDY0LCAweDYzLCAweDYwLCAweDQwLCAweDAyLCAweDM3LCAweDVFLCAweDYzLCAweDYwLCAweDQwLAorCSAweDAxLCAweDM3LCAweDU4LCAweDYzLCAweDYwLCAweDQwLCAweDAzLCAweDM3LCAweDBELCAweDAwLCAweEJELCAweEQyLCAweDY2LCAweEYxLCAweEJELCAweEQyLAorCSAweEQwLCAweDgwLCAweDY3LCAweEYxLCAweDA3LCAweDAyLCAweEQwLCAweDgwLCAweEJELCAweEQyLCAweDY4LCAweEYxLCAweDAzLCAweDAyLCAweEQwLCAweDgwLAorCSAweEZGLCAweEZGLCAweDAzLCAweDAzLCAweENFLCAweDYwLCAweDM4LCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweDg3LCAweEY0LCAweDYwLCAweDQwLAorCSAweDAzLCAweDJCLCAweDMxLCAweDAwLCAweDg4LCAweEYzLCAweDA2LCAweDYxLCAweDYwLCAweDQzLCAweDY2LCAweDQ1LCAweDMxLCAweEYwLCAweDYzLCAweDQ2LAorCSAweDA1LCAweEYyLCAweDY1LCAweDQ2LCAweEQwLCAweDgwLCAweDMwLCAweEYwLCAweDBGLCAweDAyLCAweDYzLCAweDQ2LCAweDA0LCAweEYyLCAweDY1LCAweDQ2LAorCSAweEQwLCAweDgwLCAweDJGLCAweEYwLCAweDA5LCAweDAyLCAweDYzLCAweDQ2LCAweDAzLCAweEYyLCAweDY1LCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLAorCSAweDAzLCAweDAyLCAweEZGLCAweEZGLCAweDQ4LCAweEZFLCAweDA2LCAweDAwLCAweENELCAweDgxLCAweDAyLCAweEEzLCAweEU3LCAweDAyLCAweDg3LCAweEYxLAorCSAweDA4LCAweEZFLCAweDY0LCAweDQzLCAweDAzLCAweDAzLCAweENFLCAweDYwLCAweDM4LCAweDc4LCAweEZGLCAweEZGLCAweDQzLCAweDQzLCAweDIzLCAweDQ2LAorCSAweDA2LCAweEYwLCAweDI2LCAweDQ2LCAweDA3LCAweDY3LCAweEEwLCAweDg0LCAweDIzLCAweEZBLCAweDY0LCAweDQwLCAweDAyLCAweDI2LCAweDJCLCAweDAwLAorCSAweENFLCAweDYwLCAweDM4LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDFCLCAweDMxLCAweEYyLCAweDE1LCAweDYwLCAweDAyLCAweDY1LCAweDYwLCAweDQ3LAorCSAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLCAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LAorCSAweDYxLCAweDQ2LCAweDMxLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDMwLCAweEYwLAorCSAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLCAweDYxLCAweDQ2LCAweDJGLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLAorCSAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweDg3LCAweEYzLCAweDA4LCAweEZFLAorCSAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDQzLCAweDQzLCAweDA3LCAweEZDLCAweDQzLCAweDQzLCAweDFELCAweEYwLCAweEMwLCAweDY0LCAweEMwLCAweDg0LAorCSAweDBBLCAweDYwLCAweDdCLCAweEYxLCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEMwLCAweDg0LAorCSAweEEyLCAweERCLCAweDYzLCAweDQ1LCAweDJBLCAweEYyLCAweDM1LCAweEYwLCAweDYwLCAweDQwLCAweEE0LCAweDM2LCAweDBCLCAweDAwLCAweDA4LCAweDJCLAorCSAweDBDLCAweDAwLCAweDIzLCAweDQ2LCAweDI2LCAweEYyLCAweDI2LCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA2LCAweDAyLCAweENFLCAweDYwLAorCSAweDM4LCAweDc4LCAweEZGLCAweEZGLCAweENELCAweDYwLCAweEVFLCAweDc4LCAweEZGLCAweEZGLCAweDIzLCAweDQ2LCAweDIyLCAweEYyLCAweDI2LCAweDQ2LAorCSAweDQ0LCAweDRDLCAweDBGLCAweDI2LCAweDE5LCAweDAwLCAweDAwLCAweEJDLCAweDQwLCAweDQ1LCAweDBCLCAweDAzLCAweDAwLCAweDY0LCAweDIzLCAweDQ2LAorCSAweDIyLCAweEZBLCAweDI2LCAweDQ2LCAweEEyLCAweEZGLCAweEI2LCAweDYwLCAweDU4LCAweDRFLCAweDcyLCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweEZGLAorCSAweDI2LCAweDQ2LCAweDJBLCAweEYwLCAweDJDLCAweDQ0LCAweDY0LCAweDQwLCAweDA0LCAweDI3LCAweDA2LCAweDAwLCAweDIzLCAweDQ2LCAweDI2LCAweEZBLAorCSAweDI2LCAweDQ2LCAweENELCAweDYwLCAweEE1LCAweDc4LCAweEZGLCAweEZGLCAweDNGLCAweEYyLCAweDAyLCAweEZBLCAweEEyLCAweEZGLCAweDE2LCAweEYwLAorCSAweEZGLCAweEZGLCAweDY0LCAweDQ0LCAweDAxLCAweDI2LCAweERDLCAweDlDLCAweDkyLCAweEYzLCAweDJBLCAweEYyLCAweERDLCAweDgzLCAweDkyLCAweEZELAorCSAweDA2LCAweEY0LCAweDAxLCAweEY4LCAweDI2LCAweDQ2LCAweDYwLCAweDQwLCAweDQwLCAweDJCLCAweDE4LCAweDAwLCAweDY0LCAweDQ0LCAweDAwLCAweDY1LAorCSAweEZGLCAweEI0LCAweEZDLCAweEE0LCAweDA2LCAweEYwLCAweDAzLCAweDAzLCAweDY0LCAweDQ2LCAweDBDLCAweDBELCAweDAyLCAweDY1LCAweDI2LCAweDQ2LAorCSAweDAwLCAweEYyLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDAyLCAweDAzLCAweDYwLCAweDQ2LCAweEY5LCAweDAxLCAweDAxLCAweEYyLAorCSAweEZGLCAweEZGLCAweEQ0LCAweDg0LCAweDAxLCAweEZBLCAweDY2LCAweDQ0LCAweDI2LCAweDQ2LCAweDA2LCAweEZBLCAweDA2LCAweEY0LCAweDAwLCAweEYyLAorCSAweDgwLCAweEZDLCAweDQwLCAweDQ1LCAweEI2LCAweDYwLCAweDU4LCAweDRFLCAweDcyLCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweEZGLCAweDI2LCAweDQ2LAorCSAweDJDLCAweDQ0LCAweDBGLCAweDI2LCAweDBGLCAweDAwLCAweDIzLCAweDQ2LCAweDI2LCAweEZBLCAweDI2LCAweDQ0LCAweDIyLCAweEZBLCAweDI2LCAweDQ2LAorCSAweDAwLCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDI2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLAorCSAweDJCLCAweEZGLCAweDZFLCAweDAwLCAweEEzLCAweDQ2LCAweDI2LCAweEYyLCAweDYwLCAweDQ1LCAweERDLCAweDg0LCAweEQ0LCAweDgwLCAweDI2LCAweEZBLAorCSAweEEzLCAweDQ2LCAweDZCLCAweDAyLCAweDJBLCAweEYwLCAweEEzLCAweDQ2LCAweDIyLCAweEYyLCAweEEzLCAweDQ2LCAweDAwLCAweEJDLCAweDAwLCAweEYyLAorCSAweDAxLCAweDAyLCAweDYzLCAweDAwLCAweDQ0LCAweDRDLCAweDNGLCAweEYwLCAweDYwLCAweDQzLCAweDIzLCAweDQ2LCAweDIyLCAweEY0LCAweDA5LCAweDYwLAorCSAweDAwLCAweDY1LCAweDNGLCAweEYyLCAweDI2LCAweDQ2LCAweEMwLCAweDg0LCAweEQ0LCAweDgwLCAweDYwLCAweDQ1LCAweDU2LCAweDA3LCAweDgwLCAweEZDLAorCSAweDFCLCAweEYyLCAweDA2LCAweEYyLCAweDYwLCAweDQxLCAweDIzLCAweDQ2LCAweDIyLCAweEY0LCAweDFCLCAweEYwLCAweDA2LCAweEYwLCAweEMxLCAweDgxLAorCSAweDA2LCAweEZBLCAweDA1LCAweEZBLCAweDlCLCAweEZBLCAweDY1LCAweDQ0LCAweDNGLCAweEZBLCAweDY0LCAweDQ2LCAweDAwLCAweEZDLCAweDYzLCAweDQ2LAorCSAweDAxLCAweEYyLCAweDEwLCAweDYxLCAweEYyLCAweEE0LCAweDAxLCAweEZBLCAweEM4LCAweDgzLCAweDAyLCAweDY0LCAweDU5LCAweEQwLCAweDU4LCAweEQ4LAorCSAweEZELCAweDFGLCAweDA2LCAweDQ1LCAweDAwLCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDI1LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEEyLCAweEZGLCAweDAwLCAweEY0LCAweDAxLCAweEYwLCAweDBBLCAweDE4LCAweDcwLCAweDY3LAorCSAweEEwLCAweDgwLCAweEYwLCAweDY3LCAweDA2LCAweDAzLCAweEMwLCAweDg0LCAweDAxLCAweEZBLCAweDI1LCAweDQ2LCAweDI1LCAweDQ0LCAweDgwLCAweEZDLAorCSAweDA1LCAweEZBLCAweEI2LCAweDYwLCAweDU4LCAweDRFLCAweDcyLCAweDc4LCAweEZGLCAweEZGLCAweEQ0LCAweEZFLCAweEEzLCAweEZGLCAweDJDLCAweDQ0LAorCSAweDA0LCAweDI3LCAweDE2LCAweDAwLCAweDIzLCAweDQ2LCAweDIyLCAweEYyLCAweEEyLCAweEZDLCAweDYwLCAweDQ2LCAweDQ2LCAweDQ2LCAweDNGLCAweEYyLAorCSAweDAwLCAweEY0LCAweDYwLCAweDQ3LCAweDA4LCAweEZBLCAweDI2LCAweDQ2LCAweDJDLCAweDQzLCAweDJBLCAweEZDLCAweDA2LCAweEY0LCAweDAwLCAweDY0LAorCSAweDAwLCAweEZBLCAweDAxLCAweEYwLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweDAxLCAweEZBLCAweDI2LCAweDQ2LCAweDFELCAweDAwLAorCSAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweENBLCAweDYwLCAweDgxLCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweDQ2LCAweDIyLCAweEYwLCAweEEyLCAweEZDLAorCSAweDAwLCAweDYzLCAweDMzLCAweDg1LCAweEEzLCAweDQ2LCAweDBELCAweDAzLCAweEEzLCAweDQ2LCAweDI2LCAweEYyLCAweDBGLCAweDY1LCAweEE0LCAweDg1LAorCSAweEQ0LCAweDg0LCAweDI2LCAweEZBLCAweEEzLCAweDQ2LCAweEEyLCAweEZGLCAweEI2LCAweDYwLCAweDU4LCAweDRFLCAweDcyLCAweDc4LCAweEZGLCAweEZGLAorCSAweEEzLCAweEZGLCAweDI2LCAweDQ2LCAweENFLCAweDYwLCAweDM4LCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweDMyLCAweEYwLCAweDYwLCAweDQwLAorCSAweDA4LCAweDJBLCAweDI0LCAweDAwLCAweDAxLCAweDJCLCAweDEzLCAweDAwLCAweDY0LCAweDQwLCAweDAxLCAweDJBLCAweDEwLCAweDAwLCAweDI1LCAweDYwLAorCSAweEU4LCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEM3LCAweDc4LCAweDk3LCAweEYxLCAweDFCLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LAorCSAweDI1LCAweDYwLCAweEVFLCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEQzLCAweDc4LCAweDk3LCAweEYxLCAweDBGLCAweDAwLCAweDI1LCAweDYwLAorCSAweEU2LCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEM3LCAweDc4LCAweDk3LCAweEYxLCAweDFCLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LAorCSAweDI1LCAweDYwLCAweEVDLCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEQzLCAweDc4LCAweDk3LCAweEYxLCAweDA3LCAweEY0LCAweEZGLCAweEZGLAorCSAweDI2LCAweEYyLCAweDI2LCAweDQ2LCAweDBGLCAweEI0LCAweERDLCAweDg1LCAweDI1LCAweDYwLCAweEVBLCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLAorCSAweEQzLCAweDc4LCAweDk3LCAweEYxLCAweDI3LCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDNCLCAweDA3LCAweDAwLCAweDI1LCAweDYwLAorCSAweEY4LCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEM3LCAweDc4LCAweDk3LCAweEYxLCAweDA4LCAweDAwLCAweDAyLCAweDNCLCAweDA2LCAweDAwLAorCSAweDI1LCAweDYwLCAweEZBLCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEM3LCAweDc4LCAweDk3LCAweEYxLCAweDA3LCAweEYyLCAweDI2LCAweEYwLAorCSAweDQxLCAweDE4LCAweDYwLCAweDQ2LCAweEZGLCAweDY3LCAweDIwLCAweDg4LCAweDY0LCAweDVGLCAweDQwLCAweDRBLCAweDE1LCAweEYwLCAweDI4LCAweDQ0LAorCSAweEQwLCAweDg0LCAweDAzLCAweEE0LCAweDAzLCAweDBFLCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDA0LCAweDAwLCAweEZBLCAweEE0LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg3LCAweEMwLCAweEJGLCAweEMwLCAweDg0LCAweDE1LCAweEZBLCAweDQwLCAweDQ4LCAweDE0LCAweEYwLCAweDJBLCAweDQ0LCAweEQwLCAweDg0LAorCSAweDFGLCAweEE0LCAweDA2LCAweDBFLCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDA3LCAweDAwLAorCSAweEMyLCAweEE0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg3LCAweEY4LCAweEJGLCAweEMwLCAweDg0LAorCSAweDE0LCAweEZBLCAweDJCLCAweDYwLCAweEVDLCAweDYzLCAweEJELCAweERCLCAweDYwLCAweDVDLCAweDJGLCAweDY3LCAweEQwLCAweDgwLCAweDYwLCAweDQ1LAorCSAweDAyLCAweDI4LCAweDY0LCAweDQ1LCAweDI4LCAweDVDLCAweEJELCAweEQ5LCAweDhCLCAweDY3LCAweEQwLCAweDgwLCAweDYwLCAweDQxLCAweDAyLCAweDI0LAorCSAweDY0LCAweDQxLCAweEQ1LCAweDg0LCAweDgwLCAweDY1LCAweEM0LCAweDg3LCAweDAxLCAweDA1LCAweDAwLCAweDY0LCAweEZGLCAweEI0LCAweDBFLCAweEZBLAorCSAweEEzLCAweERCLCAweDI2LCAweDQ2LCAweENFLCAweDYwLCAweDdGLCAweDc4LCAweEZGLCAweEZGLCAweENBLCAweDYwLCAweDgxLCAweDc4LCAweEZGLCAweEZGLAorCSAweDFGLCAweDYwLCAweDIwLCAweDY0LCAweDQwLCAweDRCLCAweEY2LCAweDYwLCAweDU4LCAweDRELCAweEIzLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY2LAorCSAweDQ2LCAweDQ2LCAweENBLCAweDYwLCAweDgxLCAweDc4LCAweEZGLCAweEZGLCAweDFGLCAweDYwLCAweDA0LCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLAorCSAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEY4LCAweEZFLCAweDAwLCAweDY2LAorCSAweDQ2LCAweDQ2LCAweENBLCAweDYwLCAweDgxLCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweDU4LCAweDYzLCAweDYwLCAweDQ3LCAweDAxLCAweDI3LAorCSAweDY0LCAweDYzLCAweDYxLCAweDVDLCAweDE4LCAweDYwLCAweDBGLCAweEY5LCAweEJELCAweEQwLCAweEJELCAweEQwLCAweDY0LCAweDQ1LCAweDY0LCAweDQxLAorCSAweEJELCAweEQwLCAweDAwLCAweEY0LCAweDA0LCAweEY4LCAweDgzLCAweEZBLCAweDgyLCAweEY4LCAweEE2LCAweDQ2LCAweDAyLCAweEIwLCAweDVFLCAweDYzLAorCSAweDA0LCAweDAzLCAweDY0LCAweDYzLCAweDAzLCAweEIwLCAweDAyLCAweDNBLCAweDZDLCAweDYzLCAweDNGLCAweEYyLCAweEJELCAweEQwLCAweEJELCAweEQwLAorCSAweDY0LCAweDQ1LCAweDY0LCAweDQxLCAweEJELCAweEQwLCAweEE2LCAweDQ2LCAweDA3LCAweEY4LCAweDg2LCAweEZBLCAweDg1LCAweEY4LCAweDYwLCAweDQ3LAorCSAweDA4LCAweEZBLCAweDE4LCAweDYwLCAweDBGLCAweEYxLCAweDI2LCAweDQ2LCAweDY0LCAweDQxLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDJBLCAweEYyLAorCSAweDJDLCAweEYwLCAweDMxLCAweDQwLCAweDIwLCAweDI2LCAweDA5LCAweDAwLCAweDYwLCAweDQwLCAweEE0LCAweDM2LCAweDIxLCAweDAwLCAweDA4LCAweDI2LAorCSAweDA3LCAweDAwLCAweDdELCAweEYxLCAweENGLCAweDYwLCAweDQ3LCAweDc4LCAweEZGLCAweEZGLCAweENGLCAweDYwLCAweDc3LCAweDc4LCAweEZGLCAweEZGLAorCSAweDY0LCAweDQwLCAweDAxLCAweDI2LCAweDEyLCAweDAwLCAweDNGLCAweEYwLCAweDMyLCAweDQwLCAweDEwLCAweDJBLCAweDBBLCAweDAwLCAweDY0LCAweDQxLAorCSAweDYwLCAweDQwLCAweDQwLCAweDI3LCAweDA2LCAweDAwLCAweENELCAweDgxLCAweERELCAweDgxLCAweDAzLCAweDAzLCAweDAyLCAweDAzLCAweDAxLCAweDYxLAorCSAweDAxLCAweDAwLCAweDAwLCAweDYxLCAweDYwLCAweDQwLCAweDE4LCAweDNBLCAweDAzLCAweDAwLCAweENGLCAweDYwLCAweEM5LCAweDc4LCAweEZGLCAweEZGLAorCSAweDA3LCAweEYyLCAweDg3LCAweEYxLCAweDY2LCAweDQ1LCAweEQwLCAweDgwLCAweDYwLCAweDQ2LCAweDA2LCAweEYyLCAweDY1LCAweDQ2LCAweDAzLCAweDAzLAorCSAweEZGLCAweEZGLCAweDAyLCAweDI2LCAweDA3LCAweDAwLCAweERELCAweDYwLCAweDU4LCAweDRGLCAweDkwLCAweDc4LCAweEZGLCAweEZGLCAweENGLCAweDYwLAorCSAweEM1LCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweEE0LCAweDNBLCAweDA3LCAweDAwLCAweERGLCAweDYwLAorCSAweDU4LCAweDRGLCAweEUzLCAweDc4LCAweEZGLCAweEZGLCAweENGLCAweDYwLCAweEM1LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweENFLCAweDYwLAorCSAweDU4LCAweDRGLCAweDU0LCAweDc4LCAweEZGLCAweEZGLCAweDNGLCAweEYyLCAweDA2LCAweDY1LCAweEQ0LCAweDgwLCAweDYwLCAweDQzLCAweDVCLCAweDA0LAorCSAweDAwLCAweEY0LCAweEFBLCAweDYwLCAweEFBLCAweDY1LCAweDA5LCAweEYyLCAweDBBLCAweEYwLCAweEQ0LCAweDgwLCAweDAzLCAweDY0LCAweDUzLCAweDAyLAorCSAweEQwLCAweDgwLCAweDAwLCAweDY0LCAweDBCLCAweEYwLCAweDRGLCAweDAyLCAweDY0LCAweDQ1LCAweEQ0LCAweDgwLCAweEY4LCAweDdGLCAweDA4LCAweDAyLAorCSAweDBDLCAweEYwLCAweDI2LCAweDQ2LCAweDY0LCAweDQ1LCAweDIzLCAweEYwLCAweDIwLCAweDY3LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDBCLCAweDAwLAorCSAweEQ0LCAweDgwLCAweDFELCAweDYwLCAweDYwLCAweDY0LCAweDExLCAweDAyLCAweDBDLCAweEYwLCAweDI2LCAweDQ2LCAweDY0LCAweDQ1LCAweDIzLCAweEYwLAorCSAweDQwLCAweDY3LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDY1LCAweDQ0LCAweDg4LCAweDNBLCAweDM1LCAweDAwLCAweDc3LCAweDM3LCAweDAzLCAweDAwLAorCSAweDc4LCAweDM3LCAweDAxLCAweDAwLCAweDhFLCAweDM3LCAweDAwLCAweDYxLCAweDJFLCAweDAwLCAweEQ0LCAweDgwLCAweDA4LCAweDY1LCAweDJCLCAweDAyLAorCSAweEQ3LCAweDgwLCAweDAxLCAweDYwLCAweDAwLCAweDY0LCAweDBDLCAweEYwLCAweDI2LCAweDA0LCAweEQwLCAweDgwLCAweDBELCAweEYwLCAweDIzLCAweDAyLAorCSAweDI2LCAweDQ2LCAweDE0LCAweEYyLCAweDAxLCAweDYzLCAweDAyLCAweEE4LCAweDY0LCAweDQ3LCAweDFELCAweDAzLCAweDdGLCAweEI0LCAweEZELCAweEEwLAorCSAweDA2LCAweDAzLCAweDE5LCAweDA3LCAweDIzLCAweEYwLCAweDYwLCAweDY3LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDZCLCAweDAwLCAweDI2LCAweDQ2LAorCSAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA4LCAweDJBLCAweDA3LCAweDAwLCAweDYwLCAweDQwLCAweDQ4LCAweDM2LCAweDA0LCAweDAwLAorCSAweEQyLCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEJDLCAweEQyLCAweEZCLCAweEU4LCAweDYwLCAweDU4LCAweDRGLCAweEVGLCAweDc4LCAweEZGLCAweEZGLAorCSAweENGLCAweDYwLCAweEM1LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDYxLCAweDQwLCAweDAxLCAweDJBLCAweDA5LCAweDAwLCAweDI1LCAweDYwLAorCSAweEZFLCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEM3LCAweDc4LCAweDk3LCAweEYxLCAweENGLCAweDYwLCAweEM5LCAweDc4LCAweEZGLCAweEZGLAorCSAweERGLCAweDYwLCAweDU4LCAweDRGLCAweEUzLCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDQ4LCAweDM2LAorCSAweDg4LCAweDAwLCAweENGLCAweDYwLCAweEQ2LCAweDc4LCAweEZGLCAweEZGLCAweENGLCAweDYwLCAweEM1LCAweDc4LCAweEZGLCAweEZGLCAweDYwLCAweDQwLAorCSAweDBDLCAweDI2LCAweDdGLCAweDAwLCAweDY0LCAweDQwLCAweDAxLCAweDJBLCAweDdDLCAweDAwLCAweEIwLCAweDNBLCAweDA1LCAweDAwLCAweEQ0LCAweDYwLAorCSAweDU4LCAweDRGLCAweDVBLCAweDc4LCAweEZGLCAweEZGLCAweDcxLCAweDAwLCAweDAwLCAweDNBLCAweDA1LCAweDAwLCAweEQ3LCAweDYwLCAweDU4LCAweDRGLAorCSAweENBLCAweDc4LCAweEZGLCAweEZGLCAweDZBLCAweDAwLCAweDIwLCAweDNBLCAweDA1LCAweDAwLCAweEQ3LCAweDYwLCAweDU4LCAweDRGLCAweENBLCAweDc4LAorCSAweEZGLCAweEZGLCAweDYzLCAweDAwLCAweEMwLCAweDNBLCAweDA1LCAweDAwLCAweERDLCAweDYwLCAweDU4LCAweDRGLCAweEZFLCAweDc4LCAweEZGLCAweEZGLAorCSAweDVDLCAweDAwLCAweEEwLCAweDNBLCAweDA1LCAweDAwLCAweERELCAweDYwLCAweDU4LCAweDRGLCAweDVCLCAweDc4LCAweEZGLCAweEZGLCAweDU1LCAweDAwLAorCSAweDQwLCAweDNBLCAweDBELCAweDAwLCAweEUzLCAweDYwLCAweDU4LCAweDRGLCAweEMzLCAweDc4LCAweEZGLCAweEZGLCAweDRFLCAweDAwLCAweDYwLCAweDQwLAorCSAweDUwLCAweDNBLCAweDA1LCAweDAwLCAweEVELCAweDYwLCAweDU4LCAweDRGLCAweEVCLCAweDc4LCAweEZGLCAweEZGLCAweDQ2LCAweDAwLCAweENGLCAweDYwLAorCSAweEM5LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA4LCAweDJBLCAweDA3LCAweDAwLAorCSAweDYwLCAweDQwLCAweDQ4LCAweDM2LCAweDA0LCAweDAwLCAweEQyLCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEJDLCAweEQyLCAweEZCLCAweDJBLCAweEYyLAorCSAweDNCLCAweEYwLCAweDYwLCAweDQwLCAweDQwLCAweDJCLCAweDA0LCAweDAwLCAweDY0LCAweDQwLCAweDIwLCAweDJCLCAweDAxLCAweDAwLCAweDAzLCAweDAwLAorCSAweENGLCAweDYwLCAweEI5LCAweDc4LCAweEZGLCAweEZGLCAweDIyLCAweEYyLCAweEZGLCAweEZGLCAweDA0LCAweEI0LCAweEZGLCAweEZGLCAweEY4LCAweDAzLAorCSAweDIzLCAweEYyLCAweDA3LCAweEY0LCAweEJCLCAweEYwLCAweDI2LCAweDQ2LCAweEE0LCAweDg0LCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDJGLCAweDI2LAorCSAweDIwLCAweDAwLCAweEM5LCAweDYwLCAweDU4LCAweDRGLCAweENGLCAweDc4LCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDE4LCAweDM2LCAweDA5LCAweDAwLAorCSAweDA0LCAweDY1LCAweEU1LCAweDYwLCAweDU4LCAweDRFLCAweDI3LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweENGLCAweDYwLCAweEM5LCAweDc4LAorCSAweEZGLCAweEZGLCAweDFGLCAweDYwLCAweDA0LCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDI2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEY4LCAweEZFLCAweDBDLCAweDAwLCAweDY2LCAweDQ0LCAweDAwLCAweEE4LCAweEZGLCAweEZGLAorCSAweDBBLCAweDAzLCAweDI2LCAweDQ2LCAweDFGLCAweDYwLCAweDIwLCAweDY0LCAweDQwLCAweDRCLCAweEY2LCAweDYwLCAweDU4LCAweDRELCAweEIzLCAweDc4LAorCSAweEZGLCAweEZGLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweENFLCAweDYwLCAweDM1LCAweDc4LCAweEZGLCAweEZGLCAweDE0LCAweEYyLCAweDAwLCAweDdDLAorCSAweDNFLCAweEY4LCAweENDLCAweDg0LCAweENDLCAweDg0LCAweDE4LCAweDAzLCAweDVDLCAweDAyLCAweDExLCAweEYyLCAweDA3LCAweEZBLCAweEFCLCAweEYzLAorCSAweDE5LCAweEZBLCAweEQwLCAweDYwLCAweDU4LCAweDRFLCAweDg2LCAweDc4LCAweEZGLCAweEZGLCAweDFFLCAweDYwLCAweEUwLCAweDY0LCAweDBGLCAweDYwLAorCSAweDkwLCAweEZCLCAweDI2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEM4LCAweEZFLAorCSAweEYyLCAweDY0LCAweDNCLCAweDQyLCAweDRBLCAweERCLCAweDhELCAweDAwLCAweEEyLCAweEZGLCAweDQ2LCAweDQ1LCAweEI2LCAweDYwLCAweDU4LCAweDRFLAorCSAweEJCLCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweEZGLCAweDExLCAweDAzLCAweDdFLCAweDYzLCAweDQ2LCAweDRCLCAweDI1LCAweDQ2LCAweEEzLCAweEQwLAorCSAweDJCLCAweDQ2LCAweEEzLCAweEQ4LCAweEZCLCAweDFGLCAweDg5LCAweEZDLCAweDhBLCAweEZDLCAweDg4LCAweEZDLCAweDA1LCAweDE4LCAweDY0LCAweDQ2LAorCSAweDAxLCAweEYwLCAweDEwLCAweDY3LCAweEMwLCAweDg0LCAweDAxLCAweEZBLCAweDA4LCAweEZFLCAweDJCLCAweDQ2LCAweDQ2LCAweDQ2LCAweDI1LCAweDQ2LAorCSAweEQwLCAweDYwLCAweDU4LCAweDRFLCAweDg2LCAweDc4LCAweEZGLCAweEZGLCAweDEzLCAweDYwLCAweDQzLCAweEYzLCAweDg3LCAweEYzLCAweDAwLCAweEE4LAorCSAweDA3LCAweEZBLCAweDBFLCAweDAzLCAweDFFLCAweDYwLCAweERBLCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDI1LCAweDQ0LCAweDVBLCAweERCLAorCSAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEYzLCAweDY0LCAweDNCLCAweDQyLCAweDRBLCAweERCLCAweDBELCAweDAwLAorCSAweDFFLCAweDYwLCAweENFLCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDI1LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLAorCSAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEY0LCAweDY0LCAweDNCLCAweDQyLCAweDRBLCAweERCLCAweDI2LCAweDQ0LCAweDAwLCAweEE4LCAweEMxLCAweEZFLAorCSAweDQ4LCAweDAzLCAweDI2LCAweDQ2LCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA4LCAweDJBLCAweDA3LCAweDAwLCAweDYwLCAweDQwLAorCSAweDQ4LCAweDM2LCAweDA0LCAweDAwLCAweEQyLCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEJDLCAweEQyLCAweEZCLCAweDI2LCAweDQ2LCAweDJBLCAweEYyLAorCSAweDNCLCAweEYwLCAweDYwLCAweDQwLCAweDQwLCAweDJCLCAweDA2LCAweDAwLCAweEMwLCAweDYwLCAweDAwLCAweDY0LCAweDY0LCAweDQwLCAweDIwLCAweDJCLAorCSAweDAxLCAweDAwLCAweDAzLCAweDAwLCAweEQwLCAweDYwLCAweDczLCAweDc4LCAweEZGLCAweEZGLCAweDIyLCAweEYyLCAweEZGLCAweEZGLCAweDA0LCAweEI0LAorCSAweEZGLCAweEZGLCAweEY4LCAweDAzLCAweDIzLCAweEYyLCAweDA3LCAweEY0LCAweEJCLCAweEYwLCAweDI2LCAweDQ2LCAweEE0LCAweDg0LCAweEZGLCAweEZGLAorCSAweDYwLCAweDQwLCAweDJGLCAweDI2LCAweDA3LCAweDAwLCAweEM5LCAweDYwLCAweDU4LCAweDRGLCAweENGLCAweDc4LCAweEZGLCAweEZGLCAweDY0LCAweDQwLAorCSAweDE4LCAweDM2LCAweDA5LCAweDAwLCAweDA0LCAweDY1LCAweEU1LCAweDYwLCAweDU4LCAweDRFLCAweDI3LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LAorCSAweENGLCAweDYwLCAweEM5LCAweDc4LCAweEZGLCAweEZGLCAweDFGLCAweDYwLCAweDA0LCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDI2LCAweDQ0LAorCSAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEY4LCAweEZFLCAweEYxLCAweDY0LCAweDNCLCAweDQyLAorCSAweDRBLCAweERCLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweENGLCAweDYwLCAweEM1LCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweDgyLCAweDYwLAorCSAweEZGLCAweDY1LCAweEE0LCAweDg3LCAweDAyLCAweEJGLCAweDJBLCAweEZBLCAweDFDLCAweEYyLCAweDEzLCAweEZBLCAweDMyLCAweEYyLCAweDJDLCAweEZBLAorCSAweDMzLCAweEYyLCAweDJELCAweEZBLCAweDM0LCAweEYyLCAweDJFLCAweEZBLCAweDJGLCAweEYyLCAweDMyLCAweEZBLCAweDMwLCAweEYyLCAweDMzLCAweEZBLAorCSAweDMxLCAweEYyLCAweDM0LCAweEZBLCAweDY2LCAweEYzLCAweDJGLCAweEZBLCAweDY3LCAweEYzLCAweDMwLCAweEZBLCAweDY4LCAweEYzLCAweDMxLCAweEZBLAorCSAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweEQzLCAweDYwLCAweDU5LCAweDY0LCAweDA4LCAweDYwLCAweDI2LCAweEZCLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweEIxLCAweEYzLCAweDEyLCAweDYwLCAweDJDLCAweDYzLCAweEY3LCAweEEwLCAweEZGLCAweEZGLCAweDAyLCAweDA2LCAweDAwLCAweDY0LCAweEIxLCAweEZCLAorCSAweEIxLCAweEYzLCAweEIxLCAweEZCLCAweDAxLCAweEE0LCAweENDLCAweDg0LCAweEZGLCAweEZGLCAweDAyLCAweDAzLCAweDJBLCAweEEzLCAweEZCLCAweDAxLAorCSAweDYzLCAweDQ2LCAweDEwLCAweDYwLCAweEE2LCAweDYzLCAweDBFLCAweDYxLCAweDYwLCAweEZFLCAweEE2LCAweEQxLCAweERFLCAweDg2LCAweDAxLCAweDY0LAorCSAweDY0LCAweDQwLCAweDdGLCAweDM2LCAweDAwLCAweDY0LCAweEEzLCAweERCLCAweERCLCAweDgzLCAweEEzLCAweEQ5LCAweENELCAweDgxLCAweDA0LCAweEEzLAorCSAweEY0LCAweDAyLCAweDExLCAweDYwLCAweDE2LCAweDYzLCAweDFDLCAweDYxLCAweEE2LCAweEQxLCAweERFLCAweDg2LCAweDAxLCAweDY0LCAweDY0LCAweDQwLAorCSAweDdGLCAweDM2LCAweDAwLCAweDY0LCAweEEzLCAweERCLCAweERCLCAweDgzLCAweEEzLCAweEQ5LCAweENELCAweDgxLCAweDA2LCAweEEzLCAweEY0LCAweDAyLAorCSAweDIwLCAweEZFLCAweDEzLCAweDYwLCAweDdGLCAweEYzLCAweDEzLCAweDYwLCAweDJELCAweEZCLCAweDFFLCAweDYzLCAweDI2LCAweDYwLCAweDY0LCAweDYxLAorCSAweDI3LCAweDYwLCAweDA4LCAweDY0LCAweDU4LCAweEQxLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDEzLCAweDYwLCAweDk1LCAweEYzLCAweDEzLCAweDYwLAorCSAweDQzLCAweEZCLCAweDEzLCAweDYwLCAweDk2LCAweEYzLCAweDEzLCAweDYwLCAweDQ0LCAweEZCLCAweDEzLCAweDYwLCAweDlDLCAweEYzLCAweDEzLCAweDYwLAorCSAweDRBLCAweEZCLCAweDEzLCAweDYwLCAweDlELCAweEYzLCAweDEzLCAweDYwLCAweDRCLCAweEZCLCAweDEzLCAweDYwLCAweDlFLCAweEYzLCAweDEzLCAweDYwLAorCSAweDRDLCAweEZCLCAweDEzLCAweDYwLCAweDlGLCAweEYzLCAweDEzLCAweDYwLCAweDRELCAweEZCLCAweDEzLCAweDYwLCAweDk3LCAweEYzLCAweDEzLCAweDYwLAorCSAweDQ1LCAweEZCLCAweDEzLCAweDYwLCAweDk4LCAweEYzLCAweDEzLCAweDYwLCAweDQ2LCAweEZCLCAweDEzLCAweDYwLCAweDk5LCAweEYzLCAweDEzLCAweDYwLAorCSAweDQ3LCAweEZCLCAweDI2LCAweDYwLCAweEIwLCAweDYzLCAweEJELCAweEQxLCAweENCLCAweEY5LCAweDY2LCAweEY5LCAweEJELCAweEQxLCAweENDLCAweEY5LAorCSAweDY3LCAweEY5LCAweEEzLCAweEQxLCAweENELCAweEY5LCAweDY4LCAweEY5LCAweDAxLCAweDY0LCAweDZBLCAweEZCLCAweDEzLCAweDYwLCAweDUxLCAweEYzLAorCSAweEM0LCAweEZCLCAweDAwLCAweDYzLCAweDRBLCAweEZELCAweDVBLCAweEZELCAweDZCLCAweEZELCAweDZDLCAweEZELCAweDEzLCAweDYwLCAweDQ1LCAweEYzLAorCSAweDE1LCAweDYwLCAweENCLCAweEYxLCAweEZGLCAweDYwLCAweEU3LCAweDY1LCAweDMyLCAweDQxLCAweEE1LCAweDgxLCAweEZGLCAweEEwLCAweEZGLCAweEZGLAorCSAweDAxLCAweDAzLCAweDA2LCAweDAwLCAweDEzLCAweDYwLCAweDQ3LCAweEYzLCAweDA4LCAweEI5LCAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDEwLCAweEI5LAorCSAweDQxLCAweDUyLCAweDg3LCAweEY1LCAweDMyLCAweDQ0LCAweDEwLCAweEIwLCAweEZGLCAweEZGLCAweDBBLCAweDAzLCAweDE0LCAweDYwLCAweDE1LCAweEYzLAorCSAweDA2LCAweEYwLCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDgwLCAweEJGLCAweEIwLCAweDg0LCAweDA2LCAweEZBLAorCSAweDEzLCAweDYwLCAweDQ1LCAweEYzLCAweDIyLCAweDdDLCAweEZGLCAweEEwLCAweEZELCAweEEwLCAweDA1LCAweDA2LCAweDAzLCAweDAzLCAweEZFLCAweEEwLAorCSAweDA0LCAweDdDLCAweDAxLCAweDAyLCAweDNBLCAweEY4LCAweDEzLCAweDYwLCAweDRDLCAweEYxLCAweDIwLCAweDQ0LCAweDIwLCAweEI1LCAweDY0LCAweDQxLAorCSAweDAwLCAweEI5LCAweEQ0LCAweDg0LCAweDA4LCAweDI4LCAweDIwLCAweEJDLCAweDQwLCAweDQwLCAweDE1LCAweDYwLCAweENCLCAweEYzLCAweDMwLCAweDYwLAorCSAweDBFLCAweDYzLCAweEYwLCAweDg0LCAweEYwLCAweDg0LCAweEYwLCAweDg0LCAweDAyLCAweEI1LCAweEYwLCAweDg0LCAweEYwLCAweDg0LCAweDAzLCAweEI0LAorCSAweDY1LCAweDVDLCAweEEzLCAweEQ5LCAweDAyLCAweEE4LCAweDE4LCAweDYwLCAweDA4LCAweEZCLCAweDE1LCAweDAyLCAweDAwLCAweDYwLCAweEM4LCAweDY0LAorCSAweDE4LCAweDYwLCAweDA5LCAweEZCLCAweDE4LCAweDYwLCAweDBELCAweEZCLCAweDA3LCAweDYwLCAweEQwLCAweDY0LCAweDE4LCAweDYwLCAweDBBLCAweEZCLAorCSAweDE4LCAweDYwLCAweDBFLCAweEZCLCAweDAxLCAweDYwLCAweDkwLCAweDY0LCAweDE4LCAweDYwLCAweDBCLCAweEZCLCAweDAwLCAweDYwLCAweDY0LCAweDY0LAorCSAweDE4LCAweDYwLCAweDBDLCAweEZCLCAweDA2LCAweDAwLCAweDY0LCAweDY0LCAweDE4LCAweDYwLCAweDBCLCAweEZCLCAweDY0LCAweDY0LCAweDE4LCAweDYwLAorCSAweDBDLCAweEZCLCAweEIxLCAweEYxLCAweDEwLCAweDYwLCAweEEwLCAweDYzLCAweDJGLCAweDE4LCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDEyLCAweDAwLAorCSAweENDLCAweDg0LCAweDA2LCAweEEzLCAweEZELCAweDAyLCAweEEzLCAweEQzLCAweDEwLCAweDYwLCAweEE2LCAweDYzLCAweDI1LCAweDFCLCAweDEwLCAweDYwLAorCSAweEY4LCAweDY1LCAweEEzLCAweEQzLCAweDA2LCAweEEzLCAweEQ3LCAweDgwLCAweDAyLCAweDFCLCAweEZCLCAweDA0LCAweDFELCAweDAwLCAweEY4LCAweEEzLAorCSAweEEzLCAweEQzLCAweDE4LCAweDAwLCAweDExLCAweDYwLCAweDE0LCAweDYzLCAweDExLCAweDYwLCAweEY0LCAweDY1LCAweEEzLCAweEQxLCAweDA4LCAweEEzLAorCSAweEQwLCAweDgwLCAweEQ3LCAweDgwLCAweDAyLCAweDAzLCAweEZBLCAweDA0LCAweDBGLCAweDAwLCAweEZBLCAweEEzLCAweEEzLCAweEQzLCAweDExLCAweDYwLAorCSAweDE2LCAweDYzLCAweDBBLCAweDFCLCAweEEzLCAweEQzLCAweDA4LCAweEEzLCAweEQ3LCAweDgwLCAweDAyLCAweDFCLCAweEZCLCAweDA0LCAweDA0LCAweDAwLAorCSAweEY2LCAweEEzLCAweEEzLCAweEQzLCAweEM1LCAweEZCLCAweDY0LCAweEZCLCAweDI3LCAweDYwLCAweDM0LCAweDY0LCAweDI2LCAweDYwLCAweDkwLCAweDYzLAorCSAweEEwLCAweEQxLCAweEEzLCAweEQ5LCAweDY0LCAweDQxLCAweDU4LCAweEQxLCAweDVCLCAweEQ5LCAweDY0LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLAorCSAweDAxLCAweDJCLCAweDAzLCAweDAwLCAweEQxLCAweDYwLCAweEU5LCAweDc4LCAweEZGLCAweEZGLCAweDkxLCAweEZBLCAweDYxLCAweDQ0LCAweEVGLCAweDYwLAorCSAweDU4LCAweDRFLCAweEFCLCAweDc4LCAweEZGLCAweEZGLCAweDEyLCAweEZBLCAweDE1LCAweDYwLCAweEJDLCAweEYzLCAweDNGLCAweDQwLCAweDAxLCAweDI3LAorCSAweDA4LCAweDAwLCAweDBGLCAweDYwLCAweEZGLCAweDY1LCAweEE0LCAweDg0LCAweEVFLCAweDYwLCAweDU4LCAweDRFLCAweDI2LCAweDc4LCAweEZGLCAweEZGLAorCSAweDA2LCAweDAwLCAweDBGLCAweDY1LCAweEE0LCAweDg0LCAweEVFLCAweDYwLCAweDU4LCAweDRFLCAweDI2LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY1LAorCSAweEVFLCAweDYwLCAweDU4LCAweDRFLCAweEM2LCAweDc4LCAweEZGLCAweEZGLCAweEVGLCAweDYwLCAweDU4LCAweDRFLCAweDEwLCAweDc4LCAweEZGLCAweEZGLAorCSAweDE1LCAweDAwLCAweDExLCAweEY4LCAweDY0LCAweDQ0LCAweEVGLCAweDYwLCAweDU4LCAweDRFLCAweEFCLCAweDc4LCAweEZGLCAweEZGLCAweDEyLCAweEZBLAorCSAweDE1LCAweDYwLCAweEJELCAweEYzLCAweDBGLCAweDYwLCAweEZGLCAweDY1LCAweEE0LCAweDg0LCAweEVFLCAweDYwLCAweDU4LCAweDRFLCAweDI2LCAweDc4LAorCSAweEZGLCAweEZGLCAweEZGLCAweDY1LCAweEVFLCAweDYwLCAweDU4LCAweDRFLCAweEM2LCAweDc4LCAweEZGLCAweEZGLCAweEI1LCAweEYxLCAweDA5LCAweDYwLAorCSAweDJBLCAweDY0LCAweEQwLCAweDgwLCAweDAzLCAweDY0LCAweDAxLCAweDA2LCAweDA2LCAweDY0LCAweEFFLCAweEZCLCAweDQ2LCAweDQ4LCAweEMzLCAweEYzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA1LCAweDNBLCAweDAzLCAweDAwLCAweDE0LCAweDYwLCAweDAwLCAweDY2LCAweDExLCAweDAwLCAweDA0LCAweDNBLAorCSAweDAzLCAweDAwLCAweDEzLCAweDYwLCAweEY0LCAweDY2LCAweDBDLCAweDAwLCAweDAzLCAweDNBLCAweDAzLCAweDAwLCAweDEzLCAweDYwLCAweEU4LCAweDY2LAorCSAweDA3LCAweDAwLCAweDAyLCAweDNBLCAweDAzLCAweDAwLCAweDEzLCAweDYwLCAweERDLCAweDY2LCAweDAyLCAweDAwLCAweDEzLCAweDYwLCAweEQwLCAweDY2LAorCSAweDYwLCAweEZFLCAweEE2LCAweEQzLCAweERFLCAweDg2LCAweDEwLCAweDYwLCAweDVGLCAweEZCLCAweEE2LCAweEQzLCAweERFLCAweDg2LCAweDIxLCAweDYwLAorCSAweDJGLCAweDYzLCAweEEzLCAweERCLCAweDIxLCAweDYwLCAweEE3LCAweDYzLCAweEEzLCAweERCLCAweEE2LCAweEQzLCAweERFLCAweDg2LCAweDEwLCAweDYwLAorCSAweDVFLCAweEZCLCAweEE2LCAweEQzLCAweERFLCAweDg2LCAweDIwLCAweDYwLCAweEJGLCAweDYzLCAweEEzLCAweERCLCAweDIwLCAweEZFLCAweEE2LCAweEQzLAorCSAweERBLCAweDg2LCAweDYwLCAweDQzLCAweDFGLCAweEIzLCAweDYzLCAweDVDLCAweDFGLCAweDYwLCAweDAwLCAweEI0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg0LCAweEIwLCAweDg1LCAweDEwLCAweDYwLCAweDk1LCAweEYzLCAweEZGLCAweEZGLCAweEZDLCAweDYwLCAweDAwLCAweEI0LCAweEI0LCAweDg0LAorCSAweEEyLCAweERCLCAweDEwLCAweDYwLCAweEQxLCAweEZCLCAweDIxLCAweDYwLCAweENBLCAweDYzLCAweEEzLCAweEQzLCAweEE2LCAweEQxLCAweERFLCAweDg2LAorCSAweDgwLCAweDYwLCAweDdGLCAweEI1LCAweDY0LCAweDQ0LCAweEU4LCAweDg0LCAweDdGLCAweDYwLCAweDgwLCAweEI0LCAweEI0LCAweDg0LCAweEEzLCAweERCLAorCSAweDYwLCAweEZFLCAweEE2LCAweEQzLCAweERFLCAweDg2LCAweDEwLCAweDYwLCAweDYyLCAweEZCLCAweDIwLCAweEZFLCAweDEwLCAweDYwLCAweDJBLCAweDYyLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweERFLCAweEZFLCAweDBBLCAweDA0LCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLAorCSAweEQyLCAweDYwLCAweDVFLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDY0LCAweEYxLCAweDBGLCAweDYwLAorCSAweDlELCAweEY5LCAweDBDLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDIwLCAweDQ0LCAweDAxLCAweDY1LCAweDM0LCAweDgwLAorCSAweDIwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQyLCAweDYwLCAweDgyLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDY0LCAweEYxLCAweDBGLCAweDYwLAorCSAweDlELCAweEY5LCAweDBFLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDIwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLAorCSAweDE2LCAweEZCLCAweEQyLCAweDYwLCAweDk3LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLAorCSAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweEJFLCAweEZFLCAweDA4LCAweDYwLCAweDExLCAweEYxLCAweDQwLCAweDYwLCAweDAwLCAweDY0LAorCSAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweEJFLCAweEZFLCAweDA4LCAweDYwLCAweDExLCAweEYxLCAweDQwLCAweDYwLCAweDAwLCAweDY0LAorCSAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDIwLCAweDQwLCAweDIwLCAweDJBLCAweDA0LCAweDAwLCAweEYwLCAweDYwLCAweDU4LCAweDRFLAorCSAweDY2LCAweDc4LCAweEZGLCAweEZGLCAweDM2LCAweDQwLCAweDA4LCAweDNBLCAweDZBLCAweDAwLCAweDM2LCAweDQwLCAweDA4LCAweDNBLCAweDA1LCAweDAwLAorCSAweDEwLCAweDYwLCAweDQyLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDA0LCAweDAwLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweDRFLCAweEYzLCAweEZGLCAweEZGLCAweDFELCAweDFCLCAweDEzLCAweDYwLCAweDU0LCAweEYzLCAweEM3LCAweEZCLCAweDI2LCAweDYwLAorCSAweDE2LCAweDY1LCAweDI2LCAweDYwLCAweEI4LCAweDYxLCAweDI2LCAweDYwLCAweDE0LCAweDY0LCAweDIwLCAweDYzLCAweDU5LCAweEQxLCAweDU4LCAweEQ5LAorCSAweEE1LCAweEQ5LCAweERBLCAweDg1LCAweEZCLCAweDFGLCAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweDA4LCAweDYwLCAweDIyLCAweEZCLCAweEQzLCAweDYwLAorCSAweDNDLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDM2LCAweDQwLCAweDA4LCAweDNBLCAweDQxLCAweDAwLCAweEU3LCAweDYwLCAweEM1LCAweDc4LAorCSAweEZGLCAweEZGLCAweDI3LCAweDYwLCAweDNFLCAweDYzLCAweDYwLCAweDQxLCAweDAwLCAweDYyLCAweENELCAweDgxLCAweDA0LCAweEEyLCAweEZELCAweDAyLAorCSAweDJDLCAweDYwLCAweDNFLCAweDYxLCAweEZDLCAweEEyLCAweDYyLCAweDQ1LCAweEM1LCAweDgxLCAweEUwLCAweDg0LCAweEUwLCAweDg1LCAweEM0LCAweDg1LAorCSAweEM3LCAweDgzLCAweEZFLCAweEE1LCAweDg4LCAweEYzLCAweEZGLCAweEZGLCAweEM0LCAweDg0LCAweDY2LCAweDQ1LCAweDYwLCAweDQ2LCAweEJELCAweEQxLAorCSAweDAzLCAweEY4LCAweEJELCAweEQxLCAweDA0LCAweEY4LCAweEEzLCAweEQxLCAweDA1LCAweEY4LCAweDA2LCAweEYyLCAweEZGLCAweEZGLCAweDAyLCAweDdFLAorCSAweDA2LCAweEZBLCAweDY0LCAweEYzLCAweDYxLCAweDQzLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDAyLCAweEEzLCAweEEzLCAweEQxLCAweDBGLCAweEY4LAorCSAweDE2LCAweDY0LCAweDEyLCAweEZBLCAweDAxLCAweDY0LCAweDExLCAweEZBLCAweDY2LCAweDVDLCAweEMxLCAweDYwLCAweDU4LCAweDRFLCAweDkzLCAweDc4LAorCSAweEZGLCAweEZGLCAweDY2LCAweDQzLCAweDMyLCAweDQwLCAweDA4LCAweDJBLCAweDBBLCAweDAwLCAweDE0LCAweDYwLCAweDE1LCAweEYzLCAweDA2LCAweEYwLAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDgwLCAweEJGLCAweEIwLCAweDg0LCAweDA2LCAweEZBLCAweEM1LCAweEZFLAorCSAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAwLCAweDYwLCAweDMwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLAorCSAweEQyLCAweDYwLCAweEI1LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDJBLCAweDYyLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAwLCAweDYwLCAweDAzLCAweDY0LCAweDA4LCAweDYwLCAweDIyLCAweEZCLCAweEQyLCAweDYwLCAweEI1LCAweDY0LAorCSAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDQyLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweDBGLCAweDRFLCAweEUxLCAweDYwLCAweDU4LCAweDRGLCAweEE5LCAweDc4LCAweEZGLCAweEZGLCAweDBFLCAweDRGLCAweDBGLCAweDRFLCAweERGLCAweDYwLAorCSAweDU4LCAweDRGLCAweDBGLCAweDc4LCAweEZGLCAweEZGLCAweDBFLCAweDRGLCAweDBGLCAweDRFLCAweERFLCAweDYwLCAweDU4LCAweDRGLCAweDlBLCAweDc4LAorCSAweEZGLCAweEZGLCAweDBFLCAweDRGLCAweDBGLCAweDRFLCAweERELCAweDYwLCAweDU4LCAweDRGLCAweEZCLCAweDc4LCAweEZGLCAweEZGLCAweDBFLCAweDRGLAorCSAweEQ1LCAweDAxLCAweDRFLCAweEYzLCAweDdELCAweEY1LCAweDYwLCAweDQwLCAweEZGLCAweDIyLCAweDBBLCAweDAwLCAweDg4LCAweEYxLCAweENDLCAweDg0LAorCSAweEUwLCAweDg0LCAweEMwLCAweDg2LCAweDA2LCAweEYyLCAweEZGLCAweEZGLCAweDAwLCAweDdFLCAweDA2LCAweEZBLCAweDdELCAweEY1LCAweDA3LCAweDAwLAorCSAweDA4LCAweDYwLCAweDI0LCAweEYxLCAweDAwLCAweDYwLCAweDExLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDRFLCAweEYzLAorCSAweDY2LCAweDQwLCAweEZGLCAweDIyLCAweDA1LCAweDAwLCAweEZGLCAweDIyLCAweDM5LCAweDAwLCAweEQ0LCAweDYwLCAweDBDLCAweDc4LCAweEZGLCAweEZGLAorCSAweDAyLCAweDY0LCAweDY5LCAweEZCLCAweEZGLCAweEZGLCAweEMxLCAweEZFLCAweDY5LCAweEYzLCAweDAwLCAweDY1LCAweEQ0LCAweDgwLCAweDRFLCAweEYzLAorCSAweDBFLCAweDAzLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLAorCSAweDE2LCAweEZCLCAweEQzLCAweDYwLCAweDdDLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLAorCSAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweERFLCAweEZFLCAweDBBLCAweDA0LCAweDIwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLAorCSAweDE2LCAweEZCLCAweEQzLCAweDYwLCAweDhGLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEQzLCAweEYzLAorCSAweEZGLCAweEZGLCAweEZFLCAweEI0LCAweEQzLCAweEZCLCAweDFGLCAweDYwLCAweDNBLCAweDYyLCAweDA2LCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLAorCSAweDJELCAweEZGLCAweDIwLCAweDQ0LCAweDAxLCAweEI1LCAweDU0LCAweDgwLCAweERBLCAweEZFLCAweEJFLCAweEZFLCAweDg3LCAweEYxLCAweDAyLCAweDY0LAorCSAweDg2LCAweEYzLCAweEMwLCAweDgzLCAweDQwLCAweDQ4LCAweDc1LCAweEZELCAweEU3LCAweDYwLCAweDU4LCAweDRFLCAweDgxLCAweDc4LCAweEZGLCAweEZGLAorCSAweDI4LCAweDQ0LCAweDRDLCAweDg4LCAweDc1LCAweEYzLCAweDAyLCAweDY1LCAweEM0LCAweDgzLCAweEY1LCAweDAyLCAweDFFLCAweDYwLCAweDU4LCAweDRFLAorCSAweEI5LCAweDc4LCAweEZGLCAweEZGLCAweDE3LCAweDYwLCAweDA2LCAweDY0LCAweDBCLCAweDYwLCAweDgyLCAweEZCLCAweDRBLCAweERGLCAweDAxLCAweDYwLAorCSAweEZFLCAweDYzLCAweDE1LCAweDYwLCAweDAwLCAweDYxLCAweDAwLCAweDY0LCAweDU5LCAweERCLCAweEZFLCAweDFGLCAweDdELCAweEYxLCAweDFFLCAweDYwLAorCSAweEUwLCAweDYxLCAweDY0LCAweDQwLCAweEZGLCAweDI2LCAweDM4LCAweDAwLCAweEQ0LCAweDYwLCAweDU4LCAweDRFLCAweDBGLCAweDc4LCAweEZGLCAweEZGLAorCSAweDFFLCAweDYwLCAweENFLCAweDYxLCAweEQ0LCAweDYwLCAweDU4LCAweDRFLCAweDBGLCAweDc4LCAweEZGLCAweEZGLCAweDFFLCAweDYwLCAweEQ0LCAweDYxLAorCSAweEQ0LCAweDYwLCAweDU4LCAweDRFLCAweDBGLCAweDc4LCAweEZGLCAweEZGLCAweDFFLCAweDYwLCAweEU2LCAweDYxLCAweEQ0LCAweDYwLCAweDU4LCAweDRFLAorCSAweDBGLCAweDc4LCAweEZGLCAweEZGLCAweDFFLCAweDYwLCAweEVDLCAweDYxLCAweEQ0LCAweDYwLCAweDU4LCAweDRFLCAweDBGLCAweDc4LCAweEZGLCAweEZGLAorCSAweDFFLCAweDYwLCAweEY4LCAweDYxLCAweEQ0LCAweDYwLCAweDU4LCAweDRFLCAweDBGLCAweDc4LCAweEZGLCAweEZGLCAweDFGLCAweDYwLCAweDA0LCAweDYxLAorCSAweEQ0LCAweDYwLCAweDU4LCAweDRFLCAweDBGLCAweDc4LCAweEZGLCAweEZGLCAweDFFLCAweDYwLCAweEYyLCAweDYxLCAweEQ0LCAweDYwLCAweDU4LCAweDRFLAorCSAweDBGLCAweDc4LCAweEZGLCAweEZGLCAweDFFLCAweDYwLCAweERBLCAweDYxLCAweEQ0LCAweDYwLCAweDU4LCAweDRFLCAweDNBLCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE1LCAweEZCLCAweDVBLCAweERCLCAweEM1LCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEExLCAweEQzLAorCSAweDBFLCAweDU3LCAweDIzLCAweDAwLCAweDBFLCAweEYyLCAweDQ0LCAweDRDLCAweDgwLCAweEIwLCAweDEwLCAweEIwLCAweDBBLCAweDAzLCAweDAwLCAweDY0LAorCSAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLAorCSAweDEzLCAweDAwLCAweDEyLCAweDAyLCAweEYwLCAweDM3LCAweDA5LCAweDAwLCAweDAyLCAweEYwLCAweDA5LCAweDYwLCAweDA4LCAweDY0LCAweEQwLCAweDgwLAorCSAweEEyLCAweEZGLCAweDhGLCAweEYzLCAweDAyLCAweDAyLCAweENDLCAweDg0LCAweDhGLCAweEZCLCAweDFGLCAweDYwLCAweDIwLCAweDY0LCAweDQwLCAweDRCLAorCSAweEY2LCAweDYwLCAweDU4LCAweDRELCAweEIzLCAweDc4LCAweEZGLCAweEZGLCAweDJDLCAweDQ0LCAweEFDLCAweDg2LCAweDA5LCAweEYwLCAweERBLCAweDAyLAorCSAweDM3LCAweDU4LCAweEZGLCAweEZGLCAweEExLCAweEQzLCAweDBFLCAweDU3LCAweDE4LCAweDAwLCAweDBFLCAweEYyLCAweDQ0LCAweDRDLCAweDgwLCAweEIwLAorCSAweDEwLCAweEIwLCAweDBBLCAweDAzLCAweDAwLCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDA4LCAweDAwLCAweDA3LCAweDAyLCAweDFGLCAweDYwLCAweDIwLCAweDY0LCAweDQwLCAweDRCLAorCSAweEY2LCAweDYwLCAweDU4LCAweDRELCAweEIzLCAweDc4LCAweEZGLCAweEZGLCAweDJDLCAweDQ0LCAweEFDLCAweDg2LCAweDA5LCAweEYwLCAweEU1LCAweDAyLAorCSAweDM3LCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLCAweEIwLCAweDY0LCAweDJBLCAweEZBLCAweDJGLCAweEYyLAorCSAweDJDLCAweEZBLCAweDMwLCAweEYyLCAweDJELCAweEZBLCAweDMxLCAweEYyLCAweDJFLCAweEZBLCAweENCLCAweEYzLCAweDJGLCAweEZBLCAweENDLCAweEYzLAorCSAweDMwLCAweEZBLCAweENELCAweEYzLCAweDMxLCAweEZBLCAweDY2LCAweEYzLCAweDMyLCAweEZBLCAweDY3LCAweEYzLCAweDMzLCAweEZBLCAweDY4LCAweEYzLAorCSAweDM0LCAweEZBLCAweEFCLCAweEYxLCAweDE5LCAweEY4LCAweDA2LCAweDYzLCAweDNGLCAweEZDLCAweDFDLCAweEYyLCAweDEzLCAweEZBLCAweDAwLCAweDY0LAorCSAweDNFLCAweEZBLCAweDA3LCAweEYyLCAweDg3LCAweEYxLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDBDLCAweDAzLCAweDYwLCAweDQ2LAorCSAweDA2LCAweEYyLCAweDI2LCAweDQ2LCAweDAxLCAweEIwLCAweEZGLCAweEZGLCAweDAzLCAweDAyLCAweEQ2LCAweDYwLCAweDQwLCAweDc4LCAweEZGLCAweEZGLAorCSAweEQ3LCAweDYwLCAweDkyLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEY0LCAweDBBLCAweEYyLCAweDA5LCAweEYyLCAweEZGLCAweEEwLCAweDAwLCAweEEwLAorCSAweDEzLCAweDAyLCAweEZGLCAweEEwLCAweDA0LCAweDAzLCAweDA4LCAweDAzLCAweEQ0LCAweDYwLCAweEFGLCAweDc4LCAweEZGLCAweEZGLCAweDAyLCAweDY0LAorCSAweDU1LCAweEZCLCAweEQ0LCAweDYwLCAweEJBLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDYzLCAweDMyLCAweDQwLCAweDA4LCAweDJBLCAweDBGLCAweDAwLAorCSAweDU1LCAweEZELCAweEQ0LCAweDYwLCAweEJBLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDAwLCAweEY0LCAweDBBLCAweEYyLCAweDBFLCAweDYzLAorCSAweDAxLCAweEE0LCAweDBBLCAweEZBLCAweDBCLCAweEZDLCAweDQzLCAweDU5LCAweEQ3LCAweDYwLCAweDZDLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LAorCSAweDAwLCAweEY0LCAweDBBLCAweEYyLCAweDBELCAweDYzLCAweDAxLCAweEE0LCAweDBBLCAweEZBLCAweDBCLCAweEZDLCAweDQzLCAweDU5LCAweEQ3LCAweDYwLAorCSAweDZDLCAweDc4LCAweEZGLCAweEZGLCAweDg3LCAweEY1LCAweDAwLCAweEYyLCAweDI2LCAweDQ2LCAweDAwLCAweEEwLCAweDJFLCAweEYwLCAweDM3LCAweDAzLAorCSAweDY2LCAweDQxLCAweDE1LCAweDYwLCAweDAyLCAweDY1LCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweDg3LCAweEYxLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLAorCSAweDY0LCAweDQzLCAweDExLCAweDE4LCAweDYwLCAweDQ2LCAweDAwLCAweEYyLCAweEZGLCAweEZGLCAweEZDLCAweDFCLCAweDY2LCAweDQ0LCAweDY0LCAweDQ2LAorCSAweDgwLCAweEYwLCAweDYwLCAweDQ2LCAweDgwLCAweEY4LCAweDY1LCAweDQ2LCAweDY1LCAweDQzLCAweDgwLCAweEYwLCAweDAxLCAweEZBLCAweDgwLCAweEZDLAorCSAweDY0LCAweDQ2LCAweDgwLCAweEY4LCAweDBCLCAweDAwLCAweDY0LCAweDQ2LCAweDYyLCAweDQzLCAweDAwLCAweEYyLCAweEEzLCAweERCLCAweDYwLCAweDQ2LAorCSAweDgwLCAweEYwLCAweDgxLCAweEZDLCAweDgwLCAweEZDLCAweDY0LCAweDQ2LCAweDgwLCAweEY4LCAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDg2LCAweEYxLAorCSAweDE3LCAweDYwLCAweDAyLCAweDYxLCAweEExLCAweEQzLCAweERBLCAweDgxLCAweEQwLCAweDgwLCAweERDLCAweDlDLCAweDA1LCAweDA1LCAweEExLCAweEQzLAorCSAweDRBLCAweEQ5LCAweEEwLCAweERELCAweERBLCAweDlDLCAweEExLCAweEQ5LCAweEQ2LCAweDYwLCAweDA5LCAweDc4LCAweEZGLCAweEZGLCAweDBCLCAweDYwLAorCSAweDgxLCAweEYzLCAweEZGLCAweEZGLCAweDYyLCAweDE4LCAweDE3LCAweDYwLCAweDAyLCAweDY0LCAweDA0LCAweEE1LCAweEEwLCAweEQxLCAweDcyLCAweDQ0LAorCSAweEZGLCAweEI0LCAweDY0LCAweDQwLCAweEUwLCAweDIyLCAweDFGLCAweEI0LCAweDY0LCAweDQwLCAweEY4LCAweDIyLCAweDA3LCAweEI0LCAweDAyLCAweDAwLAorCSAweDAzLCAweDA0LCAweEQwLCAweDg0LCAweEQwLCAweDgwLCAweEZDLCAweDAxLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQzLAorCSAweDY2LCAweDQxLCAweDYzLCAweDQ2LCAweDA1LCAweEYyLCAweDAwLCAweEYwLCAweDgxLCAweEYwLCAweDAyLCAweDE4LCAweDY0LCAweDQ2LCAweDgxLCAweEY4LAorCSAweDA3LCAweDFCLCAweDE1LCAweDYwLCAweDAyLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQ5LCAweDAyLCAweDAwLAorCSAweDY1LCAweDQ2LCAweDAwLCAweEY4LCAweDg3LCAweEYzLCAweDYzLCAweDQ1LCAweDYwLCAweDQ2LCAweDAwLCAweEYyLCAweEZGLCAweEZGLCAweEQ0LCAweDgwLAorCSAweDAxLCAweDE4LCAweEZBLCAweDA0LCAweDgwLCAweEY4LCAweDY1LCAweDQ2LCAweDAwLCAweEZBLCAweDA2LCAweEYyLCAweEZGLCAweEZGLCAweDAwLCAweDdFLAorCSAweDA2LCAweEZBLCAweDYxLCAweDQ2LCAweDJFLCAweEYwLCAweDY2LCAweDQxLCAweDE1LCAweDYwLCAweDAyLCAweDY1LCAweDY0LCAweDQ3LCAweDAwLCAweDdGLAorCSAweDg3LCAweEYxLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY0LCAweDQzLCAweDExLCAweDE4LCAweDYwLCAweDQ2LCAweDAwLCAweEYyLCAweEZGLCAweEZGLAorCSAweEZDLCAweDFCLCAweDY2LCAweDQ0LCAweDY0LCAweDQ2LCAweDgwLCAweEYwLCAweDYwLCAweDQ2LCAweDgwLCAweEY4LCAweDY1LCAweDQ2LCAweDY1LCAweDQzLAorCSAweDgwLCAweEYwLCAweDAxLCAweEZBLCAweDgwLCAweEZDLCAweDY0LCAweDQ2LCAweDgwLCAweEY4LCAweDBCLCAweDAwLCAweDY0LCAweDQ2LCAweDYyLCAweDQzLAorCSAweDAwLCAweEYyLCAweEEzLCAweERCLCAweDYwLCAweDQ2LCAweDgwLCAweEYwLCAweDgxLCAweEZDLCAweDgwLCAweEZDLCAweDY0LCAweDQ2LCAweDgwLCAweEY4LAorCSAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweEQ2LCAweDYwLCAweDA5LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDAyLCAweDYxLCAweEI1LCAweDYwLAorCSAweDU4LCAweDRELCAweEEyLCAweDc4LCAweEZGLCAweEZGLCAweDg2LCAweEYxLCAweDcyLCAweDQ0LCAweEZGLCAweEI0LCAweEQwLCAweDgwLCAweEZGLCAweEZGLAorCSAweDAyLCAweDA0LCAweEQwLCAweDg0LCAweEZCLCAweDAxLCAweEUwLCAweDgzLCAweDg3LCAweEYzLCAweDAyLCAweEEzLCAweDQzLCAweDkzLCAweDY2LCAweDQ0LAorCSAweDAwLCAweEE4LCAweDU2LCAweEZELCAweDNBLCAweDAzLCAweDAwLCAweDY0LCAweDJCLCAweEZBLCAweDAwLCAweDYwLCAweEMwLCAweDY0LCAweDJBLCAweEZBLAorCSAweDY2LCAweDQ1LCAweDYzLCAweDQ2LCAweDAzLCAweEYyLCAweDA0LCAweEYwLCAweDg1LCAweEYyLCAweDY1LCAweDQ2LCAweDJDLCAweEZBLCAweDJELCAweEY4LAorCSAweEFFLCAweEZBLCAweENCLCAweEYzLCAweDJGLCAweEZBLCAweDMyLCAweEZBLCAweENDLCAweEYzLCAweDMwLCAweEZBLCAweDMzLCAweEZBLCAweENELCAweEYzLAorCSAweDMxLCAweEZBLCAweDM0LCAweEZBLCAweEFCLCAweEYxLCAweDE5LCAweEY4LCAweEZGLCAweDY3LCAweDBFLCAweEZBLCAweDY2LCAweDQxLCAweDQzLCAweDQ5LAorCSAweDI5LCAweDQ2LCAweDkyLCAweEYwLCAweDJDLCAweDYwLCAweDI2LCAweDYzLCAweDQ3LCAweEQzLCAweDYxLCAweDQ2LCAweDAyLCAweDYzLCAweDAwLCAweDdFLAorCSAweDEzLCAweEZBLCAweDNGLCAweEZDLCAweDAwLCAweDY0LCAweDNFLCAweEZBLCAweDg3LCAweEYzLCAweDA3LCAweEZBLCAweDY2LCAweDQxLCAweDAwLCAweEY0LAorCSAweDA1LCAweDY0LCAweDA5LCAweEZBLCAweDFFLCAweDYwLCAweEQ0LCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDYxLCAweDQ0LCAweDVBLCAweERCLAorCSAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDU2LCAweEYzLCAweEEzLCAweEZGLCAweDYwLCAweDQzLAorCSAweEU3LCAweDYwLCAweDU4LCAweDRFLCAweDgxLCAweDc4LCAweEZGLCAweEZGLCAweDU2LCAweEYzLCAweEZGLCAweEZGLCAweDQwLCAweDU4LCAweDAzLCAweDY1LAorCSAweEU1LCAweDYwLCAweDU4LCAweDRFLCAweDUxLCAweDc4LCAweEZGLCAweEZGLCAweDU2LCAweEYzLCAweDI2LCAweDQ2LCAweDYwLCAweDQzLCAweDY2LCAweDQxLAorCSAweDYzLCAweDQ2LCAweDA1LCAweEYyLCAweDAwLCAweEYwLCAweDgxLCAweEYwLCAweDAyLCAweDE4LCAweDY0LCAweDQ2LCAweDgxLCAweEY4LCAweDA3LCAweDFCLAorCSAweDE1LCAweDYwLCAweDAyLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQ5LCAweDAyLCAweDAwLCAweDY1LCAweDQ2LAorCSAweDAwLCAweEY4LCAweDg3LCAweEYzLCAweDYzLCAweDQ1LCAweDYwLCAweDQ2LCAweDAwLCAweEYyLCAweEZGLCAweEZGLCAweEQ0LCAweDgwLCAweDAxLCAweDE4LAorCSAweEZBLCAweDA0LCAweDgwLCAweEY4LCAweDY1LCAweDQ2LCAweDAwLCAweEZBLCAweDA2LCAweEYyLCAweEZGLCAweEZGLCAweDAwLCAweDdFLCAweDA2LCAweEZBLAorCSAweDYxLCAweDQ2LCAweDJFLCAweEYwLCAweDY2LCAweDQxLCAweDE1LCAweDYwLCAweDAyLCAweDY1LCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweDg3LCAweEYxLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY0LCAweDQzLCAweDExLCAweDE4LCAweDYwLCAweDQ2LCAweDAwLCAweEYyLCAweEZGLCAweEZGLCAweEZDLCAweDFCLAorCSAweDY2LCAweDQ0LCAweDY0LCAweDQ2LCAweDgwLCAweEYwLCAweDYwLCAweDQ2LCAweDgwLCAweEY4LCAweDY1LCAweDQ2LCAweDY1LCAweDQzLCAweDgwLCAweEYwLAorCSAweDAxLCAweEZBLCAweDgwLCAweEZDLCAweDY0LCAweDQ2LCAweDgwLCAweEY4LCAweDBCLCAweDAwLCAweDY0LCAweDQ2LCAweDYyLCAweDQzLCAweDAwLCAweEYyLAorCSAweEEzLCAweERCLCAweDYwLCAweDQ2LCAweDgwLCAweEYwLCAweDgxLCAweEZDLCAweDgwLCAweEZDLCAweDY0LCAweDQ2LCAweDgwLCAweEY4LCAweDYwLCAweDQzLAorCSAweDYxLCAweDQ2LCAweDJDLCAweEYyLCAweDJELCAweEYwLCAweEFFLCAweEYyLCAweDY2LCAweDQ1LCAweDYzLCAweDQ2LCAweDAzLCAweEZBLCAweDA0LCAweEY4LAorCSAweDU1LCAweEYzLCAweDg1LCAweEZBLCAweEZGLCAweEEwLCAweDY1LCAweDQ2LCAweDAzLCAweDAzLCAweEQ3LCAweDYwLCAweEFFLCAweDc4LCAweEZGLCAweEZGLAorCSAweDk0LCAweEYzLCAweDY2LCAweDQ1LCAweDYzLCAweDQ2LCAweDFGLCAweEZBLCAweDY1LCAweDQ2LCAweEJBLCAweDY1LCAweDYwLCAweDQ0LCAweEM0LCAweDg1LAorCSAweDAxLCAweDYwLCAweEZFLCAweDYxLCAweDAwLCAweDY0LCAweDgwLCAweDYzLCAweEM3LCAweDg1LCAweDk0LCAweDg0LCAweDU5LCAweERCLCAweEZDLCAweDFGLAorCSAweDAwLCAweDYwLCAweDg4LCAweDY0LCAweDNGLCAweEZBLCAweDAwLCAweEY0LCAweDAyLCAweDY0LCAweDBBLCAweEZBLCAweDAwLCAweDY0LCAweDBCLCAweEZBLAorCSAweDgwLCAweDdGLCAweDEwLCAweDdFLCAweDBDLCAweEZBLCAweDFBLCAweDY1LCAweDgwLCAweDYxLCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweDBGLCAweDRFLAorCSAweEY4LCAweDYwLCAweDU4LCAweDRGLCAweDdBLCAweDc4LCAweEZGLCAweEZGLCAweDBFLCAweDRGLCAweEQ3LCAweDYwLCAweDgwLCAweDc4LCAweEZGLCAweEZGLAorCSAweDI2LCAweDQ2LCAweDIzLCAweEYwLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEEwLCAweDgwLCAweDAwLCAweEY0LCAweDAzLCAweDAzLCAweEQ3LCAweDYwLAorCSAweDJBLCAweDc4LCAweEZGLCAweEZGLCAweDA5LCAweEYyLCAweEZGLCAweEZGLCAweEZGLCAweEEwLCAweDAwLCAweEEwLCAweDBDLCAweDAzLCAweDAzLCAweDAzLAorCSAweEQ2LCAweDYwLCAweEE3LCAweDc4LCAweEZGLCAweEZGLCAweDBBLCAweEYyLCAweDI2LCAweDQ2LCAweEZGLCAweEEwLCAweDg3LCAweEY0LCAweDEwLCAweDAyLAorCSAweEQ3LCAweDYwLCAweEFFLCAweDc4LCAweEZGLCAweEZGLCAweDBBLCAweEYyLCAweEZGLCAweEZGLCAweEZGLCAweEEwLCAweEZELCAweEEwLCAweDAyLCAweDAzLAorCSAweDA0LCAweDAzLCAweDA2LCAweDAwLCAweEQ2LCAweDYwLCAweEU2LCAweDc4LCAweEZGLCAweEZGLCAweEQ2LCAweDYwLCAweEYxLCAweDc4LCAweEZGLCAweEZGLAorCSAweDI2LCAweDQ2LCAweDg3LCAweEY0LCAweDY2LCAweDQxLCAweDYzLCAweDQ2LCAweDA1LCAweEYyLCAweDAwLCAweEYwLCAweDgxLCAweEYwLCAweDAyLCAweDE4LAorCSAweDY0LCAweDQ2LCAweDgxLCAweEY4LCAweDA3LCAweDFCLCAweDE1LCAweDYwLCAweDAyLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LAorCSAweDQ0LCAweEQ5LCAweDAyLCAweDAwLCAweDY1LCAweDQ2LCAweDAwLCAweEY4LCAweDg3LCAweEYzLCAweDYzLCAweDQ1LCAweDYwLCAweDQ2LCAweDAwLCAweEYyLAorCSAweEZGLCAweEZGLCAweEQ0LCAweDgwLCAweDAxLCAweDE4LCAweEZBLCAweDA0LCAweDgwLCAweEY4LCAweDY1LCAweDQ2LCAweDAwLCAweEZBLCAweDA2LCAweEYyLAorCSAweEZGLCAweEZGLCAweDAwLCAweDdFLCAweDA2LCAweEZBLCAweDYxLCAweDQ2LCAweDBCLCAweDYwLCAweDgyLCAweEYzLCAweERBLCAweDgxLCAweDYwLCAweDQ1LAorCSAweEQ1LCAweDgwLCAweEExLCAweEQxLCAweDExLCAweDAzLCAweEQzLCAweDgwLCAweEQ5LCAweDgxLCAweEZBLCAweDAyLCAweEM5LCAweDgxLCAweEM4LCAweDg1LAorCSAweEQ1LCAweDgwLCAweEE1LCAweEQzLCAweDA4LCAweDI4LCAweEExLCAweERCLCAweDE3LCAweDYwLCAweDA0LCAweDYyLCAweDY1LCAweDQ0LCAweEEyLCAweERCLAorCSAweDRBLCAweEQzLCAweEZGLCAweEZGLCAweENDLCAweDg0LCAweEEyLCAweERCLCAweEQ0LCAweDYwLCAweEE0LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LAorCSAweDg3LCAweEY0LCAweDY2LCAweDQxLCAweDYzLCAweDQ2LCAweDA1LCAweEYyLCAweDAwLCAweEYwLCAweDgxLCAweEYwLCAweDAyLCAweDE4LCAweDY0LCAweDQ2LAorCSAweDgxLCAweEY4LCAweDA3LCAweDFCLCAweDE1LCAweDYwLCAweDAyLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQ5LAorCSAweDAyLCAweDAwLCAweDY1LCAweDQ2LCAweDAwLCAweEY4LCAweDg3LCAweEYzLCAweDYzLCAweDQ1LCAweDYwLCAweDQ2LCAweDAwLCAweEYyLCAweEZGLCAweEZGLAorCSAweEQ0LCAweDgwLCAweDAxLCAweDE4LCAweEZBLCAweDA0LCAweDgwLCAweEY4LCAweDY1LCAweDQ2LCAweDAwLCAweEZBLCAweDA2LCAweEYyLCAweEZGLCAweEZGLAorCSAweDAwLCAweDdFLCAweDA2LCAweEZBLCAweDYxLCAweDQ2LCAweDBCLCAweDYwLCAweDgyLCAweEYzLCAweERBLCAweDgxLCAweDYwLCAweDQ1LCAweEQ1LCAweDgwLAorCSAweEExLCAweEQxLCAweDExLCAweDAzLCAweEQzLCAweDgwLCAweEQ5LCAweDgxLCAweEZBLCAweDAyLCAweEM5LCAweDgxLCAweEM4LCAweDg1LCAweEQ1LCAweDgwLAorCSAweEE1LCAweEQzLCAweDA4LCAweDI4LCAweEExLCAweERCLCAweDE3LCAweDYwLCAweDA0LCAweDYyLCAweDY1LCAweDQ0LCAweEEyLCAweERCLCAweDRBLCAweEQzLAorCSAweEZGLCAweEZGLCAweENDLCAweDg0LCAweEEyLCAweERCLCAweEQ0LCAweDYwLCAweEFGLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDMyLCAweDQ0LAorCSAweDA4LCAweEIwLCAweDg3LCAweEY0LCAweDAzLCAweDAyLCAweEQ0LCAweDYwLCAweEFGLCAweDc4LCAweEZGLCAweEZGLCAweEQ2LCAweDYwLCAweDE4LCAweDc4LAorCSAweEZGLCAweEZGLCAweDMyLCAweDQ0LCAweDI2LCAweDQ2LCAweDA4LCAweEIwLCAweDA3LCAweEYyLCAweDAzLCAweDAyLCAweEQ0LCAweDYwLCAweEFGLCAweDc4LAorCSAweEZGLCAweEZGLCAweDYwLCAweDQ2LCAweDFGLCAweEYyLCAweDI2LCAweDQ2LCAweEJBLCAweDY1LCAweDYwLCAweDQ0LCAweEM0LCAweDg1LCAweDAxLCAweDYwLAorCSAweEZFLCAweDYxLCAweDAwLCAweDY0LCAweDgwLCAweDYzLCAweEM3LCAweDg1LCAweDk0LCAweDg0LCAweDU5LCAweERCLCAweEZDLCAweDFGLCAweDAwLCAweEY0LAorCSAweDAxLCAweDYwLCAweEZFLCAweDYxLCAweDdFLCAweDY1LCAweDE4LCAweDYzLCAweDVCLCAweEQyLCAweDU5LCAweEQxLCAweEZGLCAweEZGLCAweEQwLCAweDgwLAorCSAweEQ3LCAweDgwLCAweDE4LCAweDAyLCAweEY5LCAweDAyLCAweDAwLCAweEY0LCAweDAyLCAweDYzLCAweDBFLCAweDY1LCAweDVCLCAweEQyLCAweDU5LCAweEQxLAorCSAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweEQ3LCAweDgwLCAweDBFLCAweDAyLCAweEY5LCAweDAyLCAweDI2LCAweDQ2LCAweDA3LCAweEY0LCAweDA2LCAweEYyLAorCSAweEZGLCAweEZGLCAweDAxLCAweDdFLCAweDA2LCAweEZBLCAweDI2LCAweDQ2LCAweDAwLCAweEY0LCAweDA0LCAweDY0LCAweDBBLCAweEZBLCAweDAwLCAweDY0LAorCSAweDBCLCAweEZBLCAweDU2LCAweDAwLCAweDI2LCAweDQ2LCAweDg3LCAweEY0LCAweDY2LCAweDQxLCAweDYzLCAweDQ2LCAweDA1LCAweEYyLCAweDAwLCAweEYwLAorCSAweDgxLCAweEYwLCAweDAyLCAweDE4LCAweDY0LCAweDQ2LCAweDgxLCAweEY4LCAweDA3LCAweDFCLCAweDE1LCAweDYwLCAweDAyLCAweDY1LCAweDYwLCAweDQ3LAorCSAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQ5LCAweDAyLCAweDAwLCAweDY1LCAweDQ2LCAweDAwLCAweEY4LCAweDg3LCAweEYzLCAweDYzLCAweDQ1LAorCSAweDYwLCAweDQ2LCAweDAwLCAweEYyLCAweEZGLCAweEZGLCAweEQ0LCAweDgwLCAweDAxLCAweDE4LCAweEZBLCAweDA0LCAweDgwLCAweEY4LCAweDY1LCAweDQ2LAorCSAweDAwLCAweEZBLCAweDA2LCAweEYyLCAweEZGLCAweEZGLCAweDAwLCAweDdFLCAweDA2LCAweEZBLCAweDYxLCAweDQ2LCAweDBCLCAweDYwLCAweDgyLCAweEYzLAorCSAweERBLCAweDgxLCAweDYwLCAweDQ1LCAweEQ1LCAweDgwLCAweEExLCAweEQxLCAweDExLCAweDAzLCAweEQzLCAweDgwLCAweEQ5LCAweDgxLCAweEZBLCAweDAyLAorCSAweEM5LCAweDgxLCAweEM4LCAweDg1LCAweEQ1LCAweDgwLCAweEE1LCAweEQzLCAweDA4LCAweDI4LCAweEExLCAweERCLCAweDE3LCAweDYwLCAweDA0LCAweDYyLAorCSAweDY1LCAweDQ0LCAweEEyLCAweERCLCAweDRBLCAweEQzLCAweEZGLCAweEZGLCAweENDLCAweDg0LCAweEEyLCAweERCLCAweDAwLCAweEY0LCAweDA0LCAweDY0LAorCSAweDBBLCAweEZBLCAweDBGLCAweDY0LCAweDBCLCAweEZBLCAweDQwLCAweDU5LCAweDAyLCAweDYwLCAweDAwLCAweDYxLCAweDQxLCAweDU4LCAweDI2LCAweDQ2LAorCSAweDJDLCAweEYyLCAweEExLCAweERCLCAweDJELCAweEYyLCAweDU5LCAweERCLCAweDJFLCAweEYyLCAweDU5LCAweERCLCAweDAzLCAweDY1LCAweEU1LCAweDYwLAorCSAweDU4LCAweDRFLCAweDI3LCAweDc4LCAweEZGLCAweEZGLCAweDAzLCAweDY1LCAweEU1LCAweDYwLCAweDU4LCAweDRFLCAweDUxLCAweDc4LCAweEZGLCAweEZGLAorCSAweDI2LCAweDQ2LCAweDg3LCAweEYzLCAweDA3LCAweEZBLCAweDFFLCAweDYwLCAweEQ0LCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDI2LCAweDQ0LAorCSAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweEY0LCAweDBBLCAweEYyLCAweDA5LCAweEYyLCAweEZGLCAweEEwLCAweDAwLCAweEEwLCAweDA2LCAweDAyLAorCSAweEZGLCAweEEwLCAweDA3LCAweDAzLCAweDA5LCAweDAzLCAweEQ2LCAweDYwLCAweEE3LCAweDc4LCAweEZGLCAweEZGLCAweEQ2LCAweDYwLCAweDY4LCAweDc4LAorCSAweEZGLCAweEZGLCAweEQ3LCAweDYwLCAweEIzLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDA3LCAweEY0LCAweDA2LCAweEYyLCAweDY2LCAweDQzLAorCSAweDAwLCAweDdFLCAweDA2LCAweEZBLCAweDI2LCAweDQ2LCAweEQ2LCAweDYwLCAweDE4LCAweDc4LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweDA2LCAweEYyLAorCSAweEZGLCAweEZGLCAweDAxLCAweDdFLCAweDA2LCAweEZBLCAweDI2LCAweDQ2LCAweDg3LCAweEYzLCAweDA3LCAweEZBLCAweDAwLCAweEY0LCAweDAyLCAweDY0LAorCSAweDBBLCAweEZBLCAweDAwLCAweDY0LCAweDBCLCAweEZBLCAweDFFLCAweDYwLCAweEQ0LCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDI2LCAweDQ0LAorCSAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAxLCAweDYxLCAweDAwLCAweDYwLCAweDEwLCAweDdDLCAweDJBLCAweEYyLCAweDBDLCAweDYwLCAweDcwLCAweEZCLAorCSAweEZGLCAweEI0LCAweDE2LCAweDYwLCAweDgzLCAweEZCLCAweDYwLCAweDQwLCAweDAwLCAweDM2LCAweDAzLCAweDAwLCAweDAyLCAweDYxLCAweDAwLCAweDYwLAorCSAweDMwLCAweDdDLCAweDQxLCAweDQ3LCAweDJBLCAweEY4LCAweDJGLCAweEYyLCAweDJDLCAweEZBLCAweDMwLCAweEYyLCAweDJELCAweEZBLCAweDMxLCAweEYyLAorCSAweDJFLCAweEZBLCAweENCLCAweEYzLCAweDJGLCAweEZBLCAweENDLCAweEYzLCAweDMwLCAweEZBLCAweENELCAweEYzLCAweDMxLCAweEZBLCAweDY2LCAweEYzLAorCSAweDMyLCAweEZBLCAweDY3LCAweEYzLCAweDMzLCAweEZBLCAweDY4LCAweEYzLCAweDM0LCAweEZBLCAweEFCLCAweEYxLCAweDE5LCAweEY4LCAweDAwLCAweDdDLAorCSAweDNFLCAweEY4LCAweDFDLCAweEYwLCAweDEzLCAweEY4LCAweDA3LCAweEYyLCAweDg3LCAweEYxLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweEZGLCAweEZGLAorCSAweDAzLCAweDAyLCAweERDLCAweDYwLCAweDU1LCAweDc4LCAweEZGLCAweEZGLCAweDQwLCAweDRCLCAweDAxLCAweDY1LCAweEVGLCAweDYwLCAweDU4LCAweDRFLAorCSAweERDLCAweDc4LCAweEZGLCAweEZGLCAweEFCLCAweDQ2LCAweDA2LCAweEYyLCAweEFCLCAweDQ2LCAweDAwLCAweEY0LCAweDAxLCAweEIwLCAweEZGLCAweEZGLAorCSAweDAzLCAweDAyLCAweERDLCAweDYwLCAweDU1LCAweDc4LCAweEZGLCAweEZGLCAweDA5LCAweEYyLCAweDE2LCAweDYwLCAweDg0LCAweEZCLCAweDVBLCAweDg0LAorCSAweDAwLCAweDYzLCAweDYwLCAweDQwLCAweDIwLCAweDI2LCAweDAyLCAweEJCLCAweDYwLCAweDQwLCAweDA0LCAweDI3LCAweDA0LCAweEJCLCAweEFCLCAweDQ2LAorCSAweDc4LCAweEZDLCAweEFCLCAweDQ2LCAweEZGLCAweEZGLCAweDEwLCAweEIwLCAweDgwLCAweDYwLCAweDAwLCAweDYzLCAweDBDLCAweDAzLCAweDEzLCAweDYwLAorCSAweDQ1LCAweEYxLCAweEZGLCAweEZGLCAweDY0LCAweDQ0LCAweEZFLCAweDI2LCAweDA4LCAweDAwLCAweDMyLCAweDQwLCAweDA4LCAweDI2LCAweDA2LCAweDAwLAorCSAweERDLCAweDYwLCAweEI5LCAweDc4LCAweEZGLCAweEZGLCAweDMyLCAweDQwLCAweDEwLCAweDJBLCAweDAwLCAweDYzLCAweEFCLCAweDQ2LCAweDA2LCAweEYwLAorCSAweDdGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweDYzLCAweDQ1LCAweEI0LCAweDg0LCAweDA2LCAweEZBLCAweEFCLCAweDQ2LCAweDBBLCAweEYwLAorCSAweDU2LCAweEY5LCAweDI0LCAweEQ5LCAweDVBLCAweDg0LCAweDAxLCAweDYzLCAweDMyLCAweDQwLCAweDEwLCAweDI2LCAweDEwLCAweEJCLCAweDEzLCAweDYwLAorCSAweDQ1LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweEZFLCAweDI2LCAweDEwLCAweEJCLCAweDE1LCAweDYwLCAweERELCAweEYxLCAweDYzLCAweDQ0LAorCSAweDIwLCAweEJDLCAweEZCLCAweDYwLCAweEZGLCAweEI3LCAweDY0LCAweDQwLCAweDEwLCAweDI2LCAweDA0LCAweEJDLCAweDYwLCAweDQ3LCAweDYwLCAweDQzLAorCSAweDA5LCAweEZDLCAweDI3LCAweDQ0LCAweEZFLCAweEEwLCAweEZGLCAweEZGLCAweDAzLCAweDAzLCAweEQ4LCAweDYwLCAweEM4LCAweDc4LCAweEZGLCAweEZGLAorCSAweDE4LCAweDYwLCAweEQ2LCAweDY0LCAweDI0LCAweDQzLCAweDBCLCAweEYwLCAweEEwLCAweEQ5LCAweEJELCAweEQ5LCAweDBDLCAweEYwLCAweDU4LCAweEQ5LAorCSAweEJELCAweEQ5LCAweDBELCAweEYwLCAweDU4LCAweEQ5LCAweEJELCAweEQ5LCAweDQzLCAweDQ0LCAweDI2LCAweDQ2LCAweDg3LCAweEYyLCAweDNGLCAweEYyLAorCSAweDQxLCAweDRCLCAweDAwLCAweEY0LCAweDYwLCAweDQzLCAweEY2LCAweEEzLCAweDAwLCAweDYwLCAweDFCLCAweDYxLCAweDAwLCAweDYwLCAweDAxLCAweDY1LAorCSAweDAxLCAweDYwLCAweEZGLCAweDY0LCAweDQwLCAweDRDLCAweEVGLCAweDYwLCAweDU4LCAweDRFLCAweDc5LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEJCLAorCSAweEZGLCAweEZGLCAweDAwLCAweDAyLCAweDAwLCAweDY0LCAweDQwLCAweDRBLCAweDYwLCAweEZFLCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweEJELCAweEQzLAorCSAweEJELCAweEQzLCAweDYwLCAweDQxLCAweEYwLCAweDYwLCAweDU4LCAweDRFLCAweDI3LCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweDI2LCAweDQ2LAorCSAweDNGLCAweEYyLCAweDAwLCAweEY0LCAweDYwLCAweDQzLCAweEY2LCAweEEzLCAweDAwLCAweDYwLCAweDFCLCAweDYxLCAweDAwLCAweDYwLCAweDMyLCAweDY1LAorCSAweDAxLCAweDYwLCAweEZGLCAweDY0LCAweDQwLCAweDRDLCAweEVGLCAweDYwLCAweDU4LCAweDRFLCAweDc5LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEJCLAorCSAweEZGLCAweEZGLCAweDBCLCAweDAzLCAweDYwLCAweEZFLCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweEJELCAweEQzLCAweEJELCAweEQzLCAweDYwLCAweDQxLAorCSAweEYwLCAweDYwLCAweDU4LCAweDRFLCAweDI3LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIwLCAweEZFLCAweDMwLCAweDYwLCAweDIwLCAweDYxLAorCSAweEExLCAweEQxLCAweDgyLCAweEYzLCAweDAxLCAweDYwLCAweDZFLCAweDYzLCAweDYwLCAweDQ1LCAweDJBLCAweDQ0LCAweDYwLCAweEZCLCAweEEzLCAweEQ1LAorCSAweDY1LCAweDQwLCAweDAxLCAweDI3LCAweDVCLCAweEQ1LCAweDY1LCAweDQwLCAweDAxLCAweDI3LCAweDU5LCAweEQxLCAweDY2LCAweDQxLCAweEEwLCAweDg0LAorCSAweDI0LCAweDk0LCAweDJCLCAweDQ2LCAweDBGLCAweEZBLCAweDYxLCAweEZCLCAweDE2LCAweDY0LCAweDEyLCAweEZBLCAweDAxLCAweDY0LCAweDExLCAweEZBLAorCSAweDY2LCAweDVDLCAweEMxLCAweDYwLCAweDU4LCAweDRFLCAweDkzLCAweDc4LCAweEZGLCAweEZGLCAweEQ5LCAweDYwLCAweDI4LCAweDc4LCAweEZGLCAweEZGLAorCSAweDI2LCAweDQ2LCAweDg3LCAweEYyLCAweDNGLCAweEYyLCAweDQxLCAweDRCLCAweDAwLCAweEY0LCAweDYwLCAweDQzLCAweEZDLCAweEEzLCAweDAwLCAweDYwLAorCSAweDE1LCAweDYxLCAweDAwLCAweDYwLCAweDAxLCAweDY1LCAweDAxLCAweDYwLCAweEZGLCAweDY0LCAweDQwLCAweDRDLCAweEVGLCAweDYwLCAweDU4LCAweDRFLAorCSAweDc5LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEJCLCAweEZGLCAweEZGLCAweDAwLCAweDAyLCAweDAwLCAweDY0LCAweDQwLCAweDRBLCAweDYwLCAweEZFLAorCSAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweEJELCAweEQzLCAweEJELCAweEQzLCAweDYwLCAweDQxLCAweEYwLCAweDYwLCAweDU4LCAweDRFLCAweDI3LCAweDc4LAorCSAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweDI2LCAweDQ2LCAweDNGLCAweEYyLCAweDAwLCAweEY0LCAweDYwLCAweDQzLCAweEZDLCAweEEzLCAweDAwLCAweDYwLAorCSAweDE1LCAweDYxLCAweDAwLCAweDYwLCAweDMyLCAweDY1LCAweDAxLCAweDYwLCAweEZGLCAweDY0LCAweDQwLCAweDRDLCAweEVGLCAweDYwLCAweDU4LCAweDRFLAorCSAweDc5LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEJCLCAweEZGLCAweEZGLCAweDBCLCAweDAzLCAweDYwLCAweEZFLCAweDAyLCAweDYwLCAweDAwLCAweDYzLAorCSAweEJELCAweEQzLCAweEJELCAweEQzLCAweDYwLCAweDQxLCAweEYwLCAweDYwLCAweDU4LCAweDRFLCAweDI3LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDAwLAorCSAweDIwLCAweEZFLCAweDMwLCAweDYwLCAweDIwLCAweDYxLCAweEExLCAweEQxLCAweDgyLCAweEYzLCAweDAxLCAweDYwLCAweDZFLCAweDYzLCAweDYwLCAweDQ1LAorCSAweDJBLCAweDQ0LCAweDYwLCAweEZCLCAweEEzLCAweEQ1LCAweDY1LCAweDQwLCAweDAxLCAweDI3LCAweDVCLCAweEQ1LCAweDY1LCAweDQwLCAweDAxLCAweDI3LAorCSAweDU5LCAweEQxLCAweDY2LCAweDQxLCAweEEwLCAweDg0LCAweDI0LCAweDk0LCAweDJCLCAweDQ2LCAweDBGLCAweEZBLCAweDYxLCAweEZCLCAweDE2LCAweDY0LAorCSAweDEyLCAweEZBLCAweDAxLCAweDY0LCAweDExLCAweEZBLCAweDY2LCAweDVDLCAweEMxLCAweDYwLCAweDU4LCAweDRFLCAweDkzLCAweDc4LCAweEZGLCAweEZGLAorCSAweDJCLCAweDQ2LCAweDBGLCAweEYyLCAweDEyLCAweDYzLCAweDdDLCAweDE4LCAweDI2LCAweDQ2LCAweDg3LCAweEYyLCAweDAxLCAweDY1LCAweDQxLCAweDRCLAorCSAweEFCLCAweDQ2LCAweDBGLCAweEYyLCAweEZGLCAweEZGLCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEZGLCAweDIyLAorCSAweDAwLCAweDY1LCAweDc4LCAweEYyLCAweEZGLCAweEZGLCAweEI0LCAweDg0LCAweDc4LCAweEZBLCAweEFCLCAweDQ2LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LAorCSAweDNGLCAweEYyLCAweDAwLCAweEY0LCAweDE2LCAweDY1LCAweDI3LCAweDQwLCAweDAyLCAweDNBLCAweDAzLCAweDAwLCAweDFDLCAweDY1LCAweEY2LCAweEE0LAorCSAweDAxLCAweDAwLCAweEZDLCAweEE0LCAweDI0LCAweDQzLCAweDJELCAweDYwLCAweDVFLCAweDYxLCAweDVELCAweDkxLCAweDUxLCAweDkwLCAweEZGLCAweEZGLAorCSAweDA0LCAweDI4LCAweDYwLCAweDQxLCAweENELCAweDg0LCAweDRDLCAweDkxLCAweDYwLCAweDQzLCAweDYwLCAweEZFLCAweEE1LCAweEQyLCAweERFLCAweDg1LAorCSAweDdGLCAweDI2LCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweDVELCAweDkzLCAweEEzLCAweERCLCAweDVELCAweDkzLCAweEE1LCAweEQyLAorCSAweEY2LCAweDFGLCAweDVELCAweDkzLCAweDIwLCAweEZFLCAweERGLCAweDgzLCAweDJELCAweDYwLCAweDA0LCAweDdDLCAweDAzLCAweDFFLCAweDYwLCAweEZFLAorCSAweEJELCAweERGLCAweDIwLCAweEZFLCAweDJELCAweDYwLCAweDA4LCAweDY0LCAweDUzLCAweDkzLCAweEE0LCAweERELCAweDI2LCAweDQ2LCAweDAwLCAweEY0LAorCSAweDEzLCAweDYwLCAweDQ0LCAweEYzLCAweDAwLCAweDYzLCAweDAwLCAweEI4LCAweDBBLCAweEZDLCAweDAzLCAweDAyLCAweEQ5LCAweDYwLCAweENGLCAweDc4LAorCSAweEZGLCAweEZGLCAweDBCLCAweEYyLCAweDI3LCAweDQwLCAweDAyLCAweDNBLCAweDAyLCAweDAwLCAweDBFLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQ3LAorCSAweDAwLCAweDNBLCAweDI1LCAweDAwLCAweDYwLCAweDQxLCAweDAwLCAweDM2LCAweDIyLCAweDAwLCAweEUwLCAweEEwLCAweERBLCAweDg1LCAweDFGLCAweDA3LAorCSAweDEzLCAweDYwLCAweDBCLCAweEYxLCAweDY1LCAweDQyLCAweEQxLCAweDgwLCAweDI2LCAweDYwLCAweDE4LCAweDYzLCAweDE4LCAweDAyLCAweDUwLCAweEZFLAorCSAweDYxLCAweDQwLCAweEZFLCAweDIyLCAweDA4LCAweDAwLCAweDYyLCAweDQ1LCAweEJELCAweEQzLCAweEE1LCAweEQwLCAweERBLCAweDgyLCAweEQwLCAweDgwLAorCSAweEM5LCAweDgxLCAweEY2LCAweDBDLCAweDBDLCAweDAwLCAweDYxLCAweDQwLCAweDAwLCAweDM2LCAweDMxLCAweDAwLCAweDYyLCAweDQ1LCAweEEzLCAweEQzLAorCSAweEE1LCAweEQwLCAweEZGLCAweEZGLCAweDkwLCAweDgwLCAweEZGLCAweDI2LCAweDAyLCAweDAwLCAweERFLCAweDgyLCAweDI4LCAweDAwLCAweDBDLCAweDYzLAorCSAweDBBLCAweEZDLCAweDAwLCAweDY0LCAweDA5LCAweEZBLCAweDBCLCAweEZBLCAweDAxLCAweDdFLCAweDBDLCAweEZBLCAweDI2LCAweDQ2LCAweDA4LCAweDY0LAorCSAweDNGLCAweEZBLCAweDA3LCAweEYyLCAweDg3LCAweEYxLCAweDQwLCAweDU4LCAweDA3LCAweEY4LCAweDFFLCAweDYwLCAweEQ0LCAweDY0LCAweDBGLCAweDYwLAorCSAweDkwLCAweEZCLCAweDI2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLAorCSAweERDLCAweDYwLCAweEQ0LCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweDE2LCAweDYwLCAweDUwLCAweEYzLCAweEZGLCAweEZGLCAweDIyLCAweEIwLAorCSAweEZGLCAweEZGLCAweDAzLCAweDAzLCAweERCLCAweDYwLCAweEIxLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDYzLCAweEQ5LCAweDAxLCAweDEzLCAweDYwLAorCSAweDQ1LCAweEYzLCAweEZGLCAweEZGLCAweEZGLCAweEE0LCAweEZGLCAweEZGLCAweDBDLCAweDIwLCAweDAzLCAweDAwLCAweERCLCAweDYwLCAweEIxLCAweDc4LAorCSAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDE2LCAweDYwLCAweDU2LCAweEZCLCAweDE2LCAweDYwLCAweDU3LCAweEZCLCAweDE2LCAweDYwLCAweDU4LCAweEZCLAorCSAweDE2LCAweDYwLCAweDVBLCAweEZCLCAweDE2LCAweDYwLCAweDVCLCAweEZCLCAweDE2LCAweDYwLCAweDVDLCAweEZCLCAweDE2LCAweDYwLCAweDVELCAweEZCLAorCSAweDE4LCAweDYwLCAweDE3LCAweEZCLCAweDJCLCAweDQ2LCAweDNCLCAweEYyLCAweDdGLCAweDYwLCAweENGLCAweDY1LCAweEE0LCAweDg0LCAweEEyLCAweERBLAorCSAweDI2LCAweDQ2LCAweDAwLCAweEY0LCAweDBCLCAweEYyLCAweDI3LCAweDQwLCAweDAyLCAweDNBLCAweDAyLCAweDAwLCAweDBFLCAweEYyLCAweEZGLCAweEZGLAorCSAweENFLCAweDgxLCAweDIwLCAweEZFLCAweDMwLCAweDYwLCAweDI4LCAweDY0LCAweDQwLCAweDRBLCAweERBLCAweDYwLCAweDU4LCAweDRELCAweDYyLCAweDc4LAorCSAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweDE4LCAweDYwLCAweDE3LCAweEYzLCAweEZGLCAweEZGLCAweDA4LCAweDE4LCAweDE4LCAweDYwLCAweDE5LCAweEYzLAorCSAweDE4LCAweDYwLCAweDFBLCAweEY1LCAweDYwLCAweDQxLCAweDMwLCAweDYwLCAweDJFLCAweDYyLCAweEEyLCAweERGLCAweDJBLCAweEQxLCAweERBLCAweDg1LAorCSAweDY0LCAweDQ0LCAweDAxLCAweEEwLCAweEZGLCAweEZGLCAweDAxLCAweDAyLCAweDc1LCAweDAwLCAweDQ1LCAweDRBLCAweDdDLCAweDQ0LCAweDYwLCAweEZFLAorCSAweEExLCAweEQyLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweDIwLCAweEZFLCAweDAxLCAweDAzLCAweEUzLCAweDAxLCAweDMwLCAweDYwLCAweDJFLCAweDYyLAorCSAweEEyLCAweERGLCAweDYwLCAweEZFLCAweDVELCAweEQyLCAweEZGLCAweEZGLCAweDYwLCAweDVDLCAweDQxLCAweDk0LCAweDgxLCAweEEwLCAweDIwLCAweEZFLAorCSAweDJELCAweDA0LCAweDAxLCAweDY0LCAweDE4LCAweDYwLCAweDE3LCAweEZCLCAweEMxLCAweDg0LCAweDg0LCAweEE0LCAweDE4LCAweDYwLCAweDE5LCAweEZCLAorCSAweDAwLCAweEYyLCAweDE4LCAweDYwLCAweDFBLCAweEZCLCAweDE4LCAweDYwLCAweDE4LCAweEZELCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweENELCAweDg1LAorCSAweDY0LCAweDQ0LCAweEQ4LCAweDgxLCAweENELCAweDg0LCAweDRDLCAweDkxLCAweDYwLCAweDQzLCAweDYwLCAweEZFLCAweEE1LCAweEQyLCAweERFLCAweDg1LAorCSAweDdGLCAweDI2LCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweDVELCAweDkzLCAweEEzLCAweERCLCAweDVELCAweDkzLCAweEE1LCAweEQyLAorCSAweEY2LCAweDFGLCAweDVELCAweDkzLCAweDIwLCAweEZFLCAweERGLCAweDgzLCAweDAwLCAweDYwLCAweDAxLCAweDYxLCAweDAyLCAweDYwLCAweDAwLCAweDY0LAorCSAweEUwLCAweDg3LCAweDYwLCAweDQ2LCAweDE4LCAweDYwLCAweDE4LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQzLCAweDYwLCAweEZFLCAweENELCAweDgxLAorCSAweDIwLCAweEZFLCAweDJBLCAweDQ0LCAweDAwLCAweDYwLCAweDAyLCAweDY1LCAweDQ0LCAweEQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERCLCAweDYwLAorCSAweDVDLCAweDc4LCAweEZGLCAweEZGLCAweDE4LCAweDYwLCAweDE3LCAweEYzLCAweEZGLCAweEZGLCAweDA4LCAweDE4LCAweDE4LCAweDYwLCAweDE5LCAweEYzLAorCSAweDE4LCAweDYwLCAweDFBLCAweEY1LCAweDYwLCAweDQxLCAweDMwLCAweDYwLCAweDJFLCAweDYyLCAweEEyLCAweERGLCAweDY2LCAweDVDLCAweDI2LCAweDQ2LAorCSAweDAwLCAweEYyLCAweDY0LCAweDQ2LCAweDU4LCAweDkwLCAweEZGLCAweEZGLCAweDAzLCAweDAyLCAweDYxLCAweDQ0LCAweDBCLCAweEE1LCAweDA0LCAweDAwLAorCSAweDYxLCAweDQ0LCAweEZDLCAweEE0LCAweDhCLCAweDdDLCAweEMwLCAweDg1LCAweERELCAweDgxLCAweDY2LCAweDQ0LCAweDE4LCAweDYwLCAweDFBLCAweEZCLAorCSAweDI2LCAweDQ2LCAweDFCLCAweEYwLCAweDE4LCAweDYwLCAweDFBLCAweEY1LCAweDY0LCAweDQ0LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweEQ3LCAweDA2LAorCSAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDYwLCAweEZFLCAweDVELCAweEQyLCAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweEZGLCAweEI0LCAweDQxLCAweDk0LAorCSAweDgxLCAweEEwLCAweEZGLCAweEZGLCAweDAyLCAweDA0LCAweDAwLCAweEY0LCAweDg0LCAweEE0LCAweDYwLCAweDQxLCAweDYyLCAweDAxLCAweDYwLCAweEZFLAorCSAweDVELCAweEQyLCAweEZGLCAweEZGLCAweEZBLCAweEE0LCAweEZGLCAweEZGLCAweDA0LCAweDIwLCAweDAyLCAweDAwLCAweEZGLCAweEExLCAweDYxLCAweDAxLAorCSAweDVELCAweEQwLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAwLCAweDM2LCAweDAyLCAweDAwLCAweEM5LCAweDgxLCAweDVBLCAweDAxLCAweDVELCAweEQwLAorCSAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDUwLCAweDM2LCAweDAyLCAweDAwLCAweEZELCAweEExLCAweDUzLCAweDAxLCAweDVELCAweEQwLCAweEZGLCAweEZGLAorCSAweDY0LCAweDQwLCAweEYyLCAweDM2LCAweDA0LCAweDAwLCAweEZDLCAweEExLCAweERBLCAweDYwLCAweDAxLCAweDc4LCAweEZGLCAweEZGLCAweDVELCAweEQwLAorCSAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAxLCAweDM2LCAweDA0LCAweDAwLCAweEZCLCAweEExLCAweERBLCAweDYwLCAweDAxLCAweDc4LCAweEZGLCAweEZGLAorCSAweDVELCAweEQwLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAxLCAweDM2LCAweDA0LCAweDAwLCAweEZBLCAweEExLCAweERBLCAweDYwLCAweDAxLCAweDc4LAorCSAweEZGLCAweEZGLCAweDVELCAweEQwLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAwLCAweDM2LCAweDA0LCAweDAwLCAweEY5LCAweEExLCAweERBLCAweDYwLAorCSAweDAxLCAweDc4LCAweEZGLCAweEZGLCAweDYwLCAweDVDLCAweDAwLCAweDM2LCAweDJBLCAweDAwLCAweDAwLCAweDY0LCAweERCLCAweDYwLCAweDU4LCAweDRFLAorCSAweDE2LCAweDc4LCAweEZGLCAweEZGLCAweDE2LCAweDYwLCAweDVBLCAweEZCLCAweDY0LCAweDQwLCAweDAwLCAweDM2LCAweDI1LCAweDAwLCAweDVELCAweEQyLAorCSAweERELCAweDgxLCAweERCLCAweDYwLCAweDU4LCAweDRFLCAweDE2LCAweDc4LCAweEZGLCAweEZGLCAweDE2LCAweDYwLCAweDVCLCAweEZCLCAweDY0LCAweDQwLAorCSAweDAwLCAweDM2LCAweDFGLCAweDAwLCAweDVELCAweEQyLCAweERELCAweDgxLCAweERCLCAweDYwLCAweDU4LCAweDRFLCAweDE2LCAweDc4LCAweEZGLCAweEZGLAorCSAweDE2LCAweDYwLCAweDVDLCAweEZCLCAweDY0LCAweDQwLCAweDAwLCAweDM2LCAweDE5LCAweDAwLCAweDVELCAweEQwLCAweDE2LCAweDYwLCAweDVELCAweEY5LAorCSAweDVELCAweEQwLCAweDJDLCAweDYwLCAweEJCLCAweDYyLCAweEEyLCAweEQ5LCAweEQ5LCAweDYwLCAweEY5LCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweEZFLAorCSAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweDE2LCAweDYwLCAweDVBLCAweEZCLCAweDIwLCAweEZFLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweDE2LCAweDYwLAorCSAweDVCLCAweEZCLCAweDIwLCAweEZFLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweDE2LCAweDYwLCAweDVDLCAweEZCLCAweDIwLCAweEZFLCAweDAwLCAweDYwLAorCSAweDAwLCAweDY0LCAweDE2LCAweDYwLCAweDVELCAweEZCLCAweEQ5LCAweDYwLCAweEY5LCAweDc4LCAweEZGLCAweEZGLCAweDE2LCAweDYwLCAweDVFLCAweEZCLAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDAzLCAweDAyLCAweDAxLCAweDY0LCAweEEyLCAweERCLCAweDAyLCAweDY0LCAweDAyLCAweEE1LCAweDY0LCAweDQ0LAorCSAweEQ0LCAweDlDLCAweDE2LCAweDYwLCAweDVGLCAweEY5LCAweDJDLCAweDYwLCAweEMwLCAweDYyLCAweEEyLCAweERGLCAweDVELCAweEQwLCAweDAwLCAweDY1LAorCSAweDY0LCAweDQwLCAweDAwLCAweDNBLCAweDAxLCAweDY1LCAweDVELCAweEQwLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDUwLCAweDNBLCAweDAxLCAweDY1LAorCSAweDVELCAweEQwLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweEYyLCAweDNBLCAweDAxLCAweDY1LCAweDVELCAweEQwLCAweDY1LCAweDQwLCAweDAwLCAweDNBLAorCSAweDE3LCAweDAwLCAweDAwLCAweDYwLCAweDAwLCAweDY1LCAweDY0LCAweDQwLCAweDAwLCAweDM2LCAweDAxLCAweDY1LCAweDY0LCAweDQwLCAweDAxLCAweDM2LAorCSAweDAyLCAweDY1LCAweDY0LCAweDQwLCAweDAyLCAweDM2LCAweDA0LCAweDY1LCAweDY0LCAweDQwLCAweDA0LCAweDM2LCAweDEwLCAweDY1LCAweDY0LCAweDQwLAorCSAweDA1LCAweDM2LCAweDIwLCAweDY1LCAweDY1LCAweDVDLCAweDE2LCAweDYwLCAweDYwLCAweEYzLCAweEZGLCAweEZGLCAweEIwLCAweDg0LCAweEEyLCAweERCLAorCSAweDE2LCAweDYwLCAweDVFLCAweEYzLCAweEZGLCAweEZGLCAweEZGLCAweEE0LCAweEEyLCAweERCLCAweEQwLCAweDAyLCAweDE2LCAweDYwLCAweDYwLCAweEYzLAorCSAweDE2LCAweDYwLCAweDVGLCAweEYxLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweDE2LCAweDYwLCAweDUwLCAweEYxLCAweDE2LCAweDYwLAorCSAweDVBLCAweEYzLCAweEZGLCAweEZGLCAweEEwLCAweDg0LCAweEZGLCAweEZGLCAweDEwLCAweDI2LCAweDA5LCAweDAwLCAweDA0LCAweDI2LCAweDA5LCAweDAwLAorCSAweDIwLCAweDI2LCAweDA5LCAweDAwLCAweDAyLCAweDI2LCAweDA5LCAweDAwLCAweEQ5LCAweDYwLCAweEMzLCAweDc4LCAweEZGLCAweEZGLCAweDEwLCAweDdDLAorCSAweDA1LCAweDAwLCAweDA0LCAweDdDLCAweDAzLCAweDAwLCAweDIwLCAweDdDLCAweDAxLCAweDAwLCAweDAyLCAweDdDLCAweDE2LCAweDYwLCAweDU2LCAweEY5LAorCSAweDE2LCAweDYwLCAweDUxLCAweEYxLCAweDE2LCAweDYwLCAweDVCLCAweEYzLCAweDJDLCAweDYwLCAweEFDLCAweDYyLCAweEEwLCAweDg0LCAweEEyLCAweEQxLAorCSAweEZGLCAweEZGLCAweDEwLCAweDI2LCAweDA3LCAweDAwLCAweDA0LCAweDI2LCAweDA3LCAweDAwLCAweDAxLCAweDI2LCAweDBELCAweDAwLCAweEQ5LCAweDYwLAorCSAweEMzLCAweDc4LCAweEZGLCAweEZGLCAweDEwLCAweDdDLCAweDA5LCAweDAwLCAweDY0LCAweDQwLCAweDEwLCAweDIyLCAweDAzLCAweDAwLCAweEQ5LCAweDYwLAorCSAweEMzLCAweDc4LCAweEZGLCAweEZGLCAweDA0LCAweDdDLCAweDAxLCAweDAwLCAweDAxLCAweDdDLCAweDE2LCAweDYwLCAweDU3LCAweEY5LCAweDE2LCAweDYwLAorCSAweDUyLCAweEYxLCAweDE2LCAweDYwLCAweDVDLCAweEYzLCAweEZGLCAweEZGLCAweEEwLCAweDg0LCAweDAyLCAweDI2LCAweDA3LCAweDAwLCAweDA0LCAweDI2LAorCSAweDA3LCAweDAwLCAweDAxLCAweDI2LCAweDA3LCAweDAwLCAweEQ5LCAweDYwLCAweEMzLCAweDc4LCAweEZGLCAweEZGLCAweDAyLCAweDdDLCAweDAzLCAweDAwLAorCSAweDA0LCAweDdDLCAweDAxLCAweDAwLCAweDIwLCAweDdDLCAweDE2LCAweDYwLCAweDU4LCAweEY5LCAweDE2LCAweDYwLCAweDVELCAweEYxLCAweDE2LCAweDYwLAorCSAweDU5LCAweEY5LCAweDE2LCAweDYwLCAweDU4LCAweEYzLCAweDE2LCAweDYwLCAweDU3LCAweEYxLCAweDYwLCAweDQ3LCAweEIwLCAweDg0LCAweDEzLCAweDYwLAorCSAweDQ1LCAweEYxLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAxLCAweDM2LCAweDIyLCAweEJDLCAweEFCLCAweDQ2LCAweDNBLCAweEZBLCAweEFCLCAweDQ2LAorCSAweDE2LCAweDYwLCAweDU2LCAweEYzLCAweDEzLCAweDYwLCAweDQ1LCAweEYxLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAxLCAweDM2LCAweDIyLCAweEJDLAorCSAweDg3LCAweEYxLCAweDY2LCAweDQxLCAweDY0LCAweDQ2LCAweDNBLCAweEZBLCAweEZGLCAweEZGLCAweDYxLCAweDQ2LCAweEFCLCAweDQ2LCAweDgyLCAweEYwLAorCSAweEMwLCAweDY3LCAweEI0LCAweDg0LCAweEFCLCAweDQ2LCAweDBCLCAweEZBLCAweDEzLCAweDYwLCAweDRELCAweEYxLCAweDJELCAweDYwLCAweEJFLCAweDdDLAorCSAweDA0LCAweDFCLCAweEZGLCAweDYwLCAweEZGLCAweDYzLCAweEE0LCAweERELCAweDI2LCAweDAwLCAweDJFLCAweDYwLCAweDM0LCAweDYzLCAweEE0LCAweERELAorCSAweERCLCAweDgzLCAweDYwLCAweEZFLCAweDAwLCAweDY0LCAweEJELCAweERCLCAweDYwLCAweDY0LCAweEJELCAweERCLCAweDFELCAweDY0LCAweEJELCAweERCLAorCSAweEMzLCAweEYzLCAweEJELCAweERCLCAweDIwLCAweEZFLCAweDAxLCAweDYwLCAweDc4LCAweDY0LCAweDA2LCAweDYxLCAweDU4LCAweEQxLCAweEZGLCAweEZGLAorCSAweDYwLCAweEZFLCAweEJELCAweEQ5LCAweDIwLCAweEZFLCAweENELCAweDgxLCAweDYxLCAweDQwLCAweDA4LCAweDI4LCAweEY3LCAweDAxLCAweEI2LCAweEYxLAorCSAweEZGLCAweEZGLCAweDY0LCAweDQ3LCAweDYwLCAweEZFLCAweEJELCAweEQ5LCAweEJELCAweERCLCAweDIwLCAweEZFLCAweDEzLCAweDYwLCAweDRCLCAweEYxLAorCSAweDYwLCAweEZFLCAweEJELCAweEQ5LCAweDIwLCAweEZFLCAweDJELCAweDYwLCAweEJDLCAweDY0LCAweDQwLCAweDQ4LCAweDE4LCAweDYxLCAweDI2LCAweDQ2LAorCSAweDAwLCAweEY0LCAweEZGLCAweDYwLCAweEYyLCAweDY0LCAweEU0LCAweDYwLCAweDU4LCAweDRELCAweEE3LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LAorCSAweDNGLCAweEZDLCAweDJCLCAweDQ2LCAweDU2LCAweEYxLCAweDFGLCAweEY4LCAweDBDLCAweDYwLCAweDcwLCAweEYxLCAweDEwLCAweDYwLCAweDAwLCAweDY0LAorCSAweEEwLCAweDgwLCAweDA2LCAweEYyLCAweDBCLCAweDAzLCAweDEwLCAweEJDLCAweDA2LCAweEZBLCAweDg2LCAweEYzLCAweDAwLCAweDYwLCAweDcwLCAweEYzLAorCSAweDYwLCAweDQ1LCAweEQ0LCAweDgwLCAweERDLCAweDg0LCAweDA3LCAweDA3LCAweEEyLCAweERCLCAweDA1LCAweDAwLCAweDEwLCAweEI1LCAweEZGLCAweEZGLAorCSAweDAyLCAweDAzLCAweEQ0LCAweDg0LCAweDA2LCAweEZBLCAweDA3LCAweEYyLCAweDY2LCAweDQ1LCAweDYwLCAweDQ2LCAweDA2LCAweEYyLCAweDY1LCAweDQ2LAorCSAweDAyLCAweEIwLCAweEZGLCAweEZGLCAweDExLCAweDAzLCAweDI2LCAweDQ2LCAweDg3LCAweEYzLCAweDA3LCAweEZBLCAweDFFLCAweDYwLCAweEQ0LCAweDY0LAorCSAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDI2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLAorCSAweEMxLCAweEZFLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDUwLCAweDAwLCAweDI2LCAweDQ2LCAweDg3LCAweEYzLCAweDA3LCAweEZBLCAweDFFLCAweDYwLAorCSAweEQ0LCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDI2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLAorCSAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDE5LCAweDAwLCAweDAwLCAweDYwLCAweEMwLCAweDY0LCAweDJBLCAweEZBLAorCSAweDAyLCAweDY0LCAweDNGLCAweEZBLCAweDg3LCAweEYzLCAweDA3LCAweEZBLCAweDAwLCAweEY0LCAweDA5LCAweDY0LCAweDA5LCAweEZBLCAweDFFLCAweDYwLAorCSAweEQ0LCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDI2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLAorCSAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDJCLCAweDQzLCAweDBCLCAweDYwLAorCSAweDgyLCAweEYzLCAweERBLCAweDgxLCAweDYwLCAweDQ1LCAweEQ1LCAweDgwLCAweEExLCAweEQxLCAweDExLCAweDAzLCAweEQzLCAweDgwLCAweEQ5LCAweDgxLAorCSAweEZBLCAweDAyLCAweEM5LCAweDgxLCAweEM4LCAweDg1LCAweEQ1LCAweDgwLCAweEE1LCAweEQzLCAweDA4LCAweDI4LCAweEExLCAweERCLCAweDE3LCAweDYwLAorCSAweDA0LCAweDYyLCAweDY1LCAweDQ0LCAweEEyLCAweERCLCAweDRBLCAweEQzLCAweEZGLCAweEZGLCAweENDLCAweDg0LCAweEEyLCAweERCLCAweEFCLCAweDQ2LAorCSAweDA2LCAweEYyLCAweEZGLCAweEZGLCAweDAyLCAweEJDLCAweDA2LCAweEZBLCAweDc4LCAweEYyLCAweDE1LCAweDYwLCAweERDLCAweEYzLCAweDYwLCAweDQ1LAorCSAweEE0LCAweDg0LCAweDE1LCAweDYwLCAweERDLCAweEZCLCAweEFCLCAweDQ2LCAweEFCLCAweDQ2LCAweDBGLCAweDYwLCAweEZGLCAweDY0LCAweDAyLCAweEYwLAorCSAweDcxLCAweEYxLCAweEEwLCAweDg0LCAweEQwLCAweDgwLCAweDAyLCAweEZBLCAweEFCLCAweDQ2LCAweDAxLCAweDA2LCAweDcxLCAweEZCLCAweDI3LCAweDQxLAorCSAweDAxLCAweEIxLCAweEZGLCAweEZGLCAweDA4LCAweDAzLCAweDJCLCAweDQ2LCAweDBCLCAweDU4LCAweDAxLCAweDY1LCAweEU1LCAweDYwLCAweDU4LCAweDRFLAorCSAweDUxLCAweDc4LCAweEZGLCAweEZGLCAweDBBLCAweDAwLCAweDJCLCAweDQ2LCAweDBCLCAweDU4LCAweDE4LCAweDYwLCAweEQ2LCAweDY0LCAweDQwLCAweDU5LAorCSAweDAyLCAweDY1LCAweEU1LCAweDYwLCAweDU4LCAweDRFLCAweDUxLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDAwLCAweEY0LCAweDAwLCAweDY0LCAweDA5LCAweEZBLCAweDBCLCAweEZBLCAweDAxLCAweDdFLCAweDBDLCAweEZBLAorCSAweDBBLCAweDY0LCAweDBBLCAweEZBLCAweDI2LCAweDQ2LCAweDA4LCAweDY0LCAweDNGLCAweEZBLCAweDA3LCAweEYyLCAweDg3LCAweEYxLCAweDQwLCAweDU4LAorCSAweDA3LCAweEY4LCAweDFFLCAweDYwLCAweEQ0LCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDI2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweEZGLCAweDYwLCAweEZELCAweDY1LCAweDM4LCAweDQ2LCAweDA2LCAweEYyLAorCSAweEZGLCAweEZGLCAweEE0LCAweDgzLCAweDA2LCAweEZDLCAweDAyLCAweEIwLCAweDI2LCAweDQ2LCAweDFDLCAweDAzLCAweDM4LCAweDQzLCAweDg2LCAweEYxLAorCSAweDE3LCAweDYwLCAweDAyLCAweDYxLCAweEExLCAweEQzLCAweERBLCAweDgxLCAweEQwLCAweDgwLCAweERDLCAweDlDLCAweDA1LCAweDA1LCAweEExLCAweEQzLAorCSAweDRBLCAweEQ5LCAweEEwLCAweERELCAweERBLCAweDlDLCAweEExLCAweEQ5LCAweDAyLCAweDYwLCAweDAwLCAweDYxLCAweDJDLCAweEYyLCAweEExLCAweERCLAorCSAweDJELCAweEYyLCAweDQxLCAweDU4LCAweDU5LCAweERCLCAweDJFLCAweEYyLCAweDU5LCAweERCLCAweDAzLCAweDY1LCAweEU1LCAweDYwLCAweDU4LCAweDRFLAorCSAweDUxLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA3LCAweEYyLCAweDg3LCAweEYxLAorCSAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDAyLCAweDAyLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDQwLCAweDQ3LCAweDA3LCAweEYyLAorCSAweDY2LCAweDQ1LCAweDYwLCAweDQ2LCAweDA2LCAweEYyLCAweDY1LCAweDQ2LCAweDAyLCAweEIwLCAweEZGLCAweEZGLCAweDFBLCAweDAyLCAweDI3LCAweDQzLAorCSAweDBCLCAweDYwLCAweDgyLCAweEYzLCAweERBLCAweDgxLCAweDYwLCAweDQ1LCAweEQ1LCAweDgwLCAweEExLCAweEQxLCAweDExLCAweDAzLCAweEQzLCAweDgwLAorCSAweEQ5LCAweDgxLCAweEZBLCAweDAyLCAweEM5LCAweDgxLCAweEM4LCAweDg1LCAweEQ1LCAweDgwLCAweEE1LCAweEQzLCAweDA4LCAweDI4LCAweEExLCAweERCLAorCSAweDE3LCAweDYwLCAweDA0LCAweDYyLCAweDY1LCAweDQ0LCAweEEyLCAweERCLCAweDRBLCAweEQzLCAweEZGLCAweEZGLCAweENDLCAweDg0LCAweEEyLCAweERCLAorCSAweDBDLCAweDAwLCAweDI3LCAweDQ0LCAweDQwLCAweDU4LCAweDAzLCAweDY1LCAweEU1LCAweDYwLCAweDU4LCAweDRFLCAweDUxLCAweDc4LCAweEZGLCAweEZGLAorCSAweDI3LCAweDQzLCAweEU3LCAweDYwLCAweDU4LCAweDRFLCAweDgxLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDg3LCAweEY0LCAweDY2LCAweDQxLAorCSAweDYzLCAweDQ2LCAweDA1LCAweEYyLCAweDAwLCAweEYwLCAweDgxLCAweEYwLCAweDAyLCAweDE4LCAweDY0LCAweDQ2LCAweDgxLCAweEY4LCAweDA3LCAweDFCLAorCSAweDE1LCAweDYwLCAweDAyLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQ5LCAweDAyLCAweDAwLCAweDY1LCAweDQ2LAorCSAweDAwLCAweEY4LCAweDg3LCAweEYzLCAweDYzLCAweDQ1LCAweDYwLCAweDQ2LCAweDAwLCAweEYyLCAweEZGLCAweEZGLCAweEQ0LCAweDgwLCAweDAxLCAweDE4LAorCSAweEZBLCAweDA0LCAweDgwLCAweEY4LCAweDY1LCAweDQ2LCAweDAwLCAweEZBLCAweDA2LCAweEYyLCAweEZGLCAweEZGLCAweDAwLCAweDdFLCAweDA2LCAweEZBLAorCSAweDYxLCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA3LCAweEYyLCAweDg3LCAweEYxLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweEZGLCAweEZGLAorCSAweDAyLCAweDAyLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDQwLCAweDQ3LCAweDA3LCAweEYyLCAweDY2LCAweDQ1LCAweDYwLCAweDQ2LCAweDA2LCAweEYyLAorCSAweDY1LCAweDQ2LCAweDAyLCAweEIwLCAweEZGLCAweEZGLCAweDAyLCAweDAyLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI3LCAweDQ2LCAweDA2LCAweEYwLAorCSAweEZGLCAweDYwLCAweEVELCAweDY0LCAweEEwLCAweDg0LCAweDA2LCAweEZBLCAweDI3LCAweDQzLCAweDg2LCAweEYxLCAweDE3LCAweDYwLCAweDAyLCAweDYxLAorCSAweEExLCAweEQzLCAweERBLCAweDgxLCAweEQwLCAweDgwLCAweERDLCAweDlDLCAweDA1LCAweDA1LCAweEExLCAweEQzLCAweDRBLCAweEQ5LCAweEEwLCAweERELAorCSAweERBLCAweDlDLCAweEExLCAweEQ5LCAweDA3LCAweDU4LCAweDAzLCAweDY1LCAweEU1LCAweDYwLCAweDU4LCAweDRFLCAweDUxLCAweDc4LCAweEZGLCAweEZGLAorCSAweDI3LCAweDQzLCAweEU3LCAweDYwLCAweDU4LCAweDRFLCAweDgxLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI2LCAweDQ2LCAweDJGLCAweEYyLCAweDJDLCAweEZBLCAweDMwLCAweEYyLCAweDJELCAweEZBLCAweDMxLCAweEYyLCAweDJFLCAweEZBLCAweENCLCAweEYzLAorCSAweDJGLCAweEZBLCAweENDLCAweEYzLCAweDMwLCAweEZBLCAweENELCAweEYzLCAweDMxLCAweEZBLCAweDY2LCAweEYzLCAweDMyLCAweEZBLCAweDY3LCAweEYzLAorCSAweDMzLCAweEZBLCAweDY4LCAweEYzLCAweDM0LCAweEZBLCAweEFCLCAweEYxLCAweDE5LCAweEY4LCAweDAwLCAweDY1LCAweEVGLCAweDYwLCAweDU4LCAweDRFLAorCSAweERDLCAweDc4LCAweEZGLCAweEZGLCAweDYxLCAweDQ0LCAweDE1LCAweDYwLCAweEMyLCAweEZCLCAweDAyLCAweDYzLCAweDNGLCAweEZDLCAweDAwLCAweDY0LAorCSAweDNFLCAweEZBLCAweDAyLCAweDYwLCAweDAwLCAweDYxLCAweDJDLCAweEYyLCAweEExLCAweERCLCAweDJELCAweEYyLCAweDQxLCAweDU4LCAweDU5LCAweERCLAorCSAweDJFLCAweEYyLCAweDU5LCAweERCLCAweDA2LCAweDYzLCAweDA3LCAweEYyLCAweDg3LCAweEYxLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweEZGLCAweEZGLAorCSAweDBELCAweDAyLCAweDQzLCAweDU5LCAweDAyLCAweDY1LCAweEU1LCAweDYwLCAweDU4LCAweDRFLCAweDI3LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LAorCSAweEMwLCAweDY0LCAweDJBLCAweEZBLCAweDAwLCAweEY0LCAweDA2LCAweDY0LCAweDA5LCAweEZBLCAweDE1LCAweDAwLCAweDA3LCAweEYyLCAweDY2LCAweDQ1LAorCSAweDYwLCAweDQ2LCAweDA2LCAweEYyLCAweDY1LCAweDQ2LCAweDAyLCAweEIwLCAweEZGLCAweEZGLCAweDFELCAweDAyLCAweDA3LCAweDYzLCAweDQzLCAweDU5LAorCSAweDAxLCAweDY1LCAweEU1LCAweDYwLCAweDU4LCAweDRFLCAweDI3LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweEEwLCAweDY0LCAweDJBLCAweEZBLAorCSAweDAwLCAweEY0LCAweDA3LCAweDY0LCAweDA5LCAweEZBLCAweDI2LCAweDQ2LCAweDg3LCAweEYzLCAweDA3LCAweEZBLCAweDFFLCAweDYwLCAweEQ0LCAweDY0LAorCSAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDI2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLAorCSAweEMxLCAweEZFLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweERFLCAweDYwLCAweDY2LCAweDY0LCAweDA4LCAweDYwLAorCSAweDI5LCAweEZCLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDAzLCAweDY0LCAweDA4LCAweDYwLCAweDFGLCAweEZCLCAweERFLCAweDYwLAorCSAweDA1LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDFFLCAweEYxLCAweDAwLCAweDYwLAorCSAweDAyLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDU5LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDcxLCAweEYzLCAweDg3LCAweEY1LAorCSAweERDLCAweDgxLCAweDY2LCAweDQzLCAweDAyLCAweEEzLCAweDYzLCAweDQ2LCAweENELCAweDgxLCAweDA2LCAweEYyLCAweEVFLCAweDAzLCAweDYwLCAweDQwLAorCSAweDA4LCAweDJBLCAweEY3LCAweDAxLCAweDBDLCAweEFDLCAweDA2LCAweEZBLCAweDQ2LCAweDQ5LCAweDAwLCAweDYwLCAweDAyLCAweDYxLCAweEI1LCAweDYwLAorCSAweDU4LCAweDRELCAweEEyLCAweDc4LCAweEZGLCAweEZGLCAweEUxLCAweDAzLCAweDE4LCAweDYwLCAweDEzLCAweEYzLCAweEZGLCAweEZGLCAweDAzLCAweDFCLAorCSAweDAwLCAweDYwLCAweEEwLCAweDY0LCAweDAyLCAweDAwLCAweDAwLCAweDYwLCAweEMwLCAweDY0LCAweDJBLCAweEZBLCAweEFCLCAweEZDLCAweDY2LCAweDQ1LAorCSAweDI5LCAweDQ0LCAweDA3LCAweEZBLCAweDI5LCAweDQ2LCAweDAzLCAweEYyLCAweDA0LCAweEYwLCAweDg1LCAweEYyLCAweDY1LCAweDQ2LCAweDJDLCAweEZBLAorCSAweDJELCAweEY4LCAweEFFLCAweEZBLCAweENCLCAweEYzLCAweDJGLCAweEZBLCAweDMyLCAweEZBLCAweENDLCAweEYzLCAweDMwLCAweEZBLCAweDMzLCAweEZBLAorCSAweENELCAweEYzLCAweDMxLCAweEZBLCAweDM0LCAweEZBLCAweEFCLCAweEYxLCAweDE5LCAweEY4LCAweDE4LCAweDY3LCAweDBFLCAweEZBLCAweDY2LCAweDQxLAorCSAweDI5LCAweDQ2LCAweDkyLCAweEYwLCAweDJDLCAweDYwLCAweDI2LCAweDYzLCAweDQ3LCAweEQzLCAweDYxLCAweDQ2LCAweDAwLCAweDdFLCAweDEzLCAweEZBLAorCSAweDAyLCAweDYzLCAweDNGLCAweEZDLCAweDAwLCAweDY0LCAweDNFLCAweEZBLCAweDY2LCAweDQxLCAweDAwLCAweEY0LCAweDE4LCAweDYwLCAweDEyLCAweEYzLAorCSAweDA5LCAweEZBLCAweDFFLCAweDYwLCAweEUwLCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDYxLCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEM4LCAweEZFLCAweEEwLCAweDAxLCAweDk1LCAweDAxLCAweDAwLCAweDY0LCAweDA4LCAweDYwLAorCSAweDFFLCAweEZCLCAweDVBLCAweERCLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA3LCAweEYwLCAweEZGLCAweEZGLCAweDY0LCAweDQzLCAweDBCLCAweDYwLAorCSAweDgyLCAweEYzLCAweERBLCAweDgxLCAweDYwLCAweDQ1LCAweEQ1LCAweDgwLCAweEExLCAweEQxLCAweDA0LCAweDAzLCAweEQzLCAweDgwLCAweEQ5LCAweDgxLAorCSAweEZBLCAweDAyLCAweDA4LCAweDAwLCAweEExLCAweERELCAweEQ5LCAweDg0LCAweDBCLCAweDYwLCAweDgyLCAweEZCLCAweDRBLCAweEQzLCAweEZGLCAweEZGLAorCSAweERDLCAweDg0LCAweEEyLCAweERCLCAweDY2LCAweDQ1LCAweDYzLCAweDQ2LCAweDA2LCAweEYyLCAweEZGLCAweDYwLCAweDAxLCAweDdDLCAweEEwLCAweDlDLAorCSAweDA2LCAweEY4LCAweDY1LCAweDQ2LCAweDcwLCAweEYzLCAweDYwLCAweDQwLCAweDEwLCAweDJBLCAweDAzLCAweDAwLCAweENDLCAweDg0LCAweDgwLCAweDJCLAorCSAweDcwLCAweEZCLCAweDA4LCAweDYwLCAweDFFLCAweEYxLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDMwLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAwLCAweDYwLCAweDAyLCAweDY0LAorCSAweDA4LCAweDYwLCAweDE5LCAweEZCLCAweERFLCAweDYwLCAweEE4LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDcwLCAweEYzLCAweDcxLCAweEYzLCAweDAwLCAweEE4LCAweDYwLCAweDg4LCAweDQzLCAweDAzLCAweEUwLCAweDgzLCAweDVGLCAweDAzLCAweENCLCAweDgzLAorCSAweDg3LCAweEYzLCAweDcyLCAweEYxLCAweDAyLCAweEE0LCAweDQwLCAweDQ3LCAweDY0LCAweDQ1LCAweDI3LCAweDQ2LCAweDc2LCAweEY0LCAweDEyLCAweEYyLAorCSAweDMzLCAweDE4LCAweEQ0LCAweDgwLCAweDAyLCAweDY0LCAweDMwLCAweDA3LCAweDIzLCAweEZBLCAweDJBLCAweEYyLCAweDBFLCAweEYyLCAweDBDLCAweEIwLAorCSAweDAyLCAweEYwLCAweDBDLCAweDAyLCAweDFFLCAweDYwLCAweEQ0LCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLAorCSAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweEU3LCAweDAxLCAweDYwLCAweDQwLCAweEYwLCAweDM3LAorCSAweDA4LCAweDAwLCAweDA5LCAweDYwLCAweDA4LCAweDY0LCAweEQwLCAweDgwLCAweEEyLCAweEZGLCAweDhGLCAweEYzLCAweDAyLCAweDAyLCAweERDLCAweDg0LAorCSAweDhGLCAweEZCLCAweDFFLCAweDYwLCAweEYyLCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEEzLCAweEZGLCAweENFLCAweEZFLCAweDI1LCAweDYwLCAweEU0LCAweDY0LCAweEU1LCAweDYwLAorCSAweDc4LCAweDQxLCAweEM3LCAweDc4LCAweDk3LCAweEYxLCAweEM5LCAweDAxLCAweDI3LCAweDQ0LCAweDAyLCAweEE0LCAweDQwLCAweDQ3LCAweEM1LCAweDFGLAorCSAweDI4LCAweDQzLCAweENCLCAweDgzLCAweDg3LCAweEYzLCAweDFBLCAweDBFLCAweDAyLCAweEE0LCAweDQwLCAweDRDLCAweDQzLCAweDQ4LCAweDJDLCAweDQ2LAorCSAweDIyLCAweEYyLCAweDcyLCAweEYxLCAweEFDLCAweDg2LCAweDEyLCAweEYyLCAweDBDLCAweDAzLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA5LCAweDA3LAorCSAweDFGLCAweDYwLCAweDIwLCAweDY0LCAweDQwLCAweDRCLCAweEY2LCAweDYwLCAweDU4LCAweDRELCAweEIzLCAweDc4LCAweEZGLCAweEZGLCAweDJDLCAweDQ2LAorCSAweEEyLCAweEZDLCAweDJDLCAweDQ0LCAweDAyLCAweEE0LCAweDI4LCAweDQzLCAweDQwLCAweDRDLCAweEU4LCAweDFGLCAweDhCLCAweDAxLCAweDAxLCAweDYzLAorCSAweDY1LCAweEYzLCAweEFCLCAweEYzLCAweDAwLCAweEJELCAweEFDLCAweDgxLCAweDA2LCAweDAzLCAweDA1LCAweDAzLCAweEI3LCAweDYwLCAweDU4LCAweDRELAorCSAweEMwLCAweDc4LCAweEZGLCAweEZGLCAweDYwLCAweDQzLCAweDVCLCAweEZELCAweDNFLCAweDYzLCAweDE4LCAweDYwLCAweDk0LCAweDYxLCAweDAwLCAweDY0LAorCSAweDU5LCAweERCLCAweEZFLCAweDFGLCAweDcwLCAweEZCLCAweDcxLCAweEZCLCAweDE4LCAweDYwLCAweERDLCAweDY1LCAweEE1LCAweERGLCAweDVBLCAweERGLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweDcwLCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDAzLCAweDAyLAorCSAweENBLCAweDYwLCAweDdFLCAweDc4LCAweEZGLCAweEZGLCAweDA3LCAweEYwLCAweDY2LCAweDQ1LCAweDY0LCAweDQ2LCAweDFGLCAweEYyLCAweDY1LCAweDQ2LAorCSAweDY0LCAweDQ1LCAweDVCLCAweEYxLCAweEUwLCAweDg0LCAweDcyLCAweEYxLCAweEMwLCAweDg0LCAweEMwLCAweDg0LCAweDEyLCAweEZBLCAweDJDLCAweEYyLAorCSAweDcwLCAweEYzLCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDM0LCAweDAwLCAweDAwLCAweEE4LCAweDEzLCAweDYwLCAweDQzLCAweEYzLCAweDM2LCAweDAzLAorCSAweDAwLCAweEE4LCAweEZGLCAweEZGLCAweDMzLCAweDAzLCAweEUxLCAweDYwLCAweDU4LCAweDRELCAweDA0LCAweDc4LCAweEZGLCAweEZGLCAweDI1LCAweDQ2LAorCSAweDA5LCAweDYwLCAweDA4LCAweDYxLCAweEEyLCAweEZGLCAweDBFLCAweEYyLCAweDAyLCAweEYwLCAweDYwLCAweDQwLCAweEYwLCAweDM3LCAweDBELCAweDAwLAorCSAweDkxLCAweEYzLCAweDhGLCAweEYzLCAweERDLCAweDgzLCAweEQxLCAweDgwLCAweDkxLCAweEZELCAweDBDLCAweDAzLCAweDhCLCAweEYzLCAweENDLCAweDgzLAorCSAweEQ4LCAweEEwLCAweDhGLCAweEZELCAweDA3LCAweDA0LCAweEQ0LCAweEZFLCAweDA1LCAweDAwLCAweEQxLCAweDgwLCAweDkyLCAweEYzLCAweDAyLCAweDAzLAorCSAweERDLCAweDg0LCAweDkyLCAweEZCLCAweDFFLCAweDYwLCAweERBLCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDI1LCAweDQ0LCAweDVBLCAweERCLAorCSAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEEzLCAweEZGLCAweERGLCAweDYwLCAweDJBLCAweDc4LCAweEZGLCAweEZGLAorCSAweDY2LCAweDQxLCAweDY1LCAweDQ2LCAweDA2LCAweEYyLCAweDYxLCAweDQ2LCAweDYwLCAweDQwLCAweDEwLCAweDJBLCAweDRCLCAweDAwLCAweDgwLCAweDY3LAorCSAweEI0LCAweDgxLCAweDYxLCAweDQ0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLAorCSAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEUxLCAweDYwLCAweDU4LCAweDRELCAweDA0LCAweDc4LCAweEZGLCAweEZGLCAweDI1LCAweDQ2LCAweDJBLCAweEYyLAorCSAweDA5LCAweDYwLCAweDA4LCAweDYxLCAweDBDLCAweEIwLCAweEEyLCAweEZGLCAweDE3LCAweDAzLCAweDBFLCAweEYyLCAweDAyLCAweEYwLCAweDYwLCAweDQwLAorCSAweEYwLCAweDM3LCAweDBELCAweDAwLCAweDhGLCAweEYzLCAweDkxLCAweEYzLCAweENDLCAweDgzLCAweEQxLCAweDgwLCAweDhGLCAweEZELCAweDBDLCAweDAzLAorCSAweDhCLCAweEYzLCAweERDLCAweDgzLCAweEQ4LCAweEEwLCAweDkxLCAweEZELCAweDA3LCAweDA0LCAweEQ0LCAweEZFLCAweDA1LCAweDAwLCAweEQxLCAweDgwLAorCSAweDkyLCAweEYzLCAweDAyLCAweDAzLCAweERDLCAweDg0LCAweDkyLCAweEZCLCAweDA3LCAweEYwLCAweDBBLCAweEYyLCAweEEzLCAweEZGLCAweDY0LCAweDQ1LAorCSAweDJGLCAweDFCLCAweDY2LCAweDQxLCAweDY1LCAweDQ2LCAweDAyLCAweEYwLCAweDYxLCAweDQ2LCAweDBGLCAweDYwLCAweEZGLCAweDYxLCAweEExLCAweDg0LAorCSAweDYwLCAweDQxLCAweEU5LCAweDgxLCAweEU5LCAweDgxLCAweEU5LCAweDgxLCAweEUxLCAweDgyLCAweDA3LCAweEI0LCAweDAxLCAweDYxLCAweDAzLCAweDAzLAorCSAweENDLCAweDg0LCAweEUxLCAweDgxLCAweEZELCAweDAyLCAweDE4LCAweDYwLCAweDk2LCAweDY1LCAweDQ2LCAweEQxLCAweDYxLCAweDQ0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweDE2LCAweDAwLCAweDFFLCAweDYwLCAweEQ0LCAweDYxLCAweDJBLCAweEYyLCAweDNFLCAweEYyLCAweDBDLCAweEIwLCAweDAxLCAweEIwLAorCSAweDA1LCAweDAzLCAweDFFLCAweDYwLCAweEU2LCAweDYxLCAweDAyLCAweDAyLCAweDFFLCAweDYwLCAweENFLCAweDYxLCAweDYxLCAweDQ0LCAweDBGLCAweDYwLAorCSAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLAorCSAweERGLCAweDYwLCAweDJBLCAweDc4LCAweEZGLCAweEZGLCAweDA3LCAweEYwLCAweDJCLCAweEYyLCAweDJBLCAweEYyLCAweDYwLCAweDQxLCAweDQ0LCAweDQ5LAorCSAweDYwLCAweDQ1LCAweEE0LCAweDNBLCAweDBELCAweDAwLCAweDYxLCAweDQwLCAweEMwLCAweDNCLCAweDc5LCAweDAwLCAweEE5LCAweDQ2LCAweDA2LCAweEYyLAorCSAweEE5LCAweDQ2LCAweDYwLCAweDQwLCAweDIwLCAweDI2LCAweDczLCAweDAwLCAweDIwLCAweEJDLCAweEE5LCAweDQ2LCAweDA2LCAweEZBLCAweEE5LCAweDQ2LAorCSAweEE5LCAweDQ2LCAweDA2LCAweEYwLCAweEE5LCAweDQ2LCAweDY1LCAweDQwLCAweDEwLCAweDJCLCAweDZDLCAweDAwLCAweDY0LCAweDQwLCAweDEwLCAweDJBLAorCSAweDM1LCAweDAwLCAweDY1LCAweDQwLCAweEE0LCAweDNBLCAweDYzLCAweDAwLCAweDI5LCAweDQ1LCAweDY1LCAweDQ2LCAweDc2LCAweEYyLCAweEZGLCAweEZGLAorCSAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDA0LCAweDAyLCAweDc2LCAweDAwLCAweEUwLCAweDYwLCAweEVBLCAweDc4LCAweEZGLCAweEZGLCAweDA5LCAweEYyLAorCSAweDJBLCAweEYwLCAweDAwLCAweEE4LCAweDIwLCAweDY3LCAweDAyLCAweDAzLCAweEIwLCAweDg0LCAweDJBLCAweEZBLCAweDBFLCAweEYyLCAweDAyLCAweEYwLAorCSAweDYwLCAweDQwLCAweEYwLCAweDM3LCAweDA4LCAweDAwLCAweDA5LCAweDYwLCAweDA4LCAweDY0LCAweEQwLCAweDgwLCAweEEyLCAweEZGLCAweDhGLCAweEYzLAorCSAweDAyLCAweDAyLCAweERDLCAweDg0LCAweDhGLCAweEZCLCAweDNFLCAweEYyLCAweEEzLCAweEZGLCAweDAxLCAweEIwLCAweDFFLCAweDYwLCAweEU2LCAweDYxLAorCSAweDAyLCAweDAyLCAweDFFLCAweDYwLCAweEQ0LCAweDYxLCAweDYxLCAweDQ0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLAorCSAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDE2LCAweDAwLCAweDEwLCAweDY0LCAweEIwLCAweDg0LAorCSAweERGLCAweDY1LCAweEE0LCAweDlFLCAweEE5LCAweDQ2LCAweDA2LCAweEZBLCAweEE5LCAweDQ2LCAweEEyLCAweEZGLCAweDA0LCAweDY0LCAweDBDLCAweDYwLAorCSAweDZFLCAweEZCLCAweDI5LCAweDQ0LCAweDVBLCAweERCLCAweDcwLCAweEYzLCAweEMxLCAweEZFLCAweEQ0LCAweEZFLCAweDg2LCAweEYxLCAweEEzLCAweEZGLAorCSAweEQwLCAweDgwLCAweERDLCAweDg0LCAweDAxLCAweDA3LCAweDcwLCAweEZCLCAweEE5LCAweDQ2LCAweDc2LCAweEYyLCAweEE5LCAweDQ2LCAweDY0LCAweDE4LAorCSAweEE5LCAweDQ2LCAweDAyLCAweEYwLCAweEE5LCAweDQ2LCAweDBGLCAweDYwLCAweEZGLCAweDYxLCAweEExLCAweDg0LCAweDYwLCAweDQxLCAweEU5LCAweDgxLAorCSAweEU5LCAweDgxLCAweEU5LCAweDgxLCAweEUxLCAweDgyLCAweDA3LCAweEI0LCAweDAxLCAweDYxLCAweDAzLCAweDAzLCAweENDLCAweDg0LCAweEUxLCAweDgxLAorCSAweEZELCAweDAyLCAweDE4LCAweDYwLCAweDk2LCAweDY1LCAweDQ2LCAweEQxLCAweEZGLCAweEZGLCAweEIxLCAweDg0LCAweEEyLCAweERCLCAweEUxLCAweDYwLAorCSAweDAxLCAweDc4LCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDEwLCAweDJBLCAweEZBLCAweDAxLCAweEZGLCAweDYwLCAweEVGLCAweDY0LCAweEEwLCAweDg0LAorCSAweEE5LCAweDQ2LCAweDA2LCAweEZBLCAweEE5LCAweDQ2LCAweDY1LCAweDQxLCAweDcwLCAweEYzLCAweDI5LCAweDQ1LCAweENDLCAweDg0LCAweDgwLCAweDJCLAorCSAweDcwLCAweEZCLCAweDY1LCAweDQ2LCAweDc2LCAweEYyLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDM2LCAweDAyLCAweDYxLCAweDQwLAorCSAweEE0LCAweDNBLCAweEU1LCAweDAxLCAweDAwLCAweDYwLCAweDNBLCAweDYxLCAweEI1LCAweDYwLCAweDU4LCAweDRELCAweDlGLCAweDc4LCAweEZGLCAweEZGLAorCSAweDgzLCAweDAzLCAweDAyLCAweDYwLCAweDQ4LCAweDY0LCAweDJBLCAweEZBLCAweENCLCAweEYxLCAweDJGLCAweEY4LCAweENDLCAweEYxLCAweDMwLCAweEY4LAorCSAweENELCAweEYxLCAweDMxLCAweEY4LCAweDY2LCAweEYxLCAweDMyLCAweEY4LCAweDY3LCAweEYxLCAweDMzLCAweEY4LCAweDY4LCAweEYxLCAweDM0LCAweEY4LAorCSAweEE5LCAweDQ2LCAweDAzLCAweEYyLCAweDA0LCAweEYwLCAweDg1LCAweEYwLCAweEE5LCAweDQ2LCAweDJDLCAweEZBLCAweDJELCAweEY4LCAweEFFLCAweEY4LAorCSAweEFCLCAweEYxLCAweDE5LCAweEY4LCAweEZGLCAweDY3LCAweDBFLCAweEZBLCAweDAwLCAweDY0LCAweDNFLCAweEZBLCAweDNGLCAweEZBLCAweDI5LCAweDQ0LAorCSAweDA3LCAweEZBLCAweDFFLCAweDYwLCAweEQ0LCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDM1LCAweDAwLCAweDgwLCAweDY3LCAweEI0LCAweDgzLCAweDJBLCAweEYyLAorCSAweDA5LCAweDYwLCAweDA4LCAweDY1LCAweDBDLCAweEIwLCAweDA5LCAweEYwLCAweDBDLCAweDAyLCAweDFFLCAweDYwLCAweEQ0LCAweDY0LCAweDBGLCAweDYwLAorCSAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDlGLCAweDE4LAorCSAweDY0LCAweDQ2LCAweDNFLCAweEYyLCAweEEyLCAweEZGLCAweDAxLCAweEIwLCAweDFFLCAweDYwLCAweEU2LCAweDYxLCAweDAyLCAweDAyLCAweDFFLCAweDYwLAorCSAweENFLCAweDYxLCAweDAyLCAweEYyLCAweDBFLCAweEYwLCAweEQ0LCAweDgwLCAweDA5LCAweEY0LCAweDA2LCAweDAyLCAweDhGLCAweEYzLCAweDY0LCAweDQwLAorCSAweEYwLCAweDM3LCAweDAyLCAweDAwLCAweERDLCAweDg0LCAweDhGLCAweEZCLCAweDY2LCAweDQ0LCAweDAwLCAweEE4LCAweEZGLCAweEZGLCAweEYxLCAweDAyLAorCSAweDYxLCAweDQ0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDVBLCAweERELCAweDA4LCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLAorCSAweEMxLCAweEZFLCAweEEzLCAweEZGLCAweEE5LCAweDQ2LCAweDAyLCAweEYwLCAweEE5LCAweDQ2LCAweDBGLCAweDYwLCAweEZGLCAweDYxLCAweEExLCAweDg0LAorCSAweDYwLCAweDQxLCAweEU5LCAweDgxLCAweEU5LCAweDgxLCAweEU5LCAweDgxLCAweEUxLCAweDgyLCAweDA3LCAweEI0LCAweDAxLCAweDYxLCAweDAzLCAweDAzLAorCSAweENDLCAweDg0LCAweEUxLCAweDgxLCAweEZELCAweDAyLCAweDE4LCAweDYwLCAweDk2LCAweDY1LCAweDQ2LCAweEQzLCAweDlELCAweDg1LCAweEE0LCAweDg0LAorCSAweEEyLCAweERCLCAweDI2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDQ2LCAweDQ1LCAweDNGLCAweEYyLCAweDA1LCAweDQ4LCAweDAwLCAweEE4LAorCSAweDYwLCAweDQxLCAweDY2LCAweDQ0LCAweDBCLCAweDAzLCAweDBFLCAweEExLCAweDAwLCAweEYyLCAweDQyLCAweEZFLCAweEFDLCAweDg2LCAweDAxLCAweEYyLAorCSAweDFGLCAweDAzLCAweDdGLCAweEI1LCAweEQ1LCAweDgxLCAweDY2LCAweDQ0LCAweEY3LCAweDA3LCAweDI1LCAweDQ2LCAweDA1LCAweEYwLCAweDA2LCAweEZBLAorCSAweDA1LCAweEZBLCAweEQwLCAweDgwLCAweDY0LCAweDQzLCAweDEzLCAweDAzLCAweDYwLCAweDQ2LCAweDAxLCAweEYwLCAweDgwLCAweDY3LCAweEIwLCAweDg0LAorCSAweDAxLCAweEZBLCAweDAwLCAweEYwLCAweDAwLCAweDY0LCAweDAwLCAweEZBLCAweDQ0LCAweDQ1LCAweEEyLCAweEZGLCAweEI2LCAweDYwLCAweDU4LCAweDRFLAorCSAweDcyLCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweEZGLCAweDA4LCAweDQ1LCAweDI1LCAweDQ2LCAweDAxLCAweDY0LCAweDAyLCAweEZBLCAweDAyLCAweEZFLAorCSAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDA3LCAweEYwLCAweDEwLCAweEIwLCAweDEwLCAweEFDLCAweDNBLCAweDAzLCAweDIzLCAweEZBLAorCSAweDgwLCAweDY3LCAweEIwLCAweDgxLCAweDYxLCAweDQ0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDA0LCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDQ2LCAweDQ1LCAweDY0LCAweDQ2LCAweDAyLCAweEYwLCAweDBGLCAweDYwLCAweEZGLCAweDYxLAorCSAweEExLCAweDg0LCAweDYwLCAweDQxLCAweEU5LCAweDgxLCAweEU5LCAweDgxLCAweEU5LCAweDgxLCAweEUxLCAweDgyLCAweDA3LCAweEI0LCAweDAxLCAweDYxLAorCSAweDAzLCAweDAzLCAweENDLCAweDg0LCAweEUxLCAweDgxLCAweEZELCAweDAyLCAweDE4LCAweDYwLCAweDk2LCAweDY1LCAweDQ2LCAweEQxLCAweEZGLCAweEZGLAorCSAweEIxLCAweDg0LCAweEEyLCAweERCLCAweDlGLCAweEYyLCAweDI1LCAweDQ2LCAweEUxLCAweDgxLCAweDVCLCAweEYxLCAweDcyLCAweEYxLCAweEMxLCAweDgxLAorCSAweEMxLCAweDgxLCAweDkyLCAweEZBLCAweEEyLCAweEZGLCAweDAyLCAweEYwLCAweDA5LCAweDYwLCAweDA4LCAweDYxLCAweEQxLCAweDgwLCAweDBFLCAweEYyLAorCSAweDA1LCAweDAyLCAweDhGLCAweEYzLCAweDIwLCAweEIwLCAweENDLCAweDg0LCAweDAxLCAweDAyLCAweDhGLCAweEZCLCAweEEzLCAweEZGLCAweDQ4LCAweEZFLAorCSAweDA3LCAweDAwLCAweDBFLCAweEYyLCAweDA4LCAweEZFLCAweEYwLCAweDdGLCAweDYwLCAweDQwLCAweDIwLCAweDJBLCAweDAwLCAweDdGLCAweDBFLCAweEZBLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweEM1LCAweDYxLCAweEI1LCAweDYwLCAweDU4LCAweDRELCAweEEyLCAweDc4LCAweEZGLCAweEZGLAorCSAweDY2LCAweDQ0LCAweDU3LCAweEZCLCAweDA0LCAweDY0LCAweDAzLCAweEZBLCAweDgwLCAweDY0LCAweDJBLCAweEZBLCAweEFCLCAweEYxLCAweDE5LCAweEY4LAorCSAweDAwLCAweDY0LCAweDNFLCAweEZBLCAweDAwLCAweDYwLCAweDgwLCAweDY0LCAweDBFLCAweEZBLCAweDg3LCAweEYxLCAweDA3LCAweEY4LCAweDY3LCAweDQ0LAorCSAweDJDLCAweEZBLCAweDJELCAweEZBLCAweDJFLCAweEZBLCAweEU0LCAweDYwLCAweDY1LCAweDY0LCAweDA4LCAweDYwLCAweDI1LCAweEZCLCAweEUyLCAweDYwLAorCSAweEEwLCAweDY0LCAweDA4LCAweDYwLCAweDJCLCAweEZCLCAweDE4LCAweDYwLCAweEU2LCAweDYzLCAweDY1LCAweDQ0LCAweEJELCAweERCLCAweDEwLCAweDYwLAorCSAweDU4LCAweDY0LCAweEJELCAweERCLCAweDAyLCAweDY0LCAweEJELCAweERCLCAweDA2LCAweDY0LCAweEEzLCAweERCLCAweEU5LCAweDYwLCAweEIyLCAweDc4LAorCSAweEZGLCAweEZGLCAweEU5LCAweDYwLCAweDU4LCAweDRELCAweEJFLCAweDc4LCAweEZGLCAweEZGLCAweDU3LCAweEY1LCAweENCLCAweEYxLCAweDJGLCAweEY4LAorCSAweENDLCAweEYxLCAweDMwLCAweEY4LCAweENELCAweEYxLCAweDMxLCAweEY4LCAweDY2LCAweEYxLCAweDMyLCAweEY4LCAweDY3LCAweEYxLCAweDMzLCAweEY4LAorCSAweDY4LCAweEYxLCAweDM0LCAweEY4LCAweDEzLCAweDYwLCAweDQ1LCAweEYxLCAweDAxLCAweDY0LCAweDY0LCAweDQwLCAweEZFLCAweDI2LCAweDEwLCAweEJDLAorCSAweDMyLCAweDQwLCAweDEwLCAweDI2LCAweDEwLCAweEJDLCAweDIwLCAweEJDLCAweDA0LCAweDYwLCAweDAwLCAweDY1LCAweDYwLCAweDQ0LCAweEI0LCAweDg0LAorCSAweDE3LCAweDYwLCAweDIyLCAweEZCLCAweDEzLCAweDYwLCAweDQ0LCAweEYxLCAweDI2LCAweDYwLCAweDE2LCAweDY0LCAweDAyLCAweDE4LCAweDI2LCAweDYwLAorCSAweDM4LCAweDY0LCAweDE2LCAweDYwLCAweEJGLCAweEZCLCAweDE2LCAweDYwLCAweENGLCAweEZCLCAweDJDLCAweDYwLCAweDg0LCAweDYxLCAweDEzLCAweDYwLAorCSAweDk3LCAweEYzLCAweDJELCAweDYwLCAweDVFLCAweDY1LCAweEZFLCAweEE0LCAweEUwLCAweDg0LCAweDAyLCAweDA1LCAweDY3LCAweDQ0LCAweDIxLCAweDAwLAorCSAweEUwLCAweDg0LCAweEM0LCAweDg1LCAweDE2LCAweDYwLCAweDU1LCAweEYzLCAweEE1LCAweEQxLCAweERBLCAweDg1LCAweEEwLCAweDgzLCAweDE2LCAweDYwLAorCSAweDUxLCAweEZELCAweEE1LCAweEQxLCAweDJDLCAweDYwLCAweEEwLCAweDYyLCAweEEwLCAweDgzLCAweEEyLCAweERELCAweDJDLCAweDYwLCAweDg0LCAweDYxLAorCSAweDUwLCAweDYwLCAweDAwLCAweDdDLCAweDAwLCAweDYwLCAweEYyLCAweDY1LCAweEUyLCAweDYwLCAweDU4LCAweDRELCAweDA2LCAweDc4LCAweEZGLCAweEZGLAorCSAweDE2LCAweDYwLCAweDUzLCAweEYxLCAweDU5LCAweEQ5LCAweDJDLCAweDYwLCAweDdFLCAweDY1LCAweEQ1LCAweDg0LCAweERELCAweDdGLCAweEE1LCAweERCLAorCSAweDY1LCAweDQ0LCAweDE2LCAweDYwLCAweEM0LCAweEZCLCAweDE2LCAweDYwLCAweEQ0LCAweEZCLCAweDc5LCAweDAwLCAweDE2LCAweDYwLCAweDU0LCAweEYzLAorCSAweDJDLCAweDYwLCAweEEwLCAweDYyLCAweEZELCAweEEwLCAweEEyLCAweEQzLCAweEVFLCAweDAzLCAweDYwLCAweDQwLCAweDAyLCAweDJBLCAweDAyLCAweDAwLAorCSAweDAxLCAweDYzLCAweDBCLCAweDAwLCAweDA0LCAweDJBLCAweDAyLCAweDAwLCAweDAyLCAweDYzLCAweDA3LCAweDAwLCAweDEwLCAweDJBLCAweDAyLCAweDAwLAorCSAweDA0LCAweDYzLCAweDAzLCAweDAwLCAweDIwLCAweDJBLCAweDAxLCAweDAwLCAweDA1LCAweDYzLCAweDYzLCAweDQ3LCAweEI0LCAweDgzLCAweDU5LCAweEQ5LAorCSAweDU5LCAweERELCAweDE2LCAweDYwLCAweDU0LCAweEYzLCAweDE2LCAweDYwLCAweDUxLCAweEYzLCAweEZFLCAweEEwLCAweDQwLCAweDRDLCAweEQzLCAweDAzLAorCSAweDAwLCAweDYwLCAweDAwLCAweDYzLCAweDU5LCAweERELCAweDQxLCAweDRBLCAweDJDLCAweDQwLCAweDAxLCAweDJBLCAweDA1LCAweDAwLCAweDAwLCAweDYzLAorCSAweDYzLCAweDQ3LCAweEI0LCAweDgzLCAweDU5LCAweEQ5LCAweDU5LCAweERELCAweDJDLCAweDQwLCAweDAyLCAweDJBLCAweDAzLCAweDAwLCAweDAxLCAweDYzLAorCSAweDU5LCAweEQ5LCAweDU5LCAweERELCAweDJDLCAweDQwLCAweDA0LCAweDJBLCAweDA1LCAweDAwLCAweDAyLCAweDYzLCAweDYzLCAweDQ3LCAweEI0LCAweDgzLAorCSAweDU5LCAweEQ5LCAweDU5LCAweERELCAweDJDLCAweDQwLCAweDEwLCAweDJBLCAweDA1LCAweDAwLCAweDA0LCAweDYzLCAweDYzLCAweDQ3LCAweEI0LCAweDgzLAorCSAweDU5LCAweEQ5LCAweDU5LCAweERELCAweDJDLCAweDQwLCAweDIwLCAweDJBLCAweDA1LCAweDAwLCAweDA1LCAweDYzLCAweDYzLCAweDQ3LCAweEI0LCAweDgzLAorCSAweDU5LCAweEQ5LCAweDU5LCAweERELCAweDJBLCAweDQ0LCAweDUxLCAweDkzLCAweEVCLCAweDgzLCAweEVCLCAweDgzLCAweEEwLCAweERELCAweDE2LCAweDYwLAorCSAweDU0LCAweEYzLCAweDE2LCAweDYwLCAweDUyLCAweEYzLCAweEZGLCAweEEwLCAweDQwLCAweDRDLCAweDlELCAweDAzLCAweDU5LCAweERGLCAweDQxLCAweDRBLAorCSAweDJDLCAweDQwLCAweDAxLCAweDJBLCAweDA1LCAweDAwLCAweDAwLCAweDYzLCAweDYzLCAweDQ3LCAweEI0LCAweDgzLCAweDU5LCAweEQ5LCAweDU5LCAweERELAorCSAweDJDLCAweDQwLCAweDAyLCAweDJBLCAweDA1LCAweDAwLCAweDAxLCAweDYzLCAweDYzLCAweDQ3LCAweEI0LCAweDgzLCAweDU5LCAweEQ5LCAweDU5LCAweERELAorCSAweDJDLCAweDQwLCAweDA0LCAweDJBLCAweDA1LCAweDAwLCAweDAyLCAweDYzLCAweDYzLCAweDQ3LCAweEI0LCAweDgzLCAweDU5LCAweEQ5LCAweDU5LCAweERELAorCSAweDJBLCAweDQ0LCAweDUxLCAweDkzLCAweEVCLCAweDgzLCAweEVCLCAweDgzLCAweEEwLCAweERELCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDU3LCAweEY1LAorCSAweENCLCAweEYzLCAweENDLCAweEYxLCAweDAwLCAweDYzLCAweEMwLCAweDg3LCAweENELCAweEYxLCAweDVBLCAweEZELCAweEMwLCAweDg1LCAweDY1LCAweDQ3LAorCSAweEM0LCAweDg0LCAweDA3LCAweEI1LCAweDE4LCAweDYwLCAweEUyLCAweDY0LCAweDBGLCAweDYwLCAweEE1LCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLAorCSAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDEwLCAweDYwLCAweDI0LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAwLCAweDYwLCAweDAyLCAweDY0LAorCSAweDA4LCAweDYwLCAweDEzLCAweEZCLCAweEUyLCAweDYwLCAweEE5LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDA4LCAweDYwLCAweDEyLCAweEYxLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDI0LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDU3LCAweEY1LCAweDAwLCAweDY0LCAweDk0LCAweEZCLAorCSAweDk1LCAweEZCLCAweDk2LCAweEZCLCAweDc0LCAweEZCLCAweDY1LCAweEYzLCAweDAwLCAweDc1LCAweDAwLCAweDcyLCAweEUwLCAweDg0LCAweEUwLCAweDg0LAorCSAweEUwLCAweDkzLCAweEM3LCAweEYzLCAweEVELCAweEUyLCAweENDLCAweDg0LCAweDVBLCAweEZCLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweDA4LCAweDYwLAorCSAweDEzLCAweEZCLCAweEUyLCAweDYwLCAweEM3LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLAorCSAweDI0LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDY0LCAweEYxLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAxLCAweDJCLCAweDA1LCAweDAwLAorCSAweDY3LCAweDQ0LCAweDE2LCAweDYwLCAweEMxLCAweEZCLCAweDE2LCAweDYwLCAweEQxLCAweEZCLCAweDE2LCAweDYwLCAweEY2LCAweEY5LCAweDJELCAweDYwLAorCSAweDg2LCAweDY1LCAweEU0LCAweDYwLCAweDU4LCAweDRELCAweEU3LCAweDc4LCAweEZGLCAweEZGLCAweDY0LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLAorCSAweDAxLCAweDJCLCAweDA1LCAweDAwLCAweEZGLCAweDYwLCAweEZGLCAweDYzLCAweDE2LCAweDYwLCAweEM1LCAweEZELCAweDA4LCAweDAwLCAweDJFLCAweDYwLAorCSAweDFFLCAweDYzLCAweDE2LCAweDYwLCAweEM1LCAweEZELCAweEU0LCAweDYwLCAweDU4LCAweDRELCAweEZGLCAweDc4LCAweEZGLCAweEZGLCAweEU0LCAweDYwLAorCSAweDU4LCAweDRELCAweDZFLCAweDc4LCAweEZGLCAweEZGLCAweEU1LCAweDYwLCAweDU4LCAweDRELCAweDE4LCAweDc4LCAweEZGLCAweEZGLCAweDU3LCAweEY1LAorCSAweDAwLCAweEY0LCAweDY1LCAweEYxLCAweDA2LCAweEY4LCAweDE3LCAweDYwLCAweDIyLCAweEYzLCAweDE1LCAweDYwLCAweERELCAweEYxLCAweEZCLCAweDYwLAorCSAweEZGLCAweDY1LCAweDYwLCAweDQ0LCAweEE0LCAweDg0LCAweDYwLCAweDQ3LCAweDY0LCAweDQwLCAweDEwLCAweDI2LCAweDA0LCAweEJDLCAweDYwLCAweDQ3LAorCSAweDA3LCAweEZBLCAweDJELCAweDYwLCAweDdFLCAweDY0LCAweDQwLCAweDQ4LCAweDEwLCAweDYxLCAweDAwLCAweDYwLCAweDAwLCAweDY0LCAweEU0LCAweDYwLAorCSAweDU4LCAweDRELCAweEE3LCAweDc4LCAweEZGLCAweEZGLCAweDU3LCAweEY1LCAweDNGLCAweEZDLCAweDVBLCAweEYzLCAweEM3LCAweEYxLCAweEFDLCAweDgzLAorCSAweDAxLCAweDY0LCAweDAyLCAweDAyLCAweDZCLCAweEZCLCAweDY0LCAweDQzLCAweDFFLCAweDYwLCAweEQ0LCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLAorCSAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDA0LCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweENGLCAweDgzLAorCSAweDcyLCAweEYzLCAweDVBLCAweEZELCAweERDLCAweDg0LCAweDcyLCAweEZCLCAweDVDLCAweEYzLCAweEZGLCAweEZGLCAweENDLCAweDg0LCAweDVDLCAweEZCLAorCSAweDAzLCAweDAzLCAweEUzLCAweDYwLCAweEJELCAweDc4LCAweEZGLCAweEZGLCAweDBBLCAweDY0LCAweDVDLCAweEZCLCAweEEyLCAweDRDLCAweDIwLCAweDI3LAorCSAweEY4LCAweDAxLCAweDQ2LCAweDYwLCAweDUwLCAweDY1LCAweDcyLCAweDQ0LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweEYyLCAweDA0LCAweDVELCAweEZCLAorCSAweDQwLCAweDQ4LCAweDk0LCAweEYzLCAweDVFLCAweEZCLCAweDQwLCAweDRBLCAweDk1LCAweEYzLCAweDk2LCAweEYzLCAweDQwLCAweDRDLCAweDYwLCAweDQxLAorCSAweDY1LCAweEYxLCAweDQwLCAweDYzLCAweEFELCAweDgwLCAweEYwLCAweEEzLCAweDA5LCAweDAyLCAweDNDLCAweDAzLCAweDJDLCAweDQxLCAweDJBLCAweDQ0LAorCSAweDQwLCAweDRDLCAweDI4LCAweDQ0LCAweDQwLCAweDRBLCAweDAwLCAweDY0LCAweDQwLCAweDQ4LCAweEY0LCAweDAxLCAweEQxLCAweDgwLCAweDAxLCAweDAyLAorCSAweDMxLCAweDA0LCAweDEwLCAweEEzLCAweDgwLCAweDYwLCAweDAwLCAweDY1LCAweEE1LCAweDgwLCAweENGLCAweDgzLCAweDA4LCAweDAyLCAweDI4LCAweDQ0LAorCSAweDYwLCAweDg4LCAweDJBLCAweDQ0LCAweDcwLCAweDhBLCAweDJDLCAweDQ0LCAweDcwLCAweDhDLCAweEYxLCAweDgxLCAweEY1LCAweDAxLCAweEU3LCAweEEzLAorCSAweDY0LCAweDQ0LCAweDAwLCAweEEwLCAweDAwLCAweDYyLCAweDAyLCAweDAyLCAweDAwLCAweDYxLCAweDFDLCAweDAwLCAweEUwLCAweDg0LCAweERFLCAweDgyLAorCSAweEZELCAweDA0LCAweDQyLCAweEZFLCAweEY4LCAweDg0LCAweDYyLCAweDQ1LCAweEM3LCAweDgzLCAweDYwLCAweDQ1LCAweDAyLCAweEZFLCAweEQ1LCAweDg0LAorCSAweDAyLCAweDA1LCAweDAxLCAweDA1LCAweDYxLCAweDQ0LCAweENGLCAweDgzLCAweDYwLCAweDQxLCAweDA4LCAweDAzLCAweDI4LCAweDQ0LCAweDYwLCAweDg4LAorCSAweDJBLCAweDQ0LCAweDcwLCAweDhBLCAweDJDLCAweDQ0LCAweDcwLCAweDhDLCAweEYxLCAweDgxLCAweEYxLCAweDAxLCAweENFLCAweDgyLCAweEU5LCAweDgxLAorCSAweEZELCAweDAyLCAweEYxLCAweDgxLCAweDYxLCAweDQ0LCAweDAwLCAweEE4LCAweEZGLCAweEZGLCAweDJGLCAweDAzLCAweDczLCAweDQwLCAweDVELCAweEYzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDVFLCAweEYzLCAweDNGLCAweEI1LCAweEUwLCAweDg0LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEI0LCAweDg0LCAweDYxLCAweDQ1LCAweEQ0LCAweDg0LCAweEMwLCAweDg0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDgxLCAweDY0LCAweDQ0LCAweDczLCAweDQ1LCAweEUwLCAweDg0LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweEM0LCAweDg1LCAweDYxLCAweDQ0LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDBGLCAweDAzLCAweDYwLCAweDUzLCAweEQ0LCAweDg0LAorCSAweEZGLCAweEZGLCAweDc0LCAweEYzLCAweEZGLCAweEZGLCAweERDLCAweDg0LCAweDAxLCAweEI0LCAweDc0LCAweEZCLCAweDEzLCAweDYwLCAweDA2LCAweEYzLAorCSAweEZGLCAweEZGLCAweERDLCAweDg0LCAweDAwLCAweDM2LCAweDAwLCAweDNCLCAweEEyLCAweERCLCAweEU5LCAweDYwLCAweEZCLCAweDc4LCAweEZGLCAweEZGLAorCSAweEMxLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA0LCAweDY0LCAweDAzLCAweEZBLCAweDAwLCAweEY0LCAweDA5LCAweEYyLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQ3LCAweDAwLCAweDNBLCAweDFDLCAweDAwLCAweDYwLCAweDQzLCAweDAwLCAweDM2LCAweDFDLCAweDAwLCAweEUwLCAweEEwLCAweERBLCAweDg1LAorCSAweDE2LCAweDA3LCAweDI2LCAweDYwLCAweDE2LCAweDYxLCAweEExLCAweEQxLCAweEZGLCAweEZGLCAweEQzLCAweDgwLCAweENCLCAweDgzLCAweDBGLCAweDAyLAorCSAweDA3LCAweDBFLCAweDU5LCAweEQzLCAweEE1LCAweEQwLCAweERBLCAweDg1LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA4LCAweDAyLCAweEY5LCAweDFGLAorCSAweDEyLCAweDFFLCAweEE1LCAweEQwLCAweDU5LCAweEQzLCAweEZGLCAweEZGLCAweDkwLCAweDgwLCAweEZGLCAweDIyLCAweDBDLCAweDAwLCAweEU0LCAweDYwLAorCSAweDYzLCAweDc4LCAweEZGLCAweEZGLCAweDEzLCAweDYwLCAweDQ0LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDAzLCAweDAwLAorCSAweDI2LCAweDYwLCAweDM4LCAweDY0LCAweDAyLCAweDAwLCAweDI2LCAweDYwLCAweDE2LCAweDY0LCAweDE2LCAweDYwLCAweENGLCAweEZCLCAweDI2LCAweDQ2LAorCSAweDJGLCAweEYyLCAweDJDLCAweEZBLCAweDMwLCAweEYyLCAweDJELCAweEZBLCAweDMxLCAweEYyLCAweDJFLCAweEZBLCAweENCLCAweEYxLCAweDJGLCAweEY4LAorCSAweENDLCAweEYxLCAweDMwLCAweEY4LCAweENELCAweEYxLCAweDMxLCAweEY4LCAweDY2LCAweEYxLCAweDMyLCAweEY4LCAweDY3LCAweEYxLCAweDMzLCAweEY4LAorCSAweDY4LCAweEYxLCAweDM0LCAweEY4LCAweDAwLCAweDY1LCAweEVGLCAweDYwLCAweDU4LCAweDRFLCAweERDLCAweDc4LCAweEZGLCAweEZGLCAweDYxLCAweDQ0LAorCSAweDE1LCAweDYwLCAweEMyLCAweEZCLCAweDUwLCAweDYzLCAweDJBLCAweEZDLCAweEFCLCAweEYzLCAweDE5LCAweEZBLCAweDAwLCAweDY0LCAweDNFLCAweEZBLAorCSAweDg3LCAweEYzLCAweDA3LCAweEZBLCAweDAwLCAweEY0LCAweDY1LCAweEYxLCAweDA2LCAweEY4LCAweDE3LCAweDYwLCAweDIyLCAweEYzLCAweDE1LCAweDYwLAorCSAweERELCAweEYxLCAweEZCLCAweDYwLCAweEZGLCAweEI3LCAweDY0LCAweDQwLCAweDEwLCAweDI2LCAweDA0LCAweEJDLCAweDYwLCAweDQ3LCAweDA3LCAweEZBLAorCSAweDJELCAweDYwLCAweEE2LCAweDY1LCAweEU0LCAweDYwLCAweDU4LCAweDRELCAweEU3LCAweDc4LCAweEZGLCAweEZGLCAweDY0LCAweEYzLCAweDJFLCAweDYwLAorCSAweDFFLCAweDYzLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDY3LCAweDQzLCAweDE2LCAweDYwLCAweEQ1LCAweEZELCAweDJELCAweDYwLCAweDlFLCAweDY0LAorCSAweDQwLCAweDQ4LCAweDEwLCAweDYxLCAweDAwLCAweDYwLCAweDAwLCAweDY0LCAweEU0LCAweDYwLCAweDU4LCAweDRELCAweEE3LCAweDc4LCAweEZGLCAweEZGLAorCSAweDI2LCAweDQ2LCAweDNGLCAweEZDLCAweDFFLCAweDYwLCAweEQ0LCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDI2LCAweDQ0LCAweDVBLCAweERCLAorCSAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDIwLCAweDQ0LCAweDgwLCAweDI2LCAweDExLCAweDAwLAorCSAweDgwLCAweEJDLCAweDQwLCAweDQwLCAweDAwLCAweDY0LCAweDk0LCAweEZCLCAweDk1LCAweEZCLCAweDk2LCAweEZCLCAweDc0LCAweEZCLCAweDY1LCAweEYzLAorCSAweDAwLCAweDc1LCAweDAwLCAweDcyLCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDkzLCAweEM3LCAweEYzLCAweEVELCAweEUyLCAweENDLCAweDg0LAorCSAweDVBLCAweEZCLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDEyLCAweEZCLAorCSAweDVBLCAweERCLCAweDAwLCAweDY0LCAweDcyLCAweEZCLCAweDc0LCAweEZCLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDNFLCAweDYzLCAweDE4LCAweDYwLAorCSAweDk0LCAweDYxLCAweDU5LCAweEQxLCAweDYxLCAweDQ2LCAweDA3LCAweDFCLCAweEZDLCAweDFGLCAweDJELCAweDYwLCAweEM4LCAweDYyLCAweEEyLCAweERGLAorCSAweDAxLCAweDY1LCAweDAwLCAweDYxLCAweDE2LCAweDAwLCAweDE4LCAweDYwLCAweEQ2LCAweDYxLCAweDQ5LCAweEQxLCAweENCLCAweDgzLCAweEZELCAweDE4LAorCSAweDYzLCAweDQxLCAweDA0LCAweEExLCAweDYxLCAweDQ1LCAweDY2LCAweDQzLCAweDJELCAweDYwLCAweEM4LCAweDY0LCAweERDLCAweDg0LCAweDYwLCAweEZFLAorCSAweEJELCAweEQxLCAweEEwLCAweEQ5LCAweENELCAweDgxLCAweDIwLCAweEZFLCAweEY5LCAweDAyLCAweDY2LCAweDQ0LCAweDE4LCAweDYwLCAweDk2LCAweDdDLAorCSAweEQwLCAweDgxLCAweDVBLCAweEYzLCAweEM3LCAweEYxLCAweDJELCAweDYwLCAweEM2LCAweDYzLCAweDAwLCAweEEwLCAweDY0LCAweDVGLCAweEJELCAweERCLAorCSAweDBGLCAweDYwLCAweDZELCAweEYxLCAweDAyLCAweDAyLCAweDAxLCAweDE4LCAweDAxLCAweEI5LCAweDYxLCAweDQ0LCAweDYwLCAweEZFLCAweEEzLCAweERCLAorCSAweEZDLCAweEEzLCAweDY1LCAweDQ0LCAweDAzLCAweEE0LCAweEEzLCAweERCLCAweDIwLCAweEZFLCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDE3LCAweDYwLAorCSAweDIzLCAweEZCLCAweENELCAweDgxLCAweDI4LCAweEQzLCAweDVBLCAweDg4LCAweERDLCAweDgzLCAweDMxLCAweDE4LCAweEZCLCAweDAzLCAweDYxLCAweDQwLAorCSAweDdGLCAweDNBLCAweDA2LCAweDAwLCAweDE3LCAweDYwLCAweDIzLCAweEYzLCAweDAzLCAweDYxLCAweDdDLCAweEE0LCAweEEyLCAweERCLCAweDAwLCAweEY0LAorCSAweDYwLCAweEZFLCAweEEzLCAweEQxLCAweDVELCAweEQ4LCAweDYxLCAweDQwLCAweDdGLCAweDNBLCAweDA4LCAweDAwLCAweDIwLCAweEZFLCAweDE3LCAweDYwLAorCSAweDIzLCAweEYzLCAweDAzLCAweDYxLCAweDdDLCAweEE0LCAweEEyLCAweERCLCAweDAwLCAweEY0LCAweDYwLCAweEZFLCAweEJGLCAweEQzLCAweDVELCAweERBLAorCSAweEZGLCAweEI0LCAweDAwLCAweDdGLCAweDEyLCAweDAzLCAweERGLCAweDgzLCAweDYxLCAweDQwLCAweDdGLCAweDNBLCAweDBBLCAweDAwLCAweDIwLCAweEZFLAorCSAweDYwLCAweDQ1LCAweDE3LCAweDYwLCAweDIzLCAweEYzLCAweDAzLCAweDYxLCAweDdDLCAweEE0LCAweEEyLCAweERCLCAweDY1LCAweDQ0LCAweDAwLCAweEY0LAorCSAweDYwLCAweEZFLCAweEJELCAweEQxLCAweENDLCAweDg0LCAweDVELCAweEQ4LCAweEVGLCAweDAyLCAweDIwLCAweEZFLCAweENCLCAweDAxLCAweDE3LCAweDYwLAorCSAweDIzLCAweEYxLCAweEZELCAweEExLCAweEZGLCAweEIxLCAweEMxLCAweDgzLCAweEEyLCAweERELCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDY3LCAweDVDLAorCSAweDE0LCAweDYwLCAweDI2LCAweDYxLCAweEExLCAweEQzLCAweEE1LCAweEQ5LCAweDEwLCAweDE4LCAweDYwLCAweDQzLCAweDJELCAweDYwLCAweEVFLCAweDY0LAorCSAweEE1LCAweERCLCAweDYwLCAweEZFLCAweEEwLCAweERELCAweDIwLCAweEZFLCAweERDLCAweDg0LCAweENGLCAweDgzLCAweEUzLCAweDgzLCAweDU5LCAweEQxLAorCSAweERDLCAweDg0LCAweDYwLCAweEZFLCAweEEwLCAweEQ5LCAweDIwLCAweEZFLCAweEZBLCAweDFGLCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDE1LCAweDYwLAorCSAweERDLCAweEYxLCAweDE1LCAweDYwLCAweERELCAweEYzLCAweDY0LCAweDQwLCAweDAxLCAweDJBLCAweDAyLCAweEJDLCAweDY0LCAweDQwLCAweDAyLCAweDJBLAorCSAweDA0LCAweEJDLCAweDY0LCAweDQwLCAweDA0LCAweDJBLCAweEVGLCAweEI0LCAweDE1LCAweDYwLCAweERELCAweEZCLCAweDA3LCAweEI0LCAweDYwLCAweEZFLAorCSAweDE3LCAweDYwLCAweDEwLCAweEZCLCAweDIwLCAweEZFLCAweDA3LCAweDdDLCAweDE1LCAweDYwLCAweERDLCAweEY5LCAweDJELCAweDU4LCAweEZGLCAweEZGLAorCSAweDIwLCAweDQwLCAweDIwLCAweDJBLCAweDBBLCAweDAwLCAweDBBLCAweDYwLCAweDc3LCAweEYxLCAweDUwLCAweEYzLCAweDJFLCAweDYwLCAweDMxLCAweDYzLAorCSAweDYwLCAweEZFLCAweEJELCAweEQ5LCAweDYwLCAweDQ3LCAweEEzLCAweERCLCAweDIwLCAweEZFLCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDBFLCAweDU3LAorCSAweDMyLCAweDQwLCAweDQwLCAweDI2LCAweDI0LCAweDAwLCAweDQ1LCAweDQ4LCAweDAwLCAweDYwLCAweDEwLCAweDYxLCAweEI1LCAweDYwLCAweDU4LCAweDRELAorCSAweDlGLCAweDc4LCAweEZGLCAweEZGLCAweDFDLCAweDAzLCAweEYyLCAweDYwLCAweDAyLCAweDY0LCAweDI0LCAweEZBLCAweDAwLCAweDYwLCAweDQ4LCAweDYxLAorCSAweDI4LCAweDQ0LCAweDU5LCAweERBLCAweDAzLCAweDY0LCAweDM4LCAweDQzLCAweEJELCAweEQxLCAweENDLCAweDg0LCAweDU5LCAweEQ4LCAweEZDLCAweDAyLAorCSAweDM5LCAweDQ0LCAweDU5LCAweERBLCAweDA2LCAweDY0LCAweDIzLCAweEZBLCAweDFGLCAweDYwLCAweDEwLCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLAorCSAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEZBLCAweEZFLCAweDM3LCAweDU4LAorCSAweEZGLCAweEZGLCAweDBFLCAweDU3LCAweDMyLCAweDQwLCAweDQwLCAweDI2LCAweDRGLCAweDAwLCAweDQ1LCAweDQ4LCAweDAwLCAweDYwLCAweDY4LCAweDYxLAorCSAweEI1LCAweDYwLCAweDU4LCAweDRELCAweDlGLCAweDc4LCAweEZGLCAweEZGLCAweDQ3LCAweDAzLCAweEYyLCAweDYwLCAweDAxLCAweDY0LCAweDI0LCAweEZBLAorCSAweDAyLCAweDYwLCAweDAwLCAweDYxLCAweDQ2LCAweDRBLCAweDM4LCAweDQ0LCAweDU0LCAweDk0LCAweDAzLCAweDY0LCAweDAxLCAweDAyLCAweDA5LCAweDAwLAorCSAweDA2LCAweDYzLCAweDRBLCAweDYxLCAweDM4LCAweDQ2LCAweEJELCAweEQwLCAweENDLCAweDg0LCAweDJBLCAweDQ2LCAweDU5LCAweEQ4LCAweEZBLCAweDAyLAorCSAweDA2LCAweDAwLCAweERBLCAweDgxLCAweDM4LCAweDQzLCAweEJELCAweEQxLCAweENDLCAweDg0LCAweDU5LCAweEQ4LCAweEZDLCAweDAyLCAweDA1LCAweDYzLAorCSAweDI4LCAweDQ0LCAweDAyLCAweEE4LCAweDI1LCAweEZBLCAweDA3LCAweDAyLCAweDAzLCAweDY0LCAweDM5LCAweDQzLCAweEJELCAweEQxLCAweENDLCAweDg0LAorCSAweDU5LCAweEQ4LCAweEZDLCAweDAyLCAweDA4LCAweDYzLCAweDI4LCAweDQ0LCAweDAzLCAweEE4LCAweDE2LCAweDYwLCAweDgyLCAweEYzLCAweDBGLCAweDAzLAorCSAweEU4LCAweDg1LCAweEM3LCAweDg1LCAweDYwLCAweDQzLCAweEZFLCAweEEzLCAweDJELCAweDYwLCAweDA2LCAweDY0LCAweDU4LCAweEQxLCAweEQ5LCAweDgxLAorCSAweEExLCAweEQ4LCAweDdFLCAweDJBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDAyLCAweDYxLCAweEY4LCAweDFGLCAweDY1LCAweDQzLCAweDJBLCAweDQ2LAorCSAweDIzLCAweEZDLCAweDFGLCAweDYwLCAweDEwLCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEZBLCAweEZFLCAweDM3LCAweDU4LCAweEZGLCAweEZGLCAweDBFLCAweDU3LCAweDMyLCAweDQwLAorCSAweDQwLCAweDI2LCAweDFCLCAweDAwLCAweDQ1LCAweDQ4LCAweDAwLCAweDYwLCAweDA2LCAweDYxLCAweEI1LCAweDYwLCAweDU4LCAweDRELCAweDlGLCAweDc4LAorCSAweEZGLCAweEZGLCAweDEzLCAweDAzLCAweDAyLCAweDY0LCAweDIzLCAweEZBLCAweEYyLCAweDYwLCAweDAwLCAweDY0LCAweDVBLCAweERBLCAweDI4LCAweDQ0LAorCSAweDVBLCAweERBLCAweEZGLCAweEZGLCAweDFGLCAweDYwLCAweDEwLCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLAorCSAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEZBLCAweEZFLCAweDM3LCAweDU4LCAweEZGLCAweEZGLCAweEEwLCAweEQzLAorCSAweEZGLCAweEZGLCAweERDLCAweDg0LCAweERDLCAweDgwLCAweEQwLCAweDgwLCAweDAzLCAweDAzLCAweEEyLCAweERCLCAweDA4LCAweDI0LCAweEM2LCAweEZFLAorCSAweERELCAweDk4LCAweEZGLCAweEZGLCAweDk3LCAweEYxLCAweEEwLCAweEQzLCAweEZGLCAweEZGLCAweEQ4LCAweDgwLCAweEM0LCAweDg0LCAweDBDLCAweDAzLAorCSAweDA4LCAweDA1LCAweERDLCAweDgwLCAweEQwLCAweDgwLCAweDA1LCAweDAzLCAweEEyLCAweERCLCAweDAyLCAweDI0LCAweEM2LCAweEZFLCAweERELCAweDk4LAorCSAweEZGLCAweEZGLCAweEZGLCAweDYwLCAweEZFLCAweDY0LCAweEEyLCAweERCLCAweERELCAweDk4LCAweEZGLCAweEZGLCAweEEyLCAweEZGLCAweDMyLCAweDQwLAorCSAweDQwLCAweDI2LCAweDNDLCAweDAwLCAweDdCLCAweEYzLCAweDY3LCAweDQzLCAweERDLCAweDg0LCAweENDLCAweDg0LCAweDM3LCAweDAzLCAweDYwLCAweDQ2LAorCSAweDBBLCAweDAyLCAweDdCLCAweEZELCAweDAwLCAweDYwLCAweDQ2LCAweDYxLCAweEI1LCAweDYwLCAweDU4LCAweDRELCAweDlGLCAweDc4LCAweEZGLCAweEZGLAorCSAweDY2LCAweDQ0LCAweDdCLCAweEZCLCAweDJDLCAweDAzLCAweDQ2LCAweDRCLCAweDI1LCAweDYwLCAweEQwLCAweDYxLCAweDE4LCAweDY0LCAweDIzLCAweEZBLAorCSAweEYxLCAweDYwLCAweDAwLCAweDY0LCAweDI0LCAweEZBLCAweDRBLCAweDY1LCAweEEyLCAweEZGLCAweDJDLCAweDYzLCAweDU5LCAweEQxLCAweEEyLCAweERGLAorCSAweEE1LCAweEQ4LCAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweEY3LCAweDFGLCAweDEyLCAweDYzLAorCSAweDU5LCAweEQxLCAweEE1LCAweEQ4LCAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweEY4LCAweDFGLAorCSAweDFGLCAweDYwLCAweDEwLCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDJCLCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLAorCSAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEZBLCAweEZFLCAweEE2LCAweEZFLCAweDAwLCAweDY0LCAweDdCLCAweEZCLCAweEEzLCAweEZGLCAweENBLCAweDYwLAorCSAweDdFLCAweDc4LCAweEZGLCAweEZGLCAweEE2LCAweEZFLCAweEJBLCAweDA1LCAweEE3LCAweEZFLCAweDBBLCAweDA1LCAweEE1LCAweEZFLCAweDAzLCAweDA0LAorCSAweEU2LCAweDYwLCAweDhFLCAweDc4LCAweEZGLCAweEZGLCAweEE0LCAweEZFLCAweEYyLCAweDA0LCAweEU3LCAweDYwLCAweDFGLCAweDc4LCAweEZGLCAweEZGLAorCSAweDM2LCAweDQ1LCAweDE5LCAweDYwLCAweDg2LCAweDY0LCAweDQ0LCAweEQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDI4LCAweEYzLCAweDdELCAweEYxLAorCSAweDYwLCAweDQ3LCAweDA3LCAweEI0LCAweDRFLCAweEZCLCAweDAxLCAweDYxLCAweDAzLCAweDAzLCAweENDLCAweDg0LCAweEUxLCAweDgxLCAweEZELCAweDAyLAorCSAweDlELCAweDg0LCAweEExLCAweDgwLCAweEEwLCAweDgzLCAweDE1LCAweDAzLCAweDdELCAweEZELCAweDA4LCAweDYwLCAweDI0LCAweEYxLCAweDAwLCAweDYwLAorCSAweDAyLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDMxLCAweDQ0LCAweERFLCAweEI0LCAweDQwLCAweDUxLCAweDAxLCAweDdDLAorCSAweEJDLCAweEY5LCAweDQ5LCAweEYzLCAweDAxLCAweDYzLCAweDYwLCAweDQwLCAweEZGLCAweDI2LCAweDQ5LCAweEZELCAweENBLCAweDYwLCAweDdFLCAweDc4LAorCSAweEZGLCAweEZGLCAweEU2LCAweDYwLCAweDhFLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDYwLCAweEIwLCAweDYzLCAweEJELCAweEQzLCAweEJELCAweEQxLAorCSAweEJELCAweEQxLCAweEIwLCAweDg0LCAweEIwLCAweDg0LCAweEZGLCAweEZGLCAweDA3LCAweDAyLCAweDZBLCAweEZCLCAweDMxLCAweDQ0LCAweEZFLCAweEI0LAorCSAweDQwLCAweDUxLCAweDBELCAweDY0LCAweDA1LCAweEZCLCAweDFBLCAweDAwLCAweDI4LCAweEYzLCAweEZGLCAweEZGLCAweDEzLCAweDYwLCAweDUyLCAweEYzLAorCSAweEM1LCAweEZCLCAweDY0LCAweEZCLCAweDBGLCAweDYwLCAweDg1LCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDQ2LCAweDVFLAorCSAweDMxLCAweDQ0LCAweDIxLCAweEJDLCAweDQwLCAweDUxLCAweEVELCAweEUyLCAweDBGLCAweDRFLCAweEQwLCAweDYwLCAweDU4LCAweDRGLCAweEE4LCAweDc4LAorCSAweEZGLCAweEZGLCAweDBFLCAweDRGLCAweDAwLCAweDAwLCAweEU4LCAweDYwLCAweDc0LCAweDc4LCAweEZGLCAweEZGLCAweEQ3LCAweEZFLCAweENBLCAweDYwLAorCSAweDdFLCAweDc4LCAweEZGLCAweEZGLCAweDJFLCAweEY1LCAweDI3LCAweEYyLCAweDE1LCAweDYwLCAweDAyLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLCAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LCAweDYxLCAweDQ2LAorCSAweDI3LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDI2LCAweEYwLCAweDYzLCAweDQ2LAorCSAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLCAweDYxLCAweDQ2LCAweDI1LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLAorCSAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweDg3LCAweEYzLCAweDA4LCAweEZFLCAweDYwLCAweDQzLAorCSAweDYxLCAweDQ2LCAweDI2LCAweDAyLCAweDBCLCAweDYwLCAweDgyLCAweEYzLCAweERBLCAweDgxLCAweDYwLCAweDQ1LCAweEQ1LCAweDgwLCAweEExLCAweEQxLAorCSAweDA0LCAweDAzLCAweEQzLCAweDgwLCAweEQ5LCAweDgxLCAweEZBLCAweDAyLCAweDA4LCAweDAwLCAweEExLCAweERELCAweEQ5LCAweDg0LCAweDBCLCAweDYwLAorCSAweDgyLCAweEZCLCAweDRBLCAweEQzLCAweEZGLCAweEZGLCAweERDLCAweDg0LCAweEEyLCAweERCLCAweDY2LCAweDQ1LCAweDYzLCAweDQ2LCAweDA2LCAweEYyLAorCSAweEZGLCAweDYwLCAweDAxLCAweDdDLCAweEEwLCAweDlDLCAweDA2LCAweEY4LCAweDY1LCAweDQ2LCAweDcwLCAweEYzLCAweDYwLCAweDQwLCAweDEwLCAweDJBLAorCSAweDAzLCAweDAwLCAweENDLCAweDg0LCAweDgwLCAweDJCLCAweDcwLCAweEZCLCAweEU3LCAweDYwLCAweDU4LCAweDRFLCAweDgxLCAweDc4LCAweEZGLCAweEZGLAorCSAweEFELCAweDAxLCAweDJFLCAweEY1LCAweDI4LCAweEYwLCAweDE4LCAweDYwLCAweDEyLCAweEY5LCAweDI3LCAweEYyLCAweDE1LCAweDYwLCAweDAyLCAweDY1LAorCSAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLCAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLAorCSAweDE2LCAweDE4LCAweDYxLCAweDQ2LCAweDI3LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LAorCSAweDI2LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLCAweDYxLCAweDQ2LCAweDI1LCAweEYwLCAweDYzLCAweDQ2LAorCSAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweDg3LCAweEYzLAorCSAweDA4LCAweEZFLCAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDEyLCAweDAyLCAweDYzLCAweDQ2LCAweDA2LCAweEYyLCAweEZGLCAweEZGLCAweDAyLCAweEIwLAorCSAweDA4LCAweEJDLCAweDBDLCAweDAzLCAweDA2LCAweEZBLCAweEU3LCAweDYwLCAweDU4LCAweDRFLCAweDgxLCAweDc4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLAorCSAweDFFLCAweEYxLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDZGLCAweDAxLCAweDAxLCAweDY0LAorCSAweDUxLCAweEZCLCAweDI4LCAweDYwLCAweDRFLCAweDY0LCAweDUyLCAweEZCLCAweDE1LCAweDYwLCAweEMzLCAweEYzLCAweEZGLCAweEZGLCAweDE1LCAweDE4LAorCSAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAwLCAweDYwLCAweDEwLCAweDY0LAorCSAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDEwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEU3LCAweDYwLAorCSAweDNELCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDJCLCAweDYwLCAweDg4LCAweDYxLCAweEZGLCAweDYwLAorCSAweDgwLCAweDY1LCAweEExLCAweEQzLCAweEZGLCAweEZGLCAweEE0LCAweDgwLCAweDU5LCAweEQzLCAweDA1LCAweDAyLCAweDA0LCAweDFCLCAweDU5LCAweEQzLAorCSAweEZGLCAweEZGLCAweDAxLCAweDFCLCAweDE1LCAweDAwLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDA4LCAweDYwLAorCSAweDFCLCAweEYxLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDEwLCAweDYwLCAweDAwLCAweDY0LAorCSAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEU3LCAweDYwLCAweDYwLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDYwLCAweDA0LCAweDYxLCAweEI1LCAweDYwLCAweDU4LCAweDRELCAweDlGLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDY0LCAweDIzLCAweEZBLAorCSAweEYxLCAweDYwLCAweDAyLCAweDY0LCAweDI0LCAweEZBLCAweDFGLCAweDYwLCAweDEwLCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDY2LCAweDQ0LAorCSAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEZBLCAweEZFLCAweDAwLCAweDYwLCAweDMwLCAweDY0LAorCSAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQyLCAweDYwLCAweEI1LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweENBLCAweDYwLCAweDdFLCAweDc4LAorCSAweEZGLCAweEZGLCAweDBFLCAweDU3LCAweDYzLCAweDQ2LCAweDQzLCAweDQ3LCAweDIyLCAweEYyLCAweDc2LCAweEYyLCAweDAyLCAweDFCLCAweDAxLCAweDFCLAorCSAweDBDLCAweDAwLCAweDYwLCAweDQ2LCAweDFGLCAweDYwLCAweDIwLCAweDY0LCAweDQwLCAweDRCLCAweEY2LCAweDYwLCAweDU4LCAweDRELCAweEIzLCAweDc4LAorCSAweEZGLCAweEZGLCAweDI3LCAweDQ2LCAweDc2LCAweEYyLCAweEZGLCAweEZGLCAweEY0LCAweDFCLCAweDM3LCAweDU4LCAweEZGLCAweEZGLCAweEU3LCAweDYwLAorCSAweDlGLCAweDY0LCAweDA4LCAweDYwLCAweDJBLCAweEZCLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LAorCSAweDA4LCAweDYwLCAweDIxLCAweEZCLCAweDVBLCAweERCLCAweDEwLCAweDYwLCAweDQyLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDI4LCAweEYzLCAweDdELCAweEYxLCAweDYwLCAweDQ3LCAweDA3LCAweEI0LCAweDRFLCAweEZCLCAweDAxLCAweDYxLCAweDAzLCAweDAzLAorCSAweENDLCAweDg0LCAweEUxLCAweDgxLCAweEZELCAweDAyLCAweEExLCAweDgwLCAweEIxLCAweDgzLCAweDE2LCAweDAyLCAweENGLCAweDg1LCAweEE3LCAweDgwLAorCSAweDdELCAweEZELCAweDBCLCAweDAyLCAweDAxLCAweDY1LCAweEU1LCAweDYwLCAweDU4LCAweDRFLCAweEE2LCAweDc4LCAweEZGLCAweEZGLCAweDMxLCAweDQ0LAorCSAweERGLCAweEI0LCAweDQwLCAweDUxLCAweEQwLCAweDYwLCAweEQ5LCAweDc4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDIxLCAweEYxLCAweDAwLCAweDYwLAorCSAweDAxLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweEU2LCAweDYwLCAweDhFLCAweDc4LCAweEZGLCAweEZGLCAweDI4LCAweEYzLAorCSAweDdELCAweEYxLCAweDYwLCAweDQ3LCAweDA3LCAweEI0LCAweDRFLCAweEZCLCAweDAxLCAweDYxLCAweDAzLCAweDAzLCAweENDLCAweDg0LCAweEUxLCAweDgxLAorCSAweEZELCAweDAyLCAweDlELCAweDg0LCAweEExLCAweDgwLCAweEEwLCAweDgzLCAweDEzLCAweDAzLCAweDdELCAweEZELCAweDA4LCAweDYwLCAweDI0LCAweEYxLAorCSAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDdELCAweEYxLCAweDMxLCAweDQ0LCAweDY0LCAweDQwLAorCSAweEZGLCAweDI2LCAweDAzLCAweDAwLCAweDIxLCAweEJDLCAweDQwLCAweDUxLCAweDAzLCAweDAwLCAweENBLCAweDYwLCAweDdFLCAweDc4LCAweEZGLCAweEZGLAorCSAweEU2LCAweDYwLCAweDhFLCAweDc4LCAweEZGLCAweEZGLCAweDBFLCAweDU3LCAweDMyLCAweDQwLCAweDQwLCAweDI2LCAweDFCLCAweDAwLCAweDQ1LCAweDQ4LAorCSAweDAwLCAweDYwLCAweDA2LCAweDYxLCAweEI1LCAweDYwLCAweDU4LCAweDRELCAweDlGLCAweDc4LCAweEZGLCAweEZGLCAweDEzLCAweDAzLCAweDAyLCAweDY0LAorCSAweDIzLCAweEZBLCAweEYyLCAweDYwLCAweDA0LCAweDY0LCAweDVBLCAweERBLCAweDI4LCAweDQ0LCAweDVBLCAweERBLCAweEZGLCAweEZGLCAweDFGLCAweDYwLAorCSAweDEwLCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLAorCSAweDJCLCAweEZGLCAweEZBLCAweEZFLCAweDM3LCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweDc5LCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LAorCSAweDYwLCAweDQ2LCAweDBFLCAweEYyLCAweDU5LCAweDAzLCAweDYwLCAweDQwLCAweEYwLCAweDM3LCAweDQ2LCAweDAwLCAweEZGLCAweDM3LCAweDNCLCAweDAwLAorCSAweEZELCAweDM3LCAweDMzLCAweDAwLCAweDE4LCAweDM3LCAweDI3LCAweDAwLCAweEZFLCAweDM3LCAweDJBLCAweDAwLCAweEY4LCAweDM3LCAweDBBLCAweDAwLAorCSAweDYwLCAweDQ3LCAweEZGLCAweEI1LCAweDEwLCAweDYwLCAweDI0LCAweDYyLCAweDQ2LCAweEQxLCAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweENGLCAweEZFLCAweDAwLCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEQ4LCAweDAxLCAweDA2LCAweEI0LCAweEZELCAweDdGLCAweDBFLCAweEZBLCAweDFFLCAweDYwLAorCSAweEY4LCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLAorCSAweDJCLCAweEZGLCAweEY5LCAweEZFLCAweEM5LCAweDAxLCAweERFLCAweDYwLCAweDU4LCAweDRGLCAweDZDLCAweDc4LCAweEZGLCAweEZGLCAweDE0LCAweDAwLAorCSAweEUxLCAweDYwLCAweDU4LCAweDRGLCAweDMyLCAweDc4LCAweEZGLCAweEZGLCAweEJGLCAweDAzLCAweDIzLCAweEYwLCAweDYwLCAweDQwLCAweDA0LCAweDI2LAorCSAweEUzLCAweDFCLCAweDAyLCAweDI2LCAweEUxLCAweDE4LCAweEEyLCAweEZGLCAweDAyLCAweEYwLCAweDA5LCAweDYwLCAweDA4LCAweDY0LCAweEQwLCAweDgwLAorCSAweDhGLCAweEYzLCAweDAyLCAweDAyLCAweENDLCAweDg0LCAweDhGLCAweEZCLCAweDFGLCAweDYwLCAweDIwLCAweDY0LCAweDQwLCAweDRCLCAweEY2LCAweDYwLAorCSAweDU4LCAweDRELCAweEIzLCAweDc4LCAweEZGLCAweEZGLCAweEE4LCAweDAxLCAweEFDLCAweEZFLCAweDA5LCAweDA1LCAweEFELCAweEZFLCAweDBGLCAweDA1LAorCSAweEFFLCAweEZFLCAweEEyLCAweDA1LCAweEFGLCAweEZFLCAweDM3LCAweDA1LCAweENBLCAweDYwLCAweDdFLCAweDc4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLAorCSAweDExLCAweEYxLCAweDIwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweEY1LCAweDAxLCAweDEwLCAweDYwLAorCSAweDU2LCAweDY1LCAweDAzLCAweDYxLCAweDA3LCAweDAwLCAweEEyLCAweERELCAweDU4LCAweDRGLCAweDY0LCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweEI5LAorCSAweEZGLCAweEZGLCAweDA4LCAweDAzLCAweDAwLCAweDYzLCAweEE1LCAweEQxLCAweDVBLCAweEQzLCAweERBLCAweDg1LCAweDAwLCAweEE4LCAweENELCAweDgxLAorCSAweEYyLCAweDAyLCAweEY4LCAweDAyLCAweEUxLCAweDAxLCAweDEwLCAweDYwLCAweDIwLCAweDYyLCAweDEwLCAweDYwLCAweDQ2LCAweDY1LCAweEU4LCAweDYwLAorCSAweEE5LCAweDYzLCAweDVBLCAweERGLCAweEQ2LCAweDgwLCAweEZGLCAweEZGLCAweDA0LCAweDAzLCAweDVBLCAweERGLCAweDVBLCAweERGLCAweDVBLCAweERELAorCSAweEY5LCAweDAxLCAweDEwLCAweDYwLCAweDU0LCAweDY1LCAweDVBLCAweERGLCAweEQ2LCAweDgwLCAweEZGLCAweEZGLCAweDAyLCAweDAzLCAweDVBLCAweERELAorCSAweEZCLCAweDAxLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDI0LCAweDY0LCAweDQwLCAweDQxLCAweDEwLCAweDYwLCAweDIyLCAweDYzLAorCSAweEEzLCAweEQxLCAweDAwLCAweDY0LCAweEQwLCAweDgwLCAweDA2LCAweDYxLCAweDA4LCAweDAzLCAweEJELCAweERCLCAweEEzLCAweEQzLCAweEZGLCAweEZGLAorCSAweEIwLCAweDg0LCAweENELCAweDgxLCAweEEzLCAweERCLCAweDA2LCAweEEzLCAweEY5LCAweDAyLCAweDEwLCAweDYwLCAweDQ4LCAweDYzLCAweEEzLCAweEQxLAorCSAweDAwLCAweDY0LCAweEQwLCAweDgwLCAweDA3LCAweDYxLCAweDE5LCAweDAzLCAweEJELCAweERCLCAweDY0LCAweDQ0LCAweEZFLCAweEEzLCAweDAyLCAweEEzLAorCSAweENELCAweDgxLCAweEU4LCAweDg0LCAweEUzLCAweDAzLCAweDAyLCAweDA1LCAweEUxLCAweDAzLCAweEY5LCAweDAxLCAweDc3LCAweEZCLCAweDc5LCAweEZELAorCSAweDYxLCAweDVDLCAweEEzLCAweEQzLCAweDc4LCAweEY5LCAweDAzLCAweDE4LCAweDU4LCAweDRGLCAweDYwLCAweDU4LCAweEZGLCAweEZGLCAweDc5LCAweEYzLAorCSAweDc4LCAweEYxLCAweDYwLCAweDQzLCAweDc3LCAweEYzLCAweDY0LCAweDQxLCAweEVBLCAweDAxLCAweDIxLCAweDQzLCAweDEwLCAweDYwLCAweDQ4LCAweDY1LAorCSAweEQ3LCAweDgwLCAweEJELCAweEQxLCAweEJELCAweEQzLCAweDAzLCAweDAyLCAweENBLCAweDYwLCAweDdFLCAweDc4LCAweEZGLCAweEZGLCAweEEwLCAweDg0LAorCSAweEJELCAweEQxLCAweDQzLCAweDQxLCAweEY1LCAweDAzLCAweEU4LCAweDYwLCAweEFFLCAweDY0LCAweDY0LCAweDU4LCAweDQwLCAweDRGLCAweDJBLCAweEYwLAorCSAweDgzLCAweDYwLCAweEZGLCAweDY1LCAweDY0LCAweDQ3LCAweDAzLCAweDJCLCAweDAxLCAweDAwLCAweDE3LCAweDAwLCAweDAzLCAweDI2LCAweDAzLCAweEFDLAorCSAweDYwLCAweDQ3LCAweEE0LCAweDg0LCAweDJBLCAweEZBLCAweDJGLCAweEYyLCAweDJDLCAweEZBLCAweDMwLCAweEYyLCAweDJELCAweEZBLCAweDMxLCAweEYyLAorCSAweDJFLCAweEZBLCAweDY0LCAweDQxLCAweENCLCAweEYzLCAweDJGLCAweEZBLCAweDYwLCAweDQzLCAweENDLCAweEYzLCAweDMwLCAweEZBLCAweENELCAweEYxLAorCSAweDMxLCAweEY4LCAweDMyLCAweEZDLCAweDMzLCAweEZBLCAweDM0LCAweEY4LCAweDE5LCAweDAwLCAweDYwLCAweDQ3LCAweEE0LCAweDg0LCAweDJBLCAweEZBLAorCSAweDJGLCAweEYyLCAweDJDLCAweEZBLCAweDMwLCAweEYyLCAweDJELCAweEZBLCAweDMxLCAweEYyLCAweDJFLCAweEZBLCAweDM2LCAweEYyLCAweDMyLCAweEZBLAorCSAweDM3LCAweEYyLCAweDMzLCAweEZBLCAweDM4LCAweEYyLCAweDM0LCAweEZBLCAweENCLCAweEYzLCAweDJGLCAweEZBLCAweDM2LCAweEZBLCAweENDLCAweEYzLAorCSAweDMwLCAweEZBLCAweDM3LCAweEZBLCAweENELCAweEYzLCAweDMxLCAweEZBLCAweDM4LCAweEZBLCAweDY0LCAweDQxLCAweDFDLCAweEYyLCAweDEzLCAweEZBLAorCSAweDAwLCAweEY0LCAweDBELCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDgwLCAweDJCLCAweDI4LCAweDAwLCAweDI2LCAweDQ2LCAweDA0LCAweDYzLAorCSAweDAzLCAweEZDLCAweDAwLCAweEY0LCAweDBELCAweEYyLCAweDA2LCAweEZBLCAweEVBLCAweDYwLCAweDU4LCAweDRFLCAweDQ5LCAweDc4LCAweEZGLCAweEZGLAorCSAweEZGLCAweEEwLCAweDU5LCAweEY1LCAweDE5LCAweDAyLCAweDM5LCAweEYyLCAweDI2LCAweDQ2LCAweDNGLCAweEZBLCAweDAwLCAweEY0LCAweDAwLCAweDYwLAorCSAweDgxLCAweDY3LCAweDBELCAweEZBLCAweDdDLCAweDY0LCAweDAxLCAweEZBLCAweDI2LCAweDQ2LCAweDAwLCAweDY0LCAweDNFLCAweEZBLCAweDFFLCAweDYwLAorCSAweEUwLCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDI2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLAorCSAweDJCLCAweEZGLCAweEM4LCAweEZFLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDNGLCAweEYwLAorCSAweDQyLCAweDY0LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDA0LCAweDNGLCAweEZBLCAweDFDLCAweEYyLCAweDEzLCAweEZBLCAweDI2LCAweEYyLAorCSAweDI3LCAweEYwLCAweDYwLCAweDQ3LCAweDAwLCAweEY0LCAweDFGLCAweEZBLCAweDY0LCAweDQ3LCAweDIwLCAweEZBLCAweDYxLCAweDQ0LCAweDIxLCAweEZBLAorCSAweDAxLCAweDY3LCAweDBELCAweEZBLCAweDEwLCAweDYxLCAweDI2LCAweDYwLCAweDY0LCAweDY0LCAweDFFLCAweDYzLCAweDU4LCAweEQxLCAweENELCAweDgxLAorCSAweEJELCAweEQ4LCAweEZDLCAweDAyLCAweDlBLCAweEYxLCAweEI3LCAweEYxLCAweDY0LCAweDVFLCAweDY0LCAweDVGLCAweDQ0LCAweDYzLCAweEJELCAweERBLAorCSAweDEzLCAweDYwLCAweDJGLCAweEYzLCAweEZGLCAweEZGLCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDA5LCAweEJDLCAweDRBLCAweEQzLAorCSAweDYwLCAweDQ1LCAweDYwLCAweDQwLCAweDAxLCAweDM2LCAweDAzLCAweDY0LCAweDAyLCAweDM2LCAweDAxLCAweDY0LCAweEI0LCAweDg0LCAweDA2LCAweEEyLAorCSAweEEyLCAweEQxLCAweEJELCAweERBLCAweDY0LCAweDQ3LCAweEJELCAweERBLCAweEI0LCAweEYzLCAweEI1LCAweEYxLCAweDYwLCAweDQ3LCAweEJELCAweERBLAorCSAweDY0LCAweDQ3LCAweEMzLCAweEYxLCAweEJELCAweERBLCAweDY0LCAweDQ0LCAweEJELCAweERBLCAweDI2LCAweDQ2LCAweDAwLCAweDY0LCAweDIzLCAweEYwLAorCSAweDNCLCAweEYwLCAweDY0LCAweDQwLCAweDEwLCAweDJBLCAweDA2LCAweDAwLCAweEMwLCAweDY3LCAweEEwLCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg0LCAweDEwLCAweEJDLCAweDNFLCAweEZBLCAweDFFLCAweDYwLCAweEUwLCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDI2LCAweDQ0LAorCSAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEM4LCAweEZFLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA0LCAweDYwLCAweDVDLCAweDYxLCAweEI1LCAweDYwLCAweDU4LCAweDRELCAweEEyLCAweDc4LCAweEZGLCAweEZGLAorCSAweDY2LCAweDQ0LCAweDU5LCAweEZCLCAweDA0LCAweDY0LCAweDAzLCAweEZBLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDU5LCAweEY1LCAweEFCLCAweEYxLAorCSAweDE5LCAweEY4LCAweDAwLCAweDY0LCAweDNFLCAweEZBLCAweDA4LCAweDY0LCAweDJBLCAweEZBLCAweDgwLCAweDdFLCAweEY4LCAweDdGLCAweDBFLCAweEZBLAorCSAweDg3LCAweEYxLCAweDA3LCAweEY4LCAweDAxLCAweDYwLCAweDYwLCAweDY3LCAweDJDLCAweEZBLCAweDFELCAweDYwLCAweDAwLCAweDY3LCAweDJELCAweEZBLAorCSAweDAxLCAweDYwLCAweDAwLCAweDY3LCAweDJFLCAweEZBLCAweENCLCAweEYxLCAweDJGLCAweEY4LCAweDMyLCAweEY4LCAweENDLCAweEYxLCAweDMwLCAweEY4LAorCSAweDMzLCAweEY4LCAweENELCAweEYxLCAweDMxLCAweEY4LCAweDM0LCAweEY4LCAweDAwLCAweDYzLCAweDNCLCAweEZDLCAweDNELCAweEZDLCAweDAxLCAweDY0LAorCSAweDNBLCAweEZBLCAweDY2LCAweDY0LCAweDM5LCAweEZBLCAweDNDLCAweEZDLCAweEFBLCAweDYwLCAweEFBLCAweDY0LCAweDAwLCAweEY0LCAweDAyLCAweEZBLAorCSAweDAwLCAweDYwLCAweDAzLCAweDY0LCAweDVBLCAweERBLCAweDFELCAweDYwLCAweDYwLCAweDY0LCAweDVBLCAweERBLCAweDAxLCAweDYwLCAweDAwLCAweDY0LAorCSAweDVBLCAweERBLCAweDgxLCAweDdGLCAweDE4LCAweDdFLCAweDA4LCAweEZBLCAweDAxLCAweDYwLCAweDAxLCAweDY0LCAweDBBLCAweEZBLCAweDAwLCAweDY0LAorCSAweDBFLCAweEZBLCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDU5LCAweEY1LCAweDNELCAweEYyLCAweDNDLCAweEYyLCAweENDLCAweDgzLCAweDAwLCAweEE4LAorCSAweDAzLCAweDAzLCAweDA4LCAweDI4LCAweDNELCAweEZDLCAweDQyLCAweDAwLCAweDNELCAweEZBLCAweDNBLCAweEYyLCAweDNCLCAweEYwLCAweDAwLCAweDYzLAorCSAweDAwLCAweEY0LCAweDA3LCAweEZDLCAweDAxLCAweEIwLCAweDBCLCAweEZBLCAweDE5LCAweDAzLCAweDFGLCAweEY4LCAweEZGLCAweEZGLCAweDE4LCAweDY0LAorCSAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDBBLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLAorCSAweDFGLCAweEYyLCAweDFFLCAweEYwLCAweDU5LCAweEY1LCAweDAwLCAweEE4LCAweDNCLCAweEY4LCAweEQwLCAweDgwLCAweDA2LCAweDAzLCAweDA1LCAweDAzLAorCSAweDA0LCAweDYwLCAweDVDLCAweDYzLCAweDBGLCAweDY0LCAweDNBLCAweEZBLCAweDM5LCAweEZDLCAweDAwLCAweEY0LCAweDAwLCAweDY0LCAweDA2LCAweEZBLAorCSAweEVBLCAweDYwLCAweDU4LCAweDRFLCAweDQ5LCAweDc4LCAweEZGLCAweEZGLCAweDU5LCAweEY1LCAweDAwLCAweEY0LCAweDgxLCAweDYwLCAweDAwLCAweDY0LAorCSAweDA2LCAweEZBLCAweDMyLCAweDQ3LCAweDA3LCAweEZBLCAweEI3LCAweEYxLCAweDAwLCAweDdGLCAweDY0LCAweDVFLCAweDA5LCAweEZBLCAweDU5LCAweEY1LAorCSAweDAwLCAweDY0LCAweDE1LCAweEZBLCAweDM5LCAweEYyLCAweDNGLCAweEZBLCAweDFFLCAweDYwLCAweENFLCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLAorCSAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEUzLCAweDYwLCAweEMwLCAweDc4LAorCSAweEZGLCAweEZGLCAweDY2LCAweDQ1LCAweDBFLCAweEYyLCAweDBGLCAweEYwLCAweDEwLCAweEYwLCAweDY0LCAweDQxLCAweDAxLCAweEE4LCAweDU5LCAweEY1LAorCSAweDA5LCAweDAyLCAweEFELCAweDgzLCAweDY0LCAweDQ0LCAweEFDLCAweDg0LCAweDA4LCAweDI0LCAweDBBLCAweDYzLCAweDNDLCAweEZDLCAweDNELCAweEZDLAorCSAweDFBLCAweDAyLCAweDJELCAweDAwLCAweDAzLCAweDNBLCAweDAzLCAweDAwLCAweDAwLCAweDY0LCAweDNDLCAweEZBLCAweDI5LCAweDAwLCAweDA0LCAweDNBLAorCSAweDA5LCAweDAwLCAweDBBLCAweDY0LCAweDNDLCAweEZBLCAweDAxLCAweDY0LCAweDNBLCAweEZBLCAweDAwLCAweEY0LCAweDAwLCAweDY0LCAweDFGLCAweEZBLAorCSAweDFFLCAweEZBLCAweDFFLCAweDAwLCAweDAyLCAweDNBLCAweDFFLCAweDAwLCAweDY0LCAweDQ0LCAweEFELCAweDgzLCAweEFDLCAweDg0LCAweDAyLCAweDAzLAorCSAweDNDLCAweEZDLCAweDNELCAweEZDLCAweDE1LCAweDAzLCAweDNBLCAweEZBLCAweEY4LCAweDY1LCAweDUyLCAweDYzLCAweDY0LCAweDQ0LCAweDAxLCAweDM2LAorCSAweDBELCAweDAwLCAweDEyLCAweEEzLCAweDY0LCAweDQwLCAweDAyLCAweDJBLCAweDAyLCAweDAwLCAweEM3LCAweDgzLCAweEM3LCAweDgzLCAweDY0LCAweDQwLAorCSAweDA4LCAweDJBLCAweDAxLCAweDAwLCAweEM3LCAweDgzLCAweDY0LCAweDQwLCAweDA0LCAweDI2LCAweEM3LCAweDgzLCAweDM5LCAweEZDLCAweDAwLCAweDY0LAorCSAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDNCLCAweEYwLCAweDNBLCAweEYyLCAweDY1LCAweDQ2LCAweDA2LCAweEYyLCAweDQwLCAweDQ3LCAweDFDLCAweDE4LAorCSAweDMyLCAweDQ3LCAweDA3LCAweEZBLCAweDE4LCAweDdFLCAweDgxLCAweDdGLCAweDA4LCAweEZBLCAweDAxLCAweDYwLCAweDAxLCAweDYzLCAweEI3LCAweEYzLAorCSAweDBBLCAweEZDLCAweDAwLCAweDdGLCAweDA5LCAweEZBLCAweDI3LCAweDQwLCAweDAxLCAweDJBLCAweDBFLCAweDAwLCAweDFGLCAweEY4LCAweDE4LCAweDY0LAorCSAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDBBLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLAorCSAweDFFLCAweEYwLCAweDU5LCAweEY1LCAweDNCLCAweEY4LCAweDY1LCAweDQ2LCAweDI3LCAweDQwLCAweDAyLCAweDI2LCAweDAyLCAweDAwLCAweDAwLCAweEY0LAorCSAweDEzLCAweDAwLCAweDZFLCAweDYxLCAweEZGLCAweDYwLCAweEZFLCAweDY0LCAweDAwLCAweDYwLCAweDBFLCAweDYzLCAweDU4LCAweEQxLCAweDU5LCAweEQ4LAorCSAweEZELCAweDFGLCAweDAxLCAweDYwLCAweEVFLCAweDYzLCAweDAwLCAweEY0LCAweDAyLCAweDYxLCAweDU4LCAweEQxLCAweDU5LCAweEQ4LCAweDdFLCAweDNBLAorCSAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDAyLCAweDYxLCAweEY5LCAweDFGLCAweDI3LCAweDQwLCAweDA0LCAweDI2LCAweDFBLCAweDAwLCAweDQ2LCAweDRCLAorCSAweDBGLCAweDYwLCAweDY3LCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDBFLCAweDAzLCAweDg5LCAweEYwLCAweEVCLCAweDYwLAorCSAweDU4LCAweDRELCAweDAwLCAweDc4LCAweEZGLCAweEZGLCAweDY1LCAweDQ0LCAweEFDLCAweDg2LCAweEZGLCAweEZGLCAweDA4LCAweDAzLCAweEVCLCAweDYwLAorCSAweDU4LCAweDRELCAweDAwLCAweDc4LCAweEZGLCAweEZGLCAweDA0LCAweDAwLCAweDJCLCAweDQ2LCAweDgyLCAweEZDLCAweDAwLCAweEY0LCAweDgyLCAweEZDLAorCSAweDAwLCAweEY0LCAweDI3LCAweDQwLCAweDA4LCAweDI2LCAweDE5LCAweDAwLCAweDQ2LCAweDRCLCAweDBGLCAweDYwLCAweDg1LCAweEYzLCAweEZGLCAweEZGLAorCSAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDBFLCAweDAzLCAweDg5LCAweEYwLCAweEVCLCAweDYwLCAweDU4LCAweDRELCAweDAwLCAweDc4LCAweEZGLCAweEZGLAorCSAweDY1LCAweDQ0LCAweEFDLCAweDg2LCAweEZGLCAweEZGLCAweDA4LCAweDAzLCAweEVCLCAweDYwLCAweDU4LCAweDRELCAweDAwLCAweDc4LCAweEZGLCAweEZGLAorCSAweDA0LCAweDAwLCAweDY1LCAweDQ2LCAweDAyLCAweEZBLCAweDAwLCAweEY0LCAweDgyLCAweEZDLCAweDAxLCAweDY0LCAweDJFLCAweDU4LCAweEZGLCAweEZGLAorCSAweDAxLCAweDYxLCAweDAyLCAweDY0LCAweDdBLCAweDYzLCAweDU4LCAweEQwLCAweEFCLCAweDQ2LCAweEEwLCAweEQ4LCAweEFCLCAweDQ2LCAweEZCLCAweDFGLAorCSAweEFCLCAweDQ2LCAweDAwLCAweEY0LCAweENELCAweDgxLCAweEFCLCAweDQ2LCAweDAwLCAweEY0LCAweEYzLCAweDAyLCAweDJELCAweDU4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDYwLCAweDJBLCAweDYxLCAweEI1LCAweDYwLCAweDU4LCAweDRELCAweEEyLCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LCAweDU4LCAweEZCLAorCSAweDA0LCAweDY0LCAweDAzLCAweEZBLCAweDY3LCAweDQ0LCAweDJDLCAweEZBLCAweDJELCAweEZBLCAweDJFLCAweEZBLCAweDMyLCAweEZBLCAweDMzLCAweEZBLAorCSAweDM0LCAweEZBLCAweDEyLCAweDYwLCAweDgwLCAweDY0LCAweDg3LCAweEYxLCAweDBFLCAweEZBLCAweDA3LCAweEY4LCAweDAwLCAweDY0LCAweDNFLCAweEZBLAorCSAweDBBLCAweDYwLCAweDA3LCAweEZCLCAweDA2LCAweEEyLCAweDEwLCAweDYwLCAweDVDLCAweDY0LCAweEEyLCAweERCLCAweDA0LCAweDY0LCAweDVBLCAweERCLAorCSAweDA2LCAweDY0LCAweDVBLCAweERCLCAweEVELCAweDYwLCAweEQ5LCAweDY0LCAweDA4LCAweDYwLCAweDJELCAweEZCLCAweDAwLCAweDY0LCAweDBBLCAweDYwLAorCSAweDBELCAweEZCLCAweDA2LCAweEEyLCAweDEwLCAweDYwLCAweDYwLCAweDY0LCAweEEyLCAweERCLCAweDA4LCAweDY0LCAweDVBLCAweERCLCAweDA2LCAweDY0LAorCSAweDVBLCAweERCLCAweEVELCAweDYwLCAweEUyLCAweDY0LCAweDA4LCAweDYwLCAweDJGLCAweEZCLCAweEVELCAweDYwLCAweEJFLCAweDY0LCAweDA4LCAweDYwLAorCSAweDI4LCAweEZCLCAweDAwLCAweDYwLCAweDMwLCAweDY0LCAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVCLCAweDYwLCAweDU4LCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEVELCAweDYwLCAweDcwLCAweDc4LCAweEZGLCAweEZGLAorCSAweDU4LCAweEY1LCAweENCLCAweEYxLCAweDJGLCAweEY4LCAweENDLCAweEYxLCAweDMwLCAweEY4LCAweENELCAweEYxLCAweDMxLCAweEY4LCAweEFCLCAweEYxLAorCSAweDE5LCAweEY4LCAweDU4LCAweEY1LCAweDQwLCAweDY0LCAweDJBLCAweEZBLCAweDY0LCAweEYzLCAweDYzLCAweEZCLCAweDA4LCAweDYwLCAweDFCLCAweEYxLAorCSAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDAzLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDAzLCAweDAwLAorCSAweEVDLCAweDYwLCAweENCLCAweDc4LCAweEZGLCAweEZGLCAweDE1LCAweDYwLCAweEMwLCAweEYzLCAweEVGLCAweDYwLCAweDU4LCAweDRFLCAweEFCLCAweDc4LAorCSAweEZGLCAweEZGLCAweDE1LCAweDYwLCAweEMyLCAweEZCLCAweDE1LCAweDYwLCAweEJDLCAweEYzLCAweDNGLCAweDQwLCAweDAxLCAweDI3LCAweDA4LCAweDAwLAorCSAweDBGLCAweDYwLCAweEZGLCAweDY1LCAweEE0LCAweDg0LCAweEVFLCAweDYwLCAweDU4LCAweDRFLCAweDI2LCAweDc4LCAweEZGLCAweEZGLCAweDA1LCAweDAwLAorCSAweDBGLCAweEI0LCAweEVFLCAweDYwLCAweDU4LCAweDRFLCAweDI2LCAweDc4LCAweEZGLCAweEZGLCAweDU4LCAweEY1LCAweDJELCAweDYwLCAweDk0LCAweDY0LAorCSAweDAwLCAweEY0LCAweDQwLCAweDQ4LCAweDI4LCAweDYwLCAweDRFLCAweDY0LCAweDIwLCAweDQwLCAweDEwLCAweDI3LCAweDAyLCAweDAwLCAweDI4LCAweDYwLAorCSAweDJDLCAweDY0LCAweDI4LCAweERCLCAweDA0LCAweDYxLCAweDAwLCAweDYwLCAweDAwLCAweDY0LCAweEU0LCAweDYwLCAweDU4LCAweDRELCAweEE3LCAweDc4LAorCSAweEZGLCAweEZGLCAweDU4LCAweEY1LCAweDNGLCAweEZDLCAweDAxLCAweDY0LCAweDUyLCAweEYxLCAweDBDLCAweDYwLCAweDgxLCAweEZCLCAweDY0LCAweEZCLAorCSAweEE0LCAweEQzLCAweDA0LCAweDY1LCAweDUxLCAweEYzLCAweDAxLCAweDE4LCAweDBDLCAweDY1LCAweEYzLCAweEI0LCAweEI0LCAweDg0LCAweDUxLCAweEZCLAorCSAweDBELCAweDAwLCAweEVELCAweDYwLCAweDcwLCAweDc4LCAweEZGLCAweEZGLCAweDUxLCAweEYxLCAweDY0LCAweEYzLCAweEZGLCAweEZGLCAweEYzLCAweEEwLAorCSAweDA0LCAweEE0LCAweDAxLCAweDA0LCAweEYxLCAweEE0LCAweDEwLCAweDM2LCAweEY0LCAweDAxLCAweDY0LCAweEZCLCAweDY0LCAweEYzLCAweDE1LCAweDYwLAorCSAweEMzLCAweEYxLCAweENDLCAweDg0LCAweDAxLCAweDYxLCAweDA4LCAweDI0LCAweDAzLCAweDAwLCAweEUxLCAweDgxLCAweENDLCAweDg0LCAweEZCLCAweDAxLAorCSAweEExLCAweDg0LCAweDUxLCAweEYxLCAweEVBLCAweDAzLCAweDBDLCAweDYwLCAweDgxLCAweEZCLCAweDlELCAweEZFLCAweDNELCAweDA1LCAweEJBLCAweEZFLAorCSAweDEwLCAweDYwLCAweDM2LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweERFLCAweEZFLCAweDBBLCAweDA0LCAweDQwLCAweDYwLCAweDAwLCAweDY0LAorCSAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVCLCAweDYwLCAweEQwLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDEwLCAweDYwLCAweDM2LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDY0LCAweEYxLCAweDBGLCAweDYwLCAweDlELCAweEY5LCAweDA4LCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDIwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVCLCAweDYwLAorCSAweEY1LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEJFLCAweEZFLCAweDA4LCAweDYwLCAweDExLCAweEYxLAorCSAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDE4LCAweDYwLCAweDA3LCAweEYxLCAweEFELCAweDRGLAorCSAweDAwLCAweDdGLCAweEZBLCAweEI0LCAweDY0LCAweDQxLCAweDY0LCAweEYxLCAweDAyLCAweEIxLCAweDA0LCAweDY1LCAweDAyLCAweDAyLCAweDY0LCAweDQwLAorCSAweDAxLCAweDJCLCAweDAxLCAweDY1LCAweEI0LCAweDg0LCAweEEwLCAweDVELCAweDEwLCAweDYwLCAweDM2LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweERFLCAweEZFLCAweDBBLCAweDA0LCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVCLCAweDYwLCAweENELCAweDY0LAorCSAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDY0LCAweEYxLCAweDBGLCAweDYwLCAweDlELCAweEY5LCAweDBFLCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDIwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVDLCAweDYwLAorCSAweDJELCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEJFLCAweEZFLCAweDA4LCAweDYwLCAweDExLCAweEYxLAorCSAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDEwLCAweDYwLCAweDM2LCAweDYyLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweDU4LCAweEY1LCAweDFFLCAweDYwLCAweEQ0LCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLAorCSAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDAwLCAweDY0LCAweDRGLCAweEZCLCAweDAwLCAweDYwLCAweDAxLCAweDY0LAorCSAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVDLCAweDYwLCAweDUxLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweEMxLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDM2LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweEE1LCAweEYxLCAweDBBLCAweDYwLCAweDA5LCAweEY5LAorCSAweDE0LCAweDYwLCAweDBFLCAweDY0LCAweDBGLCAweDYwLCAweEE1LCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLAorCSAweEE2LCAweEYxLCAweDBBLCAweDYwLCAweDBGLCAweEY5LCAweDFGLCAweDYwLCAweDQ4LCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweEZELCAweDFCLAorCSAweDE0LCAweDYwLCAweDFBLCAweDY0LCAweDBGLCAweDYwLCAweEE1LCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLAorCSAweDAwLCAweDYwLCAweDA4LCAweDY0LCAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVDLCAweDYwLCAweDdBLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDRGLCAweEYxLCAweDEwLCAweDYwLCAweDM2LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDY0LCAweDQwLAorCSAweEZGLCAweDI2LCAweDBCLCAweDAwLCAweDUxLCAweEYzLCAweEZGLCAweEZGLCAweDgwLCAweEIwLCAweEZGLCAweEZGLCAweDAzLCAweDAzLCAweEVELCAweDYwLAorCSAweDZBLCAweDc4LCAweEZGLCAweEZGLCAweEVCLCAweDYwLCAweEI0LCAweDc4LCAweEZGLCAweEZGLCAweDAyLCAweDBBLCAweDAwLCAweDY0LCAweDRGLCAweEZCLAorCSAweEE3LCAweEYxLCAweDBBLCAweDYwLCAweDBGLCAweEY5LCAweDAwLCAweDYwLCAweDBDLCAweDY0LCAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVDLCAweDYwLAorCSAweEE1LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDE0LCAweDYwLCAweDFBLCAweDY0LCAweDBGLCAweDYwLCAweEE1LCAweEZCLCAweDAyLCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAwLCAweDYwLAorCSAweDA0LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDBCLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDE0LCAweDYwLCAweDFBLCAweDY0LAorCSAweDBGLCAweDYwLCAweEE1LCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDEzLCAweDAwLCAweEZGLCAweDYwLAorCSAweEY3LCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDRGLCAweEYzLCAweERFLCAweDBBLCAweDAwLCAweEEwLCAweDAwLCAweDY0LCAweDAyLCAweDAzLAorCSAweDRGLCAweEZCLCAweEQ5LCAweDAxLCAweDE0LCAweDYwLCAweDBFLCAweDY0LCAweDBGLCAweDYwLCAweEE1LCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLAorCSAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweEI3LCAweDAxLCAweDE1LCAweDYwLCAweEMxLCAweEYzLCAweEVGLCAweDYwLCAweDU4LCAweDRFLCAweEFCLCAweDc4LAorCSAweEZGLCAweEZGLCAweDE1LCAweDYwLCAweEMyLCAweEZCLCAweDE1LCAweDYwLCAweEJELCAweEYzLCAweDBGLCAweDYwLCAweEZGLCAweDY1LCAweEE0LCAweDg0LAorCSAweEVFLCAweDYwLCAweDU4LCAweDRFLCAweDI2LCAweDc4LCAweEZGLCAweEZGLCAweDU4LCAweEY1LCAweDJELCAweDYwLCAweDk0LCAweDY0LCAweDAwLCAweEY0LAorCSAweDQwLCAweDQ4LCAweDI4LCAweDYwLCAweDRFLCAweDY0LCAweDIwLCAweDQwLCAweDEwLCAweDI3LCAweDAyLCAweDAwLCAweDI4LCAweDYwLCAweDJDLCAweDY0LAorCSAweDI4LCAweERCLCAweDA0LCAweDYxLCAweDAwLCAweDYwLCAweDAwLCAweDY0LCAweEU0LCAweDYwLCAweDU4LCAweDRELCAweEE3LCAweDc4LCAweEZGLCAweEZGLAorCSAweDU4LCAweEY1LCAweDNGLCAweEZDLCAweDUxLCAweEYzLCAweDIwLCAweDQwLCAweDEwLCAweDIzLCAweDAyLCAweDAwLCAweDIwLCAweEJDLCAweDA0LCAweDAwLAorCSAweDYwLCAweDQwLCAweDAxLCAweDIyLCAweDQwLCAweEJDLCAweDA0LCAweEJDLCAweDgwLCAweEJDLCAweDUxLCAweEZCLCAweDExLCAweDYwLCAweDE2LCAweDY0LAorCSAweDA4LCAweDYwLCAweDQ2LCAweEZCLCAweDA2LCAweDY0LCAweDA4LCAweDYwLCAweDRELCAweEZCLCAweDE1LCAweDYwLCAweEM2LCAweEYzLCAweEZGLCAweEZGLAorCSAweDA3LCAweEI0LCAweEEyLCAweERCLCAweDUxLCAweEYzLCAweDA4LCAweDYwLCAweDQ2LCAweEYxLCAweDYwLCAweDQwLCAweDIwLCAweDI2LCAweDAzLCAweDAwLAorCSAweDAxLCAweDI2LCAweDMyLCAweDAwLCAweDQ1LCAweDAwLCAweDA4LCAweDYwLCAweDRELCAweEYzLCAweEZGLCAweEZGLCAweERELCAweEEwLCAweDAxLCAweEE0LAorCSAweDU3LCAweDAzLCAweEEyLCAweERCLCAweDJCLCAweDYwLCAweDg4LCAweDYxLCAweEUwLCAweEEwLCAweEYwLCAweEEwLCAweDA1LCAweDA1LCAweDAxLCAweDA1LAorCSAweDA1LCAweDAwLCAweDAyLCAweEExLCAweEYwLCAweEE0LCAweDAyLCAweDAwLCAweDA0LCAweEExLCAweEUwLCAweEE0LCAweEExLCAweEQxLCAweDAxLCAweDYxLAorCSAweERDLCAweDg0LCAweENDLCAweDg0LCAweEZGLCAweEZGLCAweDAyLCAweDAzLCAweEUxLCAweDgxLCAweEZCLCAweDAxLCAweEExLCAweDgwLCAweDEwLCAweDYwLAorCSAweDlBLCAweDY0LCAweDAxLCAweDAyLCAweEUwLCAweDAxLCAweEEwLCAweEQzLCAweDExLCAweDYwLCAweDBFLCAweDYzLCAweEZBLCAweEE0LCAweENDLCAweDg0LAorCSAweDA4LCAweEEzLCAweEZELCAweDAyLCAweEIxLCAweEYxLCAweEEzLCAweEQzLCAweDAxLCAweDE4LCAweEQ1LCAweDE4LCAweEZFLCAweEEzLCAweEEzLCAweEQzLAorCSAweDY0LCAweEZCLCAweEVCLCAweDYwLCAweENELCAweDc4LCAweEZGLCAweEZGLCAweDExLCAweDYwLCAweEY0LCAweDY1LCAweDY0LCAweDQxLCAweEExLCAweEQzLAorCSAweEQ1LCAweDgwLCAweDAwLCAweEI4LCAweDI1LCAweDA3LCAweDAyLCAweDAyLCAweDA4LCAweEExLCAweEY5LCAweDAxLCAweDYxLCAweDQ0LCAweDA4LCAweDYwLAorCSAweDQ2LCAweEZCLCAweDAxLCAweDY0LCAweEExLCAweERCLCAweDQ5LCAweEQzLCAweDY0LCAweEZCLCAweEVCLCAweDYwLCAweENELCAweDc4LCAweEZGLCAweEZGLAorCSAweDExLCAweDYwLCAweEY0LCAweDY1LCAweDY0LCAweDQxLCAweEExLCAweEQzLCAweEQ1LCAweDgwLCAweDA0LCAweEIwLCAweDExLCAweDA3LCAweDAyLCAweDAyLAorCSAweDA4LCAweEExLCAweEY5LCAweDAxLCAweDYxLCAweDQ0LCAweDA4LCAweDYwLCAweDQ2LCAweEZCLCAweDQ5LCAweEQzLCAweDY0LCAweEZCLCAweEVCLCAweDYwLAorCSAweENELCAweDc4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDQ2LCAweEYzLCAweEZGLCAweEZGLCAweDA4LCAweEE0LCAweEEyLCAweERCLCAweDlBLCAweDAxLAorCSAweDE0LCAweDYwLCAweDBFLCAweDY0LCAweDBGLCAweDYwLCAweEE1LCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLAorCSAweDUxLCAweEYzLCAweEZGLCAweEZGLCAweEUzLCAweEI0LCAweDUxLCAweEZCLCAweDBDLCAweDYwLCAweDdGLCAweEYzLCAweEZGLCAweEZGLCAweEZFLCAweEI0LAorCSAweEEyLCAweERCLCAweDEwLCAweDYwLCAweDM2LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweERFLCAweEZFLCAweDBBLCAweDA0LCAweDQwLCAweDYwLAorCSAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVELCAweDYwLCAweDgxLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDYzLCAweEYxLCAweDY0LCAweEY5LCAweDBGLCAweDYwLCAweDlELCAweEY5LCAweDBFLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLAorCSAweDJELCAweEZGLCAweDIwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVELCAweDYwLCAweEEzLCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEJFLCAweEZFLCAweDA4LCAweDYwLCAweDExLCAweEYxLCAweDQwLCAweDYwLCAweDAwLCAweDY0LAorCSAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDA4LCAweDYwLCAweDExLCAweEYxLCAweDEwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweENGLCAweEZFLCAweDAwLCAweDYwLCAweDMwLCAweDY0LCAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVCLCAweDYwLCAweDU4LCAweDY0LAorCSAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDE0LCAweDYwLCAweDBFLCAweDY0LAorCSAweDBGLCAweDYwLCAweEE1LCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDAwLCAweDY0LCAweDUxLCAweEZCLAorCSAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDFCLCAweEZCLCAweDVBLCAweERCLCAweEJFLCAweEZFLCAweDAwLCAweDYwLCAweDMwLCAweDY0LCAweDA4LCAweDYwLAorCSAweDFDLCAweEZCLCAweEVCLCAweDYwLCAweDU4LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAwLCAweDYwLCAweDA4LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDMxLCAweDQwLCAweDIwLCAweDJBLCAweDM1LCAweDAwLCAweDNGLCAweEYyLCAweDQ3LCAweDY1LAorCSAweEM0LCAweDg0LCAweEU4LCAweDg0LCAweDIzLCAweEZBLCAweEYxLCAweDYwLCAweDAyLCAweDY0LCAweDI0LCAweEZBLCAweDY0LCAweEYzLCAweDAxLCAweDYwLAorCSAweEZGLCAweDY1LCAweEE0LCAweDg0LCAweDAxLCAweDIzLCAweDE0LCAweDAwLCAweDExLCAweDYwLCAweDE0LCAweDYxLCAweDExLCAweDYwLCAweEY0LCAweDY1LAorCSAweEExLCAweEQxLCAweEQ1LCAweDgwLCAweEQwLCAweDgwLCAweDBCLCAweDAzLCAweDAyLCAweDAzLCAweDA4LCAweEExLCAweEY5LCAweDAxLCAweDA0LCAweEExLAorCSAweEExLCAweEQzLCAweDAxLCAweDYwLCAweDAwLCAweDY1LCAweDYwLCAweDQ3LCAweEZGLCAweEI0LCAweEI0LCAweDg0LCAweDAxLCAweDAwLCAweDAxLCAweDY0LAorCSAweDAwLCAweEY0LCAweDA4LCAweEZBLCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDFGLCAweDYwLCAweDEwLCAweDY0LCAweDBGLCAweDYwLCAweDkwLCAweEZCLAorCSAweDI2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEZBLCAweEZFLCAweDAwLCAweDY2LAorCSAweDQ2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDVGLCAweEZCLCAweEFDLCAweDg1LAorCSAweDYwLCAweDQxLCAweDJFLCAweDYwLCAweDIyLCAweDYzLCAweDE2LCAweDYwLCAweEM2LCAweEZELCAweDE2LCAweDYwLCAweENDLCAweEZELCAweDE2LCAweDYwLAorCSAweEQ2LCAweEZELCAweDE2LCAweDYwLCAweEUwLCAweEZELCAweDVDLCAweDAzLCAweDYxLCAweDVDLCAweDAwLCAweDYzLCAweEU5LCAweDgxLCAweEZGLCAweEZGLAorCSAweDAyLCAweDI0LCAweERGLCAweDgzLCAweEZCLCAweDAyLCAweDA4LCAweDY0LCAweDUzLCAweDkwLCAweDY0LCAweDQxLCAweDAzLCAweDA0LCAweDAxLCAweDYwLAorCSAweDA4LCAweDYzLCAweDBDLCAweDAwLCAweDAxLCAweDYwLCAweDAwLCAweDYzLCAweDEwLCAweDY0LCAweEU5LCAweDgxLCAweEZGLCAweEZGLCAweDAyLCAweDI0LAorCSAweERGLCAweDgzLCAweDA4LCAweDM2LCAweDAzLCAweDAwLCAweENDLCAweDg0LCAweEZGLCAweEZGLCAweEY3LCAweDAyLCAweDE1LCAweDYwLCAweEVDLCAweEZELAorCSAweDQzLCAweDQ4LCAweDY1LCAweDQxLCAweDJCLCAweDYwLCAweERBLCAweDYzLCAweDI4LCAweDQ0LCAweEZGLCAweEI1LCAweDEwLCAweDYwLCAweDA4LCAweDY0LAorCSAweEU5LCAweDgxLCAweDU4LCAweEQxLCAweEZELCAweDA0LCAweEEzLCAweEQ5LCAweDBDLCAweDAzLCAweDU4LCAweEQxLCAweEU5LCAweDgxLCAweDQwLCAweDRBLAorCSAweEZDLCAweDA0LCAweEEzLCAweEQxLCAweDY0LCAweDQ3LCAweEIwLCAweDg0LCAweEJELCAweERCLCAweDY1LCAweDQ0LCAweEM4LCAweDg1LCAweDJBLCAweDQ0LAorCSAweEVGLCAweDAyLCAweDI4LCAweDQzLCAweDA4LCAweDNBLCAweDI0LCAweDAwLCAweDYwLCAweDQ1LCAweDA0LCAweDY0LCAweDMyLCAweDYwLCAweDAwLCAweDYzLAorCSAweDQxLCAweDQ4LCAweEU5LCAweDgxLCAweENDLCAweDg0LCAweDAyLCAweDI0LCAweERGLCAweDgzLCAweEZCLCAweDAyLCAweDYzLCAweDQwLCAweDAwLCAweDM2LAorCSAweDE3LCAweDAwLCAweDE3LCAweDYwLCAweDExLCAweEZELCAweDJFLCAweDYwLCAweDI0LCAweDYzLCAweDY1LCAweDQ0LCAweDI4LCAweDQxLCAweEU5LCAweDgxLAorCSAweDU4LCAweEQxLCAweEZELCAweDA0LCAweEEzLCAweEQ5LCAweDE1LCAweDAzLCAweDU4LCAweEQxLCAweEU5LCAweDgxLCAweDYwLCAweDQ1LCAweEZDLCAweDA0LAorCSAweEEzLCAweEQxLCAweDY0LCAweDQ3LCAweEIwLCAweDg0LCAweEJELCAweERCLCAweDAwLCAweEI5LCAweDY1LCAweDQ0LCAweEYwLCAweDAyLCAweDA5LCAweDAwLAorCSAweDY3LCAweDQzLCAweDE2LCAweDYwLCAweEM2LCAweEZELCAweDE2LCAweDYwLCAweENDLCAweEZELCAweDE2LCAweDYwLCAweEQ2LCAweEZELCAweDE2LCAweDYwLAorCSAweEUwLCAweEZELCAweDIwLCAweDQwLCAweDEwLCAweDI3LCAweDBELCAweDAwLCAweDJCLCAweDYwLCAweEUyLCAweDYxLCAweDE1LCAweDYwLCAweEVDLCAweEYzLAorCSAweEExLCAweERCLCAweEZGLCAweEI0LCAweENDLCAweDg0LCAweEE4LCAweDgzLCAweDJCLCAweDYwLCAweEQ4LCAweDY0LCAweDU4LCAweEQxLCAweDU5LCAweEQ5LAorCSAweEZELCAweDFGLCAweDJCLCAweDYwLCAweEU0LCAweDYzLCAweDE1LCAweDYwLCAweEJFLCAweEYzLCAweDA4LCAweDYxLCAweDYwLCAweEZFLCAweEEzLCAweEQxLAorCSAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweDAwLCAweEE4LCAweEU4LCAweDg0LCAweDBGLCAweDAzLCAweDYwLCAweEZFLCAweDAyLCAweDI4LCAweEY2LCAweDAxLAorCSAweDgwLCAweDYyLCAweEIyLCAweDlDLCAweEJELCAweEQ5LCAweDYyLCAweEY5LCAweENELCAweDgxLCAweDAwLCAweDM2LCAweDAxLCAweDAwLCAweEVFLCAweDAxLAorCSAweDJFLCAweDYwLCAweDI0LCAweDYzLCAweDA4LCAweDYxLCAweEVBLCAweDAxLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDJCLCAweDYwLCAweDdDLCAweDYzLAorCSAweDY1LCAweDQwLCAweEZGLCAweDM2LCAweDAyLCAweEEzLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg0LCAweDQwLCAweDI2LCAweDdGLCAweEI0LCAweDIwLCAweDI2LCAweDNGLCAweEI0LCAweDYwLCAweDQ1LCAweDgwLCAweDYzLCAweEVGLCAweDYwLAorCSAweDU4LCAweDRELCAweDMzLCAweDc4LCAweEZGLCAweEZGLCAweDE1LCAweDYwLCAweERGLCAweEZCLCAweDQwLCAweDYzLCAweEVGLCAweDYwLCAweDU4LCAweDRELAorCSAweDMzLCAweDc4LCAweEZGLCAweEZGLCAweDE1LCAweDYwLCAweEUwLCAweEZCLCAweDIwLCAweDYzLCAweEVGLCAweDYwLCAweDU4LCAweDRELCAweDMzLCAweDc4LAorCSAweEZGLCAweEZGLCAweDE1LCAweDYwLCAweEUxLCAweEZCLCAweDEwLCAweDYzLCAweEVGLCAweDYwLCAweDU4LCAweDRELCAweDMzLCAweDc4LCAweEZGLCAweEZGLAorCSAweDE1LCAweDYwLCAweEUyLCAweEZCLCAweDA4LCAweDYzLCAweEVGLCAweDYwLCAweDU4LCAweDRELCAweDMzLCAweDc4LCAweEZGLCAweEZGLCAweDE1LCAweDYwLAorCSAweEUzLCAweEZCLCAweDA0LCAweDYzLCAweEVGLCAweDYwLCAweDU4LCAweDRELCAweDMzLCAweDc4LCAweEZGLCAweEZGLCAweDE1LCAweDYwLCAweEU0LCAweEZCLAorCSAweDAyLCAweDYzLCAweEVGLCAweDYwLCAweDU4LCAweDRELCAweDMzLCAweDc4LCAweEZGLCAweEZGLCAweDE1LCAweDYwLCAweEU1LCAweEZCLCAweDAxLCAweDYzLAorCSAweEVGLCAweDYwLCAweDU4LCAweDRELCAweDMzLCAweDc4LCAweEZGLCAweEZGLCAweDE1LCAweDYwLCAweEU2LCAweEZCLCAweDJFLCAweDU4LCAweEZGLCAweEZGLAorCSAweDE1LCAweDYwLCAweEJFLCAweEYzLCAweEZGLCAweEZGLCAweDBGLCAweEI0LCAweDYwLCAweDQ1LCAweDA4LCAweDYzLCAweEVGLCAweDYwLCAweDU4LCAweDRELAorCSAweDVFLCAweDc4LCAweEZGLCAweEZGLCAweDE1LCAweDYwLCAweEU3LCAweEZCLCAweDA0LCAweDYzLCAweEVGLCAweDYwLCAweDU4LCAweDRELCAweDVFLCAweDc4LAorCSAweEZGLCAweEZGLCAweDE1LCAweDYwLCAweEU4LCAweEZCLCAweDAyLCAweDYzLCAweEVGLCAweDYwLCAweDU4LCAweDRELCAweDVFLCAweDc4LCAweEZGLCAweEZGLAorCSAweDE1LCAweDYwLCAweEU5LCAweEZCLCAweDAxLCAweDYzLCAweEVGLCAweDYwLCAweDU4LCAweDRELCAweDVFLCAweDc4LCAweEZGLCAweEZGLCAweDE1LCAweDYwLAorCSAweEVBLCAweEZCLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDYzLCAweDVDLCAweEE3LCAweDg0LCAweEVCLCAweDgzLCAweDE0LCAweDAyLCAweDAxLCAweDAzLAorCSAweEZCLCAweDAxLCAweDY0LCAweDQ0LCAweDAxLCAweDM2LCAweDBCLCAweDY0LCAweDAyLCAweDM2LCAweDBCLCAweDY0LCAweDA0LCAweDM2LCAweDBBLCAweDY0LAorCSAweDA4LCAweDM2LCAweDBBLCAweDY0LCAweDEwLCAweDM2LCAweDA5LCAweDY0LCAweDIwLCAweDM2LCAweDA5LCAweDY0LCAweDQwLCAweDM2LCAweDA5LCAweDY0LAorCSAweDgwLCAweDM2LCAweDA5LCAweDY0LCAweDExLCAweDAwLCAweDYwLCAweDQwLCAweDAxLCAweDM2LCAweDBCLCAweDY0LCAweDAyLCAweDM2LCAweDBGLCAweDY0LAorCSAweDA0LCAweDM2LCAweDBBLCAweDY0LCAweDA4LCAweDM2LCAweDBFLCAweDY0LCAweDEwLCAweDM2LCAweDA5LCAweDY0LCAweDIwLCAweDM2LCAweDBELCAweDY0LAorCSAweDQwLCAweDM2LCAweDA4LCAweDY0LCAweDgwLCAweDM2LCAweDBDLCAweDY0LCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDYzLCAweDVDLCAweEE3LCAweDg0LAorCSAweEVCLCAweDgzLCAweDBDLCAweDAyLCAweDAxLCAweDAzLCAweEZCLCAweDAxLCAweDY0LCAweDQ0LCAweDAxLCAweDM2LCAweDBBLCAweDY0LCAweDAyLCAweDM2LAorCSAweDE0LCAweDY0LCAweDA0LCAweDM2LCAweDM3LCAweDY0LCAweDA4LCAweDM2LCAweDZFLCAweDY0LCAweDA5LCAweDAwLCAweDYwLCAweDQwLCAweDAxLCAweDM2LAorCSAweDBBLCAweDY0LCAweDAyLCAweDM2LCAweDE0LCAweDY0LCAweDA0LCAweDM2LCAweDM3LCAweDY0LCAweDA4LCAweDM2LCAweDZFLCAweDY0LCAweDJELCAweDU4LAorCSAweEZGLCAweEZGLCAweDYwLCAweEZFLCAweDgxLCAweEExLCAweDdGLCAweEExLCAweDAyLCAweDA2LCAweDAwLCAweEY0LCAweDAzLCAweDYxLCAweDVELCAweEQyLAorCSAweENGLCAweDgzLCAweEQ0LCAweDgwLCAweDI1LCAweDAzLCAweDE2LCAweDAzLCAweENGLCAweDgzLCAweDYxLCAweDQ0LCAweDgwLCAweEEwLCAweDIwLCAweDAzLAorCSAweDAyLCAweDAyLCAweDAwLCAweEY0LCAweDAzLCAweDYxLCAweDVELCAweEQyLCAweENGLCAweDgzLCAweDgxLCAweEExLCAweDE5LCAweDAzLCAweDA1LCAweDA3LAorCSAweDdGLCAweEExLCAweENDLCAweDg0LCAweERELCAweDgxLCAweEU2LCAweDAzLCAweEY3LCAweDAxLCAweDAwLCAweEY0LCAweDAwLCAweEI4LCAweDA0LCAweDYxLAorCSAweEU2LCAweDAzLCAweEYyLCAweDAxLCAweDJDLCAweDQzLCAweDVELCAweEQwLCAweERFLCAweEQ5LCAweDY0LCAweDQ0LCAweDVELCAweEQwLCAweERFLCAweEQ5LAorCSAweENDLCAweDg0LCAweDgxLCAweEExLCAweDA1LCAweDAzLCAweDdGLCAweEExLCAweEY5LCAweDA0LCAweDAwLCAweEY0LCAweDAzLCAweDYxLCAweEY2LCAweDAxLAorCSAweDIwLCAweEZFLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDAxLCAweDNBLCAweDAyLCAweDAwLCAweDE2LCAweDY0LCAweDJCLCAweDAwLCAweDAyLCAweDNBLAorCSAweDAyLCAweDAwLCAweDE0LCAweDY0LCAweDI3LCAweDAwLCAweDA0LCAweDNBLCAweDAyLCAweDAwLCAweDEyLCAweDY0LCAweDIzLCAweDAwLCAweDA4LCAweDNBLAorCSAweDAyLCAweDAwLCAweDEwLCAweDY0LCAweDFGLCAweDAwLCAweDEwLCAweDNBLCAweDAyLCAweDAwLCAweDBFLCAweDY0LCAweDFCLCAweDAwLCAweDIwLCAweDNBLAorCSAweDAyLCAweDAwLCAweDBDLCAweDY0LCAweDE3LCAweDAwLCAweDQwLCAweDNBLCAweDAyLCAweDAwLCAweDBBLCAweDY0LCAweDEzLCAweDAwLCAweDgwLCAweDNBLAorCSAweDAyLCAweDAwLCAweDA4LCAweDY0LCAweDBGLCAweDAwLCAweDAxLCAweDNCLCAweDAyLCAweDAwLCAweDA2LCAweDY0LCAweDBCLCAweDAwLCAweDAyLCAweDNCLAorCSAweDAyLCAweDAwLCAweDA0LCAweDY0LCAweDA3LCAweDAwLCAweDA0LCAweDNCLCAweDAyLCAweDAwLCAweDAyLCAweDY0LCAweDAzLCAweDAwLCAweDA4LCAweDNCLAorCSAweEZGLCAweDAxLCAweDAwLCAweDY0LCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDI3LCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDM2LCAweDNBLAorCSAweDAyLCAweDAwLCAweDAwLCAweDYxLCAweDJDLCAweDAwLCAweDMwLCAweDNBLCAweDAyLCAweDAwLCAweDAyLCAweDYxLCAweDI4LCAweDAwLCAweDI0LCAweDNBLAorCSAweDAyLCAweDAwLCAweDA0LCAweDYxLCAweDI0LCAweDAwLCAweDE4LCAweDNBLCAweDAyLCAweDAwLCAweDA2LCAweDYxLCAweDIwLCAweDAwLCAweDEyLCAweDNBLAorCSAweDAyLCAweDAwLCAweDA4LCAweDYxLCAweDFDLCAweDAwLCAweDBDLCAweDNBLCAweDAyLCAweDAwLCAweDBBLCAweDYxLCAweDE4LCAweDAwLCAweDA5LCAweDNBLAorCSAweDAyLCAweDAwLCAweDBDLCAweDYxLCAweDE0LCAweDAwLCAweDA2LCAweDNBLCAweDAyLCAweDAwLCAweDBFLCAweDYxLCAweDEwLCAweDAwLCAweDZFLCAweDNBLAorCSAweDAyLCAweDAwLCAweDEwLCAweDYxLCAweDBDLCAweDAwLCAweDM3LCAweDNBLCAweDAyLCAweDAwLCAweDEyLCAweDYxLCAweDA4LCAweDAwLCAweDE0LCAweDNBLAorCSAweDAyLCAweDAwLCAweDE0LCAweDYxLCAweDA0LCAweDAwLCAweDBBLCAweDNBLCAweEZGLCAweEZGLCAweDE2LCAweDYxLCAweDAwLCAweDAwLCAweDY1LCAweDQwLAorCSAweDAxLCAweDNBLCAweDEzLCAweDAwLCAweDY2LCAweDQ1LCAweDJCLCAweDQ2LCAweDkyLCAweEZBLCAweDY1LCAweDQ2LCAweDI2LCAweEYyLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQxLCAweDAwLCAweDdGLCAweDYwLCAweDQ1LCAweDYxLCAweDQ3LCAweDAwLCAweDdGLCAweEQ0LCAweDg0LCAweDY2LCAweDQxLCAweDJCLCAweDQ2LAorCSAweDBFLCAweEYyLCAweDYwLCAweDQ1LCAweDY1LCAweDVFLCAweDBFLCAweEZBLCAweDYxLCAweDQ2LCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweENELCAweDgxLAorCSAweDdGLCAweEI0LCAweDAyLCAweDNBLCAweDAyLCAweDAwLCAweDAxLCAweDY0LCAweDJFLCAweDAwLCAweDA0LCAweDNBLCAweDAyLCAweDAwLCAweDAyLCAweDY0LAorCSAweDJBLCAweDAwLCAweDBCLCAweDNBLCAweDAyLCAweDAwLCAweDA0LCAweDY0LCAweDI2LCAweDAwLCAweDE2LCAweDNBLCAweDAyLCAweDAwLCAweDA4LCAweDY0LAorCSAweDIyLCAweDAwLCAweDBDLCAweDNBLCAweDAyLCAweDAwLCAweDEwLCAweDY0LCAweDFFLCAweDAwLCAweDEyLCAweDNBLCAweDAyLCAweDAwLCAweDIwLCAweDY0LAorCSAweDFBLCAweDAwLCAweDE4LCAweDNBLCAweDAyLCAweDAwLCAweDQwLCAweDY0LCAweDE2LCAweDAwLCAweDI0LCAweDNBLCAweDAyLCAweDAwLCAweDgwLCAweDY0LAorCSAweDEyLCAweDAwLCAweDMwLCAweDNBLCAweDAyLCAweDAwLCAweDAxLCAweDdGLCAweDBFLCAweDAwLCAweDQ4LCAweDNBLCAweDAyLCAweDAwLCAweDAyLCAweDdGLAorCSAweDBBLCAweDAwLCAweDYwLCAweDNBLCAweDAyLCAweDAwLCAweDA0LCAweDdGLCAweDA2LCAweDAwLCAweDZDLCAweDNBLCAweDAyLCAweDAwLCAweDA4LCAweDdGLAorCSAweDAyLCAweDAwLCAweDAwLCAweDY0LCAweDAwLCAweDAwLCAweDIwLCAweEZFLCAweDJBLCAweDQ1LCAweDM0LCAweDhBLCAweDYwLCAweEZFLCAweDYxLCAweDQwLAorCSAweDAwLCAweDM2LCAweDAyLCAweDAwLCAweEJELCAweEQzLCAweEMzLCAweDAxLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDUzLCAweEZCLCAweDU0LCAweEZCLAorCSAweDAwLCAweDYwLCAweDBDLCAweDYzLCAweDE0LCAweDYwLCAweEVDLCAweDYyLCAweDAwLCAweDY0LCAweDVBLCAweERCLCAweEZFLCAweDFGLCAweDAyLCAweDY0LAorCSAweDBBLCAweDYwLCAweDc4LCAweEZCLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDBBLCAweDYwLCAweDdBLCAweEYzLCAweDAwLCAweDYzLCAweEYwLCAweEEwLAorCSAweDAxLCAweEE0LCAweDAzLCAweDAzLCAweEEyLCAweERCLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweEEyLCAweERELCAweDBBLCAweDYwLCAweDdCLCAweEYxLAorCSAweEEyLCAweERELCAweDVBLCAweEQzLCAweEEyLCAweERELCAweEMwLCAweDgxLCAweDYxLCAweDQ0LCAweDAyLCAweDI0LCAweEZGLCAweEZGLCAweEU5LCAweDgxLAorCSAweEU5LCAweDgxLCAweEU5LCAweDgxLCAweEU5LCAweDgxLCAweDVBLCAweEQzLCAweEU5LCAweDgxLCAweEU4LCAweDgzLCAweEVCLCAweDgzLCAweEVCLCAweDgzLAorCSAweEVCLCAweDgzLCAweEVCLCAweDg1LCAweEQ0LCAweDg1LCAweEM1LCAweDgzLCAweEEyLCAweERELCAweDYzLCAweDQ3LCAweDAwLCAweDdGLCAweDBBLCAweDYwLAorCSAweDc3LCAweEZCLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDdGLCAweDY3LCAweDAxLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweEIxLCAweEZFLAorCSAweDA1LCAweDA1LCAweEIwLCAweEZFLCAweDA2LCAweDA1LCAweEIyLCAweEZFLCAweEIzLCAweEZFLCAweDIxLCAweDAwLCAweEY3LCAweDYwLCAweDM4LCAweDc4LAorCSAweEZGLCAweEZGLCAweDI4LCAweEYzLCAweDI5LCAweEYxLCAweDQwLCAweDQ0LCAweDQ0LCAweDQ1LCAweDJBLCAweEYxLCAweDJCLCAweEYxLCAweDQ0LCAweDQ2LAorCSAweDQ0LCAweDQ3LCAweDNGLCAweEI0LCAweEUwLCAweDg1LCAweDE5LCAweDYwLCAweDA2LCAweDY0LCAweDQ0LCAweEQ3LCAweDU4LCAweDQzLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQ1LCAweDBBLCAweDYwLCAweDdFLCAweEYzLCAweDYxLCAweDQzLCAweDA0LCAweEI0LCAweDI0LCAweDQ0LCAweDAyLCAweDAzLCAweDEzLCAweEZGLAorCSAweDA2LCAweDAwLCAweDNGLCAweEI0LCAweEI0LCAweDg0LCAweEZGLCAweDI3LCAweDA1LCAweEZELCAweDA0LCAweEZCLCAweDEwLCAweDc1LCAweEExLCAweEZGLAorCSAweEZGLCAweEZGLCAweDg2LCAweDNFLCAweEI0LCAweEZFLCAweDA5LCAweDA1LCAweEI1LCAweEZFLCAweDAyLCAweDI0LCAweDdGLCAweEY3LCAweEZGLCAweEZGLAorCSAweEZGLCAweEZGLCAweEI3LCAweEZFLCAweDA1LCAweDA1LCAweEI2LCAweEZFLCAweEYyLCAweDAxLCAweEY3LCAweDYwLCAweDczLCAweDc4LCAweEZGLCAweEZGLAorCSAweDM2LCAweDQ0LCAweDAwLCAweDdGLCAweEVFLCAweEEwLCAweDYwLCAweDQ1LCAweDA1LCAweDA1LCAweDE5LCAweDYwLCAweDk4LCAweDY0LCAweDQ0LCAweEQ3LAorCSAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEU0LCAweDAxLCAweEUzLCAweDAxLCAweDdGLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLAorCSAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDEwLCAweDAyLCAweDEwLCAweDY0LCAweDQwLCAweDQwLCAweDAyLCAweDY0LCAweDQwLCAweDUwLCAweDYxLCAweEZGLAorCSAweDNGLCAweDQwLCAweDQwLCAweDI2LCAweDA0LCAweDAwLCAweDEwLCAweEUwLCAweDQ2LCAweDYwLCAweDA5LCAweEUwLCAweDAwLCAweDAwLCAweDI3LCAweEYxLAorCSAweDAwLCAweDY2LCAweDIwLCAweDc4LCAweDQyLCAweEZFLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDdGLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LAorCSAweEE0LCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDE5LCAweDAyLCAweDBBLCAweDYwLCAweDdFLCAweEYzLCAweDA3LCAweDdDLCAweDIwLCAweEI1LAorCSAweDBDLCAweEI1LCAweDA0LCAweDAzLCAweDAzLCAweDAyLCAweEJDLCAweEY5LCAweDAwLCAweDY3LCAweDBGLCAweDAwLCAweDAwLCAweDYxLCAweDQxLCAweDU2LAorCSAweEM3LCAweEZFLCAweEI1LCAweDAxLCAweDM2LCAweDQ3LCAweEZGLCAweDIzLCAweDA0LCAweDAwLCAweDAwLCAweDdGLCAweDYwLCAweDQxLCAweDdGLCAweDY3LAorCSAweDA0LCAweDAwLCAweDIwLCAweDQ0LCAweDgwLCAweEJDLCAweDQwLCAweDQwLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDdGLCAweDYwLAorCSAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDMxLCAweDAyLCAweDBBLCAweDYwLCAweDdFLCAweEYzLAorCSAweDAxLCAweDdDLCAweDIwLCAweEI1LCAweDBDLCAweEI1LCAweDAzLCAweDAzLCAweDAyLCAweDAyLCAweEJDLCAweEY5LCAweEZGLCAweEZGLCAweDAyLCAweDYxLAorCSAweDQxLCAweDU2LCAweEM3LCAweEZFLCAweEYwLCAweDYwLCAweEM3LCAweDc4LCAweEZGLCAweEZGLCAweDdELCAweEYxLCAweDIwLCAweDQ0LCAweDY0LCAweDQwLAorCSAweEZGLCAweDI2LCAweDFDLCAweDAwLCAweDdGLCAweEI0LCAweDQwLCAweDQwLCAweDVDLCAweDVFLCAweDgyLCAweEZGLCAweDI2LCAweDQ0LCAweEZELCAweEI0LAorCSAweDQwLCAweDQ2LCAweDVDLCAweDQxLCAweDg3LCAweEZGLCAweDYyLCAweEZGLCAweDBGLCAweDYwLCAweDg1LCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LAorCSAweDYwLCAweDQ2LCAweDA0LCAweDAzLCAweDA5LCAweEYyLCAweDhGLCAweEZDLCAweEFDLCAweDg2LCAweEZCLCAweDAxLCAweEQzLCAweEYzLCAweEZGLCAweEZGLAorCSAweEZFLCAweEI0LCAweEQzLCAweEZCLCAweDA2LCAweDY0LCAweDBGLCAweDYwLCAweDlGLCAweEZCLCAweDJELCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDI1LCAweDQ2LCAweDAxLCAweEYyLCAweDA4LCAweEYwLCAweDYwLCAweDQ3LCAweDAzLCAweEI0LCAweDAzLCAweEFDLCAweDdGLCAweDY3LAorCSAweDAzLCAweDYxLCAweDA4LCAweDAyLCAweDFGLCAweDYwLCAweDI2LCAweDY0LCAweDQwLCAweDRCLCAweEY2LCAweDYwLCAweDU4LCAweDRELCAweEIzLCAweDc4LAorCSAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI0LCAweDQwLCAweDAxLCAweDJCLCAweDQ5LCAweDAwLCAweDI1LCAweDQ0LAorCSAweDFGLCAweEI0LCAweEUwLCAweDg1LCAweEYxLCAweDYwLCAweDc2LCAweDY0LCAweEM0LCAweDk4LCAweEZGLCAweEZGLCAweEMwLCAweEZFLCAweDNELCAweDAwLAorCSAweEMxLCAweEZFLCAweDNCLCAweDAwLCAweEMyLCAweEZFLCAweDM5LCAweDAwLCAweEMzLCAweEZFLCAweDM3LCAweDAwLCAweEM0LCAweEZFLCAweDM1LCAweDAwLAorCSAweEM1LCAweEZFLCAweDMzLCAweDAwLCAweEM2LCAweEZFLCAweDMxLCAweDAwLCAweEM3LCAweEZFLCAweDJGLCAweDAwLCAweEM4LCAweEZFLCAweDJELCAweDAwLAorCSAweEM5LCAweEZFLCAweDJCLCAweDAwLCAweENBLCAweEZFLCAweDI5LCAweDAwLCAweENCLCAweEZFLCAweDI3LCAweDAwLCAweENDLCAweEZFLCAweDI1LCAweDAwLAorCSAweENELCAweEZFLCAweDIzLCAweDAwLCAweENFLCAweEZFLCAweDIxLCAweDAwLCAweENGLCAweEZFLCAweDFGLCAweDAwLCAweEQwLCAweEZFLCAweDFELCAweDAwLAorCSAweEQxLCAweEZFLCAweDFCLCAweDAwLCAweEQyLCAweEZFLCAweDE5LCAweDAwLCAweEQzLCAweEZFLCAweDE3LCAweDAwLCAweEQ0LCAweEZFLCAweDE1LCAweDAwLAorCSAweEQ1LCAweEZFLCAweDEzLCAweDAwLCAweEQ2LCAweEZFLCAweDExLCAweDAwLCAweEQ3LCAweEZFLCAweDBGLCAweDAwLCAweEQ4LCAweEZFLCAweDBELCAweDAwLAorCSAweEQ5LCAweEZFLCAweDBCLCAweDAwLCAweERBLCAweEZFLCAweDA5LCAweDAwLCAweERCLCAweEZFLCAweDA3LCAweDAwLCAweERDLCAweEZFLCAweDA1LCAweDAwLAorCSAweERELCAweEZFLCAweDAzLCAweDAwLCAweERFLCAweEZFLCAweDAxLCAweDAwLCAweERGLCAweEZFLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDY0LCAweDlGLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDlFLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDlELCAweEZFLAorCSAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDlDLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDlCLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLAorCSAweDlBLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDk5LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDk4LCAweEZFLCAweEYwLCAweDg0LAorCSAweEZGLCAweEZGLCAweDk3LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDk2LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDk1LCAweEZFLAorCSAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDk0LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDkzLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLAorCSAweDkyLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDkxLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDkwLCAweEZFLCAweEYwLCAweDg0LAorCSAweDA2LCAweEZCLCAweDhGLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDhFLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDhELCAweEZFLAorCSAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDhDLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDhCLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLAorCSAweDhBLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDg5LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDg4LCAweEZFLCAweEYwLCAweDg0LAorCSAweEZGLCAweEZGLCAweDg3LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDg2LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDg1LCAweEZFLAorCSAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDg0LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDgzLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLAorCSAweDgyLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDgxLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDgwLCAweEZFLCAweEYwLCAweDg0LAorCSAweDA1LCAweEZCLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDVDLCAweDVDLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI0LCAweDQwLCAweDAxLCAweDI3LCAweDU1LCAweDAwLCAweDA1LCAweDYwLCAweDAwLCAweDYzLCAweDA1LCAweEZELCAweDMwLCAweDQ0LCAweEJELCAweERCLAorCSAweDMxLCAweDQ0LCAweEJELCAweERCLCAweDMyLCAweDQ0LCAweEJELCAweERCLCAweDMzLCAweDQ0LCAweEJELCAweERCLCAweDM0LCAweDQ0LCAweEJELCAweERCLAorCSAweDM1LCAweDQ0LCAweEJELCAweERCLCAweDM2LCAweDQ0LCAweEJELCAweERCLCAweDM3LCAweDQ0LCAweEJELCAweERCLCAweDM4LCAweDQ0LCAweEJELCAweERCLAorCSAweDM5LCAweDQ0LCAweEJELCAweERCLCAweDNBLCAweDQ0LCAweEJELCAweERCLCAweDNCLCAweDQ0LCAweEJELCAweERCLCAweDNDLCAweDQ0LCAweEJELCAweERCLAorCSAweDNELCAweDQ0LCAweEJELCAweERCLCAweDNFLCAweDQ0LCAweEJELCAweERCLCAweDNGLCAweDQ0LCAweEJELCAweERCLCAweDAyLCAweDYxLCAweDYxLCAweDQ0LAorCSAweDAyLCAweDM2LCAweDgyLCAweEZGLCAweDAzLCAweDM2LCAweDgzLCAweEZGLCAweDA0LCAweDM2LCAweDg0LCAweEZGLCAweDA1LCAweDM2LCAweDg1LCAweEZGLAorCSAweDA2LCAweDM2LCAweDg2LCAweEZGLCAweDA3LCAweDM2LCAweDg3LCAweEZGLCAweDIwLCAweDQ0LCAweEJELCAweERCLCAweDIxLCAweDQ0LCAweEJELCAweERCLAorCSAweDIyLCAweDQ0LCAweEJELCAweERCLCAweDIzLCAweDQ0LCAweEJELCAweERCLCAweDI0LCAweDQ0LCAweEJELCAweERCLCAweDI1LCAweDQ0LCAweEJELCAweERCLAorCSAweDI2LCAweDQ0LCAweEJELCAweERCLCAweDI3LCAweDQ0LCAweEJELCAweERCLCAweDI4LCAweDQ0LCAweEJELCAweERCLCAweDI5LCAweDQ0LCAweEJELCAweERCLAorCSAweDJBLCAweDQ0LCAweEJELCAweERCLCAweDJCLCAweDQ0LCAweEJELCAweERCLCAweDJDLCAweDQ0LCAweEJELCAweERCLCAweDJELCAweDQ0LCAweEJELCAweERCLAorCSAweDJFLCAweDQ0LCAweEJELCAweERCLCAweDJGLCAweDQ0LCAweEJELCAweERCLCAweERELCAweDgxLCAweDA4LCAweDNBLCAweEQwLCAweDAxLCAweDU0LCAweDAwLAorCSAweDI3LCAweDQwLCAweDEwLCAweDI2LCAweDMwLCAweDAwLCAweDI2LCAweDQ0LCAweDAxLCAweDM2LCAweDJELCAweDAwLCAweDAyLCAweDM2LCAweDgyLCAweEZGLAorCSAweDAzLCAweDM2LCAweDgzLCAweEZGLCAweDA0LCAweDM2LCAweDg0LCAweEZGLCAweDA1LCAweDM2LCAweDg1LCAweEZGLCAweDA2LCAweDM2LCAweDg2LCAweEZGLAorCSAweDI1LCAweDQ0LCAweDAwLCAweDM2LCAweDQ0LCAweDQwLCAweDAxLCAweDM2LCAweDQ0LCAweDQxLCAweDAyLCAweDM2LCAweDQ0LCAweDQyLCAweDAzLCAweDM2LAorCSAweDQ0LCAweDQzLCAweDA0LCAweDM2LCAweDQ0LCAweDQ0LCAweDA1LCAweDM2LCAweDQ0LCAweDQ1LCAweDA2LCAweDM2LCAweDQ0LCAweDQ2LCAweDA3LCAweDM2LAorCSAweDQ0LCAweDQ3LCAweDA4LCAweDM2LCAweDQ0LCAweDQ4LCAweDA5LCAweDM2LCAweDQ0LCAweDQ5LCAweDBBLCAweDM2LCAweDQ0LCAweDRBLCAweDBCLCAweDM2LAorCSAweDQ0LCAweDRCLCAweDBDLCAweDM2LCAweDQ0LCAweDRDLCAweDBELCAweDM2LCAweDQ0LCAweDRELCAweDBFLCAweDM2LCAweDQ0LCAweDRFLCAweDBGLCAweDM2LAorCSAweDQ0LCAweDRGLCAweDg3LCAweEZGLCAweDIxLCAweDAwLCAweDI1LCAweDQ0LCAweDEwLCAweDM2LCAweDQ0LCAweDUwLCAweDExLCAweDM2LCAweDQ0LCAweDUxLAorCSAweDEyLCAweDM2LCAweDQ0LCAweDUyLCAweDEzLCAweDM2LCAweDQ0LCAweDUzLCAweDE0LCAweDM2LCAweDQ0LCAweDU0LCAweDE1LCAweDM2LCAweDQ0LCAweDU1LAorCSAweDE2LCAweDM2LCAweDQ0LCAweDU2LCAweDE3LCAweDM2LCAweDQ0LCAweDU3LCAweDE4LCAweDM2LCAweDQ0LCAweDU4LCAweDE5LCAweDM2LCAweDQ0LCAweDU5LAorCSAweDFBLCAweDM2LCAweDQ0LCAweDVBLCAweDFCLCAweDM2LCAweDQ0LCAweDVCLCAweDFDLCAweDM2LCAweDQ0LCAweDVDLCAweDFELCAweDM2LCAweDQ0LCAweDVELAorCSAweDFFLCAweDM2LCAweDQ0LCAweDVFLCAweDFGLCAweDM2LCAweDQ0LCAweDVGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweDQ2LAorCSAweEI1LCAweDYwLCAweDU4LCAweDRGLCAweDRCLCAweDc4LCAweEZGLCAweEZGLCAweDAzLCAweDYxLCAweDdGLCAweDY3LCAweDBBLCAweDAyLCAweDAwLCAweEYwLAorCSAweDA0LCAweDY0LCAweDBGLCAweDYwLCAweDkzLCAweEZCLCAweDVBLCAweEQ5LCAweDBBLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDQwLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LAorCSAweDAyLCAweDYxLCAweDEyLCAweDAyLCAweDE0LCAweDY0LCAweDBGLCAweDYwLCAweDlGLCAweEZCLCAweDAwLCAweDYwLCAweDUwLCAweDYzLCAweDVBLCAweERELAorCSAweEYyLCAweDYwLCAweEY3LCAweDY0LCAweDdGLCAweEZCLCAweDJELCAweEZGLCAweEYwLCAweDYwLCAweEM3LCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYzLAorCSAweDA1LCAweEZCLCAweDJCLCAweEYzLCAweDA2LCAweEZCLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDQwLCAweDYwLCAweEMwLCAweDY0LAorCSAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDBFLCAweDAyLCAweDE2LCAweDY0LCAweDBGLCAweDYwLCAweDlGLCAweEZCLAorCSAweDAwLCAweDYwLCAweDUwLCAweDYzLCAweDVBLCAweERELCAweEYzLCAweDYwLCAweDEyLCAweDY0LCAweDdGLCAweEZCLCAweDJELCAweEZGLCAweEYwLCAweDYwLAorCSAweEM3LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDdGLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LAorCSAweEE0LCAweDgwLCAweDAyLCAweDYxLCAweDM1LCAweDAyLCAweDI1LCAweDQ1LCAweEYxLCAweDYwLCAweDAyLCAweDY0LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLAorCSAweDM0LCAweDAzLCAweEYxLCAweDYwLCAweDAwLCAweDY0LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDAzLCAweDI4LCAweDAwLCAweDE1LCAweDYwLAorCSAweEMzLCAweEYxLCAweDk5LCAweEYzLCAweDE5LCAweDYwLCAweDAwLCAweDYxLCAweEEwLCAweDg0LCAweEExLCAweERCLCAweDI1LCAweDQ1LCAweDFFLCAweDYwLAorCSAweDk2LCAweDYzLCAweDAxLCAweDYxLCAweEJELCAweEQzLCAweEJELCAweEQxLCAweEQ0LCAweDgwLCAweEJELCAweEQzLCAweEJELCAweEQ1LCAweENELCAweDgxLAorCSAweDAyLCAweDAzLCAweDE1LCAweDAzLCAweEY3LCAweDAxLCAweEEyLCAweEZGLCAweEE2LCAweEQzLCAweDQwLCAweDRDLCAweDAwLCAweEE4LCAweDY3LCAweDQzLAorCSAweDBDLCAweDAyLCAweEEyLCAweERELCAweDQyLCAweDQ4LCAweDY0LCAweDQxLCAweEI1LCAweDYwLCAweDU4LCAweDRELCAweEEyLCAweDc4LCAweEZGLCAweEZGLAorCSAweDY2LCAweDQ0LCAweDI4LCAweERCLCAweDAyLCAweDAzLCAweDJDLCAweDU4LCAweEEzLCAweEZGLCAweDBDLCAweDYxLCAweDAzLCAweDAwLCAweDA0LCAweDYxLAorCSAweDdGLCAweDY3LCAweDAxLCAweDAwLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweEYxLCAweDYwLCAweDAyLCAweDY0LCAweEQ0LCAweDgwLAorCSAweDdGLCAweDY3LCAweDA2LCAweDYzLCAweEY4LCAweDAyLCAweDMxLCAweDQwLCAweDIxLCAweDJBLCAweEY1LCAweDAxLCAweDAxLCAweDY0LCAweDBDLCAweDYwLAorCSAweDgyLCAweEZCLCAweEZGLCAweEZGLCAweEM0LCAweEZFLCAweEVFLCAweDAxLCAweEM2LCAweEZFLCAweEVDLCAweDAxLCAweDdFLCAweDYwLCAweEMwLCAweDY0LAorCSAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDAyLCAweDYxLCAweDNGLCAweDAyLCAweDI1LCAweDQ1LCAweEY4LCAweDJCLCAweDNCLCAweDAwLCAweDJFLCAweEY1LAorCSAweDY3LCAweDQ0LCAweEQ0LCAweDgwLCAweDE5LCAweDYwLCAweEFBLCAweDYzLCAweDM5LCAweDAzLCAweDdFLCAweDYxLCAweDI0LCAweDQ0LCAweDAxLCAweDI3LAorCSAweDI5LCAweDAwLCAweEEzLCAweEZDLCAweEE0LCAweEY4LCAweEJELCAweEQzLCAweEEzLCAweEQxLCAweEQ0LCAweDgwLCAweENELCAweDgxLCAweDA4LCAweDI0LAorCSAweDY0LCAweDU4LCAweDA4LCAweEEzLCAweEY4LCAweDAyLCAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEJELCAweEQzLCAweEEzLCAweEQxLCAweEZFLCAweEEwLAorCSAweEZBLCAweDYwLCAweDAwLCAweDY0LCAweEQwLCAweDgwLCAweDE0LCAweDAyLCAweDEzLCAweDAyLCAweDA0LCAweEEzLCAweEJFLCAweEQzLCAweEJELCAweEQxLAorCSAweDBGLCAweDE4LCAweEQ0LCAweDgwLCAweDBELCAweDE4LCAweDAzLCAweDAzLCAweEMzLCAweDgzLCAweEMzLCAweDgzLCAweEY3LCAweDAxLCAweDY0LCAweDQxLAorCSAweERELCAweDgxLCAweEUxLCAweDgxLCAweENCLCAweDgzLCAweDQ2LCAweDY1LCAweEY4LCAweDYwLCAweDU4LCAweDRGLCAweDdBLCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDY3LCAweDBBLCAweDAwLCAweEJELCAweEQzLCAweEJFLCAweEQxLCAweEQ0LCAweDgwLCAweENELCAweDgxLCAweDA4LCAweDI0LCAweDY0LCAweDU4LAorCSAweDA4LCAweEEzLCAweEY4LCAweDAyLCAweDA0LCAweDYxLCAweDdGLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDY0LCAweDIzLCAweEZBLAorCSAweDY3LCAweDQ0LCAweDI0LCAweEZBLCAweDYyLCAweDQxLCAweDNFLCAweDYwLCAweDAwLCAweDY1LCAweDFBLCAweDYzLCAweEY3LCAweDYwLCAweDhDLCAweDY0LAorCSAweDY1LCAweDQ2LCAweDU4LCAweEQwLCAweDJFLCAweEY1LCAweDU5LCAweEQ4LCAweEZCLCAweDFGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDRCLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweEU4LCAweDg0LCAweERDLCAweDg0LCAweDIzLCAweEZBLCAweEJGLCAweEQxLCAweDRBLCAweDY1LAorCSAweDY0LCAweDQzLCAweEY4LCAweDYwLCAweDU4LCAweDRGLCAweDdBLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI1LCAweEYyLCAweEZGLCAweEZGLCAweEUwLCAweEEwLCAweDIwLCAweDY0LCAweDAxLCAweDA2LCAweDI1LCAweEZBLCAweDIzLCAweEYyLCAweERGLCAweEQxLAorCSAweENDLCAweDg0LCAweEUwLCAweDg1LCAweDBCLCAweDA2LCAweEJGLCAweEQxLCAweDY0LCAweDQxLCAweEQ1LCAweDgwLCAweDY0LCAweDQzLCAweDAxLCAweDA2LAorCSAweDY1LCAweDQxLCAweDRBLCAweDY1LCAweEY0LCAweDYwLCAweDU4LCAweDRGLCAweEJELCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweEJDLCAweEYzLCAweDAyLCAweDYzLCAweDIzLCAweEZDLCAweDA3LCAweEI0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDRCLCAweEQzLCAweEJGLCAweEQzLCAweDYwLCAweDQxLCAweEM5LCAweDgzLCAweEU5LCAweDgxLCAweERELCAweDgxLCAweEEzLCAweEZBLAorCSAweEUwLCAweDgxLCAweDNDLCAweDYwLCAweDAwLCAweDY3LCAweDAyLCAweDI0LCAweDAyLCAweEE0LCAweDYwLCAweDQ3LCAweDQwLCAweDRCLCAweEM5LCAweDgxLAorCSAweDRBLCAweDY1LCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LCAweEE1LCAweEQ4LCAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLAorCSAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweEY2LCAweDFGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweEZDLCAweEEzLCAweEEzLCAweEQxLAorCSAweDRDLCAweDY1LCAweEE0LCAweEQzLCAweERBLCAweDgzLCAweDYwLCAweDQ3LCAweDI1LCAweEZBLCAweDAwLCAweDdFLCAweDYwLCAweDQ3LCAweDAxLCAweDI2LAorCSAweERDLCAweDg0LCAweDYwLCAweDQxLCAweEU4LCAweDg0LCAweEQ4LCAweDg0LCAweDIzLCAweEZBLCAweEFCLCAweDAxLCAweEZDLCAweEEzLCAweEEzLCAweEQxLAorCSAweDRDLCAweDY1LCAweEE0LCAweEQzLCAweERBLCAweDgzLCAweDAwLCAweDdGLCAweDI1LCAweEZBLCAweDYwLCAweDQxLCAweDAxLCAweDI2LCAweERELCAweDgxLAorCSAweEU5LCAweDg0LCAweEQ4LCAweDg0LCAweDIzLCAweEZBLCAweDlELCAweDAxLCAweDIzLCAweEYyLCAweDI1LCAweEYyLCAweDAyLCAweEE4LCAweEY4LCAweEEwLAorCSAweDBGLCAweDAyLCAweEVDLCAweEEwLCAweDBELCAweDA0LCAweDBDLCAweDA3LCAweDE1LCAweDYwLCAweEQyLCAweEYxLCAweEZGLCAweEZGLCAweEQwLCAweDgwLAorCSAweEZGLCAweEZGLCAweDA0LCAweDA3LCAweDE1LCAweDYwLCAweEQyLCAweEZCLCAweDE1LCAweDYwLCAweEQ2LCAweEZCLCAweDEzLCAweDYwLCAweDVCLCAweEZCLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDE0LCAweDYwLCAweEVFLCAweDY1LCAweDYwLCAweDQxLCAweDE0LCAweDYwLAorCSAweDhBLCAweDYzLCAweEEzLCAweERCLCAweEZGLCAweEExLCAweDQ4LCAweDY0LCAweDU4LCAweEQwLCAweDdFLCAweEE4LCAweDVCLCAweEQ5LCAweDAyLCAweDAyLAorCSAweDAwLCAweEY0LCAweDAyLCAweDY0LCAweEZGLCAweEExLCAweEQ3LCAweDgwLCAweDAyLCAweDAzLCAweDAxLCAweDAzLCAweEY1LCAweDAxLCAweDJFLCAweEY1LAorCSAweDAwLCAweDYwLCAweDJGLCAweDY1LCAweDI1LCAweEYyLCAweDAwLCAweDYzLCAweENDLCAweDg0LCAweDAzLCAweEEzLCAweEZELCAweDA1LCAweDRBLCAweDY0LAorCSAweEQ3LCAweDgwLCAweDE0LCAweDYwLCAweDI2LCAweDYxLCAweDE4LCAweDA1LCAweEExLCAweERELCAweEUzLCAweDgzLCAweEZFLCAweEEzLCAweDU4LCAweEQwLAorCSAweDdFLCAweEE4LCAweDU5LCAweEQ5LCAweDAyLCAweDAyLCAweDAwLCAweEY0LCAweDAyLCAweDY0LCAweEY5LCAweDFGLCAweDAwLCAweDYzLCAweDU5LCAweERELAorCSAweDJFLCAweEY1LCAweDI1LCAweEYwLCAweDBBLCAweDYwLCAweDEzLCAweEYzLCAweEQzLCAweDgwLCAweDAxLCAweEIwLCAweDA0LCAweDAzLCAweDAxLCAweEE0LAorCSAweDAzLCAweDAzLCAweEEyLCAweERCLCAweDAxLCAweDAwLCAweEEyLCAweERELCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDE0LCAweDYwLAorCSAweDhBLCAweDYxLCAweEExLCAweEQzLCAweDIzLCAweEZBLCAweEUwLCAweDgzLCAweDRBLCAweDY1LCAweDA0LCAweDAyLCAweDAyLCAweDYzLCAweDIzLCAweEZDLAorCSAweEE1LCAweEZDLCAweDA5LCAweDAwLCAweERCLCAweDgzLCAweDU5LCAweEQxLCAweEE1LCAweEQ4LCAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLAorCSAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweEY4LCAweDFGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDBBLCAweDYwLCAweDEzLCAweEYzLAorCSAweDAwLCAweDYxLCAweDAyLCAweEE0LCAweEZFLCAweEEwLCAweDIzLCAweEZBLCAweDFCLCAweDAzLCAweEZBLCAweEE0LCAweEZELCAweEE0LCAweDAxLCAweEExLAorCSAweEZELCAweDA3LCAweDYxLCAweDQzLCAweDIzLCAweEYyLCAweDI1LCAweEZDLCAweEUwLCAweDgzLCAweDAyLCAweEEzLCAweDE0LCAweDYwLCAweDI2LCAweDYxLAorCSAweDAwLCAweDYwLCAweDRBLCAweDY0LCAweDU5LCAweEQxLCAweDU4LCAweEQ4LCAweDdFLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDAyLCAweDY0LAorCSAweEY5LCAweDFGLCAweDI1LCAweEYyLCAweDIzLCAweEYyLCAweDAxLCAweEIwLCAweENDLCAweDg0LCAweDA0LCAweDAyLCAweDIzLCAweEZBLCAweDAyLCAweDAwLAorCSAweDAwLCAweDY0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDQxLCAweDRCLCAweDY1LCAweDQyLCAweDgwLCAweDY0LAorCSAweEQ0LCAweDg1LCAweDJCLCAweDQxLCAweDAwLCAweEExLCAweDU1LCAweDhCLCAweDBELCAweDAzLCAweDAyLCAweDA0LCAweDY1LCAweDQxLCAweDAyLCAweDAwLAorCSAweDAwLCAweDY0LCAweDQwLCAweDRCLCAweENBLCAweDg0LCAweDU4LCAweEQwLCAweEM5LCAweDgxLCAweEJELCAweEQ5LCAweEZDLCAweDAyLCAweDAwLCAweEY0LAorCSAweDA0LCAweDY1LCAweEVDLCAweDAxLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEZDLCAweEEzLCAweEEzLCAweEQzLCAweDAyLCAweDdDLCAweEEwLCAweEQzLAorCSAweDIzLCAweEY4LCAweERDLCAweDg0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAyLCAweDY0LCAweDIzLCAweEZBLAorCSAweDAxLCAweDY0LCAweDlELCAweEZFLCAweDAyLCAweDI4LCAweDAyLCAweDY0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDAyLCAweDdDLCAweDIzLCAweEY4LCAweDAxLCAweDY0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweEZDLCAweEEzLAorCSAweEEzLCAweEQxLCAweDAyLCAweDY0LCAweDIzLCAweEZBLCAweDY0LCAweDQ0LCAweDdDLCAweDVGLCAweDYwLCAweDQ1LCAweDY0LCAweDQ3LCAweDdDLCAweDVGLAorCSAweDg4LCAweEYxLCAweDY2LCAweDQxLCAweEMwLCAweDg2LCAweEE1LCAweEQyLCAweDYxLCAweDQ2LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDAyLCAweDY0LCAweDIzLCAweEZBLCAweDg4LCAweEZGLCAweDc1LCAweDQ0LCAweDhELCAweEZGLCAweEU4LCAweDg3LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg0LCAweDAzLCAweEI0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDA1LCAweDY0LCAweDIzLCAweEZBLAorCSAweDUyLCAweDYzLCAweDk2LCAweEYzLCAweDRCLCAweERBLCAweDk1LCAweEYzLCAweDRCLCAweERBLCAweDk0LCAweEYzLCAweDRCLCAweERBLCAweDYwLCAweDQxLAorCSAweDg4LCAweEZGLCAweDcyLCAweDVDLCAweDg5LCAweEZGLCAweDRBLCAweEQ4LCAweEEyLCAweDQ4LCAweDIwLCAweDIzLCAweDBFLCAweDAwLCAweDY0LCAweDQwLAorCSAweDgwLCAweDI3LCAweDE1LCAweDAwLCAweERDLCAweDg0LCAweEJELCAweERBLCAweEJELCAweEQyLCAweDExLCAweDA0LCAweERDLCAweDg0LCAweEEyLCAweERBLAorCSAweEEzLCAweEQyLCAweDBELCAweDA0LCAweERDLCAweDg0LCAweEEzLCAweERBLCAweDBBLCAweDAwLCAweDUyLCAweDYzLCAweDk2LCAweEYzLCAweDRCLCAweERBLAorCSAweDk1LCAweEYzLCAweDRCLCAweERBLCAweDk0LCAweEYzLCAweDRCLCAweERBLCAweDU0LCAweDkwLCAweDRDLCAweDYzLCAweEUwLCAweDAyLCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweEYwLCAweDIzLCAweEYyLCAweDE1LCAweDYwLCAweEM5LCAweEY5LCAweDAyLCAweEE4LCAweDY0LCAweDQ0LAorCSAweDFGLCAweDAyLCAweDNGLCAweDQwLCAweDAyLCAweDJCLCAweDE2LCAweDAwLCAweDAwLCAweDM3LCAweDE0LCAweDAwLCAweDAxLCAweDNCLCAweDE4LCAweDAwLAorCSAweDExLCAweDYwLCAweEY5LCAweDY1LCAweDExLCAweDYwLCAweDE5LCAweDYzLCAweEZGLCAweEI3LCAweDYwLCAweDVDLCAweEEzLCAweEQzLCAweDA4LCAweEEzLAorCSAweDAwLCAweDdFLCAweEQwLCAweDgwLCAweEQ3LCAweDgwLCAweDAzLCAweDAzLCAweEY5LCAweDAyLCAweDdGLCAweDY3LCAweDBBLCAweDAwLCAweEY0LCAweEEzLAorCSAweEEzLCAweEQxLCAweDA0LCAweDAwLCAweDAwLCAweEJDLCAweEYyLCAweEE0LCAweDAzLCAweDAzLCAweDAyLCAweDA3LCAweDEzLCAweDYwLCAweDUyLCAweEY5LAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIwLCAweDYzLCAweDI3LCAweDYwLCAweDA2LCAweDYxLCAweDQ4LCAweDY0LCAweDU4LCAweEQwLAorCSAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDI1LCAweEYwLCAweDIwLCAweDY0LCAweEQwLCAweDgxLCAweEZGLCAweEZGLCAweDAyLCAweDA3LCAweDI1LCAweEZBLAorCSAweDBGLCAweDAwLCAweDI3LCAweDYwLCAweDBBLCAweDYzLCAweEMzLCAweDgzLCAweDAxLCAweDJBLCAweDA2LCAweDAwLCAweENGLCAweDgzLCAweEEzLCAweEQzLAorCSAweENELCAweDgxLCAweDAwLCAweDdGLCAweEJELCAweERCLCAweDA0LCAweDAzLCAweDAwLCAweDY0LCAweEM5LCAweDgxLCAweEJELCAweERCLCAweEZELCAweDAyLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDI1LCAweEYwLCAweDAxLCAweDYwLCAweDZFLCAweDYzLCAweDdGLCAweDY3LAorCSAweDNBLCAweDE4LCAweEEzLCAweEQ5LCAweDI2LCAweEYwLCAweDdGLCAweDY3LCAweDM2LCAweDE4LCAweDVCLCAweEQ5LCAweDEzLCAweDYwLCAweDBBLCAweEYzLAorCSAweDI1LCAweEYwLCAweDYwLCAweDQwLCAweDAzLCAweDNBLCAweDJFLCAweDAwLCAweDg2LCAweEYzLCAweDg3LCAweEYzLCAweDYwLCAweDQzLCAweEUzLCAweDgzLAorCSAweDYwLCAweDQ2LCAweDBGLCAweEY4LCAweDMwLCAweDYxLCAweDk0LCAweEZBLCAweDAxLCAweDYxLCAweDkxLCAweEZBLCAweDE2LCAweDY0LCAweDEyLCAweEZBLAorCSAweDYwLCAweDQwLCAweDEwLCAweDM2LCAweDA1LCAweDAwLCAweDEyLCAweDM2LCAweDA4LCAweDAwLCAweDBDLCAweDM2LCAweDBCLCAweDAwLCAweDBGLCAweDAwLAorCSAweDQwLCAweDYxLCAweEExLCAweDgwLCAweDBBLCAweDY0LCAweDExLCAweDAyLCAweEYzLCAweDAxLCAweDEwLCAweDYxLCAweEExLCAweDgwLCAweDBFLCAweDY0LAorCSAweDBDLCAweDAyLCAweEVFLCAweDAxLCAweDA4LCAweDYxLCAweEExLCAweDgwLCAweDEwLCAweDY0LCAweDA3LCAweDAyLCAweEU5LCAweDAxLCAweEUxLCAweDgxLAorCSAweEExLCAweDgwLCAweDA1LCAweDA1LCAweEM4LCAweDg0LCAweDAxLCAweDAyLCAweEUzLCAweDAxLCAweDEyLCAweEZBLCAweDkxLCAweEZBLCAweDY2LCAweDQ0LAorCSAweDAyLCAweEE2LCAweEQ3LCAweDFGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweEZDLCAweEEzLCAweEE1LCAweEYwLCAweEEzLCAweEQxLAorCSAweEZGLCAweEZGLCAweDY0LCAweDVFLCAweDAwLCAweDdGLCAweDYwLCAweDQxLCAweDY0LCAweDQ3LCAweDdDLCAweDVGLCAweDg4LCAweEYxLCAweDY2LCAweDQzLAorCSAweEMwLCAweDg2LCAweDY1LCAweDQ0LCAweEExLCAweERBLCAweDYzLCAweDQ2LCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweEZDLCAweEEzLAorCSAweEEzLCAweEQxLCAweEZGLCAweEZGLCAweDY0LCAweDVFLCAweDAwLCAweDdGLCAweDYwLCAweDQ1LCAweDY0LCAweDQ3LCAweDdDLCAweDVGLCAweDg4LCAweEYxLAorCSAweDY2LCAweDQxLCAweEMwLCAweDg2LCAweDY1LCAweDQ0LCAweEEwLCAweEQyLCAweDYxLCAweDQ2LCAweDI1LCAweEZBLCAweDAyLCAweDY0LCAweDIzLCAweEZBLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweEYyLCAweDE1LCAweDYwLCAweEM4LCAweEZCLCAweEZGLCAweEZGLCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDI1LCAweEYwLCAweDAyLCAweEE4LCAweDAwLCAweDY3LCAweDAyLCAweDAyLCAweDJELCAweEY5LAorCSAweDJDLCAweEY5LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDI1LCAweEYyLCAweDAyLCAweEE4LCAweDAwLCAweEE4LCAweDBBLCAweDAyLAorCSAweDA3LCAweDAzLCAweEQwLCAweEEwLCAweDMwLCAweDY1LCAweDAzLCAweDA0LCAweEE3LCAweEEwLCAweDU5LCAweDY1LCAweDAxLCAweDA2LCAweDY1LCAweDQ0LAorCSAweDEzLCAweDYwLCAweDUxLCAweEZCLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweEYyLCAweDE1LCAweDYwLCAweENGLCAweEZCLAorCSAweEZGLCAweEZGLCAweDA4LCAweDJBLCAweDI1LCAweDAwLCAweDE1LCAweDYwLCAweERELCAweEYzLCAweEZGLCAweEZGLCAweEU5LCAweEI0LCAweDYwLCAweDQ0LAorCSAweDE1LCAweDYwLCAweENGLCAweEYxLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAxLCAweDI2LCAweDAyLCAweEJDLCAweDY0LCAweDQwLCAweDAyLCAweDJBLAorCSAweDA0LCAweEJDLCAweDY0LCAweDQwLCAweDA0LCAweDI2LCAweDA4LCAweDAwLCAweDE1LCAweDYwLCAweERELCAweEZCLCAweDEzLCAweDY0LCAweEFELCAweEZCLAorCSAweDAxLCAweDYwLCAweDY3LCAweDY0LCAweDM3LCAweEZCLCAweDBDLCAweDAwLCAweDEwLCAweEJDLCAweDE1LCAweDYwLCAweERELCAweEZCLCAweDA4LCAweDY0LAorCSAweEFELCAweEZCLCAweDgyLCAweEYzLCAweDAxLCAweDYwLCAweDY3LCAweDdDLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDVCLCAweDdDLCAweDM3LCAweEY5LAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweEYyLCAweDE1LCAweDYwLCAweEQwLCAweEZCLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDI1LCAweEYyLCAweDE1LCAweDYwLCAweEQxLCAweEZCLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweEYyLAorCSAweDE1LCAweDYwLCAweEVCLCAweEZCLCAweEZGLCAweEZGLCAweDBGLCAweDIyLCAweDQxLCAweDc1LCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDA0LCAweDYxLCAweDA2LCAweDAwLCAweDAxLCAweDY0LCAweDAxLCAweDAwLCAweDAwLCAweDY0LCAweDE4LCAweDYwLCAweDEzLCAweEZCLCAweDA2LCAweDYxLAorCSAweDQxLCAweDU2LCAweEM3LCAweEZFLCAweEYwLCAweDYwLCAweEM3LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDc4LCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDEwLCAweDAyLCAweDA4LCAweDYxLAorCSAweDQxLCAweDU2LCAweEM3LCAweEZFLCAweEYwLCAweDYwLCAweEM3LCAweDc4LCAweEZGLCAweEZGLCAweDM2LCAweDQ3LCAweEZGLCAweDIzLCAweDA0LCAweDAwLAorCSAweDAwLCAweDdGLCAweDYwLCAweDQxLCAweDdGLCAweDY3LCAweDAzLCAweDAwLCAweDA0LCAweDdDLCAweEJDLCAweEY5LCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDc4LCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDEwLCAweDAyLAorCSAweDBBLCAweDYxLCAweDQxLCAweDU2LCAweEM3LCAweEZFLCAweEYwLCAweDYwLCAweEM3LCAweDc4LCAweEZGLCAweEZGLCAweDM2LCAweDQ3LCAweEZGLCAweDIzLAorCSAweDA0LCAweDAwLCAweDAwLCAweDdGLCAweDYwLCAweDQxLCAweDdGLCAweDY3LCAweDAzLCAweDAwLCAweDAxLCAweDdDLCAweEJDLCAweEY5LCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAyLCAweDYzLCAweDY0LCAweEYzLCAweDIzLCAweEZDLCAweDYwLCAweDQwLCAweDAxLCAweDIzLCAweDE3LCAweDAwLAorCSAweDAxLCAweDYwLCAweEZGLCAweDY1LCAweEE0LCAweDg0LCAweDExLCAweDYwLCAweDE0LCAweDYxLCAweDExLCAweDYwLCAweEY0LCAweDY1LCAweEExLCAweEQxLAorCSAweEQ1LCAweDgwLCAweEQwLCAweDgwLCAweDBCLCAweDAzLCAweDAyLCAweDAzLCAweDA4LCAweEExLCAweEY5LCAweDAxLCAweDA0LCAweEExLCAweEExLCAweEQzLAorCSAweDAxLCAweDYwLCAweDAwLCAweDY1LCAweDYwLCAweDQ3LCAweEZGLCAweEI0LCAweEI0LCAweDg0LCAweDAxLCAweDAwLCAweEZGLCAweDY0LCAweDI1LCAweEZBLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweEEyLCAweEZGLCAweDQ2LCAweDQ1LCAweDAyLCAweEYwLCAweDA5LCAweDYwLCAweDA4LCAweDY0LAorCSAweEQwLCAweDgwLCAweDAwLCAweEY0LCAweDAxLCAweEYyLCAweDY2LCAweDVDLCAweDI1LCAweDQ2LCAweDU2LCAweDAyLCAweDcwLCAweDI3LCAweDU0LCAweDAwLAorCSAweDEyLCAweDY0LCAweDAzLCAweEZBLCAweDA0LCAweEY4LCAweDBFLCAweEYyLCAweDg3LCAweEZDLCAweDhELCAweEZDLCAweDhFLCAweEZDLCAweERBLCAweDgyLAorCSAweDE2LCAweDYxLCAweDAwLCAweDYzLCAweEM5LCAweDgxLCAweDVBLCAweERDLCAweEZELCAweDAyLCAweDYwLCAweDQwLCAweEYwLCAweDNCLCAweDE2LCAweDAwLAorCSAweDMyLCAweDQ0LCAweDhFLCAweEYzLCAweDAxLCAweEIwLCAweEY2LCAweEEwLCAweDA4LCAweDI0LCAweDJDLCAweDA1LCAweERDLCAweDgzLCAweEYwLCAweDY3LAorCSAweDBFLCAweEZBLCAweDFGLCAweDYwLCAweDBBLCAweDY0LCAweDJCLCAweERCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLAorCSAweDhFLCAweEZELCAweDJCLCAweEZGLCAweEZFLCAweDY0LCAweDNCLCAweDQyLCAweDRBLCAweERCLCAweDRGLCAweDAwLCAweDhGLCAweEYzLCAweDA5LCAweDY1LAorCSAweEQ0LCAweDgwLCAweERDLCAweDgzLCAweDE3LCAweDA1LCAweDhGLCAweEZELCAweDk4LCAweEZFLCAweDA0LCAweDA0LCAweDAwLCAweDdGLCAweDA4LCAweDdFLAorCSAweDBFLCAweEZBLCAweDNCLCAweEZGLCAweDFFLCAweDYwLCAweEZFLCAweDY0LCAweDJCLCAweERCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweDBFLCAweEYyLCAweDJCLCAweEZGLCAweDYwLCAweDQwLCAweDA4LCAweDI2LCAweEY3LCAweEZFLCAweEZELCAweDY0LCAweDNCLCAweDQyLAorCSAweDRBLCAweERCLCAweDMyLCAweDAwLCAweDhCLCAweEYzLCAweEZGLCAweEZGLCAweEQ4LCAweEEwLCAweEZGLCAweEZGLCAweDBELCAweDA0LCAweDFGLCAweDYwLAorCSAweDE2LCAweDY0LCAweDJCLCAweERCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLAorCSAweEZDLCAweDY0LCAweDNCLCAweDQyLCAweDRBLCAweERCLCAweDIxLCAweDAwLCAweDQ2LCAweDQ1LCAweDAwLCAweDY0LCAweDJCLCAweERCLCAweDI1LCAweDQ0LAorCSAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEEyLCAweEZGLCAweDAwLCAweEY0LCAweDAxLCAweEYwLAorCSAweDBBLCAweDE4LCAweDcwLCAweDY3LCAweEEwLCAweDgwLCAweEYwLCAweDY3LCAweDA2LCAweDAzLCAweEMwLCAweDg0LCAweDAxLCAweEZBLCAweDI1LCAweDQ2LAorCSAweDI1LCAweDQ0LCAweDgwLCAweEZDLCAweDA1LCAweEZBLCAweEI2LCAweDYwLCAweDU4LCAweDRFLCAweDcyLCAweDc4LCAweEZGLCAweEZGLCAweEQ0LCAweEZFLAorCSAweEEzLCAweEZGLCAweEZGLCAweDY0LCAweDNCLCAweDQyLCAweDRBLCAweERCLCAweEQ0LCAweEZFLCAweEEzLCAweEZGLCAweDJELCAweDU4LCAweEZGLCAweEZGLAorCSAweDFGLCAweDYwLCAweDA0LCAweDY0LCAweDQwLCAweDQ3LCAweDU4LCAweDRGLCAweDBELCAweDAwLCAweDFFLCAweDYwLCAweEY4LCAweDY0LCAweDQwLCAweDQ3LAorCSAweDU4LCAweDRGLCAweDE4LCAweDAwLCAweDFGLCAweDYwLCAweDEwLCAweDY0LCAweDQwLCAweDQ3LCAweDU4LCAweDRGLCAweDAzLCAweDAwLCAweEYwLCAweDYwLAorCSAweEM3LCAweDc4LCAweEZGLCAweEZGLCAweDI3LCAweEQ1LCAweDBFLCAweEYyLCAweDBCLCAweDE4LCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDA4LCAweDAwLAorCSAweDFGLCAweDYwLCAweDI2LCAweDY0LCAweDQwLCAweDRCLCAweEY2LCAweDYwLCAweDU4LCAweDRELCAweEIzLCAweDc4LCAweEZGLCAweEZGLCAweEYyLCAweDAxLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI3LCAweEQ1LCAweDBFLCAweEYyLCAweDE0LCAweDE4LCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDExLCAweDAwLAorCSAweDAyLCAweEYwLCAweDA5LCAweDYwLCAweDA4LCAweDY0LCAweEQwLCAweDgwLCAweEEyLCAweEZGLCAweDhGLCAweEYzLCAweDAyLCAweDAyLCAweENDLCAweDg0LAorCSAweDhGLCAweEZCLCAweDFGLCAweDYwLCAweDI2LCAweDY0LCAweDQwLCAweDRCLCAweEY2LCAweDYwLCAweDU4LCAweDRELCAweEIzLCAweDc4LCAweEZGLCAweEZGLAorCSAweEU5LCAweDAxLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEZCLCAweDY0LCAweDNBLCAweDQyLCAweDRBLCAweERCLCAweEEyLCAweEZGLCAweDkyLCAweEYzLAorCSAweDhFLCAweEYzLCAweENDLCAweDgwLCAweEZBLCAweEEwLCAweDAxLCAweDE0LCAweDFELCAweDA1LCAweEI1LCAweDYwLCAweDU4LCAweDRELCAweDc3LCAweDc4LAorCSAweEZGLCAweEZGLCAweEEyLCAweEZGLCAweDE3LCAweDAzLCAweEYwLCAweDY3LCAweDBFLCAweEZBLCAweDFGLCAweDYwLCAweDBBLCAweDY0LCAweDBGLCAweDYwLAorCSAweDkzLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEY2LCAweDY0LAorCSAweDNBLCAweDQyLCAweDRBLCAweERCLCAweDkyLCAweEYzLCAweDhFLCAweEYzLCAweENDLCAweDgzLCAweERDLCAweDg0LCAweDAxLCAweDE1LCAweDkyLCAweEZELAorCSAweDhFLCAweEZCLCAweEQ0LCAweEZFLCAweDkxLCAweEYzLCAweDhGLCAweEYzLCAweDAwLCAweEE4LCAweDkwLCAweEYxLCAweDAzLCAweDAyLCAweEQwLCAweDgwLAorCSAweEZGLCAweEZGLCAweDI2LCAweDA1LCAweEI1LCAweDYwLCAweDU4LCAweDRELCAweDc3LCAweDc4LCAweEZGLCAweEZGLCAweEEyLCAweEZGLCAweDIwLCAweDAzLAorCSAweDAwLCAweDYzLCAweDkxLCAweEYzLCAweDBFLCAweEZDLCAweENDLCAweDg0LCAweEZGLCAweDNBLCAweDkxLCAweEZCLCAweDk4LCAweEZFLCAweDAzLCAweDA0LAorCSAweDA4LCAweEJCLCAweDBFLCAweEZDLCAweDNCLCAweEZGLCAweDFFLCAweDYwLCAweEZFLCAweDY0LCAweDBGLCAweDYwLCAweDkzLCAweEZCLCAweDY2LCAweDQ0LAorCSAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEY3LCAweDY0LCAweDNBLCAweDQyLCAweDRBLCAweERCLAorCSAweDhGLCAweEYzLCAweDBFLCAweEYyLCAweERDLCAweDgzLCAweDA4LCAweEIwLCAweDhGLCAweEZELCAweDA4LCAweDI4LCAweEY3LCAweEZFLCAweEQ0LCAweEZFLAorCSAweEEzLCAweEZGLCAweEYwLCAweDYwLCAweEM3LCAweDc4LCAweEZGLCAweEZGLCAweEI5LCAweEZFLCAweDEzLCAweEZGLCAweDI0LCAweDQwLCAweDgwLCAweDJCLAorCSAweDBCLCAweDAwLCAweEEyLCAweEZGLCAweDI1LCAweDQ2LCAweDA5LCAweEY0LCAweDBFLCAweEYyLCAweDA1LCAweDE4LCAweDA4LCAweEJDLCAweDBFLCAweEZBLAorCSAweEZGLCAweEZGLCAweEY3LCAweEZFLCAweDAxLCAweDAwLCAweEQ4LCAweEZFLCAweEEzLCAweEZGLCAweDI1LCAweDQ2LCAweDNFLCAweEYyLCAweDAwLCAweEY0LAorCSAweDA4LCAweEYwLCAweDI1LCAweDQ2LCAweDA2LCAweEI0LCAweEZGLCAweDdGLCAweDEwLCAweEJDLCAweDA2LCAweDI2LCAweEZELCAweDdGLCAweDBFLCAweEZBLAorCSAweDNFLCAweEYyLCAweDNGLCAweEYyLCAweDYwLCAweDQxLCAweDA4LCAweDJBLCAweDY0LCAweDQ3LCAweDNGLCAweEZBLCAweDYwLCAweDQ1LCAweDEzLCAweDYwLAorCSAweDJELCAweEYzLCAweEEzLCAweEZDLCAweEFCLCAweEZDLCAweDkxLCAweEZDLCAweEQ0LCAweDgwLCAweDM4LCAweDYwLCAweEMxLCAweDY1LCAweEE1LCAweDgwLAorCSAweDAxLCAweDA0LCAweDA3LCAweDAzLCAweDIzLCAweEYwLCAweDA4LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweEY4LCAweDYwLCAweDU3LCAweDc4LAorCSAweEZGLCAweEZGLCAweEZCLCAweDYwLCAweDU4LCAweDRGLCAweDc1LCAweDc4LCAweEZGLCAweEZGLCAweDBCLCAweDA0LCAweDIzLCAweEYwLCAweDA0LCAweDY0LAorCSAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDI1LCAweDYwLCAweEY0LCAweDY0LCAweEU1LCAweDYwLCAweDc4LCAweDQxLCAweEM3LCAweDc4LCAweDk3LCAweEYxLAorCSAweDQ2LCAweDAwLCAweDNFLCAweEYwLCAweDg4LCAweEYxLCAweDY0LCAweDQ3LCAweDA3LCAweEI0LCAweDA3LCAweDM2LCAweDNCLCAweDAwLCAweDA0LCAweDAzLAorCSAweENDLCAweDg0LCAweEUwLCAweDg0LCAweEMwLCAweDgzLCAweDJELCAweDAwLCAweDJDLCAweEYyLCAweDg3LCAweEYxLCAweDAxLCAweEIwLCAweDY0LCAweDQzLAorCSAweDM1LCAweDAyLCAweDJFLCAweEYyLCAweDE1LCAweDYwLCAweDAyLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLAorCSAweDY2LCAweDQxLCAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LCAweDYxLCAweDQ2LCAweDJFLCAweEYwLCAweDYzLCAweDQ2LAorCSAweEQwLCAweDgwLCAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDJELCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLAorCSAweDA2LCAweDAyLCAweDYxLCAweDQ2LCAweDJDLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LAorCSAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweDg3LCAweEYzLCAweDA4LCAweEZFLCAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDAxLCAweDAzLAorCSAweDA5LCAweDAwLCAweDY2LCAweDQ1LCAweDYzLCAweDQ2LCAweDA2LCAweEYwLCAweDY1LCAweDQ2LCAweDY0LCAweDQ0LCAweDBDLCAweDI2LCAweDAyLCAweDAwLAorCSAweDAyLCAweDI2LCAweDA0LCAweDAwLCAweDIzLCAweEYwLCAweDA0LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDA3LCAweEZDLCAweDIzLCAweEYyLAorCSAweEZGLCAweEZGLCAweDBGLCAweDFCLCAweDFFLCAweDYwLCAweEUwLCAweDY0LCAweDBGLCAweDYwLCAweDkzLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLAorCSAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDBFLCAweEYyLCAweEM4LCAweEZFLCAweDEwLCAweEFDLCAweDBFLCAweEZBLAorCSAweDBFLCAweDAwLCAweDFFLCAweDYwLCAweEYyLCAweDY0LCAweDBGLCAweDYwLCAweDkzLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDBFLCAweEYyLCAweENFLCAweEZFLCAweDEwLCAweEFDLCAweDBFLCAweEZBLCAweEYwLCAweDYwLAorCSAweEM3LCAweDc4LCAweEZGLCAweEZGLCAweENCLCAweDg0LCAweEM5LCAweDgzLCAweEZGLCAweEZGLCAweDA4LCAweDA0LCAweDU4LCAweEQxLCAweEE1LCAweEQ4LAorCSAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweEY4LCAweDFGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI1LCAweEYwLCAweDE0LCAweDYwLCAweDE1LCAweEY5LCAweDExLCAweDAwLCAweDBELCAweDYwLCAweDAwLCAweDYyLCAweDQwLCAweDYzLCAweDVBLCAweERGLAorCSAweEZFLCAweDFGLCAweDA0LCAweDY1LCAweDBELCAweDYwLCAweDAwLCAweDYxLCAweDQ4LCAweDY0LCAweDNFLCAweDYzLCAweDdDLCAweEE4LCAweDU4LCAweEQwLAorCSAweDU5LCAweEQ5LCAweDAyLCAweDAyLCAweDAwLCAweEY0LCAweDAyLCAweDY0LCAweEY5LCAweDFGLCAweDE0LCAweDYwLCAweDE1LCAweEYxLCAweDBDLCAweDYwLAorCSAweERDLCAweDY1LCAweDAyLCAweEZFLCAweDY0LCAweDQ0LCAweEY4LCAweDg0LCAweEY4LCAweDg0LCAweEY4LCAweDg3LCAweDYwLCAweDQxLCAweDY0LCAweDQ0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEM0LCAweDg0LCAweDNFLCAweEZCLCAweDYwLCAweDQyLCAweDYxLCAweDQ0LCAweDAzLCAweEEyLCAweDYwLCAweEZFLAorCSAweEEyLCAweERCLCAweDIwLCAweEZFLCAweDY0LCAweDQ0LCAweDBELCAweDYwLCAweDAyLCAweDY1LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweEM0LCAweDg0LCAweDQwLCAweEZCLCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDAwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDVDLCAweDQxLCAweDI1LCAweEYyLCAweEZGLCAweEZGLCAweDQwLCAweDQyLCAweDgwLCAweDJCLCAweDA0LCAweDAwLCAweEZGLCAweEI0LCAweDQwLCAweDQyLAorCSAweDAxLCAweDY0LCAweDQwLCAweDQxLCAweDg3LCAweEYzLCAweDQ2LCAweDRCLCAweDg2LCAweEYzLCAweDYwLCAweDQ2LCAweEUwLCAweDgzLCAweEFCLCAweDQ2LAorCSAweDI2LCAweEYwLCAweEFCLCAweDQ2LCAweDU5LCAweEY4LCAweEFCLCAweDQ2LCAweDI3LCAweEYwLCAweEFCLCAweDQ2LCAweDVBLCAweEY4LCAweEFCLCAweDQ2LAorCSAweDI4LCAweEYwLCAweEFCLCAweDQ2LCAweDVCLCAweEY4LCAweDY2LCAweDQ0LCAweDAyLCAweEE2LCAweEYxLCAweDFGLCAweDg3LCAweEYzLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQ2LCAweEFCLCAweDQ2LCAweDBDLCAweDYwLCAweDNBLCAweDY1LCAweDIyLCAweDQ0LCAweEZGLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEM0LCAweDgxLCAweEM5LCAweDgxLCAweDUyLCAweDY0LCAweDBFLCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LAorCSAweEZELCAweDFGLCAweDIxLCAweDQ0LCAweDAxLCAweDJBLCAweDA4LCAweDAwLCAweEFCLCAweDQ2LCAweEYwLCAweEExLCAweDc2LCAweDY0LCAweDBFLCAweDYzLAorCSAweDU5LCAweEQxLCAweDU4LCAweEQ4LCAweEZELCAweDFGLCAweEFCLCAweDQ2LCAweDIyLCAweDQ0LCAweEZGLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweDBDLCAweDYwLCAweDlDLCAweDY1LCAweEM0LCAweDgxLCAweDYwLCAweDQ1LCAweEM5LCAweDgxLCAweDYyLCAweDY0LCAweDA2LCAweDYzLAorCSAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDIxLCAweDQ0LCAweDAxLCAweDJBLCAweDA4LCAweDAwLCAweEFCLCAweDQ2LCAweEY4LCAweEExLAorCSAweEI2LCAweDY0LCAweDA2LCAweDYzLCAweDU5LCAweEQxLCAweDU4LCAweEQ4LCAweEZELCAweDFGLCAweEFCLCAweDQ2LCAweDY1LCAweDQ0LCAweDBDLCAweDYwLAorCSAweEJDLCAweDY1LCAweEM0LCAweDgxLCAweEM5LCAweDgxLCAweDZBLCAweDY0LCAweDA2LCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLAorCSAweDIyLCAweDQ0LCAweEZGLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg1LCAweEM0LCAweDg0LCAweDBDLCAweDYwLCAweDgyLCAweDY1LCAweEM0LCAweDgxLAorCSAweDcyLCAweDY0LCAweDA0LCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweEFCLCAweDQ2LCAweDIxLCAweDQ0LCAweDAxLCAweDJBLAorCSAweDA2LCAweDAwLCAweEZBLCAweEExLCAweDkwLCAweDY0LCAweDA0LCAweDYzLCAweDU5LCAweEQxLCAweDU4LCAweEQ4LCAweEZELCAweDFGLCAweDNCLCAweEYwLAorCSAweDIxLCAweDQ0LCAweDAxLCAweDJBLCAweDEzLCAweDAwLCAweDIyLCAweDQ0LCAweDNELCAweEZCLCAweDYwLCAweDQxLCAweDAyLCAweEZFLCAweEY4LCAweDg0LAorCSAweEY4LCAweDg0LCAweEY4LCAweDg0LCAweDNDLCAweEZCLCAweDBDLCAweDYwLCAweDdFLCAweDYzLCAweDg4LCAweEZGLCAweENELCAweDgxLCAweDA2LCAweEEzLAorCSAweEZELCAweDBELCAweDhELCAweEZGLCAweDNCLCAweEZELCAweDY0LCAweDQ3LCAweDgwLCAweEJGLCAweDYwLCAweDVDLCAweDIyLCAweDQzLCAweDgwLCAweDYxLAorCSAweDg4LCAweEZGLCAweENGLCAweDgzLCAweEUxLCAweDgxLCAweEZELCAweDBELCAweDhELCAweEZGLCAweDYxLCAweDQ3LCAweDMxLCAweDkxLCAweEIxLCAweDg0LAorCSAweDNCLCAweEZBLCAweDg2LCAweEYzLCAweEZGLCAweEZGLCAweENDLCAweDgzLCAweEUzLCAweDgzLCAweDY2LCAweDQ0LCAweDAyLCAweEE2LCAweDNCLCAweEYwLAorCSAweDY2LCAweDQ0LCAweEIxLCAweDlDLCAweDNCLCAweEY4LCAweDAyLCAweEE2LCAweEZBLCAweDFGLCAweEFCLCAweDQ2LCAweDAwLCAweDY3LCAweDAwLCAweDYxLAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDI1LCAweEYwLCAweDAyLCAweEE4LCAweDAwLCAweDY3LCAweDI0LCAweDAyLCAweDNELCAweEYxLAorCSAweDY0LCAweDQ0LCAweDAzLCAweEI0LCAweDQwLCAweDQyLCAweEQwLCAweDgwLCAweDg3LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQ2LCAweEJCLCAweEY0LAorCSAweDgwLCAweDYxLCAweDAyLCAweDAyLCAweEUzLCAweDgzLCAweEVCLCAweDgzLCAweDIyLCAweDQ0LCAweDg4LCAweEZGLCAweENDLCAweDg0LCAweEUxLCAweDgxLAorCSAweEZELCAweDBELCAweDhELCAweEZGLCAweDYxLCAweDQ3LCAweDMxLCAweDkxLCAweDlELCAweDg1LCAweEE3LCAweDgzLCAweDNCLCAweEZDLCAweDg2LCAweEYzLAorCSAweEZGLCAweEZGLCAweENDLCAweDgzLCAweEUzLCAweDgzLCAweDY2LCAweDQ0LCAweDAyLCAweEE2LCAweEJCLCAweEYyLCAweDY2LCAweDQ0LCAweEE1LCAweDgxLAorCSAweEJCLCAweEZBLCAweDAyLCAweEE2LCAweEZBLCAweDFGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDExLCAweDY0LCAweDIzLCAweEZBLAorCSAweDI1LCAweDQ0LCAweDI0LCAweEZBLCAweDA0LCAweDY0LCAweDQwLCAweDRCLCAweDYyLCAweDQxLCAweDBDLCAweDYwLCAweDgyLCAweDY0LCAweDA0LCAweDYzLAorCSAweDU4LCAweEQxLCAweDU5LCAweEQ4LCAweEZELCAweDFGLCAweDJCLCAweDQzLCAweDAwLCAweDdDLCAweDU5LCAweEQ4LCAweDRGLCAweDhCLCAweDA2LCAweEE0LAorCSAweEY2LCAweDAyLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI3LCAweEYyLCAweDE1LCAweDYwLCAweDAyLCAweDY1LCAweDYwLCAweDQ3LAorCSAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLCAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LAorCSAweDYxLCAweDQ2LCAweDI3LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDI2LCAweEYwLAorCSAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLCAweDYxLCAweDQ2LCAweDI1LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLAorCSAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweDg3LCAweEYzLCAweDA4LCAweEZFLAorCSAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDAxLCAweDAzLCAweDJBLCAweDAwLCAweDQzLCAweDRCLCAweEFCLCAweDQ2LCAweDNCLCAweEYyLCAweDgwLCAweDYwLAorCSAweDMwLCAweDdDLCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDRFLCAweDYxLCAweDc2LCAweDY0LCAweDBFLCAweDYzLCAweEFCLCAweDQ2LCAweDU5LCAweEQwLAorCSAweEFCLCAweDQ2LCAweDU4LCAweEQ4LCAweEZCLCAweDFGLCAweDkwLCAweDY0LCAweDA0LCAweDYzLCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LAorCSAweDU4LCAweEQ4LCAweEZCLCAweDFGLCAweEQ5LCAweDgxLCAweEEwLCAweDY0LCAweDA0LCAweDYzLCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LAorCSAweDU4LCAweEQ4LCAweEZCLCAweDFGLCAweEQ5LCAweDgxLCAweEI2LCAweDY0LCAweDBFLCAweDYzLCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LAorCSAweDU4LCAweEQ4LCAweEZCLCAweDFGLCAweDAwLCAweDY3LCAweDAwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAxLCAweDY3LCAweDIwLCAweDYxLAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI3LCAweEYyLCAweDE1LCAweDYwLCAweDAyLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LAorCSAweDQ0LCAweEQzLCAweDY2LCAweDQxLCAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LCAweDYxLCAweDQ2LCAweDI3LCAweEYwLAorCSAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDI2LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLAorCSAweDAzLCAweEYyLCAweDA2LCAweDAyLCAweDYxLCAweDQ2LCAweDI1LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLAorCSAweDgwLCAweEY0LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweDg3LCAweEYzLCAweDA4LCAweEZFLCAweDYwLCAweDQzLCAweDYxLCAweDQ2LAorCSAweDAxLCAweDAzLCAweDBELCAweDAwLCAweDQzLCAweDRCLCAweEFCLCAweDQ2LCAweDNCLCAweEYyLCAweDgwLCAweDYwLCAweDMwLCAweDYxLCAweDlELCAweDg1LAorCSAweEE0LCAweDg0LCAweEEyLCAweERBLCAweEFCLCAweDQ2LCAweDAwLCAweDY3LCAweDAwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAxLCAweDY3LAorCSAweDIwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDQwLCAweDQxLCAweDRBLCAweDY0LCAweEEwLCAweEQyLCAweEZGLCAweEZGLAorCSAweDQwLCAweDQyLCAweDgwLCAweDJCLCAweDA0LCAweDAwLCAweEZGLCAweEI0LCAweDQwLCAweDQyLCAweDAxLCAweDY0LCAweDQwLCAweDQxLCAweDg3LCAweEYzLAorCSAweDQ2LCAweDRCLCAweDg2LCAweEYzLCAweDYwLCAweDQ2LCAweEUwLCAweDgzLCAweEFCLCAweDQ2LCAweDMyLCAweEYwLCAweEFCLCAweDQ2LCAweDU5LCAweEY4LAorCSAweEFCLCAweDQ2LCAweDMzLCAweEYwLCAweEFCLCAweDQ2LCAweDVBLCAweEY4LCAweEFCLCAweDQ2LCAweDM0LCAweEYwLCAweEFCLCAweDQ2LCAweDVCLCAweEY4LAorCSAweDY2LCAweDQ0LCAweDAyLCAweEE2LCAweEYxLCAweDFGLCAweDg3LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQ2LCAweEFCLCAweDQ2LCAweDBDLCAweDYwLAorCSAweDNBLCAweDY1LCAweDIyLCAweDQ0LCAweEZGLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEM0LCAweDgxLAorCSAweEM5LCAweDgxLCAweDRBLCAweDY0LCAweDBFLCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDIxLCAweDQ0LCAweDAxLCAweDJBLAorCSAweDA4LCAweDAwLCAweEFCLCAweDQ2LCAweEYwLCAweEExLCAweDc2LCAweDY0LCAweDBFLCAweDYzLCAweDU5LCAweEQxLCAweDU4LCAweEQ4LCAweEZELCAweDFGLAorCSAweEFCLCAweDQ2LCAweDIyLCAweDQ0LCAweEZGLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg1LCAweEM0LCAweDg0LCAweDBDLCAweDYwLCAweDgyLCAweDY1LAorCSAweEM0LCAweDgxLCAweDVBLCAweDY0LCAweDA0LCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweEFCLCAweDQ2LCAweDIxLCAweDQ0LAorCSAweDAxLCAweDJBLCAweDA2LCAweDAwLCAweEZBLCAweEExLCAweDkwLCAweDY0LCAweDA0LCAweDYzLCAweDU5LCAweEQxLCAweDU4LCAweEQ4LCAweEZELCAweDFGLAorCSAweDNCLCAweEYwLCAweDIxLCAweDQ0LCAweDAxLCAweDJBLCAweDEzLCAweDAwLCAweDIyLCAweDQ0LCAweDNELCAweEZCLCAweDYwLCAweDQxLCAweDAyLCAweEZFLAorCSAweEY4LCAweDg0LCAweEY4LCAweDg0LCAweEY4LCAweDg0LCAweDNDLCAweEZCLCAweDBDLCAweDYwLCAweDdFLCAweDYzLCAweDg4LCAweEZGLCAweENELCAweDgxLAorCSAweDA2LCAweEEzLCAweEZELCAweDBELCAweDhELCAweEZGLCAweDNCLCAweEZELCAweDY0LCAweDQ3LCAweDgwLCAweEJGLCAweDYwLCAweDVDLCAweDIyLCAweDQzLAorCSAweDgwLCAweDYxLCAweDg4LCAweEZGLCAweENGLCAweDgzLCAweEUxLCAweDgxLCAweEZELCAweDBELCAweDhELCAweEZGLCAweDYxLCAweDQ3LCAweDMxLCAweDkxLAorCSAweEIxLCAweDg0LCAweDNCLCAweEZBLCAweDg2LCAweEYzLCAweEZGLCAweEZGLCAweENDLCAweDgzLCAweEUzLCAweDgzLCAweDY2LCAweDQ0LCAweDAyLCAweEE2LAorCSAweDNCLCAweEYwLCAweDY2LCAweDQ0LCAweEIxLCAweDlDLCAweDNCLCAweEY4LCAweDAyLCAweEE2LCAweEZBLCAweDFGLCAweEFCLCAweDQ2LCAweDAwLCAweDY3LAorCSAweDAwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDI1LCAweEYwLCAweDAyLCAweEE4LCAweDAwLCAweDY3LCAweDI0LCAweDAyLAorCSAweDNELCAweEYxLCAweDY0LCAweDQ0LCAweDAzLCAweEI0LCAweDQwLCAweDQyLCAweEQwLCAweDgwLCAweDg3LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQ2LAorCSAweEJCLCAweEY0LCAweDgwLCAweDYxLCAweDAyLCAweDAyLCAweEUzLCAweDgzLCAweEVCLCAweDgzLCAweDIyLCAweDQ0LCAweDg4LCAweEZGLCAweENDLCAweDg0LAorCSAweEUxLCAweDgxLCAweEZELCAweDBELCAweDhELCAweEZGLCAweDYxLCAweDQ3LCAweDMxLCAweDkxLCAweDlELCAweDg1LCAweEE3LCAweDgzLCAweDNCLCAweEZDLAorCSAweDg2LCAweEYzLCAweEZGLCAweEZGLCAweENDLCAweDgzLCAweEUzLCAweDgzLCAweDY2LCAweDQ0LCAweDAyLCAweEE2LCAweEJCLCAweEYyLCAweDY2LCAweDQ0LAorCSAweEE1LCAweDgxLCAweEJCLCAweEZBLCAweDAyLCAweEE2LCAweEZBLCAweDFGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI3LCAweEYyLAorCSAweDE1LCAweDYwLCAweDAyLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLCAweDYwLCAweDQ2LAorCSAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LCAweDYxLCAweDQ2LCAweDI3LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDA0LCAweEYyLAorCSAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDI2LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLCAweDYxLCAweDQ2LAorCSAweDI1LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LAorCSAweEU4LCAweDFCLCAweDg3LCAweEYzLCAweDA4LCAweEZFLCAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDAxLCAweDAzLCAweDIxLCAweDAwLCAweDQzLCAweDRCLAorCSAweEFCLCAweDQ2LCAweDNCLCAweEYyLCAweDgwLCAweDYwLCAweDMwLCAweDdDLCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDRFLCAweDYxLCAweDc2LCAweDY0LAorCSAweDBFLCAweDYzLCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LCAweDU4LCAweEQ4LCAweEZCLCAweDFGLCAweDkwLCAweDY0LCAweDA0LCAweDYzLAorCSAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LCAweDU4LCAweEQ4LCAweEZCLCAweDFGLCAweEEwLCAweDY0LCAweDA0LCAweDYzLCAweEFCLCAweDQ2LAorCSAweDU5LCAweEQwLCAweEFCLCAweDQ2LCAweDU4LCAweEQ4LCAweEZCLCAweDFGLCAweDAwLCAweDY3LCAweDAwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDAxLCAweDY3LCAweDIwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI3LCAweEYyLCAweDE1LCAweDYwLCAweDAyLCAweDY1LCAweDYwLCAweDQ3LAorCSAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLCAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LAorCSAweDYxLCAweDQ2LCAweDI3LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDI2LCAweEYwLAorCSAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLCAweDYxLCAweDQ2LCAweDI1LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLAorCSAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweDg3LCAweEYzLCAweDA4LCAweEZFLAorCSAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDAxLCAweDAzLCAweDBELCAweDAwLCAweDQzLCAweDRCLCAweEFCLCAweDQ2LCAweDNCLCAweEYyLCAweDgwLCAweDYwLAorCSAweDMwLCAweDYxLCAweDlELCAweDg1LCAweEE0LCAweDg0LCAweEEyLCAweERBLCAweEFCLCAweDQ2LCAweDAwLCAweDY3LCAweDAwLCAweDYxLCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDAxLCAweDY3LCAweDIwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDNFLCAweEYyLCAweEFCLCAweEYxLCAweDA4LCAweEIwLAorCSAweDE5LCAweEY4LCAweDRBLCAweDAyLCAweDA3LCAweDIzLCAweDJCLCAweDAwLCAweDYwLCAweDQ3LCAweDA3LCAweEI0LCAweDg4LCAweEYxLCAweENDLCAweDg0LAorCSAweEUwLCAweDg0LCAweDQwLCAweDhBLCAweEFBLCAweDQ2LCAweDAzLCAweEYyLCAweDA0LCAweEYwLCAweDA1LCAweEYyLCAweDYwLCAweDQzLCAweEFBLCAweDQ2LAorCSAweDJDLCAweEZDLCAweDJELCAweEY4LCAweDJFLCAweEZBLCAweENCLCAweEYxLCAweDJGLCAweEY4LCAweENDLCAweEYxLCAweDMwLCAweEY4LCAweENELCAweEYxLAorCSAweDMxLCAweEY4LCAweDQ2LCAweDRBLCAweDAwLCAweEY0LCAweDAyLCAweEYyLCAweDAzLCAweEYwLCAweDA0LCAweEYyLCAweDYwLCAweDQzLCAweEFBLCAweDQ2LAorCSAweDMyLCAweEZDLCAweDMzLCAweEY4LCAweDM0LCAweEZBLCAweEFBLCAweDQ2LCAweDA1LCAweEYyLCAweDA2LCAweEYwLCAweDA3LCAweEYyLCAweDYwLCAweDQzLAorCSAweEFBLCAweDQ2LCAweDM2LCAweEZDLCAweDM3LCAweEY4LCAweDM4LCAweEZBLCAweDAzLCAweDYwLCAweDA4LCAweDY0LCAweDFDLCAweDAwLCAweDY2LCAweEYxLAorCSAweDJGLCAweEY4LCAweDY3LCAweEYxLCAweDMwLCAweEY4LCAweDY4LCAweEYxLCAweDMxLCAweEY4LCAweDQ2LCAweDRBLCAweDAwLCAweEY0LCAweDAyLCAweEYyLAorCSAweDAzLCAweEYwLCAweDA0LCAweEYyLCAweDYwLCAweDQzLCAweEFBLCAweDQ2LCAweDJDLCAweEZDLCAweDJELCAweEY4LCAweDJFLCAweEZBLCAweEFBLCAweDQ2LAorCSAweDA1LCAweEYyLCAweDA2LCAweEYwLCAweDA3LCAweEYyLCAweDYwLCAweDQzLCAweEFBLCAweDQ2LCAweDMyLCAweEZDLCAweDMzLCAweEY4LCAweDM0LCAweEZBLAorCSAweDAyLCAweDYwLCAweDA4LCAweDY0LCAweDAwLCAweDAwLCAweDJBLCAweEZBLCAweDAyLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDQyLCAweDZGLAorCSAweDZGLCAweDc0LCAweDYzLCAweDZGLCAweDY0LCAweDY1LCAweDIwLCAweDIxLCAweDIxLCAweDIwLCAweDIwLCAweDAwLCAweDUzLCAweDU0LCAweDQxLCAweDJGLAorCSAweDQxLCAweDUwLCAweDIwLCAweDQ2LCAweDc1LCAweDZFLCAweDYzLCAweDI3LCAweDczLCAweDAwLCAweDIwLCAweDAwLCAweDAzLCAweDAwLCAweDAxLCAweDAwLAorCSAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLAorCSAweDA0LCAweDAwLCAweDA2LCAweDAwLCAweDA3LCAweDAwLCAweDA1LCAweDAwLCAweDA2LCAweDAwLCAweDA3LCAweDAwLCAweDA2LCAweDAwLCAweDA2LCAweDAwLAorCSAweDA3LCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLAorCSAweDAyLCAweDAwLCAweDAwLCAweDAwLAorCit9OyAgLyogZndfaW1hZ2VfNF9kYXRhICovCisKK3N0YXRpYyBjb25zdCBDRkdfSURFTlRJVFlfU1RSQ1QgZndfaW1hZ2VfaW5mb2lkZW50aXR5W10gPSB7CisJeworCQlzaXplb2YoIENGR19JREVOVElUWV9TVFJDVCApIC8gc2l6ZW9mKGhjZl8xNikgLSAxLAorCQlDRkdfRldfSURFTlRJVFksCisJCUNPTVBfSURfRldfQVAsCisJCTMsCQkJCQkJCS8vVmFyaWFudAorCQkxLAkJCQkJCQkvL01ham9yCisJCTI0CQkJCQkJCS8vTWlub3IKKwl9LAorCXsgMDAwMCwgMDAwMCwgMDAwMCwgMDAwMCwgMDAwMCwgMDAwMCB9CQkvL2VuZHNlbnRpbmVsCit9OworCitzdGF0aWMgY29uc3QgQ0ZHX1BST0dfU1RSQ1QgZndfaW1hZ2VfY29kZVtdID0geworCXsKKwkJOCwKKwkJQ0ZHX1BST0csCisJCUNGR19QUk9HX1ZPTEFUSUxFLAkJCS8vIG1vZGUKKwkJMHgwMTQ4LAkJLy8gc2l6ZW9mKGZ3X2ltYWdlXzFfZGF0YSksCisJCTB4MDAwMDAwNjAsCQkJCQkvLyBUYXJnZXQgYWRkcmVzcyBpbiBOSUMgTWVtb3J5CisJCTB4MDAwMCwJCQkJCQkvLyBDUkM6IHllcy9ubwlUWVBFOiBwcmltYXJ5L3N0YXRpb24vdGVydGlhcnkKKwkJKGhjZl84IEZBUiAgICopIGZ3X2ltYWdlXzFfZGF0YQorCX0sCisJeworCQk4LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfVk9MQVRJTEUsCQkJLy8gbW9kZQorCQkweDI0MzIsCQkvLyBzaXplb2YoZndfaW1hZ2VfMl9kYXRhKSwKKwkJMHgwMDAwMEMxNiwJCQkJCS8vIFRhcmdldCBhZGRyZXNzIGluIE5JQyBNZW1vcnkKKwkJMHgwMDAwLAkJCQkJCS8vIENSQzogeWVzL25vCVRZUEU6IHByaW1hcnkvc3RhdGlvbi90ZXJ0aWFyeQorCQkoaGNmXzggRkFSICAgKikgZndfaW1hZ2VfMl9kYXRhCisJfSwKKwl7CisJCTgsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19WT0xBVElMRSwJCQkvLyBtb2RlCisJCTB4MTk0YywJCS8vIHNpemVvZihmd19pbWFnZV8zX2RhdGEpLAorCQkweDAwMUUzMDQ4LAkJCQkJLy8gVGFyZ2V0IGFkZHJlc3MgaW4gTklDIE1lbW9yeQorCQkweDAwMDAsCQkJCQkJLy8gQ1JDOiB5ZXMvbm8JVFlQRTogcHJpbWFyeS9zdGF0aW9uL3RlcnRpYXJ5CisJCShoY2ZfOCBGQVIgICAqKSBmd19pbWFnZV8zX2RhdGEKKwl9LAorCXsKKwkJOCwKKwkJQ0ZHX1BST0csCisJCUNGR19QUk9HX1ZPTEFUSUxFLAkJCS8vIG1vZGUKKwkJMHhiN2U0LAkJLy8gc2l6ZW9mKGZ3X2ltYWdlXzRfZGF0YSksCisJCTB4MDAxRjQwMDAsCQkJCQkvLyBUYXJnZXQgYWRkcmVzcyBpbiBOSUMgTWVtb3J5CisJCTB4MDAwMCwJCQkJCQkvLyBDUkM6IHllcy9ubwlUWVBFOiBwcmltYXJ5L3N0YXRpb24vdGVydGlhcnkKKwkJKGhjZl84IEZBUiAgICopIGZ3X2ltYWdlXzRfZGF0YQorCX0sCisJeworCQk1LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfU1RPUCwJCQkJLy8gbW9kZQorCQkwMDAwLAorIAkweDAwMEYyMTAxLAkJCQkJLy8gU3RhcnQgZXhlY3V0aW9uIGFkZHJlc3MKKwl9LAorCXsgMDAwMCwgMDAwMCwgMDAwMCwgMDAwMCwgMDAwMDAwMDAsIDAwMDAsIDAwMDAwMDAwfQorfTsKKworc3RhdGljIGNvbnN0IENGR19SQU5HRTIwX1NUUkNUIGZ3X2ltYWdlX2luZm9jb21wYXRbXSA9IHsKKwl7CTMgKyAoKDIwICogc2l6ZW9mKENGR19SQU5HRV9TUEVDX1NUUkNUKSkgLyBzaXplb2YoaGNmXzE2KSksCisJCUNGR19GV19TVVBfUkFOR0UsCisJCUNPTVBfUk9MRV9TVVBMLAorCQlDT01QX0lEX0FQRiwKKwkJeworCQkJeyA0LCAxLCAxIH0gIAkJCQkvL3ZhcmlhbnQsIGJvdHRvbSwgdG9wCisJCX0KKwl9LAorCXsJMyArICgoMjAgKiBzaXplb2YoQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QpKSAvIHNpemVvZihoY2ZfMTYpKSwKKwkJQ0ZHX01GSV9BQ1RfUkFOR0VTX1NUQSwKKwkJQ09NUF9ST0xFX0FDVCwKKwkJQ09NUF9JRF9NRkksCisJCXsKKwkJCXsgNywgMywgMyB9LCAJCQkJLy92YXJpYW50LCBib3R0b20sIHRvcAorCQkJeyA4LCAxLCAxIH0gIAkJCQkvL3ZhcmlhbnQsIGJvdHRvbSwgdG9wCisJCX0KKwl9LAorCXsJMyArICgoMjAgKiBzaXplb2YoQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QpKSAvIHNpemVvZihoY2ZfMTYpKSwKKwkJQ0ZHX0NGSV9BQ1RfUkFOR0VTX1NUQSwKKwkJQ09NUF9ST0xFX0FDVCwKKwkJQ09NUF9JRF9DRkksCisJCXsKKwkJCXsgNCwgMSwgMiB9ICAJCQkJLy92YXJpYW50LCBib3R0b20sIHRvcAorCQl9CisJfSwKKwl7IDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAsIHsgeyAwMDAwLCAwMDAwLCAwMDAwIH0gfSB9CQkJLy9lbmRzZW50aW5lbAorfTsKKworbWVtaW1hZ2UgZndfaW1hZ2UgPSB7CisJIkZVUFU3RDM3ZGhmd2NpXDAwMUMiLAkJCS8vc2lnbmF0dXJlLCA8Zm9ybWF0IG51bWJlcj4sIEMvQmluIHR5cGUKKwkoQ0ZHX1BST0dfU1RSQ1QgKikgZndfaW1hZ2VfY29kZSwKKwkweDAwMEYyMTAxLAorCTAwMDAwMDAwLAkJCQkJLy8oZHVtbXkpIHBkYXBsdWcKKwkwMDAwMDAwMCwJCQkJCS8vKGR1bW15KSBwcmlwbHVnCisJKENGR19SQU5HRTIwX1NUUkNUICopIGZ3X2ltYWdlX2luZm9jb21wYXQsCisJKENGR19JREVOVElUWV9TVFJDVCAqKSBmd19pbWFnZV9pbmZvaWRlbnRpdHksCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9kZWJ1Zy5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjUyZTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvZGVidWcuaApAQCAtMCwwICsxLDIxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGZvciBkZWJ1Z2dpbmcuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfREVCVUdfSAorI2RlZmluZSBfREVCVUdfSAorCisKKworCisvKiBUdXJuIG9uIGRlYnVnZ2luZyBoZXJlIGlmIG5vdCBkb25lIHdpdGggYSBwcmVwcm9jZXNzb3IgZGVmaW5lICovCisjaWZuZGVmIERCRworI2RlZmluZSBEQkcgMAorI2Vsc2UKKyN1bmRlZglEQkcKKyNkZWZpbmUgREJHIDEKKyNlbmRpZiAvL0RCRworCisKKworCisjaWYgREJHCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogU2V0IHRoZSBsZXZlbCBvZiBkZWJ1Z2dpbmcgaWYgbm90IGRvbmUgd2l0aCBhIHByZXByb2Nlc3NvciBkZWZpbmUuIFNlZQorICAgd2xfbWFpbi5jLCBpbml0X21vZHVsZSgpIGZvciBob3cgdGhlIGRlYnVnIGxldmVsIHRyYW5zbGF0ZXMgaW50byB0aGUKKyAgIHRoZSB0eXBlcyBvZiBtZXNzYWdlcyBkaXNwbGF5ZWQgKi8KKyNpZm5kZWYgREJHX0xWTAorI2RlZmluZSBEQkdfTFZMIDUJCQkvKiB5aWVsZHMgbm90aGluZyB2aWEgaW5pdF9tb2R1bGUsCisJCQkJCQkJICAgb3JpZ2luYWwgdmFsdWUgb2YgNSB5aWVsZHMgREJHX1RSQUNFX09OIGFuZCBEQkdfVkVSQk9TRV9PTiAqLworI2VuZGlmICAvLyBEQkdfTFZMCisKKworI2RlZmluZSBEQkdfRVJST1JfT04gICAgICAgIDB4MDAwMDAwMDFMCisjZGVmaW5lIERCR19XQVJOSU5HX09OICAgICAgMHgwMDAwMDAwMkwKKyNkZWZpbmUgREJHX05PVElDRV9PTiAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBEQkdfVFJBQ0VfT04gICAgICAgIDB4MDAwMDAwMDhMCisjZGVmaW5lIERCR19WRVJCT1NFX09OICAgICAgMHgwMDAwMDAxMEwKKyNkZWZpbmUgREJHX1BBUkFNX09OICAgICAgICAweDAwMDAwMDIwTAorI2RlZmluZSBEQkdfQlJFQUtfT04gICAgICAgIDB4MDAwMDAwNDBMCisjZGVmaW5lIERCR19SWF9PTiAgICAgICAgICAgMHgwMDAwMDEwMEwKKyNkZWZpbmUgREJHX1RYX09OICAgICAgICAgICAweDAwMDAwMjAwTAorI2RlZmluZSBEQkdfRFNfT04gICAgICAgICAgIDB4MDAwMDA0MDBMCisKKyNkZWZpbmUgREJHX0RFRkFVTFRTICAgICAgICAoREJHX0VSUk9SX09OIHwgREJHX1dBUk5JTkdfT04gfCBEQkdfQlJFQUtfT04pCisKKyNkZWZpbmUgREJHX0ZMQUdTKEEpICAgICAgICAoQSktPkRlYnVnRmxhZworI2RlZmluZSBEQkdfTkFNRShBKSAgICAgICAgIChBKS0+ZGJnTmFtZQorI2RlZmluZSBEQkdfTEVWRUwoQSkgICAgICAgIChBKS0+ZGJnTGV2ZWwKKworCisjaWZuZGVmIFBSSU5USworIyAgIGRlZmluZSBQUklOVEsoUy4uLikgICAgIHByaW50ayhTKQorI2VuZGlmIC8vIFBSSU5USworCisKKyNpZm5kZWYgREJHX1BSSU5UCisjICAgZGVmaW5lIERCR19QUklOVChTLi4uKSAgUFJJTlRLKEtFUk5fREVCVUcgUykKKyNlbmRpZiAvLyBEQkdfUFJJTlQKKworCisjaWZuZGVmIERCR19QUklOVEMKKyMgICBkZWZpbmUgREJHX1BSSU5UQyhTLi4uKSBQUklOVEsoUykKKyNlbmRpZiAvLyBEQkdfUFJJTlRDCisKKworI2lmbmRlZiBEQkdfVFJBUAorIyAgIGRlZmluZSBEQkdfVFJBUCAgICAgICAgIHt9CisjZW5kaWYgLy8gREJHX1RSQVAKKworCisjZGVmaW5lIF9FTlRFUl9TVFIgICAgICAgICAgIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4iCisjZGVmaW5lIF9MRUFWRV9TVFIgICAgICAgICAgIjw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwiCisKKworI2RlZmluZSBfREJHX0VOVEVSKEEpICAgICAgIERCR19QUklOVCgiJXM6JS4qczolc1xuIixEQkdfTkFNRShBKSwrK0RCR19MRVZFTChBKSxfRU5URVJfU1RSLF9fRlVOQ19fKQorI2RlZmluZSBfREJHX0xFQVZFKEEpICAgICAgIERCR19QUklOVCgiJXM6JS4qczolc1xuIixEQkdfTkFNRShBKSxEQkdfTEVWRUwoQSktLSxfTEVBVkVfU1RSLF9fRlVOQ19fKQorCisKKyNkZWZpbmUgREJHX0ZVTkMoRikgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqX19GVU5DX18gPSBGOworCisjZGVmaW5lIERCR19FTlRFUihBKSAgICAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFJBQ0VfT04pIF9EQkdfRU5URVIoQSk7fQorCisjZGVmaW5lIERCR19MRUFWRShBKSAgICAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFJBQ0VfT04pIF9EQkdfTEVBVkUoQSk7fQorCisjZGVmaW5lIERCR19QQVJBTShBLE4sRixTLi4uKSAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1BBUkFNX09OKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdfUFJJTlQoIiAgJXMgLS0gIkYiXG4iLE4sUyk7fQorCisKKyNkZWZpbmUgREJHX0VSUk9SKEEsUy4uLikgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19FUlJPUl9PTikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKCIlczpFUlJPUjolcyAiLERCR19OQU1FKEEpLF9fRlVOQ19fKTtEQkdfUFJJTlRDKFMpO0RCR19UUkFQO319CisKKworI2RlZmluZSBEQkdfV0FSTklORyhBLFMuLi4pIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1dBUk5JTkdfT04pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVCgiJXM6V0FSTklORzolcyAiLERCR19OQU1FKEEpLF9fRlVOQ19fKTtEQkdfUFJJTlRDKFMpO319CisKKworI2RlZmluZSBEQkdfTk9USUNFKEEsUy4uLikgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX05PVElDRV9PTikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKCIlczpOT1RJQ0U6JXMgIixEQkdfTkFNRShBKSxfX0ZVTkNfXyk7REJHX1BSSU5UQyhTKTt9fQorCisKKyNkZWZpbmUgREJHX1RSQUNFKEEsUy4uLikgICBkbyB7aWYgKERCR19GTEFHUyhBKSAmIERCR19UUkFDRV9PTikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKCIlczolcyAiLERCR19OQU1FKEEpLF9fRlVOQ19fKTtEQkdfUFJJTlRDKFMpO319IHdoaWxlICgwKQorCisKKyNkZWZpbmUgREJHX1JYKEEsUy4uLikgICAgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19SWF9PTikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKFMpO319CisKKworI2RlZmluZSBEQkdfVFgoQSxTLi4uKSAgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RYX09OKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoUyk7fX0KKworI2RlZmluZSBEQkdfRFMoQSxTLi4uKSAgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX0RTX09OKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoUyk7fX0KKworCisjZGVmaW5lIERCR19BU1NFUlQoQykgICAgICAge2lmICghKEMpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoIkFTU0VSVCglcykgLS0gJXMjJWQgKCVzKVxuIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0MsX19GSUxFX18sX19MSU5FX18sX19GVU5DX18pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR19UUkFQO319CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyICAgICAgICAgICAqZGJnTmFtZTsKKyAgICBpbnQgICAgICAgICAgICAgZGJnTGV2ZWw7CisgICAgdW5zaWduZWQgbG9uZyAgIERlYnVnRmxhZzsKK30gZGJnX2luZm9fdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbHNlIC8vIERCRworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgREJHX0RFRk4KKyNkZWZpbmUgREJHX1RSQVAKKyNkZWZpbmUgREJHX0ZVTkMoRikKKyNkZWZpbmUgREJHX1BSSU5UKFMuLi4pCisjZGVmaW5lIERCR19FTlRFUihBKQorI2RlZmluZSBEQkdfTEVBVkUoQSkKKyNkZWZpbmUgREJHX1BBUkFNKEEsTixGLFMuLi4pCisjZGVmaW5lIERCR19FUlJPUihBLFMuLi4pCisjZGVmaW5lIERCR19XQVJOSU5HKEEsUy4uLikKKyNkZWZpbmUgREJHX05PVElDRShBLFMuLi4pCisjZGVmaW5lIERCR19UUkFDRShBLFMuLi4pCisjZGVmaW5lIERCR19SWChBLFMuLi4pCisjZGVmaW5lIERCR19UWChBLFMuLi4pCisjZGVmaW5lIERCR19EUyhBLFMuLi4pCisjZGVmaW5lIERCR19BU1NFUlQoQykKKworI2VuZGlmIC8vIERCRworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisKKyNlbmRpZiAvLyBfREVCVUdfSAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9kaGYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RoZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZjU4MzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9kaGYuYwpAQCAtMCwwICsxLDM5MCBAQAorCisvLyAgIHZpbTp0dz0xMTA6dHM9NDoKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGSUxFICAgOglESEYuQworKgorKiBEQVRFCToJJERhdGU6IDIwMDQvMDcvMTkgMDg6MTY6MTQgJCAgICRSZXZpc2lvbjogMS4yICQKKyogT3JpZ2luYWwJOgkyMDA0LzA1LzI4IDE0OjA1OjM0ICAgIFJldmlzaW9uOiAxLjM2ICAgICAgVGFnOiBoY2Y3X3QyMDA0MDYwMl8wMQorKiBPcmlnaW5hbAk6CTIwMDQvMDUvMTEgMDY6MjI6NTcgICAgUmV2aXNpb246IDEuMzIgICAgICBUYWc6IGhjZjdfdDdfMjAwNDA1MTNfMDEKKyogT3JpZ2luYWwJOgkyMDA0LzA0LzE1IDA5OjI0OjQyICAgIFJldmlzaW9uOiAxLjI4ICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNDE1XzAxCisqIE9yaWdpbmFsCToJMjAwNC8wNC8wOCAxNToxODoxNiAgICBSZXZpc2lvbjogMS4yNyAgICAgIFRhZzogdDdfMjAwNDA0MTNfMDEKKyogT3JpZ2luYWwJOgkyMDA0LzA0LzAxIDE1OjMyOjU1ICAgIFJldmlzaW9uOiAxLjI1ICAgICAgVGFnOiB0N18yMDA0MDQwMV8wMQorKiBPcmlnaW5hbAk6CTIwMDQvMDMvMTAgMTU6Mzk6MjggICAgUmV2aXNpb246IDEuMjEgICAgICBUYWc6IHQyMDA0MDMxMF8wMQorKiBPcmlnaW5hbAk6CTIwMDQvMDMvMDQgMTE6MDM6MzcgICAgUmV2aXNpb246IDEuMTkgICAgICBUYWc6IHQyMDA0MDMwNF8wMQorKiBPcmlnaW5hbAk6CTIwMDQvMDMvMDIgMDk6Mjc6MTEgICAgUmV2aXNpb246IDEuMTcgICAgICBUYWc6IHQyMDA0MDMwMl8wMworKiBPcmlnaW5hbAk6CTIwMDQvMDIvMjQgMTM6MDA6MjggICAgUmV2aXNpb246IDEuMTUgICAgICBUYWc6IHQyMDA0MDIyNF8wMQorKiBPcmlnaW5hbAk6CTIwMDQvMDIvMTkgMTA6NTc6MjggICAgUmV2aXNpb246IDEuMTQgICAgICBUYWc6IHQyMDA0MDIxOV8wMQorKiBPcmlnaW5hbAk6CTIwMDMvMTEvMjcgMDk6MDA6MDkgICAgUmV2aXNpb246IDEuMyAgICAgIFRhZzogdDIwMDIxMjE2XzAxCisqCisqIEFVVEhPUiA6CUpvaG4gTWVlcnRlbnMKKyoJCQlOaWNvIFZhbHN0ZXIKKyoKKyogU1BFQ0lGSUNBVElPTjogLi4uLi4uLi4KKyoKKyogREVTQyAgIDoJZ2VuZXJpYyBmdW5jdGlvbnMgdG8gaGFuZGxlIHRoZSBkb3dubG9hZCBvZiBOSUMgZmlybXdhcmUKKyoJCQlMb2NhbCBTdXBwb3J0IFJvdXRpbmVzIGZvciBhYm92ZSBwcm9jZWR1cmVzCisqCisqCQkJQ3VzdG9taXphYmxlIHZpYSBIQ0ZDRkcuSCwgd2hpY2ggaXMgaW5jbHVkZWQgYnkgSENGLkgKKyoKKyoKKyoJREhGIGlzIChpbnRlbmRlZCB0byBiZSkgcGxhdGZvcm0taW5kZXBlbmRlbnQuCisqCURIRiBpcyBhIG1vZHVsZSB0aGF0IHByb3ZpZGVzIGEgbnVtYmVyIG9mIHJvdXRpbmVzIHRvIGRvd25sb2FkIGZpcm13YXJlCisqCWltYWdlcyAodGhlIG5hbWVzIHByaW1hcnksIHN0YXRpb24sIGFjY2VzcyBwb2ludCwgc2Vjb25kYXJ5IGFuZCB0ZXJ0aWFyeQorKglhcmUgdXNlZCBvciBoYXZlIGJlZW4gdXNlZCkgdG8gdm9sYXRpbGUgb3Igbm9udm9sYXRpbGUgbWVtb3J5CisqCWluIFdhdmVMQU4vSUVFRSBOSUNzLiBUbyBhY2hpZXZlIHRoaXMgREhGIG1ha2VzIHVzZSBvZiB0aGUgV2F2ZUxBTi9JRUVFCisqCVdDSSBhcyBpbXBsZW1lbnRlZCBieSB0aGUgSENGLW1vZHVsZS4KKyoKKyoJRG93bmxvYWQgdG8gbm9uLXZvbGF0aWxlIG1lbW9yeSBpcyB1c2VkIHRvIHVwZGF0ZSBhIFdhdmVMQU4vSUVFRSBOSUMgdG8gbmV3CisqCWZpcm13YXJlLiBOb3JtYWxseSB0aGlzIHdpbGwgYmUgYW4gdXBncmFkZSB0byBuZXdlciBmaXJtd2FyZSwgYWx0aG91Z2gKKyoJZG93bmdyYWRpbmcgdG8gb2xkZXIgZmlybXdhcmUgaXMgcG9zc2libGUgdG9vLgorKgorKiBOb3RlOiByZWxhdGl2ZSB0byBBc3NlcnRzLCB0aGUgZm9sbG93aW5nIGNhbiBiZSBvYnNlcnZlZDoKKyoJU2luY2UgdGhlIElGQiBpcyBub3Qga25vd24gaW5zaWRlIHRoZSByb3V0aW5lLCB0aGUgbWFjcm8gSENGQVNTRVJUIGlzIHJlcGxhY2VkIHdpdGggTU1EQVNTRVJULgorKglBbHNvIHRoZSBsaW5lIG51bWJlciByZXBvcnRlZCBpbiB0aGUgYXNzZXJ0IGlzIHJhaXNlZCBieSBGSUxFX05BTUVfT0ZGU0VUICgxMDAwMCkgdG8gZGlzY3JpbWluYXRlIHRoZQorKglESEYgQXNzZXJ0cyBmcm9tIEhDRiBhbmQgTU1EIGFzc2VydHMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogU09GVFdBUkUgTElDRU5TRQorKgorKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyoKKyogQ09QWVJJR0hUIKkgMTk5OSAtIDIwMDAgYnkgTHVjZW50IFRlY2hub2xvZ2llcy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBDT1BZUklHSFQgqSAyMDAxIC0gMjAwNAlieSBBZ2VyZSBTeXN0ZW1zIEluYy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisqCisqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorKiAgICBkaXN0cmlidXRpb24uCisqCisqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKgorKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIERpc2NsYWltZXIKKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorKiBEQU1BR0UuCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImhjZi5oIgorI2luY2x1ZGUgImhjZmRlZi5oIgorI2luY2x1ZGUgImRoZi5oIgorI2luY2x1ZGUgIm1tZC5oIgorCisvL3RvIGRpc3Rpbmd1aXNoIE1NRCBmcm9tIEhDRiBhc3NlcnRzIGJ5IG1lYW5zIG9mIGxpbmUgbnVtYmVyCisjdW5kZWYJRklMRV9OQU1FX09GRlNFVAorI2RlZmluZSBGSUxFX05BTUVfT0ZGU0VUIE1NRF9GSUxFX05BTUVfT0ZGU0VUCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRGVmaW5lcywgZGF0YSBzdHJ1Y3R1cmVzLCBhbmQgZ2xvYmFsIHZhcmlhYmxlcworICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLy8gICAgICAgICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0CitjaGFyIHNpZ25hdHVyZVsxNF0gPSAiRlVQVTdEMzdkaGZ3Y2kiOworCisvL1RoZSBiaW5hcnkgZG93bmxvYWQgZnVuY3Rpb24gInJlbG9jYXRlcyIgdGhlIGltYWdlIHVzaW5nIGNvbnN0cnVjdGlvbnMgbGlrZToKKy8vCWZ3LT5pZGVudGl0eSA9IChDRkdfSURFTlRJVFlfU1RSQ1QgRkFSICopKChjaGFyIEZBUiAqKWZ3LT5pZGVudGl0eSArIChoY2ZfMzIpZncgKTsKKy8vdW5kZXIgc29tZSBvZiB0aGUgbWVtb3J5IG1vZGVscyB1bmRlciBNU1ZDIDEuNTIgdGhlc2UgY29uc3RydWN0aW9ucyBkZWdyYWRlIHRvIDE2LWJpdHMgcG9pbnRlciBhcml0aG1ldGljLgorLy9mdy0+aWRlbnRpdHkgaXMgbGltaXRlZCwgc3VjaCB0aGF0IGFkZGluZyBpdCB0byBmdywgZG9lcyBub3QgbmVlZCB0byBjYXJyeSBvdmVyIGZyb20gb2Zmc2V0IHRvIHNlZ21lbnQuCisvL0hvd2V2ZXIgdGhlIHNlZ21lbnQgaXMgbm90IHNldCBhdCBhbGwuCisvL0FzIGEgd29ya2Fyb3VuZCB0aGUgUFNFVURPX0NIQVJQIG1hY3JvIGlzIGludHJvZHVjZWQgd2hpY2ggaXMgYSBjaGFyIHBvaW50ZXIgZXhjZXB0IGZvciBNU1ZDIDEuNTIsIGluCisvL3doaWNoIGNhc2Ugd2Uga25vdyB0aGF0IGEgMzItYml0IHF1YW50aXR5IGlzIGFkZXF1YXRlIGFzIGEgcG9pbnRlci4KKy8vTm90ZSB0aGF0IG90aGVyIHBsYXRmb3JtcyBtYXkgZXhwZXJpZW5jZSBjb21wYXJhYmxlIHByb2JsZW1zIHdoZW4gdXNpbmcgdGhlIGJpbmFyeSBkb3dubG9hZCBmZWF0dXJlLgorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID09ICA4MDAJCQkJLy8gVmlzdWFsIEMrKyAxLjUKKyNkZWZpbmUgUFNFVURPX0NIQVJQIGhjZl8zMgorI2Vsc2UKKyNkZWZpbmUgUFNFVURPX0NIQVJQIGhjZl84KgorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBMVFYtcmVjb3JkcyByZXRyaWV2ZWQgZnJvbSB0aGUgTklDIHRvOgorICoJLSBkZXRlcm1pbmUgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIE5JQyBhbmQgaW1hZ2UKKyAqCS0gKChzZXR1cCB0aGUgYnVmZmVyIHNpemUgZHluYW1pY2FsbHkgZm9yIG5vbi12b2xhdGlsZSBkb3dubG9hZCAoc2VlIG5vdGUgYmVsb3cpICkpCisgKgktIHN1cHBseSBwbHVnZ2luZyBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIFBEQSAoSC1JIG9ubHkpCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvLyBmb3IgVVNCL0gxIHdlIG5lZWRlZCBhIHNtYWxsZXIgdmFsdWUgdGhhbiB0aGUgQ0ZHX0RMX0JVRl9TVFJDVCByZXBvcnRlZCA4MTkyCisvLyBmb3IgdGhlIHRpbWUgYmVpbmcgaXQgc2VlbXMgc2ltcGxlciB0byBhbHdheXMgdXNlIDIwMDAgZm9yIFVTQi9IMSBhcyB3ZWxsIGFzIGFsbCBvdGhlciBjYXNlcyByYXRoZXIgdGhhbgorLy8gdXNpbmcgdGhlICJmaXhlZCBhbnl3YXkiIENGR19ETF9CVUZfU1RSQ1QuCisjZGVmaW5lIERMX1NJWkUgMjAwMAorCisvL0NGR19JREVOVElUWV9TVFJDVCAgIAlwcmlfaWRlbnRpdHkJPSB7IExPRihDRkdfSURFTlRJVFlfU1RSQ1QpLCBDRkdfUFJJX0lERU5USVRZIH07CitDRkdfU1VQX1JBTkdFX1NUUkNUIAltZmlfc3VwICAgICAgICAJPSB7IExPRihDRkdfU1VQX1JBTkdFX1NUUkNUKSwgQ0ZHX05JQ19NRklfU1VQX1JBTkdFIH07CitDRkdfU1VQX1JBTkdFX1NUUkNUIAljZmlfc3VwICAgICAgICAJPSB7IExPRihDRkdfU1VQX1JBTkdFX1NUUkNUKSwgQ0ZHX05JQ19DRklfU1VQX1JBTkdFIH07CisvKiBOb3RlOiBjb3VsZCBiZSB1c2VkIHJhdGhlciB0aGFuIHRoZSBhYm92ZSBleHBsYWluZWQgYW5kIGRlZmluZWQgRExfU0laRSBpZiBuZWVkIGFyaXNlcworICogQ0ZHX0RMX0JVRl9TVFJDVCAgICAJZGxfYnVmICAgICAgICAgCT0geyBMT0YoQ0ZHX0RMX0JVRl9TVFJDVCksIENGR19ETF9CVUYgfTsKKyovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFycmF5IGx0dl9pbmZvIHN0b3JlcyBOSUMgaW5mb3JtYXRpb24gKGluIHRoZSBmb3JtIG9mIExUVi1yZWNvcmRzKQorICogbmVlZGVkIGZvciBkb3dubG9hZC4gQSBOVUxMIHJlY29yZCBpbmRpY2F0ZXMgdGhlIGVuZCBvZiB0aGUgYXJyYXkuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRoZSBMVFZfSU5GT19TVFJVQ1QgaXMgbmVlZGVkIHRvIHNhdmUgdGhlIHNpemVzIG9mIHRoZSBzdHJ1Y3RzLCBiZWNhdXNlIGFmdGVyIGEgR0VUX0lORk8oKQorICogdGhlIGxlbiBmaWVsZCBpcyBjaGFuZ2VkIHRvIHRoZSByZWFsIGxlbiBvZiB0aGUgUklEIGJ5IHRoZSBjYWxsZWQgcm91dGluZS4KKyAqIFRoaXMgaXMgb25seSByZWxldmFudCBpZiB0aGUgREhGIHVzZWQgd2l0aG91dCByZWxvYWRpbmcgdGhlIGRyaXZlci91dGlsaXR5LgorICovCisKK0xUVl9JTkZPX1NUUlVDVCBsdHZfaW5mb1tdID0geworCXsgKExUVlApJm1maV9zdXAsCQkJTE9GKENGR19TVVBfUkFOR0VfU1RSQ1QpIH0gLAorCXsgKExUVlApJmNmaV9zdXAsCQkJTE9GKENGR19TVVBfUkFOR0VfU1RSQ1QpIH0gLAorCXsgKExUVlApIE5VTEwsIAkJCQkwIH0KK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgUFJPVE9UWVBFUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAkJCQljaGVja19jb21wX2Z3KCBtZW1pbWFnZSAqZncgKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLlNVQk1PRFVMRQkJaW50IGNoZWNrX2NvbXBfZncoIG1lbWltYWdlICpmdyApCisqLlBVUlBPU0UJCUNoZWNrcyBjb21wYXRpYmlsaXR5IG9mIENGSSBhbmQgTUZJLCBOSUMgYXMgc3VwcGxpZXIsIHN0YXRpb24vQVAgZmlybXdhcmUgaW1hZ2UgYXMgc3VwcGxpZXIuCisqCisqLkFSR1VNRU5UUworKiAgIGZ3ICAgICAgICAgCUYvVyBpbWFnZSB0byBiZSBkb3dubG9hZGVkCisqCisqLlJFVFVSTlMKKyogICBIRkNfU1VDQ0VTUyAgICAgIAktIGZpcm13YXJlIE9LCisqICAgREhGX0VSUl9JTkNPTVBfRlcKKyoKKyouREVTQ1JJUFRJT04KKyogICBUaGlzIGZ1bmN0aW9uIHVzZXMgY29tcGF0aWJpbGl0eSBhbmQgaWRlbnRpdHkgaW5mb3JtYXRpb24gdGhhdCBoYXMgYmVlbgorKiAgIHJldHJpZXZlZCBmcm9tIHRoZSBjYXJkIHdoaWNoIGlzIGN1cnJlbnRseSBpbnNlcnRlZCB0byBjaGVjayB3aGV0aGVyIHRoZQorKiAgIHN0YXRpb24gZmlybXdhcmUgaW1hZ2UgdG8gYmUgZG93bmxvYWRlZCBpcyBjb21wYXRpYmxlLgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK2NoZWNrX2NvbXBfZncoIG1lbWltYWdlICpmdyApCit7CitDRkdfUkFOR0UyMF9TVFJDVCAgCQkqcDsKK2ludCAgIAkJCQkJcmMgPSBIQ0ZfU1VDQ0VTUzsKK0NGR19SQU5HRV9TUEVDX1NUUkNUKglpOworCisJc3dpdGNoKCBmdy0+aWRlbnRpdHktPnR5cCApIHsKKwkgIGNhc2UgQ0ZHX0ZXX0lERU5USVRZOgkJCQkvL1N0YXRpb24gRi9XCisJICBjYXNlIENPTVBfSURfRldfQVBfRkFLRToJCQkvLzs/aXMgdGhpcyB1c2VmdWwgKHVzZWQgdG8gYmU6ICBDRkdfQVBfSURFTlRJVFkpCisJCWJyZWFrOworCSAgZGVmYXVsdDoKKwkJTU1EQVNTRVJUKCBET19BU1NFUlQsIGZ3LT5pZGVudGl0eS0+dHlwICkgCS8vdW5rbm93bi91bnN1cHBvcnRlZCBmaXJtd2FyZV90eXBlOgorCQlyYyA9IERIRl9FUlJfSU5DT01QX0ZXOworCQlyZXR1cm4gcmM7IC8qIDs/IGhvdyB1c2VmdWwgaXMgdGhpcyBhbnl3YXksCisJCQkJCSogIHRpbGwgdGhhdCBpcyBzb3J0ZWQgb3V0IG1pZ2h0IGFzIHdlbGwgdmlvbGF0ZSBteSBvd24gc2luZ2xlIGV4aXQgcHJpbmNpcGxlCisJCQkJCSovCisJfQorCXAgPSBmdy0+Y29tcGF0OworCWkgPSBOVUxMOworCXdoaWxlKCBwLT5sZW4gJiYgaSA9PSBOVUxMICkgewkJCQkJLy8gY2hlY2sgdGhlIE1GSSByYW5nZXMKKwkJaWYgKCBwLT50eXAgID09IENGR19NRklfQUNUX1JBTkdFU19TVEEgKSB7CisJCQlpID0gbW1kX2NoZWNrX2NvbXAoICh2b2lkKilwLCAmbWZpX3N1cCApOworCQl9CisJCXArKzsKKwl9CisJTU1EQVNTRVJUKCBpLCAwICkJLy9NRkk6IE5JQyBTdXBwbGllciBub3QgY29tcGF0aWJsZSB3aXRoIEYvVyBpbWFnZSBBY3RvcgorCWlmICggaSApIHsKKwkJcCA9IGZ3LT5jb21wYXQ7CisJCWkgPSBOVUxMOworCQl3aGlsZSAoIHAtPmxlbiAmJiBpID09IE5VTEwgKSB7CQkJLy8gY2hlY2sgdGhlIENGSSByYW5nZXMKKwkJCWlmICggcC0+dHlwICA9PSBDRkdfQ0ZJX0FDVF9SQU5HRVNfU1RBICkgeworCQkJCSBpID0gbW1kX2NoZWNrX2NvbXAoICh2b2lkKilwLCAmY2ZpX3N1cCApOworCQkJfQorCQkJcCsrOworCQl9CisJCU1NREFTU0VSVCggaSwgMCApCS8vQ0ZJOiBOSUMgU3VwcGxpZXIgbm90IGNvbXBhdGlibGUgd2l0aCBGL1cgaW1hZ2UgQWN0b3IKKwl9CisJaWYgKCBpID09IE5VTEwgKSB7CisJCXJjID0gREhGX0VSUl9JTkNPTVBfRlc7CisJfQorCXJldHVybiByYzsKK30gLy8gY2hlY2tfY29tcF9mdworCisKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBFeHBvcnRlZCBmdW5jdGlvbnMKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5NT0RVTEUgCQlpbnQgZGhmX2Rvd25sb2FkX2JpbmFyeSggdm9pZCAqaWZicCwgbWVtaW1hZ2UgKmZ3ICkKKyouUFVSUE9TRQkJRG93bmxvYWRzIGEgY29tcGxldGUgKHByaW1hcnksIHN0YXRpb24sIG9yIGFjY2VzcyBwb2ludCkgZmlybXdhcmUgaW1hZ2UgdG8gdGhlIE5JQy4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKiAgIGZ3ICAgICAgICAgCUYvVyBpbWFnZSB0byBiZSBkb3dubG9hZGVkCisqCisqLlJFVFVSTlMKKyogICBIQ0ZfU1VDQ0VTUyAgICAgICAgIAktIGRvd25sb2FkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisqICAgREhGX0VSUl9JTkNPTVBfRlcJCS0gZmlybXdhcmUgbm90IGNvbXBhdGlibGUKKyoKKyouREVTQ1JJUFRJT04KKyogICBJbml0aWFsaXplIGdsb2JhbCB2YXJpYWJsZXMKKyogICBDb25uZWN0IHRvIHRoZSBESEYKKyogICBDaGVjayB0aGUgY29tcGF0aWJpbGl0eSBvZiB0aGUgaW1hZ2UgKEZvciBwcmltYXJ5IGZpcm13YXJlIGltYWdlcyBpdCBpcyBjaGVja2VkIGZpcnN0CisqIAl3aGV0aGVyIGRvd25sb2FkIGlzIG5lY2Vzc2FyeSkuCisqICAgSWYgZXZlcnl0aGluZydzIGRvd25sb2FkIHRoZSBmaXJtd2FyZS4KKyogICBEaXNjb25uZWN0IGZyb20gdGhlIERIRi4KKyoKKyoKKyouRElBR1JBTQorKgorKi5OT1RJQ0U6CisJTU1EQVNTRVJUIGlzIHVuYWNjZXB0YWJsZSBiZWNhdXNlIHNvbWUgZHJpdmVycyBjYWxsIGRoZl9kb3dubG9hZF9iaW5hcnkgYmVmb3JlIGhjZl9jb25uZWN0CisKKyogVGhlIG9sZCBjb21tZW50IHdhczoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitkaGZfZG93bmxvYWRfYmluYXJ5KCBtZW1pbWFnZSAqZncgKQoreworaW50IAkJCXJjID0gSENGX1NVQ0NFU1M7CitDRkdfUFJPR19TVFJDVCAJKnA7CitpbnQJCQkJaTsKKworCS8vdmFsaWRhdGUgdGhlIGltYWdlCisJZm9yICggaSA9IDA7IGkgPCBzaXplb2Yoc2lnbmF0dXJlKSAmJiBmdy0+c2lnbmF0dXJlW2ldID09IHNpZ25hdHVyZVtpXTsgaSsrICkgLypOT1AqLzsKKwlpZiAoIGkgIT0gc2l6ZW9mKHNpZ25hdHVyZSkgCQl8fAorCQkgZnctPnNpZ25hdHVyZVtpXSAhPSAweDAxICAgCXx8CisJCSAvL3Rlc3QgZm9yIExpdHRsZS9CaWcgRW5kaWFuIEJpbmFyeSBmbGFnCisJCSBmdy0+c2lnbmF0dXJlW2krMV0gIT0gKCAvKkhDRl9CSUdfRU5ESUFOID8gJ0InIDogKi8gJ0wnICkgKSByYyA9IERIRl9FUlJfSU5DT01QX0ZXOworCWVsc2UgewkJCQkJLy9MaXR0bGUgRW5kaWFuIEJpbmFyeSBmb3JtYXQKKwkJZnctPmNvZGVwICAgID0gKENGR19QUk9HX1NUUkNUIEZBUiAqKSgoUFNFVURPX0NIQVJQKWZ3LT5jb2RlcCArIChoY2ZfMzIpZncgKTsKKwkJZnctPmlkZW50aXR5ID0gKENGR19JREVOVElUWV9TVFJDVCBGQVIgKikoKFBTRVVET19DSEFSUClmdy0+aWRlbnRpdHkgKyAoaGNmXzMyKWZ3ICk7CisJCWZ3LT5jb21wYXQgICA9IChDRkdfUkFOR0UyMF9TVFJDVCBGQVIgKikoKFBTRVVET19DSEFSUClmdy0+Y29tcGF0ICsgKGhjZl8zMilmdyApOworCQlmb3IgKCBpID0gMDsgZnctPnBbaV07IGkrKyApIGZ3LT5wW2ldID0gKChQU0VVRE9fQ0hBUlApZnctPnBbaV0gKyAoaGNmXzMyKWZ3ICk7CisJCXAgPSBmdy0+Y29kZXA7CisJCXdoaWxlICggcC0+bGVuICkgeworCQkJcC0+aG9zdF9hZGRyID0gKFBTRVVET19DSEFSUClwLT5ob3N0X2FkZHIgKyAoaGNmXzMyKWZ3OworCQkJcCsrOworCQl9CisJfQorCXJldHVybiByYzsKK30gICAvLyBkaGZfZG93bmxvYWRfYmluYXJ5CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouTU9EVUxFIAkJaW50IGRoZl9kb3dubG9hZF9mdyggdm9pZCAqaWZicCwgbWVtaW1hZ2UgKmZ3ICkKKyouUFVSUE9TRQkJRG93bmxvYWRzIGEgY29tcGxldGUgKHByaW1hcnkgb3IgdGVydGlhcnkpIGZpcm13YXJlIGltYWdlIHRvIHRoZSBOSUMuCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyogICBmdyAgICAgCQlGL1cgaW1hZ2UgdG8gYmUgZG93bmxvYWRlZAorKgorKi5SRVRVUk5TCisqCUhDRl9TVUNDRVNTICAgICAgICAJLSBkb3dubG9hZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorKglIQ0ZfRVJSX05PX05JQyAgICAgCS0gbm8gTklDIHByZXNlbnQKKyoJREhGX0VSUl9JTkNPTVBfRlcgCS0gZmlybXdhcmUgbm90IGNvbXBhdGlibGUKKyoKKyouREVTQ1JJUFRJT04KKyogLSBjaGVjayB0aGUgc2lnbmF0dXJlIG9mIHRoZSBpbWFnZQorKiAtIGdldCB0aGUgY29tcGF0aWJpbGl0eSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjb21wb25lbnRzIG9uIHRoZSBOSUMKKyoJICAtIFByaW1hcnkgRmlybXdhcmUgSWRlbnRpdHkKKyoJICAtCU1vZGVtIC0gRmlybXdhcmUgSS9GCisqCSAgLQlDb250cm9sbGVyIC0gRmlybXdhcmUgSS9GCisqISEgLSBpZiBuZWNlc3NhcnkgKCBpLmUuIEgtSSkgZ2V0IHRoZSBQREEgY29udGVudHMgZnJvbSB0aGUgTklDCisqIC0gY2hlY2sgdGhlIGNvbXBhdGliaWxpdHkgb2YgdGhlIE1GSSBhbmQgQ0ZJIG9mIHRoZSBOSUMgd2l0aCB0aGUgRi9XIGltYWdlCisqCU5vdGU6IHRoZSBQcmltYXJ5IEYvVyBjb21wYXRpYmlsaXR5IGlzIG9ubHkgcmVsZXZhbnQgZm9yIHRoZSAicnVubmluZyIgSENGIGFuZCBpcyBhbHJlYWR5IHZlcmlmaWVkIGluCisqCWhjZl9jb25uZWN0CisqISEgLQlpZiBuZWNlc3NhcnkgKCBpLmUuIEgtSSkKKyohIQkgIC0JdmVyaWZ5IHRoZSBzdW1jaGVjayBvZiB0aGUgUERBCisqISEJICAtCXBsdWcgdGhlIGltYWdlIChiYXNlZCBvbiB0aGUgUERBIGFuZCB0aGUgZGVmYXVsdCBwbHVnIHJlY29yZHMpCisqIC0gbG9vcCBvdmVyIGFsbCB0aGUgZG93bmxvYWQgTFRWcyBpbiB0aGUgaW1hZ2Ugd2hpY2ggY29uc2lzdHMgb2YgYSBzZXF1ZW5jZSBvZgorKgkgIC0gQ0ZHX1BST0dfVk9MQVRJTEUvQ0ZHX1BST0dfTk9OX1ZPTEFUSUxFCisqCSAgLSAxIG9yIG1vcmUgc2VxdWVuY2VzIG9mIENGR19QUk9HX0FERFIsIENGR19QUk9HX0RBVEEsLi4uLixDRkdfUFJPR19EQVRBCisqCSAgLQlDRkdfUFJPR19TVE9QCisqCisqLkRJQUdSQU0KKyoKKyouTk9USUNFCisqIFRoZSBvbGQgY29tbWVudCB3YXM6CisqCS8vIERvd25sb2FkIHByaW1hcnkgZmlybXdhcmUgaWYgbmVjZXNzYXJ5IGFuZCBhbGxvd2VkLiBUaGlzIGlzIGRvbmUgc2lsZW50bHkgKHdpdGhvdXQgdGVsbGluZworKgkvLyB0aGUgdXNlcikgYW5kIG9ubHkgaWYgdGhlIGZpcm13YXJlIGluIHRoZSBkb3dubG9hZCBpbWFnZSBpcyBuZXdlciB0aGFuIHRoZSBmaXJtd2FyZSBpbiB0aGUKKyoJLy8gY2FyZC4gIEluIE1ham9yIHZlcnNpb24gNCBvZiB0aGUgcHJpbWFyeSBmaXJtd2FyZSBmdW5jdGlvbnMgb2YgSGVybWVzIGFuZCBTaGFyayB3ZXJlCisqCS8vIGNvbWJpbmVkLiBQcmlvciB0byB0aGF0IHR3byBzZXBhcmF0ZSB2ZXJzaW9ucyBleGlzdGVkLiBXZSBvbmx5IGhhdmUgdG8gZG93bmxvYWQgcHJpbWFyeQorKgkvLyBmaXJtd2FyZSBpZiBtYWpvciB2ZXJzaW9uIG9mIHByaW1hcnkgZmlybXdhcmUgaW4gdGhlIE5JQyA8IDQuCisqCS8vCQlkb3dubG9hZCA9IHByaV9pZGVudGl0eS52ZXJzaW9uX21ham9yIDwgNDsKKyoJLy8JCWlmICggZG93bmxvYWQgKSB7CisqCS8vCQkJcmMgPSBjaGVja19jb21wX3ByaW1hcnkoIGZ3ICk7CisqCS8vCQl9CisqIEl0IGlzIG15IHVuZGVyc3RhbmRpbmcgdGhhdCBQcmkgVmFyaWFudCAxIG11c3QgYmUgdXBkYXRlZCBieSBQcmkgVmFyaWFudCAyLiBUaGUgdGVzdCBvbgorKiBtYWpvciB2ZXJzaW9uIDwgNCBzaG91bGQgYW1vdW50IHRvIHRoZSBzYW1lIHJlc3VsdCBidXQgYmUgInByaW5jaXBhbGx5IiBsZXNzIGNvcnJlY3QKKyogSW4gZGVsaWJlcmF0aW9uIHdpdGggdGhlIEFyY2hpdGVjdHVyZSB0ZWFtLCBpdCB3YXMgZGVjaWRlZCB0aGF0IHRoaXMgdXBncmFkZSBmb3Igb2xkIEgtSQorKiBOSUNzLCBpcyBhbiBhc3BlY3Qgd2hpY2ggYmVsb25ncyBvbiB0aGUgV1NVIGxldmVsIG5vdCBvbiB0aGUgREhGIGxldmVsCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorZGhmX2Rvd25sb2FkX2Z3KCB2b2lkICppZmJwLCBtZW1pbWFnZSAqZncgKQoreworaW50IAkJCQlyYyA9IEhDRl9TVUNDRVNTOworTFRWX0lORk9fU1RSVUNUX1BUUiBwcCA9IGx0dl9pbmZvOworQ0ZHX1BST0dfU1RSQ1QgCQkqcCA9IGZ3LT5jb2RlcDsKK0xUVlAgCQkJCWx0dnA7CitpbnQJCQkJCWk7CisKKwlNTURBU1NFUlQoIGZ3ICE9IE5VTEwsIDAgKQorCS8vdmFsaWRhdGUgdGhlIGltYWdlCisJZm9yICggaSA9IDA7IGkgPCBzaXplb2Yoc2lnbmF0dXJlKSAmJiBmdy0+c2lnbmF0dXJlW2ldID09IHNpZ25hdHVyZVtpXTsgaSsrICkgLypOT1AqLzsKKwlpZiAoIGkgIT0gc2l6ZW9mKHNpZ25hdHVyZSkgCQl8fAorCQkgZnctPnNpZ25hdHVyZVtpXSAhPSAweDAxCQl8fAorCQkgLy9jaGVjayBmb3IgYmluYXJ5IGltYWdlCisJCSAoIGZ3LT5zaWduYXR1cmVbaSsxXSAhPSAnQycgJiYgZnctPnNpZ25hdHVyZVtpKzFdICE9ICggLypIQ0ZfQklHX0VORElBTiA/ICdCJyA6ICovICdMJyApICkgKQorCQkgcmMgPSBESEZfRVJSX0lOQ09NUF9GVzsKKworLy8JUmV0cmlldmUgYWxsIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgZG93bmxvYWQgZnJvbSB0aGUgTklDCisJd2hpbGUgKCAoIHJjID09IEhDRl9TVUNDRVNTICkgJiYgKCAoIGx0dnAgPSBwcC0+bHR2cCkgIT0gTlVMTCApICkgeworCQlsdHZwLT5sZW4gPSBwcCsrLT5sZW47CS8vIFNldCBsZW4gdG8gb3JpZ2luYWwgbGVuLiBUaGlzIGxlbiBpcyBjaGFuZ2VkIHRvIHJlYWwgbGVuIGJ5IEdFVF9JTkZPKCkKKwkJcmMgPSBHRVRfSU5GTyggbHR2cCApOworCQlNTURBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApCisJCU1NREFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIGx0dnAtPnR5cCApCisJCU1NREFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIGx0dnAtPmxlbiApCisJfQorCWlmICggcmMgPT0gSENGX1NVQ0NFU1MgKSByYyA9IGNoZWNrX2NvbXBfZncoIGZ3ICk7CisJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJd2hpbGUgKCByYyA9PSBIQ0ZfU1VDQ0VTUyAmJiBwLT5sZW4gKSB7CisJCQlyYyA9IFBVVF9JTkZPKCBwICk7CisJCQlwKys7CisJCX0KKwl9CisJTU1EQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQorCXJldHVybiByYzsKK30gICAvLyBkaGZfZG93bmxvYWRfZncKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9kaGYuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RoZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNzFmMzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9kaGYuaApAQCAtMCwwICsxLDIyNiBAQAorCisvLyAgIHZpbTp0dz0xMTA6dHM9NDoKKyNpZm5kZWYgREhGX0gKKyNkZWZpbmUgREhGX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZJTEUgICA6CURIRi5ICisqCisqIERBVEUJOgkkRGF0ZTogMjAwNC8wNy8xOSAwODoxNjoxNCAkICAgJFJldmlzaW9uOiAxLjIgJAorKiBPcmlnaW5hbAk6CTIwMDQvMDUvMTcgMDc6MzM6MTMgICAgUmV2aXNpb246IDEuMjUgICAgICBUYWc6IGhjZjdfdDIwMDQwNjAyXzAxCisqIE9yaWdpbmFsCToJMjAwNC8wNS8xMSAwNjowMzoxNCAgICBSZXZpc2lvbjogMS4yNCAgICAgIFRhZzogaGNmN190N18yMDA0MDUxM18wMQorKiBPcmlnaW5hbAk6CTIwMDQvMDQvMTUgMDk6MjQ6NDIgICAgUmV2aXNpb246IDEuMjIgICAgICBUYWc6IGhjZjdfdDdfMjAwNDA0MTVfMDEKKyogT3JpZ2luYWwJOgkyMDA0LzA0LzA5IDE0OjM1OjUyICAgIFJldmlzaW9uOiAxLjIxICAgICAgVGFnOiB0N18yMDA0MDQxM18wMQorKiBPcmlnaW5hbAk6CTIwMDQvMDQvMDEgMTU6MzI6NTUgICAgUmV2aXNpb246IDEuMTggICAgICBUYWc6IHQ3XzIwMDQwNDAxXzAxCisqIE9yaWdpbmFsCToJMjAwNC8wMy8xMCAxNTozOToyOCAgICBSZXZpc2lvbjogMS4xNSAgICAgIFRhZzogdDIwMDQwMzEwXzAxCisqIE9yaWdpbmFsCToJMjAwNC8wMy8wNCAxMTowMzozOCAgICBSZXZpc2lvbjogMS4xMyAgICAgIFRhZzogdDIwMDQwMzA0XzAxCisqIE9yaWdpbmFsCToJMjAwNC8wMi8yNSAxNDoxNDozNyAgICBSZXZpc2lvbjogMS4xMSAgICAgIFRhZzogdDIwMDQwMzAyXzAzCisqIE9yaWdpbmFsCToJMjAwNC8wMi8yNCAxMzowMDoyOCAgICBSZXZpc2lvbjogMS4xMCAgICAgIFRhZzogdDIwMDQwMjI0XzAxCisqIE9yaWdpbmFsCToJMjAwNC8wMi8xOSAxMDo1NzoyOCAgICBSZXZpc2lvbjogMS44ICAgICAgVGFnOiB0MjAwNDAyMTlfMDEKKyoKKyogQVVUSE9SIDoJSm9obiBNZWVydGVucworKgkJCU5pY28gVmFsc3RlcgorKgorKiBTUEVDSUZJQ0FUSU9OOiAuLi4uLi4uLi4KKyoKKyogREVTQyAgIDoJc3RydWN0dXJlIGRlZmluaXRpb25zIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciB1bml0IERIRi4KKyoKKyoJCQlDdXN0b21pemFibGUgdmlhIEhDRkNGRy5ILCB3aGljaCBpcyBpbmNsdWRlZCBpbmRpcmVjdGx5IHZpYSBIQ0YuSAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqIFNPRlRXQVJFIExJQ0VOU0UKKyoKKyogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisqCisqIENPUFlSSUdIVCCpIDE5OTQgLSAxOTk1CWJ5IEFUJlQuCQkJCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKyogQ09QWVJJR0hUIKkgMTk5OSAtIDIwMDAgYnkgTHVjZW50IFRlY2hub2xvZ2llcy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBDT1BZUklHSFQgqSAyMDAxIC0gMjAwNAlieSBBZ2VyZSBTeXN0ZW1zIEluYy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisqCisqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorKiAgICBkaXN0cmlidXRpb24uCisqCisqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKgorKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIERpc2NsYWltZXIKKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorKiBEQU1BR0UuCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZkZWYgX1dJTjMyX1dDRQorI2luY2x1ZGUgPHdpbmRlZi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJoY2YuaCIgICAJCSAJLy8gaW5jbHVkZXMgSENGQ0ZHLkggdG9vCisKKyNpZmRlZiBESEZfVUlMCisjZGVmaW5lIEdFVF9JTkZPKCBwcCApICB1aWxfZ2V0X2luZm8oIChMVFZQKXBwICkKKyNkZWZpbmUgUFVUX0lORk8oIHBwICkgIHVpbF9wdXRfaW5mbyggKExUVlApcHAgKQorI2Vsc2UKKyNkZWZpbmUgR0VUX0lORk8oIHBwICkgIGhjZl9nZXRfaW5mbyggaWZicCwgKExUVlApcHAgKQorI2RlZmluZSBQVVRfSU5GTyggcHAgKSAgaGNmX3B1dF9pbmZvKCBpZmJwLCAoTFRWUClwcCApCisjZW5kaWYKKworCisvKi0tLS0gRGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIENPREVNQVNLCQkJCTB4MDAwMEZGRkZMICAgIAkvLyBDb2RlbWFzayBmb3IgcGx1ZyByZWNvcmRzCisKKy8qLS0tLSBFcnJvciBudW1iZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBESEZfRVJSX0lOQ09NUF9GVwkJMHg0MAkvL0ltYWdlIG5vdCBjb21wYXRpYmxlIHdpdGggTklDCisKKy8qLS0tLSBUeXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vKiBuZWVkZWQgYnkgZGhmX3dyYXAuYworLy8KK3R5cGVkZWYgc3RydWN0IHsKKwlMVFZQIAlsdHZwOworCWhjZl8xNglsZW47Cit9IExUVl9JTkZPX1NUUlVDVCAsICpMVFZfSU5GT19TVFJVQ1RfUFRSOworCisKKy8qCisgKiBUeXBlOiAJcGx1Z3JlY29yZAorICoKKyAqIEFic3RyYWN0OiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgUGx1ZyBEYXRhIFJlY29yZC4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gb3ZlcmxheSB0aGUgcGx1ZyByZWNvcmRzIGluIHRoZSBmaXJtd2FyZSBtZW1vcnkgaW1hZ2UuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWhjZl8zMgljb2RlOyAgICAgIAkvLyBDb2RlIHRvIHBsdWcKKwloY2ZfMzIJYWRkcjsgICAgICAJLy8gQWRkcmVzcyB3aXRoaW4gdGhlIG1lbW9yeSBpbWFnZSB0byBwbHVnIGl0IGluCisJaGNmXzMyCWxlbjsgICAgICAgCS8vIFRoZSAjIG9mIGJ5dGVzIHdoaWNoIGFyZSBhdmFpbGFibGUgdG8gc3RvcmUgaXQKK30gcGx1Z3JlY29yZDsKKworLyoKKyAqIFR5cGU6IAlzdHJpbmdyZWNvcmQKKyAqCisgKiBBYnN0cmFjdDogVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBhIEZpcm13YXJlIGRlYnVnL2Fzc2VydCBzdHJpbmcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZ2V0IGFzc2VydCBhbmQgZGVidWcgb3V0cHV0cyBpbiB0aGUgZHJpdmVyIGFuZC9vciB1dGlsaXR5IHRvIGJlCisgKiBhYmxlIHRvIGdldCBtb3JlIHZpc2FiaWxpdHkgb2YgdGhlIEZXLgorICovCisKKyNkZWZpbmUgTUFYX0RFQlVHU1RSSU5HUyAJCTEwMjQKKyNkZWZpbmUgTUFYX0RFQlVHU1RSSU5HX0xFTiAJICA4MgorCit0eXBlZGVmIHN0cnVjdCB7CisJaGNmXzMyCWlkOworCWNoYXIgCXN0cltNQVhfREVCVUdTVFJJTkdfTEVOXTsKK30gc3RyaW5ncmVjb3JkOworCisvKgorICogVHlwZTogCWV4cG9ydHJlY29yZAorICoKKyAqIEFic3RyYWN0OiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgRmlybXdhcmUgZXhwb3J0IG9mIGEgdmFyaWFibGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZ2V0IHRoZSBhZGRyZXNzIGFuZCBuYW1lIG9mIGEgRlcgdmFyaWFibGUuCisgKi8KKworI2RlZmluZSBNQVhfREVCVUdFWFBPUlRTIAkJMjA0OAorI2RlZmluZSBNQVhfREVCVUdFWFBPUlRfTEVOIAkgIDEyCisKK3R5cGVkZWYgc3RydWN0IHsKKwloY2ZfMzIJaWQ7CisJY2hhciAJc3RyW01BWF9ERUJVR0VYUE9SVF9MRU5dOworfSBleHBvcnRyZWNvcmQ7CisKKy8vIE9mZnNldHMgaW4gbWVtaW1hZ2UgYXJyYXkgcFtdCisjZGVmaW5lIEZXU1RSSU5HU19GVU5DVElPTgkJMAorI2RlZmluZSBGV0VYUE9SVFNfRlVOQ1RJT04JCTEKKworLyoKKyAqIFR5cGU6IG1lbWltYWdlCisgKgorICogQWJzdHJhY3Q6IFRoZSAicm9vdCIgZGVzY3JpcHRpb24gb2YgYSBjb21wbGV0ZSBtZW1vcnkgaW1hZ2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgdHlwZSByZXByZXNlbnRzIGFuIGVudGlyZSBtZW1vcnkgaW1hZ2UuIFRoZSBpbWFnZSBpcyBidWlsdCB1cCBvZiBzZXZlcmFsCisgKiBzZWdtZW50cy4gVGhlc2Ugc2VnbWVudHMgbmVlZCBub3QgYmUgY29udGlndW91cyBhcmVhcyBpbiBtZW1vcnksIGluIG90aGVyIHdvcmRzCisgKiB0aGUgaW1hZ2UgbWF5IGNvbnRhaW4gJ2hvbGVzJy4KKyAqCisgKiBUaGUgJ2NvZGVwJyBmaWVsZCBwb2ludHMgdG8gYW4gYXJyYXkgb2Ygc2VnbWVudF9kZXNjcmlwdG9yIHN0cnVjdHVyZXMuCisgKiBUaGUgZW5kIG9mIHRoZSBhcnJheSBpcyBpbmRpY2F0ZWQgYnkgYSBzZWdtZW50X2Rlc2NyaXB0b3Igb2Ygd2hpY2ggYWxsIGZpZWxkcyBhcmUgemVyby4KKyAqIFRoZSAnZXhlY3V0aW9uJyBmaWVsZCBpcyBhIDMyLWJpdCBhZGRyZXNzIHJlcHJlc2VudGluZyB0aGUgZXhlY3V0aW9uIGFkZHJlc3MKKyAqCW9mIHRoZSBmaXJtd2FyZSB3aXRoaW4gdGhlIG1lbW9yeSBpbWFnZS4gVGhpcyBhZGRyZXNzIGlzIHplcm8gaW4gY2FzZSBvZiBub24tdm9sYXRpbGUKKyAqCW1lbW9yeSBkb3dubG9hZC4KKyAqIFRoZSAnY29tcGF0JyBmaWVsZCBwb2ludHMgdG8gYW4gYXJyYXkgb2YgVE9ETworICogCVRoZSBlbmQgb2YgdGhlIGFycmF5IGlzIGluZGljYXRlZCBieSBhIHBsdWcgcmVjb3JkIG9mIHdoaWNoIGFsbCBmaWVsZHMgYXJlIHplcm8uCisgKiBUaGUgJ2lkZW50aXR5JyBmaWVsZCBwb2ludHMgdG8gYW4gYXJyYXkgb2YgVE9ETworICogCVRoZSBlbmQgb2YgdGhlIGFycmF5IGlzIGluZGljYXRlZCBieSBhIHBsdWcgcmVjb3JkIG9mIHdoaWNoIGFsbCBmaWVsZHMgYXJlIHplcm8uCisgKiBUaGUgSGVybWVzLUkgc3BlY2lmaWMgJ3BkYXBsdWcnIGZpZWxkIHBvaW50cyB0byBhbiBhcnJheSBvZiBQcm9kdWN0aW9uIERhdGEgUGx1ZyByZWNvcmQgc3RydWN0dXJlcy4KKyAqIAlUaGUgZW5kIG9mIHRoZSBhcnJheSBpcyBpbmRpY2F0ZWQgYnkgYSBwbHVnIHJlY29yZCBvZiB3aGljaCBhbGwgZmllbGRzIGFyZSB6ZXJvLgorICogVGhlIEhlcm1lcy1JIHNwZWNpZmljICdwcmlwbHVnJyBmaWVsZCBwb2ludHMgdG8gYW4gYXJyYXkgb2YgUHJpbWFyeSBJbmZvcm1hdGlvbiBQbHVnIHJlY29yZCBzdHJ1Y3R1cmVzLgorICogCVRoZSBlbmQgb2YgdGhlIGFycmF5IGlzIGluZGljYXRlZCBieSBhIHBsdWcgcmVjb3JkIG9mIHdoaWNoIGFsbCBmaWVsZHMgYXJlIHplcm8uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyCQkJCQlzaWduYXR1cmVbMTQrMSsxXTsJLy8gc2lnbmF0dXJlIChzZWUgREhGLkMpICsgQy9MRS1CaW4vQkUtQmluLWZsYWcgKyBmb3JtYXQgdmVyc2lvbgorCUNGR19QUk9HX1NUUkNUIEZBUgkJKmNvZGVwOwkJCQkvLworCWhjZl8zMiAgICAgICAgICAgCSAJZXhlY3V0aW9uOyAgICAJCS8vIEV4ZWN1dGlvbiBhZGRyZXNzIG9mIHRoZSBmaXJtd2FyZQorCXZvaWQgRkFSIAkJICAgICAgCSpwbGFjZV9ob2xkZXJfMTsKKwl2b2lkIEZBUiAgCQkgICAgIAkqcGxhY2VfaG9sZGVyXzI7CisJQ0ZHX1JBTkdFMjBfU1RSQ1QgRkFSICAJKmNvbXBhdDsgICAgICAJCS8vIFBvaW50ZXIgdG8gdGhlIGNvbXBhdGliaWxpdHkgaW5mbyByZWNvcmRzCisJQ0ZHX0lERU5USVRZX1NUUkNUIEZBUiAJKmlkZW50aXR5OyAgICAJCS8vIFBvaW50ZXIgdG8gdGhlIGlkZW50aXR5IGluZm8gcmVjb3JkcworCXZvaWQgRkFSCQkJCSpwWzJdOwkJCQkvKiAoVXAgdG8gOSkgcG9pbnRlcnMgZm9yIChmdXR1cmUpIGV4cGFuc2lvbgorCQkJCQkJCQkJCQkJICogY3VycmVudGx5IGluIHVzZToKKwkJCQkJCQkJCQkJCSAqICAtIEYvVyBwcmludGYgaW5mb3JtYXRpb24KKwkJCQkJCQkJCQkJCSAqLworfSBtZW1pbWFnZTsKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBESEYgZnVuY3Rpb24gcHJvdG90eXBlcworICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworRVhURVJOX0MgaW50IGRoZl9kb3dubG9hZF9mdyggdm9pZCAqaWZicCwgbWVtaW1hZ2UgKmZ3ICk7CS8vCWlmYnAsIGlnbm9yZWQgd2hlbiB1c2luZyB0aGUgVUlMCitFWFRFUk5fQyBpbnQgZGhmX2Rvd25sb2FkX2JpbmFyeSggbWVtaW1hZ2UgKmZ3ICk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9ucyB0byBiZSBwcm92aWRlZCBieSB0aGUgdXNlciBvZiB0aGUgREhGIG1vZHVsZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8vIGRlZmluZWQgaW4gREhGLkM7IHNlZSB0aGVyZSBmb3IgY29tbWVudHMKK0VYVEVSTl9DIGhjZl8xNiAqZmluZF9yZWNvcmRfaW5fcGRhKCBoY2ZfMTYgKnBkYXAsIGhjZl8xNiBjb2RlICk7CisKKyNlbmRpZiAgLy8gREhGX0gKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvZGhmY2ZnLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9kaGZjZmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGMyNmM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvZGhmY2ZnLmgKQEAgLTAsMCArMSwxNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBUaGlzIGZpbGUgY29udGFpbnMgREhGIGNvbmZpZ3VyYXRpb24gaW5mby4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIERIRkNGR19ICisjZGVmaW5lIERIRkNGR19ICisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGaWxlIERIRkNGRy5ICisgKgorICogQ29udGVudHM6ICNkZWZpbmVzIGZvciB0aGUgREhGIG1vZHVsZQorICoKKyAqIENvbW1lbnRzOgorICogICBTb21lIGNvbWJpbmF0aW9ucyBvZiB0aGUgI2RlZmluZXMgaW4gdGhpcyBmaWxlIGFyZSBpbGxlZ2FsIChhcyBub3RlZCBiZWxvdykuCisgKiAgIElmIGFuIGlsbGVnYWwgY29tYmluYXRpb25zIG9mICNkZWZpbmVzIGlzIHNwZWNpZmllZCBhIGNvbXBpbGUgZXJyb3IgaXMKKyAqICAgZ2VuZXJhdGVkLiBTZWUgZG9jdW1lbnQgREhGVUcuRE9DIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIEF1dGhvcjogSm9obiBNZWVydGVucworICogRGF0ZTogICAxMS0wMS0yMDAwCisgKgorICogQ2hhbmdlIGhpc3Rvcnk6CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLy8gRGVmaW5lIERIRl9XQ0kgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBXQ0kgdG8gYWNjZXNzIHRoZSBPUmlOT0NPIGNhcmQuCisvLyBEZWZpbmUgREhGX1VJTCBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIFVJTCB0byBhY2Nlc3MgdGhlIE9SaU5PQ08gY2FyZC4KKy8vIFlvdSBtdXN0IGRlZmluZSBlaXRoZXIgREhGX1dDSSBvciBESEZfVUlMLiBJZiBuZWl0aGVyIG9mIHRoZSB0d28gaXMgZGVmaW5lZAorLy8gb3IgYm90aCBhIGNvbXBpbGUgZXJyb3IgaXMgZ2VuZXJhdGVkLgorI2RlZmluZSBESEZfV0NJCisvLyEhISNkZWZpbmUgREhGX1VJTAorCisvLyBEZWZpbmUgREhGX0JJR19FTkRJQU4gaWYgeW91IGFyZSB3b3JraW5nIG9uIGEgYmlnIGVuZGlhbiBwbGF0Zm9ybS4KKy8vIERlZmluZSBESEZfTElUVExFX0VORElBTiBpZiB5b3UgYXJlIHdvcmtpbmcgb24gYSBsaXR0bGUgZW5kaWFuIHBsYXRmb3JtLgorLy8gWW91IG11c3QgZGVmaW5lIGVpdGhlciBESEZfQklHX0VORElBTiBvciBESEZfTElUVExFX0VORElBTi4gSWYgbmVpdGhlciBvZgorLy8gdGhlIHR3byBpcyBkZWZpbmVkIG9yIGJvdGggYSBjb21waWxlIGVycm9yIGlzIGdlbmVyYXRlZC4KKyNpZmRlZiBVU0VfQklHX0VORElBTgorI2RlZmluZSBESEZfQklHX0VORElBTgorI2Vsc2UKKyNkZWZpbmUgREhGX0xJVFRMRV9FTkRJQU4KKyNlbmRpZiAgLyogVVNFX0JJR19FTkRJQU4gKi8KKworLy8gRGVmaW5lIERIRl9XSU4gaWYgeW91IGFyZSB3b3JraW5nIG9uIFdpbmRvd3MgcGxhdGZvcm0uCisvLyBEZWZpbmUgREhGX0RPUyBpZiB5b3UgYXJlIHdvcmtpbmcgb24gRE9TLgorLy8gWW91IG11c3QgZGVmaW5lIGVpdGhlciBESEZfV0lOIG9yIERIRl9ET1MuIElmIG5laXRoZXIgb2YKKy8vIHRoZSB0d28gaXMgZGVmaW5lZCBvciBib3RoIGEgY29tcGlsZSBlcnJvciBpcyBnZW5lcmF0ZWQuCisvLyEhISNkZWZpbmUgREhGX1dJTgorLy8hISEjZGVmaW5lIERIRl9ET1MKKworLy8gRGVmaW5lIGlmIHlvdSB3YW50IHRoZSBESEYgdG8gdXNlcnMuIE5vdCBkZWZpbmluZyBESEZfR0VUX1JFU19NU0cKKy8vIGxlYWRzIHRvIGEgZGVjcmVhc2UgaW4gY29kZSBzaXplIGFzIG1lc3NhZ2Ugc3RyaW5ncyBhcmUgbm90IGluY2x1ZGVkLgorLy8hISEjZGVmaW5lIERIRl9HRVRfUkVTX01TRworCisvLyBMaW51eCBkcml2ZXIgc3BlY2lmaWMKKy8vIFByZXZlbnQgaW5jbHVzaW9uIG9mIHN0ZGxpYi5oIGFuZCBzdHJpbmcuaAorI2RlZmluZSBfSU5DX1NURExJQgorI2RlZmluZSBfSU5DX1NUUklORworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZpbmUgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBEU0YgI2RlZmluZXMgaWYgeW91IHdhbnQgdG8gaW1wbGVtZW50CisvLyB0aGUgcmVsYXRlZCBEU0YtZnVuY3Rpb24uIEZ1bmN0aW9uIGRzZl9jYWxsYmFjayBtdXN0IGFsbHdheXMgYmUgaW1wbGVtZW50ZWQuCisvLyBTZWUgZmlsZSBESEYuSCBmb3IgcHJvdG90eXBlcyBvZiB0aGUgZnVuY3Rpb25zLgorCisvLyBEZWZpbmUgRFNGX0FMTE9DIGlmIHlvdSB3YW50IHRvIG1hbmFnZSBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZGUtYWxsb2NhdGlvbgorLy8gZm9yIHRoZSBESEYuIElmIERTRl9BTExPQyBpcyBkZWZpbmVkIHlvdSBtdXN0IGltcGxlbWVudCBkc2ZfYWxsb2MgYW5kIGRzZl9mcmVlLgorLy8hISEjZGVmaW5lIERTRl9BTExPQworCisvLyBEZWZpbmUgRFNGX0NPTkZJUk0gaWYgeW91IHdhbnQgdGhlIERIRiB0byBhc2sgdGhlIHVzZXIgZm9yIGNvbmZpcm1hdGlvbiBpbiBhCisvLyBudW1iZXIgb2Ygc2l0dWF0aW9ucy4gSWYgRFNGX0NPTkZJUk0gaXMgZGVmaW5lZCB5b3UgbXVzdCBpbXBsZW1lbnQgZHNmX2NvbmZpcm0uCisvLyBOb3QgZGVmaW5pbmcgRFNGX0NPTkZJUk0gbGVhZHMgdG8gYSBkZWNyZWFzZSBpbiBjb2RlIHNpemUgYXMgY29uZmlybWF0aW9uCisvLyBzdHJpbmdzIGFyZSBub3QgaW5jbHVkZWQuCisvLyEhISNkZWZpbmUgRFNGX0NPTkZJUk0KKworLy8gRGVmaW5lIERTRl9ERUJVR19NRVNTQUdFIGlmIHlvdSB3YW50IGRlYnVnIG1lc3NhZ2VzIGFkZGVkIHRvIHlvdXIgb3V0cHV0LgorLy8gSWYgeW91IGRlZmluZSBEU0ZfREVCVUdfTUVTU0FHRSB0aGVuIHlvdSBtdXN0IGltcGxlbWVudCBmdW5jdGlvbgorLy8gZHNmX2RlYnVnX21lc3NhZ2UuCisvLyNkZWZpbmUgRFNGX0RFQlVHX01FU1NBR0UKKworLy8gRGVmaW5lIERTRl9BU1NFUlQgaWYgeW91IHdhbnQgYXNzZXJ0cyB0byBiZSBhY3RpdmF0ZWQuCisvLyBJZiB5b3UgZGVmaW5lIERTRl9BU1NFUlQgdGhlbiB5b3UgbXVzdCBpbXBsZW1lbnQgZnVuY3Rpb24gZHNmX2Fzc2VydC4KKy8vI2RlZmluZSBEQkcgMQorLy8jZGVmaW5lIERTRl9BU1NFUlQKKworLy8gRGVmaW5lIERTRl9EQldJTiBpZiB5b3Ugd2FudCBhc3NlcnRzIGFuZCBkZWJ1ZyBtZXNzYWdlcyB0byBiZSBzZW5kIHRvIGEgZGVidWcKKy8vIHdpbmRvdyBsaWtlIFNPRlRJQ0Ugb3IgRGVidWdWaWV3IGZyb20gU3lzSW50ZXJuYWxzLgorLy8hISEjZGVmaW5lIERTRl9EQldJTgorLy8hISEgTm90IGltcGxlbWVudGVkIHlldCEKKworLy8gRGVmaW5lIERTRl9WT0xBVElMRV9PTkxZIGlmIHlvdSBvbmx5IHdhbnRzIHRvIHVzZSB2YWxhdGlsZSBmdW5jdGlvbnMKKy8vIFRoaXMgaXMgYSB0eXBpY2FsIHNldHRpbmcgZm9yIGEgQVAgYW5kIGEgZHJpdmVyLgorI2RlZmluZSBEU0ZfVk9MQVRJTEVfT05MWQorCisvLyBEZWZpbmUgRFNGX0hFUk1FU0lJIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgREhGIGZvciB0aGUgSGVybWVzLUlJCisjaWZkZWYgSEVSTUVTMgorI2RlZmluZSBEU0ZfSEVSTUVTSUkKKyNlbHNlCisjdW5kZWYgRFNGX0hFUk1FU0lJCisjZW5kaWYgLy8gSEVSTUVTMgorCisvLyBEZWZpbmUgRFNGX0JJTkFSWV9GSUxFIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgREhGIGluIGNvbWJpbmF0aW9uIHdpdGgKKy8vIHJlYWRpbmcgdGhlIEZpcm13YXJlIGZyb20gYSBzZXBhcmF0ZSBiaW5hcnkgZmlsZS4KKy8vISEhI2RlZmluZSBEU0ZfQklOQVJZX0ZJTEUKKworI2VuZGlmIC8vIERIRkNGR19ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2YuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMzlmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2YuYwpAQCAtMCwwICsxLDQ4ODEgQEAKKy8vICAgdmltOnR3PTExMDp0cz00OgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGSUxFICAgOglIQ0YuQworKgorKiBEQVRFICAgIDoJJERhdGU6IDIwMDQvMDgvMDUgMTE6NDc6MTAgJCAgICRSZXZpc2lvbjogMS4xMCAkCisqIE9yaWdpbmFsOgkyMDA0LzA2LzAyIDEwOjIyOjIyICAgIFJldmlzaW9uOiAxLjg1ICAgICAgVGFnOiBoY2Y3X3QyMDA0MDYwMl8wMQorKiBPcmlnaW5hbDoJMjAwNC8wNC8xNSAwOToyNDo0MSAgICBSZXZpc2lvbjogMS42MyAgICAgIFRhZzogaGNmN190N18yMDA0MDQxNV8wMQorKiBPcmlnaW5hbDoJMjAwNC8wNC8xMyAxNDoyMjo0NCAgICBSZXZpc2lvbjogMS42MiAgICAgIFRhZzogdDdfMjAwNDA0MTNfMDEKKyogT3JpZ2luYWw6CTIwMDQvMDQvMDEgMTU6MzI6NTUgICAgUmV2aXNpb246IDEuNTkgICAgICBUYWc6IHQ3XzIwMDQwNDAxXzAxCisqIE9yaWdpbmFsOgkyMDA0LzAzLzEwIDE1OjM5OjI3ICAgIFJldmlzaW9uOiAxLjU1ICAgICAgVGFnOiB0MjAwNDAzMTBfMDEKKyogT3JpZ2luYWw6CTIwMDQvMDMvMDQgMTE6MDM6MzcgICAgUmV2aXNpb246IDEuNTMgICAgICBUYWc6IHQyMDA0MDMwNF8wMQorKiBPcmlnaW5hbDoJMjAwNC8wMy8wMiAxNDo1MToyMSAgICBSZXZpc2lvbjogMS41MCAgICAgIFRhZzogdDIwMDQwMzAyXzAzCisqIE9yaWdpbmFsOgkyMDA0LzAyLzI0IDEzOjAwOjI3ICAgIFJldmlzaW9uOiAxLjQzICAgICAgVGFnOiB0MjAwNDAyMjRfMDEKKyogT3JpZ2luYWw6CTIwMDQvMDIvMTkgMTA6NTc6MjUgICAgUmV2aXNpb246IDEuMzkgICAgICBUYWc6IHQyMDA0MDIxOV8wMQorKgorKiBBVVRIT1IgOglOaWNvIFZhbHN0ZXIKKyoKKyogU1BFQ0lGSUNBVElPTjogLi4uLi4uLi4KKyoKKyogREVTQ1JJUFRJT04gOglIQ0YgUm91dGluZXMgZm9yIEhlcm1lcy1JSSAoY2FsbGFibGUgdmlhIHRoZSBXaXJlbGVzcyBDb25uZWN0aW9uIEkvRiBvciBXQ0kpCisqCQkJCUxvY2FsIFN1cHBvcnQgUm91dGluZXMgZm9yIGFib3ZlIHByb2NlZHVyZXMKKyoKKyoJCQlDdXN0b21pemFibGUgdmlhIEhDRkNGRy5ILCB3aGljaCBpcyBpbmNsdWRlZCBieSBIQ0YuSAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgorKiBTT0ZUV0FSRSBMSUNFTlNFCisqCisqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorKgorKiBDT1BZUklHSFQgqSAxOTk0IC0gMTk5NQlieSBBVCZULgkJCQlBbGwgUmlnaHRzIFJlc2VydmVkCisqIENPUFlSSUdIVCCpIDE5OTYgLSAyMDAwIGJ5IEx1Y2VudCBUZWNobm9sb2dpZXMuCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKyogQ09QWVJJR0hUIKkgMjAwMSAtIDIwMDQJYnkgQWdlcmUgU3lzdGVtcyBJbmMuCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorKgorKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyogICAgZGlzdHJpYnV0aW9uLgorKgorKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyoKKyogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKiBEaXNjbGFpbWVyCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyogREFNQUdFLgorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBJbXBsZW1lbnRhdGlvbiBOb3RlcworKioKKyogLQlhIGxlYWRpbmcgbWFya2VyIG9mIC8vISBpcyB1c2VkLiBUaGUgcHVycG9zZSBvZiBzdWNoIGEgc2VxdWVuY2UgaXMgdG8gaGVscCB0byB1bmRlcnN0YW5kIHRoZSBmbG93CisqCUFuIGV4YW1wbGUgaXM6CS8vIXJjID0gSENGX1NVQ0NFU1M7CisqCWlmIHRoaXMgaXMgc3VwZXJmbHVvdXMgYmVjYXVzZSByYyBpcyBhbHJlYWR5IGd1YXJhbnRlZWQgdG8gYmUgMCBidXQgaXQgc2hvd3MgdG8gdGhlIChtYWludGVuYW5jZSkKKyoJcHJvZ3JhbW1lciBpdCBpcyBhbiBpbnRlbnRpb25hbCBvbWlzc2lvbiBhdCB0aGUgcGxhY2Ugd2hlcmUgc29tZW9uZSBjb3VsZCBjb25zaWRlciBpdCBtb3N0IGFwcHJvcHJpYXRlIGF0CisqCWZpcnN0IGdsYW5jZQorKiAtCXVzaW5nIG5lYXIgcG9pbnRlcnMgaW4gYSBtb2RlbCB3aGVyZSBzcyE9ZHMgaXMgYW4gaW52aXRhdGlvbiBmb3IgZGlzYXN0ZXIsIHNvIGJlIGF3YXJlIG9mIGhvdyB5b3Ugc3BlY2lmeQorKgl5b3VyIG1vZGVsIGFuZCBob3cgeW91IGRlZmluZSB2YXJpYWJsZXMgd2hpY2ggYXJlIHVzZWQgYXQgaW50ZXJydXB0IHRpbWUKKyogLQlyZW1lbWJlciB0aGF0IHNpZ24gZXh0ZW5zaW9uIG9uIDMyIGJpdCBwbGF0Zm9ybXMgbWF5IGNhdXNlIHByb2JsZW1zIHVubGVzcyBjb2RlIGlzIGNhcmVmdWxseSBjb25zdHJ1Y3RlZCwKKyoJZS5nLiB1c2UgIihoY2ZfMTYpfmZvbyIgcmF0aGVyIHRoYW4gIn5mb28iCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJoY2YuaCIJCQkJLy8gSENGIGFuZCBNU0YgY29tbW9uIGluY2x1ZGUgZmlsZQorI2luY2x1ZGUgImhjZmRlZi5oIgkJCQkvLyBIQ0Ygc3BlY2lmaWMgaW5jbHVkZSBmaWxlCisjaW5jbHVkZSAibW1kLmgiCQkJCS8vIE1vcmVNb2R1bGFyRHJpdmVyIGNvbW1vbiBpbmNsdWRlIGZpbGUKKworI2lmICEgZGVmaW5lZCBvZmZzZXRvZgorI2RlZmluZSBvZmZzZXRvZihzLG0pICAgKCh1bnNpZ25lZCBpbnQpJigoKHMgKikwKS0+bSkpCisjZW5kaWYgLy8gb2Zmc2V0b2YKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBQUk9UT1RZUEVTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQ0ZfU1RBVElDIGludAkJCWNtZF9leGUoIElGQlAgaWZicCwgaGNmXzE2IGNtZF9jb2RlLCBoY2ZfMTYgcGFyXzAgKTsKK0hDRl9TVEFUSUMgaW50CQkJaW5pdCggSUZCUCBpZmJwICk7CitIQ0ZfU1RBVElDIGludAkJCXB1dF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApOworI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKK0hDRl9TVEFUSUMgaW50CQkJcHV0X2luZm9fbWIoIElGQlAgaWZicCwgQ0ZHX01CX0lORk9fU1RSQ1QgRkFSICogbHR2cCApOworI2VuZGlmIC8vIEhDRl9FWFRfTUIKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCitIQ0ZfU1RBVElDIHZvaWQJCQljYWxjX21pYyggaGNmXzMyKiBwLCBoY2ZfMzIgTSApOwordm9pZCAJCQkJCWNhbGNfbWljX3J4X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgcCwgaW50IGxlbiApOwordm9pZCAJCQkJCWNhbGNfbWljX3R4X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgcCwgaW50IGxlbiApOworSENGX1NUQVRJQyBpbnQJCQljaGVja19taWMoIElGQlAgaWZicCApOworI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQorCitIQ0ZfU1RBVElDIHZvaWQJCQljYWxpYnJhdGUoIElGQlAgaWZicCApOworSENGX1NUQVRJQyBpbnQJCQljbWRfY21wbCggSUZCUCBpZmJwICk7CitIQ0ZfU1RBVElDIGhjZl8xNgkJZ2V0X2ZpZCggSUZCUCBpZmJwICk7CitIQ0ZfU1RBVElDIHZvaWQJCQlpc3JfaW5mbyggSUZCUCBpZmJwICk7CisjaWYgSENGX0RNQQorSENGX1NUQVRJQyBERVNDX1NUUkNUKglnZXRfZnJhbWVfbHN0KElGQlAgaWZicCwgaW50IHR4X3J4X2ZsYWcpOworI2VuZGlmIC8vIEhDRl9ETUEKK0hDRl9TVEFUSUMgdm9pZAkJCWdldF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIGludCBsZW4gQkVfUEFSKCBpbnQgd29yZF9sZW4gKSApOwkvL2NoYXIqLCBieXRlIGNvdW50ICh1c3VhbGx5IGV2ZW4pCisjaWYgSENGX0RNQQorSENGX1NUQVRJQyB2b2lkCQkJcHV0X2ZyYW1lX2xzdCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgaW50IHR4X3J4X2ZsYWcgKTsKKyNlbmRpZiAvLyBIQ0ZfRE1BCitIQ0ZfU1RBVElDIHZvaWQJCQlwdXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKTsKK0hDRl9TVEFUSUMgdm9pZAkJCXB1dF9mcmFnX2ZpbmFsaXplKCBJRkJQIGlmYnAgKTsKK0hDRl9TVEFUSUMgaW50CQkJc2V0dXBfYmFwKCBJRkJQIGlmYnAsIGhjZl8xNiBmaWQsIGludCBvZmZzZXQsIGludCB0eXBlICk7CisjaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9QUklOVEYKK3N0YXRpYyBpbnQgZndfcHJpbnRmKElGQlAgaWZicCwgQ0ZHX0ZXX1BSSU5URl9TVFJDVCBGQVIgKmx0dnApOworI2VuZGlmIC8vIEhDRl9BU1NFUlRfUFJJTlRGCisKK0hDRl9TVEFUSUMgaW50CQkJZG93bmxvYWQoIElGQlAgaWZicCwgQ0ZHX1BST0dfU1RSQ1QgRkFSICpsdHZwICk7CisjaWYgKEhDRl9FTkNBUCkgJiBIQ0ZfRU5DCitIQ0ZfU1RBVElDIGhjZl84CQloY2ZfZW5jYXAoIHdjaV9idWZwIHR5cGUgKTsKKyNlbmRpZiAvLyBIQ0ZfRU5DQVAKK0hDRl9TVEFUSUMgaGNmXzgJCW51bGxfYWRkcls0XSA9IHsgMCwgMCwgMCwgMCB9OworI2lmICEgZGVmaW5lZCBJTl9QT1JUX1dPUkQJCQkvL3JlcGxhY2UgSS9PIE1hY3JvcyB3aXRoIGxvZ2dpbmcgZmFjaWxpdHkKK2V4dGVybiBGSUxFICpsb2dfZmlsZTsKKworI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkJCQlpbl9wb3J0X3dvcmQoIChoY2ZfaW8pKHBvcnQpICkKKworc3RhdGljIGhjZl8xNiBpbl9wb3J0X3dvcmQoIGhjZl9pbyBwb3J0ICkgeworaGNmXzE2IGkgPSAoaGNmXzE2KV9pbnB3KCBwb3J0ICk7CisJaWYgKCBsb2dfZmlsZSApIHsKKwkJZnByaW50ZiggbG9nX2ZpbGUsICJcblIgJTIuMnggJTQuNHgiLCAocG9ydCkmMHhGRiwgaSk7CisJfQorCXJldHVybiBpOworfSAvLyBpbl9wb3J0X3dvcmQKKworI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQlvdXRfcG9ydF93b3JkKCAoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikodmFsdWUpICkKKworc3RhdGljIHZvaWQgb3V0X3BvcnRfd29yZCggaGNmX2lvIHBvcnQsIGhjZl8xNiB2YWx1ZSApIHsKKwlfb3V0cHcoIHBvcnQsIHZhbHVlICk7CisJaWYgKCBsb2dfZmlsZSApIHsKKwkJZnByaW50ZiggbG9nX2ZpbGUsICJcblcgJTIuMDJ4ICU0LjA0eCIsIChwb3J0KSYweEZGLCB2YWx1ZSApOworCX0KK30KKwordm9pZCBJTl9QT1JUX1NUUklOR18zMiggaGNmX2lvIHBydCwgaGNmXzMyIEZBUiAqIGRzdCwgaW50IG4pCXsKKwlpbnQgaSA9IDA7CisJaGNmXzE2IEZBUiAqIHA7CisJaWYgKCBsb2dfZmlsZSApIHsKKwkJZnByaW50ZiggbG9nX2ZpbGUsICJcbnJlYWQgc3RyaW5nXzMyIGxlbmd0aCAlMDR4ICglMDRkKSBhdCBwb3J0ICUwMi4yeCB0byBhZGRyICVscCIsCisJCQkJIChoY2ZfMTYpbiwgKGhjZl8xNiluLCAoaGNmXzE2KShwcnQpJjB4RkYsIGRzdCk7CisJfQorCXdoaWxlICggbi0tICkgeworCQlwID0gKGhjZl8xNiBGQVIgKilkc3Q7CisJCSpwKysgPSAoaGNmXzE2KV9pbnB3KCBwcnQgKTsKKwkJKnAgICA9IChoY2ZfMTYpX2lucHcoIHBydCApOworCQlpZiAoIGxvZ19maWxlICkgeworCQkJZnByaW50ZiggbG9nX2ZpbGUsICIlcyUwOGx4ICIsIGkrKyAlIDB4MDggPyAiICIgOiAiXG4iLCAqZHN0KTsKKwkJfQorCQlkc3QrKzsKKwl9Cit9IC8vIElOX1BPUlRfU1RSSU5HXzMyCisKK3ZvaWQgSU5fUE9SVF9TVFJJTkdfOF8xNiggaGNmX2lvIHBydCwgaGNmXzggRkFSICogZHN0LCBpbnQgbikgewkvL2Fsc28gaGFuZGxlcyBieXRlIGFsaWdubWVudCBwcm9ibGVtcworCWhjZl8xNiBGQVIgKiBwID0gKGhjZl8xNiBGQVIgKilkc3Q7CQkJCQkJCS8vdGhpcyBuZWVkcyBtb3JlIGVsYWJvcmF0ZSBjb2RlIGluIG5vbi14ODYgcGxhdGZvcm1zCisJaW50IGkgPSAwOworCWlmICggbG9nX2ZpbGUgKSB7CisJCWZwcmludGYoIGxvZ19maWxlLCAiXG5yZWFkIHN0cmluZ18xNiBsZW5ndGggJTA0eCAoJTA0ZCkgYXQgcG9ydCAlMDIuMnggdG8gYWRkciAlbHAiLAorCQkJCSAoaGNmXzE2KW4sIChoY2ZfMTYpbiwgKGhjZl8xNikocHJ0KSYweEZGLCBkc3QgKTsKKwl9CisJd2hpbGUgKCBuLS0gKSB7CisJCSpwID0oaGNmXzE2KV9pbnB3KCBwcnQpOworCQlpZiAoIGxvZ19maWxlICkgeworCQkJaWYgKCBpKysgJSAweDEwICkgeworCQkJCWZwcmludGYoIGxvZ19maWxlLCAiJTA0eCAiLCAqcCk7CisJCQl9IGVsc2UgeworCQkJCWZwcmludGYoIGxvZ19maWxlLCAiXG4lMDR4ICIsICpwKTsKKwkJCX0KKwkJfQorCQlwKys7CisJfQorfSAvLyBJTl9QT1JUX1NUUklOR184XzE2CisKK3ZvaWQgT1VUX1BPUlRfU1RSSU5HXzMyKCBoY2ZfaW8gcHJ0LCBoY2ZfMzIgRkFSICogc3JjLCBpbnQgbikJeworCWludCBpID0gMDsKKwloY2ZfMTYgRkFSICogcDsKKwlpZiAoIGxvZ19maWxlICkgeworCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxud3JpdGUgc3RyaW5nXzMyIGxlbmd0aCAlMDR4ICglMDRkKSBhdCBwb3J0ICUwMi4yeCIsCisJCQkJIChoY2ZfMTYpbiwgKGhjZl8xNiluLCAoaGNmXzE2KShwcnQpJjB4RkYpOworCX0KKwl3aGlsZSAoIG4tLSApIHsKKwkJcCA9IChoY2ZfMTYgRkFSICopc3JjOworCQlfb3V0cHcoIHBydCwgKnArKyApOworCQlfb3V0cHcoIHBydCwgKnAgICApOworCQlpZiAoIGxvZ19maWxlICkgeworCQkJZnByaW50ZiggbG9nX2ZpbGUsICIlcyUwOGx4ICIsIGkrKyAlIDB4MDggPyAiICIgOiAiXG4iLCAqc3JjKTsKKwkJfQorCQlzcmMrKzsKKwl9Cit9IC8vIE9VVF9QT1JUX1NUUklOR18zMgorCit2b2lkIE9VVF9QT1JUX1NUUklOR184XzE2KCBoY2ZfaW8gcHJ0LCBoY2ZfOCBGQVIgKiBzcmMsIGludCBuKQl7CS8vYWxzbyBoYW5kbGVzIGJ5dGUgYWxpZ25tZW50IHByb2JsZW1zCisJaGNmXzE2IEZBUiAqIHAgPSAoaGNmXzE2IEZBUiAqKXNyYzsJCQkJCQkJCS8vdGhpcyBuZWVkcyBtb3JlIGVsYWJvcmF0ZSBjb2RlIGluIG5vbi14ODYgcGxhdGZvcm1zCisJaW50IGkgPSAwOworCWlmICggbG9nX2ZpbGUgKSB7CisJCWZwcmludGYoIGxvZ19maWxlLCAiXG53cml0ZSBzdHJpbmdfMTYgbGVuZ3RoICUwNHggKCUwNGQpIGF0IHBvcnQgJTA0eCIsIG4sIG4sIChoY2ZfMTYpcHJ0KTsKKwl9CisJd2hpbGUgKCBuLS0gKSB7CisJCSh2b2lkKV9vdXRwdyggcHJ0LCAqcCk7CisJCWlmICggbG9nX2ZpbGUgKSB7CisJCQlpZiAoIGkrKyAlIDB4MTAgKSB7CisJCQkJZnByaW50ZiggbG9nX2ZpbGUsICIlMDR4ICIsICpwKTsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZiggbG9nX2ZpbGUsICJcbiUwNHggIiwgKnApOworCQkJfQorCQl9CisJCXArKzsKKwl9Cit9IC8vIE9VVF9QT1JUX1NUUklOR184XzE2CisKKyNlbmRpZiAvLyBJTl9QT1JUX1dPUkQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEIEEgVCBBICAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgSENGX0FTU0VSVAorSUZCUCBCQVNFRCBhc3NlcnRfaWZicCA9IE5VTEw7CQkJLy90byBtYWtlIGFzc2VydHMgZWFzaWx5IHdvcmsgdW5kZXIgTU1EIGFuZCBESEYKKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUCisKKyNpZiBIQ0ZfRU5DQVAKKy8qIFNOQVAgaGVhZGVyIHRvIGJlIGluc2VydGVkIGluIEV0aGVybmV0LUlJIGZyYW1lcyAqLworSENGX1NUQVRJQyAgaGNmXzggQkFTRUQgc25hcF9oZWFkZXJbXSA9IHsgMHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHgwMCwJLy81IGJ5dGVzIHNpZ25hdHVyZSArCisJCQkJCQkJCQkJICAwIH07CQkJCQkJCS8vMSBieXRlIHByb3RvY29sIGlkZW50aWZpZXIKKyNlbmRpZiAvLyBIQ0ZfRU5DQVAKKworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKK0hDRl9TVEFUSUMgaGNmXzggQkFTRUQgbWljX3BhZFs4XSA9IHsgMHg1QSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OwkJLy9NSUMgcGFkZGluZyBvZiBtZXNzYWdlCisjZW5kaWYgLy8gSENGX1RZUEVfV1BBCisKKyNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQKK0NGR19JREVOVElUWV9TVFJDVCBCQVNFRCBjZmdfZHJ2X2lkZW50aXR5ID0geworCXNpemVvZihjZmdfZHJ2X2lkZW50aXR5KS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAorCUNGR19EUlZfSURFTlRJVFksCQkJLy8gKDB4MDgyNikKKwlNU0ZfQ09NUE9ORU5UX0lELAorCU1TRl9DT01QT05FTlRfVkFSLAorCU1TRl9DT01QT05FTlRfTUFKT1JfVkVSLAorCU1TRl9DT01QT05FTlRfTUlOT1JfVkVSCit9IDsKKworQ0ZHX1JBTkdFU19TVFJDVCBCQVNFRCBjZmdfZHJ2X3N1cF9yYW5nZSA9IHsKKwlzaXplb2YoY2ZnX2Rydl9zdXBfcmFuZ2UpL3NpemVvZihoY2ZfMTYpIC0gMSwJLy9sZW5ndGggb2YgUklECisJQ0ZHX0RSVl9TVVBfUkFOR0UsCQkJLy8gKDB4MDgyNykKKworCUNPTVBfUk9MRV9TVVBMLAorCUNPTVBfSURfRFVJLAorCXt7CURVSV9DT01QQVRfVkFSLAorCQlEVUlfQ09NUEFUX0JPVCwKKwkJRFVJX0NPTVBBVF9UT1AKKwl9fQorfSA7CisKK3N0cnVjdCBDRkdfUkFOR0UzX1NUUkNUIEJBU0VEIGNmZ19kcnZfYWN0X3Jhbmdlc19wcmkgPSB7CisJc2l6ZW9mKGNmZ19kcnZfYWN0X3Jhbmdlc19wcmkpL3NpemVvZihoY2ZfMTYpIC0gMSwJLy9sZW5ndGggb2YgUklECisJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSSwJCS8vICgweDA4MjgpCisKKwlDT01QX1JPTEVfQUNULAorCUNPTVBfSURfUFJJLAorCXsKKwkgeyAwLCAwLCAwIH0sIAkJCQkJCQkvLyBIQ0ZfUFJJX1ZBUl8xIG5vdCBzdXBwb3J0ZWQgYnkgSENGIDcKKwkgeyAwLCAwLCAwIH0sIAkJCQkJCQkvLyBIQ0ZfUFJJX1ZBUl8yIG5vdCBzdXBwb3J0ZWQgYnkgSENGIDcKKwkgewkzLAkJCQkJCQkJCS8vdmFyX3JlY1syXSAtIFZhcmlhbnQgbnVtYmVyCisJCUNGR19EUlZfQUNUX1JBTkdFU19QUklfM19CT1RUT00sCQkvLwkJIC0gQm90dG9tIENvbXBhdGliaWxpdHkKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX1RPUAkJCS8vCQkgLSBUb3AgQ29tcGF0aWJpbGl0eQorCSB9CisJfQorfSA7CisKKworc3RydWN0IENGR19SQU5HRTRfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX3N0YSA9IHsKKwlzaXplb2YoY2ZnX2Rydl9hY3RfcmFuZ2VzX3N0YSkvc2l6ZW9mKGhjZl8xNikgLSAxLAkvL2xlbmd0aCBvZiBSSUQKKwlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBLAkJLy8gKDB4MDgyOSkKKworCUNPTVBfUk9MRV9BQ1QsCisJQ09NUF9JRF9TVEEsCisJeworI2lmIGRlZmluZWQgSENGX1NUQV9WQVJfMQorCSB7CTEsCQkJCQkJCQkJLy92YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8xX0JPVFRPTSwJCS8vCQkgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQorCQlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzFfVE9QCQkJLy8JCSAtIFRvcCBDb21wYXRpYmlsaXR5CisJIH0sCisjZWxzZQorCSB7IDAsIDAsIDAgfSwKKyNlbmRpZiAvLyBIQ0ZfU1RBX1ZBUl8xCisjaWYgZGVmaW5lZCBIQ0ZfU1RBX1ZBUl8yCisJIHsJMiwJCQkJCQkJCQkvL3Zhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgorCQlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfQk9UVE9NLAkJLy8JCSAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CisJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9UT1AJCQkvLwkJIC0gVG9wIENvbXBhdGliaWxpdHkKKwkgfSwKKyNlbHNlCisJIHsgMCwgMCwgMCB9LAorI2VuZGlmIC8vIEhDRl9TVEFfVkFSXzIKKy8vIEZvciBOYXRpdmVfVVNCIChOb3QgdXNlZCEpCisjaWYgZGVmaW5lZCBIQ0ZfU1RBX1ZBUl8zCisJIHsJMywJCQkJCQkJCQkvL3Zhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgorCQlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzNfQk9UVE9NLAkJLy8JCSAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CisJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfM19UT1AJCQkvLwkJIC0gVG9wIENvbXBhdGliaWxpdHkKKwkgfSwKKyNlbHNlCisJIHsgMCwgMCwgMCB9LAorI2VuZGlmIC8vIEhDRl9TVEFfVkFSXzMKKy8vIFdhcnAKKyNpZiBkZWZpbmVkIEhDRl9TVEFfVkFSXzQKKwkgewk0LAkJCQkJCQkJCS8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCisJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfNF9CT1RUT00sCQkvLyAgICAgICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQorCQlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzRfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKKwkgfQorI2Vsc2UKKwkgeyAwLCAwLCAwIH0KKyNlbmRpZiAvLyBIQ0ZfU1RBX1ZBUl80CisJfQorfSA7CisKKworc3RydWN0IENGR19SQU5HRTZfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX2hzaSA9IHsKKwlzaXplb2YoY2ZnX2Rydl9hY3RfcmFuZ2VzX2hzaSkvc2l6ZW9mKGhjZl8xNikgLSAxLAkvL2xlbmd0aCBvZiBSSUQKKwlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJLAkJLy8gKDB4MDgyQSkKKwlDT01QX1JPTEVfQUNULAorCUNPTVBfSURfSFNJLAorCXsKKyNpZiBkZWZpbmVkIEhDRl9IU0lfVkFSXzAJCQkJCS8vIENvbnRyb2xsZWQgZGVwbG95bWVudAorCSB7CTAsCQkJCQkJCQkJLy8gdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCisJCUNGR19EUlZfQUNUX1JBTkdFU19IU0lfMF9CT1RUT00sCQkvLyAgICAgICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQorCQlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzBfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKKwkgfSwKKyNlbHNlCisJIHsgMCwgMCwgMCB9LAorI2VuZGlmIC8vIEhDRl9IU0lfVkFSXzAKKwkgeyAwLCAwLCAwIH0sIAkJCQkJCQkvLyBIQ0ZfSFNJX1ZBUl8xIG5vdCBzdXBwb3J0ZWQgYnkgSENGIDcKKwkgeyAwLCAwLCAwIH0sIAkJCQkJCQkvLyBIQ0ZfSFNJX1ZBUl8yIG5vdCBzdXBwb3J0ZWQgYnkgSENGIDcKKwkgeyAwLCAwLCAwIH0sIAkJCQkJCQkvLyBIQ0ZfSFNJX1ZBUl8zIG5vdCBzdXBwb3J0ZWQgYnkgSENGIDcKKyNpZiBkZWZpbmVkIEhDRl9IU0lfVkFSXzQJCQkJCS8vIEhlcm1lcy1JSSBhbGwgdHlwZXMKKwkgewk0LAkJCQkJCQkJCS8vIHZhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgorCQlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV80X1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CisJIH0sCisjZWxzZQorCSB7IDAsIDAsIDAgfSwKKyNlbmRpZiAvLyBIQ0ZfSFNJX1ZBUl80CisjaWYgZGVmaW5lZCBIQ0ZfSFNJX1ZBUl81CQkJCQkvLyBXQVJQIEhlcm1lcy0yLjUKKwkgewk1LAkJCQkJCQkJCS8vIHZhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgorCQlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CisJIH0KKyNlbHNlCisJIHsgMCwgMCwgMCB9CisjZW5kaWYgLy8gSENGX0hTSV9WQVJfNQorCX0KK30gOworCisKK0NGR19SQU5HRTRfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX2FwZiA9IHsKKwlzaXplb2YoY2ZnX2Rydl9hY3RfcmFuZ2VzX2FwZikvc2l6ZW9mKGhjZl8xNikgLSAxLAkvL2xlbmd0aCBvZiBSSUQKKwlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGLAkJLy8gKDB4MDgyQikKKworCUNPTVBfUk9MRV9BQ1QsCisJQ09NUF9JRF9BUEYsCisJeworI2lmIGRlZmluZWQgSENGX0FQRl9WQVJfMQkJCQkvLyhGYWtlKSBIZXJtZXMtSQorCSB7CTEsCQkJCQkJCQkJLy92YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CisJCUNGR19EUlZfQUNUX1JBTkdFU19BUEZfMV9UT1AJCQkvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQorCSB9LAorI2Vsc2UKKwkgeyAwLCAwLCAwIH0sCisjZW5kaWYgLy8gSENGX0FQRl9WQVJfMQorI2lmIGRlZmluZWQgSENGX0FQRl9WQVJfMgkJCQkvL0hlcm1lcy1JSQorCSB7CTIsCQkJCQkJCQkJLy8gdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCisJCUNGR19EUlZfQUNUX1JBTkdFU19BUEZfMl9CT1RUT00sCQkvLyAgICAgICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQorCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKKwkgfSwKKyNlbHNlCisJIHsgMCwgMCwgMCB9LAorI2VuZGlmIC8vIEhDRl9BUEZfVkFSXzIKKyNpZiBkZWZpbmVkIEhDRl9BUEZfVkFSXzMJCQkJCQkvLyBOYXRpdmVfVVNCCisJIHsJMywJCQkJCQkJCQkJLy8gdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCisJCUNGR19EUlZfQUNUX1JBTkdFU19BUEZfM19CT1RUT00sCQkvLyAgICAgICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQkhISEhIXNlZSBub3RlIGJlbG93ISEhISEhIQorCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzNfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKKwkgfSwKKyNlbHNlCisJIHsgMCwgMCwgMCB9LAorI2VuZGlmIC8vIEhDRl9BUEZfVkFSXzMKKyNpZiBkZWZpbmVkIEhDRl9BUEZfVkFSXzQJCQkJCQkvLyBXQVJQIEhlcm1lcyAyLjUKKwkgewk0LAkJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl80X0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CSEhISEhc2VlIG5vdGUgYmVsb3chISEhISEhCisJCUNGR19EUlZfQUNUX1JBTkdFU19BUEZfNF9UT1AJCQkvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQorCSB9CisjZWxzZQorCSB7IDAsIDAsIDAgfQorI2VuZGlmIC8vIEhDRl9BUEZfVkFSXzQKKwl9Cit9IDsKKyNkZWZpbmUgSENGX1ZFUlNJT04gIFRFWFQoICJIQ0YkUmV2aXNpb246IDEuMTAgJCIgKQorCitzdGF0aWMgc3RydWN0IC8qQ0ZHX0hDRl9PUFRfU1RSQ1QqLyB7CisJaGNmXzE2CWxlbjsJCQkJCS8vbGVuZ3RoIG9mIGNmZ19oY2Zfb3B0IHN0cnVjdAorCWhjZl8xNgl0eXA7CQkJCQkvL3R5cGUgMHgwODJDCisJaGNmXzE2CSB2MDsJCQkJCQkvL29mZnNldCBIQ0ZfVkVSU0lPTgorCWhjZl8xNgkgdjE7CQkJCQkJLy8gTVNGX0NPTVBPTkVOVF9JRAorCWhjZl8xNgkgdjI7CQkJCQkJLy8gSENGX0FMSUdOCisJaGNmXzE2CSB2MzsJCQkJCQkvLyBIQ0ZfQVNTRVJUCisJaGNmXzE2CSB2NDsJCQkJCQkvLyBIQ0ZfQklHX0VORElBTgorCWhjZl8xNgkgdjU7CQkJCQkJLy8gLyogSENGX0RMViB8IEhDRl9ETE5WICovCisJaGNmXzE2CSB2NjsJCQkJCQkvLyBIQ0ZfRE1BCisJaGNmXzE2CSB2NzsJCQkJCQkvLyBIQ0ZfRU5DQVAKKwloY2ZfMTYJIHY4OwkJCQkJCS8vIEhDRl9FWFQKKwloY2ZfMTYJIHY5OwkJCQkJCS8vIEhDRl9JTlRfT04KKwloY2ZfMTYJdjEwOwkJCQkJCS8vIEhDRl9JTworCWhjZl8xNgl2MTE7CQkJCQkJLy8gSENGX0xFR0FDWQorCWhjZl8xNgl2MTI7CQkJCQkJLy8gSENGX01BWF9MVFYKKwloY2ZfMTYJdjEzOwkJCQkJCS8vIEhDRl9QUk9UX1RJTUUKKwloY2ZfMTYJdjE0OwkJCQkJCS8vIEhDRl9TTEVFUAorCWhjZl8xNgl2MTU7CQkJCQkJLy8gSENGX1RBTExJRVMKKwloY2ZfMTYJdjE2OwkJCQkJCS8vIEhDRl9UWVBFCisJaGNmXzE2CXYxNzsJCQkJCQkvLyBIQ0ZfTklDX1RBTF9DTlQKKwloY2ZfMTYJdjE4OwkJCQkJCS8vIEhDRl9IQ0ZfVEFMX0NOVAorCWhjZl8xNgl2MTk7CQkJCQkJLy8gb2Zmc2V0IHRhbGxpZXMKKwlUQ0hBUgl2YWxbc2l6ZW9mKEhDRl9WRVJTSU9OKV07Cit9IEJBU0VEIGNmZ19oY2Zfb3B0ID0geworCXNpemVvZihjZmdfaGNmX29wdCkvc2l6ZW9mKGhjZl8xNikgLTEsCisJQ0ZHX0hDRl9PUFQsCQkJCS8vICgweDA4MkMpCisJKCBzaXplb2YoY2ZnX2hjZl9vcHQpIC0gc2l6ZW9mKEhDRl9WRVJTSU9OKSAtIDQgKS9zaXplb2YoaGNmXzE2KSwKKyNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQKKwlNU0ZfQ09NUE9ORU5UX0lELAorI2Vsc2UKKwkwLAorI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKKwlIQ0ZfQUxJR04sCisJSENGX0FTU0VSVCwKKwlIQ0ZfQklHX0VORElBTiwKKwkwLAkJCQkJCQkJCS8vIC8qIEhDRl9ETFYgfCBIQ0ZfRExOViovLAorCUhDRl9ETUEsCisJSENGX0VOQ0FQLAorCUhDRl9FWFQsCisJSENGX0lOVF9PTiwKKwlIQ0ZfSU8sCisJSENGX0xFR0FDWSwKKwlIQ0ZfTUFYX0xUViwKKwlIQ0ZfUFJPVF9USU1FLAorCUhDRl9TTEVFUCwKKwlIQ0ZfVEFMTElFUywKKwlIQ0ZfVFlQRSwKKyNpZiAoSENGX1RBTExJRVMpICYgKCBIQ0ZfVEFMTElFU19OSUMgfCBIQ0ZfVEFMTElFU19IQ0YgKQorCUhDRl9OSUNfVEFMX0NOVCwKKwlIQ0ZfSENGX1RBTF9DTlQsCisJb2Zmc2V0b2YoSUZCX1NUUkNULCBJRkJfVGFsbHlMZW4gKSwKKyNlbHNlCisJMCwgMCwgMCwKKyNlbmRpZiAvLyBIQ0ZfVEFMTElFU19OSUMgLyBIQ0ZfVEFMTElFU19IQ0YKKwlIQ0ZfVkVSU0lPTgorfTsgLy8gY2ZnX2hjZl9vcHQKKyNlbmRpZiAvLyBNU0ZfQ09NUE9ORU5UX0lECisKKyNpZiBkZWZpbmVkIEhDRl9UQUxMSUVTX0VYVFJBCisJcmVwbGFjZWQgYnkgSENGX0VYVF9UQUxMSUVTX0ZXIDsKKyNlbmRpZiAvLyBIQ0ZfVEFMTElFU19FWFRSQQorCisjaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lEIHx8IChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX01CCitIQ0ZfU1RBVElDIExUVl9TVFJDVCBCQVNFRCBjZmdfbnVsbCA9IHsgMSwgQ0ZHX05VTEwsIHswfSB9OworI2VuZGlmIC8vIEhDRl9FWFRfTUIKK0hDRl9TVEFUSUMgaGNmXzE2KiBCQVNFRCB4eHh4WyBdID0geworI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKKwkmY2ZnX251bGwubGVuLAkJCQkJCQkvL0NGR19OVUxMCQkJCQkJMHgwODIwCisjZW5kaWYgLy8gSENGX0VYVF9NQgorI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRAorCSZjZmdfZHJ2X2lkZW50aXR5LmxlbiwJCQkJCS8vQ0ZHX0RSVl9JREVOVElUWSAgICAgICAgICAgICAgMHgwODI2CisJJmNmZ19kcnZfc3VwX3JhbmdlLmxlbiwJCQkJCS8vQ0ZHX0RSVl9TVVBfUkFOR0UgICAgICAgICAgICAgMHgwODI3CisJJmNmZ19kcnZfYWN0X3Jhbmdlc19wcmkubGVuLAkJCS8vQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSSAgICAgICAgMHgwODI4CisJJmNmZ19kcnZfYWN0X3Jhbmdlc19zdGEubGVuLAkJCS8vQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQQkJMHgwODI5CisJJmNmZ19kcnZfYWN0X3Jhbmdlc19oc2kubGVuLAkJCS8vQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSQkJMHgwODJBCisJJmNmZ19kcnZfYWN0X3Jhbmdlc19hcGYubGVuLAkJCS8vQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRgkJMHgwODJCCisJJmNmZ19oY2Zfb3B0LmxlbiwJCQkJCQkvL0NGR19IQ0ZfT1BUCQkJCQkweDA4MkMKKwlOVUxMLAkJCQkJCQkJCS8vSUZCX1BSSUlkZW50aXR5IHBsYWNlaG9sZGVyCTB4RkQwMgorCU5VTEwsCQkJCQkJCQkJLy9JRkJfUFJJU3VwIHBsYWNlaG9sZGVyCQkweEZEMDMKKyNlbmRpZiAvLyBNU0ZfQ09NUE9ORU5UX0lECisJTlVMTAkJCQkJCQkJCS8vZW5kc2VudGluZWwKKyAgfTsKKyNkZWZpbmUgeHh4eF9QUklfSURFTlRJVFlfT0ZGU0VUCShzaXplb2YoeHh4eCkvc2l6ZW9mKHh4eHhbMF0pIC0gMykKKworI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQgLyBIQ0ZfRVhUX01CCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKiogVCBPIFAgICBMIEUgViBFIEwgICBIIEMgRiAgIFIgTyBVIFQgSSBOIEUgUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgKEhDRl9ETF9PTkxZKSA9PSAwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLk1PRFVMRQkJaW50IGhjZl9hY3Rpb24oIElGQlAgaWZicCwgaGNmXzE2IGFjdGlvbiApCisqLlBVUlBPU0UJCUNoYW5nZXMgdGhlIHJ1bi10aW1lIENhcmQgYmVoYXZpb3IuCisqCQkJCVBlcmZvcm1zIE1pc2NlbGxhbnVvdXMgYWN0aW9ucy4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCQkJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKglhY3Rpb24JCQkJCW51bWJlciBpZGVudGlmeWluZyB0aGUgdHlwZSBvZiBjaGFuZ2UKKyoJIC0gSENGX0FDVF9DQ1hfT0ZGCQlkaXNhYmxlIENLSVAKKyoJIC0gSENGX0FDVF9DQ1hfT04JCWVuYWJsZSBDS0lQCisqCSAtIEhDRl9BQ1RfSU5UX0ZPUkNFX09OCWVuYWJsZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBieSBXYXZlTEFOIE5JQworKgkgLSBIQ0ZfQUNUX0lOVF9PRkYJCWRpc2FibGUgaW50ZXJydXB0IGdlbmVyYXRpb24gYnkgV2F2ZUxBTiBOSUMKKyoJIC0gSENGX0FDVF9JTlRfT04JCWNvbXBlbnNhdGUgMSBIQ0ZfQUNUX0lOVF9PRkYsIGVuYWJsZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBpZiBiYWxhbmNlIHJlYWNoZWQKKyoJIC0gSENGX0FDVF9QUlNfU0NBTgkJSGVybWVzIFByb2JlIFJlc3BvbnMgU2NhbiAoRjEwMikgY29tbWFuZAorKgkgLSBIQ0ZfQUNUX1JYX0FDSwkJYWNrbm93bGVkZ2Ugbm9uLURNQSByZWNlaXZlciB0byBIZXJtZXMKKyoJIC0gSENGX0FDVF9TQ0FOCQkJSGVybWVzIElucXVpcmUgU2NhbiAoRjEwMSkgY29tbWFuZCAobm9uLVdBUlAgb25seSkKKyoJIC0gSENGX0FDVF9TTEVFUAkJRERTIFNsZWVwIHJlcXVlc3QKKyoJIC0gSENGX0FDVF9UQUxMSUVTCQlIZXJtZXMgSW5xdWlyZSBUYWxsaWVzIChGMTAwKSBjb21tYW5kCisqCisqLlJFVFVSTlMKKyoJSENGX1NVQ0NFU1MJCQkJYWxsIChpbmNsdWRpbmcgaW52YWxpZCkKKyoJSENGX0lOVF9QRU5ESU5HCQkJSENGX0FDVF9JTlRfT0ZGLCBpbnRlcnJ1cHQgcGVuZGluZworKglIQ0ZfRVJSX05PX05JQwkJCUhDRl9BQ1RfSU5UX09GRiwgTklDIHByZXNlbmNlIGNoZWNrIGZhaWxzCisqCisqLkNPTkRJVElPTlMKKyogRXhjZXB0IGZvciBoY2ZfYWN0aW9uIHdpdGggSENGX0FDVF9JTlRfRk9SQ0VfT04gb3IgSENGX0FDVF9JTlRfT0ZGIGFzIHBhcmFtZXRlciBvciBoY2ZfY29ubmVjdCB3aXRoIGFuIEkvTworKiBhZGRyZXNzIChpLmUuIG5vdCBIQ0ZfRElTQ09OTkVDVCksIGFsbCBoY2YtZnVuY3Rpb24gY2FsbHMgTVVTVCBiZSBwcmVjZWVkZWQgYnkgYSBjYWxsIG9mIGhjZl9hY3Rpb24gd2l0aAorKiBIQ0ZfQUNUX0lOVF9PRkYgYXMgcGFyYW1ldGVyLgorKiBOb3RlIHRoYXQgaGNmX2Nvbm5lY3QgZGVmYXVsdHMgdG8gTklDIGludGVycnVwdCBkaXNhYmxlZCBtb2RlLCBpLmUuIGFzIGlmIGhjZl9hY3Rpb24oIEhDRl9BQ1RfSU5UX09GRiApCisqIHdhcyBjYWxsZWQuCisqCisqLkRFU0NSSVBUSU9OCisqIGhjZl9hY3Rpb24gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBtb2RlIGNoYW5naW5nIGFjdGlvbi1jb2RlIHBhaXJzIHRoYXQgYXJlIGFudG9ueW1zCisqCSAtIEhDRl9BQ1RfQ0NYX09GRiAvIEhDRl9BQ1RfQ0NYX09OCisqCSAtIEhDRl9BQ1RfSU5UX1tGT1JDRV9dT04gLyBIQ0ZfQUNUX0lOVF9PRkYKKyoKKyogQWRkaXRpb25hbGx5IGhjZl9hY3Rpb24gY2FuIHN0YXJ0IHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBpbiB0aGUgTklDOgorKgkgLSBIQ0ZfQUNUX1BSU19TQ0FOCisqCSAtIEhDRl9BQ1RfUlhfQUNLCisqCSAtIEhDRl9BQ1RfU0NBTgorKgkgLSBIQ0ZfQUNUX1NMRUVQCisqCSAtIEhDRl9BQ1RfVEFMTElFUworKgorKiBvIEhDRl9BQ1RfSU5UX09GRjogU2V0cyBOSUMgSW50ZXJydXB0cyBtb2RlIERpc2FibGVkLgorKiBUaGlzIGNvbW1hbmQsIGFuZCB0aGUgYXNzb2NpYXRlZCBbRm9yY2VdIEVuYWJsZSBOSUMgaW50ZXJydXB0cyBjb21tYW5kLCBhcmUgb25seSBhdmFpbGFibGUgaWYgdGhlIEhDRl9JTlRfT04KKyogY29tcGlsZSB0aW1lIG9wdGlvbiBpcyBub3Qgc2V0IGF0IDB4MDAwMC4KKyoKKyogbyBIQ0ZfQUNUX0lOVF9PTjogU2V0cyBOSUMgSW50ZXJydXB0cyBtb2RlIEVuYWJsZWQuCisqIEVuYWJsZSBOSUMgSW50ZXJydXB0cywgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgcHJlY2VkaW5nIERpc2FibGUgTklDIEludGVycnVwdCBjYWxscy4KKyoKKyogbyBIQ0ZfQUNUX0lOVF9GT1JDRV9PTjogRm9yY2UgTklDIEludGVycnVwdHMgbW9kZSBFbmFibGVkLgorKiBTZXRzIE5JQyBJbnRlcnJ1cHRzIG1vZGUgRW5hYmxlZCwgcmVnYXJkbGVzcyBvZmYgdGhlIG51bWJlciBvZiBwcmVjZWRpbmcgRGlzYWJsZSBOSUMgSW50ZXJydXB0IGNhbGxzLgorKgorKiBUaGUgZGlzYWJsaW5nIGFuZCBlbmFibGluZyBvZiBpbnRlcnJ1cHRzIGFyZSBhbnRvbnltcy4KKyogVGhlc2UgYWN0aW9ucyBtdXN0IGJlIGJhbGFuY2VkLgorKiBGb3IgZWFjaCAiZGlzYWJsZSBpbnRlcnJ1cHRzIiB0aGVyZSBtdXN0IGJlIGEgbWF0Y2hpbmcgImVuYWJsZSBpbnRlcnJ1cHRzIi4KKyogVGhlIGRpc2FibGUgaW50ZXJydXB0cyBtYXkgYmUgZXhlY3V0ZWQgbXVsdGlwbGUgdGltZXMgaW4gYSByb3cgd2l0aG91dCBpbnRlcnZlbmluZyBlbmFibGUgaW50ZXJydXB0cywgaW4KKyogb3RoZXIgd29yZHMsIHRoZSBkaXNhYmxlIGludGVycnVwdHMgbWF5IGJlIG5lc3RlZC4KKyogVGhlIGludGVycnVwdCBnZW5lcmF0aW9uIG1lY2hhbmlzbSBpcyBkaXNhYmxlZCBhdCB0aGUgZmlyc3QgY2FsbCB3aXRoIEhDRl9BQ1RfSU5UX09GRi4KKyogVGhlIGludGVycnVwdCBnZW5lcmF0aW9uIG1lY2hhbmlzbSBpcyByZS1lbmFibGVkIHdoZW4gdGhlIG51bWJlciBvZiBjYWxscyB3aXRoIEhDRl9BQ1RfSU5UX09OIG1hdGNoZXMgdGhlCisqIG51bWJlciBvZiBjYWxscyB3aXRoIElOVF9PRkYuCisqCisqIEl0IGlzIG5vdCBhbGxvd2VkIHRvIGhhdmUgbW9yZSBFbmFibGUgTklDIEludGVycnVwdHMgY2FsbHMgdGhhbiBEaXNhYmxlIE5JQyBJbnRlcnJ1cHRzIGNhbGxzLgorKiBUaGUgaW50ZXJydXB0IGdlbmVyYXRpb24gbWVjaGFuaXNtIGlzIGluaXRpYWxseSAoaS5lLiBhZnRlciBoY2ZfY29ubmVjdCkgZGlzYWJsZWQuCisqIEFuIE1TRiBiYXNlZCBvbiBhIGludGVycnVwdCBzdHJhdGVneSBtdXN0IGNhbGwgaGNmX2FjdGlvbiB3aXRoIElOVF9PTiBpbiBpdHMgaW5pdGlhbGl6YXRpb24gbG9naWMuCisqCisqIQlUaGUgSU5UX09GRi9JTlRfT04gaG91c2VrZWVwaW5nIGlzIGluaXRpYWxpemVkIGF0IDB4MDAwMCBieSBoY2ZfY29ubmVjdCwgY2F1c2luZyB0aGUgaW50ZXJydXB0IGdlbmVyYXRpb24KKyoJbWVjaGFuaXNtIHRvIGJlIGRpc2FibGVkIGF0IGZpcnN0LiBUaGlzIHN1aXRzIE1TRiBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBhIHBvbGxpbmcgc3RyYXRlZ3kuCisqCisqIG8gSENGX0FDVF9DQ1hfT0ZGIC8gSENGX0FDVF9DQ1hfT04KKyohISBUaGlzIGNhbiB1c2Ugc29tZSBtb3JlIGV4cGxhbmF0aW9uOz8KKyogRGlzYWJsZXMgYW5kIEVuYWJsZXMgc3VwcG9ydCBpbiB0aGUgSENGIHJ1bnRpbWUgY29kZSBmb3IgdGhlIENDWCBmZWF0dXJlLiBFYWNoIHRpbWUgb25lIG9mIHRoZXNlIGFjdGlvbgorKiBjb2RlcyBpcyB1c2VkLCB0aGUgZWZmZWN0cyBvZiB0aGUgcHJlY2VkaW5nIHVzZSBjZWFzZS4KKyoKKyogbyBIQ0ZfQUNUX1NMRUVQOiBJbml0aWF0ZXMgdGhlIERpc2Nvbm5lY3RlZCBEZWVwU2xlZXAgcHJvY2VzcworKiBUaGlzIGNvbW1hbmQgaXMgb25seSBhdmFpbGFibGUgaWYgdGhlIEhDRl9ERFMgY29tcGlsZSB0aW1lIG9wdGlvbiBpcyBzZXQuIEl0IHRyaWdnZXJzIHRoZSBGL1cgdG8gc3RhcnQgdGhlCisqIHNsZWVwIGhhbmRzaGFraW5nLiBSZWdhcmRsZXNzIHdoZXRoZXIgdGhlIEhvc3QgaW5pdGlhdGVzIGEgRGlzY29ubmVjdGVkIERlZXBTbGVlcCAoRERTKSBvciB0aGUgRi9XIGluaXRpYXRlcworKiBhIENvbm5lY3RlZCBEZWVwU2xlZXAgKENEUyksIHRoZSBIb3N0LUYvVyBzbGVlcCBoYW5kc2hha2luZyBpcyBjb21wbGV0ZWQgd2hlbiB0aGUgTklDIEludGVycnVwdHMgbW9kZSBpcworKiBlbmFibGVkIChieSBtZWFucyBvZiB0aGUgYmFsYW5jaW5nIEhDRl9BQ1RfSU5UX09OKSwgaS5lLiBhdCB0aGF0IG1vbWVudCB0aGUgRi9XIHJlYWxseSBnb2VzIGludG8gc2xlZXAgbW9kZS4KKyogVGhlIEYvVyBpcyB3b2tlbnVwIGJ5IHRoZSBIQ0Ygd2hlbiB0aGUgTklDIEludGVycnVwdHMgbW9kZSBhcmUgZGlzYWJsZWQsIGkuZS4gYXQgdGhlIGZpcnN0IEhDRl9BQ1RfSU5UX09GRgorKiBhZnRlciBnb2luZyBpbnRvIHNsZWVwLgorKgorKiBUaGUgZm9sbG93aW5nIE1pc2NlbGxhbnVvdXMgYWN0aW9ucyBhcmUgZGVmaW5lZDoKKyoKKyogbyBIQ0ZfQUNUX1JYX0FDSzogUmVjZWl2ZXIgQWNrbm93bGVkZ2VtZW50IChub24tRE1BLCBub24tVVNCIG1vZGUgb25seSkKKyogQWNraW5nIHRoZSByZWNlaXZlciwgZnJlZXMgdGhlIE5JQyBtZW1vcnkgdXNlZCB0byBob2xkIHRoZSBSeCBmcmFtZSBhbmQgYWxsb3dzIHRoZSBGL1cgdG8KKyogcmVwb3J0IHRoZSBleGlzdGVuY2Ugb2YgdGhlIG5leHQgUnggZnJhbWUuCisqIElmIHRoZSBNU0YgZG9lcyBub3QgbmVlZCBhY2Nlc3MgKGFueSBsb25nZXIpIHRvIHRoZSBjdXJyZW50IGZyYW1lLCBlLmcuIGJlY2F1c2UgaXQgaXMgcmVqZWN0ZWQgYmFzZWQgb24gdGhlCisqIGxvb2sgYWhlYWQgb3IgY29waWVkIHRvIGFub3RoZXIgYnVmZmVyLCB0aGUgcmVjZWl2ZXIgbWF5IGJlIGFja2VkLiBBY2tpbmcgZWFybGllciBpcyBhc3N1bWVkIHRvIGhhdmUgdGhlCisqIHBvdGVudGlhbCBvZiBpbXByb3ZpbmcgdGhlIHBlcmZvcm1hbmNlLgorKiBJZiB0aGUgTVNGIGRvZXMgbm90IGV4cGxpdGx5IGFjayB0ZSByZWNlaXZlciwgdGhlIGFja2luZyBpcyBkb25lIGltcGxpY2l0bHkgaWY6CisqIC0gdGhlIHJlY2VpdmVkIGZyYW1lIGZpdHMgaW4gdGhlIGxvb2sgYWhlYWQgYnVmZmVyLCBieSB0aGUgaGNmX3NlcnZpY2VfbmljIGNhbGwgdGhhdCByZXBvcnRlZCB0aGUgUnggZnJhbWUKKyogLSBpZiBub3QgaW4gdGhlIGFib3ZlIHN0ZXAsIGJ5IGhjZl9yY3ZfbXNnIChhc3N1bWluZyBoY2ZfcmN2X21zZyBpcyBjYWxsZWQpCisqIC0gaWYgbmVpdGhlciBvZiB0aGUgYWJvdmUgaW1wbGljaXQgYWNrcyBub3IgYW4gZXhwbGljaXQgYWNrIGJ5IHRoZSBNU0YsIGJ5IHRoZSBmaXJzdCBoY2Zfc2VydmljZV9uaWMgYWZ0ZXIKKyoJdGhlIGhjZl9zZXJ2aWNlX25pYyB0aGF0IHJlcG9ydGVkIHRoZSBSeCBmcmFtZS4KKyogTm90ZTogSWYgYW4gUnggZnJhbWUgaXMgYWxyZWFkeSBhY2tlZCwgYW4gZXhwbGljaXQgQUNLIGJ5IHRoZSBNU0YgYWN0cyBhcyBhIE5vT3BlcmF0aW9uLgorKgorKiBvIEhDRl9BQ1RfVEFMTElFUzogSW5xdWlyZSBUYWxsaWVzIGNvbW1hbmQKKyogVGhpcyBjb21tYW5kIGlzIG9ubHkgb3BlcmF0aW9uYWwgaWYgdGhlIEYvVyBpcyBlbmFibGVkLgorKiBUaGUgSW5xdWlyZSBUYWxsaWVzIGNvbW1hbmQgcmVxdWVzdHMgdGhlIEYvVyB0byBwcm92aWRlIGl0cyBjdXJyZW50IHNldCBvZiB0YWxsaWVzLgorKiBTZWUgYWxzbyBoY2ZfZ2V0X2luZm8gd2l0aCBDRkdfVEFMTElFUyBhcyBwYXJhbWV0ZXIuCisqCisqIG8gSENGX0FDVF9QUlNfU0NBTjogSW5xdWlyZSBQcm9iZSBSZXNwb25zIFNjYW4gY29tbWFuZAorKiBUaGlzIGNvbW1hbmQgaXMgb25seSBvcGVyYXRpb25hbCBpZiB0aGUgRi9XIGlzIGVuYWJsZWQuCisqIFRoZSBQcm9iZSBSZXNwb25zIFNjYW4gY29tbWFuZCBzdGFydHMgYSBzY2FuIHNlcXVlbmNlLgorKiBUaGUgSENGIHB1dHMgdGhlIHJlc3VsdCBvZiB0aGlzIGFjdGlvbiBpbiBhbiBNU0YgZGVmaW5lZCBidWZmZXIgKHNlZSBDRkdfUklEX0xPR19TVFJDVCkuCisqCisqIG8gSENGX0FDVF9TQ0FOOiBJbnF1aXJlIFNjYW4gY29tbWFuZAorKiBUaGlzIGNvbW1hbmQgaXMgb25seSBzdXBwb3J0ZWQgZm9yIEhJSSBGL1cgKGkuZS4gcHJlLVdBUlApIGFuZCBpdCBpcyBvcGVyYXRpb25hbCBpZiB0aGUgRi9XIGlzIGVuYWJsZWQuCisqIFRoZSBJbnF1aXJlIFNjYW4gY29tbWFuZCBzdGFydHMgYSBzY2FuIHNlcXVlbmNlLgorKiBUaGUgSENGIHB1dHMgdGhlIHJlc3VsdCBvZiB0aGlzIGFjdGlvbiBpbiBhbiBNU0YgZGVmaW5lZCBidWZmZXIgKHNlZSBDRkdfUklEX0xPR19TVFJDVCkuCisqCisqIEFzc2VydCBmYWlscyBpZgorKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKyogLSBOSUMgaW50ZXJydXB0cyBhcmUgbm90IGRpc2FibGVkIHdoaWxlIHJlcXVpcmVkIGJ5IHBhcmFtZXRlciBhY3Rpb24uCisqIC0gYW4gaW52YWxpZCBjb2RlIGlzIHNwZWNpZmllZCBpbiBwYXJhbWV0ZXIgYWN0aW9uLgorKiAtIEhDRl9BQ1RfSU5UX09OIGNvbW1hbmRzIG91dG51bWJlciB0aGUgSENGX0FDVF9JTlRfT0ZGIGNvbW1hbmRzLgorKiAtIHJlZW50cmFuY3ksIG1heSBiZSAgY2F1c2VkIGJ5IGNhbGxpbmcgaGNmX2Z1bmN0aW9ucyB3aXRob3V0IGFkZXF1YXRlIHByb3RlY3Rpb24gYWdhaW5zdCBOSUMgaW50ZXJydXB0cyBvcgorKgltdWx0aS10aHJlYWRpbmcKKyoKKyogLSBTaW5jZSB0aGUgSENGIGRvZXMgbm90IG1haW50YWluIHN0YXR1cyBpbmZvcm1hdGlvbiByZWxhdGl2ZSB0byB0aGUgRi9XIGVuYWJsZWQgc3RhdGUsIGl0IGlzIG5vdCBhc3NlcnRlZAorKgl3aGV0aGVyIEhDRl9BQ1RfU0NBTiwgSENGX0FDVF9QUlNfU0NBTiBvciBIQ0ZfQUNUX1RBTExJRVMgYXJlIG9ubHkgdXNlZCB3aGlsZSBGL1cgaXMgZW5hYmxlZC4KKyoKKyouRElBR1JBTQorKiAwOiBUaGUgYXNzZXJ0IGVtYmVkZGVkIGluIEhDRkxPR0VOVFJZIGNoZWNrcyBhZ2FpbnN0IHJlLWVudHJhbmN5LiBSZS1lbnRyYW5jeSBjb3VsZCBiZSBjYXVzZWQgYnkgYSBNU0YgbG9naWMKKyoJYXQgdGFzay1sZXZlbCBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBzaGllbGRpbmcgd2l0aCBIQ0ZfQUNUX09OL19PRkYuIEhvd2V2ZXIgdGhlIEhDRl9BQ1RfSU5UX09GRgorKglhY3Rpb24gaXRzZWxmIGNhbiBwZXIgZGVmaW5pdGlvbiBub3QgYmUgcHJvdGVjdGVkIHRoaXMgd2F5LiBCYXNlZCBvbiBjb2RlIGluc3BlY3Rpb24sIGl0IGNhbiBiZSBjb25jbHVkZWQsCisqCXRoYXQgdGhlcmUgaXMgbm8gcmUtZW50cmFuY3kgUFJPQkxFTSBpbiB0aGlzIHBhcnRpY3VsYXIgZmxvdy4gSXQgZG9lcyBub3Qgc2VlbSB3b3J0aCB0aGUgdHJvdWJsZSB0bworKglleHBsaWNpdGx5IGNoZWNrIGZvciB0aGlzIGNvbmRpdGlvbiAoYWx0aG91Z2ggdGhlcmUgd2FzIGEgcmVwb3J0IG9mIGFuIE1TRiB3aGljaCByYW4gaW50byB0aGlzIGFzc2VydC4KKyogMjpJRkJfSW50T2ZmQ250IGlzIHVzZWQgdG8gYmFsYW5jZSB0aGUgSU5UX09GRiBhbmQgSU5UX09OIGNhbGxzLiAgRGlzYWJsaW5nIG9mIHRoZSBpbnRlcnJ1cHRzIGlzIGFjaGlldmVkIGJ5CisqCXdyaXRpbmcgYSB6ZXJvIHRvIHRoZSBIZXJtZXMgSW50RW4gcmVnaXN0ZXIuICBJbiBhIHNoYXJlZCBpbnRlcnJ1cHQgZW52aXJvbm1lbnQgKGUuZy4gdGhlIG1pbmktUENJIE5ESVMKKyoJZHJpdmVyKSBpdCBpcyBjb25zaWRlcmVkIG1vcmUgY29ycmVjdCB0byByZXR1cm4gdGhlIHN0YXR1cyBIQ0ZfSU5UX1BFTkRJTkcgaWYgYW5kIG9ubHkgaWYsIHRoZSBjdXJyZW50CisqCWludm9jYXRpb24gb2YgaGNmX3NlcnZpY2VfbmljIGlzIChhcHBhcmVudGx5KSBjYWxsZWQgaW4gdGhlIElTUiB3aGVuIHRoZSBJU1Igd2FzIGFjdGl2YXRlZCBhcyByZXN1bHQgb2YgYQorKgljaGFuZ2UgaW4gSFJFR19FVl9TVEFUIG1hdGNoaW5nIGEgYml0IGluIEhSRUdfSU5UX0VOLCBpLmUuIG5vdCBpZiBpbnZva2VkIGFzIHJlc3VsdCBvZiBhbm90aGVyIGRldmljZQorKglnZW5lcmF0aW5nIGFuIGludGVycnVwdCBvbiB0aGUgc2hhcmVkIGludGVycnVwdCBsaW5lLgorKglOb3RlIDE6IGl0IGhhcyBiZWVuIG9ic2VydmVkIHRoYXQgdW5kZXIgY2VydGFpbiBhZHZlcnNlIGNvbmRpdGlvbnMgb24gY2VydGFpbiBwbGF0Zm9ybXMgdGhlIHdyaXRpbmcgb2YKKyoJSFJFR19JTlRfRU4gY2FuIGFwcGFyZW50bHkgZmFpbCwgdGhlcmVmb3IgaXQgaXMgcGFyYW1vdW50IHRoYXQgSFJFR19JTlRfRU4gaXMgd3JpdHRlbiBhZ2FpbiB3aXRoIDAgZm9yCisqCWVhY2ggYW5kIGV2ZXJ5IGNhbGwgdG8gSENGX0FDVF9JTlRfT0ZGLgorKglOb3RlIDI6IGl0IGhhcyBiZWVuIG9ic2VydmVkIHRoYXQgdW5kZXIgY2VydGFpbiBIL1cgJiBTL1cgYXJjaGl0ZWN0dXJlcyB0aGlzIGxvZ2ljIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzCisqCW5vIE5JQyBhdCBhbGwuIFRvIGNhdGVyIGZvciB0aGlzLCB0aGUgdmFsdWUgb2YgSFJFR19JTlRfRU4gaXMgdmFsaWRhdGVkLiBJZiB0aGUgdW51c2VkIGJpdCAweDAxMDAgaXMgc2V0LAorKglpdCBpcyBhc3N1bWVkIHRoZXJlIGlzIG5vIE5JQy4KKyoJTm90ZSAzOiBEdXJpbmcgdGhlIGRvd25sb2FkIHByb2Nlc3MsIHNvbWUgdmVyc2lvbnMgb2YgdGhlIEYvVyByZXNldCBIUkVHX1NXXzAsIGhlbmNlIGNoZWNraW5nIHRoaXMKKyoJcmVnaXN0ZXIgZm9yIEhDRl9NQUdJQyAodGhlIGNsYXNzaWNhbCBOSUMgcHJlc2VuY2UgdGVzdCkgd2hlbiBIQ0ZfQUNUX0lOVF9PRkYgaXMgY2FsbGVkIGR1ZSB0byBhbm90aGVyCisqCWNhcmQgaW50ZXJydXB0aW5nIHZpYSBhIHNoYXJlZCBJUlEgZHVyaW5nIGEgZG93bmxvYWQsIGZhaWxzLgorKjQ6CVRoZSBjb25zdHJ1Y3Rpb24gImlmICggaWZicC0+SUZCX0ludE9mZkNudC0tID09IDAgKSIgaXMgb3B0aW1hbCAoaW4gdGhlIHNlbnNlIG9mIHNob3J0ZXN0L3F1aWNrZXN0CisqCXBhdGggaW4gZXJyb3IgZnJlZSBmbG93cykgYnV0IE5PVCBmYWlsIHNhZmUgaW4gY2FzZSBvZiB0b28gbWFueSBJTlRfT04gaW52b2NhdGlvbnMgY29tcGFyZWQgdG8gSU5UX09GRikuCisqCUVuYWJsaW5nIG9mIHRoZSBpbnRlcnJ1cHRzIGlzIGFjaGlldmVkIGJ5IHdyaXRpbmcgdGhlIEhlcm1lcyBJbnRFbiByZWdpc3Rlci4KKyoJIC0gSWYgdGhlIEhDRiBpcyBpbiBEZWZ1bmN0IG1vZGUsIHRoZSBpbnRlcnJ1cHRzIHN0YXkgZGlzYWJsZWQuCisqCSAtIFVuZGVyICJub3JtYWwiIGNvbmRpdGlvbnMsIHRoZSBIQ0YgaXMgb25seSBpbnRlcmVzdGVkIGluIEluZm8gRXZlbnRzLCBSeCBFdmVudHMgYW5kIE5vdGlmeSBFdmVudHMuCisqCSAtIFdoZW4gdGhlIEhDRiBpcyBvdXQgb2YgVHgvTm90aWZ5IHJlc291cmNlcywgdGhlIEhDRiBpcyBhbHNvIGludGVyZXN0ZWQgaW4gQWxsb2MgRXZlbnRzLgorKgkgLSB2aWEgSENGX0VYVCwgdGhlIE1TRiBwcm9ncmFtbWVyIGNhbiBhbHNvIHJlcXVlc3QgSFJFR19FVl9USUNLIGFuZC9vciBIUkVHX0VWX1RYX0VYQyBpbnRlcnJ1cHRzLgorKglGb3IgRE1BIG9wZXJhdGlvbiwgdGhlIERNQSBoYXJkd2FyZSBoYW5kbGVzIHRoZSBhbGxvYyBldmVudHMuIFRoZSBETUEgZW5naW5lIHdpbGwgZ2VuZXJhdGUgYSAnVHhEbWFEb25lJworKglldmVudCBhcyBzb29uIGFzIGl0IGhhcyBwdW1wZWQgYSBmcmFtZSBmcm9tIGhvc3QgcmFtIGludG8gTklDLVJBTSAobm90ZSB0aGF0IHRoZSBmcmFtZSBkb2VzIG5vdCBoYXZlIHRvIGJlCisqCXRyYW5zbWl0dGVkIHRoZW4pLCBhbmQgYSAnUnhEbWFEb25lJyBldmVudCBhcyBzb29uIGFzIGEgcmVjZWl2ZWQgZnJhbWUgaGFzIGJlZW4gcHVtcGVkIGZyb20gTklDLVJBTSBpbnRvCisqCWhvc3QgcmFtLiAgTm90ZSB0aGF0IHRoZSAnYWxsb2MnIGV2ZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZXZlbnQtbWFzaywgYmVjYXVzZSB0aGUgRE1BIGVuZ2luZSB3aWxsCisqCXJlYWN0IHRvIGFuZCBhY2tub3dsZWRnZSB0aGlzIGV2ZW50LgorKjY6CWFjayB0aGUgIm9sZCIgUngtZXZlbnQuIFNlZSAiUnggQnVmZmVyIGZyZWUgc3RyYXRlZ3kiIGluIGhjZl9zZXJ2aWNlX25pYyBhYm92ZSBmb3IgbW9yZSBleHBsYW5hdGlvbi4KKyoJSUZCX1J4RklEIGFuZCBJRkJfUnhMZW4gbXVzdCBiZSBjbGVhcmVkIHRvIGJyaW5nIGJvdGggdGhlIGludGVybmFsIEhDRiBob3VzZSBrZWVwaW5nIGFuZCB0aGUgaW5mb3JtYXRpb24KKyoJc3VwcGxpZWQgdG8gdGhlIE1TRiBpbiB0aGUgc3RhdGUgIm5vIGZyYW1lIHJlY2VpdmVkIi4KKyo4OglUaGUgSENGX0FDVF9TQ0FOLCBIQ0ZfQUNUX1BSU19TQ0FOIGFuZCBIQ0ZfQUNUX1RBTExJRVMgYWN0aXZpdHkgYXJlIG1lcmdlZCBieSAiY2xldmVyIiBhbGdlYnJhaWMKKyoJbWFuaXB1bGF0aW9ucyBvZiB0aGUgUklELXZhbHVlcyBhbmQgYWN0aW9uIGNvZGVzLCBzbyBmb3JlZ29pbmcgcm9idXN0bmVzcyBhZ2FpbnN0IG1pZ3JhdGlvbiBwcm9ibGVtcyBmb3IKKyoJZWFzZSBvZiBpbXBsZW1lbnRhdGlvbi4gVGhlIGFzc3VtcHRpb25zIGFib3V0IG51bWVyaWNhbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gQ0ZHX1RBTExJRVMgZXRjIGFuZAorKglIQ0ZfQUNUX1RBTExJRVMgZXRjIGFyZSBjaGVja2VkIGJ5IHRoZSAiI2lmIiBzdGF0ZW1lbnRzIGp1c3QgcHJpb3IgdG8gdGhlIGJvZHkgb2YgdGhpcyByb3V0aW5lLCByZXN1bHRpbmcKKyoJaW46IGVyciAibWFpbnRlbmFuY2UiIGR1cmluZyBjb21waWxhdGlvbiBpZiB0aGUgYXNzdW1wdGlvbnMgYXJlIG5vIGxvbmdlciBtZXQuIFRoZSB3cml0aW5nIG9mIEhSRUdfUEFSQU1fMQorKgl3aXRoIDB4M0ZGRiBpbiBjYXNlIG9mIGFuIFBSUyBzY2FuLCBpcyBhIGtsdWRnZSB0byBnZXQgYXJvdW5kIGxhY2sgb2Ygc3BlY2lmaWNhdGlvbiwgaGVuY2UgZGlmZmVyZW50CisqCWltcGxlbWVudGF0aW9uIGluIEYvVyBhbmQgSG9zdC4KKyoJV2hlbiB0aGVyZSBpcyBubyBOSUMgUkFNIGF2YWlsYWJsZSwgc29tZSB2ZXJzaW9ucyBvZiB0aGUgSGVybWVzIEYvVyBkbyByZXBvcnQgMHg3RjAwIGFzIGVycm9yIGluIHRoZQorKglSZXN1bHQgZmllbGQgb2YgdGhlIFN0YXR1cyByZWdpc3RlciBhbmQgc29tZSBGL1cgdmVyc2lvbnMgZG9uJ3QuIFRvIG1hc2sgdGhpcyBkaWZmZXJlbmNlIHRvIHRoZSBNU0YgYWxsCisqCXJldHVybiBjb2RlcyBvZiB0aGUgSGVybWVzIGFyZSBpZ25vcmVkICgiYmVzdCIgYW5kICJtb3N0IHNpbXBsZSIgc29sdXRpb24gdG8gdGhlc2UgdHlwZXMgb2YgYW5hbG9taWVzIHdpdGgKKyoJYW4gYWNjZXB0YWJsZSBsb3NzIGR1ZSB0byBpZ25vcmluZyBhbGwgZXJyb3Igc2l0dWF0aW9ucyBhcyB3ZWxsKS4KKyoJVGhlICJObyBpbnF1aXJlIHNwYWNlIiBpcyByZXBvcnRlZCB2aWEgdGhlIEhlcm1lcyB0YWxsaWVzLgorKjMwOiBkbyBub3QgSENGQVNTRVJUKCByYywgcmMgKSBzaW5jZSByYyA9PSBIQ0ZfSU5UX1BFTkRJTkcgaXMgbm8gZXJyb3IKKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNSApID09IDAKKyNpZiBDRkdfU0NBTiAhPSBDRkdfVEFMTElFUyAtIEhDRl9BQ1RfVEFMTElFUyArIEhDRl9BQ1RfU0NBTgorZXJyOiAibWFpbnRlbmFuY2UiIGFwcGFyZW50bHkgaW52aW9sYXRlZCB0aGUgdW5kZXJseWluZyBhc3N1bXB0aW9uIGFib3V0IHRoZSBudW1lcmljYWwgdmFsdWVzIG9mIHRoZXNlIG1hY3JvcworI2VuZGlmCisjZW5kaWYgLy8gSENGX1RZUEVfSElJNQorI2lmIENGR19QUlNfU0NBTiAhPSBDRkdfVEFMTElFUyAtIEhDRl9BQ1RfVEFMTElFUyArIEhDRl9BQ1RfUFJTX1NDQU4KK2VycjogIm1haW50ZW5hbmNlIiBhcHBhcmVudGx5IGludmlvbGF0ZWQgdGhlIHVuZGVybHlpbmcgYXNzdW1wdGlvbiBhYm91dCB0aGUgbnVtZXJpY2FsIHZhbHVlcyBvZiB0aGVzZSBtYWNyb3MKKyNlbmRpZgoraW50CitoY2ZfYWN0aW9uKCBJRkJQIGlmYnAsIGhjZl8xNiBhY3Rpb24gKQoreworaW50CXJjID0gSENGX1NVQ0NFU1M7CisKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCisjaWYgSENGX0lOVF9PTgorCUhDRkxPR0VOVFJZKCBhY3Rpb24gPT0gSENGX0FDVF9JTlRfRk9SQ0VfT04gPyBIQ0ZfVFJBQ0VfQUNUSU9OX0tMVURHRSA6IEhDRl9UUkFDRV9BQ1RJT04sIGFjdGlvbiApCQkJCQkJCQkJCQkJCQkvKiAwICovCisjaWYgKEhDRl9TTEVFUCkKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZFIHx8IGFjdGlvbiA9PSBIQ0ZfQUNUX0lOVF9PRkYsCisJCQkgICBNRVJHRV8yKCBhY3Rpb24sIGlmYnAtPklGQl9JbnRPZmZDbnQgKSApCisjZWxzZQorCUhDRkFTU0VSVCggaWZicC0+SUZCX0ludE9mZkNudCAhPSAweEZGRkUsIGFjdGlvbiApCisjZW5kaWYgLy8gSENGX1NMRUVQCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250ICE9IDB4RkZGRiB8fAorCQkJICAgYWN0aW9uID09IEhDRl9BQ1RfSU5UX09GRiB8fCBhY3Rpb24gPT0gSENGX0FDVF9JTlRfRk9SQ0VfT04sICBhY3Rpb24gKQorCUhDRkFTU0VSVCggaWZicC0+SUZCX0ludE9mZkNudCA8PSAxNiB8fCBpZmJwLT5JRkJfSW50T2ZmQ250ID49IDB4RkZGRSwKKwkJCSAgIE1FUkdFXzIoIGFjdGlvbiwgaWZicC0+SUZCX0ludE9mZkNudCApICkJLy9uZXN0aW5nIG1vcmUgdGhhbiAxNiBkZWVwIHNlZW1zIHVucmVhc29uYWJsZQorI2VuZGlmIC8vIEhDRl9JTlRfT04KKworCXN3aXRjaCAoYWN0aW9uKSB7CisjaWYgSENGX0lOVF9PTgoraGNmXzE2CWk7CisJICBjYXNlIEhDRl9BQ1RfSU5UX09GRjoJCQkJCQkvLyBEaXNhYmxlIEludGVycnVwdCBnZW5lcmF0aW9uCisjaWYgSENGX1NMRUVQCisJCWlmICggaWZicC0+SUZCX0ludE9mZkNudCA9PSAweEZGRkUgKSB7CS8vIFdha2VVcCB0ZXN0CTs/dGllIHRoaXMgdG8gdGhlICJuZXciIHN1cGVyLUxpbmtTdGF0CisJCQlpZmJwLT5JRkJfSW50T2ZmQ250Kys7CQkJCQkJLy8gcmVzdG9yZSBjb252ZW50aW9uYWwgSS9GCisJCQlPUFcoSFJFR19JTywgSFJFR19JT19XQUtFVVBfQVNZTkMgKTsJCS8vIHNldCB3YWtldXAgYml0CisJCQlPUFcoSFJFR19JTywgSFJFR19JT19XQUtFVVBfQVNZTkMgKTsJCS8vIHNldCB3YWtldXAgYml0IHRvIGNvdW50ZXJhY3QgdGhlIGNsZWFyaW5nIGJ5IEYvVworCQkJLy8gODAwIHVzIGxhdGVuY3kgYmVmb3JlIEZXIHN3aXRjaGVzIHRvIGhpZ2ggcG93ZXIKKwkJCU1TRl9XQUlUKDgwMCk7CQkJCQkJCQkvLyBNU0YtZGVmaW5lZCBmdW5jdGlvbiB0byB3YWl0IG4gbWljcm9zZWNvbmRzLgorLy9PT1IJCWlmICggaWZicC0+SUZCX0RTTGlua1N0YXQgJiBDRkdfTElOS19TVEFUX0RTX09PUiApIHsgLy8gT3V0T2ZSYW5nZQorLy8JCQkJcHJpbnRrKCAiPDU+QUNUX0lOVF9PRkY6IERlZXBzbGVlcCBwaGFzZSB0ZXJtaW5hdGVkLCBlbmFibGUgYW5kIGdvIHRvIEF3YWl0Q29ubmVjdGlvblxuIiApOwkJLy87P3JlbW92ZSBtZSAxIGRheQorLy8JCQkJaGNmX2NudGwoIGlmYnAsIEhDRl9DTlRMX0VOQUJMRSApOworLy8JCQl9CisvLwkJCWlmYnAtPklGQl9EU0xpbmtTdGF0ICY9IH4oIENGR19MSU5LX1NUQVRfRFNfSVIgfCBDRkdfTElOS19TVEFUX0RTX09PUik7CS8vY2xlYXIgSVIvT09SIHN0YXRlCisJCX0KKyNlbmRpZiAvLyBIQ0ZfU0xFRVAKKy8qMiovCWlmYnAtPklGQl9JbnRPZmZDbnQrKzsKKy8vISAgICAgcmMgPSAwOworCQlpID0gSVBXKCBIUkVHX0lOVF9FTiApOworCQlPUFcoIEhSRUdfSU5UX0VOLCAwICk7CisJCWlmICggaSAmIDB4MTAwMCApIHsKKwkJCXJjID0gSENGX0VSUl9OT19OSUM7CisJCX0gZWxzZSB7CisJCQlpZiAoIGkgJiBJUFcoIEhSRUdfRVZfU1RBVCApICkgeworCQkJCXJjID0gSENGX0lOVF9QRU5ESU5HOworCQkJfQorCQl9CisJCWJyZWFrOworCisJICBjYXNlIEhDRl9BQ1RfSU5UX0ZPUkNFX09OOgkJCQkvLyBFbmZvcmNlIEVuYWJsZSBJbnRlcnJ1cHQgZ2VuZXJhdGlvbgorCQlpZmJwLT5JRkJfSW50T2ZmQ250ID0gMDsKKwkJLy9GYWxsIHRocm91Z2ggaW4gSENGX0FDVF9JTlRfT04KKworCSAgY2FzZSBIQ0ZfQUNUX0lOVF9PTjoJCQkJCQkvLyBFbmFibGUgSW50ZXJydXB0IGdlbmVyYXRpb24KKy8qNCovCWlmICggaWZicC0+SUZCX0ludE9mZkNudC0tID09IDAgJiYgaWZicC0+SUZCX0NhcmRTdGF0ID09IDAgKSB7CisJCQkJCQkJCQkJCQkvL2RldGVybWluZSBJbnRlcnJ1cHQgRXZlbnQgbWFzaworI2lmIEhDRl9ETUEKKwkJCWlmICggaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BICkgeworCQkJCWkgPSBIUkVHX0VWX0lORk8gfCBIUkVHX0VWX1JETUFEIHwgSFJFR19FVl9URE1BRCB8IEhSRUdfRVZfVFhfRVhUOwkvL21hc2sgd2hlbiBETUEgYWN0aXZlCisJCQl9IGVsc2UKKyNlbmRpZiAvLyBIQ0ZfRE1BCisJCQl7CisJCQkJaSA9IEhSRUdfRVZfSU5GTyB8IEhSRUdfRVZfUlggfCBIUkVHX0VWX1RYX0VYVDsJCQkJCQkvL21hc2sgd2hlbiBETUEgbm90IGFjdGl2ZQorCQkJCWlmICggaWZicC0+SUZCX1JzY0luZCA9PSAwICkgeworCQkJCQlpIHw9IEhSRUdfRVZfQUxMT0M7CQkJCQkJCQkJCQkJLy9tYXNrIHdoZW4gbm8gVHhGSUQgYXZhaWxhYmxlCisJCQkJfQorCQkJfQorI2lmIEhDRl9TTEVFUAorCQkJaWYgKCAoIElQVyhIUkVHX0VWX1NUQVQpICYgKCBpIHwgSFJFR19FVl9TTEVFUF9SRVEgKSApID09IEhSRUdfRVZfU0xFRVBfUkVRICkgeworCQkJCS8vIGZpcm13YXJlIGluZGljYXRlcyBpdCB3b3VsZCBsaWtlIHRvIGdvIGludG8gc2xlZXAgbW9kdXMKKwkJCQkvLyBvbmx5IGFja25vd2xlZGdlIHRoaXMgcmVxdWVzdCBpZiBubyBvdGhlciBldmVudHMgdGhhdCBjYW4gY2F1c2UgYW4gaW50ZXJydXB0IGFyZSBwZW5kaW5nCisJCQkJaWZicC0+SUZCX0ludE9mZkNudC0tOwkJCS8vYmVjb21lcyAweEZGRkUKKyAgICAgICAgICAgIAlPUFcoIEhSRUdfSU5UX0VOLCBpIHwgSFJFR19FVl9USUNLICk7CisJCQkJT1BXKCBIUkVHX0VWX0FDSywgSFJFR19FVl9TTEVFUF9SRVEgfCBIUkVHX0VWX1RJQ0sgfCBIUkVHX0VWX0FDS19SRUdfUkVBRFkgKTsKKwkJCX0gZWxzZQorI2VuZGlmIC8vIEhDRl9TTEVFUAorCQkJeworICAgICAgICAgICAgCU9QVyggSFJFR19JTlRfRU4sIGkgfCBIUkVHX0VWX1NMRUVQX1JFUSApOworCQkJfQorCQl9CisJCWJyZWFrOworI2VuZGlmIC8vIEhDRl9JTlRfT04KKworI2lmIChIQ0ZfU0xFRVApICYgSENGX0REUworCSAgY2FzZSBIQ0ZfQUNUX1NMRUVQOgkJCQkJCS8vIEREUyBTbGVlcCByZXF1ZXN0CisJCWhjZl9jbnRsKCBpZmJwLCBIQ0ZfQ05UTF9ESVNBQkxFICk7CisJCWNtZF9leGUoIGlmYnAsIEhDTURfU0xFRVAsIDAgKTsKKwkJYnJlYWs7CisvLyAJICBjYXNlIEhDRl9BQ1RfV0FLRVVQOgkJCQkJCS8vIEREUyBXYWtldXAgcmVxdWVzdAorLy8gCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgPT0gMHhGRkZFLCBpZmJwLT5JRkJfSW50T2ZmQ250ICkKKy8vIAkJaWZicC0+SUZCX0ludE9mZkNudCsrOwkJCQkJLy8gcmVzdG9yZSBjb252ZW50aW9uYWwgSS9GCisvLyAJCU9QVyggSFJFR19JTywgSFJFR19JT19XQUtFVVBfQVNZTkMgKTsKKy8vIAkJTVNGX1dBSVQoODAwKTsJCQkJCQkJLy8gTVNGLWRlZmluZWQgZnVuY3Rpb24gdG8gd2FpdCBuIG1pY3Jvc2Vjb25kcy4KKy8vIAkJcmMgPSBoY2ZfYWN0aW9uKCBpZmJwLCBIQ0ZfQUNUX0lOVF9PRkYgKTsJLypib2d1cywgSUZCX0ludE9mZkNudCA9PSAweEZGRkYsIHNvIGlmIHlvdSBjYXJlZnVsbHkgbG9vaworLy8gCQkJCQkJCQkJCQkJCSAqYXQgdGhlICNpZiBIQ0ZfRERTIHN0YXRlbWVudHMsIEhDRl9BQ1RfSU5UX09GRiBpcyBlbXB0eQorLy8gCQkJCQkJCQkJCQkJCSAqZm9yIEREUy4gIk11Y2giIGJldHRlciB3b3VsZCBiZSB0byBtZXJnZSB0aGUgZmxvd3MgZm9yCisvLyAJCQkJCQkJCQkJCQkJICpERFMgYW5kIERFRVBfU0xFRVAKKy8vIAkJCQkJCQkJCQkJCQkgKi8KKy8vIAkJYnJlYWs7CisjZW5kaWYgLy8gSENGX0REUworCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAorCSAgY2FzZSBIQ0ZfQUNUX0NDWF9PTjoJCQkJCQkvLyBlbmFibGUgQ0tJUAorCSAgY2FzZSBIQ0ZfQUNUX0NDWF9PRkY6CQkJCQkJLy8gZGlzYWJsZSBDS0lQCisJCWlmYnAtPklGQl9DS0lQU3RhdCA9IGFjdGlvbjsKKwkJYnJlYWs7CisjZW5kaWYgLy8gSENGX1RZUEVfQ0NYCisKKwkgIGNhc2UgSENGX0FDVF9SWF9BQ0s6CQkJCQkJLy9SZWNlaXZlciBBQ0sKKy8qNiovCWlmICggaWZicC0+SUZCX1J4RklEICkgeworCQkJREFXQV9BQ0soIEhSRUdfRVZfUlggKTsKKwkJfQorCQlpZmJwLT5JRkJfUnhGSUQgPSBpZmJwLT5JRkJfUnhMZW4gPSAwOworCQlicmVhazsKKworLyo4Ki8gY2FzZQlIQ0ZfQUNUX1BSU19TQ0FOOgkJCQkJLy8gSGVybWVzIFBSUyBTY2FuIChGMTAyKQorCQlPUFcoIEhSRUdfUEFSQU1fMSwgMHgzRkZGICk7CisJCQkvL0ZhbGwgdGhyb3VnaCBpbiBIQ0ZfQUNUX1RBTExJRVMKKwkgIGNhc2UgSENGX0FDVF9UQUxMSUVTOgkJCQkJCS8vIEhlcm1lcyBJbnF1aXJlIFRhbGxpZXMgKEYxMDApCisjaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNSApID09IDAKKwkgIGNhc2UgSENGX0FDVF9TQ0FOOgkJCQkJCS8vIEhlcm1lcyBJbnF1aXJlIFNjYW4gKEYxMDEpCisjZW5kaWYgLy8gSENGX1RZUEVfSElJNQorCQkvKiEhIHRoZSBhc3N1bXB0aW9ucyBhYm91dCBudW1lcmljYWwgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIENGR19UQUxMSUVTIGV0YyBhbmQgSENGX0FDVF9UQUxMSUVTIGV0YworCQkgKiAgIGFyZSBjaGVja2VkIGJ5ICNpZiBzdGF0ZW1lbnRzIGp1c3QgcHJpb3IgdG8gdGhpcyByb3V0aW5lIHJlc3VsdGluZyBpbjogZXJyICJtYWludGVuYW5jZSIJKi8KKwkJY21kX2V4ZSggaWZicCwgSENNRF9JTlFVSVJFLCBhY3Rpb24gLSBIQ0ZfQUNUX1RBTExJRVMgKyBDRkdfVEFMTElFUyApOworCQlicmVhazsKKworCSAgZGVmYXVsdDoKKwkJSENGQVNTRVJUKCBET19BU1NFUlQsIGFjdGlvbiApCisJCWJyZWFrOworCX0KKwkvLyEgZG8gbm90IEhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICkJCQkJCQkJCQkJCQkJCS8qIDMwKi8KKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfQUNUSU9OICkKKwlyZXR1cm4gcmM7Cit9IC8vIGhjZl9hY3Rpb24KKyNlbmRpZiAvLyBIQ0ZfRExfT05MWQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouTU9EVUxFCQlpbnQgaGNmX2NudGwoIElGQlAgaWZicCwgaGNmXzE2IGNtZCApCisqLlBVUlBPU0UJCUNvbm5lY3Qgb3IgZGlzY29ubmVjdCBhIHNwZWNpZmljIHBvcnQgdG8gYSBzcGVjaWZpYyBuZXR3b3JrLgorKiEhICA7Pz8/Pz8/Pz8/Pz8/Pz8/PyBjb250aW51ZSBuZWVkcyBtb3JlIGV4cGxhbmF0aW9uCisqCQkJCXJlY292ZXJzIGJ5IG1lYW5zIG9mICJjb250aW51ZSIgd2hlbiB0aGUgY29ubmVjdCBwcm9jZXMgaW4gQ0NYIG1vZGUgZmFpbHMKKyoJCQkJRW5hYmxlcyBvciBkaXNhYmxlcyBkYXRhIHRyYW5zbWlzc2lvbiBhbmQgcmVjZXB0aW9uIGZvciB0aGUgTklDLgorKgkJCQlBY3RpdmF0ZXMgc3RhdGljIE5JQyBjb25maWd1cmF0aW9uIGZvciBhIHNwZWNpZmljIHBvcnQgYXQgY29ubmVjdC4KKyoJCQkJQWN0aXZhdGVzIHN0YXRpYyBjb25maWd1cmF0aW9uIGZvciBhbGwgcG9ydHMgYXQgZW5hYmxlLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCWNtZAkJCTB4MDAxRjoJSGVybWVzIGNvbW1hbmQgKGRpc2FibGUsIGVuYWJsZSwgY29ubmVjdCwgZGlzY29ubmVjdCwgY29udGludWUpCisqCQkJCQlIQ0ZfQ05UTF9FTkFCTEUJCUVuYWJsZQorKgkJCQkJSENGX0NOVExfRElTQUJMRSAgICBEaXNhYmxlCisqCQkJCQlIQ0ZfQ05UTF9DT05USU5VRQlDb250aW51ZQorKgkJCQkJSENGX0NOVExfQ09OTkVDVCAgICBDb25uZWN0CisqCQkJCQlIQ0ZfQ05UTF9ESVNDT05ORUNUIERpc2Nvbm5lY3QKKyoJCQkJMHgwMTAwOiBjb21tYW5kIHF1YWxpZmllciAoY29udGludWUpCisqCQkJCQlIQ01EX1JFVFJZCQkJcmV0cnkgZmxhZworKgkJCQkweDA3MDA6ICBwb3J0IG51bWJlciAoY29ubmVjdC9kaXNjb25uZWN0KQorKgkJCQkJSENGX1BPUlRfMCAgICAgICAgICBNQUMgUG9ydCAwCisqCQkJCQlIQ0ZfUE9SVF8xICAgICAgICAgIE1BQyBQb3J0IDEKKyoJCQkJCUhDRl9QT1JUXzIgICAgICAgICAgTUFDIFBvcnQgMgorKgkJCQkJSENGX1BPUlRfMyAgICAgICAgICBNQUMgUG9ydCAzCisqCQkJCQlIQ0ZfUE9SVF80ICAgICAgICAgIE1BQyBQb3J0IDQKKyoJCQkJCUhDRl9QT1JUXzUgICAgICAgICAgTUFDIFBvcnQgNQorKgkJCQkJSENGX1BPUlRfNiAgICAgICAgICBNQUMgUG9ydCA2CisqCisqLlJFVFVSTlMKKyoJSENGX1NVQ0NFU1MKKyohIQl2aWEgY21kX2V4ZQorKglIQ0ZfRVJSX05PX05JQworKglIQ0ZfRVJSX0RFRlVOQ1RfLi4uCisqCUhDRl9FUlJfVElNRV9PVVQKKyoKKyouREVTQ1JJUFRJT04KKyogVGhlIHBhcmFtZXRlciBjbWQgY29udGFpbnMgYSBudW1iZXIgb2Ygc3ViZmllbGRzLgorKiBUaGUgYWN0dWFsIHZhbHVlIGZvciBjbWQgaXMgY3JlYXRlZCBieSBsb2dpY2FsIG9yLWluZyB0aGUgYXBwcm9wcmlhdGUgbW5lbW9uaWNzIGZvciB0aGUgc3ViZmllbGRzLgorKiBUaGUgZmllbGQgMHgwMDFGIGNvbnRhaW5zIHRoZSBjb21tYW5kIGNvZGUKKyogIC0gSENGX0NOVExfRU5BQkxFCisqICAtIEhDRl9DTlRMX0RJU0FCTEUKKyogIC0gSENGX0NOVExfQ09OTkVDVAorKiAgLSBIQ0ZfQ05UTF9ESVNDT05ORUNUCisqICAtIEhDRl9DTlRMX0NPTlRJTlVFCisqCisqIEZvciBIQ0ZfQ05UTF9DT05USU5VRSwgdGhlIGZpZWxkIDB4MDEwMCBjb250YWlucyB0aGUgcmV0cnkgZmxhZyBIQ01EX1JFVFJZLgorKiBGb3IgSENGX0NOVExfQ09OTkVDVCBhbmQgSENGX0NOVExfRElTQ09OTkVDVCwgdGhlIGZpZWxkIDB4MDcwMCBjb250YWlucyB0aGUgcG9ydCBudW1iZXIgYXMgSENGX1BPUlRfIy4KKyogRm9yIFN0YXRpb24gYXMgd2VsbCBhcyBBY2Nlc3NQb2ludCBGL1csIE1BQyBQb3J0IDAgaXMgdGhlICJub3JtYWwiIGNvbW11bmljYXRpb24gY2hhbm5lbC4KKyogRm9yIEFjY2Vzc1BvaW50IEYvVywgTUFDIFBvcnQgMSB0aHJvdWdoIDYgY29udHJvbCB0aGUgV0RTIGxpbmtzLgorKgorKiBOb3RlIHRoYXQgZGVzcGl0ZSB0aGUgbmFtZXMgSENGX0NOVExfRElTQUJMRSBhbmQgSENGX0NOVExfRU5BQkxFLCBoY2ZfY250bCBkb2VzIG5vdCBpbmZsdWVuY2UgdGhlIE5JQworKiBJbnRlcnJ1cHRzIG1vZGUuCisqCisqIFRoZSBDb25uZWN0IGlzIHVzZWQgYnkgdGhlIE1TRiB0byBicmluZyBhIHBhcnRpY3VsYXIgcG9ydCBpbiBhbiBpbmFjdGl2ZSBzdGF0ZSBhcyBmYXIgYXMgZGF0YSB0cmFuc21pc3Npb24KKyogYW5kIHJlY2VwdGlvbiBhcmUgY29uY2VybmVkLgorKiBXaGVuIGEgcGFydGljdWxhciBwb3J0IGlzIGRpc2Nvbm5lY3RlZDoKKyogLSB0aGUgRi9XIGRpc2FibGVzIHRoZSByZWNlaXZlciBmb3IgdGhhdCBwb3J0LgorKiAtIHRoZSBGL1cgaWdub3JlcyBzZW5kIGNvbW1hbmRzIGZvciB0aGF0IHBvcnQuCisqIC0gYWxsIGZyYW1lcyAoUmVjZWl2ZSBhcyB3ZWxsIGFzIHBlbmRpbmcgVHJhbnNtaXQpIGZvciB0aGF0IHBvcnQgb24gdGhlIE5JQyBhcmUgZGlzY2FyZGVkLgorKgorKiBXaGVuIHRoZSBOSUMgaXMgZGlzYWJsZWQsIGFib3ZlIGxpc3QgYXBwbGllcyB0byBhbGwgcG9ydHMsIGkuZS4gdGhlIHJlc3VsdCBpcyBsaWtlIGFsbCBwb3J0cyBhcmUKKyogZGlzY29ubmVjdGVkLgorKgorKiBXaGVuIGEgcGFydGljdWxhciBwb3J0IGlzIGNvbm5lY3RlZDoKKyogLSB0aGUgRi9XIGVmZmVjdHVhdGVzIHRoZSBzdGF0aWMgY29uZmlndXJhdGlvbiBmb3IgdGhhdCBwb3J0LgorKiAtIGVuYWJsZXMgdGhlIHJlY2VpdmVyIGZvciB0aGF0IHBvcnQuCisqIC0gYWNjZXB0cyBzZW5kIGNvbW1hbmRzIGZvciB0aGF0IHBvcnQuCisqCisqIEVuYWJsaW5nIGhhcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6CisqIC0gdGhlIEYvVyBlZmZlY3R1YXRlcyB0aGUgc3RhdGljIGNvbmZpZ3VyYXRpb24gZm9yIGFsbCBwb3J0cy4KKyoJVGhlIEYvVyBvbmx5IHVwZGF0ZXMgaXRzIHN0YXRpYyBjb25maWd1cmF0aW9uIGF0IGEgdHJhbnNpdGlvbiBmcm9tIGRpc2FibGVkIHRvIGVuYWJsZWQgb3IgZnJvbQorKglkaXNjb25uZWN0ZWQgdG8gY29ubmVjdGVkLgorKglJbiBvcmRlciB0byBlbmZvcmNlIHRoZSBzdGF0aWMgY29uZmlndXJhdGlvbiwgdGhlIE1TRiBtdXN0IGFzc3VyZSB0aGF0IHN1Y2ggYSB0cmFuc2l0aW9uIHRha2VzIHBsYWNlLgorKglEdWUgdG8gc3VjaCBhIGRpc2FibGUvZW5hYmxlIG9yIGRpc2Nvbm5lY3QvY29ubmVjdCBzZXF1ZW5jZSwgUngvVHggZnJhbWVzIG1heSBiZSBsb3N0LCBpbiBvdGhlciB3b3JkcywKKyoJY29uZmlndXJhdGlvbiBtYXkgaW1wYWN0IGNvbW11bmljYXRpb24uCisqIC0gVGhlIERNQSBFbmdpbmUgKGlmIGFwcGxpY2FibGUpIGlzIGVuYWJsZWQuCisqIE5vdGUgdGhhdCB0aGUgRW5hYmxlIEZ1bmN0aW9uIGJ5IGl0c2VsZiBvbmx5IGVuYWJsZXMgZGF0YSB0cmFuc21pc3Npb24gYW5kIHJlY2VwdGlvbiwgaXQKKyogZG9lcyBub3QgZW5hYmxlIHRoZSBJbnRlcnJ1cHQgR2VuZXJhdGlvbiBtZWNoYW5pc20uIFRoaXMgaXMgZG9uZSBieSBoY2ZfYWN0aW9uLgorKgorKiBEaXNhYmxpbmcgaGFzIHRoZSBmb2xsb3dpbmcgZWZmZWN0czoKKyohISAgOz8/Pz8/aXMgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgcmVhbGx5IHRydWUKKyogLSBpdCBhY3RzIGFzIGEgZGlzY29ubmVjdCBvbiBhbGwgcG9ydHMuCisqIC0gVGhlIERNQSBFbmdpbmUgKGlmIGFwcGxpY2FibGUpIGlzIGRpc2FibGVkLgorKgorKiBGb3IgaW1wYWN0IG9mIHRoZSBkaXNhYmxlIGNvbW1hbmQgb24gdGhlIGJlaGF2aW9yIG9mIGhjZl9kbWFfdHgvcnhfZ2V0IHNlZSB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbnMuCisqCisqIEFsdGhvdWdoIHRoZSBFbmFibGUvRGlzYWJsZSBhbmQgQ29ubmVjdC9EaXNjb25uZWN0IGFyZSBhbnRvbnltcywgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gb24gdGhlaXIgc2VxdWVuY2luZywKKyogaW4gb3RoZXIgd29yZHMsIHRoZXkgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBpbiBhcmJpdHJhcnkgc2VxdWVuY2Ugd2l0aG91dCBiZWluZyBwYWlyZWQgb3IgYmFsYW5jZWQuCisqIEVhY2ggdGltZSBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zIGlzIGNhbGxlZCwgdGhlIGVmZmVjdHMgb2YgdGhlIHByZWNlZGluZyBjYWxscyBjZWFzZS4KKyoKKyogQXNzZXJ0IGZhaWxzIGlmCisqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgorKiAtIE5JQyBpbnRlcnJ1cHRzIGFyZSBub3QgZGlzYWJsZWQuCisqIC0gQSBjb21tYW5kIG90aGVyIHRoYW4gQ29udGludWUsIEVuYWJsZSwgRGlzYWJsZSwgQ29ubmVjdCBvciBEaXNjb25uZWN0IGlzIGdpdmVuLgorKiAtIEFuIGludmFsaWQgY29tYmluYXRpb24gb2YgdGhlIHN1YmZpZWxkcyBpcyBnaXZlbiBvciBhIGJpdCBvdXRzaWRlIHRoZSBzdWJmaWVsZHMgaXMgZ2l2ZW4uCisqIC0gYW55IHJldHVybiBjb2RlIGJlc2lkZXMgSENGX1NVQ0NFU1MuCisqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBhIGhjZl9mdW5jdGlvbiB3aXRob3V0IGFkZXF1YXRlIHByb3RlY3Rpb24gYWdhaW5zdCBOSUMgaW50ZXJydXB0cyBvcgorKgltdWx0aS10aHJlYWRpbmcKKyoKKyouRElBR1JBTQorKgloY2ZfY250bCB0YWtlcyBzdWNjZXNzaXZlbHkgdGhlIGZvbGxvd2luZyBhY3Rpb25zOgorKjI6CUlmIHRoZSBIQ0YgaXMgaW4gRGVmdW5jdCBtb2RlIG9yIGluY29tcGF0aWJsZSB3aXRoIHRoZSBQcmltYXJ5IG9yIFN0YXRpb24gU3VwcGxpZXIgaW4gdGhlIEhlcm1lcywKKyoJaGNmX2NudGwoKSByZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGggSENGX0VSUl9OT19OSUM7PyBhcyBzdGF0dXMuCisqODoJd2hlbiB0aGUgcG9ydCBpcyBkaXNhYmxlZCwgdGhlIERNQSBlbmdpbmUgbmVlZHMgdG8gYmUgZGUtYWN0aXZhdGVkLCBzbyB0aGUgaG9zdCBjYW4gc2FmZWx5IHJlY2xhaW0gdHgKKyoJcGFja2V0cyBmcm9tIHRoZSB0eCBkZXNjcmlwdG9yIGNoYWluLgorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAoraGNmX2NudGwoIElGQlAgaWZicCwgaGNmXzE2IGNtZCApCit7CitpbnQJcmMgPSBIQ0ZfRVJSX0lOQ09NUF9GVzsKKyNpZiBIQ0ZfQVNTRVJUCit7CWludCB4ID0gY21kICYgSENNRF9DTURfQ09ERTsKKwlpZiAoIHggPT0gSENGX0NOVExfQ09OVElOVUUgKSB4ICY9IH5IQ01EX1JFVFJZOworCWVsc2UgaWYgKCAoeCA9PSBIQ01EX0RJU0FCTEUgfHwgeCA9PSBIQ01EX0VOQUJMRSkgJiYgaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCA9PSBDT01QX0lEX0ZXX0FQICkgeworCQl4ICY9IH5IRlNfVFhfQ05UTF9QT1JUOworCX0KKwlIQ0ZBU1NFUlQoIHg9PUhDRl9DTlRMX0VOQUJMRSAgfHwgeD09SENGX0NOVExfRElTQUJMRSAgICB8fCBIQ0ZfQ05UTF9DT05USU5VRSB8fAorCQkJICAgeD09SENGX0NOVExfQ09OTkVDVCB8fCB4PT1IQ0ZfQ05UTF9ESVNDT05ORUNULCBjbWQgKQorfQorI2VuZGlmIC8vIEhDRl9BU1NFUlQKKy8vICNpZiAoSENGX1NMRUVQKSAmIEhDRl9ERFMKKy8vIAlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZFLCBjbWQgKQorLy8gI2VuZGlmIC8vIEhDRl9ERFMKKwlIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0NOVEwsIGNtZCApCisJaWYgKCBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCApIHsJCQkJCQkJCQkJCQkJCQkJIC8qMiovCisvKjYqLwlyYyA9IGNtZF9leGUoIGlmYnAsIGNtZCwgMCApOworI2lmIChIQ0ZfU0xFRVApICYgSENGX0REUworCQlpZmJwLT5JRkJfVGlja0NudCA9IDA7CQkJCS8vc3RhcnQgMiBzZWNvbmQgcGVyaW9kICh3aXRoIDEgdGljayB1bmNlcnRhbnR5KQorI2VuZGlmIC8vIEhDRl9ERFMKKwl9CisjaWYgSENGX0RNQQorCS8vIXJsYXYgOiBub3RlIHRoYXQgdGhpcyBwaWVjZSBvZiBjb2RlIGlzIGFsd2F5cyBleGVjdXRlZCwgcmVnYXJkbGVzcyBvZiB0aGUgREVGVU5DVCBiaXQgaW4gSUZCX0NhcmRTdGF0LgorCS8vIFRoZSByZWFzb24gYmVoaW5kIHRoaXMgaXMgdGhhdCB0aGUgTVNGIHNob3VsZCBiZSBhYmxlIHRvIGdldCBhbGwgaXRzIERNQSByZXNvdXJjZXMgYmFjayBmcm9tIHRoZSBIQ0YsCisJLy8gZXZlbiBpZiB0aGUgaGFyZHdhcmUgaXMgZGlzZnVuY3Rpb25hbC4gUHJhY3RpY2FsIGV4YW1wbGUgdW5kZXIgV2luZG93cyA6IHN1cnByaXNlIHJlbW92YWwuCisJaWYgKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEgKSB7CisJCWhjZl9pbyBpb19wb3J0ID0gaWZicC0+SUZCX0lPQmFzZTsKKwkJREVTQ19TVFJDVCAqcDsKKwkJaWYgKCBjbWQgPT0gSENGX0NOVExfRElTQUJMRSB8fCBjbWQgPT0gSENGX0NOVExfRU5BQkxFICkgeworCQkJT1VUX1BPUlRfRFdPUkQoIChpb19wb3J0ICsgSFJFR19ETUFfQ1RSTCksIERNQV9DVFJMU1RBVF9SRVNFVCk7CQkJCQkJLyo4Ki8KKwkJCWlmYnAtPklGQl9DbnRsT3B0ICY9IH5ETUFfRU5BQkxFRDsKKwkJfQorCQlpZiAoIGNtZCA9PSBIQ0ZfQ05UTF9FTkFCTEUgKSB7CisJCQlPVVRfUE9SVF9EV09SRCggKGlvX3BvcnQgKyBIUkVHX0RNQV9DVFJMKSwgRE1BX0NUUkxTVEFUX0dPKTsKKwkJCS8qIDs/IGJ5IHJld3JpdGluZyBoY2ZfZG1hX3J4X3B1dCB5b3UgY2FuIHByb2JhYmx5IGp1c3QgY2FsbCBoY2ZfZG1hX3J4X3B1dCggaWZicC0+SUZCX0ZpcnN0RGVzY1tETUFfUlhdICkKKwkJCSAqIGFzIGFkZGl0aW9uYWwgYmVuZWZpY2lhcnkgc2lkZSBlZmZlY3QsIHRoZSBTT1AgYW5kIEVPUCBiaXRzIHdpbGwgYWxzbyBiZSBjbGVhcmVkCisJCQkgKi8KKwkJCWlmYnAtPklGQl9DbnRsT3B0IHw9IERNQV9FTkFCTEVEOworCQkJSENGQVNTRVJUKCBOVF9BU1NFUlQsIE5FVkVSX1RFU1RFRCApCisJCQkvLyBtYWtlIHRoZSBlbnRpcmUgcnggZGVzY3JpcHRvciBjaGFpbiBETUEtb3duZWQsIHNvIHRoZSBETUEgZW5naW5lIGNhbiAocmUtKXVzZSBpdC4KKwkJCWlmICggKCBwID0gaWZicC0+SUZCX0ZpcnN0RGVzY1tETUFfUlhdICkgIT0gTlVMTCApIHsgICAvLzs/IFRoaW5rIHRoaXMgb3ZlciBhZ2FpbiBpbiB0aGUgbGlnaHQgb2YgdGhlIG5ldyBjaGFpbmluZyBzdHJhdGVneQorCQkJCWlmICggMSApIAl7IC8vYmVnaW4gYWx0ZXJuYXRpdmUKKwkJCQkJSENGQVNTRVJUKCBOVF9BU1NFUlQsIE5FVkVSX1RFU1RFRCApCisJCQkJCXB1dF9mcmFtZV9sc3QoIGlmYnAsIGlmYnAtPklGQl9GaXJzdERlc2NbRE1BX1JYXSwgRE1BX1JYICk7CisJCQkJCWlmICggaWZicC0+SUZCX0ZpcnN0RGVzY1tETUFfUlhdICkgeworCQkJCQkJcHV0X2ZyYW1lX2xzdCggaWZicCwgaWZicC0+SUZCX0ZpcnN0RGVzY1tETUFfUlhdLT5uZXh0X2Rlc2NfYWRkciwgRE1BX1JYICk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl3aGlsZSAoIHAgKSB7CisJCQkJCQkvL3AtPmJ1Zl9jbnRsLmNudGxfc3RhdCB8PSBERVNDX0RNQV9PV05FRDsKKwkJCQkJCXAtPkJVRl9DTlQgfD0gREVTQ19ETUFfT1dORUQ7CisJCQkJCQlwID0gcC0+bmV4dF9kZXNjX2FkZHI7CisJCQkJCX0KKwkJCQkJLy8gYSByeCBjaGFpbiBpcyBhdmFpbGFibGUgc28gaGFuZCBpdCBvdmVyIHRvIHRoZSBETUEgZW5naW5lCisJCQkJCXAgPSBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF07CisJCQkJCU9VVF9QT1JUX0RXT1JEKCAoaW9fcG9ydCArIEhSRUdfUlhETUFfUFRSMzIpLCBwLT5kZXNjX3BoeXNfYWRkcik7CisJCQkJfSAgLy9lbmQgYWx0ZXJuYXRpdmUKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBIQ0ZfRE1BCisJSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQorCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9DTlRMICkKKwlyZXR1cm4gcmM7Cit9IC8vIGhjZl9jbnRsCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5NT0RVTEUJCWludCBoY2ZfY29ubmVjdCggSUZCUCBpZmJwLCBoY2ZfaW8gaW9fYmFzZSApCisqLlBVUlBPU0UJCUdyYW50cyBhY2Nlc3MgcmlnaHQgZm9yIHRoZSBIQ0YgdG8gdGhlIElGQi4KKyoJCQkJSW5pdGlhbGl6ZXMgQ2FyZCBhbmQgSENGIGhvdXNla2VlcGluZy4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCShuZWFyKSBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoJaW9fYmFzZQkJbm9uLVVTQjogSS9PIEJhc2UgYWRkcmVzcyBvZiB0aGUgTklDIChjb25uZWN0KQorKgkJCQlub24tVVNCOiBIQ0ZfRElTQ09OTkVDVAorKgkJCQlVU0I6CSBIQ0ZfQ09OTkVDVCwgSENGX0RJU0NPTk5FQ1QKKyoKKyouUkVUVVJOUworKglIQ0ZfU1VDQ0VTUworKglIQ0ZfRVJSX0lOQ09NUF9QUkkKKyoJSENGX0VSUl9JTkNPTVBfRlcKKyoJSENGX0VSUl9ERUZVTkNUX0NNRF9TRVEKKyohIQlIQ0ZfRVJSX05PX05JQyByZWFsbHkgcmV0dXJuZWQgOz8KKyoJSENGX0VSUl9OT19OSUMKKyoJSENGX0VSUl9USU1FX09VVAorKgorKglNU0YtYWNjZXNzaWJsZSBmaWVsZHMgb2YgUmVzdWx0IEJsb2NrOgorKglJRkJfSU9CYXNlCQkJCWVudHJ5IHBhcmFtZXRlciBpb19iYXNlCisqCUlGQl9JT1JhbmdlCQkJCUhSRUdfSU9fUkFOR0UgKDB4NDAvMHg4MCkKKyoJSUZCX1ZlcnNpb24JCQkJdmVyc2lvbiBvZiB0aGUgSUZCIGxheW91dAorKglJRkJfRldJZGVudGl0eQkJCUNGR19GV19JREVOVElUWV9TVFJDVCwgc3BlY2lmaWVzIHRoZSBpZGVudGl0eSBvZiB0aGUKKyoJCQkJCQkJInJ1bm5pbmciIEYvVywgaS5lLiB0ZXJ0aWFyeSBGL1cgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMKKyoJSUZCX0ZXU3VwCQkJCUNGR19TVVBfUkFOR0VfU1RSQ1QsIHNwZWNpZmllcyB0aGUgc3VwcGxpZXIgcmFuZ2Ugb2YKKyoJCQkJCQkJdGhlICJydW5uaW5nIiBGL1csIGkuZS4gdGVydGlhcnkgRi9XIHVuZGVyIG5vcm1hbCBjb25kaXRpb25zCisqCUlGQl9IU0lTdXAJCQkJQ0ZHX1NVUF9SQU5HRV9TVFJDVCwgc3BlY2lmaWVzIHRoZSBIVy9TVyBJL0YgcmFuZ2Ugb2YgdGhlIE5JQworKglJRkJfUFJJSWRlbnRpdHkJCQlDRkdfUFJJX0lERU5USVRZX1NUUkNULCBzcGVjaWZpZXMgdGhlIElkZW50aXR5IG9mIHRoZSBQcmltYXJ5IEYvVworKglJRkJfUFJJU3VwCQkJCUNGR19TVVBfUkFOR0VfU1RSQ1QsIHNwZWNpZmllcyB0aGUgc3VwcGxpZXIgcmFuZ2Ugb2YgdGhlIFByaW1hcnkgRi9XCisqCWFsbCBvdGhlcgkJCQlhbGwgTVNGIGFjY2Vzc2libGUgZmllbGRzLCB3aGljaCBhcmUgbm90IHNwZWNpZmllZCBhYm92ZSwgYXJlIHplcm8tZmlsbGVkCisqCisqLkNPTkRJVElPTlMKKyogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBNU0YgdG8gYXNzdXJlIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgSS9PIEJhc2UgYWRkcmVzcy4KKyoKKyogTm90ZTogaGNmX2Nvbm5lY3QgZGVmYXVsdHMgdG8gTklDIGludGVycnVwdCBkaXNhYmxlZCBtb2RlLCBpLmUuIGFzIGlmIGhjZl9hY3Rpb24oIEhDRl9BQ1RfSU5UX09GRiApCisqIHdhcyBjYWxsZWQuCisqCisqLkRFU0NSSVBUSU9OCisqIGhjZl9jb25uZWN0IHBhc3NlcyB0aGUgTVNGLWRlZmluZWQgbG9jYXRpb24gb2YgdGhlIElGQiB0byB0aGUgSENGIGFuZCBncmFudHMgb3IgcmV2b2tlcyBhY2Nlc3MgcmlnaHQgZm9yIHRoZQorKiBIQ0YgdG8gdGhlIElGQi4gUmV2b2tpbmcgaXMgZG9uZSBieSBzcGVjaWZ5aW5nIEhDRl9ESVNDT05ORUNUIHJhdGhlciB0aGFuIGFuIEkvTyBhZGRyZXNzIGZvciB0aGUgcGFyYW1ldGVyCisqIGlvX2Jhc2UuICBFdmVyeSBjYWxsIG9mIGhjZl9jb25uZWN0IGluICJjb25uZWN0IiBtb2RlLCBtdXN0IGV2ZW50dWFsbHkgYmUgZm9sbG93ZWQgYnkgYSBjYWxsIG9mIGhjZl9jb25uZWN0CisqIGluICJkaXNjb25uZWN0IiBtb2RlLiBDbGFsbGluZyBoY2ZfY29ubmVjdCBpbiAiY29ubmVjdCIvImRpc2Nvbm5lY3QiIG1vZGUgY2FuIG5vdCBiZSBuZXN0ZWQuCisqIFRoZSBJRkIgYWRkcmVzcyBtdXN0IGJlIHVzZWQgYXMgYSBoYW5kbGUgd2l0aCBhbGwgc3Vic2VxdWVudCBIQ0YtZnVuY3Rpb24gY2FsbHMgYW5kIHRoZSBIQ0YgdXNlcyB0aGUgSUZCCisqIGFkZHJlc3MgYXMgYSBoYW5kbGUgd2hlbiBpdCBwZXJmb3JtcyBhIGNhbGwoYmFjaykgb2YgYW4gTVNGLWZ1bmN0aW9uIChpLmUuIG1zZl9hc3NlcnQpLgorKgorKiBOb3RlIHRoYXQgbm90IG9ubHkgdGhlIE1TRiBhY2Nlc3NpYmxlIGZpZWxkcyBhcmUgY2xlYXJlZCwgYnV0IGFsc28gYWxsIGludGVybmFsIGhvdXNla2VlcGluZworKiBpbmZvcm1hdGlvbiBpcyByZS1pbml0aWFsaXplZC4KKyogVGhpcyBpbXBsaWVzIHRoYXQgYWxsIHNldHRpbmdzIHdoaWNoIGFyZSBkb25lIHZpYSBoY2ZfYWN0aW9uIGFuZCBoY2ZfcHV0X2luZm8gKGUuZy4gQ0ZHX01CX0FTU0VSVCwgQ0ZHX1JFR19NQiwKKyogQ0ZHX1JFR19JTkZPX0xPRykgbXVzdCBiZSBkb25lIGFnYWluLiBUaGUgb25seSBmaWVsZCB3aGljaCBpcyBub3QgY2xlYXJlZCwgaXMgSUZCX01TRlN1cC4KKyoKKyogSWYgSENGX0lOVF9PTiBpcyBzZWxlY3RlZCBhcyBjb21waWxlIG9wdGlvbiwgTklDIGludGVycnVwdHMgYXJlIGRpc2FibGVkLgorKgorKiBBc3NlcnQgZmFpbHMgaWYKKyogLSBpZmJwIGlzIG5vdCBwcm9wZXJseSBhbGlnbmVkICggcmVmIGNoYXB0ZXIgSENGX0FMSUdOIGluIDQuMS4xKQorKiAtIEkvTyBCYXNlIEFkZHJlc3MgaXMgbm90IGEgbXVsdGlwbGUgb2YgMHg0MCAobm90ZTogMHgwMDAwIGlzIGV4cGxpY2l0bHkgYWxsb3dlZCkuCisqCisqLkRJQUdSQU0KKyoKKyowOglUaHJvdWdob3V0IGhjZl9jb25uZWN0IHlvdSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHRoZSBjb25uZWN0IGZyb20gdGhlIGRpc2Nvbm5lY3QgY2FzZSwgd2hpY2ggcmVxdWlyZXMKKyoJc29tZSBhdHRlbnRpb24gYWJvdXQgd2hhdCB0byB1c2UgYXMgIkkvTyIgYWRkcmVzcyB3aGVuIGZvciB3aGljaCBwdXJwb3NlLgorKjI6CisqMmE6IFJlc2V0IEgtSUkgYnkgdG9nZ2xpbmcgcmVzZXQgYml0IGluIElPLXJlZ2lzdGVyIG9uIGFuZCBvZmYuCisqCVRoZSBIQ0ZfVFlQRV9QUkVMT0FERUQgY2F0ZXJzIGZvciB0aGUgRE9TIGVudmlyb25tZW50IHdoZXJlIEgtSUkgaXMgbG9hZGVkIGJ5IGEgc2VwYXJhdGUgcHJvZ3JhbSB0bworKglvdmVyY29tZSB0aGUgNjRrIHNpemUgbGltaXQgcG9zZWQgb24gRE9TIGRyaXZlcnMuCisqCVRoZSBtYWNybyBPUFcgaXMgbm90IHlldCB1c2VhYmxlIGJlY2F1c2UgdGhlIElGQl9JT0Jhc2UgZmllbGQgaXMgbm90IHNldC4KKyoJTm90ZSAxOiBob3BlZnVsbHkgdGhlIGNsZWFyaW5nIGFuZCBpbml0aWFsaXppbmcgb2YgdGhlIElGQiAoc2VlIGJlbG93KSBhY3RzIGFzIGEgZGVsYXkgd2hpY2ggbWVldHMgdGhlCisqCXNwZWNpZmljYXRpb24gZm9yIFMvVyByZXNldAorKglOb3RlIDI6IGl0IHR1cm5zIG91dCB0aGF0IG9uIHNvbWUgSC9XIGNvbnN0ZWxsYXRpb25zLCB0aGUgY2xvY2sgdG8gYWNjZXNzIHRoZSBFRVByb20gaXMgbm90IGxvd2VyZWQKKyoJdG8gYW4gYXBwcm9wcmlhdGUgZnJlcXVlbmN5IGJ5IEhSRUdfSU9fU1JFU0VULiBCeSBnaXZpbmcgYW4gSENNRF9JTkkgZmlyc3QsIHRoaXMgcHJvYmxlbSBpcyB3b3JrZWQgYXJvdW5kLgorKjJiOiBFeHBlcmltZW50YWxseSBpdCBpcyBkZXRlcm1pbmVkIG92ZXIgYSB3aWRlIHJhbmdlIG9mIEYvVyB2ZXJzaW9ucyB0aGF0IHdhaXRpbmcgZm9yIHRoZSBmb3IgQ21kIGJpdCBpbgorKglFdiByZWdpc3RlciBnaXZlcyBhIHdvcmthYmxlIHN0cmF0ZWd5LiBUaGUgYXZhaWxhYmxlIGRvY3VtZW50YXRpb24gZG9lcyBub3QgZ2l2ZSBtdWNoIGNsdWVzLgorKjQ6CWNsZWFyIGFuZCBpbml0aWFsaXplIHRoZSBJRkIKKyoJVGhlIEhDRiBob3VzZSBrZWVwaW5nIGluZm8gaXMgZGVzaWduZWQgc3VjaCB0aGF0IHplcm8gaXMgdGhlIGFwcHJvcHJpYXRlIGluaXRpYWwgdmFsdWUgZm9yIGFzIG11Y2ggYXMKKyoJZmVhc2libGUgSUZCLWl0ZW1zLgorKglUaGUgcmVhZGFibGUgZmllbGRzIG1lbnRpb25lZCBpbiB0aGUgZGVzY3JpcHRpb24gc2VjdGlvbiBhbmQgc29tZSBIQ0Ygc3BlY2lmaWMgZmllbGRzIGFyZSBnaXZlbiB0aGVpcgorKglhY3R1YWwgdmFsdWUuCisqCUlGQl9UaWNrSW5pIGlzIGluaXRpYWxpemVkIGF0IGJlc3QgZ3Vlc3MgYmVmb3JlIGNhbGlicmF0aW9uCisqCUhjZl9jb25uZWN0IGRlZmF1bHRzIHRvICJubyBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiIgKGltcGxpY2l0bHkgYWNoaWV2ZWQgYnkgdGhlIHplcm8tZmlsbGluZykuCisqNjoJUmVnaXN0ZXIgY29tcGlsZS10aW1lIGxpbmtlZCBNU0YgUm91dGluZSBhbmQgc2V0IGRlZmF1bHQgZmlsdGVyIGxldmVsCisqCWNhc3QgbmVlZGVkIHRvIGdldCBhcm91bmQgdGhlICJuZWFyIiBwcm9ibGVtIGluIERPUyBDT00gbW9kZWwKKyoJZXIgQzI0NDY6IG5vIGNvbnZlcnNpb24gZnJvbSB2b2lkIChfX25lYXIgX19jZGVjbCAqKSh1bnNpZ25lZCBjaGFyIF9fZmFyICosdW5zaWduZWQgaW50LHVuc2lnbmVkIHNob3J0LGludCkKKyoJCQkJCQkJdG8gICB2b2lkIChfX2ZhciAgX19jZGVjbCAqKSh1bnNpZ25lZCBjaGFyIF9fZmFyICosdW5zaWduZWQgaW50LHVuc2lnbmVkIHNob3J0LGludCkKKyo4OglJZiBhIGNvbW1hbmQgaXMgYXBwYXJlbnRseSBzdGlsbCBhY3RpdmUgKGFzIGluZGljYXRlZCBieSB0aGUgQnVzeSBiaXQgaW4gQ21kIHJlZ2lzdGVyKSB0aGlzIG1heSBpbmRpY2F0ZSBhCisqCWJsb2NrZWQgY21kIHBpcGUgbGluZS4gIFRvIHVuYmxvY2sgdGhlIGZvbGxvd2luZyBhY3Rpb25zIGFyZSBkb25lOgorKgkgLSBBY2sgZXZlcnl0aGluZworKgkgLSBXYWl0IGZvciBCdXN5IGJpdCBkcm9wICBpbiBDbWQgcmVnaXN0ZXIKKyoJIC0gV2FpdCBmb3IgQ21kICBiaXQgcmFpc2UgaW4gRXYgIHJlZ2lzdGVyCisqCVRoZSB0d28gd2FpdHMgYXJlIGNvbWJpbmVkIGluIGEgc2luZ2xlIEhDRl9XQUlUX1dISUxFIHRvIG9wdGltaXplIG1lbW9yeSBzaXplLiBJZiBlaXRoZXIgb2YgdGhlc2Ugd2FpdHMKKyoJZmFpbCAocHJvdF9jbnQgYmVjb21lcyAwKSwgdGhlbiBzb21ldGhpbmcgaXMgc2VyaW91cyB3cm9uZy4gUmF0aGVyIHRoYW4gUEFOSUNLLCB0aGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoZQorKgluZXh0IGNtZF9leGUgd2lsbCBmYWlsLCBjYXVzaW5nIHRoZSBIQ0YgdG8gZ28gaW50byBERUZVTkNUIG1vZGUKKyoxMDoJQWNrIGV2ZXJ5dGhpbmcgdG8gdW5ibG9jayBhIChwb3NzaWJseSBibG9ja2VkKSBjbWQgcGlwZSBsaW5lCisqCU5vdGUgMTogaXQgaXMgdmVyeSBsaWtlbHkgdGhhdCBhbiBBbGxvYyBldmVudCBpcyBwZW5kaW5nIGFuZCB2ZXJ5IHdlbGwgcG9zc2libGUgdGhhdCBhIChTZW5kKSBDbWQgZXZlbnQgaXMKKyoJcGVuZGluZyBvbiBub24taW5pdGlhbCBjYWxscworKglOb3RlIDI6IGl0IGlzIGFzc3VtZWQgdGhhdCB0aGlzIHN0cmF0ZWd5IHRha2VzIGF3YXkgdGhlIG5lZWQgdG8gYWNrIGV2ZXJ5IGNvbmNlaXZhYmxlIGV2ZW50IGFmdGVyIGFuCisqCUhlcm1lcyBJbml0aWFsaXplCisqMTI6CU9ubHkgSC1JSSBORUVEUyB0aGUgSGVybWVzIEluaXRpYWxpemUgY29tbWFuZC4gRHVlIHRvIHRoZSBkaWZmZXJlbnQgc2VtYW50aWNzIGZvciBILUkgYW5kIEgtSUkKKyoJSW5pdGlhbGl6ZSBjb21tYW5kLCBpbml0KCkgZG9lcyBub3QgKGFuZCBjYW4gbm90LCBzaW5jZSBpdCBpcyBjYWxsZWQgZS5nLiBhZnRlciBhIGRvd25sb2FkKSBleGVjdXRlIHRoZQorKglIZXJtZXMgSW5pdGlhbGl6ZSBjb21tYW5kLiBFeGVjdXRpbmcgdGhlIEhlcm1lcyBJbml0aWFsaXplIGNvbW1hbmQgZm9yIEgtSSB3b3VsZCBub3QgaGFybSBidXQgbm90IGRvCisqCWFueXRoaW5nIHVzZWZ1bCBlaXRoZXIsIHNvIGl0IGlzIHNraXBwZWQuCisqCVRoZSByZXR1cm4gc3RhdHVzIG9mIGNtZF9leGUgaXMgaWdub3JlZC4gSXQgaXMgYXNzdW1lZCB0aGF0IGlmIGNtZF9leGUgZmFpbHMsIGluaXQgZmFpbHMgdG9vCisqMTQ6CXVzZSBpb19iYXNlIGFzIGEgZmxhZyB0byBtZXJnZSBoY2ZfY29ubmVjdCBhbmQgaGNmX2Rpc2Nvbm5lY3QgaW50byAxIHJvdXRpbmUKKyoJdGhlIGNhbGwgdG8gaW5pdCBhbmQgaXRzIHN1YnNlcXVlbnQgY2FsbCBvZiBjbWRfZXhlIHdpbGwgcmV0dXJuIEhDRl9FUlJfTk9fTklDIGlmIGFwcHJvcHJpYXRlLiBUaGlzIHN0YXR1cworKglpcyAoYmFkbHkpIG5lZWRlZCBieSBzb21lIGxlZ2FjeSBjb21iaW5hdGlvbiBvZiBOVDQgYW5kIGNhcmQgc2VydmljZXMgd2hpY2ggZG8gbm90IHlpZWxkIGFuIEkvTyBhZGRyZXNzIGluCisqCXRpbWUuCisqCisqLk5PVElDRQorKglPbiBwbGF0Zm9ybXMgd2hlcmUgdGhlIE5VTEwtcG9pbnRlciBpcyBub3QgYSBiaXQtcGF0dGVybiBvZiBhbGwgemVyb3MsIHRoZSB6ZXJvLWZpbGxpbmcgb2YgdGhlIElGQiByZXN1bHRzCisqCWluIGFuIGluY29ycmVjdCBpbml0aWFsaXphdGlvbiBvZiBwb2ludGVycy4KKyoJVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNYWlsQm94IG1hbmlwdWxhdGlvbiBpbiBwdXRfbWJfaW5mbyBwcm90ZWN0cyBhZ2FpbnN0IHRoZSBhYnNlbmNlIG9mIGEgTWFpbEJveAorKgliYXNlZCBvbiBJRkJfTUJTaXplLCBJRkJfTUJXcCBhbmQgaWZicC0+SUZCX01CUnAuIFRoaXMgaGFzIHJhbWlmaWNhdGlvbnMgb24gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZQorKglNYWlsQm94IHZpYSBoY2ZfcHV0X2luZm8gd2l0aCB0aGUgQ0ZHX1JFR19NQiB0eXBlLCBidXQgaXQgcHJldmVudHMgZGVwZW5kZW5jeSBvbiB0aGUgIk5VTEwtIm5lc3Mgb2YKKyoJSUZCX01CcC4KKyoKKyouTk9USUNFCisqCVRoZXJlIGFyZSBhIG51bWJlciBvZiBwcm9ibGVtcyB3aGVuIGFzc2VydGluZyBhbmQgbG9nZ2luZyBoY2ZfY29ubmVjdCwgZS5nLgorKgkgLSBBc3NlcnRpbmcgb24gcmUtZW50cmFuY3kgb2YgaGNmX2Nvbm5lY3QgYnkgbWVhbnMgb2YKKyoJICJIQ0ZBU1NFUlQoIChpZmJwLT5JRkJfQXNzZXJ0VHJhY2UgJiBIQ0ZfQVNTRVJUX0NPTk5FQ1QpID09IDAsIDAgKSIgaXMgbm90IHVzZWZ1bCBiZWNhdXNlIElGQiBjb250ZW50cworKgkgYXJlIHVuZGVmaW5lZAorKgkgLSBBc3NlcnRpbmcgYmVmb3JlIHRoZSBJRkIgaXMgY2xlYXJlZCB3aWxsIGNhdXNlIG1kZF9hc3NlcnQoKSB0byBpbnRlcnByZXQgdGhlIGdhcmJhZ2UgaW4gSUZCX0Fzc2VydFJ0bgorKgkgYXMgYSByb3V0aW5lIGFkZHJlc3MKKyoJVGhlcmVmb3JlIEhDRlRSQUNFIG5vciBIQ0ZMT0dFTlRSWSBpcyBjYWxsZWQgYnkgaGNmX2Nvbm5lY3QuCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitoY2ZfY29ubmVjdCggSUZCUCBpZmJwLCBoY2ZfaW8gaW9fYmFzZSApCit7CitpbnQJCQlyYyA9IEhDRl9TVUNDRVNTOworaGNmX2lvCQlpb19hZGRyOworaGNmXzMyCQlwcm90X2NudDsKK2hjZl84CQkqcTsKK0xUVl9TVFJDVAl4OworI2lmIEhDRl9BU1NFUlQKKwloY2ZfMTYgeGEgPSBpZmJwLT5JRkJfRldJZGVudGl0eS50eXA7CisJLyogaXMgYXNzdW1lZCB0byBjYXVzZSBhbiBhc3NlcnQgbGF0ZXIgb24gaWYgaGNmX2Nvbm5lY3QgaXMgY2FsbGVkIHdpdGhvdXQgaW50ZXJ2ZW5pbmcgaGNmX2Rpc2Nvbm5lY3QuCisJICogeGEgPT0gQ0ZHX0ZXX0lERU5USVRZIGluIHN1YnNlcXVlbnQgY2FsbHMgd2l0aG91dCBwcmVjZWRpbmcgaGNmX2Rpc2Nvbm5lY3QsCisJICogeGEgPT0gMCBpbiBzdWJzZXF1ZW50IGNhbGxzIHdpdGggcHJlY2VkaW5nIGhjZl9kaXNjb25uZWN0LAorCSAqIHhhID09ICJnYXJiYWdlIiAoYW55IHZhbHVlIGV4Y2VwdCBDRkdfRldfSURFTlRJVFkgaXMgYWNjZXB0YWJsZSkgaW4gdGhlIGluaXRpYWwgY2FsbAorCSAqLworI2VuZGlmIC8vIEhDRl9BU1NFUlQKKworCWlmICggaW9fYmFzZSA9PSBIQ0ZfRElTQ09OTkVDVCApIHsJCQkJCS8vZGlzY29ubmVjdAorCQlpb19hZGRyID0gaWZicC0+SUZCX0lPQmFzZTsKKwkJT1BXKCBIUkVHX0lOVF9FTiwgMCApOwkJLy87P3dvcmthcm91bmQgYWdhaW5zdCBkeWluZyBGL1cgb24gc3Vic2VxdWVudCBoY2ZfY29ubmVjdCBjYWxscworCX0gZWxzZSB7CQkJCQkJCQkJCQkvL2Nvbm5lY3QJCQkJCQkJCS8qIDAgKi8KKwkJaW9fYWRkciA9IGlvX2Jhc2U7CisJfQorCisjaWYgMCAvLzs/IGlmIGEgc3Vic2VxdWVudCBoY2ZfY29ubmVjdCBpcyBwcmVjZWVkZWQgYnkgYW4gaGNmX2Rpc2Nvbm5lY3QgdGhlIHdha2V1cCBpcyBub3QgbmVlZGVkICEhCisjaWYgSENGX1NMRUVQCisgICAgT1VUX1BPUlRfV09SRCggLi4uLi4rSFJFR19JTywgSFJFR19JT19XQUtFVVBfQVNZTkMgKTsgCSAgICAvL09QVyBub3QgeWV0IHVzZWFibGUKKwlNU0ZfV0FJVCg4MDApOwkJCQkJCQkJLy8gTVNGLWRlZmluZWQgZnVuY3Rpb24gdG8gd2FpdCBuIG1pY3Jvc2Vjb25kcy4KKwlub3RlIHRoYXQgTVNGX1dBSVQgdXNlcyBub3QgeWV0IGRlZmluZWQhISEhIElGQl9JT0Jhc2UgYW5kIElGQl9UaWNrSW5pICh2aWEgUFJPVF9DTlRfSU5JKQorCXNvIGJlIGNhcmVmdWxsIGlmIHRoaXMgY29kZSBpcyByZXN0b3JlZAorI2VuZGlmIC8vIEhDRl9TTEVFUAorI2VuZGlmIC8vIDAKKworI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1BSRUxPQURFRCApID09IDAJLy9zd2l0Y2ggY2xvY2sgYmFjayBmb3IgU0VFUFJPTSBhY2Nlc3MgICEhIQorCU9VVF9QT1JUX1dPUkQoIGlvX2FkZHIgKyBIUkVHX0NNRCwgSENNRF9JTkkgKTsgIAkgICAgLy9PUFcgbm90IHlldCB1c2VhYmxlCisJcHJvdF9jbnQgPSBJTklfVElDS19JTkk7CisJSENGX1dBSVRfV0hJTEUoIChJTl9QT1JUX1dPUkQoIGlvX2FkZHIgKyAgSFJFR19FVl9TVEFUKSAmIEhSRUdfRVZfQ01EKSA9PSAwICk7CisJT1VUX1BPUlRfV09SRCggKGlvX2FkZHIgKyBIUkVHX0lPKSwgSFJFR19JT19TUkVTRVQgKTsJLy9PUFcgbm90IHlldCB1c2VhYmxlCQkJCQkvKiAyYSovCisjZW5kaWYgLy8gSENGX1RZUEVfUFJFTE9BREVECisJZm9yICggcSA9IChoY2ZfOCopKCZpZmJwLT5JRkJfTWFnaWMpOyBxID4gKGhjZl84KilpZmJwOyAqLS1xID0gMCApIC8qTk9QKi87CQkJCQkJLyogNCAqLworCWlmYnAtPklGQl9NYWdpYwkJPSBIQ0ZfTUFHSUM7CisJaWZicC0+SUZCX1ZlcnNpb24JPSBJRkJfVkVSU0lPTjsKKyNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQgLy9hIG5ldyBJRkIgZGVtb25zdHJhdGVzIGhvdyBkaXJ0eSB0aGUgc29sdXRpb24gaXMKKwl4eHh4W3h4eHhfUFJJX0lERU5USVRZX09GRlNFVF0gPSBOVUxMOwkJLy9JRkJfUFJJSWRlbnRpdHkgcGxhY2Vob2xkZXIJMHhGRDAyCisJeHh4eFt4eHh4X1BSSV9JREVOVElUWV9PRkZTRVQrMV0gPSBOVUxMOwkvL0lGQl9QUklTdXAgcGxhY2Vob2xkZXIJCTB4RkQwMworI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKKyNpZiAoSENGX1RBTExJRVMpICYgKCBIQ0ZfVEFMTElFU19OSUMgfCBIQ0ZfVEFMTElFU19IQ0YgKQorCWlmYnAtPklGQl9UYWxseUxlbiA9IDEgKyAyICogKEhDRl9OSUNfVEFMX0NOVCArIEhDRl9IQ0ZfVEFMX0NOVCk7CS8vY29udmVydCAjIG9mIFRhbGxpZXMgdG8gTCB2YWx1ZSBmb3IgTFRWCisJaWZicC0+SUZCX1RhbGx5VHlwID0gQ0ZHX1RBTExJRVM7CQkJLy9JRkJfVGFsbHlUeXA6IHNldCBUIHZhbHVlCisjZW5kaWYgLy8gSENGX1RBTExJRVNfTklDIC8gSENGX1RBTExJRVNfSENGCisJaWZicC0+SUZCX0lPQmFzZQk9IGlvX2FkZHI7CQkJCS8vc2V0IElPX0Jhc2UgYXNhcCwgc28gYXNzZXJ0cyB2aWEgSFJFR19TV18yIGRvbid0IGhhcm0KKwlpZmJwLT5JRkJfSU9SYW5nZQk9IEhSRUdfSU9fUkFOR0U7CisJaWZicC0+SUZCX0NudGxPcHQJPSBVU0VfMTZCSVQ7CisjaWYgSENGX0FTU0VSVAorCWFzc2VydF9pZmJwID0gaWZicDsKKwlpZmJwLT5JRkJfQXNzZXJ0THZsID0gMTsKKyNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROCisJaWYgKCBpb19iYXNlICE9IEhDRl9ESVNDT05ORUNUICkgeworCQlpZmJwLT5JRkJfQXNzZXJ0UnRuID0gKE1TRl9BU1NFUlRfUlROUCltc2ZfYXNzZXJ0OwkJCQkJCQkJCQkJLyogNiAqLworCX0KKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROCisjaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9NQgkJCQkvL2J1aWxkIHRoZSBzdHJ1Y3R1cmUgdG8gcGFzcyB0aGUgYXNzZXJ0IGluZm8gdG8gaGNmX3B1dF9pbmZvCisJaWZicC0+SUZCX0Fzc2VydFN0cmN0LmxlbiA9IHNpemVvZihpZmJwLT5JRkJfQXNzZXJ0U3RyY3QpL3NpemVvZihoY2ZfMTYpIC0gMTsKKwlpZmJwLT5JRkJfQXNzZXJ0U3RyY3QudHlwID0gQ0ZHX01CX0lORk87CisJaWZicC0+SUZCX0Fzc2VydFN0cmN0LmJhc2VfdHlwID0gQ0ZHX01CX0FTU0VSVDsKKwlpZmJwLT5JRkJfQXNzZXJ0U3RyY3QuZnJhZ19jbnQgPSAxOworCWlmYnAtPklGQl9Bc3NlcnRTdHJjdC5mcmFnX2J1ZlswXS5mcmFnX2xlbiA9CisJCSggb2Zmc2V0b2YoSUZCX1NUUkNULCBJRkJfQXNzZXJ0THZsKSAtIG9mZnNldG9mKElGQl9TVFJDVCwgSUZCX0Fzc2VydExpbmUpICkgLyBzaXplb2YoaGNmXzE2KTsKKwlpZmJwLT5JRkJfQXNzZXJ0U3RyY3QuZnJhZ19idWZbMF0uZnJhZ19hZGRyID0gJmlmYnAtPklGQl9Bc3NlcnRMaW5lOworI2VuZGlmIC8vIEhDRl9BU1NFUlRfTUIKKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUCisJSUZfUFJPVF9USU1FKCBwcm90X2NudCA9IGlmYnAtPklGQl9UaWNrSW5pID0gSU5JX1RJQ0tfSU5JOyApCisjaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfUFJFTE9BREVEICkgPT0gMAorCS8vISEgTm8gYXNzZXJ0cyBiZWZvcmUgUmVzZXQtYml0IGluIEhSRUdfSU8gaXMgY2xlYXJlZAorCU9QVyggSFJFR19JTywgMHgwMDAwICk7CQkJCQkJLy9PUFcgdXNlYWJsZQkJCQkJCQkJCQkvKiAyYiovCisJSENGX1dBSVRfV0hJTEUoIChJUFcoIEhSRUdfRVZfU1RBVCkgJiBIUkVHX0VWX0NNRCkgPT0gMCApOworCUlGX1BST1RfVElNRSggSENGQVNTRVJUKCBwcm90X2NudCwgSVBXKCBIUkVHX0VWX1NUQVQpICkgKQorCUlGX1BST1RfVElNRSggaWYgKCBwcm90X2NudCApIHByb3RfY250ID0gaWZicC0+SUZCX1RpY2tJbmk7ICkKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9QUkVMT0FERUQKKwkvLyEhIE5vIGFzc2VydHMgYmVmb3JlIFJlc2V0LWJpdCBpbiBIUkVHX0lPIGlzIGNsZWFyZWQKKwlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgTUVSR0VfMiggSENGX0FTU0VSVCwgMHhDQUYwICkJKSAvL2p1c3QgdG8gcHJvb2YgdGhhdCB0aGUgY29tcGxldGUgYXNzZXJ0IG1hY2hpbmVyeSBpcyB3b3JraW5nCisJSENGQVNTRVJUKCB4YSAhPSBDRkdfRldfSURFTlRJVFksIDAgKQkJLy8gYXNzZXJ0IGlmIGhjZl9jb25uZWN0IGlzIGNhbGxlZCB3aXRob3V0IGludGVydmVuaW5nIGhjZl9kaXNjb25uZWN0LgorCUhDRkFTU0VSVCggKChoY2ZfMzIpKHZvaWQqKWlmYnAgJiAoSENGX0FMSUdOLTEpICkgPT0gMCwgKGhjZl8zMikodm9pZCopaWZicCApCisJSENGQVNTRVJUKCAoaW9fYWRkciAmIDB4MDAzRikgPT0gMCwgaW9fYWRkciApCisJCQkJCQkJCQkJCQkvL2lmIEJ1c3kgYml0IGluIENtZCByZWdpc3RlcgorCWlmIChJUFcoIEhSRUdfQ01EICkgJiBIQ01EX0JVU1kgKSB7CQkJCQkJCQkJCQkJCQkJCS8qIDggKi8KKwkJCQkJCQkJCQkJCS8vLiAgQWNrIGFsbCB0byB1bmJsb2NrIGEgKHBvc3NpYmx5KSBibG9ja2VkIGNtZCBwaXBlIGxpbmUKKwkJT1BXKCBIUkVHX0VWX0FDSywgfkhSRUdfRVZfU0xFRVBfUkVRICk7CisJCQkJCQkJCQkJCQkvLy4gIFdhaXQgZm9yIEJ1c3kgYml0IGRyb3AgIGluIENtZCByZWdpc3RlcgorCQkJCQkJCQkJCQkJLy8uICBXYWl0IGZvciBDbWQgIGJpdCByYWlzZSBpbiBFdiAgcmVnaXN0ZXIKKwkJSENGX1dBSVRfV0hJTEUoICggSVBXKCBIUkVHX0NNRCApICYgSENNRF9CVVNZICkgJiYgKElQVyggSFJFR19FVl9TVEFUKSAmIEhSRUdfRVZfQ01EKSA9PSAwICk7CisJCUlGX1BST1RfVElNRSggSENGQVNTRVJUKCBwcm90X2NudCwgSVBXKCBIUkVHX0VWX1NUQVQpICkgKSAvKiBpZiBwcm90X2NudCA9PSAwLCBjbWRfZXhlIHdpbGwgZmFpbCwgY2F1c2luZyBERUZVTkNUICovCisJfQorCU9QVyggSFJFR19FVl9BQ0ssIH5IUkVHX0VWX1NMRUVQX1JFUSApOworI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1BSRUxPQURFRCApID09IDAJCQkJCQkJCQkJCQkJCS8qMTIqLworCSh2b2lkKWNtZF9leGUoIGlmYnAsIEhDTURfSU5JLCAwICk7CisjZW5kaWYgLy8gSENGX1RZUEVfUFJFTE9BREVECitpZiAoIGlvX2Jhc2UgIT0gSENGX0RJU0NPTk5FQ1QgKSB7CisJCXJjID0gaW5pdCggaWZicCApOwkJCQkJCQkJCQkJCQkJCQkJCQkvKjE0Ki8KKwkJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJCXgubGVuID0gMjsKKwkJCXgudHlwID0gQ0ZHX05JQ19CVVNfVFlQRTsKKwkJCSh2b2lkKWhjZl9nZXRfaW5mbyggaWZicCwgJnggKTsKKwkJCWlmYnAtPklGQl9CdXNUeXBlID0geC52YWxbMF07CisJCQkvL0NGR19OSUNfQlVTX1RZUEUgbm90IHN1cHBvcnRlZCAtPiBkZWZhdWx0IDMyIGJpdHMvRE1BLCBNU0YgaGFzIHRvIG92ZXJydWxlIHZpYSBDRkdfQ05UTF9PUFQKKwkJCWlmICggeC5sZW4gPT0gMCB8fCB4LnZhbFswXSA9PSAweDAwMDIgfHwgeC52YWxbMF0gPT0gMHgwMDAzICkgeworI2lmIChIQ0ZfSU8pICYgSENGX0lPXzMyQklUUworCQkJCWlmYnAtPklGQl9DbnRsT3B0ICY9IH5VU0VfMTZCSVQ7CQkJLy9yZXNldCBVU0VfMTZCSVQKKyNlbmRpZiAvLyBIQ0ZfSU9fMzJCSVRTCisjaWYgSENGX0RNQQorCQkJCWlmYnAtPklGQl9DbnRsT3B0IHw9IFVTRV9ETUE7CQkJCS8vU0VUIERNQQorI2Vsc2UKKwkJCQlpZmJwLT5JRkJfSU9SYW5nZSA9IDB4NDAgLyppLnMuby4gSFJFR19JT19SQU5HRSovOworI2VuZGlmIC8vIEhDRl9ETUEKKwkJCX0KKwkJfQorCX0gZWxzZSBIQ0ZBU1NFUlQoICAoIGlmYnAtPklGQl9NYWdpYyBePSBIQ0ZfTUFHSUMgKSA9PSAwLCBpZmJwLT5JRkJfTWFnaWMgKSAvKk5PUCovOworCS8qIG9mIGFib3ZlIEhDRkFTU0VSVCBvbmx5IHRoZSBzaWRlIGVmZmVjdCBpcyBuZWVkZWQsIE5PUCBpbiBjYXNlIEhDRkFTU0VSVCBpcyBkdW1teSAqLworCWlmYnAtPklGQl9JT0Jhc2UgPSBpb19iYXNlOwkJCQkJCQkJCQkJCQkJCQkJCS8qIDAqLworCXJldHVybiByYzsKK30gLy8gaGNmX2Nvbm5lY3QKKworI2lmIEhDRl9ETUEKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRnVuY3Rpb24gZ2V0X2ZyYW1lX2xzdAorKiAgLSByZXNvbHZlIHRoZSAibGFzdCBob3N0LW93bmVkIGRlc2NyaXB0b3IiIHByb2JsZW1zIHdoZW4gYSBkZXNjcmlwdG9yIGxpc3QgaXMgcmVjbGFpbWVkIGJ5IHRoZSBNU0YuCisqCisqIFRoZSBGcmFtZUxpc3QgdG8gYmUgcmVjbGFpbWVkIGFzIHdlbGwgYXMgdGhlIERlc2NyaXB0b3JMaXN0IGFsd2F5cyBzdGFydCBpbiBJRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddCisqIGFuZCB0aGlzIGlzIGFsd2F5cyB0aGUgImN1cnJlbnQiIERFTFdBIERlc2NyaXB0b3IuCisqCisqIElmIGEgRnJhbWVMaXN0IGlzIGF2YWlsYWJsZSwgdGhlIGxhc3QgZGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0IHRvIHR1cm5lZCBpbnRvIGEgbmV3IERFTFdBIERlc2NyaXB0b3I6CisqICAtIGEgY29weSBpcyBtYWRlIGZyb20gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBsYXN0IGRlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdCBpbnRvIHRoZSBjdXJyZW50CisqCSBERUxXQSBEZXNjcmlwdG9yCisqICAtIHRoZSByZW1haW5kZXIgb2YgdGhlIERlc2NyaXB0b3JMaXN0IGlzIGRldGFjaGVkIGZyb20gdGhlIGNvcHkgYnkgc2V0dGluZyB0aGUgbmV4dF9kZXNjX2FkZHIgYXQgTlVMTAorKiAgLSB0aGUgRE1BIGNvbnRyb2wgYml0cyBvZiB0aGUgY29weSBhcmUgY2xlYXJlZCB0byBkbyBub3QgY29uZnVzZSB0aGUgTVNGCisqICAtIHRoZSBjb3B5IG9mIHRoZSBsYXN0IGRlc2NyaXB0b3IgKGkuZS4gdGhlICJvbGQiIERFTFdBIERlc2NyaXB0b3IpIGlzIGNoYWluZWQgdG8gdGhlIHByZXYgRGVzY3JpcHRvcgorKgkgb2YgdGhlIEZyYW1lTGlzdCwgdGh1cyByZXBsYWNpbmcgdGhlIG9yaWdpbmFsIGxhc3QgRGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0LgorKiAgLSBJRkJfRmlyc3REZXNjIGlzIGNoYW5nZWQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhhdCByZXBsYWNlZCAob3JpZ2luYWwpIGxhc3QgZGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0LAorKgkgaS5lLiB0aGUgIm5ldyIgREVMV0EgRGVzY3JpcHRvci4KKyoKKyogVGhpcyBmdW5jdGlvbiBtYWtlcyBhIGNvcHkgb2YgdGhhdCBsYXN0IGhvc3Qtb3duZWQgZGVzY3JpcHRvciwgc28gdGhlIE1TRiB3aWxsIGdldCBhIGNvcHkgb2YgdGhlIGRlc2NyaXB0b3IuCisqIE9uIHRvcCBvZiB0aGF0LCBpdCBhZGp1c3RzIERNQSByZWxhdGVkIGZpZWxkcyBpbiB0aGUgSUZCIHN0cnVjdHVyZS4KKwkvLyBwZXJmb3JtIGEgY29weWluZy1zY2hlbWUgdG8gY2lyY3VtdmVudCB0aGUgJ2xhc3QgaG9zdCBvd25lZCBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZWNsYWltZWQnIGxpbWl0YXRpb24gaW1wb3NlZCBieSBIMi41J3MgRE1BIGhhcmR3YXJlIGRlc2lnbgorCS8vIGEgJ3JlY2xhaW0gZGVzY3JpcHRvcicgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGUgSENGOgorKgorKiBSZXR1cm5zOiBhZGRyZXNzIG9mIHRoZSBmaXJzdCBkZXNjcmlwdG9yIG9mIHRoZSBGcmFtZUxpc3QKKyoKKyA4OiBCZSBjYXJlZnVsIG9uY2UgeW91IHN0YXJ0IHJlLW9yZGVyaW5nIHRoZSBzdGVwcyBpbiB0aGUgY29weSBwcm9jZXNzLCB0aGF0IGl0IHN0aWxsIHdvcmtzIGZvciBjYXNlcworKiAJb2YgRnJhbWVMaXN0cyBvZiAxLCAyIGFuZCBtb3JlIHRoYW4gMiBkZXNjcmlwdG9ycworKgorKiBJbnB1dCBwYXJhbWV0ZXJzOgorKiB0eF9yeF9mbGFnICAgICAgOiBzcGVjaWZpZXMgJ3RyYW5zbWl0JyBvciAncmVjZWl2ZScgZGVzY3JpcHRvci4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgREVTQ19TVFJDVCoKK2dldF9mcmFtZV9sc3QoIElGQlAgaWZicCwgaW50IHR4X3J4X2ZsYWcgKQoreworCitERVNDX1NUUkNUICpoZWFkID0gaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXTsKK0RFU0NfU1RSQ1QgKmNvcHksICpwLCAqcHJldjsKKworCUhDRkFTU0VSVCggdHhfcnhfZmxhZyA9PSBETUFfUlggfHwgdHhfcnhfZmxhZyA9PSBETUFfVFgsIHR4X3J4X2ZsYWcgKQorCQkJCQkJCQkvL2lmIEZyYW1lTGlzdAorCWlmICggaGVhZCApIHsKKwkJCQkJCQkJLy8uICBzZWFyY2ggZm9yIGxhc3QgZGVzY3JpcHRvciBvZiBmaXJzdCBGcmFtZUxpc3QKKwkJcCA9IHByZXYgPSBoZWFkOworCQl3aGlsZSAoICggcC0+QlVGX1NJWkUgJiBERVNDX0VPUCApID09IDAgJiYgcC0+bmV4dF9kZXNjX2FkZHIgKSB7CisJCQlpZiAoICggaWZicC0+SUZCX0NudGxPcHQgJiBETUFfRU5BQkxFRCApID09IDAgKSB7CS8vY2xlYXIgY29udHJvbCBiaXRzIHdoZW4gZGlzYWJsZWQKKwkJCQlwLT5CVUZfQ05UICY9IERFU0NfQ05UX01BU0s7CisJCQl9CisJCQlwcmV2ID0gcDsKKwkJCXAgPSBwLT5uZXh0X2Rlc2NfYWRkcjsKKwkJfQorCQkJCQkJCQkvLy4gIGlmIERNQSBlbmFibGVkCisJCWlmICggaWZicC0+SUZCX0NudGxPcHQgJiBETUFfRU5BQkxFRCApIHsKKwkJCQkJCQkJLy8uICAuICBpZiBsYXN0IGRlc2NyaXB0b3Igb2YgRnJhbWVMaXN0IGlzIERNQSBvd25lZAorCQkJCQkJCQkvLy4gIC4gIG9yIGlmIEZyYW1lTGlzdCBpcyBzaW5nbGUgKERFTFdBKSBEZXNjcmlwdG9yCisJCQlpZiAoIHAtPkJVRl9DTlQgJiBERVNDX0RNQV9PV05FRCB8fCBoZWFkLT5uZXh0X2Rlc2NfYWRkciA9PSBOVUxMICkgeworCQkJCQkJCQkvLy4gIC4gIC4gIHJlZnVzZSB0byByZXR1cm4gRnJhbWVMaXN0IHRvIGNhbGxlcgorCQkJCWhlYWQgPSBOVUxMOworCQkJfQorCQl9CisJfQorCQkJCQkJCQkvL2lmIHJldHVybmFibGUgRnJhbWVMaXN0IGZvdW5kCisJaWYgKCBoZWFkICkgeworCQkJCQkJCQkvLy4gIGlmIEZyYW1lTGlzdCBpcyBzaW5nbGUgKERFTFdBKSBEZXNjcmlwdG9yIChpbXBsaWVzIERNQSBkaXNhYmxlZCkKKyAJCWlmICggaGVhZC0+bmV4dF9kZXNjX2FkZHIgPT0gTlVMTCApIHsKKwkJCQkJCQkJLy8uICAuICBjbGVhciBEZXNjcmlwdG9yTGlzdAorCQkJLyo7P2lmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSA9Ki8gaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSA9IE5VTEw7CisJCQkJCQkJCS8vLiAgZWxzZQorCQl9IGVsc2UgeworCQkJCQkJCQkvLy4gIC4gIHN0cmlwIGhhcmR3YXJlLXJlbGF0ZWQgYml0cyBmcm9tIGxhc3QgZGVzY3JpcHRvcgorCQkJCQkJCQkvLy4gIC4gIHJlbW92ZSBERUxXQSBEZXNjcmlwdG9yIGZyb20gaGVhZCBvZiBEZXNjcmlwdG9yTGlzdAorCQkJY29weSA9IGhlYWQ7CisJIAkJaGVhZCA9IGhlYWQtPm5leHRfZGVzY19hZGRyOworCQkJCQkJCQkvLy4gICAuICBleGNoYW5nZSBmaXJzdCAoQ29uZmluZWQpIGFuZCBsYXN0IChwb3NzaWJseSBpbXByaXNvbmVkKSBEZXNjcmlwdG9yCisJCQljb3B5LT5idWZfcGh5c19hZGRyID0gcC0+YnVmX3BoeXNfYWRkcjsKKwkJCWNvcHktPmJ1Zl9hZGRyID0gcC0+YnVmX2FkZHI7CisJCQljb3B5LT5CVUZfU0laRSA9IHAtPkJVRl9TSVpFICY9IERFU0NfQ05UX01BU0s7CS8vZ2V0IHJpZCBvZiBERVNDX0VPUCBhbmQgcG9zc2libHkgREVTQ19TT1AKKwkJCWNvcHktPkJVRl9DTlQgPSBwLT5CVUZfQ05UICY9IERFU0NfQ05UX01BU0s7CS8vZ2V0IHJpZCBvZiBERVNDX0RNQV9PV05FRAorI2lmIChIQ0ZfRVhUKSAmIEhDRl9ERVNDX1NUUkNUX0VYVAorCQkJY29weS0+REVTQ19NU0ZTdXAgPSBwLT5ERVNDX01TRlN1cDsKKyNlbmRpZiAvLyBIQ0ZfREVTQ19TVFJDVF9FWFQKKwkJCQkJCQkJLy8uICAuICB0dXJuIGludG8gYSBERUxXQSBEZXNjcmlwdG9yCisJCQlwLT5idWZfYWRkciA9IE5VTEw7CisJCQkJCQkJCS8vLiAgLiAgY2hhaW4gY29weSB0byBwcmV2CQkJCQkJCQkJCQkvKiA4Ki8KKwkJCXByZXYtPm5leHRfZGVzY19hZGRyID0gY29weTsKKwkJCQkJCQkJLy8uICAuICBkZXRhY2ggcmVtYWluZGVyIG9mIHRoZSBEZXNjcmlwdG9yTGlzdCBmcm9tIEZyYW1lTGlzdAorCQkJY29weS0+bmV4dF9kZXNjX2FkZHIgPSBOVUxMOworCQkJY29weS0+bmV4dF9kZXNjX3BoeXNfYWRkciA9IDB4REVBRDAwMDA7IC8vISBqdXN0IHRvIGJlIG5pY2UsIG5vdCByZWFsbHkgbmVlZGVkCisJCQkJCQkJCS8vLiAgLiAgc2F2ZSB0aGUgbmV3IHN0YXJ0IChpLmUuIERFTFdBIERlc2NyaXB0b3IpIGluIElGQl9GaXJzdERlc2MKKwkJCWlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10gPSBwOworCQl9CisJCQkJCQkJCS8vLiAgc3RyaXAgREVTQ19TT1AgZnJvbSBmaXJzdCBkZXNjcmlwdG9yCisJCWhlYWQtPkJVRl9TSVpFICY9IERFU0NfQ05UX01BU0s7CisJCS8vaGVhZC0+QlVGX0NOVCAmPSBERVNDX0NOVF9NQVNLOyAgZ2V0IHJpZCBvZiBERVNDX0RNQV9PV05FRAorCQloZWFkLT5uZXh0X2Rlc2NfcGh5c19hZGRyID0gMHhERUFEMDAwMDsgLy8hIGp1c3QgdG8gYmUgbmljZSwgbm90IHJlYWxseSBuZWVkZWQKKwl9CisJCQkJCQkJCS8vcmV0dXJuIHRoZSBqdXN0IGRldGFjaGVkIEZyYW1lTGlzdCAoaWYgYW55KQorCXJldHVybiBoZWFkOworfSAvLyBnZXRfZnJhbWVfbHN0CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGdW5jdGlvbiBwdXRfZnJhbWVfbHN0CisqCisqIFRoaXMgZnVuY3Rpb24KKyoKKyogUmV0dXJuczogYWRkcmVzcyBvZiB0aGUgZmlyc3QgZGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0CisqCisqIElucHV0IHBhcmFtZXRlcnM6CisqIHR4X3J4X2ZsYWcgICAgICA6IHNwZWNpZmllcyAndHJhbnNtaXQnIG9yICdyZWNlaXZlJyBkZXNjcmlwdG9yLgorKgorKiBUaGUgZm9sbG93aW5nIGxpc3Qgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIGhjZl9kbWFfdHgvcnhfcHV0LCBpbiBvcmRlciB0byBnZXQgdGhlbSBpbiB0aGUgV0NJLXNwZWMgISEhIQorKiBBc3NlcnQgZmFpbHMgaWYKKyogLQlETUEgaXMgbm90IGVuYWJsZWQKKyogLQlkZXNjcmlwdG9yIGxpc3QgaXMgTlVMTAorKiAtCWEgZGVzY3JpcHRvciBpbiB0aGUgZGVzY3JpcHRvciBsaXN0IGlzIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCisqIC0JYSBjb3VudCBvZiBzaXplIGZpZWxkIG9mIGEgZGVzY3JpcHRvciBjb250YWlucyBjb250cm9sIGJpdHMsIGkuZS4gYml0cyBpbiB0aGUgaGlnaCBvcmRlciBuaWJibGUuCisqIC0JdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IGEgInNpbmdsZXRvbiIgRGVzY3JpcHRvckxpc3QuCisqIC0JdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IHRoZSBmaXJzdCBEZXNjcmlwdG9yIHN1cHBsaWVkCisqIC0JYSBub25fRE1BIGRlc2NyaXB0b3IgaXMgc3VwcGxpZWQgYmVmb3JlIHRoZSBERUxXQSBEZXNjcmlwdG9yIGlzIHN1cHBsaWVkCisqIC0JUG9zc2libHkgbW9yZSBjaGVja3MgY291bGQgYmUgYWRkZWQgISEhISEhISEhISEhIQorCisqLk5PVElDRQorKiBUaGUgYXNzZXJ0cyBtYXJrZWQgd2l0aCAqc2MqIGFyZSByZWFsbHkgc2FuaXR5IGNoZWNrcyBmb3IgdGhlIEhDRiwgdGhleSBjYW4gKHN1cHBvc2VkbHkpIG5vdCBiZSBpbmZsdWVuY2VkCisqIGJ5IGluY29ycmVjdCBNU0YgYmVoYXZpb3IKKworCQkvLyBUaGUgTVNGIGlzIHJlcXVpcmVkIHRvIHN1cHBseSB0aGUgSENGIHdpdGggYSBzaW5nbGUgZGVzY3JpcHRvciBmb3IgTVNGIHR4IHJlY2xhaW0gcHVycG9zZXMuCisJCS8vIFRoaXMgJ3JlY2xhaW0gZGVzY3JpcHRvcicgY2FuIGJlIHJlY29nbml6ZWQgYnkgdGhlIGZhY3QgdGhhdCBpdHMgYnVmX2FkZHIgZmllbGQgaXMgemVyby4KKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkqIEFsdGhvdWdoIG5vdCByZXF1aXJlZCBmcm9tIGEgaGFyZHdhcmUgcGVyc3BlY3RpdmU6CisJKiAtIG1ha2UgZWFjaCBkZXNjcmlwdG9yIGluIHRoaXMgcngtY2hhaW4gRE1BLW93bmVkLgorCSogLSBBbHNvIHNldCB0aGUgY291bnQgdG8gemVyby4gRU9QIGFuZCBTT1AgYml0cyBhcmUgYWxzbyBjbGVhcmVkLgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgdm9pZAorcHV0X2ZyYW1lX2xzdCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgaW50IHR4X3J4X2ZsYWcgKQoreworCURFU0NfU1RSQ1QJKnAgPSBkZXNjcDsKKwloY2ZfMTYgcG9ydDsKKworCUhDRkFTU0VSVCggaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BLCBpZmJwLT5JRkJfQ250bE9wdCkgLy9vbmx5IGhjZl9kbWFfdHhfcHV0IG11c3QgYWxzbyBiZSBETUFfRU5BQkxFRAorCUhDRkFTU0VSVCggdHhfcnhfZmxhZyA9PSBETUFfUlggfHwgdHhfcnhfZmxhZyA9PSBETUFfVFgsIHR4X3J4X2ZsYWcgKQorCUhDRkFTU0VSVCggcCAsIDAgKQorCisJd2hpbGUgKCBwICkgeworCQlIQ0ZBU1NFUlQoICgoaGNmXzMyKXAgJiAzICkgPT0gMCwgKGhjZl8zMilwICkKKwkJSENGQVNTRVJUKCAocC0+QlVGX0NOVCAmIH5ERVNDX0NOVF9NQVNLKSA9PSAwLCBwLT5CVUZfQ05UICkKKwkJSENGQVNTRVJUKCAocC0+QlVGX1NJWkUgJiB+REVTQ19DTlRfTUFTSykgPT0gMCwgcC0+QlVGX1NJWkUgKQorCQlwLT5CVUZfU0laRSAmPSBERVNDX0NOVF9NQVNLOwkJCQkJLy8hIXRoaXMgU0hPVUxEIGJlIHN1cGVyZmx1b3VzIGluIGNhc2Ugb2YgY29ycmVjdCBNU0YKKwkJcC0+QlVGX0NOVCAmPSB0eF9yeF9mbGFnID09IERNQV9SWCA/IDAgOiBERVNDX0NOVF9NQVNLOwkvLyEhdGhpcyBTSE9VTEQgYmUgc3VwZXJmbHVvdXMgaW4gY2FzZSBvZiBjb3JyZWN0IE1TRgorCQlwLT5CVUZfQ05UIHw9IERFU0NfRE1BX09XTkVEOworCQlpZiAoIHAtPm5leHRfZGVzY19hZGRyICkgeworLy8JCQlIQ0ZBU1NFUlQoIHAtPmJ1Zl9hZGRyICYmIHAtPmJ1Zl9waHlzX2FkZHIgICYmIHAtPkJVRl9TSVpFICYmICsvLSBwLT5CVUZfU0laRSwgLi4uICkKKwkJCUhDRkFTU0VSVCggcC0+bmV4dF9kZXNjX2FkZHItPmRlc2NfcGh5c19hZGRyLCAoaGNmXzMyKXAtPm5leHRfZGVzY19hZGRyICkKKwkJCXAtPm5leHRfZGVzY19waHlzX2FkZHIgPSBwLT5uZXh0X2Rlc2NfYWRkci0+ZGVzY19waHlzX2FkZHI7CisJCX0gZWxzZSB7CQkJCQkJCQkJLy8KKwkJCXAtPm5leHRfZGVzY19waHlzX2FkZHIgPSAwOworCQkJaWYgKCBwLT5idWZfYWRkciA9PSBOVUxMICkgewkJCS8vIERFTFdBIERlc2NyaXB0b3IKKwkJCQlIQ0ZBU1NFUlQoIGRlc2NwID09IHAsIChoY2ZfMzIpZGVzY3AgKQkvL3NpbmdsZXRvbiBEZXNjcmlwdG9yTGlzdAorCQkJCUhDRkFTU0VSVCggaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSA9PSBOVUxMLCAoaGNmXzMyKWlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10pCisJCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10gPT0gTlVMTCwgKGhjZl8zMilpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10pCisJCQkJZGVzY3AtPkJVRl9DTlQgPSAwOyAvLyY9IH5ERVNDX0RNQV9PV05FRDsKKwkJCQlpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddID0gZGVzY3A7CisvLyBwYXJ0IG9mIGFsdGVybmF0aXZlIGlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSA9IGlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10gPSBkZXNjcDsKKwkJCQkJCQkJCQkJCQkvLyBpZiAicmVjeWNsaW5nIiBhIEZyYW1lTGlzdAorCQkJCQkJCQkJCQkJCS8vIChlLmcuIGNhbGxlZCBmcm9tIGhjZl9jbnRsKCBIQ0ZfQ05UTF9FTkFCTEUgKQorCQkJCQkJCQkJCQkJCS8vIC4gIHByZXBhcmUgZm9yIGFjdGl2YXRpb24gRE1BIGNvbnRyb2xsZXIKKy8vIHBhcnQgb2YgYWx0ZXJuYXRpdmUgZGVzY3AgPSBkZXNjcC0+bmV4dF9kZXNjX2FkZHI7CisJCQl9IGVsc2UgewkJCQkJCQkJLy9hICJyZWFsIiBGcmFtZUxpc3QsIGhhbmQgaXQgb3ZlciB0byB0aGUgRE1BIGVuZ2luZQorCQkJCUhDRkFTU0VSVCggaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSwgKGhjZl8zMilkZXNjcCApCisJCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10sIChoY2ZfMzIpZGVzY3AgKQorCQkJCUhDRkFTU0VSVCggaWZicC0+SUZCX0xhc3REZXNjW3R4X3J4X2ZsYWddLT5uZXh0X2Rlc2NfYWRkciA9PSBOVUxMLAorCQkJCQkJICAgKGhjZl8zMilpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10tPm5leHRfZGVzY19hZGRyKQorLy8JCQkJcC0+YnVmX2NudGwuY250bF9zdGF0IHw9IERFU0NfRE1BX09XTkVEOworCQkJCWlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXS0+bmV4dF9kZXNjX2FkZHIgPSBkZXNjcDsKKwkJCQlpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10tPm5leHRfZGVzY19waHlzX2FkZHIgPSBkZXNjcC0+ZGVzY19waHlzX2FkZHI7CisJCQkJcG9ydCA9IEhSRUdfUlhETUFfUFRSMzI7CisJCQkJaWYgKCB0eF9yeF9mbGFnICkgeworCQkJCQlwLT5CVUZfU0laRSB8PSBERVNDX0VPUDsJLy8gcCBwb2ludHMgYXQgdGhlIGxhc3QgZGVzY3JpcHRvciBpbiB0aGUgY2FsbGVyLXN1cHBsaWVkIGRlc2NyaXB0b3IgY2hhaW4KKwkJCQkJZGVzY3AtPkJVRl9TSVpFIHw9IERFU0NfU09QOworCQkJCQlwb3J0ID0gSFJFR19UWERNQV9QVFIzMjsKKwkJCQl9CisJCQkJT1VUX1BPUlRfRFdPUkQoIChpZmJwLT5JRkJfSU9CYXNlICsgcG9ydCksIGRlc2NwLT5kZXNjX3BoeXNfYWRkciApOworCQkJfQorCQkJaWZicC0+SUZCX0xhc3REZXNjW3R4X3J4X2ZsYWddID0gcDsKKwkJfQorCQlwID0gcC0+bmV4dF9kZXNjX2FkZHI7CisJfQorfSAvLyBwdXRfZnJhbWVfbHN0CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5NT0RVTEUJCURFU0NfU1RSQ1QqIGhjZl9kbWFfcnhfZ2V0KCBJRkJQIGlmYnAgKQorKi5QVVJQT1NFCQlkZWNhcHN1bGF0ZSBhIG1lc3NhZ2UgYW5kIHByb3ZpZGVzIHRoYXQgbWVzc2FnZSB0byB0aGUgTVNGLgorKgkJCQlyZWNsYWltIGFsbCBkZXNjcmlwdG9ycyBpbiB0aGUgcnggZGVzY3JpcHRvciBjaGFpbi4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKgorKi5SRVRVUk5TCisqCXBvaW50ZXIgdG8gYSBGcmFtZUxpc3QKKyoKKyouREVTQ1JJUFRJT04KKyogaGNmX2RtYV9yeF9nZXQgaXMgaW50ZW5kZWQgdG8gIHJldHVybiBhIHJlY2VpdmVkIGZyYW1lIHdoZW4gc3VjaCBhIGZyYW1lIGlzIGRlcG9zaXRlZCBpbiBIb3N0IG1lbW9yeSBieSB0aGUKKyogRE1BIGVuZ2luZS4gSW4gYWRkaXRpb24gaGNmX2RtYV9yeF9nZXQgY2FuIGJlIHVzZWQgdG8gcmVjbGFpbSBhbGwgZGVzY3JpcHRvcnMgaW4gdGhlIHJ4IGRlc2NyaXB0b3IgY2hhaW4KKyogd2hlbiB0aGUgRE1BIEVuZ2luZSBpcyBkaXNhYmxlZCwgZS5nLiBhcyBwYXJ0IG9mIGEgZHJpdmVyIHVubG9hZGluZyBzdHJhdGVneS4KKyogaGNmX2RtYV9yeF9nZXQgbXVzdCBiZSBjYWxsZWQgcmVwZWF0ZWRseSBieSB0aGUgTVNGIHdoZW4gaGNmX3NlcnZpY2VfbmljIHNpZ25hbHMgYXZhaWxhYmlsaXR5IG9mIGEgcnggZnJhbWUKKyogdGhyb3VnaCB0aGUgSFJFR19FVl9SRE1BRCBmbGFnIG9mIElGQl9EbWFQYWNrZXRzLiBUaGUgY2FsbGluZyBtdXN0IHN0b3Agd2hlbiBhIE5VTEwgcG9pbnRlciBpcyByZXR1cm5lZCwgYXQKKyogd2hpY2ggdGltZSB0aGUgSFJFR19FVl9SRE1BRCBmbGFnIGlzIGFsc28gY2xlYXJlZCBieSB0aGUgSENGIHRvIGFybSB0aGUgbWVjaGFuaXNtIGZvciB0aGUgbmV4dCBmcmFtZQorKiByZWNlcHRpb24uCisqIFJlZ2FyZGxlc3Mgd2hldGhlciB0aGUgRE1BIEVuZ2luZSBpcyBjdXJyZW50bHkgZW5hYmxlZCAoYXMgY29udHJvbGxlZCB2aWEgaGNmX2NudGwpLCBpZiB0aGUgRE1BIGNvbnRyb2xsZXIKKyogZGVwb3NpdGVkIGFuIFJ4LWZyYW1lIGluIHRoZSBSeC1EZXNjcmlwdG9yTGlzdCwgdGhpcyBmcmFtZSBpcyBkZXRhY2hlZCBmcm9tIHRoZSBSeC1EZXNjcmlwdG9yTGlzdCwKKyogdHJhbnNmb3JtZWQgaW50byBhIEZyYW1lTGlzdCAoaS5lLiAgdXBkYXRpbmcgdGhlIGhvdXNla2VlcGluZyBmaWVsZHMgaW4gdGhlIGRlc2NyaXB0b3JzKSBhbmQgcmV0dXJuZWQgdG8gdGhlCisqIGNhbGxlci4KKyogSWYgbm8gc3VjaCBSeC1mcmFtZSBpcyBhdmFpbGFibGUgaW4gdGhlIFJ4LURlc2NyaXB0b3JMaXN0LCB0aGUgYmVoYXZpb3Igb2YgaGNmX2RtYV9yeF9nZXQgZGVwZW5kcyBvbiB0aGUKKyogc3RhdHVzIG9mIHRoZSBETUEgRW5naW5lLgorKiBJZiB0aGUgRE1BIEVuZ2luZSBpcyBlbmFibGVkLCBhIE5VTEwgcG9pbnRlciBpcyByZXR1cm5lZC4KKyogSWYgdGhlIERNQSBFbmdpbmUgaXMgZGlzYWJsZWQsIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3kgaXMgdXNlZDoKKyogLSB0aGUgY29tcGxldGUgUngtRGVzY3JpcHRvckxpc3QgaXMgcmV0dXJuZWQuIFRoZSBERUxXQSBEZXNjcmlwdG9yIGlzIG5vdCBwYXJ0IG9mIHRoZSBSeC1EZXNjcmlwdG9yTGlzdC4KKyogLSBJZiB0aGVyZSBpcyBubyBSeC1EZXNjcmlwdG9yTGlzdCwgdGhlIERFTFdBIERlc2NyaXB0b3IgaXMgcmV0dXJuZWQuCisqIC0gSWYgdGhlcmUgaXMgbm8gREVMV0EgRGVzY3JpcHRvciwgYSBOVUxMIHBvaW50ZXIgaXMgcmV0dXJuZWQuCisqCisqIElmIHRoZSBNU0YgcGVyZm9ybXMgYW4gZGlzYWJsZS9lbmFibGUgc2VxdWVuY2Ugd2l0aG91dCBleGhhdXN0aW5nIHRoZSBSeC1EZXNjcmlwdG9yTGlzdCBhcyBkZXNjcmliZWQgYWJvdmUsCisqIHRoZSBlbmFibGUgY29tbWFuZCB3aWxsIHJlc2V0IGFsbCBob3VzZSBrZWVwaW5nIGluZm9ybWF0aW9uLCBpLmUuIGFscmVhZHkgcmVjZWl2ZWQgYnV0IG5vdCB5ZXQgYnkgdGhlIE1TRgorKiByZXRyaWV2ZWQgZnJhbWVzIGFyZSBsb3N0IGFuZCB0aGUgbmV4dCBmcmFtZSB3aWxsIGJlIHJlY2VpdmVkIHN0YXJ0aW5nIHdpdGggdGhlIG9sZGVzdCBkZXNjcmlwdG9yLgorKgorKiBUaGUgSENGIGNhbiBiZSB1c2VkIGluIDIgZmFzaGlvbnM6IHdpdGggYW5kIHdpdGhvdXQgZGVjYXBzdWxhdGlvbiBmb3IgZGF0YSB0cmFuc2Zlci4KKyogVGhpcyBpcyBjb250cm9sbGVkIGF0IGNvbXBpbGUgdGltZSBieSB0aGUgSENGX0VOQyBiaXQgb2YgdGhlIEhDRl9FTkNBUCBzeXN0ZW0gY29uc3RhbnQuCisqIElmIGFwcHJvcHJpYXRlLCBkZWNhcHN1bGF0aW9uIGlzIGRvbmUgYnkgbW92aW5nIHNvbWUgZGF0YSBpbnNpZGUgdGhlIGJ1ZmZlcnMgYW5kIHVwZGF0aW5nIHRoZSBkZXNjcmlwdG9ycworKiBhY2NvcmRpbmdseS4KKyohISA7Pz8/Pz93aGVyZSBkaWQgSSBkZXNjcmliZSB3aHkgYSBzaW1wbGUgbWFuaXB1bGF0aW9uIHdpdGggdGhlIGNvdW50IHZhbHVlcyBkb2VzIG5vdCBzdWZmaWNlPworKgorKi5ESUFHUkFNCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitERVNDX1NUUkNUKgoraGNmX2RtYV9yeF9nZXQgKElGQlAgaWZicCkKK3sKK0RFU0NfU1RSQ1QgKmRlc2NwOwkvLyBwb2ludGVyIHRvIHN0YXJ0IG9mIEZyYW1lTGlzdAorCisJZGVzY3AgPSBnZXRfZnJhbWVfbHN0KCBpZmJwLCBETUFfUlggKTsKKwlpZiAoIGRlc2NwICYmIGRlc2NwLT5idWZfYWRkciApICAvLyFiZSBhd2FyZSBvZiB0aGUgbWlzc2luZyBjdXJseSBicmFja2V0CisKKwkJCQkJCQkJCQkJLy9za2lwIGRlY2Fwc3VsYXRpb24gYXQgY29uZmluZWQgZGVzY3JpcHRvcgorI2lmIChIQ0ZfRU5DQVApID09IEhDRl9FTkMKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCisJaWYgKCBpZmJwLT5JRkJfQ0tJUFN0YXQgPT0gSENGX0FDVF9DQ1hfT0ZGICkKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKKyAgICB7CitpbnQgaTsKK0RFU0NfU1RSQ1QgKnAgPSBkZXNjcC0+bmV4dF9kZXNjX2FkZHI7CS8vcG9pbnRlciB0byAybmQgZGVzY3JpcHRvciBvZiBmcmFtZQorCQlIQ0ZBU1NFUlQocCwgMCkKKwkJLy8gVGhlIDJuZCBkZXNjcmlwdG9yIGNvbnRhaW5zIChtYXliZSkgYSBTTkFQIGhlYWRlciBwbHVzIHBhcnQgb3Igd2hvbGUgb2YgdGhlIHBheWxvYWQuCisJCS8vZGV0ZXJtaW5lIGRlY2Fwc3VsYXRpb24gc3ViLWZsYWcgaW4gUnhGUworCQlpID0gKih3Y2lfcmVjb3JkcCkmZGVzY3AtPmJ1Zl9hZGRyW0hGU19TVEFUXSAmICggSEZTX1NUQVRfTVNHX1RZUEUgfCBIRlNfU1RBVF9FUlIgKTsKKwkJaWYgKCBpID09IEhGU19TVEFUX1RVTk5FTCB8fAorCQkJICggaSA9PSBIRlNfU1RBVF8xMDQyICYmIGhjZl9lbmNhcCggKHdjaV9idWZwKSZwLT5idWZfYWRkcltIQ0ZfREFTQV9TSVpFXSApICE9IEVOQ19UVU5ORUwgKSkgeworCQkJLy8gVGhlIDJuZCBkZXNjcmlwdG9yIGNvbnRhaW5zIGEgU05BUCBoZWFkZXIgcGx1cyBwYXJ0IG9yIHdob2xlIG9mIHRoZSBwYXlsb2FkLgorCQkJSENGQVNTRVJUKCBwLT5CVUZfQ05UID09IChwLT5idWZfYWRkcls1XSArIChwLT5idWZfYWRkcls0XTw8OCkgKyAyKjYgKyAyIC0gOCksIHAtPkJVRl9DTlQgKQorCQkJLy8gcGVyZm9ybSBkZWNhcHN1bGF0aW9uCisJCQlIQ0ZBU1NFUlQocC0+QlVGX1NJWkUgPj04LCBwLT5CVUZfU0laRSkKKwkJCS8vIG1vdmUgU0FbMjo1XSBpbiB0aGUgc2Vjb25kIGJ1ZmZlciB0byByZXBsYWNlIHBhcnQgb2YgdGhlIFNOQVAgaGVhZGVyCisJCQlmb3IgKCBpPTM7IGkgPj0gMDsgaS0tKSBwLT5idWZfYWRkcltpKzhdID0gcC0+YnVmX2FkZHJbaV07CisJCQkvLyBjb3B5IERBWzA6NV0sIFNBWzA6MV0gZnJvbSBmaXJzdCBidWZmZXIgdG8gc2Vjb25kIGJ1ZmZlcgorCQkJZm9yICggaT0wOyBpPDg7IGkrKykgcC0+YnVmX2FkZHJbaV0gPSBkZXNjcC0+YnVmX2FkZHJbSEZTX0FERFJfREVTVCArIGldOworCQkJLy8gbWFrZSBmaXJzdCBidWZmZXIgc2hvcnRlciBpbiBjb3VudAorCQkJZGVzY3AtPkJVRl9DTlQgPSBIRlNfQUREUl9ERVNUOworCQl9CisJfQorI2VuZGlmIC8vIEhDRl9FTkMKKwlpZiAoIGRlc2NwID09IE5VTEwgKSBpZmJwLT5JRkJfRG1hUGFja2V0cyAmPSAoaGNmXzE2KX5IUkVHX0VWX1JETUFEOyAgLy87P2NvdWxkIGJlIGludGVncmF0ZWQgaW50byBnZXRfZnJhbWVfbHN0CisJSENGTE9HRVhJVCggSENGX1RSQUNFX0RNQV9SWF9HRVQgKQorCXJldHVybiBkZXNjcDsKK30gLy8gaGNmX2RtYV9yeF9nZXQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLk1PRFVMRQkJdm9pZCBoY2ZfZG1hX3J4X3B1dCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCApCisqLlBVUlBPU0UJCXN1cHBseSBidWZmZXJzIGZvciByZWNlaXZlIHB1cnBvc2VzLgorKgkJCQlzdXBwbHkgdGhlIFJ4LURFTFdBIGRlc2NyaXB0b3IuCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoJZGVzY3AJCWFkZHJlc3Mgb2YgYSBEZXNjcmlwdG9yTGlzdAorKgorKi5SRVRVUk5TCQlOLkEuCisqCisqLkRFU0NSSVBUSU9OCisqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBNU0YgdG8gc3VwcGx5IHRoZSBIQ0Ygd2l0aCBuZXcvbW9yZSBidWZmZXJzIGZvciByZWNlaXZlIHB1cnBvc2VzLgorKiBUaGUgSENGIGNhbiBiZSB1c2VkIGluIDIgZmFzaGlvbnM6IHdpdGggYW5kIHdpdGhvdXQgZW5jYXBzdWxhdGlvbiBmb3IgZGF0YSB0cmFuc2Zlci4KKyogVGhpcyBpcyBjb250cm9sbGVkIGF0IGNvbXBpbGUgdGltZSBieSB0aGUgSENGX0VOQyBiaXQgb2YgdGhlIEhDRl9FTkNBUCBzeXN0ZW0gY29uc3RhbnQuCisqIEFzIGEgY29uc2VxdWVuY2UsIHNvbWUgYWRkaXRpb25hbCBjb25zdGFpbnRzIGFwcGx5IHRvIHRoZSBudW1iZXIgb2YgZGVzY3JpcHRvciBhbmQgdGhlIGJ1ZmZlcnMgYXNzb2NpYXRlZAorKiB3aXRoIHRoZSBmaXJzdCAyIGRlc2NyaXB0b3JzLiBJbmRlcGVuZGVudCBvZiB0aGUgZW5jYXBzdWxhdGlvbiBmZWF0dXJlLCB0aGUgQ09VTlQgZmllbGRzIGFyZSBpZ25vcmVkLgorKiBBIHNwZWNpYWwgY2FzZSBpcyB0aGUgc3VwcGx5aW5nIG9mIHRoZSBERUxXQSBkZXNjcmlwdG9yLCB3aGljaCBtdXN0IGJlIHN1cHBsaWVkIGFzIHRoZSBmaXJzdCBkZXNjcmlwdG9yLgorKgorKiBBc3NlcnQgZmFpbHMgaWYKKyogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCisqIC0gTklDIGludGVycnVwdHMgYXJlIG5vdCBkaXNhYmxlZCB3aGlsZSByZXF1aXJlZCBieSBwYXJhbWV0ZXIgYWN0aW9uLgorKiAtIGluIGNhc2UgZGVjYXBzdWxhdGlvbiBieSB0aGUgSENGIGlzIHNlbGVjdGVkOgorKgkgIC0JVGhlIGZpcnN0IGRhdGFidWZmZXIgZG9lcyBub3QgaGF2ZSB0aGUgZXhhY3Qgc2l6ZSBjb3JyZXNwb25kaW5nIHdpdGggdGhlIFJ4RlMgdXAgdG8gdGhlIDgwMi4zIERlc3RBZGRyCisqCQlmaWVsZCAoPT0gMjkgd29yZHMpLgorKgkgIC0JVGhlIEZyYW1lTGlzdCBkb2VzIG5vdCBjb25zaXN0cyBvZiBhdCBsZWFzdCAyIERlc2NyaXB0b3JzLgorKgkgIC0JVGhlIHNlY29uZCBkYXRhYnVmZmVyIGRvZXMgbm90IGhhdmUgdGhlIG1pbmltdW0gc2l6ZSBvZiA4IGJ5dGVzLgorKiEhIFRoZSAybmQgcGFydCBvZiB0aGUgbGlzdCBvZiBhc3NlcnRzIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBwdXRfZnJhbWVfbHN0LCBpbiBvcmRlciB0byBnZXQKKyohISB0aGVtIGluIHRoZSBXQ0ktc3BlYyAhISEhCisqIC0gRE1BIGlzIG5vdCBlbmFibGVkCisqIC0gZGVzY3JpcHRvciBsaXN0IGlzIE5VTEwKKyogLSBhIGRlc2NyaXB0b3IgaW4gdGhlIGRlc2NyaXB0b3IgbGlzdCBpcyBub3QgZG91YmxlIHdvcmQgYWxpZ25lZAorKiAtIGEgY291bnQgb2Ygc2l6ZSBmaWVsZCBvZiBhIGRlc2NyaXB0b3IgY29udGFpbnMgY29udHJvbCBiaXRzLCBpLmUuIGJpdHMgaW4gdGhlIGhpZ2ggb3JkZXIgbmliYmxlLgorKiAtIHRoZSBERUxXQSBkZXNjcmlwdG9yIGlzIG5vdCBhICJzaW5nbGV0b24iIERlc2NyaXB0b3JMaXN0LgorKiAtIHRoZSBERUxXQSBkZXNjcmlwdG9yIGlzIG5vdCB0aGUgZmlyc3QgRGVzY3JpcHRvciBzdXBwbGllZAorKiAtIGEgbm9uX0RNQSBkZXNjcmlwdG9yIGlzIHN1cHBsaWVkIGJlZm9yZSB0aGUgREVMV0EgRGVzY3JpcHRvciBpcyBzdXBwbGllZAorKiEhIC0gUG9zc2libHkgbW9yZSBjaGVja3MgY291bGQgYmUgYWRkZWQgISEhISEhISEhISEhIQorKgorKi5ESUFHUkFNCisqCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAoraGNmX2RtYV9yeF9wdXQoIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AgKQoreworCisJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9ETUFfUlhfUFVULCAweERBMDEgKQorCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICkKKwlIQ0ZBU1NFUlRfSU5UCisKKwlwdXRfZnJhbWVfbHN0KCBpZmJwLCBkZXNjcCwgRE1BX1JYICk7CisjaWYgSENGX0FTU0VSVCAmJiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCisJaWYgKCBkZXNjcC0+YnVmX2FkZHIgKSB7CisJCUhDRkFTU0VSVCggZGVzY3AtPkJVRl9TSVpFID09IEhDRl9ETUFfUlhfQlVGMV9TSVpFLCBkZXNjcC0+QlVGX1NJWkUgKQorCQlIQ0ZBU1NFUlQoIGRlc2NwLT5uZXh0X2Rlc2NfYWRkciwgMCApIC8vIGZpcnN0IGRlc2NyaXB0b3Igc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFub3RoZXIgZGVzY3JpcHRvcgorCQkvLyBUaGUgc2Vjb25kIERCIGlzIGZvciBTTkFQIGFuZCBwYXlsb2FkIHB1cnBvc2VzLiBJdCBzaG91bGQgYmUgYSBtaW5pbXVtIG9mIDEyIGJ5dGVzIGluIHNpemUuCisJCUhDRkFTU0VSVCggZGVzY3AtPm5leHRfZGVzY19hZGRyLT5CVUZfU0laRSA+PSAxMiwgZGVzY3AtPm5leHRfZGVzY19hZGRyLT5CVUZfU0laRSApCisJfQorI2VuZGlmIC8vIEhDRkFTU0VSVCAvIEhDRl9FTkMKKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfRE1BX1JYX1BVVCApCit9IC8vIGhjZl9kbWFfcnhfcHV0CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5NT0RVTEUJCURFU0NfU1RSQ1QqIGhjZl9kbWFfdHhfZ2V0KCBJRkJQIGlmYnAgKQorKi5QVVJQT1NFCQlETUEgbW9kZTogcmVjbGFpbXMgYW5kIGRlY2Fwc3VsYXRlcyBwYWNrZXRzIGluIHRoZSB0eCBkZXNjcmlwdG9yIGNoYWluIGlmOgorKgkJCQkgLSBBIFR4IHBhY2tldCBoYXMgYmVlbiBjb3BpZWQgZnJvbSBob3N0LVJBTSBpbnRvIE5JQy1SQU0gYnkgdGhlIERNQSBlbmdpbmUKKyoJCQkJIC0gVGhlIEhlcm1lcy9ETUFlbmdpbmUgaGF2ZSBiZWVuIGRpc2FibGVkCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoKKyouUkVUVVJOUworKglwb2ludGVyIHRvIGEgcmVjbGFpbWVkIFR4IHBhY2tldC4KKyoKKyouREVTQ1JJUFRJT04KKyogaW1wYWN0IG9mIHRoZSBkaXNhYmxlIGNvbW1hbmQ6CisqIFdoZW4gYSBub24tZW1wdHkgcG9vbCBvZiBUeCBkZXNjcmlwdG9ycyBleGlzdHMgKGNyZWF0ZWQgYnkgbWVhbnMgb2YgaGNmX2RtYV9wdXRfdHgpLCB0aGUgTVNGCisqIGlzIHN1cHBvc2VkIHRvIGVtcHR5IHRoYXQgcG9vbCBieSBtZWFucyBvZiBoY2ZfZG1hX3R4X2dldCBjYWxscyBhZnRlciB0aGUgZGlzYWJsZSBpbiBhbgorKiBkaXNhYmxlL2VuYWJsZSBzZXF1ZW5jZS4KKyoKKyouRElBR1JBTQorKgorKi5OT1RJQ0UKKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitERVNDX1NUUkNUKgoraGNmX2RtYV90eF9nZXQoIElGQlAgaWZicCApCit7CitERVNDX1NUUkNUICpkZXNjcDsJLy8gcG9pbnRlciB0byBzdGFydCBvZiBGcmFtZUxpc3QKKworCWRlc2NwID0gZ2V0X2ZyYW1lX2xzdCggaWZicCwgRE1BX1RYICk7CisJaWYgKCBkZXNjcCAmJiBkZXNjcC0+YnVmX2FkZHIgKSAgLy8hYmUgYXdhcmUgb2YgdGhlIG1pc3NpbmcgY3VybHkgYnJhY2tldAorCQkJCQkJCQkJCQkvL3NraXAgZGVjYXBzdWxhdGlvbiBhdCBjb25maW5lZCBkZXNjcmlwdG9yCisjaWYgKEhDRl9FTkNBUCkgPT0gSENGX0VOQworCQlpZiAoICggZGVzY3AtPkJVRl9DTlQgPT0gSEZTX1RZUEUgKQorI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9DQ1gKKwkJCSB8fCAoIGRlc2NwLT5CVUZfQ05UID09IEhGU19EQVQgKQorI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAorCQkpIHsgLy8gcGVyZm9ybSBkZWNhcHN1bGF0aW9uIGlmIG5lZWRlZAorCQkJZGVzY3AtPm5leHRfZGVzY19hZGRyLT5idWZfcGh5c19hZGRyIC09IEhDRl9EQVNBX1NJWkU7CisJCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPkJVRl9DTlQgCQkgKz0gSENGX0RBU0FfU0laRTsKKwkJfQorI2VuZGlmIC8vIEhDRl9FTkMKKwlpZiAoIGRlc2NwID09IE5VTEwgKSB7ICAvLzs/Y291bGQgYmUgaW50ZWdyYXRlZCBpbnRvIGdldF9mcmFtZV9sc3QKKwkJaWZicC0+SUZCX0RtYVBhY2tldHMgJj0gKGhjZl8xNil+SFJFR19FVl9URE1BRDsKKwl9CisJSENGTE9HRVhJVCggSENGX1RSQUNFX0RNQV9UWF9HRVQgKQorCXJldHVybiBkZXNjcDsKK30gLy8gaGNmX2RtYV90eF9nZXQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLk1PRFVMRQkJdm9pZCBoY2ZfZG1hX3R4X3B1dCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgaGNmXzE2IHR4X2NudGwgKQorKi5QVVJQT1NFCQlwdXRzIGEgcGFja2V0IGluIHRoZSBUeCBETUEgcXVldWUgaW4gaG9zdCByYW0gYW5kIGtpY2tzIG9mZiB0aGUgVHhEbWEgZW5naW5lLgorKgkJCQlzdXBwbHkgdGhlIFR4LURFTFdBIGRlc2NyaXB0b3IuCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoJZGVzY3AJCWFkZHJlc3Mgb2YgVHggRGVzY3JpcHRvciBDaGFpbiAoaS5lLiBhIHNpbmdsZSBUeCBmcmFtZSkKKyoJdHhfY250bAkJaW5kaWNhdGVzIE1BQy1wb3J0IGFuZCAoSGVybWVzKSBvcHRpb25zCisqCisqLlJFVFVSTlMJCU4uQS4KKyoKKyouREVTQ1JJUFRJT04KKyogVGhlIEhDRiBjYW4gYmUgdXNlZCBpbiAyIGZhc2hpb25zOiB3aXRoIGFuZCB3aXRob3V0IGVuY2Fwc3VsYXRpb24gZm9yIGRhdGEgdHJhbnNmZXIuCisqIFRoaXMgaXMgY29udHJvbGxlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIEhDRl9FTkMgYml0IG9mIHRoZSBIQ0ZfRU5DQVAgc3lzdGVtIGNvbnN0YW50LgorKgorKiBSZWdhcmRsZXNzIG9mIHRoZSBIQ0ZfRU5DQVAgc3lzdGVtIGNvbnN0YW50LCB0aGUgZGVzY3JpcHRvciBsaXN0IGNyZWF0ZWQgdG8gZGVzY3JpYmUgdGhlIGZyYW1lIHRvIGJlCisqIHRyYW5zbWl0dGVkLCBtdXN0IHN1cHBseSBzcGFjZSB0byBjb250YWluIHRoZSA4MDIuMTEgaGVhZGVyLCBwcmVjZWRpbmcgdGhlIGFjdHVhbCBmcmFtZSB0byBiZSB0cmFuc21pdHRlZC4KKyogQmFzaWNhbGx5LCB0aGlzIG9ubHkgc3VwcGxpZXMgd29ya2luZyBzdG9yYWdlIHRvIHRoZSBIQ0Ygd2hpY2ggcGFzc2VzIHRoaXMgb24gdG8gdGhlIERNQSBlbmdpbmUuCisqIEFzIGEgY29uc2VxdWVuY2UgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc3BhY2UgZG8gbm90IG1hdHRlci4KKyogTmV2ZXJ0aGVsZXNzIEJVRl9DTlQgbXVzdCB0YWtlIGluIGFjY291bnQgdGhpcyBzdG9yYWdlLgorKiBUaGlzIHdvcmtpbmcgc3BhY2UgdG8gY29udGFpbiB0aGUgODAyLjExIGhlYWRlciBtYXkgbm90IGJlIGZyYWdtZW50ZWQsIHRoZSBmaXJzdCBidWZmZXIgbXVzdCBiZQorKiBzdWZmaWNpZW50bHkgbGFyZ2UgdG8gY29udGFpbiBhdCBsZWFzdCB0aGUgODAyLjExIGhlYWRlciwgaS5lLiBIRlNfQUREUl9ERVNUICgyOSB3b3JkcyBvciAweDNBIGJ5dGVzKS4KKyogVGhpcyB3YXksIHRoZSBIQ0YgY2FuIHNpbXBseSwgcmVnYXJkbGVzcyB3aGV0aGVyIG9yIG5vdCB0aGUgSENGIGVuY2Fwc3VsYXRlcyB0aGUgZnJhbWUsIHdyaXRlIHRoZSBwYXJhbWV0ZXIKKyogdHhfY250bCBhdCBvZmZzZXQgMHgzNiAoSEZTX1RYX0NOVEwpIGluIHRoZSBmaXJzdCBidWZmZXIuCisqIE5vdGUgdGhhdCBpdCBpcyBhbGxvd2VkIHRvIGhhdmUgcGFydCBvciBhbGwgb2YgdGhlIGFjdHVhbCBmcmFtZSByZXByZXNlbnRlZCBieSB0aGUgZmlyc3QgZGVzY3JpcHRvciBhcyBsb25nCisqIGFzIHRoZSByZXF1aXJlbWVudCBmb3Igc3RvcmFnZSBmb3IgdGhlIDgwMi4xMSBoZWFkZXIgaXMgbWV0LCBpLmUuIHRoZSA4MDIuMyBmcmFtZSBzdGFydHMgYXQgb2Zmc2V0CisqIEhGU19BRERSX0RFU1QuCisqIEV4Y2VwdCBmb3IgdGhlIEFzc2VydCBvbiB0aGUgMXN0IGJ1ZmZlciBpbiBjYXNlIG9mIEVuY2Fwc3VhbHRpb24sIHRoZSBTSVpFIGZpZWxkcyBhcmUgaWdub3JlZC4KKyoKKyogSW4gY2FzZSB0aGUgZW5jYXBzdWxhdGlvbiBmZWF0dXJlIGlzIGNvbXBpbGVkIGluLCB0aGVyZSBhcmUgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cy4KKyogbyBUaGUgQlVGX0NOVCBvZiB0aGUgZmlyc3QgYnVmZmVyIGNoYW5nZXMgZnJvbSBhIG1pbmltdW0gb2YgMHgzQSBieXRlcyB0byBleGFjdGx5IDB4M0EsIGkuZS4gdGhlIHdvcmtzcGFjZQorKgl0byBzdG9yZSB0aGUgODAyLjExIGhlYWRlcgorKiBvIFRoZSBCVUZfU0laRSBvZiB0aGUgZmlyc3QgYnVmZmVyIGlzIGF0IGxlYXN0IHRoZSBzcGFjZSBuZWVkZWQgdG8gc3RvcmUgdGhlCisqCS0gODAyLjExIGhlYWRlciAoMjkgd29yZHMpCisqCS0gODAyLjMgaGVhZGVyLCBpLmUuIDEyIGJ5dGVzIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24gYW5kIDIgYnl0ZXMgbGVuZ3RoIGZpZWxkCisqCS0gNiBieXRlcyBTTkFQLWhlYWRlcgorKiAgIFRoaXMgcmVzdWx0cyBpbiAzOSB3b3JkcyBvciAweDRFIGJ5dGVzIG9yIEhGU19UWVBFLgorKiAgIE5vdGUgdGhhdCBpZiB0aGUgQlVGX1NJWkUgaXMgbGFyZ2VyIHRoYW4gMHg0RSwgdGhpcyBzdXJwbHVzIGlzIG5vdCB1c2VkLgorKiBvIFRoZSBhY3R1YWwgZnJhbWUgYmVnaW5zIGluIHRoZSAybmQgZGVzY3JpcHRvciAod2hpY2ggaXMgYWxyZWFkeSBpbXBsaWVkIGJ5IHRoZSBCVUZfQ05UID09IDB4M0EgcmVxdWlyZW1lbnQpIGFuZCB0aGUgYXNzb2NpYXRlZCBidWZmZXIgY29udGFpbnMgYXQgbGVhc3QgdGhlIDgwMi4zIGhlYWRlciwgaS5lLiB0aGUgMTQgYnl0ZXMgcmVwcmVzZW50aW5nIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24gYW5kIGxlbmd0aC90eXBlIGZpZWxkCisqCisqICAgV2hlbiB0aGUgSENGIGRvZXMgbm90IGVuY2Fwc3VsYXRlcyAoaS5lLiBsZW5ndGgvdHlwZSBmaWVsZCA8PSAxNTAwKSwgIG5vIGNoYW5nZXMgYXJlIG1hZGUgdG8gZGVzY3JpcHRvcnMKKyogICBvciBidWZmZXJzLgorKgorKiAgIFdoZW4gdGhlIEhDRiBhY3R1YWxseSBlbmNhcHN1bGF0ZXMgKGkuZS4gbGVuZ3RoL3R5cGUgZmllbGQgPiAxNTAwKSwgaXQgc3VjY2Vzc2l2ZWx5IHdyaXRlcywgc3RhcnRpbmcgYXQKKyogICBvZmZzZXQgSEZTX0FERFJfREVTVCAoMHgzQSkgaW4gdGhlIGZpcnN0IGJ1ZmZlcjoKKyogICAgIC0gdGhlIDgwMi4zIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24sIGNvcGllZCBmcm9tIHRoZSBiZWdpbiBvZiB0aGUgc2Vjb25kIGJ1ZmZlcgorKiAgICAgLSB0aGUgZnJhbWUgbGVuZ3RoLCBkZXJpdmVkIGZyb20gdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgaW5kaXZpZHVhbCBmcmFnbWVudHMsIGNvcnJlY3RlZCBmb3IgdGhlIFNOQVAKKyogICAJaGVhZGVyIGxlbmd0aCBhbmQgVHlwZSBmaWVsZCBhbmQgaWdub3JpbmcgdGhlIERlc3RpbmF0aW9uIEFkZHJlc3MsIFNvdXJjZSBBZGRyZXNzIGFuZCBMZW5ndGggZmllbGQKKyogCSAgLSB0aGUgYXBwcm9wcmlhdGUgc25hcCBoZWFkZXIgKFR1bm5lbCBvciAxMDQyLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSB0eXBlIGZpZWxkKS4KKyoKKyogCSBUaGUgaW5mb3JtYXRpb24gaW4gdGhlIGZpcnN0IHR3byBkZXNjcmlwdG9ycyBpcyBhZGp1c3RlZCBhY2NvcmRpbmdseToKKyogCSAgLSB0aGUgZmlyc3QgZGVzY3JpcHRvciBjb3VudCBpcyBjaGFuZ2VkIGZyb20gMHgzQSB0byAweDRFIChIRlNfVFlQRSksIHdoaWNoIG1hdGNoZXMgMHgzQSArIDEyICsgMiArIDYKKyogCSAgLSB0aGUgc2Vjb25kIGRlc2NyaXB0b3IgY291bnQgaXMgZGVjcmVhc2VkIGJ5IDEyLCBiZWluZyB0aGUgbW92ZWQgYWRkcmVzc2luZyBpbmZvcm1hdGlvbgorKiAJICAtIHRoZSBzZWNvbmQgZGVzY3JpcHRvciAocGh5c2ljYWwpIGJ1ZmZlciBhZGRyZXNzIGlzIGluY3JlYXNlZCBieSAxMi4KKyoKKyogV2hlbiB0aGUgZGVzY3JpcHRvcnMgYXJlIHJldHVybmVkIGJ5IGhjZl9kbWFfdHhfZ2V0LCB0aGUgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGZpcnN0IHR3byBkZXNjcmlwdG9ycyBpcworKiB1bmRvbmUuCisqCisqIFVuZGVyIGFueSBvZiB0aGUgYWJvdmUgc2NlbmFyaW9zLCB0aGUgYXNzZXJ0IEJVRl9DTlQgPD0gQlVGX1NJWkUgbXVzdCBiZSB0cnVlIGZvciBhbGwgZGVzY3JpcHRvcnMKKyogSW4gY2FzZSBvZiBlbmNhcHN1bGF0aW9uLCBCVUZfU0laRSBvZiB0aGUgMXN0IGRlc2NyaXB0b3IgaXMgYXNzZXJ0ZWQgdG8gYmUgYXQgbGVhc3QgSEZTX1RZUEUgKDB4NEUpLCBzbyBpdCBpcyBOT1QgdGVzdGVkLgorKgorKiBBc3NlcnQgZmFpbHMgaWYKKyogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCisqIC0gdHhfY250bCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgorKiAtIE5JQyBpbnRlcnJ1cHRzIGFyZSBub3QgZGlzYWJsZWQgd2hpbGUgcmVxdWlyZWQgYnkgcGFyYW1ldGVyIGFjdGlvbi4KKyogLSBpbiBjYXNlIGVuY2Fwc3VsYXRpb24gYnkgdGhlIEhDRiBpcyBzZWxlY3RlZDoKKyoJICAtCVRoZSBGcmFtZUxpc3QgZG9lcyBub3QgY29uc2lzdHMgb2YgYXQgbGVhc3QgMiBEZXNjcmlwdG9ycy4KKyoJICAtCVRoZSBmaXJzdCBkYXRhYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gZXhhY3RseSB0aGUgKHNwYWNlIGZvcikgdGhlIDgwMi4xMSBoZWFkZXIgKD09IDI4IHdvcmRzKQorKgkgIC0JVGhlIGZpcnN0IGRhdGFidWZmZXIgZG9lcyBub3QgaGF2ZSBhIHNpemUgdG8gYWRkaXRpb25hbGx5IGFjY29tb2RhdGUgdGhlIDgwMi4zIGhlYWRlciBhbmQgdGhlCisqCQlTTkFQIGhlYWRlciBvZiB0aGUgZnJhbWUgYWZ0ZXIgZW5jYXBzdWxhdGlvbiAoPT0gMzkgd29yZHMpLgorKgkgIC0JVGhlIHNlY29uZCBkYXRhYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gYXQgbGVhc3QgREEsIFNBIGFuZCAndHlwZS9sZW5ndGgnICg9PTE0IGJ5dGVzIG9yIDcgd29yZHMpCisqISEgVGhlIDJuZCBwYXJ0IG9mIHRoZSBsaXN0IG9mIGFzc2VydHMgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHB1dF9mcmFtZV9sc3QsIGluIG9yZGVyIHRvIGdldAorKiEhIHRoZW0gaW4gdGhlIFdDSS1zcGVjICEhISEKKyogLSBETUEgaXMgbm90IGVuYWJsZWQKKyogLSBkZXNjcmlwdG9yIGxpc3QgaXMgTlVMTAorKiAtIGEgZGVzY3JpcHRvciBpbiB0aGUgZGVzY3JpcHRvciBsaXN0IGlzIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCisqIC0gYSBjb3VudCBvZiBzaXplIGZpZWxkIG9mIGEgZGVzY3JpcHRvciBjb250YWlucyBjb250cm9sIGJpdHMsIGkuZS4gYml0cyBpbiB0aGUgaGlnaCBvcmRlciBuaWJibGUuCisqIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IGEgInNpbmdsZXRvbiIgRGVzY3JpcHRvckxpc3QuCisqIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IHRoZSBmaXJzdCBEZXNjcmlwdG9yIHN1cHBsaWVkCisqIC0gYSBub25fRE1BIGRlc2NyaXB0b3IgaXMgc3VwcGxpZWQgYmVmb3JlIHRoZSBERUxXQSBEZXNjcmlwdG9yIGlzIHN1cHBsaWVkCisqISEgLSBQb3NzaWJseSBtb3JlIGNoZWNrcyBjb3VsZCBiZSBhZGRlZCAhISEhISEhISEhISEhCisqLkRJQUdSQU0KKyoKKyouTk9USUNFCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKgorKjE6CVdyaXRlIHR4X2NudGwgcGFyYW1ldGVyIHRvIEhGU19UWF9DTlRMIGZpZWxkIGludG8gdGhlIEhlcm1lcy1zcGVjaWZpYyBoZWFkZXIgaW4gYnVmZmVyIDEKKyo0OglkZXRlcm1pbmUgd2hldGhlciBlbmNhcHN1bGF0aW9uIGlzIG5lZWRlZCBhbmQgd3JpdGUgdGhlIHR5cGUgKHR1bm5lbCBvciAxMDQyKSBhbHJlYWR5IGF0IHRoZSBhcHByb3ByaWF0ZQorKglvZmZzZXQgaW4gdGhlIDFzdCBidWZmZXIKKyo2OglCdWlsZCB0aGUgZW5jYXBzdWFsdGlvbiBlbnZlbG9wcGUgaW4gdGhlIGZyZWUgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgMXN0IGJ1ZmZlcgorKgktIENvcHkgREEvU0EgZmllbGRzIGZyb20gdGhlIDJuZCBidWZmZXIKKyogICAtIENhbGN1bGF0ZSB0b3RhbCBsZW5ndGggb2YgdGhlIG1lc3NhZ2UgKHNuYXAtaGVhZGVyICsgdHlwZS1maWVsZCArIHRoZSBsZW5ndGggb2YgYWxsIGJ1ZmZlciBmcmFnbWVudHMKKyogICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgODAyLjMgZnJhbWUgKGkuZSBhbGwgZGVzY3JpcHRvcnMgZXhjZXB0IHRoZSBmaXJzdCksIGJ1dCBub3QgdGhlIERlc3RpbmF0aW9uQWRkcmVzcywKKyogICAgIFNvdXJjZUFkZHJlc3MgYW5kIGxlbmdodC1maWVsZCkKKyogICAgIEFzc2VydCB0aGUgbWVzc2FnZSBsZW5ndGgKKyoJICBXcml0ZSBsZW5ndGguIE5vdGUgdGhhdCB0aGUgbWVzc2FnZSBpcyBpbiBCRSBmb3JtYXQsIGhlbmNlIG9uIExFIHBsYXRmb3JtcyB0aGUgbGVuZ3RoIG11c3QgYmUgY29udmVydGVkCisqCSAgOz8gVEhJUyBJUyBOT1QgV0hBVCBDVVJSRU5UTFkgSVMgSU1QTEVNRU5URUQKKyoJLSBXcml0ZSBzbmFwIGhlYWRlci4gTm90ZSB0aGF0IHRoZSBsYXN0IGJ5dGUgb2YgdGhlIHNuYXAgaGVhZGVyIGlzIE5PVCBjb3BpZWQsIHRoYXQgYnl0ZSBpcyBhbHJlYWR5IGluCisqCSAgcGxhY2UgYXMgcmVzdWx0IG9mIHRoZSBjYWxsIHRvIGhjZl9lbmNhcC4KKyoJTm90ZSB0aGF0IHRoZXJlIGFyZSBtYW55IHdheXMgdG8gc2tpbiBhIGNhdC4gVG8gZXhwcmVzcyB0aGUgb2Zmc2V0cyBpbiB0aGUgMXN0IGJ1ZmZlciB3aGlsZSB3cml0aW5nCisqCXRoZSBzbmFwIGhlYWRlciwgSEZTX1RZUEUgaXMgY2hvb3NlbiBhcyBhIHJlZmVyZW5jZSBwb2ludCB0byBtYWtlIGl0IGVhc2llciB0byBncmFzcCB0aGF0IHRoZSBzbmFwIGhlYWRlcgorKglhbmQgZW5jYXBzdWFsdGlvbiB0eXBlIGFyZSBhdCBsZWFzdCByZWxhdGl2ZSBpbiB0aGUgcmlnaHQuCisqODoJbW9kaWZ5IDFzdCBkZXNjcmlwdG9yIHRvIHJlZmxlY3QgbW92ZWQgcGFydCBvZiB0aGUgODAyLjMgaGVhZGVyICsgU25hcC1oZWFkZXIKKyoJbW9kaWZ5IDJuZCBkZXNjcmlwdG9yIHRvIHNraXAgdGhlIG1vdmVkIHBhcnQgb2YgdGhlIDgwMi4zIGhlYWRlciAoREEvU0EKKyoxMDogc2V0IGVhY2ggZGVzY3JpcHRvciB0byAnRE1BIG93bmVkJywgIGNsZWFyIGFsbCBvdGhlciBjb250cm9sIGJpdHMuCisqCVNldCBTT1AgYml0IG9uIGZpcnN0IGRlc2NyaXB0b3IuIFNldCBFT1AgYml0IG9uIGxhc3QgZGVzY3JpcHRvci4KKyoxMjogRWl0aGVyIGFwcGVuZCB0aGUgY3VycmVudCBmcmFtZSB0byBhbiBleGlzdGluZyBkZXNjcmlwdG9yIGxpc3Qgb3IKKyoxNDogY3JlYXRlIGEgbGlzdCBiZWdpbm5pbmcgd2l0aCB0aGUgY3VycmVudCBmcmFtZQorKjE2OiByZW1lbWJlciB0aGUgbmV3IGVuZCBvZiB0aGUgbGlzdAorKjIwOiBoYW5kIHRoZSBmcmFtZSBvdmVyIHRvIHRoZSBETUEgZW5naW5lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitoY2ZfZG1hX3R4X3B1dCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgaGNmXzE2IHR4X2NudGwgKQoreworREVTQ19TVFJDVAkqcCA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkcjsKK2ludAkJCWk7CisKKyNpZiBIQ0ZfQVNTRVJUCisJaW50IHggPSBpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkID09IENPTVBfSURfRldfQVAgPyB0eF9jbnRsICYgfkhGU19UWF9DTlRMX1BPUlQgOiB0eF9jbnRsOworCUhDRkFTU0VSVCggKHggJiB+SENGX1RYX0NOVExfTUFTSyApID09IDAsIHR4X2NudGwgKQorI2VuZGlmIC8vIEhDRl9BU1NFUlQKKwlIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0RNQV9UWF9QVVQsIDB4REEwMyApCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQorCUhDRkFTU0VSVF9JTlQKKwlIQ0ZBU1NFUlQoICggaWZicC0+SUZCX0NudGxPcHQgJiAoVVNFX0RNQXxETUFfRU5BQkxFRCkgKSA9PSAoVVNFX0RNQXxETUFfRU5BQkxFRCksIGlmYnAtPklGQl9DbnRsT3B0KQorCisJaWYgKCBkZXNjcC0+YnVmX2FkZHIgKSB7CisJCSooaGNmXzE2KikoZGVzY3AtPmJ1Zl9hZGRyICsgSEZTX1RYX0NOVEwpID0gdHhfY250bDsJCQkJCQkJCQkJCS8qMSovCisjaWYgKEhDRl9FTkNBUCkgPT0gSENGX0VOQworCQlIQ0ZBU1NFUlQoIGRlc2NwLT5uZXh0X2Rlc2NfYWRkciwgMCApCQkJCQkJCQkJLy9hdCBsZWFzdCAyIGRlc2NyaXBvcnMKKwkJSENGQVNTRVJUKCBkZXNjcC0+QlVGX0NOVCA9PSBIRlNfQUREUl9ERVNULCBkZXNjcC0+QlVGX0NOVCApCS8vZXhhY3QgbGVuZ3RoIHJlcXVpcmVkIGZvciAxc3QgYnVmZmVyCisJCUhDRkFTU0VSVCggZGVzY3AtPkJVRl9TSVpFID49IEhDRl9ETUFfVFhfQlVGMV9TSVpFLCBkZXNjcC0+QlVGX1NJWkUgKQkvL21pbmltYWwgc3RvcmFnZSBmb3IgZW5jYXBzdWxhdGlvbgorCQlIQ0ZBU1NFUlQoIHAtPkJVRl9DTlQgPj0gMTQsIHAtPkJVRl9DTlQgKTsJCQkJCS8vYXQgbGVhc3QgREEsIFNBIGFuZCAndHlwZScgaW4gMm5kIGJ1ZmZlcgorCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAorCQkvKiBpZiB3ZSBhcmUgZG9pbmcgUFBLICsvLSBDTUlDLCBvciB3ZSBhcmUgc2VuZGluZyBhIEREUCBmcmFtZSAqLworCQlpZiAoICggaWZicC0+SUZCX0NLSVBTdGF0ID09IEhDRl9BQ1RfQ0NYX09OICkgfHwKKwkJCSAoICggcC0+QlVGX0NOVCA+PSAyMCApCQkgJiYgKCBpZmJwLT5JRkJfQ0tJUFN0YXQgPT0gSENGX0FDVF9DQ1hfT0ZGICkgJiYKKwkJCSAoIHAtPmJ1Zl9hZGRyWzEyXSA9PSAweEFBICkgJiYgKCBwLT5idWZfYWRkclsxM10gPT0gMHhBQSApICYmCisJCQkgKCBwLT5idWZfYWRkclsxNF0gPT0gMHgwMyApICYmICggcC0+YnVmX2FkZHJbMTVdID09IDB4MDAgKSAmJgorCQkJICggcC0+YnVmX2FkZHJbMTZdID09IDB4NDAgKSAmJiAoIHAtPmJ1Zl9hZGRyWzE3XSA9PSAweDk2ICkgJiYKKwkJCSAoIHAtPmJ1Zl9hZGRyWzE4XSA9PSAweDAwICkgJiYgKCBwLT5idWZfYWRkclsxOV0gPT0gMHgwMCApKSkKKwkJeworCQkJLyogY29weSB0aGUgREEvU0EgdG8gdGhlIGZpcnN0IGJ1ZmZlciAqLworCQkJZm9yICggaSA9IDA7IGkgPCBIQ0ZfREFTQV9TSVpFOyBpKysgKSB7CisJCQkJZGVzY3AtPmJ1Zl9hZGRyW2kgKyBIRlNfQUREUl9ERVNUXSA9IHAtPmJ1Zl9hZGRyW2ldOworCQkJfQorCQkJLyogY2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIHNlY29uZCBmcmFnbWVudCBvbmx5ICovCisJCQlpID0gMDsKKwkJCWRvIHsgaSArPSBwLT5CVUZfQ05UOyB9IHdoaWxlKCBwID0gcC0+bmV4dF9kZXNjX2FkZHIgKTsKKwkJCWkgLT0gSENGX0RBU0FfU0laRSA7CisJCQkvKiBjb252ZXJ0IHRoZSBsZW5ndGggZmllbGQgdG8gYmlnIGVuZGlhbiwgdXNpbmcgdGhlIGVuZGlhbiBmcmllbmRseSBtYWNyb3MgKi8KKwkJCWkgPSBDTlZfU0hPUlRfVE9fQklHKGkpOwkJLy8hISB0aGlzIGNvbnZlcnRzIE9OTFkgb24gTEUgcGxhdGZvcm1zLCBob3cgZG9lcyB0aGF0IHJlbGF0ZSB0byB0aGUgbm9uLUNDWCBjb2RlCisJCQkqKGhjZl8xNiopKCZkZXNjcC0+YnVmX2FkZHJbSEZTX0xFTl0pID0gKGhjZl8xNilpOworCQkJZGVzY3AtPkJVRl9DTlQgPSBIRlNfREFUOworCQkJLy8gbW9kaWZ5IDJuZCBkZXNjcmlwdG9yIHRvIHNraXAgdGhlICdEYS9TYScgZmllbGRzCisJCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9waHlzX2FkZHIgKz0gSENGX0RBU0FfU0laRTsKKwkJCWRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+QlVGX0NOVAkJIC09IEhDRl9EQVNBX1NJWkU7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAorCQl7CisJCQlkZXNjcC0+YnVmX2FkZHJbSEZTX1RZUEUtMV0gPSBoY2ZfZW5jYXAoJmRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+YnVmX2FkZHJbSENGX0RBU0FfU0laRV0pOwkJLyo0Ki8KKwkJCWlmICggZGVzY3AtPmJ1Zl9hZGRyW0hGU19UWVBFLTFdICE9IEVOQ19OT05FICkgeworCQkJCWZvciAoIGk9MDsgaSA8IEhDRl9EQVNBX1NJWkU7IGkrKyApIHsJCQkJCQkJCQkJCQkJCS8qNiovCisJCQkJCWRlc2NwLT5idWZfYWRkcltpICsgSEZTX0FERFJfREVTVF0gPSBkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9hZGRyW2ldOworCQkJCX0KKwkJCQlpID0gc2l6ZW9mKHNuYXBfaGVhZGVyKSArIDIgLSAoIDIqNiArIDIgKTsKKwkJCQlkbyB7IGkgKz0gcC0+QlVGX0NOVDsgfSB3aGlsZSAoICggcCA9IHAtPm5leHRfZGVzY19hZGRyICkgIT0gTlVMTCApOworCQkJCSooaGNmXzE2KikoJmRlc2NwLT5idWZfYWRkcltIRlNfTEVOXSkgPSBDTlZfRU5EX1NIT1JUKGkpOwkvLyEhIHRoaXMgY29udmVydHMgb24gQUxMIHBsYXRmb3JtcywgaG93IGRvZXMgdGhhdCByZWxhdGUgdG8gdGhlIENDWCBjb2RlCisJCQkJZm9yICggaT0wOyBpIDwgc2l6ZW9mKHNuYXBfaGVhZGVyKSAtIDE7IGkrKykgeworCQkJCQlkZXNjcC0+YnVmX2FkZHJbSEZTX1RZUEUgLSBzaXplb2Yoc25hcF9oZWFkZXIpICsgaV0gPSBzbmFwX2hlYWRlcltpXTsKKwkJCQl9CisJCQkJZGVzY3AtPkJVRl9DTlQgPSBIRlNfVFlQRTsJCQkJCQkJCQkJCQkJCQkJCS8qOCovCisJCQkJZGVzY3AtPm5leHRfZGVzY19hZGRyLT5idWZfcGh5c19hZGRyCSs9IEhDRl9EQVNBX1NJWkU7CisJCQkJZGVzY3AtPm5leHRfZGVzY19hZGRyLT5CVUZfQ05UCQkJLT0gSENGX0RBU0FfU0laRTsKKwkJCX0KKwkJfQorI2VuZGlmIC8vIEhDRl9FTkMKKyAgICB9CisJcHV0X2ZyYW1lX2xzdCggaWZicCwgZGVzY3AsIERNQV9UWCApOworCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9ETUFfVFhfUFVUICkKK30gLy8gaGNmX2RtYV90eF9wdXQKKworI2VuZGlmIC8vIEhDRl9ETUEKKworI2lmIChIQ0ZfRExfT05MWSkgPT0gMAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5NT0RVTEUJCWhjZl84IGhjZl9lbmNhcCggd2NpX2J1ZnAgdHlwZSApCisqLlBVUlBPU0UJCXRlc3Qgd2hldGhlciBSRkMxMDQyIG9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbiBpcyBuZWVkZWQuCisqCisqLkFSR1VNRU5UUworKgl0eXBlCQkoRmFyKSBwb2ludGVyIHRvIHRoZSAoQmlnIEVuZGlhbikgVHlwZS9MZW5ndGggZmllbGQgaW4gdGhlIG1lc3NhZ2UKKyoKKyouUkVUVVJOUworKglFTkNfTk9ORQkJbGVuL3R5cGUgaXMgImxlbiIgKCAoQklHX0VORElBTil0eXBlIDw9IDE1MDAgKQorKglFTkNfVFVOTkVMCQlsZW4vdHlwZSBpcyAidHlwZSIgYW5kIDB4ODBGMyBvciAweDgxMzcKKyoJRU5DXzEwNDIJCWxlbi90eXBlIGlzICJ0eXBlIiBidXQgbm90IDB4ODBGMyBvciAweDgxMzcKKyoKKyouQ09ORElUSU9OUworKglOSUMgSW50ZXJydXB0cwlkLmMKKyoKKyouREVTQ1JJUFRJT04KKyogVHlwZSBtdXN0IHBvaW50IHRvIHRoZSBMZW4vVHlwZSBmaWVsZCBvZiB0aGUgbWVzc2FnZSwgdGhpcyBpcyB0aGUgMi1ieXRlIGZpZWxkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSA2IGJ5dGUKKyogRGVzdGluYXRpb24gQWRkcmVzcyBhbmQgNiBieXRlIFNvdXJjZSBBZGRyZXNzLiAgVGhlIDIgc3VjY2Vzc2l2ZSBieXRlcyBhZGRyZXNzZWQgYnkgdHlwZSBhcmUgaW50ZXJwcmV0ZWQgYXMKKyogYSBCaWcgRW5kaWFuIHZhbHVlLiAgSWYgdGhhdCB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTUwMCwgdGhlIG1lc3NhZ2UgaXMgYXNzdW1lZCB0byBiZSBpbiA4MDIuMworKiBmb3JtYXQuICBPdGhlcndpc2UgdGhlIG1lc3NhZ2UgaXMgYXNzdW1lZCB0byBiZSBpbiBFdGhlcm5ldC1JSSBmb3JtYXQuICBEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIExlbi9UeXAsCisqIEJyaWRnZSBUdW5uZWwgb3IgUkZDMTA0MiBlbmNhcHN1bGF0aW9uIGlzIG5lZWRlZC4KKyoKKyouRElBR1JBTQorKgorKiAgMToJcHJlc3VtZSA4MDIuMywgaGVuY2UgcHJlc2V0IHJldHVybiB2YWx1ZSBhdCBFTkNfTk9ORQorKiAgMjoJY29udmVydCB0eXBlIGZyb20gIm5ldHdvcmsiIEVuZGlhbiBmb3JtYXQgdG8gbmF0aXZlIEVuZGlhbgorKiAgNDoJdGhlIGxpdG11cyB0ZXN0IHRvIGRpc3Rpbmd1aXNoIHR5cGUgYW5kIGxlbi4KKyoJVGhlIGhhcmQgY29kZSAibWFnaWMiIHZhbHVlIG9mIDE1MDAgaXMgaW50ZW50aW9uYWwgYW5kIHNob3VsZCBOT1QgYmUgcmVwbGFjZWQgYnkgYSBtbmVtb25pYyBiZWNhdXNlIGl0IGlzCisqCW5vdCByZWxhdGVkIGF0IGFsbCB0byB0aGUgbWF4aW11bSBmcmFtZSBzaXplIHN1cHBvcnRlZCAgYnkgdGhlIEhlcm1lcy4KKyogIDY6CWNoZWNrIHR5cGUgYWdhaW5zdDoKKyoJCTB4ODBGMwkvL0FwcGxlVGFsayBBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wgKEFBUlApCisqCQkweDgxMzcJLy9JUFgKKyoJdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGVuY2Fwc3VsYXRpb24KKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgSENGX0VOQ0FQCS8vaS5lIEhDRl9FTkMgb3IgSENGX0VOQ19TVVAKKyNpZiAhICggKEhDRl9FTkNBUCkgJiBIQ0ZfRU5DX1NVUCApCitIQ0ZfU1RBVElDCisjZW5kaWYgLy8gSENGX0VOQ0FQCitoY2ZfOAoraGNmX2VuY2FwKCB3Y2lfYnVmcCB0eXBlICkKK3sKKworaGNmXzgJcmMgPSBFTkNfTk9ORTsJCQkJCQkJCQkJCQkJCQkJCQkJCQkvKiAxICovCitoY2ZfMTYJdCA9IChoY2ZfMTYpKCp0eXBlPDw4KSArICoodHlwZSsxKTsJCQkJCQkJCQkJCQkJCQkJLyogMiAqLworCisJaWYgKCB0ID4gMTUwMCApIHsJCQkJCQkJCQkJCQkJCQkJCQkJCQkvKiA0ICovCisJCWlmICggdCA9PSAweDgxMzcgfHwgdCA9PSAweDgwRjMgKSB7CisJCQlyYyA9IEVOQ19UVU5ORUw7CQkJCQkJCQkJCQkJCQkJCQkJCS8qIDYgKi8KKwkJfSBlbHNlIHsKKwkJCXJjID0gRU5DXzEwNDI7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfSAvLyBoY2ZfZW5jYXAKKyNlbmRpZiAvLyBIQ0ZfRU5DQVAKKyNlbmRpZiAvLyBIQ0ZfRExfT05MWQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouTU9EVUxFCQlpbnQgaGNmX2dldF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApCisqLlBVUlBPU0UJCU9idGFpbnMgdHJhbnNpZW50IGFuZCBwZXJzaXN0ZW50IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgQ2FyZCBhbmQgZnJvbSB0aGUgSENGLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCWx0dnAJCWFkZHJlc3Mgb2YgTGVuZ3RoVHlwZVZhbHVlIHN0cnVjdHVyZSBzcGVjaWZ5aW5nIHRoZSAid2hhdCIgYW5kIHRoZSAiaG93IG11Y2giIG9mIHRoZQorKgkJCQlpbmZvcm1hdGlvbiB0byBiZSBjb2xsZWN0ZWQgZnJvbSB0aGUgSENGIG9yIGZyb20gdGhlIEhlcm1lcworKgorKi5SRVRVUk5TCisqCUhDRl9FUlJfTEVOCQkJVGhlIHByb3ZpZGVkIGJ1ZmZlciB3YXMgdG9vIHNtYWxsCisqCUhDRl9TVUNDRVNTCQkJU3VjY2VzcworKiEhCXZpYSBjbWRfZXhlICggdHlwZSA+PSBDRkdfUklEX0ZXX01JTiApCisqCUhDRl9FUlJfTk9fTklDCQlOSUMgcmVtb3ZlZCBkdXJpbmcgcmV0cmlldmFsCisqCUhDRl9FUlJfVElNRV9PVVQJRXhwZWN0ZWQgSGVybWVzIGV2ZW50IGRpZCBub3Qgb2NjdXJlIGluIGV4cGVjdGVkIHRpbWUKKyohIQl2aWEgY21kX2V4ZSBhbmQgc2V0dXBfYmFwICh0eXBlID49IENGR19SSURfRldfTUlOICkKKyoJSENGX0VSUl9ERUZVTkNUXy4uLglIQ0YgaXMgaW4gZGVmdW5jdCBtb2RlIChiaXRzIDB4N0YgcmVmbGVjdCBjYXVzZSkKKyoKKyouREVTQ1JJUFRJT04KKyogVGhlIFQtZmllbGQgb2YgdGhlIExUVi1yZWNvcmQgKHByb3ZpZGVkIGJ5IHRoZSBNU0YgaW4gcGFyYW1ldGVyIGx0dnApIHNwZWNpZmllcyB0aGUgUklEIHdhbnRlZC4gVGhlIFJJRAorKiBpbmZvcm1hdGlvbiBpZGVudGlmaWVkIGJ5IHRoZSBULWZpZWxkIGlzIGNvcGllZCBpbnRvIHRoZSBWLWZpZWxkLgorKiBPbiBlbnRyeSwgdGhlIEwtZmllbGQgc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIsIGFsc28gY2FsbGVkIHRoZSAiSW5pdGlhbCBEYXRhTGVuZ3RoIi4gVGhlIEwtdmFsdWUKKyogaW5jbHVkZXMgdGhlIHNpemUgb2YgdGhlIFQtZmllbGQsIGJ1dCBub3QgdGhlIHNpemUgb2YgdGhlIEwtZmllbGQgaXRzZWxmLgorKiBPbiByZXR1cm4sIHRoZSBMLWZpZWxkIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHdvcmRzIGFjdHVhbGx5IGNvbnRhaW5lZCBieSB0aGUgVHlwZSBhbmQgVmFsdWUgZmllbGRzLgorKiBBcyB0aGUgc2l6ZSBvZiB0aGUgVHlwZSBmaWVsZCBpbiB0aGUgTFRWLXJlY29yZCBpcyBpbmNsdWRlZCBpbiB0aGUgIkluaXRpYWwgRGF0YUxlbmd0aCIgb2YgdGhlIHJlY29yZCwgdGhlCisqIFYtZmllbGQgY2FuIGNvbnRhaW4gYXQgbW9zdCAiSW5pdGlhbCBEYXRhTGVuZ3RoIiAtIDEgd29yZHMgb2YgZGF0YS4KKyogQ29weWluZyBzdG9wcyBpZiBlaXRoZXIgdGhlIGNvbXBsZXRlIEluZm9ybWF0aW9uIGlzIGNvcGllZCBvciBpZiB0aGUgbnVtYmVyIG9mIHdvcmRzIGluZGljYXRlZCBieSB0aGUKKyogIkluaXRpYWwgRGF0YUxlbmd0aCIgd2VyZSBjb3BpZWQuICBUaGUgIkluaXRpYWwgRGF0YUxlbmd0aCIgYWN0cyBhcyBhIHNhZmUgZ3VhcmQgYWdhaW5zdCBDb25maWd1cmF0aW9uCisqIEluZm9ybWF0aW9uIGJsb2NrcyB0aGF0IGhhdmUgZGlmZmVyZW50IHNpemVzIGZvciBkaWZmZXJlbnQgRi9XIHZlcnNpb25zLCBlLmcuIHdoZW4gbGF0ZXIgdmVyc2lvbnMgc3VwcG9ydAorKiBtb3JlIHRhbGxpZXMgdGhhbiBlYXJsaWVyIHZlcnNpb25zLgorKiBJZiB0aGUgc2l6ZSBvZiBWYWx1ZSBmaWVsZCBvZiB0aGUgUklEIGV4Y2VlZHMgdGhlIHNpemUgb2YgdGhlICJJbml0aWFsIERhdGFMZW5ndGgiIC0xLCBhcyBtdWNoIGRhdGEKKyogYXMgZml0cyBpcyBjb3BpZWQsIGFuZCBhbiBlcnJvciBzdGF0dXMgb2YgSENGX0VSUl9MRU4gaXMgcmV0dXJuZWQuCisqCisqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgTVNGIHRvIGRldGVjdCBjYXJkIHJlbW92YWwgYW5kIHJlLWluc2VydGlvbiBhbmQgbm90IGNhbGwgdGhlIEhDRiB3aGVuIHRoZQorKiBOSUMgaXMgYWJzZW50LiBUaGUgTVNGIGNhbm5vdCwgaG93ZXZlciwgdGltZWx5IGRldGVjdCBhIENhcmQgcmVtb3ZhbCBpZiB0aGUgQ2FyZCBpcyByZW1vdmVkIHdoaWxlCisqIGhjZl9nZXRfaW5mbyBpcyBpbiBwcm9ncmVzcy4gIFRoZXJlZm9yZSwgdGhlIEhDRiBwZXJmb3JtcyBpdHMgb3duIGNoZWNrIG9uIENhcmQgcHJlc2VuY2UgYWZ0ZXIgdGhlIHJlYWQKKyogb3BlcmF0aW9uIG9mIHRoZSBOSUMgZGF0YS4gIElmIHRoZSBDYXJkIGlzIG5vdCBwcmVzZW50IG9yIHJlbW92ZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgaGNmX2dldF9pbmZvLAorKiBIQ0ZfRVJSX05PX05JQyBpcyByZXR1cm5lZCBhbmQgdGhlIGNvbnRlbnQgb2YgdGhlIERhdGEgQnVmZmVyIGlzIHVucHJlZGljdGFibGUuIFRoaXMgY2hlY2sgaXMgbm90IHBlcmZvcm1lZAorKiBpbiBjYXNlIG9mIHRoZSAiSENGIGVtYmVkZGVkIiBwc2V1ZG8gUklEcyBsaWtlIENGR19UQUxMSUVTLgorKgorKiBBc3NlcnQgZmFpbHMgaWYKKyogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCisqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbgorKglhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yIG11bHRpLXRocmVhZGluZy4KKyogLSBsdHZwIGlzIGEgTlVMTCBwb2ludGVyLgorKiAtIGxlbmd0aCBmaWVsZCBvZiB0aGUgTFRWLXJlY29yZCBhdCBlbnRyeSBpcyAwIG9yIDEgb3IgaGFzIGFuIGV4Y2Vzc2l2ZSB2YWx1ZSAoaS5lLiBleGNlZWRzIEhDRl9NQVhfTFRWKS4KKyogLSB0eXBlIGZpZWxkIG9mIHRoZSBMVFYtcmVjb3JkIGlzIGludmFsaWQuCisqCisqLkRJQUdSQU0KKyoJSGNmX2dldF9tYl9pbmZvIGNvcGllcyB0aGUgY29udGVudHMgb2YgdGhlIG9sZGVzdCBNYWlsQm94IEluZm8gYmxvY2sgaW4gdGhlIE1haWxCb3ggdG8gUEMgUkFNLiBJZiBsZW4gaXMKKyoJbGVzcyB0aGFuIHRoZSBzaXplIG9mIHRoZSBNYWlsQm94IEluZm8gYmxvY2ssIG9ubHkgYXMgbXVjaCBhcyBmaXRzIGluIHRoZSBQQyBSQU0gYnVmZmVyIGlzIGNvcGllZC4gQWZ0ZXIKKyoJdGhlIGNvcHlpbmcgdGhlIE1haWxCb3ggUmVhZCBwb2ludGVyIGlzIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIG5leHQgTWFpbEJveCBJbmZvIGJsb2NrLCBoZW5jZSB0aGUKKyoJcmVtYWluZGVyIG9mIGFuICJvdmVyc2l6ZWQiIE1haWxCb3ggSW5mbyBibG9jayBpcyBsb3N0LiBUaGUgdHJ1bmNhdGlvbiBvZiB0aGUgTWFpbEJveCBJbmZvIGJsb2NrIGlzIE5PVAorKglyZWZsZWN0ZWQgaW4gdGhlIHJldHVybiBzdGF0dXMuIE5vdGUgdGhhdCBoY2ZfZ2V0X2luZm8gZ3VhcmFudGVlcyB0aGUgbGVuZ3RoIG9mIHRoZSBQQyBSQU0gYnVmZmVyIG1lZXRzCisqCXRoZSBtaW5pbXVtIHJlcXVpcmVtZW50cyBvZiBhdCBsZWFzdCAyLCBzbyBubyBQQyBSQU0gYnVmZmVyIG92ZXJydW4uCisqCisqCUNhbGxpbmcgaGNmX2dldF9tYl9pbmZvIHdoZW4gdGhlaXIgaXMgbm8gTWFpbEJveCBJbmZvIGJsb2NrIGF2YWlsYWJsZSBvciB3aGVuIHRoZXJlIGlzIG5vIE1haWxCb3ggYXQgYWxsLAorKglyZXN1bHRzIGluIGEgIk5VTEwiIE1haWxCb3ggSW5mbyBibG9jay4KKyoKKyoxMjoJc2VlIE5PVElDRQorKjE3OiBUaGUgcmV0dXJuIHN0YXR1cyBvZiBjbWRfd2FpdCBhbmQgdGhlIGZpcnN0IGhjZmlvX2luX3N0cmluZyBjYW4gYmUgaWdub3JlZCwgYmVjYXVzZSB3aGVuIG9uZSBmYWlscywgdGhlCisqCW90aGVyIGZhaWxzIHZpYSB0aGUgSUZCX0RlZnVuY3RTdGF0IG1lY2hhbmlzbQorKjIwOiAiSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKSIgaXMgbm90IHN1aXRhYmxlIGJlY2F1c2UgdGhpcyB3aWxsIGFsd2F5cyB0cmlnZ2VyIGFzIHNpZGUgZWZmZWN0IG9mCisqCXRoZSBIQ0ZBU1NFUlQgaW4gaGNmX3B1dF9pbmZvIHdoaWNoIGNhbGxzIGhjZl9nZXRfaW5mbyB0byBmaWd1cmUgb3V0IHdoZXRoZXIgdGhlIFJJRCBleGlzdHMgYXQgYWxsLgorCisqLk5PVElDRQorKgorKgkiSENGIGVtYmVkZGVkIiBwc2V1ZG8gUklEczoKKyoJQ0ZHX01CX0lORk8sIENGR19UQUxMSUVTLCBDRkdfRFJWX0lERU5USVRZLCBDRkdfRFJWX1NVUF9SQU5HRSwgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSSwKKyoJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQSwgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSQorKglOb3RlIHRoZSBIQ0ZfRVJSX0xFTiBpcyBOT1QgYWRlcXVhdGVseSBzZXQsIHdoZW4gTCA+PSAyIGJ1dCBsZXNzIHRoYW4gbmVlZGVkCisqCisqCVJlbWFya3M6IFRyYW5zZmVycyBvcGVyYXRpb24gaW5mb3JtYXRpb24gYW5kIHRyYW5zaWVudCBhbmQgcGVyc2lzdGVudCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlCisqCUNhcmQgYW5kIGZyb20gdGhlIEhDRiB0byB0aGUgTVNGLgorKglUaGUgZXhhY3QgbGF5b3V0IG9mIHRoZSBwcm92aWRlZCBkYXRhIHN0cnVjdHVyZSBkZXBlbmRzIG9uIHRoZSBhY3Rpb24gY29kZS4gQ29weWluZyBzdG9wcyBpZiBlaXRoZXIgdGhlCisqCWNvbXBsZXRlIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gaXMgY29waWVkIG9yIGlmIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW5kaWNhdGVkIGJ5IGxlbiBpcyBjb3BpZWQuICBMZW4KKyoJYWN0cyBhcyBhIHNhZmUgZ3VhcmQgYWdhaW5zdCBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uIGJsb2NrcyB3aGljaCBoYXZlIGRpZmZlcmVudCBzaXplcyBmb3IgZGlmZmVyZW50CisqCUhlcm1lcyB2ZXJzaW9ucywgZS5nLiB3aGVuIGxhdGVyIHZlcnNpb25zIHN1cHBvcnQgbW9yZSB0YWxsaWVzIHRoYW4gZWFybGllciB2ZXJzaW9ucy4gSXQgaXMgYSBjb25zY2lvdXMKKyoJZGVjaXNpb24gdGhhdCB1bnVzZWQgcGFydHMgb2YgdGhlIFBDIFJBTSBidWZmZXIgYXJlIG5vdCBjbGVhcmVkLgorKgorKglSZW1hcmtzOiBUaGUgb25seSBlcnJvciBhZ2FpbnN0IHdoaWNoIGlzIHByb3RlY3RlZCBpcyB0aGUgIlJlYWQgZXJyb3IiIGFzIHJlc3VsdCBvZiBDYXJkIHJlbW92YWwuIE9ubHkgdGhlCisqCWxhc3QgaGNmX2lvX3N0cmluZyBuZWVkIHRvIGJlIHByb3RlY3RlZCBiZWNhdXNlIGlmIHRoZSBmaXJzdCBmYWlscyB0aGUgc2Vjb25kIHdpbGwgZmFpbCBhcyB3ZWxsLiBDaGVja2luZworKglmb3IgY21kX2V4ZSBlcnJvcnMgaXMgc3VwcG9zZWQgc3VwZXJmbHVvdXMgYmVjYXVzZSBwcm9ibGVtcyBpbiBjbWRfZXhlIGFyZSBhbHJlYWR5IGNhdWdodCBvciB3aWxsIGJlCisqCWNhdWdodCBieSBoY2ZfZW5hYmxlLgorKgorKglDRkdfTUJfSU5GTzogY29weSB0aGUgb2xkZXN0IE1haWxCb3ggSW5mbyBCbG9jayBvciB0aGUgIm51bGwiIGJsb2NrIGlmIG5vbmUgYXZhaWxhYmxlLgorKgorKglUaGUgbWVjaGFuaXNtIHRvIEhDRl9BU1NFUlQgb24gaW52YWxpZCB0eXAtY29kZXMgaW4gdGhlIExUViByZWNvcmQgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBzdHJhdGVneToKKyoJICAtIGR1cmluZyB0aGUgcHNldWRvLWFzeW5jaHJvbm91cyBIZXJtZXMgY29tbWFuZHMgKGRpYWdub3NlLCBkb3dubG9hZCkJb25seSBDRkdfTUJfSU5GTyBpcyBhY2NlcHRhYmxlCisqCSAgLQlzb21lIGNvZGVzIChlLmcuIENGR19UQUxMSUVTKSBhcmUgZXhwbGljaXRseSBoYW5kbGVkIGJ5IHRoZSBIQ0Ygd2hpY2ggaW1wbGllcyB0aGF0IHRoZXNlIGNvZGVzCisqCQlhcmUgdmFsaWQKKyoJICAtIGFsbCBvdGhlciBjb2RlcyBpbiB0aGUgcmFuZ2UgMHhGQzAwIHRocm91Z2ggMHhGRkZGIGFyZSBwYXNzZWQgdG8gdGhlIEhlcm1lcy4gIFRoZSBIZXJtZXMgcmV0dXJucyBhbgorKgkJTFRWIHJlY29yZCB3aXRoIGEgemVybyB2YWx1ZSBpbiB0aGUgTC1maWVsZCBmb3IgYWxsIFR5cC1jb2RlcyBpdCBkb2VzIG5vdCByZWNvZ25pemUuIFRoaXMgaXMKKyoJCWRlZmluZWQgYW5kIGludGVuZGVkIGJlaGF2aW9yLCBzbyBIQ0ZfQVNTRVJUIGRvZXMgbm90IGNhdGNoIG9uIHRoaXMgcGhlbm9tZW5hLgorKgkgIC0JYWxsIHJlbWFpbmluZyBjb2RlcyBhcmUgaW52YWxpZCBhbmQgY2F1c2UgYW4gQVNTRVJULgorKgorKi5DT05ESVRJT05TCisqIEluIGNhc2Ugb2YgVVNCLCBIQ0ZfTUFYX01TRyA7P1VTRUQ7PyB0byBsaW1pdCB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBjYW4gYmUgcmV0cmlldmVkIHZpYSBoY2ZfZ2V0X2luZm8uCisqCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitoY2ZfZ2V0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICkKK3sKKworaW50CQkJcmMgPSBIQ0ZfU1VDQ0VTUzsKK2hjZl8xNgkJbGVuID0gbHR2cC0+bGVuOworaGNmXzE2CQl0eXBlID0gbHR2cC0+dHlwOword2NpX3JlY29yZHAJcCA9ICZsdHZwLT5sZW47CQkvL2Rlc3RpbmF0aW9uIHdvcmQgcG9pbnRlciAoaW4gTFRWIHJlY29yZCkKK2hjZl8xNgkJKnEgPSBOVUxMOwkJCQkvKiBzb3VyY2Ugd29yZCBwb2ludGVyICBOb3RlISEgRE9TIENPTSBjYW4ndCBjb3BlIHdpdGggRkFSCisJCQkJCQkJCQkgKiBhcyBhIGNvbnNlcXVlbmNlIE1haWxCb3ggbXVzdCBiZSBuZWFyIHdoaWNoIGlzIHVzdWFsbHkgdHJ1ZSBhbnl3YXkKKwkJCQkJCQkJCSAqLworaW50CQkJaTsKKworCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfR0VUX0lORk8sIGx0dnAtPnR5cCApCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQorCUhDRkFTU0VSVF9JTlQKKwlIQ0ZBU1NFUlQoIGx0dnAsIDAgKQorCUhDRkFTU0VSVCggMSA8IGx0dnAtPmxlbiAmJiBsdHZwLT5sZW4gPD0gSENGX01BWF9MVFYgKyAxLCBNRVJHRV8yKCBsdHZwLT50eXAsIGx0dnAtPmxlbiApICkKKworCWx0dnAtPmxlbiA9IDA7CQkJCQkJCQkvL2RlZmF1bHQgdG86IE5vIEluZm8gQXZhaWxhYmxlCisjaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lEIHx8IChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIgLy9maWx0ZXIgb3V0IGFsbCBzcGVjaWFscworCWZvciAoIGkgPSAwOyAoIHEgPSB4eHh4W2ldICkgIT0gTlVMTCAmJiBxWzFdICE9IHR5cGU7IGkrKyApIC8qTk9QKi87CisjZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRCAvIEhDRl9FWFRfTUIKKyNpZiBIQ0ZfVEFMTElFUworCWlmICggdHlwZSA9PSBDRkdfVEFMTElFUyApIHsJCQkJCQkJCQkJCQkJLyozKi8KKwkJKHZvaWQpaGNmX2FjdGlvbiggaWZicCwgSENGX0FDVF9UQUxMSUVTICk7CisJCXEgPSAoaGNmXzE2KikmaWZicC0+SUZCX1RhbGx5TGVuOworCX0KKyNlbmRpZiAvLyBIQ0ZfVEFMTElFUworI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKKwlpZiAoIHR5cGUgPT0gQ0ZHX01CX0lORk8gKSB7CisJCWlmICggaWZicC0+SUZCX01CSW5mb0xlbiApIHsKKwkJCWlmICggaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJScF0gPT0gMHhGRkZGICkgeworCQkJCWlmYnAtPklGQl9NQlJwID0gMDsgLy87P1Byb2JhYmx5IHN1cGVyZmx1b3VzCisJCQl9CisJCQlxID0gJmlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CUnBdOworCQkJaWZicC0+SUZCX01CUnAgKz0gKnEgKyAxOwkvL3VwZGF0ZSByZWFkIHBvaW50ZXIKKwkJCWlmICggaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJScF0gPT0gMHhGRkZGICkgeworCQkJCWlmYnAtPklGQl9NQlJwID0gMDsKKwkJCX0KKwkJCWlmYnAtPklGQl9NQkluZm9MZW4gPSBpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQlJwXTsKKwkJfQorCX0KKyNlbmRpZiAvLyBIQ0ZfRVhUX01CCisJaWYgKCBxICE9IE5VTEwgKSB7CQkJCQkJLy9hIHNwZWNpYWwgb3IgQ0ZHX1RBTExJRVMgb3IgQ0ZHX01CX0lORk8KKwkJaSA9IG1pbiggbGVuLCAqcSApICsgMTsJCQkJLy90b3RhbCBzaXplIG9mIGRlc3RpbmF0aW9uIChpbmNsdWRpbmcgVC1maWVsZCkKKwkJd2hpbGUgKCBpLS0gKSB7CisJCQkqcCsrID0gKnE7CisjaWYgKEhDRl9UQUxMSUVTKSAmIEhDRl9UQUxMSUVTX1JFU0VUCisJCQlpZiAoIHEgPiAmaWZicC0+SUZCX1RhbGx5VHlwICYmIHR5cGUgPT0gQ0ZHX1RBTExJRVMgKSB7CisJCQkJKnEgPSAwOworCQkJfQorI2VuZGlmIC8vIEhDRl9UQUxMSUVTX1JFU0VUCisJCQlxKys7CisJCX0KKwl9IGVsc2UgewkJCQkJCQkJLy8gbm90IGEgc3BlY2lhbCBub3IgQ0ZHX1RBTExJRVMgbm9yIENGR19NQl9JTkZPCisJCWlmICggdHlwZSA9PSBDRkdfQ05UTF9PUFQgKSB7CQkJCQkJCQkJCS8vcmVhZCBiYWNrIGVmZmVjdGl2ZSBvcHRpb25zCisJCQlsdHZwLT5sZW4gPSAyOworCQkJbHR2cC0+dmFsWzBdID0gaWZicC0+SUZCX0NudGxPcHQ7CisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9OSUNfQUNDRVNTCisJCX0gZWxzZSBpZiAoIHR5cGUgPT0gQ0ZHX1BST0RfREFUQSApIHsgIC8vb25seSBuZWVkZWQgZm9yIHNvbWUgdGVzdCB0b29sIG9uIHRvcCBvZiBILUlJIE5ESVMgZHJpdmVyCitoY2ZfaW8JCWlvX3BvcnQ7Cit3Y2lfYnVmcAlwdDsJCQkJCS8vcG9pbnRlciB3aXRoIHRoZSAicmlnaHQiIHR5cGUsIGp1c3QgdG8gaGVscCBlYXNlIHdyaXRpbmcgbWFjcm9zIHdpdGggZW1iZWRkZWQgYXNzZW1ibHkKKwkJCU9QVyggSFJFR19BVVhfUEFHRSwgKGhjZl8xNikoUExVR19EQVRBX09GRlNFVCA+PiA3KSApOworCQkJT1BXKCBIUkVHX0FVWF9PRkZTRVQsIChoY2ZfMTYpKFBMVUdfREFUQV9PRkZTRVQgJiAweDdFKSApOworCQkJaW9fcG9ydCA9IGlmYnAtPklGQl9JT0Jhc2UgKyBIUkVHX0FVWF9EQVRBOwkJLy90byBwcmV2ZW50IHNpZGUgZWZmZWN0cyBvZiB0aGUgTVNGLWRlZmluZWQgbWFjcm8KKwkJCXAgPSBsdHZwLT52YWw7CQkJCQkvL2Rlc3RpbmF0aW9uIGNoYXIgcG9pbnRlciAoaW4gTFRWIHJlY29yZCkKKwkJCWlmICggKCBpID0gbGVuIC0gMSApID4gMCApIHsKKwkJCQlwdCA9ICh3Y2lfYnVmcClwOwkvL2p1c3QgdG8gaGVscCBlYXNlIHdyaXRpbmcgbWFjcm9zIHdpdGggZW1iZWRkZWQgYXNzZW1ibHkKKwkJCQlJTl9QT1JUX1NUUklOR184XzE2KCBpb19wb3J0LCBwdCwgaSApOyAvL3NwYWNlIHVzZWQgYnkgVDogLTEKKwkJCX0KKwkJfSBlbHNlIGlmICggdHlwZSA9PSBDRkdfQ01EX0hDRiApIHsKKyNkZWZpbmUgUCAoKENGR19DTURfSENGX1NUUkNUIEZBUiAqKWx0dnApCisJCQlIQ0ZBU1NFUlQoIFAtPmNtZCA9PSBDRkdfQ01EX0hDRl9SRUdfQUNDRVNTLCBQLT5jbWQgKQkJLy9vbmx5IEhlcm1lcyByZWdpc3RlciBhY2Nlc3Mgc3VwcG9ydGVkCisJCQlpZiAoIFAtPmNtZCA9PSBDRkdfQ01EX0hDRl9SRUdfQUNDRVNTICkgeworCQkJCUhDRkFTU0VSVCggUC0+bW9kZSA8IGlmYnAtPklGQl9JT0Jhc2UsIFAtPm1vZGUgKQkJLy9DaGVjayBSZWdpc3RlciBzcGFjZQorCQkJCWx0dnAtPmxlbiA9IG1pbiggbGVuLCA0ICk7CQkJCQkJCQkvL1JFU1RPUkUgbHR2IGxlbmd0aAorCQkJCVAtPmFkZF9pbmZvID0gSVBXKCBQLT5tb2RlICk7CisJCQl9CisjdW5kZWYgUAorI2VuZGlmIC8vIEhDRl9FWFRfTklDX0FDQ0VTUworI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfUFJJTlRGCisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBDRkdfRldfUFJJTlRGKSB7CisgICAgICAgICAgIHJjID0gZndfcHJpbnRmKGlmYnAsIChDRkdfRldfUFJJTlRGX1NUUkNUKilsdHZwKTsKKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUX1BSSU5URgorCQl9IGVsc2UgaWYgKCB0eXBlID49IENGR19SSURfRldfTUlOICkgeworLy87PyBieSB1c2luZyBIQ01EX0JVU1kgb3B0aW9uIHdoZW4gY2FsbGluZyBjbWRfZXhlLCB1c2luZyBhIGdldF9mcmFnIHdpdGggbGVuZ3RoIDAganVzdCB0byBzZXQgdXAgdGhlCisvLzs/IEJBUCBhbmQgY2FsbGluZyBjbWRfY21wbCwgeW91IGNvdWxkIG1lcmdlIHRoZSAyIEJ1c3kgd2FpdHMuIFdoZXRoZXIgdGhpcyByZWFsbHkgaGVscHMgKGFuZCB3aGF0CisvLzs/IHdvdWxkIGJlIHRoZSBvcHRpbWFsIHNlcXVlbmNlIGluIGNtZF9leGUgYW5kIGdldF9mcmFnKSB3b3VsZCBoYXZlIHRvIGJlIE1FQVNVUkVECisvKjE3Ki8JCWlmICggKCByYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfQUNDRVNTLCB0eXBlICkgKSA9PSBIQ0ZfU1VDQ0VTUyAmJgorCQkJCSAoIHJjID0gc2V0dXBfYmFwKCBpZmJwLCB0eXBlLCAwLCBJT19JTiApICkgPT0gSENGX1NVQ0NFU1MgKSB7CisJCQkJZ2V0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcCkmbHR2cC0+bGVuLCAyKmxlbisyIEJFX1BBUigyKSApOworCQkJCWlmICggSVBXKCBIUkVHX1NUQVQgKSA9PSAweEZGRkYgKSB7CQkJCQkvL05JQyByZW1vdmFsIHRlc3QKKwkJCQkJbHR2cC0+bGVuID0gMDsKKwkJCQkJSENGQVNTRVJUKCBET19BU1NFUlQsIHR5cGUgKQorCQkJCX0KKwkJCX0KKy8qMTIqLwl9IGVsc2UgSENGQVNTRVJUKCBET19BU1NFUlQsIHR5cGUgKSAvKk5PUCovOyAvL05PUCBpbiBjYXNlIEhDRkFTU0VSVCBpcyBkdW1teQorCX0KKwlpZiAoIGxlbiA8IGx0dnAtPmxlbiApIHsKKwkJbHR2cC0+bGVuID0gbGVuOworCQlpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgeworCQkJcmMgPSBIQ0ZfRVJSX0xFTjsKKwkJfQorCX0KKwlIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTIHx8ICggcmMgPT0gSENGX0VSUl9MRU4gJiYgaWZicC0+SUZCX0Fzc2VydFRyYWNlICYgMTw8SENGX1RSQUNFX1BVVF9JTkZPICksCisJCQkgICBNRVJHRV8yKCB0eXBlLCByYyApICkJCQkJCQkJCQkJCQkJCQkJLyoyMCovCisJSENGTE9HRVhJVCggSENGX1RSQUNFX0dFVF9JTkZPICkKKwlyZXR1cm4gcmM7Cit9IC8vIGhjZl9nZXRfaW5mbworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouTU9EVUxFCQlpbnQgaGNmX3B1dF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApCisqLlBVUlBPU0UJCVRyYW5zZmVycyBvcGVyYXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gdG8gdGhlIENhcmQgYW5kIHRvIHRoZSBIQ0YuCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoJbHR2cAkJc3BlY2lmaWVzIHRoZSBSSUQgKGFzIGRlZmluZWQgYnkgSGVybWVzIEkvRikgb3IgcHNldWRvLVJJRCAoYXMgZGVmaW5lZCBieSBXQ0kpCisqCisqLlJFVFVSTlMKKyoJSENGX1NVQ0NFU1MKKyohIQl2aWEgY21kX2V4ZQorKglIQ0ZfRVJSX05PX05JQyAJCU5JQyByZW1vdmVkIGR1cmluZyBkYXRhIHJldHJpZXZhbAorKglIQ0ZfRVJSX1RJTUVfT1VUCUV4cGVjdGVkIEYvVyBldmVudCBkaWQgbm90IG9jY3VyIGluIHRpbWUKKyoJSENGX0VSUl9ERUZVTkNUXy4uLgorKiEhCXZpYSBkb3dubG9hZAkJCQlDRkdfRExOVl9TVEFSVCA8PSB0eXBlIDw9IENGR19ETF9TVE9QCisqISEJdmlhIHB1dF9pbmZvCQkJCUNGR19SSURfQ0ZHX01JTiA8PSB0eXBlIDw9IENGR19SSURfQ0ZHX01BWAorKiEhCXZpYSBwdXRfZnJhZworKgorKi5ERVNDUklQVElPTgorKiBUaGUgTC1maWVsZCBvZiB0aGUgTFRWLXJlY29yZCAocHJvdmlkZWQgYnkgdGhlIE1TRiBpbiBwYXJhbWV0ZXIgbHR2cCkgc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIuCisqIFRoZSBMLXZhbHVlIGluY2x1ZGVzIHRoZSBzaXplIG9mIHRoZSBULWZpZWxkLCBidXQgbm90IHRoZSBzaXplIG9mIHRoZSBMLWZpZWxkLgorKiBUaGUgVC0gZmllbGQgc3BlY2lmaWVzIHRoZSBSSUQgcGxhY2VkIGluIHRoZSBWLWZpZWxkIGJ5IHRoZSBNU0YuCisqCisqIE5vdCBhbGwgQ0ZHLWNvZGVzIGNhbiBiZSB1c2VkIGZvciBoY2ZfcHV0X2luZm8uICBUaGUgZm9sbG93aW5nIENGRy1jb2RlcyBhcmUgdmFsaWQgZm9yIGhjZl9wdXRfaW5mbzoKKyogbyBPbmUgb2YgdGhlIENGRy1jb2RlcyBpbiB0aGUgZ3JvdXAgIk5ldHdvcmsgUGFyYW1ldGVycywgU3RhdGljIENvbmZpZ3VyYXRpb24gRW50aXRpZXMiCisqIENoYW5nZXMgbWFkZSBieSBoY2ZfcHV0X2luZm8gdG8gQ0ZHX2NvZGVzIGluIHRoaXMgZ3JvdXAgd2lsbCBub3QgYWZmZWN0IHRoZSBGL1cKKyogYW5kIEhDRiBiZWhhdmlvciB1bnRpbCBoY2ZfY250bF9wb3J0KCBIQ0ZfUE9SVF9FTkFCTEUpIGlzIGNhbGxlZC4KKyogbyBPbmUgb2YgdGhlIENGRy1jb2RlcyBpbiB0aGUgZ3JvdXAgIk5ldHdvcmsgUGFyYW1ldGVycywgRHluYW1pYyBDb25maWd1cmF0aW9uIEVudGl0aWVzIgorKiBDaGFuZ2VzIG1hZGUgYnkgaGNmX3B1dF9pbmZvIHRvIENGR19jb2RlcyB3aWxsIGFmZmVjdCB0aGUgRi9XIGFuZCBIQ0YgYmVoYXZpb3IgaW1tZWRpYXRlbHkuCisqIG8gQ0ZHX1BST0cuCisqIFRoaXMgY29kZSBpcyB1c2VkIHRvIGluaXRpYXRlIGFuZCB0ZXJtaW5hdGUgdGhlIHByb2Nlc3MgdG8gZG93bmxvYWQgZGF0YSBlaXRoZXIgdG8KKyogdm9sYXRpbGUgb3IgdG8gbm9uLXZvbGF0aWxlIFJBTSBvbiB0aGUgTklDIGFzIHdlbGwgYXMgZm9yIHRoZSBhY3R1YWwgZG93bmxvYWQuCisqIG8gQ0ZHLWNvZGVzIHJlbGF0ZWQgdG8gdGhlIEhDRiBiZWhhdmlvci4KKyogVGhlIHJlbGF0ZWQgQ0ZHLWNvZGVzIGFyZToKKyogIC0gQ0ZHX1JFR19NQgorKiAgLSBDRkdfUkVHX0FTU0VSVF9SVE5QCisqICAtIENGR19SRUdfSU5GT19MT0cKKyogIC0gQ0ZHX0NNRF9OSUMKKyogIC0gQ0ZHX0NNRF9ET05HTEUKKyogIC0gQ0ZHX0NNRF9IQ0YKKyogIC0gQ0ZHX05PVElGWQorKgorKiBBbGwgTFRWLXJlY29yZHMgInVua25vd24iIHRvIHRoZSBIQ0YgYXJlIGZvcndhcmRlZCB0byB0aGUgRi9XLgorKgorKiBBc3NlcnQgZmFpbHMgaWYKKyogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCisqIC0gbHR2cCBpcyBhIE5VTEwgcG9pbnRlci4KKyogLSBoY2ZfcHV0X2luZm8gd2FzIGNhbGxlZCB3aXRob3V0IHByaW9yIGNhbGwgdG8gaGNmX2Nvbm5lY3QKKyogLSB0eXBlIGZpZWxkIG9mIHRoZSBMVFYtcmVjb3JkIGlzIGludmFsaWQsIGkuZS4gbmVpdGhlciBIQ0Ygbm9yIEYvVyBjYW4gaGFuZGxlIHRoZSB2YWx1ZS4KKyogLSBsZW5ndGggZmllbGQgb2YgdGhlIExUVi1yZWNvcmQgYXQgZW50cnkgaXMgbGVzcyB0aGFuIDEgb3IgZXhjZWVkcyBNQVhfTFRWX1NJWkUuCisqIC0gcmVnaXN0ZXJpbmcgYSBNYWlsQm94IHdpdGggc2l6ZSBsZXNzIHRoYW4gNjAgb3IgYSBub24tYWxpZ25lZCBidWZmZXIgYWRkcmVzcyBpcyB1c2VkLgorKiAtIHJlZW50cmFuY3ksIG1heSBiZSAgY2F1c2VkIGJ5IGNhbGxpbmcgaGNmX2Z1bmN0aW9ucyB3aXRob3V0IGFkZXF1YXRlIHByb3RlY3Rpb24gYWdhaW5zdAorKglOSUMgaW50ZXJydXB0cyBvciBtdWx0aS10aHJlYWRpbmcuCisqCisqLkRJQUdSQU0KKyoKKyouTk9USUNFCisqCVJlbWFya3M6ICBJbiBjYXNlIG9mIEhlcm1lcyBDb25maWd1cmF0aW9uIExUVnMsIHRoZSBjb2RlcyBmb3IgdGhlIHR5cGUgYXJlICJjbGV2ZXJseSIgY2hvc2VuIHRvIGJlCisqCWlkZW50aWNhbCB0byB0aGUgUklELiBIZXJtZXMgQ29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBjb3BpZWQgZnJvbSB0aGUgcHJvdmlkZWQgZGF0YSBzdHJ1Y3R1cmUgaW50byB0aGUKKyoJQ2FyZC4KKyoJSW4gY2FzZSBvZiBIQ0YgQ29uZmlndXJhdGlvbiBMVFZzLCB0aGUgdHlwZSB2YWx1ZXMgYXJlIGNob3NlbiBpbiBhIHJhbmdlIHdoaWNoIGRvZXMgbm90IG92ZXJsYXAgdGhlCisqCVJJRC1yYW5nZS4KKyoKKyoyMDoKKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludAoraGNmX3B1dF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApCit7CitpbnQgcmMgPSBIQ0ZfU1VDQ0VTUzsKKworCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfUFVUX0lORk8sIGx0dnAtPnR5cCApCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQorCUhDRkFTU0VSVF9JTlQKKwlIQ0ZBU1NFUlQoIGx0dnAsIDAgKQorCUhDRkFTU0VSVCggMSA8IGx0dnAtPmxlbiAmJiBsdHZwLT5sZW4gPD0gSENGX01BWF9MVFYgKyAxLCBsdHZwLT5sZW4gKQorCisJCQkJCQkJCQkJCS8vYWxsIGNvZGVzIGJldHdlZW4gMHhGQTAwIGFuZCAweEZDRkYgYXJlIHBhc3NlZCB0byBIZXJtZXMKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCisgewloY2ZfMTYgaTsKKwloY2ZfMzIgRkFSICoga2V5X3A7CisKKwlpZiAoIGx0dnAtPnR5cCA9PSBDRkdfQUREX1RLSVBfREVGQVVMVF9LRVkgfHwgbHR2cC0+dHlwID09IENGR19BRERfVEtJUF9NQVBQRURfS0VZICkgeworCQlrZXlfcCA9IChoY2ZfMzIqKSgoQ0ZHX0FERF9US0lQX01BUFBFRF9LRVlfU1RSQ1QgRkFSICopbHR2cCktPnR4X21pY19rZXk7CisJCWkgPSBUWF9LRVk7CQkvL2kuZS4gVHhLZXlJbmRpY2F0b3IgPT0gMSwgS2V5SUQgPT0gMAorCQlpZiAoIGx0dnAtPnR5cCA9PSBDRkdfQUREX1RLSVBfREVGQVVMVF9LRVkgKSB7CisJCQlrZXlfcCA9IChoY2ZfMzIqKSgoQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZX1NUUkNUIEZBUiAqKWx0dnApLT50eF9taWNfa2V5OworCQkJaSA9IENOVl9MSVRUTEVfVE9fU0hPUlQoKChDRkdfQUREX1RLSVBfREVGQVVMVF9LRVlfU1RSQ1QgRkFSICopbHR2cCktPnRraXBfa2V5X2lkX2luZm8pOworCQl9CisJCWlmICggaSAmIFRYX0tFWSApIHsJLyogVHhLZXlJbmRpY2F0b3IgPT0gMQorCQkJCQkJCSAgIChlaXRoZXIgcmVhbGx5IHNldCBieSBNU0YgaW4gY2FzZSBvZiBERUZBVUxUIG9yIGZha2VkIGJ5IEhDRiBpbiBjYXNlIG9mIE1BUFBFRCApICovCisJCQlpZmJwLT5JRkJfTUlDVHhDbnRsID0gKGhjZl8xNikoIEhGU19UWF9DTlRMX01JQyB8IChpICYgS0VZX0lEICk8PDggKTsKKwkJCWlmYnAtPklGQl9NSUNUeEtleVswXSA9IENOVl9MT05HUF9UT19MSVRUTEUoIGtleV9wICk7CisJCQlpZmJwLT5JRkJfTUlDVHhLZXlbMV0gPSBDTlZfTE9OR1BfVE9fTElUVExFKCAoa2V5X3ArMSkgKTsKKwkJfQorCQlpID0gKCBpICYgS0VZX0lEICkgKiAyOworCQlpZmJwLT5JRkJfTUlDUnhLZXlbaV0gICA9IENOVl9MT05HUF9UT19MSVRUTEUoIChrZXlfcCsyKSApOworCQlpZmJwLT5JRkJfTUlDUnhLZXlbaSsxXSA9IENOVl9MT05HUF9UT19MSVRUTEUoIChrZXlfcCszKSApOworCX0KKyNkZWZpbmUgUCAoKENGR19SRU1PVkVfVEtJUF9ERUZBVUxUX0tFWV9TVFJDVCBGQVIgKilsdHZwKQorCWlmICggKCBsdHZwLT50eXAgPT0gQ0ZHX1JFTU9WRV9US0lQX01BUFBFRF9LRVkgKQl8fAorCQkgKCBsdHZwLT50eXAgPT0gQ0ZHX1JFTU9WRV9US0lQX0RFRkFVTFRfS0VZICYmCisJCSAgICggKGlmYnAtPklGQl9NSUNUeENudGwgPj4gOCkgJiBLRVlfSUQgKSA9PSBDTlZfU0hPUlRfVE9fTElUVExFKFAtPnRraXBfa2V5X2lkICkKKwkJICkKKwkJKSB7IGlmYnAtPklGQl9NSUNUeENudGwgPSAwOyB9CQkvL2Rpc2FibGUgTUlDLWVuZ2luZQorI3VuZGVmIFAKKyB9CisjZW5kaWYgLy8gSENGX1RZUEVfV1BBCisKKwlpZiAoIGx0dnAtPnR5cCA9PSBDRkdfUFJPRyApIHsKKwkJcmMgPSBkb3dubG9hZCggaWZicCwgKENGR19QUk9HX1NUUkNUIEZBUiAqKWx0dnAgKTsKKwl9IGVsc2Ugc3dpdGNoIChsdHZwLT50eXApIHsKKyNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4KKwkgIGNhc2UgQ0ZHX1JFR19BU1NFUlRfUlROUDoJCQkJCQkJCQkJCS8vUmVnaXN0ZXIgTVNGIFJvdXRpbmVzCisjZGVmaW5lIFAgKChDRkdfUkVHX0FTU0VSVF9SVE5QX1NUUkNUIEZBUiAqKWx0dnApCisJCWlmYnAtPklGQl9Bc3NlcnRSdG4gPSBQLT5ydG5wOworLy8JCWlmYnAtPklGQl9Bc3NlcnRMdmwgPSBQLT5sdmw7CQkvL1RPRE8gbm90IHlldCBzdXBwb3J0ZWQgc28gZGVmYXVsdCBpcyBzZXQgaW4gaGNmX2Nvbm5lY3QKKwkJSENGQVNTRVJUKCBET19BU1NFUlQsIE1FUkdFXzIoIEhDRl9BU1NFUlQsIDB4Q0FGMSApICkJLy9qdXN0IHRvIHByb29mIHRoYXQgdGhlIGNvbXBsZXRlIGFzc2VydCBtYWNoaW5lcnkgaXMgd29ya2luZworI3VuZGVmIFAKKwkJYnJlYWs7CisjZW5kaWYgLy8gSENGX0FTU0VSVF9SVF9NU0ZfUlROCisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTkZPX0xPRworCSAgY2FzZSBDRkdfUkVHX0lORk9fTE9HOgkJCQkJCQkJCQkJLy9SZWdpc3RlciBMb2cgZmlsdGVyCisJCWlmYnAtPklGQl9SSURMb2dwID0gKChDRkdfUklEX0xPR19TVFJDVCBGQVIqKWx0dnApLT5yZWNvcmRwOworCQlicmVhazsKKyNlbmRpZiAvLyBIQ0ZfRVhUX0lORk9fTE9HCisJICBjYXNlIENGR19DTlRMX09QVDoJCQkJCQkJCQkJCQkvL292ZXJydWxlIG9wdGlvbgorCQlIQ0ZBU1NFUlQoICggbHR2cC0+dmFsWzBdICYgfihVU0VfRE1BIHwgVVNFXzE2QklUKSApID09IDAsIGx0dnAtPnZhbFswXSApCisJCWlmICggKCBsdHZwLT52YWxbMF0gJiBVU0VfRE1BICkgPT0gMCApIGlmYnAtPklGQl9DbnRsT3B0ICY9IH5VU0VfRE1BOworCQlpZmJwLT5JRkJfQ250bE9wdCB8PSAgbHR2cC0+dmFsWzBdICYgVVNFXzE2QklUOworCQlicmVhazsKKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX01CCisJICBjYXNlIENGR19SRUdfTUI6CQkJCQkJCQkJCQkJCS8vUmVnaXN0ZXIgTWFpbEJveAorI2RlZmluZSBQICgoQ0ZHX1JFR19NQl9TVFJDVCBGQVIgKilsdHZwKQorCQlIQ0ZBU1NFUlQoICggKGhjZl8zMilQLT5tYl9hZGRyICYgMHgwMDAxICkgPT0gMCwgKGhjZl8zMilQLT5tYl9hZGRyICkKKwkJSENGQVNTRVJUKCAoUCktPm1iX3NpemUgPj0gNjAsIChQKS0+bWJfc2l6ZSApCisJCWlmYnAtPklGQl9NQnAgPSBQLT5tYl9hZGRyOworCQkvKiBpZiBubyBNQiBwcmVzZW50LCBzaXplIG11c3QgYmUgMCBmb3IgOz90aGUgb2xkOz8gcHV0X2luZm9fbWIgdG8gd29yayBjb3JyZWN0bHkgKi8KKwkJaWZicC0+SUZCX01CU2l6ZSA9IGlmYnAtPklGQl9NQnAgPT0gTlVMTCA/IDAgOiBQLT5tYl9zaXplOworCQlpZmJwLT5JRkJfTUJXcCA9IGlmYnAtPklGQl9NQlJwCT0gMDsKKwkJaWZicC0+SUZCX01CcFswXSA9IDA7CQkJCQkJCQkJCQkvL2ZsYWcgdGhlIE1haWxCb3ggYXMgZW1wdHkKKwkJaWZicC0+SUZCX01CSW5mb0xlbiA9IDA7CisJCUhDRkFTU0VSVCggaWZicC0+SUZCX01CU2l6ZSA+PSA2MCB8fCBpZmJwLT5JRkJfTUJwID09IE5VTEwsIGlmYnAtPklGQl9NQlNpemUgKQorI3VuZGVmIFAKKwkJYnJlYWs7CisJICBjYXNlIENGR19NQl9JTkZPOgkJCQkJCQkJCQkJCQkvL3N0b3JlIE1haWxCb3hJbmZvQmxvY2sKKwkJcmMgPSBwdXRfaW5mb19tYiggaWZicCwgKENGR19NQl9JTkZPX1NUUkNUIEZBUiAqKWx0dnAgKTsKKwkJYnJlYWs7CisjZW5kaWYgLy8gSENGX0VYVF9NQgorCisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9OSUNfQUNDRVNTCisJICBjYXNlIENGR19DTURfTklDOgorI2RlZmluZSBQICgoQ0ZHX0NNRF9OSUNfU1RSQ1QgRkFSICopbHR2cCkKKwkJT1BXKCBIUkVHX1BBUkFNXzIsIFAtPnBhcm0yICk7CisJCU9QVyggSFJFR19QQVJBTV8xLCBQLT5wYXJtMSApOworCQlyYyA9IGNtZF9leGUoIGlmYnAsIFAtPmNtZCwgUC0+cGFybTAgKTsKKwkJUC0+aGNmX3N0YXQgPSAoaGNmXzE2KXJjOworCQlQLT5zdGF0ID0gSVBXKCBIUkVHX1NUQVQgKTsKKwkJUC0+cmVzcDAgPSBJUFcoIEhSRUdfUkVTUF8wICk7CisJCVAtPnJlc3AxID0gSVBXKCBIUkVHX1JFU1BfMSApOworCQlQLT5yZXNwMiA9IElQVyggSFJFR19SRVNQXzIgKTsKKwkJUC0+aWZiX2Vycl9jbWQgPSBpZmJwLT5JRkJfRXJyQ21kOworCQlQLT5pZmJfZXJyX3F1YWxpZmllciA9IGlmYnAtPklGQl9FcnJRdWFsaWZpZXI7CisjdW5kZWYgUAorCQlicmVhazsKKwkgIGNhc2UgQ0ZHX0NNRF9IQ0Y6CisjZGVmaW5lIFAgKChDRkdfQ01EX0hDRl9TVFJDVCBGQVIgKilsdHZwKQorCQlIQ0ZBU1NFUlQoIFAtPmNtZCA9PSBDRkdfQ01EX0hDRl9SRUdfQUNDRVNTLCBQLT5jbWQgKQkJLy9vbmx5IEhlcm1lcyByZWdpc3RlciBhY2Nlc3Mgc3VwcG9ydGVkCisJCWlmICggUC0+Y21kID09IENGR19DTURfSENGX1JFR19BQ0NFU1MgKSB7CisJCQlIQ0ZBU1NFUlQoIFAtPm1vZGUgPCBpZmJwLT5JRkJfSU9CYXNlLCBQLT5tb2RlICkJCS8vQ2hlY2sgUmVnaXN0ZXIgc3BhY2UKKwkJCU9QVyggUC0+bW9kZSwgUC0+YWRkX2luZm8pOworCQl9CisjdW5kZWYgUAorCQlicmVhazsKKyNlbmRpZiAvLyBIQ0ZfRVhUX05JQ19BQ0NFU1MKKworI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfUFJJTlRGCisgICAgICBjYXNlIENGR19GV19QUklOVEZfQlVGRkVSX0xPQ0FUSU9OOgorICAgICAgICBpZmJwLT5JRkJfRndQZkJ1ZmYgPSAqKENGR19GV19QUklOVEZfQlVGRkVSX0xPQ0FUSU9OX1NUUkNUKilsdHZwOworICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUX1BSSU5URgorCisJICBkZWZhdWx0OgkJCQkJCS8vcGFzcyBldmVyeXRoaW5nIHVua25vd24gYWJvdmUgdGhlICJGSUQiIHJhbmdlIHRvIHRoZSBIZXJtZXMgb3IgRG9uZ2xlCisJCXJjID0gcHV0X2luZm8oIGlmYnAsIGx0dnAgKTsKKwl9CisJLy9ETyBOT1QgISEhIEhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICkJCQkJCQkJCQkJCQkvKiAyMCAqLworCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9QVVRfSU5GTyApCisJcmV0dXJuIHJjOworfSAvLyBoY2ZfcHV0X2luZm8KKworCisjaWYgKEhDRl9ETF9PTkxZKSA9PSAwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLk1PRFVMRQkJaW50IGhjZl9yY3ZfbXNnKCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0ICkKKyouUFVSUE9TRQkJQWxsOiBkZWNhcHN1bGF0ZSBhIG1lc3NhZ2UuCisqCQkJCXByZS1IZXJtZXNJSS41OiB2ZXJpZnkgTUlDLgorKgkJCQlub24tVVNCLCBub24tRE1BIG1vZGU6IFRyYW5zZmVyIGEgbWVzc2FnZSBmcm9tIHRoZSBOSUMgdG8gdGhlIEhvc3QgYW5kIGFja25vd2xlZGdlIHJlY2VwdGlvbi4KKyoJCQkJVVNCOiBUcmFuc2Zvcm0gYSBtZXNzYWdlIGZyb20gcHJvcHJpZXRhcnkgVVNCIGZvcm1hdCB0byA4MDIuMyBmb3JtYXQKKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKglkZXNjcAkJUG9pbnRlciB0byB0aGUgRGVzY3JpcHRvciBMaXN0IGxvY2F0aW9uLgorKglvZmZzZXQJCVVTQjogbm90IHVzZWQKKyoJCQkJbm9uLVVTQjogc3BlY2lmaWVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEgdG8gYmUgb2J0YWluZWQgKDAgY29ycmVzcG9uZHMgd2l0aCBEZXN0QWRkciBmaWVsZAorKgkJCQlvZiBmcmFtZSkuCisqCisqLlJFVFVSTlMKKyoJSENGX1NVQ0NFU1MJCQlObyBTU04gZXJyb3IgKCBvciBIQ0ZfRVJSX01JQyBhbHJlYWR5IHJlcG9ydGVkIGJ5IGhjZl9zZXJ2aWNlX25pYykKKyoJSENGX0VSUl9NSUMJCQltZXNzYWdlIGNvbnRhaW5zIGFuIGVycm9uZW91cyBNSUMgKCBIQ0ZfU1VDQ0VTUyBpcyByZXBvcnRlZCBpZiBIQ0ZfRVJSX01JQyBpcyBhbHJlYWR5CisqCQkJCQkJcmVwb3J0ZWQgYnkgaGNmX3NlcnZpY2VfbmljKQorKiAJSENGX0VSUl9OT19OSUMJCU5JQyByZW1vdmVkIGR1cmluZyBkYXRhIHJldHJpZXZhbAorKiAJSENGX0VSUl9ERUZVTkNULi4uCisqCisqLkRFU0NSSVBUSU9OCisqIFRoZSBSZWNlaXZlIE1lc3NhZ2UgRnVuY3Rpb24gY2FuIGJlIGV4ZWN1dGVkIGJ5IHRoZSBNU0YgdG8gb2J0YWluIHRoZSBEYXRhIEluZm8gZmllbGRzIG9mIHRoZSBtZXNzYWdlIHRoYXQKKyogaXMgcmVwb3J0ZWQgdG8gYmUgYXZhaWxhYmxlIGJ5IHRoZSBTZXJ2aWNlIE5JQyBGdW5jdGlvbi4KKyoKKyogVGhlIFJlY2VpdmUgTWVzc2FnZSBGdW5jdGlvbiBjb3BpZXMgdGhlIG1lc3NhZ2UgZGF0YSBhdmFpbGFibGUgaW4gdGhlIENhcmQgbWVtb3J5IGludG8gYSBidWZmZXIgc3RydWN0dXJlCisqIHByb3ZpZGVkIGJ5IHRoZSBNU0YuCisqIE9ubHkgZGF0YSBvZiB0aGUgbWVzc2FnZSBpbmRpY2F0ZWQgYnkgdGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIGNhbiBiZSBvYnRhaW5lZC4KKyogRXhlY3V0aW9uIG9mIHRoZSBTZXJ2aWNlIE5JQyBmdW5jdGlvbiBtYXkgcmVzdWx0IGluIHRoZSBhdmFpbGFiaWxpdHkgb2YgYSBuZXcgbWVzc2FnZSwgYnV0IGl0IGRlZmluaXRlbHkKKyogbWFrZXMgdGhlIG1lc3NhZ2UgcmVwb3J0ZWQgYnkgdGhlIHByZWNlZGluZyBTZXJ2aWNlIE5JQyBmdW5jdGlvbiwgdW5hdmFpbGFibGUuCisqCisqIGluIG5vbi1VU0Ivbm9uLURNQSBtb2RlLCBoY2ZfcmN2X21zZyBzdGFydHMgdGhlIGNvcHkgcHJvY2VzcyBhdCB0aGUgKG5vbi1uZWdhdGl2ZSkgb2Zmc2V0IHJlcXVlc3RlZCBieSB0aGUKKyogcGFyYW1ldGVyIG9mZnNldCwgcmVsYXRpdmUgdG8gSEZTX0FERFJfREVTVCwgZS5nIG9mZnNldCAwIHN0YXJ0cyBjb3B5aW5nIGZyb20gdGhlIERlc3RpbmF0aW9uIEFkZHJlc3MsIHRoZQorKiB2ZXJ5IGJlZ2luIG9mIHRoZSA4MDIuMyBmcmFtZSBtZXNzYWdlLiBPZmZzZXQgbXVzdCBlaXRoZXIgbGF5IHdpdGhpbiB0aGUgcGFydCBvZiB0aGUgODAyLjMgZnJhbWUgYXMgc3RvcmVkCisqIGJ5IGhjZl9zZXJ2aWNlX25pYyBpbiB0aGUgbG9va2FoZWFkIGJ1ZmZlciBvciBiZSBqdXN0IGJlaGluZCBpdCwgaS5lLiB0aGUgZmlyc3QgYnl0ZSBub3QgeWV0IHJlYWQuCisqIFdoZW4gb2Zmc2V0IGlzIHdpdGhpbiBsb29rYWhlYWQsIGRhdGEgaXMgY29waWVkIGZyb20gbG9va2FoZWFkLgorKiBXaGVuIG9mZnNldCBpcyBiZXlvbmQgbG9va2FoZWFkLCBkYXRhIGlzIHJlYWQgZGlyZWN0bHkgZnJvbSBSeEZTIGluIE5JQyB3aXRoIGRpc3JlZ2FyZCBvZiB0aGUgYWN0dWFsIHZhbHVlCisqIG9mIG9mZnNldAorKgorKi5OT1RJQ0U6CisqIG8gYXQgZW50cnk6IGxvb2sgYWhlYWQgYnVmZmVyIGFzIHBhc3NlZCB3aXRoIGhjZl9zZXJ2aWNlX25pYyBpcyBzdGlsbCBhY2Nlc3NpYmxlIGFuZCB1bmNoYW5nZWQKKyogbyBhdCBleGl0OiBSZWNlaXZlIEZyYW1lIGluIE5JQyBtZW1vcnkgaXMgcmVsZWFzZWQKKyoKKyogRGVzY3JpcHRpb246CisqIFN0YXJ0aW5nIGF0IHRoZSBieXRlIGluZGljYXRlZCBieSB0aGUgT2Zmc2V0IHZhbHVlLCB0aGUgYnl0ZXMgYXJlIGNvcGllZCBmcm9tIHRoZSBEYXRhIEluZm8KKyogUGFydCBvZiB0aGUgY3VycmVudCBSZWNlaXZlIEZyYW1lIFN0cnVjdHVyZSB0byB0aGUgSG9zdCBtZW1vcnkgZGF0YSBidWZmZXIgc3RydWN0dXJlCisqIGlkZW50aWZpZWQgYnkgZGVzY3AuCisqIFRoZSBtYXhpbXVtIHZhbHVlIGZvciBPZmZzZXQgaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIG9mIHRoZSA4MDIuMyBmcmFtZSByZWFkIGludG8gdGhlCisqIGxvb2sgYWhlYWQgYnVmZmVyIGJ5IGhjZl9zZXJ2aWNlX25pYyAoaS5lLiB0aGUgbG9vayBhaGVhZCBidWZmZXIgc2l6ZSBtaW51cworKiBDb250cm9sIGFuZCA4MDIuMTEgZmllbGRzKQorKiBJZiBPZmZzZXQgaXMgbGVzcyB0aGFuIHRoZSBtYXhpbXVtIHZhbHVlLCBjb3B5aW5nIHN0YXJ0cyBmcm9tIHRoZSBsb29rIGFoZWFkIGJ1ZmZlciB0aWxsIHRoZQorKiBlbmQgb2YgdGhhdCBidWZmZXIgaXMgcmVhY2hlZAorKiBUaGVuIChvciBpZiB0aGUgbWF4aW11bSB2YWx1ZSBpcyBzcGVjaWZpZWQgZm9yIE9mZnNldCksIHRoZQorKiBtZXNzYWdlIGlzIGRpcmVjdGx5IGNvcGllZCBmcm9tIE5JQyBtZW1vcnkgdG8gSG9zdCBtZW1vcnkuCisqIElmIGFuIGludmFsaWQgKGkuZS4gdG9vIGxhcmdlKSBvZmZzZXQgaXMgc3BlY2lmaWVkLCBhbiBhc3NlcnQgY2F0Y2hlcyBidXQgdGhlIGJ1ZmZlciBjb250ZW50cyBhcmUKKyogdW5kZWZpbmVkLgorKiBDb3B5aW5nIHN0b3BzIGlmIGVpdGhlcjoKKyogbyB0aGUgZW5kIG9mIHRoZSA4MDIuMyBmcmFtZSBpcyByZWFjaGVkCisqIG8gdGhlIERlc2NyaXB0b3Igd2l0aCBhIE5VTEwgcG9pbnRlciBpbiB0aGUgbmV4dF9kZXNjX2FkZHIgZmllbGQgaXMgcmVhY2hlZAorKgorKiBXaGVuIHRoZSBjb3B5aW5nIHN0b3BzLCB0aGUgcmVjZWl2ZXIgaXMgYWNrJ2VkLCB0aHVzIGZyZWVpbmcgdGhlIE5JQyBtZW1vcnkgd2hlcmUgdGhlIGZyYW1lIGlzIHN0b3JlZAorKiBBcyBhIGNvbnNlcXVlbmNlLCBoY2ZfcmN2X21zZyBjYW4gb25seSBiZSBjYWxsZWQgb25jZSBmb3IgYW55IHBhcnRpY3VsYXIgUnggZnJhbWUuCisqCisqIEZvciB0aGUgdGltZSBiZWluZyAoUENJIEJ1cyBtYXN0ZXJpbmcgbm90IHlldCBzdXBwb3J0ZWQpLCBvbmx5IHRoZSBmb2xsb3dpbmcgZmllbGRzIG9mIGVhY2gKKyogb2YgdGhlIGRlc2NyaXB0b3JzIGluIHRoZSBkZXNjcmlwdG9yIGxpc3QgbXVzdCBiZSBzZXQgYnkgdGhlIE1TRjoKKyogbyBidWZfY250bC5idWZfZGltWzFdCisqIG8gKm5leHRfZGVzY19hZGRyCisqIG8gKmJ1Zl9hZGRyCisqIEF0IHJldHVybiBmcm9tIGhjZl9yY3ZfbXNnLCB0aGUgZmllbGQgYnVmX2NudGwuYnVmX2RpbVswXSBvZiB0aGUgdXNlZCBEZXNjcmlwdG9ycyByZWZsZWN0cworKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIgY29ycmVzcG9uZGluZyB3aXRoIHRoZSBEZXNjcmlwdG9yLgorKiBPbiB0aGUgbGFzdCB1c2VkIERlc2NyaXB0b3IsIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gaXMgbGVzcyBvciBlcXVhbCB0byBidWZfY250bC5idWZfZGltWzFdLgorKiBPbiBhbGwgcHJlY2VkaW5nIERlc2NyaXB0b3JzIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gaXMgZXF1YWwgdG8gYnVmX2NudGwuYnVmX2RpbVsxXS4KKyogT24gYWxsIHN1Y2NlZWRpbmcgKHVudXNlZCkgRGVzY3JpcHRvcnMsIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gaXMgemVyby4KKyogTm90ZTogdGhpcyBJL0YgaXMgYmFzZWQgb24gdGhlIGFzc3VtcHRpb25zIGhvdyB0aGUgSS9GIG5lZWRlZCBmb3IgUENJIEJ1cyBtYXN0ZXJpbmcgd2lsbAorKiBiZSwgc28gaXQgbWF5IGNoYW5nZS4KKyoKKyogVGhlIG1vc3QgbGlrZWx5IGhhbmRsaW5nIG9mIEhDRl9FUlJfTk9fTklDIGJ5IHRoZSBNU0YgaXMgdG8gZHJvcCB0aGUgYWxyZWFkeSBjb3BpZWQKKyogZGF0YSBhcyBlbGVnYW50bHkgYXMgcG9zc2libGUgdW5kZXIgdGhlIGNvbnN0cmFpbnRzIGFuZCByZXF1aXJlbWVudHMgcG9zZWQgYnkgdGhlIChOKU9TLgorKiBJZiBubyByZWNlaXZlZCBGcmFtZSBTdHJ1Y3R1cmUgaXMgcGVuZGluZywgIlN1Y2Nlc3MiIHJhdGhlciB0aGFuICJSZWFkIGVycm9yIiBpcyByZXR1cm5lZC4KKyogVGhpcyBlcnJvciBjb25zdGl0dXRlcyBhIGxvZ2ljIGZsYXcgaW4gdGhlIE1TRgorKiBUaGUgSENGIGNhbiBvbmx5IGNhdGNoIGEgbWlub3JpdHkgb2YgdGhpcworKiB0eXBlIG9mIGVycm9ycworKiBCYXNlZCBvbiBjb25zaXN0ZW5jeSBpZGVhcywgdGhlIEhDRiBjYXRjaGVzIG5vbmUgb2YgdGhlc2UgZXJyb3JzLgorKgorKiBBc3NlcnQgZmFpbHMgaWYKKyogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUKKyogLSB0aGVyZSBpcyBubyB1bmFja25vd2xlZGdlZCBSeC1tZXNzYWdlIGF2YWlsYWJsZQorKiAtIG9mZnNldCBpcyBvdXQgb2YgcmFuZ2UgKG91dHNpZGUgbG9vayBhaGVhZCBidWZmZXIpCisqIC0gZGVzY3AgaXMgYSBOVUxMIHBvaW50ZXIKKyogLSBhbnkgb2YgdGhlIGRlc2NyaXB0b3JzIGlzIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCisqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbgorKiAJYWdhaW5zdCBOSUMgaW50ZXJydXB0cyBvciBtdWx0aS10aHJlYWRpbmcuCisqIC0gSW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KKyoKKyouRElBR1JBTQorKgorKi5OT1RJQ0UKKyogLSBieSB1c2luZyB1bnNpZ25lZCBpbnQgYXMgdHlwZSBmb3Igb2Zmc2V0LCBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IG5lZ2F0aXZlIG9mZnNldHMKKyogLSBBc3NlcnRpbmcgb24gYmVpbmcgZW5hYmxlZC9wcmVzZW50IGlzIHN1cGVyZmx1b3VzLCBzaW5jZSBhIG5vbi16ZXJvIElGQl9sYWwgaW1wbGllcyB0aGF0IGhjZl9zZXJ2aWNlX25pYworKiAgIHdhcyBjYWxsZWQgYW5kIGRldGVjdGVkIGEgUngtbWVzc2FnZS4gQSB6ZXJvIElGQl9sYWwgd2lsbCBzZXQgdGhlIEJVRl9DTlQgZmllbGQgb2YgYXQgbGVhc3QgdGhlIGZpcnN0CisqICAgZGVzY3JpcHRvciB0byB6ZXJvLgorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAoraGNmX3Jjdl9tc2coIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIHVuc2lnbmVkIGludCBvZmZzZXQgKQoreworaW50CQkJcmMgPSBIQ0ZfU1VDQ0VTUzsKK3djaV9idWZwCWNwOwkJCQkJCQkJCQkvL2NoYXIgb3JpZW50ZWQgd29ya2luZyBwb2ludGVyCitoY2ZfMTYJCWk7CitpbnQJCQl0b3RfbGVuID0gaWZicC0+SUZCX1J4TGVuIC0gb2Zmc2V0OwkJLy90b3RhbCBsZW5ndGgKK3djaV9idWZwCWxhcCA9IGlmYnAtPklGQl9sYXAgKyBvZmZzZXQ7CQkJLy9zdGFydCBhZGRyZXNzIGluIExvb2tBaGVhZCBCdWZmZXIKK2hjZl8xNgkJbGFsID0gaWZicC0+SUZCX2xhbCAtIG9mZnNldDsJCQkvL2F2YWlsYWJsZSBkYXRhIHdpdGhpbiBMb29rQWhlYWQgQnVmZmVyCitoY2ZfMTYJCWo7CisKKwlIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX1JDVl9NU0csIG9mZnNldCApCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQorCUhDRkFTU0VSVF9JTlQKKwlIQ0ZBU1NFUlQoIGRlc2NwLCBIQ0ZfVFJBQ0VfUkNWX01TRyApCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfUnhMZW4sIEhDRl9UUkFDRV9SQ1ZfTVNHICkKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9SeExlbiA+PSBvZmZzZXQsIE1FUkdFXzIoIG9mZnNldCwgaWZicC0+SUZCX1J4TGVuICkgKQorCUhDRkFTU0VSVCggaWZicC0+SUZCX2xhbCA+PSBvZmZzZXQsIG9mZnNldCApCisJSENGQVNTRVJUKCAoaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BKSA9PSAwLCAweERBREEgKQorCisJaWYgKCB0b3RfbGVuIDwgMCApIHsKKwkJbGFsID0gMDsgdG90X2xlbiA9IDA7CQkJCS8vc3VwcHJlc3MgYWxsIGNvcHlpbmcgYWN0aXZpdHkgaW4gdGhlIGRvLS13aGlsZSBsb29wCisJfQorCWRvIHsJCQkJCQkJCQkvL2xvb3Agb3ZlciBhbGwgYXZhaWxhYmxlIGZyYWdtZW50cworCQkvLyBvYm5veGlvdXMgaGNmLmMoMTQ4MCkgOiB3YXJuaW5nIEM0NzY5OiBjb252ZXJzaW9uIG9mIG5lYXIgcG9pbnRlciB0byBsb25nIGludGVnZXIKKwkJSENGQVNTRVJUKCAoKGhjZl8zMilkZXNjcCAmIDMgKSA9PSAwLCAoaGNmXzMyKWRlc2NwICkKKwkJY3AgPSBkZXNjcC0+YnVmX2FkZHI7CisJCWogPSBtaW4oIChoY2ZfMTYpdG90X2xlbiwgZGVzY3AtPkJVRl9TSVpFICk7CS8vbWluaW11bSBvZiAid2hhdCdzYCBhdmFpbGFibGUiIGFuZCBmcmFnbWVudCBzaXplCisJCWRlc2NwLT5CVUZfQ05UID0gajsKKwkJdG90X2xlbiAtPSBqOwkJCQkJCS8vYWRqdXN0IGxlbmd0aCBzdGlsbCB0byBnbworCQlpZiAoIGxhbCApIHsJCQkJCQkvL2lmIGxvb2thaGVhZCBCdWZmZXIgbm90IHlldCBjb21wbGV0ZWx5IGNvcGllZAorCQkJaSA9IG1pbiggbGFsLCBqICk7CQkJCS8vbWluaW11bSBvZiAid2hhdCdzIGF2YWlsYWJsZSIgaW4gTG9va0FoZWFkIGFuZCBmcmFnbWVudCBzaXplCisJCQlsYWwgLT0gaTsJCQkJCQkvL2FkanVzdCBsZW5ndGggc3RpbGwgYXZhaWxhYmxlIGluIExvb2tBaGVhZAorCQkJaiAtPSBpOwkJCQkJCQkvL2FkanVzdCBsZW5ndGggc3RpbGwgYXZhaWxhYmxlIGluIGN1cnJlbnQgZnJhZ21lbnQKKwkJCS8qOz8gd2hpbGUgbG9vcCBjb3VsZCBiZSBpbXByb3ZlZCBieSBtb3Zpbmcgd29yZHMgYnV0IHRoYXQgaXMgY29tcGxpY2F0ZWQgb24gcGxhdGZvcm1zIHdpdGgKKwkJCSAqIGFsaWdubWVudCByZXF1aXJlbWVudHMqLworCQkJd2hpbGUgKCBpLS0gKSAqY3ArKyA9ICpsYXArKzsKKwkJfQorCQlpZiAoIGogKSB7CS8vaWYgTG9va0FoZWFkIEJ1ZmZlciBleGhhdXN0ZWQgYnV0IHN0aWxsIHNwYWNlIGluIGZyYWdtZW50LCBjb3B5IGRpcmVjdGx5IGZyb20gTklDIFJBTQorCQkJZ2V0X2ZyYWcoIGlmYnAsIGNwLCBqIEJFX1BBUigwKSApOworCQkJQ0FMQ19SWF9NSUMoIGNwLCBqICk7CisJCX0KKwl9IHdoaWxlICggKCBkZXNjcCA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkciApICE9IE5VTEwgKTsKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCisJaWYgKCBpZmJwLT5JRkJfUnhGSUQgKSB7CisJCXJjID0gY2hlY2tfbWljKCBpZmJwICk7CQkJCS8vcHJldmVudHMgTUlDIGVycm9yIHJlcG9ydCBpZiBoY2Zfc2VydmljZV9uaWMgYWxyZWFkeSBjb25zdW1lZCBhbGwKKwl9CisjZW5kaWYgLy8gSENGX1RZUEVfV1BBCisJKHZvaWQpaGNmX2FjdGlvbiggaWZicCwgSENGX0FDVF9SWF9BQ0sgKTsJCS8vb25seSAxIHNob3QgdG8gZ2V0IHRoZSBkYXRhLCBzbyBmcmVlIHRoZSByZXNvdXJjZXMgaW4gdGhlIE5JQworCUhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICkKKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfUkNWX01TRyApCisJcmV0dXJuIHJjOworfSAvLyBoY2ZfcmN2X21zZworI2VuZGlmIC8vIEhDRl9ETF9PTkxZCisKKworI2lmIChIQ0ZfRExfT05MWSkgPT0gMAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5NT0RVTEUJCWludCBoY2Zfc2VuZF9tc2coIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIGhjZl8xNiB0eF9jbnRsICkKKyouUFVSUE9TRQkJRW5jYXBzdWxhdGUgYSBtZXNzYWdlIGFuZCBhcHBlbmQgcGFkZGluZyBhbmQgTUlDLgorKgkJCQlub24tVVNCOiBUcmFuc2ZlcnMgdGhlIHJlc3VsdGluZyBtZXNzYWdlIGZyb20gSG9zdCB0byBOSUMgYW5kIGluaXRpYXRlcyB0cmFuc21pc3Npb24uCisqCQkJCVVTQjogVHJhbnNmZXIgcmVzdWx0aW5nIG1lc3NhZ2UgaW50byBhIGZsYXQgYnVmZmVyLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCWRlc2NwCQlwb2ludGVyIHRvIHRoZSBEZXNjcmlwdG9yTGlzdCBvciBOVUxMCisqCXR4X2NudGwJCWluZGljYXRlcyBNQUMtcG9ydCBhbmQgKEhlcm1lcykgb3B0aW9ucworKgkJCQkJSEZTX1RYX0NOVExfU1BFQ1RSQUxJTksKKyoJCQkJCUhGU19UWF9DTlRMX1BSSU8KKyoJCQkJCUhGU19UWF9DTlRMX1RYX09LCisqCQkJCQlIRlNfVFhfQ05UTF9UWF9FWAorKgkJCQkJSEZTX1RYX0NOVExfVFhfREVMQVkKKyoJCQkJCUhGU19UWF9DTlRMX1RYX0NPTlQKKyoJCQkJCUhDRl9QT1JUXzAJCQkJIE1BQyBQb3J0IDAgKGRlZmF1bHQpCisqCQkJCQlIQ0ZfUE9SVF8xIChBUCBvbmx5KQkgTUFDIFBvcnQgMQorKgkJCQkJSENGX1BPUlRfMiAoQVAgb25seSkJIE1BQyBQb3J0IDIKKyoJCQkJCUhDRl9QT1JUXzMgKEFQIG9ubHkpCSBNQUMgUG9ydCAzCisqCQkJCQlIQ0ZfUE9SVF80IChBUCBvbmx5KQkgTUFDIFBvcnQgNAorKgkJCQkJSENGX1BPUlRfNSAoQVAgb25seSkJIE1BQyBQb3J0IDUKKyoJCQkJCUhDRl9QT1JUXzYgKEFQIG9ubHkpCSBNQUMgUG9ydCA2CisqCisqLlJFVFVSTlMKKyoJSENGX1NVQ0NFU1MKKyoJSENGX0VSUl9ERUZVTkNUXy4uCisqCUhDRl9FUlJfVElNRV9PVVQKKyoKKyouREVTQ1JJUFRJT046CisqIFRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24gZW1ib2RpZXMgMiBmdW5jdGlvbnM6CisqIG8gdHJhbnNmZXJzIGEgbWVzc2FnZSAoaW5jbHVkaW5nIE1BQyBoZWFkZXIpIGZyb20gdGhlIHByb3ZpZGVkIGJ1ZmZlciBzdHJ1Y3R1cmUgaW4gSG9zdCBtZW1vcnkgdG8gdGhlIFRyYW5zbWl0CisqIEZyYW1lIFN0cnVjdHVyZSAoVHhGUykgaW4gTklDIG1lbW9yeS4KKyogbyBJc3N1ZSBhIHNlbmQgY29tbWFuZCB0byB0aGUgRi9XIHRvIGFjdHVhbGx5IHRyYW5zbWl0IHRoZSBjb250ZW50cyBvZiB0aGUgVHhGUy4KKyoKKyogQ29udHJvbCBpcyBiYXNlZCBvbiB0aGUgUmVzb3VyY2UgSW5kaWNhdG9yIElGQl9Sc2NJbmQuCisqIFRoZSBSZXNvdXJjZSBJbmRpY2F0b3IgaXMgbWFpbnRhaW5lZCBieSB0aGUgSENGIGFuZCBzaG91bGQgb25seSBiZSBpbnRlcnByZXRlZCBidXQgbm90IGNoYW5nZWQgYnkgdGhlIE1TRi4KKyogVGhlIE1TRiBtdXN0IGNoZWNrIElGQl9Sc2NJbmQgdG8gYmUgbm9uLXplcm8gYmVmb3JlIGV4ZWN1dGluZyB0aGUgY2FsbCB0byB0aGUgU2VuZCBNZXNzYWdlIEZ1bmN0aW9uLgorKiBXaGVuIG5vIHJlc291cmNlcyBhcmUgYXZhaWxhYmxlLCB0aGUgTVNGIG11c3QgaGFuZGxlIHRoZSBxdWV1aW5nIG9mIHRoZSBUcmFuc21pdCBmcmFtZSBhbmQgY2hlY2sgdGhlCisqIFJlc291cmNlIEluZGljYXRvciBwZXJpb2RpY2FsbHkgYWZ0ZXIgY2FsbGluZyBoY2Zfc2VydmljZV9uaWMuCisqCisqIFRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb25zIHRyYW5zZmVycyBhIG1lc3NhZ2UgdG8gTklDIG1lbW9yeSB3aGVuIGl0IGlzIGNhbGxlZCB3aXRoIGEgbm9uLU5VTEwgZGVzY3AuCisqIEJlZm9yZSB0aGUgU2VuZCBNZXNzYWdlIEZ1bmN0aW9uIGlzIGludm9rZWQgdGhpcyB3YXksIHRoZSBSZXNvdXJjZSBJbmRpY2F0b3IgKElGQl9Sc2NJbmQpIG11c3QgYmUgY2hlY2tlZC4KKyogSWYgdGhlIFJlc291cmNlIGlzIG5vdCBhdmFpbGFibGUsIFNlbmQgTWVzc2FnZSBGdW5jdGlvbiBleGVjdXRpb24gbXVzdCBiZSBwb3N0cG9uZWQgdW50aWwgYWZ0ZXIgcHJvY2Vzc2luZyBvZgorKiBhIG5leHQgaGNmX3NlcnZpY2VfbmljIGl0IGFwcGVhcnMgdGhhdCB0aGUgUmVzb3VyY2UgaGFzIGJlY29tZSBhdmFpbGFibGUuCisqIFRoZSBtZXNzYWdlIGlzIGNvcGllZCBmcm9tIHRoZSBidWZmZXIgc3RydWN0dXJlIGlkZW50aWZpZWQgYnkgZGVzY3AgdG8gdGhlIE5JQy4KKyogQ29weWluZyBzdG9wcyBpZiBhIE5VTEwgcG9pbnRlciBpbiB0aGUgbmV4dF9kZXNjX2FkZHIgZmllbGQgaXMgcmVhY2hlZC4KKyogSGNmX3NlbmRfbXNnIGRvZXMgbm90IGNoZWNrIGZvciB0cmFuc21pdCBidWZmZXIgb3ZlcmZsb3csIGJlY2F1c2UgdGhlIEYvVyBkb2VzIHRoaXMgcHJvdGVjdGlvbi4KKyogSW4gY2FzZSBvZiBhIHRyYW5zbWl0IGJ1ZmZlciBvdmVyZmxvdywgdGhlIHN1cnBsdXMgd2hpY2ggZG9lcyBub3QgZml0IGluIHRoZSBidWZmZXIgaXMgc2ltcGx5IGRyb3BwZWQuCisqCisqIFRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24gYWN0aXZhdGVzIHRoZSBGL1cgdG8gYWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgbWVkaXVtIHdoZW4gdGhlCisqIEhGU19UWF9DTlRMX1RYX0RFTEFZIGJpdCBvZiB0aGUgdHhfY250bCBwYXJhbWV0ZXIgaXMgbm90IHNldC4KKyogSWYgdGhlIGRlc2NwIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBjYWxsIGlzIG5vbi1OVUxMLCB0aGUgbWVzc2FnZSBhcyByZXByZXNlbnRlZCBieSBkZXNjcCBpcyBzZW5kLgorKiBJZiB0aGUgZGVzY3AgcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGNhbGwgaXMgTlVMTCwgYW5kIGlmIHRoZSBwcmVjZWRpbmcgY2FsbCBvZiB0aGUgU2VuZCBNZXNzYWdlIEZ1bmN0aW9uIGhhZAorKiBhIG5vbi1OVUxMIGRlc2NwIGFuZCB0aGUgcHJlY2VkaW5nIGNhbGwgaGFkIHRoZSBIRlNfVFhfQ05UTF9UWF9ERUxBWSBiaXQgb2YgdHhfY250bCBzZXQsIHRoZW4gdGhlIG1lc3NhZ2UgYXMKKyogcmVwcmVzZW50ZWQgYnkgdGhlIGRlc2NwIG9mIHRoZSBwcmVjZWRpbmcgY2FsbCBpcyBzZW5kLgorKgorKiBIY2Zfc2VuZF9tc2cgc3VwcG9ydHMgZW5jYXBzdWxhdGlvbiAoc2VlIEhDRl9FTkNBUCkgb2YgRXRoZXJuZXQtSUkgZnJhbWVzLgorKiBBbiBFdGhlcm5ldC1JSSBmcmFtZSBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgVHJhbnNtaXQgRnJhbWUgc3RydWN0dXJlIGFzIGFuIDgwMi4zIGZyYW1lLgorKiBIY2Zfc2VuZF9tc2cgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFuIDgwMi4zIGFuZCBhbiBFdGhlcm5ldC1JSSBmcmFtZSBieSBsb29raW5nIGF0IHRoZSBkYXRhIGxlbmd0aC90eXBlIGZpZWxkCisqIG9mIHRoZSBmcmFtZS4gSWYgdGhpcyBmaWVsZCBjb250YWlucyBhIHZhbHVlIGxhcmdlciB0aGFuIDE1MTQsIHRoZSBmcmFtZSBpcyBjb25zaWRlcmVkIHRvIGJlIGFuIEV0aGVybmV0LUlJCisqIGZyYW1lLCBvdGhlcndpc2UgaXQgaXMgdHJlYXRlZCBhcyBhbiA4MDIuMyBmcmFtZS4KKyogVG8gZWFzZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSENGLCB0aGlzIHR5cGUvdHlwZSBmaWVsZCBtdXN0IGJlIGxvY2F0ZWQgaW4gdGhlIGZpcnN0IGRlc2NyaXB0b3Igc3RydWN0dXJlLAorKiBpLmUuIHRoZSAxc3QgZnJhZ21lbnQgbXVzdCBoYXZlIGEgc2l6ZSBvZiBhdCBsZWFzdCAxNCAodG8gY29udGFpbiBEZXN0QWRkciwgU3JjQWRkciBhbmQgTGVuL1R5cGUgZmllbGQpLgorKiBBbiBFdGhlcm5ldC1JSSBmcmFtZSBpcyBlbmNhcHN1bGF0ZWQgYnkgaW5zZXJ0aW5nIGEgU05BUCBoZWFkZXIgYmV0d2VlbiB0aGUgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiBhbmQgdGhlCisqIHR5cGUgZmllbGQuICBUaGlzIGluc2VydGlvbiBpcyB0cmFuc3BhcmVudCBmb3IgdGhlIE1TRi4KKyogVGhlIEhDRiBjb250YWlucyBhIGZpeGVkIHRhYmxlIHRoYXQgc3RvcmVzIGEgbnVtYmVyIG9mIHR5cGVzLiBJZiB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZSB0eXBlL3R5cGUgZmllbGQKKyogb2NjdXJzIGluIHRoaXMgdGFibGUsIEJyaWRnZSBUdW5uZWwgRW5jYXBzdWxhdGlvbiBpcyB1c2VkLCBvdGhlcndpc2UgUkZDMTA0MiBlbmNhcHN1bGF0aW9uIGlzIHVzZWQuCisqIEJyaWRnZSBUdW5uZWwgdXNlcwlBQSBBQSAwMyAwMCAwMCBGOCBhcyBTTkFQIGhlYWRlciwKKyogUkZDMTA0MiB1c2VzCUFBIEFBIDAzIDAwIDAwIDAwIGFzIFNOQVAgaGVhZGVyLgorKiBUaGUgdGFibGUgY3VycmVudGx5IGNvbnRhaW5zOgorKiAwIDB4ODBGMwlBcHBsZVRhbGsgQWRkcmVzcyBSZXNvbHV0aW9uIFByb3RvY29sIChBQVJQKQorKiAwIDB4ODEzNwlJUFgKKyoKKyogVGhlIGFsZ29yaXRobSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIDgwMi4zIGFuZCBFdGhlcm5ldC1JSSBmcmFtZXMgbGltaXRzIHRoZSBtYXhpbXVtIGxlbmd0aCBmb3IgZnJhbWVzIG9mCisqIDgwMi4zIGZyYW1lcyB0byAxNTE0IGJ5dGVzLgorKiBFbmNhcHN1bGF0aW9uIGNhbiBiZSBzdXBwcmVzc2VkIGJ5IG1lYW5zIG9mIHRoZSBzeXN0ZW0gY29uc3RhbnQgSENGX0VOQ0FQLCBlLmcuIHRvIHN1cHBvcnQgcHJvcHJpZXRhcnkKKyogcHJvdG9jb2xzIHdpdGggODAyLjMgbGlrZSBmcmFtZXMgd2l0aCBhIHNpemUgbGFyZ2VyIHRoYW4gMTUxNCBieXRlcy4KKyoKKyogSW4gY2FzZSB0aGUgSENGIGVuY2Fwc3VsYXRlcyB0aGUgZnJhbWUsIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBpcyBhY3R1YWxseSB0cmFuc21pdHRlZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZQorKiBjdW11bGF0aXZlIHZhbHVlIG9mIHRoZSBidWZfY250bC5idWZfZGltWzBdIGZpZWxkcy4KKyogSW4gY2FzZSB0aGUgSENGIGRvZXMgbm90IGVuY2Fwc3VsYXRlIHRoZSBmcmFtZSwgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGlzIGFjdHVhbGx5IHRyYW5zbWl0dGVkIGlzIG5vdAorKiBkZXRlcm1pbmVkIGJ5IHRoZSBjdW11bGF0aXZlIHZhbHVlIG9mIHRoZSBidWZfY250bC5idWZfZGltW0RFU0NfQ05UTF9DTlRdIGZpZWxkcyBvZiB0aGUgZGVzY19zdHJjdCdzIGJ1dCBieQorKiB0aGUgTGVuZ3RoIGZpZWxkIG9mIHRoZSA4MDIuMyBmcmFtZS4KKyogSWYgdGhlcmUgaXMgYSBjb25mbGljdCBiZXR3ZWVuIHRoZSBjdW11bGF0aXZlIHZhbHVlIG9mIHRoZSBidWZfY250bC5idWZfZGltWzBdIGZpZWxkcyBhbmQgdGhlCisqIDgwMi4zIExlbmd0aCBmaWVsZCB0aGUgODAyLjMgTGVuZ3RoIGZpZWxkIGRldGVybWluZXMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB0cmFuc21pdHRlZCBieSB0aGUgTklDIHdoaWxlCisqIHRoZSBjdW11bGF0aXZlIHZhbHVlIG9mIHRoZSBidWZfY250bC5idWZfZGltWzBdIGZpZWxkcyBkZXRlcm1pbmVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgTUlDLCBoZW5jZSBhIG1pc21hdGNoCisqIHdpbGwgcmVzdWx0IGluIE1JQyBlcnJvcnMgb24gdGhlIFJlY2VpdmluZyBzaWRlLgorKiBDdXJyZW50bHkgdGhpcyBwcm9ibGVtIGlzIGZsYWdnZWQgb24gdGhlIFRyYW5zbWl0IHNpZGUgYnkgYW4gQXNzZXJ0LgorKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBvZiBlYWNoIG9mIHRoZSBkZXNjcmlwdG9ycyBpbiB0aGUgZGVzY3JpcHRvciBsaXN0IG11c3QgYmUgc2V0IGJ5IHRoZSBNU0Y6CisqIG8gYnVmX2NudGwuYnVmX2RpbVswXQorKiBvICpuZXh0X2Rlc2NfYWRkcgorKiBvICpidWZfYWRkcgorKgorKiBBbGwgYml0cyBvZiB0aGUgdHhfY250bCBwYXJhbWV0ZXIgZXhjZXB0IEhGU19UWF9DTlRMX1RYX0RFTEFZIGFuZCB0aGUgSENGX1BPUlQjIGJpdHMgYXJlIHBhc3NlZCB0byB0aGUgRi9XIHZpYQorKiB0aGUgSEZTX1RYX0NOVEwgZmllbGQgb2YgdGhlIFR4RlMuCisqCisqIE5vdGUgdGhhdCBoY2Zfc2VuZF9tc2cgZG9lcyBub3QgZGV0ZWN0IE5JQyBhYnNlbmNlLiAgVGhlIE1TRiBpcyBzdXBwb3NlZCB0byBoYXZlIGl0cyBvd24gLXBsYXRmb3JtIGRlcGVuZGVudC0KKyogd2F5IHRvIHJlY29nbml6ZSBjYXJkIHJlbW92YWwvaW5zZXJ0aW9uLgorKiBUaGUgdG90YWwgc3lzdGVtIG11c3QgYmUgcm9idXN0IGFnYWluc3QgY2FyZCByZW1vdmFsIGFuZCB0aGVyZSBpcyBubyBwcmluY2lwYWwgZGlmZmVyZW5jZSBiZXR3ZWVuIGNhcmQgcmVtb3ZhbAorKiBqdXN0IGFmdGVyIGhjZl9zZW5kX21zZyByZXR1cm5zIGJ1dCBiZWZvcmUgdGhlIGFjdHVhbCB0cmFuc21pc3Npb24gdG9vayBwbGFjZSBvciBzb21ldGltZSBlYXJsaWVyLgorKgorKiBBc3NlcnQgZmFpbHMgaWYKKyogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUKKyogLSBkZXNjcCBpcyBhIE5VTEwgcG9pbnRlcgorKiAtIG5vIHJlc291cmNlcyBmb3IgUElGIGF2YWlsYWJsZS4KKyogLSBJbnRlcnJ1cHRzIGFyZSBlbmFibGVkLgorKiAtIHJlZW50cmFuY3ksIG1heSBiZSAgY2F1c2VkIGJ5IGNhbGxpbmcgaGNmX2Z1bmN0aW9ucyB3aXRob3V0IGFkZXF1YXRlIHByb3RlY3Rpb24KKyoJYWdhaW5zdCBOSUMgaW50ZXJydXB0cyBvciBtdWx0aS10aHJlYWRpbmcuCisqCisqLkRJQUdSQU0KKyo0Oglmb3IgdGhlIG5vcm1hbCBjYXNlIChpLmUuIG5vIEhGU19UWF9DTlRMX1RYX0RFTEFZIG9wdGlvbiBhY3RpdmUpLCBhIGZpZCBpcyBhY3F1aXJlZCB2aWEgdGhlCisqCXJvdXRpbmUgZ2V0X2ZpZC4gIElmIG5vIEZJRCBpcyBhY3F1aXJlZCwgdGhlIHJlbWFpbmRlciBpcyBza2lwcGVkIHdpdGhvdXQgYW4gZXJyb3Igbm90aWZpY2F0aW9uLiAgQWZ0ZXIKKyoJYWxsLCB0aGUgTVNGIGlzIG5vdCBzdXBwb3NlZCB0byBjYWxsIGhjZl9zZW5kX21zZyB3aGVuIG5vIFJlc291cmNlIGlzIGF2YWlsYWJsZS4KKyo3OglUaGUgQ29udHJvbEZpZWxkIG9mIHRoZSBUeEZTIGlzIHdyaXR0ZW4uICBTaW5jZSBwdXRfZnJhZyBjYW4gb25seSByZXR1cm4gdGhlIGZhdGFsIERlZnVuY3Qgb3IgIk5vIE5JQyIsIHRoZQorKglyZXR1cm4gc3RhdHVzIGNhbiBiZSBpZ25vcmVkIGJlY2F1c2Ugd2hlbiBpdCBmYWlscywgY21kX3dhaXQgd2lsbCBmYWlsIGFzIHdlbGwuICAoc2VlIGFsc28gdGhlIG5vdGUgb24gdGhlCisqCW5lZWQgZm9yIGEgcmV0dXJuIGNvZGUgYmVsb3cpLgorKglOb3RlIHRoYXQgSEZTX1RYX0NOVEwgaGFzIGRpZmZlcmVudCB2YWx1ZXMgZm9yIEgtSSwgSC1JL1NTTiBhbmQgSC1JSSBhbmQgSEZTX0FERFJfREVTVCBoYXMgZGlmZmVyZW50CisqCXZhbHVlcyBmb3IgSC1JIChyZWdhcmRsZXNzIG9mIFNTTikgYW5kIEgtSUkuCisqCUJ5IHdyaXRpbmcgMTcsIDEgb3IgMiAoIGltcGx5aW5nIDE2LCAwIG9yIDEgZ2FyYmFnZSB3b3JkIGFmdGVyIEhGU19UWF9DTlRMKSB0aGUgQkFQIGp1c3QgZ2V0cyB0bworKglIRlNfQUREUl9ERVNUIGZvciBILUksIEgtSS9TU04gYW5kIEgtSUkgcmVzcGVjdGl2ZWx5LgorKjEwOiBpZiBuZWl0aGVyIGVuY2Fwc3VsYXRpb24gbm9yIE1JQyBjYWxjdWxhdGlvbiBpcyBuZWVkZWQsIHNwbGl0dGluZyB0aGUgZmlyc3QgZnJhZ21lbnQgaW4gdHdvIGRvZXMgbm90CisqCXJlYWxseSBoZWxwIGJ1dCBpdCBtYWtlcyB0aGUgZmxvdyBlYXNpZXIgdG8gZm9sbG93IHRvIGRvIG5vdCBvcHRpbWl6ZSBvbiB0aGlzIGRpZmZlcmVuY2UKKyoKKyoJaGNmX3NlbmRfbXNnIGNoZWNrcyB3aGV0aGVyIHRoZSBmcmFtZSBpcyBhbiBFdGhlcm5ldC1JSSByYXRoZXIgdGhhbiBhbiAib2ZmaWNpYWwiIDgwMi4zIGZyYW1lLgorKglUaGUgRS1JSSBjaGVjayBpcyBiYXNlZCBvbiB0aGUgbGVuZ3RoL3R5cGUgZmllbGQgaW4gdGhlIE1BQyBoZWFkZXIuIElmIHRoaXMgZmllbGQgaGFzIGEgdmFsdWUgbGFyZ2VyIHRoYW4KKyoJMTUwMCwgRS1JSSBpcyBhc3N1bWVkLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyB0ZXN0IGZhaWxzIGlmIHRoZSBsZW5ndGgvdHlwZSBmaWVsZCBpcyBub3QgaW4gdGhlIGZpcnN0CisqCWRlc2NyaXB0b3IuICBJZiBFLUlJIGlzIHJlY29nbml6ZWQsIGEgU05BUCBoZWFkZXIgaXMgaW5zZXJ0ZWQuIFRoaXMgU05BUCBoZWFkZXIgcmVwcmVzZW50cyBlaXRoZXIgUkZDMTA0MgorKglvciBCcmlkZ2UtVHVubmVsIGVuY2Fwc3VsYXRpb24sIGRlcGVuZGluZyBvbiB0aGUgcmV0dXJuIHN0YXR1cyBvZiB0aGUgc3VwcG9ydCByb3V0aW5lIGhjZl9lbmNhcC4KKyoKKyouTk9USUNFCisqCWhjZl9zZW5kX21zZyBsZWF2ZXMgdGhlIHJlc3BvbnNpYmlsaXR5IHRvIG9ubHkgc2VuZCBtZXNzYWdlcyBvbiBlbmFibGVkIHBvcnRzIGF0IHRoZSBNU0YgbGV2ZWwuCisqCVRoaXMgaXMgY29uc2lkZXJlZCB0aGUgc3RyYXRlZ3kgd2hpY2ggaXMgc3VmZmljaWVudGx5IGFkZXF1YXRlIGZvciBhbGwgInJvYnVzdCIgTVNGcywgaGF2ZSB0aGUgbGVhc3QKKyoJcHJvY2Vzc29yIHV0aWxpemF0aW9uIGFuZCBiZWluZyBzdGlsbCBhY2NlcHRhYmxlIHJvYnVzdCBhdCB0aGUgV0NJICEhISEhCisqCisqCWhjZl9zZW5kX21zZyBkb2VzIG5vdCBORUVEIGEgcmV0dXJuIHZhbHVlIHRvIHJlcG9ydCBOSUMgYWJzZW5jZSBvciByZW1vdmFsIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mCisqCWhjZl9zZW5kX21zZygpLCBiZWNhdXNlIHRoZSBNU0YgYW5kIGhpZ2hlciBsYXllcnMgbXVzdCBiZSBhYmxlIHRvIGNvcGUgYW55d2F5IHdpdGggdGhlIE5JQyBiZWluZyByZW1vdmVkCisqCWFmdGVyIGEgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIGhjZl9zZW5kX21zZygpIGJ1dCBiZWZvcmUgdGhlIGFjdHVhbCB0cmFuc21pc3Npb24gdG9vayBwbGFjZS4KKyoJVG8gYWNjb21tb2RhdGUgdXNlciBleHBlY3RhdGlvbnMgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyByZXBvcnQgTklDIGFic2VuY2UuCisqCURlZnVuY3QgYmxvY2tzIGFsbCBOSUMgYWNjZXNzIGFuZCB3aWxsIChhbHNvKSBiZSByZXBvcnRlZCBvbiBhIG51bWJlciBvZiBvdGhlciBjYWxscy4KKyoKKyoJaGNmX3NlbmRfbXNnIGRvZXMgbm90IGNoZWNrIGZvciB0cmFuc21pdCBidWZmZXIgb3ZlcmZsb3cgYmVjYXVzZSB0aGUgSGVybWVzIGRvZXMgdGhpcyBwcm90ZWN0aW9uLgorKglJbiBjYXNlIG9mIGEgdHJhbnNtaXQgYnVmZmVyIG92ZXJmbG93LCB0aGUgc3VycGx1cyB3aGljaCBkb2VzIG5vdCBmaXQgaW4gdGhlIGJ1ZmZlciBpcyBzaW1wbHkgZHJvcHBlZC4KKyoJTm90ZSB0aGF0IHRoaXMgcG9zc2libHkgcmVzdWx0cyBpbiB0aGUgdHJhbnNtaXNzaW9uIG9mIGluY29tcGxldGUgZnJhbWVzLgorKgorKglBZnRlciBzb21lIGRlbGliZXJhdGlvbiB3aXRoIEYvVyB0ZWFtLCBpdCBpcyBkZWNpZGVkIHRoYXQgLSBiZWluZyBpbiB0aGUgdHdpbGlnaHQgem9uZSBvZiBub3Qga25vd2luZworKgl3aGV0aGVyIHRoZSBwcm9ibGVtIGF0IGhhbmQgaXMgYW4gTVNGIGJ1ZywgSENGIGJ1ZiwgRi9XIGJ1ZywgSC9XIG1hbGZ1bmN0aW9uIG9yIGV2ZW4gc29tZXRoaW5nIGVsc2UgLSB0aGVyZQorKglpcyBubyAiYmVzdCB0aGluZyB0byBkbyIgaW4gY2FzZSBvZiBhIGZhaWxpbmcgc2VuZCwgaGVuY2UgdGhlIEhDRiBjb25zaWRlcnMgdGhlIFR4RklEIG93bmVyc2hpcCB0byBiZSB0YWtlbgorKglvdmVyIGJ5IHRoZSBGL1cgYW5kIGhvcGVzIGZvciBhbiBBbGxvY2F0ZSBldmVudCBpbiBkdWUgdGltZQorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAoraGNmX3NlbmRfbXNnKCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBoY2ZfMTYgdHhfY250bCApCit7CitpbnQJCQlyYyA9IEhDRl9TVUNDRVNTOworREVTQ19TVFJDVAkqcCAvKiA9IGRlc2NwKi87CQkvL3dvcmtpbmcgcG9pbnRlcgoraGNmXzE2CQlsZW47CQkJCQkvLyB0b3RhbCBieXRlIGNvdW50CitoY2ZfMTYJCWk7CisKK2hjZl8xNgkJZmlkID0gMDsKKworCUhDRkFTU0VSVCggaWZicC0+SUZCX1JzY0luZCB8fCBkZXNjcCA9PSBOVUxMLCBpZmJwLT5JRkJfUnNjSW5kICkKKwlIQ0ZBU1NFUlQoIChpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEpID09IDAsIDB4REFEQiApCisKKwlIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX1NFTkRfTVNHLCB0eF9jbnRsICkKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCisJSENGQVNTRVJUX0lOVAorCS8qIG9ibm94aW91cyBjOi9oY2YvaGNmLmMoMTQ4MCkgOiB3YXJuaW5nIEM0NzY5OiBjb252ZXJzaW9uIG9mIG5lYXIgcG9pbnRlciB0byBsb25nIGludGVnZXIsCisJICogc28gc2tpcCAqLworCUhDRkFTU0VSVCggKChoY2ZfMzIpZGVzY3AgJiAzICkgPT0gMCwgKGhjZl8zMilkZXNjcCApCisjaWYgSENGX0FTU0VSVAorewlpbnQgeCA9IGlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgPT0gQ09NUF9JRF9GV19BUCA/IHR4X2NudGwgJiB+SEZTX1RYX0NOVExfUE9SVCA6IHR4X2NudGw7CisJSENGQVNTRVJUKCAoeCAmIH5IQ0ZfVFhfQ05UTF9NQVNLICkgPT0gMCwgdHhfY250bCApCit9CisjZW5kaWYgLy8gSENGX0FTU0VSVAorCisJaWYgKCBkZXNjcCApIGlmYnAtPklGQl9UeEZJRCA9IDA7CQkJCS8vY2FuY2VsIGEgcHJlLXB1dCBtZXNzYWdlCisKKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX1RYX0NPTlQJCQkJLy8gQ29udGludW91cyB0cmFuc21pdCB0ZXN0CisJaWYgKCB0eF9jbnRsID09IEhGU19UWF9DTlRMX1RYX0NPTlQgKSB7CisJIAlpZiAoICggZmlkID0gZ2V0X2ZpZCggaWZicCApICkgIT0gMCApIHsKKwkJCQkJCQkJCQkJLy9zZXR1cCBCQVAgdG8gYmVnaW4gb2YgVHhGUworCQkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBmaWQsIDAsIElPX09VVCApOworCQkJCQkJCQkJCQkvL2NvcHkgYWxsIHRoZSBmcmFnbWVudHMgaW4gYSB0cmFuc3BhcmVudCBmYXNoaW9uCisJCSAJZm9yICggcCA9IGRlc2NwOyBwOyBwID0gcC0+bmV4dF9kZXNjX2FkZHIgKSB7CisJCQkvKiBvYm5veGlvdXMgd2FybmluZyBDNDc2OTogY29udmVyc2lvbiBvZiBuZWFyIHBvaW50ZXIgdG8gbG9uZyBpbnRlZ2VyICovCisJCQkJSENGQVNTRVJUKCAoKGhjZl8zMilwICYgMyApID09IDAsIChoY2ZfMzIpcCApCisJCQkJcHV0X2ZyYWcoIGlmYnAsIHAtPmJ1Zl9hZGRyLCBwLT5CVUZfQ05UIEJFX1BBUigwKSApOworCQkJfQorCQkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX1RIRVNFVVMgfCBIQ01EX0JVU1kgfCBIQ01EX1NUQVJUUFJFQU1CTEUsIGZpZCApOworCQkJaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDAgKSB7CisJCQkJaWZicC0+SUZCX1JzY0luZCA9IGdldF9maWQoIGlmYnAgKTsKKwkJCX0KKwkJfQorCQkJCQkJCQkJCQkvLyBlZW4gc2xlY2h0IHZvb3JiZWVsZCBkb2V0IGdvZWQgdm9sZ2VuIDs/CisJCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9TRU5EX01TRyApCisJCXJldHVybiByYzsKKwl9CisjZW5kaWYgLy8gSENGX0VYVF9UWF9DT05UCisJCQkJCQkJCQkvKiB0aGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9uIGNvZGUgaXMgcmVkdW5kYW50IGZvciBhIHByZS1wdXQgbWVzc2FnZQorCQkJCQkJCQkJICogYnV0IG1vdmluZyBpdCBpbnNpZGUgdGhlICJpZiBmaWQiIGxvZ2ljIG1ha2VzIHRoZSBtZXJnaW5nIHdpdGggdGhlCisJCQkJCQkJCQkgKiBVU0IgZmxvdyBhd2t3YXJkCisJCQkJCQkJCQkgKi8KKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCisJdHhfY250bCB8PSBpZmJwLT5JRkJfTUlDVHhDbnRsOworI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQorCWlmICggKGZpZCA9IGlmYnAtPklGQl9UeEZJRCkgPT0gMCAmJiAoIGZpZCA9IGdldF9maWQoIGlmYnAgKSApICE9IDAgKSAJCS8qIDQgKi8KKwkJCS8qIHNraXAgdGhlIG5leHQgY29tcG91bmQgc3RhdGVtZW50IGlmOgorCQkJICAgLSBwcmUtcHV0IG1lc3NhZ2Ugb3IKKwkJCSAgIC0gbm8gZmlkIGF2YWlsYWJsZSAod2hpY2ggc2hvdWxkIG5ldmVyIG9jY3VyIGlmIHRoZSBNU0YgYWRoZXJlcyB0byB0aGUgV0NJKQorCQkJICovCisJewkJLy8gdG8gbWF0Y2ggdGhlIGNsb3NpbmcgY3VybHkgYnJhY2tldCBvZiBhYm92ZSAiaWYiIGluIGNhc2Ugb2YgSENGX1RZUEVfVVNCCisJCQkJCQkJCQkJCS8vY2FsY3VsYXRlIHRvdGFsIGxlbmd0aCA7PyBzdXBlcmZsdW91cyB1bmxlc3MgQ0NYIG9yIEVuY2Fwc3VsYXRpb24KKwkJbGVuID0gMDsKKwkJcCA9IGRlc2NwOworCQlkbyBsZW4gKz0gcC0+QlVGX0NOVDsgd2hpbGUgKCAoIHAgPSBwLT5uZXh0X2Rlc2NfYWRkciApICE9IE5VTEwgKTsKKwkJcCA9IGRlc2NwOworLy87PwlIQ0ZBU1NFUlQoIGxlbiA8PSBIQ0ZfTUFYX01TRywgbGVuICkKKy8qNyovCSh2b2lkKXNldHVwX2JhcCggaWZicCwgZmlkLCBIRlNfVFhfQ05UTCwgSU9fT1VUICk7CisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1RYX0RFTEFZCisJCUhDRkFTU0VSVCggKCBkZXNjcCAhPSBOVUxMICkgXiAoIHR4X2NudGwgJiBIRlNfVFhfQ05UTF9UWF9ERUxBWSApLCB0eF9jbnRsICkKKwkJaWYgKCB0eF9jbnRsICYgSEZTX1RYX0NOVExfVFhfREVMQVkgKSB7CisJCQl0eF9jbnRsICY9IH5IRlNfVFhfQ05UTF9UWF9ERUxBWTsJCS8vISFIRlNfVFhfQ05UTF9UWF9ERUxBWSBubyBsb25nZXIgYXZhaWxhYmxlCisJCQlpZmJwLT5JRkJfVHhGSUQgPSBmaWQ7CisJCQlmaWQgPSAwOwkJCQkJCQkJLy8hIWZpZCBubyBsb25nZXIgYXZhaWxhYmxlLCBiZSBjYXJlZnVsIHdoZW4gbW9kaWZ5aW5nIGNvZGUKKwkJfQorI2VuZGlmIC8vIEhDRl9UWVBFX1RYX0RFTEFZCisJCU9QVyggSFJFR19EQVRBXzEsIHR4X2NudGwgKSA7CisJCU9QVyggSFJFR19EQVRBXzEsIDAgKTsKKyNpZiAhICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWCApCisJCUhDRkFTU0VSVCggcC0+QlVGX0NOVCA+PSAxNCwgcC0+QlVGX0NOVCApCisJCQkJCQkJCQkJCS8qIGFzc3VtZSBEZXN0QWRkci9TcmNBZGRyL0xlbi9UeXBlIEFMV0FZUyBjb250YWluZWQgaW4gMXN0IGZyYWdtZW50CisJCQkJCQkJCQkJCSAqIG90aGVyd2lzZSBsaWZlIGdldHMgdG9vIGN1bWJlcnNvbWUgZm9yIE1JQyBhbmQgRW5jYXBzdWxhdGlvbiAhISEhISEhIQorCQlpZiAoIHAtPkJVRl9DTlQgPj0gMTQgKSB7CWFsdGVybmF0aXZlbHk6IGFkZCBhIHNhZmV0eSBlc2NhcGUgISEhISEhISEhISEhIH0JKi8KKyNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKKwkJQ0FMQ19UWF9NSUMoIE5VTEwsIC0xICk7CQkvL2luaXRpYWxpemUgTUlDCisvKjEwKi8JcHV0X2ZyYWcoIGlmYnAsIHAtPmJ1Zl9hZGRyLCBIQ0ZfREFTQV9TSVpFIEJFX1BBUigwKSApOwkvL3dyaXRlIERBLCBTQSB3aXRoIE1JQyBjYWxjdWxhdGlvbgorCQlDQUxDX1RYX01JQyggcC0+YnVmX2FkZHIsIEhDRl9EQVNBX1NJWkUgKTsJCS8vTUlDIG92ZXIgREEsIFNBCisJCUNBTENfVFhfTUlDKCBudWxsX2FkZHIsIDQgKTsJCS8vTUlDIG92ZXIgKHZpcnR1YWwpIHByaW9yaXR5IGZpZWxkCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAorCQkvLyEhYmUgY2FyZWZ1bCBkbyBub3QgdXNlIHBvc2l0aXZlIHRlc3Qgb24gSENGX0FDVF9DQ1hfT0ZGLCBiZWNhdXNlIElGQl9DS0lQU3RhdCBpcyBpbml0aWFsbHkgMAorCQlpZigoIGlmYnAtPklGQl9DS0lQU3RhdCA9PSBIQ0ZfQUNUX0NDWF9PTiApIHx8CisgICAgICAgICAgICgoR0VUX0JVRl9DTlQocCkgPj0gMjAgKSAgICYmICggaWZicC0+SUZCX0NLSVBTdGF0ID09IEhDRl9BQ1RfQ0NYX09GRiApICYmCisgICAgICAgICAgICAocC0+YnVmX2FkZHJbMTJdID09IDB4QUEpICYmIChwLT5idWZfYWRkclsxM10gPT0gMHhBQSkgJiYKKyAgICAgICAgICAgIChwLT5idWZfYWRkclsxNF0gPT0gMHgwMykgJiYgKHAtPmJ1Zl9hZGRyWzE1XSA9PSAweDAwKSAmJgorICAgICAgICAgICAgKHAtPmJ1Zl9hZGRyWzE2XSA9PSAweDQwKSAmJiAocC0+YnVmX2FkZHJbMTddID09IDB4OTYpICYmCisgICAgICAgICAgICAocC0+YnVmX2FkZHJbMThdID09IDB4MDApICYmIChwLT5idWZfYWRkclsxOV0gPT0gMHgwMCkpKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gSENGX0RBU0FfU0laRTsKKworICAgICAgICAgICAgT1BXKCBIUkVHX0RBVEFfMSwgQ05WX1NIT1JUX1RPX0JJRyggbGVuIC0gaSApKTsKKworICAgICAgICAgICAgLyogbmVlZCB0byBzZW5kIG91dCB0aGUgcmVtYWluZGVyIG9mIHRoZSBmcmFnbWVudCAqLworCQkJcHV0X2ZyYWcoIGlmYnAsICZwLT5idWZfYWRkcltpXSwgR0VUX0JVRl9DTlQocCkgLSBpIEJFX1BBUigwKSApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKKwkJeworCQkJCQkJCQkJCQkvL2lmIGVuY2Fwc3VsYXRpb24gbmVlZGVkCisjaWYgKEhDRl9FTkNBUCkgPT0gSENGX0VOQworCQkJCQkJCQkJCQkvL3dyaXRlIGxlbmd0aCAod2l0aCBTTkFQLWhlYWRlcixUeXBlLCB3aXRob3V0IC8vREEsU0EsTGVuZ3RoICkgbm8gTUlDIGNhbGMuCisJCQlpZiAoICggc25hcF9oZWFkZXJbc2l6ZW9mKHNuYXBfaGVhZGVyKS0xXSA9IGhjZl9lbmNhcCggJnAtPmJ1Zl9hZGRyW0hDRl9EQVNBX1NJWkVdICkgKSAhPSBFTkNfTk9ORSApIHsKKwkJCQlPUFcoIEhSRUdfREFUQV8xLCBDTlZfRU5EX1NIT1JUKCBsZW4gKyAoc2l6ZW9mKHNuYXBfaGVhZGVyKSArIDIpIC0gKCAyKjYgKyAyICkgKSApOworCQkJCQkJCQkJCQkvL3dyaXRlIHNwbGljZSB3aXRoIE1JQyBjYWxjdWxhdGlvbgorCQkJCXB1dF9mcmFnKCBpZmJwLCBzbmFwX2hlYWRlciwgc2l6ZW9mKHNuYXBfaGVhZGVyKSBCRV9QQVIoMCkgKTsKKwkJCQlDQUxDX1RYX01JQyggc25hcF9oZWFkZXIsIHNpemVvZihzbmFwX2hlYWRlcikgKTsJLy9NSUMgb3ZlciA2IGJ5dGUgU05BUAorCQkJCWkgPSBIQ0ZfREFTQV9TSVpFOworCQkJfSBlbHNlCisjZW5kaWYgLy8gSENGX0VOQworCQkJeworCQkJCU9QVyggSFJFR19EQVRBXzEsICood2NpX3JlY29yZHApJnAtPmJ1Zl9hZGRyW0hDRl9EQVNBX1NJWkVdICk7CisJCQkJaSA9IDE0OworCQkJfQorCQkJCQkJCQkJCQkvL2NvbXBsZXRlIDFzdCBmcmFnbWVudCBzdGFydGluZyB3aXRoIFR5cGUgd2l0aCBNSUMgY2FsY3VsYXRpb24KKwkJCXB1dF9mcmFnKCBpZmJwLCAmcC0+YnVmX2FkZHJbaV0sIHAtPkJVRl9DTlQgLSBpIEJFX1BBUigwKSApOworCQkJQ0FMQ19UWF9NSUMoICZwLT5idWZfYWRkcltpXSwgcC0+QlVGX0NOVCAtIGkgKTsKKwkJfQorCQkJCQkJCQkJCQkvL2RvIHRoZSByZW1haW5pbmcgZnJhZ21lbnRzIHdpdGggTUlDIGNhbGN1bGF0aW9uCisJCXdoaWxlICggKCBwID0gcC0+bmV4dF9kZXNjX2FkZHIgKSAhPSBOVUxMICkgeworCQkJLyogb2Jub3hpb3VzIGM6L2hjZi9oY2YuYygxNDgwKSA6IHdhcm5pbmcgQzQ3Njk6IGNvbnZlcnNpb24gb2YgbmVhciBwb2ludGVyIHRvIGxvbmcgaW50ZWdlciwKKwkJCSAqIHNvIHNraXAgKi8KKwkJCUhDRkFTU0VSVCggKChoY2ZfMzIpcCAmIDMgKSA9PSAwLCAoaGNmXzMyKXAgKQorCQkJcHV0X2ZyYWcoIGlmYnAsIHAtPmJ1Zl9hZGRyLCBwLT5CVUZfQ05UIEJFX1BBUigwKSApOworCQkJQ0FMQ19UWF9NSUMoIHAtPmJ1Zl9hZGRyLCBwLT5CVUZfQ05UICk7CisJCX0KKwkJCQkJCQkJCQkJLy9wYWQgbWVzc2FnZSwgZmluYWxpemUgTUlDIGNhbGN1bGF0aW9uIGFuZCB3cml0ZSBNSUMgdG8gTklDCisJCXB1dF9mcmFnX2ZpbmFsaXplKCBpZmJwICk7CisJfQorCWlmICggZmlkICkgeworLyoxNiovCXJjID0gY21kX2V4ZSggaWZicCwgSENNRF9CVVNZIHwgSENNRF9UWCB8IEhDTURfUkVDTCwgZmlkICk7CisJCWlmYnAtPklGQl9UeEZJRCA9IDA7CisJCQkvKiBwcm9iYWJseSB0aGlzIChpLmUuIG5vIFJzY0luZCBBTkQgIkhSRUdfRVZfQUxMT0MiKSBhdCB0aGlzIHBvaW50IGluIHRpbWUgb2NjdXJzIHNvIGluZnJlcXVlbnQsCisJCQkgKiB0aGF0IGl0IG1pZ2h0IGp1c3QgYXMgd2VsbCBiZSBhY2NlcHRhYmxlIHRvIHNraXAgdGhpcworCQkJICogIm9wdGltaXphdGlvbiIgY29kZSBhbmQgaGFuZGxlIHRoYXQgYWRkaXRpb25hbCBpbnRlcnJ1cHQgb25jZSBpbiBhIHdoaWxlCisJCQkgKi8KKy8vIDE4MCBkZWdyZWUgZXJyb3IgaW4gbG9naWMgOz8gI2lmIEFMTE9DXzE1CisvKjIwKi8JaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDAgKSB7CisJCQlpZmJwLT5JRkJfUnNjSW5kID0gZ2V0X2ZpZCggaWZicCApOworCQl9CisvLyAjZW5kaWYgLy8gQUxMT0NfMTUKKwl9CisvLwlIQ0ZBU1NFUlQoIGxldmVsOjppZmJwLT5JRkJfUnNjSW5kLCBpZmJwLT5JRkJfUnNjSW5kICkKKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfU0VORF9NU0cgKQorCXJldHVybiByYzsKK30gLy8gaGNmX3NlbmRfbXNnCisjZW5kaWYgLy8gSENGX0RMX09OTFkKKworCisjaWYgKEhDRl9ETF9PTkxZKSA9PSAwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLk1PRFVMRQkJaW50IGhjZl9zZXJ2aWNlX25pYyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCB1bnNpZ25lZCBpbnQgbGVuICkKKyouUFVSUE9TRQkJU2VydmljZXMgKG1vc3QpIE5JQyBldmVudHMuCisqCQkJCVByb3ZpZGVzIHJlY2VpdmVkIG1lc3NhZ2UKKyoJCQkJUHJvdmlkZXMgc3RhdHVzIGluZm9ybWF0aW9uLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqICBJbiBub24tRE1BIG1vZGU6CisqCWJ1ZnAJCWFkZHJlc3Mgb2YgY2hhciBidWZmZXIsIHN1ZmZpY2llbnRseSBsYXJnZSB0byBob2xkIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBSeEZTIHVwIHRocm91Z2ggSEZTX1RZUEUKKyoJbGVuCQkJbGVuZ3RoIGluIGJ5dGVzIG9mIGJ1ZmZlciBzcGVjaWZpZWQgYnkgYnVmcAorKgkJCQl2YWx1ZSBiZXR3ZWVuIEhGU19UWVBFICsgMiBhbmQgSEZTX0FERFJfREVTVCArIEhDRl9NQVhfTVNHCisqCisqLlJFVFVSTlMKKyoJSENGX1NVQ0NFU1MKKyoJSENGX0VSUl9NSUMJbWVzc2FnZSBjb250YWlucyBhbiBlcnJvbmVvdXMgTUlDIChvbmx5IGlmIGZyYW1lIGZpdHMgY29tcGxldGVseSBpbiBidWZwKQorKgorKi5ERVNDUklQVElPTgorKgorKiBNU0YtYWNjZXNzaWJsZSBmaWVsZHMgb2YgUmVzdWx0IEJsb2NrCisqIC0gSUZCX1J4TGVuCQkJMCBvciBGcmFtZSBzaXplLgorKiAtIElGQl9NQkluZm9MZW4JCTAgb3IgdGhlIEwtZmllbGQgb2YgdGhlIG9sZGVzdCBNQklCLgorKiAtIElGQl9Sc2NJbmQKKyogLSBJRkJfSENGX1RhbGxpZXMJCXVwZGF0ZWQgaWYgYSBjb3JyZXNwb25kaW5nIGV2ZW50IG9jY3VycmVkLgorKiAtIElGQl9OSUNfVGFsbGllcwkJdXBkYXRlZCBpZiBhIFRhbGx5IEluZm8gZnJhbWUgcmVjZWl2ZWQgZnJvbSB0aGUgTklDLgorKiAtIElGQl9EbWFQYWNrZXRzCisqIC0gSUZCX1R4RnNTdGF0CisqIC0gSUZCX1R4RnNTd1N1cAorKiAtIElGQl9MaW5rU3RhdAkJcmVmbGVjdHMgbmV3IGxpbmsgc3RhdHVzIG9yIDB4MDAwMCBpZiBubyBjaGFuZ2UgcmVsYXRpdmUgdG8gcHJldmlvdXMgaGNmX3NlcnZpY2VfbmljIGNhbGwuCitvcgorKiAtIElGQl9MaW5rU3RhdAkJbGluayBzdGF0dXMsIDB4ODAwMCByZWZsZWN0cyBjaGFuZ2UgcmVsYXRpdmUgdG8gcHJldmlvdXMgaGNmX3NlcnZpY2VfbmljIGNhbGwuCisqCisqIFdoZW4gSUZCX01CSW5mb0xlbiBpcyBub24temVybywgYXQgbGVhc3Qgb25lIE1CSUIgaXMgYXZhaWxhYmxlLgorKgorKiBJRkJfUnhMZW4JcmVmbGVjdHMgdGhlIG51bWJlciBvZiByZWNlaXZlZCBieXRlcyBpbiA4MDIuMyB2aWV3IChJbmNsdWRpbmcgRGVzdEFkZHIsIFNyY0FkZHIgYW5kIExlbmd0aCwKKyogZXhjbHVkaW5nIE1JQy1wYWRkaW5nLCBNSUMgYW5kIHN1bSBjaGVjaykgb2YgYWN0aXZlIFJ4IEZyYW1lIFN0cnVjdHVyZS4gSWYgbm8gUnggRGF0YSBzIGF2YWlsYWJsZSwgSUZCX1J4TGVuCisqIGVxdWFscyAweDAwMDAuCisqIFJlcGVhdGVkIGV4ZWN1dGlvbiBjYXVzZXMgdGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgc3Vic2VxdWVudGx5IHJlY2VpdmVkCisqIG1lc3NhZ2VzLCBpcnJlc3BlY3RpdmUgd2hldGhlciBhIGhjZl9yY3ZfbXNnIG9yIGhjZl9hY3Rpb24oSENGX0FDVF9SWCkgaXMgcGVyZm9ybWVkIGluIGJldHdlZW4uCisqCisqIFdoZW4gSUZCX1J4TGVuIGlzIG5vbi16ZXJvLCBhIFJlY2VpdmVkIEZyYW1lIFN0cnVjdHVyZSBpcyBhdmFpbGFibGUgdG8gYmUgcm91dGVkIHRvIHRoZSBwcm90b2NvbCBzdGFjay4KKyogV2hlbiBNb25pdG9yIE1vZGUgaXMgbm90IGFjdGl2ZSwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGJlIGFuIGVycm9yLWZyZWUgbm9uLVdNUCBmcmFtZS4KKyogSW4gY2FzZSBvZiBNb25pdG9yIE1vZGUsIGl0IG1heSBhbHNvIGJlIGEgZnJhbWUgd2l0aCBhbiBlcnJvciBvciBhIFdNUCBmcmFtZS4KKyogRXJyb25lb3VzIGZyYW1lcyBoYXZlIGEgbm9uLXplcm8gZXJyb3Itc3ViIGZpZWxkIGluIHRoZSBIRlNfU1RBVCBmaWVsZCBpbiB0aGUgbG9vayBhaGVhZCBidWZmZXIuCisqCisqIElmIGEgUmVjZWl2ZSBtZXNzYWdlIGlzIGF2YWlsYWJsZSBpbiBOSUMgUkFNLCB0aGUgUmVjZWl2ZSBGcmFtZSBTdHJ1Y3R1cmUgaXMgKHBhcnRseSkgY29waWVkIGZyb20gdGhlIE5JQyB0bworKiB0aGUgYnVmZmVyIGlkZW50aWZpZWQgYnkgYnVmcC4KKyogQ29weWluZyBzdG9wcyBlaXRoZXIgYWZ0ZXIgbGVuIGJ5dGVzIG9yIHdoZW4gdGhlIGNvbXBsZXRlIDgwMi4zIGZyYW1lIGlzIGNvcGllZC4KKyogRHVyaW5nIHRoZSBjb3B5aW5nIHRoZSBtZXNzYWdlIGlzIGRlY2Fwc3VsYXRlZCAoaWYgYXBwcm9wcmlhdGUpLgorKiBJZiB0aGUgZnJhbWUgaXMgcmVhZCBjb21wbGV0ZWx5IGJ5IGhjZl9zZXJ2aWNlX25pYyAoaS5lLiB0aGUgZnJhbWUgZml0cyBjb21wbGV0ZWx5IGluIHRoZSBsb29rYWhlYWQgYnVmZmVyKSwKKyogdGhlIGZyYW1lIGlzIGF1dG9tYXRpY2FsbHkgQUNLJ2VkIHRvIHRoZSBGL1cgYW5kIHN0aWxsIGF2YWlsYWJsZSB2aWEgdGhlIGxvb2sgYWhlYWQgYnVmZmVyIGFuZCBoY2ZfcmN2X21zZy4KKyogT25seSBpZiB0aGUgZnJhbWUgaXMgcmVhZCBjb21wbGV0ZWx5IGJ5IGhjZl9zZXJ2aWNlX25pYywgaGNmX3NlcnZpY2VfbmljIGNoZWNrcyB0aGUgTUlDIGFuZCBzZXRzIHRoZSByZXR1cm4KKyogc3RhdHVzIGFjY29yZGluZ2x5LiAgSW4gdGhpcyBjYXNlLCBoY2ZfcmN2X21zZyBkb2VzIG5vdCBjaGVjayB0aGUgTUlDLgorKgorKiBUaGUgTUlDIGNhbGN1bGF0aW9uIGFsZ29yaXRobSB3b3JrcyBtb3JlIGVmZmljaWVudCBpZiB0aGUgbGVuZ3RoIG9mIHRoZSBsb29rIGFoZWFkIGJ1ZmZlciBpcworKiBzdWNoIHRoYXQgaXQgZml0cyBleGFjdGx5IDQgbiBieXRlcyBvZiB0aGUgODAyLjMgZnJhbWUsIGkuZS4gbGVuID09IEhGU19BRERSX0RFU1QgKyA0Km4uCisqCisqIFRoZSBTZXJ2aWNlIE5JQyBGdW5jdGlvbiBzdXBwb3J0cyB0aGUgTklDIGV2ZW50IHNlcnZpY2UgaGFuZGxpbmcgcHJvY2Vzcy4KKyogSXQgcGVyZm9ybXMgdGhlIGFwcHJvcHJpYXRlIGFjdGlvbnMgdG8gc2VydmljZSB0aGUgTklDLCBzdWNoIHRoYXQgdGhlIGV2ZW50IGNhdXNlIGlzIGVsaW1pbmF0ZWQgYW5kIHJlbGF0ZWQKKyogaW5mb3JtYXRpb24gaXMgc2F2ZWQuCisqIFRoZSBTZXJ2aWNlIE5JQyBGdW5jdGlvbiBpcyBleGVjdXRlZCBieSB0aGUgTVNGIElTUiBvciBwb2xsaW5nIHJvdXRpbmUgYXMgZmlyc3Qgc3RlcCB0byBkZXRlcm1pbmUgdGhlIGV2ZW50CisqIGNhdXNlKHMpLiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBNU0YgdG8gcGVyZm9ybSBhbGwgbm90IGRpcmVjdGx5IE5JQyByZWxhdGVkIGludGVycnVwdCBzZXJ2aWNlCisqIGFjdGlvbnMsIGUuZy4gaW4gYSBQQyBlbnZpcm9ubWVudCB0aGlzIGluY2x1ZGVzIHNlcnZpY2luZyB0aGUgUElDLCBhbmQgbWFuYWdpbmcgdGhlIFByb2Nlc3NvciBJbnRlcnJ1cHQKKyogRW5hYmxpbmcvRGlzYWJsaW5nLgorKiBJbiBjYXNlIG9mIGEgcG9sbGVkIGJhc2VkIHN5c3RlbSwgdGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIG11c3QgYmUgZXhlY3V0ZWQgImZyZXF1ZW50bHkiLgorKiBUaGUgU2VydmljZSBOSUMgRnVuY3Rpb24gbWF5IGhhdmUgc2lkZSBlZmZlY3RzIHJlbGF0ZWQgdG8gdGhlIE1haWxib3ggYW5kIFJlc291cmNlIEluZGljYXRvciAoSUZCX1JzY0luZCkuCisqCisqIGhjZl9zZXJ2aWNlX25pYyByZXR1cm5zOgorKiAtIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaW4gdGhlIGF2YWlsYWJsZSBNQklCIChJRkJfTUJJbmZvTGVuKQorKiAtIENoYW5nZXMgaW4gdGhlIGxpbmsgc3RhdHVzIChJRkJfTGlua1N0YXQpCisqIC0gVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBpbiB0aGUgYXZhaWxhYmxlIFJlY2VpdmUgRnJhbWUgU3RydWN0dXJlIChJRkJfUnhMZW4pCisqIC0gdXBkYXRlZCBJRkJfUnNjSW5kCisqIC0gVXBkYXRlZCBUYWxsaWVzCisqCisqIGhjZl9zZXJ2aWNlX25pYyBpcyBwcmVzdW1lZCB0byBuZWl0aGVyIGludGVycnVwdCBvdGhlciBIQ0YtdGFza3Mgbm9yIHRvIGJlIGludGVycnVwdGVkIGJ5IG90aGVyIEhDRi10YXNrcy4KKyogQSB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIHByZWNlZGUgaGNmX3NlcnZpY2VfbmljIGFzIHdlbGwgYXMgYWxsIG90aGVyIEhDRi10YXNrcyB3aXRoIGEgY2FsbCB0bworKiBoY2ZfYWN0aW9uIHRvIGRpc2FibGUgdGhlIGNhcmQgaW50ZXJydXB0cyBhbmQsIGFmdGVyIGFsbCB3b3JrIGlzIGNvbXBsZXRlZCwgd2l0aCBhIGNhbGwgdG8gaGNmX2FjdGlvbiB0bworKiByZXN0b3JlICh3aGljaCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgZW5hYmxpbmcpIHRoZSBjYXJkIGludGVycnVwdHMuCisqIEluIGNhc2Ugb2YgYSBwb2xsZWQgZW52aXJvbm1lbnQsIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgTVNGIHByb2dyYW1tZXIgaXMgc3VmZmljaWVudGx5IGZhbWlsaWFyIHdpdGggdGhlCisqIHNwZWNpZmljIHJlcXVpcmVtZW50cyBvZiB0aGF0IGVudmlyb25tZW50IHRvIHRyYW5zbGF0ZSB0aGUgaW50ZXJydXB0IHN0cmF0ZWd5IHRvIGEgcG9sbGVkIHN0cmF0ZWd5LgorKgorKiBoY2Zfc2VydmljZV9uaWMgc2VydmljZXMgdGhlIGZvbGxvd2luZyBIZXJtZXMgZXZlbnRzOgorKiAtIEhSRUdfRVZfSU5GTwkJQXN5bmNocm9ub3VzIEluZm9ybWF0aW9uIEZyYW1lCisqIC0gSFJFR19FVl9JTkZPX0RST1AJV01BQyBkaWQgbm90IGhhdmUgc3VmZmljaWVudCBSQU0gdG8gYnVpbGQgVW5zb2xpY2l0ZWQgSW5mb3JtYXRpb24gRnJhbWUKKyogLSBIUkVHX0VWX1RYX0VYQwkJKGlmIGFwcGxpY2FibGUsIGkuZS4gc2VsZWN0ZWQgdmlhIEhDRl9FWFRfSU5UX1RYX0VYIGJpdCBvZiBIQ0ZfRVhUKQorKiAtIEhSRUdfRVZfU0xFRVBfUkVRCShpZiBhcHBsaWNhYmxlLCBpLmUuIHNlbGVjdGVkIHZpYSBIQ0ZfRERTL0hDRl9DRFMgYml0IG9mIEhDRl9TTEVFUCkKKyogKiogaW4gbm9uX0RNQSBtb2RlCisqIC0gSFJFR19FVl9BTExPQwkJQXN5bmNocm9ub3VzIHBhcnQgb2YgQWxsb2NhdGlvbi9SZWNsYWltIGNvbXBsZXRlZCB3aGlsZSBvdXQgb2YgcmVzb3VyY2VzIGF0CisqIAkJCQkJCWNvbXBsZXRpb24gb2YgaGNmX3NlbmRfbXNnL25vdGlmeQorKiAtIEhSRUdfRVZfUlgJCQl0aGUgZGV0ZWN0aW9uIG9mIHRoZSBhdmFpbGFiaWxpdHkgb2YgcmVjZWl2ZWQgbWVzc2FnZXMKKyogCQkJCQkJaW5jbHVkaW5nIFdhdmVMQU4gTWFuYWdlbWVudCBQcm90b2NvbCAoV01QKSBtZXNzYWdlIHByb2Nlc3NpbmcKKyogKiogaW4gRE1BIG1vZGUKKyogLSBIUkVHX0VWX1JETUFECisqIC0gSFJFR19FVl9URE1BRAorKiEhIGhjZl9zZXJ2aWNlX25pYyBkb2VzIG5vdCBzZXJ2aWNlIHRoZSBmb2xsb3dpbmcgSGVybWVzIGV2ZW50czoKKyohISAJSFJFR19FVl9UWCAJCQkodGhlICJPSyIgVHggRXZlbnQpIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgdGhlIFdDSSwgaWYgaXQgb2NjdXJzIGl0IGlzIHVuY2xlYXIKKyohISAJCQkJCQl3aGF0IHRoZSBjYXVzZSBpcywgc28gbm8gbWVhbmluZ2Z1bCBzdHJhdGVneSBpcyBhdmFpbGFibGUuIE5vdCBhY2tpbmcgdGhlIGJpdCBpcworKiEhIAkJCQkJCXByb2JhYmx5IHRoZSBiZXN0IGhlbHAgdGhhdCBjYW4gYmUgZ2l2ZW4gdG8gdGhlIGRlYnVnZ2VyLgorKiEhIAlIUkVHX0VWX0NNRAkJCWhhbmRsZWQgaW4gY21kX3dhaXQuCisqISEgCUhSRUdfRVZfRldfRE1BIAkJKGkuZS4gSFJFR19FVl9SWERNQSwgSFJFR19FVl9UWERNQSBhbmRfRVZfTFBFU0MpIGFyZSBlaXRoZXIgbm90IHVzZWQgb3IgdXNlZAorKiEhIAkJCQkJCWJldHdlZW4gdGhlIEYvVyBhbmQgdGhlIERNQSBlbmdpbmUuCisqISEgCUhSRUdfRVZfQUNLX1JFR19SRUFEWSBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIEgtSUkgKGkuZS4gbm90IEhJSS41IGFuZCB1cCwgc2VlIERBV0EpCisqCisqCUlmLCBpbiBub24tRE1BIG1vZGUsIGEgUnggbWVzc2FnZSBpcyBhdmFpbGFibGUsIGl0cyBsZW5ndGggaXMgcmVmbGVjdGVkIGJ5IHRoZSBJRkJfUnhMZW4gZmllbGQgb2YgdGhlIElGQi4KKyoJVGhpcyBsZW5ndGggcmVmbGVjdHMgdGhlIGRhdGEgaXRzZWxmIGFuZCB0aGUgRGVzdGluYXRpb24gQWRkcmVzcywgU291cmNlIEFkZHJlc3MgYW5kIERhdGFMZW5ndGgvVHlwZSBmaWVsZAorKglidXQgbm90IHRoZSBTTkFQLWhlYWRlciBpbiBjYXNlIG9mIGRlY2Fwc3VsYXRpb24gYnkgdGhlIEhDRi4gIElmIG5vIG1lc3NhZ2UgaXMgYXZhaWxhYmxlLCBJRkJfUnhMZW4gaXMKKyoJemVyby4gIEZvcm1lciB2ZXJzaW9ucyBvZiB0aGUgSENGIGhhbmRsZWQgV01QIG1lc3NhZ2VzIGFuZCBzdXBwb3J0ZWQgYSAibW9uaXRvciIgbW9kZSBpbiBoY2Zfc2VydmljZV9uaWMsCisqCXdoaWNoIGRlcG9zaXRlZCBjZXJ0YWluIG9yIGFsbCBSeCBtZXNzYWdlcyBpbiB0aGUgTWFpbEJveC4gVGhlIHJlc3BvbnNpYmlsaXR5IHRvIGhhbmRsZSB0aGVzZSBmcmFtZXMgaXMKKyoJbW92ZWQgdG8gdGhlIE1TRi4gVGhlIEhDRiBvZmZlcnMgYXMgc3VwcG9ydHMgaGNmX3B1dF9pbmZvIHdpdGggQ0ZHX01CX0lORk8gYXMgcGFyYW1ldGVyIHRvIGVtdWxhdGUgdGhlIG9sZAorKiAJaW1wbGVtZW50YXRpb24gdW5kZXIgY29udHJvbCBvZiB0aGUgTVNGLgorKgorKiAqKlJ4IEJ1ZmZlciBmcmVlIHN0cmF0ZWd5CisqCVdoZW4gaGNmX3NlcnZpY2VfbmljIHJlcG9ydHMgdGhlIGF2YWlsYWJpbGl0eSBvZiBhIG5vbi1ETUEgbWVzc2FnZSwgdGhlIE1TRiBjYW4gYWNjZXNzIHRoYXQgbWVzc2FnZSBieQorKgltZWFucyBvZiBoY2ZfcmN2X21zZy4gSXQgbXVzdCBiZSBwcmV2ZW50ZWQgdGhhdCB0aGUgTEFOIENvbnRyb2xsZXIgd3JpdGVzIG5ldyBkYXRhIGluIHRoZSBOSUMgYnVmZmVyCisqCWJlZm9yZSB0aGUgTVNGIGlzIGZpbmlzaGVkIHdpdGggdGhlIGN1cnJlbnQgbWVzc2FnZS4gVGhlIE5JQyBidWZmZXIgaXMgcmV0dXJuZWQgdG8gdGhlIExBTiBDb250cm9sbGVyCisqCXdoZW46CisqCSAtIHRoZSBjb21wbGV0ZSBmcmFtZSBmaXRzIGluIHRoZSBsb29rYWhlYWQgYnVmZmVyIG9yCisqCSAtIGhjZl9yY3ZfbXNnIGlzIGNhbGxlZCBvcgorKgkgLSBoY2ZfYWN0aW9uIHdpdGggSENGX0FDVF9SWCBpcyBjYWxsZWQgb3IKKyoJIC0gaGNmX3NlcnZpY2VfbmljIGlzIGNhbGxlZCBhZ2FpbgorKglJdCBjYW4gYmUgcmVhc29uZWQgdGhhdCBoY2ZfYWN0aW9uKCBJTlRfT04gKSBzaG91bGQgbm90IGJlIGdpdmVuIGJlZm9yZSB0aGUgTVNGIGhhcyBjb21wbGV0ZWx5IHByb2Nlc3NlZAorKglhIHJlcG9ydGVkIFJ4LWZyYW1lLiBUaGUgcmVhc29uIGlzIHRoYXQgdGhlIElOVF9PTiBhY3Rpb24gaXMgZ3VhcmFudGVlZCB0byBjYXVzZSBhIChSeC0paW50ZXJydXB0ICh0aGUKKyoJTVNGIGlzIHByb2Nlc3NpbmcgYSBSeC1mcmFtZSwgaGVuY2UgdGhlIFJ4LWV2ZW50IGJpdCBpbiB0aGUgSGVybWVzIHJlZ2lzdGVyIG11c3QgYmUgYWN0aXZlKS4gVGhpcworKglpbnRlcnJ1cHQgd2lsbCBjYXVzZSBoY2Zfc2VydmljZV9uaWMgdG8gYmUgY2FsbGVkLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBhY2staW5nIG9mIHRoZSAibGFzdCIgUngtZXZlbnQKKyoJdG8gdGhlIEhlcm1lcywgY2F1c2luZyB0aGUgSGVybWVzIHRvIGRpc2NhcmQgdGhlIGFzc29jaWF0ZWQgTklDIFJBTSBidWZmZXIuCisqIEFzc2VydCBmYWlscyBpZgorKiAtIGlmYnAgaXMgemVybyBvciBvdGhlciByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgorKiAtIGhjZl9zZXJ2aWNlX25pYyBpcyBjYWxsZWQgd2l0aG91dCBhIHByaW9yIGNhbGwgdG8gaGNmX2Nvbm5lY3QuCisqIC0gaW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KKyogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uCisqCWFnYWluc3QgTklDIGludGVycnVwdHMgb3IgbXVsdGktdGhyZWFkaW5nLgorKgorKgorKi5ESUFHUkFNCisqMToJSUZCX0xpbmtTdGF0IGlzIGNsZWFyZWQsIGlmIGEgTGlua1N0YXR1cyBmcmFtZSBpcyByZWNlaXZlZCwgSUZCX0xpbmtTdGF0IHdpbGwgYmUgdXBkYXRlZCBhY2NvcmRpbmdseQorKglieSBpc3JfaW5mby4KK29yCisqMToJSUZCX0xpbmtTdGF0IGNoYW5nZSBpbmRpY2F0aW9uIGlzIGNsZWFyZWQuIElmIGEgTGlua1N0YXR1cyBmcmFtZSBpcyByZWNlaXZlZCwgSUZCX0xpbmtTdGF0IHdpbGwgYmUgdXBkYXRlZAorKglhY2NvcmRpbmdseSBieSBpc3JfaW5mby4KKyoyOiBJRkJfUnhMZW4gbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSB0aGUgTklDIHByZXNlbmNlIGNoZWNrIG90aGVyd2lzZToKKyoJIC0JdGhpcyB2YWx1ZSBtYXkgc3RheSBub24temVybyBpZiB0aGUgTklDIGlzIHB1bGxlZCBvdXQgYXQgYW4gaW5jb252ZW5pZW50IG1vbWVudC4KKyoJIC0JdGhlIFJ4QWNrIG9uIGEgemVyby1GSUQgbmVlZHMgYSB6ZXJvLXZhbHVlIGZvciBJRkJfUnhMZW4gdG8gd29yaworKgkgTm90ZSB0aGF0IGFzIHNpZGUtZWZmZWN0IG9mIHRoZSBoY2ZfYWN0aW9uIGNhbGwsIHRoZSByZW1haW5kZXIgb2YgUnggcmVsYXRlZCBpbmZvIGlzIHJlLWluaXRpYWxpemVkIGFzCisqCSB3ZWxsLgorKjQ6CUluIGNhc2Ugb2YgRGVmdW5jdCBtb2RlLCB0aGUgaW5mb3JtYXRpb24gc3VwcGxpZWQgYnkgSGVybWVzIGlzIHVucmVsaWFibGUsIHNvIHRoZSBib2R5IG9mCisqCWhjZl9zZXJ2aWNlX25pYyBpcyBza2lwcGVkLiBTaW5jZSBoY2ZfY250bCB0dXJucyBpbnRvIGEgTk9QIGlmIFByaW1hcnkgb3IgU3RhdGlvbiBGL1cgaXMgaW5jb21wYXRpYmxlLAorKgloY2Zfc2VydmljZV9uaWMgaXMgYWxzbyBza2lwcGVkIGluIHRob3NlIGNhc2VzLgorKglUbyBwcmV2ZW50IHRoYXQgaGNmX3NlcnZpY2VfbmljIHJlcG9ydHMgYm9ndXMgaW5mb3JtYXRpb24gdG8gdGhlIE1TRiB3aXRoIGFsbCAtIHBvc3NpYmx5IGRpZmZpY3VsdCB0bworKglkZWJ1ZyAtIHVuZGVzaXJhYmxlIHNpZGUgZWZmZWN0cywgaXQgaXMgcGFyYW1vdW50IHRvIGNoZWNrIHRoZSBOSUMgcHJlc2VuY2UuIEluIGZvcm1lciBkYXlzIHRoZSBwcmVzZW5jZQorKgl0ZXN0IHdhcyBiYXNlZCBvbiB0aGUgSGVybWVzIHJlZ2lzdGVyIEhSRUdfU1dfMC4gU2luY2UgaW4gSENGX0FDVF9JTlRfT0ZGIGlzIGNob29zZW4gZm9yIHN0cmF0ZWd5IGJhc2VkIG9uCisqCUhSRUdfRVZfU1RBVCwgdGhpcyBpcyBub3cgYWxzbyB1c2VkIGluIGhjZl9zZXJ2aWNlX25pYy4gVGhlIG1vdGl2YXRpb24gdG8gY2hhbmdlIHN0cmF0ZWd5IGlzIHBhcnRseQorKglkdWUgdG8gaW5jb25zaXN0ZW50IEYvVyBpbXBsZW1lbnRhdGlvbnMgd2l0aCByZXNwZWN0IHRvIEhSRUdfU1dfMCBtYW5pcHVsYXRpb24gYXJvdW5kIHJlc2V0IGFuZCBkb3dubG9hZC4KKyoJTm90ZSB0aGF0IGluIHBvbGxlZCBlbnZpcm9ubWVudHMgQ2FyZCBSZW1vdmFsIGlzIG5vdCBkZXRlY3RlZCBieSBJTlRfT0ZGIHdoaWNoIG1ha2VzIHRoZSBjaGVjayBpbgorKgloY2Zfc2VydmljZV9uaWMgZXZlbiBtb3JlIGltcG9ydGFudC4KKyo4OglUaGUgZXZlbnQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRoZSBIZXJtZXMgaXMgc2FtcGxlZAorKglUaGUgYXNzZXJ0IGNoZWNrcyBmb3IgdW5leHBlY3RlZCBldmVudHMgOz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8uCisqCSAtIEhSRUdfRVZfSU5GT19EUk9QIGlzIGV4cGxpY2l0bHkgZXhjbHVkZWQgZnJvbSB0aGUgYWNjZXB0YWJsZSBIUkVHX0VWX1NUQVQgYml0cyBiZWNhdXNlIGl0IGluZGljYXRlcworKgkgICBhIHRvbyBoZWF2aWx5IGxvYWRlZCBzeXN0ZW0uCisqCSAtIEhSRUdfRVZfQUNLX1JFR19SRUFEWSBpcyAweDAwMDAgZm9yIEgtSSAoYW5kIGhvcGVmdWxseSBILUlJLjUpCisqCisqCisqCUhSRUdfRVZfVFhfRVhDIGlzIGFjY2VwdGVkICh2aWEgSFJFR19FVl9UWF9FWFQpIGlmIGFuZCBvbmx5IGlmIEhDRl9FWFRfSU5UX1RYX0VYIHNldCBpbiB0aGUgSENGX0VYVAorKglkZWZpbml0aW9uIGF0IGNvbXBpbGUgdGltZS4KKyoJVGhlIGZvbGxvd2luZyBhY3Rpdml0aWVzIGFyZSBoYW5kbGVkOgorKgkgLQlBbGxvYyBldmVudHMgYXJlIGhhbmRsZWQgYnkgaGNmX3NlbmRfbXNnIChhbmQgbm90aWZ5KS4gT25seSBpZiB0aGVyZSBpcyBubyAic3BhcmUiIHJlc291cmNlLCB0aGUKKyoJCWFsbG9jIGV2ZW50IGlzIHN1cGVyZmljaWFsbHkgc2VydmljZWQgYnkgaGNmX3NlcnZpY2VfbmljIHRvIGNyZWF0ZSBhIHBzZXVkby1yZXNvdXJjZSB3aXRoIHZhbHVlCisqCQkweDAwMS4gVGhpcyB2YWx1ZSBpcyByZWNvZ25pemVkIGJ5IGdldF9maWQgKGNhbGxlZCBieSBoY2Zfc2VuZF9tc2cgYW5kIG5vdGlmeSkgd2hlcmUgdGhlIHJlYWwKKyoJCVR4RmlkIGlzIHJldHJpZXZlZCBhbmQgdGhlIEhlcm1lcyBpcyBhY2tlZCBhbmQgLSBob3BlZnVsbHkgLSB0aGUgIm5vcm1hbCIgY2FzZSB3aXRoIGEgc3BhcmUgVHhGaWQKKyoJCWluIElGQl9Sc2NJbmQgaXMgcmVzdG9yZWQuCisqCSAtCUluZm8gZHJvcCBldmVudHMgYXJlIGhhbmRsZWQgYnkgaW5jcmVtZW50aW5nIGEgdGFsbHkKKyoJIC0JTGlua0V2ZW50IChpbmNsdWRpbmcgc29saWNpdGVkIGFuZCB1bnNvbGljaXRlZCB0YWxsaWVzKSBhcmUgaGFuZGxlZCBieSBwcm9jZWR1cmUgaXNyX2luZm8uCisqCS0JVHhFeCAoaWYgc2VsZWN0ZWQgYXQgY29tcGlsZSB0aW1lKSBpcyBoYW5kbGVkIGJ5IGNvcHlpbmcgdGhlIHNpZ25pZmljYW50IHBhcnQgb2YgdGhlIFR4RlMKKyoJCWludG8gdGhlIElGQiBmb3IgZnVydGhlciBwcm9jZXNzaW5nIGJ5IHRoZSBNU0YuCisqCQlOb3RlIHRoZSBjb21wbGljYXRpb24gb2YgdGhlIHplcm8tRklEIHByb3RlY3Rpb24gc3ViLXNjaGVtZSBpbiBEQVdBLgorKglOb3RlLCB0aGUgQWNrIG9mIGFsbCBvZiBhYm92ZSBldmVudHMgaXMgaGFuZGxlZCBhdCB0aGUgZW5kIG9mIGhjZl9zZXJ2aWNlX25pYworKjE2OiBJbiBjYXNlIG9mICBub24tRE1BICggZWl0aGVyIG5vdCBjb21waWxlZCBpbiBvciBkdWUgdG8gYSBydW4tdGltZSBjaG9pY2UpOgorKglJZiBhbiBSeC1mcmFtZSBpcyBhdmFpbGFibGUsIGZpcnN0IHRoZSBGSUQgb2YgdGhhdCBmcmFtZSBpcyByZWFkLCBpbmNsdWRpbmcgdGhlIGNvbXBsaWNhdGlvbiBvZiB0aGUKKyoJemVyby1GSUQgcHJvdGVjdGlvbiBzdWItc2NoZW1lIGluIERBV0EuIE5vdGUgdGhhdCBzdWNoIGEgemVyby1GSUQgaXMgYWNrbm93bGVkZ2VkIGF0IHRoZSBlbmQgb2YKKyoJaGNmX3NlcnZpY2VfbmljIGFuZCB0aGF0IHRoaXMgZGVwZW5kcyBvbiB0aGUgSUZCX1J4TGVuIGluaXRpYWxpemF0aW9uIGluIHRoZSBiZWdpbiBvZiBoY2Zfc2VydmljZV9uaWMuCisqCVRoZSBBc3NlcnQgdmFsaWRhdGVzIHRoZSBIQ0YgYXNzdW1wdGlvbiBhYm91dCBIZXJtZXMgaW1wbGVtZW50YXRpb24gdXBvbiB3aGljaCB0aGUgcmFuZ2Ugb2YKKyoJUHNldWRvLVJJRHMgaXMgYmFzZWQuCisqCVRoZW4gdGhlIGNvbnRyb2wgZmllbGRzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgODAyLjMgZnJhbWUgYXJlIHJlYWQgZnJvbSB0aGUgTklDIGludG8gdGhlIGxvb2thaGVhZCBidWZmZXIuCisqCVRoZSBzdGF0dXMgZmllbGQgaXMgY29udmVydGVkIHRvIG5hdGl2ZSBFbmRpYW5lc3MuCisqCVRoZSBsZW5ndGggaXMsIGFmdGVyIGltcGxpY2l0IEVuZGlhbmVzcyBjb252ZXJzaW9uIGlmIG5lZWRlZCwgYW5kIGFkanVzdG1lbnQgZm9yIHRoZSAxNCBieXRlcyBvZiB0aGUKKyoJODAyLjMgTUFDIGhlYWRlciwgc3RvcmVkIGluIElGQl9SeExlbi4KKyoJSW4gTUFDIE1vbml0b3IgbW9kZSwgODAyLjExIGNvbnRyb2wgZnJhbWVzIHdpdGggYSBUT1RBTCBsZW5ndGggb2YgMTQgYXJlIHJlY2VpdmVkLCBzbyB3aXRob3V0IHRoaXMKKyoJbGVuZ3RoIGFkanVzdG1lbnQsIElGQl9SeExlbiBjb3VsZCBub3QgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGVzZSBmcmFtZXMgZnJvbSAibm8gZnJhbWUiLgorKglObyBNSUMgY2FsY3VsYXRpb24gcHJvY2Vzc2VzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlYWRpbmcgb2YgdGhlc2UgQ29udHJvbCBmaWVsZHMuCisqMjY6IFRoaXMgbGVuZ3RoIHRlc3QgZmVlbHMgbGlrZSBzdXBlcmZsdW91cyByb2J1c3RuZXNzIGFnYWluc3QgbWFsZm9ybWVkIGZyYW1lcywgYnV0IGl0IHR1cm5lZCBvdXQgdG8gYmUKKyoJbmVlZGVkIGluIHRoZSByZWFsIChob3N0aWxlKSB3b3JsZC4KKyoJVGhlIGRlY2Fwc3VsYXRpb24gY2hlY2sgbmVlZHMgc3VmZmljaWVudCBkYXRhIHRvIHJlcHJlc2VudCBEQSwgU0EsIEwsIFNOQVAgYW5kIFR5cGUgd2hpY2ggYW1vdW50cyB0bworKgkyMiBieXRlcy4gSW4gTUFDIE1vbml0b3IgbW9kZSwgODAyLjExIGNvbnRyb2wgZnJhbWVzIHdpdGggYSBzbWFsbGVyIGxlbmd0aCBhcmUgcmVjZWl2ZWQuIFRvIHByZXZlbnQKKyoJdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gZ29lcyBoYXl3aXJlLCBhIGNoZWNrIG9uIHRoZSBsZW5ndGggaXMgbmVlZGVkLgorKglUaGUgYWN0dWFsIGRlY2Fwc3VsYXRpb24gdGFrZXMgcGxhY2Ugb24gdGhlIGZseSBpbiB0aGUgY29weWluZyBwcm9jZXNzIGJ5IG92ZXJ3cml0aW5nIHRoZSBTTkFQIGhlYWRlci4KKyoJTm90ZSB0aGF0IGluIGNhc2Ugb2YgZGVjYXBzdWxhdGlvbiB0aGUgU05BUCBoZWFkZXIgaXMgbm90IHBhc3NlZCB0byB0aGUgTVNGLCBoZW5jZSBJRkJfUnhMZW4gbXVzdCBiZQorKgljb21wZW5zYXRlZCBmb3IgdGhlIFNOQVAgaGVhZGVyIGxlbmd0aC4KKyoJVGhlIDIyIGJ5dGVzIG5lZWRlZCBmb3IgZGVjYXBzdWxhdGlvbiBhcmUgKG1vcmUgdGhhbikgc3VmZmljaWVudCBmb3IgdGhlIGV4Y2VwdGlvbmFsIGhhbmRsaW5nIG9mIHRoZQorKglNSUMgYWxnb3JpdGhtIG9mIHRoZSBMLWZpZWxkIChyZXBsYWNpbmcgdGhlIDIgYnl0ZSBMLWZpZWxkIHdpdGggNCAweDAwIGJ5dGVzKS4KKyozMDogVGhlIDEyIGluIHRoZSBuby1TU04gYnJhbmNoIGNvcnJlc3BvbmRzIHdpdGggdGhlIGdldF9mcmFnLCB0aGUgMiB3aXRoIHRoZSBJUFcgb2YgdGhlIFNTTiBicmFuY2gKKyozMjogSWYgSGVybWVzIHJlcG9ydGVkIE1JQy1wcmVzZW5jZSwgdGhhbiB0aGUgTUlDIGVuZ2luZSBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBub24tZHVtbXkgTUlDIGNhbGN1bGF0aW9uCisqCXJvdXRpbmUgYWRkcmVzcyBhbmQgYXBwcm9wcmlhdGUga2V5LgorKjM0OiBUaGUgOCBieXRlcyBhZnRlciB0aGUgREEsIFNBLCBMIGFyZSByZWFkIGFuZCBpdCBpcyBjaGVja2VkIHdoZXRoZXIgZGVjYXBzdWxhdGlvbiBpcyBuZWVkZWQgaS5lLjoKKyoJICAtIHRoZSBIZXJtZXMgcmVwb3J0ZWQgVHVubmVsIGVuY2Fwc3VsYXRpb24gb3IKKyoJICAtIHRoZSBIZXJtZXMgcmVwb3J0ZWQgMTA0MiBFbmNhcHN1bGF0aW9uIGFuZCBoY2ZfZW5jYXAgcmVwb3J0cyB0aGF0IHRoZSBIQ0Ygd291bGQgbm90IGhhdmUgdXNlZAorKgkJMTA0MiBhcyB0aGUgZW5jYXBzdWxhdGlvbiBtZWNoYW5pc20KKyoJTm90ZSB0aGF0IHRoZSBmaXJzdCBmaWVsZCBvZiB0aGUgUnhGUyBpbiBidWZwIGhhcyBOYXRpdmUgRW5kaWFuZXNzIGR1ZSB0byB0aGUgY29udmVyc2lvbiBkb25lIGJ5IHRoZQorKglCRV9QQVIgaW4gZ2V0X2ZyYWcuCisqMzY6IFRoZSBUeXBlIGZpZWxkIGlzIHRoZSBvbmx5IHdvcmQga2VwdCAoYWZ0ZXIgbW92aW5nKSBvZiB0aGUganVzdCByZWFkIDggYnl0ZXMsIGl0IGlzIG1vdmVkIHRvIHRoZQorKglMLWZpZWxkLiAgVGhlIG9yaWdpbmFsIEwtZmllbGQgYW5kIDYgYnl0ZSBTTkFQIGhlYWRlciBhcmUgZGlzY2FyZGVkLCBzbyBJRkJfUnhMZW4gYW5kIGJ1Zl9hZGRyIG11c3QKKyoJYmUgYWRqdXN0ZWQgYnkgOC4KKyo0MDogRGV0ZXJtaW5lIGhvdyBtdWNoIG9mIHRoZSBmcmFtZSAoc3RhcnRpbmcgd2l0aCBEQSkgZml0cyBpbiB0aGUgTG9va2FoZWFkIGJ1ZmZlciwgdGhlbiByZWFkIHRoZSBub3QteWV0CisqCXJlYWQgZGF0YSBpbnRvIHRoZSBsb29rYWhlYWQgYnVmZmVyLgorKglJZiB0aGUgbG9va2FoZWFkIGJ1ZmZlciBjb250YWlucyB0aGUgY29tcGxldGUgbWVzc2FnZSwgY2hlY2sgdGhlIE1JQy4gVGhlIG1ham9yaXR5IGNvbnNpZGVyZWQgdGhpcworKglJL0YgbW9yZSBhcHByb3ByaWF0ZSB0aGVuIGhhdmUgdGhlIE1TRiBjYWxsIGhjZl9nZXRfZGF0YSBvbmx5IHRvIGNoZWNrIHRoZSBNSUMuCisqNDQ6IFNpbmNlIHRoZSBjb21wbGV0ZSBtZXNzYWdlIGlzIGNvcGllZCBmcm9tIE5JQyBSQU0gdG8gUEMgUkFNLCB0aGUgUnggY2FuIGJlIGFja25vd2xlZGdlZCB0byB0aGUgSGVybWVzCisqCXRvIG9wdGltaXplIHRoZSBmbG93ICggYSBiZXR0ZXIgY2hhbmNlIHRvIGdldCBuZXcgUnggZGF0YSBpbiB0aGUgbmV4dCBwYXNzIHRocm91Z2ggaGNmX3NlcnZpY2VfbmljICkuCisqCVRoaXMgYWNrbm93bGVkZ2VtZW50IGNhbiBub3QgYmUgZG9uZSB2aWEgaGNmX2FjdGlvbiggSENGX0FDVF9SWF9BQ0sgKSBiZWNhdXNlIHRoaXMgYWxzbyBjbGVhcnMKKyoJSUZCX1J4TEVOIHRodXMgY29ycnVwdGluZyB0aGUgSS9GIHRvIHRoZSBNU0YuCisqOz86IEluIGNhc2Ugb2YgRE1BIChjb21waWxlZCBpbiBhbmQgYWN0aXZhdGVkKToKKworCisqNTQ6IExpbWl0aW5nIHRoZSBudW1iZXIgb2YgcGxhY2VzIHdoZXJlIHRoZSBGL1cgaXMgYWNrZWQgKGUuZy4gdGhlIG1lcmdpbmcgb2YgdGhlIFJ4LUFDSyB3aXRoIHRoZSBvdGhlcgorKglBQ0tzKSwgaXMgc3VwcG9zZWQgdG8gZGltaW5pc2ggdGhlIHBvdGVudGlhbCBvZiByYWNlIGNvbmRpdGlvbnMgaW4gdGhlIEYvVy4KKyoJTm90ZSAxOiBUaGUgQ01EIGV2ZW50IGlzIGFja25vd2xlZGdlZCBpbiBjbWRfY21wbAorKglOb3RlIDI6IEhSRUdfRVZfQUNLX1JFR19SRUFEWSBpcyAweDAwMDAgZm9yIEgtSSAoYW5kIGhvcGVmdWxseSBILUlJLjUpCisqCU5vdGUgMzogVGhlIEFMTE9DIGV2ZW50IGlzIGFja25vd2xlZGdlZCBpbiBnZXRfZmlkIChleGNlcHQgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmbG93KQorKgorKi5OT1RJQ0UKKyogVGhlIE5vbi1ETUEgSFJFR19FVl9SWCBpcyBoYW5kbGVkIGRpZmZlcmVudCBjb21wYXJlZCB3aXRoIHRoZSBvdGhlciBGL1cgZXZlbnRzLgorKiBUaGUgSFJFR19FVl9SWCBldmVudCBpcyBhY2tub3dsZWRnZWQgYnkgdGhlIGZpcnN0IGhjZl9zZXJ2aWNlX25pYyBjYWxsIGFmdGVyIHRoZQorKiBoY2Zfc2VydmljZV9uaWMgY2FsbCB0aGF0IHJlcG9ydGVkIHRoZSBvY2N1cnJlbmNlIG9mIHRoaXMgZXZlbnQuCisqIFRoaXMgYWNrbm93bGVkZ21lbnQKKyogbWFrZXMgdGhlIG5leHQgUmVjZWl2ZSBGcmFtZSBTdHJ1Y3R1cmUgKGlmIGFueSkgYXZhaWxhYmxlLgorKiBBbiB1cGRhdGVkIElGQl9SeExlbgorKiBmaWVsZCByZWZsZWN0cyB0aGlzIGF2YWlsYWJpbGl0eS4KKyoKKyouTk9USUNFCisqIFRoZSBtaW5pbXVtIHNpemUgZm9yIExlbiBtdXN0IHN1cHBseSBzcGFjZSBmb3I6CisqIC0JYW4gRi9XIGRlcGVuZGVudCBudW1iZXIgb2YgYnl0ZXMgb2YgQ29udHJvbCBJbmZvIGZpZWxkIGluY2x1ZGluZyB0aGUgODAyLjExIEhlYWRlciBmaWVsZAorKiAtCURlc3RpbmF0aW9uIEFkZHJlc3MKKyogLQlTb3VyY2UgQWRkcmVzcworKiAtCUxlbmd0aCBmaWVsZAorKiAtCVsgU05BUCBIZWFkZXJdCisqIC0JWyBFdGhlcm5ldC1JSSBUeXBlXQorKiBUaGlzIHJlc3VsdHMgaW4gNjggZm9yIEhlcm1lcy1JIGFuZCA4MCBmb3IgSGVybWVzLUlJCisqIFRoaXMgd2F5IHRoZSBtaW5pbXVtIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgbmVlZGVkIGJ5IHRoZSBIQ0YgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZyYW1lCisqIG11c3QgYmUgZGVjYXBzdWxhdGVkLgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAoraGNmX3NlcnZpY2VfbmljKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIHVuc2lnbmVkIGludCBsZW4gKQoreworCitpbnQJCQlyYyA9IEhDRl9TVUNDRVNTOworaGNmXzE2CQlzdGF0Oword2NpX2J1ZnAJYnVmX2FkZHI7CitoY2ZfMTYgCQlpOworCisJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9TRVJWSUNFX05JQywgaWZicC0+SUZCX0ludE9mZkNudCApCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQorCUhDRkFTU0VSVF9JTlQKKworCWlmYnAtPklGQl9MaW5rU3RhdCA9IDA7IC8vIDs/IHRvIGJlIG9ic29sZXRlZCBBU0FQCQkJCQkJCQkJCQkJLyogMSovCisJaWZicC0+SUZCX0RTTGlua1N0YXQgJj0gfkNGR19MSU5LX1NUQVRfQ0hBTkdFOwkJCQkJCQkJCQkJCQkvKiAxKi8KKwkodm9pZCloY2ZfYWN0aW9uKCBpZmJwLCBIQ0ZfQUNUX1JYX0FDSyApOwkJCQkJCQkJCQkJCQkJLyogMiovCisJaWYgKCBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCAmJiAoIHN0YXQgPSBJUFcoIEhSRUdfRVZfU1RBVCApICkgIT0gMHhGRkZGICkgewkJCQkJLyogNCovCisvKgkJSUZfTk9UX0RNQSggSENGQVNTRVJUKCAhKCBzdGF0ICYgfkhSRUdfRVZfQkFTSUNfTUFTSywgc3RhdCApICkKKyAqCQlJRl9OT1RfVVNFX0RNQSggSENGQVNTRVJUKCAhKCBzdGF0ICYgfkhSRUdfRVZfQkFTSUNfTUFTSywgc3RhdCApICkKKyAqCQlJRl9VU0VfRE1BKCBIQ0ZBU1NFUlQoICEoIHN0YXQgJiB+KCBIUkVHX0VWX0JBU0lDX01BU0sgXiAoIEhSRUdfRVZfLi4uRE1BLi4uLiApLCBzdGF0ICkgKQorICovCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLyogOCovCisJCWlmICggaWZicC0+SUZCX1JzY0luZCA9PSAwICYmIHN0YXQgJiBIUkVHX0VWX0FMTE9DICkgeyAvL05vdGU6IElGQl9Sc2NJbmQgaXMgQUxXQVlTIDEgZm9yIERNQQorCQkJaWZicC0+SUZCX1JzY0luZCA9IDE7CisJCX0KKwkJSUZfVEFMTFkoIGlmICggc3RhdCAmIEhSRUdfRVZfSU5GT19EUk9QICkgaWZicC0+SUZCX0hDRl9UYWxsaWVzLk5vQnVmSW5mbysrOyApCisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTlRfVElDSworCQlpZiAoIHN0YXQgJiBIUkVHX0VWX1RJQ0sgKSB7CisJCQlpZmJwLT5JRkJfVGlja0NudCsrOworCQl9CisjaWYgMCAvLyAoSENGX1NMRUVQKSAmIEhDRl9ERFMKKwkJaWYgKCBpZmJwLT5JRkJfVGlja0NudCA9PSAzICYmICggaWZicC0+SUZCX0RTTGlua1N0YXQgJiBDRkdfTElOS19TVEFUX0NPTk5FQ1RFRCApID09IDAgKSB7CitDRkdfRERTX1RJQ0tfVElNRV9TVFJDVCBsdHY7CisJCQkvLyAyIHNlY29uZCBwZXJpb2QgKHdpdGggMSB0aWNrIHVuY2VydGFudHkpIGluIG5vdC1jb25uZWN0ZWQgbW9kZSAtLT5nbyBpbnRvIERTX09PUgorCQkJaGNmX2FjdGlvbiggaWZicCwgSENGX0FDVF9TTEVFUCApOworCQkJaWZicC0+SUZCX0RTTGlua1N0YXQgfD0gQ0ZHX0xJTktfU1RBVF9EU19PT1I7IC8vc2V0IE91dE9mUmFuZ2UKKwkJCWx0di5sZW4gPSAyOworCQkJbHR2LnR5cCA9IENGR19ERFNfVElDS19USU1FOworCQkJbHR2LnRpY2tfdGltZSA9ICggKCBpZmJwLT5JRkJfRFNMaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfVElNRVIgKSArIDB4MTAgKSAqNjQ7IC8vNzggaXMgbW9yZSByaWdodAorCQkJaGNmX3B1dF9pbmZvKCBpZmJwLCAoTFRWUCkmbHR2ICk7CisJCQlwcmludGsoICI8NT5QcmVwYXJpbmcgZm9yIHNsZWVwLCBsaW5rX3N0YXR1czogJTA0WCwgdGltZXIgOiAlZFxuIiwKKwkJCQkJaWZicC0+SUZCX0RTTGlua1N0YXQsIGx0di50aWNrX3RpbWUgKTsvLzs/cmVtb3ZlIG1lIDEgZGF5CisJCQlpZmJwLT5JRkJfVGlja0NudCsrOyAvLzs/anVzdCB0byBtYWtlIHN1cmUgd2UgZG8gbm90IGtlZXAgb24gcHJpbnRpbmcgYWJvdmUgbWVzc2FnZQorCQkJaWYgKCBsdHYudGlja190aW1lIDwgMzAwICogMTI1ICkgaWZicC0+SUZCX0RTTGlua1N0YXQgKz0gMHgwMDEwOworCisJCX0KKyNlbmRpZiAvLyBIQ0ZfRERTCisjZW5kaWYgLy8gSENGX0VYVF9JTlRfVElDSworCQlpZiAoIHN0YXQgJiBIUkVHX0VWX0lORk8gKSB7CisJCQlpc3JfaW5mbyggaWZicCApOworCQl9CisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTlRfVFhfRVgKKwkJaWYgKCBzdGF0ICYgSFJFR19FVl9UWF9FWFQgJiYgKCBpID0gSVBXKCBIUkVHX1RYX0NPTVBMX0ZJRCApICkgIT0gMCAvKkRBV0EqLyApIHsKKwkJCURBV0FfWkVST19GSUQoIEhSRUdfVFhfQ09NUExfRklEICkKKwkJCSh2b2lkKXNldHVwX2JhcCggaWZicCwgaSwgMCwgSU9fSU4gKTsKKwkJCWdldF9mcmFnKCBpZmJwLCAmaWZicC0+SUZCX1R4RnNTdGF0LCBIRlNfU1dTVVAgQkVfUEFSKDEpICk7CisJCX0KKyNlbmRpZiAvLyBIQ0ZfRVhUX0lOVF9UWF9FWAorLy8hcmxhdiBETUEgZW5naW5lIHdpbGwgaGFuZGxlIHRoZSByeCBldmVudCwgbm90IHRoZSBkcml2ZXIKKyNpZiBIQ0ZfRE1BCisJCWlmICggISggaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BICkgKSAvLyEhIGJlIGF3YXJlIG9mIHRoZSBsb2dpY2FsIGluZGVudGF0aW9ucworI2VuZGlmIC8vIEhDRl9ETUEKKy8qMTYqLwkgIGlmICggc3RhdCAmIEhSRUdfRVZfUlggJiYgKCBpZmJwLT5JRkJfUnhGSUQgPSBJUFcoIEhSRUdfUlhfRklEICkgKSAhPSAwICkgeyAvL2lmIDAgdGhlbiBEQVdBX0FDSworCQkJSENGQVNTRVJUKCBidWZwLCBsZW4gKQorCQkJSENGQVNTRVJUKCBsZW4gPj0gSEZTX0RBVCArIDIsIGxlbiApCisJCQlEQVdBX1pFUk9fRklEKCBIUkVHX1JYX0ZJRCApCisJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9SeEZJRCA8IENGR19QUk9EX0RBVEEsIGlmYnAtPklGQl9SeEZJRCkKKwkJCSh2b2lkKXNldHVwX2JhcCggaWZicCwgaWZicC0+SUZCX1J4RklELCAwLCBJT19JTiApOworCQkJZ2V0X2ZyYWcoIGlmYnAsIGJ1ZnAsIEhGU19BRERSX0RFU1QgQkVfUEFSKDEpICk7CisJCQlpZmJwLT5JRkJfbGFwID0gYnVmX2FkZHIgPSBidWZwICsgSEZTX0FERFJfREVTVDsKKwkJCWlmYnAtPklGQl9SeExlbiA9IChoY2ZfMTYpKGJ1ZnBbSEZTX0RBVF9MRU5dICsgKGJ1ZnBbSEZTX0RBVF9MRU4rMV08PDgpICsgMio2ICsgMik7CisvKjI2Ki8JCWlmICggaWZicC0+SUZCX1J4TGVuID49IDIyICkgewkJLy8gY29udmVuaWVudCBmb3IgTUlDIGNhbGN1bGF0aW9uICg1IERXcyArIDEgInNraXBwZWQiIFcpCisJCQkJCQkJCQkJCQkvLy4gIGdldCBEQSxTQSxMZW4vVHlwZSBhbmQgKFNOQVAsVHlwZSBvciA4IGRhdGEgYnl0ZXMpCisvKjMwKi8JCQlnZXRfZnJhZyggaWZicCwgYnVmX2FkZHIsIDIyIEJFX1BBUigwKSApOworLyozMiovCQkJQ0FMQ19SWF9NSUMoIGJ1ZnAsIC0xICk7CQkvLy4gIGluaXRpYWxpemUgTUlDCisJCQkJQ0FMQ19SWF9NSUMoIGJ1Zl9hZGRyLCBIQ0ZfREFTQV9TSVpFICk7CS8vLiAgTUlDIG92ZXIgREEsIFNBCisJCQkJQ0FMQ19SWF9NSUMoIG51bGxfYWRkciwgNCApOwkvLy4gIE1JQyBvdmVyICh2aXJ0dWFsKSBwcmlvcml0eSBmaWVsZAorCQkJCUNBTENfUlhfTUlDKCBidWZfYWRkcisxNCwgOCApOwkvLy4gIHNraXAgTGVuLCBNSUMgb3ZlciBTTkFQLFR5cGUgb3IgOCBkYXRhIGJ5dGVzKQorCQkJCWJ1Zl9hZGRyICs9IDIyOworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9DQ1gKKy8vISFiZSBjYXJlZnVsIGRvIG5vdCB1c2UgcG9zaXRpdmUgdGVzdCBvbiBIQ0ZfQUNUX0NDWF9PRkYsIGJlY2F1c2UgSUZCX0NLSVBTdGF0IGlzIGluaXRpYWxseSAwCisJCQkJaWYoIGlmYnAtPklGQl9DS0lQU3RhdCAhPSBIQ0ZfQUNUX0NDWF9PTiAgKQorI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAorCQkJCXsKKyNpZiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCisJCQkJCUhDRkFTU0VSVCggbGVuID49IEhGU19EQVQgKyAyICsgc2l6ZW9mKHNuYXBfaGVhZGVyKSwgbGVuICkKKy8qMzQqLyAJCQkJaSA9ICood2NpX3JlY29yZHApJmJ1ZnBbSEZTX1NUQVRdICYgKCBIRlNfU1RBVF9NU0dfVFlQRSB8IEhGU19TVEFUX0VSUiApOworCQkJCQlpZiAoIGkgPT0gSEZTX1NUQVRfVFVOTkVMIHx8CisJCQkJCQkgKCBpID09IEhGU19TVEFUXzEwNDIgJiYgaGNmX2VuY2FwKCAod2NpX2J1ZnApJmJ1ZnBbSEZTX1RZUEVdICkgIT0gRU5DX1RVTk5FTCApICkgeworCQkJCQkJCQkJCQkJLy8uICBjb3B5IEUtSUkgVHlwZSB0byA4MDIuMyBMRU4gZmllbGQKKy8qMzYqLwkJCQkJYnVmcFtIRlNfTEVOICBdID0gYnVmcFtIRlNfVFlQRSAgXTsKKwkJCQkJCWJ1ZnBbSEZTX0xFTisxXSA9IGJ1ZnBbSEZTX1RZUEUrMV07CisJCQkJCQkJCQkJCQkvLy4gIGRpc2NhcmQgU25hcCBieSBvdmVyd3JpdGluZyB3aXRoIGRhdGEKKwkJCQkJCWlmYnAtPklGQl9SeExlbiAtPSAoSEZTX1RZUEUgLSBIRlNfTEVOKTsKKwkJCQkJCWJ1Zl9hZGRyIC09ICggSEZTX1RZUEUgLSBIRlNfTEVOICk7IC8vIHRoaXMgaGFwcGVucyB0byBicmluZyB1cyBhdCBhIERXIGJvdW5kYXJ5IG9mIDM2CisJCQkJCX0KKyNlbmRpZiAvLyBIQ0ZfRU5DCisJCQkJfQorCQkJfQorLyo0MCovCQlpZmJwLT5JRkJfbGFsID0gbWluKCAoaGNmXzE2KShsZW4gLSBIRlNfQUREUl9ERVNUKSwgaWZicC0+SUZCX1J4TGVuICk7CisJCQlpID0gaWZicC0+SUZCX2xhbCAtICggYnVmX2FkZHIgLSAoIGJ1ZnAgKyBIRlNfQUREUl9ERVNUICkgKTsKKwkJCWdldF9mcmFnKCBpZmJwLCBidWZfYWRkciwgaSBCRV9QQVIoMCkgKTsKKwkJCUNBTENfUlhfTUlDKCBidWZfYWRkciwgaSApOworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKKwkJCWlmICggaWZicC0+SUZCX2xhbCA9PSBpZmJwLT5JRkJfUnhMZW4gKSB7CisJCQkJcmMgPSBjaGVja19taWMoIGlmYnAgKTsKKwkJCX0KKyNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKKy8qNDQqLwkJaWYgKCBsZW4gLSBIRlNfQUREUl9ERVNUID49IGlmYnAtPklGQl9SeExlbiApIHsKKwkJCQlpZmJwLT5JRkJfUnhGSUQgPSAwOworCQkJfSBlbHNlIHsgLyogSUZCX1J4RklEIGlzIGNsZWFyZWQsIHNvICB5b3UgZG8gbm90IGdldCBhbm90aGVyIFJ4X0FjayBhdCBuZXh0IGVudHJ5IG9mIGhjZl9zZXJ2aWNlX25pYyAqLworCQkJCXN0YXQgJj0gKGhjZl8xNil+SFJFR19FVl9SWDsJLy9kb24ndCBhY2sgUnggaWYgcHJvY2Vzc2luZyBub3QgeWV0IGNvbXBsZXRlZAorCQkJfQorCQl9CisJCS8vIGluIGNhc2Ugb2YgRE1BOiBzaWduYWwgYXZhaWxhYmlsaXR5IG9mIHJ4IGFuZC9vciB0eCBwYWNrZXRzIHRvIE1TRgorCQlJRl9VU0VfRE1BKCBpZmJwLT5JRkJfRG1hUGFja2V0cyB8PSBzdGF0ICYgKCBIUkVHX0VWX1JETUFEIHwgSFJFR19FVl9URE1BRCApOyApCisJCS8vIHJsYXYgOiBwZW5kaW5nIEhSRUdfRVZfUkRNQUQgb3IgSFJFR19FVl9URE1BRCBldmVudHMgZ2V0IGFja25vd2xlZGdlZCBoZXJlLgorLyo1NCovCXN0YXQgJj0gKGhjZl8xNil+KCBIUkVHX0VWX1NMRUVQX1JFUSB8IEhSRUdfRVZfQ01EIHwgSFJFR19FVl9BQ0tfUkVHX1JFQURZIHwgSFJFR19FVl9BTExPQyB8IEhSRUdfRVZfRldfRE1BICk7CisvL2EgcG9zaXRpdmUgbWFzayB3b3VsZCBiZSBlYXNpZXIgdG8gdW5kZXJzdGFuZCAvKjU0Ki8Jc3RhdCAmPSAoaGNmXzE2KX4oIEhSRUdfRVZfU0xFRVBfUkVRIHwgSFJFR19FVl9DTUQgfCBIUkVHX0VWX0FDS19SRUdfUkVBRFkgfCBIUkVHX0VWX0FMTE9DIHwgSFJFR19FVl9GV19ETUEgKTsKKwkJSUZfVVNFX0RNQSggc3RhdCAmPSAoaGNmXzE2KX5IUkVHX0VWX1JYOyApCisJCWlmICggc3RhdCApIHsKKwkJCURBV0FfQUNLKCBzdGF0ICk7CS8qREFXQSovCisJCX0KKwl9CisJSENGTE9HRVhJVCggSENGX1RSQUNFX1NFUlZJQ0VfTklDICkKKwlyZXR1cm4gcmM7Cit9IC8vIGhjZl9zZXJ2aWNlX25pYworI2VuZGlmIC8vIEhDRl9ETF9PTkxZCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKiogSCBDIEYgICBTIFUgUCBQIE8gUiBUICAgUiBPIFUgVCBJIE4gRSBTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouU1VCTU9EVUxFCQl2b2lkIGNhbGNfbWljKCBoY2ZfMzIqIHAsIGhjZl8zMiBtICkKKyouUFVSUE9TRQkJY2FsY3VsYXRlIE1JQyBvbiBhIHF1YWQgYnl0ZS4KKyoKKyouQVJHVU1FTlRTCisqCXAJCQlhZGRyZXNzIG9mIHRoZSBNSUMKKyoJbQkJCTMyIGJpdCB2YWx1ZSB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIE1JQyBjYWxjdWxhdGlvbiBlbmdpbmUKKyoKKyouUkVUVVJOUwkJTi5BLgorKgorKi5ERVNDUklQVElPTgorKiBjYWxjX21pYyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1JQyBhbGdvcml0aG0uIEl0IGlzIGEgbW9ua2V5LXNlZSBtb25rZXktZG8gY29weSBvZgorKiBNaWNoYWVsOjphcHBlbmRCeXRlKCkKKyogb2YgQXBwZW5kaXggQyBvZiAuLi4uLi4uLi4uCisqCisqCisqLkRJQUdSQU0KKyoKKyouTk9USUNFCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQorCisjZGVmaW5lIFJPTDMyKCBBLCBuICkgKCAoKEEpIDw8IChuKSkgfCAoICgoQSk+PigzMi0obikpKSAgJiAoICgxVUwgPDwgKG4pKSAtIDEgKSApICkKKyNkZWZpbmUgUk9SMzIoIEEsIG4gKSBST0wzMiggKEEpLCAzMi0obikgKQorCisjZGVmaW5lIEwJKnAKKyNkZWZpbmUgUgkqKHArMSkKKwordm9pZAorY2FsY19taWMoIGhjZl8zMiogcCwgaGNmXzMyIG0gKQoreworI2lmIEhDRl9CSUdfRU5ESUFOCisJbSA9IChtID4+IDE2KSB8IChtIDw8IDE2KTsKKyNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgorCUwgXj0gbTsKKwlSIF49IFJPTDMyKCBMLCAxNyApOworCUwgKz0gUjsKKwlSIF49ICgoTCAmIDB4ZmYwMGZmMDApID4+IDgpIHwgKChMICYgMHgwMGZmMDBmZikgPDwgOCk7CisJTCArPSBSOworCVIgXj0gUk9MMzIoIEwsIDMgKTsKKwlMICs9IFI7CisJUiBePSBST1IzMiggTCwgMiApOworCUwgKz0gUjsKK30gLy8gY2FsY19taWMKKyN1bmRlZiBSCisjdW5kZWYgTAorI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQorCisKKworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouU1VCTU9EVUxFCQl2b2lkIGNhbGNfbWljX3J4X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgcCwgaW50IGxlbiApCisqLlBVUlBPU0UJCWNhbGN1bGF0ZSBNSUMgb24gYSBzaW5nbGUgZnJhZ21lbnQuCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoJYnVmcAkJKGJ5dGUpIGFkZHJlc3Mgb2YgYnVmZmVyCisqCWxlbgkJCWxlbmd0aCBpbiBieXRlcyBvZiBidWZmZXIgc3BlY2lmaWVkIGJ5IGJ1ZnAKKyoKKyouUkVUVVJOUwkJTi5BLgorKgorKi5ERVNDUklQVElPTgorKiBjYWxjX21pY19yeF9mcmFnIC4uLi4uLi4uCisqCisqIFRoZSBNSUMgaXMgbG9jYXRlZCBpbiB0aGUgSUZCLgorKiBUaGUgTUlDIGlzIHNlcGFyYXRlIGZvciBUeCBhbmQgUngsIHRodXMgYWxsb3dpbmcgaGNmX3NlbmRfbXNnIHRvIG9jY3VyIGJldHdlZW4gaGNmX3NlcnZpY2VfbmljIGFuZAorKiBoY2ZfcmN2X21zZy4KKyoKKyoKKyouRElBR1JBTQorKgorKi5OT1RJQ0UKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitjYWxjX21pY19yeF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIHAsIGludCBsZW4gKQoreworc3RhdGljIHVuaW9uIHsgaGNmXzMyIHgzMjsgaGNmXzE2IHgxNlsyXTsgaGNmXzggeDhbNF07IH0geDsJLy8qIGFyZWEgdG8gYWNjdW11bGF0ZSA0IGJ5dGVzIGlucHV0IGZvciBNSUMgZW5naW5lCitpbnQgaTsKKworCWlmICggbGVuID09IC0xICkgewkJCQkJCQkJLy9pbml0aWFsaXplIE1JQyBob3VzZWtlZXBpbmcKKwkJaSA9ICood2NpX3JlY29yZHApJnBbSEZTX1NUQVRdOworCQkvKiBpID0gQ05WX1NIT1JUUF9UT19MSVRUTEUoJnBbSEZTX1NUQVRdKTsgc2hvdWxkIG5vdCBiZSBuZWVkZSB0byBwcmV2ZW50IGFsaWdubWVudCBwb3JvYmxlbXMKKwkJICogc2luY2UgbGVuID09IC0xIGlmIGFuZCBvbmx5IGlmIHAgaXMgbG9va2FoYWVhZCBidWZmZXIgd2hpY2ggTVVTVCBiZSB3b3JkIGFsaWduZWQKKwkJICogdG8gYmUgcmUtaW52ZXN0aWdhdGVkIGJ5IE52UgorCQkgKi8KKworCQlpZiAoICggaSAmIEhGU19TVEFUX01JQyApID09IDAgKSB7CisJCQlpZmJwLT5JRkJfTUlDUnhDYXJyeSA9IDB4RkZGRjsJCQkvL3N1cHByZXNzIE1JQyBjYWxjdWxhdGlvbgorCQl9IGVsc2UgeworCQkJaWZicC0+SUZCX01JQ1J4Q2FycnkgPSAwOworLy8qCU5vdGUgdGhhdCAiY29pbmNpZGVudGFsbHkiIHRoZSBiaXQgcG9zaXRpb25zIHVzZWQgaW4gSEZTX1NUQVQKKy8vKgljb3JyZXNwb25kIHdpdGggdGhlIG9mZnNldCBvZiB0aGUga2V5IGluIElGQl9NSUNLZXkKKwkJCWkgPSAoIGkgJiBIRlNfU1RBVF9NSUNfS0VZX0lEICkgPj4gMTA7CS8qIGNvaW5jaWRlbnRhbGx5IG5vIHNoaWZ0IG5lZWRlZCBmb3IgaSBpdHNlbGYgKi8KKwkJCWlmYnAtPklGQl9NSUNSeFswXSA9IENOVl9MT05HX1RPX0xJVFRMRShpZmJwLT5JRkJfTUlDUnhLZXlbaSAgXSk7CisJCQlpZmJwLT5JRkJfTUlDUnhbMV0gPSBDTlZfTE9OR19UT19MSVRUTEUoaWZicC0+SUZCX01JQ1J4S2V5W2krMV0pOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCBpZmJwLT5JRkJfTUlDUnhDYXJyeSA9PSAwICkgeworCQkJeC54MzIgPSBDTlZfTE9OR1BfVE9fTElUVExFKHApOworCQkJcCArPSA0OworCQkJaWYgKCBsZW4gPCA0ICkgeworCQkJCWlmYnAtPklGQl9NSUNSeENhcnJ5ID0gKGhjZl8xNilsZW47CisJCQl9IGVsc2UgeworCQkJCWlmYnAtPklGQl9NSUNSeENhcnJ5ID0gNDsKKwkJCQlsZW4gLT0gNDsKKwkJCX0KKwkJfSBlbHNlIHdoaWxlICggaWZicC0+SUZCX01JQ1J4Q2FycnkgPCA0ICYmIGxlbiApIHsJCS8vbm90ZSBmb3IgaGNmXzE2IGFwcGxpZXM6IDB4RkZGRiA+IDQKKwkJCXgueDhbaWZicC0+SUZCX01JQ1J4Q2FycnkrK10gPSAqcCsrOworCQkJbGVuLS07CisJCX0KKwkJd2hpbGUgKCBpZmJwLT5JRkJfTUlDUnhDYXJyeSA9PSA0ICkgewkvL2NvbnRyaXZlZCBzbyB3ZSBoYXZlIG9ubHkgMSBjYWxsIHRvIGNhbGNfbWljIHNvIHdlIGNvdWxkIGJyaW5nIGl0IGluLWxpbmUKKwkJCWNhbGNfbWljKCBpZmJwLT5JRkJfTUlDUngsIHgueDMyICk7CisJCQl4LngzMiA9IENOVl9MT05HUF9UT19MSVRUTEUocCk7CisJCQlwICs9IDQ7CisJCQlpZiAoIGxlbiA8IDQgKSB7CisJCQkJaWZicC0+SUZCX01JQ1J4Q2FycnkgPSAoaGNmXzE2KWxlbjsKKwkJCX0KKwkJCWxlbiAtPSA0OworCQl9CisJfQorfSAvLyBjYWxjX21pY19yeF9mcmFnCisjZW5kaWYgLy8gSENGX1RZUEVfV1BBCisKKworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouU1VCTU9EVUxFCQl2b2lkIGNhbGNfbWljX3R4X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgcCwgaW50IGxlbiApCisqLlBVUlBPU0UJCWNhbGN1bGF0ZSBNSUMgb24gYSBzaW5nbGUgZnJhZ21lbnQuCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoJYnVmcAkJKGJ5dGUpIGFkZHJlc3Mgb2YgYnVmZmVyCisqCWxlbgkJCWxlbmd0aCBpbiBieXRlcyBvZiBidWZmZXIgc3BlY2lmaWVkIGJ5IGJ1ZnAKKyoKKyouUkVUVVJOUwkJTi5BLgorKgorKi5ERVNDUklQVElPTgorKiBjYWxjX21pY190eF9mcmFnIC4uLi4uLi4uCisqCisqIFRoZSBNSUMgaXMgbG9jYXRlZCBpbiB0aGUgSUZCLgorKiBUaGUgTUlDIGlzIHNlcGFyYXRlIGZvciBUeCBhbmQgUngsIHRodXMgYWxsb3dpbmcgaGNmX3NlbmRfbXNnIHRvIG9jY3VyIGJldHdlZW4gaGNmX3NlcnZpY2VfbmljIGFuZAorKiBoY2ZfcmN2X21zZy4KKyoKKyoKKyouRElBR1JBTQorKgorKi5OT1RJQ0UKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitjYWxjX21pY190eF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIHAsIGludCBsZW4gKQoreworc3RhdGljIHVuaW9uIHsgaGNmXzMyIHgzMjsgaGNmXzE2IHgxNlsyXTsgaGNmXzggeDhbNF07IH0geDsJLy8qIGFyZWEgdG8gYWNjdW11bGF0ZSA0IGJ5dGVzIGlucHV0IGZvciBNSUMgZW5naW5lCisKKwkJCQkJCQkJCQkJCQkJLy9pZiBpbml0aWFsaXphdGlvbiByZXF1ZXN0CisJaWYgKCBsZW4gPT0gLTEgKSB7CisJCQkJCQkJCQkJCQkJCS8vLiAgcHJlc3VtZSBNSUMgY2FsY3VsYXRpb24gZGlzYWJsZWQKKwkJaWZicC0+SUZCX01JQ1R4Q2FycnkgPSAweEZGRkY7CisJCQkJCQkJCQkJCQkJCS8vLiAgaWYgTUlDIGNhbGN1bGF0aW9uIGVuYWJsZWQKKwkJaWYgKCBpZmJwLT5JRkJfTUlDVHhDbnRsICkgeworCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGNsZWFyIE1JQyBjYXJyeQorCQkJaWZicC0+SUZCX01JQ1R4Q2FycnkgPSAwOworCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGluaXRpYWxpemUgTUlDLWVuZ2luZQorCQkJaWZicC0+SUZCX01JQ1R4WzBdID0gQ05WX0xPTkdfVE9fTElUVExFKGlmYnAtPklGQl9NSUNUeEtleVswXSk7CS8qVHggYWx3YXlzIHVzZXMgS2V5IDAgKi8KKwkJCWlmYnAtPklGQl9NSUNUeFsxXSA9IENOVl9MT05HX1RPX0xJVFRMRShpZmJwLT5JRkJfTUlDVHhLZXlbMV0pOworCQl9CisJCQkJCQkJCQkJCQkJCS8vZWxzZQorCX0gZWxzZSB7CisJCQkJCQkJCQkJCQkJCS8vLiAgaWYgTUlDIGVuYWJsZWQgKFR4KSAvIGlmIE1JQyBwcmVzZW50IChSeCkKKwkJCQkJCQkJCQkJCQkJLy8uICBhbmQgbm8gY2FycnkgZnJvbSBwcmV2aW91cyBjYWxjX21pY19mcmFnCisJCWlmICggaWZicC0+SUZCX01JQ1R4Q2FycnkgPT0gMCApIHsKKwkJCQkJCQkJCQkJCQkJLy8uICAuICBwcmVzZXQgYWNjdSB3aXRoIDQgYnl0ZXMgZnJvbSBidWZmZXIKKwkJCXgueDMyID0gQ05WX0xPTkdQX1RPX0xJVFRMRShwKTsKKwkJCQkJCQkJCQkJCQkJLy8uICAuICBhZGp1c3QgcG9pbnRlciBhY2NvcmRpbmdseQorCQkJcCArPSA0OworCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGlmIGJ1ZmZlciBjb250YWluZWQgbGVzcyB0aGVuIDQgYnl0ZXMKKwkJCWlmICggbGVuIDwgNCApIHsKKwkJCQkJCQkJCQkJCQkJLy8uICAuICAuICBwcm9tb3RlIHZhbGlkIGJ5dGVzIGluIGFjY3UgdG8gY2FycnkKKwkJCQkJCQkJCQkJCQkJLy8uICAuICAuICBmbGFnIGFjY3UgdG8gY29udGFpbiBpbmNvbXBsZXRlIGRvdWJsZSB3b3JkCisJCQkJaWZicC0+SUZCX01JQ1R4Q2FycnkgPSAoaGNmXzE2KWxlbjsKKwkJCQkJCQkJCQkJCQkJLy8uICAuICBlbHNlCisJCQl9IGVsc2UgeworCQkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIGZsYWcgYWNjdSB0byBjb250YWluIGNvbXBsZXRlIGRvdWJsZSB3b3JkCisJCQkJaWZicC0+SUZCX01JQ1R4Q2FycnkgPSA0OworCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGFkanVzdCByZW1haW5pbmcgYnVmZmVyIGxlbmd0aAorCQkJCWxlbiAtPSA0OworCQkJfQorCQkJCQkJCQkJCQkJCQkvLy4gIGVsc2UgaWYgTUlDIGVuYWJsZWQKKwkJCQkJCQkJCQkJCQkJLy8uICBhbmQgaWYgY2FycnkgYnl0ZXMgZnJvbSBwcmV2aW91cyBjYWxjX21pY190eF9mcmFnCisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgbW92ZSAoMS0zKSBieXRlcyBmcm9tIGNhcnJ5IGludG8gYWNjdQorCQl9IGVsc2Ugd2hpbGUgKCBpZmJwLT5JRkJfTUlDVHhDYXJyeSA8IDQgJiYgbGVuICkgewkJLyogbm90ZSBmb3IgaGNmXzE2IGFwcGxpZXM6IDB4RkZGRiA+IDQgKi8KKwkJCXgueDhbaWZicC0+SUZCX01JQ1R4Q2FycnkrK10gPSAqcCsrOworCQkJbGVuLS07CisJCX0KKwkJCQkJCQkJCQkJCQkJLy8uICB3aGlsZSBhY2N1IGNvbnRhaW5zIGNvbXBsZXRlIGRvdWJsZSB3b3JkCisJCQkJCQkJCQkJCQkJCS8vLiAgYW5kIE1JQyBlbmFibGVkCisJCXdoaWxlICggaWZicC0+SUZCX01JQ1R4Q2FycnkgPT0gNCApIHsKKwkJCQkJCQkJCQkJCQkJLy8uICAuICBwYXNzIGFjY3UgdG8gTUlDIGVuZ2luZQorCQkJY2FsY19taWMoIGlmYnAtPklGQl9NSUNUeCwgeC54MzIgKTsKKwkJCQkJCQkJCQkJCQkJLy8uICAuICBjb3B5IG5leHQgNCBieXRlcyBmcm9tIGJ1ZmZlciB0byBhY2N1CisJCQl4LngzMiA9IENOVl9MT05HUF9UT19MSVRUTEUocCk7CisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgYWRqdXN0IGJ1ZmZlciBwb2ludGVyCisJCQlwICs9IDQ7CisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgaWYgYnVmZmVyIGNvbnRhaW5lZCBsZXNzIHRoZW4gNCBieXRlcworCQkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIHByb21vdGUgdmFsaWQgYnl0ZXMgaW4gYWNjdSB0byBjYXJyeQorCQkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIGZsYWcgYWNjdSB0byBjb250YWluIGluY29tcGxldGUgZG91YmxlIHdvcmQKKwkJCWlmICggbGVuIDwgNCApIHsKKwkJCQlpZmJwLT5JRkJfTUlDVHhDYXJyeSA9IChoY2ZfMTYpbGVuOworCQkJfQorCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGFkanVzdCByZW1haW5pbmcgYnVmZmVyIGxlbmd0aAorCQkJbGVuIC09IDQ7CisJCX0KKwl9Cit9IC8vIGNhbGNfbWljX3R4X2ZyYWcKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKKworCisjaWYgSENGX1BST1RfVElNRQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5TVUJNT0RVTEUJCXZvaWQgY2FsaWJyYXRlKCBJRkJQIGlmYnAgKQorKi5QVVJQT1NFCQljYWxpYnJhdGVzIHRoZSBTL1cgcHJvdGVjdGlvbiBjb3VudGVyIGFnYWluc3QgdGhlIEhlcm1lcyBUaW1lciB0aWNrLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCisqLlJFVFVSTlMJCU4uQS4KKyoKKyouREVTQ1JJUFRJT04KKyogY2FsaWJyYXRlcyB0aGUgUy9XIHByb3RlY3Rpb24gY291bnRlciBhZ2FpbnN0IHRoZSBIZXJtZXMgVGltZXIgdGljaworKiBJRkJfVGlja0luaSBpcyB0aGUgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBTL1cgcHJvdGVjdGlvbiBjb3VudGVyIHN1Y2ggdGhhdCB0aGUgZXhwaXJhdGlvbiBwZXJpb2QKKyogbW9yZSBvciBsZXNzIGluZGVwZW5kZW50IG9mIHRoZSBwcm9jZXNzb3Igc3BlZWQuIElmIElGQl9UaWNrSW5pIGlzIG5vdCB5ZXQgY2FsaWJyYXRlZCwgaXQgaXMgZG9uZSBub3cuCisqIFRoaXMgY2FsaWJyYXRpb24gaXMgInJlYXNvbmFibHkiIGFjY3VyYXRlIGJlY2F1c2UgdGhlIEhlcm1lcyBpcyBpbiBhIHF1aWV0IHN0YXRlIGFzIGEgcmVzdWx0IG9mIHRoZQorKiBJbml0aWFsaXplIGNvbW1hbmQuCisqCisqCisqLkRJQUdSQU0KKyoKKyoxOglJRkJfVGlja0luaSBpcyBpbml0aWFsaXplZCBhdCBJTklfVElDS19JTkkgYnkgaGNmX2Nvbm5lY3QuIElmIGNhbGlicmF0ZSBzdWNjZWVkcywgSUZCX1RpY2tJbmkgaXMKKyoJZ3VhcmFudGVlZCB0byBiZSBjaGFuZ2VkLiBBcyBhIGNvbnNlcXVlbmNlIHRoZXJlIHdpbGwgYmUgb25seSAxIHNob3QgYXQgY2FsaWJyYXRpb24gKHJlZ2FyZGxlc3Mgb2YgdGhlCisqCW51bWJlciBvZiBpbml0IGNhbGxzKSB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcy4KKyoyOglDYWxpYnJhdGlvbiBpcyBkb25lIEhDRl9QUk9UX1RJTUVfQ05UIHRpbWVzLiBUaGlzIGRpbWluaXNoIHRoZSBlZmZlY3RzIG9mIGppdHRlciBhbmQgaW50ZXJmZXJlbmNlLAorKgllc3BlY2lhbGx5IGluIGEgcHJlLWVtcHRpdmUgZW52aXJvbm1lbnQuIEhDRl9QUk9UX1RJTUVfQ05UIGlzIGluIHRoZSByYW5nZSBvZiAxNiB0aHJvdWdoIDMyIGFuZCBkZXJpdmVkCisqCWZyb20gdGhlIEhDRl9QUk9UX1RJTUUgc3BlY2lmaWVkIGJ5IHRoZSBNU0YgcHJvZ3JhbW1lci4gVGhlIGRpdmlzb3IgbmVlZGVkIHRvIHNjYWxlIEhDRl9QUk9UX1RJTUUgaW50byB0aGUKKyoJMTYtMzIgcmFuZ2UsIGlzIHVzZWQgYXMgYSBtdWx0aXBsaWNhdG9yIGFmdGVyIHRoZSBjYWxpYnJhdGlvbiwgdG8gc2NhbGUgdGhlIGZvdW5kIHZhbHVlIGJhY2sgdG8gdGhlCisqCXJlcXVlc3RlZCByYW5nZS4gVGhpcyB3YXkgYSBjb21wcm9taXNlIGlzIGFjaGlldmVkIGJldHdlZW4gYWNjdXJhY3kgYW5kIGR1cmF0aW9uIG9mIHRoZSBjYWxpYnJhdGlvbgorKglwcm9jZXNzLgorKjM6CUFja25vd2xlZGdlIHRoZSBUaW1lciBUaWNrIEV2ZW50LgorKglFYWNoIGN5Y2xlIGlzIGxpbWl0ZWQgdG8gYXQgbW9zdCBJTklfVElDS19JTkkgc2FtcGxlcyBvZiB0aGUgVGltZXJUaWNrIHN0YXR1cyBvZiB0aGUgSGVybWVzLgorKglTaW5jZSB0aGUgc3RhcnQgb2YgY2FsaWJyYXRlIGlzIHVucmVsYXRlZCB0byB0aGUgSGVybWVzIEludGVybmFsIFRpbWVyLCB0aGUgZmlyc3QgaW50ZXJ2YWwgbWF5IGxhc3QgZnJvbSAwCisqCXRvIHRoZSBub3JtYWwgaW50ZXJ2YWwsIGFsbCBzdWJzZXF1ZW50IGludGVydmFscyBzaG91bGQgYmUgdGhlIGZ1bGwgbGVuZ3RoIG9mIHRoZSBIZXJtZXMgVGljayBpbnRlcnZhbC4KKyoJVGhlIEhlcm1lcyBUaW1lciBUaWNrIGlzIG5vdCByZXByb2dyYW1tZWQgYnkgdGhlIEhDRiwgaGVuY2UgaXQgaXMgcnVubmluZyBhdCB0aGUgZGVmYXVsdCBvZiAxMCBrCisqCW1pY3Jvc2Vjb25kcy4KKyo0OglJZiB0aGUgVGltZXIgVGljayBFdmVudCBpcyBjb250aW51b3VzbHkgdXAgKHByb3RfY250IHN0aWxsIGhhcyB0aGUgdmFsdWUgSU5JX1RJQ0tfSU5JKSBvciBubyBUaW1lciBUaWNrCisqCUV2ZW50IG9jY3VycmVkIGJlZm9yZSB0aGUgcHJvdGVjdGlvbiBjb3VudGVyIGV4cGlyZWQsIHJlc2V0IElGQl9UaWNrSW5pIHRvIElOSV9USUNLX0lOSSwKKyoJc2V0IHRoZSBkZWZ1bmN0IGJpdCBvZiBJRkJfQ2FyZFN0YXQgKHRodXMgcmVuZGVyaW5nIHRoZSBIZXJtZXMgaW5vcGVyYWJsZSkgYW5kIGV4aXQgdGhlIGNhbGlicmF0ZSByb3V0aW5lLgorKjg6CWlmYnAtPklGQl9UaWNrSW5pIGlzIG11bHRpcGxpZWQgdG8gc2NhbGUgdGhlIGZvdW5kIHZhbHVlIGJhY2sgdG8gdGhlIHJlcXVlc3RlZCByYW5nZSBhcyBleHBsYWluZWQgdW5kZXIgMi4KKyoKKyouTk9USUNFCisqIG8gQWx0aG91Z2ggdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHZpZXdwb2ludHMgcG9zc2libGUsIGNhbGlicmF0ZSgpIHVzZXMgYXMgZXJyb3Igc3RyYXRlZ3kgdGhhdCBhIHNpbmdsZQorKglmYWlsdXJlIG9mIHRoZSBIZXJtZXMgVGltZXJUaWNrIGlzIGNvbnNpZGVyZWQgZmF0YWwuCisqIG8gVGhlcmUgaXMgbm8gaGFyZCBhbmQgY29uY3JldGUgdGltZS1vdXQgdmFsdWUgZGVmaW5lZCBmb3IgSGVybWVzIGFjdGl2aXRpZXMuIFRoZSBkZWZhdWx0IDEgc2Vjb25kcyBpcworKgliZWxpZXZlZCB0byBiZSBzdWZmaWNpZW50bHkgInJlbGF4ZWQiIGZvciByZWFsIGxpZmUgYW5kIHRvIGJlIHN1ZmZpY2llbnRseSBzaG9ydCB0byBiZSBzdGlsbCB1c2VmdWwgaW4gYW4KKyoJZW52aXJvbm1lbnQgd2l0aCBodW1hbnMuCisqIG8gTm90ZSB0aGF0IHZpYSBJRkJfRGVmdW5jdFN0YXQgdGltZSBvdXRzIGluIGNtZF93YWl0IGFuZCBpbiBoY2Zpb19zdHJpbmcgYmxvY2sgYWxsIEhlcm1lcyBhY2Nlc3MgdGlsbCB0aGUKKyoJbmV4dCBpbml0IHNvIGZ1bmN0aW9ucyB3aGljaCBjYWxsIGEgbWl4IG9mIGNtZF93YWl0IGFuZCBoY2Zpb19zdHJpbmcgb25seSBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm4gc3RhdHVzCisqCW9mIHRoZSBsYXN0IGNhbGwKKyogbyBUaGUgcmV0dXJuIGNvZGUgaXMgcHJlc2V0IGF0IFRpbWUgb3V0LgorKglUaGUgYWRkaXRpb25hbCBjb21wbGljYXRpb24gdGhhdCBubyBjYWxpYnJhdGVkIHZhbHVlIGZvciB0aGUgcHJvdGVjdGlvbiBjb3VudCBjYW4gYmUgYXNzdW1lZCBzaW5jZQorKgljYWxpYnJhdGUoKSBkb2VzIG5vdCB5ZXQgaGF2ZSBkZXRlcm1pbmVkIGEgY2FsaWJyYXRlZCB2YWx1ZSAoYSBjYXRjaCAyMiksIGlzIGhhbmRsZWQgYnkgc2V0dGluZyB0aGUKKyoJaW5pdGlhbCB2YWx1ZSBhdCBJTklfVElDS19JTkkgKGJ5IGhjZl9jb25uZWN0KS4gVGhpcyBhcHByb2FjaCBpcyBjb25zaWRlcmVkIHNhZmUsIGJlY2F1c2U6CisqCSAgLSB0aGUgSENGIGRvZXMgbm90IHVzZSB0aGUgcGlwZWxpbmUgbWVjaGFuaXNtIG9mIEhlcm1lcyBjb21tYW5kcy4KKyoJICAtIHRoZSBsaWtlbGlob29kIG9mIGZhaWx1cmUgKHRoZSBvbmx5IHRpbWUgd2hlbiBwcm90ZWN0aW9uIGNvdW50IGlzIHJlbGV2YW50KSBpcyBzbWFsbC4KKyoJICAtIHRoZSB0aW1lIHdpbGwgYmUgc3VmZmljaWVudGx5IGxhcmdlIG9uIGEgZmFzdCBtYWNoaW5lIChidXN5IGJpdCBkcm9wcyBvbiBnb29kIE5JQyBiZWZvcmUgY291bnRlcgorKgkJZXhwaXJlcykKKyoJICAtIHRoZSB0aW1lIHdpbGwgYmUgc3VmZmljaWVudGx5IHNtYWxsIG9uIGEgc2xvdyBtYWNoaW5lIChjb3VudGVyIGV4cGlyZXMgb24gYmFkIE5JQyBiZWZvcmUgdGhlIGVuZCB1c2VyCisqCSAgCXN3aXRjaGVzIHRoZSBwb3dlciBvZmYgaW4gZGVzcGFpcgorKglUaGUgdGltZSBuZWVkZWQgdG8gd3JhcCBhIDMyIGJpdCBjb3VudGVyIGFyb3VuZCBpcyBsb25nZXIgdGhhbiBtYW55IGh1bWFucyB3YW50IHRvIHdhaXQsIGhlbmNlIHRoZSBtb3JlIG9yCisqCWxlc3MgYXJiaXRyYXJ5IHZhbHVlIG9mIDB4NDAwMDBMIGlzIGNob3NlbiwgYXNzdW1pbmcgaXQgZG9lcyBub3QgdGFrZSB0b28gbG9uZyBvbiBhbiBYVCBhbmQgaXMgbm90IHRvbworKglzaG9ydCBvbiBhIHNjcmVhbS1tYWNoaW5lLgorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgdm9pZAorY2FsaWJyYXRlKCBJRkJQIGlmYnAgKQoreworaW50CQljbnQgPSBIQ0ZfUFJPVF9USU1FX0NOVDsKK2hjZl8zMglwcm90X2NudDsKKworCUhDRlRSQUNFKCBpZmJwLCBIQ0ZfVFJBQ0VfQ0FMSUJSQVRFICk7CisJaWYgKCBpZmJwLT5JRkJfVGlja0luaSA9PSBJTklfVElDS19JTkkgKSB7CQkJCQkJCQkJCQkJCS8qMSovCisJCWlmYnAtPklGQl9UaWNrSW5pID0gMDsJCQkJCQkJCQkJCQkJCQkJCS8qMiovCisJCQl3aGlsZSAoIGNudC0tICkgeworCQkJCXByb3RfY250ID0gSU5JX1RJQ0tfSU5JOworCQkJCU9QVyggSFJFR19FVl9BQ0ssIEhSRUdfRVZfVElDSyApOwkJCQkJCQkJCQkJCS8qMyovCisJCQkJd2hpbGUgKCAoSVBXKCBIUkVHX0VWX1NUQVQgKSAmIEhSRUdfRVZfVElDSykgPT0gMCAmJiAtLXByb3RfY250ICkgeworCQkJCQlpZmJwLT5JRkJfVGlja0luaSsrOworCQkJCX0KKwkJCQlpZiAoIHByb3RfY250ID09IDAgfHwgcHJvdF9jbnQgPT0gSU5JX1RJQ0tfSU5JICkgewkJCQkJCQkJLyo0Ki8KKwkJCQkJaWZicC0+SUZCX1RpY2tJbmkgPSBJTklfVElDS19JTkk7CisJCQkJCWlmYnAtPklGQl9EZWZ1bmN0U3RhdCA9IEhDRl9FUlJfREVGVU5DVF9USU1FUjsKKwkJCQkJaWZicC0+SUZCX0NhcmRTdGF0IHw9IENBUkRfU1RBVF9ERUZVTkNUOworCQkJCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgcHJvdF9jbnQgKQorCQkJCX0KKwkJCX0KKwkJaWZicC0+SUZCX1RpY2tJbmkgPDw9IEhDRl9QUk9UX1RJTUVfU0hGVDsJCQkJCQkJCQkJCQkvKjgqLworCX0KKwlIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX0NBTElCUkFURSB8IEhDRl9UUkFDRV9FWElUICk7Cit9IC8vIGNhbGlicmF0ZQorI2VuZGlmIC8vIEhDRl9QUk9UX1RJTUUKKworCisjaWYgKEhDRl9ETF9PTkxZKSA9PSAwCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5TVUJNT0RVTEUJCWludCBjaGVja19taWMoIElGQlAgaWZicCApCisqLlBVUlBPU0UJCXZlcmlmaWVzIHRoZSBNSUMgb2YgYSByZWNlaXZlZCBub24tVVNCIGZyYW1lLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCisqLlJFVFVSTlMKKyoJSENGX1NVQ0NFU1MKKyoJSENGX0VSUl9NSUMKKyoKKyouREVTQ1JJUFRJT04KKyoKKyoKKyouRElBR1JBTQorKgorKjQ6CXRlc3Qgd2hldGhlciBvciBub3QgYSBNSUMgaXMgcmVwb3J0ZWQgYnkgdGhlIEhlcm1lcworKjE0OiB0aGUgY2FsY3VsYXRlZCBNSUMgYW5kIHRoZSByZWNlaXZlZCBNSUMgYXJlIGNvbXBhcmVkLCB0aGUgcmV0dXJuIHN0YXR1cyBpcyBzZXQgd2hlbiB0aGVyZSBpcyBhIG1pc21hdGNoCisqCisqLk5PVElDRQorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorY2hlY2tfbWljKCBJRkJQIGlmYnAgKQoreworaW50CQlyYyA9IEhDRl9TVUNDRVNTOworaGNmXzMyIHgzMlsyXTsJCQkJLy8qIGFyZWEgdG8gc2F2ZSByY3ZkIDggYnl0ZXMgTUlDCisKKwkJCQkJCQkJCQkJCQkvL2lmIE1JQyBwcmVzZW50IGluIFJ4RlMKKwlpZiAoICood2NpX3JlY29yZHApJmlmYnAtPklGQl9sYXBbLUhGU19BRERSX0RFU1RdICYgSEZTX1NUQVRfTUlDICkgeworCS8vb3IgaWYgKCBpZmJwLT5JRkJfTUlDUnhDYXJyeSAhPSAweEZGRkYgKQorCQlDQUxDX1JYX01JQyggbWljX3BhZCwgOCApOwkJCQkJLy8uICBwcm9jZXNzIHVwIHRvIDMgcmVtYWluaW5nIGJ5dGVzIG9mIGRhdGEgYW5kIGFwcGVuZCA1IHRvIDggYnl0ZXMgb2YgcGFkZGluZyB0byBNSUMgY2FsY3VsYXRpb24KKwkJZ2V0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcCl4MzIsIDggQkVfUEFSKDApKTsvLy4gIGdldCA4IGJ5dGUgTUlDIGZyb20gTklDCisJCQkJCQkJCQkJCQkJLy8uICBpZiBjYWxjdWxhdGVkIGFuZCByZWNlaXZlZCBNSUMgZG8gbm90IG1hdGNoCisJCQkJCQkJCQkJCQkJLy8uICAuICBzZXQgc3RhdHVzIGF0IEhDRl9FUlJfTUlDCisvKjE0Ki8gIGlmICggeDMyWzBdICE9IENOVl9MSVRUTEVfVE9fTE9ORyhpZmJwLT5JRkJfTUlDUnhbMF0pIHx8CisgICAgICAgIAkgeDMyWzFdICE9IENOVl9MSVRUTEVfVE9fTE9ORyhpZmJwLT5JRkJfTUlDUnhbMV0pCSAgKSB7CisJCQlyYyA9IEhDRl9FUlJfTUlDOworCQl9CisJfQorCQkJCQkJCQkJCQkJCS8vcmV0dXJuIHN0YXR1cworCXJldHVybiByYzsKK30gLy8gY2hlY2tfbWljCisjZW5kaWYgLy8gSENGX1RZUEVfV1BBCisjZW5kaWYgLy8gSENGX0RMX09OTFkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLlNVQk1PRFVMRQkJaW50IGNtZF9jbXBsKCBJRkJQIGlmYnAgKQorKi5QVVJQT1NFCQl3YWl0cyBmb3IgSGVybWVzIENvbW1hbmQgQ29tcGxldGlvbi4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKgorKi5SRVRVUk5TCisqCUlGQl9EZWZ1bmN0U3RhdAorKglIQ0ZfRVJSX1RJTUVfT1VUCisqCUhDRl9FUlJfREVGVU5DVF9DTURfU0VRCisqCUhDRl9TVUNDRVNTCisqCisqLkRFU0NSSVBUSU9OCisqCisqCisqLkRJQUdSQU0KKyoKKyoyOglPbmNlIGNtZF9jbXBsIGlzIGNhbGxlZCwgdGhlIEJ1c3kgb3B0aW9uIGJpdCBpbiBJRkJfQ21kIG11c3QgYmUgY2xlYXJlZAorKjQ6CUlmIFN0YXR1cyByZWdpc3RlciBhbmQgY29tbWFuZCBjb2RlIGRvbid0IG1hdGNoIGVpdGhlcjoKKyoJIC0gdGhlIEhlcm1lcyBhbmQgSG9zdCBhcmUgb3V0IG9mIHN5bmMgKCBhIGZhdGFsIGVycm9yKQorKgkgLSBlcnJvciBiaXRzIGFyZSByZXBvcnRlZCB2aWEgdGhlIFN0YXR1cyBSZWdpc3Rlci4KKyoJT3V0IG9mIHN5bmMgaXMgY29uc2lkZXJlZCBmYXRhbCBhbmQgYnJpbmdzIHRoZSBIQ0YgaW4gRGVmdW5jdCBtb2RlCisqCUVycm9ycyByZXBvcnRlZCB2aWEgdGhlIFN0YXR1cyBSZWdpc3RlciBzaG91bGQgYmUgY2F1c2VkIGJ5IHNlcXVlbmNlIHZpb2xhdGlvbnMgaW4gSGVybWVzIGNvbW1hbmQKKyoJc2VxdWVuY2VzIGFuZCBoZW5jZSB0aGVzZSBidWdzIHNob3VsZCBoYXZlIGJlZW4gZm91bmQgZHVyaW5nIGVuZ2luZWVyaW5nIHRlc3RpbmcuIFNpbmNlIHRoZXJlIGlzIG5vCisqCXN0cmF0ZWd5IHRvIGNvcGUgd2l0aCB0aGlzIHByb2JsZW0sIGl0IG1pZ2h0IGFzIHdlbGwgYmUgaWdub3JlZCBhdCBydW4gdGltZS4gTm90ZSB0aGF0IGZvciBhbnkgcGFydGljdWxhcgorKglzaXR1YXRpb24gd2hlcmUgYSBzdHJhdGVneSBpcyBmb3JtdWxhdGVkIHRvIGhhbmRsZSB0aGUgY29uc2VxdWVuY2VzIG9mIGEgcGFydGljdWxhciBidWcgY2F1c2luZyBhCisqCXBhcnRpY3VsYXIgRXJyb3Igc2l0dWF0aW9uIHJlcG9ydGVkIHZpYSB0aGUgU3RhdHVzIFJlZ2lzdGVyLCB0aGUgYnVnIHNob3VsZCBiZSByZW1vdmVkIHJhdGhlciB0aGFuIGFkZGluZworKglsb2dpYyB0byBjb3BlIHdpdGggdGhlIGNvbnNlcXVlbmNlcyBvZiB0aGUgYnVnLgorKglUaGVyZSBoYXZlIGJlZW4gSENGIHZlcnNpb25zIHdoZXJlIGFuIGVycm9yIHJlcG9ydCB2aWEgdGhlIFN0YXR1cyBSZWdpc3RlciBldmVuIGJyb3VnaHQgdGhlIEhDRiBpbiBkZWZ1bmN0CisqCW1vZGUgKGFsdGhvdWdoIGl0IHdhcyBub3QgeWV0IG5hbWVkIGxpa2UgdGhhdCBhdCB0aGF0IHRpbWUpLiBUaGlzIGlzIHBhcnRpY3VsYXIgdW5kZXNpcmFibGUgYmVoYXZpb3IgZm9yIGEKKyoJZ2VuZXJhbCBsaWJyYXJ5LgorKglTaW1wbHkgcmVwb3J0aW5nIHRoZSBlcnJvciAoYXMgImludGVyZXN0aW5nIikgaXMgZGViYXRhYmxlLiBUaGVyZSBhbHNvIGhhdmUgYmVlbiBIQ0YgdmVyc2lvbnMgd2l0aCB0aGlzCisqCXN0cmF0ZWd5IHVzaW5nIHRoZSAidmFndWUiIEhDRl9GQUlMVVJFIGNvZGUuCisqCVRoZSBlcnJvciBpcyByZXBvcnRlZCB2aWE6CisqCSAtIE1pc2NFcnIgdGFsbHkgb2YgdGhlIEhDRiBUYWxseSBzZXQKKyoJIC0gdGhlIChpbmZvcm1hdGl2ZSkgZmllbGRzIElGQl9FcnJDbWQgYW5kIElGQl9FcnJRdWFsaWZpZXIKKyoJIC0gdGhlIGFzc2VydCBtZWNoYW5pc20KKyo4OglIZXJlIHRoZSBEZWZ1bmN0IGNhc2UgYW5kIHRoZSBTdGF0dXMgZXJyb3IgYXJlIHNlcGFyYXRlbHkgdHJlYXRlZAorKgorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgaW50CitjbWRfY21wbCggSUZCUCBpZmJwICkKK3sKKworUFJPVF9DTlRfSU5JCitpbnQJCXJjID0gSENGX1NVQ0NFU1M7CitoY2ZfMTYJc3RhdDsKKworCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfQ01EX0NQTCwgaWZicC0+SUZCX0NtZCApCisJaWZicC0+SUZCX0NtZCAmPSB+SENNRF9CVVNZOwkJCQkJCQkJCQkJCS8qIDIgKi8KKwlIQ0ZfV0FJVF9XSElMRSggKElQVyggSFJFR19FVl9TVEFUKSAmIEhSRUdfRVZfQ01EKSA9PSAwICk7CQkJCQkvKiA0ICovCisJc3RhdCA9IElQVyggSFJFR19TVEFUICk7CisjaWYgSENGX1BST1RfVElNRQorCWlmICggcHJvdF9jbnQgPT0gMCApIHsKKwkJSUZfVEFMTFkoIGlmYnAtPklGQl9IQ0ZfVGFsbGllcy5NaXNjRXJyKys7ICkKKwkJcmMgPSBIQ0ZfRVJSX1RJTUVfT1VUOworCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgaWZicC0+SUZCX0NtZCApCisJfSBlbHNlCisjZW5kaWYgLy8gSENGX1BST1RfVElNRQorCXsKKwkJREFXQV9BQ0soIEhSRUdfRVZfQ01EICk7CisvKjQqLwlpZiAoIHN0YXQgIT0gKGlmYnAtPklGQl9DbWQgJiBIQ01EX0NNRF9DT0RFKSApIHsKKy8qOCovCQlpZiAoICggKHN0YXQgXiBpZmJwLT5JRkJfQ21kICkgJiBIQ01EX0NNRF9DT0RFKSAhPSAwICkgeworCQkJCXJjID0gaWZicC0+SUZCX0RlZnVuY3RTdGF0ID0gSENGX0VSUl9ERUZVTkNUX0NNRF9TRVE7CisJCQkJaWZicC0+SUZCX0NhcmRTdGF0IHw9IENBUkRfU1RBVF9ERUZVTkNUOworCQkJfQorCQkJSUZfVEFMTFkoIGlmYnAtPklGQl9IQ0ZfVGFsbGllcy5NaXNjRXJyKys7ICkKKwkJCWlmYnAtPklGQl9FcnJDbWQgPSBzdGF0OworCQkJaWZicC0+SUZCX0VyclF1YWxpZmllciA9IElQVyggSFJFR19SRVNQXzAgKTsKKwkJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCBJUFcoIEhSRUdfUEFSQU1fMCApLCBpZmJwLT5JRkJfQ21kICkgKQorCQkJSENGQVNTRVJUKCBET19BU1NFUlQsIE1FUkdFXzIoIGlmYnAtPklGQl9FcnJRdWFsaWZpZXIsIGlmYnAtPklGQl9FcnJDbWQgKSApCisJCX0KKwl9CisJSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMpCisJSENGTE9HRVhJVCggSENGX1RSQUNFX0NNRF9DUEwgKQorCXJldHVybiByYzsKK30gLy8gY21kX2NtcGwKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLlNVQk1PRFVMRQkJaW50IGNtZF9leGUoIElGQlAgaWZicCwgaW50IGNtZF9jb2RlLCBpbnQgcGFyXzAgKQorKi5QVVJQT1NFCQlFeGVjdXRlcyBzeW5jaHJvbm91cyBwYXJ0IG9mIEhlcm1lcyBDb21tYW5kIGFuZCAtIG9wdGlvbmFsbHkgLSB3YWl0cyBmb3IgQ29tbWFuZCBDb21wbGV0aW9uLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCWNtZF9jb2RlCisqCXBhcl8wCisqCisqLlJFVFVSTlMKKyoJSUZCX0RlZnVuY3RTdGF0CisqCUhDRl9FUlJfREVGVU5DVF9DTURfU0VRCisqCUhDRl9TVUNDRVNTCisqCUhDRl9FUlJfVE9fQkVfQURERUQJPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwKKyoKKyouREVTQ1JJUFRJT04KKyogRXhlY3V0ZXMgc3luY2hyb25vdXMgSGVybWVzIENvbW1hbmQgYW5kIHdhaXRzIGZvciBDb21tYW5kIENvbXBsZXRpb24KKyoKKyogVGhlIGdlbmVyYWwgSENGIHN0cmF0ZWd5IGlzIHRvIHdhaXQgZm9yIGNvbW1hbmQgY29tcGxldGlvbi4gQXMgYSBjb25zZXF1ZW5jZToKKyogLSB0aGUgcmVhZCBvZiB0aGUgYnVzeSBiaXQgYmVmb3JlIHdyaXRpbmcgdGhlIGNvbW1hbmQgcmVnaXN0ZXIgaXMgc3VwZXJmbHVvdXMKKyogLSB0aGUgSGVybWVzIHJlcXVpcmVtZW50IHRoYXQgbm8gSW5xdWlyeSBjb21tYW5kIG1heSBiZSBleGVjdXRlZCBpZiB0aGVyZSBpcyBzdGlsbCBhbiB1bmFja25vd2xlZGdlZAorKglJbnF1aXJ5IGNvbW1hbmQgb3V0c3RhbmRpbmcsIGlzIGF1dG9tYXRpY2FsbHkgbWV0LgorKiBUaGUgVHggY29tbWFuZCB1c2VzIHRoZSAiQnVzeSIgYml0IGluIHRoZSBjbWRfY29kZSBwYXJhbWV0ZXIgdG8gZGV2aWF0ZSBmcm9tIHRoaXMgZ2VuZXJhbCBIQ0Ygc3RyYXRlZ3kuCisqIFRoZSBpZGVhIGlzIHRoYXQgYnkgbm90IGJ1c3ktd2FpdGluZyBvbiBjb21wbGV0aW9uIG9mIHRoaXMgZnJlcXVlbnRseSB1c2VkIGNvbW1hbmQgdGhlIHByb2Nlc3NvcgorKiB1dGlsaXphdGlvbiBpcyBkaW1pbmlzaGVkIHdoaWxlIHVzaW5nIHRoZSBidXN5LXdhaXQgb24gYWxsIG90aGVyIHNlbGRvbSB1c2VkIGNvbW1hbmRzIHRoZSBmbG93IGlzIGtlcHQKKyogc2ltcGxlLgorKgorKgorKgorKi5ESUFHUkFNCisqCisqMToJc2tpcCB0aGUgYm9keSBvZiBjbWRfZXhlIHdoZW4gaW4gZGVmdW5jdCBtb2RlIG9yIHdoZW4gLSBiYXNlZCBvbiB0aGUgUy9XIFN1cHBvcnQgcmVnaXN0ZXIgd3JpdGUgYW5kCisqCXJlYWQgYmFjayB0ZXN0IC0gdGhlcmUgaXMgYXBwYXJlbnRseSBubyBOSUMuCisqCU5vdGU6IHdlIGdhdmUgdXAgb24gdGhlICJvbGQiIHN0cmF0ZWd5IHRvIHdyaXRlIHRoZSBTL1cgU3VwcG9ydCByZWdpc3RlciBhdCBtYWdpYyBvbmx5IHdoZW4gbmVlZGVkLiBEdWUgdG8KKyoJdGhlIGludHJpY2F0ZW5lc3Mgb2YgSGVybWVzIEYvVyB2YXJpZXRpZXMgKCB3aGljaCBiZWhhdmUgZGlmZmVyZW50bHkgYXMgZmFyIGFzIGNvcnJ1cHRpb24gb2YgdGhlIFMvVworKglTdXBwb3J0IHJlZ2lzdGVyIGlzIGludm9sdmVkKSwgdGhlIGluY3JlYXNpbmcgbnVtYmVyIG9mIEhlcm1lcyBjb21tYW5kcyB3aGljaCBkbyBhbiBpbXBsaWNpdCBpbml0aWFsaXplCisqCSh0aHVzIG1vZGlmeWluZyB0aGUgUy9XIFN1cHBvcnQgcmVnaXN0ZXIpIGFuZCB0aGUgd29ya2Fyb3VuZHMgb2Ygc29tZSBPUy9TdXBwb3J0IFMvVyBpbmR1Y2VkIGFzcGVjdHMgKGUuZy4KKyoJdGhlIFN5c3RlbSBTb2Z0IGxpYnJhcnkgYXQgV2luTlQgd2hpY2ggcG9zdHBvbmVzIHRoZSBhY3R1YWwgbWFwcGluZyBvZiBJL08gc3BhY2UgdXAgdG8gMzAgc2Vjb25kcyBhZnRlcgorKglnaXZpbmcgdGhlIGdvLWFoZWFkKSwgdGhlICJtYWdpYyIgc3RyYXRlZ3kgaXMgbm93IHJlZHVjZWQgdG8gYSBzaW1wbGUgd3JpdGUgYW5kIHJlYWQgYmFjay4gVGhpcyBtZWFucyB0aGF0CisqCXByb2JsZW1zIGxpa2UgYSBidWcgdHJhbXBpbmcgb3ZlciB0aGUgbWVtb3J5IG1hcHBlZCBIZXJtZXMgcmVnaXN0ZXJzIHdpbGwgbm8gbG9uZ2VyIGJlIG5vdGljZWQgYXMgc2lkZQorKgllZmZlY3Qgb2YgdGhlIFMvVyBTdXBwb3J0IHJlZ2lzdGVyIGNoZWNrLgorKjI6CWNoZWNrIHdoZXRoZXIgdGhlIHByZWNlZGluZyBjb21tYW5kIHNraXBwZWQgdGhlIGJ1c3kgd2FpdCBhbmQgaWYgc28sIGNoZWNrIGZvciBjb21tYW5kIGNvbXBsZXRpb24KKyoKKyouTk9USUNFCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitIQ0ZfU1RBVElDIGludAorY21kX2V4ZSggSUZCUCBpZmJwLCBoY2ZfMTYgY21kX2NvZGUsIGhjZl8xNiBwYXJfMCApCS8vaWYgSENNRF9CVVNZIG9mIGNtZF9jb2RlIHNldCwgdGhlbiBkbyBOT1Qgd2FpdCBmb3IgY29tcGxldGlvbgoreworaW50IHJjOworCisJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9DTURfRVhFLCBjbWRfY29kZSApCisJSENGQVNTRVJUKCAoY21kX2NvZGUgJiBIQ01EX0NNRF9DT0RFKSAhPSBIQ01EX1RYIHx8IGNtZF9jb2RlICYgSENNRF9CVVNZLCBjbWRfY29kZSApIC8vVHggbXVzdCBoYXZlIEJ1c3kgYml0IHNldAorCU9QVyggSFJFR19TV18wLCBIQ0ZfTUFHSUMgKTsKKwlpZiAoIElQVyggSFJFR19TV18wICkgPT0gSENGX01BR0lDICkgewkJCQkJCQkJCQkJCQkJLyogMSAqLworCQlyYyA9IGlmYnAtPklGQl9EZWZ1bmN0U3RhdDsKKwl9CisJZWxzZSByYyA9IEhDRl9FUlJfTk9fTklDOworCWlmICggcmMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCS8vOz9pcyB0aGlzIGEgaG90IGlkZWEsIGJldHRlciBNRUFTVVJFIHBlcmZvcm1hbmNlIGltcGFjdAorLyoyKi8JaWYgKCBpZmJwLT5JRkJfQ21kICYgSENNRF9CVVNZICkgeworCQkJcmMgPSBjbWRfY21wbCggaWZicCApOworCQl9CisJCU9QVyggSFJFR19QQVJBTV8wLCBwYXJfMCApOworCQlPUFcoIEhSRUdfQ01ELCBjbWRfY29kZSAmfkhDTURfQlVTWSApOworCQlpZmJwLT5JRkJfQ21kID0gY21kX2NvZGU7CisJCWlmICggKGNtZF9jb2RlICYgSENNRF9CVVNZKSA9PSAwICkgewkvLzs/aXMgdGhpcyBhIGhvdCBpZGVhLCBiZXR0ZXIgTUVBU1VSRSBwZXJmb3JtYW5jZSBpbXBhY3QKKwkJCXJjID0gY21kX2NtcGwoIGlmYnAgKTsKKwkJfQorCX0KKwlIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCBNRVJHRV8yKCByYywgY21kX2NvZGUgKSApCisJSENGTE9HRVhJVCggSENGX1RSQUNFX0NNRF9FWEUgKQorCXJldHVybiByYzsKK30gLy8gY21kX2V4ZQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouU1VCTU9EVUxFCQlpbnQgZG93bmxvYWQoIElGQlAgaWZicCwgQ0ZHX1BST0dfU1RSQ1QgRkFSICpsdHZwICkKKyouUFVSUE9TRQkJZG93bmxvYWRzIEYvVyBpbWFnZSBpbnRvIE5JQyBhbmQgaW5pdGlhdGVzIGV4ZWN1dGlvbiBvZiB0aGUgZG93bmxvYWRlZCBGL1cuCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoJbHR2cAkJc3BlY2lmaWVzIHRoZSBwc2V1ZG8tUklEIChhcyBkZWZpbmVkIGJ5IFdDSSkKKyoKKyouUkVUVVJOUworKgorKi5ERVNDUklQVElPTgorKgorKgorKi5ESUFHUkFNCisqMToJRmlyc3QsIEFjayBldmVyeXRoaW5nIHRvIHVuYmxvY2sgYSAocG9zc2libHkpIGJsb2NrZWQgY21kIHBpcGUgbGluZQorKglOb3RlIDE6IGl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgYW4gQWxsb2MgZXZlbnQgaXMgcGVuZGluZyBhbmQgdmVyeSB3ZWxsIHBvc3NpYmxlIHRoYXQgYSAoU2VuZCkgQ21kIGV2ZW50IGlzCisqCXBlbmRpbmcKKyoJTm90ZSAyOiBpdCBpcyBhc3N1bWVkIHRoYXQgdGhpcyBzdHJhdGVneSB0YWtlcyBhd2F5IHRoZSBuZWVkIHRvIGFjayBldmVyeSBjb25jZWl2YWJsZSBldmVudCBhZnRlciBhbgorKglIZXJtZXMgSW5pdGlhbGl6ZQorKgorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgaW50Citkb3dubG9hZCggSUZCUCBpZmJwLCBDRkdfUFJPR19TVFJDVCBGQVIgKmx0dnAgKQkJCQkJCS8vSGVybWVzLUlJIGRvd25sb2FkICh2b2xhdGlsZSBvbmx5KQoreworaGNmXzE2CQkJCWk7CitpbnQJCQkJCXJjID0gSENGX1NVQ0NFU1M7Cit3Y2lfYnVmcAkJCWNwOworaGNmX2lvCQkJCWlvX3BvcnQgPSBpZmJwLT5JRkJfSU9CYXNlICsgSFJFR19BVVhfREFUQTsKKworCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfREwsIGx0dnAtPnR5cCApCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1BSRUxPQURFRAorCUhDRkFTU0VSVCggRE9fQVNTRVJULCBsdHZwLT5tb2RlICkKKyNlbHNlCisJCQkJCQkJCQkJCQkJLy9pZiBpbml0aWFsICJwcm9ncmFtIiBMVFYKKwlpZiAoIGlmYnAtPklGQl9ETE1vZGUgPT0gQ0ZHX1BST0dfU1RPUCAmJiBsdHZwLT5tb2RlID09IENGR19QUk9HX1ZPTEFUSUxFKSB7CisJCQkJCQkJCQkJCQkJLy8uICBzd2l0Y2ggSGVybWVzIHRvIGluaXRpYWwgbW9kZQorLyoxKi8JT1BXKCBIUkVHX0VWX0FDSywgfkhSRUdfRVZfU0xFRVBfUkVRICk7CisJCXJjID0gY21kX2V4ZSggaWZicCwgSENNRF9JTkksIDAgKTsJLyogSENNRF9JTkkgY2FuIG5vdCBiZSBwYXJ0IG9mIGluaXQoKSBiZWNhdXNlIHRoYXQgaXMgY2FsbGVkIG9uCisJCQkJCQkJCQkJCSAqIG90aGVyIG9jY2FzaW9ucyBhcyB3ZWxsICovCisJCXJjID0gaW5pdCggaWZicCApOworCX0KKwkJCQkJCQkJCQkJCQkvL2lmIGZpbmFsICJwcm9ncmFtIiBMVFYKKwlpZiAoIGx0dnAtPm1vZGUgPT0gQ0ZHX1BST0dfU1RPUCAmJiBpZmJwLT5JRkJfRExNb2RlID09IENGR19QUk9HX1ZPTEFUSUxFKSB7CisJCQkJCQkJCQkJCQkJLy8uICBzdGFydCB0ZXJ0aWFyeSAob3Igc2Vjb25kYXJ5KQorCQlPUFcoIEhSRUdfUEFSQU1fMSwgKGhjZl8xNikobHR2cC0+bmljX2FkZHIgPj4gMTYpICk7CisJCXJjID0gY21kX2V4ZSggaWZicCwgSENNRF9FWEVDVVRFLCAoaGNmXzE2KSBsdHZwLT5uaWNfYWRkciApOworCQlpZiAocmMgPT0gSENGX1NVQ0NFU1MpIHsKKwkJCXJjID0gaW5pdCggaWZicCApOwkvKjs/IGRvIHdlIHJlYWxseSB3YW50IHRvIHNraXAgaW5pdCBpZiBjbWRfZXhlIGZhaWxlZCwgaS5lLgorCQkJCQkJCQkgKgkgSUZCX0ZXX0NvbXBfSWQgaXMgdGhhbiBwb3NzaWJseSBpbmNvcnJlY3QgKi8KKwkgIAl9CisJCQkJCQkJCQkJCQkJLy9lbHNlIChub24tZmluYWwpCisJfSBlbHNlIHsKKwkJCQkJCQkJCQkJCQkvLy4gIGlmIG1vZGUgPT0gUmVhZGJhY2sgU0VFUFJPTQorI2lmIDAJLy87PyBhcyBsb25nIGFzIHRoZSBuZXh0IGlmIGNvbnRhaW5zIGEgaGFyZCBjb2RlZCAwLCBtaWdodCBhcyB3ZWxsIGxlYXZlIGl0IG91dCBldmVuIG1vcmUgb2J2aW91cworCQlpZiAoIDAgLypsZW4gaXMgZGVmaW5pdGVseSBub3Qgd2FudCB3ZSB3YW50Oz8qLyAmJiBsdHZwLT5tb2RlID09IENGR19QUk9HX1NFRVBST01fUkVBREJBQ0sgKSB7CisJCQlPUFcoIEhSRUdfUEFSQU1fMSwgKGhjZl8xNikobHR2cC0+bmljX2FkZHIgPj4gMTYpICk7CisJCQlPUFcoIEhSRUdfUEFSQU1fMiwgTVVMX0JZXzIobHR2cC0+bGVuIC0gNCkpOworCQkJCQkJCQkJCQkJCS8vLiAgLiAgcGVyZm9ybSBIZXJtZXMgcHJvZyBjbWQgd2l0aCBhcHByb3ByaWF0ZSBtb2RlIGJpdHMKKwkJCXJjID0gY21kX2V4ZSggaWZicCwgSENNRF9QUk9HUkFNIHwgbHR2cC0+bW9kZSwgKGhjZl8xNilsdHZwLT5uaWNfYWRkciApOworCQkJCQkJCQkJCQkJCS8vLiAgLiAgc2V0IHVwIE5JQyBSQU0gYWRkcmVzc2FiaWxpdHkgYWNjb3JkaW5nIFJlc3AwLTEKKwkJCU9QVyggSFJFR19BVVhfUEFHRSwgICBJUFcoIEhSRUdfUkVTUF8xKSApOworCQkJT1BXKCBIUkVHX0FVWF9PRkZTRVQsIElQVyggSFJFR19SRVNQXzApICk7CisJCQkJCQkJCQkJCQkJLy8uICAuICBzZXQgdXAgTC1maWVsZCBvZiBMVFYgYWNjb3JkaW5nIFJlc3AyCisJCQlpID0gKCBJUFcoIEhSRUdfUkVTUF8yICkgKyAxICkgLyAyOyAgLy8gaSBjb250YWlucyBtYXggYnVmZmVyIHNpemUgaW4gd29yZHMsIGEgcHJvYmFibHkgbm90IHZlcnkgdXNlZnVsIHBpZWNlIG9mIGluZm9ybWF0aW9uIDs/CisvKk5pY28ncyBjb2RlIGJhc2VkIG9uIGkgaXMgdGhlICJyZWFsIGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZSIKKwkJCWlmICggbHR2cC0+bGVuIC0gNCA8IGkgKSByYyA9IEhDRl9FUlJfTEVOOworCQkJZWxzZSBsdHZwLT5sZW4gPSBpICsgNDsKKyovCisvKiBSb2xhbmRzIGNvZGUgYmFzZWQgb24gdGhlIGlkZWEgdGhhdCBhIE1TRiBzaG91bGQgbm90IGFzayBmb3IgbW9yZSB0aGFuIGlzIGF2YWlsYWJsZQorCQkJLy8gY2hlY2sgaWYgbnVtYmVyIG9mIGJ5dGVzIHJlcXVlc3RlZCBleGNlZWRzIG1heCBidWZmZXIgc2l6ZQorCQkJaWYgKCBsdHZwLT5sZW4gLSA0ID4gaSApIHsKKwkJCQlyYyA9IEhDRl9FUlJfTEVOOworCQkJCWx0dnAtPmxlbiA9IGkgKyA0OworCQkJfQorKi8KKwkJCQkJCQkJCQkJCQkvLy4gIC4gIGNvcHkgZGF0YSBmcm9tIE5JQyB2aWEgQVVYIHBvcnQgdG8gTFRWCisJCQljcCA9ICh3Y2lfYnVmcClsdHZwLT5ob3N0X2FkZHI7CQkJCQkJLypJTl9QT1JUX1NUUklOR184XzE2IG1hY3JvIG1heSBtb2RpZnkgaXRzIHBhcmFtZXRlcnMqLworCQkJaSA9IGx0dnAtPmxlbiAtIDQ7CisJCQlJTl9QT1JUX1NUUklOR184XzE2KCBpb19wb3J0LCBjcCwgaSApOwkJLy8hISFXT1JEIGxlbmd0aCwgY3AgTVVTVCBiZSBhIGNoYXIgcG9pbnRlcgkvLyAkJCBjaGFyCisJCQkJCQkJCQkJCQkJLy8uICBlbHNlIChub24tZmluYWwgcHJvZ3JhbW1pbmcpCisJCX0gZWxzZQorI2VuZGlmIC8vOz8gYXMgbG9uZyBhcyB0aGUgYWJvdmUgaWYgY29udGFpbnMgYSBoYXJkIGNvZGVkIDAsIG1pZ2h0IGFzIHdlbGwgbGVhdmUgaXQgb3V0IGV2ZW4gbW9yZSBvYnZpb3VzCisJCXsJCQkJCQkJCQkJCS8vLiAgLiAgZ2V0IG51bWJlciBvZiB3b3JkcyB0byBwcm9ncmFtCisJCQlIQ0ZBU1NFUlQoIGx0dnAtPnNlZ21lbnRfc2l6ZSwgKmx0dnAtPmhvc3RfYWRkciApCisJCQlpID0gbHR2cC0+c2VnbWVudF9zaXplLzI7CisJCQkJCQkJCQkJCQkJLy8uICAuICBjb3B5IGRhdGEgKHdvcmRzKSBmcm9tIExUViB2aWEgQVVYIHBvcnQgdG8gTklDCisJCQljcCA9ICh3Y2lfYnVmcClsdHZwLT5ob3N0X2FkZHI7CQkJCQkJLy9PVVRfUE9SVF9TVFJJTkdfOF8xNiBtYWNybyBtYXkgbW9kaWZ5IGl0cyBwYXJhbWV0ZXJzCisJCQkJCQkJCQkJCQkJLy8uICAuICBpZiBtb2RlID09IHZvbGF0aWxlIHByb2dyYW1taW5nCisJCQlpZiAoIGx0dnAtPm1vZGUgPT0gQ0ZHX1BST0dfVk9MQVRJTEUgKSB7CisJCQkJCQkJCQkJCQkJLy8uICAuICAuICBzZXQgdXAgTklDIFJBTSBhZGRyZXNzYWJpbGl0eSB2aWEgQVVYIHBvcnQKKwkJCQlPUFcoIEhSRUdfQVVYX1BBR0UsIChoY2ZfMTYpKGx0dnAtPm5pY19hZGRyID4+IDE2IDw8IDkgfCAobHR2cC0+bmljX2FkZHIgJiAweEZGRkYpID4+IDcgKSApOworCQkJCU9QVyggSFJFR19BVVhfT0ZGU0VULCAoaGNmXzE2KShsdHZwLT5uaWNfYWRkciAmIDB4MDA3RSkgKTsKKwkJCQlPVVRfUE9SVF9TVFJJTkdfOF8xNiggaW9fcG9ydCwgY3AsIGkgKTsJCS8vISEhV09SRCBsZW5ndGgsIGNwIE1VU1QgYmUgYSBjaGFyIHBvaW50ZXIKKwkJCX0KKwkJfQorCX0KKwlpZmJwLT5JRkJfRExNb2RlID0gbHR2cC0+bW9kZTsJCQkJCS8vc2F2ZSBzdGF0ZSBpbiBJRkJfRExNb2RlCisjZW5kaWYgLy8gSENGX1RZUEVfUFJFTE9BREVECisJSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQorCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9ETCApCisJcmV0dXJuIHJjOworfSAvLyBkb3dubG9hZAorCisKKyNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX1BSSU5URgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENlcnRhaW4gSGVybWVzLUlJIGZpcm13YXJlIHZlcnNpb25zIGNhbiBnZW5lcmF0ZQorKiBkZWJ1ZyBpbmZvcm1hdGlvbi4gVGhpcyBkZWJ1ZyBpbmZvcm1hdGlvbiBpcworKiBjb250YWluZWQgaW4gYSBidWZmZXIgaW4gbmljLVJBTSwgYW5kIGNhbiBiZSByZWFkCisqIHZpYSB0aGUgYXV4IHBvcnQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgaW50Citmd19wcmludGYoSUZCUCBpZmJwLCBDRkdfRldfUFJJTlRGX1NUUkNUIEZBUiAqbHR2cCkKK3sKKyAgICBpbnQgcmMgPSBIQ0ZfU1VDQ0VTUzsKKyAgICBoY2ZfMTYgZndfY250OworLy8gICAgaGNmXzMyIERiTXNnQnVmZmVyID0gMHgyOUQyLCBEYk1zZ0NvdW50PSAweDAwMDAyOUQwOworLy8gICAgaGNmXzE2IERiTXNnU2l6ZT0weDAwMDAwMDgwOworICAgIGhjZl8zMiBEYk1zZ0J1ZmZlcjsKKyAgICBDRkdfRldfUFJJTlRGX0JVRkZFUl9MT0NBVElPTl9TVFJDVCAqcCA9ICZpZmJwLT5JRkJfRndQZkJ1ZmY7CisgICAgbHR2cC0+bGVuID0gMTsKKyAgICBpZiAoIHAtPkRiTXNnU2l6ZSAhPSAwICkgeworICAgICAgICAvLyBmaXJzdCwgY2hlY2sgdGhlIGNvdW50ZXIgaW4gbmljLVJBTSBhbmQgY29tcGFyZSBpdCB0byB0aGUgbGF0ZXN0IGNvdW50ZXIgdmFsdWUgb2YgdGhlIEhDRgorICAgICAgICBPUFcoIEhSRUdfQVVYX1BBR0UsIChoY2ZfMTYpKHAtPkRiTXNnQ291bnQgPj4gNykgKTsKKyAgICAgICAgT1BXKCBIUkVHX0FVWF9PRkZTRVQsIChoY2ZfMTYpKHAtPkRiTXNnQ291bnQgJiAweDdFKSApOworICAgICAgICBmd19jbnQgPSAoKElQVyggSFJFR19BVVhfREFUQSkgPj4xICkgJiAoKGhjZl8xNilwLT5EYk1zZ1NpemUgLSAxKSk7CisgICAgICAgIGlmICggZndfY250ICE9IGlmYnAtPklGQl9EYmdQcmludEZfQ250ICkgeworLy8gICAgRGJnUHJpbnQoImZ3X2NudD0lZCBJRkJfRGJnUHJpbnRGX0NudD0lZFxuIiwgZndfY250LCBpZmJwLT5JRkJfRGJnUHJpbnRGX0NudCk7CisgICAgICAgICAgICBEYk1zZ0J1ZmZlciA9IHAtPkRiTXNnQnVmZmVyICsgaWZicC0+SUZCX0RiZ1ByaW50Rl9DbnQgKiA2OyAvLyBlYWNoIGVudHJ5IGlzIDMgd29yZHMKKyAgICAgICAgICAgIE9QVyggSFJFR19BVVhfUEFHRSwgKGhjZl8xNikoRGJNc2dCdWZmZXIgPj4gNykgKTsKKyAgICAgICAgICAgIE9QVyggSFJFR19BVVhfT0ZGU0VULCAoaGNmXzE2KShEYk1zZ0J1ZmZlciAmIDB4N0UpICk7CisgICAgICAgICAgICBsdHZwLT5tc2dfaWQgICAgID0gSVBXKEhSRUdfQVVYX0RBVEEpOworICAgICAgICAgICAgbHR2cC0+bXNnX3BhciAgICA9IElQVyhIUkVHX0FVWF9EQVRBKTsKKyAgICAgICAgICAgIGx0dnAtPm1zZ190c3RhbXAgPSBJUFcoSFJFR19BVVhfREFUQSk7CisgICAgICAgICAgICBsdHZwLT5sZW4gPSA0OworICAgICAgICAgICAgaWZicC0+SUZCX0RiZ1ByaW50Rl9DbnQrKzsKKyAgICAgICAgICAgIGlmYnAtPklGQl9EYmdQcmludEZfQ250ICY9IChwLT5EYk1zZ1NpemUgLSAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmM7Cit9OworI2VuZGlmIC8vIEhDRl9BU1NFUlRfUFJJTlRGCisKKworI2lmIChIQ0ZfRExfT05MWSkgPT0gMAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5TVUJNT0RVTEUJCWhjZl8xNiBnZXRfZmlkKCBJRkJQIGlmYnAgKQorKi5QVVJQT1NFCQlnZXQgYWxsb2NhdGVkIEZJRCBmb3IgZWl0aGVyIHRyYW5zbWl0IG9yIG5vdGlmeS4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKgorKi5SRVRVUk5TCisqCTAJbm8gRklEIGF2YWlsYWJsZQorKgk8PjAJRklEIG51bWJlcgorKgorKi5ERVNDUklQVElPTgorKgorKgorKi5ESUFHUkFNCisqCVRoZSBwcmVmZXJlbmNlIGlzIHRvIHVzZSBhICJwZW5kaW5nIiBhbGxvYy4gSWYgbm8gYWxsb2MgaXMgcGVuZGluZywgdGhlbiAtIGlmIGF2YWlsYWJsZSAtIHRoZSAic3BhcmUiIEZJRAorKglpcyB1c2VkLgorKglJZiB0aGUgc3BhcmUgRklEIGlzIHVzZWQsIElGQl9Sc2NJbmQgKHJlcHJlc2VudGluZyB0aGUgc3BhcmUgRklEKSBtdXN0IGJlIGNsZWFyZWQKKyoJSWYgdGhlIHBlbmRpbmcgYWxsb2MgaXMgdXNlZCwgdGhlIGFsbG9jIGV2ZW50IG11c3QgYmUgYWNrbm93bGVkZ2VkIHRvIHRoZSBIZXJtZXMuCisqCUluIGNhc2UgdGhlIHNwYXJlIEZJRCB3YXMgZGVwbGV0ZWQgYW5kIHRoZSBJRkJfUnNjSW5kIGhhcyBiZWVuICJmYWtlZCIgYXMgcHNldWRvIHJlc291cmNlIHdpdGggYSAweDAwMDEKKyoJdmFsdWUgYnkgaGNmX3NlcnZpY2VfbmljLCBJRkJfUnNjSW5kIGhhcyB0byBiZSAiY29ycmVjdGVkIiBhZ2FpbiB0byBpdHMgMHgwMDAwIHZhbHVlLgorKgorKglOb3RlIHRoYXQgZHVlIHRvIHRoZSBIZXJtZXMtSUkgSC9XIHByb2JsZW1zIHdoaWNoIGFyZSBpbnRlbmRlZCB0byBiZSB3b3JrZWQgYXJvdW5kIGJ5IERBV0EsIHRoZSBBbGxvYyBiaXQKKyoJaW4gdGhlIEV2ZW50IHJlZ2lzdGVyIGlzIG5vIGxvbmdlciBhIHJlbGlhYmxlIGluZGljYXRpb24gb2YgdGhlIHByZXNlbmNlL2Fic2VuY2Ugb2YgYSBGSUQuIFRoZSAiQ2xlYXIgRklEIgorKglwYXJ0IG9mIHRoZSBEQVdBIGxvZ2ljLCB0b2dldGhlciB3aXRoIHRoZSBjaG9pY2Ugb2YgdGhlIGRlZmluaXRpb24gb2YgdGhlIHJldHVybiBpbmZvcm1hdGlvbiBmcm9tIGdldF9maWQsCisqCWhhbmRsZSB0aGlzIGF1dG9tYXRpY2FsbHksIGkuZS4gd2l0aG91dCBhZGRpdGlvbmFsIGNvZGUgaW4gZ2V0X2ZpZC4KKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQ0ZfU1RBVElDIGhjZl8xNgorZ2V0X2ZpZCggSUZCUCBpZmJwICkKK3sKKworaGNmXzE2IGZpZCA9IDA7CisjaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNSApID09IDAKK1BST1RfQ05UX0lOSQorI2VuZGlmIC8vIEhDRl9UWVBFX0hJSTUKKworCUlGX0RNQSggSENGQVNTRVJUKCEoaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BKSwgaWZicC0+SUZCX0NudGxPcHQpICkKKworCWlmICggSVBXKCBIUkVHX0VWX1NUQVQpICYgSFJFR19FVl9BTExPQykgeworCQlmaWQgPSBJUFcoIEhSRUdfQUxMT0NfRklEICk7CisJCUhDRkFTU0VSVCggZmlkLCBpZmJwLT5JRkJfUnNjSW5kICkKKwkJREFXQV9aRVJPX0ZJRCggSFJFR19BTExPQ19GSUQgKQorI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUgKSA9PSAwCisJCUhDRl9XQUlUX1dISUxFKCAoIElQVyggSFJFR19FVl9TVEFUICkgJiBIUkVHX0VWX0FDS19SRUdfUkVBRFkgKSA9PSAwICk7CisJCUhDRkFTU0VSVCggcHJvdF9jbnQsIElQVyggSFJFR19FVl9TVEFUICkgKQorI2VuZGlmIC8vIEhDRl9UWVBFX0hJSTUKKwkJREFXQV9BQ0soIEhSRUdfRVZfQUxMT0MgKTsJCQkvLyEhbm90ZSB0aGF0IEhSRUdfRVZfQUxMT0MgaXMgd3JpdHRlbiBvbmx5IG9uY2UKKy8vIDE4MCBkZWdyZWUgZXJyb3IgaW4gbG9naWMgOz8gI2lmIEFMTE9DXzE1CisJCWlmICggaWZicC0+SUZCX1JzY0luZCA9PSAxICkgeworCQkJaWZicC0+SUZCX1JzY0luZCA9IDA7CisJCX0KKy8vI2VuZGlmIC8vIEFMTE9DXzE1CisJfSBlbHNlIHsKKy8vIDE4MCBkZWdyZWUgZXJyb3IgaW4gbG9naWMgOz8gI2lmIEFMTE9DXzE1CisJCWZpZCA9IGlmYnAtPklGQl9Sc2NJbmQ7CisvLyNlbmRpZiAvLyBBTExPQ18xNQorCQlpZmJwLT5JRkJfUnNjSW5kID0gMDsKKwl9CisJcmV0dXJuIGZpZDsKK30gLy8gZ2V0X2ZpZAorI2VuZGlmIC8vIEhDRl9ETF9PTkxZCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5TVUJNT0RVTEUJCXZvaWQgZ2V0X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgaW50IGxlbiBCRV9QQVIoIGludCB3b3JkX2xlbiApICkKKyouUFVSUE9TRQkJcmVhZHMgd2l0aCAxNi8zMiBiaXQgSS9PIHZpYSBCQVAxIHBvcnQgZnJvbSBOSUMgUkFNIHRvIEhvc3QgbWVtb3J5LgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCWJ1ZnAJCShieXRlKSBhZGRyZXNzIG9mIGJ1ZmZlcgorKglsZW4JCQlsZW5ndGggaW4gYnl0ZXMgb2YgYnVmZmVyIHNwZWNpZmllZCBieSBidWZwCisqCXdvcmRfbGVuCUJpZyBFbmRpYW4gb25seTogbnVtYmVyIG9mIGxlYWRpbmcgYnl0ZXMgdG8gc3dhcCBpbiBwYWlycworKgorKi5SRVRVUk5TCQlOLkEuCisqCisqLkRFU0NSSVBUSU9OCisqIHByb2Nlc3MgdGhlIHNpbmdsZSBieXRlIChpZiBhcHBsaWNhYmxlKSByZWFkIGJ5IHRoZSBwcmV2aW91cyBnZXRfZnJhZyBhbmQgY29weSBsZW4gKG9yIGxlbi0xKSBieXRlcyBmcm9tCisqIE5JQyB0byBidWZwLgorKiBPbiBhIEJpZyBFbmRpYW4gcGxhdGZvcm0sIHRoZSBwYXJhbWV0ZXIgd29yZF9sZW4gY29udHJvbHMgdGhlIG51bWJlciBvZiBsZWFkaW5nIGJ5dGVzIHdob3NlIGVuZGlhbmVzcyBpcworKiBjb252ZXJ0ZWQgKGkuZS4gYnl0ZSBzd2FwcGVkKQorKgorKgorKi5ESUFHUkFNCisqMTA6IFRoZSBQQ01DSUEgY2FyZCBjYW4gYmUgcmVtb3ZlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSB0cmFuc2Zlci4gQnkgZGVwb3NpdGluZyBhICJtYWdpYyBudW1iZXIiIGluIHRoZQorKglIUkVHX1NXXzAgcmVnaXN0ZXIgb2YgdGhlIEhlcm1lcyBhdCBpbml0aWFsaXphdGlvbiB0aW1lIGFuZCBieSB2ZXJpZnlpbmcgdGhpcyByZWdpc3RlciwgaXQgY2FuIGJlCisqCWRldGVybWluZWQgd2hldGhlciB0aGUgY2FyZCBpcyBzdGlsbCBwcmVzZW50LiBUaGUgcmV0dXJuIHN0YXR1cyBpcyBzZXQgYWNjb3JkaW5nbHkuCisqCUNsZWFyaW5nIHRoZSBidWZmZXIgaXMgYSAocmVsYXRpdmUpIGNoZWFwIHdheSB0byBwcmV2ZW50IHRoYXQgZmFpbGluZyBJL08gcmVzdWx0cyBpbiBydW4tYXdheSBiZWhhdmlvcgorKgliZWNhdXNlIHRoZSBnYXJiYWdlIGluIHRoZSBidWZmZXIgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlIGNhbGxlciBpcnJlc3BlY3RpdmUgb2YgdGhlIHJldHVybiBzdGF0dXMgKGUuZy4KKyoJaGNmX3NlcnZpY2VfbmljIGhhcyB0aGlzIGJlaGF2aW9yKS4KKyoKKyouTk9USUNFCisqCUl0IHR1cm5zIG91dCBET1MgT0RJIHVzZXMgemVybyBsZW5ndGggZnJhZ21lbnRzLiBUaGUgSENGIGNvZGUgY2FuIGNvcGUgd2l0aCBpdCwgYnV0IGFzIGEgY29uc2VxdWVuY2UsIG5vCisqCUFzc2VydCBvbiBsZW4gaXMgcG9zc2libGUKKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQ0ZfU1RBVElDIHZvaWQKK2dldF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIGludCBsZW4gQkVfUEFSKCBpbnQgd29yZF9sZW4gKSApCit7CitoY2ZfaW8JCWlvX3BvcnQgPSBpZmJwLT5JRkJfSU9CYXNlICsgSFJFR19EQVRBXzE7CS8vQkFQIGRhdGEgcmVnaXN0ZXIKK3djaV9idWZwCXAgPSBidWZwOwkJCQkJCQkJCS8vd29ya2luZyBwb2ludGVyCitpbnQJCQlpOwkJCQkJCQkJCQkJLy9wcmV2ZW50IHNpZGUgZWZmZWN0cyBmcm9tIG1hY3JvCitpbnQJCQlqOworCisJSENGQVNTRVJUKCAoKGhjZl8zMilidWZwICYgKEhDRl9BTElHTi0xKSApID09IDAsIChoY2ZfMzIpYnVmcCApCisKKy8qMToJaGVyZSByZWNvdmVyeSBsb2dpYyBmb3IgaW50ZXJ2ZW5pbmcgQkFQIGFjY2VzcyBiZXR3ZWVuIGhjZl9zZXJ2aWNlX25pYyBhbmQgaGNmX3Jjdl9tc2cgQ09VTEQgYmUgYWRkZWQKKyAqIAlpZiBjdXJyZW50IGFjY2VzcyBpcyBSeEluaXRpYWwKKyAqIAkuICBwZXJzaXN0ZW50X29mZnNldCArPSBsZW4KKyAqLworCisJaSA9IGxlbjsKKwkJCQkJCQkJCQkJCQkvL2lmIGJ1ZmZlciBsZW5ndGggPiAwIGFuZCBjYXJyeSBmcm9tIHByZXZpb3VzIGdldF9mcmFnCisJaWYgKCBpICYmIGlmYnAtPklGQl9DYXJyeUluICkgeworCQkJCQkJCQkJCQkJCS8vLiAgbW92ZSBjYXJyeSB0byBidWZmZXIKKwkJCQkJCQkJCQkJCQkvLy4gIGFkanVzdCBidWZmZXIgbGVuZ3RoIGFuZCBwb2ludGVyIGFjY29yZGluZ2x5CisJCSpwKysgPSAoaGNmXzgpKGlmYnAtPklGQl9DYXJyeUluPj44KTsKKwkJaS0tOworCQkJCQkJCQkJCQkJCS8vLiAgY2xlYXIgY2FycnkgZmxhZworCQlpZmJwLT5JRkJfQ2FycnlJbiA9IDA7CisJfQorI2lmIChIQ0ZfSU8pICYgSENGX0lPXzMyQklUUworCS8vc2tpcCB6ZXJvLWxlbmd0aCBJL08sIHNpbmdsZSBieXRlIEkvTyBhbmQgSS9PIG5vdCB3b3J0aHdoaWxlIChpLmUuIGxlc3MgdGhhbiA2IGJ5dGVzKWZvciBEVyBsb2dpYworCQkJCQkJCQkJCQkJCS8vaWYgYnVmZmVyIGxlbmd0aCA+PSA2IGFuZCAzMiBiaXRzIEkvTyBzdXBwb3J0CisJaWYgKCAhKGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFXzE2QklUKSAmJiBpID49IDYgKSB7CitoY2ZfMzIgRkFSCSpwNDsgLy9wcmV2ZW50IHNpZGUgZWZmZWN0cyBmcm9tIG1hY3JvCisJCWlmICggKCAoaGNmXzMyKXAgJiAweDEgKSA9PSAwICkgewkJCS8vLiAgaWYgYnVmZmVyIGF0IGxlYXN0IHdvcmQgYWxpZ25lZAorCQkJaWYgKCAoaGNmXzMyKXAgJiAweDIgKSB7CQkJCS8vLiAgLiAgaWYgYnVmZmVyIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCisJCQkJCQkJCQkJCQkJLy8uICAuICAuICByZWFkIHNpbmdsZSB3b3JkIHRvIGdldCBkb3VibGUgd29yZCBhbGlnbmVkCisJCQkJKih3Y2lfcmVjb3JkcClwID0gSU5fUE9SVF9XT1JEKCBpb19wb3J0ICk7CisJCQkJCQkJCQkJCQkJLy8uICAuICAuICBhZGp1c3QgYnVmZmVyIGxlbmd0aCBhbmQgcG9pbnRlciBhY2NvcmRpbmdseQorCQkJCXAgKz0gMjsKKwkJCQlpIC09IDI7CisJCQl9CisJCQkJCQkJCQkJCQkJLy8uICAuICByZWFkIGFzIG1hbnkgZG91YmxlIHdvcmQgYXMgcG9zc2libGUKKwkJCXA0ID0gKGhjZl8zMiBGQVIgKilwOworCQkJaiA9IGkvNDsKKwkJCUlOX1BPUlRfU1RSSU5HXzMyKCBpb19wb3J0LCBwNCwgaiApOworCQkJCQkJCQkJCQkJCS8vLiAgLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKKwkJCXAgKz0gaSAmIH4weDAwMDM7CisJCQlpICY9IDB4MDAwMzsKKwkJfQorCX0KKyNlbmRpZiAvLyBIQ0ZfSU9fMzJCSVRTCisJCQkJCQkJCQkJCQkJLy9pZiBubyAzMi1iaXQgc3VwcG9ydCBPUiBieXRlIGFsaWduZWQgT1IgMS0zIGJ5dGVzIGxlZnQKKwlpZiAoIGkgKSB7CisJCQkJCQkJCQkJCQkJLy8uICByZWFkIGFzIG1hbnkgd29yZCBhcyBwb3NzaWJsZSBpbiAiYWxpZ25tZW50IHNhZmUiIHdheQorCQlqID0gaS8yOworCQlJTl9QT1JUX1NUUklOR184XzE2KCBpb19wb3J0LCBwLCBqICk7CisJCQkJCQkJCQkJCQkJLy8uICBpZiAxIGJ5dGUgbGVmdAorCQlpZiAoIGkgJiAweDAwMDEgKSB7CisJCQkJCQkJCQkJCQkJLy8uICAuICByZWFkIDEgd29yZAorCQkJaWZicC0+SUZCX0NhcnJ5SW4gPSBJTl9QT1JUX1dPUkQoIGlvX3BvcnQgKTsKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIHN0b3JlIExTQiBpbiBsYXN0IGNoYXIgb2YgYnVmZmVyCisJCQlidWZwW2xlbi0xXSA9IChoY2ZfOClpZmJwLT5JRkJfQ2FycnlJbjsKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIHNhdmUgTVNCIGluIGNhcnJ5LCBzZXQgY2FycnkgZmxhZworCQkJaWZicC0+SUZCX0NhcnJ5SW4gfD0gMHgxOworCQl9CisJfQorI2lmIEhDRl9CSUdfRU5ESUFOCisJSENGQVNTRVJUKCB3b3JkX2xlbiA9PSAwIHx8IHdvcmRfbGVuID09IDIgfHwgd29yZF9sZW4gPT0gNCwgd29yZF9sZW4gKQorCUhDRkFTU0VSVCggd29yZF9sZW4gPT0gMCB8fCAoKGhjZl8zMilidWZwICYgMSApID09IDAsIChoY2ZfMzIpYnVmcCApCisJSENGQVNTRVJUKCB3b3JkX2xlbiA8PSBsZW4sIE1FUkdFMiggd29yZF9sZW4sIGxlbiApICkKKwkvL3NlZSBwdXRfZnJhZyBmb3IgYW4gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24sIGJ1dCBiZSBjYXJlZnVsbCBhYm91dCB3aGF0IGFyZSBpbnQncyBhbmQgd2hhdCBhcmUKKwkvL2hjZl8xNidzCisJaWYgKCB3b3JkX2xlbiApIHsJCQkJCQkJCS8vLiAgaWYgdGhlcmUgaXMgYW55dGhpbmcgdG8gY29udmVydAoraGNmXzggYzsKKwkJYyA9IGJ1ZnBbMV07CQkJCQkJCQkvLy4gIC4gIGNvbnZlcnQgdGhlIDFzdCBoY2ZfMTYKKwkJYnVmcFsxXSA9IGJ1ZnBbMF07CisJCWJ1ZnBbMF0gPSBjOworCQlpZiAoIHdvcmRfbGVuID4gMSApIHsJCQkJCQkvLy4gIC4gIGlmIHRoZXJlIGlzIHRvIGNvbnZlcnQgbW9yZSB0aGFuIDEgd29yZCAoIGkuZSAyICkKKwkJCWMgPSBidWZwWzNdOwkJCQkJCQkvLy4gIC4gIC4gIGNvbnZlcnQgdGhlIDJuZCBoY2ZfMTYKKwkJCWJ1ZnBbM10gPSBidWZwWzJdOworCQkJYnVmcFsyXSA9IGM7CisJCX0KKwl9CisjZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KK30gLy8gZ2V0X2ZyYWcKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5TVUJNT0RVTEUJCWludCBpbml0KCBJRkJQIGlmYnAgKQorKi5QVVJQT1NFCQlIYW5kbGVzIGNvbW1vbiBpbml0aWFsaXphdGlvbiBhc3BlY3RzIChILUkgaW5pdCwgY2FsaWJyYXRpb24sIGNvbmZpZy5tbmdtdCwgYWxsb2NhdGlvbikuCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoKKyouUkVUVVJOUworKglIQ0ZfRVJSX0lOQ09NUF9QUkkKKyoJSENGX0VSUl9JTkNPTVBfRlcKKyoJSENGX0VSUl9USU1FX09VVAorKgk+PmhjZl9nZXRfaW5mbworKgkJSENGX0VSUl9OT19OSUMKKyoJCUhDRl9FUlJfTEVOCisqCisqLkRFU0NSSVBUSU9OCisqIGluaXQgd2lsbCBzdWNjZXNzaXZlbHk6CisqIC0gaW4gY2FzZSBvZiBhIChub24tcHJlbG9hZGVkKSBILUksIGluaXRpYWxpemUgdGhlIE5JQworKiAtIGNhbGlicmF0ZSB0aGUgUy9XIHByb3RlY3Rpb24gdGltZXIgYWdhaW5zdCB0aGUgSGVybWVzIFRpbWVyCisqIC0gY29sbGVjdCBIU0ksICJhY3RpdmUiIEYvVyBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24KKyogLSBpbiBjYXNlIGFjdGl2ZSBGL1cgaXMgUHJpbWFyeSBGL1c6IGNvbGxlY3QgUHJpbWFyeSBGL1cgQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IEluZm9ybWF0aW9uCisqIC0gY2hlY2sgSFNJIGFuZCBQcmltYXJ5IEYvVyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEhDRgorKiAtIGluIGNhc2UgYWN0aXZlIEYvVyBpcyBTdGF0aW9uIG9yIEFQIEYvVzogY2hlY2sgU3RhdGlvbiBvciBBUCBGL1cgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBIQ0YKKyogLSBpbiBjYXNlIGFjdGl2ZSBGL1cgaXMgbm90IFByaW1hcnkgRi9XOiBhbGxvY2F0ZSBGSURzIHRvIGJlIHVzZWQgaW4gdHJhbnNtaXQvbm90aWZ5IHByb2Nlc3MKKyoKKyoKKyouRElBR1JBTQorKjI6CWRyb3AgYWxsIGVycm9yIHN0YXR1cyBiaXRzIGluIElGQl9DYXJkU3RhdCBzaW5jZSB0aGV5IGFyZSBleHBlY3RlZCB0byBiZSByZS1ldmFsdWF0ZWQuCisqNDoJQWNrIGV2ZXJ5dGhpbmcgZXhjZXB0IEhSRUdfRVZfU0xFRVBfUkVRLiBJdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IGFuIEFsbG9jIGV2ZW50IGlzIHBlbmRpbmcgYW5kCisqCXZlcnkgd2VsbCBwb3NzaWJsZSB0aGF0IGEgU2VuZCBDbWQgZXZlbnQgaXMgcGVuZGluZy4gQWNraW5nIEhSRUdfRVZfU0xFRVBfUkVRIGlzIGhhbmRsZWQgYnkgaGNmX2FjdGlvbigKKyoJSENGX0FDVF9JTlRfT04gKSAhISEKKyoxMDogQ2FsaWJyYXRlIHRoZSBTL1cgdGltZS1vdXQgcHJvdGVjdGlvbiBtZWNoYW5pc20gYnkgY2FsbGluZyBjYWxpYnJhdGUoKS4gTm90ZSB0aGF0IHBvc3NpYmxlIGVycm9ycworKglpbiB0aGUgY2FsaWJyYXRpb24gcHJvY2VzcyBhcmUgbm9yIHJlcG9ydGVkIGJ5IGluaXQgYnV0IHdpbGwgc2hvdyB1cCB2aWEgdGhlIGRlZnVuY3QgbWVjaGFuaXNtIGluCisqCXN1YnNlcXVlbnQgaGNmLWNhbGxzLgorKjE0OiB1c2JfY2hlY2tfY29tcCgpIGlzIGNhbGxlZCB0byBoYXZlIHRoZSBtaW5pbWFsIHZpc3VhbCBjbHV0dGVyIGZvciB0aGUgbGVnYWN5IEgtSSBVU0IgZG9uZ2xlCisqCWNvbXBhdGliaWxpdHkgY2hlY2suCisqMTY6IFRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IHJlbGF0ZWQgaW5mb3JtYXRpb24gaXMgcmV0cmlldmVkIGZyb20gdGhlIE5JQzoKKyoJIC0gSFNJIHN1cHBsaWVyCisqCSAtIEYvVyBJZGVudGl0eQorKgkgLSBGL1cgc3VwcGxpZXIKKyoJIGlmIGFwcHJvcHJpYXRlOgorKgkgLSBQUkkgSWRlbnRpdHkKKyoJIC0gUFJJIHN1cHBsaWVyCisqCSBhcHByb3ByaWF0ZSBtZWFucyBvbiBILUk6IGFsd2F5cworKgkgYW5kIG9uIEgtSUkgaWYgRi9XIHN1cHBsaWVyIHJlZmxlY3RzIGEgcHJpbWFyeSAoaS5lLiBvbmx5IGFmdGVyIGFuIEhlcm1lcyBSZXNldCBvciBJbml0CisqCSBjb21tYW5kKS4KKyoJIFFVRVNUSU9OIDs/ICEhISEhISBzaG91bGQsIEZvciBlYWNoIG9mIHRoZSBhYm92ZSBSSURzIHRoZSBFbmRpYW5lc3MgaXMgY29udmVydGVkIHRvIG5hdGl2ZSBFbmRpYW5lc3MuCisqCSBPbmx5IHRoZSByZXR1cm4gY29kZSBvZiB0aGUgZmlyc3QgaGNmX2dldF9pbmZvIGlzIHVzZWQuIEFsbCBoY2ZfZ2V0X2luZm8gY2FsbHMgYXJlIG1hZGUsIHJlZ2FyZGxlc3Mgb2YKKyoJIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdGhlIDFzdCBoY2ZfZ2V0X2luZm8uIFRoZSBhc3N1bXB0aW9ucyBhcmU6CisqCSAgLSBpZiBhbnkgY2FsbCBmYWlscywgdGhleSBhbGwgZmFpbCwgc28gcmVtZW1iZXJpbmcgdGhlIHJlc3VsdCBvZiB0aGUgMXN0IGNhbGwgaXMgYWRlcXVhdGUKKyoJICAtIGEgZmFpbGluZyBjYWxsIHdpbGwgb3ZlcndyaXRlIHRoZSBMLWZpZWxkIHdpdGggYSAweDAwMDAgdmFsdWUsIHdoaWNoIHNlcnZpY2VzIGJvdGggYXMgYW4KKyoJCWVycm9yIGluZGljYXRpb24gZm9yIHRoZSB2YWx1ZXMgY2FjaGVkIGluIHRoZSBJRkIgYXMgbWFraW5nIG1tZF9jaGVja19jb21wIGZhaWwuCisqCSBJbiBjYXNlIG9mIEgtSSwgd2hlbiBnZXR0aW5nIHRoZSBGL1cgaWRlbnRpdHkgZmFpbHMsIHRoZSBGL1cgaXMgYXNzdW1lZCB0byBiZSBILUkgQVAgRi9XIHByZS1kYXRpbmcKKyoJIHZlcnNpb24gOS4wIGFuZCB0aGUgRi9XIElkZW50aXR5IGFuZCBTdXBwbGllciBhcmUgZmFrZWQgYWNjb3JkaW5nbHkuCisqCSBJbiBjYXNlIG9mIEgtSUksIHRoZSBQcmltYXJ5LCBTdGF0aW9uIGFuZCBBUCBJZGVudGl0eSBhcmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgRi9XIElkZW50aXR5LgorKgkgVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgU3VwcGxpZXIgaW5mb3JtYXRpb24uIEFzIGEgY29uc2VxdWVuY2UgdGhlIFBSSSBpbmZvcm1hdGlvbiBjYW4gbm8gbG9uZ2VyIGJlCisqCSByZXRyaWV2ZWQgd2hlbiBhIFRlcnRpYXJ5IHJ1bnMuIFRvIGFjY29tbW9kYXRlIE1TRnMgYW5kIFV0aWxpdGllcyB3aG8gZGVwZW5kIG9uIFBSSSBpbmZvcm1hdGlvbiBiZWluZworKgkgYXZhaWxhYmxlIGF0IGFueSB0aW1lLCB0aGlzIGluZm9ybWF0aW9uIGlzIGNhY2hlZCBpbiB0aGUgSUZCLiBJbiB0aGlzIGNhY2hlIHRoZSBnZW5lcmljICJGL1ciIHZhbHVlIG9mCisqCSB0aGUgdHlwLWZpZWxkcyBpcyBvdmVyd3JpdHRlbiB3aXRoIHRoZSBzcGVjaWZpYyAobGVnYWN5KSAiUFJJIiB2YWx1ZXMuIFRvIGFjdHVhbGx5IHJlLXJvdXRlIHRoZSAobGVnYWN5KQorKgkgUFJJIHJlcXVlc3QgdmlhIGhjZl9nZXRfaW5mbywgdGhlIHh4eHgtdGFibGUgbXVzdCBiZSBzZXQuICBJbiBjYXNlIG9mIEgtSSwgdGhpcyBjYWNoaW5nLCBtb2RpZnlpbmcgYW5kCisqCSByZS1yb3V0aW5nIGlzIG5vdCBuZWVkZWQgYmVjYXVzZSBQUkkgaW5mb3JtYXRpb24gaXMgYWx3YXlzIGF2YWlsYWJsZSBkaXJlY3RseSBmcm9tIHRoZSBOSUMuIEZvcgorKgkgY29uc2lzdGVuY3kgdGhlIGNhY2hpbmcgZmllbGRzIGluIHRoZSBJRkIgYXJlIGZpbGxlZCB3aXRoIHRoZSBQUkkgaW5mb3JtYXRpb24gYW55d2F5LgorKjE4OiBtZGRfY2hlY2tfY29tcCgpIGlzIGNhbGxlZCB0byBjaGVjayB0aGUgU3VwcGxpZXIgVmFyaWFudCBhbmQgUmFuZ2Ugb2YgdGhlIEhvc3QtUy9XIEkvRiAoSFNJKSBhbmQgdGhlCisqCVByaW1hcnkgRmlybXdhcmUgVmFyaWFudCBhbmQgUmFuZ2UgYWdhaW5zdCB0aGUgVG9wIGFuZCBCb3R0b20gbGV2ZWwgc3VwcG9ydGVkIGJ5IHRoaXMgSENGLiAgSWYgZWl0aGVyIG9mCisqCXRoZXNlIHRlc3RzIGZhaWxzLCB0aGUgQ0FSRF9TVEFUX0lOQ09NUF9QUkkgYml0IG9mIElGQl9DYXJkU3RhdCBpcyBzZXQKKyoJTm90ZTogVGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhIHByaW1hcnkgZXhjZXB0IGR1cmluZyBwcm9kdWN0aW9uLCBzbyB0aGlzIG1ha2VzIHRoZSBIQ0YgaW4gaXRzIGN1cnJlbnQgZm9ybQorKgl1bnN1aXRhYmxlIGZvciBtYW51ZmFjdHVyaW5nIHRlc3Qgc3lzdGVtcyBsaWtlIHRoZSBGVFMuIFRoaXMgY2FuIGJlIHJlbWVkaWVkIGJ5IGFuIGFkZGluZyBhIHRlc3QgbGlrZQorKglpZmJwLT5JRkJfUFJJU3VwLmlkID09IENPTVBfSURfUFJJCisqMjA6IEluIGNhc2UgdGhlcmUgaXMgVGVydGlhcnkgRi9XIGFuZCB0aGlzIEYvVyBpcyBTdGF0aW9uIEYvVywgdGhlIFN1cHBsaWVyIFZhcmlhbnQgYW5kIFJhbmdlIG9mIHRoZSBTdGF0aW9uCisqCUZpcm13YXJlIGZ1bmN0aW9uIGFzIHJldHJpZXZlZCBmcm9tIHRoZSBIZXJtZXMgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBUb3AgYW5kIEJvdHRvbSBsZXZlbCBzdXBwb3J0ZWQgYnkKKyoJdGhpcyBIQ0YuCisqCU5vdGU6IDs/IHRoZSB0ZXJ0aWFyeSBGL1cgY29tcGF0aWJpbGl0eSBjaGVja3MgY291bGQgYmUgbW92ZWQgdG8gdGhlIERIRiwgd2hpY2ggYWxyZWFkeSBoYXMgY2hlY2tlZCB0aGUKKyoJQ0ZJIGFuZCBNRkkgY29tcGF0aWJpbGl0eSBvZiB0aGUgaW1hZ2Ugd2l0aCB0aGUgTklDIGJlZm9yZSB0aGUgaW1hZ2Ugd2FzIGRvd25sb2FkZWQuCisqMjg6IEluIGNhc2Ugb2Ygbm9uLVByaW1hcnkgRi9XOiBhbGxvY2F0ZXMgYW5kIGFja25vd2xlZGdlIGEgKFRYIG9yIE5vdGlmeSkgRklEIGFuZCBhbGxvY2F0ZXMgd2l0aG91dAorKglhY2tub3dsZWRnZSBhbm90aGVyIChUWCBvciBOb3RpZnkpIEZJRCAodGhlIHNvLWNhbGxlZCAxLjUgYWxsb2Mgc2NoZW1lKSB3aXRoIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisqCS0gZXhlY3V0ZSB0aGUgYWxsb2NhdGUgY29tbWFuZCBieSBjYWxsaW5nIGNtZF9leGUKKyoJLSB3YWl0IHRpbGwgZWl0aGVyIHRoZSBhbGxvYyBldmVudCBvciBhIHRpbWUtb3V0IG9jY3VycworKgktIHJlZ2FyZGxlc3Mgd2hldGhlciB0aGUgYWxsb2MgZXZlbnQgb2NjdXJzLCBjYWxsIGdldF9maWQgdG8KKyoJICAtIHJlYWQgdGhlIEZJRCBhbmQgc2F2ZSBpdCBpbiBJRkJfUnNjSW5kIHRvIGJlIHVzZWQgYXMgInNwYXJlIEZJRCIKKyoJICAtIGFja25vd2xlZGdlIHRoZSBhbGxvYyBldmVudAorKgkgIC0gZG8gYW5vdGhlciAiaGFsZiIgYWxsb2NhdGUgdG8gY29tcGxldGUgdGhlICIxLjUgQWxsb2Mgc2NoZW1lIgorKgkgIE5vdGUgdGhhdCBhYm92ZSAzIHN0ZXBzIGRvIG5vdCBoYXJtIGFuZCB0aHVzIGdpdmUgdGhlICJjaGVhcGVzdCIgYWNjZXB0YWJsZSBzdHJhdGVneS4KKyoJICBJZiBhIHRpbWUtb3V0IG9jY3VycmVkLCB0aGVuIHJlcG9ydCB0aW1lIG91dCBzdGF0dXMgKGFmdGVyIGFsbCkKKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQ0ZfU1RBVElDIGludAoraW5pdCggSUZCUCBpZmJwICkKK3sKKworaW50CXJjID0gSENGX1NVQ0NFU1M7CisKKwlIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0lOSVQsIDAgKQorCisJaWZicC0+SUZCX0NhcmRTdGF0ID0gMDsJCQkJCQkJCQkJCQkJCQkJCQkJLyogMiovCisJT1BXKCBIUkVHX0VWX0FDSywgfkhSRUdfRVZfU0xFRVBfUkVRICk7IAkJCQkJCQkJCQkJLyogNCovCisJSUZfUFJPVF9USU1FKCBjYWxpYnJhdGUoIGlmYnAgKTsgKSAJCQkJCQkJCQkJCQkJLyoxMCovCisjaWYgMCAvLyBPT1IKKwlpZmJwLT5JRkJfRldJZGVudGl0eS5sZW4gPSAyOwkJCQkJCQkvL21pc3VzZSB0aGUgSUZCIHNwYWNlIGZvciBhIHB1dAorCWlmYnAtPklGQl9GV0lkZW50aXR5LnR5cCA9IENGR19USUNLX1RJTUU7CisJaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCA9ICgxMDAwKjEwMDApLzEwMjQgKyAxOwkvL3JvdWdobHkgMSBzZWNvbmQKKwloY2ZfcHV0X2luZm8oIGlmYnAsIChMVFZQKSZpZmJwLT5JRkJfRldJZGVudGl0eS5sZW4gKTsKKyNlbmRpZiAvLyBPT1IKKwlpZmJwLT5JRkJfRldJZGVudGl0eS5sZW4gPSBzaXplb2YoQ0ZHX0ZXX0lERU5USVRZX1NUUkNUKS9zaXplb2YoaGNmXzE2KSAtIDE7CisJaWZicC0+SUZCX0ZXSWRlbnRpdHkudHlwID0gQ0ZHX0ZXX0lERU5USVRZOworCXJjID0gaGNmX2dldF9pbmZvKCBpZmJwLCAoTFRWUCkmaWZicC0+SUZCX0ZXSWRlbnRpdHkubGVuICk7CisvKiA7PyBjb252ZXJzaW9uIHNob3VsZCBub3QgYmUgbmVlZGVkIGZvciBtbWRfY2hlY2tfY29tcCAqLworI2lmIEhDRl9CSUdfRU5ESUFOCisJaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCAgICAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKTsKKwlpZmJwLT5JRkJfRldJZGVudGl0eS52YXJpYW50ICAgICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXSWRlbnRpdHkudmFyaWFudCApOworCWlmYnAtPklGQl9GV0lkZW50aXR5LnZlcnNpb25fbWFqb3IgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldJZGVudGl0eS52ZXJzaW9uX21ham9yICk7CisJaWZicC0+SUZCX0ZXSWRlbnRpdHkudmVyc2lvbl9taW5vciA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV0lkZW50aXR5LnZlcnNpb25fbWlub3IgKTsKKyNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgorI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRAkJCQkJCQkJCQkJCQkJCQkJCS8qMTQqLworCWlmICggcmMgPT0gSENGX1NVQ0NFU1MgKSB7CQkJCQkJCQkJCQkJCQkJCQkJLyoxNiovCisJCWlmYnAtPklGQl9IU0lTdXAubGVuID0gc2l6ZW9mKENGR19TVVBfUkFOR0VfU1RSQ1QpL3NpemVvZihoY2ZfMTYpIC0gMTsKKwkJaWZicC0+SUZCX0hTSVN1cC50eXAgPSBDRkdfTklDX0hTSV9TVVBfUkFOR0U7CisJCXJjID0gaGNmX2dldF9pbmZvKCBpZmJwLCAoTFRWUCkmaWZicC0+SUZCX0hTSVN1cC5sZW4gKTsKKy8qIDs/IGNvbnZlcnNpb24gc2hvdWxkIG5vdCBiZSBuZWVkZWQgZm9yIG1tZF9jaGVja19jb21wICwgQlVUIGFjY29yZGluZyB0byBhIHJlcG9ydCBvZiBhIEJFLXVzZXIgaXQgaXMKKyAqIHNob3VsZCBiZSByZXNvbHZlZCBpbiB0aGUgV0FSUCByZWxlYXNlCisgKiBzaW5jZSBzb21lIGNvbXBpbGVycyBtYWtlIHVnbHkgYnV0IHVubmVjZXNzYXJ5IGNvZGUgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIGV2ZW4gZm9yIExFLAorICogaXQgaXMgY29uZGl0aW9uYWxseSBjb21waWxlZCAqLworI2lmIEhDRl9CSUdfRU5ESUFOCisJCWlmYnAtPklGQl9IU0lTdXAucm9sZSAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9IU0lTdXAucm9sZSApOworCQlpZmJwLT5JRkJfSFNJU3VwLmlkICAgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfSFNJU3VwLmlkICk7CisJCWlmYnAtPklGQl9IU0lTdXAudmFyaWFudCA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9IU0lTdXAudmFyaWFudCApOworCQlpZmJwLT5JRkJfSFNJU3VwLmJvdHRvbSAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfSFNJU3VwLmJvdHRvbSApOworCQlpZmJwLT5JRkJfSFNJU3VwLnRvcCAgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfSFNJU3VwLnRvcCApOworI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCisJCWlmYnAtPklGQl9GV1N1cC5sZW4gPSBzaXplb2YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkvc2l6ZW9mKGhjZl8xNikgLSAxOworCQlpZmJwLT5JRkJfRldTdXAudHlwID0gQ0ZHX0ZXX1NVUF9SQU5HRTsKKwkJKHZvaWQpaGNmX2dldF9pbmZvKCBpZmJwLCAoTFRWUCkmaWZicC0+SUZCX0ZXU3VwLmxlbiApOworLyogOz8gY29udmVyc2lvbiBzaG91bGQgbm90IGJlIG5lZWRlZCBmb3IgbW1kX2NoZWNrX2NvbXAgKi8KKyNpZiBIQ0ZfQklHX0VORElBTgorCQlpZmJwLT5JRkJfRldTdXAucm9sZSAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV1N1cC5yb2xlICk7CisJCWlmYnAtPklGQl9GV1N1cC5pZCAgICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXU3VwLmlkICk7CisJCWlmYnAtPklGQl9GV1N1cC52YXJpYW50ID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXU3VwLnZhcmlhbnQgKTsKKwkJaWZicC0+SUZCX0ZXU3VwLmJvdHRvbSAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldTdXAuYm90dG9tICk7CisJCWlmYnAtPklGQl9GV1N1cC50b3AgICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXU3VwLnRvcCApOworI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCisKKwkJaWYgKCBpZmJwLT5JRkJfRldTdXAuaWQgPT0gQ09NUF9JRF9QUkkgKSB7CQkJCQkJCQkJCQkJLyogMjAqLworaW50IGkgPSBzaXplb2YoIENGR19GV19JREVOVElUWV9TVFJDVCkgKyBzaXplb2YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCApOworCQkJd2hpbGUgKCBpLS0gKSAoKGhjZl84KikoJmlmYnAtPklGQl9QUklJZGVudGl0eSkpW2ldID0gKChoY2ZfOCopKCZpZmJwLT5JRkJfRldJZGVudGl0eSkpW2ldOworCQkJaWZicC0+SUZCX1BSSUlkZW50aXR5LnR5cCA9IENGR19QUklfSURFTlRJVFk7CisJCQlpZmJwLT5JRkJfUFJJU3VwLnR5cCA9IENGR19QUklfU1VQX1JBTkdFOworCQkJeHh4eFt4eHh4X1BSSV9JREVOVElUWV9PRkZTRVRdID0gJmlmYnAtPklGQl9QUklJZGVudGl0eS5sZW47CisJCQl4eHh4W3h4eHhfUFJJX0lERU5USVRZX09GRlNFVCsxXSA9ICZpZmJwLT5JRkJfUFJJU3VwLmxlbjsKKwkJfQorCQlpZiAoICFtbWRfY2hlY2tfY29tcCggKHZvaWQqKSZjZmdfZHJ2X2FjdF9yYW5nZXNfaHNpLCAmaWZicC0+SUZCX0hTSVN1cCkJCQkJIC8qIDIyKi8KKyNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9QUkVMT0FERUQgKSA9PSAwCisvLzs/IHRoZSBQUkkgY29tcGF0aWJpbGl0eSBjaGVjayBpcyBvbmx5IHJlbGV2YW50IGZvciBESEYKKwkJCSB8fCAhbW1kX2NoZWNrX2NvbXAoICh2b2lkKikmY2ZnX2Rydl9hY3RfcmFuZ2VzX3ByaSwgJmlmYnAtPklGQl9QUklTdXApCisjZW5kaWYgLy8gSENGX1RZUEVfUFJFTE9BREVECisJCSAgICkgeworCQkJaWZicC0+SUZCX0NhcmRTdGF0ID0gQ0FSRF9TVEFUX0lOQ09NUF9QUkk7CisJCQlyYyA9IEhDRl9FUlJfSU5DT01QX1BSSTsKKwkJfQorCQlpZiAoICggaWZicC0+SUZCX0ZXU3VwLmlkID09IENPTVBfSURfU1RBICYmCSFtbWRfY2hlY2tfY29tcCggKHZvaWQqKSZjZmdfZHJ2X2FjdF9yYW5nZXNfc3RhLCAmaWZicC0+SUZCX0ZXU3VwKSApIHx8CisJCQkgKCBpZmJwLT5JRkJfRldTdXAuaWQgPT0gQ09NUF9JRF9BUEYgJiYgIW1tZF9jaGVja19jb21wKCAodm9pZCopJmNmZ19kcnZfYWN0X3Jhbmdlc19hcGYsICZpZmJwLT5JRkJfRldTdXApICkKKwkJICAgKSB7CQkJCQkJCQkJCQkJCQkJCQkJCQkJLyogMjQgKi8KKwkJCWlmYnAtPklGQl9DYXJkU3RhdCB8PSBDQVJEX1NUQVRfSU5DT01QX0ZXOworCQkJcmMgPSBIQ0ZfRVJSX0lOQ09NUF9GVzsKKwkJfQorCX0KKyNlbmRpZiAvLyBNU0ZfQ09NUE9ORU5UX0lECisjaWYgKEhDRl9ETF9PTkxZKSA9PSAwCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDI4ICovCisJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyAmJiBpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkID49IENPTVBfSURfRldfU1RBICkgeworUFJPVF9DTlRfSU5JCisJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkqIHJsYXY6IHRoZSBETUEgZW5naW5lIG5lZWRzIHRoZSBob3N0IHRvIGNhdXNlIGEgJ2hhbmdpbmcgYWxsb2MgZXZlbnQnIGZvciBpdCB0byBjb25zdW1lLgorCQkqIG5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIHJpZ2h0IHNwb3QgaW4gdGhlIEhDRiwgdGhpbmtpbmcgYWJvdXQgaGNmX2VuYWJsZS4uLgorCQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0FMTE9DLCAwICk7CisvLyAxODAgZGVncmVlIGVycm9yIGluIGxvZ2ljIDs/ICNpZiBBTExPQ18xNQorLy8JCWlmYnAtPklGQl9Sc2NJbmQgPSAxOwkvL2xldCdzIGhvcGUgdGhhdCBieSB0aGUgdGltZSBoY2Zfc2VuZF9tc2cgaXNhIGNhbGxlZCwgdGhlcmUgd2lsbCBiZSBhIEZJRAorLy8jZWxzZQorCQlpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgeworCQkJSENGX1dBSVRfV0hJTEUoIChJUFcoIEhSRUdfRVZfU1RBVCApICYgSFJFR19FVl9BTExPQykgPT0gMCApOworCQkJSUZfUFJPVF9USU1FKCBIQ0ZBU1NFUlQocHJvdF9jbnQsIElQVyggSFJFR19FVl9TVEFUICkgKSAvKk5PUCovOykKKyNpZiBIQ0ZfRE1BCisJCQlpZiAoICEgKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEgKSApCisjZW5kaWYgLy8gSENGX0RNQQorCQkJeworCQkJCWlmYnAtPklGQl9Sc2NJbmQgPSBnZXRfZmlkKCBpZmJwICk7CisJCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfUnNjSW5kLCAwICkKKwkJCQljbWRfZXhlKCBpZmJwLCBIQ01EX0FMTE9DLCAwICk7CisJCQkJSUZfUFJPVF9USU1FKCBpZiAoIHByb3RfY250ID09IDAgKSByYyA9IEhDRl9FUlJfVElNRV9PVVQ7ICkKKwkJCX0KKwkJfQorLy8jZW5kaWYgLy8gQUxMT0NfMTUKKwl9CisjZW5kaWYgLy8gSENGX0RMX09OTFkKKwlIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApCisJSENGTE9HRVhJVCggSENGX1RSQUNFX0lOSVQgKQorCXJldHVybiByYzsKK30gLy8gaW5pdAorCisjaWYgKEhDRl9ETF9PTkxZKSA9PSAwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLlNVQk1PRFVMRQkJdm9pZCBpc3JfaW5mbyggSUZCUCBpZmJwICkKKyouUFVSUE9TRQkJaGFuZGxlcyBsaW5rIGV2ZW50cy4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKgorKi5SRVRVUk5TCQlOLkEuCisqCisqLkRFU0NSSVBUSU9OCisqCisqCisqLkRJQUdSQU0KKyoxOglGaXJzdCB0aGUgRklEIG51bWJlciBjb3JyZXNwb25kaW5nIHdpdGggdGhlIEluZm9FdmVudCBpcyBkZXRlcm1pbmVkLgorKglOb3RlIHRoZSBjb21wbGljYXRpb24gb2YgdGhlIHplcm8tRklEIHByb3RlY3Rpb24gc3ViLXNjaGVtZSBpbiBEQVdBLgorKglOZXh0IHRoZSBMLWZpZWxkIGFuZCB0aGUgVC1maWVsZCBhcmUgZmV0Y2hlZCBpbnRvIHNjcmF0Y2ggYnVmZmVyIGluZm8uCisqMjoJSW4gY2FzZSBvZiB0YWxsaWVzLCB0aGUgMTYgYml0cyBIZXJtZXMgdmFsdWVzIGFyZSBhY2N1bXVsYXRlZCBpbiB0aGUgSUZCIGludG8gMzIgYml0cyB2YWx1ZXMuIEluZm9bMF0KKyoJaXMgKGV4cGVjdGVkIHRvIGJlKSBIQ0ZfTklDX1RBTF9DTlQgKyAxLiBUaGUgY29udHJhcHRpb24gIndoaWxlICggaW5mb1swXS0tID4xICkiIHJhdGhlciB0aGFuCisqCSJ3aGlsZSAoIC0taW5mb1swXSApIiBpcyB1c2VkIGJlY2F1c2UgaXQgaXMgZGFuZ2Vyb3VzIHRvIGRldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZSBWYWx1ZSBmaWVsZCBieQorKglkZWNyZW1lbnRpbmcgaW5mb1swXS4gQXMgYSByZXN1bHQgb2YgYSBidWcgaW4gc29tZSB2ZXJzaW9uIG9mIHRoZSBGL1csIGluZm9bMF0gbWF5IGJlIDAsIHJlc3VsdGluZworKglpbiBhIHZlcnkgbG9uZyBsb29wIGluIHRoZSBwcmUtZGVjcmVtZW50IGxvZ2ljLgorKjQ6CUluIGNhc2Ugb2YgYSBsaW5rIHN0YXR1cyBmcmFtZSwgdGhlIGluZm9ybWF0aW9uIGlzIGNvcGllZCB0byB0aGUgSUZCIGZpZWxkIElGQl9saW5rU3RhdAorKjY6CUFsbCBvdGhlciB0aGFuIFRhbGxpZXMgKGluY2x1ZGluZyAidW5rbm93biIgb25lcykgYXJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgc2VsZWN0aW9uIHNldCBieSB0aGUgTVNGCisqCXZpYSBDRkdfUklEX0xPRy4gSWYgYSBtYXRjaCBpcyBmb3VuZCBvciB0aGUgc2VsZWN0aW9uIHNldCBoYXMgdGhlIHdpbGQtY2FyZCB0eXBlIChpLmUgbm9uLU5VTEwgYnVmZmVyCisqCXBvaW50ZXIgYXQgdGhlIHRlcm1pbmF0aW5nIHplcm8tdHlwZSksIHRoZSBmcmFtZSBpcyBjb3BpZWQgdG8gdGhlICh0eXBlLXNwZWNpZmljKSBsb2cgYnVmZmVyLgorKglOb3RlIHRoYXQgdG8gYWNjdW11bGF0ZSB0YWxsaWVzIGludG8gSUZCIEFORCB0byBsb2cgdGhlbSBvciB0byBsb2cgYSBmcmFtZSB3aGVuIGEgc3BlY2lmaWMgbWF0Y2ggb2NjdXJlcworKglBTkQgYmFzZWQgb24gdGhlIHdpbGQtY2FyZCBzZWxlY3Rpb24sIHlvdSBoYXZlIHRvIGNhbGwgc2V0dXBfYmFwIGFnYWluIGFmdGVyIHRoZSAxc3QgY29weS4KKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQ0ZfU1RBVElDIHZvaWQKK2lzcl9pbmZvKCBJRkJQIGlmYnAgKQoreworaGNmXzE2CWluZm9bMl0sIGZpZDsKKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lORk9fTE9HCitSSURfTE9HUAlyaWRwID0gaWZicC0+SUZCX1JJRExvZ3A7CS8vTlVMTCBvciBwb2ludGVyIHRvIGFycmF5IG9mIFJJRF9MT0cgc3RydWN0dXJlcyAodGVybWluYXRlZCBieSB6ZXJvIHR5cCkKKyNlbmRpZiAvLyBIQ0ZfRVhUX0lORk9fTE9HCisKKwlIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX0lTUl9JTkZPICk7CQkJCQkJCQkJCQkJCQkJCS8qIDEgKi8KKwlmaWQgPSBJUFcoIEhSRUdfSU5GT19GSUQgKTsKKwlEQVdBX1pFUk9fRklEKCBIUkVHX0lORk9fRklEICkKKwlpZiAoIGZpZCApIHsKKwkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBmaWQsIDAsIElPX0lOICk7CisJCWdldF9mcmFnKCBpZmJwLCAod2NpX2J1ZnApaW5mbywgNCBCRV9QQVIoMikgKTsKKwkJSENGQVNTRVJUKCBpbmZvWzBdIDw9IEhDRl9NQVhfTFRWICsgMSwgTUVSR0VfMiggaW5mb1sxXSwgaW5mb1swXSApICkgIC8vOz8gYSBzbWFsbGVyIHZhbHVlIG1ha2VzIG1vcmUgc2Vuc2UKKyNpZiAoSENGX1RBTExJRVMpICYgSENGX1RBTExJRVNfTklDCQkvL0hlcm1lcyB0YWxseSBzdXBwb3J0CisJCWlmICggaW5mb1sxXSA9PSBDRkdfVEFMTElFUyApIHsKK2hjZl8zMgkqcDsKKy8qMiovCQlpZiAoIGluZm9bMF0gPiBIQ0ZfTklDX1RBTF9DTlQgKSB7CisJCQkJaW5mb1swXSA9IEhDRl9OSUNfVEFMX0NOVCArIDE7CisJCQl9CisJCQlwID0gKGhjZl8zMiopJmlmYnAtPklGQl9OSUNfVGFsbGllczsKKwkJCXdoaWxlICggaW5mb1swXS0tID4xICkgKnArKyArPSBJUFcoIEhSRUdfREFUQV8xICk7CS8vcmVxdWVzdCBtYXkgcmV0dXJuIHplcm8gbGVuZ3RoCisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIEhDRl9UQUxMSUVTX05JQworCQl7CisvKjQqLwkJaWYgKCBpbmZvWzFdID09IENGR19MSU5LX1NUQVQgKSB7CisJCQkJaWZicC0+SUZCX0xpbmtTdGF0ID0gSVBXKCBIUkVHX0RBVEFfMSApOworCQkJfQorI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5GT19MT0cKKy8qNiovCQl3aGlsZSAoIDEgKSB7CisJCQkJaWYgKCByaWRwLT50eXAgPT0gMCB8fCByaWRwLT50eXAgPT0gaW5mb1sxXSApIHsKKwkJCQkJaWYgKCByaWRwLT5idWZwICkgeworCQkJCQkJSENGQVNTRVJUKCByaWRwLT5sZW4gPj0gMiwgcmlkcC0+dHlwICkKKwkJCQkJCXJpZHAtPmJ1ZnBbMF0gPSBtaW4oKGhjZl8xNikocmlkcC0+bGVuIC0gMSksIGluZm9bMF0gKTsgCS8vc2F2ZSBMCisJCQkJCQlyaWRwLT5idWZwWzFdID0gaW5mb1sxXTsJCQkJCQkvL3NhdmUgVAorCQkJCQkJZ2V0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcCkmcmlkcC0+YnVmcFsyXSwgKHJpZHAtPmJ1ZnBbMF0gLSAxKSoyIEJFX1BBUigwKSApOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlyaWRwKys7CisJCQl9CisjZW5kaWYgLy8gSENGX0VYVF9JTkZPX0xPRworCQl9CisJCUhDRlRSQUNFKCBpZmJwLCBIQ0ZfVFJBQ0VfSVNSX0lORk8gfCBIQ0ZfVFJBQ0VfRVhJVCApOworCX0KKwlyZXR1cm47Cit9IC8vIGlzcl9pbmZvCisjZW5kaWYgLy8gSENGX0RMX09OTFkKKworLy8KKy8vCisvLyAjZW5kaWYgLy8gSENGX1RBTExJRVNfTklDCisvLyAvKjQqLwlpZiAoIGluZm9bMV0gPT0gQ0ZHX0xJTktfU1RBVCApIHsKKy8vIAkJCWlmYnAtPklGQl9EU0xpbmtTdGF0ID0gSVBXKCBIUkVHX0RBVEFfMSApIHwgQ0ZHX0xJTktfU1RBVF9DSEFOR0U7CS8vY29ycnVwdHMgQkFQICEhIDs/CisvLyAJCQlpZmJwLT5JRkJfTGlua1N0YXQgPSBpZmJwLT5JRkJfRFNMaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfRlc7IC8vOz8gdG8gYmUgb2Jzb2xldGVkCisvLyAJCQlwcmludGsoICI8ND5saW5rc3RhdHVzOiAlMDR4XG4iLCBpZmJwLT5JRkJfRFNMaW5rU3RhdCApOwkJLy87P3JlbW92ZSBtZSAxIGRheQorLy8gI2lmIChIQ0ZfU0xFRVApICYgSENGX0REUworLy8gCQkJaWYgKCAoIGlmYnAtPklGQl9EU0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9DT05ORUNURUQgKSA9PSAwICkgeyAJLy9ldmVuIHZhbHVlcyBhcmUgZGlzY29ubmVjdGVkIGV0Yy4KKy8vIAkJCQlpZmJwLT5JRkJfVGlja0NudCA9IDA7CQkJCS8vc3RhcnQgMiBzZWNvbmQgcGVyaW9kICh3aXRoIDEgdGljayB1bmNlcnRhbnR5KQorLy8gCQkJCXByaW50ayggIjw1Pmlzcl9pbmZvOiBBd2FpdENvbm5lY3Rpb24gcGhhc2Ugc3RhcnRlZCwgSUZCX1RpY2tDbnQgPSAwXG4iICk7CQkvLzs/cmVtb3ZlIG1lIDEgZGF5CisvLyAJCQl9CisvLyAjZW5kaWYgLy8gSENGX0REUworLy8gCQl9CisvLyAjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTkZPX0xPRworLy8gLyo2Ki8Jd2hpbGUgKCAxICkgeworLy8gCQkJaWYgKCByaWRwLT50eXAgPT0gMCB8fCByaWRwLT50eXAgPT0gaW5mb1sxXSApIHsKKy8vIAkJCQlpZiAoIHJpZHAtPmJ1ZnAgKSB7CisvLyAJCQkJCUhDRkFTU0VSVCggcmlkcC0+bGVuID49IDIsIHJpZHAtPnR5cCApCisvLyAJCQkJCSh2b2lkKXNldHVwX2JhcCggaWZicCwgZmlkLCAyLCBJT19JTiApOwkJCS8vcmVzdG9yZSBCQVAgZm9yIHRhbGxpZXMsIGxpbmtzdGF0IGFuZCBzcGVjaWZpYyB0eXBlIGZvbGxvd2VkIGJ5IHdpbGQgY2FyZAorLy8gCQkJCQlyaWRwLT5idWZwWzBdID0gbWluKCByaWRwLT5sZW4gLSAxLCBpbmZvWzBdICk7IAkvL3NhdmUgTAorLy8gCQkJCQlnZXRfZnJhZyggaWZicCwgKHdjaV9idWZwKSZyaWRwLT5idWZwWzFdLCByaWRwLT5idWZwWzBdKjIgQkVfUEFSKDApICk7CisvLyAJCQkJfQorLy8gCQkJCWJyZWFrOyAvLzs/dGhpcyBicmVhayBpcyBubyBsb25nZXIgbmVlZGVkIGR1ZSB0byBzZXR1cF9iYXAgYnV0IGxldHMgY29uY2VudHJhdGUgb24gRERTIGZpcnN0CisvLyAJCQl9CisvLyAJCQlyaWRwKys7CisvLyAJCX0KKy8vICNlbmRpZiAvLyBIQ0ZfRVhUX0lORk9fTE9HCisvLyAJfQorLy8gCUhDRlRSQUNFKCBpZmJwLCBIQ0ZfVFJBQ0VfSVNSX0lORk8gfCBIQ0ZfVFJBQ0VfRVhJVCApOworLy8KKy8vCisvLworLy8KKy8vCXJldHVybjsKKy8vfSAvLyBpc3JfaW5mbworLy8jZW5kaWYgLy8gSENGX0RMX09OTFkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLlNVQk1PRFVMRQkJdm9pZCBtZGRfYXNzZXJ0KCBJRkJQIGlmYnAsIHVuc2lnbmVkIGludCBsaW5lX251bWJlciwgaGNmXzMyIHEgKQorKi5QVVJQT1NFCQlmaWx0ZXJzIGFzc2VydCBvbiBsZXZlbCBhbmQgaW50ZXJmYWNlcyB0byB0aGUgTVNGIHN1cHBsaWVkIG1zZl9hc3NlcnQgcm91dGluZS4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKglsaW5lX251bWJlcglsaW5lIG51bWJlciBvZiB0aGUgbGluZSB3aGljaCBjYXVzZWQgdGhlIGFzc2VydAorKglxCQkJcXVhbGlmaWVyLCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdoaWNoIG1heSBnaXZlIGEgY2x1ZSBhYm91dCB0aGUgcHJvYmxlbQorKgorKi5SRVRVUk5TCQlOLkEuCisqCisqLkRFU0NSSVBUSU9OCisqCisqCisqLkRJQUdSQU0KKyoKKyouTk9USUNFCisqIG1kZF9hc3NlcnQgaGFzIGJlZW4gdGhyb3VnaCBhIHR1cm1vaWwsIHJlbmFtaW5nIGhjZl9hc3NlcnQgdG8gYXNzZXJ0IGFuZCBoY2ZfYXNzZXJ0IGFnYWluIGFuZCBzdXBwb3J0aW5nIG9mZgorKiBhbmQgb24gYmVpbmcgY2FsbGVkIGZyb20gdGhlIE1TRiBsZXZlbCBhbmQgb3RoZXIgKCBpbW1hdHVyZSApIE1vZHVsYXJEcml2ZXJEZXZlbG9wbWVudCBtb2R1bGVzIGxpa2UgREhGIGFuZAorKiBNTUQuCisgKiAhISEhIFRoZSBhc3NlcnQgcm91dGluZSBpcyBub3QgYW4gaGNmXy4uLi4uIHJvdXRpbmUgaW4gdGhlIHNlbnNlIHRoYXQgaXQgbWF5IGJlIGNhbGxlZCBieSB0aGUgTVNGLAorICoJCWhvd2V2ZXIgaXQgaXMgY2FsbGVkIGZyb20gbW1kLmMgYW5kIGRoZi5jLCBzbyBpdCBtdXN0IGJlIGV4dGVybmFsLgorICoJCVRvIHByZXZlbnQgbmFtZXNwYWNlIHBvbGx1dGlvbiBpdCBuZWVkcyBhIHByZWZpeCwgdG8gcHJldmVudCB0aGF0IE1TRiBwcm9ncmFtbWVycyB0aGluayB0aGF0CisgKgkJdGhleSBhcmUgYWxsb3dlZCB0byBjYWxsIHRoZSBhc3NlcnQgbG9naWMsIHRoZSBwcmVmaXggSENGIGNhbid0IGJlIHVzZWQsIHNvIE1ERCBpcyBzZWxlY3RlZCEhISEKKyAqCisqIFdoZW4gY2FsbGVkIGZyb20gdGhlIERIRiBtb2R1bGUgdGhlIGxpbmUgbnVtYmVyIGlzIGluY3JlbWVudGVkIGJ5IERIRl9GSUxFX05BTUVfT0ZGU0VUIGFuZCB3aGVuIGNhbGxlZCBmcm9tCisqIHRoZSBNTUQgbW9kdWxlIGJ5IE1NRF9GSUxFX05BTUVfT0ZGU0VULgorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBIQ0ZfQVNTRVJUCit2b2lkCittZGRfYXNzZXJ0KCBJRkJQIGlmYnAsIHVuc2lnbmVkIGludCBsaW5lX251bWJlciwgaGNmXzMyIHEgKQoreworaGNmXzE2CXJ1bl90aW1lX2ZsYWcgPSBpZmJwLT5JRkJfQXNzZXJ0THZsOworCisJaWYgKCBydW5fdGltZV9mbGFnIC8qID4gOz8/Pz8/PyAqLyApIHsgLy9wcmV2ZW50IHJlY3Vyc2l2ZSBiZWhhdmlvciwgbGF0ZXIgdG8gYmUgZXh0ZW5kZWQgdG8gbGV2ZWwgZmlsdGVyaW5nCisJCWlmYnAtPklGQl9Bc3NlcnRRdWFsaWZpZXIgPSBxOworCQlpZmJwLT5JRkJfQXNzZXJ0TGluZSA9IChoY2ZfMTYpbGluZV9udW1iZXI7CisjaWYgKEhDRl9BU1NFUlQpICYgKCBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROIHwgSENGX0FTU0VSVF9SVF9NU0ZfUlROICkKKwkJaWYgKCBpZmJwLT5JRkJfQXNzZXJ0UnRuICkgeworCQkJaWZicC0+SUZCX0Fzc2VydFJ0biggbGluZV9udW1iZXIsIGlmYnAtPklGQl9Bc3NlcnRUcmFjZSwgcSApOworCQl9CisjZW5kaWYgLy8gSENGX0FTU0VSVF9MTktfTVNGX1JUTiAvIEhDRl9BU1NFUlRfUlRfTVNGX1JUTgorI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfU1dfU1VQCisJCU9QVyggSFJFR19TV18yLCBsaW5lX251bWJlciApOworCQlPUFcoIEhSRUdfU1dfMiwgaWZicC0+SUZCX0Fzc2VydFRyYWNlICk7CisJCU9QVyggSFJFR19TV18yLCAoaGNmXzE2KXEgKTsKKwkJT1BXKCBIUkVHX1NXXzIsIChoY2ZfMTYpKHEgPj4gMTYgKSApOworI2VuZGlmIC8vIEhDRl9BU1NFUlRfU1dfU1VQCisKKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX01CICYmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfTUIKKwkJaWZicC0+SUZCX0Fzc2VydEx2bCA9IDA7CQkJCQkJCQkJLy8gcHJldmVudCByZWN1cnNpdmUgYmVoYXZpb3IKKwkJaGNmX3B1dF9pbmZvKCBpZmJwLCAoTFRWUCkmaWZicC0+SUZCX0Fzc2VydFN0cmN0ICk7CisJCWlmYnAtPklGQl9Bc3NlcnRMdmwgPSBydW5fdGltZV9mbGFnOwkJCQkJCS8vIHJlc3RvcmUgYXBwcm9wcmlhdGUgZmlsdGVyIGxldmVsCisjZW5kaWYgLy8gSENGX0VYVF9NQiAvIEhDRl9BU1NFUlRfTUIKKwl9Cit9IC8vIG1kZF9hc3NlcnQKKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5TVUJNT0RVTEUJCXZvaWQgcHV0X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgaW50IGxlbiBCRV9QQVIoIGludCB3b3JkX2xlbiApICkKKyouUFVSUE9TRQkJd3JpdGVzIHdpdGggMTYvMzIgYml0IEkvTyB2aWEgQkFQMSBwb3J0IGZyb20gSG9zdCBtZW1vcnkgdG8gTklDIFJBTS4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKglidWZwCQkoYnl0ZSkgYWRkcmVzcyBvZiBidWZmZXIKKyoJbGVuCQkJbGVuZ3RoIGluIGJ5dGVzIG9mIGJ1ZmZlciBzcGVjaWZpZWQgYnkgYnVmcAorKgl3b3JkX2xlbglCaWcgRW5kaWFuIG9ubHk6IG51bWJlciBvZiBsZWFkaW5nIGJ5dGVzIHRvIHN3YXAgaW4gcGFpcnMKKyoKKyouUkVUVVJOUwkJTi5BLgorKgorKi5ERVNDUklQVElPTgorKiBwcm9jZXNzIHRoZSBzaW5nbGUgYnl0ZSAoaWYgYXBwbGljYWJsZSkgbm90IHlldCB3cml0dGVuIGJ5IHRoZSBwcmV2aW91cyBwdXRfZnJhZyBhbmQgY29weSBsZW4KKyogKG9yIGxlbi0xKSBieXRlcyBmcm9tIGJ1ZnAgdG8gTklDLgorKgorKgorKi5ESUFHUkFNCisqCisqLk5PVElDRQorKglJdCB0dXJucyBvdXQgRE9TIE9ESSB1c2VzIHplcm8gbGVuZ3RoIGZyYWdtZW50cy4gVGhlIEhDRiBjb2RlIGNhbiBjb3BlIHdpdGggaXQsIGJ1dCBhcyBhIGNvbnNlcXVlbmNlLCBubworKglBc3NlcnQgb24gbGVuIGlzIHBvc3NpYmxlCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSENGX1NUQVRJQyB2b2lkCitwdXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKQoreworaGNmX2lvCQlpb19wb3J0ID0gaWZicC0+SUZCX0lPQmFzZSArIEhSRUdfREFUQV8xOwkvL0JBUCBkYXRhIHJlZ2lzdGVyCitpbnQJCQlpOwkJCQkJCQkJCQkJLy9wcmV2ZW50IHNpZGUgZWZmZWN0cyBmcm9tIG1hY3JvCitoY2ZfMTYJCWo7CisJSENGQVNTRVJUKCAoKGhjZl8zMilidWZwICYgKEhDRl9BTElHTi0xKSApID09IDAsIChoY2ZfMzIpYnVmcCApCisjaWYgSENGX0JJR19FTkRJQU4KKwlIQ0ZBU1NFUlQoIHdvcmRfbGVuID09IDAgfHwgd29yZF9sZW4gPT0gMiB8fCB3b3JkX2xlbiA9PSA0LCB3b3JkX2xlbiApCisJSENGQVNTRVJUKCB3b3JkX2xlbiA9PSAwIHx8ICgoaGNmXzMyKWJ1ZnAgJiAxICkgPT0gMCwgKGhjZl8zMilidWZwICkKKwlIQ0ZBU1NFUlQoIHdvcmRfbGVuIDw9IGxlbiwgTUVSR0VfMiggd29yZF9sZW4sIGxlbiApICkKKworCWlmICggd29yZF9sZW4gKSB7CQkJCQkJCQkJLy9pZiB0aGVyZSBpcyBhbnl0aGluZyB0byBjb252ZXJ0CisgCQkJCQkJCQkJCQkJCQkvLy4gIGNvbnZlcnQgYW5kIHdyaXRlIHRoZSAxc3QgaGNmXzE2CisJCWogPSBidWZwWzFdIHwgYnVmcFswXTw8ODsKKwkJT1VUX1BPUlRfV09SRCggaW9fcG9ydCwgaiApOworCQkJCQkJCQkJCQkJCQkvLy4gIHVwZGF0ZSBwb2ludGVyIGFuZCBjb3VudGVyIGFjY29yZGluZ2x5CisJCWxlbiAtPSAyOworCQlidWZwICs9IDI7CisJCWlmICggd29yZF9sZW4gPiAxICkgewkJCQkJCQkvLy4gIGlmIHRoZXJlIGlzIHRvIGNvbnZlcnQgbW9yZSB0aGFuIDEgd29yZCAoIGkuZSAyICkKKyAJCQkJCQkJCQkJCQkJCS8vLiAgLiAgY29udmVydCBhbmQgd3JpdGUgdGhlIDJuZCBoY2ZfMTYKKwkJCWogPSBidWZwWzFdIHwgYnVmcFswXTw8ODsJLypidWZwIGlzIGFscmVhZHkgaW5jcmVtZW50ZWQgYnkgMiovCisJCQlPVVRfUE9SVF9XT1JEKCBpb19wb3J0LCBqICk7CisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgdXBkYXRlIHBvaW50ZXIgYW5kIGNvdW50ZXIgYWNjb3JkaW5nbHkKKwkJCWxlbiAtPSAyOworCQkJYnVmcCArPSAyOworCQl9CisJfQorI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCisJaSA9IGxlbjsKKwlpZiAoIGkgJiYgaWZicC0+SUZCX0NhcnJ5T3V0ICkgewkJCQkJLy9za2lwIHplcm8tbGVuZ3RoCisJCWogPSAoKCpidWZwKTw8OCkgKyAoIGlmYnAtPklGQl9DYXJyeU91dCAmIDB4RkYgKTsKKwkJT1VUX1BPUlRfV09SRCggaW9fcG9ydCwgaiApOworCQlidWZwKys7IGktLTsKKwkJaWZicC0+SUZCX0NhcnJ5T3V0ID0gMDsKKwl9CisjaWYgKEhDRl9JTykgJiBIQ0ZfSU9fMzJCSVRTCisJLy9za2lwIHplcm8tbGVuZ3RoIEkvTywgc2luZ2xlIGJ5dGUgSS9PIGFuZCBJL08gbm90IHdvcnRod2hpbGUgKGkuZS4gbGVzcyB0aGFuIDYgYnl0ZXMpZm9yIERXIGxvZ2ljCisJCQkJCQkJCQkJCQkJLy9pZiBidWZmZXIgbGVuZ3RoID49IDYgYW5kIDMyIGJpdHMgSS9PIHN1cHBvcnQKKwlpZiAoICEoaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfMTZCSVQpICYmIGkgPj0gNiApIHsKK2hjZl8zMiBGQVIJKnA0OyAvL3ByZXZlbnQgc2lkZSBlZmZlY3RzIGZyb20gbWFjcm8KKwkJaWYgKCAoIChoY2ZfMzIpYnVmcCAmIDB4MSApID09IDAgKSB7CQkJLy8uICBpZiBidWZmZXIgYXQgbGVhc3Qgd29yZCBhbGlnbmVkCisJCQlpZiAoIChoY2ZfMzIpYnVmcCAmIDB4MiApIHsJCQkJLy8uICAuICBpZiBidWZmZXIgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLy8uICAuICAuICB3cml0ZSBhIHNpbmdsZSB3b3JkIHRvIGdldCBkb3VibGUgd29yZCBhbGlnbmVkCisJCQkJaiA9ICood2NpX3JlY29yZHApYnVmcDsJCS8vanVzdCB0byBoZWxwIGVhc2Ugd3JpdGluZyBtYWNyb3Mgd2l0aCBlbWJlZGRlZCBhc3NlbWJseQorCQkJCU9VVF9QT1JUX1dPUkQoIGlvX3BvcnQsIGogKTsKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIGFkanVzdCBidWZmZXIgbGVuZ3RoIGFuZCBwb2ludGVyIGFjY29yZGluZ2x5CisJCQkJYnVmcCArPSAyOyBpIC09IDI7CisJCQl9CisJCQkJCQkJCQkJCQkJLy8uICAuICB3cml0ZSBhcyBtYW55IGRvdWJsZSB3b3JkIGFzIHBvc3NpYmxlCisJCQlwNCA9IChoY2ZfMzIgRkFSICopYnVmcDsKKwkJCWogPSAoaGNmXzE2KWkvNDsKKwkJCU9VVF9QT1JUX1NUUklOR18zMiggaW9fcG9ydCwgcDQsIGogKTsKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIGFkanVzdCBidWZmZXIgbGVuZ3RoIGFuZCBwb2ludGVyIGFjY29yZGluZ2x5CisJCQlidWZwICs9IGkgJiB+MHgwMDAzOworCQkJaSAmPSAweDAwMDM7CisJCX0KKwl9CisjZW5kaWYgLy8gSENGX0lPXzMyQklUUworCQkJCQkJCQkJCQkJCS8vaWYgbm8gMzItYml0IHN1cHBvcnQgT1IgYnl0ZSBhbGlnbmVkIE9SIDEgd29yZCBsZWZ0CisJaWYgKCBpICkgeworCQkJCQkJCQkJCQkJCS8vLiAgaWYgb2RkIG51bWJlciBvZiBieXRlcyBsZWZ0CisJCWlmICggaSAmIDB4MDAwMSApIHsKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIHNhdmUgbGVmdCBvdmVyIGJ5dGUgKGJlZm9yZSBidWZwIGlzIGNvcnJ1cHRlZCkgaW4gY2FycnksIHNldCBjYXJyeSBmbGFnCisJCQlpZmJwLT5JRkJfQ2FycnlPdXQgPSAoaGNmXzE2KWJ1ZnBbaS0xXSB8IDB4MDEwMDsJLy9ub3RlIHRoYXQgaSBhbmQgYnVmcCBhcmUgYWx3YXlzIHNpbXVsdGFuZW91c2x5IG1vZGlmaWVkLCAmYnVmcFtpLTFdIGlzIGludmFyaWFudAorCQl9CisJCQkJCQkJCQkJCQkJLy8uICB3cml0ZSBhcyBtYW55IHdvcmQgYXMgcG9zc2libGUgaW4gImFsaWdubWVudCBzYWZlIiB3YXkKKwkJaiA9IChoY2ZfMTYpaS8yOworCQlPVVRfUE9SVF9TVFJJTkdfOF8xNiggaW9fcG9ydCwgYnVmcCwgaiApOworCX0KK30gLy8gcHV0X2ZyYWcKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLlNVQk1PRFVMRQkJdm9pZCBwdXRfZnJhZ19maW5hbGl6ZSggSUZCUCBpZmJwICkKKyouUFVSUE9TRQkJY2xlYW51cCBhZnRlciBwdXRfZnJhZyBmb3IgdHJhaWxpbmcgb2RkIGJ5dGUgYW5kIE1JQyB0cmFuc2ZlciB0byBOSUMuCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoKKyouUkVUVVJOUwkJTi5BLgorKgorKi5ERVNDUklQVElPTgorKiBmaW5hbGl6ZSB0aGUgTUlDIGNhbGN1bGF0aW9uIHdpdGggdGhlIHBhZGRpbmcgcGF0dGVybiwgb3V0cHV0IHRoZSBsYXN0IGJ5dGUgKGlmIGFwcGxpY2FibGUpCisqIG9mIHRoZSBtZXNzYWdlIGFuZCB0aGUgTUlDIHRvIHRoZSBUeEZTCisqCisqCisqLkRJQUdSQU0KKyoyOgkxIGJ5dGUgb2YgdGhlIGxhc3QgcHV0X2ZyYWcgbWF5IGJlIHN0aWxsIGluIElGQl9DYXJyeU91dCAoIHRoZSBwdXRfZnJhZyBjYXJyeSBob2xkZXIgKSwgc28gLi4uLi4uLi4KKyoJMSAtIDMgYnl0ZXMgb2YgdGhlIGxhc3QgcHV0X2ZyYWcgbWF5IGJlIHN0aWxsIGluIElGQl90eF8zMiAoIHRoZSBNSUMgZW5naW5lIGNhcnJ5IGhvbGRlciApLCBzbyAuLi4uLi4uLgorKglUaGUgY2FsbCB0byB0aGUgTUlDIGNhbGN1bGF0aW9uIHJvdXRpbmUgZmVlZHMgdGhlc2UgcmVtYWluaW5nIGJ5dGVzIChpZiBhbnkpIG9mIHB1dF9mcmFnIGFuZCB0aGUKKyoJanVzdCBhcyBtYW55IGJ5dGVzIG9mIHRoZSBwYWRkaW5nIGFzIG5lZWRlZCB0byB0aGUgTUlDIGNhbGN1bGF0aW9uIGVuZ2luZS4gTm90ZSB0aGF0IHRoZSAidW5uZWVkZWQiIHBhZAorKglieXRlcyBzaW1wbHkgZW5kIHVwIGluIHRoZSBNSUMgZW5naW5lIGNhcnJ5IGhvbGRlciBhbmQgYXJlIG5ldmVyIHVzZWQuCisqODoJd3JpdGUgdGhlIHJlbWFpbmRlciBvZiB0aGUgTUlDIGFuZCBwb3NzaWJsZSBzb21lIGdhcmJhZ2UgdG8gTklDIFJBTQorKglOb3RlOiBpIGlzIGFsd2F5cyA0IChhIGxvb3AtaW52YXJpYW50IG9mIHRoZSB3aGlsZSBpbiBwb2ludCAyKQorKgorKi5OT1RJQ0UKKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQ0ZfU1RBVElDIHZvaWQKK3B1dF9mcmFnX2ZpbmFsaXplKCBJRkJQIGlmYnAgKQoreworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKKwlpZiAoIGlmYnAtPklGQl9NSUNUeENhcnJ5ICE9IDB4RkZGRikgewkJLy9pZiBNSUMgY2FsY3VsYXRpb24gYWN0aXZlCisJCUNBTENfVFhfTUlDKCBtaWNfcGFkLCA4KTsJCQkJLy8uICBmZWVkICh1cCB0byA4IGJ5dGVzIG9mKSB2aXJ0dWFsIHBhZGRpbmcgdG8gTUlDIGVuZ2luZQorCQkJCQkJCQkJCQkJLy8uICB3cml0ZSAocG9zc2libHkpIHRyYWlsaW5nIGJ5dGUgKyAobW9zdCBvZikgTUlDCisJCXB1dF9mcmFnKCBpZmJwLCAod2NpX2J1ZnApaWZicC0+SUZCX01JQ1R4LCA4IEJFX1BBUigwKSApOworCX0KKyNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKKwlwdXRfZnJhZyggaWZicCwgbnVsbF9hZGRyLCAxIEJFX1BBUigwKSApOwkvL3dyaXRlIChwb3NzaWJseSkgdHJhaWxpbmcgZGF0YSBvciBNSUMgYnl0ZQorfSAvLyBwdXRfZnJhZ19maW5hbGl6ZQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouU1VCTU9EVUxFCQlpbnQgcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICkKKyouUFVSUE9TRQkJc3VwcG9ydCByb3V0aW5lIHRvIGhhbmRsZSB0aGUgImJhc2ljIiB0YXNrIG9mIGhjZl9wdXRfaW5mbyB0byBwYXNzIFJJRHMgdG8gdGhlIE5JQy4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKglsdHZwCQlhZGRyZXNzIGluIE5JQyBSQU0gd2hlcmUgTFZULXJlY29yZHMgYXJlIGxvY2F0ZWQKKyoKKyouUkVUVVJOUworKglIQ0ZfU1VDQ0VTUworKgk+PnB1dF9mcmFnCisqCT4+Y21kX3dhaXQKKyoKKyouREVTQ1JJUFRJT04KKyoKKyoKKyouRElBR1JBTQorKjIwOiBkbyBub3Qgd3JpdGUgUklEcyB0byBOSUNzIHdoaWNoIGhhdmUgaW5jb21wYXRpYmxlIEZpcm13YXJlCisqMjQ6IElmIHRoZSBSSUQgZG9lcyBub3QgZXhpc3QsIHRoZSBMLWZpZWxkIGlzIHNldCB0byB6ZXJvLgorKglOb3RlIHRoYXQgc29tZSBSSURzIGNhbiBub3QgYmUgcmVhZCwgZS5nLiB0aGUgcHNldWRvIFJJRHMgZm9yIGRpcmVjdCBIZXJtZXMgY29tbWFuZHMgYW5kIENGR19ERUZBVUxUX0tFWVMKKyoyODogSWYgdGhlIFJJRCBpcyB3cml0dGVuIHN1Y2Nlc3NmdWwsIHBhc3MgaXQgdG8gdGhlIE5JQyBieSBtZWFucyBvZiBhbiBBY2Nlc3MgV3JpdGUgY29tbWFuZAorKgorKi5OT1RJQ0UKKyoJVGhlIG1lY2hhbmlzbSB0byBIQ0ZfQVNTRVJUIG9uIGludmFsaWQgdHlwLWNvZGVzIGluIHRoZSBMVFYgcmVjb3JkIGlzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3k6CisqCSAgLQlzb21lIGNvZGVzIChlLmcuIENGR19SRUdfTUIpIGFyZSBleHBsaWNpdGx5IGhhbmRsZWQgYnkgdGhlIEhDRiB3aGljaCBpbXBsaWVzIHRoYXQgdGhlc2UgY29kZXMKKyoJCWFyZSB2YWxpZC4gVGhlc2UgY29kZXMgYXJlIGFscmVhZHkgY29uc3VtZWQgYnkgaGNmX3B1dF9pbmZvLgorKgkgIC0gYWxsIG90aGVyIGNvZGVzIGFyZSBwYXNzZWQgdG8gdGhlIEhlcm1lcy4gQmVmb3JlIHRoZSBwdXQgYWN0aW9uIGlzIGV4ZWN1dGVkLCBoY2ZfZ2V0X2luZm8gaXMgY2FsbGVkCisqCQl3aXRoIGFuIExUViByZWNvcmQgd2l0aCBhIHZhbHVlIG9mIDEgaW4JdGhlIEwtZmllbGQgYW5kIHRoZSBpbnRlbmRlZCBwdXQgYWN0aW9uIHR5cGUgaW4gdGhlIFR5cC1jb2RlCisqCQlmaWVsZC4gSWYgdGhlIHB1dCBhY3Rpb24gdHlwZSBpcyB2YWxpZCwgaXQgaXMgYWxzbyB2YWxpZCBhcyBhIGdldCBhY3Rpb24gdHlwZSBjb2RlIC0gZXhjZXB0CisqCQlmb3IgQ0ZHX0RFRkFVTFRfS0VZUyBhbmQgQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZIC0gc28gdGhlIEhDRl9BU1NFUlQgbG9naWMgb2YgaGNmX2dldF9pbmZvIHNob3VsZAorKgkJbm90IGNhdGNoLgorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgaW50CitwdXRfaW5mbyggSUZCUCBpZmJwLCBMVFZQIGx0dnAJKQoreworCitpbnQgcmMgPSBIQ0ZfU1VDQ0VTUzsKKworCUhDRkFTU0VSVCggaWZicC0+SUZCX0NhcmRTdGF0ID09IDAsIE1FUkdFXzIoIGx0dnAtPnR5cCwgaWZicC0+SUZCX0NhcmRTdGF0ICkgKQorCUhDRkFTU0VSVCggQ0ZHX1JJRF9DRkdfTUlOIDw9IGx0dnAtPnR5cCAmJiBsdHZwLT50eXAgPD0gQ0ZHX1JJRF9DRkdfTUFYLCBsdHZwLT50eXAgKQorCisJaWYgKCBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCAmJgkJCQkJCQkJCQkJCQkJCQkvKiAyMCovCisJCSAoICggQ0ZHX1JJRF9DRkdfTUlOIDw9IGx0dnAtPnR5cCAgICAmJiBsdHZwLT50eXAgPD0gQ0ZHX1JJRF9DRkdfTUFYICkgfHwKKwkJICAgKCBDRkdfUklEX0VOR19NSU4gPD0gbHR2cC0+dHlwIC8qICYmIGx0dnAtPnR5cCA8PSAweEZGRkYgKi8gICAgICAgKSAgICAgKSApIHsKKyNpZiBIQ0ZfQVNTRVJUIC8vRkNDOCwgRkNCMCwgRkNCNCwgRkNCNiwgRkNCNywgRkNCOCwgRkNDMCwgRkNDNCwgRkNCQywgRkNCRCwgRkNCRSwgRkNCRgorIHsKKyBoY2ZfMTYJCXQgPSBsdHZwLT50eXA7CisgTFRWX1NUUkNUIAl4ID0geyAyLCB0LCB7MH0gfTsJCQkJCQkJCQkJCQkJCQkvKjI0Ki8KKwloY2ZfZ2V0X2luZm8oIGlmYnAsIChMVFZQKSZ4ICk7CisJaWYgKCB4LmxlbiA9PSAwICYmCisJCSAoIHQgIT0gQ0ZHX0RFRkFVTFRfS0VZUyAmJiB0ICE9IENGR19BRERfVEtJUF9ERUZBVUxUX0tFWSAmJiB0ICE9IENGR19SRU1PVkVfVEtJUF9ERUZBVUxUX0tFWSAmJgorCQkgICB0ICE9IENGR19BRERfVEtJUF9NQVBQRURfS0VZICYmIHQgIT0gQ0ZHX1JFTU9WRV9US0lQX01BUFBFRF9LRVkgJiYKKwkJICAgdCAhPSBDRkdfSEFORE9WRVJfQUREUiAmJiB0ICE9IENGR19ESVNBU1NPQ0lBVEVfQUREUiAmJgorCQkgICB0ICE9IENGR19GQ0JDICYmIHQgIT0gQ0ZHX0ZDQkQgJiYgdCAhPSBDRkdfRkNCRSAmJiB0ICE9IENGR19GQ0JGICYmCisJCSAgIHQgIT0gQ0ZHX0RFQVVUSEVOVElDQVRFX0FERFIKKwkJICkKKwkJKSB7CisJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBsdHZwLT50eXAgKQorCQl9CisgfQorI2VuZGlmIC8vIEhDRl9BU1NFUlQKKworCQlyYyA9IHNldHVwX2JhcCggaWZicCwgbHR2cC0+dHlwLCAwLCBJT19PVVQgKTsKKwkJcHV0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcClsdHZwLCAyKmx0dnAtPmxlbiArIDIgQkVfUEFSKDIpICk7CisvKjI4Ki8JaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJCXJjID0gY21kX2V4ZSggaWZicCwgSENNRF9BQ0NFU1MgKyBIQ01EX0FDQ0VTU19XUklURSwgbHR2cC0+dHlwICk7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfSAvLyBwdXRfaW5mbworCisKKyNpZiAoSENGX0RMX09OTFkpID09IDAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouU1VCTU9EVUxFCQlpbnQgcHV0X2luZm9fbWIoIElGQlAgaWZicCwgQ0ZHX01CX0lORk9fU1RSQ1QgRkFSICogbHR2cCApCisqLlBVUlBPU0UJIAlhY2N1bXVsYXRlcyBhICggc2VyaWVzIG9mKSBidWZmZXJzIGludG8gYSBzaW5nbGUgSW5mbyBibG9jayBpbnRvIHRoZSBNYWlsQm94LgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCWx0dnAJCWFkZHJlc3Mgb2Ygc3RydWN0dXJlIHNwZWNpZnlpbmcgdGhlICJ0eXBlIiBhbmQgdGhlIGZyYWdtZW50cyBvZiB0aGUgaW5mb3JtYXRpb24gdG8gYmUgc3ludGhlc2l6ZWQKKyoJCQkJYXMgYW4gTFRWIGludG8gdGhlIE1haWxCb3gKKyoKKyouUkVUVVJOUworKgorKi5ERVNDUklQVElPTgorKiBJZiB0aGUgZGF0YSBkb2VzIG5vdCBmaXQgKGluY2x1ZGluZyBubyBNYWlsQm94IGlzIGF2YWlsYWJsZSksIHRoZSBJRkJfTUJUYWxseSBpcyBpbmNyZW1lbnRlZCBhbmQgYW4KKyogZXJyb3Igc3RhdHVzIGlzIHJldHVybmVkLgorKiBIQ0ZfQVNTRVJUIGRvZXMgbm90IGNhdGNoLgorKiBDYWxsaW5nIHB1dF9pbmZvX21iIHdoZW4gdGhlaXIgaXMgbm8gTWFpbEJveCBhdmFpbGFibGUsIGlzIGNvbnNpZGVyZWQgYSBkZXNpZ24gZXJyb3IgaW4gdGhlIE1TRi4KKyoKKyogTm90ZSB0aGF0IHRoZXJlIGlzIGFsd2F5cyBhdCBsZWFzdCAxIHdvcmQgb2YgdW51c2VkIHNwYWNlIGluIHRoZSBtYWlsIGJveC4KKyogQXMgYSBjb25zZXF1ZW5jZToKKyogLSBubyBwcm9ibGVtIGluIHBvaW50ZXIgYXJpdGhtZXRpYyAoTUJfUlAgPT0gTUJfV1AgbWVhbnMgdW5hbWJpZ3VvdXNseSBtYWlsIGJveCBpcyBjb21wbGV0ZWx5IGVtcHR5CisqIC0gVGhlcmUgaXMgYWx3YXlzIGZyZWUgc3BhY2UgdG8gd3JpdGUgYW4gTCBmaWVsZCB3aXRoIGEgdmFsdWUgb2YgemVybyBhZnRlciBlYWNoIE1CX0luZm8gYmxvY2suICBUaGlzCisqICAgYWxsb3dzIGZvciBhbiBlYXN5IHNjYW4gbWVjaGFuaXNtIGluIHRoZSAiZ2V0IE1CX0luZm8gYmxvY2siIGxvZ2ljLgorKgorKgorKi5ESUFHUkFNCisqMToJQ2FsY3VsYXRlIEwgZmllbGQgb2YgdGhlIE1CSUIsIGkuZS4gMSBmb3IgdGhlIFQtZmllbGQgKyB0aGUgY3VtdWxhdGl2ZSBsZW5ndGggb2YgdGhlIGZyYWdtZW50cy4KKyoyOglUaGUgZnJlZSBzcGFjZSBpbiB0aGUgTWFpbEJveCBpcyBjYWxjdWxhdGVkICgyYTogZnJlZSBwYXJ0IGZyb20gV3JpdGUgUHRyIHRvIFJlYWQgUHRyLCAyYjogZnJlZSBwYXJ0CisqCXR1cm5zIG91dCB0byB3cmFwIGFyb3VuZCkgLiBJZiB0aGlzIHNwYWNlIHN1ZmZpY2VzIHRvIHN0b3JlIHRoZSBudW1iZXIgb2Ygd29yZHMgcmVmbGVjdGVkIGJ5IGxlbiAoVC1maWVsZAorKgkrIFZhbHVlLWZpZWxkKSBwbHVzIHRoZSBhZGRpdGlvbmFsIE1haWxCb3ggSW5mbyBMLWZpZWxkICsgYSB0cmFpbGluZyAwIHRvIGFjdCBhcyB0aGUgTC1maWVsZCBvZiBhIHRyYWlsaW5nCisqCWR1bW15IG9yIGVtcHR5IExUViByZWNvcmQsIHRoZW4gYSBNYWlsQm94IEluZm8gYmxvY2sgaXMgYnVpbGQgaW4gdGhlIE1haWxCb3ggY29uc2lzdGluZyBvZgorKgkgIC0gdGhlIHZhbHVlIGxlbiBpbiB0aGUgZmlyc3Qgd29yZAorKgkgIC0gdHlwZSBpbiB0aGUgc2Vjb25kIHdvcmQKKyoJICAtIGEgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGZyYWdtZW50cyBpbiB0aGUgc2Vjb25kIGFuZCBoaWdoZXIgd29yZAorKgorKjQ6CVNpbmNlIHB1dF9pbmZvX21iKCkgY2FuIG1vcmUgb3IgbGVzcyBkaXJlY3RseSBiZSBjYWxsZWQgZnJvbSB0aGUgTVNGIGxldmVsLCB0aGUgSS9GIG11c3QgYmUgcm9idXN0CisqCWFnYWluc3Qgb3V0LW9mLXJhbmdlIHZhcmlhYmxlcy4gQXMgZmFpbHNhZmUgY29kaW5nLCB0aGUgTUIgdXBkYXRlIGlzIHNraXBwZWQgYnkgY2hhbmdpbmcgdGxlbiB0byAwIGlmCisqCWxlbiA9PSAwOyBUaGlzIHdpbGwgaW5kaXJlY3RseSBjYXVzZSBhbiBhc3NlcnQgYXMgcmVzdWx0IG9mIHRoZSB2aW9sYXRpb24gb2YgdGhlIG5leHQgaWYgY2xhdXNlLgorKjY6CUNoZWNrIHdoZXRoZXIgdGhlIGZyZWUgc3BhY2UgaW4gTWFpbEJveCBzdWZmaWNlcyAodGhpcyBjb3ZlcnMgdGhlIGNvbXBsZXRlIGFic2VuY2Ugb2YgdGhlIE1haWxCb3gpLgorKglOb3RlIHRoYXQgbGVuIGlzIHVuc2lnbmVkLCBzbyBldmVuIE1TRiBJL0YgdmlvbGF0aW9uIHdvcmtzIG91dCBPLksuCisqCVRoZSAnMicgaW4gdGhlIGV4cHJlc3Npb24gImxlbisyIiBpcyB1c2VkIGJlY2F1c2UgMSB3b3JkIGlzIG5lZWRlZCBmb3IgTCBpdHNlbGYgYW5kIDEgd29yZCBpcyBuZWVkZWQKKyoJZm9yIHRoZSB6ZXJvLXNlbnRpbmVsCisqODoJdXBkYXRlIE1haWxCb3ggSW5mbyBsZW5ndGggcmVwb3J0IHRvIE1TRiB3aXRoICJvbGRlc3QiIE1CIEluZm8gQmxvY2sgc2l6ZS4gQmUgY2FyZWZ1bGwgaGVyZSwgaWYgeW91IGdldAorKgloZXJlIGJlZm9yZSB0aGUgTWFpbEJveCBpcyByZWdpc3RlcmVkLCB5b3UgY2FuJ3QgcmVhZCBmcm9tIHRoZSBidWZmZXIgYWRkcmVzc2VkIGJ5IElGQl9NQnAgKGl0IGlzIHRoZQorKglOdWxsIGJ1ZmZlcikgc28gZG9uJ3QgbW92ZSB0aGlzIGNvZGUgdGlsbCB0aGUgZW5kIG9mIHRoaXMgcm91dGluZSBidXQga2VlcCBpdCB3aGVyZSB0aGVyZSBpcyBnYXJ1YW50ZWVkCisqCWEgYnVmZmVyLgorKgorKi5OT1RJQ0UKKyoJYm91bmRhcnkgdGVzdGluZyBkZXBlbmRzIG9uIHRoZSBmYWN0IHRoYXQgSUZCX01CU2l6ZSBpcyBndWFyYW50ZWVkIHRvIGJlIHplcm8gaWYgbm8gTWFpbEJveCBpcyBwcmVzZW50LAorKglhbmQgdG8gYSBsZXNzZXIgZGVncmVlLCB0aGF0IElGQl9NQldwID0gSUZCX01CUnAgPSAwCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKKworSENGX1NUQVRJQyBpbnQKK3B1dF9pbmZvX21iKCBJRkJQIGlmYnAsIENGR19NQl9JTkZPX1NUUkNUIEZBUiAqIGx0dnAgKQoreworCitpbnQJCQlyYyA9IEhDRl9TVUNDRVNTOworaGNmXzE2CQlpOwkJCQkJCS8vd29yayBjb3VudGVyCitoY2ZfMTYJCSpkcDsJCQkJCS8vZGVzdGluYXRpb24gcG9pbnRlciAoaW4gTWFpbEJveCkKK3djaV9yZWNvcmRwCXNwOwkJCQkJCS8vc291cmNlIHBvaW50ZXIKK2hjZl8xNgkJbGVuOwkJCQkJLy90b3RhbCBsZW5ndGggdG8gY29weSB0byBNYWlsQm94CitoY2ZfMTYJCXRsZW47CQkJCQkvL2ZyZWUgbGVuZ3RoL3dvcmtpbmcgbGVuZ3RoL29mZnNldCBpbiBXTVAgZnJhbWUKKworCWlmICggaWZicC0+SUZCX01CcCA9PSBOVUxMICkgcmV0dXJuIHJjOyAgLy87P25vdCBzdWZmaWNpZW50CisJSENGQVNTRVJUKCBpZmJwLT5JRkJfTUJwICE9IE5VTEwsIDAgKQkJCQkJLy8hISFiZSBjYXJlZnVsLCBkb24ndCBnZXQgaW50byBhbiBlbmRsZXNzIHJlY3Vyc2lvbgorCUhDRkFTU0VSVCggaWZicC0+SUZCX01CU2l6ZSwgMCApCisKKwlsZW4gPSAxOwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLyogMSAqLworCWZvciAoIGkgPSAwOyBpIDwgbHR2cC0+ZnJhZ19jbnQ7IGkrKyApIHsKKwkJbGVuICs9IGx0dnAtPmZyYWdfYnVmW2ldLmZyYWdfbGVuOworCX0KKwlpZiAoIGlmYnAtPklGQl9NQlJwID4gaWZicC0+SUZCX01CV3AgKSB7CisJCXRsZW4gPSBpZmJwLT5JRkJfTUJScCAtIGlmYnAtPklGQl9NQldwOwkJCQkJCQkJCQkJCQkJCS8qIDJhKi8KKwl9IGVsc2UgeworCQlpZiAoIGlmYnAtPklGQl9NQlJwID09IGlmYnAtPklGQl9NQldwICkgeworCQkJaWZicC0+SUZCX01CUnAgPSBpZmJwLT5JRkJfTUJXcCA9IDA7CS8vIG9wdGltaXplIFdyYXBwaW5nCisJCX0KKwkJdGxlbiA9IGlmYnAtPklGQl9NQlNpemUgLSBpZmJwLT5JRkJfTUJXcDsJCQkJCQkJCQkJCQkJCS8qIDJiKi8KKwkJaWYgKCAoIHRsZW4gPD0gbGVuICsgMiApICYmICggbGVuICsgMiA8IGlmYnAtPklGQl9NQlJwICkgKSB7CS8vaWYgdHJhaWxpbmcgc3BhY2UgaXMgdG9vIHNtYWxsIGJ1dAorCQkJCQkJCQkJCQkJCQkJCQkvLwkgbGVhZGluZyBzcGFjZSBpcyBzdWZmaWNpZW50bHkgbGFyZ2UKKwkJCWlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CV3BdID0gMHhGRkZGOwkJCQkJLy9mbGFnIGR1bW15IExUViB0byBmaWxsIHRoZSB0cmFpbGluZyBzcGFjZQorCQkJaWZicC0+SUZCX01CV3AgPSAwOwkJCQkJCQkJCQkvL3Jlc2V0IFdyaXRlUG9pbnRlciB0byBiZWdpbiBvZiBNYWlsQm94CisJCQl0bGVuID0gaWZicC0+SUZCX01CUnA7CQkJCQkJCQkJLy9nZXQgbmV3IGF2YWlsYWJsZSBzcGFjZSBzaXplCisJCX0KKwl9CisJZHAgPSAmaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJXcF07CisJaWYgKCBsZW4gPT0gMCApIHsKKwkJdGxlbiA9IDA7IC8vOz8gd2hhdCBpcyB0aGlzIGdvb2QgZm9yCisJfQorCWlmICggbGVuICsgMiA+PSB0bGVuICl7CQkJCQkJCQkJCQkJCQkJCQkJCQkvKiA2ICovCisJCS8vRG8gTm90IEFTU0VSVCwgdGhpcyBpcyBhIG5vcm1hbCBjb25kaXRpb24KKwkJSUZfVEFMTFkoIGlmYnAtPklGQl9IQ0ZfVGFsbGllcy5Ob0J1Zk1CKys7ICkgLypOT1AgdG8gY292ZXIgYWdhaW5zdCBhbmFsb21pZXMgd2l0aCBlbXB0eSBjb21wb3VuZCovOworCQlyYyA9IEhDRl9FUlJfTEVOOworCX0gZWxzZSB7CisJCSpkcCsrID0gbGVuOwkJCQkJCQkJCS8vd3JpdGUgTGVuICg9IHNpemUgb2YgVCtWIGluIHdvcmRzIHRvIE1CX0luZm8gYmxvY2sKKwkJKmRwKysgPSBsdHZwLT5iYXNlX3R5cDsJCQkJCQkJLy93cml0ZSBUeXBlIHRvIE1CX0luZm8gYmxvY2sKKwkJaWZicC0+SUZCX01CV3AgKz0gbGVuICsgMTsJCQkJCQkvL3VwZGF0ZSBXcml0ZVBvaW50ZXIgb2YgTWFpbEJveAorCQlmb3IgKCBpID0gMDsgaSA8IGx0dnAtPmZyYWdfY250OyBpKysgKSB7CQkJCS8vIHByb2Nlc3MgZWFjaCBvZiB0aGUgZnJhZ21lbnRzCisJCQlzcCA9IGx0dnAtPmZyYWdfYnVmW2ldLmZyYWdfYWRkcjsKKwkJCWxlbiA9IGx0dnAtPmZyYWdfYnVmW2ldLmZyYWdfbGVuOworCQkJd2hpbGUgKCBsZW4tLSApICpkcCsrID0gKnNwKys7CisJCX0KKwkJaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJXcF0gPSAwOwkJCQkvL3RvIGFzc3VyZSBnZXRfaW5mbyBmb3IgQ0ZHX01CX0lORk8gc3RvcHMKKwkJaWZicC0+SUZCX01CSW5mb0xlbiA9IGlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CUnBdOwkJCQkJCQkJCQkJLyogOCAqLworCX0KKwlyZXR1cm4gcmM7Cit9IC8vIHB1dF9pbmZvX21iCisKKyNlbmRpZiAvLyBIQ0ZfRVhUX01CCisjZW5kaWYgLy8gSENGX0RMX09OTFkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLlNVQk1PRFVMRQkJaW50IHNldHVwX2JhcCggSUZCUCBpZmJwLCBoY2ZfMTYgZmlkLCBpbnQgb2Zmc2V0LCBpbnQgdHlwZSApCisqLlBVUlBPU0UJCXNldCB1cCBkYXRhIGFjY2VzcyB0byBOSUMgUkFNIHZpYSBCQVBfMS4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCQlhZGRyZXNzIG9mIEkvRiBCbG9jaworKglmaWQJCQkJRklEL1JJRAorKglvZmZzZXQJCQkhIWV2ZW4hISBvZmZzZXQgaW4gRklEL1JJRAorKgl0eXBlCQkJSU9fSU4sIElPX09VVAorKgorKi5SRVRVUk5TCisqCUhDRl9TVUNDRVNTCQkJCQlPLksKKyoJSENGX0VSUl9OT19OSUMJCQkJY2FyZCBpcyByZW1vdmVkCisqCUhDRl9FUlJfREVGVU5DVF9USU1FX09VVAlGYXRhbCBtYWxmdW5jdGlvbiBkZXRlY3RlZAorKglIQ0ZfRVJSX0RFRlVOQ1RfLi4uLi4JCWlmIGFuZCBvbmx5IGlmIElGQl9EZWZ1bmN0U3RhdCA8PiAwCisqCisqLkRFU0NSSVBUSU9OCisqCisqIEEgbm9uLXplcm8gcmV0dXJuIHN0YXR1cyBpbmRpY2F0ZXM6CisqIC0gdGhlIE5JQyBpcyBjb25zaWRlcmVkIG5vbm9wZXJhdGlvbmFsLCBlLmcuIGR1ZSB0byBhIHRpbWUtb3V0IG9mIHNvbWUgSGVybWVzIGFjdGl2aXR5IGluIHRoZSBwYXN0CisqIC0gQkFQXzEgY291bGQgbm90IHByb3Blcmx5IGJlIGluaXRpYWxpemVkCisqIC0gdGhlIGNhcmQgaXMgcmVtb3ZlZCBiZWZvcmUgY29tcGxldGlvbiBvZiB0aGUgZGF0YSB0cmFuc2ZlcgorKiBJbiBhbGwgb3RoZXIgY2FzZXMsIGEgemVybyBpcyByZXR1cm5lZC4KKyogQkFQIEluaXRpYWxpemF0aW9uIGZhaWx1cmUgaW5kaWNhdGVzIGFuIEgvVyBlcnJvciB3aGljaCBpcyB2ZXJ5IGxpa2VseSB0byBzaWduYWwgY29tcGxldGUgSC9XIGZhaWx1cmUuCisqIE9uY2UgYSBCQVAgSW5pdGlhbGl6YXRpb24gZmFpbHVyZSBoYXMgb2NjdXJyZWQgYWxsIHN1YnNlcXVlbnQgaW50ZXJhY3Rpb25zIHdpdGggdGhlIEhlcm1lcyB3aWxsIHJldHVybiBhCisqICJkZWZ1bmN0IiBzdGF0dXMgdGlsbCB0aGUgSGVybWVzIGlzIHJlLWluaXRpYWxpemVkIGJ5IG1lYW5zIG9mIGFuIGhjZl9jb25uZWN0LgorKgorKiBBIEJBUCBpcyBhIHNldCBvZiByZWdpc3RlcnMgKE9mZnNldCwgU2VsZWN0IGFuZCBEYXRhKSBvZmZlcmluZyByZWFkL3dyaXRlIGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgRklEIG9yCisqIFJJRC4gVGhpcyBhY2Nlc3MgaXMgYmFzZWQgb24gYSBhdXRvLWluY3JlbWVudCBmZWF0dXJlLgorKiBUaGVyZSBhcmUgdHdvIEJBUHMgYnV0IHRoZXNlIGRheXMgdGhlIEhDRiB1c2VzIG9ubHkgQkFQXzEgYW5kIGxlYXZlcyBCQVBfMCB0byB0aGUgUENJIEJ1c21hc3RlcmluZyBIL1cuCisqCisqIFRoZSBCQVAtbWVjaGFuaXNtIGlzIGJhc2VkIG9uIHRoZSBCdXN5IGJpdCBpbiB0aGUgT2Zmc2V0IHJlZ2lzdGVyIChzZWUgdGhlIEhlcm1lcyBkZWZpbml0aW9uKS4gVGhlIHdhaXRpbmcKKyogZm9yIEJ1c3kgbXVzdCBvY2N1ciBiZXR3ZWVuIHdyaXRpbmcgdGhlIE9mZnNldCByZWdpc3RlciBhbmQgYWNjZXNzaW5nIHRoZSBEYXRhIHJlZ2lzdGVyLiBUaGUKKyogaW1wbGVtZW50YXRpb24gdG8gd2FpdCBmb3IgdGhlIEJ1c3kgYml0IGRyb3AgYWZ0ZXIgZWFjaCB3cml0ZSB0byB0aGUgT2Zmc2V0IHJlZ2lzdGVyLCBpbXBsaWVzIHRoYXQgdGhlCisqIHJlcXVpcmVtZW50IHRoYXQgdGhlIEJ1c3kgYml0IGlzIGxvdyAgYmVmb3JlIHRoZSBTZWxlY3QgcmVnaXN0ZXIgaXMgd3JpdHRlbiwgaXMgYXV0b21hdGljYWxseSBtZXQuCisqIEJBUC1zZXR1cCBtYXkgYmUgdGltZSBjb25zdW1pbmcgKGUuZy4gMzgwIHVzZWMgZm9yIGxhcmdlIG9mZnNldHMgb2NjdXJzIGZyZXF1ZW50bHkpLiBUaGUgd2FpdCBmb3IgQnVzeSBiaXQKKyogZHJvcCBpcyBwcm90ZWN0ZWQgYnkgYSBsb29wIGNvdW50ZXIsIHdoaWNoIGlzIGluaXRpYWxpemVkIHdpdGggSUZCX1RpY2tJbmksIHdoaWNoIGlzIGNhbGlicmF0ZWQgaW4gaW5pdC4KKyoKKyogVGhlIE5JQyBJL0YgaXMgb3B0aW1pemVkIGZvciB3b3JkIHRyYW5zZmVyIGFuZCBjYW4gb25seSBoYW5kbGUgd29yZCB0cmFuc2ZlciBhdCBhIHdvcmQgYm91bmRhcnkgaW4gTklDCisqIFJBTS4gVGhlIGludGVuZGVkIHNvbHV0aW9uIGZvciB0cmFuc2ZlciBvZiBhIHNpbmdsZSBieXRlIGhhcyBtdWx0aXBsZSBIL1cgZmxhd3MuIFRoZXJlIGhhdmUgYmVlbiBkaWZmZXJlbnQKKyogUy9XIFdvcmthcm91bmQgc3RyYXRlZ2llcy4gUklEIGFjY2VzcyBpcyBoY2ZfMTYgYmFzZWQgYnkgIm5hdHVyZSIsIHNvIG5vIGJ5dGUgYWNjZXNzIHByb2JsZW1zLiAgRm9yIFR4L1J4CisqIEZJRCBhY2Nlc3MsICB0aGUgYnl0ZSBsb2dpYyBiZWNhbWUgb2Jzb2xldGUgYnkgYWJzb3JiaW5nIGl0IGluIHRoZSBkb3VibGUgd29yZCBvcmllbnRlZCBuYXR1cmUgb2YgdGhlIE1JQworKiBmZWF0dXJlLgorKgorKgorKi5ESUFHUkFNCisqCisqMjoJdGhlIHRlc3Qgb24gcmMgY2hlY2tzIHdoZXRoZXIgdGhlIEhDRiB3ZW50IGludG8gImRlZnVuY3QiIG1vZGUgKCBlLmcuIEJBUCBpbml0aWFsaXphdGlvbiBvciBhIGNhbGwgdG8KKyoJY21kX3dhaXQgZGlkIGV2ZXIgZmFpbCkuCisqNDoJdGhlIHNlbGVjdCByZWdpc3RlciBhbmQgb2Zmc2V0IHJlZ2lzdGVyIGFyZSBzZXQKKyoJdGhlIG9mZnNldCByZWdpc3RlciBpcyBtb25pdG9yZWQgdGlsbCBhIHN1Y2Nlc3NmdWwgY29uZGl0aW9uIChubyBidXN5IGJpdCkgaXMgZGV0ZWN0ZWQgb3IgdGlsbCB0aGUKKyoJKGNhbGlicmF0ZWQpIHByb3RlY3Rpb24gY291bnRlciBleHBpcmVzCisqCUlmIHRoZSBjb3VudGVyIGV4cGlyZXMsIHRoaXMgaXMgcmVmbGVjdGVkIGluIElGQl9EZWZ1bmN0U3RhdCwgc28gYWxsIHN1YnNlcXVlbnQgY2FsbHMgdG8gc2V0dXBfYmFwIGZhaWwKKyoJaW1tZWRpYXRlbHkgKCBzZWUgMikKKyo2Oglpbml0aWFsaXphdGlvbiBvZiB0aGUgY2FycnkgYXMgdXNlZCBieSBwZXQvZ2V0X2ZyYWcKKyo4OglIUkVHX09GRlNFVF9FUlIgaXMgaWdub3JlZCBhcyBlcnJvciBiZWNhdXNlOgorKgkgYTogdGhlIEhlcm1lcyBpcyByb2J1c3QgYWdhaW5zdCBpdAorKgkgYjogaXQgaXMgbm90IGtub3duIHdoYXQgY2F1c2VzIGl0IChwcm9iYWJseSBhIGJ1ZyksIGhlbmNlIG5vIHN0cmF0ZWd5IGNhbiBiZSBzcGVjaWZpZWQgd2hpY2ggbGV2ZWwgaXMKKyoJCXRvIGhhbmRsZSB0aGlzIGVycm9yIGluIHdoaWNoIHdheS4gSW4gdGhlIHBhc3QsIGl0IGNvdWxkIGJlIGluZHVjZWQgYnkgdGhlIE1TRiBsZXZlbCwgZS5nLiBieSBjYWxsaW5nCisqCQloY2ZfcmN2X21zZyB3aGlsZSB0aGVyZSB3YXMgbm8gUngtRklEIGF2YWlsYWJsZS4gU2luY2UgdGhpcyBpcyBhbiBNU0YtZXJyb3Igd2hpY2ggaXMgY2F1Z2h0IGJ5IEFTU0VSVCwKKyoJCXRoZXJlIGlzIG5vIHJ1bi10aW1lIGFjdGlvbiByZXF1aXJlZCBieSB0aGUgSENGLgorKglMdW1waW5nIHRoZSBPZmZzZXQgZXJyb3IgaW4gd2l0aCB0aGUgQnVzeSBiaXQgZXJyb3IsIGFzIGhhcyBiZWVuIGRvbmUgaW4gdGhlIHBhc3QgdHVybnMgb3V0IHRvIGJlIGEKKyoJZGlzYXN0ZXIgb3IgYSBsaWZlIHNhdmVyLCBqdXN0IGRlcGVuZGluZyBvbiB3aGF0IHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgaXMuIFNpbmNlIG5vIHByZWRpY3Rpb24gY2FuIGJlCisqCWRvbmUgYWJvdXQgdGhlIGZ1dHVyZSwgaXQgaXMgImZlbHQiIHRvIGJlIHRoZSBiZXN0IHN0cmF0ZWd5IHRvIGlnbm9yZSB0aGlzIGVycm9yLiBPbmUgZGF5IHRoZSBjb2RlIHdhcworKglhY2NvbXBhbmllZCBieSB0aGUgZm9sbG93aW5nIGNvbW1lbnQ6CisqCS8vCWlnbm9yZSBIUkVHX09GRlNFVF9FUlIsIHNvbWVvbmUsIHN1cHBvc2VkbHkgdGhlIE1TRiBwcm9ncmFtbWVyIDspIG1hZGUgYSBidWcuIFNpbmNlIHdlIGRvbid0IGtub3cKKyoJLy8Jd2hhdCBpcyBnb2luZyBvbiwgd2UgbWlnaHQgYXMgd2VsbCBnbyBvbiAtIHVuZGVyIG1hbmFnZW1lbnQgcHJlc3N1cmUgLSBieSBpZ25vcmluZyBpdAorKgorKi5FTkRET0MgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQ0ZfU1RBVElDIGludAorc2V0dXBfYmFwKCBJRkJQIGlmYnAsIGhjZl8xNiBmaWQsIGludCBvZmZzZXQsIGludCB0eXBlICkKK3sKK1BST1RfQ05UX0lOSQoraW50CXJjOworCisJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9TVFJJTyApOworCWlmICggKCByYyA9IGlmYnAtPklGQl9EZWZ1bmN0U3RhdCApID09IEhDRl9TVUNDRVNTICkgewkJCQkJCQkJCQkvKjIqLworCQlPUFcoIEhSRUdfU0VMRUNUXzEsIGZpZCApOwkJCQkJCQkJCQkJCQkJCQkvKjQqLworCQlPUFcoIEhSRUdfT0ZGU0VUXzEsIG9mZnNldCApOworCQlpZiAoIHR5cGUgPT0gSU9fSU4gKSB7CisJCQlpZmJwLT5JRkJfQ2FycnlJbiA9IDA7CisJCX0KKwkJZWxzZSBpZmJwLT5JRkJfQ2FycnlPdXQgPSAwOworCQlIQ0ZfV0FJVF9XSElMRSggSVBXKCBIUkVHX09GRlNFVF8xKSAmIEhDTURfQlVTWSApOworCQlIQ0ZBU1NFUlQoICEoIElQVyggSFJFR19PRkZTRVRfMSkgJiBIUkVHX09GRlNFVF9FUlIgKSwgTUVSR0VfMiggZmlkLCBvZmZzZXQgKSApCQkJLyo4Ki8KKwkJaWYgKCBwcm90X2NudCA9PSAwICkgeworCQkJSENGQVNTRVJUKCBET19BU1NFUlQsIE1FUkdFXzIoIGZpZCwgb2Zmc2V0ICkgKQorCQkJcmMgPSBpZmJwLT5JRkJfRGVmdW5jdFN0YXQgPSBIQ0ZfRVJSX0RFRlVOQ1RfVElNRV9PVVQ7CisJCQlpZmJwLT5JRkJfQ2FyZFN0YXQgfD0gQ0FSRF9TVEFUX0RFRlVOQ1Q7CisJCX0KKwl9CisJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9TVFJJTyB8IEhDRl9UUkFDRV9FWElUICk7CisJcmV0dXJuIHJjOworfSAvLyBzZXR1cF9iYXAKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2Q1NzM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmLmgKQEAgLTAsMCArMSw0MDUgQEAKKworLy8gICB2aW06dHc9MTEwOnRzPTQ6CisjaWZuZGVmIEhDRl9ICisjZGVmaW5lIEhDRl9IIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGSUxFCSA6IGhjZi5oCisqCisqIERBVEUgICA6ICREYXRlOiAyMDA0LzA4LzA1IDExOjQ3OjEwICQgICAkUmV2aXNpb246IDEuNyAkCisqIE9yaWdpbmFsOiAyMDA0LzA1LzE5IDA3OjI2OjAxICAgIFJldmlzaW9uOiAxLjU2ICAgICAgVGFnOiBoY2Y3X3QyMDA0MDYwMl8wMQorKiBPcmlnaW5hbDogMjAwNC8wNS8xMiAwODo0NzoyMyAgICBSZXZpc2lvbjogMS41MyAgICAgIFRhZzogaGNmN190N18yMDA0MDUxM18wMQorKiBPcmlnaW5hbDogMjAwNC8wNC8xNSAwOToyNDo0MiAgICBSZXZpc2lvbjogMS40NiAgICAgIFRhZzogaGNmN190N18yMDA0MDQxNV8wMQorKiBPcmlnaW5hbDogMjAwNC8wNC8wOCAxNToxODoxNiAgICBSZXZpc2lvbjogMS40NSAgICAgIFRhZzogdDdfMjAwNDA0MTNfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDQvMDEgMTU6MzI6NTUgICAgUmV2aXNpb246IDEuNDMgICAgICBUYWc6IHQ3XzIwMDQwNDAxXzAxCisqIE9yaWdpbmFsOiAyMDA0LzAzLzEwIDE1OjM5OjI4ICAgIFJldmlzaW9uOiAxLjM5ICAgICAgVGFnOiB0MjAwNDAzMTBfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDMvMDQgMTE6MDM6MzggICAgUmV2aXNpb246IDEuMzcgICAgICBUYWc6IHQyMDA0MDMwNF8wMQorKiBPcmlnaW5hbDogMjAwNC8wMy8wMiAxNDo1MToyMSAgICBSZXZpc2lvbjogMS4zNSAgICAgIFRhZzogdDIwMDQwMzAyXzAzCisqIE9yaWdpbmFsOiAyMDA0LzAyLzI0IDEzOjAwOjI4ICAgIFJldmlzaW9uOiAxLjI4ICAgICAgVGFnOiB0MjAwNDAyMjRfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDIvMDkgMTQ6NTA6MTQgICAgUmV2aXNpb246IDEuMjYgICAgICBUYWc6IHQyMDA0MDIxOV8wMQorKgorKiBBVVRIT1IgOiBOaWNvIFZhbHN0ZXIKKyoKKyogU1BFQ0lGSUNBVElPTjogLi4uLi4uLi4uLgorKgorKiBERVNDICAgOiBEZWZpbml0aW9ucyBhbmQgUHJvdG90eXBlcyBmb3IgTVNGIGFzIHdlbGwgYXMgSENGIHNvdXJjZXMKKyoKKyoJCSAgIEN1c3RvbWl6YWJsZSB2aWEgSENGQ0ZHLkgKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqIFNPRlRXQVJFIExJQ0VOU0UKKyoKKyogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisqCisqIENPUFlSSUdIVCCpIDE5OTQgLSAxOTk1CWJ5IEFUJlQuCQkJCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKyogQ09QWVJJR0hUIKkgMTk5NiAtIDIwMDAgYnkgTHVjZW50IFRlY2hub2xvZ2llcy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBDT1BZUklHSFQgqSAyMDAxIC0gMjAwNAlieSBBZ2VyZSBTeXN0ZW1zIEluYy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisqCisqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorKiAgICBkaXN0cmlidXRpb24uCisqCisqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKgorKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIERpc2NsYWltZXIKKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorKiBEQU1BR0UuCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlICJoY2ZjZmcuaCIJLy8gU3lzdGVtIENvbnN0YW50cyB0byBiZSBkZWZpbmVkIGJ5IHRoZSBNU0YtcHJvZ3JhbW1lciB0byB0YWlsb3IgdGhlIEhDRgorI2luY2x1ZGUgIm1kZC5oIgkvLyBJbmNsdWRlIGZpbGUgY29tbW9uIGZvciBIQ0YsIE1TRgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1BQ1JPUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMT0YoeCkgCQkJKHNpemVvZih4KS9zaXplb2YoaGNmXzE2KS0xKQorCisvKglFbmRpYW5lc3MKKyAqCUxpdHRsZSBFbmRpYW4gKGEuay5hLiBJbnRlbCksIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QKKyAqCUJpZyBFbmRpYW4gKGEuay5hLiBNb3Rvcm9sYSksIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdAorICoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBzdXBwbGllZAorICogIG8gQ05WX0xJVFRMRV9UT19TSE9SVCh3KQkJCWludGVycHJldHMgdGhlIDE2LWJpdHMgaW5wdXQgdmFsdWUgYXMgTGl0dGxlIEVuZGlhbiwgcmV0dXJucyBhbiBoY2ZfMTYKKyAqIAlvIENOVl9CSUdfVE9fU0hPUlQodykJCQkJaW50ZXJwcmV0cyB0aGUgMTYtYml0cyBpbnB1dCB2YWx1ZSBhcyBCaWcgRW5kaWFuLCByZXR1cm5zIGFuIGhjZl8xNgorICoKKyAqLworCisvKiBUbyBpbmNyZWFzZSBwb3J0YWJpbGl0eSwgdXNlIHVuc2lnbmVkIGNoYXIgYW5kIHVuc2lnbmVkIGNoYXIgKiB3aGVuIGFjY2Vzc2luZyBwYXJ0cyBvZiBsYXJnZXIKKyAqIHR5cGVzIHRvIGNvbnZlcnQgdGhlaXIgRW5kaWFuZXNzCisgKi8KKworI2RlZmluZSBDTlZfRU5EX1NIT1JUKHcpICAoaGNmXzE2KSggKChoY2ZfMTYpKHcpICYgMHgwMEZGKSA8PCA4IHwgKChoY2ZfMTYpKHcpICYgMHhGRjAwKSA+PiA4ICkKKyNkZWZpbmUgQ05WX0VORF9MT05HKGR3KSAgKGhjZl8zMikoIChkdyA+PiAyNCkgfCAoKGR3ID4+IDgpICYgMHhmZjAwKSB8ICgoZHcgPDwgOCkgJiAweGZmMDAwMCkgfCAoZHcgPDwgMjQpICkKKworI2lmIEhDRl9CSUdfRU5ESUFOCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEIgSSBHICAgRSBOIEQgSSBBIE4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBDTlZfTElUVExFX1RPX1NIT1JUKHcpCUNOVl9FTkRfU0hPUlQodykJLy8gICAgZW5kaWFuZXNzIGNvbnZlcnNpb24gbmVlZGVkCisjZGVmaW5lIENOVl9CSUdfVE9fU0hPUlQodykJCSh3KQkJCQkvLyBubyBlbmRpYW5lc3MgY29udmVyc2lvbiBuZWVkZWQKKyNkZWZpbmUgQ05WX0xJVFRMRV9UT19MT05HKGR3KQlDTlZfRU5EX0xPTkcoZHcpCisjZGVmaW5lIENOVl9MT05HX1RPX0xJVFRMRShkdykJQ05WX0VORF9MT05HKGR3KQorI2Vsc2UKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEwgSSBUIFQgTCBFICAgRSBOIEQgSSBBIE4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBDTlZfTElUVExFX1RPX1NIT1JUKHcpIAkodykJCQkJLy8gbm8gZW5kaWFuZXNzIGNvbnZlcnNpb24gbmVlZGVkCisjZGVmaW5lIENOVl9CSUdfVE9fU0hPUlQodykJCUNOVl9FTkRfU0hPUlQodykJLy8gICAgZW5kaWFuZXNzIGNvbnZlcnNpb24gbmVlZGVkCisjZGVmaW5lIENOVl9MSVRUTEVfVE9fTE9ORyhkdykJKGR3KQorI2RlZmluZSBDTlZfTE9OR19UT19MSVRUTEUoZHcpCShkdykKKworI2lmIGRlZmluZWQgSENGX0FMSUdOICYmIEhDRl9BTElHTiA+IDEKKyNkZWZpbmUgQ05WX1NIT1JUUF9UT19MSVRUTEUocHcpCSgoaGNmXzE2KSgqKGhjZl84ICopcHcpKSAJCQl8ICgoaGNmXzE2KSgqKChoY2ZfOCAqKXB3KzEpKSA8PCA4KQorI2RlZmluZSBDTlZfTE9OR1BfVE9fTElUVExFKHBkdykJKChoY2ZfMzIpKCooaGNmXzggKilwZHcpKSAJCQl8ICgoaGNmXzMyKSgqKChoY2ZfOCAqKXBkdysxKSkgPDwgOCkgCXwgXAorCQkJCQkJCQkJKChoY2ZfMzIpKCooKGhjZl84ICopcGR3KzIpKSA8PCAxNikgfCAoKGhjZl8zMikoKigoaGNmXzggKilwZHcrMykpIDw8IDI0KQorI2Vsc2UKKyNkZWZpbmUgQ05WX0xPTkdQX1RPX0xJVFRMRShwZHcpCSgqKGhjZl8zMiAqKXBkdykKKyNkZWZpbmUgQ05WX1NIT1JUUF9UT19MSVRUTEUocHcpCSgqKGhjZl8xNiAqKXB3KQorI2VuZGlmCisKKyNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgorCisvLyBjb252ZXJzaW9uIG1hY3JvcyB3aGljaCBjYW4gYmUgZXhwcmVzc2VkIGluIG90aGVyIG1hY3JvcworI2RlZmluZSBDTlZfU0hPUlRfVE9fTElUVExFKHcpCUNOVl9MSVRUTEVfVE9fU0hPUlQodykKKyNkZWZpbmUgQ05WX1NIT1JUX1RPX0JJRyh3KQkJQ05WX0JJR19UT19TSE9SVCh3KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBFTkQgT0YgTUFDUk9TICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gb2Zmc2V0cyBUcmFuc21pdC9SZWNlaXZlIEZyYW1lIFN0cnVjdHVyZQorI2RlZmluZSBIRlNfU1RBVAkJCQkweDAwMDAKKyNkZWZpbmUgSEZTX1NXU1VQCQkJCTB4MDAwNgkJCQkJLy9TVyBTdXBwb3J0CisjZGVmaW5lIEhGU19RX0lORk8JCQkJMHgwMDA2CQkJCQkvL1NpZ25hbC9TaWxlbmNlIGxldmVsCisjZGVmaW5lIEhGU19SQVRFCQkJCTB4MDAwOAkJCQkJLy9SeEZsb3cvUmF0ZQorI2RlZmluZSAJSEZTX1NUQVRfRVJSCQlSWF9TVEFUX0VSUgkJCQkvL2xpbmsgIm5hdHVyYWwiIEhDRiBuYW1lIHRvICJuYXR1cmFsIiBNU0YgbmFtZQorI2RlZmluZSBIRlNfVFhfQ05UTAkJCQkweDAwMzYKKwkJCQkJCQkJCQkJCQkJLy8gSC1JICAgICBILUlJCisjZGVmaW5lIEhGU19EQVRfTEVOCQkJCShIRlNfQUREUl9ERVNUIC0gMikJCS8vIDB4MDAyQyAgMHgwMDM4CisjZGVmaW5lIEhGU19BRERSX0RFU1QJCQkweDAwM0EJCQkJCS8vIDB4MDAyRSAgMHgwMDNBCisjZGVmaW5lIEhGU19BRERSX1NSQwkJCShIRlNfQUREUl9ERVNUICsgNikJCS8vIDB4MDAzNCAgMHgwMDQwCisjZGVmaW5lIEhGU19MRU4JCQkJCShIRlNfQUREUl9TUkMgICsgNikJCS8vIDB4MDAzQSAgMHgwMDQ2CisjZGVmaW5lIEhGU19EQVQJCQkJCShIRlNfTEVOICAgICAgICsgMikJCS8vIDB4MDAzQyAgMHgwMDQ4CisjZGVmaW5lIEhGU19UWVBFCQkJCShIRlNfREFUICAgICAgICsgNikJCS8vIDB4MDA0MiAgMHgwMDRFCisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgRCBFIFMgQyBSIEkgUCBUIE8gUiAgIFMgVCBSIFUgQyBUIFUgUiBFICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vOz9NREQuSCBzdHVmZiA7PworCisjaWYgSENGX0JJR19FTkRJQU4KKyNkZWZpbmUgREVTQ19TVFJDVF9DTlQJCTAKKyNkZWZpbmUgREVTQ19TVFJDVF9TSVpFCQkxCisjZWxzZQorI2RlZmluZSBERVNDX1NUUkNUX0NOVAkJMQorI2RlZmluZSBERVNDX1NUUkNUX1NJWkUJCTAKKyNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgorCisjZGVmaW5lCUJVRl9DTlQJCQkJYnVmX2RpbVtERVNDX1NUUkNUX0NOVF0KKyNkZWZpbmUJQlVGX1NJWkUJCQlidWZfZGltW0RFU0NfU1RSQ1RfU0laRV0KKwordHlwZWRlZiBzdHJ1Y3QgREVTQ19TVFJDVCB7CisJaGNmXzE2CQkJCQlidWZfZGltWzJdOworCWhjZl8zMgkJCQkJYnVmX3BoeXNfYWRkcjsKKwloY2ZfMzIJCQkJCW5leHRfZGVzY19waHlzX2FkZHI7CS8vIHBoeXNpY2FsIGFkZHJlc3Mgb2YgbmV4dCBkZXNjcmlwdG9yCisJaGNmXzMyCQkJCQlkZXNjX3BoeXNfYWRkcjsJCQkvLyBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgZGVzY3JpcHRvcgorCXN0cnVjdCBERVNDX1NUUkNUIAkJKm5leHRfZGVzY19hZGRyOworCWhjZl84CUZBUgkJCQkqYnVmX2FkZHI7CisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9ERVNDX1NUUkNUCisJdm9pZCBGQVIJCQkgICAqREVTQ19NU0ZTdXA7CQkJLy8gcG9pbnRlciBmb3IgYXJiaXRyYXJ5IHVzZSBieSB0aGUgTVNGCisjZW5kaWYgLy8gSENGX0RFU0NfU1RSQ1RfRVhUCit9IERFU0NfU1RSQ1Q7CisKKyNkZWZpbmUgSENGX0RBU0FfU0laRQkJCTEyCQkJCQkJCS8vc2l6ZSBpbiBieXRlcyBmb3IgREEvU0EKKworI2RlZmluZSBERVNDX0NOVF9NQVNLIAkJCTB4MEZGRgorCisjZGVmaW5lIEdFVF9CVUZfU0laRShkZXNjcCkgICAgICAgKChkZXNjcCktPkJVRl9TSVpFKQorI2RlZmluZSBHRVRfQlVGX0NOVChkZXNjcCkgICAgICAgICgoZGVzY3ApLT5CVUZfQ05UKQorI2RlZmluZSBTRVRfQlVGX1NJWkUoZGVzY3AsIHNpemUpIChkZXNjcCktPkJVRl9TSVpFID0gc2l6ZTsKKyNkZWZpbmUgU0VUX0JVRl9DTlQoZGVzY3AsIGNvdW50KSAoZGVzY3ApLT5CVUZfQ05UID0gY291bnQ7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIFQgQSBMIEwgSSBFIFMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit0eXBlZGVmIHN0cnVjdCAgeyAgLy9IZXJtZXMgVGFsbGllcyAoSUZCIHN1YnN0cnVjdHVyZSkKKyAgaGNmXzMyCVR4VW5pY2FzdEZyYW1lczsKKyAgaGNmXzMyCVR4TXVsdGljYXN0RnJhbWVzOworICBoY2ZfMzIJVHhGcmFnbWVudHM7CisgIGhjZl8zMglUeFVuaWNhc3RPY3RldHM7CisgIGhjZl8zMglUeE11bHRpY2FzdE9jdGV0czsKKyAgaGNmXzMyCVR4RGVmZXJyZWRUcmFuc21pc3Npb25zOworICBoY2ZfMzIJVHhTaW5nbGVSZXRyeUZyYW1lczsKKyAgaGNmXzMyCVR4TXVsdGlwbGVSZXRyeUZyYW1lczsKKyAgaGNmXzMyCVR4UmV0cnlMaW1pdEV4Y2VlZGVkOworICBoY2ZfMzIJVHhEaXNjYXJkczsKKyAgaGNmXzMyCVJ4VW5pY2FzdEZyYW1lczsKKyAgaGNmXzMyCVJ4TXVsdGljYXN0RnJhbWVzOworICBoY2ZfMzIJUnhGcmFnbWVudHM7CisgIGhjZl8zMglSeFVuaWNhc3RPY3RldHM7CisgIGhjZl8zMglSeE11bHRpY2FzdE9jdGV0czsKKyAgaGNmXzMyCVJ4RkNTRXJyb3JzOworICBoY2ZfMzIJUnhEaXNjYXJkc05vQnVmZmVyOworICBoY2ZfMzIJVHhEaXNjYXJkc1dyb25nU0E7CisgIGhjZl8zMglSeFdFUFVuZGVjcnlwdGFibGU7CisgIGhjZl8zMglSeE1zZ0luTXNnRnJhZ21lbnRzOworICBoY2ZfMzIJUnhNc2dJbkJhZE1zZ0ZyYWdtZW50czsKKyAgaGNmXzMyCVJ4RGlzY2FyZHNXRVBJQ1ZFcnJvcjsKKyAgaGNmXzMyCVJ4RGlzY2FyZHNXRVBFeGNsdWRlZDsKKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX1RBTExJRVNfRlcKKyAgaGNmXzMyCVRhbGxpZXNFeHRyYVszMl07CisjZW5kaWYgLy8gSENGX0VYVF9UQUxMSUVTX0ZXCit9IENGR19IRVJNRVNfVEFMTElFU19TVFJDVDsKKwordHlwZWRlZiBzdHJ1Y3QgIHsgIC8vSENGIFRhbGxpZXMgKElGQiBzdWJzdHJ1Y3R1cmUpCisgIGhjZl8zMglOb0J1ZkluZm87ICAJCQkJLy9ObyBidWZmZXIgYXZhaWxhYmxlIGZvciB1bnNvbGljaXRlZCBOb3RpZnkgZnJhbWUKKyAgaGNmXzMyCU5vQnVmTUI7CQkJCQkvL05vIHNwYWNlIGF2YWlsYWJsZSBpbiBNYWlsQm94CisgIGhjZl8zMglNaXNjRXJyOwkJCQkJLyogQ29tbWFuZCBlcnJvcnMKKyAgCQkJCQkJCQkJCSAqICAtIHRpbWUgb3V0IG9uIGNvbXBsZXRpb24gc3luY2hyb25vdXMgcGFydCBIZXJtZXMgQ29tbWFuZAorICAJCQkJCQkJCQkJICogIC0gY29tcGxldGVkIEhlcm1lcyBDb21tYW5kIGRvZXNuJ3QgbWF0Y2ggb3JpZ2luYWwgY29tbWFuZAorICAJCQkJCQkJCQkJICogIC0gc3RhdHVzIG9mIGNvbXBsZXRlZCBIZXJtZXMgQ29tbWFuZCBjb250YWlucyBlcnJvciBiaXRzCisgIAkJCQkJCQkJCQkgKi8KKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX1RBTExJRVNfRlcKKyAgaGNmXzMyCUVuZ0NudFs4XTsKKyNlbmRpZiAvLyBIQ0ZfRVhUX1RBTExJRVNfRlcKK30gQ0ZHX0hDRl9UQUxMSUVTX1NUUkNUOworCisvL05vdGUgdGhpcyB3YXkgdG8gZGVmaW5lIC4uLl9UQUxfQ05UIGltcGxpZXMgdGhhdCBhbGwgdGFsbGllcyBtdXN0IGtlZXAgdGhlIHNhbWUgKGhjZl8zMikgc2l6ZQorI2lmIChIQ0ZfVEFMTElFUykgJiAoIEhDRl9UQUxMSUVTX05JQyB8IEhDRl9UQUxMSUVTX0hDRiApCisjaWYgKEhDRl9UQUxMSUVTKSAmIEhDRl9UQUxMSUVTX05JQwkvL0hlcm1lcyB0YWxseSBzdXBwb3J0CisjZGVmaW5lCQlIQ0ZfTklDX1RBTF9DTlQJKHNpemVvZihDRkdfSEVSTUVTX1RBTExJRVNfU1RSQ1QpLyBzaXplb2YoaGNmXzMyKSkKKyNlbHNlCisjZGVmaW5lCQlIQ0ZfTklDX1RBTF9DTlQJMAorI2VuZGlmIC8vIEhDRl9UQUxMSUVTCisjaWYgKEhDRl9UQUxMSUVTKSAmIEhDRl9UQUxMSUVTX0hDRgkvL0hDRiB0YWxseSBzdXBwb3J0CisjZGVmaW5lCQlIQ0ZfSENGX1RBTF9DTlQJKHNpemVvZihDRkdfSENGX1RBTExJRVNfU1RSQ1QpICAgLyBzaXplb2YoaGNmXzMyKSkKKyNlbHNlCisjZGVmaW5lCQlIQ0ZfSENGX1RBTF9DTlQJMAorI2VuZGlmIC8vIEhDRl9UQUxMSUVTCisjZGVmaW5lIEhDRl9UT1RfVEFMX0NOVCAoIEhDRl9OSUNfVEFMX0NOVCArIEhDRl9OSUNfVEFMX0NOVCApCisjZW5kaWYgLy8gSENGX1RBTExJRVNfTklDIC8gSENGX1RBTExJRVNfSENGCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSSBOIFQgRSBSIEYgQSBDIEUgICBCIEwgTyBDIEsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElGQl9WRVJTSU9OIDB4MEUJIAkJCS8vIGluaXRpYWxseSAwLCB0byBiZSBpbmNyZW1lbnRlZCBieSBldmVyeSBJRkIgbGF5b3V0IGNoYW5nZQorCit0eXBlZGVmIHN0cnVjdCAgeworICBoY2ZfaW8JCUlGQl9JT0Jhc2U7CQkJCS8vIEkvTyBhZGRyZXNzIG9mIEhlcm1lcyBjaGlwIGFzIHBhc3NlZCBieSBNU0YgYXQgaGNmX2Nvbm5lY3QgY2FsbAorICBoY2ZfMTYJCUlGQl9JT1JhbmdlOwkJCS8vIEkvTyBSYW5nZSB1c2VkIGJ5IEhlcm1lcyBjaGlwCisgIGhjZl8xNgkJSUZCX0RMTW9kZTsJCQkJLy8gRG93bmxvYWQgTW9kZSBzdGF0ZQorICBoY2ZfMTYJCUlGQl9DbWQ7CQkJCS8vIGNtZCBpbiBwcm9ncmVzcyBmbGFnLCB0byBiZSBhY2stZWQgYmVmb3JlIG5leHQgY21kIGNhbiBiZSBpc3N1ZWQKKyAgaGNmXzE2CQlJRkJfUnhGSUQ7CQkJCS8vIEZJRCBvZiAiY3VycmVudCIgUnhGUyAobm9uLURNQSBtb2RlKQorLy87PyNpZiB0eF9kZWxheSBvcHRpb24KKyAgaGNmXzE2CQlJRkJfVHhGSUQ7CQkJCS8vIGZpZCBzdG9yYWdlIGR1cmluZyAiZGVsYXllZCIgc2VuZAorLy87PyNlbmRpZiB0eF9kZWxheSBvcHRpb24KKyAgaGNmXzE2CQlJRkJfUnhMZW47CQkJCS8vCisgIGhjZl8xNgkJSUZCX0RlZnVuY3RTdGF0OwkJLy8gQkFQIGluaXRpYWxpemF0aW9uIG9yIENtZCBDb21wbGV0aW9uIGZhaWxlZAorICBoY2ZfMTYJCUlGQl9FcnJDbWQ7CQkJCS8vIGNvbnRlbnRzIFN0YXR1cyByZWcgd2hlbiBlcnJvciBiaXRzIGFuZC9vciBtaXNtYXRjaCBpbiBjbWRfd2FpdAorICBoY2ZfMTYJCUlGQl9FcnJRdWFsaWZpZXI7CQkvLyBjb250ZW50cyBSZXNwMCAgcmVnIHdoZW4gZXJyb3IgYml0cyBhbmQvb3IgbWlzbWF0Y2ggaW4gY21kX3dhaXQKKyAgaGNmXzE2CQlJRkJfbGFsOwkJCQkvLyBMb29rQWhlYWQgTGVuZ3RoCisgIHdjaV9idWZwCQlJRkJfbGFwOwkJCQkvLyBMb29rQWhlYWQgQnVmZmVyIHBvaW50ZXIKKyAgaGNmXzE2CQlJRkJfTGlua1N0YXQ7CQkJLy8gTGluayBTdGF0dXMKKyAgaGNmXzE2CQlJRkJfRFNMaW5rU3RhdDsJCQkvLyBMaW5rIFN0YXR1cywgbmV3IHN0cmF0ZWd5IGludHJvZHVjZWQgZm9yIERlZXBTbGVlcAorICBoY2ZfMTYJCUlGQl9DYXJyeUluOwkJCS8vIGNhcnJ5IGFuZCBjYXJyeS1mbGFnIHRvIG1vdmUgMSBieXRlIGZyb20gb25lIGdldF9mcmFnIHRvIHRoZSBuZXh0CisgIGhjZl8xNgkJSUZCX0NhcnJ5T3V0OwkJCS8vIGNhcnJ5IGFuZCBjYXJyeS1mbGFnIHRvIG1vdmUgMSBieXRlIGZyb20gb25lIHB1dF9mcmFnIHRvIHRoZSBuZXh0CisgIGhjZl8xNgkJSUZCX1ZlcnNpb247CQkJLy8gSUZCX1ZFUlNJT04sIGluY3JlbWVudGVkIGJ5IGV2ZXJ5IFNJR05JRklDQU5UIElGQiBsYXlvdXQgY2hhbmdlCisgIGhjZl8xNgkJSUZCX0NhcmRTdGF0OwkJCS8vIE5JQyBlcnJvciAvIEYvVyBpbmNvbXBhdGliaWxpdHkgc3RhdHVzCisgIGhjZl8xNiAgCQlJRkJfUnNjSW5kOwkJCQkvLyBub24tRE1BOiBUeEZJRCBhdmFpbGFibGUsIERNQTogYWx3YXlzIDEKKyAgaGNmXzE2CQlJRkJfQ250bE9wdDsJCQkvLyBmbGFnczogMzIgYml0cyBJL08sIERNQSBhdmFpbGFibGUsIERNQSBlbmFibGVkCisgIGhjZl8xNgkJSUZCX0J1c1R5cGU7CQkJLy8gQnVzVHlwZSwgZGVyaXZlZCB2aWEgQ0ZHX05JQ19CVVNfVFlQRQorICBDRkdfRldfSURFTlRJVFlfU1RSQ1QJIElGQl9GV0lkZW50aXR5OyAvKiBrZWVwIEZXSWRlbnRpdHkvU3VwIGFuZCBQUklJZGVudGl0eS9TdXAgaW4gc2VxdWVuY2UKKwkJCQkJCQkJCQkgICogYmVjYXVzZSBvZiB0aGUgKGR1bWIpIGNvcHkgaW4gaW5pdCgpICovCisjaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECisgIENGR19TVVBfUkFOR0VfU1RSQ1QJIElGQl9GV1N1cDsKKyAgQ0ZHX1BSSV9JREVOVElUWV9TVFJDVCBJRkJfUFJJSWRlbnRpdHk7CisgIENGR19TVVBfUkFOR0VfU1RSQ1QJIElGQl9QUklTdXA7CisgIENGR19TVVBfUkFOR0VfU1RSQ1QJIElGQl9IU0lTdXA7CisjZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAorI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5GT19MT0cKKyAgUklEX0xPR1AJCUlGQl9SSURMb2dwOwkJCS8vIHBvaW50ZXIgdG8gUklEX0xPRyBzdHJ1Y3R1cmUKKyNlbmRpZiAvLyBIQ0ZfRVhUX0lORk9fTE9HCisjaWYgSENGX1BST1RfVElNRQorICBoY2ZfMzIJIAlJRkJfVGlja0luaTsJCQkvLyBpbml0aWFsaXphdGlvbiBvZiBTL1cgY291bnRlciBiYXNlZCBwcm90ZWN0aW9uIGxvb3AKKyNlbmRpZiAvLyBIQ0ZfUFJPVF9USU1FCisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTlRfVElDSworICBpbnQJCQlJRkJfVGlja0NudDsJCQkvLyBIZXJtZXMgVGltZXIgVGljayBDb3VudGVyCisjZW5kaWYgLy8gSENGX0VYVF9JTlRfVElDSworI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKKyAgaGNmXzE2IAkgICAqSUZCX01CcDsJCQkJLy8gcG9pbnRlciB0byB0aGUgTWFpbEJveAorICBoY2ZfMTYJCUlGQl9NQlNpemU7CQkJCS8vIHNpemUgb2YgdGhlIE1haWxCb3gKKyAgaGNmXzE2CQlJRkJfTUJXcDsJCQkJLy8gemVyby1iYXNlZCB3cml0ZSBpbmRleCBpbnRvIHRoZSBNYWlsQm94CisgIGhjZl8xNgkJSUZCX01CUnA7CQkJCS8vIHplcm8tYmFzZWQgcmVhZCAgaW5kZXggaW50byB0aGUgTWFpbEJveAorICBoY2ZfMTYJCUlGQl9NQkluZm9MZW47CQkJLy8gY29udGVudHMgb2YgTC1maWVsZCBvZiB0aGUgb2xkZXN0IGF2YWlsYWJsZSBNYWlsQm94SW5mb0Jsb2NrCisjZW5kaWYgLy8gSENGX0VYVF9NQgorI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKKyAgaGNmXzE2CQlJRkJfTUlDVHhDbnRsOwkJCS8vIE1JQyBiaXQgYW5kIEtleSBpbmRleCBpbiBUeENvbnRyb2wgZmllbGQgb2YgVHhGUworICBoY2ZfMzIJCUlGQl9NSUNUeEtleVsyXTsJCS8vIGNhbGN1bGF0aW5nIGtleQorICBoY2ZfMzIJCUlGQl9NSUNUeFsyXTsgICAJICAJLy8gVHggTUlDIGNhbGN1bGF0aW9uIEVuZ2luZSBzdGF0ZQorICBoY2ZfMTYJCUlGQl9NSUNUeENhcnJ5OwkJCS8vIHRlbXAgbGVuZ3RoLCBjYXJyaWVzIG92ZXIgZnJvbSBvbmUgVHggZnJhZ21lbnQgdG8gYW5vdGhlcgorICBoY2ZfMTYJCUlGQl9NSUNSeENhcnJ5OwkJCS8vIHRlbXAgbGVuZ3RoLCBjYXJyaWVzIG92ZXIgZnJvbSBvbmUgUnggZnJhZ21lbnQgdG8gYW5vdGhlcgorICBoY2ZfMzIJCUlGQl9NSUNSeEtleVs0KjJdOwkJLy8gNCBjaGVja2luZyBrZXlzCisgIGhjZl8zMgkJSUZCX01JQ1J4WzJdOyAJIAkJLy8gUnggTUlDIGNhbGN1bGF0aW9uIEVuZ2luZSBzdGF0ZQorI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQorI2lmIEhDRl9BU1NFUlQKKyNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX01CCisgIENGR19NQl9JTkZPX1JBTkdFMV9TVFJDVAlJRkJfQXNzZXJ0U3RyY3Q7IC8vIEFkZCBzb21lIGNvbXBsaWNhdGlvbiB0byB0aGUgSENGIGFzIHByaXplIGZvciB0aGUgbmV3IE1TRiBJL0YKKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUX01CCisgIAkJCQkJCQkJCQkvLyB0YXJnZXQgb2YgYWJvdmUgSUZCX0Fzc2VydFN0cmN0CisgIGhjZl8xNgkJSUZCX0Fzc2VydExpbmU7CQkJLy8gIC0gbGluZSBudW1iZXIgKCArIGVuY29kZWQgbW9kdWxlIG5hbWUgKQorICBoY2ZfMTYJCUlGQl9Bc3NlcnRUcmFjZTsJCS8vICAtIGJpdCBiYXNlZCB0cmFjZSBvZiBhbGwgaGNmXy4uLi4gaW52b2NhdGlvbnMKKyAgaGNmXzMyCQlJRkJfQXNzZXJ0UXVhbGlmaWVyOwkvLyAgLSBxdWFsaWZpZXIKKyAgaGNmXzE2CQlJRkJfQXNzZXJ0THZsOwkJCS8vIEFzc2VydCBGaWx0ZXJpbmcsIE5vdCB5ZXQgaW1wbGVtZW50ZWQKKyAgaGNmXzE2CQlJRkJfQXNzZXJ0V2hlcmU7CQkvLyBXaGVyZSBwYXJhbWV0ZXIgb2YgdGhlIEFzc2VydCBtYWNybworI2lmIChIQ0ZfQVNTRVJUKSAmICggSENGX0FTU0VSVF9MTktfTVNGX1JUTiB8IEhDRl9BU1NFUlRfUlRfTVNGX1JUTiApCisgIE1TRl9BU1NFUlRfUlROUAlJRkJfQXNzZXJ0UnRuOwkJLy8gTVNGIEFzc2VydCBDYWxsIGJhY2sgcm91dGluZSAoaW5zcGlyZWQgYnkgR0VGLCBEckRvYmJzIE5vdiAxOTk4ICkKKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROCisjaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9QUklOVEYJLy8gZW5naW5lZXJpbmcgZmFjaWx0eSBpbnRlbmRlZCBhcyBGL1cgZGVidWdnaW5nIGFpZAorICAgaGNmXzE2ICAgICAgIElGQl9EYmdQcmludEZfQ250OworICAgQ0ZHX0ZXX1BSSU5URl9CVUZGRVJfTE9DQVRJT05fU1RSQ1QgSUZCX0Z3UGZCdWZmOworI2VuZGlmIC8vIEhDRl9BU1NFUlRfUFJJTlRGCisjZW5kaWYgLy8gSENGX0FTU0VSVAorI2lmICEgZGVmaW5lZCBIQ0ZfSU5UX09GRgorICBoY2ZfMTYgdm9sYXRpbGUgSUZCX0ludE9mZkNudDsJCS8vIDB4RkZGRiBiYXNlZCBIQ0ZfQUNUX0lOVF9PRkYgbmVzdGluZyBjb3VudGVyLCBEZWVwU2xlZXAgZmxhZworI2VuZGlmIC8vIEhDRl9JTlRfT0ZGCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAorICBoY2ZfMTYgICAgICAgICBJRkJfQ0tJUFN0YXQ7CQkJLy8gQ0tJUCBTdGF0dXMgZmxhZworI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAorI2lmIChIQ0ZfVEFMTElFUykgJiAoIEhDRl9UQUxMSUVTX05JQyB8IEhDRl9UQUxMSUVTX0hDRiApCS8vSGVybWVzIGFuZC9vciBIQ0YgdGFsbHkgc3VwcG9ydAorICBoY2ZfMzIJCUlGQl9TaWxseV95b3Vfc2hvdWxkX2FsaWduOwkvLzs/CisgIGhjZl8xNgkJSUZCX1RhbGx5TGVuOwkJCS8vIFRhbGx5IGxlbmd0aCAodG8gYnVpbGQgYW4gTFRWKQorICBoY2ZfMTYJCUlGQl9UYWxseVR5cDsJCQkvLyBUYWxseSBUeXBlICh0byBidWlsZCBhbiBMVFYpCisjZW5kaWYgLy8gSENGX1RBTExJRVNfTklDIC8gSENGX1RBTExJRVNfSENGCisjaWYgKEhDRl9UQUxMSUVTKSAmIEhDRl9UQUxMSUVTX05JQwkJLy9IZXJtZXMgdGFsbHkgc3VwcG9ydAorICBDRkdfSEVSTUVTX1RBTExJRVNfU1RSQ1QJSUZCX05JQ19UYWxsaWVzOworI2VuZGlmIC8vIEhDRl9UQUxMSUVTX05JQworI2lmIChIQ0ZfVEFMTElFUykgJiBIQ0ZfVEFMTElFU19IQ0YJCS8vSENGIHRhbGx5IHN1cHBvcnQKKyAgQ0ZHX0hDRl9UQUxMSUVTX1NUUkNUCQlJRkJfSENGX1RhbGxpZXM7CisjZW5kaWYgLy8gSENGX1RBTExJRVNfSENGCisjaWYgSENGX0RNQQorICAvL3VzZWQgZm9yIGEgcG9vbCBvZiBkZXN0aW5hdGlvbl9hZGRyZXNzIGRlc2NyaXB0b3IvYnVmZmVycywgdXNlZCBkdXJpbmcgdHggZW5jYXBzdWxhdGlvbiBwb2ludHMgdG8gdGhlCisgIC8vZmlyc3QvbGFzdCBkZXNjcmlwdG9yIGluIHRoZSBkZXNjcmlwdG9yIGNoYWluLCBzbyB3ZSBjYW4gZWFzaWx5IHJlbW92ZSBhbmQgYXBwZW5kIGEgcGFja2V0LgorICBERVNDX1NUUkNUCSpJRkJfRmlyc3REZXNjWzJdOworICBERVNDX1NUUkNUCSpJRkJfTGFzdERlc2NbMl07CisgIERFU0NfU1RSQ1QJKklGQl9Db25maW5lZERlc2NbMl07CS8vIHBvaW50ZXJzIHRvIGRlc2NyaXB0b3IgdXNlZCBmb3IgaG9zdCByZWNsYWltIHB1cnBvc2VzLgorICBoY2ZfMTYJCUlGQl9EbWFQYWNrZXRzOwkJCS8vIEhSRUdfRVZfW1RYL1JYXURNQV9ET05FIGZsYWdzLCByZXBvcnRzIERNQSBGcmFtZSBhdmFpbGFiaWxpdHkgdG8gTVNGCisjZW5kaWYgLy8gSENGX0RNQQorI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5UX1RYX0VYCisgIGhjZl8xNgkJSUZCX1R4RnNTdGF0OwkJCS8vIFR4IG1lc3NhZ2UgbW9uaXRvcmluZworICBoY2ZfMTYJCUlGQl9UeEZzR2FwWzJdOwkJCS8vOz9tYWtlIHRoaXMgcm9idXN0CisgIGhjZl8xNgkJSUZCX1R4RnNTd1N1cDsKKyNlbmRpZiAvLyBIQ0ZfRVhUX0lOVF9UWF9FWAorICBoY2ZfMTYJCUlGQl9NYWdpYzsJCQkJLyogIk1hZ2ljIiBzaWduYXR1cmUsIHRvIGhlbHAgdGhlIGRlYnVnZ2VyIGludGVycHJldCBhIG1lbW9yeSBkdW1wCisJCQkJCQkJCQkJICogYWxzbyB0aGUgbGFzdCBmaWVsZCBjbGVhcmVkIGF0IGhjZl9jb25uZWN0CisJCQkJCQkJCQkJICovCisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JRkJfU1RSQ1QJCS8vIGZvciB1c2FnZSBieSB0aGUgTVNGCisgIHZvaWQgRkFSCSAgICpJRkJfTVNGU3VwOwkJCQkvLyBwb2ludGVyIGZvciBhcmJpdHJhcnkgdXNlIGJ5IHRoZSBNU0YKKyNlbmRpZiAvLyBIQ0ZfRVhUX0lGQl9TVFJDVF9FWFQKK30gSUZCX1NUUkNUOworCit0eXBlZGVmIElGQl9TVFJDVCoJSUZCUDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKiAgIFcgQyBJICAgIEYgVSBOIEMgVCBJIE8gTiBTICAgIFAgUiBPIFQgTyBUIFkgUCBFIFMgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0VYVEVSTl9DIGludAkJIGhjZl9hY3Rpb24JCQkoSUZCUCBpZmJwLCBoY2ZfMTYgY21kICk7CitFWFRFUk5fQyBpbnQJCSBoY2ZfY29ubmVjdAkJKElGQlAgaWZicCwgaGNmX2lvIGlvX2Jhc2UgKTsKKyNpZiAoSENGX0VOQ0FQKSAmIEhDRl9FTkNfU1VQCitFWFRFUk5fQyBoY2ZfOCAJCSBoY2ZfZW5jYXAJCQkod2NpX2J1ZnAgdHlwZSApOworI2VuZGlmIC8vIEhDRl9FTkNfU1VQCitFWFRFUk5fQyBpbnQJCSBoY2ZfZ2V0X2luZm8JCShJRkJQIGlmYnAsIExUVlAgbHR2cCApOworRVhURVJOX0MgaW50CQkgaGNmX3NlcnZpY2VfbmljCShJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIHVuc2lnbmVkIGludCBsZW4gKTsKK0VYVEVSTl9DIGludAkJIGhjZl9jbnRsCQkJKElGQlAgaWZicCwgaGNmXzE2IGNtZCApOworRVhURVJOX0MgaW50CQkgaGNmX3B1dF9pbmZvCQkoSUZCUCBpZmJwLCBMVFZQIGx0dnAgKTsKK0VYVEVSTl9DIGludAkJIGhjZl9yY3ZfbXNnCQkoSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgdW5zaWduZWQgaW50IG9mZnNldCApOworRVhURVJOX0MgaW50CQkgaGNmX3NlbmRfbXNnICAgICAgIChJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRwLCBoY2ZfMTYgdHhfY250bCApOworI2lmIEhDRl9ETUEKK0VYVEVSTl9DIHZvaWQJCSBoY2ZfZG1hX3R4X3B1dCAJKElGQlAgaWZicCwgREVTQ19TVFJDVCAqZCwgaGNmXzE2IHR4X2NudGwgKTsKK0VYVEVSTl9DIERFU0NfU1RSQ1QqIGhjZl9kbWFfdHhfZ2V0CQkoSUZCUCBpZmJwICk7CitFWFRFUk5fQyBERVNDX1NUUkNUKiBoY2ZfZG1hX3J4X2dldAkJKElGQlAgaWZicCApOworRVhURVJOX0Mgdm9pZAkJIGhjZl9kbWFfcnhfcHV0CQkoSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkICk7CisjZW5kaWYgLy8gSENGX0RNQQorI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4KK0VYVEVSTl9DIHZvaWQJCSBtc2ZfYXNzZXJ0CSAJCSh1bnNpZ25lZCBpbnQgbGluZV9udW1iZXIsIGhjZl8xNiB0cmFjZSwgaGNmXzMyIHF1YWwgKTsKKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROCisKKyNlbmRpZiAgLy8gSENGX0gKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmY2ZnLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2ZjZmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQ3NWIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmY2ZnLmgKQEAgLTAsMCArMSwyMzQ0IEBACisKKy8vICAgdmltOnR3PTExMDp0cz00OgorI2lmbmRlZiBIQ0ZDRkdfSAorI2RlZmluZSBIQ0ZDRkdfSCAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZJTEUJIDogaGNmY2ZnLnRwbCAvLyBoY2ZjZmcuaAorKgorKiBEQVRFICAgOiAkRGF0ZTogMjAwNC8wOC8wNSAxMTo0NzoxMCAkICAgJFJldmlzaW9uOiAxLjYgJAorKiBPcmlnaW5hbDogMjAwNC8wNC8wOCAxNToxODoxNiAgICBSZXZpc2lvbjogMS40MCAgICAgIFRhZzogdDIwMDQwNDA4XzAxCisqIE9yaWdpbmFsOiAyMDA0LzA0LzAxIDE1OjMyOjU1ICAgIFJldmlzaW9uOiAxLjM4ICAgICAgVGFnOiB0N18yMDA0MDQwMV8wMQorKiBPcmlnaW5hbDogMjAwNC8wMy8xMCAxNTozOToyOCAgICBSZXZpc2lvbjogMS4zNCAgICAgIFRhZzogdDIwMDQwMzEwXzAxCisqIE9yaWdpbmFsOiAyMDA0LzAzLzAzIDE0OjEwOjEyICAgIFJldmlzaW9uOiAxLjMyICAgICAgVGFnOiB0MjAwNDAzMDRfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDMvMDIgMDk6Mjc6MTIgICAgUmV2aXNpb246IDEuMzAgICAgICBUYWc6IHQyMDA0MDMwMl8wMworKiBPcmlnaW5hbDogMjAwNC8wMi8yNCAxMzowMDoyOCAgICBSZXZpc2lvbjogMS4yNSAgICAgIFRhZzogdDIwMDQwMjI0XzAxCisqIE9yaWdpbmFsOiAyMDA0LzAyLzE4IDE3OjEzOjU3ICAgIFJldmlzaW9uOiAxLjIzICAgICAgVGFnOiB0MjAwNDAyMTlfMDEKKyoKKyogQVVUSE9SIDogTmljbyBWYWxzdGVyCisqCisqIERFU0MgICA6IEhDRiBDdXN0b21pemF0aW9uIE1hY3JvcworKiBoY2ZjZmcudHBsIGxpc3QgYWxsICNkZWZpbmVzIHdoaWNoIG11c3QgYmUgc3BlY2lmaWVkIHRvOgorKiAgIGFkanVzdCB0aGUgSENGIGZ1bmN0aW9ucyBkZWZpbmVkIGluIEhDRi5DIHRvIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBzcGVjaWZpYyBlbnZpcm9ubWVudAorKgkJbyBtYXhpbXVtIHNpemVzIGZvciBtZXNzYWdlcworKgkJbyBFbmRpYW5lc3MKKyoJQ29tcGlsZXIgc3BlY2lmaWMgbWFjcm9zCisqCQlvIHBvcnQgSS9PIG1hY3JvcworKgkJbyB0eXBlIGRlZmluaXRpb25zCisqCisqIEJ5IGNvcHlpbmcgSENGQ0ZHLlRQTCB0byBIQ0ZDRkcuSCBhbmQgLWlmIG5lZWRlZC0gbW9kaWZ5aW5nIHRoZSAjZGVmaW5lcyB0aGUgV0NJIGZ1bmN0aW9uYWxpdHkgY2FuIGJlCisqIHRhaWxvcmVkCisqCisqIFN1cHBvcnRlZCBlbnZpcm9ubWVudHM6CisqIFdWTEFOXzQxCU1pbmlwb3J0CQkJCQkJCQlORElTIDMuMQorKiBXVkxBTl80MglQYWNrZXQJCQkJCQkJCQlNaWNyb3NvZnQgVmlzdWFsIEMgMS41CisqIFdWTEFOXzQzCTE2IGJpdHMgRE9TIE9ESQkJCQkJCQlNaWNyb3NvZnQgVmlzdWFsIEMgMS41CisqIFdWTEFOXzQ0CTMyIGJpdHMgT0RJIChfX05FVFdBUkVfMzg2X18pCQkJV0FUQ09NCisqIFdWTEFOXzQ1CU1BQ19PUwkJCQkJCQkJCU1QVz8sIFN5bWFudGVjPworKiBXVkxBTl80NglXaW5kb3dzIENFIChfV0lOMzJfV0NFKQkJCQkJTWljcm9zb2Z0ID8KKyogV1ZMQU5fNDcJTElOVVggIChfX0xJTlVYX18pCQkJCQkJR0NDLCBkaXNjYXJkZWQsIGJhc2VkIG9uIEdQTCdlZCBIQ0YtbGlnaHQKKyogV1ZMQU5fNDgJTWluaXBvcnQJCQkJCQkJCU5ESVMgNQorKiBXVkxBTl80OQlMSU5VWCAgKF9fTElOVVhfXykJCQkJCQlHQ0MsIG9yaWdpbmFsbHkgYmFzZWQgb24gcHJlLWNvbXBpbGVkIEhDRl9saWJyYXJ5CisqIAkJCQkJCQkJCQkJCQltaWdyYXRlZCB0byB1c2UgdGhlIEhDRiBzb3VyY2VzIHdoZW4gTHVjZW50IFRlY2hub2xvZ2llcworKiAJCQkJCQkJCQkJCQkJYnJvdWdodCB0aGUgSENGIG1vZHVsZSB1bmRlciBHUEwKKyogV1ZMQU5fNTEJTWluaXBvcnQgVVNCCQkJCQkJCU5ESVMgNQorKiBXVkxBTl81MglNaW5pcG9ydAkJCQkJCQkJTkRJUyA0CisqIFdWTEFOXzUzCVZ4V29ya3MgRU5EIFN0YXRpb24gZHJpdmVyCisqIFdWTEFOXzU0CVZ4V29ya3MgRU5EIEFjY2VzcyBQb2ludCBkcml2ZXIKKyogV1ZMQU5fODEJV2F2ZVBvaW50CQkJCQkJCQlCT1JMQU5EIEMKKyogV0NJVFNUCUluaG91c2UgdGVzdCB0b29sCQkJCQkJTWljcm9zb2Z0IFZpc3VhbCBDIDEuNQorKiBXU1UJCVdhdmVMQU4gU3RhdGlvbiBVcGRhdGUJCQkJCU1pY3Jvc29mdCBWaXN1YWwgQyA/PworKiBTQ08gVU5JWAlub3QgeWV0IGFjdHVhbGx5IHVzZWQgPwkJCQkJPworKiBfX3BwYwkJT0VNIHN1cHBsaWVkCQkJCQkJCT8KKyogX0FNMjlLCU9FTSBzdXBwbGllZAkJCQkJCQk/CisqID8JCQlPRU0gc3VwcGxpZWQJCQkJCQkJTWljcm90ZWMgUmVzZWFyY2ggODBYODYgQ29tcGlsZXIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqIFNPRlRXQVJFIExJQ0VOU0UKKyoKKyogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisqCisqIENPUFlSSUdIVCCpIDE5OTQgLSAxOTk1CWJ5IEFUJlQuCQkJCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKyogQ09QWVJJR0hUIKkgMTk5NiAtIDIwMDAgYnkgTHVjZW50IFRlY2hub2xvZ2llcy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBDT1BZUklHSFQgqSAyMDAxIC0gMjAwNAlieSBBZ2VyZSBTeXN0ZW1zIEluYy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisqCisqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorKiAgICBkaXN0cmlidXRpb24uCisqCisqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKgorKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIERpc2NsYWltZXIKKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorKiBEQU1BR0UuCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKglBbGlnbm1lbnQKKyoJU29tZSBwbGF0Zm9ybXMgY2FuIGFjY2VzcyB3b3JkcyBvbiBvZGQgYm91bmRhcmllcyAod2l0aCBwb3NzaWJseSBhbiBwZXJmb3JtYW5jZSBpbXBhY3QpLCBhdCBvdGhlcgorKglwbGF0Zm9ybXMgc3VjaCBhbiBhY2Nlc3MgbWF5IHJlc3VsdCBpbiBhIG1lbW9yeSBhY2Nlc3MgdmlvbGF0aW9uLgorKglJdCBpcyBhc3N1bWVkIHRoYXQgZXZlcnl3aGVyZSB3aGVyZSB0aGUgSENGIGNhc3RzIGEgY2hhciBwb2ludGVyIGludG8gYSB3b3JkIHBvaW50ZXIsIHRoZSBhbGlnbm1lbnQKKyoJY3JpdGVyaWEgYXJlIG1ldC4gVGhpcyBwdXQgc29tZSByZXN0cmljdGlvbnMgb24gdGhlIE1TRiwgd2hpY2ggYXJlIGFzc3VtZWQgdG8gYmUgImF1dG9tYXRpY2FsbHkiIGZ1bGZpbGxlZAorKglhdCB0aGUgYXBwbGljYWJsZSBwbGF0Zm9ybXMKKyoJVG8gYXNzZXJ0IHRoaXMgYXNzdW1wdGlvbiwgdGhlIG1hY3JvIEhDRl9BTElHTiBjYW4gYmUgZGVmaW5lZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMSwgbWVhbmluZyBieXRlCisqCWFsaWdubWVudCAob3Igbm8gYWxpZ25tZW50KSwgYSB2YWx1ZSBvZiAyIG1lYW5zIHdvcmQgYWxpZ25tZW50LCBhIHZhbHVlIG9mIDQgbWVhbnMgZG91YmxlIHdvcmQgYWxpZ25tZW50CisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgSU5fUE9SVF9TVFJJTkdfOF8xNiAgUyBhIG0gcCBsIGUgcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJCS8vIEMgaW1wbGVtZW50YXRpb24gd2hpY2ggbGV0IHRoZSBwcm9jZXNzb3IgaGFuZGxlIHRoZSB3b3JkLWF0LWJ5dGUtYm91bmRhcnkgcHJvYmxlbQorI2RlZmluZSBJTl9QT1JUX1NUUklOR184XzE2KCBwb3J0LCBhZGRyLCBuKSB3aGlsZSAoIG4tLSApIAlcCisJeyAqKGhjZl8xNiBGQVIqKWFkZHIgPSBJTl9QT1JUX1dPUkQoIHBvcnQgKTsgKChoY2ZfOCBGQVIqKWFkZHIpKz0yOyB9CisKKwkJLy8gQyBpbXBsZW1lbnRhdGlvbiB3aGljaCBoYW5kbGVzIHRoZSB3b3JkLWF0LWJ5dGUtYm91bmRhcnkgcHJvYmxlbQorI2RlZmluZSBJTl9QT1JUX1NUUklOR184XzE2KCBwb3J0LCBhZGRyLCBuKQl3aGlsZSAoIG4tLSApCSBcCisJeyBoY2ZfMTYgaSA9IElOX1BPUlRfV09SRChwb3J0KTsgKigoaGNmXzggRkFSKilhZGRyKSsrID0gKGhjZl84KWk7ICooKGhjZl84IEZBUiopYWRkcikrKyA9IChoY2ZfOCkoaT4+OCk7fQorCisJCS8vIEFzc2VtYmxlciBpbXBsZW1lbnRhdGlvbgorI2RlZmluZSBJTl9QT1JUX1NUUklOR184XzE2KCBwb3J0LCBhZGRyLCBsZW4pIF9fYXNtCQlcCit7CQkJCQkJCQkJCQkJCQlcCisJX19hc20gcHVzaCBkaQkJCQkJCQkJCQlcCisJX19hc20gcHVzaCBlcwkJCQkJCQkJCQlcCisJX19hc20gbW92IGN4LGxlbgkJCQkJCQkJCVwKKwlfX2FzbSBsZXMgZGksYWRkcgkJCQkJCQkJCVwKKwlfX2FzbSBtb3YgZHgscG9ydAkJCQkJCQkJCVwKKwlfX2FzbSByZXAgaW5zdwkJCQkJCQkJCQlcCisJX19hc20gcG9wIGVzCQkJCQkJCQkJCVwKKwlfX2FzbSBwb3AgZGkJCQkJCQkJCQkJXAorfQorCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgT1VUX1BPUlRfU1RSSU5HXzhfMTYgIFMgYSBtIHAgbCBlIHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwkJLy8gQyBpbXBsZW1lbnRhdGlvbiB3aGljaCBsZXQgdGhlIHByb2Nlc3NvciBoYW5kbGUgdGhlIHdvcmQtYXQtYnl0ZS1ib3VuZGFyeSBwcm9ibGVtCisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR184XzE2KCBwb3J0LCBhZGRyLCBuKQl3aGlsZSAoIG4tLSApIFwKKwl7IE9VVF9QT1JUX1dPUkQoIHBvcnQsICooaGNmXzE2IEZBUiopYWRkciApIDsgKChoY2ZfOCBGQVIqKWFkZHIpKz0yOyB9CisKKwkJLy8gQyBpbXBsZW1lbnRhdGlvbiB3aGljaCBoYW5kbGVzIHRoZSB3b3JkLWF0LWJ5dGUtYm91bmRhcnkgcHJvYmxlbQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfOF8xNiggcG9ydCwgYWRkciwgbikJd2hpbGUgKCBuLS0gKSBcCisJeyBPVVRfUE9SVF9XT1JEKCBwb3J0LCAqKChoY2ZfOCBGQVIqKWFkZHIpIHwgKigoKGhjZl84IEZBUiopYWRkcikrMSk8PDggICk7IChoY2ZfOCBGQVIqKWFkZHIrPTI7IH0KKworCQkvLyBBc3NlbWJsZXIgaW1wbGVtZW50YXRpb24KKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzhfMTYoIHBvcnQsIGFkZHIsIGxlbikgX19hc20JXAorewkJCQkJCQkJCQkJCQkJXAorCV9fYXNtIHB1c2ggc2kJCQkJCQkJCQkJXAorCV9fYXNtIHB1c2ggZHMJCQkJCQkJCQkJXAorCV9fYXNtIG1vdiBjeCxsZW4JCQkJCQkJCQlcCisJX19hc20gbGRzIHNpLGFkZHIJCQkJCQkJCQlcCisJX19hc20gbW92IGR4LHBvcnQJCQkJCQkJCQlcCisJX19hc20gcmVwIG91dHN3CQkJCQkJCQkJCVwKKwlfX2FzbSBwb3AgZHMJCQkJCQkJCQkJXAorCV9fYXNtIHBvcCBzaQkJCQkJCQkJCQlcCit9CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKiogIEMgTyBNIFAgSSBMIEUgUiAgIFMgUCBFIEMgSSBGIEkgQyAgIE0gQSBDIFIgTyBTICAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoJCQkhISEhISEhISEhISEhISEhISEhISEhISEhIE5vdGUgdG8gdGhlIEhDRi1pbXBsZW1lbnRvciAhISEhISEhISEhISEhISEhISEhISEhISEhCisqCQkJISEhISBEbyBub3QgY2FsbCB0aGVzZSBtYWNyb3Mgd2l0aCBwYXJhbWV0ZXJzIHdoaWNoIGludHJvZHVjZSBzaWRlIGVmZmVjdHMgISEhIQorKgkJCSEhISEhISEhISEhISEhISEhISEhISEhISEgTm90ZSB0byB0aGUgSENGLWltcGxlbWVudG9yICEhISEhISEhISEhISEhISEhISEhISEhISEKKyoKKyoKKyogQnkgc2VsZWN0aW5nIHRoZSBhcHByb3ByaWF0ZSBNYWNybyBkZWZpbml0aW9ucyBieSBtZWFucyBvZiBtb2RpZnlpbmcgdGhlICIjaWZkZWYgMC8xIiBsaW5lcywgdGhlIEhDRiBjYW4gYmUKKyogYWRqdXN0ZWQgZm9yIHRoZSBJL08gY2hhcmFjdGVyaXN0aWNzIG9mIGEgc3BlY2lmaWMgY29tcGlsZXIKKyoKKyogSWYgbmVlZGVkIHRoZSBtYWNyb3MgY2FuIGJlIG1vZGlmaWVkIG9yIHJlcGxhY2VkIHdpdGggZGVmaW5pdGlvbnMgYXBwcm9wcmlhdGUgZm9yIHlvdXIgcGVyc29uYWwgcGxhdGZvcm0uCisqIElmIHlvdSBuZWVkIHRvIG1ha2Ugc3VjaCBjaGFuZ2VzIGl0IGlzIGFwcHJlY2lhdGVkIGlmIHlvdSBpbmZvcm0gQWdlcmUgU3lzdGVtcworKiBUaGF0IHdheSB0aGUgY2hhbmdlcyBjYW4gYmVjb21lIHBhcnQgb2YgdGhlIG5leHQgcmVsZWFzZSBvZiB0aGUgV0NJCisqCisqIEZvciBjb252ZW5pZW5jZSBvZiB0aGUgTVNGLXByb2dyYW1tZXIsIGFsbCBtYWNyb3MgYXJlIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZWlyIHBhcmFtZXRlcnMgKGFsdGhvdWdoIHNvbWUKKyogbWlnaHQgYXJndWUgdGhhdCB0aGlzIHdvdWxkIGNvbnN0aXR1dGUgYmFkIGNvZGluZyBwcmFjdGljZSkuIFRoaXMgaGFzIGl0cyBpbXBsaWNhdGlvbnMgb24gdGhlIEhDRiwgZS5nLiBhcyBhCisqIGNvbnNlcXVlbmNlIHRoZXNlIG1hY3JvcyBzaG91bGQgbm90IGJlIGNhbGxlZCB3aXRoIHBhcmFtZXRlcnMgd2hpY2ggaGF2ZSBzaWRlIGVmZmVjdHMsIGUuZyBhdXRvLWluY3JlbWVudC4KKyoKKyogaW4gdGhlIE1pY3Jvc29mdCBpbXBsZW1lbnRhdGlvbiBvZiBpbmxpbmUgYXNzZW1ibHkgaXQgaXMgTy5LLiB0byBjb3JydXB0IGFsbCBmbGFncyBleGNlcHQgdGhlIGRpcmVjdGlvbiBmbGFnCisqIGFuZCB0byBjb3JydXB0IGFsbCByZWdpc3RlcnMgZXhjZXB0IHRoZSBzZWdtZW50IHJlZ2lzdGVycyBhbmQgRURJLCBFU0ksIEVTUCBhbmQgRUJQIChvciB0aGVpciAxNiBiaXRzCisqIGVxdWl2YWxlbnRzKS4gIE90aGVyIGVudmlyb25tZW50cyBtYXkgaGF2ZSBvdGhlciBjb25zdHJhaW50cworKgorKiBpbiB0aGUgSW50ZWwgZW52aXJvbm1lbnQgaXQgaXMgTy5LIHRvIGhhdmUgYSB3b3JkIChhcyBhIDE2IGJpdHMgcXVhbnRpdHkpIGF0IGEgYnl0ZSBib3VuZGFyeSwgaGVuY2UKKyogSU5fL09VVF9QT1JUX1NUUklOR184XzE2IGNhbiBtb3ZlIHdvcmRzIGJldHdlZW4gUEMtbWVtb3J5IGFuZCBOSUMtbWVtb3J5IHdpdGggYXMgb25seSBjb25zdHJhaW50IHRoYXQgdGhlCisqIHdvcmRzIGFyZSBvbiBhIHdvcmQgYm91bmRhcnkgaW4gTklDLW1lbW9yeS4gVGhpcyBkb2VzIG5vdCBob2xkIHRydWUgZm9yIGFsbCBjb25jZWl2YWJsZSBlbnZpcm9ubWVudHMsIGUuZy4KKyogYW4gTW90b3JvbGEgNjh4eHggZG9lcyBub3QgYWxsb3cgdGhpcy4gUHJvYmFibHkvaG9wZWZ1bGx5IHRoZSBib3VuZGFyeSBjb25kaXRpb25zIGltcG9zZWQgYnkgdGhlc2UgdHlwZSBvZgorKiBwbGF0Zm9ybXMgcHJldmVudCB0aGlzIGNhc2UgZnJvbSBtYXRlcmlhbGl6aW5nLiAgSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIE9VVF9QT1JUX1NUUklOR184XzE2IG11c3QgYmUgY29kZWQKKyogYnkgY29tYmluaW5nIHR3byBIb3N0IG1lbW9yeSBoY2ZfOCB2YWx1ZXMgYXQgYSB0aW1lIHRvIGEgc2luZ2xlIGhjZl8xNiB2YWx1ZSB0byBiZSBwYXNzZWQgdG8gdGhlIE5JQyBhbmQKKyogSU5fUE9SVF9TVFJJTkdfOF8xNiB0aGUgc2luZ2xlIGhjZl8xNiByZXRyaWV2ZWQgZnJvbSB0aGUgTklDIG11c3QgYmUgc3BsaXQgaW4gdHdvIGhjZl84IHZhbHVlcyB0byBiZSBzdG9yZWQKKyogaW4gSG9zdCBtZW1vcnkgKHNlZSB0aGUgc2FtcGxlIGNvZGUgYWJvdmUpCisqCisqCVRoZSBwcm90b3R5cGVzIGFuZCBmdW5jdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBtYWNyb3MgYXJlOgorKgorKgloY2ZfMTYJSU5fUE9SVF9XT1JEKCBoY2ZfMTYgcG9ydCApCisqCQkJUmVhZHMgYSB3b3JkICgxNiBiaXRzKSBmcm9tIHRoZSBzcGVjaWZpZWQgcG9ydAorKgorKgl2b2lkCU9VVF9QT1JUX1dPUkQoIGhjZl8xNiBwb3J0LCBoY2ZfMTYgdmFsdWUpCisqCQkJV3JpdGVzIGEgd29yZCAoMTYgYml0cykgdG8gdGhlIHNwZWNpZmllZCBwb3J0CisqCisqCWhjZl8xNglJTl9QT1JUX0RXT1JEKCBoY2ZfMTYgcG9ydCApCisqCQkJUmVhZHMgYSBkd29yZCAoMzIgYml0cykgZnJvbSB0aGUgc3BlY2lmaWVkIHBvcnQKKyoKKyoJdm9pZAlPVVRfUE9SVF9EV09SRCggaGNmXzE2IHBvcnQsIGhjZl8zMiB2YWx1ZSkKKyoJCQlXcml0ZXMgYSBkd29yZCAoMzIgYml0cykgdG8gdGhlIHNwZWNpZmllZCBwb3J0CisqCisqCXZvaWQJSU5fUE9SVF9TVFJJTkdfOF8xNiggcG9ydCwgYWRkciwgbGVuKQorKgkJCVJlYWRzIGxlbiBudW1iZXIgb2Ygd29yZHMgKDE2IGJpdHMpIGZyb20gTklDIG1lbW9yeSB2aWEgdGhlIHNwZWNpZmllZCBwb3J0IHRvIHRoZSAoRkFSKQorKgkJCWJ5dGUtcG9pbnRlciBhZGRyIGluIFBDLVJBTQorKgkJCU5vdGUgdGhhdCBsZW4gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygd29yZHMsIE5PVCB0aGUgbnVtYmVyIG9mIGJ5dGVzCisqCQkJISEhTk9URSwgYWx0aG91Z2ggbGVuIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHdvcmRzLCBhZGRyIE1VU1QgYmUgYSBjaGFyIHBvaW50ZXIgTk9URSEhIQorKgkJCVNlZSBhbHNvIHRoZSBjb21tb24gbm90ZXMgZm9yIElOX1BPUlRfU1RSSU5HXzhfMTYgYW5kIE9VVF9QT1JUX1NUUklOR184XzE2CisqCisqCXZvaWQJT1VUX1BPUlRfU1RSSU5HXzhfMTYoIHBvcnQsIGFkZHIsIGxlbikKKyoJCQlXcml0ZXMgbGVuIG51bWJlciBvZiB3b3JkcyAoMTYgYml0cykgZnJvbSB0aGUgKEZBUikgYnl0ZS1wb2ludGVyIGFkZHIgaW4gUEMtUkFNIHZpYSB0aGUgc3BlY2lmaWVkCisqCQkJcG9ydCB0byBOSUMgbWVtb3J5CisqCQkJTm90ZSB0aGF0IGxlbiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB3b3JkcywgTk9UIHRoZSBudW1iZXIgb2YgYnl0ZXMuCisqCQkJISEhTk9URSwgYWx0aG91Z2ggbGVuIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHdvcmRzLCBhZGRyIE1VU1QgYmUgYSBjaGFyIHBvaW50ZXIgTk9URSEhIQorKgorKgkJCVRoZSBwZWN1bGlhciBjb21iaW5hdGlvbiBvZiB3b3JkLWxlbmd0aCBhbmQgY2hhciBwb2ludGVycyBmb3IgSU5fUE9SVF9TVFJJTkdfOF8xNiBhcyB3ZWxsIGFzCisqCQkJT1VUX1BPUlRfU1RSSU5HXzhfMTYgaXMganVzdGlmaWVkIGJ5IHRoZSBhc3N1bXB0aW9uIHRoYXQgaXQgb2ZmZXJzIGEgbW9yZSBvcHRpbWFsIGFsZ29yaXRobQorKgorKgl2b2lkCUlOX1BPUlRfU1RSSU5HXzMyKCBwb3J0LCBhZGRyLCBsZW4pCisqCQkJUmVhZHMgbGVuIG51bWJlciBvZiBkb3VibGUtd29yZHMgKDMyIGJpdHMpIGZyb20gTklDIG1lbW9yeSB2aWEgdGhlIHNwZWNpZmllZCBwb3J0IHRvIHRoZSAoRkFSKQorKgkJCWRvdWJsZS13b3JkIGFkZHJlc3MgYWRkciBpbiBQQy1SQU0KKyoKKyoJdm9pZAlPVVRfUE9SVF9TVFJJTkdfMzIoIHBvcnQsIGFkZHIsIGxlbikKKyoJCQlXcml0ZXMgbGVuIG51bWJlciBvZiBkb3VibGUtd29yZHMgKDMyIGJpdHMpIGZyb20gdGhlIChGQVIpIGRvdWJsZS13b3JkIGFkZHJlc3MgYWRkciBpbiBQQy1SQU0gdmlhCisqCQkJdGhlIHNwZWNpZmllZCBwb3J0IHRvIE5JQyBtZW1vcnkKKyoKKyoJCQkhISEhISEhISEhISEhISEhISEhISEhISEhIE5vdGUgdG8gdGhlIEhDRi1pbXBsZW1lbnRvciAhISEhISEhISEhISEhISEhISEhISEhISEhCisqCQkJISEhISBEbyBub3QgY2FsbCB0aGVzZSBtYWNyb3Mgd2l0aCBwYXJhbWV0ZXJzIHdoaWNoIGludHJvZHVjZSBzaWRlIGVmZmVjdHMgISEhIQorKgkJCSEhISEhISEhISEhISEhISEhISEhISEhISEgTm90ZSB0byB0aGUgSENGLWltcGxlbWVudG9yICEhISEhISEhISEhISEhISEhISEhISEhISEKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqICBkZWZpbmUgSU5UIFR5cGVzICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCQloY2ZfODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCQloY2ZfMTY7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJCQloY2ZfMzI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqICBkZWZpbmUgSS9PIFR5cGVzICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEhDRl9JT19NRU0gICAgIAkJCTB4MDAwMQkvLyBtZW1vcnkgbWFwcGVkIEkvTwkoIDA6IFBvcnQgSS9PICkKKyNkZWZpbmUgSENGX0lPXzMyQklUUyAgIAkgIAkweDAwMDIgCS8vIDMyQml0cyBzdXBwb3J0CQkoIDA6IG9ubHkgMTYgQml0cyBJL08pCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogI2RlZmluZSBIQ0ZfVFlQRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSENGX1RZUEVfTk9ORQkJCTB4MDAwMAkvLyBObyB0eXBlCisjZGVmaW5lIEhDRl9UWVBFX1dQQQkJCTB4MDAwMQkvLyBXUEEgc3VwcG9ydAorI2RlZmluZSBIQ0ZfVFlQRV9VU0IJCQkweDAwMDIJLy8gcmVzZXJ2ZWQgKFVTQiBEb25nbGUgZHJpdmVyIHN1cHBvcnQpCisvLyNkZWZpbmUgSENGX1RZUEVfSElJCQkJMHgwMDA0CS8vIEhlcm1lcy1JSSwgdG8gZGlzY3JpbWluYXRlIEgtSSBhbmQgSC1JSSBDRkdfSENGX09QVF9TVFJDVAorI2RlZmluZSBIQ0ZfVFlQRV9XQVJQCQkJMHgwMDA4CS8vIFdBUlAgRi9XCisjZGVmaW5lIEhDRl9UWVBFX1BSRUxPQURFRAkJMHgwMDQwCS8vIHByZS1sb2FkZWQgRi9XCisjZGVmaW5lIEhDRl9UWVBFX0hJSTUJCQkweDAwODAJLy8gSGVybWVzLTIuNSBIL1cKKyNkZWZpbmUgSENGX1RZUEVfQ0NYCQkJMHgwMTAwCS8vIENLSVAKKyNkZWZpbmUgSENGX1RZUEVfQkVBR0xFX0hJSTUJMHgwMjAwCS8vIEJlYWdsZSBIZXJtZXMtMi41IEgvVworI2RlZmluZSBIQ0ZfVFlQRV9UWF9ERUxBWQkJMHg0MDAwCS8vIERlbGF5ZWQgdHJhbnNtaXNzaW9uICggbm9uLURNQSBvbmx5KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICNkZWZpbmUgSENGX0FTU0VSVCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEhDRl9BU1NFUlRfTk9ORQkJCTB4MDAwMAkvLyBObyBhc3NlcnQgc3VwcG9ydAorI2RlZmluZSBIQ0ZfQVNTRVJUX1BSSU5URgkJMHgwMDAxCS8vIEhlcm1lcyBnZW5lcmF0ZWQgZGVidWcgaW5mbworI2RlZmluZSBIQ0ZfQVNTRVJUX1NXX1NVUAkJMHgwMDAyCS8vIGxvZ2dpbmcgdmlhIEhlcm1lcyBzdXBwb3J0IHJlZ2lzdGVyCisjZGVmaW5lIEhDRl9BU1NFUlRfTUIJCQkweDAwMDQJLy8gbG9nZ2luZyB2aWEgTWFpbGJveAorI2RlZmluZSBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4JMHg0MDAwCS8vIGR5bmFtaWNhbGx5IGJpbmRpbmcgb2YgbXNmX2Fzc2VydCByb3V0aW5lCisjZGVmaW5lIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4JMHg4MDAwCS8vIHN0YXRpY2FsbHkgYmluZGluZyBvZiBtc2ZfYXNzZXJ0IHJvdXRpbmUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjZGVmaW5lIEhDRl9FTkNBUCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBIQ0ZfRU5DX05PTkUJCQkweDAwMDAJLy8gTm8gZW5jYXBzdWxhdGlvbiBzdXBwb3J0CisjZGVmaW5lIEhDRl9FTkMJCQkJCTB4MDAwMQkvLyBIQ0YgaGFuZGxlcyBFbi0vRGVjYXBzdWxhdGlvbgorI2RlZmluZSBIQ0ZfRU5DX1NVUAkJCQkweDAwMDIJLy8gSENGIHN1cHBvcnRzIE1TRiB0byBoYW5kbGUgRW4tL0RlY2Fwc3VsYXRpb24KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjZGVmaW5lIEhDRl9FWFQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBIQ0ZfRVhUX05PTkUJCQkweDAwMDAJLy8gTm8gZXhwYW5kZWQgZmVhdHVyZXMKKyNkZWZpbmUgSENGX0VYVF9JTkZPX0xPRwkJMHgwMDAxCS8vIGxvZ2dpbmcgb2YgSGVybWVzIEluZm8gZnJhbWVzCisvLyNkZWZpbmUgSENGX0VYVF9JTlRfVFhfT0sJCTB4MDAwMgkvLyBSRVNFUlZFRCEhISBtb25pdG9yaW5nIHN1Y2Nlc3NmdWwgVHggbWVzc2FnZQorI2RlZmluZSBIQ0ZfRVhUX0lOVF9UWF9FWAkJMHgwMDA0CS8vIG1vbml0b3JpbmcgdW5zdWNjZXNzZnVsIFR4IG1lc3NhZ2UKKy8vI2RlZmluZSBIQ0ZfRVhUX01PTl9NT0RFCQkweDAwMDgJLy8gTEVHQUNZCisjZGVmaW5lIEhDRl9FWFRfVEFMTElFU19GVwkJMHgwMDEwCS8vIHN1cHBvcnQgZm9yIHVwIHRvIDMyIEhlcm1lcyBFbmdpbmVlcmluZyB0YWxsaWVzCisjZGVmaW5lIEhDRl9FWFRfVEFMTElFU19IQ0YJCTB4MDAyMAkvLyBzdXBwb3J0IGZvciB1cCB0byA4IEhDRiBFbmdpbmVlcmluZyB0YWxsaWVzCisjZGVmaW5lIEhDRl9FWFRfTklDX0FDQ0VTUwkJMHgwMDQwCS8vIGRpcmVjdCBhY2Nlc3MgdmlhIEF1eC1wb3J0cyBhbmQgdG8gSGVybWVzIHJlZ2lzdGVycyBhbmQgY29tbWFuZHMKKyNkZWZpbmUgSENGX0VYVF9NQgkJCQkweDAwODAJLy8gTWFpbEJveCBjb2RlIGV4cGFuZGVkCisjZGVmaW5lIEhDRl9FWFRfSUZCX1NUUkNUIAkJMHgwMTAwCS8vIE1TRiBjdXN0b20gcG9pbnRlciBpbiBJRkIKKyNkZWZpbmUgSENGX0VYVF9ERVNDX1NUUkNUIAkJMHgwMjAwCS8vIE1TRiBjdXN0b20gcG9pbnRlciBpbiBEZXNjcmlwdG9yCisjZGVmaW5lIEhDRl9FWFRfVFhfQ09OVAkJCTB4NDAwMAkvLyBDb250aW51b3VzIHRyYW5zbWl0IHRlc3QKKyNkZWZpbmUgSENGX0VYVF9JTlRfVElDSwkJMHg4MDAwCS8vIGVuYWJsZXMgVGltZXJUaWNrIGludGVycnVwdCBnZW5lcmF0aW9uCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogI2RlZmluZSBIQ0ZfU0xFRVAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSENGX0REUwkJCQkJMHgwMDAxCS8vIERpc2Nvbm5lY3RlZCBEZWVwIFNsZWVwCisjZGVmaW5lIEhDRl9DRFMJCQkJCTB4MDAwMgkvLyBDb25uZWN0ZWQgRGVlcCBTbGVlcAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICNkZWZpbmUgSENGX1RBTExJRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBIQ0ZfVEFMTElFU19OT05FCQkweDAwMDAJLy8gTm8gdGFsbHkgc3VwcG9ydAorI2RlZmluZSBIQ0ZfVEFMTElFU19OSUMJCQkweDAwMDEJLy8gSGVybWVzIFRhbGxpZXMgYWNjdW11bGF0ZWQgaW4gSUZCCisjZGVmaW5lIEhDRl9UQUxMSUVTX0hDRgkJCTB4MDAwMgkvLyBIQ0YgVGFsbGllcyBhY2N1bXVsYXRlZCBpbiBJRkIKKyNkZWZpbmUgSENGX1RBTExJRVNfUkVTRVQJCTB4ODAwMAkvLyBUYWxsaWVzIGluIElGQiBhcmUgcmVzZXQgd2hlbiByZXBvcnRlZCB2aWEgaGNmX2dldF9pbmZvCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE0gSSBOIEkgUCBPIFIgVCAgICBOIEQgSSBTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZCBXVkxBTl80MSB8fCBkZWZpbmVkIFdWTEFOXzQ4IHx8IGRlZmluZWQgV1ZMQU5fNTIgfHwgZGVmaW5lZCBfV0lOMzJfV0NFCisKKyNpZm5kZWYgV1ZMQU5fNDYKKyNkZWZpbmUgSENGX0VYVCAgIChIQ0ZfRVhUX0lORk9fTE9HIHwgSENGX0VYVF9NQiB8IEhDRl9FWFRfTklDX0FDQ0VTUyApCisjZWxzZQorI2RlZmluZSBIQ0ZfRVhUICggSENGX0VYVF9UWF9DT05UIHwgSENGX0VYVF9JTkZPX0xPRyB8IEhDRl9FWFRfTUIgfCBIQ0ZfRVhUX05JQ19BQ0NFU1MgKQorI2VuZGlmCisjZGVmaW5lIEhDRl9ETFYgMQkJCS8vSC1JIGxlZ2FjeSwgc3VwZXJmbHVvdXMgZm9yIEgtSUkKKworI2lmZGVmIF9XSU4zMl9XQ0UKKyNkZWZpbmUgSENGX0lPICAgICBIQ0ZfSU9fTUVNCisjZGVmaW5lIEhDRl9ETUEJCTAJCQkvLyBUbyBlbmFibGUgRE1BCisjZW5kaWYKKworI2lmIF9WQVJJQU5UID09IDcKKyNkZWZpbmUgSENGX1NMRUVQIEhDRl9DRFMKKyNlbmRpZiAvLyBfVkFSSUFOVCA9PSA3CisKKyNpZiBfVkFSSUFOVCA9PSA1IHx8IF9WQVJJQU5UID09IDYKKyNkZWZpbmUgX1dBUlAKKyNkZWZpbmUgX0FFUworI2RlZmluZSBIQ0ZfU0xFRVAgSENGX0NEUworI2lmIF9WQVJJQU5UID09IDYKKy8vISAjZGVmaW5lIF9SU04KKyNlbmRpZiAvLyBfVkFSSUFOVCA9PSA2CisjaWZuZGVmIF9XSU4zMl9XQ0UKKyNkZWZpbmUgSENGX0lPICAgICBIQ0ZfSU9fMzJCSVRTCisjZGVmaW5lIEhDRl9ETUEJCTEJCQkvLyBUbyBlbmFibGUgRE1BCisjZW5kaWYKKyNlbmRpZiAvLyBfVkFSSUFOVCA9PSA1IHx8IF9WQVJJQU5UID09IDYKKworCisvL0hXaSBmb3IgbWlncmF0aW9uIHB1cnBvc2VzIEkgZGVmaW5lZCBhIGRlZmluZSB3aGljaCB3aWxsIGJlIFRSVUUgZm9yIEFMTCBkcml2ZXJzCisvL01lYW5pbmcgdGhhdCBfQ0NYIGRlZmluZWQgY29kZSB3aGljaCB3ZSB0aGluayB3aWxsIGdldCBhIGFsbCBkcml2ZXIgT0sgZmxhZyBjYW4gYmUgZGVmaW5lZCBmcm9tIF9DQ1ggdG8gX0NDWF9PSworI2lmIGRlZmluZWQgV1ZMQU5fNDggLy8gJiYgIWRlZmluZWQgX1dJTjMyX1dDRQorI2lmIF9WQVJJQU5UID09IDQgfHwgX1ZBUklBTlQgPT0gNgorI2RlZmluZSBfQ0NYX09LCQkxCisjZW5kaWYgLy8gX1ZBUklBTlQgPT0gNCB8fCBfVkFSSUFOVCA9PSA2CisjZW5kaWYgLy8gV1ZMQU5fNDgKKworLy8jaWYgIWRlZmluZWQgV1ZMQU5fNDYKKyNpZiBkZWZpbmVkIFdWTEFOXzQ4CisjaWYgX1ZBUklBTlQgPT0gNCB8fCBfVkFSSUFOVCA9PSA2CisjZGVmaW5lIF9DQ1gKKyNkZWZpbmUgSENGX01BWF9NU0dfQ0tJUF9QQURESU5HICAgIDg2IC8vLCB1c2UgODYgZm9yIHJ4IGZyYWdtZW50YXRpb24uIDI4IGlzIGVudWYgZm9yIE1JQytQUEsgZW5jYXBzdWxhdGlvbgorI2RlZmluZSBIQ0ZfTUFYX01TRwkJCQkJKCAxNTE0ICsgSENGX01BWF9NU0dfQ0tJUF9QQURESU5HICApIC8vIG5lZWQgZXh0cmEgcGFkZGluZyBmb3IgQ0tJUCAobmVlZCB0byBzdWJ0cmFjdCAyOCBmb3IgTkRJUykKKyNlbmRpZiAvLyBfVkFSSUFOVCA9PSA0IHx8IF9WQVJJQU5UID09IDYKKyNlbmRpZiAvLyBXVkxBTl80OAorLy8jZW5kaWYgLy8gV1ZMQU5fNDYKKworI2lmICFkZWZpbmVkIFdWTEFOXzQ2CisjZGVmaW5lIF9QRUVLCisjZW5kaWYKKworI2lmbmRlZiBfV0lOMzJfV0NFCisvLyBBU1NFUlQgYWxyZWFkeSB1c2VkIGJ5IFdpbkNFLi4uCisjaWZkZWYgQVNTRVJUCisjdW5kZWYgQVNTRVJUCisjZGVmaW5lICBBU1NFUlQoeCkgQVNTRVJUREVCVUdNU0coKHgpLCAoVEVYVCgiU0lNVUxBVEUgQVNTRVJUOiIpKSkKKyNlbmRpZgorI2VuZGlmCisKKworI2lmIGRlZmluZWQgV1ZMQU5fNDEKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJCUNPTVBfSURfTUlOSVBPUlRfTkRJU18zMQorI2VuZGlmIC8vIFdWTEFOXzQxCisjaWYgZGVmaW5lZCBXVkxBTl80OCAmJiAhZGVmaW5lZCBfV0lOMzJfV0NFCisjZGVmaW5lCU1TRl9DT01QT05FTlRfSUQJCQlDT01QX0lEX01JTklQT1JUX05ESVNfNTAKKyNlbmRpZiAvLyBXVkxBTl80OCAvIF9XSU4zMl9XQ0UKKyNpZiBkZWZpbmVkIFdWTEFOXzUyICYmICFkZWZpbmVkIF9XSU4zMl9XQ0UKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJCUNPTVBfSURfTUlOSVBPUlRfTkRJU180MAorI2VuZGlmIC8vIFdWTEFOXzUyIC8gX1dJTjMyX1dDRQorI2lmIGRlZmluZWQgV1ZMQU5fNDYKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJCUNPTVBfSURfV0lOX0NFCisjZW5kaWYgLy8gX1dJTjMyX1dDRQorCisjZGVmaW5lCU1TRl9DT01QT05FTlRfVkFSCQkJX1ZBUklBTlQKKworI2RlZmluZQlUMV9fSENGX1RZUEUJCQkJCShIQ0ZfVFlQRV9OT05FKQorCisjZGVmaW5lIFQyX19IQ0ZfVFlQRQkJCQkJKFQxX19IQ0ZfVFlQRSkKKworI2lmZGVmIF9XQVJQCisjZGVmaW5lIFQzX19IQ0ZfVFlQRQkJCQkJKFQyX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX0hJSTUgfCBIQ0ZfVFlQRV9XQVJQICkKKyNlbHNlCisjaWYgX1ZBUklBTlQgPT0gNworI2RlZmluZSBUM19fSENGX1RZUEUJCQkJCShUMl9fSENGX1RZUEUgfCBIQ0ZfVFlQRV9ISUk1KQorI2Vsc2UgLy8gX1ZBUklBTlQgPT0gNworI2RlZmluZSBUM19fSENGX1RZUEUJCQkJCShUMl9fSENGX1RZUEUpCisjZW5kaWYgLy8gX1ZBUklBTlQgPT0gNworI2VuZGlmIC8vIF9XQVJQCisKKyNpZmRlZiBfQ0NYX09LCisjZGVmaW5lIFQ0X19IQ0ZfVFlQRQkJCQkJKFQzX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX0NDWCkKKyNlbHNlCisjZGVmaW5lIFQ0X19IQ0ZfVFlQRQkJCQkJKFQzX19IQ0ZfVFlQRSkKKyNlbmRpZiAvLyBfQ0NYX09LCisKKy8vbm90IHN1aXRhYmxlIGZvciBILUlJICNkZWZpbmUgSENGX0NGR19TVEFfMV9CT1RUT00gICAgICAgIAkxNgorCisvLyBEZWZhdWx0IFdQQSBpbiBPTiBmb3IgYWxsIGRyaXZlcnMgZXhjZXB0IGZvciBXQVJQIGRyaXZlcgorI2lmZGVmIF9XQVJQCisjZGVmaW5lIFQ1X19IQ0ZfVFlQRQkJCQkJKFQ0X19IQ0ZfVFlQRSkKKyNlbHNlIC8vIF9XQVJQCisjZGVmaW5lIFQ1X19IQ0ZfVFlQRQkJCQkJKFQ0X19IQ0ZfVFlQRSB8IEhDRl9UWVBFX1dQQSkKKyNlbmRpZiAvLyBfV0FSUAorCisjZGVmaW5lIEhDRl9UWVBFCQkJCQkJKFQ1X19IQ0ZfVFlQRSkKKworLy8gVGhpcyBpcyBuZWVkZWQgdG8gZ2V0IGF1eF9jdHJsKCkgZnJvbSB0aGUgSENGIGZvciBXbEZyZWV6ZUFuZER1bXAoKQorI2lmIChkZWZpbmVkIERCRyAmJiBEQkcgIT0gMCkKKyNpZm5kZWYgU1RBVElDCisjZGVmaW5lIFNUQVRJQworI2VuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkIFNPRlRST05JQ1NfQ09ERSAmJiAhZGVmaW5lZCBfQVBJRExMICYmICFkZWZpbmVkIF9XSU4zMl9XQ0UKKyNpbmNsdWRlIDxuZGlzLmg+CisjZW5kaWYgLy8gU09GVFJPTklDU19DT0RFIC8gX0FQSURMTCAvIF9XSU4zMl9XQ0UKKyNpZiBkZWZpbmVkIF9XSU4zMl9XQ0UKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8d2lubnQuaD4KKyNlbmRpZiAgLy8gX1dJTjMyX1dDRQorI2luY2x1ZGUgInZlcnNpb24uaCIKKworI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkJVFBJX01BSk9SX1ZFUlNJT04KKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJCVRQSV9NSU5PUl9WRVJTSU9OCisKKyNpZiAhZGVmaW5lZCBfQVBJRExMICYmICFkZWZpbmVkIF9XSU4zMl9XQ0UKKworX19pbmxpbmUgVUNIQVIgTkRJU19JTl9CWVRFKCBVTE9ORyBwb3J0ICkKK3sKKyAgICBVQ0hBUiB2YWx1ZTsKKyAgICBOZGlzUmF3UmVhZFBvcnRVY2hhcihwb3J0ICwgJnZhbHVlKTsKKyAgICByZXR1cm4gKHZhbHVlKTsKK30KKworX19pbmxpbmUgVUxPTkcgTkRJU19JTl9MT05HKCBVTE9ORyBwb3J0ICkKK3sKKyAgICBVTE9ORyB2YWx1ZTsKKyAgICBOZGlzUmF3UmVhZFBvcnRVbG9uZyhwb3J0ICwgJnZhbHVlKTsKKyAgICByZXR1cm4gKHZhbHVlKTsKK30KK19faW5saW5lIFVTSE9SVCBORElTX0lOX1dPUkQoIFVMT05HIHBvcnQgKQoreworICAgIFVTSE9SVCB2YWx1ZTsKKyAgICBOZGlzUmF3UmVhZFBvcnRVc2hvcnQocG9ydCAsICZ2YWx1ZSk7CisgICAgcmV0dXJuICh2YWx1ZSk7Cit9CisKKyNkZWZpbmUgSU5fUE9SVF9EV09SRChwb3J0KQkJCU5ESVNfSU5fTE9ORyggKFVMT05HKSAocG9ydCkgKQorI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkJCQlORElTX0lOX1dPUkQoIChVTE9ORykgKHBvcnQpICkKKyNkZWZpbmUgT1VUX1BPUlRfRFdPUkQocG9ydCwgdmFsdWUpCU5kaXNSYXdXcml0ZVBvcnRVbG9uZygoVUxPTkcpIChwb3J0KSAsIHZhbHVlKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQlOZGlzUmF3V3JpdGVQb3J0VXNob3J0KChVTE9ORykgKHBvcnQpICwgKFVTSE9SVCkgKHZhbHVlKSkKKworI2RlZmluZSAgSU5fUE9SVF9TVFJJTkdfOF8xNihwb3J0LCBhZGRyLCBsZW4pCUlOX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGFkZHIsIGxlbikKKyNkZWZpbmUgIE9VVF9QT1JUX1NUUklOR184XzE2KHBvcnQsIGFkZHIsIGxlbikJT1VUX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGFkZHIsIGxlbikKKworI2RlZmluZSBJTl9QT1JUX1NUUklOR18zMihwb3J0LCBhZGRyLCBsZW4pCQl7CQkJCQlcCisJTmRpc1Jhd1JlYWRQb3J0QnVmZmVyVWxvbmcocG9ydCwgYWRkciwgKGxlbikpOwkJCQkJXAorfQorCisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18zMihwb3J0LCBhZGRyLCBsZW4pCXsJCQkJCQlcCisJTmRpc1Jhd1dyaXRlUG9ydEJ1ZmZlclVsb25nKHBvcnQsIGFkZHIsIChsZW4pKTsJCQkJCVwKK30KKworI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBsZW4pCU5kaXNSYXdSZWFkUG9ydEJ1ZmZlclVzaG9ydChwb3J0LCBhZGRyLCAobGVuKSk7CisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBsZW4pCU5kaXNSYXdXcml0ZVBvcnRCdWZmZXJVc2hvcnQocG9ydCwgYWRkciwgKGxlbikpOworCisjZW5kaWYgLy8gIF9BUElETEwgLyBfV0lOMzJfV0NFCisKKyNpZiBkZWZpbmVkIF9XSU4zMl9XQ0UKKworI2RlZmluZSBIQ0ZfQUxJR04gMgorI2RlZmluZSBIQ0ZfTUVNX0lPCQkJCQkxIC8vIG92ZXJydWxlIHN0YW5kYXJkIFBvcnQgSS9PIHdpdGggTWVtb3J5IG1hcHBlZCBJL08KKyNkZWZpbmUgSENGX1BST1RfVElNRQkJCQk0OQorCisjZGVmaW5lICAJCUlOX1BPUlRfQllURQkJCUNFX0lOX1BPUlRfQllURQorI2RlZmluZSAgCQlPVVRfUE9SVF9CWVRFCQkJQ0VfT1VUX1BPUlRfQllURQorI2RlZmluZSAgCQlJTl9QT1JUX1dPUkQJCQlDRV9JTl9QT1JUX1dPUkQKKyNkZWZpbmUgIAkJT1VUX1BPUlRfV09SRAkJCUNFX09VVF9QT1JUX1dPUkQKKyNkZWZpbmUgIAkJSU5fUE9SVF9TVFJJTkdfMTYJCUNFX0lOX1BPUlRfU1RSSU5HCisjZGVmaW5lICAJCU9VVF9QT1JUX1NUUklOR18xNgkJQ0VfT1VUX1BPUlRfU1RSSU5HCisKK2V4dGVybiBoY2ZfOCAgQ0VfSU5fUE9SVF9CWVRFKGhjZl8zMiBwb3J0KTsKK2V4dGVybiB2b2lkICAgQ0VfT1VUX1BPUlRfQllURShoY2ZfMzIgcG9ydCwgaGNmXzggdmFsdWUpOworZXh0ZXJuIGhjZl8xNiBDRV9JTl9QT1JUX1dPUkQoaGNmXzMyIHBvcnQpOworZXh0ZXJuIHZvaWQgICBDRV9PVVRfUE9SVF9XT1JEKGhjZl8zMiBwb3J0LCBoY2ZfMTYgdmFsdWUpOworZXh0ZXJuIHZvaWQgICBDRV9JTl9QT1JUX1NUUklORyhoY2ZfMzIgcG9ydCwgdm9pZCAqYWRkciwgaGNmXzE2IGxlbik7CitleHRlcm4gdm9pZCAgIENFX09VVF9QT1JUX1NUUklORyhoY2ZfMzIgcG9ydCwgdm9pZCAqYWRkciwgaGNmXzE2IGxlbik7CisKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9ERUJVRyB8fCAoZGVmaW5lZCBEQkcgJiYgREJHICE9IDApCisjZGVmaW5lIEhDRl9BU1NFUlQgKCBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROIHwgSENGX0FTU0VSVF9SVF9NU0ZfUlROIHwgSENGX0FTU0VSVF9QUklOVEYgKSAvLzB4QzAwMQorLy8jZGVmaW5lIEhDRl9BU1NFUlQgKCBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROIHwgSENGX0FTU0VSVF9SVF9NU0ZfUlROIHwgSENGX0FTU0VSVF9QUklOVEYgfCBIQ0ZfQVNTRVJUX01CICkgLy9qdXN0IHRvIHRlc3QKKyNlbmRpZiAvLyBfREVCVUcgfHwgREJHCisKKyNpZiBkZWZpbmVkIERFQlVHIHx8IGRlZmluZWQgX0RFQlVHIHx8IChkZWZpbmVkIERCRyAmJiBEQkcgIT0gMCkKKyNpZmRlZiBfV0lOMzJfV0NFCisjZGVmaW5lIERCR0EyVyhEQkdTVFIpCUNlQ29udmVydEFuc2lUb1VuaWNvZGVMZW4oKGNoYXIqKURCR1NUUikKKyNkZWZpbmUgT1VUUFVUREVCVUdNU0coZHByaW50Zl9leHApCQkJKCh2b2lkKSgoISBaT05FX0RFQlVHKSA/IDA6Y2VfZGVidWdfb3V0IGRwcmludGZfZXhwKSkKKyNkZWZpbmUgQVNTRVJUREVCVUdNU0coY29uZCwgZHByaW50Zl9leHApCQkJKCh2b2lkKSgoY29uZCkgPyAwOmNlX2RlYnVnX291dCBkcHJpbnRmX2V4cCkpCisKKyNkZWZpbmUgWk9ORV9FUlJPUiAgICAgIERFQlVHWk9ORSgwKQorI2RlZmluZSBaT05FX1dBUk4gICAgICAgREVCVUdaT05FKDEpCisjZGVmaW5lIFpPTkVfRlVOQ1RJT04gICBERUJVR1pPTkUoMikKKyNkZWZpbmUgWk9ORV9JTklUICAgICAgIERFQlVHWk9ORSgzKQorI2RlZmluZSBaT05FX0lOVFIgICAgICAgREVCVUdaT05FKDQpCisjZGVmaW5lIFpPTkVfUkNWICAgICAgICBERUJVR1pPTkUoNSkKKyNkZWZpbmUgWk9ORV9YTUlUCQlERUJVR1pPTkUoNikKKyNkZWZpbmUgWk9ORV9BU1NFUlQgCURFQlVHWk9ORSg3KQorI2RlZmluZSBaT05FX0RFQlVHIAkJREVCVUdaT05FKDgpCisjZGVmaW5lIFpPTkVfT0VNIAkJREVCVUdaT05FKDkpCisjZGVmaW5lIFpPTkVfSENGCQlERUJVR1pPTkUoMTApCisjZGVmaW5lIFpPTkVfUE9SVElPCQlERUJVR1pPTkUoMTEpCisjZGVmaW5lIFpPTkVfTE9HVE9GSUxFCURFQlVHWk9ORSgxNSkKKworI2Vsc2UgLy8gIShfV0lOMzJfV0NFKQorCisjZGVmaW5lIE9VVFBVVERFQlVHTVNHKGRwcmludGZfZXhwKQkJCQkJKCh2b2lkKSAoRGJnUHJpbnQgZHByaW50Zl9leHApKQorLy8gdGhlIGFzc2VydGRlYnVnbXNnIG1hY3JvIHdpbGwgcHJpbnQgZmlsZW5hbWUsIGxpbmUgZm9sbG93ZWQgYnkgYSBjYWxsZXItZGVmaW5lZCB0ZXh0LCB3aGVuIGNvbmQgPT0gMAorI2RlZmluZSBBU1NFUlRERUJVR01TRyhjb25kLCBwcmludCkJKCh2b2lkKSgoY29uZCkgPyAwOiAoRGJnUHJpbnQoIiVzICVzOiVkIC0gIiwgcHJpbnQsIF9fRklMRV9fLCBfX0xJTkVfXykpKSkKKworI2RlZmluZSBaT05FX0VSUk9SICAgICAgMQorI2RlZmluZSBaT05FX1dBUk4gICAgICAgMQorI2RlZmluZSBaT05FX0ZVTkNUSU9OICAgMQorI2RlZmluZSBaT05FX0lOSVQgICAgICAgMQorI2RlZmluZSBaT05FX0lOVFIgICAgICAgMQorI2RlZmluZSBaT05FX1JDViAgICAgICAgMQorI2RlZmluZSBaT05FX1hNSVQJCTEKKyNkZWZpbmUgWk9ORV9BU1NFUlQgCTEKKyNkZWZpbmUgWk9ORV9ERUJVRyAJCTEKKyNkZWZpbmUgWk9ORV9PRU0gCQkxCisjZGVmaW5lIFpPTkVfSENGCQkxCisjZGVmaW5lIFpPTkVfUE9SVElPCQkxCisjZGVmaW5lIFpPTkVfTE9HVE9GSUxFCTEKKworI2VuZGlmIC8vIF9XSU4zMl9XQ0UKKyNpZm5kZWYgREJHQTJXCisjZGVmaW5lIERCR0EyVworI2VuZGlmCS8vIERCR0EyVworCisjZWxzZSAvLyAhKGRlZmluZWQgREVCVUcgfHwgZGVmaW5lZCBfREVCVUcgfHwgKGRlZmluZWQgREJHICYmIERCRyAhPSAwKSApCisjZGVmaW5lIE9VVFBVVERFQlVHTVNHKGRwcmludGZfZXhwKQorI2RlZmluZSBBU1NFUlRERUJVR01TRyhjb25kLCBkcHJpbnRmX2V4cCkKKyNlbmRpZiAvLyBERUJVRyAvIERCRworCisjaWYgIWRlZmluZWQgSENGX01BWF9NU0dfQ0tJUF9QQURESU5HCisjZGVmaW5lIEhDRl9NQVhfTVNHX0NLSVBfUEFERElORyAwCisjZW5kaWYgLy8gCQlIQ0ZfTUFYX01TR19DS0lQX1BBRERJTkcKKworI2lmICFkZWZpbmVkCUhDRl9NQVhfTVNHCisjZGVmaW5lCQkJSENGX01BWF9NU0cJCQkJMTUxNAorI2VuZGlmIC8vIAkJSENGX01BWF9NU0cKKworI2RlZmluZQkJCUhDRl9MRUdBQ1kJCQkxCS8vOz9udiBqZSBtb2V0IHdhdAorCisjZW5kaWYgLy9XVkxBTl80MSAvIFdWTEFOXzQ4IC8gV1ZMQU5fNTIgLyBfV0lOMzJfV0NFCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqICBQIEEgQyBLIEUgVCAgIEQgUiBJIFYgRSBSICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRCBPIFMgICBPIEQgSSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQgV1ZMQU5fNDIgfHwgZGVmaW5lZCBXVkxBTl80MworCisjcHJhZ21hIHdhcm5pbmcgKCBkaXNhYmxlOiA0MDAxICkKKyNkZWZpbmUgRkFSICBfX2ZhcgkJCQkJCQkJCQkvL3NlZ21lbnRlZCAxNiBiaXRzIG1vZGUKKyNkZWZpbmUgQkFTRUQgX19iYXNlZChfX3NlZ25hbWUoIl9DT0RFIikpCQkJCS8vZm9yY2UgYWxsIHRoZSAiY29uc3QiIHN0cnVjdHVyZXMgaW4gdGhlIENPREUgc2VnbWVudAorCisvLyNkZWZpbmUgSENGX0lPICAgICAwCQkJCQkJCQkJLy9ubyBETUEsIG5vIDMyIGJpdHMKKworLy9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gVG8gZWFzZSB0ZXN0aW5nIHRoZSBkaWZmZXJlbnQgb3B0aW9ucyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworI2RlZmluZQlIQ0ZfRVhUCQkJCQkJSENGX0VYVF9NQgorI2RlZmluZSBIQ0ZfUFJPVF9USU1FCQkJCTQ5CQkJCQkvLzQ5KjEwMjQwIG1pY3Jvc2Vjb25kcyBIL1cgZmFpbHVyZSBwcm90ZWN0aW9uIHRpbWVyCisKKy8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFRvIGVhc2UgdGVzdGluZyB0aGUgZGlmZmVyZW50IG9wdGlvbnMgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgQ09ORklHVVJBVElPTiBNQU5BR0VNRU5UICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdWTEFOXzQyCisjZGVmaW5lCU1TRl9DT01QT05FTlRfSUQJCQlDT01QX0lEX1BBQ0tFVAorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX1ZBUgkJCTEKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIJCTYKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJCTEyCisjZW5kaWYgLy8gV1ZMQU5fNDIKKworI2lmZGVmIFdWTEFOXzQzCisjZGVmaW5lCU1TRl9DT01QT05FTlRfSUQJCQlDT01QX0lEX09ESV8xNgorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX1ZBUgkJCTEKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIJCTYKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJCTEwCisjZW5kaWYgLy8gV1ZMQU5fNDMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBJTlBVVCAvIE9VVFBVVCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBIXzJfSU5DCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjb25pby5oPgorI2lmIDEgLy90ZW1vcmFyeSB1c2UgZnVuY3Rpb25zIGRlZmluZWQgaW4gaGNmLmMKKyNpZm5kZWYgX0RFQlVHCisjcHJhZ21hIGludHJpbnNpYyggX2lucCwgX2lucHcsIF9vdXRwLCBfb3V0cHcgKQorI2VuZGlmIC8vIF9ERUJVRworCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCSgoaGNmXzE2KV9pbnB3KCAoaGNmX2lvKShwb3J0KSApKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkoKHZvaWQpX291dHB3KCAoaGNmX2lvKShwb3J0KSwgdmFsdWUgKSkKKworI2lmIDEJCS8vIEMgaW1wbGVtZW50YXRpb24gd2hpY2ggbGV0IHRoZSBwcm9jZXNzb3IgaGFuZGxlIHRoZSB3b3JkLWF0LWJ5dGUtYm91bmRhcnkgcHJvYmxlbQorI2RlZmluZSBJTl9QT1JUX1NUUklOR184XzE2KCBwb3J0LCBhZGRyLCBuKQkJd2hpbGUgKG4tLSkgXAorCXsgKihoY2ZfMTYgRkFSKilhZGRyID0gSU5fUE9SVF9XT1JEKCBwb3J0ICk7ICgoaGNmXzggRkFSKilhZGRyKSs9MjsgfQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfOF8xNiggcG9ydCwgYWRkciwgbikJd2hpbGUgKG4tLSkgXAorCXsgT1VUX1BPUlRfV09SRCggcG9ydCwgKihoY2ZfMTYgRkFSKilhZGRyICkgOyAoKGhjZl84IEZBUiopYWRkcikrPTI7IH0KKyNlbGlmIDAJCS8vIEMgaW1wbGVtZW50YXRpb24gd2hpY2ggaGFuZGxlcyB0aGUgd29yZC1hdC1ieXRlLWJvdW5kYXJ5IHByb2JsZW0KKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfOF8xNiggcG9ydCwgYWRkciwgbikJCXdoaWxlICggbi0tICkgXAorCXsgaGNmXzE2IGkgPSBJTl9QT1JUX1dPUkQocG9ydCk7ICooKGhjZl84IEZBUiopYWRkcikrKyA9IChoY2ZfOClpOyAqKChoY2ZfOCBGQVIqKWFkZHIpKysgPSAoaGNmXzgpKGk+PjgpO30KKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzhfMTYoIHBvcnQsIGFkZHIsIG4pCXdoaWxlICggbi0tICkgXAorCXsgT1VUX1BPUlRfV09SRCggcG9ydCwgKigoaGNmXzggRkFSKilhZGRyKSB8ICooKChoY2ZfOCBGQVIqKWFkZHIpKzEpPDw4ICApOyAoaGNmXzggRkFSKilhZGRyKz0yOyB9CisjZWxzZQkJCQkJCQkJCQkJCS8vIEFzc2VtYmxlciBpbXBsZW1lbnRhdGlvbgorI2RlZmluZSBJTl9QT1JUX1NUUklOR184XzE2KCBwb3J0LCBhZGRyLCBuKSBfX2FzbQlcCit7CQkJCQkJCQkJCQkJCVwKKwlfX2FzbSBwdXNoIGRpCQkJCQkJCQkJXAorCV9fYXNtIHB1c2ggZXMJCQkJCQkJCQlcCisJX19hc20gbW92IGN4LG4JCQkJCQkJCQlcCisJX19hc20gbGVzIGRpLGFkZHIJCQkJCQkJCVwKKwlfX2FzbSBtb3YgZHgscG9ydAkJCQkJCQkJXAorCV9fYXNtIHJlcCBpbnN3CQkJCQkJCQkJXAorCV9fYXNtIHBvcCBlcwkJCQkJCQkJCVwKKwlfX2FzbSBwb3AgZGkJCQkJCQkJCQlcCit9CisKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzhfMTYoIHBvcnQsIGFkZHIsIG4pIF9fYXNtCVwKK3sJCQkJCQkJCQkJCQkJXAorCV9fYXNtIHB1c2ggc2kJCQkJCQkJCQlcCisJX19hc20gcHVzaCBkcwkJCQkJCQkJCVwKKwlfX2FzbSBtb3YgY3gsbgkJCQkJCQkJCVwKKwlfX2FzbSBsZHMgc2ksYWRkcgkJCQkJCQkJXAorCV9fYXNtIG1vdiBkeCxwb3J0CQkJCQkJCQlcCisJX19hc20gcmVwIG91dHN3CQkJCQkJCQkJXAorCV9fYXNtIHBvcCBkcwkJCQkJCQkJCVwKKwlfX2FzbSBwb3Agc2kJCQkJCQkJCQlcCit9CisKKyNlbmRpZiAvLyBBc20gb3IgQyBpbXBsZW1lbnRhdGlvbgorI2RlZmluZSBJTl9QT1JUX1NUUklOR18zMiggcG9ydCwgYWRkciwgbikJeyBpbnQgbjIgPSAyKm47IElOX1BPUlRfU1RSSU5HXzhfMTYocG9ydCwgYWRkciwgbjIpIH0KKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzMyKCBwb3J0LCBhZGRyLCBuKQl7IGludCBuMiA9IDIqbjsgT1VUX1BPUlRfU1RSSU5HXzhfMTYocG9ydCwgYWRkciwgbjIpIH0KKyNlbmRpZiAvLyAwIC8vdGVtb3JhcnkgdXNlIGZ1bmN0aW9ucyBkZWZpbmVkIGluIGhjZi5jCisjZW5kaWYgLy8gSF8yX0lOQworCisjZW5kaWYJLy8gV1ZMQU5fNDIgLyBXVkxBTl80MworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqICBEIE8gUyAgSCAtIEkgLyBJSSAgTCBPIEEgRCBFIFIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZCBIMF9MRFIgfHwgZGVmaW5lZCBIMV9MRFIgfHwgZGVmaW5lZCBIMl9MRFIgfHwgZGVmaW5lZCBINV9MRFIKKworI2lmIGRlZmluZWQgSDBfTERSCQkJCS8vaW1wbGllcyBILUkKKyNkZWZpbmUgSENGX0RMVgkJMAkJCS8vSC1JIGxlZ2FjeSwgbWVhbmluZ2xlc3MgdW5kZXIgSC1JSQorI2RlZmluZSBIQ0ZfRExOVgkxCQkJLy9ILUkgbGVnYWN5LCBtZWFuaW5nbGVzcyB1bmRlciBILUlJCisjZW5kaWYgLy8gSDBfTERSCisKKyNpZiBkZWZpbmVkIEgxX0xEUiAJCQkJLy9pbXBsaWVzIEgtSQorI2RlZmluZSBIQ0ZfRExWCQkxCQkJLy9ILUkgbGVnYWN5LCBtZWFuaW5nbGVzcyB1bmRlciBILUlJCisjZGVmaW5lIEhDRl9ETE5WCTAJCQkvL0gtSSBsZWdhY3ksIG1lYW5pbmdsZXNzIHVuZGVyIEgtSUkKKyNlbmRpZiAvLyBIMV9MRFIgLyBIMl9MRFIKKworLy8jaWYgZGVmaW5lZCBIMl9MRFIgOiBub3QgbmVlZGVkLCBILUlJIGRlZmF1bHRzIGFyZSBPLksgZm9yIEgyX0xEUgorCisjaWZkZWYgSDVfTERSCisjZGVmaW5lIEhDRl9UWVBFCQkJKEhDRl9UWVBFX0hJSTUgfCBIQ0ZfVFlQRV9XQVJQICkKKy8vOz8gd2h5IGRvZXMgb25seSB0aGlzIHN1YnNldCBvZiB0aGUgSF9MRFJzIG5lZWQgSENGX1RZUEUgdG8gYmUgZGVmaW5lZCBoZXJlCisjZW5kaWYKKworI2RlZmluZSBIQ0ZfQVNTRVJUCQkJSENGX0FTU0VSVF9MTktfTVNGX1JUTgkvL3N1cHBvcnQgZHluYW1pYyBsaW5raW5nIG9mIG1zZl9hc3NlcnQgcm91dGluZQorI2RlZmluZSBIQ0ZfRU5DQVAJCQkwCisjZGVmaW5lIEhDRl9JTlRfT04JCQkwCisjZGVmaW5lIEhDRl9UQUxMSUVTCQkJMAorCisjZGVmaW5lCU1TRl9DT01QT05FTlRfSUQJCQlDT01QX0lEX09ESV8xNiAvLzs/QnkgbGFjayBvZiBhbnkgYmV0dGVyCisjZGVmaW5lCU1TRl9DT01QT05FTlRfVkFSCQkJMQorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkJMAorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkJMAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjb25pby5oPgorI2lmIGRlZmluZWQgTkRFQlVHCisjcHJhZ21hIGludHJpbnNpYyggX2lucCwgX2lucHcsIF9vdXRwLCBfb3V0cHcgKQorI2VuZGlmIC8vIE5ERUJVRworCisjaWYgMAkJCQkJCS8vdXNlIDAgdG8gcmVwbGFjZSBJL08gTWFjcm9zIHdpdGggbG9nZ2luZyBmYWNpbGl0eQorI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkJCQkoKGhjZl8xNilfaW5wdyggKGhjZl9pbykocG9ydCkgKSkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJKCh2b2lkKV9vdXRwdyggKGhjZl9pbykocG9ydCksIHZhbHVlICkpCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKQlcCisJCXdoaWxlICggbi0tICkgeyAqKGhjZl8xNiBGQVIqKWFkZHIgPSBJTl9QT1JUX1dPUkQoIHBvcnQgKTsgKGNhc3QpYWRkciArPSAyOyB9CisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbikJXAorCQl3aGlsZSAoIG4tLSApIHsgT1VUX1BPUlRfV09SRCggcG9ydCwgKihoY2ZfMTYgRkFSKilhZGRyICkgOyAoY2FzdClhZGRyICArPSAyOyB9CisjZW5kaWYJCQkJCQkvL3VzZSAwIHRvIHJlcGxhY2UgSS9PIE1hY3JvcyB3aXRoIGxvZ2dpbmcgZmFjaWxpdHkKKworI2VuZGlmCS8vIEgwX0xEUiAvIEgxX0xEUiAvIEgyX0xEUgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqICBIIEMgRiAgRCBFIE0gTyAgUCBSIE8gRyBSIEEgTSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZCBIQ0ZfREVNTworCisjZGVmaW5lIEhDRl9ETFYJCTEJCQkJLy87P3Nob3VsZCBiZWNvbWUgdGhlIGRlZmF1bHQgIWRlZmF1bHRzIHRvIDEgYW55d2F5IGZvciBILUlJCisvLyNkZWZpbmUgSENGX0RMTlYJMAkJCQkvL2RlZmF1bHRzIHRvIDAgYW55d2F5IGZvciBILUlJCisKKyNkZWZpbmUgSENGX0FTU0VSVAlIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROCQkJLy9zdXBwb3J0IGR5bmFtaWMgbGlua2luZyBvZiBtc2ZfYXNzZXJ0IHJvdXRpbmUKKworI2RlZmluZSBIQ0ZfRU5DQVAJCQkwCisjZGVmaW5lIEhDRl9JTlRfT04JCQkwCisjZGVmaW5lIEhDRl9UQUxMSUVTCQkJKCBIQ0ZfVEFMTElFU19OSUMgfCBIQ0ZfVEFMTElFU19IQ0YgKQorCisvLyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJTk8gY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGNvbmlvLmg+CisjaWYgZGVmaW5lZCBOREVCVUcKKyNwcmFnbWEgaW50cmluc2ljKCBfaW5wLCBfaW5wdywgX291dHAsIF9vdXRwdyApCisjZW5kaWYgLy8gTkRFQlVHCisKKyNpZiAwCQkJCQkJLy91c2UgMCB0byByZXBsYWNlIEkvTyBNYWNyb3Mgd2l0aCBsb2dnaW5nIGZhY2lsaXR5CisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCSgoaGNmXzE2KV9pbnB3KCAoaGNmX2lvKShwb3J0KSApKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkoKHZvaWQpX291dHB3KCAoaGNmX2lvKShwb3J0KSwgdmFsdWUgKSkKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKKwkJd2hpbGUgKCBuLS0gKSB7ICooaGNmXzE2IEZBUiopYWRkciA9IElOX1BPUlRfV09SRCggcG9ydCApOyAoY2FzdClhZGRyICs9IDI7IH0KKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKQlcCisJCXdoaWxlICggbi0tICkgeyBPVVRfUE9SVF9XT1JEKCBwb3J0LCAqKGhjZl8xNiBGQVIqKWFkZHIgKSA7IChjYXN0KWFkZHIgICs9IDI7IH0KKyNlbmRpZgkJCQkJCS8vdXNlIDAgdG8gcmVwbGFjZSBJL08gTWFjcm9zIHdpdGggbG9nZ2luZyBmYWNpbGl0eQorCisjZW5kaWYJLy8gSENGX0RFTU8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE0gQSBDICBPIFMgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQgV1ZMQU5fNDUKKworI2luY2x1ZGUgIlZlcnNpb24uaCIKKworI2RlZmluZSBNU0ZfQ09NUE9ORU5UX0lEICAgICAgICAgICAgQ09NUF9JRF9NQUNfT1MKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9WQVIgICAgICAgICAgIFZBUklBTlQKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIgICAgIFZFUlNJT05fTUFKT1IKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIgICAgIFZFUlNJT05fTUlOT1IKKworI2RlZmluZSBNQUNfT1MgICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIEhDRl9CSUdfRU5ESUFOIDEgICAgICAgCQkvLyBzZWxlY3RzIEJpZyBFbmRpYW4gKGEuay5hLiBNb3Rvcm9sYSksIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdAorCisjaWYgZGVmaW5lZCBERUJVRworI2RlZmluZSBIQ0ZfQVNTRVJUCUhDRl9BU1NFUlRfTUIJLy8gbG9nZ2luZyB2aWEgTWFpbGJveAorI2VuZGlmIC8vIERFQlVHCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCitleHRlcm4gdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqTWFjSU9hZGRyOworZXh0ZXJuIGhjZl8xNiBJTl9QT1JUX1dPUkQoaGNmXzE2IHBvcnQpOworZXh0ZXJuIHZvaWQgICBPVVRfUE9SVF9XT1JEKGhjZl8xNiBwb3J0LCBoY2ZfMTYgdmFsdWUpOworZXh0ZXJuIHZvaWQgICBJTl9QT1JUX1NUUklOR18xNihoY2ZfMTYgcG9ydCwgdm9pZCAqYWRkciwgaGNmXzE2IGxlbik7CitleHRlcm4gdm9pZCAgIE9VVF9QT1JUX1NUUklOR18xNihoY2ZfMTYgcG9ydCwgdm9pZCAqYWRkciwgaGNmXzE2IGxlbik7CisKKyNkZWZpbmUgU3dhcEJ5dGVzKHQpICAgICgoKHQpID4+IDgpICsgKCgodCkgJiAweGZmKSA8PCA4KSkKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAgLy8gV1ZMQU5fNDUKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBMIEkgTiBVIFggICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFdWTEFOXzQ5CisjaW5jbHVkZSA8YXNtL2lvLmg+CisvLyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDx3bF92ZXJzaW9uLmg+CisKKy8qIFRoZSBmb2xsb3dpbmcgbWFjcm8gZW5zdXJlcyB0aGF0IG5vIHN5bWJvbHMgYXJlIGV4cG9ydGVkLCBtaW5pbWl6aW5nIHRoZSBjaGFuY2Ugb2YgYSBzeW1ib2wKKyAgIGNvbGxpc2lvbiBpbiB0aGUga2VybmVsICovCisvL0VYUE9SVF9OT19TWU1CT0xTOyAgLy87P3RoaXMgcGxhY2Ugc2VlbXMgbm90IGFwcHJvcHJpYXRlbHkgdG8gbWUKKworLy8jZGVmaW5lIEhDRl9TTEVFUCAoSENGX0NEUyB8IEhDRl9ERFMgKQorI2RlZmluZSBIQ0ZfU0xFRVAgKEhDRl9DRFMpCisKKy8vI2RlZmluZSBIQ0ZfVFlQRSAgICAoSENGX1RZUEVfSElJNXxIQ0ZfVFlQRV9TVEF8SENGX1RZUEVfQVApCisjaWZkZWYgSEVSTUVTMjUKKyNpZmRlZiBXQVJQCisjZGVmaW5lIEhDRl9UWVBFICAgICggSENGX1RZUEVfV0FSUCB8IEhDRl9UWVBFX0hJSTUgKQorI2Vsc2UKKyNkZWZpbmUgSENGX1RZUEUgICAgSENGX1RZUEVfSElJNQorI2VuZGlmIC8vIFdBUlAKKyNlbHNlCisjZGVmaW5lIEhDRl9UWVBFICAgIEhDRl9UWVBFX05PTkUKKyNlbmRpZiAvLyBIRVJNRVMyNQorCisjaWZkZWYgRU5BQkxFX0RNQQorI2RlZmluZSBIQ0ZfRE1BCQkxCisjZW5kaWYgLy8gRU5BQkxFX0RNQQorCisvKiBXZSBub3cgbmVlZCBhIHN3aXRjaCB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBNYWlsYm94IGFuZCBvdGhlciBuZWNlc3NhcnkgZXh0ZW5zaW9ucyAqLworI2RlZmluZSBIQ0ZfRVhUICggSENGX0VYVF9NQiB8IEhDRl9FWFRfSU5GT19MT0cgfCBIQ0ZfRVhUX0lOVF9USUNLICkvL2dldCBkZWVwc2xlZXAgZXhlcmNpc2UgZ29pbmcKKworLyogOz8gVGhlIExpbnV4IE1TRiBzdGlsbCB1c2VzIHRoZXNlIGRlZmluaXRpb25zOyBkZWZpbmUgaXQgaGVyZSB1bnRpbCBpdCdzIHJlbW92ZWQgKi8KKyNpZm5kZWYgSENGX1RZUEVfSElJCisjZGVmaW5lIEhDRl9UWVBFX0hJSSAweDAwMDQKKyNlbmRpZgorCisjaWZuZGVmIEhDRl9UWVBFX0FQCisjZGVmaW5lIEhDRl9UWVBFX0FQICAweDAwMTAKKyNlbmRpZgorCisjaWZuZGVmIEhDRl9UWVBFX1NUQQorI2RlZmluZSBIQ0ZfVFlQRV9TVEEgMHgwMDIwCisjZW5kaWYgIC8vIEhDRl9UWVBFX1NUQQorCisvKiBHdWFyYW50ZWVzIHdvcmQgYWxpZ25tZW50ICovCisjZGVmaW5lIEhDRl9BTElHTgkJMgorCisvKiBFbmRpYW4gbWFjcm9zIENOVl9JTlRfVE9fTElUVExFKCkgYW5kIENOVl9MSVRUTEVfVE9fSU5UKCkgd2VyZSByZW5hbWVkIHRvCisgICBDTlZfU0hPUlRfVE9fTElUVExFKCkgYW5kIENOVl9MSVRUTEVfVE9fU0hPUlQoKSAqLworI2lmbmRlZiBDTlZfSU5UX1RPX0xJVFRMRQorI2RlZmluZSBDTlZfSU5UX1RPX0xJVFRMRSAgIENOVl9TSE9SVF9UT19MSVRUTEUKKyNlbmRpZgorCisjaWZuZGVmIENOVl9MSVRUTEVfVE9fSU5UCisjZGVmaW5lIENOVl9MSVRUTEVfVE9fSU5UICAgQ05WX0xJVFRMRV9UT19TSE9SVAorI2VuZGlmCisKKyNkZWZpbmUJSENGX0VSUl9CVVNZCQkJMHgwNgorCisvKiBVSUwgZGVmaW5lcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgSENGICovCisjZGVmaW5lIFVJTF9TVUNDRVNTCQkJCQlIQ0ZfU1VDQ0VTUworI2RlZmluZSBVSUxfRVJSX1RJTUVfT1VUCQkJSENGX0VSUl9USU1FX09VVAorI2RlZmluZSBVSUxfRVJSX05PX05JQwkJCQlIQ0ZfRVJSX05PX05JQworI2RlZmluZSBVSUxfRVJSX0xFTgkJCQkJSENGX0VSUl9MRU4KKyNkZWZpbmUgVUlMX0VSUl9NSU4JCQkJCUhDRl9FUlJfTUFYCS8qZW5kIG9mIEhDRiBlcnJvcnMgd2hpY2ggYXJlIHBhc3NlZCB0aHJvdWdoIHRvIFVJTAorCQkJCQkJCQkJCQkJICAqKiogKiogKioqICoqKioqKiAqKioqKiAqKiogKioqKioqICoqKioqKiogKiogKioqICAqLworI2RlZmluZSBVSUxfRVJSX0lOX1VTRQkJCQkweDQ0CisjZGVmaW5lIFVJTF9FUlJfV1JPTkdfSUZCCQkJMHg0NgorI2RlZmluZSBVSUxfRVJSX01BWAkJCQkJMHg3RgkJLyp1cHBlciBib3VuZGFyeSBvZiBVSUwgZXJyb3JzIHdpdGhvdXQgSENGLXBlbmRhbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiogKioqKioqKiogKiogKioqICoqKioqKiAqKioqKioqICoqKiAqKioqKioqICAqLworI2RlZmluZSBVSUxfRVJSX0JVU1kJCQkgICAgSENGX0VSUl9CVVNZCisjZGVmaW5lIFVJTF9FUlJfRElBR18xCQkJICAgIEhDRl9FUlJfRElBR18xCisjZGVmaW5lIFVJTF9GQUlMVVJFCQkJCQkweEZGCS8qIDIwMDEwNzA1IG52IHRoaXMgcmVsaWNrIHNob3VsZCBiZSBlcmlkaWNhdGVkICovCisjZGVmaW5lIFVJTF9FUlJfUElGX0NPTkZMSUNUCQkweDQwCS8vb2Jzb2xldGUKKyNkZWZpbmUgVUlMX0VSUl9JTkNPTVBfRFJWCQkJMHg0MQkvL29ic29sZXRlCisjZGVmaW5lIFVJTF9FUlJfRE9TX0NBTEwJCQkweDQzCS8vb2Jzb2xldGUKKyNkZWZpbmUgVUlMX0VSUl9OT19EUlYJCQkJMHg0MgkvL29ic29sZXRlCisjZGVmaW5lIFVJTF9FUlJfTlNUTAkJCQkweDQ1CS8vb2Jzb2xldGUKKworCisKKyNpZiAwICAvLzs/ICNpZmRlZiBnZXQgdGhpcyBnb2luZyBMQVRFUiBIRVJNRVMyNQorI2RlZmluZSBIQ0ZfSU8gICAgICAgICAgICAgIEhDRl9JT18zMkJJVFMKKyNkZWZpbmUgSENGX0RNQSAgICAgICAgICAgICAxCisjZGVmaW5lIEhDRl9ERVNDX1NUUkNUX0VYVCAgNAorCisvKiBTd2l0Y2ggZm9yIEJ1c01hc3RlciBETUEgc3VwcG9ydC4gTm90ZSB0aGF0IHRoZSBhYm92ZSBkZWZpbmUgaW5jbHVkZXMgdGhlIERNQS1zcGVjaWZpYyBIQ0YKKyAgIGNvZGUgaW4gdGhlIGJ1aWxkLiBUaGlzIGRlZmluZSBzZXRzIHRoZSBNU0YgdG8gdXNlIERNQTsgaWYgRU5BQkxFX0RNQSBpcyBub3QgZGVmaW5lZCwgdGhlbgorICAgcG9ydCBJL08gd2lsbCBiZSB1c2VkIGluIHRoZSBidWlsZCAqLworI2lmbmRlZiBCVVNfUENNQ0lBCisjZGVmaW5lIEVOQUJMRV9ETUEKKyNlbmRpZiAgLy8gVVNFX1BDTUNJQQorCisjZW5kaWYgIC8vIEhFUk1FUzI1CisKKworLyogT3ZlcnJ1bGUgc3RhbmRhcmQgV2F2ZUxBTiBQYWNrZXQgU2l6ZSB3aGVuIGluIERNQSBtb2RlICovCisjaWZkZWYgRU5BQkxFX0RNQQorI2RlZmluZSBIQ0ZfTUFYX1BBQ0tFVF9TSVpFIDIzMDQKKyNlbHNlCisjZGVmaW5lIEhDRl9NQVhfUEFDS0VUX1NJWkUgMTUxNAorI2VuZGlmICAvLyBFTkFCTEVfRE1BCisKKy8qIFRoZSBmb2xsb3dpbmcgc2V0cyB0aGUgY29tcG9uZW50IElELCBhcyB3ZWxsIGFzIHRoZSB2ZXJzaW9uaW5nLiBTZWUgYWxzbyB3bF92ZXJzaW9uLmggKi8KKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAlDT01QX0lEX0xJTlVYCisKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9WQVIJCQlEUlZfVkFSSUFOVAorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUiAgICAgRFJWX01BSk9SX1ZFUlNJT04KKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIgICAgIERSVl9NSU5PUl9WRVJTSU9OCisKKy8qIERlZmluZSB0aGUgZm9sbG93aW5nIHRvIHR1cm4gb24gYXNzZXJ0aW9ucyBpbiB0aGUgSENGICovCisvLyNkZWZpbmUgSENGX0FTU0VSVCAgMHg4MDAwCisjZGVmaW5lIEhDRl9BU1NFUlQJCQlIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROCS8vIHN0YXRpY2FsbHkgYmluZGluZyBvZiBtc2ZfYXNzZXJ0IHJvdXRpbmUKKworI2lmZGVmIFVTRV9CSUdfRU5ESUFOCisjZGVmaW5lIEhDRl9CSUdfRU5ESUFOICAxCisjZWxzZQorI2RlZmluZSBIQ0ZfQklHX0VORElBTiAgMAorI2VuZGlmICAvKiBVU0VfQklHX0VORElBTiAqLworCisvKiBEZWZpbmUgdGhlIGZvbGxvd2luZyBpZiB5b3VyIHN5c3RlbSB1c2VzIG1lbW9yeS1tYXBwZWQgSU8gKi8KKy8vI2RlZmluZSBIQ0ZfTUVNX0lPCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB0aGUgc3RhbmRhcmQgbWFjcm9zIHJlcXVpcmVkIGJ5IHRoZSBIQ0YgdG8gbW92ZSBkYXRhIHRvL2Zyb20gdGhlIGNhcmQgKi8KKyNkZWZpbmUgSU5fUE9SVF9CWVRFKHBvcnQpCQkJKChoY2ZfOClpbmIoIChoY2ZfaW8pKHBvcnQpICkpCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCSgoaGNmXzE2KWludyggKGhjZl9pbykocG9ydCkgKSkKKyNkZWZpbmUgT1VUX1BPUlRfQllURShwb3J0LCB2YWx1ZSkJKG91dGIoIChoY2ZfOCkgKHZhbHVlKSwgKGhjZl9pbykocG9ydCkgKSkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJKG91dHcoKGhjZl8xNikgKHZhbHVlKSwgKGhjZl9pbykocG9ydCkgKSkKKworI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNihwb3J0LCBkc3QsIG4pICAgIGluc3coKGhjZl9pbykocG9ydCksIGRzdCwgbikKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KHBvcnQsIHNyYywgbikgICBvdXRzdygoaGNmX2lvKShwb3J0KSwgc3JjLCBuKQorLy8jZGVmaW5lIElOX1BPUlRfU1RSSU5HTChwb3J0LCBkc3QsIG4pICAgaW5zbCgocG9ydCksIChkc3QpLCAobikpCisvLyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HTChwb3J0LCBzcmMsIG4pICBvdXRzbCgocG9ydCksIChzcmMpLCAobikpCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzMyKHBvcnQsIGRzdCwgbikgICBpbnNsKChwb3J0KSwgKGRzdCksIChuKSkKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzMyKHBvcnQsIHNyYywgbikgIG91dHNsKChwb3J0KSwgKHNyYyksIChuKSkKKyNkZWZpbmUgSU5fUE9SVF9IQ0YzMihwb3J0KSAgICAgICAgICBpbmwoIChoY2ZfaW8pKHBvcnQpICkKKyNkZWZpbmUgT1VUX1BPUlRfSENGMzIocG9ydCwgdmFsdWUpICBvdXRsKChoY2ZfMzIpKHZhbHVlKSwgKGhjZl9pbykocG9ydCkgKQorCisjZGVmaW5lIElOX1BPUlRfRFdPUkQocG9ydCkgICAgICAgICAgSU5fUE9SVF9IQ0YzMihwb3J0KQorI2RlZmluZSBPVVRfUE9SVF9EV09SRChwb3J0LCB2YWx1ZSkgIE9VVF9QT1JUX0hDRjMyKHBvcnQsIHZhbHVlKQorCisjZGVmaW5lICBJTl9QT1JUX1NUUklOR184XzE2KHBvcnQsIGFkZHIsIGxlbikJSU5fUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKQorI2RlZmluZSAgT1VUX1BPUlRfU1RSSU5HXzhfMTYocG9ydCwgYWRkciwgbGVuKQlPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKQorCisKKyNpZm5kZWYgT1VUUFVUREVCVUdNU0cKKyNkZWZpbmUgT1VUUFVUREVCVUdNU0coZHByaW50Zl9leHApCisjZW5kaWYKKworCisjaWZuZGVmIEFTU0VSVERFQlVHTVNHCisjZGVmaW5lIEFTU0VSVERFQlVHTVNHKGNvbmQsIGRwcmludGZfZXhwKQorI2VuZGlmCisKKyNpZm5kZWYgQ0ZHX1NDQU5fQ0hBTk5FTFNfMkdIWgorI2RlZmluZSBDRkdfU0NBTl9DSEFOTkVMU18yR0haIDB4RkNDMgorI2VuZGlmIC8qIENGR19TQ0FOX0NIQU5ORUxTXzJHSFogKi8KKworI2RlZmluZSBIQ0ZfTUFYX01TRyAxNjAwIC8vZ2V0IGdvaW5nIDs/CisjZW5kaWYJLy8gV1ZMQU5fNDkKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBRIE4gWCAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQgIF9fUU5YX18gfHwgZGVmaW5lZCBXVkxBTl81MAorCisjZGVmaW5lIE1TRl9DT01QT05FTlRfSUQJCTAgICAvL0FsdGhvdWdoIHRoZXJlIGlzIG5vIERVSSBzdXBwb3J0LCB3ZSBuZWVkIHRoaXMgdG8gZ2V0IC4uLgorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX1ZBUgkJMAkvLy4uLmNvbXBhdGliaWx0eSBjaGVjayB0byBmdW5jdGlvbgorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkwCS8vLi4uOz90aGlzIGlzIHdvcnRoIGxvb2tpbmcgaW50byB0byBtYWtlIHRoaXMgYSBtb3JlCisjZGVmaW5lIE1TRl9DT01QT05FTlRfTUlOT1JfVkVSCTAJLy8uLi4iZGVmaW5lZCIgSS9GIHNvIE9FTWVycyBjYW4gZmlndXJlIG91dCB3aGF0IHRvIGRvCisKKyNpbmNsdWRlIDxjb25pby5oPgorCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCSgoaGNmXzE2KWlucHcoIChoY2ZfaW8pKHBvcnQpICkpCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCShvdXRwdyggKGhjZl9pbykocG9ydCksIChoY2ZfMTYpICh2YWx1ZSkgKSkKKy8qCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKQlcCisJCXdoaWxlICggbi0tICkgeyAqKGhjZl8xNiopYWRkciA9IElOX1BPUlRfV09SRCggcG9ydCApOyAoY2FzdClhZGRyICs9IDI7IH0KKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKQlcCisJCXdoaWxlICggbi0tICkgeyBPVVRfUE9SVF9XT1JEKCBwb3J0LCAqKGhjZl8xNiopYWRkciApIDsgKGNhc3QpYWRkciAgKz0gMjsgfQorKi8KKworI2VuZGlmCS8vIFFOWCAvIFdWTEFOXzUwCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgQiBFIE8gUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkICBfX0JFT1NfXworCisjZGVmaW5lIE1TRl9DT01QT05FTlRfSUQJCTAgICAvL0FsdGhvdWdoIHRoZXJlIGlzIG5vIERVSSBzdXBwb3J0LCB3ZSBuZWVkIHRoaXMgdG8gZ2V0IC4uLgorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX1ZBUgkJMAkvLy4uLmNvbXBhdGliaWx0eSBjaGVjayB0byBmdW5jdGlvbgorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkwCS8vLi4uOz90aGlzIGlzIHdvcnRoIGxvb2tpbmcgaW50byB0byBtYWtlIHRoaXMgYSBtb3JlCisjZGVmaW5lIE1TRl9DT01QT05FTlRfTUlOT1JfVkVSCTAJLy8uLi4iZGVmaW5lZCIgSS9GIHNvIE9FTWVycyBjYW4gZmlndXJlIG91dCB3aGF0IHRvIGRvCisKKyNpbmNsdWRlIDxkcml2ZXJzL0RyaXZlcnMuaD4KKyNpbmNsdWRlIDxkcml2ZXJzL0tlcm5lbEV4cG9ydC5oPgorCit1aW50OCByZWFkX2lvXzggKGludCk7Cit2b2lkIHdyaXRlX2lvXzggKGludCwgdWludDgpOwordWludDE2IHJlYWRfaW9fMTYgKGludCk7Cit2b2lkIHdyaXRlX2lvXzE2IChpbnQsIHVpbnQxNik7CisKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJKChoY2ZfMTYpcmVhZF9pb18xNiggKGhjZl9pbykocG9ydCkgKSkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJKHdyaXRlX2lvXzE2KCAoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikgKHZhbHVlKSApKQorLyoKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKKwkJd2hpbGUgKCBuLS0gKSB7ICooaGNmXzE2KilhZGRyID0gSU5fUE9SVF9XT1JEKCBwb3J0ICk7IChjYXN0KWFkZHIgKz0gMjsgfQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKKwkJd2hpbGUgKCBuLS0gKSB7IE9VVF9QT1JUX1dPUkQoIHBvcnQsICooaGNmXzE2KilhZGRyICkgOyAoY2FzdClhZGRyICArPSAyOyB9CisqLworI2VuZGlmCS8vIF9fQkVPU19fCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBVIFMgQiAgIEQgTyBOIEcgTCBFICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkIFVTQgorI2luY2x1ZGUgImdwaWYuaCIKKworI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkJMAorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkJMQorCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCShIZXJtZXNfSU9fUmVhZCggKGhjZl84KShwb3J0KSkpCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCShIZXJtZXNfSU9fV3JpdGUoIChoY2ZfOClwb3J0LCAvKihoY2ZfMTYpKi8odmFsdWUpICkgKQorLyogISEhISBOT1RFIFVTQiBzdXBwb3J0cyBvbmx5IDE2LWJpdHMgSS9PIGFuZCBubyA4LWJpdHMgSS9PCisgKiBhcyBhIGNvbnNlcXVlbmNlIHRoZSBJTl8vT1VUX1BPUlRfU1RSSU5HXzE2IG1hY3JvcyB1c2UgaGNmXzE2KiByYXRoZXIgdGhhbiBoY2ZfOCBwb2ludGVycworICogdG8gZ2V0IG1vcmUgb3B0aW1hbCBjb2RlCisgKiB0aGVyZWZvcmUgdGhlIHBvaW50ZXJzIGFyZSBpbmNyZW1lbnRlZCBieSAxICh3aGljaCBtZWFucyB0d28gImJ5dGVzIikgcmF0aGVyIHRoYW4gYnkgMgorICovCisvLyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCXdoaWxlICggbi0tICkgeyAqKChoY2ZfMTYqKWFkZHIpKysgPSBJTl9QT1JUX1dPUkQoIHBvcnQgKTsgfQorLy8jZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbikJd2hpbGUgKCBuLS0gKSB7IE9VVF9QT1JUX1dPUkQoIHBvcnQsICooKGhjZl8xNiopYWRkcikrKyApOyB9CisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBkc3QsIG4pCXdoaWxlICggbi0tICkgeyAqZHN0KysgPSBJTl9QT1JUX1dPUkQoIHBvcnQgKTsgfQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYoIHBvcnQsIHNyYywgbikJd2hpbGUgKCBuLS0gKSB7IE9VVF9QT1JUX1dPUkQoIHBvcnQsICpzcmMrKyApOyB9CisKKy8vI2RlZmluZSBIQ0ZfVFlQRQkoIEhDRl9UWVBFX0FQIHwgSENGX1RZUEVfV1BBICkKKyNkZWZpbmUgSENGX1RZUEUJSENGX1RZUEVfV1BBCisKKyNlbmRpZgkvLyBVU0IKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJlZUJTRCAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkIF9fRlJFRV9CU0RfXworCisjZGVmaW5lCU1TRl9DT01QT05FTlRfSUQJCQlDT01QX0lEX0ZyZWVCU0QKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9WQVIJCQkxCisjZGVmaW5lCU1TRl9DT01QT05FTlRfTUFKT1JfVkVSCQkxCisjZGVmaW5lCU1TRl9DT01QT05FTlRfTUlOT1JfVkVSCQkwCisKKyNkZWZpbmUgSENGX0lPIAkJCQkJCUhDRl9JT19NRU0JCS8vIG92ZXJydWxlIHN0YW5kYXJkIFBvcnQgSS9PIHdpdGggTWVtb3J5IG1hcHBlZCBJL08KKworI2luY2x1ZGUgPG1hY2hpbmUvY3B1ZnVuYy5oPgorCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCSgoaGNmXzE2KWludyggKGhjZl9pbykocG9ydCkgKSkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJKG91dHcoKGhjZl9pbykocG9ydCksIChoY2ZfMTYpKHZhbHVlKSkpCisKKy8qCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKQlcCisJCXdoaWxlICggbi0tICkgeyAqKGhjZl8xNiopYWRkciA9IElOX1BPUlRfV09SRCggcG9ydCApOyAoY2FzdClhZGRyICs9IDI7IH0KKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKQlcCisJCXdoaWxlICggbi0tICkgeyBPVVRfUE9SVF9XT1JEKCBwb3J0LCAqKGhjZl8xNiopYWRkciApIDsgKGNhc3QpYWRkciAgKz0gMjsgfQorKi8KKyNlbmRpZgkvLyBfX0ZSRUVfQlNEX18KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBXIEEgViBFIFAgTyBJIE4gVCAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQgV1ZMQU5fODEJLyogQk9STEFOREMgKi8KKworI2RlZmluZSBFWFRFUk5fQyAgZXh0ZXJuCS8vIG5lZWRlZCBiZWNhdXNlIERIRiB1c2VzIHRoaXMgaW5zdGVhZCBvZiAnZXh0ZXJuJworCisjZGVmaW5lCU1TRl9DT01QT05FTlRfSUQJQ09NUF9JRF9BUDEKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9WQVIJCQkxCisjZGVmaW5lCU1TRl9DT01QT05FTlRfTUFKT1JfVkVSCQk0CisjZGVmaW5lCU1TRl9DT01QT05FTlRfTUlOT1JfVkVSCQkwCisKKyNkZWZpbmUgSENGX1BST1RfVElNRQkJCQk0OQkvLzQ5KjEwMjQwIG1pY3Jvc2Vjb25kcyBIL1cgZmFpbHVyZSBwcm90ZWN0aW9uIHRpbWVyCisKKy8vI2RlZmluZSBIQ0ZfQVNTRVJUCUhDRl9BU1NFUlRfTUIJLy8gbG9nZ2luZyB2aWEgTWFpbGJveAkvKiBkZWJ1ZyBidWlsZCBvbmx5ICovCisKKyNpZiAhZGVmaW5lZCBGQVIKKyNkZWZpbmUgRkFSICBmYXIJCQkJCQkvLyBzZWdtZW50ZWQgMTYgYml0cyBtb2RlCisjZW5kaWYgLy8gRkFSCisKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJCQkoaW5wb3J0KCAoaGNmX2lvKShwb3J0KSApKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkJCShvdXRwb3J0KCAoaGNmX2lvKShwb3J0KSwgdmFsdWUgKSkKKworI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBsZW4pCVwKKwlhc20geyBwdXNoIGRpOyBwdXNoIGVzOyBtb3YgY3gsbGVuOyBsZXMgZGksYWRkcjsgbW92IGR4LHBvcnQ7IHJlcCBpbnN3OyBwb3AgZXM7IHBvcCBkaSB9CisKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGFkZHIsIGxlbikJXAorCWFzbSB7IHB1c2ggc2k7IHB1c2ggZHM7IG1vdiBjeCxsZW47IGxkcyBzaSxhZGRyOyBtb3YgZHgscG9ydDsgcmVwIG91dHN3OyBwb3AgZHM7IHBvcCBzaSB9CisKKyNlbmRpZiAvLyBXVkxBTl84MQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFcgQSBWIEUgTCBBIFUgTiBDIEggICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQgV1ZMQVVOQ0gKKworI2luY2x1ZGUgIkRyaXZlclguaCIKK2V4dGVybiBIV0RFVklDRSoJZ19wRGV2aWNlOworCisvLyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJCTAgIC8vOz8gdG8gZ2V0IGFyb3VuZCBicm93c2VyIHByb2JsZW0KKworI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkJSHdJbnB3KCBnX3BEZXZpY2UsIHBvcnQgKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQlId091dHB3KCBnX3BEZXZpY2UsIHBvcnQsIHZhbHVlICkKKworCisvLyBDIGltcGxlbWVudGF0aW9uIHdoaWNoIGxldCB0aGUgcHJvY2Vzc29yIGhhbmRsZSB0aGUgd29yZC1hdC1ieXRlLWJvdW5kYXJ5IHByb2JsZW0KKy8qCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKQlcCisJCXdoaWxlICggbi0tICkgeyAqKGhjZl8xNiBGQVIqKWFkZHIgPSBJTl9QT1JUX1dPUkQoIHBvcnQgKTsgKGNhc3QpYWRkciArPSAyOyB9CisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbikJXAorCQl3aGlsZSAoIG4tLSApIHsgT1VUX1BPUlRfV09SRCggcG9ydCwgKihoY2ZfMTYgRkFSKilhZGRyICkgOyAoY2FzdClhZGRyICArPSAyOyB9CisqLworI2VuZGlmIC8vIFdWTEFVTkNICisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFcgQyBJIFQgUyBUICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkIFdDSVRTVAorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX0lECQkwICAgLy9BbHRob3VnaCB0aGVyZSBpcyBubyBEVUkgc3VwcG9ydCwgd2UgbmVlZCB0aGlzIHRvIGdldCAuLi4KKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9WQVIJCTAJLy8uLi5jb21wYXRpYmlsdHkgY2hlY2sgdG8gZnVuY3Rpb24KKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIJMAkvLy4uLjs/dGhpcyBpcyB3b3J0aCBsb29raW5nIGludG8gdG8gbWFrZSB0aGlzIGEgbW9yZQorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkwCS8vLi4uImRlZmluZWQiIEkvRiBzbyBPRU1lcnMgY2FuIGZpZ3VyZSBvdXQgd2hhdCB0byBkbworCisvLyNkZWZpbmUgSENGX0VOQ0FQCQkJCUhDRl9FTkNfTk9ORQkvL3RvIGdldCBnb2luZworLy9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gVG8gZWFzZSB0ZXN0aW5nIHRoZSBkaWZmZXJlbnQgb3B0aW9ucyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyNkZWZpbmUgSENGX1RZUEUgKEhDRl9UWVBFX1dQQSB8IEhDRl9UWVBFX1BSRUxPQURFRCkgLy8gSGVybWVzLUkgZm9yIEhDRjYsIElJIGZvciBIQ0Y3CisjZGVmaW5lIAkJSENGX0RNQQkJCQkxCisvLyNkZWZpbmUgTExCCS8vISEhIU1JQyBEZWJ1ZyBPbmx5CisjaWYgZGVmaW5lZCBMTEIgJiYgISgoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBKQorZXJyOiBubyBMTEIgdW5sZXNzIFNTTjsKKyNlbmRpZiAvLyBMTEIgLyBIQ0ZfVFlQRV9XUEEKKy8vI2RlZmluZSBIQ0ZfQUxJR04gMgorI2RlZmluZSBIQ0ZfRExWCQkxCQkJLy9qdXN0IHRvIGNoYW5nZSBtZW1vcnkgbGF5b3V0ID8/Pz87PworLy9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gVG8gZWFzZSB0ZXN0aW5nIHRoZSBkaWZmZXJlbnQgb3B0aW9ucyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworI2RlZmluZSBIQ0ZfQVNTRVJUCUhDRl9BU1NFUlRfU1dfU1VQCS8vIGxvZ2dpbmcgdmlhIEhlcm1lcyBzdXBwb3J0IHJlZ2lzdGVycgorLy8jZGVmaW5lIEhDRl9BU1NFUlQJCUhDRl9BU1NFUlRfTUIJCS8vIGxvZ2dpbmcgdmlhIE1haWxib3gKKworI2lmIGRlZmluZWQgX19HTlVDX18KKyNpbmNsdWRlICJzdGRpby5oIgorLy8jaW5jbHVkZSAidW5pc3RkLmgiCS8vaW9wZXJtICAgbGliYzUKKyNpbmNsdWRlICJzeXMvaW8uaCIJLy9pb3Blcm0gICBnbGliYworI2RlZmluZSBleHRlcm4JCS8vc2VlIElPIFBvcnQgUHJvZ3JhbW1pbmcgbWluaS1IT1dUTworLy8jaW5jbHVkZSAiYXNtL2lvLmgiCS8vCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCWludyggKGhjZl9pbykocG9ydCkgKQorI2RlZmluZSBJTl9QT1JUX0RXT1JEKHBvcnQpCQkJaW5sKCAoaGNmX2lvKShwb3J0KSApCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCW91dHcoIChoY2ZfaW8pKHBvcnQpLCAoaGNmXzE2KSh2YWx1ZSkgKQorI2RlZmluZSBPVVRfUE9SVF9EV09SRChwb3J0LCB2YWx1ZSkJb3V0bCggKGhjZl9pbykocG9ydCksIChoY2ZfMTYpKHZhbHVlKSApCisjZWxzZQorI3ByYWdtYSB3YXJuaW5nICggZGlzYWJsZTogNDAwMSApCisjZGVmaW5lIEZBUiAgX19mYXIJCQkJCS8vIHNlZ21lbnRlZCAxNiBiaXRzIG1vZGUKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y29uaW8uaD4KKyNpZm5kZWYgX0RFQlVHCisjcHJhZ21hIGludHJpbnNpYyggX2lucCwgX2lucHcsIF9vdXRwLCBfb3V0cHcgKQorI2VuZGlmIC8vIF9ERUJVRworCisjaWZkZWYgTE9HCitleHRlcm4gRklMRSogdXRtX2xvZ2ZpbGU7CitoY2ZfMTYJaXB3KCBoY2ZfMTYgcG9ydCApOworaGNmXzgJaXBiKCBoY2ZfMTYgcG9ydCApOwordm9pZAlvcHcoIGhjZl8xNiBwb3J0LCBoY2ZfMTYgdmFsdWUgKTsKK3ZvaWQJb3BiKCBoY2ZfMTYgcG9ydCwgaGNmXzggdmFsdWUgKTsKKworI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkJCQlpcHcoIChoY2ZfaW8pKHBvcnQpICkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJb3B3KCAoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikodmFsdWUpICkKKyNlbHNlIC8vIExPRworI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkJCQkoKGhjZl8xNilfaW5wdyggKGhjZl9pbykocG9ydCkgKSkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJKCh2b2lkKV9vdXRwdyggKGhjZl9pbykocG9ydCksIHZhbHVlICkpCisjZW5kaWYgLy8gTE9HCisKKyNpZiAxIC8vQVNNIGV4YW1wbGUKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIGxlbikgX19hc20JCVwKK3sJCQkJCQkJCQkJCQkJCVwKKwlfX2FzbSBwdXNoIGRpCQkJCQkJCQkJCVwKKwlfX2FzbSBwdXNoIGVzCQkJCQkJCQkJCVwKKwlfX2FzbSBtb3YgY3gsbGVuCQkJCQkJCQkJXAorCV9fYXNtIGxlcyBkaSxhZGRyCQkJCQkJCQkJXAorCV9fYXNtIG1vdiBkeCxwb3J0CQkJCQkJCQkJXAorCV9fYXNtIHJlcCBpbnN3CQkJCQkJCQkJCVwKKwlfX2FzbSBwb3AgZXMJCQkJCQkJCQkJXAorCV9fYXNtIHBvcCBkaQkJCQkJCQkJCQlcCit9CisKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBsZW4pIF9fYXNtCQlcCit7CQkJCQkJCQkJCQkJCQlcCisJX19hc20gcHVzaCBzaQkJCQkJCQkJCQlcCisJX19hc20gcHVzaCBkcwkJCQkJCQkJCQlcCisJX19hc20gbW92IGN4LGxlbgkJCQkJCQkJCVwKKwlfX2FzbSBsZHMgc2ksYWRkcgkJCQkJCQkJCVwKKwlfX2FzbSBtb3YgZHgscG9ydAkJCQkJCQkJCVwKKwlfX2FzbSByZXAgb3V0c3cJCQkJCQkJCQkJXAorCV9fYXNtIHBvcCBkcwkJCQkJCQkJCQlcCisJX19hc20gcG9wIHNpCQkJCQkJCQkJCVwKK30KKworI2VuZGlmCS8vIGFzbSBleGFtcGxlCisKKyNlbmRpZiAvLyBfX0dDQ19fCisKKyNpZiAhIGRlZmluZWQgSU5fUE9SVF9TVFJJTkdfMTYKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pICB3aGlsZSAobi0tKSBcCisJeyAqKGhjZl8xNiBGQVIqKWFkZHIgPSBJTl9QT1JUX1dPUkQoIHBvcnQgKTsgKChoY2ZfMTYgRkFSKilhZGRyKSsrOyB9CisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbikgd2hpbGUgKG4tLSkgXAorCXsgT1VUX1BPUlRfV09SRCggcG9ydCwgKihoY2ZfMTYgRkFSKilhZGRyICk7ICgoaGNmXzE2IEZBUiopYWRkcikrKzsgfQorI2VuZGlmIC8vIElOX1BPUlRfU1RSSU5HXzE2CisKKyNlbmRpZgkvLyBXQ0lUU1QKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1vdG9yb2xhIFBvd2VyIFBDIDgwMCBmYW1pbHkgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBrbm93biB1c2VyczogTEhASQorICovCisKKyNpZiBkZWZpbmVkIElfTVBDOFhYCisKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9WQVIJCTAKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9JRAkJMAorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkxCisjZGVmaW5lIE1TRl9DT01QT05FTlRfTUlOT1JfVkVSCTAKKworI2RlZmluZSBIQ0ZfSFNJX1ZBUgkJCQkxCisKKyNkZWZpbmUgSENGX0JJR19FTkRJQU4JCQkxCisjZGVmaW5lIEhDRl9JTyAJCQkJCUhDRl9JT19NRU0JCS8vIG92ZXJydWxlIHN0YW5kYXJkIFBvcnQgSS9PIHdpdGggTWVtb3J5IG1hcHBlZCBJL08KKworI2luY2x1ZGUgIm9fcG9ydGJsLmgiCisjaW5jbHVkZSAiaXBjbWNpYS5oIgordHlwZWRlZiBvX3VpbnQ4X3QgIGhjZl84OwordHlwZWRlZiBvX3VpbnQxNl90IGhjZl8xNjsKK3R5cGVkZWYgb191aW50MzJfdCBoY2ZfMzI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmZGVmIF9saW50CisjZWxzZQorYXNtIGhjZl8xNiBJTl9QT1JUX1dPUkQoaW50IHBvcnQpCit7CislIHJlZyBwb3J0CisgICAgbGhicnggcjMscjAscG9ydAorICAgIGVpZWlvCit9CisjZW5kaWYgLy8gX2xpbnQKKworCisjaWZkZWYgX2xpbnQKKyNlbHNlCithc20gdm9pZCBPVVRfUE9SVF9XT1JEKGludCBwb3J0LCBoY2ZfMTYgdmFsdWUpCit7CislIHJlZyBwb3J0LCB2YWx1ZQorICAgIHN0aGJyeCB2YWx1ZSxyMCxwb3J0CisgICAgZWllaW8KK30KKyNlbmRpZiAvLyBfbGludAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGFkZHIsIGxlbikgICAgICAgICAgICAgICBcCisgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB1bnNpZ25lZCBsID0gKGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBoY2ZfMTYgKmQgPSAodm9sYXRpbGUgaGNmXzE2ICopKGFkZHIpOyAgICAgICAgICBcCisgICAgICB3aGlsZSAobC0tKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAqZCsrID0gKih2b2xhdGlsZSBoY2ZfMTYgKikocG9ydCk7ICAgICAgICAgICBcCisgICAgICAgICBFSUVJTygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB9CisKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGFkZHIsIGxlbikgICAgICAgICAgIFwKKyAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHVuc2lnbmVkIGwgPSAobGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGhjZl8xNiAqcyA9ICh2b2xhdGlsZSBoY2ZfMTYgKikoYWRkcik7ICAgICAgICAgIFwKKyAgICAgIHdoaWxlIChsLS0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICoodm9sYXRpbGUgaGNmXzE2ICopKHBvcnQpID0gKnMrKzsgICAgICAgICAgIFwKKyAgICAgICAgIEVJRUlPKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIH0KKworI2VuZGlmCS8vIElfTVBDOFhYCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBEaWFiIG9yIEhpZ2ggQyAyOUsgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBrbm93biB1c2VyczogR0tAQworICovCisKKyNpZiBkZWZpbmVkIF9BTTI5SworCisjZGVmaW5lIE1TRl9DT01QT05FTlRfVkFSCQkwCisjZGVmaW5lIE1TRl9DT01QT05FTlRfSUQJCUNPTVBfSURfQVAxCisjZGVmaW5lIE1TRl9DT01QT05FTlRfTUFKT1JfVkVSCTEKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJMAorCisjZGVmaW5lIEhDRl9CSUdfRU5ESUFOCQkJMQorI2RlZmluZSBIQ0ZfSU8gCQkJCQlIQ0ZfSU9fTUVNCQkvLyBvdmVycnVsZSBzdGFuZGFyZCBQb3J0IEkvTyB3aXRoIE1lbW9yeSBtYXBwZWQgSS9PCisKKyNkZWZpbmUgU3dhcEJ5dGVzKHQpICAgIC8qbGludCAtZTU3MiovKCgodCkgPj4gOCkgKyAoKCh0KSAmIDB4ZmYpIDw8IDgpKS8qbGludCArZTU3MiovCisKKyNpZiBkZWZpbmVkIF9fcHBjCisgICAgI2lmbmRlZiBfX0dOVUNfXworICAgICAgICAjZGVmaW5lIF9fYXNtX18gICAgIGFzbQorICAgICNlbmRpZgorCisgICAgI2lmICEgZGVmaW5lZCBfbGludAorICAgICAgICAjZGVmaW5lIEVJRUlPKCkgICAgIF9fYXNtX18oIiBlaWVpbyIpCisgICAgI2Vsc2UKKyAgICAgICAgI2RlZmluZSBFSUVJTygpCisgICAgI2VuZGlmCisKKyAgICBzdGF0aWMgaGNmXzE2IElOX1BPUlRfV09SRChpbnQgcG9ydCkgeworICAgICAgICBoY2ZfMTYgdmFsdWUgPSAqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KTsgRUlFSU8oKTsKKyAgICAgICAgdmFsdWUgPSBTd2FwQnl0ZXModmFsdWUpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKSAgICAgIFwKKyAgICAgICAgICAgIHsgKih2b2xhdGlsZSBoY2ZfMTYgKikocG9ydCkgPSBTd2FwQnl0ZXModmFsdWUpOyBFSUVJTygpOyB9CisjZWxzZQorICAgICNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpICgqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KSkKKyAgICAjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpICgqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KSA9ICh2YWx1ZSkpCisjZW5kaWYgLy8gX19wcGMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbGVuKSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbCA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgaGNmXzE2IHQsICpkID0gKHZvbGF0aWxlIGhjZl8xNiAqKShhZGRyKTsgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGwtLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBJTl9QT1JUX1dPUkQocG9ydCk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkKysgPSBTd2FwQnl0ZXModCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbGVuKSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbCA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgaGNmXzE2IHQsICpzID0gKHZvbGF0aWxlIGhjZl8xNiAqKShhZGRyKTsgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsLS0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gKnMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVRfUE9SVF9XT1JEKHBvcnQsIFN3YXBCeXRlcyh0KSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworI2lmIFBST0RVQ1QgPT0gOTE1MAorICAgICNkZWZpbmUgSENGX0FTU0VSVAlIQ0ZfQVNTRVJUX01CCS8vIGxvZ2dpbmcgdmlhIE1haWxib3gKKyAgICAjdW5kZWYgTVNGX0NPTVBPTkVOVF9JRAorI2VuZGlmIC8vIDkxNTAKKworI2VuZGlmCS8vIF9BTTI5SworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBDODYwICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoga25vd24gdXNlcnM6IFJSCisgKi8KKworI2lmIGRlZmluZWQgQ1BVCisjaWYgQ1BVID09IFBQQzg2MAorCisjZGVmaW5lIE1TRl9DT01QT05FTlRfVkFSCQkwCisjZGVmaW5lIE1TRl9DT01QT05FTlRfSUQJCTAKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIJMQorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkwCisKKyNkZWZpbmUgSENGX0JJR19FTkRJQU4JCQkxCisjZGVmaW5lIEhDRl9JTyAJCQkJCUhDRl9JT19NRU0JCS8vIG92ZXJydWxlIHN0YW5kYXJkIFBvcnQgSS9PIHdpdGggTWVtb3J5IG1hcHBlZCBJL08KKworI2RlZmluZSBTd2FwQnl0ZXModCkgICAgLypsaW50IC1lNTcyKi8oKCh0KSA+PiA4KSArICgoKHQpICYgMHhmZikgPDwgOCkpLypsaW50ICtlNTcyKi8KKworI2lmbmRlZiBfX0dOVUNfXworICAgICNkZWZpbmUgX19hc21fXyAgICAgYXNtCisjZW5kaWYKKworI2lmICEgZGVmaW5lZCBfbGludAorICAgICNkZWZpbmUgRUlFSU8oKSAgICAgX19hc21fXygiIGVpZWlvIikKKyNlbHNlCisgICAgI2RlZmluZSBFSUVJTygpCisjZW5kaWYKKworc3RhdGljIGhjZl8xNiBJTl9QT1JUX1dPUkQoaW50IHBvcnQpIHsKKyAgICBoY2ZfMTYgdmFsdWUgPSAqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KTsgRUlFSU8oKTsKKyAgICB2YWx1ZSA9IFN3YXBCeXRlcyh2YWx1ZSk7CisgICAgcmV0dXJuIHZhbHVlOworICAgICNpZmRlZiBfX0dOVUNfXworICAgICAgICAvKiB0aGUgZm9sbG93aW5nIHNlcnZlcyB0byBhdm9pZCB0aGUgY29tcGlsZXIgd2FybmluZ3MgdGhhdAorICAgICAgICAgKiBJTl9QT1JUX1dPUkQoKSBpcyBub3QgdXNlZCBpbiBzb21lIGZpbGVzICovCisgICAgICAgICh2b2lkKUlOX1BPUlRfV09SRDsKKyAgICAjZW5kaWYKK30KKworI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKSAgICAgIFwKKyAgICAgICAgeyAqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KSA9IFN3YXBCeXRlcyh2YWx1ZSk7IEVJRUlPKCk7IH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbGVuKSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbCA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgaGNmXzE2IHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgaGNmXzE2ICpkID0gKHZvbGF0aWxlIGhjZl8xNiAqKShhZGRyKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGwtLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBJTl9QT1JUX1dPUkQocG9ydCk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkKysgPSBTd2FwQnl0ZXModCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbGVuKSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbCA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgaGNmXzE2IHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgaGNmXzE2ICpzID0gKHZvbGF0aWxlIGhjZl8xNiAqKShhZGRyKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsLS0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gKnMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVRfUE9SVF9XT1JEKHBvcnQsIFN3YXBCeXRlcyh0KSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworI2lmIFBST0RVQ1QgPT0gOTE1MAorICAgICNkZWZpbmUgSENGX0FTU0VSVAlIQ0ZfQVNTRVJUX01CCS8vIGxvZ2dpbmcgdmlhIE1haWxib3gKKyAgICAjdW5kZWYgTVNGX0NPTVBPTkVOVF9JRAorI2VuZGlmCisKKyNlbmRpZgkvKiBQUEM4NjAgKi8KKyNlbmRpZgkvKiBDUFUgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTWljcm90ZWMgUmVzZWFyY2ggODBYODYgQ29tcGlsZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIDAKKworLy8jdW5kZWYgSENGX1RZUEUJCQkJCQkJCQkvLyBIZXJtZXMtSSBTdGF0aW9uIEYvVyB3aXRob3V0IFNTTiBzdXBwb3J0CisKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9WQVIgICAgICAgMAorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX0lEICAgICAgICAwCisjZGVmaW5lIE1TRl9DT01QT05FTlRfTUFKT1JfVkVSIDEKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIgMAorCitleHRlcm4gaW50IGZhciBpbnAoIGludCApOworZXh0ZXJuIHZvaWQgZmFyIG91dHAoIGludCwgaW50ICk7CitleHRlcm4gaW50IGZhciBpbnB3KCBpbnQgKTsKK2V4dGVybiB2b2lkIGZhciBvdXRwdyggaW50LCBpbnQgKTsKKworI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkJCSgoaGNmXzE2KWlucHcoIChoY2ZfaW8pKHBvcnQpICkpCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCSgodm9pZClvdXRwdyggKGhjZl9pbykocG9ydCksIHZhbHVlICkpCisKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIGxlbikgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGwgPSAobGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhjZl8xNiAqZCA9IChoY2ZfMTYgKikoYWRkcik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsLS0pICpkKysgPSAgSU5fUE9SVF9XT1JEKHBvcnQpOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIGxlbikgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGwgPSAobGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhjZl8xNiAqcyA9IChoY2ZfMTYgKikoYWRkcik7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobC0tKSBPVVRfUE9SVF9XT1JEKHBvcnQsICpzKyspOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYJLyogTWljcm90ZWMgODBYODYgQyBDb21waWxlciAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFcgQSBWIEUgTCBBIE4gIEUgQyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoga25vd24gdXNlcnM6IEtNCisgKi8KKworI2lmZGVmIG1jNjgzMDIKKworI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lECQkJQ09NUF9JRF9FQworCisjaW5jbHVkZSA8dmVyc2lvbi5oPgorCisjZGVmaW5lCU1TRl9DT01QT05FTlRfVkFSCQkJMQorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkJTUFKT1JfVkVSU0lPTgorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkJTUlOT1JfVkVSU0lPTgorCisjZGVmaW5lIEhDRl9CSUdfRU5ESUFOCQkJCTEKKyNkZWZpbmUgSENGX0lPIAkJCQkJCUhDRl9JT19NRU0JCS8vIG92ZXJydWxlIHN0YW5kYXJkIFBvcnQgSS9PIHdpdGggTWVtb3J5IG1hcHBlZCBJL08KKworI2RlZmluZSBTd2FwQnl0ZXModCkJLypsaW50IC1lNTcyKi8oKCh0KSA+PiA4KSArICgoKHQpICYgMHhmZikgPDwgOCkpLypsaW50ICtlNTcyKi8KKworI2RlZmluZSBQQ01DSUFfQUREUkVTUyAweGM4MDAwMFVMCisKKyNkZWZpbmUgSU5fUE9SVF8yQllURVMocG9ydCkJCQkgKCooaGNmXzE2ICopKHBvcnQpKQorI2lmIDAKK3N0YXRpYyBoY2ZfMTYgSU5fUE9SVF9XT1JEKGhjZl8zMiBwb3J0KSAvLyBzaG91bGQgYmUgaGNmX2lvLCBub3QgaGNmXzMyCit7CisgIGhjZl8xNiB3b3JkID0gSU5fUE9SVF8yQllURVMocG9ydCk7CisgIHJldHVybiBTd2FwQnl0ZXMod29yZCk7Cit9CisjZWxzZQorc3RhdGljIGhjZl8xNiBzd2FwX3ZhcjsKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpIFwKKyAgKCgoc3dhcF92YXIgPSBJTl9QT1JUXzJCWVRFUyhwb3J0KSkgPj4gOCkgKyAoKChzd2FwX3ZhcikgJiAweGZmKSA8PCA4KSkKKyNlbmRpZgorI2RlZmluZSBPVVRfUE9SVF8yQllURVMocG9ydCwgdmFsdWUpCSAoKihoY2ZfMTYgKikocG9ydCkgPSAoaGNmXzE2KSh2YWx1ZSkpCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCQkgT1VUX1BPUlRfMkJZVEVTKHBvcnQsIFN3YXBCeXRlcyh2YWx1ZSkpCisKKy8qCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGFkZHIsIGxlbikJICBcCisJd2hpbGUgKChsZW4pLS0pIHsqKGhjZl8xNiAqKShhZGRyKSA9IElOX1BPUlRfMkJZVEVTKHBvcnQpOyAoKGNhc3QpYWRkcikgKz0gMjsgfQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKQkgIFwKKwl3aGlsZSAoKGxlbiktLSkge09VVF9QT1JUXzJCWVRFUygocG9ydCksICooaGNmXzE2ICopKGFkZHIpKSA7ICgoY2FzdClhZGRyKSAgKz0gMjsgfQorKi8KKworI2VuZGlmCS8qIG1jNjgzMDIgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBOR0FQICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQgX19WWF9XT1JLU19fCS8qIFZ4V29ya3MgKi8KKworI2lmIGRlZmluZWQgV0xDX1NUQVRJT04KKy8vI3VuZGVmIEhDRl9UWVBFIAkJCQkvKiBIZXJtZXMtSSBTdGF0aW9uIEYvVyB3aXRob3V0IFNTTiBzdXBwb3J0ICovCisjZGVmaW5lIE1TRl9DT01QT05FTlRfSUQJQ09NUF9JRF9WWF9XT1JLU19FTkRTVEEKKyNlbHNlCisjZGVmaW5lIE1TRl9DT01QT05FTlRfSUQJQ09NUF9JRF9WWF9XT1JLU19FTkRBUAorI2VuZGlmCS8vIFdMQ19TVEFUSU9OCisKKyNkZWZpbmUgSENGX1lJRUxEICh0YXNrRGVsYXkoMCkgPT0gMCkKKworI2RlZmluZSAgICBNU0ZfQ09NUE9ORU5UX1ZBUiAgICAgICAgICAgICAgMQorI2RlZmluZSAgICBNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUiAgICAgICAgMQorI2RlZmluZSAgICBNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUiAgICAgICAgMAorCisvLyAjZGVmaW5lIEhDRl9BU1NFUlQJSENGX0FTU0VSVF9NQgkvLyBsb2dnaW5nIHZpYSBNYWlsYm94CisKKyNpZiBkZWZpbmVkIFBDNDg2QlNQCisKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpICAgICAgICAgICAgKHN5c0luV29yZCAoKGhjZl9pbykocG9ydCkpKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKSAgICAgICAgKHN5c091dFdvcmQgKChoY2ZfaW8pKHBvcnQpLCAoaGNmXzE2KSAodmFsdWUpKSkKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbikgICAgICAgIChzeXNJbldvcmRTdHJpbmcgKChoY2ZfaW8pKHBvcnQpLCBhZGRyLCBuKSkKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGFkZHIsIG4pICAgICAgICAoc3lzT3V0V29yZFN0cmluZyAoKGhjZl9pbykocG9ydCksIGFkZHIsIG4pKQorCisjZWxpZiBkZWZpbmVkIEFTMjAwMEJTUAorCisjZGVmaW5lIEhDRl9JTyAJCQkJCQlIQ0ZfSU9fTUVNCQkvLyBvdmVycnVsZSBzdGFuZGFyZCBQb3J0IEkvTyB3aXRoIE1lbW9yeSBtYXBwZWQgSS9PCisKKy8qIERlZmluZSBQQ0kgc3R1ZmYgaGVyZS4gKi8KK3Vuc2lnbmVkIHNob3J0IHN5c1JlYWQxNiggdW5zaWduZWQgc2hvcnQgKnBvcnQgKTsKK3ZvaWQgc3lzV3JpdGUxNiggdW5zaWduZWQgc2hvcnQgKnBvcnQsIHVuc2lnbmVkIHNob3J0IHZhbHVlICk7CisKKyNkZWZpbmUgUENJX0lOX0JZVEUoIHBvcnQgKSBcCisJKih1bnNpZ25lZCBjaGFyICopKCBwb3J0ICkKKworI2RlZmluZSBQQ0lfSU5fV09SRCggcG9ydCApIFwKKwlzeXNSZWFkMTYoICh1bnNpZ25lZCBzaG9ydCAqKSggcG9ydCApICkKKworI2RlZmluZSBQQ0lfT1VUX0JZVEUoIHBvcnQsIHZhbHVlICkgXAorCSoodW5zaWduZWQgY2hhciAqKSggcG9ydCApID0gKHVuc2lnbmVkIGNoYXIpKCB2YWx1ZSApCisKKyNkZWZpbmUgUENJX09VVF9XT1JEKCBwb3J0LCB2YWx1ZSApIFwKKwlzeXNXcml0ZTE2KCAodW5zaWduZWQgc2hvcnQgKikoIHBvcnQgKSwgKHVuc2lnbmVkIHNob3J0KSggdmFsdWUgKSApCisKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKCBwb3J0ICkgXAorCVBDSV9JTl9XT1JEKCBwb3J0ICkKKworI2RlZmluZSBPVVRfUE9SVF9XT1JEKCBwb3J0LCB2YWx1ZSApIFwKKwlQQ0lfT1VUX1dPUkQoIHBvcnQsIHZhbHVlICkKKworI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYnVmLCBsZW4gKSBcCisJZG8geyBcCisJCWhjZl8xNiAqcDsgXAorCSBcCisJIAlmb3IgKCBwID0gKGhjZl8xNiAqKShidWYpOyBwIDwgJiggKGhjZl8xNiAqKShidWYpIClbIChpbnQpbGVuIF07IHArKyApIHsgXAorCQkJKnAgPSBQQ0lfSU5fV09SRCggcG9ydCApOyBcCisJCX0gXAorCX0gd2hpbGUgKCAwICkKKworI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGJ1ZiwgbGVuICkgXAorCWRvIHsgXAorCQljb25zdCBoY2ZfMTYgKnA7IFwKKwkgXAorCSAJZm9yICggcCA9IChjb25zdCBoY2ZfMTYgKikoIGJ1ZiApOyBwIDwgJiggKGNvbnN0IGhjZl8xNiAqKShidWYpIClbIChpbnQpbGVuIF07IHArKyApIHsgXAorCQkJUENJX09VVF9XT1JEKCBwb3J0LCAqcCApOyBcCisJCX0gXAorCX0gd2hpbGUgKCAwICkKKworI2VsaWYgZGVmaW5lZCBGQURTODYwQlNQIC8qIGVsaWYgZGVmaW5lZCBBUzIwMDBCU1AgKi8KKworI2RlZmluZSBIQ0ZfQklHX0VORElBTiAxCisKKyNkZWZpbmUgSENGX0lPIAkJCQkJCUhDRl9JT19NRU0JCS8vIG92ZXJydWxlIHN0YW5kYXJkIFBvcnQgSS9PIHdpdGggTWVtb3J5IG1hcHBlZCBJL08KKworI2lmbmRlZiBfX0dOVUNfXworICAgICNkZWZpbmUgX19hc21fXyAgICAgYXNtCisjZW5kaWYKKworI2lmICEgZGVmaW5lZCBfbGludAorICAgICNkZWZpbmUgRUlFSU8oKSAgICAgX19hc21fXygiIGVpZWlvIikKKyNlbHNlCisgICAgI2RlZmluZSBFSUVJTygpCisjZW5kaWYKKworc3RhdGljIGhjZl8xNiBJTl9QT1JUX1dPUkQoaW50IHBvcnQpIHsKKyAgICBoY2ZfMTYgdmFsdWUgPSAqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KTsgRUlFSU8oKTsKKyAgICB2YWx1ZSA9ICgodmFsdWUgJiAweGZmMDApID4+IDgpICsgKCh2YWx1ZSAmIDB4MDBmZikgPDwgOCk7CisvKiAgdmFsdWUgPSBDTlZfTElUVExFX1RPX1NIT1JUKHZhbHVlKTsgKi8KKyAgICByZXR1cm4gdmFsdWU7CisgICAgI2lmZGVmIF9fR05VQ19fCisgICAgICAgIC8qIHRoZSBmb2xsb3dpbmcgc2VydmVzIHRvIGF2b2lkIHRoZSBjb21waWxlciB3YXJuaW5ncyB0aGF0CisgICAgICAgICAqIElOX1BPUlRfV09SRCgpIGlzIG5vdCB1c2VkIGluIHNvbWUgZmlsZXMgKi8KKyAgICAgICAgKHZvaWQpSU5fUE9SVF9XT1JEOworICAgICNlbmRpZgorfQorCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgKih2b2xhdGlsZSBoY2ZfMTYgKikocG9ydCkgPSBDTlZfU0hPUlRfVE9fTElUVExFKHZhbHVlKTsgRUlFSU8oKTsgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIGxlbikgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGwgPSAobGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlIGhjZl8xNiAqZCA9ICh2b2xhdGlsZSBoY2ZfMTYgKikoYWRkcik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsLS0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZCsrID0gKih2b2xhdGlsZSBoY2ZfMTYgKikocG9ydCk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFSUVJTygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIGxlbikgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGwgPSAobGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlIGhjZl8xNiAqcyA9ICh2b2xhdGlsZSBoY2ZfMTYgKikoYWRkcik7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobC0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih2b2xhdGlsZSBoY2ZfMTYgKikocG9ydCkgPSAqcysrOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUlFSU8oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyNlbGlmIGRlZmluZWQgREFZVE9OQUJTUAorCisjZGVmaW5lIEhDRl9CSUdfRU5ESUFOIDEKKworI2RlZmluZSBIQ0ZfSU8gCQkJCQkJSENGX0lPX01FTQkJLy8gb3ZlcnJ1bGUgc3RhbmRhcmQgUG9ydCBJL08gd2l0aCBNZW1vcnkgbWFwcGVkIEkvTworCisjaWZuZGVmIF9fR05VQ19fCisgICAgI2RlZmluZSBfX2FzbV9fICAgICBhc20KKyNlbmRpZgorCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KSAgICAgICAgICAgICAgKHN5c09yaW5vY29JbldvcmQoKHVuc2lnbmVkIGxvbmcpKHBvcnQpKSkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LHZhbHVlKSAgICAgICAoc3lzT3Jpbm9jb091dFdvcmQoKHVuc2lnbmVkIGxvbmcpKHBvcnQpLCAodW5zaWduZWQgc2hvcnQpKHZhbHVlKSkpCisKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYocG9ydCxhZGRyLGxlbikgICAoc3lzT3Jpbm9jb0luU3RyaW5nKChwb3J0KSwgKGFkZHIpLCAobGVuKSkpCisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNihwb3J0LGFkZHIsbGVuKSAgIChzeXNPcmlub2NvT3V0U3RyaW5nKChwb3J0KSwgKGFkZHIpLCAobGVuKSkpCisKK2V4dGVybiB1bnNpZ25lZCBjaGFyICAgIHN5c09yaW5vY29JbkJ5dGUgICAgKHVuc2lnbmVkIGxvbmcgcG9ydCk7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgICBzeXNPcmlub2NvSW5Xb3JkICAgICh1bnNpZ25lZCBsb25nIHBvcnQpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgc3lzT3Jpbm9jb0luU3RyaW5nICAodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4pOworCitleHRlcm4gdm9pZCAgICAgICAgICAgICBzeXNPcmlub2NvT3V0Qnl0ZSAgICh1bnNpZ25lZCBsb25nIHBvcnQsIHVuc2lnbmVkIGNoYXIgdmFsdWUpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgc3lzT3Jpbm9jb091dFdvcmQgICAodW5zaWduZWQgbG9uZyBwb3J0LCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBzeXNPcmlub2NvT3V0U3RyaW5nICh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbik7CisKKyNlbGlmIGRlZmluZWQgQUxQSEFfQlNQCisKKyNkZWZpbmUgSENGX0JJR19FTkRJQU4gMQorCisjZGVmaW5lIEhDRl9JTyAJCQkJCQlIQ0ZfSU9fTUVNCQkvLyBvdmVycnVsZSBzdGFuZGFyZCBQb3J0IEkvTyB3aXRoIE1lbW9yeSBtYXBwZWQgSS9PCisKKyNpZm5kZWYgX19HTlVDX18KKyAgICAjZGVmaW5lIF9fYXNtX18gICAgIGFzbQorI2VuZGlmCisKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpICAgICAgICAgICAgICAoc3lzT3Jpbm9jb0luV29yZCgodW5zaWduZWQgbG9uZykocG9ydCkpKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsdmFsdWUpICAgICAgIChzeXNPcmlub2NvT3V0V29yZCgodW5zaWduZWQgbG9uZykocG9ydCksICh1bnNpZ25lZCBzaG9ydCkodmFsdWUpKSkKKworI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNihwb3J0LGFkZHIsbGVuKSAgIChzeXNPcmlub2NvSW5TdHJpbmcoKHBvcnQpLCAoYWRkciksIChsZW4pKSkKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KHBvcnQsYWRkcixsZW4pICAgKHN5c09yaW5vY29PdXRTdHJpbmcoKHBvcnQpLCAoYWRkciksIChsZW4pKSkKKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgICAgc3lzT3Jpbm9jb0luQnl0ZSAgICAodW5zaWduZWQgbG9uZyBwb3J0KTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCAgIHN5c09yaW5vY29JbldvcmQgICAgKHVuc2lnbmVkIGxvbmcgcG9ydCk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBzeXNPcmlub2NvSW5TdHJpbmcgICh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbik7CisKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHN5c09yaW5vY29PdXRCeXRlICAgKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgY2hhciB2YWx1ZSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBzeXNPcmlub2NvT3V0V29yZCAgICh1bnNpZ25lZCBsb25nIHBvcnQsIHVuc2lnbmVkIHNob3J0IHZhbHVlKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHN5c09yaW5vY29PdXRTdHJpbmcgKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuKTsKKworI2Vsc2UKKworZXJyOiAvKiBjb21tZW50ZWQgaGVyZSAqLyAvKgkiQlNQIGlzIG5vdCBkZWZpbmVkLi4uIiAqLworCisjZW5kaWYJLyogZWxzZSBQQzQ4NkJTUCAqLworCisjZW5kaWYJLy8gX19WWF9XT1JLU19fCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgVlhXT1JLUy4gTW90b3JvbGEgU2FuZHBvaW50IFBvd2VyUEMgODI0WCAqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19WWF9XT1JLU19TQU5EUE9JTlRfODI0WF9fCisKKyNpbmNsdWRlIDx2eFdvcmtzLmg+CisjaW5jbHVkZSA8c3lzTGliLmg+CisjaW5jbHVkZSA8dGFza0xpYi5oPgorCisjaWZkZWYgV1ZMQU5fNTMKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRCAgICAgICAgICAgIENPTVBfSURfVlhfV09SS1NfRU5EU1RBCisjZW5kaWYgLyogV1ZMQU5fNTMgKi8KKworI2lmZGVmIFdWTEFOXzU0CisjZGVmaW5lCU1TRl9DT01QT05FTlRfSUQgICAgICAgICAgICBDT01QX0lEX1ZYX1dPUktTX0VOREFQCisjZW5kaWYgLyogV1ZMQU5fNTQgKi8KKworI2lmZGVmIFdWTEFOXzU2CisjZGVmaW5lCU1TRl9DT01QT05FTlRfSUQgICAgICAgICAgICBDT01QX0lEX1ZYX1dPUktTX0VORAorI2VuZGlmIC8qIFdWTEFOXzU2ICovCisKKyNpZiAhZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECisjZXJyb3IgInlvdSBtdXN0IGRlZmluZSBhbiBNU0YgY29tcG9uZW50IElEOiBXVkxBTl81MywgV1ZMQU5fNTQsIFdWTEFOXzU2IgorI2VuZGlmCisKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9WQVIJCQkxCisKKyNkZWZpbmUgSENGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICBIQ0ZfRVhUX0lORk9fTE9HCisjZGVmaW5lIEhDRl9TTEVFUCAgICAgICAgICAgICAgICAgICAgICAgKCBIQ0ZfQ0RTIHwgSENGX0REUyApCisvLyNkZWZpbmUgSENGX1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAoIEhDRl9ERFMgKQorCisjaWZuZGVmIEhDRl9BQ1RfV0FLRVVQCisjZGVmaW5lIEhDRl9BQ1RfV0FLRVVQICAgICAgICAgICAgICAgICAgMHgxRAorI2VuZGlmIC8vIEhDRl9BQ1RfV0FLRVVQCisKKyNpZiBkZWZpbmVkIEZBVE5JQyB8IGRlZmluZWQgQkVBR0xFX0gyNTMKKyNkZWZpbmUgVDFfX0hDRl9UWVBFICAgICAgICAgICAgICAgICAgICBIQ0ZfVFlQRV9TVEEKKyNlbHNlCisjZGVmaW5lIFQxX19IQ0ZfVFlQRSAgICAgICAgICAgICAgICAgICAgSENGX1RZUEVfQVAgfCBIQ0ZfVFlQRV9TVEEKKyNlbmRpZgorCisjaWZkZWYgSEVSTUVTX1VTQgorI2RlZmluZSBUMl9fSENGX1RZUEUJCQkJCShUMV9fSENGX1RZUEUgfCBIQ0ZfVFlQRV9VU0IpCisjZWxzZSAvLyBIRVJNRVNfVVNCCisjZGVmaW5lIFQyX19IQ0ZfVFlQRQkJCQkJKFQxX19IQ0ZfVFlQRSkKKyNlbmRpZiAvLyBIRVJNRVNfVVNCCisKKyNpZmRlZiBfV0FSUAorI2RlZmluZSBUM19fSENGX1RZUEUJCQkJCShUMl9fSENGX1RZUEUgfCBIQ0ZfVFlQRV9ISUk1KQorI2Vsc2UgLy8gX1dBUlAKKyNkZWZpbmUgVDNfX0hDRl9UWVBFCQkJCQkoVDJfX0hDRl9UWVBFIHwgSENGX1RZUEVfV1BBIHwgSENGX1RZUEVfSElJKQorI2VuZGlmIC8vIFdBUlAKKworI2lmZGVmIF9DQ1gKKyNkZWZpbmUgVDRfX0hDRl9UWVBFCQkJCQkoVDNfX0hDRl9UWVBFIHwgSENGX1RZUEVfQ0NYKQorI2Vsc2UgLy8gX1dBUlAKKyNkZWZpbmUgVDRfX0hDRl9UWVBFCQkJCQkoVDNfX0hDRl9UWVBFKQorI2VuZGlmIC8vIF9DQ1gKKworI2RlZmluZSBUNV9fSENGX1RZUEUJCQkJCShUNF9fSENGX1RZUEUpCisKKy8vIERlZmF1bHQgdG8gVFlQRV9BUCArIFNTTiEKKyNkZWZpbmUgSENGX1RZUEUJCQkJCQkoVDVfX0hDRl9UWVBFICkKKworCisKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIJCTIKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJCTAKKworI2RlZmluZSBIQ0ZfSU8gICAgICAgICAgICAgICAgICAgICAgSENGX0lPX01FTQorI2RlZmluZSBIQ0ZfRE1BICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBIQ0ZfTUVNX0lPICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBIQ0ZfQklHX0VORElBTiAgICAgICAgICAgICAgMQorCisvLyNkZWZpbmUgc3VwcG9ydF8zMmJpdHMgMQorCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCSAgICAgICAgKHN5c0luV29yZCggKGhjZl9pbykocG9ydCkgKSkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJICAgICAgICAoc3lzT3V0V29yZCggKGhjZl9pbykocG9ydCksIChoY2ZfMTYpKHZhbHVlKSApKQorI2RlZmluZSBJTl9QT1JUX0RXT1JEKHBvcnQpCQkJICAgICAgICAoc3lzSW5Mb25nKCAoaGNmX2lvKShwb3J0KSApKQorI2RlZmluZSBPVVRfUE9SVF9EV09SRChwb3J0LCB2YWx1ZSkJICAgICAgICAoc3lzT3V0TG9uZyggKGhjZl9pbykocG9ydCksIChoY2ZfMTYpKHZhbHVlKSApKQorI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNihwb3J0LCBkc3QsIG4pCSAgICAoc3lzSW5Xb3JkU3RyaW5nKChoY2ZfaW8pKHBvcnQpLCAoaGNmXzE2ICopZHN0LCBuKSkKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KHBvcnQsIHNyYywgbikgICAgKHN5c091dFdvcmRTdHJpbmcoKGhjZl9pbykocG9ydCksIChoY2ZfMTYgKilzcmMsIG4pKQorCisjaWZkZWYgV1ZMQU5fREVCVUcKKyNkZWZpbmUgREJHICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgX0RFQlVHICAgICAgICAgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisvKiB3ZSdsbCBuZWVkIHRvIGFkZCB0aGVzZSBwcmludHMgc29tZWRheSAqLworI2RlZmluZSBPVVRQVVRERUJVR01TRyhkcHJpbnRmX2V4cCkKKyNkZWZpbmUgQVNTRVJUREVCVUdNU0coY29uZCwgZHByaW50Zl9leHApCisKKyNkZWZpbmUgSENGX0lOVEVSRkFDRV9DT05ORUNUKGlmYnApCisjZGVmaW5lIEhDRl9JTlRFUkZBQ0VfRElTQ09OTkVDVChpZmJwKQorI2RlZmluZSBIQ0ZfRU5URVJfSU5URVJGQUNFX0ZVTkNUKGliZmIpCisjZGVmaW5lIEhDRl9MRUFWRV9JTlRFUkZBQ0VfRlVOQ1QoaWZicCkKKworI2RlZmluZSBDTlZfRU5EX0lOVCh3KSAgICAoICgoaGNmXzE2KSh3KSAmIDB4MDBGRikgPDwgOCB8ICgoaGNmXzE2KSh3KSAmIDB4RkYwMCkgPj4gOCApCisjZGVmaW5lIENOVl9MSVRUTEVfVE9fSU5UKHcpCUNOVl9FTkRfSU5UKHcpCisjZGVmaW5lIENOVl9JTlRfVE9fTElUVExFKHcpCUNOVl9MSVRUTEVfVE9fSU5UKHcpCisKKyNlbmRpZiAvKiBfX1ZYX1dPUktTX1NBTkRQT0lOVF84MjRYX18gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBWWFdPUktTLiBBUk0gVDgzMDAgSVBQaG9uZSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoIElQVF9UODMwMCApIHx8IGRlZmluZWQoIElQVF9UODMwNyApCisKKyNpbmNsdWRlIDx2eFdvcmtzLmg+CisjaW5jbHVkZSA8c3lzTGliLmg+CisjaW5jbHVkZSA8dGFza0xpYi5oPgorCisjZGVmaW5lIEhDRl9BTElHTiAgICAgICAgICAgICAgICAgICA0ICAgICAgIC8qIGRlZmF1bHQgdG8gNCBieXRlIGFsaWdubWVudCAqLworCisjZGVmaW5lIEJFQUdMRV9IMjUzCS8qIEhlcm1lcyAyLjUuMyBidWlsZCwgYmV0dGVyIHRvIGJlIGluIHRoZSBwcm9qZWN0IGZpbGUgKi8KKyNkZWZpbmUgT09SX0REUwkJLyogSGVybWVzIDIuNS4zIGJ1aWxkLCBiZXR0ZXIgdG8gYmUgaW4gdGhlIHByb2plY3QgZmlsZSAqLworI2RlZmluZSBGQVROSUMKKworCisjaWZkZWYgV1ZMQU5fNTMKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRCAgICAgICAgICAgIENPTVBfSURfVlhfV09SS1NfRU5EU1RBCisjZW5kaWYgLyogV1ZMQU5fNTMgKi8KKworI2lmZGVmIFdWTEFOXzU0CisjZGVmaW5lCU1TRl9DT01QT05FTlRfSUQgICAgICAgICAgICBDT01QX0lEX1ZYX1dPUktTX0VOREFQCisjZW5kaWYgLyogV1ZMQU5fNTQgKi8KKworI2lmZGVmIFdWTEFOXzU2CisjZGVmaW5lCU1TRl9DT01QT05FTlRfSUQgICAgICAgICAgICBDT01QX0lEX1ZYX1dPUktTX0VORAorI2VuZGlmIC8qIFdWTEFOXzU2ICovCisKKyNpZiAhZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECisjZXJyb3IgInlvdSBtdXN0IGRlZmluZSBhbiBNU0YgY29tcG9uZW50IElEOiBXVkxBTl81MywgV1ZMQU5fNTQsIFdWTEFOXzU2IgorI2VuZGlmCisKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9WQVIJCQkxCisKKyNkZWZpbmUgSENGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICBIQ0ZfRVhUX0lORk9fTE9HCisvLyNkZWZpbmUgSENGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICBIQ0ZfRVhUX0lORk9fTE9HIHwgSENGX0VYVF9NQgorI2RlZmluZSBIQ0ZfU0xFRVAgICAgICAgICAgICAgICAgICAgICAgICggSENGX0NEUyB8IEhDRl9ERFMgKQorLy8jZGVmaW5lIEhDRl9TTEVFUCAgICAgICAgICAgICAgICAgICAgICAgKCBIQ0ZfRERTICkKKworI2lmbmRlZiBIQ0ZfQUNUX1dBS0VVUAorI2RlZmluZSBIQ0ZfQUNUX1dBS0VVUCAgICAgICAgICAgICAgICAgIDB4MUQKKyNlbmRpZiAvLyBIQ0ZfQUNUX1dBS0VVUAorCisjaWYgZGVmaW5lZCBGQVROSUMgfHwgZGVmaW5lZCBCRUFHTEVfSDI1MworI2RlZmluZSBUMV9fSENGX1RZUEUgICAgICAgICAgICAgICAgICAgIEhDRl9UWVBFX1NUQQorI2Vsc2UKKy8vI2RlZmluZSBUMV9fSENGX1RZUEUgICAgICAgICAgICAgICAgICAgIEhDRl9UWVBFX0FQIHwgSENGX1RZUEVfU1RBCisjZGVmaW5lIFQxX19IQ0ZfVFlQRSAgICAgICAgICAgICAgICAgICAgSENGX1RZUEVfU1RBCQkvKiBkeiwgU3RhdGlvbiBjb2RlIG9ubHkgKi8KKyNlbmRpZgorCisjaWZkZWYgSEVSTUVTX1VTQgorI2RlZmluZSBUMl9fSENGX1RZUEUJCQkJCShUMV9fSENGX1RZUEUgfCBIQ0ZfVFlQRV9VU0IpCisjZWxzZSAvLyBIRVJNRVNfVVNCCisjZGVmaW5lIFQyX19IQ0ZfVFlQRQkJCQkJKFQxX19IQ0ZfVFlQRSkKKyNlbmRpZiAvLyBIRVJNRVNfVVNCCisKKyNpZmRlZiBfV0FSUAorI2RlZmluZSBUM19fSENGX1RZUEUJCQkJCShUMl9fSENGX1RZUEUgfCBIQ0ZfVFlQRV9ISUk1KQorI2Vsc2UgLy8gX1dBUlAKKyNkZWZpbmUgVDNfX0hDRl9UWVBFCQkJCQkoVDJfX0hDRl9UWVBFIHwgSENGX1RZUEVfV1BBIHwgSENGX1RZUEVfSElJKQorLy8jZGVmaW5lIFQzX19IQ0ZfVFlQRQkJCQkJKFQyX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX0hJSSkJLyogZHouIG5vIFdQQSBzdXBwb3J0IGF0IHRoaXMgdGltZSwgdGVzdCBjb2RlICovCisjZW5kaWYgLy8gV0FSUAorCisjaWZkZWYgX0NDWAorI2RlZmluZSBUNF9fSENGX1RZUEUJCQkJCShUM19fSENGX1RZUEUgfCBIQ0ZfVFlQRV9DQ1gpCisjZWxzZSAvLyBfV0FSUAorI2RlZmluZSBUNF9fSENGX1RZUEUJCQkJCShUM19fSENGX1RZUEUpCisjZW5kaWYgLy8gX0NDWAorCisjZGVmaW5lIFQ1X19IQ0ZfVFlQRQkJCQkJKFQ0X19IQ0ZfVFlQRSkKKworLy8gRGVmYXVsdCB0byBUWVBFX0FQICsgU1NOIQorI2RlZmluZSBIQ0ZfVFlQRQkJCQkJCShUNV9fSENGX1RZUEUgKQorCisKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIJCTIKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJCTAKKworI2RlZmluZSBIQ0ZfSU8gICAgICAgICAgICAgICAgICAgICAgSENGX0lPX01FTQorI2RlZmluZSBIQ0ZfRE1BICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBIQ0ZfTUVNX0lPICAgICAgICAgICAgICAgICAgMQorCisKKy8qIEVuZGlhbiBpcyBkZXRlcm1pbmVkIGJ5IHZ4V29ya3MgcHJvamVjdCBjb21waWxlIG9wdGlvbiAqLworI2lmIChfQllURV9PUkRFUiA9PSBfQklHX0VORElBTikKKyN1bmRlZiAgSENGX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgSENGX0JJR19FTkRJQU4gICAgICAgICAgICAgIDEKKyNlbmRpZgorCisKKyNkZWZpbmUgQ05WX0VORCh3KSAgICAoICgoaGNmXzE2KSh3KSAmIDB4MDBGRikgPDwgOCB8ICgoaGNmXzE2KSh3KSAmIDB4RkYwMCkgPj4gOCApCisjaWYgZGVmaW5lZCBIQ0ZfQklHX0VORElBTgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBCIEkgRyAgIEUgTiBEIEkgQSBOICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgQ05WX0xJVFRMRV9UT19JTlQodykgICAgQ05WX0VORCh3KQkvLyAgICBlbmRpYW5lc3MgY29udmVyc2lvbiBuZWVkZWQKKyNkZWZpbmUgQ05WX0JJR19UT19JTlQodykJCSh3KQkJCS8vIG5vIGVuZGlhbmVzcyBjb252ZXJzaW9uIG5lZWRlZAorI2Vsc2UKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEwgSSBUIFQgTCBFICAgRSBOIEQgSSBBIE4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBDTlZfTElUVExFX1RPX0lOVCh3KSAJKHcpCQkJLy8gbm8gZW5kaWFuZXNzIGNvbnZlcnNpb24gbmVlZGVkCisjZGVmaW5lIENOVl9CSUdfVE9fSU5UKHcpICAgICAgIENOVl9FTkQodykJLy8gICAgZW5kaWFuZXNzIGNvbnZlcnNpb24gbmVlZGVkCisjZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KKworLy8gY29udmVyc2lvbiBtYWNyb3Mgd2hpY2ggY2FuIGJlIGV4cHJlc3NlZCBpbiBvdGhlciBtYWNyb3MKKyNkZWZpbmUgQ05WX0lOVF9UT19MSVRUTEUodykJQ05WX0xJVFRMRV9UT19JTlQodykKKyNkZWZpbmUgQ05WX0lOVF9UT19CSUcodykJCUNOVl9CSUdfVE9fSU5UKHcpCisKKworCisjZGVmaW5lIElOX1BPUlRfV09SRCggcG9ydCApICAgICAgICAgICAgKigodm9sYXRpbGUgaGNmXzE2ICopKCBwb3J0ICkpCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQoIHBvcnQsIHZhbHVlICkgICAgKigodm9sYXRpbGUgaGNmXzE2ICopKCBwb3J0ICkpID0gKChoY2ZfMTYpKCB2YWx1ZSApKQorLy8jZGVmaW5lIElOX1BPUlRfQllURSggcG9ydCApICAgICAgICAgICAgKigodm9sYXRpbGUgaGNmXzggKikoIHBvcnQgKSkKKworI2RlZmluZSBJTl9QT1JUX1NUUklORyggcG9ydCwgYWRkciwgbGVuKSB7CQlcCisJdW5zaWduZWQgbCA9IGxlbjsJCQkJCQkJCVwKKwloY2ZfMTYgICpkID0gKGhjZl8xNiAqKShhZGRyKTsJCQkJCVwKKwloY2ZfMTYgICB0OwkJCQkJCQkJCQlcCisJd2hpbGUgKGwtLSkgewkJCQkJCQkJCVwKKwkJdCA9IElOX1BPUlRfV09SRChwb3J0KTsJCQkJCQlcCisJCSpkKysgPSBDTlZfTElUVExFX1RPX0lOVCh0KTsJCQkJXAorCX0JCQkJCQkJCQkJCQlcCit9IC8vIElOX1BPUlRfU1RSSU5HCisKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HKCBwb3J0LCBhZGRyLCBsZW4pIHsJCVwKKwl1bnNpZ25lZCBsID0gKGxlbik7CQkJCQkJCQlcCisJaGNmXzE2ICAqcyA9IChoY2ZfMTYgKikoYWRkcik7CQkJCQlcCisJaGNmXzE2ICAgdDsJCQkJCQkJCQkJXAorCXdoaWxlIChsLS0pIHsJCQkJCQkJCQlcCisJCXQgPSAqcysrOwkJCQkJCQkJCVwKKwkJdCA9IENOVl9MSVRUTEVfVE9fSU5UKHQpOwkJCQkJXAorCQlPVVRfUE9SVF9XT1JEKHBvcnQsIHQpOwkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJXAorfSAvLyBPVVRfUE9SVF9TVFJJTkcKKworI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNihwb3J0LCBkc3QsIG4pCSAgICB7CVwKKwl1bnNpZ25lZCBsID0gKG4pOwkJCQkJCQkJXAorCWhjZl8xNiAgKmQgPSAoaGNmXzE2ICopKGRzdCk7CQkJCQlcCisJd2hpbGUgKGwtLSkgewkJCQkJCQkJCVwKKwkJKmQrKyA9IElOX1BPUlRfV09SRChwb3J0KTsJCQkJCVwKKwl9CQkJCQkJCQkJCQkJXAorfSAvLyBJTl9QT1JUX1NUUklOR18xNgorCisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNihwb3J0LCBzcmMsIG4pCXsJXAorCWhjZl8xNiAgIHQ7CQkJCQkJCQkJCVwKKwlpbnQgbCA9IChuKTsJCQkJCQkJCQlcCisJaGNmXzE2ICAqcyA9IChoY2ZfMTYgKikoc3JjKTsJCQkJCVwKKwl3aGlsZSAobC0tKSB7CQkJCQkJCQkJXAorCQl0ID0gKnMrKzsJCQkJCQkJCQlcCisJCU9VVF9QT1JUX1dPUkQocG9ydCwgdCk7CQkJCQkJXAorCX0JCQkJCQkJCQkJCQlcCit9IC8vIE9VVF9QT1JUX1NUUklOR18xNgorCisvKiAjZGVmaW5lIEhDRl9ZSUVMRCAgICAgICAgICAgICAgICAgICAgICAgKHRhc2tEZWxheSgwKSA9PSAwKSAqLworCisKKworI2lmZGVmIFdWTEFOX0RFQlVHCisjZGVmaW5lIERCRyAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIF9ERUJVRyAgICAgICAgICAgICAgICAgICAgICAxCisjZW5kaWYKKworLyogd2UnbGwgbmVlZCB0byBhZGQgdGhlc2UgcHJpbnRzIHNvbWVkYXkgKi8KKyNkZWZpbmUgT1VUUFVUREVCVUdNU0coZHByaW50Zl9leHApCisjZGVmaW5lIEFTU0VSVERFQlVHTVNHKGNvbmQsIGRwcmludGZfZXhwKQorCisjZGVmaW5lIEhDRl9JTlRFUkZBQ0VfQ09OTkVDVChpZmJwKQorI2RlZmluZSBIQ0ZfSU5URVJGQUNFX0RJU0NPTk5FQ1QoaWZicCkKKyNkZWZpbmUgSENGX0VOVEVSX0lOVEVSRkFDRV9GVU5DVChpYmZiKQorI2RlZmluZSBIQ0ZfTEVBVkVfSU5URVJGQUNFX0ZVTkNUKGlmYnApCisKKyNkZWZpbmUgc3lzSW5Xb3JkKG9mZnNldEFkZHIpICBJTl9QT1JUX1dPUkQob2Zmc2V0QWRkcikKKyNkZWZpbmUgc3lzSW5CeXRlKG9mZnNldEFkZHIpICBJTl9QT1JUX0JZVEUob2Zmc2V0QWRkcikKKyNkZWZpbmUgc3lzT3V0V29yZChhZGRyLCB2YWx1ZSkgT1VUX1BPUlRfV09SRChhZGRyLCB2YWx1ZSkKKworI2VuZGlmIC8qSVBUX1Q4MzAwICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhIGRlZmluZWQgCUhDRl9BTElHTgorI2RlZmluZSAJCUhDRl9BTElHTgkJCTEJCS8vZGVmYXVsdCB0byBubyBhbGlnbm1lbnQKKyNlbmRpZiAvLyAJCUhDRl9BTElHTgorCisjaWYgISBkZWZpbmVkIAlIQ0ZfQVNTRVJUCisjZGVmaW5lIAkJSENGX0FTU0VSVAkJCTAKKyNlbmRpZiAvLwkJSENGX0FTU0VSVAorCisjaWYgISBkZWZpbmVkCUhDRl9CSUdfRU5ESUFOCisjZGVmaW5lIAkJSENGX0JJR19FTkRJQU4JCTAKKyNlbmRpZiAvLyAJCUhDRl9CSUdfRU5ESUFOCisKKyNpZiAhIGRlZmluZWQJSENGX0RMX09OTFkKKyNkZWZpbmUgCQlIQ0ZfRExfT05MWQkJCTAKKyNlbmRpZiAvLyAJCUhDRl9ETF9PTkxZCisKKyNpZiAhIGRlZmluZWQJSENGX0RNQQorI2RlZmluZSAJCUhDRl9ETUEJCQkJMAorI2VuZGlmIC8vIAkJSENGX0RNQQorCisjaWYgISBkZWZpbmVkCUhDRl9FTkNBUAorI2RlZmluZQkJCUhDRl9FTkNBUAkJCUhDRl9FTkMKKyNlbmRpZiAvLwkJSENGX0VOQ0FQCisKKyNpZiAhIGRlZmluZWQJSENGX0VOVFJZCisjZGVmaW5lCQkJSENGX0VOVFJZKCBpZmJwICkKKyNlbmRpZiAvLwkJSENGX0VOVFJZCisKKyNpZiAhIGRlZmluZWQJSENGX0VYSVQKKyNkZWZpbmUJCQlIQ0ZfRVhJVCggaWZicCApCisjZW5kaWYgLy8JCUhDRl9FWElUCisKKyNpZiAhIGRlZmluZWQJSENGX0VYVAorI2RlZmluZQkJCUhDRl9FWFQJCQkJMAorI2VuZGlmIC8vCQlIQ0ZfRVhUCisKKyNpZiAhIGRlZmluZWQJSENGX0lOVF9PTgorI2RlZmluZQkJCUhDRl9JTlRfT04JCQkxCisjZW5kaWYgLy8JCUhDRl9JTlRfT04KKworI2lmICEgZGVmaW5lZAlIQ0ZfSU8KKyNkZWZpbmUJCQlIQ0ZfSU8JCQkJMAkJLy9kZWZhdWx0IDE2IGJpdHMgc3VwcG9ydCBvbmx5LCBwb3J0IEkvTworI2VuZGlmIC8vCQlIQ0ZfSU8KKworI2lmICEgZGVmaW5lZAlIQ0ZfTEVHQUNZCisjZGVmaW5lCQkJSENGX0xFR0FDWQkJCTAKKyNlbmRpZiAvLwkJSENGX0xFR0FDWQorCisjaWYgISBkZWZpbmVkCUhDRl9NQVhfTFRWCisjZGVmaW5lIAkJSENGX01BWF9MVFYJCQkxMjAwCS8vIHN1ZmZpY2llbnQgZm9yIGFsbCBrbm93biBwdXJwb3NlcworI2VuZGlmIC8vCQlIQ0ZfTUFYX0xUVgorCisjaWYgISBkZWZpbmVkCUhDRl9QUk9UX1RJTUUKKyNkZWZpbmUgCQlIQ0ZfUFJPVF9USU1FCQkxMDAJCS8vIG51bWJlciBvZiAxMEsgbWljcm9zZWMgcHJvdGVjdGlvbiB0aW1lciBhZ2FpbnN0IEgvVyBtYWxmdW5jdGlvbgorI2VuZGlmIC8vIAkJSENGX1BST1RfVElNRQorCisjaWYgISBkZWZpbmVkCUhDRl9TTEVFUAorI2RlZmluZQkJCUhDRl9TTEVFUAkJCTAKKyNlbmRpZiAvLwkJSENGX1NMRUVQCisKKyNpZiAhIGRlZmluZWQJSENGX1RBTExJRVMKKyNkZWZpbmUJCQlIQ0ZfVEFMTElFUwkJCSggSENGX1RBTExJRVNfTklDIHwgSENGX1RBTExJRVNfSENGICkKKyNlbmRpZiAvLwkJSENGX1RBTExJRVMKKworI2lmICEgZGVmaW5lZCAJSENGX1RZUEUKKyNkZWZpbmUgCQlIQ0ZfVFlQRSAJCQkwCisjZW5kaWYgLy8JCUhDRl9UWVBFCisKKyNpZgkJCQlIQ0ZfQklHX0VORElBTgorI3VuZGVmCQkJSENGX0JJR19FTkRJQU4KKyNkZWZpbmUJCQlIQ0ZfQklHX0VORElBTgkJMQkJLy9qdXN0IGZvciBjb252ZW5pZW5jZSBvZiBnZW5lcmF0aW5nIGNmZ19oY2Zfb3B0CisjZW5kaWYgLy8JIAlIQ0ZfQklHX0VORElBTgorCisjaWYJCQkJSENGX0RMX09OTFkKKyN1bmRlZgkJCUhDRl9ETF9PTkxZCisjZGVmaW5lCQkJSENGX0RMX09OTFkJCQkxCQkvL2p1c3QgZm9yIGNvbnZlbmllbmNlIG9mIGdlbmVyYXRpbmcgY2ZnX2hjZl9vcHQKKyNlbmRpZiAvLwkJSENGX0RMX09OTFkKKworI2lmCQkJCUhDRl9ETUEKKyN1bmRlZgkJCUhDRl9ETUEKKyNkZWZpbmUJCQlIQ0ZfRE1BCQkJCTEJCS8vanVzdCBmb3IgY29udmVuaWVuY2Ugb2YgZ2VuZXJhdGluZyBjZmdfaGNmX29wdAorI2VuZGlmIC8vCQlIQ0ZfRE1BCisKKyNpZgkJCQlIQ0ZfSU5UX09OCisjdW5kZWYJCQlIQ0ZfSU5UX09OCisjZGVmaW5lCQkJSENGX0lOVF9PTgkJCTEJCS8vanVzdCBmb3IgY29udmVuaWVuY2Ugb2YgZ2VuZXJhdGluZyBjZmdfaGNmX29wdAorI2VuZGlmIC8vCQlIQ0ZfSU5UX09OCisKKworI2lmICEgZGVmaW5lZCBJTl9QT1JUX1NUUklOR184XzE2CisjZGVmaW5lICBJTl9QT1JUX1NUUklOR184XzE2KHBvcnQsIGFkZHIsIGxlbikJSU5fUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKQorI2RlZmluZSAgT1VUX1BPUlRfU1RSSU5HXzhfMTYocG9ydCwgYWRkciwgbGVuKQlPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKQorI2VuZGlmIC8vIElOX1BPUlRfU1RSSU5HXzhfMTYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgISBkZWZpbmVkCUZBUgorI2RlZmluZSAJCUZBUgkJCQkJCS8vIGRlZmF1bHQgdG8gZmxhdCAzMi1iaXRzIGNvZGUKKyNlbmRpZiAvLyAJCUZBUgorCit0eXBlZGVmIGhjZl84ICBGQVIgKndjaV9idWZwOwkJCS8vIHNlZ21lbnRlZCAxNi1iaXRzIG9yIGZsYXQgMzItYml0cyBwb2ludGVyIHRvIDggYml0cyB1bml0Cit0eXBlZGVmIGhjZl8xNiBGQVIgKndjaV9yZWNvcmRwOwkJLy8gc2VnbWVudGVkIDE2LWJpdHMgb3IgZmxhdCAzMi1iaXRzIHBvaW50ZXIgdG8gMTYgYml0cyB1bml0CisKKy8qCUkvTyBBZGRyZXNzIHNpemUKKyoJUGxhdGZvcm1zIHdoaWNoIHVzZSBwb3J0IG1hcHBlZCBJL08gd2lsbCAoaW4gZ2VuZXJhbCkgaGF2ZSBhIDY0ayBJL08gc3BhY2UsIGNvbnZlbmllbnRseSBleHByZXNzZWQgaW4gYQorKgkxNi1iaXRzIHF1YW50aXR5CisqCVBsYXRmb3JtcyB3aGljaCB1c2UgbWVtb3J5IG1hcHBlZCBJL08gd2lsbCAoaW4gZ2VuZXJhbCkgaGF2ZSBhbiBJL08gc3BhY2UgbXVjaCBsYXJnZXIgdGhhbiA2NGssIGFuZCBuZWVkIGEKKyoJMzItYml0cyBxdWFudGl0eSB0byBleHByZXNzIHRoZSBJL08gYmFzZQorKi8KKworI2lmIEhDRl9JTyAmIEhDRl9JT19NRU0KK3R5cGVkZWYgaGNmXzMyIGhjZl9pbzsKKyNlbHNlCit0eXBlZGVmIGhjZl8xNiBoY2ZfaW87CisjZW5kaWYgLy9IQ0ZfSU8KKworI2lmIAlIQ0ZfUFJPVF9USU1FID4gMTI4CisjZGVmaW5lIEhDRl9QUk9UX1RJTUVfU0hGVAkzCisjZGVmaW5lIEhDRl9QUk9UX1RJTUVfRElWCTgKKyNlbGlmIAlIQ0ZfUFJPVF9USU1FID4gNjQKKyNkZWZpbmUgSENGX1BST1RfVElNRV9TSEZUCTIKKyNkZWZpbmUgSENGX1BST1RfVElNRV9ESVYJNAorI2VsaWYgCUhDRl9QUk9UX1RJTUUgPiAzMgorI2RlZmluZSBIQ0ZfUFJPVF9USU1FX1NIRlQJMQorI2RlZmluZSBIQ0ZfUFJPVF9USU1FX0RJVgkyCisjZWxzZSAvL0hDRl9QUk9UX1RJTUUgPj0gMTkKKyNkZWZpbmUgSENGX1BST1RfVElNRV9TSEZUCTAKKyNkZWZpbmUgSENGX1BST1RfVElNRV9ESVYJMQorI2VuZGlmCisKKyNkZWZpbmUgSENGX1BST1RfVElNRV9DTlQgKEhDRl9QUk9UX1RJTUUgLyBIQ0ZfUFJPVF9USU1FX0RJVikKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLiAuIC4gLiAuIC4gLiAuIC4gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1TRl9DT01QT05FTlRfSUQgaXMgdXNlZCB0byBkZWZpbmUgdGhlIENGR19JREVOVElUWV9TVFJDVCBpbiBIQ0YuQworKiBDRkdfSURFTlRJVFlfU1RSQ1QgaXMgZGVmaW5lZCBpbiBIQ0YuQyBwdXJlbHkgYmFzZWQgb24gY29udmVuaWVuY2UgYXJndW1lbnRzLgorKiBUaGUgSENGIGNhbiBub3QgaGF2ZSB0aGUga25vd2xlZGdlIHRvIGRldGVybWluZSB0aGUgQ29tcG9uZW50SWQgZmllbGQgb2YgdGhlIElkZW50aXR5IHJlY29yZCAoYWthIGFzCisqIFZlcnNpb24gUmVjb3JkKSwgdGhlcmVmb3JlIHRoZSBNU0YgcGFydCBvZiB0aGUgRHJpdmVycyBtdXN0IHN1cHBseSB0aGlzIHZhbHVlIHZpYSB0aGUgU3lzdGVtIENvbnN0YW50CisqIE1TRl9DT01QT05FTlRfSUQuCisqIFRoZXJlIGlzIGEgc2V0IG9mIHZhbHVlcyBwcmVkZWZpbmVkIGluIE1ERC5IIChmb3JtYXQgQ09NUF9JRF8uLi4uLikKKyoKKyogTm90ZSB0aGF0IHRha2luZyBNU0ZfQ09NUE9ORU5UX0lEIGFzIGEgZGVmYXVsdCB2YWx1ZSBmb3IgRFVJX0NPTVBBVF9WQVIgaXMgcHVyZWx5IGFuIGltcGxlbWVudGF0aW9uCisqIGNvbnZlbmllbmNlLCB0aGUgbnVtZXJpY2FsIHZhbHVlcyBvZiB0aGVzZSB0d28gcXVhbnRpdGllcyBoYXZlIG5vbmUgZnVuY3Rpb25hbCByZWxhdGlvbnNoaXAgd2hhdHNvZXZlci4KKyovCisKKyNpZiBkZWZpbmVkCU1TRl9DT01QT05FTlRfSUQKKworI2lmICEgZGVmaW5lZAlEVUlfQ09NUEFUX1ZBUgorI2RlZmluZQkJCURVSV9DT01QQVRfVkFSCQlNU0ZfQ09NUE9ORU5UX0lECisjZW5kaWYgLy8JCURVSV9DT01QQVRfVkFSCisKKyNpZiAhIGRlZmluZWQJRFVJX0NPTVBBVF9CT1QJCS8vOz90aGlzIHdheSB1dGlsaXRpZXMgY2FuIGxvd2VyIGFzIHdlbGwgcmFpc2UgdGhlIGJvdHRvbQorI2RlZmluZQkJCURVSV9DT01QQVRfQk9UCQk4CisjZW5kaWYgLy8JCURVSV9DT01QQVRfQk9UCisKKyNpZiAhIGRlZmluZWQJRFVJX0NPTVBBVF9UT1AJCS8vOz90aGlzIHdheSB1dGlsaXRpZXMgY2FuIGxvd2VyIGFzIHdlbGwgcmFpc2UgdGhlIHRvcAorI2RlZmluZQkJCURVSV9DT01QQVRfVE9QICAgICAgIDgKKyNlbmRpZiAvLwkJRFVJX0NPTVBBVF9UT1AKKworI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKKworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1CisKKyNpZiAhIGRlZmluZWQJSENGX0hTSV9WQVJfNQorI2RlZmluZQkJCUhDRl9IU0lfVkFSXzUKKyNlbmRpZiAvLwkJSENGX0hTSV9WQVJfNQorCisjaWYgISBkZWZpbmVkCUhDRl9BUEZfVkFSXzQKKyNkZWZpbmUJCQlIQ0ZfQVBGX1ZBUl80CisjZW5kaWYgLy8JCUhDRl9BUEZfVkFSXzQKKworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XQVJQCisjaWYgISBkZWZpbmVkCUhDRl9TVEFfVkFSXzQKKyNkZWZpbmUJCQlIQ0ZfU1RBX1ZBUl80CisjZW5kaWYgLy8JCUhDRl9TVEFfVkFSXzQKKyNlbHNlCisjaWYgISBkZWZpbmVkCUhDRl9TVEFfVkFSXzIKKyNkZWZpbmUJCQlIQ0ZfU1RBX1ZBUl8yCisjZW5kaWYgLy8JCUhDRl9TVEFfVkFSXzIKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBIQ0ZfSFNJX1ZBUl80CitlcnI6IEhTSSB2YXJpYW50cyA0IGNvcnJlc3BvbmQgd2l0aCBISUk7CisjZW5kaWYgLy8gSENGX0hTSV9WQVJfNAorCisjZWxzZQorCisjaWYgISBkZWZpbmVkCUhDRl9IU0lfVkFSXzQKKyNkZWZpbmUJCQlIQ0ZfSFNJX1ZBUl80CQkvL0hlcm1lcy1JSSBhbGwgdHlwZXMgKGZvciB0aGUgdGltZSBiZWluZyEpCisjZW5kaWYgLy8JCUhDRl9IU0lfVkFSXzQKKworI2lmICEgZGVmaW5lZAlIQ0ZfQVBGX1ZBUl8yCisjZGVmaW5lIAkJSENGX0FQRl9WQVJfMgorI2VuZGlmIC8vCQlIQ0ZfQVBGX1ZBUl8yCisKKyNpZiAhIGRlZmluZWQJSENGX1NUQV9WQVJfMgorI2RlZmluZQkJCUhDRl9TVEFfVkFSXzIKKyNlbmRpZiAvLwkJSENGX1NUQV9WQVJfMgorCisjZW5kaWYgLy8gSENGX1RZUEVfSElJNQorCisjaWYgISBkZWZpbmVkCUhDRl9QUklfVkFSXzMKKyNkZWZpbmUJCUhDRl9QUklfVkFSXzMKKyNlbmRpZiAvLwkJSENGX1BSSV9WQVJfMworCisjaWYgZGVmaW5lZCBIQ0ZfSFNJX1ZBUl8xIHx8IGRlZmluZWQgSENGX0hTSV9WQVJfMiB8fCBkZWZpbmVkIEhDRl9IU0lfVkFSXzMKK2VycjogSFNJIHZhcmlhbnRzIDEsIDIgYW5kIDMgY29ycmVzcG9uZCB3aXRoIEgtSSBvbmx5OworI2VuZGlmIC8vIEhDRl9IU0lfVkFSXzEsIEhDRl9IU0lfVkFSXzIsIEhDRl9IU0lfVkFSXzMKKworI2lmIGRlZmluZWQgSENGX1BSSV9WQVJfMSB8fCBkZWZpbmVkIEhDRl9QUklfVkFSXzIKK2VycjogcHJpbWFyeSB2YXJpYW50cyAxIGFuZCAyIGNvcnJlc3BvbmQgd2l0aCBILUkgb25seTsKKyNlbmRpZiAvLyBIQ0ZfUFJJX1ZBUl8xIC8gSENGX1BSSV9WQVJfMgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAuIC4gLiAuIC4gLiAuIC4gLiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBUaGUgQkFTRUQgY3VzdG9taXphdGlvbiBtYWNybyBpcyB1c2VkIHRvIHJlc29sdmVzIHRoZSBTUyE9RFMgY29uZmxpY3QgZm9yIHRoZSBJbnRlcnJ1cHQgU2VydmljZSBsb2dpYyBpbgorICogRE9TIERyaXZlcnMuIER1ZSB0byB0aGUgY3VtYmVyc29tZW5lc3Mgb2YgbWl4aW5nIEMgYW5kIGFzc2VtYmxlciBsb2NhbCBCQVNFRCB2YXJpYWJsZXMgc3RpbGwgZW5kIHVwIGluIHRoZQorICogd3Jvbmcgc2VnbWVudC4gVGhlIHdvcmthcm91bmQgaXMgdGhhdCB0aGUgSENGIHVzZXMgb25seSBnbG9iYWwgQkFTRUQgdmFyaWFibGVzIG9yIElGQi1iYXNlZCB2YXJpYWJsZXMuCisgKiBUaGUgIkJBU0VEIiBjb25zdHJ1Y3Rpb24gKHN1cHBvc2VkbHkpIG9ubHkgYW1vdW50cyB0byBzb21ldGhpbmcgaW4gdGhlIHNtYWxsIG1lbW9yeSBtb2RlbC4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIHdob2xlIEJBU0VEIHJpZ21hcm9sZSBpcyBuZWVkbGVzc2x5IGNvbXBsaWNhdGVkIGJlY2F1c2UgYm90aCB0aGUgTWljcm9zb2Z0IENvbXBpbGVyIGFuZAorICogTGlua2VyIGFyZSB1bm5lY2Vzc2FyeSByZXN0cmljdGl2ZSBpbiB3aGF0IGZhciBwb2ludGVyIG1hbmlwdWxhdGlvbiB0aGV5IGFsbG93CisgKi8KKworI2lmICEgZGVmaW5lZAlCQVNFRAorI2RlZmluZSAJCUJBU0VECisjZW5kaWYgLy8JCUJBU0VECisKKyNpZiAhIGRlZmluZWQJRVhURVJOX0MKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZQkJCUVYVEVSTl9DIGV4dGVybiAiQyIKKyNlbHNlCisjZGVmaW5lCQkJRVhURVJOX0MKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworI2VuZGlmIC8vCQlFWFRFUk5fQworCisjaWYgISBkZWZpbmVkCU5VTEwKKyNkZWZpbmUJCQlOVUxMCSgodm9pZCAqKSAwKQorI2VuZGlmIC8vCQlOVUxMCisKKyNpZiAhIGRlZmluZWQJVEVYVAorI2RlZmluZQkJCVRFWFQoeCkJeAorI2VuZGlmIC8vCQlURVhUCisKKyNpZiAhZGVmaW5lZAlfVENIQVJfREVGSU5FRAorI2RlZmluZSAJCVRDSEFSCWNoYXIKKyNlbmRpZiAvLwkJX1RDSEFSX0RFRklORUQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKiBDIE8gTiBGIEwgSSBDIFQgICBEIEUgVCBFIEMgVCBJIE8gTiAgJiAgUiBFIFMgTyBMIFUgVCBJIE8gTiAqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQgSENGX0xJVFRMRV9FTkRJQU4KK2VycjogSENGX0xJVFRMRV9FTkRJQU4gaXMgb2Jzb2xldGU7CisjZW5kaWYgLy8gCUhDRl9MSVRUTEVfRU5ESUFOCisKKyNpZiBkZWZpbmVkIEhDRl9JTlRfT0ZGCitlcnI6IEhDRl9JTlRfT0ZGIGlzIG9ic29sZXRlOworI2VuZGlmIC8vSENGX0lOVF9PRkYKKworI2lmIEhDRl9BTElHTiAhPSAxICYmIEhDRl9BTElHTiAhPSAyICYmIEhDRl9BTElHTiAhPSA0ICYmIEhDRl9BTElHTiAhPSA4CitlcnI6IGludmFsaWQgdmFsdWUgZm9yIEhDRl9BTElHTjsKKyNlbmRpZiAvLyBIQ0ZfQUxJR04KKworI2lmIChIQ0ZfQVNTRVJUKSAmIH4oIEhDRl9BU1NFUlRfUFJJTlRGIHwgSENGX0FTU0VSVF9TV19TVVAgfCBIQ0ZfQVNTRVJUX01CIHwgSENGX0FTU0VSVF9SVF9NU0ZfUlROIHwgXAorCQkJCQkgIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4gKQorZXJyOiBpbnZhbGlkIHZhbHVlIGZvciBIQ0ZfQVNTRVJUOworI2VuZGlmIC8vIEhDRl9BU1NFUlQKKworI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfTUIgJiYgISAoIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIgKQkJLy9kZXRlY3QgcG90ZW50aWFsIGNvbmZsaWN0CitlcnI6IHRoZXNlIG1hY3JvcyBhcmUgbm90IHVzZWQgY29uc2lzdGVudGx5OworI2VuZGlmIC8vIEhDRl9BU1NFUlRfTUIgLyBIQ0ZfRVhUX01CCisKKyNpZiBIQ0ZfQklHX0VORElBTiAhPSAwICYmIEhDRl9CSUdfRU5ESUFOICE9IDEKK2VycjogaW52YWxpZCB2YWx1ZSBmb3IgSENGX0JJR19FTkRJQU47CisjZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KKworI2lmIEhDRl9ETF9PTkxZICE9IDAgJiYgSENGX0RMX09OTFkgIT0gMQorZXJyOiBpbnZhbGlkIHZhbHVlIGZvciBIQ0ZfRExfT05MWTsKKyNlbmRpZiAvLyBIQ0ZfRExfT05MWQorCisjaWYgSENGX0RNQSAhPSAwICYmIEhDRl9ETUEgIT0gMQorZXJyOiBpbnZhbGlkIHZhbHVlIGZvciBIQ0ZfRE1BOworI2VuZGlmIC8vIEhDRl9ETUEKKworI2lmIChIQ0ZfRU5DQVApICYgfiggSENGX0VOQyB8IEhDRl9FTkNfU1VQICkKK2VycjogaW52YWxpZCB2YWx1ZSBmb3IgSENGX0VOQ0FQOworI2VuZGlmIC8vIEhDRl9FTkNBUAorCisjaWYgKEhDRl9FWFQpICYgfiggSENGX0VYVF9JTkZPX0xPRyB8IEhDRl9FWFRfSU5UX1RYX0VYIHwgSENGX0VYVF9UQUxMSUVTX0ZXIHwgSENGX0VYVF9UQUxMSUVTX0hDRgl8IFwKKwkJCQkgICBIQ0ZfRVhUX05JQ19BQ0NFU1MgfCBIQ0ZfRVhUX01CIHwgSENGX0VYVF9JTlRfVElDSyB8IFwKKwkJCQkgICBIQ0ZfRVhUX0lGQl9TVFJDVCB8IEhDRl9FWFRfREVTQ19TVFJDVCB8IEhDRl9FWFRfVFhfQ09OVCApCitlcnI6IGludmFsaWQgdmFsdWUgZm9yIEhDRl9FWFQ7CisjZW5kaWYgLy8gSENGX0VYVAorCisjaWYgSENGX0lOVF9PTiAhPSAwICYmIEhDRl9JTlRfT04gIT0gMQorZXJyOiBpbnZhbGlkIHZhbHVlIGZvciBIQ0ZfSU5UX09OOworI2VuZGlmIC8vIEhDRl9JTlRfT04KKworI2lmIChIQ0ZfSU8pICYgfiggSENGX0lPX01FTSB8IEhDRl9JT18zMkJJVFMgKQorZXJyOiBpbnZhbGlkIHZhbHVlIGZvciBIQ0ZfSU87CisjZW5kaWYgLy8gSENGX0lPCisKKyNpZiBIQ0ZfTEVHQUNZICE9IDAgJiYgSENGX0xFR0FDWSAhPSAxCitlcnI6IGludmFsaWQgdmFsdWUgZm9yIEhDRl9MRUdBQ1k7CisjZW5kaWYgLy8gSENGX0xFR0FDWQorCisjaWYgSENGX01BWF9MVFYgPCAxNiB8fCBIQ0ZfTUFYX0xUViA+IDIzMDQKK2VycjogaW52YWxpZCB2YWx1ZSBmb3IgSENGX01BWF9MVFY7CisjZW5kaWYgLy8gSENGX01BWF9MVFYKKworI2lmIEhDRl9QUk9UX1RJTUUgIT0gMCAmJiAoIEhDRl9QUk9UX1RJTUUgPCAxOSB8fCAyNTYgPCBIQ0ZfUFJPVF9USU1FICkKK2VycjogYmVsb3cgbWluaW11bSAuMDggc2Vjb25kIHJlcXVpcmVkIGJ5IEhlcm1lcyBvciBwb3NzaWJseSBhYm92ZSBoY2ZfMzIgY2FwYWNpdHk7CisjZW5kaWYgLy8gSENGX1BST1RfVElNRQorCisjaWYgKEhDRl9TTEVFUCkgJiB+KCBIQ0ZfQ0RTIHwgSENGX0REUyApCitlcnI6IGludmFsaWQgdmFsdWUgZm9yIEhDRl9TTEVFUDsKKyNlbmRpZiAvLyBIQ0ZfU0xFRVAKKworI2lmIChIQ0ZfU0xFRVApICYmICEgKEhDRl9JTlRfT04pCitlcnI6IHRoZXNlIG1hY3JvcyBhcmUgbm90IHVzZWQgY29uc2lzdGVudGx5OworI2VuZGlmIC8vIEhDRl9TTEVFUCAvIEhDRl9JTlRfT04KKworI2lmIChIQ0ZfU0xFRVApICYmICEgKCAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lOVF9USUNLICkKKy8vOz8gZXJyOiB0aGVzZSBtYWNyb3MgYXJlIG5vdCB1c2VkIGNvbnNpc3RlbnRseTsKKyNlbmRpZiAvLyBIQ0ZfU0xFRVAgLyBIQ0ZfRVhUX0lOVF9USUNLCisKKyNpZiAoSENGX1RBTExJRVMpICYgfiggSENGX1RBTExJRVNfSENGIHwgSENGX1RBTExJRVNfTklDIHwgSENGX1RBTExJRVNfUkVTRVQgKSB8fCBcCisJKEhDRl9UQUxMSUVTKSA9PSBIQ0ZfVEFMTElFU19SRVNFVAorZXJyOiBpbnZhbGlkIHZhbHVlIGZvciBIQ0ZfVEFMTElFUzsKKyNlbmRpZiAvLyBIQ0ZfVEFMTElFUworCisjaWYgKEhDRl9UWVBFKSAmIH4oSENGX1RZUEVfV1BBIHwgSENGX1RZUEVfVVNCIHwgSENGX1RZUEVfUFJFTE9BREVEIHwgSENGX1RZUEVfSElJNSB8IEhDRl9UWVBFX1dBUlAgfCBcCisJCUhDRl9UWVBFX0NDWCAvKiB8IEhDRl9UWVBFX1RYX0RFTEFZICovICkKK2VycjogaW52YWxpZCB2YWx1ZSBmb3IgSENGX1RZUEU7CisjZW5kaWYgLy9IQ0ZfVFlQRQorCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dBUlAgJiYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQorZXJyOiBhdCBtb3N0IDEgb2YgdGhlc2UgbWFjcm9zIHNob3VsZCBiZSBkZWZpbmVkOworI2VuZGlmIC8vSENGX1RZUEVfV0FSUCAvIEhDRl9UWVBFX1dQQQorCisjZW5kaWYgLy9IQ0ZDRkdfSAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2ZkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZmRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZTc0YmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2ZkZWYuaApAQCAtMCwwICsxLDgwOSBAQAorCisvLyAgIHZpbTp0dz0xMTA6dHM9NDoKKyNpZm5kZWYgSENGREVGQ19ICisjZGVmaW5lIEhDRkRFRkNfSCAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZJTEUJIDogSENGREVGLkgKKyoKKyogREFURSAgIDogJERhdGU6IDIwMDQvMDgvMDUgMTE6NDc6MTAgJCAgICRSZXZpc2lvbjogMS44ICQKKyogT3JpZ2luYWw6IDIwMDQvMDUvMjggMTQ6MDU6MzUgICAgUmV2aXNpb246IDEuNTkgICAgICBUYWc6IGhjZjdfdDIwMDQwNjAyXzAxCisqIE9yaWdpbmFsOiAyMDA0LzA1LzEzIDE1OjMxOjQ1ICAgIFJldmlzaW9uOiAxLjUzICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNTEzXzAxCisqIE9yaWdpbmFsOiAyMDA0LzA0LzE1IDA5OjI0OjQyICAgIFJldmlzaW9uOiAxLjQ0ICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNDE1XzAxCisqIE9yaWdpbmFsOiAyMDA0LzA0LzEzIDE0OjIyOjQ1ICAgIFJldmlzaW9uOiAxLjQzICAgICAgVGFnOiB0N18yMDA0MDQxM18wMQorKiBPcmlnaW5hbDogMjAwNC8wNC8wMSAxNTozMjo1NSAgICBSZXZpc2lvbjogMS40MCAgICAgIFRhZzogdDdfMjAwNDA0MDFfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDMvMTAgMTU6Mzk6MjggICAgUmV2aXNpb246IDEuMzYgICAgICBUYWc6IHQyMDA0MDMxMF8wMQorKiBPcmlnaW5hbDogMjAwNC8wMy8wMyAxNDoxMDoxMiAgICBSZXZpc2lvbjogMS4zNCAgICAgIFRhZzogdDIwMDQwMzA0XzAxCisqIE9yaWdpbmFsOiAyMDA0LzAzLzAyIDA5OjI3OjEyICAgIFJldmlzaW9uOiAxLjMyICAgICAgVGFnOiB0MjAwNDAzMDJfMDMKKyogT3JpZ2luYWw6IDIwMDQvMDIvMjQgMTM6MDA6MjkgICAgUmV2aXNpb246IDEuMjkgICAgICBUYWc6IHQyMDA0MDIyNF8wMQorKiBPcmlnaW5hbDogMjAwNC8wMi8xOCAxNzoxMzo1NyAgICBSZXZpc2lvbjogMS4yNiAgICAgIFRhZzogdDIwMDQwMjE5XzAxCisqCisqIEFVVEhPUiA6IE5pY28gVmFsc3RlcgorKgorKiBTUEVDSUZJQ0FUSU9OOiAuLi4uLi4uLi4uLgorKgorKiBERVNDICAgOiBEZWZpbml0aW9ucyBhbmQgUHJvdG90eXBlcyBmb3IgSENGIG9ubHkKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqIFNPRlRXQVJFIExJQ0VOU0UKKyoKKyogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisqCisqIENPUFlSSUdIVCCpIDE5OTQgLSAxOTk1CWJ5IEFUJlQuCQkJCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKyogQ09QWVJJR0hUIKkgMTk5NiAtIDIwMDAgYnkgTHVjZW50IFRlY2hub2xvZ2llcy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBDT1BZUklHSFQgqSAyMDAxIC0gMjAwNAlieSBBZ2VyZSBTeXN0ZW1zIEluYy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisqCisqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorKiAgICBkaXN0cmlidXRpb24uCisqCisqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKgorKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIERpc2NsYWltZXIKKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorKiBEQU1BR0UuCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBQIFIgRSBGIEkgWCBFIFMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vSUZCXwkJSW50ZXJmYWNlIEJsb2NrCisvL0hDTURfCQlIZXJtZXMgQ29tbWFuZAorLy9IRlNfCQlIZXJtZXMgKFRyYW5zbWl0L1JlY2VpdmUpIEZyYW1lIFN0cnVjdHVyZQorLy9IUkVHXwkJSGVybWVzIFJlZ2lzdGVyCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgMCAvLworI2RlZmluZSBCSVQwICAweDAwMDEKKyNkZWZpbmUgQklUMSAgMHgwMDAyCisjZGVmaW5lIEJJVDIgIDB4MDAwNAorI2RlZmluZSBCSVQzICAweDAwMDgKKyNkZWZpbmUgQklUNCAgMHgwMDEwCisjZGVmaW5lIEJJVDUgIDB4MDAyMAorI2RlZmluZSBCSVQ2ICAweDAwNDAKKyNkZWZpbmUgQklUNyAgMHgwMDgwCisjZGVmaW5lIEJJVDggIDB4MDEwMAorI2RlZmluZSBCSVQ5ICAweDAyMDAKKyNkZWZpbmUgQklUMTAgMHgwNDAwCisjZGVmaW5lIEJJVDExIDB4MDgwMAorI2RlZmluZSBCSVQxMiAweDEwMDAKKyNkZWZpbmUgQklUMTMgMHgyMDAwCisjZGVmaW5lIEJJVDE0IDB4NDAwMAorI2RlZmluZSBCSVQxNSAweDgwMDAKKyNkZWZpbmUgQklUMTYgMHgwMDAxMDAwMAorI2RlZmluZSBCSVQxNyAweDAwMDIwMDAwCisjZGVmaW5lIEJJVDE4IDB4MDAwNDAwMDAKKyNkZWZpbmUgQklUMTkgMHgwMDA4MDAwMAorI2RlZmluZSBCSVQyMCAweDAwMTAwMDAwCisjZGVmaW5lIEJJVDIxIDB4MDAyMDAwMDAKKyNkZWZpbmUgQklUMjIgMHgwMDQwMDAwMAorI2RlZmluZSBCSVQyMyAweDAwODAwMDAwCisjZGVmaW5lIEJJVDI0IDB4MDEwMDAwMDAKKyNkZWZpbmUgQklUMjUgMHgwMjAwMDAwMAorI2RlZmluZSBCSVQyNiAweDA0MDAwMDAwCisjZGVmaW5lIEJJVDI3IDB4MDgwMDAwMDAKKyNkZWZpbmUgQklUMjggMHgxMDAwMDAwMAorI2RlZmluZSBCSVQyOSAweDIwMDAwMDAwCisjZGVmaW5lIEJJVDMwIDB4NDAwMDAwMDAKKyNkZWZpbmUgQklUMzEgMHg4MDAwMDAwMAorI2VuZGlmIC8vIDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogR0VORVJBTCBFUVVBVEVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNkZWZpbmUgSENGX01BR0lDCQkJCTB4N0QzNwkvLyAifTciIEhhbmRsZSB2YWxpZGF0aW9uCisKKyNkZWZpbmUJUExVR19EQVRBX09GRlNFVCAgICAgICAgMHgwMDAwMDgwMAkvL25lZWRlZCBieSBzb21lIHRlc3QgdG9vbCBvbiB0b3Agb2YgSC1JSSBORElTIGRyaXZlcgorCisjZGVmaW5lIElOSV9USUNLX0lOSQkJCTB4MDAwNDAwMDBMCisKKyNkZWZpbmUgSU9fSU4JCQkJCTAJCS8vaGNmaW9faW5fc3RyaW5nCisjZGVmaW5lIElPX09VVAkJCQkJMQkJLy9oY2Zpb19vdXRfc3RyaW5nCisKKy8vRE9fQVNTRVJULCBjcmVhdGUgYW4gYXJ0aWZpY2lhbCBGQUxTRSB0byBmb3JjZSBhbiBBU1NFUlQgd2l0aG91dCB0aGUgbmFzdHkgY29tcGlsZXIgd2FybmluZworI2RlZmluZSBET19BU1NFUlQJCQkJKCBhc3NlcnRfaWZicC0+SUZCX01hZ2ljICE9IEhDRl9NQUdJQyAmJiBhc3NlcnRfaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQyApCisjZGVmaW5lIE5UX0FTU0VSVAkJCQkweDAwMDAJCS8vLCBORVZFUl9URVNURUQKKyNkZWZpbmUgTkVWRVJfVEVTVEVECQkJTUVSR0VfMiggMHhFRkZFLCAweEZFRUYgKQorI2RlZmluZSBTRV9BU1NFUlQJCQkJMHg1RUZGCQkvKiBTaWRlIEVmZmVjdCwgSENGQVNTRVJUIGludm9rYXRpb24gd2hpY2ggYXJlIG9ubHkgY2FsbGVkIGZvciB0aGUKKwkJCQkJCQkJCQkJICogc2lkZSBlZmZlY3QgYW5kIHdoaWNoIHNob3VsZCBuZXZlciB0cmlnZ2VyICovCisjZGVmaW5lIERIRl9GSUxFX05BTUVfT0ZGU0VUCTEwMDAwCQkvL3RvIGRpc3Rpbmd1aXNoIERIRiBmcm9tIEhDRiBhc3NlcnRzIGJ5IG1lYW5zIG9mIGxpbmUgbnVtYmVyCisjZGVmaW5lIE1NRF9GSUxFX05BTUVfT0ZGU0VUCTIwMDAwCQkvL3RvIGRpc3Rpbmd1aXNoIE1NRCBmcm9tIEhDRiBhc3NlcnRzIGJ5IG1lYW5zIG9mIGxpbmUgbnVtYmVyCisKKy8vIHRyYWNlIGNvZGVzIHVzZWQgdG8KKy8vIDE6IHByb2ZpbGUgZXhlY3V0aW9uIHRpbWVzIHZpYSBIQ0ZfVFJBQ0UgYW5kIEhDRl9UUkFDRV9WQUxVRQorLy8gMjogaGllcmFyY2hpY2FsIGZsb3cgaW5mb3JtYXRpb24gdmlhIEhDRkxPR0VOVFJZIC8gSENGTE9HRVhJVAorCisvLyNkZWZpbmUgSENGX1RSQUNFX0NPTk5FQ1QJCXVzZWxlc3MKKy8vI2RlZmluZSBIQ0ZfVFJBQ0VfRElTQ09OTkVDVAl1c2VsZXNzCisjZGVmaW5lIEhDRl9UUkFDRV9BQ1RJT04JCTB4MDAwMCAgLy8gMHgwMDAxCisjZGVmaW5lIEhDRl9UUkFDRV9DTlRMCQkJMHgwMDAxICAvLyAweDAwMDIKKyNkZWZpbmUgSENGX1RSQUNFX0RNQV9SWF9HRVQJMHgwMDAyICAvLyAweDAwMDQKKyNkZWZpbmUgSENGX1RSQUNFX0RNQV9SWF9QVVQJMHgwMDAzICAvLyAweDAwMDgKKyNkZWZpbmUgSENGX1RSQUNFX0RNQV9UWF9HRVQJMHgwMDA0ICAvLyAweDAwMTAKKyNkZWZpbmUgSENGX1RSQUNFX0RNQV9UWF9QVVQJMHgwMDA1ICAvLyAweDAwMjAKKyNkZWZpbmUgSENGX1RSQUNFX0dFVF9JTkZPCQkweDAwMDYgIC8vIDB4MDA0MAorI2RlZmluZSBIQ0ZfVFJBQ0VfUFVUX0lORk8JCTB4MDAwNyAgLy8gMHgwMDgwCisjZGVmaW5lIEhDRl9UUkFDRV9SQ1ZfTVNHCQkweDAwMDggIC8vIDB4MDEwMAorI2RlZmluZSBIQ0ZfVFJBQ0VfU0VORF9NU0cJCTB4MDAwOSAgLy8gMHgwMjAwCisjZGVmaW5lIEhDRl9UUkFDRV9TRVJWSUNFX05JQwkweDAwMEEgIC8vIDB4MDQwMAorLy8gI2RlZmluZSBIQ0ZfVFJBQ0VfICAgICAgICAgICAweDAwMEMgIC8vIDB4MTAwMAorLy8gI2RlZmluZSBIQ0ZfVFJBQ0VfICAgICAgICAgICAweDAwMEQgIC8vIDB4MjAwMAorLy8gI2RlZmluZSBIQ0ZfVFJBQ0VfICAgICAgICAgICAweDAwMEUgIC8vIDB4NDAwMAorLy8gI2RlZmluZSBIQ0ZfVFJBQ0VfICAgICAgICAgICAweDAwMEYgIC8vIDB4ODAwMAorLy8JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSENGX1RSQUNFXy4uLiBjb2RlcyBiZWxvdyAweDAwMTAgYXJlIGFzc2VydGVkIG9uIHJlLWVudHJ5CisjZGVmaW5lIEhDRl9UUkFDRV9BQ1RJT05fS0xVREdFCTB4MDAxMCAgLyogb25jZSB5b3Ugc3RhcnQgaW50cm9kdWNpbmcga2x1ZGdlcyB0aGVyZSBpcyBubyBlbmQgdG8gaXQKKwkJCQkJCQkJCQkgKiB0aGlzIGlzIGFuIGVzY2FwZSB0byBkbyBub3QgYXNzZXJ0IG9uIHJlLWVudHJhbmN5IHByb2JsZW0gY2F1c2VkCisJCQkJCQkJCQkJICogYnkgSENGX0FDVF9JTlRfRk9SQ0VfT04gdXNlZCB0byBnZXQgTWljcm9zb2Z0cyBORElTIGRyaXZlcnMgZ29pbmcKKwkJCQkJCQkJCQkgKi8KKyNkZWZpbmUgSENGX1RSQUNFX1NUUklPCQkJMHgwMDIwCisjZGVmaW5lIEhDRl9UUkFDRV9BTExPQwkJCTBYMDAyMQorI2RlZmluZSBIQ0ZfVFJBQ0VfREwJCQkwWDAwMjMKKyNkZWZpbmUgSENGX1RSQUNFX0lTUl9JTkZPCQkwWDAwMjQKKyNkZWZpbmUgSENGX1RSQUNFX0NBTElCUkFURQkJMHgwMDI2CisKKyNkZWZpbmUgSENGX1RSQUNFX0NNRF9DUEwgCQkweDAwNDAKKyNkZWZpbmUgSENGX1RSQUNFX0NNRF9FWEUJCTB4MDA0MQorI2RlZmluZSBIQ0ZfVFJBQ0VfR0VUX0ZJRAkJMHgwMDQyCisjZGVmaW5lIEhDRl9UUkFDRV9HRVRfRlJBRwkJMHgwMDQzCisjZGVmaW5lIEhDRl9UUkFDRV9JTklUCQkJMHgwMDQ0CisjZGVmaW5lIEhDRl9UUkFDRV9QVVRfRlJBRwkJMHgwMDQ1CisjZGVmaW5lIEhDRl9UUkFDRV9TRVRVUF9CQVAJCTB4MDA0NgorCisjZGVmaW5lCUhDRl9UUkFDRV9FWElUIAkJCTB4ODAwMAkvLyBLZWlsIEMgd2FybnMgImxvbmcgY29uc3RhbnQgdHJ1bmNhdGVkIHRvIGludCIKKworLy8jZGVmaW5lIEJBUF8wCQkJCQlIUkVHX0RBVEFfMAkJLy9Vc2VkIGJ5IERNQSBjb250cm9sbGVyIHRvIGFjY2VzcyBOSUMgUkFNCisjZGVmaW5lIEJBUF8xCQkJCQlIUkVHX0RBVEFfMQkJLy9Vc2VkIGJ5IEhDRiB0byBhY2Nlc3MgTklDIFJBTQorCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKiBIZXJtZXMgUmVjZWl2ZS9UcmFuc21pdCBGcmFtZSBTdHJ1Y3R1cmVzCisvL0hGU19TVEFUCisvL3NlZSBNTUQuSCBmb3IgSEZTX1NUQVRfRVJSCisjZGVmaW5lIAlIRlNfU1RBVF9NU0dfVFlQRQkweEUwMDAJLy9IZXJtZXMgcmVwb3J0ZWQgTWVzc2FnZSBUeXBlCisjZGVmaW5lIAlIRlNfU1RBVF9NSUNfS0VZX0lECTB4MTgwMAkvL01JQyBrZXkgdXNlZCAoaWYgYW55KQorI2RlZmluZSAJSEZTX1NUQVRfMTA0MgkJMHgyMDAwCS8vUkZDMTA0MiBFbmNvZGVkCisjZGVmaW5lIAlIRlNfU1RBVF9UVU5ORUwJCTB4NDAwMAkvL0JyaWRnZS1UdW5uZWwgRW5jb2RlZAorI2RlZmluZSAJSEZTX1NUQVRfV01QX01TRwkweDYwMDAJLy9XYXZlTEFOLUlJIE1hbmFnZW1lbnQgUHJvdG9jb2wgRnJhbWUKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCisjZGVmaW5lIAlIRlNfU1RBVF9NSUMJCTB4MDAxMAkvL0ZyYW1lIGNvbnRhaW5zIE1JQyAgLy87PyByZS1pbnN0YXRlIHdoZW4gRi9XIHJlYWR5CisjZW5kaWYKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqIEhlcm1lcyBSZWdpc3RlciBPZmZzZXRzIGFuZCBDb21tYW5kIGJpdHMKKyNkZWZpbmUgSFJFR19JT19SQU5HRQkJCTB4ODAJCS8vSS9PIFJhbmdlIHVzZWQgYnkgSGVybWVzCisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqIENvbW1hbmQvU3RhdHVzCisjZGVmaW5lIEhSRUdfQ01ECQkJCTB4MDAJCS8vCisjZGVmaW5lIAlIQ01EX0NNRF9DT0RFCQkJMHgzRgorI2RlZmluZSBIUkVHX1BBUkFNXzAJCQkweDAyCQkvLworI2RlZmluZSBIUkVHX1BBUkFNXzEJCQkweDA0CQkvLworI2RlZmluZSBIUkVHX1BBUkFNXzIJCQkweDA2CQkvLworI2RlZmluZSBIUkVHX1NUQVQJCQkJMHgwOAkJLy8KKyNkZWZpbmUgCUhSRUdfU1RBVF9DTURfQ09ERQkJMHgwMDNGCS8vCisjZGVmaW5lCQlIUkVHX1NUQVRfRElBR19FUlIJCTB4MDEwMAorI2RlZmluZQkJSFJFR19TVEFUX0lOUVVJUkVfRVJSCTB4MDUwMAorI2RlZmluZSAJSFJFR19TVEFUX0NNRF9SRVNVTFQJMHg3RjAwCS8vCisjZGVmaW5lIEhSRUdfUkVTUF8wCQkJCTB4MEEJCS8vCisjZGVmaW5lIEhSRUdfUkVTUF8xCQkJCTB4MEMJCS8vCisjZGVmaW5lIEhSRUdfUkVTUF8yCQkJCTB4MEUJCS8vCisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqIEZJRCBNYW5hZ2VtZW50CisjZGVmaW5lIEhSRUdfSU5GT19GSUQJCQkweDEwCQkvLworI2RlZmluZSBIUkVHX1JYX0ZJRAkJCQkweDIwCQkvLworI2RlZmluZSBIUkVHX0FMTE9DX0ZJRCAgCQkweDIyCQkvLworI2RlZmluZSBIUkVHX1RYX0NPTVBMX0ZJRCAgCQkweDI0CQkvLworCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKiBCQVAKKy8vMjAwMzEwMzAgSFdpIEluc2VydGVkIHRoaXMgYWdhaW4gYmVjYXVzZSB0aGUgZG9uZ2xlIGNvZGUgdXNlcyB0aGlzIChHUElGLkMpCisvLyNkZWZpbmUgSFJFR19TRUxFQ1RfMAkJCTB4MTgJCS8vCisvLyNkZWZpbmUgSFJFR19PRkZTRVRfMAkJCTB4MUMJCS8vCisvLyNkZWZpbmUgSFJFR19EQVRBXzAJCQkweDM2CQkvLworCisvLyNkZWZpbmUgCUhSRUdfT0ZGU0VUX0JVU1kJCTB4ODAwMAkvLyB1c2UgSENNRF9CVVNZCisjZGVmaW5lIAlIUkVHX09GRlNFVF9FUlIJCQkweDQwMDAJLy8KKy8vcnNydmQgI2RlZmluZSAJSFJFR19PRkZTRVRfREFUQV9PRkZTRVQJMHgwRkZGCS8vCisKKyNkZWZpbmUgSFJFR19TRUxFQ1RfMQkJCTB4MUEJCS8vCisjZGVmaW5lIEhSRUdfT0ZGU0VUXzEJCQkweDFFCQkvLworI2RlZmluZSBIUkVHX0RBVEFfMQkJCQkweDM4CQkvLworCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKiBFdmVudAorI2RlZmluZSBIUkVHX0VWX1NUQVQJCQkweDMwCQkvLworI2RlZmluZSBIUkVHX0lOVF9FTgkJCQkweDMyCQkvLworI2RlZmluZSBIUkVHX0VWX0FDSwkJCQkweDM0CQkvLworCisjZGVmaW5lICAgIEhSRUdfRVZfVElDSwkJCQkweDgwMDAJLy9BdXhpbGlhcnkgVGltZXIgVGljaworLy8jZGVmaW5lICBIUkVHX0VWX1JFUwkJCQkweDQwMDAJLy9ILUkgb25seTogSC9XIGVycm9yIChXYWl0IFRpbWUtb3V0KQorI2RlZmluZSAgICBIUkVHX0VWX0lORk9fRFJPUAkJMHgyMDAwCS8vV01BQyBkaWQgbm90IGhhdmUgc3VmZmljaWVudCBSQU0gdG8gYnVpbGQgVW5zb2xsaWNpdGVkIEZyYW1lCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUKKyNkZWZpbmUgICAgSFJFR19FVl9BQ0tfUkVHX1JFQURZCTB4MDAwMAorI2Vsc2UKKyNkZWZpbmUgICAgSFJFR19FVl9BQ0tfUkVHX1JFQURZCTB4MTAwMAkvL1dvcmthcm91bmQgS2x1ZGdlIGJpdCBmb3IgSC1JSSAobm90IEgtSUkuNSkKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9ISUk1CisjaWYgKEhDRl9TTEVFUCkgJiAoIEhDRl9DRFMgfCBIQ0ZfRERTICkKKyNkZWZpbmUgICAgSFJFR19FVl9TTEVFUF9SRVEJCTB4MDgwMAorI2Vsc2UKKyNkZWZpbmUgICAgSFJFR19FVl9TTEVFUF9SRVEJCTB4MDAwMAorI2VuZGlmIC8vIEhDRl9DRFMgLyBIQ0ZfRERTCisjaWYgSENGX0RNQQorLy8jZGVmaW5lICAgIEhSRUdfRVZfTFBFU0MJCQkweDA0MDAgLy8gZmlybXdhcmUgc2V0cyB0aGlzIGJpdCBhbmQgY2xlYXJzIGl0LCBub3QgZm9yIGhvc3QgdXNhZ2UuCisjZGVmaW5lICAgIEhSRUdfRVZfUkRNQUQJCQkweDAyMDAgLy8gcnggZnJhbWUgaW4gaG9zdCBtZW1vcnkKKyNkZWZpbmUgICAgSFJFR19FVl9URE1BRAkJCTB4MDEwMCAvLyB0eCBmcmFtZSBpbiBob3N0IG1lbW9yeSBwcm9jZXNzZWQKKy8vI2RlZmluZSAgICBIUkVHX0VWX1JYRE1BCQkJMHgwMDQwIC8vIGZpcm13YXJlIGtpY2tzIG9mZiBETUEgZW5naW5lIChiaXQgaXMgbm90IGZvciBob3N0IHVzYWdlKQorLy8jZGVmaW5lICAgIEhSRUdfRVZfVFhETUEJCQkweDAwMjAgLy8gZmlybXdhcmUga2lja3Mgb2ZmIERNQSBlbmdpbmUgKGJpdCBpcyBub3QgZm9yIGhvc3QgdXNhZ2UpCisjZGVmaW5lICAgIEhSRUdfRVZfRldfRE1BCQkJMHgwNDYwIC8vIGZpcm13YXJlIC8gRE1BIGVuZ2luZSBJL0YgKGJpdHMgYXJlIG5vdCBmb3IgaG9zdCB1c2FnZSkKKyNlbHNlCisjZGVmaW5lICAgIEhSRUdfRVZfRldfRE1BCQkJMHgwMDAwCisjZW5kaWYgLy8gSENGX0RNQQorI2RlZmluZSAgICBIUkVHX0VWX0lORk8JCQkJMHgwMDgwCS8vIEFzeW5jaHJvbm91cyBJbmZvcm1hdGlvbiBGcmFtZQorI2RlZmluZSAgICBIUkVHX0VWX0NNRAkJCQkweDAwMTAJLy8gQ29tbWFuZCBjb21wbGV0ZWQsIFN0YXR1cyBhbmQgUmVzcG9uc2UgYXZhaWxhYmxlCisjZGVmaW5lICAgIEhSRUdfRVZfQUxMT0MJCQkweDAwMDgJLy8gQXN5bmNocm9ub3VzIHBhcnQgb2YgQWxsb2NhdGlvbi9SZWNsYWltIGNvbXBsZXRlZAorI2RlZmluZSAgICBIUkVHX0VWX1RYX0VYQwkJCTB4MDAwNAkvLyBBc3luY2hyb25vdXMgVHJhbnNtaXNzaW9uIHVuc3VjY2Vzc2Z1bCBjb21wbGV0ZWQKKyNkZWZpbmUgICAgSFJFR19FVl9UWAkJCQkweDAwMDIJLy8gQXN5bmNocm9ub3VzIFRyYW5zbWlzc2lvbiBzdWNjZXNzZnVsIGNvbXBsZXRlZAorI2RlZmluZSAgICBIUkVHX0VWX1JYCQkJCTB4MDAwMQkvLyBBc3luY2hyb25vdXMgUmVjZWl2ZSBGcmFtZQorCisjZGVmaW5lICAgIEhSRUdfRVZfVFhfRVhUIAkJCSggKEhDRl9FWFQpICYgKEhDRl9FWFRfSU5UX1RYX0VYIHwgSENGX0VYVF9JTlRfVElDSyApICkKKwkJCQkJCQkJCS8qIEhSRUdfRVZfVFhfRVhUIDo9IDB4MDAwMCBvciBIUkVHX0VWX1RYX0VYQyBhbmQvb3IgSFJFR19FVl9USUNLCisJCQkJCQkJCQkgKiBjb3VsZCBiZSBleHRlbmRlZCB3aXRoIEhSRUdfRVZfVFggKi8KKyNpZiBIQ0ZfRVhUX0lOVF9UWF9FWCAhPSBIUkVHX0VWX1RYX0VYQworZXJyOiB0aGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoOworI2VuZGlmIC8vIEhDRl9FWFRfSU5UX1RYX0VYIC8gSFJFR19FVl9UWF9FWEMKKworI2lmIEhDRl9FWFRfSU5UX1RJQ0sgIT0gSFJFR19FVl9USUNLCitlcnI6IHRoZXNlIHZhbHVlcyBzaG91bGQgbWF0Y2g7CisjZW5kaWYgLy8gSENGX0VYVF9JTlRfVElDSyAvIEhSRUdfRVZfVElDSworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKiogSG9zdCBTb2Z0d2FyZQorI2RlZmluZSBIUkVHX1NXXzAJCQkJMHgyOAkJLy8KKyNkZWZpbmUgSFJFR19TV18xCQkJCTB4MkEJCS8vCisjZGVmaW5lIEhSRUdfU1dfMgkJCQkweDJDCQkvLworLy9yc3J2ZCAjZGVmaW5lIEhSRUdfU1dfMwkJMHgyRQkJLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKiBDb250cm9sIGFuZCBBdXhpbGlhcnkgUG9ydAorCisjZGVmaW5lIEhSRUdfSU8JCQkJCTB4MTIKKyNkZWZpbmUJCUhSRUdfSU9fU1JFU0VUCQkJMHgwMDAxCisjZGVmaW5lCQlIUkVHX0lPX1dBS0VVUF9BU1lOQwkweDAwMDIKKyNkZWZpbmUJCUhSRUdfSU9fV09LRU5fVVAJCTB4MDAwNAorI2RlZmluZSBIUkVHX0NOVEwJCQkJMHgxNAkJLy8KKy8vI2RlZmluZQkJSFJFR19DTlRMX1dBS0VVUF9TWU5DCTB4MDAwMQorI2RlZmluZQkJSFJFR19DTlRMX0FVWF9FTkFfU1RBVAkweEMwMDAKKyNkZWZpbmUJCUhSRUdfQ05UTF9BVVhfRElTX1NUQVQJMHgwMDAwCisjZGVmaW5lCQlIUkVHX0NOVExfQVVYX0VOQV9DTlRMCTB4ODAwMAorI2RlZmluZQkJSFJFR19DTlRMX0FVWF9ESVNfQ05UTAkweDQwMDAKKyNkZWZpbmUJCUhSRUdfQ05UTF9BVVhfRFNECQkweDIwMDAKKyNkZWZpbmUJCUhSRUdfQ05UTF9BVVhfRU5BCQkoSFJFR19DTlRMX0FVWF9FTkFfQ05UTCB8IEhSRUdfQ05UTF9BVVhfRElTX0NOVEwgKQorI2RlZmluZSBIUkVHX1NQQVJFCQkJCTB4MTYJCS8vCisjZGVmaW5lIEhSRUdfQVVYX1BBR0UJCQkweDNBCQkvLworI2RlZmluZSBIUkVHX0FVWF9PRkZTRVQJCQkweDNDCQkvLworI2RlZmluZSBIUkVHX0FVWF9EQVRBCQkJMHgzRQkJLy8KKworI2lmIEhDRl9ETUEKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKiBETUEgKGJ1cyBtYXN0ZXJpbmcpCisJLy8gQmUgY2FyZWZ1bGwgdG8gdXNlIHRoZXNlIHJlZ2lzdGVycyBvbmx5IGF0IGEgZ2VudWluZSAzMiBiaXRzIE5JQworCS8vIE9uIDE2IGJpdHMgTklDcywgdGhlc2UgYWRkcmVzc2VzIGFyZSBtYXBwZWQgaW50byB0aGUgcmFuZ2UgMHgwMCB0aHJvdWdoIDB4M0Ygd2l0aCBhbGwgY29uc2VxdWVuY2VzCisJLy8gdGhlcmVvZiwgZS5nLiAgSFJFR19ETUFfQ1RSTCByZWdpc3RlciBtYXBzIHRvIEhSRUdfQ01ELgorI2RlZmluZSBIUkVHX0RNQV9DVFJMCQkJCQkJMHgwMDQwCisjZGVmaW5lIEhSRUdfVFhETUFfUFRSMzIJCQkJCTB4MDA0NAorI2RlZmluZSBIUkVHX1RYRE1BX1BSSU9fUFRSMzIJCQkJMHgwMDQ4CisjZGVmaW5lIEhSRUdfVFhETUFfSElQUklPX1BUUjMyCQkJCTB4MDA0QworI2RlZmluZSBIUkVHX1JYRE1BX1BUUjMyCQkJCQkweDAwNTAKKyNkZWZpbmUgSFJFR19DQVJEREVURUNUXzEJCQkJCTB4MDA3QyAvLyBjb250YWlucyA3RDM3CisjZGVmaW5lIEhSRUdfQ0FSRERFVEVDVF8yCQkJCQkweDAwN0UgLy8gY29udGFpbnMgN0RFNworI2RlZmluZSBIUkVHX0ZSRUVUSU1FUgkJCQkJCTB4MDA1OAorI2RlZmluZSBIUkVHX0RNQV9SWF9DTlQJCQkJCQkweDAwMjYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEZWZpbmVzIGZvciB0aGUgYml0cyBpbiB0aGUgRG1hQ29udHJvbCByZWdpc3RlciAoQDQwaCkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWEhXRU4JCQkJMHg4MDAwMDAwMCAvLyBoaWdoIHdvcmQgZW5hYmxlIGJpdAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYUkVTRVQJCQkJMHg0MDAwMDAwMCAvLyB0eCBkbWEgaW5pdCBiaXQKKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWEJBUDEJCQkJQklUMjkKKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWF9TVEFMTEVECQkJQklUMjgKKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWEFVVE9BQ0tfRE1BRE9ORQkJQklUMjcgLy8gbm8gaG9zdCBpbnZvbHZlbWVudCByZXEuIGZvciBURE1BRE9ORSBldmVudAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYQVVUT0FDS19JTkZPCQlCSVQyNiAvLyBubyBob3N0IGludm9sdmVtZW50IHJlcS4gZm9yIGFsbG9jIGV2ZW50CisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhBVVRPQUNLX0RNQUVOCQkweDAyMDAwMDAwIC8vIG5vIGhvc3QgaW52b2x2ZW1lbnQgcmVxLiBmb3IgVHhETUFlbiBldmVudAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYQVVUT0FDS19SWAkJCTB4MDEwMDAwMDAgLy8gbm8gaG9zdCBpbnZvbHZlbWVudCByZXEuIGZvciB0eCBldmVudAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYX0JVU1kJCQkJQklUMjMgLy8gcmVhZCBvbmx5IGJpdAorLy8jZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhfUkJVRkNPTlRfUExBSU4JCTAJICAvLyBiaXRzIDIxLi4yMAorLy8jZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhfTU9ERV9QTEFJTl9ETUEJCTAJICAvLyBtb2RlIDAKKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWF9NT0RFX1NJTkdMRV9QQUNLRVQJMHgwMDAxMDAwMCAvLyBtb2RlIDEKKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWF9NT0RFX01VTFRJX1BBQ0tFVAkweDAwMDIwMDAwIC8vIG1vZGUgMgorLy8jZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhfTU9ERV9ESVNBQkxFCQkoMHgwMDAyMDAwMHwweDAwMDEwMDAwKSAvLyBkaXNhYmxlIHR4IGRtYSBlbmdpbmUKKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9UWEhXRU4JCQkJMHg4MDAwIC8vIGxvdyB3b3JkIGVuYWJsZSBiaXQKKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9UWFJFU0VUCQkJCTB4NDAwMCAvLyByeCBkbWEgaW5pdCBiaXQKKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9UWEJBUDEJCQkJQklUMTMKKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9UWEFVVE9BQ0tfRE1BRE9ORQkJQklUMTEgLy8gbm8gaG9zdCBpbnZvbHZlbWVudCByZXEuIGZvciBSeERNQURPTkUgZXZlbnQKKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9UWEFVVE9BQ0tfRE1BRU4JCTB4MDAwMDA0MDAgLy8gbm8gaG9zdCBpbnZvbHZlbWVudCByZXEuIGZvciBSeERNQWVuIGV2ZW50CisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhBVVRPQUNLX0RNQUFMTE9DCTB4MDAwMDAyMDAgIC8vIG5vIGhvc3QgaW52b2x2ZW1lbnQgcmVxLiBmb3IgaW5mbyBldmVudAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYQVVUT0FDS19UWAkJCTB4MDAwMDAxMDAgIC8vIG5vIGhvc3QgaW52b2x2ZW1lbnQgcmVxLiBmb3IgcnggZXZlbnQKKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9UWF9CVVNZCQkJCUJJVDcgIC8vIHJlYWQgb25seSBiaXQKKy8vI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYX1RCVUZDT05UX1BMQUlOCQkwCSAgLy8gYml0cyA2Li41CisvLyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9UWF9NT0RFX1BMQUlOX0RNQQkJMAkgIC8vIG1vZGUgMAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYX01PREVfU0lOR0xFX1BBQ0tFVAlCSVQwIC8vIG1vZGUgMQorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYX01PREVfTVVMVElfUEFDS0VUCTB4MDAwMDAwMDIgLy8gbW9kZSAyCisvLyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9UWF9NT0RFX0RJU0FCTEUJCSgweDAwMDAwMDAxfDB4MDAwMDAwMDIpIC8vIGRpc2FibGUgdHggZG1hIGVuZ2luZQorCisvL2NvbmZpZ3VyYXRpb24gRFdPUkQgdG8gY29uZmlndXJlIERNQSBmb3IgbW9kZTIgb3BlcmF0aW9uLCB1c2luZyBCQVAwIGFzIHRoZSBETUEgQkFQLgorI2RlZmluZSBETUFfQ1RSTFNUQVRfR08gKEhSRUdfRE1BX0NUUkxfUlhIV0VOIHwgSFJFR19ETUFfQ1RSTF9SWF9NT0RFX01VTFRJX1BBQ0tFVCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIUkVHX0RNQV9DVFJMX1JYQVVUT0FDS19ETUFFTiB8IEhSRUdfRE1BX0NUUkxfUlhBVVRPQUNLX1JYIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUdfRE1BX0NUUkxfVFhIV0VOIHwgLyo7P0hSRUdfRE1BX0NUUkxfVFhfVEJVRkNPTlRfUExBSU4gfCovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIUkVHX0RNQV9DVFJMX1RYX01PREVfTVVMVElfUEFDS0VUIHwgSFJFR19ETUFfQ1RSTF9UWEFVVE9BQ0tfRE1BRU4gfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIUkVHX0RNQV9DVFJMX1RYQVVUT0FDS19ETUFBTExPQykKKworLy9jb25maWd1cmF0aW9uIERXT1JEIHRvIHJlc2V0IGJvdGggdGhlIFR4IGFuZCBSeCBETUEgZW5naW5lcworI2RlZmluZSBETUFfQ1RSTFNUQVRfUkVTRVQgKEhSRUdfRE1BX0NUUkxfUlhIV0VOIHwgSFJFR19ETUFfQ1RSTF9SWFJFU0VUIHwgSFJFR19ETUFfQ1RSTF9UWEhXRU4gfCBIUkVHX0RNQV9DVFJMX1RYUkVTRVQpCisKKy8vI2RlZmluZSBERVNDX0RNQV9PV05FRCAgICAgCQkweDgwMDAwMDAwIAkJCQkJLy8gQklUMzEKKyNkZWZpbmUgREVTQ19ETUFfT1dORUQgICAgIAkJMHg4MDAwCSAJCQkJCS8vIEJJVDMxCisjZGVmaW5lIERFU0NfU09QICAgCQkJIAkweDgwMDAgCQkJCQkJLy8gQklUMTUKKyNkZWZpbmUgREVTQ19FT1AgICAJCQkgCTB4NDAwMCAJCQkJCQkvLyBCSVQxNAorCisjZGVmaW5lIERNQV9SWAkJCQkwCisjZGVmaW5lIERNQV9UWAkJCQkxCisKKy8vICNkZWZpbmUgSUZCX1J4Rmlyc3REZXNjCQlJRkJfRmlyc3REZXNjW0RNQV9SWF0KKy8vICNkZWZpbmUgSUZCX1R4Rmlyc3REZXNjCQlJRkJfRmlyc3REZXNjW0RNQV9UWF0KKy8vICNkZWZpbmUgSUZCX1J4TGFzdERlc2MJCUlGQl9MYXN0RGVzY1tETUFfUlhdCisvLyAjZGVmaW5lIElGQl9UeExhc3REZXNjCQlJRkJfTGFzdERlc2NbRE1BX1RYXQorCisjZW5kaWYgLy8gSENGX0RNQQorLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRVFVQVRFUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLyBIZXJtZXMgQ29tbWFuZCBDb2RlcyBhbmQgUXVhbGlmaWVyIGJpdHMKKyNkZWZpbmUgCUhDTURfQlVTWQkJCTB4ODAwMAkvLyBCdXN5IGJpdCwgYXBwbGljYWJsZSBmb3IgYWxsIGNvbW1hbmRzCisjZGVmaW5lIEhDTURfSU5JCQkJCTB4MDAwMAkvLworI2RlZmluZSBIQ01EX0VOQUJMRQkJCQlIQ0ZfQ05UTF9FTkFCTEUJCS8vIDB4MDAwMQorI2RlZmluZSBIQ01EX0RJU0FCTEUJCQlIQ0ZfQ05UTF9ESVNBQkxFCS8vIDB4MDAwMgorI2RlZmluZSBIQ01EX0NPTk5FQ1QJCQlIQ0ZfQ05UTF9DT05ORUNUCS8vIDB4MDAwMworI2RlZmluZSBIQ01EX0VYRUNVVEUJCQkweDAwMDQJLy8KKyNkZWZpbmUgSENNRF9ESVNDT05ORUNUCQkJSENGX0NOVExfRElTQ09OTkVDVAkvLyAweDAwMDUKKyNkZWZpbmUgSENNRF9TTEVFUAkJCQkweDAwMDYJLy8KKyNkZWZpbmUgSENNRF9DT05USU5VRQkJCUhDRl9DTlRMX0NPTlRJTlVFCS8vIDB4MDAwNworI2RlZmluZSAJSENNRF9SRVRSWQkJCTB4MDEwMAkvLyBSZXRyeSBiaXQKKyNkZWZpbmUgSENNRF9BTExPQwkJCQkweDAwMEEJLy8KKyNkZWZpbmUgSENNRF9UWAkJCQkJMHgwMDBCCS8vCisjZGVmaW5lIAlIQ01EX1JFQ0wJCQkweDAxMDAJLy8gUmVjbGFpbSBiaXQsIGFwcGxpY2FibGUgZm9yIFR4IGFuZCBJbnF1aXJlCisjZGVmaW5lIEhDTURfSU5RVUlSRQkJCTB4MDAxMQkvLworI2RlZmluZSBIQ01EX0FDQ0VTUwkJCQkweDAwMjEJLy8KKyNkZWZpbmUgCUhDTURfQUNDRVNTX1dSSVRFCTB4MDEwMAkvLyBXcml0ZSBiaXQKKyNkZWZpbmUgSENNRF9QUk9HUkFNCQkJMHgwMDIyCS8vCisjZGVmaW5lIEhDTURfUkVBRF9NSUYJCQkweDAwMzAKKyNkZWZpbmUgSENNRF9XUklURV9NSUYJCQkweDAwMzEKKyNkZWZpbmUgSENNRF9USEVTRVVTCQkJMHgwMDM4CisjZGVmaW5lIAlIQ01EX1NUQVJUUFJFQU1CTEUgIDB4MEUwMAkvLyBTdGFydCBjb250aW51b3VzIHByZWFtYmxlIFR4CisjZGVmaW5lIAlIQ01EX1NUT1AJCQkweDBGMDAJLy8gU3RvcCBUaGVzZXVzIHRlc3QgbW9kZQorCisKKy8vQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50CisvLworCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19QUklfM19CT1RUT00JMQkvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBQcmltYXJ5IEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfUFJJXzNfVE9QCTEJLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgUHJpbWFyeSBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKworI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfQk9UVE9NCTEJLy8gRGVmYXVsdCBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgSC9XIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfVE9QCTEJLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgSC9XIC0gZHJpdmVyIEkvRgorCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNV9CT1RUT00JMQkvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBIL1cgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNV9UT1AJMQkvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBIL1cgLSBkcml2ZXIgSS9GCisKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19BUEZfMV9CT1RUT00JMTYJLy8gRGVmYXVsdCBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19BUEZfMV9UT1AgICAgMTYJLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZWxzZSAgLy87PyBpcyB0aGlzIFJFQUxMWSBPLksuCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19BUEZfMV9CT1RUT00JMQkvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBBUCBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX1RPUCAgICAxCS8vIERlZmF1bHQgVG9wICAgIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQorCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19BUEZfMl9CT1RUT00JMgkvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBBUCBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX1RPUCAgICAyCS8vIERlZmF1bHQgVG9wICAgIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19BUEZfM19CT1RUT00JMQkvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBBUCBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8zX1RPUCAgICAxCS8vIERlZmF1bHQgVG9wICAgIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19BUEZfNF9CT1RUT00JMQkvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBBUCBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl80X1RPUCAgICAxCS8vIERlZmF1bHQgVG9wICAgIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX0JPVFRPTQk2CS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIFN0YXRpb24gRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9UT1AgICAgNgkvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2Vsc2UgLy8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX0JPVFRPTQkxCS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIFN0YXRpb24gRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9UT1AgICAgMgkvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2VuZGlmIC8vIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1CisKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8zX0JPVFRPTQkxCS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIFN0YXRpb24gRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19TVEFfM19UT1AgICAgMQkvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19TVEFfNF9CT1RUT00JMQkvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzRfVE9QICAgIDEJLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgU3RhdGlvbiBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiBkZWZpbmVkIEhDRl9DRkdfUFJJXzFfVE9QIHx8IGRlZmluZWQgSENGX0NGR19QUklfMV9CT1RUT00KK2VycjogUFJJXzEgbm90IHN1cHBvcnRlZCBmb3IgSC1JOwkvLyBDb21wYXRpYmlsaXR5IGZvciBQcmltYXJ5IEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2VuZGlmIC8vIEhDRl9DRkdfUFJJXzFfVE9QIC8gSENGX0NGR19QUklfMV9CT1RUT00KKworI2lmIGRlZmluZWQgSENGX0NGR19QUklfMl9UT1AgfHwgZGVmaW5lZCBIQ0ZfQ0ZHX1BSSV8yX0JPVFRPTQorZXJyOiBQUklfMiBub3Qgc3VwcG9ydGVkIGZvciBILUk7CS8vIENvbXBhdGliaWxpdHkgZm9yIFByaW1hcnkgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZW5kaWYgLy8gSENGX0NGR19QUklfMl9UT1AgLyBIQ0ZfQ0ZHX1BSSV8yX0JPVFRPTQorCisjaWZkZWYgSENGX0NGR19QUklfM19UT1AJCQkJCQkJCQkvLyBUb3AgQ29tcGF0aWJpbGl0eSBmb3IgUHJpbWFyeSBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNpZiBIQ0ZfQ0ZHX1BSSV8zX1RPUCA9PSAwIHx8IFwKKwlDRkdfRFJWX0FDVF9SQU5HRVNfUFJJXzNfQk9UVE9NIDw9IEhDRl9DRkdfUFJJXzNfVE9QICYmIEhDRl9DRkdfUFJJXzNfVE9QIDw9IENGR19EUlZfQUNUX1JBTkdFU19QUklfM19UT1AKKyN1bmRlZiBDRkdfRFJWX0FDVF9SQU5HRVNfUFJJXzNfVE9QCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19QUklfM19UT1AJSENGX0NGR19QUklfM19UT1AKKyNlbHNlCitlcnI6IDsKKyNlbmRpZgorI2VuZGlmIC8vIEhDRl9DRkdfUFJJXzNfVE9QCisKKyNpZmRlZiBIQ0ZfQ0ZHX1BSSV8zX0JPVFRPTSAgICAgICAgICAgICAgICAgICAgICAgCQkJLy8gQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIFByaW1hcnkgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjaWYgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX0JPVFRPTSA8PSBIQ0ZfQ0ZHX1BSSV8zX0JPVFRPTSAmJiBIQ0ZfQ0ZHX1BSSV8zX0JPVFRPTSA8PSBDRkdfRFJWX0FDVF9SQU5HRVNfUFJJXzNfVE9QCisjdW5kZWYgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX0JPVFRPTQorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfUFJJXzNfQk9UVE9NCUhDRl9DRkdfUFJJXzNfQk9UVE9NCisjZWxzZQorZXJyOiA7CisjZW5kaWYKKyNlbmRpZiAvLyBIQ0ZfQ0ZHX1BSSV8zX0JPVFRPTQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgZGVmaW5lZCBIQ0ZfQ0ZHX0hTSV8wX1RPUCB8fCBkZWZpbmVkIEhDRl9DRkdfSFNJXzBfQk9UVE9NCitlcnI6IEhTSV8wIG5vdCBzdXBwb3J0ZWQgZm9yIEgtSTsJLy8gQ29tcGF0aWJpbGl0eSBmb3IgSFNJIEkvRgorI2VuZGlmIC8vIEhDRl9DRkdfSFNJXzBfVE9QIC8gSENGX0NGR19IU0lfMF9CT1RUT00KKworI2lmIGRlZmluZWQgSENGX0NGR19IU0lfMV9UT1AgfHwgZGVmaW5lZCBIQ0ZfQ0ZHX0hTSV8xX0JPVFRPTQorZXJyOiBIU0lfMSBub3Qgc3VwcG9ydGVkIGZvciBILUk7CS8vIENvbXBhdGliaWxpdHkgZm9yIEhTSSBJL0YKKyNlbmRpZiAvLyBIQ0ZfQ0ZHX0hTSV8xX1RPUCAvIEhDRl9DRkdfSFNJXzFfQk9UVE9NCisKKyNpZiBkZWZpbmVkIEhDRl9DRkdfSFNJXzJfVE9QIHx8IGRlZmluZWQgSENGX0NGR19IU0lfMl9CT1RUT00KK2VycjogSFNJXzIgbm90IHN1cHBvcnRlZCBmb3IgSC1JOwkvLyBDb21wYXRpYmlsaXR5IGZvciBIU0kgSS9GCisjZW5kaWYgLy8gSENGX0NGR19IU0lfMl9UT1AgLyBIQ0ZfQ0ZHX0hTSV8yX0JPVFRPTQorCisjaWYgZGVmaW5lZCBIQ0ZfQ0ZHX0hTSV8zX1RPUCB8fCBkZWZpbmVkIEhDRl9DRkdfSFNJXzNfQk9UVE9NCitlcnI6IEhTSV8zIG5vdCBzdXBwb3J0ZWQgZm9yIEgtSTsJLy8gQ29tcGF0aWJpbGl0eSBmb3IgSFNJIEkvRgorI2VuZGlmIC8vIEhDRl9DRkdfSFNJXzNfVE9QIC8gSENGX0NGR19IU0lfM19CT1RUT00KKworI2lmZGVmIEhDRl9DRkdfSFNJXzRfVE9QIAkJCQkJCQkJCS8vIFRvcCBDb21wYXRpYmlsaXR5IGZvciBIU0kgSS9GCisjaWYgSENGX0NGR19IU0lfNF9UT1AgPT0gMCB8fCBcCisJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV80X0JPVFRPTSA8PSBDRl9DRkdfSFNJXzRfVE9QICYmIEhDRl9DRkdfSFNJXzRfVE9QIDw9IENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9UT1AKKyN1bmRlZiBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfVE9QCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9UT1AJSENGX0NGR19IU0lfNF9UT1AKKyNlbHNlCitlcnI6IDsKKyNlbmRpZgorI2VuZGlmIC8vIEhDRl9DRkdfSFNJXzRfVE9QCisKKyNpZmRlZiBIQ0ZfQ0ZHX0hTSV80X0JPVFRPTQkJCQkJCQkJLy8gQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIEhTSSBJL0YKKyNpZiBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfQk9UVE9NIDw9IEhDRl9DRkdfSFNJXzRfQk9UVE9NICYmIEhDRl9DRkdfSFNJXzRfQk9UVE9NIDw9IENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9UT1AKKyN1bmRlZiBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfQk9UVE9NCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9CT1RUT00JSENGX0NGR19IU0lfNF9CT1RUT00KKyNlbHNlCitlcnI6IDsKKyNlbmRpZgorI2VuZGlmIC8vIEhDRl9DRkdfSFNJXzRfQk9UVE9NCisKKyNpZmRlZiBIQ0ZfQ0ZHX0hTSV81X1RPUCAJCQkJCQkJCQkvLyBUb3AgQ29tcGF0aWJpbGl0eSBmb3IgSFNJIEkvRgorI2lmIEhDRl9DRkdfSFNJXzVfVE9QID09IDAgfHwgXAorCUNGR19EUlZfQUNUX1JBTkdFU19IU0lfNV9CT1RUT00gPD0gQ0ZfQ0ZHX0hTSV81X1RPUCAmJiBIQ0ZfQ0ZHX0hTSV81X1RPUCA8PSBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfVE9QCisjdW5kZWYgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X1RPUAorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfVE9QCUhDRl9DRkdfSFNJXzVfVE9QCisjZWxzZQorZXJyOiA7CisjZW5kaWYKKyNlbmRpZiAvLyBIQ0ZfQ0ZHX0hTSV81X1RPUAorCisjaWZkZWYgSENGX0NGR19IU0lfNV9CT1RUT00JCQkJCQkJCS8vIEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBIU0kgSS9GCisjaWYgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X0JPVFRPTSA8PSBIQ0ZfQ0ZHX0hTSV81X0JPVFRPTSAmJiBIQ0ZfQ0ZHX0hTSV81X0JPVFRPTSA8PSBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfVE9QCisjdW5kZWYgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X0JPVFRPTQorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfQk9UVE9NCUhDRl9DRkdfSFNJXzVfQk9UVE9NCisjZWxzZQorZXJyOiA7CisjZW5kaWYKKyNlbmRpZiAvLyBIQ0ZfQ0ZHX0hTSV81X0JPVFRPTQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiBkZWZpbmVkIEhDRl9DRkdfQVBGXzFfVE9QIHx8IGRlZmluZWQgSENGX0NGR19BUEZfMV9CT1RUT00KK2VycjogQVBGXzEgbm90IHN1cHBvcnRlZCBmb3IgSC1JOwkvLyBDb21wYXRpYmlsaXR5IGZvciBBUCBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNlbmRpZiAvLyBIQ0ZfQ0ZHX0FQRl8xX1RPUCAvIEhDRl9DRkdfQVBGXzFfQk9UVE9NCisKKyNpZmRlZiBIQ0ZfQ0ZHX0FQRl8yX1RPUCAgICAgICAgICAgICAgICAgIAkJCQkJLy8gVG9wIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2lmIEhDRl9DRkdfQVBGXzJfVE9QID09IDAgfHwgXAorCUNGR19EUlZfQUNUX1JBTkdFU19BUEZfMl9CT1RUT00gPD0gSENGX0NGR19BUEZfMl9UT1AgJiYgSENGX0NGR19BUEZfMl9UT1AgPD0gQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX1RPUAorI3VuZGVmIENGR19EUlZfQUNUX1JBTkdFU19BUEZfMl9UT1AKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX1RPUAlIQ0ZfQ0ZHX0FQRl8yX1RPUAorI2Vsc2UKK2VycjogOworI2VuZGlmCisjZW5kaWYgLy8gSENGX0NGR19BUEZfVE9QCisKKyNpZmRlZiBIQ0ZfQ0ZHX0FQRl8yX0JPVFRPTSAgICAgICAgICAgICAgICAgICAgICAgCQkJLy8gQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2lmIENGR19EUlZfQUNUX1JBTkdFU19BUEZfMl9CT1RUT00gPD0gSENGX0NGR19BUEZfMl9CT1RUT00gJiYgSENGX0NGR19BUEZfMl9CT1RUT00gPD0gQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX1RPUAorI3VuZGVmIENGR19EUlZfQUNUX1JBTkdFU19BUEZfMl9CT1RUT00KKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX0JPVFRPTQlIQ0ZfQ0ZHX0FQRl8yX0JPVFRPTQorI2Vsc2UKK2VycjogOworI2VuZGlmCisjZW5kaWYgLy8gSENGX0NGR19BUEZfQk9UVE9NCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgZGVmaW5lZCBIQ0ZfQ0ZHX1NUQV8xX1RPUCB8fCBkZWZpbmVkIEhDRl9DRkdfU1RBXzFfQk9UVE9NCitlcnI6IFNUQV8xIG5vdCBzdXBwb3J0ZWQgZm9yIEgtSTsJLy8gQ29tcGF0aWJpbGl0eSBmb3IgU3RhdGlvbiBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNlbmRpZiAvLyBIQ0ZfQ0ZHX1NUQV8xX1RPUCAvIEhDRl9DRkdfU1RBXzFfQk9UVE9NCisKKyNpZmRlZiBIQ0ZfQ0ZHX1NUQV8yX1RPUCAgICAgICAgICAgICAgICAgIAkJCQkJLy8gVG9wIENvbXBhdGliaWxpdHkgZm9yIFN0YXRpb24gRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjaWYgSENGX0NGR19TVEFfMl9UT1AgPT0gMCB8fCBcCisJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX0JPVFRPTSA8PSBIQ0ZfQ0ZHX1NUQV8yX1RPUCAmJiBIQ0ZfQ0ZHX1NUQV8yX1RPUCA8PSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfVE9QCisjdW5kZWYgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX1RPUAorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfVE9QCUhDRl9DRkdfU1RBXzJfVE9QCisjZWxzZQorZXJyOiA7CisjZW5kaWYKKyNlbmRpZiAvLyBIQ0ZfQ0ZHX1NUQV9UT1AKKworI2lmZGVmIEhDRl9DRkdfU1RBXzJfQk9UVE9NICAgICAgICAgICAgICAgICAgICAgICAJCQkvLyBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgU3RhdGlvbiBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNpZiBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfQk9UVE9NIDw9IEhDRl9DRkdfU1RBXzJfQk9UVE9NICYmIEhDRl9DRkdfU1RBXzJfQk9UVE9NIDw9IENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9UT1AKKyN1bmRlZiBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfQk9UVE9NCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9CT1RUT00JSENGX0NGR19TVEFfMl9CT1RUT00KKyNlbHNlCitlcnI6IDsKKyNlbmRpZgorI2VuZGlmIC8vIEhDRl9DRkdfU1RBX0JPVFRPTQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1BQ1JPUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogbWluIGFuZCBtYXggbWFjcm9zICovCisjaWYgISBkZWZpbmVkIG1heAorI2RlZmluZSBtYXgoYSxiKSAgCQkoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCisjZW5kaWYKKyNpZiAhIGRlZmluZWQgbWluCisjZGVmaW5lIG1pbihhLGIpICAJCSgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKyNlbmRpZgorCisjaWZkZWYgSENGX1NMRUVQCisjaWYgZGVmaW5lZCBNU0ZfV0FJVAorZXJyOiBNU0Ygc2hvdWxkIG5vIGxvbmdlciBzdXBwbHkgdGhpcyBtYWNybzsKKyNlbHNlCisjZGVmaW5lIE1TRl9XQUlUKHgpIAkJCQkJCQkJCQkJCQkJCQkJCQlcCisJeyBQUk9UX0NOVF9JTkkJCQkJCQkJCQkJCQkJCVwKKwkJSENGX1dBSVRfV0hJTEUoICggSVBXKCBIUkVHX0lPICkgJiBIUkVHX0lPX1dPS0VOX1VQICkgPT0gMCApOwkJCQkJCVwKKwkJSENGQVNTRVJUKCBwcm90X2NudCwgSVBXKCBIUkVHX0lPICkgKQkJCQkJCQlcCisJfQorI2VuZGlmIC8vIE1TRl9XQUlUCisjZWxzZQorI2RlZmluZSBNU0ZfV0FJVCh4KQkvKk5PUCovCisjZW5kaWYgLy8gSENGX1NMRUVQCisKKyNkZWZpbmUgTE9GKHgpIAkJCShzaXplb2YoeCkvc2l6ZW9mKGhjZl8xNiktMSkKKworI2RlZmluZSBNVUxfQllfMiggeCApCSggKHgpIDw8IDEgKQkJCQkJCS8vdXNlZCB0byBtdWx0aXBseSBieSAyCisjZGVmaW5lIERJVl9CWV8yKCB4ICkJKCAoeCkgPj4gMSApCQkJCQkJLy91c2VkIHRvIGRpdmlkZSBieSAyCisKKy8vcmVzb2x2ZSBwcm9ibGVtcyBvbiBmb3Igc29tZSAxNiBiaXRzIGNvbXBpbGVycyB0byBjcmVhdGUgMzIgYml0IHZhbHVlcworI2RlZmluZSBNRVJHRV8yKCBodywgbHcgKQkoICggKChoY2ZfMzIpKGh3KSkgPDwgMTYgKSB8ICgoaGNmXzE2KShsdykpICkKKworI2lmICEgZGVmaW5lZCBIQ0ZfU1RBVElDCisjZGVmaW5lCQkgIEhDRl9TVEFUSUMJc3RhdGljCisjZW5kaWYgLy8JICBIQ0ZfU1RBVElDCisKKyNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1ICkgPT0gMAorI2RlZmluZSBEQVdBX0FDSyggbWFzaykgewkJCQkJCQkJCQkJCQlcCisJT1BXKCBIUkVHX0VWX0FDSywgbWFzayB8IEhSRUdfRVZfQUNLX1JFR19SRUFEWSApOwkJCQkJCVwKKwlPUFcoIEhSRUdfRVZfQUNLLCAobWFzayAmIH5IUkVHX0VWX0FMTE9DKSB8IEhSRUdfRVZfQUNLX1JFR19SRUFEWSApOyAJfQorI2RlZmluZSBEQVdBX1pFUk9fRklEKHJlZykgT1BXKCByZWcsIDAgKTsKKyNlbHNlCisjZGVmaW5lIERBV0FfQUNLKCBtYXNrKSAgIE9QVyggSFJFR19FVl9BQ0ssIG1hc2sgKTsKKyNkZWZpbmUgREFXQV9aRVJPX0ZJRChyZWcpCisjZW5kaWYgLy8gSENGX1RZUEVfSElJNQorCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQorI2RlZmluZQlDQUxDX1JYX01JQyggcCwgbGVuICkgY2FsY19taWNfcnhfZnJhZyggaWZicCwgcCwgbGVuICkKKyNkZWZpbmUJQ0FMQ19UWF9NSUMoIHAsIGxlbiApIGNhbGNfbWljX3R4X2ZyYWcoIGlmYnAsIHAsIGxlbiApCisjZGVmaW5lIElGX1NTTih4KSAgeAorI2RlZmluZSBJRl9OT1RfU1NOKHgpCisjZWxzZQorI2RlZmluZQlDQUxDX1JYX01JQyggcCwgbGVuICkKKyNkZWZpbmUJQ0FMQ19UWF9NSUMoIHAsIGxlbiApCisjZGVmaW5lIE1JQ19SWF9SVE4oIG1pYywgZHcgKQorI2RlZmluZSBNSUNfVFhfUlROKCBtaWMsIGR3ICkKKyNkZWZpbmUgSUZfU1NOKHgpCisjZGVmaW5lIElGX05PVF9TU04oeCkgeAorI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQorCisjaWYgSENGX1RBTExJRVMgJiBIQ0ZfVEFMTElFU19IQ0YJCS8vSENGIHRhbGx5IHN1cHBvcnQKKyNkZWZpbmUgSUZfVEFMTFkoeCkgIHgKKyNlbHNlCisjZGVmaW5lIElGX1RBTExZKHgpCisjZW5kaWYgLy8gSENGX1RBTExJRVNfSENGCisKKworI2lmIEhDRl9ETUEKKyNkZWZpbmUgSUZfRE1BKHgpCQkJeAorI2RlZmluZSBJRl9OT1RfRE1BKHgpCisjZGVmaW5lIElGX1VTRV9ETUEoeCkgCQlpZiAoICAgaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BICApIHgKKyNkZWZpbmUgSUZfTk9UX1VTRV9ETUEoeCkJaWYgKCAhKGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSkgKSB4CisjZWxzZQorI2RlZmluZSBJRl9ETUEoeCkKKyNkZWZpbmUgSUZfTk9UX0RNQSh4KQkJeAorI2RlZmluZSBJRl9VU0VfRE1BKHgpCisjZGVmaW5lIElGX05PVF9VU0VfRE1BKHgpIAl4CisjZW5kaWYgLy8gSENGX0RNQQorCisKKyNkZWZpbmUgSVBXKHgpICgoaGNmXzE2KUlOX1BPUlRfV09SRCggaWZicC0+SUZCX0lPQmFzZSArICh4KSApICkKKyNkZWZpbmUgT1BXKHgsIHkpIE9VVF9QT1JUX1dPUkQoIGlmYnAtPklGQl9JT0Jhc2UgKyAoeCksIHkgKQorCS8qIG1ha2Ugc3VyZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgSENGX1dBSVRfV0hJTEUgaXMgc3VjaCB0aGF0IHRoZXJlIG1heSBiZSBtdWx0aXBsZSBIQ0ZfV0FJVF9XSElMRSBjYWxscworCSAqIGluIGEgcm93IGFuZCB0aGF0IHdoZW4gb25lIGZhaWxzIGFsbCBzdWJzZXF1ZW50IGZhaWwgaW1tZWRpYXRlbHkgd2l0aG91dCByZWluaXRpYWxpemF0aW9uIG9mIHByb3RfY250CisJICovCisjaWYgSENGX1BST1RfVElNRSA9PSAwCisjZGVmaW5lIFBST1RfQ05UX0lOSQorI2RlZmluZSBJRl9QUk9UX1RJTUUoeCkKKyNpZiBkZWZpbmVkIEhDRl9ZSUVMRAorI2RlZmluZSBIQ0ZfV0FJVF9XSElMRSggeCApIHdoaWxlICggKHgpICYmIChIQ0ZfWUlFTEQpICkgLypOT1AqLzsKKyNlbHNlCisjZGVmaW5lIEhDRl9XQUlUX1dISUxFKCB4ICkgd2hpbGUgKCB4ICkgLypOT1AqLzsKKyNlbmRpZiAvLyBIQ0ZfWUlFTEQKKyNlbHNlCisjZGVmaW5lIFBST1RfQ05UX0lOSSAJaGNmXzMyIHByb3RfY250ID0gaWZicC0+SUZCX1RpY2tJbmk7CisjZGVmaW5lIElGX1BST1RfVElNRSh4KQl4CisjaWYgZGVmaW5lZCBIQ0ZfWUlFTEQKKyNkZWZpbmUgSENGX1dBSVRfV0hJTEUoIHggKSB3aGlsZSAoIHByb3RfY250ICYmICh4KSAmJiAoSENGX1lJRUxEKSApIHByb3RfY250LS07CisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjZGVmaW5lIEhDRl9XQUlUX1dISUxFKCB4ICkgd2hpbGUgKCBwcm90X2NudCAmJiAoeCkgKSB7IHVkZWxheSgyKTsgcHJvdF9jbnQtLTsgfQorI2VuZGlmIC8vIEhDRl9ZSUVMRAorI2VuZGlmIC8vIEhDRl9QUk9UX1RJTUUKKworI2lmIGRlZmluZWQgSENGX0VYX0lOVAorLy8jaWYgSENGX0VYX0lOVCAmIH4oIEhDRl9FWF9JTlRfVFhfRVggfCBIQ0ZfRVhfSU5UX1RYX09LIHwgSENGX0VYX0lOVF9USUNLICkKKzs/IG91dCBkYXRlZCBjaGVja2luZworZXJyOiB5b3UgdXNlZCBhbiBpbnZhbGlkIGJpdG1hc2s7CisvLyAjZW5kaWYgLy8gSENGX0VYX0lOVCB2YWxpZGF0aW9uCisvLyAjZWxzZQorLy8gI2RlZmluZSBIQ0ZfRVhfSU5UIDB4MDAwCisjZW5kaWYgLy8gSENGX0VYX0lOVAorCisjaWYgMCAvL2dldCBjb21waWxlciBnb2luZworI2lmIEhDRl9FWF9JTlRfVElDSwkhPSBIUkVHX0VWX1RJQ0sKKzs/IG91dCBkYXRlZCBjaGVja2luZworZXJyOiBzb21lb25lIHJlZGVmaW5lZCB0aGVzZSBtYWNyb3Mgd2hpbGUgdGhlIGltcGxlbWVuYXRpb24gYXNzdW1lcyB0aGV5IGFyZSBlcXVhbDsKKyNlbmRpZgorI2lmIEhDRl9FWF9JTlRfVFhfT0sgIT0gSEZTX1RYX0NOVExfVFhfT0sgfHwgSEZTX1RYX0NOVExfVFhfT0sgIT0gSFJFR19FVl9UWF9PSworOz8gb3V0IGRhdGVkIGNoZWNraW5nCitlcnI6IHNvbWVvbmUgcmVkZWZpbmVkIHRoZXNlIG1hY3JvcyB3aGlsZSB0aGUgaW1wbGVtZW5hdGlvbiBhc3N1bWVzIHRoZXkgYXJlIGVxdWFsOworI2VuZGlmCisjaWYgSENGX0VYX0lOVF9UWF9FWCAhPSBIRlNfVFhfQ05UTF9UWF9FWCB8fCBIRlNfVFhfQ05UTF9UWF9FWCAhPSBIUkVHX0VWX1RYX0VYCis7PyBvdXQgZGF0ZWQgY2hlY2tpbmcKK2Vycjogc29tZW9uZSByZWRlZmluZWQgdGhlc2UgbWFjcm9zIHdoaWxlIHRoZSBpbXBsZW1lbmF0aW9uIGFzc3VtZXMgdGhleSBhcmUgZXF1YWw7CisjZW5kaWYKKyNlbmRpZiAvLyAwIGdldCBjb21waWxlciBnb2luZworCisKKy8qIFRoZSBhc3NlcnQgaW4gSENGTE9HRU5UUlkgY2hlY2tzIGFnYWluc3QgcmUtZW50cmFuY3kuIFJlLWVudHJhbmN5IGNvdWxkIGJlIGNhdXNlZCBieSBNU0YgbG9naWMgYXQKKyAqIHRhc2stbGV2ZWwgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgc2hpZWxkaW5nIHdpdGggSENGX0FDVF9PTi9fT0ZGLiBXaGVuIGFuIGludGVycnVwdCBvY2N1cnMsCisgKiB0aGUgSVNSIGNvdWxkIChlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgY2F1c2UgcmUtZW50ZXJpbmcgb2YgdGhlIGludGVycnVwdGVkIEhDRi1yb3V0aW5lLgorICoKKyAqIFRoZSAiKGlmYnAtPklGQl9Bc3NlcnRXaGVyZSA9IHdoZXJlKSIgdGVzdCBpbiBIQ0ZMT0dFTlRSWSBzZXJ2aWNlcyBBTFNPIGFzIGEgc3RhdGVtZW50IHRvIGdldCBhcm91bmQ6CisgKiAjcHJhZ21hIHdhcm5pbmc6IGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgY29uc3RhbnQKKyAqIG9uIHRoZSBpZi1zdGF0ZW1lbnQKKyAqLworI2lmIEhDRl9BU1NFUlQKKyNkZWZpbmUgSENGQVNTRVJUKHgscSkge2lmICghKHgpKSB7bWRkX2Fzc2VydCggICAgICAgIGlmYnAsIF9fTElORV9fICAgICAgICAgICAgICAgICAgICwgcSApO319CisjZGVmaW5lIE1NREFTU0VSVCh4LHEpIHtpZiAoISh4KSkge21kZF9hc3NlcnQoIGFzc2VydF9pZmJwLCBfX0xJTkVfXyArIEZJTEVfTkFNRV9PRkZTRVQsIHEgKTt9fQorCisjZGVmaW5lIEhDRkxPR0VOVFJZKCB3aGVyZSwgd2hhdCApIAkJCQkJCQkJCQkJCQkJXAore2lmICggKGlmYnAtPklGQl9Bc3NlcnRXaGVyZSA9IHdoZXJlKSA8PSAxNSApIHsJCQkJCQkJCQkJCVwKKwlIQ0ZfRU5UUlkoIGlmYnAgKTsgCQkJCQkJCQkJCQkJCQkJCQlcCisJSENGQVNTRVJUKCAoaWZicC0+SUZCX0Fzc2VydFRyYWNlICYgMTw8KCh3aGVyZSkmMHhGKSkgPT0gMCwgaWZicC0+SUZCX0Fzc2VydFRyYWNlICk7CQlcCisJaWZicC0+SUZCX0Fzc2VydFRyYWNlIHw9IDE8PCgod2hlcmUpJjB4Rik7CQkJCQkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQkJCQkJCQkJCQlcCitIQ0ZUUkFDRShpZmJwLCB3aGVyZSApCQkJCQkJCQkJCQkJCQkJCQlcCitIQ0ZUUkFDRVZBTFVFKGlmYnAsIHdoYXQgKQkJCQkJCQkJCQkJCQkJCQlcCit9CisKKyNkZWZpbmUgSENGTE9HRVhJVCggd2hlcmUgKSAJCQkJCQkJCQkJCQkJCQlcCit7aWYgKCAoaWZicC0+SUZCX0Fzc2VydFdoZXJlID0gd2hlcmUpIDw9IDE1ICkgewkJCQkJCQkJCQkJXAorICAJSENGX0VYSVQoIGlmYnAgKTsgCQkJCQkJCQkJCQkJCQkJCQlcCisJaWZicC0+SUZCX0Fzc2VydFRyYWNlICY9IH4oMTw8KCh3aGVyZSkmMHhGKSk7CQkJCQkJCQkJCQkJXAorCX0JCQkJCQkgCQkJCQkJCQkJCQkJCQkJXAorSENGVFJBQ0UoaWZicCwgKHdoZXJlKXxIQ0ZfVFJBQ0VfRVhJVCApCQkJCQkJCQkJCQkJCVwKK30KKworI2Vsc2UgLy8gSENGX0FTU0VSVAorI2RlZmluZSBIQ0ZBU1NFUlQoIHgsIHEgKQorI2RlZmluZSBNTURBU1NFUlQoIHgsIHEgKQorI2RlZmluZSBIQ0ZMT0dFTlRSWSggd2hlcmUsIHdoYXQgKSAJICAJe0hDRl9FTlRSWSggaWZicCApO30KKyNkZWZpbmUgSENGTE9HRVhJVCggd2hlcmUgKSAJCSAgCXtIQ0ZfRVhJVCggaWZicCApO30KKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUCisKKyNpZiBIQ0ZfSU5UX09OCisvKiA7PyBIQ0ZBU1NFUlRfSU5UCisgKiAjaWYgKEhDRl9TTEVFUCkgJiBIQ0ZfRERTCisgKiAjZGVmaW5lIEhDRkFTU0VSVF9JTlQgSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250ICE9IDB4RkZGRiAmJiBpZmJwLT5JRkJfSW50T2ZmQ250ICE9IDB4RkZGRSwgXAorICogCQkJCQkJCQkgaWZicC0+SUZCX0ludE9mZkNudCApCisgKiAjZWxzZQorICovCisjZGVmaW5lIEhDRkFTU0VSVF9JTlQgSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250ICE9IDB4RkZGRiwgaWZicC0+SUZCX0ludE9mZkNudCApCisvLyAjZW5kaWYgLy8gSENGX0REUworI2Vsc2UKKyNkZWZpbmUgSENGQVNTRVJUX0lOVAorI2VuZGlmIC8vIEhDRl9JTlRfT04KKworCisjaWYgZGVmaW5lZCBIQ0ZfVFJBQ0UKKyNkZWZpbmUgSENGVFJBQ0UoaWZicCwgd2hlcmUgKQkgICB7T1BXKCBIUkVHX1NXXzEsIHdoZXJlICk7fQorLy8jZGVmaW5lIEhDRlRSQUNFKGlmYnAsIHdoZXJlICkJICAge0hDRkFTU0VSVCggRE9fQVNTRVJULCB3aGVyZSApO30KKyNkZWZpbmUgSENGVFJBQ0VWQUxVRShpZmJwLCB3aGF0ICkge09QVyggSFJFR19TV18yLCB3aGF0ICApO30KKy8vI2RlZmluZSBIQ0ZUUkFDRVZBTFVFKGlmYnAsIHdoYXQgKSB7SENGQVNTRVJUKCBET19BU1NFUlQsIHdoYXQgICk7fQorI2Vsc2UKKyNkZWZpbmUgSENGVFJBQ0UoaWZicCwgd2hlcmUgKQorI2RlZmluZSBIQ0ZUUkFDRVZBTFVFKGlmYnAsIHdoYXQgKQorI2VuZGlmIC8vIEhDRl9UUkFDRQorCisKKyNpZiBIQ0ZfQklHX0VORElBTgorI2RlZmluZSBCRV9QQVIoeCkJCQkJLHgKKyNlbHNlCisjZGVmaW5lIEJFX1BBUih4KQorI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIEVORCBPRiBNQUNST1MgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFBST1RPVFlQRVMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgSENGX0FTU0VSVAorZXh0ZXJuIElGQlAgQkFTRUQgYXNzZXJ0X2lmYnA7CQkJLy90byBtYWtlIGFzc2VydHMgZWFzaWx5IHdvcmsgdW5kZXIgTU1EIGFuZCBESEYKK0VYVEVSTl9DIHZvaWQJCSBtZGRfYXNzZXJ0CQkJKElGQlAgaWZicCwgdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyLCBoY2ZfMzIgcSApOworI2VuZGlmIC8vSENGX0FTU0VSVAorCisjaWYgISAoIChIQ0ZfSU8pICYgSENGX0lPXzMyQklUUyApCQkJCS8vIGRlZmluZWQgMTYgYml0cyBvbmx5CisjdW5kZWYgT1VUX1BPUlRfU1RSSU5HXzMyCisjdW5kZWYgSU5fUE9SVF9TVFJJTkdfMzIKKyNlbmRpZiAvLyBIQ0ZfSU8KKyNlbmRpZgkvL0hDRkRFRkNfSAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9tYW4vd2xhZ3M0OS40IGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvbWFuL3dsYWdzNDkuNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzQ1ODg1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvbWFuL3dsYWdzNDkuNApAQCAtMCwwICsxLDczNCBAQAorLlwiIHZpbTp0dz03ODoKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4gLS0gaHR0cDovL3d3dy5hZ2VyZS5jb20KKy5cIiB3bGFnczQ5LjQgNy4yMC1hYmcgMDQvMjgvMjAwNCAxMzozMDowMAorLlwiCisuVEggV0xBR1M0OSA0ICIwNC8yOC8yMDA0IDEzOjMwOjAwIiAicGNtY2lhLWNzIgorLlNIIE5BTUUKK3dsYWdzNDkgXC0gQWdlcmUgU3lzdGVtcyBXaXJlbGVzcyBQQyBDYXJkIC8gUENJIGRldmljZSBkcml2ZXJzCisKK3dsYWdzNDlfaDJfY3MubyBcLSBIZXJtZXMtSUkgQ2FyZCBTZXJ2aWNlcyAoUENNQ0lBL0NGKSBkcml2ZXIKKy5icgord2xhZ3M0OV9oMi5vICAgIFwtIEhlcm1lcy1JSSBNaW5pUENJIGRyaXZlcgorLmJyCit3bGFnczQ5X2gyNS5vICAgXC0gSGVybWVzLUlJLjUgUENJL0NhcmRCdXMgZHJpdmVyCisuYnIKK3dsYWdzNDlfaDI1X2NzLm9cLSBIZXJtZXMtSUkuNSBDYXJkIFNlcnZpY2VzIChQQ01DSUEvQ0YpIGRyaXZlcgorCisuU0ggU1lOT1BTSVMKKy5uaAorLmZpCisuQiBpbnNtb2Qgd2xhZ3M0OV9baDEsaDJdX1tjc10ubworLmJyCisuUkIgWyBBdXRoZW50aWNhdGlvbj1uIF0KKy5SQiBbIEF1dGhLZXlNbmdtdFN1aXRlPT8/Pz8gXQorLlJCIFsgQlJTQzJHSHo9YiBdXHAKKy5SQiBbIEJSU0M1R0h6PWIgXQorLlJCIFsgQ29leGlzdGVuY2U9biBdCisuUkIgWyBDb25maWd1cmVkPT8/Pz8gXVxwCisuUkIgWyBDb25uZWN0aW9uQ29udHJvbD0/Pz8/IF0KKy5SQiBbIENyZWF0ZUlCU1M9cyBdCisuUkIgWyBEZWJ1Z0ZsYWc9biBdXHAKKy5SQiBbIERlc2lyZWRTU0lEPXMgXQorLlJCIFsgRG93bmxvYWRGaXJtd2FyZT1uIF0KKy5SQiBbIERyaXZlckVuYWJsZT0/Pz8/IF1ccAorLlJCIFsgRW5hYmxlRW5jcnlwdGlvbj1zIF0KKy5SQiBbIEVuY3J5cHRpb249Pz8/PyBdCisuUkIgWyBFeGNsdWRlVW5lbmNyeXB0ZWQ9cyBdXHAKKy5SQiBbIEludHJhQlNTUmVsYXk9cyBdCisuUkIgWyBJcnFMaXN0PWksaiwuLi4gXQorLlJCIFsgSXJxTWFzaz1uIF1ccAorLlJCIFsgS2V5MT1zIF0KKy5SQiBbIEtleTI9cyBdCisuUkIgWyBLZXkzPXMgXQorLlJCIFsgS2V5ND1zIF1ccAorLlJCIFsgTG9hZEJhbGFuY2luZz1zIF0KKy5SQiBbIE1heFNsZWVwRHVyYXRpb249biBdCisuUkIgWyBNZWRpdW1EaXN0cmlidXRpb249cyBdXHAKKy5SQiBbIE1pY3JvV2F2ZVJvYnVzdG5lc3M9cyBdCisuUkIgWyBNdWx0aWNhc3RQTUJ1ZmZlcmluZz1zIF0KKy5SQiBbIE11bHRpY2FzdFJhdGU9biBdXHAKKy5SQiBbIE11bHRpY2FzdFJlY2VpdmU9cyBdCisuUkIgWyBOZXR3b3JrQWRkcmVzcz1uLG4sbixuLG4sbiBdCisuUkIgWyBOZXR3b3JrVHlwZT0/Pz8/IF1ccAorLlJCIFsgT3duQVRJTVdpbmRvdz1uIF0KKy5SQiBbIE93bkJlYWNvbkludGVydmFsPW4gXQorLlJCIFsgT3duQ2hhbm5lbD1uIF1ccAorLlJCIFsgT3duRFRJTVBlcmlvZD1uIF0KKy5SQiBbIE93bk5hbWU9cyBdCisuUkIgWyBPd25TU0lEPXMgXVxwCisuUkIgWyBwY19kZWJ1Zz1uIF0KKy5SQiBbIFBNRW5hYmxlZD1iIF0KKy5SQiBbIFBNSG9sZG92ZXJEdXJhdGlvbj1uIF1ccAorLlJCIFsgUG9ydFR5cGU9biBdCisuUkIgWyBQb3dlck1vZGU9Pz8/PyBdCisuUkIgWyBQcm9taXNjdW91c01vZGU9cyBdXHAKKy5SQiBbIFJlamVjdEFOWT1zIF0KKy5SQiBbIFJUU1RocmVzaG9sZD1uIF1ccAorLlJCIFsgUlRTVGhyZXNob2xkMT1uIF0KKy5SQiBbIFJUU1RocmVzaG9sZDI9biBdCisuUkIgWyBSVFNUaHJlc2hvbGQzPW4gXVxwCisuUkIgWyBSVFNUaHJlc2hvbGQ0PW4gXQorLlJCIFsgUlRTVGhyZXNob2xkNT1uIF0KKy5SQiBbIFJUU1RocmVzaG9sZDY9biBdXHAKKy5SQiBbIFNSU0MyR0h6PWIgXQorLlJCIFsgU1JTQzVHSHo9YiBdCisuUkIgWyBTeXN0ZW1TY2FsZT1uIF1ccAorLlJCIFsgVHhLZXk9biBdCisuUkIgWyBUeFJhdGVDb250cm9sPW4gXVxwCisuUkIgWyBUeFJhdGVDb250cm9sMT1uIF0KKy5SQiBbIFR4UmF0ZUNvbnRyb2wyPW4gXQorLlJCIFsgVHhSYXRlQ29udHJvbDM9biBdXHAKKy5SQiBbIFR4UmF0ZUNvbnRyb2w0PW4gXQorLlJCIFsgVHhSYXRlQ29udHJvbDU9biBdCisuUkIgWyBUeFJhdGVDb250cm9sNj1uIF1ccAorLlJCIFsgV0RTQWRkcmVzcz1uLG4sbixuLG4sbiBdXHAKKy5SQiBbIFdEU0FkZHJlc3MxPW4sbixuLG4sbixuIF0KKy5SQiBbIFdEU0FkZHJlc3MyPW4sbixuLG4sbixuIF1ccAorLlJCIFsgV0RTQWRkcmVzczM9bixuLG4sbixuLG4gXQorLlJCIFsgV0RTQWRkcmVzczQ9bixuLG4sbixuLG4gXVxwCisuUkIgWyBXRFNBZGRyZXNzNT1uLG4sbixuLG4sbiBdCisuUkIgWyBXRFNBZGRyZXNzNj1uLG4sbixuLG4sbiBdXHAKKy5maQorCisKKworLlNIIERFU0NSSVBUSU9OCisuSSB3bGFnczQ5CitpcyB0aGUgbG93LWxldmVsIENhcmQgU2VydmljZXMgLyBQQ0kgZHJpdmVyIGZvciB0aGUKKy5CIFdpcmVsZXNzIFBDIENhcmQsIFdpcmVsZXNzIEludGVncmF0ZWQgQ2FyZCwgV2lyZWxlc3MgRW1iZWRkZWQgQ2FyZAorYW5kIG90aGVyIHdpcmVsZXNzIGFkYXB0ZXJzIGJhc2VkIG9uIHRoZSBBZ2VyZSBTeXN0ZW1zIEhlcm1lcy1JSSwgYW5kIEhlcm1lcy1JSS41IHdpcmVsZXNzIE1BQy4gV2hlbiB0aGlzIGRyaXZlciBpcyBhdHRhY2hlZCB0byBhIGNhcmQsIGl0CithbGxvY2F0ZXMgdGhlIG5leHQgYXZhaWxhYmxlIGV0aGVybmV0IGRldmljZSAoZXRoMC4uZXRoIykuIFRoaXMKK2RldmljZSBuYW1lIHdpbGwgYmUgcGFzc2VkIG9uIHRvCisuSVIgY2FyZG1nciAoOCksCitvciB0aGUgUENJIHN1YnN5c3RlbSwgZm9yIHRoZSBjYXJkIGNvbmZpZ3VyYXRpb24sIGFuZCByZXBvcnRlZCBpbiB0aGUga2VybmVsIGxvZyBmaWxlCit3aXRoIHRoZSBJL08gYmFzZSBhZGRyZXNzIGFuZCBNQUMgYWRkcmVzcyB1c2VkIGJ5IHRoZSBjYXJkLgorLlNIIEZFQVRVUkVTCisgXC0gSG90IHBsdWcvdW5wbHVnCisgXC0gQWNjZXNzIFBvaW50IGFuZCBwZWVyLXRvLXBlZXIgY29tbXVuaWNhdGlvbgorIFwtIENhcmQgcG93ZXIgbWFuYWdlbWVudAorIFwtIFN1cHBvcnQgZm9yIEhlcm1lcy1JSSAmIEhlcm1lcy1JSS41IGJhc2VkIFBDTUNJQSwgTWluaSBQQ0ksIGFuZCBDYXJkQnVzIGNhcmRzCisgXC0gV2lyZWQgRXF1aXZhbGVudCBQcml2YWN5IChXRVApCisgXC0gV1BBLVBTSyBzdXBwb3J0IChFWFBFUklNRU5UQUwpCisgXC0gRHJpdmVyIHV0aWxpdHkgaW50ZXJmYWNlIChVSUwpCisgXC0gV2lyZWxlc3MgRXh0ZW5zaW9ucworIFwtIFNvZnR3YXJlIEFQIG1vZGUKKy5TSCBQQVJBTUVURVJTCisuVFAKKy5CIEF1dGhlbnRpY2F0aW9uPW4KK0FsZ29yaXRobSB1c2VkIGZvciBBdXRoZW50aWNhdGlvbi4KKy5CUgorICAgIDEgXC0gT3BlbiBTeXN0ZW0KKy5CUgorICAgIDIgXC0gU2hhcmVkIEtleQorLkJSCisgICAgRGVmYXVsdDogMQorLlRQCisuQiBBdXRoX2tleV9tZ210X3N1aXRlCis/Pz8/Pz8/Pz8/Pz8/Pz8KKy5UUAorLkIgQlJTQzJHSHo9YgorU2V0cyB0aGUgY2FyZFwncyBCYXNpYyBSYXRlIFNldCBpbiB0aGUgMi40R0h6IGJhbmQuIFNlZSBTUlNDMkdIegorZm9yIHRoZSB2YWx1ZVwncyBmb3JtYXQuCisuQlIKKyAgICBEZWZhdWx0OiAxNSAob3IgMHgwMDBGLCBvbmx5IDExYiByYXRlcyB0byBhY2NlcHQgbGVnYWN5IDExYiBzdGF0aW9ucykKKy5UUAorLkIgQlJTQzVHSHotYgorU2V0cyB0aGUgY2FyZFwncyBCYXNpYyBSYXRlIFNldCBpbiB0aGUgNS4wR0h6IGJhbmQuIFNlZSBTUlNDMkdIeiBmb3IgdGhlCit2YWx1ZVwncyBmb3JtYXQKKy5CUgorICAgIERlZmF1bHQ6IDQwODAgKG9yIDB4MEZGMCwgYWxsIDExYSByYXRlcykKKy5UUAorLkIgQ29leGlzdGVuY2U9bgorVXNlZCB0byBtYWtlIHRoZSA4MDIuMTFhL2IvZyBjb2V4aXN0ZW5jZSBiZWhhdmlvciBtb3JlIHN0cmljdC4KKy5CUgorICAgIERlZmF1bHQgXC0gMCAoVXNlIHN0YW5kYXJkIGJlaGF2aW9yKQorLlRQCisuQiBDb25uZWN0aW9uQ29udHJvbD1uCitDb25maWd1cmVzIHRoZSBjYXJkXCdzIGNvbm5lY3Rpb24gY29udHJvbCBwcm9jZXNzIGluIGRlYWxpbmcgd2l0aCBtdWx0aXBsZQorYmFuZHMgKDgwMi4xMWIvZyB2cy4gODAyLjExYSkuCisuQlIKKyAgICAwIFwtIFNpbmdsZSBCYW5kIG9wZXJhdGlvbiBpbiAyR0h6CisuQlIKKyAgICAxIFwtIFNpbmdsZSBCYW5kIG9wZXJhdGlvbiBpbiA1R0h6CisuQlIKKyAgICAyIFwtIE11bHRpcGxlIEJhbmQgb3BlcmF0aW9uIHN0YXJ0aW5nIHdpdGggMkdIegorLkJSCisgICAgMyBcLSBNdWx0aXBsZSBCYW5kIG9wZXJhdGlvbiBzdGFydGluZyB3aXRoIDVHSHoKKy5CUgorICAgIERlZmF1bHQgXC0gMgorLlRQCisuQiBDb25maWd1cmVkCis/Pz8/Pz8/Pz8/Pz8/Pz8KKy5UUAorLkIgQ29ubmVjdGlvbkNvbnRyb2wKKz8/Pz8/Pz8/Pz8/Pz8/PworLlRQCisuQiBDcmVhdGVJQlNTPXMKK0VuYWJsZSBvciBkaXNhYmxlIElCU1MgQ3JlYXRpb24uCitGb3IgY29ycmVjdCBvcGVyYXRpb24sIHNwZWNpZmljYXRpb24gb2YgYSBPd25TU0lEIGlzIHJlcXVpcmVkLgorVGhpcyBtb2RlIHJlcXVpcmVzIGZpcm13YXJlIDYuMDQgb3IgaGlnaGVyLgorLkJSCisgICAgTiBcLSBEaXNhYmxlCisuQlIKKyAgICBZIFwtIEVuYWJsZQorLkJSCisgICAgRGVmYXVsdDogTgorLlRQCisuQiBEZWJ1Z0ZsYWc9bgorU2VsZWN0cyB0aGUgZHJpdmVyIGRlYnVnZ2luZyBsZXZlbC4gVGhpcyBwYXJhbWV0ZXIgaXMgb25seSBhdmFpbGFibGUKK2lmIHRoZSBtb2R1bGUgaXMgY29tcGlsZWQgd2l0aCBkZWJ1Z2dpbmcgZW5hYmxlZC4gUmVmZXIgdG8gdGhlCitmaWxlCisuQiBkZWJ1Zy5oCitpbiB0aGUgc291cmNlIGRpcmVjdG9yeSBmb3IgaW5mb3JtYXRpb24gb24gdGhlIGZsYWcgdmFsdWVzLgorLkJSCisgICAgMHgwMDAwMDAwMUwgXC0gREJHX0VSUk9SX09OCisuQlIKKyAgICAweDAwMDAwMDAyTCBcLSBEQkdfV0FSTklOR19PTgorLkJSCisgICAgMHgwMDAwMDAwNEwgXC0gREJHX05PVElDRV9PTgorLkJSCisgICAgMHgwMDAwMDAwOEwgXC0gREJHX1RSQUNFX09OCisuQlIKKyAgICAweDAwMDAwMDEwTCBcLSBEQkdfVkVSQk9TRV9PTgorLkJSCisgICAgMHgwMDAwMDAyMEwgXC0gREJHX1BBUkFNX09OCisuQlIKKyAgICAweDAwMDAwMDQwTCBcLSBEQkdfQlJFQUtfT04KKy5CUgorICAgIDB4MDAwMDAxMDBMIFwtIERCR19SWF9PTgorLkJSCisgICAgMHgwMDAwMDIwMEwgXC0gREJHX1RYX09OCisuQlIKKyAgICAweDAwMDAwNDAwTCBcLSBEQkdfRFNfT04KKy5CUgorSWYgdGhlIG1vZHVsZSBpcyBjb21waWxlZCB3aXRoIGRlYnVnZ2luZyBlbmFibGVkLCBEZWJ1Z0ZsYWcKK2RlZmF1bHRzIHRvIERCR19FUlJPUl9PTiwgREJHX1dBUk5JTkdfT04gYW5kIERCR19CUkVBS19PTi4KK0RlYnVnRmxhZyBvdmVycnVsZXMgcGNfZGVidWcuCisuVFAKKy5CIERlc2lyZWRTU0lEPXMKK1NhbWUgYXMgT3duU1NJRC4KKy5UUAorLkIgRG93bmxvYWRGaXJtd2FyZT1uCitUaGlzIHJlbGVhc2Ugb2YgdGhlIGRyaXZlciBpbnRyb2R1Y2VzIHRoZSBhYmlsaXR5IHRvIHBlcmZvcm0gZG93bmxvYWRzIG9mIHRoZSBTVEEvQVAKK2Zpcm13YXJlLiBJbiBmYWN0LCB0aGlzIGlzIHJlcXVpcmVkIGZvciBIZXJtZXMtSUkgYmFzZWQgY2FyZHMuIFRoaXMgcGFyYW1ldGVyIHRlbGxzCit0aGUgZHJpdmVyIHdoaWNoIHZlcnNpb24gb2YgdGhlIGZpcm13YXJlIHRvIGRvd25sb2FkIHRvIHRoZSBjYXJkLgorLkJSCisgICAgMCBcLSBObyBkb3dubG9hZCBwZXJmb3JtZWQgKEhlcm1lcy1JIG9ubHkpCisuQlIKKyAgICAxIFwtIERvd25sb2FkIFNUQSBmaXJtd2FyZQorLkJSCisgICAgMiBcLSBEb3dubG9hZCBBUCBmaXJtd2FyZQorLkJSCisgICAgRGVmYXVsdDogMSwgd2hlbiBTVEEgbW9kZSBmdW5jdGlvbmFsaXR5IGlzCisgICAgICAgICAgICAgICAgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkCisgICAgICAgICAgICAgMiwgd2hlbiBjb2RlIGlzIGJ1aWx0IGV4Y2x1c2l2ZWx5IGZvcgorICAgICAgICAgICAgICAgIEFQIG1vZGUKKy5UUAorLkIgRHJpdmVyRW5hYmxlCis/Pz8/Pz8/Pz8/Pz8/Pz8KKy5UUAorLkIgRW5hYmxlRW5jcnlwdGlvbj1uCitTZXQgdGhlIG1ldGhvZCBvZiBEYXRhIGVuY3J5cHRpb24uCisuQlIKKyAgICAwIFwtIERpc2FibGUKKy5CUgorICAgIDEgXC0gRW5hYmxlIFdFUCBFbmNyeXB0aW9uCisuQlIKKyAgICAyIFwtIEVuYWJsZSBXUEEgd2l0aCBUS0lQIGVuY3J5cHRpb24KKy5CUgorICAgIERlZmF1bHQ6IDAKKy5UUAorLkIgRW5jcnlwdGlvbgorPz8/Pz8/Pz8/Pz8/Pz8/CisuVFAKKy5CIEV4Y2x1ZGVVbmVuY3J5cHRlZD1zCitDb250cm9scyBob3cgdGhlIHN0YXRpb25zIG11c3QgY29tbXVuaWNhdGUgd2l0aCB0aGUgQVAuCisuQlIKKyAgICBZIFwtIFN0YXRpb25zIG11c3QgZW5hYmxlIGVuY3J5cHRpb24gYW5kIHByb3ZpZGUKKyAgICAgICAgIHRoZSBwcm9wZXIgZW5jcnlwdGlvbiBrZXkgdG8gY29tbXVuaWNhdGUKKyAgICAgICAgIHdpdGggdGhlIEFQLgorLkJSCisgICAgTiBcLSBTdGF0aW9ucyBkbyBub3QgbmVlZCB0byBlbmFibGUgZW5jcnlwdGlvbgorICAgICAgICAgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgQVAuCisuQlIKKyAgICBEZWZhdWx0OiBOCisuVFAKKy5CIEludHJhQlNTUmVsYXk9cworQ29udHJvbHMgdGhlIGF1dG9tYXRpYyByZWxheSBvZiByZWNlaXZlZCBtZXNzYWdlcyB0aGF0IGFyZSBkZXN0aW5lZCBmb3Igb3RoZXIKK3N0YXRpb25zIGluIHRoZSBCU1MuCisuQlIKKyAgICBZIFwtIE1lc3NhZ2VzIGFyZSByZWxheWVkIHRvIHRoZSBhcHByb3ByaWF0ZQorICAgICAgICAgc3RhdGlvbihzKS4KKy5CUgorICAgIE4gXC0gTWVzc2FnZXMgYXJlIHBhc3NlZCB1cCB0byB0aGUgaG9zdC4KKy5CUgorICAgIERlZmF1bHQ6IFkKKy5UUAorLkIgSXJxTGlzdD1pLGosLi4uCitTcGVjaWZpZXMgdGhlIHNldCBvZiBpbnRlcnJ1cHRzICh1cCB0byA0KSB0aGF0IG1heSBiZSBhbGxvY2F0ZWQgYnkKK3RoaXMgZHJpdmVyLiBUaGlzIG92ZXJyaWRlcyB0aGUgdmFsdWVzIHNldCBpbiB0aGUKKy5CIElycU1hc2sKK3BhcmFtZXRlci4gTk9URTogVGhpcyBwYXJhbWV0ZXIgaXMgZm9yIFBDTUNJQSBvbmx5LgorLlRQCisuQiBJcnFNYXNrPW4KK1NwZWNpZmllcyBhIG1hc2sgb2YgdmFsaWQgaW50ZXJydXB0cyB0aGF0IG1heSBiZSBhbGxvY2F0ZWQgYnkgdGhpcyBkcml2ZXIuCitJZgorLkIgSXJxTGlzdAoraXMgYWxzbyBzcGVjaWZpZWQsIHRoZSB2YWx1ZXMgaW4KKy5CIElycUxpc3QKK2FyZSB1c2VkIGluc3RlYWQuIE5PVEU6IFRoaXMgcGFyYW1ldGVyIGlzIGZvciBQQ01DSUEgb25seS4KKy5CUgorICAgIERlZmF1bHQ6IDB4ZGViOCAoSVJRIDMsNCw1LDcsOSwxMCwxMSwxMiwxNCwxNSkKKy5UUAorLkIgS2V5MT1zCitTcGVjaWZpZXMgb25lIG9mIDQgcG9zc2libGUga2V5cyBmb3IgdGhlIERhdGEgZW5jcnlwdGlvbi4KK09uZSBvZiB0aGVzZSBrZXlzLCBpZGVudGlmaWVkIGJ5IFR4S2V5LAoraXMgdXNlZCBmb3IgdGhlIGVuY2lwaGVyaW5nIG9mIERhdGEgdGhhdCBpcyB0cmFuc21pdHRlZCBieSB0aGlzIHN0YXRpb24uCitBbGwga2V5cyBzcGVjaWZpZWQgY2FuIGJlIHVzZWQgZm9yIHRoZSBkZWNpcGhlcmluZyBvZiBEYXRhIHRoYXQgaXMgcmVjZWl2ZWQuCisuQlIKK1RoZSBrZXkgdmFsdWUgY2FuIGJlIGFuIEFTQ0lJIGNoYXJhY3RlciBzdHJpbmcgb3IgYSBoZXhhZGVjaW1hbCB2YWx1ZS4KK1RoZSBsZW5ndGggb2YgdGhlIGtleSB2YWx1ZSBjYW4gYmUgNSBjaGFyYWN0ZXJzIG9yIDEwIGhleGFkZWNpbWFsIGRpZ2l0cyBmb3IKK3RoZSBzdGFuZGFyZCBlbmNyeXB0aW9uIChTaWx2ZXIgb3IgR29sZCBjYXJkKSwgb3IgMTMgY2hhcmFjdGVycyBvciAyNgoraGV4YWRlY2ltYWwgZGlnaXRzIGZvciB0aGUgZW5jcnlwdGlvbiB3aXRoIGV4dGVuZGVkIGtleXMgKEdvbGQgY2FyZCBvbmx5KS4KK1RoZSBrZXlzIGRlZmluZWQgaW4gdGhlIHN0YXRpb24gbXVzdCBtYXRjaCB0aGUga2V5cyBkZWZpbmVkIGluIHRoZSBhY2Nlc3MKK3BvaW50czsgYm90aCBvbiB2YWx1ZSBhbmQgbnVtYmVyICgxIHRocm91Z2ggNCkuCisuQlIKK0luIDIuMCBzZXJpZXMgTGludXgga2VybmVsIG1vZHVsZXMsIHZhbHVlcyB0aGF0IGJlZ2luIHdpdGggYSBudW1iZXIgYXJlCitjb25zaWRlcmVkIGludGVnZXJzLiBJbiB0aGlzIGNhc2UgYSBoZXhhZGVjaW1hbCB2YWx1ZSBzdHJpbmcgb3IgYSBjaGFyYWN0ZXIKK3N0cmluZyBzdGFydGluZyB3aXRoIGEgbnVtYmVyLCB3aWxsIG5lZWQgdG8gYmUgc3Vycm91bmRlZCBieSBlc2NhcGVkCitkb3VibGUgcXVvdGVzIChpZS4gS2V5MT1cXCIweDExMjIzMzQ0NTVcXCIgS2V5Mj1cXCIxMnh5elxcIikuCisuQlIKKyAgICA1IG9yIDEzLCBwcmludGFibGUgY2hhcmFjdGVyIHN0cmluZywgb3IKKy5CUgorICAgIDEwIG9yIDI2IGhleCBkaWdpdHMgaWYgcHJlY2VkZWQgYnkgIjB4Ii4KKy5CUgorICAgIElmIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIHRoZSBkZWZhdWx0IG9mIHRoZSBNQUMgaXMgdXNlZCAoID0gMC1sZW5ndGgpLgorLlRQCisuQiBLZXkyPXMKK1NhbWUgYXMgS2V5MS4KKy5UUAorLkIgS2V5Mz1zCitTYW1lIGFzIEtleTEuCisuVFAKKy5CIEtleTQ9cworU2FtZSBhcyBLZXkxLgorLlRQCisuQiBMb2FkQmFsYW5jaW5nPXMKK0NvbnRyb2wgZm9yIHRoZSBMb2FkIEJhbGFuY2luZyBhbGdvcml0aG0gZm9yIGJvdGggU1RBcyBhbmQgQVBzLiBUaGUgQVAKK2luY2x1ZGVzIGEgbG9hZCBiYWxhbmNpbmcgZWxlbWVudCBpbiB0aGUgUHJvYmUgUmVzcG9uc2UgYW5kIEJlYWNvbiBmcmFtZXMuCitUaGUgU1RBIHVzZXMgdGhpcyBpbmZvIHRvIHNlbGVjdCBhbiBBUCwgbm90IG9ubHkgYmFzZWQgb24gY29tbXMgcXVhbGl0eSwgYnV0CithbHNvIG9uIHRoZSBsb2FkIG9mIHRoYXQgQVAuCisuQlIKKyAgICBEZWZhdWx0OiBZCisuVFAKKy5CIE1heERhdGFMZW5ndGgKKz8/Pz8/Pz8/Pz8/Pz8/PworLlRQCisuQiBNYXhTbGVlcER1cmF0aW9uPW4KK1NldCB0aGUgbWF4aW11bSBQb3dlciBNYW5hZ2VtZW50IHNsZWVwIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4KK1ZhbGlkIHZhbHVlcyBhcmUgMCB0byA2NTUzNSBtaWxsaXNlY29uZHMuCisuQlIKKyAgICBEZWZhdWx0OiAxMDAKKy5UUAorLkIgTWVkaXVtRGlzdHJpYnV0aW9uPXMKK0NvbnRyb2wgZm9yIHRoZSBkaXN0cmlidXRpb24gb2YgbWVkaXVtIHBhcmFtZXRlcnMsIGxpa2UgY29tbXVuaWNhdGlvbgordGhyZXNob2xkcywgbWljcm93YXZlIHJvYnVzdG5lc3MsIFJUUy9DVFMgdGhyZXNob2xkcywgYnkgQVBzLiBUaGUgYXNzb2NpYXRlZAorc3RhdGlvbnMgcmVwbGFjZSB0aGVpciBvd24gdmFsdWVzIHdpdGggdGhlIHJlY2VpdmVkIHZhbHVlcy4KKy5CUgorICAgIERlZmF1bHQ9WQorLlRQCisuQiBNaWNyb1dhdmVSb2J1c3RuZXNzPXMKK0VuYWJsZSBvciBkaXNhYmxlIE1pY3Jvd2F2ZSBPdmVuIFJvYnVzdG5lc3MuCisuQlIKKyAgICBOIFwtIERpc2FibGUKKy5CUgorICAgIFkgXC0gRW5hYmxlCisuQlIKKyAgICBEZWZhdWx0OiBOCisuVFAKKy5CIE11bHRpY2FzdFBNQnVmZmVyaW5nPXMKK0NvbnRyb2xzIGJ1ZmZlcmluZyBvZiBtdWx0aWNhc3QgTUFDIGZyYW1lcyBmb3IgdHJhbnNtaXNzaW9uIGFmdGVyIERUSU0uIElmIG5vLAorbXVsdGljYXN0IE1BQyBmcmFtZXMgYXJlIGRpcmVjdGx5IHBsYWNlZCBpbiB0aGUgb3V0cHV0IHF1ZXVlLgorLkJSCisgICAgRGVmYXVsdDogWQorLlRQCisuQiBNdWx0aWNhc3RSYXRlPW4KK1NldHMgdGhlIGRhdGEgcmF0ZSBmb3IgbXVsdGljYXN0IG1lc3NhZ2UgdHJhbnNtaXNzaW9uLgorLkJSCisgICAgMSBcLSBGaXhlZCAxTWIvcworICAgIDIgXC0gRml4ZWQgMk1iL3MKKyAgICAzIFwtIEZpeGVkIDUuNU1iL3MKKyAgICA0IFwtIEZpeGVkIDExTWIvcworLkJSCisgICAgRGVmYXVsdDogMgorCitGb3IgSGVybWVzLUlJLjUsIGFuIElOVEVHRVIgQ09OVkVSVEVEIGJpdCBtYXNrIHJlcHJlc2VudGluZyB0aGUKK3JhdGUgdG8gbXVsdGljYXN0LCB3aGVyZSB0aGUgcmF0ZXMgc3VwcG9ydGVkIGFyZSBhcyBmb2xsb3dzOgorCitCaXQgIDogMTV8MTR8MTN8MTJ8MTF8MTB8MDl8MDh8MDd8MDZ8MDV8MDR8MDN8MDJ8MDF8MDAKKy5icgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisuYnIKK1JhdGUgOiBYWHxYWHxYWHxYWHw1NHw0OHwzNnwyNHwxOHwxMnwgOXwgNnwxMXw1LjV8MnwgMQorCisgICAgRGVmYXVsdDogNCAoVHJhbnNsYXRlcyB0byAweDAwMDQgPSA1LjUgTWIvc2VjKQorCisuVFAKKy5CIE11bHRpY2FzdFJlY2VpdmU9cworRW5hYmxlIG9yIGRpc2FibGUgcmVjZWl2aW5nIG9mIGFsbCBtdWx0aWNhc3QgcGFja2V0cyB3aGVuIENhcmQgUG93ZXIgTWFuYWdlbWVudAoraXMgZW5hYmxlZC4gV2hlbiBlbmFibGVkLCB0aGUgc3RhdGlvbiB3aWxsIHdha2UgdXAgZnJlcXVlbnRseQordG8gcmVjZWl2ZSB0aGUgbXVsdGljYXN0IGZyYW1lcy4gVGhpcyBjYXVzZXMgbGVzcyBvcHRpbWFsIHBvd2VyIHNhdmluZ3MuCisuQlIKKyAgICBOIFwtIERpc2FibGUKKy5CUgorICAgIFkgXC0gRW5hYmxlCisuQlIKKyAgICBEZWZhdWx0OiBZCisuVFAKKy5CIE5ldHdvcmtBZGRyZXNzPW4sbixuLG4sbixuCitTZXRzIHRoZSBhZGFwdGVyIGhhcmR3YXJlIGV0aGVybmV0IGFkZHJlc3MgKE1BQyBhZGRyZXNzKSB0byB0aGUgdmFsdWUKK3NwZWNpZmllZC4gTm90ZSB0aGF0IHRoaXMgaXMgdG8gYmUgdXNlZCB0byBzcGVjaWZ5IGEgTG9jYWwgTUFDIGFkZHJlc3MuIERvCitub3Qgc3BlY2lmeSB0aGlzIHBhcmFtZXRlciBpZiB0aGUgY2FyZFwncyB1bml2ZXJzYWwgYWRkcmVzcyBpcyB0byBiZSB1c2VkLgorVmFsaWQgdmFsdWVzIGFyZSBzaXggaGV4YWRlY2ltYWwgZGlnaXQtcGFpcnMgKHByZWZpeGVkIHdpdGggMHgpLgorLkJSCisgICAgRGVmYXVsdDogPGZhY3RvcnkgYXNzaWduZWQgYWRkcmVzcz4KKy5UUAorLkIgTmV0d29ya1R5cGUKKz8/Pz8/Pz8/Pz8/Pz8/PworLlRQCisuQiBPd25BVElNV2luZG93PW4KK0FUSU0gd2luZG93IHRpbWUgdXNlZCBmb3IgY3JlYXRpbmcgYW4gSUJTUy4KKy5CUgorICAgIFJhbmdlOiAwLi4xMDAKKy5CUgorICAgIERlZmF1bHQ6IDAKKy5UUAorLkIgT3duQmVhY29uSW50ZXJ2YWw9YgorQmVhY29uIEludGVydmFsIGluIFRVCisuQlIKKyAgICBSYW5nZSAyMC4uMjAwCisuQlIKKyAgICBEZWZhdWx0IFwtIDEwMAorLlRQCisuQiBjaGFubmVsPW4KK1NhbWUgYXMgT3duQ2hhbm5lbC4KKy5UUAorLkIgT3duQ2hhbm5lbD1uCitTZXRzIHRoZSBjaGFubmVsIHRoZSBBZC1Ib2Mgb3IgSUJTUyBtb2RlIHdpbGwgdXNlLgorVGhlIGRlZmF1bHQgY2hhbm5lbCBmb3IgQWQtSG9jIG1vZGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgV2lyZWxlc3MgUEMgQ2FyZC4KK1RoZSBkZWZhdWx0IGNoYW5uZWwgZm9yIElCU1MgaXMgc2V0IHRvIDEwIGJ5IHRoZSBkcml2ZXIuCitUaGlzIHZhbHVlIGhhcyBubyBlZmZlY3Qgd2hlbiB0aGUgYWRhcHRlciBpcyB1c2VkIHdpdGggYW4gQWNjZXNzIFBvaW50CisoQlNTIG5ldHdvcmspIHNpbmNlIHRoZSBBY2Nlc3MgUG9pbnQgYXV0b21hdGljYWxseSBkZXRlcm1pbmVzIHRoZSBjaGFubmVsLgorVmFsaWQgdmFsdWVzIGFyZSAwIHRvIDE0LiBIb3dldmVyIHRoZSBjaGFubmVscyBhbGxvd2VkIGluCit5b3VyIHJlZ2lvbiBhcmUgc3ViamVjdCB0byBsb2NhbCByZWd1bGF0aW9ucyBhbmQgYXJlIGxpbWl0ZWQgYXQKK21hbnVmYWN0dXJpbmcgdGltZSBvZiB0aGUgV2lyZWxlc3MgUEMgQ2FyZC4gV2hlbiB0aGUgcHJvdmlkZWQgdmFsdWUgaXMKK25vdCBhbGxvd2VkLCB0aGUgdmFsdWUgcmVtYWlucyB1bmNoYW5nZWQuCisuQlIKKyAgICAwIFwtIFVzZSBkZWZhdWx0IGNoYW5uZWwKKy5CUgorICAgIERlZmF1bHQ6IDAKKy5UUAorLkIgT3duRFRJTVBlcmlvZD1uCitUaGUgbnVtYmVyIG9mIGJlYWNvbiBpbnRlcnZhbHMgYmV0d2VlbiBzdWNjZXNzaXZlIERlbGl2ZXJ5IFRyYWZmaWMgSWRlbnRpZmljYXRpb24KK01hcHMgKERUSU1zKS4KKy5CUgorICAgIFJhbmdlOiAxLi42NTUzNQorLkJSCisgICAgRGVmYXVsdDogMQorLlRQCisuQiBPd25OYW1lPXMKK1NldHMgdGhlIHN0YXRpb24gbmFtZSB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyB2YWx1ZS4gVGhpcyBwYXJhbWV0ZXIKK2lzIHVzZWQgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMsIGFzIGEgdXNlclwtZnJpZW5kbHkgaWRlbnRpZmljYXRpb24KK29mIHRoaXMgc3lzdGVtLiBUaGlzIHBhcmFtZXRlciBhY2NlcHRzIGEgbWF4aW11bSBvZiAzMiBjaGFyYWN0ZXJzLgorLkJSCisgICAgRGVmYXVsdDogTGludXgKKy5UUAorLkIgT3duU1NJRD1zCitTZXRzIHRoZSBjYXJkIG5ldHdvcmsgbmFtZSB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyB2YWx1ZS4gVGhpcyBwYXJhbWV0ZXIKK2FjY2VwdHMgYSBtYXhpbXVtIG9mIDMyIGNoYXJhY3RlcnMuIFdoaXRlc3BhY2UgaW4gdGhlIG5ldHdvcmsgbmFtZQord2lsbCBuZWVkIHRvIGJlIGVzY2FwZWQgd2l0aCBhIGJhY2tzbGFzaCAoaWUuIE93blNTSUQ9TXlcXCBOZXR3b3JrKS4KKy5CUgorICAgIERlZmF1bHQ6IEFOWQorLlRQCisuQiBwY19kZWJ1Zz1uCitTZWxlY3RzIHRoZSBQQ01DSUEgZGVidWdnaW5nIGxldmVsLiBUaGlzIHBhcmFtZXRlciBpcyBvbmx5IGF2YWlsYWJsZQoraWYgdGhlIG1vZHVsZSBpcyBjb21waWxlZCB3aXRoIGRlYnVnZ2luZyBlbmFibGVkLiBBIG5vblwtemVybyB2YWx1ZQorZW5hYmxlcyBkZWJ1Z2dpbmcuIEhpZ2hlciB2YWx1ZXMgeWllbGQgbW9yZSBpbmZvcm1hdGlvbiwgaS5lLiBmb3IgYW55IHZhbHVlIGFsbAorbG93ZXIgdmFsdWVzIGFyZSBpbXBsaWVkLgorLkJSCisgICAgOCBcLSBEQkdfRFNfT04KKy5CUgorICAgIDcgXC0gREJHX1JYX09OIHwgREJHX1RYX09OCisuQlIKKyAgICA2IFwtIERCR19QQVJBTV9PTgorLkJSCisgICAgNSBcLSBEQkdfVFJBQ0VfT04KKy5CUgorICAgIDQgXC0gREJHX1ZFUkJPU0VfT04KKy5CUgorSWYgdGhlIG1vZHVsZSBpcyBjb21waWxlZCB3aXRoIGRlYnVnZ2luZyBlbmFibGVkLCBwY19kZWJ1ZyBkZWZhdWx0cyB0byA1LgorRGVidWdGbGFnIG92ZXJydWxlcyBwY19kZWJ1Zy4KKy5CUgorVGhlIG5hbWUgcGNfZGVidWcgcmF0aGVyIHRoYW4gUGNEZWJ1Zywgc2luY2UgcGNfZGVidWcgaXMgdXNlZCBieSBtYW55IFBDTUNJQSBkcml2ZXIuCisuVFAKKy5CIFBNRW5hYmxlZD1iCitTZXRzIHRoZSBjYXJkXCdzIFBvd2VyIE1hbmFnZW1lbnQgc3RhdGUuCisuQlIKKyAgICAwIFwtIERpc2FibGUKKy5CUgorICAgIDEgXC0gRW5hYmxlIEVuaGFuY2VkIE1vZGUKKy5CUgorICAgIDIgXC0gRW5hYmxlZCBTdGFuZGFyZCBNb2RlCisuQlIKKyAgICAweDgwMDAgXC0gRW5oYW5jZWQ/Pz8/Pz8gTW9kZSAodG8gYmUgY29tYmluZWQgd2l0aCAweDAwMDEgb3IgMHgwMDAyKQorCisgICAgRGVmYXVsdDogMCAoRGlzYWJsZWQpCisuVFAKKy5CIFBNSG9sZG92ZXJEdXJhdGlvbj1uCitUaW1lIHRoYXQgdGhlIHN0YXRpb24gcmVtYWlucyBpbiBhbiBhd2FrZSBzdGF0ZSBhZnRlciBhIE1BQyBmcmFtZSB0cmFuc2ZlciBpZgorRW5oYW5jZWQgUG93ZXIgU2F2ZSBpcyBhY3RpdmUuCisuQlIKKyAgICBSYW5nZTogMS4uMTAwMAorLkJSCisgICAgRGVmYXVsdDogMTAwCisuVFAKKy5CIFBvd2VyTW9kZQorPz8/Pz8/Pz8/Pz8/Pz8/CisuVFAKKy5CIFBvcnRUeXBlPW4KK1NlbGVjdHMgdGhlIHR5cGUgb2YgbmV0d29yayBvcGVyYXRpb24uCisuQlIKKyAgICAxIFwtIE5vcm1hbCBPcGVyYXRpb24gKEJTUyBvciBJQlNTKQorLkJSCisgICAgMyBcLSBBZC1Ib2MgRGVtbyBNb2RlCisuQlIKKyAgICBEZWZhdWx0OiAxCisuVFAKKy5CIFByb21pc2N1b3VzTW9kZT1zCitTd2l0Y2ggZm9yIHByb21pc2N1b3VzIG1vZGUgcmVjZXB0aW9uLgorLkJSCisgICAgRGVmYXVsdDogTgorLlRQCisuQiBSZWplY3RBTlk9cworQ29udHJvbHMgaG93IHN0YXRpb25zIGFzc29jaWF0ZSB0byB0aGUgZGV2aWNlLgorLkJSCisgICAgWSBcLSBTdGF0aW9ucyBtdXN0IHByb3ZpZGUgdGhlIGNvcnJlY3QgU1NJRCB0bworICAgICAgICAgYXNzb2NpYXRlIHRvIHRoZSBBUC4KKy5CUgorICAgIE4gXC0gU3RhdGlvbnMgYXJlIG5vdCByZXF1aXJlZCB0byBwcm92aWRlIHRoZQorICAgICAgICAgY29ycmVjdCBTU0lEIHRvIGFzc29jaWF0ZSB0byB0aGUgQVAuCisgICAgICAgICBLbm93biBhcyBhbiBcJ29wZW5cJyBuZXR3b3JrLgorLkJSCisgICAgRGVmYXVsdCAtIE4KKy5UUAorLkIgUlRTVGhyZXNob2xkPW4KK0NvbnRyb2xzIHRoZSBSVFMvQ1RTIGhhbmRzaGFrZSB0aHJlc2hvbGQgZm9yIHRyYW5zbWlzc2lvbnMgaW4gU3RhdGlvbiBtb2RlLgorVmFsaWQgdmFsdWVzIGFyZSAwIHRvIDIzNDcuCisuQlIKKyAgICA1MDAgIFwtIEhpZGRlbiBTdGF0aW9ucworLkJSCisgICAgMjM0NyBcLSBObyBSVFMvQ1RTCisuQlIKKyAgICBEZWZhdWx0OiAyMzQ3CisuVFAKKy5CIFJUU1RocmVzaG9sZDE9bgorU2FtZSBhcyBSVFNUaHJlc2hvbGQsIG9ubHkgZm9yIHBvcnQgMSBvZiBpbiBBY2Nlc3NQb2ludCBtb2RlLgorLlRQCisuQiBSVFNUaHJlc2hvbGQyPW4KK1NhbWUgYXMgUlRTVGhyZXNob2xkMSwgb25seSBmb3IgcG9ydCAyLgorLlRQCisuQiBSVFNUaHJlc2hvbGQzPW4KK1NhbWUgYXMgUlRTVGhyZXNob2xkMSwgb25seSBmb3IgcG9ydCAzLgorLlRQCisuQiBSVFNUaHJlc2hvbGQ0PW4KK1NhbWUgYXMgUlRTVGhyZXNob2xkMSwgb25seSBmb3IgcG9ydCA0LgorLlRQCisuQiBSVFNUaHJlc2hvbGQ1PW4KK1NhbWUgYXMgUlRTVGhyZXNob2xkMSwgb25seSBmb3IgcG9ydCA1LgorLlRQCisuQiBSVFNUaHJlc2hvbGQ2PW4KK1NhbWUgYXMgUlRTVGhyZXNob2xkMSwgb25seSBmb3IgcG9ydCA2LgorLlRQCisuQiBTUlNDMkdIej1iCitTZXRzIHRoZSBjYXJkXCdzIFN1cHBvcnRlZCBSYXRlIFNldCBpbiB0aGUgMi40R0h6IGJhbmQuIFRoZSB2YWx1ZQoraXMgYW4gSU5URUdFUiBDT05WRVJURUQgYml0IG1hc2sgcmVwcmVzZW50aW5nIHRoZSByYXRlcyB0byBzdXBwb3J0LAord2hlcmUgdGhlIHJhdGVzIHN1cHBvcnRlZCBhcmUgYXMgZm9sbG93czoKKworQml0ICA6IDE1fDE0fDEzfDEyfDExfDEwfDA5fDA4fDA3fDA2fDA1fDA0fDAzfDAyfDAxfDAwCisuYnIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLmJyCitSYXRlIDogWFh8WFh8WFh8WFh8NTR8NDh8MzZ8MjR8MTh8MTJ8IDl8IDZ8MTF8NS41fDJ8IDEKKy5CUgorICAgIERlZmF1bHQ6IDQwOTUgKG9yIDB4MEZGRiwgYWxsIDExYiBhbmQgMTFnIHJhdGVzKQorLlRQCisuQiBTUlNDNUdIej1iCitTZXRzIHRoZSBjYXJkXCdzIFN1cHBvcnRlZCBSYXRlIFNldCBpbiB0aGUgNS4wR0h6IGJhbmQuIFNlZSBTUlNDMkdIegorZm9yIHRoZSB2YWx1ZVwncyBmb3JtYXQuCisuQlIKKyAgICBEZWZhdWx0OiA0MDgwIChvciAweDBGRjAsIGFsbCAxMWEgcmF0ZXMpCisuVFAKKy5CIFN5c3RlbVNjYWxlPW4KK1NldHMgdGhlIGRpc3RhbmNlIGJldHdlZW4gQWNjZXNzIFBvaW50cyBpbiB0aGUgbmV0d29yay4gVGhpcyB2YWx1ZQoraW5mbHVlbmNlcyB0aGUgTW9kZW0gVGhyZXNob2xkcyAoRW5lcmd5RGV0ZWN0VGhyZXNob2xkLAorQ2FycmllckRldGVjdFRocmVzaG9sZCBhbmQgRGVmZXJUaHJlc2hvbGQpIGFuZAordGhlIFJvYW1pbmcgVGhyZXNob2xkcyAoQ2VsbFNlYXJjaFRocmVzaG9sZCBhbmQgT3V0T2ZSYW5nZVRocmVzaG9sZCkuCisuQlIKKyAgICAxIFwtIExhcmdlCisuQlIKKyAgICAyIFwtIE1lZGl1bQorLkJSCisgICAgMyBcLSBTbWFsbAorLkJSCisgICAgRGVmYXVsdDogMQorLlRQCisuQiBUeFJhdGVDb250cm9sPW4KK1NldHMgdGhlIGRhdGEgcmF0ZSB0byBiZSB1c2VkIGJ5IHRoZSB0cmFuc21pdHRlci4gRm9yIEhlcm1lcy1JSToKKy5CUgorICAgIDEgXC0gRml4ZWQgTG93ICgxIE1iL3NlYykKKy5CUgorICAgIDIgXC0gRml4ZWQgU3RhbmRhcmQgKDIgTWIvc2VjKQorLkJSCisgICAgMyBcLSBBdXRvIFJhdGUgU2VsZWN0IEhpZ2ggKDExLCA1LjUsIDIsIDEgTWIvc2VjKQorLkJSCisgICAgNCBcLSBGaXhlZCBNZWRpdW0gKDUuNSBNYi9zZWMpCisuQlIKKyAgICA1IFwtIEZpeGVkIEhpZ2ggKDExIE1iL3NlYykKKy5CUgorICAgIDYgXC0gQXV0byBSYXRlIFNlbGVjdCBTdGFuZGFyZCAoMiwgMSBNYi9zZWMpCisuQlIKKyAgICA3IFwtIEF1dG8gUmF0ZSBTZWxlY3QgTWVkaXVtICg1LjUsIDIsIDEgTWIvc2VjKQorLkJSCisgICAgRGVmYXVsdDogMworCitGb3IgSGVybWVzLUlJLjUsIGFuIElOVEVHRVIgQ09OVkVSVEVEIGJpdCBtYXNrIHJlcHJlc2VudGluZyBhbGwgb2YgdGhlCityYXRlcyB0byBzdXBwb3J0LCB3aGVyZSB0aGUgcmF0ZXMgc3VwcG9ydGVkIGFyZSBhcyBmb2xsb3dzOgorCitCaXQgIDogMTV8MTR8MTN8MTJ8MTF8MTB8MDl8MDh8MDd8MDZ8MDV8MDR8MDN8MDJ8MDF8MDAKKy5icgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisuYnIKK1JhdGUgOiBYWHxYWHxYWHxYWHw1NHw0OHwzNnwyNHwxOHwxMnwgOXwgNnwxMXw1LjV8MnwgMQorLkJSCisgICAgRGVmYXVsdDogNDA5NSAoVHJhbnNsYXRlcyB0byAweEZGRiwgd2hpY2ggaXMgYWxsIHJhdGVzKQorLlRQCisuQiBSVFNUaHJlc2hvbGQ9bgorU2V0cyB0aGUgbnVtYmVyIG9mIG9jdGV0cyBpbiBhIG1lc3NhZ2Ugb3IgZnJhZ21lbnQgYWJvdmUgd2hpY2ggYQorUlRTL0NUUyBoYW5kc2hha2UgaXMgcGVyZm9ybWVkLgorVmFsaWQgdmFsdWVzIGFyZSAwIHRvIDIzNDcuCisuQlIKKyAgICA1MDAgIFwtIEhpZGRlbiBTdGF0aW9ucworLkJSCisgICAgMjM0NyBcLSBObyBSVFMvQ1RTCisuQlIKKyAgICBEZWZhdWx0OiAyMzQ3CisuVFAKKy5CIFR4S2V5PW4KK0Rlc2lnbmF0ZXMgd2hpY2ggb2YgdGhlIGtleXMgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGVuY2lwaGVyaW5nIG9mIGRhdGEgdGhhdCBpcwordHJhbnNtaXR0ZWQgYnkgdGhpcyBzdGF0aW9uLgorLkJSCisgICAgSW50ZWdlciBpbiB0aGUgcmFuZ2UgMS4uNC4KKy5CUgorICAgIERlZmF1bHQ6IDEKKy5UUAorLkIgVHhQb3dMZXZlbAorPz8/Pz8/Pz8/Pz8/Pz8/CisuVFAKKy5CIFR4UmF0ZUNvbnRyb2w9bgorU2V0cyB0aGUgZGF0YSByYXRlIHRvIGJlIHVzZWQgYnkgdGhlIHRyYW5zbWl0dGVyIGluIFN0YXRpb24gbW9kZS4KKy5CUgorICAgIDEgXC0gRml4ZWQgTG93CisuQlIKKyAgICAyIFwtIEZpeGVkIFN0YW5kYXJkCisuQlIKKyAgICAzIFwtIEF1dG8gUmF0ZSBTZWxlY3QgKEhpZ2gpCisuQlIKKyAgICA0IFwtIEZpeGVkIE1lZGl1bQorLkJSCisgICAgNSBcLSBGaXhlZCBIaWdoCisuQlIKKyAgICA2IFwtIEF1dG8gUmF0ZSBTZWxlY3QgKFN0YW5kYXJkKQorLkJSCisgICAgNyBcLSBBdXRvIFJhdGUgU2VsZWN0IChNZWRpdW0pCisuQlIKKyAgICBEZWZhdWx0OiAzCisKK0ZvciBIZXJtZXMtSUkuNSwgYW4gSU5URUdFUiBDT05WRVJURUQgYml0IG1hc2sgcmVwcmVzZW50aW5nIGFsbCBvZiB0aGUKK3JhdGVzIHRvIHN1cHBvcnQsIHdoZXJlIHRoZSByYXRlcyBzdXBwb3J0ZWQgYXJlIGFzIGZvbGxvd3M6CisKK0JpdCAgOiAxNXwxNHwxM3wxMnwxMXwxMHwwOXwwOHwwN3wwNnwwNXwwNHwwM3wwMnwwMXwwMAorLmJyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5icgorUmF0ZSA6IFhYfFhYfFhYfFhYfDU0fDQ4fDM2fDI0fDE4fDEyfCA5fCA2fDExfDUuNXwyfCAxCisuQlIKKyAgICBEZWZhdWx0OiA0MDk1IChUcmFuc2xhdGVzIHRvIDB4RkZGLCB3aGljaCBpcyBhbGwgcmF0ZXMpCisKKy5UUAorLkIgVHhSYXRlQ29udHJvbDE9bgorU2FtZSBhcyBUeFJhdGVDb250cm9sLCBvbmx5IGZvciBwb3J0IDEgaW4gQWNjZXNzUG9pbnQgbW9kZS4KKy5UUAorLkIgVHhSYXRlQ29udHJvbDI9bgorU2FtZSBhcyBUeFJhdGVDb250cm9sMSwgb25seSBmb3IgcG9ydCAyLgorLlRQCisuQiBUeFJhdGVDb250cm9sMz1uCitTYW1lIGFzIFR4UmF0ZUNvbnRyb2wxLCBvbmx5IGZvciBwb3J0IDMuCisuVFAKKy5CIFR4UmF0ZUNvbnRyb2w0PW4KK1NhbWUgYXMgVHhSYXRlQ29udHJvbDEsIG9ubHkgZm9yIHBvcnQgNC4KKy5UUAorLkIgVHhSYXRlQ29udHJvbDU9bgorU2FtZSBhcyBUeFJhdGVDb250cm9sMSwgb25seSBmb3IgcG9ydCA1LgorLlRQCisuQiBUeFJhdGVDb250cm9sNj1uCitTYW1lIGFzIFR4UmF0ZUNvbnRyb2wxLCBvbmx5IGZvciBwb3J0IDYuCisuVFAKKy5CIFZlbmRvckRlc2NyaXB0aW9uCis/Pz8/Pz8/Pz8/Pz8/Pz8KKy5UUAorLkIgV0RTQWRkcmVzcz1uLG4sbixuLG4sbgorTUFDIGFkZHJlc3MgdGhhdCBpZGVudGlmaWVzIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUgb2YgdGhlIFdEUyBwb3J0IGluIFN0YXRpb24gbW9kZS4KK05vdGUgdGhhdCBmb3IgV0RTIHRvIHdvcmsgcHJvcGVybHksIGEgYnJpZGdlIGludGVyZmFjZSBtdXN0IGJlIHNldHVwIGJldHdlZW4gdGhlIGRldmljZSBhbmQKK3RoZSB3ZHMgbmV0d29yayBkZXZpY2VzIGNyZWF0ZWQgYnkgdGhlIGRyaXZlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gYnJpZGdlCitpbnRlcmZhY2VzLCBwbGVhc2UgcmVmZXIgdG8gdGhlIG1hbiBwYWdlIGZvciBcJ2JyY3RsXCcuCisuQlIKKyAgICBEZWZhdWx0OiAwMDowMDowMDowMDowMDowMAorLlRQCisuQiBXRFNBZGRyZXNzMT1uLG4sbixuLG4sbgorU2FtZSBhcyBXRFNBZGRyZXNzLCBvbmx5IGZvciBwb3J0IDEgaW4gQWNjZXNzUG9pbnQgbW9kZS4KKy5UUAorLkIgV0RTQWRkcmVzczI9bixuLG4sbixuLG4KK1NhbWUgYXMgV0RTQWRkcmVzczEsIG9ubHkgZm9yIHBvcnQgMi4KKy5UUAorLkIgV0RTQWRkcmVzczM9bixuLG4sbixuLG4KK1NhbWUgYXMgV0RTQWRkcmVzczEsIG9ubHkgZm9yIHBvcnQgMy4KKy5UUAorLkIgV0RTQWRkcmVzczQ9bixuLG4sbixuLG4KK1NhbWUgYXMgV0RTQWRkcmVzczEsIG9ubHkgZm9yIHBvcnQgNC4KKy5UUAorLkIgV0RTQWRkcmVzczU9bixuLG4sbixuLG4KK1NhbWUgYXMgV0RTQWRkcmVzczEsIG9ubHkgZm9yIHBvcnQgNS4KKy5UUAorLkIgV0RTQWRkcmVzczY9bixuLG4sbixuLG4KK1NhbWUgYXMgV0RTQWRkcmVzczEsIG9ubHkgZm9yIHBvcnQgNi4KKy5TSCBTRUNVUklUWQorT24gYSBtdWx0aS11c2VyIHN5c3RlbSBvbmx5IHRoZSBzeXN0ZW0gYWRtaW5pc3RyYXRvciBuZWVkcyBhY2Nlc3MgdG8gdGhlIFdFUAorZW5jcnlwdGlvbiBrZXlzLiBJbiB0aGlzIGNhc2UsIGNvbnNpZGVyIHJlbW92aW5nIHRoZSByZWFkIHBlcm1pc3Npb24gZm9yCitub3JtYWwgdXNlcnMgb2YgdGhlIFBDTUNJQSBjb25maWcub3B0cyBmaWxlLCB0aGUgc3lzdGVtIGxvZyBmaWxlLCBhbmQgYW55CitBZ2VyZSBwcm9wcmlldGFyeSBpd2NvbmZpZy1ldGg8bj4gc2NyaXB0cy4KKy5TSCBDT05UQUNUCitJZiB5b3UgZW5jb3VudGVyIHByb2JsZW1zIHdoZW4gaW5zdGFsbGluZyBvciB1c2luZyB0aGlzIHByb2R1Y3QsIG9yIHdvdWxkIGxpa2UKK2luZm9ybWF0aW9uIGFib3V0IG91ciBvdGhlciAiV2lyZWxlc3MiIHByb2R1Y3RzLCBwbGVhc2UgY29udGFjdCB5b3VyIGxvY2FsCitBdXRob3JpemVkICJXaXJlbGVzcyIgUmVzZWxsZXIgb3IgQWdlcmUgU3lzdGVtcyBzYWxlcyBvZmZpY2UuCisKK0FkZHJlc3NlcyBhbmQgdGVsZXBob25lIG51bWJlcnMgb2YgdGhlIEFnZXJlIFN5c3RlbXMgc2FsZXMgb2ZmaWNlcyBhcmUKK2xpc3RlZCBvbiBvdXIgQWdlcmUgU3lzdGVtcyB3ZWIgc2l0ZS4KKy5UUAorLkIgV1dXCitodHRwOi8vd3d3LmFnZXJlLmNvbQorLlNIIFNFRSBBTFNPCisuQlIgY2FyZG1nciAoOCksCisuQlIgcGNtY2lhICg1KSwKKy5CUiBpZmNvbmZpZyAoOCksCisuQlIgaW5zbW9kICg4KSwKKy5CUiBicmN0bCAoOCkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9tZGQuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL21kZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NWM3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9tZGQuaApAQCAtMCwwICsxLDExNTYgQEAKKworLy8gICB2aW06dHc9MTEwOnRzPTQ6CisjaWZuZGVmIE1ERF9ICisjZGVmaW5lIE1ERF9IIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRklMRQkJOiBtZGQuaAorKgorKiBEQVRFCQk6ICREYXRlOiAyMDA0LzA4LzA1IDExOjQ3OjEwICQgICAkUmV2aXNpb246IDEuNiAkCisqIE9yaWdpbmFsCQk6IDIwMDQvMDUvMjUgMDU6NTk6MzcgICAgUmV2aXNpb246IDEuNTcgICAgICBUYWc6IGhjZjdfdDIwMDQwNjAyXzAxCisqIE9yaWdpbmFsCQk6IDIwMDQvMDUvMTMgMTU6MzE6NDUgICAgUmV2aXNpb246IDEuNTQgICAgICBUYWc6IGhjZjdfdDdfMjAwNDA1MTNfMDEKKyogT3JpZ2luYWwJCTogMjAwNC8wNC8xNSAwOToyNDo0MSAgICBSZXZpc2lvbjogMS40NyAgICAgIFRhZzogaGNmN190N18yMDA0MDQxNV8wMQorKiBPcmlnaW5hbAkJOiAyMDA0LzA0LzEzIDE0OjIyOjQ1ICAgIFJldmlzaW9uOiAxLjQ2ICAgICAgVGFnOiB0N18yMDA0MDQxM18wMQorKiBPcmlnaW5hbAkJOiAyMDA0LzA0LzAxIDE1OjMyOjU1ICAgIFJldmlzaW9uOiAxLjQyICAgICAgVGFnOiB0N18yMDA0MDQwMV8wMQorKiBPcmlnaW5hbAkJOiAyMDA0LzAzLzEwIDE1OjM5OjI4ICAgIFJldmlzaW9uOiAxLjM4ICAgICAgVGFnOiB0MjAwNDAzMTBfMDEKKyogT3JpZ2luYWwJCTogMjAwNC8wMy8wNCAxMTowMzozNyAgICBSZXZpc2lvbjogMS4zNiAgICAgIFRhZzogdDIwMDQwMzA0XzAxCisqIE9yaWdpbmFsCQk6IDIwMDQvMDMvMDIgMDk6Mjc6MTEgICAgUmV2aXNpb246IDEuMzQgICAgICBUYWc6IHQyMDA0MDMwMl8wMworKiBPcmlnaW5hbAkJOiAyMDA0LzAyLzI0IDEzOjAwOjI3ICAgIFJldmlzaW9uOiAxLjI5ICAgICAgVGFnOiB0MjAwNDAyMjRfMDEKKyogT3JpZ2luYWwJCTogMjAwNC8wMi8xOCAxNzoxMzo1NyAgICBSZXZpc2lvbjogMS4yNiAgICAgIFRhZzogdDIwMDQwMjE5XzAxCisqCisqIEFVVEhPUgk6IE5pY28gVmFsc3RlcgorKgorKiBERVNDCQk6IERlZmluaXRpb25zIGFuZCBQcm90b3R5cGVzIGZvciBIQ0YsIERIRiwgTU1EIGFuZCBNU0YKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgorKiBTT0ZUV0FSRSBMSUNFTlNFCisqCisqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorKgorKiBDT1BZUklHSFQgqSAxOTk0IC0gMTk5NQlieSBBVCZULgkJCQlBbGwgUmlnaHRzIFJlc2VydmVkCisqIENPUFlSSUdIVCCpIDE5OTYgLSAyMDAwIGJ5IEx1Y2VudCBUZWNobm9sb2dpZXMuCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKyogQ09QWVJJR0hUIKkgMjAwMSAtIDIwMDQJYnkgQWdlcmUgU3lzdGVtcyBJbmMuCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorKgorKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyogICAgZGlzdHJpYnV0aW9uLgorKgorKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyoKKyogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKiBEaXNjbGFpbWVyCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyogREFNQUdFLgorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogVGhlIG1hY3JvcyBYbiguLi4pIGFuZCBYWG4oLi4uKSBhcmUgdXNlZCB0byBkZWZpbmUgdGhlIExUVidzIChzaG9ydCBmb3IgTGVuZ3RoIFR5cGUgVmFsdWVbIF0pICwKKyogYWthIFJJRHMsIHByb2Nlc3NlZCBieSB0aGUgSGVybWVzLgorKiBUaGUgbiBpbiBYbiBhbmQgWFhuIHJlZmxlY3RzIHRoZSBudW1iZXIgb2YgIlZhbHVlIiBmaWVsZHMgaW4gdGhlc2UgUklEcy4KKyoKKyogWG4oLi4uKSA6IE1hY3JvcyB1c2VkIGZvciBSSURzIHdoaWNoIHVzZSBvbmx5IHR5cGUgaGNmXzE2IGZvciB0aGUgIlYiIGZpZWxkcyBvZiB0aGUgTFRWLgorKiBYbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIGEgUklEIG5hbWUgYW5kICJuIiBuYW1lKHMpLCBvbmUgZm9yIGVhY2ggb2YgdGhlICJWIiBmaWVsZHMgb2YgdGhlIExUVi4KKyoKKyogWFhuKC4uLikgOiBNYWNyb3MgdXNlZCBmb3IgUklEcyB3aGljaCB1c2UgYXQgbGVhc3Qgb25lIG90aGVyIHR5cGUgdGhlbiBoY2ZfMTYgZm9yIGEgIlYiIGZpZWxkCisqIG9mIHRoZSBMVFYuCisqIFhYbiguLikgdGFrZXMgYXMgcGFyYW1ldGVycyBhIFJJRCBuYW1lIGFuZCAibiIgcGFpcihzKSBvZiB0eXBlIGFuZCBuYW1lLCBvbmUgZm9yIGVhY2ggIlYiIGZpZWxkCisqIG9mIHRoZSBMVFYKKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgZSB4IGEgbSBwIGwgZSBzICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisqIFgxKFJJRF9OQU1FLCBwYXJhbWV0ZXJzLi4uKSA6IGV4cGFuZHMgdG8gOgorKiAgICB0eXBlZGVmIHN0cnVjdCBSSURfTkFNRV9TVFJDVCB7CisqICAgICAgICAgaGNmXzE2ICBsZW47CisqICAgICAgICAgaGNmXzE2ICB0eXA7CisqICAgICAgICAgaGNmXzE2ICBwYXIxOworKiAgICB9IFJJRF9OQU1FX1NUUkNUOworCisqIFgyKFJJRF9OQU1FLCBwYXJhbWV0ZXJzLi4uKSA6IGV4cGFuZHMgdG8gOgorKiAgICB0eXBlZGVmIHN0cnVjdCBSSURfTkFNRV9TVFJDVCB7CisqICAgICAgICAgaGNmXzE2ICBsZW47CisqICAgICAgICAgaGNmXzE2ICB0eXA7CisqICAgICAgICAgaGNmXzE2ICBwYXIxOworKiAgICAgICAgIGhjZl8xNiAgcGFyMjsKKyogICAgfSBSSURfTkFNRV9TVFJDVDsKKworCisqIFhYMShSSURfTkFNRSwgcGFyMXR5cGUsIHBhcjFuYW1lLCAuLi4pIDogZXhwYW5kcyB0byA6CisqICAgIHR5cGVkZWYgc3RydWN0IFJJRF9OQU1FX1NUUkNUIHsKKyogICAgICAgaGNmXzE2ICAgIGxlbjsKKyogICAgICAgaGNmXzE2ICAgIHR5cDsKKyogICAgICAgcGFyMXR5cGUgIHBhcjFuYW1lOworKiAgICB9IFJJRF9OQU1FX1NUUkNUOworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFhYIFN1Yi1tYWNybyBkZWZpbml0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBYWDEoIG5hbWUsIHR5cGUxLCBwYXIxICkJXAordHlwZWRlZiBzdHJ1Y3QgewkJCQkgIAlcCisJaGNmXzE2CWxlbjsgICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJdHlwOyAgICAgICAgICAgICAgICAJXAorCXR5cGUxCXBhcjE7ICAgICAgICAgICAgICAgCVwKK30gbmFtZSMjX1NUUkNUOworCisjZGVmaW5lIFhYMiggbmFtZSwgdHlwZTEsIHBhcjEsIHR5cGUyLCBwYXIyICkJXAordHlwZWRlZiBzdHJ1Y3QgewkJCQkgICAJXAorCWhjZl8xNglsZW47ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXR5cDsgICAgICAgICAgICAgICAgCVwKKwl0eXBlMQlwYXIxOyAgICAgICAgICAgICAgIAlcCisJdHlwZTIJcGFyMjsgICAgICAgICAgICAgICAJXAorfSBuYW1lIyNfU1RSQ1Q7CisKKyNkZWZpbmUgWFgzKCBuYW1lLCB0eXBlMSwgcGFyMSwgdHlwZTIsIHBhcjIsIHR5cGUzLCBwYXIzICkJXAordHlwZWRlZiBzdHJ1Y3QgbmFtZSMjX1NUUkNUIHsgICAJXAorCWhjZl8xNglsZW47ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXR5cDsgICAgICAgICAgICAgICAgCVwKKwl0eXBlMQlwYXIxOyAgICAgICAgICAgICAgIAlcCisJdHlwZTIJcGFyMjsgICAgICAgICAgICAgICAJXAorCXR5cGUzCXBhcjM7ICAgICAgICAgICAgICAgCVwKK30gbmFtZSMjX1NUUkNUOworCisjZGVmaW5lIFhYNCggbmFtZSwgdHlwZTEsIHBhcjEsIHR5cGUyLCBwYXIyLCB0eXBlMywgcGFyMywgdHlwZTQsIHBhcjQgKQlcCit0eXBlZGVmIHN0cnVjdCB7CQkJCSAgCVwKKwloY2ZfMTYJbGVuOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNgl0eXA7ICAgICAgICAgICAgICAgIAlcCisJdHlwZTEJcGFyMTsgICAgICAgICAgICAgICAJXAorCXR5cGUyCXBhcjI7ICAgICAgICAgICAgICAgCVwKKwl0eXBlMwlwYXIzOyAgICAgICAgICAgICAgIAlcCisJdHlwZTQJcGFyNDsgICAgICAgICAgICAgICAJXAorfSBuYW1lIyNfU1RSQ1Q7CisKKyNkZWZpbmUgWDEoIG5hbWUsIHBhcjEgKQlcCit0eXBlZGVmIHN0cnVjdCBuYW1lIyNfU1RSQ1QgeyAgIAlcCisJaGNmXzE2CWxlbjsgICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJdHlwOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIxOyAgICAgICAgICAgICAgIAlcCit9IG5hbWUjI19TVFJDVDsKKworI2RlZmluZSBYMiggbmFtZSwgcGFyMSwgcGFyMiApCQlcCit0eXBlZGVmIHN0cnVjdCB7CQkJICAgIAlcCisJaGNmXzE2CWxlbjsgICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJdHlwOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIxOyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjI7ICAgICAgICAgICAgICAgCVwKK30gbmFtZSMjX1NUUkNUOworCisjZGVmaW5lIFgzKCBuYW1lLCBwYXIxLCBwYXIyLCBwYXIzICkJCVwKK3R5cGVkZWYgc3RydWN0IHsJCQkgICAgCVwKKwloY2ZfMTYJbGVuOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNgl0eXA7ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjE7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMjsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIzOyAgICAgICAgICAgICAgIAlcCit9IG5hbWUjI19TVFJDVDsKKworI2RlZmluZSBYNCggbmFtZSwgcGFyMSwgcGFyMiwgcGFyMywgcGFyNCApCQlcCit0eXBlZGVmIHN0cnVjdCB7CQkJICAgIAlcCisJaGNmXzE2CWxlbjsgICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJdHlwOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIxOyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjI7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMzsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXI0OyAgICAgICAgICAgICAgIAlcCit9IG5hbWUjI19TVFJDVDsKKworI2RlZmluZSBYNSggbmFtZSwgcGFyMSwgcGFyMiwgcGFyMywgcGFyNCwgcGFyNSApCQlcCit0eXBlZGVmIHN0cnVjdCB7CQkJICAgIAlcCisJaGNmXzE2CWxlbjsgICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJdHlwOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIxOyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjI7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMzsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXI0OyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjU7ICAgICAgICAgICAgICAgCVwKK30gbmFtZSMjX1NUUkNUOworCisjZGVmaW5lIFg2KCBuYW1lLCBwYXIxLCBwYXIyLCBwYXIzLCBwYXI0LCBwYXI1LCBwYXI2ICkJCVwKK3R5cGVkZWYgc3RydWN0IHsJCQkgICAgCVwKKwloY2ZfMTYJbGVuOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNgl0eXA7ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjE7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMjsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIzOyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjQ7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyNTsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXI2OyAgICAgICAgICAgICAgIAlcCit9IG5hbWUjI19TVFJDVDsKKworI2RlZmluZSBYOCggbmFtZSwgcGFyMSwgcGFyMiwgcGFyMywgcGFyNCwgcGFyNSwgcGFyNiwgcGFyNywgcGFyOCApCQlcCit0eXBlZGVmIHN0cnVjdCB7CQkJICAgIAlcCisJaGNmXzE2CWxlbjsgICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJdHlwOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIxOyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjI7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMzsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXI0OyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjU7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyNjsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXI3OyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjg7ICAgICAgICAgICAgICAgCVwKK30gbmFtZSMjX1NUUkNUOworCisjZGVmaW5lIFgxMSggbmFtZSwgcGFyMSwgcGFyMiwgcGFyMywgcGFyNCwgcGFyNSwgcGFyNiwgcGFyNywgcGFyOCwgcGFyOSwgcGFyMTAsIHBhcjExICkJCVwKK3R5cGVkZWYgc3RydWN0IHsJCQkgICAgCVwKKwloY2ZfMTYJbGVuOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNgl0eXA7ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjE7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMjsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIzOyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjQ7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyNTsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXI2OyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjc7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyODsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXI5OyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjEwOyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjExOyAgICAgICAgICAgICAgIAlcCit9IG5hbWUjI19TVFJDVDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU3Vic3RydWN0dXJlIGRlZmluaXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvL2FwcGFyZW50bHkgbm90IG5lZWRlZCAoQ0ZHX0NORl9DT1VOVFJZKQordHlwZWRlZiBzdHJ1Y3QgQ0hBTk5FTF9TRVQgewkJCQkvL2NoYW5uZWwgc2V0IHN0cnVjdHVyZSB1c2VkIGluIHRoZSBDRkdfQ05GX0NPVU5UUlkgTFRWCisJaGNmXzE2CWZpcnN0X2NoYW5uZWw7CisJaGNmXzE2CW51bWJlcl9vZl9jaGFubmVsczsKKwloY2ZfMTYJbWF4X3R4X291dHB1dF9sZXZlbDsKK30gQ0hBTk5FTF9TRVQ7CisKK3R5cGVkZWYgc3RydWN0IEtFWV9TVFJDVCB7CQkJCQkvLyBrZXkgc3RydWN0dXJlIHVzZWQgaW4gdGhlIENGR19ERUZBVUxUX0tFWVMgTFRWCisgICAgaGNmXzE2ICBsZW47CSAgICAgICAgICAgICAgCQkJCS8vbGVuZ3RoIG9mIGtleQorICAgIGhjZl84ICAga2V5WzE0XTsJCQkJCQkJLy9lbmNyeXB0aW9uIGtleQorfSBLRVlfU1RSQ1Q7CisKK3R5cGVkZWYgc3RydWN0IFNDQU5fUlNfU1RSQ1QgewkJCQkvLyBTY2FuIFJlc3VsdCBzdHJ1Y3R1cmUgdXNlZCBpbiB0aGUgQ0ZHX1NDQU4gTFRWCisJaGNmXzE2CWNoYW5uZWxfaWQ7CisJaGNmXzE2CW5vaXNlX2xldmVsOworCWhjZl8xNglzaWduYWxfbGV2ZWw7CisJaGNmXzgJYnNzaWRbNl07CisJaGNmXzE2CWJlYWNvbl9pbnRlcnZhbF90aW1lOworCWhjZl8xNgljYXBhYmlsaXR5OworCWhjZl8xNglzc2lkX2xlbjsKKwloY2ZfOAlzc2lkX3ZhbFszMl07Cit9IFNDQU5fUlNfU1RSQ1Q7CisKK3R5cGVkZWYgc3RydWN0IENGR19SQU5HRV9TUEVDX1NUUkNUIHsJCS8vIHJhbmdlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHVzZWQgaW4gQ0ZHX1JBTkdFUywgQ0ZHX1JBTkdFMSBldGMKKwloY2ZfMTYJdmFyaWFudDsKKwloY2ZfMTYJYm90dG9tOworCWhjZl8xNgl0b3A7Cit9IENGR19SQU5HRV9TUEVDX1NUUkNUOworCit0eXBlZGVmIHN0cnVjdCBDRkdfUkFOR0VfU1BFQ19CWVRFX1NUUkNUIHsJLy8gYnl0ZSBvcmllbnRlZCByYW5nZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSB1c2VkIGluIENGR19SQU5HRV9CIExUVgorCWhjZl84CXZhcmlhbnRbMl07CisJaGNmXzgJYm90dG9tWzJdOworCWhjZl84CXRvcFsyXTsKK30gQ0ZHX1JBTkdFX1NQRUNfQllURV9TVFJDVDsKKworLy91c2VkIHRvIHNldCB1cCAiVCIgZnVuY3Rpb25hbGl0eSBmb3IgSW5mbyBmcmFtZXMsIGkuZS4gbG9nIGluZm8gZnJhbWVzIGluIE1TRiBzdXBwbGllZCBidWZmZXIgYW5kIE1haWxCb3gKK1hYMSggUklEX0xPRywgdW5zaWduZWQgc2hvcnQgRkFSKiwgYnVmcCApCit0eXBlZGVmIFJJRF9MT0dfU1RSQ1QgIEZBUiAqUklEX0xPR1A7CitYWDEoIENGR19SSURfTE9HLCBSSURfTE9HUCwgcmVjb3JkcCApCisKKyBYMSggTFRWLAkJdmFsWzFdICkJCQkJCQkJCQkJCQkvKm1pbmltdW0gTFRWIHByb3RvIHR5cAkqLworIFgxKCBMVFZfTUFYLAl2YWxbSENGX01BWF9MVFZdICkJCQkJCQkJCQkJLyptYXhpbXVtIExUViBwcm90byB0eXAJKi8KK1hYMiggQ0ZHX1JFR19NQiwgaGNmXzE2KiAsIG1iX2FkZHIsIGhjZl8xNiwgbWJfc2l6ZSApCisKK3R5cGVkZWYgc3RydWN0IENGR19NQl9JTkZPX0ZSQUcgewkvLyBzcGVjaWZpY2F0aW9uIG9mIGJ1ZmZlciBmcmFnbWVudAorCXVuc2lnbmVkIHNob3J0IEZBUioJZnJhZ19hZGRyOworCWhjZl8xNgkJCQlmcmFnX2xlbjsKK30gQ0ZHX01CX0lORk9fRlJBRzsKKworLyogTWFpbCBCb3ggSW5mbyBCbG9jayBzdHJ1Y3R1cmVzLAorICogdGhlIGJhc2UgZm9ybTogQ0ZHX01CX0lORk9fU1RSQ1QKKyAqIGFuZCB0aGUgZGVyaXZlZCBmb3JtczogQ0ZHX01CX0lORk9fUkFOR0U8bj5fU1RSQ1Qgd2l0aCBuIGlzIDEsIDIsIDMgb3IgMjAKKyAqIHByZWRlZmluZWQgZm9yIGEgcGF5bG9hZCBvZiAxLCBhbmQgdXAgdG8gMiwgMyBhbmQgMjAgQ0ZHX01CX0lORk9fRlJBRyBlbGVtZW50cyAqLworWFgzKCBDRkdfTUJfSU5GTywJCSAgaGNmXzE2LCBiYXNlX3R5cCwgaGNmXzE2LCBmcmFnX2NudCwgQ0ZHX01CX0lORk9fRlJBRywgZnJhZ19idWZbIDFdICkKK1hYMyggQ0ZHX01CX0lORk9fUkFOR0UxLCAgaGNmXzE2LCBiYXNlX3R5cCwgaGNmXzE2LCBmcmFnX2NudCwgQ0ZHX01CX0lORk9fRlJBRywgZnJhZ19idWZbIDFdICkKK1hYMyggQ0ZHX01CX0lORk9fUkFOR0UyLCAgaGNmXzE2LCBiYXNlX3R5cCwgaGNmXzE2LCBmcmFnX2NudCwgQ0ZHX01CX0lORk9fRlJBRywgZnJhZ19idWZbIDJdICkKK1hYMyggQ0ZHX01CX0lORk9fUkFOR0UzLCAgaGNmXzE2LCBiYXNlX3R5cCwgaGNmXzE2LCBmcmFnX2NudCwgQ0ZHX01CX0lORk9fRlJBRywgZnJhZ19idWZbIDNdICkKK1hYMyggQ0ZHX01CX0lORk9fUkFOR0UyMCwgaGNmXzE2LCBiYXNlX3R5cCwgaGNmXzE2LCBmcmFnX2NudCwgQ0ZHX01CX0lORk9fRlJBRywgZnJhZ19idWZbMjBdICkKKworWFgzKCBDRkdfTUJfQVNTRVJULCBoY2ZfMTYsIGxpbmUsIGhjZl8xNiwgdHJhY2UsIGhjZl8zMiwgcXVhbGlmaWVyICkJLypNQkluZm9CbG9jayBmb3IgYXNzZXJ0cwkqLworI2lmIChIQ0ZfQVNTRVJUKSAmICggSENGX0FTU0VSVF9MTktfTVNGX1JUTiB8IEhDRl9BU1NFUlRfUlRfTVNGX1JUTiApCit0eXBlZGVmIHZvaWQgKE1TRl9BU1NFUlRfUlROKSggdW5zaWduZWQgaW50ICwgaGNmXzE2LCBoY2ZfMzIgKTsKK3R5cGVkZWYgTVNGX0FTU0VSVF9SVE4gLypjYW4ndCBsaW5rIEZBUiovICogTVNGX0FTU0VSVF9SVE5QOworLyogQ0ZHX1JFR19BU1NFUlRfUlROUCAoMHgwODMyKQkoZGUtKXJlZ2lzdGVyIE1TRiBDYWxsYmFjayByb3V0aW5lcworICogbHZsOiAgQXNzZXJ0IGxldmVsIGZpbHRlcmluZyAobm90IHlldCBpbXBsZW1lbnRlZCkKKyAqIHJ0bnA6IGFkZHJlc3Mgb2YgTVNGX0FTU0VSVF9SVE4gKG5hdGl2ZSBFbmRpYW4gZm9ybWF0KSAqLworWFgyKCBDRkdfUkVHX0FTU0VSVF9SVE5QLCBoY2ZfMTYsIGx2bCwgTVNGX0FTU0VSVF9SVE5QLCBydG5wICkKKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROIC8gSENGX0FTU0VSVF9SVF9NU0ZfUlROCisKKyBYMSggQ0ZHX0hDRl9PUFQsIHZhbFsyMF0gKQkJCQkJCQkJCQkJICAJLyooQ29tcGlsZSB0aW1lKSBvcHRpb25zCSovCisgWDMoIENGR19DTURfSENGLCBjbWQsIG1vZGUsIGFkZF9pbmZvICkJCQkJCQkJCQkvKkhDRiBFbmdpbmVlcmluZyBjb21tYW5kCSovCisKK3R5cGVkZWYgc3RydWN0IHsKKwloY2ZfMTYJCWxlbjsKKwloY2ZfMTYJCXR5cDsKKwloY2ZfMTYJCW1vZGU7CQkJLy8gUFJPR19TVE9QL1ZPTEFUSUxFIFtGTEFTSC9TRUVQUk9NL1NFRVBST01fUkVBREJBQ0tdCisJaGNmXzE2CQlzZWdtZW50X3NpemU7ICAJLy8gc2l6ZSBvZiB0aGUgc2VnbWVudCBpbiBieXRlcworCWhjZl8zMgkJbmljX2FkZHI7ICAJCS8vIGRlc3RpbmF0aW9uIGFkZHJlc3MgKGluIE5JQyBtZW1vcnkpCisJaGNmXzE2CQlmbGFnczsJCQkvLyAweDAwMDEJOiBDUkMgWWVzL05vCisvLwloY2ZfMzIJCWZsYWdzOwkJCS8vIDB4MDAwMQk6IENSQyBZZXMvTm8KKwkvKiA7PyBzdGlsbCBub3QgdGhlIHdob2xlIHN0b3J5CisJICogZmxhZ3MgaXMgZXh0ZW5kZWQgZnJvbSAxNiB0byAzMiBiaXRzIHRvIGZvcmNlIHRoYXQgY29tcGlsaW5nIEZXLkMgcHJvZHVjZXMgdGhlIHNhbWUgc3RydWN0dXJlcworCSAqIGluIG1lbW9yeSBhcyBGVVBVNCBCSU4gZmlsZXMuCisJICogTm90ZSB0aGF0IHRoZSBwcm9ibGVtIGFyaXNlcyBmcm9tIHRoZSB2aW9sYXRpb24gb2YgdGhlIGNvbnN0cmFpbnQgdG8gdXNlIHBhY2tpbmcgYXQgYnl0ZSBib3VuZGFyaWVzCisJICogYXMgd2FzIHN0aXB1bGF0ZWQgaW4gdGhlIFdDSS1zcGVjaWZpY2F0aW9uCisJICogVGhlIFBhY2sgcHJhZ21hIGNhbid0IHJlc29sdmUgdGhpcyBpc3N1ZSwgYmVjYXVzZSB0aGF0IGltcGFjdHMgYWxsIG1lbWJlcnMgb2YgdGhlIHN0cnVjdHVyZSB3aXRoCisJICogZGlzcmVnYXJkIG9mIHRoZWlyIGFjdHVhbCBzaXplLCBzbyBhbGlnbmluZyBob3N0X2FkZHIgdW5kZXIgTVNWQyAxLjUgYXQgNCBieXRlcywgYWxzbyBhbGlnbnMKKwkgKiBsZW4sIHR5cCBldGMgb24gNCBieXRlcworCSAqICovCisvLwloY2ZfMTYJCXBhZDsgCSAJCS8vISEgYmUgY2FyZWZ1bCBhbGlnbm1lbnQgcHJvYmxlbXMgZm9yIEJpbiBkb3dubG9hZCB2ZXJzdXMgQyBkb3dubG9hZAorCWhjZl84IEZBUiAgICpob3N0X2FkZHI7ICAJLy8gc291cmNlIGFkZHJlc3MgKGluIEhvc3QgbWVtb3J5KQorfSBDRkdfUFJPR19TVFJDVDsgLy8gc2VnbWVudF9kZXNjcDsKKworLy8gYSBzdHJ1Y3R1cmUgdXNlZCBmb3IgdHJhbnNwb3J0aW5nIGRlYnVnLXJlbGF0ZWQgaW5mb3JtYXRpb24gZnJvbSBmaXJtd2FyZQorLy8gdmlhIHRoZSBIQ0YsIGludG8gdGhlIE1TRgordHlwZWRlZiBzdHJ1Y3QgeworICAgIGhjZl8xNiAgICAgIGxlbjsKKyAgICBoY2ZfMTYgICAgICB0eXA7CisgICAgaGNmXzE2ICAgICAgbXNnX2lkLCBtc2dfcGFyLCBtc2dfdHN0YW1wOworfSBDRkdfRldfUFJJTlRGX1NUUkNUOworCisvLyBhIHN0cnVjdHVyZSB1c2VkIHRvIGRlZmluZSB0aGUgbG9jYXRpb24gYW5kIHNpemUgb2YgYSBjZXJ0YWluIGRlYnVnLXJlbGF0ZWQKKy8vIGJ1ZmZlciBpbiBuaWMtcmFtLgordHlwZWRlZiBzdHJ1Y3QgeworICAgIGhjZl8xNiAgICAgIGxlbjsKKyAgICBoY2ZfMTYgICAgICB0eXA7CisgICAgaGNmXzMyICAgICAgRGJNc2dDb3VudCwgCS8vIGRzIChuaWNyYW0pIGFkZHJlc3Mgb2YgYSBjb3VudGVyCisgICAgICAgICAgICAgICAgRGJNc2dCdWZmZXIsIAkvLyBkcyAobmljcmFtKSBhZGRyZXNzIG9mIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICBEYk1zZ1NpemUsIAkJLy8gbnVtYmVyIG9mIGVudHJpZXMgKGVhY2ggMyB3b3JkIGluIHNpemUpIGluIHRoaXMgYnVmZmVyCisgICAgICAgICAgICAgICAgRGJNc2dJbnRydmw7CS8vIGRzIChuaWNyYW0pIGFkZHJlc3Mgb2YgaW50ZXJ2YWwgZm9yIGdlbmVyYXRpbmcgSW5mRHJvcCBldmVudAorfSBDRkdfRldfUFJJTlRGX0JVRkZFUl9MT0NBVElPTl9TVFJDVDsKKworWFgzKCBDRkdfUkFOR0VTLAloY2ZfMTYsIHJvbGUsIGhjZl8xNiwgaWQsIENGR19SQU5HRV9TUEVDX1NUUkNULCB2YXJfcmVjWyAxXSApIC8qQWN0b3IvU3VwcGxpZXIgcmFuZ2UgKDEgdmFyaWFudCkqLworWFgzKCBDRkdfUkFOR0UxLAloY2ZfMTYsIHJvbGUsIGhjZl8xNiwgaWQsIENGR19SQU5HRV9TUEVDX1NUUkNULCB2YXJfcmVjWyAxXSApIC8qQWN0b3IvU3VwcGxpZXIgcmFuZ2UgKDEgdmFyaWFudCkqLworWFgzKCBDRkdfUkFOR0UyLAloY2ZfMTYsIHJvbGUsIGhjZl8xNiwgaWQsIENGR19SQU5HRV9TUEVDX1NUUkNULCB2YXJfcmVjWyAyXSApIC8qQWN0b3IgcmFuZ2UgKCAyIHZhcmlhbnRzKQkJKi8KK1hYMyggQ0ZHX1JBTkdFMywJaGNmXzE2LCByb2xlLCBoY2ZfMTYsIGlkLCBDRkdfUkFOR0VfU1BFQ19TVFJDVCwgdmFyX3JlY1sgM10gKSAvKkFjdG9yIHJhbmdlICggMyB2YXJpYW50cykJCSovCitYWDMoIENGR19SQU5HRTQsCWhjZl8xNiwgcm9sZSwgaGNmXzE2LCBpZCwgQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QsIHZhcl9yZWNbIDRdICkgLypBY3RvciByYW5nZSAoIDQgdmFyaWFudHMpCQkqLworWFgzKCBDRkdfUkFOR0U1LAloY2ZfMTYsIHJvbGUsIGhjZl8xNiwgaWQsIENGR19SQU5HRV9TUEVDX1NUUkNULCB2YXJfcmVjWyA1XSApIC8qQWN0b3IgcmFuZ2UgKCA1IHZhcmlhbnRzKQkJKi8KK1hYMyggQ0ZHX1JBTkdFNiwJaGNmXzE2LCByb2xlLCBoY2ZfMTYsIGlkLCBDRkdfUkFOR0VfU1BFQ19TVFJDVCwgdmFyX3JlY1sgNl0gKSAvKkFjdG9yIHJhbmdlICggNiB2YXJpYW50cykJCSovCitYWDMoIENGR19SQU5HRTcsCWhjZl8xNiwgcm9sZSwgaGNmXzE2LCBpZCwgQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QsIHZhcl9yZWNbIDddICkgLypBY3RvciByYW5nZSAoIDcgdmFyaWFudHMpCQkqLworWFgzKCBDRkdfUkFOR0UyMCwJaGNmXzE2LCByb2xlLCBoY2ZfMTYsIGlkLCBDRkdfUkFOR0VfU1BFQ19TVFJDVCwgdmFyX3JlY1syMF0gKSAvKkFjdG9yIHJhbmdlICgyMCB2YXJpYW50cykJCSovCisKKy8qRnJhbWVzICovCisgWDMoIENGR19BU1NPQ19TVEFULCAgYXNzb2Nfc3RhdCwgc3RhdGlvbl9hZGRyWzNdLCB2YWxbNDZdICkgCS8qQXNzb2NpYXRpb24gc3RhdHVzLCBiYXNpYwkJCQkJKi8KKyBYMiggQ0ZHX0FTU09DX1NUQVQzLCBhc3NvY19zdGF0LCBzdGF0aW9uX2FkZHJbM10gKSAJCQkJCQkJCS8qYXNzb2Nfc3RhdDozCQkJKi8KKyBYMyggQ0ZHX0FTU09DX1NUQVQxLCBhc3NvY19zdGF0LCBzdGF0aW9uX2FkZHJbM10sIGZyYW1lX2JvZHlbNDNdICkJCQkJCS8qYXNzb2Nfc3RhdDoxCQkJKi8KKyBYNCggQ0ZHX0FTU09DX1NUQVQyLCBhc3NvY19zdGF0LCBzdGF0aW9uX2FkZHJbM10sIG9sZF9hcF9hZGRyWzNdLCBmcmFtZV9ib2R5WzQzXSApCS8qYXNzb2Nfc3RhdDoyCQkJKi8KKworLypTdGF0aWMgQ29uZmlndXJhdGlvbnMgKi8KKyBYMSggQ0ZHX0NORl9QT1JUX1RZUEUsCQkJCXBvcnRfdHlwZQkJCSApIC8qW1NUQV0gQ29ubmVjdGlvbiBjb250cm9sIGNoYXJhY3RlcmlzdGljcwkJCQkqLworIFgxKCBDRkdfTUFDX0FERFIsCQkJCQltYWNfYWRkclszXSAJCSApIC8qZ2VuZXJhbDogRkMwMSxGQzA4LEZDMTEsRkMxMixGQzEzLEZDMTQsRkMxNSxGQzE2IAkJKi8KKyBYMSggQ0ZHX0NORl9PV05fTUFDX0FERFIsCQkJbWFjX2FkZHJbM10JCQkgKQorIFgxKCBDRkdfSUQsCQkJCQkJc3NpZFsxN10JCQkgKSAvKjB4RkMwMiwgMHhGQzA0LCAweEZDMEUgCQkJCQkJCQkqLworLyoJWDEoIENGR19ERVNJUkVEX1NTSUQsCQkJc3NpZFsxN10JCQkgKQlzZWUgRHluYW1pYyBDb25maWd1cmF0aW9ucwkJCQkJCQkJKi8KKyBYMSggQ0ZHX0NORl9PV05fQ0hBTk5FTCwJCQljaGFubmVsCQkJCSApIC8qQ29tbXVuaWNhdGlvbiBjaGFubmVsIGZvciBCU1MgY3JlYXRpb24JCQkJCSovCisgWDEoIENGR19DTkZfT1dOX1NTSUQsCQkJCXNzaWRbMTddCQkJICkKKyBYMSggQ0ZHX0NORl9PV05fQVRJTV9XSU5ET1csCQlhdGltX3dpbmRvdwkJCSApCisgWDEoIENGR19DTkZfU1lTVEVNX1NDQUxFLAkJCXN5c3RlbV9zY2FsZQkJICkKKyBYMSggQ0ZHX0NORl9NQVhfREFUQV9MRU4sCQkJbWF4X2RhdGFfbGVuCQkgKQorIFgxKCBDRkdfQ05GX1dEU19BRERSLAkJCQltYWNfYWRkclszXQkJCSApIC8qW1NUQV0gTUFDIEFkZHJlc3Mgb2YgY29ycmVzcG9uZGluZyBXRFMgTGluayBub2RlCQkqLworIFgxKCBDRkdfQ05GX1BNX0VOQUJMRUQsCQkJcG1fZW5hYmxlZAkJCSApIC8qW1NUQV0gU3dpdGNoIGZvciBFU1MgUG93ZXIgTWFuYWdlbWVudCAoUE0pIE9uL09mZgkJKi8KKyBYMSggQ0ZHX0NORl9QTV9FUFMsCQkJCXBtX2VwcwkJCQkgKSAvKltTVEFdIFN3aXRjaCBmb3IgRVNTIFBNIEVQUy9QUyBNb2RlCQkJCQkqLworIFgxKCBDRkdfQ05GX01DQVNUX1JYLAkJCQltY2FzdF9yeAkJCSApIC8qW1NUQV0gU3dpdGNoIGZvciBFU1MgUE0gTXVsdGljYXN0IHJlY2VwdGlvbiBPbi9PZmYJCSovCisgWDEoIENGR19DTkZfTUFYX1NMRUVQX0RVUkFUSU9OLAlkdXJhdGlvbgkJCSApIC8qW1NUQV0gTWF4aW11bSBzbGVlcCB0aW1lIGZvciBFU1MgUE0JCQkJCSovCisgWDEoIENGR19DTkZfUE1fSE9MRE9WRVJfRFVSQVRJT04sCWR1cmF0aW9uCQkJICkgLypbU1RBXSBIb2xkb3ZlciB0aW1lIGZvciBFU1MgUE0JCQkJCQkJKi8KKyBYMSggQ0ZHX0NORl9PV05fTkFNRSwJCQkJc3NpZFsxN10JCQkgKSAvKklkZW50aWZpY2F0aW9uIHRleHQgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMJCQkqLworIFgxKCBDRkdfQ05GX09XTl9EVElNX1BFUklPRCwJCXBlcmlvZAkJCQkgKSAvKltBUF0gQmVhY29uIGludGVydmFscyBiZXR3ZWVuIHN1Y2Nlc3NpdmUgRFRJTXMJCQkqLworIFgxKCBDRkdfQ05GX1dEU19BRERSMSwJCQkJbWFjX2FkZHJbM10JCQkgKSAvKltBUF0gUG9ydCAxIE1BQyBBZHJzIG9mIGNvcnJlc3BvbmRpbmcgV0RTIExpbmsgbm9kZQkqLworIFgxKCBDRkdfQ05GX1dEU19BRERSMiwJCQkJbWFjX2FkZHJbM10JCQkgKSAvKltBUF0gUG9ydCAyIE1BQyBBZHJzIG9mIGNvcnJlc3BvbmRpbmcgV0RTIExpbmsgbm9kZQkqLworIFgxKCBDRkdfQ05GX1dEU19BRERSMywJCQkJbWFjX2FkZHJbM10JCQkgKSAvKltBUF0gUG9ydCAzIE1BQyBBZHJzIG9mIGNvcnJlc3BvbmRpbmcgV0RTIExpbmsgbm9kZQkqLworIFgxKCBDRkdfQ05GX1dEU19BRERSNCwJCQkJbWFjX2FkZHJbM10JCQkgKSAvKltBUF0gUG9ydCA0IE1BQyBBZHJzIG9mIGNvcnJlc3BvbmRpbmcgV0RTIExpbmsgbm9kZQkqLworIFgxKCBDRkdfQ05GX1dEU19BRERSNSwJCQkJbWFjX2FkZHJbM10JCQkgKSAvKltBUF0gUG9ydCA1IE1BQyBBZHJzIG9mIGNvcnJlc3BvbmRpbmcgV0RTIExpbmsgbm9kZQkqLworIFgxKCBDRkdfQ05GX1dEU19BRERSNiwJCQkJbWFjX2FkZHJbM10JCQkgKSAvKltBUF0gUG9ydCA2IE1BQyBBZHJzIG9mIGNvcnJlc3BvbmRpbmcgV0RTIExpbmsgbm9kZQkqLworIFgxKCBDRkdfQ05GX01DQVNUX1BNX0JVRiwJCQltY2FzdF9wbV9idWYJCSApIC8qW0FQXSBTd2l0Y2ggZm9yIFBNIGJ1ZmZlcmluZyBvZiBNdWx0aWNhc3QgTWVzc2FnZXMJKi8KKyBYMSggQ0ZHX0NORl9SRUpFQ1RfQU5ZLAkJCXJlamVjdF9hbnkJCQkgKSAvKltBUF0gU3dpdGNoIGZvciBQTSBidWZmZXJpbmcgb2YgTXVsdGljYXN0IE1lc3NhZ2VzCSovCisvL1gxKCBDRkdfQ05GX0VOQ1JZUFRJT05fRU5BQkxFRCwJZW5jcnlwdGlvbgkJCSApIC8qc3BlY2lmeSBlbmNyeXB0aW9uIHR5cGUgb2YgVHgvUnggbWVzc2FnZXMJCQkJKi8KKyBYMSggQ0ZHX0NORl9FTkNSWVBUSU9OLAkJCWVuY3J5cHRpb24JCQkgKSAvKnNwZWNpZnkgZW5jcnlwdGlvbiB0eXBlIG9mIFR4L1J4IG1lc3NhZ2VzCQkJCSovCisgWDEoIENGR19DTkZfQVVUSEVOVElDQVRJT04sCQlhdXRoZW50aWNhdGlvbgkJICkgLypzZWxlY3RzIEF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobQkJCQkJCSovCisgWDEoIENGR19DTkZfRVhDTF9VTkVOQ1JZUFRFRCwJCWV4Y2x1ZGVfdW5lbmNyeXB0ZWQJICkgLypbQVBdIFN3aXRjaCBmb3IgJ2NsZWFyLXRleHQnIHJ4IG1lc3NhZ2UgYWNjZXB0YW5jZQkJKi8KKyBYMSggQ0ZHX0NORl9NQ0FTVF9SQVRFLAkJCW1jYXN0X3JhdGUJCQkgKSAvKlRyYW5zbWl0IERhdGEgcmF0ZSBmb3IgTXVsdGljYXN0IGZyYW1lcwkJCQkqLworIFgxKCBDRkdfQ05GX0lOVFJBX0JTU19SRUxBWSwJCWludHJhX2Jzc19yZWxheQkJICkgLypbQVBdIFN3aXRjaCBmb3IgSW50cmFCQlMgcmVsYXkJCQkJCQkJKi8KKyBYMSggQ0ZHX0NORl9NSUNST19XQVZFLAkJCW1pY3JvX3dhdmUJCQkgKSAvKk1pY3JvV2F2ZSAoUm9idXN0bmVzcykJCQkJCQkJCQkqLworIFgxKCBDRkdfQ05GX0xPQURfQkFMQU5DSU5HLAkJbG9hZF9iYWxhbmNpbmcJCSApIC8qTG9hZCBCYWxhbmNpbmcJICAoQm9vbGVhbiwgMD1PRkYsIDE9T04sIGRlZmF1bHQ9MSkJCSovCisgWDEoIENGR19DTkZfTUVESVVNX0RJU1RSSUJVVElPTiwJbWVkaXVtX2Rpc3RyaWJ1dGlvbgkgKSAvKk1lZGl1bSBEaXN0cmlidXRpb24gKEJvb2xlYW4sIDA9T0ZGLCAxPU9OLCBkZWZhdWx0PTEpCSovCisgWDEoIENGR19DTkZfR1JPVVBfQUREUl9GSUxURVIsCQlncm91cF9hZGRyX2ZpbHRlcgkgKSAvKkdyb3VwIEFkZHJlc3MgRmlsdGVyCQkJCQkJCQkgICAJKi8KKyBYMSggQ0ZHX0NORl9UWF9QT1dfTFZMLAkJCXR4X3Bvd19sdmwJCQkgKSAvKlR4IFBvd2VyIExldmVsCQkJCQkJCQkJCSAgIAkqLworWFg0KCBDRkdfQ05GX0NPVU5UUllfSU5GTywJCQkJCQkJCSBcCisJCWhjZl8xNiwgbl9jaGFubmVsX3NldHMsIGhjZl8xNiwgY291bnRyeV9jb2RlWzJdLCBcCisJCWhjZl8xNiwgZW52aXJvbm1lbnQsIENIQU5ORUxfU0VULCBjaGFubmVsX3NldFsxXSApIC8qQ3VycmVudCBDb3VudHJ5IEluZm8gIAkJCQkJCQkJCSovCitYWDQoIENGR19DTkZfQ09VTlRSWV9JTkZPX01BWCwJCQkJCQkJIFwKKwkJaGNmXzE2LCBuX2NoYW5uZWxfc2V0cywgaGNmXzE2LCBjb3VudHJ5X2NvZGVbMl0sIFwKKwkJaGNmXzE2LCBlbnZpcm9ubWVudCwgQ0hBTk5FTF9TRVQsIGNoYW5uZWxfc2V0WzE0XSkgLypDdXJyZW50IENvdW50cnkgSW5mbyAgCQkJCQkJCQkJKi8KKworLypEeW5hbWljIENvbmZpZ3VyYXRpb25zICovCisgWDEoIENGR19ERVNJUkVEX1NTSUQsCQkJc3NpZFsxN10JCQkJCSApCS8qW1NUQV0gU2VydmljZSBTZXQgaWRlbnRpZmljYXRpb24gZm9yIGNvbm5lY3Rpb24JKi8KKyNkZWZpbmUgR1JPVVBfQUREUl9TSVpFCQkJKDMyICogNikJCQkJCQkvLzMyIDYtYnl0ZSBNQUMtYWRkcmVzc2VzCisgWDEoIENGR19HUk9VUF9BRERSLAkJCW1hY19hZGRyW0dST1VQX0FERFJfU0laRS8yXQkgKQkvKltTVEFdIE11bHRpY2FzdCBNQUMgQWRkcmVzc2VzIGZvciBSeC1tZXNzYWdlCQkqLworIFgxKCBDRkdfQ1JFQVRFX0lCU1MsCQkJY3JlYXRlX2lic3MJCQkJCSApCS8qW1NUQV0gU3dpdGNoIGZvciBJQlNTIGNyZWF0aW9uIE9uL09mZgkJCQkqLworIFgxKCBDRkdfUlRTX1RIUkgsCQkJCXJ0c190aHJoCQkJCQkgKQkvKltTVEFdIEZyYW1lIGxlbmd0aCB1c2VkIGZvciBSVFMvQ1RTIGhhbmRzaGFrZQkJKi8KKyBYMSggQ0ZHX1RYX1JBVEVfQ05UTCwJCQl0eF9yYXRlX2NudGwJCQkJICkJLypbU1RBXSBEYXRhIHJhdGUgY29udHJvbCBmb3IgbWVzc2FnZSB0cmFuc21pc3Npb24JKi8KKyBYMSggQ0ZHX1BST01JU0NVT1VTX01PREUsCQlwcm9taXNjdW91c19tb2RlCQkJICkJLypbU1RBXSBTd2l0Y2ggZm9yIFByb21pc2N1b3VzIG1vZGUgcmVjZXB0aW9uIE9uL09mCSovCisgWDEoIENGR19XT0wsCQkJCQl3YWtlX29uX2xhbgkJCQkJICkJLypbU1RBXSBTd2l0Y2ggZm9yIFdha2UtT24tTEFOIG1vZGUJCQkJCSovCisgWDEoIENGR19SVFNfVEhSSDAsCQkJCXJ0c190aHJoCQkJCQkgKQkvKltBUF0gUG9ydCAwIGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UJKi8KKyBYMSggQ0ZHX1JUU19USFJIMSwJCQkJcnRzX3RocmgJCQkJCSApCS8qW0FQXSBQb3J0IDEgZnJhbWUgbGVuZ3RoIGZvciBSVFMvQ1RTIGhhbmRzaGFrZQkqLworIFgxKCBDRkdfUlRTX1RIUkgyLAkJCQlydHNfdGhyaAkJCQkJICkJLypbQVBdIFBvcnQgMiBmcmFtZSBsZW5ndGggZm9yIFJUUy9DVFMgaGFuZHNoYWtlCSovCisgWDEoIENGR19SVFNfVEhSSDMsCQkJCXJ0c190aHJoCQkJCQkgKQkvKltBUF0gUG9ydCAzIGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UJKi8KKyBYMSggQ0ZHX1JUU19USFJINCwJCQkJcnRzX3RocmgJCQkJCSApCS8qW0FQXSBQb3J0IDQgZnJhbWUgbGVuZ3RoIGZvciBSVFMvQ1RTIGhhbmRzaGFrZQkqLworIFgxKCBDRkdfUlRTX1RIUkg1LAkJCQlydHNfdGhyaAkJCQkJICkJLypbQVBdIFBvcnQgNSBmcmFtZSBsZW5ndGggZm9yIFJUUy9DVFMgaGFuZHNoYWtlCSovCisgWDEoIENGR19SVFNfVEhSSDYsCQkJCXJ0c190aHJoCQkJCQkgKQkvKltBUF0gUG9ydCA2IGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UJKi8KKyBYMSggQ0ZHX1RYX1JBVEVfQ05UTDAsCQkJcmF0ZV9jbnRsIAkJCQkJICkJLypbQVBdIFBvcnQgMCBkYXRhIHJhdGUgY29udHJvbCBmb3IgdHJhbnNtaXNzaW9uCSovCisgWDEoIENGR19UWF9SQVRFX0NOVEwxLAkJCXJhdGVfY250bAkJCQkJICkJLypbQVBdIFBvcnQgMSBkYXRhIHJhdGUgY29udHJvbCBmb3IgdHJhbnNtaXNzaW9uCSovCisgWDEoIENGR19UWF9SQVRFX0NOVEwyLAkJCXJhdGVfY250bAkJCQkJICkJLypbQVBdIFBvcnQgMiBkYXRhIHJhdGUgY29udHJvbCBmb3IgdHJhbnNtaXNzaW9uCSovCisgWDEoIENGR19UWF9SQVRFX0NOVEwzLAkJCXJhdGVfY250bAkJCQkJICkJLypbQVBdIFBvcnQgMyBkYXRhIHJhdGUgY29udHJvbCBmb3IgdHJhbnNtaXNzaW9uCSovCisgWDEoIENGR19UWF9SQVRFX0NOVEw0LAkJCXJhdGVfY250bAkJCQkJICkJLypbQVBdIFBvcnQgNCBkYXRhIHJhdGUgY29udHJvbCBmb3IgdHJhbnNtaXNzaW9uCSovCisgWDEoIENGR19UWF9SQVRFX0NOVEw1LAkJCXJhdGVfY250bAkJCQkJICkJLypbQVBdIFBvcnQgNSBkYXRhIHJhdGUgY29udHJvbCBmb3IgdHJhbnNtaXNzaW9uCSovCisgWDEoIENGR19UWF9SQVRFX0NOVEw2LAkJCXJhdGVfY250bAkJCQkJICkJLypbQVBdIFBvcnQgNiBkYXRhIHJhdGUgY29udHJvbCBmb3IgdHJhbnNtaXNzaW9uCSovCitYWDEoIENGR19ERUZBVUxUX0tFWVMsCQkJS0VZX1NUUkNULCBrZXlbNF0JCQkgKQkvKmRlZmluZXMgc2V0IG9mIGVuY3J5cHRpb24ga2V5cwkJCQkJKi8KKyBYMSggQ0ZHX1RYX0tFWV9JRCwJCQkJdHhfa2V5X2lkCQkJCQkgKQkvKnNlbGVjdCBrZXkgZm9yIGVuY3J5cHRpb24gb2YgVHggbWVzc2FnZXMJCQkqLworIFgxKCBDRkdfU0NBTl9TU0lELAkJCQlzc2lkWzE3XQkJCQkJICkJLyppZGVudGlmaWNhdGlvbiBmb3IgY29ubmVjdGlvbgkJCQkJCSovCisgWDUoIENGR19BRERfVEtJUF9ERUZBVUxUX0tFWSwJCQkJCQkJCSBcCisJCSB0a2lwX2tleV9pZF9pbmZvLCB0a2lwX2tleV9pdl9pbmZvWzRdLCB0a2lwX2tleVs4XSwgXAorCQkgdHhfbWljX2tleVs0XSwgcnhfbWljX2tleVs0XSAJCQkJCQkgKQkvKgkJCQkJCQkJCQkgICAgICAgCQkqLworIFg2KCBDRkdfQUREX1RLSVBfTUFQUEVEX0tFWSwJYnNzaWRbM10sIHRraXBfa2V5WzhdLCAJCSBcCisJCSB0c2NbNF0sIHJzY1s0XSwgdHhfbWljX2tleVs0XSwgcnhfbWljX2tleVs0XSAJCSApCS8qCQkJCQkJCQkJCSAgICAgICAJCSovCisgWDEoIENGR19TRVRfU1NOX0FVVEhFTlRJQ0FUSU9OX1NVSVRFLCAJCQkJCQkgXAorCQkgc3NuX2F1dGhlbnRpY2F0aW9uX3N1aXRlCQkJCQkJCSApCS8qCQkJCQkJCQkJCQkgICAJCSovCisgWDEoIENGR19SRU1PVkVfVEtJUF9ERUZBVUxUX0tFWSx0a2lwX2tleV9pZAkJCQkgKQkvKgkJCQkJCQkJCQkJICAgCQkqLworIFgxKCBDRkdfVElDS19USU1FLAkJCQl0aWNrX3RpbWUJCQkJCSApCS8qQXV4aWxpYXJ5IFRpbWVyIHRpY2sgaW50ZXJ2YWwJCQkJCQkqLworIFgxKCBDRkdfRERTX1RJQ0tfVElNRSwJCQl0aWNrX3RpbWUJCQkJCSApCS8qRGlzY29ubmVjdGVkIERlZXBTbGVlcCBUaW1lciB0aWNrIGludGVydmFsCQkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBBZGRlZCBmb3IgUGF0dGVybi1tYXRjaGluZyBXYWtlT25MYW4uIChTZWUgZmlybXdhcmUgZGVzaWduIG5vdGUgV01ETjI4MUMpCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBXT0xfUEFUVEVSTlMJCQkJNQkJLy8gbWF4aW11bSBvZiA1IHBhdHRlcm5zIGluIGZpcm13YXJlCisjZGVmaW5lIFdPTF9QQVRURVJOX0xFTgkJCQkxMjQJCS8vIG1heGltdW0gMTI0IGJ5dGVzIHBhdHRlcm4gbGVuZ3RoIHBlciBwYXR0ZXJuIGluIGZpcm13YXJlCisjZGVmaW5lIFdPTF9NQVNLX0xFTgkJCSAJMzAJCS8vIG1heGltdW0gMzAgYnl0ZXMgbWFzayBsZW5ndGggcGVyIHBhdHRlcm4gaW4gZmlybXdhcmUKKyNkZWZpbmUgV09MX0JVRl9TSVpFCShXT0xfUEFUVEVSTlMgKiAoV09MX1BBVFRFUk5fTEVOICsgV09MX01BU0tfTEVOICsgNikgLyAyKQorWDIoIENGR19XT0xfUEFUVEVSTlMsIG5QYXR0ZXJucywgYnVmZmVyW1dPTF9CVUZfU0laRV0JCSApICAvKltTVEFdIFdha2VPbkxhbiBwYXR0ZXJuIG1hdGNoLCByb29tIGZvciA1IHBhdHRlcm5zKi8KKworIFg1KCBDRkdfU1VQX1JBTkdFLAkJcm9sZSwgaWQsIHZhcmlhbnQsIGJvdHRvbSwgdG9wCQkJCSAgICkgLypbUFJJXSBQcmltYXJ5IFN1cHBsaWVyIGNvbXBhdGliaWxpdHkgcmFuZ2UJCSovCisvKiBOSUMgSW5mb3JtYXRpb24gKi8KKyBYNCggQ0ZHX0lERU5USVRZLAkJCWNvbXBfaWQsIHZhcmlhbnQsIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IgKSAvKmlkZW50aWZpY2F0aW9uIFByb3RvdHlwZQkJCQkJCQkqLworI2RlZmluZSBDRkdfRFJWX0lERU5USVRZX1NUUkNUCUNGR19JREVOVElUWV9TVFJDVAorI2RlZmluZSBDRkdfUFJJX0lERU5USVRZX1NUUkNUCUNGR19JREVOVElUWV9TVFJDVAorI2RlZmluZSBDRkdfTklDX0lERU5USVRZX1NUUkNUCUNGR19JREVOVElUWV9TVFJDVAorI2RlZmluZSBDRkdfRldfSURFTlRJVFlfU1RSQ1QJQ0ZHX0lERU5USVRZX1NUUkNUCisgWDEoIENGR19SSURfSU5GX01JTiwJCXkJCQkJCQkJCQkJCSAgICkgLypsb3dlc3QgdmFsdWUgcmVwcmVzZW50aW5nIGFuIEluZm9ybWF0aW9uIFJJRAkJKi8KKyBYMSggQ0ZHX01BWF9MT0FEX1RJTUUsCQltYXhfbG9hZF90aW1lCQkJCQkJCQkgICApIC8qW1BSSV0gTWF4IHJlc3BvbnNlIHRpbWUgb2YgdGhlIERvd25sb2FkIGNvbW1hbmQJKi8KKyBYMyggQ0ZHX0RMX0JVRiwJCQlidWZfcGFnZSwgYnVmX29mZnNldCwgYnVmX2xlbgkJCQkgICApIC8qW1BSSV0gRG93bmxvYWQgYnVmZmVyIGxvY2F0aW9uIGFuZCBzaXplCQkJKi8KKy8vIFg1KCBDRkdfUFJJX1NVUF9SQU5HRSwJCXJvbGUsIGlkLCB2YXJpYW50LCBib3R0b20sIHRvcAkJCQkgICApIC8qW1BSSV0gUHJpbWFyeSBTdXBwbGllciBjb21wYXRpYmlsaXR5IHJhbmdlCQkqLworIFg1KCBDRkdfQ0ZJX0FDVF9SQU5HRVNfUFJJLHJvbGUsIGlkLCB2YXJpYW50LCBib3R0b20sIHRvcAkJCQkgICApIC8qW1BSSV0gQ29udHJvbGxlciBBY3RvciBjb21wYXRpYmlsaXR5IHJhbmdlcwkJKi8KKy8vIFg1KCBDRkdfTklDX0hTSV9TVVBfUkFOR0UsCXJvbGUsIGlkLCB2YXJpYW50LCBib3R0b20sIHRvcAkJCQkgICApIC8qSC9XIC0gUy9XIEkvRiBzdXBwbGllciByYW5nZQkJCQkJCSovCisgWDEoIENGR19OSUNfU0VSSUFMX05VTUJFUiwJc2VyaWFsX251bWJlclsxN10JCQkJCQkJICAgKSAvKltQUkldIE5ldHdvcmsgSS9GIENhcmQgc2VyaWFsIG51bWJlcgkJCQkqLworIFg1KCBDRkdfTklDX01GSV9TVVBfUkFOR0UsCXJvbGUsIGlkLCB2YXJpYW50LCBib3R0b20sIHRvcAkJCQkgICApIC8qW1BSSV0gTW9kZW0gSS9GIFN1cHBsaWVyIGNvbXBhdGliaWxpdHkgcmFuZ2UJCSovCisgWDUoIENGR19OSUNfQ0ZJX1NVUF9SQU5HRSwJcm9sZSwgaWQsIHZhcmlhbnQsIGJvdHRvbSwgdG9wCQkJCSAgICkgLypbUFJJXSBDb250cm9sbGVyIEkvRiBTdXBwbGllciBjb21wYXRpYmlsaXR5IHJhbmdlKi8KKy8vSC1JIFgxKCBDRkdfQ0hBTk5FTF9MSVNULAkJY2hhbm5lbF9saXN0CQkJCQkJCQkgICApIC8qQWxsb3dlZCBjb21tdW5pY2F0aW9uIGNoYW5uZWxzCQkJCQkqLworLy9ILUkgWFgyKCBDRkdfUkVHX0RPTUFJTlMsCQloY2ZfMTYsIG51bV9kb21haW4sIGhjZl84LCByZWdfZG9tYWluc1sxMF0JICAgKSAvKkxpc3Qgb2YgaW50ZW5kZWQgcmVndWxhdG9yeSBkb21haW5zCQkJCSovCisgWDEoIENGR19OSUNfVEVNUF9UWVBFLAkJdGVtcF90eXBlCQkJCQkJCQkJICAgKSAvKkhhcmR3YXJlIHRlbXBlcmF0dXJlIHJhbmdlIGNvZGUJCQkJCSovCisvL0gtSSBYMSggQ0ZHX0NJUywJCQkJY2lzWzI0MF0JCQkJCQkJCQkgICApIC8qUEMgQ2FyZCBTdGFuZGFyZCBDYXJkIEluZm9ybWF0aW9uIFN0cnVjdHVyZQkJKi8KKyBYNSggQ0ZHX05JQ19QUk9GSUxFLAkJCQkJCQkJCQkJCQkgICBcCisJCSBwcm9maWxlX2NvZGUsIGNhcGFiaWxpdHlfb3B0aW9ucywgYWxsb3dlZF9kYXRhX3JhdGVzLCB2YWw0LCB2YWw1ICApIC8qQ2FyZCBQcm9maWxlCQkJCQkJCQkJCSovCisvLyBYNSggQ0ZHX0ZXX1NVUF9SQU5HRSwJCXJvbGUsIGlkLCB2YXJpYW50LCBib3R0b20sIHRvcAkJCQkgICApIC8qW1NUQV0gU3RhdGlvbiBJL0YgU3VwcGxpZXIgY29tcGF0aWJpbGl0eSByYW5nZQkqLworIFg1KCBDRkdfTUZJX0FDVF9SQU5HRVMsCXJvbGUsIGlkLCB2YXJpYW50LCBib3R0b20sIHRvcAkJCQkgICApIC8qW1NUQV0gTW9kZW0gSS9GIEFjdG9yIGNvbXBhdGliaWxpdHkgcmFuZ2VzCQkqLworIFg1KCBDRkdfQ0ZJX0FDVF9SQU5HRVNfU1RBLHJvbGUsIGlkLCB2YXJpYW50LCBib3R0b20sIHRvcAkJCQkgICApIC8qW1NUQV0gQ29udHJvbGxlciBJL0YgQWN0b3IgY29tcGF0aWJpbGl0eSByYW5nZXMJKi8KKyBYNSggQ0ZHX01GSV9BQ1RfUkFOR0VTX1NUQSxyb2xlLCBpZCwgdmFyaWFudCwgYm90dG9tLCB0b3AJCQkJICAgKSAvKltTVEFdIENvbnRyb2xsZXIgSS9GIEFjdG9yIGNvbXBhdGliaWxpdHkgcmFuZ2VzCSovCisgWDEoIENGR19OSUNfQlVTX1RZUEUsCQluaWNfYnVzX3R5cGUJCQkJCQkJCSAgICkgLypOSUMgYnVzdHlwZSBkZXJpdmVkIGZyb20gQlVTU0VMIGhvc3QgSS9GIHNpZ25hbHMgKi8KKworLyoJTUFDIElORk9STUFUSU9OCSovCisgWDEoIENGR19QT1JUX1NUQVQsCQkJCXBvcnRfc3RhdAkJCQkJCQkgKSAvKltTVEFdIEFjdHVhbCBNQUMgUG9ydCBjb25uZWN0aW9uIGNvbnRyb2wgc3RhdHVzCQkqLworIFgxKCBDRkdfQ1VSX1NTSUQsCQkJCXNzaWRbMTddCQkJCQkJCSApIC8qW1NUQV0gSWRlbnRpZmljYXRpb24gb2YgdGhlIGFjdHVhbGx5IGNvbm5lY3RlZCBTUwkJKi8KKyBYMSggQ0ZHX0NVUl9CU1NJRCwJCQkJbWFjX2FkZHJbM10JCQkJCQkJICkgLypbU1RBXSBJZGVudGlmaWNhdGlvbiBvZiB0aGUgYWN0dWFsbHkgY29ubmVjdGVkIEJTUwkJKi8KKyBYMyggQ0ZHX0NPTU1TX1FVQUxJVFksCQkJY29tc19xdWFsLCBzaWduYWxfbHZsLCBub2lzZV9sdmwJICkgLypbU1RBXSBRdWFsaXR5IG9mIHRoZSBCYXNpYyBTZXJ2aWNlIFNldCBjb25uZWN0aW9uCQkqLworIFgxKCBDRkdfQ1VSX1RYX1JBVEUsCQkJcmF0ZQkJCQkJCQkJICkgLypbU1RBXSBBY3R1YWwgdHJhbnNtaXQgZGF0YSByYXRlCQkJCQkJKi8KKyBYMSggQ0ZHX0NVUl9CRUFDT05fSU5URVJWQUwsCWludGVydmFsCQkJCQkJCSApIC8qQmVhY29uIHRyYW5zbWl0IGludGVydmFsIHRpbWUgZm9yIEJTUyBjcmVhdGlvbgkJCSovCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dBUlAKKyBYMTEoIENGR19DVVJfU0NBTEVfVEhSSCwJCQkJCQkJCQkJCSBcCisJIGNhcnJpZXJfZGV0ZWN0X3RocmhfY2NrLCBjYXJyaWVyX2RldGVjdF90aHJoX29mZG0sIGRlZmVyX3RocmgsCSBcCisJIGVuZXJneV9kZXRlY3RfdGhyaCwgcnNzaV9vbl90aHJoX2RldmlhdGlvbiwgCQkJCQkgXAorCSByc3NpX29mZl90aHJoX2RldmlhdGlvbiwgY2NrX2Ryb3BfdGhyaCwgb2ZkbV9kcm9wX3RocmgsIAkJIFwKKwkgY2VsbF9zZWFyY2hfdGhyaCwgb3V0X29mX3JhbmdlX3RocmgsIGRlbHRhX3NucgkJCQkgKQorI2Vsc2UKKyBYNiggQ0ZHX0NVUl9TQ0FMRV9USFJILAkJCQkJCQkJCQkJIFwKKwkgZW5lcmd5X2RldGVjdF90aHJoLCBjYXJyaWVyX2RldGVjdF90aHJoLCBkZWZlcl90aHJoLCAJCQkgXAorCSBjZWxsX3NlYXJjaF90aHJoLCBvdXRfb2ZfcmFuZ2VfdGhyaCwgZGVsdGFfc25yCQkJCQkgKSAvKkFjdHVhbCBTeXN0ZW0gU2NhbGUgdGhyZXNob2xkcyBzZXR0aW5ncwkJCQkqLworI2VuZGlmIC8vIEhDRl9UWVBFX1dBUlAKKyBYMSggQ0ZHX1BST1RPQ09MX1JTUF9USU1FLAkJdGltZQkJCQkJCQkJICkgLypNYXggdGltZSB0byBhd2FpdCBhIHJlc3BvbnNlIHRvIGEgcmVxdWVzdCBtZXNzYWdlCQkqLworIFgxKCBDRkdfQ1VSX1NIT1JUX1JFVFJZX0xJTUlULAlsaW1pdAkJCQkJCQkJICkgLypNYXggbnVtYmVyIG9mIHRyYW5zbWl0IGF0dGVtcHRzIGZvciBzaG9ydCBmcmFtZXMJCSovCisgWDEoIENGR19DVVJfTE9OR19SRVRSWV9MSU1JVCwJbGltaXQJCQkJCQkJCSApIC8qTWF4IG51bWJlciBvZiB0cmFuc21pdCBhdHRlbXB0cyBmb3IgbG9uZyBmcmFtZXMJCSovCisgWDEoIENGR19NQVhfVFhfTElGRVRJTUUsCQl0aW1lCQkJCQkJCQkgKSAvKk1heCB0cmFuc21pdCBmcmFtZSBoYW5kbGluZyBkdXJhdGlvbgkJCQkJKi8KKyBYMSggQ0ZHX01BWF9SWF9MSUZFVElNRSwJCXRpbWUJCQkJCQkJCSApIC8qTWF4IHJlY2VpdmVkIGZyYW1lIGhhbmRsaW5nIGR1cmF0aW9uCQkJCQkqLworIFgxKCBDRkdfQ0ZfUE9MTEFCTEUsCQkJY2ZfcG9sbGFibGUJCQkJCQkJICkgLypbU1RBXSBDb250ZW50aW9uIEZyZWUgcG9sbGFibGUgY2FwYWJpbGl0eSBpbmRpY2F0aW9uCSovCisgWDIoIENGR19BVVRIRU5USUNBVElPTl9BTEdPUklUSE1TLGF1dGhlbnRpY2F0aW9uX3R5cGUsIHR5cGVfZW5hYmxlZCApIC8qQXV0aGVudGljYXRpb24gQWxnb3JpdGhtCQkJCQkJCQkqLworIFgxKCBDRkdfUFJJVkFDWV9PUFRfSU1QTEVNRU5URUQscHJpdmFjeV9vcHRfaW1wbGVtZW50ZWQJCQkgKSAvKldFUCBPcHRpb24gYXZhaWxhYmlsaXR5IGluZGljYXRpb24JCQkJCQkqLworIFgxKCBDRkdfQ1VSX1JFTU9URV9SQVRFUywJCXJhdGVzCQkJCQkJCQkgKSAvKkN1cnJlbnRSZW1vdGVSYXRlcwkJCQkJCQkJCQkqLworIFgxKCBDRkdfQ1VSX1VTRURfUkFURVMsCQlyYXRlcwkJCQkJCQkJICkgLypDdXJyZW50VXNlZFJhdGVzCQkJCQkJCQkJCSovCisgWDEoIENGR19DVVJfU1lTVEVNX1NDQUxFLAkJY3VycmVudF9zeXN0ZW1fc2NhbGUJCQkJICkgLypDdXJyZW50VXNlZFJhdGVzCQkJCQkJCQkJCSovCisgWDEoIENGR19DVVJfVFhfUkFURTEsCQkJcmF0ZSAJCQkJCQkJCSApIC8qW0FQXSBBY3R1YWwgUG9ydCAxIHRyYW5zbWl0IGRhdGEgcmF0ZQkJCQkJKi8KKyBYMSggQ0ZHX0NVUl9UWF9SQVRFMiwJCQlyYXRlCQkJCQkJCQkgKSAvKltBUF0gQWN0dWFsIFBvcnQgMiB0cmFuc21pdCBkYXRhIHJhdGUJCQkJCSovCisgWDEoIENGR19DVVJfVFhfUkFURTMsCQkJcmF0ZQkJCQkJCQkJICkgLypbQVBdIEFjdHVhbCBQb3J0IDMgdHJhbnNtaXQgZGF0YSByYXRlCQkJCQkqLworIFgxKCBDRkdfQ1VSX1RYX1JBVEU0LAkJCXJhdGUJCQkJCQkJCSApIC8qW0FQXSBBY3R1YWwgUG9ydCA0IHRyYW5zbWl0IGRhdGEgcmF0ZQkJCQkJKi8KKyBYMSggQ0ZHX0NVUl9UWF9SQVRFNSwJCQlyYXRlCQkJCQkJCQkgKSAvKltBUF0gQWN0dWFsIFBvcnQgNSB0cmFuc21pdCBkYXRhIHJhdGUJCQkJCSovCisgWDEoIENGR19DVVJfVFhfUkFURTYsCQkJcmF0ZQkJCQkJCQkJICkgLypbQVBdIEFjdHVhbCBQb3J0IDYgdHJhbnNtaXQgZGF0YSByYXRlCQkJCQkqLworIFgxKCBDRkdfT1dOX01BQ19BRERSLAkJCW1hY19hZGRyWzNdCQkJCQkJCSApIC8qW0FQXSBVbmlxdWUgbG9jYWwgbm9kZSBNQUMgQWRkcmVzcwkJCQkJCSovCisgWDMoIENGR19QQ0ZfSU5GTywJCQkJbWVkaXVtX29jY3VwYW5jeV9saW1pdCwgCQkJIFwKKwkJIAkJCQkJCWNmcF9wZXJpb2QsIGNmcF9tYXhfZHVyYXRpb24gCQkgKSAvKltBUF0gUG9pbnQgQ29vcmRpbmF0aW9uIEZ1bmN0aW9uIGNhcGFiaWxpdHkgaW5mbwkJKi8KKyBYMSggQ0ZHX0NVUl9TU05fSU5GT19FTEVNRU5ULCBzc25faW5mb19lbGVtZW50WzFdCQkJCSAJICkgLyogICAgCQkJCQkJCQkJCQkJCSovCisgWDQoIENGR19DVVJfVEtJUF9JVl9JTkZPLCAJCQkJCQkJCQkJCSBcCisJCSB0a2lwX3NlcV9jbnQwWzRdLCB0a2lwX3NlcV9jbnQxWzRdLCAJCQkJCQkgXAorCQkgdGtpcF9zZXFfY250Mls0XSwgdGtpcF9zZXFfY250M1s0XSAgCQkJCQkJICkgLyogICAgCQkJCQkJCQkJCQkJCSovCisgWDIoIENGR19DVVJfQVNTT0NfUkVRX0lORk8sCWZyYW1lX3R5cGUsIGZyYW1lX2JvZHlbMV0JCQkgKSAvKgkweEZEOEMJCQkJCQkJCQkJCQkqLworIFgyKCBDRkdfQ1VSX0FTU09DX1JFU1BfSU5GTywJZnJhbWVfdHlwZSwgZnJhbWVfYm9keVsxXQkJCSApIC8qCTB4RkQ4RAkJCQkJCQkJCQkJCSovCisKKworLyoJTW9kZW0gSU5GT1JNQVRJT04gKi8KKyBYMSggQ0ZHX1BIWV9UWVBFLAkJCQlwaHlfdHlwZSAJCQkJCQkJICkgLypQaHlzaWNhbCBsYXllciB0eXBlIGluZGljYXRpb24JCQkJCQkJKi8KKyBYMSggQ0ZHX0NVUl9DSEFOTkVMLAkJCWN1cnJlbnRfY2hhbm5lbAkJCQkJCSApIC8qQWN0dWFsIGZyZXF1ZW5jeSBjaGFubmVsIHVzZWQgZm9yIHRyYW5zbWlzc2lvbgkJCSovCisgWDEoIENGR19DVVJfUE9XRVJfU1RBVEUsCQljdXJyZW50X3Bvd2VyX3N0YXRlCQkJCQkgKSAvKkFjdHVhbCBwb3dlciBjb25zdW1wdGlvbiBzdGF0dXMJCQkJCQkqLworIFgxKCBDRkdfQ0NBTU9ERSwJCQkJY2NhX21vZGUJCQkJCQkJICkgLypDbGVhciBjaGFubmVsIGFzc2Vzc21lbnQgbW9kZSBpbmRpY2F0aW9uCQkJCSovCisgWDEoIENGR19TVVBQT1JURURfREFUQV9SQVRFUywJcmF0ZXNbNV0JCQkJCQkJICkgLypEYXRhIHJhdGVzIGNhcGFiaWxpdHkgaW5mb3JtYXRpb24JCQkJCQkqLworCisKKy8qIEZSQU1FUyAqLworWFgxKCBDRkdfU0NBTiwJCQkJCVNDQU5fUlNfU1RSQ1QsIHNjYW5fcmVzdWx0WzMyXQkJICkgLypTY2FuIHJlc3VsdHMJCQkJCQkJCQkJCSovCisKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVSUwgbWFuYWdlbWVudCBmdW5jdGlvbiB0byBiZSBwYXNzZWQgdG8gV2F2ZUxBTi9JRUVFIERyaXZlcnMgaW4gRFVJX1NUUkNUIGZpZWxkIGZ1bgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBIQ0YgYW5kIFVJTCBDb21tb24KKyNkZWZpbmUgTUREX0FDVF9TQ0FOCQkJMHgwNgkJCQkJLy8gSGVybWVzIElucXVpcmUgU2NhbiAoRjEwMSkgY29tbWFuZAorI2RlZmluZSBNRERfQUNUX1BSU19TQ0FOIAkJMHgwNwkJCQkJLy8gSGVybWVzIFByb2JlIFJlc3BvbnNlIFNjYW4gKEYxMDIpIGNvbW1hbmQKKworLy8gVUlMIFNwZWNpZmljCisjZGVmaW5lIFVJTF9GVU5fQ09OTkVDVAkJCTB4MDAJCQkJCS8vIFBlcmZvcm0gY29ubmVjdCBjb21tYW5kCisjZGVmaW5lIFVJTF9GVU5fRElTQ09OTkVDVAkJMHgwMQkJCQkJLy8gUGVyZm9ybSBkaXNjb25uZWN0IGNvbW1hbmQKKyNkZWZpbmUgVUlMX0ZVTl9BQ1RJT04JCQkweDAyCQkJCQkvLyBQZXJmb3JtIFVJTCBBY3Rpb24gY29tbWFuZC4KKyNkZWZpbmUgVUlMX0ZVTl9TRU5EX0RJQUdfTVNHCTB4MDMJCQkJCS8vIFNlbmQgYSBkaWFnbm9zdGljIG1lc3NhZ2UuCisjZGVmaW5lIFVJTF9GVU5fR0VUX0lORk8JCTB4MDQJCQkJCS8vIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gTklDLgorI2RlZmluZSBVSUxfRlVOX1BVVF9JTkZPCQkweDA1CQkJCQkvLyBQdXQgaW5mb3JtYXRpb24gb24gTklDLgorCisvKglVSUxfQUNUX1RBTExJRVMJCQkJMHgwNQkJIAkJCSogdGhpcyBzaG91bGQgbm90IGJlIGV4cG9ydGVkIHRvIHRoZSBVU0YKKwkJCQkJCQkJCQkJIAkJCSogaXQgaXMgc29sZWx5IGludGVuZGVkIGFzIGEgc3RyYXRlZ2ljIGNob2ljZSBmb3IgdGhlIE1TRiB0byBlaXRoZXIKKwkJCQkJCQkJCQkJIAkJCSogLSB1c2UgSENGX0FDVF9UQUxMSUVTIGFuZCBkaXJlY3QgSUZCIGFjY2VzcworCQkJCQkJCQkJCQkJCQkqIC0gdXNlIENGR19UQUxMSUVTCisJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFVJTF9BQ1RfU0NBTgkJCU1ERF9BQ1RfU0NBTgorI2RlZmluZSBVSUxfQUNUX1BSU19TQ0FOIAkJTUREX0FDVF9QUlNfU0NBTgorI2RlZmluZSBVSUxfQUNUX0JMT0NLCSAJCTB4MEIKKyNkZWZpbmUgVUlMX0FDVF9VTkJMT0NLCSAJCTB4MEMKKyNkZWZpbmUgVUlMX0FDVF9SRVNFVAkgCQkweDgwCisjZGVmaW5lIFVJTF9BQ1RfUkVCSU5ECSAJCTB4ODEKKyNkZWZpbmUgVUlMX0FDVF9BUFBMWQkgCQkweDgyCisjZGVmaW5lIFVJTF9BQ1RfRElTQ09OTkVDVAkJMHg4MwkvLzs/MDQwMTA4IHBvc3NpYmx5IG9ic29sZXRlCS8vU3BlY2lhbCBmb3IgV0lOQ0UKKworLy8gSENGIFNwZWNpZmljCisvKiBOb3RlIHRoYXQgVUlMX0FDVC1jb2RlcyBtdXN0IG1hdGNoIEhDRl9BQ1QtY29kZXMgYWNyb3NzIGEgcnVuLXRpbWUgYm91bmQgSS9GCisgKiBUaGUgaW5pdGlhbCBtYXRjaGluZyBpcyBhY2hpZXZlZCBieSAiI2RlZmluZSBIQ0ZfQUNUX3h4eCBIQ0ZfVUlMX0FDVF94eHgiIHdoZXJlIGFwcHJvcHJpYXRlCisgKiBJbiBvdGhlciB3b3JkcywgdGhlc2UgY29kZXMgc2hvdWxkIG5ldmVyLCBldmVyIGNoYW5nZSB0byBtaW5pbWl6ZSBtaWdyYXRpb24gcHJvYmxlbXMgYmV0d2VlbgorICogY29tYmluYXRpb25zIG9mIG9sZCBkcml2ZXJzIGFuZCBuZXcgdXRpbGl0aWVzIGFuZCB2aWNlIHZlcnNhCisgKi8KKyNkZWZpbmUgSENGX0RJU0NPTk5FQ1QJCQkweDAxCQkJCQkvL2Rpc2Nvbm5lY3QgcmVxdWVzdCBmb3IgaGNmX2Nvbm5lY3QgKGludmFsaWQgYXMgSU8gQWRkcmVzcykKKyNkZWZpbmUgSENGX0FDVF9UQUxMSUVTIAkJMHgwNQkJCQkJLy8gISBVSUxfQUNUX1RBTExJRVMgZG9lcyBub3QgZXhpc3QgISBIZXJtZXMgSW5xdWlyZSBUYWxsaWVzIChGMTAwKSBjbWQKKyNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XQVJQICkgPT0gMAorI2RlZmluZSBIQ0ZfQUNUX1NDQU4JCQlNRERfQUNUX1NDQU4KKyNlbmRpZiAvLyBIQ0ZfVFlQRV9XQVJQCisjZGVmaW5lIEhDRl9BQ1RfUFJTX1NDQU4JCU1ERF9BQ1RfUFJTX1NDQU4KKyNpZiBIQ0ZfSU5UX09OCisjZGVmaW5lIEhDRl9BQ1RfSU5UX09GRiAJCTB4MEQJCQkJCS8vIERpc2FibGUgSW50ZXJydXB0IGdlbmVyYXRpb24KKyNkZWZpbmUgSENGX0FDVF9JTlRfT04JCQkweDBFCQkJCQkvLyBFbmFibGUgSW50ZXJydXB0IGdlbmVyYXRpb24KKyNkZWZpbmUgSENGX0FDVF9JTlRfRk9SQ0VfT04JMHgwRgkJCQkJLy8gRW5mb3JjZSBFbmFibGUgSW50ZXJydXB0IGdlbmVyYXRpb24KKyNlbmRpZiAvLyBIQ0ZfSU5UX09OCisjZGVmaW5lIEhDRl9BQ1RfUlhfQUNLCQkJMHgxNQkJCQkJLy8gUmVjZWlldmVyIEFDSyAob3B0aW1pemF0aW9uKQorI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9DQ1gKKyNkZWZpbmUgSENGX0FDVF9DQ1hfT04JCQkweDFBCQkJCQkvLyBlbmFibGUgQ0tJUAorI2RlZmluZSBIQ0ZfQUNUX0NDWF9PRkYJCQkweDFCCQkJCQkvLyBkaXNhYmxlIENLSVAKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKKyNpZiAoSENGX1NMRUVQKSAmIEhDRl9ERFMKKyNkZWZpbmUgSENGX0FDVF9TTEVFUAkJCTB4MUMJCQkJCS8vIEREUyBTbGVlcCByZXF1ZXN0CisvLyNkZWZpbmUgSENGX0FDVF9XQUtFVVAJCTB4MUQJCQkJCS8vIEREUyBXYWtldXAgcmVxdWVzdAorI2VuZGlmIC8vIEhDRl9ERFMKKworLyoJSENGX0FDVF9NQVgJCQkJCQkJLy8geHh4eDogc3RhcnQgdmFsdWUgZm9yIFVJTC1yYW5nZSwgTk9UIHRvIGJlIHBhc3NlZCB0byBIQ0YKKyAqCQkJCQkJCQkJCVRvbyBiYWQsIHRoZXJlIHdhcyBvcmlnaW5hbGx5IG5vIHNwYXJlIHJvb20gY3JlYXRlZCB0byB1c2UKKyAqCQkJCQkJCQkJCUhDRl9BQ1RfTUFYIGFzIGFuIGVxdWl2YWxlbnQgb2YgSENGX0VSUl9NQVguIFNpbmNlIGNyZWF0aW5nCisgKgkJCQkJCQkJCQl0aGlzIHJvb20gaW4gcmV0cm9zcGVjdCB3b3VsZCBjcmVhdGUgYSBiYWNrd2FyZCBpbmNvbXBhdGliaWxpdHkKKyAqCQkJCQkJCQkJCXdlIHdpbGwganVzdCBoYXZlIHRvIGxpdmUgd2l0aCB0aGUgaGFwaGF6YXJkIHNlcXVlbmNlIG9mCisgKgkJCQkJCQkJCQlVSUwtIGFuZCBIQ0Ygc3BlY2lmaWMgY29kZXMuIFRoZW9yZXRpY2FsbHkgdGhpcyBjb3VsZCBiZQorICoJCQkJCQkJCQkJY29ycmVjdGVkIHdoZW4gYW5kIGlmIHRoZXJlIHdpbGwgZXZlciBiZSBhbiBvdmVyYWxsCisgKgkJCQkJCQkJCQlpbmNvbXBhdGliaWxpdHkgaW50cm9kdWNlZCBmb3IgYW5vdGhlciByZWFzb24KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSEVSTUVTIFJFQ09SRFMJPT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENGR19SSURfRldfTUlOCQkJCQkJCTB4RkEwMAkvL2xvd2VzdCB2YWx1ZSByZXByZXNlbnRpbmcgYSBIZXJtZXMtSUkgYmFzZWQgUklECisvLyAjZGVmaW5lIENGR19QREFfQkVHSU4JCQkJCQkweEZBCS8vCisvLyAjZGVmaW5lIENGR19QREFfRU5ECQkJCQkJCTB4RkEJLy8KKy8vICNkZWZpbmUgQ0ZHX1BEQV9OSUNfVE9QX0xWTF9BU1NFTUJMWV9OVU1CRVIJMHhGQQkvLworLy8gI2RlZmluZSBDRkdfUERBX1BDQl9UUkFDRVJfTlVNQkVSCQkJMHhGQQkvLworLy8gI2RlZmluZSBDRkdfUERBX1JNTV9UUkFDRVJfTlVNQkVSCQkJMHhGQQkvLworLy8gI2RlZmluZSBDRkdfUERBX1JNTV9DT01QX0lECQkJCQkweEZBCS8vCisvLyAjZGVmaW5lIENGR19QREFfCQkJCQkJCQkweEZBCS8vCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDT05GSUdVUkFUSU9OIFJFQ09SRFMJPT09PT09PT09PT09PT09PT09PT09Ki8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBtYXNrIDB4RkN4eAkJCQk9PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDRkdfUklEX0NGR19NSU4JCQkJCTB4RkMwMAkJLy9sb3dlc3QgdmFsdWUgcmVwcmVzZW50aW5nIGEgSGVybWVzIGNvbmZpZ3VyYXRpb24gIFJJRAorCisvLwlORVRXT1JLIFBBUkFNRVRFUlMsIFNUQVRJQyBDT05GSUdVUkFUSU9OIEVOVElUSUVTCisvL0ZDMDUsIEZDMEIsIEZDMEMsIEZDMEQ6IFNFRSBXMkROMTQ5CisKKyNkZWZpbmUgQ0ZHX0NORl9QT1JUX1RZUEUJCQkJMHhGQzAwCQkvL1tTVEFdIENvbm5lY3Rpb24gY29udHJvbCBjaGFyYWN0ZXJpc3RpY3MKKyNkZWZpbmUgQ0ZHX0NORl9PV05fTUFDX0FERFIJCQkweEZDMDEJCS8vW1NUQV0gTUFDIEFkZHJlc3Mgb2YgdGhpcyBub2RlCisvLwkJCQkJCQkJCQkweEZDMDIJCXNlZSBEWU5BTUlDIENPTkZJR1VSQVRJT04gRU5USVRJRVMKKyNkZWZpbmUgQ0ZHX0NORl9PV05fQ0hBTk5FTAkJCQkweEZDMDMJCS8vQ29tbXVuaWNhdGlvbiBjaGFubmVsIGZvciBCU1MgY3JlYXRpb24KKyNkZWZpbmUgQ0ZHX0NORl9PV05fU1NJRAkJCQkweEZDMDQJCS8vSUJTUyBjcmVhdGlvbiAoU1RBKSBvciBFU1MgKEFQKSBTZXJ2aWNlIFNldCBJZGVudAorI2RlZmluZSBDRkdfQ05GX09XTl9BVElNX1dJTkRPVwkJCTB4RkMwNQkJLy9bU1RBXSBBVElNIFdpbmRvdyB0aW1lIGZvciBJQlNTIGNyZWF0aW9uCisjZGVmaW5lIENGR19DTkZfU1lTVEVNX1NDQUxFCQkJMHhGQzA2CQkvL1N5c3RlbSBTY2FsZSB0aGF0IHNwZWNpZmllcyB0aGUgQVAgZGVuc2l0eQorI2RlZmluZSBDRkdfQ05GX01BWF9EQVRBX0xFTgkJCTB4RkMwNwkJLy9NYXhpbXVtIGxlbmd0aCBvZiBNQUMgRnJhbWUgQm9keSBkYXRhCisjZGVmaW5lIENGR19DTkZfUE1fRU5BQkxFRAkJCQkweEZDMDkJCS8vW1NUQV0gU3dpdGNoIGZvciBFU1MgUG93ZXIgTWFuYWdlbWVudCAoUE0pCisjZGVmaW5lIENGR19DTkZfTUNBU1RfUlgJCQkJMHhGQzBCCQkvL1tTVEFdIFN3aXRjaCBmb3IgRVNTIFBNIE11bHRpY2FzdCByZWNlcHRpb24gT24vT2ZmCisjZGVmaW5lIENGR19DTkZfTUFYX1NMRUVQX0RVUkFUSU9OCQkweEZDMEMJCS8vW1NUQV0gTWF4aW11bSBzbGVlcCB0aW1lIGZvciBFU1MgUE0KKyNkZWZpbmUgQ0ZHX0NORl9IT0xET1ZFUl9EVVJBVElPTgkJMHhGQzBECQkvL1tTVEFdIEhvbGRvdmVyIHRpbWUgZm9yIEVTUyBQTQorI2RlZmluZSBDRkdfQ05GX09XTl9OQU1FCQkJCTB4RkMwRQkJLy9JZGVudGlmaWNhdGlvbiB0ZXh0IGZvciBkaWFnbm9zdGljIHB1cnBvc2VzCisKKyNkZWZpbmUgQ0ZHX0NORl9PV05fRFRJTV9QRVJJT0QJCQkweEZDMTAJCS8vW0FQXSBCZWFjb24gaW50ZXJ2YWxzIGJldHdlZW4gc3VjY2Vzc2l2ZSBEVElNcworI2RlZmluZSBDRkdfQ05GX1dEU19BRERSMQkJCQkweEZDMTEJCS8vW0FQXSBQb3J0IDEgTUFDIEFkcnMgb2YgY29ycmVzcG9uZGluZyBXRFMgTGluayBub2RlCisjZGVmaW5lIENGR19DTkZfV0RTX0FERFIyCQkJCTB4RkMxMgkJLy9bQVBdIFBvcnQgMiBNQUMgQWRycyBvZiBjb3JyZXNwb25kaW5nIFdEUyBMaW5rIG5vZGUKKyNkZWZpbmUgQ0ZHX0NORl9XRFNfQUREUjMJCQkJMHhGQzEzCQkvL1tBUF0gUG9ydCAzIE1BQyBBZHJzIG9mIGNvcnJlc3BvbmRpbmcgV0RTIExpbmsgbm9kZQorI2RlZmluZSBDRkdfQ05GX1dEU19BRERSNAkJCQkweEZDMTQJCS8vW0FQXSBQb3J0IDQgTUFDIEFkcnMgb2YgY29ycmVzcG9uZGluZyBXRFMgTGluayBub2RlCisjZGVmaW5lIENGR19DTkZfV0RTX0FERFI1CQkJCTB4RkMxNQkJLy9bQVBdIFBvcnQgNSBNQUMgQWRycyBvZiBjb3JyZXNwb25kaW5nIFdEUyBMaW5rIG5vZGUKKyNkZWZpbmUgQ0ZHX0NORl9XRFNfQUREUjYJCQkJMHhGQzE2CQkvL1tBUF0gUG9ydCA2IE1BQyBBZHJzIG9mIGNvcnJlc3BvbmRpbmcgV0RTIExpbmsgbm9kZQorI2RlZmluZSBDRkdfQ05GX1BNX01DQVNUX0JVRgkJCTB4RkMxNwkJLy9bQVBdIFN3aXRjaCBmb3IgUE0gYnVmZmVyZWluZyBvZiBNdWx0aWNhc3QgTWVzc2FnZXMKKyNkZWZpbmUgQ0ZHX0NORl9NQ0FTVF9QTV9CVUYJCQlDRkdfQ05GX1BNX01DQVNUX0JVRgkvL25hbWUgZG9lcyBub3QgbWF0Y2ggSC1JSSBzcGVjCisjZGVmaW5lIENGR19DTkZfUkVKRUNUX0FOWQkJCQkweEZDMTgJCS8vW0FQXSBTd2l0Y2ggZm9yIFBNIGJ1ZmZlcmVpbmcgb2YgTXVsdGljYXN0IE1lc3NhZ2VzCisKKyNkZWZpbmUgQ0ZHX0NORl9FTkNSWVBUSU9OCQkJCTB4RkMyMAkJLy9zZWxlY3QgZW4vZGUtY3J5cHRpb24gb2YgVHgvUnggbWVzc2FnZXMKKyNkZWZpbmUgQ0ZHX0NORl9BVVRIRU5USUNBVElPTgkJCTB4RkMyMQkJLy9bU1RBXSBzZWxlY3RzIEF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobQorI2RlZmluZSBDRkdfQ05GX0VYQ0xfVU5FTkNSWVBURUQJCTB4RkMyMgkJLy9bQVBdIFN3aXRjaCBmb3IgJ2NsZWFyLXRleHQnIHJ4IG1lc3NhZ2UgYWNjZXB0YW5jZQorI2RlZmluZSBDRkdfQ05GX01DQVNUX1JBVEUJCQkJMHhGQzIzCQkvL1RyYW5zbWl0IERhdGEgcmF0ZSBmb3IgTXVsdGljYXN0IGZyYW1lcworI2RlZmluZSBDRkdfQ05GX0lOVFJBX0JTU19SRUxBWQkJCTB4RkMyNAkJLy9bQVBdIFN3aXRjaCBmb3IgSW50cmFCQlMgcmVsYXkKKyNkZWZpbmUgQ0ZHX0NORl9NSUNST19XQVZFCQkJCTB4RkMyNQkJLy9NaWNyb1dhdmUgKFJvYnVzdG5lc3MpCisjZGVmaW5lIENGR19DTkZfTE9BRF9CQUxBTkNJTkcJCSAJMHhGQzI2CQkvL0xvYWQgQmFsYW5jaW5nCQkgKEJvb2xlYW4sIDA9T0ZGLCAxPU9OLCBkZWZhdWx0PTEpCisjZGVmaW5lIENGR19DTkZfTUVESVVNX0RJU1RSSUJVVElPTgkgCTB4RkMyNwkJLy9NZWRpdW0gRGlzdHJpYnV0aW9uCSAoQm9vbGVhbiwgMD1PRkYsIDE9T04sIGRlZmF1bHQ9MSkKKyNkZWZpbmUgQ0ZHX0NORl9SWF9BTExfR1JPVVBfQUREUgkJMHhGQzI4CQkvL1tTVEFdIEdyb3VwIEFkZHJlc3MgRmlsdGVyCisjZGVmaW5lIENGR19DTkZfQ09VTlRSWV9JTkZPCQkJMHhGQzI5CQkvL0NvdW50cnkgSW5mbworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XQVJQCisjZGVmaW5lIENGR19DTkZfVFhfUE9XX0xWTAkJCQkweEZDMkEJCS8vVHhQb3dlciBMZXZlbAorI2RlZmluZSBDRkdfQ05GX0NPTk5FQ1RJT05fQ05UTAkJCTB4RkMzMAkJLy9bU1RBXSBDb25uZWN0aW9uIENvbnRyb2wKKyNkZWZpbmUgQ0ZHX0NORl9PV05fQkVBQ09OX0lOVEVSVkFMCQkweEZDMzEJCS8vW0FQXQorI2RlZmluZSBDRkdfQ05GX1NIT1JUX1JFVFJZX0xJTUlUCQkweEZDMzIJCS8vCisjZGVmaW5lIENGR19DTkZfTE9OR19SRVRSWV9MSU1JVAkJMHhGQzMzCQkvLworI2RlZmluZSBDRkdfQ05GX1RYX0VWRU5UX01PREUJCQkweEZDMzQJCS8vCisjZGVmaW5lIENGR19DTkZfV0lGSV9DT01QQVRJQkxFCQkJMHhGQzM1CQkvL1tTVEFdIFdpZmkgY29tcGF0aWJsZQorI2VuZGlmIC8vIEhDRl9UWVBFX1dBUlAKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQkVBR0xFX0hJSTUKKyNkZWZpbmUgQ0ZHX1ZPSUNFX1JFVFJZX0xJTUlUCQkJMHhGQzM2CQkvKiBWb2ljZSBmcmFtZSByZXRyeSBsaW1pdC4gUmFuZ2U6IDEtMTUsIGRlZmF1bHQ6IDQgKi8KKyNkZWZpbmUgQ0ZHX1ZPSUNFX0NPTlRFTlRJT05fV0lORE9XCQkweEZDMzcJCS8qIENvbnRlbnRpb24gd2luZG93IGZvciB2b2ljZSBmcmFtZXMuICovCisjZW5kaWYJLy8gQkVBR0xFX0hJSTUKKworLy8JTkVUV09SSyBQQVJBTUVURVJTLCBEWU5BTUlDIENPTkZJR1VSQVRJT04gRU5USVRJRVMKKyNkZWZpbmUgQ0ZHX0RFU0lSRURfU1NJRAkJCQkweEZDMDIJCS8vW1NUQV0gU2VydmljZSBTZXQgaWRlbnRpZmljYXRpb24gZm9yIGNvbm5lY3Rpb24gYW5kIHNjYW4KKworI2RlZmluZSBDRkdfR1JPVVBfQUREUgkJCQkJMHhGQzgwCQkvL1tTVEFdIE11bHRpY2FzdCBNQUMgQWRkcmVzc2VzIGZvciBSeC1tZXNzYWdlCisjZGVmaW5lIENGR19DUkVBVEVfSUJTUwkJCQkJMHhGQzgxCQkvL1tTVEFdIFN3aXRjaCBmb3IgSUJTUyBjcmVhdGlvbiBPbi9PZmYKKyNkZWZpbmUgQ0ZHX1JUU19USFJICQkJCQkweEZDODMJCS8vRnJhbWUgbGVuZ3RoIHVzZWQgZm9yIFJUUy9DVFMgaGFuZHNoYWtlCisjZGVmaW5lIENGR19UWF9SQVRFX0NOVEwJCQkJMHhGQzg0CQkvL1tTVEFdIERhdGEgcmF0ZSBjb250cm9sIGZvciBtZXNzYWdlIHRyYW5zbWlzc2lvbgorI2RlZmluZSBDRkdfUFJPTUlTQ1VPVVNfTU9ERQkJCTB4RkM4NQkJLy9bU1RBXSBTd2l0Y2ggZm9yIFByb21pc2N1b3VzIG1vZGUgcmVjZXB0aW9uIE9uL09mZgorI2RlZmluZSBDRkdfV09MCQkJCQkJCTB4RkM4NgkJLy9bU1RBXSBTd2l0Y2ggZm9yIFdha2UtT24tTEFOIG1vZGUKKyNkZWZpbmUgQ0ZHX1dPTF9QQVRURVJOUwkJCQkweEZDODcJCS8vW1NUQV0gUGF0dGVybnMgZm9yIFdha2UtT24tTEFOCisjZGVmaW5lIENGR19TVVBQT1JURURfUkFURV9TRVRfQ05UTAkJMHhGQzg4CQkvLworI2RlZmluZSBDRkdfQkFTSUNfUkFURV9TRVRfQ05UTAkJCTB4RkM4OQkJLy8KKworI2RlZmluZSBDRkdfU09GVFdBUkVfQUNLX01PREUJCQkweEZDOTAJCS8vCisjZGVmaW5lIENGR19SVFNfVEhSSDAJCQkJCTB4RkM5NwkJLy9bQVBdIFBvcnQgMCBmcmFtZSBsZW5ndGggZm9yIFJUUy9DVFMgaGFuZHNoYWtlCisjZGVmaW5lIENGR19SVFNfVEhSSDEJCQkJCTB4RkM5OAkJLy9bQVBdIFBvcnQgMSBmcmFtZSBsZW5ndGggZm9yIFJUUy9DVFMgaGFuZHNoYWtlCisjZGVmaW5lIENGR19SVFNfVEhSSDIJCQkJCTB4RkM5OQkJLy9bQVBdIFBvcnQgMiBmcmFtZSBsZW5ndGggZm9yIFJUUy9DVFMgaGFuZHNoYWtlCisjZGVmaW5lIENGR19SVFNfVEhSSDMJCQkJCTB4RkM5QQkJLy9bQVBdIFBvcnQgMyBmcmFtZSBsZW5ndGggZm9yIFJUUy9DVFMgaGFuZHNoYWtlCisjZGVmaW5lIENGR19SVFNfVEhSSDQJCQkJCTB4RkM5QgkJLy9bQVBdIFBvcnQgNCBmcmFtZSBsZW5ndGggZm9yIFJUUy9DVFMgaGFuZHNoYWtlCisjZGVmaW5lIENGR19SVFNfVEhSSDUJCQkJCTB4RkM5QwkJLy9bQVBdIFBvcnQgNSBmcmFtZSBsZW5ndGggZm9yIFJUUy9DVFMgaGFuZHNoYWtlCisjZGVmaW5lIENGR19SVFNfVEhSSDYJCQkJCTB4RkM5RAkJLy9bQVBdIFBvcnQgNiBmcmFtZSBsZW5ndGggZm9yIFJUUy9DVFMgaGFuZHNoYWtlCisKKyNkZWZpbmUgQ0ZHX1RYX1JBVEVfQ05UTDAJCQkJMHhGQzlFCQkvL1tBUF0gUG9ydCAwIGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24KKyNkZWZpbmUgQ0ZHX1RYX1JBVEVfQ05UTDEJCQkJMHhGQzlGCQkvL1tBUF0gUG9ydCAxIGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24KKyNkZWZpbmUgQ0ZHX1RYX1JBVEVfQ05UTDIJCQkJMHhGQ0EwCQkvL1tBUF0gUG9ydCAyIGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24KKyNkZWZpbmUgQ0ZHX1RYX1JBVEVfQ05UTDMJCQkJMHhGQ0ExCQkvL1tBUF0gUG9ydCAzIGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24KKyNkZWZpbmUgQ0ZHX1RYX1JBVEVfQ05UTDQJCQkJMHhGQ0EyCQkvL1tBUF0gUG9ydCA0IGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24KKyNkZWZpbmUgQ0ZHX1RYX1JBVEVfQ05UTDUJCQkJMHhGQ0EzCQkvL1tBUF0gUG9ydCA1IGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24KKyNkZWZpbmUgQ0ZHX1RYX1JBVEVfQ05UTDYJCQkJMHhGQ0E0CQkvL1tBUF0gUG9ydCA2IGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24KKworI2RlZmluZSBDRkdfREVGQVVMVF9LRVlTCQkJCTB4RkNCMAkJLy9kZWZpbmVzIHNldCBvZiBlbmNyeXB0aW9uIGtleXMKKyNkZWZpbmUgQ0ZHX1RYX0tFWV9JRAkJCQkJMHhGQ0IxCQkvL3NlbGVjdCBrZXkgZm9yIGVuY3J5cHRpb24gb2YgVHggbWVzc2FnZXMKKyNkZWZpbmUgQ0ZHX1NDQU5fU1NJRAkJCQkJMHhGQ0IyCQkvL1NjYW4gU1NJRAorI2RlZmluZSBDRkdfQUREX1RLSVBfREVGQVVMVF9LRVkJCTB4RkNCNAkJLy9zZXQgS2V5SUQgYW5kIFR4S2V5IGluZGljYXRpb24KKyNkZWZpbmUgCUtFWV9JRAkJCQkJCQkweDAwMDMJCS8vS2V5SUQgbWFzayBmb3IgdGtpcF9rZXlfaWRfaW5mbyBmaWVsZAorI2RlZmluZSAJVFhfS0VZCQkJCQkJCTB4ODAwMAkJLy9EZWZhdWx0IFR4IEtleSBmbGFnIG9mIHRraXBfa2V5X2lkX2luZm8gZmllbGQKKyNkZWZpbmUgQ0ZHX1NFVF9XUEFfQVVUSF9LRVlfTUdNVF9TVUlURQkweEZDQjUJCS8vQXV0aGVudGljYXRlZCBLZXkgTWFuYWdlbWVudCBTdWl0ZQorI2RlZmluZSBDRkdfUkVNT1ZFX1RLSVBfREVGQVVMVF9LRVkJCTB4RkNCNgkJLy9pbnZhbGlkYXRlIEtleUlEIGFuZCBUeEtleSBpbmRpY2F0aW9uCisjZGVmaW5lIENGR19BRERfVEtJUF9NQVBQRURfS0VZCQkJMHhGQ0I3CQkvL3NldCBNQUMgYWRkcmVzcyBwYWlyd2lzZSBzdGF0aW9uCisjZGVmaW5lIENGR19SRU1PVkVfVEtJUF9NQVBQRURfS0VZCQkweEZDQjgJCS8vaW52YWxpZGF0ZSBNQUMgYWRkcmVzcyBwYWlyd2lzZSBzdGF0aW9uCisjZGVmaW5lIENGR19TRVRfV1BBX0NBUEFCSUxJVElFU19JTkZPCTB4RkNCOQkJLy9XUEEgQ2FwYWJpbGl0aWVzCisjZGVmaW5lIENGR19DQUNIRURfUE1LX0FERFIJCQkJMHhGQ0JBCQkvL3NldCBNQUMgYWRkcmVzcyBvZiBwcmUtYXV0aGVudGljYXRlZCBBUAorI2RlZmluZSBDRkdfUkVNT1ZFX0NBQ0hFRF9QTUtfQUREUgkJMHhGQ0JCCQkvL2ludmFsaWRhdGUgTUFDIGFkZHJlc3Mgb2YgcHJlLWF1dGhlbnRpY2F0ZWQgQVAKKyNkZWZpbmUgQ0ZHX0ZDQkMJMHhGQ0JDCS8vRlcgY29kZXMgYWhlYWQgb2YgYXZhaWxhYmxlIGRvY3VtZW50YXRpb24sIHNvID8/Pz8/Pz8KKyNkZWZpbmUgQ0ZHX0ZDQkQJMHhGQ0JECS8vRlcgY29kZXMgYWhlYWQgb2YgYXZhaWxhYmxlIGRvY3VtZW50YXRpb24sIHNvID8/Pz8/Pz8KKyNkZWZpbmUgQ0ZHX0ZDQkUJMHhGQ0JFCS8vRlcgY29kZXMgYWhlYWQgb2YgYXZhaWxhYmxlIGRvY3VtZW50YXRpb24sIHNvID8/Pz8/Pz8KKyNkZWZpbmUgQ0ZHX0ZDQkYJMHhGQ0JGCS8vRlcgY29kZXMgYWhlYWQgb2YgYXZhaWxhYmxlIGRvY3VtZW50YXRpb24sIHNvID8/Pz8/Pz8KKworI2RlZmluZSBDRkdfSEFORE9WRVJfQUREUgkJCQkweEZDQzAJCS8vW0FQXSBTdGF0aW9uIE1BQyBBZHJyZXNzIHJlLWFzc29jaWF0ZWQgd2l0aCBvdGhlciBBUAorI2RlZmluZSBDRkdfU0NBTl9DSEFOTkVMCQkJCTB4RkNDMgkJLy9DaGFubmVsIHNldCBmb3IgaG9zdCByZXF1ZXN0ZWQgc2NhbgorLy87PyNkZWZpbmUgQ0ZHX1NDQU5fQ0hBTk5FTF9NQVNLCQkJMHhGQ0MyCQkvLyBjb250YWlucworI2RlZmluZSBDRkdfRElTQVNTT0NJQVRFX0FERFIJCQkweEZDQzQJCS8vW0FQXSBTdGF0aW9uIE1BQyBBZHJyZXNzIHRvIGJlIGRpc2Fzc29jaWF0ZWQKKyNkZWZpbmUgQ0ZHX1BST0JFX0RBVEFfUkFURQkJCQkweEZDQzUJCS8vV0FSUCBjb25uZWN0aW9uIGNvbnRyb2wKKyNkZWZpbmUgQ0ZHX0ZSQU1FX0JVUlNUX0xJTUlUCQkJMHhGQ0M2CQkvLworI2RlZmluZSBDRkdfQ09FWElTVEVOU0VfQkVIQVZJT1VSCQkweEZDQzcJCS8vW0FQXQorI2RlZmluZSBDRkdfREVBVVRIRU5USUNBVEVfQUREUgkJCTB4RkNDOAkJLy9NQUMgYWRkcmVzcyBvZiBTdGF0aW9uIHRvIGJlIGRlYXV0aGVudGljYXRlZAorCisvLwlCRUhBVklPUiBQQVJBTUVURVJTCisjZGVmaW5lIENGR19USUNLX1RJTUUJCQkJCTB4RkNFMAkJLy9BdXhpbGlhcnkgVGltZXIgdGljayBpbnRlcnZhbAorI2RlZmluZSBDRkdfRERTX1RJQ0tfVElNRQkJCQkweEZDRTEJCS8vRGlzY29ubmVjdGVkIERlZXBTbGVlcCBUaW1lciB0aWNrIGludGVydmFsCisvLyNkZWZpbmUgQ0ZHX0NORl9DT1VOVFJZCQkJCQkweEZDRkUJYXBwYXJlbnRseSBub3QgbmVlZGVkIDs/CisjZGVmaW5lIENGR19SSURfQ0ZHX01BWAkJCQkJMHhGQ0ZGCQkvL2hpZ2hlc3QgdmFsdWUgcmVwcmVzZW50aW5nIGFuIENvbmZpZ3VyYXRpb24gUklECisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElORk9STUFUSU9OIFJFQ09SRFMgCT09PT09PT09PT09PT09PT09PT09PSovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gbWFzayAweEZEeHgJCQkJPT09PT09PT09PT09PT09PT09PT09Ki8KKy8vCU5JQyBJTkZPUk1BVElPTgorI2RlZmluZSBDRkdfUklEX0lORl9NSU4JCQkJCTB4RkQwMAkvL2xvd2VzdCB2YWx1ZSByZXByZXNlbnRpbmcgYW4gSW5mb3JtYXRpb24gUklECisjZGVmaW5lIENGR19NQVhfTE9BRF9USU1FCQkJCTB4RkQwMAkvL1tJTlRdIE1heGltdW0gcmVzcG9uc2UgdGltZSBvZiB0aGUgRG93bmxvYWQgY29tbWFuZC4KKyNkZWZpbmUgQ0ZHX0RMX0JVRgkJCQkJCTB4RkQwMQkvL1tJTlRdIERvd25sb2FkIGJ1ZmZlciBsb2NhdGlvbiBhbmQgc2l6ZS4KKyNkZWZpbmUgQ0ZHX1BSSV9JREVOVElUWQkJCQkweEZEMDIJLy9bUFJJXSBQcmltYXJ5IEZ1bmN0aW9ucyBmaXJtd2FyZSBpZGVudGlmaWNhdGlvbi4KKyNkZWZpbmUgQ0ZHX1BSSV9TVVBfUkFOR0UJCQkJMHhGRDAzCS8vW1BSSV0gUHJpbWFyeSBGdW5jdGlvbnMgSS9GIFN1cHBsaWVyIGNvbXBhdGliaWxpdHkgcmFuZ2UuCisjZGVmaW5lIENGR19OSUNfSFNJX1NVUF9SQU5HRQkJCTB4RkQwOQkvL0gvVyAtIFMvVyBJL0Ygc3VwcGxpZXIgcmFuZ2UKKyNkZWZpbmUgQ0ZHX05JQ19TRVJJQUxfTlVNQkVSCQkJMHhGRDBBCS8vW1BSSV0gTmV0d29yayBJbnRlcmZhY2UgQ2FyZCBzZXJpYWwgbnVtYmVyLgorI2RlZmluZSBDRkdfTklDX0lERU5USVRZCQkJCTB4RkQwQgkvL1tQUkldIE5ldHdvcmsgSW50ZXJmYWNlIENhcmQgaWRlbnRpZmljYXRpb24uCisjZGVmaW5lIENGR19OSUNfTUZJX1NVUF9SQU5HRQkJCTB4RkQwQwkvL1tQUkldIE1vZGVtIEkvRiBTdXBwbGllciBjb21wYXRpYmlsaXR5IHJhbmdlLgorI2RlZmluZSBDRkdfTklDX0NGSV9TVVBfUkFOR0UJCQkweEZEMEQJLy9bUFJJXSBDb250cm9sbGVyIEkvRiBTdXBwbGllciBjb21wYXRpYmlsaXR5IHJhbmdlLgorI2RlZmluZSBDRkdfQ0hBTk5FTF9MSVNUCQkJCTB4RkQxMAkvL0FsbG93ZWQgY29tbXVuaWNhdGlvbiBjaGFubmVscy4KKyNkZWZpbmUgQ0ZHX05JQ19URU1QX1RZUEUgIAkJCQkweEZEMTIJLy9IYXJkd2FyZSB0ZW1wZXJhdHVyZSByYW5nZSBjb2RlLgorI2RlZmluZSBDRkdfQ0lTCQkJCQkJCTB4RkQxMwkvL1BDIENhcmQgU3RhbmRhcmQgQ2FyZCBJbmZvcm1hdGlvbiBTdHJ1Y3R1cmUKKyNkZWZpbmUgQ0ZHX05JQ19QUk9GSUxFCQkJCQkweEZEMTQJLy9DYXJkIFByb2ZpbGUKKyNkZWZpbmUgQ0ZHX0ZXX0lERU5USVRZCQkJCQkweEZEMjAJLy9maXJtd2FyZSBpZGVudGlmaWNhdGlvbi4KKyNkZWZpbmUgQ0ZHX0ZXX1NVUF9SQU5HRQkJCQkweEZEMjEJLy9maXJtd2FyZSBTdXBwbGllciBjb21wYXRpYmlsaXR5IHJhbmdlLgorI2RlZmluZSBDRkdfTUZJX0FDVF9SQU5HRVNfU1RBCQkJMHhGRDIyCS8vW1NUQV0gTW9kZW0gSS9GIEFjdG9yIGNvbXBhdGliaWxpdHkgcmFuZ2VzLgorI2RlZmluZSBDRkdfQ0ZJX0FDVF9SQU5HRVNfU1RBCQkJMHhGRDIzCS8vW1NUQV0gQ29udHJvbGxlciBJL0YgQWN0b3IgY29tcGF0aWJpbGl0eSByYW5nZXMuCisjZGVmaW5lIENGR19OSUNfQlVTX1RZUEUJCQkJMHhGRDI0CS8vQ2FyZCBCdXN0eXBlCisjZGVmaW5lIAlDRkdfTklDX0JVU19UWVBFX1BDQ0FSRF9DRgkJMHgwMDAwCS8vMTYgYml0IFBDIENhcmQgb3IgQ29tcGFjdCBGbGFzaAorI2RlZmluZSAJQ0ZHX05JQ19CVVNfVFlQRV9VU0IJCQkweDAwMDEJLy9VU0IKKyNkZWZpbmUgCUNGR19OSUNfQlVTX1RZUEVfQ0FSREJVUwkJMHgwMDAyCS8vQ2FyZEJ1cworI2RlZmluZSAJQ0ZHX05JQ19CVVNfVFlQRV9QQ0kJCQkweDAwMDMJLy8obWluaSlQQ0kKKyNkZWZpbmUgQ0ZHX0RPTUFJTl9DT0RFCQkJCQkJMHhGRDI1CisKKy8vCU1BQyBJTkZPUk1BVElPTgorI2RlZmluZSBDRkdfUE9SVF9TVEFUCQkJCQkweEZENDAJLy9BY3R1YWwgTUFDIFBvcnQgY29ubmVjdGlvbiBjb250cm9sIHN0YXR1cworI2RlZmluZSBDRkdfQ1VSX1NTSUQJCQkJCTB4RkQ0MQkvL1tTVEFdIElkZW50aWZpY2F0aW9uIG9mIHRoZSBhY3R1YWxseSBjb25uZWN0ZWQgU1MKKyNkZWZpbmUgQ0ZHX0NVUl9CU1NJRAkJCQkJMHhGRDQyCS8vW1NUQV0gSWRlbnRpZmljYXRpb24gb2YgdGhlIGFjdHVhbGx5IGNvbm5lY3RlZCBCU1MKKyNkZWZpbmUgQ0ZHX0NPTU1TX1FVQUxJVFkJCQkJMHhGRDQzCS8vW1NUQV0gUXVhbGl0eSBvZiB0aGUgQmFzaWMgU2VydmljZSBTZXQgY29ubmVjdGlvbgorI2RlZmluZSBDRkdfQ1VSX1RYX1JBVEUJCQkJCTB4RkQ0NAkvL1tTVEFdIEFjdHVhbCB0cmFuc21pdCBkYXRhIHJhdGUKKyNkZWZpbmUgQ0ZHX0NVUl9CRUFDT05fSU5URVJWQUwJCQkweEZENDUJLy9CZWFjb24gdHJhbnNtaXQgaW50ZXJ2YWwgdGltZSBmb3IgQlNTIGNyZWF0aW9uCisjZGVmaW5lIENGR19DVVJfU0NBTEVfVEhSSAkJCQkweEZENDYJLy9BY3R1YWwgU3lzdGVtIFNjYWxlIHRocmVzaG9sZHMgc2V0dGluZ3MKKyNkZWZpbmUgQ0ZHX1BST1RPQ09MX1JTUF9USU1FCQkJMHhGRDQ3CS8vTWF4IHRpbWUgdG8gYXdhaXQgYSByZXNwb25zZSB0byBhIHJlcXVlc3QgbWVzc2FnZQorI2RlZmluZSBDRkdfQ1VSX1NIT1JUX1JFVFJZX0xJTUlUCQkweEZENDgJLy9NYXggbnVtYmVyIG9mIHRyYW5zbWl0IGF0dGVtcHRzIGZvciBzaG9ydCBmcmFtZXMKKyNkZWZpbmUgQ0ZHX0NVUl9MT05HX1JFVFJZX0xJTUlUCQkweEZENDkJLy9NYXggbnVtYmVyIG9mIHRyYW5zbWl0IGF0dGVtcHRzIGZvciBsb25nIGZyYW1lcworI2RlZmluZSBDRkdfTUFYX1RYX0xJRkVUSU1FCQkJCTB4RkQ0QQkvL01heCB0cmFuc21pdCBmcmFtZSBoYW5kbGluZyBkdXJhdGlvbgorI2RlZmluZSBDRkdfTUFYX1JYX0xJRkVUSU1FCQkJCTB4RkQ0QgkvL01heCByZWNlaXZlZCBmcmFtZSBoYW5kbGluZyBkdXJhdGlvbgorI2RlZmluZSBDRkdfQ0ZfUE9MTEFCTEUJCQkJCTB4RkQ0QwkvL1tTVEFdIENvbnRlbnRpb24gRnJlZSBwb2xsYWJsZSBjYXBhYmlsaXR5IGluZGljYXRpb24KKyNkZWZpbmUgQ0ZHX0FVVEhFTlRJQ0FUSU9OX0FMR09SSVRITVMJMHhGRDRECS8vQXZhaWxhYmxlIEF1dGhlbnRpY2F0aW9uIEFsZ29yaXRobXMgaW5kaWNhdGlvbgorI2RlZmluZSBDRkdfUFJJVkFDWV9PUFRfSU1QTEVNRU5URUQJCTB4RkQ0RgkvL1dFUCBPcHRpb24gYXZhaWxhYmlsaXR5IGluZGljYXRpb24KKworI2RlZmluZSBDRkdfQ1VSX1JFTU9URV9SQVRFUwkJCTB4RkQ1MAkvL1tTVEFdIEN1cnJlbnRSZW1vdGVSYXRlcworI2RlZmluZSBDRkdfQ1VSX1VTRURfUkFURVMJCQkJMHhGRDUxCS8vW1NUQV0gQ3VycmVudFVzZWRSYXRlcworI2RlZmluZSBDRkdfQ1VSX1NZU1RFTV9TQ0FMRQkJCTB4RkQ1MgkvL1tTVEFdIEN1cnJlbnRTeXN0ZW1TY2FsZQorCisjZGVmaW5lIENGR19DVVJfVFhfUkFURTEJCQkJMHhGRDgwCS8vW0FQXSBBY3R1YWwgUG9ydCAxIHRyYW5zbWl0IGRhdGEgcmF0ZQorI2RlZmluZSBDRkdfQ1VSX1RYX1JBVEUyCQkJCTB4RkQ4MQkvL1tBUF0gQWN0dWFsIFBvcnQgMiB0cmFuc21pdCBkYXRhIHJhdGUKKyNkZWZpbmUgQ0ZHX0NVUl9UWF9SQVRFMwkJCQkweEZEODIJLy9bQVBdIEFjdHVhbCBQb3J0IDMgdHJhbnNtaXQgZGF0YSByYXRlCisjZGVmaW5lIENGR19DVVJfVFhfUkFURTQJCQkJMHhGRDgzCS8vW0FQXSBBY3R1YWwgUG9ydCA0IHRyYW5zbWl0IGRhdGEgcmF0ZQorI2RlZmluZSBDRkdfQ1VSX1RYX1JBVEU1CQkJCTB4RkQ4NAkvL1tBUF0gQWN0dWFsIFBvcnQgNSB0cmFuc21pdCBkYXRhIHJhdGUKKyNkZWZpbmUgQ0ZHX0NVUl9UWF9SQVRFNgkJCQkweEZEODUJLy9bQVBdIEFjdHVhbCBQb3J0IDYgdHJhbnNtaXQgZGF0YSByYXRlCisjZGVmaW5lIENGR19OSUNfTUFDX0FERFIJCQkJMHhGRDg2CS8vVW5pcXVlIGxvY2FsIG5vZGUgTUFDIEFkZHJlc3MKKyNkZWZpbmUgQ0ZHX1BDRl9JTkZPCQkJCQkweEZEODcJLy9bQVBdIFBvaW50IENvb3JkaW5hdGlvbiBGdW5jdGlvbiBjYXBhYmlsaXR5IGluZm8KKy8vKlJFU0VSVkVEKiAjZGVmaW5lIENGR19ISUdIRVNUX0JBU0lDX1JBVEUJCQkweEZEODgJLy8KKyNkZWZpbmUgQ0ZHX0NVUl9DT1VOVFJZX0lORk8JCQkweEZEODkJLy8KKyNkZWZpbmUgQ0ZHX0NVUl9TU05fSU5GT19FTEVNRU5UCQkweEZEOEEJLy8KKyNkZWZpbmUgQ0ZHX0NVUl9US0lQX0lWX0lORk8JCQkweEZEOEIJLy8KKyNkZWZpbmUgQ0ZHX0NVUl9BU1NPQ19SRVFfSU5GTwkJCTB4RkQ4QwkvLworI2RlZmluZSBDRkdfQ1VSX0FTU09DX1JFU1BfSU5GTwkJCTB4RkQ4RAkvLworI2RlZmluZSBDRkdfQ1VSX0xPQUQJCQkJCTB4RkQ4RQkvL1tBUF0gY3VycmVudCBsb2FkIG9uIEFQJ3MgY2hhbm5lbAorCisjZGVmaW5lIENGR19TRUNVUklUWV9DQVBBQklMSVRJRVMJCTB4RkQ5MAkvL0NvbWJpbmVkIGNhcGFiaWxpdGllcyBpbmZvcm1hdGlvbgorCisvLwlNT0RFTSBJTkZPUk1BVElPTgorI2RlZmluZSBDRkdfUEhZX1RZUEUJCQkJCTB4RkRDMAkvL1BoeXNpY2FsIGxheWVyIHR5cGUgaW5kaWNhdGlvbgorI2RlZmluZSBDRkdfQ1VSX0NIQU5ORUwJCQkJCTB4RkRDMQkvL0FjdHVhbCBmcmVxdWVuY3kgY2hhbm5lbCB1c2VkIGZvciB0cmFuc21pc3Npb24KKyNkZWZpbmUgQ0ZHX0NVUl9QT1dFUl9TVEFURQkJCQkweEZEQzIJLy9BY3R1YWwgcG93ZXIgY29uc3VtcHRpb24gc3RhdHVzCisjZGVmaW5lIENGR19DQ0FfTU9ERQkJCQkJMHhGREMzCS8vQ2xlYXIgY2hhbm5lbCBhc3Nlc3NtZW50IG1vZGUgaW5kaWNhdGlvbgorI2RlZmluZSBDRkdfU1VQUE9SVEVEX0RBVEFfUkFURVMJCTB4RkRDNgkvL0RhdGEgcmF0ZXMgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbgorCisjZGVmaW5lIENGR19SSURfSU5GX01BWAkJCQkJMHhGREZGCS8vaGlnaGVzdCB2YWx1ZSByZXByZXNlbnRpbmcgYW4gSW5mb3JtYXRpb24gUklECisKKy8vCUVOR0lORUVSSU5HIElORk9STUFUSU9OCisjZGVmaW5lIENGR19SSURfRU5HX01JTgkJCQkJMHhGRkUwCS8vbG93ZXN0IHZhbHVlIHJlcHJlc2VudGluZyBhIEhlcm1lcyBlbmdpbmVlcmluZyBSSUQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEdlbmVyYWwgZGVmaW5lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy9JRkIgZmllbGQgcmVsYXRlZAorLy8JCUlGQl9DYXJkU3RhdAorI2RlZmluZSBDQVJEX1NUQVRfSU5DT01QX1BSSQkJCTB4MjAwMFUJLy8gbm8gY29tcGF0aWJsZSBIU0kgLyBwcmltYXJ5IEYvVworI2RlZmluZSBDQVJEX1NUQVRfSU5DT01QX0ZXCQkJCTB4MTAwMFUJLy8gbm8gY29tcGF0aWJsZSBzdGF0aW9uIC8gdGVydGlhcnkgRi9XCisjZGVmaW5lIENBUkRfU1RBVF9ERUZVTkNUCQkJCTB4MDEwMFUJLy8gSENGIGlzIGluIERlZnVuY3QgbW9kZQorLy8JCUlGQl9SeFN0YXQKKyNkZWZpbmUgUlhfU1RBVF9QUklPCQkJCQkweDAwRTBVCS8vUHJpb3JpdHkgc3ViZmllbGQKKyNkZWZpbmUgUlhfU1RBVF9FUlIJCQkJCQkweDAwMEZVCS8vRXJyb3IgbWFzaworI2RlZmluZSAJUlhfU1RBVF9VTkRFQ1IJCQkJMHgwMDAyVQkvL05vbi1kZWNyeXB0YWJsZSBlbmNyeXB0ZWQgbWVzc2FnZQorI2RlZmluZSAJUlhfU1RBVF9GQ1NfRVJSCQkJCTB4MDAwMVUJLy9GQ1MgZXJyb3IKKworLy8gU05BUCBoZWFkZXIgZm9yIEUtSUkgRW5jYXBzdWxhdGlvbgorI2RlZmluZSBFTkNfTk9ORQkJCSAgICAgICAgICAgIDB4RkYKKyNkZWZpbmUgRU5DXzEwNDIgICAgCQkJICAgICAgICAweDAwCisjZGVmaW5lIEVOQ19UVU5ORUwgICAgICAJICAgIAkJMHhGOAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBYeHh4eHh4eCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNkZWZpbmUgSENGX1NVQ0NFU1MJCQkJCTB4MDAJLy8gT0sKKyNkZWZpbmUgSENGX0VSUl9USU1FX09VVAkJCTB4MDQJLy8gRXhwZWN0ZWQgSGVybWVzIGV2ZW50IGRpZCBub3Qgb2NjdXJlIGluIGV4cGVjdGVkIHRpbWUKKyNkZWZpbmUgSENGX0VSUl9OT19OSUMJCQkJMHgwNQkvKiBjYXJkIG5vdCBmb3VuZCAodXN1YWxseSB5YW5rZWQgYXdheSBkdXJpbmcgaGNmaW9faW5fc3RyaW5nCisJCQkJCQkJCQkJICAJICogQWxzbzogY2FyZCBpcyBlaXRoZXIgYWJzZW50IG9yIGRpc2FibGVkIHdoaWxlIGl0IHNob3VsZCBiZSBuZWl0aGVyICovCisjZGVmaW5lIEhDRl9FUlJfTEVOCQkJCQkweDA4CS8qIGJ1ZmZlciBzaXplIGluc3VmZmljaWVudAorCQkgCQkJCQkJCQkgIAkgKgkJICAtCUlGQl9Db25maWdUYWJsZSB0b28gc21hbGwKKwkJIAkJCQkJCQkJICAJICoJCSAgLQloY2ZfZ2V0X2luZm8gYnVmZmVyIGhhcyBhIHNpemUgb2YgMCBvciAxIG9yIGxlc3MgdGhhbiBuZWVkZWQKKwkJIAkJCQkJCQkgIAkJICoJCQl0byBhY2NvbW9kYXRlIGFsbCBkYXRhCisJCSAJCQkJCQkJICAJCSAqCQkgIC0JaGNmX3B1dF9pbmZvOiBDRkdfRExOVl9EQVRBIGV4Y2VlZHMgaW50ZXJtZWRpYXRlCisJCQkJCQkJCQkJCSAqCQkgIGJ1ZmZlciBzaXplICovCisjZGVmaW5lIEhDRl9FUlJfSU5DT01QX1BSSQkJCTB4MDkJLy8gcHJpbWFyeSBmdW5jdGlvbnMgYXJlIG5vdCBjb21wYXRpYmxlCisjZGVmaW5lIEhDRl9FUlJfSU5DT01QX0ZXCQkJMHgwQQkvLyBzdGF0aW9uIGZ1bmN0aW9ucyBhcmUgY29tcGF0aWJsZQorI2RlZmluZSBIQ0ZfRVJSX01JQwkJCQkJMHgwRAkvLyBNSUMgY2hlY2sgZmFpbHMKKyNkZWZpbmUgSENGX0VSUl9TTEVFUAkJCQkweDBFCS8vIE5JQyBpbiBzbGVlcCBtb2RlCisjZGVmaW5lIEhDRl9FUlJfTUFYCQkJCQkweDNGCS8qIGVuZCBvZiBIQ0YgcmFuZ2UKKwkJCQkJCQkJCQkJICAgKioqICoqICoqKiAqKioqKiogKioqICoqKioqKioqKioqKioqKiAqLworI2RlZmluZSBIQ0ZfRVJSX0RFRlVOQ1QJCQkJMHg4MAkvLyBCSVQsIHJlZmxlY3RpbmcgdGhhdCB0aGUgSENGIGlzIGluIGRlZnVuY3QgbW9kZSAoYml0cyAweDdGIHJlZmxlY3QgY2F1c2UpCisjZGVmaW5lIEhDRl9FUlJfREVGVU5DVF9BVVgJCQkweDgyCS8vIFRpbWVvdXQgb24gYWNrbm93bGVkZ2VtZW50IG9uIGVuL2Rpc2FibGluZyBBVVggcmVnaXN0ZXJzCisjZGVmaW5lIEhDRl9FUlJfREVGVU5DVF9USU1FUgkJMHg4MwkvLyBUaW1lb3V0IG9uIHRpbWVyIGNhbGlicmF0aW9uIGR1cmluZyBpbml0aWFsaXphdGlvbiBwcm9jZXNzCisjZGVmaW5lIEhDRl9FUlJfREVGVU5DVF9USU1FX09VVAkweDg0CS8vIFRpbWVvdXQgb24gQnVzeSBiaXQgZHJvcCBkdXJpbmcgQkFQIHNldHVwCisjZGVmaW5lIEhDRl9FUlJfREVGVU5DVF9DTURfU0VRCQkweDg2CS8vIEhlcm1lcyBhbmQgSENGIGFyZSBvdXQgb2Ygc3luYyBpbiBpc3N1aW5nL3Byb2Nlc3NpbmcgY29tbWFuZHMKKworI2RlZmluZSBIQ0ZfSU5UX1BFTkRJTkcJCQkJMHgwMQkvLyByZXR1cm4gc3RhdHVzIG9mIGhjZl9hY3QoIEhDRl9BQ1RfSU5UX09GRiApCisKKyNkZWZpbmUgSENGX1BPUlRfMCAJCQkJCTB4MDAwMAkvLyBTdGF0aW9uIHN1cHBvcnRzIG9ubHkgc2luZ2xlIE1BQyBQb3J0CisjZGVmaW5lIEhDRl9QT1JUXzEgCQkJCQkweDAxMDAJLy8gSENGX1BPUlRfMSB0aHJvdWdoIEhDRl9QT1JUXzYgYXJlIG9ubHkgc3VwcG9ydGVkIGJ5IEFQIEYvVworI2RlZmluZSBIQ0ZfUE9SVF8yIAkJCQkJMHgwMjAwCisjZGVmaW5lIEhDRl9QT1JUXzMgCQkJCQkweDAzMDAKKyNkZWZpbmUgSENGX1BPUlRfNCAJCQkJCTB4MDQwMAorI2RlZmluZSBIQ0ZfUE9SVF81IAkJCQkJMHgwNTAwCisjZGVmaW5lIEhDRl9QT1JUXzYgCQkJCQkweDA2MDAKKworI2RlZmluZSBIQ0ZfQ05UTF9FTkFCTEUJCQkJMHgwMQorI2RlZmluZSBIQ0ZfQ05UTF9ESVNBQkxFCQkJMHgwMgorI2RlZmluZSBIQ0ZfQ05UTF9DT05ORUNUCQkJMHgwMworI2RlZmluZSBIQ0ZfQ05UTF9ESVNDT05ORUNUCQkJMHgwNQorI2RlZmluZSBIQ0ZfQ05UTF9DT05USU5VRQkJCTB4MDcKKworI2RlZmluZSBVU0VfRE1BIAkJCQkJMHgwMDAxCisjZGVmaW5lIFVTRV8xNkJJVCAJCQkJCTB4MDAwMgorI2RlZmluZSBETUFfRU5BQkxFRAkJCQkJMHg4MDAwCS8vd2VhayBuYW1lLCBpdCByZWFsbHkgbWVhbnM6IEYvVyBlbmFibGVkIGFuZCBETUEgc2VsZWN0ZWQKKworLy8jZGVmaW5lIEhDRl9ETUFfRkRfQ05UCSAJCSgyKjI5KSAJCQkJCQkvL3NpemUgaW4gYnl0ZXMgb2Ygb25lIFR4L1J4RlMgbWludXMgREEvU0EKKy8vOz90aGUgTVNGICggSDJQQ0kuQyB1c2VzIHRoZSBuZXh0IDIgbW5lbW9uaWNzICkKKyNkZWZpbmUgSENGX0RNQV9SWF9CVUYxX1NJWkUJCShIRlNfQUREUl9ERVNUICsgOCkJCQkvL2V4dHJhIGJ5dGVzIGZvciBMRU4vU05BUCBpZiBkZWNhcHN1bGF0aW9uCisjZGVmaW5lIEhDRl9ETUFfVFhfQlVGMV9TSVpFCQkoSEZTX0FERFJfREVTVCArIDIqNiArIDgpCS8vZXh0cmEgYnl0ZXMgZm9yIERBL1NBL0xFTi9TTkFQIGlmIGVuY2Fwc3VsYXRpb24KKworLy9IRlNfVFhfQ05UTAorLyogTm90ZSB0aGF0IHRoZSBIQ0ZfLi4uLiBTeXN0ZW0gQ29uc3RhbnRzIGluZmx1ZW5jZSB0aGUgSEZTXy4uLi4gdmFsdWVzIGJlbG93CisgKiAJCQkJCQkJCUgtSQkJSC1JCSB8CUgtSUkJSC1JSQlILUlJLjUKKyAqCQkJCQkJCQkJCVdQQQkgfAkJCVdQQQorICogSEZTX1RYX0NOVExfVFhfT0sJCQkwMDAyCTAwMDIgfAkwMDAyCTAwMDIJIE4vQQk8PDw8PDw8PGRlcHJlY2F0ZWQKKyAqIEhGU19UWF9DTlRMX1RYX0VYCQkJMDAwNAkwMDA0IHwJMDAwNAkwMDA0CSBOL0EKKyAqIEhGU19UWF9DTlRMX01JQwkJCQkgTi9BCTAwMTAgfAkgTi9BCTAwMTAJIE4vQQorICogSEZTX1RYX0NOVExfVElECQkJCSBOL0EJIE4vQSB8CSBOL0EJIE4vQQkwMDBGCisgKiBIRlNfVFhfQ05UTF9TRVJWSUNFX0NMQVNTCSBOL0EJIE4vQSB8CSBOL0EJIE4vQQkwMEMwCisgKiBIRlNfVFhfQ05UTF9QT1JUCQkJCTA3MDAJMDcwMCB8CTA3MDAJMDcwMAkwNzAwCisgKiBIRlNfVFhfQ05UTF9NSUNfS0VZX0lECQkxODAwCTE4MDAgfAkwMDAwCTE4MDAJIE4vQQorICogSEZTX1RYX0NOVExfQ0tJUAkJCQkwMDAwCTAwMDAgfAkwMDAwCTIwMDAJMjAwMAorICogSEZTX1RYX0NOVExfVFhfREVMQVkJCQk0MDAwCTQwMDAgfAk0MDAwCTQwMDAJIE4vQQorICogSEZTX1RYX0NOVExfQUNUSU9OCQkJIE4vQQkgTi9BIHwJIE4vQQkgTi9BCTQwMDAKKyAqIAkJCQkJCQkJPT09PQk9PT09IHwJPT09PQk9PT09CT09PT0KKyAqIAkJCQkJCQkJNUYwNgk1RjE2IHwJNDcwNgk3RjA2CTY3Q0YKKyAqCisgKiBIQ0ZfVFhfQ05UTF9NQVNLIHNwZWNpZmllcyB0aGUgYml0cyBhbGxvd2VkIG9uIHRoZSBIb3N0IEkvRgorICogbm90ZTogYml0IDB4NDAwMCBoYXMgZGlmZmVyZW50IG1lYW5pbmcgZm9yIEgtSUkgYW5kIEgtSUkuNQorICogbm90ZTogW10gaW5kaWNhdGUgYml0cyB3aGljaCBhcmUgcG9zc2libHkgYWRkZWQgYnkgdGhlIEhDRiB0byBUeENvbnRyb2wgYXQgdGhlIEhvc3QgSS9GCisgKiBub3RlOiAoKSBpbmRpY2F0ZSBiaXRzIHdoaWNoIGFyZSBzdXBwb3NlZGx5IG5ldmVyIGV2ZXIgdXNlZCBpbiBhIFdDSSBlbnZpcm9ubWVudAorICogbm90ZTogPyBkZW5vdGUgYml0cyB3aGljaCBzZWVtIG5vdCB0byBiZSBkb2N1bWVudGVkIGluIHRoZSBkb2N1bWVudHMgSSBoYXZlIGF2YWlsYWJsZQorICovCisvL0gtSTogICAgIEhDRl9UWF9DTlRMX01BU0sJMHg0N0ZFCS8vVFhfREVMQVksIE1BQ1BvcnQsIFByaW9yaXR5LCAoU3RydWNUeXBlKSwgVHhFeCwgVHhPSworLy9ILUkgV1BBOiBIQ0ZfVFhfQ05UTF9NQVNLCTB4NUZFNgkvL1RYX0RFTEFZLCBNSUNLZXksIE1BQ1BvcnQsIFByaW9yaXR5LCAoU3RydWNUeXBlKSwgVHhFeCwgVHhPSworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XQVJQCisjZGVmaW5lICBIQ0ZfVFhfQ05UTF9NQVNLCTB4MjdFNwkvL25vIFRYX0RFTEFZPywgQ0NYLCBNQUNQb3J0LCBQcmlvcml0eSwgKFN0cnVjVHlwZSksIFR4RXgsIFR4T0ssIFNwZWN0cmFsaW5rCisvLyNlbGlmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKKy8vI2RlZmluZSAgSENGX1RYX0NOVExfTUFTSwkweDdGMDYJLy9UWF9ERUxBWSwgQ0tJUD8sIE1JQ0tleUlELCBNQUNQb3J0LCBbTUlDXSxUeEV4LCBUeE9LIChUQVI0MTlENykKKyNlbHNlCisjZGVmaW5lICBIQ0ZfVFhfQ05UTF9NQVNLCTB4NjdFNwkvL1RYX0RFTEFZPywgQ0NYLCBNQUNQb3J0LCBQcmlvcml0eSwgKFN0cnVjVHlwZSksIFR4RXgsIFR4T0ssIFNwZWN0cmFsaW5rCisjZW5kaWYgLy8gSENGX1RZUEVfV0FSUAorCisjZGVmaW5lIEhGU19UWF9DTlRMX1RYX0VYCQkJMHgwMDA0VQorCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQorI2RlZmluZSBIRlNfVFhfQ05UTF9NSUMJCQkJMHgwMDEwVQkvLzgwMi4zIGZvcm1hdCB3aXRoIFRLSVAJCTs/Y2hhbmdlcyB0byAweDAwMDggZm9yIEgtSUkKKyNkZWZpbmUgSEZTX1RYX0NOVExfTUlDX0tFWV9JRAkJMHgxODAwVQkvL01JQyBLZXkgSUQgc3ViZmllbGQKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKKworI2RlZmluZSBIRlNfVFhfQ05UTF9QT1JUCQkJMHgwNzAwVQkvL1BvcnQgc3ViZmllbGQgb2YgVHhDb250cm9sIGZpZWxkIG9mIFRyYW5zbWl0IEZyYW1lIFN0cnVjdHVyZQorCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAorI2RlZmluZSBIRlNfVFhfQ05UTF9DS0lQCQkJMHgyMDAwVQkvL0NLSVAgZW5jcnlwdGVkIGZsYWcKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKKworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9UWF9ERUxBWQorI2RlZmluZSBIRlNfVFhfQ05UTF9UWF9ERUxBWQkJMHg0MDAwVQkvL2RlY291cGxlICJwdXQgZGF0YSIgYW5kIHNlbmQKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9UWF9ERUxBWQorI2RlZmluZSBIRlNfVFhfQ05UTF9UWF9DT05UCQkJMHg0MDAwdQkvL2VuZ2luZWVyaW5nOiBjb250aW51b3VzIHRyYW5zbWl0CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIQ0YgRGVmaW5lZCBSRUNPUkRTCT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDRkdfUFJPRF9EQVRBCQkJCQkweDA4MDAgCQkvL1BsdWcgRGF0YSAoRW5naW5lZXJpbmcgVGVzdCBwdXJwb3NlcyBvbmx5KQorI2RlZmluZSBDRkdfRExfRUVQUk9NCQkJCQkweDA4MDYJCS8vVXAvRG93bmxvYWQgSTJQUk9NIGZvciBVU0IKKyNkZWZpbmUJCUNGR19QREEJCQkJCQkJMHgwMDAyCQkvL0Rvd25sb2FkIFBEQQorI2RlZmluZQkJQ0ZHX01FTV9JMlBST00JCQkJCTB4MDAwNAkJLy9VcC9Eb3dubG9hZCBFRVBST00KKworI2RlZmluZQkJQ0ZHX01FTV9SRUFECQkJCQkweDAwMDAKKyNkZWZpbmUJCUNGR19NRU1fV1JJVEUJCQkJCTB4MDAwMQorCisjZGVmaW5lIENGR19OVUxMCQkJCQkJMHgwODIwCQkvL0VtcHR5IE1haWwgQm94IEluZm8gQmxvY2sKKyNkZWZpbmUgQ0ZHX01CX0lORk8JCQkJCQkweDA4MjAJCS8vTWFpbCBCb3ggSW5mbyBCbG9jaworI2RlZmluZSBDRkdfV01QCQkJCQkJCTB4MDgyMgkJLy9XYXZlTEFOIE1hbmFnZW1lbnQgUHJvdG9jb2wKKworI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRAorI2RlZmluZSBDRkdfRFJWX0lORk8JCQkJCTB4MDgyNQkJLy9Ecml2ZXIgSW5mb3JtYXRpb24gc3RydWN0dXJlIChzZWUgQ0ZHX0RSVl9JTkZPX1NUUkNUIGZvciBkZXRhaWxzKQorI2RlZmluZSBDRkdfRFJWX0lERU5USVRZCQkJCTB4MDgyNgkJLy9kcml2ZXIgaWRlbnRpdHkgKHNlZSBDRkdfRFJWX0lERU5USVRZX1NUUkNUIGZvciBkZXRhaWxzKQorI2RlZmluZSBDRkdfRFJWX1NVUF9SQU5HRQkJCQkweDA4MjcgICAgICAvL1N1cHBsaWVyIHJhbmdlIG9mIGRyaXZlciAtIHV0aWxpdHkgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19QUkkJCQkweDA4MjggICAgICAvLyhBY2NlcHRhYmxlKSBBY3RvciByYW5nZSBmb3IgUHJpbWFyeSBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQQkJCTB4MDgyOSAgICAgIC8vKEFjY2VwdGFibGUpIEFjdG9yIHJhbmdlIGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJIAkJCTB4MDgyQSAgICAgIC8vKEFjY2VwdGFibGUpIEFjdG9yIHJhbmdlIGZvciBIL1cgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19BUEYJCQkweDA4MkIJCS8vKEFjY2VwdGFibGUpIEFjdG9yIHJhbmdlIGZvciBBUCBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0hDRl9PUFQJCQkJCQkweDA4MkMJCS8vSENGIChDb21waWxlIHRpbWUpIG9wdGlvbnMKKyNlbmRpZiAvLyBNU0ZfQ09NUE9ORU5UX0lECisKKyNkZWZpbmUgQ0ZHX1JFR19NQgkJCQkJCTB4MDgzMAkJLy9SZWdpc3RlciBNYWlsIEJveAorI2RlZmluZSBDRkdfTUJfQVNTRVJUCQkJCQkweDA4MzEJCS8vQXNzZXJ0IGluZm9ybWF0aW9uCisjZGVmaW5lIENGR19SRUdfQVNTRVJUX1JUTlAJCQkJMHgwODMyCQkvLyhkZS0pcmVnaXN0ZXIgTVNGIEFzc2VydCBDYWxsYmFjayByb3V0aW5lCisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTkZPX0xPRworI2RlZmluZSBDRkdfUkVHX0lORk9fTE9HCQkJCTB4MDgzOQkJLy8oZGUtKXJlZ2lzdGVyIEluZm8gZnJhbWVzIHRvIExvZworI2VuZGlmIC8vIEhDRl9JTkZPX0xPRworI2RlZmluZSBDRkdfQ05UTF9PUFQJCQkJCTB4MDgzQQkJLy9Db250cm9sIG9wdGlvbnMKKworI2RlZmluZSBDRkdfUFJPRwkJCQkJCTB4MDg1NwkJLy9Qcm9ncmFtIE5JQyBtZW1vcnkKKyNkZWZpbmUgCUNGR19QUk9HX1NUT1AJCQkJCTB4MDAwMAorI2RlZmluZSAJQ0ZHX1BST0dfVk9MQVRJTEUJCQkJMHgwMTAwCisvLyNkZWZpbmUgCUNGR19QUk9HX0ZMQVNICQkJCQkweDAzMDAJCS8vcmVzdG9yZSBpZiBILUlJIG5vbi12b2xhdGlsZSBpcyBpbnRyb2R1Y2VkCisvLyNkZWZpbmUgCUNGR19QUk9HX1NFRVBST00JCQkJMHgxMzAwCQkvL3Jlc3RvcmUgaWYgSC1JSSBub24tdm9sYXRpbGUgaXMgaW50cm9kdWNlZAorI2RlZmluZSAJQ0ZHX1BST0dfU0VFUFJPTV9SRUFEQkFDSyAJCTB4MDQwMAorCisjZGVmaW5lIENGR19GV19QUklOVEYgICAgICAgICAgICAgICAgICAgICAgIDB4MDg1OCAgICAgIC8vUmVsYXRlZCB0byBmaXJtd2FyZSBkZWJ1ZyBwcmludGYgZnVuY3Rpb25hbGl0eQorI2RlZmluZSBDRkdfRldfUFJJTlRGX0JVRkZFUl9MT0NBVElPTiAgICAgICAweDA4NTkgICAgICAvL0Fsc28gcmVsYXRlZCB0byBmaXJtd2FyZSBkZWJ1ZyBwcmludGYgZnVuY3Rpb25hbGl0eQorCisjZGVmaW5lIENGR19DTURfTklDCQkJCQkJMHgwODYwCQkvL0hlcm1lcyBFbmdpbmVlcmluZyBjb21tYW5kCisjZGVmaW5lIENGR19DTURfSENGCQkJCQkJMHgwODYzCQkvL0hDRiBFbmdpbmVlcmluZyBjb21tYW5kCisjZGVmaW5lIAlDRkdfQ01EX0hDRl9SRUdfQUNDRVNTCQkJMHgwMDAwCS8vRGlyZWN0IHJlZ2lzdGVyIGFjY2VzcworI2RlZmluZSAJQ0ZHX0NNRF9IQ0ZfUlhfTU9OCQkJCTB4MDAwMQkvL1J4LW1vbml0b3IKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTVNGIERlZmluZWQgUkVDT1JEUwk9PT09PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDRkdfRU5DUllQVF9TVFJJTkcJCQkJMHgwOTAwCQkvL3RyYW5zZmVyIGVuY3J5cHRpb24gaW5mbyBmcm9tIENQTCB0byBNU0YKKyNkZWZpbmUgQ0ZHX0FQX01PREUJCQkJCQkweDA5MDEJCS8vY29udHJvbCBtb2RlIG9mIFNUQVAgZHJpdmVyIGZyb20gQ1BMCisjZGVmaW5lIENGR19EUklWRVJfRU5BQkxFCQkJCTB4MDkwMgkJLy9leHRlbmQmZXhwb3J0IEVuLS9EaXNhYmxlIGZhY2lsaXR5IHRvIFV0aWxpdHkKKyNkZWZpbmUgQ0ZHX1BDSV9DT01NQU5ECQkJCQkweDA5MDMJCS8vUENJIGFkYXB0ZXIgKE9vaWV2YWFyKSBzdHJ1Y3R1cmUKKyNkZWZpbmUgQ0ZHX1dPTEFTX0VOQUJMRQkJCQkweDA5MDQJCS8vZXh0ZW5kJmV4cG9ydCBFbi0vRGlzYWJsZSBXT0xBUyBmYWNpbGl0eSB0byBVdGlsaXR5CisjZGVmaW5lIENGR19DT1VOVFJZX1NUUklORwkJCQkweDA5MDUJCS8vdHJhbnNmZXIgQ291bnRyeUluZm8gaW5mbyBmcm9tIENQTCB0byBNU0YKKyNkZWZpbmUgQ0ZHX0ZXX0RVTVAJCQkJCQkweDA5MDYJCS8vdHJhbnNmZXIgbmljIG1lbW9yeSB0byB1dGlsaXR5CisjZGVmaW5lIENGR19QT1dFUl9NT0RFCQkJCQkweDA5MDcJCS8vY29udHJvbHMgdGhlIFBNIG1vZGUgb2YgdGhlIGNhcmQKKyNkZWZpbmUgQ0ZHX0NPTk5FQ1RJT05fTU9ERQkJCQkweDA5MDgJCS8vY29udHJvbHMgdGhlIG1vZGUgb2YgdGhlIEZXIChFU1MvQVAvSUJTUy9BREhPQykKKyNkZWZpbmUgQ0ZHX0lGQgkJCQkJCQkweDA5MDkJCS8vYnl0ZSB3aXNlIGNvcHkgb2YgSUZCCisjZGVmaW5lIENGR19NU0ZfVEFMTElFUwkJCQkJMHgwOTBBCQkvL01TRiB0YWxsaWVzIChpbnQncywgcnggYW5kIHR4KQorI2RlZmluZSBDRkdfQ1VSUkVOVF9MSU5LX1NUQVRVUwkJCTB4MDkwQgkJLy9MYXRlc3QgbGluayBzdGF0dXMgZ290IHRyb3VnaCAweEYyMDAgTGlua0V2ZW50CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElORk9STUFUSU9OIEZSQU1FUyA9PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ0ZHX0lORk9fRlJBTUVfTUlOCQkJCTB4RjAwMAkJLy9sb3dlc3QgdmFsdWUgcmVwcmVzZW50aW5nIGFuIEluZm9ybWF0aW8gRnJhbWUKKworI2RlZmluZSBDRkdfVEFMTElFUwkJCQkJCTB4RjEwMAkJLy9Db21tdW5pY2F0aW9ucyBUYWxsaWVzCisjZGVmaW5lIENGR19TQ0FOCQkJCQkJMHhGMTAxCQkvL1NjYW4gcmVzdWx0cworI2RlZmluZSBDRkdfUFJTX1NDQU4JCQkJCTB4RjEwMgkJLy9Qcm9iZSBSZXNwb25zZSBTY2FuIHJlc3VsdHMKKworI2RlZmluZSBDRkdfTElOS19TVEFUIAkJCQkJMHhGMjAwCQkvL0xpbmsgU3RhdHVzCisJLyogMSB0aHJvdWdoIDUgYXJlIEYvVyBkZWZpbmVkIHZhbHVlcywgcHJvZHVjZWQgYnkgQ0ZHX0xJTktfU1RBVCBmcmFtZQorCSAqIDEgdGhyb3VnaCA1IGFyZSBzaGFyZWQgYnkgQ0ZHX0xJTktfU1RBVCwgSUZCX0xpbmtTdGF0IGFuZCBJRkJfRFNMaW5rU3RhdAorCSAqIDEgcGxheXMgYSBkb3VibGUgcm9sZSBhcyBDRkdfTElOS19TVEFUX0NPTk5FQ1RFRCBhbmQgYXMgYml0IHJlZmxlY3Rpbmc6CisJICoJIC0gY29ubmVjdGVkOiBPTgorCSAqCSAtIGRpc2Nvbm5lY3RlZDogT0ZGCisJICovCisjZGVmaW5lIAlDRkdfTElOS19TVEFUX0NPTk5FQ1RFRAkJCTB4MDAwMQorI2RlZmluZSAJQ0ZHX0xJTktfU1RBVF9ESVNDT05ORUNURUQJCTB4MDAwMgorI2RlZmluZSAJQ0ZHX0xJTktfU1RBVF9BUF9DSEFOR0UJCQkweDAwMDMKKyNkZWZpbmUgCUNGR19MSU5LX1NUQVRfQVBfT09SCQkJMHgwMDA0CisjZGVmaW5lIAlDRkdfTElOS19TVEFUX0FQX0lSCQkJCTB4MDAwNQorI2RlZmluZSAJQ0ZHX0xJTktfU1RBVF9GVwkJCQkweDAwMEYJLy9tYXNrIHRvIGlzb2xhdGUgRi9XIGRlZmluZWQgYml0cworLy8jZGVmaW5lIAlDRkdfTElOS19TVEFUX1RJTUVSCQkJCTB4MEZGMAkvL21hc2sgdG8gaXNvbGF0ZSBPT1IgdGltZXIKKy8vI2RlZmluZSAJQ0ZHX0xJTktfU1RBVF9EU19PT1IJCQkweDIwMDAJLy8yMDAwIGFuZCB1cCBhcmUgSUZCX0xpbmtTdGF0IHNwZWNpZmljCisvLyNkZWZpbmUgCUNGR19MSU5LX1NUQVRfRFNfSVIJCQkJMHg0MDAwCisjZGVmaW5lIAlDRkdfTElOS19TVEFUX0NIQU5HRQkJCTB4ODAwMAorI2RlZmluZSBDRkdfQVNTT0NfU1RBVAkJCQkJMHhGMjAxCQkvL0Fzc29jaWF0aW9uIFN0YXR1cworI2RlZmluZSBDRkdfU0VDVVJJVFlfU1RBVAkJCQkweEYyMDIJCS8vU2VjdXJpdHkgU3RhdHVzCisjZGVmaW5lIENGR19VUERBVEVEX0lORk9fUkVDT1JECQkJMHhGMjA0CQkvL1VwZGF0ZWQgSW5mbyBSZWNvcmQKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ09ORklHVVJBVElPTiBSRUNPUkRTID09PT09PT09PT09PT09PT09PT09PT0qLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFMgVCBSIFUgQyBUIFUgUiBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vUXVpY2smRGlydHkgdG8gZ2V0IGRvd25sb2FkIGZvciBET1MgT0RJIEhlcm1lcy1JSSBydW5uaW5nIHR5cGVkZWYgTFRWX1NUUkNUIEZBUiAqCUxUVlA7Cit0eXBlZGVmIExUVl9TVFJDVCBGQVIgKglMVFZQOyAgIC8vIGkucy5vICNkZWZpbmUgTFRWUCBMVFZfU1RSQ1QgRkFSICoKKworI2lmIGRlZmluZWQgV1ZMQU5fNDIgfHwgZGVmaW5lZCBXVkxBTl80MyAvLzs/a2VlcHVwIHdpdGggbGVnYWN5IGEgbGl0dGxlIHdoaWxlIGxvbmdlciAoNGF1ZzIwMDMpCit0eXBlZGVmIHN0cnVjdCBEVUlfU1RSQ1QgewkJCS8qICJsZWdhY3kiLCBzdGlsbCB1c2VkIGJ5IFdWTEFONDIvNDMsIE5ESVMgZHJpdmVycyB1c2UgV0xBUEkJCQkqLworCXZvaWQgIEZBUgkqaWZicDsJCQkJLyogUG9pbnRlciB0byBJRkIKKwkJCQkJCQkJCSAqCXJldHVybmVkIGZyb20gTVNGIHRvIFVTRiBieSB1aWxfY29ubmVjdAorCQkJCSAJCQkJCSAqCXBhc3NlZCBmcm9tIFVTRiB0byBNU0YgYXMgYSAibWFnaWMgY29va2llIiBieSBhbGwgb3RoZXIgVUlMIGZ1bmN0aW9uIGNhbGxzCisJCQkJIAkJCQkJICovCisJaGNmXzE2CQlzdGF0OwkJCQkvLyBzdGF0dXMgcmV0dXJuZWQgZnJvbSBNU0YgdG8gVVNGCisJaGNmXzE2CQlmdW47CQkJCS8vIGNvbW1hbmQgY29kZSBmcm9tIFVTRiB0byBNU0YKKwlMVFZfU1RSQ1QJbHR2OwkJCQkvKiBMVFYgc3RydWN0dXJlCisJCQkgCQkJCQkJICoqKiBkdXJpbmcgdWlsX3B1dF9pbmZvOgorCQkJCQkJIAkJCSAqCSAgdGhlIEwsIFQgYW5kIFYtZmllbGRzIGNhcnJ5IGluZm9ybWF0aW9uIGZyb20gVVNGIHRvIE1TRgorCQkJCQkJCQkJICoqKiBkdXJpbmcgdWlsX2dldF9pbmZvOgorCQkJCQkJCQkJICoJICB0aGUgTCBhbmQgVCBmaWVsZHMgY2FycnkgaW5mb3JtYXRpb24gZnJvbSBVU0YgdG8gTVNGCisJCQkJCQkJCQkgKgkgIHRoZSBMIGFuZCBWLWZpZWxkcyBjYXJyeSBpbmZvcm1hdGlvbiBmcm9tIE1TRiB0byBVU0YKKwkJCSAJCQkJCQkgKi8KK30gRFVJX1NUUkNUOwordHlwZWRlZiBEVUlfU1RSQ1QgRkFSICoJRFVJUDsKKyNlbmRpZiAvL2RlZmluZWQgV1ZMQU5fNDIgfHwgZGVmaW5lZCBXVkxBTl80MyAvLzs/a2VlcHVwIHdpdGggbGVnYWN5IGEgbGlpdGxlIHdoaWxlIGxvbmdlciAoNGF1ZzIwMDMpCisKKwordHlwZWRlZiBzdHJ1Y3QgQ0ZHX0NNRF9OSUNfU1RSQ1QgewkvLyBDRkdfQ01EX05JQyAoMHgwODYwKQkJSGVybWVzIEVuZ2luZWVyaW5nIGNvbW1hbmQKKwloY2ZfMTYJbGVuOwkJCQkJLy9kZWZhdWx0IGxlbmd0aCBvZiBSSUQKKwloY2ZfMTYJdHlwOwkJCQkJLy9SSUQgaWRlbnRpZmljYXRpb24gYXMgZGVmaW5lZCBieSBIZXJtZXMKKwloY2ZfMTYJY21kOwkJCQkJLy9Db21tYW5kIGNvZGUgKDB4MDAzRikgYW5kIGNvbnRyb2wgYml0cyAoMHhGRkMwKQorCWhjZl8xNglwYXJtMDsJCQkJCS8vcGFyYW1ldGVycyBmb3IgSGVybWVzIFBhcmFtMCByZWdpc3RlcgorCWhjZl8xNglwYXJtMTsJCQkJCS8vcGFyYW1ldGVycyBmb3IgSGVybWVzIFBhcmFtMSByZWdpc3RlcgorCWhjZl8xNglwYXJtMjsJCQkJCS8vcGFyYW1ldGVycyBmb3IgSGVybWVzIFBhcmFtMiByZWdpc3RlcgorCWhjZl8xNglzdGF0OwkJCQkJLy9yZXN1bHQgY29kZSBmcm9tIEhlcm1lcyBTdGF0dXMgcmVnaXN0ZXIKKwloY2ZfMTYJcmVzcDA7CQkJCQkvL3Jlc3BvbnNlcyBmcm9tIEhlcm1lcyBSZXNwMCByZWdpc3RlcgorCWhjZl8xNglyZXNwMTsJCQkJCS8vcmVzcG9uc2VzIGZyb20gSGVybWVzIFJlc3AxIHJlZ2lzdGVyCisJaGNmXzE2CXJlc3AyOwkJCQkJLy9yZXNwb25zZXMgZnJvbSBIZXJtZXMgUmVzcDIgcmVnaXN0ZXIKKwloY2ZfMTYJaGNmX3N0YXQ7CQkJCS8vcmVzdWx0IGNvZGUgZnJvbSBjbWRfZXhlIHJvdXRpbmUKKwloY2ZfMTYJaWZiX2Vycl9jbWQ7CQkJLy9JRkJfRXJyQ21kCisJaGNmXzE2CWlmYl9lcnJfcXVhbGlmaWVyOwkJLy9JRkJfRXJyUXVhbGlmaWVyCit9IENGR19DTURfTklDX1NUUkNUOworCisKK3R5cGVkZWYgc3RydWN0IENGR19EUlZfSU5GT19TVFJDVCB7CQkvL0NGR19EUlZfSU5GTyAoMHgwODI1KSBkcml2ZXIgaW5mb3JtYXRpb24KKwloY2ZfMTYJbGVuOwkJCQkJLy9kZWZhdWx0IGxlbmd0aCBvZiBSSUQKKwloY2ZfMTYJdHlwOwkJCQkJLy9SSUQgaWRlbnRpZmljYXRpb24gYXMgZGVmaW5lZCBieSBIZXJtZXMKKwloY2ZfOAlkcml2ZXJfbmFtZVs4XTsJCQkvL0RyaXZlciBuYW1lLCA4IGJ5dGVzLCByaWdodCB6ZXJvIHBhZGRlZAorCWhjZl8xNglkcml2ZXJfdmVyc2lvbjsJCQkvL0JDRCAyIGRpZ2l0IG1ham9yIGFuZCAyIGRpZ2l0IG1pbm9yIGRyaXZlciB2ZXJzaW9uCisJaGNmXzE2CUhDRl92ZXJzaW9uOyAgIAkJCS8vQkNEIDIgZGlnaXQgbWFqb3IgYW5kIDIgZGlnaXQgbWlub3IgSENGIHZlcnNpb24KKwloY2ZfMTYJZHJpdmVyX3N0YXQ7CQkJLy8KKwloY2ZfMTYJSU9fYWRkcmVzczsJCQkJLy9iYXNlIElPIGFkZHJlc3MgdXNlZCBieSBOSUMKKwloY2ZfMTYJSU9fcmFuZ2U7CQkJCS8vcmFuZ2Ugb2YgSU8gYWRkcmVzc2VzIHVzZWQgYnkgTklDCisJaGNmXzE2CUlSUV9udW1iZXI7CQkJCS8vSW50ZXJydXB0IHVzZWQgYnkgTklDCisJaGNmXzE2CWNhcmRfc3RhdDsJCQkJLypOSUMgc3RhdHVzCisJCQkJCQkJCQlAKgkweDgwMDAJQ2FyZCBwcmVzZW50CisJCQkJCQkJCQlAKgkweDQwMDAJQ2FyZCBFbmFibGVkCisJCQkJCQkJCQlAKgkweDIwMDAJRHJpdmVyIGluY29tcGF0aWJsZSB3aXRoIE5JQyBQcmltYXJ5IEZ1bmN0aW9ucworCQkJCQkJCQkJQCoJMHgxMDAwCURyaXZlciBpbmNvbXBhdGlibGUgd2l0aCBOSUMgU3RhdGlvbiBGdW5jdGlvbnMJCQkJKi8KKwloY2ZfMTYJZnJhbWVfdHlwZTsJCQkJLypGcmFtZSB0eXBlCisJCQkJCQkJCQlAKgkweDAwMAk4MDIuMworCQkJCQkJCQkJQCoJMHgwMDgJODAyLjExCQkJCQkJCQkJCQkJCQkqLworCWhjZl8zMglkcnZfaW5mbzsJCQkJLypkcml2ZXIgc3BlY2lmaWMgaW5mbworCQkJCQkJCQkJICogQ0U6IHZpcnR1YWwgSS9PIGJhc2UJCQkJCQkJCQkJCQkJKi8KK31DRkdfRFJWX0lORk9fU1RSQ1Q7CisKKyNkZWZpbmUgQ09NUF9JRF9GV19QUkkJCQkJCTIxCQkvL1ByaW1hcnkgRnVuY3Rpb25zIEZpcm13YXJlCisjZGVmaW5lIENPTVBfSURfRldfSU5URVJNRURJQVRFCQkJMjIJCS8vSW50ZXJtZWRpYXRlIEZ1bmN0aW9ucyBGaXJtd2FyZQorI2RlZmluZSBDT01QX0lEX0ZXX1NUQQkJCQkJMzEJCS8vU3RhdGlvbiBGdW5jdGlvbnMgRmlybXdhcmUKKyNkZWZpbmUgQ09NUF9JRF9GV19BUAkJCQkJMzIJCS8vQVAgRnVuY3Rpb25zIEZpcm13YXJlCisjZGVmaW5lIENPTVBfSURfRldfQVBfRkFLRQkJCSAgIDMzMQkJLy9BUCBGdW5jdGlvbnMgRmlybXdhcmUKKworI2RlZmluZSBDT01QX0lEX01JTklQT1JUX05ESVNfMzEJCTQxCQkvL1dpbmRvd3MgOXgvTlQgTWluaXBvcnQgTkRJUyAzLjEKKyNkZWZpbmUgQ09NUF9JRF9QQUNLRVQJCQkJCTQyCQkvL1BhY2tldAorI2RlZmluZSBDT01QX0lEX09ESV8xNgkJCQkJNDMJCS8vRE9TIE9ESQorI2RlZmluZSBDT01QX0lEX09ESV8zMgkJCQkJNDQJCS8vMzItYml0cyBPREkKKyNkZWZpbmUgQ09NUF9JRF9NQUNfT1MJCQkJCTQ1CQkvL01hY2ludG9zaCBPUworI2RlZmluZSBDT01QX0lEX1dJTl9DRQkJCQkJNDYJCS8vV2luZG93cyBDRSBNaW5pcG9ydAorLy8jZGVmaW5lIENPTVBfSURfTElOVVhfUEQJCQkJNDcJCS8vTGludXgsIEhDRi1saWdodCBiYXNlZCwgTVNGIHNvdXJjZSBjb2RlIGluIFB1YmxpYyBEb21haW4KKyNkZWZpbmUgQ09NUF9JRF9NSU5JUE9SVF9ORElTXzUwCQk0OAkJLy9XaW5kb3dzIDl4L05UIE1pbmlwb3J0IE5ESVMgNS4wCisjZGVmaW5lIENPTVBfSURfTElOVVgJCQkJCTQ5CQkvKkxpbnV4LCBHUEwnZWQgSENGIGJhc2VkLCBmdWxsIHNvdXJjZSBjb2RlIGluIFB1YmxpYyBEb21haW4KKwkJCQkJCQkJCQkgIAkJICp0aGFua3MgdG8gQW5kcmVhcyBOZXVoYXVzCQkJCQkJCQkqLworI2RlZmluZSBDT01QX0lEX1FOWAkJCQkJCTUwCQkvL1FOWAorI2RlZmluZSBDT01QX0lEX01JTklQT1JUX05ESVNfNTBfVVNCCTUxCQkvL1dpbmRvd3MgOXgvTlQgTWluaXBvcnQgTkRJUyA0LjAKKyNkZWZpbmUgQ09NUF9JRF9NSU5JUE9SVF9ORElTXzQwCQk1MgkJLy9XaW5kb3dzIDl4L05UIE1pbmlwb3J0IE5ESVMgNC4wCisjZGVmaW5lIENPTVBfSURfVlhfV09SS1NfRU5EU1RBCQkJNTMJCS8vIFZ4V29ya3MgRU5EIFN0YXRpb24gZHJpdmVyCisjZGVmaW5lIENPTVBfSURfVlhfV09SS1NfRU5EQVAJCQk1NAkJLy8gVnhXb3JrcyBFTkQgQWNjZXNzIFBvaW50IGRyaXZlcgorLy87PyNkZWZpbmUgQ09NUF9JRF9NQUNfT1NfPz8/PwkJCTU1CQkvLzs/Y2hlY2sgd2l0aCBITQorI2RlZmluZSBDT01QX0lEX1ZYX1dPUktTX0VORAkJCTU2CQkvLyBWeFdvcmtzIEVORCBTdGF0aW9uL0FjY2VzcyBQb2ludCBkcml2ZXIKKy8vCQkJCQkJCQkJCTU3CQkvL051Y2xldXNPU0BBUk0gRHJpdmVyLgorI2RlZmluZSBDT01QX0lEX1dTVQkJCQkJCTYzCQkvKiBXYXZlTEFOIFN0YXRpb24gRmlybXdhcmUgVXBkYXRlIHV0aWxpdHkKKwkJCQkJCQkJCQkJCSAqCXZhcmlhbnQgMTogV2luZG93cworCQkJCQkJCQkJCQkJICoJdmFyaWFudCAyOiBET1MKKwkJCQkJCQkJCQkJCSAqLworI2RlZmluZSBDT01QX0lEX0FQMQkJCQkJCTgxCQkvL1dhdmVMQU4vSUVFRSBBUAorI2RlZmluZSBDT01QX0lEX0VDCQkJCQkJODMJCS8vV2F2ZUxBTi9JRUVFIEV0aGVybmV0IENvbnZlcnRlcgorI2RlZmluZSBDT01QX0lEX1VCTAkJCQkJCTg3CQkvL1VTQiBCb290IExvYWRlcgorCisjZGVmaW5lIENPTVBfUk9MRV9TVVBMCQkJCQkweDAwCS8vc3VwcGxpZXIKKyNkZWZpbmUgQ09NUF9ST0xFX0FDVAkJCQkJMHgwMQkvL2FjdG9yCisKKwkJCQkJCQkJCQkJCS8vU3VwcGxpZXIJCQkgIC0gYWN0b3IKKyNkZWZpbmUgQ09NUF9JRF9NRkkJCQkJCQkweDAxCS8vTW9kZW0JCSAJCSAgLSBGaXJtd2FyZQlJL0YKKyNkZWZpbmUgQ09NUF9JRF9DRkkJCQkJCQkweDAyCS8vQ29udHJvbGxlcgkJICAtIEZpcm13YXJlCUkvRgorI2RlZmluZSBDT01QX0lEX1BSSQkJCQkJCTB4MDMJLy9QcmltYXJ5IEZpcm13YXJlCSAgLSBEcml2ZXIJCUkvRgorI2RlZmluZSBDT01QX0lEX1NUQQkJCQkJCTB4MDQJLy9TdGF0aW9uIEZpcm13YXJlCSAgLSBEcml2ZXIJCUkvRgorI2RlZmluZSBDT01QX0lEX0RVSQkJCQkJCTB4MDUJLy9Ecml2ZXIJCQkgIC0gVXRpbGl0eQkJSS9GCisjZGVmaW5lIENPTVBfSURfSFNJCQkJCQkJMHgwNgkvL0gvVyAgICAgICAgICAgICAgICAgLSBEcml2ZXIJCUkvRgorI2RlZmluZSBDT01QX0lEX0RBSQkJCQkJCTB4MDcJLy9BUEkgICAgICAgICAgICAgICAgIC0gRHJpdmVyCQlJL0YKKyNkZWZpbmUgQ09NUF9JRF9BUEYJCQkJCQkweDA4CS8vSC9XICAgICAgICAgICAgICAgICAtIERyaXZlcgkJSS9GCisjZGVmaW5lIENPTVBfSURfSU5UCQkJCQkJMHgwOQkvL0ludGVybWVkaWF0ZSBGVyAgICAgLSBEcml2ZXIJCUkvRgorCisjaWZkZWYgSENGX0xFR0FDWQorI2RlZmluZSBIQ0ZfQUNUX0FDU19TQ0FOCQkJCUhDRl9BQ1RfUFJTX1NDQU4KKyNkZWZpbmUgVUlMX0FDVF9BQ1NfU0NBTiAJCQkJVUlMX0FDVF9QUlNfU0NBTgorI2RlZmluZSBNRERfQUNUX0FDU19TQ0FOCSAJCQlNRERfQUNUX1BSU19TQ0FOCisjZGVmaW5lIENGR19BQ1NfU0NBTgkJCQkJQ0ZHX1BSU19TQ0FOCisjZW5kaWYgLy8gSENGX0xFR0FDWQorCisjZW5kaWYgLy8gTUREX0gKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvbW1kLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9tbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTEzOGM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvbW1kLmMKQEAgLTAsMCArMSwyNTEgQEAKKworLy8gICB2aW06dHc9MTEwOnRzPTQ6CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZJTEUJICA6IG1tZC5jCisqCisqIERBVEUgICAgOiAkRGF0ZTogMjAwNC8wNy8yMyAxMTo1Nzo0NSAkICAgJFJldmlzaW9uOiAxLjQgJAorKiBPcmlnaW5hbDogMjAwNC8wNS8yOCAxNDowNTozNSAgICBSZXZpc2lvbjogMS4zMiAgICAgIFRhZzogaGNmN190MjAwNDA2MDJfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDUvMTMgMTU6MzE6NDUgICAgUmV2aXNpb246IDEuMzAgICAgICBUYWc6IGhjZjdfdDdfMjAwNDA1MTNfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDQvMTUgMDk6MjQ6NDIgICAgUmV2aXNpb246IDEuMjUgICAgICBUYWc6IGhjZjdfdDdfMjAwNDA0MTVfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDQvMDggMTU6MTg6MTcgICAgUmV2aXNpb246IDEuMjQgICAgICBUYWc6IHQ3XzIwMDQwNDEzXzAxCisqIE9yaWdpbmFsOiAyMDA0LzA0LzAxIDE1OjMyOjU1ICAgIFJldmlzaW9uOiAxLjIyICAgICAgVGFnOiB0N18yMDA0MDQwMV8wMQorKiBPcmlnaW5hbDogMjAwNC8wMy8xMCAxNTozOToyOCAgICBSZXZpc2lvbjogMS4xOCAgICAgIFRhZzogdDIwMDQwMzEwXzAxCisqIE9yaWdpbmFsOiAyMDA0LzAzLzAzIDE0OjEwOjEyICAgIFJldmlzaW9uOiAxLjE2ICAgICAgVGFnOiB0MjAwNDAzMDRfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDMvMDIgMDk6Mjc6MTIgICAgUmV2aXNpb246IDEuMTQgICAgICBUYWc6IHQyMDA0MDMwMl8wMworKiBPcmlnaW5hbDogMjAwNC8wMi8yNCAxMzowMDoyOSAgICBSZXZpc2lvbjogMS4xMiAgICAgIFRhZzogdDIwMDQwMjI0XzAxCisqIE9yaWdpbmFsOiAyMDA0LzAxLzMwIDA5OjU5OjMzICAgIFJldmlzaW9uOiAxLjExICAgICAgVGFnOiB0MjAwNDAyMTlfMDEKKyoKKyogQVVUSE9SICA6IE5pY28gVmFsc3RlcgorKgorKiBERVNDICAgIDogQ29tbW9uIHJvdXRpbmVzIGZvciBIQ0YsIE1TRiwgVUlMIGFzIHdlbGwgYXMgVVNGIHNvdXJjZXMKKyoKKyogTm90ZTogcmVsYXRpdmUgdG8gQXNzZXJ0cywgdGhlIGZvbGxvd2luZyBjYW4gYmUgb2JzZXJ2ZWQ6CisqCVNpbmNlIHRoZSBJRkIgaXMgbm90IGtub3duIGluc2lkZSB0aGUgcm91dGluZSwgdGhlIG1hY3JvIEhDRkFTU0VSVCBpcyByZXBsYWNlZCB3aXRoIE1EREFTU0VSVC4KKyoJQWxzbyB0aGUgbGluZSBudW1iZXIgcmVwb3J0ZWQgaW4gdGhlIGFzc2VydCBpcyByYWlzZWQgYnkgRklMRV9OQU1FX09GRlNFVCAoMjAwMDApIHRvIGRpc2NyaW1pbmF0ZSB0aGUKKyoJTU1EIEFzc2VydHMgZnJvbSBIQ0YgYW5kIERIRiBhc3NlcnRzLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqIFNPRlRXQVJFIExJQ0VOU0UKKyoKKyogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisqCisqIENPUFlSSUdIVCCpIDIwMDEgLSAyMDA0CWJ5IEFnZXJlIFN5c3RlbXMgSW5jLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisqICAgIGRpc3RyaWJ1dGlvbi4KKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqCisqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogRGlzY2xhaW1lcgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisqIERBTUFHRS4KKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiaGNmLmgiCQkJCS8vIE5lZWRlZCBhcyBsb25nIGFzIHdlIGRvIG5vdCByZWFsbHkgc29ydCBvdXQgdGhlIG1lc3MKKyNpbmNsdWRlICJoY2ZkZWYuaCIJCQkJLy8gZ2V0IENOVl9MSVRUTEVfVE9fU0hPUlQKKyNpbmNsdWRlICJtbWQuaCIJCQkJLy8gTW9yZU1vZHVsYXJEcml2ZXIgY29tbW9uIGluY2x1ZGUgZmlsZQorCisvL3RvIGRpc3Rpbmd1aXNoIERIRiBmcm9tIEhDRiBhc3NlcnRzIGJ5IG1lYW5zIG9mIGxpbmUgbnVtYmVyCisjdW5kZWYJRklMRV9OQU1FX09GRlNFVAorI2RlZmluZSBGSUxFX05BTUVfT0ZGU0VUIERIRl9GSUxFX05BTUVfT0ZGU0VUCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouTU9EVUxFCQlDRkdfUkFOR0VfU1BFQ19TVFJDVCogbW1kX2NoZWNrX2NvbXAoIENGR19SQU5HRVNfU1RSQ1QgKmFjdHAsIENGR19TVVBfUkFOR0VfU1RSQ1QgKnN1cHAgKQorKi5QVVJQT1NFCQlDaGVja3MgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIGFuIGFjdG9yIGFuZCBhIHN1cHBsaWVyLgorKgorKi5BUkdVTUVOVFMKKyoJYWN0cAorKglzdXBwCisqCisqLlJFVFVSTlMKKyoJTlVMTAlpbmNvbXBhdGlibGUKKyoJPD5OVUxMCXBvaW50ZXIgdG8gbWF0Y2hpbmcgQ0ZHX1JBTkdFX1NQRUNfU1RSQ1Qgc3Vic3RydWN0dXJlIGluIGFjdG9yLXN0cnVjdHVyZSBtYXRjaGluZyB0aGUgc3VwcGxpZXIKKyoKKyouTkFSUkFUSVZFCisqCisqICBQYXJhbWV0ZXJzOgorKglhY3RwCWFkZHJlc3Mgb2YgdGhlIGFjdG9yIHNwZWNpZmljYXRpb24KKyoJc3VwcAlhZGRyZXNzIG9mIHRoZSBzdXBwbGllciBzcGVjaWZpY2F0aW9uCisqCisqCURlc2NyaXB0aW9uOiBtbWRfY2hlY2tfY29tcCBpcyBhIHN1cHBvcnQgcm91dGluZSB0byBjaGVjayB0aGUgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIGFuIGFjdG9yIGFuZCBhCisqCXN1cHBsaWVyLiAgbW1kX2NoZWNrX2NvbXAgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIGVuZGlhbmVzcyBvZiB0aGUgYWN0cCBhbmQgc3VwcCBzdHJ1Y3R1cmVzLiBUaGlzIGlzCisqCWFjaGlldmVkIGJ5IGNoZWNraW5nIHRoZSAiYm90dG9tIiBvciAicm9sZSIgZmllbGRzIG9mIHRoZXNlIHN0cnVjdHVyZXMuIFNpbmNlIHRoZXNlIGZpZWxkcyBhcmUgcmVzdHJpY3RlZAorKgl0byBhIGxpbWl0ZWQgcmFuZ2UsIGNvbXBhcmluZyB0aGUgY29udGVudHMgdG8gYSB2YWx1ZSB3aXRoIGEga25vd24gZW5kaWFuLWVzcyBnaXZlcyBhIGNsdWUgdG8gdGhlaXIgYWN0dWFsCisqCWVuZGlhbmVzcy4KKyoKKyouRElBR1JBTQorKjFhOiBUaGUgcm9sZS1maWVsZCBvZiB0aGUgYWN0b3Igc3RydWN0dXJlIGhhcyBhIGtub3duIG5vbi16ZXJvLCBub3QgImJ5dGUgc3ltbWV0cmljIiB2YWx1ZSAobmFtZWx5CisqCUNPTVBfUk9MRV9BQ1Qgb3IgMHgwMDAxKSwgc28gaWYgYW5kIG9ubHkgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmllbGQgbWF0Y2hlcyBDT01QX1JPTEVfQUNUIChpbiBOYXRpdmUKKyoJRW5kaWFuIGZvcm1hdCksIHRoZSBhY3RvciBzdHJ1Y3R1cmUgaXMgTmF0aXZlIEVuZGlhbi4KKyoyYTogU2luY2UgdGhlIHJvbGUtZmllbGQgb2YgdGhlIHN1cHBsaWVyIHN0cnVjdHVyZSBpcyAweDAwMDAsIHRoZSB0ZXN0IGFzIHVzZWQgZm9yIHRoZSBhY3RvciBkb2VzIG5vdCB3b3JrCisqCWZvciBhIHN1cHBsaWVyLiBBIHN1cHBsaWVyIGhhcyBhbHdheXMgZXhhY3RseSAxIHZhcmlhbnQsdG9wLGJvdHRvbSByZWNvcmQgd2l0aCAob2ZmaWNpYWxseSwgYnV0IHNlZSB0aGUKKyoJbm90ZSBiZWxvdykgZWFjaCBvZiB0aGVzZSAzIHZhbHVlcyBpbiB0aGUgcmFuZ2UgMSB0aHJvdWdoIDk5LCBzbyBvbmUgYnl0ZSBvZiB0aGUgd29yZCB2YWx1ZSBvZiB2YXJpYW50LAorKgl0b3AgYW5kIGJvdHRvbSB3b3JkcyBpcyAweDAwIGFuZCB0aGUgb3RoZXIgYnl0ZSBpcyBub24temVyby4gV2hldGhlciB0aGUgbG93ZXN0IGFkZHJlc3MgYnl0ZSBvciB0aGUKKyoJaGlnaGVzdCBhZGRyZXNzIGJ5dGUgaXMgbm9uLXplcm8gZGVwZW5kcyBvbiB0aGUgRW5kaWFuZXNzIG9mIHRoZSBMVFYuIElmIGFuZCBvbmx5IGlmIHRoZSB3b3JkIHZhbHVlIG9mCisqCWJvdHRvbSBpcyBsZXNzIHRoYW4gMHgwMTAwLCB0aGUgc3VwcGxpZXIgaXMgTmF0aXZlIEVuZGlhbi4KKyoJTk9URTogdGhlIHZhcmlhbnQgZmllbGQgb2YgdGhlIHN1cHBsaWVyIHN0cnVjdHVyZSBjYW4gbm90IGJlIHVzZWQgZm9yIHRoZSBFbmRpYW4gRGV0ZWN0aW9uIEFsZ29yaXRobSwKKyoJYmVjYXVzZSBhIGEgemVyby12YWx1ZWQgdmFyaWFudCBoYXMgYmVlbiB1c2VkIGFzIENvbnRyb2xsZWQgRGVwbG95bWVudCBpbmRpY2F0aW9uIGluIHRoZSBwYXN0LgorKglOb3RlOiBBbiBhY3RvciBtYXkgaGF2ZSBtdWx0aXBsZSBzZXRzIG9mIHZhcmlhbnQsdG9wLGJvdHRvbSByZWNvcmRzLCBpbmNsdWRpbmcgZHVtbXkgc2V0cyB3aXRoIHZhcmlhbnQsCisqCXRvcCBhbmQgYm90dG9tIGZpZWxkcyB3aXRoIGEgemVyby12YWx1ZS4gQXMgYSBjb25zZXF1ZW5jZSB0aGUgZW5kaWFuZXNzIG9mIHRoZSBhY3RvciBjYW4gbm90IGJlIGRldGVybWluZWQKKyoJYmFzZWQgb24gaXRzIHZhcmlhbnQsdG9wLGJvdHRvbSB2YWx1ZXMuCisqCisqCU5vdGU6IHRoZSBMIGFuZCBUIGZpZWxkIG9mIHRoZSBzdHJ1Y3R1cmVzIGFyZSBhbHdheXMgaW4gTmF0aXZlIEVuZGlhbiBmb3JtYXQsIHNvIHlvdSBjYW4gbm90IGRyYXcKKyoJY29uY2x1c2lvbnMgY29uY2VybmluZyB0aGUgRW5kaWFuZXNzIG9mIHRoZSBzdHJ1Y3R1cmUgYmFzZWQgb24gdGhlc2UgdHdvIGZpZWxkcy4KKyoKKyoxYi8yYgorKglUaGUgb25seSBwdXJwb3NlIG9mIHRoZSBDRkdfUkFOR0VfU1BFQ19CWVRFX1NUUkNUIGlzIHRvIGdpdmUgZWFzeSBhY2Nlc3MgdG8gdGhlIG5vbi16ZXJvIGJ5dGUgb2YgdGhlIHdvcmQKKyoJdmFsdWUgb2YgdmFyaWFudCwgdG9wIGFuZCBib3R0b20uIFRoZSB2YXJpYWJsZXMgc3VwX2VuZGlhbiBhbmQgYWN0X2VuZGlhbiBhcmUgdXNlZCBmb3IgdGhlIHN1cHBsaWVyIGFuZAorKglhY3RvciBzdHJ1Y3R1cmUgcmVzcGVjdGl2ZWx5LiBUaGVzZSB2YXJpYWJsZXMgbXVzdCBiZSAwIHdoZW4gdGhlIHN0cnVjdHVyZSBoYXMgTEUgZm9ybWF0IGFuZCAxIGlmIHRoZQorKglzdHJ1Y3R1cmUgaGFzIEJFIGZvcm1hdC4gVGhpcyBjYW4gYmUgcGhyYXNlZCBhczoKKyoJdGhlIHZhcmlhYmxlIGlzIGZhbHNlIChpLmUgMHgwMDAwKSBpZiBlaXRoZXIKKyoJCSh0aGUgcGxhdGZvcm0gaXMgTEUgYW5kIHRoZSBMVFYgaXMgdGhlIHNhbWUgYXMgdGhlIHBsYXRmb3JtKQorKglvcgorKgkJKHRoZSBwbGF0Zm9ybSBpcyBCRSBhbmQgdGhlIExUViBkaWZmZXJzIGZyb20gdGhlIHBsYXRmb3JtKS4KKyoJdGhlIHZhcmlhYmxlIGlzIHRydWUgKGkuZSAweDAwMDEpIGlmIGVpdGhlcgorKgkJKHRoZSBwbGF0Zm9ybSBpcyBCRSBhbmQgdGhlIExUViBpcyB0aGUgc2FtZSBhcyB0aGUgcGxhdGZvcm0pCisqCW9yCisqCQkodGhlIHBsYXRmb3JtIGlzIExFIGFuZCB0aGUgTFRWIGRpZmZlcnMgZnJvbSB0aGUgcGxhdGZvcm0pLgorKgorKglBbHRlcm5hdGl2ZWx5IHRoaXMgY2FuIGJlIHBocmFzZWQgYXM6CisqCWlmIHRoZSBwbGF0Zm9ybSBpcyBMRQorKgkJaWYgdGhlIExUViBpcyBMRSAoaS5lIHRoZSBzYW1lIGFzIHRoZSBwbGF0Zm9ybSksIHRoZW4gdGhlIHZhcmlhYmxlID0gMAorKgkJZWxzZSAodGhlIExUViBpcyBCRSAoaS5lLiBkaWZmZXJlbnQgZnJvbSB0aGUgcGxhdGZvcm0pICksIHRoZW4gdGhlIHZhcmlhYmxlID0gMQorKglpZiB0aGUgcGxhdGZvcm0gaXMgQkUKKyoJCWlmIHRoZSBMVFYgaXMgQkUgKGkuZSB0aGUgc2FtZSBhcyB0aGUgcGxhdGZvcm0pLCB0aGVuIHRoZSB2YXJpYWJsZSA9IDEKKyoJCWVsc2UgKHRoZSBMVFYgaXMgTEUgKGkuZS4gZGlmZmVyZW50IGZyb20gdGhlIHBsYXRmb3JtKSApLCB0aGVuIHRoZSB2YXJpYWJsZSA9IDAKKyoKKyoJVGhpcyBpcyBpbXBsZW1lbnRlZCBhczoKKyoJI2lmIEhDRl9CSUdfRU5ESUFOID09IDAJLy9wbGF0Zm9ybSBpcyBMRQorKgkJc3VwL2FjdF9lbmRpYW4gYmVjb21lcyByZXZlcnNlIG9mIHN0cnVjdHVyZS1lbmRpYW5lc3MgYXMgZGV0ZXJtaW5lZCBpbiAxYS8xYgorKgkjZW5kaWYKKyo2OglFYWNoIG9mIHRoZSBhY3RvciB2YXJpYW50LWJvdHRvbS10b3AgcmVjb3JkcyBpcyBjaGVja2VkIGFnYWluc3QgdGhlIChzaW5nbGUpIHN1cHBsaWVyIHZhcmlhbnQtYm90dG9tLXRvcAorKglyYW5nZSB0aWxsIGVpdGhlciBhbiBhY2NlcHRhYmxlIG1hdGNoIGlzIGZvdW5kIG9yIGFsbCBhY3RvciByZWNvcmRzIGFyZSB0cmllZC4gQXMgZXhwbGFpbmVkIGFib3ZlLCBkdWUgdG8KKyoJdGhlIGxpbWl0ZWQgcmFuZ2VzIG9mIHRoZXNlIHZhbHVlcywgY2hlY2tpbmcgYSBieXRlIGlzIGFjY2VwdGFibGUgYW5kIHN1aXRhYmxlLgorKjg6CWRlcGVuZGluZyBvbiB3aGV0aGVyIGEgbWF0Y2ggd2FzIGZvdW5kIG9yIG5vdCAoYXMgcmVmbGVjdGVkIGJ5IHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbCB2YXJpYWJsZSBvZiB0aGUKKyoJZm9yIGxvb3ApLCB0aGUgTlVMTCBwb2ludGVyIG9yIGEgcG9pbnRlciB0byB0aGUgbWF0Y2hpbmcgTnVtYmVyL0JvdHRvbS9Ub3AgcmVjb3JkIG9mIHRoZSBBY3RvciBzdHJ1Y3R1cmUKKyoJaXMgcmV0dXJuZWQuCisqCUFzIGFuIGFkZGl0aW9uYWwgc2FmZXR5LCBjaGVja2luZyB0aGUgc3VwcGxpZXIgbGVuZ3RoIHByb3RlY3RzIGFnYWluc3QgaW52YWxpZCBTdXBwbGllciBzdHJ1Y3R1cmVzLCB3aGljaAorKgltYXkgYmUgY2F1c2VkIGJ5IGZhaWxpbmcgaGNmX2dldF9pbmZvIChpbiB3aGljaCBjYXNlIHRoZSBsZW4tZmllbGQgaXMgemVybykuIE5vdGUgdGhhdCB0aGUgY29udHJhcHRpb24KKyoJInN1cHAtPmxlbiAhPSBzaXplb2YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkvc2l6ZW9mKGhjZl8xNikgLSAxIgorKglkaWQgdHVybiBvdXQgbm90IHRvIHdvcmsgZm9yIGEgY29tcGlsZXIgd2hpY2ggcGFkZGVkIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyoKKyogTm90ZTogd2hlbiBjb25zdWx0aW5nIHJlZmVyZW5jZXMgbGlrZSBEZXNpZ25Ob3RlcyBhbmQgQXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb25zIHRoZXJlIGlzIGEgY29uZnVzaW5nIHVzZQorKglvZiB0aGUgbm90aW9ucyBudW1iZXIgYW5kIHZhcmlhbnQuIFRoaXMgcmVzdWx0ZWQgaW4gYW4gaW5jb25zaXN0ZW50IHVzZSBpbiB0aGUgSENGIG5vbWVuY2xhdHVyZSBhcyB3ZWxsLgorKglUaGlzIG1ha2VzIHRoZSBsb2dpYyBoYXJkIHRvIGZvbGxvdyBhbmQgb25lIGhhcyB0byBiZSB2ZXJ5IG11Y2ggYXdhcmUgb2YgdGhlIGNvbnRleHQgd2hlbiB3YWxraW5nIHRocm91Z2gKKyoJdGhlIGNvZGUuCisqIE5PVEU6IFRoZSBFbmRpYW4gRGV0ZWN0aW9uIEFsZ29yaXRobSBwbGFjZXMgbGltaXRhdGlvbnMgb24gZnV0dXJlIGV4dGVuc2lvbnMgb2YgdGhlIGZpZWxkcywgaS5lLiB0aGV5IHNob3VsZAorKglzdGF5IHdpdGhpbiB0aGUgY3VycmVudGx5IGRlZmluZWQgYm91bmRhcmllcyBvZiAxIHRocm91Z2ggOTkgKGFsdGhvdWdoIDEgdGhyb3VnaCAyNTUpIHdvdWxkIHdvcmsgYXMgd2VsbAorKglhbmQgdGhlcmUgc2hvdWxkIG5ldmVyIGJlIHVzZWQgYSB6ZXJvIHZhbHVlIGZvciB0aGUgYm90dG9tIG9mIGEgdmFsaWQgc3VwcGxpZXIuCisqIE5vdGU6IHJlbGF0aXZlIHRvIEFzc2VydHMsIHRoZSBmb2xsb3dpbmcgY2FuIGJlIG9ic2VydmVkOgorKgkxOiBTdXBwbGllciB2YXJpYW50IDB4MDAwMCBoYXMgYmVlbiB1c2VkIGZvciBDb250cm9sbGVkIERlcGxveW1lbnQKKyoJMjogQW4gYWN0b3IgbWF5IGhhdmUgb25lIG9yIG1vcmUgdmFyaWFudCByZWNvcmQgc3BlY2lmaWNhdGlvbnMgd2l0aCBhIHRvcCBvZiB6ZXJvIGFuZCBhIG5vbi16ZXJvIGJvdHRvbQorKgl0byBvdmVycmlkZSB0aGUgSENGIGRlZmF1bHQgc3VwcG9ydCBvZiBhIHBhcnRpY3VsYXIgdmFyaWFudCBieSB0aGUgTVNGIHByb2dyYW1tZXIgdmlhIGhjZmNmZy5oCisqCTM6CUFuIGFjdG9yIHJhbmdlIGNhbiBiZSBzcGVjaWZpZWQgYXMgYWxsIHplcm9zLCBlLmcuIGFzIHBhZGRpbmcgaW4gdGhlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpcm13YXJlCisqCWltYWdlIGZpbGVzLgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDRkdfUkFOR0VfU1BFQ19TVFJDVCoKK21tZF9jaGVja19jb21wKCBDRkdfUkFOR0VTX1NUUkNUICphY3RwLCBDRkdfU1VQX1JBTkdFX1NUUkNUICpzdXBwICkKK3sKKworQ0ZHX1JBTkdFX1NQRUNfQllURV9TVFJDVCAgKmFjdHEgPSAoQ0ZHX1JBTkdFX1NQRUNfQllURV9TVFJDVCopYWN0cC0+dmFyX3JlYzsKK0NGR19SQU5HRV9TUEVDX0JZVEVfU1RSQ1QgICpzdXBxID0gKENGR19SQU5HRV9TUEVDX0JZVEVfU1RSQ1QqKSYoc3VwcC0+dmFyaWFudCk7CitoY2ZfMTYJaTsKK2ludAkJYWN0X2VuZGlhbjsJCQkJCS8vYWN0b3IgZW5kaWFuIGZsYWcKK2ludAkJc3VwX2VuZGlhbjsJCQkJCS8vc3VwcGxpZXIgZW5kaWFuIGZsYWcKKworCWFjdF9lbmRpYW4gPSBhY3RwLT5yb2xlID09IENPTVBfUk9MRV9BQ1Q7CS8vdHJ1ZSBpZiBuYXRpdmUgZW5kaWFuCQkJCS8qIDFhICovCisJc3VwX2VuZGlhbiA9IHN1cHAtPmJvdHRvbSA8IDB4MDEwMDsJCSAJLy90cnVlIGlmIG5hdGl2ZSBlbmRpYW4JCQkJLyogMmEgKi8KKworI2lmIEhDRl9BU1NFUlQKKwlNTURBU1NFUlQoIHN1cHAtPmxlbiA9PSA2LCAJCQkJCQkJCQkJCQkJCQkJc3VwcC0+bGVuICkKKwlNTURBU1NFUlQoIGFjdHAtPmxlbiA+PSA2ICYmIGFjdHAtPmxlbiUzID09IDAsIAkJCQkJCQkJCQkJYWN0cC0+bGVuICkKKworCWlmICggYWN0X2VuZGlhbiApIHsJCQkJCQkJLy9uYXRpdmUgZW5kaWFuCisJCU1NREFTU0VSVCggYWN0cC0+cm9sZSA9PSBDT01QX1JPTEVfQUNULAkJCQkJCQkJCQkJCWFjdHAtPnJvbGUgKQorCQlNTURBU1NFUlQoIDEgPD0gYWN0cC0+aWQgJiYgYWN0cC0+aWQgPD0gOTksICAJCQkJCQkJCQkJYWN0cC0+aWQgKQorCX0gZWxzZSB7CQkJCQkJCQkJLy9ub24tbmF0aXZlIGVuZGlhbgorCQlNTURBU1NFUlQoIGFjdHAtPnJvbGUgPT0gQ05WX0VORF9TSE9SVChDT01QX1JPTEVfQUNUKSwJIAkJCQkJCQlhY3RwLT5yb2xlICkKKwkJTU1EQVNTRVJUKCAxIDw9IENOVl9FTkRfU0hPUlQoYWN0cC0+aWQpICYmIENOVl9FTkRfU0hPUlQoYWN0cC0+aWQpIDw9IDk5LAkJCQlhY3RwLT5pZCApCisJfQorCWlmICggc3VwX2VuZGlhbiApIHsJCQkJCQkJLy9uYXRpdmUgZW5kaWFuCisJCU1NREFTU0VSVCggc3VwcC0+cm9sZSA9PSBDT01QX1JPTEVfU1VQTCwgCQkJCQkJCQkJCQlzdXBwLT5yb2xlICkKKwkJTU1EQVNTRVJUKCAxIDw9IHN1cHAtPmlkICAgICAgJiYgc3VwcC0+aWQgPD0gOTksICAJCQkJCQkJCQlzdXBwLT5pZCApCisJCU1NREFTU0VSVCggMSA8PSBzdXBwLT52YXJpYW50ICYmIHN1cHAtPnZhcmlhbnQgPD0gOTksICAJCQkJCQkJCXN1cHAtPnZhcmlhbnQgKQorCQlNTURBU1NFUlQoIDEgPD0gc3VwcC0+Ym90dG9tICAmJiBzdXBwLT5ib3R0b20gPD0gOTksIAkJCQkJCQkJc3VwcC0+Ym90dG9tICkKKwkJTU1EQVNTRVJUKCAxIDw9IHN1cHAtPnRvcCAgICAgJiYgc3VwcC0+dG9wIDw9IDk5LCAJCSAJCQkJCQkJc3VwcC0+dG9wICkKKwkJTU1EQVNTRVJUKCBzdXBwLT5ib3R0b20gPD0gc3VwcC0+dG9wLAkJCQkJCQlzdXBwLT5ib3R0b20gPDwgOCB8IHN1cHAtPnRvcCApCisJfSBlbHNlIHsJCQkJCQkJCQkvL25vbi1uYXRpdmUgZW5kaWFuCisJCU1NREFTU0VSVCggc3VwcC0+cm9sZSA9PSBDTlZfRU5EX1NIT1JUKENPTVBfUk9MRV9TVVBMKSwgCQkJCQkJCQlzdXBwLT5yb2xlICkKKwkJTU1EQVNTRVJUKCAxIDw9IENOVl9FTkRfU0hPUlQoc3VwcC0+aWQpICYmIENOVl9FTkRfU0hPUlQoc3VwcC0+aWQpIDw9IDk5LAkJCQlzdXBwLT5pZCApCisJCU1NREFTU0VSVCggMSA8PSBDTlZfRU5EX1NIT1JUKHN1cHAtPnZhcmlhbnQpICYmIENOVl9FTkRfU0hPUlQoc3VwcC0+dmFyaWFudCkgPD0gOTksCQlzdXBwLT52YXJpYW50ICkKKwkJTU1EQVNTRVJUKCAxIDw9IENOVl9FTkRfU0hPUlQoc3VwcC0+Ym90dG9tKSAgJiYgQ05WX0VORF9TSE9SVChzdXBwLT5ib3R0b20pIDw9OTksCQlzdXBwLT5ib3R0b20gKQorCQlNTURBU1NFUlQoIDEgPD0gQ05WX0VORF9TSE9SVChzdXBwLT50b3ApICAgICAmJiBDTlZfRU5EX1NIT1JUKHN1cHAtPnRvcCkgPD05OSwgIAkJc3VwcC0+dG9wICkKKwkJTU1EQVNTRVJUKCBDTlZfRU5EX1NIT1JUKHN1cHAtPmJvdHRvbSkgPD0gQ05WX0VORF9TSE9SVChzdXBwLT50b3ApLAlzdXBwLT5ib3R0b20gPDwgOCB8CXN1cHAtPnRvcCApCisJfQorI2VuZGlmIC8vIEhDRl9BU1NFUlQKKworI2lmIEhDRl9CSUdfRU5ESUFOID09IDAKKwlhY3RfZW5kaWFuID0gIWFjdF9lbmRpYW47CQkJCQkJCQkJCQkJCQkJCQkJLyogMWIqLworCXN1cF9lbmRpYW4gPSAhc3VwX2VuZGlhbjsJCQkJCQkJCQkJCQkJCQkJCQkvKiAyYiovCisjZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KKworCWZvciAoIGkgPSBhY3RwLT5sZW4gOyBpID4gMzsgYWN0cSsrLCBpIC09IDMgKSB7CQkJCQkJCQkJCQkJCS8qIDYgKi8KKwkJTU1EQVNTRVJUKCBhY3RxLT52YXJpYW50W2FjdF9lbmRpYW5dIDw9IDk5LCBpPDw4IHwgYWN0cS0+dmFyaWFudFthY3RfZW5kaWFuXSApCisJCU1NREFTU0VSVCggYWN0cS0+Ym90dG9tW2FjdF9lbmRpYW5dIDw9IDk5ICwgaTw8OCB8IGFjdHEtPmJvdHRvbVthY3RfZW5kaWFuXSApCisJCU1NREFTU0VSVCggYWN0cS0+dG9wW2FjdF9lbmRpYW5dIDw9IDk5CSAgLCBpPDw4IHwgYWN0cS0+dG9wW2FjdF9lbmRpYW5dICkKKwkJTU1EQVNTRVJUKCBhY3RxLT5ib3R0b21bYWN0X2VuZGlhbl0gPD0gYWN0cS0+dG9wW2FjdF9lbmRpYW5dLCBpPDw4IHwgYWN0cS0+Ym90dG9tW2FjdF9lbmRpYW5dICkKKwkJaWYgKCBhY3RxLT52YXJpYW50W2FjdF9lbmRpYW5dID09IHN1cHEtPnZhcmlhbnRbc3VwX2VuZGlhbl0gJiYKKwkJCSBhY3RxLT5ib3R0b21bYWN0X2VuZGlhbl0gIDw9IHN1cHEtPnRvcFtzdXBfZW5kaWFuXSAmJgorCQkJIGFjdHEtPnRvcFthY3RfZW5kaWFuXSAgICAgPj0gc3VwcS0+Ym90dG9tW3N1cF9lbmRpYW5dCisJCSAgICkgYnJlYWs7CisJfQorCWlmICggaSA8PSAzIHx8IHN1cHAtPmxlbiAhPSA2IC8qc2l6ZW9mKENGR19TVVBfUkFOR0VfU1RSQ1QpL3NpemVvZihoY2ZfMTYpIC0gMSAqLyApIHsKKwkgICBhY3RxID0gTlVMTDsJCQkJCQkJCQkJCQkJCQkJCQkJCQkvKiA4ICovCisJfQorI2lmIEhDRl9BU1NFUlQKKwlpZiAoIGFjdHEgPT0gTlVMTCApIHsKKwkJZm9yICggaSA9IDA7IGkgPD0gc3VwcC0+bGVuOyBpICs9IDIgKSB7CisJCQlNTURBU1NFUlQoIERPX0FTU0VSVCwgTUVSR0VfMiggKChoY2ZfMTYqKXN1cHApW2ldLCAoKGhjZl8xNiopc3VwcClbaSsxXSApICk7CisJCX0KKwkJZm9yICggaSA9IDA7IGkgPD0gYWN0cC0+bGVuOyBpICs9IDIgKSB7CisJCQlNTURBU1NFUlQoIERPX0FTU0VSVCwgTUVSR0VfMiggKChoY2ZfMTYqKWFjdHApW2ldLCAoKGhjZl8xNiopYWN0cClbaSsxXSApICk7CisJCX0KKwl9CisjZW5kaWYgLy8gSENGX0FTU0VSVAorCXJldHVybiAoQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QqKWFjdHE7Cit9IC8vIG1tZF9jaGVja19jb21wCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL21tZC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvbW1kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4OTBjMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL21tZC5oCkBAIC0wLDAgKzEsNzggQEAKKworLy8gICB2aW06dHc9MTEwOnRzPTQ6CisjaWZuZGVmIE1NRF9ICisjZGVmaW5lIE1NRF9IIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRklMRQkgIDogbW1kLmgKKyoKKyogREFURSAgICA6ICREYXRlOiAyMDA0LzA3LzE5IDA4OjE2OjE0ICQgICAkUmV2aXNpb246IDEuMiAkCisqIE9yaWdpbmFsOiAyMDA0LzA1LzE3IDA3OjMzOjE0ICAgIFJldmlzaW9uOiAxLjE4ICAgICAgVGFnOiBoY2Y3X3QyMDA0MDYwMl8wMQorKiBPcmlnaW5hbDogMjAwNC8wNS8xMSAwNjoyMjo1OSAgICBSZXZpc2lvbjogMS4xNyAgICAgIFRhZzogaGNmN190N18yMDA0MDUxM18wMQorKiBPcmlnaW5hbDogMjAwNC8wNC8xNSAwOToyNDo0MiAgICBSZXZpc2lvbjogMS4xMyAgICAgIFRhZzogaGNmN190N18yMDA0MDQxNV8wMQorKiBPcmlnaW5hbDogMjAwNC8wNC8wOCAxNToxODoxNyAgICBSZXZpc2lvbjogMS4xMiAgICAgIFRhZzogdDdfMjAwNDA0MTNfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDQvMDEgMTU6MzI6NTUgICAgUmV2aXNpb246IDEuMTAgICAgICBUYWc6IHQ3XzIwMDQwNDAxXzAxCisqIE9yaWdpbmFsOiAyMDA0LzAzLzA0IDE2OjQ3OjUwICAgIFJldmlzaW9uOiAxLjcgICAgICBUYWc6IHQyMDA0MDMxMF8wMQorKiBPcmlnaW5hbDogMjAwNC8wMy8wMyAxMjo0NzowNSAgICBSZXZpc2lvbjogMS42ICAgICAgVGFnOiB0MjAwNDAzMDRfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDIvMjUgMTQ6MTQ6MzkgICAgUmV2aXNpb246IDEuNSAgICAgIFRhZzogdDIwMDQwMzAyXzAzCisqIE9yaWdpbmFsOiAyMDA0LzAyLzI0IDEzOjAwOjI5ICAgIFJldmlzaW9uOiAxLjQgICAgICBUYWc6IHQyMDA0MDIyNF8wMQorKiBPcmlnaW5hbDogMjAwNC8wMS8zMCAwOTo1OTozMyAgICBSZXZpc2lvbjogMS4zICAgICAgVGFnOiB0MjAwNDAyMTlfMDEKKyoKKyogQVVUSE9SICA6IE5pY28gVmFsc3RlcgorKgorKiBERVNDICAgIDogRGVmaW5pdGlvbnMgYW5kIFByb3RvdHlwZXMgZm9yIEhDRiwgTVNGLCBVSUwgYXMgd2VsbCBhcyBVU0Ygc291cmNlcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqIFNPRlRXQVJFIExJQ0VOU0UKKyoKKyogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisqCisqIENPUFlSSUdIVCCpIDIwMDEgLSAyMDA0CWJ5IEFnZXJlIFN5c3RlbXMgSW5jLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisqICAgIGRpc3RyaWJ1dGlvbi4KKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqCisqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogRGlzY2xhaW1lcgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisqIERBTUFHRS4KKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBIQ0ZfSAorI2luY2x1ZGUgImhjZi5oIgkvL2p1c3QgdG8gZ2V0IGdvaW5nIHdpdGggc3dpZworI2VuZGlmCisKK0VYVEVSTl9DIENGR19SQU5HRV9TUEVDX1NUUkNUKiBtbWRfY2hlY2tfY29tcCggQ0ZHX1JBTkdFU19TVFJDVCAqYWN0cCwgQ0ZHX1NVUF9SQU5HRV9TVFJDVCAqc3VwcCApOworCisjZW5kaWYgLy8gTU1EX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3N0YV9oMi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvc3RhX2gyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhMzg1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3N0YV9oMi5jCkBAIC0wLDAgKzEsNDQ4MCBAQAorLyoKKyAqIEZpbGU6CXN0YV9oMjQuMjM2CisgKgorICogQWJzdHJhY3Q6CVRoaXMgZmlsZSBjb250YWlucyBtZW1vcnkgaW1hZ2UgJ2Z3X2ltYWdlJy4KKyAqCisgKiBDb250ZW50czoJVG90YWwgc2l6ZSBvZiB0aGUgbWVtb3J5IGltYWdlOiA2OTI5NCBieXRlcy4KKyAqCQlUb3RhbCBudW1iZXIgb2YgYmxvY2tzOiA0IGJsb2Nrcy4KKyAqCQlCbG9jayAgMSA6IGxvYWQgYWRkcmVzcyAwMDAwMDA2MCwgMzkwIGJ5dGVzLgorICoJCUJsb2NrICAyIDogbG9hZCBhZGRyZXNzIDAwMDAwQzE2LCA5NDk2IGJ5dGVzLgorICoJCUJsb2NrICAzIDogbG9hZCBhZGRyZXNzIDAwMUUzMTJFLCAxNTc4NiBieXRlcy4KKyAqCQlCbG9jayAgNCA6IGxvYWQgYWRkcmVzcyAwMDFGNDAwMCwgNDM2MjIgYnl0ZXMuCisgKgorICogSWRlbnRpdHk6CWNvbXBvbmVudCBpZDogMzEgKHZhcmlhbnQgMykgdmVyc2lvbiAyLjM2CisgKgorICogQ29tcGF0aWJpbGl0eToKKyAqCQlzdXBwbHlpbmcgaW50ZXJmYWNlIDQgKHZhcmlhbnQgMikgOiAyIC0gNQorICoJCWFjdGluZyBvbiBpbnRlcmZhY2UgMSAodmFyaWFudCA0KSA6IDYgLSA3CisgKgkJYWN0aW5nIG9uIGludGVyZmFjZSAxICh2YXJpYW50IDUpIDogNiAtIDcKKyAqCQlhY3Rpbmcgb24gaW50ZXJmYWNlIDEgKHZhcmlhbnQgNikgOiA2IC0gNworICoJCWFjdGluZyBvbiBpbnRlcmZhY2UgMiAodmFyaWFudCAyKSA6IDEgLSAyCisgKgorICogR2VuZXJhdGVkOglieSBnOlxmd1xmdXB1My5leGUgdmVyc2lvbiA0LjI2CisgKgorICogQ29tbWFuZGxpbmU6CWc6XGZ3XGZ1cHUzLmV4ZSAvZj00IC9uPWZ3X2ltYWdlIC9pPXIzMDIzNjAwLmhleAorICovCisKKworI2luY2x1ZGUgImhjZmNmZy5oIgkJCQkvLyB0byBnZXQgaGNmXzE2IGV0YyBkZWZpbmVkIGFzIHdlbGwgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libGUgc2V0dGluZ3Mgd2hpY2ggaW5sdWVuY2UgbWRkLmggb3IgZGhmLmgKKyNpbmNsdWRlICJtZGQuaCIgICAJCQkJLy90byBnZXQgQ09NUF9JRF9TVEEgZXRjIGRlZmluZWQKKyNpbmNsdWRlICJkaGYuaCIgICAJCQkJLy91c2VkIHRvIGJlICJmaGZtZW0uaCIsIHRvIGdldCBtZW1ibG9jayxwbHVncmVjb3JkLAorCitzdGF0aWMgY29uc3QgaGNmXzggZndfaW1hZ2VfMV9kYXRhW10gPSB7CisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUMsIDB4MEQsIDB4MDAsIDB4MDAsCisJIDB4M0EsIDB4MEMsIDB4MDAsIDB4MDAsIDB4M0EsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUIsIDB4MDAsIDB4MUIsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4ODYsIDB4MTksIDB4ODYsIDB4MTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsCisJIDB4MDYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4RUEsIDB4MDAsIDB4MDAsIDB4RkYsIDB4MDcsIDB4MDEsIDB4MDAsIDB4NjQsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MTAsIDB4MjcsIDB4MTAsIDB4MjcsCisJIDB4MTQsIDB4MDAsIDB4RDAsIDB4MDcsIDB4RDAsIDB4MDcsIDB4MTAsIDB4MjcsIDB4MkYsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MDUsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MTAsIDB4MjcsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MEEsIDB4MDAsCisJIDB4MDcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDksIDB4MkIsIDB4MDksIDB4MkIsIDB4MDksCisJIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NkUsIDB4MDAsIDB4MTQsIDB4MDEsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MzIsIDB4MDAsCisJIDB4MEEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisKK307ICAvKiBmd19pbWFnZV8xX2RhdGEgKi8KKworc3RhdGljIGNvbnN0IGhjZl84IGZ3X2ltYWdlXzJfZGF0YVtdID0geworCSAweDRCLCAweEEzLCAweDAwLCAweDBBLCAweDEwLCAweDAxLCAweDY4LCAweEE0LCAweEIwLCAweDAxLCAweDg0LCAweDAxLCAweDMwLCAweDMzLCAweDMxLCAweDMzLAorCSAweDQ0LCAweDQ0LCAweDMwLCAweDMzLCAweDMxLCAweDMzLCAweDMwLCAweDMzLCAweDMxLCAweDMzLCAweDMyLCAweDMzLCAweDMyLCAweDMzLCAweDkwLCAweDAwLAorCSAweDc4LCAweDA0LCAweEFFLCAweEU0LCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCLAorCSAweDBDLCAweDBELCAweDBFLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE1LCAweEM2LCAweDg0LCAweEY4LCAweDk5LCAweEVFLAorCSAweDhELCAweEY2LCAweDBELCAweEZGLCAweEJELCAweEQ2LCAweEIxLCAweERFLCAweDU0LCAweDkxLCAweDUwLCAweDYwLCAweDAzLCAweDAyLCAweEE5LCAweENFLAorCSAweDdELCAweDU2LCAweDE5LCAweEU3LCAweDYyLCAweEI1LCAweEU2LCAweDRELCAweDlBLCAweEVDLCAweDQ1LCAweDhGLCAweDlELCAweDFGLCAweDQwLCAweDg5LAorCSAweDg3LCAweEZBLCAweDE1LCAweEVGLCAweEVCLCAweEIyLCAweEM5LCAweDhFLCAweDBCLCAweEZCLCAweEVDLCAweDQxLCAweDY3LCAweEIzLCAweEZELCAweDVGLAorCSAweEVBLCAweDQ1LCAweEJGLCAweDIzLCAweEY3LCAweDUzLCAweDk2LCAweEU0LCAweDVCLCAweDlCLCAweEMyLCAweDc1LCAweDFDLCAweEUxLCAweEFFLCAweDNELAorCSAweDZBLCAweDRDLCAweDVBLCAweDZDLCAweDQxLCAweDdFLCAweDAyLCAweEY1LCAweDRGLCAweDgzLCAweDVDLCAweDY4LCAweEY0LCAweDUxLCAweDM0LCAweEQxLAorCSAweDA4LCAweEY5LCAweDkzLCAweEUyLCAweDczLCAweEFCLCAweDUzLCAweDYyLCAweDNGLCAweDJBLCAweDBDLCAweDA4LCAweDUyLCAweDk1LCAweDY1LCAweDQ2LAorCSAweDVFLCAweDlELCAweDI4LCAweDMwLCAweEExLCAweDM3LCAweDBGLCAweDBBLCAweEI1LCAweDJGLCAweDA5LCAweDBFLCAweDM2LCAweDI0LCAweDlCLCAweDFCLAorCSAweDNELCAweERGLCAweDI2LCAweENELCAweDY5LCAweDRFLCAweENELCAweDdGLCAweDlGLCAweEVBLCAweDFCLCAweDEyLCAweDlFLCAweDFELCAweDc0LCAweDU4LAorCSAweDJFLCAweDM0LCAweDJELCAweDM2LCAweEIyLCAweERDLCAweEVFLCAweEI0LCAweEZCLCAweDVCLCAweEY2LCAweEE0LCAweDRELCAweDc2LCAweDYxLCAweEI3LAorCSAweENFLCAweDdELCAweDdCLCAweDUyLCAweDNFLCAweERELCAweDcxLCAweDVFLCAweDk3LCAweDEzLCAweEY1LCAweEE2LCAweDY4LCAweEI5LCAweDAwLCAweDAwLAorCSAweDJDLCAweEMxLCAweDYwLCAweDQwLCAweDFGLCAweEUzLCAweEM4LCAweDc5LCAweEVELCAweEI2LCAweEJFLCAweEQ0LCAweDQ2LCAweDhELCAweEQ5LCAweDY3LAorCSAweDRCLCAweDcyLCAweERFLCAweDk0LCAweEQ0LCAweDk4LCAweEU4LCAweEIwLCAweDRBLCAweDg1LCAweDZCLCAweEJCLCAweDJBLCAweEM1LCAweEU1LCAweDRGLAorCSAweDE2LCAweEVELCAweEM1LCAweDg2LCAweEQ3LCAweDlBLCAweDU1LCAweDY2LCAweDk0LCAweDExLCAweENGLCAweDhBLCAweDEwLCAweEU5LCAweDA2LCAweDA0LAorCSAweDgxLCAweEZFLCAweEYwLCAweEEwLCAweDQ0LCAweDc4LCAweEJBLCAweDI1LCAweEUzLCAweDRCLCAweEYzLCAweEEyLCAweEZFLCAweDVELCAweEMwLCAweDgwLAorCSAweDhBLCAweDA1LCAweEFELCAweDNGLCAweEJDLCAweDIxLCAweDQ4LCAweDcwLCAweDA0LCAweEYxLCAweERGLCAweDYzLCAweEMxLCAweDc3LCAweDc1LCAweEFGLAorCSAweDYzLCAweDQyLCAweDMwLCAweDIwLCAweDFBLCAweEU1LCAweDBFLCAweEZELCAweDZELCAweEJGLCAweDRDLCAweDgxLCAweDE0LCAweDE4LCAweDM1LCAweDI2LAorCSAweDJGLCAweEMzLCAweEUxLCAweEJFLCAweEEyLCAweDM1LCAweENDLCAweDg4LCAweDM5LCAweDJFLCAweDU3LCAweDkzLCAweEYyLCAweDU1LCAweDgyLCAweEZDLAorCSAweDQ3LCAweDdBLCAweEFDLCAweEM4LCAweEU3LCAweEJBLCAweDJCLCAweDMyLCAweDk1LCAweEU2LCAweEEwLCAweEMwLCAweDk4LCAweDE5LCAweEQxLCAweDlFLAorCSAweDdGLCAweEEzLCAweDY2LCAweDQ0LCAweDdFLCAweDU0LCAweEFCLCAweDNCLCAweDgzLCAweDBCLCAweENBLCAweDhDLCAweDI5LCAweEM3LCAweEQzLCAweDZCLAorCSAweDNDLCAweDI4LCAweDc5LCAweEE3LCAweEUyLCAweEJDLCAweDFELCAweDE2LCAweDc2LCAweEFELCAweDNCLCAweERCLCAweDU2LCAweDY0LCAweDRFLCAweDc0LAorCSAweDFFLCAweDE0LCAweERCLCAweDkyLCAweDBBLCAweDBDLCAweDZDLCAweDQ4LCAweEU0LCAweEI4LCAweDVELCAweDlGLCAweDZFLCAweEJELCAweEVGLCAweDQzLAorCSAweEE2LCAweEM0LCAweEE4LCAweDM5LCAweEE0LCAweDMxLCAweDM3LCAweEQzLCAweDhCLCAweEYyLCAweDMyLCAweEQ1LCAweDQzLCAweDhCLCAweDU5LCAweDZFLAorCSAweEI3LCAweERBLCAweDhDLCAweDAxLCAweDY0LCAweEIxLCAweEQyLCAweDlDLCAweEUwLCAweDQ5LCAweEI0LCAweEQ4LCAweEZBLCAweEFDLCAweDA3LCAweEYzLAorCSAweDI1LCAweENGLCAweEFGLCAweENBLCAweDhFLCAweEY0LCAweEU5LCAweDQ3LCAweDE4LCAweDEwLCAweEQ1LCAweDZGLCAweDg4LCAweEYwLCAweDZGLCAweDRBLAorCSAweDcyLCAweDVDLCAweDI0LCAweDM4LCAweEYxLCAweDU3LCAweEM3LCAweDczLCAweDUxLCAweDk3LCAweDIzLCAweENCLCAweDdDLCAweEExLCAweDlDLCAweEU4LAorCSAweDIxLCAweDNFLCAweERELCAweDk2LCAweERDLCAweDYxLCAweDg2LCAweDBELCAweDg1LCAweDBGLCAweDkwLCAweEUwLCAweDQyLCAweDdDLCAweEM0LCAweDcxLAorCSAweEFBLCAweENDLCAweEQ4LCAweDkwLCAweDA1LCAweDA2LCAweDAxLCAweEY3LCAweDEyLCAweDFDLCAweEEzLCAweEMyLCAweDVGLCAweDZBLCAweEY5LCAweEFFLAorCSAweEQwLCAweDY5LCAweDkxLCAweDE3LCAweDU4LCAweDk5LCAweDI3LCAweDNBLCAweEI5LCAweDI3LCAweDM4LCAweEQ5LCAweDEzLCAweEVCLCAweEIzLCAweDJCLAorCSAweDMzLCAweDIyLCAweEJCLCAweEQyLCAweDcwLCAweEE5LCAweDg5LCAweDA3LCAweEE3LCAweDMzLCAweEI2LCAweDJELCAweDIyLCAweDNDLCAweDkyLCAweDE1LAorCSAweDIwLCAweEM5LCAweDQ5LCAweDg3LCAweEZGLCAweEFBLCAweDc4LCAweDUwLCAweDdBLCAweEE1LCAweDhGLCAweDAzLCAweEY4LCAweDU5LCAweDgwLCAweDA5LAorCSAweDE3LCAweDFBLCAweERBLCAweDY1LCAweDMxLCAweEQ3LCAweEM2LCAweDg0LCAweEI4LCAweEQwLCAweEMzLCAweDgyLCAweEIwLCAweDI5LCAweDc3LCAweDVBLAorCSAweDExLCAweDFFLCAweENCLCAweDdCLCAweEZDLCAweEE4LCAweEQ2LCAweDZELCAweDNBLCAweDJDLCAweDAwLCAweDMwLCAweDAwLCAweDMxLCAweDAwLCAweDMzLAorCSAweDAwLCAweDM0LCAweDAwLCAweDM1LCAweDAwLCAweDM2LCAweDAwLCAweDM3LCAweDAwLCAweDM4LCAweDAwLCAweDM4LCAweDAwLCAweDNBLCAweDAwLCAweDNCLAorCSAweDAwLCAweDNDLCAweDAwLCAweDNELCAweDAwLCAweDNFLCAweDAwLCAweDNGLCAweDAwLCAweDNGLCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDBBLCAweDAyLCAweDE0LAorCSAweDA1LCAweDMyLCAweDBCLCAweDM3LCAweDA4LCAweDUwLCAweDBCLCAweDZFLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDNGLCAweDAwLAorCSAweDBDLCAweDAwLCAweDMwLCAweDAwLCAweDAzLCAweDAwLCAweDBGLCAweDAwLCAweDNFLCAweDAwLCAweDNDLCAweDAwLCAweDAyLCAweDAwLCAweDA0LCAweDAwLAorCSAweDBBLCAweDAwLCAweDBCLCAweDAwLCAweDEwLCAweDAwLCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDYzLCAweDAwLCAweDYzLCAweDAwLCAweDIwLCAweDAwLCAweDYzLCAweDAwLCAweDYzLCAweDAwLCAweDIwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDBBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEEwLCAweDEwLAorCSAweEVFLCAweDEwLCAweEE2LCAweDEwLCAweEU4LCAweDEwLCAweEFDLCAweDEwLCAweEUyLCAweDEwLCAweEIyLCAweDEwLCAweERDLCAweDEwLCAweEI4LCAweDEwLAorCSAweEQ2LCAweDEwLCAweEJFLCAweDEwLCAweEQwLCAweDEwLCAweEM0LCAweDEwLCAweENBLCAweDEwLCAweDA3LCAweDAxLCAweDAwLCAweDAwLCAweDBBLCAweDIyLAorCSAweDAwLCAweDA0LCAweDA4LCAweDAxLCAweDAwLCAweDAwLCAweDBBLCAweDI2LCAweDAwLCAweDA0LCAweDA5LCAweDAxLCAweDAwLCAweDAwLCAweDBBLCAweDJBLAorCSAweDAwLCAweDA0LCAweDBBLCAweDAxLCAweDAwLCAweDAwLCAweDBBLCAweDJFLCAweDAwLCAweDA0LCAweDBCLCAweDAxLCAweDAwLCAweDAwLCAweDEwLCAweDI0LAorCSAweDA0LCAweDA0LCAweDBDLCAweDAxLCAweDAwLCAweDAwLCAweDEwLCAweDI4LCAweDA0LCAweDA0LCAweDBELCAweDAxLCAweDAwLCAweDAwLCAweDEwLCAweDJDLAorCSAweDA0LCAweDA0LCAweDBFLCAweDAxLCAweDAwLCAweDAwLCAweDEwLCAweDMwLCAweDA0LCAweDA0LCAweDBGLCAweDAxLCAweDAwLCAweDAwLCAweDE2LCAweDM0LAorCSAweDA4LCAweDA0LCAweDEwLCAweDAxLCAweDAwLCAweDAwLCAweDE2LCAweDM4LCAweDA4LCAweDA0LCAweDExLCAweDAxLCAweDAwLCAweDAwLCAweDE2LCAweDNDLAorCSAweDA4LCAweDA0LCAweDEyLCAweDAxLCAweDAwLCAweDAwLCAweDE2LCAweDQwLCAweDA4LCAweDA0LCAweDEzLCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDY0LAorCSAweDBDLCAweDBCLCAweDE0LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDY4LCAweDBDLCAweDBCLCAweDE1LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDZDLAorCSAweDBDLCAweDBCLCAweDE2LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDcwLCAweDBDLCAweDBCLCAweDE3LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDc0LAorCSAweDBDLCAweDBCLCAweDE4LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDc4LCAweDBDLCAweDBCLCAweDE5LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDdDLAorCSAweDBDLCAweDBCLCAweDFBLCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDgwLCAweDBDLCAweDBCLCAweDFCLCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDg0LAorCSAweDBDLCAweDBCLCAweDFDLCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDg4LCAweDBDLCAweDBCLCAweDFELCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDhDLAorCSAweDBDLCAweDBCLCAweDFFLCAweDAxLCAweDAwLCAweDAwLCAweDFELCAweDk1LCAweDE3LCAweDA0LCAweDFGLCAweDAxLCAweDAwLCAweDAwLCAweDFELCAweDk5LAorCSAweDE3LCAweDA0LCAweDIwLCAweDAxLCAweDAwLCAweDAwLCAweDFELCAweDlELCAweDE3LCAweDA0LCAweDIxLCAweDAxLCAweDAwLCAweDAwLCAweDFELCAweEExLAorCSAweDE3LCAweDA0LCAweDIyLCAweDAxLCAweDAwLCAweDAwLCAweDBFLCAweEE1LCAweDAwLCAweDAwLCAweDEwLCAweDExLCAweDMwLCAweDExLCAweDUwLCAweDExLAorCSAweDcwLCAweDExLCAweEM4LCAweDExLCAweDE4LCAweDExLCAweDM4LCAweDExLCAweDU4LCAweDExLCAweDc4LCAweDExLCAweEQwLCAweDExLCAweDIwLCAweDExLAorCSAweDQwLCAweDExLCAweDYwLCAweDExLCAweDgwLCAweDExLCAweEQ4LCAweDExLCAweDI4LCAweDExLCAweDQ4LCAweDExLCAweDY4LCAweDExLCAweDg4LCAweDExLAorCSAweEUwLCAweDExLCAweDkwLCAweDExLCAweDk4LCAweDExLCAweEEwLCAweDExLCAweEE4LCAweDExLCAweEIwLCAweDExLCAweEI4LCAweDExLCAweEMwLCAweDExLAorCSAweEU4LCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJFLCAweDFFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDM2LCAweDI1LCAweDRGLCAweDI1LCAweDcyLCAweDI1LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEFDLCAweDI1LAorCSAweDAyLCAweDJCLCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEYzLCAweDJELCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LAorCSAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweDhCLCAweDI3LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LAorCSAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LAorCSAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEU1LCAweDI3LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LAorCSAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LAorCSAweEUxLCAweDI0LCAweDU5LCAweDI3LCAweDczLCAweDI3LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LCAweEUxLCAweDI0LAorCSAweEUxLCAweDI0LCAweDQ3LCAweDIzLCAweENFLCAweDI1LCAweEUxLCAweDI1LCAweDkxLCAweDI2LCAweDk1LCAweDI2LCAweEUxLCAweDI0LCAweEUxLCAweDI0LAorCSAweDQ0LCAweDI3LCAweDUxLCAweEVBLCAweEZGLCAweEU5LCAweDAwLCAweDAwLCAweDQ4LCAweEVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM5LCAweEVBLAorCSAweDY1LCAweDI1LCAweDg5LCAweDI1LCAweDAwLCAweDAwLCAweEY4LCAweDJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDJCLCAweEUwLCAweEZDLAorCSAweDRDLCAweDI4LCAweEM2LCAweDJBLCAweDVBLCAweDAwLCAweDAyLCAweDAwLCAweEY5LCAweEZGLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweDAwLCAweDAxLAorCSAweDAyLCAweDAwLCAweEY3LCAweEZGLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweDUwLCAweDI4LCAweDA2LCAweDAwLCAweEYwLCAweEZGLCAweDRDLCAweDI4LAorCSAweDI5LCAweDI4LCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweEY2LCAweEZGLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweDZDLCAweDAwLCAweDAyLCAweDAwLAorCSAweEY0LCAweEZGLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweEFBLCAweDAxLCAweDAyLCAweDAwLCAweEY1LCAweEZGLCAweDRDLCAweDI4LCAweENGLCAweDJBLAorCSAweDQyLCAweDI4LCAweDAyLCAweDAwLCAweEUwLCAweEZGLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweENFLCAweDJELCAweDAyLCAweDAwLCAweEUxLCAweEZGLAorCSAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweEQwLCAweDJELCAweDAyLCAweDAwLCAweEUyLCAweEZGLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweEQyLCAweDJELAorCSAweDAyLCAweDAwLCAweEUzLCAweEZGLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweENBLCAweDJELCAweDAyLCAweDAwLCAweDAzLCAweEZDLCAweDRDLCAweDI4LAorCSAweDE3LCAweDJBLCAweDE2LCAweDJELCAweDAyLCAweDAwLCAweDA0LCAweEZDLCAweDRDLCAweDI4LCAweDVDLCAweDI4LCAweDU4LCAweDI4LCAweDIyLCAweDAwLAorCSAweDA2LCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweDQwLCAweDI4LCAweDAyLCAweDAwLCAweDA3LCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LAorCSAweDlDLCAweDI4LCAweDAyLCAweDAwLCAweDBFLCAweEZDLCAweDRDLCAweDI4LCAweDI5LCAweDJBLCAweEE2LCAweDI4LCAweDIyLCAweDAwLCAweEIxLCAweEZDLAorCSAweDRDLCAweDI4LCAweDFELCAweDJCLCAweEEyLCAweDI5LCAweDAyLCAweDAwLCAweDIwLCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweENDLCAweDI4LAorCSAweDAyLCAweDAwLCAweDI1LCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweEQ2LCAweDI4LCAweDAyLCAweDAwLCAweDI2LCAweEZDLCAweDRDLCAweDI4LAorCSAweDYyLCAweDI4LCAweEQ4LCAweDI4LCAweDAyLCAweDAwLCAweDI3LCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweERBLCAweDI4LCAweDAyLCAweDAwLAorCSAweEIyLCAweEZDLCAweDRDLCAweDI4LCAweDVDLCAweDI4LCAweEM2LCAweDI5LCAweDIyLCAweDAwLCAweEMxLCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LAorCSAweDVBLCAweDJELCAweDIwLCAweDAwLCAweEIwLCAweEZDLCAweDFGLCAweDI4LCAweDIyLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM0LCAweEZDLAorCSAweDFGLCAweDI4LCAweEU3LCAweDJBLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweEM4LCAweEZDLCAweDFGLCAweDI4LCAweEUyLCAweDJBLCAweDAwLCAweDAwLAorCSAweDA4LCAweDAwLCAweEI0LCAweEZDLCAweDFGLCAweDI4LCAweDYwLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI2LCAweEZDLCAweDFGLCAweDI4LAorCSAweDExLCAweDJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI3LCAweEZDLCAweDFGLCAweDI4LCAweDNCLCAweDJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweEI4LCAweEZDLCAweDFGLCAweDI4LCAweDk4LCAweDJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI1LCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LAorCSAweEM2LCAweDJELCAweDAyLCAweDAwLCAweEI5LCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweEM4LCAweDJELCAweDAyLCAweDAwLCAweDkwLCAweEZELAorCSAweDRDLCAweDI4LCAweDI5LCAweDI4LCAweENDLCAweDJELCAweDAyLCAweDAwLCAweDIzLCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweEQyLCAweDI4LAorCSAweDAyLCAweDAwLCAweDI5LCAweEZDLCAweDQ0LCAweDI5LCAweEYxLCAweDI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMyLCAweEZDLCAweDRDLCAweDI4LAorCSAweDYyLCAweDI4LCAweDBFLCAweDJELCAweDAyLCAweDAwLCAweDMyLCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweEEwLCAweDAxLCAweDAyLCAweDAwLAorCSAweDMzLCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweEEyLCAweDAxLCAweDAyLCAweDAwLCAweDAwLCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LAorCSAweDU2LCAweDI4LCAweDAyLCAweDAwLCAweDAxLCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweDUwLCAweDI4LCAweDA2LCAweDAwLCAweDAyLCAweEZDLAorCSAweDRDLCAweDI4LCAweERDLCAweDI4LCAweEE0LCAweDI5LCAweDIyLCAweDAwLCAweDA1LCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweDQ2LCAweDI4LAorCSAweDAyLCAweDAwLCAweDA4LCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweDRBLCAweDI4LCAweDA2LCAweDAwLCAweDA5LCAweEZDLCAweDRDLCAweDI4LAorCSAweDYyLCAweDI4LCAweDlFLCAweDI4LCAweDAyLCAweDAwLCAweDBCLCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweEEwLCAweDI4LCAweDAyLCAweDAwLAorCSAweDBDLCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweEEyLCAweDI4LCAweDAyLCAweDAwLCAweDBELCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LAorCSAweEE0LCAweDI4LCAweDAyLCAweDAwLCAweDIxLCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweENFLCAweDI4LCAweDAyLCAweDAwLCAweDgwLCAweEZDLAorCSAweEI4LCAweDI4LCAweEM4LCAweDI4LCAweEUyLCAweDI4LCAweEMwLCAweDAwLCAweDgxLCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweEE4LCAweDAxLAorCSAweDAyLCAweDAwLCAweDgzLCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweEFDLCAweDAxLCAweDAyLCAweDAwLCAweDg1LCAweEZDLCAweDRDLCAweDI4LAorCSAweDQ5LCAweDJBLCAweEE2LCAweDAxLCAweDAyLCAweDAwLCAweDg2LCAweEZDLCAweDRDLCAweDI4LCAweDVCLCAweDJBLCAweEIyLCAweDAxLCAweDAyLCAweDAwLAorCSAweDI4LCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweERDLCAweDI4LCAweDAyLCAweDAwLCAweDg3LCAweEZDLCAweDRDLCAweDI4LCAweDYyLCAweDI4LAorCSAweEVDLCAweDI5LCAweDIyLCAweDAzLCAweDg0LCAweEZDLCAweDRDLCAweDI4LCAweDcwLCAweDJBLCAweEIwLCAweDAxLCAweDAyLCAweDAwLCAweDJCLCAweEZDLAorCSAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweDE0LCAweDMxLCAweDAyLCAweDAwLCAweEY4LCAweEZGLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweDBFLCAweDMxLAorCSAweDAyLCAweDAwLCAweEYzLCAweEZGLCAweDRDLCAweDI4LCAweDYyLCAweDI4LCAweDE2LCAweDMxLCAweDAyLCAweDAwLCAweDIwLCAweEZELCAweDdELCAweDI4LAorCSAweDI5LCAweDI4LCAweDIzLCAweDM0LCAweDA4LCAweDAwLCAweDIxLCAweEZELCAweDdELCAweDI4LCAweDI5LCAweDI4LCAweDI3LCAweDM0LCAweDBBLCAweDAwLAorCSAweDIyLCAweEZELCAweDdELCAweDI4LCAweDI5LCAweDI4LCAweDJDLCAweDM0LCAweDE2LCAweDAwLCAweDIzLCAweEZELCAweDdELCAweDI4LCAweDI5LCAweDI4LAorCSAweDM3LCAweDM0LCAweDBBLCAweDAwLCAweDEwLCAweEZELCAweDRDLCAweDI4LCAweDI5LCAweDI4LCAweDc0LCAweDAxLCAweDAyLCAweDAwLCAweDQ1LCAweEZELAorCSAweDRDLCAweDI4LCAweDI5LCAweDI4LCAweDAwLCAweDAxLCAweDAyLCAweDAwLCAweDQ3LCAweEZELCAweDRDLCAweDI4LCAweDI5LCAweDI4LCAweDc4LCAweDAxLAorCSAweDAyLCAweDAwLCAweDQ4LCAweEZELCAweDlBLCAweDI5LCAweDI5LCAweDI4LCAweEEwLCAweDAxLCAweDAyLCAweDAwLCAweDQ5LCAweEZELCAweDlBLCAweDI5LAorCSAweDI5LCAweDI4LCAweEEyLCAweDAxLCAweDAyLCAweDAwLCAweDRBLCAweEZELCAweDRDLCAweDI4LCAweDI5LCAweDI4LCAweDk4LCAweDAxLCAweDAyLCAweDAwLAorCSAweDRCLCAweEZELCAweDRDLCAweDI4LCAweDI5LCAweDI4LCAweDlBLCAweDAxLCAweDAyLCAweDAwLCAweDRELCAweEZELCAweDdELCAweDI4LCAweDI5LCAweDI4LAorCSAweDNDLCAweDM0LCAweDA0LCAweDAwLCAweDRGLCAweEZELCAweEFFLCAweDI5LCAweDI5LCAweDI4LCAweDFBLCAweDJELCAweDAyLCAweDAwLCAweEMwLCAweEZELAorCSAweDdELCAweDI4LCAweDI5LCAweDI4LCAweDNFLCAweDM0LCAweDAyLCAweDAwLCAweEMyLCAweEZELCAweEE0LCAweDI5LCAweDI5LCAweDI4LCAweDAwLCAweDAwLAorCSAweDAyLCAweDAwLCAweEMzLCAweEZELCAweDdELCAweDI4LCAweDI5LCAweDI4LCAweDNGLCAweDM0LCAweDAyLCAweDAwLCAweDQwLCAweEZELCAweDc1LCAweDI4LAorCSAweDI5LCAweDI4LCAweEI4LCAweDAxLCAweDAyLCAweDAwLCAweDI0LCAweEZELCAweENCLCAweDI5LCAweDI5LCAweDI4LCAweDAwLCAweDAwLCAweDAyLCAweDAwLAorCSAweDkxLCAweEZELCAweDRDLCAweDI4LCAweDI5LCAweDI4LCAweDIwLCAweDI0LCAweDAyLCAweDAwLCAweDkzLCAweEZELCAweDRDLCAweDI4LCAweDI5LCAweDI4LAorCSAweDI2LCAweDI0LCAweDAyLCAweDAwLCAweEMxLCAweEZELCAweDRDLCAweDI4LCAweDI5LCAweDI4LCAweEZFLCAweDAwLCAweDAyLCAweDAwLCAweEM2LCAweEZELAorCSAweEFBLCAweDI4LCAweDI5LCAweDI4LCAweDI4LCAweDJELCAweDBBLCAweDAwLCAweDg5LCAweEZELCAweDVCLCAweDI5LCAweDI5LCAweDI4LCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDhBLCAweEZELCAweDlBLCAweDI4LCAweDI5LCAweDI4LCAweEEwLCAweDJELCAweDI0LCAweDAwLCAweDQxLCAweEZELCAweDRDLCAweDI4LAorCSAweDI5LCAweDI4LCAweDdBLCAweDJELCAweDIyLCAweDAwLCAweDQyLCAweEZELCAweDRDLCAweDI4LCAweDI5LCAweDI4LCAweDAyLCAweDAxLCAweDA2LCAweDAwLAorCSAweDQzLCAweEZELCAweEQ4LCAweDI5LCAweDI5LCAweDI4LCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDQ0LCAweEZELCAweEI4LCAweDI5LCAweDI5LCAweDI4LAorCSAweEI0LCAweDAxLCAweDAyLCAweDAwLCAweDQ2LCAweEZELCAweDRDLCAweDI4LCAweDI5LCAweDI4LCAweEJBLCAweDAxLCAweDBDLCAweDAwLCAweDRDLCAweEZELAorCSAweDRDLCAweDI4LCAweDI5LCAweDI4LCAweEVBLCAweDI5LCAweDAyLCAweDAwLCAweDUwLCAweEZELCAweDRDLCAweDI4LCAweDI5LCAweDI4LCAweEY0LCAweDAwLAorCSAweDAyLCAweDAwLCAweDUxLCAweEZELCAweDRDLCAweDI4LCAweDI5LCAweDI4LCAweEY2LCAweDAwLCAweDAyLCAweDAwLCAweDUyLCAweEZELCAweDRDLCAweDI4LAorCSAweDI5LCAweDI4LCAweEM2LCAweDAxLCAweDAyLCAweDAwLCAweDhGLCAweEZELCAweEVCLCAweDI5LCAweDI5LCAweDI4LCAweDAwLCAweDAwLCAweDA4LCAweDAwLAorCSAweDkyLCAweEZELCAweDRDLCAweDI4LCAweDI5LCAweDI4LCAweDU0LCAweDJELCAweDAyLCAweDAwLCAweDhDLCAweEZELCAweDNGLCAweDI4LCAweDI5LCAweDI4LAorCSAweDA4LCAweDJFLCAweDU2LCAweDAwLCAweDhELCAweEZELCAweDNGLCAweDI4LCAweDI5LCAweDI4LCAweDYyLCAweDJFLCAweDE0LCAweDAwLCAweDAwLCAweEYxLAorCSAweDQ2LCAweDAwLCAweEUzLCAweDI3LCAweDNBLCAweDAxLCAweDAxLCAweEYxLCAweDQ0LCAweDA3LCAweEUxLCAweDI3LCAweDNDLCAweDAxLCAweDAwLCAweDAzLAorCSAweDJBLCAweDY4LCAweDFFLCAweDAwLCAweDc2LCAweDAxLCAweEZFLCAweDAwLCAweEQ2LCAweDAxLCAweDAyLCAweDAxLCAweDNFLCAweDAxLCAweEI4LCAweDAxLAorCSAweDc0LCAweDI3LCAweDVBLCAweDAxLCAweDIwLCAweDI0LCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweEJBLCAweDFDLCAweDAwLCAweDAwLCAweEJFLCAweDFFLAorCSAweDU0LCAweDAxLCAweDBCLCAweDAwLCAweEJBLCAweDAwLCAweEU0LCAweDAwLCAweDNDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM0LCAweEFGLCAweDM3LCAweEFGLCAweDQzLCAweEIwLAorCSAweDRDLCAweEIwLCAweDQ4LCAweEFGLCAweERFLCAweEFGLCAweEI2LCAweEFGLCAweDFDLCAweDMzLCAweDdGLCAweDMyLCAweDFDLCAweDMzLCAweEYzLCAweDMyLAorCSAweDg5LCAweDMyLCAweDdELCAweDMyLCAweDNCLCAweDMzLCAweDRDLCAweDMzLCAweDRDLCAweDMzLCAweDRDLCAweDMzLCAweDU1LCAweDMzLCAweDcwLCAweDMzLAorCSAweENELCAweDMzLCAweEU5LCAweDMzLCAweEY0LCAweDMyLCAweDA3LCAweDMzLCAweERCLCAweDMyLCAweDEwLCAweDAwLCAweDEyLCAweDAwLCAweDEzLCAweDAwLAorCSAweDIwLCAweDAwLCAweDIxLCAweDAwLCAweDIyLCAweDAwLCAweDMwLCAweDAwLCAweDMxLCAweDAwLCAweDMyLCAweDAwLCAweDMzLCAweDAwLCAweDM0LCAweDAwLAorCSAweDM1LCAweDAwLCAweDM2LCAweDAwLCAweDM3LCAweDAwLCAweDM4LCAweDAwLCAweDM5LCAweDAwLCAweDNBLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAxLAorCSAweDE0LCAweDAxLCAweDE0LCAweDAxLCAweDE0LCAweDAxLCAweDE0LCAweDAxLCAweDE0LCAweDAxLCAweDE0LCAweDAxLCAweDE0LCAweDAxLCAweEYzLCAweDAyLAorCSAweEFELCAweDAzLCAweDYwLCAweDA0LCAweDA0LCAweDA1LCAweDA3LCAweDA2LCAweDA4LCAweDA3LCAweDBBLCAweDA4LCAweDE2LCAweDA5LCAweDQ0LCAweDBBLAorCSAweDA0LCAweDBCLCAweDQwLCAweDBDLCAweDgwLCAweDBELCAweDAwLCAweDBFLCAweDg0LCAweDBGLCAweDAxLCAweDEwLCAweDEwLCAweDExLCAweDAyLCAweDE0LAorCSAweDQwLCAweDIwLCAweDMyLCAweDIxLCAweDMyLCAweDIyLCAweDA0LCAweDIzLCAweDAxLCAweDI0LCAweDBGLCAweDI1LCAweDAwLCAweDI2LCAweDAwLCAweDI3LAorCSAweDAwLCAweDI4LCAweDAwLCAweDI5LCAweDAwLCAweDJBLCAweDAxLCAweDJCLCAweDA2LCAweDJDLCAweDAwLCAweDM4LCAweDAwLCAweDM5LCAweEQ2LCAweDNBLAorCSAweDAwLCAweDNCLCAweDAwLCAweDNDLCAweDE0LCAweDNELCAweDdGLCAweDNFLCAweDAwLCAweDNGLCAweDY4LCAweDQwLCAweDc1LCAweDQxLCAweDA3LCAweDQyLAorCSAweDA3LCAweDQzLCAweDAwLCAweDQ1LCAweDNCLCAweDRBLCAweDAwLCAweDRCLCAweDAwLCAweDRDLCAweDBGLCAweDRELCAweDAyLCAweDc1LCAweDAwLCAweDc2LAorCSAweDgwLCAweDAwLCAweDA4LCAweDAxLCAweDA5LCAweDAxLCAweDA5LCAweDAxLCAweDBBLCAweDAxLCAweDBBLCAweDAxLCAweDBCLCAweDAxLCAweDBCLCAweDAxLAorCSAweDBDLCAweDAxLCAweDBDLCAweDAxLCAweDBELCAweDAxLCAweDBELCAweDAxLCAweDBFLCAweDAxLCAweDBFLCAweDAxLCAweDBGLCAweDAxLCAweDBGLCAweDAxLAorCSAweDEwLCAweDAxLCAweDEwLCAweDAxLCAweDExLCAweDAxLCAweDExLCAweDAxLCAweDEyLCAweDAxLCAweDEyLCAweDAxLCAweDEzLCAweDAxLCAweDEzLCAweDAxLAorCSAweDE0LCAweDAxLCAweDE0LCAweDAxLCAweDE1LCAweDAxLCAweDE1LCAweDAxLCAweDE2LCAweDAxLCAweDE2LCAweDAxLCAweDE3LCAweDAxLCAweDE3LCAweDAxLAorCSAweDE4LCAweDAxLCAweDE4LCAweDAxLCAweDE5LCAweDAxLCAweDE5LCAweDAxLCAweDRELCAweDAxLCAweDRELCAweDAxLCAweDRFLCAweDAxLCAweDRFLCAweDAxLAorCSAweDRGLCAweDAxLCAweDRGLCAweDAxLCAweDUwLCAweDAxLCAweDUwLCAweDAxLCAweDUxLCAweDAxLCAweDUxLCAweDAxLCAweDUyLCAweDAxLCAweDUyLCAweDAxLAorCSAweDUzLCAweDAxLCAweDUzLCAweDAxLCAweDU0LCAweDAxLCAweDU0LCAweDAxLCAweDY1LCAweDAxLCAweDY1LCAweDAxLCAweDY2LCAweDAxLCAweDY2LCAweDAxLAorCSAweDY3LCAweDAxLCAweDY3LCAweDAxLCAweDY4LCAweDAxLCAweDY4LCAweDAxLCAweDY5LCAweDAxLCAweDY5LCAweDAxLCAweDZBLCAweDAxLCAweDZBLCAweDAxLAorCSAweDZCLCAweDAxLCAweDZCLCAweDAxLCAweDZDLCAweDAxLCAweDZDLCAweDAxLCAweDZELCAweDAxLCAweDZELCAweDAxLCAweDZFLCAweDAxLCAweDZFLCAweDAxLAorCSAweDZGLCAweDAxLCAweDZGLCAweDAxLCAweDcwLCAweDAxLCAweDcwLCAweDAxLCAweDcxLCAweDAxLCAweDcxLCAweDAxLCAweDcyLCAweDAxLCAweDcyLCAweDAxLAorCSAweDczLCAweDAxLCAweDczLCAweDAxLCAweDc0LCAweDAxLCAweDc0LCAweDAxLCAweDc1LCAweDAxLCAweDc1LCAweDAxLCAweDc2LCAweDAxLCAweDc2LCAweDAxLAorCSAweDc3LCAweDAxLCAweDc3LCAweDAxLCAweDc4LCAweDAxLCAweDc4LCAweDAxLCAweDc5LCAweDAxLCAweDc5LCAweDAxLCAweDdBLCAweDAxLCAweDdBLCAweDAxLAorCSAweDdCLCAweDAxLCAweDdCLCAweDAxLCAweDdDLCAweDAxLCAweDdDLCAweDAxLCAweDdELCAweDAxLCAweDdELCAweDAxLCAweDdFLCAweDAxLCAweDdFLCAweDAxLAorCSAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLAorCSAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLAorCSAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLCAweDdGLCAweDAxLAorCSAweDdGLCAweDAxLCAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEyLAorCSAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEyLCAweDgwLCAweDEzLAorCSAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDgwLCAweDEzLAorCSAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDgwLCAweDEzLCAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDUxLCAweDQ0LAorCSAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDUxLCAweDQ0LAorCSAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDUxLCAweDQ0LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LAorCSAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIzLCAweDQ2LCAweDIzLCAweDQ2LAorCSAweDIzLCAweDQ2LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LAorCSAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFELCAweDQ3LCAweDlBLCAweDQ4LAorCSAweERBLCAweDQ4LCAweDFBLCAweDQ4LCAweDVBLCAweDQ4LCAweDlBLCAweDQ4LCAweERBLCAweDQ4LCAweDFBLCAweDQ4LCAweDVBLCAweDQ4LCAweDlBLCAweDQ4LAorCSAweERBLCAweDQ4LCAweDFBLCAweDQ4LCAweDVBLCAweDQ4LCAweDlBLCAweDQ4LCAweDMzLCAweDQ4LCAweDc4LCAweDQ5LCAweDc4LCAweDQ5LCAweDc5LCAweDQ5LAorCSAweDc5LCAweDQ5LCAweDc5LCAweDQ5LCAweDc5LCAweDQ5LCAweDdBLCAweDQ5LCAweDdBLCAweDQ5LCAweDdBLCAweDQ5LCAweDdBLCAweDQ5LCAweDdCLCAweDQ5LAorCSAweDdCLCAweDQ5LCAweDdCLCAweDQ5LCAweDdDLCAweDQ5LCAweDMyLCAweDAwLCAweDQ2LCAweDAwLCAweDVBLCAweDAwLCAweDZFLCAweDAwLCAweDgyLCAweDAwLAorCSAweDk2LCAweDAwLCAweEFBLCAweDAwLCAweEJFLCAweDAwLCAweEQyLCAweDAwLCAweEU2LCAweDAwLCAweEZBLCAweDAwLCAweDBFLCAweDAxLCAweDIyLCAweDAxLAorCSAweDUyLCAweDAxLCAweDA1LCAweDAwLCAweDA0LCAweDAwLCAweDA0LCAweDAwLCAweDA0LCAweDAwLCAweDA0LCAweDAwLCAweDAzLCAweDAwLCAweDAzLCAweDAwLAorCSAweDAzLCAweDAwLCAweDAzLCAweDAwLCAweDAzLCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAzLCAweDAwLCAweDE1LCAweDAwLCAweDZFLCAweDZGLCAweDZFLCAweDJELCAweDczLCAweDcwLCAweDY1LCAweDYzLCAweDY5LCAweDY2LCAweDY5LCAweDY1LAorCSAweDY0LCAweDIwLCAweDUzLCAweDUzLCAweDQ5LCAweDQ0LCAweDIwLCAweDIxLCAweDIxLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAxLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAwLCAweDA5LCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDY0LCAweDAwLCAweDY0LCAweDAwLAorCSAweDAwLCAweDAwLCAweDQ4LCAweDQ1LCAweDUyLCAweDRELCAweDQ1LCAweDUzLCAweDIwLCAweDMyLCAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorCSAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAzLCAweDAwLCAweDE1LCAweDAwLCAweDZFLCAweDZGLCAweDZFLCAweDJELCAweDczLCAweDcwLCAweDY1LCAweDYzLCAweDY5LCAweDY2LCAweDY5LCAweDY1LAorCSAweDY0LCAweDIwLCAweDUzLCAweDUzLCAweDQ5LCAweDQ0LCAweDIwLCAweDIxLCAweDIxLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAxLCAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAwLCAweDA5LCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDY0LCAweDAwLCAweDY0LCAweDAwLAorCSAweDAwLCAweDAwLCAweDQ4LCAweDQ1LCAweDUyLCAweDRELCAweDQ1LCAweDUzLCAweDIwLCAweDMyLCAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDQ2LCAweDY5LCAweDcyLCAweDczLCAweDc0LCAweDIwLCAweDU3LCAweDYxLCAweDc2LCAweDY1LCAweDRDLCAweDQxLCAweDRFLCAweDIwLCAweDQ5LCAweDQ5LAorCSAweDIwLCAweDUzLCAweDUzLCAweDQ5LCAweDQ0LCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDE5LCAweDAwLCAweDAyLCAweDAxLCAweDgyLCAweDg0LCAweDhCLCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDFFLCAweDg1LCAweDAwLCAweDAxLAorCSAweDdGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDIwLCAweDAwLCAweDEwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLAorCSAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIwLCAweDQzLCAweDc1LCAweDcyLCAweDcyLCAweDY1LCAweDZFLCAweDc0LCAweDIwLCAweDUzLAorCSAweDY1LCAweDcyLCAweDc2LCAweDY5LCAweDYzLCAweDY1LCAweDIwLCAweDUzLCAweDY1LCAweDc0LCAweDIwLCAweDQ5LCAweDY0LCAweDY1LCAweDZFLCAweDc0LAorCSAweDY5LCAweDY2LCAweDY5LCAweDY1LCAweDcyLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweERELCAweDAwLCAweDUwLCAweEYyLCAweDAxLAorCSAweDAxLCAweDAwLCAweDAwLCAweDUwLCAweEYyLCAweDA1LCAweDAyLCAweDAwLCAweDAwLCAweDUwLCAweEYyLCAweDAyLCAweDAwLCAweDUwLCAweEYyLCAweDA0LAorCSAweDAyLCAweDAwLCAweDAwLCAweDUwLCAweEYyLCAweDAwLCAweDAwLCAweDUwLCAweEYyLCAweDAxLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDE1LCAweDAwLCAweDE0LCAweDAwLCAweDE1LCAweDAwLCAweDM2LCAweDAwLCAweDEwLCAweDAwLCAweDEwLCAweDAwLCAweDEwLCAweDAwLCAweDE0LCAweDAwLAorCSAweDExLCAweDAwLCAweDM2LCAweDAwLCAweDAxLCAweDAwLCAweDA0LCAweDAwLCAweDdBLCAweDJELCAweDI4LCAweDJELCAweDBDLCAweDJGLCAweDEwLCAweDJGLAorCSAweDE0LCAweDJGLCAweEEwLCAweDJELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM2LCAweDI5LCAweDI4LCAweDJELAorCSAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDdBLCAweDJELCAweDI4LCAweDJELCAweDBDLCAweDJGLCAweDEwLCAweDJGLCAweDE0LCAweDJGLCAweEEwLCAweDJELAorCSAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDdBLCAweDJELCAweDI4LCAweDJELCAweEZGLCAweEZGLCAweEU2LCAweDJELAorCSAweDM0LCAweDJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAzLCAweDAzLCAweDAwLCAweDAyLCAweDA2LCAweDAwLCAweDAwLCAweDA2LCAweDA3LAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAorCSAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCit9OyAgLyogZndfaW1hZ2VfMl9kYXRhICovCisKK3N0YXRpYyBjb25zdCBoY2ZfOCBmd19pbWFnZV8zX2RhdGFbXSA9IHsKKwkgMHgwMCwgMHhFMSwgMHgzMCwgMHg0MCwgMHgwMiwgMHgzNiwgMHhBMSwgMHhGRiwgMHg4MywgMHhGRiwgMHg4RCwgMHhGRiwgMHg1QywgMHg0NCwgMHg1QywgMHg0MywKKwkgMHg1QywgMHg0MiwgMHg1QywgMHg0MSwgMHg1QywgMHg0MCwgMHhBQywgMHhGRiwgMHhBRCwgMHhGRiwgMHhFNywgMHhFMSwgMHhBRCwgMHg2MCwgMHgwOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwMywgMHgwMiwgMHgyOCwgMHhFMiwgMHg0MCwgMHhGRiwgMHhBMSwgMHhGRiwKKwkgMHg4NCwgMHhGRiwgMHhCQiwgMHg2MCwgMHgxOCwgMHg2NCwgMHg0MCwgMHg0MiwgMHhCMCwgMHg2MCwgMHg5NywgMHg2NCwgMHg0MCwgMHg0MCwgMHhCRCwgMHhGMywKKwkgMHg4MCwgMHhGQiwgMHgwRiwgMHg2MCwgMHg5QSwgMHg2MywgMHhDQSwgMHhGMywgMHhCRCwgMHhEQiwgMHgwMCwgMHg2MCwgMHg5QSwgMHg2NCwgMHhCRCwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNCwgMHg2NCwgMHhBMywgMHhEQiwgMHg1QywgMHg0OSwgMHgwQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHg1QywgMHg1QywKKwkgMHgwMSwgMHg2MCwgMHgzOSwgMHhFMiwgMHgwNCwgMHg2MCwgMHgwMCwgMHg3QSwgMHg4OSwgMHhGRiwgMHgwMywgMHg2MCwgMHhGRiwgMHg3MywgMHg4OCwgMHhGRiwKKwkgMHhCMCwgMHg2MCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwNiwgMHgwMiwgMHg0MCwgMHhGRiwKKwkgMHg0MiwgMHhGRiwgMHg0MywgMHhGRiwgMHg0NCwgMHhGRiwgMHg0NSwgMHhGRiwgMHhBMSwgMHhGRiwgMHg4OCwgMHhGRiwgMHg4NSwgMHhGRiwgMHgyMSwgMHhFMSwKKwkgMHg1QywgMHg0MCwgMHhCQiwgMHg2MCwgMHgyMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwKKwkgMHgwMSwgMHgwMiwgMHhBMSwgMHhGRiwgMHg4NiwgMHhGRiwgMHg4OCwgMHhGRiwgMHg1QywgMHg0NiwgMHg1QywgMHg0OSwgMHg1QywgMHg0MCwgMHhFNywgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHgzMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDNywgMHg2MCwgMHg1OCwgMHg0RiwgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDQSwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHg4MywgMHg3OCwgMHhGRiwgMHhGRiwgMHhERCwgMHg2MCwgMHg1OCwgMHg0RiwgMHgzRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHgzNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhFQywgMHg2MCwgMHg1OCwgMHg0RiwgMHg3NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMCwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHgxQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFNCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhEQywgMHg3OCwgMHhGRiwgMHhGRiwgMHhGMywgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHhFQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMywgMHhFMSwgMHhBMywgMHhGRiwgMHhCRiwgMHg2MCwgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMywgMHhFMSwgMHhBMywgMHhGRiwgMHhGRSwgMHhGQywgMHhGRiwgMHhGQywgMHgyMywgMHg2MCwgMHhGNCwgMHg2MywgMHgxNywgMHhGRCwgMHhBRSwgMHhGRiwKKwkgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNiwgMHgxQSwgMHgwMCwKKwkgMHg4MCwgMHgzQSwgMHgxNSwgMHgwMCwgMHg4MSwgMHhGMSwgMHgzMiwgMHhGMiwgMHgzMywgMHhGMiwgMHhEMCwgMHg4MCwgMHg4MiwgMHhGMSwgMHgwRiwgMHgwMiwKKwkgMHhEMCwgMHg4MCwgMHgzNCwgMHhGMiwgMHg4MywgMHhGMSwgMHgwQiwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMiwgMHhERiwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHgyOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhCRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwKKwkgMHhFOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhGNCwgMHhBQSwgMHg2MCwgMHhBQSwgMHg2NSwgMHgwOSwgMHhGMiwgMHg1QSwgMHhEMCwgMHhENCwgMHg4MCwKKwkgMHgwMywgMHg2NCwgMHgxMiwgMHgwMiwgMHhEMCwgMHg4MCwgMHgxRCwgMHg2MCwgMHg2MCwgMHg2NSwgMHgwRSwgMHgwMiwgMHg1QSwgMHhEMiwgMHhGRiwgMHhGRiwKKwkgMHhENCwgMHg4MCwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NSwgMHgwOCwgMHgwMiwgMHg1QSwgMHhEMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwMywgMHgwMiwgMHgxOSwgMHg2MCwgMHhFOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MCwgMHhENiwgMHg2NSwgMHhBNSwgMHhEMSwgMHg1QSwgMHhEMSwKKwkgMHg0NCwgMHg0OCwgMHg1QSwgMHhEMSwgMHg0NCwgMHg0QSwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHg0NCwgMHg0QywgMHhEOCwgMHg4MywKKwkgMHg3MCwgMHg2MSwgMHg2OCwgMHg2NSwgMHhENywgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwRSwgMHgwOCwgMHhGMiwgMHgwOCwgMHgwMCwgMHg2OCwgMHg2NSwKKwkgMHhENywgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwRSwgMHgwMywgMHgwMCwgMHgxOSwgMHg2MCwgMHhGRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1OCwgMHg0RiwKKwkgMHg3OSwgMHgwMCwgMHg5QywgMHg4MCwgMHgwMSwgMHg2NSwgMHgwMiwgMHgwMiwgMHgwMCwgMHg2NSwgMHgwMiwgMHgwMCwgMHhGRiwgMHgzQiwgMHhGNywgMHgwMSwKKwkgMHg1OCwgMHg0RiwgMHg3MCwgMHgwMCwgMHg5QywgMHg4MCwgMHg0NSwgMHg0MiwgMHhFQSwgMHgwMiwgMHg1OCwgMHg0RiwgMHg2QiwgMHgwMCwgMHg5QywgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHhFNSwgMHgwMiwgMHg1OCwgMHg0RiwgMHg2NiwgMHgwMCwgMHg5QywgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHgwMCwgMHg2NSwKKwkgMHg0NSwgMHg0MiwgMHhGOCwgMHgwMSwgMHhGRiwgMHgzQSwgMHgyOSwgMHgwMCwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHgyOCwgMHg0NCwgMHhGRiwgMHhCNCwKKwkgMHg5NCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhENCwgMHgwMiwgMHg2MCwgMHg0NSwgMHgyOCwgMHg0NywgMHgyQSwgMHg1RiwgMHg0MCwgMHg0OCwgMHgyQSwgMHg0NywKKwkgMHgyQywgMHg1RiwgMHg0MCwgMHg0QSwgMHgyQywgMHg0NywgMHg2NSwgMHg1RiwgMHg0MCwgMHg0QywgMHgxMCwgMHg2NCwgMHg0MCwgMHg0MiwgMHgyOCwgMHg0NSwKKwkgMHgwNSwgMHgwMCwgMHg1OCwgMHg0RiwgMHg0NywgMHgwMCwgMHg5NCwgMHg4MCwgMHgyOCwgMHg0NSwgMHgyNiwgMHgwMiwgMHg1OCwgMHg0RiwgMHg0MiwgMHgwMCwKKwkgMHg5NCwgMHg4MCwgMHgyQSwgMHg0NSwgMHgyMSwgMHgwMiwgMHg1OCwgMHg0RiwgMHgzRCwgMHgwMCwgMHg5NCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxQywgMHgwMiwKKwkgMHgyMiwgMHg0NCwgMHg0QywgMHg4MiwgMHgyQywgMHg0NSwgMHgzMSwgMHgwMywgMHhFQywgMHgwMSwgMHgxMCwgMHg2NSwgMHg0NSwgMHg0MiwgMHgyOCwgMHg0NSwKKwkgMHg5NCwgMHg4MCwgMHgyQSwgMHg0NSwgMHgyMSwgMHgwMiwgMHg1OCwgMHg0RiwgMHgyRCwgMHgwMCwgMHg5NCwgMHg4MCwgMHgyQywgMHg0NSwgMHgxQywgMHgwMiwKKwkgMHg1OCwgMHg0RiwgMHgyOCwgMHgwMCwgMHg5NCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxNywgMHgwMiwgMHgyMiwgMHg0NCwgMHg0QywgMHg4MiwgMHgyOCwgMHg0NSwKKwkgMHgxQywgMHgwMywgMHg1OCwgMHg0RiwgMHgxRiwgMHgwMCwgMHhFQywgMHgwMSwgMHg0MCwgMHg0QiwgMHgyOCwgMHg0NywgMHg0MCwgMHg0OCwgMHgyQSwgMHg0NywKKwkgMHg0MCwgMHg0QSwgMHgyQywgMHg0NywgMHg2MCwgMHg0NSwgMHgyQSwgMHg1RSwgMHg0MCwgMHg0QywgMHgyQSwgMHg0NCwgMHgyOCwgMHg1RSwgMHg0MCwgMHg0QSwKKwkgMHgyOCwgMHg0NCwgMHg2NSwgMHg1RSwgMHg0MCwgMHg0OCwgMHgyQiwgMHg0NCwgMHg2OCwgMHg2NSwgMHhENywgMHg4MCwgMHhGRiwgMHhGRiwgMHgxNywgMHgwRSwKKwkgMHg5MCwgMHgwMSwgMHgyNiwgMHg0NiwgMHhDNSwgMHg2MCwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCOSwgMHhGRiwgMHgyNiwgMHg0NiwgMHhDNSwgMHg2MCwKKwkgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDOSwgMHg4MSwgMHhDQiwgMHg4MywgMHgwNywgMHgxQywgMHgwMSwgMHgxRCwgMHgwOCwgMHgwMCwgMHgwMCwgMHhGNCwKKwkgMHgwMSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCNCwgMHhEOCwgMHg4MSwgMHg1QSwgMHhEMiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwKKwkgMHhDNSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg3OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHgwMCwgMHhGNCwgMHg4NCwgMHg2NSwKKwkgMHg3OCwgMHg2MSwgMHhBNSwgMHhEMCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg2NCwgMHg0NCwKKwkgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHgwNSwgMHgwMywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwKKwkgMHhGMCwgMHgwMiwgMHgxQywgMHg2MCwgMHhBQywgMHg2MywgMHgyOSwgMHg2MCwgMHhFQywgMHg2NCwgMHgwOCwgMHg2NSwgMHhDNCwgMHg4MSwgMHg2MSwgMHg0NCwKKwkgMHhBMywgMHhEQiwgMHgxQywgMHg2MCwgMHhBQSwgMHg2MSwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgyOSwgMHg2MCwgMHhFQywgMHg2MSwgMHhBMSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MywgMHgxQywgMHg2MCwgMHhCMCwgMHg2MSwgMHhBMSwgMHhERCwgMHgxQywgMHg2MCwgMHhCMCwgMHg2MSwgMHhBMSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHgxQywgMHg2MCwgMHhBQSwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgwMywgMHgwMywgMHgwMCwgMHgxQSwgMHg2MCwgMHhENiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHhBOCwgMHg2MSwgMHgwMSwgMHg2NCwKKwkgMHhBMSwgMHhEQiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHg0MSwgMHg0QywgMHgwMywgMHg2MCwgMHgwMCwgMHg2MSwgMHg0MSwgMHg0QSwgMHgxQywgMHg2MCwKKwkgMHhBQywgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg0OCwgMHgxQywgMHg2MCwgMHhCMiwgMHg2MywgMHgyOCwgMHg0MSwgMHgwNiwgMHg2NSwKKwkgMHhENSwgMHg4MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMSwgMHhBNCwgMHg2MCwgMHg0MSwgMHhBMywgMHhEQiwKKwkgMHgyQSwgMHg0MywgMHgyOCwgMHg0NSwgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwKKwkgMHgwNSwgMHgwMywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGNCwgMHgwMiwgMHgyOCwgMHg0MSwgMHgxQywgMHg2MCwKKwkgMHhCMiwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHg0NSwgMHg4QiwgMHgxQywgMHg2MCwgMHhBRSwgMHg2MSwgMHgyQiwgMHhEMywKKwkgMHhBMSwgMHhEQiwgMHgyQywgMHg0MSwgMHgyOCwgMHg0MiwgMHg0QSwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHg0NSwgMHg4QywgMHgwMCwgMHg3RiwKKwkgMHgwMSwgMHg3RSwgMHg0MCwgMHg0OCwgMHgxQywgMHg2MCwgMHhCMiwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHgwMCwgMHg2NCwKKwkgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHg0MywgMHgwMywgMHg2NSwgMHg0NCwgMHhGRiwgMHhBNCwgMHhBMSwgMHhEQiwgMHgxQywgMHg2MCwgMHhBRSwgMHg2MSwKKwkgMHhBMSwgMHhEMywgMHgyOCwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHgyQywgMHhEMywgMHgyQSwgMHhEMywgMHg2MCwgMHg0NSwKKwkgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHgxNCwgMHgwMCwgMHgyOCwgMHg0NCwgMHhFMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgyNCwKKwkgMHgwMSwgMHgwMCwgMHgwOCwgMHgwMCwgMHgyQiwgMHg0NCwgMHg1OCwgMHg4QiwgMHgxQywgMHg2MCwgMHhBRSwgMHg2MywgMHgyQiwgMHhEMywgMHhBMywgMHhEQiwKKwkgMHgwMCwgMHg3RiwgMHgwMSwgMHg3RSwgMHg0MCwgMHg0OCwgMHgyQSwgMHg0NCwgMHg1OCwgMHg4QSwgMHgyQywgMHg0NCwgMHg1OCwgMHg4QywgMHhEMiwgMHgwMSwKKwkgMHgxQywgMHg2MCwgMHhBOCwgMHg2MSwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgxQywgMHg2MCwgMHhBQywgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0NSwgMHhGQSwgMHhBNCwgMHg2MCwgMHg0MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHhDNSwgMHg4MSwgMHgwNiwgMHhBMSwKKwkgMHg0MSwgMHg0OCwgMHg2NSwgMHg0MSwgMHhGQywgMHhBMSwgMHhBMSwgMHhEMywgMHgyOCwgMHg0MSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMSwgMHhBNCwKKwkgMHg2MCwgMHg0NSwgMHhDNSwgMHg4MSwgMHg2MSwgMHg0MywgMHgxQywgMHg2MCwgMHhBQywgMHg2MSwgMHhBMSwgMHhERCwgMHgxQywgMHg2MCwgMHhBOCwgMHg2MSwKKwkgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwRCwgMHgwMCwgMHgxQywgMHg2MCwgMHhBQSwgMHg2MSwgMHhBMSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHhBNCwgMHhBMSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgxQSwgMHg2MCwgMHgyQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwKKwkgMHhFOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHhFQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHgwMSwgMHg2MCwgMHhCQSwgMHg2MSwKKwkgMHgxRiwgMHg2MCwgMHgwOCwgMHg2MywgMHhBMSwgMHhEMywgMHgwNCwgMHhBMSwgMHgyMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHgzMiwgMHg3RSwgMHgyMSwgMHg3RiwKKwkgMHhCRCwgMHhEQiwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMiwgMHg3RiwgMHhBMywgMHhEQiwgMHgxMCwgMHgwMCwgMHgwMSwgMHg2MCwgMHhCQSwgMHg2MSwKKwkgMHgxRiwgMHg2MCwgMHgwOCwgMHg2MywgMHhBMSwgMHhEMywgMHgwMCwgMHg2NiwgMHgyMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgyMSwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMiwgMHg3RiwgMHhBMywgMHhEQiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg5RiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwKKwkgMHhEQSwgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxQSwgMHg2MCwgMHhGRCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHgxRiwgMHg2MCwgMHgwNiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgxQiwgMHg2MCwgMHgyNSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg5RiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgxMCwgMHg2MCwgMHgxRSwgMHg2MiwgMHgxRSwgMHg2MCwgMHhGNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxQSwgMHg2MCwgMHg4QSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwNiwgMHhBMiwgMHgxMCwgMHg2MCwgMHg0MCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHg1QSwgMHhEQiwKKwkgMHgxQSwgMHg2MCwgMHg5NiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwNiwgMHhBMiwgMHgxMCwgMHg2MCwgMHg0NCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHg1QSwgMHhEQiwgMHgxQSwgMHg2MCwgMHhBMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwNiwgMHhBMiwKKwkgMHgxMCwgMHg2MCwgMHg0OCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHg1QSwgMHhEQiwgMHhDMCwgMHhGMSwgMHgxQSwgMHg2MCwKKwkgMHhBNiwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxMCwgMHg2MCwgMHgzRSwgMHg2MiwgMHgyMCwgMHg2MCwgMHg5OSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwKKwkgMHg0MiwgMHg2MiwgMHgyMCwgMHg2MCwgMHhBMywgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHg0NiwgMHg2MiwgMHgyMCwgMHg2MCwgMHhBRCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwgMHg3MCwgMHg2MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwKKwkgMHg2MywgMHhGQiwgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwgMHhBOSwgMHhGMywgMHgwNywgMHhGQSwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgzRiwgMHhGQSwKKwkgMHgwRiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxQiwgMHg2MCwgMHg4QSwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwKKwkgMHg2QSwgMHhGQiwgMHgwRiwgMHg0RSwgMHhFMCwgMHg2MCwgMHg1OCwgMHg0RiwgMHg4RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHgwMCwgMHg2NCwKKwkgMHg2QywgMHhGQiwgMHg2MywgMHhGNSwgMHhFQiwgMHhGMywgMHgyRiwgMHhGQSwgMHhFQywgMHhGMywgMHgzMCwgMHhGQSwgMHhFRCwgMHhGMywgMHgzMSwgMHhGQSwKKwkgMHg4MSwgMHhGMywgMHgyQywgMHhGQSwgMHgzMiwgMHhGQSwgMHg4MiwgMHhGMywgMHgyRCwgMHhGQSwgMHgzMywgMHhGQSwgMHg4MywgMHhGMywgMHgyRSwgMHhGQSwKKwkgMHgzNCwgMHhGQSwgMHhCQywgMHhGMywgMHgxOSwgMHhGQSwgMHgwNiwgMHg2MCwgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwgMHgyMCwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg3MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGNywgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHhGRiwgMHg2MCwgMHg4RiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDMSwgMHhGMSwgMHgxQSwgMHg2MCwgMHg5QSwgMHg2MiwKKwkgMHhBMiwgMHhEOSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg5NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2QywgMHhGQiwgMHgwRiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgwMCwgMHg2MCwgMHg3NCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgxQiwgMHg2MCwgMHhERSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgxRSwgMHg2MCwgMHhGNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFMCwgMHgwMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgxMSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg0MCwgMHg1MCwgMHgyNywgMHhENiwgMHgwMSwgMHhBRiwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhGRSwgMHhBMCwgMHhGRiwgMHhGRiwgMHhEMSwgMHgwNiwgMHg2QywgMHhGMywgMHhGRiwgMHhGRiwgMHhGNiwgMHhBMCwgMHhEQywgMHg4NCwgMHgwMSwgMHgwNSwKKwkgMHhBMiwgMHhEQiwgMHhDQSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHhDRSwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgwMCwgMHgwMCwgMHhFMCwgMHhGMywgMHgyOSwgMHg0NSwgMHhENCwgMHg4MCwgMHg2QywgMHhGMywgMHgwMywgMHgwNCwgMHgxQywgMHg2MCwKKwkgMHg1NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGNiwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwNCwgMHgxQywgMHg2MCwgMHg1NSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgwMCwgMHg2MCwgMHg2NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHgyQSwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxRSwgMHg2MCwgMHhGNCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhEMiwgMHgwMSwKKwkgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHhFNCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg0MCwKKwkgMHg1MCwgMHgyNywgMHhERiwgMHgwMSwgMHhBRiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhBMCwgMHhGRiwgMHhGRiwgMHhDMywgMHgwNiwgMHg2QywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhGNiwgMHhBMCwgMHhEQywgMHg4NCwgMHgwMSwgMHgwNSwgMHhBMiwgMHhEQiwgMHhCQywgMHgwMSwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwQiwgMHgwMCwgMHgwRiwgMHg2MCwgMHhEQSwgMHg2MiwgMHg4MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHg1NSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgxQywgMHg2MCwgMHg5MiwgMHg2NSwgMHgwMSwgMHg2NCwgMHhBNSwgMHhEQiwgMHhDMiwgMHhGMSwgMHgxQSwgMHg2MCwgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwKKwkgMHgwQywgMHg2NCwgMHg1MywgMHhGQiwgMHgxQywgMHg2MCwgMHg3NywgMHg2NCwgMHg2QiwgMHhGQiwgMHgxRiwgMHg2MCwgMHg3MiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHhBMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHg2MCwgMHhERiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg4OCwgMHhGMSwgMHgxOSwgMHg2MCwgMHg4NiwgMHg2MywgMHhEMywgMHg4MCwgMHg2OCwgMHhGRCwgMHg1RiwgMHgwMywgMHg2OCwgMHhGMywgMHhFMiwgMHhGMSwKKwkgMHg2MCwgMHg0MywgMHgyOSwgMHg0NCwgMHhBMywgMHhEMywgMHhDMCwgMHg4NSwgMHhENCwgMHg4MCwgMHg1QiwgMHhEMywgMHg1NiwgMHgwNiwgMHg2MCwgMHg0MywKKwkgMHgwOCwgMHhBMywgMHhCRSwgMHhEMywgMHg4MywgMHhGMSwgMHhBMywgMHhEMywgMHhEMCwgMHg4MCwgMHg4MiwgMHhGMSwgMHgwNSwgMHgwMiwgMHhCRiwgMHhEMywKKwkgMHhEMCwgMHg4MCwgMHg4MSwgMHhGMSwgMHgwMSwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGOCwgMHhBMywgMHgyQiwgMHgwMiwgMHgxQywgMHg2MCwgMHhBQiwgMHg2NCwKKwkgMHg2QiwgMHhGQiwgMHgxRiwgMHg2MCwgMHgyOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHhCMCwgMHg4NCwgMHhGMywgMHgzRSwgMHgwMywgMHg2MywgMHhGNSwKKwkgMHg0OCwgMHg3RSwgMHgyQSwgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEQSwgMHg2MiwKKwkgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHhDOCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHg2MCwgMHhGRSwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgxQywgMHgwMCwgMHgyRCwgMHg2MCwgMHg3QSwgMHg2NSwgMHhBNSwgMHhEMywgMHg2NSwgMHg0MSwgMHgxMCwgMHhBMywgMHgwMSwgMHhBNCwgMHhGRSwgMHhCNCwKKwkgMHhDNCwgMHg4NSwgMHhGRSwgMHhBMSwgMHhCRCwgMHhEMywgMHg1OSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhENSwgMHg4MCwgMHgwNSwgMHgwMiwKKwkgMHgwMSwgMHgwMywgMHhGOCwgMHgwMSwgMHgxRSwgMHg2MCwgMHhFOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2OCwgMHhGMywgMHg4OCwgMHhGMSwgMHgwNCwgMHhBNCwKKwkgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHg2OCwgMHhGQiwgMHhBMSwgMHgwMSwgMHhFMCwgMHhGMywgMHgyOSwgMHg0NSwgMHhENCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwQywgMHgwNywgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg5NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxQiwgMHg2MCwgMHhCMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMSwgMHhGMywgMHgyOSwgMHg0NSwKKwkgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxNywgMHgwNiwgMHgwNCwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwNSwgMHg2NCwgMHhEQywgMHhGQiwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCQywgMHhGMiwgMHhGQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwKKwkgMHgxQSwgMHg2MCwgMHg5NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxRCwgMHg2MCwKKwkgMHg2RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgwMCwgMHg2MCwgMHg3NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxRCwgMHg2MCwKKwkgMHgyNCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxRSwgMHg2MCwKKwkgMHhGNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHg4NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgxNywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg0MCwgMHg1MCwgMHgyNywgMHhBNywgMHgwMSwgMHhBRiwgMHhGMywgMHg2QywgMHhGMywKKwkgMHhGRSwgMHhBMCwgMHhGNiwgMHhBMCwgMHgwQSwgMHgwNiwgMHgwMywgMHgwNCwgMHgwMCwgMHg2NCwgMHg1NSwgMHhGQiwgMHg0MCwgMHg0OSwgMHg2QywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhGNiwgMHhBMCwgMHhEQywgMHg4NCwgMHgwMSwgMHgwNSwgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHg4NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHhDNiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwKKwkgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHhBMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHgxQywgMHg2MCwgMHg1NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHhFQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwQiwgMHgwMCwgMHgwRiwgMHg2MCwgMHhEQSwgMHg2MiwgMHg4MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxRCwgMHg2MCwgMHg2RCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgxQywgMHg2MCwgMHg5MiwgMHg2NSwgMHgwMCwgMHg2NCwgMHhBNSwgMHhEQiwgMHhDMywgMHhGMSwgMHgxQSwgMHg2MCwgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwKKwkgMHgxRiwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHgwOCwgMHhCNCwgMHgwMSwgMHhCQywgMHgyOSwgMHgwMiwgMHhBMiwgMHhEQiwKKwkgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg0RSwgMHhFNCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhGQiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHgwRiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxRCwgMHg2MCwKKwkgMHhBNCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwQywgMHgyNiwgMHgwQywgMHgwMCwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg5NiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxRSwgMHg2MCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHg2NCwgMHgzMSwgMHg2MCwgMHgyQSwgMHg2MiwgMHhBMiwgMHhEQiwgMHgwRCwgMHg2NCwgMHg1MywgMHhGQiwgMHgxRCwgMHg2MCwgMHhDMywgMHg2NCwKKwkgMHg2QiwgMHhGQiwgMHgxRiwgMHg2MCwgMHg3MiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHhBMiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHhGRiwgMHg2MCwgMHhERiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4OCwgMHhGMSwgMHgxOSwgMHg2MCwgMHg4NiwgMHg2MywgMHhEMywgMHg4MCwKKwkgMHg2OCwgMHhGRCwgMHgwMSwgMHgwMiwgMHg0MywgMHgwMCwgMHg2OCwgMHhGMywgMHgyOSwgMHg0MSwgMHhBMCwgMHhEMSwgMHg1OCwgMHhEMywgMHhEMSwgMHg4MCwKKwkgMHg2NCwgMHg0NSwgMHg2MCwgMHg0MywgMHgwRiwgMHgwNSwgMHgwOCwgMHhBMywgMHhCRSwgMHhEMywgMHg4MywgMHhGMSwgMHhBMywgMHhEMywgMHhEMCwgMHg4MCwKKwkgMHg4MiwgMHhGMSwgMHgwNSwgMHgwMiwgMHhCRiwgMHhEMywgMHhEMCwgMHg4MCwgMHg4MSwgMHhGMSwgMHgwMSwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGOCwgMHhBMywKKwkgMHgwNywgMHgwMiwgMHg0NSwgMHg0OSwgMHgxRSwgMHg2MCwgMHgyQSwgMHg2NCwgMHg2QiwgMHhGQiwgMHgxRiwgMHg2MCwgMHgyOSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyRCwgMHg2MCwgMHg3QSwgMHg2NSwgMHhBNSwgMHhEMywgMHg2NSwgMHg0MSwgMHgxMCwgMHhBMywgMHgwMSwgMHhBNCwgMHhGRSwgMHhCNCwgMHhDNCwgMHg4NSwKKwkgMHhGRSwgMHhBMSwgMHhCRCwgMHhEMywgMHg1OSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhENSwgMHg4MCwgMHgwRiwgMHgwMiwgMHhGOSwgMHgwMiwKKwkgMHgwNSwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHg2NCwgMHhEQywgMHhGQiwgMHhGMiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhGMiwgMHhGQiwgMHgxRSwgMHg2MCwgMHhFOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2OCwgMHhGMywgMHg4OCwgMHhGMSwKKwkgMHgwNCwgMHhBNCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHg2OCwgMHhGQiwgMHhCRCwgMHgwMSwgMHhFMSwgMHhGMywgMHgyOSwgMHg0NSwKKwkgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHg3NSwgMHgwNSwgMHgxRSwgMHg2MCwgMHgyQSwgMHg2MywgMHg2QiwgMHhGRCwgMHgxQSwgMHg2MCwgMHg0QywgMHg2MywKKwkgMHgxRiwgMHg2MCwgMHgyOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg5NiwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwNSwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHg1MiwgMHg2MSwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgwNCwgMHg2NCwgMHhEQywgMHhGQiwgMHhGMiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhGMiwgMHhGQiwgMHg4NCwgMHhGMywgMHg2MywgMHhGNSwgMHg0OCwgMHg3RSwgMHgyQSwgMHhGQSwgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwRiwgMHg2MCwKKwkgMHhEQSwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxRSwgMHg2MCwgMHg2MSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHg2MCwgMHhGRSwgMHg2NCwgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgxQSwgMHg2MCwgMHg5QSwgMHg2MiwgMHgwMCwgMHg2MCwgMHgzMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwKKwkgMHgxQSwgMHg2MCwgMHg5NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhEQSwgMHg2MiwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxRSwgMHg2MCwgMHg4MSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHg2MCwgMHhFRiwgMHg2NCwgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhGRCwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQiwgMHg2MCwgMHhCMSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgwMCwgMHg2MCwgMHg3NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxRSwgMHg2MCwgMHhBMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxRSwgMHg2MCwgMHhGNCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxRCwgMHg2MCwKKwkgMHhEMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgxNywgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgyMCwgMHg0MCwgMHg1MCwgMHgyNywgMHhERCwgMHgwMSwgMHhBRiwgMHhGMywgMHg2QywgMHhGMywgMHhGRSwgMHhBMCwgMHhGNiwgMHhBMCwKKwkgMHgwQSwgMHgwNiwgMHgwMywgMHgwNCwgMHgwMCwgMHg2NCwgMHg1NSwgMHhGQiwgMHg0MCwgMHg0OSwgMHg2QywgMHhGMywgMHhGRiwgMHhGRiwgMHhGNiwgMHhBMCwKKwkgMHhEQywgMHg4NCwgMHgwMSwgMHgwNSwgMHhBMiwgMHhEQiwgMHgxRCwgMHg2MCwgMHhEMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHhDNiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwKKwkgMHhBMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxRCwgMHg2MCwgMHg2RCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwKKwkgMHg4QSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwKKwkgMHgxQSwgMHg2MCwgMHg5NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyNCwgMHg2MCwKKwkgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHhBMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHgwMCwgMHg2NCwgMHg2QSwgMHhGQiwgMHgwRiwgMHg2MCwKKwkgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwKKwkgMHhEQSwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxQiwgMHg2MCwgMHg4QSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhEMywgMHg3RiwgMHhGMSwgMHg3RSwgMHhGQiwgMHhEMCwgMHg4MCwgMHgwMCwgMHg2NCwgMHg0MCwgMHgwMywKKwkgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHhCRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwKKwkgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhEQSwgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxRiwgMHg2MCwgMHgyRiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHhERiwgMHg2MCwKKwkgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg3RSwgMHhGMSwgMHg3RiwgMHhGOSwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwKKwkgMHgxRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgxRiwgMHg2MCwgMHg1RSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCRSwgMHhGRSwKKwkgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHhERiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMSwgMHg2NCwKKwkgMHg2QiwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHgwRiwgMHg2MCwKKwkgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg3RiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg0MCwgMHg1MSwgMHgyMywKKwkgMHgwQiwgMHgwMCwgMHgwRiwgMHg2MCwgMHhEQSwgMHg2MiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxRiwgMHg2MCwgMHg3NiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg3RiwgMHg2MCwKKwkgMHhGRiwgMHg2MSwgMHhBMSwgMHg4NCwgMHg1QSwgMHhEMSwgMHg0QSwgMHhEQiwgMHhBMSwgMHg4NCwgMHg1QSwgMHhEQiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHgwMiwgMHg2NCwgMHg4QywgMHhGQiwgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHg4QywgMHhGMywgMHgwMCwgMHg2NSwKKwkgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxMiwgMHgwMywgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg3RiwgMHg2MCwgMHhGRiwgMHg2NCwKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhEQSwgMHg2MiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxRiwgMHg2MCwKKwkgMHg5OSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRCwgMHg2MCwgMHg3QSwgMHg2NCwgMHg1NCwgMHhGQiwKKwkgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHhFRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxQSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhEQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg0RSwgMHhFQywgMHg2MCwgMHg1OCwgMHg0RiwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwRSwgMHg0RiwgMHgwRiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxRiwgMHg2MCwgMHhEMywgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RSwgMHhFRCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg5NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHhFRiwgMHg2MCwgMHhFRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgwMSwgMHg2NCwgMHg4QywgMHhGQiwgMHhCRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwMSwgMHg2MCwgMHgxNCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgxMiwgMHg2MCwgMHg0NiwgMHg2MywgMHhDMywgMHg4NSwgMHhDNiwgMHhBMywgMHgzQSwgMHhBMywgMHhENywgMHg4MCwgMHhBRiwgMHhGMywKKwkgMHgwOSwgMHgwNCwgMHhGRSwgMHhBMCwgMHg2QywgMHhGMywgMHgzQSwgMHgwNiwgMHhGNiwgMHhBMCwgMHgwMCwgMHg2NCwgMHgzNywgMHgwNCwgMHg1NSwgMHhGQiwKKwkgMHg0MCwgMHg0OSwgMHgzNCwgMHgwMCwgMHgwOCwgMHhBMywgMHhCRSwgMHhEMywgMHg4MywgMHhGMSwgMHhBMywgMHhEMywgMHhEMCwgMHg4MCwgMHg4MiwgMHhGMSwKKwkgMHgwNSwgMHgwMiwgMHhCRiwgMHhEMywgMHhEMCwgMHg4MCwgMHg4MSwgMHhGMSwgMHgwMSwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGOCwgMHhBMywgMHhFNSwgMHgwMiwKKwkgMHhCRSwgMHhEMywgMHg1QSwgMHhEMSwgMHg2MCwgMHg0NywgMHg0MCwgMHg0QSwgMHg2NCwgMHg0NywgMHg0MCwgMHg0OCwgMHgyMCwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg0NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHg0OCwgMHgyMCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg1NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg3MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MCwgMHgyRSwgMHg2NSwgMHg2QywgMHhGMywgMHhBNSwgMHhEMywgMHhGNiwgMHhBMCwKKwkgMHg0MCwgMHhCQywgMHgwNiwgMHgwNCwgMHhBNSwgMHhEQiwgMHg2QSwgMHhGMSwgMHhGRiwgMHg2MCwgMHhGQiwgMHg2NCwgMHhBMCwgMHg4NCwgMHg2QSwgMHhGQiwKKwkgMHg2QywgMHhGMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhCOCwgMHhDQywgMHg4NCwgMHgwMSwgMHgwMywgMHhBMiwgMHhEQiwgMHhGRCwgMHg2MCwgMHhGRiwgMHg2NSwKKwkgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhDMSwgMHhGRSwgMHg2QiwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg1NSwgMHhGMSwgMHgyOCwgMHg0NCwKKwkgMHhEMCwgMHg4NCwgMHgwMywgMHhBNCwgMHgwMywgMHgwRSwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgwNCwgMHgwMCwgMHhGQSwgMHhBNCwgMHhFOCwgMHg4NCwKKwkgMHhFOCwgMHg4NywgMHhDMCwgMHhCRiwgMHhDMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg1NiwgMHhGMSwgMHgyOCwgMHg0NCwKKwkgMHhEMCwgMHg4NCwgMHgxRiwgMHhBNCwgMHgwNiwgMHgwRSwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHgwNywgMHgwMCwgMHhDMiwgMHhBNCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NywgMHhGOCwgMHhCRiwKKwkgMHhDMCwgMHg4NCwgMHg1QywgMHhGMSwgMHg1NiwgMHhGQiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNSwgMHg2NCwgMHg0NCwgMHg1MiwgMHhGQiwKKwkgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg1MiwgMHhGMSwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0MCwgMHgyMCwgMHgyQSwgMHgwNiwgMHgwMCwgMHg1QywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHg2NCwgMHg0NSwgMHgwMSwgMHgwNiwgMHg2MCwgMHg0NSwgMHgyRiwgMHg2NywgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgwNiwgMHg2MCwgMHg0NSwgMHg1NSwgMHhGMSwgMHg4QiwgMHg2NywgMHhEMCwgMHg4MCwgMHg2MCwgMHg0MSwgMHgwMiwgMHgyNCwgMHg2NCwgMHg0MSwKKwkgMHhENSwgMHg4NCwgMHg4MCwgMHg2NSwgMHhDNCwgMHg4NywgMHgwMSwgMHgwNSwgMHgwMCwgMHg2NCwgMHhGRiwgMHhCNCwgMHg0MCwgMHg0OSwgMHgyMCwgMHg0MCwKKwkgMHgyMCwgMHgyQSwgMHgwNiwgMHgwMCwgMHgyRSwgMHg0MywgMHhGMywgMHg2MCwgMHg1OCwgMHg0RSwgMHhBOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0MywgMHg0RSwKKwkgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHg0NiwgMHgyNywgMHhGMiwgMHg3MCwgMHg2MywgMHg2MCwgMHg0MCwgMHgwQSwgMHgzNiwgMHgwNiwgMHgwMCwgMHgxNCwgMHgzNiwgMHgwQSwgMHgwMCwKKwkgMHgzNywgMHgzNiwgMHgwNCwgMHgwMCwgMHg2RSwgMHgzNiwgMHgwNCwgMHgwMCwgMHhEMCwgMHg2MywgMHgwNCwgMHgwMCwgMHgzMywgMHg2MywgMHgwMiwgMHgwMCwKKwkgMHgyMSwgMHg2MywgMHgwMCwgMHgwMCwgMHgxRiwgMHg2MCwgMHg1QSwgMHg2MSwgMHhBMSwgMHhERCwgMHgyNiwgMHg0NiwgMHhCRiwgMHhGMiwgMHgwMSwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHhGNCwgMHhBMSwgMHhENSwgMHg4MCwgMHgwMCwgMHhGNCwgMHgwMiwgMHgyNCwgMHg2NSwgMHg0MSwgMHg0MSwgMHg0OCwgMHgxRSwgMHg2NSwKKwkgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHhBNSwgMHhEMCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwKKwkgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHgwNSwgMHgwMywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwKKwkgMHhCRCwgMHhEQiwgMHhGMCwgMHgwMiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHgyOCwgMHg0MSwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHhGRCwgMHhBMCwKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg2NCwgMHg0NCwgMHhFMCwgMHg4NSwgMHhEMSwgMHg4MSwgMHhGRSwgMHhBMSwgMHhDNywgMHg4MywgMHhGNSwgMHgwRCwKKwkgMHgwNCwgMHgwMCwgMHgxQSwgMHg2MCwgMHg0QywgMHg2MSwgMHhBMywgMHhEMywgMHhBMSwgMHhEQiwgMHgzMSwgMHg0MCwgMHgwNiwgMHgyNiwgMHg1OCwgMHgwMCwKKwkgMHgwMCwgMHg2NCwgMHg3MCwgMHhGQiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHgyOCwgMHg0MSwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHhGQywgMHhBMCwKKwkgMHhGQiwgMHhBMCwgMHgwOCwgMHgwMywgMHgyOCwgMHgwMywgMHg2NCwgMHg0NCwgMHhFMCwgMHg4NSwgMHhEMSwgMHg4MSwgMHhGRSwgMHhBMSwgMHhDNywgMHg4MywKKwkgMHhGNCwgMHgwRCwgMHg0NiwgMHgwMCwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHgwMCwgMHhCOCwgMHg3MCwgMHhGQiwgMHg2RiwgMHhGQiwgMHhCRCwgMHhEMywKKwkgMHgzRiwgMHgwMiwgMHhBMywgMHhEMywgMHg2MCwgMHg0NSwgMHg2MCwgMHg0NywgMHhCNCwgMHg4NCwgMHg2MCwgMHg0MSwgMHgzRiwgMHhCNSwgMHhFOCwgMHg4NCwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHg3MiwgMHhGQiwgMHg2NSwgMHg0NywgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHg3MSwgMHhGQiwgMHg2NCwgMHg0NCwgMHhFMCwgMHg4NSwgMHhGQSwgMHhBMywgMHhDNywgMHg4MywgMHgxQSwgMHg2MCwgMHg0NCwgMHg2MiwKKwkgMHg2MSwgMHg0NCwgMHhBMiwgMHhEQiwgMHhEMiwgMHgwMSwgMHhCRCwgMHhEMywgMHhBMywgMHhEMywgMHgwMCwgMHhCOCwgMHg2RSwgMHhGQiwgMHg3NCwgMHhGQiwKKwkgMHgxRiwgMHgwMiwgMHg4NywgMHhGMSwgMHg3MCwgMHhGMywgMHg2RCwgMHhGOSwgMHgwNCwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwMCwgMHgzQSwgMHgwNiwgMHg2NSwKKwkgMHgzMSwgMHg0NCwgMHhCNCwgMHg4NCwgMHg0MCwgMHg1MSwgMHgwMiwgMHgyQSwgMHgwQiwgMHgwMCwgMHgwOCwgMHhCQywgMHg0MCwgMHg1MSwgMHg3MiwgMHhGMywKKwkgMHg3MSwgMHhGMSwgMHgwMCwgMHhCOCwgMHg2NCwgMHg0NSwgMHgwMSwgMHgwMywgMHg2NywgMHg0NSwgMHg2NSwgMHg1MCwgMHhDQywgMHg4NCwgMHg3MywgMHhGQiwKKwkgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQSwgMHg4NCwgMHgwMCwgMHgxRiwgMHg2MCwKKwkgMHg1MiwgMHg2MSwgMHgwMSwgMHg2NCwgMHhBMSwgMHhEQiwgMHgyMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHgzRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwKKwkgMHgwMCwgMHhGNCwgMHgwRCwgMHhGMiwgMHg4MCwgMHhGQiwgMHgwMCwgMHg2NCwgMHg4NiwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwKKwkgMHgxRSwgMHg2NSwgMHhGNCwgMHhBNCwgMHhENCwgMHhBMCwgMHg2MCwgMHg0MSwgMHgwMSwgMHgwNiwgMHgyQywgMHg2MSwgMHg0MSwgMHg0OCwgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg2MywgMHhBNSwgMHhEMCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg2NCwgMHg0NCwKKwkgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHgwNSwgMHgwMywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwKKwkgMHhGMCwgMHgwMiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHgyOCwgMHg0MSwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHgwMSwgMHhBOCwgMHhDOSwgMHg4MSwKKwkgMHgwNiwgMHgwMywgMHg2NCwgMHg0NCwgMHhEMSwgMHg4MSwgMHhFMCwgMHg4NSwgMHg0MiwgMHgwNiwgMHhDNywgMHg4MywgMHhGNSwgMHgwMSwgMHg0MywgMHg0OCwKKwkgMHgyRCwgMHg2MCwgMHgyQSwgMHg2MywgMHg0MywgMHg0QSwgMHg2NCwgMHg0MSwgMHgyOCwgMHg0MywgMHgwMCwgMHg2NSwgMHg0NSwgMHg0QywgMHg2NSwgMHg1QywKKwkgMHhCRCwgMHhEMywgMHg2MSwgMHg0MCwgMHgwMCwgMHgzNiwgMHgyNywgMHgwMCwgMHhDRCwgMHg4MSwgMHg2MCwgMHg0MCwgMHgwMiwgMHgzNiwgMHg2MCwgMHg0NSwKKwkgMHgwNCwgMHgzNiwgMHg2MCwgMHg0NSwgMHg4MiwgMHgzNiwgMHg2MCwgMHg0NSwgMHg4NCwgMHgzNiwgMHg2MCwgMHg0NSwgMHgwQiwgMHgzNiwgMHg2MCwgMHg0NSwKKwkgMHg4QiwgMHgzNiwgMHg2MCwgMHg0NSwgMHgxNiwgMHgzNiwgMHg2MCwgMHg0NSwgMHg5NiwgMHgzNiwgMHg2MCwgMHg0NSwgMHg2NSwgMHg0MCwgMHgwMCwgMHgzNiwKKwkgMHhFNywgMHgwMSwgMHg2NCwgMHg0NCwgMHhEQywgMHg5QywgMHgyQywgMHg0NCwgMHgwMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHg0NSwgMHg0QywgMHhFMCwgMHgwMSwKKwkgMHgyQywgMHg1RSwgMHg2NSwgMHg1RiwgMHgwMCwgMHg2NSwgMHg0NSwgMHg0QywgMHg0MywgMHg0OCwgMHgyQSwgMHg0MywgMHhCRCwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHg0MywgMHg0QSwgMHgyOCwgMHg0MywgMHhENSwgMHgwMSwgMHgyRCwgMHg2MCwgMHgyOCwgMHg2NCwgMHg2MCwgMHhGRSwgMHhBMCwgMHhEOSwgMHhGRiwgMHhGRiwKKwkgMHgyMCwgMHhGRSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzQSwgMHgzOSwgMHgwMCwgMHgyQSwgMHg0MywgMHg2NSwgMHg0NCwgMHhBMywgMHhEQiwgMHgzNSwgMHgwMCwKKwkgMHgyMywgMHg2MCwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEQywgMHhGMywgMHhGRiwgMHhGRiwgMHgwMywgMHhBOCwgMHgwMiwgMHhBOCwgMHgwMiwgMHgwMywKKwkgMHg0MSwgMHgwMiwgMHhGNiwgMHgwMSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHg2MCwgMHhGQiwgMHg2NCwgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyNiwgMHg0NiwgMHgxRiwgMHg2MCwgMHg1QSwgMHg2MSwgMHhBMSwgMHhEMywgMHgyNSwgMHhGMiwgMHg2MCwgMHg0NSwKKwkgMHgyNCwgMHhGMCwgMHgwMCwgMHhGNCwgMHg2NCwgMHg0MywgMHhDNywgMHg4MywgMHg2MCwgMHg0MSwgMHgwMiwgMHgyNCwgMHgwMSwgMHhBMSwgMHgwQSwgMHhGMCwKKwkgMHgwOSwgMHhGMiwgMHhEMSwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwOSwgMHgwNywgMHgwNCwgMHgwNCwgMHg2MywgMHg0NSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgwNiwgMHgyMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHgzRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyNiwgMHhGMCwgMHhGRiwgMHg2NywKKwkgMHgyMCwgMHg4OCwgMHg2NCwgMHg1RiwgMHg0MCwgMHg0QSwgMHgyMCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHg0OCwKKwkgMHgyMCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg1NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3MSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEQSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyMiwKKwkgMHhBRiwgMHgwMSwgMHgwMSwgMHg2MCwgMHgyRSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhCRiwgMHhCNCwgMHhBMiwgMHhEQiwgMHgxRiwgMHg2MCwKKwkgMHg1QSwgMHg2MSwgMHhBMSwgMHhEMywgMHgyNiwgMHg0NiwgMHg2MCwgMHg0NSwgMHgxRSwgMHg2MCwgMHhGRSwgMHg2MywgMHgwMCwgMHhGNCwgMHgwOSwgMHhGMiwKKwkgMHhCRCwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwQSwgMHhGMiwgMHhCRCwgMHhEQiwgMHgwQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHhCRCwgMHhEQiwgMHgwQywgMHhGMiwKKwkgMHhBMywgMHhEQiwgMHhGQSwgMHhBMywgMHgyNiwgMHg0NiwgMHhBMywgMHhEMywgMHgyNCwgMHhGMCwgMHgwMCwgMHg2MSwgMHhEMCwgMHg4NCwgMHhGMSwgMHg4MSwKKwkgMHhENCwgMHg4NCwgMHhGMSwgMHg4MSwgMHhCRCwgMHhEQiwgMHhBMywgMHhEMywgMHgwMywgMHhCMSwgMHgwMywgMHhBOSwgMHgyNSwgMHhGMCwgMHg0MiwgMHhGRSwKKwkgMHgwNSwgMHgwMywgMHhGRCwgMHhBMSwgMHhDQywgMHg4NCwgMHgwMSwgMHgwMiwgMHhDQywgMHg4NCwgMHgwMCwgMHg2MSwgMHhGMSwgMHg4MSwgMHhEMCwgMHg4NCwKKwkgMHhGMSwgMHg4MSwgMHhCRCwgMHhEQiwgMHhBMywgMHhEMywgMHgwMywgMHhCMSwgMHgwMywgMHhBOSwgMHgyOCwgMHhGMCwgMHg0MiwgMHhGRSwgMHgwMSwgMHgwMywKKwkgMHhDQywgMHg4NCwgMHhGMSwgMHg4MSwgMHhEMCwgMHg4NCwgMHhGMSwgMHg4MSwgMHhCRCwgMHhEQiwgMHhBMywgMHhEMywgMHgwMywgMHhCMSwgMHgwMywgMHhBOSwKKwkgMHgyOSwgMHhGMCwgMHgwMSwgMHgwMywgMHhDQywgMHg4NCwgMHhEMCwgMHg4NCwgMHhBMywgMHhEQiwgMHgxRiwgMHg2MCwgMHg1MiwgMHg2MSwgMHhBMSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHhBOCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHhGNSwgMHhGRSwgMHgxRSwgMHg2MCwKKwkgMHhGRSwgMHg2NCwgMHhBMCwgMHhEMSwgMHgwNiwgMHhBNCwgMHhBMCwgMHhEMywgMHg2NCwgMHg0NSwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQiwgMHgwMywgMHgwMCwKKwkgMHhGRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHg5NCwgMHg4NSwgMHgwMCwgMHg2MCwgMHg5NiwgMHg2NCwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwQiwgMHgwNiwKKwkgMHgxRiwgMHg2MCwgMHg1MiwgMHg2MSwgMHhBMSwgMHhEMywgMHg2QSwgMHhGMywgMHgwMCwgMHhBOCwgMHgwNCwgMHhCMCwgMHgwNCwgMHgwMiwgMHgwMywgMHgwMywKKwkgMHgyMywgMHg2MCwgMHgxMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwOSwgMHhGMiwgMHg1QSwgMHhEMiwgMHg0MCwgMHg0OCwKKwkgMHg0MCwgMHg0QSwgMHg1QSwgMHhEMiwgMHg1QSwgMHhEMiwgMHg0MCwgMHg0QywgMHg2MCwgMHg0MSwgMHg1QSwgMHhEMCwgMHg4MCwgMHhGOSwgMHg0MCwgMHg2MywKKwkgMHhBRCwgMHg4MCwgMHhGMCwgMHhBMywgMHgwOSwgMHgwMiwgMHgzQywgMHgwMywgMHgyQywgMHg0MSwgMHgyQSwgMHg0NCwgMHg0MCwgMHg0QywgMHgyOCwgMHg0NCwKKwkgMHg0MCwgMHg0QSwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0OCwgMHhGNCwgMHgwMSwgMHhEMSwgMHg4MCwgMHgwMSwgMHgwMiwgMHgzMSwgMHgwNCwgMHgxMCwgMHhBMywKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NSwgMHhBNSwgMHg4MCwgMHhDRiwgMHg4MywgMHgwOCwgMHgwMiwgMHgyOCwgMHg0NCwgMHg2MCwgMHg4OCwgMHgyQSwgMHg0NCwKKwkgMHg3MCwgMHg4QSwgMHgyQywgMHg0NCwgMHg3MCwgMHg4QywgMHhGMSwgMHg4MSwgMHhGNSwgMHgwMSwgMHhFNywgMHhBMywgMHg2NCwgMHg0NCwgMHgwMCwgMHhBOCwKKwkgMHgwMCwgMHg2MiwgMHgwMiwgMHgwMiwgMHgwMCwgMHg2MSwgMHgxQywgMHgwMCwgMHhFMCwgMHg4NCwgMHhERSwgMHg4MiwgMHhGRCwgMHgwNCwgMHg0MiwgMHhGRSwKKwkgMHhGOCwgMHg4NCwgMHg2MiwgMHg0NSwgMHhDNywgMHg4MywgMHg2MCwgMHg0NSwgMHgwMiwgMHhGRSwgMHhENSwgMHg4NCwgMHgwMiwgMHgwNSwgMHgwMSwgMHgwNSwKKwkgMHg2MSwgMHg0NCwgMHhDRiwgMHg4MywgMHg2MCwgMHg0MSwgMHgwOCwgMHgwMywgMHgyOCwgMHg0NCwgMHg2MCwgMHg4OCwgMHgyQSwgMHg0NCwgMHg3MCwgMHg4QSwKKwkgMHgyQywgMHg0NCwgMHg3MCwgMHg4QywgMHhGMSwgMHg4MSwgMHhGMSwgMHgwMSwgMHhDRSwgMHg4MiwgMHhFOSwgMHg4MSwgMHhGRCwgMHgwMiwgMHhGMSwgMHg4MSwKKwkgMHgwOSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHg1QSwgMHhEMiwgMHgzRiwgMHhCNSwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhCNCwgMHg4NCwgMHg2MSwgMHg0NSwgMHhENCwgMHg4NCwKKwkgMHhDMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg5MywgMHgxRiwgMHg2MCwgMHg1MiwgMHg2MSwgMHhBMSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2NSwgMHg3MywgMHg0NCwKKwkgMHhENCwgMHg5MywgMHg2QSwgMHhGMywgMHgyNiwgMHg0NiwgMHgwNCwgMHhCQywgMHhBMiwgMHhEQiwgMHgyNiwgMHhGMCwgMHhGRiwgMHg2NywgMHgyMCwgMHg4OCwKKwkgMHg2NCwgMHg1RiwgMHg0MCwgMHg0QSwgMHgyMCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHg0OCwgMHgyMCwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg1NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2QywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHhCOCwgMHhDQywgMHg4NCwgMHgwMSwgMHgwMywgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwKKwkgMHhBMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHhGRiwgMHg2MCwgMHhERiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyOCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwRiwgMHhCNCwgMHg1OSwgMHgwMCwgMHhGRiwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyNCwgMHg2MCwgMHg5RSwgMHg2NSwgMHgwNCwgMHg2NCwgMHhBNSwgMHhEQiwgMHgxMiwgMHgwMCwgMHgyNCwgMHg2MCwgMHg5RSwgMHg2NSwgMHgwQywgMHg2NCwKKwkgMHhBNSwgMHhEQiwgMHgwRCwgMHgwMCwgMHgyNCwgMHg2MCwgMHg5RSwgMHg2NSwgMHgwNiwgMHg2NCwgMHhBNSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwKKwkgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg5RSwgMHg2NSwgMHgwOCwgMHg2NCwgMHhBNSwgMHhEQiwgMHgyMywgMHg2MCwKKwkgMHhBMSwgMHg2NCwgMHhBMSwgMHhGQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOSwgMHhGMywKKwkgMHg3RiwgMHhGQiwgMHhBNCwgMHhGQiwgMHgwMiwgMHg2MCwgMHhFRSwgMHg2NCwgMHhBMywgMHhGQiwgMHgwNywgMHg2NCwgMHhBNSwgMHhGQiwgMHgyMywgMHg2MCwKKwkgMHhBMSwgMHg2NCwgMHhBMSwgMHhGQiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRSwgMHgwMCwgMHg2NCwgMHgxOSwgMHhGRiwgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHgwRCwgMHg2MywgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMCwgMHhERCwgMHg2MiwgMHhGRiwgMHgyMywgMHg2MCwKKwkgMHg4RSwgMHg2MywgMHhBMSwgMHhGRCwgMHhGRiwgMHhGRiwgMHgxQSwgMHhGRiwgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHg2MCwKKwkgMHg0QiwgMHg2MywgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMCwgMHhERCwgMHg2MiwgMHhGRiwgMHgyOSwgMHhGNSwgMHgyNCwgMHg2MCwgMHg3QSwgMHg2MywKKwkgMHgyNCwgMHg2MCwgMHg0QywgMHg2NCwgMHhCRCwgMHhEQiwgMHg2NiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgwMiwgMHg2NCwgMHhBMywgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHhGOSwgMHhGRSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhBNywgMHgwMSwgMHgwMCwgMHgzNiwgMHhBOCwgMHgwMSwKKwkgMHgwMSwgMHgzNiwgMHhBQiwgMHgwMSwgMHgwMiwgMHgzNiwgMHhBRSwgMHgwMSwgMHgwMywgMHgzNiwgMHhCNSwgMHgwMSwgMHgwNCwgMHgzNiwgMHhEMSwgMHgwMSwKKwkgMHgwNSwgMHgzNiwgMHhDRiwgMHgwMSwgMHgwNiwgMHgzNiwgMHhGMSwgMHgwMSwgMHgwNywgMHgzNiwgMHhDQiwgMHgwMSwgMHgwOCwgMHgzNiwgMHhCNywgMHgwMSwKKwkgMHgwOSwgMHgzNiwgMHgwQywgMHgwMCwgMHgwQSwgMHgzNiwgMHgwRCwgMHgwMCwgMHgwQiwgMHgzNiwgMHgwRSwgMHgwMCwgMHgwQywgMHgzNiwgMHgxNywgMHgwMCwKKwkgMHgwRCwgMHgzNiwgMHgwRCwgMHgwMCwgMHgwRSwgMHgzNiwgMHgxRSwgMHgwMCwgMHgwRiwgMHgzNiwgMHgzMiwgMHgwMCwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHgwOCwgMHgwMCwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwNSwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHgwMiwgMHgwMCwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgzMiwgMHg0NSwgMHhCNCwgMHg4NSwgMHg0NSwgMHg1MiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwKKwkgMHhEMSwgMHg2MywgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMCwgMHhERCwgMHg2MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQSwgMHhGRiwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwgMHgwNSwgMHgwMCwgMHg5MCwgMHg2MCwgMHgwMCwgMHhFOCwgMHgyNCwgMHg2MCwKKwkgMHgwRCwgMHg2MywgMHgwNCwgMHgwMCwgMHg5MSwgMHg2MCwgMHgwMCwgMHhFOCwgMHgyNCwgMHg2MCwgMHhCQiwgMHg2MywgMHgyOCwgMHhFOCwgMHgwQywgMHg2MCwKKwkgMHgxNiwgMHg2NCwgMHhBMCwgMHhERCwgMHg2MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQSwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHg5MSwgMHg2MCwgMHgwMCwgMHhFOCwgMHgyOCwgMHhFOCwgMHhEOSwgMHg2MCwgMHhGRSwgMHg2NCwgMHgzMiwgMHg0NSwgMHhBNCwgMHg4NSwgMHg0NSwgMHg1MiwKKwkgMHg5OSwgMHhGRiwgMHhBNSwgMHg0RiwgMHhGRiwgMHhCNCwgMHgwNywgMHhGQiwgMHg5OCwgMHhGRiwgMHhBMywgMHg2MCwgMHg0QiwgMHg2MywgMHgwQywgMHg2MCwKKwkgMHgxNiwgMHg2NCwgMHhBMCwgMHhERCwgMHg2MiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHhFMSwgMHhBMSwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHg0MywgMHhGRiwgMHgwMSwgMHg2MCwgMHgwMCwgMHhFMSwgMHgyOCwgMHhGMywgMHg0NywgMHhGRiwgMHg2MCwgMHg0MCwgMHgwNywgMHgzNywKKwkgMHg0QiwgMHgwMCwgMHgwNSwgMHgzQiwgMHgwNCwgMHgwMCwgMHhGRiwgMHgwQSwgMHg4MCwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyOSwgMHhGNSwKKwkgMHgyQSwgMHhGMywgMHg0NywgMHhGRiwgMHgzRiwgMHhGMCwgMHgwMSwgMHgxQiwgMHgwMSwgMHg2NCwgMHg2MCwgMHg1NiwgMHhBRCwgMHhFMiwgMHhCNSwgMHhGRiwKKwkgMHg2QywgMHg0MCwgMHg0MCwgMHhFMSwgMHhBMSwgMHhGRiwgMHgwMCwgMHhGNCwgMHg2RSwgMHg2MSwgMHgxMiwgMHg2MiwgMHg2NCwgMHg0MywgMHgwMSwgMHhFMSwKKwkgMHgwMywgMHg2NCwgMHhFMiwgMHhEMCwgMHhDOSwgMHg4MSwgMHg2NCwgMHg0QywgMHhDQywgMHg4NCwgMHhEQSwgMHg4MiwgMHhGQSwgMHgwMiwgMHgwMSwgMHg2MCwKKwkgMHgwMCwgMHg2QiwgMHg5QSwgMHhGRiwgMHhDQSwgMHg4MiwgMHgwMywgMHgwMCwgMHgwMCwgMHhGNCwgMHg4MSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg3QSwgMHhEMCwKKwkgMHhBMSwgMHhGRiwgMHg2NCwgMHg0QywgMHhGQywgMHgxQywgMHhGOCwgMHgxRCwgMHgwMCwgMHhCOSwgMHgwNiwgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwKKwkgMHhEQSwgMHg4MiwgMHg1QSwgMHhEMiwgMHhBMSwgMHhGRiwgMHg2MCwgMHg0RCwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwgMHgwOCwgMHgwMCwgMHgyOCwgMHhGMywKKwkgMHhBNSwgMHg2MCwgMHhDNCwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwRSwgMHgzQiwgMHgwMiwgMHgwMCwgMHg4MCwgMHg0QywgMHhGRSwgMHgwMSwgMHhBMSwgMHhGRiwKKwkgMHg4NywgMHg0RSwgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg2NywgMHg0QywgMHhGRiwgMHhGRiwgMHhCQywgMHhGRiwKKwkgMHgwMCwgMHhFMSwgMHhENSwgMHhGRSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0NiwgMHg2MCwgMHg0MSwgMHhCNSwgMHhGRiwKKwkgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHgyOSwgMHhGNSwgMHgzRiwgMHhGMCwgMHgyNCwgMHhGMiwgMHg0NCwgMHg0MywgMHg0MCwgMHg0NCwgMHgwMCwgMHhGNCwKKwkgMHhGMywgMHg2MCwgMHhBMCwgMHg2NSwgMHgxMCwgMHg2MiwgMHg1QSwgMHhEMiwgMHhEOSwgMHg4MSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQiwgMHgwMiwKKwkgMHg2MSwgMHg0NSwgMHgyNCwgMHg0NCwgMHhENCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhGRCwgMHhBNSwgMHg0OCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhDNCwgMHg5RCwgMHgwRCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgyNCwgMHg0NCwgMHhDMCwgMHg4MywgMHhCQiwgMHhGRiwgMHgyOSwgMHhGNSwKKwkgMHgwMSwgMHhFMSwgMHgwMCwgMHhGNCwgMHg2QywgMHg2MSwgMHgxMCwgMHg2MiwgMHgwNSwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MSwgMHgwNCwgMHg2MiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxMCwgMHgxQSwgMHgwMCwgMHgyNiwgMHg0NCwgMHgwMSwgMHgyNiwKKwkgMHgwQywgMHgwMCwgMHgyNCwgMHg0NCwgMHhDOCwgMHg4NCwgMHg0MCwgMHg0NCwgMHgwMiwgMHgwMywgMHg2QywgMHg0NSwgMHhGMywgMHgwMSwgMHgwMywgMHgxNSwKKwkgMHgwMSwgMHg2NCwgMHgwNSwgMHhGQSwgMHgxNSwgMHgwMCwgMHg2QywgMHg0NSwgMHhFRCwgMHgwMSwgMHgyMywgMHg0NCwgMHhDOCwgMHg4NCwgMHg0MCwgMHg0MywKKwkgMHgwMiwgMHgwMywgMHg2QywgMHg0NSwgMHhFNywgMHgwMSwgMHgwMCwgMHg2NCwgMHgwMSwgMHgxNSwgMHgwMSwgMHg2NCwgMHg2QywgMHg0NSwgMHgwNSwgMHhGQiwKKwkgMHhFMiwgMHhEMiwgMHhEQSwgMHg4MiwgMHhDOSwgMHg4MSwgMHg2MCwgMHg0QywgMHhERCwgMHgxQywgMHhENywgMHgwMywgMHhCQywgMHhGRiwgMHhEQSwgMHgwMSwKKwkgMHgwMCwgMHhFMSwgMHhENSwgMHhGRSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwOCwgMHhFMSwgMHhBMSwgMHhGRiwgMHg2NywgMHg0QywgMHg0MywgMHhGRiwKKwkgMHhBRCwgMHg0RiwgMHgwMiwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RCwgMHgwMSwgMHhFMSwgMHgwMSwgMHg2MCwgMHg2OSwgMHg2QiwgMHhBNSwgMHg2MCwKKwkgMHhDNCwgMHg2NCwgMHg2MCwgMHg0QywgMHhCQiwgMHhGRiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0QywgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0QywgMHhGQywgMHgwMSwgMHgyOSwgMHhGMywgMHgyQSwgMHhGMSwgMHgwNywgMHhCNSwgMHgwNCwgMHhFMSwgMHg2NSwgMHg0MSwgMHg2NCwgMHg1NCwKKwkgMHhDRCwgMHhFMiwgMHg5NSwgMHg4MSwgMHhBMSwgMHg1RCwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOSwgMHgwMSwgMHg2MSwgMHg0NCwgMHhGRSwgMHhGQiwKKwkgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMSwgMHg3RiwgMHg2NywgMHgwMSwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhCMSwgMHhGRSwgMHgwOCwgMHgwNSwKKwkgMHhCMCwgMHhGRSwgMHgwOSwgMHgwNSwgMHhCMiwgMHhGRSwgMHhCMywgMHhGRSwgMHg3OCwgMHg0MywgMHgwMSwgMHg2MSwgMHgyNCwgMHg2MCwgMHhERCwgMHg3OCwKKwkgMHgyRCwgMHg2MCwgMHg1RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHhGMywgMHgyOSwgMHhGMSwgMHg0MCwgMHg0NCwgMHg0NCwgMHg0NSwgMHgyQSwgMHhGMSwKKwkgMHgyQiwgMHhGMSwgMHg0NCwgMHg0NiwgMHg0NCwgMHg0NywgMHgzRiwgMHhCNCwgMHhFMCwgMHg4NSwgMHgxRiwgMHg2MCwgMHg4OCwgMHg2NCwgMHg0NCwgMHhENywKKwkgMHg1OCwgMHg0MywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHgxQywgMHg2MCwgMHhCNCwgMHg3QywgMHhBNCwgMHhEMywgMHg2MSwgMHg0MywgMHgwNCwgMHhCNCwKKwkgMHgyNCwgMHg0NCwgMHgwMiwgMHgwMywgMHgxMywgMHhGRiwgMHgwNiwgMHgwMCwgMHgzRiwgMHhCNCwgMHhCNCwgMHg4NCwgMHhGRiwgMHgyNywgMHgwNSwgMHhGRCwKKwkgMHgwNCwgMHhGQiwgMHgxMCwgMHg3NSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NiwgMHgzRSwgMHhCNCwgMHhGRSwgMHgwQiwgMHgwNSwgMHhCNSwgMHhGRSwKKwkgMHgwMiwgMHgyNCwgMHhBMSwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCNywgMHhGRSwgMHgwNywgMHgwNSwgMHg3OCwgMHg0MywgMHgwMSwgMHg2MSwKKwkgMHgyNCwgMHg2MCwgMHhERCwgMHg3OCwgMHgyRCwgMHg2MCwgMHg5OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNiwgMHg0NCwgMHgwMCwgMHg3RiwgMHhGMiwgMHhBMCwKKwkgMHg2MCwgMHg0NSwgMHgwNSwgMHgwNSwgMHgyMCwgMHg2MCwgMHgxNiwgMHg2NCwgMHg0NCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3OCwgMHg0MywKKwkgMHgwMSwgMHg2MSwgMHgyNCwgMHg2MCwgMHhERCwgMHg3OCwgMHg3OCwgMHg0MywgMHgwMSwgMHg2MSwgMHgyNCwgMHg2MCwgMHhERCwgMHg3OCwgMHg3RiwgMHg2MCwKKwkgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgxMCwgMHgwMiwgMHgxMCwgMHg2NCwgMHg0MCwgMHg0MCwKKwkgMHgwMiwgMHg2NCwgMHg0MCwgMHg1MCwgMHg2MSwgMHhGRiwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgwNCwgMHgwMCwgMHgxMCwgMHhFMCwgMHg0NiwgMHg2MCwKKwkgMHgwOSwgMHhFMCwgMHgwMCwgMHgwMCwgMHgyNywgMHhGMSwgMHgwMCwgMHg2NiwgMHgyMCwgMHg3OCwgMHg0MiwgMHhGRSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHg3RiwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgxQSwgMHgwMiwgMHgxQywgMHg2MCwKKwkgMHhCNCwgMHg2MywgMHhBMywgMHhEMywgMHgwNywgMHg3QywgMHgyMCwgMHhCNSwgMHgwQywgMHhCNSwgMHgwNCwgMHgwMywgMHgwMywgMHgwMiwgMHhEQywgMHhGOSwKKwkgMHgwMCwgMHg2NywgMHgwRiwgMHgwMCwgMHgwMCwgMHg2MSwgMHg0MSwgMHg1NiwgMHhDNywgMHhGRSwgMHhBQywgMHgwMSwgMHgzNiwgMHg0NywgMHhGRiwgMHgyMywKKwkgMHgwNCwgMHgwMCwgMHgwMCwgMHg3RiwgMHg2MCwgMHg0MSwgMHg3RiwgMHg2NywgMHgwNCwgMHgwMCwgMHgyMCwgMHg0NCwgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwKKwkgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RiwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywKKwkgMHgwMiwgMHg2MSwgMHgzMSwgMHgwMiwgMHgxQywgMHg2MCwgMHhCNCwgMHg2MywgMHhBMywgMHhEMywgMHgwMSwgMHg3QywgMHgyMCwgMHhCNSwgMHgwQywgMHhCNSwKKwkgMHgwMywgMHgwMywgMHgwMiwgMHgwMiwgMHhEQywgMHhGOSwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2MSwgMHg0MSwgMHg1NiwgMHhDNywgMHhGRSwgMHgyNSwgMHg2MCwKKwkgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5RiwgMHhGMSwgMHgyMCwgMHg0NCwgMHg2NCwgMHg0MCwgMHhGRiwgMHgyNiwgMHgxQiwgMHgwMCwgMHg3RiwgMHhCNCwKKwkgMHg0MCwgMHg0MCwgMHg1QywgMHg1RSwgMHg4MiwgMHhGRiwgMHgyNiwgMHg0NCwgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NiwgMHg1QywgMHg0MSwgMHg4NywgMHhGRiwKKwkgMHg2MiwgMHhGRiwgMHgwMCwgMHg2MywgMHgyNCwgMHg2MCwgMHg1RSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwKKwkgMHgwNCwgMHgwMywgMHgwOSwgMHhGMiwgMHgwRiwgMHhGQywgMHhBQywgMHg4NiwgMHhGQiwgMHgwMSwgMHgyNCwgMHg2MCwgMHg5RSwgMHg2MiwgMHgwNiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgyRCwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMCwgMHg0MCwgMHg4MCwgMHgyQSwKKwkgMHgwMiwgMHgwMCwgMHg3RiwgMHg2NywgMHgwNiwgMHg2MSwgMHg2MCwgMHg0NSwgMHgxQywgMHg2MCwgMHhCNCwgMHg3QywgMHhBNCwgMHhEMywgMHg2MSwgMHg0MywKKwkgMHgwNCwgMHhCNCwgMHgyNCwgMHg0NCwgMHgwMiwgMHgwMywgMHgxMywgMHhGRiwgMHg1NSwgMHgwMSwgMHgzRiwgMHhCNCwgMHhCNCwgMHg4NCwgMHhGRiwgMHgyNywKKwkgMHgwNSwgMHhGRCwgMHgwNCwgMHhGQiwgMHgyMCwgMHg0MCwgMHg4MCwgMHgyQSwgMHgwMiwgMHgwMCwgMHgxMCwgMHg3NSwgMHgwNywgMHgwMCwgMHgyRCwgMHg2MCwKKwkgMHg5QywgMHg2MiwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgxMCwgMHg3NSwgMHg0MywgMHgwMSwgMHgyNSwgMHg0NiwKKwkgMHgwMSwgMHhGMiwgMHgwOCwgMHhGMCwgMHg2MCwgMHg0NywgMHgwMywgMHhCNCwgMHgwMywgMHhBQywgMHg3RiwgMHg2NywgMHgwMywgMHg2MSwgMHgwOCwgMHgwMiwKKwkgMHgyNCwgMHg2MCwgMHg3QSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg0MCwgMHgwMSwgMHgyQiwgMHg0OSwgMHgwMCwgMHgyNSwgMHg0NCwgMHgxRiwgMHhCNCwgMHhFMCwgMHg4NSwKKwkgMHgyNSwgMHg2MCwgMHhFQiwgMHg2NCwgMHhDNCwgMHg5OCwgMHhGRiwgMHhGRiwgMHhDMCwgMHhGRSwgMHgzRCwgMHgwMCwgMHhDMSwgMHhGRSwgMHgzQiwgMHgwMCwKKwkgMHhDMiwgMHhGRSwgMHgzOSwgMHgwMCwgMHhDMywgMHhGRSwgMHgzNywgMHgwMCwgMHhDNCwgMHhGRSwgMHgzNSwgMHgwMCwgMHhDNSwgMHhGRSwgMHgzMywgMHgwMCwKKwkgMHhDNiwgMHhGRSwgMHgzMSwgMHgwMCwgMHhDNywgMHhGRSwgMHgyRiwgMHgwMCwgMHhDOCwgMHhGRSwgMHgyRCwgMHgwMCwgMHhDOSwgMHhGRSwgMHgyQiwgMHgwMCwKKwkgMHhDQSwgMHhGRSwgMHgyOSwgMHgwMCwgMHhDQiwgMHhGRSwgMHgyNywgMHgwMCwgMHhDQywgMHhGRSwgMHgyNSwgMHgwMCwgMHhDRCwgMHhGRSwgMHgyMywgMHgwMCwKKwkgMHhDRSwgMHhGRSwgMHgyMSwgMHgwMCwgMHhDRiwgMHhGRSwgMHgxRiwgMHgwMCwgMHhEMCwgMHhGRSwgMHgxRCwgMHgwMCwgMHhEMSwgMHhGRSwgMHgxQiwgMHgwMCwKKwkgMHhEMiwgMHhGRSwgMHgxOSwgMHgwMCwgMHhEMywgMHhGRSwgMHgxNywgMHgwMCwgMHhENCwgMHhGRSwgMHgxNSwgMHgwMCwgMHhENSwgMHhGRSwgMHgxMywgMHgwMCwKKwkgMHhENiwgMHhGRSwgMHgxMSwgMHgwMCwgMHhENywgMHhGRSwgMHgwRiwgMHgwMCwgMHhEOCwgMHhGRSwgMHgwRCwgMHgwMCwgMHhEOSwgMHhGRSwgMHgwQiwgMHgwMCwKKwkgMHhEQSwgMHhGRSwgMHgwOSwgMHgwMCwgMHhEQiwgMHhGRSwgMHgwNywgMHgwMCwgMHhEQywgMHhGRSwgMHgwNSwgMHgwMCwgMHhERCwgMHhGRSwgMHgwMywgMHgwMCwKKwkgMHhERSwgMHhGRSwgMHgwMSwgMHgwMCwgMHhERiwgMHhGRSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg5RiwgMHhGRSwKKwkgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5RSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5RCwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHg5QywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5QiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5QSwgMHhGRSwgMHhGMCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHg5OSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5OCwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5NywgMHhGRSwKKwkgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5NiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5NSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHg5NCwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5MywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5MiwgMHhGRSwgMHhGMCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHg5MSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5MCwgMHhGRSwgMHhGMCwgMHg4NCwgMHgwNiwgMHhGQiwgMHg4RiwgMHhGRSwKKwkgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4RSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4RCwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHg4QywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4QiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4QSwgMHhGRSwgMHhGMCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHg4OSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4OCwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4NywgMHhGRSwKKwkgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4NiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4NSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHg4NCwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4MywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGRSwgMHhGMCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHg4MSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4MCwgMHhGRSwgMHhGMCwgMHg4NCwgMHgwNSwgMHhGQiwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg1QywgMHg1QywgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg0MCwgMHgwMSwgMHgyNywKKwkgMHg1NSwgMHgwMCwgMHgwNSwgMHg2MCwgMHgwMCwgMHg2MywgMHgwNSwgMHhGRCwgMHgzMCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzMSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzMiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzMywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzNiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzOCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzOSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzQSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzQiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzQywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzRCwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzRSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzRiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgwMiwgMHg2MSwgMHg2MSwgMHg0NCwgMHgwMiwgMHgzNiwgMHg4MiwgMHhGRiwKKwkgMHgwMywgMHgzNiwgMHg4MywgMHhGRiwgMHgwNCwgMHgzNiwgMHg4NCwgMHhGRiwgMHgwNSwgMHgzNiwgMHg4NSwgMHhGRiwgMHgwNiwgMHgzNiwgMHg4NiwgMHhGRiwKKwkgMHgwNywgMHgzNiwgMHg4NywgMHhGRiwgMHgyMCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMiwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyMywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNiwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyNywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyQiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyRiwgMHg0NCwgMHhCRCwgMHhEQiwgMHhERCwgMHg4MSwgMHgwOCwgMHgzQSwgMHhEMCwgMHgwMSwgMHg1NCwgMHgwMCwgMHgyNywgMHg0MCwgMHgxMCwgMHgyNiwKKwkgMHgzMCwgMHgwMCwgMHgyNiwgMHg0NCwgMHgwMSwgMHgzNiwgMHgyRCwgMHgwMCwgMHgwMiwgMHgzNiwgMHg4MiwgMHhGRiwgMHgwMywgMHgzNiwgMHg4MywgMHhGRiwKKwkgMHgwNCwgMHgzNiwgMHg4NCwgMHhGRiwgMHgwNSwgMHgzNiwgMHg4NSwgMHhGRiwgMHgwNiwgMHgzNiwgMHg4NiwgMHhGRiwgMHgyNSwgMHg0NCwgMHgwMCwgMHgzNiwKKwkgMHg0NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHg0NCwgMHg0MSwgMHgwMiwgMHgzNiwgMHg0NCwgMHg0MiwgMHgwMywgMHgzNiwgMHg0NCwgMHg0MywgMHgwNCwgMHgzNiwKKwkgMHg0NCwgMHg0NCwgMHgwNSwgMHgzNiwgMHg0NCwgMHg0NSwgMHgwNiwgMHgzNiwgMHg0NCwgMHg0NiwgMHgwNywgMHgzNiwgMHg0NCwgMHg0NywgMHgwOCwgMHgzNiwKKwkgMHg0NCwgMHg0OCwgMHgwOSwgMHgzNiwgMHg0NCwgMHg0OSwgMHgwQSwgMHgzNiwgMHg0NCwgMHg0QSwgMHgwQiwgMHgzNiwgMHg0NCwgMHg0QiwgMHgwQywgMHgzNiwKKwkgMHg0NCwgMHg0QywgMHgwRCwgMHgzNiwgMHg0NCwgMHg0RCwgMHgwRSwgMHgzNiwgMHg0NCwgMHg0RSwgMHgwRiwgMHgzNiwgMHg0NCwgMHg0RiwgMHg4NywgMHhGRiwKKwkgMHgyMSwgMHgwMCwgMHgyNSwgMHg0NCwgMHgxMCwgMHgzNiwgMHg0NCwgMHg1MCwgMHgxMSwgMHgzNiwgMHg0NCwgMHg1MSwgMHgxMiwgMHgzNiwgMHg0NCwgMHg1MiwKKwkgMHgxMywgMHgzNiwgMHg0NCwgMHg1MywgMHgxNCwgMHgzNiwgMHg0NCwgMHg1NCwgMHgxNSwgMHgzNiwgMHg0NCwgMHg1NSwgMHgxNiwgMHgzNiwgMHg0NCwgMHg1NiwKKwkgMHgxNywgMHgzNiwgMHg0NCwgMHg1NywgMHgxOCwgMHgzNiwgMHg0NCwgMHg1OCwgMHgxOSwgMHgzNiwgMHg0NCwgMHg1OSwgMHgxQSwgMHgzNiwgMHg0NCwgMHg1QSwKKwkgMHgxQiwgMHgzNiwgMHg0NCwgMHg1QiwgMHgxQywgMHgzNiwgMHg0NCwgMHg1QywgMHgxRCwgMHgzNiwgMHg0NCwgMHg1RCwgMHgxRSwgMHgzNiwgMHg0NCwgMHg1RSwKKwkgMHgxRiwgMHgzNiwgMHg0NCwgMHg1RiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NiwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHg2RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMywgMHg2MSwgMHg3RiwgMHg2NywgMHgwQiwgMHgwMiwgMHgwMCwgMHhGMCwgMHgyNCwgMHg2MCwgMHg3QSwgMHg2MiwKKwkgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEOSwgMHgwQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwKKwkgMHgxMSwgMHgwMiwgMHgyNCwgMHg2MCwgMHg5RSwgMHg2MiwgMHgxQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwgMHg1MCwgMHg2MywgMHg1QSwgMHhERCwKKwkgMHgyNywgMHg2MCwgMHg2RSwgMHg2NCwgMHhBMSwgMHhGQiwgMHgyRCwgMHhGRiwgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMywKKwkgMHgwNSwgMHhGQiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwKKwkgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgwRiwgMHgwMiwgMHgyNCwgMHg2MCwgMHg5RSwgMHg2MiwgMHgxQywgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwKKwkgMHg1MCwgMHg2MywgMHg1QSwgMHhERCwgMHgyNywgMHg2MCwgMHg4OCwgMHg2NCwgMHhBMSwgMHhGQiwgMHgyRCwgMHhGRiwgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RiwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwKKwkgMHgwMiwgMHg2MSwgMHgzRSwgMHgwMiwgMHgyNSwgMHg0NSwgMHgyMCwgMHg0NCwgMHg4MCwgMHgyQSwgMHgzQSwgMHgwMCwgMHhGMSwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwQiwgMHgwMywgMHhGMSwgMHg2MCwgMHgwMSwgMHg2NCwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMywKKwkgMHhGMSwgMHg2MCwgMHgwMiwgMHg2NCwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMywgMHgyOSwgMHgwMCwgMHgyRCwgMHg2MCwgMHgwRSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHhCQSwgMHhGMywgMHgxRiwgMHg2MCwgMHg4MiwgMHg2MSwgMHhBMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHgyNSwgMHg0NSwgMHgyMywgMHg2MCwKKwkgMHhFNCwgMHg2MywgMHgwMiwgMHg2MSwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHhENCwgMHg4MCwgMHhCRCwgMHhEMywgMHhCRCwgMHhENSwgMHhDRCwgMHg4MSwKKwkgMHgwMiwgMHgwMywgMHgxNSwgMHgwMywgMHhGNywgMHgwMSwgMHhBMiwgMHhGRiwgMHhBNiwgMHhEMywgMHg0MCwgMHg0QywgMHgwMCwgMHhBOCwgMHg2NywgMHg0MywKKwkgMHgwQywgMHgwMiwgMHhBMiwgMHhERCwgMHg0MiwgMHg0OCwgMHg2NCwgMHg0MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2NiwgMHg0NCwgMHgyOCwgMHhEQiwgMHgwMiwgMHgwMywgMHgyQywgMHg1OCwgMHhBMywgMHhGRiwgMHgwQywgMHg2MSwgMHgwMywgMHgwMCwgMHgwNCwgMHg2MSwKKwkgMHg3RiwgMHg2NywgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRCwgMHg2MCwgMHgwRSwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHhCQSwgMHhGMywgMHgxRiwgMHg2MCwgMHg4MiwgMHg2MSwgMHhBMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwgMHg4NiwgMHg2MSwgMHgwMSwgMHg2NCwKKwkgMHhBMSwgMHhEQiwgMHhGRiwgMHhGRiwgMHhDNCwgMHhGRSwgMHhFRSwgMHgwMSwgMHhDNiwgMHhGRSwgMHhFQywgMHgwMSwgMHg3RSwgMHg2MCwgMHhDMCwgMHg2NCwKKwkgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHgwMiwgMHg2MSwgMHgzRiwgMHgwMiwgMHgyNSwgMHg0NSwgMHhGOCwgMHgyQiwgMHgzQiwgMHgwMCwgMHgyRSwgMHhGNSwKKwkgMHg2NywgMHg0NCwgMHhENCwgMHg4MCwgMHgyMCwgMHg2MCwgMHgyNCwgMHg2MywgMHgzOSwgMHgwMywgMHg2MCwgMHg2MSwgMHgyNCwgMHg0NCwgMHgwMSwgMHgyNywKKwkgMHgyOSwgMHgwMCwgMHhBMywgMHhGQywgMHhBNCwgMHhGOCwgMHhCRCwgMHhEMywgMHhBMywgMHhEMSwgMHhENCwgMHg4MCwgMHhDRCwgMHg4MSwgMHgwOCwgMHgyNCwKKwkgMHg2NCwgMHg1OCwgMHgwOCwgMHhBMywgMHhGOCwgMHgwMiwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2MywgMHhCRCwgMHhEMywgMHhBMywgMHhEMSwgMHhGRSwgMHhBMCwKKwkgMHhGQSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwgMHgxNCwgMHgwMiwgMHgxMywgMHgwMiwgMHgwNCwgMHhBMywgMHhCRSwgMHhEMywgMHhCRCwgMHhEMSwKKwkgMHgwRiwgMHgxOCwgMHhENCwgMHg4MCwgMHgwRCwgMHgxOCwgMHgwMywgMHgwMywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhGNywgMHgwMSwgMHg2NCwgMHg0MSwKKwkgMHhERCwgMHg4MSwgMHhFMSwgMHg4MSwgMHhDQiwgMHg4MywgMHg0NiwgMHg2NSwgMHgyRiwgMHg2MCwgMHg1OCwgMHg0RiwgMHgwMSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2NywgMHgwQSwgMHgwMCwgMHhCRCwgMHhEMywgMHhCRSwgMHhEMSwgMHhENCwgMHg4MCwgMHhDRCwgMHg4MSwgMHgwOCwgMHgyNCwgMHg2NCwgMHg1OCwKKwkgMHgwOCwgMHhBMywgMHhGOCwgMHgwMiwgMHgwNCwgMHg2MSwgMHg3RiwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2NCwgMHgyMywgMHhGQSwKKwkgMHg2NywgMHg0NCwgMHgyNCwgMHhGQSwgMHg2MiwgMHg0MSwgMHgzQywgMHg2MCwgMHgwMCwgMHg2NSwgMHgxQSwgMHg2MywgMHg2OCwgMHg2MCwgMHgyOCwgMHg2NCwKKwkgMHg2NSwgMHg0NiwgMHg1OCwgMHhEMCwgMHgyRSwgMHhGNSwgMHg1OSwgMHhEOCwgMHhGQiwgMHgxRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhDQiwgMHg4MywgMHhCRiwgMHhEMSwgMHg0QSwgMHg2NSwgMHg2NCwgMHg0MywgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwMSwgMHgyNiwKKwkgMHhEQywgMHg4MSwgMHhFOSwgMHg4NCwgMHhEQywgMHg4NCwgMHgyMywgMHhGQSwgMHgwOSwgMHgwMCwgMHg0QiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwKKwkgMHhFOCwgMHg4NCwgMHhEQywgMHg4NCwgMHgyMywgMHhGQSwgMHhCRiwgMHhEMSwgMHg0QSwgMHg2NSwgMHg2NCwgMHg0MywgMHgyRiwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHgwMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhFMCwgMHhBMCwKKwkgMHgyMCwgMHg2NCwgMHgwMSwgMHgwNiwgMHgyNSwgMHhGQSwgMHgyMywgMHhGMiwgMHhERiwgMHhEMSwgMHhDQywgMHg4NCwgMHhFMCwgMHg4NSwgMHgwQiwgMHgwNiwKKwkgMHhCRiwgMHhEMSwgMHg2NCwgMHg0MSwgMHhENSwgMHg4MCwgMHg2NCwgMHg0MywgMHgwMSwgMHgwNiwgMHg2NSwgMHg0MSwgMHg0QSwgMHg2NSwgMHgyOSwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHg4MywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhEQywgMHhGMywgMHgwMiwgMHg2MywKKwkgMHgyMywgMHhGQywgMHgwNywgMHhCNCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg0QiwgMHhEMywgMHhCRiwgMHhEMywKKwkgMHg2MCwgMHg0MSwgMHhDOSwgMHg4MywgMHhFOSwgMHg4MSwgMHhERCwgMHg4MSwgMHhBMywgMHhGQSwgMHhFMCwgMHg4MSwgMHgzQywgMHg2MCwgMHgwMCwgMHg2NywKKwkgMHgwMiwgMHgyNCwgMHgwMiwgMHhBNCwgMHg2MCwgMHg0NywgMHg0MCwgMHg0QiwgMHhDOSwgMHg4MSwgMHg0QSwgMHg2NSwgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwKKwkgMHhBQiwgMHg0NiwgMHhBNSwgMHhEOCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhGNiwgMHgxRiwKKwkgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhGQywgMHhBMywgMHhBMywgMHhEMSwgMHg0QywgMHg2NSwgMHhBNCwgMHhEMywgMHhEQSwgMHg4MywKKwkgMHg2MCwgMHg0NywgMHgyNSwgMHhGQSwgMHgwMCwgMHg3RSwgMHg2MCwgMHg0NywgMHgwMSwgMHgyNiwgMHhEQywgMHg4NCwgMHg2MCwgMHg0MSwgMHhFOCwgMHg4NCwKKwkgMHhEOCwgMHg4NCwgMHgyMywgMHhGQSwgMHhBQiwgMHgwMSwgMHhGQywgMHhBMywgMHhBMywgMHhEMSwgMHg0QywgMHg2NSwgMHhBNCwgMHhEMywgMHhEQSwgMHg4MywKKwkgMHgwMCwgMHg3RiwgMHgyNSwgMHhGQSwgMHg2MCwgMHg0MSwgMHgwMSwgMHgyNiwgMHhERCwgMHg4MSwgMHhFOSwgMHg4NCwgMHhEOCwgMHg4NCwgMHgyMywgMHhGQSwKKwkgMHg5RCwgMHgwMSwgMHgyOCwgMHg2MCwgMHhFMiwgMHg2MywgMHhCRiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHhFOCwgMHg4NCwgMHhEQywgMHg4NCwKKwkgMHgyMywgMHhGQSwgMHg0QSwgMHg2NSwgMHgyRiwgMHg2MCwgMHg1OCwgMHg0RiwgMHgwMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyOCwgMHg2MCwgMHhFMiwgMHg2MywgMHgyMywgMHhGMiwgMHhDMCwgMHg2NSwgMHhDQywgMHg4NCwgMHhFMCwgMHg4MSwgMHgwQSwgMHgwNCwKKwkgMHhCRiwgMHhEQiwgMHhENSwgMHg4MCwgMHgwNywgMHgwMywgMHgwMSwgMHgwNiwgMHg2NSwgMHg0MSwgMHg2MSwgMHg0NCwgMHhCRiwgMHhEQiwgMHg0QSwgMHg2NSwKKwkgMHg1OCwgMHg0RiwgMHhBQSwgMHgwMCwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMywgMHg0RSwgMHgyOCwgMHg2MCwgMHg1OCwgMHg0MywKKwkgMHg1QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOSwgMHg2MCwgMHhDNiwgMHg2MSwgMHgyOSwgMHg2MCwgMHhBNCwgMHg2MiwgMHhBMiwgMHhEMywgMHhBMSwgMHhEQiwKKwkgMHhDQywgMHg4NCwgMHhBOCwgMHg4MywgMHgwNSwgMHgwNCwgMHgyOSwgMHg2MCwgMHhBNCwgMHg2NCwgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwKKwkgMHgwRSwgMHg0MywgMHg4MSwgMHgwMSwgMHgyMywgMHhGMiwgMHgxQywgMHg2MCwgMHg4RSwgMHg2NSwgMHg2MCwgMHg0MSwgMHgxQywgMHg2MCwgMHgyQSwgMHg2MywKKwkgMHhBMywgMHhEQiwgMHhGRiwgMHhBMSwgMHg0OCwgMHg2NCwgMHg1OCwgMHhEMCwgMHg3RSwgMHhBOCwgMHg1QiwgMHhEOSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwKKwkgMHgwMiwgMHg2NCwgMHhGRiwgMHhBMSwgMHhENywgMHg4MCwgMHgwMiwgMHgwMywgMHgwMSwgMHgwMywgMHhGNSwgMHgwMSwgMHgyRSwgMHhGNSwgMHgwMCwgMHg2MCwKKwkgMHgyRiwgMHg2NSwgMHgyNSwgMHhGMiwgMHgwMCwgMHg2MywgMHhDQywgMHg4NCwgMHgwMywgMHhBMywgMHhGRCwgMHgwNSwgMHg0QSwgMHg2NCwgMHhENywgMHg4MCwKKwkgMHgxQiwgMHg2MCwgMHhDNiwgMHg2MSwgMHgyRiwgMHgwNSwgMHhBMSwgMHhERCwgMHhFMywgMHg4MywgMHhGRSwgMHhBMywgMHg1OCwgMHhEMCwgMHg3RSwgMHhBOCwKKwkgMHg1OSwgMHhEOSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2NCwgMHhGOSwgMHgxRiwgMHgwMCwgMHg2MywgMHg1OSwgMHhERCwgMHgyRSwgMHhGNSwKKwkgMHgxQiwgMHg2MCwgMHhDNiwgMHg2NCwgMHgyNSwgMHhGMCwgMHhBMCwgMHhEMywgMHhEMywgMHg4MCwgMHgwMSwgMHhCMCwgMHgwNCwgMHgwMywgMHgwMSwgMHhBNCwKKwkgMHgwMywgMHgwMywgMHhBMiwgMHhEQiwgMHgwMSwgMHgwMCwgMHhBMiwgMHhERCwgMHgxQiwgMHg2MCwgMHhDRSwgMHg2MywgMHgxMCwgMHg2MCwgMHg1QSwgMHg2NSwKKwkgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4MiwgMHgxMCwgMHg2MCwgMHg3QSwgMHg2NSwgMHgwNywgMHg2NCwgMHg2NCwgMHg0MSwKKwkgMHg1QSwgMHhEQiwgMHhENiwgMHg4MCwgMHhDRCwgMHg4MSwgMHgwNiwgMHgwMywgMHhGQiwgMHgwMiwgMHgyNSwgMHhGMiwgMHgwMiwgMHhBMywgMHhDQywgMHg4NCwKKwkgMHhBMiwgMHhEQSwgMHhFQywgMHgwMiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHgyQSwgMHg2MSwgMHhBMSwgMHhEMywKKwkgMHgyMywgMHhGQSwgMHhFMCwgMHg4MywgMHg0QSwgMHg2NSwgMHgwNCwgMHgwMiwgMHgwMiwgMHg2MywgMHgyMywgMHhGQywgMHhBNSwgMHhGQywgMHgwOSwgMHgwMCwKKwkgMHhEQiwgMHg4MywgMHg1OSwgMHhEMSwgMHhBNSwgMHhEOCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwKKwkgMHhGOCwgMHgxRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhDNiwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMCwgMHg2MSwKKwkgMHgwMiwgMHhBNCwgMHhGRSwgMHhBMCwgMHgyMywgMHhGQSwgMHgxQiwgMHgwMywgMHhGQSwgMHhBNCwgMHhGRCwgMHhBNCwgMHgwMSwgMHhBMSwgMHhGRCwgMHgwNywKKwkgMHg2MSwgMHg0MywgMHgyMywgMHhGMiwgMHgyNSwgMHhGQywgMHhFMCwgMHg4MywgMHgwMiwgMHhBMywgMHgxQiwgMHg2MCwgMHhDNiwgMHg2MSwgMHgwMCwgMHg2MCwKKwkgMHg0QSwgMHg2NCwgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOCwgMHg3RSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2NCwgMHhGOSwgMHgxRiwKKwkgMHgyNSwgMHhGMiwgMHgyMywgMHhGMiwgMHgwMSwgMHhCMCwgMHhDQywgMHg4NCwgMHgwNCwgMHgwMiwgMHgyMywgMHhGQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MSwgMHg0QiwgMHg2NSwgMHg0MiwgMHg4MCwgMHg2NCwgMHhENCwgMHg4NSwKKwkgMHgyQiwgMHg0MSwgMHgwMCwgMHhBMSwgMHg1NSwgMHg4QiwgMHgwRCwgMHgwMywgMHgwMiwgMHgwNCwgMHg2NSwgMHg0MSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHg0MCwgMHg0QiwgMHhDQSwgMHg4NCwgMHg1OCwgMHhEMCwgMHhDOSwgMHg4MSwgMHhCRCwgMHhEOSwgMHhGQywgMHgwMiwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwKKwkgMHhFQywgMHgwMSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhGQywgMHhBMywgMHhBMywgMHhEMywgMHgwMiwgMHg3QywgMHhBMCwgMHhEMywgMHgyMywgMHhGOCwKKwkgMHhEQywgMHg4NCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHgwMSwgMHg2NCwKKwkgMHg5RCwgMHhGRSwgMHgwMiwgMHgyOCwgMHgwMiwgMHg2NCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRCwgMHg2MCwKKwkgMHgxQSwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMiwgMHg3QywgMHgyMywgMHhGOCwgMHgwMSwgMHhCNCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhGQywgMHhBMywgMHhBMywgMHhEMSwgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHhBNCwgMHhEMywgMHgwMCwgMHg2MywgMHg2MCwgMHg0MCwKKwkgMHgwQSwgMHgzNywgMHgwMSwgMHg2MywgMHgxNCwgMHgzNywgMHgwMiwgMHg2MywgMHgzNywgMHgzNywgMHgwNiwgMHg2MywgMHg2RSwgMHgzNywgMHgwQiwgMHg2MywKKwkgMHgyNSwgMHhGQywgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHg4OCwgMHhGRiwgMHg3NSwgMHg0NCwKKwkgMHg4RCwgMHhGRiwgMHhFOCwgMHg4NywgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgwMywgMHhCNCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHg2NCwgMHgyMywgMHhGQSwgMHg4NiwgMHhGRiwgMHgyOSwgMHg0NCwgMHg4NywgMHhGRiwgMHgyNSwgMHhGQSwgMHg1NSwgMHhGMywKKwkgMHg1MiwgMHhGMSwgMHg4MCwgMHg2NSwgMHhDNCwgMHg4NywgMHgwMCwgMHg3RiwgMHgyNiwgMHhGQSwgMHg2NCwgMHg0NCwgMHhDNCwgMHg4NywgMHgwMCwgMHg3RiwKKwkgMHgyNywgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwNSwgMHg2NCwgMHgyMywgMHhGQSwgMHg1MiwgMHg2MywgMHhCNywgMHhGMywKKwkgMHg0QiwgMHhEQSwgMHhCNiwgMHhGMywgMHg0QiwgMHhEQSwgMHhCNSwgMHhGMywgMHg0QiwgMHhEQSwgMHg2MCwgMHg0MSwgMHg4OCwgMHhGRiwgMHg3MiwgMHg1QywKKwkgMHg4OSwgMHhGRiwgMHg0QSwgMHhEOCwgMHhBMiwgMHg0OCwgMHgyMCwgMHgyMywgMHgwRSwgMHgwMCwgMHg2NCwgMHg0MCwgMHg4MCwgMHgyNywgMHgxNSwgMHgwMCwKKwkgMHhEQywgMHg4NCwgMHhCRCwgMHhEQSwgMHhCRCwgMHhEMiwgMHgxMSwgMHgwNCwgMHhEQywgMHg4NCwgMHhBMiwgMHhEQSwgMHhBMywgMHhEMiwgMHgwRCwgMHgwNCwKKwkgMHhEQywgMHg4NCwgMHhBMywgMHhEQSwgMHgwQSwgMHgwMCwgMHg1MiwgMHg2MywgMHhCNywgMHhGMywgMHg0QiwgMHhEQSwgMHhCNiwgMHhGMywgMHg0QiwgMHhEQSwKKwkgMHhCNSwgMHhGMywgMHg0QiwgMHhEQSwgMHg1NCwgMHg5MCwgMHg0QywgMHg2MywgMHhFMCwgMHgwMiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyNSwgMHhGMCwgMHgyRCwgMHg2MCwgMHgxNiwgMHg2NSwgMHgyMywgMHhGMiwgMHhBNSwgMHhEOSwgMHgwMiwgMHhBOCwgMHg2NCwgMHg0NCwgMHgwNywgMHgwMiwKKwkgMHgwMCwgMHhCQywgMHhGMiwgMHhBNCwgMHgwNCwgMHgwMywgMHgwMywgMHgwNywgMHgyOCwgMHg2MCwgMHg0NCwgMHg2MiwgMHhBMiwgMHhEOSwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg2MywgMHgyOCwgMHg2MCwgMHhBNCwgMHg2MSwgMHg0OCwgMHg2NCwgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwKKwkgMHhGRCwgMHgxRiwgMHgyNSwgMHhGMCwgMHgyMCwgMHg2NCwgMHhEMCwgMHg4MSwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNywgMHgyNSwgMHhGQSwgMHgwRiwgMHgwMCwKKwkgMHgyOCwgMHg2MCwgMHhBOCwgMHg2MywgMHhDMywgMHg4MywgMHgwMSwgMHgyQSwgMHgwNiwgMHgwMCwgMHhDRiwgMHg4MywgMHhBMywgMHhEMywgMHhDRCwgMHg4MSwKKwkgMHgwMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHgwNCwgMHgwMywgMHgwMCwgMHg2NCwgMHhDOSwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGRCwgMHgwMiwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwgMHgyNSwgMHhGMCwgMHgwMiwgMHhBOCwgMHgwMSwgMHg2MCwgMHhBNiwgMHg2MiwgMHgwOSwgMHgwMiwKKwkgMHhBMiwgMHhEOSwgMHg2NCwgMHg0MSwgMHgzMiwgMHg0NCwgMHgwMiwgMHhCNSwgMHgwMCwgMHhCOSwgMHhENCwgMHg4NCwgMHgwOCwgMHgyOCwgMHgwMiwgMHhCQywKKwkgMHg0MCwgMHg1MiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwgMHgyNSwgMHhGMCwgMHgwMiwgMHhBOCwgMHgwMSwgMHg2MCwKKwkgMHhCMiwgMHg2MiwgMHgwQywgMHgwMiwgMHhBMiwgMHhEOSwgMHg2NCwgMHg0MSwgMHgzMiwgMHg0NCwgMHg0MCwgMHhCNSwgMHgwMCwgMHhCOSwgMHhENCwgMHg4NCwKKwkgMHgwOCwgMHgyNCwgMHgwMywgMHgwMCwgMHg0MCwgMHhCQywgMHgwMiwgMHhCNSwgMHhENCwgMHg4NCwgMHg0MCwgMHg1MiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwgMHgyNSwgMHhGMCwgMHgwMSwgMHg2MCwgMHhCMCwgMHg2MywgMHhBMywgMHhEOSwgMHhBOSwgMHhGMSwgMHgyMCwgMHg2MSwKKwkgMHg0MSwgMHg0QiwgMHg2NCwgMHg0MywgMHhEOCwgMHhGMywgMHg2MywgMHg0NSwgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwgMHg4QywgMHhGQSwgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgzNiwgMHgwNiwgMHgwMCwgMHgwMiwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwNSwgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHgwMCwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMSwgMHg2NCwgMHg2RiwgMHhGQSwgMHg3OSwgMHhGMywgMHg3QSwgMHhGMSwgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwKKwkgMHg2NSwgMHg0MywgMHgwMiwgMHgwMiwgMHg3OSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwRiwgMHg2MCwgMHhBRSwgMHg2NSwgMHhEOCwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMiwgMHhFOCwgMHg4NCwKKwkgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3QiwgMHhGQiwgMHg2RiwgMHhGMCwgMHg2MCwgMHg0NywgMHg5MCwgMHg4NCwKKwkgMHg2RiwgMHhGQSwgMHg2MCwgMHg0NywgMHg2MCwgMHg0NSwgMHg4MCwgMHg2NCwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywKKwkgMHhBNCwgMHg4NCwgMHg3MCwgMHhGMCwgMHg3MCwgMHhGQSwgMHgwMCwgMHg2MSwgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNSwgMHhERCwgMHg4MSwKKwkgMHhGQiwgMHgwMSwgMHhFMSwgMHg4MSwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHg2NiwgMHg0MywgMHgwQywgMHhGNCwKKwkgMHgyQiwgMHg0MSwgMHg0RCwgMHg4QiwgMHgwMiwgMHhBMywgMHhCNiwgMHgwMiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwKKwkgMHgyNSwgMHhGMCwgMHgwMiwgMHhBOCwgMHgwMCwgMHg2NywgMHgwMiwgMHgwMiwgMHgyRCwgMHhGOSwgMHgyQywgMHhGOSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyOCwgMHg2MCwgMHg0MiwgMHg2MSwgMHgyMywgMHhGMiwgMHgyNSwgMHhGMiwgMHgwMiwgMHhBOCwgMHgwMCwgMHhBOCwgMHgwOSwgMHgwMiwgMHgwNywgMHgwMywKKwkgMHhEMCwgMHhBMCwgMHgzMCwgMHg2NSwgMHgwMywgMHgwNCwgMHhBNywgMHhBMCwgMHg1OSwgMHg2NSwgMHgwMSwgMHgwNiwgMHg2NSwgMHg0NCwgMHhBMSwgMHhEQiwKKwkgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgzMSwgMHg2MCwgMHgyQywgMHg2MSwgMHgwMSwgMHg2NCwgMHhBMSwgMHhEQiwgMHgwNCwgMHgwMCwKKwkgMHgzMSwgMHg2MCwgMHgyQywgMHg2MSwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHg3RSwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwKKwkgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgwRSwgMHgwMiwgMHgwNiwgMHg2MSwgMHg0MSwgMHg1NiwgMHhDNywgMHhGRSwgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgzNiwgMHg0NywgMHhGRiwgMHgyMywgMHgwNCwgMHgwMCwgMHgwMCwgMHg3RiwgMHg2MCwgMHg0MSwgMHg3RiwgMHg2NywgMHgwMSwgMHgwMCwKKwkgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RSwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywKKwkgMHgwMiwgMHg2MSwgMHgxMiwgMHgwMiwgMHgyRCwgMHg2MCwgMHg1OCwgMHg2MSwgMHg2NSwgMHg0MywgMHhBMSwgMHhERCwgMHgwQywgMHg2MSwgMHg0MSwgMHg1NiwKKwkgMHhDNywgMHhGRSwgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNiwgMHg0NywgMHhGRiwgMHgyMywgMHgwNCwgMHgwMCwgMHgwMCwgMHg3RiwKKwkgMHg2MCwgMHg0MSwgMHg3RiwgMHg2NywgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHhGMCwgMHgyOSwgMHg2MCwKKwkgMHhBMiwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxOSwgMHgwMCwgMHgyRCwgMHg2MCwgMHgxQSwgMHg2NCwgMHhBMCwgMHhEMSwgMHhBMCwgMHhGOSwgMHgwQywgMHg2MCwKKwkgMHgzOCwgMHg2MiwgMHg0MCwgMHg2MywgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRSwgMHgxRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwQywgMHgwMCwKKwkgMHgwNCwgMHg2NSwgMHgwQywgMHg2MCwgMHgzOCwgMHg2MSwgMHg0OCwgMHg2NCwgMHgzRSwgMHg2MywgMHg3QywgMHhBOCwgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwKKwkgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2NCwgMHhGOSwgMHgxRiwgMHgyOSwgMHg2MCwgMHhBMiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwRCwgMHg2MCwKKwkgMHgxQywgMHg2NSwgMHgwMiwgMHhGRSwgMHg2NCwgMHg0NCwgMHhGOCwgMHg4NCwgMHhGOCwgMHg4NCwgMHhGOCwgMHg4NywgMHg2MCwgMHg0MSwgMHg2NCwgMHg0NCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwgMHgzRSwgMHhGQiwgMHg2MCwgMHg0MiwgMHg2MSwgMHg0NCwgMHgwMywgMHhBMiwgMHg2MCwgMHhGRSwKKwkgMHhBMiwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHg2NCwgMHg0NCwgMHgwQywgMHg2MCwgMHgzQSwgMHg2NSwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwgMHg0MCwgMHhGQiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgwMCwgMHg2MSwgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyRCwgMHg2MCwgMHgxQSwgMHg2NCwgMHhBMCwgMHhEMSwgMHhBMCwgMHhGOSwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0MSwgMHg2NCwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHhBNCwgMHgwMCwgMHg0QSwgMHg2NCwgMHhBMCwgMHhEMiwgMHhGRiwgMHhGRiwgMHg0MCwgMHg0MiwgMHg4MCwgMHgyQiwgMHgwNCwgMHgwMCwKKwkgMHhGRiwgMHhCNCwgMHg0MCwgMHg0MiwgMHgwMSwgMHg2NCwgMHg0MCwgMHg0MSwgMHhBOSwgMHhGMywgMHg0NiwgMHg0QiwgMHg2MCwgMHg0NiwgMHgyMCwgMHg2MywKKwkgMHhFMywgMHg4MywgMHhBQiwgMHg0NiwgMHgyNiwgMHhGMCwgMHhBQiwgMHg0NiwgMHg1NSwgMHhGOCwgMHhBQiwgMHg0NiwgMHgyNywgMHhGMCwgMHhBQiwgMHg0NiwKKwkgMHg1NiwgMHhGOCwgMHhBQiwgMHg0NiwgMHgyOCwgMHhGMCwgMHhBQiwgMHg0NiwgMHg1NywgMHhGOCwgMHg2NiwgMHg0NCwgMHgwMiwgMHhBNiwgMHhGMSwgMHgxRiwKKwkgMHhBOSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwgMHhBQiwgMHg0NiwgMHgwQywgMHg2MCwgMHg3QSwgMHg2NSwgMHgyMiwgMHg0NCwgMHhGRiwgMHhCNCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4MSwgMHhDOSwgMHg4MSwgMHg1MiwgMHg2NCwgMHgwRSwgMHg2MywKKwkgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyMSwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwOCwgMHgwMCwgMHhBQiwgMHg0NiwgMHhGMCwgMHhBMSwKKwkgMHg2RSwgMHg2NCwgMHgwRSwgMHg2MywgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOCwgMHhGRCwgMHgxRiwgMHhBQiwgMHg0NiwgMHgyMiwgMHg0NCwgMHhGRiwgMHhCNCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgwQywgMHg2MCwgMHhEQywgMHg2NSwgMHhDNCwgMHg4MSwgMHg2MCwgMHg0NSwgMHhDOSwgMHg4MSwKKwkgMHg2MiwgMHg2NCwgMHgwNiwgMHg2MywgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyMSwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwOCwgMHgwMCwKKwkgMHhBQiwgMHg0NiwgMHhGOCwgMHhBMSwgMHhBRSwgMHg2NCwgMHgwNiwgMHg2MywgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOCwgMHhGRCwgMHgxRiwgMHhBQiwgMHg0NiwKKwkgMHg2NSwgMHg0NCwgMHgwQywgMHg2MCwgMHhGQywgMHg2NSwgMHhDNCwgMHg4MSwgMHhDOSwgMHg4MSwgMHg2QSwgMHg2NCwgMHgwNiwgMHg2MywgMHg1OCwgMHhEMCwKKwkgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyMiwgMHg0NCwgMHhGRiwgMHhCNCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NSwgMHhDNCwgMHg4NCwgMHgwQywgMHg2MCwKKwkgMHhDMiwgMHg2NSwgMHhDNCwgMHg4MSwgMHg3MiwgMHg2NCwgMHgwNCwgMHg2MywgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHhBQiwgMHg0NiwKKwkgMHgyMSwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwNiwgMHgwMCwgMHhGQSwgMHhBMSwgMHg4OCwgMHg2NCwgMHgwNCwgMHg2MywgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOCwKKwkgMHhGRCwgMHgxRiwgMHgzNywgMHhGMCwgMHgyMSwgMHg0NCwgMHgwMSwgMHgyQSwgMHgxMywgMHgwMCwgMHgyMiwgMHg0NCwgMHgzRCwgMHhGQiwgMHg2MCwgMHg0MSwKKwkgMHgwMiwgMHhGRSwgMHhGOCwgMHg4NCwgMHhGOCwgMHg4NCwgMHhGOCwgMHg4NCwgMHgzQywgMHhGQiwgMHgwQywgMHg2MCwgMHhCRSwgMHg2MywgMHg4OCwgMHhGRiwKKwkgMHhDRCwgMHg4MSwgMHgwNiwgMHhBMywgMHhGRCwgMHgwRCwgMHg4RCwgMHhGRiwgMHgzQiwgMHhGRCwgMHg2NCwgMHg0NywgMHg4MCwgMHhCRiwgMHg2MCwgMHg1QywKKwkgMHgyMiwgMHg0MywgMHg4MCwgMHg2MSwgMHg4OCwgMHhGRiwgMHhDRiwgMHg4MywgMHhFMSwgMHg4MSwgMHhGRCwgMHgwRCwgMHg4RCwgMHhGRiwgMHg2MSwgMHg0NywKKwkgMHgzMSwgMHg5MSwgMHhCMSwgMHg4NCwgMHgzNywgMHhGQSwgMHgxRiwgMHg2MywgMHhFMywgMHg4MywgMHg2NiwgMHg0NCwgMHgwMiwgMHhBNiwgMHgzNywgMHhGMCwKKwkgMHg2NiwgMHg0NCwgMHhCMSwgMHg5QywgMHgzNywgMHhGOCwgMHgwMiwgMHhBNiwgMHhGQSwgMHgxRiwgMHhBQiwgMHg0NiwgMHgwMCwgMHg2NywgMHgwMCwgMHg2MSwKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwgMHgyNSwgMHhGMCwgMHgwMiwgMHhBOCwgMHgwMCwgMHg2NywgMHgyMiwgMHgwMiwgMHgzRCwgMHhGMSwKKwkgMHg2NCwgMHg0NCwgMHgwMywgMHhCNCwgMHg0MCwgMHg0MiwgMHhEMCwgMHg4MCwgMHhBOSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwgMHhCNywgMHhGNCwKKwkgMHg4MCwgMHg2MSwgMHgwMiwgMHgwMiwgMHhFMywgMHg4MywgMHhFQiwgMHg4MywgMHgyMiwgMHg0NCwgMHg4OCwgMHhGRiwgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwKKwkgMHhGRCwgMHgwRCwgMHg4RCwgMHhGRiwgMHg2MSwgMHg0NywgMHgzMSwgMHg5MSwgMHg5RCwgMHg4NSwgMHhBNywgMHg4MywgMHgzNywgMHhGQywgMHgxRiwgMHg2MywKKwkgMHhFMywgMHg4MywgMHg2NiwgMHg0NCwgMHgwMiwgMHhBNiwgMHhCNywgMHhGMiwgMHg2NiwgMHg0NCwgMHhBNSwgMHg4MSwgMHhCNywgMHhGQSwgMHgwMiwgMHhBNiwKKwkgMHhGQSwgMHgxRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRCwgMHg2MCwgMHgxQSwgMHg2NCwgMHhBMCwgMHhEMSwgMHhBMCwgMHhGOSwKKwkgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHg0RSwgMHgwMCwgMHgyNywgMHhGMiwgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwKKwkgMHgyNywgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNiwgMHhGMCwgMHg2MywgMHg0NiwKKwkgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHhBOSwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywKKwkgMHg2MSwgMHg0NiwgMHgwMSwgMHgwMywgMHgyQSwgMHgwMCwgMHg0MywgMHg0QiwgMHhBQiwgMHg0NiwgMHgzNywgMHhGMiwgMHg4MCwgMHg2MCwgMHgzMCwgMHg3QywKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg0RSwgMHg2MSwgMHg2RSwgMHg2NCwgMHgwRSwgMHg2MywgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwKKwkgMHg1OCwgMHhEOCwgMHhGQiwgMHgxRiwgMHg4OCwgMHg2NCwgMHgwNCwgMHg2MywgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHg1OCwgMHhEOCwKKwkgMHhGQiwgMHgxRiwgMHhEOSwgMHg4MSwgMHg5OCwgMHg2NCwgMHgwNCwgMHg2MywgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHg1OCwgMHhEOCwKKwkgMHhGQiwgMHgxRiwgMHhEOSwgMHg4MSwgMHhBRSwgMHg2NCwgMHgwRSwgMHg2MywgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHg1OCwgMHhEOCwKKwkgMHhGQiwgMHgxRiwgMHgwMCwgMHg2NywgMHgwMCwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NywgMHgyMCwgMHg2MSwgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyRCwgMHg2MCwgMHgxQSwgMHg2NCwgMHhBMCwgMHhEMSwgMHhBMCwgMHhGOSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgzMSwgMHgwMCwKKwkgMHgyNywgMHhGMiwgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwKKwkgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgyNywgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwKKwkgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwKKwkgMHg2MSwgMHg0NiwgMHgyNSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHhBOSwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgwMSwgMHgwMywgMHgwRCwgMHgwMCwKKwkgMHg0MywgMHg0QiwgMHhBQiwgMHg0NiwgMHgzNywgMHhGMiwgMHg4MCwgMHg2MCwgMHgzMCwgMHg2MSwgMHg5RCwgMHg4NSwgMHhBNCwgMHg4NCwgMHhBMiwgMHhEQSwKKwkgMHhBQiwgMHg0NiwgMHgwMCwgMHg2NywgMHgwMCwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NywgMHgyMCwgMHg2MSwgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHg0NiwgMHg0NSwgMHgwMiwgMHhGMCwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NCwgMHhEMCwgMHg4MCwgMHgwMCwgMHhGNCwKKwkgMHgwMSwgMHhGMiwgMHg2NiwgMHg1QywgMHgyNSwgMHg0NiwgMHg1NiwgMHgwMiwgMHg3MCwgMHgyNywgMHg1NCwgMHgwMCwgMHgxMiwgMHg2NCwgMHgwMywgMHhGQSwKKwkgMHgwNCwgMHhGOCwgMHgwRSwgMHhGMiwgMHg4NywgMHhGQywgMHg4RCwgMHhGQywgMHg4RSwgMHhGQywgMHhEQSwgMHg4MiwgMHgxNiwgMHg2MSwgMHgwMCwgMHg2MywKKwkgMHhDOSwgMHg4MSwgMHg1QSwgMHhEQywgMHhGRCwgMHgwMiwgMHg2MCwgMHg0MCwgMHhGMCwgMHgzQiwgMHgxNiwgMHgwMCwgMHgzMiwgMHg0NCwgMHhBRiwgMHhGMywKKwkgMHgwMSwgMHhCMCwgMHhGQSwgMHhBMCwgMHgwOCwgMHgyNCwgMHgyQywgMHgwNSwgMHhEQywgMHg4MywgMHhGMCwgMHg2NywgMHgwRSwgMHhGQSwgMHgyNCwgMHg2MCwKKwkgMHg1RSwgMHg2NCwgMHgyQiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhBRiwgMHhGRCwgMHgyQiwgMHhGRiwKKwkgMHhGRSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHg0RiwgMHgwMCwgMHhCMCwgMHhGMywgMHgwNiwgMHg2NSwgMHhENCwgMHg4MCwgMHhEQywgMHg4MywKKwkgMHgxNywgMHgwNSwgMHhCMCwgMHhGRCwgMHg5OCwgMHhGRSwgMHgwNCwgMHgwNCwgMHgwMCwgMHg3RiwgMHgwOCwgMHg3RSwgMHgwRSwgMHhGQSwgMHgzQiwgMHhGRiwKKwkgMHgyNCwgMHg2MCwgMHg1MiwgMHg2NCwgMHgyQiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHgwRSwgMHhGMiwKKwkgMHgyQiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNiwgMHhGNywgMHhGRSwgMHhGRCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHgzMiwgMHgwMCwKKwkgMHhBQywgMHhGMywgMHhGRiwgMHhGRiwgMHhEOCwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwRCwgMHgwNCwgMHgyNCwgMHg2MCwgMHg2QSwgMHg2NCwgMHgyQiwgMHhEQiwKKwkgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQywgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg0QSwgMHhEQiwgMHgyMSwgMHgwMCwgMHg0NiwgMHg0NSwgMHgwMCwgMHg2NCwgMHgyQiwgMHhEQiwgMHgyNSwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMCwgMHgwQSwgMHgxOCwgMHg3MCwgMHg2NywKKwkgMHhBMCwgMHg4MCwgMHhGMCwgMHg2NywgMHgwNiwgMHgwMywgMHhDMCwgMHg4NCwgMHgwMSwgMHhGQSwgMHgyNSwgMHg0NiwgMHgyNSwgMHg0NCwgMHg4MCwgMHhGQywKKwkgMHgwNSwgMHhGQSwgMHhBRiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwgMHhGRiwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg1OCwgMHg2NCwKKwkgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwgMHgwRCwgMHgwMCwgMHgyNCwgMHg2MCwgMHg0QywgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwgMHgxOCwgMHgwMCwKKwkgMHgyNCwgMHg2MCwgMHg2NCwgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwgMHgwMywgMHgwMCwgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNywgMHhENSwgMHgwRSwgMHhGMiwgMHgwQiwgMHgxOCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwOCwgMHgwMCwgMHgyNCwgMHg2MCwgMHg3QSwgMHg2NCwKKwkgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGMiwgMHgwMSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyNywgMHhENSwgMHgwRSwgMHhGMiwgMHgxNCwgMHgxOCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgxMSwgMHgwMCwgMHgwMiwgMHhGMCwgMHgwOSwgMHg2MCwKKwkgMHgwOCwgMHg2NCwgMHhEMCwgMHg4MCwgMHhBMiwgMHhGRiwgMHhCMCwgMHhGMywgMHgwMiwgMHgwMiwgMHhDQywgMHg4NCwgMHhCMCwgMHhGQiwgMHgyNCwgMHg2MCwKKwkgMHg3QSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFOSwgMHgwMSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhGQiwgMHg2NCwgMHgzQSwgMHg0MiwgMHg0QSwgMHhEQiwgMHhBMiwgMHhGRiwgMHhCMywgMHhGMywgMHhBRiwgMHhGMywgMHhDQywgMHg4MCwKKwkgMHhGRCwgMHhBMCwgMHgwMSwgMHgxNCwgMHgxRSwgMHgwNSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwKKwkgMHgxOCwgMHgwMywgMHhGMCwgMHg2NywgMHgwRSwgMHhGQSwgMHgyNCwgMHg2MCwgMHg3QSwgMHg2MiwgMHgyNCwgMHg2MCwgMHg1RSwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGNiwgMHg2NCwgMHgzQSwgMHg0MiwKKwkgMHg0QSwgMHhEQiwgMHhCMywgMHhGMywgMHhBRiwgMHhGMywgMHhDQywgMHg4MywgMHhEQywgMHg4NCwgMHgwMSwgMHgxNSwgMHhCMywgMHhGRCwgMHhBRiwgMHhGQiwKKwkgMHhENCwgMHhGRSwgMHhCMiwgMHhGMywgMHhCMCwgMHhGMywgMHgwMCwgMHhBOCwgMHhCMSwgMHhGMSwgMHgwMywgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgyNywgMHgwNSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgyMSwgMHgwMywgMHgwMCwgMHg2MywKKwkgMHhCMiwgMHhGMywgMHgwRSwgMHhGQywgMHhDQywgMHg4NCwgMHhGRiwgMHgzQSwgMHhCMiwgMHhGQiwgMHg5OCwgMHhGRSwgMHgwMywgMHgwNCwgMHgwOCwgMHhCQiwKKwkgMHgwRSwgMHhGQywgMHgzQiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg3QSwgMHg2MiwgMHgyNCwgMHg2MCwgMHg1MiwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGNywgMHg2NCwgMHgzQSwgMHg0MiwgMHg0QSwgMHhEQiwKKwkgMHhCMCwgMHhGMywgMHgwRSwgMHhGMiwgMHhEQywgMHg4MywgMHgwOCwgMHhCMCwgMHhCMCwgMHhGRCwgMHgwOCwgMHgyOCwgMHhGNywgMHhGRSwgMHhENCwgMHhGRSwKKwkgMHhBMywgMHhGRiwgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCOSwgMHhGRSwgMHgxMywgMHhGRiwgMHgyNCwgMHg0MCwgMHg4MCwgMHgyQiwKKwkgMHgwQiwgMHgwMCwgMHhBMiwgMHhGRiwgMHgyNSwgMHg0NiwgMHgwOSwgMHhGNCwgMHgwRSwgMHhGMiwgMHgwNSwgMHgxOCwgMHgwOCwgMHhCQywgMHgwRSwgMHhGQSwKKwkgMHhGRiwgMHhGRiwgMHhGNywgMHhGRSwgMHgwMSwgMHgwMCwgMHhEOCwgMHhGRSwgMHhBMywgMHhGRiwgMHgyNSwgMHg0NiwgMHgzRSwgMHhGMiwgMHgwMCwgMHhGNCwKKwkgMHgwOCwgMHhGMCwgMHgyNSwgMHg0NiwgMHgwNiwgMHhCNCwgMHhGRiwgMHg3RiwgMHgxMCwgMHhCQywgMHgwNiwgMHgyNiwgMHhGRCwgMHg3RiwgMHgwRSwgMHhGQSwKKwkgMHgzRSwgMHhGMiwgMHgzRiwgMHhGMiwgMHg2MCwgMHg0MSwgMHgwOCwgMHgyQSwgMHg2NCwgMHg0NywgMHgzRiwgMHhGQSwgMHg2MCwgMHg0NSwgMHgyNywgMHg2MCwKKwkgMHhGQywgMHg2MiwgMHhBMiwgMHhEMywgMHhBMywgMHhGQywgMHhBQiwgMHhGQywgMHg5MSwgMHhGQywgMHhENCwgMHg4MCwgMHhDMCwgMHg2MCwgMHhFMSwgMHg2NSwKKwkgMHhBNSwgMHg4MCwgMHgwMSwgMHgwNCwgMHgwNywgMHgwMywgMHgyMywgMHhGMCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHgyRSwgMHg2MCwKKwkgMHhDNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRiwgMHg2MCwgMHg1OCwgMHg0RiwgMHgwRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwNCwgMHgyMywgMHhGMCwKKwkgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg5NiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwMiwgMHgwMCwKKwkgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4MywgMHgwMCwgMHhEQywgMHhGMywgMHhBOSwgMHhGMSwgMHgwNywgMHhCNCwgMHg2NCwgMHg0MywgMHhGRCwgMHhBMCwKKwkgMHgyQywgMHhGMiwgMHg3MSwgMHgwMiwgMHgwMSwgMHhCMCwgMHg2NCwgMHg0MywgMHg3OCwgMHgwMiwgMHgyRSwgMHhGMiwgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwKKwkgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwKKwkgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgyRSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwKKwkgMHgyRCwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyQywgMHhGMCwgMHg2MywgMHg0NiwKKwkgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHhBOSwgMHhGMywKKwkgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHg1MSwgMHgwMywgMHg2MywgMHg0NiwgMHg4MCwgMHhGNiwgMHgyNSwgMHg0NiwgMHg0MywgMHgxOCwKKwkgMHgyRSwgMHhGMiwgMHg2NiwgMHg0MSwgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhBOSwgMHhGMSwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMywgMHg2NCwgMHg0MywgMHgxMSwgMHgxOCwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGQywgMHgxQiwgMHg2NiwgMHg0NCwKKwkgMHg2NCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHg2NSwgMHg0MywgMHg4MCwgMHhGMCwgMHgwMSwgMHhGQSwKKwkgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHgwQiwgMHgwMCwgMHg2NCwgMHg0NiwgMHg2MiwgMHg0MywgMHgwMCwgMHhGMiwgMHhBMywgMHhEQiwKKwkgMHg2MCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg4MSwgMHhGQywgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwKKwkgMHg0MywgMHg0QiwgMHgyQywgMHhGMCwgMHhBRCwgMHhGMCwgMHgyRSwgMHhGMiwgMHhBQiwgMHg0NiwgMHgwMywgMHhGOCwgMHg4NCwgMHhGOCwgMHgwNSwgMHhGQSwKKwkgMHgwMywgMHg2NCwgMHgwNiwgMHhGQSwgMHhBQiwgMHg0NiwgMHgxRSwgMHg2MCwgMHhCQywgMHg2MSwgMHhBMSwgMHhEMywgMHgxRSwgMHg2MCwgMHhGRSwgMHg3QywKKwkgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHhBMCwgMHhERCwgMHhEQSwgMHg5QywgMHhBMSwgMHhEOSwgMHg0OSwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhBMSwgMHhEQiwgMHgwQSwgMHgwMCwgMHhEQywgMHhGMywgMHgwMiwgMHhBMywgMHhGRSwgMHhBMCwgMHhGOSwgMHhBMCwgMHgwMSwgMHgwNiwKKwkgMHgwNCwgMHgwMiwgMHgyMywgMHhGMCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHgwNywgMHhGQywgMHgyMywgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHgyNywgMHgxQiwgMHgyNywgMHg2MCwgMHhGRSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMCwgMHgzQSwgMHgxMCwgMHgwMCwKKwkgMHgyNCwgMHg2MCwgMHg3QSwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwRSwgMHhGMiwgMHhDMSwgMHhGRSwgMHgxMCwgMHhBQywgMHgwRSwgMHhGQSwgMHgxRiwgMHgwMCwKKwkgMHgyNCwgMHg2MCwgMHg3QSwgMHg2MiwgMHgyNCwgMHg2MCwgMHgzNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwRSwgMHhGMiwgMHhDOCwgMHhGRSwgMHgxMCwgMHhBQywgMHgwRSwgMHhGQSwgMHgwRiwgMHgwMCwKKwkgMHgyNCwgMHg2MCwgMHg3QSwgMHg2MiwgMHgyNCwgMHg2MCwgMHg0NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwRSwgMHhGMiwgMHhDRSwgMHhGRSwgMHgxMCwgMHhBQywgMHgwRSwgMHhGQSwgMHgyNSwgMHg2MCwKKwkgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDQiwgMHg4NCwgMHhDOSwgMHg4MywgMHhGRiwgMHhGRiwgMHgwOCwgMHgwNCwgMHg1OCwgMHhEMSwgMHhBNSwgMHhEOCwKKwkgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhGOCwgMHgxRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgzRSwgMHhGMiwgMHhDQywgMHhGMSwgMHgwOCwgMHhCMCwgMHgxOSwgMHhGOCwgMHgzQiwgMHgwMiwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQywgMHhGMywKKwkgMHgzMCwgMHhGQSwgMHg2MCwgMHg0NSwgMHhFRCwgMHhGMywgMHgzMSwgMHhGQSwgMHg0NiwgMHg0QSwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwKKwkgMHgwNiwgMHhGMiwgMHhEMCwgMHg4MCwgMHgwNywgMHhGMCwgMHgwNSwgMHgwMiwgMHhENCwgMHg4MCwgMHhEMywgMHg4MCwgMHgwMiwgMHgwMiwgMHhEQywgMHhGMywKKwkgMHgwMywgMHgwMywgMHhBQSwgMHg0NiwgMHg0MiwgMHhGRSwgMHgyNSwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwMywgMHgyQSwgMHgxMCwgMHgwMCwgMHgwMiwgMHhGMiwKKwkgMHgwMywgMHhGMCwgMHgwNCwgMHhGMiwgMHg2MCwgMHg0MywgMHhBQSwgMHg0NiwgMHgyQywgMHhGQywgMHgyRCwgMHhGOCwgMHgyRSwgMHhGQSwgMHg4MSwgMHhGMSwKKwkgMHgzMiwgMHhGOCwgMHg4MiwgMHhGMSwgMHgzMywgMHhGOCwgMHg4MywgMHhGMSwgMHgzNCwgMHhGOCwgMHgwOCwgMHg2NCwgMHgxMCwgMHgwMCwgMHgwMiwgMHhGMiwKKwkgMHgwMywgMHhGMCwgMHgwNCwgMHhGMiwgMHg2MCwgMHg0MywgMHhBQSwgMHg0NiwgMHgzMiwgMHhGQywgMHgzMywgMHhGOCwgMHgzNCwgMHhGQSwgMHg4MSwgMHhGMSwKKwkgMHgyQywgMHhGOCwgMHg4MiwgMHhGMSwgMHgyRCwgMHhGOCwgMHg4MywgMHhGMSwgMHgyRSwgMHhGOCwgMHgwMSwgMHg2MCwgMHgwOCwgMHg2NCwgMHgyQSwgMHhGQSwKKwkgMHgwMiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwMywgMHgwMiwgMHg0MiwgMHhGRiwKKwkgMHg0NywgMHhGRiwgMHhBMSwgMHhGRiwgMHg4MCwgMHhGRiwgMHg5MCwgMHhGRiwgMHg5OCwgMHhGRiwgMHg4OCwgMHhGRiwgMHg4NCwgMHhFMSwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHgwMCwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NywgMHgzRSwgMHgyRCwgMHg2MCwgMHg5QywgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxQiwgMHhGNywgMHgwMSwgMHg4NywgMHhGRiwgMHgyMCwgMHg0NCwgMHg4MCwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyNiwgMHhGMSwgMHgwMSwKKwkgMHhDMCwgMHg2MCwgMHg0MCwgMHhFQywgMHhDMCwgMHg2MCwgMHgwMCwgMHhFRCwgMHhDMCwgMHg2MCwgMHg4MCwgMHhFRSwgMHhBQywgMHg0RiwgMHhCRiwgMHhCNCwKKwkgMHhBMCwgMHg1QywgMHgyRCwgMHg2MCwgMHgxQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMiwgMHgyNywgMHgwNiwgMHgwMCwKKwkgMHgyOCwgMHhFMiwgMHgyNCwgMHhFMiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3NSwgMHg0MCwgMHgxMCwgMHgwMCwgMHgyOCwgMHhFMiwgMHgyNCwgMHhFMiwKKwkgMHgwMCwgMHg2MCwgMHgwMCwgMHg2MSwgMHgwMCwgMHg2MCwgMHg5NCwgMHhFMCwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBMSwgMHg1MCwgMHg3NSwgMHg0MCwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxMCwgMHhFMCwgMHgyRCwgMHg2MCwgMHg5QywgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHg2MCwgMHgzOSwgMHhFMiwgMHgwNCwgMHg2MCwgMHgwMCwgMHg3QSwgMHhBQywgMHg0RiwgMHg0MCwgMHhCQywKKwkgMHgwMCwgMHg3RiwgMHhBMCwgMHg1QywgMHhDMCwgMHg2MCwgMHhEOSwgMHhFQywgMHhDMCwgMHg2MCwgMHgwRiwgMHhFRCwgMHhDMCwgMHg2MCwgMHg4RiwgMHhFRSwKKwkgMHhBRSwgMHg0RiwgMHgwNCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RSwgMHgyNiwgMHg2MSwgMHhDRCwgMHg4MSwgMHhGRiwgMHhGRiwgMHhGRCwgMHgwMiwKKwkgMHhBRSwgMHg0RiwgMHhGQiwgMHhCNCwgMHhBMCwgMHg1RSwgMHhBRCwgMHgwMSwgMHg4MCwgMHhGRiwgMHg5MCwgMHhGRiwgMHg5OCwgMHhGRiwgMHgyRiwgMHg2MCwKKwkgMHg1NCwgMHg2MywgMHgyMCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMywgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyNCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNywgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyOCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQiwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyQywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRiwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyRiwgMHg2MCwgMHg0OCwgMHg2NCwgMHhBMCwgMHhERCwgMHgzMCwgMHg2MCwgMHg3NCwgMHg2MywgMHgyRiwgMHg2MCwgMHg0QSwgMHg2NCwKKwkgMHhBMCwgMHhERCwgMHgyRiwgMHg2MCwgMHg0QywgMHg2MywgMHgzMCwgMHg0NCwgMHhBMywgMHhEQiwgMHgyRiwgMHg2MCwgMHg0RSwgMHg2MywgMHgzMSwgMHg0NCwKKwkgMHhBMywgMHhEQiwgMHgyRiwgMHg2MCwgMHg1MCwgMHg2MywgMHgzMiwgMHg0NCwgMHhBMywgMHhEQiwgMHgyRiwgMHg2MCwgMHg1MiwgMHg2MywgMHgzMywgMHg0NCwKKwkgMHhBMywgMHhEQiwgMHg4MSwgMHhGRiwgMHg5MSwgMHhGRiwgMHg1OCwgMHg1MSwgMHg0QiwgMHgwMCwgMHg4MiwgMHhGRiwgMHg5MiwgMHhGRiwgMHg1OCwgMHg1MSwKKwkgMHg0NywgMHgwMCwgMHg4MywgMHhGRiwgMHg5MywgMHhGRiwgMHg1OCwgMHg1MSwgMHg0MywgMHgwMCwgMHg4NCwgMHhGRiwgMHg5NCwgMHhGRiwgMHg1OCwgMHg1MSwKKwkgMHgzRiwgMHgwMCwgMHg4NSwgMHhGRiwgMHg5NSwgMHhGRiwgMHg1OCwgMHg1MSwgMHgzQiwgMHgwMCwgMHg4NiwgMHhGRiwgMHg5NiwgMHhGRiwgMHg1OCwgMHg1MSwKKwkgMHgzNywgMHgwMCwgMHg4NywgMHhGRiwgMHg5NywgMHhGRiwgMHg1OCwgMHg1MSwgMHgzMywgMHgwMCwgMHg4MCwgMHhGRiwgMHg5MCwgMHhGRiwgMHg5OSwgMHhGRiwKKwkgMHgyRiwgMHg2MCwgMHg0OCwgMHg2NCwgMHhBMCwgMHhEMSwgMHgzMCwgMHg0NCwgMHg2NCwgMHg0MywgMHhCRCwgMHhEQiwgMHgzMSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzMiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzMywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzNiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzOCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzOSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzQSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzQiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzQywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzRCwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzRSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzRiwgMHg0NCwgMHhCRCwgMHhEQiwgMHhFRiwgMHg2MCwgMHg0OCwgMHg2NCwgMHgwQSwgMHhGQiwgMHg0MCwgMHgyMSwKKwkgMHhGRSwgMHgwMSwgMHg4MCwgMHhGRiwgMHg5MCwgMHhGRiwgMHg5OCwgMHhGRiwgMHg4OCwgMHhGRiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NywgMHgzRSwKKwkgMHg0MiwgMHg1MCwgMHg0MCwgMHg1MywgMHgyRiwgMHg2MCwgMHg0QSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MiwgMHgzMywgMHg0NCwKKwkgMHgzMiwgMHg0MiwgMHhBMiwgMHhEQiwgMHhEQSwgMHg4MiwgMHhBMiwgMHhERCwgMHhEQSwgMHg4MywgMHg2NSwgMHg0NCwgMHhCRCwgMHhEQiwgMHg2MSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHg2NiwgMHg0NCwgMHhCRCwgMHhEQiwgMHhCRCwgMHhEOSwgMHgzMCwgMHg0NCwgMHhCRCwgMHhEQiwgMHg5OSwgMHhGRiwgMHhBNCwgMHg0QywKKwkgMHhCRCwgMHhEQiwgMHhBNSwgMHg0QywgMHhCRCwgMHhEQiwgMHhBMCwgMHg0QywgMHhCRCwgMHhEQiwgMHhBMSwgMHg0QywgMHhCRCwgMHhEQiwgMHg5OCwgMHhGRiwKKwkgMHgyRiwgMHg2MCwgMHg0QSwgMHg2NCwgMHhBMCwgMHhERCwgMHgyRiwgMHg2MCwgMHg0QywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MCwKKwkgMHgyRiwgMHg2MCwgMHg1MCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MiwgMHgyRiwgMHg2MCwgMHg1MiwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MywgMHgzMSwgMHg0MSwgMHgyRiwgMHg2MCwgMHg0RSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MSwKKwkgMHgyRiwgMHg2MCwgMHg0OCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MywgMHgyMCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyMiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyNiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyQSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRCwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyRSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRiwgMHg2MCwgMHg0OCwgMHg2NCwgMHhBMCwgMHhERCwKKwkgMHg2MSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHhFMiwgMHgyRCwgMHhGMywgMHgyQywgMHhGMywgMHgwMCwgMHhCRCwgMHhDQywgMHg4NCwgMHgwOCwgMHgwMywKKwkgMHgyQywgMHhGQiwgMHgwNiwgMHgwMiwgMHg2NSwgMHg0NCwgMHgyQywgMHhGQiwgMHg4QSwgMHhGRiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwKKwkgMHhGMiwgMHhGMywgMHgzMSwgMHg0MCwgMHgwMSwgMHgyQSwgMHg0NCwgMHgwMCwgMHg2MCwgMHg0MywgMHgwNCwgMHhCMCwgMHgwMiwgMHhCMCwgMHgwOCwgMHgyNCwKKwkgMHgxNiwgMHgwMiwgMHgyOSwgMHg0NCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHhDQywgMHg4MSwgMHgwRSwgMHgwMywgMHg0MSwgMHg0OSwgMHgzNywgMHgwMiwKKwkgMHg2MywgMHg0MCwgMHgwOCwgMHgyQSwgMHgwOSwgMHgwMCwgMHhGNywgMHhCMywgMHgzMSwgMHg2MCwgMHgxRSwgMHg3QywgMHhBNCwgMHhEMSwgMHhBRCwgMHg0RiwKKwkgMHhGRCwgMHhCNCwgMHhBMCwgMHg1RCwgMHg0NCwgMHg0OSwgMHgyQiwgMHgwMCwgMHg2MywgMHg0MCwgMHgwMiwgMHgyQSwgMHgxNCwgMHgwMCwgMHgzMSwgMHg2MCwKKwkgMHgyMCwgMHg2NCwgMHhBMCwgMHhEMywgMHgzMSwgMHg2MCwgMHgxQywgMHg3QywgMHhBNCwgMHhEQiwgMHg0MCwgMHg0OSwgMHgzMSwgMHg2MCwgMHgyMiwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHgzMSwgMHg2MCwgMHgxRSwgMHg3QywgMHhBNCwgMHhEQiwgMHgwQywgMHhCQiwgMHhGRCwgMHhCMywgMHhBRCwgMHg0RiwgMHgwMiwgMHhCQywKKwkgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RCwgMHgxNCwgMHgwMCwgMHgzMSwgMHg2MCwgMHgyNCwgMHg2NCwgMHhBMCwgMHhEMywgMHgzMSwgMHg2MCwgMHgxQywgMHg3QywKKwkgMHgwRSwgMHgxOCwgMHhBNCwgMHhEQiwgMHg0MCwgMHg0OSwgMHgzMSwgMHg2MCwgMHgyNiwgMHg2NCwgMHhBMCwgMHhEMywgMHgzMSwgMHg2MCwgMHgxRSwgMHg3QywKKwkgMHhBNCwgMHhEQiwgMHgwOCwgMHhCQiwgMHhGQiwgMHhCMywgMHhBRCwgMHg0RiwgMHgwMiwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RCwgMHhGMiwgMHhGRCwKKwkgMHgwMSwgMHg2MCwgMHg0RSwgMHg2MSwgMHhBMSwgMHhEMywgMHg2MSwgMHg0MywgMHgxNywgMHgxOCwgMHg1OCwgMHhEMywgMHg2MiwgMHg0MSwgMHgwMywgMHgxOCwKKwkgMHhDQywgMHg4NCwgMHhBMSwgMHhEQiwgMHgxMSwgMHgwMCwgMHg0OSwgMHhEMywgMHhBMywgMHhEQiwgMHgwNiwgMHhBMSwgMHhBMSwgMHhEMywgMHg1OSwgMHhEMSwKKwkgMHg2MCwgMHg0NSwgMHhBNSwgMHhEMywgMHg1OSwgMHhEMSwgMHhCMCwgMHg4NCwgMHhBNSwgMHhEQiwgMHg2NCwgMHg0NCwgMHgwNiwgMHgzNiwgMHhDRCwgMHhGRSwKKwkgMHgwNywgMHgzNiwgMHhENiwgMHhGRSwgMHhFNSwgMHgwMSwgMHgyMywgMHg0NiwgMHhCMCwgMHg2MCwgMHhBNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0NiwgMHg0MywKKwkgMHgyNCwgMHg2MCwgMHhBNCwgMHg2MSwgMHhBMSwgMHhEMywgMHg1OSwgMHhEMSwgMHgwNiwgMHgxQiwgMHg1OSwgMHhEMywgMHg1OSwgMHhEMSwgMHgwMywgMHgxQiwKKwkgMHg1OSwgMHhEMywgMHg1OSwgMHhEMSwgMHhGMCwgMHgxOCwgMHgwMCwgMHg2MywgMHg0OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgwMiwgMHgzNiwgMHgxMSwgMHgwMCwKKwkgMHgwMywgMHgzNiwgMHgzMiwgMHgwMCwgMHgwMSwgMHgzNiwgMHgwOCwgMHgwMCwgMHgwNSwgMHgzQSwgMHhFQSwgMHgwMSwgMHhBNCwgMHhEMywgMHg1QSwgMHhEMywKKwkgMHg5QywgMHg4NSwgMHhBNCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFNCwgMHgwMSwgMHgwMSwgMHg2MCwgMHg0RSwgMHg2MSwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwKKwkgMHhERiwgMHgwMSwgMHgzMSwgMHg2MCwgMHgzQywgMHg2NCwgMHg0MCwgMHg0NSwgMHgyMiwgMHgwMCwgMHgwMSwgMHg2MCwgMHg0RSwgMHg2NiwgMHhBNiwgMHhEMywKKwkgMHgwNCwgMHhBMSwgMHg2MCwgMHg0MywgMHhBMSwgMHhEMywgMHhDOSwgMHg4MSwgMHg2MCwgMHg0NSwgMHgwMCwgMHhCQiwgMHhBMSwgMHhEQiwgMHhCRSwgMHhEMywKKwkgMHgwOSwgMHgwMywgMHhENCwgMHg4NCwgMHg5QywgMHg4NCwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwRSwgMHhBMywgMHhEMSwgMHg2MywgMHg0NiwKKwkgMHg2NCwgMHg0MywgMHhGMiwgMHgwMSwgMHg5QywgMHg4NCwgMHhEQywgMHg4NSwgMHg0OSwgMHhERCwgMHg2MSwgMHg0NCwgMHgwMCwgMHhCQiwgMHhBNiwgMHhEQiwKKwkgMHgwMiwgMHgwMywgMHg2NSwgMHg0NCwgMHhCRSwgMHhEQiwgMHhCQywgMHgwMSwgMHgzMSwgMHg2MCwgMHgxNywgMHg2NCwgMHg0MCwgMHg0NSwgMHgwMSwgMHg2MCwKKwkgMHg0RSwgMHg2NiwgMHhBNiwgMHhEMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHgwRiwgMHgxOCwgMHgwMiwgMHgwMywgMHg2MCwgMHg0NiwgMHhGOSwgMHgwMSwKKwkgMHg1OCwgMHhEMywgMHhBNCwgMHhEMywgMHg2MCwgMHg0NSwgMHgwMCwgMHg2MywgMHhBNCwgMHhERCwgMHgwNSwgMHgxOCwgMHg1OCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhDNCwgMHg4MywgMHhBMiwgMHhERCwgMHhDQSwgMHg4NCwgMHhBNiwgMHhEQiwgMHgyNSwgMHg1OCwgMHg2NCwgMHg0MSwgMHgwMCwgMHg2MCwgMHg0NiwgMHg3NCwKKwkgMHhDRCwgMHhFMiwgMHgwNCwgMHhFMSwgMHgwMiwgMHg2MCwgMHgwMCwgMHhFMSwgMHgzRiwgMHg0NCwgMHg0MCwgMHgyNiwgMHgwQiwgMHgwMCwgMHgwMSwgMHgyQSwKKwkgMHgwNSwgMHgwMCwgMHg0MiwgMHg2MCwgMHgwOSwgMHhFMCwgMHg2MCwgMHg2MCwgMHgxQywgMHhFMCwgMHgwNCwgMHgwMCwgMHg0MiwgMHg2MCwgMHgwOSwgMHhFMCwKKwkgMHg4MCwgMHg2MCwgMHgxQywgMHhFMCwgMHgwNCwgMHgyOSwgMHhGRSwgMHgwMSwgMHhDNCwgMHhFMiwgMHg0MywgMHg2NCwgMHgzQSwgMHhEQiwgMHhBNCwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgzRiwgMHg0NCwgMHgwMiwgMHgyNywgMHg4NCwgMHgwMCwgMHgyMCwgMHgyQiwgMHhGRiwgMHgwMSwgMHg4MCwgMHhFMSwKKwkgMHg5NSwgMHg2MCwgMHg4MCwgMHhFNywgMHg2MSwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwRCwgMHgwMCwgMHgwNSwgMHg2MywgMHgzMiwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHg2QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHg2MywgMHhGRiwgMHhGRiwgMHhGRSwgMHgxRiwgMHgwMSwgMHg2MywgMHgzMiwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHg2QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCMSwgMHhDRCwgMHg4MSwgMHhFMSwgMHg4NSwgMHgyNywgMHg2MCwgMHgzQywgMHg2NCwgMHg0NCwgMHhEMSwKKwkgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MywgMHgzMiwgMHg2MCwgMHg1OCwgMHg0RiwgMHg2QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2MywKKwkgMHgzMiwgMHg2MCwgMHg1OCwgMHg0RiwgMHg2QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg2MCwgMHg1OCwgMHg2MSwgMHgyOSwgMHg2MCwgMHhFOCwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHg0NSwgMHhEMSwgMHg0NywgMHhCQywgMHhFMCwgMHg4NCwgMHg2MiwgMHg0NSwgMHg2NCwgMHg1RiwgMHhFOCwgMHg4MywgMHgzMiwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHg2QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhGMywgMHhDRCwgMHhFMiwgMHg2MCwgMHg1NCwgMHgwNCwgMHhFMSwgMHgwNCwgMHgyOSwKKwkgMHhGRSwgMHgwMSwgMHhDNCwgMHhFMiwgMHgxNSwgMHg2MCwgMHhBMiwgMHhFNywgMHgzOCwgMHg2OSwgMHhGRiwgMHhGRiwgMHg2OCwgMHg0NCwgMHgwMSwgMHgxNiwKKwkgMHhGRCwgMHgwMSwgMHgwMSwgMHgyQSwgMHgzNiwgMHgwMCwgMHgwMywgMHg2MCwgMHg4MCwgMHg3QywgMHhBMywgMHg4MywgMHgyOSwgMHg2MCwgMHhFOCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg0MywgMHhCQiwgMHhCMywgMHg4MywgMHg5NSwgMHg2MCwgMHg4MCwgMHhFNywgMHgzMiwgMHg2MCwgMHg1OCwgMHg0RiwgMHg2QSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhFMywgMHg4MywgMHgxNSwgMHg2MCwgMHhBMiwgMHhFNywgMHgzOCwgMHg2OSwgMHhGRiwgMHhGRiwgMHg2OCwgMHg0MSwgMHgwMSwgMHgxNiwKKwkgMHhGRCwgMHgwMSwgMHg2MywgMHg0NywgMHg2MSwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMCwgMHgzQSwgMHhDQywgMHg4NCwgMHgwMiwgMHgwMCwKKwkgMHgwNywgMHgzQSwgMHhEQywgMHg4NCwgMHhGRiwgMHhCNCwgMHhBNSwgMHhEQiwgMHg2MCwgMHg0NywgMHhFOCwgMHg4NCwgMHg0NywgMHg2NSwgMHgyOSwgMHg2MCwKKwkgMHhFOCwgMHg2MiwgMHhBMiwgMHhEMywgMHhCNCwgMHg4NSwgMHhCNCwgMHg4MywgMHg4MCwgMHhFMSwgMHg5NSwgMHg2MCwgMHg4MCwgMHhFNywgMHgzMiwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHg2QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhGMywgMHhDRCwgMHhFMiwgMHg2MCwgMHg1NCwgMHgwNCwgMHgyOSwgMHhGRSwgMHgwMSwKKwkgMHhDNCwgMHhFMiwgMHhBNCwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MCwgMHgyQiwgMHgwNCwgMHgwMCwgMHgzMiwgMHg2MCwgMHg0MywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwgMHhBNCwgMHhGMywgMHg4MCwgMHhFMSwgMHhDQywgMHg4NCwgMHhFMCwgMHg4NSwgMHgxNSwgMHg2MCwgMHhBMiwgMHhFNywKKwkgMHgyNiwgMHg2MCwgMHg3OCwgMHg2NCwgMHg1OCwgMHg0RiwgMHg0RiwgMHgwMCwgMHgyNiwgMHg2MCwgMHg5NCwgMHg2NCwgMHg1OCwgMHg0RiwgMHg0QiwgMHgwMCwKKwkgMHgyNiwgMHg2MCwgMHhCMCwgMHg2NCwgMHg1OCwgMHg0RiwgMHg0NywgMHgwMCwgMHgyNiwgMHg2MCwgMHhDQywgMHg2NCwgMHg1OCwgMHg0RiwgMHg0MywgMHgwMCwKKwkgMHgyNiwgMHg2MCwgMHhFOCwgMHg2NCwgMHg1OCwgMHg0RiwgMHgzRiwgMHgwMCwgMHgyNywgMHg2MCwgMHgwNCwgMHg2NCwgMHg1OCwgMHg0RiwgMHgzQiwgMHgwMCwKKwkgMHgyNywgMHg2MCwgMHgyMCwgMHg2NCwgMHg1OCwgMHg0RiwgMHgzNywgMHgwMCwgMHgwMSwgMHg2OCwgMHhGRiwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwKKwkgMHhGRSwgMHgwMSwgMHgzRiwgMHg0NCwgMHgyMCwgMHgyNywgMHgwMCwgMHgwMCwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgwOCwgMHgwMCwgMHgwMCwgMHg2MCwKKwkgMHgxOCwgMHg2NCwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHg5NCwgMHg4NCwgMHhBMCwgMHg1MCwgMHgxRCwgMHg2MCwgMHgxOSwgMHhFMiwgMHhDNCwgMHhFMiwKKwkgMHgwMCwgMHg2MywgMHhBMywgMHhGRCwgMHgzMiwgMHg3QiwgMHg0RCwgMHhFMiwgMHhCRiwgMHhGRSwgMHhDNCwgMHhFMiwgMHg0MSwgMHhGRiwgMHhFMCwgMHhGRSwKKwkgMHhFMSwgMHhGRSwgMHhFMiwgMHhGRSwgMHg0MywgMHhGRiwgMHg0NCwgMHhGRiwgMHg0NiwgMHhGRiwgMHhBNSwgMHhGMywgMHg2MiwgMHhGRiwgMHg2MCwgMHg0MCwKKwkgMHgwNSwgMHgzNiwgMHgyRCwgMHhGRiwgMHgwNywgMHgzNiwgMHhENSwgMHhGRSwgMHgwOCwgMHhFMSwgMHg4OCwgMHg2MCwgMHg4NSwgMHg3MSwgMHg4RCwgMHhFMiwKKwkgMHhBMiwgMHg2MCwgMHgxNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1MCwgMHhFQywgMHg2MywgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwKKwkgMHg0MCwgMHhFQywgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0NCwgMHhEMywgMHg4MCwgMHg3QywgMHg2MCwgMHg0OCwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhCMCwgMHg4QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MiwgMHhGRiwgMHg0MCwgMHhGRiwKKwkgMHhERCwgMHhGRSwgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwgMHgwMSwgMHhCQywgMHhBMCwgMHg1RCwgMHgwMCwgMHhFRSwgMHgxOSwgMHg2MSwgMHhDRCwgMHg4MSwKKwkgMHhGRiwgMHhGRiwgMHhGRCwgMHgwMiwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHg2MCwgMHhCQywgMHg0MCwgMHg0MCwgMHgwMiwgMHg2MCwgMHhFRSwgMHg2MywKKwkgMHg3RiwgMHhGMywgMHhBMywgMHhGRCwgMHg0MCwgMHg3RiwgMHhBNCwgMHhGQiwgMHgwNSwgMHg2NCwgMHhBNSwgMHhGQiwgMHhERiwgMHhGRSwgMHgxOSwgMHhGRiwKKwkgMHgyNCwgMHg2MCwgMHhERCwgMHg2NCwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwMiwgMHgwMCwgMHgzMiwgMHg2MCwgMHhBMiwgMHg2NCwgMHhBNiwgMHhGQiwKKwkgMHhCQiwgMHg2MCwgMHgyMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHhFRSwgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwgMHgwMSwgMHhCQywgMHhBMCwgMHg1RCwKKwkgMHgxOSwgMHg2MSwgMHhDRCwgMHg4MSwgMHhGRiwgMHhGRiwgMHhGRCwgMHgwMiwgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwgMHgwMSwgMHhCQywgMHhBMCwgMHg1RCwKKwkgMHgwMCwgMHhFRSwgMHgxNSwgMHg2MCwgMHhBMiwgMHhFNywgMHgyNSwgMHg2MCwgMHgwMiwgMHg2MywgMHgyNSwgMHg2MCwgMHg3NiwgMHg2NSwgMHhERiwgMHhGRSwKKwkgMHg4MCwgMHhFMSwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0OCwgMHg2MCwgMHg0NywgMHg4MCwgMHhCQywgMHgwMCwgMHg3RiwgMHg2MCwgMHg0QSwKKwkgMHhENywgMHg4MCwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNSwgMHgwMiwgMHgyNSwgMHg2MCwgMHg3NiwgMHg2MywgMHgyNiwgMHg2MCwgMHg3OCwgMHg2NSwKKwkgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0OCwgMHg2MCwgMHg0NywgMHg4MCwgMHhCQywgMHgwMCwgMHg3RiwgMHg2MCwgMHg0QSwgMHhENywgMHg4MCwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNSwgMHgwMiwgMHgzRiwgMHg0MCwgMHgyMCwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2OCwgMHhGRiwgMHg2QSwKKwkgMHhCRiwgMHhGRSwgMHgzMywgMHg2MCwgMHg4QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MCwgMHgyMCwgMHgyQiwgMHhBRCwgMHgwMCwgMHgwMSwgMHgxNiwKKwkgMHhGRSwgMHgwMSwgMHgzOCwgMHg2OSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2OCwgMHg0NCwgMHgwMSwgMHgyQSwgMHhBNSwgMHgwMCwgMHgyNywgMHg2MCwKKwkgMHhCNCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHg3RiwgMHhGMSwKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg5QywgMHgwMSwgMHgwMCwgMHg3RiwgMHhGMSwgMHhERCwgMHhGRSwgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwKKwkgMHgwMSwgMHhCQywgMHhBMCwgMHg1RCwgMHgwMCwgMHhFRSwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHgwMiwgMHg2MCwKKwkgMHhFRSwgMHg2NCwgMHhBMywgMHhGQiwgMHhBNCwgMHhGOSwgMHgwNSwgMHg2NCwgMHhBNSwgMHhGQiwgMHhERiwgMHhGRSwgMHgxOSwgMHhGRiwgMHg4MywgMHgwMCwKKwkgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg0MywgMHg0NSwgMHhBNCwgMHhEMSwgMHhEQSwgMHg4MywgMHhDMywgMHg4NSwgMHg4MCwgMHhFMSwKKwkgMHhERiwgMHhGRSwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0OCwgMHg2MCwgMHg0NywgMHg4MCwgMHhCQywgMHgwMCwgMHg3RiwgMHg2MCwgMHg0QSwKKwkgMHhENywgMHg4MCwgMHhBMSwgMHhGRiwgMHhGNiwgMHgwMiwgMHhCRiwgMHhGRSwgMHg2RSwgMHgwMCwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgxMywgMHgwMCwKKwkgMHgwQiwgMHg2MCwgMHhGOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHg5MCwgMHg4NCwgMHhBMCwgMHg1MCwgMHhGOCwgMHhBMiwKKwkgMHhBMiwgMHhEMSwgMHgwQSwgMHg2MCwgMHgxOSwgMHg2NCwgMHg5MCwgMHg4NCwgMHhBMCwgMHg1MiwgMHgwNiwgMHhBMiwgMHhBMiwgMHhEMSwgMHg0NiwgMHg2MCwKKwkgMHgwOSwgMHg2NCwgMHg5MCwgMHg4NCwgMHhBMCwgMHg1MCwgMHhBRCwgMHg0RiwgMHhGRSwgMHhCNCwgMHhBMCwgMHg1RCwgMHhBRCwgMHg0RiwgMHhGRCwgMHhCNCwKKwkgMHhBMCwgMHg1RCwgMHgwMiwgMHhFRSwgMHhCRCwgMHhGRSwgMHg1MCwgMHgwMCwgMHg4MCwgMHhFMSwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2NCwgMHg0OCwKKwkgMHg5MiwgMHg2QSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2OCwgMHg0MCwgMHgyNywgMHg2MCwgMHhBMiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHgzRiwgMHgwMCwgMHg4MCwgMHhFMSwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwKKwkgMHgwMSwgMHg2OCwgMHhBNywgMHg2QSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2OCwgMHg0MCwgMHgzNiwgMHgwMCwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywKKwkgMHg0MCwgMHg0MCwgMHg4MCwgMHhFMSwgMHg2NCwgMHg0NiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgyMSwgMHg2OSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg2OCwgMHg1RSwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgyMiwgMHg2OSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2OCwgMHg1RiwgMHgyNiwgMHhGQSwKKwkgMHgxQywgMHhGMiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgzQSwgMHg2OSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2OCwgMHg1RiwgMHgyNywgMHhGQSwKKwkgMHgxQiwgMHgwMCwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg0MywgMHg0NSwgMHhCRSwgMHhENSwgMHhBNCwgMHhEMiwgMHg1QSwgMHg4NiwKKwkgMHhFRiwgMHhBMCwgMHgxMSwgMHg2MSwgMHgwMSwgMHgwNiwgMHg2MCwgMHg0MSwgMHgyNCwgMHg2MCwgMHhFMCwgMHg2MywgMHg4MCwgMHhFMSwgMHhCRCwgMHhEMywKKwkgMHgyNiwgMHg0MiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2MCwgMHg0OSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2OCwgMHg0NCwgMHhDRCwgMHg4MSwKKwkgMHhBMiwgMHhEQSwgMHg1QSwgMHg4NiwgMHhGNCwgMHgwMiwgMHgyNSwgMHg0MywgMHgyMSwgMHhFMSwgMHgwMCwgMHg2NCwgMHhCRiwgMHhEQiwgMHgyMCwgMHg0NCwKKwkgMHgyMCwgMHgyQSwgMHgwNywgMHgwMCwgMHgwNywgMHhCNCwgMHgwNCwgMHgzNiwgMHhDMywgMHhGRSwgMHgwNiwgMHgzNiwgMHhDQywgMHhGRSwgMHgwNywgMHgzNiwKKwkgMHhENSwgMHhGRSwgMHgyMCwgMHg0NCwgMHhEOCwgMHhCNCwgMHg0MCwgMHg0MCwgMHgyMCwgMHg0NCwgMHg0MCwgMHgyQSwgMHgwNywgMHgwMCwgMHg5RiwgMHhGRSwKKwkgMHgxRSwgMHgwNSwgMHhCRiwgMHhCNCwgMHg0MCwgMHg0MCwgMHhBNiwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg4MCwgMHg2MywKKwkgMHhCRCwgMHhEMywgMHgwMiwgMHg2MSwgMHgxNywgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwMiwgMHg2MSwgMHgxMywgMHgxQiwgMHgwNCwgMHhBMywKKwkgMHhCRCwgMHhEMywgMHgwMiwgMHg2MSwgMHgwRiwgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwNCwgMHg2MSwgMHgwQiwgMHgxQiwgMHgwNCwgMHhBMywKKwkgMHhCRCwgMHhEMywgMHgwNiwgMHg2MSwgMHgwNywgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwNywgMHg2MSwgMHgwMywgMHgxQiwgMHhCQiwgMHg2MCwKKwkgMHgyMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhEMSwgMHg0MCwgMHg0NCwgMHgyMCwgMHg0NCwgMHgwNywgMHhCNSwgMHhENCwgMHg4NSwgMHgzNSwgMHg4MCwKKwkgMHgyNCwgMHg0NSwgMHgyNCwgMHg2MCwgMHhCQywgMHg2NCwgMHg0NCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MCwgMHhFMSwgMHg0MywgMHg0NSwKKwkgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg2NCwgMHg0MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHg0MCwgMHg0NCwgMHgxMCwgMHgyNywKKwkgMHgxMCwgMHgwMCwgMHhGRiwgMHg2MCwgMHg3RiwgMHg2NSwgMHgxNSwgMHg2MCwgMHhBMiwgMHg2NCwgMHgyNCwgMHg0MCwgMHgwOCwgMHgyQiwgMHhBNCwgMHg4NCwKKwkgMHhBMCwgMHg1NywgMHhGRiwgMHhGRiwgMHg2NCwgMHg0OSwgMHhGRiwgMHhGRiwgMHg2OCwgMHg0NCwgMHgwMSwgMHgxNiwgMHhGRCwgMHgwMSwgMHgwMCwgMHg3RiwKKwkgMHhBMywgMHhEQiwgMHhBMSwgMHgwMSwgMHg4MCwgMHhFMSwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg2NCwgMHg0MywKKwkgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHg0MCwgMHg0NCwgMHgxMCwgMHgyQiwgMHgxMSwgMHgwMCwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgxNSwgMHg2MCwKKwkgMHg4MCwgMHhFNywgMHgyNCwgMHg0MCwgMHgwNywgMHgyNywgMHgwMiwgMHgwMCwgMHg1MCwgMHhFQywgMHgwMCwgMHgwMCwgMHg2MCwgMHg0QSwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgyNCwgMHg0MCwgMHgyMCwgMHgyQiwgMHg0MCwgMHhFQywgMHgwRiwgMHgwMCwgMHgxNSwgMHg2MCwgMHgyMiwgMHg2NCwKKwkgMHgyNCwgMHg0MCwgMHgwOCwgMHgyNywgMHg4MCwgMHhCQywgMHhBMywgMHhEMywgMHhBMCwgMHg1NywgMHg2MCwgMHg0OCwgMHg2NCwgMHg0NCwgMHg4MCwgMHhCQywKKwkgMHhGRiwgMHhCNCwgMHg2MCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg3NSwgMHgwMSwgMHg0MiwgMHg2RiwgMHg2RiwgMHg3NCwKKwkgMHg2MywgMHg2RiwgMHg2NCwgMHg2NSwgMHgyMCwgMHgyMSwgMHgyMSwgMHgyMCwgMHgyMCwgMHgwMCwgMHg1MywgMHg1NCwgMHg0MSwgMHgyRiwgMHg0MSwgMHg1MCwKKwkgMHgyMCwgMHg0NiwgMHg3NSwgMHg2RSwgMHg2MywgMHgyNywgMHg3MywgMHgwMCwgMHgxRiwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMiwgMHgwMCwgMHgyNCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNCwgMHgwMCwKKwkgMHgwNiwgMHgwMCwgMHgwNywgMHgwMCwgMHgwNSwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwNywgMHgwMCwgMHgwNiwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwNywgMHgwMCwKKwkgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwKKwkgMHgwMiwgMHgwMCwgMHg0MCwgMHgwMCwgMHgzMiwgMHgwMCwgMHgzMiwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg0MCwgMHgwMCwKKwkgMHgzMiwgMHgwMCwgMHgzNiwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg0MCwgMHgwMCwgMHgzQiwgMHgwMCwgMHg0MCwgMHgwMCwKKwkgMHgxNywgMHgwMCwgMHgwNywgMHgwMCwgMHgwNywgMHgwMCwgMHg0QSwgMHgwMCwgMHg0MCwgMHgwMCwgMHg0QSwgMHgwMCwgMHgxRSwgMHgwMCwgMHgwQywgMHgwMCwKKwkgMHgwOCwgMHgwMCwgMHg1NywgMHgwMCwgMHg0RCwgMHgwMCwgMHg1NywgMHgwMCwgMHgyQiwgMHgwMCwgMHgxOSwgMHgwMCwgMHgwOCwgMHgwMCwgMHg1RCwgMHgwMCwKKwkgMHg1MywgMHgwMCwgMHg1RCwgMHgwMCwgMHgzMSwgMHgwMCwgMHgxRiwgMHgwMCwgMHgwOCwgMHgwMCwgMHhBOSwgMHhGMywgMHgyMSwgMHg2MSwgMHgwMCwgMHg3QywKKwkgMHgwMSwgMHgwMCwgMHgwMCwgMHhGQSwgMHg2MCwgMHg0NiwgMHhGRSwgMHg2MywgMHhBMywgMHhEOCwgMHhGRSwgMHgxRiwgMHhDRCwgMHg4MSwgMHhEOCwgMHg4NCwKKwkgMHhGOCwgMHgwMiwgMHgyMSwgMHg2MSwgMHg4MCwgMHg2NywgMHg0MCwgMHg0QSwgMHhBOSwgMHhGNSwgMHgxNCwgMHg2MCwgMHgwMiwgMHg2NSwgMHgwMSwgMHg3QywKKwkgMHgwNywgMHgxOCwgMHgyQSwgMHg0MywgMHgwMiwgMHhGQywgMHg1RiwgMHg4QSwgMHg4RSwgMHhGOCwgMHg3MCwgMHhGOCwgMHgwMCwgMHhGNCwgMHhGOCwgMHgwMSwKKwkgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgwQSwgMHgwMCwgMHg0MiwgMHg2MCwgMHgwOSwgMHhFMCwgMHgzRiwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHg2MCwgMHg2MCwgMHgxQywgMHhFMCwgMHgwMiwgMHgwMCwgMHg4MCwgMHg2MCwgMHgxQywgMHhFMCwgMHg0MCwgMHhFQywKKwkgMHgwMCwgMHhFRCwgMHgwMiwgMHhFRSwgMHg4MCwgMHg2MCwgMHg1OCwgMHhFQywgMHg4MCwgMHg2MCwgMHgwMCwgMHhFRCwgMHg4MCwgMHg2MCwgMHg4MiwgMHhFRSwKKwkgMHhDMCwgMHg2MCwgMHg1OSwgMHhFQywgMHhDMCwgMHg2MCwgMHgwNywgMHhFRCwgMHhBRCwgMHg0RiwgMHhGRSwgMHhCNCwgMHhBMCwgMHg1RCwgMHgwMCwgMHhGMywKKwkgMHgyOCwgMHhGQiwgMHg0MCwgMHg0NCwgMHgyRiwgMHg2MCwgMHg1MiwgMHg3QywgMHgyMCwgMHhGOSwgMHhBMiwgMHg2MCwgMHgwMCwgMHg3QywgMHgyMSwgMHhGOSwKKwkgMHhBMiwgMHg2MCwgMHhFMCwgMHg3QywgMHgyMiwgMHhGOSwgMHgxOCwgMHg2MCwgMHg5NywgMHg3QywgMHgyMywgMHhGOSwgMHgxOCwgMHg2MCwgMHhBOCwgMHg3QywKKwkgMHgyNCwgMHhGOSwgMHgxOCwgMHg2MCwgMHhEMiwgMHg3QywgMHgyNSwgMHhGOSwgMHgxOCwgMHg2MCwgMHhFMywgMHg3QywgMHgyNiwgMHhGOSwgMHg5MSwgMHg2MCwKKwkgMHgwMCwgMHhFOCwgMHgyOCwgMHhFOCwgMHg0NCwgMHg2MCwgMHgwMiwgMHhFNiwgMHgxMCwgMHg2NywgMHg0MCwgMHg1MiwgMHgxMCwgMHg2MCwgMHgwNCwgMHhFNiwKKwkgMHgwOCwgMHg2MCwgMHgwMCwgMHg2MywgMHhGQSwgMHg2MCwgMHgwMCwgMHg2NSwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHgwMiwgMHhBOCwgMHhENCwgMHg4MCwKKwkgMHg0QSwgMHgwMiwgMHg0OSwgMHgwMiwgMHhEQiwgMHg4MywgMHhGQSwgMHg2MCwgMHgyNywgMHg2NSwgMHg1QiwgMHhEMywgMHhCRiwgMHhEMSwgMHgxQSwgMHgxOCwKKwkgMHhDMywgMHg4MywgMHhENCwgMHg4MCwgMHhDMywgMHg4MywgMHhGOSwgMHgwMiwgMHhEQiwgMHg4MywgMHhEMywgMHg4MywgMHhEMywgMHg4NiwgMHg2NCwgMHg0MSwKKwkgMHhDRCwgMHg4MSwgMHhBNiwgMHhEMSwgMHhEQSwgMHg4NiwgMHgyNSwgMHg2MCwgMHgwMiwgMHg2NSwgMHgwMCwgMHg2MCwgMHg3MiwgMHg2MywgMHhBNSwgMHhEMywKKwkgMHhEQSwgMHg4NSwgMHg5MCwgMHg4NCwgMHhGRiwgMHgyNywgMHgwMiwgMHgwMCwgMHhBMiwgMHhEOSwgMHgwMSwgMHgwMCwgMHhGOCwgMHgxRiwgMHhDRCwgMHg4MSwKKwkgMHhGRiwgMHhGRiwgMHhFRiwgMHgwMiwgMHgwOCwgMHg2MCwgMHgwNiwgMHg2MywgMHhGQSwgMHg2MCwgMHgyOCwgMHg2NSwgMHg1QiwgMHhEMywgMHhCRiwgMHhEMSwKKwkgMHgwQiwgMHgxOCwgMHhDMywgMHg4MywgMHhENCwgMHg4MCwgMHhDMywgMHg4MywgMHhGOSwgMHgwMiwgMHhCRiwgMHhEMywgMHgyOSwgMHg2MCwgMHhFOCwgMHg2MiwKKwkgMHgwRSwgMHhCNCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwOCwgMHg2MCwgMHgwNiwgMHg2MywgMHhGRCwgMHg2MCwgMHgwQywgMHg2NSwKKwkgMHg1QiwgMHhEMywgMHhCRiwgMHhEMSwgMHgxMCwgMHgxOCwgMHhDMywgMHg4MywgMHhENCwgMHg4MCwgMHhDMywgMHg4MywgMHhGOSwgMHgwMiwgMHhGQSwgMHhBMywKKwkgMHhBMywgMHhEMywgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NSwgMHhGNywgMHhBMCwgMHhGQywgMHhBMCwgMHgwRCwgMHgwNSwgMHgwNCwgMHgwNSwgMHg3OCwgMHg0MywKKwkgMHgwMiwgMHg2MSwgMHgyNCwgMHg2MCwgMHhERCwgMHg3OCwgMHgyMSwgMHg2MCwgMHgwMCwgMHg2NSwgMHgzRiwgMHg0MywgMHgzRiwgMHg0MywgMHgyMSwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHhDMCwgMHg2MCwgMHg4RiwgMHhFRSwgMHhCNywgMHg4NCwgMHg0MCwgMHg1RiwgMHgwMCwgMHg2MCwgMHgzMCwgMHhFMiwgMHgwMCwgMHg2MCwKKwkgMHg1MCwgMHhFMiwgMHgwMCwgMHg2MCwgMHg3OSwgMHhFMiwgMHgwMCwgMHg2MCwgMHg5MCwgMHhFMiwgMHgwMSwgMHg2MCwgMHhEMCwgMHhFMiwgMHgwMSwgMHg2MCwKKwkgMHhGMCwgMHhFMiwgMHgwMSwgMHg2MCwgMHhCMCwgMHhFMiwgMHgyNiwgMHg2NCwgMHgzNSwgMHhGQiwgMHgwMSwgMHg2MCwgMHgzMCwgMHg2NCwgMHgwQSwgMHhBNCwKKwkgMHgzOCwgMHhGQiwgMHg2MCwgMHg0NSwgMHgwMCwgMHg2MCwgMHhGOCwgMHg2NCwgMHgwQSwgMHhBNCwgMHgzOSwgMHhGQiwgMHgzNSwgMHhGMSwgMHgwQSwgMHg2NCwKKwkgMHhDNCwgMHg4NCwgMHgzNiwgMHhGQiwgMHhDMCwgMHg4NCwgMHgwQSwgMHhBNCwgMHgzNywgMHhGQiwgMHgwOSwgMHg2MCwgMHgyQSwgMHg2NCwgMHhCOSwgMHhGQiwKKwkgMHg4MiwgMHhGRiwgMHg5MiwgMHhGRiwgMHg1QywgMHg0MSwgMHg1QywgMHg0NiwgMHg1QywgMHg0NywgMHgwMCwgMHhFMSwgMHhBMywgMHg2MCwgMHg0QiwgMHg2MywKKwkgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMCwgMHhERCwgMHg4NywgMHhGRiwgMHg5NywgMHhGRiwgMHgwQywgMHg2MCwgMHgwMiwgMHg2NCwgMHg0MCwgMHg1QSwKKwkgMHgwNiwgMHhBNCwgMHg0MCwgMHg1QiwgMHg1QywgMHg1RSwgMHg1QywgMHg1MSwgMHgyOCwgMHg2MCwgMHg0NCwgMHg2MiwgMHhBMiwgMHhEMywgMHg3RiwgMHhGQiwKKwkgMHgyRCwgMHg2MCwgMHhDQywgMHg2MSwgMHgyNywgMHg3QywgMHhBMSwgMHhEOSwgMHg2RCwgMHg2MCwgMHgxQywgMHg2MywgMHg3RiwgMHhBMywgMHhFMywgMHg4NywKKwkgMHgwMCwgMHg3RiwgMHhBQSwgMHhGQiwgMHgwMiwgMHg2MCwgMHg3RiwgMHg2NCwgMHgwMCwgMHg2MCwgMHg0MiwgMHg2NSwgMHhENCwgMHg4NCwgMHhBQiwgMHhGQiwKKwkgMHhEQywgMHg4NCwgMHhBOSwgMHhGQiwgMHgyNCwgMHg2MCwgMHgwRSwgMHg2MiwgMHhBMiwgMHhEQiwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg2NCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhBQiwgMHhGMSwgMHhBQSwgMHhGMywgMHg3QywgMHg2MywgMHhBRCwgMHhGQiwgMHg2MCwgMHg0NiwgMHgwMSwgMHhGQywgMHhEQywgMHg4NCwKKwkgMHhEMCwgMHg4MCwgMHgwMCwgMHhGQSwgMHhGQSwgMHgwNCwgMHhBRSwgMHhGQiwgMHg2MCwgMHg0NiwgMHgwMCwgMHg2NCwgMHgwMCwgMHhGQSwgMHg2MywgMHg0NCwKKwkgMHg4MCwgMHg3RiwgMHgwMSwgMHhGQSwgMHhBQiwgMHhGMywgMHhBQSwgMHhGMSwgMHhEQywgMHg4NCwgMHhEMCwgMHg4NCwgMHhBQywgMHhGQiwgMHgwMywgMHg2MCwKKwkgMHgyNiwgMHg2MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhCMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHgyRSwgMHhGQiwgMHg4MiwgMHhGRiwKKwkgMHg0MCwgMHg0MiwgMHg4NywgMHhGRiwgMHhBQywgMHhGMywgMHhCNCwgMHhGQiwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2MywgMHhGQSwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHhCRCwgMHhEMywgMHhBMywgMHhEMywgMHgwMiwgMHhBOCwgMHhENCwgMHg4MCwgMHgyNCwgMHgwMiwgMHgyMywgMHgwMiwgMHgyRCwgMHg2MCwgMHgxQSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHg4MCwgMHgyNiwgMHgxQywgMHgwMCwgMHgwNCwgMHhBMywgMHhGRCwgMHg2MCwgMHgwRCwgMHg2NSwKKwkgMHg1QiwgMHhEMywgMHhCRiwgMHhEMSwgMHgxNiwgMHgxOCwgMHhDMywgMHg4MywgMHhENCwgMHg4MCwgMHhDMywgMHg4MywgMHhGOSwgMHgwMiwgMHhCRiwgMHhEMywKKwkgMHhBRCwgMHg0OSwgMHhGRSwgMHhBMCwgMHgwMCwgMHg2NCwgMHgwRSwgMHgwNCwgMHgwOCwgMHhCMSwgMHgyMCwgMHhCQywgMHgwOCwgMHgyOCwgMHgxOCwgMHhCQywKKwkgMHgxQywgMHg2MCwgMHhCOCwgMHg2MywgMHgwNywgMHg3QywgMHhBMywgMHhEOSwgMHgxQywgMHg2MCwgMHhCNiwgMHg2MywgMHgwNSwgMHg3QywgMHhBMywgMHhEOSwKKwkgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwgMHgxQywgMHg2MCwgMHhCNCwgMHg2MywgMHhBMywgMHhEQiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg1MCwgMHg2MywgMHhGRiwKKwkgMHg2MCwgMHhGRiwgMHg2NiwgMHhGRiwgMHg2NSwgMHhGRiwgMHg2NCwgMHhGRiwgMHg2MSwgMHhGRiwgMHg2MiwgMHhGRiwgMHg0OSwgMHg2MCwgMHgwMiwgMHhFMSwKKwkgMHg1MiwgMHg2MCwgMHgwMiwgMHhFMSwgMHg1QiwgMHg2MCwgMHgwMiwgMHhFMSwgMHg2NSwgMHg2MCwgMHgwMiwgMHhFMSwgMHg2QywgMHg2MCwgMHgwMiwgMHhFMSwKKwkgMHg3NiwgMHg2MCwgMHgwMiwgMHhFMSwgMHg0MSwgMHg2MCwgMHgwMiwgMHhFMSwgMHgwNCwgMHg2NSwgMHgyRCwgMHg2MCwgMHgxOCwgMHg2NCwgMHg0NCwgMHhEMywKKwkgMHhFRiwgMHg2MCwgMHg1OCwgMHg0RSwgMHhCRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg5RSwgMHg2NSwgMHgwQywgMHg2NCwgMHhBNSwgMHhEQiwKKwkgMHgzNiwgMHg2MCwgMHgxRSwgMHg2NCwgMHhBMSwgMHhGQiwgMHgyRCwgMHhGRiwgMHgwNiwgMHg2MSwgMHg0MSwgMHg0QiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2MSwKKwkgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhCMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGMCwgMHg2NywgMHgwRSwgMHhGQSwgMHgyNCwgMHg2MCwgMHg3QSwgMHg2MiwKKwkgMHgyNCwgMHg2MCwgMHg1RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHgyQiwgMHg0MSwgMHg0RCwgMHg4QiwgMHhGRiwgMHhGRiwgMHhFOSwgMHgwMiwgMHgwNiwgMHg2MSwgMHg0MSwgMHg0QiwgMHgwOSwgMHg2MCwKKwkgMHgwOCwgMHg2MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhCMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg3QSwgMHg2MiwgMHgyNCwgMHg2MCwKKwkgMHg1MiwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHgyQiwgMHg0MSwgMHg0RCwgMHg4QiwgMHhGRiwgMHhGRiwgMHhFQiwgMHgwMiwgMHgxOSwgMHg2MCwgMHgxNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhFQSwKKwkgMHgwMCwgMHhFQiwgMHg1MCwgMHg2MCwgMHgwMywgMHhFQSwgMHg1MSwgMHg2MCwgMHgxMywgMHhFQSwgMHg1MiwgMHg2MCwgMHgzMCwgMHhFQSwgMHg1MywgMHg2MCwKKwkgMHg0MCwgMHhFQSwgMHg1NCwgMHg2MCwgMHg1MiwgMHhFQSwgMHg1NSwgMHg2MCwgMHg2RCwgMHhFQSwgMHg1NiwgMHg2MCwgMHg3MSwgMHhFQSwgMHg1NywgMHg2MCwKKwkgMHg4QiwgMHhFQSwgMHg1OCwgMHg2MCwgMHg0NywgMHhFQSwgMHg1OSwgMHg2MCwgMHhBMCwgMHhFQSwgMHg1QSwgMHg2MCwgMHhCMiwgMHhFQSwgMHg1QiwgMHg2MCwKKwkgMHhDMSwgMHhFQSwgMHg1QywgMHg2MCwgMHhENywgMHhFQSwgMHg1RCwgMHg2MCwgMHhFQiwgMHhFQSwgMHg1RSwgMHg2MCwgMHhBMCwgMHhFQSwgMHg1MCwgMHg2MCwKKwkgMHgzNiwgMHhFQiwgMHg1MSwgMHg2MCwgMHgzNywgMHhFQiwgMHg1MiwgMHg2MCwgMHgyMCwgMHhFQiwgMHg1MywgMHg2MCwgMHhFNCwgMHhFQiwgMHg1NCwgMHg2MCwKKwkgMHgzNCwgMHhFQiwgMHg1NSwgMHg2MCwgMHg1OCwgMHhFQiwgMHg1NiwgMHg2MCwgMHg0OCwgMHhFQiwgMHg1NywgMHg2MCwgMHhEMCwgMHhFQiwgMHg1OCwgMHg2MCwKKwkgMHhDMywgMHhFQiwgMHg1OSwgMHg2MCwgMHhGQywgMHhFQiwgMHg1QSwgMHg2MCwgMHgzNCwgMHhFQiwgMHg1QiwgMHg2MCwgMHg1OCwgMHhFQiwgMHg1QywgMHg2MCwKKwkgMHhDMCwgMHhFQiwgMHg1RCwgMHg2MCwgMHhEMCwgMHhFQiwgMHg1RSwgMHg2MCwgMHg5MSwgMHhFQiwgMHgwMCwgMHhFQSwgMHgwMCwgMHhFQiwgMHhFMCwgMHg2MCwKKwkgMHgwMiwgMHhFQSwgMHhFMCwgMHg2MCwgMHgwMywgMHhFQiwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQiwgMHhCMCwgMHg2MCwgMHgwMCwgMHhFQiwgMHhBQiwgMHg0OCwKKwkgMHg0MCwgMHgzQiwgMHgwMSwgMHgwMCwgMHhGQywgMHgwMSwgMHgwMCwgMHhFQiwgMHgwMywgMHg2MCwgMHgwMiwgMHg2MiwgMHg2MiwgMHg0NCwgMHhBMiwgMHhEQiwKKwkgMHgwRiwgMHg2NCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwKKwkgMHgwMCwgMHhFQSwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgwOCwgMHgwMCwgMHgwMCwgMHg2MCwgMHgxOCwgMHg2NCwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHg5NCwgMHg4NCwgMHhBMCwgMHg1MCwgMHgxRCwgMHg2MCwgMHgxOSwgMHhFMiwgMHgyNCwgMHg0NCwgMHhGRiwgMHhCNCwgMHgwNCwgMHhGQiwgMHg1MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgwNSwgMHhGQiwgMHgxMCwgMHg2MCwgMHgxMCwgMHg3NSwgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MSwKKwkgMHhBNSwgMHg0QywgMHg1MCwgMHgzNywgMHgwNCwgMHgwMCwgMHgwMSwgMHhCOSwgMHg0MSwgMHg1RiwgMHhCNSwgMHg2MCwgMHg1NSwgMHhFMCwgMHgwQywgMHg2MCwKKwkgMHgxMCwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMSwgMHg2MCwgMHgwMSwgMHg2NSwgMHhENCwgMHg4MCwgMHg1QSwgMHhEMSwgMHgwRiwgMHgwMiwgMHg1QSwgMHhEMywKKwkgMHgzQywgMHg2MCwgMHgwMCwgMHg2NiwgMHhFMCwgMHg4NywgMHg0MCwgMHg0QSwgMHg2OCwgMHg2MCwgMHgyOCwgMHg2MSwgMHg2NCwgMHg0NCwgMHhDOCwgMHg4NCwKKwkgMHgwQywgMHg2MywgMHhBQSwgMHg0NiwgMHg1OCwgMHhEMCwgMHhBQSwgMHg0NiwgMHg1OSwgMHhEOCwgMHhGQiwgMHgxRiwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2MywKKwkgMHhGQSwgMHg2MCwgMHgwMCwgMHg2NSwgMHhCRCwgMHhEMywgMHhBMywgMHhEMywgMHgwMiwgMHhBOCwgMHhENCwgMHg4MCwgMHg2MSwgMHgwMiwgMHg2MCwgMHgwMiwKKwkgMHg2RSwgMHg2MCwgMHg1OCwgMHg2MSwgMHgzQywgMHg2MCwgMHgwMCwgMHg2NiwgMHg0MSwgMHg0QiwgMHgyQiwgMHg0MSwgMHg2RSwgMHg2MCwgMHhBMCwgMHg3QywKKwkgMHhEMSwgMHg4MCwgMHhBMSwgMHhEMiwgMHgyNSwgMHgwNSwgMHg1OSwgMHhEMCwgMHg2MCwgMHg0NSwgMHg1OSwgMHhEMiwgMHg0NCwgMHg0NywgMHhFMCwgMHg4NywKKwkgMHg0MCwgMHg0QSwgMHg1OSwgMHhEMiwgMHg1OSwgMHg4QiwgMHg0MCwgMHg0QywgMHgwOCwgMHg2MCwgMHgwMCwgMHg2MywgMHhCRSwgMHhEMywgMHhCRCwgMHhEMSwKKwkgMHhFQywgMHgxOCwgMHhENCwgMHg4MCwgMHhFQSwgMHgxOCwgMHgwMywgMHgwMywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhGNywgMHgwMSwgMHg2NywgMHg0NCwKKwkgMHhDMCwgMHg4NCwgMHhFMCwgMHg4NSwgMHgyQywgMHg0NCwgMHhENCwgMHg4MCwgMHg2MywgMHg0MSwgMHgwMSwgMHgwNiwgMHg2NSwgMHg0NCwgMHhDOCwgMHg4MywKKwkgMHhBQSwgMHg0NiwgMHg1OSwgMHhEMSwgMHgyNywgMHhEOCwgMHg1QSwgMHg4NywgMHhGQywgMHgxRiwgMHhBQSwgMHg0NiwgMHgyQiwgMHg0MSwgMHhENSwgMHgwMSwKKwkgMHg2RSwgMHg2MCwgMHhBMCwgMHg2MSwgMHg0MSwgMHg0QiwgMHgyQiwgMHg0MSwgMHg2RSwgMHg2MCwgMHhEOCwgMHg3QywgMHhEMSwgMHg4MCwgMHhBMSwgMHhEMiwKKwkgMHgyNywgMHgwNSwgMHg1OSwgMHhEMCwgMHg2MCwgMHg0NSwgMHg1OSwgMHhEMiwgMHg0NCwgMHg0NywgMHhFMCwgMHg4NywgMHg0MCwgMHg0QSwgMHg1OSwgMHhEMiwKKwkgMHg1OSwgMHg4QiwgMHg0MCwgMHg0QywgMHgwOCwgMHg2MCwgMHgwMCwgMHg2MywgMHhCRSwgMHhEMywgMHhCRCwgMHhEMSwgMHhFQywgMHgxOCwgMHhENCwgMHg4MCwKKwkgMHhFQSwgMHgxOCwgMHgwMywgMHgwMywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhGNywgMHgwMSwgMHgwNCwgMHhBMywgMHhBMywgMHhEMSwgMHg1QSwgMHg4OCwKKwkgMHgyQywgMHg0MywgMHhEMywgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNiwgMHg2NCwgMHg0MywgMHhDRiwgMHg4MywgMHhBQSwgMHg0NiwgMHg2MCwgMHhGRSwKKwkgMHgyOCwgMHhEMSwgMHg1RSwgMHg4OCwgMHgyNywgMHhEOCwgMHg1QSwgMHg4NywgMHhGQiwgMHgxRiwgMHgyMCwgMHhGRSwgMHhBQSwgMHg0NiwgMHhEMywgMHgwMSwKKwkgMHhCOCwgMHhGRSwgMHhCOSwgMHhGRSwgMHhCQSwgMHhGRSwgMHhCQiwgMHhGRSwgMHhCRCwgMHhGRSwgMHhCRiwgMHhGRSwgMHgyRCwgMHg2MCwgMHgxQSwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHgxMiwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwNSwgMHgwMCwgMHgwQiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRSwgMHgxRiwgMHgzNCwgMHg2MCwgMHg4MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGMSwgMHhGRiwgMHhGNiwgMHg2QywgMHgxRSwgMHgwMCwKKwkgMHgwNCwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGQSwgMHg2QywgMHgxRSwgMHgwMCwgMHgwNCwgMHgwMCwgMHhGQiwgMHhGRiwgMHgwMiwgMHg2RCwgMHgxRSwgMHgwMCwKKwkgMHgwNCwgMHgwMCwgMHhGMSwgMHhGRiwgMHg4QywgMHg2NCwgMHgxRSwgMHgwMCwgMHgwNCwgMHgwMCwgMHhGMiwgMHhGRiwgMHg5MCwgMHg2NCwgMHgxRSwgMHgwMCwKKwkgMHgwNCwgMHgwMCwgMHhGQiwgMHhGRiwgMHg5OCwgMHg2NCwgMHgxRSwgMHgwMCwgMHgwNCwgMHgwMCwgMHg4NiwgMHhGRCwgMHg1MCwgMHgyOCwgMHgwMCwgMHgwMCwKKwkgMHgwNiwgMHgwMCwgMHgxMCwgMHhGRCwgMHg3NCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgxNCwgMHhGRCwgMHgxOCwgMHgyRCwgMHgwMCwgMHgwMCwKKwkgMHgwQSwgMHgwMCwgMHgyMCwgMHhGQSwgMHg5NCwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHgyMSwgMHhGQSwgMHg3OCwgMHgyNiwgMHgwMCwgMHgwMCwKKwkgMHgwRSwgMHgwMCwgMHgyMiwgMHhGQSwgMHhCMCwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHgyMywgMHhGQSwgMHg2NCwgMHgyNSwgMHgwMCwgMHgwMCwKKwkgMHgwMSwgMHgwMCwgMHgyNCwgMHhGQSwgMHg1OCwgMHgyNywgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHgyNSwgMHhGQSwgMHg3OCwgMHgyNSwgMHgwMCwgMHgwMCwKKwkgMHg4MCwgMHgwMCwgMHgyNiwgMHhGQSwgMHg1RSwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKKworfTsgIC8qIGZ3X2ltYWdlXzNfZGF0YSAqLworCitzdGF0aWMgY29uc3QgaGNmXzggZndfaW1hZ2VfNF9kYXRhW10gPSB7CisJIDB4QTIsIDB4NjAsIDB4REQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTIsIDB4NjAsIDB4QzMsIDB4NzgsIDB4NDEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTIsIDB4NjAsIDB4QzksIDB4NzgsIDB4QzQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTIsIDB4NjAsIDB4MTksIDB4NzgsIDB4NDMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NDQsIDB4RkYsIDB4MjAsIDB4NTQsIDB4Q0QsIDB4RTIsIDB4QTIsIDB4NjAsIDB4REIsIDB4NzgsIDB4MDgsIDB4RTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTIsIDB4NjAsIDB4REQsIDB4NzgsIDB4NDQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTIsIDB4NjAsIDB4REQsIDB4NzgsIDB4NDYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTIsIDB4NjAsIDB4REQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTgsIDB4NjAsIDB4NzMsIDB4NzgsIDB4NEMsIDB4NEUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTcsIDB4NjAsIDB4RkIsIDB4NzgsIDB4NEMsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzQsIDB4RTIsIDB4ODQsIDB4RkYsIDB4MjIsIDB4NTgsIDB4ODIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTMsIDB4NjAsIDB4N0UsIDB4NzgsIDB4NDMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RTQsIDB4RTIsIDB4QTgsIDB4NjAsIDB4MTQsIDB4NzgsIDB4QjUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QkEsIDB4NjAsIDB4Q0UsIDB4NzgsIDB4NjQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTgsIDB4NjAsIDB4ODcsIDB4NzgsIDB4QTQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTgsIDB4NjAsIDB4NTUsIDB4NzgsIDB4NDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QUUsIDB4NjAsIDB4MUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QUUsIDB4NjAsIDB4NEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QUMsIDB4NjAsIDB4RDgsIDB4NzgsIDB4NDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QUQsIDB4NjAsIDB4MDgsIDB4NzgsIDB4NDMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QUQsIDB4NjAsIDB4MDgsIDB4NzgsIDB4NDQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QUYsIDB4NjAsIDB4QzAsIDB4NzgsIDB4NDUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QUQsIDB4NjAsIDB4MEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4ODMsIDB4NjQsIDB4ODAsIDB4MjksIDB4MDksIDB4RkIsIDB4QUQsIDB4NjAsIDB4RTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MzEsIDB4NjAsIDB4MTYsIDB4NzgsIDB4NDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MzAsIDB4NjAsIDB4QTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjksIDB4NjAsIDB4NEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjgsIDB4NjAsIDB4QkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjAsIDB4NjAsIDB4ODksIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODMsIDB4M0UsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QkIsIDB4NjAsIDB4MjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4NDEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4NDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QjAsIDB4RkYsIDB4QjEsIDB4RkYsIDB4NDAsIDB4RkYsIDB4NDMsIDB4RkYsIDB4QkIsIDB4NjAsIDB4MjAsIDB4NzgsIDB4NDQsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QkIsIDB4NjAsIDB4MjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4MzMsIDB4NjAsIDB4OUIsIDB4NzgsIDB4NDUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QkIsIDB4NjAsIDB4MjAsIDB4NzgsIDB4ODQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QkIsIDB4NjAsIDB4MUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QkYsIDB4NjAsIDB4REIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RUIsIDB4NjAsIDB4MUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QkYsIDB4NjAsIDB4RTMsIDB4NzgsIDB4NDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QkYsIDB4NjAsIDB4RTMsIDB4NzgsIDB4MjQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RTksIDB4NjAsIDB4RTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QkYsIDB4NjAsIDB4RTMsIDB4NzgsIDB4NDQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QkYsIDB4NjAsIDB4RTMsIDB4NzgsIDB4ODQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QkYsIDB4NjAsIDB4RTMsIDB4NzgsIDB4NDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MjQsIDB4NjAsIDB4RTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MjUsIDB4NjAsIDB4MTQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MjUsIDB4NjAsIDB4MzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MjUsIDB4NjAsIDB4MTEsIDB4NzgsIDB4MjgsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MjUsIDB4NjAsIDB4MTEsIDB4NzgsIDB4NDQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MjUsIDB4NjAsIDB4MTEsIDB4NzgsIDB4NDUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MjUsIDB4NjAsIDB4MTEsIDB4NzgsIDB4NDYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4ODcsIDB4NjQsIDB4ODAsIDB4MjksIDB4MDksIDB4RkIsIDB4NDcsIDB4RkYsIDB4MjUsIDB4NjAsIDB4MTEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MkYsIDB4NjAsIDB4NjMsIDB4NzgsIDB4NDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MkYsIDB4NjAsIDB4QjMsIDB4NzgsIDB4NDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MzAsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MDAsIDB4RTEsIDB4MDcsIDB4MDIsIDB4NjIsIDB4RkYsIDB4NjMsIDB4RkYsIDB4NjQsIDB4RkYsIDB4NjUsIDB4RkYsCisJIDB4NjYsIDB4RkYsIDB4QkYsIDB4RkUsIDB4QTEsIDB4RkYsIDB4ODIsIDB4RkYsIDB4ODgsIDB4RkYsIDB4NkMsIDB4NDAsIDB4NDEsIDB4RkYsIDB4QzQsIDB4RTIsCisJIDB4NDMsIDB4RkYsIDB4NUMsIDB4NDksIDB4MDgsIDB4RTEsIDB4QTIsIDB4NjAsIDB4MTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsCisJIDB4ODAsIDB4M0UsIDB4OUYsIDB4RkUsIDB4MDMsIDB4MDQsIDB4MzEsIDB4NjAsIDB4NzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTIsIDB4RkUsIDB4NDAsIDB4MDUsCisJIDB4RTAsIDB4RkUsIDB4NUIsIDB4MDUsIDB4RTEsIDB4RkUsIDB4RjIsIDB4MDQsIDB4MjksIDB4NDAsIDB4MDgsIDB4MjYsIDB4RUYsIDB4MDEsIDB4NzIsIDB4NDQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4QjUsIDB4RjMsIDB4RTgsIDB4ODUsIDB4RkYsIDB4QjcsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QjQsIDB4ODUsIDB4NzMsIDB4NDQsIDB4RDQsIDB4ODQsIDB4MTAsIDB4NjUsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4MDQsIDB4M0YsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MTMsIDB4MDAsIDB4MEIsIDB4NjAsIDB4RjgsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsCisJIDB4MTAsIDB4NjQsIDB4OTAsIDB4ODQsIDB4QTAsIDB4NTAsIDB4RjgsIDB4QTIsIDB4QTIsIDB4RDEsIDB4MEEsIDB4NjAsIDB4MTksIDB4NjQsIDB4OTAsIDB4ODQsCisJIDB4QTAsIDB4NTIsIDB4MDYsIDB4QTIsIDB4QTIsIDB4RDEsIDB4NDYsIDB4NjAsIDB4MDksIDB4NjQsIDB4OTAsIDB4ODQsIDB4QTAsIDB4NTAsIDB4RjIsIDB4RjQsCisJIDB4MzEsIDB4NjAsIDB4MTgsIDB4N0MsIDB4NjMsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDgsIDB4MDAsIDB4QTQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QjQsCisJIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4QUQsIDB4NEYsIDB4RkUsIDB4QjQsIDB4QTAsIDB4NUQsIDB4MDIsIDB4RUUsIDB4QkQsIDB4RkUsIDB4QkUsIDB4MDEsCisJIDB4MjEsIDB4NDYsIDB4NUUsIDB4NjIsIDB4OUEsIDB4RkYsIDB4MDcsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MjUsIDB4MTAsIDB4MDAsCisJIDB4QTIsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4NjIsIDB4NjIsIDB4MDEsIDB4NUQsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsCisJIDB4N0EsIDB4REMsIDB4NDQsIDB4RkYsIDB4MDYsIDB4MjUsIDB4MDQsIDB4MDAsIDB4MEUsIDB4RTEsIDB4MDIsIDB4NjAsIDB4MDEsIDB4RTEsIDB4OUUsIDB4MDEsCisJIDB4NjIsIDB4RkYsIDB4QzQsIDB4RTIsIDB4NDEsIDB4RkYsIDB4MEEsIDB4RTEsIDB4OTksIDB4MDEsIDB4QzgsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4MjksIDB4NDQsCisJIDB4MDgsIDB4QkMsIDB4NDAsIDB4NDksIDB4MDUsIDB4RTEsIDB4MzEsIDB4NjAsIDB4MUEsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RjIsIDB4RjMsIDB4MDYsIDB4MTgsCisJIDB4MjgsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MjgsIDB4NDAsIDB4NDgsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MDIsIDB4QkMsIDB4RjIsIDB4RkIsCisJIDB4M0YsIDB4NDAsIDB4MDEsIDB4MkIsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NjcsIDB4NEMsIDB4MDYsIDB4NjEsIDB4Q0QsIDB4ODEsIDB4MDQsIDB4MjUsCisJIDB4MzAsIDB4MDAsIDB4ODcsIDB4NEMsIDB4RkIsIDB4MDIsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDIsIDB4MDAsIDB4MTUsIDB4NjAsIDB4NkYsIDB4NkIsCisJIDB4RjMsIDB4NjAsIDB4QTAsIDB4NjQsIDB4MDQsIDB4MjUsIDB4MjUsIDB4MDAsIDB4ODAsIDB4NEMsIDB4MzAsIDB4NjQsIDB4M0EsIDB4REIsIDB4NDQsIDB4RkYsCisJIDB4MDQsIDB4MjUsIDB4MUYsIDB4MDAsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjUsIDB4NDQsIDB4MzcsIDB4MzYsIDB4QjQsIDB4ODQsIDB4NkUsIDB4MzYsCisJIDB4QjQsIDB4ODQsIDB4ODAsIDB4NEUsIDB4MjQsIDB4NDEsIDB4MDQsIDB4MjUsIDB4MTQsIDB4MDAsIDB4NjEsIDB4NEMsIDB4NjQsIDB4QTEsIDB4NjEsIDB4NTQsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjUsIDB4MEQsIDB4MDAsIDB4NjcsIDB4NEUsIDB4MDcsIDB4NjQsIDB4MUMsIDB4RkIsIDB4MDAsIDB4RTEsCisJIDB4MDIsIDB4NjAsIDB4MDEsIDB4RTEsIDB4NTMsIDB4MDEsIDB4MzMsIDB4RjMsIDB4RkQsIDB4MTEsIDB4RkMsIDB4MTgsIDB4NDAsIDB4NjQsIDB4M0EsIDB4REIsCisJIDB4MEEsIDB4MDAsIDB4QzQsIDB4RTIsIDB4MjcsIDB4NDQsIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4NDIsIDB4NjQsIDB4M0EsIDB4REIsIDB4NjcsIDB4NEMsCisJIDB4MDIsIDB4MDAsIDB4NDEsIDB4NjQsIDB4M0EsIDB4REIsIDB4NjIsIDB4RkYsIDB4MDgsIDB4RTEsIDB4RTIsIDB4RkUsIDB4NzIsIDB4NTIsIDB4NUMsIDB4NDksCisJIDB4MzIsIDB4N0IsIDB4NEQsIDB4RTIsIDB4M0IsIDB4MDEsIDB4MDgsIDB4RTEsIDB4MzksIDB4MDEsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsCisJIDB4MzAsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MDAsIDB4RTEsIDB4MDIsIDB4MDIsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODIsIDB4RkYsIDB4ODgsIDB4RkYsCisJIDB4NDgsIDB4RTIsIDB4MDEsIDB4NzAsIDB4Q0UsIDB4RjEsIDB4MDAsIDB4NkIsIDB4ODksIDB4RkYsIDB4NjQsIDB4NTQsIDB4ODgsIDB4RkYsIDB4OUYsIDB4RkUsCisJIDB4MDIsIDB4MDUsIDB4NjQsIDB4NDQsIDB4NjAsIDB4NTQsIDB4Q0QsIDB4RTIsIDB4QzIsIDB4NjQsIDB4M0EsIDB4REIsIDB4QkMsIDB4RkYsIDB4QjUsIDB4RkYsCisJIDB4MUQsIDB4RkYsIDB4MjYsIDB4NDQsIDB4MDIsIDB4QjQsIDB4NDAsIDB4NDYsIDB4M0MsIDB4NDQsIDB4MDAsIDB4QkMsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MDMsCisJIDB4MjcsIDB4NDAsIDB4MjYsIDB4MjIsIDB4MDMsIDB4MDAsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MjcsIDB4NDQsIDB4MjAsIDB4MkEsCisJIDB4MDQsIDB4MDAsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QjAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4NUMsIDB4NEQsIDB4MjcsIDB4NDQsIDB4MTgsIDB4QjQsCisJIDB4NDAsIDB4NDcsIDB4MDAsIDB4RTEsIDB4NkMsIDB4NDAsIDB4NDQsIDB4RTIsIDB4QzQsIDB4RTIsIDB4NDcsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsCisJIDB4MzIsIDB4RjEsIDB4MDgsIDB4MjksIDB4MDksIDB4MDAsIDB4NjQsIDB4NDAsIDB4MDcsIDB4MjIsIDB4MDYsIDB4MDAsIDB4NDMsIDB4RkYsIDB4MjcsIDB4NDQsCisJIDB4MTAsIDB4QkMsIDB4NDAsIDB4NDcsIDB4MDAsIDB4NjQsIDB4MzIsIDB4RkIsIDB4MzEsIDB4NDEsIDB4M0MsIDB4NDQsIDB4MDEsIDB4QjEsIDB4MDAsIDB4QkMsCisJIDB4MEEsIDB4MDIsIDB4MDksIDB4MDMsIDB4MzIsIDB4RjMsIDB4MDAsIDB4N0MsIDB4MDEsIDB4QjQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDMsIDB4MzIsIDB4RjksCisJIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4NDgsIDB4NjAsIDB4MkQsIDB4N0QsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NkIsIDB4MDAsIDB4NjQsCisJIDB4MzMsIDB4RkIsIDB4MEMsIDB4NjAsIDB4MTYsIDB4NjQsIDB4QTAsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzIsIDB4RjMsIDB4MDgsIDB4MjksCisJIDB4MEEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDcsIDB4MjIsIDB4MDcsIDB4MDAsIDB4RkUsIDB4QjQsIDB4MzIsIDB4RkIsIDB4MjcsIDB4NDQsIDB4MTAsIDB4QkMsCisJIDB4RjcsIDB4QjQsIDB4NDAsIDB4NDcsIDB4NDMsIDB4RkYsIDB4MDAsIDB4NjQsIDB4M0EsIDB4REIsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MzEsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MzMsIDB4RkIsIDB4MDEsIDB4NjAsIDB4MEEsIDB4RTEsIDB4RTUsIDB4RkUsIDB4MUQsIDB4MDUsCisJIDB4MjcsIDB4NDQsIDB4MTAsIDB4MjYsIDB4MUQsIDB4MDAsIDB4OUYsIDB4RkUsIDB4MDIsIDB4MDQsIDB4MDIsIDB4RTEsIDB4MTAsIDB4MDAsIDB4M0UsIDB4RTEsCisJIDB4MzEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MEMsIDB4MDAsIDB4MEUsIDB4MEEsIDB4MjgsIDB4NDQsIDB4MDQsIDB4MjcsIDB4MDcsIDB4MDAsIDB4RDQsIDB4MzYsCisJIDB4MDUsIDB4MDAsIDB4QzQsIDB4MzYsIDB4MDMsIDB4MDAsIDB4QUUsIDB4NEYsIDB4RjcsIDB4QjQsIDB4QTAsIDB4NUUsIDB4QkYsIDB4RTEsIDB4QTEsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4QUIsIDB4NjAsIDB4MkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4NjAsIDB4RUMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjcsIDB4NDQsIDB4MDgsIDB4MjYsIDB4RkYsIDB4RkYsIDB4QkEsIDB4NjAsIDB4NzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDgsIDB4RjMsIDB4MzIsIDB4RjEsCisJIDB4MDAsIDB4NjMsIDB4NjQsIDB4NDAsIDB4MDMsIDB4MjIsIDB4NjYsIDB4MDAsIDB4MzEsIDB4NDAsIDB4MDgsIDB4MjYsIDB4RjQsIDB4MDEsIDB4Q0QsIDB4RTIsCisJIDB4ODQsIDB4RTEsIDB4NzAsIDB4NDEsIDB4QUQsIDB4ODAsIDB4NzEsIDB4NDAsIDB4ODAsIDB4MjcsIDB4RUQsIDB4MTIsIDB4MDMsIDB4MDMsIDB4QkEsIDB4NjAsCisJIDB4RTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QzQsIDB4RTIsIDB4MzIsIDB4RkQsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsCisJIDB4REYsIDB4MDEsIDB4MDAsIDB4NjMsIDB4MzIsIDB4RkQsIDB4NkMsIDB4NDAsIDB4M0MsIDB4NDYsIDB4M0UsIDB4RjIsIDB4MkEsIDB4RjAsIDB4MjcsIDB4NDEsCisJIDB4NDQsIDB4NDgsIDB4MjAsIDB4QjksIDB4MDEsIDB4QjQsIDB4RjcsIDB4QjEsIDB4MEEsIDB4MDMsIDB4NjQsIDB4NDAsIDB4MDgsIDB4MjcsIDB4MDcsIDB4MDAsCisJIDB4MEYsIDB4NjAsIDB4OTIsIDB4NjMsIDB4MDAsIDB4NjQsIDB4NDUsIDB4RkIsIDB4NDYsIDB4RkIsIDB4QkQsIDB4REIsIDB4QTMsIDB4REIsIDB4Q0IsIDB4MEEsCisJIDB4MzEsIDB4NjAsIDB4MEUsIDB4N0MsIDB4QTQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MTcsIDB4MTgsIDB4MjgsIDB4NDAsIDB4RDQsIDB4MzYsIDB4MTQsIDB4MDAsCisJIDB4QUMsIDB4NEMsIDB4ODAsIDB4MkEsIDB4MTEsIDB4MDAsIDB4MzEsIDB4NjAsIDB4MTQsIDB4N0MsIDB4QTQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MTgsCisJIDB4MzEsIDB4NjAsIDB4MTYsIDB4N0MsIDB4QTQsIDB4RDMsIDB4MzEsIDB4NjAsIDB4MTAsIDB4N0MsIDB4QTQsIDB4RDMsIDB4NjAsIDB4NDUsIDB4RDQsIDB4ODAsCisJIDB4REMsIDB4ODQsIDB4MDIsIDB4MDMsIDB4QTQsIDB4REIsIDB4QUYsIDB4MDEsIDB4MzEsIDB4NjAsIDB4MTAsIDB4N0MsIDB4MDAsIDB4NjQsIDB4QTQsIDB4REIsCisJIDB4NDEsIDB4NDcsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MEQsIDB4MDAsIDB4RjYsIDB4RkUsIDB4NjcsIDB4NEMsIDB4MDUsIDB4NjAsIDB4NjksIDB4NkIsCisJIDB4MzEsIDB4NjAsIDB4MEUsIDB4N0MsIDB4QTQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MTgsIDB4QUUsIDB4NEYsIDB4MDgsIDB4QkMsIDB4MDAsIDB4N0YsCisJIDB4QTAsIDB4NUUsIDB4MDIsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4RjAsIDB4RkUsIDB4ODQsIDB4RkYsIDB4QkIsIDB4NjAsIDB4MTgsIDB4NjQsCisJIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4RTUsIDB4RkUsIDB4MDMsIDB4MDQsIDB4QTgsIDB4NjAsIDB4MjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTQsIDB4RkUsCisJIDB4MEEsIDB4MDQsIDB4MUQsIDB4RkYsIDB4MDAsIDB4RUIsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsCisJIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4NDMsIDB4RkYsIDB4RTYsIDB4RkUsIDB4MDMsIDB4MDUsIDB4QTMsIDB4NjAsIDB4NEIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4M0MsIDB4NDQsIDB4NjAsIDB4NDYsIDB4MEYsIDB4RjAsIDB4NDAsIDB4NDIsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4QTYsIDB4NjAsIDB4QjEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4NjQsIDB4M0EsIDB4REIsIDB4MUMsIDB4NDIsIDB4MjIsIDB4NDYsIDB4MTMsIDB4RjIsCisJIDB4RkYsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MkEsIDB4RjIsIDB4NDAsIDB4NDUsIDB4NDAsIDB4NDgsIDB4MDQsIDB4MkIsIDB4MTcsIDB4MDAsIDB4MTYsIDB4RjIsCisJIDB4MUQsIDB4RjIsIDB4NDAsIDB4NDMsIDB4MEYsIDB4RjIsIDB4NDAsIDB4NDQsIDB4MjUsIDB4NUUsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NDAsIDB4NDUsCisJIDB4MEYsIDB4NjQsIDB4MTQsIDB4RjAsIDB4MzUsIDB4RjIsIDB4QTAsIDB4ODIsIDB4MEYsIDB4QjQsIDB4Q0EsIDB4ODUsIDB4RDQsIDB4ODAsIDB4MTAsIDB4RjIsCisJIDB4MDEsIDB4MDIsIDB4MkIsIDB4RkEsIDB4MjcsIDB4NDQsIDB4NDAsIDB4QkMsIDB4NDAsIDB4NDcsIDB4MTMsIDB4MDAsIDB4MTcsIDB4RjIsIDB4MkMsIDB4RjAsCisJIDB4NDAsIDB4NDMsIDB4MUIsIDB4RjIsIDB4MUQsIDB4RkEsIDB4NDAsIDB4NDQsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDIsIDB4MDAsIDB4QUIsIDB4RkMsCisJIDB4MDUsIDB4MDAsIDB4MjgsIDB4NDAsIDB4QTQsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MTEsIDB4RjIsIDB4MkIsIDB4RkEsIDB4MjcsIDB4NDQsIDB4QkYsIDB4QjQsCisJIDB4NDAsIDB4NDcsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsIDB4RkYsIDB4RkYsIDB4QUIsIDB4NjAsIDB4NEEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4NDYsCisJIDB4MkMsIDB4RjAsIDB4MjcsIDB4NDQsIDB4REYsIDB4QjQsIDB4NDAsIDB4NDcsIDB4QjUsIDB4RkYsIDB4QkMsIDB4RkYsIDB4NDcsIDB4RkYsIDB4QjcsIDB4RkYsCisJIDB4QjQsIDB4RkYsIDB4NDgsIDB4NjAsIDB4MkQsIDB4N0QsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NkIsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDksIDB4MDAsCisJIDB4MjgsIDB4NDQsIDB4MDQsIDB4MjcsIDB4MDUsIDB4MDAsIDB4RDQsIDB4M0EsIDB4MDMsIDB4MDAsIDB4QUUsIDB4NEYsIDB4RjcsIDB4QjQsIDB4QTAsIDB4NUUsCisJIDB4MUIsIDB4MDAsIDB4MkEsIDB4RjAsIDB4MDEsIDB4NjUsIDB4NjQsIDB4NDAsIDB4QTQsIDB4M0EsIDB4MDQsIDB4NjUsIDB4MjcsIDB4NDQsIDB4MzQsIDB4ODcsCisJIDB4MzYsIDB4RjMsIDB4QjQsIDB4RkYsIDB4NjAsIDB4NUIsIDB4NEQsIDB4RTIsIDB4MDQsIDB4NjQsIDB4M0EsIDB4REIsIDB4MDEsIDB4NjAsIDB4MEEsIDB4RTEsCisJIDB4MjgsIDB4NDQsIDB4MDQsIDB4MjcsIDB4MDUsIDB4MDAsIDB4RDQsIDB4M0EsIDB4MDMsIDB4MDAsIDB4QUUsIDB4NEYsIDB4RjcsIDB4QjQsIDB4QTAsIDB4NUUsCisJIDB4MkIsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4MDYsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjIsIDB4NDYsIDB4MDEsIDB4NjQsCisJIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4QkEsIDB4NjAsIDB4RjAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QjUsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDAsCisJIDB4M0YsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDMsIDB4MDAsIDB4NjcsIDB4NEMsIDB4MDUsIDB4NjAsIDB4NjksIDB4NkIsIDB4MDIsIDB4RTEsIDB4MDEsIDB4NjAsCisJIDB4MDgsIDB4RTEsIDB4QzQsIDB4RTIsIDB4MDgsIDB4NjQsIDB4M0EsIDB4REIsIDB4RjAsIDB4RkUsIDB4MjUsIDB4NDYsIDB4MDEsIDB4RjIsIDB4NjEsIDB4NDUsCisJIDB4RDQsIDB4OUUsIDB4MjEsIDB4NDYsIDB4MTYsIDB4RkEsIDB4MkEsIDB4NDQsIDB4NzIsIDB4NDUsIDB4MjQsIDB4RkEsIDB4QjUsIDB4RjMsIDB4MDYsIDB4MDQsCisJIDB4RTQsIDB4RTIsIDB4REMsIDB4OUMsIDB4MjksIDB4NDAsIDB4MDEsIDB4MjYsIDB4NjQsIDB4NDQsIDB4QjUsIDB4RjksIDB4MjUsIDB4RkEsIDB4QjYsIDB4RjMsCisJIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4QjYsIDB4RkIsIDB4MjgsIDB4RkEsIDB4QjcsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4QjcsIDB4RkIsCisJIDB4MjksIDB4RkEsIDB4MkQsIDB4NDQsIDB4MDQsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MjgsIDB4NDAsIDB4QTQsIDB4MzYsIDB4MDMsIDB4MDAsIDB4QTUsIDB4NjAsCisJIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDMsIDB4ODQsIDB4QkIsIDB4RkMsIDB4QjMsIDB4MjEsIDB4NDYsIDB4MDEsIDB4NUQsIDB4MEYsIDB4RkMsCisJIDB4NUMsIDB4NDYsIDB4MjUsIDB4NDQsIDB4MDYsIDB4RkEsIDB4MDUsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MTMsIDB4MDAsIDB4NTAsIDB4RkUsCisJIDB4MjgsIDB4NDAsIDB4MDgsIDB4M0EsIDB4MTIsIDB4MDAsIDB4MkYsIDB4RjIsIDB4MzAsIDB4RjAsIDB4NjAsIDB4NDMsIDB4MzEsIDB4RjIsIDB4MjIsIDB4NDYsCisJIDB4NjQsIDB4NDEsIDB4MkMsIDB4RjAsIDB4MkQsIDB4RjAsIDB4RDMsIDB4ODAsIDB4MkUsIDB4RjAsIDB4RDEsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MjcsIDB4NDQsCisJIDB4MDksIDB4MEMsIDB4MDMsIDB4MDAsIDB4MjcsIDB4NDQsIDB4MDYsIDB4MjIsIDB4MDUsIDB4MDAsIDB4QjgsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDIsIDB4NjQsCisJIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4RDQsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MEQsIDB4NjQsIDB4M0EsIDB4REIsIDB4MzEsIDB4NjAsIDB4MTIsIDB4N0MsCisJIDB4N0MsIDB4NDQsIDB4QTQsIDB4REIsIDB4MjEsIDB4NDYsIDB4MUMsIDB4RjIsIDB4N0MsIDB4RjEsIDB4RkYsIDB4QjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MDYsIDB4NjQsIDB4NDQsIDB4NDAsIDB4NDUsIDB4MEEsIDB4MzYsIDB4NzAsIDB4NjQsIDB4MTQsIDB4MzYsIDB4MzgsIDB4NjQsIDB4MzcsIDB4M0EsCisJIDB4MDMsIDB4MDAsIDB4MDQsIDB4N0YsIDB4NDAsIDB4NDUsIDB4MTUsIDB4NjQsIDB4NkUsIDB4M0EsIDB4MDMsIDB4MDAsIDB4ODQsIDB4N0YsIDB4NDAsIDB4NDUsCisJIDB4MEIsIDB4NjQsIDB4NDAsIDB4NDQsIDB4MDAsIDB4NjMsIDB4MjgsIDB4NDQsIDB4QTQsIDB4MzYsIDB4MEIsIDB4MDAsIDB4MDQsIDB4MkIsIDB4MDksIDB4MDAsCisJIDB4MzAsIDB4RjMsIDB4MjQsIDB4NDUsIDB4RDQsIDB4ODQsIDB4Q0EsIDB4NjUsIDB4RDQsIDB4ODMsIDB4MzEsIDB4NjAsIDB4MTIsIDB4N0MsIDB4MDEsIDB4NjQsCisJIDB4QTQsIDB4REIsIDB4RDQsIDB4NjQsIDB4MUEsIDB4MDAsIDB4MEYsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjEsIDB4NDYsIDB4NzAsIDB4NjMsIDB4MUMsIDB4RjIsCisJIDB4Q0EsIDB4NjUsIDB4NDAsIDB4NDUsIDB4MEEsIDB4MzYsIDB4NzAsIDB4NjQsIDB4MTQsIDB4MzYsIDB4MzgsIDB4NjQsIDB4MzcsIDB4M0EsIDB4MDMsIDB4MDAsCisJIDB4MDQsIDB4N0YsIDB4NDAsIDB4NDUsIDB4MTUsIDB4NjQsIDB4NkUsIDB4M0EsIDB4MDMsIDB4MDAsIDB4ODQsIDB4N0YsIDB4NDAsIDB4NDUsIDB4MEIsIDB4NjQsCisJIDB4NDAsIDB4NDQsIDB4MkIsIDB4RjIsIDB4QzQsIDB4ODUsIDB4RDQsIDB4ODMsIDB4QzQsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MkYsIDB4RjAsIDB4QjAsIDB4RjAsCisJIDB4QjEsIDB4RjIsIDB4MDAsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODAsIDB4NEUsIDB4ODMsIDB4NEMsIDB4OUEsIDB4RkYsIDB4ODQsIDB4NEMsCisJIDB4ODUsIDB4NEMsIDB4ODEsIDB4NEMsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODcsIDB4NEYsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEYsIDB4ODcsIDB4NEQsCisJIDB4ODcsIDB4NEMsIDB4MDEsIDB4MDgsIDB4MDEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkEsIDB4NDQsIDB4QkMsIDB4RkYsIDB4QzQsIDB4RTIsIDB4MEMsIDB4NzQsIDB4MDQsIDB4RTEsIDB4QTEsIDB4RkYsCisJIDB4MzUsIDB4RjMsIDB4QzQsIDB4RTIsIDB4NjAsIDB4NTQsIDB4ODksIDB4RkYsIDB4MTMsIDB4NzQsIDB4ODgsIDB4RkYsIDB4QjUsIDB4RkYsIDB4NDcsIDB4RkYsCisJIDB4MjksIDB4NDQsIDB4RjcsIDB4QjQsIDB4NDAsIDB4NDksIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4NDgsIDB4NjAsIDB4MkQsIDB4N0QsIDB4MDgsIDB4NjAsCisJIDB4MDAsIDB4NkIsIDB4MjgsIDB4NDAsIDB4QzQsIDB4MzYsIDB4MDgsIDB4MDAsIDB4MzEsIDB4NjAsIDB4MTIsIDB4N0MsIDB4QTQsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4MDMsIDB4MUIsIDB4QUUsIDB4NEYsIDB4RjcsIDB4QjQsIDB4QTAsIDB4NUUsIDB4MjcsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDUsIDB4MDAsIDB4RkUsIDB4QjQsCisJIDB4NDAsIDB4NDcsIDB4QTQsIDB4NjAsIDB4N0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4NjAsIDB4M0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NDAsCisJIDB4QjQsIDB4M0EsIDB4MDksIDB4MDAsIDB4MjcsIDB4NDQsIDB4MDcsIDB4MjIsIDB4MDUsIDB4MDAsIDB4RjgsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDIsIDB4NjQsCisJIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4OTAsIDB4MDEsIDB4MjgsIDB4NDQsIDB4RDQsIDB4MzYsIDB4MDMsIDB4MDAsIDB4QTYsIDB4NjAsIDB4OTgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NDgsIDB4RTIsIDB4MjcsIDB4NDQsIDB4RkIsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MkQsIDB4NjAsIDB4NUEsIDB4NjMsIDB4QTMsIDB4RDMsCisJIDB4QjAsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzQsIDB4RkIsIDB4MUMsIDB4NDIsIDB4MjIsIDB4NDYsIDB4MkEsIDB4RjAsCisJIDB4RjcsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4Q0MsIDB4MDAsIDB4MjIsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MjIsIDB4MjYsIDB4NDIsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDcsIDB4MDAsCisJIDB4QzIsIDB4MDAsIDB4MDQsIDB4MkIsIDB4QzAsIDB4MDAsIDB4QTksIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4MDEsIDB4MDAsIDB4MDcsIDB4RjQsCisJIDB4NDcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4NDcsIDB4RkEsIDB4MEQsIDB4NjAsIDB4M0UsIDB4NjIsIDB4ODAsIDB4RkYsIDB4QkUsIDB4NjAsCisJIDB4NzgsIDB4NDQsIDB4MDIsIDB4QTQsIDB4QTIsIDB4REIsIDB4REUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODIsIDB4RkYsIDB4QTksIDB4RjMsIDB4NjYsIDB4NUMsCisJIDB4RDAsIDB4ODAsIDB4MDAsIDB4N0MsIDB4MDcsIDB4MDMsIDB4NjYsIDB4NDMsIDB4MjIsIDB4NDYsIDB4MjIsIDB4RjIsIDB4NjMsIDB4NDYsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MDEsIDB4MDAsIDB4M0MsIDB4RjEsIDB4NDcsIDB4RjAsIDB4NjQsIDB4NDEsIDB4NjQsIDB4NDcsIDB4RkYsIDB4QjQsIDB4NjAsIDB4NUYsCisJIDB4MjAsIDB4QkMsIDB4ODAsIDB4MjYsIDB4ODAsIDB4QUMsIDB4NjAsIDB4NDcsIDB4MjIsIDB4NDYsIDB4M0EsIDB4RkEsIDB4NjQsIDB4NDQsIDB4MjAsIDB4N0YsCisJIDB4MzQsIDB4OTQsIDB4M0IsIDB4RkEsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUEsIDB4MEYsIDB4NjQsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4ODUsIDB4MDAsIDB4MkEsIDB4RjIsIDB4MDAsIDB4NjAsCisJIDB4N0MsIDB4NjIsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MjcsIDB4MDAsIDB4QTIsIDB4RDMsIDB4MDAsIDB4NjEsIDB4NjAsIDB4RkUsIDB4QTAsIDB4RDMsCisJIDB4REUsIDB4ODIsIDB4QTIsIDB4RDEsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4NjQsIDB4NUYsIDB4REMsIDB4ODQsIDB4RjEsIDB4ODEsIDB4QzAsIDB4MkIsCisJIDB4MDQsIDB4MDAsIDB4ODAsIDB4MkEsIDB4MDIsIDB4MDAsIDB4N0YsIDB4QTQsIDB4REMsIDB4ODQsIDB4RkYsIDB4M0IsIDB4MDMsIDB4MDAsIDB4NjAsIDB4NDcsCisJIDB4REMsIDB4ODcsIDB4MDEsIDB4NjEsIDB4QzAsIDB4ODAsIDB4MDAsIDB4MzYsIDB4REMsIDB4ODQsIDB4NEUsIDB4REIsIDB4NjAsIDB4RkUsIDB4REEsIDB4ODIsCisJIDB4QTIsIDB4RDEsIDB4RkYsIDB4RkYsIDB4QzEsIDB4ODQsIDB4RjAsIDB4MjIsIDB4MTAsIDB4QTQsIDB4RjAsIDB4MkEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4N0MsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDMsCisJIDB4NUEsIDB4RDEsIDB4M0EsIDB4RkEsIDB4M0IsIDB4RjgsIDB4NzQsIDB4NjIsIDB4QTIsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4RTAsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDEsIDB4NUEsIDB4RDEsIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDQsCisJIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTQsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTUsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTYsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4NjUsIDB4NDAsIDB4MEQsIDB4M0EsIDB4MUMsIDB4MDAsIDB4NjQsIDB4NDcsIDB4RTgsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsCisJIDB4RTksIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUEsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUIsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUMsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4NjQsIDB4NDcsIDB4RUUsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUYsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDgsIDB4NjAsCisJIDB4MDAsIDB4RUEsIDB4NjUsIDB4NDQsIDB4MDIsIDB4QTQsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsCisJIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4MEIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4N0YsIDB4QjQsIDB4MEMsIDB4RjAsIDB4MDQsIDB4MDIsCisJIDB4NjQsIDB4NDYsIDB4MDAsIDB4RjAsIDB4MDQsIDB4NjQsIDB4MjIsIDB4NDYsIDB4MDMsIDB4RkEsIDB4NjAsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MDEsIDB4RjIsCisJIDB4RkMsIDB4QTEsIDB4NjEsIDB4NDUsIDB4RDQsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDIsIDB4MDAsIDB4RjAsIDB4MDQsIDB4NjMsIDB4NjQsIDB4NDYsCisJIDB4MDEsIDB4RjIsIDB4MjIsIDB4NDYsIDB4MUEsIDB4RkEsIDB4MDMsIDB4RkMsIDB4MDIsIDB4MDAsIDB4MjIsIDB4NDYsIDB4MUEsIDB4RkEsIDB4MzUsIDB4RjIsCisJIDB4MDQsIDB4RjgsIDB4REMsIDB4ODQsIDB4MzUsIDB4RkEsIDB4MTQsIDB4RjIsIDB4MEYsIDB4QjUsIDB4MEYsIDB4QjQsIDB4Q0MsIDB4ODQsIDB4OTQsIDB4ODAsCisJIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MkEsIDB4RjIsIDB4MDEsIDB4MDIsIDB4OTQsIDB4ODQsIDB4MkEsIDB4RkEsIDB4OTUsIDB4RkMsIDB4MDYsIDB4MDAsCisJIDB4QzQsIDB4M0EsIDB4MDcsIDB4MDAsIDB4MjcsIDB4NDQsIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDcsIDB4NDgsIDB4RTIsIDB4QTQsIDB4NjAsIDB4MEIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjgsIDB4NDQsIDB4MDQsIDB4MjYsIDB4MDUsIDB4MDAsIDB4NjgsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MzIsIDB4NDQsIDB4MDAsIDB4MjcsCisJIDB4MDMsIDB4MDAsIDB4QTMsIDB4NjAsIDB4NEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4NjQsIDB4M0EsIDB4REIsIDB4QTMsIDB4NjAsIDB4NEIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEUsIDB4NjQsIDB4M0EsIDB4REIsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4M0MsIDB4NDYsIDB4MkEsIDB4RjIsIDB4MTMsIDB4RjAsCisJIDB4QTQsIDB4ODQsIDB4QjQsIDB4QkMsIDB4NDAsIDB4NDgsIDB4N0MsIDB4RjEsIDB4NjQsIDB4NDcsIDB4RkYsIDB4QjQsIDB4NjAsIDB4NDUsIDB4RDAsIDB4ODAsCisJIDB4NzAsIDB4NjEsIDB4MDEsIDB4MDYsIDB4NjQsIDB4NDQsIDB4MEEsIDB4MzYsIDB4NzAsIDB4NjQsIDB4MTQsIDB4MzYsIDB4MzgsIDB4NjQsIDB4MzcsIDB4MzYsCisJIDB4MTUsIDB4NjQsIDB4NkUsIDB4MzYsIDB4MEIsIDB4NjQsIDB4NDAsIDB4NEUsIDB4QTAsIDB4NjMsIDB4MEEsIDB4NjQsIDB4NjUsIDB4NDAsIDB4MEEsIDB4MzYsCisJIDB4MDMsIDB4MDAsIDB4MzgsIDB4NjEsIDB4MTQsIDB4NjQsIDB4RUIsIDB4ODMsIDB4NDAsIDB4NDUsIDB4NDMsIDB4NDQsIDB4MDIsIDB4NjAsIDB4NUUsIDB4NjUsCisJIDB4MkEsIDB4RjIsIDB4MkIsIDB4RjIsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MkIsIDB4MDQsIDB4MDAsIDB4MkUsIDB4NDUsIDB4RDQsIDB4ODUsIDB4QzUsIDB4ODQsCisJIDB4MDUsIDB4MDAsIDB4MUIsIDB4RjAsIDB4QzUsIDB4ODQsIDB4QzAsIDB4ODQsIDB4MkUsIDB4NDUsIDB4QzQsIDB4ODQsIDB4NjAsIDB4NDMsIDB4MjgsIDB4NDQsCisJIDB4MDAsIDB4RTEsIDB4QTEsIDB4RkYsIDB4ODAsIDB4NEUsIDB4ODMsIDB4NEMsIDB4OUEsIDB4RkYsIDB4NTYsIDB4NjIsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsCisJIDB4N0EsIDB4RDQsIDB4NUMsIDB4NjIsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODcsIDB4NEYsCisJIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEYsIDB4ODcsIDB4NEQsIDB4ODcsIDB4NEMsIDB4MDEsIDB4MDgsIDB4MDEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4ODcsIDB4NEMsCisJIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkEsIDB4NDQsIDB4QkMsIDB4RkYsIDB4QjUsIDB4RkYsCisJIDB4NDcsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDIsIDB4QkMsIDB4NDAsIDB4NDcsIDB4MzYsIDB4RjMsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4NDgsIDB4NjAsCisJIDB4MkQsIDB4N0QsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NkIsIDB4NjAsIDB4NUIsIDB4NEQsIDB4RTIsIDB4QTQsIDB4NjAsIDB4NkMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjEsIDB4NDYsIDB4QjUsIDB4RkYsIDB4QkMsIDB4RkYsIDB4NDcsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4NDgsIDB4NjAsIDB4MkQsIDB4N0QsCisJIDB4MDgsIDB4NjAsIDB4MDAsIDB4NkIsIDB4MjgsIDB4NDQsIDB4MDQsIDB4MjcsIDB4MDksIDB4MDAsIDB4RDQsIDB4MzYsIDB4MDQsIDB4MDAsIDB4MEMsIDB4MjIsCisJIDB4MDIsIDB4MDAsIDB4MEMsIDB4M0EsIDB4MDMsIDB4MDAsIDB4QUUsIDB4NEYsIDB4RjcsIDB4QjQsIDB4QTAsIDB4NUUsIDB4MjYsIDB4NDMsIDB4MjUsIDB4NDQsCisJIDB4MDYsIDB4RkEsIDB4MkEsIDB4NDQsIDB4NzIsIDB4NDUsIDB4MjQsIDB4RkEsIDB4QjUsIDB4RjMsIDB4MDYsIDB4MDQsIDB4RTQsIDB4RTIsIDB4REMsIDB4OUMsCisJIDB4MjksIDB4NDAsIDB4MDEsIDB4MjYsIDB4NjQsIDB4NDQsIDB4QjUsIDB4RjksIDB4MjUsIDB4RkEsIDB4QjYsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsCisJIDB4QjYsIDB4RkIsIDB4MjgsIDB4RkEsIDB4QjcsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4QjcsIDB4RkIsIDB4MjksIDB4RkEsIDB4MkQsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MEUsIDB4MDAsIDB4MUQsIDB4RkYsIDB4MjYsIDB4NDQsIDB4MDIsIDB4QkMsIDB4NDAsIDB4NDYsIDB4MjcsIDB4NDQsIDB4MDcsIDB4MjIsCisJIDB4MDUsIDB4MDAsIDB4RjgsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDYsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MzAsIDB4RjEsIDB4NzYsIDB4MDAsCisJIDB4RkMsIDB4QjMsIDB4MzIsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MEEsIDB4QkIsIDB4MEYsIDB4RkMsIDB4Q0IsIDB4RkUsIDB4QTMsIDB4NjAsCisJIDB4NEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkQsIDB4NDQsIDB4MDQsIDB4MjYsIDB4MjgsIDB4MDAsIDB4MEYsIDB4RkMsIDB4MDUsIDB4RkYsIDB4REMsIDB4RjMsCisJIDB4MjgsIDB4NDAsIDB4ODAsIDB4M0EsIDB4MjIsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDMsIDB4M0EsIDB4MUYsIDB4MDAsIDB4MzIsIDB4RjIsIDB4ODEsIDB4RjEsCisJIDB4MzMsIDB4RjIsIDB4RDAsIDB4ODAsIDB4ODIsIDB4RjEsIDB4MTksIDB4MDIsIDB4RDAsIDB4ODAsIDB4MzQsIDB4RjIsIDB4ODMsIDB4RjEsIDB4MTUsIDB4MDIsCisJIDB4RDAsIDB4ODAsIDB4M0MsIDB4NDQsIDB4MTIsIDB4MDIsIDB4QUMsIDB4ODYsIDB4QkIsIDB4RkUsIDB4MEYsIDB4MDMsIDB4MkEsIDB4RjIsIDB4MjEsIDB4NDYsCisJIDB4NjAsIDB4NDAsIDB4ODAsIDB4M0EsIDB4MEEsIDB4MDAsIDB4MDEsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MDAsIDB4NjQsIDB4MzIsIDB4RkIsCisJIDB4ODQsIDB4RkYsIDB4QkIsIDB4NjAsIDB4MTgsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4MzAsIDB4RjEsIDB4MjcsIDB4NDQsIDB4MDUsIDB4MjIsCisJIDB4MkQsIDB4MDAsIDB4RkEsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MkQsIDB4NDQsIDB4MTAsIDB4MkEsIDB4MjQsIDB4MDAsIDB4MjgsIDB4NDAsIDB4RDQsIDB4M0EsCisJIDB4MjEsIDB4MDAsIDB4MzEsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDAsIDB4N0MsIDB4MkIsIDB4NDQsIDB4RDAsIDB4ODAsIDB4NzAsIDB4NDUsIDB4MDIsIDB4MjgsCisJIDB4NjQsIDB4NDQsIDB4QzQsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjQsIDB4MDAsIDB4QjQsIDB4NjAsIDB4NTAsIDB4MDgsIDB4MjgsIDB4MDEsIDB4MDAsCisJIDB4MjAsIDB4MjksIDB4NkQsIDB4RTIsIDB4MUMsIDB4NjAsIDB4OUEsIDB4NjMsIDB4MUQsIDB4RjAsIDB4QzAsIDB4NjQsIDB4QzAsIDB4ODQsIDB4QTMsIDB4RDEsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4QzAsIDB4ODQsIDB4QTMsIDB4REIsIDB4QTQsIDB4NjAsCisJIDB4N0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MDcsIDB4MDAsIDB4MDIsIDB4MkEsIDB4MDUsIDB4MDAsCisJIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDYsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MDUsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjgsIDB4NDQsCisJIDB4QTQsIDB4M0EsIDB4MDQsIDB4MDAsIDB4MzksIDB4RjEsIDB4MjUsIDB4NDQsIDB4MEEsIDB4MzYsIDB4MzgsIDB4RjEsIDB4MzEsIDB4NDAsIDB4MDgsIDB4MjYsCisJIDB4MDAsIDB4N0MsIDB4MkIsIDB4NDQsIDB4RDAsIDB4ODAsIDB4NzAsIDB4NDUsIDB4MDIsIDB4MjgsIDB4NjQsIDB4NDQsIDB4QzQsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MjQsIDB4MDAsIDB4QjQsIDB4MjgsIDB4NDAsIDB4RTQsIDB4MzYsIDB4MDAsIDB4QjQsIDB4NjAsIDB4NTAsIDB4MDgsIDB4MjgsIDB4MDEsIDB4MDAsCisJIDB4MjAsIDB4MjksIDB4NkQsIDB4RTIsIDB4QTMsIDB4NjAsIDB4M0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjEsIDB4NDYsIDB4QjUsIDB4RkYsIDB4QkMsIDB4RkYsCisJIDB4NDcsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4NDgsIDB4NjAsIDB4MkQsIDB4N0QsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NkIsIDB4QUUsIDB4NEYsCisJIDB4RjcsIDB4QjQsIDB4QTAsIDB4NUUsIDB4MjcsIDB4NDQsIDB4MDcsIDB4MjIsIDB4MDUsIDB4MDAsIDB4RjgsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDYsIDB4NjQsCisJIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4RTcsIDB4MDEsIDB4MjcsIDB4NDQsIDB4MDUsIDB4MjIsIDB4MDksIDB4MDAsIDB4QkEsIDB4QjQsIDB4NDAsIDB4NDcsCisJIDB4M0MsIDB4NDYsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4QTMsIDB4NjAsIDB4NEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDQsCisJIDB4MDIsIDB4MkEsIDB4MDYsIDB4MDAsIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDYsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4RjQsIDB4MDEsCisJIDB4RjMsIDB4MEEsIDB4N0MsIDB4NTAsIDB4NkQsIDB4RTIsIDB4RjAsIDB4MDEsIDB4NzIsIDB4NDUsIDB4REMsIDB4ODQsIDB4QjUsIDB4RkIsIDB4MTEsIDB4NjQsCisJIDB4M0EsIDB4REIsIDB4QjYsIDB4RjMsIDB4MDYsIDB4MDQsIDB4REMsIDB4ODQsIDB4QjYsIDB4RkIsIDB4QjcsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsCisJIDB4QjcsIDB4RkIsIDB4QTMsIDB4NjAsIDB4NTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjEsIDB4MTIsIDB4NjQsIDB4M0EsIDB4REIsIDB4MUUsIDB4NjAsCisJIDB4RkUsIDB4NjMsIDB4QkQsIDB4RDMsIDB4NzIsIDB4NDUsIDB4NDQsIDB4OEEsIDB4MDIsIDB4MjgsIDB4MDIsIDB4MDAsIDB4RTQsIDB4RTIsIDB4REQsIDB4ODEsCisJIDB4MDIsIDB4MjgsIDB4MDIsIDB4MDAsIDB4RTQsIDB4RTIsIDB4REQsIDB4ODEsIDB4QkQsIDB4RDMsIDB4QjUsIDB4RjEsIDB4NjEsIDB4NDUsIDB4QzAsIDB4ODQsCisJIDB4MDAsIDB4NjEsIDB4MDIsIDB4MjQsIDB4MDEsIDB4QjksIDB4QzQsIDB4ODQsIDB4NjAsIDB4NTUsIDB4MkEsIDB4NTIsIDB4QjUsIDB4RkIsIDB4MDIsIDB4MjQsCisJIDB4MDEsIDB4QjksIDB4QkQsIDB4RDMsIDB4QjYsIDB4RjEsIDB4NjEsIDB4NDUsIDB4QzAsIDB4ODQsIDB4MDAsIDB4NjEsIDB4MDIsIDB4MjQsIDB4MDEsIDB4QjksCisJIDB4QzQsIDB4ODQsIDB4QjYsIDB4RkIsIDB4MDIsIDB4MjQsIDB4MDEsIDB4QjksIDB4QkQsIDB4RDMsIDB4QjcsIDB4RjEsIDB4NjEsIDB4NDUsIDB4QzAsIDB4ODQsCisJIDB4QzQsIDB4ODQsIDB4QjcsIDB4RkIsIDB4QTMsIDB4NjAsIDB4RUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzEsIDB4NDAsIDB4MDQsIDB4MEEsIDB4QUUsIDB4NEYsCisJIDB4RjcsIDB4QjQsIDB4QTAsIDB4NUUsIDB4MDksIDB4MDAsIDB4MzEsIDB4NjAsIDB4MEUsIDB4N0MsIDB4QTQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MTgsCisJIDB4QUUsIDB4NEYsIDB4MDgsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUUsIDB4OUYsIDB4MDEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MjUsCisJIDB4MDksIDB4MDAsIDB4MDQsIDB4MjUsIDB4MDMsIDB4MDAsIDB4NDcsIDB4RkYsIDB4MzIsIDB4NzQsIDB4OTYsIDB4MDEsIDB4QzQsIDB4RTIsIDB4QUIsIDB4NjAsCisJIDB4MkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NEMsIDB4NEUsIDB4NDcsIDB4RkYsIDB4MzEsIDB4NjAsIDB4MEUsIDB4N0MsIDB4QTQsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MTgsIDB4QUUsIDB4NEYsIDB4MDgsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUUsIDB4MzIsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4QTgsIDB4NjAsCisJIDB4OEEsIDB4NzgsIDB4MDAsIDB4NjEsIDB4MTAsIDB4NjQsIDB4M0EsIDB4REIsIDB4QTMsIDB4NjAsIDB4NEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4NjAsCisJIDB4NEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUMsIDB4NEQsIDB4MjYsIDB4NDQsIDB4MDIsIDB4MjYsIDB4MEMsIDB4MDAsIDB4M0UsIDB4NDYsIDB4MDksIDB4RjIsCisJIDB4MUUsIDB4NDEsIDB4MDMsIDB4MUIsIDB4QUEsIDB4NjAsIDB4REIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NUUsIDB4RkQsIDB4RkIsIDB4MjEsIDB4NDQsCisJIDB4MDIsIDB4NjQsIDB4NDAsIDB4NDYsIDB4NDEsIDB4NUQsIDB4MjEsIDB4NDYsIDB4MDAsIDB4RjIsIDB4NDYsIDB4NDUsIDB4ODcsIDB4RkMsIDB4NEMsIDB4RTIsCisJIDB4MDEsIDB4NjQsIDB4MzMsIDB4RkIsIDB4MDEsIDB4NjAsIDB4MEUsIDB4RTEsIDB4MDMsIDB4RTEsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDAsIDB4MDAsCisJIDB4MjEsIDB4NjksIDB4QjYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NUUsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4NjAsIDB4NUMsIDB4MjAsIDB4NjQsCisJIDB4M0EsIDB4REIsIDB4NjgsIDB4NDMsIDB4MjYsIDB4RkMsIDB4MjIsIDB4NjksIDB4NjQsIDB4NDQsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkMsIDB4NUYsCisJIDB4NjAsIDB4NDMsIDB4MjYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjgsIDB4NUYsIDB4MjYsIDB4RkEsIDB4M0EsIDB4NjksIDB4MUQsIDB4RkMsIDB4MkUsIDB4NDQsCisJIDB4MzYsIDB4RjEsIDB4MUMsIDB4RkEsIDB4QzMsIDB4OTQsIDB4Q0QsIDB4RTIsIDB4MkUsIDB4NDQsIDB4MTQsIDB4MzYsIDB4MTIsIDB4MDAsIDB4MEEsIDB4MzYsCisJIDB4MEYsIDB4MDAsIDB4NjMsIDB4NDUsIDB4RTMsIDB4ODMsIDB4RTMsIDB4ODMsIDB4QzcsIDB4ODMsIDB4RTMsIDB4ODMsIDB4QzcsIDB4ODMsIDB4RkYsIDB4RkYsCisJIDB4MzcsIDB4MzYsIDB4MDUsIDB4MDAsIDB4NkUsIDB4MzYsIDB4MDQsIDB4MDAsIDB4QUEsIDB4NjAsIDB4RjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RUIsIDB4ODMsCisJIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RkYsIDB4RkYsIDB4ODAsIDB4MjcsIDB4Q0YsIDB4ODMsIDB4MUIsIDB4RkMsIDB4MDEsIDB4NjQsCisJIDB4NTEsIDB4RkIsIDB4QTEsIDB4RkYsIDB4MUMsIDB4RjIsIDB4MjksIDB4NDEsIDB4RjksIDB4ODEsIDB4NTIsIDB4NEEsIDB4NzEsIDB4ODksIDB4NjgsIDB4NUYsCisJIDB4MjcsIDB4RkEsIDB4NkMsIDB4NDAsIDB4MDMsIDB4MTUsIDB4QUIsIDB4NjAsIDB4MDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODgsIDB4NjAsIDB4ODUsIDB4NzEsCisJIDB4OEQsIDB4RTIsIDB4QjksIDB4RjEsIDB4RkMsIDB4QTMsIDB4RDMsIDB4ODAsIDB4NDMsIDB4NDMsIDB4MDMsIDB4MDQsIDB4QUEsIDB4NjAsIDB4RkIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDAsIDB4MDEsIDB4MkEsIDB4NEMsIDB4MDAsIDB4OUEsIDB4RkYsIDB4MjMsIDB4NDMsIDB4MTgsIDB4NjEsIDB4QTEsIDB4RkYsCisJIDB4OEMsIDB4NDQsIDB4Q0IsIDB4ODMsIDB4MkEsIDB4RkEsIDB4NDAsIDB4NDgsIDB4NDAsIDB4MjcsIDB4MDQsIDB4QTEsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MkIsCisJIDB4MDEsIDB4MDAsIDB4MDYsIDB4QTEsIDB4ODgsIDB4QjAsIDB4ODgsIDB4MzYsIDB4RDksIDB4ODEsIDB4NjIsIDB4NDUsIDB4MjMsIDB4NDQsIDB4NTQsIDB4OTQsCisJIDB4MjgsIDB4NDAsIDB4MDQsIDB4MjYsIDB4MDAsIDB4NjQsIDB4M0YsIDB4RkEsIDB4QzksIDB4ODEsIDB4NjUsIDB4NDIsIDB4N0EsIDB4REMsIDB4MDAsIDB4QjksCisJIDB4RkQsIDB4MUMsIDB4MDAsIDB4RjQsIDB4NkUsIDB4NjEsIDB4MTAsIDB4NjIsIDB4MTQsIDB4MDIsIDB4MDUsIDB4MUQsIDB4MTIsIDB4MUUsIDB4MEMsIDB4MDAsCisJIDB4MDAsIDB4RjQsIDB4N0MsIDB4NjEsIDB4MDIsIDB4NjIsIDB4N0EsIDB4REMsIDB4NjMsIDB4NDAsIDB4RkQsIDB4MUMsIDB4RjksIDB4MUQsIDB4RkYsIDB4QjEsCisJIDB4MDgsIDB4MUUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDQsCisJIDB4NUEsIDB4REEsIDB4OTgsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4ODEsIDB4RTEsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDAsIDB4QTEsIDB4RkYsCisJIDB4NDcsIDB4RkYsIDB4MjYsIDB4NDQsIDB4RkQsIDB4QjQsIDB4ODQsIDB4QkMsIDB4MDEsIDB4MTUsIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDYsIDB4QTEsIDB4RkYsCisJIDB4NkMsIDB4NDAsIDB4MTQsIDB4NjMsIDB4MDEsIDB4MTEsIDB4MDEsIDB4MDAsIDB4RkQsIDB4MUYsIDB4QUEsIDB4NjAsIDB4NkUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4OUEsIDB4RkYsIDB4NTQsIDB4NjMsIDB4MTIsIDB4NjQsIDB4NDAsIDB4NDYsIDB4MDAsIDB4NjQsIDB4MEYsIDB4RkEsIDB4QTEsIDB4RkYsIDB4RUIsIDB4RjEsCisJIDB4MTIsIDB4NjEsIDB4NTAsIDB4RkUsIDB4MkQsIDB4NjAsIDB4NTIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsCisJIDB4MEIsIDB4MDAsIDB4OEMsIDB4NDUsIDB4OTgsIDB4RjgsIDB4MDAsIDB4NjQsIDB4M0EsIDB4RkEsIDB4M0IsIDB4RkEsIDB4M0MsIDB4RkEsIDB4M0QsIDB4RkEsCisJIDB4QkYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTQsIDB4ODQsIDB4MDEsIDB4MDAsIDB4OEMsIDB4NDQsIDB4RUMsIDB4RjAsIDB4QkQsIDB4REEsIDB4NDAsIDB4NDgsCisJIDB4MDQsIDB4MjYsIDB4NDAsIDB4MDAsIDB4QTEsIDB4RkYsIDB4OEMsIDB4NDQsIDB4QkQsIDB4REEsIDB4MzAsIDB4RkIsIDB4NkMsIDB4NDQsIDB4QkQsIDB4REEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MjYsIDB4MjQsIDB4MDAsIDB4RDAsIDB4ODAsIDB4QTEsIDB4RkYsIDB4OEMsIDB4NDQsIDB4NkMsIDB4NUMsIDB4RjIsIDB4RkUsCisJIDB4QkQsIDB4REEsIDB4RUQsIDB4RjMsIDB4RDQsIDB4ODAsIDB4RDAsIDB4ODAsIDB4QkQsIDB4RDgsIDB4MkQsIDB4NDQsIDB4MTUsIDB4MEMsIDB4MzIsIDB4NDAsCisJIDB4MDIsIDB4MkEsIDB4MDcsIDB4MDAsIDB4MjgsIDB4NDIsIDB4MEMsIDB4QjIsIDB4MDgsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MTAsIDB4QkMsIDB4NDAsIDB4NEQsCisJIDB4NEQsIDB4MDAsIDB4MDMsIDB4MEEsIDB4QUIsIDB4NjAsIDB4MDksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTEsIDB4QkMsIDB4NDAsIDB4NEQsIDB4MjgsIDB4NDUsCisJIDB4QkYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4MjQsIDB4ODgsIDB4NDIsIDB4MDAsIDB4MzAsIDB4QkMsIDB4NDAsIDB4NEQsIDB4M0YsIDB4MDAsIDB4MjAsIDB4QjksCisJIDB4NUMsIDB4OEUsIDB4QTEsIDB4RkYsIDB4OEMsIDB4NDQsIDB4QkQsIDB4REEsIDB4REMsIDB4OUMsIDB4NkMsIDB4NDQsIDB4RjIsIDB4RkUsIDB4QkQsIDB4REEsCisJIDB4MDgsIDB4MjgsIDB4NDQsIDB4NEUsIDB4REMsIDB4ODQsIDB4MkUsIDB4NUMsIDB4QjAsIDB4ODQsIDB4RUYsIDB4QjEsIDB4MDgsIDB4MjQsIDB4NDAsIDB4QjksCisJIDB4NDEsIDB4NDYsIDB4MkMsIDB4MDAsIDB4OEMsIDB4NDQsIDB4MDQsIDB4NjEsIDB4QkQsIDB4REEsIDB4NTAsIDB4RkUsIDB4ODAsIDB4MjcsIDB4MDAsIDB4NjQsCisJIDB4MzAsIDB4RkIsIDB4OEMsIDB4NDQsIDB4QkQsIDB4REEsIDB4RDAsIDB4ODAsIDB4OEMsIDB4NDQsIDB4QkQsIDB4REEsIDB4RDQsIDB4ODAsIDB4MDAsIDB4NjUsCisJIDB4OEMsIDB4NDQsIDB4RUQsIDB4RjEsIDB4QkQsIDB4REEsIDB4RDAsIDB4ODAsIDB4MjgsIDB4NDQsIDB4MDMsIDB4MEMsIDB4QTAsIDB4MkEsIDB4MEEsIDB4MDAsCisJIDB4MTEsIDB4MDAsIDB4MTAsIDB4NjUsIDB4NjAsIDB4NDAsIDB4QzQsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RDQsIDB4M0EsIDB4MDgsIDB4MDAsIDB4MjcsIDB4NDAsCisJIDB4NDAsIDB4MjYsIDB4MzAsIDB4NjUsIDB4MDAsIDB4NjQsIDB4M0YsIDB4RkEsIDB4NDYsIDB4NEUsIDB4MzUsIDB4OEQsIDB4NUYsIDB4MDAsIDB4NDAsIDB4MjYsCisJIDB4RjksIDB4MDEsIDB4MzAsIDB4NjUsIDB4OUQsIDB4REMsIDB4OUQsIDB4REMsIDB4OUQsIDB4REMsIDB4RjQsIDB4MDEsIDB4MDAsIDB4RTEsIDB4MjMsIDB4NDMsCisJIDB4RTgsIDB4QTMsIDB4NkEsIDB4NjIsIDB4OUEsIDB4RkYsIDB4QTEsIDB4RkYsIDB4MjgsIDB4NDQsIDB4MDMsIDB4MkIsIDB4MDQsIDB4MDAsIDB4N0EsIDB4REMsCisJIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4MjgsIDB4NDQsIDB4ODgsIDB4QjAsIDB4ODgsIDB4MkEsIDB4MDMsIDB4MDAsIDB4NzAsIDB4NjIsIDB4N0EsIDB4REMsCisJIDB4MjgsIDB4NDQsIDB4NDAsIDB4MkIsIDB4MTMsIDB4MDAsIDB4NzIsIDB4NjIsIDB4N0EsIDB4REMsIDB4MDQsIDB4RTYsIDB4N0EsIDB4REMsIDB4M0IsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MjAsIDB4MkIsIDB4MDIsIDB4MDAsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUIsCisJIDB4RkMsIDB4QTMsIDB4MjUsIDB4RkYsIDB4M0YsIDB4RkMsIDB4MDQsIDB4QTMsIDB4QjAsIDB4RkYsIDB4MDEsIDB4MDAsIDB4M0YsIDB4RkMsIDB4Q0YsIDB4ODMsCisJIDB4REYsIDB4ODMsIDB4MDQsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MTAsIDB4NjIsIDB4NkMsIDB4NjEsIDB4MUYsIDB4MDAsIDB4MjcsIDB4MDMsIDB4Q0IsIDB4ODMsCisJIDB4RkYsIDB4NjAsIDB4RkUsIDB4NjUsIDB4MEUsIDB4QTMsIDB4QTcsIDB4ODQsIDB4RjIsIDB4QTMsIDB4MDAsIDB4RjQsIDB4MTAsIDB4NjIsIDB4NkMsIDB4NjEsCisJIDB4N0EsIDB4REMsIDB4RkUsIDB4MUMsIDB4MDMsIDB4MUQsIDB4N0MsIDB4QTgsIDB4RDksIDB4ODEsIDB4MEEsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsCisJIDB4QTcsIDB4ODQsIDB4N0EsIDB4NjEsIDB4N0EsIDB4REMsIDB4RkUsIDB4MUMsIDB4RjksIDB4MUQsIDB4N0MsIDB4QTgsIDB4RDksIDB4ODEsIDB4RjYsIDB4MDMsCisJIDB4RkYsIDB4QjEsIDB4MEMsIDB4MUUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsIDB4QTEsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MEMsIDB4RTEsCisJIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QTEsIDB4RkYsIDB4Q0QsIDB4ODEsIDB4NkMsIDB4NDQsIDB4NUEsIDB4REEsIDB4OTgsIDB4RkYsIDB4MDAsIDB4RTYsCisJIDB4N0MsIDB4NDQsIDB4MzMsIDB4RkIsIDB4MDEsIDB4NjAsIDB4MEMsIDB4RTEsIDB4ODMsIDB4RTEsIDB4QTEsIDB4RkYsIDB4OEMsIDB4NDQsIDB4NDYsIDB4NDUsCisJIDB4QTEsIDB4RkYsIDB4MTQsIDB4NjMsIDB4MDEsIDB4MTAsIDB4RkUsIDB4MUYsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MEEsIDB4NjQsIDB4NjAsIDB4NTQsCisJIDB4NDcsIDB4RkYsIDB4NTAsIDB4NEIsIDB4NjcsIDB4NTAsIDB4NjksIDB4RTIsIDB4NkEsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDEsIDB4MTUsIDB4MjksIDB4MDAsCisJIDB4NkMsIDB4NDAsIDB4MjgsIDB4NDAsIDB4MDMsIDB4MjYsIDB4MTUsIDB4MDAsIDB4MzEsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MjgsIDB4NDAsCisJIDB4NTAsIDB4M0EsIDB4MEYsIDB4MDAsIDB4MkQsIDB4NDQsIDB4MjAsIDB4MkEsIDB4MEMsIDB4MDAsIDB4MkIsIDB4NDQsIDB4QUMsIDB4ODAsIDB4MjgsIDB4NDAsCisJIDB4QjQsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDMsIDB4MzAsIDB4RkIsIDB4MDQsIDB4MDAsIDB4MkIsIDB4NTAsIDB4QTQsIDB4NjAsIDB4ODUsIDB4NzgsCisJIDB4MDQsIDB4RTEsIDB4MDQsIDB4RTEsIDB4QTEsIDB4RkYsIDB4MzUsIDB4RjEsIDB4MjYsIDB4NDQsIDB4NjQsIDB4NTQsIDB4Q0QsIDB4RTIsIDB4ODQsIDB4QkMsCisJIDB4MkQsIDB4NDAsIDB4MEMsIDB4MjIsIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDYsIDB4MjMsIDB4NjQsIDB4M0EsIDB4REIsIDB4QTcsIDB4NjAsIDB4MTgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDAsIDB4MjYsIDB4MjIsIDB4MDQsIDB4MDAsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4RkYsIDB4RkYsCisJIDB4NkMsIDB4NDAsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4NDgsIDB4NjAsIDB4MkQsIDB4N0QsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NkIsIDB4MzcsIDB4RjMsCisJIDB4MkIsIDB4NDUsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MjgsIDB4NjUsIDB4NDQsIDB4NjAsIDB4NTAsIDB4QTAsIDB4NEMsIDB4MjAsIDB4QkMsCisJIDB4RkYsIDB4QjQsIDB4QTAsIDB4NTEsIDB4MzUsIDB4RjEsIDB4NzQsIDB4NDQsIDB4QzAsIDB4OTQsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MTgsIDB4MDAsCisJIDB4MjgsIDB4NDQsIDB4QTQsIDB4MzYsIDB4MDQsIDB4MDAsIDB4MEMsIDB4QjQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MzYsIDB4MTEsIDB4MDAsIDB4MjYsIDB4NDMsCisJIDB4RkQsIDB4QjMsIDB4MDQsIDB4QkIsIDB4NDMsIDB4NDYsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MjgsIDB4NDcsIDB4NDAsIDB4QkYsIDB4NDAsIDB4NDgsCisJIDB4MEEsIDB4QkIsIDB4MEYsIDB4RkMsIDB4NTAsIDB4NEIsIDB4NjcsIDB4NTAsIDB4MDAsIDB4NjQsIDB4MzAsIDB4RkIsIDB4MDUsIDB4RkYsIDB4QzYsIDB4MDEsCisJIDB4MjQsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjgsIDB4NDQsIDB4MDQsIDB4MkEsIDB4MDYsIDB4MDAsIDB4QUUsIDB4NEYsIDB4RjcsIDB4QjQsIDB4QTAsIDB4NUUsCisJIDB4QTMsIDB4NjAsIDB4M0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUQsIDB4RkYsIDB4NDgsIDB4RTIsIDB4MjcsIDB4NDQsIDB4MDYsIDB4MjIsIDB4MDUsIDB4MDAsCisJIDB4RjksIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MjYsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MTgsIDB4MDAsCisJIDB4MjYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4QzAsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MTEsIDB4MEUsIDB4QjgsIDB4RjEsCisJIDB4MjcsIDB4NjAsIDB4OTIsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsCisJIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsCisJIDB4QTcsIDB4NjAsIDB4RTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4OTQsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsCisJIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MkEsIDB4NjQsIDB4M0EsIDB4REIsIDB4NUMsIDB4NDEsIDB4ODcsIDB4RTEsCisJIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDAsIDB4MDIsIDB4MDAsIDB4MjksIDB4NjQsIDB4M0EsIDB4REIsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4ODcsIDB4RTEsCisJIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDAsIDB4MTEsIDB4MDAsIDB4MjcsIDB4NjAsIDB4QTYsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjgsIDB4QTIsIDB4REIsIDB4RjEsIDB4MDEsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MjEsIDB4NjQsIDB4M0EsIDB4REIsCisJIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4NkMsIDB4NDAsIDB4MDAsIDB4NjQsIDB4MzMsIDB4RkIsIDB4MzIsIDB4NzQsIDB4NDAsIDB4NjMsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDEsIDB4NjgsIDB4MDEsIDB4MTEsIDB4MDksIDB4MDAsIDB4QTcsIDB4NkEsIDB4MjIsIDB4NjQsIDB4M0EsIDB4REIsCisJIDB4MDMsIDB4NjAsIDB4QzksIDB4NjMsIDB4MDEsIDB4MTEsIDB4MDIsIDB4MDAsIDB4NkMsIDB4NDAsIDB4RkMsIDB4MUYsIDB4NkMsIDB4NDAsIDB4QjUsIDB4RkYsCisJIDB4NkMsIDB4NDAsIDB4QkMsIDB4RkYsIDB4NkMsIDB4NDAsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4NDgsIDB4NjAsIDB4MkQsIDB4N0QsIDB4MDgsIDB4NjAsCisJIDB4MDAsIDB4NkIsIDB4QUUsIDB4NEYsIDB4RjcsIDB4QjQsIDB4QTAsIDB4NUUsIDB4MDMsIDB4MEEsIDB4QTMsIDB4NjAsIDB4NEIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4NjQsIDB4NTEsIDB4RkIsIDB4MzEsIDB4NjAsIDB4MEUsIDB4N0MsIDB4QTQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MTgsIDB4QUUsIDB4NEYsCisJIDB4MDgsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUUsIDB4MjcsIDB4NDQsIDB4MDYsIDB4MjIsIDB4MDYsIDB4MDAsIDB4RjksIDB4QjQsIDB4NDAsIDB4NDcsCisJIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4NDgsIDB4RTIsIDB4MjcsIDB4NjQsIDB4M0EsIDB4REIsIDB4QjMsIDB4RTEsIDB4QTEsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4NTQsIDB4NjIsIDB4MjIsIDB4NDYsIDB4QTIsIDB4RDAsIDB4MTYsIDB4NjMsIDB4N0MsIDB4NDEsIDB4NDQsIDB4NDgsCisJIDB4ODAsIDB4MzYsIDB4MDQsIDB4NjEsIDB4MjgsIDB4NDAsIDB4NTAsIDB4MzYsIDB4MDQsIDB4NjEsIDB4NDEsIDB4NEUsIDB4MjgsIDB4NDQsIDB4QTQsIDB4MzYsCisJIDB4MEUsIDB4NjMsIDB4MUMsIDB4NjAsIDB4OUMsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MjQsIDB4NDQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4QzAsIDB4ODQsIDB4QTIsIDB4REIsIDB4OUEsIDB4RkYsIDB4QTEsIDB4RkYsIDB4MkQsIDB4NjAsIDB4NTIsIDB4NjIsCisJIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MTgsIDB4RjIsIDB4QUEsIDB4RjAsIDB4RkYsIDB4RkYsCisJIDB4QjQsIDB4ODQsIDB4MDgsIDB4MzYsIDB4MkEsIDB4RkEsIDB4NTQsIDB4NjIsIDB4QTIsIDB4RDIsIDB4RkYsIDB4RkYsIDB4NkEsIDB4NDAsIDB4ODAsIDB4NEUsCisJIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MUQsIDB4NzgsIDB4MDAsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4MjgsIDB4NDAsIDB4MDMsIDB4MkIsCisJIDB4MDQsIDB4MDAsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4NkEsIDB4NDAsIDB4NzAsIDB4NjIsIDB4MjgsIDB4NDQsIDB4ODgsIDB4QjAsCisJIDB4ODgsIDB4MzYsIDB4N0EsIDB4RDQsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MEIsIDB4MDAsIDB4NzIsIDB4NjIsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsCisJIDB4QTIsIDB4RDIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MDIsIDB4MDAsIDB4N0EsIDB4RDQsIDB4N0EsIDB4RDQsIDB4NDYsIDB4MDAsCisJIDB4MjMsIDB4NDMsIDB4Q0YsIDB4ODMsIDB4REYsIDB4ODMsIDB4MDIsIDB4MDMsIDB4NTUsIDB4MDMsIDB4MDQsIDB4MDAsIDB4MDMsIDB4RjAsIDB4MDQsIDB4RjQsCisJIDB4NjQsIDB4NDIsIDB4MzcsIDB4MDAsIDB4MkUsIDB4NDAsIDB4MDQsIDB4MkEsIDB4MjEsIDB4MDAsIDB4QTEsIDB4RkYsIDB4MDIsIDB4RkUsIDB4MTAsIDB4MjUsCisJIDB4NDIsIDB4RkUsIDB4NzIsIDB4NDUsIDB4NjUsIDB4NEMsIDB4QjUsIDB4RjMsIDB4MDMsIDB4MDQsIDB4RTQsIDB4RTIsIDB4REMsIDB4ODQsIDB4QjUsIDB4RkIsCisJIDB4QTEsIDB4RkYsIDB4ODAsIDB4NEMsIDB4QjYsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4QjYsIDB4RkIsIDB4ODAsIDB4NEMsIDB4QjcsIDB4RjMsCisJIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4QjcsIDB4RkIsIDB4ODAsIDB4NEMsIDB4NUMsIDB4NEUsIDB4RjgsIDB4QTMsIDB4MDMsIDB4RjIsIDB4OUEsIDB4RjIsCisJIDB4MDQsIDB4RjQsIDB4RkYsIDB4QjEsIDB4RjgsIDB4QTEsIDB4MDYsIDB4QTQsIDB4NjAsIDB4NDIsIDB4MDksIDB4MDAsIDB4MDMsIDB4RjIsIDB4OUEsIDB4RjIsCisJIDB4MDQsIDB4RjQsIDB4QzgsIDB4ODIsIDB4RkYsIDB4QjEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4RkYsIDB4QjEsIDB4N0EsIDB4RDQsCisJIDB4RkYsIDB4RkYsIDB4RkQsIDB4MUMsIDB4RjksIDB4MUQsIDB4RkYsIDB4QjEsIDB4MTcsIDB4MUUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4REEsIDB4ODIsCisJIDB4REEsIDB4ODIsIDB4QTIsIDB4RDIsIDB4QTEsIDB4RkYsIDB4MDksIDB4NzQsIDB4ODAsIDB4NEQsIDB4MEUsIDB4MDAsIDB4MDMsIDB4RjIsIDB4OUEsIDB4RjIsCisJIDB4MDQsIDB4RjQsIDB4MjMsIDB4NDMsIDB4QTEsIDB4RkYsIDB4QTAsIDB4RDIsIDB4RkUsIDB4QTEsIDB4Q0IsIDB4ODMsIDB4ODAsIDB4NEUsIDB4QUYsIDB4ODMsCisJIDB4MDIsIDB4MUQsIDB4MDIsIDB4MDMsIDB4RUQsIDB4MDEsIDB4RTMsIDB4MDEsIDB4QTEsIDB4RkYsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDIsIDB4MDAsCisJIDB4OUMsIDB4NEUsIDB4OUMsIDB4NEMsIDB4QTEsIDB4RkYsIDB4REEsIDB4ODMsIDB4NjYsIDB4NDQsIDB4MjIsIDB4NDYsIDB4MEMsIDB4RkEsIDB4MEIsIDB4RkMsCisJIDB4ODcsIDB4NEYsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEYsIDB4ODcsIDB4NEQsIDB4ODcsIDB4NEMsIDB4MDEsIDB4MDgsIDB4MDEsIDB4MDAsIDB4RkYsIDB4RkYsCisJIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkEsIDB4NDQsIDB4QkMsIDB4RkYsCisJIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MEMsIDB4NzQsIDB4MDQsIDB4RTEsIDB4QTEsIDB4RkYsIDB4MzUsIDB4RjMsIDB4QzQsIDB4RTIsIDB4NjAsIDB4NTQsCisJIDB4ODksIDB4RkYsIDB4MTMsIDB4NzQsIDB4ODgsIDB4RkYsIDB4MjksIDB4NDQsIDB4RjcsIDB4QjQsIDB4NDAsIDB4NDksIDB4MzQsIDB4NjQsIDB4M0EsIDB4REIsCisJIDB4MDYsIDB4RTEsIDB4NDcsIDB4RkYsIDB4QTQsIDB4NjAsIDB4NDcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTAsIDB4NjEsIDB4N0YsIDB4NjAsCisJIDB4QzAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjMsIDB4MjYsIDB4MDIsIDB4OTgsIDB4RkUsIDB4MUEsIDB4MDUsIDB4MjQsIDB4NjAsCisJIDB4NTIsIDB4NjIsIDB4QTIsIDB4RDUsIDB4MEUsIDB4RjIsIDB4MTUsIDB4MTgsIDB4MDIsIDB4MTgsIDB4MDksIDB4RjQsIDB4RkIsIDB4MDEsIDB4MjMsIDB4NDQsCisJIDB4MDAsIDB4QTgsIDB4MDgsIDB4N0UsIDB4MEEsIDB4MDIsIDB4NjYsIDB4NDQsIDB4MTEsIDB4RkIsIDB4NDYsIDB4NDMsIDB4MjMsIDB4NDcsIDB4ODAsIDB4QkYsCisJIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MDgsIDB4QjksIDB4MTAsIDB4N0UsIDB4MDAsIDB4N0YsIDB4MEUsIDB4RkEsIDB4MDAsIDB4NjcsCisJIDB4MEEsIDB4MDAsIDB4MjAsIDB4NDQsIDB4REMsIDB4ODUsIDB4MEYsIDB4QjQsIDB4RkEsIDB4QTAsIDB4N0YsIDB4NjcsIDB4MDcsIDB4NjMsIDB4MDMsIDB4MDUsCisJIDB4NDUsIDB4NDAsIDB4MDAsIDB4NjcsIDB4RDgsIDB4RkUsIDB4RkYsIDB4MjcsIDB4MDUsIDB4RkQsIDB4MEEsIDB4N0UsIDB4MDQsIDB4RkIsIDB4NjEsIDB4NTUsCisJIDB4NEEsIDB4MDAsIDB4MjgsIDB4RkIsIDB4MDEsIDB4RjMsIDB4MjksIDB4RkIsIDB4NDQsIDB4NDYsIDB4NDAsIDB4NDUsIDB4MTAsIDB4NjEsIDB4N0UsIDB4NjAsCisJIDB4QzAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjMsIDB4MzEsIDB4MDIsIDB4QUUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NkYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjcsIDB4MDMsIDB4NjMsIDB4MkEsIDB4MDIsIDB4MjYsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MjQsIDB4MDAsIDB4OTgsIDB4RkUsCisJIDB4MTksIDB4MDUsIDB4MjQsIDB4NjAsIDB4NTIsIDB4NjIsIDB4QTIsIDB4RDUsIDB4MEUsIDB4RjIsIDB4MTQsIDB4MTgsIDB4MDIsIDB4MTgsIDB4MDksIDB4RjQsCisJIDB4RkIsIDB4MDEsIDB4MjMsIDB4NDQsIDB4MDAsIDB4QTgsIDB4MDgsIDB4N0UsIDB4MEEsIDB4MDIsIDB4NjYsIDB4NDQsIDB4MTEsIDB4RkIsIDB4NDYsIDB4NDMsCisJIDB4MjMsIDB4NDcsIDB4ODAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MDgsIDB4QjksIDB4MTAsIDB4N0UsIDB4MDAsIDB4N0YsCisJIDB4MEUsIDB4RkEsIDB4MDksIDB4MDAsIDB4MjAsIDB4NDQsIDB4REMsIDB4ODUsIDB4MEYsIDB4QjQsIDB4RkEsIDB4QTAsIDB4N0YsIDB4NjcsIDB4MDcsIDB4NjMsCisJIDB4MDUsIDB4MDUsIDB4NDUsIDB4NDAsIDB4RDgsIDB4RkUsIDB4MDAsIDB4NjcsIDB4RDAsIDB4RkUsIDB4RDksIDB4RkUsIDB4RkYsIDB4MjcsIDB4MDUsIDB4RkQsCisJIDB4MEIsIDB4N0UsIDB4MDQsIDB4RkIsIDB4MUMsIDB4NjAsIDB4QjQsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjAsIDB4QjAsIDB4ODAsIDB4QkMsCisJIDB4MDgsIDB4MjgsIDB4QTMsIDB4REIsIDB4NjEsIDB4NTUsIDB4NjMsIDB4MDAsIDB4MDQsIDB4QjUsIDB4ODIsIDB4QjUsIDB4MjUsIDB4MDIsIDB4MDQsIDB4MDMsCisJIDB4MjAsIDB4NDQsIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDAsIDB4QTMsIDB4RDMsIDB4OTksIDB4RkUsIDB4MDQsIDB4MDQsIDB4MDIsIDB4QkMsIDB4RkUsIDB4QjQsCisJIDB4QTMsIDB4REIsIDB4NTYsIDB4MDAsIDB4REMsIDB4RjMsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MjYsIDB4NTIsIDB4MDAsIDB4QTMsIDB4RDMsIDB4RkYsIDB4QTAsCisJIDB4RjgsIDB4QjQsIDB4MDIsIDB4MDIsIDB4QTMsIDB4REIsIDB4MUMsIDB4MDAsIDB4MDQsIDB4QkMsIDB4QkYsIDB4QjQsIDB4QTMsIDB4REIsIDB4MDgsIDB4QjAsCisJIDB4MDEsIDB4NjQsIDB4MDgsIDB4MjQsIDB4MDIsIDB4NjQsIDB4MjgsIDB4RkIsIDB4MjAsIDB4NDQsIDB4ODAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4RDAsIDB4RkUsCisJIDB4M0YsIDB4MDAsIDB4QkYsIDB4QjQsIDB4QTMsIDB4REIsIDB4M0MsIDB4MDAsIDB4NDAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4RkEsIDB4MDIsIDB4RjgsIDB4QjQsCisJIDB4QTMsIDB4REIsIDB4MDgsIDB4QjUsIDB4MDcsIDB4N0MsIDB4MDEsIDB4MDIsIDB4REMsIDB4RjksIDB4MjAsIDB4NDQsIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDAsCisJIDB4MUMsIDB4NjAsIDB4QjQsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjAsIDB4QjUsIDB4MDcsIDB4QjUsIDB4MDgsIDB4MjgsIDB4QzQsIDB4MDIsCisJIDB4OTksIDB4RkUsIDB4MjYsIDB4MDUsIDB4MjAsIDB4NDQsIDB4ODAsIDB4MjYsIDB4MjMsIDB4MDAsIDB4MjAsIDB4MkEsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MkEsCisJIDB4MUYsIDB4MDAsIDB4QkYsIDB4QjQsIDB4NDAsIDB4NDAsIDB4MDksIDB4MDAsIDB4QTgsIDB4RkYsIDB4MjAsIDB4NDQsIDB4OTksIDB4RkUsIDB4MDIsIDB4MDUsCisJIDB4ODAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4NDAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4MTMsIDB4MDAsIDB4MDAsIDB4RjEsIDB4ODAsIDB4QkMsIDB4NDAsIDB4NDAsCisJIDB4NjQsIDB4NDQsIDB4RTAsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MEEsIDB4MzYsIDB4MjksIDB4MDEsIDB4MEIsIDB4MzYsIDB4NUEsIDB4MDEsIDB4MjgsIDB4RkIsCisJIDB4MDEsIDB4RjEsIDB4MjksIDB4RjksIDB4MDIsIDB4RjEsIDB4MkEsIDB4RjksIDB4MDMsIDB4RjEsIDB4MkIsIDB4RjksIDB4RDAsIDB4RkUsIDB4QUUsIDB4RkYsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODIsIDB4M0UsIDB4NzUsIDB4NDQsIDB4MDIsIDB4QjAsIDB4MDEsIDB4QjAsIDB4MjksIDB4MDIsIDB4REMsIDB4MDIsCisJIDB4MDQsIDB4QjAsIDB4MDgsIDB4QjAsIDB4MEIsIDB4MDIsIDB4MjAsIDB4MDIsIDB4NDAsIDB4MjYsIDB4QTcsIDB4RkYsIDB4OEMsIDB4RkYsIDB4NzUsIDB4NDAsCisJIDB4ODAsIDB4MkIsIDB4MDEsIDB4MDAsIDB4QUIsIDB4RkYsIDB4NzUsIDB4NDQsIDB4OEQsIDB4RkYsIDB4RUEsIDB4MDEsIDB4MEEsIDB4RjMsIDB4QUEsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MDIsIDB4MDAsIDB4NjAsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MEMsIDB4MDAsIDB4QzAsIDB4NjAsCisJIDB4MDAsIDB4N0MsIDB4QTAsIDB4ODQsIDB4ODAsIDB4M0IsIDB4MDIsIDB4MDAsIDB4QzAsIDB4NjcsIDB4MDMsIDB4MDAsIDB4NDAsIDB4M0IsIDB4MDIsIDB4MDAsCisJIDB4MDAsIDB4NjcsIDB4MEEsIDB4RkIsIDB4RDUsIDB4MDEsIDB4RDQsIDB4MDEsIDB4QUIsIDB4RkYsIDB4MzgsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RDAsIDB4MDEsCisJIDB4NzksIDB4NjMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MUYsIDB4QTksIDB4RkYsIDB4NzcsIDB4NDQsIDB4NjAsIDB4NTcsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NzUsCisJIDB4NDAsIDB4NEEsIDB4MDEsIDB4MkEsIDB4MUMsIDB4MDAsIDB4MjQsIDB4NDQsIDB4QUMsIDB4ODYsIDB4MDgsIDB4RjIsIDB4MTgsIDB4MDMsIDB4MjQsIDB4NjAsCisJIDB4NTgsIDB4NjUsIDB4RDQsIDB4ODAsIDB4MEUsIDB4RjIsIDB4MDIsIDB4MDMsIDB4QTUsIDB4RDUsIDB4MDQsIDB4MDAsIDB4MDEsIDB4QkMsIDB4MEUsIDB4RkEsCisJIDB4MDksIDB4RjQsIDB4RDEsIDB4RkUsIDB4NDYsIDB4NDQsIDB4MEIsIDB4MTgsIDB4NjYsIDB4NDQsIDB4MTAsIDB4RkIsIDB4NjYsIDB4NDcsIDB4MjAsIDB4QkYsCisJIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MEUsIDB4RjIsIDB4MDEsIDB4NzUsIDB4MTAsIDB4QkMsIDB4MEUsIDB4RkEsIDB4MkEsIDB4NDQsCisJIDB4MDgsIDB4MkEsIDB4MTgsIDB4MDAsIDB4MjMsIDB4NDQsIDB4MDAsIDB4QTgsIDB4NUMsIDB4NDMsIDB4MTQsIDB4MDMsIDB4MjQsIDB4NjAsIDB4NTIsIDB4NjIsCisJIDB4QTIsIDB4RDUsIDB4MDEsIDB4MDAsIDB4MDksIDB4RjQsIDB4MEUsIDB4RjIsIDB4MEQsIDB4MTgsIDB4MDgsIDB4QjAsIDB4MTgsIDB4QUMsIDB4RkEsIDB4MDMsCisJIDB4MEUsIDB4RkEsIDB4NjYsIDB4NDMsIDB4MTEsIDB4RkQsIDB4NDYsIDB4NDMsIDB4MjMsIDB4NDcsIDB4ODAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsCisJIDB4QTIsIDB4REIsIDB4MDgsIDB4NzUsIDB4MkEsIDB4NDQsIDB4MDYsIDB4MjIsIDB4MkQsIDB4MDAsIDB4MjIsIDB4NDQsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsCisJIDB4MEUsIDB4RjIsIDB4MjgsIDB4MDMsIDB4MTAsIDB4QjAsIDB4MDEsIDB4QkMsIDB4MDMsIDB4MDIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDIsIDB4MjIsIDB4MDAsCisJIDB4MEUsIDB4RkEsIDB4RDEsIDB4RkUsIDB4MjQsIDB4NjAsIDB4NEMsIDB4NjQsIDB4NDAsIDB4NDcsIDB4NTgsIDB4NEYsIDB4ODQsIDB4MDAsIDB4NDYsIDB4NDIsCisJIDB4MTksIDB4MDIsIDB4MjIsIDB4NDcsIDB4NDAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MjMsIDB4RjIsIDB4NjYsIDB4NDMsCisJIDB4MDAsIDB4QTgsIDB4MEUsIDB4RjIsIDB4MDgsIDB4MDIsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4RTQsIDB4MDEsIDB4MTIsIDB4RkQsIDB4MTAsIDB4NjQsCisJIDB4MEUsIDB4RkEsIDB4MDIsIDB4NzUsIDB4MDcsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MkEsIDB4REMsIDB4MDEsIDB4MTIsIDB4RkQsIDB4MTAsIDB4NjQsCisJIDB4MEUsIDB4RkEsIDB4MDQsIDB4NzUsIDB4MkEsIDB4NDQsIDB4ODAsIDB4MkEsIDB4MTksIDB4MDAsIDB4MjEsIDB4NDQsIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsCisJIDB4MTUsIDB4MDMsIDB4MDEsIDB4QkMsIDB4MEUsIDB4RkEsIDB4RDEsIDB4RkUsIDB4MjQsIDB4NjAsIDB4NjQsIDB4NjQsIDB4NDAsIDB4NDcsIDB4NTgsIDB4NEYsCisJIDB4NUEsIDB4MDAsIDB4NDYsIDB4NDEsIDB4MEIsIDB4MDIsIDB4MjEsIDB4NDcsIDB4MTAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsCisJIDB4MEUsIDB4RjIsIDB4NjYsIDB4NDMsIDB4MDgsIDB4RkQsIDB4MTAsIDB4QkMsIDB4MEUsIDB4RkEsIDB4ODAsIDB4NzUsIDB4MkEsIDB4NDQsIDB4MTAsIDB4QjAsCisJIDB4MjAsIDB4NDQsIDB4MTUsIDB4MDMsIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDAsIDB4MUMsIDB4NjAsIDB4QjQsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4MjAsIDB4QjAsIDB4ODAsIDB4QjAsIDB4MDksIDB4MDMsIDB4MDgsIDB4MDMsIDB4NDAsIDB4QkMsIDB4N0YsIDB4QjQsIDB4MDQsIDB4QjAsIDB4QTMsIDB4REIsCisJIDB4MDMsIDB4MDMsIDB4MjAsIDB4NDQsIDB4ODAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4QUMsIDB4NjAsIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4NDAsCisJIDB4MDgsIDB4MkIsIDB4MDEsIDB4MDAsIDB4MTAsIDB4RkYsIDB4QUQsIDB4NjAsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTgsIDB4RkUsIDB4MTQsIDB4MDUsCisJIDB4RUEsIDB4RkUsIDB4MjQsIDB4MDUsIDB4RTksIDB4RkUsIDB4MUMsIDB4MDUsIDB4RTcsIDB4RkUsIDB4MDksIDB4MDUsIDB4NDcsIDB4RkYsIDB4MjAsIDB4NDQsCisJIDB4MEYsIDB4MjIsIDB4MDMsIDB4MDAsIDB4Q0MsIDB4ODQsIDB4NDAsIDB4NDAsIDB4MEYsIDB4MjIsIDB4QjgsIDB4RkUsIDB4RUMsIDB4MDEsIDB4MjMsIDB4NDEsCisJIDB4MDAsIDB4QjksIDB4NUMsIDB4NEEsIDB4RTgsIDB4MDIsIDB4NkEsIDB4MDEsIDB4MjQsIDB4NDEsIDB4MDAsIDB4QjksIDB4MjQsIDB4NjAsIDB4NTgsIDB4NjUsCisJIDB4NDUsIDB4NDcsIDB4RTEsIDB4MDIsIDB4NTgsIDB4NEYsIDB4MEYsIDB4MDAsIDB4REUsIDB4MDIsIDB4NUMsIDB4NEEsIDB4NDYsIDB4NDQsIDB4NEMsIDB4MDEsCisJIDB4MjIsIDB4NDEsIDB4MDAsIDB4QjksIDB4NUMsIDB4NEEsIDB4MDgsIDB4MjQsIDB4N0QsIDB4MDEsIDB4RDUsIDB4MDEsIDB4MjEsIDB4NDEsIDB4MDAsIDB4QjksCisJIDB4NUMsIDB4NEEsIDB4QTIsIDB4MDMsIDB4RDAsIDB4MDEsIDB4MjcsIDB4RDMsIDB4MDMsIDB4MDAsIDB4MTAsIDB4QjAsIDB4MDksIDB4RjIsIDB4MDQsIDB4MDMsCisJIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsIDB4RkEsIDB4MDIsIDB4MDgsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4RjMsIDB4MEYsIDB4NjAsCisJIDB4RkUsIDB4NjUsIDB4MEMsIDB4RjMsIDB4MjQsIDB4ODYsIDB4MjQsIDB4NDYsIDB4NjAsIDB4NDAsIDB4RkIsIDB4M0IsIDB4MDcsIDB4MDAsIDB4ODAsIDB4MjYsCisJIDB4MDIsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MDMsIDB4NEMsIDB4NDYsIDB4NjEsIDB4M0EsIDB4NjUsIDB4MEMsIDB4MDAsIDB4MkUsIDB4RjMsIDB4NDAsIDB4NDUsCisJIDB4RjgsIDB4MkIsIDB4MDIsIDB4MDAsIDB4NDAsIDB4NDUsIDB4MDMsIDB4MDAsIDB4NTgsIDB4NEYsIDB4MzksIDB4MDAsIDB4MDcsIDB4MDIsIDB4NTgsIDB4NEYsCisJIDB4NDUsIDB4MDAsIDB4MDQsIDB4MDUsIDB4NjYsIDB4NTAsIDB4NjUsIDB4NTIsIDB4NjEsIDB4NTEsIDB4MDksIDB4MDAsIDB4MjYsIDB4NDcsIDB4MDAsIDB4QkYsCisJIDB4MEUsIDB4RkIsIDB4MkUsIDB4RjUsIDB4MDUsIDB4RjAsIDB4ODAsIDB4NjAsIDB4NjQsIDB4NTAsIDB4MDAsIDB4NzIsIDB4N0UsIDB4NzEsIDB4QUMsIDB4RkYsCisJIDB4QUQsIDB4NjAsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OEUsIDB4RkYsIDB4MEYsIDB4RjMsIDB4MEYsIDB4NjAsIDB4RkUsIDB4NjUsIDB4MjQsIDB4ODYsCisJIDB4MEQsIDB4RjMsIDB4MkUsIDB4RjMsIDB4NDAsIDB4NDUsIDB4RjgsIDB4MkIsIDB4MDIsIDB4MDAsIDB4NDAsIDB4NDUsIDB4MDMsIDB4MDAsIDB4NTgsIDB4NEYsCisJIDB4MTYsIDB4MDAsIDB4MDcsIDB4MDIsIDB4NTgsIDB4NEYsIDB4MjIsIDB4MDAsIDB4MDQsIDB4MDUsIDB4NjYsIDB4NTAsIDB4NjUsIDB4NTIsIDB4NjEsIDB4NTEsCisJIDB4MDksIDB4MDAsIDB4MjYsIDB4NDcsIDB4MDAsIDB4QkYsIDB4MEYsIDB4RkIsIDB4MkUsIDB4RjUsIDB4MDUsIDB4RjAsIDB4ODAsIDB4NjAsIDB4NjQsIDB4NTAsCisJIDB4MDAsIDB4NzIsIDB4N0UsIDB4NzEsIDB4OEQsIDB4RkYsIDB4QUQsIDB4RkYsIDB4QUQsIDB4NjAsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDQsCisJIDB4QUEsIDB4RjEsIDB4QUIsIDB4RjEsIDB4RDAsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDcsIDB4MDQsIDB4MDEsIDB4MDYsIDB4MDUsIDB4MDAsIDB4MjUsIDB4NDYsCisJIDB4MDEsIDB4RjAsIDB4MDMsIDB4NjcsIDB4QTAsIDB4ODUsIDB4OTQsIDB4ODAsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDYsIDB4MjYsIDB4NDEsCisJIDB4NDYsIDB4NjMsIDB4MDEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QjUsIDB4RDUsIDB4ODEsIDB4MDAsIDB4RjIsIDB4MDUsIDB4MDQsIDB4MDQsIDB4NjMsCisJIDB4NjAsIDB4NDYsIDB4RjcsIDB4MUIsIDB4NDIsIDB4RkUsIDB4MEQsIDB4MDAsIDB4NjEsIDB4NDQsIDB4QzUsIDB4ODEsIDB4NjMsIDB4NDUsIDB4QzUsIDB4ODEsCisJIDB4OUMsIDB4ODQsIDB4REMsIDB4ODQsIDB4MDEsIDB4RjIsIDB4RjAsIDB4ODUsIDB4RjAsIDB4ODAsIDB4NjUsIDB4NDQsIDB4RjgsIDB4ODUsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MjQsIDB4NjAsIDB4NkEsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsIDB4MDcsIDB4MDMsIDB4MDAsIDB4QTgsIDB4MDksIDB4RjIsIDB4RkEsIDB4MDIsIDB4MDEsIDB4NjcsIDB4MEUsIDB4RkEsCisJIDB4MDgsIDB4RkUsIDB4MTcsIDB4MDAsIDB4QUMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4QTAsIDB4MDAsIDB4QjQsIDB4MTIsIDB4MDYsIDB4MDksIDB4NjAsCisJIDB4MDgsIDB4NjEsIDB4NDEsIDB4NEEsIDB4N0MsIDB4QTEsIDB4MEUsIDB4QTEsIDB4QTIsIDB4RkYsIDB4QUUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4RTQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsIDB4MDYsIDB4MDMsIDB4MkEsIDB4NDMsIDB4QUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MDUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDEsIDB4NEEsIDB4N0MsIDB4QTEsIDB4MEUsIDB4QTEsIDB4QTIsIDB4RkYsCisJIDB4QUUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4RTQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4MkEsIDB4NDMsIDB4QUYsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4MDUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4RkUsIDB4MEQsIDB4MDAsIDB4MjQsIDB4NjAsIDB4NkEsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsIDB4MDYsIDB4MDMsIDB4MDAsIDB4QTgsIDB4MDksIDB4RjIsIDB4RkEsIDB4MDIsIDB4MDEsIDB4NjcsIDB4MEUsIDB4RkEsCisJIDB4MDgsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QUQsIDB4RjMsIDB4N0MsIDB4NjMsIDB4MDAsIDB4QkUsIDB4NDAsIDB4NDUsCisJIDB4MUEsIDB4MDMsIDB4MDAsIDB4NjUsIDB4NjUsIDB4NDQsIDB4REMsIDB4ODUsIDB4ODQsIDB4QTEsIDB4MDAsIDB4RjIsIDB4MDYsIDB4MDYsIDB4MDEsIDB4RkMsCisJIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4RjcsIDB4MDIsIDB4NDAsIDB4NDUsIDB4MEUsIDB4MDAsIDB4QUMsIDB4RjMsIDB4MDAsIDB4NjMsIDB4RDQsIDB4ODQsCisJIDB4QUMsIDB4RkIsIDB4ODAsIDB4NjAsIDB4N0MsIDB4NjQsIDB4MDEsIDB4RkEsIDB4MDAsIDB4RjAsIDB4MDAsIDB4RkMsIDB4RDMsIDB4ODAsIDB4QUQsIDB4RjksCisJIDB4MDIsIDB4MDIsIDB4QUUsIDB4RjksIDB4MDgsIDB4RkUsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4MjUsIDB4NDYsIDB4MDUsIDB4RkEsCisJIDB4MDYsIDB4RkEsIDB4MDEsIDB4RjAsIDB4MDMsIDB4NjcsIDB4MDIsIDB4RkMsIDB4QjAsIDB4ODQsIDB4M0EsIDB4N0UsIDB4MDEsIDB4RkEsIDB4MTIsIDB4NjQsCisJIDB4MDMsIDB4RkEsIDB4MDAsIDB4RjAsIDB4MDQsIDB4RjgsIDB4MDAsIDB4NjQsIDB4MEMsIDB4NjEsIDB4MTAsIDB4NjMsIDB4NTksIDB4REEsIDB4RkUsIDB4MUYsCisJIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDMsIDB4RTMsIDB4ODEsIDB4RTksIDB4ODEsIDB4MDMsIDB4MDUsIDB4MTYsIDB4MDMsIDB4MDAsIDB4NjEsCisJIDB4MDEsIDB4MDAsIDB4RTQsIDB4NjMsIDB4NjEsIDB4NDYsIDB4QkYsIDB4RDIsIDB4MjcsIDB4NDUsIDB4REMsIDB4ODQsIDB4QTIsIDB4REEsIDB4QkUsIDB4RDIsCisJIDB4MjUsIDB4NDYsIDB4ODgsIDB4RjgsIDB4MDQsIDB4MUIsIDB4MjUsIDB4NDQsIDB4NjEsIDB4NDYsIDB4QTMsIDB4REEsIDB4MDQsIDB4MDAsIDB4MEEsIDB4RkEsCisJIDB4NjAsIDB4NDYsIDB4MjUsIDB4NDQsIDB4MDksIDB4RkEsIDB4NjEsIDB4NDYsIDB4QkUsIDB4REEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDQsCisJIDB4MDAsIDB4QTgsIDB4MDcsIDB4NEIsIDB4MEMsIDB4MDMsIDB4NTgsIDB4NEYsIDB4MzMsIDB4MDAsIDB4MEIsIDB4NDcsIDB4MjQsIDB4NjAsIDB4NUUsIDB4NjUsCisJIDB4MjcsIDB4NDQsIDB4RDQsIDB4ODAsIDB4MDAsIDB4NjQsIDB4MDEsIDB4MDIsIDB4MEYsIDB4RkEsIDB4NTgsIDB4NEYsIDB4RDMsIDB4MDEsIDB4NzAsIDB4MDAsCisJIDB4MjUsIDB4NDMsIDB4RTMsIDB4ODQsIDB4N0MsIDB4NDEsIDB4MDIsIDB4MDQsIDB4RTgsIDB4ODEsIDB4RTQsIDB4NjMsIDB4NjEsIDB4NDYsIDB4QTMsIDB4RDIsCisJIDB4MDAsIDB4N0MsIDB4NDAsIDB4NDUsIDB4QkYsIDB4RDgsIDB4QTMsIDB4RDgsIDB4QkUsIDB4RDgsIDB4MjcsIDB4NDIsIDB4NUEsIDB4RDMsIDB4MjUsIDB4NUMsCisJIDB4NjAsIDB4NDEsIDB4MDIsIDB4MUIsIDB4MjcsIDB4RDksIDB4MDUsIDB4MDAsIDB4MjUsIDB4NDYsIDB4MEEsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MjUsIDB4NDQsCisJIDB4MDksIDB4RkEsIDB4MjUsIDB4NDQsIDB4MjcsIDB4NDMsIDB4MDAsIDB4NjEsIDB4NjAsIDB4NDYsIDB4MDksIDB4RjIsIDB4MDgsIDB4RkMsIDB4MDAsIDB4QTgsCisJIDB4REQsIDB4ODEsIDB4RkEsIDB4MDIsIDB4QkYsIDB4RDEsIDB4NjYsIDB4NDQsIDB4QkUsIDB4REIsIDB4QzEsIDB4ODQsIDB4QkYsIDB4REIsIDB4NDgsIDB4MDAsCisJIDB4MjUsIDB4NDYsIDB4RTQsIDB4NjMsIDB4MDgsIDB4RjIsIDB4ODksIDB4RjIsIDB4MUUsIDB4MTgsIDB4NDAsIDB4NDcsIDB4RTAsIDB4ODQsIDB4RTgsIDB4ODUsCisJIDB4MDIsIDB4MDUsIDB4RTgsIDB4ODMsIDB4MDAsIDB4NjUsIDB4NjUsIDB4NDYsIDB4QkYsIDB4RDIsIDB4NjEsIDB4NUMsIDB4Q0MsIDB4ODQsIDB4QTIsIDB4REEsCisJIDB4MjUsIDB4NDYsIDB4MEEsIDB4RjIsIDB4MDAsIDB4QjksIDB4NjUsIDB4NDYsIDB4MDgsIDB4MjQsIDB4QkUsIDB4REEsIDB4MDIsIDB4MUIsIDB4QTMsIDB4RDgsCisJIDB4MDIsIDB4MDAsIDB4NjAsIDB4NDYsIDB4ODksIDB4RkEsIDB4MDAsIDB4QjksIDB4NjEsIDB4NDYsIDB4MDgsIDB4MjgsIDB4MEEsIDB4RkEsIDB4MjUsIDB4NDYsCisJIDB4ODksIDB4RkMsIDB4OEEsIDB4RkMsIDB4ODgsIDB4RkMsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjEsIDB4MjgsIDB4NjUsIDB4MjUsIDB4NDMsCisJIDB4QUUsIDB4RjMsIDB4QUYsIDB4ODMsIDB4MDAsIDB4QkUsIDB4MTgsIDB4MDMsIDB4MDIsIDB4MDMsIDB4MDAsIDB4RkMsIDB4MDEsIDB4MDAsIDB4QUQsIDB4RkQsCisJIDB4NjMsIDB4NDYsIDB4NjUsIDB4NDQsIDB4Q0MsIDB4ODUsIDB4MDAsIDB4RjIsIDB4MDcsIDB4MDIsIDB4QUUsIDB4RjUsIDB4MDAsIDB4NjQsIDB4MDAsIDB4RkEsCisJIDB4REUsIDB4NjAsIDB4QUYsIDB4NjQsIDB4MDksIDB4RkIsIDB4MDgsIDB4MDAsIDB4NjYsIDB4NDMsIDB4MDAsIDB4QkUsIDB4REQsIDB4ODEsIDB4RjEsIDB4MDIsCisJIDB4QUMsIDB4RjEsIDB4QUUsIDB4RkQsIDB4QzEsIDB4ODQsIDB4QUMsIDB4RkIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDUsCisJIDB4MjksIDB4NDMsIDB4RkMsIDB4QTMsIDB4NjYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MDAsIDB4NjQsIDB4QkQsIDB4REIsCisJIDB4MDMsIDB4NjEsIDB4MEUsIDB4NjUsIDB4MjQsIDB4NjAsIDB4NzIsIDB4NjMsIDB4NDMsIDB4NDksIDB4QTMsIDB4RDMsIDB4MDYsIDB4QTMsIDB4MDAsIDB4QTgsCisJIDB4Q0QsIDB4ODEsIDB4MDQsIDB4MDIsIDB4RjksIDB4MDIsIDB4QUQsIDB4NjAsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MjYsIDB4RTYsIDB4MDEsCisJIDB4RDQsIDB4ODAsIDB4NjAsIDB4NDUsIDB4RTMsIDB4MDUsIDB4RjYsIDB4QTMsIDB4QkQsIDB4RDEsIDB4QkQsIDB4RDEsIDB4NDQsIDB4NDcsIDB4NDQsIDB4NDgsCisJIDB4NDQsIDB4NDUsIDB4MjQsIDB4NjAsIDB4QjAsIDB4NjQsIDB4NDQsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjAsIDB4MjIsIDB4NjMsCisJIDB4MEQsIDB4NjUsIDB4MDAsIDB4NjEsIDB4NDEsIDB4NDgsIDB4QTMsIDB4RDMsIDB4MDYsIDB4QTMsIDB4QUMsIDB4ODYsIDB4MDAsIDB4NjEsIDB4MDksIDB4MDMsCisJIDB4MDAsIDB4RjIsIDB4MDksIDB4RjAsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsIDB4REQsIDB4ODEsIDB4RkMsIDB4MDIsIDB4NjQsIDB4NDQsIDB4QUMsIDB4ODYsCisJIDB4RjYsIDB4MDEsIDB4NjEsIDB4NDQsIDB4MjUsIDB4NDYsIDB4MjcsIDB4REEsIDB4NjUsIDB4NDQsIDB4MjgsIDB4NDUsIDB4NDUsIDB4ODgsIDB4Q0MsIDB4ODUsCisJIDB4NUEsIDB4ODcsIDB4RTksIDB4MDIsIDB4MDAsIDB4NjQsIDB4MjcsIDB4REEsIDB4NUEsIDB4REEsIDB4NUEsIDB4ODcsIDB4QTksIDB4RjMsIDB4QTgsIDB4RjEsCisJIDB4MDIsIDB4QTQsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDUsIDB4MDAsIDB4NjEsIDB4MUUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsCisJIDB4MDQsIDB4MDMsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsIDB4REQsIDB4ODEsIDB4RkMsIDB4MDIsIDB4NjUsIDB4NDQsIDB4MDIsIDB4QTUsIDB4NjUsIDB4NDYsCisJIDB4NjQsIDB4NDQsIDB4Q0MsIDB4OUMsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDIsIDB4NjEsIDB4NDQsIDB4MjUsIDB4NDYsIDB4MjcsIDB4REEsIDB4NUEsIDB4ODcsCisJIDB4MjgsIDB4NDUsIDB4NDUsIDB4ODgsIDB4MDAsIDB4NjQsIDB4MjcsIDB4REEsIDB4NUEsIDB4ODcsIDB4MDYsIDB4NjAsIDB4NDAsIDB4NjUsIDB4QUQsIDB4RjMsCisJIDB4MDEsIDB4NjEsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsIDB4MDMsIDB4MDMsIDB4RDUsIDB4ODAsIDB4REQsIDB4ODEsIDB4RkEsIDB4MDQsIDB4Q0QsIDB4ODQsCisJIDB4MjUsIDB4NDYsIDB4MjcsIDB4REEsIDB4MjgsIDB4NDUsIDB4QzQsIDB4ODQsIDB4NUEsIDB4REEsIDB4REEsIDB4ODEsIDB4QUMsIDB4RjEsIDB4NTksIDB4RDgsCisJIDB4MjQsIDB4NjAsIDB4MjAsIDB4NjQsIDB4MTgsIDB4NjMsIDB4QTAsIDB4RDEsIDB4MDYsIDB4QTQsIDB4NTksIDB4RDgsIDB4RkMsIDB4MUYsIDB4MDAsIDB4NjQsCisJIDB4NTksIDB4REEsIDB4NTksIDB4REEsIDB4MDEsIDB4NjAsIDB4NUMsIDB4NjQsIDB4MEEsIDB4NjMsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDgsIDB4RkQsIDB4MUYsCisJIDB4REMsIDB4RjEsIDB4NTksIDB4RDgsIDB4NzUsIDB4MDEsIDB4MDcsIDB4NEIsIDB4QUYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NzAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MEIsIDB4NDcsIDB4NTgsIDB4NEYsIDB4MjEsIDB4MDAsIDB4NkMsIDB4MDEsIDB4MDcsIDB4NEIsIDB4QUYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NzAsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEIsIDB4NDcsIDB4MjcsIDB4NDQsIDB4MDAsIDB4QkUsIDB4MDgsIDB4RjAsIDB4MTUsIDB4MDMsIDB4NjQsIDB4NDIsIDB4NEEsIDB4RDMsCisJIDB4MDksIDB4RjIsIDB4REMsIDB4ODMsIDB4QTIsIDB4REQsIDB4MjUsIDB4NDMsIDB4MDksIDB4RkMsIDB4NjMsIDB4NDYsIDB4MjcsIDB4NDMsIDB4MEEsIDB4RkMsCisJIDB4MDksIDB4RkEsIDB4MDgsIDB4RjgsIDB4MDAsIDB4QTgsIDB4NjYsIDB4NDMsIDB4MDMsIDB4MDIsIDB4NjQsIDB4NDQsIDB4NTgsIDB4REQsIDB4MDMsIDB4MDAsCisJIDB4NjAsIDB4NDYsIDB4MjUsIDB4NDQsIDB4MEEsIDB4RkEsIDB4NEMsIDB4MDEsIDB4MjcsIDB4NDMsIDB4RTMsIDB4ODEsIDB4RTksIDB4ODEsIDB4MDMsIDB4MDUsCisJIDB4MTYsIDB4MDMsIDB4MDAsIDB4NjEsIDB4MDEsIDB4MDAsIDB4RTQsIDB4NjMsIDB4NjEsIDB4NDYsIDB4QkYsIDB4RDIsIDB4MjcsIDB4NDUsIDB4REMsIDB4ODQsCisJIDB4QTIsIDB4REEsIDB4QTMsIDB4RDIsIDB4MjUsIDB4NDYsIDB4ODgsIDB4RjgsIDB4MDQsIDB4MUIsIDB4MjUsIDB4NDQsIDB4NjEsIDB4NDYsIDB4QkUsIDB4REEsCisJIDB4MDQsIDB4MDAsIDB4MDksIDB4RkEsIDB4NjAsIDB4NDYsIDB4MjUsIDB4NDQsIDB4MEEsIDB4RkEsIDB4NjEsIDB4NDYsIDB4QTMsIDB4REEsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4QTAsIDB4RkUsIDB4MDcsIDB4MDUsIDB4QTMsIDB4RkUsIDB4MDcsIDB4MDUsIDB4QTEsIDB4RkUsIDB4NTIsIDB4MDUsIDB4NjAsIDB4NjQsCisJIDB4M0IsIDB4REIsIDB4MTIsIDB4MDAsIDB4MjAsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NEYsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsCisJIDB4QjgsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RkIsIDB4QjQsIDB4QTMsIDB4REIsIDB4QTAsIDB4NEMsIDB4NTksIDB4QkMsIDB4RkYsIDB4QjQsCisJIDB4QTAsIDB4NTEsIDB4QTAsIDB4NEMsIDB4N0QsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODMsIDB4M0UsIDB4NDAsIDB4NjAsCisJIDB4MEIsIDB4NjUsIDB4MkIsIDB4NDQsIDB4MDAsIDB4NjMsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MDIsIDB4MjQsIDB4OTQsIDB4ODQsIDB4RjMsIDB4ODMsCisJIDB4Q0QsIDB4ODEsIDB4RkYsIDB4RkYsIDB4RjgsIDB4MDIsIDB4REYsIDB4ODMsIDB4MkYsIDB4NTgsIDB4NDAsIDB4NEIsIDB4MDAsIDB4NjIsIDB4MDEsIDB4NjQsCisJIDB4RDQsIDB4ODAsIDB4RTAsIDB4ODQsIDB4MUEsIDB4MDMsIDB4RDQsIDB4ODAsIDB4RTAsIDB4ODQsIDB4MTUsIDB4MDMsIDB4NjEsIDB4NDQsIDB4MTEsIDB4NjEsCisJIDB4RTAsIDB4ODQsIDB4Q0QsIDB4ODEsIDB4RkQsIDB4MDQsIDB4MDEsIDB4MDAsIDB4RTAsIDB4ODQsIDB4RjIsIDB4ODIsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MjQsCisJIDB4QzYsIDB4ODIsIDB4MDIsIDB4MjgsIDB4RDYsIDB4ODIsIDB4RTIsIDB4ODAsIDB4Q0QsIDB4ODEsIDB4MDIsIDB4MjgsIDB4MDEsIDB4QkMsIDB4RjQsIDB4MDIsCisJIDB4MDEsIDB4MkEsIDB4QzYsIDB4ODIsIDB4MDMsIDB4MDAsIDB4RTksIDB4ODEsIDB4RjIsIDB4ODIsIDB4NjEsIDB4NDQsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4QTgsIDB4MTAsIDB4NjEsIDB4MDQsIDB4MDMsIDB4RjAsIDB4ODQsIDB4Q0QsIDB4ODEsIDB4RkQsIDB4MDQsIDB4NjEsIDB4NDQsIDB4MkQsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4M0IsIDB4REIsIDB4M0MsIDB4NDQsIDB4QUMsIDB4ODAsIDB4RkYsIDB4RkYsIDB4QkQsIDB4MDIsIDB4OEIsIDB4RjMsCisJIDB4OEMsIDB4RjMsIDB4MDIsIDB4QTgsIDB4MDIsIDB4QTgsIDB4MDgsIDB4MDIsIDB4MDAsIDB4NjQsIDB4OEQsIDB4RkIsIDB4OEIsIDB4RkIsIDB4OEMsIDB4RkIsCisJIDB4MDAsIDB4NjQsIDB4OEUsIDB4RkIsIDB4Q0EsIDB4RkUsIDB4MkQsIDB4MDAsIDB4MDMsIDB4MDIsIDB4MDAsIDB4NjQsIDB4OEMsIDB4RkIsIDB4Q0EsIDB4RkUsCisJIDB4MDEsIDB4NjQsIDB4M0IsIDB4REIsIDB4MjQsIDB4NjAsIDB4MjgsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsCisJIDB4MTQsIDB4MDMsIDB4REMsIDB4RjMsIDB4MkEsIDB4RjIsIDB4RkQsIDB4QTAsIDB4NjAsIDB4NDAsIDB4ODAsIDB4M0EsIDB4MjksIDB4MDAsIDB4MjgsIDB4MDIsCisJIDB4OUIsIDB4RkUsIDB4MjYsIDB4MDUsIDB4MjQsIDB4NjAsIDB4NkUsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RTUsIDB4MDEsIDB4OEMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QTgsCisJIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDIsIDB4MjQsIDB4NjAsIDB4MjIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsCisJIDB4MEYsIDB4MDIsIDB4ODYsIDB4RkYsIDB4MjAsIDB4NDAsIDB4NTIsIDB4MjcsIDB4MDcsIDB4MDAsIDB4OUEsIDB4RkUsIDB4MDUsIDB4MDQsIDB4OUQsIDB4RkUsCisJIDB4MDMsIDB4MDQsIDB4RjEsIDB4RkUsIDB4MTIsIDB4NjQsIDB4M0IsIDB4REIsIDB4ODQsIDB4RkYsIDB4QjAsIDB4NjAsIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjYsIDB4NDQsIDB4RkMsIDB4RkIsIDB4NDYsIDB4NUMsIDB4MkQsIDB4NjAsIDB4NUEsIDB4NjMsIDB4QTMsIDB4RDMsIDB4QjAsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEQsIDB4RjIsIDB4NjAsIDB4NUMsIDB4NjQsIDB4NUYsIDB4MEQsIDB4RkEsIDB4MTEsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4OUQsIDB4RkUsIDB4MEIsIDB4MDUsIDB4MjQsIDB4NjAsIDB4OTIsIDB4NjUsIDB4MDgsIDB4NjQsIDB4QTUsIDB4REIsIDB4QjEsIDB4NjAsIDB4NEQsIDB4NjQsCisJIDB4NEYsIDB4RkIsIDB4MkQsIDB4RkYsIDB4QjAsIDB4NjAsIDB4QTQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsCisJIDB4QTksIDB4RjMsIDB4MDcsIDB4MDIsIDB4MjMsIDB4RjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4QjgsIDB4NjAsIDB4MzYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RDgsIDB4RjMsIDB4NDAsIDB4MDMsIDB4NjAsIDB4NDAsIDB4MDMsIDB4M0EsIDB4M0QsIDB4MDAsIDB4NjYsIDB4NDEsCisJIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4NjEsIDB4NDYsIDB4NjQsIDB4NDEsIDB4NEQsIDB4RjEsIDB4NjAsIDB4NDAsIDB4MDMsIDB4M0EsIDB4MzQsIDB4MDAsCisJIDB4NjQsIDB4NDAsIDB4RkYsIDB4MjIsIDB4MzEsIDB4MDAsIDB4MDUsIDB4N0UsIDB4NjYsIDB4NDUsIDB4NjEsIDB4NDYsIDB4NkYsIDB4RkEsIDB4NjUsIDB4NDYsCisJIDB4MDcsIDB4RjAsIDB4MDAsIDB4NjUsIDB4NjUsIDB4NDMsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RjIsIDB4OEMsIDB4RkEsIDB4MDAsIDB4QTgsCisJIDB4NkYsIDB4RjIsIDB4MTUsIDB4MDMsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4NzAsIDB4RjIsIDB4MDAsIDB4QkIsIDB4RkYsIDB4QTAsIDB4MDcsIDB4MDMsCisJIDB4MEUsIDB4MDYsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4RkIsIDB4MDQsIDB4MDgsIDB4MDAsIDB4QjksIDB4ODEsCisJIDB4RTgsIDB4ODQsIDB4RDksIDB4ODEsIDB4RkQsIDB4MDQsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MEUsIDB4RkEsIDB4MEMsIDB4RjQsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NEQsIDB4RkIsIDB4NEMsIDB4RkIsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MEUsIDB4RjIsCisJIDB4NjEsIDB4NDYsIDB4RkYsIDB4RkYsIDB4RjAsIDB4N0UsIDB4NEUsIDB4RkIsIDB4MkEsIDB4RjIsIDB4MDAsIDB4NjMsIDB4NDAsIDB4NDcsIDB4NTAsIDB4MzYsCisJIDB4MDUsIDB4MDAsIDB4QTQsIDB4MzYsIDB4MDMsIDB4MDAsIDB4ODAsIDB4MzYsIDB4MDEsIDB4MDAsIDB4MDEsIDB4NjMsIDB4NDgsIDB4RkQsIDB4NDAsIDB4NDcsCisJIDB4MDgsIDB4MkEsIDB4MEEsIDB4MDAsIDB4MDMsIDB4MkYsIDB4MDgsIDB4MDAsIDB4ODEsIDB4RjEsIDB4MkMsIDB4RjgsIDB4ODIsIDB4RjEsIDB4RkYsIDB4RkYsCisJIDB4MkQsIDB4RjgsIDB4ODMsIDB4RjEsIDB4MkUsIDB4RjgsIDB4RkYsIDB4RkYsIDB4NEEsIDB4RjMsIDB4MzUsIDB4RkEsIDB4MTAsIDB4QTQsIDB4NEEsIDB4RkIsCisJIDB4MDAsIDB4NjQsIDB4MTUsIDB4RkEsIDB4MTYsIDB4RkEsIDB4MEYsIDB4RkEsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsCisJIDB4MEUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4MDAsIDB4N0YsIDB4NjQsIDB4NUUsIDB4NEIsIDB4RkIsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0UsIDB4REIsIDB4RkIsCisJIDB4MDcsIDB4RjAsIDB4QTksIDB4RjMsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4REIsIDB4RjMsIDB4REEsIDB4RkIsCisJIDB4NjAsIDB4NDEsIDB4MDMsIDB4RjIsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjIsIDB4RkMsIDB4QTUsIDB4MDAsIDB4N0YsIDB4RDQsIDB4ODQsIDB4MjcsIDB4NDUsCisJIDB4M0MsIDB4NDYsIDB4MUEsIDB4RkEsIDB4MjIsIDB4NjMsIDB4N0IsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTQsIDB4ODQsIDB4MDMsIDB4MkIsIDB4MUMsIDB4NjMsCisJIDB4MkEsIDB4RkEsIDB4NjAsIDB4NDAsIDB4QTQsIDB4MzYsIDB4MTQsIDB4NjMsIDB4NDMsIDB4NEMsIDB4MDAsIDB4N0MsIDB4MjIsIDB4RjgsIDB4NjQsIDB4NDEsCisJIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4MzYsIDB4RjIsIDB4NjMsIDB4NDYsIDB4RkYsIDB4QjQsIDB4MjIsIDB4RkEsIDB4NjAsIDB4NDAsCisJIDB4MDAsIDB4MzYsIDB4NzYsIDB4MDAsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4M0EsIDB4QTUsIDB4MDAsIDB4MDMsIDB4RjIsCisJIDB4MDAsIDB4RjQsIDB4QTAsIDB4RDIsIDB4QUEsIDB4NjAsIDB4QUEsIDB4NjUsIDB4NUEsIDB4RDAsIDB4RDQsIDB4ODAsIDB4MDMsIDB4NjQsIDB4MEEsIDB4MDIsCisJIDB4RDAsIDB4ODAsIDB4MDAsIDB4NjQsIDB4NUEsIDB4RDAsIDB4MDYsIDB4MDIsIDB4RDAsIDB4ODAsIDB4RjgsIDB4N0YsIDB4RDAsIDB4ODAsIDB4MDEsIDB4MDMsCisJIDB4MDEsIDB4MDIsIDB4MDEsIDB4NjEsIDB4NjIsIDB4NDMsIDB4NDYsIDB4NDMsIDB4M0MsIDB4NDYsIDB4MDcsIDB4RjQsIDB4MzYsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4QTMsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MjIsIDB4MjYsIDB4NUMsIDB4MDAsIDB4NjAsIDB4NDUsIDB4NjMsIDB4NDIsIDB4NUEsIDB4RDAsIDB4Q0QsIDB4ODEsCisJIDB4M0MsIDB4NDYsIDB4MTQsIDB4MDIsIDB4NjQsIDB4NDQsIDB4ODgsIDB4M0EsIDB4MTEsIDB4MDAsIDB4OEUsIDB4M0IsIDB4MEYsIDB4MDAsIDB4NjUsIDB4NDQsCisJIDB4MDEsIDB4MjYsIDB4N0EsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MDEsIDB4MDAsIDB4MkQsIDB4MDAsIDB4QTMsIDB4NDYsCisJIDB4MzcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MkIsIDB4NkYsIDB4MDAsIDB4NTYsIDB4MDAsIDB4QTMsIDB4NDYsIDB4NjUsIDB4NDQsCisJIDB4MDEsIDB4MjYsIDB4MEIsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MDEsIDB4MDAsIDB4MUQsIDB4MDAsIDB4MzcsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MjcsIDB4NDgsIDB4MDAsIDB4MTcsIDB4MDAsIDB4QTksIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsCisJIDB4MzYsIDB4RjIsIDB4NjYsIDB4NDMsIDB4RkYsIDB4QjQsIDB4M0MsIDB4NDYsIDB4MjIsIDB4RjAsIDB4NjAsIDB4NDcsIDB4QjAsIDB4ODQsIDB4MjIsIDB4RkEsCisJIDB4NjMsIDB4NDYsIDB4MzcsIDB4RjAsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MDMsIDB4MDAsIDB4MTAsIDB4MjcsIDB4MDEsIDB4MDAsIDB4MDQsIDB4MDAsCisJIDB4NjQsIDB4NDAsIDB4ODAsIDB4MjcsIDB4MzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4M0MsIDB4NDYsIDB4MDIsIDB4NjUsIDB4QjcsIDB4NjAsIDB4NjYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4Q0QsIDB4ODEsIDB4NjMsIDB4NDIsIDB4NUEsIDB4RDAsIDB4M0MsIDB4NDYsIDB4MjYsIDB4MDIsIDB4NjQsIDB4NDQsIDB4ODgsIDB4M0EsCisJIDB4MjMsIDB4MDAsIDB4NzcsIDB4MzcsIDB4MzksIDB4MDAsIDB4NzgsIDB4MzcsIDB4MzcsIDB4MDAsIDB4OEUsIDB4MzcsIDB4MzUsIDB4MDAsIDB4RjEsIDB4MDEsCisJIDB4MkQsIDB4NjAsIDB4NTIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MkQsIDB4MDAsIDB4MDcsIDB4MDAsCisJIDB4MkQsIDB4NjAsIDB4NTIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4RTIsIDB4MDEsIDB4M0MsIDB4NDYsCisJIDB4M0UsIDB4RjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4RjAsIDB4ODQsIDB4QTQsIDB4ODQsIDB4MTgsIDB4RkEsIDB4MkEsIDB4RjIsIDB4QkYsIDB4NjAsCisJIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4MkEsIDB4RkEsIDB4MTgsIDB4MDAsIDB4M0MsIDB4NDYsIDB4MjIsIDB4RjAsIDB4ODAsIDB4NjcsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REEsIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjIsIDB4M0UsIDB4RjAsIDB4MDgsIDB4QTQsIDB4NjAsIDB4NDEsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDQsIDB4MkIsIDB4MDQsIDB4MDAsCisJIDB4NjEsIDB4NDQsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MjYsIDB4M0YsIDB4RkEsIDB4M0MsIDB4NDYsIDB4MkMsIDB4RjIsIDB4MjcsIDB4NDAsIDB4MDEsIDB4MjcsCisJIDB4MzIsIDB4RjIsIDB4RDUsIDB4RjEsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4NTMsIDB4MDAsIDB4MDksIDB4NjAsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsCisJIDB4M0YsIDB4RjIsIDB4MDksIDB4MDYsIDB4MkMsIDB4NDUsIDB4QzQsIDB4ODQsIDB4RDAsIDB4ODAsIDB4NDAsIDB4NEEsIDB4NDAsIDB4MDYsIDB4NjAsIDB4NDMsCisJIDB4NjQsIDB4NDQsIDB4NTQsIDB4ODgsIDB4MTgsIDB4MDAsIDB4NjAsIDB4NDUsIDB4MjgsIDB4NjAsIDB4MzYsIDB4NjQsIDB4QTAsIDB4RDMsIDB4REIsIDB4RjMsCisJIDB4MDAsIDB4QkMsIDB4NjAsIDB4NDcsIDB4RUMsIDB4QTAsIDB4MzMsIDB4MDMsIDB4MzIsIDB4MDcsIDB4MkMsIDB4NDQsIDB4QzQsIDB4ODEsIDB4MDIsIDB4NjAsCisJIDB4MUMsIDB4NjUsIDB4NDUsIDB4NEEsIDB4RDUsIDB4ODAsIDB4MkMsIDB4NDUsIDB4MkEsIDB4MDYsIDB4MjcsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MzAsIDB4MDAsCisJIDB4MkEsIDB4NDMsIDB4RDcsIDB4ODUsIDB4NDUsIDB4NDgsIDB4RDYsIDB4RjEsIDB4MEYsIDB4RjIsIDB4RDMsIDB4ODAsIDB4MDEsIDB4NjUsIDB4MDEsIDB4MDcsCisJIDB4MDAsIDB4NjUsIDB4QjQsIDB4ODQsIDB4MEYsIDB4RkEsIDB4MDAsIDB4NjMsIDB4M0YsIDB4RjIsIDB4MjgsIDB4NDUsIDB4NjAsIDB4NDEsIDB4RDQsIDB4ODQsCisJIDB4REYsIDB4ODMsIDB4RkMsIDB4MDcsIDB4MTQsIDB4RkMsIDB4NjEsIDB4NDQsIDB4MDEsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MDksIDB4M0EsIDB4MDYsIDB4MDAsCisJIDB4MjgsIDB4NDQsIDB4NDgsIDB4ODgsIDB4MkEsIDB4NDQsIDB4QzgsIDB4ODMsIDB4NDMsIDB4NEEsIDB4RTUsIDB4MDEsIDB4MTcsIDB4RkEsIDB4MDQsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4MjcsIDB4NDUsIDB4QjQsIDB4ODQsIDB4MkEsIDB4RkEsIDB4MjgsIDB4NDMsIDB4MTYsIDB4RkMsIDB4MEQsIDB4MDAsIDB4M0YsIDB4RjIsCisJIDB4MkMsIDB4NDUsIDB4RDYsIDB4RjEsIDB4QzQsIDB4ODEsIDB4RDEsIDB4ODAsIDB4MEYsIDB4RjIsIDB4MDEsIDB4MDYsIDB4MDEsIDB4QkMsIDB4MEYsIDB4RkEsCisJIDB4M0YsIDB4RjIsIDB4MTcsIDB4RkEsIDB4MDEsIDB4NjQsIDB4MTQsIDB4RkEsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4MEUsIDB4RjAsCisJIDB4NjMsIDB4NDYsIDB4MDAsIDB4N0YsIDB4NjQsIDB4NUUsIDB4NEIsIDB4RkIsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0UsIDB4REIsIDB4RkIsIDB4N0MsIDB4RjEsCisJIDB4NjAsIDB4NDMsIDB4NjAsIDB4NDcsIDB4RDAsIDB4ODAsIDB4QzAsIDB4NjUsIDB4MDEsIDB4MDYsIDB4NjQsIDB4NDQsIDB4MEEsIDB4MzYsIDB4NzAsIDB4NjQsCisJIDB4MTQsIDB4MzYsIDB4MzgsIDB4NjQsIDB4MzcsIDB4MzYsIDB4MTUsIDB4NjQsIDB4NkUsIDB4MzYsIDB4MEIsIDB4NjQsIDB4NDQsIDB4ODYsIDB4MkEsIDB4RjIsCisJIDB4MDcsIDB4RjAsIDB4NjAsIDB4NDAsIDB4QjAsIDB4M0EsIDB4MDMsIDB4MDAsIDB4NDAsIDB4M0IsIDB4MDEsIDB4MDAsIDB4MTIsIDB4MDAsIDB4MEMsIDB4QjQsCisJIDB4MDgsIDB4M0EsIDB4NTUsIDB4MDAsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MkIsIDB4NTAsIDB4MDAsIDB4MTcsIDB4RjIsCisJIDB4MjIsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MjIsIDB4MjIsIDB4MDQsIDB4MDAsIDB4MDAsIDB4QTgsIDB4MDEsIDB4QTgsIDB4NDcsIDB4MDMsCisJIDB4NDYsIDB4MDMsIDB4M0MsIDB4NDYsIDB4MkEsIDB4RjAsIDB4NDAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NjAsIDB4NDUsIDB4MjIsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MEEsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4MDQsIDB4MjcsIDB4MDcsIDB4MDAsIDB4NjUsIDB4NDQsIDB4MkEsIDB4NjUsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MkIsIDB4MjQsIDB4NjUsIDB4NDUsIDB4NEMsCisJIDB4MkUsIDB4MDAsIDB4NjUsIDB4NDQsIDB4MkUsIDB4NjUsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MkIsIDB4MjgsIDB4NjUsIDB4NDUsIDB4NEMsIDB4MDcsIDB4RjAsCisJIDB4QTksIDB4RjMsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4MDAsIDB4N0MsIDB4MDMsIDB4MDMsIDB4NjMsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDEsIDB4MDAsCisJIDB4M0QsIDB4RjEsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDgsIDB4QjAsIDB4M0UsIDB4RjIsIDB4MTksIDB4MDMsIDB4NjAsIDB4NDcsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MDMsIDB4QjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MTEsIDB4MDMsIDB4MjQsIDB4NjAsIDB4NkUsIDB4NjIsCisJIDB4MjQsIDB4NjAsIDB4NDYsIDB4NjQsIDB4QTIsIDB4REIsIDB4M0MsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4NUMsIDB4NUMsIDB4RkMsIDB4RkMsIDB4Q0UsIDB4RkUsIDB4QjAsIDB4NjAsIDB4RTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4REIsIDB4RjEsCisJIDB4MkMsIDB4NDUsIDB4NjQsIDB4NDMsIDB4MTcsIDB4RjIsIDB4NEIsIDB4RjEsIDB4QzQsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODEsCisJIDB4NjMsIDB4NDAsIDB4MzcsIDB4MzcsIDB4RTEsIDB4ODEsIDB4NjQsIDB4NDUsIDB4QjAsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QUUsIDB4ODIsIDB4RkMsIDB4QTIsIDB4MEEsIDB4MDMsIDB4NjMsIDB4NDAsIDB4NkUsIDB4M0IsIDB4MDYsIDB4MDAsIDB4NjAsIDB4NDEsIDB4MDQsIDB4MEQsCisJIDB4NjMsIDB4NDQsIDB4ODAsIDB4N0UsIDB4REIsIDB4RkIsIDB4NjEsIDB4NDQsIDB4REMsIDB4ODQsIDB4MkIsIDB4RjAsIDB4MUIsIDB4RkEsIDB4NjQsIDB4NDQsCisJIDB4ODAsIDB4MjcsIDB4MzQsIDB4MDAsIDB4MTYsIDB4RjIsIDB4MEYsIDB4RjAsIDB4QUMsIDB4ODQsIDB4MkMsIDB4NDUsIDB4MjksIDB4MDMsIDB4NEIsIDB4RjEsCisJIDB4QzQsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODEsIDB4NjMsIDB4NDAsIDB4MzcsIDB4MzcsIDB4RTEsIDB4ODEsIDB4NjQsIDB4NDUsCisJIDB4MEYsIDB4RjAsIDB4QjAsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QUUsIDB4ODIsIDB4RkMsIDB4QTIsIDB4MEEsIDB4MDMsCisJIDB4NjMsIDB4NDAsIDB4NkUsIDB4M0IsIDB4MDYsIDB4MDAsIDB4NjAsIDB4NDEsIDB4MDQsIDB4MEQsIDB4ODAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4MEYsIDB4RkEsCisJIDB4NjEsIDB4NDQsIDB4REMsIDB4ODQsIDB4MUQsIDB4RkEsIDB4REUsIDB4NjUsIDB4QzQsIDB4ODUsIDB4MjYsIDB4NDEsIDB4RTEsIDB4ODEsIDB4QzUsIDB4ODQsCisJIDB4MkIsIDB4RkEsIDB4MUIsIDB4RjAsIDB4REUsIDB4NjQsIDB4QzAsIDB4ODUsIDB4MjYsIDB4NDQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODQsIDB4MTAsIDB4RkEsCisJIDB4MjYsIDB4NDQsIDB4MkMsIDB4RjAsIDB4MEEsIDB4QTQsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDAsIDB4NjQsIDB4MTEsIDB4RkEsIDB4REIsIDB4RjMsCisJIDB4MTMsIDB4RkEsIDB4RkYsIDB4RkYsIDB4MEQsIDB4RjIsIDB4M0UsIDB4RjAsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4NjQsIDB4NDEsIDB4MDEsIDB4QjEsCisJIDB4MDEsIDB4NjMsIDB4MUQsIDB4MDIsIDB4NjAsIDB4NDEsIDB4RkYsIDB4MjIsIDB4MDQsIDB4MDAsIDB4QjAsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QTcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4OTIsIDB4NjQsIDB4QTAsIDB4REQsIDB4MkQsIDB4NjAsIDB4NUEsIDB4NjIsIDB4QTIsIDB4RDMsIDB4QjAsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4MDEsIDB4NjMsIDB4NjEsIDB4NDAsIDB4RkYsIDB4MjIsIDB4MDQsIDB4MDAsCisJIDB4QjAsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4OTQsIDB4NjQsIDB4QTAsIDB4REQsIDB4MkEsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjcsIDB4MDMsIDB4MDAsIDB4QjUsIDB4NjAsIDB4MTksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4RjIsCisJIDB4NDYsIDB4NDMsIDB4NjAsIDB4NDAsIDB4MjIsIDB4MjYsIDB4OEIsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MEMsIDB4MDAsCisJIDB4QjUsIDB4NjAsIDB4MTksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjcsIDB4MDMsIDB4MDAsIDB4QjUsIDB4NjAsIDB4MTksIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QTksIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4MDIsIDB4MDAsIDB4MDcsIDB4RjQsIDB4RkYsIDB4RkYsIDB4QTMsIDB4NDYsIDB4MkEsIDB4RjIsCisJIDB4QTMsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjcsIDB4M0IsIDB4MDAsIDB4QTksIDB4RjMsIDB4NjYsIDB4NUMsIDB4RDAsIDB4ODAsIDB4MzcsIDB4RjAsCisJIDB4MDgsIDB4MDMsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MTIsIDB4MDAsIDB4RkYsIDB4NjAsIDB4RUYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4MzcsIDB4RkEsCisJIDB4MjQsIDB4MDAsIDB4M0QsIDB4RjMsIDB4MDEsIDB4NjEsIDB4NjAsIDB4NDMsIDB4Q0YsIDB4ODMsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MEQsIDB4RTksIDB4ODEsCisJIDB4QTEsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4OTEsIDB4ODQsIDB4MzcsIDB4RkEsIDB4MTcsIDB4MDAsIDB4NDcsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4MTAsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDQsIDB4RkYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4REMsIDB4ODQsIDB4NDcsIDB4RkEsIDB4NDYsIDB4RjIsCisJIDB4MTYsIDB4MDQsIDB4REMsIDB4ODQsIDB4NDYsIDB4RkEsIDB4NDUsIDB4RjIsIDB4MDgsIDB4MDQsIDB4REMsIDB4ODQsIDB4NDUsIDB4RkEsIDB4MDUsIDB4MDQsCisJIDB4MzcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MzcsIDB4RkEsIDB4MEQsIDB4NjAsIDB4M0UsIDB4NjIsIDB4ODAsIDB4RkYsCisJIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4QTIsIDB4REIsIDB4QkUsIDB4NjAsIDB4NjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODQsIDB4RkYsIDB4MEQsIDB4NjAsCisJIDB4M0UsIDB4NjIsIDB4ODAsIDB4RkYsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4QTIsIDB4REIsIDB4QkUsIDB4NjAsIDB4REUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4ODQsIDB4RkYsIDB4QTksIDB4RjMsIDB4NjYsIDB4NUMsIDB4RDAsIDB4ODAsIDB4MDAsIDB4N0MsIDB4MDcsIDB4MDMsIDB4NjYsIDB4NDMsIDB4M0MsIDB4NDYsCisJIDB4MjIsIDB4RjIsIDB4NjMsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDEsIDB4MDAsIDB4M0MsIDB4RjEsIDB4NDcsIDB4RjAsIDB4NjQsIDB4NDEsCisJIDB4NjQsIDB4NDcsIDB4RkYsIDB4QjQsIDB4NjAsIDB4NUYsIDB4MjAsIDB4QkMsIDB4ODAsIDB4MjYsIDB4ODAsIDB4QUMsIDB4NjAsIDB4NDcsIDB4QTMsIDB4NDYsCisJIDB4M0EsIDB4RkEsIDB4NjQsIDB4NDQsIDB4MjAsIDB4N0YsIDB4MzQsIDB4OTQsIDB4M0IsIDB4RkEsIDB4QTMsIDB4NDYsIDB4NDYsIDB4RjIsIDB4NDUsIDB4RjAsCisJIDB4QTMsIDB4NDYsIDB4M0MsIDB4RkEsIDB4M0QsIDB4RjgsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUEsIDB4MEYsIDB4NjQsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4OEEsIDB4MDAsIDB4MkEsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjcsIDB4MzUsIDB4MDAsIDB4MkEsIDB4RjIsIDB4MDAsIDB4NjAsIDB4N0MsIDB4NjIsIDB4NjAsIDB4NDAsCisJIDB4NDAsIDB4MkIsIDB4MjcsIDB4MDAsIDB4QTIsIDB4RDMsIDB4MDAsIDB4NjEsIDB4NjAsIDB4RkUsIDB4QTAsIDB4RDMsIDB4REUsIDB4ODIsIDB4QTIsIDB4RDEsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4NjQsIDB4NUYsIDB4REMsIDB4ODQsIDB4RjEsIDB4ODEsIDB4QzAsIDB4MkIsIDB4MDQsIDB4MDAsIDB4ODAsIDB4MkEsCisJIDB4MDIsIDB4MDAsIDB4N0YsIDB4QTQsIDB4REMsIDB4ODQsIDB4RkYsIDB4M0IsIDB4MDMsIDB4MDAsIDB4NjAsIDB4NDcsIDB4REMsIDB4ODcsIDB4MDEsIDB4NjEsCisJIDB4QzAsIDB4ODAsIDB4MDAsIDB4MzYsIDB4REMsIDB4ODQsIDB4NEUsIDB4REIsIDB4NjAsIDB4RkUsIDB4REEsIDB4ODIsIDB4QTIsIDB4RDEsIDB4RkYsIDB4RkYsCisJIDB4QzEsIDB4ODQsIDB4RjAsIDB4MjIsIDB4MTAsIDB4QTQsIDB4RjAsIDB4MkEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4N0MsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDMsIDB4NUEsIDB4RDEsIDB4M0EsIDB4RkEsCisJIDB4M0IsIDB4RjgsIDB4NzQsIDB4NjIsIDB4QTIsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsCisJIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjIsCisJIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDEsIDB4NUEsIDB4RDEsIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDQsIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4NjQsIDB4NDcsIDB4RTQsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsCisJIDB4RTYsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjUsIDB4NDAsIDB4MEQsIDB4M0EsCisJIDB4MUMsIDB4MDAsIDB4NjQsIDB4NDcsIDB4RTgsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTksIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4NjQsIDB4NDcsIDB4RUEsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsCisJIDB4RUMsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUUsIDB4N0YsCisJIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUYsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUEsIDB4NjUsIDB4NDQsCisJIDB4MDIsIDB4QTQsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsCisJIDB4MDAsIDB4RUEsIDB4MDIsIDB4NjQsIDB4M0IsIDB4REIsIDB4QjgsIDB4NjAsIDB4QkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4RkMsIDB4RkIsCisJIDB4MDcsIDB4RjAsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4QTksIDB4RjMsIDB4MTcsIDB4MDMsIDB4RDAsIDB4ODAsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsCisJIDB4NkYsIDB4RjIsIDB4NjEsIDB4NDYsIDB4N0IsIDB4MDMsIDB4NjAsIDB4NDAsIDB4MDAsIDB4MzYsIDB4NzgsIDB4MDAsIDB4NDcsIDB4RjEsIDB4MDcsIDB4RjAsCisJIDB4NjQsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4MDMsIDB4MTIsIDB4QjYsIDB4NjAsIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4RkMsIDB4MEEsIDB4QjcsIDB4NjAsIDB4NTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QjcsIDB4NjAsIDB4NTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDEsCisJIDB4NjQsIDB4NDYsIDB4MEUsIDB4RjIsIDB4NjAsIDB4NDUsIDB4NjEsIDB4NDYsIDB4MTAsIDB4N0UsIDB4NEUsIDB4RkIsIDB4NjUsIDB4NDQsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MzYsIDB4NUMsIDB4MDAsIDB4MDIsIDB4MzYsIDB4NUQsIDB4MDAsIDB4MDMsIDB4MzYsIDB4MzQsIDB4MDAsIDB4MDQsIDB4MzYsIDB4NDUsIDB4MDAsCisJIDB4NjcsIDB4MDAsIDB4MDAsIDB4NjQsIDB4NEMsIDB4RkIsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDUsIDB4N0UsCisJIDB4NkYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MDAsIDB4NjUsIDB4NjUsIDB4NDMsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RjIsIDB4OEMsIDB4RkEsCisJIDB4MDAsIDB4QTgsIDB4NkYsIDB4RjIsIDB4MTUsIDB4MDMsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4NzAsIDB4RjIsIDB4MDAsIDB4QkIsIDB4RkYsIDB4QTAsCisJIDB4MDcsIDB4MDMsIDB4MEUsIDB4MDYsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4RkIsIDB4MDQsIDB4MDgsIDB4MDAsCisJIDB4QjksIDB4ODEsIDB4RTgsIDB4ODQsIDB4RDksIDB4ODEsIDB4RkQsIDB4MDQsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MEUsIDB4RkEsCisJIDB4MEMsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MEUsIDB4RjIsIDB4NjEsIDB4NDYsIDB4RkYsIDB4RkYsIDB4QTAsIDB4N0UsCisJIDB4NEUsIDB4RkIsIDB4MjQsIDB4MDAsIDB4NEMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4NEMsIDB4RkIsIDB4Q0IsIDB4RjMsIDB4NjAsIDB4NDUsCisJIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MUIsIDB4MDIsIDB4MjQsIDB4NjAsIDB4QTYsIDB4NjIsIDB4MEYsIDB4NjAsIDB4OTYsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4QkMsIDB4MDEsIDB4NEMsIDB4RjMsIDB4NjYsIDB4NDEsIDB4REMsIDB4ODQsCisJIDB4NEMsIDB4RkIsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDMsIDB4N0UsIDB4NkYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4NjYsIDB4NDEsCisJIDB4NjQsIDB4NDYsIDB4MEUsIDB4RjIsIDB4NjEsIDB4NDYsIDB4RkYsIDB4RkYsIDB4QTQsIDB4N0UsIDB4NEUsIDB4RkIsIDB4QjcsIDB4NjAsIDB4NTYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDEsIDB4N0UsIDB4NkYsIDB4RkEsIDB4NjEsIDB4NDYsCisJIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MEUsIDB4RjIsIDB4NjEsIDB4NDYsIDB4RkYsIDB4RkYsIDB4QTgsIDB4N0UsIDB4NEUsIDB4RkIsIDB4RUUsIDB4MDEsCisJIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4OEMsIDB4RkEsIDB4NjAsIDB4NDcsIDB4NzAsIDB4RjIsIDB4RkYsIDB4QjUsIDB4MDgsIDB4MTgsCisJIDB4RTQsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4RkIsIDB4MDQsIDB4MDEsIDB4NjQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjQsCisJIDB4MEMsIDB4RjQsIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsIDB4REQsIDB4MDIsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDcsIDB4NzAsIDB4RjIsIDB4RkYsIDB4QjUsIDB4NjEsIDB4NDYsIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MjksIDB4MDMsIDB4RTAsIDB4ODQsCisJIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MDMsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MDEsIDB4NjUsCisJIDB4NjUsIDB4NDMsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RjIsIDB4OEMsIDB4RkEsIDB4MDAsIDB4QTgsIDB4NkYsIDB4RjIsIDB4MTUsIDB4MDMsCisJIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4NzAsIDB4RjIsIDB4MDAsIDB4QkIsIDB4RkYsIDB4QTAsIDB4MDcsIDB4MDMsIDB4MEUsIDB4MDYsIDB4RTgsIDB4ODQsCisJIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4RkIsIDB4MDQsIDB4MDgsIDB4MDAsIDB4QjksIDB4ODEsIDB4RTgsIDB4ODQsIDB4RDksIDB4ODEsCisJIDB4RkQsIDB4MDQsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MEUsIDB4RkEsIDB4MEMsIDB4RjQsIDB4RkYsIDB4RkYsIDB4OTUsIDB4MDEsCisJIDB4OTQsIDB4MDEsIDB4NjUsIDB4NDQsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4QTEsIDB4MDEsIDB4MDIsIDB4MzYsIDB4MDEsIDB4MDAsIDB4OUUsIDB4MDEsCisJIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDEsIDB4N0UsIDB4NkYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MDAsIDB4NjUsCisJIDB4NjUsIDB4NDMsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RjIsIDB4OEMsIDB4RkEsIDB4MDAsIDB4QTgsIDB4NkYsIDB4RjIsIDB4MTUsIDB4MDMsCisJIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4NzAsIDB4RjIsIDB4MDAsIDB4QkIsIDB4RkYsIDB4QTAsIDB4MDcsIDB4MDMsIDB4MEUsIDB4MDYsIDB4RTgsIDB4ODQsCisJIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4RkIsIDB4MDQsIDB4MDgsIDB4MDAsIDB4QjksIDB4ODEsIDB4RTgsIDB4ODQsIDB4RDksIDB4ODEsCisJIDB4RkQsIDB4MDQsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MEUsIDB4RkEsIDB4MEMsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDEsCisJIDB4NjQsIDB4NDYsIDB4MEUsIDB4RjIsIDB4NjEsIDB4NDYsIDB4RDAsIDB4N0UsIDB4NEUsIDB4RkIsIDB4QjcsIDB4NjAsIDB4NTYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDUsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MEUsIDB4RjIsIDB4NjEsIDB4NDYsIDB4MjAsIDB4N0UsIDB4NEUsIDB4RkIsIDB4NjUsIDB4NDQsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MEIsIDB4MDAsIDB4MDIsIDB4MzYsIDB4MUEsIDB4MDAsIDB4MDMsIDB4MzYsIDB4NTMsIDB4MDAsIDB4MDQsIDB4MzYsCisJIDB4NzAsIDB4MDAsIDB4MDUsIDB4MzYsIDB4MTQsIDB4MDAsIDB4QjcsIDB4NjAsIDB4NTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDEsCisJIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDIsIDB4N0UsIDB4NkYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsCisJIDB4MEUsIDB4RjIsIDB4NjEsIDB4NDYsIDB4QjAsIDB4N0UsIDB4NEUsIDB4RkIsIDB4QjcsIDB4NjAsIDB4NTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsCisJIDB4MDEsIDB4NjUsIDB4NjUsIDB4NDMsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RjIsIDB4OEMsIDB4RkEsIDB4MDAsIDB4QTgsIDB4NkYsIDB4RjIsCisJIDB4MTUsIDB4MDMsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4NzAsIDB4RjIsIDB4MDAsIDB4QkIsIDB4RkYsIDB4QTAsIDB4MDcsIDB4MDMsIDB4MEUsIDB4MDYsCisJIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4RkIsIDB4MDQsIDB4MDgsIDB4MDAsIDB4QjksIDB4ODEsIDB4RTgsIDB4ODQsCisJIDB4RDksIDB4ODEsIDB4RkQsIDB4MDQsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MEUsIDB4RkEsIDB4MEMsIDB4RjQsIDB4RkYsIDB4RkYsCisJIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4MDAsIDB4NjMsIDB4MDMsIDB4N0UsIDB4NkYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4NEMsIDB4RkQsCisJIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MEUsIDB4RjIsIDB4NjEsIDB4NDYsIDB4QjQsIDB4N0UsIDB4NEUsIDB4RkIsIDB4MjQsIDB4NjAsIDB4QTYsIDB4NjIsCisJIDB4MEYsIDB4NjAsIDB4OTYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4QjcsIDB4NjAsCisJIDB4NTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RjIsIDB4NEMsIDB4RjMsIDB4MDIsIDB4QjAsIDB4NjEsIDB4NDYsCisJIDB4Q0MsIDB4ODQsIDB4MDUsIDB4MDMsIDB4MDQsIDB4MjgsIDB4NEMsIDB4RkIsIDB4QjcsIDB4NjAsIDB4NTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjgsCisJIDB4NEMsIDB4RkIsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4N0UsIDB4NkYsIDB4RkEsIDB4NjEsIDB4NDYsCisJIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MEUsIDB4RjIsIDB4NjEsIDB4NDYsIDB4QjgsIDB4N0UsIDB4NEUsIDB4RkIsIDB4QjcsIDB4NjAsIDB4NTYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4NzAsIDB4RjIsCisJIDB4NjEsIDB4NDYsIDB4RkYsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MzUsIDB4MDYsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsCisJIDB4RkIsIDB4MDQsIDB4MkYsIDB4MDAsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RkEsIDB4MDEsIDB4NjUsIDB4NjUsIDB4NDMsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsCisJIDB4NzAsIDB4RjIsIDB4OEMsIDB4RkEsIDB4MDAsIDB4QTgsIDB4NkYsIDB4RjIsIDB4MTUsIDB4MDMsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4NzAsIDB4RjIsCisJIDB4MDAsIDB4QkIsIDB4RkYsIDB4QTAsIDB4MDcsIDB4MDMsIDB4MEUsIDB4MDYsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsCisJIDB4RkIsIDB4MDQsIDB4MDgsIDB4MDAsIDB4QjksIDB4ODEsIDB4RTgsIDB4ODQsIDB4RDksIDB4ODEsIDB4RkQsIDB4MDQsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsCisJIDB4NDUsIDB4RDMsIDB4MEUsIDB4RkEsIDB4MEMsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NkYsIDB4RjIsIDB4MDAsIDB4NjMsIDB4MDMsIDB4N0UsIDB4NkYsIDB4RkEsCisJIDB4M0MsIDB4NDYsIDB4NEMsIDB4RkQsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MEUsIDB4RjIsIDB4NjEsIDB4NDYsIDB4QzAsIDB4N0UsIDB4NEUsIDB4RkIsCisJIDB4NUQsIDB4MDAsIDB4NUMsIDB4MDAsIDB4NjUsIDB4NDQsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MzYsIDB4MTgsIDB4MDAsCisJIDB4NTUsIDB4MDAsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RjIsIDB4NjEsIDB4NDYsIDB4MDEsIDB4QjAsIDB4RkYsIDB4RkYsIDB4NEUsIDB4MDIsCisJIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDIsIDB4N0UsIDB4NkYsIDB4RkEsIDB4NjEsIDB4NDYsCisJIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MEUsIDB4RjIsIDB4NjEsIDB4NDYsIDB4RTAsIDB4N0UsIDB4NEUsIDB4RkIsIDB4M0YsIDB4MDAsIDB4M0UsIDB4MDAsCisJIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NkYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDEsIDB4N0UsIDB4NkYsIDB4RkEsIDB4NjAsIDB4NDcsCisJIDB4RkYsIDB4QjUsIDB4NzAsIDB4RjIsIDB4NjEsIDB4NDYsIDB4RkYsIDB4QTAsIDB4RkYsIDB4RkYsIDB4RjEsIDB4MDYsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4RkIsIDB4MDQsIDB4RUIsIDB4MDEsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RkEsIDB4NjEsIDB4NDYsCisJIDB4MDAsIDB4NjUsIDB4NjUsIDB4NDMsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4NzAsIDB4RjIsIDB4OEMsIDB4RkEsIDB4MDAsIDB4QTgsIDB4NkYsIDB4RjIsCisJIDB4MTUsIDB4MDMsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4NzAsIDB4RjIsIDB4MDAsIDB4QkIsIDB4RkYsIDB4QTAsIDB4MDcsIDB4MDMsIDB4MEUsIDB4MDYsCisJIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4RkIsIDB4MDQsIDB4MDgsIDB4MDAsIDB4QjksIDB4ODEsIDB4RTgsIDB4ODQsCisJIDB4RDksIDB4ODEsIDB4RkQsIDB4MDQsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MEUsIDB4RkEsIDB4MEMsIDB4RjQsIDB4RkYsIDB4RkYsCisJIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MEUsIDB4RjIsIDB4NjEsIDB4NDYsIDB4RTQsIDB4N0UsIDB4NEUsIDB4RkIsIDB4MDMsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4Q0EsIDB4RkUsIDB4NDcsIDB4RjEsIDB4MDEsIDB4NjUsIDB4MzIsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MDgsIDB4MDAsIDB4MkMsIDB4RjIsIDB4NjQsIDB4NDUsCisJIDB4MDIsIDB4MjIsIDB4MDQsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDEsIDB4MDAsIDB4RTMsIDB4MDAsIDB4MTQsIDB4RjIsIDB4NjUsIDB4NDAsCisJIDB4MDEsIDB4MjYsIDB4MUQsIDB4MDAsIDB4NjAsIDB4NDUsIDB4MDUsIDB4NjQsIDB4M0IsIDB4REIsIDB4NjUsIDB4NDQsIDB4Q0MsIDB4ODUsIDB4QjgsIDB4RjEsCisJIDB4MjcsIDB4NjAsIDB4NzgsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4ODAsIDB4QzQsIDB4ODQsIDB4MEIsIDB4MDMsIDB4MDcsIDB4MDUsCisJIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDksIDB4MDQsIDB4QzYsIDB4RkUsIDB4MDcsIDB4MDAsIDB4MDAsIDB4NjQsCisJIDB4QjgsIDB4ODQsIDB4QTIsIDB4REIsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4QUYsIDB4MDAsIDB4NjAsIDB4NDEsCisJIDB4MkEsIDB4RjAsIDB4MDAsIDB4NjAsIDB4MEMsIDB4NjQsIDB4QTAsIDB4ODQsIDB4MDQsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MEMsIDB4M0EsIDB4MDEsIDB4MDAsCisJIDB4QTUsIDB4MDAsIDB4NjEsIDB4NDUsIDB4NjAsIDB4NDEsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4NzgsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4RDgsIDB4ODAsIDB4QzQsIDB4ODQsIDB4MEIsIDB4MDMsIDB4MDcsIDB4MDUsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsCisJIDB4MDksIDB4MDQsIDB4QzYsIDB4RkUsIDB4MDcsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QjgsIDB4ODQsIDB4QTIsIDB4REIsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsCisJIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4NjEsIDB4NDAsIDB4MDgsIDB4MzYsIDB4MDEsIDB4MDAsIDB4ODgsIDB4MDAsIDB4MTQsIDB4RjIsIDB4MUMsIDB4NjUsCisJIDB4NjAsIDB4NDEsIDB4MDAsIDB4NjMsIDB4Q0QsIDB4ODEsIDB4QzcsIDB4ODMsIDB4RkQsIDB4MDIsIDB4M0YsIDB4RjAsIDB4MkMsIDB4RjIsIDB4QzMsIDB4ODMsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MjksIDB4MDAsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4NzYsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsCisJIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4N0MsIDB4NjQsIDB4QTAsIDB4RDMsCisJIDB4NjMsIDB4NDUsIDB4RDgsIDB4ODAsIDB4QzQsIDB4ODQsIDB4MEIsIDB4MDMsIDB4MDcsIDB4MDUsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsCisJIDB4QTIsIDB4REIsIDB4MDksIDB4MDQsIDB4QzYsIDB4RkUsIDB4MDcsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QjgsIDB4ODQsIDB4QTIsIDB4REIsIDB4OEEsIDB4RkYsCisJIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4NTIsIDB4MDAsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4NzQsIDB4NjQsIDB4QTAsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsCisJIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4N0EsIDB4NjQsCisJIDB4QTAsIDB4RDMsIDB4NjMsIDB4NDUsIDB4RDgsIDB4ODAsIDB4QzQsIDB4ODQsIDB4MEIsIDB4MDMsIDB4MDcsIDB4MDUsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsCisJIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDksIDB4MDQsIDB4QzYsIDB4RkUsIDB4MDcsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QjgsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MTUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MEYsIDB4QjQsIDB4MDAsIDB4QTgsCisJIDB4MDEsIDB4QTgsIDB4MjQsIDB4MDMsIDB4MTIsIDB4MDMsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4ODIsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsCisJIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MTEsIDB4MDAsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4ODAsIDB4NjQsCisJIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsCisJIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MDQsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4MjQsIDB4NjAsIDB4NkUsIDB4NjIsIDB4MjQsIDB4NjAsIDB4NDYsIDB4NjQsIDB4QTIsIDB4REIsIDB4M0MsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4NUMsIDB4NUMsIDB4RkMsIDB4RkMsIDB4Q0UsIDB4RkUsIDB4QjAsIDB4NjAsIDB4RTEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEYsIDB4RjAsIDB4MTUsIDB4RjIsIDB4NjQsIDB4NDEsIDB4MDEsIDB4MkEsIDB4MDIsIDB4MDAsIDB4RDEsIDB4RjEsIDB4MDIsIDB4MDAsCisJIDB4RDAsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDUsIDB4REMsIDB4ODQsIDB4RDQsIDB4ODAsIDB4MTUsIDB4RkEsIDB4MzAsIDB4MDcsIDB4NjEsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MDksIDB4MDAsIDB4MjcsIDB4NjAsIDB4QTgsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4MjgsIDB4QTIsIDB4REIsIDB4MDgsIDB4MDAsIDB4MjcsIDB4NjAsIDB4QUEsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjgsIDB4QTIsIDB4REIsIDB4MkEsIDB4RjAsIDB4MDgsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MDAsIDB4NjQsCisJIDB4NDgsIDB4RkIsIDB4MkQsIDB4NjAsIDB4NTIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEMsIDB4MDAsCisJIDB4M0MsIDB4NDYsIDB4M0UsIDB4RjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4RjAsIDB4ODQsIDB4QTQsIDB4ODQsIDB4MTgsIDB4RkEsIDB4MkEsIDB4RjIsCisJIDB4QkYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4MkEsIDB4RkEsIDB4QjIsIDB4NjAsIDB4RkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsCisJIDB4NDksIDB4RkIsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4ODIsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsCisJIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsCisJIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4ODQsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsCisJIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsCisJIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MkQsIDB4NjAsIDB4NUEsIDB4NjMsIDB4QTMsIDB4RDMsIDB4QjAsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEQsIDB4RjIsIDB4NjAsIDB4NUMsIDB4NjQsIDB4NUYsIDB4MEQsIDB4RkEsIDB4MjMsIDB4RjAsIDB4MDEsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4N0IsIDB4MDEsIDB4QjksIDB4NjAsIDB4NDMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjEsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4MzEsIDB4RjMsIDB4MDEsIDB4NjMsIDB4QzQsIDB4QjQsIDB4MzEsIDB4RkIsIDB4MzIsIDB4RkQsIDB4QjgsIDB4NjAsIDB4RUYsIDB4NjIsIDB4NDIsIDB4NDAsCisJIDB4QTAsIDB4NEMsIDB4NDAsIDB4QkMsIDB4N0QsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTAsIDB4RkUsIDB4MUEsIDB4RkYsIDB4MjQsIDB4NjAsIDB4M0EsIDB4NjQsCisJIDB4MDgsIDB4RjAsIDB4MDcsIDB4RjAsIDB4RDAsIDB4ODAsIDB4MjQsIDB4NjAsIDB4NDAsIDB4NjIsIDB4MTQsIDB4MDIsIDB4QTIsIDB4RDMsIDB4MDEsIDB4NjMsCisJIDB4QUMsIDB4ODYsIDB4MDcsIDB4RjIsIDB4MEYsIDB4MDMsIDB4RDAsIDB4ODAsIDB4MDksIDB4RjIsIDB4RkEsIDB4MDIsIDB4MjMsIDB4RkMsIDB4MjQsIDB4NjAsCisJIDB4NkUsIDB4NjIsIDB4MjQsIDB4NjAsIDB4NDYsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4M0MsIDB4NDYsIDB4MDYsIDB4NjQsIDB4QTEsIDB4RkYsIDB4NDksIDB4RkIsIDB4ODMsIDB4M0UsIDB4MzEsIDB4RjMsCisJIDB4ODcsIDB4NjAsIDB4ODAsIDB4NjEsIDB4MUQsIDB4RjAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MTUsIDB4MDAsIDB4RkUsIDB4QjQsIDB4MzEsIDB4RkIsCisJIDB4MDAsIDB4NjQsIDB4NDksIDB4RkIsIDB4MDEsIDB4NjQsIDB4NDcsIDB4RkIsIDB4MkQsIDB4NjAsIDB4NUEsIDB4NjMsIDB4QTMsIDB4RDMsIDB4QjAsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NzEsIDB4NjQsIDB4NUYsIDB4MEQsIDB4RkEsIDB4NDAsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4QjksIDB4NjAsIDB4NDMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MkEsIDB4MUIsIDB4MDAsIDB4RDEsIDB4OTEsIDB4OEQsIDB4RTIsIDB4NDEsIDB4NjQsCisJIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsIDB4MkQsIDB4NjAsIDB4NjIsIDB4NjMsIDB4RkQsIDB4QjQsIDB4MzEsIDB4RkIsIDB4QTMsIDB4RDMsIDB4QjAsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjMsIDB4NjAsIDB4NUMsIDB4MEQsIDB4RjIsIDB4NDcsIDB4RkQsIDB4RkYsIDB4QjUsCisJIDB4NjAsIDB4NDcsIDB4RDAsIDB4ODAsIDB4REMsIDB4ODQsIDB4MUYsIDB4MDMsIDB4NjAsIDB4NDcsIDB4QjQsIDB4ODQsIDB4MEQsIDB4RkEsIDB4MUIsIDB4MDAsCisJIDB4MDgsIDB4MkEsIDB4MDcsIDB4MDAsIDB4NDIsIDB4NjQsIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RjcsIDB4QjQsIDB4MzEsIDB4RkIsCisJIDB4MTIsIDB4MDAsIDB4MTAsIDB4MkEsIDB4MDksIDB4MDAsIDB4NDMsIDB4NjQsIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RUYsIDB4QjQsCisJIDB4MzEsIDB4RkIsIDB4QjgsIDB4NjAsIDB4QkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDQsIDB4NjQsIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4REYsIDB4QjQsIDB4MzEsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MkEsIDB4NjQsIDB4M0IsIDB4REIsIDB4QjAsIDB4NjAsIDB4OTcsIDB4NjQsIDB4NDAsIDB4NDAsCisJIDB4QjUsIDB4NjAsIDB4MUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4QjgsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QjUsCisJIDB4MDQsIDB4QjUsIDB4MDQsIDB4MDMsIDB4MDMsIDB4MDMsIDB4QkEsIDB4NjAsIDB4M0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODYsIDB4RkYsIDB4MjAsIDB4NDQsCisJIDB4ODQsIDB4RkYsIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4RjMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MTQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzEsIDB4NDAsCisJIDB4MDEsIDB4MjYsIDB4MTcsIDB4MDAsIDB4QTAsIDB4NEMsIDB4NDksIDB4QkMsIDB4RkYsIDB4QjQsIDB4QTAsIDB4NTEsIDB4MUMsIDB4NjAsIDB4QjgsIDB4NjMsCisJIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QjUsIDB4MDQsIDB4QkMsIDB4MDksIDB4MDMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4RUQsIDB4RTIsCisJIDB4RkUsIDB4QjQsIDB4QTMsIDB4REIsIDB4QTAsIDB4NEMsIDB4N0QsIDB4QjQsIDB4QTAsIDB4NTEsIDB4MDMsIDB4MDAsIDB4QTAsIDB4NEMsIDB4NkQsIDB4QjQsCisJIDB4QTAsIDB4NTEsIDB4REMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkQsIDB4QTAsIDB4RkYsIDB4RkYsIDB4NDgsIDB4MDMsIDB4MzEsIDB4NDAsIDB4MDQsIDB4MkEsCisJIDB4M0UsIDB4MDAsIDB4NkQsIDB4RjMsIDB4NzQsIDB4RjMsIDB4Q0MsIDB4ODMsIDB4NkQsIDB4RkQsIDB4Q0MsIDB4ODQsIDB4NzQsIDB4RkIsIDB4MUYsIDB4MDIsCisJIDB4MzEsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MTIsIDB4MDAsIDB4NkYsIDB4RjMsIDB4NzAsIDB4RjEsIDB4Q0MsIDB4ODQsIDB4NkYsIDB4RkIsIDB4MEQsIDB4MDIsCisJIDB4NkYsIDB4RjksIDB4MzEsIDB4NDQsIDB4MDgsIDB4QkMsIDB4NDAsIDB4NTEsIDB4NzIsIDB4RjMsIDB4NzEsIDB4RjEsIDB4MDAsIDB4QjgsIDB4NjQsIDB4NDUsCisJIDB4MDEsIDB4MDMsIDB4NjcsIDB4NDUsIDB4NjUsIDB4NTAsIDB4Q0MsIDB4ODQsIDB4NzMsIDB4RkIsIDB4MjgsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTAsIDB4RDMsCisJIDB4NkUsIDB4RjEsIDB4MDAsIDB4QjgsIDB4NzQsIDB4RjksIDB4MDMsIDB4MDMsIDB4ODcsIDB4RjMsIDB4NkQsIDB4RkIsIDB4MDQsIDB4MDAsIDB4NkQsIDB4RjMsCisJIDB4ODcsIDB4RjEsIDB4MTUsIDB4MUIsIDB4NkQsIDB4RjksIDB4MzEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MTEsIDB4MDAsIDB4REQsIDB4RkUsIDB4MEYsIDB4MDUsCisJIDB4QkEsIDB4RkUsIDB4QUQsIDB4NEYsIDB4MDAsIDB4N0YsIDB4MDEsIDB4QkMsIDB4QTAsIDB4NUQsIDB4MDAsIDB4RUUsIDB4N0YsIDB4RjEsIDB4MDIsIDB4NjAsCisJIDB4RUUsIDB4NjQsIDB4QTMsIDB4RkIsIDB4QTQsIDB4RjksIDB4MDQsIDB4NjQsIDB4QTUsIDB4RkIsIDB4REYsIDB4RkUsIDB4MTksIDB4RkYsIDB4MUEsIDB4NjAsCisJIDB4NDIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4MkIsIDB4QTIsIDB4REIsIDB4MzEsIDB4NDAsIDB4MDEsIDB4MkEsCisJIDB4MjksIDB4MDAsIDB4OUQsIDB4RkUsIDB4MjcsIDB4MDQsIDB4MjYsIDB4MEEsIDB4OUYsIDB4RkUsIDB4MjQsIDB4MDUsIDB4ODUsIDB4RkYsIDB4MjAsIDB4NDQsCisJIDB4ODQsIDB4RkYsIDB4NDAsIDB4MjYsIDB4MUYsIDB4MDAsIDB4M0YsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MUMsIDB4MDAsIDB4MzgsIDB4NjksIDB4RkYsIDB4RkYsCisJIDB4NjgsIDB4NDQsIDB4MDEsIDB4MTYsIDB4RkQsIDB4MDEsIDB4MDEsIDB4MkEsIDB4MTUsIDB4MDAsIDB4MjcsIDB4NjAsIDB4QjQsIDB4NjQsIDB4QTAsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjgsIDB4QTIsIDB4REIsIDB4N0YsIDB4RjEsIDB4MDIsIDB4NjAsIDB4RUUsIDB4NjQsCisJIDB4QTMsIDB4RkIsIDB4RkYsIDB4RkYsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTQsIDB4RkIsIDB4MDQsIDB4NjQsIDB4QTUsIDB4RkIsCisJIDB4REYsIDB4RkUsIDB4MTksIDB4RkYsIDB4MTAsIDB4NjQsIDB4M0IsIDB4REIsIDB4ODAsIDB4RjMsIDB4NzMsIDB4NDUsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4OTMsIDB4QzksIDB4RkUsIDB4NDksIDB4RjMsIDB4M0MsIDB4NDYsIDB4MjcsIDB4MTgsIDB4Q0MsIDB4ODQsCisJIDB4NDksIDB4RkIsIDB4MjQsIDB4MDIsIDB4QkIsIDB4NjAsIDB4MTgsIDB4NjQsIDB4NDAsIDB4NDIsIDB4RkMsIDB4RkMsIDB4MDAsIDB4NjQsIDB4NUMsIDB4NUMsCisJIDB4MzIsIDB4RkIsIDB4ODIsIDB4RkYsIDB4NUMsIDB4NDcsIDB4ODQsIDB4RkYsIDB4NjIsIDB4RkYsIDB4MjcsIDB4NjAsIDB4QTQsIDB4NjQsIDB4QTAsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjgsIDB4QTIsIDB4REIsIDB4MjMsIDB4RjAsIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REEsIDB4MjQsIDB4NjAsIDB4NkUsIDB4NjIsIDB4MjQsIDB4NjAsIDB4NDYsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4Q0UsIDB4RkUsIDB4NkEsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDEsIDB4RkQsIDB4QjQsIDB4QTIsIDB4REIsIDB4NjEsIDB4NDQsIDB4MDEsIDB4QjAsIDB4MDIsIDB4QjAsIDB4MEMsIDB4MDMsIDB4MEIsIDB4MDIsCisJIDB4OUQsIDB4RkUsIDB4MDksIDB4MDQsIDB4MjQsIDB4NjAsIDB4QTYsIDB4NjIsIDB4MUEsIDB4NjAsIDB4QTIsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDcsIDB4MDAsIDB4ODAsIDB4RjMsIDB4NzMsIDB4NDUsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4OTMsIDB4MUMsIDB4NjAsIDB4QjQsIDB4NjMsIDB4QTMsIDB4RDMsIDB4QUQsIDB4NDksIDB4MjAsIDB4QjUsCisJIDB4MDgsIDB4QjEsIDB4MjMsIDB4MDMsIDB4RTEsIDB4ODEsIDB4MTAsIDB4QjUsIDB4OTUsIDB4ODEsIDB4NjAsIDB4NDEsIDB4MTgsIDB4MDIsIDB4MUMsIDB4NjAsCisJIDB4QjYsIDB4N0MsIDB4QTQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4QTQsIDB4REIsIDB4MTcsIDB4MDIsIDB4MDUsIDB4NjQsIDB4QTQsIDB4REIsCisJIDB4NjEsIDB4NDQsIDB4MDcsIDB4QjQsIDB4RkYsIDB4RkYsIDB4MTEsIDB4MDIsIDB4MDgsIDB4QjEsIDB4RTEsIDB4ODEsIDB4OTUsIDB4ODEsIDB4QTMsIDB4RDMsCisJIDB4MEMsIDB4MDMsIDB4MDgsIDB4QUMsIDB4MDEsIDB4QkMsIDB4QTMsIDB4REIsIDB4RkYsIDB4RkYsIDB4MTMsIDB4RkYsIDB4MDYsIDB4MDAsIDB4MTAsIDB4QUMsCisJIDB4QTMsIDB4REIsIDB4MUMsIDB4NjAsIDB4QjYsIDB4NjMsIDB4MDUsIDB4N0MsIDB4QTMsIDB4RDksIDB4QjAsIDB4NjAsIDB4QTQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NDYsIDB4RjMsIDB4NDUsIDB4RjEsIDB4MDUsIDB4MUIsIDB4NjQsIDB4NDQsIDB4MDMsIDB4MUIsIDB4MEYsIDB4NjAsIDB4OTIsIDB4NjIsIDB4QTIsIDB4RDMsCisJIDB4NDUsIDB4RkIsIDB4MDAsIDB4NjMsIDB4NDYsIDB4RkQsIDB4NjAsIDB4NDEsIDB4MjUsIDB4NjQsIDB4M0IsIDB4REIsIDB4MjcsIDB4NDQsIDB4RUYsIDB4QjQsCisJIDB4NDAsIDB4NDcsIDB4MDAsIDB4QjksIDB4NzEsIDB4NDAsIDB4ODAsIDB4MjcsIDB4MDEsIDB4MTIsIDB4MkIsIDB4MDMsIDB4QkEsIDB4NjAsIDB4OTMsIDB4NjIsCisJIDB4ODQsIDB4RkYsIDB4NDIsIDB4NDIsIDB4ODIsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MTQsIDB4QkMsIDB4RkYsIDB4QjQsIDB4QTAsIDB4NTEsIDB4MzEsIDB4MEEsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4NzAsIDB4NDQsIDB4QUMsIDB4ODAsIDB4MkIsIDB4MEEsIDB4NzEsIDB4NDAsIDB4ODAsIDB4MjcsCisJIDB4RjcsIDB4MTIsIDB4NDUsIDB4RjMsIDB4NEMsIDB4MDIsIDB4MTUsIDB4MTgsIDB4MzEsIDB4NjAsIDB4MEUsIDB4N0MsIDB4QTQsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4MEIsIDB4MTgsIDB4MzEsIDB4NjAsIDB4MTAsIDB4N0MsIDB4QTQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MTgsIDB4QUMsIDB4NEMsIDB4ODAsIDB4MjYsCisJIDB4MDMsIDB4MDAsIDB4MDAsIDB4NjQsIDB4NDUsIDB4RkIsIDB4MDUsIDB4MDAsIDB4NDUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4NDUsIDB4RkIsCisJIDB4REYsIDB4MDIsIDB4MDYsIDB4MEEsIDB4QTAsIDB4NEMsIDB4RkIsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTMsIDB4NjAsIDB4OTksIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4ODQsIDB4RkYsIDB4QkEsIDB4NjAsIDB4NzAsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MTQsIDB4QkMsIDB4RkYsIDB4QjQsCisJIDB4QTAsIDB4NTEsIDB4QUIsIDB4NjAsIDB4MkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0MsIDB4NDQsIDB4QUMsIDB4ODAsIDB4MzIsIDB4RjEsIDB4MjUsIDB4MDMsCisJIDB4NjQsIDB4NDAsIDB4MDcsIDB4MjIsIDB4MjIsIDB4MDAsIDB4QTMsIDB4NjAsIDB4N0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MUMsIDB4QkMsCisJIDB4REYsIDB4QjQsIDB4QTAsIDB4NTEsIDB4MzEsIDB4NDAsIDB4MDgsIDB4MkEsIDB4RUYsIDB4MDEsIDB4NzMsIDB4RjMsIDB4NzEsIDB4RjEsIDB4MDAsIDB4QTAsCisJIDB4REMsIDB4ODAsIDB4MDUsIDB4MDMsIDB4MDgsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4NzMsIDB4RkIsIDB4NjcsIDB4NTAsIDB4MDgsIDB4MDAsIDB4Q0MsIDB4ODQsCisJIDB4NzMsIDB4RkIsIDB4NjQsIDB4NTAsIDB4MDQsIDB4MDAsIDB4MzEsIDB4NDQsIDB4RjcsIDB4QjQsIDB4NDAsIDB4NTEsIDB4MDYsIDB4MDAsIDB4MjgsIDB4NjQsCisJIDB4M0EsIDB4REIsIDB4QTAsIDB4NEMsIDB4MzAsIDB4QkMsIDB4RjMsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsCisJIDB4MjgsIDB4NjQsIDB4M0IsIDB4REIsIDB4MEYsIDB4NjAsIDB4OTQsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MjcsIDB4MTYsIDB4MDAsCisJIDB4NDYsIDB4RkIsIDB4MTQsIDB4MTgsIDB4QkIsIDB4NjAsIDB4MDYsIDB4NjQsIDB4ODQsIDB4RkYsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4QTAsIDB4NEMsCisJIDB4MTQsIDB4QkMsIDB4RjcsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4NzAsIDB4NDQsIDB4QUMsIDB4ODAsCisJIDB4NDYsIDB4RjMsIDB4QjcsIDB4MEEsIDB4REMsIDB4MDIsIDB4Q0MsIDB4ODQsIDB4NDYsIDB4RkIsIDB4RjUsIDB4MDIsIDB4ODQsIDB4RkYsIDB4QkIsIDB4NjAsCisJIDB4MTgsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDgsIDB4QkMsIDB4NDAsIDB4NDcsIDB4QkIsIDB4RTEsIDB4MDQsIDB4MDAsCisJIDB4M0EsIDB4RTEsIDB4MzEsIDB4NDAsIDB4MDEsIDB4MjYsIDB4QkIsIDB4RTEsIDB4QTMsIDB4NjAsIDB4NkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDMsIDB4RkYsCisJIDB4MzksIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODQsIDB4M0UsIDB4RkIsIDB4MDEsIDB4QTAsIDB4NEMsIDB4M0QsIDB4NDYsIDB4MkEsIDB4RjIsCisJIDB4NDYsIDB4NEQsIDB4MTAsIDB4MjUsIDB4MEUsIDB4MDAsIDB4MDksIDB4RTEsIDB4QTEsIDB4RkYsIDB4NjYsIDB4NDAsIDB4MEYsIDB4RjIsIDB4MDEsIDB4MjksCisJIDB4MDIsIDB4MDAsIDB4NDAsIDB4RkYsIDB4MEEsIDB4QkMsIDB4QTIsIDB4REEsIDB4MDgsIDB4MjUsIDB4RTksIDB4MDEsIDB4Q0IsIDB4RkUsIDB4NUMsIDB4NUQsCisJIDB4RTcsIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzEsIDB4RjIsIDB4MUMsIDB4NjAsIDB4QkEsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MzEsIDB4RjAsCisJIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MzAsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsCisJIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MkYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsCisJIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4QTksIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsCisJIDB4MDcsIDB4RkMsIDB4M0YsIDB4RjIsIDB4MDksIDB4NjAsIDB4QjAsIDB4NjUsIDB4RDQsIDB4ODAsIDB4MkEsIDB4RjIsIDB4QzQsIDB4MDUsIDB4MDgsIDB4MjUsCisJIDB4QjYsIDB4MDEsIDB4MDAsIDB4NjQsIDB4MEQsIDB4NjAsIDB4MkMsIDB4NjEsIDB4NDAsIDB4NEIsIDB4QTEsIDB4REIsIDB4MkQsIDB4NDYsIDB4M0IsIDB4RjIsCisJIDB4QTksIDB4RjEsIDB4ODcsIDB4RjQsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MTIsIDB4MDAsIDB4RDMsIDB4ODAsIDB4MkMsIDB4RjAsIDB4QjMsIDB4MDMsCisJIDB4MDcsIDB4RjQsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4QTksIDB4RjUsIDB4QjYsIDB4RjQsIDB4MkQsIDB4NDYsIDB4MDQsIDB4NjQsIDB4MDQsIDB4QjMsCisJIDB4MjIsIDB4RkEsIDB4MDQsIDB4MDMsIDB4QkMsIDB4NjAsIDB4NzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDAsIDB4REUsIDB4MDAsIDB4NzQsIDB4NjIsCisJIDB4QTIsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsCisJIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4N0MsIDB4NUYsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODUsCisJIDB4MEMsIDB4NjAsIDB4M0EsIDB4NjQsIDB4NDQsIDB4RDMsIDB4NUEsIDB4RDEsIDB4MDMsIDB4MUIsIDB4QkMsIDB4NjAsIDB4NjUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDQsIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RTQsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsCisJIDB4NjQsIDB4NDQsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RTYsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsCisJIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjUsIDB4NDAsIDB4MEQsIDB4M0EsIDB4MUMsIDB4MDAsIDB4NjQsIDB4NDcsIDB4RTgsIDB4N0YsIDB4NUEsIDB4RDEsCisJIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RTksIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RUEsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsCisJIDB4NjQsIDB4NDQsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RUMsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsCisJIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RUUsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RUYsIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4NjUsIDB4NDQsIDB4RDgsIDB4ODQsIDB4MDgsIDB4MjUsIDB4NzYsIDB4MDAsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUIsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4RUIsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUIsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUIsIDB4M0YsIDB4RjIsIDB4MDQsIDB4NjUsIDB4QzQsIDB4ODMsCisJIDB4MEEsIDB4RTEsIDB4QjMsIDB4RkYsIDB4OUEsIDB4RkYsIDB4Q0IsIDB4ODMsIDB4MDAsIDB4RjQsIDB4MTAsIDB4NjIsIDB4NkMsIDB4NjEsIDB4MEUsIDB4QTMsCisJIDB4QUIsIDB4ODQsIDB4RjIsIDB4QTMsIDB4QTEsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4MDIsIDB4NjIsIDB4QzksIDB4ODEsCisJIDB4QUIsIDB4ODQsIDB4QTEsIDB4RkYsIDB4MDEsIDB4MDAsIDB4QTIsIDB4REMsIDB4N0EsIDB4RDQsIDB4RkQsIDB4MUMsIDB4QTIsIDB4REMsIDB4MDgsIDB4MjUsCisJIDB4NTIsIDB4MDAsIDB4RjIsIDB4MUQsIDB4N0MsIDB4QTgsIDB4RDksIDB4ODEsIDB4RUYsIDB4MDMsIDB4RkYsIDB4QjEsIDB4MDksIDB4MUUsIDB4MDIsIDB4MDIsCisJIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsIDB4NUEsIDB4RDIsIDB4ODksIDB4RkYsIDB4ODAsIDB4NEYsIDB4NkYsIDB4NDQsIDB4QTIsIDB4REEsIDB4ODgsIDB4RkYsCisJIDB4OTgsIDB4RkYsIDB4MDksIDB4RTEsIDB4QTEsIDB4RkYsIDB4M0QsIDB4NDYsIDB4MDgsIDB4MjUsIDB4M0QsIDB4MDAsIDB4NDAsIDB4RkYsIDB4MEYsIDB4RjAsCisJIDB4MEEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4MTYsIDB4MTQsIDB4RjcsIDB4QjQsIDB4QTIsIDB4REEsIDB4MEQsIDB4NjAsIDB4MkMsIDB4NjIsIDB4QTIsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEMsIDB4MDAsIDB4RjEsIDB4RjUsIDB4RjAsIDB4RjQsIDB4MEQsIDB4NjAsIDB4MkMsIDB4NjEsCisJIDB4NTksIDB4RDEsIDB4MzcsIDB4RjgsIDB4MDUsIDB4NjQsIDB4NTksIDB4RDEsIDB4Q0MsIDB4ODQsIDB4QkQsIDB4RDgsIDB4RkMsIDB4MDIsIDB4MkQsIDB4NDYsCisJIDB4MEQsIDB4MDEsIDB4QTIsIDB4REEsIDB4MkQsIDB4NDYsIDB4M0IsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MTgsIDB4MDAsCisJIDB4RjEsIDB4RjUsIDB4QjcsIDB4RjAsIDB4MkEsIDB4NDQsIDB4QTQsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MjYsIDB4MTAsIDB4MDAsIDB4MkQsIDB4NDYsCisJIDB4NjQsIDB4NDQsIDB4M0EsIDB4RjAsIDB4QkMsIDB4RjAsIDB4NjQsIDB4NUYsIDB4M0QsIDB4RjAsIDB4MDcsIDB4RjQsIDB4RjAsIDB4RjQsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4QTMsIDB4NUIsIDB4RDgsIDB4NjUsIDB4NUMsIDB4NUIsIDB4RDgsIDB4NUIsIDB4REEsIDB4MkQsIDB4NDYsIDB4MDEsIDB4MDAsIDB4MkQsIDB4NDYsCisJIDB4QkIsIDB4NjAsIDB4MzYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OTgsIDB4RkYsIDB4NDMsIDB4RkYsIDB4NDAsIDB4RkYsIDB4QjAsIDB4RkYsIDB4QjEsIDB4RkYsCisJIDB4MkQsIDB4NDYsIDB4MEQsIDB4NjAsIDB4MkMsIDB4NjEsIDB4QTEsIDB4RDMsIDB4MkQsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEEsIDB4MDAsCisJIDB4RjEsIDB4RjUsIDB4RjAsIDB4RjQsIDB4NTksIDB4RDEsIDB4MzcsIDB4RjgsIDB4MDUsIDB4NjQsIDB4NTksIDB4RDEsIDB4Q0MsIDB4ODQsIDB4QkQsIDB4RDgsCisJIDB4RkMsIDB4MDIsIDB4MkQsIDB4NDYsIDB4QkIsIDB4NjAsIDB4MjAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OTgsIDB4RkYsIDB4MDksIDB4RTEsIDB4QTEsIDB4RkYsCisJIDB4M0QsIDB4NDYsIDB4MDgsIDB4MjUsIDB4RTAsIDB4MDEsIDB4MEYsIDB4RjIsIDB4NDAsIDB4RkYsIDB4MDIsIDB4QkMsIDB4QTIsIDB4REEsIDB4QkIsIDB4NjAsCisJIDB4MzYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4MEQsIDB4NjAsIDB4MkMsIDB4NjIsIDB4QTIsIDB4REIsIDB4MDQsIDB4NjQsIDB4MjIsIDB4RkEsCisJIDB4ODcsIDB4RjQsIDB4QTksIDB4RjEsIDB4RkYsIDB4RkYsIDB4RDMsIDB4ODAsIDB4M0IsIDB4RjIsIDB4RTcsIDB4MDMsIDB4NjAsIDB4NDcsIDB4QzAsIDB4QjcsCisJIDB4MDIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4MDAsIDB4QTgsIDB4NDAsIDB4NEEsIDB4MTYsIDB4MDMsIDB4RTAsIDB4ODEsCisJIDB4NjEsIDB4NDMsIDB4NDIsIDB4RkUsIDB4MDAsIDB4NjQsIDB4RjAsIDB4ODQsIDB4RkUsIDB4MUYsIDB4NDAsIDB4NEEsIDB4RTEsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4MkQsIDB4NDYsIDB4MDcsIDB4RjQsIDB4RTAsIDB4ODEsIDB4MzcsIDB4RjAsIDB4MkEsIDB4NDcsIDB4MEMsIDB4NjAsIDB4N0EsIDB4NjMsIDB4QTAsIDB4ODQsCisJIDB4NDcsIDB4OUMsIDB4MTAsIDB4MDMsIDB4N0MsIDB4NDQsIDB4QTAsIDB4NjMsIDB4MTEsIDB4MDAsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEEsIDB4NjMsIDB4NDYsCisJIDB4MzcsIDB4RjAsIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDAsIDB4ODAsIDB4MkIsIDB4MDUsIDB4MDAsIDB4MDAsIDB4NjAsIDB4NzAsIDB4N0MsIDB4MDAsIDB4NjAsCisJIDB4OTAsIDB4NjMsIDB4MDQsIDB4MDAsIDB4MkQsIDB4NDYsIDB4QkMsIDB4NjAsIDB4NjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkQsIDB4NDYsIDB4RUUsIDB4RkIsCisJIDB4RUYsIDB4RjksIDB4RjAsIDB4RkQsIDB4MDcsIDB4RjIsIDB4RjEsIDB4RkIsIDB4NjAsIDB4NDYsIDB4MzcsIDB4RjAsIDB4MkEsIDB4NDQsIDB4MEQsIDB4NjAsCisJIDB4MkMsIDB4NjIsIDB4NUEsIDB4RDksIDB4MDAsIDB4NjUsIDB4NDUsIDB4NEIsIDB4QTAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4M0YsIDB4MjIsIDB4MDUsIDB4MDAsCisJIDB4OTAsIDB4ODQsIDB4MzcsIDB4RkEsIDB4MDEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MjEsIDB4MDAsIDB4QUQsIDB4NDYsIDB4MEEsIDB4QTMsIDB4M0QsIDB4RjIsCisJIDB4QUQsIDB4NDYsIDB4QTMsIDB4RDAsIDB4QUQsIDB4NDYsIDB4RDAsIDB4ODAsIDB4M0MsIDB4RjIsIDB4QUQsIDB4NDYsIDB4MDIsIDB4MDMsIDB4MTYsIDB4MDcsCisJIDB4MTQsIDB4MDQsIDB4NUIsIDB4RDAsIDB4QUQsIDB4NDYsIDB4RDAsIDB4ODAsIDB4M0IsIDB4RjIsIDB4MDMsIDB4MDMsIDB4QUQsIDB4NDYsIDB4MEUsIDB4MDcsCisJIDB4MEMsIDB4MDQsIDB4M0EsIDB4RjAsIDB4QUQsIDB4NDYsIDB4NUIsIDB4RDAsIDB4NjQsIDB4NUYsIDB4RDAsIDB4ODAsIDB4MkIsIDB4NDQsIDB4MTgsIDB4MDcsCisJIDB4MDQsIDB4MDMsIDB4RDAsIDB4ODQsIDB4MTAsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MTMsIDB4MDcsIDB4N0YsIDB4MDEsIDB4MDEsIDB4NjQsIDB4MEQsIDB4NjAsCisJIDB4MkMsIDB4NjIsIDB4QTIsIDB4REIsIDB4MkQsIDB4NDYsIDB4MEQsIDB4NjAsIDB4M0MsIDB4NjIsIDB4ODAsIDB4RkYsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsCisJIDB4QTIsIDB4REIsIDB4QkQsIDB4NjAsIDB4MEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODUsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MDgsIDB4MjUsIDB4NTMsIDB4MDEsCisJIDB4MkQsIDB4NDYsIDB4MEQsIDB4NjAsIDB4M0MsIDB4NjIsIDB4ODAsIDB4RkYsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4QTIsIDB4REIsIDB4QkQsIDB4NjAsCisJIDB4OTQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODUsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MDgsIDB4MjUsIDB4NDUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MEYsIDB4NjQsCisJIDB4QkIsIDB4NjAsIDB4RDMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjQsIDB4NjYsIDB4NDEsIDB4MDMsIDB4RjIsIDB4MDQsIDB4RjIsIDB4NDAsIDB4NDIsCisJIDB4MDUsIDB4RjIsIDB4NDAsIDB4NDMsIDB4NDAsIDB4NDQsIDB4NjEsIDB4NDYsIDB4M0MsIDB4RjIsIDB4M0QsIDB4RjIsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDEsCisJIDB4MEQsIDB4NjAsIDB4NzAsIDB4NjUsIDB4MDAsIDB4NjEsIDB4RUYsIDB4RjEsIDB4RUUsIDB4RjUsIDB4NDQsIDB4NEMsIDB4MkMsIDB4NUMsIDB4RTksIDB4ODAsCisJIDB4MDAsIDB4NjQsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4QzAsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjQsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsCisJIDB4OTAsIDB4OUMsIDB4MjAsIDB4NDQsIDB4NDAsIDB4ODAsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjAsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsCisJIDB4OTAsIDB4OUMsIDB4MjEsIDB4NDQsIDB4NDAsIDB4ODEsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjEsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsCisJIDB4OTAsIDB4OUMsIDB4MjIsIDB4NDQsIDB4NDAsIDB4ODIsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjIsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsCisJIDB4OTAsIDB4OUMsIDB4MjMsIDB4NDQsIDB4NDAsIDB4ODMsIDB4RjIsIDB4QTMsIDB4QkQsIDB4RDIsIDB4MjMsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsCisJIDB4OTAsIDB4OUMsIDB4MjQsIDB4NDQsIDB4QzAsIDB4OUMsIDB4NDEsIDB4ODQsIDB4REQsIDB4ODEsIDB4MDgsIDB4MkEsIDB4QTcsIDB4MDEsIDB4MEQsIDB4NjAsCisJIDB4MkUsIDB4NjEsIDB4MDUsIDB4NjQsIDB4RjAsIDB4RjQsIDB4RjEsIDB4RjUsIDB4RkUsIDB4QTMsIDB4NUIsIDB4RDAsIDB4Q0MsIDB4ODQsIDB4NTksIDB4RDksCisJIDB4RkMsIDB4MDIsIDB4RjAsIDB4RjMsIDB4RjEsIDB4RjUsIDB4NjAsIDB4NDIsIDB4MjAsIDB4NDQsIDB4QTIsIDB4REEsIDB4MjEsIDB4NDQsIDB4NUEsIDB4REEsCisJIDB4MjIsIDB4NDQsIDB4NUEsIDB4REEsIDB4MjMsIDB4NDQsIDB4NUEsIDB4REEsIDB4MjQsIDB4NDQsIDB4NUEsIDB4REEsIDB4NjEsIDB4NDYsIDB4MEQsIDB4NjAsCisJIDB4M0MsIDB4NjIsIDB4QTIsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDEsIDB4RjAsIDB4RjMsIDB4RjEsIDB4RjUsIDB4QTAsIDB4RDIsCisJIDB4NUEsIDB4RDAsIDB4NDAsIDB4NDAsIDB4NDQsIDB4NDEsIDB4NUEsIDB4RDIsIDB4NUEsIDB4RDAsIDB4NDAsIDB4NDIsIDB4NUEsIDB4RDAsIDB4NDQsIDB4NDMsCisJIDB4NjEsIDB4NDYsIDB4QkEsIDB4RjAsIDB4M0IsIDB4RjIsIDB4NDQsIDB4NDQsIDB4NjUsIDB4NUYsIDB4NDAsIDB4ODUsIDB4RUYsIDB4RjQsIDB4RUUsIDB4RjUsCisJIDB4NDMsIDB4NEMsIDB4MEQsIDB4NjAsIDB4NzAsIDB4NjUsIDB4QkQsIDB4RDIsIDB4MjUsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjAsIDB4NDQsIDB4NDAsIDB4ODAsIDB4QkQsIDB4RDIsIDB4MjAsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjEsIDB4NDQsCisJIDB4NDAsIDB4ODEsIDB4QkQsIDB4RDIsIDB4MjEsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjIsIDB4NDQsIDB4NDAsIDB4ODIsCisJIDB4QkQsIDB4RDIsIDB4MjIsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjMsIDB4NDQsIDB4NDAsIDB4ODMsIDB4QkQsIDB4RDIsCisJIDB4MjMsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjQsIDB4NDQsIDB4NDAsIDB4ODQsIDB4QkQsIDB4RDIsIDB4MjQsIDB4NUMsCisJIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjUsIDB4NDQsIDB4NDAsIDB4ODUsIDB4NjEsIDB4NDYsIDB4M0EsIDB4RjAsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDQsIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsCisJIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RUUsIDB4RjUsIDB4QkQsIDB4RDIsIDB4MjUsIDB4NUMsIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODAsCisJIDB4RjgsIDB4ODQsIDB4MjAsIDB4NUMsIDB4NDAsIDB4ODAsIDB4MjAsIDB4NDQsIDB4RTQsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjAsIDB4NDcsIDB4RTUsIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4QkQsIDB4RDIsIDB4MjAsIDB4NUMsIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjEsIDB4NUMsIDB4NDAsIDB4ODEsCisJIDB4MjEsIDB4NDQsIDB4RTYsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjEsIDB4NDcsIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjEsIDB4NDQsIDB4RTgsIDB4ODAsCisJIDB4RjgsIDB4ODQsIDB4MjIsIDB4NUMsIDB4NDAsIDB4ODIsIDB4MjIsIDB4NDQsIDB4RTgsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjIsIDB4NDcsIDB4RTksIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4MjIsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjMsIDB4NUMsIDB4NDAsIDB4ODMsIDB4MjMsIDB4NDQsIDB4RUEsIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4MjMsIDB4NDcsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjMsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjQsIDB4NUMsCisJIDB4NDAsIDB4ODQsIDB4MjQsIDB4NDQsIDB4RUMsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjQsIDB4NDcsIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjQsIDB4NDQsCisJIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjUsIDB4NUMsIDB4NDAsIDB4ODUsIDB4MjUsIDB4NDQsIDB4RUUsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjUsIDB4NDcsCisJIDB4RUYsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MkMsIDB4NDMsIDB4QTMsIDB4RDIsIDB4MjUsIDB4NUMsIDB4OTAsIDB4ODEsIDB4RTksIDB4ODQsIDB4RTMsIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4MEQsIDB4NjAsIDB4M0MsIDB4NjIsIDB4QTIsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUIsIDB4RjMsIDB4NUEsIDB4RDMsCisJIDB4NDAsIDB4NDgsIDB4NUEsIDB4RDMsIDB4NDAsIDB4NDksIDB4NDAsIDB4NEEsIDB4MDAsIDB4NjAsIDB4NzAsIDB4N0MsIDB4NDQsIDB4NEQsIDB4NDUsIDB4RjIsCisJIDB4NDYsIDB4RjIsIDB4NDAsIDB4NDcsIDB4NDAsIDB4NDYsIDB4MEQsIDB4NjAsIDB4NzAsIDB4NjUsIDB4MDAsIDB4NjEsIDB4MkQsIDB4NUMsIDB4RTksIDB4ODAsCisJIDB4MDAsIDB4NjQsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4QzAsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MkEsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsCisJIDB4OTAsIDB4OUMsIDB4MjYsIDB4NDQsIDB4NDAsIDB4ODYsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjYsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsCisJIDB4OTAsIDB4OUMsIDB4MjcsIDB4NDQsIDB4NDAsIDB4ODcsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjcsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsCisJIDB4OTAsIDB4OUMsIDB4MjgsIDB4NDQsIDB4NDAsIDB4ODgsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjgsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsCisJIDB4OTAsIDB4OUMsIDB4MjksIDB4NDQsIDB4NDAsIDB4ODksIDB4RjIsIDB4QTMsIDB4QkQsIDB4RDIsIDB4MjksIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsCisJIDB4OTAsIDB4OUMsIDB4MkEsIDB4NDQsIDB4QzAsIDB4OUMsIDB4NDEsIDB4OEEsIDB4REQsIDB4ODEsIDB4MDgsIDB4MkEsIDB4QTcsIDB4MDEsIDB4MjYsIDB4NDQsCisJIDB4NDAsIDB4RkEsIDB4MjcsIDB4NDQsIDB4NDEsIDB4RkEsIDB4MjgsIDB4NDQsIDB4NDIsIDB4RkEsIDB4MjksIDB4NDQsIDB4NDMsIDB4RkEsIDB4MkEsIDB4NDQsCisJIDB4NDQsIDB4RkEsIDB4MEQsIDB4NjAsIDB4M0UsIDB4NjIsIDB4QTIsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4ODAsIDB4N0MsCisJIDB4NDQsIDB4NEQsIDB4MkQsIDB4NDIsIDB4QTIsIDB4RDIsIDB4NUEsIDB4RDAsIDB4NDAsIDB4NDYsIDB4NDQsIDB4NDcsIDB4NUEsIDB4RDIsIDB4NUEsIDB4RDAsCisJIDB4NDAsIDB4NDgsIDB4NUEsIDB4RDAsIDB4NDQsIDB4NDksIDB4NDcsIDB4RjIsIDB4NDQsIDB4NEEsIDB4NDAsIDB4OEIsIDB4NjAsIDB4NUMsIDB4NjQsIDB4NDcsCisJIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4RkYsIDB4QjQsIDB4MjAsIDB4QkMsIDB4N0YsIDB4QjQsIDB4RTEsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsCisJIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDAsIDB4NjAsIDB4NzAsIDB4NjMsIDB4MEQsIDB4NjAsIDB4NzAsIDB4NjUsIDB4QkQsIDB4RDIsIDB4MkIsIDB4NUMsCisJIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjYsIDB4NDQsIDB4NDAsIDB4ODYsIDB4QkQsIDB4RDIsIDB4MjYsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjcsIDB4NDQsIDB4NDAsIDB4ODcsIDB4QkQsIDB4RDIsIDB4MjcsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsCisJIDB4OTAsIDB4OUMsIDB4MjgsIDB4NDQsIDB4NDAsIDB4ODgsIDB4QkQsIDB4RDIsIDB4MjgsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjksIDB4NDQsIDB4NDAsIDB4ODksIDB4QkQsIDB4RDIsIDB4MjksIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MkEsIDB4NDQsCisJIDB4NDAsIDB4OEEsIDB4QkQsIDB4RDIsIDB4MkEsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MkIsIDB4NDQsIDB4NDAsIDB4OEIsCisJIDB4QkQsIDB4RDIsIDB4MkIsIDB4NUMsIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjYsIDB4NUMsIDB4NDAsIDB4ODYsIDB4MjYsIDB4NDQsCisJIDB4RTQsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjYsIDB4NDcsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUEsIDB4QkQsIDB4RDIsIDB4MjYsIDB4NUMsIDB4OTAsIDB4ODQsCisJIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjcsIDB4NUMsIDB4NDAsIDB4ODcsIDB4MjcsIDB4NDQsIDB4RTYsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjcsIDB4NDcsCisJIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjcsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjgsIDB4NUMsIDB4NDAsIDB4ODgsIDB4MjgsIDB4NDQsCisJIDB4RTgsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjgsIDB4NDcsIDB4RTksIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjgsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsCisJIDB4MjksIDB4NUMsIDB4NDAsIDB4ODksIDB4MjksIDB4NDQsIDB4RUEsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjksIDB4NDcsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4MjksIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MkEsIDB4NUMsIDB4NDAsIDB4OEEsIDB4MkEsIDB4NDQsIDB4RUMsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4MkEsIDB4NDcsIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MkEsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MkIsIDB4NUMsIDB4NDAsIDB4OEIsCisJIDB4MkIsIDB4NDQsIDB4RUUsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MkIsIDB4NDcsIDB4RUYsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MzgsIDB4RjAsIDB4MkIsIDB4NDQsCisJIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MEQsIDB4NjAsIDB4M0UsIDB4NjIsIDB4QTIsIDB4RDcsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4RTQsIDB4NjAsIDB4QzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MzIsIDB4MDAsIDB4REMsIDB4RjMsIDB4MzEsIDB4NDEsIDB4MDEsIDB4QjEsCisJIDB4MDMsIDB4QTgsIDB4MkQsIDB4MDMsIDB4MTcsIDB4MDIsIDB4MjAsIDB4NDAsIDB4MDQsIDB4MkIsIDB4MEMsIDB4MDAsIDB4QkIsIDB4RkUsIDB4Q0EsIDB4RkUsCisJIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NjYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RDIsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MEMsIDB4MDAsIDB4QTksIDB4RkUsIDB4RDgsIDB4MDUsIDB4QUIsIDB4RkUsIDB4MEMsIDB4MDUsIDB4QTgsIDB4RkUsCisJIDB4QzgsIDB4MDUsIDB4QUEsIDB4RkUsIDB4QzksIDB4MDUsIDB4NzgsIDB4NDMsIDB4MDEsIDB4NjEsIDB4MjQsIDB4NjAsIDB4REQsIDB4NzgsIDB4QTEsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODUsIDB4M0UsIDB4MjQsIDB4NjAsIDB4NUUsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsCisJIDB4NjAsIDB4NDYsIDB4MDMsIDB4MDIsIDB4QkYsIDB4NjAsIDB4RTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDUsIDB4RDQsIDB4ODAsIDB4MEYsIDB4RjAsCisJIDB4RjksIDB4MDMsIDB4NjQsIDB4NDQsIDB4NzAsIDB4QjAsIDB4NzAsIDB4MkEsIDB4MTQsIDB4MDAsIDB4MjcsIDB4NjAsIDB4QjIsIDB4NjQsIDB4QTAsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjgsIDB4QTIsIDB4REIsIDB4QTIsIDB4RkYsIDB4QUYsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4Q0MsIDB4ODQsIDB4RkUsIDB4QTAsIDB4QUYsIDB4RkIsIDB4MDEsIDB4MDcsIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsIDB4QzUsIDB4NjAsIDB4NUIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MDksIDB4MDAsIDB4NjYsIDB4NDUsIDB4MDksIDB4RjQsIDB4MEYsIDB4RjIsIDB4MDIsIDB4MTgsCisJIDB4NjUsIDB4NDYsIDB4RTMsIDB4MUIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDYsIDB4Q0EsIDB4MDEsIDB4QTIsIDB4RkYsIDB4QUYsIDB4RjMsIDB4NDYsIDB4NDYsCisJIDB4Q0MsIDB4ODQsIDB4RkUsIDB4QTAsIDB4QUYsIDB4RkIsIDB4MDEsIDB4MDcsIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MEYsIDB4RjAsIDB4QTMsIDB4RkMsCisJIDB4NjQsIDB4NDQsIDB4ODAsIDB4MjYsIDB4MjIsIDB4MDAsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4OTIsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsCisJIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MzIsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDcsIDB4NjAsCisJIDB4MDEsIDB4NjQsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MjMsIDB4RkEsIDB4QzUsIDB4NjAsCisJIDB4NjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QzUsIDB4NjAsIDB4NUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjYsIDB4M0YsIDB4MDAsIDB4MkEsIDB4RjIsCisJIDB4NjAsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkIsIDB4NjYsIDB4NjMsIDB4QkUsIDB4RDIsIDB4ODMsIDB4RjEsIDB4QTMsIDB4RDIsIDB4RDAsIDB4ODAsCisJIDB4ODIsIDB4RjEsIDB4MTgsIDB4MDIsIDB4QkYsIDB4RDIsIDB4RDAsIDB4ODAsIDB4ODEsIDB4RjEsIDB4MTQsIDB4MDIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MTEsIDB4MDIsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4OUUsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsCisJIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsCisJIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MzIsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDcsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MDQsIDB4MDAsCisJIDB4MDIsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4QzUsIDB4NjAsIDB4NjcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4QjAsIDB4M0EsIDB4MDYsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4QzEsIDB4NjAsIDB4MTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QzUsIDB4NjAsIDB4NUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDQsIDB4MDEsIDB4MkEsCisJIDB4NEEsIDB4MDAsIDB4MjgsIDB4NjAsIDB4RTIsIDB4NjMsIDB4QkYsIDB4RDMsIDB4MDAsIDB4NjUsIDB4QjQsIDB4ODEsIDB4REIsIDB4ODMsIDB4M0QsIDB4MDMsCisJIDB4QkYsIDB4RDMsIDB4QTMsIDB4RDMsIDB4NDAsIDB4NDgsIDB4QkUsIDB4RDMsIDB4NDAsIDB4NEEsIDB4MkUsIDB4RjAsIDB4NDAsIDB4NEMsIDB4RDAsIDB4ODAsCisJIDB4MkQsIDB4RjAsIDB4MDgsIDB4MDIsIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MkMsIDB4RjAsIDB4MDQsIDB4MDIsIDB4MjgsIDB4NDQsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4MDMsIDB4MzEsIDB4RjAsIDB4MkMsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzAsIDB4RjAsIDB4MDgsIDB4MDIsIDB4MkEsIDB4NDQsCisJIDB4RDAsIDB4ODAsIDB4MkYsIDB4RjAsIDB4MDQsIDB4MDIsIDB4MjgsIDB4NDQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MUUsIDB4MDMsIDB4MzQsIDB4RjAsCisJIDB4MkMsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzMsIDB4RjAsIDB4MDgsIDB4MDIsIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzIsIDB4RjAsIDB4MDQsIDB4MDIsCisJIDB4MjgsIDB4NDQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MTEsIDB4MDMsIDB4MzgsIDB4RjAsIDB4MkMsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzcsIDB4RjAsCisJIDB4MDgsIDB4MDIsIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzYsIDB4RjAsIDB4MDQsIDB4MDIsIDB4MjgsIDB4NDQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MDMsIDB4RkEsIDB4QTEsIDB4MDYsIDB4QTMsIDB4QjcsIDB4MDMsIDB4QzMsIDB4MDEsIDB4MDcsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4QzUsIDB4NjAsIDB4NjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4MEYsIDB4RjAsIDB4NjAsIDB4NDUsIDB4QTQsIDB4MzYsIDB4MDgsIDB4MDAsCisJIDB4MEMsIDB4QjQsIDB4MDQsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MEMsIDB4M0EsIDB4MDYsIDB4MDAsIDB4QzUsIDB4NjAsIDB4NUIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QzIsIDB4NjAsIDB4REQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4RjAsIDB4NjUsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MjIsIDB4MDAsIDB4MzIsIDB4NDAsCisJIDB4MDgsIDB4MjYsIDB4MUYsIDB4MDAsIDB4MDcsIDB4RjQsIDB4MzYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MzcsIDB4QjQsIDB4MjYsIDB4NDYsIDB4MTksIDB4MDIsCisJIDB4MkMsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MTEsIDB4MDAsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4OTgsIDB4NjQsCisJIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsCisJIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4QzUsIDB4NjAsIDB4NUIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4NjQsIDB4NDAsIDB4NjAsIDB4MjYsIDB4MDMsIDB4MDAsIDB4QzIsIDB4NjAsIDB4QUYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDEsIDB4QTksIDB4RjMsIDB4MDcsIDB4RkEsIDB4NjEsIDB4NDQsIDB4ODAsIDB4M0EsIDB4MDYsIDB4MDAsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4RTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4MTAsIDB4MDAsIDB4NjAsIDB4NDAsIDB4NDAsIDB4M0EsIDB4MEQsIDB4MDAsIDB4REMsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDcsIDB4QjQsIDB4MDMsIDB4M0EsIDB4RTIsIDB4MDEsIDB4QzYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NEYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4REQsIDB4MDIsIDB4QTksIDB4RjMsIDB4MDcsIDB4RkEsIDB4RDEsIDB4MDAsIDB4NUUsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkIsIDB4NjQsIDB4NjMsCisJIDB4NTAsIDB4RkUsIDB4QkQsIDB4RDIsIDB4ODEsIDB4RjEsIDB4QkQsIDB4RDIsIDB4RDAsIDB4ODAsIDB4ODIsIDB4RjEsIDB4QkQsIDB4RDIsIDB4RDAsIDB4ODAsCisJIDB4ODMsIDB4RjEsIDB4MkEsIDB4RjIsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDAsIDB4MDgsIDB4M0EsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MEMsIDB4QzYsIDB4MDEsCisJIDB4REUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QjgsIDB4MDAsIDB4MjYsIDB4MEMsIDB4QzYsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4NEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QkIsIDB4MDIsIDB4MUYsIDB4NjAsIDB4NTIsIDB4NjEsIDB4MDIsIDB4NjQsIDB4QTEsIDB4REIsIDB4MUYsIDB4NjAsCisJIDB4NUEsIDB4NjEsIDB4MDAsIDB4NjQsIDB4QTEsIDB4REIsIDB4MjIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4M0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsCisJIDB4MDQsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MjcsIDB4MDgsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MUYsIDB4NjAsIDB4NTIsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4OUIsIDB4MDEsIDB4OTEsIDB4MDAsIDB4QzYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NEYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4RkEsIDB4MDIsIDB4MEYsIDB4NjAsIDB4Q0UsIDB4NjEsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDcsIDB4MDAsCisJIDB4MDEsIDB4NjQsIDB4QTEsIDB4REIsIDB4MDEsIDB4NjUsIDB4RTksIDB4NjAsIDB4NTgsIDB4NEUsIDB4N0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4MzEsIDB4RjIsIDB4MUMsIDB4NjAsIDB4QkEsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsCisJIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MzEsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsCisJIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MzAsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsCisJIDB4NjEsIDB4NDYsIDB4MkYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsCisJIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4QTksIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4QTksIDB4RjEsIDB4NDMsIDB4NDMsCisJIDB4RDMsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDIsIDB4QzUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDAsCisJIDB4MDgsIDB4MkEsIDB4MDUsIDB4MDAsIDB4NjMsIDB4NDYsIDB4ODAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MDYsIDB4RkEsIDB4MjYsIDB4NDYsIDB4RDgsIDB4RjMsCisJIDB4NjMsIDB4NDUsIDB4NjYsIDB4NDEsIDB4NjUsIDB4NDYsIDB4OEMsIDB4RkEsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDYsIDB4MDAsIDB4MDIsIDB4MzYsCisJIDB4MDQsIDB4MDAsIDB4MDQsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MDUsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MDEsIDB4MDAsIDB4MDEsIDB4NjQsCisJIDB4NkYsIDB4RkEsIDB4NzksIDB4RjMsIDB4N0EsIDB4RjEsIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsIDB4NjUsIDB4NDMsIDB4MDIsIDB4MDIsIDB4NzksIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4MEYsIDB4NjAsIDB4QUUsIDB4NjUsIDB4RDgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsCisJIDB4NjEsIDB4NDUsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDIsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MDMsCisJIDB4QTQsIDB4ODQsIDB4N0IsIDB4RkIsIDB4NkYsIDB4RjAsIDB4NjAsIDB4NDcsIDB4OTAsIDB4ODQsIDB4NkYsIDB4RkEsIDB4NjAsIDB4NDcsIDB4NjAsIDB4NDUsCisJIDB4ODAsIDB4NjQsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MDMsIDB4QTQsIDB4ODQsIDB4NzAsIDB4RjAsIDB4NzAsIDB4RkEsCisJIDB4MDAsIDB4NjEsIDB4RTgsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDUsIDB4REQsIDB4ODEsIDB4RkIsIDB4MDEsIDB4RTEsIDB4ODEsIDB4MEYsIDB4NjAsCisJIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MEUsIDB4RkEsIDB4NjYsIDB4NDMsIDB4MEMsIDB4RjQsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4OEMsIDB4NjQsCisJIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsCisJIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MjcsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4M0IsIDB4MTIsIDB4MDAsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4OUEsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsCisJIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MTMsIDB4MDAsIDB4MDIsIDB4M0IsIDB4MTEsIDB4MDAsIDB4QjgsIDB4RjEsCisJIDB4MjcsIDB4NjAsIDB4OUMsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsCisJIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsCisJIDB4MUIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RTQsIDB4QTQsIDB4M0UsIDB4RkEsIDB4MkEsIDB4RjIsIDB4MjgsIDB4NDEsIDB4NDAsIDB4QTgsIDB4MDEsIDB4QjEsCisJIDB4MDIsIDB4MDIsIDB4NjIsIDB4MDIsIDB4OTIsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MkIsIDB4MDAsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsCisJIDB4OEEsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsCisJIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MUIsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4OTAsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4ODAsCisJIDB4QzQsIDB4ODQsIDB4MEIsIDB4MDMsIDB4MDcsIDB4MDUsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDksIDB4MDQsCisJIDB4QzYsIDB4RkUsIDB4MDcsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QjgsIDB4ODQsIDB4QTIsIDB4REIsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsCisJIDB4ODgsIDB4RkYsIDB4MEYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MjgsIDB4MDAsIDB4MzIsIDB4NDQsIDB4MDIsIDB4MjYsCisJIDB4MjUsIDB4MDAsIDB4MTAsIDB4MkIsIDB4MjksIDB4MDAsIDB4MjgsIDB4NjAsIDB4RTIsIDB4NjMsIDB4QkYsIDB4RDMsIDB4MkMsIDB4RjAsIDB4MDAsIDB4QTgsCisJIDB4NjAsIDB4NDEsIDB4MEQsIDB4MDMsIDB4NTAsIDB4RkUsIDB4QkQsIDB4RDMsIDB4MkQsIDB4RjAsIDB4RDAsIDB4ODAsIDB4QkQsIDB4RDMsIDB4MkUsIDB4RjAsCisJIDB4RDAsIDB4ODAsIDB4QkQsIDB4RDMsIDB4MkMsIDB4RjAsIDB4RDAsIDB4ODAsIDB4RkEsIDB4QTEsIDB4MTAsIDB4MEMsIDB4RjMsIDB4MDIsIDB4NTAsIDB4RkUsCisJIDB4NjAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MkQsIDB4RjAsIDB4MUQsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MkUsIDB4RjAsIDB4MDEsIDB4NjQsCisJIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MEMsIDB4QzUsIDB4NjAsIDB4NUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDAsIDB4NDAsIDB4MkEsCisJIDB4MDMsIDB4MDAsIDB4MTksIDB4NjAsIDB4MjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QzUsIDB4NjAsIDB4NTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDAsCisJIDB4NDAsIDB4MjYsIDB4RjcsIDB4MDEsIDB4MkEsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MkEsIDB4MDAsIDB4REMsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDcsIDB4QjQsIDB4MDMsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MUQsIDB4MDAsCisJIDB4MDMsIDB4NjcsIDB4QTAsIDB4ODQsIDB4MDAsIDB4MzcsIDB4NjQsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MzcsIDB4NUUsIDB4NjMsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MzcsIDB4NTgsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MzcsIDB4MEQsIDB4MDAsIDB4QkQsIDB4RDIsIDB4ODEsIDB4RjEsIDB4QkQsIDB4RDIsCisJIDB4RDAsIDB4ODAsIDB4ODIsIDB4RjEsIDB4MDcsIDB4MDIsIDB4RDAsIDB4ODAsIDB4QkQsIDB4RDIsIDB4ODMsIDB4RjEsIDB4MDMsIDB4MDIsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4QzUsIDB4NjAsIDB4NUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4REUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RkUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDYsIDB4MDAsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MkIsCisJIDB4MDMsIDB4MDAsIDB4QzUsIDB4NjAsIDB4NTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODcsIDB4RjQsIDB4QTksIDB4RjEsIDB4MjcsIDB4MUIsIDB4MzEsIDB4RjIsCisJIDB4MUMsIDB4NjAsIDB4QkEsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsCisJIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MzEsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsCisJIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MzAsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsCisJIDB4MkYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsCisJIDB4RTgsIDB4MUIsIDB4QTksIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MDMsIDB4MDAsIDB4RDMsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4RDYsIDB4MDMsIDB4NDMsIDB4NDMsIDB4REMsIDB4RjMsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MDQsIDB4MDAsIDB4MDcsIDB4QjQsIDB4MDMsIDB4QTgsCisJIDB4MkEsIDB4RjIsIDB4NUYsIDB4MDIsIDB4QTksIDB4RjEsIDB4MjMsIDB4NDMsIDB4RDMsIDB4ODAsIDB4RkYsIDB4RkYsIDB4NUEsIDB4MDIsIDB4QzUsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4QTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDUsIDB4MDAsIDB4NjMsIDB4NDYsIDB4MDIsIDB4NjQsCisJIDB4MDYsIDB4RkEsIDB4MjYsIDB4NDYsIDB4NEUsIDB4MDAsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDUsIDB4MDAsIDB4NjMsIDB4NDYsIDB4ODAsIDB4NjAsCisJIDB4MDIsIDB4NjQsIDB4MDYsIDB4RkEsIDB4MjYsIDB4NDYsIDB4RDgsIDB4RjMsIDB4NjMsIDB4NDUsIDB4NjYsIDB4NDEsIDB4NjUsIDB4NDYsIDB4OEMsIDB4RkEsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDYsIDB4MDAsIDB4MDIsIDB4MzYsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MDUsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MDEsIDB4MDAsIDB4MDEsIDB4NjQsIDB4NkYsIDB4RkEsIDB4NzksIDB4RjMsIDB4N0EsIDB4RjEsIDB4RkYsIDB4RkYsCisJIDB4QTAsIDB4ODQsIDB4NjUsIDB4NDMsIDB4MDIsIDB4MDIsIDB4NzksIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4MEYsIDB4NjAsIDB4QUUsIDB4NjUsCisJIDB4RDgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjEsIDB4NDUsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDIsCisJIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MDMsIDB4QTQsIDB4ODQsIDB4N0IsIDB4RkIsIDB4NkYsIDB4RjAsIDB4NjAsIDB4NDcsCisJIDB4OTAsIDB4ODQsIDB4NkYsIDB4RkEsIDB4NjAsIDB4NDcsIDB4NjAsIDB4NDUsIDB4ODAsIDB4NjQsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4RkMsIDB4MDMsIDB4QTQsIDB4ODQsIDB4NzAsIDB4RjAsIDB4NzAsIDB4RkEsIDB4MDAsIDB4NjEsIDB4RTgsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDUsCisJIDB4REQsIDB4ODEsIDB4RkIsIDB4MDEsIDB4RTEsIDB4ODEsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MEUsIDB4RkEsIDB4NjYsIDB4NDMsCisJIDB4MEMsIDB4RjQsIDB4MDcsIDB4RkMsIDB4NDMsIDB4NDMsIDB4MDIsIDB4RkUsIDB4MUQsIDB4RjAsIDB4MUMsIDB4NjAsIDB4OUEsIDB4NjIsIDB4QzAsIDB4NjQsCisJIDB4QzAsIDB4ODQsIDB4QTIsIDB4RDEsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4QzAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MkEsIDB4RjIsIDB4NjMsIDB4NDUsIDB4MEMsIDB4QjQsIDB4MDgsIDB4M0EsIDB4MEEsIDB4MDAsIDB4REMsIDB4RjMsIDB4MjMsIDB4NDYsCisJIDB4MDcsIDB4QjQsIDB4RkQsIDB4QTAsIDB4MDYsIDB4RjIsIDB4MjYsIDB4NDYsIDB4MDMsIDB4MDMsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MEQsIDB4MDAsCisJIDB4MkEsIDB4RjIsIDB4MzUsIDB4RjAsIDB4NjAsIDB4NDAsIDB4QTQsIDB4MzYsIDB4MEIsIDB4MDAsIDB4MDgsIDB4MkIsIDB4MEMsIDB4MDAsIDB4MjMsIDB4NDYsCisJIDB4MjIsIDB4RjIsIDB4MjYsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MDIsIDB4QzUsIDB4NjAsIDB4NUIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QzUsIDB4NjAsIDB4NTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4NDYsIDB4MUUsIDB4RjIsIDB4MjYsIDB4NDYsIDB4NDQsIDB4NEMsIDB4MEYsIDB4MjYsCisJIDB4MUQsIDB4MDAsIDB4MDAsIDB4QkMsIDB4NDAsIDB4NDUsIDB4MEIsIDB4MDMsIDB4MDAsIDB4NjQsIDB4MjMsIDB4NDYsIDB4MUUsIDB4RkEsIDB4MjYsIDB4NDYsCisJIDB4QTIsIDB4RkYsIDB4QUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MkEsIDB4RjAsCisJIDB4MkMsIDB4NDQsIDB4NjQsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MEEsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MjIsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MUIsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4RTQsIDB4QTQsIDB4M0UsIDB4RkEsIDB4QzQsIDB4NjAsIDB4QUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjIsIDB4MDIsIDB4RkEsCisJIDB4QTIsIDB4RkYsIDB4MTYsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4MDEsIDB4MjYsIDB4REMsIDB4OUMsIDB4QjMsIDB4RjMsIDB4MkEsIDB4RjIsCisJIDB4REMsIDB4ODMsIDB4QjMsIDB4RkQsIDB4MDYsIDB4RjQsIDB4MDEsIDB4RjgsIDB4MjYsIDB4NDYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MTgsIDB4MDAsCisJIDB4NjQsIDB4NDQsIDB4MDAsIDB4NjUsIDB4RkYsIDB4QjQsIDB4RkMsIDB4QTQsIDB4MDYsIDB4RjAsIDB4MDMsIDB4MDMsIDB4NjQsIDB4NDYsIDB4MEMsIDB4MEQsCisJIDB4MDIsIDB4NjUsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4NjAsIDB4NDYsCisJIDB4RjksIDB4MDEsIDB4MDEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODQsIDB4MDEsIDB4RkEsIDB4NjYsIDB4NDQsIDB4MjYsIDB4NDYsIDB4MDYsIDB4RkEsCisJIDB4MDYsIDB4RjQsIDB4MDAsIDB4RjIsIDB4ODAsIDB4RkMsIDB4NDAsIDB4NDUsIDB4QUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QTMsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MkMsIDB4NDQsIDB4MEYsIDB4MjYsIDB4MTQsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MjIsIDB4RkEsIDB4MjYsIDB4NDQsCisJIDB4MUUsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MUIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RTQsIDB4QTQsIDB4M0UsIDB4RkEsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4NkYsIDB4MDAsIDB4QTMsIDB4NDYsIDB4MjIsIDB4RjIsIDB4NjAsIDB4NDUsIDB4REMsIDB4ODQsIDB4RDQsIDB4ODAsIDB4MjIsIDB4RkEsIDB4QTMsIDB4NDYsCisJIDB4NkMsIDB4MDIsIDB4MkEsIDB4RjAsIDB4QTMsIDB4NDYsIDB4MUUsIDB4RjIsIDB4QTMsIDB4NDYsIDB4MDAsIDB4QkMsIDB4MDAsIDB4RjIsIDB4MDEsIDB4MDIsCisJIDB4NjQsIDB4MDAsIDB4NDQsIDB4NEMsIDB4M0YsIDB4RjAsIDB4NjAsIDB4NDMsIDB4MjMsIDB4NDYsIDB4MUUsIDB4RjQsIDB4MDksIDB4NjAsIDB4MDAsIDB4NjUsCisJIDB4M0YsIDB4RjIsIDB4MjYsIDB4NDYsIDB4QzAsIDB4ODQsIDB4RDQsIDB4ODAsIDB4NjAsIDB4NDUsIDB4NTcsIDB4MDcsIDB4ODAsIDB4RkMsIDB4MUIsIDB4RjIsCisJIDB4MDYsIDB4RjIsIDB4NjAsIDB4NDEsIDB4MjMsIDB4NDYsIDB4MUUsIDB4RjQsIDB4MUIsIDB4RjAsIDB4MDYsIDB4RjAsIDB4QzEsIDB4ODEsIDB4MDYsIDB4RkEsCisJIDB4MDUsIDB4RkEsIDB4OUIsIDB4RkEsIDB4NjUsIDB4NDQsIDB4M0YsIDB4RkEsIDB4NjQsIDB4NDYsIDB4MDAsIDB4RkMsIDB4NjMsIDB4NDYsIDB4MDEsIDB4RjIsCisJIDB4MTAsIDB4NjEsIDB4RjIsIDB4QTQsIDB4MDEsIDB4RkEsIDB4QzgsIDB4ODMsIDB4MDIsIDB4NjQsIDB4NTksIDB4RDAsIDB4NTgsIDB4RDgsIDB4RkQsIDB4MUYsCisJIDB4MDYsIDB4NDUsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjUsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjAsIDB4MEEsIDB4MTgsIDB4NzAsIDB4NjcsCisJIDB4QTAsIDB4ODAsIDB4RjAsIDB4NjcsIDB4MDYsIDB4MDMsIDB4QzAsIDB4ODQsIDB4MDEsIDB4RkEsIDB4MjUsIDB4NDYsIDB4MjUsIDB4NDQsIDB4ODAsIDB4RkMsCisJIDB4MDUsIDB4RkEsIDB4QUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MkMsIDB4NDQsCisJIDB4MDQsIDB4MjcsIDB4MTYsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MUUsIDB4RjIsIDB4OUUsIDB4RkMsIDB4NjAsIDB4NDYsIDB4NDYsIDB4NDYsIDB4M0YsIDB4RjIsCisJIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDcsIDB4MDgsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MkMsIDB4NDMsIDB4MkEsIDB4RkMsIDB4MDYsIDB4RjQsIDB4MDAsIDB4NjQsCisJIDB4MDAsIDB4RkEsIDB4MDEsIDB4RjAsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4MDEsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MUQsIDB4MDAsCisJIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4QkYsIDB4NjAsIDB4RUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4NDYsIDB4MUUsIDB4RjAsIDB4OUUsIDB4RkMsCisJIDB4MDAsIDB4NjMsIDB4MzMsIDB4ODUsIDB4QTMsIDB4NDYsIDB4MEQsIDB4MDMsIDB4QTMsIDB4NDYsIDB4MjIsIDB4RjIsIDB4MEYsIDB4NjUsIDB4QTQsIDB4ODUsCisJIDB4RDQsIDB4ODQsIDB4MjIsIDB4RkEsIDB4QTMsIDB4NDYsIDB4QTIsIDB4RkYsIDB4QUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QTMsIDB4RkYsIDB4MjYsIDB4NDYsIDB4QzUsIDB4NjAsIDB4NUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4MzIsIDB4RjAsIDB4NjAsIDB4NDAsCisJIDB4MDgsIDB4MkEsIDB4NUMsIDB4MDAsIDB4MDEsIDB4MkIsIDB4MkYsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MkMsIDB4MDAsIDB4QjgsIDB4RjEsCisJIDB4MjcsIDB4NjAsIDB4OEEsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsCisJIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsCisJIDB4MUIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4OTAsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4RDgsIDB4ODAsIDB4QzQsIDB4ODQsIDB4MEIsIDB4MDMsIDB4MDcsIDB4MDUsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsCisJIDB4MDksIDB4MDQsIDB4QzYsIDB4RkUsIDB4MDcsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QjgsIDB4ODQsIDB4QTIsIDB4REIsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsCisJIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MkIsIDB4MDAsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4ODgsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsCisJIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MUIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsIDB4QjgsIDB4RjEsCisJIDB4MjcsIDB4NjAsIDB4OEUsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4ODAsIDB4QzQsIDB4ODQsIDB4MEIsIDB4MDMsIDB4MDcsIDB4MDUsCisJIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDksIDB4MDQsIDB4QzYsIDB4RkUsIDB4MDcsIDB4MDAsIDB4MDAsIDB4NjQsCisJIDB4QjgsIDB4ODQsIDB4QTIsIDB4REIsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MDcsIDB4RjQsIDB4RkYsIDB4RkYsCisJIDB4MjIsIDB4RjIsIDB4MjYsIDB4NDYsIDB4MEYsIDB4QjQsIDB4REMsIDB4ODUsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4OEMsIDB4NjQsIDB4QTAsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4RDgsIDB4ODAsIDB4QzQsIDB4ODQsIDB4MEIsIDB4MDMsIDB4MDcsIDB4MDUsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsCisJIDB4QTIsIDB4REIsIDB4MDksIDB4MDQsIDB4QzYsIDB4RkUsIDB4MDcsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QjgsIDB4ODQsIDB4QTIsIDB4REIsIDB4OEEsIDB4RkYsCisJIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MjcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4M0IsIDB4MTIsIDB4MDAsCisJIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4OUEsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsCisJIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsCisJIDB4ODgsIDB4RkYsIDB4MTMsIDB4MDAsIDB4MDIsIDB4M0IsIDB4MTEsIDB4MDAsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4OUMsIDB4NjQsIDB4QTAsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsCisJIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4QzYsIDB4NjAsIDB4ODUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QkYsIDB4NjAsIDB4RUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MkMsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4QkYsIDB4NjAsIDB4RUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjAsCisJIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjgsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4QkYsIDB4NjAsIDB4RUIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MkEsIDB4RjIsIDB4NTgsIDB4NjMsIDB4NjAsIDB4NDcsIDB4MDEsIDB4MjcsIDB4NjQsIDB4NjMsIDB4MzEsIDB4NjAsIDB4MjgsIDB4NjIsIDB4NjEsIDB4NUMsCisJIDB4QTIsIDB4RDksIDB4QkQsIDB4RDAsIDB4QkQsIDB4RDAsIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDEsIDB4QkQsIDB4RDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4RjgsCisJIDB4ODMsIDB4RkEsIDB4ODIsIDB4RjgsIDB4QTYsIDB4NDYsIDB4MDIsIDB4QjAsIDB4NUUsIDB4NjMsIDB4MDQsIDB4MDMsIDB4NjQsIDB4NjMsIDB4MDMsIDB4QjAsCisJIDB4MDIsIDB4M0EsIDB4NkMsIDB4NjMsIDB4M0YsIDB4RjIsIDB4QkQsIDB4RDAsIDB4QkQsIDB4RDAsIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDEsIDB4QkQsIDB4RDAsCisJIDB4QTYsIDB4NDYsIDB4MDcsIDB4RjgsIDB4ODYsIDB4RkEsIDB4ODUsIDB4RjgsIDB4NjAsIDB4NDcsIDB4MDgsIDB4RkEsIDB4MzEsIDB4NjAsIDB4MjgsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4MjYsIDB4NDYsIDB4NjQsIDB4NDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTksIDB4RjUsIDB4MDAsIDB4RjIsIDB4MjYsIDB4NDYsCisJIDB4MzEsIDB4RjAsIDB4MzksIDB4MTgsIDB4NjYsIDB4NDEsIDB4MUMsIDB4NjAsIDB4QkEsIDB4NjUsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4QTksIDB4RjEsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjQsIDB4NDMsIDB4MTEsIDB4MTgsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MUIsCisJIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjAsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NjUsIDB4NDMsIDB4ODAsIDB4RjAsCisJIDB4MDEsIDB4RkEsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4MEIsIDB4MDAsIDB4NjQsIDB4NDYsIDB4NjIsIDB4NDMsIDB4MDAsIDB4RjIsCisJIDB4QTMsIDB4REIsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjAsIDB4ODEsIDB4RkMsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjAsIDB4NDMsCisJIDB4NjEsIDB4NDYsIDB4MUUsIDB4NjAsIDB4QkMsIDB4NjEsIDB4QTEsIDB4RDMsIDB4MUUsIDB4NjAsIDB4RkUsIDB4N0MsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDcsIDB4MDMsIDB4QTAsIDB4REQsIDB4REEsIDB4OUMsIDB4QTEsIDB4RDksIDB4NDksIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4QTEsIDB4REIsCisJIDB4QzYsIDB4NjAsIDB4NDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4N0MsIDB4NzIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MDQsIDB4RDAsIDB4ODQsIDB4RkIsIDB4MDEsIDB4RTAsIDB4ODMsIDB4QTksIDB4RjMsIDB4MDIsIDB4QTMsIDB4NDMsIDB4OTMsIDB4QTksIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4QTUsIDB4RDcsIDB4ODAsIDB4MDQsIDB4QTUsIDB4MDgsIDB4MjQsIDB4NjUsIDB4NDMsIDB4NjYsIDB4NDEsIDB4NjMsIDB4NDYsCisJIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsIDB4MUMsIDB4NjAsCisJIDB4QkEsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RjgsCisJIDB4QTksIDB4RjMsIDB4NjMsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsIDB4RkEsIDB4MDQsCisJIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsCisJIDB4MzEsIDB4RjAsIDB4NjYsIDB4NDEsIDB4MUMsIDB4NjAsIDB4QkEsIDB4NjUsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4QTksIDB4RjEsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDMsIDB4NjQsIDB4NDMsIDB4MTEsIDB4MTgsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MUIsIDB4NjYsIDB4NDQsCisJIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjAsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NjUsIDB4NDMsIDB4ODAsIDB4RjAsIDB4MDEsIDB4RkEsCisJIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4MEIsIDB4MDAsIDB4NjQsIDB4NDYsIDB4NjIsIDB4NDMsIDB4MDAsIDB4RjIsIDB4QTMsIDB4REIsCisJIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjAsIDB4ODEsIDB4RkMsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsCisJIDB4MkYsIDB4RjIsIDB4MzAsIDB4RjAsIDB4MzEsIDB4RjAsIDB4NjQsIDB4NDUsIDB4NDYsIDB4NDMsIDB4NjMsIDB4NDYsIDB4MDMsIDB4RkEsIDB4MDYsIDB4RjIsCisJIDB4ODQsIDB4RjgsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4MDUsIDB4RjgsIDB4QTMsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4REMsIDB4RjMsCisJIDB4MkEsIDB4RjIsIDB4MDcsIDB4QjAsIDB4MDMsIDB4M0EsIDB4MkEsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDksIDB4RjIsIDB4NjAsIDB4NDUsIDB4ODAsIDB4M0EsCisJIDB4MDUsIDB4MDAsIDB4MEUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QjAsIDB4MEYsIDB4RjIsIDB4MjAsIDB4MDMsIDB4NjAsIDB4NDcsIDB4MDAsIDB4M0EsCisJIDB4MUQsIDB4MDAsIDB4NjAsIDB4NDEsIDB4MDAsIDB4MzYsIDB4MTMsIDB4MDAsIDB4REEsIDB4ODUsIDB4MkQsIDB4NjAsIDB4N0EsIDB4NjMsIDB4QkQsIDB4RDEsCisJIDB4RkYsIDB4RkYsIDB4RDEsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MTIsIDB4MDIsIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDMsIDB4QTUsIDB4RDAsIDB4REUsIDB4ODUsCisJIDB4RDAsIDB4ODAsIDB4Q0QsIDB4ODEsIDB4MEIsIDB4MDIsIDB4RjksIDB4MDIsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjQsIDB4MEEsIDB4MDAsIDB4MjYsIDB4NDYsCisJIDB4NDgsIDB4RkUsIDB4NjUsIDB4NDAsIDB4NDAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjQsIDB4MDMsIDB4MDAsIDB4MDgsIDB4RkUsIDB4MjAsIDB4RkUsCisJIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MjYsIDB4NDYsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkQsIDB4NjAsIDB4NTIsIDB4NjIsIDB4QTIsIDB4RDMsCisJIDB4MTgsIDB4RjIsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MkEsIDB4RkEsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjYsCisJIDB4MDMsIDB4MDAsIDB4QzcsIDB4NjAsIDB4NkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjAsIDB4MzIsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MjAsIDB4MDAsCisJIDB4MkMsIDB4RjAsIDB4NjQsIDB4NDEsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjcsIDB4MUIsIDB4MDAsIDB4Q0QsIDB4ODEsIDB4REQsIDB4ODEsIDB4MTgsIDB4MDMsCisJIDB4MTcsIDB4MDMsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MTQsIDB4MDAsIDB4MDEsIDB4NjEsIDB4MTMsIDB4MDAsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsCisJIDB4QTAsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsCisJIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4MjMsIDB4MDAsCisJIDB4MDAsIDB4NjEsIDB4NjAsIDB4NDAsIDB4MTgsIDB4MzYsIDB4MUYsIDB4MDAsIDB4QzUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NzgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MEYsIDB4RjAsIDB4RUIsIDB4RjEsIDB4NjQsIDB4NDQsIDB4NjAsIDB4MjIsIDB4MTksIDB4MDAsIDB4REMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDcsIDB4QjQsCisJIDB4RkQsIDB4QTAsIDB4MkEsIDB4RjIsIDB4MDMsIDB4MDIsIDB4MDgsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MDIsIDB4MzIsIDB4RjIsIDB4MzMsIDB4RjIsCisJIDB4RDAsIDB4ODAsIDB4RUMsIDB4RjEsIDB4MEIsIDB4MDIsIDB4RDAsIDB4ODAsIDB4MzQsIDB4RjIsIDB4MDgsIDB4MDIsIDB4RUQsIDB4RjEsIDB4RkYsIDB4RkYsCisJIDB4RDAsIDB4ODAsIDB4MEYsIDB4RjAsIDB4MDMsIDB4MDIsIDB4QzcsIDB4NjAsIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4RjQsIDB4QUEsIDB4NjAsCisJIDB4QUEsIDB4NjUsIDB4MDksIDB4RjIsIDB4NUEsIDB4RDAsIDB4RDQsIDB4ODAsIDB4MDMsIDB4NjQsIDB4NEYsIDB4MDIsIDB4RDAsIDB4ODAsIDB4MDAsIDB4NjQsCisJIDB4NUEsIDB4RDAsIDB4NEIsIDB4MDIsIDB4NjQsIDB4NDUsIDB4RDQsIDB4ODAsIDB4RjgsIDB4N0YsIDB4MDgsIDB4MDIsIDB4NUEsIDB4RDAsIDB4MjYsIDB4NDYsCisJIDB4NjQsIDB4NDUsIDB4MjMsIDB4RjAsIDB4MjAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MEIsIDB4MDAsIDB4RDQsIDB4ODAsIDB4MUQsIDB4NjAsCisJIDB4NjAsIDB4NjQsIDB4MTYsIDB4MDIsIDB4NUEsIDB4RDAsIDB4MjYsIDB4NDYsIDB4NjQsIDB4NDUsIDB4MjMsIDB4RjAsIDB4NDAsIDB4NjcsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REEsIDB4NjUsIDB4NDQsIDB4ODgsIDB4M0EsIDB4MDcsIDB4MDAsIDB4NzcsIDB4MzcsIDB4MDgsIDB4MDAsIDB4NzgsIDB4MzcsIDB4MDYsIDB4MDAsCisJIDB4OEUsIDB4MzcsIDB4MDQsIDB4MDAsIDB4MkEsIDB4MDAsIDB4ODEsIDB4M0EsIDB4MjgsIDB4MDAsIDB4ODAsIDB4MzcsIDB4MDAsIDB4NjEsIDB4MjUsIDB4MDAsCisJIDB4RDQsIDB4ODAsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4NUEsIDB4RDAsIDB4MjAsIDB4MDIsIDB4RDAsIDB4ODAsIDB4NUEsIDB4RDAsIDB4MUQsIDB4MDIsCisJIDB4MjYsIDB4NDYsIDB4NjQsIDB4NDcsIDB4N0YsIDB4QjQsIDB4RkQsIDB4QTAsIDB4MDksIDB4MDMsIDB4MTcsIDB4MDcsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MjYsCisJIDB4NDcsIDB4MDAsIDB4MjMsIDB4RjAsIDB4NjAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NDIsIDB4MDAsIDB4MEYsIDB4RjIsIDB4MzIsIDB4NDAsCisJIDB4MDIsIDB4MjYsIDB4M0UsIDB4MDAsIDB4RjIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4RjIsIDB4RkIsIDB4RUIsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4QTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QzcsIDB4NjAsIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4NjEsIDB4NDAsIDB4MDEsIDB4MkEsCisJIDB4MTIsIDB4MDAsIDB4QjgsIDB4RjEsIDB4MjcsIDB4NjAsIDB4QTAsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsCisJIDB4RDAsIDB4ODAsIDB4MDQsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4MDQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsCisJIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4NkUsIDB4MDAsIDB4MEYsIDB4RjIsIDB4ODEsIDB4RjEsIDB4MkEsIDB4RjIsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkEsCisJIDB4MTIsIDB4MDAsIDB4NUUsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkIsIDB4NjQsIDB4NjMsIDB4QkQsIDB4RDIsIDB4QkQsIDB4RDIsIDB4RDAsIDB4ODAsCisJIDB4ODIsIDB4RjEsIDB4MDgsIDB4MDIsIDB4RDAsIDB4ODAsIDB4QTMsIDB4RDIsIDB4ODMsIDB4RjEsIDB4MDQsIDB4MDIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MDIsIDB4MDYsIDB4MDAsIDB4NTYsIDB4MDAsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NDgsIDB4MzYsIDB4NTEsIDB4MDAsCisJIDB4RjIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4RjIsIDB4RkIsIDB4NTksIDB4MDAsIDB4MjYsIDB4NDYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4MEMsIDB4MjYsIDB4NDYsIDB4MDAsIDB4QjAsIDB4MzYsIDB4MTUsIDB4MDAsIDB4MTAsIDB4MzYsIDB4MTMsIDB4MDAsIDB4MzAsIDB4MzYsCisJIDB4MTEsIDB4MDAsIDB4QzAsIDB4MzYsIDB4MDIsIDB4MDAsIDB4QTAsIDB4M0EsIDB4MTIsIDB4MDAsIDB4ODEsIDB4RjEsIDB4MzIsIDB4RjIsIDB4MzMsIDB4RjIsCisJIDB4RDAsIDB4ODAsIDB4ODIsIDB4RjEsIDB4MzYsIDB4MDIsIDB4RDAsIDB4ODAsIDB4MzQsIDB4RjIsIDB4ODMsIDB4RjEsIDB4MzIsIDB4MDIsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDIsIDB4REIsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RDIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4MDAsIDB4NTAsIDB4M0EsCisJIDB4MDUsIDB4MDAsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4MDAsIDB4NDAsIDB4M0EsIDB4MDUsIDB4MDAsCisJIDB4RTgsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NjAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTgsIDB4MDAsIDB4ODAsIDB4M0EsIDB4MTUsIDB4MDAsIDB4ODEsIDB4RjEsCisJIDB4MzIsIDB4RjIsIDB4MzMsIDB4RjIsIDB4RDAsIDB4ODAsIDB4ODIsIDB4RjEsIDB4MTQsIDB4MDIsIDB4RDAsIDB4ODAsIDB4MzQsIDB4RjIsIDB4ODMsIDB4RjEsCisJIDB4MTAsIDB4MDIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MEQsIDB4MDIsIDB4REYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MjgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjAsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4NjYsIDB4NDQsIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsCisJIDB4MEEsIDB4MDMsIDB4MjYsIDB4NDYsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MkMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RDgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4QzUsIDB4NjAsIDB4NTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4M0IsIDB4RjAsCisJIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MUUsIDB4MDAsIDB4QzAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MTksIDB4MDAsCisJIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4QjQsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDMsIDB4QzAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MjYsIDB4NDYsCisJIDB4QTAsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MjMsIDB4RjIsIDB4MTAsIDB4QkQsIDB4QjQsIDB4OUMsIDB4M0YsIDB4RjIsCisJIDB4MjMsIDB4RjgsIDB4M0YsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RjgsIDB4QTQsIDB4M0YsIDB4RkEsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDcsIDB4MDgsIDB4RkEsCisJIDB4MjYsIDB4NDYsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjgsIDB4RkUsIDB4Q0IsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MzAsIDB4NjEsCisJIDB4QUUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4NjAsIDB4RkIsIDB4MDAsIDB4NjAsIDB4MzAsIDB4NjEsCisJIDB4QUUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4NUYsIDB4RkIsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjEsCisJIDB4QUUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4NjYsIDB4RkIsIDB4MTAsIDB4NjAsIDB4MjYsIDB4NjIsCisJIDB4QzksIDB4NjAsIDB4QzcsIDB4NjQsIDB4QTIsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4MDEsIDB4NjQsIDB4REMsIDB4RkIsIDB4RjIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4RjIsIDB4RkIsIDB4MEYsIDB4NjAsIDB4RjAsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsIDB4MTQsIDB4NjMsIDB4MDEsIDB4NjAsIDB4QzQsIDB4NjEsIDB4MjgsIDB4NjAsIDB4M0UsIDB4NjQsCisJIDB4NTgsIDB4RDEsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MDAsIDB4NjAsIDB4ODgsIDB4NjMsIDB4MjcsIDB4NjAsIDB4QjQsIDB4NjEsIDB4MjgsIDB4NjAsCisJIDB4NTQsIDB4NjQsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MjgsIDB4NjAsIDB4MkMsIDB4NjIsIDB4QTIsIDB4RDEsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDUsIDB4QTksIDB4RjEsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MzYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDAsIDB4MDEsIDB4MzYsCisJIDB4MjIsIDB4NjQsIDB4MzYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MzIsIDB4NDUsIDB4MjgsIDB4NjAsIDB4M0MsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MTAsIDB4NjcsCisJIDB4QjQsIDB4ODUsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4OTQsIDB4ODUsIDB4NDUsIDB4NTIsIDB4RkYsIDB4NjAsIDB4RTcsIDB4NjUsIDB4MzIsIDB4NDEsCisJIDB4QTUsIDB4ODEsIDB4MkQsIDB4NjAsIDB4MUEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MjgsIDB4NjAsIDB4MkMsIDB4NjIsIDB4QTIsIDB4RDMsIDB4NjQsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MEQsIDB4MDAsIDB4MDgsIDB4NjUsIDB4RkYsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4MDgsIDB4MDAsIDB4MjgsIDB4NjAsCisJIDB4MzAsIDB4NjIsIDB4QTIsIDB4RDMsIDB4QjUsIDB4ODEsIDB4MTAsIDB4NjUsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4QjUsIDB4ODEsIDB4NDEsIDB4NTIsCisJIDB4MkQsIDB4NjAsIDB4MUEsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MzEsIDB4NjAsIDB4MTgsIDB4NjMsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsCisJIDB4MDEsIDB4QjUsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4MDMsIDB4QjQsIDB4NjUsIDB4NUMsIDB4QTMsIDB4RDksIDB4MzEsIDB4NjAsIDB4MUEsIDB4NjMsCisJIDB4MDIsIDB4QTgsIDB4QTMsIDB4REIsIDB4MUIsIDB4MDIsIDB4MDcsIDB4NjAsIDB4RDAsIDB4NjQsIDB4MzEsIDB4NjAsIDB4MUMsIDB4NjMsIDB4QTMsIDB4REIsCisJIDB4MzEsIDB4NjAsIDB4MjQsIDB4NjMsIDB4QTMsIDB4REIsIDB4MDAsIDB4NjAsIDB4QzgsIDB4NjQsIDB4MzEsIDB4NjAsIDB4MUUsIDB4NjMsIDB4QTMsIDB4REIsCisJIDB4MzEsIDB4NjAsIDB4MjYsIDB4NjMsIDB4QTMsIDB4REIsIDB4MDAsIDB4NjAsIDB4NjQsIDB4NjQsIDB4MzEsIDB4NjAsIDB4MjAsIDB4NjMsIDB4QTMsIDB4REIsCisJIDB4MDEsIDB4NjAsIDB4OTAsIDB4NjQsIDB4MzEsIDB4NjAsIDB4MjIsIDB4NjMsIDB4QTMsIDB4REIsIDB4MDgsIDB4MDAsIDB4MEEsIDB4NjQsIDB4MzEsIDB4NjAsCisJIDB4MjAsIDB4NjMsIDB4QTMsIDB4REIsIDB4MDEsIDB4NjQsIDB4MzEsIDB4NjAsIDB4MjIsIDB4NjMsIDB4QTMsIDB4REIsIDB4MkQsIDB4NjAsIDB4MUEsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4MDEsIDB4NjQsIDB4NjQsIDB4NDAsIDB4NDAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MzEsIDB4NjAsIDB4MEUsIDB4N0MsIDB4QTQsIDB4REIsCisJIDB4MTIsIDB4NjAsIDB4MjgsIDB4NjMsIDB4QkEsIDB4RjMsIDB4MEUsIDB4NjEsIDB4NjAsIDB4NDUsIDB4NjUsIDB4NDQsIDB4RTgsIDB4ODUsIDB4MDUsIDB4NjQsCisJIDB4Q0QsIDB4ODEsIDB4MDIsIDB4MjgsIDB4MDAsIDB4NjQsIDB4QkQsIDB4REIsIDB4RjgsIDB4MDIsIDB4MkQsIDB4NjAsIDB4NzgsIDB4NjEsIDB4MjcsIDB4NjAsCisJIDB4QjYsIDB4NjQsIDB4MjAsIDB4NjMsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4QkQsIDB4RjEsIDB4ODAsIDB4RjksIDB4MUEsIDB4NjMsCisJIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjEsIDB4MDAsIDB4NjQsIDB4NTksIDB4REIsIDB4RkUsIDB4MUYsIDB4NDAsIDB4NDAsIDB4MDEsIDB4NjQsIDB4ODcsIDB4RkIsCisJIDB4MjgsIDB4NjAsIDB4Q0MsIDB4NjEsIDB4QTEsIDB4RDMsIDB4MkUsIDB4NjAsIDB4OTYsIDB4NjEsIDB4RkUsIDB4QTQsIDB4RTAsIDB4ODQsIDB4MDQsIDB4MjQsCisJIDB4MEYsIDB4MDAsIDB4RTAsIDB4ODQsIDB4NDEsIDB4OTEsIDB4MkQsIDB4NjAsIDB4Q0MsIDB4NjIsIDB4QTIsIDB4RDMsIDB4QTEsIDB4RDEsIDB4MkQsIDB4NjAsCisJIDB4QzQsIDB4NjIsIDB4QTAsIDB4ODMsIDB4QTIsIDB4REQsIDB4NTksIDB4RDEsIDB4MkQsIDB4NjAsIDB4QzIsIDB4NjIsIDB4QTAsIDB4ODMsIDB4QTIsIDB4REQsCisJIDB4RTUsIDB4RjMsIDB4N0YsIDB4RkIsIDB4MUIsIDB4NjAsIDB4QzYsIDB4NjEsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QjgsIDB4MTAsIDB4NjAsCisJIDB4NUMsIDB4NjUsIDB4MEQsIDB4MDMsIDB4MUIsIDB4NjAsIDB4Q0UsIDB4NjMsIDB4RTUsIDB4RjMsIDB4QTMsIDB4RDEsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODQsCisJIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4RTUsIDB4RjksIDB4N0YsIDB4RjksIDB4RTUsIDB4RjMsCisJIDB4MDEsIDB4NjEsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4RTEsIDB4ODEsIDB4RkIsIDB4MDEsIDB4QkEsIDB4RjMsIDB4NjEsIDB4NDUsCisJIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDIsIDB4MDAsIDB4QjgsIDB4MDEsIDB4NjMsIDB4MDgsIDB4MDMsIDB4RTgsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MjQsIDB4MDIsIDB4MDAsIDB4REYsIDB4ODMsIDB4RkEsIDB4MDEsIDB4RTUsIDB4RkQsIDB4N0YsIDB4RkQsIDB4MEYsIDB4NjAsIDB4RjAsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEIsIDB4MDQsIDB4MEYsIDB4NjAsIDB4RjIsIDB4NjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4QzgsIDB4NjAsIDB4RjcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0YsIDB4RjEsCisJIDB4MjQsIDB4NjAsIDB4OUEsIDB4NjIsIDB4QTIsIDB4RDksIDB4MEMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MDcsIDB4NjQsCisJIDB4RDAsIDB4RkIsIDB4MEYsIDB4NjAsIDB4RjIsIDB4NjIsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QzksIDB4NjAsIDB4MzQsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RjAsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4QkUsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MDEsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4RTMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDUsIDB4M0EsCisJIDB4MDMsIDB4MDAsIDB4NjgsIDB4NjAsIDB4QkEsIDB4NjEsIDB4MTEsIDB4MDAsIDB4MDQsIDB4M0EsIDB4MDMsIDB4MDAsIDB4NjgsIDB4NjAsIDB4QUUsIDB4NjEsCisJIDB4MEMsIDB4MDAsIDB4MDMsIDB4M0EsIDB4MDMsIDB4MDAsIDB4NjgsIDB4NjAsIDB4QTIsIDB4NjEsIDB4MDcsIDB4MDAsIDB4MDIsIDB4M0EsIDB4MDMsIDB4MDAsCisJIDB4NjgsIDB4NjAsIDB4OTYsIDB4NjEsIDB4MDIsIDB4MDAsIDB4NjgsIDB4NjAsIDB4OEEsIDB4NjEsIDB4M0MsIDB4NjAsIDB4MDAsIDB4NjYsIDB4MDEsIDB4NjAsCisJIDB4QjgsIDB4NjQsIDB4MEEsIDB4NjMsIDB4NTksIDB4RDAsIDB4NTgsIDB4RDksIDB4RkQsIDB4MUYsIDB4MDEsIDB4NjAsIDB4QkUsIDB4NjEsIDB4RTQsIDB4RjMsCisJIDB4MDAsIDB4NjYsIDB4MDAsIDB4QTgsIDB4MDQsIDB4NjUsIDB4MDEsIDB4MDMsIDB4QTEsIDB4REIsIDB4MUYsIDB4NjAsIDB4MDgsIDB4NjMsIDB4NTUsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4N0YsIDB4QkQsIDB4REIsIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjEsIDB4N0YsIDB4QkQsIDB4REIsIDB4NTksIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4MjIsIDB4N0YsIDB4QTMsIDB4REIsIDB4MEYsIDB4NjAsIDB4RjAsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsCisJIDB4MEIsIDB4MDQsIDB4MEYsIDB4NjAsIDB4RjIsIDB4NjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QzksIDB4NjAsIDB4N0IsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjAsIDB4OUEsIDB4NjIsIDB4MUYsIDB4NjAsIDB4MDYsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MjAsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RjIsIDB4NjIsIDB4MjAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QzksIDB4NjAsIDB4QTAsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4QkUsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4QzUsIDB4RkUsIDB4MjAsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MDgsIDB4MDAsIDB4MTAsIDB4NjAsIDB4MDIsIDB4NjIsIDB4QTIsIDB4RDEsCisJIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDEsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RjAsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4NUEsIDB4REIsIDB4MEUsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjQsCisJIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsIDB4RjAsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4OEIsIDB4RkIsCisJIDB4RkYsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MUEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDEsIDB4NjAsIDB4REYsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MjQsIDB4NjAsIDB4QTgsIDB4NjMsIDB4MDEsIDB4NjQsIDB4QkQsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsCisJIDB4MEYsIDB4NjAsIDB4RjAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MEYsIDB4NjAsIDB4RjIsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QTIsIDB4REIsIDB4QzksIDB4NjAsIDB4RjMsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsIDB4RjAsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4N0YsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4OEIsIDB4RjMsIDB4MDAsIDB4NjUsIDB4RDQsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDMsIDB4MEYsIDB4NjAsIDB4RjIsIDB4NjIsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QzksIDB4NjAsCisJIDB4RjMsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4REUsIDB4RkUsIDB4MEUsIDB4MDQsIDB4MDksIDB4NjQsCisJIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsIDB4RjIsIDB4NjIsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4Q0EsIDB4NjAsCisJIDB4MUQsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4MjQsIDB4NjAsIDB4OUEsIDB4NjIsIDB4MDYsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RjAsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NUEsIDB4REIsIDB4QkUsIDB4RkUsIDB4REEsIDB4RkUsIDB4MjQsIDB4NjAsIDB4MzQsIDB4NjEsIDB4Q0EsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4NTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjAsIDB4MjIsIDB4NjEsIDB4Q0EsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NTcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjAsIDB4MjgsIDB4NjEsIDB4Q0EsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjAsCisJIDB4NDYsIDB4NjEsIDB4Q0EsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjAsIDB4NEMsIDB4NjEsIDB4Q0EsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4NTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NjEsIDB4Q0EsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NTcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QzUsIDB4RkUsIDB4MEUsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RDMsCisJIDB4MEUsIDB4NTcsIDB4MjQsIDB4MDAsIDB4MEUsIDB4RjIsIDB4NDQsIDB4NEMsIDB4ODAsIDB4QjAsIDB4MTAsIDB4QjAsIDB4MEIsIDB4MDMsIDB4MjQsIDB4NjAsCisJIDB4NzQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4MTMsIDB4MDAsIDB4MTIsIDB4MDIsIDB4RjAsIDB4MzcsIDB4MDksIDB4MDAsIDB4MDIsIDB4RjAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsCisJIDB4RDAsIDB4ODAsIDB4QTIsIDB4RkYsIDB4QjAsIDB4RjMsIDB4MDIsIDB4MDIsIDB4Q0MsIDB4ODQsIDB4QjAsIDB4RkIsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjQsCisJIDB4NDAsIDB4NEIsIDB4MkMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkMsIDB4NDQsIDB4QUMsIDB4ODYsIDB4MDksIDB4RjAsCisJIDB4RDksIDB4MDIsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUEsIDB4NjAsIDB4NjYsIDB4NjMsIDB4MDAsIDB4NjQsIDB4QTMsIDB4REIsIDB4MDYsIDB4QTMsCisJIDB4MTAsIDB4NjAsIDB4NEMsIDB4NjQsIDB4QkQsIDB4REIsIDB4QkQsIDB4REIsIDB4MDYsIDB4NjQsIDB4QTMsIDB4REIsIDB4MDAsIDB4NjMsIDB4MTAsIDB4NjAsCisJIDB4OUUsIDB4NjIsIDB4QTIsIDB4REQsIDB4MTAsIDB4NjAsIDB4NEEsIDB4NjIsIDB4Q0YsIDB4NjAsIDB4MTYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsCisJIDB4MjQsIDB4NjIsIDB4Q0UsIDB4NjAsIDB4RTIsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4Q0EsIDB4NjAsIDB4RkIsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjgsIDB4NjAsCisJIDB4N0UsIDB4NjEsIDB4M0MsIDB4NjAsIDB4MDAsIDB4NjYsIDB4MDEsIDB4NjAsIDB4QjgsIDB4NjQsIDB4MEEsIDB4NjMsIDB4NTksIDB4RDAsIDB4NTgsIDB4RDksCisJIDB4RkQsIDB4MUYsIDB4MDEsIDB4NjAsIDB4QkUsIDB4NjEsIDB4RTQsIDB4RjMsIDB4MDAsIDB4NjYsIDB4MDAsIDB4QTgsIDB4MDQsIDB4NjUsIDB4MDEsIDB4MDMsCisJIDB4QTEsIDB4REIsIDB4MUYsIDB4NjAsIDB4MDgsIDB4NjMsIDB4NTUsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjAsIDB4N0YsIDB4QkQsIDB4REIsIDB4NTksIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4MjEsIDB4N0YsIDB4QkQsIDB4REIsIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjIsIDB4N0YsIDB4QTMsIDB4REIsIDB4MEYsIDB4NjAsCisJIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEIsIDB4MDQsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4NDAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4Q0EsIDB4NjAsIDB4QzcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjQsIDB4NjAsIDB4OUEsIDB4NjIsIDB4MUYsIDB4NjAsIDB4MDYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjAsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4Q0EsIDB4NjAsIDB4RUMsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4QkUsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QkEsIDB4RkUsIDB4MjcsIDB4NjAsIDB4QjYsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4QTgsCisJIDB4MDIsIDB4QTgsIDB4MDQsIDB4MDMsIDB4MEYsIDB4MDIsIDB4Q0UsIDB4NjAsIDB4QjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0QsIDB4NjAsIDB4RUYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4ODAsIDB4NjUsIDB4QTUsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RjMsIDB4QjQsIDB4QTUsIDB4REIsIDB4Q0IsIDB4NjAsCisJIDB4MjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjMsIDB4MUEsIDB4NjAsIDB4NDAsIDB4NjQsIDB4QTAsIDB4REQsIDB4MUYsIDB4NjAsIDB4ODAsIDB4NjQsCisJIDB4MDAsIDB4NjMsIDB4QTAsIDB4REQsIDB4MTEsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4QkEsIDB4RkUsIDB4MDIsIDB4NjQsIDB4REMsIDB4RkIsIDB4RjIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QkMsIDB4RjIsIDB4RkIsCisJIDB4NDQsIDB4NjAsIDB4NDQsIDB4NjQsIDB4ODEsIDB4RkIsIDB4ODIsIDB4RkIsIDB4ODMsIDB4RkIsIDB4RkYsIDB4RkYsIDB4MjAsIDB4NDAsIDB4MDQsIDB4MkIsCisJIDB4MTksIDB4MDAsIDB4OUIsIDB4RkUsIDB4MDksIDB4MDQsIDB4QkIsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTIsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsCisJIDB4RUMsIDB4NjIsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4Q0IsIDB4NjAsIDB4MzYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsIDB4MEQsIDB4NjQsIDB4NTMsIDB4RkIsCisJIDB4MjksIDB4NjAsIDB4QTQsIDB4NjQsIDB4NTQsIDB4RkIsIDB4MTMsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsIDB4Q0UsIDB4NjEsCisJIDB4QTEsIDB4RDEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDcsIDB4MDAsCisJIDB4MDAsIDB4NjQsIDB4QTEsIDB4REIsIDB4MDIsIDB4NjUsIDB4RTksIDB4NjAsIDB4NTgsIDB4NEUsIDB4N0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0EsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4QTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4ODAsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NDAsIDB4NjUsIDB4QTIsIDB4RDMsCisJIDB4QTUsIDB4RDEsIDB4NjAsIDB4NDAsIDB4MEMsIDB4MjIsIDB4MDQsIDB4MDAsIDB4MDQsIDB4NjEsIDB4RDEsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDUsCisJIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NEUsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RkIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4Q0IsIDB4NjAsCisJIDB4OTUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QTAsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MEMsIDB4MjYsIDB4MTEsIDB4MDAsIDB4RkQsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsCisJIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MzgsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MEYsIDB4NEUsIDB4RUMsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4MEYsIDB4NjAsCisJIDB4RUMsIDB4NjIsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4Q0IsIDB4NjAsIDB4QzIsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTQsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4RkQsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsCisJIDB4MjQsIDB4ODAsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4ODgsIDB4RjEsIDB4MTksIDB4NjAsIDB4ODYsIDB4NjMsCisJIDB4RDMsIDB4ODAsIDB4MjAsIDB4NDQsIDB4MDUsIDB4MDMsIDB4MTAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4Q0QsIDB4NjAsIDB4RTgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4ODksIDB4RjMsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4MjAsIDB4NDQsIDB4MDYsIDB4MDIsIDB4RDQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsCisJIDB4RkYsIDB4RkYsIDB4MUUsIDB4MDIsIDB4NzIsIDB4MDAsIDB4MTAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4NjQsIDB4NDIsIDB4NUEsIDB4RDEsIDB4MDYsIDB4NjMsCisJIDB4QTQsIDB4RDEsIDB4QzMsIDB4ODMsIDB4N0YsIDB4RjksIDB4QkQsIDB4RDEsIDB4ODEsIDB4RjksIDB4QkQsIDB4RDEsIDB4RkYsIDB4RkYsIDB4ODIsIDB4RjksCisJIDB4QkQsIDB4RDEsIDB4ODMsIDB4RjksIDB4MDQsIDB4QTMsIDB4QkQsIDB4RDEsIDB4MkQsIDB4NjAsIDB4N0EsIDB4NjQsIDB4NjQsIDB4NDEsIDB4REQsIDB4ODEsCisJIDB4RkUsIDB4QjEsIDB4QTAsIDB4RDksIDB4MDQsIDB4MDMsIDB4QkQsIDB4RDEsIDB4QzksIDB4ODEsIDB4NTgsIDB4RDksIDB4RkMsIDB4MDIsIDB4MUUsIDB4MDAsCisJIDB4RTUsIDB4RjMsIDB4N0YsIDB4RkIsIDB4MjksIDB4NjAsIDB4QTQsIDB4NjEsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4MkQsIDB4NjAsCisJIDB4N0EsIDB4NjMsIDB4MDIsIDB4MDIsIDB4MjcsIDB4NjAsIDB4QjgsIDB4NjEsIDB4QTEsIDB4RDMsIDB4QkQsIDB4REIsIDB4REMsIDB4ODQsIDB4RkUsIDB4QjQsCisJIDB4NTksIDB4RDEsIDB4QzgsIDB4ODQsIDB4QkQsIDB4RDksIDB4RkMsIDB4MDIsIDB4RUQsIDB4RjMsIDB4NzIsIDB4NDUsIDB4RUMsIDB4RjMsIDB4OTQsIDB4ODMsCisJIDB4ODMsIDB4RkQsIDB4OTQsIDB4ODMsIDB4ODIsIDB4RkQsIDB4NjUsIDB4NUYsIDB4MDIsIDB4NjQsIDB4ODEsIDB4RkIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEIsIDB4MDQsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4Q0MsIDB4NjAsIDB4MjYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTgsIDB4NjQsCisJIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4N0YsIDB4RjEsIDB4MjQsIDB4NjAsIDB4OUEsIDB4NjIsIDB4QTIsIDB4RDksIDB4MUUsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4Q0MsIDB4NjAsCisJIDB4NEQsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4QkUsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4Q0MsIDB4NjAsIDB4QUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4NjAsIDB4RUYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4Q0EsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QTcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTcsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4REMsIDB4RkIsIDB4RjIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QkMsCisJIDB4RjIsIDB4RkIsIDB4RjcsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsCisJIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4REEsIDB4RkUsIDB4QzEsIDB4RkUsIDB4MUEsIDB4NjAsIDB4NDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MUEsIDB4NjAsIDB4NkEsIDB4NjIsCisJIDB4QTIsIDB4RDksIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NjYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDYsIDB4NjQsIDB4QTIsIDB4REIsIDB4Q0IsIDB4NjAsCisJIDB4MjIsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MUEsIDB4NjAsIDB4NDAsIDB4NjEsIDB4NzUsIDB4NjAsIDB4MzAsIDB4NjUsIDB4QTEsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RTAsIDB4ODQsIDB4MDIsIDB4MDIsIDB4MDMsIDB4NjAsIDB4RTgsIDB4NjQsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MDQsIDB4NjUsIDB4NDQsIDB4QTEsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NzksIDB4RjMsIDB4N0EsIDB4RkIsIDB4MUYsIDB4NjAsCisJIDB4NTIsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RkYsIDB4NjAsIDB4REYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4QkYsIDB4RjEsCisJIDB4MUEsIDB4NjAsIDB4NkEsIDB4NjIsIDB4QTIsIDB4RDksIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NjYsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4RjcsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsCisJIDB4MTAsIDB4MjYsIDB4NjcsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QjUsIDB4RkIsIDB4QjYsIDB4RkIsIDB4QjcsIDB4RkIsIDB4MDAsIDB4NzUsIDB4MDAsIDB4NzIsCisJIDB4QkQsIDB4RjEsIDB4ODAsIDB4RjksIDB4NjQsIDB4NDQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4OTMsIDB4RTYsIDB4RjEsCisJIDB4ODYsIDB4RjksIDB4MjgsIDB4NjAsIDB4RDIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDIsCisJIDB4MDEsIDB4NjAsIDB4QjAsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4MDIsIDB4NjQsCisJIDB4NjAsIDB4NDEsIDB4MkQsIDB4NjAsIDB4MjgsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4QjUsIDB4NjUsIDB4NUMsIDB4Q0QsIDB4ODEsCisJIDB4ODAsIDB4QkYsIDB4MEUsIDB4MDMsIDB4ODAsIDB4QkYsIDB4QkQsIDB4REIsIDB4NjUsIDB4NDQsIDB4QzgsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDMsCisJIDB4NjAsIDB4NDUsIDB4Q0QsIDB4ODEsIDB4QTMsIDB4RDMsIDB4MDcsIDB4MDMsIDB4Q0QsIDB4ODEsIDB4ODAsIDB4QkYsIDB4MDEsIDB4MDMsIDB4ODAsIDB4QkMsCisJIDB4NjAsIDB4NDcsIDB4QkQsIDB4REIsIDB4MDAsIDB4NjUsIDB4NjQsIDB4NDEsIDB4MkQsIDB4NjAsIDB4MkEsIDB4NjMsIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4ODAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4NjAsIDB4NDUsIDB4NjAsIDB4NDcsIDB4ODAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsCisJIDB4NjAsIDB4NDUsIDB4QzksIDB4ODEsIDB4RkYsIDB4RkYsIDB4RjIsIDB4MDIsIDB4NjUsIDB4NDQsIDB4N0YsIDB4QjQsIDB4MDIsIDB4M0EsIDB4MDIsIDB4MDAsCisJIDB4MEEsIDB4NjQsIDB4MTUsIDB4MDAsIDB4MDQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTQsIDB4NjQsIDB4MTEsIDB4MDAsIDB4MEEsIDB4M0EsIDB4MDIsIDB4MDAsCisJIDB4MzIsIDB4NjQsIDB4MEQsIDB4MDAsIDB4MEIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MzcsIDB4NjQsIDB4MDksIDB4MDAsIDB4MTAsIDB4M0EsIDB4MDIsIDB4MDAsCisJIDB4NTAsIDB4NjQsIDB4MDUsIDB4MDAsIDB4MTYsIDB4M0EsIDB4MDIsIDB4MDAsIDB4NkUsIDB4NjQsIDB4MDEsIDB4MDAsIDB4MTQsIDB4NjQsIDB4N0MsIDB4RkIsCisJIDB4MjgsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MDAsIDB4NjAsCisJIDB4ODQsIDB4NjQsIDB4QTIsIDB4REIsIDB4Q0QsIDB4NjAsIDB4NDAsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MEQsIDB4MDMsCisJIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4RkYsIDB4NjAsIDB4N0YsIDB4NjEsIDB4QTEsIDB4ODQsCisJIDB4NUEsIDB4RDEsIDB4NEEsIDB4REIsIDB4QTEsIDB4ODQsIDB4NUEsIDB4REIsIDB4MDQsIDB4MDAsIDB4QkIsIDB4RkUsIDB4Q0IsIDB4NjAsIDB4MjIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjgsIDB4NjAsIDB4MkMsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MjIsIDB4NjUsCisJIDB4NjQsIDB4NDAsIDB4MDcsIDB4MzYsIDB4MDEsIDB4NjUsIDB4QTksIDB4RjMsIDB4NjYsIDB4NUMsIDB4NjAsIDB4NDYsIDB4MUYsIDB4NjMsIDB4RTMsIDB4ODMsCisJIDB4QjYsIDB4RjgsIDB4MDIsIDB4QTYsIDB4NjYsIDB4NDQsIDB4RkMsIDB4MUYsIDB4MjgsIDB4NjAsIDB4MkMsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MDcsIDB4M0EsIDB4MDQsIDB4MDAsIDB4QTksIDB4RjMsIDB4MDQsIDB4NjUsIDB4NjAsIDB4NDYsIDB4QjYsIDB4RjgsIDB4NjQsIDB4NDYsCisJIDB4QTksIDB4RjMsIDB4MzIsIDB4NDEsIDB4NjAsIDB4NDUsIDB4MDgsIDB4QjEsIDB4NjYsIDB4NDEsIDB4MTcsIDB4MDMsIDB4NjUsIDB4NDYsIDB4MjksIDB4NjAsCisJIDB4QTIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MDYsIDB4RjAsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4ODAsIDB4QkYsCisJIDB4QjAsIDB4ODQsIDB4MDYsIDB4RkEsIDB4NjYsIDB4NDMsIDB4MDIsIDB4QTMsIDB4NjMsIDB4NDYsIDB4MDYsIDB4RjAsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsCisJIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MzIsIDB4NDQsIDB4MTAsIDB4QkMsIDB4NDAsIDB4NTIsIDB4MUYsIDB4NjAsIDB4NTIsIDB4NjIsIDB4MDEsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MEYsIDB4NEUsIDB4RTcsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4MEYsIDB4NjAsCisJIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4RkYsIDB4NjAsIDB4RkIsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsCisJIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTIsIDB4REIsIDB4Q0IsIDB4NjAsIDB4MTEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MjQsIDB4NjAsCisJIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NjYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsCisJIDB4QkIsIDB4RkUsIDB4MjAsIDB4NDQsIDB4MDQsIDB4MjcsIDB4MTIsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MDIsIDB4MDAsIDB4REIsIDB4RkUsIDB4MTYsIDB4MDAsCisJIDB4MEYsIDB4NjAsIDB4Q0UsIDB4NjEsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4NjQsCisJIDB4QTEsIDB4REIsIDB4MDEsIDB4NjUsIDB4RTksIDB4NjAsIDB4NTgsIDB4NEUsIDB4N0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDEsIDB4NjQsIDB4OEMsIDB4RkIsCisJIDB4RkYsIDB4NjAsIDB4RUYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MDMsIDB4NjQsIDB4REMsIDB4RkIsIDB4RjIsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4RkUsIDB4QjQsIDB4RjIsIDB4RkIsIDB4QzEsIDB4RkUsIDB4MUUsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MTUsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4QkIsIDB4RkUsIDB4Q0YsIDB4NjAsIDB4RDYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NjAsCisJIDB4MkMsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MjIsIDB4NjUsIDB4QTksIDB4RjMsIDB4NjYsIDB4NUMsCisJIDB4NjAsIDB4NDYsIDB4MUYsIDB4NjMsIDB4RTMsIDB4ODMsIDB4QjYsIDB4RjgsIDB4MDIsIDB4QTYsIDB4NjYsIDB4NDQsIDB4RkMsIDB4MUYsIDB4NjQsIDB4NDYsCisJIDB4NzksIDB4RjEsIDB4QTksIDB4RjMsIDB4N0EsIDB4RjksIDB4MDIsIDB4QTQsIDB4RDgsIDB4RjMsIDB4NjAsIDB4NDUsIDB4NjYsIDB4NDEsIDB4NjUsIDB4NDYsCisJIDB4OEMsIDB4RkEsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDYsIDB4MDAsIDB4MDIsIDB4MzYsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MzYsIDB4MDIsIDB4MDAsCisJIDB4MDUsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MDEsIDB4MDAsIDB4MDEsIDB4NjQsIDB4NkYsIDB4RkEsIDB4NzksIDB4RjMsIDB4N0EsIDB4RjEsCisJIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsIDB4NjUsIDB4NDMsIDB4MDIsIDB4MDIsIDB4NzksIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4MEYsIDB4NjAsCisJIDB4QUUsIDB4NjUsIDB4RDgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjEsIDB4NDUsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MDIsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MDMsIDB4QTQsIDB4ODQsIDB4N0IsIDB4RkIsIDB4NkYsIDB4RjAsCisJIDB4NjAsIDB4NDcsIDB4OTAsIDB4ODQsIDB4NkYsIDB4RkEsIDB4NjAsIDB4NDcsIDB4NjAsIDB4NDUsIDB4ODAsIDB4NjQsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4RkMsIDB4MDMsIDB4QTQsIDB4ODQsIDB4NzAsIDB4RjAsIDB4NzAsIDB4RkEsIDB4MDAsIDB4NjEsIDB4RTgsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MDUsIDB4REQsIDB4ODEsIDB4RkIsIDB4MDEsIDB4RTEsIDB4ODEsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MEUsIDB4RkEsCisJIDB4NjYsIDB4NDMsIDB4MEMsIDB4RjQsIDB4QTksIDB4RjEsIDB4MDIsIDB4NjQsIDB4QzAsIDB4ODUsIDB4MEMsIDB4NjEsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MkEsCisJIDB4MTUsIDB4MDAsIDB4MjksIDB4NjAsIDB4QTIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjUsIDB4NDYsIDB4MDYsIDB4RjAsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4ODAsIDB4QkYsIDB4QjAsIDB4ODMsIDB4MDYsIDB4RkMsIDB4NjYsIDB4NDIsIDB4RkUsIDB4QTIsCisJIDB4NjIsIDB4NDYsIDB4MDYsIDB4RjAsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MUQsIDB4NjQsIDB4M0IsIDB4NDIsCisJIDB4NUEsIDB4REIsIDB4MEIsIDB4NjQsIDB4REMsIDB4RkIsIDB4RjIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4RjIsIDB4RkIsIDB4MDEsIDB4NjUsCisJIDB4RTksIDB4NjAsIDB4NTgsIDB4NEUsIDB4N0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTUsIDB4RjEsIDB4N0YsIDB4RjksIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEIsIDB4MDQsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4Q0UsIDB4NjAsIDB4NzYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0YsIDB4RjEsCisJIDB4MjQsIDB4NjAsIDB4OUEsIDB4NjIsIDB4QTIsIDB4RDksIDB4MUUsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MEYsIDB4NjAsCisJIDB4RUMsIDB4NjIsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4Q0UsIDB4NjAsIDB4OUEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NUEsIDB4REIsIDB4QkUsIDB4RkUsCisJIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MDEsIDB4NjQsIDB4OEMsIDB4RkIsIDB4RkYsIDB4NjAsIDB4REYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MUUsIDB4NjQsIDB4M0IsIDB4NDIsCisJIDB4NUEsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MDYsIDB4NjQsIDB4REMsIDB4RkIsCisJIDB4RjIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4RjIsIDB4RkIsIDB4RTUsIDB4RjEsIDB4N0YsIDB4RjksIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDEsIDB4NjQsIDB4OEMsIDB4RkIsIDB4RkYsIDB4NjAsIDB4REYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsCisJIDB4QTksIDB4RjEsIDB4NjYsIDB4NDUsIDB4NjQsIDB4NDYsIDB4NjYsIDB4NDMsIDB4MDIsIDB4QTMsIDB4NjMsIDB4NDYsIDB4MDIsIDB4NjQsIDB4MDYsIDB4RkEsCisJIDB4MDQsIDB4NjMsIDB4MDQsIDB4NjEsIDB4MDEsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDgsIDB4RkQsIDB4MUYsIDB4NjUsIDB4NDYsCisJIDB4MDEsIDB4NjUsIDB4RTksIDB4NjAsIDB4NTgsIDB4NEUsIDB4N0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUUsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MDAsIDB4NjQsIDB4NjgsIDB4RkIsIDB4NjksIDB4RkIsCisJIDB4QTksIDB4RjEsIDB4MEUsIDB4NjQsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDIsIDB4MDIsIDB4QTIsIDB4NjIsIDB4NDYsIDB4MDYsIDB4RjAsIDB4RkYsIDB4NjAsCisJIDB4RkMsIDB4NjQsIDB4QTAsIDB4ODQsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4REMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDQsIDB4QTgsIDB4MEYsIDB4NjAsCisJIDB4Q0UsIDB4NjQsIDB4MDcsIDB4MDMsIDB4QTAsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjMsCisJIDB4QTAsIDB4REQsIDB4MDEsIDB4NjQsIDB4REMsIDB4RkIsIDB4RjIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4RjIsIDB4RkIsIDB4MEYsIDB4NjAsCisJIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4Q0EsIDB4NjAsIDB4RkIsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjgsIDB4NjAsIDB4M0EsIDB4NjQsIDB4QTAsIDB4RDMsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDAsIDB4MDEsIDB4M0EsIDB4NDIsIDB4MDAsIDB4MTgsIDB4NjUsCisJIDB4MjIsIDB4NjEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QTUsIDB4RDAsIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsCisJIDB4MDQsIDB4NjUsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsIDB4MDUsIDB4MDMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsIDB4RjAsIDB4MDIsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4MDEsIDB4QTgsCisJIDB4RTAsIDB4ODUsIDB4MjcsIDB4MDIsIDB4QzcsIDB4ODMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4ODEsIDB4QTgsIDB4MEQsIDB4QTgsIDB4MjEsIDB4MDIsCisJIDB4MjAsIDB4MDIsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4MDAsIDB4QTgsIDB4NjAsIDB4QTgsIDB4MUIsIDB4MDIsIDB4QkQsIDB4RDMsIDB4MTksIDB4MDIsCisJIDB4MUQsIDB4QTgsIDB4QTMsIDB4RDEsIDB4MTYsIDB4MDIsIDB4RTMsIDB4RjksIDB4MDEsIDB4NjAsIDB4QjgsIDB4NjQsIDB4NjMsIDB4NDEsIDB4MEEsIDB4NjMsCisJIDB4NTksIDB4RDEsIDB4NTgsIDB4RDksIDB4RkQsIDB4MUYsIDB4NTksIDB4RDEsIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4NjQsIDB4NUUsCisJIDB4RDYsIDB4RkIsIDB4NTksIDB4RDEsIDB4MjgsIDB4NjAsIDB4MzYsIDB4NjQsIDB4QTAsIDB4RDksIDB4MjgsIDB4NjAsIDB4RDYsIDB4NjQsIDB4QTAsIDB4RDksCisJIDB4MjMsIDB4MDAsIDB4MjgsIDB4NjAsIDB4NDAsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RTMsIDB4RkIsIDB4NjAsIDB4NDAsIDB4MDUsIDB4M0EsIDB4MDMsIDB4MDAsCisJIDB4NjgsIDB4NjAsIDB4QkEsIDB4NjEsIDB4MTEsIDB4MDAsIDB4MDQsIDB4M0EsIDB4MDMsIDB4MDAsIDB4NjgsIDB4NjAsIDB4QUUsIDB4NjEsIDB4MEMsIDB4MDAsCisJIDB4MDMsIDB4M0EsIDB4MDMsIDB4MDAsIDB4NjgsIDB4NjAsIDB4QTIsIDB4NjEsIDB4MDcsIDB4MDAsIDB4MDIsIDB4M0EsIDB4MDMsIDB4MDAsIDB4NjgsIDB4NjAsCisJIDB4OTYsIDB4NjEsIDB4MDIsIDB4MDAsIDB4NjgsIDB4NjAsIDB4OEEsIDB4NjEsIDB4M0MsIDB4NjAsIDB4MDAsIDB4NjYsIDB4MDEsIDB4NjAsIDB4QjgsIDB4NjQsCisJIDB4MEEsIDB4NjMsIDB4NTksIDB4RDAsIDB4NTgsIDB4RDksIDB4RkQsIDB4MUYsIDB4MDEsIDB4NjAsIDB4QkUsIDB4NjEsIDB4RTQsIDB4RjMsIDB4MDAsIDB4NjYsCisJIDB4MDAsIDB4QTgsIDB4MDQsIDB4NjUsIDB4MDEsIDB4MDMsIDB4QTEsIDB4REIsIDB4MUYsIDB4NjAsIDB4MDgsIDB4NjMsIDB4NTUsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4MjAsIDB4N0YsIDB4QkQsIDB4REIsIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjEsIDB4N0YsIDB4QkQsIDB4REIsIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4MjIsIDB4N0YsIDB4QTMsIDB4REIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEIsIDB4MDQsCisJIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4NjAsIDB4QTIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjAsIDB4OUEsIDB4NjIsIDB4MUYsIDB4NjAsIDB4MDYsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MjAsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4NjAsIDB4QzcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsCisJIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QkUsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NDAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NjQsIDB4M0IsIDB4NDIsCisJIDB4NUEsIDB4REIsIDB4QkMsIDB4RjEsIDB4MUEsIDB4NjAsIDB4NkEsIDB4NjIsIDB4QTIsIDB4RDksIDB4NjAsIDB4RjUsIDB4RUIsIDB4RjEsIDB4MkYsIDB4RjgsCisJIDB4RUMsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUQsIDB4RjEsIDB4MzEsIDB4RjgsIDB4QkMsIDB4RjEsIDB4MTksIDB4RjgsIDB4RjgsIDB4NjAsIDB4ODAsIDB4NjQsCisJIDB4MEUsIDB4RkEsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4QTksIDB4RjEsIDB4MDcsIDB4RjgsIDB4MDAsIDB4NjAsIDB4RDAsIDB4NjMsIDB4MTksIDB4NjAsCisJIDB4ODQsIDB4NjQsIDB4QTMsIDB4REIsIDB4NDQsIDB4NjAsIDB4NDQsIDB4NjQsIDB4ODEsIDB4RkIsIDB4ODIsIDB4RkIsIDB4ODMsIDB4RkIsIDB4MzEsIDB4NDQsCisJIDB4RjksIDB4QjQsIDB4NDAsIDB4NTEsIDB4MDAsIDB4NjAsIDB4RDAsIDB4NjMsIDB4MDEsIDB4NjAsIDB4MTAsIDB4NjUsIDB4QTMsIDB4RDMsIDB4QTUsIDB4RDEsCisJIDB4MDQsIDB4QTQsIDB4QTMsIDB4REIsIDB4RDAsIDB4ODAsIDB4QTAsIDB4RDEsIDB4MEEsIDB4MDYsIDB4NDEsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4Q0MsIDB4NjAsIDB4NUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDQsIDB4NDcsCisJIDB4MjgsIDB4NjAsIDB4MkMsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDcsIDB4MEUsIDB4NjEsCisJIDB4NDEsIDB4RDMsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MTAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4RDMsIDB4MDIsIDB4NDIsIDB4NjQsCisJIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEIsIDB4MDQsCisJIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDAsIDB4NjAsIDB4MjIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RDEsIDB4N0YsIDB4RjksIDB4MjQsIDB4NjAsIDB4OUEsIDB4NjIsIDB4QTIsIDB4RDksCisJIDB4MUUsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4RDAsIDB4NjAsIDB4NDcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsCisJIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QkUsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NDAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MUEsIDB4NjAsIDB4NkEsIDB4NjIsIDB4MDcsIDB4NjAsIDB4RDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NjYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MjcsIDB4NDMsIDB4MDYsIDB4QTMsIDB4QkQsIDB4RDMsIDB4ODEsIDB4RkIsIDB4QkQsIDB4RDMsIDB4ODIsIDB4RkIsCisJIDB4QTMsIDB4RDMsIDB4ODMsIDB4RkIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsCisJIDB4MDEsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDAsIDB4NjAsIDB4NzksIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4QkMsIDB4RjEsIDB4MUEsIDB4NjAsIDB4NkEsIDB4NjIsIDB4QTIsIDB4RDksIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDEsCisJIDB4RkUsIDB4NjAsIDB4RkYsIDB4NjEsIDB4QTEsIDB4ODQsIDB4NUEsIDB4RDEsIDB4NEEsIDB4REIsIDB4QTEsIDB4ODQsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsCisJIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDUsIDB4MDMsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4NjAsIDB4RjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsCisJIDB4NUYsIDB4RjUsIDB4RUIsIDB4RjEsIDB4MkYsIDB4RjgsIDB4RUMsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUQsIDB4RjEsIDB4MzEsIDB4RjgsIDB4QkMsIDB4RjEsCisJIDB4MTksIDB4RjgsIDB4ODAsIDB4N0UsIDB4RjgsIDB4N0YsIDB4MEUsIDB4RkEsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4QTksIDB4RjEsIDB4MDcsIDB4RjgsCisJIDB4MkIsIDB4RkEsIDB4QjAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MjcsIDB4NDMsIDB4MDYsIDB4QTMsIDB4QkQsIDB4RDEsIDB4MkMsIDB4RjgsIDB4MzIsIDB4RjgsCisJIDB4QkQsIDB4RDEsIDB4MkQsIDB4RjgsIDB4MzMsIDB4RjgsIDB4QTMsIDB4RDEsIDB4MkUsIDB4RjgsIDB4MzQsIDB4RjgsIDB4MDYsIDB4NjMsIDB4M0YsIDB4RkMsCisJIDB4MUYsIDB4NjAsIDB4NTQsIDB4NjEsIDB4REMsIDB4RjMsIDB4QTEsIDB4RDMsIDB4MDMsIDB4QTgsIDB4QUMsIDB4ODMsIDB4MEYsIDB4MDIsIDB4MEUsIDB4MDMsCisJIDB4MUYsIDB4NjAsIDB4NTYsIDB4NjEsIDB4QTEsIDB4RDEsIDB4NjYsIDB4NDUsIDB4MDAsIDB4RjQsIDB4MDksIDB4RkMsIDB4MDEsIDB4NjQsIDB4MEEsIDB4RkEsCisJIDB4MEIsIDB4RjgsIDB4MUYsIDB4NjAsIDB4NTQsIDB4NjEsIDB4MDAsIDB4NjQsIDB4QTEsIDB4REIsIDB4MjgsIDB4MDAsIDB4MjgsIDB4NjAsIDB4MkUsIDB4NjQsCisJIDB4QTAsIDB4RDMsIDB4NjYsIDB4NDUsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MTYsIDB4MDAsIDB4MDIsIDB4MzYsIDB4QzcsIDB4MDAsCisJIDB4MDMsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MDQsIDB4MzYsIDB4MTAsIDB4MDAsIDB4MDUsIDB4MzYsIDB4QzEsIDB4MDAsIDB4MDYsIDB4MzYsIDB4MDEsIDB4MDAsCisJIDB4MEIsIDB4MDAsIDB4ODAsIDB4NjQsIDB4MDksIDB4RkEsIDB4MDEsIDB4NjMsIDB4MEEsIDB4RkMsIDB4MDAsIDB4NjQsIDB4MEIsIDB4RkEsIDB4MkQsIDB4NjAsCisJIDB4NTQsIDB4NjIsIDB4MDMsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEEsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MDksIDB4RkEsIDB4MDEsIDB4NjMsIDB4MEEsIDB4RkMsCisJIDB4MDAsIDB4NjQsIDB4MEIsIDB4RkEsIDB4MkQsIDB4NjAsIDB4NTQsIDB4NjIsIDB4MDEsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsCisJIDB4MjQsIDB4NjAsIDB4MjgsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjUsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4MDAsIDB4NjYsIDB4REMsIDB4RjMsIDB4NDYsIDB4NDYsIDB4RkQsIDB4QTAsIDB4QzEsIDB4RkUsIDB4MDIsIDB4MDIsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjQsIDB4NjksIDB4RkIsIDB4NDMsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MUEsIDB4NjAsIDB4NDQsIDB4NjIsCisJIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjQsIDB4QTQsIDB4QTIsIDB4REIsIDB4MUEsIDB4NjAsIDB4NDQsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MUEsIDB4NjAsCisJIDB4NkEsIDB4NjIsIDB4QTIsIDB4RDksIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NjYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MEMsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4RDEsIDB4NjAsIDB4MkUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4NTYsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NjYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NjksIDB4RkIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDYsCisJIDB4MDAsIDB4RjQsIDB4MDksIDB4RjIsIDB4MEEsIDB4RjIsIDB4MDAsIDB4QTgsIDB4MEIsIDB4RjIsIDB4MDIsIDB4QTgsIDB4MTYsIDB4MDIsIDB4MDAsIDB4QTgsCisJIDB4MUEsIDB4MDIsIDB4MTksIDB4MDIsIDB4MjYsIDB4NDYsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MkMsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDMsIDB4MDAsIDB4RDMsIDB4NjAsCisJIDB4NDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDksIDB4NjAsIDB4NjgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDksIDB4RjIsIDB4MEEsIDB4RjIsIDB4ODAsIDB4QTgsCisJIDB4MEIsIDB4RjIsIDB4MDIsIDB4QTgsIDB4RTQsIDB4MDMsIDB4NDQsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEIsIDB4RjIsIDB4MjYsIDB4NDYsCisJIDB4NDAsIDB4NTksIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsIDB4MkYsIDB4RjIsIDB4QTEsIDB4REIsIDB4MzAsIDB4RjIsIDB4NDEsIDB4NTgsIDB4NTksIDB4REIsCisJIDB4MzEsIDB4RjIsIDB4NTksIDB4REIsIDB4MjYsIDB4NDYsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MkMsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MDMsIDB4NjUsIDB4RTksIDB4NjAsIDB4NTgsIDB4NEUsIDB4NEMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4REMsIDB4NjAsIDB4QUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4RkIsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4MDAsIDB4NjQsIDB4NjksIDB4RkIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjAsIDB4NDAsIDB4MDgsIDB4MkEsCisJIDB4MDMsIDB4MDAsIDB4Q0YsIDB4NjAsIDB4RjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDcsIDB4NjAsIDB4REQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjMsCisJIDB4MDksIDB4RkMsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MUEsIDB4MDAsIDB4MjgsIDB4NjAsIDB4MkMsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MEIsIDB4MzYsIDB4MDMsIDB4MDAsIDB4RDAsIDB4NjAsIDB4RUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MkQsIDB4NjAsIDB4NTYsIDB4NjIsIDB4MEIsIDB4NjQsIDB4QTIsIDB4REIsIDB4MkQsIDB4NjAsIDB4NTQsIDB4NjIsIDB4MDIsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4QTksIDB4RjEsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MjIsIDB4NjQsIDB4MzYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MDEsIDB4NjQsIDB4MEEsIDB4RkEsCisJIDB4MDAsIDB4NjQsIDB4MEIsIDB4RkEsIDB4MDEsIDB4NjQsIDB4NjksIDB4RkIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4MjgsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjUsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDAsIDB4NjYsIDB4REMsIDB4RjMsIDB4NDYsIDB4NDYsIDB4RkQsIDB4QTAsIDB4QzEsIDB4RkUsCisJIDB4MDIsIDB4MDIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NjYsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MEMsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4RDEsIDB4NjAsIDB4RUYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsCisJIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4M0IsIDB4MDMsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NjYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NjksIDB4RkIsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MDksIDB4RjIsIDB4MEEsIDB4RjIsCisJIDB4MDEsIDB4QTgsIDB4MEIsIDB4RjIsIDB4MDIsIDB4QTgsIDB4MDQsIDB4MDIsIDB4MDAsIDB4QTgsIDB4MDIsIDB4MDIsIDB4MDEsIDB4MDIsIDB4MzEsIDB4MDAsCisJIDB4RDIsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4RjIsIDB4MjYsIDB4NDYsIDB4NDAsIDB4NTksIDB4MDIsIDB4NjAsCisJIDB4MDAsIDB4NjEsIDB4MkYsIDB4RjIsIDB4QTEsIDB4REIsIDB4MzAsIDB4RjIsIDB4NDEsIDB4NTgsIDB4NTksIDB4REIsIDB4MzEsIDB4RjIsIDB4NTksIDB4REIsCisJIDB4MjYsIDB4NDYsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MkMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MDMsIDB4NjUsIDB4RTksIDB4NjAsIDB4NTgsIDB4NEUsIDB4NEMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4REMsIDB4NjAsCisJIDB4QUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDIsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NjksIDB4RkIsCisJIDB4MjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDMsIDB4MDAsIDB4Q0YsIDB4NjAsIDB4RjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDcsIDB4NjAsIDB4REQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MkEsIDB4RjIsIDB4MkYsIDB4RjAsIDB4QjQsIDB4ODQsIDB4MkEsIDB4RkEsCisJIDB4MkMsIDB4RjgsIDB4MzIsIDB4RjgsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzMsIDB4RkEsIDB4MzEsIDB4RjIsIDB4MkUsIDB4RkEsIDB4MzQsIDB4RkEsCisJIDB4RUIsIDB4RjMsIDB4MkYsIDB4RkEsIDB4RUMsIDB4RjMsIDB4MzAsIDB4RkEsIDB4RUQsIDB4RjMsIDB4MzEsIDB4RkEsIDB4Q0MsIDB4RjEsIDB4MTksIDB4RjgsCisJIDB4MUMsIDB4RjAsIDB4MTMsIDB4RjgsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjQsIDB4MEEsIDB4RkEsIDB4MDAsIDB4NjQsCisJIDB4MEIsIDB4RkEsIDB4MDEsIDB4NjMsIDB4NjksIDB4RkQsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjQsIDB4NjAsCisJIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4MjgsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDAsIDB4NjYsIDB4REMsIDB4RjMsIDB4NDYsIDB4NDYsIDB4RkQsIDB4QTAsIDB4QzEsIDB4RkUsIDB4MDIsIDB4MDIsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NjYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MEMsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4RDIsIDB4NjAsIDB4OEUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4NTEsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NjYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NjksIDB4RkIsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MDksIDB4RjIsIDB4MEEsIDB4RjIsIDB4MDEsIDB4QTgsCisJIDB4MEIsIDB4RjIsIDB4MDQsIDB4QTgsIDB4MUEsIDB4MDIsIDB4MDAsIDB4QTgsIDB4MTgsIDB4MDIsIDB4MTcsIDB4MDIsIDB4RDIsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4RjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MkMsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDMsIDB4MDAsIDB4RDMsIDB4NjAsCisJIDB4NDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDksIDB4NjAsIDB4NjgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDIsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RjYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEIsIDB4RjIsIDB4MjYsIDB4NDYsIDB4NDAsIDB4NTksIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsIDB4MkYsIDB4RjIsIDB4QTEsIDB4REIsCisJIDB4MzAsIDB4RjIsIDB4NDEsIDB4NTgsIDB4NTksIDB4REIsIDB4MzEsIDB4RjIsIDB4NTksIDB4REIsIDB4MjYsIDB4NDYsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjQsCisJIDB4NDAsIDB4NEIsIDB4MkMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MDMsIDB4NjUsCisJIDB4RTksIDB4NjAsIDB4NTgsIDB4NEUsIDB4NEMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4REMsIDB4NjAsIDB4QUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDIsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4RjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NjksIDB4RkIsIDB4MjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4Q0YsIDB4NjAsIDB4RjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDcsIDB4NjAsIDB4REQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkQsIDB4NjAsIDB4NTYsIDB4NjIsCisJIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MEIsIDB4M0EsIDB4MDcsIDB4MDAsIDB4MjgsIDB4NjAsIDB4MkMsIDB4NjIsIDB4MEIsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MkQsIDB4NjAsIDB4NTYsIDB4NjIsIDB4QTIsIDB4REYsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NjAsIDB4MkMsIDB4NjIsCisJIDB4QTIsIDB4RDMsIDB4NjEsIDB4NDMsIDB4QTUsIDB4RDIsIDB4NjAsIDB4NDAsIDB4MEIsIDB4MkEsIDB4MzAsIDB4MDAsIDB4ODUsIDB4M0EsIDB4MzAsIDB4MDAsCisJIDB4NjAsIDB4NDEsIDB4NjUsIDB4NDQsIDB4MEEsIDB4QTQsIDB4QTAsIDB4RDAsIDB4MkQsIDB4NjAsIDB4NTIsIDB4NjIsIDB4NjQsIDB4NDAsIDB4MTgsIDB4MjYsCisJIDB4MDYsIDB4MDAsIDB4QTIsIDB4REYsIDB4MjgsIDB4NjAsIDB4MkMsIDB4NjIsIDB4MDEsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4NjEsIDB4NDQsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4MDIsIDB4QTQsIDB4MkUsIDB4NjAsIDB4NjIsIDB4NjEsIDB4QTEsIDB4RDEsCisJIDB4REYsIDB4ODMsIDB4QzAsIDB4ODQsIDB4QTEsIDB4REIsIDB4RDAsIDB4ODEsIDB4Q0QsIDB4ODQsIDB4NEMsIDB4OTEsIDB4NjAsIDB4NDMsIDB4NjAsIDB4RkUsCisJIDB4QTUsIDB4RDIsIDB4REUsIDB4ODUsIDB4N0YsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4NUQsIDB4OTMsIDB4QTMsIDB4REIsCisJIDB4NUQsIDB4OTMsIDB4QTUsIDB4RDIsIDB4RjYsIDB4MUYsIDB4NUQsIDB4OTMsIDB4MjAsIDB4RkUsIDB4REYsIDB4ODMsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MkQsIDB4NjAsIDB4NTIsIDB4NjIsIDB4QTIsIDB4REYsIDB4MjgsIDB4NjAsIDB4MkMsIDB4NjIsIDB4MDEsIDB4NjQsIDB4QTIsIDB4REIsIDB4RjYsIDB4MDEsCisJIDB4NDUsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MkUsIDB4NjAsIDB4RUEsIDB4N0MsIDB4MkUsIDB4NjAsIDB4REUsIDB4NjMsIDB4QTMsIDB4RDksCisJIDB4NjQsIDB4NDEsIDB4MjksIDB4NjAsIDB4QTQsIDB4NjMsIDB4QkQsIDB4RDMsIDB4MDAsIDB4N0MsIDB4MDMsIDB4MUIsIDB4MjcsIDB4NDMsIDB4MTAsIDB4QTMsCisJIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NUYsIDB4QTEsIDB4REIsIDB4NjUsIDB4NDQsIDB4QkQsIDB4RDEsIDB4QzgsIDB4ODQsCisJIDB4NTksIDB4RDgsIDB4RkMsIDB4MDUsIDB4MjcsIDB4NDEsIDB4MTAsIDB4QTEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4QzEsIDB4ODEsIDB4MDEsIDB4MjYsCisJIDB4REQsIDB4ODEsIDB4NDEsIDB4NEMsIDB4NTksIDB4RDEsIDB4N0MsIDB4NDQsIDB4QjAsIDB4ODQsIDB4NTksIDB4RDEsIDB4NTksIDB4RDEsIDB4QjAsIDB4ODQsCisJIDB4QjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4NjcsIDB4NDQsIDB4NUQsIDB4MDAsIDB4MkQsIDB4NjAsIDB4RTYsIDB4NjMsIDB4REQsIDB4NjAsCisJIDB4MTgsIDB4NjQsIDB4QkQsIDB4REEsIDB4NTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QkQsIDB4REEsIDB4MDEsIDB4NjAsIDB4RjIsIDB4NjQsIDB4QkQsIDB4REEsCisJIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4QkQsIDB4REEsIDB4MkMsIDB4NDEsIDB4NTksIDB4RDMsIDB4NTAsIDB4NjAsIDB4MDAsIDB4N0MsIDB4NjAsIDB4NDAsCisJIDB4MDIsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MEUsIDB4MDAsIDB4MDQsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDIsIDB4NjAsCisJIDB4RjIsIDB4NjQsIDB4MDksIDB4MDAsIDB4MTAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDQsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MkEsCisJIDB4MDQsIDB4MDAsIDB4MDUsIDB4NjAsIDB4RjIsIDB4NjQsIDB4QkQsIDB4RDksIDB4QkQsIDB4REIsIDB4MDEsIDB4NjQsIDB4QkQsIDB4REIsIDB4NTksIDB4RDMsCisJIDB4NTAsIDB4NjAsIDB4MDAsIDB4N0MsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MEUsIDB4MDAsCisJIDB4MDQsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDIsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MDksIDB4MDAsIDB4MTAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDQsIDB4NjAsCisJIDB4RjIsIDB4NjQsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDUsIDB4NjAsIDB4RjIsIDB4NjQsIDB4QkQsIDB4RDksIDB4QkQsIDB4REIsCisJIDB4MDEsIDB4NjQsIDB4QkQsIDB4REIsIDB4NTksIDB4RDMsIDB4NTAsIDB4NjAsIDB4MDAsIDB4N0MsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4MDAsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MDksIDB4MDAsIDB4MDIsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MDQsIDB4MDAsCisJIDB4MDQsIDB4MkEsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjAsIDB4RjIsIDB4NjQsIDB4QkQsIDB4RDksIDB4QkQsIDB4REIsIDB4NTksIDB4RDMsIDB4QkQsIDB4REEsCisJIDB4MkQsIDB4NjAsIDB4RTYsIDB4NjQsIDB4MkUsIDB4NjAsIDB4RTQsIDB4NjIsIDB4QTIsIDB4REIsIDB4NjAsIDB4RjUsIDB4MDAsIDB4NjQsIDB4MkIsIDB4RkEsCisJIDB4MDAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MjcsIDB4NDMsIDB4MDYsIDB4QTMsIDB4QkQsIDB4RDEsIDB4MkMsIDB4RjgsIDB4MzIsIDB4RjgsIDB4QkQsIDB4RDEsCisJIDB4MkQsIDB4RjgsIDB4MzMsIDB4RjgsIDB4QTMsIDB4RDEsIDB4MkUsIDB4RjgsIDB4MzQsIDB4RjgsIDB4MDAsIDB4RjQsIDB4MDEsIDB4NjMsIDB4MzIsIDB4NDAsCisJIDB4MDgsIDB4MjYsIDB4MTAsIDB4QkIsIDB4MjgsIDB4NjAsIDB4MkMsIDB4NjIsIDB4QTIsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4RkUsIDB4MjYsCisJIDB4MTAsIDB4QkIsIDB4MDksIDB4RkMsIDB4MjcsIDB4NDIsIDB4MEMsIDB4QTIsIDB4MjgsIDB4NjAsIDB4MDIsIDB4NjMsIDB4QTIsIDB4RDMsIDB4QTMsIDB4RDMsCisJIDB4MDAsIDB4QkQsIDB4MDEsIDB4NjMsIDB4QUMsIDB4ODEsIDB4MDksIDB4MDMsIDB4MDgsIDB4MDMsIDB4QjAsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4QjgsIDB4MDEsIDB4NjMsIDB4MDEsIDB4MDMsIDB4NjAsIDB4NDMsIDB4MUEsIDB4NjAsIDB4M0UsIDB4NjQsIDB4QTAsIDB4REQsCisJIDB4MTIsIDB4NjEsIDB4NTksIDB4REMsIDB4MjgsIDB4NjAsIDB4MkMsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4NjAsIDB4RkYsIDB4N0MsIDB4NjAsIDB4NDAsCisJIDB4MEIsIDB4MkEsIDB4MDIsIDB4MDAsIDB4MkQsIDB4NjAsIDB4MzIsIDB4N0MsIDB4MkUsIDB4NjAsIDB4RTYsIDB4NjIsIDB4QTIsIDB4RDksIDB4MkUsIDB4NjAsCisJIDB4REUsIDB4NjQsIDB4NDAsIDB4NDgsIDB4RDksIDB4ODEsIDB4RkYsIDB4NjAsIDB4RjIsIDB4NjQsIDB4RTgsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RTgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4RjUsIDB4M0YsIDB4RkMsIDB4REIsIDB4ODMsIDB4MkUsIDB4NjAsIDB4MDgsIDB4NjIsIDB4QTIsIDB4REQsIDB4MDAsIDB4N0MsCisJIDB4NUEsIDB4RDksIDB4NjMsIDB4NDEsIDB4MkUsIDB4NjAsIDB4MEMsIDB4NjMsIDB4MTIsIDB4NjUsIDB4MDAsIDB4RjQsIDB4Q0QsIDB4ODQsIDB4NEMsIDB4OTEsCisJIDB4NjAsIDB4NDMsIDB4NjAsIDB4RkUsIDB4QTUsIDB4RDIsIDB4REUsIDB4ODUsIDB4N0YsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsCisJIDB4NUQsIDB4OTMsIDB4QTMsIDB4REIsIDB4NUQsIDB4OTMsIDB4QTUsIDB4RDIsIDB4RjYsIDB4MUYsIDB4NUQsIDB4OTMsIDB4MjAsIDB4RkUsIDB4REYsIDB4ODMsCisJIDB4NjAsIDB4RjUsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4MjgsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4QzEsIDB4RkUsIDB4MDYsIDB4NjQsCisJIDB4NjksIDB4RkIsIDB4NDYsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NjYsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MDAsIDB4NjAsCisJIDB4MUMsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDQsIDB4NjAsIDB4NjgsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4M0EsIDB4MDMsCisJIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NjYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDYsCisJIDB4MDAsIDB4RjQsIDB4MEEsIDB4RjIsIDB4MDAsIDB4NjMsIDB4MDAsIDB4QTgsIDB4NjksIDB4RkQsIDB4NUEsIDB4MDMsIDB4MEEsIDB4RjIsIDB4MjYsIDB4NDYsCisJIDB4NDAsIDB4NTksIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsIDB4MkYsIDB4RjIsIDB4QTEsIDB4REIsIDB4MzAsIDB4RjIsIDB4NDEsIDB4NTgsIDB4NTksIDB4REIsCisJIDB4MzEsIDB4RjIsIDB4NTksIDB4REIsIDB4MjYsIDB4NDYsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MkMsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MDUsIDB4NjUsIDB4RTksIDB4NjAsIDB4NTgsIDB4NEUsIDB4NEMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4REMsIDB4NjAsIDB4QUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDcsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4Q0YsIDB4NjAsCisJIDB4RjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MjEsIDB4MDMsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NjYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MkMsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MDAsIDB4NjQsIDB4NjksIDB4RkIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NDksIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4RDAsIDB4NjAsIDB4OTQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4NjAsIDB4RkIsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjQsIDB4NjksIDB4RkIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NEEsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4Q0YsIDB4NjAsIDB4RjIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NDgsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MDksIDB4RjAsIDB4MkUsIDB4NjAsIDB4NjQsIDB4NjMsIDB4MTAsIDB4NjQsIDB4QkQsIDB4REIsCisJIDB4QkQsIDB4RDksIDB4MEEsIDB4RjAsIDB4QkQsIDB4RDksIDB4MEIsIDB4RjAsIDB4QkQsIDB4RDksIDB4MEMsIDB4RjIsIDB4QkQsIDB4REIsIDB4NjAsIDB4NDcsCisJIDB4RkYsIDB4QjQsIDB4MEEsIDB4QTUsIDB4MkUsIDB4NjAsIDB4NjIsIDB4NjEsIDB4NjUsIDB4NUMsIDB4QTEsIDB4RDksIDB4NjAsIDB4NDEsIDB4MUEsIDB4NjUsCisJIDB4Q0QsIDB4ODQsIDB4NEMsIDB4OTEsIDB4NjAsIDB4NDMsIDB4NjAsIDB4RkUsIDB4QTUsIDB4RDIsIDB4REUsIDB4ODUsIDB4N0YsIDB4MjYsIDB4MDIsIDB4MDAsCisJIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4NUQsIDB4OTMsIDB4QTMsIDB4REIsIDB4NUQsIDB4OTMsIDB4QTUsIDB4RDIsIDB4RjYsIDB4MUYsIDB4NUQsIDB4OTMsCisJIDB4MjAsIDB4RkUsIDB4REYsIDB4ODMsIDB4RDMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4MDcsIDB4QjQsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsIDB4NjEsIDB4NDQsIDB4OTYsIDB4RkIsCisJIDB4MjcsIDB4NDUsIDB4MDIsIDB4NjIsIDB4NDYsIDB4RDMsIDB4NUEsIDB4RDEsIDB4NjAsIDB4NDcsIDB4NTYsIDB4RkIsIDB4NjQsIDB4NDcsIDB4NTUsIDB4RkIsCisJIDB4MDAsIDB4NjQsIDB4NUMsIDB4RkIsIDB4MEMsIDB4NjIsIDB4NDYsIDB4RDMsIDB4ODAsIDB4RkIsIDB4MEIsIDB4RjAsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjQsCisJIDB4QTAsIDB4ODQsIDB4ODUsIDB4RkIsIDB4MjYsIDB4NDYsIDB4MzIsIDB4RjAsIDB4ODEsIDB4RjksIDB4MzMsIDB4RjAsIDB4MEUsIDB4NjMsIDB4QzcsIDB4ODEsCisJIDB4ODIsIDB4RjksIDB4MzQsIDB4RjAsIDB4ODMsIDB4RjksIDB4NTksIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4MDEsIDB4MkEsIDB4QzgsIDB4ODQsCisJIDB4NjAsIDB4NDMsIDB4MkQsIDB4NjAsIDB4NzgsIDB4NjQsIDB4NTgsIDB4RDksIDB4NTksIDB4RDEsIDB4NTgsIDB4RDksIDB4RkQsIDB4MUYsIDB4MjgsIDB4NjAsCisJIDB4MkMsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NTksIDB4RDMsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MjIsIDB4NjQsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsCisJIDB4NTAsIDB4OTQsIDB4QTksIDB4RjEsIDB4RkYsIDB4RkYsIDB4NDQsIDB4NDcsIDB4QTcsIDB4NDYsIDB4MzYsIDB4RkEsIDB4QjcsIDB4RkMsIDB4QTcsIDB4NDYsCisJIDB4MUEsIDB4NjAsIDB4M0UsIDB4NjIsIDB4QTIsIDB4RDMsIDB4ODcsIDB4RkIsIDB4MzEsIDB4RjIsIDB4MUMsIDB4NjAsIDB4QkEsIDB4NjUsIDB4NjAsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsCisJIDB4NjEsIDB4NDYsIDB4MzEsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MzAsIDB4RjAsCisJIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MkYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4QTksIDB4RjMsIDB4MDgsIDB4RkUsCisJIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4QTksIDB4RjEsIDB4RkYsIDB4RkYsIDB4RDMsIDB4ODAsIDB4MzEsIDB4RjIsIDB4MjcsIDB4MDIsIDB4NjYsIDB4NDEsCisJIDB4MUMsIDB4NjAsIDB4QkEsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4QTksIDB4RjEsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjQsIDB4NDMsCisJIDB4MTEsIDB4MTgsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MUIsIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjAsCisJIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NjUsIDB4NDMsIDB4ODAsIDB4RjAsIDB4MDEsIDB4RkEsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsCisJIDB4ODAsIDB4RjgsIDB4MEIsIDB4MDAsIDB4NjQsIDB4NDYsIDB4NjIsIDB4NDMsIDB4MDAsIDB4RjIsIDB4QTMsIDB4REIsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjAsCisJIDB4ODEsIDB4RkMsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4NDMsIDB4NDcsIDB4MDAsIDB4RjQsCisJIDB4MTgsIDB4NjUsIDB4MEMsIDB4NjEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QTUsIDB4RDAsIDB4REEsIDB4ODUsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsCisJIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsIDB4MDUsIDB4MDMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsIDB4RjQsIDB4MDIsCisJIDB4MDIsIDB4NjAsIDB4MDIsIDB4NjEsIDB4QTEsIDB4RDMsIDB4MDAsIDB4NjUsIDB4NjAsIDB4NDMsIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4N0YsIDB4QjQsCisJIDB4MDIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjQsIDB4MTUsIDB4MDAsIDB4MDQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjQsIDB4MTEsIDB4MDAsCisJIDB4MEEsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjQsIDB4MEQsIDB4MDAsIDB4MEIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjQsIDB4MDksIDB4MDAsCisJIDB4MTAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTAsIDB4NjQsIDB4MDUsIDB4MDAsIDB4MTYsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MjAsIDB4NjQsIDB4MDEsIDB4MDAsCisJIDB4MDAsIDB4NjQsIDB4Q0YsIDB4ODMsIDB4QjQsIDB4ODUsIDB4RTEsIDB4MDIsIDB4NjUsIDB4NDQsIDB4N0EsIDB4RkIsIDB4MDIsIDB4NjAsIDB4MDIsIDB4NjEsCisJIDB4QTEsIDB4RDMsIDB4MDAsIDB4NjUsIDB4NjAsIDB4NDMsIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4ODAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsCisJIDB4NjAsIDB4NDUsIDB4Q0YsIDB4ODMsIDB4NjUsIDB4NDQsIDB4RjcsIDB4MDIsIDB4N0YsIDB4QjQsIDB4MDIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEEsIDB4NjQsCisJIDB4MTUsIDB4MDAsIDB4MDQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTQsIDB4NjQsIDB4MTEsIDB4MDAsIDB4MEEsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MzIsIDB4NjQsCisJIDB4MEQsIDB4MDAsIDB4MEIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MzcsIDB4NjQsIDB4MDksIDB4MDAsIDB4MTAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4NTAsIDB4NjQsCisJIDB4MDUsIDB4MDAsIDB4MTYsIDB4M0EsIDB4MDIsIDB4MDAsIDB4NkUsIDB4NjQsIDB4MDEsIDB4MDAsIDB4MTQsIDB4NjQsIDB4N0MsIDB4RkIsIDB4MjcsIDB4NDQsCisJIDB4RDgsIDB4RjMsIDB4NjAsIDB4NDUsIDB4NjYsIDB4NDEsIDB4NjUsIDB4NDYsIDB4OEMsIDB4RkEsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDYsIDB4MDAsCisJIDB4MDIsIDB4MzYsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MDUsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MDEsIDB4MDAsCisJIDB4MDEsIDB4NjQsIDB4NkYsIDB4RkEsIDB4NzksIDB4RjMsIDB4N0EsIDB4RjEsIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsIDB4NjUsIDB4NDMsIDB4MDIsIDB4MDIsCisJIDB4NzksIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4MEYsIDB4NjAsIDB4QUUsIDB4NjUsIDB4RDgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDMsIDB4NjEsIDB4NDUsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDIsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4RkMsIDB4MDMsIDB4QTQsIDB4ODQsIDB4N0IsIDB4RkIsIDB4NkYsIDB4RjAsIDB4NjAsIDB4NDcsIDB4OTAsIDB4ODQsIDB4NkYsIDB4RkEsIDB4NjAsIDB4NDcsCisJIDB4NjAsIDB4NDUsIDB4ODAsIDB4NjQsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MDMsIDB4QTQsIDB4ODQsIDB4NzAsIDB4RjAsCisJIDB4NzAsIDB4RkEsIDB4MDAsIDB4NjEsIDB4RTgsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDUsIDB4REQsIDB4ODEsIDB4RkIsIDB4MDEsIDB4RTEsIDB4ODEsCisJIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MEUsIDB4RkEsIDB4NjYsIDB4NDMsIDB4MEMsIDB4RjQsIDB4MkQsIDB4NjAsIDB4RDIsIDB4NjIsCisJIDB4QTIsIDB4RDMsIDB4MkQsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NjAsIDB4NDcsIDB4MjgsIDB4NjAsIDB4MkMsIDB4NjIsIDB4QTIsIDB4RDEsCisJIDB4QjAsIDB4ODQsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MjIsIDB4NjQsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4NTAsIDB4OTQsIDB4QTcsIDB4NDYsCisJIDB4MzYsIDB4RkEsIDB4QjcsIDB4RkMsIDB4QTcsIDB4NDYsIDB4ODAsIDB4NjAsIDB4MDMsIDB4NjUsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDMsIDB4NjUsCisJIDB4QTcsIDB4NDYsIDB4MDYsIDB4RjAsIDB4N0YsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QjQsIDB4ODQsIDB4MDYsIDB4RkEsIDB4QjcsIDB4RkMsCisJIDB4QTcsIDB4NDYsIDB4MjYsIDB4NDYsIDB4MkYsIDB4RjAsIDB4MzAsIDB4RjAsIDB4NjQsIDB4NDMsIDB4MzEsIDB4RjIsIDB4MjcsIDB4NDYsIDB4MDMsIDB4RkMsCisJIDB4MDQsIDB4RjgsIDB4MDUsIDB4RkEsIDB4MjYsIDB4NDYsIDB4Q0YsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MkMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsCisJIDB4NDYsIDB4NDYsIDB4MDEsIDB4NjQsIDB4OEMsIDB4RkIsIDB4MjgsIDB4NjAsIDB4MzgsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MjAsIDB4NDEsIDB4MDAsIDB4QkMsCisJIDB4MjAsIDB4QjksIDB4MDEsIDB4MDMsIDB4NDEsIDB4NDAsIDB4MUYsIDB4NjAsIDB4NTIsIDB4NjEsIDB4MDAsIDB4NjQsIDB4QTEsIDB4REIsIDB4MDQsIDB4NjQsCisJIDB4QzEsIDB4RkUsIDB4REMsIDB4RkIsIDB4RjIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4RjIsIDB4RkIsIDB4RjcsIDB4NjAsIDB4RkYsIDB4NjUsCisJIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDEsIDB4NjUsIDB4RTksIDB4NjAsIDB4NTgsIDB4NEUsIDB4N0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsCisJIDB4RDgsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MEMsIDB4NjQsCisJIDB4NjksIDB4RkIsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MzEsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDYsIDB4NjAsIDB4QzQsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MEUsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsCisJIDB4MTAsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MzEsIDB4NjAsIDB4MkMsIDB4NjEsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MUIsCisJIDB4REMsIDB4NjAsIDB4RDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4REMsIDB4NjAsIDB4RDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDcsIDB4NjAsIDB4NjcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4RjgsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4QTksIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QTQsIDB4NjAsIDB4NDMsIDB4NjYsIDB4NDEsIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsCisJIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsIDB4MUMsIDB4NjAsIDB4QkEsIDB4NjUsIDB4NjAsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RjgsIDB4QTksIDB4RjMsIDB4NjMsIDB4NDUsCisJIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsIDB4RkEsIDB4MDQsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsCisJIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4NEIsIDB4NjQsIDB4M0IsIDB4NDIsCisJIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDEsIDB4NjAsIDB4MkUsIDB4NjIsIDB4QTIsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MTMsIDB4MDMsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4RDcsIDB4NjAsIDB4MkYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4QTIsIDB4RDEsCisJIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NkEsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MTMsIDB4MDMsIDB4MEYsIDB4NjAsIDB4RDgsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsCisJIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4RDcsIDB4NjAsIDB4NDcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsCisJIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjQsIDB4NjksIDB4RkIsIDB4RDcsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NzcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsIDB4OEMsIDB4RkIsIDB4MDIsIDB4NjQsIDB4QzEsIDB4RkUsIDB4REMsIDB4RkIsIDB4RjIsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4QkMsIDB4RjIsIDB4RkIsIDB4MDIsIDB4NjUsIDB4RTksIDB4NjAsIDB4NTgsIDB4NEUsIDB4N0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4NjAsCisJIDB4RTgsIDB4NjMsIDB4MUEsIDB4NjAsIDB4NDAsIDB4NjQsIDB4QTAsIDB4REQsIDB4Q0IsIDB4NjAsIDB4MUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsCisJIDB4MjAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjQsIDB4NTQsIDB4MDEsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4MDAsIDB4NjMsIDB4NjksIDB4RkQsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTUsIDB4MDAsIDB4MjQsIDB4NjAsCisJIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NjYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsCisJIDB4MDAsIDB4NjQsIDB4NjksIDB4RkIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDEsIDB4NjQsIDB4OEMsIDB4RkIsCisJIDB4RkYsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NTAsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsCisJIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDEsIDB4NjAsIDB4MkUsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MTAsIDB4QjAsCisJIDB4RkYsIDB4RkYsIDB4MTMsIDB4MDMsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDcsIDB4NjAsCisJIDB4OEYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QkMsIDB4RjEsIDB4MUEsIDB4NjAsIDB4NkEsIDB4NjIsCisJIDB4QTIsIDB4RDksIDB4N0YsIDB4RjEsIDB4N0UsIDB4RjksIDB4MDIsIDB4NjQsIDB4OEMsIDB4RkIsIDB4RkYsIDB4RkYsIDB4QzEsIDB4RkUsIDB4OEMsIDB4RjMsCisJIDB4MDAsIDB4NjUsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MEYsIDB4MDMsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDcsIDB4NjAsIDB4QjMsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NTEsIDB4NjQsCisJIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MTksIDB4NjAsIDB4ODQsIDB4NjQsIDB4NjgsIDB4RkIsIDB4MUEsIDB4NjAsIDB4NDYsIDB4NjMsIDB4ODEsIDB4RjMsCisJIDB4QkQsIDB4REIsIDB4ODIsIDB4RjMsIDB4QkQsIDB4REIsIDB4ODMsIDB4RjMsIDB4QTMsIDB4REIsIDB4MDEsIDB4NjAsIDB4MTAsIDB4NjUsIDB4NjgsIDB4RjMsCisJIDB4QTUsIDB4RDEsIDB4MDQsIDB4QTQsIDB4NjgsIDB4RkIsIDB4RDAsIDB4ODAsIDB4QTAsIDB4RDMsIDB4MjAsIDB4MDcsIDB4NDAsIDB4NDcsIDB4NjAsIDB4NDEsCisJIDB4MEUsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MjgsIDB4NjAsIDB4MkMsIDB4NjIsIDB4QTIsIDB4RDEsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MUIsIDB4MTAsIDB4QjAsCisJIDB4RkYsIDB4RkYsIDB4RUIsIDB4MDIsIDB4MjcsIDB4NDQsIDB4MDYsIDB4QTQsIDB4NjAsIDB4NDEsIDB4QTEsIDB4RDEsIDB4ODEsIDB4RjMsIDB4ODIsIDB4RjEsCisJIDB4RDAsIDB4ODAsIDB4NTksIDB4RDMsIDB4MDgsIDB4MDIsIDB4RDAsIDB4ODAsIDB4ODMsIDB4RjMsIDB4NTksIDB4RDEsIDB4MDQsIDB4MDIsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4RDgsIDB4NjAsIDB4OTksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUEsIDB4NjAsIDB4NDYsIDB4NjMsCisJIDB4QkQsIDB4RDMsIDB4ODEsIDB4RkIsIDB4QkQsIDB4RDMsIDB4ODIsIDB4RkIsIDB4QTMsIDB4RDMsIDB4ODMsIDB4RkIsIDB4NTMsIDB4NjQsIDB4M0IsIDB4NDIsCisJIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEIsIDB4MDQsIDB4MEYsIDB4NjAsCisJIDB4RUMsIDB4NjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDgsIDB4NjAsIDB4MDYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0UsIDB4RjEsIDB4N0YsIDB4RjksIDB4MjQsIDB4NjAsIDB4OUEsIDB4NjIsIDB4QTIsIDB4RDksIDB4MUUsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4RDgsIDB4NjAsIDB4MzYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QkUsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDEsIDB4NjMsIDB4OEMsIDB4RkQsIDB4MEYsIDB4NjAsIDB4RDgsIDB4NjIsIDB4QTIsIDB4RDEsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4QzEsIDB4RkUsIDB4NTQsIDB4NjQsIDB4M0IsIDB4NDIsCisJIDB4NUEsIDB4REIsIDB4MzEsIDB4NDQsIDB4RjksIDB4QjQsIDB4NDAsIDB4NTEsIDB4MDEsIDB4NjAsIDB4QkEsIDB4NjEsIDB4MUYsIDB4NjAsIDB4MDgsIDB4NjMsCisJIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjAsIDB4N0YsIDB4QkQsIDB4REIsIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjEsIDB4N0YsIDB4QkQsIDB4REIsCisJIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjIsIDB4N0YsIDB4QTMsIDB4REIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4REUsIDB4RkUsIDB4MEIsIDB4MDQsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDgsIDB4NjAsCisJIDB4NjQsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjAsIDB4OUEsIDB4NjIsIDB4MUYsIDB4NjAsCisJIDB4MDYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjAsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsCisJIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDgsIDB4NjAsIDB4ODksIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QkUsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4RDYsIDB4NjAsIDB4QjcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDMsIDB4MkQsIDB4NjAsIDB4N0EsIDB4NjUsIDB4QTUsIDB4RDMsIDB4NjUsIDB4NDEsIDB4MTAsIDB4QTMsIDB4MDEsIDB4QTQsCisJIDB4RkUsIDB4QjQsIDB4QzQsIDB4ODUsIDB4RkUsIDB4QTEsIDB4QkQsIDB4RDMsIDB4NTksIDB4RDEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RDUsIDB4ODAsCisJIDB4MDIsIDB4MDIsIDB4MDQsIDB4MDMsIDB4RjgsIDB4MDEsIDB4RDcsIDB4NjAsIDB4REQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTUsIDB4NjQsIDB4M0IsIDB4NDIsCisJIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEIsIDB4MDQsIDB4MEYsIDB4NjAsCisJIDB4RUMsIDB4NjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDgsIDB4NjAsIDB4QjEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RDEsIDB4N0YsIDB4RjksIDB4MjQsIDB4NjAsIDB4OUEsIDB4NjIsIDB4QTIsIDB4RDksIDB4MUUsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4RDgsIDB4NjAsIDB4RDYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QkUsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDEsIDB4NjAsIDB4QkEsIDB4NjEsIDB4MUYsIDB4NjAsIDB4MDgsIDB4NjMsIDB4QTEsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4N0YsIDB4QkQsIDB4REIsIDB4MjEsIDB4NjAsIDB4MzIsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDQsIDB4QTEsIDB4QTEsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4MjIsIDB4N0YsIDB4QTMsIDB4REIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsCisJIDB4MEIsIDB4MDQsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDgsIDB4NjAsIDB4RjMsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjAsIDB4OUEsIDB4NjIsIDB4MUYsIDB4NjAsIDB4MDYsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MjAsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MjAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDksIDB4NjAsIDB4MTgsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QkUsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsCisJIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MUEsIDB4NjAsIDB4NkEsIDB4NjIsIDB4MDcsIDB4NjAsCisJIDB4RDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NjYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MjcsIDB4NDMsIDB4MDYsIDB4QTMsIDB4QkQsIDB4RDMsIDB4ODEsIDB4RkIsIDB4QkQsIDB4RDMsCisJIDB4ODIsIDB4RkIsIDB4QTMsIDB4RDMsIDB4ODMsIDB4RkIsIDB4MzEsIDB4NDQsIDB4RjksIDB4QjQsIDB4NDAsIDB4NTEsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MDEsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDksIDB4NjAsCisJIDB4NEQsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QkMsIDB4RjEsIDB4MUEsIDB4NjAsIDB4NkEsIDB4NjIsCisJIDB4QTIsIDB4RDksIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4RkUsIDB4NjAsIDB4RkYsIDB4NjEsIDB4QTEsIDB4ODQsIDB4NUEsIDB4RDEsCisJIDB4NEEsIDB4REIsIDB4QTEsIDB4ODQsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4RDcsIDB4NjAsIDB4REQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjcsIDB4NDIsIDB4MEMsIDB4QTIsIDB4MjgsIDB4NjAsIDB4MDIsIDB4NjMsIDB4QTIsIDB4RDMsIDB4QTMsIDB4RDMsIDB4MDAsIDB4QkQsIDB4MDEsIDB4NjMsCisJIDB4QUMsIDB4ODEsIDB4MDksIDB4MDMsIDB4MDgsIDB4MDMsIDB4QjAsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QjgsCisJIDB4MDEsIDB4NjMsIDB4MDEsIDB4MDMsIDB4NjAsIDB4NDMsIDB4MUEsIDB4NjAsIDB4M0UsIDB4NjQsIDB4QTAsIDB4REQsIDB4NjAsIDB4RjUsIDB4MDAsIDB4NjQsCisJIDB4MkIsIDB4RkEsIDB4MjAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MjcsIDB4NDMsIDB4MDYsIDB4QTMsIDB4QkQsIDB4RDEsIDB4MkMsIDB4RjgsIDB4MzIsIDB4RjgsCisJIDB4QkQsIDB4RDEsIDB4MkQsIDB4RjgsIDB4MzMsIDB4RjgsIDB4QTMsIDB4RDEsIDB4MkUsIDB4RjgsIDB4MzQsIDB4RjgsIDB4RUIsIDB4RjEsIDB4MkYsIDB4RjgsCisJIDB4RUMsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUQsIDB4RjEsIDB4MzEsIDB4RjgsIDB4QkMsIDB4RjEsIDB4MTksIDB4RjgsIDB4RjgsIDB4NjAsIDB4ODAsIDB4NjQsCisJIDB4MEUsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDEsIDB4NjMsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MTAsIDB4QkIsIDB4MjgsIDB4NjAsIDB4MkMsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4RkUsIDB4MjYsIDB4MTAsIDB4QkIsIDB4MDksIDB4RkMsIDB4MUEsIDB4NjAsIDB4M0UsIDB4NjQsCisJIDB4QTAsIDB4RDMsIDB4MTIsIDB4NjEsIDB4NTksIDB4REEsIDB4MUEsIDB4NjAsIDB4NDYsIDB4NjMsIDB4QkQsIDB4RDEsIDB4NTksIDB4RDgsIDB4QkQsIDB4RDEsCisJIDB4NTksIDB4RDgsIDB4QTMsIDB4RDEsIDB4NTksIDB4RDgsIDB4MkUsIDB4NjAsIDB4REUsIDB4NjQsIDB4NDAsIDB4NDgsIDB4RDksIDB4ODEsIDB4RkYsIDB4NjAsCisJIDB4RjIsIDB4NjQsIDB4RTgsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4RjUsIDB4M0YsIDB4RkMsIDB4REIsIDB4ODMsCisJIDB4MkUsIDB4NjAsIDB4MDgsIDB4NjIsIDB4QTIsIDB4REQsIDB4MjAsIDB4N0MsIDB4NUEsIDB4RDksIDB4NjMsIDB4NDEsIDB4MkUsIDB4NjAsIDB4MEMsIDB4NjMsCisJIDB4MTIsIDB4NjUsIDB4MDAsIDB4RjQsIDB4Q0QsIDB4ODQsIDB4NEMsIDB4OTEsIDB4NjAsIDB4NDMsIDB4NjAsIDB4RkUsIDB4QTUsIDB4RDIsIDB4REUsIDB4ODUsCisJIDB4N0YsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4NUQsIDB4OTMsIDB4QTMsIDB4REIsIDB4NUQsIDB4OTMsIDB4QTUsIDB4RDIsCisJIDB4RjYsIDB4MUYsIDB4NUQsIDB4OTMsIDB4MjAsIDB4RkUsIDB4REYsIDB4ODMsIDB4NjAsIDB4RjUsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsCisJIDB4MjgsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4QzEsIDB4RkUsIDB4MTQsIDB4NjQsIDB4NjksIDB4RkIsIDB4NTYsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4MUEsIDB4NjAsIDB4NDQsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjQsIDB4QTQsIDB4QTIsIDB4REIsIDB4MUEsIDB4NjAsIDB4NDQsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4MUEsIDB4NjAsIDB4NkEsIDB4NjIsIDB4QTIsIDB4RDksIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NjYsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MDAsIDB4NjAsCisJIDB4MUMsIDB4NjQsIDB4QTIsIDB4REIsIDB4REEsIDB4NjAsIDB4MTAsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MEUsIDB4MDMsCisJIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NTcsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MDAsIDB4NjQsIDB4NjksIDB4RkIsIDB4MEYsIDB4NjAsCisJIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDcsIDB4NjAsIDB4REQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MTcsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsCisJIDB4NjYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4NTgsIDB4NjQsIDB4M0IsIDB4NDIsCisJIDB4NUEsIDB4REIsIDB4MDAsIDB4NjQsIDB4NjksIDB4RkIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REIsIDB4NjAsCisJIDB4Q0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4M0EsIDB4MDMsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NjYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NjksIDB4RkIsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MEEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MkMsIDB4MTgsIDB4NTksIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4MEEsIDB4RjIsIDB4MjYsIDB4NDYsIDB4NDAsIDB4NTksIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsIDB4MkYsIDB4RjIsIDB4QTEsIDB4REIsIDB4MzAsIDB4RjIsCisJIDB4NDEsIDB4NTgsIDB4NTksIDB4REIsIDB4MzEsIDB4RjIsIDB4NTksIDB4REIsIDB4MjYsIDB4NDYsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjQsIDB4NDAsIDB4NEIsCisJIDB4MkMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MDUsIDB4NjUsIDB4RTksIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4NEMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4REMsIDB4NjAsIDB4QUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDcsIDB4NjAsIDB4REQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NUEsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4NzgsIDB4NDMsIDB4MDIsIDB4NjEsIDB4MjQsIDB4NjAsIDB4REQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NUIsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MDksIDB4RjAsIDB4MkUsIDB4NjAsIDB4NjQsIDB4NjMsIDB4MzAsIDB4NjQsCisJIDB4QkQsIDB4REIsIDB4QkQsIDB4RDksIDB4MEEsIDB4RjAsIDB4QkQsIDB4RDksIDB4MEIsIDB4RjAsIDB4QkQsIDB4RDksIDB4MEMsIDB4RjIsIDB4QkQsIDB4REIsCisJIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4MEEsIDB4QTUsIDB4MkUsIDB4NjAsIDB4NjIsIDB4NjIsIDB4NjUsIDB4NUMsIDB4QTIsIDB4RDksIDB4NjAsIDB4NDEsCisJIDB4MUEsIDB4NjUsIDB4Q0QsIDB4ODQsIDB4NEMsIDB4OTEsIDB4NjAsIDB4NDMsIDB4NjAsIDB4RkUsIDB4QTUsIDB4RDIsIDB4REUsIDB4ODUsIDB4N0YsIDB4MjYsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4NUQsIDB4OTMsIDB4QTMsIDB4REIsIDB4NUQsIDB4OTMsIDB4QTUsIDB4RDIsIDB4RjYsIDB4MUYsCisJIDB4NUQsIDB4OTMsIDB4MjAsIDB4RkUsIDB4REYsIDB4ODMsIDB4RDMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4MDcsIDB4QjQsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsIDB4NjEsIDB4NDQsCisJIDB4OTYsIDB4RkIsIDB4MjcsIDB4NDUsIDB4MDIsIDB4NjIsIDB4NDYsIDB4RDMsIDB4NUEsIDB4RDEsIDB4NjAsIDB4NDcsIDB4NTYsIDB4RkIsIDB4NjQsIDB4NDcsCisJIDB4NTUsIDB4RkIsIDB4MDAsIDB4NjQsIDB4NUMsIDB4RkIsIDB4MEMsIDB4NjIsIDB4NDYsIDB4RDMsIDB4ODAsIDB4RkIsIDB4MEIsIDB4RjAsIDB4MEYsIDB4NjAsCisJIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4ODUsIDB4RkIsIDB4MUEsIDB4NjAsIDB4M0UsIDB4NjIsIDB4QTIsIDB4RDMsIDB4ODcsIDB4RkIsIDB4MjYsIDB4NDYsCisJIDB4MzIsIDB4RjAsIDB4ODEsIDB4RjksIDB4MzMsIDB4RjAsIDB4ODIsIDB4RjksIDB4MzQsIDB4RjAsIDB4ODMsIDB4RjksIDB4MDAsIDB4RjQsIDB4MTgsIDB4NjUsCisJIDB4MEMsIDB4NjEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QTUsIDB4RDAsIDB4REEsIDB4ODUsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4Q0QsIDB4ODEsCisJIDB4QkQsIDB4REIsIDB4MDUsIDB4MDMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsIDB4RjQsIDB4MDIsIDB4MDIsIDB4NjAsCisJIDB4MDIsIDB4NjEsIDB4QTEsIDB4RDMsIDB4MDAsIDB4NjUsIDB4NjAsIDB4NDMsIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4N0YsIDB4QjQsIDB4MDIsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjQsIDB4MTUsIDB4MDAsIDB4MDQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjQsIDB4MTEsIDB4MDAsIDB4MEEsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjQsIDB4MEQsIDB4MDAsIDB4MEIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjQsIDB4MDksIDB4MDAsIDB4MTAsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MTAsIDB4NjQsIDB4MDUsIDB4MDAsIDB4MTYsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MjAsIDB4NjQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjQsCisJIDB4Q0YsIDB4ODMsIDB4QjQsIDB4ODUsIDB4RTEsIDB4MDIsIDB4NjUsIDB4NDQsIDB4N0EsIDB4RkIsIDB4MDIsIDB4NjAsIDB4MDIsIDB4NjEsIDB4QTEsIDB4RDMsCisJIDB4MDAsIDB4NjUsIDB4NjAsIDB4NDMsIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4ODAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4NjAsIDB4NDUsCisJIDB4Q0YsIDB4ODMsIDB4NjUsIDB4NDQsIDB4RjcsIDB4MDIsIDB4N0YsIDB4QjQsIDB4MDIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEEsIDB4NjQsIDB4MTUsIDB4MDAsCisJIDB4MDQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTQsIDB4NjQsIDB4MTEsIDB4MDAsIDB4MEEsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MzIsIDB4NjQsIDB4MEQsIDB4MDAsCisJIDB4MEIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MzcsIDB4NjQsIDB4MDksIDB4MDAsIDB4MTAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4NTAsIDB4NjQsIDB4MDUsIDB4MDAsCisJIDB4MTYsIDB4M0EsIDB4MDIsIDB4MDAsIDB4NkUsIDB4NjQsIDB4MDEsIDB4MDAsIDB4MTQsIDB4NjQsIDB4N0MsIDB4RkIsIDB4QTksIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4QTQsIDB4RDgsIDB4RjMsIDB4NjAsIDB4NDUsIDB4NjYsIDB4NDEsIDB4NjUsIDB4NDYsIDB4OEMsIDB4RkEsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsCisJIDB4MDYsIDB4MDAsIDB4MDIsIDB4MzYsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MDUsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjQsCisJIDB4MDEsIDB4MDAsIDB4MDEsIDB4NjQsIDB4NkYsIDB4RkEsIDB4NzksIDB4RjMsIDB4N0EsIDB4RjEsIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsIDB4NjUsIDB4NDMsCisJIDB4MDIsIDB4MDIsIDB4NzksIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4MEYsIDB4NjAsIDB4QUUsIDB4NjUsIDB4RDgsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjEsIDB4NDUsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDIsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4RkMsIDB4MDMsIDB4QTQsIDB4ODQsIDB4N0IsIDB4RkIsIDB4NkYsIDB4RjAsIDB4NjAsIDB4NDcsIDB4OTAsIDB4ODQsIDB4NkYsIDB4RkEsCisJIDB4NjAsIDB4NDcsIDB4NjAsIDB4NDUsIDB4ODAsIDB4NjQsIDB4RTgsIDB4ODQsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MDMsIDB4QTQsIDB4ODQsCisJIDB4NzAsIDB4RjAsIDB4NzAsIDB4RkEsIDB4MDAsIDB4NjEsIDB4RTgsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDUsIDB4REQsIDB4ODEsIDB4RkIsIDB4MDEsCisJIDB4RTEsIDB4ODEsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MEUsIDB4RkEsIDB4NjYsIDB4NDMsIDB4MEMsIDB4RjQsIDB4QTksIDB4RjMsCisJIDB4MUMsIDB4NjAsIDB4QkEsIDB4NjUsIDB4MDIsIDB4QTQsIDB4NjAsIDB4NDYsIDB4MDUsIDB4RjAsIDB4NjAsIDB4NDEsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4MDAsIDB4N0MsIDB4NDQsIDB4RDksIDB4MjYsIDB4NDYsIDB4MzEsIDB4RjIsIDB4NjEsIDB4NUMsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksIDB4MjYsIDB4NDYsIDB4MkYsIDB4RjAsIDB4NjEsIDB4NDYsIDB4MDMsIDB4RjgsIDB4MjYsIDB4NDYsIDB4MzAsIDB4RjAsCisJIDB4NjEsIDB4NDYsIDB4MDQsIDB4RjgsIDB4MjYsIDB4NDYsIDB4MzEsIDB4RjAsIDB4NjEsIDB4NDYsIDB4MDUsIDB4RjgsIDB4MjYsIDB4NDYsIDB4Q0YsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4MjAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MkMsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MDMsIDB4NjUsIDB4RTksIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4N0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjMsIDB4OEMsIDB4RkQsIDB4MEYsIDB4NjAsIDB4RDgsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsCisJIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4QzEsIDB4RkUsIDB4NUMsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4RDYsIDB4NjAsIDB4QjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4RjcsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4RDAsIDB4NjAsCisJIDB4OTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4REMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkQsIDB4QTAsIDB4MkEsIDB4RjIsIDB4MDMsIDB4MDMsIDB4REMsIDB4NjAsCisJIDB4N0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4QjAsIDB4MzYsIDB4MTEsIDB4MDAsIDB4QzAsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MkMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RDgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4RDAsIDB4NjAsIDB4OTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDUsIDB4MDAsIDB4RjQsCisJIDB4MEEsIDB4RjIsIDB4MEIsIDB4RjIsIDB4RkUsIDB4QTAsIDB4RjMsIDB4QTAsIDB4NkYsIDB4MDIsIDB4NjAsIDB4NDEsIDB4MDksIDB4RjIsIDB4MjAsIDB4MDMsCisJIDB4MDAsIDB4QTAsIDB4RkYsIDB4QTAsIDB4NTMsIDB4MDMsIDB4NjUsIDB4MDMsIDB4MDAsIDB4QTAsIDB4RkYsIDB4RkYsIDB4NEYsIDB4MDMsIDB4MUYsIDB4NjAsCisJIDB4NTQsIDB4NjEsIDB4MDEsIDB4NjQsIDB4QTEsIDB4REIsIDB4MUYsIDB4NjAsIDB4NTYsIDB4NjEsIDB4MEQsIDB4NjQsIDB4QTEsIDB4REIsIDB4MUYsIDB4NjAsCisJIDB4NTgsIDB4NjEsIDB4MDMsIDB4NjQsIDB4QTEsIDB4REIsIDB4MjYsIDB4NDYsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MkMsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4RDAsIDB4NjAsIDB4OTgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjgsIDB4NjAsIDB4MkUsIDB4NjEsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QTAsIDB4MUYsIDB4NjAsIDB4NTQsIDB4NjEsIDB4MTcsIDB4MDIsCisJIDB4MDEsIDB4NjQsIDB4QTEsIDB4REIsIDB4MUYsIDB4NjAsIDB4NTYsIDB4NjEsIDB4MDAsIDB4NjQsIDB4QTEsIDB4REIsIDB4MUYsIDB4NjAsIDB4NTgsIDB4NjEsCisJIDB4MDEsIDB4NjQsIDB4QTEsIDB4REIsIDB4MjYsIDB4NDYsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MkMsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4RDAsIDB4NjAsIDB4OTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsCisJIDB4QTEsIDB4REIsIDB4MUYsIDB4NjAsIDB4NTYsIDB4NjEsIDB4MDAsIDB4NjQsIDB4QTEsIDB4REIsIDB4MUYsIDB4NjAsIDB4NTgsIDB4NjEsIDB4MDEsIDB4NjQsCisJIDB4QTEsIDB4REIsIDB4MjYsIDB4NDYsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MkMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RDgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4RDAsIDB4NjAsIDB4OTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDYsIDB4MDcsIDB4RjQsCisJIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDEsIDB4N0UsIDB4MDYsIDB4RkEsIDB4NjUsIDB4NDYsIDB4MjYsIDB4NDYsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjQsCisJIDB4NDAsIDB4NEIsIDB4MkMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4RDIsIDB4NjAsIDB4NDEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4RjIsIDB4MDksIDB4RjIsIDB4RkMsIDB4QTAsIDB4RkYsIDB4QTAsCisJIDB4MTEsIDB4MDIsIDB4MEEsIDB4MDIsIDB4MEIsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MEEsIDB4MUIsIDB4NjYsIDB4NDEsIDB4MDcsIDB4RjQsIDB4MDYsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4N0UsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4RDAsIDB4NjAsIDB4OTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDYsIDB4NjksIDB4RjEsIDB4MkEsIDB4RjIsIDB4NjQsIDB4NDEsIDB4NjAsIDB4NDAsIDB4QTAsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDgsIDB4QjEsIDB4MDQsIDB4MDAsIDB4QzAsIDB4M0EsIDB4MEMsIDB4MDAsIDB4MDQsIDB4QjEsIDB4RkYsIDB4RkYsIDB4MjAsIDB4MDMsCisJIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MTcsIDB4MDAsIDB4QjAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjUsIDB4MDcsIDB4MDAsIDB4MTAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjUsCisJIDB4MDMsIDB4MDAsIDB4MzAsIDB4M0EsIDB4MEQsIDB4MDAsIDB4MTAsIDB4NjUsIDB4QTUsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDksIDB4MDMsIDB4MEYsIDB4NjAsCisJIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDAsIDB4NjYsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NjAsIDB4MkUsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTAsIDB4RkYsIDB4RkYsCisJIDB4MTYsIDB4MDQsIDB4MEYsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTIsIDB4REIsIDB4REMsIDB4NjAsIDB4QkMsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkQsIDB4NjAsIDB4NTgsIDB4NjUsIDB4QTUsIDB4RDEsIDB4MDEsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4RDAsIDB4NjAsIDB4OTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4NDAsCisJIDB4MDgsIDB4MkEsIDB4MDMsIDB4MDAsIDB4Q0YsIDB4NjAsIDB4RjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDcsIDB4NjAsIDB4REQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NEUsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MkUsIDB4RjUsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RjIsIDB4MUMsIDB4NjAsIDB4QkEsIDB4NjUsCisJIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsCisJIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsCisJIDB4MjYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4QTksIDB4RjMsCisJIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjIsIDB4MjYsIDB4RjAsIDB4QTcsIDB4RjIsIDB4QTgsIDB4RjAsIDB4NjYsIDB4RjUsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4ODksIDB4RjgsIDB4NjYsIDB4RjUsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RkMsIDB4MkMsIDB4RkEsCisJIDB4MkQsIDB4RjgsIDB4QUUsIDB4RkEsIDB4RUIsIDB4RjMsIDB4MkYsIDB4RkEsIDB4RUMsIDB4RjMsIDB4MzAsIDB4RkEsIDB4RUQsIDB4RjMsIDB4MzEsIDB4RkEsCisJIDB4ODEsIDB4RjMsIDB4MzIsIDB4RkEsIDB4ODIsIDB4RjMsIDB4MzMsIDB4RkEsIDB4ODMsIDB4RjMsIDB4MzQsIDB4RkEsIDB4MzEsIDB4NjAsIDB4MkMsIDB4NjEsCisJIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MUIsIDB4MDAsIDB4NjAsIDB4QTAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjAsIDB4QzAsIDB4NjQsCisJIDB4MkEsIDB4RkEsIDB4MDIsIDB4NjMsIDB4M0YsIDB4RkMsIDB4QUIsIDB4RkMsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4Q0MsIDB4RjEsIDB4MTksIDB4RjgsCisJIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4MjgsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4QzEsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDYsIDB4NjAsIDB4QzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4M0EsIDB4NjEsIDB4QUUsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4QzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4NjIsIDB4RkIsIDB4QTksIDB4RjMsIDB4MDcsIDB4RkEsIDB4MEMsIDB4NjAsCisJIDB4ODAsIDB4NjQsIDB4QkMsIDB4RjEsIDB4MTksIDB4RjgsIDB4MEUsIDB4RkEsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4M0YsIDB4RkEsIDB4MDAsIDB4NjAsCisJIDB4M0EsIDB4NjEsIDB4QUUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4NjEsIDB4RkIsIDB4QTksIDB4RjMsCisJIDB4MDcsIDB4RkEsIDB4MEMsIDB4NjAsIDB4ODAsIDB4NjQsIDB4MEUsIDB4RkEsIDB4QkMsIDB4RjEsIDB4MTksIDB4RjgsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsCisJIDB4M0YsIDB4RkEsIDB4MTAsIDB4NjAsIDB4MjAsIDB4NjIsIDB4REUsIDB4NjAsIDB4REMsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RTAsIDB4NjIsCisJIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REQsIDB4NjAsIDB4NzEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MjcsIDB4NjAsIDB4QjYsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4QTgsIDB4MDMsIDB4QTgsIDB4MDQsIDB4MDMsIDB4MDMsIDB4MDMsIDB4REUsIDB4NjAsIDB4Q0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4NjAsCisJIDB4MDAsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsIDB4MEYsIDB4NjAsIDB4REUsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4OUIsIDB4RkUsCisJIDB4MDMsIDB4MDUsIDB4MjAsIDB4NDAsIDB4NEIsIDB4MjMsIDB4MEUsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RTAsIDB4NjIsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4REQsIDB4NjAsIDB4ODMsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MjEsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4ODYsIDB4NjEsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsCisJIDB4MDcsIDB4MDAsIDB4OTAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsIDB4MDAsIDB4NjQsIDB4QTEsIDB4REIsIDB4MDQsIDB4MDAsCisJIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsIDB4OEMsIDB4RjMsIDB4NTgsIDB4RkIsIDB4ODQsIDB4RjEsIDB4QkEsIDB4RkUsCisJIDB4MDEsIDB4QTgsIDB4NTksIDB4RjksIDB4MDQsIDB4MDIsIDB4MDIsIDB4NjQsIDB4OEMsIDB4RkIsIDB4RkYsIDB4RkYsIDB4QzEsIDB4RkUsIDB4NjQsIDB4NDcsCisJIDB4REMsIDB4RjMsIDB4MTAsIDB4QjAsIDB4MDQsIDB4QTgsIDB4MzMsIDB4MDIsIDB4MzIsIDB4MDIsIDB4NjIsIDB4RjUsIDB4RUIsIDB4RjEsIDB4MkYsIDB4RjgsCisJIDB4RUMsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUQsIDB4RjEsIDB4MzEsIDB4RjgsIDB4ODEsIDB4RjEsIDB4MkMsIDB4RjgsIDB4MzIsIDB4RjgsIDB4ODIsIDB4RjEsCisJIDB4MkQsIDB4RjgsIDB4MzMsIDB4RjgsIDB4ODMsIDB4RjEsIDB4MkUsIDB4RjgsIDB4MzQsIDB4RjgsIDB4MTAsIDB4NjAsIDB4NDgsIDB4NjQsIDB4MkEsIDB4RkEsCisJIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4MjgsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MjIsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsCisJIDB4RTAsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4QTIsIDB4REIsIDB4REQsIDB4NjAsIDB4RUEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MTAsIDB4NjcsIDB4ODQsIDB4RkIsIDB4OEMsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDMsIDB4MEYsIDB4NjAsIDB4RTAsIDB4NjIsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4REQsIDB4NjAsIDB4RUYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsCisJIDB4REUsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MUIsIDB4NjAsIDB4QzYsIDB4NjUsIDB4MUYsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QTAsIDB4RDMsCisJIDB4MDUsIDB4N0MsIDB4MDgsIDB4QjAsIDB4QTUsIDB4RDMsIDB4MDUsIDB4MDIsIDB4MDAsIDB4QjgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4MTUsIDB4N0MsCisJIDB4MEIsIDB4MDAsIDB4REMsIDB4RjMsIDB4MTIsIDB4NjAsIDB4MjYsIDB4NjMsIDB4MDMsIDB4QTgsIDB4N0YsIDB4RjMsIDB4MDUsIDB4MDIsIDB4RTAsIDB4ODUsCisJIDB4NDcsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDcsIDB4QkMsIDB4QTIsIDB4REIsIDB4NTMsIDB4RjksIDB4MjksIDB4NjAsIDB4QzYsIDB4NjQsIDB4NTQsIDB4RkIsCisJIDB4MjQsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEYsIDB4NEUsIDB4RUMsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MEUsIDB4NEYsIDB4MEYsIDB4NjAsIDB4RTAsIDB4NjIsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4NjAsIDB4MzQsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4NTksIDB4RjMsIDB4ODQsIDB4RkIsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MjcsIDB4REEsIDB4RkUsIDB4REMsIDB4RjMsIDB4MDAsIDB4QTgsIDB4MDQsIDB4QTgsCisJIDB4MjcsIDB4MDIsIDB4MjYsIDB4MDIsIDB4NjEsIDB4RjUsIDB4RUIsIDB4RjEsIDB4MkYsIDB4RjgsIDB4RUMsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUQsIDB4RjEsCisJIDB4MzEsIDB4RjgsIDB4ODEsIDB4RjEsIDB4MkMsIDB4RjgsIDB4ODIsIDB4RjEsIDB4MkQsIDB4RjgsIDB4ODMsIDB4RjEsIDB4MkUsIDB4RjgsIDB4QTQsIDB4NjQsCisJIDB4MkEsIDB4RkEsIDB4ODUsIDB4RjEsIDB4QzAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4MkIsIDB4RkEsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsCisJIDB4MjgsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4QzEsIDB4RkUsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsIDB4MjYsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4OUUsIDB4RjUsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MUIsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MkIsIDB4NUMsIDB4MDAsIDB4N0YsIDB4NjAsIDB4RkYsIDB4NjUsCisJIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MDAsIDB4NjQsIDB4NDEsIDB4RkIsIDB4RjEsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MjQsIDB4RkEsIDB4REEsIDB4ODUsCisJIDB4MTksIDB4NjAsIDB4ODYsIDB4NjMsIDB4ODksIDB4RjEsIDB4NDMsIDB4NEMsIDB4RDMsIDB4ODAsIDB4QkUsIDB4RDEsIDB4MTQsIDB4MDUsIDB4NjUsIDB4NDAsCisJIDB4ODAsIDB4MkEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4NjQsIDB4NDMsIDB4MzIsIDB4NjEsIDB4MEYsIDB4NEUsIDB4MkYsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4MDEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4MkMsIDB4NDMsIDB4MDQsIDB4QTMsIDB4NDEsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MzIsIDB4QTQsIDB4NDEsIDB4RkIsIDB4RTcsIDB4MDEsIDB4MjAsIDB4NDcsIDB4MjAsIDB4QjAsIDB4MjAsIDB4QUYsIDB4MEYsIDB4MDMsIDB4NDAsIDB4NDAsCisJIDB4MEYsIDB4NjAsIDB4RTAsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4NjAsIDB4QTMsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4OUUsIDB4RjEsIDB4NDEsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4QTQsIDB4RTgsIDB4ODQsIDB4NjQsIDB4NDYsIDB4MjMsIDB4RkEsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsCisJIDB4NjQsIDB4NjQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDksIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDAsIDB4NjQsCisJIDB4OUUsIDB4RkIsIDB4RkEsIDB4RkUsIDB4RUIsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4NTgsIDB4RjMsIDB4OEMsIDB4RkIsCisJIDB4RkYsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MEYsIDB4NjAsIDB4REUsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RTAsIDB4NjIsCisJIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REQsIDB4NjAsIDB4NzEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkUsIDB4NjQsCisJIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4OUUsIDB4RjEsCisJIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODYsIDB4OUUsIDB4RkIsIDB4MDcsIDB4MDMsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MkMsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RUIsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MEYsIDB4NjAsCisJIDB4REUsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RTAsIDB4NjIsIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4REQsIDB4NjAsIDB4NzEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4OTcsIDB4RjMsIDB4MjYsIDB4NDYsCisJIDB4NjAsIDB4NDMsIDB4MDEsIDB4MkEsIDB4MjIsIDB4MDAsIDB4MEYsIDB4RjIsIDB4MkEsIDB4RjAsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MTAsIDB4MDAsCisJIDB4NjQsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MUEsIDB4MDAsIDB4RkQsIDB4QjMsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MjcsIDB4MDIsIDB4QkIsIDB4MEYsIDB4NjAsCisJIDB4RjYsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MEMsIDB4MDAsCisJIDB4RkIsIDB4QjMsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MjcsIDB4MDQsIDB4QkIsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsCisJIDB4MTAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4OTcsIDB4RkQsIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4RjMsIDB4M0YsIDB4RjIsIDB4MDQsIDB4QTgsIDB4NTcsIDB4RkIsIDB4MDIsIDB4MDMsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4RjQsCisJIDB4MUUsIDB4NjMsIDB4MDgsIDB4NjQsIDB4NDAsIDB4NDgsIDB4QkQsIDB4RDIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MDUsIDB4MzYsIDB4MEIsIDB4MDAsCisJIDB4RkYsIDB4QjUsIDB4QzcsIDB4ODMsIDB4MDEsIDB4MkEsIDB4RjcsIDB4MDEsIDB4NEYsIDB4RDIsIDB4NUIsIDB4RDIsIDB4NjAsIDB4NDAsIDB4MDUsIDB4MzcsCisJIDB4MDgsIDB4MDAsIDB4REYsIDB4ODMsIDB4RjUsIDB4MDEsIDB4RkYsIDB4QjUsIDB4NjUsIDB4NDEsIDB4NDcsIDB4OEEsIDB4NUIsIDB4RDIsIDB4REYsIDB4ODMsCisJIDB4MDcsIDB4MDAsIDB4MDAsIDB4N0YsIDB4REMsIDB4ODUsIDB4NDcsIDB4OEEsIDB4NjAsIDB4NDEsIDB4NUIsIDB4RDIsIDB4REIsIDB4ODMsIDB4NjAsIDB4NDcsCisJIDB4MDEsIDB4QjAsIDB4RkUsIDB4QjUsIDB4MDIsIDB4MDMsIDB4MDIsIDB4NjQsIDB4NDAsIDB4NDgsIDB4ODUsIDB4RjEsIDB4NjUsIDB4NDQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RkQsIDB4QTEsIDB4RTEsIDB4ODEsIDB4RTEsIDB4ODEsIDB4RTEsIDB4ODUsIDB4QzQsIDB4ODEsIDB4RDAsIDB4ODQsCisJIDB4RDEsIDB4ODAsIDB4MkEsIDB4MDcsIDB4MjksIDB4MDYsIDB4OUMsIDB4ODQsIDB4REMsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODUsCisJIDB4OTYsIDB4RjMsIDB4QzcsIDB4ODMsIDB4MDEsIDB4MjYsIDB4NjAsIDB4NDcsIDB4QUIsIDB4ODMsIDB4RkMsIDB4QTMsIDB4MDIsIDB4MDAsIDB4MDMsIDB4MDQsCisJIDB4MDAsIDB4RjQsIDB4ODQsIDB4QTMsIDB4RkMsIDB4MDEsIDB4ODAsIDB4NjUsIDB4NDcsIDB4RDAsIDB4MjgsIDB4NDEsIDB4QTAsIDB4ODAsIDB4RkUsIDB4QTEsCisJIDB4MTYsIDB4MDMsIDB4MDksIDB4MDIsIDB4MTAsIDB4NjAsIDB4MTQsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MUUsIDB4MDAsIDB4MTAsIDB4NjAsIDB4MTQsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTUsIDB4MDAsIDB4MjgsIDB4NDEsIDB4RkUsIDB4QTEsIDB4RkYsIDB4RkYsIDB4MDksIDB4MDMsCisJIDB4MTAsIDB4NjAsIDB4MTQsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MDgsIDB4MDAsIDB4MTAsIDB4NjAsIDB4MTQsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MjAsIDB4NDAsIDB4MjAsIDB4MkEsIDB4NTgsIDB4MDAsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsCisJIDB4RjQsIDB4QTMsIDB4MDAsIDB4NjAsIDB4MUQsIDB4NjEsIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjUsIDB4NjAsIDB4RkUsIDB4ODEsIDB4QTEsIDB4N0YsIDB4QTEsCisJIDB4MDIsIDB4MDYsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDIsIDB4Q0YsIDB4ODMsIDB4RDQsIDB4ODAsIDB4MkQsIDB4MDMsCisJIDB4MTcsIDB4MDMsIDB4Q0YsIDB4ODMsIDB4NjEsIDB4NDQsIDB4ODAsIDB4QTAsIDB4MjgsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsCisJIDB4REQsIDB4ODEsIDB4QTEsIDB4RDIsIDB4Q0YsIDB4ODMsIDB4ODEsIDB4QTEsIDB4MjAsIDB4MDMsIDB4MDUsIDB4MDcsIDB4N0YsIDB4QTEsIDB4Q0MsIDB4ODQsCisJIDB4REQsIDB4ODEsIDB4RTQsIDB4MDMsIDB4RjcsIDB4MDEsIDB4MDAsIDB4RjQsIDB4MDAsIDB4QjgsIDB4MDQsIDB4NjEsIDB4RTQsIDB4MDMsIDB4RjIsIDB4MDEsCisJIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjMsIDB4NDYsIDB4NDgsIDB4NDEsIDB4NEEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDAsIDB4REYsIDB4ODMsIDB4QTMsIDB4RDksCisJIDB4NjQsIDB4NDQsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDAsIDB4REYsIDB4ODMsIDB4QTMsIDB4RDksIDB4Q0MsIDB4ODQsIDB4ODEsIDB4QTEsIDB4MDUsIDB4MDMsCisJIDB4N0YsIDB4QTEsIDB4RjcsIDB4MDQsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsIDB4RjQsIDB4MDEsIDB4MjAsIDB4RkUsIDB4MDAsIDB4QkIsIDB4MDIsIDB4NjAsCisJIDB4MDAsIDB4NjMsIDB4MDgsIDB4MjQsIDB4MTEsIDB4MDAsIDB4QkQsIDB4RDMsIDB4MDYsIDB4NjUsIDB4RDQsIDB4ODAsIDB4QkQsIDB4RDMsIDB4MEMsIDB4MDIsCisJIDB4NjAsIDB4NDAsIDB4NjAsIDB4M0EsIDB4MDksIDB4MDAsIDB4MUQsIDB4M0IsIDB4MDcsIDB4MDAsIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QjUsCisJIDB4MDAsIDB4N0UsIDB4NUMsIDB4RkIsIDB4NjUsIDB4NDQsIDB4NUIsIDB4RkIsIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsCisJIDB4RjYsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjMsIDB4OTcsIDB4RkQsIDB4MUEsIDB4NjAsIDB4NzIsIDB4NjMsIDB4MDAsIDB4NjQsCisJIDB4QTMsIDB4REIsIDB4MDYsIDB4QTMsIDB4MTAsIDB4NjAsIDB4NTAsIDB4NjQsIDB4QkQsIDB4REIsIDB4QkQsIDB4REIsIDB4MDYsIDB4NjQsIDB4QTMsIDB4REIsCisJIDB4MTAsIDB4NjAsIDB4NEUsIDB4NjIsIDB4RTAsIDB4NjAsIDB4MDcsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDIsIDB4RjEsIDB4MUEsIDB4NjAsIDB4NzYsIDB4NjIsCisJIDB4QTIsIDB4RDksIDB4MUEsIDB4NjAsIDB4N0UsIDB4NjMsIDB4MDAsIDB4NjQsIDB4QTMsIDB4REIsIDB4MDYsIDB4QTMsIDB4MTAsIDB4NjAsIDB4NTQsIDB4NjQsCisJIDB4QkQsIDB4REIsIDB4QkQsIDB4REIsIDB4MDYsIDB4NjQsIDB4QTMsIDB4REIsIDB4MTAsIDB4NjAsIDB4NTIsIDB4NjIsIDB4RTAsIDB4NjAsIDB4MTEsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MjgsIDB4NjAsIDB4MDQsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MUEsIDB4NjAsIDB4ODIsIDB4NjIsIDB4QTIsIDB4RDksIDB4MDAsIDB4NjAsCisJIDB4M0EsIDB4NjEsIDB4QUUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4NjQsIDB4RkIsIDB4QTksIDB4RjMsCisJIDB4MDcsIDB4RkEsIDB4QkMsIDB4RjMsIDB4MTksIDB4RkEsIDB4RjgsIDB4NjAsIDB4ODAsIDB4NjQsIDB4MEUsIDB4RkEsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsCisJIDB4M0YsIDB4RkEsIDB4MDAsIDB4NjAsIDB4M0EsIDB4NjEsIDB4QUUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsCisJIDB4NjUsIDB4RkIsIDB4QTksIDB4RjMsIDB4MDcsIDB4RkEsIDB4QkMsIDB4RjMsIDB4MTksIDB4RkEsIDB4MjQsIDB4NjAsIDB4ODAsIDB4NjQsIDB4MEUsIDB4RkEsCisJIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4M0YsIDB4RkEsIDB4MTAsIDB4NjAsIDB4MTQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NUEsIDB4REIsCisJIDB4MTAsIDB4NjAsIDB4MjgsIDB4NjIsIDB4RTAsIDB4NjAsIDB4NzcsIDB4NjQsIDB4QTIsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjMsCisJIDB4OTcsIDB4RkQsIDB4QkEsIDB4RkUsIDB4RkUsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4ODQsIDB4RkQsIDB4MEYsIDB4NjAsCisJIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MEYsIDB4NjAsCisJIDB4RjYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NUEsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NjAsIDB4MDQsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4MUEsIDB4NjAsIDB4ODIsIDB4NjIsIDB4QTIsIDB4RDksIDB4MjcsIDB4NjAsIDB4RkUsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4MEEsIDB4MUIsIDB4MDAsIDB4NjQsIDB4ODQsIDB4RkIsIDB4QkEsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4NUEsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QkEsIDB4RkUsIDB4OTcsIDB4RjMsIDB4MDAsIDB4NjMsIDB4ODQsIDB4RkQsIDB4MTAsIDB4QkMsCisJIDB4OTcsIDB4RkIsIDB4RkUsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsCisJIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDAsIDB4NjAsIDB4NjQsIDB4NjMsIDB4MUEsIDB4NjAsCisJIDB4NDIsIDB4NjQsIDB4QTAsIDB4REQsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RjgsIDB4NjIsCisJIDB4MDEsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTAsIDB4NjAsIDB4QzksIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsCisJIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QTMsIDB4MDEsIDB4MzEsIDB4NDAsIDB4MDQsIDB4MkEsIDB4RTMsIDB4MDEsIDB4MjAsIDB4NDAsCisJIDB4NTIsIDB4MjMsIDB4MTIsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4MTQsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RjgsIDB4NjIsIDB4ODEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTAsIDB4NjAsCisJIDB4QzksIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4REIsIDB4MDEsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsIDB4NjUsIDB4RjUsIDB4QkMsIDB4RjEsIDB4MTksIDB4RjgsIDB4ODEsIDB4RjEsCisJIDB4MkMsIDB4RjgsIDB4MzIsIDB4RjgsIDB4ODIsIDB4RjEsIDB4MkQsIDB4RjgsIDB4MzMsIDB4RjgsIDB4ODMsIDB4RjEsIDB4MkUsIDB4RjgsIDB4MzQsIDB4RjgsCisJIDB4RUIsIDB4RjEsIDB4MkYsIDB4RjgsIDB4RUMsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUQsIDB4RjEsIDB4MzEsIDB4RjgsIDB4MTEsIDB4NjAsIDB4NDgsIDB4NjQsCisJIDB4MkEsIDB4RkEsIDB4MDAsIDB4NjQsIDB4MkIsIDB4RkEsIDB4MjMsIDB4RkEsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4MjgsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsCisJIDB4MEYsIDB4NjAsIDB4RjgsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTEsIDB4NjAsIDB4MjMsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjUsIDB4RjUsIDB4MjMsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTgsIDB4N0IsIDB4MDEsCisJIDB4MTAsIDB4NjcsIDB4ODQsIDB4RkIsIDB4MDMsIDB4NjQsIDB4OTgsIDB4RkIsIDB4RkUsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsCisJIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RjgsIDB4NjIsIDB4ODEsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4RTEsIDB4NjAsIDB4NDYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MEQsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4RTAsIDB4NjAsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDYsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjAsIDB4NDEsIDB4OEUsIDB4RjMsIDB4QTUsIDB4ODAsCisJIDB4MDEsIDB4QjAsIDB4MDEsIDB4MDIsIDB4MDYsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MUEsIDB4NjAsIDB4NDIsIDB4NjUsIDB4QTUsIDB4RDMsIDB4MDEsIDB4NjMsIDB4OEMsIDB4RkQsIDB4MjcsIDB4MUIsIDB4MDAsIDB4NjAsCisJIDB4NjQsIDB4NjQsIDB4QTUsIDB4REIsIDB4NjUsIDB4RjUsIDB4QkMsIDB4RjEsIDB4MTksIDB4RjgsIDB4ODEsIDB4RjEsIDB4MkMsIDB4RjgsIDB4MzIsIDB4RjgsCisJIDB4ODIsIDB4RjEsIDB4MkQsIDB4RjgsIDB4MzMsIDB4RjgsIDB4ODMsIDB4RjEsIDB4MkUsIDB4RjgsIDB4MzQsIDB4RjgsIDB4RUIsIDB4RjEsIDB4MkYsIDB4RjgsCisJIDB4RUMsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUQsIDB4RjEsIDB4MzEsIDB4RjgsIDB4MTEsIDB4NjAsIDB4NDgsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MDAsIDB4NjQsCisJIDB4MkIsIDB4RkEsIDB4MjMsIDB4RkEsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4MjgsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDYsIDB4MDAsIDB4OTcsIDB4RjMsIDB4MzIsIDB4NDAsCisJIDB4MDIsIDB4MjYsIDB4MDIsIDB4MDAsIDB4NDAsIDB4MkEsIDB4REEsIDB4RkUsIDB4QzEsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RjgsIDB4NjIsIDB4MDEsIDB4NjAsIDB4ODIsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTEsIDB4NjAsIDB4QTQsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDEsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4RTAsIDB4NjAsIDB4NzcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDYsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4QkEsIDB4RkUsIDB4RTMsIDB4NjAsIDB4QzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsIDB4OEMsIDB4RkIsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjUsCisJIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsIDB4QkEsIDB4RkUsIDB4QzEsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MTAsIDB4NjAsIDB4MTQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RjgsIDB4NjIsIDB4MDEsIDB4NjAsIDB4NDYsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4RTEsIDB4NjAsIDB4RDcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsCisJIDB4RjYsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDUsIDB4MDMsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4RTAsIDB4NjAsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsCisJIDB4M0MsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4MTQsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MzQsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MEMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjgsIDB4NjAsIDB4MDAsIDB4NjIsIDB4QTIsIDB4RDEsCisJIDB4OTcsIDB4RjMsIDB4MDAsIDB4NjEsIDB4RDEsIDB4ODAsIDB4RjcsIDB4QjQsIDB4RjAsIDB4MDMsIDB4OTcsIDB4RkIsIDB4MzUsIDB4MDAsIDB4MDAsIDB4NjAsCisJIDB4MTAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MEYsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjgsIDB4NjAsIDB4MDAsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4OTcsIDB4RjMsIDB4MDAsIDB4NjEsIDB4RDEsIDB4ODAsIDB4MDgsIDB4QkMsIDB4MDMsIDB4MDIsIDB4RTIsIDB4NjAsIDB4RTgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4OTcsIDB4RkIsIDB4MjEsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDUsIDB4MDMsCisJIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4RTIsIDB4NjAsIDB4RTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4QTIsIDB4RDEsCisJIDB4MDAsIDB4NjAsIDB4NDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QzUsIDB4MDEsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4RTMsIDB4NjAsCisJIDB4QzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjMsIDB4OTcsIDB4RjMsIDB4OEMsIDB4RkQsIDB4MDEsIDB4QkMsCisJIDB4QzEsIDB4RkUsIDB4OTcsIDB4RkIsIDB4RDIsIDB4RjEsIDB4MUEsIDB4NjAsIDB4NzYsIDB4NjIsIDB4QTIsIDB4RDksIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4MTQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RjgsIDB4NjIsCisJIDB4MDEsIDB4NjAsIDB4MzQsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTIsIDB4NjAsIDB4NjIsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MjQsIDB4NjAsCisJIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NzIsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTAsIDB4ODAsCisJIDB4OUMsIDB4ODQsIDB4MEUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NzIsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4RTAsIDB4NjAsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MTcsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4OTcsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MkEsIDB4MDEsIDB4MDAsIDB4RDIsIDB4MDEsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsCisJIDB4NzIsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4OTcsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4NEQsIDB4MDAsIDB4NTQsIDB4MDAsIDB4MTAsIDB4NjAsIDB4MTQsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsCisJIDB4MTAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDgsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4OTcsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4QkMsIDB4OTcsIDB4RkIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsCisJIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QUIsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsCisJIDB4MEMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NzIsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QTAsIDB4ODAsCisJIDB4OUMsIDB4ODQsIDB4MEMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NzIsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MTMsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDgsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4OTcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MEEsIDB4MDAsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4MDAsIDB4OTcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4OTcsIDB4RkIsIDB4RTEsIDB4NjAsIDB4MkEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjcsIDB4NjAsIDB4RkUsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4RTMsIDB4NjAsCisJIDB4RDEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OTcsIDB4RjMsIDB4MDEsIDB4NjMsIDB4OEMsIDB4RkQsIDB4MjEsIDB4QkMsIDB4OTcsIDB4RkIsIDB4NjQsIDB4RjUsCisJIDB4ODEsIDB4RjEsIDB4MkMsIDB4RjgsIDB4ODIsIDB4RjEsIDB4MkQsIDB4RjgsIDB4ODMsIDB4RjEsIDB4MkUsIDB4RjgsIDB4ODUsIDB4RjEsIDB4QzAsIDB4NjcsCisJIDB4QjAsIDB4ODQsIDB4MkIsIDB4RkEsIDB4QkMsIDB4RjEsIDB4MTksIDB4RjgsIDB4RUIsIDB4RjEsIDB4MkYsIDB4RjgsIDB4RUMsIDB4RjEsIDB4MzAsIDB4RjgsCisJIDB4RUQsIDB4RjEsIDB4MzEsIDB4RjgsIDB4MTAsIDB4NjAsIDB4QTQsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsCisJIDB4MjgsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4QzEsIDB4RkUsIDB4MUEsIDB4NjAsIDB4NzYsIDB4NjIsIDB4MDAsIDB4NjAsIDB4NTAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsCisJIDB4MUEsIDB4NjAsIDB4NzIsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MEYsIDB4NjAsCisJIDB4RjYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4MTQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsCisJIDB4RjgsIDB4NjIsIDB4MDEsIDB4NjAsIDB4MkMsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTMsIDB4NjAsIDB4M0EsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTAsIDB4ODAsCisJIDB4OUMsIDB4ODQsIDB4MEUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NzIsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4RTAsIDB4NjAsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTAsIDB4NjAsIDB4MTQsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsCisJIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4OEQsIDB4MDEsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDgsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4OTcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QjAsCisJIDB4RkYsIDB4RkYsIDB4NEUsIDB4MDMsIDB4N0QsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsCisJIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NDUsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MTYsIDB4MDMsCisJIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NzIsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MjgsIDB4NjAsIDB4MDAsIDB4NjIsIDB4QTIsIDB4RDMsIDB4OTcsIDB4RjMsIDB4MDAsIDB4QTgsCisJIDB4RjcsIDB4QjQsIDB4MkUsIDB4MDMsIDB4OTcsIDB4RkIsIDB4RTIsIDB4NjAsIDB4M0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MTcsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsCisJIDB4NzIsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MjgsIDB4NjAsIDB4MDAsIDB4NjIsCisJIDB4QTIsIDB4RDMsIDB4OTcsIDB4RjMsIDB4MDAsIDB4QTgsIDB4MDgsIDB4QkMsIDB4MDEsIDB4MDIsIDB4NDIsIDB4MDEsIDB4OTcsIDB4RkIsIDB4RTIsIDB4NjAsCisJIDB4M0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QTAsIDB4ODAsCisJIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDIsIDB4MDAsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCisJIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NzIsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4RkYsIDB4OTcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4OTcsIDB4RkIsIDB4RTEsIDB4NjAsIDB4MkEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4OTcsIDB4RjMsIDB4MDEsIDB4NjMsIDB4OEMsIDB4RkQsIDB4MDEsIDB4QkMsIDB4OTcsIDB4RkIsIDB4MDAsIDB4NjQsIDB4ODQsIDB4RkIsIDB4QzEsIDB4RkUsCisJIDB4MjksIDB4MDAsIDB4OTcsIDB4RjMsIDB4MDEsIDB4NjMsIDB4OEMsIDB4RkQsIDB4MDEsIDB4QkMsIDB4OTcsIDB4RkIsIDB4MDAsIDB4NjQsIDB4ODQsIDB4RkIsCisJIDB4NjQsIDB4RjUsIDB4ODEsIDB4RjEsIDB4MkMsIDB4RjgsIDB4ODIsIDB4RjEsIDB4MkQsIDB4RjgsIDB4ODMsIDB4RjEsIDB4MkUsIDB4RjgsIDB4ODUsIDB4RjEsCisJIDB4QzAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4MkIsIDB4RkEsIDB4QkMsIDB4RjEsIDB4MTksIDB4RjgsIDB4RUIsIDB4RjEsIDB4MkYsIDB4RjgsIDB4RUMsIDB4RjEsCisJIDB4MzAsIDB4RjgsIDB4RUQsIDB4RjEsIDB4MzEsIDB4RjgsIDB4MDAsIDB4NjAsIDB4QTQsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsCisJIDB4MjQsIDB4NjAsIDB4MjgsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4N0UsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsCisJIDB4MTQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RjgsIDB4NjIsIDB4MDMsIDB4NjAsIDB4MEUsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4RTQsIDB4NjAsIDB4MTYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MEUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4N0UsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4RkYsIDB4RTAsIDB4NjAsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MEEsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsCisJIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QzYsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsCisJIDB4MTUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4MTQsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4OEIsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MTIsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QUMsIDB4MDEsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4QUQsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4MTAsIDB4NjcsIDB4ODQsIDB4RkIsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4MTQsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjUsIDB4RjUsIDB4QkMsIDB4RjEsIDB4MTksIDB4RjgsIDB4ODEsIDB4RjEsIDB4MkMsIDB4RjgsIDB4MzIsIDB4RjgsCisJIDB4ODIsIDB4RjEsIDB4MkQsIDB4RjgsIDB4MzMsIDB4RjgsIDB4ODMsIDB4RjEsIDB4MkUsIDB4RjgsIDB4MzQsIDB4RjgsIDB4RUIsIDB4RjEsIDB4MkYsIDB4RjgsCisJIDB4RUMsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUQsIDB4RjEsIDB4MzEsIDB4RjgsIDB4MTEsIDB4NjAsIDB4NDgsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MDAsIDB4NjQsCisJIDB4MkIsIDB4RkEsIDB4MjMsIDB4RkEsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4MjgsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4OTcsIDB4RjMsIDB4QzEsIDB4RkUsIDB4RkUsIDB4QjQsCisJIDB4OTcsIDB4RkIsIDB4MEYsIDB4NjAsIDB4RjgsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDMsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTQsIDB4NjAsIDB4OTQsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsCisJIDB4MDIsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjksIDB4MDEsIDB4NjUsIDB4RjUsCisJIDB4MjMsIDB4RjIsIDB4OTgsIDB4RjMsIDB4MDQsIDB4MTgsIDB4Q0MsIDB4ODQsIDB4OTgsIDB4RkIsIDB4MDEsIDB4MDMsIDB4MjEsIDB4MDEsIDB4RTEsIDB4NjAsCisJIDB4MkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NjAsIDB4RkUsIDB4NjIsIDB4QTIsIDB4RDMsIDB4ODQsIDB4RjEsIDB4MDIsIDB4QTgsIDB4MkEsIDB4RjIsCisJIDB4MDMsIDB4MDIsIDB4QjAsIDB4ODQsIDB4MkEsIDB4RkEsIDB4MDgsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RjYsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsCisJIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4MjIsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsCisJIDB4MjQsIDB4NjAsIDB4MzQsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4REIsIDB4MDIsIDB4QkYsIDB4NjAsCisJIDB4RTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RkMsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUEsIDB4NjAsIDB4QUUsIDB4NjMsIDB4MDAsIDB4NjQsIDB4QTMsIDB4REIsCisJIDB4MDYsIDB4QTMsIDB4MTAsIDB4NjAsIDB4NUMsIDB4NjQsIDB4QkQsIDB4REIsIDB4QkQsIDB4REIsIDB4MDYsIDB4NjQsIDB4QTMsIDB4REIsIDB4MTAsIDB4NjAsCisJIDB4NUEsIDB4NjIsIDB4RTQsIDB4NjAsIDB4RDIsIDB4NjQsIDB4QTIsIDB4REIsIDB4MUYsIDB4NjAsIDB4NUMsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MUEsIDB4NjAsCisJIDB4QjIsIDB4NjIsIDB4QTIsIDB4RDksIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4RTQsIDB4NjAsIDB4RjksIDB4NjQsIDB4QTIsIDB4REIsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4ODAsIDB4NjUsIDB4QTUsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsCisJIDB4RjMsIDB4QjQsIDB4MDEsIDB4QjAsIDB4QTUsIDB4REIsIDB4MEMsIDB4MDIsIDB4MTIsIDB4NjAsIDB4MjYsIDB4NjEsIDB4MDAsIDB4NjQsIDB4MUEsIDB4NjMsCisJIDB4NTksIDB4REIsIDB4RkUsIDB4MUYsIDB4MUYsIDB4NjAsIDB4NUMsIDB4NjEsIDB4MEEsIDB4NjQsIDB4MUEsIDB4NjMsIDB4NTksIDB4REIsIDB4RkUsIDB4MUYsCisJIDB4N0YsIDB4RjMsIDB4N0UsIDB4RkIsIDB4MDEsIDB4NjQsIDB4N0YsIDB4RkIsIDB4MDEsIDB4NjEsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsCisJIDB4RTEsIDB4ODEsIDB4RkIsIDB4MDEsIDB4QkEsIDB4RjMsIDB4NjEsIDB4NDUsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4NjksIDB4MDMsIDB4MEYsIDB4NjAsCisJIDB4RkMsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEIsIDB4MDQsIDB4MEYsIDB4NjAsIDB4RkUsIDB4NjIsIDB4NDAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTUsIDB4NjAsIDB4MUYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4N0YsIDB4RjEsIDB4MjQsIDB4NjAsIDB4OUEsIDB4NjIsIDB4QTIsIDB4RDksIDB4MUUsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsCisJIDB4MEYsIDB4NjAsIDB4RkUsIDB4NjIsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTUsIDB4NjAsIDB4NDMsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QkUsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NDAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RkMsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MEYsIDB4NjAsIDB4RkUsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MUEsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTUsIDB4NjAsIDB4NjQsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4QUUsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RkMsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsCisJIDB4MDgsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MEMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsCisJIDB4MUEsIDB4NjAsIDB4QUUsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MjYsIDB4MDAsCisJIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MEIsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjQsIDB4NjAsCisJIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4QUUsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsCisJIDB4MTIsIDB4NjAsIDB4MjYsIDB4NjUsIDB4N0YsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDQsIDB4QTQsIDB4RjIsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDYsCisJIDB4RjEsIDB4QTQsIDB4MDEsIDB4MzYsIDB4MEIsIDB4MDAsIDB4MDAsIDB4MzYsIDB4MDQsIDB4QTQsIDB4NjAsIDB4NDEsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODQsCisJIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QjgsIDB4NjEsIDB4NDQsIDB4RUYsIDB4MDIsIDB4NzUsIDB4MDEsIDB4MUYsIDB4NjAsIDB4ODAsIDB4NjUsCisJIDB4QTUsIDB4RDMsIDB4N0UsIDB4RjEsIDB4RkMsIDB4QjQsIDB4QTUsIDB4REIsIDB4N0YsIDB4RjksIDB4MEYsIDB4NjAsIDB4RkMsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEIsIDB4MDQsIDB4MEYsIDB4NjAsIDB4RkUsIDB4NjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4RTUsIDB4NjAsIDB4QTUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0YsIDB4RjEsIDB4MjQsIDB4NjAsCisJIDB4OUEsIDB4NjIsIDB4QTIsIDB4RDksIDB4MUUsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RkUsIDB4NjIsCisJIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTUsIDB4NjAsIDB4QzksIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4QkUsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RkMsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsCisJIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4RTYsIDB4NjAsIDB4RTksIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTYsIDB4NjAsIDB4RUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsCisJIDB4ODAsIDB4NjMsIDB4QTMsIDB4RDMsIDB4MjYsIDB4NDYsIDB4MDIsIDB4QjAsIDB4M0YsIDB4RjIsIDB4RjYsIDB4MDMsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsCisJIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjUsIDB4RDQsIDB4ODAsIDB4MDAsIDB4RjQsIDB4MDIsIDB4MjQsIDB4NjUsIDB4NDQsIDB4MTIsIDB4NjUsIDB4NjAsIDB4NDEsCisJIDB4QTUsIDB4RDAsIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsCisJIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsIDB4MDUsIDB4MDMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsIDB4RjAsIDB4MDIsCisJIDB4MDIsIDB4NjAsIDB4MTQsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QjQsIDB4RkYsIDB4RkYsIDB4MzcsIDB4MDIsIDB4MjksIDB4NjAsCisJIDB4QTQsIDB4NjQsIDB4QTAsIDB4RDEsIDB4MUYsIDB4NjAsIDB4MEUsIDB4NjMsIDB4MzEsIDB4MTgsIDB4NjQsIDB4NDEsIDB4NDQsIDB4NEIsIDB4MjksIDB4NjAsCisJIDB4QTYsIDB4NjUsIDB4QTUsIDB4RDEsIDB4REEsIDB4ODUsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsIDB4MDUsIDB4MDMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsIDB4RjQsIDB4MDIsIDB4MDIsIDB4NjAsIDB4MUEsIDB4NjEsIDB4QTEsIDB4RDMsCisJIDB4MkIsIDB4NDUsIDB4NjAsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MUEsIDB4MDAsIDB4MDEsIDB4MzYsIDB4MTgsIDB4MDAsIDB4RDQsIDB4ODAsIDB4NjUsIDB4NDMsCisJIDB4QjAsIDB4MDIsIDB4MUYsIDB4NjAsIDB4MEMsIDB4NjQsIDB4RTMsIDB4ODMsIDB4RkUsIDB4QTMsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDMsIDB4NDAsIDB4NEIsCisJIDB4RDAsIDB4ODAsIDB4MkIsIDB4NDQsIDB4MDIsIDB4MDIsIDB4RjksIDB4MUYsIDB4MDksIDB4MDAsIDB4MDIsIDB4NjAsIDB4MUEsIDB4NjEsIDB4NjUsIDB4NDMsCisJIDB4RTMsIDB4ODMsIDB4RkUsIDB4QTMsIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4OUMsIDB4MUIsIDB4RkMsIDB4MUYsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjAsCisJIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4NjQsIDB4NDEsIDB4MDEsIDB4MDUsIDB4NjAsIDB4NDEsIDB4RjQsIDB4QTEsIDB4MDIsIDB4NjAsCisJIDB4MTgsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDEsIDB4RkQsIDB4QTAsIDB4RjksIDB4QTAsIDB4MDgsIDB4MDMsIDB4MzUsIDB4MDMsIDB4RkUsIDB4QTEsCisJIDB4NjQsIDB4NDIsIDB4RTIsIDB4ODUsIDB4RDEsIDB4ODEsIDB4QzcsIDB4ODMsIDB4ODQsIDB4MDYsIDB4RjMsIDB4MDEsIDB4MTIsIDB4NjAsIDB4MjYsIDB4NjUsCisJIDB4QkQsIDB4RDMsIDB4RkQsIDB4QTEsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODUsIDB4MDUsIDB4NjQsIDB4QTUsIDB4REIsIDB4MUYsIDB4NjAsIDB4ODAsIDB4NjUsCisJIDB4QTUsIDB4RDMsIDB4NDEsIDB4NDgsIDB4MDQsIDB4QkMsIDB4QTUsIDB4REIsIDB4MTIsIDB4NjAsIDB4MjgsIDB4NjUsIDB4MTIsIDB4NjAsIDB4NDQsIDB4NjEsCisJIDB4NDksIDB4RDMsIDB4RDYsIDB4ODAsIDB4MDAsIDB4QjgsIDB4MEUsIDB4MDMsIDB4RkIsIDB4MDMsIDB4NjIsIDB4NDUsIDB4MTIsIDB4NjAsIDB4MjYsIDB4NjEsCisJIDB4NTksIDB4RDMsIDB4RDYsIDB4ODAsIDB4MDAsIDB4QjgsIDB4MDYsIDB4MDMsIDB4RkIsIDB4MDMsIDB4MDUsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDYsIDB4ODAsCisJIDB4MDIsIDB4QTIsIDB4RkMsIDB4MDIsIDB4MEYsIDB4NjAsIDB4RkMsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MjgsIDB4NDEsIDB4QzUsIDB4MDEsIDB4NjMsIDB4NDUsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjMsIDB4RDcsIDB4ODMsCisJIDB4RUIsIDB4ODMsIDB4RDMsIDB4ODAsIDB4NjUsIDB4NDMsIDB4MDEsIDB4MDUsIDB4NTQsIDB4MDAsIDB4RkUsIDB4QTMsIDB4NDMsIDB4NEIsIDB4QTMsIDB4RDMsCisJIDB4NjMsIDB4NDEsIDB4NjAsIDB4NDMsIDB4MUIsIDB4NjAsIDB4QzYsIDB4NjQsIDB4QTAsIDB4REQsIDB4RTMsIDB4ODMsIDB4RkUsIDB4QTMsIDB4NTksIDB4RDEsCisJIDB4NTgsIDB4RDksIDB4RkQsIDB4MUYsIDB4MDAsIDB4NjMsIDB4NTgsIDB4REQsIDB4MkIsIDB4NDMsIDB4QkQsIDB4RDEsIDB4MUYsIDB4NjAsIDB4NzgsIDB4NjQsCisJIDB4NjQsIDB4NDEsIDB4QkQsIDB4RDEsIDB4NTgsIDB4RDksIDB4QkQsIDB4RDEsIDB4RkMsIDB4QTEsIDB4NDEsIDB4NEIsIDB4NTgsIDB4RDksIDB4QkQsIDB4RDEsCisJIDB4QTAsIDB4RDksIDB4MTIsIDB4NjAsIDB4MjYsIDB4NjEsIDB4MTIsIDB4NjAsIDB4NDIsIDB4NjUsIDB4MDAsIDB4NjQsIDB4RDUsIDB4ODAsIDB4NTksIDB4REIsCisJIDB4RkQsIDB4MDIsIDB4MTIsIDB4NjAsIDB4MjQsIDB4NjUsIDB4QkQsIDB4RDMsIDB4QTMsIDB4RDEsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODIsIDB4MTIsIDB4NjAsCisJIDB4NDQsIDB4NjUsIDB4MDUsIDB4NjQsIDB4NjQsIDB4NDEsIDB4NUEsIDB4REIsIDB4RDYsIDB4ODAsIDB4Q0QsIDB4ODEsIDB4MjIsIDB4MDMsIDB4RkIsIDB4MDIsCisJIDB4MUYsIDB4NjAsIDB4NUEsIDB4NjEsIDB4NEIsIDB4RDEsIDB4MDQsIDB4QTMsIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RjYsIDB4QTAsIDB4QzEsIDB4ODIsCisJIDB4MDUsIDB4MDUsIDB4NjQsIDB4NDEsIDB4NUEsIDB4REIsIDB4Q0QsIDB4ODEsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MDIsIDB4MkIsIDB4NDEsIDB4RkQsIDB4QTEsCisJIDB4NDEsIDB4NEIsIDB4REYsIDB4MDcsIDB4MEYsIDB4NjAsIDB4RkMsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MUYsIDB4NjAsIDB4ODAsIDB4NjUsIDB4QTUsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDgsIDB4QkMsIDB4QTUsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4OUEsIDB4RkYsIDB4NUMsIDB4NjEsCisJIDB4M0YsIDB4RjIsIDB4RkYsIDB4RkYsIDB4ODMsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjgsIDB4MzksIDB4MDAsIDB4RjQsIDB4QTQsIDB4NjAsIDB4NDMsCisJIDB4MDAsIDB4RjQsIDB4MUUsIDB4NjIsIDB4NjAsIDB4RkUsIDB4QTIsIDB4RDIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODUsIDB4MzYsIDB4MTAsIDB4MDAsCisJIDB4REUsIDB4ODIsIDB4QTIsIDB4RDIsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4RkYsIDB4QjQsIDB4MDIsIDB4QTQsIDB4NTMsIDB4OTMsIDB4NTEsIDB4OTEsCisJIDB4MDUsIDB4MEUsIDB4RkYsIDB4QTQsIDB4NDIsIDB4OTIsIDB4NjMsIDB4NDAsIDB4NjEsIDB4NDAsIDB4RUMsIDB4MUMsIDB4OTgsIDB4RkYsIDB4RDksIDB4MDEsCisJIDB4MjAsIDB4RkUsIDB4MDUsIDB4NjQsIDB4MDAsIDB4N0MsIDB4NDIsIDB4OTIsIDB4NjAsIDB4RkUsIDB4REUsIDB4ODIsIDB4QTIsIDB4RDIsIDB4REUsIDB4ODIsCisJIDB4QTIsIDB4RDAsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4NjQsIDB4NUYsIDB4NjAsIDB4NDMsIDB4NjAsIDB4RkUsIDB4REUsIDB4ODIsIDB4QTIsIDB4RDIsCisJIDB4REUsIDB4ODIsIDB4QTIsIDB4RDAsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4NjQsIDB4NUYsIDB4OTgsIDB4RkYsIDB4MDEsIDB4QTMsIDB4MDEsIDB4QTQsCisJIDB4MkQsIDB4NjAsIDB4NUEsIDB4NjIsIDB4QTIsIDB4REQsIDB4MkQsIDB4NjAsIDB4NUUsIDB4NjIsIDB4QTIsIDB4REIsIDB4QkEsIDB4MDEsIDB4OTgsIDB4RkYsCisJIDB4QjgsIDB4MDEsIDB4MDAsIDB4NjAsIDB4QTAsIDB4NjEsIDB4QUUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsCisJIDB4NUQsIDB4RkIsIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsIDB4ODAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4Q0MsIDB4RjEsIDB4MTksIDB4RjgsIDB4MDAsIDB4NjQsCisJIDB4M0UsIDB4RkEsIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjQsIDB4MEUsIDB4RkEsIDB4QTksIDB4RjEsIDB4MDcsIDB4RjgsIDB4NjcsIDB4NDQsIDB4MkMsIDB4RkEsCisJIDB4MkQsIDB4RkEsIDB4MkUsIDB4RkEsIDB4MTAsIDB4NjAsIDB4MUMsIDB4NjIsIDB4RTgsIDB4NjAsIDB4REYsIDB4NjQsIDB4QTIsIDB4REIsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4NUQsIDB4RjUsIDB4RUIsIDB4RjEsIDB4MkYsIDB4RjgsIDB4RUMsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUQsIDB4RjEsIDB4MzEsIDB4RjgsCisJIDB4ODEsIDB4RjEsIDB4MzIsIDB4RjgsIDB4ODIsIDB4RjEsIDB4MzMsIDB4RjgsIDB4ODMsIDB4RjEsIDB4MzQsIDB4RjgsIDB4MjgsIDB4NjAsIDB4MkMsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4MDIsIDB4NjQsIDB4NjQsIDB4NDAsIDB4RkUsIDB4MjYsIDB4MTAsIDB4QkMsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MTAsIDB4QkMsCisJIDB4MkYsIDB4NjAsIDB4NDQsIDB4NjIsIDB4QTIsIDB4REIsIDB4MjgsIDB4NjAsIDB4MkEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MkQsIDB4NjAsIDB4N0EsIDB4NjQsCisJIDB4MDIsIDB4MTgsIDB4MjcsIDB4NjAsIDB4REEsIDB4NjQsIDB4MkUsIDB4NjAsIDB4QUUsIDB4NjIsIDB4QTIsIDB4REIsIDB4MkUsIDB4NjAsIDB4Q0EsIDB4NjIsCisJIDB4QTIsIDB4REIsIDB4MkQsIDB4NjAsIDB4QTYsIDB4NjEsIDB4MjgsIDB4NjAsIDB4Q0MsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MkUsIDB4NjAsIDB4OTYsIDB4NjUsCisJIDB4RkUsIDB4QTQsIDB4RTAsIDB4ODQsIDB4MDIsIDB4MDUsIDB4NjcsIDB4NDQsIDB4OTksIDB4MDAsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODUsIDB4MkQsIDB4NjAsCisJIDB4Q0MsIDB4NjIsIDB4QTIsIDB4RDMsIDB4QTUsIDB4RDEsIDB4REEsIDB4ODUsIDB4MkQsIDB4NjAsIDB4QzQsIDB4NjIsIDB4QTAsIDB4ODMsIDB4QTIsIDB4REQsCisJIDB4QTUsIDB4RDEsIDB4MkQsIDB4NjAsIDB4QzIsIDB4NjIsIDB4QTAsIDB4ODMsIDB4QTIsIDB4REQsIDB4MkQsIDB4NjAsIDB4QTAsIDB4NjEsIDB4REQsIDB4NjAsCisJIDB4MDYsIDB4NjQsIDB4QTEsIDB4REIsIDB4MDYsIDB4QTEsIDB4MkQsIDB4NjAsIDB4Q0EsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MkQsIDB4NjAsIDB4QzIsIDB4NjIsCisJIDB4NjAsIDB4NDAsIDB4RkQsIDB4QTAsIDB4QTIsIDB4RDMsIDB4NzQsIDB4MDMsIDB4NTAsIDB4NjAsIDB4MDAsIDB4N0MsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsCisJIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjAsIDB4RjIsIDB4NjMsIDB4MEUsIDB4MDAsIDB4MDQsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDIsIDB4NjAsIDB4RjIsIDB4NjMsCisJIDB4MDksIDB4MDAsIDB4MTAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDQsIDB4NjAsIDB4RjIsIDB4NjMsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsCisJIDB4MDUsIDB4NjAsIDB4RjIsIDB4NjMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MkQsIDB4NjAsIDB4Q0EsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MkQsIDB4NjAsCisJIDB4QzQsIDB4NjIsIDB4RkUsIDB4QTAsIDB4QTIsIDB4RDMsIDB4NTQsIDB4MDMsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjMsIDB4NTksIDB4REQsIDB4NjEsIDB4NDUsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDAsIDB4NjAsIDB4RjIsIDB4NjMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4NjAsIDB4NDAsCisJIDB4MDIsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDEsIDB4NjAsIDB4RjIsIDB4NjMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MkEsCisJIDB4MDQsIDB4MDAsIDB4MDIsIDB4NjAsIDB4RjIsIDB4NjMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDQsIDB4MDAsCisJIDB4MDQsIDB4NjAsIDB4RjIsIDB4NjMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDUsIDB4NjAsCisJIDB4RjIsIDB4NjMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4RDUsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4QTUsIDB4REQsIDB4MkQsIDB4NjAsCisJIDB4Q0EsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MkQsIDB4NjAsIDB4QzYsIDB4NjIsIDB4RkYsIDB4QTAsIDB4QTIsIDB4RDMsIDB4MjEsIDB4MDMsIDB4MDAsIDB4NjAsCisJIDB4MDAsIDB4NjMsIDB4NTksIDB4REQsIDB4NjEsIDB4NDUsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDAsIDB4NjAsIDB4RjIsIDB4NjMsCisJIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDEsIDB4NjAsIDB4RjIsIDB4NjMsIDB4NTksIDB4RDksCisJIDB4NTksIDB4REQsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDIsIDB4NjAsIDB4RjIsIDB4NjMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsCisJIDB4RDUsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4QTUsIDB4REQsIDB4MkQsIDB4NjAsIDB4QzgsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NTksIDB4RDksCisJIDB4MkQsIDB4NjAsIDB4QTAsIDB4NjUsIDB4RDUsIDB4ODQsIDB4REQsIDB4N0YsIDB4QTUsIDB4REIsIDB4NjUsIDB4NDQsIDB4MkUsIDB4NjAsIDB4QjgsIDB4NjIsCisJIDB4QTIsIDB4REIsIDB4MkUsIDB4NjAsIDB4RDQsIDB4NjIsIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RDQsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4RTgsIDB4NjAsIDB4MkYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsCisJIDB4RDIsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4N0YsIDB4RjEsIDB4MkYsIDB4NjAsIDB4MEUsIDB4NjIsIDB4QTIsIDB4RDksIDB4MkUsIDB4NjAsCisJIDB4QjYsIDB4NjUsIDB4RTksIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUQsIDB4RjUsIDB4MDAsIDB4RjQsIDB4ODAsIDB4RjEsCisJIDB4MDYsIDB4RjgsIDB4MkYsIDB4NjAsIDB4NDQsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MDcsIDB4RkEsIDB4MkUsIDB4NjAsIDB4QUUsIDB4NjQsIDB4NDAsIDB4NDgsCisJIDB4MTAsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RTgsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUQsIDB4RjUsCisJIDB4M0YsIDB4RkMsIDB4REIsIDB4RkUsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4MjgsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDQsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4RjMsIDB4OUIsIDB4RkUsIDB4RkQsIDB4QTAsIDB4MjUsIDB4MDQsIDB4MjQsIDB4MDIsIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsIDB4MDAsIDB4RjQsCisJIDB4MDksIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MDAsIDB4M0EsIDB4MUMsIDB4MDAsIDB4NjAsIDB4NDMsIDB4MDAsIDB4MzYsIDB4MUMsIDB4MDAsCisJIDB4RTAsIDB4QTAsIDB4REEsIDB4ODUsIDB4MTYsIDB4MDcsIDB4MkQsIDB4NjAsIDB4N0EsIDB4NjEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4RDMsIDB4ODAsCisJIDB4Q0IsIDB4ODMsIDB4MEYsIDB4MDIsIDB4MDcsIDB4MEUsIDB4NTksIDB4RDMsIDB4QTUsIDB4RDAsIDB4REEsIDB4ODUsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4MDIsIDB4RjksIDB4MUYsIDB4MTMsIDB4MUUsIDB4QTUsIDB4RDAsIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4OTAsIDB4ODAsIDB4RkYsIDB4MjIsCisJIDB4MEQsIDB4MDAsIDB4RTgsIDB4NjAsIDB4REQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NjAsIDB4MkEsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MjcsIDB4NjAsIDB4REEsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MkQsIDB4NjAsIDB4N0EsIDB4NjQsCisJIDB4MkUsIDB4NjAsIDB4Q0EsIDB4NjIsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDYsIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsCisJIDB4MzEsIDB4RjIsIDB4MkUsIDB4RkEsIDB4RUIsIDB4RjEsIDB4MkYsIDB4RjgsIDB4RUMsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUQsIDB4RjEsIDB4MzEsIDB4RjgsCisJIDB4ODEsIDB4RjEsIDB4MzIsIDB4RjgsIDB4ODIsIDB4RjEsIDB4MzMsIDB4RjgsIDB4ODMsIDB4RjEsIDB4MzQsIDB4RjgsIDB4NTAsIDB4NjMsIDB4MkEsIDB4RkMsCisJIDB4Q0MsIDB4RjMsIDB4MTksIDB4RkEsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4QTksIDB4RjMsIDB4MDcsIDB4RkEsIDB4MDAsIDB4RjQsIDB4ODAsIDB4RjEsCisJIDB4MDYsIDB4RjgsIDB4MkYsIDB4NjAsIDB4NDQsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MDcsIDB4RkEsIDB4MkUsIDB4NjAsIDB4RDIsIDB4NjUsIDB4RTksIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4MzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkUsIDB4NjAsIDB4Q0EsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MTAsIDB4NjEsIDB4MDAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4RTgsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RkMsIDB4MjQsIDB4NjAsCisJIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4MjgsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsCisJIDB4RDIsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NUEsIDB4REIsIDB4MDAsIDB4NjQsIDB4OTQsIDB4RkIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MkYsIDB4NjAsIDB4NDYsIDB4NjIsIDB4QTIsIDB4REIsIDB4Q0QsIDB4ODEsIDB4MjgsIDB4RDMsIDB4NUEsIDB4ODgsIDB4REMsIDB4ODMsIDB4MzksIDB4MTgsCisJIDB4RkIsIDB4MDMsIDB4NjEsIDB4NDAsIDB4N0YsIDB4M0EsIDB4MDcsIDB4MDAsIDB4MkYsIDB4NjAsIDB4NDYsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MDMsIDB4NjEsCisJIDB4N0MsIDB4QTQsIDB4QTIsIDB4REIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4RkUsIDB4QTMsIDB4RDEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDgsIDB4NjEsIDB4NDAsCisJIDB4N0YsIDB4M0EsIDB4MDksIDB4MDAsIDB4MjAsIDB4RkUsIDB4MkYsIDB4NjAsIDB4NDYsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MDMsIDB4NjEsIDB4N0MsIDB4QTQsCisJIDB4QTIsIDB4REIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4RkUsIDB4Q0YsIDB4ODMsIDB4QTMsIDB4RDMsIDB4REQsIDB4ODEsIDB4QTEsIDB4REEsIDB4RkYsIDB4QjQsCisJIDB4MDAsIDB4N0YsIDB4MTUsIDB4MDMsIDB4REIsIDB4ODMsIDB4NjEsIDB4NDAsIDB4N0YsIDB4M0EsIDB4MEIsIDB4MDAsIDB4MjAsIDB4RkUsIDB4NjAsIDB4NDUsCisJIDB4MkYsIDB4NjAsIDB4NDYsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MDMsIDB4NjEsIDB4N0MsIDB4QTQsIDB4QTIsIDB4REIsIDB4NjUsIDB4NDQsIDB4MDAsIDB4RjQsCisJIDB4NjAsIDB4RkUsIDB4QTMsIDB4RDEsIDB4REYsIDB4ODMsIDB4REQsIDB4ODEsIDB4Q0MsIDB4ODQsIDB4QTEsIDB4RDgsIDB4RUMsIDB4MDIsIDB4MjAsIDB4RkUsCisJIDB4QzMsIDB4MDEsIDB4MkYsIDB4NjAsIDB4NDYsIDB4NjIsIDB4QTIsIDB4RDEsIDB4RkQsIDB4QTEsIDB4RkYsIDB4QjEsIDB4QzEsIDB4ODMsIDB4QTIsIDB4REQsCisJIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjcsIDB4NUMsIDB4MUIsIDB4NjAsIDB4QzYsIDB4NjEsIDB4QTEsIDB4RDMsIDB4QTUsIDB4RDksIDB4MTIsIDB4MTgsCisJIDB4NjAsIDB4NDMsIDB4MkYsIDB4NjAsIDB4MTQsIDB4NjQsIDB4QTUsIDB4REIsIDB4NjAsIDB4RkUsIDB4QTAsIDB4REQsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsCisJIDB4REMsIDB4ODQsIDB4Q0YsIDB4ODMsIDB4RTMsIDB4ODMsIDB4NTksIDB4RDEsIDB4REMsIDB4ODQsIDB4NjAsIDB4RkUsIDB4QTAsIDB4RDksIDB4RkYsIDB4RkYsCisJIDB4MjAsIDB4RkUsIDB4RjksIDB4MUYsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NTcsIDB4MzIsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MjksIDB4MDAsCisJIDB4NDUsIDB4NDgsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjEsIDB4QUUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjEsIDB4MDMsCisJIDB4RjIsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjQsIDB4RkEsIDB4MDAsIDB4NjAsIDB4NDgsIDB4NjEsIDB4MjgsIDB4NDQsIDB4NTksIDB4REEsIDB4MDMsIDB4NjQsCisJIDB4MzgsIDB4NDMsIDB4QkQsIDB4RDEsIDB4Q0MsIDB4ODQsIDB4NTksIDB4RDgsIDB4RkMsIDB4MDIsIDB4MzksIDB4NDQsIDB4NTksIDB4REEsIDB4MjgsIDB4NjAsCisJIDB4MkUsIDB4NjQsIDB4QTAsIDB4RDMsIDB4NTksIDB4REEsIDB4MDcsIDB4NjQsIDB4MjMsIDB4RkEsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsCisJIDB4NjQsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4RkEsIDB4RkUsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NTcsIDB4MzIsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MUMsIDB4MDAsIDB4NDUsIDB4NDgsCisJIDB4MDAsIDB4NjAsIDB4MDYsIDB4NjEsIDB4QUUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDMsIDB4MDIsIDB4NjQsCisJIDB4MjMsIDB4RkEsIDB4RjIsIDB4NjAsIDB4MDAsIDB4NjQsIDB4NUEsIDB4REEsIDB4MjgsIDB4NDQsIDB4NUEsIDB4REEsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjAsCisJIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4NjQsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MzIsIDB4NDAsIDB4NDAsIDB4MjYsCisJIDB4M0UsIDB4MDAsIDB4OUQsIDB4RjMsIDB4NjcsIDB4NDMsIDB4REMsIDB4ODQsIDB4Q0MsIDB4ODQsIDB4MzksIDB4MDMsIDB4NjAsIDB4NDYsIDB4MEEsIDB4MDIsCisJIDB4OUQsIDB4RkQsIDB4MDAsIDB4NjAsIDB4NDYsIDB4NjEsIDB4QUUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsCisJIDB4OUQsIDB4RkIsIDB4MkUsIDB4MDMsIDB4NDYsIDB4NEIsIDB4MjcsIDB4NjAsIDB4NzIsIDB4NjEsIDB4MTgsIDB4NjQsIDB4MjMsIDB4RkEsIDB4RjEsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4MjQsIDB4RkEsIDB4NEEsIDB4NjUsIDB4QTIsIDB4RkYsIDB4MkMsIDB4NjMsIDB4MDAsIDB4NjQsIDB4NTksIDB4RDEsIDB4QTIsIDB4REIsCisJIDB4QTUsIDB4RDgsIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjcsIDB4MUYsIDB4MTIsIDB4NjMsCisJIDB4NTksIDB4RDEsIDB4QTUsIDB4RDgsIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjgsIDB4MUYsCisJIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4NjQsIDB4NjQsIDB4QTIsIDB4REIsIDB4MkIsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4QTYsIDB4RkUsIDB4MDAsIDB4NjQsIDB4OUQsIDB4RkIsIDB4QTMsIDB4RkYsCisJIDB4QkYsIDB4NjAsIDB4RTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTYsIDB4RkUsIDB4QjgsIDB4MDUsIDB4QTcsIDB4RkUsIDB4MTIsIDB4MDUsIDB4QTUsIDB4RkUsCisJIDB4MDMsIDB4MDQsIDB4RUEsIDB4NjAsIDB4QzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTQsIDB4RkUsIDB4RjIsIDB4MDQsIDB4MEYsIDB4NjAsIDB4REUsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4QkYsIDB4NjAsIDB4RTcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MzYsIDB4NDUsIDB4MjAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4NDQsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OUYsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4QjAsIDB4MDAsIDB4NjQsIDB4NDEsIDB4MDMsIDB4OUYsIDB4RkIsIDB4MzEsIDB4NDQsIDB4RTgsIDB4QjQsIDB4NDAsIDB4NTEsCisJIDB4NkEsIDB4NDQsIDB4RkYsIDB4RkYsIDB4ODAsIDB4MjYsIDB4RkMsIDB4MDEsIDB4NjEsIDB4RkYsIDB4NjIsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MUEsIDB4NjIsCisJIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUUsIDB4NjAsIDB4QkMsIDB4NjIsIDB4MUUsIDB4NjAsIDB4QkUsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4MDEsIDB4NjAsIDB4RkUsIDB4NjMsIDB4MUMsIDB4NjAsIDB4QjgsIDB4NjEsIDB4MDAsIDB4NjQsIDB4NTksIDB4REIsIDB4RkUsIDB4MUYsCisJIDB4MUMsIDB4NjMsIDB4MTAsIDB4NjAsIDB4NUMsIDB4NjQsIDB4NTgsIDB4RDEsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MUIsIDB4RkMsIDB4MUYsIDB4MDAsIDB4NjAsCisJIDB4NjIsIDB4NjMsIDB4MUIsIDB4NjAsIDB4QzQsIDB4NjQsIDB4MDAsIDB4N0MsIDB4NTgsIDB4RDksIDB4RkUsIDB4MUYsIDB4MUMsIDB4NjAsIDB4QjQsIDB4NjMsCisJIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDQsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDUsIDB4MDMsIDB4MDIsIDB4NjUsIDB4RTksIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4N0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QkYsIDB4NjAsIDB4RTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RUEsIDB4NjAsIDB4QzUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4NzQsIDB4MDAsIDB4MjgsIDB4NjAsIDB4NTAsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDEsIDB4QkQsIDB4RDEsIDB4QjAsIDB4ODQsIDB4QjAsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDIsIDB4OEMsIDB4RkIsIDB4MzEsIDB4NDQsIDB4RkUsIDB4QjQsIDB4NDAsIDB4NTEsIDB4MEQsIDB4NjQsIDB4MDUsIDB4RkIsCisJIDB4NjQsIDB4MDAsIDB4MjgsIDB4RjMsIDB4OUYsIDB4RjEsIDB4NjAsIDB4NDcsIDB4NjQsIDB4NDEsIDB4MDcsIDB4QjEsIDB4MDcsIDB4QjQsIDB4MDgsIDB4MjQsCisJIDB4NjcsIDB4NEMsIDB4NTAsIDB4RkIsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsIDB4QTEsIDB4ODAsCisJIDB4QjEsIDB4ODMsIDB4NTMsIDB4MDIsIDB4OUYsIDB4RkQsIDB4MjgsIDB4NjAsIDB4NDQsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RTUsIDB4RkIsIDB4N0YsIDB4RkIsCisJIDB4MjQsIDB4NjAsIDB4NUUsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4NDYsIDB4NUUsIDB4MzEsIDB4NDQsCisJIDB4MDEsIDB4QkMsIDB4NDAsIDB4NTEsIDB4RDgsIDB4RjMsIDB4MDEsIDB4NjMsIDB4MDMsIDB4QTgsIDB4NEUsIDB4RkQsIDB4MDUsIDB4MDIsIDB4MDIsIDB4NjMsCisJIDB4MTQsIDB4NjAsIDB4MDAsIDB4NjQsIDB4REIsIDB4RkIsIDB4MEMsIDB4MDAsIDB4MDIsIDB4QTgsIDB4MDEsIDB4NjMsIDB4MDMsIDB4MDMsIDB4MEEsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4MDMsIDB4MDAsIDB4MDIsIDB4NjMsIDB4MTQsIDB4NjAsIDB4MDAsIDB4NjQsIDB4REIsIDB4RkIsIDB4MDAsIDB4NjQsIDB4NEUsIDB4RkIsCisJIDB4NEIsIDB4RkQsIDB4QTksIDB4RjUsIDB4RkYsIDB4RkYsIDB4MEUsIDB4RjAsIDB4MEYsIDB4NjAsIDB4QTIsIDB4NjUsIDB4MjgsIDB4NjAsIDB4RDIsIDB4NjIsCisJIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QTAsIDB4MDMsIDB4QTgsIDB4MTEsIDB4MDYsIDB4NzksIDB4RjEsIDB4MDYsIDB4MDIsIDB4NjQsIDB4NDQsCisJIDB4MDgsIDB4MkEsIDB4MDksIDB4MDAsIDB4MDYsIDB4NjQsIDB4NDQsIDB4RDMsIDB4MEQsIDB4MDAsIDB4NjQsIDB4NDQsIDB4MjAsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4MEEsIDB4NjQsIDB4NDQsIDB4RDMsIDB4MDcsIDB4MDAsIDB4MDEsIDB4NjQsIDB4NDQsIDB4RDMsIDB4MDQsIDB4MDAsIDB4RTgsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDMsIDB4MDAsIDB4MDAsIDB4MEUsIDB4RkEsIDB4RUQsIDB4RTIsIDB4MEYsIDB4NEUsIDB4QzgsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MTUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4QkYsIDB4NjAsIDB4RTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDcsIDB4RkUsIDB4QkYsIDB4NjAsIDB4RTcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4RjMsIDB4MDEsIDB4MjQsIDB4NjAsIDB4NDYsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsCisJIDB4MEUsIDB4RjIsIDB4NEQsIDB4MDMsIDB4NjAsIDB4NDAsIDB4RjAsIDB4MzcsIDB4M0EsIDB4MDAsIDB4RkYsIDB4MzcsIDB4MkYsIDB4MDAsIDB4RkQsIDB4MzcsCisJIDB4MjcsIDB4MDAsIDB4RjgsIDB4MzcsIDB4MEEsIDB4MDAsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4MEYsIDB4NjAsIDB4RDIsIDB4NjIsIDB4NDYsIDB4RDEsCisJIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4REEsIDB4MDEsCisJIDB4MDYsIDB4QjQsIDB4RkQsIDB4N0YsIDB4MEUsIDB4RkEsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4NEMsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjksIDB4RkUsIDB4Q0EsIDB4MDEsCisJIDB4MjMsIDB4RjAsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjYsIDB4RUMsIDB4MUIsIDB4MDIsIDB4MjYsIDB4RUEsIDB4MTgsIDB4QTIsIDB4RkYsIDB4MDIsIDB4RjAsCisJIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsIDB4QjAsIDB4RjMsIDB4MDIsIDB4MDIsIDB4Q0MsIDB4ODQsIDB4QjAsIDB4RkIsIDB4MjQsIDB4NjAsCisJIDB4NzQsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MkMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QjMsIDB4MDEsIDB4QUMsIDB4RkUsCisJIDB4MDksIDB4MDUsIDB4QUQsIDB4RkUsIDB4MTAsIDB4MDUsIDB4QUUsIDB4RkUsIDB4QUQsIDB4MDUsIDB4QUYsIDB4RkUsIDB4M0EsIDB4MDUsIDB4QkYsIDB4NjAsCisJIDB4RTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4RjQsIDB4MDEsIDB4MTAsIDB4NjAsIDB4MzIsIDB4NjUsIDB4MEIsIDB4NjEsIDB4MDcsIDB4MDAsIDB4QTIsIDB4REQsCisJIDB4NTgsIDB4NEYsIDB4NjQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QjksIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDMsIDB4MDAsIDB4NjMsIDB4QTUsIDB4RDEsCisJIDB4NUEsIDB4RDMsIDB4REEsIDB4ODUsIDB4MDAsIDB4QTgsIDB4Q0QsIDB4ODEsIDB4RjIsIDB4MDIsIDB4RjgsIDB4MDIsIDB4RTAsIDB4MDEsIDB4MEYsIDB4NjAsCisJIDB4Q0UsIDB4NjIsIDB4MTAsIDB4NjAsIDB4MTIsIDB4NjUsIDB4RUIsIDB4NjAsIDB4NUYsIDB4NjMsIDB4MDAsIDB4NjQsIDB4NUEsIDB4REIsIDB4RDYsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDMsIDB4NUEsIDB4REIsIDB4NUEsIDB4REIsIDB4NUEsIDB4REQsIDB4RjksIDB4MDEsIDB4MTAsIDB4NjAsIDB4MzAsIDB4NjUsCisJIDB4MDAsIDB4NjQsIDB4NUEsIDB4REIsIDB4RDYsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4NUEsIDB4REQsIDB4RkIsIDB4MDEsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RDIsIDB4NjQsIDB4NDAsIDB4NDEsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjMsIDB4QTMsIDB4RDEsIDB4MDAsIDB4NjQsCisJIDB4RDAsIDB4ODAsIDB4MEIsIDB4NjEsIDB4MDgsIDB4MDMsIDB4QkQsIDB4REIsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsIDB4Q0QsIDB4ODEsCisJIDB4QTMsIDB4REIsIDB4MDYsIDB4QTMsIDB4RjksIDB4MDIsIDB4MTAsIDB4NjAsIDB4MUEsIDB4NjMsIDB4QTMsIDB4RDEsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsCisJIDB4MEMsIDB4NjEsIDB4MTksIDB4MDMsIDB4QkQsIDB4REIsIDB4NjQsIDB4NDQsIDB4RkUsIDB4QTMsIDB4MDIsIDB4QTMsIDB4Q0QsIDB4ODEsIDB4RTgsIDB4ODQsCisJIDB4RTMsIDB4MDMsIDB4MDIsIDB4MDUsIDB4RTEsIDB4MDMsIDB4RjksIDB4MDEsIDB4OTksIDB4RkIsIDB4OUIsIDB4RkQsIDB4NjEsIDB4NUMsIDB4QTMsIDB4RDMsCisJIDB4OUEsIDB4RjksIDB4MDMsIDB4MTgsIDB4NTgsIDB4NEYsIDB4NjAsIDB4NTgsIDB4RkYsIDB4RkYsIDB4OUIsIDB4RjMsIDB4OUEsIDB4RjEsIDB4NjAsIDB4NDMsCisJIDB4OTksIDB4RjMsIDB4NjQsIDB4NDEsIDB4RUEsIDB4MDEsIDB4MjEsIDB4NDMsIDB4MTAsIDB4NjAsIDB4MTQsIDB4NjUsIDB4RDcsIDB4ODAsIDB4QkQsIDB4RDEsCisJIDB4QkQsIDB4RDMsIDB4MDMsIDB4MDIsIDB4QkYsIDB4NjAsIDB4RTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsIDB4QkQsIDB4RDEsIDB4NDMsIDB4NDEsCisJIDB4RjUsIDB4MDMsIDB4RUIsIDB4NjAsIDB4NjQsIDB4NjQsIDB4NjQsIDB4NTgsIDB4NDAsIDB4NEYsIDB4MkEsIDB4RjAsIDB4ODMsIDB4NjAsIDB4RkYsIDB4NjUsCisJIDB4NjQsIDB4NDcsIDB4MDMsIDB4MkIsIDB4MDEsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDMsIDB4MjYsIDB4MDMsIDB4QUMsIDB4NjAsIDB4NDcsIDB4QTQsIDB4ODQsCisJIDB4MkEsIDB4RkEsIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsIDB4MkUsIDB4RkEsIDB4NjQsIDB4NDEsCisJIDB4RUIsIDB4RjMsIDB4MkYsIDB4RkEsIDB4NjAsIDB4NDMsIDB4RUMsIDB4RjMsIDB4MzAsIDB4RkEsIDB4RUQsIDB4RjEsIDB4MzEsIDB4RjgsIDB4MTksIDB4MDAsCisJIDB4NjAsIDB4NDcsIDB4QTQsIDB4ODQsIDB4MkEsIDB4RkEsIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsCisJIDB4MkUsIDB4RkEsIDB4MzYsIDB4RjIsIDB4MzIsIDB4RkEsIDB4MzcsIDB4RjIsIDB4MzMsIDB4RkEsIDB4MzgsIDB4RjIsIDB4MzQsIDB4RkEsIDB4RUIsIDB4RjMsCisJIDB4MkYsIDB4RkEsIDB4MzYsIDB4RkEsIDB4RUMsIDB4RjMsIDB4MzAsIDB4RkEsIDB4MzcsIDB4RkEsIDB4RUQsIDB4RjMsIDB4MzEsIDB4RkEsIDB4MzgsIDB4RkEsCisJIDB4NjQsIDB4NDEsIDB4MUMsIDB4RjIsIDB4MTMsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MEQsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MkIsCisJIDB4MTgsIDB4MDAsIDB4ODEsIDB4NjcsIDB4QTIsIDB4REEsIDB4RUMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4M0YsIDB4RkMsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4MjgsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjAsIDB4NDIsIDB4NjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDQsIDB4M0YsIDB4RkEsCisJIDB4MDcsIDB4RjIsIDB4QTksIDB4RjEsIDB4MDEsIDB4MUIsIDB4MDcsIDB4RjgsIDB4MUMsIDB4RjIsIDB4MTMsIDB4RkEsIDB4MjYsIDB4RjIsIDB4MjcsIDB4RjAsCisJIDB4NjAsIDB4NDcsIDB4MDAsIDB4RjQsIDB4MUYsIDB4RkEsIDB4NjQsIDB4NDcsIDB4MjAsIDB4RkEsIDB4NjEsIDB4NDQsIDB4MjEsIDB4RkEsIDB4MDEsIDB4NjcsCisJIDB4MEQsIDB4RkEsIDB4MTAsIDB4NjEsIDB4MjgsIDB4NjAsIDB4MDYsIDB4NjQsIDB4MUUsIDB4NjMsIDB4NTgsIDB4RDEsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4RDgsCisJIDB4RkMsIDB4MDIsIDB4QkIsIDB4RjEsIDB4RDgsIDB4RjEsIDB4NjQsIDB4NUUsIDB4NjQsIDB4NUYsIDB4NDQsIDB4NjMsIDB4QkQsIDB4REEsIDB4MjgsIDB4NjAsCisJIDB4MDAsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NEEsIDB4RDMsIDB4NjAsIDB4NDUsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDMsIDB4NjQsIDB4MDIsIDB4MzYsIDB4MDEsIDB4NjQsIDB4QjQsIDB4ODQsIDB4MDYsIDB4QTIsIDB4QTIsIDB4RDEsCisJIDB4QkQsIDB4REEsIDB4NjQsIDB4NDcsIDB4QkQsIDB4REEsIDB4RDUsIDB4RjMsIDB4RDYsIDB4RjEsIDB4NjAsIDB4NDcsIDB4QkQsIDB4REEsIDB4NjQsIDB4NDcsCisJIDB4RTMsIDB4RjEsIDB4QkQsIDB4REEsIDB4NjQsIDB4NDQsIDB4QkQsIDB4REEsIDB4MjYsIDB4NDYsIDB4MDAsIDB4NjQsIDB4MjMsIDB4RjAsIDB4M0IsIDB4RjAsCisJIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDYsIDB4MDAsIDB4QzAsIDB4NjcsIDB4QTAsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4MTAsIDB4QkMsIDB4M0UsIDB4RkEsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4MzQsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzgsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QjQsIDB4RjMsIDB4MUYsIDB4RkEsIDB4MzIsIDB4NDcsIDB4MDcsIDB4RkEsIDB4MjQsIDB4N0UsIDB4MDIsIDB4N0YsCisJIDB4MDgsIDB4RkEsIDB4RDgsIDB4RjEsIDB4MDksIDB4RjgsIDB4MDEsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MEEsIDB4RkEsIDB4MDEsIDB4NjQsIDB4MEIsIDB4RkEsCisJIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MTgsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MEEsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4NTIsIDB4NjMsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MkEsIDB4NjEsIDB4QUUsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4QzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4NUUsIDB4RkIsIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsIDB4NjcsIDB4NDQsCisJIDB4MkMsIDB4RkEsIDB4MkQsIDB4RkEsIDB4MkUsIDB4RkEsIDB4MzIsIDB4RkEsIDB4MzMsIDB4RkEsIDB4MzQsIDB4RkEsIDB4MTIsIDB4NjAsIDB4ODAsIDB4NjQsCisJIDB4QTksIDB4RjEsIDB4MEUsIDB4RkEsIDB4MDcsIDB4RjgsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4MUEsIDB4NjAsIDB4NEUsIDB4NjMsIDB4QTMsIDB4REIsCisJIDB4MDYsIDB4QTMsIDB4MTAsIDB4NjAsIDB4MzgsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDQsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDYsIDB4NjQsIDB4QTMsIDB4REIsCisJIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4RUYsIDB4NjAsIDB4QTksIDB4NjQsIDB4QTIsIDB4REIsIDB4MUEsIDB4NjAsIDB4NUEsIDB4NjMsIDB4MDAsIDB4NjQsCisJIDB4QTMsIDB4REIsIDB4MDYsIDB4QTMsIDB4MTAsIDB4NjAsIDB4M0MsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDgsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDYsIDB4NjQsCisJIDB4QTMsIDB4REIsIDB4MTAsIDB4NjAsIDB4M0EsIDB4NjIsIDB4RUYsIDB4NjAsIDB4QjMsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4MjIsIDB4NjIsCisJIDB4RUYsIDB4NjAsIDB4OTMsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjQsIDB4MzEsIDB4NjAsIDB4MkEsIDB4NjIsIDB4QTIsIDB4REIsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4NUUsIDB4RjUsIDB4RUIsIDB4RjEsIDB4MkYsIDB4RjgsIDB4RUMsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUQsIDB4RjEsIDB4MzEsIDB4RjgsCisJIDB4Q0MsIDB4RjEsIDB4MTksIDB4RjgsIDB4MzAsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsIDB4RTQsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MDAsIDB4NjMsIDB4OEEsIDB4RkQsIDB4MUMsIDB4NjAsIDB4OTYsIDB4NjUsIDB4QTUsIDB4REQsIDB4MTksIDB4NjAsIDB4ODYsIDB4NjMsCisJIDB4ODgsIDB4RkQsIDB4ODksIDB4RkQsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MkIsIDB4MDUsIDB4MDAsIDB4MUYsIDB4NjAsIDB4ODIsIDB4NjEsIDB4QTEsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4NTksIDB4MTgsIDB4NUUsIDB4RjUsIDB4NDAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4NTQsIDB4RjMsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsCisJIDB4QkQsIDB4RDEsIDB4MDQsIDB4NjUsIDB4NjQsIDB4NDcsIDB4QTUsIDB4REEsIDB4NjQsIDB4NDEsIDB4REQsIDB4ODEsIDB4RTksIDB4ODEsIDB4NjIsIDB4NDQsCisJIDB4MDQsIDB4MDMsIDB4QkQsIDB4RDEsIDB4Q0QsIDB4ODEsIDB4NTgsIDB4RDgsIDB4RkMsIDB4MDIsIDB4NTgsIDB4OEIsIDB4MkQsIDB4NjAsIDB4MjgsIDB4NjMsCisJIDB4QTMsIDB4RDEsIDB4MkIsIDB4NDQsIDB4QzgsIDB4ODQsIDB4NjQsIDB4NDEsIDB4RkYsIDB4QjEsIDB4NjEsIDB4NDUsIDB4MDMsIDB4QTEsIDB4RTksIDB4ODEsCisJIDB4NDEsIDB4NEMsIDB4QkQsIDB4RDEsIDB4Q0QsIDB4ODEsIDB4NTgsIDB4RDgsIDB4RkMsIDB4MDIsIDB4MkIsIDB4RDIsIDB4MkIsIDB4NDMsIDB4NjAsIDB4NDcsCisJIDB4MDEsIDB4N0UsIDB4NTQsIDB4RjEsIDB4QTMsIDB4REEsIDB4QTQsIDB4RDMsIDB4Q0IsIDB4ODMsIDB4NDQsIDB4OEIsIDB4RjgsIDB4ODQsIDB4MkMsIDB4NDEsCisJIDB4MEMsIDB4MDQsIDB4QkUsIDB4RDIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4QkUsIDB4REEsIDB4MDAsIDB4N0UsIDB4QTMsIDB4RDIsIDB4NjAsIDB4NDUsCisJIDB4MDAsIDB4N0YsIDB4QjQsIDB4ODQsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REEsIDB4RjQsIDB4MDIsIDB4NUUsIDB4RjUsIDB4MkIsIDB4NDQsIDB4MDQsIDB4QTQsCisJIDB4M0YsIDB4RkEsIDB4N0YsIDB4RjMsIDB4N0UsIDB4RkIsIDB4MUYsIDB4NjAsIDB4ODQsIDB4NjEsIDB4MDEsIDB4NjQsIDB4NTQsIDB4RjEsIDB4QTEsIDB4REIsCisJIDB4N0YsIDB4RkIsIDB4QTQsIDB4RDMsIDB4MDQsIDB4NjUsIDB4NTMsIDB4RjMsIDB4MDEsIDB4MTgsIDB4MEMsIDB4NjUsIDB4RjMsIDB4QjQsIDB4QjQsIDB4ODQsCisJIDB4NTMsIDB4RkIsIDB4MDIsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MTYsIDB4MDMsIDB4N0YsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MEYsIDB4QjQsCisJIDB4N0YsIDB4RkIsIDB4MDEsIDB4MDMsIDB4MEYsIDB4MDAsIDB4RUUsIDB4NjAsIDB4NEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTMsIDB4RjEsIDB4N0YsIDB4RjMsCisJIDB4NjQsIDB4NDAsIDB4MDIsIDB4MjYsIDB4RjgsIDB4MDEsIDB4RjMsIDB4QTAsIDB4MDQsIDB4QTQsIDB4MDEsIDB4MDQsIDB4RjEsIDB4QTQsIDB4MTAsIDB4MzYsCisJIDB4RjIsIDB4MDEsIDB4N0YsIDB4RkIsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MkIsIDB4MTIsIDB4MDAsIDB4N0YsIDB4RjMsIDB4MUYsIDB4NjAsIDB4ODIsIDB4NjEsCisJIDB4QTEsIDB4RDEsIDB4Q0MsIDB4ODQsIDB4MDEsIDB4NjEsIDB4MDgsIDB4MjQsIDB4MDMsIDB4MDAsIDB4RTEsIDB4ODEsIDB4Q0MsIDB4ODQsIDB4RkIsIDB4MDEsCisJIDB4QTEsIDB4ODQsIDB4NTMsIDB4RjEsIDB4RTQsIDB4MDMsIDB4MUYsIDB4NjAsIDB4ODQsIDB4NjEsIDB4QTEsIDB4REIsIDB4MTksIDB4MDAsIDB4NTMsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4QjAsIDB4MTIsIDB4NjAsIDB4MjYsIDB4NjMsIDB4MDIsIDB4MDMsIDB4MTAsIDB4NjAsIDB4NUMsIDB4NjMsIDB4MzEsIDB4NjAsCisJIDB4MkEsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MUIsIDB4N0YsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODUsIDB4NDcsIDB4RDMsCisJIDB4NTMsIDB4RjEsIDB4MDEsIDB4QjAsIDB4MDYsIDB4QjAsIDB4Q0IsIDB4MDMsIDB4NjQsIDB4NDAsIDB4MDMsIDB4MjYsIDB4MDEsIDB4MDAsIDB4QzcsIDB4MDMsCisJIDB4N0YsIDB4RjMsIDB4MDEsIDB4NjEsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4RTEsIDB4ODEsIDB4RkIsIDB4MDEsIDB4QkEsIDB4RjMsCisJIDB4NjEsIDB4NDUsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4QkIsIDB4MDMsIDB4MzEsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsCisJIDB4RTQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEIsIDB4MDQsIDB4MEYsIDB4NjAsIDB4RTYsIDB4NjIsIDB4NDAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RUQsIDB4NjAsIDB4NzAsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4N0YsIDB4RjEsIDB4MjQsIDB4NjAsIDB4OUEsIDB4NjIsIDB4QTIsIDB4RDksIDB4MUUsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsCisJIDB4MEYsIDB4NjAsIDB4RTYsIDB4NjIsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RUQsIDB4NjAsIDB4QTMsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QkUsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NDAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RTQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4NUUsIDB4RjUsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4MjgsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NTEsIDB4RkIsIDB4MEYsIDB4NjAsIDB4RTYsIDB4NjIsCisJIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4QTIsIDB4REIsIDB4RUQsIDB4NjAsIDB4Q0QsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4QzEsIDB4RkUsCisJIDB4MzMsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MzQsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4MEYsIDB4NjAsIDB4RTQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QzYsIDB4RjEsIDB4MUEsIDB4NjAsIDB4NTIsIDB4NjIsIDB4QTIsIDB4RDksCisJIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NEUsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4RkYsIDB4QzcsIDB4RjEsIDB4MUEsIDB4NjAsIDB4NUUsIDB4NjIsIDB4QTIsIDB4RDksIDB4MjQsIDB4NjAsIDB4QTgsIDB4NjIsIDB4QTIsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4RkQsIDB4MUIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NUEsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RTYsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4RUQsIDB4NjAsIDB4RkUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NTEsIDB4RjEsIDB4MEYsIDB4NjAsCisJIDB4RTQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjQsIDB4NDAsIDB4RkYsIDB4MjYsIDB4MDMsIDB4MDAsIDB4RUQsIDB4NjAsIDB4MzYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4MEEsIDB4MDAsIDB4NjQsIDB4NTEsIDB4RkIsIDB4QzgsIDB4RjEsIDB4MUEsIDB4NjAsIDB4NUUsIDB4NjIsIDB4QTIsIDB4RDksCisJIDB4MEYsIDB4NjAsIDB4RTYsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MEMsIDB4NjQsIDB4QTIsIDB4REIsIDB4RUUsIDB4NjAsIDB4MjQsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NUEsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RTQsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsCisJIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MEMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsCisJIDB4MUEsIDB4NjAsIDB4NUEsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MTQsIDB4MDAsCisJIDB4RkYsIDB4NjAsIDB4RjcsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NTEsIDB4RjMsIDB4REIsIDB4MEEsIDB4MDAsIDB4QTAsIDB4MDAsIDB4NjQsCisJIDB4MDIsIDB4MDMsIDB4NTEsIDB4RkIsIDB4RDYsIDB4MDEsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NEUsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4RUQsIDB4NjAsIDB4MzYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzUsIDB4NjQsCisJIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NEUsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4NTMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RTMsIDB4QjQsIDB4NTMsIDB4RkIsIDB4MUYsIDB4NjAsCisJIDB4ODAsIDB4NjQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjQsIDB4MzEsIDB4NjAsIDB4MkEsIDB4NjIsCisJIDB4QTIsIDB4REIsIDB4MEYsIDB4NjAsIDB4RTQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEUsIDB4MDQsIDB4MzIsIDB4NjQsCisJIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEYsIDB4NjAsIDB4RTYsIDB4NjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RUUsIDB4NjAsCisJIDB4NjksIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0UsIDB4RjEsIDB4N0YsIDB4RjksIDB4MjQsIDB4NjAsCisJIDB4OUEsIDB4NjIsIDB4QTIsIDB4RDksIDB4MUUsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RTYsIDB4NjIsCisJIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RUUsIDB4NjAsIDB4OTEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4QkUsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MUEsIDB4NjAsIDB4MDYsIDB4NjMsIDB4MUMsIDB4NjEsIDB4MDAsIDB4NjQsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsCisJIDB4RkQsIDB4MDIsIDB4MTIsIDB4NjAsIDB4NDYsIDB4NjEsIDB4OEEsIDB4RjMsIDB4NjEsIDB4NDMsIDB4QzYsIDB4QTUsIDB4NDcsIDB4RDEsIDB4MEYsIDB4MDQsCisJIDB4QkUsIDB4RDUsIDB4MUEsIDB4NjAsIDB4MDIsIDB4NjMsIDB4QzMsIDB4ODMsIDB4QzMsIDB4ODMsIDB4QzMsIDB4ODMsIDB4NDMsIDB4RDMsIDB4QkUsIDB4RDEsCisJIDB4REMsIDB4ODQsIDB4QTMsIDB4REIsIDB4NjYsIDB4NDQsIDB4QzAsIDB4ODQsIDB4QkUsIDB4REIsIDB4NjUsIDB4NDQsIDB4RUQsIDB4MDEsIDB4MUEsIDB4NjAsCisJIDB4MDYsIDB4NjMsIDB4MEUsIDB4NjEsIDB4NDEsIDB4NEIsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDEsIDB4MDAsIDB4QkQsIDB4NjQsIDB4NDEsIDB4MTksIDB4MDMsCisJIDB4MDEsIDB4QTgsIDB4NjEsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MTUsIDB4MDMsIDB4MDIsIDB4MDIsIDB4RTksIDB4ODQsIDB4MTIsIDB4MDAsIDB4NjUsIDB4NDcsCisJIDB4NjAsIDB4NDUsIDB4NjEsIDB4NDQsIDB4MDksIDB4NjEsIDB4Q0QsIDB4ODEsIDB4RTAsIDB4ODQsIDB4RkYsIDB4MjMsIDB4RkMsIDB4MDEsIDB4MDIsIDB4MjQsCisJIDB4QzQsIDB4ODQsIDB4MDIsIDB4MjgsIDB4RDQsIDB4ODQsIDB4Q0QsIDB4ODEsIDB4MDEsIDB4MEUsIDB4MDEsIDB4QkMsIDB4MDIsIDB4MDMsIDB4RTAsIDB4ODQsCisJIDB4RjYsIDB4MDEsIDB4MDAsIDB4N0YsIDB4MkIsIDB4NDEsIDB4NEQsIDB4OEIsIDB4QkYsIDB4REIsIDB4REQsIDB4MDIsIDB4MTIsIDB4NjAsIDB4NDYsIDB4NjEsCisJIDB4OEEsIDB4RjMsIDB4NjEsIDB4NDMsIDB4QzYsIDB4QTUsIDB4NDcsIDB4RDEsIDB4MEEsIDB4MDQsIDB4REEsIDB4ODYsIDB4MUEsIDB4NjAsIDB4MDQsIDB4NjMsCisJIDB4QzMsIDB4ODMsIDB4QzMsIDB4ODMsIDB4QzMsIDB4ODMsIDB4NDMsIDB4RDEsIDB4QTYsIDB4RDksIDB4NjUsIDB4NDQsIDB4RjIsIDB4MDEsIDB4MzYsIDB4NjQsCisJIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4NTMsIDB4RjMsIDB4OEEsIDB4RjEsIDB4RjMsIDB4QjQsIDB4NTMsIDB4RkIsIDB4MTIsIDB4NjAsIDB4NDYsIDB4NjMsCisJIDB4QzMsIDB4ODUsIDB4NDUsIDB4NEEsIDB4MTksIDB4NjAsIDB4ODYsIDB4NjUsIDB4ODksIDB4RjMsIDB4NDUsIDB4NEMsIDB4NDAsIDB4NDgsIDB4MjAsIDB4NDAsCisJIDB4MjAsIDB4MkEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjUsIDB4NDUsIDB4NEIsIDB4MkEsIDB4NDUsIDB4RDcsIDB4ODAsIDB4MDIsIDB4NjUsIDB4MjMsIDB4MDUsCisJIDB4NDcsIDB4RDEsIDB4MDIsIDB4NjUsIDB4NDcsIDB4RDMsIDB4MEEsIDB4NjUsIDB4RDAsIDB4ODEsIDB4NDcsIDB4RDMsIDB4MDEsIDB4MDUsIDB4MDAsIDB4NjEsCisJIDB4RjIsIDB4QTMsIDB4MDEsIDB4QjAsIDB4NjEsIDB4NDQsIDB4MTEsIDB4MDMsIDB4MjAsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MDgsIDB4MDAsIDB4RjMsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4M0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkIsIDB4NDQsIDB4MDIsIDB4QTQsIDB4NDAsIDB4NEIsIDB4NjEsIDB4NDQsIDB4MkMsIDB4NDIsCisJIDB4QTIsIDB4REIsIDB4NUEsIDB4REQsIDB4NUEsIDB4OEMsIDB4M0EsIDB4QTMsIDB4REYsIDB4MDEsIDB4MjgsIDB4NDIsIDB4NEEsIDB4REQsIDB4NEEsIDB4REIsCisJIDB4NDIsIDB4NDgsIDB4M0EsIDB4QTMsIDB4RDksIDB4MDEsIDB4MjgsIDB4NDQsIDB4ODgsIDB4RkIsIDB4ODgsIDB4RjEsIDB4MTksIDB4NjAsIDB4ODYsIDB4NjMsCisJIDB4NDQsIDB4NDgsIDB4MjgsIDB4NDUsIDB4RDcsIDB4ODAsIDB4QTMsIDB4RDEsIDB4MTUsIDB4MDUsIDB4MDQsIDB4NjUsIDB4NDYsIDB4RDMsIDB4MjgsIDB4NDUsCisJIDB4RDYsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDIsIDB4MDQsIDB4MDQsIDB4QTMsIDB4RjUsIDB4MDEsIDB4RjcsIDB4MDYsIDB4NjIsIDB4NDYsIDB4QTIsIDB4RDksCisJIDB4QTMsIDB4REIsIDB4NUIsIDB4RDMsIDB4NjYsIDB4NDIsIDB4NUEsIDB4RDEsIDB4QTIsIDB4REIsIDB4QTMsIDB4RDksIDB4RkUsIDB4QTMsIDB4QTMsIDB4RDEsCisJIDB4NjYsIDB4NDIsIDB4RUIsIDB4MDEsIDB4ODgsIDB4RjMsIDB4ODksIDB4RjEsIDB4NjAsIDB4NDMsIDB4NDQsIDB4NDgsIDB4MjgsIDB4NDUsIDB4RDcsIDB4ODAsCisJIDB4QTMsIDB4RDEsIDB4MTUsIDB4MDUsIDB4MDQsIDB4NjUsIDB4NDYsIDB4RDMsIDB4MjgsIDB4NDUsIDB4RDYsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDIsIDB4MDQsCisJIDB4MDQsIDB4QTMsIDB4RjUsIDB4MDEsIDB4RjcsIDB4MDYsIDB4NjIsIDB4NDYsIDB4QTIsIDB4RDksIDB4QTMsIDB4REIsIDB4NUIsIDB4RDMsIDB4NjYsIDB4NDIsCisJIDB4NUEsIDB4RDEsIDB4QTIsIDB4REIsIDB4QTMsIDB4RDksIDB4RkUsIDB4QTMsIDB4QTMsIDB4RDEsIDB4NjYsIDB4NDIsIDB4RUIsIDB4MDEsIDB4MEYsIDB4NjAsCisJIDB4RDAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MjAsIDB4NDAsCisJIDB4ODAsIDB4MkIsIDB4MTcsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjEsIDB4QUUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4NjQsIDB4MjMsIDB4RkEsIDB4RjEsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjQsIDB4RkEsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsCisJIDB4NjQsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4RkEsIDB4RkUsIDB4MEYsIDB4NjAsIDB4RTQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NUEsIDB4REIsIDB4M0UsIDB4NjQsIDB4M0IsIDB4NDIsCisJIDB4NUEsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsCisJIDB4MUEsIDB4NjAsIDB4NEUsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjQsCisJIDB4NTMsIDB4RkIsIDB4MEYsIDB4NjAsIDB4RTQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NUEsIDB4REIsIDB4QkUsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RTQsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4RTQsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NzksIDB4RkIsIDB4QUMsIDB4ODUsIDB4NjAsIDB4NDEsCisJIDB4MjAsIDB4MDMsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjMsIDB4MDgsIDB4NjQsIDB4RTksIDB4ODEsIDB4Q0MsIDB4ODQsIDB4MDIsIDB4MjQsIDB4REYsIDB4ODMsCisJIDB4RkIsIDB4MDIsIDB4MkQsIDB4NjAsIDB4MjgsIDB4NjQsIDB4QTAsIDB4REQsIDB4NjUsIDB4NDEsIDB4MkQsIDB4NjAsIDB4MkEsIDB4NjMsIDB4MEYsIDB4NjAsCisJIDB4QzAsIDB4NjQsIDB4RTksIDB4ODEsIDB4NTgsIDB4RDEsIDB4RkQsIDB4MDQsIDB4QTMsIDB4RDksIDB4MEIsIDB4MDMsIDB4NTgsIDB4RDEsIDB4RTksIDB4ODEsCisJIDB4NjAsIDB4NDUsIDB4RkMsIDB4MDQsIDB4QTMsIDB4RDEsIDB4NjQsIDB4NDcsIDB4QjAsIDB4ODQsIDB4QkQsIDB4REIsIDB4MDAsIDB4QjksIDB4NjUsIDB4NDQsCisJIDB4RjAsIDB4MDIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4M0MsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MjAsIDB4NDAsIDB4OTAsIDB4MkIsCisJIDB4MDMsIDB4MDAsIDB4RjIsIDB4NjAsIDB4RTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTMsIDB4RjMsIDB4OEEsIDB4RjEsIDB4MDQsIDB4QjAsIDB4MDcsIDB4NjAsCisJIDB4NDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MjEsIDB4MDMsIDB4MjAsIDB4MDYsIDB4MjYsIDB4NDYsIDB4OEEsIDB4RjEsIDB4MTIsIDB4NjAsIDB4NDYsIDB4NjMsCisJIDB4QzMsIDB4ODMsIDB4N0YsIDB4RjMsIDB4MjYsIDB4RjAsIDB4QkQsIDB4REIsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4QkQsIDB4REIsIDB4NjQsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4QkQsIDB4REIsIDB4MzIsIDB4RjAsIDB4QkQsIDB4RDksIDB4MzMsIDB4RjAsIDB4QkQsIDB4RDksIDB4MzQsIDB4RjAsIDB4QkQsIDB4RDksCisJIDB4MDAsIDB4RjQsIDB4MEQsIDB4RjAsIDB4QkQsIDB4RDksIDB4MEUsIDB4RjAsIDB4QkQsIDB4RDksIDB4MDAsIDB4NjQsIDB4MEYsIDB4RjAsIDB4QTMsIDB4REIsCisJIDB4NjQsIDB4NDcsIDB4NjAsIDB4NDUsIDB4MDAsIDB4MzcsIDB4MDMsIDB4MDAsIDB4RjIsIDB4NjAsIDB4REYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QkQsIDB4REIsCisJIDB4RTAsIDB4QTAsIDB4MUYsIDB4NjEsIDB4MDAsIDB4QjgsIDB4RjgsIDB4MDcsIDB4RjcsIDB4MDMsIDB4NjAsIDB4RkUsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDAsCisJIDB4Q0MsIDB4ODQsIDB4QkQsIDB4RDksIDB4RkIsIDB4MDIsIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjYsIDB4REYsIDB4ODMsIDB4MjAsIDB4RkUsIDB4MkQsIDB4NjAsCisJIDB4RTQsIDB4NjIsIDB4QTIsIDB4REQsIDB4NjAsIDB4RkUsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4M0EsCisJIDB4MDQsIDB4MDAsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDAsIDB4RkYsIDB4RkYsIDB4QzEsIDB4ODEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDAsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDAsIDB4MDMsIDB4MzYsIDB4MDMsIDB4MDAsIDB4RjIsIDB4NjAsIDB4REYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDksIDB4ODEsIDB4QTEsIDB4RDAsCisJIDB4N0YsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4MjAsIDB4RkUsIDB4MDgsIDB4MjQsIDB4MDMsIDB4MDAsIDB4RjIsIDB4NjAsIDB4REYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsIDB4RjQsIDB4QTMsIDB4MDAsIDB4NjAsIDB4MUQsIDB4NjEsCisJIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjUsIDB4NjAsIDB4RkUsIDB4ODEsIDB4QTEsIDB4N0YsIDB4QTEsIDB4MDIsIDB4MDYsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsCisJIDB4REQsIDB4ODEsIDB4QTEsIDB4RDIsIDB4Q0YsIDB4ODMsIDB4RDQsIDB4ODAsIDB4MkQsIDB4MDMsIDB4MTcsIDB4MDMsIDB4Q0YsIDB4ODMsIDB4NjEsIDB4NDQsCisJIDB4ODAsIDB4QTAsIDB4MjgsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDIsIDB4Q0YsIDB4ODMsCisJIDB4ODEsIDB4QTEsIDB4MjAsIDB4MDMsIDB4MDUsIDB4MDcsIDB4N0YsIDB4QTEsIDB4Q0MsIDB4ODQsIDB4REQsIDB4ODEsIDB4RTQsIDB4MDMsIDB4RjcsIDB4MDEsCisJIDB4MDAsIDB4RjQsIDB4MDAsIDB4QjgsIDB4MDQsIDB4NjEsIDB4RTQsIDB4MDMsIDB4RjIsIDB4MDEsIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjMsIDB4NDYsIDB4NDgsCisJIDB4NDEsIDB4NEEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDAsIDB4REYsIDB4ODMsIDB4QTMsIDB4RDksIDB4NjQsIDB4NDQsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDAsCisJIDB4REYsIDB4ODMsIDB4QTMsIDB4RDksIDB4Q0MsIDB4ODQsIDB4ODEsIDB4QTEsIDB4MDUsIDB4MDMsIDB4N0YsIDB4QTEsIDB4RjcsIDB4MDQsIDB4MDAsIDB4RjQsCisJIDB4MDMsIDB4NjEsIDB4RjQsIDB4MDEsIDB4MjAsIDB4RkUsIDB4MDAsIDB4QkIsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsIDB4NDUsIDB4MDMsIDB4NjAsIDB4RkUsCisJIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDAsIDB4M0EsIDB4M0UsIDB4MDAsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NjAsIDB4M0EsIDB4MzgsIDB4MDAsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsCisJIDB4MUQsIDB4M0EsIDB4MzIsIDB4MDAsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4RkYsIDB4QjQsIDB4MUMsIDB4NjAsCisJIDB4OTYsIDB4NjUsIDB4QTUsIDB4RDMsIDB4NjAsIDB4NUMsIDB4MDIsIDB4QTQsIDB4QTUsIDB4REIsIDB4RkUsIDB4QTUsIDB4MUEsIDB4NjAsIDB4QzYsIDB4NjQsCisJIDB4NDQsIDB4RDksIDB4MDAsIDB4N0MsIDB4NjAsIDB4RkUsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MUIsIDB4NjAsCisJIDB4MDYsIDB4NjQsIDB4QzQsIDB4ODIsIDB4NjQsIDB4NDQsIDB4RkYsIDB4QjQsIDB4QTIsIDB4REIsIDB4MTIsIDB4NjAsIDB4NDgsIDB4NjUsIDB4OEEsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4QzQsIDB4ODIsIDB4NjQsIDB4NDQsIDB4QTIsIDB4RDMsIDB4RkYsIDB4QjUsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDUsCisJIDB4NjUsIDB4NDQsIDB4QTIsIDB4REIsIDB4MDksIDB4MDAsIDB4MjAsIDB4RkUsIDB4MjgsIDB4NDYsIDB4MkEsIDB4NDEsIDB4RkYsIDB4QjEsIDB4NjAsIDB4RkUsCisJIDB4ODIsIDB4NjQsIDB4QTEsIDB4REEsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsCisJIDB4RjQsIDB4QTMsIDB4MDAsIDB4NjAsIDB4MUQsIDB4NjEsIDB4MDAsIDB4NjAsIDB4REQsIDB4NjUsIDB4NjAsIDB4RkUsIDB4ODEsIDB4QTEsIDB4N0YsIDB4QTEsCisJIDB4MDIsIDB4MDYsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDIsIDB4Q0YsIDB4ODMsIDB4RDQsIDB4ODAsIDB4MkQsIDB4MDMsCisJIDB4MTcsIDB4MDMsIDB4Q0YsIDB4ODMsIDB4NjEsIDB4NDQsIDB4ODAsIDB4QTAsIDB4MjgsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsCisJIDB4REQsIDB4ODEsIDB4QTEsIDB4RDIsIDB4Q0YsIDB4ODMsIDB4ODEsIDB4QTEsIDB4MjAsIDB4MDMsIDB4MDUsIDB4MDcsIDB4N0YsIDB4QTEsIDB4Q0MsIDB4ODQsCisJIDB4REQsIDB4ODEsIDB4RTQsIDB4MDMsIDB4RjcsIDB4MDEsIDB4MDAsIDB4RjQsIDB4MDAsIDB4QjgsIDB4MDQsIDB4NjEsIDB4RTQsIDB4MDMsIDB4RjIsIDB4MDEsCisJIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4NDYsIDB4NDgsIDB4NDEsIDB4NEEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDAsIDB4REYsIDB4ODMsIDB4QTMsIDB4RDksCisJIDB4NjQsIDB4NDQsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDAsIDB4REYsIDB4ODMsIDB4QTMsIDB4RDksIDB4Q0MsIDB4ODQsIDB4ODEsIDB4QTEsIDB4MDUsIDB4MDMsCisJIDB4N0YsIDB4QTEsIDB4RjcsIDB4MDQsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsIDB4RjQsIDB4MDEsIDB4MjAsIDB4RkUsIDB4MDAsIDB4QkIsIDB4MDIsIDB4NjAsCisJIDB4MDAsIDB4NjEsIDB4MDgsIDB4MjQsIDB4QTYsIDB4MDAsIDB4MkQsIDB4NjAsIDB4RDYsIDB4NjIsIDB4QTIsIDB4REYsIDB4MkQsIDB4NjAsIDB4RDgsIDB4NjIsCisJIDB4QTIsIDB4REYsIDB4MkQsIDB4NjAsIDB4REEsIDB4NjIsIDB4QTIsIDB4REYsIDB4MkQsIDB4NjAsIDB4REMsIDB4NjIsIDB4QTIsIDB4REYsIDB4NjAsIDB4RkUsCisJIDB4REQsIDB4NjQsIDB4QTEsIDB4REIsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RkEsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MzQsCisJIDB4OUEsIDB4MDEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDAsIDB4M0EsIDB4OTQsIDB4MDEsIDB4REQsIDB4ODEsCisJIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NTAsIDB4M0EsIDB4OEUsIDB4MDEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDAsIDB4RjIsIDB4M0EsIDB4ODgsIDB4MDEsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4M0EsCisJIDB4REMsIDB4MDAsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4M0EsIDB4RDYsIDB4MDAsIDB4REQsIDB4ODEsCisJIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDAsIDB4M0EsIDB4RDAsIDB4MDAsIDB4NjAsIDB4NUMsIDB4MDAsIDB4MzYsIDB4MzksIDB4MDAsCisJIDB4MDAsIDB4NjQsIDB4RjIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDAsIDB4MDgsIDB4MjYsIDB4RjcsIDB4MDEsCisJIDB4MkQsIDB4NjAsIDB4RDYsIDB4NjIsIDB4QTIsIDB4REIsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MzEsIDB4MDAsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDMsCisJIDB4REQsIDB4ODEsIDB4RjIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDAsIDB4MDgsIDB4MjYsIDB4RjUsIDB4MDEsCisJIDB4MkQsIDB4NjAsIDB4RDgsIDB4NjIsIDB4QTIsIDB4REIsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MjcsIDB4MDAsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDMsCisJIDB4REQsIDB4ODEsIDB4RjIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDAsIDB4MDgsIDB4MjYsIDB4RjUsIDB4MDEsCisJIDB4MkQsIDB4NjAsIDB4REEsIDB4NjIsIDB4QTIsIDB4REIsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MUQsIDB4MDAsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsCisJIDB4MkQsIDB4NjAsIDB4REMsIDB4NjIsIDB4QTIsIDB4RDksIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4MkQsIDB4NjAsIDB4REQsIDB4NjIsIDB4QTIsIDB4RDksCisJIDB4MTgsIDB4MDAsIDB4MjAsIDB4RkUsIDB4MkQsIDB4NjAsIDB4RDYsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjAsIDB4RkUsCisJIDB4MkQsIDB4NjAsIDB4RDgsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjAsIDB4RkUsIDB4MkQsIDB4NjAsIDB4REEsIDB4NjIsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjAsIDB4RkUsIDB4MkQsIDB4NjAsIDB4REMsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MjAsIDB4RkUsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MkQsIDB4NjAsIDB4OUUsIDB4NjMsIDB4RDUsIDB4ODQsIDB4REMsIDB4ODQsCisJIDB4QkQsIDB4REIsIDB4NjAsIDB4NDEsIDB4NjYsIDB4NDQsIDB4NjMsIDB4NDYsIDB4Q0QsIDB4ODMsIDB4QzcsIDB4ODEsIDB4NjAsIDB4NDUsIDB4NjAsIDB4RkUsCisJIDB4NUQsIDB4OTMsIDB4QTMsIDB4RDMsIDB4NUQsIDB4OTMsIDB4QTYsIDB4REIsIDB4REUsIDB4ODYsIDB4RkEsIDB4MUYsIDB4NjYsIDB4NDMsIDB4NjUsIDB4NDYsCisJIDB4MjAsIDB4RkUsIDB4MjAsIDB4RkUsIDB4MkQsIDB4NjAsIDB4RTQsIDB4NjIsIDB4QTIsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDMsIDB4MDAsIDB4NjQsCisJIDB4MkQsIDB4NjAsIDB4Q0UsIDB4NjEsIDB4QTEsIDB4REIsIDB4MkQsIDB4NjAsIDB4QzIsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MkQsIDB4NjAsIDB4RDYsIDB4NjIsCisJIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MjYsIDB4MDcsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDcsIDB4MDAsCisJIDB4MjAsIDB4MjYsIDB4MDcsIDB4MDAsIDB4MDIsIDB4MjYsIDB4MDcsIDB4MDAsIDB4NDgsIDB4MDAsIDB4MTAsIDB4N0MsIDB4MDUsIDB4MDAsIDB4MDQsIDB4N0MsCisJIDB4MDMsIDB4MDAsIDB4MjAsIDB4N0MsIDB4MDEsIDB4MDAsIDB4MDIsIDB4N0MsIDB4MkQsIDB4NjAsIDB4Q0UsIDB4NjEsIDB4QTEsIDB4RDksIDB4NTAsIDB4OTQsCisJIDB4MkQsIDB4NjAsIDB4RDAsIDB4NjEsIDB4QTEsIDB4REIsIDB4MkQsIDB4NjAsIDB4QzQsIDB4NjEsIDB4QTEsIDB4RDEsIDB4MkQsIDB4NjAsIDB4RDgsIDB4NjEsCisJIDB4QTEsIDB4RDMsIDB4MkQsIDB4NjAsIDB4Q0UsIDB4NjEsIDB4QTAsIDB4ODQsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MjYsIDB4MDUsIDB4MDAsCisJIDB4MDQsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MDgsIDB4MDAsIDB4MjgsIDB4MDAsIDB4MTAsIDB4N0MsIDB4MDYsIDB4MDAsIDB4NjQsIDB4NDAsCisJIDB4MTAsIDB4MjYsIDB4MjMsIDB4MDAsIDB4MDQsIDB4N0MsIDB4MDEsIDB4MDAsIDB4MDEsIDB4N0MsIDB4MkQsIDB4NjAsIDB4RDAsIDB4NjEsIDB4QTEsIDB4RDksCisJIDB4NTAsIDB4OTQsIDB4MkQsIDB4NjAsIDB4RDIsIDB4NjEsIDB4QTEsIDB4REIsIDB4MkQsIDB4NjAsIDB4QzYsIDB4NjEsIDB4QTEsIDB4RDEsIDB4MkQsIDB4NjAsCisJIDB4REEsIDB4NjEsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MDQsIDB4MjYsCisJIDB4MDUsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDIsIDB4N0MsIDB4MDMsIDB4MDAsIDB4MDQsIDB4N0MsIDB4MDEsIDB4MDAsCisJIDB4MjAsIDB4N0MsIDB4MkQsIDB4NjAsIDB4RDIsIDB4NjEsIDB4QTEsIDB4RDksIDB4MEQsIDB4MDAsIDB4NTAsIDB4OTQsIDB4MkQsIDB4NjAsIDB4Q0UsIDB4NjIsCisJIDB4QTIsIDB4REIsIDB4MkQsIDB4NjAsIDB4RDAsIDB4NjIsIDB4QTIsIDB4REIsIDB4MkQsIDB4NjAsIDB4RDIsIDB4NjIsIDB4QTIsIDB4REIsIDB4MkQsIDB4NjAsCisJIDB4RDQsIDB4NjIsIDB4QTIsIDB4REIsIDB4N0MsIDB4NDQsIDB4MkQsIDB4NjAsIDB4Q0UsIDB4NjEsIDB4QTEsIDB4RDEsIDB4QkQsIDB4RDksIDB4MkQsIDB4NjAsCisJIDB4RDAsIDB4NjEsIDB4QTEsIDB4RDEsIDB4QjAsIDB4ODQsIDB4QkQsIDB4RDksIDB4MkQsIDB4NjAsIDB4RDIsIDB4NjEsIDB4QTEsIDB4RDEsIDB4QjAsIDB4ODQsCisJIDB4QkQsIDB4RDksIDB4MkQsIDB4NjAsIDB4QzgsIDB4NjEsIDB4QTEsIDB4RDEsIDB4QjAsIDB4ODQsIDB4QkQsIDB4RDksIDB4MDgsIDB4MjgsIDB4NjgsIDB4MDAsCisJIDB4MjgsIDB4NjAsIDB4MkMsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MjQsIDB4NjAsIDB4MDAsCisJIDB4NjAsIDB4NDAsIDB4MEIsIDB4MzYsIDB4NUQsIDB4MDAsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MjcsIDB4NUEsIDB4MDAsIDB4ODgsIDB4MDAsIDB4MjAsIDB4RkUsCisJIDB4MDAsIDB4NjUsIDB4NjAsIDB4RkUsIDB4MkQsIDB4NjAsIDB4REUsIDB4NjIsIDB4QTIsIDB4REIsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MDgsIDB4MjAsCisJIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4MDIsIDB4QTUsIDB4NjQsIDB4NDQsIDB4RDQsIDB4OUMsIDB4RDQsIDB4ODAsCisJIDB4MkQsIDB4NjAsIDB4RTAsIDB4NjIsIDB4MDIsIDB4MDUsIDB4MDgsIDB4NjUsIDB4NDEsIDB4MDAsIDB4QTIsIDB4RDksIDB4N0MsIDB4NDQsIDB4MkQsIDB4NjAsCisJIDB4RTIsIDB4NjIsIDB4QTIsIDB4REIsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4MDAsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MDEsIDB4NjUsCisJIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NTAsIDB4M0EsIDB4MDEsIDB4NjUsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4RjIsIDB4M0EsIDB4MDEsIDB4NjUsIDB4REQsIDB4ODEsIDB4QTEsIDB4RDEsIDB4NjUsIDB4NDAsIDB4MDAsIDB4M0EsCisJIDB4MTgsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDEsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsCisJIDB4MDIsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MzYsIDB4MDQsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDQsIDB4MzYsIDB4MTAsIDB4NjUsIDB4NjQsIDB4NDAsCisJIDB4MDUsIDB4MzYsIDB4MjAsIDB4NjUsIDB4NjUsIDB4NUMsIDB4MkQsIDB4NjAsIDB4RTIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MkQsIDB4NjAsIDB4REUsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MDAsIDB4NjUsIDB4RkYsIDB4QTQsIDB4QTIsIDB4REIsIDB4Q0EsIDB4MDIsCisJIDB4MkQsIDB4NjAsIDB4RTIsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MkQsIDB4NjAsIDB4RTAsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjAsIDB4RkUsIDB4OEEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4M0EsIDB4QTQsIDB4OEEsIDB4RkIsIDB4M0QsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4ODksIDB4RjMsIDB4N0YsIDB4RjEsIDB4MDQsIDB4QTQsIDB4ODksIDB4RkIsIDB4MTIsIDB4NjAsIDB4MjIsIDB4NjMsIDB4NTMsIDB4RjMsIDB4NjQsIDB4NDEsCisJIDB4MDgsIDB4QjAsIDB4RTEsIDB4ODUsIDB4MUMsIDB4MDMsIDB4RkUsIDB4QTEsIDB4NDcsIDB4RDMsIDB4MDIsIDB4MDYsIDB4RkIsIDB4QjQsIDB4QTMsIDB4REIsCisJIDB4REQsIDB4ODEsIDB4NUIsIDB4RDMsIDB4MEMsIDB4MjQsIDB4MDIsIDB4MDAsIDB4RkIsIDB4QjQsIDB4QTMsIDB4REIsIDB4NUIsIDB4RDMsIDB4REQsIDB4ODEsCisJIDB4MDIsIDB4QkMsIDB4QTMsIDB4REIsIDB4MEUsIDB4NjUsIDB4REQsIDB4ODEsIDB4RDUsIDB4ODAsIDB4NUIsIDB4RDMsIDB4MDgsIDB4MDUsIDB4RkIsIDB4QjQsCisJIDB4QTMsIDB4REIsIDB4REQsIDB4ODEsIDB4RDUsIDB4ODAsIDB4NUIsIDB4RDMsIDB4MDIsIDB4MDMsIDB4RkIsIDB4QjQsIDB4QTMsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MjAsIDB4RkUsIDB4MjYsIDB4NDYsIDB4MzEsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MTgsIDB4MDAsIDB4M0YsIDB4RjIsIDB4NDcsIDB4NjUsIDB4QzQsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4MjMsIDB4RkEsIDB4RjEsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjQsIDB4RkEsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsCisJIDB4NjQsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4RkEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MTYsIDB4NjMsIDB4MUMsIDB4NjAsIDB4OEMsIDB4NjIsIDB4MDAsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkUsIDB4MUYsIDB4NUIsIDB4RkIsIDB4NUMsIDB4RkIsCisJIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjMsIDB4MDIsIDB4NjQsIDB4QTMsIDB4REIsIDB4MUEsIDB4NjAsIDB4QzYsIDB4NjIsIDB4M0UsIDB4NjMsIDB4MDAsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkUsIDB4MUYsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4OTgsIDB4NjIsIDB4QTIsIDB4RDMsIDB4MDAsIDB4NjMsCisJIDB4RjgsIDB4QTAsIDB4MDEsIDB4QTQsIDB4MDMsIDB4MDMsIDB4QTIsIDB4REIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4REQsIDB4MUMsIDB4NjAsCisJIDB4OUEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4QTIsIDB4REQsIDB4NUEsIDB4RDMsIDB4QTIsIDB4REQsIDB4QzAsIDB4ODEsIDB4NjEsIDB4NDQsIDB4MDIsIDB4MjQsCisJIDB4RkYsIDB4RkYsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4NUEsIDB4RDMsIDB4RTksIDB4ODEsIDB4RTgsIDB4ODMsCisJIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODUsIDB4RDQsIDB4ODUsIDB4QzUsIDB4ODMsIDB4QTIsIDB4REQsIDB4MUMsIDB4NjAsCisJIDB4OEUsIDB4NjIsIDB4NjMsIDB4NDcsIDB4MDAsIDB4N0YsIDB4QTIsIDB4REIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4QTAsIDB4NjUsCisJIDB4QTUsIDB4REQsIDB4MUIsIDB4NjAsIDB4NDYsIDB4NjUsIDB4NjEsIDB4NDQsIDB4MkIsIDB4NDEsIDB4NDUsIDB4REIsIDB4NjAsIDB4NDEsIDB4MUIsIDB4NjAsCisJIDB4ODYsIDB4NjUsIDB4MEEsIDB4QTMsIDB4QTMsIDB4RDEsIDB4MkIsIDB4NDQsIDB4NDQsIDB4RDksIDB4MUMsIDB4NjAsIDB4QTAsIDB4NjUsIDB4QTUsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsIDB4MDAsIDB4QjksIDB4RkYsIDB4RkYsIDB4NEMsIDB4MDMsIDB4MDYsIDB4QTMsIDB4QkQsIDB4RDEsIDB4ODEsIDB4RjMsCisJIDB4ODIsIDB4RjEsIDB4RDAsIDB4ODAsIDB4QkQsIDB4RDMsIDB4MjIsIDB4MDIsIDB4ODMsIDB4RjMsIDB4RDAsIDB4ODAsIDB4QTMsIDB4RDEsIDB4MUUsIDB4MDIsCisJIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MUIsIDB4MDIsIDB4OEEsIDB4RjMsIDB4MTIsIDB4NjAsIDB4NDYsIDB4NjMsIDB4QzYsIDB4QTUsIDB4NDcsIDB4RDEsCisJIDB4N0YsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjgsIDB4RkYsIDB4NjEsIDB4NjEsIDB4NDMsIDB4MUEsIDB4NjAsCisJIDB4QzYsIDB4NjUsIDB4MkIsIDB4NDQsIDB4NDQsIDB4RDEsIDB4MUMsIDB4NjAsIDB4OEUsIDB4NjUsIDB4QTUsIDB4RDEsIDB4NjQsIDB4NDQsIDB4RDAsIDB4ODEsCisJIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjUsIDB4MDEsIDB4MDUsIDB4MDAsIDB4NjEsIDB4QTUsIDB4RDMsIDB4MTUsIDB4MDAsIDB4MUEsIDB4NjAsIDB4QzYsIDB4NjUsCisJIDB4MkIsIDB4NDQsIDB4NDQsIDB4RDEsIDB4MUMsIDB4NjAsIDB4OEUsIDB4NjUsIDB4NjQsIDB4NDMsIDB4QTUsIDB4RDEsIDB4NjQsIDB4NjUsIDB4NjMsIDB4NDQsCisJIDB4QzAsIDB4ODQsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDYsIDB4MDAsIDB4NjEsIDB4MTMsIDB4MDAsIDB4NjEsIDB4NDMsIDB4RDAsIDB4ODEsCisJIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjUsIDB4QTUsIDB4RDMsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4Q0MsIDB4ODQsIDB4Q0MsIDB4ODQsIDB4MDIsIDB4MDMsCisJIDB4MDIsIDB4MDMsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODUsIDB4RDcsIDB4ODQsIDB4NjAsIDB4NDEsIDB4MDEsIDB4MDUsCisJIDB4MDAsIDB4NjEsIDB4MUMsIDB4NjAsIDB4QTAsIDB4NjUsIDB4QTUsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MUMsIDB4NjAsIDB4OTQsIDB4NjUsIDB4QTUsIDB4RDEsIDB4NUIsIDB4RjMsIDB4NjQsIDB4NDEsIDB4Q0QsIDB4ODEsIDB4Q0QsIDB4ODEsIDB4MDIsIDB4MDMsCisJIDB4MDIsIDB4MDMsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODUsIDB4MjksIDB4NDQsIDB4NTQsIDB4ODksIDB4MkUsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4RUQsIDB4RjMsIDB4MUEsIDB4NjAsIDB4QkUsIDB4NjMsIDB4MEYsIDB4QjQsIDB4MDEsIDB4QTQsIDB4RTAsIDB4ODcsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4QkQsIDB4REIsIDB4MTAsIDB4NjAsIDB4NTgsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDIsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDYsIDB4NjQsCisJIDB4QTMsIDB4REIsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4QkEsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUEsIDB4NjAsIDB4QkUsIDB4NjMsIDB4RUEsIDB4NjAsIDB4NjAsIDB4NjQsCisJIDB4QkQsIDB4REIsIDB4MTAsIDB4NjAsIDB4NTgsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDIsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDYsIDB4NjQsIDB4QTMsIDB4REIsCisJIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsIDB4QkEsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4RkYsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjMsIDB4MUMsIDB4NjAsIDB4OEMsIDB4NjIsIDB4MDAsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkUsIDB4MUYsIDB4NUIsIDB4RkIsIDB4NUMsIDB4RkIsIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjMsIDB4MDIsIDB4NjQsIDB4QTMsIDB4REIsIDB4MUEsIDB4NjAsCisJIDB4QzYsIDB4NjIsIDB4M0UsIDB4NjMsIDB4MDAsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkUsIDB4MUYsIDB4MTAsIDB4NjAsIDB4NTYsIDB4NjIsIDB4RjUsIDB4NjAsCisJIDB4MjksIDB4NjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4MkMsIDB4NjIsIDB4RjUsIDB4NjAsIDB4MTUsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsCisJIDB4MDIsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4MDQsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4RjQsIDB4NjAsIDB4MTYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4NDQsIDB4NDAsIDB4MjYsCisJIDB4MDMsIDB4MDAsIDB4RjQsIDB4NjAsIDB4RUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4NDAsIDB4NTIsIDB4MjMsIDB4MDcsIDB4MDAsIDB4NUEsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4QTQsIDB4NUEsIDB4RkIsIDB4RjQsIDB4NjAsIDB4RDcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjUsCisJIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjUsIDB4MDIsIDB4NjQsIDB4QTUsIDB4REIsIDB4MUEsIDB4NjAsIDB4QzQsIDB4NjIsCisJIDB4N0UsIDB4NjMsIDB4MDAsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkUsIDB4MUYsIDB4MUMsIDB4NjAsIDB4OTYsIDB4NjIsIDB4QTIsIDB4REQsIDB4OEMsIDB4RjMsCisJIDB4NTgsIDB4RkIsIDB4MDIsIDB4NjQsIDB4OEMsIDB4RkIsIDB4RkYsIDB4RkYsIDB4QzEsIDB4RkUsIDB4OEMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsCisJIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDMsIDB4MTAsIDB4NjAsIDB4MDQsIDB4NjIsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RjQsIDB4NjAsCisJIDB4M0QsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4NjQsIDB4NTMsIDB4RkIsIDB4MjksIDB4NjAsCisJIDB4QTQsIDB4NjQsIDB4NTQsIDB4RkIsIDB4MEYsIDB4NEUsIDB4RUMsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsCisJIDB4MTAsIDB4NjAsIDB4MDIsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4MDQsIDB4NjIsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4RjQsIDB4NjAsIDB4NjcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NTgsIDB4RjMsCisJIDB4OEMsIDB4RkIsIDB4Q0EsIDB4RkUsIDB4QzEsIDB4RkUsIDB4MUMsIDB4NjAsIDB4QTIsIDB4NjIsIDB4NjYsIDB4NDQsIDB4QTIsIDB4REIsIDB4NUEsIDB4REQsCisJIDB4NjEsIDB4NDQsIDB4NUEsIDB4REIsIDB4NjcsIDB4RjUsIDB4Q0MsIDB4RjEsIDB4MTksIDB4RjgsIDB4RjgsIDB4NjAsIDB4ODAsIDB4NjQsIDB4MEUsIDB4RkEsCisJIDB4QTksIDB4RjEsIDB4MDcsIDB4RjgsIDB4MDEsIDB4NjAsIDB4NjAsIDB4NjcsIDB4MkMsIDB4RkEsIDB4MUQsIDB4NjQsIDB4MkQsIDB4RkEsIDB4MDEsIDB4NjQsCisJIDB4MkUsIDB4RkEsIDB4RUIsIDB4RjEsIDB4MkYsIDB4RjgsIDB4RUMsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUQsIDB4RjEsIDB4MzEsIDB4RjgsIDB4ODEsIDB4RjEsCisJIDB4MzIsIDB4RjgsIDB4ODIsIDB4RjEsIDB4MzMsIDB4RjgsIDB4ODMsIDB4RjEsIDB4MzQsIDB4RjgsIDB4MDgsIDB4NjQsIDB4MkEsIDB4RkEsIDB4NDAsIDB4NjMsCisJIDB4M0YsIDB4RkMsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsIDB4Q0IsIDB4ODMsIDB4MDAsIDB4NjQsIDB4NUEsIDB4REEsIDB4RkUsIDB4MUYsIDB4MUMsIDB4NjAsCisJIDB4OEUsIDB4NjUsIDB4QTUsIDB4RDMsIDB4MDIsIDB4RkEsIDB4MTksIDB4NjAsIDB4ODgsIDB4NjQsIDB4QTAsIDB4RDEsIDB4MEEsIDB4NjEsIDB4NDEsIDB4RDMsCisJIDB4MDMsIDB4RkEsIDB4MDYsIDB4NjEsIDB4MDYsIDB4NjMsIDB4MDAsIDB4NjUsIDB4MUIsIDB4NjAsIDB4ODYsIDB4NjQsIDB4NDQsIDB4RDEsIDB4NTksIDB4RDgsCisJIDB4MUIsIDB4NjAsIDB4NDYsIDB4NjQsIDB4NDQsIDB4RDEsIDB4NTksIDB4RDgsIDB4MUEsIDB4NjAsIDB4QzYsIDB4NjQsIDB4NDQsIDB4RDEsIDB4NTksIDB4RDgsCisJIDB4MUIsIDB4NjAsIDB4MDYsIDB4NjQsIDB4NDQsIDB4RDEsIDB4NTksIDB4RDgsIDB4NjUsIDB4NDQsIDB4MDIsIDB4QTQsIDB4NjAsIDB4NDUsIDB4RUMsIDB4MUYsCisJIDB4NjcsIDB4RjUsIDB4MjQsIDB4NjAsIDB4NzQsIDB4NjIsIDB4MjQsIDB4NjAsIDB4MjIsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MUMsIDB4NjAsIDB4QTIsIDB4NjIsIDB4QTIsIDB4RDUsIDB4NUEsIDB4RDMsCisJIDB4NUEsIDB4RDMsIDB4NjAsIDB4NDMsIDB4NjAsIDB4NDEsIDB4MEYsIDB4NjAsIDB4RUEsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4QkYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4RjMsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4RDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MDIsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsCisJIDB4MDQsIDB4NjIsIDB4MTAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTIsIDB4REIsIDB4RjQsIDB4NjAsIDB4MTYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4QTQsIDB4NjMsIDB4NjYsIDB4NDQsIDB4QTMsIDB4REIsIDB4MDAsIDB4NjAsIDB4NDAsIDB4NjEsCisJIDB4QUUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4NjcsIDB4RkIsIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsCisJIDB4MUMsIDB4NjAsIDB4QTQsIDB4NjMsIDB4QTMsIDB4RDEsIDB4MDAsIDB4NjQsIDB4NjQsIDB4NDYsIDB4QTMsIDB4REIsIDB4MDAsIDB4NjAsIDB4NDAsIDB4NjUsCisJIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsIDB4RjMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MDIsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4MDQsIDB4NjIsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTIsIDB4REIsIDB4RjQsIDB4NjAsCisJIDB4MTYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjAsIDB4QUEsIDB4NjIsIDB4MUEsIDB4NjAsCisJIDB4QkEsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MDIsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NUEsIDB4REIsIDB4RkYsIDB4NjAsIDB4OUYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MDIsIDB4NjIsIDB4QTIsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisKK307ICAvKiBmd19pbWFnZV80X2RhdGEgKi8KKworc3RhdGljIGNvbnN0IENGR19JREVOVElUWV9TVFJDVCBmd19pbWFnZV9pbmZvaWRlbnRpdHlbXSA9IHsKKwl7CisJCXNpemVvZiggQ0ZHX0lERU5USVRZX1NUUkNUICkgLyBzaXplb2YoaGNmXzE2KSAtIDEsCisJCUNGR19GV19JREVOVElUWSwKKwkJQ09NUF9JRF9GV19TVEEsCisJCTMsCQkJCQkJCS8vVmFyaWFudAorCQkyLAkJCQkJCQkvL01ham9yCisJCTM2CQkJCQkJCS8vTWlub3IKKwl9LAorCXsgMDAwMCwgMDAwMCwgMDAwMCwgMDAwMCwgMDAwMCwgMDAwMCB9CQkvL2VuZHNlbnRpbmVsCit9OworCitzdGF0aWMgY29uc3QgQ0ZHX1BST0dfU1RSQ1QgZndfaW1hZ2VfY29kZVtdID0geworCXsKKwkJOCwKKwkJQ0ZHX1BST0csCisJCUNGR19QUk9HX1ZPTEFUSUxFLAkJCS8vIG1vZGUKKwkJMHgwMTg2LAkJLy8gc2l6ZW9mKGZ3X2ltYWdlXzFfZGF0YSksCisJCTB4MDAwMDAwNjAsCQkJCQkvLyBUYXJnZXQgYWRkcmVzcyBpbiBOSUMgTWVtb3J5CisJCTB4MDAwMCwJCQkJCQkvLyBDUkM6IHllcy9ubwlUWVBFOiBwcmltYXJ5L3N0YXRpb24vdGVydGlhcnkKKwkJKGhjZl84IEZBUiAgICopIGZ3X2ltYWdlXzFfZGF0YQorCX0sCisJeworCQk4LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfVk9MQVRJTEUsCQkJLy8gbW9kZQorCQkweDI1MTgsCQkvLyBzaXplb2YoZndfaW1hZ2VfMl9kYXRhKSwKKwkJMHgwMDAwMEMxNiwJCQkJCS8vIFRhcmdldCBhZGRyZXNzIGluIE5JQyBNZW1vcnkKKwkJMHgwMDAwLAkJCQkJCS8vIENSQzogeWVzL25vCVRZUEU6IHByaW1hcnkvc3RhdGlvbi90ZXJ0aWFyeQorCQkoaGNmXzggRkFSICAgKikgZndfaW1hZ2VfMl9kYXRhCisJfSwKKwl7CisJCTgsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19WT0xBVElMRSwJCQkvLyBtb2RlCisJCTB4M2RhYSwJCS8vIHNpemVvZihmd19pbWFnZV8zX2RhdGEpLAorCQkweDAwMUUzMTJFLAkJCQkJLy8gVGFyZ2V0IGFkZHJlc3MgaW4gTklDIE1lbW9yeQorCQkweDAwMDAsCQkJCQkJLy8gQ1JDOiB5ZXMvbm8JVFlQRTogcHJpbWFyeS9zdGF0aW9uL3RlcnRpYXJ5CisJCShoY2ZfOCBGQVIgICAqKSBmd19pbWFnZV8zX2RhdGEKKwl9LAorCXsKKwkJOCwKKwkJQ0ZHX1BST0csCisJCUNGR19QUk9HX1ZPTEFUSUxFLAkJCS8vIG1vZGUKKwkJMHhhYTY2LAkJLy8gc2l6ZW9mKGZ3X2ltYWdlXzRfZGF0YSksCisJCTB4MDAxRjQwMDAsCQkJCQkvLyBUYXJnZXQgYWRkcmVzcyBpbiBOSUMgTWVtb3J5CisJCTB4MDAwMCwJCQkJCQkvLyBDUkM6IHllcy9ubwlUWVBFOiBwcmltYXJ5L3N0YXRpb24vdGVydGlhcnkKKwkJKGhjZl84IEZBUiAgICopIGZ3X2ltYWdlXzRfZGF0YQorCX0sCisJeworCQk1LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfU1RPUCwJCQkJLy8gbW9kZQorCQkwMDAwLAorIAkweDAwMEYzNjhFLAkJCQkJLy8gU3RhcnQgZXhlY3V0aW9uIGFkZHJlc3MKKwl9LAorCXsgMDAwMCwgMDAwMCwgMDAwMCwgMDAwMCwgMDAwMDAwMDAsIDAwMDAsIDAwMDAwMDAwfQorfTsKKworc3RhdGljIGNvbnN0IENGR19SQU5HRTIwX1NUUkNUIGZ3X2ltYWdlX2luZm9jb21wYXRbXSA9IHsKKwl7CTMgKyAoKDIwICogc2l6ZW9mKENGR19SQU5HRV9TUEVDX1NUUkNUKSkgLyBzaXplb2YoaGNmXzE2KSksCisJCUNGR19GV19TVVBfUkFOR0UsCisJCUNPTVBfUk9MRV9TVVBMLAorCQlDT01QX0lEX1NUQSwKKwkJeworCQkJeyAyLCAyLCA1IH0gIAkJCQkvL3ZhcmlhbnQsIGJvdHRvbSwgdG9wCisJCX0KKwl9LAorCXsJMyArICgoMjAgKiBzaXplb2YoQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QpKSAvIHNpemVvZihoY2ZfMTYpKSwKKwkJQ0ZHX01GSV9BQ1RfUkFOR0VTX1NUQSwKKwkJQ09NUF9ST0xFX0FDVCwKKwkJQ09NUF9JRF9NRkksCisJCXsKKwkJCXsgNCwgNiwgNyB9LCAJCQkJLy92YXJpYW50LCBib3R0b20sIHRvcAorCQkJeyA1LCA2LCA3IH0sIAkJCQkvL3ZhcmlhbnQsIGJvdHRvbSwgdG9wCisJCQl7IDYsIDYsIDcgfSAgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJfQorCX0sCisJewkzICsgKCgyMCAqIHNpemVvZihDRkdfUkFOR0VfU1BFQ19TVFJDVCkpIC8gc2l6ZW9mKGhjZl8xNikpLAorCQlDRkdfQ0ZJX0FDVF9SQU5HRVNfU1RBLAorCQlDT01QX1JPTEVfQUNULAorCQlDT01QX0lEX0NGSSwKKwkJeworCQkJeyAyLCAxLCAyIH0gIAkJCQkvL3ZhcmlhbnQsIGJvdHRvbSwgdG9wCisJCX0KKwl9LAorCXsgMDAwMCwgMDAwMCwgMDAwMCwgMDAwMCwgeyB7IDAwMDAsIDAwMDAsIDAwMDAgfSB9IH0JLy9lbmRzZW50aW5lbAorfTsKKworbWVtaW1hZ2UgZndfaW1hZ2UgPSB7CisJIkZVUFU3RDM3ZGhmd2NpXDAwMUMiLAkJCS8vc2lnbmF0dXJlLCA8Zm9ybWF0IG51bWJlcj4sIEMvQmluIHR5cGUKKwkoQ0ZHX1BST0dfU1RSQ1QgKikgZndfaW1hZ2VfY29kZSwKKwkweDAwMEYzNjhFLAorCTAwMDAwMDAwLAkJCQkJLy8oZHVtbXkpIHBkYXBsdWcKKwkwMDAwMDAwMCwJCQkJCS8vKGR1bW15KSBwcmlwbHVnCisJKENGR19SQU5HRTIwX1NUUkNUICopIGZ3X2ltYWdlX2luZm9jb21wYXQsCisJKENGR19JREVOVElUWV9TVFJDVCAqKSBmd19pbWFnZV9pbmZvaWRlbnRpdHksCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9zdGFfaDI1LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9zdGFfaDI1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjYTFjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3N0YV9oMjUuYwpAQCAtMCwwICsxLDUyNTUgQEAKKy8qCisgKiBGaWxlOglzdGFfaDU0LjEzNgorICoKKyAqIEFic3RyYWN0OglUaGlzIGZpbGUgY29udGFpbnMgbWVtb3J5IGltYWdlICdmd19pbWFnZScuCisgKgorICogQ29udGVudHM6CVRvdGFsIHNpemUgb2YgdGhlIG1lbW9yeSBpbWFnZTogODE3NDIgYnl0ZXMuCisgKgkJVG90YWwgbnVtYmVyIG9mIGJsb2NrczogNCBibG9ja3MuCisgKgkJQmxvY2sgIDEgOiBsb2FkIGFkZHJlc3MgMDAwMDAwNjAsIDM4OCBieXRlcy4KKyAqCQlCbG9jayAgMiA6IGxvYWQgYWRkcmVzcyAwMDAwMEMxNiwgMTEyNzggYnl0ZXMuCisgKgkJQmxvY2sgIDMgOiBsb2FkIGFkZHJlc3MgMDAxRTM4MjQsIDIxNzI2IGJ5dGVzLgorICoJCUJsb2NrICA0IDogbG9hZCBhZGRyZXNzIDAwMUY0MDAwLCA0ODM1MCBieXRlcy4KKyAqCisgKiBJZGVudGl0eToJY29tcG9uZW50IGlkOiAzMSAodmFyaWFudCA0KSB2ZXJzaW9uIDEuMzYKKyAqCisgKiBDb21wYXRpYmlsaXR5OgorICoJCXN1cHBseWluZyBpbnRlcmZhY2UgNCAodmFyaWFudCA0KSA6IDEgLSAyCisgKgkJYWN0aW5nIG9uIGludGVyZmFjZSAxICh2YXJpYW50IDcpIDogMyAtIDMKKyAqCQlhY3Rpbmcgb24gaW50ZXJmYWNlIDEgKHZhcmlhbnQgOCkgOiAxIC0gMQorICoJCWFjdGluZyBvbiBpbnRlcmZhY2UgMiAodmFyaWFudCA0KSA6IDEgLSAyCisgKgorICogR2VuZXJhdGVkOglieSBnOlxmd1xmdXB1My5leGUgdmVyc2lvbiA0LjI2CisgKgorICogQ29tbWFuZGxpbmU6CWc6XGZ3XGZ1cHUzLmV4ZSAvZj00IC9uPWZ3X2ltYWdlIC9pPXI0MDEzNjAwLmhleAorICovCisKKworI2luY2x1ZGUgImhjZmNmZy5oIgkJCQkvLyB0byBnZXQgaGNmXzE2IGV0YyBkZWZpbmVkIGFzIHdlbGwgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libGUgc2V0dGluZ3Mgd2hpY2ggaW5sdWVuY2UgbWRkLmggb3IgZGhmLmgKKyNpbmNsdWRlICJtZGQuaCIgICAJCQkJLy90byBnZXQgQ09NUF9JRF9TVEEgZXRjIGRlZmluZWQKKyNpbmNsdWRlICJkaGYuaCIgICAJCQkJLy91c2VkIHRvIGJlICJmaGZtZW0uaCIsIHRvIGdldCBtZW1ibG9jayxwbHVncmVjb3JkLAorCitzdGF0aWMgY29uc3QgaGNmXzggZndfaW1hZ2VfMV9kYXRhW10gPSB7CisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4MEMsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4NjUsIDB4MzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUIsIDB4MDAsIDB4MUIsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjIsIDB4MUIsIDB4QjIsIDB4MUIsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4MDAsIDB4MDAsIDB4RkYsIDB4MDcsCisJIDB4MDEsIDB4MDAsIDB4NjQsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MTAsIDB4MjcsIDB4MTAsIDB4MjcsIDB4MTQsIDB4MDAsIDB4RDAsIDB4MDcsIDB4RDAsIDB4MDcsCisJIDB4MTAsIDB4MjcsIDB4MkYsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MTAsIDB4MjcsCisJIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDksIDB4MkIsIDB4MDksIDB4MkIsIDB4MDksIDB4RkYsIDB4MEYsIDB4RjAsIDB4MEYsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDEsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MEEsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisKK307ICAvKiBmd19pbWFnZV8xX2RhdGEgKi8KKworc3RhdGljIGNvbnN0IGhjZl84IGZ3X2ltYWdlXzJfZGF0YVtdID0geworCSAweEY0LCAweEEzLCAweDAwLCAweDE2LCAweDA4LCAweDQwLCAweDBGLCAweEQyLCAweEUxLCAweDI4LCAweEE1LCAweDdDLCAweDUwLCAweDMwLCAweEYxLCAweDg0LAorCSAweDQ0LCAweDA4LCAweEFCLCAweEFFLCAweEE1LCAweEI4LCAweEZDLCAweEJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LAorCSAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE1LCAweEM2LCAweDg0LCAweEY4LCAweDk5LCAweEVFLAorCSAweDhELCAweEY2LCAweDBELCAweEZGLCAweEJELCAweEQ2LCAweEIxLCAweERFLCAweDU0LCAweDkxLCAweDUwLCAweDYwLCAweDAzLCAweDAyLCAweEE5LCAweENFLAorCSAweDdELCAweDU2LCAweDE5LCAweEU3LCAweDYyLCAweEI1LCAweEU2LCAweDRELCAweDlBLCAweEVDLCAweDQ1LCAweDhGLCAweDlELCAweDFGLCAweDQwLCAweDg5LAorCSAweDg3LCAweEZBLCAweDE1LCAweEVGLCAweEVCLCAweEIyLCAweEM5LCAweDhFLCAweDBCLCAweEZCLCAweEVDLCAweDQxLCAweDY3LCAweEIzLCAweEZELCAweDVGLAorCSAweEVBLCAweDQ1LCAweEJGLCAweDIzLCAweEY3LCAweDUzLCAweDk2LCAweEU0LCAweDVCLCAweDlCLCAweEMyLCAweDc1LCAweDFDLCAweEUxLCAweEFFLCAweDNELAorCSAweDZBLCAweDRDLCAweDVBLCAweDZDLCAweDQxLCAweDdFLCAweDAyLCAweEY1LCAweDRGLCAweDgzLCAweDVDLCAweDY4LCAweEY0LCAweDUxLCAweDM0LCAweEQxLAorCSAweDA4LCAweEY5LCAweDkzLCAweEUyLCAweDczLCAweEFCLCAweDUzLCAweDYyLCAweDNGLCAweDJBLCAweDBDLCAweDA4LCAweDUyLCAweDk1LCAweDY1LCAweDQ2LAorCSAweDVFLCAweDlELCAweDI4LCAweDMwLCAweEExLCAweDM3LCAweDBGLCAweDBBLCAweEI1LCAweDJGLCAweDA5LCAweDBFLCAweDM2LCAweDI0LCAweDlCLCAweDFCLAorCSAweDNELCAweERGLCAweDI2LCAweENELCAweDY5LCAweDRFLCAweENELCAweDdGLCAweDlGLCAweEVBLCAweDFCLCAweDEyLCAweDlFLCAweDFELCAweDc0LCAweDU4LAorCSAweDJFLCAweDM0LCAweDJELCAweDM2LCAweEIyLCAweERDLCAweEVFLCAweEI0LCAweEZCLCAweDVCLCAweEY2LCAweEE0LCAweDRELCAweDc2LCAweDYxLCAweEI3LAorCSAweENFLCAweDdELCAweDdCLCAweDUyLCAweDNFLCAweERELCAweDcxLCAweDVFLCAweDk3LCAweDEzLCAweEY1LCAweEE2LCAweDY4LCAweEI5LCAweDAwLCAweDAwLAorCSAweDJDLCAweEMxLCAweDYwLCAweDQwLCAweDFGLCAweEUzLCAweEM4LCAweDc5LCAweEVELCAweEI2LCAweEJFLCAweEQ0LCAweDQ2LCAweDhELCAweEQ5LCAweDY3LAorCSAweDRCLCAweDcyLCAweERFLCAweDk0LCAweEQ0LCAweDk4LCAweEU4LCAweEIwLCAweDRBLCAweDg1LCAweDZCLCAweEJCLCAweDJBLCAweEM1LCAweEU1LCAweDRGLAorCSAweDE2LCAweEVELCAweEM1LCAweDg2LCAweEQ3LCAweDlBLCAweDU1LCAweDY2LCAweDk0LCAweDExLCAweENGLCAweDhBLCAweDEwLCAweEU5LCAweDA2LCAweDA0LAorCSAweDgxLCAweEZFLCAweEYwLCAweEEwLCAweDQ0LCAweDc4LCAweEJBLCAweDI1LCAweEUzLCAweDRCLCAweEYzLCAweEEyLCAweEZFLCAweDVELCAweEMwLCAweDgwLAorCSAweDhBLCAweDA1LCAweEFELCAweDNGLCAweEJDLCAweDIxLCAweDQ4LCAweDcwLCAweDA0LCAweEYxLCAweERGLCAweDYzLCAweEMxLCAweDc3LCAweDc1LCAweEFGLAorCSAweDYzLCAweDQyLCAweDMwLCAweDIwLCAweDFBLCAweEU1LCAweDBFLCAweEZELCAweDZELCAweEJGLCAweDRDLCAweDgxLCAweDE0LCAweDE4LCAweDM1LCAweDI2LAorCSAweDJGLCAweEMzLCAweEUxLCAweEJFLCAweEEyLCAweDM1LCAweENDLCAweDg4LCAweDM5LCAweDJFLCAweDU3LCAweDkzLCAweEYyLCAweDU1LCAweDgyLCAweEZDLAorCSAweDQ3LCAweDdBLCAweEFDLCAweEM4LCAweEU3LCAweEJBLCAweDJCLCAweDMyLCAweDk1LCAweEU2LCAweEEwLCAweEMwLCAweDk4LCAweDE5LCAweEQxLCAweDlFLAorCSAweDdGLCAweEEzLCAweDY2LCAweDQ0LCAweDdFLCAweDU0LCAweEFCLCAweDNCLCAweDgzLCAweDBCLCAweENBLCAweDhDLCAweDI5LCAweEM3LCAweEQzLCAweDZCLAorCSAweDNDLCAweDI4LCAweDc5LCAweEE3LCAweEUyLCAweEJDLCAweDFELCAweDE2LCAweDc2LCAweEFELCAweDNCLCAweERCLCAweDU2LCAweDY0LCAweDRFLCAweDc0LAorCSAweDFFLCAweDE0LCAweERCLCAweDkyLCAweDBBLCAweDBDLCAweDZDLCAweDQ4LCAweEU0LCAweEI4LCAweDVELCAweDlGLCAweDZFLCAweEJELCAweEVGLCAweDQzLAorCSAweEE2LCAweEM0LCAweEE4LCAweDM5LCAweEE0LCAweDMxLCAweDM3LCAweEQzLCAweDhCLCAweEYyLCAweDMyLCAweEQ1LCAweDQzLCAweDhCLCAweDU5LCAweDZFLAorCSAweEI3LCAweERBLCAweDhDLCAweDAxLCAweDY0LCAweEIxLCAweEQyLCAweDlDLCAweEUwLCAweDQ5LCAweEI0LCAweEQ4LCAweEZBLCAweEFDLCAweDA3LCAweEYzLAorCSAweDI1LCAweENGLCAweEFGLCAweENBLCAweDhFLCAweEY0LCAweEU5LCAweDQ3LCAweDE4LCAweDEwLCAweEQ1LCAweDZGLCAweDg4LCAweEYwLCAweDZGLCAweDRBLAorCSAweDcyLCAweDVDLCAweDI0LCAweDM4LCAweEYxLCAweDU3LCAweEM3LCAweDczLCAweDUxLCAweDk3LCAweDIzLCAweENCLCAweDdDLCAweEExLCAweDlDLCAweEU4LAorCSAweDIxLCAweDNFLCAweERELCAweDk2LCAweERDLCAweDYxLCAweDg2LCAweDBELCAweDg1LCAweDBGLCAweDkwLCAweEUwLCAweDQyLCAweDdDLCAweEM0LCAweDcxLAorCSAweEFBLCAweENDLCAweEQ4LCAweDkwLCAweDA1LCAweDA2LCAweDAxLCAweEY3LCAweDEyLCAweDFDLCAweEEzLCAweEMyLCAweDVGLCAweDZBLCAweEY5LCAweEFFLAorCSAweEQwLCAweDY5LCAweDkxLCAweDE3LCAweDU4LCAweDk5LCAweDI3LCAweDNBLCAweEI5LCAweDI3LCAweDM4LCAweEQ5LCAweDEzLCAweEVCLCAweEIzLCAweDJCLAorCSAweDMzLCAweDIyLCAweEJCLCAweEQyLCAweDcwLCAweEE5LCAweDg5LCAweDA3LCAweEE3LCAweDMzLCAweEI2LCAweDJELCAweDIyLCAweDNDLCAweDkyLCAweDE1LAorCSAweDIwLCAweEM5LCAweDQ5LCAweDg3LCAweEZGLCAweEFBLCAweDc4LCAweDUwLCAweDdBLCAweEE1LCAweDhGLCAweDAzLCAweEY4LCAweDU5LCAweDgwLCAweDA5LAorCSAweDE3LCAweDFBLCAweERBLCAweDY1LCAweDMxLCAweEQ3LCAweEM2LCAweDg0LCAweEI4LCAweEQwLCAweEMzLCAweDgyLCAweEIwLCAweDI5LCAweDc3LCAweDVBLAorCSAweDExLCAweDFFLCAweENCLCAweDdCLCAweEZDLCAweEE4LCAweEQ2LCAweDZELCAweDNBLCAweDJDLCAweDAwLCAweDMwLCAweDAwLCAweDMxLCAweDAwLCAweDMzLAorCSAweDAwLCAweDM0LCAweDAwLCAweDM1LCAweDAwLCAweDM2LCAweDAwLCAweDM3LCAweDAwLCAweDM4LCAweDAwLCAweDM4LCAweDAwLCAweDNBLCAweDAwLCAweDNCLAorCSAweDAwLCAweDNDLCAweDAwLCAweDNELCAweDAwLCAweDNFLCAweDAwLCAweDNGLCAweDAwLCAweDNGLCAweDU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweDI4LCAweDEwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDBBLCAweDAyLCAweDE0LCAweDA1LCAweDMyLCAweDBCLCAweDM3LCAweDA4LCAweDUwLCAweDBCLCAweDZFLAorCSAweDAyLCAweDAwLCAweDA0LCAweDAwLCAweDBCLCAweDAwLCAweDE2LCAweDAwLCAweDBDLCAweDAwLCAweDEyLCAweDAwLCAweDE4LCAweDAwLCAweDI0LCAweDAwLAorCSAweDMwLCAweDAwLCAweDQ4LCAweDAwLCAweDYwLCAweDAwLCAweDZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDM5LCAweDAwLCAweDM5LCAweDAwLCAweDIwLCAweDAwLCAweDM5LCAweDAwLCAweDM5LCAweDAwLCAweDIwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDBBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweDEwLAorCSAweDNFLCAweDExLCAweEY2LCAweDEwLCAweDM4LCAweDExLCAweEZDLCAweDEwLCAweDMyLCAweDExLCAweDAyLCAweDExLCAweDJDLCAweDExLCAweDA4LCAweDExLAorCSAweDI2LCAweDExLCAweDBFLCAweDExLCAweDIwLCAweDExLCAweDE0LCAweDExLCAweDFBLCAweDExLCAweDA3LCAweDAxLCAweDAwLCAweDAwLCAweDE2LCAweDIyLAorCSAweDAwLCAweDA0LCAweDA4LCAweDAxLCAweDAwLCAweDAwLCAweDE2LCAweDI2LCAweDAwLCAweDA0LCAweDA5LCAweDAxLCAweDAwLCAweDAwLCAweDE2LCAweDJBLAorCSAweDAwLCAweDA0LCAweDBBLCAweDAxLCAweDAwLCAweDAwLCAweDE2LCAweDJFLCAweDAwLCAweDA0LCAweDBCLCAweDAxLCAweDAwLCAweDAwLCAweDEwLCAweDI0LAorCSAweDA0LCAweDA0LCAweDBDLCAweDAxLCAweDAwLCAweDAwLCAweDEwLCAweDI4LCAweDA0LCAweDA0LCAweDBELCAweDAxLCAweDAwLCAweDAwLCAweDEwLCAweDJDLAorCSAweDA0LCAweDA0LCAweDBFLCAweDAxLCAweDAwLCAweDAwLCAweDEwLCAweDMwLCAweDA0LCAweDA0LCAweDBGLCAweDAxLCAweDAwLCAweDAwLCAweDE0LCAweDM0LAorCSAweDA4LCAweDg0LCAweDEwLCAweDAxLCAweDAwLCAweDAwLCAweDE0LCAweDM4LCAweDA4LCAweDg0LCAweDExLCAweDAxLCAweDAwLCAweDAwLCAweDE0LCAweDNDLAorCSAweDA4LCAweDg0LCAweDEyLCAweDAxLCAweDAwLCAweDAwLCAweDE0LCAweDQwLCAweDA4LCAweDg0LCAweDEzLCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDY0LAorCSAweDBDLCAweDhCLCAweDE0LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDY4LCAweDBDLCAweDhCLCAweDE1LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDZDLAorCSAweDBDLCAweDhCLCAweDE2LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDcwLCAweDBDLCAweDhCLCAweDE3LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDc0LAorCSAweDBDLCAweDhCLCAweDE4LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDc4LCAweDBDLCAweDhCLCAweDE5LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDdDLAorCSAweDBDLCAweDhCLCAweDFBLCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDgwLCAweDBDLCAweDhCLCAweDFCLCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDg0LAorCSAweDBDLCAweDhCLCAweDFDLCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDg4LCAweDBDLCAweDhCLCAweDFELCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDhDLAorCSAweDBDLCAweDhCLCAweDFFLCAweDAxLCAweDAwLCAweDAwLCAweDBFLCAweDk1LCAweDE3LCAweDA0LCAweDFGLCAweDAxLCAweDAwLCAweDAwLCAweDBFLCAweDk5LAorCSAweDE3LCAweDA0LCAweDIwLCAweDAxLCAweDAwLCAweDAwLCAweDBFLCAweDlELCAweDE3LCAweDA0LCAweDIxLCAweDAxLCAweDAwLCAweDAwLCAweDBFLCAweEExLAorCSAweDE3LCAweDA0LCAweDIyLCAweDAxLCAweDAwLCAweDAwLCAweDBFLCAweEE1LCAweDAwLCAweDAwLCAweDYwLCAweDExLCAweDgwLCAweDExLCAweEEwLCAweDExLAorCSAweEMwLCAweDExLCAweDE4LCAweDEyLCAweDY4LCAweDExLCAweDg4LCAweDExLCAweEE4LCAweDExLCAweEM4LCAweDExLCAweDIwLCAweDEyLCAweDcwLCAweDExLAorCSAweDkwLCAweDExLCAweEIwLCAweDExLCAweEQwLCAweDExLCAweDI4LCAweDEyLCAweDc4LCAweDExLCAweDk4LCAweDExLCAweEI4LCAweDExLCAweEQ4LCAweDExLAorCSAweDMwLCAweDEyLCAweEUwLCAweDExLCAweEU4LCAweDExLCAweEYwLCAweDExLCAweEY4LCAweDExLCAweDAwLCAweDEyLCAweDA4LCAweDEyLCAweDEwLCAweDEyLAorCSAweDM4LCAweDEyLCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDBBLCAweDBBLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDFFLCAweDFFLCAweDFFLCAweDFFLAorCSAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDBBLCAweDBBLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDEwLCAweDEwLAorCSAweDEwLCAweDEwLCAweDE3LCAweDE3LCAweDE3LCAweDE3LCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LAorCSAweDE0LCAweDE0LCAweDE0LCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDExLCAweDExLCAweDExLCAweDExLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDBFLCAweDBFLCAweDBFLCAweDBFLCAweDBFLAorCSAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE2LCAweDE2LAorCSAweDE2LCAweDE2LCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLAorCSAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDBBLAorCSAweDBBLCAweDBBLCAweDBBLCAweDdGLCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LAorCSAweDE0LCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDdGLCAweDE0LCAweDE0LAorCSAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDBBLCAweDBBLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LAorCSAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDlELCAweDlELCAweEExLCAweEI0LAorCSAweDEwLCAweDEwLCAweDAwLCAweDlELCAweDA4LCAweDAyLCAweDA2LCAweDAwLCAweEE1LCAweEE1LCAweEFBLCAweEI0LCAweDEwLCAweDEwLCAweDAwLCAweEEyLAorCSAweDE1LCAweDA1LCAweDA3LCAweDAwLCAweEFBLCAweEFBLCAweEI0LCAweEI0LCAweDEwLCAweDEwLCAweDAwLCAweEE3LCAweDFDLCAweDBBLCAweDA4LCAweDAwLAorCSAweEI3LCAweEI3LCAweEMxLCAweEMxLCAweDEwLCAweDEwLCAweDAwLCAweEI0LCAweDI5LCAweDE3LCAweDA4LCAweDAwLCAweEJELCAweEJELCAweEM3LCAweEM3LAorCSAweDEwLCAweDEwLCAweDAwLCAweEJBLCAweDJGLCAweDFELCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM0LCAweDFGLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDQyLCAweDJBLCAweDVCLCAweDJBLCAweDdFLCAweDJBLCAweDcxLCAweDMwLCAweEVFLCAweDI5LCAweDg4LCAweDMwLCAweEI4LCAweDJBLAorCSAweDlGLCAweDMwLCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweDIxLCAweDM1LCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LAorCSAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweDkzLCAweDJDLCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LAorCSAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LAorCSAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweERFLCAweDJDLCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LAorCSAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LAorCSAweEVFLCAweDI5LCAweDYxLCAweDJDLCAweDdDLCAweDJDLCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LCAweEVFLCAweDI5LAorCSAweEVFLCAweDI5LCAweEUxLCAweDI3LCAweEQ3LCAweDJBLCAweEVBLCAweDJBLCAweDlBLCAweDJCLCAweDlFLCAweDJCLCAweEVFLCAweDI5LCAweEVFLCAweDI5LAorCSAweDRELCAweDJDLCAweEExLCAweEYyLCAweDYyLCAweEYyLCAweDAwLCAweDAwLCAweDk5LCAweEYyLCAweEVFLCAweEYyLCAweDEyLCAweEYzLCAweDQ4LCAweEYzLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDJBLCAweDk0LCAweDJBLCAweDAwLCAweDAwLCAweDY3LCAweDMwLCAweDdFLCAweDMwLCAweDk1LCAweDMwLAorCSAweEFGLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEZDLCAweDQ1LCAweDJELCAweEY3LCAweDJGLCAweDVBLCAweDAwLCAweDAyLCAweDAwLAorCSAweEY5LCAweEZGLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweEZDLCAweDAwLCAweDAyLCAweDAwLCAweEY3LCAweEZGLCAweDQ1LCAweDJELCAweDVCLCAweDJELAorCSAweEFBLCAweDJELCAweDA2LCAweDAwLCAweEYwLCAweEZGLCAweDQ1LCAweDJELCAweDIyLCAweDJELCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweEY2LCAweEZGLAorCSAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDZDLCAweDAwLCAweDAyLCAweDAwLCAweEY0LCAweEZGLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweEE2LCAweDAxLAorCSAweDAyLCAweDAwLCAweEY1LCAweEZGLCAweDQ1LCAweDJELCAweDAwLCAweDMwLCAweDlDLCAweDJELCAweDAyLCAweDAwLCAweEVELCAweEZGLCAweDQ1LCAweDJELAorCSAweDEyLCAweDMwLCAweDk4LCAweDMyLCAweDAyLCAweDAwLCAweEVDLCAweEZGLCAweDQ1LCAweDJELCAweDQwLCAweDMwLCAweDlBLCAweDMyLCAweDAyLCAweDAwLAorCSAweEVCLCAweEZGLCAweDQ1LCAweDJELCAweDQ2LCAweDMwLCAweDlDLCAweDMyLCAweDAyLCAweDAwLCAweEVFLCAweEZGLCAweDQ1LCAweDJELCAweDRDLCAweDMwLAorCSAweDEyLCAweDMzLCAweDAyLCAweDAwLCAweERBLCAweEZGLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweEYyLCAweDEzLCAweDBDLCAweDAwLCAweEVBLCAweEZGLAorCSAweDQ1LCAweDJELCAweDIyLCAweDJELCAweDRDLCAweDMzLCAweDA2LCAweDAwLCAweEU5LCAweEZGLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDUyLCAweDMzLAorCSAweDAyLCAweDAwLCAweEU4LCAweEZGLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDU0LCAweDMzLCAweDAyLCAweDAwLCAweEU3LCAweEZGLCAweDQ1LCAweDJELAorCSAweDVCLCAweDJELCAweDU2LCAweDMzLCAweDAyLCAweDAwLCAweEU2LCAweEZGLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDU4LCAweDMzLCAweDAyLCAweDAwLAorCSAweEU1LCAweEZGLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDVBLCAweDMzLCAweDEwLCAweDAwLCAweEU0LCAweEZGLCAweDQ1LCAweDJELCAweDVCLCAweDJELAorCSAweDZBLCAweDMzLCAweDE4LCAweDAwLCAweERCLCAweEZGLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDgyLCAweDMzLCAweDAyLCAweDAwLCAweERDLCAweEZGLAorCSAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDg0LCAweDMzLCAweDAyLCAweDAwLCAweEUxLCAweEZGLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDVBLCAweDM0LAorCSAweDAyLCAweDAwLCAweEUwLCAweEZGLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDU4LCAweDM0LCAweDAyLCAweDAwLCAweEUzLCAweEZGLCAweDQ1LCAweDJELAorCSAweDVCLCAweDJELCAweDNDLCAweDM0LCAweDAyLCAweDAwLCAweEUyLCAweEZGLCAweDkzLCAweDJELCAweDIyLCAweDJELCAweEYyLCAweDMzLCAweDI0LCAweDAwLAorCSAweDAzLCAweEZDLCAweDQ1LCAweDJELCAweDAxLCAweDJGLCAweDhDLCAweDMyLCAweDAyLCAweDAwLCAweDA0LCAweEZDLCAweDQ1LCAweDJELCAweDU1LCAweDJELAorCSAweEI0LCAweDJELCAweDIyLCAweDAwLCAweDA2LCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDlBLCAweDJELCAweDAyLCAweDAwLCAweDA3LCAweEZDLAorCSAweDQ1LCAweDJELCAweDVCLCAweDJELCAweEY4LCAweDJELCAweDAyLCAweDAwLCAweDBFLCAweEZDLCAweDQ1LCAweDJELCAweDJBLCAweDJGLCAweDAyLCAweDJFLAorCSAweDIyLCAweDAwLCAweEIxLCAweEZDLCAweDQ1LCAweDJELCAweDM5LCAweDMxLCAweDAwLCAweDJGLCAweDAyLCAweDAwLCAweDIwLCAweEZDLCAweDQ1LCAweDJELAorCSAweDVCLCAweDJELCAweDI4LCAweDJFLCAweDAyLCAweDAwLCAweDI1LCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDM0LCAweDJFLCAweDAyLCAweDAwLAorCSAweDI2LCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDM2LCAweDJFLCAweDAyLCAweDAwLCAweDI3LCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELAorCSAweDM4LCAweDJFLCAweDAyLCAweDAwLCAweEIyLCAweEZDLCAweDQ1LCAweDJELCAweDU1LCAweDJELCAweDI0LCAweDJGLCAweDIyLCAweDAwLCAweEMxLCAweEZDLAorCSAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDlFLCAweDMzLCAweDIwLCAweDAwLCAweEIwLCAweEZDLCAweDE4LCAweDJELCAweDNELCAweDMxLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweEM0LCAweEZDLCAweDE4LCAweDJELCAweDU3LCAweDMwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweEM4LCAweEZDLCAweDE4LCAweDJELAorCSAweDU1LCAweDMwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweEI0LCAweEZDLCAweDE4LCAweDJELCAweDcxLCAweDMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweEI2LCAweEZDLCAweDE4LCAweDJELCAweDE5LCAweDMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI3LCAweEZDLCAweDE4LCAweDJELCAweDQzLCAweDMyLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI4LCAweEZDLCAweDE4LCAweDJELCAweDk5LCAweDMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJDLCAweEZDLAorCSAweDE4LCAweDJELCAweEQyLCAweDMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJELCAweEZDLCAweDE4LCAweDJELCAweDU4LCAweDMzLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweEJFLCAweEZDLCAweDE4LCAweDJELCAweDgyLCAweDMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJGLCAweEZDLCAweDE4LCAweDJELAorCSAweENGLCAweDMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIzLCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweEEwLCAweDBGLCAweDEwLCAweDAwLAorCSAweEI1LCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDM4LCAweDM0LCAweDAyLCAweDAwLCAweEI5LCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELAorCSAweDNBLCAweDM0LCAweDAyLCAweDAwLCAweDkwLCAweEZELCAweDQ1LCAweDJELCAweDIyLCAweDJELCAweDNFLCAweDM0LCAweDAyLCAweDAwLCAweDg4LCAweEZDLAorCSAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDcyLCAweDMyLCAweDA0LCAweDAwLCAweDg5LCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDc2LCAweDMyLAorCSAweDA0LCAweDAwLCAweEM1LCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDdBLCAweDMyLCAweDA0LCAweDAwLCAweDIzLCAweEZDLCAweDQ1LCAweDJELAorCSAweDVCLCAweDJELCAweDJFLCAweDJFLCAweDA0LCAweDAwLCAweDJBLCAweEZDLCAweDQ1LCAweDJELCAweEU5LCAweDJELCAweEIwLCAweDJELCAweDAyLCAweDAwLAorCSAweEM3LCAweEZELCAweDQ1LCAweDJELCAweDIyLCAweDJELCAweEEwLCAweDMyLCAweDBBLCAweDAwLCAweDI5LCAweEZDLCAweDNDLCAweDJFLCAweDAwLCAweDJFLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMyLCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDgwLCAweDMyLCAweDA4LCAweDAwLCAweDMyLCAweEZDLAorCSAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDk4LCAweDAxLCAweDAyLCAweDAwLCAweDMzLCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDlBLCAweDAxLAorCSAweDAyLCAweDAwLCAweDM1LCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDg4LCAweDMyLCAweDAyLCAweDAwLCAweEM3LCAweEZDLCAweDQ1LCAweDJELAorCSAweEQzLCAweDJGLCAweDhBLCAweDMyLCAweDAyLCAweDAwLCAweDAwLCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweEIyLCAweDJELCAweDAyLCAweDAwLAorCSAweDAxLCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweEFBLCAweDJELCAweDA2LCAweDAwLCAweDAyLCAweEZDLCAweDQ1LCAweDJELCAweEQ1LCAweDJELAorCSAweDAyLCAweDJGLCAweDIyLCAweDAwLCAweDA1LCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweEEwLCAweDJELCAweDAyLCAweDAwLCAweDA4LCAweEZDLAorCSAweDQ1LCAweDJELCAweDVCLCAweDJELCAweEE0LCAweDJELCAweDA2LCAweDAwLCAweDA5LCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweEZBLCAweDJELAorCSAweDAyLCAweDAwLCAweDBCLCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweEZDLCAweDJELCAweDAyLCAweDAwLCAweDBDLCAweEZDLCAweDQ1LCAweDJELAorCSAweDVCLCAweDJELCAweEZFLCAweDJELCAweDAyLCAweDAwLCAweDBELCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDAwLCAweDJFLCAweDAyLCAweDAwLAorCSAweDIxLCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweDJBLCAweDJFLCAweDAyLCAweDAwLCAweDgwLCAweEZDLCAweEIxLCAweDJELCAweEMxLCAweDJELAorCSAweDQwLCAweDJFLCAweEMwLCAweDAwLCAweDgxLCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweEE0LCAweDAxLCAweDAyLCAweDAwLCAweDgzLCAweEZDLAorCSAweDQ1LCAweDJELCAweDVCLCAweDJELCAweEE4LCAweDAxLCAweDAyLCAweDAwLCAweDg1LCAweEZDLCAweDQ1LCAweDJELCAweDRBLCAweDJGLCAweEEwLCAweDAxLAorCSAweDAyLCAweDAwLCAweDg2LCAweEZDLCAweDQ1LCAweDJELCAweDZFLCAweDJGLCAweEIwLCAweDAxLCAweDAyLCAweDAwLCAweDI4LCAweEZDLCAweDQ1LCAweDJELAorCSAweDVCLCAweDJELCAweDNBLCAweDJFLCAweDAyLCAweDAwLCAweDkwLCAweEZDLCAweDQ1LCAweDJELCAweDVDLCAweDJGLCAweEEyLCAweDAxLCAweDAyLCAweDAwLAorCSAweDg3LCAweEZDLCAweDQ1LCAweDJELCAweDhDLCAweDJGLCAweDUwLCAweDJGLCAweDIyLCAweDAzLCAweDMwLCAweEZDLCAweDQ1LCAweDJELCAweDVCLCAweDJELAorCSAweDNDLCAweDJFLCAweDAyLCAweDAwLCAweDg0LCAweEZDLCAweDQ1LCAweDJELCAweDkyLCAweDJGLCAweEFDLCAweDAxLCAweDA0LCAweDAwLCAweDJCLCAweEZDLAorCSAweDQ1LCAweDJELCAweDVCLCAweDJELCAweEUyLCAweDM3LCAweDAyLCAweDAwLCAweEY4LCAweEZGLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweERDLCAweDM3LAorCSAweDAyLCAweDAwLCAweEYzLCAweEZGLCAweDQ1LCAweDJELCAweDVCLCAweDJELCAweEU0LCAweDM3LCAweDAyLCAweDAwLCAweDIwLCAweEZELCAweDc2LCAweDJELAorCSAweDIyLCAweDJELCAweDVFLCAweDQwLCAweDA4LCAweDAwLCAweDIxLCAweEZELCAweDc2LCAweDJELCAweDIyLCAweDJELCAweDYyLCAweDQwLCAweDBBLCAweDAwLAorCSAweDIyLCAweEZELCAweDc2LCAweDJELCAweDIyLCAweDJELCAweDY3LCAweDQwLCAweDE2LCAweDAwLCAweDIzLCAweEZELCAweDc2LCAweDJELCAweDIyLCAweDJELAorCSAweDcyLCAweDQwLCAweDBBLCAweDAwLCAweDQ1LCAweEZELCAweDQ1LCAweDJELCAweDIyLCAweDJELCAweEZDLCAweDAwLCAweDAyLCAweDAwLCAweDQ3LCAweEZELAorCSAweDQ1LCAweDJELCAweDIyLCAweDJELCAweDcyLCAweDAxLCAweDAyLCAweDAwLCAweDQ4LCAweEZELCAweDkxLCAweDJFLCAweDIyLCAweDJELCAweDk4LCAweDAxLAorCSAweDAyLCAweDAwLCAweDQ5LCAweEZELCAweDkxLCAweDJFLCAweDIyLCAweDJELCAweDlBLCAweDAxLCAweDAyLCAweDAwLCAweDRBLCAweEZELCAweDQ1LCAweDJELAorCSAweDIyLCAweDJELCAweDkyLCAweDAxLCAweDAyLCAweDAwLCAweDRCLCAweEZELCAweDQ1LCAweDJELCAweDIyLCAweDJELCAweDk0LCAweDAxLCAweDAyLCAweDAwLAorCSAweDRELCAweEZELCAweDc2LCAweDJELCAweDIyLCAweDJELCAweDc3LCAweDQwLCAweDBDLCAweDAwLCAweDRGLCAweEZELCAweEE1LCAweDJFLCAweDIyLCAweDJELAorCSAweDkwLCAweDMyLCAweDAyLCAweDAwLCAweEMyLCAweEZELCAweDlCLCAweDJFLCAweDIyLCAweDJELCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDQwLCAweEZELAorCSAweDZFLCAweDJELCAweDIyLCAweDJELCAweEI2LCAweDAxLCAweDAyLCAweDAwLCAweDI0LCAweEZELCAweEI1LCAweDJFLCAweDIyLCAweDJELCAweDAwLCAweDAwLAorCSAweDAyLCAweDAwLCAweDkxLCAweEZELCAweDQ1LCAweDJELCAweDIyLCAweDJELCAweEM2LCAweDI1LCAweDAyLCAweDAwLCAweDkzLCAweEZELCAweDQ1LCAweDJELAorCSAweDIyLCAweDJELCAweENDLCAweDI1LCAweDAyLCAweDAwLCAweDhGLCAweEZELCAweEQ1LCAweDJFLCAweDIyLCAweDJELCAweDAwLCAweDAwLCAweDA4LCAweDAwLAorCSAweEMxLCAweEZELCAweDAwLCAweDMxLCAweDIyLCAweDJELCAweEZBLCAweDAwLCAweDAyLCAweDAwLCAweEM2LCAweEZELCAweDQ1LCAweDJELCAweDIyLCAweDJELAorCSAweEY4LCAweDM3LCAweDA0LCAweDAwLCAweDI1LCAweEZELCAweDQ1LCAweDJELCAweDIyLCAweDJELCAweDlFLCAweDAxLCAweDAyLCAweDAwLCAweDg5LCAweEZELAorCSAweEI5LCAweDMwLCAweDIyLCAweDJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweEZELCAweDkzLCAweDJELCAweDIyLCAweDJELCAweDEyLCAweDM0LAorCSAweDI0LCAweDAwLCAweDQxLCAweEZELCAweDQ1LCAweDJELCAweDIyLCAweDJELCAweEJFLCAweDMzLCAweDIyLCAweDAwLCAweDQyLCAweEZELCAweDQ1LCAweDJELAorCSAweDIyLCAweDJELCAweEZFLCAweDAwLCAweDA2LCAweDAwLCAweDQzLCAweEZELCAweEMyLCAweDJFLCAweDIyLCAweDJELCAweDAwLCAweDAwLCAweDA2LCAweDAwLAorCSAweDQ0LCAweEZELCAweEFDLCAweDJFLCAweDIyLCAweDJELCAweEIyLCAweDAxLCAweDAyLCAweDAwLCAweDQ2LCAweEZELCAweDIxLCAweDMxLCAweDIyLCAweDJELAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDRDLCAweEZELCAweDQ1LCAweDJELCAweDIyLCAweDJELCAweDQ2LCAweDJGLCAweDAyLCAweDAwLCAweDUwLCAweEZELAorCSAweDQ1LCAweDJELCAweDIyLCAweDJELCAweEYyLCAweDAwLCAweDAyLCAweDAwLCAweDUxLCAweEZELCAweDQ1LCAweDJELCAweDIyLCAweDJELCAweEY0LCAweDAwLAorCSAweDAyLCAweDAwLCAweDUyLCAweEZELCAweDQ1LCAweDJELCAweDIyLCAweDJELCAweEM0LCAweDAxLCAweDAyLCAweDAwLCAweDhDLCAweEZELCAweDM4LCAweDJELAorCSAweDIyLCAweDJELCAweDk4LCAweDM0LCAweDU2LCAweDAwLCAweDhELCAweEZELCAweDM4LCAweDJELCAweDIyLCAweDJELCAweEYyLCAweDM0LCAweDE0LCAweDAwLAorCSAweDAwLCAweEYxLCAweDQ2LCAweDAwLCAweERDLCAweDJDLCAweDM2LCAweDAxLCAweDAxLCAweEYxLCAweDg0LCAweDA3LCAweERBLCAweDJDLCAweDM4LCAweDAxLAorCSAweDAwLCAweDAzLCAweEEwLCAweDgwLCAweDFFLCAweDAwLCAweDcwLCAweDAxLCAweEZBLCAweDAwLCAweEQ0LCAweDAxLCAweEZFLCAweDAwLCAweDNBLCAweDAxLAorCSAweEI2LCAweDAxLCAweENDLCAweDJDLCAweDU0LCAweDAxLCAweEM2LCAweDI1LCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweEMwLCAweDFELCAweDAwLCAweDAwLAorCSAweEM0LCAweDFGLCAweDRFLCAweDAxLCAweDBCLCAweDAwLCAweEI4LCAweDAwLCAweEVDLCAweDAwLCAweDQ0LCAweDAwLCAweDQ2LCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDFDLCAweDA5LCAweDA4LCAweDI0LCAweDI4LCAweDA2LCAweDBDLCAweDE4LCAweDA4LCAweDMwLCAweDE0LCAweDBDLAorCSAweDA4LCAweDM2LCAweDEwLCAweDEyLCAweDI0LCAweEI3LCAweDk3LCAweEI2LCAweEEzLCAweEI3LCAweEFDLCAweEI3LCAweEE4LCAweEI2LCAweDNFLCAweEI3LAorCSAweDE2LCAweEI3LCAweDc5LCAweDNFLCAweDU3LCAweDNELCAweDc5LCAweDNFLCAweEY5LCAweDNELCAweDVGLCAweDNELCAweDUyLCAweDNELCAweDMzLCAweDNFLAorCSAweDU1LCAweDNFLCAweDZBLCAweDNFLCAweEFDLCAweDNFLCAweEQ4LCAweDNFLCAweEY4LCAweDNELCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LAorCSAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LAorCSAweDIzLCAweDQ2LCAweDIzLCAweDQ2LCAweDIzLCAweDQ2LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LAorCSAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LAorCSAweDFELCAweDQ3LCAweDlBLCAweDQ4LCAweERBLCAweDQ4LCAweDFBLCAweDQ4LCAweDVBLCAweDQ4LCAweDlBLCAweDQ4LCAweERBLCAweDQ4LCAweDFBLCAweDQ4LAorCSAweDVBLCAweDQ4LCAweDlBLCAweDQ4LCAweERBLCAweDQ4LCAweDFBLCAweDQ4LCAweDVBLCAweDQ4LCAweDlBLCAweDQ4LCAweDMzLCAweDQ4LCAweDc4LCAweDQ5LAorCSAweDc4LCAweDQ5LCAweDc5LCAweDQ5LCAweDc5LCAweDQ5LCAweDc5LCAweDQ5LCAweDc5LCAweDQ5LCAweDdBLCAweDQ5LCAweDdBLCAweDQ5LCAweDdBLCAweDQ5LAorCSAweDdBLCAweDQ5LCAweDdCLCAweDQ5LCAweDdCLCAweDQ5LCAweDdCLCAweDQ5LCAweDdDLCAweDQ5LCAweEQ4LCAweDAzLCAweERDLCAweDAzLCAweEUwLCAweDAzLAorCSAweEU0LCAweDAzLCAweEYwLCAweDAzLCAweEY0LCAweDAzLCAweEY4LCAweDAzLCAweDBBLCAweDA0LCAweDBFLCAweDA0LCAweDEyLCAweDA0LCAweDE2LCAweDA0LAorCSAweDBDLCAweDA0LCAweDEwLCAweDA0LCAweDE0LCAweDA0LCAweDE4LCAweDA0LCAweDFDLCAweDA0LCAweDIwLCAweDA0LCAweDI0LCAweDA0LCAweDI4LCAweDA0LAorCSAweDRDLCAweDA0LCAweDUwLCAweDA0LCAweDU0LCAweDA0LCAweDU4LCAweDA0LCAweDVDLCAweDA0LCAweDYwLCAweDA0LCAweDY0LCAweDA0LCAweDY4LCAweDA0LAorCSAweDZDLCAweDA0LCAweDcwLCAweDA0LCAweDc0LCAweDA0LCAweDdELCAweDA0LCAweDgxLCAweDA0LCAweDg1LCAweDA0LCAweDg5LCAweDA0LCAweDhELCAweDA0LAorCSAweDEwLCAweDAwLCAweDhFLCAweDE5LCAweEFDLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDNDLCAweDBDLCAweDAwLCAweDAwLAorCSAweEZGLCAweDNGLCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweEQzLCAweDIyLCAweDQ0LCAweDA0LCAweDlDLCAweDAyLCAweENCLCAweDU0LCAweDQ0LCAweDA0LAorCSAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDBDLCAweDcxLCAweDAwLCAweDMwLCAweDUwLAorCSAweDIwLCAweDAwLCAweDgwLCAweEJGLCAweDFGLCAweEE2LCAweDI4LCAweDAwLCAweDBCLCAweDAyLCAweDYwLCAweDg0LCAweDRDLCAweDAwLCAweDAyLCAweDAwLAorCSAweDRCLCAweDFDLCAweDk4LCAweDAwLCAweDAwLCAweDAwLCAweDIwLCAweDBCLCAweDM0LCAweDA0LCAweEZELCAweDM0LCAweDM0LCAweDAwLCAweDM4LCAweDA0LAorCSAweEZELCAweDM0LCAweDM0LCAweDAwLCAweDNDLCAweDA0LCAweDAxLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDUyLCAweDE0LCAweDAwLAorCSAweDA0LCAweDA4LCAweDBFLCAweDMyLCAweDAwLCAweEE2LCAweDEwLCAweDA4LCAweEM0LCAweDAzLCAweDUwLCAweDYwLCAweDE4LCAweDA4LCAweEYwLCAweDNGLAorCSAweEZDLCAweDAxLCAweDEwLCAweDBDLCAweDAwLCAweDAwLCAweDgwLCAweDA0LCAweDE0LCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDQxLCAweDIwLCAweDBDLAorCSAweEIwLCAweDAwLCAweEIwLCAweEI4LCAweDI0LCAweDBDLCAweDAwLCAweDAwLCAweEFCLCAweDA1LCAweDJDLCAweDBDLCAweDgwLCAweDA1LCAweDAwLCAweEZGLAorCSAweDMwLCAweDBDLCAweDAwLCAweDAwLCAweEIwLCAweDA0LCAweDM0LCAweDBDLCAweDAzLCAweDAwLCAweDAwLCAweEU4LCAweDQ0LCAweDBDLCAweDA0LCAweDAwLAorCSAweEZGLCAweDBGLCAweDAwLCAweDEwLCAweDJFLCAweDAwLCAweDBDLCAweEUzLCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDAxLCAweDA0LCAweDQ0LCAweDA0LAorCSAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDAxLCAweDA0LAorCSAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDgwLCAweDAzLCAweDQ4LCAweDBDLCAweDAwLCAweDAwLCAweDdGLCAweDAwLCAweDA0LCAweDA0LCAweDA4LCAweDQ4LAorCSAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDA4LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDcxLCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLAorCSAweDVFLCAweDQwLCAweDAxLCAweDAwLCAweDE4LCAweDAwLCAweDM2LCAweEMwLCAweEU4LCAweDBFLCAweDFDLCAweDAwLCAweDc4LCAweEM4LCAweEE1LCAweDQwLAorCSAweDI0LCAweDAwLCAweDlFLCAweEIwLCAweEI5LCAweDk1LCAweDA4LCAweDA4LCAweDAwLCAweEVBLCAweDQwLCAweDAxLCAweDBDLCAweDA4LCAweDAwLCAweEVBLAorCSAweDAwLCAweDAwLCAweDFDLCAweDA4LCAweDAwLCAweDAwLCAweDQyLCAweDA3LCAweDIwLCAweDA4LCAweDdCLCAweDAwLCAweEQ0LCAweDA5LCAweDJDLCAweDA0LAorCSAweDE0LCAweDAwLCAweDUwLCAweDE0LCAweDMwLCAweDA0LCAweDI4LCAweDBGLCAweDI4LCAweDdGLCAweDE4LCAweDA4LCAweDIwLCAweDAwLCAweEZDLCAweDAxLAorCSAweDA0LCAweDEwLCAweDY5LCAweDAwLCAweEZELCAweEMzLCAweDA4LCAweDEwLCAweDY5LCAweDAwLCAweEZELCAweEMzLCAweDA4LCAweDBDLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDQ4LCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDBDLCAweDAwLCAweDAwLCAweDdGLCAweDAwLCAweDA0LCAweDA0LAorCSAweDA4LCAweDQ4LCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDVFLCAweDQ4LCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDA4LCAweDQwLCAweDAyLCAweDAwLAorCSAweDAwLCAweDBDLCAweDcxLCAweDAwLCAweDMwLCAweDUwLCAweDAwLCAweDAwLCAweDVFLCAweDQ4LCAweDAxLCAweDAwLCAweDE4LCAweDAwLCAweDNBLCAweEMwLAorCSAweEU4LCAweDA0LCAweDFDLCAweDAwLCAweDc4LCAweEQwLCAweEE1LCAweDQwLCAweDI0LCAweDAwLCAweDlFLCAweEIwLCAweEI5LCAweDg1LCAweDJDLCAweDA0LAorCSAweDE0LCAweDAwLCAweDUwLCAweDE0LCAweDMwLCAweDA0LCAweDI4LCAweDBGLCAweDI4LCAweDdGLCAweDA4LCAweDA4LCAweDAwLCAweEVBLCAweDQwLCAweDAxLAorCSAweDBDLCAweDA4LCAweDAwLCAweEVBLCAweDAwLCAweDAwLCAweDFDLCAweDA4LCAweDAwLCAweDAwLCAweDQyLCAweDA3LCAweDIwLCAweDA4LCAweDdCLCAweDAwLAorCSAweEQ0LCAweDA5LCAweDE4LCAweDA4LCAweEYwLCAweDNGLCAweEZDLCAweDAxLCAweDA0LCAweDEwLCAweDY5LCAweDAwLCAweERELCAweENELCAweDA4LCAweDEwLAorCSAweDY5LCAweDAwLCAweERELCAweENELCAweDA4LCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDA4LCAweDA0LCAweDQwLCAweDAxLCAweDQxLCAweDAxLCAweDBDLCAweDA0LCAweDQwLCAweDA0LCAweDQxLCAweDA0LCAweDEwLCAweDA0LCAweEQ2LCAweDA4LAorCSAweDU2LCAweDBBLCAweDE0LCAweDA0LCAweDQyLCAweDAyLCAweDU2LCAweDBBLCAweDE4LCAweDA0LCAweDU2LCAweDBBLCAweDQwLCAweDAyLCAweDFDLCAweDA0LAorCSAweDQyLCAweDBBLCAweDQyLCAweDJBLCAweDIwLCAweDA0LCAweEMyLCAweDAwLCAweEQ2LCAweDA4LCAweDI0LCAweDA0LCAweEQ2LCAweDA4LCAweEMwLCAweDAwLAorCSAweDI4LCAweDA0LCAweEMyLCAweDA4LCAweEMyLCAweDI4LCAweDA4LCAweDA0LCAweDQwLCAweDAxLCAweDQxLCAweDAxLCAweDBDLCAweDA0LCAweDAwLCAweDAxLAorCSAweDAxLCAweDAxLCAweDEwLCAweDA0LCAweDU2LCAweDBBLCAweDU2LCAweDBBLCAweDE0LCAweDA0LCAweDQyLCAweDAyLCAweDU2LCAweDBBLCAweDE4LCAweDA0LAorCSAweDU2LCAweDBBLCAweDQwLCAweDAyLCAweDFDLCAweDA0LCAweDQyLCAweDBBLCAweDQyLCAweDJBLCAweDIwLCAweDA0LCAweDQyLCAweDAyLCAweDU2LCAweDBBLAorCSAweDI0LCAweDA0LCAweDU2LCAweDBBLCAweDQwLCAweDAyLCAweDI4LCAweDA0LCAweDQyLCAweDBBLCAweDQyLCAweDJBLCAweDA4LCAweDA0LCAweDQwLCAweDAxLAorCSAweDQxLCAweDAxLCAweDBDLCAweDA0LCAweDQwLCAweDA0LCAweDQxLCAweDA0LCAweDEwLCAweDA0LCAweENFLCAweDA4LCAweDRFLCAweDBBLCAweDE0LCAweDA0LAorCSAweDQyLCAweDAyLCAweDRFLCAweDBBLCAweDE4LCAweDA0LCAweDRFLCAweDBBLCAweDQwLCAweDAyLCAweDFDLCAweDA0LCAweDQyLCAweDBBLCAweDQyLCAweDJBLAorCSAweDIwLCAweDA0LCAweEMyLCAweDAwLCAweENFLCAweDA4LCAweDI0LCAweDA0LCAweENFLCAweDA4LCAweEMwLCAweDAwLCAweDI4LCAweDA0LCAweEMyLCAweDA4LAorCSAweEMyLCAweDI4LCAweDA4LCAweDA0LCAweDQwLCAweDAxLCAweDQxLCAweDAxLCAweDBDLCAweDA0LCAweDAwLCAweDAxLCAweDAxLCAweDAxLCAweDEwLCAweDA0LAorCSAweDRFLCAweDBBLCAweDRFLCAweDBBLCAweDE0LCAweDA0LCAweDQyLCAweDAyLCAweDRFLCAweDBBLCAweDE4LCAweDA0LCAweDRFLCAweDBBLCAweDQwLCAweDAyLAorCSAweDFDLCAweDA0LCAweDQyLCAweDBBLCAweDQyLCAweDJBLCAweDIwLCAweDA0LCAweDQyLCAweDAyLCAweDRFLCAweDBBLCAweDI0LCAweDA0LCAweDRFLCAweDBBLAorCSAweDQwLCAweDAyLCAweDI4LCAweDA0LCAweDQyLCAweDBBLCAweDQyLCAweDJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLAorCSAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAzLCAweDAwLCAweDA1LCAweDAwLCAweEEwLCAweDE2LCAweEEwLCAweDE2LAorCSAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LAorCSAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LAorCSAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LAorCSAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE3LCAweEEwLCAweDE3LCAweEEwLCAweDE3LCAweEEwLCAweDE4LCAweEZGLCAweDA2LCAweEZGLCAweDA2LAorCSAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LAorCSAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LAorCSAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LAorCSAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweDAwLCAweDAwLCAweDY1LCAweDAwLAorCSAweDY1LCAweDAwLCAweDY1LCAweDAwLCAweDY1LCAweDAwLCAweDVELCAweDAwLCAweDUyLCAweDAwLCAweDQ4LCAweDAwLCAweDQwLCAweDAwLCAweDM4LCAweDAwLAorCSAweDMxLCAweDAwLCAweDJDLCAweDAwLCAweDI3LCAweDAwLCAweDIzLCAweDAwLCAweDFGLCAweDAwLCAweDAwLCAweDAwLCAweDY1LCAweDAwLCAweDY1LCAweDAwLAorCSAweDY1LCAweDAwLCAweDY1LCAweDAwLCAweDVELCAweDAwLCAweDUyLCAweDAwLCAweDQ4LCAweDAwLCAweDQwLCAweDAwLCAweDM4LCAweDAwLCAweDMxLCAweDAwLAorCSAweDJDLCAweDAwLCAweDI3LCAweDAwLCAweDIzLCAweDAwLCAweDFGLCAweDAwLCAweDAwLCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLAorCSAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLAorCSAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDAwLAorCSAweDBDLCAweDAwLCAweDBDLCAweDAwLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDE1LCAweDAwLCAweDZFLCAweDZGLCAweDZFLCAweDJELAorCSAweDczLCAweDcwLCAweDY1LCAweDYzLCAweDY5LCAweDY2LCAweDY5LCAweDY1LCAweDY0LCAweDIwLCAweDUzLCAweDUzLCAweDQ5LCAweDQ0LCAweDIwLCAweDIxLAorCSAweDIxLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAxLCAweDAwLCAweDAwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAwLCAweDA5LAorCSAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDY0LCAweDAwLCAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDQ1LCAweDUyLCAweDRELCAweDQ1LCAweDUzLAorCSAweDIwLCAweDMyLCAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDA0LCAweDAwLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLAorCSAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAxLCAweDAwLCAweDE1LCAweDAwLAorCSAweDZFLCAweDZGLCAweDZFLCAweDJELCAweDczLCAweDcwLCAweDY1LCAweDYzLCAweDY5LCAweDY2LCAweDY5LCAweDY1LCAweDY0LCAweDIwLCAweDUzLCAweDUzLAorCSAweDQ5LCAweDQ0LCAweDIwLCAweDIxLCAweDIxLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDAxLCAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDAwLCAweDA5LCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDY0LCAweDAwLCAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDQ1LAorCSAweDUyLCAweDRELCAweDQ1LCAweDUzLCAweDIwLCAweDMyLCAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAxLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDA0LCAweDAwLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ2LCAweDY5LAorCSAweDcyLCAweDczLCAweDc0LCAweDIwLCAweDU3LCAweDYxLCAweDc2LCAweDY1LCAweDRDLCAweDQxLCAweDRFLCAweDIwLCAweDQ5LCAweDQ5LCAweDIwLCAweDUzLAorCSAweDUzLCAweDQ5LCAweDQ0LCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAwLCAweDAwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweDBGLCAweEYwLCAweDBGLAorCSAweDBGLCAweDAwLCAweDUwLCAweDAxLCAweDAyLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE5LCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LAorCSAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LAorCSAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LAorCSAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDAwLAorCSAweDE0LCAweDAwLCAweDE0LCAweDAwLCAweDE0LCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDI0LCAweDAwLCAweEZGLCAweDAwLCAweDA5LCAweDAwLCAweDA5LCAweDAwLCAweDA5LCAweDAwLCAweDA5LCAweDAwLCAweDBBLCAweDAwLCAweDBBLCAweDAwLAorCSAweDBCLCAweDAwLCAweDBCLCAweDAwLCAweDE0LCAweDAwLCAweDE0LCAweDAwLCAweDE0LCAweDAwLCAweDBBLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAxLAorCSAweDAyLCAweDA0LCAweDBCLCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAxLCAweDgyLCAweDg0LCAweDhCLCAweDk2LCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDFDLCAweDg1LCAweDAwLCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAxLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDIwLCAweDAwLCAweDFCLCAweDAwLCAweDE3LCAweDAwLCAweDExLCAweDAwLCAweDEwLCAweDAwLCAweDBCLCAweDAwLAorCSAweDBCLCAweDAwLCAweDA5LCAweDAwLCAweDE3LCAweDAwLCAweDE0LCAweDAwLCAweDEwLCAweDAwLCAweDBELCAweDAwLCAweDBCLCAweDAwLCAweDA5LCAweDAwLAorCSAweDA4LCAweDAwLCAweDA3LCAweDAwLCAweDBELCAweDAwLCAweDBBLCAweDAwLCAweDA5LCAweDAwLCAweDA4LCAweDAwLCAweDA1LCAweDAwLCAweDA1LCAweDAwLAorCSAweEQ4LCAweDBDLCAweEMwLCAweDA4LCAweDkwLCAweDBELCAweDYwLCAweDA5LCAweDQ4LCAweDBFLCAweDMwLCAweDBBLCAweDI0LCAweDBGLCAweDE4LCAweDBCLAorCSAweDBCLCAweDZFLCAweDBCLCAweDM3LCAweDAyLCAweDE0LCAweDAxLCAweDBBLCAweDA0LCAweDAwLCAweDA0LCAweDAwLCAweDA0LCAweDAwLCAweDAzLCAweDAwLAorCSAweDA3LCAweDAwLCAweDA3LCAweDAwLCAweDA3LCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIwLCAweDQzLCAweDc1LCAweDcyLCAweDcyLCAweDY1LAorCSAweDZFLCAweDc0LCAweDIwLCAweDUzLCAweDY1LCAweDcyLCAweDc2LCAweDY5LCAweDYzLCAweDY1LCAweDIwLCAweDUzLCAweDY1LCAweDc0LCAweDIwLCAweDQ5LAorCSAweDY0LCAweDY1LCAweDZFLCAweDc0LCAweDY5LCAweDY2LCAweDY5LCAweDY1LCAweDcyLCAweDIwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDMwLCAweDAxLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweERELCAweDAwLCAweDUwLAorCSAweEYyLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDUwLCAweEYyLCAweDA1LCAweDAyLCAweDAwLCAweDAwLCAweDUwLCAweEYyLCAweDAyLCAweDAwLCAweDUwLAorCSAweEYyLCAweDA0LCAweDAyLCAweDAwLCAweDAwLCAweDUwLCAweEYyLCAweDAwLCAweDAwLCAweDUwLCAweEYyLCAweDAxLCAweDA2LCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDE1LCAweDAwLCAweDE0LCAweDAwLCAweDE1LCAweDAwLCAweDM2LCAweDAwLCAweDEwLCAweDAwLCAweDEwLCAweDAwLCAweDEwLCAweDAwLCAweDE0LCAweDAwLAorCSAweDExLCAweDAwLCAweDM2LCAweDAwLCAweDAxLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAxLCAweDAwLCAweDEwLCAweDAwLCAweEJFLCAweDMzLCAweDFFLCAweDMzLCAweENDLCAweDM1LCAweEQwLCAweDM1LCAweEQ0LCAweDM1LCAweDEyLCAweDM0LAorCSAweDA0LCAweDM2LCAweDA4LCAweDM2LCAweEYyLCAweDMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDI0LCAweDJGLCAweDE0LCAweDMzLCAweDA4LCAweDM2LAorCSAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEJFLCAweDMzLCAweDFFLCAweDMzLCAweENDLCAweDM1LCAweEQwLCAweDM1LCAweEQ0LCAweDM1LCAweDEyLCAweDM0LAorCSAweDA0LCAweDM2LCAweDA4LCAweDM2LCAweEYyLCAweDMzLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDAwLCAweDAwLCAweEJFLCAweDMzLCAweDE0LCAweDMzLCAweDA4LCAweDM2LCAweDVDLCAweDM0LCAweDJBLCAweDMzLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAzLCAweDAzLCAweDAwLCAweDAyLCAweDA2LCAweDAwLCAweDAwLCAweDA2LCAweDA3LAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDJBLAorCSAweDAwLCAweDAwLCAweDA4LCAweDMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDA1LCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweDAwLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweDFELCAweEZBLAorCSAweEY5LCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDE5LCAweDBBLAorCSAweDA5LCAweDQ2LCAweDFDLCAweDYwLCAweDE4LCAweDAwLCAweDE5LCAweDFELCAweDA5LCAweDQyLCAweDFDLCAweDYwLCAweDAwLCAweDAwLAorCit9OyAgLyogZndfaW1hZ2VfMl9kYXRhICovCisKK3N0YXRpYyBjb25zdCBoY2ZfOCBmd19pbWFnZV8zX2RhdGFbXSA9IHsKKwkgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNiwgMHgxQSwgMHgwMCwgMHg4MCwgMHgzQSwgMHgxNSwgMHgwMCwgMHg3RiwgMHhGMSwKKwkgMHgzMiwgMHhGMiwgMHgzMywgMHhGMiwgMHhEMCwgMHg4MCwgMHg4MCwgMHhGMSwgMHgwRiwgMHgwMiwgMHhEMCwgMHg4MCwgMHgzNCwgMHhGMiwgMHg4MSwgMHhGMSwKKwkgMHgwQiwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMiwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RiwgMHgzMCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhFMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHhENywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhGNCwKKwkgMHhBQSwgMHg2MCwgMHhBQSwgMHg2NSwgMHgwOSwgMHhGMiwgMHg1QSwgMHhEMCwgMHhENCwgMHg4MCwgMHgwMywgMHg2NCwgMHgxMiwgMHgwMiwgMHhEMCwgMHg4MCwKKwkgMHgxRCwgMHg2MCwgMHg2MCwgMHg2NSwgMHgwRSwgMHgwMiwgMHg1QSwgMHhEMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHgwOCwgMHgwMiwgMHg1QSwgMHhEMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHgxQywgMHg2MCwgMHhENywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHhFQSwgMHhGMSwgMHg1QSwgMHhEMSwgMHg0NCwgMHg0OCwgMHg1QSwgMHhEMSwgMHg0NCwgMHg0QSwgMHgyNiwgMHg0NiwKKwkgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHg0NCwgMHg0QywgMHhEOCwgMHg4MywgMHg3MCwgMHg2MSwgMHg2OCwgMHg2NSwgMHhENywgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwNywgMHgwRSwgMHgwOCwgMHhGMiwgMHgwOCwgMHgwMCwgMHg2OCwgMHg2NSwgMHhENywgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwRSwgMHgwMywgMHgwMCwKKwkgMHgxQywgMHg2MCwgMHhFRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1OCwgMHg0RiwgMHg3OSwgMHgwMCwgMHg5QywgMHg4MCwgMHgwMSwgMHg2NSwgMHgwMiwgMHgwMiwKKwkgMHgwMCwgMHg2NSwgMHgwMiwgMHgwMCwgMHhGRiwgMHgzQiwgMHhGNywgMHgwMSwgMHg1OCwgMHg0RiwgMHg3MCwgMHgwMCwgMHg5QywgMHg4MCwgMHg0NSwgMHg0MiwKKwkgMHhFQSwgMHgwMiwgMHg1OCwgMHg0RiwgMHg2QiwgMHgwMCwgMHg5QywgMHg4MCwgMHhGRiwgMHhGRiwgMHhFNSwgMHgwMiwgMHg1OCwgMHg0RiwgMHg2NiwgMHgwMCwKKwkgMHg5QywgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHgwMCwgMHg2NSwgMHg0NSwgMHg0MiwgMHhGOCwgMHgwMSwgMHhGRiwgMHgzQSwgMHgyOSwgMHgwMCwKKwkgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHgyOCwgMHg0NCwgMHhGRiwgMHhCNCwgMHg5NCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhENCwgMHgwMiwgMHg2MCwgMHg0NSwKKwkgMHgyOCwgMHg0NywgMHgyQSwgMHg1RiwgMHg0MCwgMHg0OCwgMHgyQSwgMHg0NywgMHgyQywgMHg1RiwgMHg0MCwgMHg0QSwgMHgyQywgMHg0NywgMHg2NSwgMHg1RiwKKwkgMHg0MCwgMHg0QywgMHgxMCwgMHg2NCwgMHg0MCwgMHg0MiwgMHgyOCwgMHg0NSwgMHgwNSwgMHgwMCwgMHg1OCwgMHg0RiwgMHg0NywgMHgwMCwgMHg5NCwgMHg4MCwKKwkgMHgyOCwgMHg0NSwgMHgyNiwgMHgwMiwgMHg1OCwgMHg0RiwgMHg0MiwgMHgwMCwgMHg5NCwgMHg4MCwgMHgyQSwgMHg0NSwgMHgyMSwgMHgwMiwgMHg1OCwgMHg0RiwKKwkgMHgzRCwgMHgwMCwgMHg5NCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxQywgMHgwMiwgMHgyMiwgMHg0NCwgMHg0QywgMHg4MiwgMHgyQywgMHg0NSwgMHgzMSwgMHgwMywKKwkgMHhFQywgMHgwMSwgMHgxMCwgMHg2NSwgMHg0NSwgMHg0MiwgMHgyOCwgMHg0NSwgMHg5NCwgMHg4MCwgMHgyQSwgMHg0NSwgMHgyMSwgMHgwMiwgMHg1OCwgMHg0RiwKKwkgMHgyRCwgMHgwMCwgMHg5NCwgMHg4MCwgMHgyQywgMHg0NSwgMHgxQywgMHgwMiwgMHg1OCwgMHg0RiwgMHgyOCwgMHgwMCwgMHg5NCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgxNywgMHgwMiwgMHgyMiwgMHg0NCwgMHg0QywgMHg4MiwgMHgyOCwgMHg0NSwgMHgxQywgMHgwMywgMHg1OCwgMHg0RiwgMHgxRiwgMHgwMCwgMHhFQywgMHgwMSwKKwkgMHg0MCwgMHg0QiwgMHgyOCwgMHg0NywgMHg0MCwgMHg0OCwgMHgyQSwgMHg0NywgMHg0MCwgMHg0QSwgMHgyQywgMHg0NywgMHg2MCwgMHg0NSwgMHgyQSwgMHg1RSwKKwkgMHg0MCwgMHg0QywgMHgyQSwgMHg0NCwgMHgyOCwgMHg1RSwgMHg0MCwgMHg0QSwgMHgyOCwgMHg0NCwgMHg2NSwgMHg1RSwgMHg0MCwgMHg0OCwgMHgyQiwgMHg0NCwKKwkgMHg2OCwgMHg2NSwgMHhENywgMHg4MCwgMHhGRiwgMHhGRiwgMHgxNywgMHgwRSwgMHg5MCwgMHgwMSwgMHgyNiwgMHg0NiwgMHhEMCwgMHg2MCwgMHhCNSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhCOSwgMHhGRiwgMHgyNiwgMHg0NiwgMHhEMCwgMHg2MCwgMHhCNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDOSwgMHg4MSwgMHhDQiwgMHg4MywKKwkgMHgwNywgMHgxQywgMHgwMSwgMHgxRCwgMHgwOCwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCNCwgMHhEOCwgMHg4MSwKKwkgMHg1QSwgMHhEMiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHhEMCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhEMSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHg2MCwgMHhGRSwgMHg2MSwgMHgwMCwgMHhGNCwgMHgxMiwgMHg2MywgMHg2QSwgMHg2NCwgMHgwMSwgMHg2NSwgMHhCRCwgMHhEMCwgMHhDOCwgMHg4NCwKKwkgMHg1OSwgMHhEOSwgMHhGQywgMHgwMiwgMHg2NSwgMHg0MCwgMHgwMSwgMHgzQSwgMHgwNSwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwMCwgMHg2NSwgMHgwRSwgMHg2NCwKKwkgMHgwNCwgMHg2MywgMHhGNCwgMHgwMSwgMHgyRiwgMHg2MCwgMHg1OCwgMHg2NCwgMHgwRSwgMHg2MCwgMHhEOSwgMHhGQiwgMHgxRCwgMHg2MCwgMHhCMCwgMHg2NCwKKwkgMHhBMCwgMHhERiwgMHgxNywgMHg2MCwgMHhBOCwgMHhGMywgMHgwRSwgMHg2MCwgMHhEQiwgMHhGQiwgMHgwRSwgMHg2MCwgMHhEQiwgMHhGMywgMHgwRSwgMHg2MCwKKwkgMHhEOCwgMHhGMywgMHg2MCwgMHg0NSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHgxRCwgMHg2MCwgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHg2NCwgMHgwRSwgMHg2MCwgMHhENywgMHhGQiwgMHgwRSwgMHg2MCwgMHhEOSwgMHhGMywgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHg0MCwgMHg0OCwKKwkgMHg0MCwgMHg0QSwgMHhGQSwgMHhBNCwgMHhBMCwgMHhEMywgMHg0MSwgMHg0QywgMHhEQywgMHg4NCwgMHhBOCwgMHg4NCwgMHgwRSwgMHg2MCwgMHhEQywgMHhGQiwKKwkgMHgyOCwgMHg0NSwgMHg0NCwgMHg4QiwgMHgyQiwgMHhEMywgMHgwRSwgMHg2MCwgMHhEQSwgMHhGQiwgMHgyOCwgMHg0MiwgMHg0QSwgMHhEMywgMHgyQywgMHg0NSwKKwkgMHg0NCwgMHg4QywgMHgwMSwgMHg2NCwgMHg0MCwgMHg0OCwgMHgwRSwgMHg2MCwgMHhEQywgMHhGMywgMHhGRiwgMHhGRiwgMHgzNiwgMHgxOCwgMHhDQywgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgwRSwgMHg2MCwgMHhEQSwgMHhGMywgMHgyOCwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMywgMHg2MCwgMHhGRSwKKwkgMHgyQywgMHhEMywgMHgyQSwgMHhEMywgMHg2MCwgMHg0NSwgMHhENCwgMHg4MCwgMHgyMCwgMHhGRSwgMHgwMSwgMHgwMywgMHgxMiwgMHgwMCwgMHgyOCwgMHg0NCwKKwkgMHhFMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgyNCwgMHgwMSwgMHgwMCwgMHgwNiwgMHgwMCwgMHgyQiwgMHg0NCwgMHg1OCwgMHg4QiwgMHgyQiwgMHhEMywKKwkgMHgwRSwgMHg2MCwgMHhEQSwgMHhGQiwgMHgwMSwgMHg2NCwgMHg0MCwgMHg0OCwgMHgyQSwgMHg0NCwgMHg1QywgMHg4QSwgMHgyQywgMHg0NCwgMHg1QywgMHg4QywKKwkgMHhEQSwgMHgwMSwgMHgwMCwgMHg2NCwgMHgwRSwgMHg2MCwgMHhENywgMHhGQiwgMHgwRSwgMHg2MCwgMHhEOSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwKKwkgMHhGQSwgMHhBNCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhDNCwgMHg4MSwgMHg2NSwgMHg0NCwgMHhGQywgMHhBNCwgMHhBMCwgMHhEMywgMHgwNiwgMHhBMSwKKwkgMHhEQywgMHg4NCwgMHhBOCwgMHg4NCwgMHg0NCwgMHg5NCwgMHgwRSwgMHg2MCwgMHhEOSwgMHhGQiwgMHgwRSwgMHg2MCwgMHhENywgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwOSwgMHgwMCwgMHgwRSwgMHg2MCwgMHhEOCwgMHhGMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg5NCwgMHgwMSwgMHgxQywgMHg2MCwgMHhENywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHhEQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwKKwkgMHgyRSwgMHg2MSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg1RiwgMHhGQiwgMHgwMSwgMHg2MCwKKwkgMHgwNSwgMHg2MSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg1RSwgMHhGQiwgMHgwMCwgMHg2MCwKKwkgMHgwMiwgMHg2MSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg2NSwgMHhGQiwgMHgxRiwgMHg2MCwKKwkgMHg2RCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgzNiwgMHhGQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NCwgMHhEQiwgMHhGQiwgMHhGMSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhGMSwgMHhGQiwgMHgxMCwgMHg2MCwgMHgzMCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwKKwkgMHgxNCwgMHg2MywgMHgwMSwgMHg2MCwgMHhDMiwgMHg2MSwgMHgyRCwgMHg2MCwgMHg5OCwgMHg2NCwgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwKKwkgMHgwMCwgMHg2MCwgMHg4QSwgMHg2MywgMHgyRCwgMHg2MCwgMHgwQywgMHg2MSwgMHgyRCwgMHg2MCwgMHhCMCwgMHg2NCwgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOSwKKwkgMHhGRCwgMHgxRiwgMHgxNiwgMHg2MCwgMHhBQiwgMHhGMywgMHgxOSwgMHg2MCwgMHg0OCwgMHhGMSwgMHhGRiwgMHhCNSwgMHg2NCwgMHg0MCwgMHgwMiwgMHgyQiwKKwkgMHgwQiwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwMywgMHgyRSwgMHgwOCwgMHgwMCwgMHg4MCwgMHgyQiwgMHgwNiwgMHgwMCwgMHgzMiwgMHg0NCwgMHgwMCwgMHg2MCwKKwkgMHg4MCwgMHg2MywgMHgzQywgMHg5NCwgMHg0MCwgMHg1MiwgMHgwNSwgMHgwMCwgMHgzMiwgMHg0NCwgMHhGRiwgMHg2MCwgMHg3RiwgMHg2MywgMHgyQywgMHg5NCwKKwkgMHg0MCwgMHg1MiwgMHg2NSwgMHg0MywgMHgxNiwgMHg2MCwgMHhBQiwgMHhGRCwgMHgxNiwgMHg2MCwgMHhDMiwgMHhGMSwgMHg2NiwgMHg0MSwgMHhBNiwgMHhGNSwKKwkgMHgzQSwgMHhGMiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgyMiwgMHg2NCwgMHgzQSwgMHhGQSwgMHg2MSwgMHg0NiwgMHgzMiwgMHg0NSwgMHgxNiwgMHg2MCwKKwkgMHhDQiwgMHhGMSwgMHgxMCwgMHg2NywgMHhCNCwgMHg4NSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHg5NCwgMHg4NSwgMHg0NSwgMHg1MiwgMHhGRiwgMHg2MCwKKwkgMHhFNywgMHg2NSwgMHgzMiwgMHg0MSwgMHhBNSwgMHg4MSwgMHgxNiwgMHg2MCwgMHhDMiwgMHhGMywgMHgwOCwgMHg2NSwgMHhGRiwgMHhBMCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgwMywgMHgwNywgMHgwMCwgMHgxNiwgMHg2MCwgMHhDNCwgMHhGMywgMHhCNSwgMHg4MSwgMHgxMCwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwKKwkgMHhCNSwgMHg4MSwgMHg0MSwgMHg1MiwgMHgxOSwgMHg2MCwgMHg0OCwgMHhGMywgMHgzNywgMHg2MCwgMHhFNiwgMHg2MywgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwKKwkgMHhGMCwgMHg4NCwgMHgwMywgMHhCNSwgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHgwMywgMHhCNCwgMHg2NSwgMHg1QywgMHhBMywgMHhEOSwgMHgzNywgMHg2MCwKKwkgMHhFOCwgMHg2MywgMHgwMiwgMHhBOCwgMHhBMywgMHhEQiwgMHgxNSwgMHgwMiwgMHgwMCwgMHg2MCwgMHhDOCwgMHg2NCwgMHgxQiwgMHg2MCwgMHhGNSwgMHhGQiwKKwkgMHgxQiwgMHg2MCwgMHhGOSwgMHhGQiwgMHgwNywgMHg2MCwgMHhEMCwgMHg2NCwgMHgxQiwgMHg2MCwgMHhGNiwgMHhGQiwgMHgxQiwgMHg2MCwgMHhGQSwgMHhGQiwKKwkgMHgwMSwgMHg2MCwgMHg5MCwgMHg2NCwgMHgxQiwgMHg2MCwgMHhGNywgMHhGQiwgMHgwMCwgMHg2MCwgMHg2NCwgMHg2NCwgMHgxQiwgMHg2MCwgMHhGOCwgMHhGQiwKKwkgMHgwNiwgMHgwMCwgMHg2NCwgMHg2NCwgMHgxQiwgMHg2MCwgMHhGNywgMHhGQiwgMHg2NCwgMHg2NCwgMHgxQiwgMHg2MCwgMHhGOCwgMHhGQiwgMHgxOSwgMHg2MCwKKwkgMHg0OCwgMHhGMSwgMHgwMSwgMHg2NCwgMHg2NCwgMHg0MCwgMHg0MCwgMHgyQSwgMHgwMiwgMHgwMCwgMHgxQiwgMHg2MCwgMHhFRSwgMHhGQiwgMHgzMywgMHg2MCwKKwkgMHhCQywgMHg2MSwgMHgyRCwgMHg2MCwgMHgwRSwgMHg2NCwgMHgyMCwgMHg2MywgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHhCQSwgMHhGMSwKKwkgMHg3RSwgMHhGOSwgMHgxQSwgMHg2MywgMHgwMCwgMHg2MCwgMHhGQywgMHg2MSwgMHgwMCwgMHg2NCwgMHg1OSwgMHhEQiwgMHhGRSwgMHgxRiwgMHg0MCwgMHg0MCwKKwkgMHgwMSwgMHg2NCwgMHg4NSwgMHhGQiwgMHgxNywgMHg2MCwgMHgxNCwgMHhGMywgMHgzNSwgMHg2MCwgMHgzNiwgMHg2MSwgMHhGRSwgMHhBNCwgMHhFMCwgMHg4NCwKKwkgMHgwNCwgMHgyNCwgMHgwQywgMHgwMCwgMHhFMCwgMHg4NCwgMHg0MSwgMHg5MSwgMHgxQSwgMHg2MCwgMHgxRiwgMHhGMywgMHhBMSwgMHhEMSwgMHg1OSwgMHhEMSwKKwkgMHhBMCwgMHg4MywgMHgxQSwgMHg2MCwgMHgxQiwgMHhGRCwgMHhBMCwgMHg4MywgMHgxQSwgMHg2MCwgMHgxQSwgMHhGRCwgMHhFNCwgMHhGMywgMHg3RCwgMHhGQiwKKwkgMHhDRiwgMHhGMSwgMHgxMCwgMHg2MCwgMHhFQywgMHg2MywgMHgyRiwgMHgxOCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgxMiwgMHgwMCwgMHhDQywgMHg4NCwKKwkgMHgwNiwgMHhBMywgMHhGRCwgMHgwMiwgMHhBMywgMHhEMywgMHgxMCwgMHg2MCwgMHhGMiwgMHg2MywgMHgyNSwgMHgxQiwgMHgxMSwgMHg2MCwgMHg0NCwgMHg2NSwKKwkgMHhBMywgMHhEMywgMHgwNiwgMHhBMywgMHhENywgMHg4MCwgMHgwMiwgMHgxQiwgMHhGQiwgMHgwNCwgMHgxRCwgMHgwMCwgMHhGOCwgMHhBMywgMHhBMywgMHhEMywKKwkgMHgxOCwgMHgwMCwgMHgxMSwgMHg2MCwgMHg2MCwgMHg2MywgMHgxMiwgMHg2MCwgMHg0MCwgMHg2NSwgMHhBMywgMHhEMSwgMHgwOCwgMHhBMywgMHhEMCwgMHg4MCwKKwkgMHhENywgMHg4MCwgMHgwMiwgMHgwMywgMHhGQSwgMHgwNCwgMHgwRiwgMHgwMCwgMHhGQSwgMHhBMywgMHhBMywgMHhEMywgMHgxMSwgMHg2MCwgMHg2MiwgMHg2MywKKwkgMHgwQSwgMHgxQiwgMHhBMywgMHhEMywgMHgwOCwgMHhBMywgMHhENywgMHg4MCwgMHgwMiwgMHgxQiwgMHhGQiwgMHgwNCwgMHgwNCwgMHgwMCwgMHhGNiwgMHhBMywKKwkgMHhBMywgMHhEMywgMHhFNCwgMHhGQiwgMHg3RCwgMHhGQiwgMHgyRSwgMHg2MCwgMHgyRSwgMHg2NCwgMHgyRCwgMHg2MCwgMHg4QSwgMHg2MywgMHhBMCwgMHhEMSwKKwkgMHhBMywgMHhEOSwgMHg2NCwgMHg0MSwgMHg1OCwgMHhEMSwgMHg1QiwgMHhEOSwgMHg3RCwgMHhGMywgMHg2NiwgMHg0NSwgMHhBNiwgMHhGNSwgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgyNywgMHgwOCwgMHgwMCwgMHg5MSwgMHhGQSwgMHg2MSwgMHg0NCwgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwgMHhBQywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxMiwgMHhGQSwgMHgwNywgMHgwMCwgMHgxMSwgMHhGOCwgMHg2NCwgMHg0NCwgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwgMHhBQywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxMiwgMHhGQSwgMHg2NSwgMHg0NiwgMHg0NiwgMHg0OCwgMHhFMiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwNSwgMHgzQSwgMHgwMywgMHgwMCwKKwkgMHgxNCwgMHg2MCwgMHgyMiwgMHg2NiwgMHgxMSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMywgMHgwMCwgMHgxNCwgMHg2MCwgMHgxNiwgMHg2NiwgMHgwQywgMHgwMCwKKwkgMHgwMywgMHgzQSwgMHgwMywgMHgwMCwgMHgxNCwgMHg2MCwgMHgwQSwgMHg2NiwgMHgwNywgMHgwMCwgMHgwMiwgMHgzQSwgMHgwMywgMHgwMCwgMHgxMywgMHg2MCwKKwkgMHhGRSwgMHg2NiwgMHgwMiwgMHgwMCwgMHgxMywgMHg2MCwgMHhGMiwgMHg2NiwgMHg2MCwgMHhGRSwgMHhBNiwgMHhEMywgMHhERSwgMHg4NiwgMHgxMywgMHg2MCwKKwkgMHhEQywgMHhGQiwgMHhBNiwgMHhEMywgMHhERSwgMHg4NiwgMHgyOCwgMHg2MCwgMHgyOSwgMHg2MywgMHhBMywgMHhEQiwgMHgyOCwgMHg2MCwgMHhBMSwgMHg2MywKKwkgMHhBMywgMHhEQiwgMHhBNiwgMHhEMywgMHhERSwgMHg4NiwgMHgxMywgMHg2MCwgMHhEQiwgMHhGQiwgMHhBNiwgMHhEMywgMHhERSwgMHg4NiwgMHgyNywgMHg2MCwKKwkgMHhCOSwgMHg2MywgMHhBMywgMHhEQiwgMHgyMCwgMHhGRSwgMHhBNiwgMHhEMywgMHhEQSwgMHg4NiwgMHg2MCwgMHg0MywgMHgxRiwgMHhCMywgMHg2MywgMHg1QywKKwkgMHgxRiwgMHg2MCwgMHgwMCwgMHhCNCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhCMCwgMHg4NSwgMHgxNCwgMHg2MCwgMHgxMiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhGQywgMHg2MCwgMHgwMCwgMHhCNCwgMHhCNCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxNCwgMHg2MCwgMHg0RSwgMHhGQiwgMHgyOCwgMHg2MCwKKwkgMHhDNCwgMHg2MywgMHhBMywgMHhEMywgMHhBNiwgMHhEMSwgMHhERSwgMHg4NiwgMHg4MCwgMHg2MCwgMHg3RiwgMHhCNSwgMHg2NCwgMHg0NCwgMHg2MCwgMHg0NywKKwkgMHhFOCwgMHg4NCwgMHg3RiwgMHg2MCwgMHg4MCwgMHhCNCwgMHhCNCwgMHg4NCwgMHhBMywgMHhEQiwgMHg2MCwgMHhGRSwgMHhBNiwgMHhEMywgMHhERSwgMHg4NiwKKwkgMHgxMywgMHg2MCwgMHhERiwgMHhGQiwgMHhBNiwgMHhEMywgMHhERSwgMHg4NiwgMHgwMCwgMHg2MCwgMHhERiwgMHhGQiwgMHhBNiwgMHhEMywgMHhERSwgMHg4NiwKKwkgMHgwMCwgMHg2MCwgMHhFMCwgMHhGQiwgMHhBNiwgMHhEMywgMHgwMCwgMHg2MCwgMHhFMSwgMHhGQiwgMHgyMCwgMHhGRSwgMHgyOCwgMHg0NiwgMHgxOSwgMHg2MCwKKwkgMHg0RCwgMHhGMSwgMHgwMCwgMHg2MCwgMHhDRiwgMHhGMywgMHg2NCwgMHg0MCwgMHgwMCwgMHgzQSwgMHgwRiwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwKKwkgMHgwNSwgMHgwMCwgMHgwMiwgMHgzNiwgMHgwMywgMHgwMCwgMHgwNywgMHgzNiwgMHgwMSwgMHgwMCwgMHgwNywgMHgwMCwgMHgxMCwgMHg2MCwgMHhGMCwgMHg2NCwKKwkgMHgwMCwgMHg3QywgMHg0NCwgMHhBNCwgMHhBMCwgMHhEOSwgMHgwNiwgMHhBNCwgMHhBMCwgMHhEOSwgMHgzNiwgMHg0MCwgMHgwOCwgMHgzQSwgMHgwMywgMHgwMCwKKwkgMHhGMywgMHg2MCwgMHgwQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MywgMHgxMCwgMHg2MCwgMHgxMCwgMHhGRCwgMHgxMCwgMHg2MCwgMHgzMCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQSwgMHgwNCwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxOSwgMHhGQiwKKwkgMHgxRSwgMHg2MCwgMHg4RCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RCwgMHhGMSwgMHgxMywgMHg2MCwKKwkgMHgxQSwgMHhGOSwgMHgwQywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwNywgMHg2NCwgMHhDQywgMHhGQiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxOSwgMHhGQiwgMHgxRiwgMHg2MCwgMHg1MywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgzMCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwKKwkgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhDNSwgMHhGRSwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxOCwgMHhGQiwKKwkgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgzMCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg4OSwgMHhGQiwgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwOCwgMHg2MCwgMHgzMCwgMHhGMSwgMHgwMCwgMHg2MCwgMHhERiwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMSwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMSwgMHhGQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwOCwgMHg2MCwKKwkgMHgxOCwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHgxOSwgMHhGQiwgMHgxRiwgMHg2MCwgMHg5MiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHg2MCwgMHgxOCwgMHhGMSwgMHg3RiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4OSwgMHhGMywgMHgwMCwgMHg2NSwKKwkgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwQSwgMHgwMywgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxOSwgMHhGQiwgMHgxRiwgMHg2MCwKKwkgMHg5MiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg5NSwgMHhGMywgMHhGRiwgMHhGRiwgMHg3RiwgMHhCNCwKKwkgMHg5NSwgMHhGQiwgMHhERSwgMHhGRSwgMHgwQSwgMHgwNCwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxOSwgMHhGQiwgMHgxRiwgMHg2MCwKKwkgMHhCNywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg2MCwgMHgzNCwgMHg2MiwgMHgwNiwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxOCwgMHhGQiwgMHg1QSwgMHhEQiwgMHhCRSwgMHhGRSwKKwkgMHhEQSwgMHhGRSwgMHgyNSwgMHg2MCwgMHhEQSwgMHg2MSwgMHgxRiwgMHg2MCwgMHg1OCwgMHg0RSwgMHhFQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg2MCwKKwkgMHhDOCwgMHg2MSwgMHgxRiwgMHg2MCwgMHg1OCwgMHg0RSwgMHhFQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg2MCwgMHhDRSwgMHg2MSwgMHgxRiwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhFQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg2MCwgMHhFQywgMHg2MSwgMHgxRiwgMHg2MCwgMHg1OCwgMHg0RSwgMHhFQSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNSwgMHg2MCwgMHhGMiwgMHg2MSwgMHgxRiwgMHg2MCwgMHg1OCwgMHg0RSwgMHhFQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg2MCwKKwkgMHhGRSwgMHg2MSwgMHgxRiwgMHg2MCwgMHg1OCwgMHg0RSwgMHhFQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDNSwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhBMSwgMHhEMywgMHgwRSwgMHg1NywgMHgyMywgMHgwMCwgMHgwRSwgMHhGMiwgMHg0NCwgMHg0QywgMHg4MCwgMHhCMCwgMHgxMCwgMHhCMCwgMHgwQSwgMHgwMywKKwkgMHgwMCwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHgxMywgMHgwMCwgMHgxMiwgMHgwMiwgMHhGMCwgMHgzNywgMHgwOSwgMHgwMCwgMHgwMiwgMHhGMCwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NCwKKwkgMHhEMCwgMHg4MCwgMHhBMiwgMHhGRiwgMHhBRCwgMHhGMywgMHgwMiwgMHgwMiwgMHhDQywgMHg4NCwgMHhBRCwgMHhGQiwgMHgyNiwgMHg2MCwgMHgxQSwgMHg2NCwKKwkgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQywgMHg0NCwgMHhBQywgMHg4NiwgMHgwOSwgMHhGMCwKKwkgMHhEQSwgMHgwMiwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHg2MCwKKwkgMHg4NSwgMHg2NCwgMHgwOCwgMHg2MCwgMHgzMiwgMHhGQiwgMHgxQywgMHg2MCwgMHhCNiwgMHg2MiwgMHhBMiwgMHhERiwgMHgwNiwgMHhBMiwgMHgxMCwgMHg2MCwKKwkgMHg4OCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHg1QSwgMHhEQiwgMHgxQywgMHg2MCwgMHhDMiwgMHg2MiwgMHhBMiwgMHhERiwKKwkgMHgwNiwgMHhBMiwgMHgxMCwgMHg2MCwgMHg4QywgMHg2NCwgMHhBMiwgMHhEQiwgMHgwNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHg1QSwgMHhEQiwgMHgxQywgMHg2MCwKKwkgMHhDRSwgMHg2MiwgMHhBMiwgMHhERiwgMHgwNiwgMHhBMiwgMHgxMCwgMHg2MCwgMHg5MCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwNiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHg1QSwgMHhEQiwgMHhCRCwgMHhGMSwgMHgwRSwgMHg2MCwgMHg2OSwgMHhGOSwgMHgyNCwgMHg2MCwgMHhDMSwgMHg2NCwgMHgwOCwgMHg2MCwgMHg0MywgMHhGQiwKKwkgMHgyNCwgMHg2MCwgMHhDQSwgMHg2NCwgMHgwOCwgMHg2MCwgMHg0NSwgMHhGQiwgMHgyNCwgMHg2MCwgMHhEMywgMHg2NCwgMHgwOCwgMHg2MCwgMHg0NywgMHhGQiwKKwkgMHgwMCwgMHg2MCwgMHgzQSwgMHg2MSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg2MiwgMHhGQiwKKwkgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwgMHhBNiwgMHhGMywgMHgwNywgMHhGQSwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgzRiwgMHhGQSwgMHgwMCwgMHg2MCwKKwkgMHgwMiwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwRCwgMHhGQiwgMHgyMCwgMHg2MCwgMHg2MywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgxOCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg2OSwgMHhGQiwgMHgwRiwgMHg0RSwKKwkgMHhFQSwgMHg2MCwgMHg1OCwgMHg0RiwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHgwMCwgMHg2NCwgMHg2QiwgMHhGQiwgMHg2MiwgMHhGNSwKKwkgMHhFQSwgMHhGMywgMHgyRiwgMHhGQSwgMHhFQiwgMHhGMywgMHgzMCwgMHhGQSwgMHhFQywgMHhGMywgMHgzMSwgMHhGQSwgMHg3RiwgMHhGMywgMHgyQywgMHhGQSwKKwkgMHgzMiwgMHhGQSwgMHg4MCwgMHhGMywgMHgyRCwgMHhGQSwgMHgzMywgMHhGQSwgMHg4MSwgMHhGMywgMHgyRSwgMHhGQSwgMHgzNCwgMHhGQSwgMHhCOSwgMHhGMywKKwkgMHgxOSwgMHhGQSwgMHgwNiwgMHg2MCwgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwgMHhGNywgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwKKwkgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwOCwgMHg2MCwKKwkgMHgwQywgMHhGMSwgMHhGRiwgMHg2MCwgMHg4RiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGMSwgMHgwRSwgMHg2MCwgMHg2MywgMHhGOSwKKwkgMHgxQywgMHg2MCwgMHhDMiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHgwMCwgMHg2NCwgMHg2QiwgMHhGQiwgMHgwMCwgMHg2MCwgMHg3NCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwRCwgMHhGQiwgMHgyMCwgMHg2MCwgMHhBRSwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyMywgMHg2MCwgMHg4NSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFMiwgMHgwMSwKKwkgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgxMSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg0MCwKKwkgMHg1MCwgMHgyNywgMHhEOCwgMHgwMSwgMHhBQywgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwRiwgMHgwNiwgMHg2QiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhFQywgMHhBMCwgMHhEQywgMHg4NCwgMHgwMSwgMHgwNSwgMHhBMiwgMHhEQiwgMHhDQywgMHgwMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHhDRiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHgwMCwgMHhDMywgMHgwMSwgMHgwMSwgMHg2NCwKKwkgMHgxOSwgMHg2MCwgMHhGMywgMHhGQiwgMHhERiwgMHhGMywgMHgyOSwgMHg0NSwgMHhENCwgMHg4MCwgMHg2QiwgMHhGMywgMHgwMywgMHgwNCwgMHgyMSwgMHg2MCwKKwkgMHgyOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFQywgMHhBMCwgMHgwMCwgMHg2NCwgMHgwNCwgMHgwNCwgMHg0MCwgMHg0OSwgMHgyMSwgMHg2MCwgMHgyOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHg2NCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwRCwgMHhGQiwgMHgyMCwgMHg2MCwgMHhGRCwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwKKwkgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyMywgMHg2MCwgMHg4NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwKKwkgMHg0MCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhEMCwgMHgwMSwgMHgwMCwgMHg2MCwKKwkgMHgyMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHhFNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg0MCwgMHg1MCwgMHgyNywKKwkgMHhFMCwgMHgwMSwgMHhBQywgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwNiwgMHg2QiwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhFQywgMHhBMCwgMHhEQywgMHg4NCwgMHgwMSwgMHgwNSwgMHhBMiwgMHhEQiwgMHhCQSwgMHgwMSwgMHhCOSwgMHgwMSwgMHgzMywgMHg2MCwgMHhFNiwgMHg2NSwKKwkgMHhBNSwgMHhERiwgMHhCRiwgMHhGMSwgMHgwRSwgMHg2MCwgMHg2MywgMHhGOSwgMHhFMCwgMHhGMywgMHgyOSwgMHg0NSwgMHgwMywgMHhBNCwgMHhENCwgMHg4MCwKKwkgMHgwMSwgMHg2MywgMHgwMSwgMHgwNSwgMHgwMCwgMHg2MywgMHg1MywgMHhGRCwgMHg3RCwgMHhGMywgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NSwgMHhBNCwgMHg4MCwKKwkgMHgyNCwgMHg0NCwgMHhGRSwgMHhCNCwgMHgwMSwgMHgwMywgMHgwMSwgMHhCQywgMHg0MCwgMHg0NCwgMHgyMSwgMHg2MCwgMHg0NSwgMHg2NCwgMHg2QSwgMHhGQiwKKwkgMHgyMywgMHg2MCwgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHhGRiwgMHg2MCwgMHhERiwgMHg2NCwgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHg4NiwgMHhGMSwgMHgxQiwgMHg2MCwgMHhCMiwgMHg2MywgMHhEMywgMHg4MCwgMHg2NywgMHhGRCwgMHg0MywgMHgwMywgMHg2NywgMHhGMywKKwkgMHhFMSwgMHhGMSwgMHg2MCwgMHg0MywgMHgyOSwgMHg0NCwgMHhBMywgMHhEMywgMHhDMCwgMHg4NSwgMHhENCwgMHg4MCwgMHg1QiwgMHhEMywgMHgzQSwgMHgwNiwKKwkgMHg2MCwgMHg0MywgMHgwOCwgMHhBMywgMHhCRSwgMHhEMywgMHg4MSwgMHhGMSwgMHhBMywgMHhEMywgMHhEMCwgMHg4MCwgMHg4MCwgMHhGMSwgMHgwNSwgMHgwMiwKKwkgMHhCRiwgMHhEMywgMHhEMCwgMHg4MCwgMHg3RiwgMHhGMSwgMHgwMSwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGOCwgMHhBMywgMHgyOCwgMHgwMiwgMHgyMSwgMHg2MCwKKwkgMHg3NywgMHg2NCwgMHg2QSwgMHhGQiwgMHgyMywgMHg2MCwgMHhCNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHhCMCwgMHg4MiwgMHhGMywgMHgyMiwgMHgwMywKKwkgMHg2MiwgMHhGNSwgMHg0OCwgMHg3RSwgMHgyQSwgMHhGQSwgMHgyNSwgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHgwRCwgMHhGQiwgMHgyMSwgMHg2MCwgMHg5MiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHhGRiwgMHg2MCwgMHhGRSwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwMywgMHgwMCwgMHgyMywgMHg2MCwKKwkgMHg3QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2QiwgMHhGMywgMHhGRiwgMHhGRiwgMHhFQywgMHhBMCwgMHgwMCwgMHg2NCwgMHgwMiwgMHgwNCwgMHg0MCwgMHg0OSwKKwkgMHgxNSwgMHgwMCwgMHhERiwgMHhGMywgMHgyOSwgMHg0NSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwQiwgMHgwNywgMHgxQywgMHg2MCwgMHhDMiwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyMCwgMHg2MCwgMHg4NiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhFMCwgMHhGMywgMHgyOSwgMHg0NSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxNiwgMHgwNiwgMHgwNCwgMHg2NSwgMHhGMSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhDMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNSwgMHg2NCwgMHhEQiwgMHhGQiwgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCQywKKwkgMHhGMSwgMHhGQiwgMHgxQywgMHg2MCwgMHhDMiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHgyMiwgMHg2MCwgMHgxQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHg3NCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwRCwgMHhGQiwKKwkgMHgyMSwgMHg2MCwgMHhEOCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwKKwkgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyMywgMHg2MCwKKwkgMHg4NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhCMCwgMHgwMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgxNSwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgyMCwgMHg0MCwgMHg1MCwgMHgyNywgMHhBNiwgMHgwMSwgMHhBQywgMHhGMywgMHg2QiwgMHhGMywgMHhGRSwgMHhBMCwgMHhFQywgMHhBMCwKKwkgMHgwQSwgMHgwNiwgMHgwMywgMHgwNCwgMHgwMCwgMHg2NCwgMHg1NSwgMHhGQiwgMHg0MCwgMHg0OSwgMHg2QiwgMHhGMywgMHhGRiwgMHhGRiwgMHhFQywgMHhBMCwKKwkgMHhEQywgMHg4NCwgMHgwMSwgMHgwNSwgMHhBMiwgMHhEQiwgMHg5NiwgMHgwMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgwRCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyMSwgMHg2MCwgMHgyOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg2MCwgMHg5QywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg3RCwgMHhGMywgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NSwgMHhBNCwgMHg4MCwgMHgyNCwgMHg0NCwgMHhGRSwgMHhCNCwgMHgwMSwgMHgwMywKKwkgMHgwMSwgMHhCQywgMHgwMiwgMHhCMCwgMHhGQiwgMHhCNCwgMHgwMSwgMHgwMywgMHgwNCwgMHhCQywgMHg0MCwgMHg0NCwgMHhDMCwgMHhGMSwgMHgwRSwgMHg2MCwKKwkgMHg2MywgMHhGOSwgMHhDRiwgMHhGMywgMHgyMCwgMHg2MCwgMHgyMCwgMHg2NSwgMHgzMCwgMHgxQiwgMHhBNSwgMHhEMywgMHgyNCwgMHg0MCwgMHgwMSwgMHgyNiwKKwkgMHgxNiwgMHgwMCwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyNiwgMHgyOSwgMHgwMCwgMHgwMSwgMHhCQywgMHhBNSwgMHhEQiwgMHgwOCwgMHg2MCwgMHgxRSwgMHhGMSwKKwkgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwKKwkgMHgwRCwgMHhGQiwgMHgyMiwgMHg2MCwgMHg1RiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwKKwkgMHgxMCwgMHgyNiwgMHgxMywgMHgwMCwgMHgwMSwgMHhCQywgMHhBNSwgMHhEQiwgMHgwOCwgMHg2MCwgMHgxRSwgMHhGMSwgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwRCwgMHhGQiwgMHgyMiwgMHg2MCwKKwkgMHg1RiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRCwgMHg2NCwgMHg1MywgMHhGQiwgMHgyMiwgMHg2MCwKKwkgMHg2NywgMHg2NCwgMHg2QSwgMHhGQiwgMHgyMywgMHg2MCwgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwKKwkgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHhGRiwgMHg2MCwKKwkgMHhERiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4NiwgMHhGMSwgMHgxQiwgMHg2MCwgMHhCMiwgMHg2MywgMHhEMywgMHg4MCwgMHg2NywgMHhGRCwKKwkgMHgwNywgMHgwMiwgMHgyNCwgMHg0NCwgMHgwNCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgzNiwgMHgwMywgMHgwNSwgMHhBQywgMHg0MCwgMHg0NCwgMHhBNiwgMHgwMSwKKwkgMHg2NywgMHhGMywgMHgyOSwgMHg0MSwgMHhBMCwgMHhEMSwgMHg1OCwgMHhEMywgMHhEMSwgMHg4MCwgMHg2NCwgMHg0NSwgMHg2MCwgMHg0MywgMHgyQiwgMHgwNSwKKwkgMHgwOCwgMHhBMywgMHhCRSwgMHhEMywgMHg4MSwgMHhGMSwgMHhBMywgMHhEMywgMHhEMCwgMHg4MCwgMHg4MCwgMHhGMSwgMHgwNSwgMHgwMiwgMHhCRiwgMHhEMywKKwkgMHhEMCwgMHg4MCwgMHg3RiwgMHhGMSwgMHgwMSwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGOCwgMHhBMywgMHgwNywgMHgwMiwgMHg0NSwgMHg0OSwgMHgyMiwgMHg2MCwKKwkgMHhDRCwgMHg2NCwgMHg2QSwgMHhGQiwgMHgyMywgMHg2MCwgMHhCNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNSwgMHg2NSwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHhDMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHg2NCwgMHhEQiwgMHhGQiwgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhGMSwgMHhGQiwKKwkgMHgyMywgMHg2MCwgMHg3QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NywgMHhGMywgMHg4NiwgMHhGMSwgMHgwNCwgMHhBNCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgwMywgMHg2NywgMHhGQiwgMHhDRCwgMHgwMSwgMHg2QiwgMHhGMywgMHhGRiwgMHhGRiwgMHhFQywgMHhBMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNCwKKwkgMHg3NSwgMHgwMCwgMHhFMCwgMHhGMywgMHgyOSwgMHg0NSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHg3MCwgMHgwNSwgMHg3RCwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwOCwgMHgwMCwgMHgyMiwgMHg2MCwgMHhDRCwgMHg2MywgMHg2QSwgMHhGRCwgMHgxQywgMHg2MCwgMHg3OCwgMHg2MywKKwkgMHgyMywgMHg2MCwgMHhCNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHhDMiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwNSwgMHg2NSwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHhDMywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyMCwgMHg2MCwgMHgxNCwgMHg2MSwgMHhBMSwgMHhERiwgMHgwNCwgMHg2NCwgMHhEQiwgMHhGQiwgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwKKwkgMHhGMSwgMHhGQiwgMHg4MiwgMHhGMywgMHg2MiwgMHhGNSwgMHg0OCwgMHg3RSwgMHgyQSwgMHhGQSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwKKwkgMHgzNCwgMHg4MCwgMHgyNSwgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwRCwgMHhGQiwKKwkgMHgyMywgMHg2MCwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwKKwkgMHhGRiwgMHg2MCwgMHhGRSwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwgMHgzMiwgMHg2NCwgMHgwRSwgMHg2MCwgMHg2MywgMHhGQiwKKwkgMHgxQywgMHg2MCwgMHhDMiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwRCwgMHhGQiwgMHgyMywgMHg2MCwgMHgxQywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHhGRiwgMHg2MCwgMHhFRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhGRCwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyMCwgMHg2MCwgMHg4NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHg3NCwgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHgwRCwgMHhGQiwgMHgyMywgMHg2MCwgMHgzQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgyMywgMHg2MCwgMHg4NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg2NywgMHgwMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgxNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg0MCwgMHg1MCwgMHgyNywgMHhFMCwgMHgwMSwgMHhBQywgMHhGMywgMHg2QiwgMHhGMywKKwkgMHhGRSwgMHhBMCwgMHhFQywgMHhBMCwgMHgwQSwgMHgwNiwgMHgwMywgMHgwNCwgMHgwMCwgMHg2NCwgMHg1NSwgMHhGQiwgMHg0MCwgMHg0OSwgMHg2QiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhFQywgMHhBMCwgMHhEQywgMHg4NCwgMHgwMSwgMHgwNSwgMHhBMiwgMHhEQiwgMHg0RCwgMHgwMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHhDQiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwKKwkgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyMiwgMHg2MCwgMHgxQiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQywgMHg2MCwgMHhCNiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxQywgMHg2MCwgMHhDMiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxQywgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwQywgMHhGQiwgMHg1QSwgMHhEQiwgMHgwMCwgMHg2NCwKKwkgMHg2OSwgMHhGQiwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwRCwgMHhGQiwgMHgyMCwgMHg2MCwgMHg2MywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhEMywgMHg3RCwgMHhGMSwgMHg3QywgMHhGQiwgMHhEMCwgMHg4MCwgMHgwMCwgMHg2NCwgMHgzOSwgMHgwMywKKwkgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHhCRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQSwgMHgwNCwKKwkgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwRCwgMHhGQiwgMHgyMywgMHg2MCwgMHhCQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHhERiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg3QywgMHhGMSwgMHg3RCwgMHhGOSwgMHgxMywgMHg2MCwgMHgxQSwgMHhGOSwgMHgwRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwKKwkgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwRCwgMHhGQiwgMHgyMywgMHg2MCwgMHhFNCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCRSwgMHhGRSwgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHhERiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgwMSwgMHg2NCwgMHg2QSwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwKKwkgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHg3RiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg0MCwgMHg1MSwgMHgyMywKKwkgMHgwQSwgMHgwMCwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwRCwgMHhGQiwgMHgyMywgMHg2MCwgMHhGQSwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHg3RiwgMHg2MCwgMHhGRiwgMHg2MSwgMHhBMSwgMHg4NCwKKwkgMHg1QSwgMHhEMSwgMHg0QSwgMHhEQiwgMHhBMSwgMHg4NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg4QSwgMHhGQiwgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwKKwkgMHg4QSwgMHhGMywgMHgwMCwgMHg2NSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxMCwgMHgwMywgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHg3RiwgMHg2MCwKKwkgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwRCwgMHhGQiwgMHgyNCwgMHg2MCwKKwkgMHgxNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzMywgMHg2MCwgMHhCRSwgMHg2NCwgMHg1NCwgMHhGQiwKKwkgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHhFRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg0NCwgMHgwMSwgMHhCMCwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMiwgMHgwOCwgMHg2MCwgMHgxMiwgMHhGMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwOCwgMHg2MCwgMHgxMiwgMHhGMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwRCwgMHhGQiwgMHgyNCwgMHg2MCwgMHg1NSwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHhDMiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHhFRiwgMHg2MCwgMHhFRiwgMHg2NCwgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgwMSwgMHg2NCwgMHg4QSwgMHhGQiwgMHg2QiwgMHhGMywgMHgwMCwgMHg2MCwgMHg5NSwgMHhGMywgMHhFQywgMHhBMCwgMHg0MCwgMHhCQywKKwkgMHgwNiwgMHgwNCwgMHhBMiwgMHhEQiwgMHg2OSwgMHhGMSwgMHhGRiwgMHg2MCwgMHhGQiwgMHg2NCwgMHhBMCwgMHg4NCwgMHg2OSwgMHhGQiwgMHhGRCwgMHg2MCwKKwkgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhDMSwgMHhGRSwgMHg2QSwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg1NSwgMHhGMSwgMHgyOCwgMHg0NCwKKwkgMHhEMCwgMHg4NCwgMHgwMywgMHhBNCwgMHgwMywgMHgwRSwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgwNCwgMHgwMCwgMHhGQSwgMHhBNCwgMHhFOCwgMHg4NCwKKwkgMHhFOCwgMHg4NywgMHhDMCwgMHhCRiwgMHhDMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg1NiwgMHhGMSwgMHgyOCwgMHg0NCwKKwkgMHhEMCwgMHg4NCwgMHgxRiwgMHhBNCwgMHgwNiwgMHgwRSwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHgwNywgMHgwMCwgMHhDMiwgMHhBNCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NywgMHhGOCwgMHhCRiwKKwkgMHhDMCwgMHg4NCwgMHg1QiwgMHhGMSwgMHg1NiwgMHhGQiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNSwgMHg2NCwgMHg0NCwgMHg1MiwgMHhGQiwKKwkgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg1MiwgMHhGMSwgMHgyRiwgMHg2NywgMHhEMCwgMHg4MCwgMHg2MCwgMHg0NSwgMHgwMiwgMHgyOCwgMHg2NCwgMHg0NSwKKwkgMHg1NSwgMHhGMSwgMHg4QiwgMHg2NywgMHhEMCwgMHg4MCwgMHg2MCwgMHg0MSwgMHgwMiwgMHgyNCwgMHg2NCwgMHg0MSwgMHhENSwgMHg4NCwgMHg4MCwgMHg2NSwKKwkgMHhDNCwgMHg4NywgMHgwMSwgMHgwNSwgMHgwMCwgMHg2NCwgMHhGRiwgMHhCNCwgMHg0MCwgMHg0OSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwKKwkgMHgwQywgMHhGMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyNywgMHhGMiwgMHg3MCwgMHg2MywgMHg2MCwgMHg0MCwgMHgwQSwgMHgzNiwgMHgxMCwgMHgwMCwgMHgxNCwgMHgzNiwKKwkgMHgxNCwgMHgwMCwgMHgzNywgMHgzNiwgMHgwRSwgMHgwMCwgMHg2RSwgMHgzNiwgMHgwRSwgMHgwMCwgMHgwNiwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwOSwgMHgzNiwKKwkgMHgwNCwgMHgwMCwgMHgxOCwgMHg2MywgMHgwQSwgMHgwMCwgMHgzMCwgMHg2MywgMHgwOCwgMHgwMCwgMHgyNiwgMHg2MywgMHgwNiwgMHgwMCwgMHhEMCwgMHg2MywKKwkgMHgwNCwgMHgwMCwgMHgzMywgMHg2MywgMHgwMiwgMHgwMCwgMHgyMSwgMHg2MywgMHgwMCwgMHgwMCwgMHgxMCwgMHg2MCwgMHgwRSwgMHhGRCwgMHgyNiwgMHg0NiwKKwkgMHgzRiwgMHhGMiwgMHg4NywgMHhGMCwgMHgwMCwgMHhGNCwgMHg0NSwgMHg0MywgMHgwMywgMHg0QiwgMHg2MCwgMHg0MywgMHhGNCwgMHhBMywgMHgwMCwgMHg2MCwKKwkgMHgxRCwgMHg2MSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NSwgMHgwMSwgMHg2MCwgMHhGRiwgMHg2NCwgMHg0MCwgMHg0QywgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg3QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0QSwgMHg2MCwgMHhGRSwKKwkgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHg2MCwgMHg0MSwgMHhGRSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgyQywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MywgMHhGNCwgMHhBMywgMHgwMCwgMHg2MCwKKwkgMHgxRCwgMHg2MSwgMHgwMCwgMHg2MCwgMHgzMiwgMHg2NSwgMHgwMSwgMHg2MCwgMHhGRiwgMHg2NCwgMHg0MCwgMHg0QywgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg3QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhGRiwgMHgwQiwgMHgwMywgMHg2MCwgMHhGRSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywKKwkgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHg2MCwgMHg0MSwgMHhGRSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgyQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwKKwkgMHgyQSwgMHg0NCwgMHhGQywgMHg2MCwgMHg1OCwgMHg0RSwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwgMHgwMSwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHhGNCwgMHhBNCwgMHhENCwgMHg4MCwgMHg2MCwgMHg0MSwgMHgwMiwgMHgyNCwgMHg2NSwgMHg0MSwgMHg0MSwgMHg0OCwgMHgwMCwgMHhGNCwKKwkgMHgxRSwgMHg2NSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHhBNSwgMHhEMCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwKKwkgMHgwNCwgMHg2NSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHgwNSwgMHgwMywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGMCwgMHgwMiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHgyOCwgMHg0MSwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwKKwkgMHhGRCwgMHhBMCwgMHhGRSwgMHhBMSwgMHgwNywgMHgwMywgMHgwOSwgMHgwNiwgMHg2NCwgMHg0NCwgMHhFMCwgMHg4NSwgMHhEMSwgMHg4MSwgMHhDNywgMHg4MywKKwkgMHhGNSwgMHgwNywgMHgwMywgMHgwMCwgMHhBMywgMHhEMywgMHgwRSwgMHg2MCwgMHgzQywgMHhGQiwgMHgzMSwgMHg0MCwgMHgwNiwgMHgyNiwgMHg1NywgMHgwMCwKKwkgMHgwMCwgMHg2NCwgMHg2RiwgMHhGQiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHgyOCwgMHg0MSwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHhGQywgMHhBMCwKKwkgMHhGQiwgMHhBMCwgMHgwOSwgMHgwMywgMHgyOCwgMHgwMywgMHg2NCwgMHg0NCwgMHhFMCwgMHg4NSwgMHhDNywgMHg4MywgMHhEMSwgMHg4MSwgMHhGRSwgMHhBMSwKKwkgMHg0NiwgMHgwNiwgMHhGMywgMHgwNywgMHg0NCwgMHgwMCwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHgwMCwgMHhCOCwgMHg2RiwgMHhGQiwgMHg2RSwgMHhGQiwKKwkgMHhCRCwgMHhEMywgMHgzRCwgMHgwMiwgMHhBMywgMHhEMywgMHg2MCwgMHg0NSwgMHg2MCwgMHg0NywgMHhCNCwgMHg4NCwgMHg2MCwgMHg0MSwgMHgzRiwgMHhCNSwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHg3MSwgMHhGQiwgMHg2NSwgMHg0NywKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg3MCwgMHhGQiwgMHg2NCwgMHg0NCwgMHhFMCwgMHg4NSwgMHhGQSwgMHhBMywgMHhDNywgMHg4MywgMHg2MSwgMHg0NCwKKwkgMHgwRSwgMHg2MCwgMHgzOCwgMHhGQiwgMHhEMiwgMHgwMSwgMHhCRCwgMHhEMywgMHhBMywgMHhEMywgMHgwMCwgMHhCOCwgMHg2RCwgMHhGQiwgMHg3MywgMHhGQiwKKwkgMHgxRSwgMHgwMiwgMHg4NSwgMHhGMSwgMHg2RiwgMHhGMywgMHg2QywgMHhGOSwgMHgwNCwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwMCwgMHgzQSwgMHgwNiwgMHg2NSwKKwkgMHgzMSwgMHg0NCwgMHhCNCwgMHg4NCwgMHg0MCwgMHg1MSwgMHgwMiwgMHgyQSwgMHgwQiwgMHgwMCwgMHgwOCwgMHhCQywgMHg0MCwgMHg1MSwgMHg3MSwgMHhGMywKKwkgMHg3MCwgMHhGMSwgMHgwMCwgMHhCOCwgMHg2NCwgMHg0NSwgMHgwMSwgMHgwMywgMHg2NywgMHg0NSwgMHg2NSwgMHg1MCwgMHhDQywgMHg4NCwgMHg3MiwgMHhGQiwKKwkgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwOCwgMHg2MCwKKwkgMHgxNiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQSwgMHgzRiwgMHgwMCwgMHgwMSwgMHg2NCwgMHgxMCwgMHg2MCwgMHgwQSwgMHhGQiwKKwkgMHgyNiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg2NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwRCwgMHhGMiwgMHg3RSwgMHhGQiwKKwkgMHgwMCwgMHg2NCwgMHg4NCwgMHhGQiwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MywgMHhGNCwgMHhBMywgMHgwMCwgMHg2MCwKKwkgMHgxRCwgMHg2MSwgMHgwMCwgMHg2MCwgMHgwNywgMHg2NSwgMHgwMSwgMHg2MCwgMHhGRiwgMHg2NCwgMHg0MCwgMHg0QywgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg3QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMywgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NSwgMHhBNSwgMHhEMywKKwkgMHgxQywgMHg2MCwgMHhFNiwgMHg2MywgMHhGRiwgMHhCNCwgMHgwMSwgMHhBNCwgMHg2MCwgMHg0MSwgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NCwKKwkgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHgwNSwgMHgwMywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwKKwkgMHhGNCwgMHgwMiwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgzMiwgMHgwMCwgMHgyNywgMHg2MCwgMHg1NywgMHg3OCwgMHhGRiwgMHhGRiwgMHhEQiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMywgMHhBOCwgMHgwMiwgMHhBOCwKKwkgMHgwMiwgMHgwMywgMHgzRSwgMHgwMiwgMHhGNiwgMHgwMSwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHhGRiwgMHg2MCwgMHhGQiwgMHg2NCwgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHgyNiwgMHg0NiwgMHgxMCwgMHg2MCwgMHgwRSwgMHhGMywgMHgyNSwgMHhGMiwgMHg2MCwgMHg0NSwgMHgyNCwgMHhGMCwgMHgwMCwgMHhGNCwKKwkgMHg2NCwgMHg0MywgMHhDNywgMHg4MywgMHg2MCwgMHg0MSwgMHgwMiwgMHgyNCwgMHgwMSwgMHhBMSwgMHgwQSwgMHhGMCwgMHgwOSwgMHhGMiwgMHhEMSwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwOSwgMHgwNywgMHgwNCwgMHgwNCwgMHg2MywgMHg0NSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwNiwgMHgyNiwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg2NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyNiwgMHhGMCwgMHhGRiwgMHg2NywgMHgyMCwgMHg4OCwgMHg2NCwgMHg1RiwKKwkgMHg0MCwgMHg0QSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg4MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHg0OCwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg5MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHhBQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHg2MCwgMHgwRCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyMiwgMHhCMywgMHgwMSwgMHgwMCwgMHg2MCwgMHg5NSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhCRiwgMHhCNCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgwRSwgMHhGMywgMHgyNiwgMHg0NiwgMHg2MCwgMHg0NSwgMHgyMCwgMHg2MCwKKwkgMHgwNCwgMHg2MywgMHgwMCwgMHhGNCwgMHgwOSwgMHhGMiwgMHhCRCwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwQSwgMHhGMiwgMHhCRCwgMHhEQiwgMHgwQiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHhCRCwgMHhEQiwgMHgwQywgMHhGMiwgMHhBMywgMHhEQiwgMHhGQSwgMHhBMywgMHgyNiwgMHg0NiwgMHhBMywgMHhEMywgMHgyNCwgMHhGMCwKKwkgMHgwMCwgMHg2MSwgMHhEMCwgMHg4NCwgMHhGMSwgMHg4MSwgMHhENCwgMHg4NCwgMHhGMSwgMHg4MSwgMHhCRCwgMHhEQiwgMHhBMywgMHhEMywgMHgwMywgMHhCMSwKKwkgMHgwMywgMHhBOSwgMHgyNSwgMHhGMCwgMHg0MiwgMHhGRSwgMHgwNSwgMHgwMywgMHhGRCwgMHhBMSwgMHhDQywgMHg4NCwgMHgwMSwgMHgwMiwgMHhDQywgMHg4NCwKKwkgMHgwMCwgMHg2MSwgMHhGMSwgMHg4MSwgMHhEMCwgMHg4NCwgMHhGMSwgMHg4MSwgMHhCRCwgMHhEQiwgMHhBMywgMHhEMywgMHgwMywgMHhCMSwgMHgwMywgMHhBOSwKKwkgMHgyOCwgMHhGMCwgMHg0MiwgMHhGRSwgMHgwMSwgMHgwMywgMHhDQywgMHg4NCwgMHhGMSwgMHg4MSwgMHhEMCwgMHg4NCwgMHhGMSwgMHg4MSwgMHhCRCwgMHhEQiwKKwkgMHhBMywgMHhEMywgMHgwMywgMHhCMSwgMHgwMywgMHhBOSwgMHgyOSwgMHhGMCwgMHgwMSwgMHgwMywgMHhDQywgMHg4NCwgMHhEMCwgMHg4NCwgMHhBMywgMHhEQiwKKwkgMHgxMCwgMHg2MCwgMHgwQSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhBOCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhGNSwgMHhGRSwgMHgxMCwgMHg2MCwgMHgwMiwgMHhGMSwgMHgwNiwgMHhBMiwgMHhBMiwgMHhEMywgMHg2NCwgMHg0NSwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQiwKKwkgMHgwMywgMHgwMCwgMHhGRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHg5NCwgMHg4NSwgMHgwMCwgMHg2MCwgMHg5NiwgMHg2NCwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwQSwgMHgwNiwgMHgxMCwgMHg2MCwgMHgwQSwgMHhGMywgMHg2OSwgMHhGMywgMHgwMCwgMHhBOCwgMHgwNCwgMHhCMCwgMHgwNCwgMHgwMiwgMHgwMywgMHgwMywKKwkgMHgyNywgMHg2MCwgMHgzMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwOSwgMHhGMiwgMHg1QSwgMHhEMiwgMHg0MCwgMHg0OCwKKwkgMHg0MCwgMHg0QSwgMHg1QSwgMHhEMiwgMHg1QSwgMHhEMiwgMHg0MCwgMHg0QywgMHg2MCwgMHg0MSwgMHg1QSwgMHhEMCwgMHg3RSwgMHhGOSwgMHg0MCwgMHg2MywKKwkgMHhBRCwgMHg4MCwgMHhGMCwgMHhBMywgMHgwOSwgMHgwMiwgMHgzQywgMHgwMywgMHgyQywgMHg0MSwgMHgyQSwgMHg0NCwgMHg0MCwgMHg0QywgMHgyOCwgMHg0NCwKKwkgMHg0MCwgMHg0QSwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0OCwgMHhGNCwgMHgwMSwgMHhEMSwgMHg4MCwgMHgwMSwgMHgwMiwgMHgzMSwgMHgwNCwgMHgxMCwgMHhBMywKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NSwgMHhBNSwgMHg4MCwgMHhDRiwgMHg4MywgMHgwOCwgMHgwMiwgMHgyOCwgMHg0NCwgMHg2MCwgMHg4OCwgMHgyQSwgMHg0NCwKKwkgMHg3MCwgMHg4QSwgMHgyQywgMHg0NCwgMHg3MCwgMHg4QywgMHhGMSwgMHg4MSwgMHhGNSwgMHgwMSwgMHhFNywgMHhBMywgMHg2NCwgMHg0NCwgMHgwMCwgMHhBOCwKKwkgMHgwMCwgMHg2MiwgMHgwMiwgMHgwMiwgMHgwMCwgMHg2MSwgMHgxQywgMHgwMCwgMHhFMCwgMHg4NCwgMHhERSwgMHg4MiwgMHhGRCwgMHgwNCwgMHg0MiwgMHhGRSwKKwkgMHhGOCwgMHg4NCwgMHg2MiwgMHg0NSwgMHhDNywgMHg4MywgMHg2MCwgMHg0NSwgMHgwMiwgMHhGRSwgMHhENSwgMHg4NCwgMHgwMiwgMHgwNSwgMHgwMSwgMHgwNSwKKwkgMHg2MSwgMHg0NCwgMHhDRiwgMHg4MywgMHg2MCwgMHg0MSwgMHgwOCwgMHgwMywgMHgyOCwgMHg0NCwgMHg2MCwgMHg4OCwgMHgyQSwgMHg0NCwgMHg3MCwgMHg4QSwKKwkgMHgyQywgMHg0NCwgMHg3MCwgMHg4QywgMHhGMSwgMHg4MSwgMHhGMSwgMHgwMSwgMHhDRSwgMHg4MiwgMHhFOSwgMHg4MSwgMHhGRCwgMHgwMiwgMHhGMSwgMHg4MSwKKwkgMHgwOSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHg1QSwgMHhEMiwgMHgzRiwgMHhCNSwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhCNCwgMHg4NCwgMHg2MSwgMHg0NSwgMHhENCwgMHg4NCwKKwkgMHhDMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg5MywgMHgxMCwgMHg2MCwgMHgwQSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgxOCwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2NSwgMHgzMiwgMHg0MCwgMHg4MCwgMHgyNiwgMHgxNiwgMHg2NSwgMHg3MywgMHg0NCwKKwkgMHhENCwgMHg5MywgMHg2OSwgMHhGMywgMHgyNiwgMHg0NiwgMHgwNCwgMHhCQywgMHhBMiwgMHhEQiwgMHgyNiwgMHhGMCwgMHhGRiwgMHg2NywgMHgyMCwgMHg4OCwKKwkgMHg2NCwgMHg1RiwgMHg0MCwgMHg0QSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg4MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHg0OCwgMHgyNCwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg5MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHhBQywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2QiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhDOCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNSwgMHgwMCwgMHg2NCwgMHg2QiwgMHhGQiwgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwKKwkgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQywgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwKKwkgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHhGRiwgMHg2MCwKKwkgMHhERiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgxRSwgMHhGMSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwKKwkgMHhEQSwgMHg2MywgMHhBMywgMHhERiwgMHgwNiwgMHhBMywgMHgxMCwgMHg2MCwgMHhBNCwgMHg2NCwgMHhCRCwgMHhEQiwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwKKwkgMHhBMywgMHhEQiwgMHgyNywgMHg2MCwgMHg2OCwgMHg2NCwgMHgwOCwgMHg2MCwgMHg1MSwgMHhGQiwgMHgxMCwgMHg2MCwgMHgwRiwgMHhGMSwgMHgwRSwgMHg2MCwKKwkgMHg2RiwgMHhGOSwgMHgyNywgMHg2MCwgMHhDRiwgMHg2NCwgMHgwOCwgMHg2MCwgMHgzOCwgMHhGQiwgMHgxMSwgMHg2MCwgMHg0NCwgMHg2MywgMHgwOCwgMHg2MCwKKwkgMHg2NiwgMHhGRCwgMHgxMiwgMHg2MCwgMHg0MCwgMHg2MywgMHgwOCwgMHg2MCwgMHg2NywgMHhGRCwgMHhDRiwgMHhGMywgMHgwMiwgMHg2MywgMHgwMSwgMHgxQiwKKwkgMHhDRiwgMHhGRCwgMHhDRiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGNywgMHhBMCwgMHgwMSwgMHg2NCwgMHgwMSwgMHgwNiwgMHhDRiwgMHhGQiwgMHhDRiwgMHhGMywKKwkgMHhDRiwgMHhGQiwgMHhDRiwgMHhGMywgMHgxMiwgMHg2MCwgMHg3OCwgMHg2MywgMHgyNiwgMHgxOCwgMHhDQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywKKwkgMHgyQSwgMHhBMywgMHhGQiwgMHgwMSwgMHg2MywgMHg0NiwgMHgxMCwgMHg2MCwgMHhGMiwgMHg2MywgMHgwRSwgMHg2MSwgMHg2MCwgMHhGRSwgMHhBNiwgMHhEMSwKKwkgMHhERSwgMHg4NiwgMHgwMSwgMHg2NCwgMHg2NCwgMHg0MCwgMHg3RiwgMHgzNiwgMHgwMCwgMHg2NCwgMHhBMywgMHhEQiwgMHhEQiwgMHg4MywgMHhBMywgMHhEOSwKKwkgMHhDRCwgMHg4MSwgMHgwNCwgMHhBMywgMHhGNCwgMHgwMiwgMHgxMSwgMHg2MCwgMHg2MiwgMHg2MywgMHgxQywgMHg2MSwgMHhBNiwgMHhEMSwgMHhERSwgMHg4NiwKKwkgMHgwMSwgMHg2NCwgMHg2NCwgMHg0MCwgMHg3RiwgMHgzNiwgMHgwMCwgMHg2NCwgMHhBMywgMHhEQiwgMHhEQiwgMHg4MywgMHhBMywgMHhEOSwgMHhDRCwgMHg4MSwKKwkgMHgwNiwgMHhBMywgMHhGNCwgMHgwMiwgMHgyMCwgMHhGRSwgMHgwMCwgMHg2MCwgMHg2MCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxRiwgMHhGQiwgMHgyNywgMHg2MCwKKwkgMHhFMSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMSwgMHg2MCwgMHg0NCwgMHg2MywgMHgwOCwgMHg2MCwKKwkgMHg2NiwgMHhGRCwgMHgxMiwgMHg2MCwgMHg0MCwgMHg2MywgMHgwOCwgMHg2MCwgMHg2NywgMHhGRCwgMHgwMCwgMHg2MCwgMHg2MCwgMHg2NCwgMHgwOCwgMHg2MCwKKwkgMHgxRiwgMHhGQiwgMHgyNywgMHg2MCwgMHhFMSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwRiwgMHhCNCwgMHg5OCwgMHgwMCwgMHhGRiwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgxQywgMHhGQiwgMHgyNywgMHgwMCwgMHgwQywgMHg2NCwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwgMHgyMywgMHgwMCwgMHgyOSwgMHhGMSwKKwkgMHgxMywgMHg2MCwgMHgxQywgMHhGQiwgMHg1QSwgMHhEOSwgMHgyNywgMHg2MCwgMHhGRCwgMHg2NCwgMHg5RiwgMHhGQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwKKwkgMHgyQSwgMHg2MCwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOSwgMHg2MCwgMHgxQywgMHg2MywgMHgwOSwgMHg2MSwgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHgyMywgMHg3OCwgMHhGRiwgMHhGRiwgMHg3NSwgMHgwMCwgMHg5NSwgMHhGMywgMHhGRiwgMHhGRiwgMHg3RiwgMHhCNCwgMHg5NSwgMHhGQiwgMHgwNiwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgxQywgMHhGQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgxQywgMHhGQiwgMHgyOCwgMHg2MCwgMHg3QSwgMHg2NCwgMHg5RiwgMHhGQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgyQSwgMHg2MCwKKwkgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOSwgMHhGMywgMHgxMiwgMHg2MCwgMHg0NSwgMHg2NSwgMHg2MCwgMHg1QywgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwKKwkgMHgxMywgMHgwMCwgMHgwMCwgMHgzNywgMHgxMSwgMHgwMCwgMHgwMSwgMHgzQiwgMHg1MywgMHgwMCwgMHgxMSwgMHg2MCwgMHg2NSwgMHg2MywgMHhGRiwgMHhCNywKKwkgMHg2MCwgMHg1QywgMHhBMywgMHhEMywgMHgwOCwgMHhBMywgMHgwMCwgMHg3RSwgMHhEMCwgMHg4MCwgMHhENywgMHg4MCwgMHgwMiwgMHgwMywgMHhGOSwgMHgwMiwKKwkgMHg0NywgMHgwMCwgMHhGNCwgMHhBMywgMHhBMywgMHhEMywgMHgwNSwgMHgwMCwgMHgwMCwgMHhCQywgMHhGMiwgMHhBNCwgMHg0MSwgMHgwMywgMHg0MCwgMHgwNywKKwkgMHg2NCwgMHg0NCwgMHg3RCwgMHhGQiwgMHhBMSwgMHhGQiwgMHgwNywgMHg2NCwgMHhBMiwgMHhGQiwgMHgyOCwgMHg2MCwgMHg3QSwgMHg2NCwgMHg5RiwgMHhGQiwKKwkgMHhGRiwgMHhGRiwgMHhERiwgMHhGRSwgMHgwMCwgMHg2NCwgMHgxOSwgMHhGRiwgMHgyQSwgMHg2MCwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4OCwgMHhGRiwKKwkgMHhCQSwgMHg2MCwgMHg5OCwgMHg3MSwgMHg4RCwgMHhFMiwgMHgwMSwgMHgxMSwgMHgwOSwgMHgwMCwgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywgMHhGQiwgMHgwMSwKKwkgMHg4OCwgMHhFMiwgMHhCQSwgMHg2MCwgMHhEMCwgMHg2NCwgMHgwMywgMHhGQiwgMHg4RCwgMHhGRiwgMHgxNSwgMHgwMCwgMHg4RCwgMHhGRiwgMHgyOCwgMHg2MCwKKwkgMHhGQiwgMHg2MywgMHgwNiwgMHg2MCwgMHgwQiwgMHhGRCwgMHhGRiwgMHhGRiwgMHg2MiwgMHhGRiwgMHgyOCwgMHg2MCwgMHg2NywgMHg2MywgMHg5RiwgMHhGRCwKKwkgMHhGRiwgMHhGRiwgMHgxQSwgMHhGRiwgMHgyQSwgMHg2MCwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHg2MCwgMHhGNCwgMHg2MywgMHgwNiwgMHg2MCwKKwkgMHgwQiwgMHhGRCwgMHhGRiwgMHhGRiwgMHg2MiwgMHhGRiwgMHgyOSwgMHhGNSwgMHgyNiwgMHg2MCwgMHgyMCwgMHg2MywgMHgyNSwgMHg2MCwgMHhGMiwgMHg2NCwKKwkgMHhCRCwgMHhEQiwgMHg2NiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgwMiwgMHg2NCwgMHhBMywgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGOSwgMHhGRSwKKwkgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg2OCwgMHgwMSwgMHgwMCwgMHgzNiwgMHg2OSwgMHgwMSwgMHgwMSwgMHgzNiwgMHg2QiwgMHgwMSwKKwkgMHgwMiwgMHgzNiwgMHg4MSwgMHgwMSwgMHgwMywgMHgzNiwgMHg4QiwgMHgwMSwgMHgwNCwgMHgzNiwgMHhDMSwgMHgwMSwgMHgwNSwgMHgzNiwgMHhCRiwgMHgwMSwKKwkgMHgwNiwgMHgzNiwgMHhGMSwgMHgwMSwgMHgwNywgMHgzNiwgMHhCQiwgMHgwMSwgMHgwOCwgMHgzNiwgMHg4QywgMHgwMSwgMHgwOSwgMHgzNiwgMHgwQywgMHgwMCwKKwkgMHgwQSwgMHgzNiwgMHgwRCwgMHgwMCwgMHgwQiwgMHgzNiwgMHgwRSwgMHgwMCwgMHgwQywgMHgzNiwgMHgxNywgMHgwMCwgMHgwRCwgMHgzNiwgMHgwRCwgMHgwMCwKKwkgMHgwRSwgMHgzNiwgMHgxRCwgMHgwMCwgMHgwRiwgMHgzNiwgMHg0MSwgMHgwMCwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHgwMCwgMHgwNCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgwNSwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHgwMiwgMHgwMCwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgzMiwgMHg0NSwKKwkgMHhCNCwgMHg4NSwgMHg0NSwgMHg1MiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyOSwgMHg2MCwgMHhERSwgMHg2MywgMHgwNiwgMHg2MCwKKwkgMHgwQiwgMHhGRCwgMHg2MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQSwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MCwKKwkgMHgwMiwgMHgyQiwgMHgxNSwgMHgwMCwgMHg4OCwgMHhGRiwgMHhCQSwgMHg2MCwgMHg5OCwgMHg3MSwgMHg4RCwgMHhFMiwgMHgwMSwgMHgxMSwgMHgwOSwgMHgwMCwKKwkgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywgMHhGQiwgMHgwMSwgMHg4OCwgMHhFMiwgMHhCQSwgMHg2MCwgMHhEMCwgMHg2NCwgMHgwMywgMHhGQiwgMHg4RCwgMHhGRiwKKwkgMHgxMSwgMHgwMCwgMHg4RCwgMHhGRiwgMHg5MCwgMHg2MCwgMHgwMCwgMHhFOCwgMHgyOCwgMHg2MCwgMHhGQiwgMHg2MywgMHgwNCwgMHgwMCwgMHg5MSwgMHg2MCwKKwkgMHgwMCwgMHhFOCwgMHgyOSwgMHg2MCwgMHhDNCwgMHg2MywgMHgyQSwgMHhFOCwgMHgwNiwgMHg2MCwgMHgwQiwgMHhGRCwgMHhGRiwgMHhGRiwgMHg2MiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHgxQSwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhFRiwgMHhCNCwKKwkgMHhGMSwgMHhGQiwgMHhBRCwgMHg0RiwgMHhGRCwgMHhCNCwgMHhBMCwgMHg1RCwgMHhEMCwgMHg2MCwgMHgwMCwgMHhFOCwgMHgyQSwgMHhFOCwgMHhEOSwgMHg2MCwKKwkgMHhGRSwgMHg2NCwgMHgzMiwgMHg0NSwgMHhBNCwgMHg4NSwgMHg0NSwgMHg1MiwgMHg5OSwgMHhGRiwgMHhBNSwgMHg0RiwgMHhGRiwgMHhCNCwgMHgwNywgMHhGQiwKKwkgMHg5OCwgMHhGRiwgMHhBMywgMHg2MCwgMHhGNCwgMHg2MywgMHgwNiwgMHg2MCwgMHgwQiwgMHhGRCwgMHg2MiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg0MywgMHhGRiwgMHgwMSwgMHg2MCwgMHgwMCwgMHhFMSwgMHgyOCwgMHhGMywKKwkgMHg0NywgMHhGRiwgMHg2MCwgMHg0MCwgMHgwNywgMHgzNywgMHg2NiwgMHgwMCwgMHgwNSwgMHgzQiwgMHgwNCwgMHgwMCwgMHhGRiwgMHgwQSwgMHg4MCwgMHhFMSwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhGMywgMHhGMSwgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwgMHhGQSwgMHhCNCwgMHg2NCwgMHg0MSwKKwkgMHg3RCwgMHhGMSwgMHgwMiwgMHhCMSwgMHgwNCwgMHg2NSwgMHgwMiwgMHgwMiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwMSwgMHg2NSwgMHhCNCwgMHg4NCwKKwkgMHhBMCwgMHg1RCwgMHgyOSwgMHhGNSwgMHgyQSwgMHhGMywgMHg0NywgMHhGRiwgMHgzRiwgMHhGMCwgMHgwMSwgMHgxQiwgMHgwMSwgMHg2NCwgMHg2MCwgMHg1NiwKKwkgMHhBRCwgMHhFMiwgMHhCNSwgMHhGRiwgMHg2QywgMHg0MCwgMHg0MCwgMHhFMSwgMHhBMSwgMHhGRiwgMHgwMCwgMHhGNCwgMHg2RSwgMHg2MSwgMHgxMiwgMHg2MiwKKwkgMHg2NCwgMHg0MywgMHgwMSwgMHhFMSwgMHgwMywgMHg2NCwgMHhFMiwgMHhEMCwgMHhDOSwgMHg4MSwgMHg2NCwgMHg0QywgMHhDQywgMHg4NCwgMHhEQSwgMHg4MiwKKwkgMHhGQSwgMHgwMiwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2QiwgMHg5QSwgMHhGRiwgMHhDQSwgMHg4MiwgMHgwMywgMHgwMCwgMHgwMCwgMHhGNCwgMHg4MSwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg3QSwgMHhEMCwgMHhBMSwgMHhGRiwgMHg2NCwgMHg0QywgMHhGQywgMHgxQywgMHhGOCwgMHgxRCwgMHgwMCwgMHhCOSwgMHgwNiwgMHgxRSwKKwkgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHhEQSwgMHg4MiwgMHg1QSwgMHhEMiwgMHhBMSwgMHhGRiwgMHg2MCwgMHg0RCwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwKKwkgMHgxMCwgMHgwMCwgMHgyOCwgMHhGMywgMHhBNSwgMHg2MCwgMHhDNCwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwRSwgMHgzQiwgMHgwQSwgMHgwMCwgMHhGMSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHhCQywgMHhGMSwgMHhGQiwgMHhBRCwgMHg0RiwgMHgwMiwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RCwgMHg4NSwgMHg0QywKKwkgMHhGRSwgMHgwMSwgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywgMHhGMSwgMHhGQiwgMHhBMSwgMHhGRiwgMHg4NywgMHg0RSwgMHg4NywgMHg0QywKKwkgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg2NywgMHg0QywgMHhGRiwgMHhGRiwgMHhCQywgMHhGRiwgMHgwMCwgMHhFMSwgMHhENSwgMHhGRSwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0NiwgMHg2MCwgMHg0MSwgMHhCNSwgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwKKwkgMHgyOSwgMHhGNSwgMHgzRiwgMHhGMCwgMHgyNCwgMHhGMiwgMHg0NCwgMHg0MywgMHg0MCwgMHg0RCwgMHgwMCwgMHhGNCwgMHhGMywgMHg2MCwgMHhBMCwgMHg2NSwKKwkgMHgxMCwgMHg2MiwgMHg1QSwgMHhEMiwgMHhEOSwgMHg4MSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQiwgMHgwMiwgMHg2MSwgMHg0NSwgMHgyRCwgMHg0NCwKKwkgMHhENCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhGRCwgMHhBNSwgMHg0OCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhDNCwgMHg5RCwKKwkgMHgwRCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgyRCwgMHg0NCwgMHhDMCwgMHg4MywgMHhCQiwgMHhGRiwgMHgyOSwgMHhGNSwgMHgwMSwgMHhFMSwgMHgwMCwgMHhGNCwKKwkgMHg2QywgMHg2MSwgMHgxMCwgMHg2MiwgMHgwNSwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwNCwgMHg2MiwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxMCwgMHgxQSwgMHgwMCwgMHgyNiwgMHg0NCwgMHgwMSwgMHgyNiwgMHgwQywgMHgwMCwgMHgyRCwgMHg0NCwKKwkgMHhDOCwgMHg4NCwgMHg0MCwgMHg0RCwgMHgwMiwgMHgwMywgMHg2QywgMHg0NSwgMHhGMywgMHgwMSwgMHgwMywgMHgxNSwgMHgwMSwgMHg2NCwgMHgwNSwgMHhGQSwKKwkgMHgxNSwgMHgwMCwgMHg2QywgMHg0NSwgMHhFRCwgMHgwMSwgMHgyMywgMHg0NCwgMHhDOCwgMHg4NCwgMHg0MCwgMHg0MywgMHgwMiwgMHgwMywgMHg2QywgMHg0NSwKKwkgMHhFNywgMHgwMSwgMHgwMCwgMHg2NCwgMHgwMSwgMHgxNSwgMHgwMSwgMHg2NCwgMHg2QywgMHg0NSwgMHgwNSwgMHhGQiwgMHhFMiwgMHhEMiwgMHhEQSwgMHg4MiwKKwkgMHhDOSwgMHg4MSwgMHg2MCwgMHg0QywgMHhERCwgMHgxQywgMHhENywgMHgwMywgMHhCQywgMHhGRiwgMHhEQSwgMHgwMSwgMHgwMCwgMHhFMSwgMHhENSwgMHhGRSwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwOCwgMHhFMSwgMHhBMSwgMHhGRiwgMHg2NywgMHg0QywgMHg0MywgMHhGRiwgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgxMCwgMHhCQywgMHhGMSwgMHhGQiwgMHhBRCwgMHg0RiwgMHgwMiwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RCwgMHgwMSwgMHhFMSwgMHgwMSwgMHg2MCwKKwkgMHg2OSwgMHg2QiwgMHhBNSwgMHg2MCwgMHhDNCwgMHg2NCwgMHg2MCwgMHg0QywgMHhCQiwgMHhGRiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0QywKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0QywgMHhGQywgMHgwMSwgMHgyOSwgMHhGMywgMHgyQSwgMHhGMSwgMHgwNywgMHhCNSwgMHgwNCwgMHhFMSwKKwkgMHg2NSwgMHg0MSwgMHg2NCwgMHg1NCwgMHhDRCwgMHhFMiwgMHg5NSwgMHg4MSwgMHhBMSwgMHg1RCwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOSwgMHgwMSwKKwkgMHg2MSwgMHg0NCwgMHhGRSwgMHhGQiwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMSwgMHg3RiwgMHg2NywgMHgwMSwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhCMSwgMHhGRSwgMHgwOCwgMHgwNSwgMHhCMCwgMHhGRSwgMHgwOSwgMHgwNSwgMHhCMiwgMHhGRSwgMHhCMywgMHhGRSwgMHg3OCwgMHg0MywgMHgwMSwgMHg2MSwKKwkgMHgyOSwgMHg2MCwgMHhFQSwgMHg3OCwgMHgzNCwgMHg2MCwgMHg4RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHhGMywgMHgyOSwgMHhGMSwgMHg0MCwgMHg0NCwKKwkgMHg0NCwgMHg0NSwgMHgyQSwgMHhGMSwgMHgyQiwgMHhGMSwgMHg0NCwgMHg0NiwgMHg0NCwgMHg0NywgMHgzRiwgMHhCNCwgMHhFMCwgMHg4NSwgMHgyMCwgMHg2MCwKKwkgMHgyOCwgMHg2NCwgMHg0NCwgMHhENywgMHg1OCwgMHg0MywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHgwRSwgMHg2MCwgMHhERCwgMHhGMywgMHg2MSwgMHg0MywKKwkgMHgwNCwgMHhCNCwgMHgyNCwgMHg0NCwgMHgwMiwgMHgwMywgMHgxMywgMHhGRiwgMHgwNiwgMHgwMCwgMHgzRiwgMHhCNCwgMHhCNCwgMHg4NCwgMHhGRiwgMHgyNywKKwkgMHgwNSwgMHhGRCwgMHgwNCwgMHhGQiwgMHgxMCwgMHg3NSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NiwgMHgzRSwgMHhCNCwgMHhGRSwgMHgwQiwgMHgwNSwKKwkgMHhCNSwgMHhGRSwgMHgwMiwgMHgyNCwgMHg5RiwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCNywgMHhGRSwgMHgwNywgMHgwNSwgMHg3OCwgMHg0MywKKwkgMHgwMSwgMHg2MSwgMHgyOSwgMHg2MCwgMHhFQSwgMHg3OCwgMHgzNCwgMHg2MCwgMHhDOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNiwgMHg0NCwgMHgwMCwgMHg3RiwKKwkgMHhFRSwgMHhBMCwgMHg2MCwgMHg0NSwgMHgwNSwgMHgwNSwgMHgyMCwgMHg2MCwgMHhCQSwgMHg2NCwgMHg0NCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg3OCwgMHg0MywgMHgwMSwgMHg2MSwgMHgyOSwgMHg2MCwgMHhFQSwgMHg3OCwgMHg3OCwgMHg0MywgMHgwMSwgMHg2MSwgMHgyOSwgMHg2MCwgMHhFQSwgMHg3OCwKKwkgMHg3RiwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgxMCwgMHgwMiwgMHgxMCwgMHg2NCwKKwkgMHg0MCwgMHg0MCwgMHgwMiwgMHg2NCwgMHg0MCwgMHg1MCwgMHg2MSwgMHhGRiwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgwNCwgMHgwMCwgMHgxMCwgMHhFMCwKKwkgMHg0NiwgMHg2MCwgMHgwOSwgMHhFMCwgMHgwMCwgMHgwMCwgMHgyNywgMHhGMSwgMHgwMCwgMHg2NiwgMHgyMCwgMHg3OCwgMHg0MiwgMHhGRSwgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHg3RiwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgxQSwgMHgwMiwKKwkgMHgwRSwgMHg2MCwgMHhERCwgMHhGMywgMHgwNywgMHg3QywgMHgyMCwgMHhCNSwgMHgwQywgMHhCNSwgMHgwNCwgMHgwMywgMHgwMywgMHgwMiwgMHhEQiwgMHhGOSwKKwkgMHgwMCwgMHg2NywgMHgxMCwgMHgwMCwgMHgwMCwgMHg2MSwgMHg0MSwgMHg1NiwgMHhDNywgMHhGRSwgMHhBRCwgMHgwMSwgMHgzNiwgMHg0NywgMHhGRiwgMHgyMywKKwkgMHgwNCwgMHgwMCwgMHgwMCwgMHg3RiwgMHg2MCwgMHg0MSwgMHg3RiwgMHg2NywgMHgwNSwgMHgwMCwgMHg2MiwgMHhGRiwgMHgyMCwgMHg0NCwgMHg4MCwgMHhCQywKKwkgMHg0MCwgMHg0MCwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RiwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwKKwkgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgzMSwgMHgwMiwgMHgwRSwgMHg2MCwgMHhERCwgMHhGMywgMHgwMSwgMHg3QywgMHgyMCwgMHhCNSwgMHgwQywgMHhCNSwKKwkgMHgwMywgMHgwMywgMHgwMiwgMHgwMiwgMHhEQiwgMHhGOSwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2MSwgMHg0MSwgMHg1NiwgMHhDNywgMHhGRSwgMHgyQSwgMHg2MCwKKwkgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5RCwgMHhGMSwgMHgyMCwgMHg0NCwgMHg2NCwgMHg0MCwgMHhGRiwgMHgyNiwgMHgxQywgMHgwMCwgMHg3RiwgMHhCNCwKKwkgMHg0MCwgMHg0MCwgMHg1QywgMHg1RSwgMHg4MiwgMHhGRiwgMHgyNiwgMHg0NCwgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NiwgMHg1QywgMHg0MSwgMHg4NywgMHhGRiwKKwkgMHg2MiwgMHhGRiwgMHgxMywgMHg2MCwgMHgwMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwNCwgMHgwMywgMHgwOSwgMHhGMiwKKwkgMHg4RiwgMHhGQywgMHhBQywgMHg4NiwgMHhGQiwgMHgwMSwgMHg5NSwgMHhGMywgMHhGRiwgMHhGRiwgMHg3RiwgMHhCNCwgMHg5NSwgMHhGQiwgMHgwNiwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgxQywgMHhGQiwgMHgyRCwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMCwgMHg0MCwKKwkgMHg4MCwgMHgyQSwgMHgwMiwgMHgwMCwgMHg3RiwgMHg2NywgMHgwNiwgMHg2MSwgMHg2MCwgMHg0NSwgMHgwRSwgMHg2MCwgMHhERCwgMHhGMywgMHg2MSwgMHg0MywKKwkgMHgwNCwgMHhCNCwgMHgyNCwgMHg0NCwgMHgwMiwgMHgwMywgMHgxMywgMHhGRiwgMHg1NiwgMHgwMSwgMHgzRiwgMHhCNCwgMHhCNCwgMHg4NCwgMHhGRiwgMHgyNywKKwkgMHgwNSwgMHhGRCwgMHgwNCwgMHhGQiwgMHgyMCwgMHg0MCwgMHg4MCwgMHgyQSwgMHgwMiwgMHgwMCwgMHgxMCwgMHg3NSwgMHgwNSwgMHgwMCwgMHgwMSwgMHg2NCwKKwkgMHgxOSwgMHg2MCwgMHhGNywgMHhGQiwgMHgwOCwgMHg2MCwgMHgxMCwgMHg3NSwgMHg0NiwgMHgwMSwgMHgyNSwgMHg0NiwgMHgwMSwgMHhGMiwgMHgwOCwgMHhGMCwKKwkgMHg2MCwgMHg0NywgMHgwMywgMHhCNCwgMHgwMywgMHhBQywgMHg3RiwgMHg2NywgMHgwMywgMHg2MSwgMHgwOCwgMHgwMiwgMHgyNiwgMHg2MCwgMHgyMCwgMHg2NCwKKwkgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyNCwgMHg0MCwgMHgwMSwgMHgyQiwgMHg0OSwgMHgwMCwgMHgyNSwgMHg0NCwgMHgxRiwgMHhCNCwgMHhFMCwgMHg4NSwgMHgyQSwgMHg2MCwgMHhGNCwgMHg2NCwKKwkgMHhDNCwgMHg5OCwgMHhGRiwgMHhGRiwgMHhDMCwgMHhGRSwgMHgzRCwgMHgwMCwgMHhDMSwgMHhGRSwgMHgzQiwgMHgwMCwgMHhDMiwgMHhGRSwgMHgzOSwgMHgwMCwKKwkgMHhDMywgMHhGRSwgMHgzNywgMHgwMCwgMHhDNCwgMHhGRSwgMHgzNSwgMHgwMCwgMHhDNSwgMHhGRSwgMHgzMywgMHgwMCwgMHhDNiwgMHhGRSwgMHgzMSwgMHgwMCwKKwkgMHhDNywgMHhGRSwgMHgyRiwgMHgwMCwgMHhDOCwgMHhGRSwgMHgyRCwgMHgwMCwgMHhDOSwgMHhGRSwgMHgyQiwgMHgwMCwgMHhDQSwgMHhGRSwgMHgyOSwgMHgwMCwKKwkgMHhDQiwgMHhGRSwgMHgyNywgMHgwMCwgMHhDQywgMHhGRSwgMHgyNSwgMHgwMCwgMHhDRCwgMHhGRSwgMHgyMywgMHgwMCwgMHhDRSwgMHhGRSwgMHgyMSwgMHgwMCwKKwkgMHhDRiwgMHhGRSwgMHgxRiwgMHgwMCwgMHhEMCwgMHhGRSwgMHgxRCwgMHgwMCwgMHhEMSwgMHhGRSwgMHgxQiwgMHgwMCwgMHhEMiwgMHhGRSwgMHgxOSwgMHgwMCwKKwkgMHhEMywgMHhGRSwgMHgxNywgMHgwMCwgMHhENCwgMHhGRSwgMHgxNSwgMHgwMCwgMHhENSwgMHhGRSwgMHgxMywgMHgwMCwgMHhENiwgMHhGRSwgMHgxMSwgMHgwMCwKKwkgMHhENywgMHhGRSwgMHgwRiwgMHgwMCwgMHhEOCwgMHhGRSwgMHgwRCwgMHgwMCwgMHhEOSwgMHhGRSwgMHgwQiwgMHgwMCwgMHhEQSwgMHhGRSwgMHgwOSwgMHgwMCwKKwkgMHhEQiwgMHhGRSwgMHgwNywgMHgwMCwgMHhEQywgMHhGRSwgMHgwNSwgMHgwMCwgMHhERCwgMHhGRSwgMHgwMywgMHgwMCwgMHhERSwgMHhGRSwgMHgwMSwgMHgwMCwKKwkgMHhERiwgMHhGRSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg5RiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHg5RSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5RCwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5QywgMHhGRSwgMHhGMCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHg5QiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5QSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5OSwgMHhGRSwKKwkgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5OCwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5NywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHg5NiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5NSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5NCwgMHhGRSwgMHhGMCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHg5MywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5MiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5MSwgMHhGRSwKKwkgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5MCwgMHhGRSwgMHhGMCwgMHg4NCwgMHgwNiwgMHhGQiwgMHg4RiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHg4RSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4RCwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4QywgMHhGRSwgMHhGMCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHg4QiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4QSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4OSwgMHhGRSwKKwkgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4OCwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4NywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHg4NiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4NSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4NCwgMHhGRSwgMHhGMCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHg4MywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4MSwgMHhGRSwKKwkgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4MCwgMHhGRSwgMHhGMCwgMHg4NCwgMHgwNSwgMHhGQiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHg1QywgMHg1QywgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg0MCwgMHgwMSwgMHgyNywgMHg1NSwgMHgwMCwgMHgwNSwgMHg2MCwKKwkgMHgwMCwgMHg2MywgMHgwNSwgMHhGRCwgMHgzMCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzMSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzMiwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzMywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNiwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzNywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzOCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzOSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzQSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzQiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzQywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzRCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzRSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzRiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgwMiwgMHg2MSwgMHg2MSwgMHg0NCwgMHgwMiwgMHgzNiwgMHg4MiwgMHhGRiwgMHgwMywgMHgzNiwgMHg4MywgMHhGRiwKKwkgMHgwNCwgMHgzNiwgMHg4NCwgMHhGRiwgMHgwNSwgMHgzNiwgMHg4NSwgMHhGRiwgMHgwNiwgMHgzNiwgMHg4NiwgMHhGRiwgMHgwNywgMHgzNiwgMHg4NywgMHhGRiwKKwkgMHgyMCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMywgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyNCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNywgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyOCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQiwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyQywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRiwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHhERCwgMHg4MSwgMHgwOCwgMHgzQSwgMHhEMCwgMHgwMSwgMHg1NCwgMHgwMCwgMHgyNywgMHg0MCwgMHgxMCwgMHgyNiwgMHgzMCwgMHgwMCwgMHgyNiwgMHg0NCwKKwkgMHgwMSwgMHgzNiwgMHgyRCwgMHgwMCwgMHgwMiwgMHgzNiwgMHg4MiwgMHhGRiwgMHgwMywgMHgzNiwgMHg4MywgMHhGRiwgMHgwNCwgMHgzNiwgMHg4NCwgMHhGRiwKKwkgMHgwNSwgMHgzNiwgMHg4NSwgMHhGRiwgMHgwNiwgMHgzNiwgMHg4NiwgMHhGRiwgMHgyNSwgMHg0NCwgMHgwMCwgMHgzNiwgMHg0NCwgMHg0MCwgMHgwMSwgMHgzNiwKKwkgMHg0NCwgMHg0MSwgMHgwMiwgMHgzNiwgMHg0NCwgMHg0MiwgMHgwMywgMHgzNiwgMHg0NCwgMHg0MywgMHgwNCwgMHgzNiwgMHg0NCwgMHg0NCwgMHgwNSwgMHgzNiwKKwkgMHg0NCwgMHg0NSwgMHgwNiwgMHgzNiwgMHg0NCwgMHg0NiwgMHgwNywgMHgzNiwgMHg0NCwgMHg0NywgMHgwOCwgMHgzNiwgMHg0NCwgMHg0OCwgMHgwOSwgMHgzNiwKKwkgMHg0NCwgMHg0OSwgMHgwQSwgMHgzNiwgMHg0NCwgMHg0QSwgMHgwQiwgMHgzNiwgMHg0NCwgMHg0QiwgMHgwQywgMHgzNiwgMHg0NCwgMHg0QywgMHgwRCwgMHgzNiwKKwkgMHg0NCwgMHg0RCwgMHgwRSwgMHgzNiwgMHg0NCwgMHg0RSwgMHgwRiwgMHgzNiwgMHg0NCwgMHg0RiwgMHg4NywgMHhGRiwgMHgyMSwgMHgwMCwgMHgyNSwgMHg0NCwKKwkgMHgxMCwgMHgzNiwgMHg0NCwgMHg1MCwgMHgxMSwgMHgzNiwgMHg0NCwgMHg1MSwgMHgxMiwgMHgzNiwgMHg0NCwgMHg1MiwgMHgxMywgMHgzNiwgMHg0NCwgMHg1MywKKwkgMHgxNCwgMHgzNiwgMHg0NCwgMHg1NCwgMHgxNSwgMHgzNiwgMHg0NCwgMHg1NSwgMHgxNiwgMHgzNiwgMHg0NCwgMHg1NiwgMHgxNywgMHgzNiwgMHg0NCwgMHg1NywKKwkgMHgxOCwgMHgzNiwgMHg0NCwgMHg1OCwgMHgxOSwgMHgzNiwgMHg0NCwgMHg1OSwgMHgxQSwgMHgzNiwgMHg0NCwgMHg1QSwgMHgxQiwgMHgzNiwgMHg0NCwgMHg1QiwKKwkgMHgxQywgMHgzNiwgMHg0NCwgMHg1QywgMHgxRCwgMHgzNiwgMHg0NCwgMHg1RCwgMHgxRSwgMHgzNiwgMHg0NCwgMHg1RSwgMHgxRiwgMHgzNiwgMHg0NCwgMHg1RiwKKwkgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NiwgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhDRSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMywgMHg2MSwgMHg3RiwgMHg2NywgMHgwQSwgMHgwMiwgMHgwMCwgMHhGMCwgMHgwNCwgMHg2NCwgMHgxMywgMHg2MCwgMHgxMCwgMHhGQiwgMHg1QSwgMHhEOSwKKwkgMHgwQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg2MCwKKwkgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgxMiwgMHgwMiwgMHgxNCwgMHg2NCwgMHgxMywgMHg2MCwKKwkgMHgxQywgMHhGQiwgMHgwMCwgMHg2MCwgMHg1MCwgMHg2MywgMHg1QSwgMHhERCwgMHgyQywgMHg2MCwgMHg3NSwgMHg2NCwgMHg5RiwgMHhGQiwgMHgyRCwgMHhGRiwKKwkgMHgyQSwgMHg2MCwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMywgMHgwNSwgMHhGQiwgMHgyQiwgMHhGMywgMHgwNiwgMHhGQiwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwKKwkgMHgwRSwgMHgwMiwgMHgxNiwgMHg2NCwgMHgxMywgMHg2MCwgMHgxQywgMHhGQiwgMHgwMCwgMHg2MCwgMHg1MCwgMHg2MywgMHg1QSwgMHhERCwgMHgyQywgMHg2MCwKKwkgMHg5MCwgMHg2NCwgMHg5RiwgMHhGQiwgMHgyRCwgMHhGRiwgMHgyQSwgMHg2MCwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHg3RiwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHgwMiwgMHg2MSwgMHgzOCwgMHgwMiwgMHgyNSwgMHg0NSwKKwkgMHgyMCwgMHg0NCwgMHg4MCwgMHgyQSwgMHgzNCwgMHgwMCwgMHhGMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMywKKwkgMHhGMSwgMHg2MCwgMHgwMiwgMHg2NCwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMywgMHgyOCwgMHgwMCwgMHgxOSwgMHg2MCwgMHg0MCwgMHhGMSwKKwkgMHhCNywgMHhGMywgMHgyMCwgMHg2MCwgMHgyMiwgMHg2MSwgMHhBMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHgyNSwgMHg0NSwgMHgyNSwgMHg2MCwgMHg4NiwgMHg2MywKKwkgMHgwMiwgMHg2MSwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHhENCwgMHg4MCwgMHhCRCwgMHhEMywgMHhCRCwgMHhENSwgMHhDRCwgMHg4MSwgMHgwMiwgMHgwMywKKwkgMHgxNSwgMHgwMywgMHhGNywgMHgwMSwgMHhBMiwgMHhGRiwgMHhBNiwgMHhEMywgMHg0MCwgMHg0QywgMHgwMCwgMHhBOCwgMHg2NywgMHg0MywgMHgwQywgMHgwMiwKKwkgMHhBMiwgMHhERCwgMHg0MiwgMHg0OCwgMHg2NCwgMHg0MSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwKKwkgMHgyOCwgMHhEQiwgMHgwMiwgMHgwMywgMHgyQywgMHg1OCwgMHhBMywgMHhGRiwgMHgwQywgMHg2MSwgMHgwMywgMHgwMCwgMHgwNCwgMHg2MSwgMHg3RiwgMHg2NywKKwkgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NCwgMHgxMCwgMHg2MCwgMHgxMywgMHhGQiwgMHhGRiwgMHhGRiwKKwkgMHhDNCwgMHhGRSwgMHhGNywgMHgwMSwgMHhDNiwgMHhGRSwgMHhGNSwgMHgwMSwgMHg3RSwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwKKwkgMHgwMiwgMHg2MSwgMHgzRiwgMHgwMiwgMHgyNSwgMHg0NSwgMHhGOCwgMHgyQiwgMHgzQiwgMHgwMCwgMHgyRSwgMHhGNSwgMHg2NywgMHg0NCwgMHhENCwgMHg4MCwKKwkgMHgyMCwgMHg2MCwgMHhDQywgMHg2MywgMHgzOSwgMHgwMywgMHg3OSwgMHg2MSwgMHgyNCwgMHg0NCwgMHgwMSwgMHgyNywgMHgyOSwgMHgwMCwgMHhBMywgMHhGQywKKwkgMHhBNCwgMHhGOCwgMHhCRCwgMHhEMywgMHhBMywgMHhEMSwgMHhENCwgMHg4MCwgMHhDRCwgMHg4MSwgMHgwOCwgMHgyNCwgMHg2NCwgMHg1OCwgMHgwOCwgMHhBMywKKwkgMHhGOCwgMHgwMiwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2MywgMHhCRCwgMHhEMywgMHhBMywgMHhEMSwgMHhGRSwgMHhBMCwgMHhGQSwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhEMCwgMHg4MCwgMHgxNCwgMHgwMiwgMHgxMywgMHgwMiwgMHgwNCwgMHhBMywgMHhCRSwgMHhEMywgMHhCRCwgMHhEMSwgMHgwRiwgMHgxOCwgMHhENCwgMHg4MCwKKwkgMHgwRCwgMHgxOCwgMHgwMywgMHgwMywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhGNywgMHgwMSwgMHg2NCwgMHg0MSwgMHhERCwgMHg4MSwgMHhFMSwgMHg4MSwKKwkgMHhDQiwgMHg4MywgMHg0NiwgMHg2NSwgMHgzNiwgMHg2MCwgMHg1OCwgMHg0RiwgMHgyMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgwQSwgMHgwMCwKKwkgMHhCRCwgMHhEMywgMHhCRSwgMHhEMSwgMHhENCwgMHg4MCwgMHhDRCwgMHg4MSwgMHgwOCwgMHgyNCwgMHg2NCwgMHg1OCwgMHgwOCwgMHhBMywgMHhGOCwgMHgwMiwKKwkgMHgwNCwgMHg2MSwgMHg3RiwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2NCwgMHgyMywgMHhGQSwgMHg2NywgMHg0NCwgMHgyNCwgMHhGQSwKKwkgMHg2MiwgMHg0MSwgMHgzQywgMHg2MCwgMHgwMCwgMHg2NSwgMHgxQSwgMHg2MywgMHg4MCwgMHg2MCwgMHg5RSwgMHg2NCwgMHg2NSwgMHg0NiwgMHg1OCwgMHhEMCwKKwkgMHgyRSwgMHhGNSwgMHg1OSwgMHhEOCwgMHhGQiwgMHgxRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhDQiwgMHg4MywgMHhCRiwgMHhEMSwKKwkgMHg0QSwgMHg2NSwgMHg2NCwgMHg0MywgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwMSwgMHgyNiwgMHhEQywgMHg4MSwgMHhFOSwgMHg4NCwKKwkgMHhEQywgMHg4NCwgMHgyMywgMHhGQSwgMHgwOSwgMHgwMCwgMHg0QiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHhFOCwgMHg4NCwgMHhEQywgMHg4NCwKKwkgMHgyMywgMHhGQSwgMHhCRiwgMHhEMSwgMHg0QSwgMHg2NSwgMHg2NCwgMHg0MywgMHgzNiwgMHg2MCwgMHg1OCwgMHg0RiwgMHgyMiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhFMCwgMHhBMCwgMHgyMCwgMHg2NCwgMHgwMSwgMHgwNiwKKwkgMHgyNSwgMHhGQSwgMHgyMywgMHhGMiwgMHhERiwgMHhEMSwgMHhDQywgMHg4NCwgMHhFMCwgMHg4NSwgMHgwQiwgMHgwNiwgMHhCRiwgMHhEMSwgMHg2NCwgMHg0MSwKKwkgMHhENSwgMHg4MCwgMHg2NCwgMHg0MywgMHgwMSwgMHgwNiwgMHg2NSwgMHg0MSwgMHg0QSwgMHg2NSwgMHgyRSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg3QSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhEQiwgMHhGMywgMHgwMiwgMHg2MywgMHgyMywgMHhGQywgMHgwNywgMHhCNCwKKwkgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg0QiwgMHhEMywgMHhCRiwgMHhEMywgMHg2MCwgMHg0MSwgMHhDOSwgMHg4MywKKwkgMHhFOSwgMHg4MSwgMHhERCwgMHg4MSwgMHhBMywgMHhGQSwgMHhFMCwgMHg4MSwgMHgzQywgMHg2MCwgMHgwMCwgMHg2NywgMHgwMiwgMHgyNCwgMHgwMiwgMHhBNCwKKwkgMHg2MCwgMHg0NywgMHg0MCwgMHg0QiwgMHhDOSwgMHg4MSwgMHg0QSwgMHg2NSwgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHhBNSwgMHhEOCwKKwkgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhGNiwgMHgxRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhGQywgMHhBMywgMHhBMywgMHhEMSwgMHg0QywgMHg2NSwgMHhBNCwgMHhEMywgMHhEQSwgMHg4MywgMHg2MCwgMHg0NywgMHgyNSwgMHhGQSwKKwkgMHgwMCwgMHg3RSwgMHg2MCwgMHg0NywgMHgwMSwgMHgyNiwgMHhEQywgMHg4NCwgMHg2MCwgMHg0MSwgMHhFOCwgMHg4NCwgMHhEOCwgMHg4NCwgMHgyMywgMHhGQSwKKwkgMHhBQiwgMHgwMSwgMHhGQywgMHhBMywgMHhBMywgMHhEMSwgMHg0QywgMHg2NSwgMHhBNCwgMHhEMywgMHhEQSwgMHg4MywgMHgwMCwgMHg3RiwgMHgyNSwgMHhGQSwKKwkgMHg2MCwgMHg0MSwgMHgwMSwgMHgyNiwgMHhERCwgMHg4MSwgMHhFOSwgMHg4NCwgMHhEOCwgMHg4NCwgMHgyMywgMHhGQSwgMHg5RCwgMHgwMSwgMHgyRSwgMHg2MCwKKwkgMHg0MCwgMHg2MywgMHhCRiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHhFOCwgMHg4NCwgMHhEQywgMHg4NCwgMHgyMywgMHhGQSwgMHg0QSwgMHg2NSwKKwkgMHgzNiwgMHg2MCwgMHg1OCwgMHg0RiwgMHgyMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRSwgMHg2MCwKKwkgMHg0MCwgMHg2MywgMHgyMywgMHhGMiwgMHhDMCwgMHg2NSwgMHhDQywgMHg4NCwgMHhFMCwgMHg4MSwgMHgwQSwgMHgwNCwgMHhCRiwgMHhEQiwgMHhENSwgMHg4MCwKKwkgMHgwNywgMHgwMywgMHgwMSwgMHgwNiwgMHg2NSwgMHg0MSwgMHg2MSwgMHg0NCwgMHhCRiwgMHhEQiwgMHg0QSwgMHg2NSwgMHg1OCwgMHg0RiwgMHhBOCwgMHgwMCwKKwkgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMywgMHg0RSwgMHgyRCwgMHg2MCwgMHg1OCwgMHg0MywgMHg1NSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyRiwgMHg2MCwgMHgyNCwgMHg2MSwgMHgxNywgMHg2MCwgMHg4MSwgMHhGMywgMHhBMSwgMHhEQiwgMHhDQywgMHg4NCwgMHhBOCwgMHg4MywgMHgwNSwgMHgwNCwKKwkgMHgyRiwgMHg2MCwgMHgwMiwgMHg2NCwgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgwRSwgMHg0MywgMHg4MiwgMHgwMSwgMHgyMywgMHhGMiwKKwkgMHgyNSwgMHhGMiwgMHgwMiwgMHhBOCwgMHhGOCwgMHhBMCwgMHgwRiwgMHgwMiwgMHhFQywgMHhBMCwgMHgwRCwgMHgwNCwgMHgwQywgMHgwNywgMHgxOSwgMHg2MCwKKwkgMHg0RiwgMHhGMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwNywgMHgxOSwgMHg2MCwgMHg0RiwgMHhGQiwgMHgxOSwgMHg2MCwKKwkgMHg1MywgMHhGQiwgMHgxNiwgMHg2MCwgMHhEOCwgMHhGQiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwgMHgxRCwgMHg2MCwKKwkgMHhBRSwgMHg2NSwgMHg2MCwgMHg0MSwgMHgxRCwgMHg2MCwgMHg0QSwgMHg2MywgMHhBMywgMHhEQiwgMHhGRiwgMHhBMSwgMHg0OCwgMHg2NCwgMHg1OCwgMHhEMCwKKwkgMHg3RSwgMHhBOCwgMHg1QiwgMHhEOSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2NCwgMHhGRiwgMHhBMSwgMHhENywgMHg4MCwgMHgwMiwgMHgwMywKKwkgMHgwMSwgMHgwMywgMHhGNSwgMHgwMSwgMHgyRSwgMHhGNSwgMHgwMCwgMHg2MCwgMHgyRiwgMHg2NSwgMHgyNSwgMHhGMiwgMHgwMCwgMHg2MywgMHhDQywgMHg4NCwKKwkgMHgwMywgMHhBMywgMHhGRCwgMHgwNSwgMHg0QSwgMHg2NCwgMHhENywgMHg4MCwgMHgxQywgMHg2MCwgMHhFNiwgMHg2MSwgMHgxOCwgMHgwNSwgMHhBMSwgMHhERCwKKwkgMHhFMywgMHg4MywgMHhGRSwgMHhBMywgMHg1OCwgMHhEMCwgMHg3RSwgMHhBOCwgMHg1OSwgMHhEOSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2NCwKKwkgMHhGOSwgMHgxRiwgMHgwMCwgMHg2MywgMHg1OSwgMHhERCwgMHgyRSwgMHhGNSwgMHgyNSwgMHhGMCwgMHgwRSwgMHg2MCwgMHg3MywgMHhGMywgMHhEMywgMHg4MCwKKwkgMHgwMSwgMHhCMCwgMHgwNCwgMHgwMywgMHgwMSwgMHhBNCwgMHgwMywgMHgwMywgMHhBMiwgMHhEQiwgMHgwMSwgMHgwMCwgMHhBMiwgMHhERCwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgxRCwgMHg2MCwgMHg0QSwgMHg2MSwgMHhBMSwgMHhEMywgMHgyMywgMHhGQSwgMHhFMCwgMHg4MywgMHg0QSwgMHg2NSwKKwkgMHgwNCwgMHgwMiwgMHgwMiwgMHg2MywgMHgyMywgMHhGQywgMHhBNSwgMHhGQywgMHgwOSwgMHgwMCwgMHhEQiwgMHg4MywgMHg1OSwgMHhEMSwgMHhBNSwgMHhEOCwKKwkgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhGOCwgMHgxRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwRSwgMHg2MCwgMHg3MywgMHhGMywgMHgwMCwgMHg2MSwgMHgwMiwgMHhBNCwgMHhGRSwgMHhBMCwgMHgyMywgMHhGQSwgMHgxQiwgMHgwMywKKwkgMHhGQSwgMHhBNCwgMHhGRCwgMHhBNCwgMHgwMSwgMHhBMSwgMHhGRCwgMHgwNywgMHg2MSwgMHg0MywgMHgyMywgMHhGMiwgMHgyNSwgMHhGQywgMHhFMCwgMHg4MywKKwkgMHgwMiwgMHhBMywgMHgxQywgMHg2MCwgMHhFNiwgMHg2MSwgMHgwMCwgMHg2MCwgMHg0QSwgMHg2NCwgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOCwgMHg3RSwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2NCwgMHhGOSwgMHgxRiwgMHgyNSwgMHhGMiwgMHgyMywgMHhGMiwgMHgwMSwgMHhCMCwgMHhDQywgMHg4NCwKKwkgMHgwNCwgMHgwMiwgMHgyMywgMHhGQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHg0MSwgMHg0QiwgMHg2NSwgMHg0MiwgMHg4MCwgMHg2NCwgMHhENCwgMHg4NSwgMHgyQiwgMHg0MSwgMHgwMCwgMHhBMSwgMHg1NSwgMHg4QiwgMHgwRCwgMHgwMywKKwkgMHgwMiwgMHgwNCwgMHg2NSwgMHg0MSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0QiwgMHhDQSwgMHg4NCwgMHg1OCwgMHhEMCwgMHhDOSwgMHg4MSwKKwkgMHhCRCwgMHhEOSwgMHhGQywgMHgwMiwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhFQywgMHgwMSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhGQywgMHhBMywKKwkgMHhBMywgMHhEMywgMHgwMiwgMHg3QywgMHhBMCwgMHhEMywgMHgyMywgMHhGOCwgMHhEQywgMHg4NCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHgwMSwgMHg2NCwgMHg5RCwgMHhGRSwgMHgwMiwgMHgyOCwgMHgwMiwgMHg2NCwgMHgyNSwgMHhGQSwKKwkgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg3QywgMHgyMywgMHhGOCwgMHgwMSwgMHg2NCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhGQywgMHhBMywgMHhBMywgMHhEMSwgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHhBNCwgMHhEMywgMHgyNSwgMHhGQSwKKwkgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHg4OCwgMHhGRiwgMHg3NSwgMHg0NCwgMHg4RCwgMHhGRiwKKwkgMHhFOCwgMHg4NywgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgwMywgMHhCNCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHg2NCwgMHgyMywgMHhGQSwgMHg4NiwgMHhGRiwgMHgyOSwgMHg0NCwgMHg4NywgMHhGRiwgMHgyNSwgMHhGQSwgMHg1NSwgMHhGMywgMHg1MiwgMHhGMSwKKwkgMHg4MCwgMHg2NSwgMHhDNCwgMHg4NywgMHgwMCwgMHg3RiwgMHgyNiwgMHhGQSwgMHg2NCwgMHg0NCwgMHhDNCwgMHg4NywgMHgwMCwgMHg3RiwgMHgyNywgMHhGQSwKKwkgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwNSwgMHg2NCwgMHgyMywgMHhGQSwgMHg1MiwgMHg2MywgMHhCNCwgMHhGMywgMHg0QiwgMHhEQSwKKwkgMHhCMywgMHhGMywgMHg0QiwgMHhEQSwgMHhCMiwgMHhGMywgMHg0QiwgMHhEQSwgMHg2MCwgMHg0MSwgMHg4OCwgMHhGRiwgMHg3MiwgMHg1QywgMHg4OSwgMHhGRiwKKwkgMHg0QSwgMHhEOCwgMHhBMiwgMHg0OCwgMHgyMCwgMHgyMywgMHgwRSwgMHgwMCwgMHg2NCwgMHg0MCwgMHg4MCwgMHgyNywgMHgxNSwgMHgwMCwgMHhEQywgMHg4NCwKKwkgMHhCRCwgMHhEQSwgMHhCRCwgMHhEMiwgMHgxMSwgMHgwNCwgMHhEQywgMHg4NCwgMHhBMiwgMHhEQSwgMHhBMywgMHhEMiwgMHgwRCwgMHgwNCwgMHhEQywgMHg4NCwKKwkgMHhBMywgMHhEQSwgMHgwQSwgMHgwMCwgMHg1MiwgMHg2MywgMHhCNCwgMHhGMywgMHg0QiwgMHhEQSwgMHhCMywgMHhGMywgMHg0QiwgMHhEQSwgMHhCMiwgMHhGMywKKwkgMHg0QiwgMHhEQSwgMHg1NCwgMHg5MCwgMHg0QywgMHg2MywgMHhFMCwgMHgwMiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHhGMCwKKwkgMHgyMywgMHhGMiwgMHgxOSwgMHg2MCwgMHg0NiwgMHhGOSwgMHgwMiwgMHhBOCwgMHg2NCwgMHg0NCwgMHgxRiwgMHgwMiwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwKKwkgMHgxNiwgMHgwMCwgMHgwMCwgMHgzNywgMHgxNCwgMHgwMCwgMHgwMSwgMHgzQiwgMHgxOCwgMHgwMCwgMHgxMiwgMHg2MCwgMHg0NSwgMHg2NSwgMHgxMSwgMHg2MCwKKwkgMHg2NSwgMHg2MywgMHhGRiwgMHhCNywgMHg2MCwgMHg1QywgMHhBMywgMHhEMywgMHgwOCwgMHhBMywgMHgwMCwgMHg3RSwgMHhEMCwgMHg4MCwgMHhENywgMHg4MCwKKwkgMHgwMywgMHgwMywgMHhGOSwgMHgwMiwgMHg3RiwgMHg2NywgMHgwQSwgMHgwMCwgMHhGNCwgMHhBMywgMHhBMywgMHhEMSwgMHgwNCwgMHgwMCwgMHgwMCwgMHhCQywKKwkgMHhGMiwgMHhBNCwgMHgwMywgMHgwMywgMHgwMiwgMHgwNywgMHgxNiwgMHg2MCwgMHhDRiwgMHhGOSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyMCwgMHg2MywgMHgyRSwgMHg2MCwgMHgwMCwgMHg2MSwgMHg0OCwgMHg2NCwgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyNSwgMHhGMCwKKwkgMHgyMCwgMHg2NCwgMHhEMCwgMHg4MSwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNywgMHgyNSwgMHhGQSwgMHgwRiwgMHgwMCwgMHgyRSwgMHg2MCwgMHgwNCwgMHg2MywKKwkgMHhDMywgMHg4MywgMHgwMSwgMHgyQSwgMHgwNiwgMHgwMCwgMHhDRiwgMHg4MywgMHhBMywgMHhEMywgMHhDRCwgMHg4MSwgMHgwMCwgMHg3RiwgMHhCRCwgMHhEQiwKKwkgMHgwNCwgMHgwMywgMHgwMCwgMHg2NCwgMHhDOSwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGRCwgMHgwMiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyMywgMHhGMiwgMHgyNSwgMHhGMCwgMHgwMiwgMHhBOCwgMHgwMSwgMHg2MCwgMHhBMCwgMHg2MiwgMHgwOSwgMHgwMiwgMHhBMiwgMHhEOSwgMHg2NCwgMHg0MSwKKwkgMHgzMiwgMHg0NCwgMHgwMiwgMHhCNSwgMHgwMCwgMHhCOSwgMHhENCwgMHg4NCwgMHgwOCwgMHgyOCwgMHgwMiwgMHhCQywgMHg0MCwgMHg1MiwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwgMHgyNSwgMHhGMCwgMHgwMiwgMHhBOCwgMHgwMSwgMHg2MCwgMHhBMiwgMHg2MiwgMHgwOSwgMHgwMiwKKwkgMHhBMiwgMHhEOSwgMHg2NCwgMHg0MSwgMHgzMiwgMHg0NCwgMHgwNCwgMHhCNSwgMHgwMCwgMHhCOSwgMHhENCwgMHg4NCwgMHgwOCwgMHgyOCwgMHgwNCwgMHhCQywKKwkgMHg0MCwgMHg1MiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwgMHgyNSwgMHhGMCwgMHgwMiwgMHhBOCwgMHgwMSwgMHg2MCwKKwkgMHhCMCwgMHg2MiwgMHgxNSwgMHgwMiwgMHhBMiwgMHhEOSwgMHg2NCwgMHg0MSwgMHgzMiwgMHg0NCwgMHg0MCwgMHhCNSwgMHgwMCwgMHhCOSwgMHhENCwgMHg4NCwKKwkgMHgwOCwgMHgyNCwgMHgwQywgMHgwMCwgMHg0MCwgMHhCQywgMHgwMiwgMHhCNSwgMHhENCwgMHg4NCwgMHg0MywgMHhGOSwgMHgzNywgMHg2MCwgMHg3NiwgMHg2MywKKwkgMHhEMywgMHg4MCwgMHgyRiwgMHg2MCwgMHg1MCwgMHg3QywgMHgwMiwgMHgwMywgMHg0MywgMHhGRCwgMHhBNCwgMHhERiwgMHg0MCwgMHg1MiwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgzNywgMHg2MCwgMHg3NiwgMHg2NCwgMHg0MywgMHhGQiwgMHgyRCwgMHg2MCwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyMywgMHhGMiwgMHgyNSwgMHhGMCwgMHgwMSwgMHg2MCwgMHhBQywgMHg2MywgMHg3RiwgMHg2NywgMHgzOSwgMHgxOCwgMHhBMywgMHhEOSwgMHgyNiwgMHhGMCwKKwkgMHg3RiwgMHg2NywgMHgzNSwgMHgxOCwgMHg1QiwgMHhEOSwgMHgxNiwgMHg2MCwgMHg4NywgMHhGMywgMHgyNSwgMHhGMCwgMHg2MCwgMHg0MCwgMHgwMywgMHgzQSwKKwkgMHgyRCwgMHgwMCwgMHhBNiwgMHhGMywgMHgyMCwgMHg2MywgMHhFMywgMHg4MywgMHg2MCwgMHg0NiwgMHgwRiwgMHhGOCwgMHgzMCwgMHg2MSwgMHg5NCwgMHhGQSwKKwkgMHgwMSwgMHg2MSwgMHg5MSwgMHhGQSwgMHgxNiwgMHg2NCwgMHgxMiwgMHhGQSwgMHg2MCwgMHg0MCwgMHgxMCwgMHgzNiwgMHgwNSwgMHgwMCwgMHgxMiwgMHgzNiwKKwkgMHgwOCwgMHgwMCwgMHgwQywgMHgzNiwgMHgwQiwgMHgwMCwgMHgwRiwgMHgwMCwgMHg0MCwgMHg2MSwgMHhBMSwgMHg4MCwgMHgwQSwgMHg2NCwgMHgxMSwgMHgwMiwKKwkgMHhGMywgMHgwMSwgMHgxMCwgMHg2MSwgMHhBMSwgMHg4MCwgMHgwRSwgMHg2NCwgMHgwQywgMHgwMiwgMHhFRSwgMHgwMSwgMHgwOCwgMHg2MSwgMHhBMSwgMHg4MCwKKwkgMHgxMCwgMHg2NCwgMHgwNywgMHgwMiwgMHhFOSwgMHgwMSwgMHhFMSwgMHg4MSwgMHhBMSwgMHg4MCwgMHgwNSwgMHgwNSwgMHhDOCwgMHg4NCwgMHgwMSwgMHgwMiwKKwkgMHhFMywgMHgwMSwgMHgxMiwgMHhGQSwgMHg5MSwgMHhGQSwgMHg2NiwgMHg0NCwgMHgwMiwgMHhBNiwgMHhENywgMHgxRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyNSwgMHhGMiwgMHgxOSwgMHg2MCwgMHg0NSwgMHhGQiwgMHgxOSwgMHg2MCwgMHg0QywgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwKKwkgMHgwOCwgMHgyNiwgMHgxOCwgMHgwMCwgMHgxOSwgMHg2MCwgMHg0NSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwQSwgMHgwMCwKKwkgMHgxOSwgMHg2MCwgMHg3QiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywgMHg2MCwgMHg0NCwgMHhBMiwgMHhEQiwgMHgxOSwgMHg2MCwgMHg0NSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwNiwgMHgwMCwgMHgxOSwgMHg2MCwgMHg3QiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwNCwgMHhCQywKKwkgMHg2MCwgMHg0NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwgMHgyNSwgMHhGMCwgMHgwMiwgMHhBOCwKKwkgMHgwMCwgMHg2NywgMHgwMiwgMHgwMiwgMHgyRCwgMHhGOSwgMHgyQywgMHhGOSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwgMHgyNSwgMHhGMiwKKwkgMHgwMiwgMHhBOCwgMHgwMCwgMHhBOCwgMHgwQSwgMHgwMiwgMHgwNywgMHgwMywgMHhEMCwgMHhBMCwgMHgzMCwgMHg2NSwgMHgwMywgMHgwNCwgMHhBNywgMHhBMCwKKwkgMHg1OSwgMHg2NSwgMHgwMSwgMHgwNiwgMHg2NSwgMHg0NCwgMHgxNiwgMHg2MCwgMHhDRSwgMHhGQiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyNSwgMHhGMiwgMHgxOSwgMHg2MCwgMHg0QywgMHhGQiwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyQSwgMHgyNSwgMHgwMCwgMHgxOSwgMHg2MCwgMHg3QiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhFOSwgMHhCNCwgMHg2MCwgMHg0NCwgMHgxOSwgMHg2MCwgMHg0QywgMHhGMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwKKwkgMHgwMiwgMHhCQywgMHg2NCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwNCwgMHhCQywgMHg2NCwgMHg0MCwgMHgwNCwgMHgyNiwgMHgwOCwgMHgwMCwgMHgxOSwgMHg2MCwKKwkgMHg3QiwgMHhGQiwgMHgxMywgMHg2NCwgMHhDQiwgMHhGQiwgMHgwMSwgMHg2MCwgMHg2NywgMHg2NCwgMHgzNywgMHhGQiwgMHgwQywgMHgwMCwgMHgxMCwgMHhCQywKKwkgMHgxOSwgMHg2MCwgMHg3QiwgMHhGQiwgMHgwOCwgMHg2NCwgMHhDQiwgMHhGQiwgMHhBMSwgMHhGMywgMHgwMSwgMHg2MCwgMHg2NywgMHg3QywgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgyNywgMHg1QiwgMHg3QywgMHgzNywgMHhGOSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHhGMiwgMHgxOSwgMHg2MCwKKwkgMHg0RCwgMHhGQiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHhGMiwgMHgxOSwgMHg2MCwgMHg0RSwgMHhGQiwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHhGMiwgMHgxOSwgMHg2MCwgMHg4OSwgMHhGQiwgMHhGRiwgMHhGRiwgMHgwRiwgMHgyMiwgMHg0MSwgMHg3NSwKKwkgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwgMHgxQiwgMHg2MCwgMHhGRSwgMHhGQiwKKwkgMHg3RSwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgwRSwgMHgwMiwgMHgwNiwgMHg2MSwKKwkgMHg0MSwgMHg1NiwgMHhDNywgMHhGRSwgMHgyQSwgMHg2MCwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNiwgMHg0NywgMHhGRiwgMHgyMywgMHgwNCwgMHgwMCwKKwkgMHgwMCwgMHg3RiwgMHg2MCwgMHg0MSwgMHg3RiwgMHg2NywgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RiwgMHg2MCwKKwkgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgwRSwgMHgwMiwgMHgwOCwgMHg2MSwgMHg0MSwgMHg1NiwKKwkgMHhDNywgMHhGRSwgMHgyQSwgMHg2MCwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNiwgMHg0NywgMHhGRiwgMHgyMywgMHgwNCwgMHgwMCwgMHgwMCwgMHg3RiwKKwkgMHg2MCwgMHg0MSwgMHg3RiwgMHg2NywgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RiwgMHg2MCwgMHhDMCwgMHg2NCwKKwkgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgwRSwgMHgwMiwgMHgwQSwgMHg2MSwgMHg0MSwgMHg1NiwgMHhDNywgMHhGRSwKKwkgMHgyQSwgMHg2MCwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNiwgMHg0NywgMHhGRiwgMHgyMywgMHgwNCwgMHgwMCwgMHgwMCwgMHg3RiwgMHg2MCwgMHg0MSwKKwkgMHg3RiwgMHg2NywgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RSwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwKKwkgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgxMSwgMHgwMiwgMHg2NSwgMHg0MywgMHgxOSwgMHg2MCwgMHhBNSwgMHhGRCwgMHgwQywgMHg2MSwKKwkgMHg0MSwgMHg1NiwgMHhDNywgMHhGRSwgMHgyQSwgMHg2MCwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNiwgMHg0NywgMHhGRiwgMHgyMywgMHgwNCwgMHgwMCwKKwkgMHgwMCwgMHg3RiwgMHg2MCwgMHg0MSwgMHg3RiwgMHg2NywgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg2NCwKKwkgMHgyMywgMHhGQSwgMHg0QSwgMHg2MSwgMHgxMCwgMHg2MCwgMHhEQSwgMHg2NCwgMHhBMCwgMHhEMSwgMHhBMSwgMHhEOCwgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOCwKKwkgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOCwgMHgwMSwgMHhBMSwgMHgxMCwgMHg2MCwgMHhGMiwgMHg2MywgMHg1RCwgMHg2NSwgMHhBMywgMHhEMywgMHgwMiwgMHhBMywKKwkgMHgwMiwgMHgxQiwgMHg3RiwgMHg2NCwgMHgwMSwgMHgwMCwgMHhBMywgMHhEMywgMHg2MCwgMHhGRSwgMHg1RCwgMHhEQSwgMHgyMCwgMHhGRSwgMHhENSwgMHg4MCwKKwkgMHgwNCwgMHhBMywgMHhGNCwgMHgwMiwgMHgwMSwgMHhBMSwgMHgxMCwgMHg2MCwgMHhFMCwgMHg2NCwgMHhBMCwgMHhEMSwgMHhBMSwgMHhEOCwgMHg1OCwgMHhEMSwKKwkgMHg1OSwgMHhEOCwgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOCwgMHgwMSwgMHhBMSwgMHg2MCwgMHhGRSwgMHgwNywgMHg2MywgMHg3RiwgMHg2NCwgMHhDRiwgMHg4MywKKwkgMHg1RCwgMHhEQSwgMHhGRCwgMHgwMiwgMHgyMCwgMHhGRSwgMHgxMiwgMHg2MCwgMHg0MCwgMHg3QywgMHgxMSwgMHg2MCwgMHg2MiwgMHg2MywgMHg3RiwgMHg2NSwKKwkgMHhBMywgMHhEMywgMHgwMiwgMHhBMywgMHgwMiwgMHgxQiwgMHg3RiwgMHg2NCwgMHgwMSwgMHgwMCwgMHhBMywgMHhEMywgMHg2MCwgMHhGRSwgMHg1RCwgMHhEQSwKKwkgMHgyMCwgMHhGRSwgMHhENSwgMHg4MCwgMHgwNiwgMHhBMywgMHgwMywgMHgwMiwgMHg0NiwgMHg0NSwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwgMHhEMywgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHhFRSwgMHgwNCwgMHgyNSwgMHg0NiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2MywgMHg3RCwgMHhGMywKKwkgMHgyMywgMHhGQywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyMywgMHgxNywgMHgwMCwgMHgwMSwgMHg2MCwgMHhGRiwgMHg2NSwgMHhBNCwgMHg4NCwgMHgxMSwgMHg2MCwKKwkgMHg2MCwgMHg2MSwgMHgxMiwgMHg2MCwgMHg0MCwgMHg2NSwgMHhBMSwgMHhEMSwgMHhENSwgMHg4MCwgMHhEMCwgMHg4MCwgMHgwQiwgMHgwMywgMHgwMiwgMHgwMywKKwkgMHgwOCwgMHhBMSwgMHhGOSwgMHgwMSwgMHgwNCwgMHhBMSwgMHhBMSwgMHhEMywgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NSwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwKKwkgMHhCNCwgMHg4NCwgMHgwMSwgMHgwMCwgMHhGRiwgMHg2NCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwQywgMHg2MywKKwkgMHgyMywgMHhGQywgMHhFMiwgMHhGMywgMHgxMywgMHg2MCwgMHhGMiwgMHg2MywgMHhDQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNiwgMHgwQywgMHhBMywKKwkgMHhGQiwgMHgwMSwgMHg0OCwgMHg2MSwgMHg2MSwgMHg0NCwgMHgxOCwgMHhBNSwgMHg2MCwgMHhGRSwgMHhCRCwgMHhEMywgMHgyMCwgMHhGRSwgMHgwMCwgMHg3RiwKKwkgMHg1OSwgMHhEQSwgMHhENSwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGOCwgMHgwNCwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHhGMCwKKwkgMHgxNywgMHg2MCwgMHg4MCwgMHhGOSwgMHgxMSwgMHgwMCwgMHgwQywgMHg2MCwgMHhGRSwgMHg2MiwgMHg0MCwgMHg2MywgMHg1QSwgMHhERiwgMHhGRSwgMHgxRiwKKwkgMHgwNCwgMHg2NSwgMHgwQywgMHg2MCwgMHhGRSwgMHg2MSwgMHg0OCwgMHg2NCwgMHgzRSwgMHg2MywgMHg3QywgMHhBOCwgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwKKwkgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2NCwgMHhGOSwgMHgxRiwgMHgxNywgMHg2MCwgMHg4MCwgMHhGMSwgMHgwQywgMHg2MCwgMHhEQSwgMHg2NSwKKwkgMHgwMiwgMHhGRSwgMHg2NCwgMHg0NCwgMHhGOCwgMHg4NCwgMHhGOCwgMHg4NCwgMHhGOCwgMHg4NywgMHg2MCwgMHg0MSwgMHg2NCwgMHg0NCwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwgMHgzRSwgMHhGQiwgMHg2MCwgMHg0MiwgMHg2MSwgMHg0NCwgMHgwMywgMHhBMiwgMHg2MCwgMHhGRSwgMHhBMiwgMHhEQiwKKwkgMHgyMCwgMHhGRSwgMHg2NCwgMHg0NCwgMHgwRCwgMHg2MCwgMHgwMCwgMHg2NSwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHhDNCwgMHg4NCwgMHg0MCwgMHhGQiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgwMCwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg1QywgMHg0MSwKKwkgMHgyNSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg0MCwgMHg0MiwgMHg4MCwgMHgyQiwgMHgwNCwgMHgwMCwgMHhGRiwgMHhCNCwgMHg0MCwgMHg0MiwgMHgwMSwgMHg2NCwKKwkgMHg0MCwgMHg0MSwgMHhBNiwgMHhGMywgMHg0NiwgMHg0QiwgMHg2MCwgMHg0NiwgMHgyMCwgMHg2MywgMHhFMywgMHg4MywgMHhBQiwgMHg0NiwgMHgyNiwgMHhGMCwKKwkgMHhBQiwgMHg0NiwgMHg1OSwgMHhGOCwgMHhBQiwgMHg0NiwgMHgyNywgMHhGMCwgMHhBQiwgMHg0NiwgMHg1QSwgMHhGOCwgMHhBQiwgMHg0NiwgMHgyOCwgMHhGMCwKKwkgMHhBQiwgMHg0NiwgMHg1QiwgMHhGOCwgMHg2NiwgMHg0NCwgMHgwMiwgMHhBNiwgMHhGMSwgMHgxRiwgMHhBNiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwKKwkgMHhBQiwgMHg0NiwgMHgwQywgMHg2MCwgMHgzOCwgMHg2NSwgMHgyMiwgMHg0NCwgMHhGRiwgMHhCNCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhDNCwgMHg4MSwgMHhDOSwgMHg4MSwgMHg1MiwgMHg2NCwgMHgwRSwgMHg2MywgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwKKwkgMHgyMSwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwOCwgMHgwMCwgMHhBQiwgMHg0NiwgMHhGMCwgMHhBMSwgMHg3NiwgMHg2NCwgMHgwRSwgMHg2MywgMHg1OSwgMHhEMSwKKwkgMHg1OCwgMHhEOCwgMHhGRCwgMHgxRiwgMHhBQiwgMHg0NiwgMHgyMiwgMHg0NCwgMHhGRiwgMHhCNCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHgwQywgMHg2MCwgMHg5QSwgMHg2NSwgMHhDNCwgMHg4MSwgMHg2MCwgMHg0NSwgMHhDOSwgMHg4MSwgMHg2MiwgMHg2NCwgMHgwNiwgMHg2MywgMHg1OCwgMHhEMCwKKwkgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyMSwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwOCwgMHgwMCwgMHhBQiwgMHg0NiwgMHhGOCwgMHhBMSwgMHhCNiwgMHg2NCwKKwkgMHgwNiwgMHg2MywgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOCwgMHhGRCwgMHgxRiwgMHhBQiwgMHg0NiwgMHg2NSwgMHg0NCwgMHgwQywgMHg2MCwgMHhCQSwgMHg2NSwKKwkgMHhDNCwgMHg4MSwgMHhDOSwgMHg4MSwgMHg2QSwgMHg2NCwgMHgwNiwgMHg2MywgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyMiwgMHg0NCwKKwkgMHhGRiwgMHhCNCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NSwgMHhDNCwgMHg4NCwgMHgwQywgMHg2MCwgMHg4MCwgMHg2NSwgMHhDNCwgMHg4MSwgMHg3MiwgMHg2NCwKKwkgMHgwNCwgMHg2MywgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHhBQiwgMHg0NiwgMHgyMSwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwNiwgMHgwMCwKKwkgMHhGQSwgMHhBMSwgMHg5MCwgMHg2NCwgMHgwNCwgMHg2MywgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOCwgMHhGRCwgMHgxRiwgMHgzQiwgMHhGMCwgMHgyMSwgMHg0NCwKKwkgMHgwMSwgMHgyQSwgMHgxMywgMHgwMCwgMHgyMiwgMHg0NCwgMHgzRCwgMHhGQiwgMHg2MCwgMHg0MSwgMHgwMiwgMHhGRSwgMHhGOCwgMHg4NCwgMHhGOCwgMHg4NCwKKwkgMHhGOCwgMHg4NCwgMHgzQywgMHhGQiwgMHgwQywgMHg2MCwgMHg3QywgMHg2MywgMHg4OCwgMHhGRiwgMHhDRCwgMHg4MSwgMHgwNiwgMHhBMywgMHhGRCwgMHgwRCwKKwkgMHg4RCwgMHhGRiwgMHgzQiwgMHhGRCwgMHg2NCwgMHg0NywgMHg4MCwgMHhCRiwgMHg2MCwgMHg1QywgMHgyMiwgMHg0MywgMHg4MCwgMHg2MSwgMHg4OCwgMHhGRiwKKwkgMHhDRiwgMHg4MywgMHhFMSwgMHg4MSwgMHhGRCwgMHgwRCwgMHg4RCwgMHhGRiwgMHg2MSwgMHg0NywgMHgzMSwgMHg5MSwgMHhCMSwgMHg4NCwgMHgzQiwgMHhGQSwKKwkgMHgxRiwgMHg2MywgMHhFMywgMHg4MywgMHg2NiwgMHg0NCwgMHgwMiwgMHhBNiwgMHgzQiwgMHhGMCwgMHg2NiwgMHg0NCwgMHhCMSwgMHg5QywgMHgzQiwgMHhGOCwKKwkgMHgwMiwgMHhBNiwgMHhGQSwgMHgxRiwgMHhBQiwgMHg0NiwgMHgwMCwgMHg2NywgMHgwMCwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwKKwkgMHgyNSwgMHhGMCwgMHgwMiwgMHhBOCwgMHgwMCwgMHg2NywgMHgyMiwgMHgwMiwgMHgzRCwgMHhGMSwgMHg2NCwgMHg0NCwgMHgwMywgMHhCNCwgMHg0MCwgMHg0MiwKKwkgMHhEMCwgMHg4MCwgMHhBNiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwgMHhCQiwgMHhGNCwgMHg4MCwgMHg2MSwgMHgwMiwgMHgwMiwgMHhFMywgMHg4MywKKwkgMHhFQiwgMHg4MywgMHgyMiwgMHg0NCwgMHg4OCwgMHhGRiwgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwRCwgMHg4RCwgMHhGRiwgMHg2MSwgMHg0NywKKwkgMHgzMSwgMHg5MSwgMHg5RCwgMHg4NSwgMHhBNywgMHg4MywgMHgzQiwgMHhGQywgMHgxRiwgMHg2MywgMHhFMywgMHg4MywgMHg2NiwgMHg0NCwgMHgwMiwgMHhBNiwKKwkgMHhCQiwgMHhGMiwgMHg2NiwgMHg0NCwgMHhBNSwgMHg4MSwgMHhCQiwgMHhGQSwgMHgwMiwgMHhBNiwgMHhGQSwgMHgxRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyNywgMHhGMiwgMHgxRCwgMHg2MCwgMHhDMCwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywKKwkgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgyNywgMHhGMCwgMHg2MywgMHg0NiwKKwkgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwKKwkgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwKKwkgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHhBNiwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgwMSwgMHgwMywKKwkgMHgyQSwgMHgwMCwgMHg0MywgMHg0QiwgMHhBQiwgMHg0NiwgMHgzQiwgMHhGMiwgMHg4MCwgMHg2MCwgMHgzMCwgMHg3QywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwKKwkgMHg0RSwgMHg2MSwgMHg3NiwgMHg2NCwgMHgwRSwgMHg2MywgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHg1OCwgMHhEOCwgMHhGQiwgMHgxRiwKKwkgMHg5MCwgMHg2NCwgMHgwNCwgMHg2MywgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHg1OCwgMHhEOCwgMHhGQiwgMHgxRiwgMHhEOSwgMHg4MSwKKwkgMHhBMCwgMHg2NCwgMHgwNCwgMHg2MywgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHg1OCwgMHhEOCwgMHhGQiwgMHgxRiwgMHhEOSwgMHg4MSwKKwkgMHhCNiwgMHg2NCwgMHgwRSwgMHg2MywgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHg1OCwgMHhEOCwgMHhGQiwgMHgxRiwgMHgwMCwgMHg2NywKKwkgMHgwMCwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NywgMHgyMCwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNywgMHhGMiwKKwkgMHgxRCwgMHg2MCwgMHhDMCwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwKKwkgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgyNywgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwKKwkgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwKKwkgMHgyNSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwKKwkgMHhFOCwgMHgxQiwgMHhBNiwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgwMSwgMHgwMywgMHgwRCwgMHgwMCwgMHg0MywgMHg0QiwKKwkgMHhBQiwgMHg0NiwgMHgzQiwgMHhGMiwgMHg4MCwgMHg2MCwgMHgzMCwgMHg2MSwgMHg5RCwgMHg4NSwgMHhBNCwgMHg4NCwgMHhBMiwgMHhEQSwgMHhBQiwgMHg0NiwKKwkgMHgwMCwgMHg2NywgMHgwMCwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NywgMHgyMCwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2NCwgMHg0MCwgMHg0MSwgMHg0QSwgMHg2NCwgMHhBMCwgMHhEMiwgMHhGRiwgMHhGRiwgMHg0MCwgMHg0MiwgMHg4MCwgMHgyQiwgMHgwNCwgMHgwMCwKKwkgMHhGRiwgMHhCNCwgMHg0MCwgMHg0MiwgMHgwMSwgMHg2NCwgMHg0MCwgMHg0MSwgMHhBNiwgMHhGMywgMHg0NiwgMHg0QiwgMHg2MCwgMHg0NiwgMHgyMCwgMHg2MywKKwkgMHhFMywgMHg4MywgMHhBQiwgMHg0NiwgMHgzMiwgMHhGMCwgMHhBQiwgMHg0NiwgMHg1OSwgMHhGOCwgMHhBQiwgMHg0NiwgMHgzMywgMHhGMCwgMHhBQiwgMHg0NiwKKwkgMHg1QSwgMHhGOCwgMHhBQiwgMHg0NiwgMHgzNCwgMHhGMCwgMHhBQiwgMHg0NiwgMHg1QiwgMHhGOCwgMHg2NiwgMHg0NCwgMHgwMiwgMHhBNiwgMHhGMSwgMHgxRiwKKwkgMHhBNiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwgMHhBQiwgMHg0NiwgMHgwQywgMHg2MCwgMHgzOCwgMHg2NSwgMHgyMiwgMHg0NCwgMHhGRiwgMHhCNCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4MSwgMHhDOSwgMHg4MSwgMHg0QSwgMHg2NCwgMHgwRSwgMHg2MywKKwkgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyMSwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwOCwgMHgwMCwgMHhBQiwgMHg0NiwgMHhGMCwgMHhBMSwKKwkgMHg3NiwgMHg2NCwgMHgwRSwgMHg2MywgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOCwgMHhGRCwgMHgxRiwgMHhBQiwgMHg0NiwgMHgyMiwgMHg0NCwgMHhGRiwgMHhCNCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NSwgMHhDNCwgMHg4NCwgMHgwQywgMHg2MCwgMHg4MCwgMHg2NSwgMHhDNCwgMHg4MSwgMHg1QSwgMHg2NCwgMHgwNCwgMHg2MywKKwkgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHhBQiwgMHg0NiwgMHgyMSwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwNiwgMHgwMCwgMHhGQSwgMHhBMSwKKwkgMHg5MCwgMHg2NCwgMHgwNCwgMHg2MywgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOCwgMHhGRCwgMHgxRiwgMHgzQiwgMHhGMCwgMHgyMSwgMHg0NCwgMHgwMSwgMHgyQSwKKwkgMHgxMywgMHgwMCwgMHgyMiwgMHg0NCwgMHgzRCwgMHhGQiwgMHg2MCwgMHg0MSwgMHgwMiwgMHhGRSwgMHhGOCwgMHg4NCwgMHhGOCwgMHg4NCwgMHhGOCwgMHg4NCwKKwkgMHgzQywgMHhGQiwgMHgwQywgMHg2MCwgMHg3QywgMHg2MywgMHg4OCwgMHhGRiwgMHhDRCwgMHg4MSwgMHgwNiwgMHhBMywgMHhGRCwgMHgwRCwgMHg4RCwgMHhGRiwKKwkgMHgzQiwgMHhGRCwgMHg2NCwgMHg0NywgMHg4MCwgMHhCRiwgMHg2MCwgMHg1QywgMHgyMiwgMHg0MywgMHg4MCwgMHg2MSwgMHg4OCwgMHhGRiwgMHhDRiwgMHg4MywKKwkgMHhFMSwgMHg4MSwgMHhGRCwgMHgwRCwgMHg4RCwgMHhGRiwgMHg2MSwgMHg0NywgMHgzMSwgMHg5MSwgMHhCMSwgMHg4NCwgMHgzQiwgMHhGQSwgMHgxRiwgMHg2MywKKwkgMHhFMywgMHg4MywgMHg2NiwgMHg0NCwgMHgwMiwgMHhBNiwgMHgzQiwgMHhGMCwgMHg2NiwgMHg0NCwgMHhCMSwgMHg5QywgMHgzQiwgMHhGOCwgMHgwMiwgMHhBNiwKKwkgMHhGQSwgMHgxRiwgMHhBQiwgMHg0NiwgMHgwMCwgMHg2NywgMHgwMCwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwgMHgyNSwgMHhGMCwKKwkgMHgwMiwgMHhBOCwgMHgwMCwgMHg2NywgMHgyMiwgMHgwMiwgMHgzRCwgMHhGMSwgMHg2NCwgMHg0NCwgMHgwMywgMHhCNCwgMHg0MCwgMHg0MiwgMHhEMCwgMHg4MCwKKwkgMHhBNiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwgMHhCQiwgMHhGNCwgMHg4MCwgMHg2MSwgMHgwMiwgMHgwMiwgMHhFMywgMHg4MywgMHhFQiwgMHg4MywKKwkgMHgyMiwgMHg0NCwgMHg4OCwgMHhGRiwgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwRCwgMHg4RCwgMHhGRiwgMHg2MSwgMHg0NywgMHgzMSwgMHg5MSwKKwkgMHg5RCwgMHg4NSwgMHhBNywgMHg4MywgMHgzQiwgMHhGQywgMHgxRiwgMHg2MywgMHhFMywgMHg4MywgMHg2NiwgMHg0NCwgMHgwMiwgMHhBNiwgMHhCQiwgMHhGMiwKKwkgMHg2NiwgMHg0NCwgMHhBNSwgMHg4MSwgMHhCQiwgMHhGQSwgMHgwMiwgMHhBNiwgMHhGQSwgMHgxRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyNywgMHhGMiwgMHgxRCwgMHg2MCwgMHhDMCwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwKKwkgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgyNywgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwKKwkgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwKKwkgMHg2MSwgMHg0NiwgMHgyNSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHhBNiwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgwMSwgMHgwMywgMHgyMSwgMHgwMCwKKwkgMHg0MywgMHg0QiwgMHhBQiwgMHg0NiwgMHgzQiwgMHhGMiwgMHg4MCwgMHg2MCwgMHgzMCwgMHg3QywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg0RSwgMHg2MSwKKwkgMHg3NiwgMHg2NCwgMHgwRSwgMHg2MywgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHg1OCwgMHhEOCwgMHhGQiwgMHgxRiwgMHg5MCwgMHg2NCwKKwkgMHgwNCwgMHg2MywgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHg1OCwgMHhEOCwgMHhGQiwgMHgxRiwgMHhBMCwgMHg2NCwgMHgwNCwgMHg2MywKKwkgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHg1OCwgMHhEOCwgMHhGQiwgMHgxRiwgMHgwMCwgMHg2NywgMHgwMCwgMHg2MSwgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NywgMHgyMCwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNywgMHhGMiwgMHgxRCwgMHg2MCwgMHhDMCwgMHg2NSwKKwkgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwKKwkgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgyNywgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwKKwkgMHgyNiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNSwgMHhGMCwgMHg2MywgMHg0NiwKKwkgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHhBNiwgMHhGMywKKwkgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgwMSwgMHgwMywgMHgwRCwgMHgwMCwgMHg0MywgMHg0QiwgMHhBQiwgMHg0NiwgMHgzQiwgMHhGMiwKKwkgMHg4MCwgMHg2MCwgMHgzMCwgMHg2MSwgMHg5RCwgMHg4NSwgMHhBNCwgMHg4NCwgMHhBMiwgMHhEQSwgMHhBQiwgMHg0NiwgMHgwMCwgMHg2NywgMHgwMCwgMHg2MSwKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NywgMHgyMCwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHg0NiwgMHg0NSwKKwkgMHgwMiwgMHhGMCwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NCwgMHhEMCwgMHg4MCwgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMiwgMHg2NiwgMHg1QywgMHgyNSwgMHg0NiwKKwkgMHg1NiwgMHgwMiwgMHg3MCwgMHgyNywgMHg1NCwgMHgwMCwgMHgxMiwgMHg2NCwgMHgwMywgMHhGQSwgMHgwNCwgMHhGOCwgMHgwRSwgMHhGMiwgMHg4NywgMHhGQywKKwkgMHg4RCwgMHhGQywgMHg4RSwgMHhGQywgMHhEQSwgMHg4MiwgMHgxNiwgMHg2MSwgMHgwMCwgMHg2MywgMHhDOSwgMHg4MSwgMHg1QSwgMHhEQywgMHhGRCwgMHgwMiwKKwkgMHg2MCwgMHg0MCwgMHhGMCwgMHgzQiwgMHgxNiwgMHgwMCwgMHgzMiwgMHg0NCwgMHhBQywgMHhGMywgMHgwMSwgMHhCMCwgMHhGQSwgMHhBMCwgMHgwOCwgMHgyNCwKKwkgMHgyQywgMHgwNSwgMHhEQywgMHg4MywgMHhGMCwgMHg2NywgMHgwRSwgMHhGQSwgMHgyNiwgMHg2MCwgMHgwNCwgMHg2NCwgMHgyQiwgMHhEQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhBQywgMHhGRCwgMHgyQiwgMHhGRiwgMHhGRSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwKKwkgMHg0RiwgMHgwMCwgMHhBRCwgMHhGMywgMHgwNSwgMHg2NSwgMHhENCwgMHg4MCwgMHhEQywgMHg4MywgMHgxNywgMHgwNSwgMHhBRCwgMHhGRCwgMHg5OCwgMHhGRSwKKwkgMHgwNCwgMHgwNCwgMHgwMCwgMHg3RiwgMHgwOCwgMHg3RSwgMHgwRSwgMHhGQSwgMHgzQiwgMHhGRiwgMHgyNSwgMHg2MCwgMHhGOCwgMHg2NCwgMHgyQiwgMHhEQiwKKwkgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHgwRSwgMHhGMiwgMHgyQiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNiwKKwkgMHhGNywgMHhGRSwgMHhGRCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHgzMiwgMHgwMCwgMHhBOSwgMHhGMywgMHhGRiwgMHhGRiwgMHhEOCwgMHhBMCwKKwkgMHhGRiwgMHhGRiwgMHgwRCwgMHgwNCwgMHgyNiwgMHg2MCwgMHgxMCwgMHg2NCwgMHgyQiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQywgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHgyMSwgMHgwMCwgMHg0NiwgMHg0NSwKKwkgMHgwMCwgMHg2NCwgMHgyQiwgMHhEQiwgMHgyNSwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhBMiwgMHhGRiwgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMCwgMHgwQSwgMHgxOCwgMHg3MCwgMHg2NywgMHhBMCwgMHg4MCwgMHhGMCwgMHg2NywgMHgwNiwgMHgwMywKKwkgMHhDMCwgMHg4NCwgMHgwMSwgMHhGQSwgMHgyNSwgMHg0NiwgMHgyNSwgMHg0NCwgMHg4MCwgMHhGQywgMHgwNSwgMHhGQSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHhGNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwgMHhGRiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHhENCwgMHhGRSwKKwkgMHhBMywgMHhGRiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg2MCwgMHhGRSwgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwgMHgwRCwgMHgwMCwKKwkgMHgyNSwgMHg2MCwgMHhGMiwgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwgMHgxOCwgMHgwMCwgMHgyNiwgMHg2MCwgMHgwQSwgMHg2NCwgMHg0MCwgMHg0NywKKwkgMHg1OCwgMHg0RiwgMHgwMywgMHgwMCwgMHgyQSwgMHg2MCwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHhENSwgMHgwRSwgMHhGMiwgMHgwQiwgMHgxOCwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwOCwgMHgwMCwgMHgyNiwgMHg2MCwgMHgyMCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGMiwgMHgwMSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNywgMHhENSwgMHgwRSwgMHhGMiwgMHgxNCwgMHgxOCwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgxMSwgMHgwMCwgMHgwMiwgMHhGMCwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NCwgMHhEMCwgMHg4MCwgMHhBMiwgMHhGRiwKKwkgMHhBRCwgMHhGMywgMHgwMiwgMHgwMiwgMHhDQywgMHg4NCwgMHhBRCwgMHhGQiwgMHgyNiwgMHg2MCwgMHgyMCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFOSwgMHgwMSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhGQiwgMHg2NCwgMHgzQSwgMHg0MiwKKwkgMHg0QSwgMHhEQiwgMHhBMiwgMHhGRiwgMHhCMCwgMHhGMywgMHhBQywgMHhGMywgMHhDQywgMHg4MCwgMHhGRCwgMHhBMCwgMHgwMSwgMHgxNCwgMHgxRCwgMHgwNSwKKwkgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhGQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgxNywgMHgwMywgMHhGMCwgMHg2NywgMHgwRSwgMHhGQSwKKwkgMHgyNiwgMHg2MCwgMHgwNCwgMHg2NCwgMHgxMywgMHg2MCwgMHgxMCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGNiwgMHg2NCwgMHgzQSwgMHg0MiwgMHg0QSwgMHhEQiwgMHhCMCwgMHhGMywgMHhBQywgMHhGMywgMHhDQywgMHg4MywKKwkgMHhEQywgMHg4NCwgMHgwMSwgMHgxNSwgMHhCMCwgMHhGRCwgMHhBQywgMHhGQiwgMHhENCwgMHhGRSwgMHhBRiwgMHhGMywgMHhBRCwgMHhGMywgMHgwMCwgMHhBOCwKKwkgMHhBRSwgMHhGMSwgMHgwMywgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgyNiwgMHgwNSwgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhGQSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgyMCwgMHgwMywgMHgwMCwgMHg2MywgMHhBRiwgMHhGMywgMHgwRSwgMHhGQywgMHhDQywgMHg4NCwgMHhGRiwgMHgzQSwKKwkgMHhBRiwgMHhGQiwgMHg5OCwgMHhGRSwgMHgwMywgMHgwNCwgMHgwOCwgMHhCQiwgMHgwRSwgMHhGQywgMHgzQiwgMHhGRiwgMHgyNSwgMHg2MCwgMHhGOCwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgxMCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhGNywgMHg2NCwgMHgzQSwgMHg0MiwgMHg0QSwgMHhEQiwgMHhBRCwgMHhGMywgMHgwRSwgMHhGMiwgMHhEQywgMHg4MywgMHgwOCwgMHhCMCwgMHhBRCwgMHhGRCwKKwkgMHgwOCwgMHgyOCwgMHhGNywgMHhGRSwgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwgMHgyQSwgMHg2MCwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCOSwgMHhGRSwKKwkgMHgxMywgMHhGRiwgMHgyNCwgMHg0MCwgMHg4MCwgMHgyQiwgMHgwQiwgMHgwMCwgMHhBMiwgMHhGRiwgMHgyNSwgMHg0NiwgMHgwOSwgMHhGNCwgMHgwRSwgMHhGMiwKKwkgMHgwNSwgMHgxOCwgMHgwOCwgMHhCQywgMHgwRSwgMHhGQSwgMHhGRiwgMHhGRiwgMHhGNywgMHhGRSwgMHgwMSwgMHgwMCwgMHhEOCwgMHhGRSwgMHhBMywgMHhGRiwKKwkgMHgyNSwgMHg0NiwgMHgzRSwgMHhGMiwgMHgwMCwgMHhGNCwgMHgwOCwgMHhGMCwgMHgyNSwgMHg0NiwgMHgwNiwgMHhCNCwgMHhGRiwgMHg3RiwgMHgxMCwgMHhCQywKKwkgMHgwNiwgMHgyNiwgMHhGRCwgMHg3RiwgMHgwRSwgMHhGQSwgMHgzRSwgMHhGMiwgMHgzRiwgMHhGMiwgMHg2MCwgMHg0MSwgMHgwOCwgMHgyQSwgMHg2NCwgMHg0NywKKwkgMHgzRiwgMHhGQSwgMHg2MCwgMHg0NSwgMHhCOSwgMHhGQywgMHgxNiwgMHg2MCwgMHhBQSwgMHhGMywgMHhBMywgMHhGQywgMHhBQiwgMHhGQywgMHg5MSwgMHhGQywKKwkgMHhENCwgMHg4MCwgMHgxOCwgMHg2MCwgMHgyMSwgMHg2NSwgMHhBNSwgMHg4MCwgMHgwMSwgMHgwNCwgMHgwNywgMHgwMywgMHgyMywgMHhGMCwgMHgwOCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHgzNSwgMHg2MCwgMHhFQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNiwgMHg2MCwgMHg1OCwgMHg0RiwgMHgzMCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwQiwgMHgwNCwgMHgyMywgMHhGMCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHgyQywgMHg2MCwgMHhFRSwgMHg2NCwKKwkgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwgMHhFNCwgMHg3OCwgMHhCNSwgMHhGMSwgMHg4MywgMHgwMCwgMHhEQiwgMHhGMywgMHhBNiwgMHhGMSwgMHgwNywgMHhCNCwKKwkgMHg2NCwgMHg0MywgMHhGRCwgMHhBMCwgMHgyQywgMHhGMiwgMHg3MSwgMHgwMiwgMHgwMSwgMHhCMCwgMHg2NCwgMHg0MywgMHg3OCwgMHgwMiwgMHgyRSwgMHhGMiwKKwkgMHgxRCwgMHg2MCwgMHhDMCwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwKKwkgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgyRSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwKKwkgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgyRCwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwKKwkgMHgyQywgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwKKwkgMHhFOCwgMHgxQiwgMHhBNiwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHg1MSwgMHgwMywgMHg2MywgMHg0NiwgMHg4MCwgMHhGNiwKKwkgMHgyNSwgMHg0NiwgMHg0MywgMHgxOCwgMHgyRSwgMHhGMiwgMHg2NiwgMHg0MSwgMHgxRCwgMHg2MCwgMHhDMCwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhBNiwgMHhGMSwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NCwgMHg0MywgMHgxMSwgMHgxOCwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhGQywgMHgxQiwgMHg2NiwgMHg0NCwgMHg2NCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHg2NSwgMHg0MywKKwkgMHg4MCwgMHhGMCwgMHgwMSwgMHhGQSwgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHgwQiwgMHgwMCwgMHg2NCwgMHg0NiwgMHg2MiwgMHg0MywKKwkgMHgwMCwgMHhGMiwgMHhBMywgMHhEQiwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg4MSwgMHhGQywgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwKKwkgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHg0MywgMHg0QiwgMHgyQywgMHhGMCwgMHhBRCwgMHhGMCwgMHgyRSwgMHhGMiwgMHhBQiwgMHg0NiwgMHgwMywgMHhGOCwKKwkgMHg4NCwgMHhGOCwgMHgwNSwgMHhGQSwgMHgwMywgMHg2NCwgMHgwNiwgMHhGQSwgMHhBQiwgMHg0NiwgMHgxRiwgMHg2MCwgMHhDMiwgMHg2MSwgMHhBMSwgMHhEMywKKwkgMHgyMCwgMHg2MCwgMHgwNCwgMHg3QywgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHhBMCwgMHhERCwgMHhEQSwgMHg5QywgMHhBMSwgMHhEOSwKKwkgMHg0OSwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhBMSwgMHhEQiwgMHgwQSwgMHgwMCwgMHhEQiwgMHhGMywgMHgwMiwgMHhBMywgMHhGRSwgMHhBMCwKKwkgMHhGOSwgMHhBMCwgMHgwMSwgMHgwNiwgMHgwNCwgMHgwMiwgMHgyMywgMHhGMCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHgwNywgMHhGQywKKwkgMHgyMywgMHhGMiwgMHhGRiwgMHhGRiwgMHgyNCwgMHgxQiwgMHgxNiwgMHg2MCwgMHhBQiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMCwgMHgzQSwKKwkgMHgwRiwgMHgwMCwgMHgyNSwgMHg2MCwgMHhDOCwgMHg2NCwgMHgxMywgMHg2MCwgMHgxMCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwRSwgMHhGMiwgMHhDMSwgMHhGRSwgMHgxMCwgMHhBQywgMHgwRSwgMHhGQSwgMHgxRCwgMHgwMCwKKwkgMHgyNSwgMHg2MCwgMHhEQSwgMHg2NCwgMHgxMywgMHg2MCwgMHgxMCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwRSwgMHhGMiwgMHhDOCwgMHhGRSwgMHgxMCwgMHhBQywgMHgwRSwgMHhGQSwgMHgwRSwgMHgwMCwgMHgyNSwgMHg2MCwKKwkgMHhFQywgMHg2NCwgMHgxMywgMHg2MCwgMHgxMCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHgwRSwgMHhGMiwgMHhDRSwgMHhGRSwgMHgxMCwgMHhBQywgMHgwRSwgMHhGQSwgMHgyQSwgMHg2MCwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhDQiwgMHg4NCwgMHhDOSwgMHg4MywgMHhGRiwgMHhGRiwgMHgwOCwgMHgwNCwgMHg1OCwgMHhEMSwgMHhBNSwgMHhEOCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhGOCwgMHgxRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzRSwgMHhGMiwgMHhDOSwgMHhGMSwKKwkgMHgwOCwgMHhCMCwgMHgxOSwgMHhGOCwgMHg1NywgMHgwMiwgMHhFQSwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQiwgMHhGMywgMHgzMCwgMHhGQSwgMHg2MCwgMHg0NSwKKwkgMHhFQywgMHhGMywgMHgzMSwgMHhGQSwgMHg0NiwgMHg0QSwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgwNiwgMHhGMiwgMHhEMCwgMHg4MCwKKwkgMHgwNywgMHhGMCwgMHgwNSwgMHgwMiwgMHhENCwgMHg4MCwgMHhEMywgMHg4MCwgMHgwMiwgMHgwMiwgMHhEQiwgMHhGMywgMHgwMywgMHgwMywgMHhBQSwgMHg0NiwKKwkgMHg0MiwgMHhGRSwgMHg0MSwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwMywgMHgyQSwgMHgyMCwgMHgwMCwgMHgwMiwgMHhGMiwgMHgwMywgMHhGMCwgMHgwNCwgMHhGMiwKKwkgMHg2MCwgMHg0MywgMHhBQSwgMHg0NiwgMHgyQywgMHhGQywgMHgyRCwgMHhGOCwgMHgyRSwgMHhGQSwgMHg3RiwgMHhGMSwgMHgzMiwgMHhGOCwgMHg4MCwgMHhGMSwKKwkgMHgzMywgMHhGOCwgMHg4MSwgMHhGMSwgMHgzNCwgMHhGOCwgMHgwOCwgMHg2NCwgMHgzMiwgMHg0MCwgMHgwNCwgMHgyQSwgMHgwRCwgMHgwMCwgMHgyQywgMHhGMCwKKwkgMHgzOSwgMHhGMCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwOCwgMHgwMCwgMHgzRSwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHhDMCwgMHhCNCwKKwkgMHhFOCwgMHg4NCwgMHhCMCwgMHg5QywgMHgzOSwgMHhGOCwgMHg4OCwgMHg2NCwgMHgxQywgMHgwMCwgMHgwMiwgMHhGMiwgMHgwMywgMHhGMCwgMHgwNCwgMHhGMiwKKwkgMHg2MCwgMHg0MywgMHhBQSwgMHg0NiwgMHgzMiwgMHhGQywgMHgzMywgMHhGOCwgMHgzNCwgMHhGQSwgMHg3RiwgMHhGMSwgMHgyQywgMHhGOCwgMHg4MCwgMHhGMSwKKwkgMHgyRCwgMHhGOCwgMHg4MSwgMHhGMSwgMHgyRSwgMHhGOCwgMHgwMSwgMHg2MCwgMHgwOCwgMHg2NCwgMHgzMiwgMHg0MCwgMHgwNCwgMHgyQSwgMHgwOSwgMHgwMCwKKwkgMHgzRSwgMHhGMiwgMHgzOSwgMHhGMCwgMHgwMCwgMHg2MCwgMHhDMCwgMHhCNCwgMHhFOCwgMHg4NCwgMHhCMCwgMHg5QywgMHgzOSwgMHhGOCwgMHgwMSwgMHg2MCwKKwkgMHg4OCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgwMiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzNiwgMHg2MCwgMHgyMiwgMHg2MywgMHgyMCwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyMSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNCwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyNSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOCwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyOSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQywgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyRCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgxQiwgMHg2MCwKKwkgMHgwQiwgMHhGRCwgMHgzNywgMHg2MCwgMHg0MiwgMHg2MywgMHgxQiwgMHg2MCwgMHgwQywgMHhGRCwgMHgzMCwgMHg0NCwgMHgxQiwgMHg2MCwgMHgwRCwgMHhGQiwKKwkgMHgzMSwgMHg0NCwgMHgxQiwgMHg2MCwgMHgwRSwgMHhGQiwgMHgzMiwgMHg0NCwgMHgxQiwgMHg2MCwgMHgwRiwgMHhGQiwgMHgzMywgMHg0NCwgMHgxQiwgMHg2MCwKKwkgMHgxMCwgMHhGQiwgMHg4MSwgMHhGRiwgMHg5MSwgMHhGRiwgMHg1OCwgMHg1MSwgMHg0NCwgMHgwMCwgMHg4MiwgMHhGRiwgMHg5MiwgMHhGRiwgMHg1OCwgMHg1MSwKKwkgMHg0MCwgMHgwMCwgMHg4MywgMHhGRiwgMHg5MywgMHhGRiwgMHg1OCwgMHg1MSwgMHgzQywgMHgwMCwgMHg4NCwgMHhGRiwgMHg5NCwgMHhGRiwgMHg1OCwgMHg1MSwKKwkgMHgzOCwgMHgwMCwgMHg4NSwgMHhGRiwgMHg5NSwgMHhGRiwgMHg1OCwgMHg1MSwgMHgzNCwgMHgwMCwgMHg4NiwgMHhGRiwgMHg5NiwgMHhGRiwgMHg1OCwgMHg1MSwKKwkgMHgzMCwgMHgwMCwgMHg4NywgMHhGRiwgMHg5NywgMHhGRiwgMHg1OCwgMHg1MSwgMHgyQywgMHgwMCwgMHg4MCwgMHhGRiwgMHg5MCwgMHhGRiwgMHg5OSwgMHhGRiwKKwkgMHgxQiwgMHg2MCwgMHgwQiwgMHhGMSwgMHgzMCwgMHg0NCwgMHg2NCwgMHg0MywgMHhCRCwgMHhEQiwgMHgzMSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzMiwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgzMywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNiwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgzNywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzOCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzOSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzQSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgzQiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzQywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzRCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzRSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgzRiwgMHg0NCwgMHhCRCwgMHhEQiwgMHhGNiwgMHg2MCwgMHgxNiwgMHg2NCwgMHgwQSwgMHhGQiwgMHg0MCwgMHgyMSwgMHhGRSwgMHgwMSwKKwkgMHg3NCwgMHgwMCwgMHg0MiwgMHg1MCwgMHg0MCwgMHg1MywgMHgxQiwgMHg2MCwgMHgwQywgMHhGMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MiwgMHgzMywgMHg0NCwKKwkgMHgzMiwgMHg0MiwgMHhBMiwgMHhEQiwgMHhEQSwgMHg4MiwgMHhBMiwgMHhERCwgMHhEQSwgMHg4MywgMHg2NSwgMHg0NCwgMHhCRCwgMHhEQiwgMHg2MSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHg2NiwgMHg0NCwgMHhCRCwgMHhEQiwgMHhCRCwgMHhEOSwgMHgzMCwgMHg0NCwgMHhCRCwgMHhEQiwgMHg5OSwgMHhGRiwgMHhBNCwgMHg0QywKKwkgMHhCRCwgMHhEQiwgMHhBNSwgMHg0QywgMHhCRCwgMHhEQiwgMHhBMCwgMHg0QywgMHhCRCwgMHhEQiwgMHhBMSwgMHg0QywgMHhCRCwgMHhEQiwgMHg5OCwgMHhGRiwKKwkgMHgxQiwgMHg2MCwgMHgwQywgMHhGRCwgMHgxQiwgMHg2MCwgMHgwRCwgMHhGMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MCwgMHgxQiwgMHg2MCwgMHgwRiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MiwgMHgxQiwgMHg2MCwgMHgxMCwgMHhGMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MywgMHgzMSwgMHg0MSwgMHgxQiwgMHg2MCwKKwkgMHgwRSwgMHhGMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MSwgMHgxQiwgMHg2MCwgMHgwQiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MywgMHgyMCwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyMSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNCwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyNSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOCwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyOSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQywgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyRCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgxQiwgMHg2MCwKKwkgMHgwQiwgMHhGRCwgMHg2MSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRiwgMHg2MCwgMHg0RSwgMHg2MywgMHhBMywgMHhEMywgMHgzMywgMHg1QywgMHgwMiwgMHhBNCwKKwkgMHhCRCwgMHhEQiwgMHhGRSwgMHhCNCwgMHhFMCwgMHg4NSwgMHhDNCwgMHg4NSwgMHg0NywgMHhEOSwgMHgzNCwgMHg0NCwgMHg1QiwgMHhEQiwgMHg0NCwgMHhGMywKKwkgMHg1QiwgMHhEQiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NywgMHgzRSwgMHg4NCwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NywgMHgzRSwKKwkgMHhGRiwgMHgwMSwgMHg4NiwgMHhFMSwgMHg4MCwgMHhGRiwgMHg5MCwgMHhGRiwgMHg4OCwgMHhGRiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NywgMHgzRSwKKwkgMHgxOSwgMHg2MCwgMHhGNywgMHhGMywgMHhGRiwgMHhGRiwgMHgxMCwgMHgxQiwgMHgzMiwgMHg0MCwgMHg4MCwgMHgyQSwgMHhGNiwgMHgwMSwgMHg5RCwgMHhGRSwKKwkgMHhGNCwgMHgwNSwgMHhEQiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwNCwgMHhBOCwgMHgzMywgMHg2MCwgMHhFMiwgMHg2MiwgMHgwMSwgMHgwMiwgMHhCRCwgMHgwMCwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg0QSwgMHgxQiwgMHhFOSwgMHgwMSwgMHg4NywgMHhGRiwgMHgyMCwgMHg0NCwgMHg4MCwgMHhGRiwgMHg2MCwgMHg0MCwKKwkgMHg4MCwgMHgyNiwgMHhFMywgMHgwMSwgMHhGMSwgMHhGQywgMHhBRCwgMHg0RiwgMHhGRCwgMHhCNCwgMHhBMCwgMHg1RCwgMHhDMCwgMHg2MCwgMHg0MCwgMHhFQywKKwkgMHhDMCwgMHg2MCwgMHgwMCwgMHhFRCwgMHhDMCwgMHg2MCwgMHg4MCwgMHhFRSwgMHhBQywgMHg0RiwgMHhCRiwgMHhCNCwgMHhBMCwgMHg1QywgMHgxOSwgMHg2MCwKKwkgMHg0OCwgMHhGMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMiwgMHgyNywgMHgwNiwgMHgwMCwgMHgyOCwgMHhFMiwgMHgyNCwgMHhFMiwgMHg0MCwgMHgyMSwKKwkgMHhGRSwgMHgwMSwgMHg3NSwgMHg0MCwgMHgwRCwgMHgwMCwgMHgyOCwgMHhFMiwgMHgyNCwgMHhFMiwgMHg3NSwgMHg0MCwgMHg4MCwgMHgyQiwgMHhBQiwgMHhGRiwKKwkgMHgxNCwgMHhFMCwgMHg5NCwgMHhFMCwgMHg0MCwgMHgyMSwgMHhGRSwgMHgwMSwgMHgxMCwgMHhFMCwgMHg3NSwgMHg0MCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgzMywgMHg2MCwgMHhFRSwgMHg2MiwgMHhBMiwgMHhERiwgMHgwMSwgMHg2MCwgMHgzOSwgMHhFMiwgMHgwNCwgMHg2MCwgMHgwMCwgMHg3QSwgMHhBQywgMHg0RiwKKwkgMHg0MCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1QywgMHhDMCwgMHg2MCwgMHg1OSwgMHhFQywgMHhDMCwgMHg2MCwgMHgwNywgMHhFRCwgMHhDMCwgMHg2MCwKKwkgMHg4RiwgMHhFRSwgMHhBRSwgMHg0RiwgMHgwNCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RSwgMHgyNiwgMHg2MSwgMHhDRCwgMHg4MSwgMHhGRiwgMHhGRiwKKwkgMHhGRCwgMHgwMiwgMHhBRSwgMHg0RiwgMHhGQiwgMHhCNCwgMHhBMCwgMHg1RSwgMHhBMCwgMHgwMSwgMHhGMSwgMHhGQywgMHhBRCwgMHg0RiwgMHhGRCwgMHhCNCwKKwkgMHhBMCwgMHg1RCwgMHgxNSwgMHg2MCwgMHg4MCwgMHhFNywgMHhDMCwgMHg2MCwgMHg0MCwgMHhFQywgMHhDMCwgMHg2MCwgMHgwMCwgMHhFRCwgMHhBQywgMHg0RiwKKwkgMHhCRiwgMHhCNCwgMHhBMCwgMHg1QywgMHhDMCwgMHg2MCwgMHg4NCwgMHhFRSwgMHhBRSwgMHg0RiwgMHgwNCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RSwKKwkgMHgwMCwgMHg3QSwgMHgwRiwgMHg2MCwgMHgxOSwgMHhFMiwgMHgwRSwgMHg2MCwgMHgzNiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHg3NSwgMHg0NCwKKwkgMHg4MCwgMHgyQiwgMHhBQiwgMHhGRiwgMHg4MCwgMHgyNywgMHgwOCwgMHgwMCwgMHgxNCwgMHhFMCwgMHg5NCwgMHhFMCwgMHgzNCwgMHhFMiwgMHg2MSwgMHg1QSwKKwkgMHg0OCwgMHgyMSwgMHhGRSwgMHgwMSwgMHgwMCwgMHhFMCwgMHg3NSwgMHg0MCwgMHgwQSwgMHg2MCwgMHgxOSwgMHhFMiwgMHgwMCwgMHg2NCwgMHgxOSwgMHg2MCwKKwkgMHhGMSwgMHhGQiwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgwMSwgMHg2NCwgMHgxOSwgMHg2MCwgMHhGMiwgMHhGQiwgMHhGRiwgMHhGRiwgMHgxMCwgMHhFMCwgMHgwMSwgMHg2MCwgMHgzNCwgMHhFMiwgMHhGRiwgMHhGRiwKKwkgMHgwNSwgMHg3QSwgMHhBQywgMHg0RiwgMHg0MCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1QywgMHhDMCwgMHg2MCwgMHg1OSwgMHhFQywgMHhDMCwgMHg2MCwKKwkgMHgwNywgMHhFRCwgMHhDMCwgMHg2MCwgMHg4RiwgMHhFRSwgMHhBRSwgMHg0RiwgMHgwNCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RSwgMHgxQiwgMHg2MCwKKwkgMHhGMywgMHhGMSwgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwgMHhGQSwgMHhCNCwgMHg2NCwgMHg0MSwgMHg3RCwgMHhGMSwgMHgwMiwgMHhCMSwgMHgwNCwgMHg2NSwKKwkgMHgwMiwgMHgwMiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwMSwgMHg2NSwgMHhCNCwgMHg4NCwgMHhBMCwgMHg1RCwgMHgyNiwgMHg2MSwgMHhDRCwgMHg4MSwKKwkgMHhGRiwgMHhGRiwgMHhGRCwgMHgwMiwgMHhBRSwgMHg0RiwgMHhGQiwgMHhCNCwgMHhBMCwgMHg1RSwgMHgxQiwgMHg2MCwgMHhGMywgMHhGMSwgMHhBRCwgMHg0RiwKKwkgMHgwMCwgMHg3RiwgMHhGQSwgMHhCNCwgMHg2NCwgMHg0MSwgMHg3RCwgMHhGMSwgMHgwMiwgMHhCMSwgMHgwNCwgMHg2NSwgMHgwMiwgMHgwMiwgMHg2NCwgMHg0MCwKKwkgMHgwMSwgMHgyQiwgMHgwMSwgMHg2NSwgMHhCNCwgMHg4NCwgMHhBMCwgMHg1RCwgMHgzMCwgMHgwMSwgMHgxOSwgMHg2MCwgMHhGMywgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxQiwgMHgyQiwgMHgwMSwgMHgzMSwgMHg0NCwgMHgwNCwgMHgyQSwgMHgyOCwgMHgwMSwgMHgwOCwgMHgyNiwgMHgyNiwgMHgwMSwgMHgxOSwgMHg2MCwKKwkgMHhGNCwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHgxOCwgMHgyMSwgMHgwMSwgMHg3RSwgMHhGNSwgMHhGMSwgMHhGQywgMHhBRCwgMHg0RiwgMHhGRCwgMHhCNCwKKwkgMHhBMCwgMHg1RCwgMHgxNSwgMHg2MCwgMHg4MCwgMHhFNywgMHhDMCwgMHg2MCwgMHg0MCwgMHhFQywgMHhDMCwgMHg2MCwgMHgwMCwgMHhFRCwgMHhBQywgMHg0RiwKKwkgMHhCRiwgMHhCNCwgMHhBMCwgMHg1QywgMHhDMCwgMHg2MCwgMHg4NCwgMHhFRSwgMHhBRSwgMHg0RiwgMHgwNCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RSwKKwkgMHgwMCwgMHg3QSwgMHgyRCwgMHg2MCwgMHg1QSwgMHg2MywgMHhBMywgMHhEMSwgMHgwNSwgMHg2MCwgMHhEQywgMHg2NCwgMHhEMCwgMHg4MCwgMHgwMCwgMHg2NCwKKwkgMHgwMSwgMHgwNiwgMHgwMSwgMHg2NCwgMHg0MCwgMHg0RSwgMHhCMiwgMHhGMSwgMHg2NiwgMHg0MSwgMHhFMSwgMHg4MSwgMHhFMSwgMHg4MSwgMHhFMSwgMHg4MSwKKwkgMHhFMSwgMHg4MSwgMHg2MSwgMHg0NiwgMHg3MywgMHg0MiwgMHg1QSwgMHg5MiwgMHgzRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHg2MCwgMHg0NywgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NSwgMHg2MiwgMHg0NywgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgzRiwgMHhCNCwgMHg2MCwgMHg0MSwgMHg2NCwgMHg0NCwgMHgxNCwgMHg5MCwKKwkgMHgzRiwgMHgyNiwgMHhDQywgMHg4NCwgMHgxNCwgMHg5MCwgMHgzRiwgMHgyNiwgMHhDQywgMHg4NCwgMHg2MiwgMHg0MSwgMHg2MCwgMHg1NSwgMHhCMiwgMHhGQiwKKwkgMHg3MiwgMHg1QywgMHg2NywgMHg0MiwgMHhEMiwgMHg4MCwgMHhBMiwgMHg0OCwgMHgyMCwgMHgyQiwgMHgwNSwgMHgwMCwgMHgwMSwgMHgwMiwgMHg3QywgMHg1QywKKwkgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhDNCwgMHg4NSwgMHhFOCwgMHhFMiwgMHhFNCwgMHhFMiwgMHg2MSwgMHg0MiwgMHg0OSwgMHg5MSwgMHg2NCwgMHg0NCwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhCNCwgMHg4NCwgMHg2MCwgMHg0NSwKKwkgMHg1MSwgMHg5NCwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2MSwgMHgwMSwgMHgwRCwgMHg0NCwgMHg5NCwgMHg2MiwgMHg0MSwgMHgxOSwgMHg2MCwgMHhGNSwgMHhGMSwKKwkgMHg2MSwgMHg0MiwgMHg2NCwgMHg0MywgMHhDRiwgMHg4MywgMHhDRiwgMHg4MywgMHgwMywgMHgwMywgMHhFMywgMHg4MywgMHg0OCwgMHg5NCwgMHhGRSwgMHgxRiwKKwkgMHgyRSwgMHg0MCwgMHgwMSwgMHgyNiwgMHhFMCwgMHg4NCwgMHg2MCwgMHg0MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwKKwkgMHg0NCwgMHg5NCwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHg1NCwgMHg5NCwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHg0NCwgMHg5NCwKKwkgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHg1NCwgMHg5NCwgMHgxOSwgMHhFMiwgMHgyRSwgMHg0MCwgMHgwMSwgMHgyNiwgMHhFOCwgMHg4NCwKKwkgMHgyOSwgMHg2MSwgMHg1NCwgMHg5MSwgMHg2MSwgMHg0MywgMHgxMSwgMHgwNiwgMHg3NSwgMHg0NCwgMHg4MCwgMHgyQiwgMHhBQiwgMHhGRiwgMHg4MCwgMHgyNywKKwkgMHgwQywgMHgwMCwgMHgxNCwgMHhFMCwgMHg5NCwgMHhFMCwgMHgzNCwgMHhFMiwgMHg2MSwgMHg1QSwgMHg0OCwgMHgyMSwgMHhGRSwgMHgwMSwgMHgwMCwgMHhFMCwKKwkgMHg3QSwgMHg0MywgMHgxNSwgMHhBMSwgMHg3NSwgMHg0MCwgMHg4MCwgMHgyQiwgMHgwNiwgMHhBMSwgMHg1RCwgMHg5MSwgMHg2MSwgMHg0NCwgMHgyRSwgMHg0MCwKKwkgMHgwMSwgMHgyNiwgMHhFMCwgMHg4NCwgMHg2MCwgMHg0MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHg4OSwgMHhGRiwgMHgxMCwgMHhFMCwKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHg1QywgMHg5NCwgMHhFQiwgMHg4MywgMHg1QywgMHg5NCwKKwkgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHg0QywgMHg5NCwgMHgyRSwgMHg0MCwgMHgwMSwgMHgyNiwKKwkgMHhFOCwgMHg4NCwgMHg2MCwgMHg0MywgMHg2NSwgMHg0MSwgMHg2MiwgMHg0NSwgMHhENSwgMHg4NSwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2MSwgMHgwMSwgMHgwRCwKKwkgMHhDNSwgMHg4NSwgMHhDNCwgMHg4NCwgMHg2MCwgMHg0MywgMHg2MiwgMHg0MSwgMHhFMSwgMHg4MSwgMHhFMSwgMHg4MSwgMHhFMSwgMHg4MSwgMHhFMSwgMHg4MSwKKwkgMHhFMSwgMHg4MSwgMHhFMSwgMHg5QywgMHgwMCwgMHg2MSwgMHhERCwgMHg4MSwgMHg1OCwgMHg5NCwgMHg0QSwgMHg5MiwgMHhGQywgMHgwNSwgMHg0MSwgMHg0RiwKKwkgMHgwMCwgMHg2MSwgMHg2MiwgMHg0NSwgMHgxQywgMHg2MCwgMHgwQSwgMHhGMywgMHhFMywgMHg4MywgMHhGMSwgMHg4MSwgMHhFMywgMHg4MywgMHhGMSwgMHg4MSwKKwkgMHhFMywgMHg4MywgMHhGMSwgMHg4MSwgMHhFMywgMHg4MywgMHhGMSwgMHg4MSwgMHhFMywgMHg4MywgMHhGMSwgMHg4MSwgMHhFMywgMHg4MywgMHhGMSwgMHg4MSwKKwkgMHhBMCwgMHg1MiwgMHhCMiwgMHhGMywgMHhDMywgMHg5QywgMHg0NCwgMHg5NCwgMHgwMSwgMHgwNCwgMHhEQywgMHg4NCwgMHg2MCwgMHg1NSwgMHhCMiwgMHhGQiwKKwkgMHg2NCwgMHg1MiwgMHhFOSwgMHhFMiwgMHg2NSwgMHg1MywgMHhCMywgMHhGMywgMHgwNiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCMywgMHhGQiwgMHhCNCwgMHhGMywKKwkgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCNCwgMHhGQiwgMHgyRiwgMHg0MywgMHhDRiwgMHg4MywgMHg2QywgMHhGMywgMHhGRiwgMHhGRiwgMHg1QywgMHg5NCwKKwkgMHhGRiwgMHhGRiwgMHgwQywgMHgyNCwgMHgwMSwgMHg2NCwgMHg2QywgMHhGQiwgMHgxNiwgMHg2MCwgMHhBQywgMHhGMSwgMHhGRiwgMHhGRiwgMHgwMywgMHgxQiwKKwkgMHgzMSwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwNywgMHgwMCwgMHg3MywgMHhGMywgMHhGRiwgMHhGRiwgMHg1QywgMHg5NCwgMHhGRiwgMHhGRiwgMHgwQywgMHgyNCwKKwkgMHgwMCwgMHg2NCwgMHg3MywgMHhGQiwgMHgxOSwgMHg2MCwgMHhGNSwgMHhGMywgMHgwMSwgMHg3QywgMHg1QywgMHg5NCwgMHgwMCwgMHgzNiwgMHgwMSwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgxOSwgMHg2MCwgMHhGMiwgMHhGOSwgMHgwMSwgMHg2MCwgMHgzNCwgMHhFMiwgMHgzMiwgMHg3QSwgMHhBQywgMHg0RiwgMHg0MCwgMHhCQywKKwkgMHgwMCwgMHg3RiwgMHhBMCwgMHg1QywgMHhDMCwgMHg2MCwgMHg1OSwgMHhFQywgMHhDMCwgMHg2MCwgMHgwNywgMHhFRCwgMHhDMCwgMHg2MCwgMHg4RiwgMHhFRSwKKwkgMHhBRSwgMHg0RiwgMHgwNCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RSwgMHgwQSwgMHg2MSwgMHhDRCwgMHg4MSwgMHhGRiwgMHhGRiwgMHhGRCwgMHgwMiwKKwkgMHhBRSwgMHg0RiwgMHhGQiwgMHhCNCwgMHhBMCwgMHg1RSwgMHgxQiwgMHg2MCwgMHhGMywgMHhGMSwgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwgMHhGQSwgMHhCNCwKKwkgMHg2NCwgMHg0MSwgMHg3RCwgMHhGMSwgMHgwMiwgMHhCMSwgMHgwNCwgMHg2NSwgMHgwMiwgMHgwMiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwMSwgMHg2NSwKKwkgMHhCNCwgMHg4NCwgMHhBMCwgMHg1RCwgMHgzNywgMHg2MCwgMHg3RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHhFMiwgMHgyRCwgMHhGMywgMHgyQywgMHhGMywKKwkgMHgwMCwgMHhCRCwgMHhDQywgMHg4NCwgMHgwOCwgMHgwMywgMHgyQywgMHhGQiwgMHgwNiwgMHgwMiwgMHg2NSwgMHg0NCwgMHgyQywgMHhGQiwgMHg4QSwgMHhGRiwKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHg0NCwgMHhGMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHg0NCwgMHhGQiwgMHgyRiwgMHg2MCwKKwkgMHg0QSwgMHg2NSwgMHgyRiwgMHg2MCwgMHg0OCwgMHg2MSwgMHhBNSwgMHhEMywgMHhBMSwgMHhEMywgMHgxMSwgMHgxOCwgMHhDQywgMHg4NCwgMHhBMSwgMHhEQiwKKwkgMHgwRSwgMHgwMiwgMHhBNSwgMHhEMywgMHhBMSwgMHhEQiwgMHgxNywgMHg2MCwgMHhBNywgMHhGMywgMHgxNywgMHg2MCwgMHhBNiwgMHhGMSwgMHhBMiwgMHhEQiwKKwkgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMywgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhGMSwgMHhGMywKKwkgMHgzMSwgMHg0MCwgMHgwMSwgMHgyQSwgMHgzRCwgMHgwMCwgMHg2MCwgMHg0MywgMHgwNCwgMHhCMCwgMHgwMiwgMHhCMCwgMHgwOCwgMHgyNCwgMHgxNiwgMHgwMiwKKwkgMHgxMCwgMHhCMCwgMHgyOSwgMHg0NCwgMHgzNCwgMHgwMiwgMHgwMCwgMHhBOCwgMHhDQywgMHg4MSwgMHgwRCwgMHgwMywgMHg0MSwgMHg0OSwgMHgyRiwgMHgwMiwKKwkgMHg2MywgMHg0MCwgMHgwOCwgMHgyQSwgMHgwOCwgMHgwMCwgMHhGNywgMHhCMywgMHgxQiwgMHg2MCwgMHhGNiwgMHhGMSwgMHhBRCwgMHg0RiwgMHhGRCwgMHhCNCwKKwkgMHhBMCwgMHg1RCwgMHg0NCwgMHg0OSwgMHgyNCwgMHgwMCwgMHg2MywgMHg0MCwgMHgwMiwgMHgyQSwgMHgxMCwgMHgwMCwgMHgxQiwgMHg2MCwgMHhGNywgMHhGMywKKwkgMHgxQiwgMHg2MCwgMHhGNSwgMHhGQiwgMHg0MCwgMHg0OSwgMHgxQiwgMHg2MCwgMHhGOCwgMHhGMywgMHgxQiwgMHg2MCwgMHhGNiwgMHhGQiwgMHgwQywgMHhCQiwKKwkgMHhGRCwgMHhCMywgMHhBRCwgMHg0RiwgMHgwMiwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RCwgMHgxMSwgMHgwMCwgMHgxQiwgMHg2MCwgMHhGOSwgMHhGMywKKwkgMHgzNywgMHg2MCwgMHhFQSwgMHg3QywgMHgwQywgMHgxOCwgMHhBNCwgMHhEQiwgMHg0MCwgMHg0OSwgMHgxQiwgMHg2MCwgMHhGQSwgMHhGMywgMHgxQiwgMHg2MCwKKwkgMHhGNiwgMHhGQiwgMHgwOCwgMHhCQiwgMHhGQiwgMHhCMywgMHhBRCwgMHg0RiwgMHgwMiwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RCwgMHhGMSwgMHhGRCwKKwkgMHgwMCwgMHg2MCwgMHhBNCwgMHhGMywgMHg2MiwgMHg0MywgMHgxNywgMHgxOCwgMHg1OCwgMHhEMywgMHg2MiwgMHg0MSwgMHgwMywgMHgxOCwgMHhDQywgMHg4NCwKKwkgMHhBMSwgMHhEQiwgMHgxMSwgMHgwMCwgMHg0OSwgMHhEMywgMHhBMywgMHhEQiwgMHgwNiwgMHhBMSwgMHhBMSwgMHhEMywgMHg1OSwgMHhEMSwgMHg2MCwgMHg0NSwKKwkgMHhBNSwgMHhEMywgMHg1OSwgMHhEMSwgMHhCMCwgMHg4NCwgMHhBNSwgMHhEQiwgMHg2NCwgMHg0NCwgMHgwNiwgMHgzNiwgMHhDRCwgMHhGRSwgMHgwNywgMHgzNiwKKwkgMHhENiwgMHhGRSwgMHhFNiwgMHgwMSwgMHgyMywgMHg0NiwgMHhCOCwgMHg2MCwgMHgwMywgMHg3OCwgMHhGRiwgMHhGRiwgMHg0NiwgMHg0MywgMHgyNiwgMHg2MCwKKwkgMHgzRSwgMHg2MSwgMHhBMSwgMHhEMywgMHg1OSwgMHhEMSwgMHgwNiwgMHgxQiwgMHg1OSwgMHhEMywgMHg1OSwgMHhEMSwgMHgwMywgMHgxQiwgMHg1OSwgMHhEMywKKwkgMHg1OSwgMHhEMSwgMHhGMCwgMHgxOCwgMHgwMCwgMHg2MywgMHg0OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgwMiwgMHgzNiwgMHgxMSwgMHgwMCwgMHgwMywgMHgzNiwKKwkgMHgzMiwgMHgwMCwgMHgwMSwgMHgzNiwgMHgwOCwgMHgwMCwgMHgwNSwgMHgzQSwgMHhFQSwgMHgwMSwgMHhBNCwgMHhEMywgMHg1QSwgMHhEMywgMHg5QywgMHg4NSwKKwkgMHhBNCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFNCwgMHgwMSwgMHgwMSwgMHg2MCwgMHg0OCwgMHg2MSwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHhERiwgMHgwMSwKKwkgMHgzQSwgMHg2MCwgMHgzRSwgMHg2NCwgMHg0MCwgMHg0NSwgMHgyMiwgMHgwMCwgMHgwMSwgMHg2MCwgMHg0OCwgMHg2NiwgMHhBNiwgMHhEMywgMHgwNCwgMHhBMSwKKwkgMHg2MCwgMHg0MywgMHhBMSwgMHhEMywgMHhDOSwgMHg4MSwgMHg2MCwgMHg0NSwgMHgwMCwgMHhCQiwgMHhBMSwgMHhEQiwgMHhCRSwgMHhEMywgMHgwOSwgMHgwMywKKwkgMHhENCwgMHg4NCwgMHg5QywgMHg4NCwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwRSwgMHhBMywgMHhEMSwgMHg2MywgMHg0NiwgMHg2NCwgMHg0MywKKwkgMHhGMiwgMHgwMSwgMHg5QywgMHg4NCwgMHhEQywgMHg4NSwgMHg0OSwgMHhERCwgMHg2MSwgMHg0NCwgMHgwMCwgMHhCQiwgMHhBNiwgMHhEQiwgMHgwMiwgMHgwMywKKwkgMHg2NSwgMHg0NCwgMHhCRSwgMHhEQiwgMHhCQywgMHgwMSwgMHgzQSwgMHg2MCwgMHgxOSwgMHg2NCwgMHg0MCwgMHg0NSwgMHgwMSwgMHg2MCwgMHg0OCwgMHg2NiwKKwkgMHhBNiwgMHhEMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHgwRiwgMHgxOCwgMHgwMiwgMHgwMywgMHg2MCwgMHg0NiwgMHhGOSwgMHgwMSwgMHg1OCwgMHhEMywKKwkgMHhBNCwgMHhEMywgMHg2MCwgMHg0NSwgMHgwMCwgMHg2MywgMHhBNCwgMHhERCwgMHgwNSwgMHgxOCwgMHg1OCwgMHhEMywgMHhGRiwgMHhGRiwgMHhDNCwgMHg4MywKKwkgMHhBMiwgMHhERCwgMHhDQSwgMHg4NCwgMHhBNiwgMHhEQiwgMHgyNSwgMHg1OCwgMHg2NCwgMHg0MSwgMHgwMCwgMHg2MCwgMHg0NiwgMHg3NCwgMHhDRCwgMHhFMiwKKwkgMHgwNCwgMHhFMSwgMHgwMiwgMHg2MCwgMHgwMCwgMHhFMSwgMHgzRiwgMHg0NCwgMHg0MCwgMHgyNiwgMHgwNSwgMHgwMCwgMHgxQywgMHg2MCwgMHgwRiwgMHhGMywKKwkgMHg1QSwgMHhEMSwgMHhBMCwgMHg1MCwgMHhBNCwgMHg1MCwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwgMHgwMywgMHgwMCwgMHgzQSwgMHg2MCwgMHhCNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHgyOSwgMHhGRSwgMHgwMSwgMHhDNCwgMHhFMiwgMHg0MywgMHg2NCwgMHgzQSwgMHhEQiwgMHhBMSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MSwgMHgzRiwgMHg0NCwgMHhGRiwgMHgwMSwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgwNSwgMHgwMCwgMHgxQywgMHg2MCwgMHgwRCwgMHhGMywKKwkgMHg1QSwgMHhEMSwgMHhBMCwgMHg1MCwgMHhBNCwgMHg1MiwgMHhDNCwgMHhFMiwgMHgzMiwgMHg3QiwgMHg0RCwgMHhFMiwgMHhCRiwgMHhGRSwgMHhDNCwgMHhFMiwKKwkgMHg0MSwgMHhGRiwgMHhFMCwgMHhGRSwgMHhFMSwgMHhGRSwgMHhFMiwgMHhGRSwgMHg0MywgMHhGRiwgMHg0NCwgMHhGRiwgMHg0NiwgMHhGRiwgMHhBMiwgMHhGMywKKwkgMHg2MiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwNSwgMHgzNiwgMHgyRCwgMHhGRiwgMHgwNywgMHgzNiwgMHhENSwgMHhGRSwgMHgwOCwgMHhFMSwgMHg4OCwgMHg2MCwKKwkgMHg4NSwgMHg3MSwgMHg4RCwgMHhFMiwgMHhBMiwgMHg2MCwgMHg0MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2MiwgMHgzRCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHgzQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MSwgMHhBOSwgMHg5QywgMHg2MCwgMHg0NSwgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHgwRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGMSwgMHgwOSwgMHg2MCwgMHhCNCwgMHg2MSwgMHg2NCwgMHg0NCwgMHgwMSwgMHgyNywgMHgyNCwgMHgwMCwKKwkgMHg2MCwgMHg0MCwgMHgwRSwgMHgzQSwgMHgwRCwgMHgwMCwgMHgwMSwgMHg3QywgMHgxNCwgMHg2MCwgMHg2RiwgMHhGOSwgMHg0NCwgMHg2MCwgMHgwOCwgMHg3QywKKwkgMHgxNCwgMHg2MCwgMHg0MSwgMHhGOSwgMHgxNiwgMHg2MCwgMHg2MiwgMHhGMSwgMHgwMiwgMHg2MCwgMHhCMCwgMHg2MSwgMHhCMSwgMHg5QywgMHgyNiwgMHgwMCwKKwkgMHgwMCwgMHg3QywgMHgxNCwgMHg2MCwgMHg2RiwgMHhGOSwgMHg0MCwgMHg2MCwgMHgwOCwgMHg3QywgMHgxNCwgMHg2MCwgMHg0MSwgMHhGOSwgMHgxNiwgMHg2MCwKKwkgMHg2MiwgMHhGMSwgMHgwMiwgMHg2MCwgMHg5MCwgMHg2MSwgMHhCMSwgMHg5QywgMHgwOSwgMHg2MCwgMHg2NywgMHg2NSwgMHhGRiwgMHhCNCwgMHhDNCwgMHg4NSwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4MSwgMHgxMiwgMHgwMCwgMHhGRiwgMHhCNCwgMHhFRCwgMHhBMCwgMHgyQywgMHg2MCwgMHhDNiwgMHg2MSwKKwkgMHgwNCwgMHgwNCwgMHhFMiwgMHhBMCwgMHhEOSwgMHg4MSwgMHgwMSwgMHgwNCwgMHhEOSwgMHg4MSwgMHhBMSwgMHhEMSwgMHgwMiwgMHg2MCwgMHg1MCwgMHg2MSwKKwkgMHgyNiwgMHg2MCwgMHhGMCwgMHg2NSwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHhCMSwgMHg5QywgMHhDOCwgMHg4MSwgMHg2MSwgMHg0NywgMHgwMCwgMHg3RSwKKwkgMHhFOSwgMHg4MSwgMHgwNywgMHg2MCwgMHhGMCwgMHg2NSwgMHhBNSwgMHg4MSwgMHgwQiwgMHhCOSwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NSwKKwkgMHhCNSwgMHg4NSwgMHgwNCwgMHg2MCwgMHg0NCwgMHg2MiwgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGMywKKwkgMHhDOCwgMHg2MSwgMHg2MSwgMHg1NCwgMHhDRCwgMHhFMiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgyRSwgMHgwMCwgMHhDQywgMHg4NCwgMHhFMCwgMHg4NSwKKwkgMHgxNSwgMHg2MCwgMHhBMiwgMHhFNywgMHgyNiwgMHg2MCwgMHg4MCwgMHg2NCwgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RiwgMHgwNCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHg2MCwgMHg5QywgMHg2NCwgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RiwgMHgwNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg2MCwgMHhCOCwgMHg2NCwKKwkgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RiwgMHgwNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg2MCwgMHhENCwgMHg2NCwgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHgwNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg3NSwgMHg2NCwgMHgwNiwgMHg2MSwgMHg2MSwgMHg0OCwgMHg2MCwgMHg0NCwgMHg4MCwgMHhCQywgMHhGRiwgMHhCNCwKKwkgMHg2MCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgyOCwgMHg2MCwgMHhFNiwgMHg3QywgMHgwNywgMHg2MCwgMHhFOCwgMHhGOSwKKwkgMHgyOCwgMHg2MCwgMHg2RSwgMHg2MywgMHgxNCwgMHg2MSwgMHgyMSwgMHgwMCwgMHgxNCwgMHg2MCwgMHhERiwgMHhGMSwgMHhGRiwgMHhCNCwgMHhFRCwgMHhBMCwKKwkgMHg2NCwgMHg0MSwgMHgwNCwgMHgwNCwgMHhFMiwgMHhBMCwgMHhEOSwgMHg4MSwgMHgwMSwgMHgwNCwgMHhEOSwgMHg4MSwgMHhBMSwgMHhEMSwgMHgxNCwgMHg2MCwKKwkgMHgwRSwgMHhGMywgMHg2NCwgMHg0MSwgMHhGRiwgMHhCMSwgMHhGRiwgMHg2MCwgMHgwMCwgMHg2NSwgMHhBNCwgMHg4NCwgMHgzNCwgMHg5NCwgMHhBMiwgMHhEQiwKKwkgMHg1QSwgMHhEMywgMHg2NCwgMHg0MSwgMHhBNSwgMHg4MSwgMHhGRiwgMHhCNCwgMHgzNCwgMHg5NCwgMHhBMiwgMHhEQiwgMHgyOSwgMHg2MCwgMHg1MiwgMHg3QywKKwkgMHgwNywgMHg2MCwgMHhFOCwgMHhGOSwgMHgyNywgMHg2MCwgMHhGQywgMHg2MywgMHgxMywgMHg2MSwgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyMywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHg2MCwgMHhFOCwgMHhGMywgMHgzMSwgMHg0MCwgMHg4MCwgMHgyNiwgMHgzNiwgMHhBNCwgMHgwNywgMHg2MCwgMHhFOCwgMHhGQiwKKwkgMHg2MCwgMHg0MywgMHgwOSwgMHg2MSwgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyMywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGMywgMHgyOSwgMHg2MCwKKwkgMHhCRSwgMHg2MSwgMHgwMCwgMHg3QywgMHg3RSwgMHg2MywgMHg1OSwgMHhEOSwgMHhGRSwgMHgxRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwMywgMHgwMCwKKwkgMHgyQSwgMHg2MCwgMHg0MCwgMHg2NSwgMHgxNSwgMHgwMCwgMHhGRiwgMHhCNCwgMHhGOSwgMHhBMCwgMHgyQSwgMHg2MCwgMHg2MiwgMHg2NSwgMHgwMSwgMHg3QywKKwkgMHgwRCwgMHgwNCwgMHhFRCwgMHhBMCwgMHgyQSwgMHg2MCwgMHg4NCwgMHg2NSwgMHgxMSwgMHg3QywgMHgwOCwgMHgwNCwgMHhFMiwgMHhBMCwgMHgyQSwgMHg2MCwKKwkgMHhBNiwgMHg2NSwgMHgyMSwgMHg3QywgMHgwMywgMHgwNCwgMHgyQSwgMHg2MCwgMHhDOCwgMHg2NSwgMHgzMSwgMHg3QywgMHg2NCwgMHg1RiwgMHg3RCwgMHhGQiwKKwkgMHhBNSwgMHhEMywgMHhEQSwgMHg4NSwgMHhGMCwgMHhBMCwgMHgyOSwgMHg2MCwgMHhCRSwgMHg2MSwgMHgwOCwgMHgwNiwgMHg0MCwgMHg1NCwgMHg1OCwgMHg1MywKKwkgMHgwOCwgMHhGRiwgMHgzNywgMHg2MCwgMHg3QSwgMHg2NCwgMHg0MywgMHhGQiwgMHgwOCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MCwgMHg0MywgMHg2MCwgMHg0NiwKKwkgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHhBNSwgMHhEMywgMHhEQSwgMHg4NSwgMHg1OSwgMHhEOSwgMHg1OSwgMHhEQiwgMHg1OSwgMHhEOSwgMHg1OSwgMHhEQiwKKwkgMHhGQiwgMHgxRiwgMHgwQywgMHg2MywgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHhBNSwgMHhEMywgMHhEQSwgMHg4NSwgMHg1OSwgMHhEOSwgMHg1OSwgMHhEQiwKKwkgMHg1OSwgMHhEOSwgMHg1OSwgMHhEQiwgMHhGNywgMHgxRiwgMHg2NiwgMHg0NCwgMHgwRSwgMHg2MywgMHg1MywgMHg5MywgMHg2MCwgMHg0MCwgMHgxMCwgMHgzNiwKKwkgMHgwNywgMHgwMCwgMHg2NSwgMHg0NCwgMHg0OCwgMHhEMywgMHg1OSwgMHhEOSwgMHg1OSwgMHhEQiwgMHg1OSwgMHhEOSwgMHg1OSwgMHhEQiwgMHhGQiwgMHgxRiwKKwkgMHgxNiwgMHg2MCwgMHgzOSwgMHhGMSwgMHg3RCwgMHhGMywgMHg2NCwgMHg0MywgMHhEQiwgMHg4MSwgMHgyQywgMHg2MCwgMHg1NCwgMHg2NSwgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgzNywgMHgxMiwgMHgwMCwgMHgxMSwgMHgzNywgMHgxNywgMHgwMCwgMHgyMSwgMHgzNywgMHgxRCwgMHgwMCwgMHgzMSwgMHgzNywgMHgyMiwgMHgwMCwKKwkgMHhBMywgMHhEMSwgMHgxNiwgMHg2MCwgMHgzNCwgMHhGNSwgMHg2NCwgMHg0NCwgMHhGRiwgMHhCNCwgMHgxNiwgMHg2MCwgMHgzMywgMHhGQiwgMHg2NCwgMHg0NywKKwkgMHhGRiwgMHhCNCwgMHgxNiwgMHg2MCwgMHgyQSwgMHhGMSwgMHgxRCwgMHgwMCwgMHhBMSwgMHhEMywgMHgxNiwgMHg2MCwgMHgzNSwgMHhGNSwgMHhGRiwgMHhCNCwKKwkgMHgxNiwgMHg2MCwgMHgyQiwgMHhGMSwgMHgxNiwgMHgwMCwgMHhBMSwgMHhEMywgMHgxNiwgMHg2MCwgMHgzNiwgMHhGNSwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwKKwkgMHgxNiwgMHg2MCwgMHgyQywgMHhGMSwgMHgwRSwgMHgwMCwgMHg1OSwgMHhEMywgMHgxNiwgMHg2MCwgMHgzNywgMHhGNSwgMHhGRiwgMHhCNCwgMHgxNiwgMHg2MCwKKwkgMHgyRCwgMHhGMSwgMHgwNywgMHgwMCwgMHg1OSwgMHhEMywgMHgxNiwgMHg2MCwgMHgzOCwgMHhGNSwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHgxNiwgMHg2MCwKKwkgMHgyRSwgMHhGMSwgMHgxNiwgMHg2MCwgMHgzMiwgMHhGQiwgMHgxNiwgMHg2MCwgMHgyRiwgMHhGOSwgMHg2NiwgMHg0MiwgMHhGQywgMHhBMiwgMHhBMiwgMHhEMywKKwkgMHgyQiwgMHg2MCwgMHg0MiwgMHg2MywgMHhDQywgMHg4NCwgMHhFOCwgMHg4NCwgMHhDQywgMHg4MSwgMHg2MywgMHg0NSwgMHhBNiwgMHhEMywgMHhEQSwgMHg4MiwKKwkgMHhGRiwgMHhCNCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQiwgMHgwMywgMHgwMCwgMHhEQSwgMHg4NiwgMHhDRCwgMHg4MSwKKwkgMHhGNSwgMHgwMSwgMHgwMCwgMHhCOSwgMHhBNiwgMHhEMywgMHgwQiwgMHgwMywgMHg1QSwgMHhEMSwgMHhEQSwgMHg4NiwgMHhGRiwgMHhCNCwgMHhFMCwgMHg4NCwKKwkgMHhDNCwgMHg4NCwgMHg1QywgMHg5MCwgMHhCRCwgMHhEOSwgMHhGRCwgMHgwMiwgMHhDRCwgMHg4MSwgMHg2NiwgMHg0MiwgMHhGMiwgMHgwMiwgMHg1QSwgMHhEMywKKwkgMHgyQiwgMHg2MCwgMHg4MCwgMHg2NSwgMHhENywgMHg4MCwgMHhCRCwgMHhEQiwgMHhGRCwgMHgwMiwgMHg3RCwgMHhGMywgMHgxOSwgMHg2MCwgMHg3QiwgMHhGMSwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwOSwgMHgwMCwgMHg2NCwgMHg0MCwgMHgxMCwgMHgyNiwgMHgwNiwgMHgwMCwgMHgxMywgMHg2NCwgMHhDQiwgMHhGQiwKKwkgMHgwMSwgMHg2MCwgMHg2NywgMHg2NCwgMHgzNywgMHhGQiwgMHgwOSwgMHgwMCwgMHgwOCwgMHg2NCwgMHhDQiwgMHhGQiwgMHhBMSwgMHhGMywgMHgwMSwgMHg2MCwKKwkgMHg2NywgMHg3QywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHg1QiwgMHg3QywgMHgzNywgMHhGOSwgMHgxOSwgMHg2MCwgMHg0RCwgMHhGMSwgMHg3RCwgMHhGMywKKwkgMHg2NCwgMHg0MCwgMHgwMCwgMHgzQSwgMHgxQiwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwRCwgMHgwMCwgMHgzMiwgMHg2MCwgMHhBQiwgMHg2MywKKwkgMHg0QywgMHg5NCwgMHgwRSwgMHhBNSwgMHg2MCwgMHhGRSwgMHhBMCwgMHhEMSwgMHhBNSwgMHhEMywgMHgxOSwgMHg2MCwgMHg3MiwgMHhGOSwgMHgxOSwgMHg2MCwKKwkgMHg3MywgMHhGQiwgMHgyMCwgMHhGRSwgMHgwQiwgMHgwMCwgMHhGRiwgMHhCNCwgMHhGOCwgMHhBNCwgMHgzMiwgMHg2MCwgMHhDOCwgMHg2MywgMHg0QywgMHg5NCwKKwkgMHg2MCwgMHhGRSwgMHhBMCwgMHhEMSwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHg3MywgMHhGOSwgMHgyMCwgMHhGRSwgMHgxOSwgMHg2MCwgMHg3NSwgMHhGMywKKwkgMHgxNiwgMHg2MCwgMHhEOCwgMHhGMSwgMHg2MCwgMHg0MywgMHhEMywgMHg4MCwgMHgxOSwgMHg2MCwgMHg3NiwgMHhGMywgMHgwMSwgMHgwNywgMHg2MywgMHg1QywKKwkgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNywgMHg2MCwgMHg1QywgMHgxOSwgMHg2MCwgMHg0RiwgMHhGOSwgMHgxOSwgMHg2MCwgMHg1MywgMHhGOSwKKwkgMHg3RCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwQSwgMHgwMCwgMHhGRiwgMHhCNSwgMHgxMCwgMHg2MCwgMHhGNCwgMHg2MywKKwkgMHg2NSwgMHg0MSwgMHhDRCwgMHg4MSwgMHgwNiwgMHhBMywgMHhGRCwgMHgwMiwgMHhGQSwgMHhBMywgMHhBMywgMHhEMywgMHgwRiwgMHgwMCwgMHgwMSwgMHg2MCwKKwkgMHhGRiwgMHg2NSwgMHhBNCwgMHg4NCwgMHgxMSwgMHg2MCwgMHg2MCwgMHg2MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHgwOCwgMHhBMSwKKwkgMHhGQiwgMHgwMiwgMHhGQywgMHhBMSwgMHhBMSwgMHhEMywgMHgxOSwgMHg2MCwgMHg0RiwgMHhGMSwgMHhGRiwgMHhCNCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgwNywgMHgxOSwgMHg2MCwgMHg0RiwgMHhGQiwgMHgxOSwgMHg2MCwgMHg1MywgMHhGQiwgMHgxOSwgMHg2MCwgMHg0RiwgMHhGMywgMHgxOSwgMHg2MCwKKwkgMHg3MiwgMHhGMSwgMHgxOSwgMHg2MCwgMHg3NCwgMHhGQiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNCwgMHgxOSwgMHg2MCwgMHg3NCwgMHhGOSwKKwkgMHgyQywgMHg2MCwgMHg3NCwgMHg2MywgMHgyQiwgMHg2MCwgMHgwMiwgMHg2NSwgMHgxNiwgMHg2MCwgMHgzMywgMHhGMSwgMHgyQSwgMHg2MCwgMHhFQSwgMHg2MSwKKwkgMHgyQywgMHg2MCwgMHg2MiwgMHg2NCwgMHg0MCwgMHg0RiwgMHgwNCwgMHg2NCwgMHhDMywgMHg2MCwgMHg1OCwgMHg0RCwgMHgxQSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxOSwgMHg2MCwgMHg0RiwgMHhGMywgMHgxOSwgMHg2MCwgMHg3MywgMHhGMSwgMHgxOSwgMHg2MCwgMHg3NCwgMHhGQiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgwNCwgMHgxOSwgMHg2MCwgMHg3NCwgMHhGOSwgMHgyQywgMHg2MCwgMHg3QywgMHg2MywgMHgxNiwgMHg2MCwgMHgzMiwgMHhGMSwgMHgyQiwgMHg2MCwKKwkgMHg0MiwgMHg2NSwgMHgyQywgMHg2MCwgMHg2MCwgMHg2NCwgMHg0MCwgMHg0RiwgMHgwOCwgMHg2NCwgMHhDMywgMHg2MCwgMHg1OCwgMHg0RCwgMHgxQSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg3RCwgMHhGMywgMHgwOCwgMHg3QywgMHgzOCwgMHhGOSwgMHgyQiwgMHg2MCwgMHhEQSwgMHg2MSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQiwKKwkgMHgwRSwgMHgwMCwgMHgwMSwgMHgzNywgMHgwNiwgMHgwMCwgMHgxMSwgMHgzNywgMHgwMywgMHgwMCwgMHgyMSwgMHgzQiwgMHgxRSwgMHhBMSwgMHgxRSwgMHhBMSwKKwkgMHgxRSwgMHhBMSwgMHgxQywgMHg2MywgMHgyQiwgMHg2MCwgMHhCQywgMHg2NCwgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOSwgMHhGRCwgMHgxRiwgMHgxNiwgMHg2MCwKKwkgMHgyRiwgMHhGMywgMHgwMCwgMHg3QywgMHg2MCwgMHg0NSwgMHg3MCwgMHg2MiwgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwRiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgyOSwgMHhGRSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2MiwgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgzQiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHg2MSwgMHhCMSwgMHg5QywgMHg2MCwgMHg0NSwgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzQSwgMHg2MCwKKwkgMHg5NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0NCwgMHhEMywgMHg4MCwgMHg3QywgMHg2MCwgMHg0OCwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhCMCwgMHg4QSwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhENSwgMHg2MCwgMHg4NCwgMHhFNywgMHg2MiwgMHg0NywKKwkgMHg4MCwgMHhCRiwgMHg2MCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2NCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwKKwkgMHhGRSwgMHgwMSwgMHg2NSwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg5NSwgMHg2MCwgMHg4NCwgMHhFNywgMHgyRCwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg3QywgMHhCRCwgMHhEMywgMHhENSwgMHg2MCwgMHg4NCwgMHhFNywgMHg2MCwgMHg0NywgMHg4MCwgMHhCRiwgMHg2MCwgMHg0QSwKKwkgMHhCRCwgMHhEMywgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg5MCwgMHg4QSwgMHhCRCwgMHhEMywgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg5MCwgMHg4QSwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHhDRCwgMHg4MSwgMHg5NSwgMHg2MCwgMHg4NCwgMHhFNywgMHhFQiwgMHgwMiwgMHgyRCwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhENSwgMHg2MCwgMHg4NCwgMHhFNywgMHg2MiwgMHg0QSwgMHgwMiwgMHg2NCwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHhDQywgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHhGRCwgMHgwMiwgMHg3QywgMHg0OSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2OCwgMHg1QywgMHg3QywgMHg0OSwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2OCwgMHg0NCwgMHg5NSwgMHg2MCwgMHg4NCwgMHhFNywgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHg0MCwgMHhGRiwgMHgyMCwgMHg0NCwgMHhCRiwgMHhCNCwgMHg0MCwgMHg0MCwgMHgwMywgMHgwMCwgMHgyMCwgMHg0NCwgMHg0MCwgMHhCQywgMHg0MCwgMHg0MCwKKwkgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHgwMiwgMHgwMCwgMHg0MywgMHg0NSwgMHhGNiwgMHgwMSwgMHgwMCwgMHg2NCwKKwkgMHgxOSwgMHg2MCwgMHhGMiwgMHhGQiwgMHgzRiwgMHg0NCwgMHg0MCwgMHgyNiwgMHgwNSwgMHgwMCwgMHgxQywgMHg2MCwgMHgwRiwgMHhGMywgMHg1QSwgMHhEMSwKKwkgMHhBMCwgMHg1MCwgMHhBNCwgMHg1MCwgMHhBRSwgMHg0RiwgMHhGRCwgMHhCNCwgMHgwNCwgMHhCQywgMHhBMCwgMHg1RSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg3MSwKKwkgMHg4RCwgMHhFMiwgMHg0MCwgMHhFMSwgMHg0MCwgMHgyOSwgMHhGRSwgMHgwMSwgMHgwNCwgMHhBQywgMHhBMCwgMHg1RSwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwKKwkgMHgxMCwgMHg2MiwgMHgxOSwgMHg2MCwgMHg4RSwgMHg3QywgMHgwMCwgMHg2MCwgMHhBQywgMHg2NSwgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwRiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2MiwgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgzQiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgxOSwgMHg2MCwgMHg4RSwgMHg2NCwgMHg2NCwgMHg0MCwgMHhEMCwgMHg4MCwgMHgxNCwgMHg3MSwgMHgwNSwgMHgwMywgMHg4RCwgMHhFMiwKKwkgMHg0MCwgMHhFMSwgMHg0MCwgMHgyOSwgMHhGRSwgMHgwMSwgMHhFMiwgMHgwMSwgMHgzRiwgMHg0NCwgMHg0MCwgMHgyNiwgMHgwNSwgMHgwMCwgMHgxQywgMHg2MCwKKwkgMHgwRCwgMHhGMywgMHg1QSwgMHhEMSwgMHhBMCwgMHg1MCwgMHhBNCwgMHg1MiwgMHgyNywgMHg2MCwgMHgzNiwgMHg2MywgMHgxRSwgMHg2MSwgMHgzRCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHgyMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxNCwgMHg3MSwgMHg4RCwgMHhFMiwgMHg0MCwgMHhFMSwgMHg0MCwgMHgyOSwKKwkgMHhGRSwgMHgwMSwgMHgzMSwgMHg0NCwgMHg0MCwgMHgyNiwgMHgwMiwgMHgwMCwgMHg4MCwgMHgyNiwgMHgxNywgMHgwMCwgMHgyOCwgMHg2MCwgMHhFNiwgMHg2MywKKwkgMHgwNywgMHg2MCwgMHhFOCwgMHhGRCwgMHgwOSwgMHg2MSwgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMSwgMHg0NCwKKwkgMHg0MCwgMHgyQSwgMHgxNCwgMHgwMCwgMHgzMSwgMHg0NCwgMHg3RiwgMHhCNCwgMHg0MCwgMHg1MSwgMHhBRSwgMHg0QywgMHgxMCwgMHgyNiwgMHgwRSwgMHgwMCwKKwkgMHgwNywgMHg2MCwgMHhFOSwgMHhGQiwgMHgzMSwgMHg0NCwgMHg4MCwgMHhCQywgMHg0MCwgMHg1MSwgMHgyOSwgMHg2MCwgMHgxQywgMHg2MywgMHgwNywgMHg2MCwKKwkgMHhFOCwgMHhGRCwgMHgwOSwgMHg2MSwgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg2MCwgMHhFQSwgMHg2MywKKwkgMHgwMywgMHg2MSwgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2MiwgMHgxOSwgMHg2MCwKKwkgMHg4RiwgMHg3QywgMHgwMCwgMHg2MCwgMHhBQywgMHg2NSwgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MCwgMHhFMSwKKwkgMHhCRiwgMHhGRSwgMHhBMSwgMHg0RiwgMHg3MCwgMHhCNCwgMHg1MCwgMHgzNiwgMHgwQywgMHgwMCwgMHgyMCwgMHgzNiwgMHgwMywgMHgwMCwgMHgzQSwgMHg2MCwKKwkgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MCwgMHgxQSwgMHhFMSwgMHhERiwgMHhGRSwgMHgxOSwgMHhGRiwgMHgwMCwgMHhFMSwgMHhBMSwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHg0NCwgMHg0MCwgMHgyQSwgMHg4NSwgMHgwMCwgMHg3RCwgMHhGMSwgMHgzQiwgMHgwMCwgMHg4MywgMHgwMCwgMHgxOSwgMHg2MCwKKwkgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHgxOCwgMHg1OSwgMHgwMSwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwKKwkgMHgxQywgMHg2MCwgMHgwRiwgMHhGMywgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgwMSwgMHgwMCwgMHhBMCwgMHg1MCwgMHhBRSwgMHg0RiwgMHhGRCwgMHhCNCwKKwkgMHhBMCwgMHg1RSwgMHhBQywgMHg0RiwgMHgxMCwgMHhCQywgMHhBMCwgMHg1QywgMHhGRiwgMHhGRiwgMHgxMCwgMHhBQywgMHhBMCwgMHg1QywgMHgwMCwgMHg2MCwKKwkgMHhDOCwgMHg3MSwgMHg4RCwgMHhFMiwgMHg0MCwgMHhFMSwgMHg0MCwgMHgyOSwgMHhGRSwgMHgwMSwgMHg3RCwgMHhGMSwgMHgzMCwgMHg2MSwgMHg2NCwgMHg0NCwKKwkgMHgwMSwgMHgyQiwgMHgyMCwgMHhBMSwgMHgzMCwgMHg2NCwgMHg2MSwgMHg1RiwgMHg2MCwgMHg0NSwgMHgwQywgMHg2MCwgMHgwMCwgMHg2MiwgMHgwMCwgMHg2MCwKKwkgMHg3MSwgMHg3QywgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHhDOCwgMHg3MSwgMHg4RCwgMHhFMiwKKwkgMHg0MCwgMHhFMSwgMHg0MCwgMHgyOSwgMHhGRSwgMHgwMSwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHg3RCwgMHhGMSwgMHgyMCwgMHg0NCwgMHg0MCwgMHhCQywKKwkgMHg0MCwgMHg0MCwgMHgxOSwgMHg2MCwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMywgMHgxOCwgMHgzRCwgMHg2MCwgMHg1NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxQiwgMHg2MCwgMHhGMywgMHhGMSwgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwgMHhGQSwgMHhCNCwgMHg2NCwgMHg0MSwgMHg3RCwgMHhGMSwgMHgwMiwgMHhCMSwKKwkgMHgwNCwgMHg2NSwgMHgwMiwgMHgwMiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwMSwgMHg2NSwgMHhCNCwgMHg4NCwgMHhBMCwgMHg1RCwgMHgyMCwgMHg0NCwKKwkgMHg0MCwgMHgyQSwgMHg0MywgMHg0NSwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHhBMSwgMHhGOSwgMHgwNSwgMHg2NCwgMHhBMiwgMHhGQiwgMHhERiwgMHhGRSwKKwkgMHgxOSwgMHhGRiwgMHhERCwgMHhGRSwgMHgyNiwgMHgwMCwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg0MywgMHg0NSwgMHhBNCwgMHhEMSwKKwkgMHhEQSwgMHg4MywgMHhDMywgMHg4NSwgMHg4MCwgMHhFMSwgMHhERiwgMHhGRSwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0OCwgMHg2MCwgMHg0NywKKwkgMHg4MCwgMHhCQywgMHgwMCwgMHg3RiwgMHg2MCwgMHg0QSwgMHhENywgMHg4MCwgMHhBMSwgMHhGRiwgMHhGNiwgMHgwMiwgMHhCRiwgMHhGRSwgMHgxMSwgMHgwMCwKKwkgMHg0MywgMHg0NSwgMHhBNCwgMHhEMSwgMHhEQSwgMHg4MywgMHgwRCwgMHgxOCwgMHg2NCwgMHg0NCwgMHgwMCwgMHg2MSwgMHhGQSwgMHhBNCwgMHhERCwgMHg4MSwKKwkgMHhGRCwgMHgwMiwgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyMywgMHg3OCwgMHhGRiwgMHhGRiwgMHhCRiwgMHhGRSwgMHgwMiwgMHgwMCwgMHhGMSwgMHhGRSwKKwkgMHgwMSwgMHgwMCwgMHgyNSwgMHg0MywgMHgyMSwgMHhFMSwgMHgwMCwgMHg2NCwgMHhCRiwgMHhEQiwgMHgyMCwgMHg0NCwgMHgyMCwgMHgyQSwgMHgwNywgMHgwMCwKKwkgMHgwNywgMHhCNCwgMHgwNCwgMHgzNiwgMHhDMywgMHhGRSwgMHgwNiwgMHgzNiwgMHhDQywgMHhGRSwgMHgwNywgMHgzNiwgMHhENSwgMHhGRSwgMHgyMCwgMHg0NCwKKwkgMHg5OCwgMHhCNCwgMHg0MCwgMHg0MCwgMHgyNiwgMHg2MCwgMHgyNiwgMHg2MywgMHhCRCwgMHhEMywgMHgwMywgMHg2MSwgMHgwRiwgMHgxQiwgMHgwNCwgMHhBMywKKwkgMHhCRCwgMHhEMywgMHgwNCwgMHg2MSwgMHgwQiwgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwNiwgMHg2MSwgMHgwNywgMHgxQiwgMHgwNCwgMHhBMywKKwkgMHhCRCwgMHhEMywgMHgwNywgMHg2MSwgMHgwMywgMHgxQiwgMHhDMywgMHg2MCwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhEMSwgMHg0MCwgMHg0NCwKKwkgMHgyMCwgMHg0NCwgMHgwNywgMHhCNSwgMHhENCwgMHg4NSwgMHgzNSwgMHg4MCwgMHgyNCwgMHg0NSwgMHgyNiwgMHg2MCwgMHg2NiwgMHg2NCwgMHg0NCwgMHhENywKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg2NCwgMHg0MywgMHhCRCwgMHhEMywKKwkgMHhCRCwgMHhEMSwgMHg0MCwgMHg0NCwgMHgxMCwgMHgyNywgMHgxOSwgMHgwMCwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwgMHgwNiwgMHgwMCwgMHgyNCwgMHg0NywKKwkgMHgwOCwgMHgyQiwgMHgxMywgMHgwMCwgMHgwNywgMHhCNCwgMHgwMSwgMHgzNiwgMHgxMSwgMHgwMCwgMHhGRiwgMHg2MCwgMHg3RiwgMHg2NSwgMHgxNSwgMHg2MCwKKwkgMHhBMiwgMHg2NCwgMHgyNCwgMHg0MCwgMHgwOCwgMHgyQiwgMHhBNCwgMHg4NCwgMHhBMCwgMHg1NywgMHhGRiwgMHhGRiwgMHg2NCwgMHg0OSwgMHhGRiwgMHhGRiwKKwkgMHg2OCwgMHg0NCwgMHgwMSwgMHgxNiwgMHhGRCwgMHgwMSwgMHgwMCwgMHg3RiwgMHhBMywgMHhEQiwgMHhBQiwgMHgwMSwgMHg2NCwgMHg0MiwgMHgzRCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHgzQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCRCwgMHhEOSwgMHhBMywgMHhEQiwgMHhBMywgMHgwMSwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwKKwkgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg2NCwgMHg0MywgMHhCRCwgMHhEMywgMHhBMywgMHhEMSwgMHg0MCwgMHg0NCwgMHgxMCwgMHgyQiwgMHgxNiwgMHgwMCwKKwkgMHhCRSwgMHhEMSwgMHhGRiwgMHhGRiwgMHgxNSwgMHg2MCwgMHg4MCwgMHhFNywgMHgyNCwgMHg0MCwgMHgwNywgMHgyNywgMHgwNCwgMHgwMCwgMHhBQywgMHg0RiwKKwkgMHgxMCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1QywgMHg2NCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgyNCwgMHg0MCwKKwkgMHgyMCwgMHgyNywgMHgxRCwgMHgwMCwgMHhBQywgMHg0RiwgMHhFRiwgMHhCNCwgMHhBMCwgMHg1QywgMHgxOSwgMHgwMCwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwKKwkgMHgwNiwgMHgwMCwgMHgyNCwgMHg0NywgMHgwOCwgMHgyQiwgMHgxMywgMHgwMCwgMHgwNywgMHhCNCwgMHgwMSwgMHgzNiwgMHgxMSwgMHgwMCwgMHgxNSwgMHg2MCwKKwkgMHgyMiwgMHg2NCwgMHgyNCwgMHg0MCwgMHgwOCwgMHgyNywgMHg4MCwgMHhCQywgMHg3QywgMHg0OCwgMHhCRSwgMHhEMywgMHhBMCwgMHg1NywgMHg2MCwgMHg0OCwKKwkgMHg2NCwgMHg0NCwgMHg4MCwgMHhCQywgMHhGRiwgMHhCNCwgMHg2MCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2OSwgMHgwMSwKKwkgMHgwMSwgMHg2MSwgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyMywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MywgMHgwMSwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwKKwkgMHgwMCwgMHhFMSwgMHgwNywgMHgwMiwgMHg2MiwgMHhGRiwgMHg2MywgMHhGRiwgMHg2NCwgMHhGRiwgMHg2NSwgMHhGRiwgMHg2NiwgMHhGRiwgMHhCRiwgMHhGRSwKKwkgMHhBMSwgMHhGRiwgMHg4MiwgMHhGRiwgMHg4OCwgMHhGRiwgMHg2QywgMHg0MCwgMHg0MSwgMHhGRiwgMHhDNCwgMHhFMiwgMHg0MywgMHhGRiwgMHg1QywgMHg0OSwKKwkgMHgwOCwgMHhFMSwgMHhBMiwgMHg2MCwgMHg0MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwMiwgMHgwMiwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGRiwgMHg4OCwgMHhGRiwgMHhBOCwgMHhFMiwgMHhDQiwgMHhGMSwgMHgwMCwgMHg2QiwgMHg4OSwgMHhGRiwKKwkgMHg2NCwgMHg1NCwgMHg4OCwgMHhGRiwgMHg5RiwgMHhGRSwgMHgwMiwgMHgwNSwgMHg2NCwgMHg0NCwgMHg2MCwgMHg1NCwgMHhDRCwgMHhFMiwgMHhDMiwgMHg2NCwKKwkgMHgzQSwgMHhEQiwgMHhCQywgMHhGRiwgMHhCNSwgMHhGRiwgMHgxRCwgMHhGRiwgMHgyNiwgMHg0NCwgMHgwMiwgMHhCNCwgMHg0MCwgMHg0NiwgMHgzQywgMHg0NCwKKwkgMHgwMCwgMHhCQywgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMywgMHgyNywgMHg0MCwgMHgyNiwgMHgyMiwgMHgwMywgMHgwMCwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwKKwkgMHhDMCwgMHhGRSwgMHgyNywgMHg0NCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhCMCwgMHg2MCwgMHgwMCwgMHhFQSwKKwkgMHg1QywgMHg0NCwgMHgyNywgMHg0NCwgMHgxOCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwMCwgMHhFMSwgMHgyOSwgMHg0MCwgMHg1MCwgMHgyQiwgMHgzNywgMHgwMCwKKwkgMHhFRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyOSwgMHg0NCwgMHgyNCwgMHg4OSwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyNiwgMHgwQiwgMHgwMCwgMHgyMSwgMHg0NiwKKwkgMHhBNywgMHhGNCwgMHgxRCwgMHhGMiwgMHhGRiwgMHhCMywgMHgwMCwgMHg3QywgMHgwNSwgMHgwMywgMHgwNiwgMHg2MSwgMHg1RCwgMHg5MSwgMHgwOSwgMHg2MCwKKwkgMHgwMiwgMHg2NSwgMHgwMiwgMHgwMywgMHgwMCwgMHg2MSwgMHgxNSwgMHgwMCwgMHhENCwgMHg4MCwgMHg2MywgMHg0NSwgMHhGQiwgMHgwNywgMHg2NSwgMHg0MywKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHg2MiwgMHhGNiwgMHg4MiwgMHg1MywgMHg5MCwgMHhFMywgMHg4MywgMHhGQywgMHgwNCwgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywKKwkgMHhFQSwgMHg4MiwgMHg1QywgMHg5NCwgMHhCMiwgMHg5QywgMHhGMywgMHgwNywgMHg2NCwgMHg0MSwgMHhERCwgMHg4MSwgMHhFMSwgMHg4MSwgMHhFMSwgMHg4MSwKKwkgMHhFMSwgMHg4MSwgMHgyQiwgMHg0NCwgMHg1NCwgMHg5MCwgMHg3MCwgMHg0NSwgMHgwMiwgMHgyOCwgMHg2MSwgMHg0NCwgMHhDNCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgyNCwgMHgwMCwgMHhCNCwgMHg2MCwgMHg1MCwgMHgwOCwgMHgyOCwgMHgwMSwgMHgwMCwgMHgyMCwgMHgyOSwgMHg2RCwgMHhFMiwgMHhBNCwgMHhFMiwKKwkgMHhDNCwgMHhFMiwgMHg0NywgMHhGRiwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHgzMiwgMHhGMSwgMHgwOCwgMHgyOSwgMHgwOSwgMHgwMCwKKwkgMHg2NCwgMHg0MCwgMHgwNywgMHgyMiwgMHgwNiwgMHgwMCwgMHg0MywgMHhGRiwgMHgyNywgMHg0NCwgMHgxMCwgMHhCQywgMHg0MCwgMHg0NywgMHgwMCwgMHg2NCwKKwkgMHgzMiwgMHhGQiwgMHgzMSwgMHg0MSwgMHgzQywgMHg0NCwgMHgwMSwgMHhCMSwgMHgwMCwgMHhCQywgMHgwQSwgMHgwMiwgMHgwOSwgMHgwMywgMHgzMiwgMHhGMywKKwkgMHgwMCwgMHg3QywgMHgwMSwgMHhCNCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMywgMHgzMiwgMHhGOSwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwKKwkgMHhDOCwgMHg2MCwgMHgwOSwgMHg3RCwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgwMCwgMHg2NCwgMHgzMywgMHhGQiwgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwKKwkgMHhBMCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHhFMSwgMHgzMCwgMHg0MCwgMHgwMiwgMHgzNiwgMHhBMSwgMHhGRiwgMHg4MywgMHhGRiwKKwkgMHg4RCwgMHhGRiwgMHg1QywgMHg0NCwgMHg1QywgMHg0MywgMHg1QywgMHg0MiwgMHg1QywgMHg0MSwgMHg1QywgMHg0MCwgMHhBQywgMHhGRiwgMHhBRCwgMHhGRiwKKwkgMHhFNywgMHhFMSwgMHhCMywgMHg2MCwgMHhGQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwMywgMHgwMiwKKwkgMHgyOCwgMHhFMiwgMHg0MCwgMHhGRiwgMHhBMSwgMHhGRiwgMHg4NCwgMHhGRiwgMHhDMiwgMHg2MCwgMHg0NSwgMHg2NCwgMHg0MCwgMHg0MiwgMHhCNywgMHg2MCwKKwkgMHhGNywgMHg2NCwgMHg0MCwgMHg0MCwgMHhCQSwgMHhGMywgMHg3RSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MywgMHhDNywgMHhGMywgMHhCRCwgMHhEQiwKKwkgMHgwMCwgMHg2MCwgMHg5QSwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwMiwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNCwgMHg2NCwgMHhBMywgMHhEQiwgMHg1QywgMHg0OSwKKwkgMHgwQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHg1QywgMHg1QywgMHgwMSwgMHg2MCwgMHgzOSwgMHhFMiwgMHgwNCwgMHg2MCwgMHgwMCwgMHg3QSwgMHg4OSwgMHhGRiwKKwkgMHgwMywgMHg2MCwgMHhGRiwgMHg3MywgMHg4OCwgMHhGRiwgMHhCNywgMHg2MCwgMHhGNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwKKwkgMHgwMCwgMHhFMSwgMHgwNiwgMHgwMiwgMHg0MCwgMHhGRiwgMHg0MiwgMHhGRiwgMHg0MywgMHhGRiwgMHg0NCwgMHhGRiwgMHg0NSwgMHhGRiwgMHhBMSwgMHhGRiwKKwkgMHg4OCwgMHhGRiwgMHg4NSwgMHhGRiwgMHgyMSwgMHhFMSwgMHg1QywgMHg0MCwgMHhDMywgMHg2MCwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwKKwkgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwMSwgMHgwMiwgMHhBMSwgMHhGRiwgMHg4NiwgMHhGRiwgMHg4OCwgMHhGRiwgMHg1QywgMHg0NiwKKwkgMHg1QywgMHg0OSwgMHg1QywgMHg0MCwgMHhFRiwgMHg2MCwgMHg1OCwgMHg0RiwgMHgxQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRCwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHg4MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMywgMHg2MCwgMHg1OCwgMHg0RiwgMHg1OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFNywgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHg5OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg2MCwgMHg1OCwgMHg0RiwgMHgxOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGNCwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHhFOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhDQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHg3MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFRSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg2OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHhFMSwgMHhBMywgMHhGRiwKKwkgMHhDQSwgMHg2MCwgMHhENCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMywgMHhFMSwgMHhBMywgMHhGRiwgMHhGRSwgMHhGQywgMHhGRiwgMHhGQywgMHgyNSwgMHg2MCwKKwkgMHg5NiwgMHg2MywgMHgxNywgMHhGRCwgMHhBRSwgMHhGRiwgMHgyQSwgMHg2MCwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0MiwgMHg2RiwgMHg2RiwgMHg3NCwKKwkgMHg2MywgMHg2RiwgMHg2NCwgMHg2NSwgMHgyMCwgMHgyMSwgMHgyMSwgMHgyMCwgMHgyMCwgMHgwMCwgMHg1MywgMHg1NCwgMHg0MSwgMHgyRiwgMHg0MSwgMHg1MCwKKwkgMHgyMCwgMHg0NiwgMHg3NSwgMHg2RSwgMHg2MywgMHgyNywgMHg3MywgMHgwMCwgMHgxRiwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgyNCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNCwgMHgwMCwKKwkgMHgwNiwgMHgwMCwgMHgwNywgMHgwMCwgMHgwNSwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwNywgMHgwMCwgMHgwNiwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwNywgMHgwMCwKKwkgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMSwgMHgwMCwgMHhBNiwgMHhGMywgMHgyMSwgMHg2MSwgMHgwMCwgMHg3QywgMHgwMSwgMHgwMCwgMHgwMCwgMHhGQSwKKwkgMHg2MCwgMHg0NiwgMHhGRSwgMHg2MywgMHhBMywgMHhEOCwgMHhGRSwgMHgxRiwgMHhDRCwgMHg4MSwgMHhEOCwgMHg4NCwgMHhGOCwgMHgwMiwgMHgyMSwgMHg2MSwKKwkgMHg4MCwgMHg2NywgMHg0MCwgMHg0QSwgMHhBNiwgMHhGNSwgMHgwNSwgMHgxOCwgMHgyQSwgMHg0MywgMHgwMiwgMHhGQywgMHg1RiwgMHg4QSwgMHgwMCwgMHhGNCwKKwkgMHhGQSwgMHgwMSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBOCwgMHhGMSwgMHhBNywgMHhGMywgMHg3QywgMHg2MywgMHhBQSwgMHhGQiwgMHg2MCwgMHg0NiwKKwkgMHgwMSwgMHhGQywgMHhEQywgMHg4NCwgMHhEMCwgMHg4MCwgMHgwMCwgMHhGQSwgMHhGQSwgMHgwNCwgMHhBQiwgMHhGQiwgMHg2MCwgMHg0NiwgMHgwMCwgMHg2NCwKKwkgMHgwMCwgMHhGQSwgMHg2MywgMHg0NCwgMHg4MCwgMHg3RiwgMHgwMSwgMHhGQSwgMHhBOCwgMHhGMywgMHhBNywgMHhGMSwgMHhEQywgMHg4NCwgMHhEMCwgMHg4NCwKKwkgMHhBOSwgMHhGQiwgMHgwMywgMHg2MCwgMHgyNiwgMHg2MSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwKKwkgMHgyRSwgMHhGQiwgMHg4MiwgMHhGRiwgMHg0MCwgMHg0MiwgMHg4NywgMHhGRiwgMHhBOSwgMHhGMywgMHhCMSwgMHhGQiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg1MCwKKwkgMHg2MywgMHhGRiwgMHg2MCwgMHhGRiwgMHg2NiwgMHhGRiwgMHg2NSwgMHhGRiwgMHg2NCwgMHhGRiwgMHg2MSwgMHhGRiwgMHg2MiwgMHhGRiwgMHg0OSwgMHg2MCwKKwkgMHgwMiwgMHhFMSwgMHg1MiwgMHg2MCwgMHgwMiwgMHhFMSwgMHg1QywgMHg2MCwgMHgwMiwgMHhFMSwgMHg2NSwgMHg2MCwgMHgwMiwgMHhFMSwgMHg2QiwgMHg2MCwKKwkgMHgwMiwgMHhFMSwgMHg3NiwgMHg2MCwgMHgwMiwgMHhFMSwgMHg0MSwgMHg2MCwgMHgwMiwgMHhFMSwgMHgwQywgMHg2NCwgMHgxMywgMHg2MCwgMHgxQywgMHhGQiwKKwkgMHg0MSwgMHg2MCwgMHgwNywgMHg2NCwgMHg5RiwgMHhGQiwgMHgyRCwgMHhGRiwgMHgwNiwgMHg2MSwgMHg0MSwgMHg0QiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2MSwKKwkgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGMCwgMHg2NywgMHgwRSwgMHhGQSwgMHgyNiwgMHg2MCwgMHgwNCwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgxMCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHgyQiwgMHg0MSwgMHg0RCwgMHg4QiwgMHhGRiwgMHhGRiwgMHhFQSwgMHgwMiwgMHgwNSwgMHg2MSwgMHg0MSwgMHg0QiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2MSwKKwkgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg2MCwgMHhGOCwgMHg2NCwgMHgxMywgMHg2MCwgMHgxMCwgMHhGQiwKKwkgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgyQiwgMHg0MSwgMHg0RCwgMHg4QiwKKwkgMHhGRiwgMHhGRiwgMHhFQywgMHgwMiwgMHg0MCwgMHg2MCwgMHg0NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhFQSwgMHgwMCwgMHhFQiwgMHg1MCwgMHg2MCwKKwkgMHgwMywgMHhFQSwgMHg1MSwgMHg2MCwgMHgxMywgMHhFQSwgMHg1MiwgMHg2MCwgMHgzMCwgMHhFQSwgMHg1MywgMHg2MCwgMHg0MCwgMHhFQSwgMHg1NCwgMHg2MCwKKwkgMHg1MiwgMHhFQSwgMHg1NSwgMHg2MCwgMHg2RCwgMHhFQSwgMHg1NiwgMHg2MCwgMHg3MSwgMHhFQSwgMHg1NywgMHg2MCwgMHg4QiwgMHhFQSwgMHg1OCwgMHg2MCwKKwkgMHg0NywgMHhFQSwgMHg1OSwgMHg2MCwgMHhBMCwgMHhFQSwgMHg1QSwgMHg2MCwgMHhCMiwgMHhFQSwgMHg1QiwgMHg2MCwgMHhDMSwgMHhFQSwgMHg1QywgMHg2MCwKKwkgMHhENywgMHhFQSwgMHg1RCwgMHg2MCwgMHhFQiwgMHhFQSwgMHg1RSwgMHg2MCwgMHhBMCwgMHhFQSwgMHg1MCwgMHg2MCwgMHgzNiwgMHhFQiwgMHg1MSwgMHg2MCwKKwkgMHgzNywgMHhFQiwgMHg1MiwgMHg2MCwgMHgyMCwgMHhFQiwgMHg1MywgMHg2MCwgMHhFNCwgMHhFQiwgMHg1NCwgMHg2MCwgMHgzNCwgMHhFQiwgMHg1NSwgMHg2MCwKKwkgMHg1OCwgMHhFQiwgMHg1NiwgMHg2MCwgMHg0OCwgMHhFQiwgMHg1NywgMHg2MCwgMHhEMCwgMHhFQiwgMHg1OCwgMHg2MCwgMHhDMywgMHhFQiwgMHg1OSwgMHg2MCwKKwkgMHhGQywgMHhFQiwgMHg1QSwgMHg2MCwgMHgzNCwgMHhFQiwgMHg1QiwgMHg2MCwgMHg1OCwgMHhFQiwgMHg1QywgMHg2MCwgMHhDMCwgMHhFQiwgMHg1RCwgMHg2MCwKKwkgMHhEMCwgMHhFQiwgMHg1RSwgMHg2MCwgMHg5MSwgMHhFQiwgMHgwMCwgMHhFQSwgMHgwMCwgMHhFQiwgMHhFMCwgMHg2MCwgMHgwMiwgMHhFQSwgMHhFMCwgMHg2MCwKKwkgMHgwMywgMHhFQiwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQiwgMHhCMCwgMHg2MCwgMHgwMCwgMHhFQiwgMHhBQiwgMHg0OCwgMHg0MCwgMHgzQiwgMHgwMSwgMHgwMCwKKwkgMHhGQywgMHgwMSwgMHgwMCwgMHhFQiwgMHgwMywgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHhEQiwgMHgwRiwgMHg2NCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHgyNCwgMHg0NCwgMHhGRiwgMHhCNCwKKwkgMHgwNCwgMHhGQiwgMHg1MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwNSwgMHhGQiwgMHgxMCwgMHg2MCwgMHgxMCwgMHg3NSwgMHgyQSwgMHg2MCwgMHgxRCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHg0MCwgMHgwMCwgMHgwNSwgMHg2MCwgMHhGOSwgMHhGMSwgMHg0MiwgMHg2MCwgMHgwOCwgMHg2NCwKKwkgMHgwOSwgMHg2MCwgMHgxOSwgMHg2MywgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwNCwgMHgwMCwgMHg0MiwgMHg2MCwgMHgwOSwgMHg2NCwgMHgwQSwgMHg2MCwKKwkgMHgxOSwgMHg2MywgMHgxQywgMHg2MCwgMHgwRiwgMHhGQiwgMHgwNCwgMHg2MCwgMHgwMCwgMHhCQywgMHgxQywgMHg2MCwgMHgwQiwgMHhGQiwgMHgxQywgMHg2MCwKKwkgMHgwQSwgMHhGRCwgMHgxRCwgMHg2MCwgMHgxOSwgMHg2MywgMHgxQywgMHg2MCwgMHgwRSwgMHhGRCwgMHg4MCwgMHg2MCwgMHgxQywgMHg2NCwgMHgzRiwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwMiwgMHgwMCwgMHg2MCwgMHg2MCwgMHgxQywgMHg2NCwgMHgxQywgMHg2MCwgMHgxMCwgMHhGQiwgMHgxQywgMHg2MCwgMHgwQywgMHhGQiwKKwkgMHgxQywgMHg2MCwgMHgwRiwgMHhGMywgMHhBMCwgMHg1MCwgMHhBMCwgMHg1MCwgMHgwQiwgMHg2MCwgMHhGOCwgMHg2MywgMHhBMywgMHhEMSwgMHgzOCwgMHg2MCwKKwkgMHgxMiwgMHg2MSwgMHhBMSwgMHhEMywgMHhGOCwgMHhBMywgMHg5MCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBMywgMHhEMSwgMHg1OSwgMHhEMywgMHgwNiwgMHhBMywKKwkgMHg5MCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBMywgMHhEMSwgMHg1OSwgMHhEMywgMHhGRSwgMHhBMywgMHg5MCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBMywgMHhEMSwKKwkgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg5MCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4MCwgMHg2MCwgMHg1OCwgMHhFQywgMHg4MCwgMHg2MCwgMHgwMCwgMHhFRCwKKwkgMHg4MCwgMHg2MCwgMHg4MCwgMHhFRSwgMHg0MCwgMHhFQywgMHgwMCwgMHhFRCwgMHgwMCwgMHhFRSwgMHhDMCwgMHg2MCwgMHg1OSwgMHhFQywgMHhDMCwgMHg2MCwKKwkgMHgwNywgMHhFRCwgMHhDMCwgMHg2MCwgMHg4RiwgMHhFRSwgMHhBRCwgMHg0RiwgMHhGQSwgMHhCNCwgMHhBMCwgMHg1RCwgMHgwMCwgMHhGMywgMHgyOCwgMHhGQiwKKwkgMHg0MCwgMHg0NCwgMHgzNywgMHg2MCwgMHg3QiwgMHg3QywgMHgyMCwgMHhGOSwgMHgzRiwgMHg2MCwgMHgxOCwgMHg3QywgMHgyMSwgMHhGOSwgMHgzRiwgMHg2MCwKKwkgMHgyRSwgMHg3QywgMHgyMiwgMHhGOSwgMHgzRiwgMHg2MCwgMHhDNSwgMHg3QywgMHgyMywgMHhGOSwgMHgzRiwgMHg2MCwgMHhENiwgMHg3QywgMHgyNCwgMHhGOSwKKwkgMHg0MCwgMHg2MCwgMHgwMCwgMHg3QywgMHgyNSwgMHhGOSwgMHg0MCwgMHg2MCwgMHgxMSwgMHg3QywgMHgyNiwgMHhGOSwgMHhEMCwgMHg2MCwgMHgwMCwgMHhFOCwKKwkgMHgyOCwgMHhFOCwgMHg0NCwgMHg2MCwgMHgwMSwgMHhFNiwgMHgxMCwgMHg2NywgMHg0MCwgMHg1MiwgMHgxMCwgMHg2MCwgMHgwNCwgMHhFNiwgMHgwOCwgMHg2MCwKKwkgMHgwNiwgMHg2MywgMHhGRCwgMHg2MCwgMHgwQywgMHg2NSwgMHg1QiwgMHhEMywgMHhCRiwgMHhEMSwgMHgxMCwgMHgxOCwgMHhDMywgMHg4MywgMHhENCwgMHg4MCwKKwkgMHhDMywgMHg4MywgMHhGOSwgMHgwMiwgMHhGQSwgMHhBMywgMHhBMywgMHhEMywgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NSwgMHhGOSwgMHhBMCwgMHhGQywgMHhBMCwKKwkgMHgwRCwgMHgwNSwgMHgwNCwgMHgwNSwgMHg3OCwgMHg0MywgMHgwMiwgMHg2MSwgMHgyOSwgMHg2MCwgMHhFQSwgMHg3OCwgMHgyMSwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHgzRiwgMHg0MywgMHgyMSwgMHg2MCwgMHgwMCwgMHg2NSwgMHhDMCwgMHg2MCwgMHg4RiwgMHhFRSwgMHgwOCwgMHgwMCwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgxOCwgMHhGQiwgMHgzRiwgMHg0MywgMHgxMSwgMHg2MCwgMHgxMCwgMHhFNiwgMHhCNywgMHg4NCwgMHg0MCwgMHg1RiwKKwkgMHgzNywgMHg2MCwgMHhGOCwgMHg2MywgMHgzRiwgMHg0MCwgMHgyMCwgMHgyNywgMHgwNiwgMHgwMCwgMHgwRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhCRCwgMHhEQiwKKwkgMHgwRiwgMHg2MCwgMHhGMCwgMHg2NCwgMHgwMywgMHgwMCwgMHgwRiwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwMCwgMHg2NCwgMHhBMywgMHhEQiwgMHgwMCwgMHg2MCwKKwkgMHgzMCwgMHhFMiwgMHgwMCwgMHg2MCwgMHg1MCwgMHhFMiwgMHgwMCwgMHg2MCwgMHg3OSwgMHhFMiwgMHgwMCwgMHg2MCwgMHg5MCwgMHhFMiwgMHgwMSwgMHg2MCwKKwkgMHhEMCwgMHhFMiwgMHgwMSwgMHg2MCwgMHhGMCwgMHhFMiwgMHgwMSwgMHg2MCwgMHhCMCwgMHhFMiwgMHgxMywgMHg2NCwgMHhDQiwgMHhGQiwgMHgwMSwgMHg2MCwKKwkgMHg2NywgMHg2NCwgMHgzNywgMHhGQiwgMHgwMCwgMHg2MCwgMHgyOCwgMHg2NCwgMHgzNiwgMHhGQiwgMHgwOSwgMHg2MCwgMHgyQSwgMHg2NCwgMHhCNiwgMHhGQiwKKwkgMHg4MiwgMHhGRiwgMHg5MiwgMHhGRiwgMHg1QywgMHg0MSwgMHg1QywgMHg0NiwgMHg1QywgMHg0NywgMHgwMCwgMHhFMSwgMHhBMywgMHg2MCwgMHhGNCwgMHg2MywKKwkgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMCwgMHhERCwgMHg4NywgMHhGRiwgMHg5NywgMHhGRiwgMHgwQywgMHg2MCwgMHgwMiwgMHg2NCwgMHg0MCwgMHg1QSwKKwkgMHgwNiwgMHhBNCwgMHg0MCwgMHg1QiwgMHg1QywgMHg1RSwgMHgxNiwgMHg2MCwgMHhDRiwgMHhGMywgMHg3RCwgMHhGQiwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyMiwKKwkgMHgwMywgMHgwMCwgMHg4MCwgMHg2MCwgMHgzNywgMHg3QywgMHgwMiwgMHgwMCwgMHg4MCwgMHg2MCwgMHgyNywgMHg3QywgMHgxQSwgMHg2MCwgMHgxRiwgMHhGOSwKKwkgMHgwMSwgMHg2MCwgMHgwNiwgMHg2NCwgMHhBNywgMHhGQiwgMHgwMiwgMHg2MCwgMHg3RiwgMHg2NCwgMHgwMCwgMHg2MCwgMHg0MiwgMHg2NSwgMHhENCwgMHg4NCwKKwkgMHhBOCwgMHhGQiwgMHhEQywgMHg4NCwgMHhBNiwgMHhGQiwgMHgxMiwgMHg2MCwgMHhEOCwgMHhGQiwgMHg0MCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3RCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgwNSwgMHgwMCwgMHgxQywgMHg2MCwgMHgwRCwgMHhGMywgMHg1QSwgMHhEMSwgMHhBMCwgMHg1MCwKKwkgMHhBNCwgMHg1MiwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2MywgMHhGQSwgMHg2MCwgMHgwMCwgMHg2NSwgMHhCRCwgMHhEMywgMHhBMywgMHhEMywgMHgwMiwgMHhBOCwKKwkgMHhENCwgMHg4MCwgMHgyMSwgMHgwMiwgMHgyMCwgMHgwMiwgMHgxOSwgMHg2MCwgMHg0OCwgMHhGMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHg4MCwgMHgyNiwKKwkgMHgxQSwgMHgwMCwgMHgwNCwgMHhBMywgMHhGRCwgMHg2MCwgMHgwRCwgMHg2NSwgMHg1QiwgMHhEMywgMHhCRiwgMHhEMSwgMHgxNCwgMHgxOCwgMHhDMywgMHg4MywKKwkgMHhENCwgMHg4MCwgMHhDMywgMHg4MywgMHhGOSwgMHgwMiwgMHhCRiwgMHhEMywgMHhBRCwgMHg0OSwgMHhGRSwgMHhBMCwgMHgwMCwgMHg2NCwgMHgwQywgMHgwNCwKKwkgMHgwOCwgMHhCMSwgMHgyMCwgMHhCQywgMHgwOCwgMHgyOCwgMHgxOCwgMHhCQywgMHgwNywgMHg3QywgMHgwRSwgMHg2MCwgMHhERiwgMHhGOSwgMHgwNSwgMHg3QywKKwkgMHgwRSwgMHg2MCwgMHhERSwgMHhGOSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwRSwgMHg2MCwgMHhERCwgMHhGQiwgMHg0MCwgMHg2MCwgMHg5NSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg1QywgMHg1MSwgMHgzRiwgMHg0MSwgMHhBNSwgMHg0QywgMHg1MCwgMHgzNywgMHgwQiwgMHgwMCwgMHgwMSwgMHhCOSwgMHg0MSwgMHg1RiwKKwkgMHhCNSwgMHg2MCwgMHg1NSwgMHhFMCwgMHgwNSwgMHg2MCwgMHhGOSwgMHhGMSwgMHhDMCwgMHg2NywgMHg5MCwgMHg4NCwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyNiwKKwkgMHhBMCwgMHg1MCwgMHgwNiwgMHg2MCwgMHgwOCwgMHhGMywgMHgwMSwgMHg2MCwgMHgwMSwgMHg2NSwgMHgwMSwgMHg2MCwgMHgwMiwgMHg3QywgMHhENCwgMHg4MCwKKwkgMHhEMCwgMHg4MCwgMHgwMSwgMHgwMywgMHgxMCwgMHgwMiwgMHg1QSwgMHhEMSwgMHg1QSwgMHhEMywgMHgzQywgMHg2MCwgMHgwMCwgMHg2NiwgMHhFMCwgMHg4NywKKwkgMHg0MCwgMHg0QSwgMHg4MCwgMHg2MCwgMHg5RSwgMHg2MSwgMHg2NCwgMHg0NCwgMHhDOCwgMHg4NCwgMHgwQywgMHg2MywgMHhBQSwgMHg0NiwgMHg1OCwgMHhEMCwKKwkgMHhBQSwgMHg0NiwgMHg1OSwgMHhEOCwgMHhGQiwgMHgxRiwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2MywgMHhGQSwgMHg2MCwgMHgwMCwgMHg2NSwgMHhCRCwgMHhEMywKKwkgMHhBMywgMHhEMywgMHgwMiwgMHhBOCwgMHhENCwgMHg4MCwgMHgwNywgMHgwMiwgMHgwNiwgMHgwMiwgMHg4QywgMHg2MCwgMHhCQSwgMHg2MSwgMHgzQywgMHg2MCwKKwkgMHgwMCwgMHg2NiwgMHg0MSwgMHg0QiwgMHgwMywgMHgwMCwgMHg0NiwgMHg2MCwgMHgzQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQiwgMHg0MSwgMHg4RCwgMHg2MCwKKwkgMHgwMiwgMHg3QywgMHhEMSwgMHg4MCwgMHhBMSwgMHhEMiwgMHgyNSwgMHgwNSwgMHg1OSwgMHhEMCwgMHg2MCwgMHg0NSwgMHg1OSwgMHhEMiwgMHg0NCwgMHg0NywKKwkgMHhFMCwgMHg4NywgMHg0MCwgMHg0QSwgMHg1OSwgMHhEMiwgMHg1OSwgMHg4QiwgMHg0MCwgMHg0QywgMHgwOCwgMHg2MCwgMHgwMCwgMHg2MywgMHhCRSwgMHhEMywKKwkgMHhCRCwgMHhEMSwgMHhFQywgMHgxOCwgMHhENCwgMHg4MCwgMHhFQSwgMHgxOCwgMHgwMywgMHgwMywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhGNywgMHgwMSwKKwkgMHg2NywgMHg0NCwgMHhDMCwgMHg4NCwgMHhFMCwgMHg4NSwgMHgyQywgMHg0NCwgMHhENCwgMHg4MCwgMHg2MywgMHg0MSwgMHgwMSwgMHgwNiwgMHg2NSwgMHg0NCwKKwkgMHhDOCwgMHg4MywgMHhBQSwgMHg0NiwgMHg1OSwgMHhEMSwgMHgyNywgMHhEOCwgMHg1QSwgMHg4NywgMHhGQywgMHgxRiwgMHhBQSwgMHg0NiwgMHgyQiwgMHg0MSwKKwkgMHhENSwgMHgwMSwgMHg4RCwgMHg2MCwgMHgwMiwgMHg2MSwgMHg0MSwgMHg0QiwgMHgyQiwgMHg0MSwgMHg4RCwgMHg2MCwgMHgwMiwgMHg3QywgMHhEMSwgMHg4MCwKKwkgMHhBMSwgMHhEMiwgMHgyNywgMHgwNSwgMHg1OSwgMHhEMCwgMHg2MCwgMHg0NSwgMHg1OSwgMHhEMiwgMHg0NCwgMHg0NywgMHhFMCwgMHg4NywgMHg0MCwgMHg0QSwKKwkgMHg1OSwgMHhEMiwgMHg1OSwgMHg4QiwgMHg0MCwgMHg0QywgMHgwOCwgMHg2MCwgMHgwMCwgMHg2MywgMHhCRSwgMHhEMywgMHhCRCwgMHhEMSwgMHhFQywgMHgxOCwKKwkgMHhENCwgMHg4MCwgMHhFQSwgMHgxOCwgMHgwMywgMHgwMywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhGNywgMHgwMSwgMHgwNCwgMHhBMywgMHhBMywgMHhEMSwKKwkgMHg1QSwgMHg4OCwgMHgyQywgMHg0MywgMHhEMywgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNiwgMHg2NCwgMHg0MywgMHhDRiwgMHg4MywgMHhBQSwgMHg0NiwKKwkgMHg2MCwgMHhGRSwgMHgyOCwgMHhEMSwgMHg1RSwgMHg4OCwgMHgyNywgMHhEOCwgMHg1QSwgMHg4NywgMHhGQiwgMHgxRiwgMHgyMCwgMHhGRSwgMHhBQSwgMHg0NiwKKwkgMHhEMywgMHgwMSwgMHgwNywgMHg2MCwgMHhFQywgMHhGMywgMHgyMCwgMHg2MCwgMHgwMCwgMHg3QywgMHgwOCwgMHhCMCwgMHgxMCwgMHhCMCwgMHgwNSwgMHgwMiwKKwkgMHgwNCwgMHgwMywgMHgwNywgMHg2MCwgMHhFQiwgMHhGOSwgMHgwNywgMHg2MCwgMHhFQSwgMHhGOSwgMHgwMiwgMHhCMCwgMHgwNCwgMHhCMCwgMHgwRiwgMHgwMiwKKwkgMHgxMywgMHg2MCwgMHhEMiwgMHhGMywgMHgwQywgMHgwMywgMHgwMiwgMHhCQywgMHhBMiwgMHhEQiwgMHgxNCwgMHg2MCwgMHg2NSwgMHhGMywgMHgxNCwgMHg2MCwKKwkgMHgyOSwgMHhGMywgMHgwMiwgMHhCRCwgMHgwMiwgMHhCQywgMHhBMiwgMHhEQiwgMHg2NSwgMHg0NCwgMHgxNCwgMHg2MCwgMHg2NSwgMHhGQiwgMHgwNywgMHg2MCwKKwkgMHhFQywgMHhGMywgMHgzMSwgMHg0MSwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQSwgMHg0MCwgMHhCOSwgMHg0MCwgMHgyNiwgMHgwMywgMHgwMCwgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgyNiwgMHg4MCwgMHhCOSwgMHg0MSwgMHg1MSwgMHhGQSwgMHg2MCwgMHgzQSwgMHg2NSwgMHg0NiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg0RSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHg0NCwgMHg2MCwgMHhBRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1QiwgMHhEMywgMHhGOCwgMHg2MCwgMHgzRiwgMHg2NSwKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgxNCwgMHg2MCwgMHg3NCwgMHhGMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgxNCwgMHg2MCwgMHg3NywgMHhGMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyOCwgMHg2MCwKKwkgMHhGNCwgMHg2MSwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhBMSwgMHhEMywKKwkgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHg1OSwgMHhEMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHgxNCwgMHg2MCwgMHg3RCwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgxNCwgMHg2MCwgMHg4MCwgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxNCwgMHg2MCwgMHg4MywgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBMywgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgxNCwgMHg2MCwgMHg4NiwgMHhGMywgMHhFMCwgMHg5QywKKwkgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgxNCwgMHg2MCwgMHg4OSwgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxNCwgMHg2MCwgMHg4QywgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHhBMywgMHhBMywgMHhEMywKKwkgMHhGOCwgMHg2MCwgMHgzRiwgMHg2NSwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgxNCwgMHg2MCwgMHg4RiwgMHhGMywgMHhFMCwgMHg5QywKKwkgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgxNCwgMHg2MCwgMHg5MiwgMHhGMywKKwkgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgyOSwgMHg2MCwgMHgyQSwgMHg2MSwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhBMSwgMHhEMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg1OSwgMHhEMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMSwgMHhEQiwKKwkgMHgxNCwgMHg2MCwgMHg5OCwgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxNCwgMHg2MCwgMHg5QiwgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxNCwgMHg2MCwgMHg5RSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgxNCwgMHg2MCwKKwkgMHhBMSwgMHhGMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxNCwgMHg2MCwgMHhBNCwgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxNCwgMHg2MCwgMHhBNywgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgwMCwgMHg2MCwgMHg2QSwgMHg2MywgMHgyOSwgMHg2MCwgMHg1MCwgMHg2MSwgMHgyOCwgMHg2MCwgMHhFNCwgMHg2NCwgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOSwKKwkgMHhGRCwgMHgxRiwgMHgxNCwgMHg2MCwgMHhCMCwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxNCwgMHg2MCwgMHhCNCwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxNCwgMHg2MCwKKwkgMHhCNiwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxNCwgMHg2MCwgMHhCRCwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywKKwkgMHhBMiwgMHhEQiwgMHgxNCwgMHg2MCwgMHhCRiwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxNCwgMHg2MCwgMHhDQiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxNCwgMHg2MCwKKwkgMHhDRiwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxNCwgMHg2MCwgMHhEMSwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywKKwkgMHhBMiwgMHhEQiwgMHgxNCwgMHg2MCwgMHhEOCwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxNCwgMHg2MCwgMHhEQSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHhGQSwgMHg2MCwgMHgyQywgMHg2NSwgMHg0NiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg0RSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRSwgMHgwMywgMHg2MywgMHg0NSwgMHgyQSwgMHg2MCwgMHhFQSwgMHg2MywgMHgwNiwgMHg2MSwgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwKKwkgMHg2NCwgMHg0NCwgMHgwRiwgMHhCNCwgMHhCRCwgMHhEQiwgMHg2NCwgMHg0NywgMHgwRiwgMHhCNCwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGNiwgMHgwMiwKKwkgMHhGQSwgMHg2MCwgMHgzMCwgMHg2NSwgMHg0NiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMywgMHhCRCwgMHhEMywKKwkgMHg2MywgMHg0NiwgMHgyQiwgMHg2MCwgMHg4MiwgMHg2MywgMHgxNSwgMHg2MCwgMHhEMCwgMHhGQiwgMHhEQSwgMHg4NSwgMHhCRCwgMHhEQiwgMHgwRSwgMHg2MSwKKwkgMHhBNiwgMHhEMSwgMHhEQSwgMHg4NiwgMHg2NCwgMHg0NCwgMHhGRiwgMHhCNCwgMHhBNSwgMHhEQiwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NywgMHhGRiwgMHhCNCwKKwkgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGNSwgMHgwMiwgMHhGQSwgMHg2MCwgMHgzMSwgMHg2NSwgMHg0NiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg0RSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyMiwgMHgwMywgMHhCRCwgMHhEMywgMHgxNSwgMHg2MCwgMHhFRSwgMHhGQiwgMHg1QSwgMHg4MSwgMHgxNSwgMHg2MCwgMHhGRCwgMHhGQiwKKwkgMHg1QSwgMHg4MiwgMHgxNiwgMHg2MCwgMHgwQywgMHhGQiwgMHg1QSwgMHg4MywgMHgxNiwgMHg2MCwgMHgxQiwgMHhGQiwgMHg1QSwgMHg4NCwgMHgwRSwgMHg2MSwKKwkgMHhCRCwgMHhEMSwgMHhCRCwgMHhENSwgMHg2NCwgMHg0NCwgMHhGRiwgMHhCNCwgMHgyMSwgMHhEQiwgMHg1QSwgMHg4MSwgMHg2NCwgMHg0NywgMHhGRiwgMHhCNCwKKwkgMHgyMiwgMHhEQiwgMHg1QSwgMHg4MiwgMHg2NiwgMHg0NCwgMHhGRiwgMHhCNCwgMHgyMywgMHhEQiwgMHg1QSwgMHg4MywgMHg2NiwgMHg0NywgMHhGRiwgMHhCNCwKKwkgMHgyNCwgMHhEQiwgMHhDRCwgMHg4MSwgMHg1QSwgMHg4NCwgMHhFQywgMHgwMiwgMHhGQSwgMHg2MCwgMHg0NywgMHg2NSwgMHg0NiwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMywgMHg2MywgMHg0NSwgMHgyQywgMHg2MCwgMHg1NCwgMHg2MywgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwKKwkgMHhCRCwgMHhEOSwgMHgwMiwgMHg2MSwgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NywgMHgwMCwgMHg3RSwgMHhCRCwgMHhEQiwgMHg2NCwgMHg0NCwKKwkgMHgwMCwgMHg3RSwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGNiwgMHgwMiwgMHhGQSwgMHg2MCwgMHgyRSwgMHg2NSwgMHg0NiwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHgwMywgMHg2MywgMHg0NiwgMHhGQywgMHhBMywgMHhBMywgMHhEMywgMHgyQiwgMHg2MCwgMHgwMiwgMHg2MywKKwkgMHhDQywgMHg4NCwgMHhFOCwgMHg4NCwgMHhDQywgMHg4MSwgMHgwMCwgMHgzNiwgMHgwRCwgMHgwMCwgMHg2MywgMHg0NSwgMHhBNiwgMHhEMywgMHg1QSwgMHhEMSwKKwkgMHhEQSwgMHg4NiwgMHhGRiwgMHhCNCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwgMHg1QywgMHg5MCwgMHhCRCwgMHhEOSwgMHhGRCwgMHgwMiwgMHhDRCwgMHg4MSwKKwkgMHg2NiwgMHg0MiwgMHhGNCwgMHgwMiwgMHg2NiwgMHg0MiwgMHg1QSwgMHhEMywgMHgyQiwgMHg2MCwgMHg0MiwgMHg2NSwgMHhCRCwgMHhEQiwgMHhENywgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHhGQywgMHgwMiwgMHgyQywgMHg2MCwgMHg2OCwgMHg2MSwgMHhGQSwgMHg2MCwgMHg0NiwgMHg2NSwgMHg0NiwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHhBMSwgMHhERCwgMHhEOSwgMHg4MSwgMHhGQSwgMHg2MCwgMHgyRiwgMHg2NSwgMHg0NiwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHhBMSwgMHhERCwgMHhEOSwgMHg4MSwgMHhGQSwgMHg2MCwgMHgzRSwgMHg2NSwKKwkgMHg0NiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHhBMSwgMHhERCwgMHhEOSwgMHg4MSwgMHhGQSwgMHg2MCwKKwkgMHgzRiwgMHg2NSwgMHg0NiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHhBMSwgMHhERCwgMHhEOSwgMHg4MSwKKwkgMHhGQSwgMHg2MCwgMHg0MCwgMHg2NSwgMHg0NiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHhBMSwgMHhERCwKKwkgMHhEOSwgMHg4MSwgMHhGQSwgMHg2MCwgMHgzQiwgMHg2NSwgMHg0NiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywKKwkgMHhBMSwgMHhERCwgMHhGQSwgMHg2MCwgMHg0OCwgMHg2NSwgMHg0NiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHgwMywKKwkgMHhCRCwgMHhEMywgMHgyQywgMHg2MCwgMHhDNCwgMHg2MSwgMHgwRSwgMHhCNCwgMHhCRCwgMHhEMSwgMHhBMSwgMHhEQiwgMHg2NCwgMHg0NywgMHgwRSwgMHhCNCwKKwkgMHhBMywgMHhEMSwgMHg1OSwgMHhEQiwgMHg2NCwgMHg0NCwgMHgwRSwgMHhCNCwgMHg1OSwgMHhEQiwgMHg2NCwgMHg0NywgMHgwRSwgMHhCNCwgMHg1OSwgMHhEQiwKKwkgMHhGQSwgMHg2MCwgMHgyOSwgMHg2NSwgMHg0NiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHgwNCwgMHhBMywKKwkgMHhBMywgMHhEMywgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHhCNCwgMHg4NCwgMHgxMywgMHg2MCwgMHhBNiwgMHhGQiwgMHhGQSwgMHg2MCwgMHgyQSwgMHg2NSwKKwkgMHg0NiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMywgMHgwNCwgMHhBMywgMHhCRCwgMHhEMSwgMHgxNCwgMHg2MCwKKwkgMHg0QSwgMHhGMywgMHg2NCwgMHg0MSwgMHg2NCwgMHg1RSwgMHhBMiwgMHhEQiwgMHg2NCwgMHg0NywgMHg1QSwgMHhEMywgMHg2MCwgMHg1QywgMHg2NCwgMHg1RiwKKwkgMHhBMiwgMHhEQiwgMHgxNCwgMHg2MCwgMHg2MCwgMHhGMywgMHhGRiwgMHg2MCwgMHhDMCwgMHhCNSwgMHg2MSwgMHg0MCwgMHg4MCwgMHgyNywgMHgwNSwgMHgwMCwKKwkgMHhFOSwgMHg4NywgMHgzRiwgMHhCNCwgMHhCNCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxNSwgMHgwMCwgMHg2NSwgMHg0NCwgMHhBMiwgMHhEQiwgMHhFMSwgMHg4MCwKKwkgMHhGOSwgMHg4NywgMHgwMSwgMHg3RiwgMHgxNCwgMHg2MCwgMHg2MywgMHhGMywgMHg2MCwgMHg0MSwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFOSwgMHg4MSwKKwkgMHhGOCwgMHg4NCwgMHhFOSwgMHg4MSwgMHhGOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg0QSwgMHhEMywgMHhGRiwgMHg2MCwgMHg4MCwgMHg2NSwgMHhBNCwgMHg4NCwKKwkgMHgzNCwgMHg5NCwgMHhBMiwgMHhEQiwgMHhEQiwgMHg4MywgMHgxNCwgMHg2MCwgMHhERiwgMHhGRCwgMHhGQSwgMHg2MCwgMHgyQiwgMHg2NSwgMHg0NiwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgxNCwgMHg2MCwgMHg0RCwgMHhGQiwKKwkgMHhBMywgMHhEMywgMHgxNCwgMHg2MCwgMHgxMSwgMHhGQiwgMHhGQSwgMHg2MCwgMHgzQywgMHg2NSwgMHg0NiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg0RSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgxRiwgMHgwMywgMHhBMywgMHhEMywgMHhGQywgMHg2MCwgMHhGQywgMHg2NSwgMHhBNCwgMHg4NCwgMHg2MCwgMHg1QywgMHgwMCwgMHg3RSwKKwkgMHhDMCwgMHg2MCwgMHgwMCwgMHhBMCwgMHg2MCwgMHg0MywgMHgwNywgMHgwNCwgMHgxNCwgMHg2MCwgMHg1MSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMywgMHg2MCwKKwkgMHhGRiwgMHhCNCwgMHgzQywgMHg5NCwgMHhBMiwgMHhEQiwgMHgyOCwgMHg2MCwgMHgyQSwgMHg2MSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhDMCwgMHhBMCwKKwkgMHg2MCwgMHg0NywgMHgwNywgMHgwNCwgMHg2MCwgMHg0MywgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMywgMHg2MCwgMHhGRiwgMHhCNCwgMHgzQywgMHg5NCwKKwkgMHhBMSwgMHhEQiwgMHhGQSwgMHg2MCwgMHg0OSwgMHg2NSwgMHg0NiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHgwMywKKwkgMHgzMiwgMHg2MCwgMHhBQiwgMHg2MSwgMHgxQywgMHg3QywgMHg2MCwgMHhGRSwgMHhBMywgMHhEMywgMHg1RCwgMHhEMywgMHgwRiwgMHhCNSwgMHhENCwgMHg4NCwKKwkgMHhBMSwgMHhEQiwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHg1RCwgMHhEMywKKwkgMHgwRiwgMHhCNSwgMHhENCwgMHg4NCwgMHhBMSwgMHhEQiwgMHg2NywgMHg0NCwgMHhDMCwgMHg5QywgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgxMCwgMHgwMCwKKwkgMHg2NCwgMHg0MCwgMHgwRSwgMHgzQSwgMHhFOSwgMHgwMSwgMHgyMCwgMHhGRSwgMHhGQSwgMHg2MCwgMHg0QSwgMHg2NSwgMHg0NiwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNSwgMHgwMywgMHgzMiwgMHg2MCwgMHhDNywgMHg2MSwgMHgwRSwgMHg3QywgMHg2MCwgMHhGRSwgMHhEQywgMHgwMSwKKwkgMHgyMCwgMHhGRSwgMHhCOCwgMHhGRSwgMHhCOSwgMHhGRSwgMHhCQSwgMHhGRSwgMHhCQiwgMHhGRSwgMHhCRCwgMHhGRSwgMHhCRiwgMHhGRSwgMHgxOSwgMHg2MCwKKwkgMHg0OCwgMHhGMywgMHgxMiwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwNCwgMHgwMCwgMHgwQiwgMHg2MCwgMHhFQSwgMHg2MiwgMHg1QSwgMHhERiwKKwkgMHhGRSwgMHgxRiwgMHg0MSwgMHg2MCwgMHg2QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwNiwgMHg2MywgMHhCRSwgMHhEMywgMHhCRCwgMHhEMSwKKwkgMHgwNywgMHgxOCwgMHhENCwgMHg4MCwgMHgwNSwgMHgxOCwgMHgwMywgMHgwMywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhGNywgMHgwMSwgMHhEQiwgMHg4MywKKwkgMHgwMCwgMHhCQywgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg4NiwgMHhGRCwgMHhBQSwgMHgyRCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgxMCwgMHhGRCwKKwkgMHg2RSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgxNCwgMHhGRCwgMHg4RSwgMHgzMiwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHg0MSwgMHhGQSwKKwkgMHg0MCwgMHgyQSwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg0MiwgMHhGQSwgMHg2MiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg0MywgMHhGQSwKKwkgMHg4NCwgMHgyQSwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg0NCwgMHhGQSwgMHhBNiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg0NSwgMHhGQSwKKwkgMHhDOCwgMHgyQSwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHgyNSwgMHhGRCwgMHg5RSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwKKworfTsgIC8qIGZ3X2ltYWdlXzNfZGF0YSAqLworCitzdGF0aWMgY29uc3QgaGNmXzggZndfaW1hZ2VfNF9kYXRhW10gPSB7CisJIDB4NkMsIDB4NDAsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NDEsIDB4RkYsIDB4MzMsIDB4RjMsIDB4MDIsIDB4MTEsIDB4MzEsIDB4MTgsIDB4MUUsIDB4MDAsIDB4NDQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsCisJIDB4QzQsIDB4RTIsIDB4MjcsIDB4NDQsIDB4MjAsIDB4MkEsIDB4MDEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4NDIsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjMsIDB4MDAsCisJIDB4NDEsIDB4RkYsIDB4QTIsIDB4NjAsIDB4NDUsIDB4NzgsIDB4RTIsIDB4RkUsIDB4NDAsIDB4NDksIDB4MDIsIDB4NjAsIDB4MDEsIDB4RTEsIDB4MUQsIDB4MDAsCisJIDB4NDQsIDB4RkYsIDB4MUIsIDB4MDksIDB4MjksIDB4NDQsIDB4MTAsIDB4MkEsIDB4MDQsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4MTAsIDB4NjUsIDB4MEIsIDB4MDAsCisJIDB4QTMsIDB4NjAsIDB4QzEsIDB4NzgsIDB4QTQsIDB4RTIsIDB4MjksIDB4NDQsIDB4MjAsIDB4MkEsIDB4MEQsIDB4MDAsIDB4MjAsIDB4QUMsIDB4RUMsIDB4MDEsCisJIDB4QTMsIDB4NjAsIDB4QzEsIDB4NzgsIDB4NDYsIDB4RkYsIDB4QjQsIDB4ODQsIDB4NDAsIDB4NDksIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODAsIDB4M0UsCisJIDB4QTMsIDB4NjAsIDB4QzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjIsIDB4RkYsIDB4MDgsIDB4RTEsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsCisJIDB4QUEsIDB4NjAsIDB4QTUsIDB4NzgsIDB4NEMsIDB4NEUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QUEsIDB4NjAsIDB4QjMsIDB4NzgsIDB4NDQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzQsIDB4RTIsIDB4ODQsIDB4RkYsIDB4MjIsIDB4NTgsIDB4ODIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTQsIDB4NjAsIDB4MzksIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RTEsIDB4MDEsIDB4RkYsIDB4RkYsCisJIDB4MTAsIDB4MjksIDB4RkEsIDB4MDEsIDB4RTQsIDB4RTIsIDB4QUEsIDB4NjAsIDB4NUYsIDB4NzgsIDB4QjIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzEsIDB4NjAsIDB4RkMsIDB4NzgsIDB4NjQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QUEsIDB4NjAsIDB4NDYsIDB4NzgsIDB4QUMsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4ODAsIDB4MjksIDB4RTIsIDB4MDEsIDB4QUEsIDB4NjAsIDB4QTIsIDB4NzgsIDB4NDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjUsIDB4NjAsIDB4NUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjUsIDB4NjAsIDB4OTQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjMsIDB4NjAsIDB4QzksIDB4NzgsIDB4NDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjMsIDB4NjAsIDB4RkMsIDB4NzgsIDB4NDMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjMsIDB4NjAsIDB4RkMsIDB4NzgsIDB4NDQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjcsIDB4NjAsIDB4MjAsIDB4NzgsIDB4NDUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjMsIDB4NjAsIDB4RkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4ODMsIDB4NjQsIDB4ODAsIDB4MjksIDB4MDksIDB4RkIsIDB4QjUsIDB4NjAsIDB4MjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4OTgsIDB4RkYsIDB4M0EsIDB4NjAsIDB4MTgsIDB4NzgsIDB4NDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MzksIDB4NjAsIDB4OEYsIDB4NzgsIDB4OTgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzAsIDB4NjAsIDB4NjcsIDB4NzgsIDB4OTgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QkYsIDB4NjAsIDB4RTEsIDB4NzgsIDB4OTgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjcsIDB4NjAsIDB4RTksIDB4NzgsIDB4OTgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODMsIDB4M0UsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzMsIDB4NjAsIDB4NEQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4NDEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4NDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QjAsIDB4RkYsIDB4QjEsIDB4RkYsIDB4NDAsIDB4RkYsIDB4NDMsIDB4RkYsIDB4QzMsIDB4NjAsIDB4NDgsIDB4NzgsIDB4NDQsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QzMsIDB4NjAsIDB4NEQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4M0UsIDB4NjAsIDB4OEMsIDB4NzgsIDB4NDUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QzMsIDB4NjAsIDB4NDgsIDB4NzgsIDB4ODQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QzMsIDB4NjAsIDB4NDcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4Q0EsIDB4NjAsIDB4QzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RjMsIDB4NjAsIDB4OUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NDIsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODUsIDB4M0UsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4Q0EsIDB4NjAsIDB4RDAsIDB4NzgsIDB4MjQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RjIsIDB4NjAsIDB4NDcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4Q0EsIDB4NjAsIDB4RDAsIDB4NzgsIDB4NDQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4Q0EsIDB4NjAsIDB4RDAsIDB4NzgsIDB4ODQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4Q0EsIDB4NjAsIDB4RDAsIDB4NzgsIDB4NDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MjksIDB4NjAsIDB4RjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MkEsIDB4NjAsIDB4MjAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MkEsIDB4NjAsIDB4M0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MkEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4MjgsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MkEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4NDQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MkEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4NDUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MkEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4NDYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4ODcsIDB4NjQsIDB4ODAsIDB4MjksIDB4MDksIDB4RkIsIDB4NDcsIDB4RkYsIDB4MkEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4NDMsIDB4RjcsIDB4QTcsIDB4RkYsIDB4NDEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MzcsIDB4NjAsIDB4ODIsIDB4NzgsIDB4NDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MzYsIDB4NjAsIDB4OEYsIDB4NzgsIDB4NDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NDEsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MDMsIDB4RTEsIDB4MjEsIDB4NDYsIDB4NjYsIDB4NDUsIDB4MDAsIDB4RjQsIDB4MkUsIDB4NDQsIDB4MDksIDB4RkEsCisJIDB4NkEsIDB4NjEsIDB4N0YsIDB4NjAsIDB4RkUsIDB4NjMsIDB4QTEsIDB4RkYsIDB4OUEsIDB4RkYsIDB4MDUsIDB4MTEsIDB4MEEsIDB4MDAsIDB4MDAsIDB4RjQsCisJIDB4MDEsIDB4RjIsIDB4MTcsIDB4MTgsIDB4N0EsIDB4NjEsIDB4MDIsIDB4MjUsIDB4MDQsIDB4MDAsIDB4NkMsIDB4NDQsIDB4N0EsIDB4REEsIDB4RkIsIDB4MUMsCisJIDB4RjYsIDB4MTEsIDB4RDksIDB4ODEsIDB4NDEsIDB4RkYsIDB4MDIsIDB4MUMsIDB4MDAsIDB4RjQsIDB4REEsIDB4ODIsIDB4NDEsIDB4RkYsIDB4QzksIDB4ODEsCisJIDB4Q0IsIDB4ODMsIDB4NkMsIDB4NDQsIDB4NUEsIDB4REEsIDB4MDIsIDB4MUMsIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4NkMsIDB4NDQsIDB4NUEsIDB4REEsCisJIDB4Q0IsIDB4ODMsIDB4MDIsIDB4NzQsIDB4MDIsIDB4NjAsIDB4MDQsIDB4RTEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjEsIDB4NUQsIDB4OTMsIDB4QjUsIDB4RkYsCisJIDB4OTgsIDB4RkYsIDB4MjYsIDB4NDQsIDB4RkQsIDB4QjQsIDB4ODQsIDB4QkMsIDB4NDAsIDB4NDYsIDB4NjUsIDB4NDYsIDB4MDAsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4M0YsIDB4RkMsIDB4NjMsIDB4NDcsIDB4MEEsIDB4NjMsIDB4MEYsIDB4RkMsIDB4MDAsIDB4RjQsIDB4MDgsIDB4RkEsIDB4Q0IsIDB4RkUsIDB4MTgsIDB4RTEsCisJIDB4NDQsIDB4RkYsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4RTIsIDB4RkUsIDB4MDMsIDB4MDQsIDB4QTMsIDB4NjAsIDB4MDUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RTAsIDB4RkUsIDB4MDMsIDB4MDQsIDB4QTMsIDB4NjAsIDB4MUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTEsIDB4RkUsIDB4MDcsIDB4MDUsCisJIDB4OUYsIDB4RkUsIDB4MDMsIDB4MDQsIDB4M0EsIDB4NjAsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDMsIDB4RkYsIDB4QTksIDB4MDEsIDB4OTUsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4ODAsIDB4QjQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjQsIDB4MTYsIDB4MDAsIDB4MjksIDB4NDQsIDB4MDgsIDB4MjYsIDB4RTEsIDB4MDEsCisJIDB4NzIsIDB4NDQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4QjIsIDB4RjMsIDB4RTgsIDB4ODUsCisJIDB4RkYsIDB4QjcsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QjQsIDB4ODUsIDB4NzMsIDB4NDQsIDB4RDQsIDB4ODQsIDB4MTAsIDB4NjUsIDB4RDQsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDUsIDB4OEYsIDB4MDAsIDB4ODAsIDB4NjAsIDB4MDEsIDB4RTAsIDB4RDUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4QTEsIDB4RjMsCisJIDB4N0MsIDB4NDUsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjMsIDB4MDIsIDB4NjUsIDB4OEMsIDB4NjAsIDB4NDgsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsCisJIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4N0YsIDB4NkEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4ODQsIDB4NjAsIDB4MDQsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsCisJIDB4NDgsIDB4NjAsIDB4MDgsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsCisJIDB4RkUsIDB4MDEsIDB4ODQsIDB4NjAsIDB4MDQsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NDAsIDB4NjAsIDB4MDgsIDB4NkEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4OTUsIDB4NjAsCisJIDB4ODQsIDB4RTcsIDB4QkQsIDB4RkUsIDB4MEMsIDB4NjAsIDB4MDAsIDB4NjIsIDB4MDAsIDB4NjAsIDB4NzEsIDB4N0MsIDB4MDAsIDB4NjAsIDB4QjEsIDB4NjUsCisJIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4RTEsIDB4NjIsIDB4RkYsIDB4QTMsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTIsIDB4RkYsIDB4MDIsIDB4NjAsIDB4MDgsIDB4RTEsIDB4QUUsIDB4NEYsIDB4MDIsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUUsIDB4M0YsIDB4NDAsCisJIDB4NDAsIDB4MjYsIDB4MDksIDB4MDAsIDB4MUMsIDB4NjAsIDB4MDksIDB4RjMsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NTAsIDB4QTQsIDB4NTIsIDB4NUEsIDB4RDMsCisJIDB4NUEsIDB4RDEsIDB4QTAsIDB4NTAsIDB4QTQsIDB4NTAsIDB4REIsIDB4RjMsIDB4RjEsIDB4RjEsIDB4MDEsIDB4QTgsIDB4MDcsIDB4QTgsIDB4MEEsIDB4MDMsCisJIDB4MDksIDB4MDMsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDksIDB4MDAsIDB4MUIsIDB4NjAsIDB4RjMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QjQsCisJIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4QUQsIDB4NEYsIDB4RkEsIDB4QjQsIDB4QTAsIDB4NUQsIDB4MTksIDB4NjAsIDB4RjYsIDB4RjEsIDB4ODksIDB4RkYsCisJIDB4MzIsIDB4NDAsIDB4ODAsIDB4MkEsIDB4MUUsIDB4MDAsIDB4MzEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MUIsIDB4MDAsIDB4MTIsIDB4NjAsIDB4RkYsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MDUsIDB4MDMsIDB4MEUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsCisJIDB4MTAsIDB4MDAsIDB4MTMsIDB4NjAsIDB4MDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MDMsIDB4MDMsIDB4MEYsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4MDcsIDB4MUIsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NzUsIDB4MDEsIDB4MDAsCisJIDB4MTAsIDB4RkYsIDB4ODgsIDB4RkYsIDB4QTIsIDB4NjAsIDB4NDEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjEsIDB4NDYsIDB4MDEsIDB4NUQsIDB4NUMsIDB4NjIsCisJIDB4MDMsIDB4RTEsIDB4NDQsIDB4RkYsIDB4QTEsIDB4RkYsIDB4OUEsIDB4RkYsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4NjIsIDB4NjIsCisJIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4QTEsIDB4RkYsIDB4NUEsIDB4REMsIDB4MTIsIDB4RTEsIDB4MDIsIDB4NjAsIDB4MDEsIDB4RTEsCisJIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDMsIDB4MDAsIDB4MjksIDB4NDAsIDB4MjAsIDB4MjcsCisJIDB4QTMsIDB4MDAsIDB4QzgsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4MjksIDB4NDQsIDB4MDgsIDB4QkMsIDB4NDAsIDB4NDksIDB4NDQsIDB4RkYsIDB4MDUsIDB4RTEsCisJIDB4REIsIDB4RjMsIDB4MzcsIDB4NjAsIDB4RTgsIDB4NjMsIDB4MDMsIDB4QTgsIDB4MDQsIDB4QTgsIDB4MDYsIDB4MDMsIDB4MDUsIDB4MDMsIDB4QTMsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4QTgsIDB4MDcsIDB4MTgsIDB4MEEsIDB4MDMsIDB4MjgsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDcsIDB4MDAsIDB4MjgsIDB4NDAsCisJIDB4NDgsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4RjEsIDB4RkIsIDB4MjksIDB4NDQsIDB4RkYsIDB4NjAsCisJIDB4RUYsIDB4NjUsIDB4MjQsIDB4ODksIDB4NDAsIDB4MjcsIDB4M0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjksIDB4NDAsIDB4ODAsIDB4MjcsIDB4MEIsIDB4MDAsCisJIDB4MDcsIDB4NjEsIDB4QTEsIDB4RkYsIDB4Q0QsIDB4ODEsIDB4MDQsIDB4MjUsIDB4NjEsIDB4MDAsIDB4ODcsIDB4NEMsIDB4RkIsIDB4MDIsIDB4RjMsIDB4NjAsCisJIDB4QTAsIDB4NjQsIDB4ODAsIDB4NEMsIDB4MDcsIDB4MDAsIDB4QTEsIDB4RkYsIDB4OUMsIDB4NEMsIDB4OUMsIDB4NEMsIDB4OUMsIDB4NEQsIDB4MDUsIDB4NjAsCisJIDB4Q0YsIDB4NjQsIDB4ODAsIDB4NEMsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDUsIDB4MDAsIDB4MjksIDB4NDAsIDB4MjAsIDB4MjcsIDB4MDIsIDB4MDAsCisJIDB4MTUsIDB4NjAsIDB4NkYsIDB4NkIsIDB4MDQsIDB4MjUsIDB4NEEsIDB4MDAsIDB4MzAsIDB4NjQsIDB4M0EsIDB4REIsIDB4NDQsIDB4RkYsIDB4MDQsIDB4MjUsCisJIDB4NDUsIDB4MDAsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjUsIDB4NDQsIDB4QjQsIDB4ODQsIDB4ODAsIDB4NEUsIDB4MkQsIDB4NDEsIDB4MDQsIDB4MjUsCisJIDB4M0QsIDB4MDAsIDB4NjEsIDB4NEMsIDB4MDAsIDB4NjAsIDB4OEEsIDB4NjUsIDB4QzUsIDB4ODEsIDB4NjEsIDB4NTQsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MjUsIDB4MzQsIDB4MDAsIDB4NjcsIDB4NEUsIDB4MDcsIDB4NjQsIDB4MUMsIDB4RkIsIDB4MDAsIDB4RTEsIDB4MDIsIDB4NjAsIDB4MDUsIDB4RTEsCisJIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MjcsIDB4MEEsIDB4MDAsIDB4MUMsIDB4NjUsIDB4MjgsIDB4NDAsCisJIDB4QTQsIDB4MzYsIDB4MTQsIDB4NjUsIDB4MjMsIDB4NDQsIDB4QzQsIDB4ODQsIDB4MjgsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MEMsIDB4MDAsIDB4MDcsIDB4MDAsCisJIDB4MjMsIDB4NDQsIDB4MUMsIDB4QTQsIDB4MjksIDB4NDAsIDB4MjAsIDB4MjcsIDB4MDIsIDB4MDAsIDB4MTEsIDB4NjAsIDB4MEYsIDB4NkIsIDB4M0MsIDB4NDYsCisJIDB4OTgsIDB4RjAsIDB4MjMsIDB4NDQsIDB4QzQsIDB4ODQsIDB4MDYsIDB4NzQsIDB4MjUsIDB4NUMsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4QjAsIDB4ODQsIDB4ODAsIDB4NEMsIDB4OUMsIDB4NEMsIDB4NDQsIDB4RkYsIDB4MTgsIDB4RTEsIDB4MEEsIDB4NjQsIDB4MUUsIDB4NzQsCisJIDB4MDIsIDB4NjAsIDB4MDUsIDB4RTEsIDB4NDAsIDB4NDAsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4QzQsIDB4RTIsIDB4MjcsIDB4NDQsCisJIDB4MjAsIDB4MkEsIDB4MDYsIDB4MDAsIDB4NDIsIDB4NjQsIDB4M0EsIDB4REIsIDB4NjcsIDB4NEMsIDB4QjEsIDB4NjAsIDB4QUQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NDEsIDB4NjQsIDB4M0EsIDB4REIsIDB4NjIsIDB4RkYsIDB4MDgsIDB4RTEsIDB4RTIsIDB4RkUsIDB4NzIsIDB4NTIsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsCisJIDB4ODAsIDB4M0UsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4MjgsIDB4NDAsIDB4MDgsIDB4MjcsIDB4NUEsIDB4MDEsIDB4M0MsIDB4NDYsCisJIDB4OEIsIDB4RkYsIDB4ODQsIDB4NjAsIDB4MDAsIDB4RTQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4NjQsIDB4QzksIDB4NjAsIDB4NTgsIDB4NEYsIDB4NTYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjIsIDB4MDAsIDB4NjAsIDB4MTgsIDB4NzAsIDB4MTgsIDB4NzEsIDB4MjAsIDB4NzIsIDB4MDAsIDB4RjIsIDB4NjAsIDB4NTMsCisJIDB4MjAsIDB4RTEsIDB4QTEsIDB4RkYsIDB4ODgsIDB4NzUsIDB4MDAsIDB4RTEsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NTAsIDB4NzUsIDB4NDQsIDB4MTIsIDB4NzEsCisJIDB4NkUsIDB4NzIsIDB4ODEsIDB4NzUsIDB4RkYsIDB4RkYsIDB4ODgsIDB4RkYsIDB4QTMsIDB4NjAsIDB4MjEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4RjMsCisJIDB4MDgsIDB4MjksIDB4MEEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDcsIDB4MjIsIDB4MDcsIDB4MDAsIDB4RkUsIDB4QjQsIDB4MzIsIDB4RkIsIDB4MjcsIDB4NDQsCisJIDB4MTAsIDB4QkMsIDB4RjcsIDB4QjQsIDB4NDAsIDB4NDcsIDB4NDMsIDB4RkYsIDB4MDAsIDB4NjQsIDB4M0EsIDB4REIsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsCisJIDB4MzEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MzMsIDB4RkIsIDB4MDEsIDB4NjAsIDB4MEEsIDB4RTEsIDB4MjUsIDB4MTEsCisJIDB4MjQsIDB4MEEsIDB4RTUsIDB4RkUsIDB4MkQsIDB4MDUsIDB4MzIsIDB4NDAsIDB4ODAsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MTksIDB4NjAsIDB4RjIsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTgsIDB4MTYsIDB4MDAsIDB4OUYsIDB4RkUsIDB4MTQsIDB4MDUsIDB4OUQsIDB4RkUsIDB4MTIsIDB4MDQsIDB4MzEsIDB4NDEsCisJIDB4NDAsIDB4MkEsIDB4MEYsIDB4MDAsIDB4MDcsIDB4NjAsIDB4RTksIDB4RjEsIDB4QUUsIDB4NEMsIDB4OTAsIDB4ODAsIDB4MTAsIDB4MkEsIDB4MDksIDB4MDAsCisJIDB4N0YsIDB4QjEsIDB4MDcsIDB4NjAsIDB4RTksIDB4RkIsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsIDB4ODAsIDB4QjksIDB4NDEsIDB4NTEsIDB4REYsIDB4RkUsCisJIDB4MTksIDB4RkYsIDB4OUYsIDB4RkUsIDB4MDIsIDB4MDQsIDB4NDAsIDB4RTEsIDB4MDgsIDB4MDAsIDB4N0MsIDB4RTEsIDB4MzEsIDB4NDQsIDB4MDEsIDB4MkEsCisJIDB4MDQsIDB4MDAsIDB4RkQsIDB4RTEsIDB4MjcsIDB4NDQsIDB4MTAsIDB4MjYsIDB4MDYsIDB4MDAsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsCisJIDB4QUEsIDB4NjAsIDB4NkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDgsIDB4MjYsIDB4RkYsIDB4RkYsIDB4QzEsIDB4NjAsIDB4QTMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NDgsIDB4RjMsIDB4MzIsIDB4RjEsIDB4MDAsIDB4NjMsIDB4NjQsIDB4NDAsIDB4MDcsIDB4MjYsIDB4MDMsIDB4MDAsIDB4QTUsIDB4NjAsCisJIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDMsIDB4RkYsIDB4MzEsIDB4NDAsIDB4MDgsIDB4MjYsIDB4RjAsIDB4MDEsIDB4Q0QsIDB4RTIsIDB4ODUsIDB4RTEsCisJIDB4NzAsIDB4NDEsIDB4QUQsIDB4ODAsIDB4NzEsIDB4NDAsIDB4ODAsIDB4MjcsIDB4RTksIDB4MTIsIDB4MDMsIDB4MDMsIDB4QzIsIDB4NjAsIDB4MTUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QzQsIDB4RTIsIDB4MzIsIDB4RkQsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4REIsIDB4MDEsCisJIDB4MDAsIDB4NjMsIDB4MzIsIDB4RkQsIDB4M0MsIDB4NDYsIDB4M0UsIDB4RjIsIDB4MkEsIDB4RjAsIDB4MjcsIDB4NDEsIDB4NDQsIDB4NDgsIDB4MjAsIDB4QjksCisJIDB4MDEsIDB4QjQsIDB4RjcsIDB4QjEsIDB4MEEsIDB4MDMsIDB4NjQsIDB4NDAsIDB4MDgsIDB4MjcsIDB4MDcsIDB4MDAsIDB4MEYsIDB4NjAsIDB4REEsIDB4NjMsCisJIDB4MDAsIDB4NjQsIDB4NDUsIDB4RkIsIDB4NDYsIDB4RkIsIDB4QkQsIDB4REIsIDB4QTMsIDB4REIsIDB4QzgsIDB4MEEsIDB4QzcsIDB4MTEsIDB4MUIsIDB4NjAsCisJIDB4RUUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MTgsIDB4MjgsIDB4NDAsIDB4RDQsIDB4MzYsIDB4MTEsIDB4MDAsIDB4QUMsIDB4NEMsIDB4ODAsIDB4MkEsCisJIDB4MEUsIDB4MDAsIDB4MUIsIDB4NjAsIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MEEsIDB4MTgsIDB4MUIsIDB4NjAsIDB4RjIsIDB4RjMsIDB4MUIsIDB4NjAsCisJIDB4RUYsIDB4RjMsIDB4NjAsIDB4NDUsIDB4RDQsIDB4ODAsIDB4REMsIDB4ODQsIDB4MDIsIDB4MDMsIDB4QTIsIDB4REIsIDB4QUYsIDB4MDEsIDB4MDAsIDB4NjQsCisJIDB4MUIsIDB4NjAsIDB4RUYsIDB4RkIsIDB4NDEsIDB4NDcsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MDQsIDB4MDAsCisJIDB4MDEsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MTAsIDB4MkIsIDB4MDMsIDB4MDAsIDB4MjksIDB4NDcsIDB4MjAsIDB4QkYsIDB4NDAsIDB4NDksIDB4MUIsIDB4NjAsCisJIDB4RUUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MTgsIDB4QUUsIDB4NEYsIDB4MDgsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUUsIDB4MDUsIDB4RTEsCisJIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MkEsIDB4RTgsIDB4M0MsIDB4NDYsIDB4MEYsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsCisJIDB4MDMsIDB4MDAsIDB4QTcsIDB4NjAsIDB4RTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4N0QsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsCisJIDB4MEUsIDB4MDAsIDB4MUYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDksIDB4MDAsIDB4MTksIDB4NjAsIDB4N0IsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDMsIDB4MDAsIDB4QTgsIDB4NjAsIDB4RUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4RjIsCisJIDB4QzAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QTQsIDB4OUMsIDB4M0YsIDB4NjAsIDB4Q0YsIDB4NjUsIDB4MjksIDB4NDQsIDB4QTQsIDB4ODQsIDB4MzAsIDB4ODksCisJIDB4MTksIDB4NjAsIDB4NzcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4NTUsIDB4RkIsIDB4MUYsIDB4RjIsIDB4MzksIDB4RjEsIDB4RTAsIDB4NjAsCisJIDB4RkYsIDB4QjUsIDB4MEEsIDB4MTgsIDB4NjAsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RDAsIDB4ODQsIDB4RTAsIDB4QTAsIDB4MDIsIDB4MEQsIDB4MDAsIDB4NjQsCisJIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDQsIDB4MUYsIDB4NjQsIDB4NjAsIDB4NDcsIDB4QjQsIDB4ODEsIDB4MDcsIDB4NjAsIDB4RUEsIDB4RjEsIDB4RkYsIDB4RkYsCisJIDB4QjEsIDB4OEMsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsIDB4MTAsIDB4MDAsIDB4MjksIDB4NjAsIDB4QzAsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MUYsIDB4QjQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDksIDB4NkIsCisJIDB4NjAsIDB4NEMsIDB4QjUsIDB4RkYsIDB4NjQsIDB4NEMsIDB4MTQsIDB4MDAsIDB4MjksIDB4NjAsIDB4QzAsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MUYsIDB4QjQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MDUsIDB4NjAsIDB4NjksIDB4NkIsCisJIDB4NjAsIDB4NEMsIDB4QjUsIDB4RkYsIDB4NjQsIDB4NEMsIDB4N0MsIDB4NDQsIDB4MjksIDB4NDAsIDB4ODAsIDB4MkIsIDB4NjcsIDB4NDQsIDB4NjAsIDB4NEMsCisJIDB4MDAsIDB4RTEsIDB4ODQsIDB4RkYsIDB4QzIsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4MEQsIDB4MDAsIDB4RTUsIDB4RkUsCisJIDB4MDMsIDB4MDQsIDB4QUEsIDB4NjAsIDB4NkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDcsIDB4MjIsCisJIDB4NDMsIDB4RkYsIDB4QTMsIDB4NjAsIDB4RjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4NjQsIDB4M0EsIDB4REIsIDB4MDEsIDB4NjAsIDB4MEEsIDB4RTEsCisJIDB4MUMsIDB4NDIsIDB4MjIsIDB4NDYsIDB4MTMsIDB4RjIsIDB4RkYsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MkEsIDB4RjIsIDB4NDAsIDB4NDUsIDB4NDAsIDB4NDgsCisJIDB4MDQsIDB4MkIsIDB4MTMsIDB4MDAsIDB4MTYsIDB4RjIsIDB4MUQsIDB4RjIsIDB4NDAsIDB4NDMsIDB4MEYsIDB4RjIsIDB4NDAsIDB4NEQsIDB4MEYsIDB4NjQsCisJIDB4MTQsIDB4RjAsIDB4MzUsIDB4RjIsIDB4QTAsIDB4ODIsIDB4MEYsIDB4QjQsIDB4Q0EsIDB4ODUsIDB4RDQsIDB4ODAsIDB4MTAsIDB4RjIsIDB4MDEsIDB4MDIsCisJIDB4MkIsIDB4RkEsIDB4MjcsIDB4NDQsIDB4NDAsIDB4QkMsIDB4NDAsIDB4NDcsIDB4MTMsIDB4MDAsIDB4MTcsIDB4RjIsIDB4MkMsIDB4RjAsIDB4NDAsIDB4NDMsCisJIDB4MUIsIDB4RjIsIDB4MUQsIDB4RkEsIDB4NDAsIDB4NEQsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDIsIDB4MDAsIDB4QUIsIDB4RkMsIDB4MDUsIDB4MDAsCisJIDB4MjgsIDB4NDAsIDB4QTQsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MTEsIDB4RjIsIDB4MkIsIDB4RkEsIDB4MjcsIDB4NDQsIDB4QkYsIDB4QjQsIDB4NDAsIDB4NDcsCisJIDB4RjAsIDB4RkUsIDB4QjAsIDB4NjAsIDB4QjAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4NDYsIDB4MkMsIDB4RjAsIDB4MjcsIDB4NDQsIDB4REYsIDB4QjQsCisJIDB4NDAsIDB4NDcsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDksIDB4MDAsIDB4MkEsIDB4RjIsIDB4MzksIDB4RjAsIDB4OEYsIDB4QjAsIDB4ODgsIDB4M0EsCisJIDB4MEQsIDB4MDAsIDB4NjQsIDB4NDQsIDB4NjAsIDB4QjAsIDB4MjAsIDB4M0EsIDB4MDksIDB4MDAsIDB4MjgsIDB4NDQsIDB4MDQsIDB4MjcsIDB4MDUsIDB4MDAsCisJIDB4RDQsIDB4M0EsIDB4MDMsIDB4MDAsIDB4QUUsIDB4NEYsIDB4RjcsIDB4QjQsIDB4QTAsIDB4NUUsIDB4MTEsIDB4MDAsIDB4MkEsIDB4RjAsIDB4MDEsIDB4NjUsCisJIDB4NjQsIDB4NDAsIDB4QTQsIDB4M0EsIDB4MDQsIDB4NjUsIDB4MjcsIDB4NDQsIDB4MzQsIDB4ODcsIDB4MzYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NTYsCisJIDB4QUQsIDB4RTIsIDB4MDQsIDB4NjQsIDB4M0EsIDB4REIsIDB4NDEsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4MDYsIDB4NjQsCisJIDB4M0EsIDB4REIsIDB4MjIsIDB4NDYsIDB4MDEsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4QzIsIDB4NjAsIDB4MUUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjgsIDB4NDAsIDB4QzQsIDB4M0EsIDB4MEMsIDB4MDAsIDB4MjcsIDB4NDQsIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDcsIDB4QTgsIDB4RTIsIDB4MDUsIDB4RTEsCisJIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MkEsIDB4RTgsIDB4M0MsIDB4NDYsIDB4QTQsIDB4NjAsIDB4QkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4NDAsCisJIDB4MDEsIDB4MkIsIDB4MDUsIDB4MDAsIDB4NjcsIDB4NEMsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MDUsIDB4NjAsIDB4NjksIDB4NkIsIDB4MDcsIDB4NjAsCisJIDB4RUIsIDB4RjEsIDB4MUYsIDB4RjIsIDB4MkEsIDB4RTgsIDB4QjAsIDB4ODEsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsIDB4MTQsIDB4MDAsIDB4NjEsIDB4NEMsCisJIDB4MjksIDB4NjAsIDB4QzAsIDB4NjUsIDB4NjEsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NUEsIDB4RDEsCisJIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDksIDB4NkIsIDB4NjAsIDB4NEMsIDB4QjUsIDB4RkYsIDB4RkYsIDB4NjAsIDB4RjIsIDB4NjQsCisJIDB4NjQsIDB4NEMsIDB4NDAsIDB4NDMsIDB4MTgsIDB4MDAsIDB4MjksIDB4NDcsIDB4ODAsIDB4QjcsIDB4MzQsIDB4OTQsIDB4NjAsIDB4NEMsIDB4MjksIDB4NjAsCisJIDB4QzAsIDB4NjUsIDB4NjEsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsCisJIDB4MDAsIDB4RTEsIDB4MDUsIDB4NjAsIDB4NjksIDB4NkIsIDB4NjAsIDB4NEMsIDB4QjUsIDB4RkYsIDB4NjQsIDB4NEMsIDB4N0MsIDB4NDQsIDB4MjksIDB4NDAsCisJIDB4ODAsIDB4MkIsIDB4NjcsIDB4NDQsIDB4NjAsIDB4NEMsIDB4NDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MjgsIDB4NDUsIDB4QkYsIDB4NjAsCisJIDB4RkYsIDB4NjQsIDB4MjQsIDB4ODgsIDB4QzQsIDB4RTIsIDB4MDgsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjEsIDB4NDYsIDB4MkEsIDB4NDQsIDB4NzIsIDB4NDUsCisJIDB4MjQsIDB4RkEsIDB4QjIsIDB4RjMsIDB4MDYsIDB4MDQsIDB4RTQsIDB4RTIsIDB4REMsIDB4OUMsIDB4MjksIDB4NDAsIDB4MDEsIDB4MjYsIDB4NjQsIDB4NDQsCisJIDB4QjIsIDB4RjksIDB4MjUsIDB4RkEsIDB4QjMsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4QjMsIDB4RkIsIDB4MjgsIDB4RkEsIDB4QjQsIDB4RjMsCisJIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4QjQsIDB4RkIsIDB4MjksIDB4RkEsIDB4MjQsIDB4NDQsIDB4MDQsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MjgsIDB4NDAsCisJIDB4QTQsIDB4MzYsIDB4MDMsIDB4MDAsIDB4QTYsIDB4NjAsIDB4QjEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDMsIDB4ODQsIDB4QkIsIDB4RkMsIDB4QjMsCisJIDB4MjEsIDB4NDYsIDB4MDEsIDB4NUQsIDB4MEYsIDB4RkMsIDB4NUMsIDB4NDYsIDB4MDUsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MTMsIDB4MDAsCisJIDB4NTAsIDB4RkUsIDB4MjgsIDB4NDAsIDB4MDgsIDB4M0EsIDB4MTIsIDB4MDAsIDB4MkYsIDB4RjIsIDB4MzAsIDB4RjAsIDB4NjAsIDB4NDMsIDB4MzEsIDB4RjIsCisJIDB4MjIsIDB4NDYsIDB4NjQsIDB4NDEsIDB4MkMsIDB4RjAsIDB4MkQsIDB4RjAsIDB4RDMsIDB4ODAsIDB4MkUsIDB4RjAsIDB4RDEsIDB4ODAsIDB4RDAsIDB4ODAsCisJIDB4MjcsIDB4NDQsIDB4MDksIDB4MEMsIDB4MDMsIDB4MDAsIDB4MjcsIDB4NDQsIDB4MDYsIDB4MjIsIDB4MDUsIDB4MDAsIDB4QjgsIDB4QjQsIDB4NDAsIDB4NDcsCisJIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4RDQsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MEQsIDB4NjQsIDB4M0EsIDB4REIsIDB4N0MsIDB4NDQsCisJIDB4MUIsIDB4NjAsIDB4RjAsIDB4RkIsIDB4MjEsIDB4NDYsIDB4MUMsIDB4RjIsIDB4MDAsIDB4RTEsIDB4RjAsIDB4RkUsIDB4MDAsIDB4NjMsIDB4MjgsIDB4NDQsCisJIDB4QTQsIDB4MzYsIDB4MEEsIDB4MDAsIDB4MDQsIDB4MkIsIDB4MDgsIDB4MDAsIDB4MzAsIDB4RjMsIDB4MkQsIDB4NDUsIDB4RDQsIDB4ODQsIDB4Q0EsIDB4NjUsCisJIDB4RDQsIDB4ODMsIDB4MDEsIDB4NjQsIDB4MUIsIDB4NjAsIDB4RjAsIDB4RkIsIDB4RDQsIDB4NjQsIDB4MzUsIDB4MDAsIDB4MEYsIDB4NjQsIDB4M0EsIDB4REIsCisJIDB4MjEsIDB4NDYsIDB4MjksIDB4NDAsIDB4NDAsIDB4MjcsIDB4MTUsIDB4MDAsIDB4ODAsIDB4MjcsIDB4MDIsIDB4MDAsIDB4Q0EsIDB4NjUsIDB4MDEsIDB4MDAsCisJIDB4NkEsIDB4NjUsIDB4MUMsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4N0YsIDB4NDAsIDB4NDUsIDB4MEEsIDB4MzYsIDB4NzAsIDB4NjQsIDB4MTQsIDB4MzYsCisJIDB4MzgsIDB4NjQsIDB4MzcsIDB4MzYsIDB4MTUsIDB4NjQsIDB4NkUsIDB4M0EsIDB4MTcsIDB4MDAsIDB4ODQsIDB4N0YsIDB4NDAsIDB4NDUsIDB4MEIsIDB4NjQsCisJIDB4MTMsIDB4MDAsIDB4MUMsIDB4RjIsIDB4MUUsIDB4NjUsIDB4NDAsIDB4NDUsIDB4MEIsIDB4MzYsIDB4MUUsIDB4NjQsIDB4MEYsIDB4MzYsIDB4MTYsIDB4NjQsCisJIDB4MEEsIDB4MzYsIDB4MTIsIDB4NjQsIDB4MEUsIDB4MzYsIDB4MEUsIDB4NjQsIDB4MDksIDB4MzYsIDB4MEUsIDB4NjQsIDB4MEQsIDB4MzYsIDB4MEEsIDB4NjQsCisJIDB4MDgsIDB4MzYsIDB4MEEsIDB4NjQsIDB4MEMsIDB4MzYsIDB4MEEsIDB4NjQsIDB4NDAsIDB4NEQsIDB4MDAsIDB4RTEsIDB4RjAsIDB4RkUsIDB4MkIsIDB4RjIsCisJIDB4QzQsIDB4ODUsIDB4RDQsIDB4ODMsIDB4QzQsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MkYsIDB4RjAsIDB4QjAsIDB4RjAsIDB4QjEsIDB4RjIsIDB4QTEsIDB4RkYsCisJIDB4MTIsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4ODAsIDB4NEUsIDB4MTIsIDB4NzQsIDB4ODMsIDB4NEMsIDB4MTIsIDB4NzQsIDB4OUEsIDB4RkYsIDB4ODQsIDB4NEMsCisJIDB4MTIsIDB4NzQsIDB4ODUsIDB4NEMsIDB4MTIsIDB4NzQsIDB4ODEsIDB4NEMsIDB4MTIsIDB4NzQsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4QjIsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4MkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4MzUsIDB4RkIsCisJIDB4QjIsIDB4NjAsIDB4NzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjksIDB4NDQsIDB4RjcsIDB4QjQsIDB4NDAsIDB4NDksIDB4MjgsIDB4NDAsIDB4QzQsIDB4MzYsCisJIDB4MDcsIDB4MDAsIDB4MUIsIDB4NjAsIDB4RjAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MUIsIDB4QUUsIDB4NEYsIDB4RjcsIDB4QjQsIDB4QTAsIDB4NUUsCisJIDB4MjcsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDUsIDB4MDAsIDB4RkUsIDB4QjQsIDB4NDAsIDB4NDcsIDB4QTUsIDB4NjAsIDB4N0YsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTYsIDB4NjAsIDB4QUIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MzYsIDB4QzEsIDB4RkUsIDB4QTMsIDB4NjAsIDB4RTcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjgsIDB4NDAsIDB4QjQsIDB4M0EsIDB4MEIsIDB4MDAsIDB4MjcsIDB4NDQsIDB4MDcsIDB4MjIsIDB4MDUsIDB4MDAsIDB4RjgsIDB4QjQsCisJIDB4NDAsIDB4NDcsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4QTYsIDB4NjAsIDB4M0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NDQsCisJIDB4RDQsIDB4MzYsIDB4MDMsIDB4MDAsIDB4QTcsIDB4NjAsIDB4QzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTgsIDB4RTIsIDB4MjcsIDB4NDQsIDB4RkIsIDB4QjQsCisJIDB4NDAsIDB4NDcsIDB4MUMsIDB4NDIsIDB4MjIsIDB4NDYsIDB4MTksIDB4NjAsIDB4Q0YsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MzQsIDB4RkIsIDB4MkEsIDB4RjAsCisJIDB4RjcsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4QzQsIDB4MDAsIDB4MjIsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MjIsIDB4MjYsIDB4M0YsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDUsIDB4MDAsCisJIDB4QkEsIDB4MDAsIDB4MDQsIDB4MkIsIDB4QjgsIDB4MDAsIDB4QTYsIDB4RjUsIDB4MDEsIDB4MDAsIDB4MDcsIDB4RjQsIDB4NEIsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4ODQsIDB4NEIsIDB4RkEsIDB4MEMsIDB4NjAsIDB4RkMsIDB4NjIsIDB4ODAsIDB4RkYsIDB4QzgsIDB4NjAsIDB4NzgsIDB4NDQsIDB4MDIsIDB4QTQsCisJIDB4QTIsIDB4REIsIDB4OEMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODIsIDB4RkYsIDB4QTYsIDB4RjMsIDB4NjYsIDB4NUMsIDB4RDAsIDB4ODAsIDB4MDAsIDB4N0MsCisJIDB4MDcsIDB4MDMsIDB4NjYsIDB4NDMsIDB4MjIsIDB4NDYsIDB4MjIsIDB4RjIsIDB4NjMsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDEsIDB4MDAsCisJIDB4M0MsIDB4RjEsIDB4NEIsIDB4RjAsIDB4NjQsIDB4NDEsIDB4NjQsIDB4NDcsIDB4NjAsIDB4NUYsIDB4MjAsIDB4QkMsIDB4ODAsIDB4MjYsIDB4ODAsIDB4QUMsCisJIDB4NjAsIDB4NDcsIDB4MjIsIDB4NDYsIDB4M0EsIDB4RkEsIDB4NjQsIDB4NDQsIDB4MjAsIDB4N0YsIDB4MzQsIDB4OTQsIDB4M0IsIDB4RkEsIDB4MDgsIDB4NjAsCisJIDB4MDAsIDB4RUEsIDB4MEYsIDB4NjQsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsCisJIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4ODAsIDB4MDAsIDB4MkEsIDB4RjIsIDB4MDAsIDB4NjAsIDB4N0MsIDB4NjIsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsCisJIDB4MjQsIDB4MDAsIDB4QTIsIDB4RDMsIDB4MDAsIDB4NjEsIDB4NjAsIDB4RkUsIDB4QTAsIDB4RDMsIDB4NUUsIDB4RDEsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsCisJIDB4NjQsIDB4NUYsIDB4REMsIDB4ODQsIDB4RjEsIDB4ODEsIDB4QzAsIDB4MkIsIDB4MDQsIDB4MDAsIDB4ODAsIDB4MkEsIDB4MDIsIDB4MDAsIDB4N0YsIDB4QTQsCisJIDB4REMsIDB4ODQsIDB4RkYsIDB4M0IsIDB4MDMsIDB4MDAsIDB4NjAsIDB4NDcsIDB4REMsIDB4ODcsIDB4MDEsIDB4NjEsIDB4QzAsIDB4ODAsIDB4MDAsIDB4MzYsCisJIDB4REMsIDB4ODQsIDB4NEUsIDB4REIsIDB4NjAsIDB4RkUsIDB4NUEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4QzEsIDB4ODQsIDB4RjAsIDB4MjIsIDB4MTAsIDB4QTQsCisJIDB4RjAsIDB4MkEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4M0UsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4QTAsIDB4RDMsIDB4NUEsIDB4RDEsIDB4M0EsIDB4RkEsIDB4M0IsIDB4RjgsIDB4NzQsIDB4NjIsIDB4QTIsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsCisJIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTIsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDEsIDB4NUEsIDB4RDEsIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDQsCisJIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTQsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTUsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTYsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4NjUsIDB4NDAsIDB4MEQsIDB4M0EsIDB4MUMsIDB4MDAsIDB4NjQsIDB4NDcsIDB4RTgsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsCisJIDB4RTksIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUEsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUIsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUMsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4NjQsIDB4NDcsIDB4RUUsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUYsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDgsIDB4NjAsCisJIDB4MDAsIDB4RUEsIDB4NjUsIDB4NDQsIDB4MDIsIDB4QTQsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsCisJIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4MEIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4N0YsIDB4QjQsIDB4MEMsIDB4RjAsIDB4MDQsIDB4MDIsCisJIDB4NjQsIDB4NDYsIDB4MDAsIDB4RjAsIDB4MDQsIDB4NjQsIDB4MjIsIDB4NDYsIDB4MDMsIDB4RkEsIDB4NjAsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MDEsIDB4RjIsCisJIDB4RkMsIDB4QTEsIDB4NjEsIDB4NDUsIDB4RDQsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDIsIDB4MDAsIDB4RjAsIDB4MDQsIDB4NjMsIDB4NjQsIDB4NDYsCisJIDB4MDEsIDB4RjIsIDB4MjIsIDB4NDYsIDB4MUEsIDB4RkEsIDB4MDMsIDB4RkMsIDB4MDIsIDB4MDAsIDB4MjIsIDB4NDYsIDB4MUEsIDB4RkEsIDB4MzUsIDB4RjIsCisJIDB4MDQsIDB4RjgsIDB4REMsIDB4ODQsIDB4MzUsIDB4RkEsIDB4MTQsIDB4RjIsIDB4MEYsIDB4QjUsIDB4MEYsIDB4QjQsIDB4Q0MsIDB4ODQsIDB4OTQsIDB4ODAsCisJIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MkEsIDB4RjIsIDB4MDEsIDB4MDIsIDB4OTQsIDB4ODQsIDB4MkEsIDB4RkEsIDB4OTUsIDB4RkMsIDB4MDYsIDB4MDAsCisJIDB4QzQsIDB4M0EsIDB4MDcsIDB4MDAsIDB4MjcsIDB4NDQsIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDcsIDB4QTgsIDB4RTIsIDB4QTUsIDB4NjAsIDB4MUMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjgsIDB4NDQsIDB4MDQsIDB4MjYsIDB4MDUsIDB4MDAsIDB4NjgsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MzIsIDB4NDQsIDB4MDAsIDB4MjcsCisJIDB4MDMsIDB4MDAsIDB4QTMsIDB4NjAsIDB4RjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4NjQsIDB4M0EsIDB4REIsIDB4QTMsIDB4NjAsIDB4RjQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEUsIDB4NjQsIDB4M0EsIDB4REIsIDB4M0MsIDB4NDQsIDB4NjAsIDB4NDYsIDB4MUUsIDB4RjAsIDB4NDAsIDB4NDIsIDB4NjQsIDB4NDAsCisJIDB4NDAsIDB4MjcsIDB4NDgsIDB4MDAsIDB4MUYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjcsIDB4M0MsIDB4MDAsIDB4ODAsIDB4MkIsCisJIDB4MEIsIDB4MDAsIDB4QkYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjksIDB4NDQsCisJIDB4MzQsIDB4ODksIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjMsIDB4MDUsIDB4MDAsIDB4M0YsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksCisJIDB4MDAsIDB4NjMsIDB4MUUsIDB4RjIsIDB4MzksIDB4RjEsIDB4QzAsIDB4NjAsIDB4RkYsIDB4QjUsIDB4MEEsIDB4MTgsIDB4NjAsIDB4NDcsIDB4MUYsIDB4QjQsCisJIDB4RDAsIDB4ODQsIDB4RTAsIDB4QTAsIDB4MDIsIDB4MEQsIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDQsIDB4MUYsIDB4NjQsIDB4NjAsIDB4NDcsCisJIDB4QjQsIDB4ODQsIDB4MDcsIDB4NjAsIDB4RUEsIDB4RjEsIDB4M0MsIDB4OTQsIDB4QjAsIDB4ODQsIDB4NjAsIDB4NEMsIDB4MjksIDB4NjAsIDB4QzAsIDB4NjUsCisJIDB4NjAsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsCisJIDB4MDUsIDB4NjAsIDB4NjksIDB4NkIsIDB4NjAsIDB4NEMsIDB4QjUsIDB4RkYsIDB4NjQsIDB4NEMsIDB4N0MsIDB4NDQsIDB4MjksIDB4NDAsIDB4ODAsIDB4MkIsCisJIDB4NjcsIDB4NDQsIDB4NjAsIDB4NEMsIDB4MzIsIDB4MDAsIDB4MTksIDB4NjAsIDB4N0IsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjYsCisJIDB4Q0IsIDB4MDEsIDB4QkYsIDB4MDEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjksIDB4NDQsIDB4MzQsIDB4ODksIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjMsCisJIDB4OUYsIDB4RjIsIDB4MUUsIDB4RjIsIDB4MzksIDB4RjEsIDB4QzAsIDB4NjAsIDB4RkYsIDB4QjUsIDB4MEEsIDB4MTgsIDB4NjAsIDB4NDcsIDB4MUYsIDB4QjQsCisJIDB4RDAsIDB4ODQsIDB4RTAsIDB4QTAsIDB4MDIsIDB4MEQsIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDQsIDB4MUYsIDB4NjQsIDB4NjAsIDB4NDcsCisJIDB4QjQsIDB4ODQsIDB4MDcsIDB4NjAsIDB4RUEsIDB4RjEsIDB4M0MsIDB4OTQsIDB4QjAsIDB4ODEsIDB4NjEsIDB4NEMsIDB4MjksIDB4NjAsIDB4QzAsIDB4NjUsCisJIDB4NjEsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsCisJIDB4MDEsIDB4NjAsIDB4MDksIDB4NkIsIDB4NjAsIDB4NEMsIDB4QjUsIDB4RkYsIDB4NjQsIDB4NEMsIDB4NDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsCisJIDB4ODQsIDB4RkYsIDB4QzIsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4MkEsIDB4RjIsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjUsCisJIDB4QTQsIDB4ODQsIDB4QjQsIDB4QkMsIDB4MUUsIDB4RjAsIDB4NDAsIDB4NDgsIDB4NjQsIDB4NDAsIDB4NDAsIDB4MjcsIDB4MTcsIDB4MDAsIDB4MUMsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MEEsIDB4MzYsIDB4MDYsIDB4MDAsIDB4MTQsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MzcsIDB4MzYsIDB4MDgsIDB4MDAsCisJIDB4NkUsIDB4MzYsIDB4MDksIDB4MDAsIDB4NzAsIDB4N0MsIDB4QTAsIDB4NjMsIDB4MEYsIDB4MDAsIDB4MzgsIDB4N0MsIDB4NTAsIDB4NjMsIDB4MEMsIDB4MDAsCisJIDB4MTUsIDB4N0MsIDB4MUUsIDB4NjMsIDB4MDksIDB4MDAsIDB4MEIsIDB4N0MsIDB4MEYsIDB4NjMsIDB4MDYsIDB4MDAsIDB4OUMsIDB4RjQsIDB4RkYsIDB4NjUsCisJIDB4NjMsIDB4NDcsIDB4QTQsIDB4OUMsIDB4QTcsIDB4ODQsIDB4MjMsIDB4MDAsIDB4NDAsIDB4NDUsIDB4NDMsIDB4NEQsIDB4MDAsIDB4RTEsIDB4RjAsIDB4RkUsCisJIDB4MjksIDB4NDAsIDB4ODAsIDB4MkIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4NjAsIDB4NkEsIDB4NjUsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjAsIDB4Q0EsIDB4NjUsCisJIDB4MUYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjcsIDB4MEUsIDB4MDAsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MDQsIDB4MjcsIDB4MDMsIDB4MDAsIDB4NjUsIDB4NDQsIDB4RTAsIDB4ODUsIDB4MTIsIDB4MDAsIDB4MkIsIDB4RjIsIDB4MTEsIDB4RjAsIDB4QzAsIDB4ODQsCisJIDB4RDAsIDB4ODQsIDB4QzQsIDB4ODMsIDB4MTEsIDB4MDAsIDB4MUUsIDB4NjQsIDB4QzQsIDB4ODQsIDB4NjAsIDB4NDUsIDB4MDgsIDB4MDAsIDB4NDAsIDB4NDUsCisJIDB4RkYsIDB4NjAsIDB4RjgsIDB4NjQsIDB4NDAsIDB4NDMsIDB4MDAsIDB4RTEsIDB4RjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4M0MsIDB4NjUsIDB4OTEsIDB4RjQsCisJIDB4MUIsIDB4RjAsIDB4QzMsIDB4ODQsIDB4QzQsIDB4ODQsIDB4QzAsIDB4ODMsIDB4MjgsIDB4NDQsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4ODAsIDB4NEUsCisJIDB4MTIsIDB4NzQsIDB4ODMsIDB4NEMsIDB4OUEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4NTYsIDB4NjIsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsCisJIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4NUMsIDB4NjIsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsCisJIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4QjIsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MkQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QkMsIDB4RkYsIDB4QjUsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4NDcsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDIsIDB4QkMsIDB4NDAsIDB4NDcsCisJIDB4MzYsIDB4RjMsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsIDB4N0MsIDB4NEIsIDB4NjAsIDB4NTYsCisJIDB4QUQsIDB4RTIsIDB4QTUsIDB4NjAsIDB4NzksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4N0IsIDB4RjMsIDB4MTksIDB4NjAsIDB4M0IsIDB4RjMsCisJIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjYsIDB4MEIsIDB4MDAsIDB4MDcsIDB4QjQsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MjksIDB4NDQsCisJIDB4QkYsIDB4NjAsIDB4RkYsIDB4QjcsIDB4ODAsIDB4QkYsIDB4NDAsIDB4NDksIDB4ODAsIDB4NjcsIDB4MDUsIDB4MDAsIDB4M0YsIDB4NjAsIDB4RkYsIDB4NjUsCisJIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4MDAsIDB4NjQsIDB4MTYsIDB4NjAsIDB4NTAsIDB4RjEsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4NTUsIDB4RjksCisJIDB4MzksIDB4RjEsIDB4MTYsIDB4NjAsIDB4M0MsIDB4RjEsIDB4NjQsIDB4NDEsIDB4NjQsIDB4NUUsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDcsIDB4MUYsIDB4QjQsCisJIDB4NTQsIDB4OTQsIDB4RTAsIDB4QTAsIDB4MDIsIDB4MEQsIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDQsIDB4MUYsIDB4NjQsIDB4NjAsIDB4NDcsCisJIDB4MDcsIDB4NjAsIDB4RUEsIDB4RjEsIDB4QjQsIDB4ODQsIDB4QjAsIDB4OEMsIDB4MjksIDB4NjAsIDB4QzAsIDB4N0MsIDB4NjAsIDB4NDcsIDB4MUYsIDB4QjQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NDAsIDB4RDMsIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MDUsIDB4NjAsIDB4NjksIDB4NkIsCisJIDB4NjAsIDB4NEMsIDB4QjUsIDB4RkYsIDB4NjQsIDB4NEMsIDB4N0MsIDB4NDQsIDB4MjksIDB4NDAsIDB4ODAsIDB4MkIsIDB4NjcsIDB4NDQsIDB4NjAsIDB4NEMsCisJIDB4NDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4ODQsIDB4RkYsIDB4QzIsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsCisJIDB4M0MsIDB4NDQsIDB4NjAsIDB4NDYsIDB4NDAsIDB4NDIsIDB4MTMsIDB4NjQsIDB4M0EsIDB4REIsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4M0MsIDB4NDYsCisJIDB4MkEsIDB4RjIsIDB4MTksIDB4NjAsIDB4M0IsIDB4RjEsIDB4QTQsIDB4ODQsIDB4QzQsIDB4QkMsIDB4NDAsIDB4NDgsIDB4NjQsIDB4NDQsIDB4MDQsIDB4MjYsCisJIDB4MDksIDB4MDAsIDB4MDIsIDB4MjYsIDB4MEEsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MEIsIDB4MDAsIDB4MDgsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MEIsIDB4NjMsCisJIDB4NkUsIDB4NjQsIDB4MDgsIDB4MDAsIDB4MTUsIDB4NjMsIDB4MzcsIDB4NjQsIDB4MDUsIDB4MDAsIDB4MzgsIDB4NjMsIDB4MTQsIDB4NjQsIDB4MDIsIDB4MDAsCisJIDB4NzAsIDB4NjMsIDB4MEEsIDB4NjQsIDB4NDMsIDB4NEQsIDB4NDAsIDB4NDUsIDB4MDAsIDB4RTEsIDB4RjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MUUsIDB4NjQsCisJIDB4MUIsIDB4RjAsIDB4MTEsIDB4RjAsIDB4QzAsIDB4ODQsIDB4QzAsIDB4ODQsIDB4NjAsIDB4NDMsIDB4MjgsIDB4NDQsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsCisJIDB4ODAsIDB4NEUsIDB4MTIsIDB4NzQsIDB4ODMsIDB4NEMsIDB4OUEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4NUMsIDB4NjIsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsCisJIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4QjIsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4MkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4MzUsIDB4RkIsIDB4QjIsIDB4NjAsCisJIDB4NzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QzQsIDB4RTIsIDB4MDgsIDB4NjQsIDB4M0EsIDB4REIsIDB4QTQsIDB4NjAsIDB4QkYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDMsIDB4MjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEUsIDB4MDAsIDB4MUQsIDB4RkYsIDB4MjYsIDB4NDQsIDB4MDIsIDB4QkMsIDB4NDAsIDB4NDYsCisJIDB4MjcsIDB4NDQsIDB4MDcsIDB4MjIsIDB4MDUsIDB4MDAsIDB4RjgsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDYsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsCisJIDB4MzAsIDB4RjEsIDB4ODEsIDB4MDAsIDB4RkMsIDB4QjMsIDB4MzIsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MEEsIDB4QkIsIDB4MEYsIDB4RkMsCisJIDB4Q0IsIDB4RkUsIDB4QTMsIDB4NjAsIDB4RjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NDQsIDB4MDQsIDB4MjYsIDB4MjksIDB4MDAsIDB4MEYsIDB4RkMsCisJIDB4MDUsIDB4RkYsIDB4REIsIDB4RjMsIDB4MjgsIDB4NDAsIDB4ODAsIDB4M0EsIDB4MjMsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDMsIDB4M0EsIDB4MjAsIDB4MDAsCisJIDB4MzIsIDB4RjIsIDB4N0YsIDB4RjEsIDB4MzMsIDB4RjIsIDB4RDAsIDB4ODAsIDB4ODAsIDB4RjEsIDB4MUEsIDB4MDIsIDB4RDAsIDB4ODAsIDB4MzQsIDB4RjIsCisJIDB4ODEsIDB4RjEsIDB4MTYsIDB4MDIsIDB4RDAsIDB4ODAsIDB4M0MsIDB4NDQsIDB4MTMsIDB4MDIsIDB4QUMsIDB4ODYsIDB4QkIsIDB4RkUsIDB4MTAsIDB4MDMsCisJIDB4MkEsIDB4RjIsIDB4MjEsIDB4NDYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4M0EsIDB4MEIsIDB4MDAsIDB4MDEsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsCisJIDB4MDAsIDB4NjQsIDB4MzIsIDB4RkIsIDB4NDMsIDB4RkYsIDB4ODQsIDB4RkYsIDB4QzIsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsCisJIDB4MzAsIDB4RjEsIDB4MjcsIDB4NDQsIDB4MDUsIDB4MjIsIDB4MzQsIDB4MDAsIDB4RkEsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MjQsIDB4NDQsIDB4MTAsIDB4MkEsCisJIDB4MkIsIDB4MDAsIDB4MjgsIDB4NDAsIDB4RDQsIDB4M0EsIDB4MjgsIDB4MDAsIDB4MzEsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDAsIDB4N0MsIDB4MjksIDB4NDAsCisJIDB4NTAsIDB4MkIsIDB4MEQsIDB4MDAsIDB4RUYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4MzEsIDB4NDAsIDB4MDgsIDB4MkEsCisJIDB4MDYsIDB4MDAsIDB4MUMsIDB4NjAsIDB4MTEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODUsIDB4MkIsIDB4NDQsIDB4MDUsIDB4MDUsIDB4MkIsIDB4NDQsCisJIDB4RkYsIDB4QTQsIDB4MDEsIDB4QTQsIDB4MDQsIDB4MjQsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4NzAsIDB4NDUsIDB4MDIsIDB4MjgsIDB4NjQsIDB4NDQsCisJIDB4QzQsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjQsIDB4MDAsIDB4QjQsIDB4NjAsIDB4NTAsIDB4MDgsIDB4MjgsIDB4MDEsIDB4MDAsIDB4MjAsIDB4MjksCisJIDB4NkQsIDB4RTIsIDB4QTUsIDB4NjAsIDB4N0YsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MDcsIDB4MDAsCisJIDB4MDIsIDB4MkEsIDB4MDUsIDB4MDAsIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDYsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MDUsIDB4NjQsCisJIDB4M0EsIDB4REIsIDB4MjgsIDB4NDQsIDB4QTQsIDB4M0EsIDB4MDcsIDB4MDAsIDB4MDEsIDB4NjAsIDB4MDIsIDB4N0MsIDB4MjUsIDB4NDQsIDB4MEEsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjAsIDB4M0EsIDB4N0MsIDB4MzEsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDAsIDB4N0MsIDB4MjksIDB4NDAsIDB4NTAsIDB4MkIsCisJIDB4MEQsIDB4MDAsIDB4RUYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4MzEsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDYsIDB4MDAsCisJIDB4MUMsIDB4NjAsIDB4MTEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODUsIDB4MkIsIDB4NDQsIDB4MDUsIDB4MDUsIDB4MkIsIDB4NDQsIDB4RkYsIDB4QTQsCisJIDB4MDEsIDB4QTQsIDB4MDQsIDB4MjQsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4NzAsIDB4NDUsIDB4MDIsIDB4MjgsIDB4NjQsIDB4NDQsIDB4QzQsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjQsIDB4MDAsIDB4QjQsIDB4MjgsIDB4NDAsIDB4RTQsIDB4MzYsIDB4MDAsIDB4QjQsIDB4NjAsIDB4NTAsIDB4MDgsIDB4MjgsCisJIDB4MDEsIDB4MDAsIDB4MjAsIDB4MjksIDB4NkQsIDB4RTIsIDB4QTMsIDB4NjAsIDB4RTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDUsIDB4MjIsCisJIDB4MDksIDB4MDAsIDB4QkEsIDB4QjQsIDB4NDAsIDB4NDcsIDB4M0MsIDB4NDYsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4QTMsIDB4NjAsCisJIDB4RjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDIsIDB4MkEsIDB4MDYsIDB4MDAsIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDYsIDB4NjQsCisJIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4RjQsIDB4MDEsIDB4RjMsIDB4MEEsIDB4N0MsIDB4NTAsIDB4NkQsIDB4RTIsIDB4RjAsIDB4MDEsIDB4NzIsIDB4NDUsCisJIDB4REMsIDB4ODQsIDB4QjIsIDB4RkIsIDB4MTEsIDB4NjQsIDB4M0EsIDB4REIsIDB4QjMsIDB4RjMsIDB4MDYsIDB4MDQsIDB4REMsIDB4ODQsIDB4QjMsIDB4RkIsCisJIDB4QjQsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4QjQsIDB4RkIsIDB4QTQsIDB4NjAsIDB4MDEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjEsCisJIDB4MTIsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjAsIDB4NjAsIDB4MDQsIDB4NjMsIDB4QkQsIDB4RDMsIDB4NzIsIDB4NDUsIDB4NDQsIDB4OEEsIDB4MDIsIDB4MjgsCisJIDB4MDMsIDB4MDAsIDB4RTQsIDB4RTIsIDB4REQsIDB4ODEsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MjgsIDB4MDIsIDB4MDAsIDB4RTQsIDB4RTIsIDB4REQsIDB4ODEsCisJIDB4QkQsIDB4RDMsIDB4QjIsIDB4RjEsIDB4NjEsIDB4NDUsIDB4QzAsIDB4ODQsIDB4MDAsIDB4NjEsIDB4MDIsIDB4MjQsIDB4MDEsIDB4QjksIDB4QzQsIDB4ODQsCisJIDB4NjAsIDB4NTUsIDB4MkEsIDB4NTIsIDB4RTQsIDB4RTIsIDB4QjIsIDB4RkIsIDB4MDIsIDB4MjQsIDB4MDEsIDB4QjksIDB4QkQsIDB4RDMsIDB4QjMsIDB4RjEsCisJIDB4NjEsIDB4NDUsIDB4QzAsIDB4ODQsIDB4MDAsIDB4NjEsIDB4MDIsIDB4MjQsIDB4MDEsIDB4QjksIDB4QzQsIDB4ODQsIDB4QjMsIDB4RkIsIDB4MDIsIDB4MjQsCisJIDB4MDEsIDB4QjksIDB4QkQsIDB4RDMsIDB4QjQsIDB4RjEsIDB4NjEsIDB4NDUsIDB4QzAsIDB4ODQsIDB4QzQsIDB4ODQsIDB4QjQsIDB4RkIsIDB4QTUsIDB4NjAsCisJIDB4MTQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QjAsIDB4NjAsIDB4OUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDcsIDB4RkYsIDB4MUIsIDB4NjAsIDB4RUUsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4MTgsIDB4QUUsIDB4NEYsIDB4MDgsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUUsIDB4QzgsIDB4NzQsIDB4Q0QsIDB4RTIsCisJIDB4QUEsIDB4NjAsIDB4QjksIDB4NzgsIDB4MDAsIDB4NjEsIDB4QTMsIDB4NjAsIDB4RjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QUIsIDB4NjAsIDB4RTgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjEsIDB4NDYsIDB4NUMsIDB4NDQsIDB4MjYsIDB4NDQsIDB4MDIsIDB4MjYsIDB4MDEsIDB4MDAsIDB4M0UsIDB4NDYsIDB4MDksIDB4RjIsCisJIDB4NDYsIDB4NDEsIDB4NjYsIDB4NDAsIDB4RjMsIDB4MTgsIDB4NDAsIDB4NUUsIDB4RkQsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NDAsIDB4NDYsIDB4NDEsIDB4NUQsCisJIDB4MDAsIDB4NjQsIDB4MzEsIDB4RkEsIDB4MDAsIDB4RjIsIDB4NDYsIDB4NDUsIDB4ODcsIDB4RkMsIDB4QUMsIDB4RTIsIDB4MDEsIDB4NjQsIDB4MzMsIDB4RkIsCisJIDB4MzIsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MjEsIDB4MDAsIDB4MTksIDB4RjMsIDB4MDEsIDB4NjAsIDB4MUUsIDB4RTEsIDB4MUQsIDB4MTgsIDB4ODAsIDB4NjQsCisJIDB4NDAsIDB4NDksIDB4MDAsIDB4RTEsIDB4MTksIDB4RkYsIDB4MDgsIDB4NjQsIDB4MkEsIDB4RkEsIDB4NUEsIDB4REEsIDB4MkMsIDB4RkEsIDB4NUEsIDB4REEsCisJIDB4NUEsIDB4REEsIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4RjEsIDB4RkIsIDB4NzIsIDB4NDQsIDB4MjQsIDB4RkEsIDB4QjIsIDB4RjMsCisJIDB4MjUsIDB4RkEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsCisJIDB4N0MsIDB4NEIsIDB4QTMsIDB4NjAsIDB4RjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MUEsIDB4RTEsIDB4M0YsIDB4NjAsCisJIDB4Q0YsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4MkUsIDB4NDQsIDB4MDAsIDB4MzYsIDB4NDgsIDB4MDAsIDB4MDEsIDB4M0EsIDB4RTUsIDB4MDAsCisJIDB4ODgsIDB4RkYsIDB4NDAsIDB4NjcsIDB4MjksIDB4NDUsIDB4MzQsIDB4ODksIDB4MDQsIDB4NjQsIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsCisJIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDUsIDB4NjUsIDB4NDQsIDB4MEYsIDB4QjQsIDB4NDAsIDB4NDUsIDB4MUMsIDB4RkEsIDB4NjUsIDB4NDQsIDB4MjksIDB4NDEsCisJIDB4RjksIDB4ODEsIDB4NTIsIDB4NEEsIDB4NzEsIDB4ODksIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODMsIDB4MUQsIDB4RkMsCisJIDB4MUIsIDB4RkMsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjksIDB4NDQsIDB4MzQsIDB4ODksIDB4NTAsIDB4NEIsIDB4NjcsIDB4NTAsIDB4NjksIDB4RTIsCisJIDB4QjYsIDB4RjEsIDB4RkMsIDB4QTMsIDB4RDMsIDB4ODAsIDB4NDMsIDB4NDMsIDB4MDMsIDB4MDQsIDB4QUIsIDB4NjAsIDB4REUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDksIDB4N0MsIDB4RDMsIDB4ODAsIDB4OUEsIDB4RkYsIDB4MDMsIDB4MDcsIDB4QUIsIDB4NjAsIDB4REUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDQsCisJIDB4MDEsIDB4MjYsIDB4MEYsIDB4QUMsIDB4MjYsIDB4NjAsIDB4NEEsIDB4NjUsIDB4NDQsIDB4RDMsIDB4MTIsIDB4NjUsIDB4NDUsIDB4NDYsIDB4NjAsIDB4NDcsCisJIDB4NDAsIDB4N0YsIDB4MjcsIDB4RkEsIDB4OEYsIDB4RkMsIDB4MTgsIDB4NjEsIDB4RUEsIDB4RjEsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDQsIDB4REMsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MjEsIDB4MDMsIDB4NTAsIDB4RkUsIDB4QUMsIDB4NjAsIDB4QzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QzgsIDB4NjAsIDB4MEIsIDB4N0QsCisJIDB4MDgsIDB4NjAsIDB4MDAsIDB4NkIsIDB4QjUsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QUEsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4MDEsIDB4NjQsCisJIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MDUsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MjUsIDB4OEIsIDB4MDAsIDB4NkMsIDB4NDQsIDB4MEEsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MTQsIDB4MzYsIDB4MDUsIDB4MDAsIDB4MzcsIDB4MzYsCisJIDB4MDMsIDB4MDAsIDB4NkUsIDB4MzYsIDB4MDEsIDB4MDAsIDB4ODEsIDB4MDAsIDB4NDAsIDB4NDUsIDB4MzIsIDB4NzQsIDB4QTEsIDB4RkYsIDB4MUMsIDB4RkEsCisJIDB4NDAsIDB4NEUsIDB4OEMsIDB4NDQsIDB4NjAsIDB4NDMsIDB4MUQsIDB4RkEsIDB4MDEsIDB4RTEsIDB4MjAsIDB4NjQsIDB4M0EsIDB4REIsIDB4MkUsIDB4NDQsCisJIDB4MTQsIDB4MzYsIDB4MTIsIDB4MDAsIDB4MEEsIDB4MzYsIDB4MEYsIDB4MDAsIDB4NjMsIDB4NDUsIDB4RTMsIDB4ODMsIDB4RTMsIDB4ODMsIDB4QzcsIDB4ODMsCisJIDB4RTMsIDB4ODMsIDB4QzcsIDB4ODMsIDB4RkYsIDB4RkYsIDB4MzcsIDB4MzYsIDB4MDUsIDB4MDAsIDB4NkUsIDB4MzYsIDB4MDQsIDB4MDAsIDB4QUMsIDB4NjAsCisJIDB4QkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RkYsIDB4RkYsIDB4ODAsIDB4MjcsCisJIDB4Q0YsIDB4ODMsIDB4MUIsIDB4RkMsIDB4MDEsIDB4NjQsIDB4NTEsIDB4RkIsIDB4QTEsIDB4RkYsIDB4MjksIDB4NDEsIDB4RjksIDB4ODEsIDB4NTIsIDB4NEEsCisJIDB4NzEsIDB4ODksIDB4MkUsIDB4NDQsIDB4MjcsIDB4RkEsIDB4QjYsIDB4RjEsIDB4RkMsIDB4QTMsIDB4RDMsIDB4ODAsIDB4NDMsIDB4NDMsIDB4MDMsIDB4MDQsCisJIDB4QUIsIDB4NjAsIDB4REUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OUEsIDB4RkYsIDB4NTQsIDB4NjMsIDB4MTIsIDB4NjQsIDB4NDAsIDB4NDYsIDB4OEYsIDB4RkMsCisJIDB4MTgsIDB4NjEsIDB4RUEsIDB4RjEsIDB4NTAsIDB4RkUsIDB4NkMsIDB4NDAsIDB4OUUsIDB4MTUsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4ODAsIDB4RTEsCisJIDB4MDAsIDB4NjQsIDB4MzMsIDB4RkIsIDB4MjksIDB4NDAsIDB4NTAsIDB4MkIsIDB4MEYsIDB4MDAsIDB4MkIsIDB4NDQsIDB4NzAsIDB4NDUsIDB4QzQsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjQsIDB4MDAsIDB4QjQsIDB4NjAsIDB4NTAsIDB4MDgsIDB4MjgsIDB4MDEsIDB4MDAsIDB4MjAsIDB4MjksIDB4NkQsIDB4RTIsCisJIDB4RUYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4MDEsIDB4MTEsIDB4MTIsIDB4MDAsCisJIDB4MjksIDB4NDQsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDksIDB4MDEsIDB4NjQsIDB4MzMsIDB4RkIsIDB4QjYsIDB4RkYsIDB4MDAsIDB4RTEsIDB4MDEsIDB4NjAsCisJIDB4MUEsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkMsIDB4NDAsIDB4RkMsIDB4MTEsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4QUUsIDB4NEYsCisJIDB4RjcsIDB4QjQsIDB4QTAsIDB4NUUsIDB4QjUsIDB4RkYsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsCisJIDB4N0MsIDB4NEIsIDB4MzUsIDB4RTEsIDB4QUMsIDB4RTIsIDB4QUEsIDB4NjAsIDB4NDYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsIDB4N0YsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4MDAsIDB4MzYsIDB4MDAsIDB4M0IsIDB4QTIsIDB4REIsIDB4MjEsIDB4NjQsIDB4M0EsIDB4REIsIDB4QkQsIDB4MDEsCisJIDB4QUMsIDB4RTIsIDB4MDEsIDB4NjQsIDB4MzMsIDB4RkIsIDB4MDEsIDB4RTEsIDB4M0YsIDB4NjAsIDB4Q0YsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksCisJIDB4MkUsIDB4NDQsIDB4MDAsIDB4MzYsIDB4MjEsIDB4MDAsIDB4MDEsIDB4M0EsIDB4RjAsIDB4MDEsIDB4ODgsIDB4RkYsIDB4NDAsIDB4NjcsIDB4MjksIDB4NDUsCisJIDB4MzQsIDB4ODksIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDUsIDB4NjUsIDB4NDQsIDB4MEYsIDB4QjQsIDB4NDAsIDB4NDUsIDB4NjUsIDB4NDQsIDB4MjksIDB4NDEsCisJIDB4RjksIDB4ODEsIDB4NTIsIDB4NEEsIDB4NzEsIDB4ODksIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODMsIDB4MEUsIDB4N0MsCisJIDB4RDMsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4QUIsIDB4NjAsIDB4REUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDQsCisJIDB4REMsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RDIsIDB4MDMsIDB4NDEsIDB4MDAsIDB4QzgsIDB4NjAsIDB4MEIsIDB4N0QsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NkIsCisJIDB4QjUsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QUEsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MDUsIDB4RTEsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjUsIDB4QzEsIDB4MDEsIDB4NkMsIDB4NDQsIDB4MEEsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MTQsIDB4MzYsCisJIDB4MDUsIDB4MDAsIDB4MzcsIDB4MzYsIDB4MDMsIDB4MDAsIDB4NkUsIDB4MzYsIDB4MDEsIDB4MDAsIDB4QjcsIDB4MDEsIDB4NDAsIDB4NDUsIDB4MzIsIDB4NzQsCisJIDB4QTEsIDB4RkYsIDB4NDAsIDB4NEUsIDB4OEMsIDB4NDQsIDB4NjAsIDB4NDMsIDB4MDEsIDB4RTEsIDB4MjAsIDB4NjQsIDB4M0EsIDB4REIsIDB4MkUsIDB4NDQsCisJIDB4MTQsIDB4MzYsIDB4MDksIDB4MDAsIDB4MEEsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MzcsIDB4MzYsIDB4MDUsIDB4MDAsIDB4NkUsIDB4MzYsIDB4MDMsIDB4MDAsCisJIDB4QUMsIDB4NjAsIDB4QkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjQsIDB4NTEsIDB4RkIsIDB4QTEsIDB4RkYsIDB4MjksIDB4NDEsIDB4RjksIDB4ODEsCisJIDB4NTIsIDB4NEEsIDB4NzEsIDB4ODksIDB4MEUsIDB4N0MsIDB4RDMsIDB4ODAsIDB4NDMsIDB4NDMsIDB4MDMsIDB4MDMsIDB4QUIsIDB4NjAsIDB4REUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NkMsIDB4NDAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTUsIDB4OTAsIDB4MDEsIDB4MTIsIDB4NjQsIDB4NDAsIDB4NDYsIDB4RUEsIDB4RjEsCisJIDB4NTAsIDB4RkUsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NjEsIDB4OEMsIDB4NDQsIDB4RUIsIDB4RjAsIDB4NDAsIDB4NDgsIDB4OEMsIDB4NDQsIDB4MzAsIDB4RkIsCisJIDB4MDQsIDB4NjEsIDB4NTAsIDB4RkUsIDB4OEMsIDB4NDQsIDB4RDAsIDB4ODAsIDB4OEMsIDB4NDQsIDB4RDQsIDB4ODAsIDB4OEMsIDB4NDQsIDB4RUMsIDB4RjEsCisJIDB4MDAsIDB4NjUsIDB4RDAsIDB4ODAsIDB4MjgsIDB4NDQsIDB4MDEsIDB4MEMsIDB4MTMsIDB4MDAsIDB4MTAsIDB4NjUsIDB4NjAsIDB4NDAsIDB4QzQsIDB4MzYsCisJIDB4MDQsIDB4MDAsIDB4RDQsIDB4M0EsIDB4MEQsIDB4MDAsIDB4MjcsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MzAsIDB4NjUsIDB4MzUsIDB4ODQsIDB4QTEsIDB4RkYsCisJIDB4OEMsIDB4NDQsIDB4NDcsIDB4RkYsIDB4NTAsIDB4NEIsIDB4NjcsIDB4NTAsIDB4NjksIDB4RTIsIDB4NkEsIDB4NDQsIDB4NDAsIDB4MkIsIDB4MDksIDB4MTUsCisJIDB4MkMsIDB4NjAsIDB4RUMsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RTQsIDB4NzgsIDB4QjUsIDB4RjEsIDB4MkEsIDB4NjQsIDB4M0EsIDB4REIsCisJIDB4MUMsIDB4MDEsIDB4MjksIDB4NDAsIDB4MTAsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDQsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4OEMsIDB4NDQsIDB4QjYsIDB4RkYsCisJIDB4QjcsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4MDUsIDB4RTEsIDB4MDAsIDB4NjQsIDB4MzMsIDB4RkIsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDQsCisJIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDQsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDMsIDB4MDAsIDB4QjYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDQsCisJIDB4QTEsIDB4RkYsIDB4MDIsIDB4NzQsIDB4MjksIDB4NDQsIDB4NDAsIDB4MjcsIDB4MDUsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4QTEsIDB4RkYsIDB4Q0IsIDB4RjMsCisJIDB4QzQsIDB4RTIsIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsIDB4REMsIDB4ODQsIDB4RTAsIDB4OTQsIDB4MjYsIDB4NDQsIDB4ODQsIDB4QkMsCisJIDB4NDAsIDB4NDYsIDB4MjMsIDB4NjQsIDB4M0EsIDB4REIsIDB4QjUsIDB4RkYsIDB4QkMsIDB4RkYsIDB4NDcsIDB4RkYsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsCisJIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsIDB4N0MsIDB4NEIsIDB4QTksIDB4NjAsIDB4ODgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjksIDB4NjQsCisJIDB4M0EsIDB4REIsIDB4QTIsIDB4RkMsIDB4MzIsIDB4NDAsIDB4MDEsIDB4MkEsIDB4QjksIDB4MDAsIDB4MDEsIDB4NjAsIDB4MUEsIDB4RTEsIDB4MjMsIDB4NDMsCisJIDB4QTEsIDB4RkYsIDB4RUMsIDB4NDQsIDB4MkEsIDB4RkEsIDB4NDAsIDB4NDgsIDB4QTEsIDB4RkYsIDB4N0EsIDB4REMsIDB4N0UsIDB4MzYsIDB4MDQsIDB4QTIsCisJIDB4RkMsIDB4MUMsIDB4MDMsIDB4MUQsIDB4MDAsIDB4NjQsIDB4M0YsIDB4RkEsIDB4MkUsIDB4MDAsIDB4MDMsIDB4MkIsIDB4MDQsIDB4MDAsIDB4QTEsIDB4RkYsCisJIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4OEYsIDB4QjAsIDB4ODgsIDB4M0EsIDB4MDMsIDB4MDAsIDB4NzAsIDB4NjIsIDB4QTEsIDB4RkYsCisJIDB4N0EsIDB4REMsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDYsIDB4MDAsIDB4NzIsIDB4NjIsIDB4QTEsIDB4RkYsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsCisJIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4M0YsIDB4RkMsIDB4MDAsIDB4RjQsIDB4MTAsIDB4NjIsIDB4NkUsIDB4NjEsIDB4QTEsIDB4RkYsIDB4MDUsIDB4MUQsCisJIDB4MTIsIDB4MUUsIDB4MEMsIDB4MDAsIDB4MDAsIDB4RjQsIDB4N0MsIDB4NjEsIDB4MDIsIDB4NjIsIDB4N0EsIDB4REMsIDB4NjMsIDB4NDAsIDB4RkQsIDB4MUMsCisJIDB4RjksIDB4MUQsIDB4RkYsIDB4QjEsIDB4MDgsIDB4MUUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsCisJIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDQsIDB4NUEsIDB4REEsIDB4OTgsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDAsIDB4QTEsIDB4RkYsIDB4NDcsIDB4RkYsCisJIDB4N0MsIDB4NDQsIDB4MzMsIDB4RkIsIDB4MjYsIDB4NDQsIDB4RkQsIDB4QjQsIDB4ODQsIDB4QkMsIDB4MDEsIDB4MTUsIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDYsCisJIDB4NkMsIDB4NDAsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDUsIDB4QTEsIDB4RkYsIDB4N0YsIDB4NjAsIDB4N0YsIDB4N0MsCisJIDB4NkMsIDB4NDQsIDB4QTAsIDB4ODQsIDB4MTUsIDB4QTcsIDB4MTUsIDB4QTQsIDB4MjEsIDB4NDYsIDB4MjYsIDB4RkEsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsCisJIDB4MDcsIDB4MDAsIDB4QjYsIDB4RkYsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDQsIDB4MUEsIDB4RkEsIDB4MDksIDB4MDAsCisJIDB4NjUsIDB4NDQsIDB4MEYsIDB4QjQsIDB4MDYsIDB4QTgsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MDgsIDB4MjgsIDB4N0MsIDB4NDUsIDB4MjksIDB4NDQsCisJIDB4MzQsIDB4ODksIDB4MjcsIDB4RjAsIDB4NjUsIDB4NDQsIDB4NjQsIDB4NUUsIDB4MjcsIDB4RkEsIDB4ODEsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsCisJIDB4MDEsIDB4MTEsIDB4MTIsIDB4MDAsIDB4MjksIDB4NDQsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDksIDB4MDEsIDB4NjQsIDB4MzMsIDB4RkIsIDB4QjYsIDB4RkYsCisJIDB4MDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MUEsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkMsIDB4NDAsIDB4RkMsIDB4MTEsIDB4MDEsIDB4NjAsCisJIDB4MTgsIDB4RTEsIDB4QUUsIDB4NEYsIDB4RjcsIDB4QjQsIDB4QTAsIDB4NUUsIDB4MDAsIDB4NzAsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MjEsIDB4NDYsCisJIDB4QjUsIDB4RkYsIDB4QkMsIDB4RkYsIDB4NDcsIDB4RkYsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsCisJIDB4N0MsIDB4NEIsIDB4MjgsIDB4NDQsIDB4MDQsIDB4MjcsIDB4MDksIDB4MDAsIDB4RDQsIDB4MzYsIDB4MDQsIDB4MDAsIDB4MEMsIDB4MjIsIDB4MDIsIDB4MDAsCisJIDB4MEMsIDB4M0EsIDB4MDMsIDB4MDAsIDB4QUUsIDB4NEYsIDB4RjcsIDB4QjQsIDB4QTAsIDB4NUUsIDB4MkEsIDB4NDQsIDB4NzIsIDB4NDUsIDB4MjQsIDB4RkEsCisJIDB4QjIsIDB4RjMsIDB4MDYsIDB4MDQsIDB4RTQsIDB4RTIsIDB4REMsIDB4OUMsIDB4MjksIDB4NDAsIDB4MDEsIDB4MjYsIDB4NjQsIDB4NDQsIDB4QjIsIDB4RjksCisJIDB4MjUsIDB4RkEsIDB4QjMsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4QjMsIDB4RkIsIDB4MjgsIDB4RkEsIDB4QjQsIDB4RjMsIDB4MDIsIDB4MDQsCisJIDB4REMsIDB4ODQsIDB4QjQsIDB4RkIsIDB4MjksIDB4RkEsIDB4QTksIDB4NjAsIDB4ODgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4MTksIDB4NjAsCisJIDB4QTMsIDB4RjMsIDB4MTIsIDB4NjEsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDgsIDB4MDAsIDB4MDAsIDB4NjQsIDB4M0IsIDB4RkEsIDB4QkYsIDB4NjAsCisJIDB4RkYsIDB4NjUsIDB4OEMsIDB4NDQsIDB4M0QsIDB4RkEsIDB4QTQsIDB4ODQsIDB4MDEsIDB4MDAsIDB4OEMsIDB4NDQsIDB4RUIsIDB4RjAsIDB4MkEsIDB4RkEsCisJIDB4NDAsIDB4NDgsIDB4MDQsIDB4MjYsIDB4NDgsIDB4MDAsIDB4QTEsIDB4RkYsIDB4OEMsIDB4NDQsIDB4NUEsIDB4REEsIDB4MzAsIDB4RkIsIDB4NkMsIDB4NDQsCisJIDB4MkMsIDB4RkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MjYsIDB4MkIsIDB4MDAsIDB4RDAsIDB4ODAsIDB4QTEsIDB4RkYsIDB4OEMsIDB4NDQsIDB4NkMsIDB4NUMsCisJIDB4MDAsIDB4RTEsIDB4RjIsIDB4RkUsIDB4MkQsIDB4RkEsIDB4RUMsIDB4RjMsIDB4RDQsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MkUsIDB4RjgsIDB4MjQsIDB4NDQsCisJIDB4MTYsIDB4MEMsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDcsIDB4MDAsIDB4MjgsIDB4NDIsIDB4MEMsIDB4QjIsIDB4MDgsIDB4M0EsIDB4MDMsIDB4MDAsCisJIDB4MTAsIDB4QkMsIDB4NDAsIDB4NDQsIDB4NjEsIDB4MDAsIDB4MDQsIDB4MEEsIDB4QTEsIDB4RkYsIDB4QUIsIDB4NjAsIDB4RTcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTEsIDB4QkMsIDB4NDAsIDB4NDQsIDB4MjgsIDB4NDUsIDB4QkYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4MjQsIDB4ODgsIDB4NTUsIDB4MDAsIDB4MzAsIDB4QkMsCisJIDB4NDAsIDB4NDQsIDB4MjIsIDB4RjAsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NEQsIDB4MDAsIDB4MjAsIDB4QjksCisJIDB4NUMsIDB4OEUsIDB4QTEsIDB4RkYsIDB4OEMsIDB4NDQsIDB4MkQsIDB4RkEsIDB4REMsIDB4OUMsIDB4NkMsIDB4NDQsIDB4MDAsIDB4RTEsIDB4RjIsIDB4RkUsCisJIDB4MkUsIDB4RkEsIDB4MDgsIDB4MjgsIDB4NDQsIDB4NEUsIDB4REMsIDB4ODQsIDB4MkUsIDB4NUMsIDB4QjAsIDB4ODQsIDB4RUYsIDB4QjEsIDB4MDgsIDB4MjQsCisJIDB4NDAsIDB4QjksIDB4NDEsIDB4NDYsIDB4MzksIDB4MDAsIDB4MjMsIDB4NDEsIDB4MTMsIDB4NjQsIDB4NTEsIDB4OTAsIDB4NTYsIDB4NjMsIDB4MDMsIDB4MDQsCisJIDB4QUIsIDB4NjAsIDB4REUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OEMsIDB4NDQsIDB4MDQsIDB4NjEsIDB4MkIsIDB4RkEsIDB4NTAsIDB4RkUsIDB4ODAsIDB4MjcsCisJIDB4MDAsIDB4NjQsIDB4MzAsIDB4RkIsIDB4OEMsIDB4NDQsIDB4MkMsIDB4RkEsIDB4RDAsIDB4ODAsIDB4OEMsIDB4NDQsIDB4MkQsIDB4RkEsIDB4RDQsIDB4ODAsCisJIDB4MDAsIDB4NjUsIDB4OEMsIDB4NDQsIDB4RUMsIDB4RjEsIDB4MkUsIDB4RkEsIDB4RDAsIDB4ODAsIDB4MjgsIDB4NDQsIDB4MDMsIDB4MEMsIDB4QTAsIDB4MkEsCisJIDB4MEEsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MTAsIDB4NjUsIDB4NjAsIDB4NDAsIDB4QzQsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RDQsIDB4M0EsIDB4MDgsIDB4MDAsCisJIDB4MjcsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MzAsIDB4NjUsIDB4MDAsIDB4NjQsIDB4M0YsIDB4RkEsIDB4NDYsIDB4NEUsIDB4MzUsIDB4ODQsIDB4NjQsIDB4MDAsCisJIDB4NDAsIDB4MjYsIDB4RjksIDB4MDEsIDB4MzAsIDB4NjUsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4MDQsIDB4NjEsIDB4RjMsIDB4MDEsCisJIDB4QTEsIDB4RkYsIDB4QUIsIDB4NjAsIDB4QTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4RkUsIDB4NjUsIDB4MjMsIDB4NDMsIDB4RTgsIDB4QTMsCisJIDB4ODAsIDB4MjcsIDB4RjYsIDB4MDEsIDB4MjAsIDB4RTYsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUIsIDB4MjgsIDB4NDQsIDB4MDMsIDB4MkIsIDB4MDUsIDB4MDAsCisJIDB4NkEsIDB4NjIsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4MjgsIDB4NDQsIDB4OEYsIDB4QjAsIDB4ODgsIDB4M0EsIDB4MDMsIDB4MDAsCisJIDB4NzAsIDB4NjIsIDB4N0EsIDB4REMsIDB4MjgsIDB4NDQsIDB4NDAsIDB4MkIsIDB4MEQsIDB4MDAsIDB4NzIsIDB4NjIsIDB4N0EsIDB4REMsIDB4QTEsIDB4RkYsCisJIDB4NkMsIDB4NUMsIDB4NUEsIDB4RDgsIDB4RTQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MDMsIDB4MDAsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4RjgsIDB4QTMsCisJIDB4MjUsIDB4RkYsIDB4QjAsIDB4RkYsIDB4M0YsIDB4RkMsIDB4MDAsIDB4RjQsIDB4MTAsIDB4NjIsIDB4MTAsIDB4NjEsIDB4NTcsIDB4OTAsIDB4NkMsIDB4NjEsCisJIDB4QTEsIDB4RkYsIDB4MDksIDB4MDcsIDB4MDIsIDB4MUQsIDB4MjgsIDB4MUUsIDB4MUYsIDB4MDAsIDB4Q0IsIDB4ODMsIDB4N0EsIDB4REMsIDB4RkUsIDB4MUMsCisJIDB4RDksIDB4ODEsIDB4MjIsIDB4MUUsIDB4MTksIDB4MDAsIDB4Q0IsIDB4ODMsIDB4MEUsIDB4QTMsIDB4QTcsIDB4ODQsIDB4RjIsIDB4QTMsIDB4N0EsIDB4REMsCisJIDB4RkUsIDB4MUMsIDB4MDMsIDB4MUQsIDB4N0MsIDB4QTgsIDB4RDksIDB4ODEsIDB4MEEsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsIDB4QTcsIDB4ODQsCisJIDB4N0EsIDB4NjEsIDB4N0EsIDB4REMsIDB4RkUsIDB4MUMsIDB4RjksIDB4MUQsIDB4N0MsIDB4QTgsIDB4RDksIDB4ODEsIDB4RjYsIDB4MDMsIDB4RkYsIDB4QjEsCisJIDB4MEIsIDB4MUUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsCisJIDB4NkMsIDB4NDQsIDB4NUEsIDB4REEsIDB4Q0QsIDB4ODEsIDB4NjQsIDB4NDAsIDB4NDYsIDB4NDUsIDB4MjgsIDB4NDQsIDB4NDAsIDB4MkIsIDB4MEUsIDB4MDAsCisJIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MEIsIDB4MDAsIDB4MDEsIDB4QTIsIDB4NjIsIDB4NDQsIDB4NDYsIDB4NDUsIDB4MjEsIDB4NDYsIDB4MDAsIDB4RjQsCisJIDB4MDIsIDB4NjIsIDB4OUEsIDB4RkYsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsCisJIDB4MjQsIDB4NzYsIDB4QUQsIDB4RTIsIDB4NDEsIDB4RTEsIDB4OTgsIDB4RkYsIDB4MDAsIDB4RTYsIDB4MDEsIDB4RjIsIDB4NjEsIDB4NDUsIDB4RDQsIDB4OUUsCisJIDB4MjEsIDB4NDYsIDB4MTYsIDB4RkEsIDB4MjUsIDB4NDQsIDB4MDYsIDB4RkEsIDB4QTEsIDB4RkYsIDB4OEMsIDB4NDQsIDB4QTEsIDB4RkYsIDB4NDcsIDB4RkYsCisJIDB4MjksIDB4NDAsIDB4NTAsIDB4MkIsIDB4MDYsIDB4MDAsIDB4MkIsIDB4NDQsIDB4MUMsIDB4NjAsIDB4MTEsIDB4RkIsIDB4NzAsIDB4NDUsIDB4NDQsIDB4OEIsCisJIDB4MDEsIDB4MDAsIDB4NTAsIDB4NEIsIDB4NjcsIDB4NTAsIDB4NjksIDB4RTIsIDB4MjUsIDB4NDYsIDB4MDEsIDB4RjIsIDB4NjEsIDB4NDUsIDB4RDQsIDB4OUUsCisJIDB4MjEsIDB4NDYsIDB4MTYsIDB4RkEsIDB4MjUsIDB4NDUsIDB4ODYsIDB4RjgsIDB4RkYsIDB4RkYsIDB4NkEsIDB4NDQsIDB4NDAsIDB4MkIsIDB4MDMsIDB4MTUsCisJIDB4QUYsIDB4NjAsIDB4RjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjksIDB4NDAsIDB4MTAsIDB4MjYsIDB4MDQsIDB4MDAsIDB4MDQsIDB4NzQsIDB4Q0QsIDB4RTIsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkMsIDB4NDQsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QzQsIDB4RTIsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsCisJIDB4MDUsIDB4NzYsIDB4QUQsIDB4RTIsIDB4NDEsIDB4RTEsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDUsIDB4QTEsIDB4RkYsIDB4NjUsIDB4NDEsIDB4N0YsIDB4NjAsCisJIDB4N0YsIDB4N0MsIDB4NkMsIDB4NDQsIDB4QTAsIDB4ODQsIDB4MTUsIDB4QTcsIDB4MTUsIDB4QTQsIDB4MjEsIDB4NDYsIDB4MjYsIDB4RkEsIDB4MjIsIDB4NDYsCisJIDB4MTAsIDB4RkEsIDB4MjEsIDB4NDYsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDcsIDB4MDAsIDB4QjYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NDAsIDB4NjAsCisJIDB4MDAsIDB4NjUsIDB4NkMsIDB4NDQsIDB4MUEsIDB4RkEsIDB4MDksIDB4MDAsIDB4NjUsIDB4NDQsIDB4MEYsIDB4QjQsIDB4MDYsIDB4QTgsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4NjUsIDB4MDgsIDB4MjgsIDB4N0MsIDB4NDUsIDB4MjksIDB4NDQsIDB4MzQsIDB4ODksIDB4MDAsIDB4NjQsIDB4MzMsIDB4RkIsIDB4NDAsIDB4MjEsCisJIDB4MDAsIDB4MDAsIDB4QUMsIDB4RTIsIDB4MDUsIDB4RTEsIDB4MjcsIDB4RjAsIDB4NjUsIDB4NDQsIDB4NjQsIDB4NUUsIDB4MjcsIDB4RkEsIDB4MjgsIDB4NDQsCisJIDB4OEYsIDB4QjAsIDB4ODgsIDB4M0EsIDB4MDksIDB4MDAsIDB4MzksIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4QjAsIDB4MjAsIDB4M0EsIDB4MDQsIDB4MDAsCisJIDB4MjQsIDB4NDQsIDB4RkYsIDB4NjAsIDB4REYsIDB4QjQsIDB4NDAsIDB4NDQsIDB4MjgsIDB4NDAsIDB4MDMsIDB4MjYsIDB4RTIsIDB4MDAsIDB4MzEsIDB4NDAsCisJIDB4MjAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MjgsIDB4NDAsIDB4NTAsIDB4M0EsIDB4REMsIDB4MDAsIDB4MjQsIDB4NDQsIDB4MjAsIDB4MkEsIDB4RDksIDB4MDAsCisJIDB4MjksIDB4NDAsIDB4NTAsIDB4MkIsIDB4MEQsIDB4MDAsIDB4RUYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4MzEsIDB4NDAsCisJIDB4MDgsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MUMsIDB4NjAsIDB4MTEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODUsIDB4MkIsIDB4NDQsIDB4MDYsIDB4MDUsCisJIDB4MkIsIDB4NDQsIDB4RkYsIDB4QTQsIDB4MDEsIDB4QTQsIDB4MDQsIDB4MjQsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4QUMsIDB4ODAsIDB4MjgsIDB4NDAsCisJIDB4QjQsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDMsIDB4MzAsIDB4RkIsIDB4QkMsIDB4MDAsIDB4MjgsIDB4NDQsIDB4QkYsIDB4NjAsIDB4RkYsIDB4NjUsCisJIDB4QTQsIDB4ODQsIDB4NDAsIDB4NDgsIDB4MkIsIDB4NTAsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MUMsIDB4RjIsCisJIDB4QzQsIDB4RTIsIDB4NDAsIDB4NDUsIDB4MjgsIDB4NDAsIDB4QzQsIDB4MzYsIDB4OUMsIDB4MDAsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsIDB4NDgsIDB4MDAsCisJIDB4MzIsIDB4NjAsIDB4RkEsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MEIsIDB4MzYsIDB4MjAsIDB4MDAsIDB4MEYsIDB4MzYsIDB4MUIsIDB4MDAsIDB4MEEsIDB4MzYsCisJIDB4MTYsIDB4MDAsIDB4MEUsIDB4MzYsIDB4MTEsIDB4MDAsIDB4MDksIDB4MzYsIDB4MEMsIDB4MDAsIDB4MEQsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MDgsIDB4MzYsCisJIDB4MDIsIDB4MDAsIDB4QTMsIDB4RDMsIDB4MTUsIDB4MDAsIDB4MDIsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MTIsIDB4MDAsIDB4MDQsIDB4QTMsIDB4QTMsIDB4RDMsCisJIDB4MEYsIDB4MDAsIDB4MDYsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MEMsIDB4MDAsIDB4MDgsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDksIDB4MDAsIDB4MEEsIDB4QTMsCisJIDB4QTMsIDB4RDMsIDB4MDYsIDB4MDAsIDB4MEMsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDMsIDB4MDAsIDB4MEUsIDB4QTMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4MkMsIDB4NjAsIDB4N0MsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MEMsIDB4MzYsIDB4MTksIDB4MDAsIDB4MDgsIDB4MzYsIDB4MTUsIDB4MDAsIDB4MEQsIDB4MzYsCisJIDB4MTEsIDB4MDAsIDB4MDksIDB4MzYsIDB4MEQsIDB4MDAsIDB4MEUsIDB4MzYsIDB4MDksIDB4MDAsIDB4MEEsIDB4MzYsIDB4MDUsIDB4MDAsIDB4MEYsIDB4MzYsCisJIDB4MDEsIDB4MDAsIDB4MzksIDB4MDAsIDB4MDIsIDB4QTMsIDB4MzcsIDB4MDAsIDB4MDQsIDB4QTMsIDB4MzUsIDB4MDAsIDB4MDYsIDB4QTMsIDB4MzMsIDB4MDAsCisJIDB4MDgsIDB4QTMsIDB4MzEsIDB4MDAsIDB4MEEsIDB4QTMsIDB4MkYsIDB4MDAsIDB4MEMsIDB4QTMsIDB4MkQsIDB4MDAsIDB4MEUsIDB4QTMsIDB4MkIsIDB4MDAsCisJIDB4MzMsIDB4NjAsIDB4MEEsIDB4NjMsIDB4MjUsIDB4NDQsIDB4MEEsIDB4MzYsIDB4MEMsIDB4MDAsIDB4MTQsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MzcsIDB4MzYsCisJIDB4MDIsIDB4MDAsIDB4QTMsIDB4RDMsIDB4MDksIDB4MDAsIDB4MDIsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDYsIDB4MDAsIDB4MDQsIDB4QTMsIDB4QTMsIDB4RDMsCisJIDB4MDMsIDB4MDAsIDB4MDYsIDB4QTMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NDUsIDB4MEEsIDB4MzYsIDB4MEQsIDB4MDAsIDB4MTQsIDB4MzYsCisJIDB4MzgsIDB4NjQsIDB4MzcsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MDQsIDB4N0YsIDB4NDAsIDB4NDUsIDB4MTUsIDB4NjQsIDB4NkUsIDB4M0EsIDB4MDksIDB4MDAsCisJIDB4ODQsIDB4N0YsIDB4NDAsIDB4NDUsIDB4MEIsIDB4NjQsIDB4MDUsIDB4MDAsIDB4MjksIDB4NDQsIDB4N0YsIDB4NjAsIDB4RkYsIDB4QjQsIDB4NDAsIDB4NDksCisJIDB4NzAsIDB4NjQsIDB4NDAsIDB4NEQsIDB4MDIsIDB4MDAsIDB4NDAsIDB4NDUsIDB4MEEsIDB4MDAsIDB4MkMsIDB4NjAsIDB4NzQsIDB4NjMsIDB4MEEsIDB4MzYsCisJIDB4MDYsIDB4MDAsIDB4MTQsIDB4MzYsIDB4MDIsIDB4QTMsIDB4MzcsIDB4MzYsIDB4MDQsIDB4QTMsIDB4NkUsIDB4MzYsIDB4MDYsIDB4QTMsIDB4MjgsIDB4QTMsCisJIDB4QTMsIDB4RDEsIDB4RDgsIDB4QTMsIDB4MTksIDB4NjAsIDB4NTUsIDB4RjksIDB4MzksIDB4RjEsIDB4QTMsIDB4RDEsIDB4NjQsIDB4NDEsIDB4NjQsIDB4NUUsCisJIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDcsIDB4MUYsIDB4QjQsIDB4NTQsIDB4OTQsIDB4RTAsIDB4QTAsIDB4MDIsIDB4MEQsIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDAsCisJIDB4MDEsIDB4MDQsIDB4MUYsIDB4NjQsIDB4NjAsIDB4NDcsIDB4QjQsIDB4ODUsIDB4MjksIDB4NDQsIDB4QzAsIDB4NjAsIDB4MDAsIDB4QjQsIDB4QjQsIDB4ODQsCisJIDB4MUYsIDB4RkEsIDB4QjUsIDB4RkYsIDB4QTEsIDB4RkYsIDB4Q0IsIDB4RjMsIDB4QzQsIDB4RTIsIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsCisJIDB4REMsIDB4ODQsIDB4RTAsIDB4OTQsIDB4RkYsIDB4NjAsIDB4Q0YsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4QTUsIDB4NjAsIDB4ODgsIDB4NzgsCisJIDB4MDQsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QzQsIDB4RTIsIDB4QTEsIDB4RkYsIDB4RkYsIDB4NjAsIDB4Q0YsIDB4NjUsIDB4MjksIDB4NDQsCisJIDB4MjQsIDB4ODksIDB4Q0IsIDB4RjMsIDB4QzQsIDB4RTIsIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsIDB4REMsIDB4ODQsIDB4RTAsIDB4OTQsCisJIDB4MjYsIDB4NDQsIDB4ODQsIDB4QkMsIDB4MjQsIDB4NDAsIDB4MEMsIDB4MjIsIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDYsIDB4MjMsIDB4NjQsIDB4M0EsIDB4REIsCisJIDB4QUQsIDB4NjAsIDB4NEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDAsIDB4MjYsIDB4MjIsIDB4MDUsIDB4MDAsIDB4RjgsIDB4QjQsIDB4NDAsIDB4NDcsCisJIDB4MDYsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MjksIDB4NDAsIDB4MTAsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDQsIDB4NzQsIDB4Q0QsIDB4RTIsCisJIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4MDEsIDB4MTEsIDB4MTIsIDB4MDAsIDB4MjksIDB4NDQsIDB4MjAsIDB4QkMsCisJIDB4NDAsIDB4NDksIDB4MDEsIDB4NjQsIDB4MzMsIDB4RkIsIDB4QjYsIDB4RkYsIDB4MDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MUEsIDB4RTEsIDB4QTEsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4NkMsIDB4NDAsIDB4RkMsIDB4MTEsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4QUUsIDB4NEYsIDB4RjcsIDB4QjQsIDB4QTAsIDB4NUUsCisJIDB4QjUsIDB4RkYsIDB4NDcsIDB4RkYsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsIDB4N0MsIDB4NEIsCisJIDB4MjksIDB4NDAsIDB4NTAsIDB4MkIsIDB4MUIsIDB4MDAsIDB4MzEsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MEQsIDB4MDAsIDB4MUMsIDB4NjAsIDB4MTEsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODUsIDB4MkIsIDB4NDQsIDB4MDcsIDB4MDQsIDB4NzAsIDB4NDUsIDB4QzQsIDB4ODQsIDB4RUYsIDB4NjAsIDB4RkYsIDB4NjUsCisJIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4MTEsIDB4MDAsIDB4MkIsIDB4NDQsIDB4NzAsIDB4NDUsIDB4QzQsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjQsCisJIDB4MDAsIDB4QjQsIDB4NDAsIDB4NEIsIDB4RUYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4MzcsIDB4RjMsIDB4MkIsIDB4NDUsCisJIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MjgsIDB4NjUsIDB4NDQsIDB4NjAsIDB4NTAsIDB4QTAsIDB4NEMsIDB4MjAsIDB4QkMsIDB4RkYsIDB4QjQsCisJIDB4QTAsIDB4NTEsIDB4MDAsIDB4NjAsIDB4MkUsIDB4N0MsIDB4NzQsIDB4NDQsIDB4QzAsIDB4OTQsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MTksIDB4MDAsCisJIDB4MjgsIDB4NDQsIDB4QTQsIDB4MzYsIDB4MDMsIDB4MDAsIDB4MEMsIDB4QjQsIDB4MDQsIDB4MzYsIDB4MTMsIDB4MDAsIDB4MjYsIDB4NDMsIDB4RkQsIDB4QjMsCisJIDB4MDQsIDB4QkIsIDB4NDMsIDB4NDYsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MjgsIDB4NDcsIDB4NDAsIDB4QkYsIDB4NDAsIDB4NDgsIDB4MEEsIDB4QkIsCisJIDB4MEYsIDB4RkMsIDB4NTAsIDB4NEIsIDB4NjcsIDB4NTAsIDB4MDAsIDB4NjQsIDB4MzAsIDB4RkIsIDB4MDUsIDB4RkYsIDB4QUQsIDB4NjAsIDB4NEYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjgsIDB4NDQsIDB4MDQsIDB4MkEsIDB4MDMsIDB4MDAsIDB4QTMsIDB4NjAsIDB4RTcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDAsIDB4MDQsIDB4MkEsIDB4MUMsIDB4MDAsIDB4MjgsIDB4NDQsIDB4MEMsIDB4QjAsIDB4MDgsIDB4M0EsIDB4MTgsIDB4MDAsCisJIDB4MkMsIDB4RjAsIDB4MjIsIDB4RjAsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MEIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MTAsIDB4MDAsCisJIDB4OEYsIDB4QjAsIDB4ODgsIDB4M0EsIDB4MEQsIDB4MDAsIDB4MzksIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4QjAsIDB4MjAsIDB4M0EsIDB4MDgsIDB4MDAsCisJIDB4MjYsIDB4NDQsIDB4RkQsIDB4QjQsIDB4MDQsIDB4QkMsIDB4NDAsIDB4NDYsIDB4RkMsIDB4QjQsIDB4MEYsIDB4RkEsIDB4MDUsIDB4RkYsIDB4MDEsIDB4MDAsCisJIDB4MUQsIDB4RkYsIDB4MDEsIDB4RTIsIDB4MjYsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MkMsIDB4NjAsIDB4RUEsIDB4NjQsIDB4RjEsIDB4NjAsCisJIDB4NzgsIDB4NDEsIDB4RTQsIDB4NzgsIDB4QjUsIDB4RjEsIDB4QTMsIDB4NjAsIDB4RTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MEEsIDB4QTMsIDB4NjAsCisJIDB4RjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjQsIDB4NTEsIDB4RkIsIDB4MUIsIDB4NjAsIDB4RUUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MTgsCisJIDB4QUUsIDB4NEYsIDB4MDgsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUUsIDB4RTEsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsCisJIDB4NTQsIDB4NjIsIDB4MjIsIDB4NDYsIDB4QTIsIDB4RDAsIDB4MTYsIDB4NjMsIDB4N0MsIDB4NDEsIDB4NDQsIDB4NDgsIDB4ODAsIDB4MzYsIDB4MDQsIDB4NjEsCisJIDB4MjgsIDB4NDAsIDB4NTAsIDB4MzYsIDB4MDQsIDB4NjEsIDB4NDEsIDB4NEUsIDB4MjgsIDB4NDQsIDB4QTQsIDB4MzYsIDB4MEUsIDB4NjMsIDB4OUEsIDB4RkYsCisJIDB4QTEsIDB4RkYsIDB4MTksIDB4NjAsIDB4QTMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDYsIDB4MDAsIDB4M0QsIDB4RjIsCisJIDB4QUEsIDB4RjAsIDB4RkYsIDB4RkYsIDB4QjQsIDB4ODQsIDB4MDgsIDB4MzYsIDB4MkEsIDB4RkEsIDB4MTIsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4NTQsIDB4NjIsCisJIDB4QTIsIDB4RDIsIDB4RkYsIDB4RkYsIDB4NkEsIDB4NDAsIDB4ODAsIDB4NEUsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsCisJIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsCisJIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MUQsIDB4QjIsIDB4MDAsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsCisJIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4MjgsIDB4NDAsIDB4MDMsIDB4MkIsCisJIDB4MDYsIDB4MDAsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4NzAsIDB4NjIsCisJIDB4MjgsIDB4NDQsIDB4OEYsIDB4QjAsIDB4ODgsIDB4M0EsIDB4MDIsIDB4MDAsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsCisJIDB4MTYsIDB4MDAsIDB4NzIsIDB4NjIsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDIsIDB4MTIsIDB4NzQsIDB4ODAsIDB4NEMsIDB4MjAsIDB4MkIsCisJIDB4MDUsIDB4MDAsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MDQsIDB4MDAsIDB4MjYsIDB4MjYsIDB4NEQsIDB4MDAsIDB4MjYsIDB4MjcsIDB4NEIsIDB4MDAsIDB4MjMsIDB4NDMsCisJIDB4RkYsIDB4RkYsIDB4MDYsIDB4MUQsIDB4MkUsIDB4MUUsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RjAsIDB4MDQsIDB4RjQsIDB4NjQsIDB4NDIsIDB4M0QsIDB4MDAsCisJIDB4MkUsIDB4NDAsIDB4MDQsIDB4MkEsIDB4MjcsIDB4MDAsIDB4QTEsIDB4RkYsIDB4MDIsIDB4RkUsIDB4MTAsIDB4MjUsIDB4NDIsIDB4RkUsIDB4MTIsIDB4NzQsCisJIDB4NzIsIDB4NDUsIDB4NjUsIDB4NEMsIDB4QjIsIDB4RjMsIDB4MDMsIDB4MDQsIDB4RTQsIDB4RTIsIDB4REMsIDB4ODQsIDB4QjIsIDB4RkIsIDB4QTEsIDB4RkYsCisJIDB4MTIsIDB4NzQsIDB4ODAsIDB4NEMsIDB4MTIsIDB4NzQsIDB4QjMsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4QjMsIDB4RkIsIDB4ODAsIDB4NEMsCisJIDB4MTIsIDB4NzQsIDB4QjQsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4QjQsIDB4RkIsIDB4ODAsIDB4NEMsIDB4MTIsIDB4NzQsIDB4NUMsIDB4NEUsCisJIDB4RjgsIDB4QTMsIDB4MDMsIDB4RjIsIDB4OUEsIDB4RjIsIDB4MDQsIDB4RjQsIDB4RkYsIDB4QjEsIDB4RjgsIDB4QTEsIDB4MDYsIDB4QTQsIDB4NjAsIDB4NDIsCisJIDB4MEEsIDB4MDAsIDB4NEUsIDB4MDAsIDB4MDMsIDB4RjIsIDB4OUEsIDB4RjIsIDB4MDQsIDB4RjQsIDB4QzgsIDB4ODIsIDB4RkYsIDB4QjEsIDB4MDMsIDB4MDAsCisJIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4RkYsIDB4QjEsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4RkQsIDB4MUMsIDB4RjksIDB4MUQsIDB4RkYsIDB4QjEsCisJIDB4MUIsIDB4MUUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4REEsIDB4ODIsIDB4REEsIDB4ODIsIDB4QTIsIDB4RDIsIDB4QTEsIDB4RkYsIDB4MDksIDB4NzQsCisJIDB4NjAsIDB4NEQsIDB4MTIsIDB4MDAsIDB4MDMsIDB4RjIsIDB4OUEsIDB4RjIsIDB4MDQsIDB4RjQsIDB4MjMsIDB4NDMsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsCisJIDB4QTAsIDB4RDIsIDB4RkUsIDB4QTEsIDB4Q0IsIDB4ODMsIDB4NjAsIDB4NEUsIDB4QUYsIDB4ODMsIDB4MDMsIDB4MUQsIDB4MDUsIDB4MDMsIDB4MTIsIDB4NzQsCisJIDB4RUIsIDB4MDEsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4REYsIDB4MDEsIDB4MTIsIDB4NzQsIDB4REEsIDB4ODMsIDB4NjYsIDB4NDQsIDB4MjIsIDB4NDYsCisJIDB4MEMsIDB4RkEsIDB4MjIsIDB4RjIsIDB4MEIsIDB4RkMsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MUEsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MDQsIDB4MDAsCisJIDB4MjYsIDB4MjYsIDB4MEYsIDB4MDAsIDB4MjYsIDB4MjcsIDB4MEQsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsCisJIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsCisJIDB4MDcsIDB4MDAsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4OUMsIDB4NEUsIDB4MTIsIDB4NzQsIDB4OUMsIDB4NEMsIDB4MTIsIDB4NzQsIDB4MDAsIDB4MDAsCisJIDB4ODgsIDB4RkYsIDB4QTEsIDB4RkYsIDB4QjIsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsCisJIDB4NzgsIDB4NDQsIDB4MDIsIDB4QTQsIDB4MzUsIDB4RkIsIDB4Q0MsIDB4MDAsIDB4MjksIDB4NDQsIDB4RjcsIDB4QjQsIDB4NDAsIDB4NDksIDB4MzQsIDB4NjQsCisJIDB4M0EsIDB4REIsIDB4NDQsIDB4RTEsIDB4QTUsIDB4NjAsIDB4NTQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NkIsIDB4QkMsIDB4RkYsIDB4MTUsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4MTUsIDB4RkIsIDB4NzgsIDB4NUMsIDB4MDcsIDB4MDAsIDB4NzgsIDB4NUMsIDB4MkYsIDB4MDAsIDB4NjIsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4ODAsIDB4NjAsIDB4MDEsIDB4RTAsIDB4RDUsIDB4NjAsIDB4ODQsIDB4RTcsCisJIDB4QTEsIDB4RjMsIDB4NDAsIDB4NjAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjMsIDB4NDgsIDB4NjAsIDB4NUUsIDB4NjUsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NkEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsCisJIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsCisJIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NkEsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4OTUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4NjQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4ODAsIDB4NjAsIDB4MDEsIDB4RTAsCisJIDB4RDUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4QTEsIDB4RjMsIDB4N0MsIDB4NDUsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjMsIDB4MDIsIDB4NjUsIDB4OEMsIDB4NjAsCisJIDB4NDgsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsCisJIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4N0YsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4ODQsIDB4NjAsIDB4MDQsIDB4NkEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NDgsIDB4NjAsIDB4MDgsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsCisJIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4ODQsIDB4NjAsIDB4MDQsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsCisJIDB4RkUsIDB4MDEsIDB4NDAsIDB4NjAsIDB4MDgsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4OEMsIDB4NjAsIDB4NDgsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsCisJIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsCisJIDB4RkUsIDB4MDEsIDB4OTUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4NjQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTIsIDB4NzQsIDB4NkEsIDB4NDAsIDB4ODcsIDB4NEYsCisJIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEMsIDB4MTIsIDB4NzQsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDgsIDB4MDAsIDB4MEEsIDB4NjQsIDB4ODksIDB4RkYsCisJIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsIDB4ODcsIDB4NEQsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEQsIDB4MDksIDB4MDAsIDB4MDMsIDB4NjQsIDB4ODksIDB4RkYsCisJIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsIDB4ODcsIDB4NEYsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEQsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEQsIDB4N0MsIDB4NDQsCisJIDB4MDEsIDB4MDgsIDB4MDEsIDB4MDAsIDB4NjcsIDB4NDQsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEMsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEMsIDB4MTIsIDB4NzQsCisJIDB4ODcsIDB4NEMsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEQsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEQsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEQsIDB4MTIsIDB4NzQsCisJIDB4MDQsIDB4MjEsIDB4MDQsIDB4MDAsIDB4RkYsIDB4MkEsIDB4MDEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4RkYsIDB4MkEsIDB4MEQsIDB4MDAsCisJIDB4MEMsIDB4MDAsIDB4QkMsIDB4RkYsIDB4NjEsIDB4RkYsIDB4NzgsIDB4NUMsIDB4NTcsIDB4MDEsIDB4NzgsIDB4NUMsIDB4N0YsIDB4MDEsIDB4QjYsIDB4RkYsCisJIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsIDB4N0MsIDB4NEIsIDB4NkEsIDB4NDQsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4NzQsIDB4QzQsIDB4RTIsIDB4MDQsIDB4RTEsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDUsIDB4MDAsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QkMsIDB4RkYsIDB4MTQsIDB4NzQsIDB4MDEsIDB4MDAsIDB4MDQsIDB4NzQsIDB4QzQsIDB4RTIsIDB4MDQsIDB4RTEsIDB4QkMsIDB4RkYsIDB4QjUsIDB4RkYsCisJIDB4NDcsIDB4RkYsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsIDB4N0MsIDB4NEIsIDB4MjksIDB4NDAsCisJIDB4NDAsIDB4MjcsIDB4MDQsIDB4MDAsIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4MjksIDB4NDAsCisJIDB4MTAsIDB4MjYsIDB4NkQsIDB4MDAsIDB4ODAsIDB4NjAsIDB4MDEsIDB4RTAsIDB4RDUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4QTEsIDB4RjMsIDB4NDAsIDB4NjAsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjMsIDB4NDgsIDB4NjAsIDB4NUUsIDB4NjUsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsCisJIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsCisJIDB4OTUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4ODAsIDB4NjAsIDB4MDEsIDB4RTAsIDB4RDUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4QTEsIDB4RjMsIDB4N0MsIDB4NDUsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjMsIDB4MDIsIDB4NjUsIDB4OEMsIDB4NjAsIDB4NDgsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsCisJIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4N0YsIDB4NkEsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4ODQsIDB4NjAsIDB4MDQsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NDgsIDB4NjAsCisJIDB4MDgsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsCisJIDB4ODQsIDB4NjAsIDB4MDQsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NDAsIDB4NjAsIDB4MDgsIDB4NkEsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4OEMsIDB4NjAsIDB4NDgsIDB4NkEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsCisJIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4OTUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4MDEsIDB4NjAsCisJIDB4MDgsIDB4RTEsIDB4RkYsIDB4RkYsIDB4QzQsIDB4RTIsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDQsIDB4MDAsIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4QkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4Q0IsIDB4RjMsCisJIDB4QzQsIDB4RTIsIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsIDB4REMsIDB4ODQsIDB4RTAsIDB4OTQsIDB4MzUsIDB4RjcsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTAsIDB4NjEsIDB4N0YsIDB4NjAsIDB4QzAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjMsCisJIDB4MjUsIDB4MDIsIDB4OTgsIDB4RkUsIDB4MTksIDB4MDUsIDB4MTIsIDB4NjAsIDB4RkMsIDB4RjUsIDB4MEUsIDB4RjIsIDB4MTUsIDB4MTgsIDB4MDIsIDB4MTgsCisJIDB4MDksIDB4RjQsIDB4RkIsIDB4MDEsIDB4MjMsIDB4NDQsIDB4MDAsIDB4QTgsIDB4MDgsIDB4N0UsIDB4MEEsIDB4MDIsIDB4NjYsIDB4NDQsIDB4MTEsIDB4RkIsCisJIDB4NDYsIDB4NDMsIDB4MjMsIDB4NDcsIDB4ODAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MjgsIDB4QjksIDB4MTAsIDB4N0UsCisJIDB4MDAsIDB4N0YsIDB4MEUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MEEsIDB4MDAsIDB4MjAsIDB4NDQsIDB4REMsIDB4ODUsIDB4MEYsIDB4QjQsIDB4RkIsIDB4QTAsCisJIDB4N0YsIDB4NjcsIDB4MDcsIDB4NjMsIDB4MDMsIDB4MDUsIDB4NDUsIDB4NDAsIDB4MDAsIDB4NjcsIDB4RDgsIDB4RkUsIDB4RkYsIDB4MjcsIDB4MDUsIDB4RkQsCisJIDB4MEEsIDB4N0UsIDB4MDQsIDB4RkIsIDB4NjEsIDB4NTUsIDB4NDgsIDB4MDAsIDB4MjgsIDB4RkIsIDB4MDEsIDB4RjMsIDB4MjksIDB4RkIsIDB4NDQsIDB4NDYsCisJIDB4NDAsIDB4NDUsIDB4MTAsIDB4NjEsIDB4N0UsIDB4NjAsIDB4QzAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjMsIDB4MzAsIDB4MDIsCisJIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4Q0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjcsIDB4MDMsIDB4NjMsIDB4MjksIDB4MDIsIDB4MjYsIDB4NDAsCisJIDB4MDEsIDB4MkIsIDB4MjMsIDB4MDAsIDB4OTgsIDB4RkUsIDB4MTgsIDB4MDUsIDB4MTIsIDB4NjAsIDB4RkMsIDB4RjUsIDB4MEUsIDB4RjIsIDB4MTQsIDB4MTgsCisJIDB4MDIsIDB4MTgsIDB4MDksIDB4RjQsIDB4RkIsIDB4MDEsIDB4MjMsIDB4NDQsIDB4MDAsIDB4QTgsIDB4MDgsIDB4N0UsIDB4MEEsIDB4MDIsIDB4NjYsIDB4NDQsCisJIDB4MTEsIDB4RkIsIDB4NDYsIDB4NDMsIDB4MjMsIDB4NDcsIDB4ODAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MDgsIDB4QjksCisJIDB4MTAsIDB4N0UsIDB4MDAsIDB4N0YsIDB4MEUsIDB4RkEsIDB4MDksIDB4MDAsIDB4MjAsIDB4NDQsIDB4REMsIDB4ODUsIDB4MEYsIDB4QjQsIDB4RkIsIDB4QTAsCisJIDB4N0YsIDB4NjcsIDB4MDcsIDB4NjMsIDB4MDUsIDB4MDUsIDB4NDUsIDB4NDAsIDB4RDgsIDB4RkUsIDB4MDAsIDB4NjcsIDB4RDAsIDB4RkUsIDB4RDksIDB4RkUsCisJIDB4RkYsIDB4MjcsIDB4MDUsIDB4RkQsIDB4MEIsIDB4N0UsIDB4MDQsIDB4RkIsIDB4MEUsIDB4NjAsIDB4REQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MjAsIDB4QjAsCisJIDB4ODAsIDB4QkMsIDB4MDgsIDB4MjgsIDB4QTIsIDB4REIsIDB4NjEsIDB4NTUsIDB4NjYsIDB4MDAsIDB4MDQsIDB4QjUsIDB4ODIsIDB4QjUsIDB4MjUsIDB4MDIsCisJIDB4MDQsIDB4MDMsIDB4MjAsIDB4NDQsIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDAsIDB4QTMsIDB4RDMsIDB4OTksIDB4RkUsIDB4MDQsIDB4MDQsIDB4MDIsIDB4QkMsCisJIDB4RkUsIDB4QjQsIDB4QTMsIDB4REIsIDB4NTksIDB4MDAsIDB4REIsIDB4RjMsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MjYsIDB4NTUsIDB4MDAsIDB4QTMsIDB4RDMsCisJIDB4RkYsIDB4QTAsIDB4RjgsIDB4QjQsIDB4MDIsIDB4MDIsIDB4QTMsIDB4REIsIDB4MUMsIDB4MDAsIDB4MDQsIDB4QkMsIDB4QkYsIDB4QjQsIDB4QTMsIDB4REIsCisJIDB4MDgsIDB4QjAsIDB4MDEsIDB4NjQsIDB4MDgsIDB4MjQsIDB4MDIsIDB4NjQsIDB4MjgsIDB4RkIsIDB4MjAsIDB4NDQsIDB4ODAsIDB4QkMsIDB4NDAsIDB4NDAsCisJIDB4RDAsIDB4RkUsIDB4NDIsIDB4MDAsIDB4QkYsIDB4QjQsIDB4QTMsIDB4REIsIDB4M0YsIDB4MDAsIDB4NDAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4RkEsIDB4MDIsCisJIDB4RjgsIDB4QjQsIDB4QTMsIDB4REIsIDB4MDgsIDB4QjUsIDB4MDcsIDB4N0MsIDB4MDEsIDB4MDIsIDB4REIsIDB4RjksIDB4MjAsIDB4NDQsIDB4N0YsIDB4QjQsCisJIDB4NDAsIDB4NDAsIDB4MUQsIDB4NjAsIDB4QkEsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjAsIDB4QjUsIDB4MDcsIDB4QjUsIDB4MDgsIDB4MjgsCisJIDB4QzQsIDB4MDIsIDB4OTksIDB4RkUsIDB4MjksIDB4MDUsIDB4MjAsIDB4NDQsIDB4ODAsIDB4MjYsIDB4MjYsIDB4MDAsIDB4MjAsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4REYsIDB4QjQsIDB4NDAsIDB4NDAsIDB4NzQsIDB4MDAsIDB4NDAsIDB4MkEsIDB4MUYsIDB4MDAsIDB4QkYsIDB4QjQsIDB4NDAsIDB4NDAsIDB4MDksIDB4MDAsCisJIDB4QTgsIDB4RkYsIDB4MjAsIDB4NDQsIDB4OTksIDB4RkUsIDB4MDIsIDB4MDUsIDB4ODAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4NDAsIDB4QkMsIDB4NDAsIDB4NDAsCisJIDB4MTMsIDB4MDAsIDB4MDAsIDB4RjEsIDB4ODAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4NjQsIDB4NDQsIDB4RTAsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MEEsIDB4MzYsCisJIDB4MjksIDB4MDEsIDB4MEIsIDB4MzYsIDB4NTksIDB4MDEsIDB4MjgsIDB4RkIsIDB4MDEsIDB4RjEsIDB4MjksIDB4RjksIDB4MDIsIDB4RjEsIDB4MkEsIDB4RjksCisJIDB4MDMsIDB4RjEsIDB4MkIsIDB4RjksIDB4RDAsIDB4RkUsIDB4QUUsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODIsIDB4M0UsIDB4NzUsIDB4NDQsCisJIDB4MDIsIDB4QjAsIDB4MDEsIDB4QjAsIDB4NTQsIDB4MDIsIDB4REMsIDB4MDIsIDB4MDQsIDB4QjAsIDB4MDgsIDB4QjAsIDB4MTAsIDB4MDIsIDB4MkEsIDB4MDIsCisJIDB4NDAsIDB4MjYsIDB4QTcsIDB4RkYsIDB4OEMsIDB4RkYsIDB4NzUsIDB4NDAsIDB4ODAsIDB4MkIsIDB4MDYsIDB4MDAsIDB4QUIsIDB4RkYsIDB4MTksIDB4NjAsCisJIDB4RjYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4QTIsIDB4REIsIDB4NzUsIDB4NDQsIDB4OEQsIDB4RkYsIDB4RTUsIDB4MDEsIDB4MEEsIDB4RjMsCisJIDB4QUEsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MDIsIDB4MDAsIDB4MzgsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MEMsIDB4MDAsCisJIDB4QzAsIDB4NjAsIDB4MDAsIDB4N0MsIDB4QTAsIDB4ODQsIDB4ODAsIDB4M0IsIDB4MDIsIDB4MDAsIDB4QzAsIDB4NjcsIDB4MDMsIDB4MDAsIDB4NDAsIDB4M0IsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjcsIDB4MEEsIDB4RkIsIDB4RDAsIDB4MDEsIDB4MTksIDB4NjAsIDB4RjYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsCisJIDB4QTIsIDB4REIsIDB4Q0EsIDB4MDEsIDB4MEIsIDB4RjEsIDB4QUIsIDB4RkYsIDB4NjQsIDB4NDQsIDB4RkYsIDB4MjcsIDB4MUYsIDB4MDAsIDB4MjAsIDB4MjYsCisJIDB4MDMsIDB4MDAsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsIDB4MUEsIDB4MDAsIDB4MTksIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MUIsIDB4MDQsIDB4NjAsCisJIDB4MDAsIDB4NzUsIDB4MEEsIDB4NjQsIDB4Q0MsIDB4ODQsIDB4MTksIDB4RkIsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NzUsIDB4NjQsIDB4NDAsIDB4MDMsIDB4MjIsCisJIDB4MEQsIDB4MDAsIDB4MjAsIDB4NDQsIDB4ODAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4MDcsIDB4MDAsIDB4RDksIDB4RkUsCisJIDB4ODEsIDB4NjAsIDB4MEIsIDB4NjQsIDB4MjgsIDB4RkIsIDB4MkMsIDB4NDQsIDB4MjksIDB4RkIsIDB4RDAsIDB4RkUsIDB4QTUsIDB4MDEsIDB4QTksIDB4RkYsCisJIDB4NzcsIDB4NDQsIDB4NjAsIDB4NTcsIDB4NDAsIDB4NEEsIDB4MDEsIDB4MkEsIDB4MzEsIDB4MDAsIDB4MjQsIDB4NDQsIDB4QUMsIDB4ODYsIDB4MDgsIDB4RjIsCisJIDB4MkQsIDB4MDMsIDB4MjUsIDB4NjAsIDB4RkUsIDB4NjUsIDB4RDQsIDB4ODAsIDB4MEUsIDB4RjIsIDB4MDIsIDB4MDMsIDB4QTUsIDB4RDUsIDB4MDQsIDB4MDAsCisJIDB4MDEsIDB4QkMsIDB4MEUsIDB4RkEsIDB4MDksIDB4RjQsIDB4RDEsIDB4RkUsIDB4NDYsIDB4NDQsIDB4MTEsIDB4MUIsIDB4MzIsIDB4NDAsIDB4ODAsIDB4MkEsCisJIDB4MUQsIDB4MDAsIDB4OUQsIDB4RkUsIDB4MUIsIDB4MDUsIDB4MTMsIDB4NjAsIDB4MDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsCisJIDB4MDMsIDB4MDMsIDB4MEYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MTIsIDB4MUIsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NzUsIDB4MEYsIDB4MDAsIDB4M0YsIDB4RjIsCisJIDB4NDgsIDB4NjUsIDB4QzQsIDB4ODQsIDB4MTMsIDB4RkIsIDB4NjYsIDB4NDQsIDB4MTAsIDB4RkIsIDB4NjYsIDB4NDcsIDB4MjAsIDB4QkYsIDB4M0IsIDB4NDIsCisJIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MEUsIDB4RjIsIDB4NDEsIDB4NzUsIDB4MTAsIDB4QkMsIDB4MEUsIDB4RkEsIDB4MkEsIDB4NDQsIDB4MDgsIDB4MkEsCisJIDB4MTcsIDB4MDAsIDB4MjMsIDB4NDQsIDB4MDAsIDB4QTgsIDB4NUMsIDB4NDMsIDB4MTMsIDB4MDMsIDB4MTIsIDB4NjAsIDB4RkMsIDB4RjUsIDB4MDEsIDB4MDAsCisJIDB4MDksIDB4RjQsIDB4MEUsIDB4RjIsIDB4MEQsIDB4MTgsIDB4MDgsIDB4QjAsIDB4MTgsIDB4QUMsIDB4RkEsIDB4MDMsIDB4MEUsIDB4RkEsIDB4NjYsIDB4NDMsCisJIDB4MTEsIDB4RkQsIDB4NDYsIDB4NDMsIDB4MjMsIDB4NDcsIDB4ODAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MjgsIDB4NzUsCisJIDB4MkEsIDB4NDQsIDB4MDYsIDB4MjIsIDB4MkQsIDB4MDAsIDB4MjIsIDB4NDQsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MEUsIDB4RjIsIDB4MjgsIDB4MDMsCisJIDB4MTAsIDB4QjAsIDB4MDEsIDB4QkMsIDB4MDMsIDB4MDIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDIsIDB4MjIsIDB4MDAsIDB4MEUsIDB4RkEsIDB4RDEsIDB4RkUsCisJIDB4MjUsIDB4NjAsIDB4RjIsIDB4NjQsIDB4NDAsIDB4NDcsIDB4NTgsIDB4NEYsIDB4OTQsIDB4MDAsIDB4NDYsIDB4NDIsIDB4MTksIDB4MDIsIDB4MjIsIDB4NDcsCisJIDB4NDAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MjMsIDB4RjIsIDB4NjYsIDB4NDMsIDB4MDAsIDB4QTgsIDB4MEUsIDB4RjIsCisJIDB4MDgsIDB4MDIsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4RTQsIDB4MDEsIDB4MTIsIDB4RkQsIDB4MTAsIDB4NjQsIDB4MEUsIDB4RkEsIDB4MDIsIDB4NzUsCisJIDB4MDcsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MkEsIDB4REMsIDB4MDEsIDB4MTIsIDB4RkQsIDB4MTAsIDB4NjQsIDB4MEUsIDB4RkEsIDB4MDQsIDB4NzUsCisJIDB4MkEsIDB4NDQsIDB4ODAsIDB4MkEsIDB4MTksIDB4MDAsIDB4MjEsIDB4NDQsIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsIDB4MTUsIDB4MDMsIDB4MDEsIDB4QkMsCisJIDB4MEUsIDB4RkEsIDB4RDEsIDB4RkUsIDB4MjYsIDB4NjAsIDB4MEEsIDB4NjQsIDB4NDAsIDB4NDcsIDB4NTgsIDB4NEYsIDB4NkEsIDB4MDAsIDB4NDYsIDB4NDEsCisJIDB4MEIsIDB4MDIsIDB4MjEsIDB4NDcsIDB4MTAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MEUsIDB4RjIsIDB4NjYsIDB4NDMsCisJIDB4MDgsIDB4RkQsIDB4MTAsIDB4QkMsIDB4MEUsIDB4RkEsIDB4ODAsIDB4NzUsIDB4MkEsIDB4NDQsIDB4MTAsIDB4QjAsIDB4MjAsIDB4NDQsIDB4MTgsIDB4MDMsCisJIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDAsIDB4MUQsIDB4NjAsIDB4QkEsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjAsIDB4QjAsIDB4ODAsIDB4QjAsCisJIDB4MDksIDB4MDMsIDB4MDgsIDB4MDMsIDB4NDAsIDB4QkMsIDB4N0YsIDB4QjQsIDB4MDQsIDB4QjAsIDB4QTMsIDB4REIsIDB4MDMsIDB4MDMsIDB4MjAsIDB4NDQsCisJIDB4ODAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4MkEsIDB4NDAsIDB4MDgsIDB4MjcsIDB4MDMsIDB4MDAsIDB4QjMsIDB4NjAsIDB4QzksIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MkEsIDB4NDAsIDB4MDgsIDB4MkIsIDB4MEYsIDB4MDAsIDB4MzIsIDB4NDAsIDB4ODAsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MTksIDB4NjAsIDB4RjcsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MUIsIDB4MDcsIDB4MDAsIDB4MTksIDB4NjAsIDB4RjYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QkMsIDB4QTIsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4RkYsIDB4QjMsIDB4NjAsIDB4RkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTgsIDB4RkUsIDB4MTQsIDB4MDUsIDB4RUEsIDB4RkUsCisJIDB4MjMsIDB4MDUsIDB4RTksIDB4RkUsIDB4MUMsIDB4MDUsIDB4RTcsIDB4RkUsIDB4MDksIDB4MDUsIDB4NDcsIDB4RkYsIDB4MjAsIDB4NDQsIDB4MEYsIDB4MjIsCisJIDB4MDMsIDB4MDAsIDB4Q0MsIDB4ODQsIDB4NDAsIDB4NDAsIDB4MEYsIDB4MjIsIDB4QjgsIDB4RkUsIDB4RUMsIDB4MDEsIDB4MjMsIDB4NDEsIDB4MDAsIDB4QjksCisJIDB4NUMsIDB4NEEsIDB4RTgsIDB4MDIsIDB4NUEsIDB4MDEsIDB4MjQsIDB4NDEsIDB4MDAsIDB4QjksIDB4MjUsIDB4NjAsIDB4RkUsIDB4NjUsIDB4NDUsIDB4NDcsCisJIDB4RTEsIDB4MDIsIDB4NTgsIDB4NEYsIDB4MEUsIDB4MDAsIDB4REUsIDB4MDIsIDB4NUMsIDB4NEEsIDB4NDYsIDB4NDQsIDB4MzgsIDB4MDEsIDB4MjIsIDB4NDEsCisJIDB4MDAsIDB4QjksIDB4NUMsIDB4NEEsIDB4RDcsIDB4MDIsIDB4NkMsIDB4MDEsIDB4MjEsIDB4NDEsIDB4MDAsIDB4QjksIDB4NUMsIDB4NEEsIDB4OTIsIDB4MDMsCisJIDB4RDEsIDB4MDEsIDB4MjcsIDB4RDMsIDB4MDMsIDB4MDAsIDB4MTAsIDB4QjAsIDB4MDksIDB4RjIsIDB4MDQsIDB4MDMsIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsCisJIDB4RkEsIDB4MDIsIDB4MDgsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4RjMsIDB4MEYsIDB4NjAsIDB4RkUsIDB4NjUsIDB4MEMsIDB4RjMsCisJIDB4MjQsIDB4ODYsIDB4MjQsIDB4NDYsIDB4NjAsIDB4NDAsIDB4RkIsIDB4M0IsIDB4MDcsIDB4MDAsIDB4ODAsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MjMsIDB4NDYsCisJIDB4MDMsIDB4NEMsIDB4NDYsIDB4NjEsIDB4M0EsIDB4NjUsIDB4MEMsIDB4MDAsIDB4MkUsIDB4RjMsIDB4NDAsIDB4NDUsIDB4RjgsIDB4MkIsIDB4MDIsIDB4MDAsCisJIDB4NDAsIDB4NDUsIDB4MDMsIDB4MDAsIDB4NTgsIDB4NEYsIDB4NUEsIDB4MDAsIDB4MDcsIDB4MDIsIDB4NTgsIDB4NEYsIDB4NjYsIDB4MDAsIDB4MDQsIDB4MDUsCisJIDB4NjYsIDB4NTAsIDB4NjUsIDB4NTIsIDB4NjEsIDB4NTEsIDB4MDksIDB4MDAsIDB4MjYsIDB4NDcsIDB4MDAsIDB4QkYsIDB4MEUsIDB4RkIsIDB4MkUsIDB4RjUsCisJIDB4MDUsIDB4RjAsIDB4ODAsIDB4NjAsIDB4NjQsIDB4NTAsIDB4MDAsIDB4NzIsIDB4N0UsIDB4NzEsIDB4QUMsIDB4RkYsIDB4MzEsIDB4NDAsIDB4MDEsIDB4MkEsCisJIDB4MDgsIDB4MDAsIDB4MTksIDB4NjAsIDB4RjIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MTgsIDB4MEMsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MTMsIDB4RkIsCisJIDB4MkQsIDB4RkYsIDB4QjMsIDB4NjAsIDB4RkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OEUsIDB4RkYsIDB4MEYsIDB4RjMsIDB4MEYsIDB4NjAsIDB4RkUsIDB4NjUsCisJIDB4MjQsIDB4ODYsIDB4MEQsIDB4RjMsIDB4MjQsIDB4NDYsIDB4NjAsIDB4NDAsIDB4RkIsIDB4M0IsIDB4MDcsIDB4MDAsIDB4ODAsIDB4MjYsIDB4MDIsIDB4MDAsCisJIDB4MjMsIDB4NDYsIDB4MDMsIDB4NEMsIDB4NDYsIDB4NjEsIDB4M0EsIDB4NjUsIDB4MEMsIDB4MDAsIDB4MkUsIDB4RjMsIDB4NDAsIDB4NDUsIDB4RjgsIDB4MkIsCisJIDB4MDIsIDB4MDAsIDB4NDAsIDB4NDUsIDB4MDMsIDB4MDAsIDB4NTgsIDB4NEYsIDB4MjEsIDB4MDAsIDB4MDcsIDB4MDIsIDB4NTgsIDB4NEYsIDB4MkQsIDB4MDAsCisJIDB4MDQsIDB4MDUsIDB4NjYsIDB4NTAsIDB4NjUsIDB4NTIsIDB4NjEsIDB4NTEsIDB4MDksIDB4MDAsIDB4MjYsIDB4NDcsIDB4MDAsIDB4QkYsIDB4MEYsIDB4RkIsCisJIDB4MkUsIDB4RjUsIDB4MDUsIDB4RjAsIDB4ODAsIDB4NjAsIDB4NjQsIDB4NTAsIDB4MDAsIDB4NzIsIDB4N0UsIDB4NzEsIDB4OEQsIDB4RkYsIDB4QUQsIDB4RkYsCisJIDB4MzEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4Q0UsIDB4MDEsIDB4MTksIDB4NjAsIDB4RjIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MTgsIDB4MEMsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MTMsIDB4RkIsIDB4MkQsIDB4RkYsIDB4QjMsIDB4NjAsIDB4RkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDQsIDB4QTcsIDB4RjEsCisJIDB4QTgsIDB4RjEsIDB4RDAsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDcsIDB4MDQsIDB4MDEsIDB4MDYsIDB4MDUsIDB4MDAsIDB4MjUsIDB4NDYsIDB4MDEsIDB4RjAsCisJIDB4MDMsIDB4NjcsIDB4QTAsIDB4ODUsIDB4OTQsIDB4ODAsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDYsIDB4MjYsIDB4NDEsIDB4NDYsIDB4NjMsCisJIDB4MDEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QjUsIDB4RDUsIDB4ODEsIDB4MDAsIDB4RjIsIDB4MDUsIDB4MDQsIDB4MDQsIDB4NjMsIDB4NjAsIDB4NDYsCisJIDB4RjcsIDB4MUIsIDB4NDIsIDB4RkUsIDB4MEQsIDB4MDAsIDB4NjEsIDB4NDQsIDB4QzUsIDB4ODEsIDB4NjMsIDB4NDUsIDB4QzUsIDB4ODEsIDB4OUMsIDB4ODQsCisJIDB4REMsIDB4ODQsIDB4MDEsIDB4RjIsIDB4RjAsIDB4ODUsIDB4RjAsIDB4ODAsIDB4NjUsIDB4NDQsIDB4RjgsIDB4ODUsIDB4RkYsIDB4RkYsIDB4MDIsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MTMsIDB4NjAsIDB4MDgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsCisJIDB4MDcsIDB4MDMsIDB4MDAsIDB4QTgsIDB4MDksIDB4RjIsIDB4RkEsIDB4MDIsIDB4MDEsIDB4NjcsIDB4MEUsIDB4RkEsIDB4MDgsIDB4RkUsIDB4MTcsIDB4MDAsCisJIDB4QTksIDB4RjMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4QTAsIDB4MDAsIDB4QjQsIDB4MTIsIDB4MDYsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjEsIDB4NDEsIDB4NEEsCisJIDB4N0MsIDB4QTEsIDB4MEUsIDB4QTEsIDB4QTIsIDB4RkYsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsCisJIDB4MDYsIDB4MDMsIDB4MkEsIDB4NDMsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4RkUsIDB4QTMsIDB4RkYsCisJIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDEsIDB4NEEsIDB4NDIsIDB4QTEsIDB4MDMsIDB4MDAsIDB4NDEsIDB4NEEsIDB4N0MsIDB4QTEsIDB4MEUsIDB4QTEsCisJIDB4QTIsIDB4RkYsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4MkEsIDB4NDMsIDB4QjYsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4NjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4RkUsIDB4MEMsIDB4MDAsIDB4MTMsIDB4NjAsIDB4MDgsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsIDB4MDYsIDB4MDMsIDB4MDAsIDB4QTgsIDB4MDksIDB4RjIsIDB4RkEsIDB4MDIsIDB4MDEsIDB4NjcsIDB4MEUsIDB4RkEsCisJIDB4MDgsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QUEsIDB4RjMsIDB4N0MsIDB4NjMsIDB4MDAsIDB4QkUsIDB4NDAsIDB4NDUsCisJIDB4MUEsIDB4MDMsIDB4MDAsIDB4NjUsIDB4NjUsIDB4NDQsIDB4REMsIDB4ODUsIDB4ODQsIDB4QTEsIDB4MDAsIDB4RjIsIDB4MDYsIDB4MDYsIDB4MDEsIDB4RkMsCisJIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4RjcsIDB4MDIsIDB4NDAsIDB4NDUsIDB4MEUsIDB4MDAsIDB4QTksIDB4RjMsIDB4MDAsIDB4NjMsIDB4RDQsIDB4ODQsCisJIDB4QTksIDB4RkIsIDB4ODAsIDB4NjAsIDB4N0MsIDB4NjQsIDB4MDEsIDB4RkEsIDB4MDAsIDB4RjAsIDB4MDAsIDB4RkMsIDB4RDMsIDB4ODAsIDB4QUEsIDB4RjksCisJIDB4MDIsIDB4MDIsIDB4QUIsIDB4RjksIDB4MDgsIDB4RkUsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4MjUsIDB4NDYsIDB4MDUsIDB4RkEsCisJIDB4MDYsIDB4RkEsIDB4MDEsIDB4RjAsIDB4MDMsIDB4NjcsIDB4MDIsIDB4RkMsIDB4QjAsIDB4ODQsIDB4M0EsIDB4N0UsIDB4MDEsIDB4RkEsIDB4MTIsIDB4NjQsCisJIDB4MDMsIDB4RkEsIDB4MDAsIDB4RjAsIDB4MDQsIDB4RjgsIDB4MDAsIDB4NjQsIDB4MEMsIDB4NjEsIDB4MTAsIDB4NjMsIDB4NTksIDB4REEsIDB4RkUsIDB4MUYsCisJIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDMsIDB4RTMsIDB4ODEsIDB4RTksIDB4ODEsIDB4MDMsIDB4MDUsIDB4MTYsIDB4MDMsIDB4MDAsIDB4NjEsCisJIDB4MDEsIDB4MDAsIDB4RUMsIDB4NjMsIDB4NjEsIDB4NDYsIDB4QkYsIDB4RDIsIDB4MjcsIDB4NDUsIDB4REMsIDB4ODQsIDB4QTIsIDB4REEsIDB4QkUsIDB4RDIsCisJIDB4MjUsIDB4NDYsIDB4ODgsIDB4RjgsIDB4MDQsIDB4MUIsIDB4MjUsIDB4NDQsIDB4NjEsIDB4NDYsIDB4QTMsIDB4REEsIDB4MDQsIDB4MDAsIDB4MEEsIDB4RkEsCisJIDB4NjAsIDB4NDYsIDB4MjUsIDB4NDQsIDB4MDksIDB4RkEsIDB4NjEsIDB4NDYsIDB4QkUsIDB4REEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDQsCisJIDB4MDAsIDB4QTgsIDB4MDcsIDB4NEIsIDB4MEMsIDB4MDMsIDB4NTgsIDB4NEYsIDB4MzMsIDB4MDAsIDB4MEIsIDB4NDcsIDB4MjYsIDB4NjAsIDB4MDQsIDB4NjUsCisJIDB4MjcsIDB4NDQsIDB4RDQsIDB4ODAsIDB4MDAsIDB4NjQsIDB4MDEsIDB4MDIsIDB4MEYsIDB4RkEsIDB4NTgsIDB4NEYsIDB4RDMsIDB4MDEsIDB4NzAsIDB4MDAsCisJIDB4MjUsIDB4NDMsIDB4RTMsIDB4ODQsIDB4N0MsIDB4NDEsIDB4MDIsIDB4MDQsIDB4RTgsIDB4ODEsIDB4RUMsIDB4NjMsIDB4NjEsIDB4NDYsIDB4QTMsIDB4RDIsCisJIDB4MDAsIDB4N0MsIDB4NDAsIDB4NDUsIDB4QkYsIDB4RDgsIDB4QTMsIDB4RDgsIDB4QkUsIDB4RDgsIDB4MjcsIDB4NDIsIDB4NUEsIDB4RDMsIDB4MjUsIDB4NUMsCisJIDB4NjAsIDB4NDEsIDB4MDIsIDB4MUIsIDB4MjcsIDB4RDksIDB4MDUsIDB4MDAsIDB4MjUsIDB4NDYsIDB4MEEsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MjUsIDB4NDQsCisJIDB4MDksIDB4RkEsIDB4MjUsIDB4NDQsIDB4MjcsIDB4NDMsIDB4MDAsIDB4NjEsIDB4NjAsIDB4NDYsIDB4MDksIDB4RjIsIDB4MDgsIDB4RkMsIDB4MDAsIDB4QTgsCisJIDB4REQsIDB4ODEsIDB4RkEsIDB4MDIsIDB4QkYsIDB4RDEsIDB4NjYsIDB4NDQsIDB4QkUsIDB4REIsIDB4QzEsIDB4ODQsIDB4QkYsIDB4REIsIDB4NDgsIDB4MDAsCisJIDB4MjUsIDB4NDYsIDB4RUMsIDB4NjMsIDB4MDgsIDB4RjIsIDB4ODksIDB4RjIsIDB4MUUsIDB4MTgsIDB4NDAsIDB4NDcsIDB4RTAsIDB4ODQsIDB4RTgsIDB4ODUsCisJIDB4MDIsIDB4MDUsIDB4RTgsIDB4ODMsIDB4MDAsIDB4NjUsIDB4NjUsIDB4NDYsIDB4QkYsIDB4RDIsIDB4NjEsIDB4NUMsIDB4Q0MsIDB4ODQsIDB4QTIsIDB4REEsCisJIDB4MjUsIDB4NDYsIDB4MEEsIDB4RjIsIDB4MDAsIDB4QjksIDB4NjUsIDB4NDYsIDB4MDgsIDB4MjQsIDB4QkUsIDB4REEsIDB4MDIsIDB4MUIsIDB4QTMsIDB4RDgsCisJIDB4MDIsIDB4MDAsIDB4NjAsIDB4NDYsIDB4ODksIDB4RkEsIDB4MDAsIDB4QjksIDB4NjEsIDB4NDYsIDB4MDgsIDB4MjgsIDB4MEEsIDB4RkEsIDB4MjUsIDB4NDYsCisJIDB4ODksIDB4RkMsIDB4OEEsIDB4RkMsIDB4ODgsIDB4RkMsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjEsIDB4MjgsIDB4NjUsIDB4MjUsIDB4NDMsCisJIDB4QUIsIDB4RjMsIDB4QUYsIDB4ODMsIDB4MDAsIDB4QkUsIDB4MTgsIDB4MDMsIDB4MDIsIDB4MDMsIDB4MDAsIDB4RkMsIDB4MDEsIDB4MDAsIDB4QUEsIDB4RkQsCisJIDB4NjMsIDB4NDYsIDB4NjUsIDB4NDQsIDB4Q0MsIDB4ODUsIDB4MDAsIDB4RjIsIDB4MDcsIDB4MDIsIDB4QUIsIDB4RjUsIDB4MDAsIDB4NjQsIDB4MDAsIDB4RkEsCisJIDB4REUsIDB4NjAsIDB4QUYsIDB4NjQsIDB4MDksIDB4RkIsIDB4MDgsIDB4MDAsIDB4NjYsIDB4NDMsIDB4MDAsIDB4QkUsIDB4REQsIDB4ODEsIDB4RjEsIDB4MDIsCisJIDB4QTksIDB4RjEsIDB4QUIsIDB4RkQsIDB4QzEsIDB4ODQsIDB4QTksIDB4RkIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDUsCisJIDB4MjksIDB4NDMsIDB4RkMsIDB4QTMsIDB4NjYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MDAsIDB4NjQsIDB4QkQsIDB4REIsCisJIDB4MDMsIDB4NjEsIDB4MEUsIDB4NjUsIDB4MjYsIDB4NjAsIDB4MTgsIDB4NjMsIDB4NDMsIDB4NDksIDB4QTMsIDB4RDMsIDB4MDYsIDB4QTMsIDB4MDAsIDB4QTgsCisJIDB4Q0QsIDB4ODEsIDB4MDQsIDB4MDIsIDB4RjksIDB4MDIsIDB4QjMsIDB4NjAsIDB4RkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MjYsIDB4RTYsIDB4MDEsCisJIDB4RDQsIDB4ODAsIDB4NjAsIDB4NDUsIDB4RTMsIDB4MDUsIDB4RjYsIDB4QTMsIDB4QkQsIDB4RDEsIDB4QkQsIDB4RDEsIDB4NDQsIDB4NDcsIDB4NDQsIDB4NDgsCisJIDB4NDQsIDB4NDUsIDB4MjYsIDB4NjAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NjAsIDB4QzgsIDB4NjMsCisJIDB4MEQsIDB4NjUsIDB4MDAsIDB4NjEsIDB4NDEsIDB4NDgsIDB4QTMsIDB4RDMsIDB4MDYsIDB4QTMsIDB4QUMsIDB4ODYsIDB4MDAsIDB4NjEsIDB4MDksIDB4MDMsCisJIDB4MDAsIDB4RjIsIDB4MDksIDB4RjAsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsIDB4REQsIDB4ODEsIDB4RkMsIDB4MDIsIDB4NjQsIDB4NDQsIDB4QUMsIDB4ODYsCisJIDB4RjYsIDB4MDEsIDB4NjEsIDB4NDQsIDB4MjUsIDB4NDYsIDB4MjcsIDB4REEsIDB4NjUsIDB4NDQsIDB4MjgsIDB4NDUsIDB4NDUsIDB4ODgsIDB4Q0MsIDB4ODUsCisJIDB4NUEsIDB4ODcsIDB4RTksIDB4MDIsIDB4MDAsIDB4NjQsIDB4MjcsIDB4REEsIDB4NUEsIDB4REEsIDB4NUEsIDB4ODcsIDB4QTYsIDB4RjMsIDB4QTUsIDB4RjEsCisJIDB4MDIsIDB4QTQsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDUsIDB4MDAsIDB4NjEsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsCisJIDB4MDQsIDB4MDMsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsIDB4REQsIDB4ODEsIDB4RkMsIDB4MDIsIDB4NjUsIDB4NDQsIDB4MDIsIDB4QTUsIDB4NjUsIDB4NDYsCisJIDB4NjQsIDB4NDQsIDB4Q0MsIDB4OUMsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDIsIDB4NjEsIDB4NDQsIDB4MjUsIDB4NDYsIDB4MjcsIDB4REEsIDB4NUEsIDB4ODcsCisJIDB4MjgsIDB4NDUsIDB4NDUsIDB4ODgsIDB4MDAsIDB4NjQsIDB4MjcsIDB4REEsIDB4NUEsIDB4ODcsIDB4MDYsIDB4NjAsIDB4NDAsIDB4NjUsIDB4QUEsIDB4RjMsCisJIDB4MDEsIDB4NjEsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsIDB4MDMsIDB4MDMsIDB4RDUsIDB4ODAsIDB4REQsIDB4ODEsIDB4RkEsIDB4MDQsIDB4Q0QsIDB4ODQsCisJIDB4MjUsIDB4NDYsIDB4MjcsIDB4REEsIDB4MjgsIDB4NDUsIDB4QzQsIDB4ODQsIDB4NUEsIDB4REEsIDB4REEsIDB4ODEsIDB4QTksIDB4RjEsIDB4NTksIDB4RDgsCisJIDB4MjUsIDB4NjAsIDB4QzYsIDB4NjQsIDB4MTgsIDB4NjMsIDB4QTAsIDB4RDEsIDB4MDYsIDB4QTQsIDB4NTksIDB4RDgsIDB4RkMsIDB4MUYsIDB4MDAsIDB4NjQsCisJIDB4NTksIDB4REEsIDB4NTksIDB4REEsIDB4MDEsIDB4NjAsIDB4NTYsIDB4NjQsIDB4MEEsIDB4NjMsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDgsIDB4RkQsIDB4MUYsCisJIDB4REIsIDB4RjEsIDB4NTksIDB4RDgsIDB4NzUsIDB4MDEsIDB4MDcsIDB4NEIsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RDAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MEIsIDB4NDcsIDB4NTgsIDB4NEYsIDB4MjEsIDB4MDAsIDB4NkMsIDB4MDEsIDB4MDcsIDB4NEIsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RDAsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEIsIDB4NDcsIDB4MjcsIDB4NDQsIDB4MDAsIDB4QkUsIDB4MDgsIDB4RjAsIDB4MTUsIDB4MDMsIDB4NjQsIDB4NDIsIDB4NEEsIDB4RDMsCisJIDB4MDksIDB4RjIsIDB4REMsIDB4ODMsIDB4QTIsIDB4REQsIDB4MjUsIDB4NDMsIDB4MDksIDB4RkMsIDB4NjMsIDB4NDYsIDB4MjcsIDB4NDMsIDB4MEEsIDB4RkMsCisJIDB4MDksIDB4RkEsIDB4MDgsIDB4RjgsIDB4MDAsIDB4QTgsIDB4NjYsIDB4NDMsIDB4MDMsIDB4MDIsIDB4NjQsIDB4NDQsIDB4NTgsIDB4REQsIDB4MDMsIDB4MDAsCisJIDB4NjAsIDB4NDYsIDB4MjUsIDB4NDQsIDB4MEEsIDB4RkEsIDB4NEMsIDB4MDEsIDB4MjcsIDB4NDMsIDB4RTMsIDB4ODEsIDB4RTksIDB4ODEsIDB4MDMsIDB4MDUsCisJIDB4MTYsIDB4MDMsIDB4MDAsIDB4NjEsIDB4MDEsIDB4MDAsIDB4RUMsIDB4NjMsIDB4NjEsIDB4NDYsIDB4QkYsIDB4RDIsIDB4MjcsIDB4NDUsIDB4REMsIDB4ODQsCisJIDB4QTIsIDB4REEsIDB4QTMsIDB4RDIsIDB4MjUsIDB4NDYsIDB4ODgsIDB4RjgsIDB4MDQsIDB4MUIsIDB4MjUsIDB4NDQsIDB4NjEsIDB4NDYsIDB4QkUsIDB4REEsCisJIDB4MDQsIDB4MDAsIDB4MDksIDB4RkEsIDB4NjAsIDB4NDYsIDB4MjUsIDB4NDQsIDB4MEEsIDB4RkEsIDB4NjEsIDB4NDYsIDB4QTMsIDB4REEsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4QTAsIDB4RkUsIDB4MDcsIDB4MDUsIDB4QTMsIDB4RkUsIDB4MDcsIDB4MDUsIDB4QTEsIDB4RkUsIDB4NDgsIDB4MDUsIDB4NjAsIDB4NjQsCisJIDB4M0IsIDB4REIsIDB4MTEsIDB4MDAsIDB4MjAsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NEYsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NjAsCisJIDB4REYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkIsIDB4QjQsIDB4QTIsIDB4REIsIDB4QTAsIDB4NEMsIDB4NTksIDB4QkMsIDB4RkYsIDB4QjQsIDB4QTAsIDB4NTEsCisJIDB4QTAsIDB4NEMsIDB4N0QsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODMsIDB4M0UsIDB4NDAsIDB4NjAsIDB4MEIsIDB4NjUsCisJIDB4MkIsIDB4NDQsIDB4MDAsIDB4NjMsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MDIsIDB4MjQsIDB4OTQsIDB4ODQsIDB4RjMsIDB4ODMsIDB4Q0QsIDB4ODEsCisJIDB4RkYsIDB4RkYsIDB4RjgsIDB4MDIsIDB4REYsIDB4ODMsIDB4MkYsIDB4NTgsIDB4NDAsIDB4NEIsIDB4MDAsIDB4NjIsIDB4MDEsIDB4NjQsIDB4RDQsIDB4ODAsCisJIDB4RTAsIDB4ODQsIDB4MUEsIDB4MDMsIDB4RDQsIDB4ODAsIDB4RTAsIDB4ODQsIDB4MTUsIDB4MDMsIDB4NjEsIDB4NDQsIDB4MTEsIDB4NjEsIDB4RTAsIDB4ODQsCisJIDB4Q0QsIDB4ODEsIDB4RkQsIDB4MDQsIDB4MDEsIDB4MDAsIDB4RTAsIDB4ODQsIDB4RjIsIDB4ODIsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MjQsIDB4QzYsIDB4ODIsCisJIDB4MDIsIDB4MjgsIDB4RDYsIDB4ODIsIDB4RTIsIDB4ODAsIDB4Q0QsIDB4ODEsIDB4MDIsIDB4MjgsIDB4MDEsIDB4QkMsIDB4RjQsIDB4MDIsIDB4MDEsIDB4MkEsCisJIDB4QzYsIDB4ODIsIDB4MDMsIDB4MDAsIDB4RTksIDB4ODEsIDB4RjIsIDB4ODIsIDB4NjEsIDB4NDQsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsCisJIDB4M0IsIDB4REIsIDB4M0MsIDB4NDQsIDB4QUMsIDB4ODAsIDB4RkYsIDB4RkYsIDB4QzYsIDB4MDIsIDB4ODksIDB4RjMsIDB4OEEsIDB4RjMsIDB4MDIsIDB4QTgsCisJIDB4MDIsIDB4QTgsIDB4MDgsIDB4MDIsIDB4MDAsIDB4NjQsIDB4OEIsIDB4RkIsIDB4ODksIDB4RkIsIDB4OEEsIDB4RkIsIDB4MDAsIDB4NjQsIDB4OEMsIDB4RkIsCisJIDB4Q0EsIDB4RkUsIDB4MkEsIDB4MDAsIDB4MDMsIDB4MDIsIDB4MDAsIDB4NjQsIDB4OEEsIDB4RkIsIDB4Q0EsIDB4RkUsIDB4MDEsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4MTIsIDB4NjAsIDB4RTcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MTMsIDB4MDMsIDB4REIsIDB4RjMsIDB4MkEsIDB4RjIsCisJIDB4RkQsIDB4QTAsIDB4NjAsIDB4NDAsIDB4ODAsIDB4M0EsIDB4MzMsIDB4MDAsIDB4MzIsIDB4MDIsIDB4OUIsIDB4RkUsIDB4MzAsIDB4MDUsIDB4MDAsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MEEsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4RTcsIDB4MDEsIDB4OEEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MDIsIDB4MTIsIDB4NjAsIDB4RTQsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MUIsIDB4MDIsIDB4ODYsIDB4RkYsIDB4MjAsIDB4NDAsIDB4MTIsIDB4MjcsIDB4MTMsIDB4MDAsCisJIDB4OUEsIDB4RkUsIDB4MTEsIDB4MDQsIDB4OUQsIDB4RkUsIDB4MEYsIDB4MDQsIDB4OTUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4ODAsIDB4QkMsIDB4OTUsIDB4RkIsCisJIDB4ODQsIDB4RkYsIDB4QzIsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDAsIDB4NDIsIDB4MDYsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RkYsIDB4RkYsCisJIDB4MkQsIDB4RkYsIDB4MTIsIDB4NjQsIDB4M0IsIDB4REIsIDB4ODQsIDB4RkYsIDB4QjcsIDB4NjAsIDB4RjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsCisJIDB4RkMsIDB4RkIsIDB4NDYsIDB4NUMsIDB4MTksIDB4NjAsIDB4Q0YsIDB4RjMsIDB4MEQsIDB4RjIsIDB4NjAsIDB4NUMsIDB4NjQsIDB4NUYsIDB4MEQsIDB4RkEsCisJIDB4MTEsIDB4NjQsIDB4M0IsIDB4REIsIDB4OUQsIDB4RkUsIDB4MDYsIDB4MDUsIDB4MDgsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MTYsIDB4RkIsIDB4MkQsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkUsIDB4MDcsIDB4RjAsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDIsIDB4MjMsIDB4RjAsCisJIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4QkYsIDB4NjAsIDB4NzksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4MDAsIDB4NjMsCisJIDB4NDAsIDB4NDcsIDB4NTAsIDB4MzYsIDB4MDUsIDB4MDAsIDB4QTQsIDB4MzYsIDB4MDMsIDB4MDAsIDB4ODAsIDB4MzYsIDB4MDEsIDB4MDAsIDB4MDEsIDB4NjMsCisJIDB4NDgsIDB4RkQsIDB4NDAsIDB4NDcsIDB4MDgsIDB4MkEsIDB4MDgsIDB4MDAsIDB4MDMsIDB4MkYsIDB4MDYsIDB4MDAsIDB4N0YsIDB4RjEsIDB4MkMsIDB4RjgsCisJIDB4ODAsIDB4RjEsIDB4MkQsIDB4RjgsIDB4ODEsIDB4RjEsIDB4MkUsIDB4RjgsIDB4NEEsIDB4RjMsIDB4MzUsIDB4RkEsIDB4MTAsIDB4QTQsIDB4NEEsIDB4RkIsCisJIDB4MDAsIDB4NjQsIDB4MTUsIDB4RkEsIDB4MTYsIDB4RkEsIDB4MEYsIDB4RkEsIDB4MDcsIDB4RjAsIDB4QTYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDUsIDB4MDMsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4MTEsIDB4RjIsIDB4RDksIDB4RkIsIDB4NjMsIDB4NDYsIDB4MDMsIDB4RjIsCisJIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjIsIDB4RkMsIDB4QTUsIDB4MDAsIDB4N0YsIDB4RDQsIDB4ODQsIDB4MjcsIDB4NDUsIDB4M0MsIDB4NDYsIDB4MUEsIDB4RkEsCisJIDB4MjIsIDB4NjMsIDB4N0IsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTQsIDB4ODQsIDB4MDMsIDB4MkIsIDB4MUMsIDB4NjMsIDB4MkEsIDB4RkEsIDB4OEYsIDB4QjAsCisJIDB4ODgsIDB4MzYsIDB4MDIsIDB4QTMsIDB4NjAsIDB4NDAsIDB4QTQsIDB4MzYsIDB4MTQsIDB4NjMsIDB4NDMsIDB4NEMsIDB4MTgsIDB4RkMsIDB4MDAsIDB4N0MsCisJIDB4MjIsIDB4RjgsIDB4NjQsIDB4NDEsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4M0EsIDB4RjIsIDB4NjMsIDB4NDYsIDB4RkYsIDB4QjQsCisJIDB4MjIsIDB4RkEsIDB4NjAsIDB4NDAsIDB4MDAsIDB4MzYsIDB4ODIsIDB4MDAsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MEMsIDB4QjAsIDB4MDgsIDB4M0EsCisJIDB4QUQsIDB4MDAsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjYsIDB4QUEsIDB4MDAsIDB4MDMsIDB4RjIsIDB4MDAsIDB4RjQsIDB4QTAsIDB4RDIsIDB4QUEsIDB4NjAsCisJIDB4QUEsIDB4NjUsIDB4NUEsIDB4RDAsIDB4RDQsIDB4ODAsIDB4MDMsIDB4NjQsIDB4MEEsIDB4MDIsIDB4RDAsIDB4ODAsIDB4MDAsIDB4NjQsIDB4NUEsIDB4RDAsCisJIDB4MDYsIDB4MDIsIDB4RDAsIDB4ODAsIDB4RjgsIDB4N0YsIDB4RDAsIDB4ODAsIDB4MDEsIDB4MDMsIDB4MDEsIDB4MDIsIDB4MDEsIDB4NjEsIDB4NjIsIDB4NDMsCisJIDB4NDYsIDB4NDMsIDB4M0MsIDB4NDYsIDB4MDcsIDB4RjQsIDB4M0EsIDB4RjIsIDB4RkYsIDB4RkYsIDB4QTMsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MjIsIDB4MjYsCisJIDB4NjQsIDB4MDAsIDB4NjAsIDB4NDUsIDB4NjMsIDB4NDIsIDB4NUEsIDB4RDAsIDB4Q0QsIDB4ODEsIDB4M0MsIDB4NDYsIDB4MUIsIDB4MDIsIDB4NjQsIDB4NDQsCisJIDB4ODgsIDB4M0EsIDB4MTgsIDB4MDAsIDB4OEUsIDB4MzcsIDB4MDMsIDB4MDAsIDB4QzcsIDB4MzcsIDB4MDEsIDB4MDAsIDB4MTMsIDB4MDAsIDB4NjUsIDB4NDQsCisJIDB4MDEsIDB4MjYsIDB4N0MsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MDEsIDB4MDAsIDB4MzEsIDB4MDAsIDB4QTMsIDB4NDYsCisJIDB4M0IsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MjcsIDB4NUIsIDB4MDAsIDB4QTMsIDB4NDYsIDB4MDAsIDB4N0MsIDB4MjIsIDB4RjgsCisJIDB4QTMsIDB4NDYsIDB4NkMsIDB4MDAsIDB4QTMsIDB4NDYsIDB4NjUsIDB4NDQsIDB4MDEsIDB4MjYsIDB4MEIsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDMsIDB4MDAsCisJIDB4MTAsIDB4MjYsIDB4MDEsIDB4MDAsIDB4MUQsIDB4MDAsIDB4M0IsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MjcsIDB4NDgsIDB4MDAsCisJIDB4MTcsIDB4MDAsIDB4QTYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4M0EsIDB4RjIsIDB4NjYsIDB4NDMsIDB4RkYsIDB4QjQsIDB4M0MsIDB4NDYsCisJIDB4MjIsIDB4RjAsIDB4NjAsIDB4NDcsIDB4QjAsIDB4ODQsIDB4MjIsIDB4RkEsIDB4NjMsIDB4NDYsIDB4M0IsIDB4RjAsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjcsCisJIDB4MDMsIDB4MDAsIDB4MTAsIDB4MjcsIDB4MDEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NjQsIDB4NDAsIDB4ODAsIDB4MjcsIDB4MzEsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4M0MsIDB4NDYsIDB4MDIsIDB4NjUsIDB4QkYsIDB4NjAsIDB4MTksIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0QsIDB4ODEsIDB4NjMsIDB4NDIsIDB4NUEsIDB4RDAsCisJIDB4M0MsIDB4NDYsIDB4MjYsIDB4MDIsIDB4NjQsIDB4NDQsIDB4ODgsIDB4M0EsIDB4MjMsIDB4MDAsIDB4NzcsIDB4MzcsIDB4MzcsIDB4MDAsIDB4NzgsIDB4MzcsCisJIDB4MzUsIDB4MDAsIDB4OEUsIDB4MzcsIDB4MzMsIDB4MDAsIDB4QzcsIDB4MzcsIDB4MzEsIDB4MDAsIDB4MUEsIDB4MDAsIDB4MTksIDB4NjAsIDB4QTMsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MkEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MTksIDB4NjAsIDB4QTMsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4RTIsIDB4MDEsIDB4M0MsIDB4NDYsIDB4M0UsIDB4RjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4RjAsIDB4ODQsCisJIDB4QTQsIDB4ODQsIDB4M0QsIDB4RkEsIDB4MkEsIDB4RjIsIDB4QkYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4MkEsIDB4RkEsIDB4MTYsIDB4MDAsCisJIDB4M0MsIDB4NDYsIDB4MjIsIDB4RjAsIDB4ODAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjIsIDB4M0UsIDB4RjAsCisJIDB4MDgsIDB4QTQsIDB4NjAsIDB4NDEsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MjYsCisJIDB4MDMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MkIsIDB4MDIsIDB4MDAsIDB4NjEsIDB4NDQsIDB4M0YsIDB4RkEsIDB4M0MsIDB4NDYsIDB4MkMsIDB4RjIsCisJIDB4MjcsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MzIsIDB4RjIsIDB4RDMsIDB4RjEsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4NDcsIDB4MDAsIDB4MDksIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4M0YsIDB4RjIsIDB4MDksIDB4MDYsIDB4MkMsIDB4NDUsIDB4QzQsIDB4ODQsIDB4RDAsIDB4ODAsIDB4NDAsIDB4NEEsCisJIDB4MzQsIDB4MDYsIDB4NjAsIDB4NDMsIDB4NjQsIDB4NDQsIDB4NTQsIDB4ODgsIDB4MTcsIDB4MDAsIDB4NjAsIDB4NDUsIDB4MTYsIDB4NjAsIDB4QzgsIDB4RjMsCisJIDB4REEsIDB4RjMsIDB4MDAsIDB4QkMsIDB4NjAsIDB4NDcsIDB4RUMsIDB4QTAsIDB4MjgsIDB4MDMsIDB4MjcsIDB4MDcsIDB4MkMsIDB4NDQsIDB4QzQsIDB4ODEsCisJIDB4MDIsIDB4NjAsIDB4MUMsIDB4NjUsIDB4NDUsIDB4NEEsIDB4RDUsIDB4ODAsIDB4MkMsIDB4NDUsIDB4MUYsIDB4MDYsIDB4MjcsIDB4NDAsIDB4MDQsIDB4MjcsCisJIDB4MjUsIDB4MDAsIDB4MkEsIDB4NDMsIDB4RDcsIDB4ODUsIDB4NDUsIDB4NDgsIDB4RDQsIDB4RjEsIDB4MEYsIDB4RjIsIDB4RDMsIDB4ODAsIDB4MDEsIDB4NjUsCisJIDB4MDEsIDB4MDcsIDB4MDAsIDB4NjUsIDB4QjQsIDB4ODQsIDB4MEYsIDB4RkEsIDB4MDAsIDB4NjMsIDB4M0YsIDB4RjIsIDB4MjgsIDB4NDUsIDB4NjAsIDB4NDEsCisJIDB4RDQsIDB4ODQsIDB4REYsIDB4ODMsIDB4RkMsIDB4MDcsIDB4MTQsIDB4RkMsIDB4MTcsIDB4RkEsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MjcsIDB4NDUsCisJIDB4QjQsIDB4ODQsIDB4MkEsIDB4RkEsIDB4MjgsIDB4NDMsIDB4MTYsIDB4RkMsIDB4MEQsIDB4MDAsIDB4M0YsIDB4RjIsIDB4MkMsIDB4NDUsIDB4RDQsIDB4RjEsCisJIDB4QzQsIDB4ODEsIDB4RDEsIDB4ODAsIDB4MEYsIDB4RjIsIDB4MDEsIDB4MDYsIDB4MDEsIDB4QkMsIDB4MEYsIDB4RkEsIDB4M0YsIDB4RjIsIDB4MTcsIDB4RkEsCisJIDB4MDEsIDB4NjQsIDB4MTQsIDB4RkEsIDB4QUEsIDB4RjIsIDB4MTksIDB4NjAsIDB4M0YsIDB4RjMsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsCisJIDB4NDQsIDB4NDQsIDB4NjEsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDIsIDB4MDAsIDB4NjEsIDB4NDAsIDB4ODAsIDB4MzYsIDB4MTIsIDB4RjIsIDB4NjMsIDB4NDYsCisJIDB4MzMsIDB4NjAsIDB4ODYsIDB4NjEsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDUsIDB4NDUsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsIDB4MDAsIDB4N0YsCisJIDB4NEIsIDB4RkIsIDB4NjUsIDB4NDQsIDB4MDAsIDB4N0UsIDB4REEsIDB4RkIsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4MTIsIDB4RjAsCisJIDB4NjAsIDB4NDcsIDB4NjMsIDB4NDYsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MUUsIDB4MDAsIDB4MzMsIDB4NjAsIDB4MEEsIDB4NjMsIDB4NjAsIDB4NDAsCisJIDB4MEEsIDB4MzYsIDB4MEMsIDB4MDAsIDB4MTQsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MzcsIDB4MzYsIDB4MDIsIDB4MDAsIDB4QTMsIDB4RDMsIDB4MDksIDB4MDAsCisJIDB4MDIsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDYsIDB4MDAsIDB4MDQsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDMsIDB4MDAsIDB4MDYsIDB4QTMsIDB4QTMsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MEEsIDB4MzYsIDB4NzAsIDB4NjQsIDB4MTQsIDB4MzYsIDB4MzgsIDB4NjQsIDB4MzcsIDB4MzYsIDB4MTUsIDB4NjQsCisJIDB4NkUsIDB4MzYsIDB4MEIsIDB4NjQsIDB4MzksIDB4MDAsIDB4MzIsIDB4NjAsIDB4RkEsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MEIsIDB4MzYsIDB4MjAsIDB4MDAsCisJIDB4MEYsIDB4MzYsIDB4MUIsIDB4MDAsIDB4MEEsIDB4MzYsIDB4MTYsIDB4MDAsIDB4MEUsIDB4MzYsIDB4MTEsIDB4MDAsIDB4MDksIDB4MzYsIDB4MEMsIDB4MDAsCisJIDB4MEQsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MDgsIDB4MzYsIDB4MDIsIDB4MDAsIDB4QTMsIDB4RDMsIDB4MTUsIDB4MDAsIDB4MDIsIDB4QTMsIDB4QTMsIDB4RDMsCisJIDB4MTIsIDB4MDAsIDB4MDQsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MEYsIDB4MDAsIDB4MDYsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MEMsIDB4MDAsIDB4MDgsIDB4QTMsCisJIDB4QTMsIDB4RDMsIDB4MDksIDB4MDAsIDB4MEEsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDYsIDB4MDAsIDB4MEMsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDMsIDB4MDAsCisJIDB4MEUsIDB4QTMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MEIsIDB4MzYsIDB4MUUsIDB4NjQsIDB4MEYsIDB4MzYsIDB4MTYsIDB4NjQsCisJIDB4MEEsIDB4MzYsIDB4MTIsIDB4NjQsIDB4MEUsIDB4MzYsIDB4MEUsIDB4NjQsIDB4MDksIDB4MzYsIDB4MEUsIDB4NjQsIDB4MEQsIDB4MzYsIDB4MEEsIDB4NjQsCisJIDB4MDgsIDB4MzYsIDB4MEEsIDB4NjQsIDB4MEMsIDB4MzYsIDB4MEEsIDB4NjQsIDB4NDAsIDB4NDYsIDB4MkEsIDB4RjIsIDB4MDcsIDB4RjAsIDB4NjAsIDB4NDAsCisJIDB4QjAsIDB4M0EsIDB4MDMsIDB4MDAsIDB4NDAsIDB4M0IsIDB4MDEsIDB4MDAsIDB4MTIsIDB4MDAsIDB4MEMsIDB4QjQsIDB4MDgsIDB4M0EsIDB4NDQsIDB4MDAsCisJIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MkIsIDB4M0YsIDB4MDAsIDB4MTcsIDB4RjIsIDB4MjIsIDB4RjAsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDAsIDB4MjIsIDB4MjIsIDB4MDQsIDB4MDAsIDB4MDAsIDB4QTgsIDB4MDEsIDB4QTgsIDB4MzYsIDB4MDMsIDB4MzUsIDB4MDMsIDB4M0MsIDB4NDYsCisJIDB4MkEsIDB4RjAsIDB4NDAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NjAsIDB4NDUsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MUQsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MTAsIDB4MDAsIDB4MDQsIDB4MDAsCisJIDB4MDQsIDB4MjcsIDB4MTgsIDB4MDAsIDB4MTAsIDB4MjcsIDB4MEIsIDB4MDAsIDB4NjUsIDB4NDQsIDB4MkEsIDB4NjEsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MkIsCisJIDB4MjQsIDB4NjEsIDB4OEYsIDB4QjAsIDB4ODgsIDB4MzYsIDB4MDIsIDB4QTEsIDB4NDEsIDB4NEMsIDB4OTgsIDB4RkEsIDB4MTUsIDB4MDAsIDB4NjUsIDB4NDQsCisJIDB4MzIsIDB4NjEsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MkIsIDB4MkMsIDB4NjEsIDB4OEYsIDB4QjAsIDB4ODgsIDB4MzYsIDB4MDIsIDB4QTEsIDB4NDEsIDB4NEMsCisJIDB4OTgsIDB4RkEsIDB4MEEsIDB4MDAsIDB4NjUsIDB4NDQsIDB4MkUsIDB4NjEsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MkIsIDB4MjgsIDB4NjEsIDB4OEYsIDB4QjAsCisJIDB4ODgsIDB4MzYsIDB4MDIsIDB4QTEsIDB4NDEsIDB4NEMsIDB4OTgsIDB4RkEsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjcsCisJIDB4MDMsIDB4MDAsIDB4QkMsIDB4NjAsIDB4NDYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4RjIsIDB4NDYsIDB4NDMsIDB4NjAsIDB4NDAsIDB4MjIsIDB4MjYsCisJIDB4MDksIDB4MDAsIDB4MDEsIDB4MjYsIDB4MEEsIDB4MDAsIDB4MDQsIDB4MjYsIDB4NEIsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MTAsIDB4MDAsIDB4QkMsIDB4NjAsCisJIDB4NDYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QkIsIDB4NjAsIDB4QzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjcsIDB4M0QsIDB4MDAsIDB4MTAsIDB4MjcsCisJIDB4MDMsIDB4MDAsIDB4QkMsIDB4NjAsIDB4NDYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTYsIDB4RjMsIDB4M0MsIDB4RjEsIDB4MDIsIDB4MDAsIDB4MDcsIDB4RjIsCisJIDB4MDAsIDB4N0MsIDB4NDAsIDB4NDMsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjcsIDB4MjEsIDB4MDAsIDB4QTMsIDB4NDYsCisJIDB4NEIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4NEIsIDB4RkEsIDB4NEEsIDB4RjIsIDB4MDgsIDB4MDQsIDB4REMsIDB4ODQsIDB4NEEsIDB4RkEsCisJIDB4NDksIDB4RjIsIDB4MDQsIDB4MDQsIDB4REMsIDB4ODQsIDB4NDksIDB4RkEsIDB4MDEsIDB4MDQsIDB4RkYsIDB4RkYsIDB4QTYsIDB4RjMsIDB4NjYsIDB4NUMsCisJIDB4RDAsIDB4ODAsIDB4MDAsIDB4N0MsIDB4MDEsIDB4MDIsIDB4M0MsIDB4RjEsIDB4NEIsIDB4RjAsIDB4NjQsIDB4NDcsIDB4MjAsIDB4QkYsIDB4QTMsIDB4NDYsCisJIDB4M0EsIDB4RjgsIDB4M0IsIDB4RkEsIDB4QTMsIDB4NDYsIDB4NEEsIDB4RjIsIDB4NDksIDB4RjAsIDB4QTMsIDB4NDYsIDB4M0MsIDB4RkEsIDB4M0QsIDB4RjgsCisJIDB4MEYsIDB4NjAsIDB4OUUsIDB4NjQsIDB4QTMsIDB4NDYsIDB4NzYsIDB4NjEsIDB4MEUsIDB4NjMsIDB4NTksIDB4RDAsIDB4NTgsIDB4RDksIDB4RkQsIDB4MUYsCisJIDB4QTMsIDB4NDYsIDB4QkMsIDB4NjAsIDB4NDYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4MDIsIDB4MDAsCisJIDB4MDcsIDB4RjQsIDB4RkYsIDB4RkYsIDB4QTMsIDB4NDYsIDB4MkEsIDB4RjIsIDB4QTMsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjcsIDB4NDgsIDB4MDAsCisJIDB4QTYsIDB4RjMsIDB4NjYsIDB4NUMsIDB4RDAsIDB4ODAsIDB4M0IsIDB4RjAsIDB4MDgsIDB4MDMsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MTIsIDB4MDAsCisJIDB4RkYsIDB4NjAsIDB4RUYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4M0IsIDB4RkEsIDB4MjQsIDB4MDAsIDB4M0QsIDB4RjMsIDB4MDEsIDB4NjEsIDB4NjAsIDB4NDMsCisJIDB4Q0YsIDB4ODMsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MEQsIDB4RTksIDB4ODEsIDB4QTEsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4OTEsIDB4ODQsCisJIDB4M0IsIDB4RkEsIDB4MTcsIDB4MDAsIDB4NEIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MTAsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDQsIDB4RkYsIDB4NjAsCisJIDB4RkYsIDB4NjQsIDB4REMsIDB4ODQsIDB4NEIsIDB4RkEsIDB4NEEsIDB4RjIsIDB4MTYsIDB4MDQsIDB4REMsIDB4ODQsIDB4NEEsIDB4RkEsIDB4NDksIDB4RjIsCisJIDB4MDgsIDB4MDQsIDB4REMsIDB4ODQsIDB4NDksIDB4RkEsIDB4MDUsIDB4MDQsIDB4M0IsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4M0IsIDB4RkEsIDB4MEMsIDB4NjAsIDB4RkMsIDB4NjIsIDB4ODAsIDB4RkYsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4QTIsIDB4REIsIDB4QzgsIDB4NjAsCisJIDB4MTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODQsIDB4RkYsIDB4MDYsIDB4NjAsIDB4MTcsIDB4RTEsIDB4NzcsIDB4NDAsIDB4OEIsIDB4RkYsIDB4MDIsIDB4NjAsCisJIDB4MDAsIDB4NzUsIDB4QzksIDB4NjAsIDB4NTgsIDB4NEYsIDB4QUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjQsIDB4MDYsIDB4NjAsIDB4N0YsIDB4RkIsCisJIDB4MEMsIDB4NjAsIDB4RkMsIDB4NjIsIDB4ODAsIDB4RkYsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4QTIsIDB4REIsIDB4QzgsIDB4NjAsIDB4OEMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4ODQsIDB4RkYsIDB4MDAsIDB4N0MsIDB4MDYsIDB4NjAsIDB4N0YsIDB4RjMsIDB4QTIsIDB4RDksIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsCisJIDB4MDQsIDB4MDAsIDB4QzksIDB4NjAsIDB4NTgsIDB4NEYsIDB4RjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0MsIDB4NDYsIDB4MDcsIDB4RjQsIDB4QTYsIDB4RjMsCisJIDB4NjYsIDB4NUMsIDB4RDAsIDB4ODAsIDB4MDAsIDB4N0MsIDB4MDcsIDB4MDMsIDB4NjYsIDB4NDMsIDB4M0MsIDB4NDYsIDB4MjIsIDB4RjIsIDB4NjMsIDB4NDYsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDEsIDB4MDAsIDB4M0MsIDB4RjEsIDB4NEIsIDB4RjAsIDB4NjQsIDB4NDEsIDB4NjQsIDB4NDcsIDB4RkYsIDB4QjQsCisJIDB4NjAsIDB4NUYsIDB4MjAsIDB4QkMsIDB4ODAsIDB4MjYsIDB4ODAsIDB4QUMsIDB4NjAsIDB4NDcsIDB4QTMsIDB4NDYsIDB4M0EsIDB4RkEsIDB4NjQsIDB4NDQsCisJIDB4MjAsIDB4N0YsIDB4MzQsIDB4OTQsIDB4M0IsIDB4RkEsIDB4QTMsIDB4NDYsIDB4NEEsIDB4RjIsIDB4NDksIDB4RjAsIDB4QTMsIDB4NDYsIDB4M0MsIDB4RkEsCisJIDB4M0QsIDB4RjgsIDB4ODAsIDB4NjAsIDB4MTAsIDB4RTAsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUEsIDB4MEYsIDB4NjQsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QkMsIDB4NjAsIDB4NDYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjcsIDB4MzEsIDB4MDAsIDB4MkEsIDB4RjIsIDB4MDAsIDB4NjAsCisJIDB4N0MsIDB4NjIsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MjQsIDB4MDAsIDB4QTIsIDB4RDMsIDB4MDAsIDB4NjEsIDB4NjAsIDB4RkUsIDB4QTAsIDB4RDMsCisJIDB4NUUsIDB4RDEsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4NjQsIDB4NUYsIDB4REMsIDB4ODQsIDB4RjEsIDB4ODEsIDB4QzAsIDB4MkIsIDB4MDQsIDB4MDAsCisJIDB4ODAsIDB4MkEsIDB4MDIsIDB4MDAsIDB4N0YsIDB4QTQsIDB4REMsIDB4ODQsIDB4RkYsIDB4M0IsIDB4MDMsIDB4MDAsIDB4NjAsIDB4NDcsIDB4REMsIDB4ODcsCisJIDB4MDEsIDB4NjEsIDB4QzAsIDB4ODAsIDB4MDAsIDB4MzYsIDB4REMsIDB4ODQsIDB4NEUsIDB4REIsIDB4NjAsIDB4RkUsIDB4NUEsIDB4RDEsIDB4RkYsIDB4RkYsCisJIDB4QzEsIDB4ODQsIDB4RjAsIDB4MjIsIDB4MTAsIDB4QTQsIDB4RjAsIDB4MkEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjAsIDB4RkUsCisJIDB4MDAsIDB4NjAsIDB4M0UsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDMsIDB4NUEsIDB4RDEsIDB4M0EsIDB4RkEsIDB4M0IsIDB4RjgsIDB4NzQsIDB4NjIsCisJIDB4QTIsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsCisJIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDEsCisJIDB4NUEsIDB4RDEsIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDQsIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTQsIDB4N0YsIDB4NUEsIDB4RDEsCisJIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTYsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsCisJIDB4NjQsIDB4NDQsIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjUsIDB4NDAsIDB4MEQsIDB4M0EsIDB4MUMsIDB4MDAsIDB4NjQsIDB4NDcsIDB4RTgsIDB4N0YsCisJIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTksIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUEsIDB4N0YsIDB4NUEsIDB4RDEsCisJIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUMsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsCisJIDB4NjQsIDB4NDQsIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUUsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsCisJIDB4RUYsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUEsIDB4NjUsIDB4NDQsIDB4MDIsIDB4QTQsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4NjYsIDB4NDUsIDB4QUEsIDB4RjIsCisJIDB4MTksIDB4NjAsIDB4M0YsIDB4RjMsIDB4MjQsIDB4NDYsIDB4NjEsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDIsIDB4MDAsIDB4NjEsIDB4NDAsIDB4ODAsIDB4MzYsCisJIDB4MTIsIDB4RjIsIDB4NjUsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MzQsIDB4MDAsIDB4MkMsIDB4NDUsIDB4MTcsIDB4RjIsIDB4NEIsIDB4RjEsCisJIDB4QzQsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODEsIDB4NjQsIDB4NDUsIDB4MTYsIDB4QTEsIDB4QjgsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4MTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4N0QsIDB4RjEsIDB4MDEsIDB4QTQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsCisJIDB4MDYsIDB4QTQsIDB4MUIsIDB4RkEsIDB4REEsIDB4RjMsIDB4MkMsIDB4NjAsIDB4N0MsIDB4NjUsIDB4NjAsIDB4NDAsIDB4MEIsIDB4MzcsIDB4MDAsIDB4NjMsCisJIDB4MEYsIDB4MzcsIDB4MDIsIDB4NjMsIDB4MEEsIDB4MzcsIDB4MDQsIDB4NjMsIDB4MEUsIDB4MzcsIDB4MDYsIDB4NjMsIDB4MDksIDB4MzcsIDB4MDgsIDB4NjMsCisJIDB4MEQsIDB4MzcsIDB4MEEsIDB4NjMsIDB4MDgsIDB4MzcsIDB4MEMsIDB4NjMsIDB4MEMsIDB4MzcsIDB4MEUsIDB4NjMsIDB4MjgsIDB4QTMsIDB4NDcsIDB4RDEsCisJIDB4RDgsIDB4QTMsIDB4RDcsIDB4ODMsIDB4MTksIDB4NjAsIDB4NzcsIDB4RjksIDB4NDcsIDB4RDEsIDB4NDAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4MUYsIDB4RkEsCisJIDB4NTgsIDB4MDAsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MzYsIDB4MTksIDB4MDAsIDB4NTAsIDB4MzYsIDB4MTcsIDB4MDAsCisJIDB4NDAsIDB4MzYsIDB4MTUsIDB4MDAsIDB4MDAsIDB4MzYsIDB4MTMsIDB4MDAsIDB4MjAsIDB4MzYsIDB4MTEsIDB4MDAsIDB4QTAsIDB4MzYsIDB4MEYsIDB4MDAsCisJIDB4QjAsIDB4MzYsIDB4MEQsIDB4MDAsIDB4QzAsIDB4MzYsIDB4MEIsIDB4MDAsIDB4REEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MEEsIDB4MzcsCisJIDB4MDYsIDB4MDAsIDB4MTksIDB4NjAsIDB4N0IsIDB4RjMsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjEsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjYsIDB4MDAsIDB4NjEsCisJIDB4REEsIDB4RjMsIDB4MkMsIDB4NjAsIDB4NzQsIDB4NjUsIDB4NjAsIDB4NDAsIDB4MEEsIDB4MzcsIDB4MDAsIDB4NjMsIDB4MTQsIDB4MzcsIDB4MDIsIDB4NjMsCisJIDB4MzcsIDB4MzcsIDB4MDQsIDB4NjMsIDB4NkUsIDB4MzcsIDB4MDYsIDB4NjMsIDB4MjgsIDB4QTMsIDB4NDcsIDB4RDEsIDB4RDgsIDB4QTMsIDB4RDcsIDB4ODMsCisJIDB4MTksIDB4NjAsIDB4NzcsIDB4RjksIDB4NDcsIDB4RDEsIDB4RkYsIDB4RkYsIDB4QjEsIDB4ODQsIDB4MUYsIDB4RkEsIDB4REEsIDB4RjEsIDB4MkMsIDB4NDUsCisJIDB4NjQsIDB4NDMsIDB4MTcsIDB4RjIsIDB4NEIsIDB4RjEsIDB4QzQsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODEsIDB4NjMsIDB4NDAsCisJIDB4MzcsIDB4MzcsIDB4RTEsIDB4ODEsIDB4NjQsIDB4NDUsIDB4QjgsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QUUsIDB4ODIsCisJIDB4RkMsIDB4QTIsIDB4MEEsIDB4MDMsIDB4NjMsIDB4NDAsIDB4NkUsIDB4M0IsIDB4MDYsIDB4MDAsIDB4NjAsIDB4NDEsIDB4MDQsIDB4MEQsIDB4NjMsIDB4NDQsCisJIDB4ODAsIDB4N0UsIDB4REEsIDB4RkIsIDB4NjEsIDB4NDQsIDB4REMsIDB4ODQsIDB4MkIsIDB4RjAsIDB4MUIsIDB4RkEsIDB4NjQsIDB4NDQsIDB4ODAsIDB4MjcsCisJIDB4NTgsIDB4MDAsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDUsIDB4NjQsIDB4NDYsIDB4MTIsIDB4RjIsIDB4NjUsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsCisJIDB4MzEsIDB4MDAsIDB4MTYsIDB4RjIsIDB4MEYsIDB4RjAsIDB4QUMsIDB4ODQsIDB4MkMsIDB4NDUsIDB4MkMsIDB4MDMsIDB4NEIsIDB4RjEsIDB4QzQsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODEsIDB4NjMsIDB4NDAsIDB4MzcsIDB4MzcsIDB4RTEsIDB4ODEsIDB4NjQsIDB4NDUsIDB4MEYsIDB4RjAsCisJIDB4QjgsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QUUsIDB4ODIsIDB4RkMsIDB4QTIsIDB4MEEsIDB4MDMsIDB4NjMsIDB4NDAsCisJIDB4NkUsIDB4M0IsIDB4MDYsIDB4MDAsIDB4NjAsIDB4NDEsIDB4MDQsIDB4MEQsIDB4ODAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4MEYsIDB4RkEsIDB4NjEsIDB4NDQsCisJIDB4REMsIDB4ODQsIDB4MUQsIDB4RkEsIDB4MUYsIDB4RjAsIDB4MDEsIDB4NjAsIDB4M0UsIDB4NjUsIDB4NjQsIDB4NDAsIDB4ODAsIDB4MjcsIDB4MDIsIDB4MDAsCisJIDB4MDIsIDB4NjAsIDB4NUUsIDB4NjUsIDB4MUIsIDB4RjAsIDB4MjYsIDB4NDEsIDB4RTEsIDB4ODEsIDB4QzUsIDB4ODEsIDB4NDQsIDB4OTQsIDB4QzEsIDB4ODEsCisJIDB4MkIsIDB4RkEsIDB4OTAsIDB4RkEsIDB4MjYsIDB4NDQsIDB4MkMsIDB4RjAsIDB4MEEsIDB4QTQsIDB4NjYsIDB4NDUsIDB4MjQsIDB4NDYsIDB4OTIsIDB4RjIsCisJIDB4NjUsIDB4NDYsIDB4OUYsIDB4RjAsIDB4NjEsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDUsIDB4MDAsIDB4NjAsIDB4QTQsIDB4NjUsIDB4NDAsIDB4ODAsIDB4MkIsCisJIDB4NjAsIDB4QTQsIDB4MDEsIDB4MDAsIDB4MTQsIDB4QTQsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDAsIDB4NjQsIDB4NjAsIDB4NDUsIDB4MkEsIDB4RjIsCisJIDB4MzksIDB4RjAsIDB4OEYsIDB4QjAsIDB4ODgsIDB4M0EsIDB4MDQsIDB4MDAsIDB4NjQsIDB4NDQsIDB4NjAsIDB4QjAsIDB4MjAsIDB4MzYsIDB4MDAsIDB4NjUsCisJIDB4NjUsIDB4NDQsIDB4MTEsIDB4RkEsIDB4REEsIDB4RjMsIDB4MTMsIDB4RkEsIDB4N0MsIDB4NDQsIDB4MUQsIDB4RkEsIDB4MEYsIDB4RjAsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4NkYsIDB4MDAsIDB4N0QsIDB4RjEsIDB4MTksIDB4NjAsIDB4N0IsIDB4RjMsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjcsCisJIDB4MDMsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MTQsIDB4MDAsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4MTIsIDB4RjAsCisJIDB4MTksIDB4NjAsIDB4N0MsIDB4RjMsIDB4NjMsIDB4NDYsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MjAsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MjYsCisJIDB4MDcsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MDgsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDksIDB4MDAsIDB4MDYsIDB4NjEsIDB4NkUsIDB4NjMsIDB4MDgsIDB4MDAsCisJIDB4MDIsIDB4NjEsIDB4MTQsIDB4NjMsIDB4MDUsIDB4MDAsIDB4MDAsIDB4NjEsIDB4MEEsIDB4NjMsIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjEsIDB4MzcsIDB4NjMsCisJIDB4MDAsIDB4NjQsIDB4MkMsIDB4NjAsIDB4OUMsIDB4NjUsIDB4NDUsIDB4RDEsIDB4RDUsIDB4ODEsIDB4MTksIDB4NjAsIDB4NzgsIDB4RjksIDB4MkMsIDB4NjAsCisJIDB4NzQsIDB4NjUsIDB4NDUsIDB4RDEsIDB4MUMsIDB4RkMsIDB4QjAsIDB4ODQsIDB4MUUsIDB4RkEsIDB4M0MsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsCisJIDB4MDQsIDB4MDAsIDB4MDgsIDB4NjEsIDB4MUUsIDB4NjAsIDB4MEIsIDB4NjMsIDB4MjcsIDB4MDAsIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MEEsIDB4NjEsCisJIDB4MTYsIDB4NjAsIDB4MEYsIDB4NjMsIDB4MjEsIDB4MDAsIDB4NDAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MEMsIDB4NjEsIDB4MTIsIDB4NjAsIDB4MEEsIDB4NjMsCisJIDB4MUIsIDB4MDAsIDB4ODAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MEUsIDB4NjEsIDB4MEUsIDB4NjAsIDB4MEUsIDB4NjMsIDB4MTUsIDB4MDAsIDB4MDEsIDB4MkIsCisJIDB4MDQsIDB4MDAsIDB4MTAsIDB4NjEsIDB4MEUsIDB4NjAsIDB4MDksIDB4NjMsIDB4MEYsIDB4MDAsIDB4MDIsIDB4MkIsIDB4MDQsIDB4MDAsIDB4MTIsIDB4NjEsCisJIDB4MEEsIDB4NjAsIDB4MEQsIDB4NjMsIDB4MDksIDB4MDAsIDB4MDQsIDB4MkIsIDB4MDQsIDB4MDAsIDB4MTQsIDB4NjEsIDB4MEEsIDB4NjAsIDB4MDgsIDB4NjMsCisJIDB4MDMsIDB4MDAsIDB4MTYsIDB4NjEsIDB4MEEsIDB4NjAsIDB4MEMsIDB4NjMsIDB4MUUsIDB4RjAsIDB4NDAsIDB4NjcsIDB4MkMsIDB4NjAsIDB4OUMsIDB4NjUsCisJIDB4NDUsIDB4RDEsIDB4RDUsIDB4ODEsIDB4MTksIDB4NjAsIDB4NzgsIDB4RjksIDB4MkMsIDB4NjAsIDB4NzQsIDB4NjUsIDB4NDUsIDB4RDEsIDB4MUMsIDB4RkMsCisJIDB4QjAsIDB4ODQsIDB4MUUsIDB4RkEsIDB4RkYsIDB4RkYsIDB4MEQsIDB4RjIsIDB4M0UsIDB4RjAsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4NjQsIDB4NDEsCisJIDB4MDEsIDB4QjEsIDB4MDEsIDB4NjMsIDB4MTcsIDB4MDIsIDB4NjAsIDB4NDEsIDB4RkYsIDB4MjIsIDB4MDQsIDB4MDAsIDB4QjgsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4MDYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4NjAsIDB4RUQsIDB4RkQsIDB4MTksIDB4NjAsIDB4Q0YsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsCisJIDB4MDEsIDB4NjMsIDB4NjEsIDB4NDAsIDB4RkYsIDB4MjIsIDB4MDQsIDB4MDAsIDB4QjgsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MDYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDcsIDB4NjAsIDB4RUUsIDB4RkQsIDB4MDIsIDB4NjQsIDB4M0IsIDB4REIsIDB4QkYsIDB4NjAsIDB4RTQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsCisJIDB4RkMsIDB4RkIsIDB4MDcsIDB4RjAsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4QTYsIDB4RjMsIDB4MEUsIDB4MDMsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MEIsIDB4MDMsIDB4NDcsIDB4RjEsIDB4MDcsIDB4RjAsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MDEsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDMsIDB4MTIsCisJIDB4QkUsIDB4NjAsIDB4QTAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MEEsIDB4QkYsIDB4NjAsIDB4MDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODcsIDB4RjAsCisJIDB4QTYsIDB4RjMsIDB4MTAsIDB4RjAsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4M0QsIDB4MDMsIDB4NjYsIDB4NDMsIDB4NjUsIDB4NDYsIDB4RkYsIDB4NjcsCisJIDB4MjAsIDB4ODUsIDB4NjQsIDB4NUYsIDB4NDAsIDB4NDQsIDB4MTUsIDB4RjAsIDB4MjUsIDB4NDQsIDB4RDAsIDB4ODQsIDB4MDMsIDB4QTQsIDB4MDMsIDB4MEUsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MDQsIDB4MDAsIDB4RkEsIDB4QTQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODcsIDB4QzAsIDB4QkYsIDB4QzAsIDB4ODQsCisJIDB4MTUsIDB4RkEsIDB4NDAsIDB4NDUsIDB4MTQsIDB4RjAsIDB4MjQsIDB4NDQsIDB4RDAsIDB4ODQsIDB4MUYsIDB4QTQsIDB4MDYsIDB4MEUsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MDcsIDB4MDAsIDB4QzIsIDB4QTQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODcsIDB4RjgsIDB4QkYsIDB4QzAsIDB4ODQsIDB4MTQsIDB4RkEsIDB4NjAsIDB4NUMsIDB4MkYsIDB4NjcsCisJIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDUsIDB4MDIsIDB4MjgsIDB4NjQsIDB4NDUsIDB4MjUsIDB4NUMsIDB4OEIsIDB4NjcsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDEsCisJIDB4MDIsIDB4MjQsIDB4NjQsIDB4NDEsIDB4RDUsIDB4ODQsIDB4ODAsIDB4NjUsIDB4QzQsIDB4ODcsIDB4MDEsIDB4MDUsIDB4MDAsIDB4NjQsIDB4RkYsIDB4QjQsCisJIDB4MEUsIDB4RkEsIDB4NjMsIDB4NDYsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4MTcsIDB4RjIsIDB4NjMsIDB4NDYsIDB4NjAsIDB4NDAsCisJIDB4MDAsIDB4MzYsIDB4MkUsIDB4MDAsIDB4MDEsIDB4MzYsIDB4MUUsIDB4MDAsIDB4MDMsIDB4M0EsIDB4MjUsIDB4MDAsIDB4NjQsIDB4NDYsIDB4MTAsIDB4RjIsCisJIDB4MTEsIDB4RkEsIDB4MTIsIDB4RjIsIDB4MDAsIDB4NjEsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4MTIsIDB4RkEsIDB4OTcsIDB4RkEsIDB4NDYsIDB4NDQsCisJIDB4NjMsIDB4NDYsIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NEMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MDQsIDB4MDAsCisJIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4OTYsIDB4RkMsCisJIDB4NjMsIDB4NDYsIDB4NDMsIDB4MDAsIDB4NjQsIDB4NDYsIDB4MTYsIDB4RjIsIDB4MDAsIDB4NjEsIDB4MjAsIDB4MjgsIDB4RkYsIDB4QTQsIDB4OTcsIDB4RkEsCisJIDB4MTYsIDB4RkEsIDB4NjMsIDB4NDYsIDB4M0EsIDB4MDAsIDB4NjQsIDB4NDYsIDB4MDAsIDB4NjEsIDB4OTcsIDB4RkEsIDB4NjMsIDB4NDYsIDB4MzUsIDB4MDAsCisJIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MTYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MjAsIDB4MjgsIDB4RkYsIDB4QTQsIDB4MTYsIDB4RkEsCisJIDB4OTMsIDB4RjQsIDB4MTIsIDB4RjIsIDB4MjAsIDB4MjgsIDB4RkYsIDB4QTMsIDB4MTMsIDB4RkMsIDB4NjEsIDB4NDYsIDB4NjMsIDB4NDAsIDB4MDAsIDB4M0EsCisJIDB4MjQsIDB4MDAsIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjEsIDB4NDAsIDB4RkYsIDB4MzYsIDB4MUQsIDB4MDAsCisJIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MTIsIDB4RjIsIDB4OTMsIDB4RjQsIDB4NjEsIDB4NDYsIDB4MjAsIDB4MjgsIDB4MTYsIDB4MDAsIDB4NDQsIDB4NDQsCisJIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NEMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NUMsIDB4NjUsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDYsIDB4MDAsCisJIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MDEsIDB4NjQsIDB4MTcsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MDcsIDB4MDAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsCisJIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4QkYsIDB4NjAsIDB4MDAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4MTcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4RkYsIDB4MjcsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MzYsIDB4MUMsIDB4MDAsIDB4MDIsIDB4MzYsIDB4MjQsIDB4MDAsIDB4MDMsIDB4MzYsIDB4NDMsIDB4MDAsCisJIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4QTksIDB4RjEsIDB4MTYsIDB4RjIsIDB4NDMsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzMsIDB4NjAsIDB4ODQsIDB4NjEsCisJIDB4MDksIDB4MDMsIDB4QTEsIDB4RDEsIDB4MzMsIDB4NjAsIDB4ODIsIDB4NjMsIDB4QzAsIDB4ODQsIDB4MTYsIDB4RkEsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4MTMsIDB4RkEsIDB4MzksIDB4MDAsIDB4OTYsIDB4RkMsIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsCisJIDB4NDMsIDB4NDQsIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4QzEsIDB4RjMsIDB4OTYsIDB4RkMsCisJIDB4MTMsIDB4RkEsIDB4MjksIDB4MDAsIDB4NjMsIDB4NDYsIDB4MzMsIDB4NjAsIDB4NTQsIDB4NjMsIDB4QTMsIDB4RDMsIDB4MTUsIDB4RjIsIDB4NjAsIDB4NDUsCisJIDB4RDQsIDB4ODAsIDB4MDcsIDB4RjAsIDB4MEMsIDB4MDMsIDB4NjYsIDB4NDEsIDB4NDQsIDB4NDQsIDB4NjQsIDB4NDYsIDB4MTIsIDB4RjIsIDB4NjEsIDB4NDYsCisJIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NEMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MTksIDB4MDAsIDB4NjYsIDB4NDMsCisJIDB4MjQsIDB4NDYsIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTIsIDB4RjIsIDB4OTEsIDB4RjIsIDB4OTAsIDB4RkEsCisJIDB4NjAsIDB4NUYsIDB4MTIsIDB4RkEsIDB4MDQsIDB4MDAsIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4NjQsCisJIDB4MTcsIDB4RkEsIDB4NjMsIDB4NDYsIDB4MDUsIDB4MDAsIDB4MjQsIDB4NDMsIDB4MDIsIDB4NjQsIDB4MTcsIDB4RkEsIDB4NjMsIDB4NDYsIDB4MDAsIDB4MDAsCisJIDB4MDMsIDB4NjQsIDB4M0IsIDB4REIsIDB4Q0EsIDB4RkUsIDB4NDcsIDB4RjEsIDB4MDEsIDB4NjUsIDB4MzIsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MTEsIDB4MDAsCisJIDB4MkMsIDB4RjIsIDB4NjQsIDB4NDUsIDB4MDIsIDB4MjIsIDB4MEQsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MEEsIDB4MDAsIDB4MkEsIDB4RjIsCisJIDB4MzksIDB4RjAsIDB4OEYsIDB4QjAsIDB4ODgsIDB4M0EsIDB4NzcsIDB4MDAsIDB4NjQsIDB4NDQsIDB4NjAsIDB4QjAsIDB4MjAsIDB4MzYsIDB4MDEsIDB4MDAsCisJIDB4NzIsIDB4MDAsIDB4MTQsIDB4RjIsIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MEMsIDB4MDAsIDB4NjAsIDB4NDUsIDB4MDUsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4NjUsIDB4NDQsIDB4Q0MsIDB4ODUsIDB4MkMsIDB4NjAsIDB4RDAsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RjAsIDB4NzgsIDB4QjUsIDB4RjEsCisJIDB4NTAsIDB4MDAsIDB4NjAsIDB4NDEsIDB4MkEsIDB4RjAsIDB4MDAsIDB4NjAsIDB4MEMsIDB4NjQsIDB4QTAsIDB4ODQsIDB4MDQsIDB4MzYsIDB4MDIsIDB4MDAsCisJIDB4MEMsIDB4M0EsIDB4MDEsIDB4MDAsIDB4NDYsIDB4MDAsIDB4NjEsIDB4NDUsIDB4NjAsIDB4NDMsIDB4MkMsIDB4NjAsIDB4RDAsIDB4NjQsIDB4RjEsIDB4NjAsCisJIDB4NzgsIDB4NDEsIDB4RjAsIDB4NzgsIDB4QjUsIDB4RjEsIDB4NjMsIDB4NDAsIDB4MDgsIDB4MzYsIDB4MDEsIDB4MDAsIDB4M0EsIDB4MDAsIDB4MTQsIDB4RjIsCisJIDB4MUMsIDB4NjUsIDB4NjAsIDB4NDEsIDB4MDAsIDB4NjMsIDB4Q0QsIDB4ODEsIDB4QzcsIDB4ODMsIDB4RkQsIDB4MDIsIDB4M0YsIDB4RjAsIDB4MkMsIDB4RjIsCisJIDB4QzMsIDB4ODMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEQsIDB4MDAsIDB4MkMsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsCisJIDB4RTQsIDB4NzgsIDB4QjUsIDB4RjEsIDB4MkMsIDB4NjAsIDB4RDQsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RUYsIDB4NzgsIDB4NjMsIDB4NDUsCisJIDB4MjAsIDB4MDAsIDB4MkMsIDB4NjAsIDB4Q0MsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RTQsIDB4NzgsIDB4QjUsIDB4RjEsIDB4MkMsIDB4NjAsCisJIDB4RDIsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RUYsIDB4NzgsIDB4NjMsIDB4NDUsIDB4MTUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MEYsIDB4QjQsCisJIDB4MDAsIDB4QTgsIDB4MDEsIDB4QTgsIDB4MEUsIDB4MDMsIDB4MDcsIDB4MDMsIDB4MkMsIDB4NjAsIDB4REEsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsCisJIDB4RTQsIDB4NzgsIDB4QjUsIDB4RjEsIDB4MDYsIDB4MDAsIDB4MkMsIDB4NjAsIDB4RDgsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RTQsIDB4NzgsCisJIDB4QjUsIDB4RjEsIDB4MDQsIDB4NjQsIDB4M0IsIDB4REIsIDB4MjUsIDB4NjAsIDB4RUMsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEEsIDB4RkIsIDB4M0MsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4NUMsIDB4NUMsIDB4RkMsIDB4RkMsIDB4Q0UsIDB4RkUsCisJIDB4QjgsIDB4NjAsIDB4MzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NTAsIDB4QTgsIDB4MDIsIDB4N0MsIDB4MDksIDB4MDMsCisJIDB4MEYsIDB4RjAsIDB4MTUsIDB4RjIsIDB4NjQsIDB4NDEsIDB4MDEsIDB4MkEsIDB4MDIsIDB4MDAsIDB4Q0QsIDB4RjEsIDB4MDIsIDB4MDAsIDB4Q0MsIDB4RjEsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDUsIDB4REMsIDB4ODQsIDB4RDQsIDB4ODAsIDB4MTUsIDB4RkEsIDB4MkQsIDB4MDcsIDB4NjEsIDB4NDAsIDB4MDEsIDB4MkEsCisJIDB4MDgsIDB4MDAsIDB4MTYsIDB4NjAsIDB4ODAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4MDAsIDB4MzYsIDB4MDAsIDB4M0IsIDB4QTIsIDB4REIsCisJIDB4MDcsIDB4MDAsIDB4MTYsIDB4NjAsIDB4ODEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4MDAsIDB4MzYsIDB4MDAsIDB4M0IsIDB4QTIsIDB4REIsCisJIDB4MkEsIDB4RjAsIDB4MDgsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MDAsIDB4NjQsIDB4NDgsIDB4RkIsIDB4MTksIDB4NjAsIDB4QTMsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEMsIDB4MDAsIDB4M0MsIDB4NDYsIDB4M0UsIDB4RjIsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjUsCisJIDB4RjAsIDB4ODQsIDB4QTQsIDB4ODQsIDB4M0QsIDB4RkEsIDB4MkEsIDB4RjIsIDB4QkYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4MkEsIDB4RkEsCisJIDB4QkEsIDB4NjAsIDB4MDIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NDksIDB4RkIsIDB4MkMsIDB4NjAsIDB4REEsIDB4NjQsIDB4RjEsIDB4NjAsCisJIDB4NzgsIDB4NDEsIDB4RTQsIDB4NzgsIDB4QjUsIDB4RjEsIDB4MkMsIDB4NjAsIDB4REMsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RTQsIDB4NzgsCisJIDB4QjUsIDB4RjEsIDB4MjcsIDB4NDQsIDB4RjcsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MjMsIDB4RjAsIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsCisJIDB4OTgsIDB4MDEsIDB4QzAsIDB4NjAsIDB4NUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjEsIDB4NjQsIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsIDB4MDEsIDB4NjMsCisJIDB4QzQsIDB4QjQsIDB4MzEsIDB4RkIsIDB4MzIsIDB4RkQsIDB4QzAsIDB4NjAsIDB4MTQsIDB4NjIsIDB4NDIsIDB4NDAsIDB4QTAsIDB4NEMsIDB4NDAsIDB4QkMsCisJIDB4N0QsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTAsIDB4RkUsIDB4MUEsIDB4RkYsIDB4MjUsIDB4NjAsIDB4RTAsIDB4NjQsIDB4MDgsIDB4RjAsIDB4MDcsIDB4RjAsCisJIDB4RDAsIDB4ODAsIDB4MjUsIDB4NjAsIDB4RTYsIDB4NjIsIDB4MTMsIDB4MDIsIDB4QTIsIDB4RDMsIDB4MDEsIDB4NjMsIDB4QUMsIDB4ODYsIDB4MDcsIDB4RjIsCisJIDB4MEUsIDB4MDMsIDB4RDAsIDB4ODAsIDB4MDksIDB4RjIsIDB4RkEsIDB4MDIsIDB4MjMsIDB4RkMsIDB4MjUsIDB4NjAsIDB4RUMsIDB4NjQsIDB4MTMsIDB4NjAsCisJIDB4MEEsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4M0MsIDB4NDYsCisJIDB4MDYsIDB4NjQsIDB4QTEsIDB4RkYsIDB4NDksIDB4RkIsIDB4ODMsIDB4M0UsIDB4MzEsIDB4RjMsIDB4ODcsIDB4NjAsIDB4ODAsIDB4NjEsIDB4MUQsIDB4RjAsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEYsIDB4MDAsIDB4RkUsIDB4QjQsIDB4MzEsIDB4RkIsIDB4MDAsIDB4NjQsIDB4NDksIDB4RkIsIDB4MDEsIDB4NjQsCisJIDB4NDcsIDB4RkIsIDB4MDAsIDB4NzEsIDB4MDUsIDB4NjQsIDB4NjQsIDB4NUYsIDB4MEQsIDB4RkEsIDB4NDAsIDB4NjQsIDB4M0IsIDB4REIsIDB4QzAsIDB4NjAsCisJIDB4NUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MkEsIDB4MTgsIDB4MDAsIDB4RDEsIDB4OTEsIDB4OEQsIDB4RTIsIDB4NDEsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4MzEsIDB4RjMsIDB4MzMsIDB4NjAsIDB4QTYsIDB4NjMsIDB4RkQsIDB4QjQsIDB4MzEsIDB4RkIsIDB4QTMsIDB4RDMsIDB4MDIsIDB4NjMsIDB4NjAsIDB4NUMsCisJIDB4MEQsIDB4RjIsIDB4NDcsIDB4RkQsIDB4RkYsIDB4QjUsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4RDAsIDB4ODAsIDB4REMsIDB4ODQsIDB4MUYsIDB4MDMsCisJIDB4NjAsIDB4NDcsIDB4QjQsIDB4ODQsIDB4MEQsIDB4RkEsIDB4MUIsIDB4MDAsIDB4MDgsIDB4MkEsIDB4MDcsIDB4MDAsIDB4NDIsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4MzEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RjcsIDB4QjQsIDB4MzEsIDB4RkIsIDB4MTIsIDB4MDAsIDB4MTAsIDB4MkEsIDB4MDksIDB4MDAsIDB4NDMsIDB4NjQsCisJIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RUYsIDB4QjQsIDB4MzEsIDB4RkIsIDB4QkYsIDB4NjAsIDB4RTQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NDQsIDB4NjQsIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REYsIDB4QjQsIDB4MzEsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MkEsIDB4NjQsCisJIDB4M0IsIDB4REIsIDB4QjcsIDB4NjAsIDB4RjcsIDB4NjQsIDB4NDAsIDB4NDAsIDB4QkQsIDB4NjAsIDB4RDcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NjAsCisJIDB4REYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QjUsIDB4MDQsIDB4QjUsIDB4MDQsIDB4MDMsIDB4MDMsIDB4MDMsIDB4QzEsIDB4NjAsIDB4NzAsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MzEsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MTYsIDB4MDAsIDB4QTAsIDB4NEMsIDB4NDksIDB4QkMsIDB4RkYsIDB4QjQsIDB4QTAsIDB4NTEsCisJIDB4MEUsIDB4NjAsIDB4REYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QjUsIDB4MDQsIDB4QkMsIDB4MDksIDB4MDMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsCisJIDB4RUQsIDB4RTIsIDB4RkUsIDB4QjQsIDB4QTIsIDB4REIsIDB4QTAsIDB4NEMsIDB4N0QsIDB4QjQsIDB4QTAsIDB4NTEsIDB4MDMsIDB4MDAsIDB4QTAsIDB4NEMsCisJIDB4NkQsIDB4QjQsIDB4QTAsIDB4NTEsIDB4REIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkQsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjQsIDB4NTksIDB4MDAsCisJIDB4MzEsIDB4NDAsIDB4MDQsIDB4MkEsIDB4MzgsIDB4MDAsIDB4MDEsIDB4NjQsIDB4MTksIDB4NjAsIDB4RjQsIDB4RkIsIDB4NkMsIDB4RjMsIDB4NzMsIDB4RjMsCisJIDB4Q0MsIDB4ODMsIDB4NkMsIDB4RkQsIDB4Q0MsIDB4ODQsIDB4NzMsIDB4RkIsIDB4MUUsIDB4MDIsIDB4MzEsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MTIsIDB4MDAsCisJIDB4NkUsIDB4RjMsIDB4NkYsIDB4RjEsIDB4Q0MsIDB4ODQsIDB4NkUsIDB4RkIsIDB4MEQsIDB4MDIsIDB4NkUsIDB4RjksIDB4MzEsIDB4NDQsIDB4MDgsIDB4QkMsCisJIDB4NDAsIDB4NTEsIDB4NzEsIDB4RjMsIDB4NzAsIDB4RjEsIDB4MDAsIDB4QjgsIDB4NjQsIDB4NDUsIDB4MDEsIDB4MDMsIDB4NjcsIDB4NDUsIDB4NjUsIDB4NTAsCisJIDB4Q0MsIDB4ODQsIDB4NzIsIDB4RkIsIDB4MTYsIDB4NjAsIDB4QUMsIDB4RjMsIDB4NkQsIDB4RjEsIDB4MDAsIDB4QjgsIDB4NzMsIDB4RjksIDB4MDMsIDB4MDMsCisJIDB4ODUsIDB4RjMsIDB4NkMsIDB4RkIsIDB4MDQsIDB4MDAsIDB4NkMsIDB4RjMsIDB4ODUsIDB4RjEsIDB4MEQsIDB4MUIsIDB4NkMsIDB4RjksIDB4MzEsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MDksIDB4MDAsIDB4OUQsIDB4RkUsIDB4MDcsIDB4MDUsIDB4QkEsIDB4RkUsIDB4MDgsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MTYsIDB4RkIsCisJIDB4MkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkUsIDB4MzIsIDB4NDAsIDB4ODAsIDB4MkEsIDB4MTIsIDB4MDAsIDB4MzEsIDB4NDAsIDB4MDQsIDB4MkEsCisJIDB4MEYsIDB4MDAsIDB4MTYsIDB4NjAsIDB4QUMsIDB4RjMsIDB4NkMsIDB4RjEsIDB4MDMsIDB4MUIsIDB4MzEsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDYsIDB4MDAsCisJIDB4NzMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDcsIDB4NjAsIDB4NUMsIDB4MTksIDB4NjAsIDB4RjUsIDB4RjksCisJIDB4MDAsIDB4NjQsIDB4MTksIDB4NjAsIDB4RjQsIDB4RkIsIDB4MEUsIDB4NjAsIDB4MzcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4MkIsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RjEsIDB4MDcsIDB4NjAsIDB4RTksIDB4RjMsIDB4NjQsIDB4NDAsIDB4MDIsIDB4M0EsIDB4M0EsIDB4MDAsIDB4MEEsIDB4NjAsCisJIDB4MTgsIDB4RjEsIDB4MTAsIDB4QjQsIDB4OTAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MzQsIDB4MDMsIDB4MEEsIDB4NjAsIDB4MTgsIDB4RkIsIDB4MDEsIDB4NjMsCisJIDB4NjAsIDB4NDAsIDB4MTAsIDB4MjIsIDB4MDAsIDB4NjMsIDB4MDgsIDB4NjAsIDB4QzEsIDB4RkQsIDB4MDgsIDB4NjAsIDB4QzUsIDB4RkQsIDB4MDgsIDB4NjAsCisJIDB4QzksIDB4RkQsIDB4MDgsIDB4NjAsIDB4Q0QsIDB4RkQsIDB4N0QsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjMsIDB4MjEsIDB4MDAsCisJIDB4MEIsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MEMsIDB4MzYsIDB4MDUsIDB4MDAsIDB4MEQsIDB4MzYsIDB4MDMsIDB4MDAsIDB4MEUsIDB4MzYsIDB4MDEsIDB4MDAsCisJIDB4MTgsIDB4MDAsIDB4REIsIDB4RjMsIDB4MDEsIDB4NjMsIDB4MEUsIDB4NjAsIDB4MzYsIDB4RkQsIDB4NjAsIDB4NDAsIDB4MDMsIDB4M0EsIDB4MDgsIDB4MDAsCisJIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDksIDB4MDAsCisJIDB4MDQsIDB4M0EsIDB4MDcsIDB4MDAsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjQsIDB4M0IsIDB4REIsIDB4N0UsIDB4RjMsIDB4NzMsIDB4NDUsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4QzQsIDB4OTMsIDB4QzksIDB4RkUsIDB4NDksIDB4RjMsIDB4M0MsIDB4NDYsIDB4MjUsIDB4MTgsIDB4Q0MsIDB4ODQsIDB4NDksIDB4RkIsCisJIDB4MjIsIDB4MDIsIDB4QzIsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDAsIDB4NDIsIDB4RkMsIDB4RkMsIDB4MDAsIDB4NjQsIDB4NUMsIDB4NUMsIDB4MzIsIDB4RkIsCisJIDB4ODIsIDB4RkYsIDB4NUMsIDB4NDcsIDB4ODQsIDB4RkYsIDB4NjIsIDB4RkYsIDB4MTYsIDB4NjAsIDB4N0UsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsCisJIDB4MDAsIDB4MzYsIDB4MDAsIDB4M0IsIDB4QTIsIDB4REIsIDB4MjMsIDB4RjAsIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MjUsIDB4NjAsCisJIDB4RUMsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEEsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4Q0UsIDB4RkUsIDB4NjksIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4RkQsIDB4QjQsIDB4QTIsIDB4REIsCisJIDB4NjEsIDB4NDQsIDB4MDEsIDB4QjAsIDB4MDIsIDB4QjAsIDB4MEIsIDB4MDMsIDB4MEEsIDB4MDIsIDB4OUQsIDB4RkUsIDB4MDgsIDB4MDQsIDB4MUMsIDB4NjAsCisJIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjAsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDcsIDB4MDAsCisJIDB4N0UsIDB4RjMsIDB4NzMsIDB4NDUsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4OTMsIDB4MUQsIDB4NjAsCisJIDB4QkEsIDB4NjMsIDB4QTMsIDB4RDMsIDB4QUQsIDB4NDksIDB4MjAsIDB4QjUsIDB4MDgsIDB4QjEsIDB4MjIsIDB4MDMsIDB4RTEsIDB4ODEsIDB4MTAsIDB4QjUsCisJIDB4OTUsIDB4ODEsIDB4NjAsIDB4NDEsIDB4MTgsIDB4MDIsIDB4MUQsIDB4NjAsIDB4QkMsIDB4N0MsIDB4QTQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsCisJIDB4QTQsIDB4REIsIDB4MTYsIDB4MDIsIDB4MDUsIDB4NjQsIDB4QTQsIDB4REIsIDB4NjEsIDB4NDQsIDB4MDcsIDB4QjQsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MDIsCisJIDB4MDgsIDB4QjEsIDB4RTEsIDB4ODEsIDB4OTUsIDB4ODEsIDB4QTMsIDB4RDMsIDB4MEIsIDB4MDMsIDB4MDgsIDB4QUMsIDB4MDEsIDB4QkMsIDB4QTMsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MTMsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MTAsIDB4QUMsIDB4QTMsIDB4REIsIDB4MDUsIDB4N0MsIDB4MEUsIDB4NjAsIDB4REUsIDB4RjksCisJIDB4QjgsIDB4NjAsIDB4MDMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDYsIDB4RjMsIDB4NDUsIDB4RjEsIDB4MDQsIDB4MUIsIDB4NjQsIDB4NDQsIDB4MDIsIDB4MUIsCisJIDB4MDcsIDB4NjAsIDB4RUQsIDB4RjMsIDB4NDUsIDB4RkIsIDB4MDAsIDB4NjMsIDB4NDYsIDB4RkQsIDB4NjAsIDB4NDEsIDB4MjUsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4MjcsIDB4NDQsIDB4RUYsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDAsIDB4QjksIDB4NzEsIDB4NDAsIDB4ODAsIDB4MjcsIDB4MDEsIDB4MTIsIDB4MjcsIDB4MDMsCisJIDB4QzEsIDB4NjAsIDB4QzUsIDB4NjIsIDB4ODQsIDB4RkYsIDB4NDIsIDB4NDIsIDB4ODIsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MTQsIDB4QkMsIDB4RkYsIDB4QjQsCisJIDB4QTAsIDB4NTEsIDB4MkQsIDB4MEEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4NzAsIDB4NDQsIDB4QUMsIDB4ODAsIDB4MjcsIDB4MEEsCisJIDB4NzEsIDB4NDAsIDB4ODAsIDB4MjcsIDB4RjcsIDB4MTIsIDB4NDUsIDB4RjMsIDB4NDgsIDB4MDIsIDB4MTEsIDB4MTgsIDB4MUIsIDB4NjAsIDB4RUUsIDB4RjMsCisJIDB4MUIsIDB4NjAsIDB4RUYsIDB4RjMsIDB4MDcsIDB4MTgsIDB4MDYsIDB4MTgsIDB4QUMsIDB4NEMsIDB4ODAsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MDAsIDB4NjQsCisJIDB4NDUsIDB4RkIsIDB4MDUsIDB4MDAsIDB4NDUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4NDUsIDB4RkIsIDB4RTMsIDB4MDIsIDB4MDYsIDB4MEEsCisJIDB4QTAsIDB4NEMsIDB4RkIsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTQsIDB4NjAsIDB4NTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODQsIDB4RkYsIDB4QzEsIDB4NjAsCisJIDB4QTMsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MTQsIDB4QkMsIDB4RkYsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QjAsIDB4NjAsCisJIDB4OUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0MsIDB4NDQsIDB4QUMsIDB4ODAsIDB4MzIsIDB4RjEsIDB4MjUsIDB4MDMsIDB4NjQsIDB4NDAsIDB4MDcsIDB4MjIsCisJIDB4MjIsIDB4MDAsIDB4QTQsIDB4NjAsIDB4MzYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MUMsIDB4QkMsIDB4REYsIDB4QjQsIDB4QTAsIDB4NTEsCisJIDB4MzEsIDB4NDAsIDB4MDgsIDB4MkEsIDB4RUYsIDB4MDEsIDB4NzIsIDB4RjMsIDB4NzAsIDB4RjEsIDB4MDAsIDB4QTAsIDB4REMsIDB4ODAsIDB4MDUsIDB4MDMsCisJIDB4MDgsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4NzIsIDB4RkIsIDB4NjcsIDB4NTAsIDB4MDgsIDB4MDAsIDB4Q0MsIDB4ODQsIDB4NzIsIDB4RkIsIDB4NjQsIDB4NTAsCisJIDB4MDQsIDB4MDAsIDB4MzEsIDB4NDQsIDB4RjcsIDB4QjQsIDB4NDAsIDB4NTEsIDB4MDYsIDB4MDAsIDB4MjgsIDB4NjQsIDB4M0EsIDB4REIsIDB4QTAsIDB4NEMsCisJIDB4MzAsIDB4QkMsIDB4RjMsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4MjgsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4MDcsIDB4NjAsIDB4RUUsIDB4RjMsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MjcsIDB4MTYsIDB4MDAsIDB4NDYsIDB4RkIsIDB4MTQsIDB4MTgsIDB4QzIsIDB4NjAsCisJIDB4MzMsIDB4NjQsIDB4ODQsIDB4RkYsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MTUsIDB4QkMsIDB4RjcsIDB4QjQsIDB4QTAsIDB4NTEsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4NzAsIDB4NDQsIDB4QUMsIDB4ODAsIDB4NDYsIDB4RjMsIDB4QjgsIDB4MEEsIDB4REQsIDB4MDIsCisJIDB4Q0MsIDB4ODQsIDB4NDYsIDB4RkIsIDB4RjUsIDB4MDIsIDB4ODQsIDB4RkYsIDB4QzIsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsCisJIDB4MjcsIDB4NDQsIDB4MDgsIDB4QkMsIDB4NDAsIDB4NDcsIDB4RjksIDB4RTEsIDB4MDQsIDB4MDAsIDB4NzgsIDB4RTEsIDB4MzEsIDB4NDAsIDB4MDEsIDB4MjYsCisJIDB4RjksIDB4RTEsIDB4QTQsIDB4NjAsIDB4MkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4QUIsIDB4RjEsIDB4NjAsIDB4NDUsIDB4MzMsIDB4NjAsCisJIDB4NkEsIDB4NjEsIDB4QzUsIDB4ODMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4NjYsIDB4NDUsIDB4MjQsIDB4NDYsIDB4MEUsIDB4RjIsCisJIDB4NjUsIDB4NDYsIDB4NjQsIDB4NDUsIDB4RDUsIDB4ODEsIDB4NjEsIDB4NDUsIDB4MDAsIDB4N0YsIDB4RDQsIDB4ODAsIDB4NjQsIDB4NDMsIDB4MDgsIDB4MDQsCisJIDB4RTMsIDB4ODMsIDB4NjMsIDB4NDUsIDB4QzUsIDB4ODEsIDB4NjEsIDB4NDUsIDB4RDQsIDB4ODAsIDB4MDIsIDB4NjUsIDB4MDMsIDB4MDcsIDB4MDMsIDB4MDAsCisJIDB4MDAsIDB4NjUsIDB4MDEsIDB4MDAsIDB4MDEsIDB4NjUsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4OEYsIDB4RjAsCisJIDB4MTIsIDB4RjIsIDB4OTEsIDB4RjIsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MzYsIDB4MDUsIDB4MDAsIDB4MTIsIDB4MzYsIDB4MDgsIDB4MDAsIDB4MEMsIDB4MzYsCisJIDB4MEIsIDB4MDAsIDB4MEYsIDB4MDAsIDB4NDAsIDB4NjEsIDB4QTUsIDB4ODAsIDB4MEEsIDB4NjQsIDB4MTMsIDB4MDIsIDB4RjMsIDB4MDEsIDB4MTAsIDB4NjEsCisJIDB4QTUsIDB4ODAsIDB4MEUsIDB4NjQsIDB4MEUsIDB4MDIsIDB4RUUsIDB4MDEsIDB4MDgsIDB4NjEsIDB4QTUsIDB4ODAsIDB4MTAsIDB4NjQsIDB4MDksIDB4MDIsCisJIDB4RTksIDB4MDEsIDB4RTEsIDB4ODEsIDB4QTUsIDB4ODAsIDB4MDMsIDB4MDUsIDB4QzgsIDB4ODQsIDB4MDMsIDB4MDIsIDB4RTMsIDB4MDEsIDB4RkYsIDB4NjEsCisJIDB4MDIsIDB4MDAsIDB4MTIsIDB4RkEsIDB4OTEsIDB4RkEsIDB4NjMsIDB4NDYsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4OEYsIDB4RjAsIDB4MTIsIDB4RjIsCisJIDB4OTEsIDB4RjIsIDB4NjAsIDB4NDAsIDB4MEEsIDB4MzYsIDB4MDUsIDB4MDAsIDB4MEUsIDB4MzYsIDB4MDgsIDB4MDAsIDB4MTAsIDB4MzYsIDB4MEIsIDB4MDAsCisJIDB4MEYsIDB4MDAsIDB4MDgsIDB4NjEsIDB4QTUsIDB4ODAsIDB4MTAsIDB4N0UsIDB4MTEsIDB4MDIsIDB4RjMsIDB4MDEsIDB4MDQsIDB4NjEsIDB4QTUsIDB4ODAsCisJIDB4MTIsIDB4N0UsIDB4MEMsIDB4MDIsIDB4RUUsIDB4MDEsIDB4MjAsIDB4NjEsIDB4QTUsIDB4ODAsIDB4MEMsIDB4N0UsIDB4MDcsIDB4MDIsIDB4RTksIDB4MDEsCisJIDB4RTksIDB4ODEsIDB4QTUsIDB4ODAsIDB4MDUsIDB4MDUsIDB4RDgsIDB4ODQsIDB4MDEsIDB4MDIsIDB4RTMsIDB4MDEsIDB4MTIsIDB4RkEsIDB4OTEsIDB4RkEsCisJIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NDAsIDB4MDgsIDB4M0EsIDB4MDYsIDB4MDAsIDB4MDQsIDB4NjAsIDB4NDAsIDB4NjIsIDB4M0QsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4M0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4NTAsIDB4MDAsCisJIDB4MjgsIDB4NDAsIDB4MDgsIDB4M0EsIDB4NEQsIDB4MDAsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MTksIDB4NjAsCisJIDB4NTIsIDB4RkIsIDB4N0QsIDB4RjEsIDB4MkIsIDB4NjAsIDB4ODIsIDB4NjMsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjcsIDB4M0MsIDB4QTMsIDB4MjksIDB4NDAsCisJIDB4NDAsIDB4MkIsIDB4MUUsIDB4QTMsIDB4QkQsIDB4RDEsIDB4NjMsIDB4NDUsIDB4NDQsIDB4NEUsIDB4MEUsIDB4NjEsIDB4QkQsIDB4RDEsIDB4Q0QsIDB4ODEsCisJIDB4RDAsIDB4ODAsIDB4MDEsIDB4MDMsIDB4RkIsIDB4MDQsIDB4Q0IsIDB4ODMsIDB4MTksIDB4NjAsIDB4NTUsIDB4RjMsIDB4MzksIDB4RjEsIDB4RDcsIDB4ODMsCisJIDB4RUIsIDB4ODMsIDB4MkUsIDB4NDEsIDB4NUQsIDB4OTMsIDB4REYsIDB4ODMsIDB4MTksIDB4NjAsIDB4NTEsIDB4RkQsIDB4MTksIDB4NjAsIDB4NTAsIDB4RkIsCisJIDB4NTMsIDB4OTMsIDB4REYsIDB4ODAsIDB4MTAsIDB4MDMsIDB4MzgsIDB4RjMsIDB4Q0YsIDB4ODMsIDB4MDgsIDB4MDMsIDB4REYsIDB4ODMsIDB4MEIsIDB4MDIsCisJIDB4REYsIDB4ODMsIDB4REMsIDB4ODQsIDB4RjAsIDB4QTAsIDB4MzgsIDB4RkIsIDB4MDYsIDB4MDMsIDB4MDMsIDB4MDAsIDB4Q0MsIDB4ODQsIDB4MzgsIDB4RkIsCisJIDB4MDIsIDB4MDMsIDB4MDAsIDB4NjMsIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjQsIDB4MzgsIDB4RkIsIDB4RTMsIDB4ODAsIDB4RkIsIDB4ODMsIDB4QzMsIDB4ODMsCisJIDB4NjMsIDB4NDQsIDB4RkMsIDB4QTAsIDB4MDIsIDB4MEUsIDB4MDgsIDB4MDcsIDB4MDgsIDB4MDAsIDB4MDQsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MDUsIDB4MEQsCisJIDB4RkMsIDB4NjQsIDB4RkYsIDB4N0YsIDB4NjAsIDB4NDMsIDB4MDEsIDB4MDAsIDB4MDQsIDB4NjMsIDB4MzksIDB4RkQsIDB4MTksIDB4NjAsIDB4NTQsIDB4RkQsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4NzQsIDB4RjMsIDB4NDAsIDB4NEUsIDB4NjAsIDB4NDYsIDB4MkYsIDB4REIsIDB4NDQsIDB4NDQsCisJIDB4QTEsIDB4RDMsIDB4RDksIDB4ODEsIDB4NDgsIDB4OTQsIDB4MjQsIDB4NUMsIDB4RDAsIDB4OUMsIDB4NjYsIDB4NDIsIDB4MDQsIDB4MDYsIDB4RDIsIDB4OUMsCisJIDB4MkYsIDB4RDksIDB4NjQsIDB4NDYsIDB4MjQsIDB4NDQsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4QTMsIDB4REIsIDB4RkYsIDB4QjQsIDB4NjAsIDB4NUMsCisJIDB4NjYsIDB4NDQsIDB4MjIsIDB4QTQsIDB4RDAsIDB4ODQsIDB4RTAsIDB4QTAsIDB4MDIsIDB4MEQsIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDQsCisJIDB4MUYsIDB4NjQsIDB4QTIsIDB4RDMsIDB4NjAsIDB4NUMsIDB4NjQsIDB4NUUsIDB4NjAsIDB4NDcsIDB4MkYsIDB4RDEsIDB4MjgsIDB4QTMsIDB4QTMsIDB4RDksCisJIDB4RDgsIDB4QTMsIDB4MkUsIDB4NDIsIDB4NEUsIDB4OEUsIDB4QkQsIDB4REIsIDB4REIsIDB4MDIsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDMsIDB4RkYsCisJIDB4MzksIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODQsIDB4M0UsIDB4RkIsIDB4MDEsIDB4M0QsIDB4NDQsIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsCisJIDB4MDMsIDB4MDIsIDB4NDAsIDB4RkYsIDB4NDQsIDB4RkYsIDB4RjQsIDB4MDEsIDB4QTAsIDB4NEMsIDB4M0QsIDB4NDYsIDB4MkEsIDB4RjIsIDB4NDYsIDB4NEQsCisJIDB4OTIsIDB4RkMsIDB4MTAsIDB4MjUsIDB4MTIsIDB4MDAsIDB4MDksIDB4RTEsIDB4QTEsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MEYsIDB4RjIsIDB4MDEsIDB4MjksCisJIDB4MDYsIDB4MDAsIDB4MkEsIDB4RjAsIDB4NDAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDgsIDB4QkMsIDB4MDIsIDB4QkMsIDB4MEYsIDB4RkEsCisJIDB4MDgsIDB4MjUsIDB4REQsIDB4MDEsIDB4Q0IsIDB4RkUsIDB4NUMsIDB4NUQsIDB4REIsIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzEsIDB4RjIsIDB4MUQsIDB4NjAsCisJIDB4QzAsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsCisJIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MzEsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsCisJIDB4NjEsIDB4NDYsIDB4MzAsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MkYsIDB4RjAsCisJIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsCisJIDB4QTYsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MDcsIDB4RkMsIDB4M0YsIDB4RjIsIDB4MDksIDB4NjAsIDB4QjAsIDB4NjUsCisJIDB4RDQsIDB4ODAsIDB4MkEsIDB4RjIsIDB4QzAsIDB4MDUsIDB4MDgsIDB4MjUsIDB4QUEsIDB4MDEsIDB4NUMsIDB4NEIsIDB4MEMsIDB4NjAsIDB4RUEsIDB4NjEsCisJIDB4QTEsIDB4REYsIDB4MkQsIDB4NDYsIDB4M0IsIDB4RjIsIDB4QTYsIDB4RjEsIDB4ODcsIDB4RjQsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkIsIDB4QzEsIDB4MDAsCisJIDB4RDMsIDB4ODAsIDB4MkMsIDB4RjAsIDB4QjAsIDB4MDMsIDB4MDcsIDB4RjQsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4QTYsIDB4RjUsIDB4QkEsIDB4RjQsCisJIDB4MkQsIDB4NDYsIDB4MDQsIDB4NjQsIDB4MDQsIDB4QjMsIDB4MjIsIDB4RjAsIDB4MDMsIDB4MDMsIDB4QzUsIDB4NjAsIDB4RTIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTAsIDB4NjQsIDB4QjAsIDB4OUMsIDB4M0IsIDB4RjIsIDB4MjIsIDB4RjgsIDB4NjAsIDB4NDcsIDB4QzAsIDB4QjcsIDB4MDIsIDB4RkUsIDB4RjAsIDB4ODQsCisJIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4MDAsIDB4QTgsIDB4NDAsIDB4NEEsIDB4MTcsIDB4MDMsIDB4RTAsIDB4ODEsIDB4NjEsIDB4NDMsIDB4NDIsIDB4RkUsCisJIDB4MDAsIDB4NjQsIDB4RjAsIDB4ODQsIDB4RkUsIDB4MUYsIDB4NDAsIDB4NEEsIDB4RTEsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MkQsIDB4NDYsIDB4MDcsIDB4RjQsCisJIDB4RTAsIDB4ODEsIDB4M0IsIDB4RjAsIDB4MkEsIDB4NDcsIDB4MEMsIDB4NjAsIDB4MzgsIDB4NjMsIDB4QTAsIDB4ODQsIDB4NDcsIDB4OUMsIDB4MTAsIDB4MDMsCisJIDB4N0MsIDB4NDQsIDB4MDAsIDB4NjAsIDB4QjIsIDB4NjMsIDB4MUMsIDB4MDAsIDB4MDcsIDB4RjQsIDB4M0IsIDB4RjAsIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDAsCisJIDB4ODAsIDB4MkIsIDB4MDYsIDB4MDAsIDB4MDAsIDB4NjAsIDB4NzgsIDB4N0MsIDB4MDAsIDB4NjAsIDB4QTIsIDB4NjMsIDB4NDMsIDB4NEMsIDB4MTAsIDB4MDAsCisJIDB4MkQsIDB4NDYsIDB4QzUsIDB4NjAsIDB4RDUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MjIsIDB4RjIsIDB4MTAsIDB4NjAsIDB4MDAsIDB4N0MsCisJIDB4QjAsIDB4ODQsIDB4MjIsIDB4RkEsIDB4MzIsIDB4NDAsIDB4MDQsIDB4MjYsIDB4MjUsIDB4MDAsIDB4QzUsIDB4NjAsIDB4RDUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4RUQsIDB4RkIsIDB4RUUsIDB4RjksIDB4RUYsIDB4RkQsIDB4QUQsIDB4NDYsIDB4M0QsIDB4RjIsIDB4QUQsIDB4NDYsIDB4QTMsIDB4RDAsIDB4QUQsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4M0MsIDB4RjIsIDB4QUQsIDB4NDYsIDB4MDIsIDB4MDMsIDB4MTUsIDB4MDcsIDB4RTYsIDB4MDQsIDB4NUIsIDB4RDAsIDB4QUQsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4M0EsIDB4RjIsIDB4MDMsIDB4MDMsIDB4QUQsIDB4NDYsIDB4MEQsIDB4MDcsIDB4REUsIDB4MDQsIDB4M0EsIDB4RjAsIDB4QUQsIDB4NDYsCisJIDB4NUIsIDB4RDAsIDB4NjQsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MkIsIDB4NDQsIDB4MDUsIDB4MDcsIDB4RDYsIDB4MDMsIDB4RDAsIDB4ODQsIDB4MTAsIDB4QTQsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDcsIDB4RUUsIDB4RjMsIDB4RUQsIDB4RjUsIDB4RkUsIDB4QTQsIDB4MEYsIDB4NjAsIDB4QkUsIDB4NjEsIDB4MEUsIDB4NjMsCisJIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MkQsIDB4NDYsIDB4OEIsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MjIsIDB4RjIsIDB4MjAsIDB4NjAsCisJIDB4MDAsIDB4N0MsIDB4QjAsIDB4ODQsIDB4MjIsIDB4RkEsIDB4MEYsIDB4NjAsIDB4QjAsIDB4NjQsIDB4QzksIDB4NjAsIDB4NTgsIDB4NEYsIDB4NTYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjIsIDB4MDAsIDB4NjAsIDB4MTgsIDB4NzAsIDB4MTgsIDB4NzEsIDB4MjAsIDB4NzIsIDB4NjAsIDB4NTMsIDB4ODgsIDB4NzUsCisJIDB4MDAsIDB4RjIsIDB4MDksIDB4RTEsIDB4NjAsIDB4NTAsIDB4MTIsIDB4NzEsIDB4NkUsIDB4NzIsIDB4ODMsIDB4NzUsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4MjUsIDB4MUQsIDB4MDAsIDB4NDAsIDB4RkYsIDB4MDIsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NzUsIDB4NDAsIDB4MDMsIDB4MkEsCisJIDB4MDMsIDB4MDAsIDB4ODAsIDB4NzUsIDB4MEEsIDB4NjQsIDB4MEIsIDB4MDAsIDB4ODAsIDB4NzUsIDB4MUIsIDB4RjMsIDB4OEIsIDB4RkYsIDB4MDIsIDB4NjAsCisJIDB4MDAsIDB4NzUsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsIDB4REMsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4OTgsIDB4RkYsCisJIDB4MkQsIDB4NDYsIDB4MEYsIDB4RjAsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4ODgsIDB4RkYsIDB4MEIsIDB4MDEsIDB4OEIsIDB4RkYsCisJIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4QzUsIDB4NjAsIDB4QkIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjIsIDB4RjAsIDB4MjIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4MjIsIDB4RkEsIDB4M0EsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsCisJIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RTIsIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4N0MsIDB4NUYsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODUsIDB4MEQsIDB4NjAsIDB4MDAsIDB4NjQsIDB4NDQsIDB4RDMsCisJIDB4NUEsIDB4RDEsIDB4MDMsIDB4MUIsIDB4QzUsIDB4NjAsIDB4RDUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDQsIDB4RTMsIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RTQsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUIsCisJIDB4NjQsIDB4NDcsIDB4RTYsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjUsIDB4NDAsCisJIDB4MEQsIDB4M0EsIDB4MUMsIDB4MDAsIDB4NjQsIDB4NDcsIDB4RTgsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RTksIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RUEsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUIsCisJIDB4NjQsIDB4NDcsIDB4RUMsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsCisJIDB4RUUsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RUYsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjUsIDB4NDQsIDB4RDgsIDB4ODQsCisJIDB4MDgsIDB4MjUsIDB4MjUsIDB4MDAsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUIsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUIsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUIsCisJIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUIsIDB4MjIsIDB4RjIsIDB4MjAsIDB4NjAsIDB4MDAsIDB4N0MsIDB4QjAsIDB4ODQsIDB4MjIsIDB4RkEsIDB4M0YsIDB4RjIsCisJIDB4M0IsIDB4RjAsIDB4NjAsIDB4NDMsIDB4RkMsIDB4QTQsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MDQsIDB4MDAsIDB4MDgsIDB4QTQsIDB4M0YsIDB4RkEsCisJIDB4MDgsIDB4QTMsIDB4RjgsIDB4QTMsIDB4M0YsIDB4RkEsIDB4MEEsIDB4RTEsIDB4QjMsIDB4RkYsIDB4OUEsIDB4RkYsIDB4Q0IsIDB4ODMsIDB4MDAsIDB4RjQsCisJIDB4MTAsIDB4NjIsIDB4NkMsIDB4NjEsIDB4MEUsIDB4QTMsIDB4QUIsIDB4ODQsIDB4RjIsIDB4QTMsIDB4QTEsIDB4RkYsIDB4MDksIDB4MDAsIDB4REEsIDB4MDAsCisJIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4RkMsIDB4MTgsIDB4MDIsIDB4NjIsIDB4QzksIDB4ODEsIDB4QUIsIDB4ODQsIDB4MDEsIDB4MDAsIDB4QTIsIDB4REMsCisJIDB4N0EsIDB4RDQsIDB4RkQsIDB4MUMsIDB4QTIsIDB4REMsIDB4MDgsIDB4MjUsIDB4Q0UsIDB4MDAsIDB4RjIsIDB4MUQsIDB4NDEsIDB4NDQsIDB4N0MsIDB4QTgsCisJIDB4RDksIDB4ODEsIDB4RUUsIDB4MDMsIDB4RkYsIDB4QjEsIDB4OTgsIDB4RkYsIDB4MDksIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsCisJIDB4MjAsIDB4MjcsIDB4MDQsIDB4MDAsIDB4MDgsIDB4MjUsIDB4QkYsIDB4MDAsIDB4N0IsIDB4MUUsIDB4NkYsIDB4MDAsIDB4MDgsIDB4MjUsIDB4QkIsIDB4MDAsCisJIDB4NDAsIDB4RkYsIDB4NDIsIDB4NDIsIDB4NDYsIDB4NDMsIDB4MDYsIDB4MUUsIDB4MDQsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsIDB4NDIsIDB4NDIsCisJIDB4NDYsIDB4NDMsIDB4MDEsIDB4QTIsIDB4NjMsIDB4NDUsIDB4MDEsIDB4QTIsIDB4NjIsIDB4NDMsIDB4NDYsIDB4NEMsIDB4QzYsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4ODcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4RTEsIDB4OUEsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MTIsIDB4RjIsIDB4M0IsIDB4RjAsIDB4MzMsIDB4MUIsCisJIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MzgsIDB4MDAsIDB4MkQsIDB4NUMsIDB4MjQsIDB4NDEsIDB4MDIsIDB4QTEsIDB4NjUsIDB4NDMsIDB4MDgsIDB4QTMsCisJIDB4MjMsIDB4NDYsIDB4MjIsIDB4NDIsIDB4N0UsIDB4M0EsIDB4MEEsIDB4MDAsIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4QjgsIDB4MTgsIDB4MDIsIDB4NjIsCisJIDB4QzksIDB4ODEsIDB4QUIsIDB4ODQsIDB4MDMsIDB4MDAsIDB4QTIsIDB4REMsIDB4N0UsIDB4MzYsIDB4RjYsIDB4MDEsIDB4MTUsIDB4MTEsIDB4N0EsIDB4RDQsCisJIDB4RkYsIDB4RkYsIDB4RjksIDB4MUMsIDB4QTIsIDB4REMsIDB4RjAsIDB4MUQsIDB4RDksIDB4ODEsIDB4RkYsIDB4QjEsIDB4NDEsIDB4MUUsIDB4NjIsIDB4NDAsCisJIDB4N0UsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsIDB4MDcsIDB4MTEsIDB4NUEsIDB4RDIsIDB4ODksIDB4RkYsIDB4ODAsIDB4NEYsCisJIDB4NkYsIDB4NDQsIDB4QTIsIDB4REEsIDB4ODgsIDB4RkYsIDB4MzQsIDB4MDAsIDB4NjIsIDB4NDUsIDB4MzMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MUIsCisJIDB4NjUsIDB4NDIsIDB4RTUsIDB4MUQsIDB4RjIsIDB4MDEsIDB4OTgsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MDEsIDB4NjQsIDB4MTIsIDB4RkEsIDB4MEYsIDB4RjAsCisJIDB4MEEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4NDEsIDB4MDAsIDB4MjQsIDB4NDEsIDB4MDIsIDB4QTEsIDB4NjUsIDB4NDMsIDB4MDgsIDB4QTMsIDB4MjMsIDB4NDYsCisJIDB4MjIsIDB4NDIsIDB4N0UsIDB4M0EsIDB4MEEsIDB4MDAsIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4NUMsIDB4MTgsIDB4MDIsIDB4NjIsIDB4QzksIDB4ODEsCisJIDB4QUIsIDB4ODQsIDB4MDMsIDB4MDAsIDB4QTIsIDB4REMsIDB4N0UsIDB4MzYsIDB4RjYsIDB4MDEsIDB4N0EsIDB4RDQsIDB4RkYsIDB4RkYsIDB4RkEsIDB4MUMsCisJIDB4QTIsIDB4REMsIDB4RjEsIDB4MUQsIDB4RDksIDB4ODEsIDB4RkYsIDB4QjEsIDB4MEIsIDB4MUUsIDB4NjIsIDB4NDAsIDB4N0UsIDB4M0EsIDB4MDIsIDB4MDAsCisJIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsIDB4NUEsIDB4RDIsIDB4ODksIDB4RkYsIDB4ODAsIDB4NEYsIDB4NkYsIDB4NDQsIDB4QTIsIDB4REEsIDB4ODgsIDB4RkYsCisJIDB4OTgsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MEYsIDB4RjAsIDB4MEEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4MTYsIDB4MTQsIDB4RjcsIDB4QjQsIDB4QTIsIDB4REEsCisJIDB4MDYsIDB4NjAsIDB4NzUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEIsIDB4MDAsIDB4RjAsIDB4RjUsIDB4RUYsIDB4RjQsCisJIDB4MEMsIDB4NjAsIDB4RUEsIDB4NjEsIDB4NTksIDB4RDEsIDB4M0IsIDB4RjgsIDB4MDUsIDB4NjQsIDB4NTksIDB4RDEsIDB4Q0MsIDB4ODQsIDB4QkQsIDB4RDgsCisJIDB4RkMsIDB4MDIsIDB4QzMsIDB4NjAsIDB4NkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4REEsIDB4MkQsIDB4NDYsIDB4M0IsIDB4RjAsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MUMsIDB4MDAsIDB4MDcsIDB4RjQsIDB4QkIsIDB4RjAsIDB4MkEsIDB4NDQsIDB4QTQsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4MkYsIDB4MjYsIDB4MTUsIDB4MDAsIDB4MkQsIDB4NDYsIDB4NjQsIDB4NDQsIDB4M0EsIDB4RjAsIDB4QkMsIDB4RjAsIDB4NjQsIDB4NUYsIDB4M0QsIDB4RjAsCisJIDB4MDcsIDB4RjQsIDB4RUYsIDB4RjQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4QTMsIDB4NUIsIDB4RDgsIDB4NjUsIDB4NUMsIDB4NUIsIDB4RDgsIDB4NUIsIDB4REEsCisJIDB4MkQsIDB4NDYsIDB4RUQsIDB4RjMsIDB4M0MsIDB4RkEsIDB4RUUsIDB4RjMsIDB4M0QsIDB4RkEsIDB4MkEsIDB4NDQsIDB4MjMsIDB4RkEsIDB4QzMsIDB4NjAsCisJIDB4NkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OTgsIDB4RkYsIDB4NDMsIDB4RkYsIDB4NDAsIDB4RkYsIDB4QjAsIDB4RkYsIDB4QjEsIDB4RkYsCisJIDB4MkQsIDB4NDYsIDB4MEMsIDB4NjAsIDB4RUEsIDB4NjEsIDB4QTEsIDB4RDMsIDB4MkQsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEEsIDB4MDAsCisJIDB4RjAsIDB4RjUsIDB4RUYsIDB4RjQsIDB4NTksIDB4RDEsIDB4M0IsIDB4RjgsIDB4MDUsIDB4NjQsIDB4NTksIDB4RDEsIDB4Q0MsIDB4ODQsIDB4QkQsIDB4RDgsCisJIDB4RkMsIDB4MDIsIDB4MkQsIDB4NDYsIDB4QzMsIDB4NjAsIDB4NDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OTgsIDB4RkYsIDB4MDksIDB4RTEsIDB4QTEsIDB4RkYsCisJIDB4MkQsIDB4NDYsIDB4MDgsIDB4MjUsIDB4RTAsIDB4MDEsIDB4MEYsIDB4RjIsIDB4NDAsIDB4RkYsIDB4MDIsIDB4QkMsIDB4QTIsIDB4REEsIDB4QzMsIDB4NjAsCisJIDB4NkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsIDB4MjIsIDB4RkEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUIsIDB4QjAsIDB4NjAsIDB4MDAsIDB4RUIsCisJIDB4MDAsIDB4NjMsIDB4M0IsIDB4RjIsIDB4MDYsIDB4NjAsIDB4NzUsIDB4RkQsIDB4NjAsIDB4NDcsIDB4QzAsIDB4QjcsIDB4MDIsIDB4RkUsIDB4RjAsIDB4ODQsCisJIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4MDAsIDB4QTgsIDB4NDAsIDB4NEEsIDB4MTYsIDB4MDMsIDB4RTAsIDB4ODEsIDB4NjEsIDB4NDMsIDB4NDIsIDB4RkUsCisJIDB4MDAsIDB4NjQsIDB4RjAsIDB4ODQsIDB4RkUsIDB4MUYsIDB4NDAsIDB4NEEsIDB4RTEsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MkQsIDB4NDYsIDB4MDcsIDB4RjQsCisJIDB4RTAsIDB4ODEsIDB4M0IsIDB4RjAsIDB4MkEsIDB4NDcsIDB4MEMsIDB4NjAsIDB4MzgsIDB4NjMsIDB4QTAsIDB4ODQsIDB4NDcsIDB4OUMsIDB4MTAsIDB4MDMsCisJIDB4N0MsIDB4NDQsIDB4QTgsIDB4NjMsIDB4MEYsIDB4MDAsIDB4MDcsIDB4RjQsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEEsIDB4M0IsIDB4RjAsIDB4NjYsIDB4NDQsCisJIDB4NjQsIDB4NDAsIDB4ODAsIDB4MkIsIDB4MDUsIDB4MDAsIDB4MDAsIDB4NjAsIDB4NzgsIDB4N0MsIDB4MDAsIDB4NjAsIDB4OTgsIDB4NjMsIDB4MDIsIDB4MDAsCisJIDB4MkQsIDB4NDYsIDB4QkIsIDB4MDEsIDB4MkQsIDB4NDYsIDB4RUQsIDB4RkIsIDB4RUUsIDB4RjksIDB4RUYsIDB4RkQsIDB4MDcsIDB4RjIsIDB4RjAsIDB4RkIsCisJIDB4NjAsIDB4NDYsIDB4M0IsIDB4RjAsIDB4MkEsIDB4NDQsIDB4MDYsIDB4NjAsIDB4NzYsIDB4RjksIDB4NUMsIDB4NEIsIDB4QTAsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4M0YsIDB4MjIsIDB4MDUsIDB4MDAsIDB4OTAsIDB4ODQsIDB4M0IsIDB4RkEsIDB4MDEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MkMsIDB4MDAsIDB4QUQsIDB4NDYsCisJIDB4MEEsIDB4QTMsIDB4M0QsIDB4RjIsIDB4QUQsIDB4NDYsIDB4QTMsIDB4RDAsIDB4QUQsIDB4NDYsIDB4RDAsIDB4ODAsIDB4M0MsIDB4RjIsIDB4QUQsIDB4NDYsCisJIDB4MDIsIDB4MDMsIDB4MjEsIDB4MDcsIDB4MTQsIDB4MDQsIDB4NUIsIDB4RDAsIDB4QUQsIDB4NDYsIDB4RDAsIDB4ODAsIDB4M0IsIDB4RjIsIDB4MDMsIDB4MDMsCisJIDB4QUQsIDB4NDYsIDB4MTksIDB4MDcsIDB4MEMsIDB4MDQsIDB4M0EsIDB4RjAsIDB4QUQsIDB4NDYsIDB4NUIsIDB4RDAsIDB4NjQsIDB4NUYsIDB4RDAsIDB4ODAsCisJIDB4MkIsIDB4NDQsIDB4MjIsIDB4MDcsIDB4MDQsIDB4MDMsIDB4RDAsIDB4ODQsIDB4MTAsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MUQsIDB4MDcsIDB4MkQsIDB4NDYsCisJIDB4MjIsIDB4RjIsIDB4MTAsIDB4NjAsIDB4MDAsIDB4N0MsIDB4QjAsIDB4ODQsIDB4MjIsIDB4RkEsIDB4MzIsIDB4NDAsIDB4MDQsIDB4MjYsIDB4MTQsIDB4MDAsCisJIDB4QzUsIDB4NjAsIDB4RDUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjQsIDB4MDYsIDB4NjAsIDB4NzUsIDB4RkIsIDB4MkQsIDB4NDYsIDB4MEMsIDB4NjAsCisJIDB4RkEsIDB4NjIsIDB4ODAsIDB4RkYsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4QTIsIDB4REIsIDB4QzYsIDB4NjAsIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4ODUsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MDgsIDB4MjUsIDB4NEYsIDB4MDEsIDB4MkQsIDB4NDYsIDB4MEMsIDB4NjAsIDB4RkEsIDB4NjIsIDB4ODAsIDB4RkYsCisJIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4QTIsIDB4REIsIDB4QzcsIDB4NjAsIDB4NDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODUsIDB4RkYsIDB4MkQsIDB4NDYsCisJIDB4MDgsIDB4MjUsIDB4NDEsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MEYsIDB4NjQsIDB4MDgsIDB4MjUsIDB4M0MsIDB4MDEsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUIsCisJIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUIsIDB4RDMsIDB4NjAsIDB4MDAsIDB4RUIsIDB4QzQsIDB4NjAsIDB4QzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkQsIDB4NDYsCisJIDB4M0IsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MjMsIDB4MDAsIDB4MDgsIDB4NjEsIDB4MjMsIDB4MTEsIDB4MkQsIDB4NDYsCisJIDB4MDAsIDB4RjQsIDB4MEEsIDB4NjIsIDB4NTYsIDB4OTIsIDB4NUEsIDB4RDAsIDB4MkMsIDB4NDYsIDB4NjQsIDB4NDcsIDB4NjMsIDB4NDAsIDB4N0YsIDB4MkEsCisJIDB4MDMsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjMsIDB4NDYsIDB4NEMsIDB4NjAsIDB4RkUsIDB4REUsIDB4RDgsIDB4N0YsIDB4M0EsIDB4MDMsIDB4MDAsCisJIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjMsIDB4NDYsIDB4NEMsIDB4REUsIDB4REEsIDB4RkUsIDB4QTEsIDB4MjAsIDB4RkUsIDB4RTcsIDB4MDIsIDB4NjMsIDB4NDEsCisJIDB4RkQsIDB4QTEsIDB4NDYsIDB4NEMsIDB4MDEsIDB4RjIsIDB4MkQsIDB4NDYsIDB4NjEsIDB4NUUsIDB4MTYsIDB4RkEsIDB4MkMsIDB4NDQsIDB4MDYsIDB4RkEsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkQsIDB4NUMsIDB4M0QsIDB4NDQsIDB4MDAsIDB4QTgsIDB4RDAsIDB4ODAsIDB4RDgsIDB4MDMsIDB4RDcsIDB4MDMsCisJIDB4MkQsIDB4NDYsIDB4MDEsIDB4NjQsIDB4MTIsIDB4RkEsIDB4RjQsIDB4MDEsIDB4MDcsIDB4RjQsIDB4NjYsIDB4NDEsIDB4MDMsIDB4RjIsIDB4MDQsIDB4RjIsCisJIDB4NDAsIDB4NDIsIDB4MDUsIDB4RjIsIDB4NDAsIDB4NDMsIDB4NDAsIDB4NDQsIDB4NjEsIDB4NDYsIDB4M0MsIDB4RjIsIDB4M0QsIDB4RjIsIDB4NDAsIDB4NDAsCisJIDB4NDAsIDB4NDEsIDB4MEQsIDB4NjAsIDB4NzAsIDB4NjUsIDB4MDAsIDB4NjEsIDB4RUUsIDB4RjEsIDB4RUQsIDB4RjUsIDB4NDQsIDB4NEMsIDB4MkMsIDB4NUMsCisJIDB4RTksIDB4ODAsIDB4MDAsIDB4NjQsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4QzAsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjQsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjAsIDB4NDQsIDB4NDAsIDB4ODAsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjAsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjEsIDB4NDQsIDB4NDAsIDB4ODEsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjEsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjIsIDB4NDQsIDB4NDAsIDB4ODIsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjIsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjMsIDB4NDQsIDB4NDAsIDB4ODMsIDB4RjIsIDB4QTMsIDB4QkQsIDB4RDIsIDB4MjMsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjQsIDB4NDQsIDB4QzAsIDB4OUMsIDB4NDEsIDB4ODQsIDB4REQsIDB4ODEsIDB4MDgsIDB4MkEsIDB4QTcsIDB4MDEsCisJIDB4MEMsIDB4NjAsIDB4RUMsIDB4NjEsIDB4MDUsIDB4NjQsIDB4RUYsIDB4RjQsIDB4RjAsIDB4RjUsIDB4RkUsIDB4QTMsIDB4NUIsIDB4RDAsIDB4Q0MsIDB4ODQsCisJIDB4NTksIDB4RDksIDB4RkMsIDB4MDIsIDB4RUYsIDB4RjMsIDB4RjAsIDB4RjUsIDB4NjAsIDB4NDIsIDB4MjAsIDB4NDQsIDB4QTIsIDB4REEsIDB4MjEsIDB4NDQsCisJIDB4NUEsIDB4REEsIDB4MjIsIDB4NDQsIDB4NUEsIDB4REEsIDB4MjMsIDB4NDQsIDB4NUEsIDB4REEsIDB4MjQsIDB4NDQsIDB4NUEsIDB4REEsIDB4NjEsIDB4NDYsCisJIDB4MDYsIDB4NjAsIDB4N0QsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDEsIDB4RUYsIDB4RjMsIDB4RjAsIDB4RjUsIDB4QTAsIDB4RDIsCisJIDB4NUEsIDB4RDAsIDB4NDAsIDB4NDAsIDB4NDQsIDB4NDEsIDB4NUEsIDB4RDIsIDB4NUEsIDB4RDAsIDB4NDAsIDB4NDIsIDB4NUEsIDB4RDAsIDB4NDQsIDB4NDMsCisJIDB4NjEsIDB4NDYsIDB4QkEsIDB4RjAsIDB4M0IsIDB4RjIsIDB4NDQsIDB4NDQsIDB4NjUsIDB4NUYsIDB4NDAsIDB4ODUsIDB4RUUsIDB4RjQsIDB4RUQsIDB4RjUsCisJIDB4NDMsIDB4NEMsIDB4MEQsIDB4NjAsIDB4NzAsIDB4NjUsIDB4QkQsIDB4RDIsIDB4MjUsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjAsIDB4NDQsIDB4NDAsIDB4ODAsIDB4QkQsIDB4RDIsIDB4MjAsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjEsIDB4NDQsCisJIDB4NDAsIDB4ODEsIDB4QkQsIDB4RDIsIDB4MjEsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjIsIDB4NDQsIDB4NDAsIDB4ODIsCisJIDB4QkQsIDB4RDIsIDB4MjIsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjMsIDB4NDQsIDB4NDAsIDB4ODMsIDB4QkQsIDB4RDIsCisJIDB4MjMsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjQsIDB4NDQsIDB4NDAsIDB4ODQsIDB4QkQsIDB4RDIsIDB4MjQsIDB4NUMsCisJIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjUsIDB4NDQsIDB4NDAsIDB4ODUsIDB4NjEsIDB4NDYsIDB4M0EsIDB4RjAsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDQsIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsCisJIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RUQsIDB4RjUsIDB4QkQsIDB4RDIsIDB4MjUsIDB4NUMsIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODAsCisJIDB4RjgsIDB4ODQsIDB4MjAsIDB4NUMsIDB4NDAsIDB4ODAsIDB4MjAsIDB4NDQsIDB4RTQsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjAsIDB4NDcsIDB4RTUsIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4QkQsIDB4RDIsIDB4MjAsIDB4NUMsIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjEsIDB4NUMsIDB4NDAsIDB4ODEsCisJIDB4MjEsIDB4NDQsIDB4RTYsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjEsIDB4NDcsIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjEsIDB4NDQsIDB4RTgsIDB4ODAsCisJIDB4RjgsIDB4ODQsIDB4MjIsIDB4NUMsIDB4NDAsIDB4ODIsIDB4MjIsIDB4NDQsIDB4RTgsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjIsIDB4NDcsIDB4RTksIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4MjIsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjMsIDB4NUMsIDB4NDAsIDB4ODMsIDB4MjMsIDB4NDQsIDB4RUEsIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4MjMsIDB4NDcsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjMsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjQsIDB4NUMsCisJIDB4NDAsIDB4ODQsIDB4MjQsIDB4NDQsIDB4RUMsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjQsIDB4NDcsIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjQsIDB4NDQsCisJIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjUsIDB4NUMsIDB4NDAsIDB4ODUsIDB4MjUsIDB4NDQsIDB4RUUsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjUsIDB4NDcsCisJIDB4RUYsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MkMsIDB4NDMsIDB4QTMsIDB4RDIsIDB4MjUsIDB4NUMsIDB4OTAsIDB4ODEsIDB4RTksIDB4ODQsIDB4RTMsIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4MDYsIDB4NjAsIDB4N0QsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUEsIDB4RjMsIDB4NUEsIDB4RDMsIDB4NDAsIDB4NDgsCisJIDB4NUEsIDB4RDMsIDB4NDAsIDB4NDksIDB4NDAsIDB4NEEsIDB4MDAsIDB4NjAsIDB4NzgsIDB4N0MsIDB4NDQsIDB4NEQsIDB4NDksIDB4RjIsIDB4NEEsIDB4RjIsCisJIDB4NDAsIDB4NDcsIDB4NDAsIDB4NDYsIDB4MEQsIDB4NjAsIDB4NzAsIDB4NjUsIDB4MDAsIDB4NjEsIDB4MkQsIDB4NUMsIDB4RTksIDB4ODAsIDB4MDAsIDB4NjQsCisJIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4QzAsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MkEsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjYsIDB4NDQsIDB4NDAsIDB4ODYsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjYsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjcsIDB4NDQsIDB4NDAsIDB4ODcsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjcsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjgsIDB4NDQsIDB4NDAsIDB4ODgsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjgsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjksIDB4NDQsIDB4NDAsIDB4ODksIDB4RjIsIDB4QTMsIDB4QkQsIDB4RDIsIDB4MjksIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MkEsIDB4NDQsIDB4QzAsIDB4OUMsIDB4NDEsIDB4OEEsIDB4REQsIDB4ODEsIDB4MDgsIDB4MkEsIDB4QTcsIDB4MDEsIDB4MjYsIDB4NDQsIDB4NDQsIDB4RkEsCisJIDB4MjcsIDB4NDQsIDB4NDUsIDB4RkEsIDB4MjgsIDB4NDQsIDB4NDYsIDB4RkEsIDB4MjksIDB4NDQsIDB4NDcsIDB4RkEsIDB4MkEsIDB4NDQsIDB4NDgsIDB4RkEsCisJIDB4MDYsIDB4NjAsIDB4N0UsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4ODgsIDB4N0MsIDB4NDQsIDB4NEQsIDB4MkQsIDB4NDIsCisJIDB4QTIsIDB4RDIsIDB4NUEsIDB4RDAsIDB4NDAsIDB4NDYsIDB4NDQsIDB4NDcsIDB4NUEsIDB4RDIsIDB4NUEsIDB4RDAsIDB4NDAsIDB4NDgsIDB4NUEsIDB4RDAsCisJIDB4NDQsIDB4NDksIDB4NEIsIDB4RjIsIDB4NDQsIDB4NEEsIDB4NDAsIDB4OEIsIDB4NjAsIDB4NUMsIDB4NjQsIDB4NDcsIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4RkYsIDB4QjQsIDB4MjAsIDB4QkMsIDB4N0YsIDB4QjQsIDB4RTEsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4MDAsIDB4NjAsIDB4NzgsIDB4NjMsIDB4MEQsIDB4NjAsIDB4NzAsIDB4NjUsIDB4QkQsIDB4RDIsIDB4MkIsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsCisJIDB4OTAsIDB4OUMsIDB4MjYsIDB4NDQsIDB4NDAsIDB4ODYsIDB4QkQsIDB4RDIsIDB4MjYsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjcsIDB4NDQsIDB4NDAsIDB4ODcsIDB4QkQsIDB4RDIsIDB4MjcsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjgsIDB4NDQsCisJIDB4NDAsIDB4ODgsIDB4QkQsIDB4RDIsIDB4MjgsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjksIDB4NDQsIDB4NDAsIDB4ODksCisJIDB4QkQsIDB4RDIsIDB4MjksIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MkEsIDB4NDQsIDB4NDAsIDB4OEEsIDB4QkQsIDB4RDIsCisJIDB4MkEsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MkIsIDB4NDQsIDB4NDAsIDB4OEIsIDB4QkQsIDB4RDIsIDB4MkIsIDB4NUMsCisJIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjYsIDB4NUMsIDB4NDAsIDB4ODYsIDB4MjYsIDB4NDQsIDB4RTQsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4MjYsIDB4NDcsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUEsIDB4QkQsIDB4RDIsIDB4MjYsIDB4NUMsIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsCisJIDB4MjcsIDB4NUMsIDB4NDAsIDB4ODcsIDB4MjcsIDB4NDQsIDB4RTYsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjcsIDB4NDcsIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4MjcsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjgsIDB4NUMsIDB4NDAsIDB4ODgsIDB4MjgsIDB4NDQsIDB4RTgsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4MjgsIDB4NDcsIDB4RTksIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjgsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjksIDB4NUMsIDB4NDAsIDB4ODksCisJIDB4MjksIDB4NDQsIDB4RUEsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjksIDB4NDcsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjksIDB4NDQsIDB4RTgsIDB4ODAsCisJIDB4RjgsIDB4ODQsIDB4MkEsIDB4NUMsIDB4NDAsIDB4OEEsIDB4MkEsIDB4NDQsIDB4RUMsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MkEsIDB4NDcsIDB4RUQsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4MkEsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MkIsIDB4NUMsIDB4NDAsIDB4OEIsIDB4MkIsIDB4NDQsIDB4RUUsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4MkIsIDB4NDcsIDB4RUYsIDB4N0YsIDB4QTAsIDB4NUEsIDB4M0MsIDB4RjAsIDB4MkIsIDB4NDQsIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDYsIDB4NjAsIDB4N0UsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsIDB4MDAsIDB4RjAsCisJIDB4ODQsIDB4NjAsIDB4MDAsIDB4RTMsIDB4MDQsIDB4NzEsIDB4NjQsIDB4NTAsIDB4MDEsIDB4MkEsIDB4MDQsIDB4NzEsIDB4NUMsIDB4NjEsIDB4MDQsIDB4NjMsCisJIDB4NTksIDB4RDAsIDB4NTgsIDB4RDksIDB4RkQsIDB4MUYsIDB4M0QsIDB4RjIsIDB4NjAsIDB4NDMsIDB4NjAsIDB4NDcsIDB4NUIsIDB4REIsIDB4M0MsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4NUIsIDB4REIsIDB4M0EsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4NUIsIDB4REIsIDB4M0YsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4NUIsIDB4REIsIDB4ODEsIDB4NjAsIDB4MTgsIDB4RTMsIDB4NjUsIDB4NDMsIDB4RTMsIDB4ODQsIDB4NjAsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4NjAsIDB4NTAsIDB4N0YsIDB4NjQsIDB4MjMsIDB4OTQsIDB4NjAsIDB4NTEsIDB4N0MsIDB4NzIsIDB4MDQsIDB4NzUsIDB4MEMsIDB4NjAsCisJIDB4MTYsIDB4NjEsIDB4MTYsIDB4NjAsIDB4MDAsIDB4NjMsIDB4NTksIDB4REQsIDB4MkEsIDB4RjIsIDB4ODcsIDB4NjAsIDB4OEYsIDB4NjUsIDB4QTQsIDB4ODcsCisJIDB4NDAsIDB4QkYsIDB4NTksIDB4REIsIDB4NTYsIDB4NjQsIDB4MEEsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4NjIsIDB4NjQsCisJIDB4MDQsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MzUsIDB4RjIsIDB4MEYsIDB4NjUsIDB4QTQsIDB4OUMsIDB4NTksIDB4RDksCisJIDB4MDYsIDB4NjMsIDB4NTksIDB4REYsIDB4RkUsIDB4MUYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsIDB4MDMsIDB4MkIsIDB4MDUsIDB4MDAsCisJIDB4NkEsIDB4NjQsIDB4MDQsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4NjUsIDB4NDAsIDB4OEYsIDB4QjAsIDB4ODgsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MzksIDB4RjAsIDB4NTksIDB4RDksIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEMsIDB4NjAsIDB4MTYsIDB4NjEsIDB4QTMsIDB4NDYsCisJIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4MEEsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4NTksIDB4REYsIDB4NTksIDB4REYsCisJIDB4QTAsIDB4NEMsIDB4MDQsIDB4QkMsIDB4RkYsIDB4QjQsIDB4QTAsIDB4NTEsIDB4MjMsIDB4NDQsIDB4MDEsIDB4QTcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NTAsCisJIDB4ODAsIDB4NjAsIDB4MzgsIDB4NzEsIDB4ODAsIDB4NjAsIDB4N0MsIDB4NzIsIDB4MDEsIDB4NzYsIDB4RkYsIDB4RkYsIDB4NzYsIDB4NDQsIDB4MDEsIDB4M0EsCisJIDB4RkQsIDB4MDEsIDB4NDAsIDB4NzYsIDB4NDAsIDB4NzYsIDB4NDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NzYsIDB4ODAsIDB4NjAsIDB4MTgsIDB4NzAsCisJIDB4ODAsIDB4NjAsIDB4MTgsIDB4NzEsIDB4ODAsIDB4NjAsIDB4N0MsIDB4NzIsIDB4ODAsIDB4NjAsIDB4MTAsIDB4NzMsIDB4MDIsIDB4NzYsIDB4NzYsIDB4NDQsCisJIDB4RkYsIDB4RkYsIDB4NzYsIDB4NDQsIDB4MDIsIDB4M0EsIDB4RkQsIDB4MDEsIDB4NDAsIDB4NzYsIDB4NDIsIDB4RkYsIDB4M0MsIDB4NDYsIDB4MDAsIDB4RjIsCisJIDB4ODAsIDB4NjAsIDB4MDAsIDB4QkMsIDB4NjAsIDB4NTAsIDB4ODAsIDB4NjAsIDB4MTIsIDB4NzEsIDB4ODAsIDB4NjAsIDB4NkUsIDB4NzIsIDB4M0YsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4RjgsIDB4QTcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NTMsIDB4MDQsIDB4NzYsIDB4RkYsIDB4RkYsIDB4ODgsIDB4RkYsIDB4M0MsIDB4NDYsCisJIDB4MDcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NDMsIDB4QTMsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NzcsIDB4NDAsIDB4OEIsIDB4RkYsCisJIDB4QTAsIDB4NEIsIDB4MDQsIDB4RTEsIDB4RkYsIDB4RkYsIDB4NzYsIDB4NDQsIDB4MDQsIDB4M0EsIDB4RkQsIDB4MDEsIDB4NDAsIDB4NzYsIDB4NDIsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4NzYsIDB4RkYsIDB4RkYsIDB4NzYsIDB4NDQsIDB4MjAsIDB4M0EsIDB4RkQsIDB4MDEsIDB4NDAsIDB4NzYsIDB4NDIsIDB4RkYsCisJIDB4NjMsIDB4NDQsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NTEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4QTAsIDB4NEMsIDB4RkIsIDB4QjQsCisJIDB4QTAsIDB4NTEsIDB4MDYsIDB4NjAsIDB4MUYsIDB4RTEsIDB4MTYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4RjgsIDB4QTQsIDB4M0YsIDB4RkEsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDcsIDB4MDgsIDB4RkEsIDB4QTAsIDB4NDgsIDB4MDgsIDB4MjYsCisJIDB4MDcsIDB4MDAsIDB4QTAsIDB4NEMsIDB4MDQsIDB4RTEsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NTEsCisJIDB4NDIsIDB4RkYsIDB4MjYsIDB4NDYsIDB4OEIsIDB4RkYsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsIDB4M0MsIDB4RjIsIDB4NDAsIDB4NzYsIDB4MTQsIDB4MUIsCisJIDB4MjYsIDB4NDYsIDB4M0IsIDB4RjIsIDB4MEMsIDB4NjAsIDB4QkEsIDB4NjMsIDB4NjAsIDB4NDcsIDB4QzAsIDB4QjQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4NDMsIDB4OTMsIDB4RTMsIDB4OUMsIDB4NjQsIDB4NDcsIDB4ODAsIDB4N0MsIDB4NjQsIDB4NUYsIDB4NjAsIDB4NTAsIDB4N0YsIDB4NjQsCisJIDB4MjMsIDB4OTcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NTEsIDB4MDcsIDB4MDAsIDB4MDEsIDB4QTcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NTAsIDB4ODAsIDB4NjAsCisJIDB4NDAsIDB4NzEsIDB4ODAsIDB4NjAsIDB4N0MsIDB4NzIsIDB4MDEsIDB4NzYsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MjEsCisJIDB4RkMsIDB4MDEsIDB4MDQsIDB4MjUsIDB4RDUsIDB4MDEsIDB4NDAsIDB4NzYsIDB4NDMsIDB4RkYsIDB4MEMsIDB4NjAsIDB4MjIsIDB4NjEsIDB4MjYsIDB4NDYsCisJIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4MEEsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4NTksIDB4REYsIDB4NTksIDB4REYsCisJIDB4ODAsIDB4NjAsIDB4MTgsIDB4NzAsIDB4ODAsIDB4NjAsIDB4MjQsIDB4NzEsIDB4ODAsIDB4NjAsIDB4N0MsIDB4NzIsIDB4ODAsIDB4NjAsIDB4MTAsIDB4NzMsCisJIDB4MDIsIDB4NzYsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MjEsIDB4RkMsIDB4MDEsIDB4MDQsIDB4MjUsIDB4QjgsIDB4MDEsCisJIDB4NDAsIDB4NzYsIDB4NDMsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NTAsCisJIDB4ODAsIDB4NjAsIDB4MTIsIDB4NzEsIDB4M0YsIDB4RjIsIDB4ODAsIDB4NjAsIDB4NkUsIDB4NzIsIDB4NjAsIDB4NDcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NTMsCisJIDB4MDQsIDB4NzYsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MjEsIDB4RkMsIDB4MDEsIDB4MDQsIDB4MjUsIDB4QTAsIDB4MDEsCisJIDB4NDAsIDB4NzYsIDB4NDMsIDB4RkYsIDB4MDgsIDB4NzYsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MjEsIDB4RkMsIDB4MDEsCisJIDB4MDQsIDB4MjUsIDB4OTYsIDB4MDEsIDB4NzYsIDB4NUMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NzYsIDB4NDMsIDB4RkYsIDB4ODgsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RUUsIDB4NjAsIDB4NjAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4MDAsIDB4REIsIDB4RjMsIDB4MzEsIDB4NDEsIDB4MDEsIDB4QjEsCisJIDB4MDMsIDB4QTgsIDB4MkEsIDB4MDMsIDB4MTUsIDB4MDIsIDB4MjAsIDB4NDAsIDB4MDQsIDB4MkIsIDB4MEIsIDB4MDAsIDB4QkIsIDB4RkUsIDB4Q0EsIDB4RkUsCisJIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsCisJIDB4MDcsIDB4MDAsIDB4MDgsIDB4NjAsIDB4MDksIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MEMsIDB4MDAsCisJIDB4QTksIDB4RkUsIDB4REIsIDB4MDUsIDB4QUIsIDB4RkUsIDB4MEMsIDB4MDUsIDB4QTgsIDB4RkUsIDB4Q0MsIDB4MDUsIDB4QUEsIDB4RkUsIDB4Q0QsIDB4MDUsCisJIDB4NzgsIDB4NDMsIDB4MDEsIDB4NjEsIDB4MjksIDB4NjAsIDB4RUEsIDB4NzgsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODUsIDB4M0UsCisJIDB4MTMsIDB4NjAsIDB4MDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MDMsIDB4MDIsIDB4Q0EsIDB4NjAsIDB4RDQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDUsIDB4RDQsIDB4ODAsIDB4MEYsIDB4RjAsIDB4RjksIDB4MDMsIDB4NjQsIDB4NDQsIDB4NzAsIDB4QjAsIDB4NzAsIDB4MkEsCisJIDB4MTMsIDB4MDAsIDB4MTYsIDB4NjAsIDB4ODUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4MDAsIDB4MzYsIDB4MDAsIDB4M0IsIDB4QTIsIDB4REIsCisJIDB4QTIsIDB4RkYsIDB4QUMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4RkUsIDB4QTAsIDB4QUMsIDB4RkIsIDB4MDEsIDB4MDcsIDB4RDQsIDB4RkUsCisJIDB4QTMsIDB4RkYsIDB4RDAsIDB4NjAsIDB4QjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MDksIDB4MDAsIDB4NjYsIDB4NDUsCisJIDB4MDksIDB4RjQsIDB4MEYsIDB4RjIsIDB4MDIsIDB4MTgsIDB4NjUsIDB4NDYsIDB4RTQsIDB4MUIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDYsIDB4Q0MsIDB4MDEsCisJIDB4QTIsIDB4RkYsIDB4QUMsIDB4RjMsIDB4NDYsIDB4NDYsIDB4Q0MsIDB4ODQsIDB4RkUsIDB4QTAsIDB4QUMsIDB4RkIsIDB4MDEsIDB4MDcsIDB4RDQsIDB4RkUsCisJIDB4QTMsIDB4RkYsIDB4MEYsIDB4RjAsIDB4QTMsIDB4RkMsIDB4NjQsIDB4NDQsIDB4ODAsIDB4MjYsIDB4MzUsIDB4MDAsIDB4MkMsIDB4NjAsIDB4RUEsIDB4NjQsCisJIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RTQsIDB4NzgsIDB4QjUsIDB4RjEsIDB4MzIsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDcsIDB4NjAsCisJIDB4MDEsIDB4NjQsIDB4MjIsIDB4MDAsIDB4MDIsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MUQsIDB4MDAsIDB4MDQsIDB4MkEsCisJIDB4MUYsIDB4MDAsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MEMsIDB4QjAsIDB4MDgsIDB4M0EsIDB4MUEsIDB4MDAsIDB4MkMsIDB4RjAsIDB4MjIsIDB4RjAsCisJIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MEIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MTIsIDB4MDAsIDB4OEYsIDB4QjAsIDB4ODgsIDB4M0EsCisJIDB4MEYsIDB4MDAsIDB4MzksIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4QjAsIDB4MjAsIDB4M0EsIDB4MEEsIDB4MDAsIDB4MjMsIDB4RjIsIDB4MDAsIDB4NjAsCisJIDB4MDEsIDB4N0MsIDB4QjAsIDB4ODQsIDB4MjMsIDB4RkEsIDB4MEMsIDB4MDAsIDB4MjMsIDB4RkEsIDB4RDAsIDB4NjAsIDB4QzEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4RDAsIDB4NjAsIDB4QjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MjcsIDB4RjgsIDB4MDEsCisJIDB4MEYsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4MDgsIDB4MjYsIDB4NjQsIDB4MDAsIDB4MkEsIDB4RjIsIDB4NjAsIDB4NjMsIDB4NjAsIDB4NDAsCisJIDB4MDIsIDB4MkIsIDB4NjYsIDB4NjMsIDB4QkUsIDB4RDIsIDB4ODEsIDB4RjEsIDB4QTMsIDB4RDIsIDB4RDAsIDB4ODAsIDB4ODAsIDB4RjEsIDB4MEQsIDB4MDIsCisJIDB4QkYsIDB4RDIsIDB4RDAsIDB4ODAsIDB4N0YsIDB4RjEsIDB4MDksIDB4MDIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MDIsIDB4MkMsIDB4NjAsCisJIDB4RjYsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RTQsIDB4NzgsIDB4QjUsIDB4RjEsIDB4MzIsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4MDcsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4RDAsIDB4NjAsIDB4QzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4QjAsIDB4M0EsIDB4MDYsIDB4MDAsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4Q0MsIDB4NjAsIDB4MzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDAsIDB4MDQsIDB4MkEsCisJIDB4MkQsIDB4MDAsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MEMsIDB4QjAsIDB4MDgsIDB4M0EsIDB4MjgsIDB4MDAsIDB4MkMsIDB4RjAsIDB4MjIsIDB4RjAsCisJIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MEIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MjAsIDB4MDAsIDB4OEYsIDB4QjAsIDB4ODgsIDB4M0EsCisJIDB4MUQsIDB4MDAsIDB4MzksIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4QjAsIDB4MjAsIDB4M0EsIDB4MTgsIDB4MDAsIDB4MkMsIDB4RjAsIDB4NjYsIDB4NDUsCisJIDB4MDcsIDB4RjQsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4QTYsIDB4RjUsIDB4M0EsIDB4RjIsIDB4NjUsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MDAsIDB4MzYsCisJIDB4MEQsIDB4MDAsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDgsIDB4MDAsIDB4MjAsIDB4MkIsIDB4MDYsIDB4MDAsCisJIDB4MjMsIDB4RjIsIDB4MDAsIDB4NjAsIDB4MDIsIDB4N0MsIDB4QjAsIDB4ODQsIDB4MjMsIDB4RkEsIDB4MDMsIDB4MDAsIDB4RDAsIDB4NjAsIDB4QjUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDQsIDB4MDEsIDB4MkEsIDB4NEEsIDB4MDAsIDB4MkUsIDB4NjAsIDB4NDAsIDB4NjMsIDB4QkYsIDB4RDMsIDB4MDAsIDB4NjUsCisJIDB4QjQsIDB4ODEsIDB4REIsIDB4ODMsIDB4M0QsIDB4MDMsIDB4QkYsIDB4RDMsIDB4QTMsIDB4RDMsIDB4NDAsIDB4NDgsIDB4QkUsIDB4RDMsIDB4NDAsIDB4NEEsCisJIDB4MkUsIDB4RjAsIDB4NDAsIDB4NEMsIDB4RDAsIDB4ODAsIDB4MkQsIDB4RjAsIDB4MDgsIDB4MDIsIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MkMsIDB4RjAsCisJIDB4MDQsIDB4MDIsIDB4MjgsIDB4NDQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MkIsIDB4MDMsIDB4MzEsIDB4RjAsIDB4MkMsIDB4NDQsIDB4RDAsIDB4ODAsCisJIDB4MzAsIDB4RjAsIDB4MDgsIDB4MDIsIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MkYsIDB4RjAsIDB4MDQsIDB4MDIsIDB4MjgsIDB4NDQsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MUUsIDB4MDMsIDB4MzQsIDB4RjAsIDB4MkMsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzMsIDB4RjAsIDB4MDgsIDB4MDIsIDB4MkEsIDB4NDQsCisJIDB4RDAsIDB4ODAsIDB4MzIsIDB4RjAsIDB4MDQsIDB4MDIsIDB4MjgsIDB4NDQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MTEsIDB4MDMsIDB4MzgsIDB4RjAsCisJIDB4MkMsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzcsIDB4RjAsIDB4MDgsIDB4MDIsIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzYsIDB4RjAsIDB4MDQsIDB4MDIsCisJIDB4MjgsIDB4NDQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDMsIDB4RkEsIDB4QTEsIDB4MDYsIDB4QTMsIDB4QjcsIDB4MDMsIDB4QzMsIDB4MDEsCisJIDB4MDcsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MjMsIDB4RkEsIDB4RDAsIDB4NjAsIDB4QzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4MEYsIDB4RjAsCisJIDB4NjAsIDB4NDUsIDB4QTQsIDB4MzYsIDB4MDgsIDB4MDAsIDB4MEMsIDB4QjQsIDB4MDQsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MEMsIDB4M0EsIDB4MDYsIDB4MDAsCisJIDB4RDAsIDB4NjAsIDB4QjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0UsIDB4NjAsIDB4N0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4RjAsIDB4NjUsIDB4NDAsCisJIDB4NDAsIDB4MkIsIDB4MTcsIDB4MDAsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MTQsIDB4MDAsIDB4MDcsIDB4RjQsIDB4M0EsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4MzcsIDB4QjQsIDB4MjYsIDB4NDYsIDB4MEUsIDB4MDIsIDB4MkMsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDYsIDB4MDAsCisJIDB4MkMsIDB4NjAsIDB4RjAsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RTQsIDB4NzgsIDB4QjUsIDB4RjEsIDB4RDAsIDB4NjAsIDB4QjUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4NjQsIDB4NDAsIDB4NjAsIDB4MjYsIDB4MDMsIDB4MDAsIDB4Q0UsIDB4NjAsIDB4NEUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDEsIDB4QTYsIDB4RjMsIDB4MDcsIDB4RkEsIDB4NjEsIDB4NDQsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MkEsIDB4RjIsIDB4MTIsIDB4MDAsCisJIDB4NjAsIDB4NDAsIDB4NDAsIDB4M0EsIDB4MEYsIDB4MDAsIDB4REIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDcsIDB4QjQsIDB4MDMsIDB4M0EsIDB4RTYsIDB4MDEsCisJIDB4RDEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTEsIDB4MDIsIDB4QTYsIDB4RjMsIDB4MDcsIDB4RkEsIDB4Q0QsIDB4NjAsCisJIDB4RTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUUsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkIsIDB4NjQsIDB4NjMsIDB4NTAsIDB4RkUsIDB4QkQsIDB4RDIsCisJIDB4N0YsIDB4RjEsIDB4QkQsIDB4RDIsIDB4RDAsIDB4ODAsIDB4ODAsIDB4RjEsIDB4QkQsIDB4RDIsIDB4RDAsIDB4ODAsIDB4ODEsIDB4RjEsIDB4MkEsIDB4RjIsCisJIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDAsIDB4MDgsIDB4M0EsIDB4MDksIDB4MDAsIDB4MDEsIDB4MEMsIDB4QzgsIDB4MDEsIDB4RTksIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0QsIDB4NjAsIDB4RTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4MEMsIDB4RDEsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4QTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QkIsIDB4MDIsIDB4MDIsIDB4NjQsIDB4MTAsIDB4NjAsIDB4MEEsIDB4RkIsIDB4MDAsIDB4NjQsIDB4MTAsIDB4NjAsCisJIDB4MEUsIDB4RkIsIDB4MjYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MDUsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4ODAsIDB4MjcsIDB4MDcsIDB4MDAsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDAsIDB4NjQsIDB4MTAsIDB4NjAsIDB4MEEsIDB4RkIsIDB4QTAsIDB4MDEsIDB4Q0QsIDB4NjAsIDB4RTEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4REIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDcsIDB4QjQsIDB4RkQsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4MjAsIDB4NDAsCisJIDB4MTAsIDB4MjIsIDB4RjQsIDB4MDEsIDB4MDgsIDB4NjAsIDB4MDcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDcsIDB4MDAsCisJIDB4MDEsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDEsIDB4NjUsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4MzEsIDB4RjIsIDB4MUQsIDB4NjAsIDB4QzAsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsCisJIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MzEsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsCisJIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MzAsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsCisJIDB4NjEsIDB4NDYsIDB4MkYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsCisJIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4QTYsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4QTYsIDB4RjEsIDB4NDMsIDB4NDMsCisJIDB4RDMsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4Q0QsIDB4NjAsIDB4RDksIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDAsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4RkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4NEIsIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsIDB4RjQsIDB4QTMsIDB4MDAsIDB4NjAsCisJIDB4MUQsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjUsIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NEMsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QkIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NEEsIDB4NjAsIDB4RkUsCisJIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4NjAsIDB4NDEsIDB4RkUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MkMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjUsIDB4MDAsIDB4NjQsIDB4MTksIDB4NjAsIDB4M0IsIDB4RkIsIDB4MDIsIDB4MDAsIDB4MjAsIDB4RkUsCisJIDB4RkYsIDB4NjUsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4NjAsIDB4NDEsIDB4MjAsIDB4RkUsCisJIDB4Q0QsIDB4ODEsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MkEsIDB4MzksIDB4MDAsIDB4N0YsIDB4QjQsIDB4MDIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjQsCisJIDB4MkUsIDB4MDAsIDB4MDQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjQsIDB4MkEsIDB4MDAsIDB4MEIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjQsCisJIDB4MjYsIDB4MDAsIDB4MTYsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjQsIDB4MjIsIDB4MDAsIDB4MEMsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTAsIDB4NjQsCisJIDB4MUUsIDB4MDAsIDB4MTIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MjAsIDB4NjQsIDB4MUEsIDB4MDAsIDB4MTgsIDB4M0EsIDB4MDIsIDB4MDAsIDB4NDAsIDB4NjQsCisJIDB4MTYsIDB4MDAsIDB4MjQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4ODAsIDB4NjQsIDB4MTIsIDB4MDAsIDB4MzAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjcsCisJIDB4MEUsIDB4MDAsIDB4NDgsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjcsIDB4MEEsIDB4MDAsIDB4NjAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjcsCisJIDB4MDYsIDB4MDAsIDB4NkMsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjcsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MTksIDB4NjAsCisJIDB4M0IsIDB4RjEsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsIDB4MTksIDB4NjAsIDB4M0IsIDB4RkIsIDB4NjEsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDUsIDB4MDAsCisJIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4QkIsIDB4MDEsIDB4NjUsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MUUsIDB4MDAsCisJIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsIDB4RjQsIDB4QTMsIDB4MDAsIDB4NjAsIDB4MUQsIDB4NjEsIDB4MDAsIDB4NjAsCisJIDB4MzIsIDB4NjUsIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NEMsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4QkIsIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDMsIDB4NjAsIDB4RkUsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsCisJIDB4NjAsIDB4NDEsIDB4RkUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OTEsIDB4MDEsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjUsCisJIDB4RkMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsCisJIDB4MDQsIDB4MDAsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MzcsIDB4NjAsIDB4RjgsIDB4NjEsCisJIDB4QTEsIDB4RDEsIDB4QTEsIDB4RjMsIDB4MDEsIDB4NjAsIDB4QUMsIDB4NjMsIDB4NjAsIDB4NDUsIDB4MkEsIDB4NDQsIDB4NzksIDB4RkIsIDB4QTMsIDB4RDUsCisJIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NUIsIDB4RDUsIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NTksIDB4RDEsIDB4NjYsIDB4NDEsIDB4QTAsIDB4ODQsCisJIDB4MjQsIDB4OTQsIDB4MkIsIDB4NDYsIDB4MEYsIDB4RkEsIDB4N0EsIDB4RkIsIDB4MTYsIDB4NjQsIDB4MTIsIDB4RkEsIDB4MDEsIDB4NjQsIDB4MTEsIDB4RkEsCisJIDB4NjYsIDB4NUMsIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4N0QsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MjcsIDB4MjgsIDB4MDAsIDB4MTksIDB4NjAsIDB4NDQsIDB4RjMsIDB4MzIsIDB4NjAsIDB4ODgsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEMsIDB4MDAsIDB4MEYsIDB4NjQsIDB4RkMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4NjAsIDB4RkYsIDB4NjMsIDB4MUEsIDB4NjAsIDB4QjMsIDB4RkQsIDB4MUEsIDB4NjAsIDB4QzMsIDB4RkQsIDB4MUMsIDB4MDAsIDB4MTksIDB4NjAsCisJIDB4MzksIDB4RjMsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDgsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4RkMsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MEYsIDB4QjQsIDB4RkMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MzQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDksIDB4MDAsIDB4MTksIDB4NjAsIDB4M0EsIDB4RjMsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4RkMsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4MjMsIDB4NDMsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDUsIDB4MDAsIDB4NjMsIDB4NDYsIDB4ODAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MDYsIDB4RkEsCisJIDB4MjYsIDB4NDYsIDB4MkMsIDB4NjAsIDB4RTQsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RTQsIDB4NzgsIDB4QjUsIDB4RjEsIDB4MjcsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4M0IsIDB4MDcsIDB4MDAsIDB4MkMsIDB4NjAsIDB4RjIsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsCisJIDB4RTQsIDB4NzgsIDB4QjUsIDB4RjEsIDB4MDgsIDB4MDAsIDB4MDIsIDB4M0IsIDB4MDYsIDB4MDAsIDB4MkMsIDB4NjAsIDB4RjQsIDB4NjQsIDB4RjEsIDB4NjAsCisJIDB4NzgsIDB4NDEsIDB4RTQsIDB4NzgsIDB4QjUsIDB4RjEsIDB4MUIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RTQsIDB4QTQsIDB4M0UsIDB4RkEsIDB4MkEsIDB4RjIsCisJIDB4MjgsIDB4NDEsIDB4NDAsIDB4QTgsIDB4MDEsIDB4QjEsIDB4MDIsIDB4MDIsIDB4NDYsIDB4MDIsIDB4NzYsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkEsCisJIDB4MEYsIDB4MDAsIDB4MkMsIDB4NjAsIDB4RTIsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RTQsIDB4NzgsIDB4QjUsIDB4RjEsIDB4MUIsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsIDB4MkMsIDB4NjAsIDB4RTgsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RjAsIDB4NzgsIDB4QjUsIDB4RjEsCisJIDB4MEYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MjgsIDB4MDAsIDB4MzIsIDB4NDQsIDB4MDIsIDB4MjYsIDB4MjUsIDB4MDAsCisJIDB4MTAsIDB4MkIsIDB4MjksIDB4MDAsIDB4MkUsIDB4NjAsIDB4NDAsIDB4NjMsIDB4QkYsIDB4RDMsIDB4MkMsIDB4RjAsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDEsCisJIDB4MEQsIDB4MDMsIDB4NTAsIDB4RkUsIDB4QkQsIDB4RDMsIDB4MkQsIDB4RjAsIDB4RDAsIDB4ODAsIDB4QkQsIDB4RDMsIDB4MkUsIDB4RjAsIDB4RDAsIDB4ODAsCisJIDB4QkQsIDB4RDMsIDB4MkMsIDB4RjAsIDB4RDAsIDB4ODAsIDB4RkEsIDB4QTEsIDB4MTAsIDB4MEMsIDB4RjMsIDB4MDIsIDB4NTAsIDB4RkUsIDB4NjAsIDB4NjAsCisJIDB4MDEsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MkQsIDB4RjAsIDB4MUQsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MkUsIDB4RjAsIDB4MDEsIDB4NjQsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDMsIDB4MEMsIDB4RDAsIDB4NjAsIDB4QjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDAsIDB4NDAsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4MUMsIDB4NjAsIDB4MTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDAsIDB4NjAsIDB4NkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDAsIDB4NDAsIDB4MjYsCisJIDB4RjcsIDB4MDEsIDB4MkEsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MkEsIDB4MDAsIDB4REIsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDcsIDB4QjQsIDB4MDMsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MUQsIDB4MDAsIDB4MDMsIDB4NjcsCisJIDB4QTAsIDB4ODQsIDB4MDAsIDB4MzcsIDB4NjQsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MzcsIDB4NUUsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzcsCisJIDB4NTgsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MzcsIDB4MEQsIDB4MDAsIDB4QkQsIDB4RDIsIDB4N0YsIDB4RjEsIDB4QkQsIDB4RDIsIDB4RDAsIDB4ODAsCisJIDB4ODAsIDB4RjEsIDB4MDcsIDB4MDIsIDB4RDAsIDB4ODAsIDB4QkQsIDB4RDIsIDB4ODEsIDB4RjEsIDB4MDMsIDB4MDIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDMsIDB4MDMsIDB4RDAsIDB4NjAsIDB4QjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTksIDB4NjAsIDB4NTgsIDB4NEYsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDYsIDB4MDAsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MkIsIDB4MDMsIDB4MDAsCisJIDB4RDAsIDB4NjAsIDB4NkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODcsIDB4RjQsIDB4QTYsIDB4RjEsIDB4MjcsIDB4MUIsIDB4MzEsIDB4RjIsIDB4MUQsIDB4NjAsCisJIDB4QzAsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsCisJIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MzEsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsCisJIDB4NjEsIDB4NDYsIDB4MzAsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MkYsIDB4RjAsCisJIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsCisJIDB4QTYsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MDMsIDB4MDAsIDB4RDMsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RDYsIDB4MDMsCisJIDB4NDMsIDB4NDMsIDB4REIsIDB4RjMsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MDQsIDB4MDAsIDB4MDcsIDB4QjQsIDB4MDMsIDB4QTgsIDB4MkEsIDB4RjIsCisJIDB4NDUsIDB4MDIsIDB4QTYsIDB4RjEsIDB4MjMsIDB4NDMsIDB4RDMsIDB4ODAsIDB4RkYsIDB4RkYsIDB4NDAsIDB4MDIsIDB4RDAsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4RkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDUsIDB4MDAsIDB4NjMsIDB4NDYsIDB4MDIsIDB4NjQsIDB4MDYsIDB4RkEsCisJIDB4MjYsIDB4NDYsIDB4MzQsIDB4MDAsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDUsIDB4MDAsIDB4NjMsIDB4NDYsIDB4ODAsIDB4NjAsIDB4MDIsIDB4NjQsCisJIDB4MDYsIDB4RkEsIDB4MjYsIDB4NDYsIDB4NDMsIDB4NDMsIDB4N0QsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDksIDB4MDAsCisJIDB4MTksIDB4NjAsIDB4NDQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MEYsIDB4NjQsCisJIDB4MTAsIDB4MDAsIDB4MzcsIDB4NjAsIDB4RjgsIDB4NjEsIDB4QTEsIDB4RDEsIDB4QTEsIDB4RjMsIDB4MDEsIDB4NjAsIDB4QUMsIDB4NjMsIDB4NjAsIDB4NDUsCisJIDB4QTMsIDB4RDMsIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NUIsIDB4RDMsIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NTksIDB4RDEsIDB4MjMsIDB4NDYsCisJIDB4QTAsIDB4ODQsIDB4MEYsIDB4RkEsIDB4N0EsIDB4RkIsIDB4NzksIDB4RkIsIDB4MTYsIDB4NjQsIDB4MTIsIDB4RkEsIDB4MDEsIDB4NjQsIDB4MTEsIDB4RkEsCisJIDB4NjYsIDB4NUMsIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MDcsIDB4RkMsIDB4NDMsIDB4NDMsCisJIDB4MkEsIDB4RjIsIDB4NjMsIDB4NDUsIDB4MEMsIDB4QjQsIDB4MDgsIDB4M0EsIDB4MEEsIDB4MDAsIDB4REIsIDB4RjMsIDB4MjMsIDB4NDYsIDB4MDcsIDB4QjQsCisJIDB4RkQsIDB4QTAsIDB4MDYsIDB4RjIsIDB4MjYsIDB4NDYsIDB4MDMsIDB4MDMsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MEQsIDB4MDAsIDB4MkEsIDB4RjIsCisJIDB4MzUsIDB4RjAsIDB4NjAsIDB4NDAsIDB4QTQsIDB4MzYsIDB4MEIsIDB4MDAsIDB4MDgsIDB4MkIsIDB4MEMsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MjYsIDB4RjIsCisJIDB4MjYsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MDIsIDB4RDAsIDB4NjAsIDB4QjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDAsIDB4NjAsCisJIDB4NkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4NDYsIDB4MjIsIDB4RjIsIDB4MjYsIDB4NDYsIDB4NDQsIDB4NEMsIDB4MEYsIDB4MjYsIDB4MUQsIDB4MDAsCisJIDB4MDAsIDB4QkMsIDB4NDAsIDB4NDUsIDB4MEIsIDB4MDMsIDB4MDAsIDB4NjQsIDB4MjMsIDB4NDYsIDB4MjIsIDB4RkEsIDB4MjYsIDB4NDYsIDB4QTIsIDB4RkYsCisJIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4RjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MkEsIDB4RjAsIDB4MkMsIDB4NDQsCisJIDB4NjQsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MEEsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MjYsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MUIsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4RTQsIDB4QTQsIDB4M0UsIDB4RkEsIDB4RDAsIDB4NjAsIDB4MjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjIsIDB4MDIsIDB4RkEsIDB4QTIsIDB4RkYsCisJIDB4MTYsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4MDEsIDB4MjYsIDB4REMsIDB4OUMsIDB4QjAsIDB4RjMsIDB4MkEsIDB4RjIsIDB4REMsIDB4ODMsCisJIDB4QjAsIDB4RkQsIDB4MDYsIDB4RjQsIDB4MDEsIDB4RjgsIDB4MjYsIDB4NDYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MTgsIDB4MDAsIDB4NjQsIDB4NDQsCisJIDB4MDAsIDB4NjUsIDB4RkYsIDB4QjQsIDB4RkMsIDB4QTQsIDB4MDYsIDB4RjAsIDB4MDMsIDB4MDMsIDB4NjQsIDB4NDYsIDB4MEMsIDB4MEQsIDB4MDIsIDB4NjUsCisJIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4NjAsIDB4NDYsIDB4RjksIDB4MDEsCisJIDB4MDEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODQsIDB4MDEsIDB4RkEsIDB4NjYsIDB4NDQsIDB4MjYsIDB4NDYsIDB4MDYsIDB4RkEsIDB4MDYsIDB4RjQsCisJIDB4MDAsIDB4RjIsIDB4ODAsIDB4RkMsIDB4NDAsIDB4NDUsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4RjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4MkMsIDB4NDQsIDB4MEYsIDB4MjYsIDB4MTMsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MjYsIDB4RkEsIDB4MjYsIDB4NDQsIDB4MjIsIDB4RkEsCisJIDB4MjYsIDB4NDYsIDB4MUIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RTQsIDB4QTQsIDB4M0UsIDB4RkEsIDB4MDAsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsCisJIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4NkUsIDB4MDAsIDB4QTMsIDB4NDYsCisJIDB4MjYsIDB4RjIsIDB4NjAsIDB4NDUsIDB4REMsIDB4ODQsIDB4RDQsIDB4ODAsIDB4MjYsIDB4RkEsIDB4QTMsIDB4NDYsIDB4NkIsIDB4MDIsIDB4MkEsIDB4RjAsCisJIDB4QTMsIDB4NDYsIDB4MjIsIDB4RjIsIDB4QTMsIDB4NDYsIDB4MDAsIDB4QkMsIDB4MDAsIDB4RjIsIDB4MDEsIDB4MDIsIDB4NjMsIDB4MDAsIDB4NDQsIDB4NEMsCisJIDB4M0YsIDB4RjAsIDB4NjAsIDB4NDMsIDB4MjMsIDB4NDYsIDB4MjIsIDB4RjQsIDB4MDksIDB4NjAsIDB4MDAsIDB4NjUsIDB4M0YsIDB4RjIsIDB4MjYsIDB4NDYsCisJIDB4QzAsIDB4ODQsIDB4RDQsIDB4ODAsIDB4NjAsIDB4NDUsIDB4NTYsIDB4MDcsIDB4ODAsIDB4RkMsIDB4MUIsIDB4RjIsIDB4MDYsIDB4RjIsIDB4NjAsIDB4NDEsCisJIDB4MjMsIDB4NDYsIDB4MjIsIDB4RjQsIDB4MUIsIDB4RjAsIDB4MDYsIDB4RjAsIDB4QzEsIDB4ODEsIDB4MDYsIDB4RkEsIDB4MDUsIDB4RkEsIDB4OUIsIDB4RkEsCisJIDB4NjUsIDB4NDQsIDB4M0YsIDB4RkEsIDB4NjQsIDB4NDYsIDB4MDAsIDB4RkMsIDB4NjMsIDB4NDYsIDB4MDEsIDB4RjIsIDB4MTAsIDB4NjEsIDB4RjIsIDB4QTQsCisJIDB4MDEsIDB4RkEsIDB4QzgsIDB4ODMsIDB4MDIsIDB4NjQsIDB4NTksIDB4RDAsIDB4NTgsIDB4RDgsIDB4RkQsIDB4MUYsIDB4MDYsIDB4NDUsIDB4MDAsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjUsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4QTIsIDB4RkYsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjAsIDB4MEEsIDB4MTgsIDB4NzAsIDB4NjcsIDB4QTAsIDB4ODAsIDB4RjAsIDB4NjcsIDB4MDYsIDB4MDMsCisJIDB4QzAsIDB4ODQsIDB4MDEsIDB4RkEsIDB4MjUsIDB4NDYsIDB4MjUsIDB4NDQsIDB4ODAsIDB4RkMsIDB4MDUsIDB4RkEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4RjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MkMsIDB4NDQsIDB4MDQsIDB4MjcsIDB4MTYsIDB4MDAsIDB4MjMsIDB4NDYsCisJIDB4MjIsIDB4RjIsIDB4QTIsIDB4RkMsIDB4NjAsIDB4NDYsIDB4NDYsIDB4NDYsIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDcsIDB4MDgsIDB4RkEsCisJIDB4MjYsIDB4NDYsIDB4MkMsIDB4NDMsIDB4MkEsIDB4RkMsIDB4MDYsIDB4RjQsIDB4MDAsIDB4NjQsIDB4MDAsIDB4RkEsIDB4MDEsIDB4RjAsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4MDEsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MUQsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4Q0EsIDB4NjAsCisJIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4NDYsIDB4MjIsIDB4RjAsIDB4QTIsIDB4RkMsIDB4MDAsIDB4NjMsIDB4MzMsIDB4ODUsIDB4QTMsIDB4NDYsCisJIDB4MEQsIDB4MDMsIDB4QTMsIDB4NDYsIDB4MjYsIDB4RjIsIDB4MEYsIDB4NjUsIDB4QTQsIDB4ODUsIDB4RDQsIDB4ODQsIDB4MjYsIDB4RkEsIDB4QTMsIDB4NDYsCisJIDB4QTIsIDB4RkYsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4RjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsIDB4MjYsIDB4NDYsIDB4RDAsIDB4NjAsCisJIDB4QjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4MzIsIDB4RjAsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MjQsIDB4MDAsIDB4MDEsIDB4MkIsCisJIDB4MTMsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MTAsIDB4MDAsIDB4MkMsIDB4NjAsIDB4RTIsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsCisJIDB4RTQsIDB4NzgsIDB4QjUsIDB4RjEsIDB4MUIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsIDB4MkMsIDB4NjAsIDB4RTgsIDB4NjQsIDB4RjEsIDB4NjAsCisJIDB4NzgsIDB4NDEsIDB4RjAsIDB4NzgsIDB4QjUsIDB4RjEsIDB4MEYsIDB4MDAsIDB4MkMsIDB4NjAsIDB4RTAsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsCisJIDB4RTQsIDB4NzgsIDB4QjUsIDB4RjEsIDB4MUIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsIDB4MkMsIDB4NjAsIDB4RTYsIDB4NjQsIDB4RjEsIDB4NjAsCisJIDB4NzgsIDB4NDEsIDB4RjAsIDB4NzgsIDB4QjUsIDB4RjEsIDB4MDcsIDB4RjQsIDB4RkYsIDB4RkYsIDB4MjYsIDB4RjIsIDB4MjYsIDB4NDYsIDB4MEYsIDB4QjQsCisJIDB4REMsIDB4ODUsIDB4MkMsIDB4NjAsIDB4RTQsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RjAsIDB4NzgsIDB4QjUsIDB4RjEsIDB4MjcsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4M0IsIDB4MDcsIDB4MDAsIDB4MkMsIDB4NjAsIDB4RjIsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsCisJIDB4RTQsIDB4NzgsIDB4QjUsIDB4RjEsIDB4MDgsIDB4MDAsIDB4MDIsIDB4M0IsIDB4MDYsIDB4MDAsIDB4MkMsIDB4NjAsIDB4RjQsIDB4NjQsIDB4RjEsIDB4NjAsCisJIDB4NzgsIDB4NDEsIDB4RTQsIDB4NzgsIDB4QjUsIDB4RjEsIDB4MDcsIDB4RjIsIDB4MjYsIDB4RjAsIDB4NDEsIDB4MTgsIDB4NjAsIDB4NDYsIDB4RkYsIDB4NjcsCisJIDB4MjAsIDB4ODgsIDB4NjQsIDB4NUYsIDB4NDAsIDB4NEEsIDB4MTUsIDB4RjAsIDB4MjgsIDB4NDQsIDB4RDAsIDB4ODQsIDB4MDMsIDB4QTQsIDB4MDMsIDB4MEUsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MDQsIDB4MDAsIDB4RkEsIDB4QTQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODcsIDB4QzAsIDB4QkYsIDB4QzAsIDB4ODQsCisJIDB4MTUsIDB4RkEsIDB4NDAsIDB4NDgsIDB4MTQsIDB4RjAsIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODQsIDB4MUYsIDB4QTQsIDB4MDYsIDB4MEUsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MDcsIDB4MDAsIDB4QzIsIDB4QTQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODcsIDB4RjgsIDB4QkYsIDB4QzAsIDB4ODQsIDB4MTQsIDB4RkEsIDB4MzMsIDB4NjAsIDB4NEMsIDB4NjMsCisJIDB4QkQsIDB4REIsIDB4NjAsIDB4NUMsIDB4MkYsIDB4NjcsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDUsIDB4MDIsIDB4MjgsIDB4NjQsIDB4NDUsIDB4MjgsIDB4NUMsCisJIDB4QkQsIDB4RDksIDB4OEIsIDB4NjcsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDEsIDB4MDIsIDB4MjQsIDB4NjQsIDB4NDEsIDB4RDUsIDB4ODQsIDB4ODAsIDB4NjUsCisJIDB4QzQsIDB4ODcsIDB4MDEsIDB4MDUsIDB4MDAsIDB4NjQsIDB4RkYsIDB4QjQsIDB4MEUsIDB4RkEsIDB4QTMsIDB4REIsIDB4MjYsIDB4NDYsIDB4RDEsIDB4NjAsCisJIDB4REIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0EsIDB4NjAsIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NjAsIDB4MUEsIDB4NjQsIDB4NDAsIDB4NEIsCisJIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4Q0EsIDB4NjAsIDB4RDgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjUsIDB4NjAsIDB4RkUsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjgsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4Q0EsIDB4NjAsIDB4RDgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4NTgsIDB4NjMsIDB4NjAsIDB4NDcsIDB4MDEsIDB4MjcsIDB4NjQsIDB4NjMsIDB4NjEsIDB4NUMsIDB4MUIsIDB4NjAsCisJIDB4RkIsIDB4RjksIDB4QkQsIDB4RDAsIDB4QkQsIDB4RDAsIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDEsIDB4QkQsIDB4RDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4RjgsCisJIDB4ODMsIDB4RkEsIDB4ODIsIDB4RjgsIDB4QTYsIDB4NDYsIDB4MDIsIDB4QjAsIDB4NUUsIDB4NjMsIDB4MDQsIDB4MDMsIDB4NjQsIDB4NjMsIDB4MDMsIDB4QjAsCisJIDB4MDIsIDB4M0EsIDB4NkMsIDB4NjMsIDB4M0YsIDB4RjIsIDB4QkQsIDB4RDAsIDB4QkQsIDB4RDAsIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDEsIDB4QkQsIDB4RDAsCisJIDB4QTYsIDB4NDYsIDB4MDcsIDB4RjgsIDB4ODYsIDB4RkEsIDB4ODUsIDB4RjgsIDB4NjAsIDB4NDcsIDB4MDgsIDB4RkEsIDB4MUIsIDB4NjAsIDB4RkIsIDB4RjEsCisJIDB4MjYsIDB4NDYsIDB4NjQsIDB4NDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTYsIDB4RjUsIDB4MDAsIDB4RjIsIDB4MjYsIDB4NDYsIDB4MzEsIDB4RjAsCisJIDB4MzksIDB4MTgsIDB4NjYsIDB4NDEsIDB4MUQsIDB4NjAsIDB4QzAsIDB4NjUsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4QTYsIDB4RjEsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDMsIDB4NjQsIDB4NDMsIDB4MTEsIDB4MTgsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MUIsIDB4NjYsIDB4NDQsCisJIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjAsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NjUsIDB4NDMsIDB4ODAsIDB4RjAsIDB4MDEsIDB4RkEsCisJIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4MEIsIDB4MDAsIDB4NjQsIDB4NDYsIDB4NjIsIDB4NDMsIDB4MDAsIDB4RjIsIDB4QTMsIDB4REIsCisJIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjAsIDB4ODEsIDB4RkMsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsCisJIDB4MUYsIDB4NjAsIDB4QzIsIDB4NjEsIDB4QTEsIDB4RDMsIDB4MjAsIDB4NjAsIDB4MDQsIDB4N0MsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsCisJIDB4QTAsIDB4REQsIDB4REEsIDB4OUMsIDB4QTEsIDB4RDksIDB4NDksIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4QTEsIDB4REIsIDB4RDEsIDB4NjAsCisJIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4N0MsIDB4NzIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDQsCisJIDB4RDAsIDB4ODQsIDB4RkIsIDB4MDEsIDB4RTAsIDB4ODMsIDB4QTYsIDB4RjMsIDB4MDIsIDB4QTMsIDB4NDMsIDB4OTMsIDB4QTYsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4QTUsIDB4RDcsIDB4ODAsIDB4MDQsIDB4QTUsIDB4MDgsIDB4MjQsIDB4NjUsIDB4NDMsIDB4NjYsIDB4NDEsIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsCisJIDB4MDAsIDB4RjAsIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsIDB4MUQsIDB4NjAsIDB4QzAsIDB4NjUsCisJIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RjgsIDB4QTYsIDB4RjMsCisJIDB4NjMsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsIDB4RkEsIDB4MDQsIDB4ODAsIDB4RjgsCisJIDB4NjUsIDB4NDYsIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MzEsIDB4RjAsCisJIDB4NjYsIDB4NDEsIDB4MUQsIDB4NjAsIDB4QzAsIDB4NjUsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4QTYsIDB4RjEsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsCisJIDB4NjQsIDB4NDMsIDB4MTEsIDB4MTgsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MUIsIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDYsCisJIDB4ODAsIDB4RjAsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NjUsIDB4NDMsIDB4ODAsIDB4RjAsIDB4MDEsIDB4RkEsIDB4ODAsIDB4RkMsCisJIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4MEIsIDB4MDAsIDB4NjQsIDB4NDYsIDB4NjIsIDB4NDMsIDB4MDAsIDB4RjIsIDB4QTMsIDB4REIsIDB4NjAsIDB4NDYsCisJIDB4ODAsIDB4RjAsIDB4ODEsIDB4RkMsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MkYsIDB4RjIsCisJIDB4MzAsIDB4RjAsIDB4MzEsIDB4RjAsIDB4NjQsIDB4NDUsIDB4NDYsIDB4NDMsIDB4NjMsIDB4NDYsIDB4MDMsIDB4RkEsIDB4MDYsIDB4RjIsIDB4ODQsIDB4RjgsCisJIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4MDUsIDB4RjgsIDB4QTMsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4REIsIDB4RjMsIDB4MkEsIDB4RjIsCisJIDB4MDcsIDB4QjAsIDB4MDMsIDB4M0EsIDB4MkEsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDksIDB4RjIsIDB4NjAsIDB4NDUsIDB4ODAsIDB4M0EsIDB4MDUsIDB4MDAsCisJIDB4MEUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QjAsIDB4MEYsIDB4RjIsIDB4MjAsIDB4MDMsIDB4NjAsIDB4NDcsIDB4MDAsIDB4M0EsIDB4MUQsIDB4MDAsCisJIDB4NjAsIDB4NDEsIDB4MDAsIDB4MzYsIDB4MTMsIDB4MDAsIDB4REEsIDB4ODUsIDB4MzMsIDB4NjAsIDB4QkUsIDB4NjMsIDB4QkQsIDB4RDEsIDB4RkYsIDB4RkYsCisJIDB4RDEsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MTIsIDB4MDIsIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDMsIDB4QTUsIDB4RDAsIDB4REUsIDB4ODUsIDB4RDAsIDB4ODAsCisJIDB4Q0QsIDB4ODEsIDB4MEIsIDB4MDIsIDB4RjksIDB4MDIsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjQsIDB4MDksIDB4MDAsIDB4MjYsIDB4NDYsIDB4NDgsIDB4RkUsCisJIDB4NjUsIDB4NDAsIDB4NDAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MjgsIDB4RkUsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDgsCisJIDB4MjYsIDB4NDYsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4QTMsIDB4RjMsIDB4M0QsIDB4RjIsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsCisJIDB4MkEsIDB4RkEsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDMsIDB4MDAsIDB4RDIsIDB4NjAsIDB4QjUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjAsIDB4MzIsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MEUsIDB4MDAsIDB4MkMsIDB4RjAsIDB4NjQsIDB4NDEsIDB4NjAsIDB4NDAsCisJIDB4NDAsIDB4MjcsIDB4MDksIDB4MDAsIDB4Q0QsIDB4ODEsIDB4REQsIDB4ODEsIDB4MDYsIDB4MDMsIDB4MDUsIDB4MDMsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsCisJIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjEsIDB4NjAsIDB4NDAsIDB4MTgsIDB4MzYsIDB4MUYsIDB4MDAsIDB4RDAsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4RDEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4RjAsIDB4RUEsIDB4RjEsIDB4NjQsIDB4NDQsIDB4NjAsIDB4MjIsIDB4MTksIDB4MDAsCisJIDB4REIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDcsIDB4QjQsIDB4RkQsIDB4QTAsIDB4MkEsIDB4RjIsIDB4MDMsIDB4MDIsIDB4MDgsIDB4QjAsIDB4RkYsIDB4RkYsCisJIDB4MTAsIDB4MDIsIDB4MzIsIDB4RjIsIDB4MzMsIDB4RjIsIDB4RDAsIDB4ODAsIDB4RUIsIDB4RjEsIDB4MEIsIDB4MDIsIDB4RDAsIDB4ODAsIDB4MzQsIDB4RjIsCisJIDB4MDgsIDB4MDIsIDB4RUMsIDB4RjEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4MEYsIDB4RjAsIDB4MDMsIDB4MDIsIDB4RDMsIDB4NjAsIDB4MTAsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4RjQsIDB4QUEsIDB4NjAsIDB4QUEsIDB4NjUsIDB4MDksIDB4RjIsIDB4NUEsIDB4RDAsIDB4RDQsIDB4ODAsIDB4MDMsIDB4NjQsCisJIDB4NTcsIDB4MDIsIDB4RDAsIDB4ODAsIDB4MDAsIDB4NjQsIDB4NUEsIDB4RDAsIDB4NTMsIDB4MDIsIDB4NjQsIDB4NDUsIDB4RDQsIDB4ODAsIDB4RjgsIDB4N0YsCisJIDB4MDgsIDB4MDIsIDB4NUEsIDB4RDAsIDB4MjYsIDB4NDYsIDB4NjQsIDB4NDUsIDB4MjMsIDB4RjAsIDB4MjAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsCisJIDB4MEIsIDB4MDAsIDB4RDQsIDB4ODAsIDB4MUQsIDB4NjAsIDB4NjAsIDB4NjQsIDB4MTYsIDB4MDIsIDB4NUEsIDB4RDAsIDB4MjYsIDB4NDYsIDB4NjQsIDB4NDUsCisJIDB4MjMsIDB4RjAsIDB4NDAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NjUsIDB4NDQsIDB4ODgsIDB4M0EsIDB4MDcsIDB4MDAsIDB4NzcsIDB4MzcsCisJIDB4MDgsIDB4MDAsIDB4NzgsIDB4MzcsIDB4MDYsIDB4MDAsIDB4OEUsIDB4MzcsIDB4MDQsIDB4MDAsIDB4MzIsIDB4MDAsIDB4ODEsIDB4M0EsIDB4MzAsIDB4MDAsCisJIDB4ODAsIDB4MzcsIDB4MDAsIDB4NjEsIDB4MkQsIDB4MDAsIDB4RDQsIDB4ODAsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4NUEsIDB4RDAsIDB4MjgsIDB4MDIsCisJIDB4RDAsIDB4ODAsIDB4NUEsIDB4RDAsIDB4MjUsIDB4MDIsIDB4MjYsIDB4NDYsIDB4NjQsIDB4NDcsIDB4N0YsIDB4QjQsIDB4RkQsIDB4QTAsIDB4MDksIDB4MDMsCisJIDB4MUYsIDB4MDcsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MjYsIDB4NDQsIDB4MDAsIDB4MjMsIDB4RjAsIDB4NjAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsCisJIDB4M0YsIDB4MDAsIDB4MEYsIDB4RjIsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MjYsIDB4M0IsIDB4MDAsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MDgsIDB4MkEsIDB4MDcsIDB4MDAsIDB4NjAsIDB4NDAsIDB4NDgsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsCisJIDB4RjEsIDB4RkIsIDB4RjQsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDMsIDB4NjAsIDB4MUEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4NjEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDcsIDB4MDAsIDB4MkMsIDB4NjAsIDB4RjgsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsCisJIDB4RTQsIDB4NzgsIDB4QjUsIDB4RjEsIDB4ODUsIDB4MDAsIDB4MEYsIDB4RjIsIDB4N0YsIDB4RjEsIDB4MkEsIDB4RjIsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkEsCisJIDB4MTIsIDB4MDAsIDB4NUUsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkIsIDB4NjQsIDB4NjMsIDB4QkQsIDB4RDIsIDB4QkQsIDB4RDIsIDB4RDAsIDB4ODAsCisJIDB4ODAsIDB4RjEsIDB4MDgsIDB4MDIsIDB4RDAsIDB4ODAsIDB4QTMsIDB4RDIsIDB4ODEsIDB4RjEsIDB4MDQsIDB4MDIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MDIsIDB4MDYsIDB4MDAsIDB4NkQsIDB4MDAsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NDgsIDB4MzYsIDB4NjgsIDB4MDAsCisJIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDcsIDB4MDAsIDB4NjAsIDB4NDAsIDB4NDgsIDB4MzYsIDB4MDQsIDB4MDAsCisJIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4RjEsIDB4RkIsIDB4NjgsIDB4MDAsIDB4MjYsIDB4NDYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4MEMsIDB4MjYsIDB4NTUsIDB4MDAsIDB4QjAsIDB4MzYsIDB4MTUsIDB4MDAsIDB4MTAsIDB4MzYsIDB4MTMsIDB4MDAsIDB4MzAsIDB4MzYsCisJIDB4MTEsIDB4MDAsIDB4QzAsIDB4MzYsIDB4MDIsIDB4MDAsIDB4QTAsIDB4M0EsIDB4MTIsIDB4MDAsIDB4N0YsIDB4RjEsIDB4MzIsIDB4RjIsIDB4MzMsIDB4RjIsCisJIDB4RDAsIDB4ODAsIDB4ODAsIDB4RjEsIDB4NDUsIDB4MDIsIDB4RDAsIDB4ODAsIDB4MzQsIDB4RjIsIDB4ODEsIDB4RjEsIDB4NDEsIDB4MDIsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4M0UsIDB4MDIsIDB4RTYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4M0QsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzUsIDB4MDAsIDB4NTAsIDB4M0EsCisJIDB4MDUsIDB4MDAsIDB4RjgsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NDAsIDB4M0EsIDB4MDUsIDB4MDAsCisJIDB4RjAsIDB4NjAsIDB4NTgsIDB4NEYsIDB4OTksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4MDAsIDB4ODAsIDB4M0EsIDB4MjQsIDB4MDAsIDB4N0YsIDB4RjEsCisJIDB4MzIsIDB4RjIsIDB4MzMsIDB4RjIsIDB4RDAsIDB4ODAsIDB4ODAsIDB4RjEsIDB4MjMsIDB4MDIsIDB4RDAsIDB4ODAsIDB4MzQsIDB4RjIsIDB4ODEsIDB4RjEsCisJIDB4MUYsIDB4MDIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MUMsIDB4MDIsIDB4RTksIDB4NjAsIDB4NTgsIDB4NEYsIDB4MzAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4N0QsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MEEsIDB4MDAsIDB4MTksIDB4NjAsIDB4NEMsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDQsIDB4MDAsIDB4RUUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4RTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4NjYsIDB4NDQsIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4MDMsCisJIDB4MjYsIDB4NDYsIDB4MjYsIDB4NjAsIDB4MUEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4RDAsIDB4NjAsIDB4QjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4M0IsIDB4RjAsIDB4NjAsIDB4NDAsCisJIDB4NDAsIDB4MkIsIDB4MDYsIDB4MDAsIDB4QzAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MDEsIDB4MDAsIDB4MDMsIDB4MDAsCisJIDB4RDMsIDB4NjAsIDB4NEMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4QjQsIDB4RkYsIDB4RkYsIDB4RjgsIDB4MDMsCisJIDB4MjMsIDB4RjIsIDB4MDcsIDB4RjQsIDB4QkIsIDB4RjAsIDB4MjYsIDB4NDYsIDB4QTQsIDB4ODQsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MkYsIDB4MjYsCisJIDB4RDcsIDB4MDEsIDB4MTIsIDB4RjAsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MUIsIDB4Q0EsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MTYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDAsIDB4MTgsIDB4MzYsIDB4MDksIDB4MDAsIDB4MDQsIDB4NjUsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4RDMsIDB4NjAsIDB4MTAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NjAsIDB4RkUsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsCisJIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjgsIDB4RkUsIDB4QzAsIDB4MDEsCisJIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjMsIDB4MDAsIDB4NjQsIDB4QTMsIDB4REIsIDB4MDYsIDB4QTMsIDB4MTAsIDB4NjAsIDB4OTQsIDB4NjQsIDB4QkQsIDB4REIsCisJIDB4QkQsIDB4REIsIDB4MDYsIDB4NjQsIDB4QTMsIDB4REIsIDB4MDAsIDB4NjMsIDB4MDgsIDB4NjAsIDB4NzcsIDB4RkQsIDB4RDksIDB4NjAsIDB4QTUsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4NDksIDB4RkIsIDB4RDksIDB4NjAsIDB4NkEsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MzUsIDB4RkIsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDMsIDB4NjAsIDB4OUMsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4N0QsIDB4RjMsIDB4MzMsIDB4NjAsIDB4MjAsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDMsIDB4MDAsIDB4MTksIDB4NjAsIDB4M0IsIDB4RjMsCisJIDB4MDIsIDB4MDAsIDB4MTksIDB4NjAsIDB4M0MsIDB4RjMsIDB4MDgsIDB4NjEsIDB4NjAsIDB4RkUsIDB4QTMsIDB4RDEsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsCisJIDB4MDAsIDB4QTgsIDB4RTgsIDB4ODQsIDB4MEYsIDB4MDMsIDB4NjAsIDB4RkUsIDB4MDIsIDB4MjgsIDB4RjYsIDB4MDEsIDB4ODAsIDB4NjIsIDB4QjIsIDB4OUMsCisJIDB4QkQsIDB4RDksIDB4N0IsIDB4RjksIDB4Q0QsIDB4ODEsIDB4MDAsIDB4MzYsIDB4MDEsIDB4MDAsIDB4RUUsIDB4MDEsIDB4MzYsIDB4NjAsIDB4MEEsIDB4NjMsCisJIDB4MDgsIDB4NjEsIDB4RUEsIDB4MDEsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4QkEsIDB4RkUsIDB4MTYsIDB4NjAsIDB4ODcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4QTgsIDB4MDIsIDB4QTgsIDB4MDQsIDB4MDMsIDB4MjgsIDB4MDIsCisJIDB4RDksIDB4NjAsIDB4NDEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDgsIDB4NjAsIDB4RDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MTEsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QUMsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4RkUsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MEEsIDB4MDcsIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsCisJIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MjAsIDB4NjUsCisJIDB4QTUsIDB4REYsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjcsIDB4RkIsIDB4NUEsIDB4REIsIDB4RDQsIDB4NjAsIDB4RjYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4NjMsIDB4MEUsIDB4NjAsIDB4MzYsIDB4RkQsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTUsIDB4RkIsIDB4NUEsIDB4REIsIDB4QkEsIDB4RkUsIDB4MDIsIDB4NjQsIDB4REIsIDB4RkIsIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4QkMsIDB4RjEsIDB4RkIsIDB4NDQsIDB4NjAsIDB4NDQsIDB4NjQsIDB4N0YsIDB4RkIsIDB4ODAsIDB4RkIsIDB4ODEsIDB4RkIsIDB4MDgsIDB4NjAsCisJIDB4MDAsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsIDB4MDgsIDB4NjAsIDB4NzcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTUsIDB4MTgsIDB4QTIsIDB4REYsCisJIDB4NDAsIDB4NjAsIDB4NTgsIDB4NEUsIDB4N0QsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4QzQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4RTEsIDB4RkIsCisJIDB4NEEsIDB4REYsIDB4MDEsIDB4NjAsIDB4RkUsIDB4NjMsIDB4MUQsIDB4NjAsIDB4QkUsIDB4NjEsIDB4MDAsIDB4NjQsIDB4NTksIDB4REIsIDB4RkUsIDB4MUYsCisJIDB4MTAsIDB4NjAsIDB4MEUsIDB4NjIsIDB4QTIsIDB4REYsIDB4NUIsIDB4MDAsIDB4Q0YsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NTIsIDB4MUIsIDB4MTAsIDB4NjAsCisJIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjQsIDB4NDAsIDB4MDIsIDB4MjIsIDB4MjYsIDB4MDAsIDB4MDgsIDB4NjAsIDB4MUUsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MTYsIDB4RkIsIDB4RDQsIDB4NjAsIDB4MUYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsCisJIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDgsIDB4NjAsIDB4MUUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDQsIDB4NjAsIDB4NTksIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MTEsIDB4MDAsIDB4MDgsIDB4NjAsCisJIDB4MUUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDQsIDB4NjAsIDB4NTksIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4NjAsIDB4MUUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDQsIDB4NjAsIDB4NTksIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4RkQsIDB4NjAsIDB4ODksIDB4NjUsIDB4RjMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsCisJIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RkIsIDB4NUEsIDB4REIsIDB4MTAsIDB4NjAsCisJIDB4NEUsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RjcsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MDgsIDB4NjAsCisJIDB4MDgsIDB4RjEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4QkIsIDB4RkUsIDB4RkQsIDB4NjAsCisJIDB4NDAsIDB4NjUsIDB4RjMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MDMsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MjgsIDB4RkIsIDB4RDQsIDB4NjAsIDB4ODcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsCisJIDB4MjcsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDcsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4MTAsIDB4NjAsIDB4NEUsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTIsIDB4MDEsIDB4MTAsIDB4NjAsIDB4NEUsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjcsIDB4RkIsIDB4NUEsIDB4REIsIDB4MjAsIDB4NDAsIDB4MDQsIDB4MkIsIDB4MTQsIDB4MDAsCisJIDB4OUIsIDB4RkUsIDB4MDgsIDB4MDQsIDB4QkIsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDQsIDB4NjAsIDB4OTUsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsCisJIDB4MTYsIDB4NjAsIDB4Q0MsIDB4RjMsIDB4MDAsIDB4NjEsIDB4NjAsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDAsIDB4QjksIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsCisJIDB4MDEsIDB4QjksIDB4NjAsIDB4NDAsIDB4MDIsIDB4MzYsIDB4MDYsIDB4QjksIDB4NjAsIDB4NDAsIDB4MDMsIDB4MzYsIDB4MDcsIDB4QjksIDB4NDEsIDB4NDQsCisJIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDQsIDB4NjAsIDB4QzgsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4N0QsIDB4RjEsIDB4MTMsIDB4NjAsIDB4MUEsIDB4RjksIDB4MEMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MjAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDQsIDB4NjAsIDB4RTksIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsCisJIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4NzUsIDB4MDAsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QkEsIDB4RkUsIDB4MDIsIDB4NjQsIDB4REIsIDB4RkIsIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QkMsCisJIDB4RjEsIDB4RkIsIDB4NDQsIDB4NjAsIDB4NDQsIDB4NjQsIDB4N0YsIDB4RkIsIDB4ODAsIDB4RkIsIDB4ODEsIDB4RkIsIDB4RkYsIDB4RkYsIDB4MjAsIDB4NDAsCisJIDB4MDQsIDB4MkIsIDB4MTQsIDB4MDAsIDB4OUIsIDB4RkUsIDB4MDgsIDB4MDQsIDB4QkIsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsCisJIDB4RDUsIDB4NjAsIDB4MDcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NjUsCisJIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsIDB4MDgsIDB4NjAsIDB4MDcsIDB4RjEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsCisJIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDYsIDB4MDAsIDB4QTIsIDB4REYsIDB4MDIsIDB4NjUsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QzMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4Q0YsIDB4RjMsIDB4MjAsIDB4NjAsIDB4MjAsIDB4NjUsIDB4MzYsIDB4MUIsIDB4QTUsIDB4RDMsIDB4MjQsIDB4NDAsIDB4MDEsIDB4MjYsCisJIDB4MTYsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MjYsIDB4MkYsIDB4MDAsIDB4MDEsIDB4QkMsIDB4QTUsIDB4REIsIDB4MDgsIDB4NjAsIDB4MUUsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MTYsIDB4RkIsIDB4RDUsIDB4NjAsIDB4NjUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MTAsIDB4MjYsIDB4MTksIDB4MDAsIDB4MDEsIDB4QkMsIDB4QTUsIDB4REIsIDB4MDgsIDB4NjAsIDB4MUUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDUsIDB4NjAsCisJIDB4NjUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkQsIDB4NjAsIDB4ODksIDB4NjUsIDB4RjMsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4RjEsIDB4MDcsIDB4NjAsIDB4RTksIDB4RjMsIDB4NjQsIDB4NDAsIDB4MDIsIDB4M0EsCisJIDB4MEMsIDB4MDAsIDB4MDEsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MjIsIDB4MDAsIDB4NjMsIDB4MDgsIDB4NjAsIDB4QzEsIDB4RkQsIDB4MDgsIDB4NjAsCisJIDB4QzUsIDB4RkQsIDB4MDgsIDB4NjAsIDB4QzksIDB4RkQsIDB4MDgsIDB4NjAsIDB4Q0QsIDB4RkQsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MDEsIDB4NjQsIDB4NTMsIDB4RkIsIDB4MkYsIDB4NjAsIDB4MDIsIDB4NjQsIDB4NTQsIDB4RkIsIDB4MjQsIDB4NDAsIDB4MDEsIDB4MjYsCisJIDB4MTEsIDB4MDAsIDB4MDgsIDB4NjAsIDB4MTIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDUsIDB4NjAsIDB4QUIsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MTIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDUsIDB4NjAsIDB4QUIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkQsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MDgsIDB4NjAsCisJIDB4MDgsIDB4RjEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4ODYsIDB4RjEsIDB4MUIsIDB4NjAsIDB4QjIsIDB4NjMsIDB4RDMsIDB4ODAsIDB4MjAsIDB4NDQsIDB4MDMsIDB4MDMsCisJIDB4RDgsIDB4NjAsIDB4RDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MUIsIDB4MDIsCisJIDB4MjQsIDB4NDQsIDB4MDQsIDB4MjIsIDB4MTIsIDB4MDAsIDB4MjQsIDB4NDQsIDB4MDEsIDB4QUMsIDB4RkIsIDB4QjQsIDB4NDAsIDB4NDQsIDB4RjcsIDB4NjAsCisJIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4RDQsIDB4NjAsIDB4RjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsCisJIDB4RkYsIDB4RkYsIDB4MUYsIDB4MDIsIDB4ODcsIDB4MDAsIDB4MjAsIDB4NDQsIDB4MTAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4NjQsIDB4NDIsIDB4NUEsIDB4RDEsCisJIDB4MDYsIDB4NjMsIDB4QTQsIDB4RDEsIDB4QzMsIDB4ODMsIDB4N0QsIDB4RjksIDB4QkQsIDB4RDEsIDB4N0YsIDB4RjksIDB4QkQsIDB4RDEsIDB4RkYsIDB4RkYsCisJIDB4ODAsIDB4RjksIDB4QkQsIDB4RDEsIDB4ODEsIDB4RjksIDB4MDQsIDB4QTMsIDB4QkQsIDB4RDEsIDB4MzMsIDB4NjAsIDB4QkUsIDB4NjQsIDB4NjQsIDB4NDEsCisJIDB4REQsIDB4ODEsIDB4RkUsIDB4QjEsIDB4QTAsIDB4RDksIDB4MDQsIDB4MDMsIDB4QkQsIDB4RDEsIDB4QzksIDB4ODEsIDB4NTgsIDB4RDksIDB4RkMsIDB4MDIsCisJIDB4MzksIDB4MDAsIDB4RTQsIDB4RjMsIDB4N0QsIDB4RkIsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDYsIDB4MDAsIDB4MTAsIDB4NjAsCisJIDB4RjAsIDB4NjMsIDB4MTEsIDB4NjAsIDB4NDQsIDB4NjUsIDB4MDYsIDB4NjYsIDB4MDUsIDB4MDAsIDB4MTEsIDB4NjAsIDB4NjAsIDB4NjMsIDB4MTIsIDB4NjAsCisJIDB4NDAsIDB4NjUsIDB4MDgsIDB4NjYsIDB4QTMsIDB4RDEsIDB4NEIsIDB4OTMsIDB4RDAsIDB4ODAsIDB4RDcsIDB4ODAsIDB4MDIsIDB4MDMsIDB4RkEsIDB4MDQsCisJIDB4MDQsIDB4MDAsIDB4NUIsIDB4OTMsIDB4MDIsIDB4QTMsIDB4MDEsIDB4NjQsIDB4QTMsIDB4REIsIDB4NjEsIDB4NDYsIDB4MkYsIDB4NjAsIDB4MDIsIDB4NjEsCisJIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4MzMsIDB4NjAsIDB4QkUsIDB4NjMsIDB4MDIsIDB4MDIsIDB4MkQsIDB4NjAsIDB4MTAsIDB4NjEsCisJIDB4QTEsIDB4RDMsIDB4QkQsIDB4REIsIDB4REMsIDB4ODQsIDB4RkUsIDB4QjQsIDB4NTksIDB4RDEsIDB4QzgsIDB4ODQsIDB4QkQsIDB4RDksIDB4RkMsIDB4MDIsCisJIDB4RUMsIDB4RjMsIDB4NzIsIDB4NDUsIDB4RUIsIDB4RjMsIDB4OTQsIDB4ODMsIDB4ODEsIDB4RkQsIDB4OTQsIDB4ODMsIDB4ODAsIDB4RkQsIDB4NjUsIDB4NUYsCisJIDB4MDIsIDB4NjQsIDB4N0YsIDB4RkIsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsCisJIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDYsIDB4NjAsIDB4M0EsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0QsIDB4RjEsIDB4MTMsIDB4NjAsIDB4MUEsIDB4RjksIDB4MEUsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkQsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDYsIDB4NjAsIDB4NUIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QkUsIDB4RkUsCisJIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4RDcsIDB4NjAsCisJIDB4N0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4RUYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MDIsIDB4NjQsIDB4REIsIDB4RkIsCisJIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QkMsIDB4RjEsIDB4RkIsIDB4RjcsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsCisJIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsCisJIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjQsIDB4NDQsIDB4MDIsIDB4MjIsIDB4MDMsIDB4MDAsIDB4MDEsIDB4QUMsIDB4MDQsIDB4QkMsCisJIDB4NDAsIDB4NDQsIDB4MzIsIDB4NDAsIDB4ODAsIDB4MkEsIDB4OEMsIDB4MDAsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDYsIDB4NjAsIDB4OEMsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4OTUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4N0YsIDB4QjQsIDB4OTUsIDB4RkIsIDB4MjYsIDB4NjAsIDB4MzQsIDB4NjIsIDB4MDYsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4REEsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MTIsIDB4NjAsIDB4RkYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MDUsIDB4MDMsIDB4MEUsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MjIsIDB4MDAsIDB4MTMsIDB4NjAsIDB4MDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsCisJIDB4MDMsIDB4MDMsIDB4MEYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MTksIDB4MUIsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsCisJIDB4RDYsIDB4NjAsIDB4RTUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDEsIDB4NjQsIDB4MTksIDB4NjAsIDB4RjEsIDB4RkIsIDB4MTksIDB4NjAsCisJIDB4RjYsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDUsIDB4MDAsIDB4ODksIDB4RkYsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NzUsCisJIDB4ODgsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MTAsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDYsIDB4NjAsCisJIDB4RTUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4N0QsIDB4RjEsIDB4MTMsIDB4NjAsIDB4MUEsIDB4RjksIDB4MDgsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsCisJIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDcsIDB4NjAsIDB4MEEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4QkEsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MUUsIDB4MDAsCisJIDB4REEsIDB4RkUsIDB4QzEsIDB4RkUsIDB4MEUsIDB4NjAsIDB4MzYsIDB4RjEsIDB4MEUsIDB4NjAsIDB4NEIsIDB4RjksIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MDYsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDcsIDB4NjAsIDB4NEUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MjgsIDB4RkIsIDB4RDcsIDB4NjAsIDB4NTUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MUMsIDB4NjAsIDB4NkMsIDB4NjEsCisJIDB4NzUsIDB4NjAsIDB4MzAsIDB4NjUsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RTAsIDB4ODQsIDB4MDIsIDB4MDIsIDB4MDMsIDB4NjAsCisJIDB4RTgsIDB4NjQsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDQsIDB4NjUsIDB4NDQsIDB4QTEsIDB4REIsIDB4MzIsIDB4NDAsIDB4ODAsIDB4MkEsCisJIDB4MDMsIDB4MDAsIDB4RDQsIDB4NjAsIDB4RjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MjcsIDB4RkIsIDB4NUEsIDB4REIsIDB4RDQsIDB4NjAsIDB4RjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4NDAsIDB4MDYsIDB4MjMsIDB4MTAsIDB4MDAsCisJIDB4MDgsIDB4NjAsIDB4MjcsIDB4RjEsIDB4N0YsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MjgsIDB4RkIsIDB4RDcsIDB4NjAsIDB4NTUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MTAsIDB4NjAsIDB4NEUsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjcsIDB4RkIsIDB4NUEsIDB4REIsCisJIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsCisJIDB4RDMsIDB4NjAsIDB4RDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NzgsIDB4RjMsIDB4NzksIDB4RkIsIDB4MjAsIDB4NjAsIDB4MTQsIDB4NjIsIDB4QTIsIDB4REYsCisJIDB4RkYsIDB4NjAsIDB4REYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4QkMsIDB4RjEsIDB4MEUsIDB4NjAsIDB4NEIsIDB4RjksIDB4MUMsIDB4NjAsCisJIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4RjcsIDB4NjAsCisJIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MTAsIDB4MjYsIDB4MzgsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QjIsIDB4RkIsIDB4QjMsIDB4RkIsCisJIDB4QjQsIDB4RkIsIDB4MDAsIDB4NzUsIDB4MDAsIDB4NzIsIDB4QkEsIDB4RjEsIDB4N0UsIDB4RjksIDB4NjQsIDB4NDQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4OTMsIDB4RTUsIDB4RjEsIDB4ODQsIDB4RjksIDB4N0QsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsCisJIDB4MUUsIDB4MDAsIDB4MTksIDB4NjAsIDB4NDQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEEsIDB4MDAsIDB4MEYsIDB4NjQsCisJIDB4RkMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjcsIDB4NDMsIDB4MUEsIDB4NjAsIDB4QjMsIDB4RkQsIDB4MUEsIDB4NjAsCisJIDB4QzMsIDB4RkQsIDB4RDMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjUsIDB4RkMsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RkYsIDB4NjUsCisJIDB4RkMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDQsIDB4MDAsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsIDB4ODQsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDcsIDB4NjAsIDB4REIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QTAsIDB4ODAsCisJIDB4OUMsIDB4ODQsIDB4MkIsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4RkYsIDB4NjAsIDB4N0YsIDB4NjEsCisJIDB4QTEsIDB4ODQsIDB4NUEsIDB4RDEsIDB4NEEsIDB4REIsIDB4QTEsIDB4ODQsIDB4NUEsIDB4REIsIDB4MkUsIDB4NjAsIDB4MkUsIDB4NjQsIDB4MkQsIDB4NjAsCisJIDB4OEEsIDB4NjMsIDB4QTAsIDB4RDEsIDB4QTMsIDB4RDksIDB4NjQsIDB4NDEsIDB4NTgsIDB4RDEsIDB4NUIsIDB4RDksIDB4N0QsIDB4RjMsIDB4NjYsIDB4NDUsCisJIDB4QTYsIDB4RjUsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDgsIDB4MDAsIDB4OTEsIDB4RkEsIDB4NjEsIDB4NDQsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4QUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTIsIDB4RkEsIDB4MDcsIDB4MDAsIDB4MTEsIDB4RjgsIDB4NjQsIDB4NDQsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4QUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTIsIDB4RkEsIDB4NjUsIDB4NDYsIDB4MDQsIDB4MDAsIDB4QkIsIDB4RkUsIDB4RDQsIDB4NjAsIDB4RjYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsIDB4QzIsIDB4RjEsIDB4MDAsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MjIsIDB4NjUsIDB4NjQsIDB4NDAsCisJIDB4MDcsIDB4MzYsIDB4MDEsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MEEsIDB4MzYsIDB4MDEsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MEIsIDB4MzYsIDB4MjIsIDB4NjUsCisJIDB4QTYsIDB4RjMsIDB4NjYsIDB4NUMsIDB4NjAsIDB4NDYsIDB4MUYsIDB4NjMsIDB4RTMsIDB4ODMsIDB4QkEsIDB4RjgsIDB4MDIsIDB4QTYsIDB4NjYsIDB4NDQsCisJIDB4RkMsIDB4MUYsIDB4MTYsIDB4NjAsIDB4QzIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDcsIDB4MzYsIDB4MDMsIDB4MDAsIDB4MEEsIDB4MzYsCisJIDB4MDYsIDB4MDAsIDB4MDksIDB4MDAsIDB4QTYsIDB4RjMsIDB4MDQsIDB4NjUsIDB4NjAsIDB4NDYsIDB4QkEsIDB4RjgsIDB4MDQsIDB4MDAsIDB4QTYsIDB4RjMsCisJIDB4MTAsIDB4NjUsIDB4NjAsIDB4NDYsIDB4QkEsIDB4RjgsIDB4NjQsIDB4NDYsIDB4QTYsIDB4RjMsIDB4MzIsIDB4NDEsIDB4NjAsIDB4NDUsIDB4MDgsIDB4QjEsCisJIDB4NjYsIDB4NDEsIDB4MTYsIDB4MDMsIDB4NjUsIDB4NDYsIDB4MTcsIDB4NjAsIDB4ODAsIDB4RjMsIDB4MDYsIDB4RjAsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4ODAsIDB4QkYsIDB4QjAsIDB4ODQsIDB4MDYsIDB4RkEsIDB4NjYsIDB4NDMsIDB4MDIsIDB4QTMsIDB4NjMsIDB4NDYsCisJIDB4MDYsIDB4RjAsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MzIsIDB4NDQsIDB4MTAsIDB4QkMsIDB4NDAsIDB4NTIsCisJIDB4MDEsIDB4NjQsIDB4MTAsIDB4NjAsIDB4MEEsIDB4RkIsIDB4MEYsIDB4NEUsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4M0EsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MEUsIDB4NEYsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4RkYsIDB4NjAsIDB4RkIsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsCisJIDB4MDQsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDMsIDB4NjAsIDB4QUUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MUMsIDB4NjAsCisJIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4QkIsIDB4RkUsCisJIDB4MjAsIDB4NDQsIDB4MDQsIDB4MjcsIDB4MTEsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MDIsIDB4MDAsIDB4REIsIDB4RkUsIDB4MTQsIDB4MDAsIDB4MDgsIDB4NjAsCisJIDB4MDcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDEsIDB4NjUsCisJIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDEsIDB4NjQsIDB4OEEsIDB4RkIsIDB4RkYsIDB4NjAsIDB4RUYsIDB4NjUsIDB4MjAsIDB4NDQsCisJIDB4MjQsIDB4ODAsIDB4MDMsIDB4NjQsIDB4REIsIDB4RkIsIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4RjEsIDB4RkIsIDB4QzEsIDB4RkUsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjgsIDB4RkIsIDB4RDgsIDB4NjAsIDB4QUEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4NDAsIDB4MDYsIDB4MjMsIDB4MTAsIDB4MDAsIDB4MDgsIDB4NjAsIDB4MjcsIDB4RjEsIDB4N0YsIDB4NjAsCisJIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjgsIDB4RkIsIDB4RDgsIDB4NjAsCisJIDB4QUEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4NEUsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjcsIDB4RkIsIDB4NUEsIDB4REIsIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsCisJIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4RDMsIDB4NjAsIDB4RDAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QkIsIDB4RkUsIDB4RDksIDB4NjAsIDB4QjAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsIDB4QzIsIDB4RjEsIDB4MDAsIDB4NjUsIDB4NjQsIDB4NDAsCisJIDB4MDEsIDB4MzYsIDB4MjIsIDB4NjUsIDB4QTYsIDB4RjMsIDB4NjYsIDB4NUMsIDB4NjAsIDB4NDYsIDB4MUYsIDB4NjMsIDB4RTMsIDB4ODMsIDB4QkEsIDB4RjgsCisJIDB4MDIsIDB4QTYsIDB4NjYsIDB4NDQsIDB4RkMsIDB4MUYsIDB4NjQsIDB4NDYsIDB4QTYsIDB4RjEsIDB4MDIsIDB4NjQsIDB4QzAsIDB4ODUsIDB4MEMsIDB4NjEsCisJIDB4MzIsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MTQsIDB4MDAsIDB4MTcsIDB4NjAsIDB4ODAsIDB4RjMsIDB4NjYsIDB4NDEsIDB4NjUsIDB4NDYsIDB4MDYsIDB4RjAsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4ODAsIDB4QkYsIDB4QjAsIDB4ODMsIDB4MDYsIDB4RkMsIDB4NjYsIDB4NDIsCisJIDB4RkUsIDB4QTIsIDB4NjIsIDB4NDYsIDB4MDYsIDB4RjAsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MEIsIDB4NjQsCisJIDB4REIsIDB4RkIsIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4RjEsIDB4RkIsIDB4MDEsIDB4NjUsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTQsIDB4RjEsIDB4N0QsIDB4RjksIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDksIDB4NjAsIDB4MEMsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0QsIDB4RjEsIDB4MTMsIDB4NjAsIDB4MUEsIDB4RjksIDB4MEUsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDksIDB4NjAsCisJIDB4MkQsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RkIsCisJIDB4NUEsIDB4REIsIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MDEsIDB4NjQsIDB4OEEsIDB4RkIsIDB4RkYsIDB4NjAsIDB4REYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDYsIDB4NjQsIDB4REIsIDB4RkIsIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4RjEsIDB4RkIsIDB4RTQsIDB4RjEsCisJIDB4N0QsIDB4RjksIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDEsIDB4NjQsIDB4OEEsIDB4RkIsIDB4RkYsIDB4NjAsCisJIDB4REYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4QTYsIDB4RjEsIDB4NjYsIDB4NDUsIDB4NjQsIDB4NDYsIDB4NjYsIDB4NDMsIDB4MDIsIDB4QTMsCisJIDB4NjMsIDB4NDYsIDB4MDIsIDB4NjQsIDB4MDYsIDB4RkEsIDB4MDQsIDB4NjMsIDB4MDQsIDB4NjEsIDB4MDEsIDB4NjAsIDB4Q0MsIDB4NjQsIDB4NTgsIDB4RDEsCisJIDB4NTksIDB4RDgsIDB4RkQsIDB4MUYsIDB4NjUsIDB4NDYsIDB4MDEsIDB4NjUsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NjcsIDB4RkIsIDB4NjgsIDB4RkIsIDB4QTYsIDB4RjEsIDB4MEUsIDB4NjQsIDB4NjYsIDB4NDEsCisJIDB4NjQsIDB4NDIsIDB4MDIsIDB4QTIsIDB4NjIsIDB4NDYsIDB4MDYsIDB4RjAsIDB4RkYsIDB4NjAsIDB4RkMsIDB4NjQsIDB4QTAsIDB4ODQsIDB4MDYsIDB4RkEsCisJIDB4NjEsIDB4NDYsIDB4REIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDQsIDB4QTgsIDB4MTAsIDB4NjAsIDB4MEUsIDB4NjQsIDB4MDcsIDB4MDMsIDB4QTAsIDB4RDEsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjMsIDB4QTAsIDB4REQsIDB4MDEsIDB4NjQsIDB4REIsIDB4RkIsCisJIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4RjEsIDB4RkIsIDB4MDAsIDB4NjMsIDB4MDgsIDB4NjAsIDB4NzcsIDB4RkQsIDB4MTAsIDB4NjAsCisJIDB4NEUsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjcsIDB4RkIsIDB4NUEsIDB4REIsIDB4MTAsIDB4NjAsCisJIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDMsIDB4NjAsCisJIDB4OUMsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDAsIDB4NjAsCisJIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4NDAsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4QjksIDB4RjEsIDB4MEUsIDB4NjAsIDB4NEIsIDB4RjksIDB4NUYsIDB4RjUsIDB4RUEsIDB4RjEsCisJIDB4MkYsIDB4RjgsIDB4RUIsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUMsIDB4RjEsIDB4MzEsIDB4RjgsIDB4QjksIDB4RjEsIDB4MTksIDB4RjgsIDB4RjgsIDB4NjAsCisJIDB4ODAsIDB4NjQsIDB4MEUsIDB4RkEsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4QTYsIDB4RjEsIDB4MDcsIDB4RjgsIDB4MUIsIDB4NjAsIDB4QjAsIDB4NjQsCisJIDB4MDAsIDB4NjAsIDB4NjcsIDB4RkIsIDB4NDQsIDB4NjAsIDB4NDQsIDB4NjQsIDB4N0YsIDB4RkIsIDB4ODAsIDB4RkIsIDB4ODEsIDB4RkIsIDB4MzEsIDB4NDQsCisJIDB4RjksIDB4QjQsIDB4NDAsIDB4NTEsIDB4MDAsIDB4NjAsIDB4Q0UsIDB4NjMsIDB4MDEsIDB4NjAsIDB4MEMsIDB4NjUsIDB4QTMsIDB4RDMsIDB4QTUsIDB4RDEsCisJIDB4MDQsIDB4QTQsIDB4QTMsIDB4REIsIDB4RDAsIDB4ODAsIDB4QTAsIDB4RDEsIDB4MEEsIDB4MDYsIDB4NDEsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RDYsIDB4NjAsIDB4NkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDQsIDB4NDcsCisJIDB4MTYsIDB4NjAsIDB4QzIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MDksIDB4MDcsIDB4MEUsIDB4NjEsIDB4NDEsIDB4RDMsCisJIDB4MzIsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDQsIDB4MDAsIDB4MTAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4RDMsIDB4MDEsIDB4NDIsIDB4NjQsCisJIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsCisJIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDksIDB4NjAsIDB4RkEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RDEsIDB4N0QsIDB4RjksIDB4MTMsIDB4NjAsIDB4MUEsIDB4RjksIDB4MEUsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4REEsIDB4NjAsIDB4MUMsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MDcsIDB4NjAsIDB4RDAsIDB4NjQsIDB4MEUsIDB4NjAsIDB4NEIsIDB4RkIsIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsCisJIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MjcsIDB4NDMsIDB4MDYsIDB4QTMsIDB4QkQsIDB4RDMsIDB4N0YsIDB4RkIsCisJIDB4QkQsIDB4RDMsIDB4ODAsIDB4RkIsIDB4QTMsIDB4RDMsIDB4ODEsIDB4RkIsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MDEsIDB4NjAsIDB4MDQsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4REEsIDB4NjAsIDB4NEEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QjksIDB4RjEsIDB4MEUsIDB4NjAsIDB4NEIsIDB4RjksIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4RkUsIDB4NjAsCisJIDB4RkYsIDB4NjEsIDB4QTEsIDB4ODQsIDB4NUEsIDB4RDEsIDB4NEEsIDB4REIsIDB4QTEsIDB4ODQsIDB4NUEsIDB4REIsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4RDksIDB4NjAsCisJIDB4Q0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsIDB4N0QsIDB4RjEsIDB4MzIsIDB4NjAsCisJIDB4N0EsIDB4NjEsIDB4QTEsIDB4RDMsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NTksIDB4RDMsIDB4MzIsIDB4NjAsIDB4N0UsIDB4NjEsIDB4RkQsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4QUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4REIsIDB4NUUsIDB4RjUsIDB4RUEsIDB4RjEsIDB4MkYsIDB4RjgsIDB4RUIsIDB4RjEsCisJIDB4MzAsIDB4RjgsIDB4RUMsIDB4RjEsIDB4MzEsIDB4RjgsIDB4QjksIDB4RjEsIDB4MTksIDB4RjgsIDB4ODAsIDB4N0UsIDB4RjgsIDB4N0YsIDB4MEUsIDB4RkEsCisJIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4QTYsIDB4RjEsIDB4MDcsIDB4RjgsIDB4MkIsIDB4RkEsIDB4QjAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MjcsIDB4NDMsCisJIDB4MDYsIDB4QTMsIDB4QkQsIDB4RDEsIDB4MkMsIDB4RjgsIDB4MzIsIDB4RjgsIDB4QkQsIDB4RDEsIDB4MkQsIDB4RjgsIDB4MzMsIDB4RjgsIDB4QTMsIDB4RDEsCisJIDB4MkUsIDB4RjgsIDB4MzQsIDB4RjgsIDB4MDYsIDB4NjMsIDB4M0YsIDB4RkMsIDB4MjAsIDB4NjAsIDB4MTYsIDB4NjEsIDB4REIsIDB4RjMsIDB4QTEsIDB4RDMsCisJIDB4MDMsIDB4QTgsIDB4QUMsIDB4ODMsIDB4MEUsIDB4MDIsIDB4MEQsIDB4MDMsIDB4MjAsIDB4NjAsIDB4MTgsIDB4NjEsIDB4QTEsIDB4RDEsIDB4NjYsIDB4NDUsCisJIDB4MDAsIDB4RjQsIDB4MDksIDB4RkMsIDB4MDEsIDB4NjQsIDB4MEEsIDB4RkEsIDB4MEIsIDB4RjgsIDB4MjAsIDB4NjAsIDB4MTYsIDB4NjEsIDB4QTEsIDB4REYsCisJIDB4MjUsIDB4MDAsIDB4MTYsIDB4NjAsIDB4QzMsIDB4RjMsIDB4NjYsIDB4NDUsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MTUsIDB4MDAsCisJIDB4MDIsIDB4MzYsIDB4QkQsIDB4MDAsIDB4MDMsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MDQsIDB4MzYsIDB4MEYsIDB4MDAsIDB4MDUsIDB4MzYsIDB4QjcsIDB4MDAsCisJIDB4MDYsIDB4MzYsIDB4MDEsIDB4MDAsIDB4MEEsIDB4MDAsIDB4ODAsIDB4NjQsIDB4MDksIDB4RkEsIDB4MDEsIDB4NjMsIDB4MEEsIDB4RkMsIDB4MDAsIDB4NjQsCisJIDB4MEIsIDB4RkEsIDB4ODAsIDB4NjAsIDB4RjQsIDB4NjIsIDB4QTIsIDB4REYsIDB4MDksIDB4MDAsIDB4MDAsIDB4NjQsIDB4MDksIDB4RkEsIDB4MDEsIDB4NjMsCisJIDB4MEEsIDB4RkMsIDB4MDAsIDB4NjQsIDB4MEIsIDB4RkEsIDB4ODAsIDB4NjAsIDB4RjQsIDB4NjIsIDB4QTIsIDB4REYsIDB4MjUsIDB4NjAsIDB4Q0UsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4NjUsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4MDAsIDB4NjYsIDB4REIsIDB4RjMsIDB4NDYsIDB4NDYsIDB4RkQsIDB4QTAsIDB4QzEsIDB4RkUsIDB4MDIsIDB4MDIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4NjQsIDB4NjgsIDB4RkIsIDB4NDMsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEUsIDB4NjAsIDB4MzgsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4QTQsIDB4QTIsIDB4REIsIDB4MEUsIDB4NjAsIDB4MzgsIDB4RjEsIDB4MEUsIDB4NjAsIDB4NEIsIDB4RjksIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MEMsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4REIsIDB4NjAsIDB4MDAsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4NTUsIDB4MDMsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NjgsIDB4RkIsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDYsCisJIDB4MDAsIDB4RjQsIDB4MDksIDB4RjIsIDB4MEEsIDB4RjIsIDB4MDAsIDB4QTgsIDB4MEIsIDB4RjIsIDB4MDIsIDB4QTgsIDB4MTYsIDB4MDIsIDB4MDAsIDB4QTgsCisJIDB4MUEsIDB4MDIsIDB4MTksIDB4MDIsIDB4MjYsIDB4NDYsIDB4MjYsIDB4NjAsIDB4MUEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDMsIDB4MDAsIDB4REMsIDB4NjAsCisJIDB4RjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTMsIDB4NjAsIDB4NjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDksIDB4RjIsIDB4MEEsIDB4RjIsIDB4ODAsIDB4QTgsCisJIDB4MEIsIDB4RjIsIDB4MDIsIDB4QTgsIDB4RTQsIDB4MDMsIDB4NDQsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEIsIDB4RjIsIDB4MjYsIDB4NDYsCisJIDB4NDAsIDB4NTksIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsIDB4MkYsIDB4RjIsIDB4QTEsIDB4REIsIDB4MzAsIDB4RjIsIDB4NDEsIDB4NTgsIDB4NTksIDB4REIsCisJIDB4MzEsIDB4RjIsIDB4NTksIDB4REIsIDB4MjYsIDB4NDYsIDB4MjYsIDB4NjAsIDB4MUEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MDMsIDB4NjUsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RTcsIDB4NjAsIDB4MEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4RkIsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4MDAsIDB4NjQsIDB4NjgsIDB4RkIsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjAsIDB4NDAsIDB4MDgsIDB4MkEsCisJIDB4MDMsIDB4MDAsIDB4RDksIDB4NjAsIDB4Q0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTIsIDB4NjAsIDB4NzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjMsCisJIDB4MDksIDB4RkMsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MTQsIDB4MDAsIDB4MTYsIDB4NjAsIDB4QzIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MEIsIDB4MzYsIDB4MDMsIDB4MDAsIDB4REEsIDB4NjAsIDB4QzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjQsIDB4QTIsIDB4REIsIDB4MEIsIDB4NjQsCisJIDB4MTksIDB4NjAsIDB4QTQsIDB4RkIsIDB4QTYsIDB4RjEsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MjIsIDB4NjQsIDB4M0EsIDB4RkEsIDB4NjEsIDB4NDYsCisJIDB4MDEsIDB4NjQsIDB4MEEsIDB4RkEsIDB4MDAsIDB4NjQsIDB4MEIsIDB4RkEsIDB4MDEsIDB4NjQsIDB4NDAsIDB4NjAsIDB4N0EsIDB4RkIsIDB4MDEsIDB4NjQsCisJIDB4NjgsIDB4RkIsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsCisJIDB4MEQsIDB4RkIsIDB4NjUsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDAsIDB4NjYsCisJIDB4REIsIDB4RjMsIDB4NDYsIDB4NDYsIDB4RkQsIDB4QTAsIDB4QzEsIDB4RkUsIDB4MDIsIDB4MDIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsCisJIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjAsCisJIDB4MEMsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4REIsIDB4NjAsIDB4QjksIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4M0EsIDB4MDMsCisJIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NjgsIDB4RkIsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MDksIDB4RjIsIDB4MEEsIDB4RjIsCisJIDB4MDEsIDB4QTgsIDB4MEIsIDB4RjIsIDB4MDIsIDB4QTgsIDB4MDQsIDB4MDIsIDB4MDAsIDB4QTgsIDB4MDIsIDB4MDIsIDB4MDEsIDB4MDIsIDB4MzEsIDB4MDAsCisJIDB4REMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4RjIsIDB4MjYsIDB4NDYsIDB4NDAsIDB4NTksIDB4MDIsIDB4NjAsCisJIDB4MDAsIDB4NjEsIDB4MkYsIDB4RjIsIDB4QTEsIDB4REIsIDB4MzAsIDB4RjIsIDB4NDEsIDB4NTgsIDB4NTksIDB4REIsIDB4MzEsIDB4RjIsIDB4NTksIDB4REIsCisJIDB4MjYsIDB4NDYsIDB4MjYsIDB4NjAsIDB4MUEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MDMsIDB4NjUsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTcsIDB4NjAsCisJIDB4MEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4REMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NjgsIDB4RkIsCisJIDB4MjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDMsIDB4MDAsIDB4RDksIDB4NjAsIDB4Q0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTIsIDB4NjAsIDB4NzMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MkEsIDB4RjIsIDB4MkYsIDB4RjAsIDB4QjQsIDB4ODQsIDB4MkEsIDB4RkEsCisJIDB4MkMsIDB4RjgsIDB4MzIsIDB4RjgsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzMsIDB4RkEsIDB4MzEsIDB4RjIsIDB4MkUsIDB4RkEsIDB4MzQsIDB4RkEsCisJIDB4RUEsIDB4RjMsIDB4MkYsIDB4RkEsIDB4RUIsIDB4RjMsIDB4MzAsIDB4RkEsIDB4RUMsIDB4RjMsIDB4MzEsIDB4RkEsIDB4QzksIDB4RjEsIDB4MTksIDB4RjgsCisJIDB4MUMsIDB4RjAsIDB4MTMsIDB4RjgsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjQsIDB4MEEsIDB4RkEsIDB4MDAsIDB4NjQsCisJIDB4MEIsIDB4RkEsIDB4MDEsIDB4NjMsIDB4NjgsIDB4RkQsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjUsIDB4NjAsCisJIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4MDAsIDB4NjYsIDB4REIsIDB4RjMsIDB4NDYsIDB4NDYsIDB4RkQsIDB4QTAsIDB4QzEsIDB4RkUsIDB4MDIsIDB4MDIsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MEMsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4REMsIDB4NjAsIDB4NTMsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QTAsIDB4ODAsCisJIDB4OUMsIDB4ODQsIDB4NTAsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsCisJIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NjgsIDB4RkIsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsCisJIDB4MDksIDB4RjIsIDB4MEEsIDB4RjIsIDB4MDEsIDB4QTgsIDB4MEIsIDB4RjIsIDB4MDQsIDB4QTgsIDB4MUEsIDB4MDIsIDB4MDAsIDB4QTgsIDB4MTgsIDB4MDIsCisJIDB4MTcsIDB4MDIsIDB4REMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MjYsIDB4NjAsIDB4MUEsIDB4NjQsCisJIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MjAsIDB4NDAsCisJIDB4MDgsIDB4MkEsIDB4MDMsIDB4MDAsIDB4REMsIDB4NjAsIDB4RjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTMsIDB4NjAsIDB4NjksIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4RjIsIDB4MjYsIDB4NDYsIDB4NDAsIDB4NTksIDB4MDIsIDB4NjAsCisJIDB4MDAsIDB4NjEsIDB4MkYsIDB4RjIsIDB4QTEsIDB4REIsIDB4MzAsIDB4RjIsIDB4NDEsIDB4NTgsIDB4NTksIDB4REIsIDB4MzEsIDB4RjIsIDB4NTksIDB4REIsCisJIDB4MjYsIDB4NDYsIDB4MjYsIDB4NjAsIDB4MUEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MDMsIDB4NjUsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTcsIDB4NjAsCisJIDB4MEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4REMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NjgsIDB4RkIsCisJIDB4MjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDMsIDB4MDAsIDB4RDksIDB4NjAsIDB4Q0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTIsIDB4NjAsIDB4NzMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4QTQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MEIsIDB4M0EsIDB4MDYsIDB4MDAsIDB4MEIsIDB4NjQsCisJIDB4MTYsIDB4NjAsIDB4QzIsIDB4RkIsIDB4MzMsIDB4NjAsIDB4NDgsIDB4NjIsIDB4QTIsIDB4REYsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsCisJIDB4QzIsIDB4RjEsIDB4QTUsIDB4RDIsIDB4NjQsIDB4NDAsIDB4MEIsIDB4MkEsIDB4MjAsIDB4MDAsIDB4ODUsIDB4MzYsIDB4MEIsIDB4MDAsIDB4MzIsIDB4M0EsCisJIDB4MUUsIDB4MDAsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4MDIsIDB4QTQsIDB4QzQsIDB4ODUsIDB4QTUsIDB4RDIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4ODUsIDB4M0EsIDB4MTUsIDB4MDAsIDB4NjUsIDB4NDQsIDB4MEEsIDB4QTQsIDB4QTAsIDB4RDAsIDB4MzMsIDB4NjAsIDB4NDYsIDB4NjIsIDB4NjQsIDB4NDAsCisJIDB4MTgsIDB4MjYsIDB4MDksIDB4MDAsIDB4QTIsIDB4REYsIDB4MDEsIDB4NjQsIDB4MTYsIDB4NjAsIDB4QzIsIDB4RkIsIDB4MzIsIDB4NDEsIDB4MDgsIDB4NjUsCisJIDB4QjUsIDB4ODEsIDB4NDEsIDB4NTIsIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjQsIDB4QTIsIDB4REIsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MzMsIDB4NjAsCisJIDB4NDYsIDB4NjIsIDB4QTIsIDB4REYsIDB4MDEsIDB4NjQsIDB4MTYsIDB4NjAsIDB4QzIsIDB4RkIsIDB4RjcsIDB4MDEsIDB4NDUsIDB4NjQsIDB4M0IsIDB4NDIsCisJIDB4NUEsIDB4REIsIDB4MzUsIDB4NjAsIDB4QUEsIDB4N0MsIDB4MzUsIDB4NjAsIDB4OTgsIDB4NjMsIDB4QTMsIDB4RDksIDB4NjQsIDB4NDEsIDB4MkYsIDB4NjAsCisJIDB4MDIsIDB4NjMsIDB4QkQsIDB4RDMsIDB4MDAsIDB4N0MsIDB4MDMsIDB4MUIsIDB4MjcsIDB4NDMsIDB4MTAsIDB4QTMsIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDUsIDB4NjQsIDB4NUYsIDB4QTEsIDB4REIsIDB4NjUsIDB4NDQsIDB4QkQsIDB4RDEsIDB4QzgsIDB4ODQsIDB4NTksIDB4RDgsIDB4RkMsIDB4MDUsCisJIDB4MjcsIDB4NDEsIDB4MTAsIDB4QTEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4QzEsIDB4ODEsIDB4MDEsIDB4MjYsIDB4REQsIDB4ODEsIDB4NDEsIDB4NEMsCisJIDB4NTksIDB4RDEsIDB4N0MsIDB4NDQsIDB4QjAsIDB4ODQsIDB4NTksIDB4RDEsIDB4NTksIDB4RDEsIDB4QjAsIDB4ODQsIDB4QjAsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MDIsIDB4NjcsIDB4NDQsIDB4QzIsIDB4MDAsIDB4MzQsIDB4NjAsIDB4NUMsIDB4NjMsIDB4RDksIDB4ODEsIDB4NTksIDB4RDMsIDB4MzgsIDB4NjAsCisJIDB4MTAsIDB4NjIsIDB4MDAsIDB4QkMsIDB4QTIsIDB4REYsIDB4MDksIDB4MDMsIDB4MDEsIDB4N0MsIDB4QTIsIDB4RDksIDB4MzAsIDB4NjAsIDB4MTQsIDB4NjQsCisJIDB4QkQsIDB4REEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4QkQsIDB4REEsIDB4NTgsIDB4MDAsIDB4REQsIDB4NjAsIDB4MTgsIDB4NjQsIDB4QkQsIDB4REEsCisJIDB4NTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QkQsIDB4REEsIDB4MDEsIDB4NjAsIDB4RjIsIDB4NjQsIDB4QkQsIDB4REEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsCisJIDB4QkQsIDB4REEsIDB4MkMsIDB4NDEsIDB4NTksIDB4RDMsIDB4NTAsIDB4NjAsIDB4MDAsIDB4N0MsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4MDEsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MEUsIDB4MDAsIDB4MDQsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDIsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MDksIDB4MDAsCisJIDB4MTAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDQsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDUsIDB4NjAsCisJIDB4RjIsIDB4NjQsIDB4QkQsIDB4RDksIDB4QkQsIDB4REIsIDB4MDEsIDB4NjQsIDB4QkQsIDB4REIsIDB4NTksIDB4RDMsIDB4NTAsIDB4NjAsIDB4MDAsIDB4N0MsCisJIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MEUsIDB4MDAsIDB4MDQsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4MDIsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MDksIDB4MDAsIDB4MTAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDQsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MDQsIDB4MDAsCisJIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDUsIDB4NjAsIDB4RjIsIDB4NjQsIDB4QkQsIDB4RDksIDB4QkQsIDB4REIsIDB4MDEsIDB4NjQsIDB4QkQsIDB4REIsCisJIDB4NTksIDB4RDMsIDB4NTAsIDB4NjAsIDB4MDAsIDB4N0MsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4NjAsIDB4RjIsIDB4NjQsCisJIDB4MDksIDB4MDAsIDB4MDIsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MkEsIDB4MDIsIDB4MDAsCisJIDB4MDIsIDB4NjAsIDB4RjIsIDB4NjQsIDB4QkQsIDB4RDksIDB4QkQsIDB4REIsIDB4NEIsIDB4MDAsIDB4MkMsIDB4NDEsIDB4NTksIDB4RDMsIDB4MEYsIDB4NjAsCisJIDB4MDAsIDB4N0MsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjAsIDB4QUMsIDB4NjQsIDB4MEUsIDB4MDAsIDB4MDQsIDB4MkEsCisJIDB4MDMsIDB4MDAsIDB4MDIsIDB4NjAsIDB4QUMsIDB4NjQsIDB4MDksIDB4MDAsIDB4MTAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDQsIDB4NjAsIDB4QUMsIDB4NjQsCisJIDB4MDQsIDB4MDAsIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDUsIDB4NjAsIDB4QUMsIDB4NjQsIDB4QkQsIDB4RDksIDB4QkQsIDB4REIsIDB4MDEsIDB4NjQsCisJIDB4QkQsIDB4REIsIDB4NTksIDB4RDMsIDB4MEYsIDB4NjAsIDB4MDAsIDB4N0MsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjAsCisJIDB4QUMsIDB4NjQsIDB4MEUsIDB4MDAsIDB4MDQsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDIsIDB4NjAsIDB4QUMsIDB4NjQsIDB4MDksIDB4MDAsIDB4MTAsIDB4MkEsCisJIDB4MDMsIDB4MDAsIDB4MDQsIDB4NjAsIDB4QUMsIDB4NjQsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDUsIDB4NjAsIDB4QUMsIDB4NjQsCisJIDB4QkQsIDB4RDksIDB4QkQsIDB4REIsIDB4MDEsIDB4NjQsIDB4QkQsIDB4REIsIDB4NTksIDB4RDMsIDB4MEYsIDB4NjAsIDB4MDAsIDB4N0MsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4NjAsIDB4QUMsIDB4NjQsIDB4MDksIDB4MDAsIDB4MDIsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjAsCisJIDB4QUMsIDB4NjQsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MkEsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjAsIDB4QUMsIDB4NjQsIDB4QkQsIDB4RDksIDB4QkQsIDB4REIsCisJIDB4MUMsIDB4NjAsIDB4MDgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MTgsIDB4MUEsIDB4NjAsIDB4MkQsIDB4RjMsIDB4MDMsIDB4MDAsIDB4MUEsIDB4NjAsCisJIDB4MUQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QkQsIDB4REEsIDB4MzQsIDB4NjAsIDB4NUMsIDB4NjQsIDB4MUEsIDB4NjAsIDB4Q0YsIDB4RkIsIDB4NUYsIDB4RjUsCisJIDB4MDAsIDB4NjQsIDB4MkIsIDB4RkEsIDB4MDAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MjcsIDB4NDMsIDB4MDYsIDB4QTMsIDB4QkQsIDB4RDEsIDB4MkMsIDB4RjgsCisJIDB4MzIsIDB4RjgsIDB4QkQsIDB4RDEsIDB4MkQsIDB4RjgsIDB4MzMsIDB4RjgsIDB4QTMsIDB4RDEsIDB4MkUsIDB4RjgsIDB4MzQsIDB4RjgsIDB4MDAsIDB4RjQsCisJIDB4MDEsIDB4NjMsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MTAsIDB4QkIsIDB4MTYsIDB4NjAsIDB4QzIsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsCisJIDB4RkUsIDB4MjYsIDB4MTAsIDB4QkIsIDB4N0QsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MEEsIDB4MDAsIDB4MTksIDB4NjAsCisJIDB4NDUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MjIsIDB4MjAsIDB4QkIsIDB4NjMsIDB4NDQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4N0YsCisJIDB4NjAsIDB4NDMsIDB4MDksIDB4RkMsIDB4MjcsIDB4NDIsIDB4MEMsIDB4QTIsIDB4MkQsIDB4NjAsIDB4NUEsIDB4NjMsIDB4QTIsIDB4RDMsIDB4QTMsIDB4RDMsCisJIDB4MDAsIDB4QkQsIDB4MDEsIDB4NjMsIDB4QUMsIDB4ODEsIDB4MDksIDB4MDMsIDB4MDgsIDB4MDMsIDB4QjgsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MTUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4QjgsIDB4MDEsIDB4NjMsIDB4MDEsIDB4MDMsIDB4NjAsIDB4NDMsIDB4MEUsIDB4NjAsIDB4MzUsIDB4RkQsIDB4MTIsIDB4NjEsCisJIDB4NTksIDB4REMsIDB4MTYsIDB4NjAsIDB4QzIsIDB4RjMsIDB4RkYsIDB4NjAsIDB4RkYsIDB4N0MsIDB4NjAsIDB4NDAsIDB4MEIsIDB4MkEsIDB4MDIsIDB4MDAsCisJIDB4MzMsIDB4NjAsIDB4MjgsIDB4N0MsIDB4MUEsIDB4NjAsIDB4RDAsIDB4RjksIDB4MzUsIDB4NjAsIDB4OTgsIDB4NjQsIDB4NDAsIDB4NDgsIDB4RDksIDB4ODEsCisJIDB4RkYsIDB4NjAsIDB4RjIsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUYsIDB4RjUsIDB4M0YsIDB4RkMsCisJIDB4REIsIDB4ODMsIDB4MUEsIDB4NjAsIDB4NEMsIDB4RkQsIDB4MDAsIDB4N0MsIDB4NUEsIDB4RDksIDB4NjMsIDB4NDEsIDB4MzQsIDB4NjAsIDB4OUMsIDB4NjMsCisJIDB4MTIsIDB4NjUsIDB4MDAsIDB4RjQsIDB4Q0QsIDB4ODQsIDB4NEMsIDB4OTEsIDB4NjAsIDB4NDMsIDB4NjAsIDB4RkUsIDB4QTUsIDB4RDIsIDB4REUsIDB4ODUsCisJIDB4N0YsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4NUQsIDB4OTMsIDB4QTMsIDB4REIsIDB4NUQsIDB4OTMsIDB4QTUsIDB4RDIsCisJIDB4RjYsIDB4MUYsIDB4NUQsIDB4OTMsIDB4MjAsIDB4RkUsIDB4REYsIDB4ODMsIDB4NUYsIDB4RjUsIDB4MjUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsCisJIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDAsIDB4NjYsCisJIDB4NDYsIDB4NDYsIDB4QzEsIDB4RkUsIDB4MDYsIDB4NjQsIDB4NjgsIDB4RkIsIDB4NDYsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MUMsIDB4NjAsCisJIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjAsCisJIDB4MUMsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4REUsIDB4NjAsIDB4ODQsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4REUsIDB4NjAsIDB4Q0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4RjYsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsCisJIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MEEsIDB4RjIsIDB4MDAsIDB4NjMsIDB4MDAsIDB4QTgsIDB4NjgsIDB4RkQsIDB4MDYsIDB4MDIsCisJIDB4MDksIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QjAsIDB4MDEsIDB4N0MsIDB4NUEsIDB4MDIsIDB4MEEsIDB4RjgsIDB4MEEsIDB4RjIsIDB4MjYsIDB4NDYsCisJIDB4NDAsIDB4NTksIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsIDB4MkYsIDB4RjIsIDB4QTEsIDB4REIsIDB4MzAsIDB4RjIsIDB4NDEsIDB4NTgsIDB4NTksIDB4REIsCisJIDB4MzEsIDB4RjIsIDB4NTksIDB4REIsIDB4MjYsIDB4NDYsIDB4MjYsIDB4NjAsIDB4MUEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MDUsIDB4NjUsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RTcsIDB4NjAsIDB4MEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDcsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4RDksIDB4NjAsCisJIDB4Q0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MjAsIDB4MDMsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MjYsIDB4NjAsIDB4MUEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MDAsIDB4NjQsIDB4NjgsIDB4RkIsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4NDksIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4REEsIDB4NjAsIDB4NjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsCisJIDB4RkIsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjQsIDB4NjgsIDB4RkIsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4NEEsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4RDksIDB4NjAsIDB4Q0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDgsIDB4NjQsCisJIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEMsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4RkYsIDB4QjEsIDB4RkYsIDB4QTEsIDB4NjAsIDB4NDcsCisJIDB4RkYsIDB4QjQsIDB4OUIsIDB4MDIsIDB4OUEsIDB4MDMsIDB4MzQsIDB4NjAsIDB4RjQsIDB4NjMsIDB4MTAsIDB4NjQsIDB4QkQsIDB4REIsIDB4NjYsIDB4NDUsCisJIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjIsIDB4MzQsIDB4NjAsIDB4RjIsIDB4NjEsIDB4QzIsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDQsIDB4M0UsIDB4NjQsCisJIDB4NjUsIDB4NDYsIDB4MDIsIDB4QTQsIDB4QTEsIDB4REIsIDB4QzgsIDB4ODEsIDB4MTIsIDB4NjUsIDB4Q0QsIDB4ODQsIDB4NEMsIDB4OTEsIDB4NjAsIDB4NDMsCisJIDB4NjAsIDB4RkUsIDB4QTUsIDB4RDIsIDB4REUsIDB4ODUsIDB4N0YsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4NUQsIDB4OTMsCisJIDB4QTMsIDB4REIsIDB4NUQsIDB4OTMsIDB4QTUsIDB4RDIsIDB4RjYsIDB4MUYsIDB4NUQsIDB4OTMsIDB4MjAsIDB4RkUsIDB4REYsIDB4ODMsIDB4MEMsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4MUEsIDB4NjUsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4QzQsIDB4ODUsIDB4REMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDcsIDB4QjQsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsCisJIDB4RkQsIDB4MDIsIDB4NjEsIDB4NDQsIDB4OTQsIDB4RkIsIDB4MjcsIDB4NDUsIDB4MDIsIDB4NjIsIDB4NDYsIDB4RDMsIDB4NUEsIDB4RDEsIDB4NjAsIDB4NDcsCisJIDB4NTYsIDB4RkIsIDB4NjQsIDB4NDcsIDB4NTUsIDB4RkIsIDB4MDAsIDB4NjQsIDB4NUIsIDB4RkIsIDB4MEMsIDB4NjIsIDB4NDYsIDB4RDMsIDB4N0UsIDB4RkIsCisJIDB4MEIsIDB4RjAsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4ODMsIDB4RkIsIDB4MjYsIDB4NDYsIDB4MzIsIDB4RjAsIDB4N0YsIDB4RjksCisJIDB4MzMsIDB4RjAsIDB4MEUsIDB4NjMsIDB4QzcsIDB4ODEsIDB4ODAsIDB4RjksIDB4MzQsIDB4RjAsIDB4ODEsIDB4RjksIDB4NTksIDB4RDEsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDQsIDB4MDEsIDB4MkEsIDB4QzgsIDB4ODQsIDB4NjAsIDB4NDMsIDB4MzMsIDB4NjAsIDB4QkMsIDB4NjQsIDB4NTgsIDB4RDksIDB4NTksIDB4RDEsCisJIDB4NTgsIDB4RDksIDB4RkQsIDB4MUYsIDB4MTYsIDB4NjAsIDB4QzIsIDB4RjEsIDB4NTksIDB4RDMsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MjIsIDB4NjQsCisJIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4NTAsIDB4OTQsIDB4QTYsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NDQsIDB4NDcsIDB4QTcsIDB4NDYsIDB4M0EsIDB4RkEsCisJIDB4QkIsIDB4RkMsIDB4QTcsIDB4NDYsIDB4MEUsIDB4NjAsIDB4MzUsIDB4RjMsIDB4ODUsIDB4RkIsIDB4MkUsIDB4NjAsIDB4MkUsIDB4NjQsIDB4MkQsIDB4NjAsCisJIDB4OEEsIDB4NjMsIDB4QTAsIDB4RDEsIDB4QTMsIDB4RDksIDB4NjQsIDB4NDEsIDB4NTgsIDB4RDEsIDB4NUIsIDB4RDksIDB4N0QsIDB4RjMsIDB4NjYsIDB4NDUsCisJIDB4QTYsIDB4RjUsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDgsIDB4MDAsIDB4OTEsIDB4RkEsIDB4NjEsIDB4NDQsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4QUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTIsIDB4RkEsIDB4MDcsIDB4MDAsIDB4MTEsIDB4RjgsIDB4NjQsIDB4NDQsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4QUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTIsIDB4RkEsIDB4NjUsIDB4NDYsIDB4MzEsIDB4RjIsIDB4MUQsIDB4NjAsIDB4QzAsIDB4NjUsIDB4NjAsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsCisJIDB4NjEsIDB4NDYsIDB4MzEsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MzAsIDB4RjAsCisJIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MkYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4QTYsIDB4RjMsIDB4MDgsIDB4RkUsCisJIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4QTYsIDB4RjEsIDB4RkYsIDB4RkYsIDB4RDMsIDB4ODAsIDB4MzEsIDB4RjIsIDB4MjcsIDB4MDIsIDB4NjYsIDB4NDEsCisJIDB4MUQsIDB4NjAsIDB4QzAsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4QTYsIDB4RjEsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjQsIDB4NDMsCisJIDB4MTEsIDB4MTgsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MUIsIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjAsCisJIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NjUsIDB4NDMsIDB4ODAsIDB4RjAsIDB4MDEsIDB4RkEsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsCisJIDB4ODAsIDB4RjgsIDB4MEIsIDB4MDAsIDB4NjQsIDB4NDYsIDB4NjIsIDB4NDMsIDB4MDAsIDB4RjIsIDB4QTMsIDB4REIsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjAsCisJIDB4ODEsIDB4RkMsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4NDMsIDB4NEIsIDB4MDEsIDB4NjUsCisJIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4REQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDMsIDB4NDcsIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsCisJIDB4RkEsIDB4QTMsIDB4MDAsIDB4NjAsIDB4MTcsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjUsIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NEMsCisJIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QkIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NjQsCisJIDB4NDAsIDB4NEEsIDB4NjAsIDB4RkUsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4NjAsIDB4NDEsIDB4RkUsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4MkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjUsIDB4MDAsIDB4NjQsIDB4MTksIDB4NjAsIDB4M0IsIDB4RkIsCisJIDB4MDIsIDB4MDAsIDB4MjAsIDB4RkUsIDB4RkYsIDB4NjUsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsCisJIDB4NjAsIDB4NDEsIDB4MjAsIDB4RkUsIDB4Q0QsIDB4ODEsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MkEsIDB4MzksIDB4MDAsIDB4N0YsIDB4QjQsIDB4MDIsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjQsIDB4MkUsIDB4MDAsIDB4MDQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjQsIDB4MkEsIDB4MDAsIDB4MEIsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjQsIDB4MjYsIDB4MDAsIDB4MTYsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjQsIDB4MjIsIDB4MDAsIDB4MEMsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MTAsIDB4NjQsIDB4MUUsIDB4MDAsIDB4MTIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MjAsIDB4NjQsIDB4MUEsIDB4MDAsIDB4MTgsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4NDAsIDB4NjQsIDB4MTYsIDB4MDAsIDB4MjQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4ODAsIDB4NjQsIDB4MTIsIDB4MDAsIDB4MzAsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjcsIDB4MEUsIDB4MDAsIDB4NDgsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjcsIDB4MEEsIDB4MDAsIDB4NjAsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjcsIDB4MDYsIDB4MDAsIDB4NkMsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjcsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjQsCisJIDB4MDAsIDB4MDAsIDB4MTksIDB4NjAsIDB4M0IsIDB4RjEsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsIDB4MTksIDB4NjAsIDB4M0IsIDB4RkIsIDB4NjEsIDB4NDAsCisJIDB4MDAsIDB4MzYsIDB4MDUsIDB4MDAsIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4QkIsIDB4MDEsIDB4NjUsIDB4NDAsCisJIDB4MDAsIDB4M0EsIDB4MUUsIDB4MDAsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsIDB4RkEsIDB4QTMsIDB4MDAsIDB4NjAsCisJIDB4MTcsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MzIsIDB4NjUsIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NEMsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QkIsIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDMsIDB4NjAsIDB4RkUsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsCisJIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4NjAsIDB4NDEsIDB4RkUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OTEsIDB4MDEsCisJIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjUsIDB4RkMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDQsIDB4MDAsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsCisJIDB4MzcsIDB4NjAsIDB4RjgsIDB4NjEsIDB4QTEsIDB4RDEsIDB4QTEsIDB4RjMsIDB4MDEsIDB4NjAsIDB4QUMsIDB4NjMsIDB4NjAsIDB4NDUsIDB4MkEsIDB4NDQsCisJIDB4NzksIDB4RkIsIDB4QTMsIDB4RDUsIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NUIsIDB4RDUsIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NTksIDB4RDEsCisJIDB4NjYsIDB4NDEsIDB4QTAsIDB4ODQsIDB4MjQsIDB4OTQsIDB4MkIsIDB4NDYsIDB4MEYsIDB4RkEsIDB4N0EsIDB4RkIsIDB4MTYsIDB4NjQsIDB4MTIsIDB4RkEsCisJIDB4MDEsIDB4NjQsIDB4MTEsIDB4RkEsIDB4NjYsIDB4NUMsIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUEsIDB4NjAsCisJIDB4MjIsIDB4RjMsIDB4MUEsIDB4NjAsIDB4MjEsIDB4RjEsIDB4NjAsIDB4NDcsIDB4QjAsIDB4ODQsIDB4MUMsIDB4NjAsIDB4MDgsIDB4RjEsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MTgsIDB4ODAsIDB4QkMsIDB4MTYsIDB4NjAsIDB4QzIsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MjIsIDB4NjQsCisJIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4NTAsIDB4OTQsIDB4QTcsIDB4NDYsIDB4M0EsIDB4RkEsIDB4QkIsIDB4RkMsIDB4QTcsIDB4NDYsIDB4ODAsIDB4NjAsCisJIDB4MDMsIDB4NjUsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDMsIDB4NjUsIDB4QTcsIDB4NDYsIDB4MDYsIDB4RjAsIDB4N0YsIDB4NjAsIDB4RkYsIDB4NjQsCisJIDB4QTAsIDB4ODQsIDB4QjQsIDB4ODQsIDB4MDYsIDB4RkEsIDB4QkIsIDB4RkMsIDB4QTcsIDB4NDYsIDB4MjYsIDB4NDYsIDB4MkYsIDB4RjAsIDB4MzAsIDB4RjAsCisJIDB4NjQsIDB4NDMsIDB4MzEsIDB4RjIsIDB4MjcsIDB4NDYsIDB4MDMsIDB4RkMsIDB4MDQsIDB4RjgsIDB4MDUsIDB4RkEsIDB4MjYsIDB4NDYsIDB4RDksIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4QUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MjYsIDB4NjAsIDB4MUEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MDEsIDB4NjQsIDB4OEEsIDB4RkIsIDB4MTYsIDB4NjAsCisJIDB4QzksIDB4RjMsIDB4MjAsIDB4NDEsIDB4MDAsIDB4QkMsIDB4MjAsIDB4QjksIDB4MDEsIDB4MDMsIDB4NDEsIDB4NDAsIDB4MjAsIDB4NjAsIDB4MTQsIDB4NjEsCisJIDB4QTEsIDB4REYsIDB4MDQsIDB4NjQsIDB4QzEsIDB4RkUsIDB4REIsIDB4RkIsIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4RjEsIDB4RkIsCisJIDB4RjcsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDEsIDB4NjUsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MzMsIDB4NjAsIDB4RTYsIDB4NjUsIDB4QTUsIDB4REYsIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MEMsIDB4NjQsIDB4NjgsIDB4RkIsIDB4MDAsIDB4NjAsIDB4MzEsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsCisJIDB4RTEsIDB4NjAsIDB4MzYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjgsIDB4RkIsCisJIDB4RTEsIDB4NjAsIDB4RjcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MjcsIDB4RkIsIDB4NUEsIDB4REIsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsCisJIDB4MEYsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MUIsIDB4NjAsIDB4RkUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MUIsIDB4RTcsIDB4NjAsCisJIDB4MkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTcsIDB4NjAsIDB4MkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTEsIDB4NjAsIDB4RTcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4RjgsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QTYsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4QTQsIDB4NjAsIDB4NDMsIDB4NjYsIDB4NDEsIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsIDB4ODEsIDB4RjAsCisJIDB4MDIsIDB4MTgsIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsIDB4MUQsIDB4NjAsIDB4QzAsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RjgsIDB4QTYsIDB4RjMsIDB4NjMsIDB4NDUsIDB4NjAsIDB4NDYsCisJIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsIDB4RkEsIDB4MDQsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RkEsCisJIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4NEIsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsIDB4OTUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTAsIDB4QjAsCisJIDB4RkYsIDB4RkYsIDB4MTEsIDB4MDMsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RTEsIDB4NjAsIDB4OUIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjksIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MTEsIDB4MDMsCisJIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDIsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RTEsIDB4NjAsIDB4QjEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjQsIDB4NjgsIDB4RkIsIDB4RTIsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4MTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsIDB4OEEsIDB4RkIsIDB4MDIsIDB4NjQsIDB4QzEsIDB4RkUsIDB4REIsIDB4RkIsCisJIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QkMsIDB4RjEsIDB4RkIsIDB4MDIsIDB4NjUsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QzMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDMsIDB4NjAsIDB4RTgsIDB4NjMsIDB4MEUsIDB4NjAsIDB4MzYsIDB4RkQsIDB4MDgsIDB4NjAsIDB4NzcsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MTMsIDB4MUIsIDB4MTYsIDB4NjAsIDB4Q0MsIDB4RjMsIDB4MDAsIDB4NjEsIDB4NjAsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDAsIDB4QjksIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MzYsIDB4MDEsIDB4QjksIDB4NjAsIDB4NDAsIDB4MDIsIDB4MzYsIDB4MDYsIDB4QjksIDB4NjAsIDB4NDAsIDB4MDMsIDB4MzYsIDB4MDcsIDB4QjksCisJIDB4NDEsIDB4NDQsIDB4RDQsIDB4NjAsIDB4RjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDMsIDB4NjAsIDB4RDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsCisJIDB4MjAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjQsIDB4NDYsIDB4MDEsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4MDAsIDB4NjMsIDB4NjgsIDB4RkQsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MzAsIDB4MDAsIDB4MjAsIDB4NDAsCisJIDB4MDYsIDB4MjMsIDB4MTAsIDB4MDAsIDB4MDgsIDB4NjAsIDB4MjcsIDB4RjEsIDB4N0YsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjgsIDB4RkIsIDB4RTEsIDB4NjAsIDB4RjcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjcsIDB4RkIsIDB4NUEsIDB4REIsIDB4MTAsIDB4NjAsIDB4NEUsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NDQsIDB4MDEsIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NjgsIDB4RkIsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MDEsIDB4NjQsIDB4OEEsIDB4RkIsIDB4RkYsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NTAsIDB4NjQsCisJIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsIDB4OTUsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MTEsIDB4MDMsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RTIsIDB4NjAsCisJIDB4MkEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QjksIDB4RjEsIDB4MEUsIDB4NjAsIDB4NEIsIDB4RjksCisJIDB4N0QsIDB4RjEsIDB4N0MsIDB4RjksIDB4MDIsIDB4NjQsIDB4OEEsIDB4RkIsIDB4RkYsIDB4RkYsIDB4QzEsIDB4RkUsIDB4OEEsIDB4RjMsIDB4MDAsIDB4NjUsCisJIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MEUsIDB4MDMsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RTIsIDB4NjAsIDB4NEEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NTEsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4MUIsIDB4NjAsIDB4QjAsIDB4NjQsIDB4NjcsIDB4RkIsIDB4MUMsIDB4NjAsIDB4NzIsIDB4NjMsIDB4N0YsIDB4RjMsIDB4QkQsIDB4REIsIDB4ODAsIDB4RjMsCisJIDB4QkQsIDB4REIsIDB4ODEsIDB4RjMsIDB4QTMsIDB4REIsIDB4NjcsIDB4RjMsIDB4MDAsIDB4NjAsIDB4ODYsIDB4RjEsIDB4MDQsIDB4QTQsIDB4NjcsIDB4RkIsCisJIDB4RDAsIDB4ODAsIDB4QTAsIDB4RDMsIDB4MUYsIDB4MDcsIDB4NDAsIDB4NDcsIDB4NjAsIDB4NDEsIDB4MEUsIDB4NjUsIDB4NDUsIDB4RDMsIDB4MTYsIDB4NjAsCisJIDB4QzIsIDB4RjEsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MUIsIDB4MTAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4RUQsIDB4MDIsIDB4MjcsIDB4NDQsIDB4MDYsIDB4QTQsCisJIDB4NjAsIDB4NDEsIDB4QTEsIDB4RDEsIDB4N0YsIDB4RjMsIDB4ODAsIDB4RjEsIDB4RDAsIDB4ODAsIDB4NTksIDB4RDMsIDB4MDgsIDB4MDIsIDB4RDAsIDB4ODAsCisJIDB4ODEsIDB4RjMsIDB4NTksIDB4RDEsIDB4MDQsIDB4MDIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4RTIsIDB4NjAsCisJIDB4RTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4NzIsIDB4NjMsIDB4QkQsIDB4RDMsIDB4N0YsIDB4RkIsIDB4QkQsIDB4RDMsIDB4ODAsIDB4RkIsCisJIDB4QTMsIDB4RDMsIDB4ODEsIDB4RkIsIDB4NTMsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RTIsIDB4NjAsCisJIDB4OUEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0MsIDB4RjEsIDB4N0QsIDB4RjksIDB4MTMsIDB4NjAsCisJIDB4MUEsIDB4RjksIDB4MEUsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MTYsIDB4RkIsIDB4RTIsIDB4NjAsIDB4QzcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsCisJIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDEsIDB4NjMsIDB4OEEsIDB4RkQsIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4MDAsIDB4NjAsCisJIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4QzEsIDB4RkUsIDB4NTQsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4MzEsIDB4NDQsIDB4RjksIDB4QjQsIDB4NDAsIDB4NTEsIDB4RTEsIDB4NjAsIDB4MjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDMsIDB4MzMsIDB4NjAsCisJIDB4QkUsIDB4NjUsIDB4QTUsIDB4RDMsIDB4NjUsIDB4NDEsIDB4MTAsIDB4QTMsIDB4MDEsIDB4QTQsIDB4RkUsIDB4QjQsIDB4QzQsIDB4ODUsIDB4RkUsIDB4QTEsCisJIDB4QkQsIDB4RDMsIDB4NTksIDB4RDEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RDUsIDB4ODAsIDB4MDIsIDB4MDIsIDB4MDQsIDB4MDMsIDB4RjgsIDB4MDEsCisJIDB4RTIsIDB4NjAsIDB4NzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTUsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsCisJIDB4RTIsIDB4NjAsIDB4RkUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RDEsIDB4N0QsIDB4RjksCisJIDB4MTMsIDB4NjAsIDB4MUEsIDB4RjksIDB4MEUsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RTMsIDB4NjAsIDB4MjAsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4NDAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDcsIDB4NjAsIDB4RDAsIDB4NjQsIDB4MEUsIDB4NjAsIDB4NEIsIDB4RkIsCisJIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsCisJIDB4MjcsIDB4NDMsIDB4MDYsIDB4QTMsIDB4QkQsIDB4RDMsIDB4N0YsIDB4RkIsIDB4QkQsIDB4RDMsIDB4ODAsIDB4RkIsIDB4QTMsIDB4RDMsIDB4ODEsIDB4RkIsCisJIDB4MzEsIDB4NDQsIDB4RjksIDB4QjQsIDB4NDAsIDB4NTEsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDEsIDB4NjAsCisJIDB4MDQsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RTMsIDB4NjAsIDB4NTEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4QjksIDB4RjEsIDB4MEUsIDB4NjAsIDB4NEIsIDB4RjksIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4RkUsIDB4NjAsIDB4RkYsIDB4NjEsCisJIDB4QTEsIDB4ODQsIDB4NUEsIDB4RDEsIDB4NEEsIDB4REIsIDB4QTEsIDB4ODQsIDB4NUEsIDB4REIsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDAsIDB4NjAsCisJIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4RTIsIDB4NjAsIDB4NzMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4N0QsIDB4RjEsIDB4MzIsIDB4NjAsIDB4N0EsIDB4NjEsIDB4QTEsIDB4RDMsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NTksIDB4RDMsCisJIDB4MzIsIDB4NjAsIDB4N0UsIDB4NjEsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4REIsIDB4MjcsIDB4NDIsCisJIDB4MEMsIDB4QTIsIDB4QTIsIDB4RDMsIDB4MTYsIDB4NjAsIDB4QUQsIDB4RjMsIDB4MDAsIDB4QkQsIDB4MDEsIDB4NjMsIDB4QUMsIDB4ODEsIDB4MDksIDB4MDMsCisJIDB4MDgsIDB4MDMsIDB4QjgsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QjgsIDB4MDEsIDB4NjMsIDB4MDEsIDB4MDMsCisJIDB4NjAsIDB4NDMsIDB4MEUsIDB4NjAsIDB4MzUsIDB4RkQsIDB4NUYsIDB4RjUsIDB4MDAsIDB4NjQsIDB4MkIsIDB4RkEsIDB4MjAsIDB4NjQsIDB4MkEsIDB4RkEsCisJIDB4MjcsIDB4NDMsIDB4MDYsIDB4QTMsIDB4QkQsIDB4RDEsIDB4MkMsIDB4RjgsIDB4MzIsIDB4RjgsIDB4QkQsIDB4RDEsIDB4MkQsIDB4RjgsIDB4MzMsIDB4RjgsCisJIDB4QTMsIDB4RDEsIDB4MkUsIDB4RjgsIDB4MzQsIDB4RjgsIDB4RUEsIDB4RjEsIDB4MkYsIDB4RjgsIDB4RUIsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUMsIDB4RjEsCisJIDB4MzEsIDB4RjgsIDB4QjksIDB4RjEsIDB4MTksIDB4RjgsIDB4RjgsIDB4NjAsIDB4ODAsIDB4NjQsIDB4MEUsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDEsIDB4NjMsCisJIDB4MzIsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MTAsIDB4QkIsIDB4MTYsIDB4NjAsIDB4QzIsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4RkUsIDB4MjYsCisJIDB4MTAsIDB4QkIsIDB4N0QsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MEEsIDB4MDAsIDB4MTksIDB4NjAsIDB4NDUsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MjIsIDB4MjAsIDB4QkIsIDB4NjMsIDB4NDQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4N0YsIDB4NjAsIDB4NDMsCisJIDB4MDksIDB4RkMsIDB4MEUsIDB4NjAsIDB4MzUsIDB4RjMsIDB4MTIsIDB4NjEsIDB4NTksIDB4REEsIDB4MUMsIDB4NjAsIDB4NzIsIDB4NjMsIDB4QkQsIDB4RDEsCisJIDB4NTksIDB4RDgsIDB4QkQsIDB4RDEsIDB4NTksIDB4RDgsIDB4QTMsIDB4RDEsIDB4NTksIDB4RDgsIDB4MzUsIDB4NjAsIDB4OTgsIDB4NjQsIDB4NDAsIDB4NDgsCisJIDB4RDksIDB4ODEsIDB4RkYsIDB4NjAsIDB4RjIsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUYsIDB4RjUsCisJIDB4M0YsIDB4RkMsIDB4REIsIDB4ODMsIDB4MUEsIDB4NjAsIDB4NEMsIDB4RkQsIDB4MjAsIDB4N0MsIDB4NUEsIDB4RDksIDB4NjMsIDB4NDEsIDB4MzQsIDB4NjAsCisJIDB4OUMsIDB4NjMsIDB4MTIsIDB4NjUsIDB4MDAsIDB4RjQsIDB4Q0QsIDB4ODQsIDB4NEMsIDB4OTEsIDB4NjAsIDB4NDMsIDB4NjAsIDB4RkUsIDB4QTUsIDB4RDIsCisJIDB4REUsIDB4ODUsIDB4N0YsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4NUQsIDB4OTMsIDB4QTMsIDB4REIsIDB4NUQsIDB4OTMsCisJIDB4QTUsIDB4RDIsIDB4RjYsIDB4MUYsIDB4NUQsIDB4OTMsIDB4MjAsIDB4RkUsIDB4REYsIDB4ODMsIDB4NUYsIDB4RjUsIDB4MjUsIDB4NjAsIDB4Q0UsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4QzEsIDB4RkUsIDB4MTYsIDB4NjQsIDB4NjgsIDB4RkIsIDB4NTYsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4MEUsIDB4NjAsIDB4MzgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjQsIDB4QTQsIDB4QTIsIDB4REIsIDB4MEUsIDB4NjAsIDB4MzgsIDB4RjEsIDB4MEUsIDB4NjAsCisJIDB4NEIsIDB4RjksIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MUMsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RTQsIDB4NjAsIDB4MjMsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsCisJIDB4OUMsIDB4ODQsIDB4MEUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NTcsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MDAsIDB4NjQsCisJIDB4NjgsIDB4RkIsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTIsIDB4NjAsIDB4NzMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MTYsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MUMsIDB4NjAsCisJIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4NTgsIDB4NjQsCisJIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MDAsIDB4NjQsIDB4NjgsIDB4RkIsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4RTYsIDB4NjAsIDB4MzYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4M0QsIDB4MDMsCisJIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NjgsIDB4RkIsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MEEsIDB4RjIsIDB4MDksIDB4RjIsIDB4MDQsIDB4MUIsIDB4MDEsIDB4QjAsIDB4MDEsIDB4N0MsIDB4MkQsIDB4MDIsCisJIDB4MEEsIDB4RjgsIDB4NTksIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4MEEsIDB4RjIsIDB4MjYsIDB4NDYsIDB4NDAsIDB4NTksIDB4MDIsIDB4NjAsCisJIDB4MDAsIDB4NjEsIDB4MkYsIDB4RjIsIDB4QTEsIDB4REIsIDB4MzAsIDB4RjIsIDB4NDEsIDB4NTgsIDB4NTksIDB4REIsIDB4MzEsIDB4RjIsIDB4NTksIDB4REIsCisJIDB4MjYsIDB4NDYsIDB4MjYsIDB4NjAsIDB4MUEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MDUsIDB4NjUsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTcsIDB4NjAsCisJIDB4MEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTIsIDB4NjAsIDB4NzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUEsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4NzgsIDB4NDMsIDB4MDIsIDB4NjEsIDB4MjksIDB4NjAsIDB4RUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUIsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsCisJIDB4MEMsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4RkYsIDB4QjEsIDB4RkYsIDB4QTEsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4QzgsIDB4MDIsCisJIDB4QzcsIDB4MDMsIDB4MzQsIDB4NjAsIDB4RjQsIDB4NjMsIDB4MzAsIDB4NjQsIDB4QkQsIDB4REIsIDB4NjYsIDB4NDUsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjIsCisJIDB4MzQsIDB4NjAsIDB4RjIsIDB4NjEsIDB4QzIsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDQsIDB4M0UsIDB4NjQsIDB4NjUsIDB4NDYsIDB4MDIsIDB4QTQsCisJIDB4QTEsIDB4REIsIDB4QzgsIDB4ODEsIDB4MTIsIDB4NjUsIDB4Q0QsIDB4ODQsIDB4NEMsIDB4OTEsIDB4NjAsIDB4NDMsIDB4NjAsIDB4RkUsIDB4QTUsIDB4RDIsCisJIDB4REUsIDB4ODUsIDB4N0YsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4NUQsIDB4OTMsIDB4QTMsIDB4REIsIDB4NUQsIDB4OTMsCisJIDB4QTUsIDB4RDIsIDB4RjYsIDB4MUYsIDB4NUQsIDB4OTMsIDB4MjAsIDB4RkUsIDB4REYsIDB4ODMsIDB4MEMsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MUEsIDB4NjUsCisJIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4QzQsIDB4ODUsIDB4REMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4MDcsIDB4QjQsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsIDB4NjEsIDB4NDQsCisJIDB4OTQsIDB4RkIsIDB4MjcsIDB4NDUsIDB4MDIsIDB4NjIsIDB4NDYsIDB4RDMsIDB4NUEsIDB4RDEsIDB4NjAsIDB4NDcsIDB4NTYsIDB4RkIsIDB4NjQsIDB4NDcsCisJIDB4NTUsIDB4RkIsIDB4MDAsIDB4NjQsIDB4NUIsIDB4RkIsIDB4MEMsIDB4NjIsIDB4NDYsIDB4RDMsIDB4N0UsIDB4RkIsIDB4MEIsIDB4RjAsIDB4MEYsIDB4NjAsCisJIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4ODMsIDB4RkIsIDB4MUMsIDB4NjAsIDB4NkEsIDB4NjIsIDB4QTIsIDB4RDMsIDB4ODUsIDB4RkIsIDB4MjYsIDB4NDYsCisJIDB4MzIsIDB4RjAsIDB4N0YsIDB4RjksIDB4MzMsIDB4RjAsIDB4ODAsIDB4RjksIDB4MzQsIDB4RjAsIDB4ODEsIDB4RjksIDB4MkUsIDB4NjAsIDB4MkUsIDB4NjQsCisJIDB4MkQsIDB4NjAsIDB4OEEsIDB4NjMsIDB4QTAsIDB4RDEsIDB4QTMsIDB4RDksIDB4NjQsIDB4NDEsIDB4NTgsIDB4RDEsIDB4NUIsIDB4RDksIDB4N0QsIDB4RjMsCisJIDB4NjYsIDB4NDUsIDB4QTYsIDB4RjUsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDgsIDB4MDAsIDB4OTEsIDB4RkEsIDB4NjEsIDB4NDQsIDB4RkQsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4QUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTIsIDB4RkEsIDB4MDcsIDB4MDAsIDB4MTEsIDB4RjgsIDB4NjQsIDB4NDQsIDB4RkQsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4QUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTIsIDB4RkEsIDB4NjUsIDB4NDYsIDB4QTYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QTQsCisJIDB4NDAsIDB4NEIsIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsIDB4RkEsIDB4QTMsIDB4MDAsIDB4NjAsIDB4MTcsIDB4NjEsIDB4MDAsIDB4NjAsCisJIDB4MDEsIDB4NjUsIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NEMsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4QkIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NEEsIDB4NjAsIDB4RkUsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsCisJIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4NjAsIDB4NDEsIDB4RkUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsCisJIDB4MDAsIDB4NjUsIDB4MDAsIDB4NjQsIDB4MTksIDB4NjAsIDB4M0IsIDB4RkIsIDB4MDIsIDB4MDAsIDB4MjAsIDB4RkUsIDB4RkYsIDB4NjUsIDB4MDIsIDB4NjAsCisJIDB4MDAsIDB4NjMsIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4NjAsIDB4NDEsIDB4MjAsIDB4RkUsIDB4Q0QsIDB4ODEsIDB4NjAsIDB4NDAsCisJIDB4ODAsIDB4MkEsIDB4MzksIDB4MDAsIDB4N0YsIDB4QjQsIDB4MDIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjQsIDB4MkUsIDB4MDAsIDB4MDQsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjQsIDB4MkEsIDB4MDAsIDB4MEIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjQsIDB4MjYsIDB4MDAsIDB4MTYsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjQsIDB4MjIsIDB4MDAsIDB4MEMsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTAsIDB4NjQsIDB4MUUsIDB4MDAsIDB4MTIsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MjAsIDB4NjQsIDB4MUEsIDB4MDAsIDB4MTgsIDB4M0EsIDB4MDIsIDB4MDAsIDB4NDAsIDB4NjQsIDB4MTYsIDB4MDAsIDB4MjQsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4ODAsIDB4NjQsIDB4MTIsIDB4MDAsIDB4MzAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjcsIDB4MEUsIDB4MDAsIDB4NDgsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjcsIDB4MEEsIDB4MDAsIDB4NjAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjcsIDB4MDYsIDB4MDAsIDB4NkMsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjcsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MTksIDB4NjAsIDB4M0IsIDB4RjEsIDB4RkYsIDB4RkYsCisJIDB4QjAsIDB4ODQsIDB4MTksIDB4NjAsIDB4M0IsIDB4RkIsIDB4NjEsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDUsIDB4MDAsIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4QkIsIDB4MDEsIDB4NjUsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MUUsIDB4MDAsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjIsCisJIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsIDB4RkEsIDB4QTMsIDB4MDAsIDB4NjAsIDB4MTcsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MzIsIDB4NjUsIDB4MDEsIDB4NjAsCisJIDB4RkYsIDB4NjQsIDB4NDAsIDB4NEMsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QkIsIDB4RkYsIDB4RkYsCisJIDB4MEIsIDB4MDMsIDB4NjAsIDB4RkUsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4NjAsIDB4NDEsIDB4RkUsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4MkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OTEsIDB4MDEsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjUsIDB4RkMsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDQsIDB4MDAsIDB4RkQsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4MTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MzcsIDB4NjAsIDB4RjgsIDB4NjEsIDB4QTEsIDB4RDEsIDB4QTEsIDB4RjMsCisJIDB4MDEsIDB4NjAsIDB4QUMsIDB4NjMsIDB4NjAsIDB4NDUsIDB4MkEsIDB4NDQsIDB4NzksIDB4RkIsIDB4QTMsIDB4RDUsIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjcsCisJIDB4NUIsIDB4RDUsIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NTksIDB4RDEsIDB4NjYsIDB4NDEsIDB4QTAsIDB4ODQsIDB4MjQsIDB4OTQsIDB4MkIsIDB4NDYsCisJIDB4MEYsIDB4RkEsIDB4N0EsIDB4RkIsIDB4MTYsIDB4NjQsIDB4MTIsIDB4RkEsIDB4MDEsIDB4NjQsIDB4MTEsIDB4RkEsIDB4NjYsIDB4NUMsIDB4QzIsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4NkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QTQsIDB4NDAsIDB4NEIsIDB4NjAsIDB4NDYsCisJIDB4MDAsIDB4NjQsIDB4MTcsIDB4RkEsIDB4MDAsIDB4NjQsIDB4MTYsIDB4RkEsIDB4MTMsIDB4RkEsIDB4MDAsIDB4NjUsIDB4MjYsIDB4NDYsIDB4RkQsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4REQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTYsIDB4RjMsIDB4MUQsIDB4NjAsIDB4QzAsIDB4NjUsIDB4MDIsIDB4QTQsIDB4NjAsIDB4NDYsCisJIDB4MDUsIDB4RjAsIDB4NjAsIDB4NDEsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4MDAsIDB4N0MsIDB4NDQsIDB4RDksIDB4MjYsIDB4NDYsCisJIDB4MzEsIDB4RjIsIDB4NjEsIDB4NUMsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksIDB4MjYsIDB4NDYsIDB4MkYsIDB4RjAsCisJIDB4NjEsIDB4NDYsIDB4MDMsIDB4RjgsIDB4MjYsIDB4NDYsIDB4MzAsIDB4RjAsIDB4NjEsIDB4NDYsIDB4MDQsIDB4RjgsIDB4MjYsIDB4NDYsIDB4MzEsIDB4RjAsCisJIDB4NjEsIDB4NDYsIDB4MDUsIDB4RjgsIDB4MjYsIDB4NDYsIDB4RDksIDB4NjAsIDB4NTgsIDB4NEUsIDB4QUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4MjYsIDB4NjAsIDB4MUEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsCisJIDB4NDYsIDB4NDYsIDB4MDMsIDB4NjUsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjMsIDB4OEEsIDB4RkQsCisJIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4QzEsIDB4RkUsCisJIDB4NUMsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4RTEsIDB4NjAsIDB4MjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4RjcsIDB4NjUsCisJIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4REEsIDB4NjAsIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4REIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkQsIDB4QTAsCisJIDB4MkEsIDB4RjIsIDB4MDMsIDB4MDMsIDB4RTYsIDB4NjAsIDB4REUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4QjAsIDB4MzYsIDB4MTEsIDB4MDAsCisJIDB4QzAsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MjYsIDB4NjAsIDB4MUEsIDB4NjQsIDB4NDAsIDB4NEIsCisJIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4REEsIDB4NjAsIDB4NzQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDUsIDB4MDAsIDB4RjQsIDB4MEEsIDB4RjIsIDB4MEIsIDB4RjIsIDB4RkUsIDB4QTAsIDB4RjMsIDB4QTAsIDB4NjcsIDB4MDIsCisJIDB4NjAsIDB4NDEsIDB4MDksIDB4RjIsIDB4MUQsIDB4MDMsIDB4MDAsIDB4QTAsIDB4RkYsIDB4QTAsIDB4NEIsIDB4MDMsIDB4NUQsIDB4MDMsIDB4MDAsIDB4QTAsCisJIDB4RkYsIDB4RkYsIDB4NDcsIDB4MDMsIDB4MDEsIDB4NjQsIDB4MTAsIDB4NjAsIDB4MEIsIDB4RkIsIDB4MEQsIDB4NjQsIDB4MTAsIDB4NjAsIDB4MEMsIDB4RkIsCisJIDB4MDMsIDB4NjQsIDB4MTAsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjYsIDB4NDYsIDB4MjYsIDB4NjAsIDB4MUEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4REEsIDB4NjAsIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTYsIDB4NjAsIDB4QzMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QTAsIDB4MjAsIDB4NjAsIDB4MTYsIDB4NjEsIDB4MTUsIDB4MDIsIDB4MDEsIDB4NjQsCisJIDB4QTEsIDB4REIsIDB4MDAsIDB4NjQsIDB4MTAsIDB4NjAsIDB4MEMsIDB4RkIsIDB4MDEsIDB4NjQsIDB4MTAsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjYsIDB4NDYsCisJIDB4MjYsIDB4NjAsIDB4MUEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsCisJIDB4NDYsIDB4NDYsIDB4REEsIDB4NjAsIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsIDB4QTEsIDB4REIsIDB4MDAsIDB4NjQsIDB4MTAsIDB4NjAsCisJIDB4MEMsIDB4RkIsIDB4MDEsIDB4NjQsIDB4MTAsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjYsIDB4NDYsIDB4MjYsIDB4NjAsIDB4MUEsIDB4NjQsIDB4NDAsIDB4NEIsCisJIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4REEsIDB4NjAsIDB4NzQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDYsIDB4MDcsIDB4RjQsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDEsIDB4N0UsIDB4MDYsIDB4RkEsIDB4NjUsIDB4NDYsCisJIDB4MjYsIDB4NDYsIDB4MjYsIDB4NjAsIDB4MUEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4REMsIDB4NjAsIDB4MDksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4RjIsCisJIDB4MDksIDB4RjIsIDB4RkMsIDB4QTAsIDB4RkYsIDB4QTAsIDB4MTEsIDB4MDIsIDB4MEEsIDB4MDIsIDB4MEIsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MEEsIDB4MUIsCisJIDB4NjYsIDB4NDEsIDB4MDcsIDB4RjQsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDEsIDB4N0UsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4REEsIDB4NjAsCisJIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDYsIDB4NjgsIDB4RjEsIDB4MkEsIDB4RjIsCisJIDB4NjQsIDB4NDEsIDB4NjAsIDB4NDAsIDB4QTAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDgsIDB4QjEsIDB4MDQsIDB4MDAsIDB4QzAsIDB4M0EsIDB4MEIsIDB4MDAsCisJIDB4MDQsIDB4QjEsIDB4RkYsIDB4RkYsIDB4MUUsIDB4MDMsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTYsIDB4MDAsIDB4QjAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjUsIDB4MDcsIDB4MDAsIDB4MTAsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjUsIDB4MDMsIDB4MDAsIDB4MzAsIDB4M0EsIDB4MEMsIDB4MDAsIDB4MTAsIDB4NjUsIDB4QTUsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4MDMsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MDAsIDB4NjYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsIDB4QzMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTAsIDB4RkYsIDB4RkYsCisJIDB4MTQsIDB4MDQsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RTcsIDB4NjAsIDB4MUIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4QTUsIDB4RjEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4REEsIDB4NjAsIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4RDksIDB4NjAsIDB4Q0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTIsIDB4NjAsIDB4NzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NEUsIDB4NjQsIDB4M0IsIDB4NDIsCisJIDB4NUEsIDB4REIsIDB4MkUsIDB4RjUsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RjIsIDB4MUQsIDB4NjAsIDB4QzAsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsCisJIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjYsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4QTYsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsCisJIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjIsIDB4MjYsIDB4RjAsIDB4QTcsIDB4RjIsIDB4QTgsIDB4RjAsIDB4NjUsIDB4RjUsIDB4RkYsIDB4RkYsIDB4MDAsIDB4RjQsCisJIDB4RkYsIDB4RkYsIDB4ODksIDB4RjgsIDB4NjUsIDB4RjUsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RkMsIDB4MkMsIDB4RkEsIDB4MkQsIDB4RjgsIDB4QUUsIDB4RkEsCisJIDB4RUEsIDB4RjMsIDB4MkYsIDB4RkEsIDB4RUIsIDB4RjMsIDB4MzAsIDB4RkEsIDB4RUMsIDB4RjMsIDB4MzEsIDB4RkEsIDB4N0YsIDB4RjMsIDB4MzIsIDB4RkEsCisJIDB4ODAsIDB4RjMsIDB4MzMsIDB4RkEsIDB4ODEsIDB4RjMsIDB4MzQsIDB4RkEsIDB4MUIsIDB4NjAsIDB4RkUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MUIsCisJIDB4MDAsIDB4NjAsIDB4QTAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MDIsIDB4NjMsIDB4M0YsIDB4RkMsCisJIDB4QUIsIDB4RkMsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4QzksIDB4RjEsIDB4MTksIDB4RjgsIDB4MjUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsCisJIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDAsIDB4NjYsCisJIDB4NDYsIDB4NDYsIDB4QzEsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4RTEsIDB4NjAsIDB4MzQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4M0EsIDB4NjEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsCisJIDB4NjEsIDB4RkIsIDB4QTYsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MEMsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QjksIDB4RjEsIDB4MTksIDB4RjgsIDB4MEUsIDB4RkEsCisJIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4M0YsIDB4RkEsIDB4MDAsIDB4NjAsIDB4M0EsIDB4NjEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4NjAsIDB4RkIsIDB4QTYsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MEMsIDB4NjAsIDB4ODAsIDB4NjQsIDB4MEUsIDB4RkEsCisJIDB4QjksIDB4RjEsIDB4MTksIDB4RjgsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4M0YsIDB4RkEsIDB4RTgsIDB4NjAsIDB4RUEsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MzMsIDB4RkIsIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTAsIDB4RkIsIDB4RTcsIDB4NjAsIDB4Q0IsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsIDB4ODcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QTgsIDB4MDMsIDB4QTgsCisJIDB4MDQsIDB4MDMsIDB4MDMsIDB4MDMsIDB4RTgsIDB4NjAsIDB4REMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjAsIDB4NDQsCisJIDB4MzQsIDB4ODAsIDB4MTAsIDB4NjAsIDB4MUUsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4OUIsIDB4RkUsIDB4MDMsIDB4MDUsIDB4MjAsIDB4NDAsCisJIDB4NEIsIDB4MjMsIDB4MEEsIDB4MDAsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTAsIDB4RkIsIDB4RTcsIDB4NjAsIDB4RDksIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MTMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MDcsIDB4MDAsIDB4OTAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MDQsIDB4MDAsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsIDB4OEEsIDB4RjMsIDB4NTgsIDB4RkIsIDB4ODIsIDB4RjEsCisJIDB4QkEsIDB4RkUsIDB4MDEsIDB4QTgsIDB4NTksIDB4RjksIDB4MDQsIDB4MDIsIDB4MDIsIDB4NjQsIDB4OEEsIDB4RkIsIDB4RkYsIDB4RkYsIDB4QzEsIDB4RkUsCisJIDB4NjQsIDB4NDcsIDB4REIsIDB4RjMsIDB4MTAsIDB4QjAsIDB4MDQsIDB4QTgsIDB4MkIsIDB4MDIsIDB4MkEsIDB4MDIsIDB4NjEsIDB4RjUsIDB4RUEsIDB4RjEsCisJIDB4MkYsIDB4RjgsIDB4RUIsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUMsIDB4RjEsIDB4MzEsIDB4RjgsIDB4N0YsIDB4RjEsIDB4MkMsIDB4RjgsIDB4MzIsIDB4RjgsCisJIDB4ODAsIDB4RjEsIDB4MkQsIDB4RjgsIDB4MzMsIDB4RjgsIDB4ODEsIDB4RjEsIDB4MkUsIDB4RjgsIDB4MzQsIDB4RjgsIDB4MTAsIDB4NjAsIDB4NDgsIDB4NjQsCisJIDB4MkEsIDB4RkEsIDB4MjUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTAsIDB4RkIsCisJIDB4RTgsIDB4NjAsIDB4MzYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjcsIDB4ODIsIDB4RkIsCisJIDB4OEEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4MDMsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MTAsIDB4RkIsIDB4RTgsIDB4NjAsIDB4MzgsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsCisJIDB4MUUsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDUsIDB4N0MsIDB4NTMsIDB4RjksIDB4MkYsIDB4NjAsIDB4MjQsIDB4NjQsIDB4NTQsIDB4RkIsCisJIDB4MTksIDB4NjAsIDB4NDAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTUsIDB4MTgsIDB4MTAsIDB4NjAsIDB4MUUsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MDgsIDB4NjAsIDB4MTIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTAsIDB4RkIsIDB4RTgsIDB4NjAsIDB4NjksIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4NDEsIDB4RjMsIDB4RkYsIDB4NjAsIDB4ODAsIDB4NjUsIDB4QTQsIDB4ODAsIDB4NUEsIDB4RDMsIDB4MDUsIDB4MDIsCisJIDB4MDQsIDB4MUIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MUIsIDB4MTUsIDB4MDAsIDB4MTAsIDB4NjAsIDB4MUUsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MDgsIDB4NjAsIDB4MTIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTAsIDB4RkIsIDB4RTgsIDB4NjAsIDB4OEEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NTksIDB4RjMsIDB4ODIsIDB4RkIsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MjcsIDB4REEsIDB4RkUsCisJIDB4REIsIDB4RjMsIDB4MDAsIDB4QTgsIDB4MDQsIDB4QTgsIDB4MjMsIDB4MDIsIDB4MjIsIDB4MDIsIDB4NjAsIDB4RjUsIDB4RUEsIDB4RjEsIDB4MkYsIDB4RjgsCisJIDB4RUIsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUMsIDB4RjEsIDB4MzEsIDB4RjgsIDB4N0YsIDB4RjEsIDB4MkMsIDB4RjgsIDB4ODAsIDB4RjEsIDB4MkQsIDB4RjgsCisJIDB4ODEsIDB4RjEsIDB4MkUsIDB4RjgsIDB4QTQsIDB4NjQsIDB4MkEsIDB4RkEsIDB4ODMsIDB4RjEsIDB4QzAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4MkIsIDB4RkEsCisJIDB4MjUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsIDB4MDAsIDB4NjAsCisJIDB4MDQsIDB4NjEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjQsIDB4MjMsIDB4RkEsIDB4RjEsIDB4NjAsCisJIDB4MDIsIDB4NjQsIDB4MjQsIDB4RkEsIDB4MjYsIDB4NjAsIDB4MEEsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4RUIsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsCisJIDB4MjQsIDB4ODAsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4NTgsIDB4RjMsIDB4OEEsIDB4RkIsIDB4RkYsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MUUsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTAsIDB4RkIsIDB4RTcsIDB4NjAsIDB4Q0IsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4OUMsIDB4RjEsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODYsIDB4OUMsIDB4RkIsIDB4MDcsIDB4MDMsIDB4MjYsIDB4NjAsCisJIDB4MUEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RUIsIDB4NjAsIDB4RkYsIDB4NjUsCisJIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MTAsIDB4NjAsIDB4MUUsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTAsIDB4RkIsIDB4RTcsIDB4NjAsIDB4Q0IsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4OTUsIDB4RjMsIDB4MjYsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDEsIDB4MkEsIDB4MjAsIDB4MDAsIDB4MEYsIDB4RjIsIDB4MkEsIDB4RjAsIDB4NjAsIDB4NDAsCisJIDB4MTAsIDB4MkEsIDB4MEYsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MTgsIDB4MDAsIDB4RkQsIDB4QjMsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MjcsCisJIDB4MDIsIDB4QkIsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MEIsIDB4MDAsIDB4RkIsIDB4QjMsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MjcsIDB4MDQsIDB4QkIsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsCisJIDB4MTAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4OTUsIDB4RkQsIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4REIsIDB4RjMsIDB4M0YsIDB4RjIsIDB4MDQsIDB4QTgsIDB4NTcsIDB4RkIsIDB4MDIsIDB4MDMsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4RjQsCisJIDB4MUUsIDB4NjMsIDB4MDgsIDB4NjQsIDB4NDAsIDB4NDgsIDB4QkQsIDB4RDIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MDUsIDB4MzYsIDB4MEIsIDB4MDAsCisJIDB4RkYsIDB4QjUsIDB4QzcsIDB4ODMsIDB4MDEsIDB4MkEsIDB4RjcsIDB4MDEsIDB4NEYsIDB4RDIsIDB4NUIsIDB4RDIsIDB4NjAsIDB4NDAsIDB4MDUsIDB4MzcsCisJIDB4MEIsIDB4MDAsIDB4REYsIDB4ODMsIDB4RjUsIDB4MDEsIDB4RkYsIDB4QjUsIDB4NjUsIDB4NDEsIDB4QTMsIDB4RDIsIDB4NDcsIDB4OEEsIDB4NjAsIDB4NDcsCisJIDB4NDAsIDB4NEMsIDB4NUIsIDB4RDIsIDB4REYsIDB4ODMsIDB4MDgsIDB4MDAsIDB4NDAsIDB4NEMsIDB4MDAsIDB4N0YsIDB4REMsIDB4ODUsIDB4NDcsIDB4OEEsCisJIDB4NjAsIDB4NDEsIDB4NUIsIDB4RDIsIDB4REIsIDB4ODMsIDB4NjAsIDB4NDcsIDB4MDEsIDB4QjAsIDB4RkUsIDB4QjUsIDB4MDIsIDB4MDMsIDB4MDIsIDB4NjQsCisJIDB4NDAsIDB4NDgsIDB4MkMsIDB4NDcsIDB4RkYsIDB4QjQsIDB4NzMsIDB4RjEsIDB4MDgsIDB4MjgsIDB4NzMsIDB4RkIsIDB4ODMsIDB4RjEsIDB4NjUsIDB4NDQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RkQsIDB4QTEsIDB4RTEsIDB4ODEsIDB4RTEsIDB4ODEsIDB4RTEsIDB4ODUsIDB4QzQsIDB4ODEsCisJIDB4RDAsIDB4ODQsIDB4RDEsIDB4ODAsIDB4MjgsIDB4MDcsIDB4MjcsIDB4MDYsIDB4OUMsIDB4ODQsIDB4REMsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODUsIDB4OTQsIDB4RjMsIDB4QzcsIDB4ODMsIDB4MDEsIDB4MjYsIDB4NjAsIDB4NDcsIDB4QUIsIDB4ODMsIDB4RkMsIDB4QTMsIDB4MDIsIDB4MDAsCisJIDB4MDMsIDB4MDQsIDB4MDAsIDB4RjQsIDB4ODQsIDB4QTMsIDB4RkMsIDB4MDEsIDB4ODAsIDB4NjUsIDB4NDcsIDB4RDAsIDB4MjgsIDB4NDEsIDB4QTAsIDB4ODAsCisJIDB4RkUsIDB4QTEsIDB4MTQsIDB4MDMsIDB4MDgsIDB4MDIsIDB4MDgsIDB4NjAsIDB4MkQsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MUIsIDB4MDAsIDB4MDgsIDB4NjAsIDB4MkQsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTMsIDB4MDAsIDB4MjgsIDB4NDEsIDB4RkUsIDB4QTEsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDMsIDB4MDgsIDB4NjAsCisJIDB4MkQsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDcsIDB4MDAsIDB4MDgsIDB4NjAsCisJIDB4MkQsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjMsIDB4OTUsIDB4RkQsIDB4MUMsIDB4NjAsIDB4OUUsIDB4NjMsIDB4MDAsIDB4NjQsIDB4QTMsIDB4REIsCisJIDB4MDYsIDB4QTMsIDB4MTAsIDB4NjAsIDB4OTgsIDB4NjQsIDB4QkQsIDB4REIsIDB4QkQsIDB4REIsIDB4MDYsIDB4NjQsIDB4QTMsIDB4REIsIDB4RTksIDB4NjAsCisJIDB4QjgsIDB4NjQsIDB4MDgsIDB4NjAsIDB4NEIsIDB4RkIsIDB4Q0UsIDB4RjEsIDB4MEUsIDB4NjAsIDB4NTEsIDB4RjksIDB4MUMsIDB4NjAsIDB4QUEsIDB4NjMsCisJIDB4MDAsIDB4NjQsIDB4QTMsIDB4REIsIDB4MDYsIDB4QTMsIDB4MTAsIDB4NjAsIDB4OUMsIDB4NjQsIDB4QkQsIDB4REIsIDB4QkQsIDB4REIsIDB4MDYsIDB4NjQsCisJIDB4QTMsIDB4REIsIDB4RTksIDB4NjAsIDB4QzEsIDB4NjQsIDB4MDgsIDB4NjAsIDB4NEQsIDB4RkIsIDB4MTYsIDB4NjAsIDB4QUUsIDB4RjEsIDB4MEUsIDB4NjAsCisJIDB4NTcsIDB4RjksIDB4MDAsIDB4NjAsIDB4M0EsIDB4NjEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsCisJIDB4NjMsIDB4RkIsIDB4QTYsIDB4RjMsIDB4MDcsIDB4RkEsIDB4QjksIDB4RjMsIDB4MTksIDB4RkEsIDB4RjgsIDB4NjAsIDB4ODAsIDB4NjQsIDB4MEUsIDB4RkEsCisJIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4M0YsIDB4RkEsIDB4MDAsIDB4NjAsIDB4M0EsIDB4NjEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4NjQsIDB4RkIsIDB4QTYsIDB4RjMsIDB4MDcsIDB4RkEsIDB4QjksIDB4RjMsIDB4MTksIDB4RkEsIDB4MjQsIDB4NjAsCisJIDB4ODAsIDB4NjQsIDB4MEUsIDB4RkEsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4M0YsIDB4RkEsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MkQsIDB4RkIsCisJIDB4NUEsIDB4REIsIDB4RUEsIDB4NjAsIDB4MUYsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MzcsIDB4RkIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjMsCisJIDB4OTUsIDB4RkQsIDB4QkEsIDB4RkUsIDB4RkUsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4ODIsIDB4RkQsIDB4MDgsIDB4NjAsCisJIDB4MTUsIDB4RjEsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MUIsIDB4RkIsIDB4NUEsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsIDB4QUIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QTgsCisJIDB4RkYsIDB4RkYsIDB4MDUsIDB4MDMsIDB4MTksIDB4NjAsIDB4RjAsIDB4RjEsIDB4MEUsIDB4NjAsIDB4NTcsIDB4RjksIDB4MDQsIDB4MDAsIDB4MTYsIDB4NjAsCisJIDB4QUUsIDB4RjEsIDB4MEUsIDB4NjAsIDB4NTcsIDB4RjksIDB4MTYsIDB4NjAsIDB4QUIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDksIDB4MUIsIDB4MDAsIDB4NjQsCisJIDB4ODIsIDB4RkIsIDB4QkEsIDB4RkUsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RkIsIDB4NUEsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4QkEsIDB4RkUsIDB4OTUsIDB4RjMsIDB4MDAsIDB4NjMsIDB4ODIsIDB4RkQsIDB4MTAsIDB4QkMsIDB4OTUsIDB4RkIsIDB4RkUsIDB4NjAsIDB4RkYsIDB4NjUsCisJIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MDAsIDB4NjAsIDB4NjQsIDB4NjMsIDB4MEUsIDB4NjAsIDB4MzcsIDB4RkQsIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MDEsIDB4NjAsIDB4MDQsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUEsIDB4NjAsIDB4NzMsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTAsIDB4ODAsCisJIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QTIsIDB4MDEsIDB4MzEsIDB4NDAsIDB4MDQsIDB4MkEsIDB4RTUsIDB4MDEsCisJIDB4MjAsIDB4NDAsIDB4MTIsIDB4MjMsIDB4MTEsIDB4MDAsIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsCisJIDB4NUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4ODEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUEsIDB4NjAsCisJIDB4NzMsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4REQsIDB4MDEsIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsIDB4NjQsIDB4RjUsIDB4QjksIDB4RjEsIDB4MTksIDB4RjgsIDB4N0YsIDB4RjEsCisJIDB4MkMsIDB4RjgsIDB4MzIsIDB4RjgsIDB4ODAsIDB4RjEsIDB4MkQsIDB4RjgsIDB4MzMsIDB4RjgsIDB4ODEsIDB4RjEsIDB4MkUsIDB4RjgsIDB4MzQsIDB4RjgsCisJIDB4RUEsIDB4RjEsIDB4MkYsIDB4RjgsIDB4RUIsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUMsIDB4RjEsIDB4MzEsIDB4RjgsIDB4MTEsIDB4NjAsIDB4NDgsIDB4NjQsCisJIDB4MkEsIDB4RkEsIDB4MDAsIDB4NjQsIDB4MkIsIDB4RkEsIDB4MjMsIDB4RkEsIDB4MjUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsCisJIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjAsCisJIDB4MDEsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUEsIDB4NjAsIDB4QzksIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4RjUsIDB4MjMsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTgsIDB4ODIsIDB4MDEsIDB4MTAsIDB4NjcsIDB4ODIsIDB4RkIsCisJIDB4MDMsIDB4NjQsIDB4OTYsIDB4RkIsIDB4RkUsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsCisJIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4ODEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUEsIDB4NjAsIDB4RUEsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MEMsIDB4MDAsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsCisJIDB4MDUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4RUEsIDB4NjAsIDB4MUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDYsIDB4NjAsIDB4MDAsIDB4NjUsCisJIDB4MjAsIDB4NDEsIDB4OEMsIDB4RjMsIDB4QTUsIDB4ODAsIDB4MDEsIDB4QjAsIDB4MDEsIDB4MDIsIDB4MDYsIDB4MDAsIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4NkUsIDB4NjUsIDB4QTUsIDB4RDMsIDB4MDEsIDB4NjMsCisJIDB4OEEsIDB4RkQsIDB4MjYsIDB4MUIsIDB4MDAsIDB4NjAsIDB4NjQsIDB4NjQsIDB4QTUsIDB4REIsIDB4NjQsIDB4RjUsIDB4QjksIDB4RjEsIDB4MTksIDB4RjgsCisJIDB4N0YsIDB4RjEsIDB4MkMsIDB4RjgsIDB4MzIsIDB4RjgsIDB4ODAsIDB4RjEsIDB4MkQsIDB4RjgsIDB4MzMsIDB4RjgsIDB4ODEsIDB4RjEsIDB4MkUsIDB4RjgsCisJIDB4MzQsIDB4RjgsIDB4RUEsIDB4RjEsIDB4MkYsIDB4RjgsIDB4RUIsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUMsIDB4RjEsIDB4MzEsIDB4RjgsIDB4MTEsIDB4NjAsCisJIDB4NDgsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MDAsIDB4NjQsIDB4MkIsIDB4RkEsIDB4MjMsIDB4RkEsIDB4MjUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsCisJIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDYsIDB4MDAsCisJIDB4OTUsIDB4RjMsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MDIsIDB4MDAsIDB4NDAsIDB4MkEsIDB4REEsIDB4RkUsIDB4QzEsIDB4RkUsIDB4MTAsIDB4NjAsCisJIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDEsIDB4NjAsIDB4ODIsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUIsIDB4NjAsCisJIDB4NDUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDEsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4RUEsIDB4NjAsIDB4MUYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDYsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4QkEsIDB4RkUsIDB4RUQsIDB4NjAsIDB4NkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsIDB4OEEsIDB4RkIsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjUsCisJIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsIDB4QkEsIDB4RkUsIDB4QzEsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MTAsIDB4NjAsIDB4NUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDEsIDB4NjAsIDB4NDYsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsCisJIDB4RUIsIDB4NjAsIDB4NzYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsCisJIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4RUEsIDB4NjAsCisJIDB4MUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4NDUsIDB4MDMsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MDgsIDB4NjAsIDB4MkQsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MEYsIDB4MDMsCisJIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsCisJIDB4MDUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4RUQsIDB4NjAsIDB4NkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDEsIDB4MDAsIDB4NjAsCisJIDB4MDIsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MEIsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTYsIDB4NjAsIDB4QUMsIDB4RjEsCisJIDB4OTUsIDB4RjMsIDB4MDAsIDB4NjEsIDB4RDEsIDB4ODAsIDB4RjcsIDB4QjQsIDB4RjEsIDB4MDMsIDB4OTUsIDB4RkIsIDB4MzMsIDB4MDAsIDB4MDAsIDB4NjAsCisJIDB4MTAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MEUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTYsIDB4NjAsIDB4QUMsIDB4RjEsCisJIDB4OTUsIDB4RjMsIDB4MDAsIDB4NjEsIDB4RDEsIDB4ODAsIDB4MDgsIDB4QkMsIDB4MDMsIDB4MDIsIDB4RUMsIDB4NjAsIDB4OUMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4OTUsIDB4RkIsIDB4MjAsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDUsIDB4MDMsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4RUMsIDB4NjAsIDB4OUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QzgsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4RUQsIDB4NjAsIDB4NkQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjMsIDB4OTUsIDB4RjMsIDB4OEEsIDB4RkQsIDB4MDEsIDB4QkMsIDB4QzEsIDB4RkUsIDB4OTUsIDB4RkIsCisJIDB4Q0UsIDB4RjEsIDB4MEUsIDB4NjAsIDB4NTEsIDB4RjksIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsCisJIDB4NUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDEsIDB4NjAsIDB4MzQsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUMsIDB4NjAsCisJIDB4MDUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MUMsIDB4NjAsIDB4OUUsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDEsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MEQsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MUMsIDB4NjAsIDB4OUUsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4RUEsIDB4NjAsIDB4MUYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MjIsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4OTUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MkEsIDB4MDEsIDB4MDAsIDB4RDUsIDB4MDEsIDB4MUMsIDB4NjAsIDB4OUUsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4OTUsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDEsIDB4MDAsIDB4NjgsIDB4MDAsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4NTksIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4RUQsIDB4NjAsIDB4NkQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4NjAsIDB4MkQsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDgsIDB4MDMsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4OTUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDgsIDB4QkMsIDB4OTUsIDB4RkIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsCisJIDB4MDIsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QTQsIDB4MDEsIDB4MDAsIDB4NjAsCisJIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MEIsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MUMsIDB4NjAsIDB4OUUsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MDAsIDB4NjAsCisJIDB4MDgsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MEIsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MUMsIDB4NjAsIDB4OUUsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MUUsIDB4MDAsIDB4MDgsIDB4NjAsCisJIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MTQsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4OTUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDEsIDB4MDAsIDB4MTYsIDB4MDAsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDgsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4RUQsIDB4NjAsCisJIDB4NkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4OTUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsCisJIDB4OTUsIDB4RkIsIDB4RUEsIDB4NjAsIDB4RDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsIDB4QUIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QTgsCisJIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4RUQsIDB4NjAsIDB4NzYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OTUsIDB4RjMsIDB4MDEsIDB4NjMsIDB4OEEsIDB4RkQsCisJIDB4MjEsIDB4QkMsIDB4OTUsIDB4RkIsIDB4NjMsIDB4RjUsIDB4N0YsIDB4RjEsIDB4MkMsIDB4RjgsIDB4ODAsIDB4RjEsIDB4MkQsIDB4RjgsIDB4ODEsIDB4RjEsCisJIDB4MkUsIDB4RjgsIDB4ODMsIDB4RjEsIDB4QzAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4MkIsIDB4RkEsIDB4QjksIDB4RjEsIDB4MTksIDB4RjgsIDB4RUEsIDB4RjEsCisJIDB4MkYsIDB4RjgsIDB4RUIsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUMsIDB4RjEsIDB4MzEsIDB4RjgsIDB4MTAsIDB4NjAsIDB4QTQsIDB4NjQsIDB4MkEsIDB4RkEsCisJIDB4MjUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjAsIDB4NTAsIDB4NjQsIDB4MEUsIDB4NjAsIDB4NTEsIDB4RkIsIDB4MUMsIDB4NjAsCisJIDB4OUUsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MTAsIDB4NjAsCisJIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4NUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDEsIDB4NjAsCisJIDB4MkMsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUMsIDB4NjAsIDB4RTksIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MEQsIDB4MDMsCisJIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MUMsIDB4NjAsIDB4OUUsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4RUEsIDB4NjAsIDB4MUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MkQsIDB4RjEsIDB4MDAsIDB4NjAsCisJIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4OTUsIDB4MDEsIDB4MDgsIDB4NjAsCisJIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDgsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4OTUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QjAsIDB4RkYsIDB4RkYsIDB4NDksIDB4MDMsIDB4ODYsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NDAsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MTQsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MUMsIDB4NjAsIDB4OUUsIDB4NjQsIDB4MTMsIDB4NjAsCisJIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MTYsIDB4NjAsIDB4QUMsIDB4RjMsIDB4OTUsIDB4RjMsCisJIDB4MDAsIDB4QTgsIDB4RjcsIDB4QjQsIDB4MkIsIDB4MDMsIDB4OTUsIDB4RkIsIDB4RUIsIDB4NjAsIDB4RTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsCisJIDB4MTAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MTUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MUMsIDB4NjAsIDB4OUUsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MTYsIDB4NjAsIDB4QUMsIDB4RjMsCisJIDB4OTUsIDB4RjMsIDB4MDAsIDB4QTgsIDB4MDgsIDB4QkMsIDB4MDEsIDB4MDIsIDB4NEYsIDB4MDEsIDB4OTUsIDB4RkIsIDB4RUIsIDB4NjAsIDB4RTIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsCisJIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDIsIDB4MDAsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUMsIDB4NjAsIDB4OUUsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4OTUsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4RkUsIDB4QjQsIDB4OTUsIDB4RkIsIDB4RUEsIDB4NjAsIDB4RDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OTUsIDB4RjMsIDB4MDEsIDB4NjMsIDB4OEEsIDB4RkQsCisJIDB4MDEsIDB4QkMsIDB4OTUsIDB4RkIsIDB4MDAsIDB4NjQsIDB4ODIsIDB4RkIsIDB4QzEsIDB4RkUsIDB4MjgsIDB4MDAsIDB4OTUsIDB4RjMsIDB4MDEsIDB4NjMsCisJIDB4OEEsIDB4RkQsIDB4MDEsIDB4QkMsIDB4OTUsIDB4RkIsIDB4MDAsIDB4NjQsIDB4ODIsIDB4RkIsIDB4NjMsIDB4RjUsIDB4N0YsIDB4RjEsIDB4MkMsIDB4RjgsCisJIDB4ODAsIDB4RjEsIDB4MkQsIDB4RjgsIDB4ODEsIDB4RjEsIDB4MkUsIDB4RjgsIDB4ODMsIDB4RjEsIDB4QzAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4MkIsIDB4RkEsCisJIDB4QjksIDB4RjEsIDB4MTksIDB4RjgsIDB4RUEsIDB4RjEsIDB4MkYsIDB4RjgsIDB4RUIsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUMsIDB4RjEsIDB4MzEsIDB4RjgsCisJIDB4MDAsIDB4NjAsIDB4QTQsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MjUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MUMsIDB4NjAsIDB4QUEsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4NUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjAsIDB4MEUsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUQsIDB4NjAsIDB4QjgsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MEQsIDB4MDMsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MUMsIDB4NjAsIDB4QUEsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4RkYsIDB4RUEsIDB4NjAsIDB4MUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MEEsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsCisJIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0EsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsCisJIDB4MTQsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDgsIDB4NjAsIDB4MkQsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsCisJIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4OTEsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MTIsIDB4NjQsIDB4QTAsIDB4ODAsCisJIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QjEsIDB4MDEsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDIsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4QjIsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjcsIDB4ODIsIDB4RkIsCisJIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4NUEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4NjQsIDB4RjUsIDB4QjksIDB4RjEsIDB4MTksIDB4RjgsIDB4N0YsIDB4RjEsIDB4MkMsIDB4RjgsIDB4MzIsIDB4RjgsIDB4ODAsIDB4RjEsIDB4MkQsIDB4RjgsCisJIDB4MzMsIDB4RjgsIDB4ODEsIDB4RjEsIDB4MkUsIDB4RjgsIDB4MzQsIDB4RjgsIDB4RUEsIDB4RjEsIDB4MkYsIDB4RjgsIDB4RUIsIDB4RjEsIDB4MzAsIDB4RjgsCisJIDB4RUMsIDB4RjEsIDB4MzEsIDB4RjgsIDB4MTEsIDB4NjAsIDB4NDgsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MDAsIDB4NjQsIDB4MkIsIDB4RkEsIDB4MjMsIDB4RkEsCisJIDB4MjUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4OTUsIDB4RjMsIDB4QzEsIDB4RkUsIDB4RkUsIDB4QjQsIDB4OTUsIDB4RkIsIDB4MDAsIDB4NjAsIDB4MDMsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUUsIDB4NjAsIDB4MzAsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MzMsIDB4MDEsIDB4NjQsIDB4RjUsIDB4MjMsIDB4RjIsIDB4OTYsIDB4RjMsIDB4MDQsIDB4MTgsIDB4Q0MsIDB4ODQsIDB4OTYsIDB4RkIsCisJIDB4MDEsIDB4MDMsIDB4MkIsIDB4MDEsIDB4RUEsIDB4NjAsIDB4RDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsIDB4QUIsIDB4RjMsIDB4ODIsIDB4RjEsCisJIDB4MDIsIDB4QTgsIDB4MkEsIDB4RjIsIDB4MDMsIDB4MDIsIDB4QjAsIDB4ODQsIDB4MkEsIDB4RkEsIDB4MDcsIDB4MDAsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MjUsIDB4NjAsIDB4QzgsIDB4NjQsIDB4MTMsIDB4NjAsCisJIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsCisJIDB4MTIsIDB4NjAsIDB4RUQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4REYsIDB4MDIsIDB4Q0EsIDB4NjAsIDB4RDQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4NDgsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsIDB4MDYsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MjUsIDB4RkIsIDB4RUUsIDB4NjAsIDB4NzcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsCisJIDB4MTgsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjUsIDB4RkIsIDB4RUUsIDB4NjAsIDB4NzcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4REIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDcsIDB4QjQsIDB4MDMsIDB4MzYsIDB4MUIsIDB4MDAsCisJIDB4MEUsIDB4RjAsIDB4MTksIDB4NjAsIDB4N0IsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RUYsIDB4QjQsIDB4NjAsIDB4NDQsIDB4NjQsIDB4NDAsIDB4MDQsIDB4MjcsCisJIDB4MDcsIDB4MDAsIDB4QTIsIDB4REIsIDB4MTMsIDB4NjQsIDB4Q0IsIDB4RkIsIDB4MDEsIDB4NjAsIDB4NjcsIDB4NjQsIDB4MzcsIDB4RkIsIDB4MEIsIDB4MDAsCisJIDB4MTAsIDB4QkMsIDB4QTIsIDB4REIsIDB4MDgsIDB4NjQsIDB4Q0IsIDB4RkIsIDB4QTEsIDB4RjMsIDB4MDEsIDB4NjAsIDB4NjcsIDB4N0MsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MjcsIDB4NUIsIDB4N0MsIDB4MzcsIDB4RjksIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsIDB4RjQsIDB4QTMsCisJIDB4MDAsIDB4NjAsIDB4MUQsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MkEsIDB4NjUsIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NEMsIDB4RkQsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QkIsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDIsIDB4M0IsIDB4MDAsIDB4MDIsIDB4NjAsCisJIDB4MDEsIDB4NjMsIDB4QTMsIDB4RDEsIDB4REIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDcsIDB4QjQsIDB4MDMsIDB4MzYsIDB4MUYsIDB4MDAsIDB4MTksIDB4NjAsCisJIDB4NDUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDksIDB4MDAsIDB4MTksIDB4NjAsIDB4N0IsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4RkQsIDB4QjQsIDB4NjAsIDB4NDQsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MjcsIDB4MDIsIDB4QkMsIDB4QTIsIDB4REIsIDB4MTksIDB4NjAsIDB4NDUsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MUMsIDB4MDAsIDB4MTksIDB4NjAsIDB4N0IsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkIsIDB4QjQsCisJIDB4NjAsIDB4NDQsIDB4NjQsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MDQsIDB4QkMsIDB4QTIsIDB4REIsIDB4MTIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MkIsCisJIDB4MDYsIDB4MDAsIDB4MTksIDB4NjAsIDB4N0IsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4NjAsIDB4NDQsIDB4QTIsIDB4REIsIDB4NjQsIDB4NDAsCisJIDB4MDQsIDB4MkIsIDB4MDYsIDB4MDAsIDB4MTksIDB4NjAsIDB4N0IsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDQsIDB4QkMsIDB4NjAsIDB4NDQsIDB4QTIsIDB4REIsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4RjAsIDB4REIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDcsIDB4QjQsIDB4MDMsIDB4MzYsIDB4MTgsIDB4MDAsCisJIDB4MTksIDB4NjAsIDB4N0IsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4NjAsIDB4NDQsIDB4RkIsIDB4QjQsIDB4NjAsIDB4NDQsIDB4NjQsIDB4NDAsCisJIDB4MjAsIDB4MkEsIDB4MEEsIDB4MDAsIDB4NjAsIDB4NDMsIDB4MTksIDB4NjAsIDB4NDUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MjYsCisJIDB4MDIsIDB4MDAsIDB4NjMsIDB4NDQsIDB4MDIsIDB4MDAsIDB4NjMsIDB4NDQsIDB4MDQsIDB4QkMsIDB4MTksIDB4NjAsIDB4N0IsIDB4RkIsIDB4MDksIDB4MDAsCisJIDB4NjQsIDB4NDAsIDB4MjAsIDB4MjYsIDB4MDYsIDB4MDAsIDB4MTksIDB4NjAsIDB4N0IsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDQsIDB4QkMsIDB4NjAsIDB4NDQsCisJIDB4QTIsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4QjAsIDB4NjEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4NUMsIDB4RkIsIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsIDB4ODAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4QzksIDB4RjEsCisJIDB4MTksIDB4RjgsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjQsIDB4MEUsIDB4RkEsIDB4QTYsIDB4RjEsIDB4MDcsIDB4RjgsCisJIDB4NjcsIDB4NDQsIDB4MkMsIDB4RkEsIDB4MkQsIDB4RkEsIDB4MkUsIDB4RkEsIDB4RjEsIDB4NjAsIDB4MkMsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MzEsIDB4RkIsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NUMsIDB4RjUsIDB4RUEsIDB4RjEsIDB4MkYsIDB4RjgsIDB4RUIsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUMsIDB4RjEsCisJIDB4MzEsIDB4RjgsIDB4N0YsIDB4RjEsIDB4MzIsIDB4RjgsIDB4ODAsIDB4RjEsIDB4MzMsIDB4RjgsIDB4ODEsIDB4RjEsIDB4MzQsIDB4RjgsIDB4MTYsIDB4NjAsCisJIDB4QzIsIDB4RjEsIDB4MDIsIDB4NjQsIDB4NjQsIDB4NDAsIDB4RkUsIDB4MjYsIDB4MTAsIDB4QkMsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MTAsIDB4QkMsCisJIDB4MjAsIDB4QkMsIDB4RkIsIDB4NjAsIDB4RkYsIDB4NjUsIDB4NjAsIDB4NDQsIDB4QTQsIDB4ODQsIDB4MUIsIDB4NjAsIDB4MDksIDB4RkIsIDB4MTYsIDB4NjAsCisJIDB4QzEsIDB4RjEsIDB4MzMsIDB4NjAsIDB4QkUsIDB4NjQsIDB4MDIsIDB4MTgsIDB4MkQsIDB4NjAsIDB4MzIsIDB4NjQsIDB4MUEsIDB4NjAsIDB4QUQsIDB4RkIsCisJIDB4MUEsIDB4NjAsIDB4QkQsIDB4RkIsIDB4MzQsIDB4NjAsIDB4MTgsIDB4NjEsIDB4MTcsIDB4NjAsIDB4MTQsIDB4RjMsIDB4MzUsIDB4NjAsIDB4MzYsIDB4NjUsCisJIDB4RkUsIDB4QTQsIDB4RTAsIDB4ODQsIDB4MDYsIDB4MDUsIDB4NjcsIDB4NDQsIDB4MUEsIDB4NjAsIDB4QjUsIDB4RkIsIDB4MUEsIDB4NjAsIDB4QzUsIDB4RkIsCisJIDB4NEIsIDB4MDAsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODUsIDB4MUEsIDB4NjAsIDB4MUYsIDB4RjMsIDB4QTUsIDB4RDEsIDB4REEsIDB4ODUsIDB4QTAsIDB4ODMsCisJIDB4MUEsIDB4NjAsIDB4MUIsIDB4RkQsIDB4QTUsIDB4RDEsIDB4MzQsIDB4NjAsIDB4MzQsIDB4NjIsIDB4QTAsIDB4ODMsIDB4QTIsIDB4REQsIDB4NjcsIDB4NDQsCisJIDB4MUEsIDB4NjAsIDB4QjUsIDB4RkIsIDB4MUEsIDB4NjAsIDB4QzUsIDB4RkIsIDB4MUEsIDB4NjAsIDB4MkMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MjEsIDB4MTgsCisJIDB4MzMsIDB4NjAsIDB4RjQsIDB4NjEsIDB4MEYsIDB4NjAsIDB4MDAsIDB4N0MsIDB4MDAsIDB4NjAsIDB4QUMsIDB4NjUsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4QzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUEsIDB4NjAsIDB4MkQsIDB4RjEsIDB4NTksIDB4RDksIDB4MzMsIDB4NjAsIDB4RjIsIDB4NjUsIDB4RDUsIDB4ODQsCisJIDB4MzAsIDB4N0YsIDB4QTUsIDB4REIsIDB4NjUsIDB4NDQsIDB4MUEsIDB4NjAsIDB4QjUsIDB4RkIsIDB4MUEsIDB4NjAsIDB4QzUsIDB4RkIsIDB4MUEsIDB4NjAsCisJIDB4MkMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjQsIDB4MDMsIDB4MDAsIDB4RkYsIDB4NjAsIDB4RkYsIDB4NjQsCisJIDB4MTMsIDB4MDAsIDB4MzQsIDB4NjAsIDB4MTgsIDB4NjEsIDB4NTAsIDB4NjAsIDB4MDAsIDB4N0MsIDB4MDAsIDB4NjAsIDB4RjIsIDB4NjUsIDB4RUYsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4QzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUEsIDB4NjAsIDB4MUQsIDB4RjEsIDB4NTksIDB4RDksIDB4MzQsIDB4NjAsIDB4MTIsIDB4NjUsCisJIDB4RDUsIDB4ODQsIDB4REQsIDB4N0YsIDB4QTUsIDB4REIsIDB4NjUsIDB4NDQsIDB4MUEsIDB4NjAsIDB4QjIsIDB4RkIsIDB4MUEsIDB4NjAsIDB4QzIsIDB4RkIsCisJIDB4NzksIDB4MDAsIDB4MUEsIDB4NjAsIDB4MUUsIDB4RjMsIDB4MzQsIDB4NjAsIDB4MzQsIDB4NjIsIDB4RkQsIDB4QTAsIDB4QTIsIDB4RDMsIDB4RUUsIDB4MDMsCisJIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjMsIDB4MEIsIDB4MDAsIDB4MDQsIDB4MkEsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjMsCisJIDB4MDcsIDB4MDAsIDB4MTAsIDB4MkEsIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjMsIDB4MDMsIDB4MDAsIDB4MjAsIDB4MkEsIDB4MDEsIDB4MDAsIDB4MDUsIDB4NjMsCisJIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MUEsIDB4NjAsIDB4MUUsIDB4RjMsIDB4MUEsIDB4NjAsIDB4MUIsIDB4RjMsCisJIDB4RkUsIDB4QTAsIDB4NDAsIDB4NEMsIDB4RDMsIDB4MDMsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjMsIDB4NTksIDB4REQsIDB4NDEsIDB4NEEsIDB4MkMsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MDAsIDB4NjMsIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MkMsIDB4NDAsCisJIDB4MDIsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MkMsIDB4NDAsIDB4MDQsIDB4MkEsIDB4MDUsIDB4MDAsCisJIDB4MDIsIDB4NjMsIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MkMsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDUsIDB4MDAsCisJIDB4MDQsIDB4NjMsIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MkMsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MDUsIDB4MDAsCisJIDB4MDUsIDB4NjMsIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MkEsIDB4NDQsIDB4NTEsIDB4OTMsIDB4RUIsIDB4ODMsCisJIDB4RUIsIDB4ODMsIDB4QTAsIDB4REQsIDB4MUEsIDB4NjAsIDB4MUUsIDB4RjMsIDB4MUEsIDB4NjAsIDB4MUMsIDB4RjMsIDB4RkYsIDB4QTAsIDB4NDAsIDB4NEMsCisJIDB4OUQsIDB4MDMsIDB4NTksIDB4REYsIDB4NDEsIDB4NEEsIDB4MkMsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MDAsIDB4NjMsIDB4NjMsIDB4NDcsCisJIDB4QjQsIDB4ODMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MkMsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MDEsIDB4NjMsIDB4NjMsIDB4NDcsCisJIDB4QjQsIDB4ODMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MkMsIDB4NDAsIDB4MDQsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MDIsIDB4NjMsIDB4NjMsIDB4NDcsCisJIDB4QjQsIDB4ODMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MkEsIDB4NDQsIDB4NTEsIDB4OTMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4QTAsIDB4REQsCisJIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MEEsIDB4RkIsIDB4RjAsIDB4NjAsIDB4NDQsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MTIsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4N0QsIDB4RjEsIDB4MzUsIDB4NjAsIDB4Q0MsIDB4NjQsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDEsIDB4MDAsIDB4NjcsIDB4NDQsIDB4MUEsIDB4NjAsCisJIDB4QUYsIDB4RkIsIDB4MUEsIDB4NjAsIDB4QkYsIDB4RkIsIDB4MUEsIDB4NjAsIDB4RTcsIDB4RjksIDB4MzUsIDB4NjAsIDB4NjIsIDB4NjUsIDB4RjEsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4N0QsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDUsIDB4MDAsCisJIDB4RkYsIDB4NjAsIDB4RkYsIDB4NjMsIDB4MUEsIDB4NjAsIDB4QjMsIDB4RkQsIDB4MDgsIDB4MDAsIDB4MzYsIDB4NjAsIDB4MDQsIDB4NjMsIDB4MUEsIDB4NjAsCisJIDB4QjMsIDB4RkQsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OEMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUMsIDB4RjUsIDB4MDAsIDB4RjQsIDB4N0UsIDB4RjEsCisJIDB4MDYsIDB4RjgsIDB4MUIsIDB4NjAsIDB4MDksIDB4RjMsIDB4MTksIDB4NjAsIDB4N0IsIDB4RjEsIDB4RkIsIDB4NjAsIDB4RkYsIDB4NjUsIDB4NjAsIDB4NDQsCisJIDB4QTQsIDB4ODQsIDB4NjAsIDB4NDcsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MDQsIDB4QkMsIDB4NjAsIDB4NDcsIDB4MDcsIDB4RkEsIDB4MzUsIDB4NjAsCisJIDB4NUEsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MTAsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NUMsIDB4RjUsIDB4M0YsIDB4RkMsIDB4REIsIDB4RkUsIDB4MjUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsCisJIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDQsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4REIsIDB4RjMsIDB4OUIsIDB4RkUsIDB4RkQsIDB4QTAsIDB4MjUsIDB4MDQsIDB4MjQsIDB4MDIsIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsCisJIDB4MDAsIDB4RjQsIDB4MDksIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MDAsIDB4M0EsIDB4MUMsIDB4MDAsIDB4NjAsIDB4NDMsIDB4MDAsIDB4MzYsCisJIDB4MUMsIDB4MDAsIDB4RTAsIDB4QTAsIDB4REEsIDB4ODUsIDB4MTYsIDB4MDcsIDB4MzMsIDB4NjAsIDB4QkUsIDB4NjEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsCisJIDB4RDMsIDB4ODAsIDB4Q0IsIDB4ODMsIDB4MEYsIDB4MDIsIDB4MDcsIDB4MEUsIDB4NTksIDB4RDMsIDB4QTUsIDB4RDAsIDB4REEsIDB4ODUsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDIsIDB4RjksIDB4MUYsIDB4MTIsIDB4MUUsIDB4QTUsIDB4RDAsIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4OTAsIDB4ODAsCisJIDB4RkYsIDB4MjIsIDB4MEMsIDB4MDAsIDB4RjEsIDB4NjAsIDB4MkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsIDB4QzEsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MkQsIDB4NjAsIDB4MzIsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MzMsIDB4NjAsIDB4QkUsIDB4NjQsCisJIDB4MUEsIDB4NjAsIDB4QkQsIDB4RkIsIDB4MjYsIDB4NDYsIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsCisJIDB4MkUsIDB4RkEsIDB4RUEsIDB4RjEsIDB4MkYsIDB4RjgsIDB4RUIsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUMsIDB4RjEsIDB4MzEsIDB4RjgsIDB4N0YsIDB4RjEsCisJIDB4MzIsIDB4RjgsIDB4ODAsIDB4RjEsIDB4MzMsIDB4RjgsIDB4ODEsIDB4RjEsIDB4MzQsIDB4RjgsIDB4MDAsIDB4NjUsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4REQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjEsIDB4NDQsIDB4MTksIDB4NjAsIDB4M0YsIDB4RkIsIDB4NTAsIDB4NjMsIDB4MkEsIDB4RkMsIDB4QzksIDB4RjMsCisJIDB4MTksIDB4RkEsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4QTYsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MDAsIDB4RjQsIDB4N0UsIDB4RjEsIDB4MDYsIDB4RjgsCisJIDB4MUIsIDB4NjAsIDB4MDksIDB4RjMsIDB4MTksIDB4NjAsIDB4N0IsIDB4RjEsIDB4RkIsIDB4NjAsIDB4RkYsIDB4QjcsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MjYsCisJIDB4MDQsIDB4QkMsIDB4NjAsIDB4NDcsIDB4MDcsIDB4RkEsIDB4MzUsIDB4NjAsIDB4ODIsIDB4NjUsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4N0QsIDB4RjMsIDB4MzYsIDB4NjAsIDB4MDQsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NjcsIDB4NDMsIDB4MUEsIDB4NjAsCisJIDB4QzMsIDB4RkQsIDB4MzUsIDB4NjAsIDB4N0EsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MTAsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RjEsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RkMsIDB4MjUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsCisJIDB4MEQsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsCisJIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MDksIDB4RkIsIDB4NUEsIDB4REIsCisJIDB4MDAsIDB4NjQsIDB4OTIsIDB4RkIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUIsIDB4NjAsIDB4MEEsIDB4RkIsIDB4Q0QsIDB4ODEsIDB4MjgsIDB4RDMsCisJIDB4NUEsIDB4ODgsIDB4REMsIDB4ODMsIDB4MzEsIDB4MTgsIDB4RkIsIDB4MDMsIDB4NjEsIDB4NDAsIDB4N0YsIDB4M0EsIDB4MDYsIDB4MDAsIDB4MUIsIDB4NjAsCisJIDB4MEEsIDB4RjMsIDB4MDMsIDB4NjEsIDB4N0MsIDB4QTQsIDB4QTIsIDB4REIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4RkUsIDB4QTMsIDB4RDEsIDB4NUQsIDB4RDgsCisJIDB4NjEsIDB4NDAsIDB4N0YsIDB4M0EsIDB4MDgsIDB4MDAsIDB4MjAsIDB4RkUsIDB4MUIsIDB4NjAsIDB4MEEsIDB4RjMsIDB4MDMsIDB4NjEsIDB4N0MsIDB4QTQsCisJIDB4QTIsIDB4REIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4RkUsIDB4QkYsIDB4RDMsIDB4NUQsIDB4REEsIDB4RkYsIDB4QjQsIDB4MDAsIDB4N0YsIDB4MTIsIDB4MDMsCisJIDB4REYsIDB4ODMsIDB4NjEsIDB4NDAsIDB4N0YsIDB4M0EsIDB4MEEsIDB4MDAsIDB4MjAsIDB4RkUsIDB4NjAsIDB4NDUsIDB4MUIsIDB4NjAsIDB4MEEsIDB4RjMsCisJIDB4MDMsIDB4NjEsIDB4N0MsIDB4QTQsIDB4QTIsIDB4REIsIDB4NjUsIDB4NDQsIDB4MDAsIDB4RjQsIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDEsIDB4Q0MsIDB4ODQsCisJIDB4NUQsIDB4RDgsIDB4RUYsIDB4MDIsIDB4MjAsIDB4RkUsIDB4Q0IsIDB4MDEsIDB4MUIsIDB4NjAsIDB4MEEsIDB4RjEsIDB4RkQsIDB4QTEsIDB4RkYsIDB4QjEsCisJIDB4QzEsIDB4ODMsIDB4QTIsIDB4REQsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjcsIDB4NUMsIDB4MUMsIDB4NjAsIDB4RTYsIDB4NjEsIDB4QTEsIDB4RDMsCisJIDB4QTUsIDB4RDksIDB4MTAsIDB4MTgsIDB4NjAsIDB4NDMsIDB4MzUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4QTUsIDB4REIsIDB4NjAsIDB4RkUsIDB4QTAsIDB4REQsCisJIDB4MjAsIDB4RkUsIDB4REMsIDB4ODQsIDB4Q0YsIDB4ODMsIDB4RTMsIDB4ODMsIDB4NTksIDB4RDEsIDB4REMsIDB4ODQsIDB4NjAsIDB4RkUsIDB4QTAsIDB4RDksCisJIDB4MjAsIDB4RkUsIDB4RkEsIDB4MUYsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4N0IsIDB4RjMsIDB4MzYsIDB4NjAsIDB4MDYsIDB4NjIsCisJIDB4MDcsIDB4QjQsIDB4NjAsIDB4RkUsIDB4QTIsIDB4REIsIDB4MjAsIDB4RkUsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NTcsIDB4MzIsIDB4NDAsCisJIDB4NDAsIDB4MjYsIDB4MjcsIDB4MDAsIDB4NDUsIDB4NDgsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MUYsIDB4MDMsIDB4RjIsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjQsIDB4RkEsIDB4MDAsIDB4NjAsIDB4NDgsIDB4NjEsIDB4MjgsIDB4NDQsCisJIDB4NTksIDB4REEsIDB4MDMsIDB4NjQsIDB4MzgsIDB4NDMsIDB4QkQsIDB4RDEsIDB4Q0MsIDB4ODQsIDB4NTksIDB4RDgsIDB4RkMsIDB4MDIsIDB4MzksIDB4NDQsCisJIDB4NTksIDB4REEsIDB4MTYsIDB4NjAsIDB4QzMsIDB4RjMsIDB4NTksIDB4REEsIDB4MDcsIDB4NjQsIDB4MjMsIDB4RkEsIDB4MjYsIDB4NjAsIDB4MEEsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4RkEsIDB4RkUsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NTcsIDB4MzIsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MUIsIDB4MDAsIDB4NDUsIDB4NDgsCisJIDB4MDAsIDB4NjAsIDB4MDYsIDB4NjEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTMsIDB4MDMsIDB4MDIsIDB4NjQsCisJIDB4MjMsIDB4RkEsIDB4RjIsIDB4NjAsIDB4MDAsIDB4NjQsIDB4NUEsIDB4REEsIDB4MjgsIDB4NDQsIDB4NUEsIDB4REEsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NjAsCisJIDB4MEEsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsCisJIDB4RDAsIDB4ODAsIDB4MDMsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsIDB4REQsIDB4OTgsIDB4RkYsIDB4RkYsIDB4QjUsIDB4RjEsCisJIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4ODAsIDB4QzQsIDB4ODQsIDB4MEMsIDB4MDMsIDB4MDgsIDB4MDUsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsCisJIDB4MDUsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDIsIDB4MjQsIDB4QzYsIDB4RkUsIDB4REQsIDB4OTgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4RkUsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4REQsIDB4OTgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MzIsIDB4NDAsIDB4NDAsIDB4MjYsIDB4M0MsIDB4MDAsIDB4OUIsIDB4RjMsCisJIDB4NjcsIDB4NDMsIDB4REMsIDB4ODQsIDB4Q0MsIDB4ODQsIDB4MzcsIDB4MDMsIDB4NjAsIDB4NDYsIDB4MEEsIDB4MDIsIDB4OUIsIDB4RkQsIDB4MDAsIDB4NjAsCisJIDB4NDYsIDB4NjEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4OUIsIDB4RkIsIDB4MkMsIDB4MDMsCisJIDB4NDYsIDB4NEIsIDB4MkMsIDB4NjAsIDB4Q0EsIDB4NjEsIDB4MTgsIDB4NjQsIDB4MjMsIDB4RkEsIDB4RjEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MjQsIDB4RkEsCisJIDB4NEEsIDB4NjUsIDB4QTIsIDB4RkYsIDB4MkMsIDB4NjMsIDB4NTksIDB4RDEsIDB4QTIsIDB4REYsIDB4QTUsIDB4RDgsIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjcsIDB4MUYsIDB4MTIsIDB4NjMsIDB4NTksIDB4RDEsIDB4QTUsIDB4RDgsIDB4REEsIDB4ODUsCisJIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjgsIDB4MUYsIDB4MjYsIDB4NjAsIDB4MEEsIDB4NjQsIDB4MTMsIDB4NjAsCisJIDB4MEQsIDB4RkIsIDB4MkIsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsCisJIDB4QTYsIDB4RkUsIDB4MDAsIDB4NjQsIDB4OUIsIDB4RkIsIDB4QTMsIDB4RkYsIDB4Q0EsIDB4NjAsIDB4RDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTYsIDB4RkUsCisJIDB4QkEsIDB4MDUsIDB4QTcsIDB4RkUsIDB4MTEsIDB4MDUsIDB4QTUsIDB4RkUsIDB4MDMsIDB4MDQsIDB4RjIsIDB4NjAsIDB4RDgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QTQsIDB4RkUsIDB4RjIsIDB4MDQsIDB4MDgsIDB4NjAsIDB4MEYsIDB4RjEsIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4Q0EsIDB4NjAsIDB4RDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzYsIDB4NDUsIDB4MjAsIDB4NjAsIDB4QTgsIDB4NjQsIDB4NDQsIDB4RDcsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OUQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QjAsIDB4MDAsIDB4NjQsIDB4MkYsIDB4MDMsIDB4OUQsIDB4RkIsCisJIDB4MzEsIDB4NDQsIDB4RTgsIDB4QjQsIDB4NDAsIDB4NTEsIDB4NkEsIDB4NDQsIDB4RkYsIDB4RkYsIDB4ODAsIDB4MjYsIDB4RkMsIDB4MDEsIDB4NjEsIDB4RkYsCisJIDB4NjIsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MzAsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4NDAsIDB4NjAsIDB4NTgsIDB4NEUsIDB4N0QsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4QzQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4RTEsIDB4RkIsCisJIDB4NEEsIDB4REYsIDB4MDEsIDB4NjAsIDB4RkUsIDB4NjMsIDB4MUQsIDB4NjAsIDB4QkUsIDB4NjEsIDB4MDAsIDB4NjQsIDB4NTksIDB4REIsIDB4RkUsIDB4MUYsCisJIDB4MEUsIDB4NjAsIDB4REQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDQsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDUsIDB4MDMsIDB4MDIsIDB4NjUsIDB4RjEsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0EsIDB4NjAsIDB4RDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RjIsIDB4NjAsIDB4RDgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MzcsIDB4MDAsIDB4MkQsIDB4NjAsIDB4QUEsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDEsIDB4QkQsIDB4RDEsIDB4QjAsIDB4ODQsIDB4QjAsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDIsIDB4OEEsIDB4RkIsIDB4MzEsIDB4NDQsIDB4RkUsIDB4QjQsIDB4NDAsIDB4NTEsIDB4MEQsIDB4NjQsIDB4MDUsIDB4RkIsCisJIDB4MjcsIDB4MDAsIDB4MjgsIDB4RjMsIDB4OUQsIDB4RjEsIDB4NjAsIDB4NDcsIDB4NjQsIDB4NDEsIDB4MDcsIDB4QjEsIDB4MDcsIDB4QjQsIDB4NTAsIDB4RkIsCisJIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsIDB4QTEsIDB4ODAsIDB4QjEsIDB4ODMsIDB4MTgsIDB4MDIsCisJIDB4OUQsIDB4RkQsIDB4MTYsIDB4NjAsIDB4Q0YsIDB4RjMsIDB4RTQsIDB4RkIsIDB4N0QsIDB4RkIsIDB4MTMsIDB4NjAsIDB4MDIsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4NDYsIDB4NUUsIDB4MzEsIDB4NDQsIDB4MDEsIDB4QkMsIDB4NDAsIDB4NTEsIDB4RUQsIDB4RTIsIDB4MEYsIDB4NEUsCisJIDB4MUQsIDB4NjAsIDB4NTgsIDB4NEYsIDB4OUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4Q0EsIDB4NjAsIDB4RDQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4RDcsIDB4RkUsIDB4Q0EsIDB4NjAsIDB4RDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RjIsIDB4NjAsIDB4RTQsIDB4NjQsIDB4MDgsIDB4NjAsIDB4M0IsIDB4RkIsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjcsIDB4RkIsIDB4NUEsIDB4REIsCisJIDB4MTAsIDB4NjAsIDB4NEUsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MjgsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MUQsIDB4MDMsIDB4MjAsIDB4NDAsIDB4MDYsIDB4MjMsIDB4MTAsIDB4MDAsIDB4MDgsIDB4NjAsCisJIDB4MjcsIDB4RjEsIDB4N0YsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MjgsIDB4RkIsIDB4RjIsIDB4NjAsIDB4RjQsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUQsIDB4NjAsCisJIDB4QTksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MjcsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4QzYsIDB4MDEsIDB4MDgsIDB4NjAsIDB4MjcsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4REIsIDB4RjMsIDB4MDEsIDB4NjMsIDB4RkQsIDB4QTAsIDB4MDgsIDB4NjAsIDB4NzcsIDB4RkQsIDB4MDcsIDB4MDIsIDB4MDgsIDB4NjAsCisJIDB4MzAsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4QjEsIDB4MDEsIDB4MEUsIDB4NTcsCisJIDB4MzIsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MUIsIDB4MDAsIDB4NDUsIDB4NDgsIDB4MDAsIDB4NjAsIDB4MDYsIDB4NjEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4MjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTMsIDB4MDMsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4RjIsIDB4NjAsIDB4MDQsIDB4NjQsIDB4NUEsIDB4REEsCisJIDB4MjgsIDB4NDQsIDB4NUEsIDB4REEsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NjAsIDB4MEEsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4ODgsIDB4MDEsCisJIDB4MTIsIDB4NjAsIDB4RjYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MEUsIDB4RjIsIDB4NEIsIDB4MDMsIDB4NjAsIDB4NDAsCisJIDB4RjAsIDB4MzcsIDB4MzgsIDB4MDAsIDB4RkYsIDB4MzcsIDB4MkQsIDB4MDAsIDB4RkQsIDB4MzcsIDB4MjUsIDB4MDAsIDB4RjgsIDB4MzcsIDB4MEEsIDB4MDAsCisJIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4MTAsIDB4NjAsIDB4MTIsIDB4NjIsIDB4NDYsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDAsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4REMsIDB4MDEsIDB4MDYsIDB4QjQsIDB4RkQsIDB4N0YsIDB4MEUsIDB4RkEsIDB4MjUsIDB4NjAsCisJIDB4RjIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4RjksIDB4RkUsIDB4Q0QsIDB4MDEsIDB4MjMsIDB4RjAsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjYsIDB4RUQsIDB4MUIsIDB4MDIsIDB4MjYsCisJIDB4RUIsIDB4MTgsIDB4QTIsIDB4RkYsIDB4MDIsIDB4RjAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsIDB4QUQsIDB4RjMsIDB4MDIsIDB4MDIsCisJIDB4Q0MsIDB4ODQsIDB4QUQsIDB4RkIsIDB4MjYsIDB4NjAsIDB4MUEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QjYsIDB4MDEsIDB4QUMsIDB4RkUsIDB4MDksIDB4MDUsIDB4QUQsIDB4RkUsIDB4MEYsIDB4MDUsIDB4QUUsIDB4RkUsIDB4QjAsIDB4MDUsCisJIDB4QUYsIDB4RkUsIDB4MzcsIDB4MDUsIDB4Q0EsIDB4NjAsIDB4RDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4MjAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4RjUsIDB4MDEsIDB4MTAsIDB4NjAsIDB4N0EsIDB4NjUsIDB4MEQsIDB4NjEsCisJIDB4MDcsIDB4MDAsIDB4QTIsIDB4REQsIDB4NTgsIDB4NEYsIDB4NjQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QjksIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDMsCisJIDB4MDAsIDB4NjMsIDB4QTUsIDB4RDEsIDB4NUEsIDB4RDMsIDB4REEsIDB4ODUsIDB4MDAsIDB4QTgsIDB4Q0QsIDB4ODEsIDB4RjIsIDB4MDIsIDB4RjgsIDB4MDIsCisJIDB4RTEsIDB4MDEsIDB4MTAsIDB4NjAsIDB4MEUsIDB4NjIsIDB4MTAsIDB4NjAsIDB4NTgsIDB4NjUsIDB4RjMsIDB4NjAsIDB4RDcsIDB4NjMsIDB4NUEsIDB4REYsCisJIDB4RDYsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDMsIDB4NUEsIDB4REYsIDB4NUEsIDB4REYsIDB4NUEsIDB4REQsIDB4RjksIDB4MDEsIDB4MTAsIDB4NjAsCisJIDB4NzgsIDB4NjUsIDB4NUEsIDB4REYsIDB4RDYsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4NUEsIDB4REQsIDB4RkIsIDB4MDEsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MTIsIDB4NjQsIDB4NDAsIDB4NDEsIDB4MTAsIDB4NjAsIDB4MTAsIDB4NjMsIDB4QTMsIDB4RDEsIDB4MDAsIDB4NjQsCisJIDB4RDAsIDB4ODAsIDB4MEMsIDB4NjEsIDB4MDgsIDB4MDMsIDB4QkQsIDB4REIsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsIDB4Q0QsIDB4ODEsCisJIDB4QTMsIDB4REIsIDB4MDYsIDB4QTMsIDB4RjksIDB4MDIsIDB4MTAsIDB4NjAsIDB4NjAsIDB4NjMsIDB4QTMsIDB4RDEsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsCisJIDB4MEQsIDB4NjEsIDB4MTksIDB4MDMsIDB4QkQsIDB4REIsIDB4NjQsIDB4NDQsIDB4RkUsIDB4QTMsIDB4MDIsIDB4QTMsIDB4Q0QsIDB4ODEsIDB4RTgsIDB4ODQsCisJIDB4RTMsIDB4MDMsIDB4MDIsIDB4MDUsIDB4RTEsIDB4MDMsIDB4RjksIDB4MDEsIDB4OTcsIDB4RkIsIDB4OTksIDB4RkQsIDB4NjEsIDB4NUMsIDB4QTMsIDB4RDMsCisJIDB4OTgsIDB4RjksIDB4MDMsIDB4MTgsIDB4NTgsIDB4NEYsIDB4NjAsIDB4NTgsIDB4RkYsIDB4RkYsIDB4OTksIDB4RjMsIDB4OTgsIDB4RjEsIDB4NjAsIDB4NDMsCisJIDB4OTcsIDB4RjMsIDB4NjQsIDB4NDEsIDB4RUEsIDB4MDEsIDB4MjEsIDB4NDMsIDB4MTAsIDB4NjAsIDB4NUEsIDB4NjUsIDB4RDcsIDB4ODAsIDB4QkQsIDB4RDEsCisJIDB4QkQsIDB4RDMsIDB4MDMsIDB4MDIsIDB4Q0EsIDB4NjAsIDB4RDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsIDB4QkQsIDB4RDEsIDB4NDMsIDB4NDEsCisJIDB4RjUsIDB4MDMsIDB4RjMsIDB4NjAsIDB4REMsIDB4NjQsIDB4NjQsIDB4NTgsIDB4NDAsIDB4NEYsIDB4MkEsIDB4RjAsIDB4ODMsIDB4NjAsIDB4RkYsIDB4NjUsCisJIDB4NjQsIDB4NDcsIDB4MDMsIDB4MkIsIDB4MDEsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDMsIDB4MjYsIDB4MDMsIDB4QUMsIDB4NjAsIDB4NDcsIDB4QTQsIDB4ODQsCisJIDB4MkEsIDB4RkEsIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsIDB4MkUsIDB4RkEsIDB4NjQsIDB4NDEsCisJIDB4RUEsIDB4RjMsIDB4MkYsIDB4RkEsIDB4NjAsIDB4NDMsIDB4RUIsIDB4RjMsIDB4MzAsIDB4RkEsIDB4RUMsIDB4RjEsIDB4MzEsIDB4RjgsIDB4MTksIDB4MDAsCisJIDB4NjAsIDB4NDcsIDB4QTQsIDB4ODQsIDB4MkEsIDB4RkEsIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsCisJIDB4MkUsIDB4RkEsIDB4MzYsIDB4RjIsIDB4MzIsIDB4RkEsIDB4MzcsIDB4RjIsIDB4MzMsIDB4RkEsIDB4MzgsIDB4RjIsIDB4MzQsIDB4RkEsIDB4RUEsIDB4RjMsCisJIDB4MkYsIDB4RkEsIDB4MzYsIDB4RkEsIDB4RUIsIDB4RjMsIDB4MzAsIDB4RkEsIDB4MzcsIDB4RkEsIDB4RUMsIDB4RjMsIDB4MzEsIDB4RkEsIDB4MzgsIDB4RkEsCisJIDB4NjQsIDB4NDEsIDB4MUMsIDB4RjIsIDB4MTMsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MEQsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MkIsCisJIDB4MTcsIDB4MDAsIDB4ODEsIDB4NjcsIDB4QTIsIDB4REEsIDB4RjQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4Q0YsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4M0YsIDB4RkMsIDB4MjUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjAsIDB4NDIsIDB4NjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDQsIDB4M0YsIDB4RkEsIDB4MDcsIDB4RjIsCisJIDB4QTYsIDB4RjEsIDB4MDEsIDB4MUIsIDB4MDcsIDB4RjgsIDB4MUMsIDB4RjIsIDB4MTMsIDB4RkEsIDB4MjYsIDB4RjIsIDB4MjcsIDB4RjAsIDB4NjAsIDB4NDcsCisJIDB4MDAsIDB4RjQsIDB4MUYsIDB4RkEsIDB4NjQsIDB4NDcsIDB4MjAsIDB4RkEsIDB4NjEsIDB4NDQsIDB4MjEsIDB4RkEsIDB4MDEsIDB4NjcsIDB4MEQsIDB4RkEsCisJIDB4MTAsIDB4NjEsIDB4MkQsIDB4NjAsIDB4NUUsIDB4NjQsIDB4MUUsIDB4NjMsIDB4NTgsIDB4RDEsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4RDgsIDB4RkMsIDB4MDIsCisJIDB4QjgsIDB4RjEsIDB4RDYsIDB4RjEsIDB4NjQsIDB4NUUsIDB4NjQsIDB4NUYsIDB4NDQsIDB4NjMsIDB4QkQsIDB4REEsIDB4MTYsIDB4NjAsIDB4QUMsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NEEsIDB4RDMsIDB4NjAsIDB4NDUsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsCisJIDB4MDMsIDB4NjQsIDB4MDIsIDB4MzYsIDB4MDEsIDB4NjQsIDB4QjQsIDB4ODQsIDB4MDYsIDB4QTIsIDB4QTIsIDB4RDEsIDB4QkQsIDB4REEsIDB4NjQsIDB4NDcsCisJIDB4QkQsIDB4REEsIDB4RDMsIDB4RjMsIDB4RDQsIDB4RjEsIDB4NjAsIDB4NDcsIDB4QkQsIDB4REEsIDB4NjQsIDB4NDcsIDB4RTIsIDB4RjEsIDB4QkQsIDB4REEsCisJIDB4NjQsIDB4NDQsIDB4QkQsIDB4REEsIDB4MjYsIDB4NDYsIDB4MDAsIDB4NjQsIDB4MjMsIDB4RjAsIDB4M0IsIDB4RjAsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsCisJIDB4MDYsIDB4MDAsIDB4QzAsIDB4NjcsIDB4QTAsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MTAsIDB4QkMsIDB4M0UsIDB4RkEsCisJIDB4MjUsIDB4NjAsIDB4REEsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzgsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QjEsIDB4RjMsCisJIDB4MUYsIDB4RkEsIDB4MzIsIDB4NDcsIDB4MDcsIDB4RkEsIDB4MjQsIDB4N0UsIDB4MDEsIDB4N0YsIDB4MDgsIDB4RkEsIDB4RDYsIDB4RjEsIDB4MDksIDB4RjgsCisJIDB4MDEsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MEEsIDB4RkEsIDB4MDEsIDB4NjQsIDB4MEIsIDB4RkEsIDB4MTgsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsCisJIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MEEsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4NTIsIDB4NjMsIDB4MkUsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MkEsIDB4NjEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsCisJIDB4NUQsIDB4RkIsIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsIDB4NjcsIDB4NDQsIDB4MkMsIDB4RkEsIDB4MkQsIDB4RkEsIDB4MkUsIDB4RkEsIDB4MzIsIDB4RkEsCisJIDB4MzMsIDB4RkEsIDB4MzQsIDB4RkEsIDB4MTIsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QTYsIDB4RjEsIDB4MEUsIDB4RkEsIDB4MDcsIDB4RjgsIDB4MDAsIDB4NjQsCisJIDB4M0UsIDB4RkEsIDB4MEUsIDB4NjAsIDB4M0QsIDB4RkIsIDB4MDYsIDB4QTIsIDB4MTAsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDQsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4MDYsIDB4NjQsIDB4NUEsIDB4REIsIDB4RjgsIDB4NjAsIDB4Q0YsIDB4NjQsIDB4MDgsIDB4NjAsIDB4M0YsIDB4RkIsIDB4MDAsIDB4NjQsCisJIDB4MEUsIDB4NjAsIDB4NDMsIDB4RkIsIDB4MDYsIDB4QTIsIDB4MTAsIDB4NjAsIDB4ODQsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDgsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4MDYsIDB4NjQsIDB4NUEsIDB4REIsIDB4RjgsIDB4NjAsIDB4RDgsIDB4NjQsIDB4MDgsIDB4NjAsIDB4NDEsIDB4RkIsIDB4RjgsIDB4NjAsIDB4QjQsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MzQsIDB4RkIsIDB4MDAsIDB4NjAsIDB4MzAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTMsIDB4RkIsIDB4RjUsIDB4NjAsIDB4MzEsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RjcsIDB4NjAsIDB4NkMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NUQsIDB4RjUsIDB4RUEsIDB4RjEsIDB4MkYsIDB4RjgsIDB4RUIsIDB4RjEsIDB4MzAsIDB4RjgsIDB4RUMsIDB4RjEsIDB4MzEsIDB4RjgsCisJIDB4QzksIDB4RjEsIDB4MTksIDB4RjgsIDB4MDAsIDB4NjMsIDB4ODgsIDB4RkQsIDB4MUIsIDB4NjAsIDB4QjIsIDB4NjMsIDB4ODYsIDB4RkQsIDB4ODcsIDB4RkQsCisJIDB4MjAsIDB4NDAsIDB4MTAsIDB4MkIsIDB4MDAsIDB4MDAsIDB4NUQsIDB4RjUsIDB4NDAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4N0QsIDB4RjMsIDB4N0MsIDB4RkIsCisJIDB4MDgsIDB4NjAsIDB4MTIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MDMsIDB4MDAsIDB4RjYsIDB4NjAsIDB4QzYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4M0QsIDB4RjMsIDB4RkQsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4QUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4M0YsIDB4RkIsIDB4MTksIDB4NjAsIDB4MzksIDB4RjMsIDB4M0YsIDB4NDAsCisJIDB4MDEsIDB4MjcsIDB4MDgsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4RkMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MzQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MEYsIDB4QjQsIDB4RkMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUQsIDB4RjUsCisJIDB4MzUsIDB4NjAsIDB4NzAsIDB4NjQsIDB4MDAsIDB4RjQsIDB4NDAsIDB4NDgsIDB4MkYsIDB4NjAsIDB4MjQsIDB4NjQsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MjcsCisJIDB4MDIsIDB4MDAsIDB4MkYsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjgsIDB4REIsIDB4MDQsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RjEsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUQsIDB4RjUsIDB4M0YsIDB4RkMsIDB4MDEsIDB4NjQsIDB4NTQsIDB4RjEsIDB4MTAsIDB4NjAsCisJIDB4MTIsIDB4RkIsIDB4N0QsIDB4RkIsIDB4QTQsIDB4RDMsIDB4MDQsIDB4NjUsIDB4NTMsIDB4RjMsIDB4MDEsIDB4MTgsIDB4MEMsIDB4NjUsIDB4RjMsIDB4QjQsCisJIDB4QjQsIDB4ODQsIDB4NTMsIDB4RkIsIDB4MEQsIDB4MDAsIDB4RjcsIDB4NjAsIDB4NkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTMsIDB4RjEsIDB4N0QsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4RjMsIDB4QTAsIDB4MDQsIDB4QTQsIDB4MDEsIDB4MDQsIDB4RjEsIDB4QTQsIDB4MTAsIDB4MzYsIDB4RjQsIDB4MDEsIDB4N0QsIDB4RkIsCisJIDB4MjAsIDB4NDAsIDB4MTAsIDB4MkIsIDB4MTAsIDB4MDAsIDB4N0QsIDB4RjMsIDB4MzIsIDB4NjAsIDB4ODAsIDB4NjEsIDB4QTEsIDB4RDEsIDB4Q0MsIDB4ODQsCisJIDB4MDEsIDB4NjEsIDB4MDgsIDB4MjQsIDB4MDMsIDB4MDAsIDB4RTEsIDB4ODEsIDB4Q0MsIDB4ODQsIDB4RkIsIDB4MDEsIDB4QTEsIDB4ODQsIDB4NTMsIDB4RjEsCisJIDB4RTYsIDB4MDMsIDB4MTAsIDB4NjAsIDB4MTIsIDB4RkIsIDB4N0QsIDB4RjMsIDB4MTAsIDB4NjAsIDB4RjIsIDB4NjEsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MDMsIDB4MDYsIDB4QTEsIDB4RkIsIDB4MDEsIDB4QTEsIDB4RDMsIDB4NTMsIDB4RjEsIDB4MDEsIDB4QjAsIDB4MDIsIDB4QjAsIDB4RDcsIDB4MDMsCisJIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MjcsIDB4MDIsIDB4MDAsIDB4RDAsIDB4MDMsIDB4MDAsIDB4MDAsCisJIDB4OUQsIDB4RkUsIDB4M0QsIDB4MDUsIDB4QkEsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MjQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsCisJIDB4MEEsIDB4MDQsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTMsIDB4RkIsIDB4RjUsIDB4NjAsIDB4Q0IsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MjQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4N0QsIDB4RjEsCisJIDB4MTMsIDB4NjAsIDB4MUEsIDB4RjksIDB4MDgsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTMsIDB4RkIsIDB4RjUsIDB4NjAsIDB4RjAsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MUIsIDB4NjAsIDB4RjMsIDB4RjEsIDB4QUQsIDB4NEYsIDB4MDAsIDB4N0YsIDB4RkEsIDB4QjQsIDB4NjQsIDB4NDEsIDB4N0QsIDB4RjEsIDB4MDIsIDB4QjEsCisJIDB4MDQsIDB4NjUsIDB4MDIsIDB4MDIsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDEsIDB4NjUsIDB4QjQsIDB4ODQsIDB4QTAsIDB4NUQsIDB4MTAsIDB4NjAsCisJIDB4MjQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MTMsIDB4RkIsIDB4RjUsIDB4NjAsIDB4QzgsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0QsIDB4RjEsCisJIDB4MTMsIDB4NjAsIDB4MUEsIDB4RjksIDB4MEUsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTMsIDB4RkIsIDB4RjYsIDB4NjAsIDB4MjgsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MTAsIDB4NjAsIDB4MjQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NUQsIDB4RjUsIDB4MjUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsCisJIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDAsIDB4NjQsCisJIDB4NTEsIDB4RkIsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTMsIDB4RkIsIDB4RjYsIDB4NjAsIDB4NEMsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4QzEsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MjQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4QzMsIDB4RjEsIDB4MEUsIDB4NjAsIDB4M0YsIDB4RjksIDB4MUMsIDB4NjAsIDB4N0EsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4QzQsIDB4RjEsIDB4MEUsIDB4NjAsIDB4NDUsIDB4RjksIDB4MjYsIDB4NjAsIDB4NDIsIDB4NjIsCisJIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RkQsIDB4MUIsIDB4MUMsIDB4NjAsIDB4ODYsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTMsIDB4RkIsIDB4RjYsIDB4NjAsCisJIDB4NzUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NTEsIDB4RjEsIDB4MTAsIDB4NjAsIDB4MjQsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjQsIDB4NDAsIDB4RkYsIDB4MjYsIDB4MEIsIDB4MDAsIDB4NTMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4ODAsIDB4QjAsCisJIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4RjcsIDB4NjAsIDB4NjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RjUsIDB4NjAsIDB4OTYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MEEsIDB4MDAsIDB4NjQsIDB4NTEsIDB4RkIsIDB4QzUsIDB4RjEsIDB4MEUsIDB4NjAsIDB4NDUsIDB4RjksIDB4MDAsIDB4NjAsIDB4MEMsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTMsIDB4RkIsIDB4RjYsIDB4NjAsIDB4QTAsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MUMsIDB4NjAsIDB4ODYsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4NjAsIDB4MTIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MEIsIDB4MDMsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MUMsIDB4NjAsIDB4ODYsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4RkYsIDB4MTMsIDB4MDAsIDB4RkYsIDB4NjAsIDB4RjcsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NTEsIDB4RjMsIDB4REUsIDB4MEEsCisJIDB4MDAsIDB4QTAsIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDMsIDB4NTEsIDB4RkIsIDB4RDksIDB4MDEsIDB4MUMsIDB4NjAsIDB4N0EsIDB4NjQsIDB4MTMsIDB4NjAsCisJIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4QjcsIDB4MDEsIDB4MTksIDB4NjAsIDB4M0UsIDB4RjMsCisJIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4M0YsIDB4RkIsIDB4MTksIDB4NjAsIDB4M0EsIDB4RjMsCisJIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4RkMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUQsIDB4RjUsCisJIDB4MzUsIDB4NjAsIDB4NzAsIDB4NjQsIDB4MDAsIDB4RjQsIDB4NDAsIDB4NDgsIDB4MkYsIDB4NjAsIDB4MjQsIDB4NjQsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MjcsCisJIDB4MDIsIDB4MDAsIDB4MkYsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjgsIDB4REIsIDB4MDQsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RjEsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUQsIDB4RjUsIDB4M0YsIDB4RkMsIDB4NTMsIDB4RjMsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MjMsCisJIDB4MDIsIDB4MDAsIDB4MjAsIDB4QkMsIDB4MDQsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjIsIDB4NDAsIDB4QkMsIDB4MDQsIDB4QkMsIDB4ODAsIDB4QkMsCisJIDB4NTMsIDB4RkIsIDB4MTEsIDB4NjAsIDB4NjIsIDB4NjQsIDB4MDgsIDB4NjAsIDB4NkMsIDB4RkIsIDB4MDYsIDB4NjQsIDB4MDgsIDB4NjAsIDB4NzMsIDB4RkIsCisJIDB4MTksIDB4NjAsIDB4NDMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDcsIDB4QjQsIDB4QTIsIDB4REIsIDB4NTMsIDB4RjMsIDB4MDgsIDB4NjAsIDB4NkMsIDB4RjEsCisJIDB4NjAsIDB4NDAsIDB4MjAsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MzIsIDB4MDAsIDB4NDUsIDB4MDAsIDB4MDgsIDB4NjAsIDB4NzMsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4REQsIDB4QTAsIDB4MDEsIDB4QTQsIDB4NTgsIDB4MDMsIDB4QTIsIDB4REIsIDB4MzIsIDB4NjAsIDB4ODIsIDB4NjEsIDB4RTAsIDB4QTAsCisJIDB4RjAsIDB4QTAsIDB4MDUsIDB4MDUsIDB4MDEsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDIsIDB4QTEsIDB4RjAsIDB4QTQsIDB4MDIsIDB4MDAsIDB4MDQsIDB4QTEsCisJIDB4RTAsIDB4QTQsIDB4QTEsIDB4RDEsIDB4MDEsIDB4NjEsIDB4REMsIDB4ODQsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4RTEsIDB4ODEsCisJIDB4RkIsIDB4MDEsIDB4QTEsIDB4ODAsIDB4MTAsIDB4NjAsIDB4RTYsIDB4NjQsIDB4MDEsIDB4MDIsIDB4RTAsIDB4MDEsIDB4QTAsIDB4RDMsIDB4MTEsIDB4NjAsCisJIDB4NUEsIDB4NjMsIDB4RkEsIDB4QTQsIDB4Q0MsIDB4ODQsIDB4MDgsIDB4QTMsIDB4RkQsIDB4MDIsIDB4Q0YsIDB4RjEsIDB4QTMsIDB4RDMsIDB4MDEsIDB4MTgsCisJIDB4RDUsIDB4MTgsIDB4RkUsIDB4QTMsIDB4QTMsIDB4RDMsIDB4N0QsIDB4RkIsIDB4RjUsIDB4NjAsIDB4QzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTIsIDB4NjAsCisJIDB4NDAsIDB4NjUsIDB4NjQsIDB4NDEsIDB4QTEsIDB4RDMsIDB4RDUsIDB4ODAsIDB4MDAsIDB4QjgsIDB4MjYsIDB4MDcsIDB4MDIsIDB4MDIsIDB4MDgsIDB4QTEsCisJIDB4RjksIDB4MDEsIDB4NjEsIDB4NDQsIDB4MDgsIDB4NjAsIDB4NkMsIDB4RkIsIDB4MDEsIDB4NjQsIDB4QTEsIDB4REIsIDB4NDksIDB4RDMsIDB4N0QsIDB4RkIsCisJIDB4RjUsIDB4NjAsIDB4QzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTIsIDB4NjAsIDB4NDAsIDB4NjUsIDB4NjQsIDB4NDEsIDB4QTEsIDB4RDMsIDB4RDUsIDB4ODAsCisJIDB4MDQsIDB4QjAsIDB4MTIsIDB4MDcsIDB4MDIsIDB4MDIsIDB4MDgsIDB4QTEsIDB4RjksIDB4MDEsIDB4NjEsIDB4NDQsIDB4MDgsIDB4NjAsIDB4NkMsIDB4RkIsCisJIDB4NDksIDB4RDMsIDB4N0QsIDB4RkIsIDB4RjUsIDB4NjAsIDB4QzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4RDgsIDB4NjUsIDB4QTUsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4QTQsIDB4QTUsIDB4REIsIDB4OTksIDB4MDEsIDB4MUMsIDB4NjAsIDB4N0EsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsCisJIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4NTMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RTMsIDB4QjQsIDB4NTMsIDB4RkIsCisJIDB4MTAsIDB4NjAsIDB4MTAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4MjQsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTMsIDB4RkIsIDB4RjcsIDB4NjAsCisJIDB4N0QsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0MsIDB4RjEsIDB4N0QsIDB4RjksIDB4MTMsIDB4NjAsCisJIDB4MUEsIDB4RjksIDB4MEUsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MTMsIDB4RkIsIDB4RjcsIDB4NjAsIDB4OUYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QkUsIDB4RkUsCisJIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4NTMsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4ODAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4NTQsIDB4MDIsIDB4MUMsIDB4NjAsIDB4MzIsIDB4NjMsIDB4MUMsIDB4NjEsIDB4Q0QsIDB4ODEsCisJIDB4QkQsIDB4REYsIDB4RkQsIDB4MDIsIDB4MTQsIDB4NjAsIDB4MzIsIDB4NjEsIDB4ODgsIDB4RjMsIDB4NjEsIDB4NDMsIDB4QzQsIDB4QTUsIDB4NDcsIDB4RDEsCisJIDB4MEYsIDB4MDQsIDB4QkUsIDB4RDUsIDB4MUMsIDB4NjAsIDB4MkUsIDB4NjMsIDB4QzMsIDB4ODMsIDB4QzMsIDB4ODMsIDB4QzMsIDB4ODMsIDB4NDMsIDB4RDMsCisJIDB4QkUsIDB4RDEsIDB4REMsIDB4ODQsIDB4QTMsIDB4REIsIDB4NjYsIDB4NDQsIDB4QzAsIDB4ODQsIDB4QkUsIDB4REIsIDB4NjUsIDB4NDQsIDB4RUQsIDB4MDEsCisJIDB4MUMsIDB4NjAsIDB4MzIsIDB4NjMsIDB4MEUsIDB4NjEsIDB4NDEsIDB4NEIsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDEsIDB4MDAsIDB4QkQsIDB4NjQsIDB4NDEsCisJIDB4MTksIDB4MDMsIDB4MDEsIDB4QTgsIDB4NjEsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MTUsIDB4MDMsIDB4MDIsIDB4MDIsIDB4RTksIDB4ODQsIDB4MTIsIDB4MDAsCisJIDB4NjUsIDB4NDcsIDB4NjAsIDB4NDUsIDB4NjEsIDB4NDQsIDB4MDksIDB4NjEsIDB4Q0QsIDB4ODEsIDB4RTAsIDB4ODQsIDB4RkYsIDB4MjMsIDB4RkMsIDB4MDEsCisJIDB4MDIsIDB4MjQsIDB4QzQsIDB4ODQsIDB4MDIsIDB4MjgsIDB4RDQsIDB4ODQsIDB4Q0QsIDB4ODEsIDB4MDEsIDB4MEUsIDB4MDEsIDB4QkMsIDB4MDIsIDB4MDMsCisJIDB4RTAsIDB4ODQsIDB4RjYsIDB4MDEsIDB4MDAsIDB4N0YsIDB4MkIsIDB4NDEsIDB4NEQsIDB4OEIsIDB4QkYsIDB4REIsIDB4REQsIDB4MDIsIDB4MTQsIDB4NjAsCisJIDB4MzIsIDB4NjEsIDB4ODgsIDB4RjMsIDB4NjEsIDB4NDMsIDB4QzQsIDB4QTUsIDB4NDcsIDB4RDEsIDB4MEEsIDB4MDQsIDB4REEsIDB4ODYsIDB4MUMsIDB4NjAsCisJIDB4MzAsIDB4NjMsIDB4QzMsIDB4ODMsIDB4QzMsIDB4ODMsIDB4QzMsIDB4ODMsIDB4NDMsIDB4RDEsIDB4QTYsIDB4RDksIDB4NjUsIDB4NDQsIDB4RjIsIDB4MDEsCisJIDB4NTMsIDB4RjMsIDB4ODgsIDB4RjEsIDB4RjMsIDB4QjQsIDB4NTMsIDB4RkIsIDB4MTQsIDB4NjAsIDB4MzIsIDB4NjMsIDB4QzMsIDB4ODUsIDB4NDUsIDB4NEEsCisJIDB4MUIsIDB4NjAsIDB4QjIsIDB4NjUsIDB4ODcsIDB4RjMsIDB4NDUsIDB4NEMsIDB4NDAsIDB4NDgsIDB4MkEsIDB4NDUsIDB4RDcsIDB4ODAsIDB4MDIsIDB4NjUsCisJIDB4MTcsIDB4MDUsIDB4NDcsIDB4RDEsIDB4MDIsIDB4NjUsIDB4NDcsIDB4RDMsIDB4MEEsIDB4NjUsIDB4RDAsIDB4ODEsIDB4NDcsIDB4RDMsIDB4MDEsIDB4MDUsCisJIDB4MDAsIDB4NjEsIDB4RjIsIDB4QTMsIDB4MDEsIDB4QjAsIDB4NjEsIDB4NDQsIDB4MDUsIDB4MDMsIDB4MkMsIDB4REIsIDB4NUEsIDB4REQsIDB4NUEsIDB4OEMsCisJIDB4M0MsIDB4QTMsIDB4RUIsIDB4MDEsIDB4MjgsIDB4NDIsIDB4NEEsIDB4REQsIDB4NEEsIDB4REIsIDB4NDIsIDB4NDgsIDB4M0MsIDB4QTMsIDB4RTUsIDB4MDEsCisJIDB4MjgsIDB4NDQsIDB4ODYsIDB4RkIsIDB4ODYsIDB4RjEsIDB4MUIsIDB4NjAsIDB4QjIsIDB4NjMsIDB4NDQsIDB4NDgsIDB4MjgsIDB4NDUsIDB4RDcsIDB4ODAsCisJIDB4QTMsIDB4RDEsIDB4MTUsIDB4MDUsIDB4MDQsIDB4NjUsIDB4NDYsIDB4RDMsIDB4MjgsIDB4NDUsIDB4RDYsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDIsIDB4MDQsCisJIDB4MDQsIDB4QTMsIDB4RjUsIDB4MDEsIDB4RjcsIDB4MDYsIDB4NjIsIDB4NDYsIDB4QTIsIDB4RDksIDB4QTMsIDB4REIsIDB4NUIsIDB4RDMsIDB4NjYsIDB4NDIsCisJIDB4NUEsIDB4RDEsIDB4QTIsIDB4REIsIDB4QTMsIDB4RDksIDB4RkUsIDB4QTMsIDB4QTMsIDB4RDEsIDB4NjYsIDB4NDIsIDB4RUIsIDB4MDEsIDB4ODYsIDB4RjMsCisJIDB4ODcsIDB4RjEsIDB4NjAsIDB4NDMsIDB4NDQsIDB4NDgsIDB4MjgsIDB4NDUsIDB4RDcsIDB4ODAsIDB4QTMsIDB4RDEsIDB4MTUsIDB4MDUsIDB4MDQsIDB4NjUsCisJIDB4NDYsIDB4RDMsIDB4MjgsIDB4NDUsIDB4RDYsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDIsIDB4MDQsIDB4MDQsIDB4QTMsIDB4RjUsIDB4MDEsIDB4RjcsIDB4MDYsCisJIDB4NjIsIDB4NDYsIDB4QTIsIDB4RDksIDB4QTMsIDB4REIsIDB4NUIsIDB4RDMsIDB4NjYsIDB4NDIsIDB4NUEsIDB4RDEsIDB4QTIsIDB4REIsIDB4QTMsIDB4RDksCisJIDB4RkUsIDB4QTMsIDB4QTMsIDB4RDEsIDB4NjYsIDB4NDIsIDB4RUIsIDB4MDEsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4N0QsIDB4RjEsIDB4MTksIDB4NjAsIDB4M0QsIDB4RjMsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjcsCisJIDB4MjcsIDB4MDAsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4M0YsIDB4RkIsIDB4MTksIDB4NjAsCisJIDB4MzksIDB4RjMsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MTYsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4NjAsIDB4NDEsIDB4REIsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MTksIDB4NjAsIDB4NDQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MDEsIDB4MDAsIDB4MEYsIDB4NjEsIDB4NjEsIDB4NDQsIDB4QTQsIDB4ODQsIDB4RkMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MzQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTYsIDB4MDAsIDB4MEYsIDB4QjQsIDB4RkMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MDAsCisJIDB4NUEsIDB4RDMsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4M0YsIDB4RkIsIDB4MTksIDB4NjAsCisJIDB4M0EsIDB4RjMsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4RkMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4MzAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTMsIDB4RkIsIDB4RjUsIDB4NjAsIDB4MzEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4N0EsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsCisJIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NTMsIDB4RkIsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MTIsIDB4RkIsIDB4NUEsIDB4REIsIDB4QkUsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MzAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTMsIDB4RkIsIDB4RjUsIDB4NjAsCisJIDB4MzEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsCisJIDB4MTIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4NjAsIDB4MTIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4NDAsIDB4OTAsIDB4MkIsIDB4MDMsIDB4MDAsIDB4RkIsIDB4NjAsIDB4RkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTMsIDB4RjMsCisJIDB4ODgsIDB4RjEsIDB4MDQsIDB4QjAsIDB4MDcsIDB4NjAsIDB4ODAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MjAsIDB4MDMsIDB4MUYsIDB4MDYsIDB4MjYsIDB4NDYsCisJIDB4ODgsIDB4RjEsIDB4MTQsIDB4NjAsIDB4MzIsIDB4NjMsIDB4QzMsIDB4ODMsIDB4N0QsIDB4RjMsIDB4MjYsIDB4RjAsIDB4QkQsIDB4REIsIDB4NjQsIDB4NDQsCisJIDB4MDAsIDB4N0YsIDB4QkQsIDB4REIsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4QkQsIDB4REIsIDB4MzIsIDB4RjAsIDB4QkQsIDB4RDksIDB4MzMsIDB4RjAsCisJIDB4QkQsIDB4RDksIDB4MzQsIDB4RjAsIDB4QkQsIDB4RDksIDB4MDAsIDB4RjQsIDB4MEQsIDB4RjAsIDB4QkQsIDB4RDksIDB4MEUsIDB4RjAsIDB4QkQsIDB4RDksCisJIDB4MEYsIDB4RjAsIDB4QTMsIDB4REYsIDB4NjQsIDB4NDcsIDB4NjAsIDB4NDUsIDB4MDAsIDB4MzcsIDB4MDMsIDB4MDAsIDB4RkIsIDB4NjAsIDB4RjcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QkQsIDB4REIsIDB4RTAsIDB4QTAsIDB4MUYsIDB4NjEsIDB4MDAsIDB4QjgsIDB4RjgsIDB4MDcsIDB4RjcsIDB4MDMsIDB4NjAsIDB4RkUsCisJIDB4NUQsIDB4RDAsIDB4Q0MsIDB4ODQsIDB4QkQsIDB4RDksIDB4RkMsIDB4MDIsIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjYsIDB4REYsIDB4ODMsIDB4NUQsIDB4RDAsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4M0EsIDB4MDMsIDB4MDAsIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsIDB4QzEsIDB4ODEsIDB4NUQsIDB4RDAsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDMsIDB4MzYsIDB4MDcsIDB4MDAsIDB4NTMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MkEsCisJIDB4REQsIDB4MDEsIDB4Q0QsIDB4ODEsIDB4MTMsIDB4MDAsIDB4NTMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MkEsIDB4MDQsIDB4MDAsCisJIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsIDB4QzEsIDB4ODEsIDB4MEEsIDB4MDAsIDB4NTksIDB4RDAsIDB4N0QsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsCisJIDB4MjAsIDB4RkUsIDB4MDgsIDB4MjQsIDB4MDMsIDB4MDAsIDB4RkIsIDB4NjAsIDB4RjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4N0MsIDB4NDQsIDB4MUEsIDB4NjAsCisJIDB4MjQsIDB4RkIsIDB4MUEsIDB4NjAsIDB4MjUsIDB4RkIsIDB4MUEsIDB4NjAsIDB4MjYsIDB4RkIsIDB4MUEsIDB4NjAsIDB4MjcsIDB4RkIsIDB4MUMsIDB4NjAsCisJIDB4MDgsIDB4RkIsIDB4MUMsIDB4NjAsIDB4MDQsIDB4RkIsIDB4MDAsIDB4NjQsIDB4MUMsIDB4NjAsIDB4MDQsIDB4RkIsIDB4MjAsIDB4RkUsIDB4MzcsIDB4NjAsCisJIDB4RkUsIDB4NjQsIDB4NDAsIDB4NEEsIDB4RjksIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4MDQsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDksIDB4MTgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4MDYsIDB4RjMsIDB4MUMsIDB4NjAsIDB4MDcsIDB4RjUsIDB4NjAsIDB4NDEsCisJIDB4MDAsIDB4NjQsIDB4MUMsIDB4NjAsIDB4MDQsIDB4RkIsIDB4MjAsIDB4RkUsIDB4MkEsIDB4RDEsIDB4REEsIDB4ODUsIDB4NjQsIDB4NDQsIDB4MDEsIDB4QTAsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDIsIDB4NzksIDB4MDAsIDB4NDUsIDB4NEEsIDB4N0MsIDB4NDQsIDB4NjAsIDB4RkUsIDB4QTEsIDB4RDIsIDB4RkYsIDB4RkYsCisJIDB4RDAsIDB4ODAsIDB4MjAsIDB4RkUsIDB4MDEsIDB4MDMsIDB4RUYsIDB4MDEsIDB4MUMsIDB4NjAsIDB4MDQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MTgsCisJIDB4REQsIDB4ODEsIDB4MzUsIDB4MDAsIDB4NjAsIDB4RkUsIDB4NUQsIDB4RDIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NUMsIDB4NDEsIDB4OTQsIDB4ODEsIDB4QTAsCisJIDB4MjAsIDB4RkUsIDB4MkQsIDB4MDQsIDB4MDEsIDB4NjQsIDB4MUMsIDB4NjAsIDB4MDQsIDB4RkIsIDB4QzEsIDB4ODQsIDB4ODQsIDB4QTQsIDB4MUMsIDB4NjAsCisJIDB4MDYsIDB4RkIsIDB4MDAsIDB4RjIsIDB4MUMsIDB4NjAsIDB4MDcsIDB4RkIsIDB4MUMsIDB4NjAsIDB4MDUsIDB4RkQsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsCisJIDB4Q0QsIDB4ODUsIDB4NjQsIDB4NDQsIDB4RDgsIDB4ODEsIDB4Q0QsIDB4ODQsIDB4NEMsIDB4OTEsIDB4NjAsIDB4NDMsIDB4NjAsIDB4RkUsIDB4QTUsIDB4RDIsCisJIDB4REUsIDB4ODUsIDB4N0YsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4NUQsIDB4OTMsIDB4QTMsIDB4REIsIDB4NUQsIDB4OTMsCisJIDB4QTUsIDB4RDIsIDB4RjYsIDB4MUYsIDB4NUQsIDB4OTMsIDB4MjAsIDB4RkUsIDB4REYsIDB4ODMsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjEsIDB4MDIsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4RTAsIDB4ODcsIDB4NjAsIDB4NDYsIDB4MUMsIDB4NjAsIDB4MDUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsIDB4NjAsIDB4RkUsCisJIDB4Q0QsIDB4ODEsIDB4MjAsIDB4RkUsIDB4MkEsIDB4NDQsIDB4MzgsIDB4NjAsIDB4MDAsIDB4N0MsIDB4RDAsIDB4ODQsIDB4MzgsIDB4NjAsIDB4MDQsIDB4NjUsCisJIDB4NDQsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4MDQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MTgsIDB4MUMsIDB4NjAsCisJIDB4MDYsIDB4RjMsIDB4MUMsIDB4NjAsIDB4MDcsIDB4RjUsIDB4NjAsIDB4NDEsIDB4MDAsIDB4NjQsIDB4MUMsIDB4NjAsIDB4MDQsIDB4RkIsIDB4MjYsIDB4NDQsCisJIDB4MDEsIDB4QTQsIDB4NTgsIDB4OTAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4NjEsIDB4NDQsIDB4MEIsIDB4QTUsIDB4MDQsIDB4MDAsIDB4NjEsIDB4NDQsCisJIDB4RkMsIDB4QTQsIDB4OEIsIDB4N0MsIDB4QzAsIDB4ODUsIDB4REQsIDB4ODEsIDB4NjYsIDB4NDQsIDB4MUMsIDB4NjAsIDB4MDcsIDB4RkIsIDB4MjYsIDB4NDYsCisJIDB4MUIsIDB4RjAsIDB4MUMsIDB4NjAsIDB4MDcsIDB4RjUsIDB4NjQsIDB4NDQsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDYsIDB4MkQsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4RkEsIDB4NjAsIDB4RTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4RkUsIDB4NUQsIDB4RDIsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsCisJIDB4RkYsIDB4QjQsIDB4NDEsIDB4OTQsIDB4ODEsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDQsIDB4MDAsIDB4RjQsIDB4ODQsIDB4QTQsIDB4NjAsIDB4NDEsCisJIDB4NUQsIDB4MDEsIDB4MUEsIDB4NjAsIDB4MkMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4M0EsIDB4NkMsIDB4MDEsIDB4NjEsIDB4NUMsCisJIDB4MUEsIDB4NjAsIDB4MkIsIDB4RjksIDB4NjAsIDB4RkUsIDB4NUQsIDB4RDIsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjAsCisJIDB4MDIsIDB4MDAsIDB4RkYsIDB4QTEsIDB4NjAsIDB4MDEsIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDIsIDB4MDAsCisJIDB4RkUsIDB4QTEsIDB4NTksIDB4MDEsIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDIsIDB4MDAsIDB4RkQsIDB4QTEsCisJIDB4NTIsIDB4MDEsIDB4MDEsIDB4N0MsIDB4MUMsIDB4NjAsIDB4MDgsIDB4RjksIDB4NEMsIDB4MDAsIDB4MUEsIDB4NjAsIDB4MkMsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MTgsIDB4NDksIDB4MDEsIDB4MDAsIDB4N0MsIDB4MUMsIDB4NjAsIDB4MDgsIDB4RjksIDB4NjEsIDB4NUMsIDB4MUEsIDB4NjAsIDB4MkIsIDB4RjksCisJIDB4NjAsIDB4RkUsIDB4NUQsIDB4RDIsIDB4RkYsIDB4RkYsIDB4RkEsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjAsIDB4MDQsIDB4MDAsIDB4RkYsIDB4QTEsCisJIDB4RjksIDB4NjAsIDB4NkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDQsIDB4MDAsCisJIDB4QzksIDB4ODEsIDB4RjksIDB4NjAsIDB4NkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NTAsIDB4MzYsCisJIDB4MDQsIDB4MDAsIDB4RkQsIDB4QTEsIDB4RjksIDB4NjAsIDB4NkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsCisJIDB4RjIsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RkMsIDB4QTEsIDB4RjksIDB4NjAsIDB4NkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RkIsIDB4QTEsIDB4RjksIDB4NjAsIDB4NkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUQsIDB4RDAsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RkEsIDB4QTEsIDB4RjksIDB4NjAsIDB4NkIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RjksIDB4QTEsIDB4RjksIDB4NjAsIDB4NkIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NUMsIDB4MDAsIDB4MzYsIDB4MzIsIDB4MDAsIDB4MDAsIDB4NjQsIDB4RkIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NjYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDAsIDB4MDgsIDB4MjYsIDB4RjcsIDB4MDEsIDB4MUEsIDB4NjAsIDB4MjQsIDB4RkIsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsCisJIDB4MkEsIDB4MDAsIDB4NUQsIDB4RDIsIDB4REQsIDB4ODEsIDB4RkIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDAsCisJIDB4MDgsIDB4MjYsIDB4RjYsIDB4MDEsIDB4MUEsIDB4NjAsIDB4MjUsIDB4RkIsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MjEsIDB4MDAsIDB4NUQsIDB4RDIsCisJIDB4REQsIDB4ODEsIDB4RkIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDAsIDB4MDgsIDB4MjYsIDB4RjYsIDB4MDEsCisJIDB4MUEsIDB4NjAsIDB4MjYsIDB4RkIsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MTgsIDB4MDAsIDB4NUQsIDB4RDAsIDB4MzQsIDB4NjAsIDB4NEUsIDB4NjIsCisJIDB4QTIsIDB4RDksIDB4NUQsIDB4RDAsIDB4MzQsIDB4NjAsIDB4NEYsIDB4NjIsIDB4QTIsIDB4RDksIDB4MTQsIDB4MDAsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsCisJIDB4MDQsIDB4NjQsIDB4MUEsIDB4NjAsIDB4MjQsIDB4RkIsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4MUEsIDB4NjAsIDB4MjUsIDB4RkIsCisJIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MUEsIDB4NjAsIDB4MjYsIDB4RkIsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4MUEsIDB4NjAsIDB4MjcsIDB4RkIsIDB4MjAsIDB4RkUsIDB4MUMsIDB4NjAsIDB4MDgsIDB4RjEsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MTgsIDB4MDEsIDB4N0MsCisJIDB4MUMsIDB4NjAsIDB4MDgsIDB4RjksIDB4MUEsIDB4NjAsIDB4MkIsIDB4RjEsIDB4QTIsIDB4REQsIDB4NjEsIDB4NDQsIDB4MUEsIDB4NjAsIDB4MjgsIDB4RkIsCisJIDB4RDEsIDB4ODQsIDB4REMsIDB4ODQsIDB4NjQsIDB4NDUsIDB4MzQsIDB4NjAsIDB4MTAsIDB4NjMsIDB4QkQsIDB4REIsIDB4NjAsIDB4NDEsIDB4Q0QsIDB4ODQsCisJIDB4NEMsIDB4OTEsIDB4NjAsIDB4NDMsIDB4NjAsIDB4RkUsIDB4QTUsIDB4RDIsIDB4REUsIDB4ODUsIDB4N0YsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsCisJIDB4MDQsIDB4NjUsIDB4NUQsIDB4OTMsIDB4QTMsIDB4REIsIDB4NUQsIDB4OTMsIDB4QTUsIDB4RDIsIDB4RjYsIDB4MUYsIDB4NUQsIDB4OTMsIDB4MjAsIDB4RkUsCisJIDB4REYsIDB4ODMsIDB4MUEsIDB4NjAsIDB4MDksIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4QTIsIDB4REIsIDB4MUEsIDB4NjAsIDB4MjgsIDB4RjMsCisJIDB4MUEsIDB4NjAsIDB4MkIsIDB4RjEsIDB4NjAsIDB4NDEsIDB4NjQsIDB4NDMsIDB4RjksIDB4NjAsIDB4NTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsCisJIDB4N0MsIDB4NDQsIDB4MUEsIDB4NjAsIDB4MjAsIDB4RkIsIDB4MUEsIDB4NjAsIDB4MUEsIDB4RjEsIDB4MUEsIDB4NjAsIDB4MjQsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4QTAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MjYsIDB4MDcsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDcsIDB4MDAsIDB4MjAsIDB4MjYsIDB4MDcsIDB4MDAsCisJIDB4MDIsIDB4MjYsIDB4MDcsIDB4MDAsIDB4M0YsIDB4MDAsIDB4MTAsIDB4N0MsIDB4MDUsIDB4MDAsIDB4MDQsIDB4N0MsIDB4MDMsIDB4MDAsIDB4MjAsIDB4N0MsCisJIDB4MDEsIDB4MDAsIDB4MDIsIDB4N0MsIDB4MUEsIDB4NjAsIDB4MjAsIDB4RjksIDB4N0MsIDB4NDQsIDB4MUEsIDB4NjAsIDB4MjEsIDB4RkIsIDB4MUEsIDB4NjAsCisJIDB4MUIsIDB4RjEsIDB4MUEsIDB4NjAsIDB4MjUsIDB4RjMsIDB4MzQsIDB4NjAsIDB4NDAsIDB4NjEsIDB4QTAsIDB4ODQsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsCisJIDB4MTAsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MDgsIDB4MDAsIDB4MjMsIDB4MDAsIDB4MTAsIDB4N0MsCisJIDB4MDYsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MUUsIDB4MDAsIDB4MDQsIDB4N0MsIDB4MDEsIDB4MDAsIDB4MDEsIDB4N0MsIDB4MUEsIDB4NjAsCisJIDB4MjEsIDB4RjksIDB4N0MsIDB4NDQsIDB4MUEsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MUEsIDB4NjAsIDB4MUMsIDB4RjEsIDB4MUEsIDB4NjAsIDB4MjYsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MDEsIDB4MjYsCisJIDB4MDUsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDIsIDB4N0MsIDB4MDMsIDB4MDAsIDB4MDQsIDB4N0MsIDB4MDEsIDB4MDAsIDB4MjAsIDB4N0MsIDB4MUEsIDB4NjAsCisJIDB4MjIsIDB4RjksIDB4MDksIDB4MDAsIDB4N0MsIDB4NDQsIDB4MUEsIDB4NjAsIDB4MjAsIDB4RkIsIDB4MUEsIDB4NjAsIDB4MjEsIDB4RkIsIDB4MUEsIDB4NjAsCisJIDB4MjIsIDB4RkIsIDB4MUEsIDB4NjAsIDB4MjMsIDB4RkIsIDB4N0MsIDB4NDQsIDB4MUEsIDB4NjAsIDB4MjAsIDB4RjEsIDB4QkQsIDB4RDksIDB4MUEsIDB4NjAsCisJIDB4MjEsIDB4RjEsIDB4QjAsIDB4ODQsIDB4QkQsIDB4RDksIDB4MUEsIDB4NjAsIDB4MjIsIDB4RjEsIDB4QjAsIDB4ODQsIDB4QkQsIDB4RDksIDB4MUEsIDB4NjAsCisJIDB4MUQsIDB4RjEsIDB4QjAsIDB4ODQsIDB4QkQsIDB4RDksIDB4MDQsIDB4MDMsIDB4MUMsIDB4NjAsIDB4MDgsIDB4RjEsIDB4QkQsIDB4RDksIDB4NzIsIDB4MDAsCisJIDB4MTYsIDB4NjAsIDB4QzIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MjQsIDB4NkIsIDB4MDAsIDB4NjAsIDB4NDAsCisJIDB4MEIsIDB4MzYsIDB4NjgsIDB4MDAsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MjcsIDB4NjUsIDB4MDAsIDB4OTEsIDB4MDAsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjUsCisJIDB4NjAsIDB4RkUsIDB4MUEsIDB4NjAsIDB4MjgsIDB4RkIsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MDgsIDB4MjAsIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4MDIsIDB4QTUsIDB4NjQsIDB4NDQsIDB4RDQsIDB4OUMsIDB4RDQsIDB4ODAsIDB4MzQsIDB4NjAsIDB4NTIsIDB4NjIsCisJIDB4MDIsIDB4MDUsIDB4MDgsIDB4NjUsIDB4NEQsIDB4MDAsIDB4QTIsIDB4RDksIDB4N0MsIDB4NDQsIDB4MzQsIDB4NjAsIDB4NTQsIDB4NjIsIDB4QTIsIDB4REIsCisJIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjQsIDB4NjAsIDB4RkUsIDB4MUMsIDB4NjAsIDB4MDgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTAsIDB4NUQsIDB4RDAsCisJIDB4MDAsIDB4NjUsIDB4MDQsIDB4MDMsIDB4NjQsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MDEsIDB4NjUsIDB4MDMsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MDAsIDB4M0EsCisJIDB4MDEsIDB4NjUsIDB4NUQsIDB4RDAsIDB4MDQsIDB4MDMsIDB4NjQsIDB4NDAsIDB4MEYsIDB4M0EsIDB4MDEsIDB4NjUsIDB4MDMsIDB4MDAsIDB4NjQsIDB4NDAsCisJIDB4NTAsIDB4M0EsIDB4MDEsIDB4NjUsIDB4NUQsIDB4RDAsIDB4MDQsIDB4MDMsIDB4NjQsIDB4NDAsIDB4QUMsIDB4M0EsIDB4MDEsIDB4NjUsIDB4MDMsIDB4MDAsCisJIDB4NjQsIDB4NDAsIDB4RjIsIDB4M0EsIDB4MDEsIDB4NjUsIDB4NUQsIDB4RDAsIDB4NjUsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MTcsIDB4MDAsIDB4MDAsIDB4NjAsCisJIDB4MDAsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDEsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDIsIDB4NjUsIDB4NjQsIDB4NDAsCisJIDB4MDIsIDB4MzYsIDB4MDQsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDQsIDB4MzYsIDB4MTAsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDUsIDB4MzYsIDB4MjAsIDB4NjUsCisJIDB4NjUsIDB4NUMsIDB4MUEsIDB4NjAsIDB4MkEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MUEsIDB4NjAsIDB4MjgsIDB4RjMsCisJIDB4MDAsIDB4NjUsIDB4RkYsIDB4QTQsIDB4QTIsIDB4REIsIDB4QkMsIDB4MDIsIDB4MUEsIDB4NjAsIDB4MkEsIDB4RjMsIDB4MUEsIDB4NjAsIDB4MjksIDB4RjEsCisJIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4ODgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4M0MsIDB4QTQsIDB4ODgsIDB4RkIsIDB4ODcsIDB4RjMsCisJIDB4N0QsIDB4RjEsIDB4MDQsIDB4QTQsIDB4ODcsIDB4RkIsIDB4NTMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MjYsIDB4MEQsIDB4MDAsCisJIDB4N0QsIDB4RjMsIDB4MTAsIDB4NjAsIDB4RjIsIDB4NjEsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4MDYsIDB4QTEsIDB4RkIsIDB4MDEsCisJIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4QTEsIDB4REIsIDB4MTIsIDB4MDAsIDB4N0QsIDB4RjMsIDB4MTEsIDB4NjAsIDB4NjAsIDB4NjMsCisJIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4MTIsIDB4NjAsIDB4NDAsIDB4NjUsIDB4QTMsIDB4RDEsIDB4RDcsIDB4ODAsIDB4RDAsIDB4ODAsCisJIDB4MDYsIDB4MDMsIDB4MDIsIDB4MDMsIDB4MDgsIDB4QTMsIDB4RjksIDB4MDEsIDB4MDIsIDB4QTMsIDB4MDQsIDB4NjQsIDB4QTMsIDB4REIsIDB4MjAsIDB4RkUsCisJIDB4MjYsIDB4NDYsIDB4MzEsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MzUsIDB4MDAsIDB4M0YsIDB4RjIsIDB4NDcsIDB4NjUsIDB4QzQsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4MjMsIDB4RkEsIDB4RjEsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjQsIDB4RkEsIDB4N0QsIDB4RjMsIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsCisJIDB4MDEsIDB4MjMsIDB4MTQsIDB4MDAsIDB4MTEsIDB4NjAsIDB4NjAsIDB4NjEsIDB4MTIsIDB4NjAsIDB4NDAsIDB4NjUsIDB4QTEsIDB4RDEsIDB4RDUsIDB4ODAsCisJIDB4RDAsIDB4ODAsIDB4MEIsIDB4MDMsIDB4MDIsIDB4MDMsIDB4MDgsIDB4QTEsIDB4RjksIDB4MDEsIDB4MDQsIDB4QTEsIDB4QTEsIDB4RDMsIDB4MDEsIDB4NjAsCisJIDB4MDAsIDB4NjUsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4QjQsIDB4ODQsIDB4MDEsIDB4MDAsIDB4MDEsIDB4NjQsIDB4MDAsIDB4RjQsIDB4MDgsIDB4RkEsCisJIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MjYsIDB4NjAsIDB4MEEsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NzgsIDB4RkIsIDB4QUMsIDB4ODUsIDB4NjAsIDB4NDEsIDB4NTUsIDB4MDMsCisJIDB4MzIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4MUIsIDB4NjAsIDB4MDQsIDB4RkQsIDB4NjIsIDB4NDMsIDB4MUEsIDB4NjAsIDB4QjQsIDB4RkQsIDB4MUEsIDB4NjAsCisJIDB4QkEsIDB4RkQsIDB4MUEsIDB4NjAsIDB4QzQsIDB4RkQsIDB4MUEsIDB4NjAsIDB4Q0UsIDB4RkQsIDB4MDAsIDB4NjMsIDB4RTksIDB4ODEsIDB4MDgsIDB4NjQsCisJIDB4MDIsIDB4MjQsIDB4REYsIDB4ODMsIDB4RkIsIDB4MDIsIDB4NTMsIDB4OTQsIDB4MzIsIDB4N0YsIDB4MDMsIDB4MDYsIDB4MUIsIDB4NjAsIDB4MDQsIDB4RkIsCisJIDB4MDgsIDB4NjMsIDB4NjMsIDB4NUUsIDB4MDEsIDB4N0YsIDB4MTksIDB4NjAsIDB4OEEsIDB4RkIsIDB4NjUsIDB4NDEsIDB4MzMsIDB4NjAsIDB4MTYsIDB4NjUsCisJIDB4MEYsIDB4NjAsIDB4RjQsIDB4NjQsIDB4RTksIDB4ODEsIDB4NTgsIDB4RDEsIDB4RkQsIDB4MDQsIDB4Q0YsIDB4ODMsIDB4QTUsIDB4RDksIDB4MEMsIDB4MDMsCisJIDB4RTksIDB4ODEsIDB4NTgsIDB4RDEsIDB4RkQsIDB4MDQsIDB4NDAsIDB4NDgsIDB4QTUsIDB4RDEsIDB4NjQsIDB4NUYsIDB4NjQsIDB4NUUsIDB4QTUsIDB4REIsCisJIDB4REEsIDB4ODUsIDB4Q0YsIDB4ODMsIDB4MjgsIDB4NDQsIDB4RUUsIDB4MDIsIDB4MDAsIDB4QjksIDB4RDgsIDB4ODMsIDB4MTUsIDB4MDMsIDB4MzYsIDB4NjAsCisJIDB4MEEsIDB4NjUsIDB4RTksIDB4ODEsIDB4QkQsIDB4RDEsIDB4MDIsIDB4MDUsIDB4RkMsIDB4MDIsIDB4MTcsIDB4MDAsIDB4QTUsIDB4RDksIDB4MTUsIDB4MDMsCisJIDB4RTksIDB4ODEsIDB4QkQsIDB4RDEsIDB4MDIsIDB4MDUsIDB4RkMsIDB4MDIsIDB4MTAsIDB4MDAsIDB4QTUsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NUYsCisJIDB4QTUsIDB4REIsIDB4REEsIDB4ODUsIDB4RUUsIDB4MDIsIDB4MDksIDB4MDAsIDB4NjcsIDB4NDMsIDB4MUEsIDB4NjAsIDB4QjQsIDB4RkQsIDB4MUEsIDB4NjAsCisJIDB4QkEsIDB4RkQsIDB4MUEsIDB4NjAsIDB4QzQsIDB4RkQsIDB4MUEsIDB4NjAsIDB4Q0UsIDB4RkQsIDB4MkUsIDB4NDUsIDB4MjUsIDB4NjAsIDB4NDYsIDB4NjQsCisJIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MDMsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MjcsIDB4MEQsIDB4MDAsIDB4MzMsIDB4NjAsIDB4MUUsIDB4NjEsCisJIDB4MTksIDB4NjAsIDB4OEEsIDB4RjMsIDB4QTEsIDB4REIsIDB4RkYsIDB4QjQsIDB4Q0MsIDB4ODQsIDB4QTgsIDB4ODMsIDB4MzMsIDB4NjAsIDB4MTQsIDB4NjQsCisJIDB4NTgsIDB4RDEsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4N0QsIDB4RjMsIDB4MzMsIDB4NjAsIDB4MjAsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsCisJIDB4MDMsIDB4MDAsIDB4MTksIDB4NjAsIDB4M0IsIDB4RjMsIDB4MDIsIDB4MDAsIDB4MTksIDB4NjAsIDB4M0MsIDB4RjMsIDB4MDgsIDB4NjEsIDB4NjAsIDB4RkUsCisJIDB4QTMsIDB4RDEsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MDAsIDB4QTgsIDB4RTgsIDB4ODQsIDB4MEYsIDB4MDMsIDB4NjAsIDB4RkUsIDB4MDIsIDB4MjgsCisJIDB4RjYsIDB4MDEsIDB4ODAsIDB4NjIsIDB4QjIsIDB4OUMsIDB4QkQsIDB4RDksIDB4N0IsIDB4RjksIDB4Q0QsIDB4ODEsIDB4MDAsIDB4MzYsIDB4MDEsIDB4MDAsCisJIDB4RUUsIDB4MDEsIDB4MzYsIDB4NjAsIDB4MEEsIDB4NjMsIDB4MDgsIDB4NjEsIDB4RUEsIDB4MDEsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NjAsCisJIDB4NzYsIDB4NjMsIDB4NjUsIDB4NDAsIDB4RkYsIDB4MzYsIDB4MDIsIDB4QTMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4NDAsIDB4MjYsIDB4N0YsIDB4QjQsIDB4MjAsIDB4MjYsIDB4M0YsIDB4QjQsIDB4NjAsIDB4NDUsIDB4ODAsIDB4NjMsCisJIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4N0QsIDB4RkIsIDB4NDAsIDB4NjMsIDB4RkQsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4N0UsIDB4RkIsIDB4MjAsIDB4NjMsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4N0YsIDB4RkIsIDB4MTAsIDB4NjMsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4ODAsIDB4RkIsIDB4MDgsIDB4NjMsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTksIDB4NjAsIDB4ODEsIDB4RkIsIDB4MDQsIDB4NjMsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsCisJIDB4ODIsIDB4RkIsIDB4MDIsIDB4NjMsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4ODMsIDB4RkIsCisJIDB4MDEsIDB4NjMsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4ODQsIDB4RkIsIDB4MkUsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4M0IsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MEYsIDB4QjQsIDB4NjAsIDB4NDUsIDB4MDgsIDB4NjMsIDB4RkQsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4NUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4ODUsIDB4RkIsIDB4MDQsIDB4NjMsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4NUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4ODYsIDB4RkIsIDB4MDIsIDB4NjMsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NUYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4ODcsIDB4RkIsIDB4MDEsIDB4NjMsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NUYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTksIDB4NjAsIDB4ODgsIDB4RkIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NUMsIDB4QTcsIDB4ODQsIDB4RUIsIDB4ODMsIDB4MTQsIDB4MDIsCisJIDB4MDEsIDB4MDMsIDB4RkIsIDB4MDEsIDB4NjQsIDB4NDQsIDB4MDEsIDB4MzYsIDB4MEIsIDB4NjQsIDB4MDIsIDB4MzYsIDB4MEIsIDB4NjQsIDB4MDQsIDB4MzYsCisJIDB4MEEsIDB4NjQsIDB4MDgsIDB4MzYsIDB4MEEsIDB4NjQsIDB4MTAsIDB4MzYsIDB4MDksIDB4NjQsIDB4MjAsIDB4MzYsIDB4MDksIDB4NjQsIDB4NDAsIDB4MzYsCisJIDB4MDksIDB4NjQsIDB4ODAsIDB4MzYsIDB4MDksIDB4NjQsIDB4MTEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MEIsIDB4NjQsIDB4MDIsIDB4MzYsCisJIDB4MEYsIDB4NjQsIDB4MDQsIDB4MzYsIDB4MEEsIDB4NjQsIDB4MDgsIDB4MzYsIDB4MEUsIDB4NjQsIDB4MTAsIDB4MzYsIDB4MDksIDB4NjQsIDB4MjAsIDB4MzYsCisJIDB4MEQsIDB4NjQsIDB4NDAsIDB4MzYsIDB4MDgsIDB4NjQsIDB4ODAsIDB4MzYsIDB4MEMsIDB4NjQsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NUMsCisJIDB4QTcsIDB4ODQsIDB4RUIsIDB4ODMsIDB4MEMsIDB4MDIsIDB4MDEsIDB4MDMsIDB4RkIsIDB4MDEsIDB4NjQsIDB4NDQsIDB4MDEsIDB4MzYsIDB4MEEsIDB4NjQsCisJIDB4MDIsIDB4MzYsIDB4MTQsIDB4NjQsIDB4MDQsIDB4MzYsIDB4MzcsIDB4NjQsIDB4MDgsIDB4MzYsIDB4NkUsIDB4NjQsIDB4MDksIDB4MDAsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MzYsIDB4MEEsIDB4NjQsIDB4MDIsIDB4MzYsIDB4MTQsIDB4NjQsIDB4MDQsIDB4MzYsIDB4MzcsIDB4NjQsIDB4MDgsIDB4MzYsIDB4NkUsIDB4NjQsCisJIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4RkUsIDB4ODEsIDB4QTEsIDB4N0YsIDB4QTEsIDB4MDIsIDB4MDYsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsCisJIDB4NUQsIDB4RDIsIDB4Q0YsIDB4ODMsIDB4RDQsIDB4ODAsIDB4MjUsIDB4MDMsIDB4MTYsIDB4MDMsIDB4Q0YsIDB4ODMsIDB4NjEsIDB4NDQsIDB4ODAsIDB4QTAsCisJIDB4MjAsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsIDB4NUQsIDB4RDIsIDB4Q0YsIDB4ODMsIDB4ODEsIDB4QTEsIDB4MTksIDB4MDMsCisJIDB4MDUsIDB4MDcsIDB4N0YsIDB4QTEsIDB4Q0MsIDB4ODQsIDB4REQsIDB4ODEsIDB4RTYsIDB4MDMsIDB4RjcsIDB4MDEsIDB4MDAsIDB4RjQsIDB4MDAsIDB4QjgsCisJIDB4MDQsIDB4NjEsIDB4RTYsIDB4MDMsIDB4RjIsIDB4MDEsIDB4MkMsIDB4NDMsIDB4NUQsIDB4RDAsIDB4REUsIDB4RDksIDB4NjQsIDB4NDQsIDB4NUQsIDB4RDAsCisJIDB4REUsIDB4RDksIDB4Q0MsIDB4ODQsIDB4ODEsIDB4QTEsIDB4MDUsIDB4MDMsIDB4N0YsIDB4QTEsIDB4RjksIDB4MDQsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsCisJIDB4RjYsIDB4MDEsIDB4MjAsIDB4RkUsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTYsIDB4NjQsIDB4MkIsIDB4MDAsCisJIDB4MDIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTQsIDB4NjQsIDB4MjcsIDB4MDAsIDB4MDQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTIsIDB4NjQsIDB4MjMsIDB4MDAsCisJIDB4MDgsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTAsIDB4NjQsIDB4MUYsIDB4MDAsIDB4MTAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEUsIDB4NjQsIDB4MUIsIDB4MDAsCisJIDB4MjAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEMsIDB4NjQsIDB4MTcsIDB4MDAsIDB4NDAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEEsIDB4NjQsIDB4MTMsIDB4MDAsCisJIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjQsIDB4MEYsIDB4MDAsIDB4MDEsIDB4M0IsIDB4MDIsIDB4MDAsIDB4MDYsIDB4NjQsIDB4MEIsIDB4MDAsCisJIDB4MDIsIDB4M0IsIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjQsIDB4MDcsIDB4MDAsIDB4MDQsIDB4M0IsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjQsIDB4MDMsIDB4MDAsCisJIDB4MDgsIDB4M0IsIDB4RkYsIDB4MDEsIDB4MDAsIDB4NjQsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MzYsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjEsIDB4MzAsIDB4MDAsIDB4MzAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjEsIDB4MkMsIDB4MDAsCisJIDB4MjQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjEsIDB4MjgsIDB4MDAsIDB4MTgsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDYsIDB4NjEsIDB4MjQsIDB4MDAsCisJIDB4MTIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjEsIDB4MjAsIDB4MDAsIDB4MEMsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEEsIDB4NjEsIDB4MUMsIDB4MDAsCisJIDB4MDksIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEMsIDB4NjEsIDB4MTgsIDB4MDAsIDB4MDYsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEUsIDB4NjEsIDB4MTQsIDB4MDAsCisJIDB4NkUsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTAsIDB4NjEsIDB4MTAsIDB4MDAsIDB4MzcsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTIsIDB4NjEsIDB4MEMsIDB4MDAsCisJIDB4MTQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTQsIDB4NjEsIDB4MDgsIDB4MDAsIDB4MEEsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTYsIDB4NjEsIDB4MDQsIDB4MDAsCisJIDB4NzgsIDB4NDMsIDB4MDMsIDB4NjEsIDB4MjksIDB4NjAsIDB4RUEsIDB4NzgsIDB4NjUsIDB4NDAsIDB4MDEsIDB4M0EsIDB4MTMsIDB4MDAsIDB4NjYsIDB4NDUsCisJIDB4MkIsIDB4NDYsIDB4OTIsIDB4RkEsIDB4NjUsIDB4NDYsIDB4MjYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDUsCisJIDB4NjEsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RDQsIDB4ODQsIDB4NjYsIDB4NDEsIDB4MkIsIDB4NDYsIDB4MEUsIDB4RjIsIDB4NjAsIDB4NDUsIDB4NjUsIDB4NUUsCisJIDB4MEUsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4Q0QsIDB4ODEsIDB4N0YsIDB4QjQsIDB4MDIsIDB4M0EsIDB4MDIsIDB4MDAsCisJIDB4MDEsIDB4NjQsIDB4MzIsIDB4MDAsIDB4MDQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjQsIDB4MkUsIDB4MDAsIDB4MEIsIDB4M0EsIDB4MDIsIDB4MDAsCisJIDB4MDQsIDB4NjQsIDB4MkEsIDB4MDAsIDB4MTYsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjQsIDB4MjYsIDB4MDAsIDB4MEMsIDB4M0EsIDB4MDIsIDB4MDAsCisJIDB4MTAsIDB4NjQsIDB4MjIsIDB4MDAsIDB4MTIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MjAsIDB4NjQsIDB4MUUsIDB4MDAsIDB4MTgsIDB4M0EsIDB4MDIsIDB4MDAsCisJIDB4NDAsIDB4NjQsIDB4MUEsIDB4MDAsIDB4MjQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4ODAsIDB4NjQsIDB4MTYsIDB4MDAsIDB4MzAsIDB4M0EsIDB4MDMsIDB4MDAsCisJIDB4MDAsIDB4N0UsIDB4MDEsIDB4N0YsIDB4MTEsIDB4MDAsIDB4NDgsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MDAsIDB4N0UsIDB4MDIsIDB4N0YsIDB4MEMsIDB4MDAsCisJIDB4NjAsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MDAsIDB4N0UsIDB4MDQsIDB4N0YsIDB4MDcsIDB4MDAsIDB4NkMsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MDAsIDB4N0UsCisJIDB4MDgsIDB4N0YsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MjAsIDB4RkUsIDB4MkEsIDB4NDUsIDB4MzQsIDB4OEEsIDB4NjAsIDB4RkUsCisJIDB4NjEsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDIsIDB4MDAsIDB4QkQsIDB4RDMsIDB4QkYsIDB4MDEsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsCisKK307ICAvKiBmd19pbWFnZV80X2RhdGEgKi8KKworc3RhdGljIGNvbnN0IENGR19JREVOVElUWV9TVFJDVCBmd19pbWFnZV9pbmZvaWRlbnRpdHlbXSA9IHsKKwl7CisJCXNpemVvZiggQ0ZHX0lERU5USVRZX1NUUkNUICkgLyBzaXplb2YoaGNmXzE2KSAtIDEsCisJCUNGR19GV19JREVOVElUWSwKKwkJQ09NUF9JRF9GV19TVEEsCisJCTQsCQkJCQkJCS8vVmFyaWFudAorCQkxLAkJCQkJCQkvL01ham9yCisJCTM2CQkJCQkJCS8vTWlub3IKKwl9LAorCXsgMDAwMCwgMDAwMCwgMDAwMCwgMDAwMCwgMDAwMCwgMDAwMCB9CQkvL2VuZHNlbnRpbmVsCit9OworCitzdGF0aWMgY29uc3QgQ0ZHX1BST0dfU1RSQ1QgZndfaW1hZ2VfY29kZVtdID0geworCXsKKwkJOCwKKwkJQ0ZHX1BST0csCisJCUNGR19QUk9HX1ZPTEFUSUxFLAkJCS8vIG1vZGUKKwkJMHgwMTg0LAkJLy8gc2l6ZW9mKGZ3X2ltYWdlXzFfZGF0YSksCisJCTB4MDAwMDAwNjAsCQkJCQkvLyBUYXJnZXQgYWRkcmVzcyBpbiBOSUMgTWVtb3J5CisJCTB4MDAwMCwJCQkJCQkvLyBDUkM6IHllcy9ubwlUWVBFOiBwcmltYXJ5L3N0YXRpb24vdGVydGlhcnkKKwkJKGhjZl84IEZBUiAgICopIGZ3X2ltYWdlXzFfZGF0YQorCX0sCisJeworCQk4LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfVk9MQVRJTEUsCQkJLy8gbW9kZQorCQkweDJjMGUsCQkvLyBzaXplb2YoZndfaW1hZ2VfMl9kYXRhKSwKKwkJMHgwMDAwMEMxNiwJCQkJCS8vIFRhcmdldCBhZGRyZXNzIGluIE5JQyBNZW1vcnkKKwkJMHgwMDAwLAkJCQkJCS8vIENSQzogeWVzL25vCVRZUEU6IHByaW1hcnkvc3RhdGlvbi90ZXJ0aWFyeQorCQkoaGNmXzggRkFSICAgKikgZndfaW1hZ2VfMl9kYXRhCisJfSwKKwl7CisJCTgsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19WT0xBVElMRSwJCQkvLyBtb2RlCisJCTB4NTRkZSwJCS8vIHNpemVvZihmd19pbWFnZV8zX2RhdGEpLAorCQkweDAwMUUzODI0LAkJCQkJLy8gVGFyZ2V0IGFkZHJlc3MgaW4gTklDIE1lbW9yeQorCQkweDAwMDAsCQkJCQkJLy8gQ1JDOiB5ZXMvbm8JVFlQRTogcHJpbWFyeS9zdGF0aW9uL3RlcnRpYXJ5CisJCShoY2ZfOCBGQVIgICAqKSBmd19pbWFnZV8zX2RhdGEKKwl9LAorCXsKKwkJOCwKKwkJQ0ZHX1BST0csCisJCUNGR19QUk9HX1ZPTEFUSUxFLAkJCS8vIG1vZGUKKwkJMHhiY2RlLAkJLy8gc2l6ZW9mKGZ3X2ltYWdlXzRfZGF0YSksCisJCTB4MDAxRjQwMDAsCQkJCQkvLyBUYXJnZXQgYWRkcmVzcyBpbiBOSUMgTWVtb3J5CisJCTB4MDAwMCwJCQkJCQkvLyBDUkM6IHllcy9ubwlUWVBFOiBwcmltYXJ5L3N0YXRpb24vdGVydGlhcnkKKwkJKGhjZl84IEZBUiAgICopIGZ3X2ltYWdlXzRfZGF0YQorCX0sCisJeworCQk1LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfU1RPUCwJCQkJLy8gbW9kZQorCQkwMDAwLAorIAkweDAwMEY0MjlCLAkJCQkJLy8gU3RhcnQgZXhlY3V0aW9uIGFkZHJlc3MKKwl9LAorCXsgMDAwMCwgMDAwMCwgMDAwMCwgMDAwMCwgMDAwMDAwMDAsIDAwMDAsIDAwMDAwMDAwfQorfTsKKworc3RhdGljIGNvbnN0IENGR19SQU5HRTIwX1NUUkNUIGZ3X2ltYWdlX2luZm9jb21wYXRbXSA9IHsKKwl7CTMgKyAoKDIwICogc2l6ZW9mKENGR19SQU5HRV9TUEVDX1NUUkNUKSkgLyBzaXplb2YoaGNmXzE2KSksCisJCUNGR19GV19TVVBfUkFOR0UsCisJCUNPTVBfUk9MRV9TVVBMLAorCQlDT01QX0lEX1NUQSwKKwkJeworCQkJeyA0LCAxLCAyIH0gIAkJCQkvL3ZhcmlhbnQsIGJvdHRvbSwgdG9wCisJCX0KKwl9LAorCXsJMyArICgoMjAgKiBzaXplb2YoQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QpKSAvIHNpemVvZihoY2ZfMTYpKSwKKwkJQ0ZHX01GSV9BQ1RfUkFOR0VTX1NUQSwKKwkJQ09NUF9ST0xFX0FDVCwKKwkJQ09NUF9JRF9NRkksCisJCXsKKwkJCXsgNywgMywgMyB9LCAJCQkJLy92YXJpYW50LCBib3R0b20sIHRvcAorCQkJeyA4LCAxLCAxIH0gIAkJCQkvL3ZhcmlhbnQsIGJvdHRvbSwgdG9wCisJCX0KKwl9LAorCXsJMyArICgoMjAgKiBzaXplb2YoQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QpKSAvIHNpemVvZihoY2ZfMTYpKSwKKwkJQ0ZHX0NGSV9BQ1RfUkFOR0VTX1NUQSwKKwkJQ09NUF9ST0xFX0FDVCwKKwkJQ09NUF9JRF9DRkksCisJCXsKKwkJCXsgNCwgMSwgMiB9ICAJCQkJLy92YXJpYW50LCBib3R0b20sIHRvcAorCQl9CisJfSwKKwl7IDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAsIHsgeyAwMDAwLCAwMDAwLCAwMDAwIH0gfSB9CS8vZW5kc2VudGluZWwKK307CisKK21lbWltYWdlIGZ3X2ltYWdlID0geworCSJGVVBVN0QzN2RoZndjaVwwMDFDIiwJCQkvL3NpZ25hdHVyZSwgPGZvcm1hdCBudW1iZXI+LCBDL0JpbiB0eXBlCisJKENGR19QUk9HX1NUUkNUICopIGZ3X2ltYWdlX2NvZGUsCisJMHgwMDBGNDI5QiwKKwkwMDAwMDAwMCwJCQkJCS8vKGR1bW15KSBwZGFwbHVnCisJMDAwMDAwMDAsCQkJCQkvLyhkdW1teSkgcHJpcGx1ZworCShDRkdfUkFOR0UyMF9TVFJDVCAqKSBmd19pbWFnZV9pbmZvY29tcGF0LAorCShDRkdfSURFTlRJVFlfU1RSQ1QgKikgZndfaW1hZ2VfaW5mb2lkZW50aXR5LAorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODExYThkYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2NzLmMKQEAgLTAsMCArMSw3MDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBUaGlzIGZpbGUgY29udGFpbnMgcHJvY2Vzc2luZyBhbmQgaW5pdGlhbGl6YXRpb24gc3BlY2lmaWMgdG8gQ2FyZCBTZXJ2aWNlcworICogICBkZXZpY2VzIChQQ01DSUEsIENGKS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8d2xfdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKyNpbmNsdWRlIDxkZWJ1Zy5oPgorCisjaW5jbHVkZSA8aGNmLmg+CisjaW5jbHVkZSA8ZGhmLmg+CisjaW5jbHVkZSA8aGNmZGVmLmg+CisKKyNpbmNsdWRlIDx3bF9pZi5oPgorI2luY2x1ZGUgPHdsX2ludGVybmFsLmg+CisjaW5jbHVkZSA8d2xfdXRpbC5oPgorI2luY2x1ZGUgPHdsX21haW4uaD4KKyNpbmNsdWRlIDx3bF9uZXRkZXYuaD4KKyNpbmNsdWRlIDx3bF9jcy5oPgorI2luY2x1ZGUgPHdsX3N5c2ZzLmg+CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBtYWNybyBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgZG8geyBcCisgICAgICAgICAgICAgICAgICAgIGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyBcCisgICAgICAgICAgICB9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGdsb2JhbCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBEQkcKK2V4dGVybiBkYmdfaW5mb190ICpEYmdJbmZvOworI2VuZGlmICAvKiBEQkcgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfYWRhcHRlcl9hdHRhY2goKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvcgorICogIG9uZSBkZXZpY2UuIFRoZSBkZXZpY2UgaXMgcmVnaXN0ZXJlZCB3aXRoIENhcmQgU2VydmljZXMuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBub25lCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBwb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBkZXZfbGlua190IHN0cnVjdHVyZQorICogICAgICBOVUxMIG9uIGZhaWx1cmUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3bF9hZGFwdGVyX2F0dGFjaChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXY7CisgICAgc3RydWN0IHdsX3ByaXZhdGUJKmxwOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9hdHRhY2giICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICBkZXYgPSB3bF9kZXZpY2VfYWxsb2MoKTsKKyAgICBpZihkZXYgPT0gTlVMTCkgeworICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJ3bF9kZXZpY2VfYWxsb2MgcmV0dXJuZWQgTlVMTFxuIik7CisJcmV0dXJuIC1FTk9NRU07CisgICAgfQorCisgICAgbGluay0+aW8uTnVtUG9ydHMxICAgICAgPSBIQ0ZfTlVNX0lPX1BPUlRTOworICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxICAgID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OworICAgIGxpbmstPmlvLklPQWRkckxpbmVzICAgID0gNjsKKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyAgICA9IElSUV9UWVBFX0RZTkFNSUNfU0hBUklORyB8IElSUV9IQU5ETEVfUFJFU0VOVDsKKyAgICBsaW5rLT5pcnEuSVJRSW5mbzEgICAgICA9IElSUV9JTkZPMl9WQUxJRCB8IElSUV9MRVZFTF9JRDsKKyAgICBsaW5rLT5pcnEuSGFuZGxlciAgICAgICA9ICZ3bF9pc3I7CisgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzICAgPSBDT05GX0VOQUJMRV9JUlE7CisgICAgbGluay0+Y29uZi5JbnRUeXBlICAgICAgPSBJTlRfTUVNT1JZX0FORF9JTzsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ICA9IDU7CisgICAgbGluay0+Y29uZi5QcmVzZW50ICAgICAgPSBQUkVTRU5UX09QVElPTjsKKworICAgIGxpbmstPnByaXYgPSBsaW5rLT5pcnEuSW5zdGFuY2UgPSBkZXY7CisgICAgbHAgPSB3bF9wcml2KGRldik7CisgICAgbHAtPmxpbmsgPSBsaW5rOworCisgICAgd2xfYWRhcHRlcl9pbnNlcnQobGluayk7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm4gMDsKK30gLy8gd2xfYWRhcHRlcl9hdHRhY2gKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfYWRhcHRlcl9kZXRhY2goKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGRlbGV0ZXMgYSBkcml2ZXIgImluc3RhbmNlIi4gVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkIHdpdGggQ2FyZAorICogIFNlcnZpY2VzLiBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgdGhlbiB0aGUgbmV0IGRldmljZSBpcyB1bnJlZ2lzdGVyZWQsIGFuZAorICogIGFsbCBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgYXJlIGZyZWVkLiBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUKKyAqICBmcmVlZCB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBsaW5rICAgIC0gcG9pbnRlciB0byB0aGUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBkZXZpY2UgdG8KKyAqICAgICAgICAgICAgICAgIGRldGFjaAorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHdsX2FkYXB0ZXJfZGV0YWNoKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICAgKmRldiA9IGxpbmstPnByaXY7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfZGV0YWNoIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworICAgIERCR19QQVJBTSggRGJnSW5mbywgImxpbmsiLCAiMHglcCIsIGxpbmsgKTsKKworICAgIHdsX2FkYXB0ZXJfcmVsZWFzZShsaW5rKTsKKworICAgIGlmIChkZXYpIHsKKwl1bnJlZ2lzdGVyX3dsYWdzX3N5c2ZzKGRldik7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgICB9CisKKyAgICB3bF9kZXZpY2VfZGVhbGxvYyhkZXYpOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7Cit9IC8vIHdsX2FkYXB0ZXJfZGV0YWNoCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9hZGFwdGVyX3JlbGVhc2UoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgdGhpcyByb3V0aW5lIHdpbGwgcmVsZWFzZSB0aGUgUENNQ0lBCisgKiAgY29uZmlndXJhdGlvbi4gSWYgdGhlIGRldmljZSBpcyBzdGlsbCBvcGVuLCB0aGlzIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIGl0CisgKiAgaXMgY2xvc2VkLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgYXJnIC0gYSB1X2xvbmcgcmVwcmVzZW50aW5nIGEgcG9pbnRlciB0byBhIGRldl9saW5rX3Qgc3RydWN0dXJlIGZvciB0aGUKKyAqICAgICAgICAgICAgZGV2aWNlIHRvIGJlIHJlbGVhc2VkLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfYWRhcHRlcl9yZWxlYXNlKCBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayApCit7CisgICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX3JlbGVhc2UiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisgICAgREJHX1BBUkFNKCBEYmdJbmZvLCAibGluayIsICIweCVwIiwgbGluayk7CisKKyAgICAvKiBTdG9wIGhhcmR3YXJlICovCisgICAgd2xfcmVtb3ZlKGxpbmstPnByaXYpOworCisgICAgcGNtY2lhX2Rpc2FibGVfZGV2aWNlKGxpbmspOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7Cit9IC8vIHdsX2FkYXB0ZXJfcmVsZWFzZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB3bF9hZGFwdGVyX3N1c3BlbmQoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisKKyAgICAvL2lmIChsaW5rLT5vcGVuKSB7CisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCXdsX3N1c3BlbmQoZGV2KTsKKy8vLy8gQ0hFQ0shICAgICAgICAgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgIC8vfQorCisgICAgcmV0dXJuIDA7Cit9IC8vIHdsX2FkYXB0ZXJfc3VzcGVuZAorCitzdGF0aWMgaW50IHdsX2FkYXB0ZXJfcmVzdW1lKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCisJd2xfcmVzdW1lKGRldik7CisKKwluZXRpZl9kZXZpY2VfYXR0YWNoKCBkZXYgKTsKKworCXJldHVybiAwOworfSAvLyB3bF9hZGFwdGVyX3Jlc3VtZQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfYWRhcHRlcl9pbnNlcnQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICB3bF9hZGFwdGVyX2luc2VydCgpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudCBpcworICogIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZSBldGhlcm5ldCBkZXZpY2UKKyAqICBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxpbmsgICAgLSBwb2ludGVyIHRvIHRoZSBkZXZfbGlua190IHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGRldmljZSB0bworICogICAgICAgICAgICAgICAgaW5zZXJ0CisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9hZGFwdGVyX2luc2VydCggc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmsgKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICAgICAgICpkZXY7CisgICAgaW50IGk7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbGFzdF9mbiwgbGFzdF9yZXQ7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2luc2VydCIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKyAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJsaW5rIiwgIjB4JXAiLCBsaW5rICk7CisKKyAgICBkZXYgICAgID0gbGluay0+cHJpdjsKKworICAgIC8qIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0PyAqLworICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7CisKKyAgICBDU19DSEVDSyhSZXF1ZXN0SU8sIHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbykpOworICAgIENTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLCAmbGluay0+aXJxKSk7CisgICAgQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpKTsKKworCisgICAgZGV2LT5pcnEgICAgICAgID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworICAgIGRldi0+YmFzZV9hZGRyICA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKworICAgIFNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYobGluaykpOworICAgIGlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSAhPSAwKSB7CisJcHJpbnRrKCIlczogcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iLCBNT0RVTEVfTkFNRSk7CisJZ290byBmYWlsZWQ7CisgICAgfQorICAgIGxpbmstPmRldl9ub2RlID0gJiggd2xfcHJpdihkZXYpICktPm5vZGU7CisgICAgc3RyY3B5KCggd2xfcHJpdihkZXYpICktPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisgICAgcmVnaXN0ZXJfd2xhZ3Nfc3lzZnMoZGV2KTsKKworICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBXaXJlbGVzcywgaW9fYWRkciAlIzAzbHgsIGlycSAlZCwgIiJtYWNfYWRkcmVzcyAiLAorICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworICAgIGZvciggaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrICkgeworICAgICAgICBwcmludGsoIiUwMlglYyIsIGRldi0+ZGV2X2FkZHJbaV0sICgoaSA8IChFVEhfQUxFTi0xKSkgPyAnOicgOiAnXG4nKSk7CisgICAgfQorCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuOworCisKK2NzX2ZhaWxlZDoKKyAgICBjc19lcnJvciggbGluaywgbGFzdF9mbiwgbGFzdF9yZXQgKTsKKworCitmYWlsZWQ6CisgICAgd2xfYWRhcHRlcl9yZWxlYXNlKCBsaW5rICk7CisKKyAgICBEQkdfTEVBVkUoRGJnSW5mbyk7CisgICAgcmV0dXJuOworfSAvLyB3bF9hZGFwdGVyX2luc2VydAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfYWRhcHRlcl9vcGVuKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgT3BlbiB0aGUgZGV2aWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBuZXR3b3JrCisgKiAgICAgICAgICAgIGRldmljZSB0byBvcGVuLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfYWRhcHRlcl9vcGVuKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisgICAgc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmsgPSBscC0+bGluazsKKyAgICBpbnQgICAgICAgICByZXN1bHQgPSAwOworICAgIGludCAgICAgICAgIGhjZl9zdGF0dXMgPSBIQ0ZfU1VDQ0VTUzsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9vcGVuIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCURCR19QUklOVCggIiVzXG4iLCBWRVJTSU9OX0lORk8gKTsKKyAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKKworICAgIGlmKCFwY21jaWFfZGV2X3ByZXNlbnQobGluaykpCisgICAgeworICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgbGluay0+b3BlbisrOworCisgICAgaGNmX3N0YXR1cyA9IHdsX29wZW4oIGRldiApOworCisgICAgaWYoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CisgICAgICAgIGxpbmstPm9wZW4tLTsKKyAgICAgICAgcmVzdWx0ID0gLUVOT0RFVjsKKyAgICB9CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm4gcmVzdWx0OworfSAvLyB3bF9hZGFwdGVyX29wZW4KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2FkYXB0ZXJfY2xvc2UoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDbG9zZSB0aGUgZGV2aWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBuZXR3b3JrCisgKiAgICAgICAgICAgIGRldmljZSB0byBjbG9zZS4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2FkYXB0ZXJfY2xvc2UoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayA9IGxwLT5saW5rOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2Nsb3NlIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworICAgIERCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOworCisgICAgaWYoIGxpbmsgPT0gTlVMTCApIHsKKyAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIERCR19UUkFDRSggRGJnSW5mbywgIiVzOiBTaHV0dGluZyBkb3duIGFkYXB0ZXIuXG4iLCBkZXYtPm5hbWUgKTsKKyAgICB3bF9jbG9zZSggZGV2ICk7CisKKyAgICBsaW5rLT5vcGVuLS07CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm4gMDsKK30gLy8gd2xfYWRhcHRlcl9jbG9zZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIHdsX2FkYXB0ZXJfaWRzW10gPSB7CisjaWYgISAoKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUpCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTU2LCAweDAwMDMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBZ2VyZSBTeXN0ZW1zIiwgIldpcmVsZXNzIFBDIENhcmQgTW9kZWwgMDExMCIsCisJCQkgICAgMHgzMzEwM2E5YiwgMHhlMTc1YjBkZCksCisjZWxzZQorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDE1NiwgMHgwMDA0KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTGlua3N5cyIsICJXQ0Y1NEdfV2lyZWxlc3MtR19Db21wYWN0Rmxhc2hfQ2FyZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzMzY2M4MSwgMHg5OGE1OTllMSksCisjZW5kaWYgIC8vIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1CisJUENNQ0lBX0RFVklDRV9OVUxMLAorCX07CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgd2xfYWRhcHRlcl9pZHMpOworCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgd2xhZ3M0OV9kcml2ZXIgPSB7CisgICAgLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCisgICAgLmRydiAgICAgICAgICAgID0geworCS5uYW1lICAgPSBEUklWRVJfTkFNRSwKKyAgICB9LAorICAgIC5wcm9iZQk9IHdsX2FkYXB0ZXJfYXR0YWNoLAorICAgIC5yZW1vdmUJPSB3bF9hZGFwdGVyX2RldGFjaCwKKyAgICAuaWRfdGFibGUJPSB3bF9hZGFwdGVyX2lkcywKKyAgICAuc3VzcGVuZAk9IHdsX2FkYXB0ZXJfc3VzcGVuZCwKKyAgICAucmVzdW1lCT0gd2xfYWRhcHRlcl9yZXN1bWUsCit9OworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2FkYXB0ZXJfaW5pdF9tb2R1bGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDYWxsZWQgYnkgaW5pdF9tb2R1bGUoKSB0byBwZXJmb3JtIFBDTUNJQSBkcml2ZXIgaW5pdGlhbGl6YXRpb24uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBOL0EKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICAtMSBvbiBlcnJvcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfYWRhcHRlcl9pbml0X21vZHVsZSggdm9pZCApCit7CisgICAgaW50IHJldDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9pbml0X21vZHVsZSIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKyAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJ3bF9hZGFwdGVyX2luaXRfbW9kdWxlKCkgLS0gUENNQ0lBXG4iICk7CisKKyAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZ3bGFnczQ5X2RyaXZlcik7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm4gcmV0OworfSAvLyB3bF9hZGFwdGVyX2luaXRfbW9kdWxlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ2FsbGVkIGJ5IGNsZWFudXBfbW9kdWxlKCkgdG8gcGVyZm9ybSBkcml2ZXIgdW5pbml0aWFsaXphdGlvbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSggdm9pZCApCit7CisgICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworICAgIERCR19UUkFDRSggRGJnSW5mbywgIndsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUoKSAtLSBQQ01DSUFcbiIgKTsKKworCisgICAgcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZ3bGFnczQ5X2RyaXZlcik7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm47Cit9IC8vIHdsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2FkYXB0ZXJfaXNfb3BlbigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENoZWNrIHdpdGggQ2FyZCBTZXJ2aWNlcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBkZXZpY2UgaXMgb3Blbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUgd2hvc2Ugb3BlbiBzdGF0dXMgd2lsbCBiZQorICogICAgICAgICAgICBjaGVja2VkCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBub256ZXJvIGlmIGRldmljZSBpcyBvcGVuCisgKiAgICAgIDAgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9hZGFwdGVyX2lzX29wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayA9IGxwLT5saW5rOworCisgICAgaWYoIXBjbWNpYV9kZXZfcHJlc2VudChsaW5rKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4oIGxpbmstPm9wZW4gKTsKK30gLy8gd2xfYWRhcHRlcl9pc19vcGVuCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKyNpZiBEQkcKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCURiZ0V2ZW50KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ29udmVydHMgdGhlIGNhcmQgc2VyaXZjZXMgZXZlbnRzIHRvIHRleHQgZm9yIGRlYnVnZ2luZy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIG1hc2sgICAgLSBhIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBlcnJvcihzKSBiZWluZyByZXBvcnRlZCBieSBDYXJkCisgKiAgICAgICAgICAgICAgICBTZXJ2aWNlcy4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIGEgcG9pbnRlciB0byBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBlcnJvcihzKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBjaGFyKiBEYmdFdmVudCggaW50IG1hc2sgKQoreworICAgIHN0YXRpYyBjaGFyIERiZ0J1ZmZlclsyNTZdOworICAgIGNoYXIgKnBCdWY7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICBwQnVmICAgID0gRGJnQnVmZmVyOworICAgICpwQnVmICAgPSAnXDAnOworCisKKyAgICBpZiggbWFzayAmIENTX0VWRU5UX1dSSVRFX1BST1RFQ1QgKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJXUklURV9QUk9URUNUICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9DQVJEX0xPQ0spCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIkNBUkRfTE9DSyAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04pCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIkNBUkRfSU5TRVJUSU9OICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9DQVJEX1JFTU9WQUwpCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIkNBUkRfUkVNT1ZBTCAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfQkFUVEVSWV9ERUFEKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJCQVRURVJZX0RFQUQgIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX0JBVFRFUllfTE9XKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJCQVRURVJZX0xPVyAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfUkVBRFlfQ0hBTkdFKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJSRUFEWV9DSEFOR0UgIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX0NBUkRfREVURUNUKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJDQVJEX0RFVEVDVCAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfUkVTRVRfUkVRVUVTVCkKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiUkVTRVRfUkVRVUVTVCAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwpCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIlJFU0VUX1BIWVNJQ0FMICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9DQVJEX1JFU0VUKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJDQVJEX1JFU0VUICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9SRUdJU1RSQVRJT05fQ09NUExFVEUpCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIlJFR0lTVFJBVElPTl9DT01QTEVURSAiICk7CisKKyAgICAvLyBpZihtYXNrICYgQ1NfRVZFTlRfUkVTRVRfQ09NUExFVEUpCisgICAgLy8gICAgIHN0cmNhdCggcEJ1ZiwgIlJFU0VUX0NPTVBMRVRFICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9QTV9TVVNQRU5EKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJQTV9TVVNQRU5EICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9QTV9SRVNVTUUpCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIlBNX1JFU1VNRSAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfSU5TRVJUSU9OX1JFUVVFU1QpCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIklOU0VSVElPTl9SRVFVRVNUICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9FSkVDVElPTl9SRVFVRVNUKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJFSkVDVElPTl9SRVFVRVNUICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9NVERfUkVRVUVTVCkKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiTVREX1JFUVVFU1QgIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX0VSQVNFX0NPTVBMRVRFKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJFUkFTRV9DT01QTEVURSAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfUkVRVUVTVF9BVFRFTlRJT04pCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIlJFUVVFU1RfQVRURU5USU9OICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9DQl9ERVRFQ1QpCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIkNCX0RFVEVDVCAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfM1ZDQVJEKQorICAgICAgICBzdHJjYXQoIHBCdWYsICIzVkNBUkQgIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX1hWQ0FSRCkKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiWFZDQVJEICIgKTsKKworCisgICAgaWYoICpwQnVmICkgeworICAgICAgICBwQnVmW3N0cmxlbihwQnVmKSAtIDFdID0gJ1wwJzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiggbWFzayAhPSAweDAgKSB7CisgICAgICAgICAgICBzcHJpbnRmKCBwQnVmLCAiPDwweCUwOHg+PiIsIG1hc2sgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwQnVmOworfSAvLyBEYmdFdmVudAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2VuZGlmICAvKiBEQkcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2NzLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9jcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMGU2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9jcy5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBIZWFkZXIgZGVzY3JpYmluZyBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgdGhlIGRyaXZlciB0byBzdXBwb3J0IFBDTUNJQS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fV0xfQ1NfSF9fCisjZGVmaW5lIF9fV0xfQ1NfSF9fCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZnVuY3Rpb24gcHJvdG95cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHdsX2FkYXB0ZXJfaW5zZXJ0KHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKTsKKwordm9pZCB3bF9hZGFwdGVyX3JlbGVhc2Uoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspOworCitpbnQgd2xfYWRhcHRlcl9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyApOworCitpbnQgd2xfYWRhcHRlcl9pbml0X21vZHVsZSggdm9pZCApOworCit2b2lkIHdsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUoIHZvaWQgKTsKKworaW50IHdsX2FkYXB0ZXJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworaW50IHdsX2FkYXB0ZXJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK2ludCB3bF9hZGFwdGVyX2lzX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjcpCit2b2lkIGNzX2Vycm9yKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGludCBmdW5jLCBpbnQgcmV0KTsKKyNlbmRpZgorCitjb25zdCBjaGFyICpEYmdFdmVudCggaW50IG1hc2sgKTsKKworCisKKyNlbmRpZiAgLy8gX19XTF9DU19IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2VuYy5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjNDRjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2VuYy5jCkBAIC0wLDAgKzEsMjMxIEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBUaGlzIGZpbGUgZGVmaW5lcyBmdW5jdGlvbnMgcmVsYXRlZCB0byBXRVAga2V5IGNvZGluZy9kZWNvZGluZy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8d2xfdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8ZGVidWcuaD4KKyNpbmNsdWRlIDxoY2YuaD4KKworI2luY2x1ZGUgPHdsX2VuYy5oPgorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGdsb2JhbCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBEQkcKKworZXh0ZXJuIGRiZ19pbmZvX3QgKkRiZ0luZm87CisKKyNlbmRpZiAgLyogREJHICovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZXBfY29kZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyBhIHNldCBvZiB3ZXAga2V5cyBmb3IgcHJpdmFjeQorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgc3pDcnlwdCAtCisgKiAgICAgIHN6RGVzdCAgLQorICogICAgICBEYXRhICAgIC0KKyAqICAgICAgbkxlbiAgICAtCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBPSworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfd2VwX2NvZGUoIGNoYXIgKnN6Q3J5cHQsIGNoYXIgKnN6RGVzdCwgdm9pZCAqRGF0YSwgaW50IG5MZW4gKQoreworICAgIGludCAgICAgaTsKKyAgICBpbnQgICAgIHQ7CisgICAgaW50ICAgICBrIDsKKyAgICBjaGFyICAgIGJpdHM7CisgICAgY2hhciAgICAqc3pEYXRhID0gKGNoYXIgKikgRGF0YTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIGZvciggaSA9IGJpdHMgPSAwIDsgaSA8IE1BQ0FERFJFU1NfU1RSX0xFTjsgaSsrICkgeworCSAgICBiaXRzIF49IHN6Q3J5cHRbaV07CisJICAgIGJpdHMgKz0gc3pDcnlwdFtpXTsKKyAgICB9CisKKyAgICBmb3IoIGkgPSB0ID0gKnN6RGVzdCA9IDA7IGkgPCBuTGVuOyBpKyssIHQrKyApIHsKKwkgICAgayA9IHN6RGF0YVtpXSBeICggYml0cyArIGkgKTsKKworCisgICAgICAgIHN3aXRjaCggaSAlIDMgKSB7CisKKyAgICAgICAgY2FzZSAwIDoKKworICAgICAgICAgICAgc3pEZXN0W3RdICAgPSAoKGsgJiAweEZDKSA+PiAyKSArIENIX1NUQVJUIDsKKwkJCXN6RGVzdFt0KzFdID0gKChrICYgMHgwMykgPDwgNCkgKyBDSF9TVEFSVCA7CisJICAgICAgICBzekRlc3RbdCsyXSA9ICdcMCc7CisKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSAxIDoKKworICAgICAgICAgICAgc3pEZXN0W3RdICArPSAoKCBrICYgMHhGMCApID4+IDQgKTsKKwkJCXN6RGVzdFt0KzFdID0gKCggayAmIDB4MEYgKSA8PCAyICkgKyBDSF9TVEFSVCA7CisJICAgICAgICBzekRlc3RbdCsyXSA9ICdcMCc7CisKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSAyIDoKKworICAgICAgICAgICAgc3pEZXN0W3RdICArPSAoKCBrICYgMHhDMCApID4+IDYgKTsKKwkJCXN6RGVzdFt0KzFdID0gKCBrICYgMHgzRiApICsgQ0hfU1RBUlQgOworCSAgICAgICAgc3pEZXN0W3QrMl0gPSAnXDAnOworCSAgICAgICAgdCsrOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiggc3RybGVuKCBzekRlc3QgKSkgOworCit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2VwX2RlY29kZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gZGVjb2RlcyBhIHNldCBvZiBXRVAga2V5cyBmb3IgdXNlIGJ5IHRoZSBjYXJkLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgc3pDcnlwdCAtCisgKiAgICAgIHN6RGVzdCAgLQorICogICAgICBEYXRhICAgIC0KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE9LCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF93ZXBfZGVjb2RlKCBjaGFyICpzekNyeXB0LCB2b2lkICpEZXN0LCBjaGFyICpzekRhdGEgKQoreworICAgIGludCAgICAgaTsKKyAgICBpbnQgICAgIHQ7CisgICAgaW50ICAgICBuTGVuOworICAgIGNoYXIgICAgYml0czsKKyAgICBjaGFyICAgICpzekRlc3QgPSBEZXN0OworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICBmb3IoIGkgPSBiaXRzID0gMCA7IGkgPCAxMjsgaSsrICkgeworICAgICAgYml0cyBePSBzekNyeXB0W2ldIDsKKyAgICAgIGJpdHMgKz0gc3pDcnlwdFtpXSA7CisgIH0KKworICBuTGVuID0gKCBzdHJsZW4oIHN6RGF0YSApICogMykgLyA0IDsKKworICBmb3IoIGkgPSB0ID0gMDsgaSA8IG5MZW47IGkrKywgdCsrICkgeworICAgICAgc3dpdGNoKCBpICUgMyApIHsKKyAgICAgIGNhc2UgMCA6CisKKyAgICAgICAgICBzekRlc3RbaV0gPSAoKCggc3pEYXRhW3RdLUNIX1NUQVJUICkgJiAweDNmICkgPDwgMiApICsKKyAgICAgICAgICAgICAgICAgICAgICAoKCggc3pEYXRhW3QrMV0tQ0hfU1RBUlQgKSAmIDB4MzAgKSA+PiA0ICk7CisJICAgICAgYnJlYWs7CisKKworICAgICAgY2FzZSAxIDoKKyAgICAgICAgICBzekRlc3RbaV0gPSAoKCggc3pEYXRhW3RdLUNIX1NUQVJUICkgJiAweDBmICkgPDwgNCApICsKKyAgICAgICAgICAgICAgICAgICAgICAoKCggc3pEYXRhW3QrMV0tQ0hfU1RBUlQgKSAmIDB4M2MgKSA+PiAyICk7CisJICAgICAgYnJlYWs7CisKKworICAgICAgY2FzZSAyIDoKKyAgICAgICAgICBzekRlc3RbaV0gPSAoKCggc3pEYXRhW3RdLUNIX1NUQVJUICkgJiAweDAzICkgPDwgNiApICsKKyAgICAgICAgICAgICAgICAgICAgICAgKCggc3pEYXRhW3QrMV0tQ0hfU1RBUlQgKSAmIDB4M2YgKTsKKwkgICAgICB0Kys7CisJICAgICAgYnJlYWs7CisgICAgICB9CisKKwlzekRlc3RbaV0gXj0gKCBiaXRzICsgaSApIDsKKworICB9CisKKyAgcmV0dXJuKCBpICkgOworCit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9lbmMuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZjU0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9lbmMuaApAQCAtMCwwICsxLDExOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIEhlYWRlciBmb3IgcGVyZm9ybWluZyBjb2RpbmcvZGVjb2Rpbmcgb2YgdGhlIFdFUCBrZXlzLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19XQVZFTEFOMl9FTkNSWVBUSU9OX0hfXworI2RlZmluZSBfX1dBVkVMQU4yX0VOQ1JZUFRJT05fSF9fCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjb25zdGFudCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ1JZUFRfQ09ERQkJCQkJIjU3NjE3NjY1QTVENiIKKyNkZWZpbmUgRU5DUllQVElPTl9MRU4JCQkJMTAyCisjZGVmaW5lIEVOQ1JZUFRJT05fTUFHSUMJCQkweDQ4NTc2ODc3TAkvLyBIV2h3CisjZGVmaW5lIERFRl9DUllQVF9TVFIJCQkJIkc/VElVRUFdZDVNQWRaVidlVWImJjYuKScmOiwnVkYvKEZSMik2XjUqJyo4Klc2OytHQj4sN05BLSdaRC1YJkcuSDJKLzg+TTAoSlAwWFZTMUhiVjI5LlkzKTpcXDNZRl80SVJiNTYiCisKKyNkZWZpbmUgREVGQVVMVF9DUllQVF9NQUMJCQkiV1x4MDFceDZCXHg2Nlx4QTVceDVBIgorI2RlZmluZSBDSF9TVEFSVAkJCQkJJyYnCisjZGVmaW5lIE1BQ0FERFJFU1NfU1RSX0xFTgkJCTEyCisKKyNkZWZpbmUgS0VZX0xFTiAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIE5VTV9LRVlTICAgICAgICAgICAgICAgICAgICA0CisKKyNkZWZpbmUgS0VZX0xFTkdUSF9OT05FX0FTQ0lJICAgICAgIDAKKyNkZWZpbmUgS0VZX0xFTkdUSF82NF9CSVRfQVNDSUkgICAgIDUKKyNkZWZpbmUgS0VZX0xFTkdUSF8xMjhfQklUX0FTQ0lJICAgIDEzCisKKyNkZWZpbmUgS0VZX0xFTkdUSF9OT05FX0hFWCAgICAgICAgICggS0VZX0xFTkdUSF9OT05FX0FTQ0lJICAgICogc2l6ZW9mKCB1bnNpZ25lZCBzaG9ydCApKQorI2RlZmluZSBLRVlfTEVOR1RIXzY0X0JJVF9IRVggICAgICAgKCBLRVlfTEVOR1RIXzY0X0JJVF9BU0NJSSAgKiBzaXplb2YoIHVuc2lnbmVkIHNob3J0ICkpCisjZGVmaW5lIEtFWV9MRU5HVEhfMTI4X0JJVF9IRVggICAgICAoIEtFWV9MRU5HVEhfMTI4X0JJVF9BU0NJSSAqIHNpemVvZiggdW5zaWduZWQgc2hvcnQgKSkKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHR5cGUgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCBfZW5jc3RjdAoreworCWhjZl8zMgkgICAgICAgICAgICAgICAgICAgZHdNYWdpYzsKKwloY2ZfMTYJICAgICAgICAgICAgICAgICAgIHdUeEtleUlEOworCWhjZl8xNgkgICAgICAgICAgICAgICAgICAgd0VuYWJsZWQ7CisJQ0ZHX0RFRkFVTFRfS0VZU19TVFJDVCAgICAgRW5jU3RyOworfQorRU5DU1RSQ1QsICpQRU5DU1RSQ1Q7CisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmdW5jdGlvbiBwcnJvdHR5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3dlcF9jb2RlKCBjaGFyICpzekNyeXB0LCBjaGFyICpzekRlc3QsIHZvaWQgKkRhdGEsIGludCBuTGVuICk7CisKK2ludCB3bF93ZXBfZGVjb2RlKCBjaGFyICpzekNyeXB0LCB2b2lkICpEZXN0LCBjaGFyICpzekRhdGEgKTsKKworCisKKworI2VuZGlmICAvLyBfX1dBVkVMQU4yX0VOQ1JZUFRJT05fSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9pZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDJiNDEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfaWYuaApAQCAtMCwwICsxLDIzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIERyaXZlciBjb21tb24gaGVhZGVyIGZvciBpbmZvIG5lZWRlZCBieSBkcml2ZXIgc291cmNlIGFuZCB1c2VyLXNwYWNlCisgKiAgIHByb2Nlc3NlcyBjb21tdW5pY2F0aW5nIHdpdGggdGhlIGRyaXZlci4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fV0FWRUxBTjJfSUZfSF9fCisjZGVmaW5lIF9fV0FWRUxBTjJfSUZfSF9fCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgY29uc3RhbnQgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1BWF9MVFZfQlVGX1NJWkUgICAgICAgICAgICAoNTEyIC0gKHNpemVvZihoY2ZfMTYpICogMikpCisKKyNkZWZpbmUgSENGX1RBTExJRVNfU0laRSAgICAgICAgICAgIChzaXplb2YoQ0ZHX0hFUk1FU19UQUxMSUVTX1NUUkNUKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKGhjZl8xNikgKiAyKSkKKworI2RlZmluZSBIQ0ZfTUFYX01VTFRJQ0FTVCAgICAgICAgICAgMTYKKyNkZWZpbmUgSENGX01BWF9OQU1FX0xFTiAgICAgICAgICAgIDMyCisjZGVmaW5lIE1BWF9MSU5FX1NJWkUgICAJCQkyNTYKKyNkZWZpbmUgSENGX05VTV9JT19QT1JUUyAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgVFhfVElNRU9VVCAgICAgICAgICAgICAgICAgICgoODAwICogSFopIC8gMTAwMCkKKworCisvLyNkZWZpbmUgSENGX01JTl9DT01NX1FVQUxJVFkgICAgICAgIDAKKy8vI2RlZmluZSBIQ0ZfTUFYX0NPTU1fUVVBTElUWSAgICAgICAgOTIKKy8vI2RlZmluZSBIQ0ZfTUlOX1NJR05BTF9MRVZFTCAgICAgICAgNDcKKy8vI2RlZmluZSBIQ0ZfTUFYX1NJR05BTF9MRVZFTCAgICAgICAgMTM4CisvLyNkZWZpbmUgSENGX01JTl9OT0lTRV9MRVZFTCAgICAgICAgIDQ3CisvLyNkZWZpbmUgSENGX01BWF9OT0lTRV9MRVZFTCAgICAgICAgIDEzOAorLy8jZGVmaW5lIEhDRl8wREJNX09GRlNFVCAgICAgICAgICAgICAxNDkKKworLy8gUEUxRE5OCisvLyBCZXR0ZXIgZGF0YSBmcm9tIHRoZSByZWFsIHdvcmxkLiBOb3Qgc2NpZW50aWZpYyBidXQgZW1waXJpY2FsIGRhdGEgZ2F0aGVyZWQKKy8vIGZyb20gYSBUaG9tc29uIFNwZWVkdG91Y2ggMTEwIHdoaWNoIGlzIGlkZW50aWZpZWQgYXM6CisvLyBQQ01DSUEgSW5mbzogIkFnZXJlIFN5c3RlbXMiICJXaXJlbGVzcyBQQyBDYXJkIE1vZGVsIDAxMTAiCisvLyAgICAgICAgICAgICAgTWFudWZhY3R1cmUgSUQ6IDAxNTYsMDAwMworLy8gTG93ZXN0IG1lYXN1cm1lbnQgZm9yIG5vaXNlIGZsb29yIHNlZW4gaXMgdmFsdWUgNTQKKy8vIEhpZ2hlc3Qgc2lnbmFsIHN0cmVuZ3RoIGluIGNsb3NlIHByb3hpbWl0eSB0byB0aGUgQVAgc2VlbiBpcyB2YWx1ZSAxMTgKKy8vIFZlcnkgZ29vZCBtdXN0IGJlIGFycm91bmQgMTAwIChvdGhlcndpc2UgaXRzIG5ldmVyICJmdWxsIHNjYWxlIgorLy8gQWxsIG90aGVyIGNvbnN0YW50cyBhcmUgZGVycml2ZWQgZnJvbSB0aGVzZS4gVGhpcyBtYWtlcyB0aGUgc2lnbmFsIGdhdWdlCisvLyB3b3JrIGZvciBtZS4uLgorI2RlZmluZSBIQ0ZfTUlOX1NJR05BTF9MRVZFTCAgICAgICAgNTQKKyNkZWZpbmUgSENGX01BWF9TSUdOQUxfTEVWRUwgICAgICAgIDEwMAorI2RlZmluZSBIQ0ZfTUlOX05PSVNFX0xFVkVMICAgICAgICAgSENGX01JTl9TSUdOQUxfTEVWRUwKKyNkZWZpbmUgSENGX01BWF9OT0lTRV9MRVZFTCAgICAgICAgIEhDRl9NQVhfU0lHTkFMX0xFVkVMCisjZGVmaW5lIEhDRl8wREJNX09GRlNFVCAgICAgICAgICAgICAoSENGX01BWF9TSUdOQUxfTEVWRUwgKyAxKQorI2RlZmluZSBIQ0ZfTUlOX0NPTU1fUVVBTElUWSAgICAgICAgMAorI2RlZmluZSBIQ0ZfTUFYX0NPTU1fUVVBTElUWSAgICAgICAgKEhDRl9NQVhfU0lHTkFMX0xFVkVMIC0gSENGX01JTl9OT0lTRV9MRVZFTCArIDEpCisKKworLyogRm9yIGVuY3J5cHRpb24gKFdFUCkgKi8KKyNkZWZpbmUgTUlOX0tFWV9TSVpFICAgICAgICAgICAgICAgIDUgICAgICAgLy8gNDAgYml0cyBSQzQgLSBXRVAKKyNkZWZpbmUgTUFYX0tFWV9TSVpFICAgICAgICAgICAgICAgIDEzICAgICAgLy8gMTA0IGJpdHMKKyNkZWZpbmUgTUFYX0tFWVMgICAgICAgICAgICAgICAgICAgIDQKKworI2RlZmluZSBSQURJT19DSEFOTkVMUyAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgUkFESU9fU0VOU0lUSVZJVFlfTEVWRUxTICAgIDMKKyNkZWZpbmUgUkFESU9fVFhfUE9XRVJfTVdBVFQgICAgICAgIDMyCisjZGVmaW5lIFJBRElPX1RYX1BPV0VSX0RCTSAgICAgICAgICAxNQorCisjZGVmaW5lIE1JTl9SVFNfQllURVMgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1BWF9SVFNfQllURVMgICAgICAgICAgICAgICAyMzQ3CisKKyNkZWZpbmUgTUFYX1JBVEVTICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgTUVHQUJJVCAgICAgICAgICAgICAgICAgICAgIDEwMjQqMTAyNAorCisjZGVmaW5lIEhDRl9GQUlMVVJFICAgICAgICAgICAgICAgICAweEZGCisjZGVmaW5lIFVJTF9GQUlMVVJFCQkgICAgICAgICAgICAweEZGCisjZGVmaW5lIENGR19VSUxfQ09OTkVDVCAgICAgICAgICAgICAweEExMjMgICAgICAgICAgLy8gRGVmaW5lIGRpZmZlcmVudGx5PworI2RlZmluZSBDRkdfVUlMX0NPTk5FQ1RfQUNLX0NPREUgICAgMHg1NjUzNDM1QSAgICAgIC8vIFZTQ1oKKyNkZWZpbmUgV1ZMQU4yX1VJTF9DT05ORUNURUQgICAgICAgICgweDAxTCA8PCAwKQorI2RlZmluZSBXVkxBTjJfVUlMX0JVU1kgICAgICAgICAgICAgKDB4MDFMIDw8IDEpCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBkcml2ZXIgaW9jdGwgaW50ZXJmYWNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBXVkxBTjJfSU9DVExfVUlMICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUKKworLyogVGhlIFVJTCBJbnRlcmZhY2UgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBXVkxBTjJfSU9DVExfVUlMIGNvZGUgYWJvdmUKKyAgIGlzIGRlZmluZWQgaW4gbWRkLmguIEEgcXVpY2sgcmVmZXJlbmNlIG9mIHRoZSBVSUwgY29kZXMgaXMgbGlzdGVkIGJlbG93ICovCisvKgorVUlMX0ZVTl9DT05ORUNUCitVSUxfRlVOX0RJU0NPTk5FQ1QKK1VJTF9GVU5fQUNUSU9OCisgICAgVUlMX0FDVF9CTE9DSworICAgIFVJTF9BQ1RfVU5CTE9DSworICAgIFVJTF9BQ1RfU0NBCisgICAgVUlMX0FDVF9ESUFHCisgICAgVUlMX0FDVF9BUFBMWQorVUlMX0ZVTl9TRU5EX0RJQUdfTVNHCitVSUxfRlVOX0dFVF9JTkZPCitVSUxfRlVOX1BVVF9JTkZPCisqLworCisjZGVmaW5lIFNJT0NTSVdORVROQU1FICAgICAgICAgICAgICBTSU9DREVWUFJJVkFURSsxCisjZGVmaW5lIFNJT0NHSVdORVROQU1FICAgICAgICAgICAgICBTSU9DREVWUFJJVkFURSsyCisjZGVmaW5lIFNJT0NTSVdTVEFOQU1FICAgICAgICAgICAgICBTSU9DREVWUFJJVkFURSszCisjZGVmaW5lIFNJT0NHSVdTVEFOQU1FICAgICAgICAgICAgICBTSU9DREVWUFJJVkFURSs0CisjZGVmaW5lIFNJT0NTSVdQT1JUVFlQRSAgICAgICAgICAgICBTSU9DREVWUFJJVkFURSs1CisjZGVmaW5lIFNJT0NHSVdQT1JUVFlQRSAgICAgICAgICAgICBTSU9DREVWUFJJVkFURSs2CisKKy8qIElPQ1RMIGNvZGUgZm9yIHRoZSBSVFMgaW50ZXJmYWNlICovCisjZGVmaW5lIFdMX0lPQ1RMX1JUUyAgICAgICAgICAgICAgICBTSU9DREVWUFJJVkFURSs3CisKKy8qIElPQ1RMIHN1YmNvZGVzIGZvciBXTF9JT0NUTF9SVFMgKi8KKyNkZWZpbmUgV0xfSU9DVExfUlRTX1JFQUQgICAgICAgICAgIDEKKyNkZWZpbmUgV0xfSU9DVExfUlRTX1dSSVRFICAgICAgICAgIDIKKyNkZWZpbmUgV0xfSU9DVExfUlRTX0JBVENIX1JFQUQgICAgIDMKKyNkZWZpbmUgV0xfSU9DVExfUlRTX0JBVENIX1dSSVRFICAgIDQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU1RSVUNUVVJFIERFRklOSVRJT05TCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBfX3UxNiAgIGxlbmd0aDsKKyAgICBfX3U4ICAgIG5hbWVbSENGX01BWF9OQU1FX0xFTl07Cit9Cit3dk5hbWVfdDsKKworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGhjZl8xNiAgICAgIGxlbjsKKyAgICBoY2ZfMTYgICAgICB0eXA7CisgICAgdW5pb24KKyAgICB7CisgICAgICAgIGhjZl84ICAgICAgIHU4W01BWF9MVFZfQlVGX1NJWkUgLyBzaXplb2YoaGNmXzgpXTsKKyAgICAgICAgaGNmXzE2ICAgICAgdTE2W01BWF9MVFZfQlVGX1NJWkUgLyBzaXplb2YoaGNmXzE2KV07CisgICAgICAgIGhjZl8zMiAgICAgIHUzMltNQVhfTFRWX0JVRl9TSVpFIC8gc2l6ZW9mKGhjZl8zMildOworICAgIH0gdTsKK30KK2x0dl90OworCisKK3N0cnVjdCB1aWxyZXEKK3sKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgY2hhciAgICBpZnJuX25hbWVbSUZOQU1TSVpdOworICAgIH0gaWZyX2lmcm47CisKKyAgICBJRkJQICAgICAgICBoY2ZDdHg7CisgICAgX191OCAgICAgICAgY29tbWFuZDsKKyAgICBfX3U4ICAgICAgICByZXN1bHQ7CisKKyAgICAvKiBUaGUgZGF0YSBmaWVsZCBpbiB0aGlzIHN0cnVjdHVyZSBpcyB0eXBpY2FsbHkgYW4gTFRWIG9mIHNvbWUgdHlwZS4gVGhlCisgICAgICAgbGVuIGZpZWxkIGlzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgaW4gYnl0ZXMsIGFzIG9wcG9zZWQgdG8gd29yZHMgKGxpa2UKKyAgICAgICB0aGUgTC1maWVsZCBpbiB0aGUgTFRWICovCisgICAgX191MTYgICAgICAgbGVuOworICAgIHZvaWQgICAgICAgKmRhdGE7Cit9OworCisKK3N0cnVjdCBydHNyZXEKK3sKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgY2hhciAgICBpZnJuX25hbWVbSUZOQU1TSVpdOworICAgIH0KKyAgICBpZnJfaWZybjsKKworICAgIF9fdTE2ICAgdHlwOworICAgIF9fdTE2ICAgcmVnOworICAgIF9fdTE2ICAgbGVuOworICAgIF9fdTE2ICAgKmRhdGE7Cit9OworCisKKyNlbmRpZiAgLy8gX19XQVZFTEFOMl9JRl9IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY2ZmI2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2ludGVybmFsLmgKQEAgLTAsMCArMSwxMDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgSGVhZGVyIGZvciBkZWZpbnRpb25zIGFuZCBtYWNyb3MgaW50ZXJuYWwgdG8gdGhlIGRydmllci4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fV0FWRUxBTjJfSF9fCisjZGVmaW5lIF9fV0FWRUxBTjJfSF9fCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaWZkZWYgQlVTX1BDTUNJQQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2VuZGlmCisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzY29kZS5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorI2VuZGlmICAvLyBCVVNfUENNQ0lBCisKKyNpZmRlZiBIQVNfV0lSRUxFU1NfRVhURU5TSU9OUworI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaWYgV0lSRUxFU1NfRVhUID4gMTMKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2VuZGlmIC8vIFdJUkVMRVNTX0VYVCA+IDEzCisjZGVmaW5lIFVTRV9EQk0KKyNkZWZpbmUgUkVUVVJOX0NVUlJFTlRfTkVUV09SS05BTUUKKyNkZWZpbmUgVVNFX0ZSRVFVRU5DWQorI2VuZGlmIC8vIEhBU19XSVJFTEVTU19FWFRFTlNJT05TLworCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgY29uc3RhbnQgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIHBfdTggICAgX191OAorI2RlZmluZSBwX3M4ICAgIF9fczgKKyNkZWZpbmUgcF91MTYgICBfX3UxNgorI2RlZmluZSBwX3MxNiAgIF9fczE2CisjZGVmaW5lIHBfdTMyICAgX191MzIKKyNkZWZpbmUgcF9zMzIgICBfX3MzMgorI2RlZmluZSBwX2NoYXIgIGNoYXIKKworI2RlZmluZSBNQVhfS0VZX0xFTiAgICAgICAgICgyICsgKDEzICogMikpIC8vIDB4IHBsdXMgMTMgaGV4IGRpZ2l0IHBhaXJzCisjZGVmaW5lIE1CX1NJWkUgICAgICAgICAgICAgMTAyNAorI2RlZmluZSBNQVhfRU5DX0xFTiAgICAgICAgIDEwNAorCisjZGVmaW5lIE1BWF9TQ0FOX1RJTUVfU0VDICAgOAorI2RlZmluZSBNQVhfTkFQUyAgICAgICAgICAgIDMyCisKKyNkZWZpbmUgQ0ZHX01CX0lORk8gICAgICAgICAweDA4MjAJCS8vTWFpbCBCb3ggSW5mbyBCbG9jaworCisjZGVmaW5lIE5VTV9XRFNfUE9SVFMgICAgICAgNgorCisjZGVmaW5lIFdWTEFOX01BWF9MT09LQUhFQUQgKEhDRl9NQVhfTVNHKzQ2KSAvKiBhcyBwZXIgczAwMDVNSUNfNC5kb2MgKi8KKworCisvKiBNaW4vTWF4L0RlZmF1bHQgUGFyYW1ldGVyIFZhbHVlcyAqLworI2lmIDAgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKy8vOz8gd2h5IHRoaXMgZGlmZmVyZW5jZSBkZXBlbmRpbmcgb24gY29tcGlsZSBvcHRpb24sIHNlZW1zIHRvIG1lIGl0IHNob3VsZCBkZXBlbmQgb24gcnVudGltZSBpZiBhbnl0aGluZworI2RlZmluZSBQQVJNX0RFRkFVTFRfU1NJRCAgICAgICAgICAgICAgICAgICAgICAgIkxpbnV4QVAiCisjZWxzZQorI2RlZmluZSBQQVJNX0RFRkFVTFRfU1NJRCAgICAgICAgICAgICAgICAgICAgICAgIkFOWSIKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9BUAorCisjZGVmaW5lIFBBUk1fTUlOX05BTUVfTEVOICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBUk1fTUFYX05BTUVfTEVOICAgICAgICAgICAgICAgICAgICAgICAzMgorCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgcGVydGFpbiB0byBtb2R1bGUgYW5kIHByb2ZpbGUgcGFyYW1ldGVycyAqLworLy8gI2RlZmluZSBQQVJNX0FQX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBNb2RlCisvLyAjZGVmaW5lIFBBUk1fTkFNRV9BUF9NT0RFCQkJCQkJVEVYVCgiQVBNb2RlIikKKy8vICNkZWZpbmUgUEFSTV9ERUZBVUxUX0FQX01PREUJCQkJCUZBTFNFCisKKyNkZWZpbmUgUEFSTV9BVVRIRU5USUNBVElPTiAgICAgICAgICAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uCisjZGVmaW5lIFBBUk1fTkFNRV9BVVRIRU5USUNBVElPTgkJCQlURVhUKCJBdXRoZW50aWNhdGlvbiIpCisjZGVmaW5lIFBBUk1fTUlOX0FVVEhFTlRJQ0FUSU9OICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBUk1fTUFYX0FVVEhFTlRJQ0FUSU9OICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFBBUk1fREVGQVVMVF9BVVRIRU5USUNBVElPTiAgICAgICAgICAgICAxCisKKyNkZWZpbmUgUEFSTV9BVVRIX0tFWV9NR01UX1NVSVRFICAgICAgICAgICAgICAgIEF1dGhLZXlNZ210U3VpdGUKKyNkZWZpbmUgUEFSTV9OQU1FX0FVVEhfS0VZX01HTVRfU1VJVEUgICAgICAgICAgIFRFWFQoIkF1dGhLZXlNZ210U3VpdGUiKQorI2RlZmluZSBQQVJNX01JTl9BVVRIX0tFWV9NR01UX1NVSVRFICAgICAgICAgICAgMAorI2RlZmluZSBQQVJNX01BWF9BVVRIX0tFWV9NR01UX1NVSVRFICAgICAgICAgICAgNAorI2RlZmluZSBQQVJNX0RFRkFVTFRfQVVUSF9LRVlfTUdNVF9TVUlURSAgICAgICAgMAorCisjZGVmaW5lIFBBUk1fQlJTQ18yR0haICAgICAgICAgICAgICAgICAgICAgICAgICBCUlNDMkdIegorI2RlZmluZSBQQVJNX05BTUVfQlJTQ18yR0haICAgICAgICAgICAgICAgICAgICAgVEVYVCgiQlJTQzJHSHoiKQorI2RlZmluZSBQQVJNX01JTl9CUlNDICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFBBUk1fTUFYX0JSU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBGRkYKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX0JSU0NfMkdIWiAgICAgICAgICAgICAgICAgIDB4MDAwRgorCisjZGVmaW5lIFBBUk1fQlJTQ181R0haICAgICAgICAgICAgICAgICAgICAgICAgICBCUlNDNUdIegorI2RlZmluZSBQQVJNX05BTUVfQlJTQ181R0haICAgICAgICAgICAgICAgICAgICAgVEVYVCgiQlJTQzVHSHoiKQorI2RlZmluZSBQQVJNX0RFRkFVTFRfQlJTQ181R0haICAgICAgICAgICAgICAgICAgMHgwMTUwCisKKyNkZWZpbmUgUEFSTV9DT0VYSVNURU5DRSAgICAgICAgICAgICAgICAgICAgICAgIENvZXhpc3RlbmNlCisjZGVmaW5lIFBBUk1fTkFNRV9DT0VYSVNURU5DRSAgICAgICAgICAgICAgICAgICBURVhUKCJDb2V4aXN0ZW5jZSIpCisjZGVmaW5lIFBBUk1fTUlOX0NPRVhJU1RFTkNFICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgUEFSTV9NQVhfQ09FWElTVEVOQ0UgICAgICAgICAgICAgICAgICAgIDB4MDAwNworI2RlZmluZSBQQVJNX0RFRkFVTFRfQ09FWElTVEVOQ0UgICAgICAgICAgICAgICAgMHgwMDAwCisKKyNkZWZpbmUgUEFSTV9DT05GSUdVUkVEICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyZWQKKyNkZWZpbmUgUEFSTV9OQU1FX0NPTkZJR1VSRUQJCQkJCVRFWFQoIkNvbmZpZ3VyZWQiKQorCisjZGVmaW5lIFBBUk1fQ09OTkVDVElPTl9DT05UUk9MICAgICAgICAgICAgICAgICBDb25uZWN0aW9uQ29udHJvbAorI2RlZmluZSBQQVJNX05BTUVfQ09OTkVDVElPTl9DT05UUk9MICAgICAgICAgICAgVEVYVCgiQ29ubmVjdGlvbkNvbnRyb2wiKQorI2RlZmluZSBQQVJNX01JTl9DT05ORUNUSU9OX0NPTlRST0wgICAgICAgICAgICAgMAorI2RlZmluZSBQQVJNX01BWF9DT05ORUNUSU9OX0NPTlRST0wgICAgICAgICAgICAgMworI2RlZmluZSBQQVJNX0RFRkFVTFRfQ09OTkVDVElPTl9DT05UUk9MICAgICAgICAgMgorCisjZGVmaW5lIFBBUk1fQ1JFQVRFX0lCU1MgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVJQlNTCisjZGVmaW5lIFBBUk1fTkFNRV9DUkVBVEVfSUJTUyAgICAgICAgICAgICAgICAgICBURVhUKCJDcmVhdGVJQlNTIikKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX0NSRUFURV9JQlNTICAgICAgICAgICAgICAgIEZBTFNFCisjZGVmaW5lIFBBUk1fREVGQVVMVF9DUkVBVEVfSUJTU19TVFIgICAgICAgICAgICAiTiIKKworI2RlZmluZSBQQVJNX0RFQlVHX0ZMQUcgICAgICAgICAgICAgCSAgICAJRGVidWdGbGFnCisjZGVmaW5lIFBBUk1fTkFNRV9ERUJVR19GTEFHICAgICAgICAgICAgCQlURVhUKCJEZWJ1Z0ZsYWciKQorI2RlZmluZSBQQVJNX01JTl9ERUJVR19GTEFHICAgICAgICAgICAgIAkJMAorI2RlZmluZSBQQVJNX01BWF9ERUJVR19GTEFHICAgICAgICAgICAgIAkJMHhGRkZGCisjZGVmaW5lIFBBUk1fREVGQVVMVF9ERUJVR19GTEFHICAgICAgICAgCQkweEZGRkYKKworI2RlZmluZSBQQVJNX0RFU0lSRURfU1NJRCAgICAgICAgICAgICAgICAgICAgICAgRGVzaXJlZFNTSUQKKyNkZWZpbmUgUEFSTV9OQU1FX0RFU0lSRURfU1NJRCAgICAgICAgICAgICAgICAgIFRFWFQoIkRlc2lyZWRTU0lEIikKKworI2RlZmluZSBQQVJNX0RPV05MT0FEX0ZJUk1XQVJFICAgICAgICAgICAgICAgICAgRG93bmxvYWRGaXJtd2FyZQorI2RlZmluZSBQQVJNX05BTUVfRE9XTkxPQURfRklSTVdBUkUgICAgICAgICAgICAgVEVYVCgiRG93bmxvYWRGaXJtd2FyZSIpCisKKyNkZWZpbmUgUEFSTV9EUklWRVJfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIERyaXZlckVuYWJsZQorI2RlZmluZSBQQVJNX05BTUVfRFJJVkVSX0VOQUJMRQkJCQkJVEVYVCgiRHJpdmVyRW5hYmxlIikKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX0RSSVZFUl9FTkFCTEUJCQkJVFJVRQorCisjZGVmaW5lIFBBUk1fRU5BQkxFX0VOQ1JZUFRJT04gICAgICAgICAgICAgICAgICBFbmFibGVFbmNyeXB0aW9uCisjZGVmaW5lIFBBUk1fTkFNRV9FTkFCTEVfRU5DUllQVElPTiAgICAgICAgICAgICBURVhUKCJFbmFibGVFbmNyeXB0aW9uIikKKyNkZWZpbmUgUEFSTV9NSU5fRU5BQkxFX0VOQ1JZUFRJT04gICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFSTV9NQVhfRU5BQkxFX0VOQ1JZUFRJT04gICAgICAgICAgICAgIDcKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX0VOQUJMRV9FTkNSWVBUSU9OICAgICAgICAgIDAKKworI2RlZmluZSBQQVJNX0VOQ1JZUFRJT04gICAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGlvbgorI2RlZmluZSBQQVJNX05BTUVfRU5DUllQVElPTiAgICAgICAgICAgICAgICAgICAgVEVYVCgiRW5jcnlwdGlvbiIpCisKKyNkZWZpbmUgUEFSTV9FWENMVURFX1VORU5DUllQVEVEICAgICAgICAgICAgICAgIEV4Y2x1ZGVVbmVuY3J5cHRlZAorI2RlZmluZSBQQVJNX05BTUVfRVhDTFVERV9VTkVOQ1JZUFRFRCAgICAgICAgICAgVEVYVCgiRXhjbHVkZVVuZW5jcnlwdGVkIikKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX0VYQ0xVREVfVU5FTkNSWVBURUQgICAgICAgIFRSVUUKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX0VYQ0xVREVfVU5FTkNSWVBURURfU1RSICAgICJOIgorCisjZGVmaW5lIFBBUk1fSU5UUkFfQlNTX1JFTEFZICAgICAgICAgICAgICAgICAgICBJbnRyYUJTU1JlbGF5CisjZGVmaW5lIFBBUk1fTkFNRV9JTlRSQV9CU1NfUkVMQVkgICAgICAgICAgICAgICBURVhUKCJJbnRyYUJTU1JlbGF5IikKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX0lOVFJBX0JTU19SRUxBWSAgICAgICAgICAgIFRSVUUKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX0lOVFJBX0JTU19SRUxBWV9TVFIgICAgICAgICJZIgorCisjZGVmaW5lIFBBUk1fS0VZMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkxCisjZGVmaW5lIFBBUk1fTkFNRV9LRVkxICAgICAgICAgICAgICAgICAgICAgICAgICBURVhUKCJLZXkxIikKKyNkZWZpbmUgUEFSTV9LRVkyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleTIKKyNkZWZpbmUgUEFSTV9OQU1FX0tFWTIgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWFQoIktleTIiKQorI2RlZmluZSBQQVJNX0tFWTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5MworI2RlZmluZSBQQVJNX05BTUVfS0VZMyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYVCgiS2V5MyIpCisjZGVmaW5lIFBBUk1fS0VZNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXk0CisjZGVmaW5lIFBBUk1fTkFNRV9LRVk0ICAgICAgICAgICAgICAgICAgICAgICAgICBURVhUKCJLZXk0IikKKworLy87PyAjZGVmaW5lIFBBUk1fS0VZX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgICBBc2NpaUhleAorLy87PyAjZGVmaW5lIFBBUk1fTkFNRV9LRVlfRk9STUFUICAgICAgICAgICAgICAgICAgICBURVhUKCJBc2NpaUhleCIpCisKKyNkZWZpbmUgUEFSTV9MT0FEX0JBTEFOQ0lORyAgICAgICAgICAgICAgICAgICAgIExvYWRCYWxhbmNpbmcKKyNkZWZpbmUgUEFSTV9OQU1FX0xPQURfQkFMQU5DSU5HICAgICAgICAgICAgICAgIFRFWFQoIkxvYWRCYWxhbmNpbmciKQorI2RlZmluZSBQQVJNX0RFRkFVTFRfTE9BRF9CQUxBTkNJTkcgICAgICAgICAgICAgVFJVRQorI2RlZmluZSBQQVJNX0RFRkFVTFRfTE9BRF9CQUxBTkNJTkdfU1RSICAgICAgICAgIlkiCisKKyNkZWZpbmUgUEFSTV9NQVhfREFUQV9MRU5HVEggICAgICAgICAgICAgICAgICAgIE1heERhdGFMZW5ndGgKKyNkZWZpbmUgUEFSTV9OQU1FX01BWF9EQVRBX0xFTkdUSAkJCQlURVhUKCJNYXhEYXRhTGVuZ3RoIikKKworI2RlZmluZSBQQVJNX01BWF9TTEVFUCAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4U2xlZXBEdXJhdGlvbgorI2RlZmluZSBQQVJNX05BTUVfTUFYX1NMRUVQICAgICAgICAgICAgICAgICAgICAgVEVYVCgiTWF4U2xlZXBEdXJhdGlvbiIpCisjZGVmaW5lIFBBUk1fTUlOX01BWF9QTV9TTEVFUCAgICAgICAgICAgICAgICAgICAxCQkJCQkJCQkvLzs/bmFtZXMgbmVhcmx5IHJpZ2h0PworI2RlZmluZSBQQVJNX01BWF9NQVhfUE1fU0xFRVAgICAgICAgICAgICAgICAgICAgNjU1MzUKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX01BWF9QTV9TTEVFUCAgICAgICAgICAgICAgIDEwMAorCisjZGVmaW5lIFBBUk1fTUVESVVNX0RJU1RSSUJVVElPTiAgICAgICAgICAgICAgICBNZWRpdW1EaXN0cmlidXRpb24KKyNkZWZpbmUgUEFSTV9OQU1FX01FRElVTV9ESVNUUklCVVRJT04gICAgICAgICAgIFRFWFQoIk1lZGl1bURpc3RyaWJ1dGlvbiIpCisjZGVmaW5lIFBBUk1fREVGQVVMVF9NRURJVU1fRElTVFJJQlVUSU9OICAgICAgICBUUlVFCisjZGVmaW5lIFBBUk1fREVGQVVMVF9NRURJVU1fRElTVFJJQlVUSU9OX1NUUiAgICAiWSIKKworI2RlZmluZSBQQVJNX01JQ1JPV0FWRV9ST0JVU1RORVNTICAgICAgICAgICAgICAgTWljcm9XYXZlUm9idXN0bmVzcworI2RlZmluZSBQQVJNX05BTUVfTUlDUk9XQVZFX1JPQlVTVE5FU1MgICAgICAgICAgVEVYVCgiTWljcm9XYXZlUm9idXN0bmVzcyIpCisjZGVmaW5lIFBBUk1fREVGQVVMVF9NSUNST1dBVkVfUk9CVVNUTkVTUyAgICAgICBGQUxTRQorI2RlZmluZSBQQVJNX0RFRkFVTFRfTUlDUk9XQVZFX1JPQlVTVE5FU1NfU1RSICAgIk4iCisKKyNkZWZpbmUgUEFSTV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HICAgICAgICAgICAgIE11bHRpY2FzdFBNQnVmZmVyaW5nCisjZGVmaW5lIFBBUk1fTkFNRV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HCSAgICBURVhUKCJNdWx0aWNhc3RQTUJ1ZmZlcmluZyIpCisjZGVmaW5lIFBBUk1fREVGQVVMVF9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HICAgICBUUlVFCisjZGVmaW5lIFBBUk1fREVGQVVMVF9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HX1NUUiAiWSIKKworI2RlZmluZSBQQVJNX01VTFRJQ0FTVF9SQVRFICAgICAgICAgICAgICAgICAgICAgTXVsdGljYXN0UmF0ZQorI2RlZmluZSBQQVJNX05BTUVfTVVMVElDQVNUX1JBVEUgICAgICAgICAgICAgICAgVEVYVCgiTXVsdGljYXN0UmF0ZSIpCisjaWZkZWYgV0FSUAorI2RlZmluZSBQQVJNX01JTl9NVUxUSUNBU1RfUkFURSAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFBBUk1fTUFYX01VTFRJQ0FTVF9SQVRFICAgICAgICAgICAgICAgICAweDBmZmYKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX01VTFRJQ0FTVF9SQVRFXzJHSFogICAgICAgIDB4MDAwNAorI2RlZmluZSBQQVJNX0RFRkFVTFRfTVVMVElDQVNUX1JBVEVfNUdIWiAgICAgICAgMHgwMDEwCisjZWxzZQorI2RlZmluZSBQQVJNX01JTl9NVUxUSUNBU1RfUkFURSAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFBBUk1fTUFYX01VTFRJQ0FTVF9SQVRFICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX01VTFRJQ0FTVF9SQVRFXzJHSFogICAgICAgIDB4MDAwMgorI2RlZmluZSBQQVJNX0RFRkFVTFRfTVVMVElDQVNUX1JBVEVfNUdIWiAgICAgICAgMHgwMDAwCisjZW5kaWYgIC8vIFdBUlAKKworI2RlZmluZSBQQVJNX01VTFRJQ0FTVF9SWCAgICAgICAgICAgICAgICAgICAgICAgTXVsdGljYXN0UmVjZWl2ZQorI2RlZmluZSBQQVJNX05BTUVfTVVMVElDQVNUX1JYICAgICAgICAgICAgICAgICAgVEVYVCgiTXVsdGljYXN0UmVjZWl2ZSIpCisjZGVmaW5lIFBBUk1fREVGQVVMVF9NVUxUSUNBU1RfUlggICAgICAgICAgICAgICBUUlVFCisjZGVmaW5lIFBBUk1fREVGQVVMVF9NVUxUSUNBU1RfUlhfU1RSICAgICAgICAgICAiWSIKKworI2RlZmluZSBQQVJNX05FVFdPUktfQUREUiAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya0FkZHJlc3MKKyNkZWZpbmUgUEFSTV9OQU1FX05FVFdPUktfQUREUiAgICAgICAgICAgICAgICAgIFRFWFQoIk5ldHdvcmtBZGRyZXNzIikKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX05FVFdPUktfQUREUiAgICAgICAgICAgICAgIHsgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiB9CisKKyNkZWZpbmUgUEFSTV9ORVRXT1JLX1RZUEUgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtUeXBlCisjZGVmaW5lIFBBUk1fTkFNRV9ORVRXT1JLX1RZUEUJCQkJCVRFWFQoIk5ldHdvcmtUeXBlIikKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX05FVFdPUktfVFlQRSAgIAkJCTAKKworI2RlZmluZSBQQVJNX09XTl9BVElNX1dJTkRPVyAgICAgICAgICAgICAgICAgICAgT3duQVRJTVdpbmRvdworI2RlZmluZSBQQVJNX05BTUVfT1dOX0FUSU1fV0lORE9XCQkJCVRFWFQoIk93bkFUSU1XaW5kb3ciKQorI2RlZmluZSBQQVJNX01JTl9PV05fQVRJTV9XSU5ET1cgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQVJNX01BWF9PV05fQVRJTV9XSU5ET1cgICAgICAgICAgICAgICAgMTAwCisjZGVmaW5lIFBBUk1fREVGQVVMVF9PV05fQVRJTV9XSU5ET1cgICAgICAgICAgICAwCisKKyNkZWZpbmUgUEFSTV9PV05fQkVBQ09OX0lOVEVSVkFMICAgICAgICAgICAgICAgIE93bkJlYWNvbkludGVydmFsCisjZGVmaW5lIFBBUk1fTkFNRV9PV05fQkVBQ09OX0lOVEVSVkFMICAgICAgICAgICBURVhUKCJPd25CZWFjb25JbnRlcnZhbCIpCisjZGVmaW5lIFBBUk1fTUlOX09XTl9CRUFDT05fSU5URVJWQUwgICAgICAgICAgICAyMAorI2RlZmluZSBQQVJNX01BWF9PV05fQkVBQ09OX0lOVEVSVkFMICAgICAgICAgICAgMjAwCisjZGVmaW5lIFBBUk1fREVGQVVMVF9PV05fQkVBQ09OX0lOVEVSVkFMICAgICAgICAxMDAKKworI2RlZmluZSBQQVJNX09XTl9DSEFOTkVMICAgICAgICAgICAgICAgICAgICAgICAgT3duQ2hhbm5lbAorI2RlZmluZSBQQVJNX05BTUVfT1dOX0NIQU5ORUwgICAgICAgICAgICAgICAgICAgVEVYVCgiT3duQ2hhbm5lbCIpCisjZGVmaW5lIFBBUk1fTUlOX09XTl9DSEFOTkVMICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBUk1fTUFYX09XTl9DSEFOTkVMICAgICAgICAgICAgICAgICAgICAxNjEKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX09XTl9DSEFOTkVMICAgICAgICAgICAgICAgIDEwCisKKyNkZWZpbmUgUEFSTV9PV05fRFRJTV9QRVJJT0QgICAgICAgICAgICAgICAgICAgIE93bkRUSU1QZXJpb2QKKyNkZWZpbmUgUEFSTV9OQU1FX09XTl9EVElNX1BFUklPRAkgICAgICAgICAgICBURVhUKCJPd25EVElNUGVyaW9kIikKKyNkZWZpbmUgUEFSTV9NSU5fT1dOX0RUSU1fUEVSSU9EICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFSTV9NQVhfT1dOX0RUSU1fUEVSSU9EICAgICAgICAgICAgICAgIDY1NTM1CisjZGVmaW5lIFBBUk1fREVGQVVMVF9PV05fRFRJTV9QRVJJT0QgICAgICAgICAgICAxCisKKyNkZWZpbmUgUEFSTV9PV05fTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgIE93bk5hbWUKKyNkZWZpbmUgUEFSTV9OQU1FX09XTl9OQU1FICAgICAgICAgICAgICAgICAgICAgIFRFWFQoIk93bk5hbWUiKQorI2RlZmluZSBQQVJNX0RFRkFVTFRfT1dOX05BTUUgICAgICAgICAgICAgICAgICAgIkxpbnV4IgorCisjZGVmaW5lIFBBUk1fT1dOX1NTSUQgICAgICAgICAgICAgICAgICAgICAgICAgICBPd25TU0lECisjZGVmaW5lIFBBUk1fTkFNRV9PV05fU1NJRCAgICAgICAgICAgICAgICAgICAgICBURVhUKCJPd25TU0lEIikKKworI2RlZmluZSBQQVJNX1BNX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgUE1FbmFibGVkCisjZGVmaW5lIFBBUk1fTkFNRV9QTV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICBURVhUKCJQTUVuYWJsZWQiKQorI2RlZmluZSBQQVJNX01BWF9QTV9FTkFCTEVECQkJCQkJMworCisjZGVmaW5lIFBBUk1fUE1FUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUVQUworI2RlZmluZSBQQVJNX05BTUVfUE1FUFMgICAgICAgICAgICAgICAgICAgICAgICAgVEVYVCgiUE1FUFMiKQorCisjZGVmaW5lIFBBUk1fUE1fSE9MRE9WRVJfRFVSQVRJT04gICAgICAgICAgICAgICBQTUhvbGRvdmVyRHVyYXRpb24KKyNkZWZpbmUgUEFSTV9OQU1FX1BNX0hPTERPVkVSX0RVUkFUSU9OICAgICAgICAgIFRFWFQoIlBNSG9sZG92ZXJEdXJhdGlvbiIpCisjZGVmaW5lIFBBUk1fTUlOX1BNX0hPTERPVkVSX0RVUkFUSU9OICAgICAgICAgICAxCisjZGVmaW5lIFBBUk1fTUFYX1BNX0hPTERPVkVSX0RVUkFUSU9OICAgICAgICAgICAxMDAwCisjZGVmaW5lIFBBUk1fREVGQVVMVF9QTV9IT0xET1ZFUl9EVVJBVElPTiAgICAgICAxMDAKKworI2RlZmluZSBQQVJNX1BNX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG93ZXJNb2RlCisjZGVmaW5lIFBBUk1fTkFNRV9QTV9NT0RFICAgICAgICAgICAgICAgICAgICAgICBURVhUKCJQb3dlck1vZGUiKQorCisjZGVmaW5lIFBBUk1fUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0VHlwZQorI2RlZmluZSBQQVJNX05BTUVfUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAgVEVYVCgiUG9ydFR5cGUiKQorI2RlZmluZSBQQVJNX01JTl9QT1JUX1RZUEUgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQVJNX01BWF9QT1JUX1RZUEUgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBQQVJNX0RFRkFVTFRfUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFBBUk1fUFJPTUlTQ1VPVVNfTU9ERSAgICAgICAgICAgICAgICAgICBQcm9taXNjdW91c01vZGUKKyNkZWZpbmUgUEFSTV9OQU1FX1BST01JU0NVT1VTX01PREUgICAgICAgICAgICAgIFRFWFQoIlByb21pc2N1b3VzTW9kZSIpCisjZGVmaW5lIFBBUk1fREVGQVVMVF9QUk9NSVNDVU9VU19NT0RFICAgICAgICAgICBGQUxTRQorI2RlZmluZSBQQVJNX0RFRkFVTFRfUFJPTUlTQ1VPVVNfTU9ERV9TVFIgICAgICAgIk4iCisKKyNkZWZpbmUgUEFSTV9SRUpFQ1RfQU5ZICAgICAgICAgICAgICAgICAgICAgICAgIFJlamVjdEFOWQorI2RlZmluZSBQQVJNX05BTUVfUkVKRUNUX0FOWQkJCQkgICAgVEVYVCgiUmVqZWN0QU5ZIikKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1JFSkVDVF9BTlkgICAgICAgICAgICAgICAgIEZBTFNFCisjZGVmaW5lIFBBUk1fREVGQVVMVF9SRUpFQ1RfQU5ZX1NUUiAgICAgICAgICAgICAiTiIKKworI2RlZmluZSBQQVJNX1JUU19USFJFU0hPTEQgICAgICAgICAgICAgICAgICAgICAgUlRTVGhyZXNob2xkCisjZGVmaW5lIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEICAgICAgICAgICAgICAgICBURVhUKCJSVFNUaHJlc2hvbGQiKQorI2RlZmluZSBQQVJNX01JTl9SVFNfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgMjM0NworI2RlZmluZSBQQVJNX0RFRkFVTFRfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgICAgMjM0NworCisjZGVmaW5lIFBBUk1fUlRTX1RIUkVTSE9MRDEgICAgICAgICAgICAgICAgICAgICBSVFNUaHJlc2hvbGQxCisjZGVmaW5lIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMSAgICAgICAgICAgICAgICBURVhUKCJSVFNUaHJlc2hvbGQxIikKKyNkZWZpbmUgUEFSTV9SVFNfVEhSRVNIT0xEMiAgICAgICAgICAgICAgICAgICAgIFJUU1RocmVzaG9sZDIKKyNkZWZpbmUgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQyICAgICAgICAgICAgICAgIFRFWFQoIlJUU1RocmVzaG9sZDIiKQorI2RlZmluZSBQQVJNX1JUU19USFJFU0hPTEQzICAgICAgICAgICAgICAgICAgICAgUlRTVGhyZXNob2xkMworI2RlZmluZSBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDMgICAgICAgICAgICAgICAgVEVYVCgiUlRTVGhyZXNob2xkMyIpCisjZGVmaW5lIFBBUk1fUlRTX1RIUkVTSE9MRDQgICAgICAgICAgICAgICAgICAgICBSVFNUaHJlc2hvbGQ0CisjZGVmaW5lIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENCAgICAgICAgICAgICAgICBURVhUKCJSVFNUaHJlc2hvbGQ0IikKKyNkZWZpbmUgUEFSTV9SVFNfVEhSRVNIT0xENSAgICAgICAgICAgICAgICAgICAgIFJUU1RocmVzaG9sZDUKKyNkZWZpbmUgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ1ICAgICAgICAgICAgICAgIFRFWFQoIlJUU1RocmVzaG9sZDUiKQorI2RlZmluZSBQQVJNX1JUU19USFJFU0hPTEQ2ICAgICAgICAgICAgICAgICAgICAgUlRTVGhyZXNob2xkNgorI2RlZmluZSBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDYgICAgICAgICAgICAgICAgVEVYVCgiUlRTVGhyZXNob2xkNiIpCisKKyNkZWZpbmUgUEFSTV9TUlNDXzJHSFogICAgICAgICAgICAgICAgICAgICAgICAgIFNSU0MyR0h6CisjZGVmaW5lIFBBUk1fTkFNRV9TUlNDXzJHSFogICAgICAgICAgICAgICAgICAgICBURVhUKCJTUlNDMkdIeiIpCisjZGVmaW5lIFBBUk1fTUlOX1NSU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgUEFSTV9NQVhfU1JTQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEZGRgorI2RlZmluZSBQQVJNX0RFRkFVTFRfU1JTQ18yR0haICAgICAgICAgICAgICAgICAgMHgwRkZGCisKKyNkZWZpbmUgUEFSTV9TUlNDXzVHSFogICAgICAgICAgICAgICAgICAgICAgICAgIFNSU0M1R0h6CisjZGVmaW5lIFBBUk1fTkFNRV9TUlNDXzVHSFogICAgICAgICAgICAgICAgICAgICBURVhUKCJTUlNDNUdIeiIpCisjZGVmaW5lIFBBUk1fREVGQVVMVF9TUlNDXzVHSFogICAgICAgICAgICAgICAgICAweDBGRjAKKworI2RlZmluZSBQQVJNX1NZU1RFTV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtU2NhbGUKKyNkZWZpbmUgUEFSTV9OQU1FX1NZU1RFTV9TQ0FMRSAgICAgICAgICAgICAgICAgIFRFWFQoIlN5c3RlbVNjYWxlIikKKyNkZWZpbmUgUEFSTV9NSU5fU1lTVEVNX1NDQUxFICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFSTV9NQVhfU1lTVEVNX1NDQUxFICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1NZU1RFTV9TQ0FMRSAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBQQVJNX1RYX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHhLZXkKKyNkZWZpbmUgUEFSTV9OQU1FX1RYX0tFWSAgICAgICAgICAgICAgICAgICAgICAgIFRFWFQoIlR4S2V5IikKKyNkZWZpbmUgUEFSTV9NSU5fVFhfS0VZICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFSTV9NQVhfVFhfS0VZICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1RYX0tFWSAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBQQVJNX1RYX1BPV19MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgVHhQb3dMZXZlbAorI2RlZmluZSBQQVJNX05BTUVfVFhfUE9XX0xFVkVMICAgICAgICAgICAgICAgICAgVEVYVCgiVHhQb3dMZXZlbCIpCisjZGVmaW5lIFBBUk1fTUlOX1RYX1BPV19MRVZFTCAgICAgICAgICAgICAgICAgICAxICAgLy8gMjAgZEJtCisjZGVmaW5lIFBBUk1fTUFYX1RYX1BPV19MRVZFTCAgICAgICAgICAgICAgICAgICA2ICAgLy8gIDggZEJtCisjZGVmaW5lIFBBUk1fREVGQVVMVF9UWF9QT1dfTEVWRUwgICAgICAgICAgICAgICAzICAgLy8gMTUgZEJtCisKKyNkZWZpbmUgUEFSTV9UWF9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR4UmF0ZUNvbnRyb2wKKyNkZWZpbmUgUEFSTV9OQU1FX1RYX1JBVEUgICAgICAgICAgICAgICAgICAgICAgIFRFWFQoIlR4UmF0ZUNvbnRyb2wiKQorI2RlZmluZSBQQVJNX01JTl9UWF9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisjaWZkZWYgV0FSUAorI2RlZmluZSBQQVJNX01BWF9UWF9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgMHgwRkZGCisjZGVmaW5lIFBBUk1fREVGQVVMVF9UWF9SQVRFXzJHSFogICAgICAgICAgICAgICAweDBGRkYKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1RYX1JBVEVfNUdIWiAgICAgICAgICAgICAgIDB4MEZGMAorI2Vsc2UKKyNkZWZpbmUgUEFSTV9NQVhfVFhfUkFURSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNworI2RlZmluZSBQQVJNX0RFRkFVTFRfVFhfUkFURV8yR0haICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIFBBUk1fREVGQVVMVF9UWF9SQVRFXzVHSFogICAgICAgICAgICAgICAweDAwMDAKKyNlbmRpZiAgLy8gV0FSUAorCisjZGVmaW5lIFBBUk1fVFhfUkFURTEgICAgICAgICAgICAgICAgICAgICAgICAgICBUeFJhdGVDb250cm9sMQorI2RlZmluZSBQQVJNX05BTUVfVFhfUkFURTEgICAgICAgICAgICAgICAgICAgICAgVEVYVCgiVHhSYXRlQ29udHJvbDEiKQorI2RlZmluZSBQQVJNX1RYX1JBVEUyICAgICAgICAgICAgICAgICAgICAgICAgICAgVHhSYXRlQ29udHJvbDIKKyNkZWZpbmUgUEFSTV9OQU1FX1RYX1JBVEUyICAgICAgICAgICAgICAgICAgICAgIFRFWFQoIlR4UmF0ZUNvbnRyb2wyIikKKyNkZWZpbmUgUEFSTV9UWF9SQVRFMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFR4UmF0ZUNvbnRyb2wzCisjZGVmaW5lIFBBUk1fTkFNRV9UWF9SQVRFMyAgICAgICAgICAgICAgICAgICAgICBURVhUKCJUeFJhdGVDb250cm9sMyIpCisjZGVmaW5lIFBBUk1fVFhfUkFURTQgICAgICAgICAgICAgICAgICAgICAgICAgICBUeFJhdGVDb250cm9sNAorI2RlZmluZSBQQVJNX05BTUVfVFhfUkFURTQgICAgICAgICAgICAgICAgICAgICAgVEVYVCgiVHhSYXRlQ29udHJvbDQiKQorI2RlZmluZSBQQVJNX1RYX1JBVEU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgVHhSYXRlQ29udHJvbDUKKyNkZWZpbmUgUEFSTV9OQU1FX1RYX1JBVEU1ICAgICAgICAgICAgICAgICAgICAgIFRFWFQoIlR4UmF0ZUNvbnRyb2w1IikKKyNkZWZpbmUgUEFSTV9UWF9SQVRFNiAgICAgICAgICAgICAgICAgICAgICAgICAgIFR4UmF0ZUNvbnRyb2w2CisjZGVmaW5lIFBBUk1fTkFNRV9UWF9SQVRFNiAgICAgICAgICAgICAgICAgICAgICBURVhUKCJUeFJhdGVDb250cm9sNiIpCisKKyNkZWZpbmUgUEFSTV9WRU5ET1JERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIFZlbmRvckRlc2NyaXB0aW9uCisjZGVmaW5lIFBBUk1fTkFNRV9WRU5ET1JERVNDUklQVElPTgkJCQlURVhUKCJWZW5kb3JEZXNjcmlwdGlvbiIpCisKKyNkZWZpbmUgUEFSTV9XRFNfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgIFdEU0FkZHJlc3MKKyNkZWZpbmUgUEFSTV9OQU1FX1dEU19BRERSRVNTCQkJCQlURVhUKCJXRFNBZGRyZXNzIikKKworI2RlZmluZSBQQVJNX1dEU19BRERSRVNTMSAgICAgICAgICAgICAgICAgICAgICAgV0RTQWRkcmVzczEKKyNkZWZpbmUgUEFSTV9OQU1FX1dEU19BRERSRVNTMQkJCQkJVEVYVCgiV0RTQWRkcmVzczEiKQorI2RlZmluZSBQQVJNX1dEU19BRERSRVNTMiAgICAgICAgICAgICAgICAgICAgICAgV0RTQWRkcmVzczIKKyNkZWZpbmUgUEFSTV9OQU1FX1dEU19BRERSRVNTMgkJCQkJVEVYVCgiV0RTQWRkcmVzczIiKQorI2RlZmluZSBQQVJNX1dEU19BRERSRVNTMyAgICAgICAgICAgICAgICAgICAgICAgV0RTQWRkcmVzczMKKyNkZWZpbmUgUEFSTV9OQU1FX1dEU19BRERSRVNTMwkJCQkJVEVYVCgiV0RTQWRkcmVzczMiKQorI2RlZmluZSBQQVJNX1dEU19BRERSRVNTNCAgICAgICAgICAgICAgICAgICAgICAgV0RTQWRkcmVzczQKKyNkZWZpbmUgUEFSTV9OQU1FX1dEU19BRERSRVNTNAkJCQkJVEVYVCgiV0RTQWRkcmVzczQiKQorI2RlZmluZSBQQVJNX1dEU19BRERSRVNTNSAgICAgICAgICAgICAgICAgICAgICAgV0RTQWRkcmVzczUKKyNkZWZpbmUgUEFSTV9OQU1FX1dEU19BRERSRVNTNQkJCQkJVEVYVCgiV0RTQWRkcmVzczUiKQorI2RlZmluZSBQQVJNX1dEU19BRERSRVNTNiAgICAgICAgICAgICAgICAgICAgICAgV0RTQWRkcmVzczYKKyNkZWZpbmUgUEFSTV9OQU1FX1dEU19BRERSRVNTNgkJCQkJVEVYVCgiV0RTQWRkcmVzczYiKQorCisvKgorI2RlZmluZSBQQVJNX0xPTkdfUkVUUllfTElNSVQgICAgICAgICAgICAgICAgICAgTG9uZ1JldHJ5TGltaXQKKyNkZWZpbmUgUEFSTV9OQU1FX0xPTkdfUkVUUllfTElNSVQgICAgICAgICAgICAgIFRFWFQoIkxvbmdSZXRyeUxpbWl0IikKKyNkZWZpbmUgUEFSTV9NSU5fTE9OR19SRVRSWV9MSU1JVCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFSTV9NQVhfTE9OR19SRVRSWV9MSU1JVCAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIFBBUk1fREVGQVVMVF9MT05HX1JFVFJZX0xJTUlUICAgICAgICAgICAzCisKKworI2RlZmluZSBQQVJNX1BST0JFX0RBVEFfUkFURVMgICAgICAgICAgICAgICAgICAgUHJvYmVEYXRhUmF0ZXMKKyNkZWZpbmUgUEFSTV9OQU1FX1BST0JFX0RBVEFfUkFURVMgICAgICAgICAgICAgIFRFWFQoIlByb2JlRGF0YVJhdGVzIikKKyNkZWZpbmUgUEFSTV9NSU5fUFJPQkVfREFUQV9SQVRFUyAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBQQVJNX01BWF9QUk9CRV9EQVRBX1JBVEVTICAgICAgICAgICAgICAgMHgwRkZGCisjZGVmaW5lIFBBUk1fREVGQVVMVF9QUk9CRV9EQVRBX1JBVEVTXzJHSFogICAgICAweDAwMDIKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1BST0JFX0RBVEFfUkFURVNfNUdIWiAgICAgIDB4MDAxMAorCisjZGVmaW5lIFBBUk1fU0hPUlRfUkVUUllfTElNSVQgICAgICAgICAgICAgICAgICBTaG9ydFJldHJ5TGltaXQKKyNkZWZpbmUgUEFSTV9OQU1FX1NIT1JUX1JFVFJZX0xJTUlUICAgICAgICAgICAgIFRFWFQoIlNob3J0UmV0cnlMaW1pdCIpCisjZGVmaW5lIFBBUk1fTUlOX1NIT1JUX1JFVFJZX0xJTUlUICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBUk1fTUFYX1NIT1JUX1JFVFJZX0xJTUlUICAgICAgICAgICAgICAxNQorI2RlZmluZSBQQVJNX0RFRkFVTFRfU0hPUlRfUkVUUllfTElNSVQgICAgICAgICAgNworCisKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgc3RhdGUgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgdXNlZCB0byB0cmFjayBzdGF0ZSB0aGUgZGV2aWNlICovCisjZGVmaW5lIFdMX0ZSSU1XQVJFX1BSRVNFTlQgICAgIDEgLy8gRG93bmxvYWQgaWYgbmVlZGVkCisjZGVmaW5lIFdMX0ZSSU1XQVJFX05PVF9QUkVTRU5UCTAgLy8gU2tpcCBvdmVyIGRvd25sb2FkLCBhc3N1bWUgaXRzIGFscmVhZHkgdGhlcmUKKyNkZWZpbmUgV0xfSEFORExJTkdfSU5UICAgICAgICAgMSAvLyBBY3R1YWxseSBjYWxsIHRoZSBIQ0YgdG8gc3dpdGNoIGludGVycnVwdHMgb24vb2ZmCisjZGVmaW5lIFdMX05PVF9IQU5ETElOR19JTlQgICAgIDAgLy8gTm90IHlldCBoYW5kbGluZyBpbnRlcnJ1cHRzLCBkbyBub3Qgc3dpdGNoIG9uL29mZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIG1hY3JvIGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGhlIGZvbGxvd2luZyBtYWNybyBlbnN1cmVzIHRoYXQgbm8gc3ltYm9scyBhcmUgZXhwb3J0ZWQsIG1pbmltaXppbmcgdGhlCisgICBjaGFuY2Ugb2YgYSBzeW1ib2wgY29sbGlzaW9uIGluIHRoZSBrZXJuZWwgKi8KKy8vIEVYUE9SVF9OT19TWU1CT0xTOworCisjZGVmaW5lIE5FTEVNKGFycikgKHNpemVvZihhcnIpIC8gc2l6ZW9mKGFyclswXSkpCisKKyNkZWZpbmUgV1ZMQU5fVkFMSURfTUFDX0FERFJFU1MoIHggKSBcCisoKHhbMF0hPTB4RkYpICYmICh4WzFdIT0weEZGKSAmJiAoeFsyXSE9MHhGRikgJiYgKHhbM10hPTB4RkYpICYmICh4WzRdIT0weEZGKSAmJiAoeFs1XSE9MHhGRikpCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB0eXBlIGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI3VuZGVmIEZBTFNFCisjdW5kZWYgVFJVRQorCit0eXBlZGVmIGVudW0KK3sKKwlGQUxTRSA9IDAsCisJVFJVRSAgPSAxCit9Citib29sX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1NjYW5SZXN1bHQKK3sKKwkvL2hjZl8xNiAgICAgICAgbGVuOworCS8vaGNmXzE2ICAgICAgICB0eXA7CisJaW50ICAgICAgICAgICAgIHNjYW5fY29tcGxldGU7CisJaW50ICAgICAgICAgICAgIG51bV9hcHM7CisJU0NBTl9SU19TVFJDVCAgIEFQVGFibGUgW01BWF9OQVBTXTsKK30KK1NjYW5SZXN1bHQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgX0xJTktfU1RBVFVTX1NUUkNUCit7CisJaGNmXzE2ICBsZW47CisJaGNmXzE2ICB0eXA7CisJaGNmXzE2ICBsaW5rU3RhdHVzOyAgICAgLyogMS4uNSAqLworfQorTElOS19TVEFUVVNfU1RSQ1Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgX0FTU09DX1NUQVRVU19TVFJDVAoreworCWhjZl8xNiAgbGVuOworCWhjZl8xNiAgdHlwOworCWhjZl8xNiAgYXNzb2NTdGF0dXM7ICAgICAgICAgICAgLyogMS4uMyAqLworCWhjZl84ICAgc3RhQWRkcltFVEhfQUxFTl07CisJaGNmXzggICBvbGRBcEFkZHJbRVRIX0FMRU5dOworfQorQVNTT0NfU1RBVFVTX1NUUkNUOworCisKK3R5cGVkZWYgc3RydWN0IF9TRUNVUklUWV9TVEFUVVNfU1RSQ1QKK3sKKwloY2ZfMTYgIGxlbjsKKwloY2ZfMTYgIHR5cDsKKwloY2ZfMTYgIHNlY3VyaXR5U3RhdHVzOyAgICAgLyogMS4uMyAqLworCWhjZl84ICAgc3RhQWRkcltFVEhfQUxFTl07CisJaGNmXzE2ICByZWFzb247Cit9CitTRUNVUklUWV9TVEFUVVNfU1RSQ1Q7CisKKyNkZWZpbmUgV1ZMQU5fV01QX1BEVV9UWVBFX0xUX1JFUSAgICAgICAweDAwCisjZGVmaW5lIFdWTEFOX1dNUF9QRFVfVFlQRV9MVF9SU1AgICAgICAgMHgwMQorI2RlZmluZSBXVkxBTl9XTVBfUERVX1RZUEVfQVBMX1JFUSAgICAgIDB4MDIKKyNkZWZpbmUgV1ZMQU5fV01QX1BEVV9UWVBFX0FQTF9SU1AgICAgICAweDAzCisKK3R5cGVkZWYgc3RydWN0IHd2bGFuX2V0aF9oZHIKK3sKKwl1bnNpZ25lZCBjaGFyICAgZHN0W0VUSF9BTEVOXTsgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIGFkZHJlc3MuICovCisJdW5zaWduZWQgY2hhciAgIHNyY1tFVEhfQUxFTl07ICAgICAgICAgICAvKiBTb3VyY2UgYWRkcmVzcy4gKi8KKwl1bnNpZ25lZCBzaG9ydCAgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIHRoZSBQRFUuICovCit9CitXVkxBTl9FVEhfSERSLCAqUFdWTEFOX0VUSF9IRFI7CisKK3R5cGVkZWYgc3RydWN0IHd2bGFuX2xsY19zbmFwCit7CisJdW5zaWduZWQgY2hhciAgIGRzYXA7ICAgICAgICAgICAgICAgICAgIC8qIERTQVAgKDB4QUEpICovCisJdW5zaWduZWQgY2hhciAgIHNzYXA7ICAgICAgICAgICAgICAgICAgIC8qIFNTQVAgKDB4QUEpICovCisJdW5zaWduZWQgY2hhciAgIGN0cmw7ICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgKDB4MDMpICovCisJdW5zaWduZWQgY2hhciAgIG91aVszXTsgICAgICAgICAgICAgICAgIC8qIE9yZ2FuaXphdGlvbiBVbmlxdWUgSUQgKDAwLTYwLTFkKS4gKi8KKwl1bnNpZ25lZCBjaGFyICAgc3BlY2lkWzJdOyAgICAgICAgICAgICAgLyogU3BlY2lmaWMgSUQgY29kZSAoMDAtMDEpLiAqLworfQorV1ZMQU5fTExDX1NOQVAsICpQV1ZMQU5fTExDX1NOQVA7CisKKwordHlwZWRlZiBzdHJ1Y3Qgd3ZsYW5fbHRfaGRyCit7CisJdW5zaWduZWQgY2hhciAgIHZlcnNpb247ICAgICAgICAgICAgICAgIC8qIFZlcnNpb24gKDB4MDApICovCisJdW5zaWduZWQgY2hhciAgIHR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIFBEVSB0eXBlOiAwLXJlcS8xLXJlc3AuICovCisJdW5zaWduZWQgc2hvcnQgIGlkOyAgICAgICAgICAgICAgICAgICAgIC8qIElkZW50aWZpZXIgdG8gYXNzb2NpYXRlIHJlc3AgdG8gcmVxLiAqLworfQorV1ZMQU5fTFRfSERSLCAqUFdWTEFOX0xUX0hEUjsKKworCit0eXBlZGVmIHN0cnVjdCB3dmxhbl93bXBfaGRyCit7CisJdW5zaWduZWQgY2hhciAgIHZlcnNpb247ICAgICAgICAgICAgICAgIC8qIFZlcnNpb24gICovCisJdW5zaWduZWQgY2hhciAgIHR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIFBEVSB0eXBlICovCit9CitXVkxBTl9XTVBfSERSLCAqUFdWTEFOX1dNUF9IRFI7CisKKworI2RlZmluZSBGSUxMRVJfU0laRSAgICAgICAgICAgICAxNTU0CisjZGVmaW5lIFRFU1RfUEFUVEVSTl9TSVpFICAgICAgIDU0CisKKwordHlwZWRlZiBzdHJ1Y3Qgd3ZsYW5fbHRfcmVxCit7CisJdW5zaWduZWQgY2hhciAgIEZpbGxlcltURVNUX1BBVFRFUk5fU0laRV07ICAgLyogbWluaW1hbCBsZW5ndGggb2YgNTQgYnl0ZXMgKi8KK30KK1dWTEFOX0xUX1JFUSwgKlBXVkxBTl9MVF9SRVE7CisKKwordHlwZWRlZiBzdHJ1Y3Qgd3ZsYW5fbHRfcnNwCit7CisJY2hhciAgICAgICAgICAgbmFtZVszMl07CisJLyogTWVhc3VyZWQgRGF0YSAqLworCXVuc2lnbmVkIGNoYXIgIHNpZ25hbDsKKwl1bnNpZ25lZCBjaGFyICBub2lzZTsKKwl1bnNpZ25lZCBjaGFyICByeEZsb3c7CisJdW5zaWduZWQgY2hhciAgZGF0YVJhdGU7CisJdW5zaWduZWQgc2hvcnQgcHJvdG9jb2w7CisJLyogQ2FwYWJpbGl0aWVzICovCisJdW5zaWduZWQgY2hhciAgc3RhdGlvbjsKKwl1bnNpZ25lZCBjaGFyICBkYXRhUmF0ZUNhcDsKKwl1bnNpZ25lZCBjaGFyICBwb3dlck1nbXRbNF07CisJdW5zaWduZWQgY2hhciAgcm9idXN0bmVzc1s0XTsKKwl1bnNpZ25lZCBjaGFyICBzY2FsaW5nOworCXVuc2lnbmVkIGNoYXIgIHJlc2VydmVkWzVdOworfQorV1ZMQU5fTFRfUlNQLCAqUFdWTEFOX0xUX1JTUDsKKworCit0eXBlZGVmIHN0cnVjdCB3dmxhbl9yeF93bXBfaGRyCit7CisJdW5zaWduZWQgc2hvcnQgc3RhdHVzOworCXVuc2lnbmVkIHNob3J0IHJlc2VydmVkMVsyXTsKKwl1bnNpZ25lZCBjaGFyICBzaWxlbmNlOworCXVuc2lnbmVkIGNoYXIgIHNpZ25hbDsKKwl1bnNpZ25lZCBjaGFyICByYXRlOworCXVuc2lnbmVkIGNoYXIgIHJ4RmxvdzsKKwl1bnNpZ25lZCBzaG9ydCByZXNlcnZlZDJbMl07CisJdW5zaWduZWQgc2hvcnQgZnJhbWVDb250cm9sOworCXVuc2lnbmVkIHNob3J0IGR1cmF0aW9uOworCXVuc2lnbmVkIHNob3J0IGFkZHJlc3MxWzNdOworCXVuc2lnbmVkIHNob3J0IGFkZHJlc3MyWzNdOworCXVuc2lnbmVkIHNob3J0IGFkZHJlc3MzWzNdOworCXVuc2lnbmVkIHNob3J0IHNlcXVlbmNlQ29udHJvbDsKKwl1bnNpZ25lZCBzaG9ydCBhZGRyZXNzNFszXTsKKyNpZm5kZWYgSEVSTUVTMjUJLy87P2p1c3QgdG8gYmUgb24gdGhlIHNhZmUgc2lkZSBvZiBpbmhlcml0ZWQgYnV0IG5vdCBjb21wcmVoZW5kZWQgY29kZSAjaWZkZWYgSEVSTUVTMgorCXVuc2lnbmVkIHNob3J0IHNlZW1zX3RvX2JlX3VudXNlZF9yZXNlcnZlZDNbNV07ICAvLzs/CisJdW5zaWduZWQgc2hvcnQgc2VlbXNfdG9fYmVfdW51c2VkX3Jlc2VydmVkNDsJIC8vOz8KKyNlbmRpZiAvLyBIRVJNRVMyNQorCXVuc2lnbmVkIHNob3J0IEhlYWRlckRhdGFMZW47Cit9CitXVkxBTl9SWF9XTVBfSERSLCAqUFdWTEFOX1JYX1dNUF9IRFI7CisKKwordHlwZWRlZiBzdHJ1Y3Qgd3ZsYW5fbGlua3Rlc3RfcmVxX3BkdQoreworCVdWTEFOX0VUSF9IRFIgICAgIGV0aEhkcjsKKwlXVkxBTl9MTENfU05BUCAgICBsbGNTbmFwOworCVdWTEFOX0xUX0hEUiAgICAgIGx0SGRyOworCVdWTEFOX0xUX1JFUSAgICAgIGx0UmVxOworfQorV1ZMQU5fTElOS1RFU1RfUkVRX1BEVSwgKlBXVkxBTl9MSU5LVEVTVF9SRVFfUERVOworCisKK3R5cGVkZWYgc3RydWN0IHd2bGFuX2xpbmt0ZXN0X3JzcF9wZHUKK3sKKwlXVkxBTl9SWF9XTVBfSERSICB3bXBSeEhkcjsKKwlXVkxBTl9FVEhfSERSICAgICBldGhIZHI7CisJV1ZMQU5fTExDX1NOQVAgICAgbGxjU25hcDsKKwlXVkxBTl9MVF9IRFIgICAgICBsdEhkcjsKKwlXVkxBTl9MVF9SU1AgICAgICBsdFJzcDsKK30KK1dWTEFOX0xJTktURVNUX1JTUF9QRFUsICpQV1ZMQU5fTElOS1RFU1RfUlNQX1BEVTsKKworCit0eXBlZGVmIHN0cnVjdCBfTElOS1RFU1RfUlNQX1NUUkNUCit7CisJaGNmXzE2ICAgICAgICAgICAgICAgICAgIGxlbjsKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgdHlwOworCVdWTEFOX0xJTktURVNUX1JTUF9QRFUgICBsdFJzcDsKK30KK0xJTktURVNUX1JTUF9TVFJDVDsKKworCit0eXBlZGVmIHN0cnVjdCB3dmxhbl93bXBfcnNwX3BkdQoreworCVdWTEFOX1JYX1dNUF9IRFIgIHdtcFJ4SGRyOworCVdWTEFOX0VUSF9IRFIgICAgIGV0aEhkcjsKKwlXVkxBTl9MTENfU05BUCAgICBsbGNTbmFwOworCVdWTEFOX1dNUF9IRFIgICAgIHdtcEhkcjsKK30KK1dWTEFOX1dNUF9SU1BfUERVLCAqUFdWTEFOX1dNUF9SU1BfUERVOworCisKK3R5cGVkZWYgc3RydWN0IF9XTVBfUlNQX1NUUkNUCit7CisJaGNmXzE2ICAgICAgICAgICAgICBsZW47CisJaGNmXzE2ICAgICAgICAgICAgICB0eXA7CisJV1ZMQU5fV01QX1JTUF9QRFUgICB3bXBSc3A7Cit9CitXTVBfUlNQX1NUUkNUOworCisKK3R5cGVkZWYgc3RydWN0IF9QUk9CRV9SRVNQCit7CisJLy8gZmlyc3QgcGFydDogODAyLjExCisJaGNmXzE2CWxlbmd0aDsKKwloY2ZfMTYJaW5mb1R5cGU7CisJaGNmXzE2CXJlc2VydmVkMDsKKwkvL2hjZl84CXNpZ25hbDsKKwloY2ZfOAlzaWxlbmNlOworCWhjZl84CXNpZ25hbDsgICAgIC8vIE1vdmVkIHNpZ25hbCBoZXJlIGFzIHNpZ25hbC9ub2lzZSB2YWx1ZXMgd2VyZSBmbGlwcGVkCisJaGNmXzgJcnhGbG93OworCWhjZl84CXJhdGU7CisJaGNmXzE2CXJlc2VydmVkMVsyXTsKKworCS8vIHNlY29uZCBwYXJ0OgorCWhjZl8xNglmcmFtZUNvbnRyb2w7CisJaGNmXzE2CWR1cklEOworCWhjZl84CWFkZHJlc3MxWzZdOworCWhjZl84CWFkZHJlc3MyWzZdOworCWhjZl84CUJTU0lEWzZdOwkJCQkJLy8hIHRoaXMgaXMgY29ycmVjdCwgcmlnaHQgPworCWhjZl8xNglzZXF1ZW5jZTsKKwloY2ZfOAlhZGRyZXNzNFs2XTsKKworI2lmbmRlZiBXQVJQCisJaGNmXzgJcmVzZXJ2ZWQyWzEyXTsKKyNlbmRpZiAvLyBXQVJQCisKKwloY2ZfMTYJZGF0YUxlbmd0aDsKKwkJCQkJCQkJCQkvLyB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIG5leHQgMyBmaWVsZHMgKERBL1NBL0xlblR5cGUpIGlzIGFjdHVhbGx5IG5vdCBmaWxsZWQgaW4uCisJaGNmXzgJREFbNl07CisJaGNmXzgJU0FbNl07CisKKyNpZmRlZiBXQVJQCisJaGNmXzggICBjaGFubmVsOworCWhjZl84ICAgYmFuZDsKKyNlbHNlCisJaGNmXzE2CWxlblR5cGU7CisjZW5kaWYgIC8vIFdBUlAKKworCWhjZl84CXRpbWVTdGFtcFs4XTsKKwloY2ZfMTYJYmVhY29uSW50ZXJ2YWw7CisJaGNmXzE2CWNhcGFiaWxpdHk7CisJaGNmXzgJcmF3RGF0YVsyMDBdOwkJCQkvLyEgPDw8IHRoaW5rIGFib3V0IHRoaXMgbnVtYmVyICEKKwloY2ZfMTYJZmxhZ3M7Cit9CitQUk9CRV9SRVNQLCAqUFBST0JFX1JFU1A7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1Byb2JlUmVzdWx0Cit7CisJaW50ICAgICAgICAgc2Nhbl9jb21wbGV0ZTsKKwlpbnQgICAgICAgICBudW1fYXBzOworCVBST0JFX1JFU1AgIFByb2JlVGFibGVbTUFYX05BUFNdOworfQorUHJvYmVSZXN1bHQ7CisKKy8qIERlZmluaXRpb25zIHVzZWQgdG8gcGFyc2UgY2FwYWJpbGl0aWVzIG91dCBvZiB0aGUgcHJvYmUgcmVzcG9uc2VzICovCisjZGVmaW5lIENBUEFCSUxJVFlfRVNTICAgICAgMHgwMDAxCisjZGVmaW5lIENBUEFCSUxJVFlfSUJTUyAgICAgMHgwMDAyCisjZGVmaW5lIENBUEFCSUxJVFlfUFJJVkFDWSAgMHgwMDEwCisKKy8qIERlZmluaXRpb25zIHVzZWQgdG8gcGFyc2UgdGhlIEluZm9ybWF0aW9uIEVsZW1lbnRzIG91dCBvZiBwcm9iZSByZXNwb25zZXMgKi8KKyNkZWZpbmUgRFNfSU5GT19FTEVNICAgICAgICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBHRU5FUklDX0lORk9fRUxFTSAgICAgICAgICAgICAgICAgICAweGRkCisjZGVmaW5lIFdQQV9NQVhfSUVfTEVOICAgICAgICAgICAgICAgICAgICAgIDQwCisjZGVmaW5lIFdQQV9TRUxFQ1RPUl9MRU4gICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgV1BBX09VSV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDUwLCAweGYyLCAxIH0KKyNkZWZpbmUgV1BBX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXUEFfQVVUSF9LRVlfTUdNVF9VTlNQRUNfODAyXzFYICAgICB7IDB4MDAsIDB4NTAsIDB4ZjIsIDEgfQorI2RlZmluZSBXUEFfQVVUSF9LRVlfTUdNVF9QU0tfT1ZFUl84MDJfMVggICB7IDB4MDAsIDB4NTAsIDB4ZjIsIDIgfQorI2RlZmluZSBXUEFfQ0lQSEVSX1NVSVRFX05PTkUgICAgICAgICAgICAgICB7IDB4MDAsIDB4NTAsIDB4ZjIsIDAgfQorI2RlZmluZSBXUEFfQ0lQSEVSX1NVSVRFX1dFUDQwICAgICAgICAgICAgICB7IDB4MDAsIDB4NTAsIDB4ZjIsIDEgfQorI2RlZmluZSBXUEFfQ0lQSEVSX1NVSVRFX1RLSVAgICAgICAgICAgICAgICB7IDB4MDAsIDB4NTAsIDB4ZjIsIDIgfQorI2RlZmluZSBXUEFfQ0lQSEVSX1NVSVRFX1dSQVAgICAgICAgICAgICAgICB7IDB4MDAsIDB4NTAsIDB4ZjIsIDMgfQorI2RlZmluZSBXUEFfQ0lQSEVSX1NVSVRFX0NDTVAgICAgICAgICAgICAgICB7IDB4MDAsIDB4NTAsIDB4ZjIsIDQgfQorI2RlZmluZSBXUEFfQ0lQSEVSX1NVSVRFX1dFUDEwNCAgICAgICAgICAgICB7IDB4MDAsIDB4NTAsIDB4ZjIsIDUgfQorCit0eXBlZGVmIGVudW0gd3ZsYW5fZHJ2X21vZGUKK3sKKwlXVkxBTl9EUlZfTU9ERV9OT19ET1dOTE9BRCwgICAgIC8qIHRoaXMgaXMgdGhlIHNhbWUgYXMgU1RBIGZvciBIZXJtZXMgMSAgICAqLworCQkJCSAgICAgICAgICAgICAgICAgICAgLyogaXQgaXMgYWxzbyBvbmx5IGFwcGxpY2FibGUgZm9yIEhlcm1lcyAxICovCisJV1ZMQU5fRFJWX01PREVfU1RBLAorCVdWTEFOX0RSVl9NT0RFX0FQLAorCVdWTEFOX0RSVl9NT0RFX01BWAorfQorV1ZMQU5fRFJWX01PREUsICpQV1ZMQU5fRFJWX01PREU7CisKKwordHlwZWRlZiBlbnVtIHd2bGFuX3BvcnRfc3RhdGUKK3sKKwlXVkxBTl9QT1JUX1NUQVRFX0VOQUJMRUQsCisJV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCwKKwlXVkxBTl9QT1JUX1NUQVRFX0NPTk5FQ1RFRAorfQorV1ZMQU5fUE9SVF9TVEFURSwgKlBXVkxBTl9QT1JUX1NUQVRFOworCisvKgordHlwZWRlZiBlbnVtIHd2bGFuX2Nvbm5lY3Rfc3RhdGUKK3sKKwlXVkxBTl9DT05ORUNUX1NUQVRFX0NPTk5FQ1RFRCwKKwlXVkxBTl9DT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RFRAorfQorV1ZMQU5fQ09OTkVDVF9TVEFURSwgKlBXVkxBTl9DT05ORUNUX1NUQVRFOworKi8KKwordHlwZWRlZiBlbnVtIHd2bGFuX3BtX3N0YXRlCit7CisJV1ZMQU5fUE1fU1RBVEVfRElTQUJMRUQsCisJV1ZMQU5fUE1fU1RBVEVfRU5IQU5DRUQsCisJV1ZMQU5fUE1fU1RBVEVfU1RBTkRBUkQKK30KK1dWTEFOX1BNX1NUQVRFLCAqUFdWTEFOX1BNX1NUQVRFOworCisKK3R5cGVkZWYgc3RydWN0IHd2bGFuX2ZyYW1lCit7CisJc3RydWN0IHNrX2J1ZmYgICpza2I7ICAgICAgIC8qIHNrX2J1ZmYgZm9yIGZyYW1lLiAqLworCWhjZl8xNiAgICAgICAgICBwb3J0OyAgICAgICAvKiBNQUMgcG9ydCBmb3IgdGhlIGZyYW1lLiAqLworCWhjZl8xNiAgICAgICAgICBsZW47ICAgICAgICAvKiBMZW5ndGggb2YgdGhlIGZyYW1lLiAqLworfQorV1ZMQU5fRlJBTUUsICpQV1ZMQU5fRlJBTUU7CisKKwordHlwZWRlZiBzdHJ1Y3Qgd3ZsYW5fbGZyYW1lCit7CisJc3RydWN0IGxpc3RfaGVhZCAgICBub2RlOyAgIC8qIE5vZGUgaW4gdGhlIGxpc3QgKi8KKwlXVkxBTl9GUkFNRQkgICAgICAgIGZyYW1lOyAgLyogRnJhbWUuICovCit9CitXVkxBTl9MRlJBTUUsICpQV1ZMQU5fTEZSQU1FOworCisKKworI2RlZmluZSBERUZBVUxUX05VTV9UWF9GUkFNRVMgICAgICAgICAgIDQ4CisjZGVmaW5lIFRYX1FfTE9XX1dBVEVSX01BUksgICAgICAgICAgICAgKERFRkFVTFRfTlVNX1RYX0ZSQU1FUy8zKQorCisjZGVmaW5lIFdWTEFOX01BWF9UWF9RVUVVRVMgICAgICAgICAgICAgMQorCisKKyNpZmRlZiBVU0VfV0RTCisKK3R5cGVkZWYgc3RydWN0IHd2bGFuX3dkc19pZgoreworCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICAgICAqZGV2OworCWludCAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZWdpc3RlcmVkOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICBuZXRpZl9xdWV1ZV9vbjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAgICAgc3RhdHM7CisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIHJ0c1RocmVzaG9sZDsKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgdHhSYXRlQ250bDsKKwloY2ZfOCAgICAgICAgICAgICAgICAgICAgICAgd2RzQWRkcmVzc1tFVEhfQUxFTl07Cit9IFdWTEFOX1dEU19JRiwgKlBXVkxBTl9XRFNfSUY7CisKKyNlbmRpZiAgLy8gVVNFX1dEUworCisKKworI2RlZmluZSBOVU1fUlhfREVTQyA1CisjZGVmaW5lIE5VTV9UWF9ERVNDIDUKKwordHlwZWRlZiBzdHJ1Y3QgZG1hX3N0cmN0Cit7CisJREVTQ19TVFJDVCAgKnR4X3BhY2tldFtOVU1fVFhfREVTQ107CisJREVTQ19TVFJDVCAgKnJ4X3BhY2tldFtOVU1fUlhfREVTQ107CisJREVTQ19TVFJDVCAgKnJ4X3JlY2xhaW1fZGVzYywgKnR4X3JlY2xhaW1fZGVzYzsgLy8gRGVzY3JpcHRvcnMgZm9yIGhvc3QtcmVjbGFpbSBwdXJwb3NlcyAoc2VlIEhDRikKKwlpbnQgICAgICAgICB0eF9yc2NfaW5kOyAvLyBETUEgVHggcmVzb3VyY2UgaW5kaWNhdG9yIGlzIG1haW50YWluZWQgaW4gdGhlIE1TRiwgbm90IGluIHRoZSBIQ0YKKwlpbnQgICAgICAgICByeF9yc2NfaW5kOyAvLyBBbHNvIGFkZGVkIHJ4IHJzb3VyY2UgaW5kaWNhdG9yIHNvIHRoYXQgY2xlYW51cCBjYW4gYmUgcGVyZm9ybWVkIGlmIGFsbG9jIGZhaWxzCisJaW50ICAgICAgICAgc3RhdHVzOworfSBETUFfU1RSQ1Q7CisKKworLyogTWFjcm9zIHVzZWQgaW4gRE1BIHN1cHBvcnQgKi8KKy8qIGdldCBidXMgYWRkcmVzcyBvZiB7cngsdHh9ZG1hIHN0cnVjdHVyZSBtZW1iZXIsIGluIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlciAqLworI2RlZmluZSBXTF9ETUFfQlVTX0FERFJfTEUoc3RyLCBpLCBtZW0pIFwKKwljcHVfdG9fbGUzMihzdHIjI19kbWFfYWRkclsoaSldICsgKChoY2ZfOCAqKSZzdHJbKGkpXS0+bWVtIC0gKGhjZl84ICopc3RyWyhpKV0pKQorCisKK3N0cnVjdCB3bF9wcml2YXRlCit7CisKKyNpZmRlZiBCVVNfUENNQ0lBCisJZGV2X25vZGVfdCAgICAgICAgICAgICAgICAgIG5vZGU7CisJc3RydWN0IHBjbWNpYV9kZXZpY2UJICAgICpsaW5rOworI2VuZGlmIC8vIEJVU19QQ01DSUEKKworCisJc3RydWN0IG5ldF9kZXZpY2UgICAgICAgICAgICpkZXY7CisvLwlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAgICAgKmRldl9uZXh0OworCXNwaW5sb2NrX3QgICAgICAgICAgICAgICAgICBzbG9jazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgICAgICAgdGFzazsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAgICAgc3RhdHM7CisKKworI2lmZGVmIFdJUkVMRVNTX0VYVAorCXN0cnVjdCBpd19zdGF0aXN0aWNzICAgICAgICB3c3RhdHM7CisvLwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgc3B5X251bWJlcjsKKy8vCXVfY2hhciAgICAgICAgICAgICAgICAgICAgICBzcHlfYWRkcmVzc1tJV19NQVhfU1BZXVtFVEhfQUxFTl07CisvLwlzdHJ1Y3QgaXdfcXVhbGl0eSAgICAgICAgICAgc3B5X3N0YXRbSVdfTUFYX1NQWV07CisJc3RydWN0IGl3X3NweV9kYXRhICAgICAgICAgIHNweV9kYXRhOworCXN0cnVjdCBpd19wdWJsaWNfZGF0YQl3aXJlbGVzc19kYXRhOworI2VuZGlmIC8vIFdJUkVMRVNTX0VYVAorCisKKwlJRkJfU1RSQ1QgICAgICAgICAgICAgICAgICAgaGNmQ3R4OworLy87PyBzdHJ1Y3QgdGltZXJfbGlzdAkJCXRpbWVyX29vcjsKKy8vOz8gaGNmXzE2CQkJCQkJdGltZXJfb29yX2NudDsKKwl1X2xvbmcJCQkJCQl3bGFnczQ5X3R5cGU7CQkvL2NvbnRyb2xzIG91dHB1dCBpbiAvcHJvYy93bGFnczQ5CisJdV9sb25nICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOworCWhjZl8xNgkJCQkJCURlYnVnRmxhZzsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVnaXN0ZXJlZDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgaXNfaGFuZGxpbmdfaW50OworCWludCAgICAgICAgICAgICAgICAgICAgICAgICBmaXJtd2FyZV9wcmVzZW50OworCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBzeXNmc0NyZWF0ZWQ7CisJQ0ZHX0RSVl9JTkZPX1NUUkNUICAgICAgICAgIGRyaXZlckluZm87CisJQ0ZHX0lERU5USVRZX1NUUkNUICAgICAgICAgIGRyaXZlcklkZW50aXR5OworCUNGR19GV19JREVOVElUWV9TVFJDVCAgICAgICBTdGF0aW9uSWRlbnRpdHk7CisJQ0ZHX1BSSV9JREVOVElUWV9TVFJDVCAgICAgIFByaW1hcnlJZGVudGl0eTsKKwlDRkdfUFJJX0lERU5USVRZX1NUUkNUICAgICAgTklDSWRlbnRpdHk7CisKKwlsdHZfdCAgICAgICAgICAgICAgICAgICAgICAgbHR2UmVjb3JkOworCXVfbG9uZyAgICAgICAgICAgICAgICAgICAgICB0eEJ5dGVzOworCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBtYXhQb3J0OyAgICAgICAgLyogMCBmb3IgU1RBLCA2IGZvciBBUCAqLworCisJLyogRWxlbWVudHMgdXNlZCBmb3IgYXN5bmMgbm90aWZpY2F0aW9uIGZyb20gaGFyZHdhcmUgKi8KKwlSSURfTE9HX1NUUkNUCQkJCVJpZExpc3RbMTBdOworCWx0dl90ICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkUmVjb3JkOworCVBST0JFX1JFU1AJCQkJICAgIFByb2JlUmVzcDsKKwlBU1NPQ19TVEFUVVNfU1RSQ1QgICAgICAgICAgYXNzb2Nfc3RhdDsKKwlTRUNVUklUWV9TVEFUVVNfU1RSQ1QgICAgICAgc2VjX3N0YXQ7CisKKwl1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgbG9va0FoZWFkQnVmW1dWTEFOX01BWF9MT09LQUhFQURdOworCisJaGNmXzggICAgICAgICAgICAgICAgICAgICAgIFBvcnRUeXBlOyAgICAgICAgICAgLy8gMSAtIDMgKDEgW05vcm1hbF0gfCAzIFtBZEhvY10pCisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWw7ICAgICAgICAgICAgLy8gMCAtIDE0ICgwKQorCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBUeFJhdGVDb250cm9sWzJdOworCWhjZl84ICAgICAgICAgICAgICAgICAgICAgICBEaXN0YW5jZUJldHdlZW5BUHM7IC8vIDEgLSAzICgxKQorCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBSVFNUaHJlc2hvbGQ7ICAgICAgIC8vIDAgLSAyMzQ3ICgyMzQ3KQorCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBQTUVuYWJsZWQ7ICAgICAgICAgIC8vIDAgLSAyLCA4MDAxIC0gODAwMiAoMCkKKwloY2ZfOCAgICAgICAgICAgICAgICAgICAgICAgTWljcm93YXZlUm9idXN0bmVzczsvLyAwIC0gMSAoMCkKKwloY2ZfOCAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlSUJTUzsgICAgICAgICAvLyAwIC0gMSAoMCkKKwloY2ZfOCAgICAgICAgICAgICAgICAgICAgICAgTXVsdGljYXN0UmVjZWl2ZTsgICAvLyAwIC0gMSAoMSkKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgTWF4U2xlZXBEdXJhdGlvbjsgICAvLyAwIC0gNjU1MzUgKDEwMCkKKwloY2ZfOCAgICAgICAgICAgICAgICAgICAgICAgTUFDQWRkcmVzc1tFVEhfQUxFTl07CisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtOYW1lW0hDRl9NQVhfTkFNRV9MRU4rMV07CisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRpb25OYW1lW0hDRl9NQVhfTkFNRV9MRU4rMV07CisJaGNmXzggICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZUVuY3J5cHRpb247ICAgLy8gMCAtIDEgKDApCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgIEtleTFbTUFYX0tFWV9MRU4rMV07CisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgIEtleTJbTUFYX0tFWV9MRU4rMV07CisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgIEtleTNbTUFYX0tFWV9MRU4rMV07CisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgIEtleTRbTUFYX0tFWV9MRU4rMV07CisJaGNmXzggICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbWl0S2V5SUQ7ICAgICAgLy8gMSAtIDQgKDEpCisJQ0ZHX0RFRkFVTFRfS0VZU19TVFJDVAkgICAgRGVmYXVsdEtleXM7CisJdV9jaGFyICAgICAgICAgICAgICAgICAgICAgIG1haWxib3hbTUJfU0laRV07CisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgIHN6RW5jcnlwdGlvbltNQVhfRU5DX0xFTl07CisKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyRW5hYmxlOworCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICB3b2xhc0VuYWJsZTsKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgYXRpbVdpbmRvdzsKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgaG9sZG92ZXJEdXJhdGlvbjsKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgTXVsdGljYXN0UmF0ZVsyXTsKKworCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbjsgLy8gaXMgdGhpcyBBUCBzcGVjaWZpYz8KKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzY3VvdXNNb2RlOworCVdWTEFOX0RSVl9NT0RFICAgICAgICAgICAgICBEb3dubG9hZEZpcm13YXJlOyAgIC8vIDAgLSAyICgwIFtOb25lXSB8IDEgW1NUQV0gfCAyIFtBUF0pCisKKwljaGFyCQkJCQkJZndfaW1hZ2VfZmlsZW5hbWVbTUFYX0xJTkVfU0laRSsxXTsKKworCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBBdXRoS2V5TWdtdFN1aXRlOworCisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIGxvYWRCYWxhbmNpbmc7CisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIG1lZGl1bURpc3RyaWJ1dGlvbjsKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgdHhQb3dMZXZlbDsKKwkvL2hjZl8xNiAgICAgICAgICAgICAgICAgICAgICBzaG9ydFJldHJ5TGltaXQ7CisJLy9oY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgbG9uZ1JldHJ5TGltaXQ7CisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIHNyc2NbMl07CisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIGJyc2NbMl07CisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250cm9sOworCS8vaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIHByb2JlRGF0YVJhdGVzWzJdOworCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBvd25CZWFjb25JbnRlcnZhbDsKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgY29leGlzdGVuY2U7CisKKwlXVkxBTl9GUkFNRSAgICAgICAgICAgICAgICAgdHhGOworCVdWTEFOX0xGUkFNRSAgICAgICAgICAgICAgICB0eExpc3RbREVGQVVMVF9OVU1fVFhfRlJBTUVTXTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgdHhGcmVlOworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICB0eFFbV1ZMQU5fTUFYX1RYX1FVRVVFU107CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG5ldGlmX3F1ZXVlX29uOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICB0eFFfY291bnQ7CisJREVTQ19TVFJDVCAgICAgICAgICAgICAgICAgIGRlc2Nfcng7CisJREVTQ19TVFJDVCAgICAgICAgICAgICAgICAgIGRlc2NfdHg7CisKKwlXVkxBTl9QT1JUX1NUQVRFICAgICAgICAgICAgcG9ydFN0YXRlOworCisJU2NhblJlc3VsdCAgICAgICAgICAgICAgICAgIHNjYW5fcmVzdWx0czsKKwlQcm9iZVJlc3VsdCAgICAgICAgICAgICAgICAgcHJvYmVfcmVzdWx0czsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVfbnVtX2FwczsKKworCWludCAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfZG1hOworCURNQV9TVFJDVCAgICAgICAgICAgICAgICAgICBkbWE7CisjaWZkZWYgVVNFX1JUUworCWludCAgICAgICAgICAgICAgICAgICAgICAgICB1c2VSVFM7CisjZW5kaWYgIC8vIFVTRV9SVFMKKwloY2ZfOCAgICAgICAgICAgICAgICAgICAgICAgRFRJTVBlcmlvZDsgICAgICAgICAvLyAxIC0gMjU1ICgxKQorCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBtdWx0aWNhc3RQTUJ1ZmZlcmluZzsKKwloY2ZfOCAgICAgICAgICAgICAgICAgICAgICAgUmVqZWN0QW55OyAgICAgICAgICAvLyAwIC0gMSAoMCkKKwloY2ZfOCAgICAgICAgICAgICAgICAgICAgICAgRXhjbHVkZVVuZW5jcnlwdGVkOyAvLyAwIC0gMSAoMSkKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgaW50cmFCU1NSZWxheTsKKyNpZmRlZiBVU0VfV0RTCisJV1ZMQU5fV0RTX0lGICAgICAgICAgICAgICAgIHdkc19wb3J0W05VTV9XRFNfUE9SVFNdOworI2VuZGlmIC8vIFVTRV9XRFMKK307IC8vIHdsX3ByaXZhdGUKKworI2lmZGVmIEhBVkVfTkVUREVWX1BSSVYKKyNkZWZpbmUgd2xfcHJpdihkZXYpICgoc3RydWN0IHdsX3ByaXZhdGUgKikgbmV0ZGV2X3ByaXYoZGV2KSkKKyNlbHNlCitleHRlcm4gaW5saW5lIHN0cnVjdCB3bF9wcml2YXRlICp3bF9wcml2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgcmV0dXJuIGRldi0+cHJpdjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBMb2NraW5nIGFuZCBzeW5jaHJvbml6YXRpb24gZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZXNlIGZ1bmN0aW9ucyAqbXVzdCogYmUgaW5saW5lIG9yIHRoZXkgd2lsbCBicmVhayBob3JyaWJseSBvbgorICogU1BBUkMsIGR1ZSB0byBpdHMgd2VpcmQgc2VtYW50aWNzIGZvciBzYXZlL3Jlc3RvcmUgZmxhZ3MuIGV4dGVybgorICogaW5saW5lIHNob3VsZCBwcmV2ZW50IHRoZSBrZXJuZWwgZnJvbSBsaW5raW5nIG9yIG1vZHVsZSBmcm9tCisgKiBsb2FkaW5nIGlmIHRoZXkgYXJlIG5vdCBpbmxpbmVkLiAqLworZXh0ZXJuIGlubGluZSB2b2lkIHdsX2xvY2soc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorCSAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zbG9jaywgKmZsYWdzKTsKK30KKworZXh0ZXJuIGlubGluZSB2b2lkIHdsX3VubG9jayhzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisJICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICpmbGFncykKK3sKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c2xvY2ssICpmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVycnVwdCBlbmFibGUgZGlzYWJsZSBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIGlubGluZSB2b2lkIHdsX2FjdF9pbnRfb24oc3RydWN0IHdsX3ByaXZhdGUgKmxwKQoreworCS8qCisJICogT25seSBkbyBzb21ldGhpbmcgd2hlbiB0aGUgZHJpdmVyIGlzIGhhbmRsaW5nCisJICogaW50ZXJydXB0cy4gSGFuZGxpbmcgc3RhcnRzIGF0IHdsX29wZW4gYW5kCisJICogZW5kcyBhdCB3bF9jbG9zZSB3aGVuIG5vdCBpbiBSVFMgbW9kZQorCSAqLworCWlmKGxwLT5pc19oYW5kbGluZ19pbnQgPT0gV0xfSEFORExJTkdfSU5UKSB7CisJCWhjZl9hY3Rpb24oICZscC0+aGNmQ3R4LCBIQ0ZfQUNUX0lOVF9PTiApOworCX0KK30KKworZXh0ZXJuIGlubGluZSB2b2lkIHdsX2FjdF9pbnRfb2ZmKHN0cnVjdCB3bF9wcml2YXRlICpscCkKK3sKKwkvKgorCSAqIE9ubHkgZG8gc29tZXRoaW5nIHdoZW4gdGhlIGRyaXZlciBpcyBoYW5kbGluZworCSAqIGludGVycnVwdHMuIEhhbmRsaW5nIHN0YXJ0cyBhdCB3bF9vcGVuIGFuZAorCSAqIGVuZHMgYXQgd2xfY2xvc2Ugd2hlbiBub3QgaW4gUlRTIG1vZGUKKwkgKi8KKwlpZihscC0+aXNfaGFuZGxpbmdfaW50ID09IFdMX0hBTkRMSU5HX0lOVCkgeworCQloY2ZfYWN0aW9uKCAmbHAtPmhjZkN0eCwgSENGX0FDVF9JTlRfT0ZGICk7CisJfQorfQorCisjZW5kaWYgIC8vIF9fV0FWRUxBTjJfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3NjRhMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX21haW4uYwpAQCAtMCwwICsxLDM4NjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1haW4gZHJpdmVyIGVudHJ5IHBvaW50cyBhbmQgb3RoZXIgYWRhcHRlcgorICogICBzcGVjaWZpYyByb3V0aW5lcy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGNvbnN0YW50IGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBbGxvdyBzdXBwb3J0IGZvciBjYWxsaW5nIHN5c3RlbSBmY25zIHRvIGFjY2VzcyBGL1cgaWFtZ2UgZmlsZSAqLworI2RlZmluZSBfX0tFUk5FTF9TWVNDQUxMU19fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDx3bF92ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisvLyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKy8vICNpbmNsdWRlIDxsaW51eC90cXVldWUuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9pbi5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisvLyAjaW5jbHVkZSA8YXNtL2lvLmg+CisvLyAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorLy8gI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2RlZmluZSBCSU5fREwgMAorI2lmIEJJTl9ETAorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNlbmRpZiAvLyBCSU5fREwKKworCisjaW5jbHVkZSA8ZGVidWcuaD4KKworI2luY2x1ZGUgPGhjZi5oPgorI2luY2x1ZGUgPGRoZi5oPgorLy9pbiBvcmRlciB0byBnZXQgYXJvdW5kOjogd2xfbWFpbi5jOjIyMjk6IGBIUkVHX0VWX1JETUFEJyB1bmRlY2xhcmVkIChmaXJzdCB1c2UgaW4gdGhpcyBmdW5jdGlvbikKKyNpbmNsdWRlIDxoY2ZkZWYuaD4KKworI2luY2x1ZGUgPHdsX2lmLmg+CisjaW5jbHVkZSA8d2xfaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx3bF91dGlsLmg+CisjaW5jbHVkZSA8d2xfbWFpbi5oPgorI2luY2x1ZGUgPHdsX25ldGRldi5oPgorI2luY2x1ZGUgPHdsX3dleHQuaD4KKworI2lmZGVmIFVTRV9QUk9GSUxFCisjaW5jbHVkZSA8d2xfcHJvZmlsZS5oPgorI2VuZGlmICAvKiBVU0VfUFJPRklMRSAqLworCisjaWZkZWYgQlVTX1BDTUNJQQorI2luY2x1ZGUgPHdsX2NzLmg+CisjZW5kaWYgIC8qIEJVU19QQ01DSUEgKi8KKworI2lmZGVmIEJVU19QQ0kKKyNpbmNsdWRlIDx3bF9wY2kuaD4KKyNlbmRpZiAgLyogQlVTX1BDSSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCW1hY3JvIGRlZmludGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFZBTElEX1BBUkFNKEMpIFwKKwl7IFwKKwkJaWYgKCEoQykpIFwKKwkJeyBcCisJCQlwcmludGsoS0VSTl9JTkZPICJXaXJlbGVzcywgcGFyYW1ldGVyIGVycm9yOiBcIiVzXCJcbiIsICNDKTsgXAorCQkJZ290byBmYWlsZWQ7IFwKKwkJfSBcCisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCWxvY2FsIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfaXNyX2hhbmRsZXIoIHVuc2lnbmVkIGxvbmcgcCApOworCisjaWYgMCAvL1NDVUxMX1VTRV9QUk9DIC8qIGRvbid0IHdhc3RlIHNwYWNlIGlmIHVudXNlZCAqLworLy9pbnQgc2N1bGxfcmVhZF9wcm9jbWVtKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW4sIGludCB1bnVzZWQpOworaW50IHNjdWxsX3JlYWRfcHJvY21lbShjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSApOworc3RhdGljIGludCB3cml0ZV9pbnQoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBwcm9jX3dyaXRlKGNvbnN0IGNoYXIgKm5hbWUsIHdyaXRlX3Byb2NfdCAqdywgdm9pZCAqZGF0YSk7CisKKyNlbmRpZiAvKiBTQ1VMTF9VU0VfUFJPQyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbW9kdWxlIHBhcmFtZXRlciBkZWZpbml0aW9ucyAtIHNldCB3aXRoICdpbnNtb2QnCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHBfdTE2ICAgIGlycV9tYXNrICAgICAgICAgICAgICAgID0gMHhkZWI4OyAvLyBJUlEzLDQsNSw3LDksMTAsMTEsMTIsMTQsMTUKK3N0YXRpYyBwX3M4ICAgICBpcnFfbGlzdFs0XSAgICAgICAgICAgICA9IHsgLTEgfTsKKworI2lmIDAKK01PRFVMRV9QQVJNKGlycV9tYXNrLCAgICAgICAgICAgICAgICJoIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycV9tYXNrLCAgICAgICAgICAgICAgICJJUlEgbWFzayBbMHhkZWI4XSIpOworTU9EVUxFX1BBUk0oaXJxX2xpc3QsICAgICAgICAgICAgICAgIjEtNGIiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxX2xpc3QsICAgICAgICAgICAgICAgIklSUSBsaXN0IFs8aXJxX21hc2s+XSIpOworI2VuZGlmCisKK3N0YXRpYyBwX3U4ICAgICBQQVJNX0FVVEhFTlRJQ0FUSU9OICAgICAgICAJPSBQQVJNX0RFRkFVTFRfQVVUSEVOVElDQVRJT047CitzdGF0aWMgcF91MTYgICAgUEFSTV9BVVRIX0tFWV9NR01UX1NVSVRFICAgCT0gUEFSTV9ERUZBVUxUX0FVVEhfS0VZX01HTVRfU1VJVEU7CitzdGF0aWMgcF91MTYgICAgUEFSTV9CUlNDXzJHSFogICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX0JSU0NfMkdIWjsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX0JSU0NfNUdIWiAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfQlJTQ181R0haOworc3RhdGljIHBfdTE2ICAgIFBBUk1fQ09FWElTVEVOQ0UgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9DT0VYSVNURU5DRTsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX0NPTk5FQ1RJT05fQ09OVFJPTCAgICAJPSBQQVJNX0RFRkFVTFRfQ09OTkVDVElPTl9DT05UUk9MOyAgLy87P3JlbmFtZSBhbmQgbW92ZQorc3RhdGljIHBfY2hhciAgKlBBUk1fQ1JFQVRFX0lCU1MgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9DUkVBVEVfSUJTU19TVFI7CitzdGF0aWMgcF9jaGFyICAqUEFSTV9ERVNJUkVEX1NTSUQgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1NTSUQ7CitzdGF0aWMgcF9jaGFyICAqUEFSTV9ET1dOTE9BRF9GSVJNV0FSRSAgICAgID0gIiI7CitzdGF0aWMgcF91MTYgICAgUEFSTV9FTkFCTEVfRU5DUllQVElPTiAgICAgCT0gUEFSTV9ERUZBVUxUX0VOQUJMRV9FTkNSWVBUSU9OOworc3RhdGljIHBfY2hhciAgKlBBUk1fRVhDTFVERV9VTkVOQ1JZUFRFRCAgIAk9IFBBUk1fREVGQVVMVF9FWENMVURFX1VORU5DUllQVEVEX1NUUjsKK3N0YXRpYyBwX2NoYXIgICpQQVJNX0lOVFJBX0JTU19SRUxBWSAgICAgICAJPSBQQVJNX0RFRkFVTFRfSU5UUkFfQlNTX1JFTEFZX1NUUjsKK3N0YXRpYyBwX2NoYXIgICpQQVJNX0tFWTEgICAgICAgICAgICAgICAgICAJPSAiIjsKK3N0YXRpYyBwX2NoYXIgICpQQVJNX0tFWTIgICAgICAgICAgICAgICAgICAJPSAiIjsKK3N0YXRpYyBwX2NoYXIgICpQQVJNX0tFWTMgICAgICAgICAgICAgICAgICAJPSAiIjsKK3N0YXRpYyBwX2NoYXIgICpQQVJNX0tFWTQgICAgICAgICAgICAgICAgICAJPSAiIjsKK3N0YXRpYyBwX2NoYXIgICpQQVJNX0xPQURfQkFMQU5DSU5HICAgICAgICAJPSBQQVJNX0RFRkFVTFRfTE9BRF9CQUxBTkNJTkdfU1RSOworc3RhdGljIHBfdTE2ICAgIFBBUk1fTUFYX1NMRUVQICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9NQVhfUE1fU0xFRVA7CitzdGF0aWMgcF9jaGFyICAqUEFSTV9NRURJVU1fRElTVFJJQlVUSU9OICAgCT0gUEFSTV9ERUZBVUxUX01FRElVTV9ESVNUUklCVVRJT05fU1RSOworc3RhdGljIHBfY2hhciAgKlBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1MgIAk9IFBBUk1fREVGQVVMVF9NSUNST1dBVkVfUk9CVVNUTkVTU19TVFI7CitzdGF0aWMgcF9jaGFyICAqUEFSTV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HCT0gUEFSTV9ERUZBVUxUX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkdfU1RSOworc3RhdGljIHBfdTE2ICAgIFBBUk1fTVVMVElDQVNUX1JBVEUgICAgICAgIAk9IFBBUk1fREVGQVVMVF9NVUxUSUNBU1RfUkFURV8yR0haOworc3RhdGljIHBfY2hhciAgKlBBUk1fTVVMVElDQVNUX1JYICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9NVUxUSUNBU1RfUlhfU1RSOworc3RhdGljIHBfdTggICAgIFBBUk1fTkVUV09SS19BRERSW0VUSF9BTEVOXQk9IFBBUk1fREVGQVVMVF9ORVRXT1JLX0FERFI7CitzdGF0aWMgcF91MTYgICAgUEFSTV9PV05fQVRJTV9XSU5ET1cgICAgICAgCT0gUEFSTV9ERUZBVUxUX09XTl9BVElNX1dJTkRPVzsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX09XTl9CRUFDT05fSU5URVJWQUwgICAJPSBQQVJNX0RFRkFVTFRfT1dOX0JFQUNPTl9JTlRFUlZBTDsKK3N0YXRpYyBwX3U4ICAgICBQQVJNX09XTl9DSEFOTkVMICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfT1dOX0NIQU5ORUw7CitzdGF0aWMgcF91OCAgICAgUEFSTV9PV05fRFRJTV9QRVJJT0QgICAgICAgCT0gUEFSTV9ERUZBVUxUX09XTl9EVElNX1BFUklPRDsKK3N0YXRpYyBwX2NoYXIgICpQQVJNX09XTl9OQU1FICAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfT1dOX05BTUU7CitzdGF0aWMgcF9jaGFyICAqUEFSTV9PV05fU1NJRCAgICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1NTSUQ7CitzdGF0aWMgcF91MTYJUEFSTV9QTV9FTkFCTEVEICAgICAgICAgICAgCT0gV1ZMQU5fUE1fU1RBVEVfRElTQUJMRUQ7CitzdGF0aWMgcF91MTYgICAgUEFSTV9QTV9IT0xET1ZFUl9EVVJBVElPTiAgCT0gUEFSTV9ERUZBVUxUX1BNX0hPTERPVkVSX0RVUkFUSU9OOworc3RhdGljIHBfdTggICAgIFBBUk1fUE9SVF9UWVBFICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9QT1JUX1RZUEU7CitzdGF0aWMgcF9jaGFyICAqUEFSTV9QUk9NSVNDVU9VU19NT0RFICAgICAgCT0gUEFSTV9ERUZBVUxUX1BST01JU0NVT1VTX01PREVfU1RSOworc3RhdGljIHBfY2hhciAgKlBBUk1fUkVKRUNUX0FOWSAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9SRUpFQ1RfQU5ZX1NUUjsKKyNpZmRlZiBVU0VfV0RTCitzdGF0aWMgcF91MTYgICAgUEFSTV9SVFNfVEhSRVNIT0xEMSAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1JUU19USFJFU0hPTEQ7CitzdGF0aWMgcF91MTYgICAgUEFSTV9SVFNfVEhSRVNIT0xEMiAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1JUU19USFJFU0hPTEQ7CitzdGF0aWMgcF91MTYgICAgUEFSTV9SVFNfVEhSRVNIT0xEMyAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1JUU19USFJFU0hPTEQ7CitzdGF0aWMgcF91MTYgICAgUEFSTV9SVFNfVEhSRVNIT0xENCAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1JUU19USFJFU0hPTEQ7CitzdGF0aWMgcF91MTYgICAgUEFSTV9SVFNfVEhSRVNIT0xENSAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1JUU19USFJFU0hPTEQ7CitzdGF0aWMgcF91MTYgICAgUEFSTV9SVFNfVEhSRVNIT0xENiAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1JUU19USFJFU0hPTEQ7CisjZW5kaWYgLy8gVVNFX1dEUworc3RhdGljIHBfdTE2ICAgIFBBUk1fUlRTX1RIUkVTSE9MRCAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9SVFNfVEhSRVNIT0xEOworc3RhdGljIHBfdTE2ICAgIFBBUk1fU1JTQ18yR0haICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9TUlNDXzJHSFo7CitzdGF0aWMgcF91MTYgICAgUEFSTV9TUlNDXzVHSFogICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1NSU0NfNUdIWjsKK3N0YXRpYyBwX3U4ICAgICBQQVJNX1NZU1RFTV9TQ0FMRSAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfU1lTVEVNX1NDQUxFOworc3RhdGljIHBfdTggICAgIFBBUk1fVFhfS0VZICAgICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9UWF9LRVk7CitzdGF0aWMgcF91MTYgICAgUEFSTV9UWF9QT1dfTEVWRUwgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1RYX1BPV19MRVZFTDsKKyNpZmRlZiBVU0VfV0RTCitzdGF0aWMgcF91MTYgICAgUEFSTV9UWF9SQVRFMSAgICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1RYX1JBVEVfMkdIWjsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX1RYX1JBVEUyICAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfVFhfUkFURV8yR0haOworc3RhdGljIHBfdTE2ICAgIFBBUk1fVFhfUkFURTMgICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9UWF9SQVRFXzJHSFo7CitzdGF0aWMgcF91MTYgICAgUEFSTV9UWF9SQVRFNCAgICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1RYX1JBVEVfMkdIWjsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX1RYX1JBVEU1ICAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfVFhfUkFURV8yR0haOworc3RhdGljIHBfdTE2ICAgIFBBUk1fVFhfUkFURTYgICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9UWF9SQVRFXzJHSFo7CisjZW5kaWYgLy8gVVNFX1dEUworc3RhdGljIHBfdTE2ICAgIFBBUk1fVFhfUkFURSAgICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9UWF9SQVRFXzJHSFo7CisjaWZkZWYgVVNFX1dEUworc3RhdGljIHBfdTggICAgIFBBUk1fV0RTX0FERFJFU1MxW0VUSF9BTEVOXQk9IFBBUk1fREVGQVVMVF9ORVRXT1JLX0FERFI7CitzdGF0aWMgcF91OCAgICAgUEFSTV9XRFNfQUREUkVTUzJbRVRIX0FMRU5dCT0gUEFSTV9ERUZBVUxUX05FVFdPUktfQUREUjsKK3N0YXRpYyBwX3U4ICAgICBQQVJNX1dEU19BRERSRVNTM1tFVEhfQUxFTl0JPSBQQVJNX0RFRkFVTFRfTkVUV09SS19BRERSOworc3RhdGljIHBfdTggICAgIFBBUk1fV0RTX0FERFJFU1M0W0VUSF9BTEVOXQk9IFBBUk1fREVGQVVMVF9ORVRXT1JLX0FERFI7CitzdGF0aWMgcF91OCAgICAgUEFSTV9XRFNfQUREUkVTUzVbRVRIX0FMRU5dCT0gUEFSTV9ERUZBVUxUX05FVFdPUktfQUREUjsKK3N0YXRpYyBwX3U4ICAgICBQQVJNX1dEU19BRERSRVNTNltFVEhfQUxFTl0JPSBQQVJNX0RFRkFVTFRfTkVUV09SS19BRERSOworI2VuZGlmIC8vIFVTRV9XRFMKKworCisjaWYgMAorTU9EVUxFX1BBUk0oUEFSTV9ERVNJUkVEX1NTSUQsICAgICAgICAgICJzIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fREVTSVJFRF9TU0lELCAgICAgICAgICAgICAiTmV0d29yayBOYW1lICg8c3RyaW5nPikgW0FOWV0iKTsKK01PRFVMRV9QQVJNKFBBUk1fT1dOX1NTSUQsICAgICAgICAgICAgICAicyIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX09XTl9TU0lELCAgICAgICAgICAgICAgICAgIk5ldHdvcmsgTmFtZSAoPHN0cmluZz4pIFtBTlldIik7CitNT0RVTEVfUEFSTShQQVJNX09XTl9DSEFOTkVMLCAgICAgICAgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9PV05fQ0hBTk5FTCwgICAgICAgICAgICAgICJDaGFubmVsICgwIC0gMTQpIFswXSIpOworTU9EVUxFX1BBUk0oUEFSTV9TWVNURU1fU0NBTEUsICAgICAgICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fU1lTVEVNX1NDQUxFLCAgICAgICAgICAgICAiRGlzdGFuY2UgQmV0d2VlbiBBUHMgKDEgLSAzKSBbMV0iKTsKK01PRFVMRV9QQVJNKFBBUk1fVFhfUkFURSwgICAgICAgICAgICAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1RYX1JBVEUsICAgICAgICAgICAgICAgICAgIlRyYW5zbWl0IFJhdGUgQ29udHJvbCIpOworTU9EVUxFX1BBUk0oUEFSTV9SVFNfVEhSRVNIT0xELCAgICAgICAgICJoIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fUlRTX1RIUkVTSE9MRCwgICAgICAgICAgICAiTWVkaXVtIFJlc2VydmF0aW9uIChSVFMvQ1RTIEZyYWdtZW50IExlbmd0aCkgKDI1NiAtIDIzNDcpIFsyMzQ3XSIpOworTU9EVUxFX1BBUk0oUEFSTV9NSUNST1dBVkVfUk9CVVNUTkVTUywgICJzIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1MsICAgICAiTWljcm93YXZlIE92ZW4gUm9idXN0bmVzcyBFbmFibGVkICg8c3RyaW5nPiBOIG9yIFkpIFtOXSIpOworTU9EVUxFX1BBUk0oUEFSTV9PV05fTkFNRSwgICAgICAgICAgICAgICJzIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fT1dOX05BTUUsICAgICAgICAgICAgICAgICAiU3RhdGlvbiBOYW1lICg8c3RyaW5nPikgW0xpbnV4XSIpOworCitNT0RVTEVfUEFSTShQQVJNX0VOQUJMRV9FTkNSWVBUSU9OLCAgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9FTkFCTEVfRU5DUllQVElPTiwgICAgICAgICJFbmNyeXB0aW9uIE1vZGUgKDAgLSA3KSBbMF0iKTsKKworTU9EVUxFX1BBUk0oUEFSTV9LRVkxLCAgICAgICAgICAgICAgICAgICJzIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fS0VZMSwgICAgICAgICAgICAgICAgICAgICAiRGF0YSBFbmNyeXB0aW9uIEtleSAxICg8c3RyaW5nPikgW10iKTsKK01PRFVMRV9QQVJNKFBBUk1fS0VZMiwgICAgICAgICAgICAgICAgICAicyIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX0tFWTIsICAgICAgICAgICAgICAgICAgICAgIkRhdGEgRW5jcnlwdGlvbiBLZXkgMiAoPHN0cmluZz4pIFtdIik7CitNT0RVTEVfUEFSTShQQVJNX0tFWTMsICAgICAgICAgICAgICAgICAgInMiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9LRVkzLCAgICAgICAgICAgICAgICAgICAgICJEYXRhIEVuY3J5cHRpb24gS2V5IDMgKDxzdHJpbmc+KSBbXSIpOworTU9EVUxFX1BBUk0oUEFSTV9LRVk0LCAgICAgICAgICAgICAgICAgICJzIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fS0VZNCwgICAgICAgICAgICAgICAgICAgICAiRGF0YSBFbmNyeXB0aW9uIEtleSA0ICg8c3RyaW5nPikgW10iKTsKK01PRFVMRV9QQVJNKFBBUk1fVFhfS0VZLCAgICAgICAgICAgICAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1RYX0tFWSwgICAgICAgICAgICAgICAgICAgIlRyYW5zbWl0IEtleSBJRCAoMSAtIDQpIFsxXSIpOworTU9EVUxFX1BBUk0oUEFSTV9NVUxUSUNBU1RfUkFURSwgICAgICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fTVVMVElDQVNUX1JBVEUsICAgICAgICAgICAiTXVsdGljYXN0IFJhdGUiKTsKK01PRFVMRV9QQVJNKFBBUk1fRE9XTkxPQURfRklSTVdBUkUsICAgICAicyIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX0RPV05MT0FEX0ZJUk1XQVJFLCAgICAgICAgImZpbGVuYW1lIG9mIGZpcm13YXJlIGltYWdlIik7CisKK01PRFVMRV9QQVJNKFBBUk1fQVVUSF9LRVlfTUdNVF9TVUlURSwgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX0FVVEhfS0VZX01HTVRfU1VJVEUsICAgICAgIkF1dGhlbnRpY2F0aW9uIEtleSBNYW5hZ2VtZW50IHN1aXRlICgwLTQpIFswXSIpOworCitNT0RVTEVfUEFSTShQQVJNX0xPQURfQkFMQU5DSU5HLCAgICAgICAgInMiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9MT0FEX0JBTEFOQ0lORywgICAgICAgICAgICJMb2FkIEJhbGFuY2luZyBFbmFibGVkICg8c3RyaW5nPiBOIG9yIFkpIFtZXSIpOworTU9EVUxFX1BBUk0oUEFSTV9NRURJVU1fRElTVFJJQlVUSU9OLCAgICJzIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fTUVESVVNX0RJU1RSSUJVVElPTiwgICAgICAiTWVkaXVtIERpc3RyaWJ1dGlvbiBFbmFibGVkICg8c3RyaW5nPiBOIG9yIFkpIFtZXSIpOworTU9EVUxFX1BBUk0oUEFSTV9UWF9QT1dfTEVWRUwsICAgICAgICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fVFhfUE9XX0xFVkVMLCAgICAgICAgICAgICAiVHJhbnNtaXQgUG93ZXIgKDAgLSA2KSBbM10iKTsKK01PRFVMRV9QQVJNKFBBUk1fU1JTQ18yR0haLCAgICAgICAgICAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1NSU0NfMkdIWiwgICAgICAgICAgICAgICAgIlN1cHBvcnRlZCBSYXRlIFNldCBDb250cm9sIDIuNCBHSHoiKTsKK01PRFVMRV9QQVJNKFBBUk1fU1JTQ181R0haLCAgICAgICAgICAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1NSU0NfNUdIWiwgICAgICAgICAgICAgICAgIlN1cHBvcnRlZCBSYXRlIFNldCBDb250cm9sIDUuMCBHSHoiKTsKK01PRFVMRV9QQVJNKFBBUk1fQlJTQ18yR0haLCAgICAgICAgICAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX0JSU0NfMkdIWiwgICAgICAgICAgICAgICAgIkJhc2ljIFJhdGUgU2V0IENvbnRyb2wgMi40IEdIeiIpOworTU9EVUxFX1BBUk0oUEFSTV9CUlNDXzVHSFosICAgICAgICAgICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fQlJTQ181R0haLCAgICAgICAgICAgICAgICAiQmFzaWMgUmF0ZSBTZXQgQ29udHJvbCA1LjAgR0h6Iik7CisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEKKy8vOz9zZWVtcyByZWFzb25hYmxlIHRoYXQgZXZlbiBhbiBBUC1vbmx5IGRyaXZlciBjb3VsZCBhZmZvcmQgdGhpcyBzbWFsbCBhZGRpdGlvbmFsIGZvb3RwcmludAorTU9EVUxFX1BBUk0oUEFSTV9QTV9FTkFCTEVELCAgICAgICAgICAgICJoIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fUE1fRU5BQkxFRCwgICAgICAgICAgICAgICAiUG93ZXIgTWFuYWdlbWVudCBTdGF0ZSAoMCAtIDIsIDgwMDEgLSA4MDAyKSBbMF0iKTsKK01PRFVMRV9QQVJNKFBBUk1fUE9SVF9UWVBFLCAgICAgICAgICAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1BPUlRfVFlQRSwgICAgICAgICAgICAgICAgIlBvcnQgVHlwZSAoMSAtIDMpIFsxXSIpOworLy87P01PRFVMRV9QQVJNKFBBUk1fQ1JFQVRFX0lCU1MsICAgICAgICAgICAicyIpOworLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9DUkVBVEVfSUJTUywgICAgICAgICAgICAgICJDcmVhdGUgSUJTUyAoPHN0cmluZz4gTiBvciBZKSBbTl0iKTsKKy8vOz9NT0RVTEVfUEFSTShQQVJNX01VTFRJQ0FTVF9SWCwgICAgICAgICAgInMiKTsKKy8vOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fTVVMVElDQVNUX1JYLCAgICAgICAgICAgICAiTXVsdGljYXN0IFJlY2VpdmUgRW5hYmxlICg8c3RyaW5nPiBOIG9yIFkpIFtZXSIpOworLy87P01PRFVMRV9QQVJNKFBBUk1fTUFYX1NMRUVQLCAgICAgICAgICAgICAiaCIpOworLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9NQVhfU0xFRVAsICAgICAgICAgICAgICAgICJNYXhpbXVtIFBvd2VyIE1hbmFnZW1lbnQgU2xlZXAgRHVyYXRpb24gKDAgLSA2NTUzNSkgWzEwMF0iKTsKKy8vOz9NT0RVTEVfUEFSTShQQVJNX05FVFdPUktfQUREUiwgICAgICAgICAgIjZiIik7CisvLzs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX05FVFdPUktfQUREUiwgICAgICAgICAgICAgIkhhcmR3YXJlIEV0aGVybmV0IEFkZHJlc3MgKFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdKSBbPGZhY3RvcnkgdmFsdWU+XSIpOworLy87P01PRFVMRV9QQVJNKFBBUk1fQVVUSEVOVElDQVRJT04sICAgICAgICAiYiIpOworLy8KKy8vdHJhY2tlciAxMjQ0OAorLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9BVVRIRU5USUNBVElPTiwgICAgICAgICAgICJBdXRoZW50aWNhdGlvbiBUeXBlICgwLTIpIFswXSAwPU9wZW4gMT1TaGFyZWRLZXkgMj1MRUFQIik7CisvLzs/TU9EVUxFX1BBUk1fREVTQyhhdXRoZW50aWNhdGlvbiwgICAgICAgICAiQXV0aGVudGljYXRpb24gVHlwZSAoMS0yKSBbMV0gMT1PcGVuIDI9U2hhcmVkS2V5Iik7CisvL3RyYWNrZXIgMTI0NDgKKy8vCisvLzs/TU9EVUxFX1BBUk0oUEFSTV9PV05fQVRJTV9XSU5ET1csICAgICAgICJiIik7CisvLzs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX09XTl9BVElNX1dJTkRPVywgICAgICAgICAgIkFUSU0gV2luZG93IHRpbWUgaW4gVFUgZm9yIElCU1MgY3JlYXRpb24gKDAtMTAwKSBbMF0iKTsKKy8vOz9NT0RVTEVfUEFSTShQQVJNX1BNX0hPTERPVkVSX0RVUkFUSU9OLCAgImIiKTsKKy8vOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fUE1fSE9MRE9WRVJfRFVSQVRJT04sICAgICAiVGltZSBzdGF0aW9uIHJlbWFpbnMgYXdha2UgYWZ0ZXIgTUFDIGZyYW1lIHRyYW5zZmVyIHdoZW4gUE0gaXMgb24gKDAtNjU1MzUpIFsxMDBdIik7CisvLzs/TU9EVUxFX1BBUk0oUEFSTV9QUk9NSVNDVU9VU19NT0RFLCAgICAgICJzIik7CisvLzs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX1BST01JU0NVT1VTX01PREUsICAgICAgICAgIlByb21pc2N1b3VzIE1vZGUgRW5hYmxlICg8c3RyaW5nPiBZIG9yIE4gKSBbTl0iICk7CisvLzs/CitNT0RVTEVfUEFSTShQQVJNX0NPTk5FQ1RJT05fQ09OVFJPTCwgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9DT05ORUNUSU9OX0NPTlRST0wsICAgICAgICJDb25uZWN0aW9uIENvbnRyb2wgKDAgLSAzKSBbMl0iKTsKKyNlbmRpZiAvKiBIQ0ZfU1RBICovCisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorCQkJCQkvLzs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQKK01PRFVMRV9QQVJNKFBBUk1fT1dOX0RUSU1fUEVSSU9ELCAgICAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX09XTl9EVElNX1BFUklPRCwgICAgICAgICAgIkRUSU0gUGVyaW9kICgwIC0gMjU1KSBbMV0iKTsKK01PRFVMRV9QQVJNKFBBUk1fUkVKRUNUX0FOWSwgICAgICAgICAgICAicyIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1JFSkVDVF9BTlksICAgICAgICAgICAgICAgIkNsb3NlZCBTeXN0ZW0gKDxzdHJpbmc+IE4gb3IgWSkgW05dIik7CitNT0RVTEVfUEFSTShQQVJNX0VYQ0xVREVfVU5FTkNSWVBURUQsICAgInMiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9FWENMVURFX1VORU5DUllQVEVELCAgICAgICJEZW55IG5vbi1lbmNyeXB0ZWQgKDxzdHJpbmc+IE4gb3IgWSkgW1ldIik7CitNT0RVTEVfUEFSTShQQVJNX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcsInMiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HLCAgICJCdWZmZXIgTUFDIGZyYW1lcyBmb3IgVHggYWZ0ZXIgRFRJTSAoPHN0cmluZz4gWSBvciBOKSBbWV0iKTsKK01PRFVMRV9QQVJNKFBBUk1fSU5UUkFfQlNTX1JFTEFZLCAgICAgICAicyIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX0lOVFJBX0JTU19SRUxBWSwgICAgICAgICAgIkludHJhQlNTIFJlbGF5ICg8c3RyaW5nPiBOIG9yIFkpIFtZXSIpOworTU9EVUxFX1BBUk0oUEFSTV9SVFNfVEhSRVNIT0xEMSwgICAgICAgICJoIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fUlRTX1RIUkVTSE9MRDEsICAgICAgICAgICAiUlRTIFRocmVzaG9sZCwgV0RTIFBvcnQgMSAoMjU2IC0gMjM0NykgWzIzNDddIik7CitNT0RVTEVfUEFSTShQQVJNX1JUU19USFJFU0hPTEQyLCAgICAgICAgImgiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9SVFNfVEhSRVNIT0xEMiwgICAgICAgICAgICJSVFMgVGhyZXNob2xkLCBXRFMgUG9ydCAyICgyNTYgLSAyMzQ3KSBbMjM0N10iKTsKK01PRFVMRV9QQVJNKFBBUk1fUlRTX1RIUkVTSE9MRDMsICAgICAgICAiaCIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1JUU19USFJFU0hPTEQzLCAgICAgICAgICAgIlJUUyBUaHJlc2hvbGQsIFdEUyBQb3J0IDMgKDI1NiAtIDIzNDcpIFsyMzQ3XSIpOworTU9EVUxFX1BBUk0oUEFSTV9SVFNfVEhSRVNIT0xENCwgICAgICAgICJoIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fUlRTX1RIUkVTSE9MRDQsICAgICAgICAgICAiUlRTIFRocmVzaG9sZCwgV0RTIFBvcnQgNCAoMjU2IC0gMjM0NykgWzIzNDddIik7CitNT0RVTEVfUEFSTShQQVJNX1JUU19USFJFU0hPTEQ1LCAgICAgICAgImgiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9SVFNfVEhSRVNIT0xENSwgICAgICAgICAgICJSVFMgVGhyZXNob2xkLCBXRFMgUG9ydCA1ICgyNTYgLSAyMzQ3KSBbMjM0N10iKTsKK01PRFVMRV9QQVJNKFBBUk1fUlRTX1RIUkVTSE9MRDYsICAgICAgICAiaCIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1JUU19USFJFU0hPTEQ2LCAgICAgICAgICAgIlJUUyBUaHJlc2hvbGQsIFdEUyBQb3J0IDYgKDI1NiAtIDIzNDcpIFsyMzQ3XSIpOworTU9EVUxFX1BBUk0oUEFSTV9UWF9SQVRFMSwgICAgICAgICAgICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fVFhfUkFURTEsICAgICAgICAgICAgICAgICAiVHJhbnNtaXQgUmF0ZSBDb250cm9sLCBXRFMgUG9ydCAxICgxIC0gNykgWzNdIik7CitNT0RVTEVfUEFSTShQQVJNX1RYX1JBVEUyLCAgICAgICAgICAgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9UWF9SQVRFMiwgICAgICAgICAgICAgICAgICJUcmFuc21pdCBSYXRlIENvbnRyb2wsIFdEUyBQb3J0IDIgKDEgLSA3KSBbM10iKTsKK01PRFVMRV9QQVJNKFBBUk1fVFhfUkFURTMsICAgICAgICAgICAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1RYX1JBVEUzLCAgICAgICAgICAgICAgICAgIlRyYW5zbWl0IFJhdGUgQ29udHJvbCwgV0RTIFBvcnQgMyAoMSAtIDcpIFszXSIpOworTU9EVUxFX1BBUk0oUEFSTV9UWF9SQVRFNCwgICAgICAgICAgICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fVFhfUkFURTQsICAgICAgICAgICAgICAgICAiVHJhbnNtaXQgUmF0ZSBDb250cm9sLCBXRFMgUG9ydCA0ICgxIC0gNykgWzNdIik7CitNT0RVTEVfUEFSTShQQVJNX1RYX1JBVEU1LCAgICAgICAgICAgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9UWF9SQVRFNSwgICAgICAgICAgICAgICAgICJUcmFuc21pdCBSYXRlIENvbnRyb2wsIFdEUyBQb3J0IDUgKDEgLSA3KSBbM10iKTsKK01PRFVMRV9QQVJNKFBBUk1fVFhfUkFURTYsICAgICAgICAgICAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1RYX1JBVEU2LCAgICAgICAgICAgICAgICAgIlRyYW5zbWl0IFJhdGUgQ29udHJvbCwgV0RTIFBvcnQgNiAoMSAtIDcpIFszXSIpOworTU9EVUxFX1BBUk0oUEFSTV9XRFNfQUREUkVTUzEsICAgICAgICAgICI2YiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1dEU19BRERSRVNTMSwgICAgICAgICAgICAgIk1BQyBBZGRyZXNzLCBXRFMgUG9ydCAxIChbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSkgW3swfV0iKTsKK01PRFVMRV9QQVJNKFBBUk1fV0RTX0FERFJFU1MyLCAgICAgICAgICAiNmIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9XRFNfQUREUkVTUzIsICAgICAgICAgICAgICJNQUMgQWRkcmVzcywgV0RTIFBvcnQgMiAoWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0pIFt7MH1dIik7CitNT0RVTEVfUEFSTShQQVJNX1dEU19BRERSRVNTMywgICAgICAgICAgIjZiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fV0RTX0FERFJFU1MzLCAgICAgICAgICAgICAiTUFDIEFkZHJlc3MsIFdEUyBQb3J0IDMgKFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdKSBbezB9XSIpOworTU9EVUxFX1BBUk0oUEFSTV9XRFNfQUREUkVTUzQsICAgICAgICAgICI2YiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1dEU19BRERSRVNTNCwgICAgICAgICAgICAgIk1BQyBBZGRyZXNzLCBXRFMgUG9ydCA0IChbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSkgW3swfV0iKTsKK01PRFVMRV9QQVJNKFBBUk1fV0RTX0FERFJFU1M1LCAgICAgICAgICAiNmIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9XRFNfQUREUkVTUzUsICAgICAgICAgICAgICJNQUMgQWRkcmVzcywgV0RTIFBvcnQgNSAoWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0pIFt7MH1dIik7CitNT0RVTEVfUEFSTShQQVJNX1dEU19BRERSRVNTNiwgICAgICAgICAgIjZiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fV0RTX0FERFJFU1M2LCAgICAgICAgICAgICAiTUFDIEFkZHJlc3MsIFdEUyBQb3J0IDYgKFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdKSBbezB9XSIpOworCitNT0RVTEVfUEFSTShQQVJNX09XTl9CRUFDT05fSU5URVJWQUwsICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9PV05fQkVBQ09OX0lOVEVSVkFMLCAgICAgICJPd24gQmVhY29uIEludGVydmFsICgyMCAtIDIwMCkgWzEwMF0iKTsKK01PRFVMRV9QQVJNKFBBUk1fQ09FWElTVEVOQ0UsICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9DT0VYSVNURU5DRSwgICAgICAiQ29leGlzdGVuY2UgKDAtNykgWzBdIik7CisKKyNlbmRpZiAvKiBIQ0ZfQVAgKi8KKyNlbmRpZgorCisvKiBFTkQgTkVXIFBBUkFNRVRFUlMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBkZWJ1Z2dpbmcgc3BlY2lmaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIERCRworCitzdGF0aWMgcF91MzIgICAgcGNfZGVidWcgPSBEQkdfTFZMOworLy9NT0RVTEVfUEFSTShwY19kZWJ1ZywgImkiKTsKKy8qc3RhdGljIDs/Y29uZmxpY3RzIHdpdGggbXkgdW5kZXJzdGFuZGluZyBvZiBDTCBwYXJhbWV0ZXJzIGFuZCBicmVha3Mgbm93IEkgbW92ZWQKKyAqIHRoZSBjb3JyZXNwb25kaWcgbG9naWMgdG8gd2xfcHJvZmlsZQorICovIHBfdTMyICAgIERlYnVnRmxhZyA9IH4wOyAvL3JlY29nbml6YWJsZSAidW5kZWZpbmVkIHZhbHVlIiByYXRoZXIgdGhlbiBEQkdfREVGQVVMVFM7CisvL01PRFVMRV9QQVJNKERlYnVnRmxhZywgImwiKTsKKworZGJnX2luZm9fdCAgIHdsX2luZm8gPSB7IERCR19NT0RfTkFNRSwgMCwgMCB9OworZGJnX2luZm9fdCAgKkRiZ0luZm8gPSAmd2xfaW5mbzsKKworI2VuZGlmIC8qIERCRyAqLworI2lmZGVmIFVTRV9SVFMKKworc3RhdGljIHBfY2hhciAgKnVzZVJUUyA9ICJOIjsKK01PRFVMRV9QQVJNKCB1c2VSVFMsICJzIiApOworTU9EVUxFX1BBUk1fREVTQyggdXNlUlRTLCAiVXNlIFJUUyB0ZXN0IGludGVyZmFjZSAoPHN0cmluZz4gTiBvciBZKSBbTl0iICk7CisKKyNlbmRpZiAgLyogVVNFX1JUUyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZpcm13YXJlIGRvd25sb2FkIHNwZWNpZmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBzdHJ1Y3QgQ0ZHX1JBTkdFMl9TVFJDVCBCQVNFRAorCWNmZ19kcnZfYWN0X3Jhbmdlc19wcmk7IAkgICAgLy8gZGVzY3JpYmVzIHByaW1hcnktYWN0b3IgcmFuZ2Ugb2YgSENGCisKKyNpZiAwIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCitleHRlcm4gbWVtaW1hZ2UgYXA7ICAgICAgICAgICAgICAgICAvLyBBUCBmaXJtd2FyZSBpbWFnZSB0byBiZSBkb3dubG9hZGVkCisjZW5kaWYgLyogSENGX0FQICovCisKKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQQorLy9leHRlcm4gbWVtaW1hZ2Ugc3RhdGlvbjsgICAgICAgICAgICAvLyBTVEEgZmlybXdhcmUgaW1hZ2UgdG8gYmUgZG93bmxvYWRlZAorZXh0ZXJuIG1lbWltYWdlIGZ3X2ltYWdlOyAgICAgICAgICAgIC8vIGZpcm13YXJlIGltYWdlIHRvIGJlIGRvd25sb2FkZWQKKyNlbmRpZiAvKiBIQ0ZfU1RBICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2luc2VydCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIHdsX2luc2VydCgpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudCBpcworICogIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZSBldGhlcm5ldCBkZXZpY2UKKyAqICBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgbmV0X2RldmljZSBzdHJ1Y3Qgb2YgdGhlIHdpcmVsZXNzIGRldmljZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgVFJVRSBvciBGQUxTRQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfaW5zZXJ0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlpbnQgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAwOworCWludCAgICAgICAgICAgICAgICAgICAgIGhjZl9zdGF0dXMgPSBIQ0ZfU1VDQ0VTUzsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBpOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGZsYWdzID0gMDsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAqbHAgPSB3bF9wcml2KGRldik7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid2xfaW5zZXJ0IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJLyogSW5pdGlhbGl6ZSB0aGUgYWRhcHRlciBoYXJkd2FyZS4gKi8KKwltZW1zZXQoICYoIGxwLT5oY2ZDdHggKSwgMCwgc2l6ZW9mKCBJRkJfU1RSQ1QgKSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBhZGFwdGVyIHBhcmFtZXRlcnMuICovCisJc3Bpbl9sb2NrX2luaXQoICYoIGxwLT5zbG9jayApKTsKKworCS8qIEludGlhbGl6ZSBzdGF0ZXMgKi8KKwkvL2xwLT5sb2NrY291bnQgPSAwOyAvL1BFMUROTgorICAgICAgICBscC0+aXNfaGFuZGxpbmdfaW50ID0gV0xfTk9UX0hBTkRMSU5HX0lOVDsKKwlscC0+ZmlybXdhcmVfcHJlc2VudCA9IFdMX0ZSSU1XQVJFX05PVF9QUkVTRU5UOworCisJbHAtPmRldiA9IGRldjsKKworCURCR19QQVJBTSggRGJnSW5mbywgImlycV9tYXNrIiwgIjB4JTA0eCIsIGlycV9tYXNrICYgMHgwRkZGRiApOworCURCR19QQVJBTSggRGJnSW5mbywgImlycV9saXN0IiwgIjB4JTAyeCAweCUwMnggMHglMDJ4IDB4JTAyeCIsCisJCQkgICBpcnFfbGlzdFswXSAmIDB4MEZGLCBpcnFfbGlzdFsxXSAmIDB4MEZGLAorCQkJICAgaXJxX2xpc3RbMl0gJiAweDBGRiwgaXJxX2xpc3RbM10gJiAweDBGRiApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0RFU0lSRURfU1NJRCwgIlwiJXNcIiIsIFBBUk1fREVTSVJFRF9TU0lEICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfT1dOX1NTSUQsICJcIiVzXCIiLCBQQVJNX09XTl9TU0lEICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfT1dOX0NIQU5ORUwsICIlZCIsIFBBUk1fT1dOX0NIQU5ORUwpOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1NZU1RFTV9TQ0FMRSwgIiVkIiwgUEFSTV9TWVNURU1fU0NBTEUgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9SQVRFLCAiJWQiLCBQQVJNX1RYX1JBVEUgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xELCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9NSUNST1dBVkVfUk9CVVNUTkVTUywgIlwiJXNcIiIsIFBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1MgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9PV05fTkFNRSwgIlwiJXNcIiIsIFBBUk1fT1dOX05BTUUgKTsKKy8vOz8JCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0VOQUJMRV9FTkNSWVBUSU9OLCAiXCIlc1wiIiwgUEFSTV9FTkFCTEVfRU5DUllQVElPTiApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0tFWTEsICJcIiVzXCIiLCBQQVJNX0tFWTEgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9LRVkyLCAiXCIlc1wiIiwgUEFSTV9LRVkyICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfS0VZMywgIlwiJXNcIiIsIFBBUk1fS0VZMyApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0tFWTQsICJcIiVzXCIiLCBQQVJNX0tFWTQgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9LRVksICIlZCIsIFBBUk1fVFhfS0VZICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfTVVMVElDQVNUX1JBVEUsICIlZCIsIFBBUk1fTVVMVElDQVNUX1JBVEUgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9ET1dOTE9BRF9GSVJNV0FSRSwgIlwiJXNcIiIsIFBBUk1fRE9XTkxPQURfRklSTVdBUkUgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9BVVRIX0tFWV9NR01UX1NVSVRFLCAiJWQiLCBQQVJNX0FVVEhfS0VZX01HTVRfU1VJVEUgKTsKKy8vOz8jaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQQorCQkJCQkvLzs/c2hvdWxkIHdlIG1ha2UgdGhpcyBjb2RlIGNvbmRpdGlvbmFsIGRlcGVuZGluZyBvbiBpbiBTVEEgbW9kZQorLy87PyAgICAgICAgREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUE9SVF9UWVBFLCAiJWQiLCBQQVJNX1BPUlRfVFlQRSApOworCQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9QTV9FTkFCTEVELCAiJTA0eCIsIFBBUk1fUE1fRU5BQkxFRCApOworLy87PyAgICAgICAgREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfQ1JFQVRFX0lCU1MsICJcIiVzXCIiLCBQQVJNX0NSRUFURV9JQlNTICk7CisvLzs/ICAgICAgICBEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9NVUxUSUNBU1RfUlgsICJcIiVzXCIiLCBQQVJNX01VTFRJQ0FTVF9SWCApOworLy87PyAgICAgICAgREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfTUFYX1NMRUVQLCAiJWQiLCBQQVJNX01BWF9TTEVFUCApOworLy87PyAgICAgICAgREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfTkVUV09SS19BRERSLCAiXCIlc1wiIiwgRGJnSHdBZGRyKCBQQVJNX05FVFdPUktfQUREUiApKTsKKy8vOz8gICAgICAgIERCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0FVVEhFTlRJQ0FUSU9OLCAiJWQiLCBQQVJNX0FVVEhFTlRJQ0FUSU9OICk7CisvLzs/ICAgICAgICBEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9PV05fQVRJTV9XSU5ET1csICIlZCIsIFBBUk1fT1dOX0FUSU1fV0lORE9XICk7CisvLzs/ICAgICAgICBEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9QTV9IT0xET1ZFUl9EVVJBVElPTiwgIiVkIiwgUEFSTV9QTV9IT0xET1ZFUl9EVVJBVElPTiApOworLy87PyAgICAgICAgREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUFJPTUlTQ1VPVVNfTU9ERSwgIlwiJXNcIiIsIFBBUk1fUFJPTUlTQ1VPVVNfTU9ERSApOworLy87PyNlbmRpZiAvKiBIQ0ZfU1RBICovCisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorCQkvLzs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQKKwkJLy87P0kgZ3Vlc3M6IG5vLCBzaW5jZSB0aGlzIGlzIERlYnVnIG1vZGUgb25seQorCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX09XTl9EVElNX1BFUklPRCwgIiVkIiwgUEFSTV9PV05fRFRJTV9QRVJJT0QgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9SRUpFQ1RfQU5ZLCAiXCIlc1wiIiwgUEFSTV9SRUpFQ1RfQU5ZICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfRVhDTFVERV9VTkVOQ1JZUFRFRCwgIlwiJXNcIiIsIFBBUk1fRVhDTFVERV9VTkVOQ1JZUFRFRCApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcsICJcIiVzXCIiLCBQQVJNX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9JTlRSQV9CU1NfUkVMQVksICJcIiVzXCIiLCBQQVJNX0lOVFJBX0JTU19SRUxBWSApOworI2lmZGVmIFVTRV9XRFMKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMSwgIiVkIiwgUEFSTV9SVFNfVEhSRVNIT0xEMSApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQyLCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQyICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDMsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDMgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENCwgIiVkIiwgUEFSTV9SVFNfVEhSRVNIT0xENCApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ1LCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQ1ICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDYsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDYgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9SQVRFMSwgIiVkIiwgUEFSTV9UWF9SQVRFMSApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEUyLCAiJWQiLCBQQVJNX1RYX1JBVEUyICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTMsICIlZCIsIFBBUk1fVFhfUkFURTMgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9SQVRFNCwgIiVkIiwgUEFSTV9UWF9SQVRFNCApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEU1LCAiJWQiLCBQQVJNX1RYX1JBVEU1ICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTYsICIlZCIsIFBBUk1fVFhfUkFURTYgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9XRFNfQUREUkVTUzEsICJcIiVzXCIiLCBEYmdId0FkZHIoIFBBUk1fV0RTX0FERFJFU1MxICkpOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1dEU19BRERSRVNTMiwgIlwiJXNcIiIsIERiZ0h3QWRkciggUEFSTV9XRFNfQUREUkVTUzIgKSk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfV0RTX0FERFJFU1MzLCAiXCIlc1wiIiwgRGJnSHdBZGRyKCBQQVJNX1dEU19BRERSRVNTMyApKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9XRFNfQUREUkVTUzQsICJcIiVzXCIiLCBEYmdId0FkZHIoIFBBUk1fV0RTX0FERFJFU1M0ICkpOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1dEU19BRERSRVNTNSwgIlwiJXNcIiIsIERiZ0h3QWRkciggUEFSTV9XRFNfQUREUkVTUzUgKSk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfV0RTX0FERFJFU1M2LCAiXCIlc1wiIiwgRGJnSHdBZGRyKCBQQVJNX1dEU19BRERSRVNTNiApKTsKKyNlbmRpZiAvKiBVU0VfV0RTICovCisjZW5kaWYgLyogSENGX0FQICovCisKKwlWQUxJRF9QQVJBTSggIVBBUk1fREVTSVJFRF9TU0lEIHx8ICggc3RybGVuKCBQQVJNX0RFU0lSRURfU1NJRCApIDw9IFBBUk1fTUFYX05BTUVfTEVOICkpOworCVZBTElEX1BBUkFNKCAhUEFSTV9PV05fU1NJRCB8fCAoIHN0cmxlbiggUEFSTV9PV05fU1NJRCApIDw9IFBBUk1fTUFYX05BTUVfTEVOICkpOworCVZBTElEX1BBUkFNKCggUEFSTV9PV05fQ0hBTk5FTCA8PSBQQVJNX01BWF9PV05fQ0hBTk5FTCApKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fU1lTVEVNX1NDQUxFID49IFBBUk1fTUlOX1NZU1RFTV9TQ0FMRSApICYmICggUEFSTV9TWVNURU1fU0NBTEUgPD0gUEFSTV9NQVhfU1lTVEVNX1NDQUxFICkpOworCVZBTElEX1BBUkFNKCggUEFSTV9UWF9SQVRFID49IFBBUk1fTUlOX1RYX1JBVEUgKSAmJiAoIFBBUk1fVFhfUkFURSA8PSBQQVJNX01BWF9UWF9SQVRFICkpOworCVZBTElEX1BBUkFNKCggUEFSTV9SVFNfVEhSRVNIT0xEIDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQgKSk7CisJVkFMSURfUEFSQU0oICFQQVJNX01JQ1JPV0FWRV9ST0JVU1RORVNTIHx8IHN0cmNociggIk5uWXkiLCBQQVJNX01JQ1JPV0FWRV9ST0JVU1RORVNTWzBdICkgIT0gTlVMTCApOworCVZBTElEX1BBUkFNKCAhUEFSTV9PV05fTkFNRSB8fCAoIHN0cmxlbiggUEFSTV9OQU1FX09XTl9OQU1FICkgPD0gUEFSTV9NQVhfTkFNRV9MRU4gKSk7CisJVkFMSURfUEFSQU0oKCBQQVJNX0VOQUJMRV9FTkNSWVBUSU9OIDw9IFBBUk1fTUFYX0VOQUJMRV9FTkNSWVBUSU9OICkpOworCVZBTElEX1BBUkFNKCBpc192YWxpZF9rZXlfc3RyaW5nKCBQQVJNX0tFWTEgKSk7CisJVkFMSURfUEFSQU0oIGlzX3ZhbGlkX2tleV9zdHJpbmcoIFBBUk1fS0VZMiApKTsKKwlWQUxJRF9QQVJBTSggaXNfdmFsaWRfa2V5X3N0cmluZyggUEFSTV9LRVkzICkpOworCVZBTElEX1BBUkFNKCBpc192YWxpZF9rZXlfc3RyaW5nKCBQQVJNX0tFWTQgKSk7CisJVkFMSURfUEFSQU0oKCBQQVJNX1RYX0tFWSA+PSBQQVJNX01JTl9UWF9LRVkgKSAmJiAoIFBBUk1fVFhfS0VZIDw9IFBBUk1fTUFYX1RYX0tFWSApKTsKKworCVZBTElEX1BBUkFNKCggUEFSTV9NVUxUSUNBU1RfUkFURSA+PSBQQVJNX01JTl9NVUxUSUNBU1RfUkFURSApICYmCisJCQkJCSggUEFSTV9NVUxUSUNBU1RfUkFURSA8PSBQQVJNX01BWF9NVUxUSUNBU1RfUkFURSApKTsKKworCVZBTElEX1BBUkFNKCAhUEFSTV9ET1dOTE9BRF9GSVJNV0FSRSB8fCAoIHN0cmxlbiggUEFSTV9ET1dOTE9BRF9GSVJNV0FSRSApIDw9IDI1NSAvKjs/Ki8gKSk7CisJVkFMSURfUEFSQU0oKCBQQVJNX0FVVEhfS0VZX01HTVRfU1VJVEUgPCBQQVJNX01BWF9BVVRIX0tFWV9NR01UX1NVSVRFICkpOworCisJVkFMSURfUEFSQU0oICFQQVJNX0xPQURfQkFMQU5DSU5HIHx8IHN0cmNociggIk5uWXkiLCBQQVJNX0xPQURfQkFMQU5DSU5HWzBdICkgIT0gTlVMTCApOworCVZBTElEX1BBUkFNKCAhUEFSTV9NRURJVU1fRElTVFJJQlVUSU9OIHx8IHN0cmNociggIk5uWXkiLCBQQVJNX01FRElVTV9ESVNUUklCVVRJT05bMF0gKSAhPSBOVUxMICk7CisJVkFMSURfUEFSQU0oKCBQQVJNX1RYX1BPV19MRVZFTCA8PSBQQVJNX01BWF9UWF9QT1dfTEVWRUwgKSk7CisKKyAJVkFMSURfUEFSQU0oKCBQQVJNX1BPUlRfVFlQRSA+PSBQQVJNX01JTl9QT1JUX1RZUEUgKSAmJiAoIFBBUk1fUE9SVF9UWVBFIDw9IFBBUk1fTUFYX1BPUlRfVFlQRSApKTsKKwlWQUxJRF9QQVJBTSggUEFSTV9QTV9FTkFCTEVEIDw9IFdWTEFOX1BNX1NUQVRFX1NUQU5EQVJEIHx8CisJCQkJICggUEFSTV9QTV9FTkFCTEVEICYgMHg3RkZGICkgPD0gV1ZMQU5fUE1fU1RBVEVfU1RBTkRBUkQgKTsKKyAJVkFMSURfUEFSQU0oICFQQVJNX0NSRUFURV9JQlNTIHx8IHN0cmNociggIk5uWXkiLCBQQVJNX0NSRUFURV9JQlNTWzBdICkgIT0gTlVMTCApOworIAlWQUxJRF9QQVJBTSggIVBBUk1fTVVMVElDQVNUX1JYIHx8IHN0cmNociggIk5uWXkiLCBQQVJNX01VTFRJQ0FTVF9SWFswXSApICE9IE5VTEwgKTsKKyAJVkFMSURfUEFSQU0oKCBQQVJNX01BWF9TTEVFUCA8PSBQQVJNX01BWF9NQVhfUE1fU0xFRVAgKSk7CisgCVZBTElEX1BBUkFNKCggUEFSTV9BVVRIRU5USUNBVElPTiA8PSBQQVJNX01BWF9BVVRIRU5USUNBVElPTiApKTsKKyAJVkFMSURfUEFSQU0oKCBQQVJNX09XTl9BVElNX1dJTkRPVyA8PSBQQVJNX01BWF9PV05fQVRJTV9XSU5ET1cgKSk7CisgCVZBTElEX1BBUkFNKCggUEFSTV9QTV9IT0xET1ZFUl9EVVJBVElPTiA8PSBQQVJNX01BWF9QTV9IT0xET1ZFUl9EVVJBVElPTiApKTsKKyAJVkFMSURfUEFSQU0oICFQQVJNX1BST01JU0NVT1VTX01PREUgfHwgc3RyY2hyKCAiTm5ZeSIsIFBBUk1fUFJPTUlTQ1VPVVNfTU9ERVswXSApICE9IE5VTEwgKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fQ09OTkVDVElPTl9DT05UUk9MIDw9IFBBUk1fTUFYX0NPTk5FQ1RJT05fQ09OVFJPTCApKTsKKworCVZBTElEX1BBUkFNKCggUEFSTV9PV05fRFRJTV9QRVJJT0QgPj0gUEFSTV9NSU5fT1dOX0RUSU1fUEVSSU9EICkpOworCVZBTElEX1BBUkFNKCAhUEFSTV9SRUpFQ1RfQU5ZIHx8IHN0cmNociggIk5uWXkiLCBQQVJNX1JFSkVDVF9BTllbMF0gKSAhPSBOVUxMICk7CisJVkFMSURfUEFSQU0oICFQQVJNX0VYQ0xVREVfVU5FTkNSWVBURUQgfHwgc3RyY2hyKCAiTm5ZeSIsIFBBUk1fRVhDTFVERV9VTkVOQ1JZUFRFRFswXSApICE9IE5VTEwgKTsKKwlWQUxJRF9QQVJBTSggIVBBUk1fTVVMVElDQVNUX1BNX0JVRkZFUklORyB8fCBzdHJjaHIoICJObll5IiwgUEFSTV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HWzBdICkgIT0gTlVMTCApOworCVZBTElEX1BBUkFNKCAhUEFSTV9JTlRSQV9CU1NfUkVMQVkgfHwgc3RyY2hyKCAiTm5ZeSIsIFBBUk1fSU5UUkFfQlNTX1JFTEFZWzBdICkgIT0gTlVMTCApOworI2lmZGVmIFVTRV9XRFMKKwlWQUxJRF9QQVJBTSgoIFBBUk1fUlRTX1RIUkVTSE9MRDEgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fUlRTX1RIUkVTSE9MRDIgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fUlRTX1RIUkVTSE9MRDMgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fUlRTX1RIUkVTSE9MRDQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fUlRTX1RIUkVTSE9MRDUgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fUlRTX1RIUkVTSE9MRDYgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fVFhfUkFURTEgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmIChQQVJNX1RYX1JBVEUxIDw9IFBBUk1fTUFYX1RYX1JBVEUgKSk7CisJVkFMSURfUEFSQU0oKCBQQVJNX1RYX1JBVEUyID49IFBBUk1fTUlOX1RYX1JBVEUgKSAmJiAoUEFSTV9UWF9SQVRFMiA8PSBQQVJNX01BWF9UWF9SQVRFICkpOworCVZBTElEX1BBUkFNKCggUEFSTV9UWF9SQVRFMyA+PSBQQVJNX01JTl9UWF9SQVRFICkgJiYgKFBBUk1fVFhfUkFURTMgPD0gUEFSTV9NQVhfVFhfUkFURSApKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fVFhfUkFURTQgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmIChQQVJNX1RYX1JBVEU0IDw9IFBBUk1fTUFYX1RYX1JBVEUgKSk7CisJVkFMSURfUEFSQU0oKCBQQVJNX1RYX1JBVEU1ID49IFBBUk1fTUlOX1RYX1JBVEUgKSAmJiAoUEFSTV9UWF9SQVRFNSA8PSBQQVJNX01BWF9UWF9SQVRFICkpOworCVZBTElEX1BBUkFNKCggUEFSTV9UWF9SQVRFNiA+PSBQQVJNX01JTl9UWF9SQVRFICkgJiYgKFBBUk1fVFhfUkFURTYgPD0gUEFSTV9NQVhfVFhfUkFURSApKTsKKyNlbmRpZiAvKiBVU0VfV0RTICovCisKKwlWQUxJRF9QQVJBTSgoIFBBUk1fT1dOX0JFQUNPTl9JTlRFUlZBTCA+PSBQQVJNX01JTl9PV05fQkVBQ09OX0lOVEVSVkFMICkgJiYgKCBQQVJNX09XTl9CRUFDT05fSU5URVJWQUwgPD0gUEFSTV9NQVhfT1dOX0JFQUNPTl9JTlRFUlZBTCApKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fQ09FWElTVEVOQ0UgPD0gUEFSTV9DT0VYSVNURU5DRSApKTsKKworCS8qIFNldCB0aGUgZHJpdmVyIHBhcmFtZXRlcnMgZnJvbSB0aGUgcGFzc2VkIGluIHBhcmFtZXRlcnMuICovCisKKwkvKiBUSEVTRSBNT0RVTEUgUEFSQU1FVEVSUyBBUkUgVE8gQkUgREVQUkVDQVRFRCBJTiBGQVZPUiBPRiBBIE5BTUlORyBDT05WRU5USU9OCisJICAgV0hJQ0ggSVMgSU5MSU5FIFdJVEggVEhFIEZPUlRIQ09NSU5HIFdBVkVMQU4gQVBJICovCisKKwkvKiBTVEFSVCBORVcgUEFSQU1FVEVSUyAqLworCisJbHAtPkNoYW5uZWwgICAgICAgICAgICAgPSBQQVJNX09XTl9DSEFOTkVMOworCWxwLT5EaXN0YW5jZUJldHdlZW5BUHMgID0gUEFSTV9TWVNURU1fU0NBTEU7CisKKwkvKiBOZWVkIHRvIGRldGVybWluZSBob3cgdG8gaGFuZGxlIHRoZSBuZXcgYmFuZHMgZm9yIDVHSHogKi8KKwlscC0+VHhSYXRlQ29udHJvbFswXSAgICA9IFBBUk1fREVGQVVMVF9UWF9SQVRFXzJHSFo7CisJbHAtPlR4UmF0ZUNvbnRyb2xbMV0gICAgPSBQQVJNX0RFRkFVTFRfVFhfUkFURV81R0haOworCisJbHAtPlJUU1RocmVzaG9sZCAgICAgICAgPSBQQVJNX1JUU19USFJFU0hPTEQ7CisKKwkvKiBOZWVkIHRvIGRldGVybWluZSBob3cgdG8gaGFuZGxlIHRoZSBuZXcgYmFuZHMgZm9yIDVHSHogKi8KKwlscC0+TXVsdGljYXN0UmF0ZVswXSAgICA9IFBBUk1fREVGQVVMVF9NVUxUSUNBU1RfUkFURV8yR0haOworCWxwLT5NdWx0aWNhc3RSYXRlWzFdICAgID0gUEFSTV9ERUZBVUxUX01VTFRJQ0FTVF9SQVRFXzVHSFo7CisKKwlpZiAoIHN0cmNociggIll5IiwgUEFSTV9NSUNST1dBVkVfUk9CVVNUTkVTU1swXSApICE9IE5VTEwgKSB7CisJCWxwLT5NaWNyb3dhdmVSb2J1c3RuZXNzID0gMTsKKwl9IGVsc2UgeworCQlscC0+TWljcm93YXZlUm9idXN0bmVzcyA9IDA7CisJfQorCWlmICggUEFSTV9ERVNJUkVEX1NTSUQgJiYgKCBzdHJsZW4oIFBBUk1fREVTSVJFRF9TU0lEICkgPD0gSENGX01BWF9OQU1FX0xFTiApKSB7CisJCXN0cmNweSggbHAtPk5ldHdvcmtOYW1lLCBQQVJNX0RFU0lSRURfU1NJRCApOworCX0KKwlpZiAoIFBBUk1fT1dOX1NTSUQgJiYgKCBzdHJsZW4oIFBBUk1fT1dOX1NTSUQgKSA8PSBIQ0ZfTUFYX05BTUVfTEVOICkpIHsKKwkJc3RyY3B5KCBscC0+TmV0d29ya05hbWUsIFBBUk1fT1dOX1NTSUQgKTsKKwl9CisJaWYgKCBQQVJNX09XTl9OQU1FICYmICggc3RybGVuKCBQQVJNX09XTl9OQU1FICkgPD0gSENGX01BWF9OQU1FX0xFTiApKSB7CisJCXN0cmNweSggbHAtPlN0YXRpb25OYW1lLCBQQVJNX09XTl9OQU1FICk7CisJfQorCWxwLT5FbmFibGVFbmNyeXB0aW9uID0gUEFSTV9FTkFCTEVfRU5DUllQVElPTjsKKwlpZiAoIFBBUk1fS0VZMSAmJiAoIHN0cmxlbiggUEFSTV9LRVkxICkgPD0gTUFYX0tFWV9MRU4gKSkgeworCQlzdHJjcHkoIGxwLT5LZXkxLCBQQVJNX0tFWTEgKTsKKwl9CisJaWYgKCBQQVJNX0tFWTIgJiYgKCBzdHJsZW4oIFBBUk1fS0VZMiApIDw9IE1BWF9LRVlfTEVOICkpIHsKKwkJc3RyY3B5KCBscC0+S2V5MiwgUEFSTV9LRVkyICk7CisJfQorCWlmICggUEFSTV9LRVkzICYmICggc3RybGVuKCBQQVJNX0tFWTMgKSA8PSBNQVhfS0VZX0xFTiApKSB7CisJCXN0cmNweSggbHAtPktleTMsIFBBUk1fS0VZMyApOworCX0KKwlpZiAoIFBBUk1fS0VZNCAmJiAoIHN0cmxlbiggUEFSTV9LRVk0ICkgPD0gTUFYX0tFWV9MRU4gKSkgeworCQlzdHJjcHkoIGxwLT5LZXk0LCBQQVJNX0tFWTQgKTsKKwl9CisKKwlscC0+VHJhbnNtaXRLZXlJRCA9IFBBUk1fVFhfS0VZOworCisJa2V5X3N0cmluZzJrZXkoIGxwLT5LZXkxLCAmKGxwLT5EZWZhdWx0S2V5cy5rZXlbMF0gKSk7CisJa2V5X3N0cmluZzJrZXkoIGxwLT5LZXkyLCAmKGxwLT5EZWZhdWx0S2V5cy5rZXlbMV0gKSk7CisJa2V5X3N0cmluZzJrZXkoIGxwLT5LZXkzLCAmKGxwLT5EZWZhdWx0S2V5cy5rZXlbMl0gKSk7CisJa2V5X3N0cmluZzJrZXkoIGxwLT5LZXk0LCAmKGxwLT5EZWZhdWx0S2V5cy5rZXlbM10gKSk7CisKKwlscC0+RG93bmxvYWRGaXJtd2FyZSA9IDEgOyAvLzs/dG8gYmUgdXBncmFkZWQgUEFSTV9ET1dOTE9BRF9GSVJNV0FSRTsKKwlscC0+QXV0aEtleU1nbXRTdWl0ZSA9IFBBUk1fQVVUSF9LRVlfTUdNVF9TVUlURTsKKworCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX0xPQURfQkFMQU5DSU5HWzBdICkgIT0gTlVMTCApIHsKKwkJbHAtPmxvYWRCYWxhbmNpbmcgPSAxOworCX0gZWxzZSB7CisJCWxwLT5sb2FkQmFsYW5jaW5nID0gMDsKKwl9CisKKwlpZiAoIHN0cmNociggIll5IiwgUEFSTV9NRURJVU1fRElTVFJJQlVUSU9OWzBdICkgIT0gTlVMTCApIHsKKwkJbHAtPm1lZGl1bURpc3RyaWJ1dGlvbiA9IDE7CisJfSBlbHNlIHsKKwkJbHAtPm1lZGl1bURpc3RyaWJ1dGlvbiA9IDA7CisJfQorCisJbHAtPnR4UG93TGV2ZWwgPSBQQVJNX1RYX1BPV19MRVZFTDsKKworCWxwLT5zcnNjWzBdID0gUEFSTV9TUlNDXzJHSFo7CisJbHAtPnNyc2NbMV0gPSBQQVJNX1NSU0NfNUdIWjsKKwlscC0+YnJzY1swXSA9IFBBUk1fQlJTQ18yR0haOworCWxwLT5icnNjWzFdID0gUEFSTV9CUlNDXzVHSFo7CisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEKKy8vOz9zZWVtcyByZWFzb25hYmxlIHRoYXQgZXZlbiBhbiBBUC1vbmx5IGRyaXZlciBjb3VsZCBhZmZvcmQgdGhpcyBzbWFsbCBhZGRpdGlvbmFsIGZvb3RwcmludAorCWxwLT5Qb3J0VHlwZSAgICAgICAgICAgID0gUEFSTV9QT1JUX1RZUEU7CisJbHAtPk1heFNsZWVwRHVyYXRpb24gICAgPSBQQVJNX01BWF9TTEVFUDsKKwlscC0+YXV0aGVudGljYXRpb24gICAgICA9IFBBUk1fQVVUSEVOVElDQVRJT047CisJbHAtPmF0aW1XaW5kb3cgICAgICAgICAgPSBQQVJNX09XTl9BVElNX1dJTkRPVzsKKwlscC0+aG9sZG92ZXJEdXJhdGlvbiAgICA9IFBBUk1fUE1fSE9MRE9WRVJfRFVSQVRJT047CisJbHAtPlBNRW5hYmxlZCAgICAgICAgICAgPSBQQVJNX1BNX0VOQUJMRUQ7ICAvLzs/CisJaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fQ1JFQVRFX0lCU1NbMF0gKSAhPSBOVUxMICkgeworCQlscC0+Q3JlYXRlSUJTUyA9IDE7CisJfSBlbHNlIHsKKwkJbHAtPkNyZWF0ZUlCU1MgPSAwOworCX0KKwlpZiAoIHN0cmNociggIk5uIiwgUEFSTV9NVUxUSUNBU1RfUlhbMF0gKSAhPSBOVUxMICkgeworCQlscC0+TXVsdGljYXN0UmVjZWl2ZSA9IDA7CisJfSBlbHNlIHsKKwkJbHAtPk11bHRpY2FzdFJlY2VpdmUgPSAxOworCX0KKwlpZiAoIHN0cmNociggIll5IiwgUEFSTV9QUk9NSVNDVU9VU19NT0RFWzBdICkgIT0gTlVMTCApIHsKKwkJbHAtPnByb21pc2N1b3VzTW9kZSA9IDE7CisJfSBlbHNlIHsKKwkJbHAtPnByb21pc2N1b3VzTW9kZSA9IDA7CisJfQorCWZvciggaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrICkgeworCSAgIGxwLT5NQUNBZGRyZXNzW2ldID0gUEFSTV9ORVRXT1JLX0FERFJbaV07CisJfQorCisJbHAtPmNvbm5lY3Rpb25Db250cm9sID0gUEFSTV9DT05ORUNUSU9OX0NPTlRST0w7CisKKyNlbmRpZiAvKiBIQ0ZfU1RBICovCisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAorCWxwLT5EVElNUGVyaW9kID0gUEFSTV9PV05fRFRJTV9QRVJJT0Q7CisKKwlpZiAoIHN0cmNociggIll5IiwgUEFSTV9SRUpFQ1RfQU5ZWzBdICkgIT0gTlVMTCApIHsKKwkJbHAtPlJlamVjdEFueSA9IDE7CisJfSBlbHNlIHsKKwkJbHAtPlJlamVjdEFueSA9IDA7CisJfQorCWlmICggc3RyY2hyKCAiTm4iLCBQQVJNX0VYQ0xVREVfVU5FTkNSWVBURURbMF0gKSAhPSBOVUxMICkgeworCQlscC0+RXhjbHVkZVVuZW5jcnlwdGVkID0gMDsKKwl9IGVsc2UgeworCQlscC0+RXhjbHVkZVVuZW5jcnlwdGVkID0gMTsKKwl9CisJaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fTVVMVElDQVNUX1BNX0JVRkZFUklOR1swXSApICE9IE5VTEwgKSB7CisJCWxwLT5tdWx0aWNhc3RQTUJ1ZmZlcmluZyA9IDE7CisJfSBlbHNlIHsKKwkJbHAtPm11bHRpY2FzdFBNQnVmZmVyaW5nID0gMDsKKwl9CisJaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fSU5UUkFfQlNTX1JFTEFZWzBdICkgIT0gTlVMTCApIHsKKwkJbHAtPmludHJhQlNTUmVsYXkgPSAxOworCX0gZWxzZSB7CisJCWxwLT5pbnRyYUJTU1JlbGF5ID0gMDsKKwl9CisKKwlscC0+b3duQmVhY29uSW50ZXJ2YWwgPSBQQVJNX09XTl9CRUFDT05fSU5URVJWQUw7CisJbHAtPmNvZXhpc3RlbmNlICAgICAgID0gUEFSTV9DT0VYSVNURU5DRTsKKworI2lmZGVmIFVTRV9XRFMKKwlscC0+d2RzX3BvcnRbMF0ucnRzVGhyZXNob2xkICAgID0gUEFSTV9SVFNfVEhSRVNIT0xEMTsKKwlscC0+d2RzX3BvcnRbMV0ucnRzVGhyZXNob2xkICAgID0gUEFSTV9SVFNfVEhSRVNIT0xEMjsKKwlscC0+d2RzX3BvcnRbMl0ucnRzVGhyZXNob2xkICAgID0gUEFSTV9SVFNfVEhSRVNIT0xEMzsKKwlscC0+d2RzX3BvcnRbM10ucnRzVGhyZXNob2xkICAgID0gUEFSTV9SVFNfVEhSRVNIT0xENDsKKwlscC0+d2RzX3BvcnRbNF0ucnRzVGhyZXNob2xkICAgID0gUEFSTV9SVFNfVEhSRVNIT0xENTsKKwlscC0+d2RzX3BvcnRbNV0ucnRzVGhyZXNob2xkICAgID0gUEFSTV9SVFNfVEhSRVNIT0xENjsKKwlscC0+d2RzX3BvcnRbMF0udHhSYXRlQ250bCAgICAgID0gUEFSTV9UWF9SQVRFMTsKKwlscC0+d2RzX3BvcnRbMV0udHhSYXRlQ250bCAgICAgID0gUEFSTV9UWF9SQVRFMjsKKwlscC0+d2RzX3BvcnRbMl0udHhSYXRlQ250bCAgICAgID0gUEFSTV9UWF9SQVRFMzsKKwlscC0+d2RzX3BvcnRbM10udHhSYXRlQ250bCAgICAgID0gUEFSTV9UWF9SQVRFNDsKKwlscC0+d2RzX3BvcnRbNF0udHhSYXRlQ250bCAgICAgID0gUEFSTV9UWF9SQVRFNTsKKwlscC0+d2RzX3BvcnRbNV0udHhSYXRlQ250bCAgICAgID0gUEFSTV9UWF9SQVRFNjsKKworCWZvciggaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrICkgeworCQlscC0+d2RzX3BvcnRbMF0ud2RzQWRkcmVzc1tpXSA9IFBBUk1fV0RTX0FERFJFU1MxW2ldOworCX0KKwlmb3IoIGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKyApIHsKKwkJbHAtPndkc19wb3J0WzFdLndkc0FkZHJlc3NbaV0gPSBQQVJNX1dEU19BRERSRVNTMltpXTsKKwl9CisJZm9yKCBpID0gMDsgaSA8IEVUSF9BTEVOOyBpKysgKSB7CisJCWxwLT53ZHNfcG9ydFsyXS53ZHNBZGRyZXNzW2ldID0gUEFSTV9XRFNfQUREUkVTUzNbaV07CisJfQorCWZvciggaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrICkgeworCQlscC0+d2RzX3BvcnRbM10ud2RzQWRkcmVzc1tpXSA9IFBBUk1fV0RTX0FERFJFU1M0W2ldOworCX0KKwlmb3IoIGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKyApIHsKKwkJbHAtPndkc19wb3J0WzRdLndkc0FkZHJlc3NbaV0gPSBQQVJNX1dEU19BRERSRVNTNVtpXTsKKwl9CisJZm9yKCBpID0gMDsgaSA8IEVUSF9BTEVOOyBpKysgKSB7CisJCWxwLT53ZHNfcG9ydFs1XS53ZHNBZGRyZXNzW2ldID0gUEFSTV9XRFNfQUREUkVTUzZbaV07CisJfQorI2VuZGlmICAvKiBVU0VfV0RTICovCisjZW5kaWYgIC8qIEhDRl9BUCAqLworI2lmZGVmIFVTRV9SVFMKKwlpZiAoIHN0cmNociggIll5IiwgdXNlUlRTWzBdICkgIT0gTlVMTCApIHsKKwkJbHAtPnVzZVJUUyA9IDE7CisJfSBlbHNlIHsKKwkJbHAtPnVzZVJUUyA9IDA7CisJfQorI2VuZGlmICAvKiBVU0VfUlRTICovCisKKworCS8qIEVORCBORVcgUEFSQU1FVEVSUyAqLworCisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBwb3J0U3RhdGUgdmFyaWFibGUgKi8KKwlscC0+cG9ydFN0YXRlID0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRDsKKworCS8qIEluaXRpYWxpemUgdGhlIFNjYW5SZXN1bHQgc3RydWN0ICovCisJbWVtc2V0KCAmKCBscC0+c2Nhbl9yZXN1bHRzICksIDAsIHNpemVvZiggbHAtPnNjYW5fcmVzdWx0cyApKTsKKwlscC0+c2Nhbl9yZXN1bHRzLnNjYW5fY29tcGxldGUgPSBGQUxTRTsKKworCS8qIEluaXRpYWxpemUgdGhlIFByb2JlUmVzdWx0IHN0cnVjdCAqLworCW1lbXNldCggJiggbHAtPnByb2JlX3Jlc3VsdHMgKSwgMCwgc2l6ZW9mKCBscC0+cHJvYmVfcmVzdWx0cyApKTsKKwlscC0+cHJvYmVfcmVzdWx0cy5zY2FuX2NvbXBsZXRlID0gRkFMU0U7CisJbHAtPnByb2JlX251bV9hcHMgPSAwOworCisKKwkvKiBJbml0aWFsaXplIFR4IHF1ZXVlIHN0dWZmICovCisJbWVtc2V0KCBscC0+dHhMaXN0LCAwLCBzaXplb2YoIGxwLT50eExpc3QgKSk7CisKKwlJTklUX0xJU1RfSEVBRCggJiggbHAtPnR4RnJlZSApKTsKKworCWxwLT50eEYuc2tiICA9IE5VTEw7CisJbHAtPnR4Ri5wb3J0ID0gMDsKKworCisJZm9yKCBpID0gMDsgaSA8IERFRkFVTFRfTlVNX1RYX0ZSQU1FUzsgaSsrICkgeworCQlsaXN0X2FkZF90YWlsKCAmKCBscC0+dHhMaXN0W2ldLm5vZGUgKSwgJiggbHAtPnR4RnJlZSApKTsKKwl9CisKKworCWZvciggaSA9IDA7IGkgPCBXVkxBTl9NQVhfVFhfUVVFVUVTOyBpKysgKSB7CisJCUlOSVRfTElTVF9IRUFEKCAmKCBscC0+dHhRW2ldICkpOworCX0KKworCWxwLT5uZXRpZl9xdWV1ZV9vbiA9IFRSVUU7CisJbHAtPnR4UV9jb3VudCA9IDA7CisJLyogSW5pdGlhbGl6ZSB0aGUgdXNlX2RtYSBlbGVtZW50IGluIHRoZSBhZGFwdGVyIHN0cnVjdHVyZS4gTm90IHN1cmUgaWYKKwkgICB0aGlzIHNob3VsZCBiZSBhIGNvbXBpbGUtdGltZSBvciBydW4tdGltZSBjb25maWd1cmFibGUuIFNvIGZvciBub3csCisJICAgaW1wbGVtZW50IGFzIHJ1bi10aW1lIGFuZCBqdXN0IGRlZmluZSBoZXJlICovCisjaWZkZWYgV0FSUAorI2lmZGVmIEVOQUJMRV9ETUEKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJIRVJNRVMgMi41IEJVU01BU1RFUiBETUEgTU9ERVxuIiApOworCWxwLT51c2VfZG1hID0gMTsKKyNlbHNlCisJREJHX1RSQUNFKCBEYmdJbmZvLCAiSEVSTUVTIDIuNSBQT1JUIEkvTyBNT0RFXG4iICk7CisJbHAtPnVzZV9kbWEgPSAwOworI2VuZGlmIC8vIEVOQUJMRV9ETUEKKyNlbmRpZiAvLyBXQVJQCisKKwkvKiBSZWdpc3RlciB0aGUgSVNSIGhhbmRsZXIgaW5mb3JtYXRpb24gaGVyZSwgc28gdGhhdCBpdCdzIG5vdCBkb25lCisJICAgcmVwZWF0ZWRseSBpbiB0aGUgSVNSICovCisgICAgICAgIHRhc2tsZXRfaW5pdCgmbHAtPnRhc2ssIHdsX2lzcl9oYW5kbGVyLCAodW5zaWduZWQgbG9uZylscCk7CisKKyAgICAgICAgLyogQ29ubmVjdCB0byB0aGUgYWRhcHRlciAqLworICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJDYWxsaW5nIGhjZl9jb25uZWN0KCkuLi5cbiIgKTsKKyAgICAgICAgaGNmX3N0YXR1cyA9IGhjZl9jb25uZWN0KCAmbHAtPmhjZkN0eCwgZGV2LT5iYXNlX2FkZHIgKTsKKwkvL0hDRl9FUlJfSU5DT01QX0ZXIGlzIGFjY2VwdGFibGUsIGJlY2F1c2UgZG93bmxvYWQgbXVzdCBzdGlsbCB0YWtlIHBsYWNlCisJLy9IQ0ZfRVJSX0lOQ09NUF9QUkkgaXMgbm90IGFjY2VwdGFibGUKKwlpZiAoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgJiYgaGNmX3N0YXR1cyAhPSBIQ0ZfRVJSX0lOQ09NUF9GVyApIHsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAiaGNmX2Nvbm5lY3QoKSBmYWlsZWQsIHN0YXR1czogMHgleFxuIiwgaGNmX3N0YXR1cyApOworCQl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKwkJZ290byBoY2ZfZmFpbGVkOworCX0KKworCS8vOz9zaG91bGQgc2V0IEhDRl92ZXJzaW9uIGFuZCBob3cgYWJvdXQgZHJpdmVyX3N0YXQKKwlscC0+ZHJpdmVySW5mby5JT19hZGRyZXNzICAgICAgID0gZGV2LT5iYXNlX2FkZHI7CisJbHAtPmRyaXZlckluZm8uSU9fcmFuZ2UgICAgICAgICA9IEhDRl9OVU1fSU9fUE9SVFM7CS8vOz9jb25kaXRpb25hbGx5IDB4NDAgb3IgMHg4MCBzZWVtcyBiZXR0ZXIKKwlscC0+ZHJpdmVySW5mby5JUlFfbnVtYmVyICAgICAgID0gZGV2LT5pcnE7CisJbHAtPmRyaXZlckluZm8uY2FyZF9zdGF0ICAgICAgICA9IGxwLT5oY2ZDdHguSUZCX0NhcmRTdGF0OworCS8vOz8gd2hhdCBoYXBwZW5lZCB0byBmcmFtZV90eXBlCisKKwkvKiBGaWxsIGluIHRoZSBkcml2ZXIgaWRlbnRpdHkgc3RydWN0dXJlICovCisJbHAtPmRyaXZlcklkZW50aXR5LmxlbiAgICAgICAgICAgICAgPSAoIHNpemVvZiggbHAtPmRyaXZlcklkZW50aXR5ICkgLyBzaXplb2YoIGhjZl8xNiApKSAtIDE7CisJbHAtPmRyaXZlcklkZW50aXR5LnR5cCAgICAgICAgICAgICAgPSBDRkdfRFJWX0lERU5USVRZOworCWxwLT5kcml2ZXJJZGVudGl0eS5jb21wX2lkICAgICAgICAgID0gRFJWX0lERU5USVRZOworCWxwLT5kcml2ZXJJZGVudGl0eS52YXJpYW50ICAgICAgICAgID0gRFJWX1ZBUklBTlQ7CisJbHAtPmRyaXZlcklkZW50aXR5LnZlcnNpb25fbWFqb3IgICAgPSBEUlZfTUFKT1JfVkVSU0lPTjsKKwlscC0+ZHJpdmVySWRlbnRpdHkudmVyc2lvbl9taW5vciAgICA9IERSVl9NSU5PUl9WRVJTSU9OOworCisKKwkvKiBTdGFydCB0aGUgY2FyZCBoZXJlIC0gVGhpcyBuZWVkcyB0byBiZSBkb25lIGluIG9yZGVyIHRvIGdldCB0aGUKKwkgICBNQUMgYWRkcmVzcyBmb3IgdGhlIG5ldHdvcmsgbGF5ZXIgKi8KKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJDYWxsaW5nIHd2bGFuX2dvKCkgdG8gcGVyZm9ybSBhIGNhcmQgcmVzZXQuLi5cbiIgKTsKKwloY2Zfc3RhdHVzID0gd2xfZ28oIGxwICk7CisKKwlpZiAoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CisJCURCR19FUlJPUiggRGJnSW5mbywgIndsX2dvKCkgZmFpbGVkXG4iICk7CisJCXdsX3VubG9jayggbHAsICZmbGFncyApOworCQlnb3RvIGhjZl9mYWlsZWQ7CisJfQorCisJLyogQ2VydGFpbiBSSURzIG11c3QgYmUgc2V0IGJlZm9yZSBlbmFibGluZyB0aGUgcG9ydHMgKi8KKwl3bF9wdXRfbHR2X2luaXQoIGxwICk7CisKKyNpZiAwIC8vOz93aHkgd2FzIHRoaXMgYWxyZWFkeSBjb21tZW50ZWQgb3V0IGluIHdsX2xrbV83MjAKKwkvKiBFbmFibGUgdGhlIHBvcnRzICovCisJaWYgKCB3bF9hZGFwdGVyX2lzX29wZW4oIGxwLT5kZXYgKSkgeworCQkvKiBFbmFibGUgdGhlIHBvcnRzICovCisJCURCR19UUkFDRSggRGJnSW5mbywgIkVuYWJsaW5nIFBvcnQgMFxuIiApOworCQloY2Zfc3RhdHVzID0gd2xfZW5hYmxlKCBscCApOworCisJCWlmICggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIkVuYWJsZSBwb3J0IDAgZmFpbGVkOiAweCV4XG4iLCBoY2Zfc3RhdHVzICk7CisJCX0KKworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJFbmFibGluZyBXRFMgUG9ydHNcbiIgKTsKKwkJLy93bF9lbmFibGVfd2RzX3BvcnRzKCBscCApOworI2VuZGlmICAvKiAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAgKi8KKworCX0KKyNlbmRpZgorCisJLyogRmlsbCBvdXQgdGhlIE1BQyBhZGRyZXNzIGluZm9ybWF0aW9uIGluIHRoZSBuZXRfZGV2aWNlIHN0cnVjdCAqLworCW1lbWNweSggbHAtPmRldi0+ZGV2X2FkZHIsIGxwLT5NQUNBZGRyZXNzLCBFVEhfQUxFTiApOworCWRldi0+YWRkcl9sZW4gPSBFVEhfQUxFTjsKKworCWxwLT5pc19yZWdpc3RlcmVkID0gVFJVRTsKKworI2lmZGVmIFVTRV9QUk9GSUxFCisJLyogUGFyc2UgdGhlIGNvbmZpZyBmaWxlIGZvciB0aGUgc2FrZSBvZiBjcmVhdGluZyBXRFMgcG9ydHMgaWYgV0RTIGlzCisJICAgY29uZmlndXJlZCB0aGVyZSBidXQgbm90IGluIHRoZSBtb2R1bGUgb3B0aW9ucyAqLworCXBhcnNlX2NvbmZpZyggZGV2ICk7CisjZW5kaWYgIC8qIFVTRV9QUk9GSUxFICovCisKKwkvKiBJZiB3ZSdyZSBnb2luZyBpbnRvIEFQIE1vZGUsIHJlZ2lzdGVyIHRoZSAidmlydHVhbCIgZXRoZXJuZXQgZGV2aWNlcworCSAgIG5lZWRlZCBmb3IgV0RTICovCisJV0xfV0RTX05FVERFVl9SRUdJU1RFUiggbHAgKTsKKworCS8qIFJlc2V0IHRoZSBEb3dubG9hZEZpcm13YXJlIHZhcmlhYmxlIGluIHRoZSBwcml2YXRlIHN0cnVjdC4gSWYgdGhlCisJICAgY29uZmlnIGZpbGUgaXMgbm90IHVzZWQsIHRoaXMgd2lsbCBub3QgbWF0dGVyOyBpZiBpdCBpcyB1c2VkLCBpdAorCSAgIHdpbGwgYmUgcmVwYXJzZWQgaW4gd2xfb3BlbigpLiBUaGlzIGlzIGRvbmUgYmVjYXVzZSBsb2dpYyBpbiB3bF9vcGVuCisJICAgdXNlZCB0byBjaGVjayBpZiBhIGZpcm13YXJlIGRvd25sb2FkIGlzIG5lZWRlZCBpcyBicm9rZW4gYnkgcGFyc2luZworCSAgIHRoZSBmaWxlIGhlcmU7IGhvd2V2ZXIsIHRoaXMgcGFyc2luZyBpcyBuZWVkZWQgdG8gcmVnaXN0ZXIgV0RTIHBvcnRzCisJICAgaW4gQVAgbW9kZSwgaWYgdGhleSBhcmUgY29uZmlndXJlZCAqLworCWxwLT5Eb3dubG9hZEZpcm13YXJlID0gV1ZMQU5fRFJWX01PREVfU1RBOyAvLzs/ZG93bmxvYWRfZmlybXdhcmU7CisKKyNpZmRlZiBVU0VfUlRTCisJaWYgKCBscC0+dXNlUlRTID09IDEgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIkVOVEVSSU5HIFJUUyBNT0RFLi4uXG4iICk7CisgICAgICAgICAgICAgICAgd2xfYWN0X2ludF9vZmYoIGxwICk7CisgICAgICAgICAgICAgICAgbHAtPmlzX2hhbmRsaW5nX2ludCA9IFdMX05PVF9IQU5ETElOR19JTlQ7IC8vIE5vdCBoYW5kbGluZyBpbnRlcnJ1cHRzIGFueW1vcmUKKworCQl3bF9kaXNhYmxlKCBscCApOworCisgICAgICAgIAloY2ZfY29ubmVjdCggJmxwLT5oY2ZDdHgsIEhDRl9ESVNDT05ORUNUKTsKKwl9CisjZW5kaWYgIC8qIFVTRV9SVFMgKi8KKworCXdsX3VubG9jayggbHAsICZmbGFncyApOworCisJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXM6IFdpcmVsZXNzLCBpb19hZGRyICUjMDNseCwgaXJxICVkLCAiIm1hY19hZGRyZXNzICIsCisJCQkgICBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSApOworCisJZm9yKCBpID0gMDsgaSA8IEVUSF9BTEVOOyBpKysgKSB7CisJCXByaW50ayggIiUwMlglYyIsIGRldi0+ZGV2X2FkZHJbaV0sICgoIGkgPCAoIEVUSF9BTEVOLTEgKSkgPyAnOicgOiAnXG4nICkpOworCX0KKworI2lmIDAgLy9TQ1VMTF9VU0VfUFJPQyAvKiBkb24ndCB3YXN0ZSBzcGFjZSBpZiB1bnVzZWQgKi8KKwljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCAid2xhZ3MiLCAwLCBOVUxMLCBzY3VsbF9yZWFkX3Byb2NtZW0sIGRldiApOworCXByb2NfbWtkaXIoImRyaXZlci93bGFnczQ5IiwgMCk7CisJcHJvY193cml0ZSgiZHJpdmVyL3dsYWdzNDkvd2xhZ3M0OV90eXBlIiwgd3JpdGVfaW50LCAmbHAtPndsYWdzNDlfdHlwZSk7CisjZW5kaWYgLyogU0NVTExfVVNFX1BST0MgKi8KKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXN1bHQ7CisKK2hjZl9mYWlsZWQ6CisJd2xfaGNmX2Vycm9yKCBkZXYsIGhjZl9zdGF0dXMgKTsKKworZmFpbGVkOgorCisJREJHX0VSUk9SKCBEYmdJbmZvLCAid2xfaW5zZXJ0KCkgRkFJTEVEXG4iICk7CisKKwlpZiAoIGxwLT5pc19yZWdpc3RlcmVkID09IFRSVUUgKSB7CisJCWxwLT5pc19yZWdpc3RlcmVkID0gRkFMU0U7CisJfQorCisJV0xfV0RTX05FVERFVl9ERVJFR0lTVEVSKCBscCApOworCisJcmVzdWx0ID0gLUVGQVVMVDsKKworCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJlc3VsdDsKK30gLy8gd2xfaW5zZXJ0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9yZXNldCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFJlc2V0IHRoZSBhZGFwdGVyLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBuZXRfZGV2aWNlIHN0cnVjdCBvZiB0aGUgd2lyZWxlc3MgZGV2aWNlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBhbiBIQ0Ygc3RhdHVzIGNvZGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgICpscCA9IHdsX3ByaXYoZGV2KTsKKwlpbnQgICAgICAgICAgICAgICAgIGhjZl9zdGF0dXMgPSBIQ0ZfU1VDQ0VTUzsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3bF9yZXNldCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYtPmJhc2VfYWRkciIsICIoJSMwM2x4KSIsIGRldi0+YmFzZV9hZGRyICk7CisKKwkvKgorICAgICAgICAgKiBUaGUgY2FsbGVyIHNob3VsZCBhbHJlYWR5IGhhdmUgYSBsb2NrIGFuZAorICAgICAgICAgKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHRzLCB3ZSBkbyBub3QgbG9jayBoZXJlLAorICAgICAgICAgKiBub3IgZG8gd2UgZW5hYmxlL2Rpc2FibGUgaW50ZXJydXB0cyEKKyAgICAgICAgICovCisKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJEZXZpY2UgQmFzZSBBZGRyZXNzOiAlIzAzbHhcbiIsIGRldi0+YmFzZV9hZGRyICk7CisJaWYgKCBkZXYtPmJhc2VfYWRkciApIHsKKwkJLyogU2h1dGRvd24gdGhlIGFkYXB0ZXIuICovCisJCWhjZl9jb25uZWN0KCAmbHAtPmhjZkN0eCwgSENGX0RJU0NPTk5FQ1QgKTsKKworCQkvKiBSZXNldCB0aGUgZHJpdmVyIGluZm9ybWF0aW9uLiAqLworCQlscC0+dHhCeXRlcyA9IDA7CisKKwkJLyogQ29ubmVjdCB0byB0aGUgYWRhcHRlci4gKi8KKyAgICAgICAgCWhjZl9zdGF0dXMgPSBoY2ZfY29ubmVjdCggJmxwLT5oY2ZDdHgsIGRldi0+YmFzZV9hZGRyICk7CisJCWlmICggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyAmJiBoY2Zfc3RhdHVzICE9IEhDRl9FUlJfSU5DT01QX0ZXICkgeworCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiaGNmX2Nvbm5lY3QoKSBmYWlsZWQsIHN0YXR1czogMHgleFxuIiwgaGNmX3N0YXR1cyApOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBDaGVjayBpZiBmaXJtd2FyZSBpcyBwcmVzZW50LCBpZiBub3QgY2hhbmdlIHN0YXRlICovCisJCWlmICggaGNmX3N0YXR1cyA9PSBIQ0ZfRVJSX0lOQ09NUF9GVyApIHsKKwkJCWxwLT5maXJtd2FyZV9wcmVzZW50ID0gV0xfRlJJTVdBUkVfTk9UX1BSRVNFTlQ7CisJCX0KKworCQkvKiBJbml0aWFsaXplIHRoZSBwb3J0U3RhdGUgdmFyaWFibGUgKi8KKwkJbHAtPnBvcnRTdGF0ZSA9IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQ7CisKKwkJLyogUmVzdGFydCB0aGUgYWRhcHRlci4gKi8KKwkJaGNmX3N0YXR1cyA9IHdsX2dvKCBscCApOworCQlpZiAoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CisJCQlEQkdfRVJST1IoIERiZ0luZm8sICJ3bF9nbygpIGZhaWxlZCwgc3RhdHVzOiAweCV4XG4iLCBoY2Zfc3RhdHVzICk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIENlcnRhaW4gUklEcyBtdXN0IGJlIHNldCBiZWZvcmUgZW5hYmxpbmcgdGhlIHBvcnRzICovCisJCXdsX3B1dF9sdHZfaW5pdCggbHAgKTsKKwl9IGVsc2UgeworCQlEQkdfRVJST1IoIERiZ0luZm8sICJEZXZpY2UgQmFzZSBBZGRyZXNzIElOVkFMSUQhISFcbiIgKTsKKwl9CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gaGNmX3N0YXR1czsKK30gLy8gd2xfcmVzZXQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2dvKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUmVzZXQgdGhlIGFkYXB0ZXIuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIG5ldF9kZXZpY2Ugc3RydWN0IG9mIHRoZSB3aXJlbGVzcyBkZXZpY2UKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIGFuIEhDRiBzdGF0dXMgY29kZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfZ28oIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50ICAJaGNmX3N0YXR1cyA9IEhDRl9TVUNDRVNTOworCWNoYXIJKmNwID0gTlVMTDsJCQkvL2Z3X2ltYWdlCisJaW50CXJldHJpZXMgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggIndsX2dvIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaGNmX3N0YXR1cyA9IHdsX2Rpc2FibGUoIGxwICk7CisJaWYgKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJEaXNhYmxlIHBvcnQgMCBmYWlsZWQ6IDB4JXhcbiIsIGhjZl9zdGF0dXMgKTsKKworCQl3aGlsZSAoKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgJiYgKHJldHJpZXMgPCAxMCkpIHsKKwkJCXJldHJpZXMrKzsKKwkJCWhjZl9zdGF0dXMgPSB3bF9kaXNhYmxlKCBscCApOworCQl9CisJCWlmICggaGNmX3N0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIkRpc2FibGUgcG9ydCAwIHN1Y2NlcyA6ICVkIHJldHJpZXNcbiIsIHJldHJpZXMgKTsKKwkJfSBlbHNlIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIkRpc2FibGUgcG9ydCAwIGZhaWxlZCBhZnRlcjogJWQgcmV0cmllc1xuIiwgcmV0cmllcyApOworCQl9CisJfQorCisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiRGlzYWJsaW5nIFdEUyBQb3J0c1xuIiApOworCS8vd2xfZGlzYWJsZV93ZHNfcG9ydHMoIGxwICk7CisjZW5kaWYgIC8qIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUCAqLworCisvLzs/d2hhdCB3YXMgdGhlIHB1cnBvc2Ugb2YgdGhpcworLy8gCS8qIGxvYWQgdGhlIGFwcHJvcHJpYXRlIGZpcm13YXJlIGltYWdlLCBkZXBlbmRpbmcgb24gZHJpdmVyIG1vZGUgKi8KKy8vIAlscC0+bHR2UmVjb3JkLmxlbiAgID0gKCBzaXplb2YoIENGR19SQU5HRTIwX1NUUkNUICkgLyBzaXplb2YoIGhjZl8xNiApKSAtIDE7CisvLyAJbHAtPmx0dlJlY29yZC50eXAgICA9IENGR19EUlZfQUNUX1JBTkdFU19QUkk7CisvLyAJaGNmX2dldF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworI2lmIEJJTl9ETAorCWlmICggc3RybGVuKCBscC0+ZndfaW1hZ2VfZmlsZW5hbWUgKSApIHsKK21tX3NlZ21lbnRfdAlmczsKK2ludAkJICAgIAlmaWxlX2Rlc2M7CitpbnQgCQkJcmM7CisKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRi9XIGltYWdlOiVzOlxuIiwgbHAtPmZ3X2ltYWdlX2ZpbGVuYW1lICk7CisJCS8qIE9idGFpbiBhIHVzZXItc3BhY2UgcHJvY2VzcyBjb250ZXh0LCBzdG9yaW5nIHRoZSBvcmlnaW5hbCBjb250ZXh0ICovCisJCWZzID0gZ2V0X2ZzKCApOworCQlzZXRfZnMoIGdldF9kcyggKSk7CisJCWZpbGVfZGVzYyA9IG9wZW4oIGxwLT5md19pbWFnZV9maWxlbmFtZSwgT19SRE9OTFksIDAgKTsKKwkJaWYgKCBmaWxlX2Rlc2MgPT0gLTEgKSB7CisJCQlEQkdfRVJST1IoIERiZ0luZm8sICJObyBpbWFnZSBmaWxlIGZvdW5kXG4iICk7CisJCX0gZWxzZSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJGL1cgaW1hZ2UgZmlsZSBmb3VuZFxuIiApOworI2RlZmluZSBESEZfQUxMT0NfU0laRSA5NjAwMAkJCS8vanVzdCBiZWxvdyA5NkssIGxldCdzIGhvcGUgaXQgc3VmZmljZXMgZm9yIG5vdyBhbmQgZm9yIHRoZSBmdXR1cmUKKwkJCWNwID0gKGNoYXIqKXZtYWxsb2MoIERIRl9BTExPQ19TSVpFICk7CisJCQlpZiAoIGNwID09IE5VTEwgKSB7CisJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiZXJyb3IgaW4gdm1hbGxvY1xuIiApOworCQkJfSBlbHNlIHsKKwkJCQlyYyA9IHJlYWQoIGZpbGVfZGVzYywgY3AsIERIRl9BTExPQ19TSVpFICk7CisJCQkJaWYgKCByYyA9PSBESEZfQUxMT0NfU0laRSApIHsKKwkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiYnVmZmVyIHRvbyBzbWFsbCwgJWRcbiIsIERIRl9BTExPQ19TSVpFICk7CisJCQkJfSBlbHNlIGlmICggcmMgPiAwICkgeworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJyZWFkIE8uSy46ICVkIGJ5dGVzICAlLjEyc1xuIiwgcmMsIGNwICk7CisJCQkJCXJjID0gcmVhZCggZmlsZV9kZXNjLCAmY3BbcmNdLCAxICk7CisJCQkJCWlmICggcmMgPT0gMCApIHsgLy87L2NoYW5nZSB0byBhbiB1bnRpbC1sb29wIGF0IHJjPD0wCisJCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJubyBtb3JlIHRvIHJlYWRcbiIgKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoIHJjICE9IDAgKSB7CisJCQkJCURCR19FUlJPUiggRGJnSW5mbywgImZpbGUgbm90IHJlYWQgaW4gb25lIHN3b29wIG9yIG90aGVyIGVycm9yIlwKKwkJCQkJCQkJCQkiLCBnaXZlIHVwLCB0b28gY29tcGxpY2F0ZWQsIHJjID0gJTBYXG4iLCByYyApOworCQkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJzdGlsbCBoYXZlIHRvIGNoYW5nZSBjb2RlIHRvIGdldCBhIHJlYWwgZG93bmxvYWQgbm93ICEhISEhISEhXG4iICk7CisJCQkJfSBlbHNlIHsKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiYmVmb3JlIGRoZl9kb3dubG9hZF9iaW5hcnlcbiIgKTsKKwkJCQkJaGNmX3N0YXR1cyA9IGRoZl9kb3dubG9hZF9iaW5hcnkoIChtZW1pbWFnZSAqKWNwICk7CisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgImFmdGVyIGRoZl9kb3dubG9hZF9iaW5hcnksIGJlZm9yZSBkaGZfZG93bmxvYWRfZndcbiIgKTsKKwkJCQkJLy87P2ltcHJvdmUgZXJyb3IgZmxvdy9oYW5kbGluZworCQkJCQloY2Zfc3RhdHVzID0gZGhmX2Rvd25sb2FkX2Z3KCAmbHAtPmhjZkN0eCwgKG1lbWltYWdlICopY3AgKTsKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiYWZ0ZXIgZGhmX2Rvd25sb2FkX2Z3XG4iICk7CisJCQkJfQorCQkJCXZmcmVlKCBjcCApOworCQkJfQorCQkJY2xvc2UoIGZpbGVfZGVzYyApOworCQl9CisJCXNldF9mcyggZnMgKTsJCQkvKiBSZXR1cm4gdG8gdGhlIG9yaWdpbmFsIGNvbnRleHQgKi8KKwl9CisjZW5kaWYgLy8gQklOX0RMCisKKwkvKiBJZiBmaXJtd2FyZSBpcyBwcmVzZW50IGJ1dCB0aGUgdHlwZSBpcyB1bmtub3duIHRoZW4gZG93bmxvYWQgYW55d2F5ICovCisJaWYgKCAobHAtPmZpcm13YXJlX3ByZXNlbnQgPT0gV0xfRlJJTVdBUkVfUFJFU0VOVCkKKwkgICAgICYmCisJICAgICAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSAhPSBDT01QX0lEX0ZXX1NUQSApCisJICAgICAmJgorCSAgICAgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgIT0gQ09NUF9JRF9GV19BUCApICkgeworCQkvKiBVbmtub3duIHR5cGUsIGRvd25sb2FkIG5lZWRlZC4gICovCisJCWxwLT5maXJtd2FyZV9wcmVzZW50ID0gV0xfRlJJTVdBUkVfTk9UX1BSRVNFTlQ7CisJfQorCisJaWYobHAtPmZpcm13YXJlX3ByZXNlbnQgPT0gV0xfRlJJTVdBUkVfTk9UX1BSRVNFTlQpCisJeworCQlpZiAoIGNwID09IE5VTEwgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJEb3dubG9hZGluZyBTVEEgZmlybXdhcmUuLi5cbiIgKTsKKy8vCQkJaGNmX3N0YXR1cyA9IGRoZl9kb3dubG9hZF9mdyggJmxwLT5oY2ZDdHgsICZzdGF0aW9uICk7CisJCQloY2Zfc3RhdHVzID0gZGhmX2Rvd25sb2FkX2Z3KCAmbHAtPmhjZkN0eCwgJmZ3X2ltYWdlICk7CisJCX0KKwkJaWYgKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgeworCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiRmlybXdhcmUgRG93bmxvYWQgZmFpbGVkXG4iICk7CisJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJCXJldHVybiBoY2Zfc3RhdHVzOworCQl9CisJfQorCS8qIFJlcG9ydCB0aGUgRlcgdmVyc2lvbnMgKi8KKwkvLzs/b2Jzb2xldGUsIHVzZSB0aGUgYXZhaWxhYmxlIElGQiBpbmZvOjogd2xfZ2V0X3ByaV9yZWNvcmRzKCBscCApOworCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfU1RBICApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiZG93bmxvYWRlZCBzdGF0aW9uIEYvV1xuIiApOworCX0gZWxzZSBpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX0FQICApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiZG93bmxvYWRlZCBBUCBGL1dcbiIgKTsKKwl9IGVsc2UgeworCQlEQkdfRVJST1IoIERiZ0luZm8sICJ1bmtub3duIEYvVyB0eXBlXG4iICk7CisJfQorCisJLyoKKyAgICAgICAgICogRG93bmxvYWRlZCwgbm8gbmVlZCB0byByZXBlYXQgdGhpcyBuZXh0IHRpbWUsIGFzc3VtZSB0aGUKKyAgICAgICAgICogY29udGVudHMgc3RheXMgaW4gdGhlIGNhcmQgdW50aWwgaXQgaXMgcG93ZXJlZCBvZmYuIE5vdGUgd2UKKyAgICAgICAgICogZG8gbm90IHN3aXRjaCBmaXJtd2FyZSBvbiB0aGUgZmx5LCB0aGUgZmlybXdhcmUgaXMgZml4ZWQgaW4KKyAgICAgICAgICogdGhlIGRyaXZlciBmb3Igbm93LgorICAgICAgICAgKi8KKwlscC0+ZmlybXdhcmVfcHJlc2VudCA9IFdMX0ZSSU1XQVJFX1BSRVNFTlQ7CisKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJDb21wb25lbnRJRDolMDR4IHZhcmlhbnQ6JTA0eCBtYWpvcjolMDR4IG1pbm9yOiUwNHhcbiIsCisJCQkJQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApLAorCQkJCUNOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LnZhcmlhbnQgKSwKKwkJCQlDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS52ZXJzaW9uX21ham9yICksCisJCQkJQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkudmVyc2lvbl9taW5vciApKTsKKworCS8qIG5vdyB3ZSB3aWwgZ2V0IHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgY2FyZCAqLworCWxwLT5sdHZSZWNvcmQubGVuID0gNDsKKwlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX0FQICApIHsKKwkJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfTklDX01BQ19BRERSOworCX0gZWxzZQorCXsKKwkJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ05GX09XTl9NQUNfQUREUjsKKwl9CisJaGNmX3N0YXR1cyA9IGhjZl9nZXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisJaWYgKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgeworCQlEQkdfRVJST1IoIERiZ0luZm8sICJDb3VsZCBub3QgcmV0cmlldmUgTUFDIGFkZHJlc3NcbiIgKTsKKwkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCXJldHVybiBoY2Zfc3RhdHVzOworCX0KKwltZW1jcHkoIGxwLT5NQUNBZGRyZXNzLCAmbHAtPmx0dlJlY29yZC51LnU4WzBdLCBFVEhfQUxFTiApOworCURCR19UUkFDRSggRGJnSW5mbywgIkNhcmQgTUFDIEFkZHJlc3M6ICVzXG4iLCBEYmdId0FkZHIoIGxwLT5NQUNBZGRyZXNzICkpOworCisJLyogV3JpdGUgb3V0IGNvbmZpZ3VyYXRpb24gdG8gdGhlIGRldmljZSwgZW5hYmxlLCBhbmQgcmVjb25uZWN0LiBIb3dldmVyLAorCSAgIG9ubHkgcmVjb25uZWN0IGlmIGluIEFQIG1vZGUuIEZvciBTVEEgbW9kZSwgbmVlZCB0byB3YWl0IGZvciBwYXNzaXZlIHNjYW4KKwkgICBjb21wbGV0aW9uIGJlZm9yZSBhIGNvbm5lY3QgY2FuIGJlIGlzc3VlZCAqLworCXdsX3B1dF9sdHYoIGxwICk7CisJLyogRW5hYmxlIHRoZSBwb3J0cyAqLworCWhjZl9zdGF0dXMgPSB3bF9lbmFibGUoIGxwICk7CisKKwlpZiAoIGxwLT5Eb3dubG9hZEZpcm13YXJlID09IFdWTEFOX0RSVl9NT0RFX0FQICkgeworI2lmZGVmIFVTRV9XRFMKKwkJd2xfZW5hYmxlX3dkc19wb3J0cyggbHAgKTsKKyNlbmRpZiAvLyBVU0VfV0RTCisJCWhjZl9zdGF0dXMgPSB3bF9jb25uZWN0KCBscCApOworCX0KKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gaGNmX3N0YXR1czsKK30gLy8gd2xfZ28KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3NldF93ZXBfa2V5cygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFdyaXRlIFR4S2V5SUQgYW5kIFdFUCBrZXlzIHRvIHRoZSBhZGFwdGVyLiBUaGlzIGlzIHNlcGFyYXRlZCBmcm9tCisgKiAgd2xfYXBwbHkoKSB0byBhbGxvdyBkeW5hbWljIFdFUCBrZXkgdXBkYXRlcyB0aHJvdWdoIHRoZSB3aXJlbGVzcworICogIGV4dGVuc2lvbnMuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIHdpcmVsZXNzIGFkYXB0ZXIncyBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfc2V0X3dlcF9rZXlzKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCBjb3VudCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid2xfc2V0X3dlcF9rZXlzIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCURCR19QQVJBTSggRGJnSW5mbywgImxwIiwgIiVzICgweCVwKSIsIGxwLT5kZXYtPm5hbWUsIGxwICk7CisJaWYgKCBscC0+RW5hYmxlRW5jcnlwdGlvbiApIHsKKwkJLyogTk9URTogQ0ZHX0NORl9FTkNSWVBUSU9OIGlzIHNldCBpbiB3bF9wdXRfbHR2KCkgYXMgaXQncyBhIHN0YXRpYworCQkJCSBSSUQgKi8KKworCQkvKiBzZXQgVHhLZXlJRCAqLworCQlscC0+bHR2UmVjb3JkLmxlbiA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1RYX0tFWV9JRDsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRShscC0+VHJhbnNtaXRLZXlJRCAtIDEpOworCisJCWhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiS2V5IDEgbGVuOiAlZFxuIiwgbHAtPkRlZmF1bHRLZXlzLmtleVswXS5sZW4gKTsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiS2V5IDIgbGVuOiAlZFxuIiwgbHAtPkRlZmF1bHRLZXlzLmtleVsxXS5sZW4gKTsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiS2V5IDMgbGVuOiAlZFxuIiwgbHAtPkRlZmF1bHRLZXlzLmtleVsyXS5sZW4gKTsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiS2V5IDQgbGVuOiAlZFxuIiwgbHAtPkRlZmF1bHRLZXlzLmtleVszXS5sZW4gKTsKKworCQkvKiB3cml0ZSBrZXlzICovCisJCWxwLT5EZWZhdWx0S2V5cy5sZW4gPSBzaXplb2YoIGxwLT5EZWZhdWx0S2V5cyApIC8gc2l6ZW9mKCBoY2ZfMTYgKSAtIDE7CisJCWxwLT5EZWZhdWx0S2V5cy50eXAgPSBDRkdfREVGQVVMVF9LRVlTOworCisJCS8qIGVuZGlhbiB0cmFuc2xhdGUgdGhlIGFwcHJvcHJpYXRlIGtleSBpbmZvcm1hdGlvbiAqLworCQlmb3IoIGNvdW50ID0gMDsgY291bnQgPCBNQVhfS0VZUzsgY291bnQrKyApIHsKKwkJCWxwLT5EZWZhdWx0S2V5cy5rZXlbY291bnRdLmxlbiA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+RGVmYXVsdEtleXMua2V5W2NvdW50XS5sZW4gKTsKKwkJfQorCisJCWhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5EZWZhdWx0S2V5cyApKTsKKworCQkvKiBSZXZlcnNlIHRoZSBhYm92ZSBlbmRpYW4gdHJhbnNsYXRpb24sIHNpbmNlIHRoZXNlIGtleXMgYXJlIGFjY2Vzc2VkCisJCSAgIGVsc2V3aGVyZSAqLworCQlmb3IoIGNvdW50ID0gMDsgY291bnQgPCBNQVhfS0VZUzsgY291bnQrKyApIHsKKwkJCWxwLT5EZWZhdWx0S2V5cy5rZXlbY291bnRdLmxlbiA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+RGVmYXVsdEtleXMua2V5W2NvdW50XS5sZW4gKTsKKwkJfQorCisJCURCR19OT1RJQ0UoIERiZ0luZm8sICJlbmNyeXB0OiAlZCwgSUQ6ICVkXG4iLCBscC0+RW5hYmxlRW5jcnlwdGlvbiwgbHAtPlRyYW5zbWl0S2V5SUQgKTsKKwkJREJHX05PVElDRSggRGJnSW5mbywgInNldCBrZXk6ICVzKCVkKSBbJWRdXG4iLCBscC0+RGVmYXVsdEtleXMua2V5W2xwLT5UcmFuc21pdEtleUlELTFdLmtleSwgbHAtPkRlZmF1bHRLZXlzLmtleVtscC0+VHJhbnNtaXRLZXlJRC0xXS5sZW4sIGxwLT5UcmFuc21pdEtleUlELTEgKTsKKwl9CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKK30gLy8gd2xfc2V0X3dlcF9rZXlzCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9hcHBseSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFdyaXRlIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBhZGFwdGVyLiAocmUtKWVuYWJsZXMgdGhlIGNhcmQgaWYgZGV2aWNlIGlzCisgKiAgb3Blbi4gUmV0dXJucyBoY2Zfc3RhdHVzIG9mIGhjZl9lbmFibGUoKS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgd2lyZWxlc3MgYWRhcHRlcidzIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBhbiBIQ0Ygc3RhdHVzIGNvZGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2FwcGx5KHN0cnVjdCB3bF9wcml2YXRlICpscCkKK3sKKwlpbnQgaGNmX3N0YXR1cyA9IEhDRl9TVUNDRVNTOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggIndsX2FwcGx5IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCURCR19BU1NFUlQoIGxwICE9IE5VTEwpOworCURCR19QQVJBTSggRGJnSW5mbywgImxwIiwgIiVzICgweCVwKSIsIGxwLT5kZXYtPm5hbWUsIGxwICk7CisKKwlpZiAoICEoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApKSB7CisJCS8qIFRoZSBhZGFwdGVyIHBhcmFtZXRlcnMgaGF2ZSBjaGFuZ2VkOgorCQkJCWRpc2FibGUgY2FyZAorCQkJCXJlbG9hZCBwYXJhbWV0ZXJzCisJCQkJZW5hYmxlIGNhcmQKKwkJKi8KKworCQlpZiAoIHdsX2FkYXB0ZXJfaXNfb3BlbiggbHAtPmRldiApKSB7CisJCQkvKiBEaXNjb25uZWN0IGFuZCBkaXNhYmxlIGlmIG5lY2Vzc2FyeSAqLworCQkJaGNmX3N0YXR1cyA9IHdsX2Rpc2Nvbm5lY3QoIGxwICk7CisJCQlpZiAoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CisJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiRGlzY29ubmVjdCBmYWlsZWRcbiIgKTsKKwkJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQloY2Zfc3RhdHVzID0gd2xfZGlzYWJsZSggbHAgKTsKKwkJCWlmICggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKKwkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJEaXNhYmxlIGZhaWxlZFxuIiApOworCQkJCURCR19MRUFWRSggRGJnSW5mbyApOworCQkJCXJldHVybiAtMTsKKwkJCX0gZWxzZSB7CisJCQkJLyogV3JpdGUgb3V0IGNvbmZpZ3VyYXRpb24gdG8gdGhlIGRldmljZSwgZW5hYmxlLCBhbmQgcmVjb25uZWN0LgorCQkJCSAgIEhvd2V2ZXIsIG9ubHkgcmVjb25uZWN0IGlmIGluIEFQIG1vZGUuIEZvciBTVEEgbW9kZSwgbmVlZCB0bworCQkJCSAgIHdhaXQgZm9yIHBhc3NpdmUgc2NhbiBjb21wbGV0aW9uIGJlZm9yZSBhIGNvbm5lY3QgY2FuIGJlCisJCQkJICAgaXNzdWVkICovCisJCQkJaGNmX3N0YXR1cyA9IHdsX3B1dF9sdHYoIGxwICk7CisKKwkJCQlpZiAoIGhjZl9zdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCQkJCWhjZl9zdGF0dXMgPSB3bF9lbmFibGUoIGxwICk7CisKKwkJCQkJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKSB7CisJCQkJCQloY2Zfc3RhdHVzID0gd2xfY29ubmVjdCggbHAgKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAid2xfcHV0X2x0digpIGZhaWxlZFxuIiApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiBoY2Zfc3RhdHVzOworfSAvLyB3bF9hcHBseQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcHV0X2x0dl9pbml0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVXNlZCB0byBzZXQgYmFzaWMgcGFyYW1ldGVycyBmb3IgY2FyZCBpbml0aWFsaXphdGlvbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgd2lyZWxlc3MgYWRhcHRlcidzIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBhbiBIQ0Ygc3RhdHVzIGNvZGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3B1dF9sdHZfaW5pdCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgaTsKKwlpbnQgaGNmX3N0YXR1czsKKwlDRkdfUklEX0xPR19TVFJDVCAqUmlkTG9nOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggIndsX3B1dF9sdHZfaW5pdCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKwlpZiAoIGxwID09IE5VTEwgKSB7CisJCURCR19FUlJPUiggRGJnSW5mbywgImxwIHBvaW50ZXIgaXMgTlVMTFxuIiApOworCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKiBETUEvSU8gKi8KKwlscC0+bHR2UmVjb3JkLmxlbiA9IDI7CisJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ05UTF9PUFQ7CisKKwkvKiBUaGUgQ2FyZCBTZXJ2aWNlcyBidWlsZCBtdXN0IEFMV0FZUyBjb25maWd1cmUgZm9yIDE2LWJpdCBJL08uIFBDSSBvcgorCSAgIENhcmRCdXMgY2FuIGJlIHNldCB0byBlaXRoZXIgMTYvMzIgYml0IEkvTywgb3IgQnVzIE1hc3RlciBETUEsIGJ1dCBvbmx5CisJICAgZm9yIEhlcm1lcy0yLjUgKi8KKyNpZmRlZiBCVVNfUENNQ0lBCisJbHAtPmx0dlJlY29yZC51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKCBVU0VfMTZCSVQgKTsKKyNlbHNlCisJaWYgKCBscC0+dXNlX2RtYSApIHsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKCBVU0VfRE1BICk7CisJfSBlbHNlIHsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKCAwICk7CisJfQorCisjZW5kaWYKKwloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfQ05UTF9PUFQgICAgICAgICAgICAgICAgICAgICAgOiAweCUwNHhcbiIsCisJCQkgICBscC0+bHR2UmVjb3JkLnUudTE2WzBdICk7CisJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0NOVExfT1BUIHJlc3VsdCAgICAgICAgICAgICAgIDogMHglMDR4XG4iLAorCQkJICAgaGNmX3N0YXR1cyApOworCisJLyogUmVnaXN0ZXIgdGhlIGxpc3Qgb2YgUklEcyBvbiB3aGljaCBhc3luY2hyb25vdXMgbm90aWZpY2F0aW9uIGlzCisJICAgcmVxdWlyZWQuIE5vdGUgdGhhdCB0aGlzIG1lY2hhbmlzbSByZXBsYWNlcyB0aGUgbWFpbGJveCwgc28gdGhlIG1haWxib3gKKwkgICBjYW4gYmUgcXVlcmllZCBieSB0aGUgaG9zdCAoaWYgZGVzaXJlZCkgd2l0aG91dCBjb250ZW50aW9uIGZyb20gdXMgKi8KKwlpPTA7CisKKwlscC0+UmlkTGlzdFtpXS5sZW4gICAgID0gc2l6ZW9mKCBscC0+UHJvYmVSZXNwICk7CisJbHAtPlJpZExpc3RbaV0udHlwICAgICA9IENGR19BQ1NfU0NBTjsKKwlscC0+UmlkTGlzdFtpXS5idWZwICAgID0gKHdjaV9yZWNvcmRwKSZscC0+UHJvYmVSZXNwOworCS8vbHAtPlByb2JlUmVzcC5pbmZvVHlwZSA9IDB4RkZGRjsKKwlpKys7CisKKwlscC0+UmlkTGlzdFtpXS5sZW4gICAgID0gc2l6ZW9mKCBscC0+YXNzb2Nfc3RhdCApOworCWxwLT5SaWRMaXN0W2ldLnR5cCAgICAgPSBDRkdfQVNTT0NfU1RBVDsKKwlscC0+UmlkTGlzdFtpXS5idWZwICAgID0gKHdjaV9yZWNvcmRwKSZscC0+YXNzb2Nfc3RhdDsKKwlscC0+YXNzb2Nfc3RhdC5sZW4gICAgID0gMHhGRkZGOworCWkrKzsKKworCWxwLT5SaWRMaXN0W2ldLmxlbiAgICAgPSA0OworCWxwLT5SaWRMaXN0W2ldLnR5cCAgICAgPSBDRkdfVVBEQVRFRF9JTkZPX1JFQ09SRDsKKwlscC0+UmlkTGlzdFtpXS5idWZwICAgID0gKHdjaV9yZWNvcmRwKSZscC0+dXBkYXRlZFJlY29yZDsKKwlscC0+dXBkYXRlZFJlY29yZC5sZW4gID0gMHhGRkZGOworCWkrKzsKKworCWxwLT5SaWRMaXN0W2ldLmxlbiAgICAgPSBzaXplb2YoIGxwLT5zZWNfc3RhdCApOworCWxwLT5SaWRMaXN0W2ldLnR5cCAgICAgPSBDRkdfU0VDVVJJVFlfU1RBVDsKKwlscC0+UmlkTGlzdFtpXS5idWZwICAgID0gKHdjaV9yZWNvcmRwKSZscC0+c2VjX3N0YXQ7CisJbHAtPnNlY19zdGF0LmxlbiAgICAgICA9IDB4RkZGRjsKKwlpKys7CisKKwlscC0+UmlkTGlzdFtpXS50eXAgICAgID0gMDsgICAgLy8gVGVybWluYXRlIExpc3QKKworCVJpZExvZyA9IChDRkdfUklEX0xPR19TVFJDVCAqKSZscC0+bHR2UmVjb3JkOworCVJpZExvZy0+bGVuICAgICA9IDM7CisJUmlkTG9nLT50eXAgICAgID0gQ0ZHX1JFR19JTkZPX0xPRzsKKwlSaWRMb2ctPnJlY29yZHAgPSAoUklEX0xPR1ApJmxwLT5SaWRMaXN0WzBdOworCisJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1JFR19JTkZPX0xPR1xuIiApOworCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19SRUdfSU5GT19MT0cgcmVzdWx0ICAgICAgICAgICA6IDB4JTA0eFxuIiwKKwkJCSAgIGhjZl9zdGF0dXMgKTsKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gaGNmX3N0YXR1czsKK30gLy8gd2xfcHV0X2x0dl9pbml0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wdXRfbHR2KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVXNlZCBieSB3dmxhbl9hcHBseSgpIGFuZCB3dmxhbl9nbyB0byBzZXQgdGhlIGNhcmQncyBjb25maWd1cmF0aW9uLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSB3aXJlbGVzcyBhZGFwdGVyJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIGFuIEhDRiBzdGF0dXMgY29kZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfcHV0X2x0diggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgbGVuOworCWludCBoY2Zfc3RhdHVzOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggIndsX3B1dF9sdHYiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZiAoIGxwID09IE5VTEwgKSB7CisJCURCR19FUlJPUiggRGJnSW5mbywgImxwIHBvaW50ZXIgaXMgTlVMTFxuIiApOworCQlyZXR1cm4gLTE7CisJfQorCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVAgICkgeworCQlscC0+bWF4UG9ydCA9IDY7CQkJLy87P3doeSBzZXQgdGhpcyBoZXJlIGFuZCBub3QgYXMgcGFydCBvZiBkb3dubG9hZCBwcm9jZXNzCisJfSBlbHNlIHsKKwkJbHAtPm1heFBvcnQgPSAwOworCX0KKworCS8qIFNlbmQgb3VyIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGNhcmQuIFBlcmZvcm0gYW55IGVuZGlhbiB0cmFuc2xhdGlvbgorCSAgIG5lY2Vzc2FyeSAqLworCS8qIFJlZ2lzdGVyIHRoZSBNYWlsYm94OyBWeFdvcmtzIGRvZXMgdGhpcyBlbHNld2hlcmU7IHdoeTs/ICovCisJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSA0OworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1JFR19NQjsKKwlscC0+bHR2UmVjb3JkLnUudTMyWzBdICA9ICh1X2xvbmcpJiggbHAtPm1haWxib3ggKTsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzJdICA9ICggTUJfU0laRSAvIHNpemVvZiggaGNmXzE2ICkpOworCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJLyogTWF4IERhdGEgTGVuZ3RoICovCisJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9NQVhfREFUQV9MRU47CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggSENGX01BWF9QQUNLRVRfU0laRSApOworCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJLyogU3lzdGVtIFNjYWxlIC8gRGlzdGFuY2UgYmV0d2VlbiBBUHMgKi8KKwlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX1NZU1RFTV9TQ0FMRTsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+RGlzdGFuY2VCZXR3ZWVuQVBzICk7CisJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkvKiBDaGFubmVsICovCisJaWYgKCBscC0+Q3JlYXRlSUJTUyAmJiAoIGxwLT5DaGFubmVsID09IDAgKSkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDcmVhdGUgSUJTUyIgKTsKKwkJbHAtPkNoYW5uZWwgPSAxMDsKKwl9CisJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9PV05fQ0hBTk5FTDsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+Q2hhbm5lbCApOworCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJLyogTWljcm93YXZlIFJvYnVzdG5lc3MgKi8KKwlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX01JQ1JPX1dBVkU7CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPk1pY3Jvd2F2ZVJvYnVzdG5lc3MgKTsKKwloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCS8qIExvYWQgQmFsYW5jaW5nICovCisJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9MT0FEX0JBTEFOQ0lORzsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bG9hZEJhbGFuY2luZyApOworCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJLyogTWVkaXVtIERpc3RyaWJ1dGlvbiAqLworCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfTUVESVVNX0RJU1RSSUJVVElPTjsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bWVkaXVtRGlzdHJpYnV0aW9uICk7CisJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisJLyogQ291bnRyeSBDb2RlICovCisKKyNpZmRlZiBXQVJQCisJLyogVHggUG93ZXIgTGV2ZWwgKGZvciBzdXBwb3J0ZWQgY2FyZHMpICovCisJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9UWF9QT1dfTFZMOworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT50eFBvd0xldmVsICk7CisJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkvKiBTaG9ydCBSZXRyeSBMaW1pdCAqLworCS8qbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gMHhGQzMyOworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5zaG9ydFJldHJ5TGltaXQgKTsKKwloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKwkqLworCisJLyogTG9uZyBSZXRyeSBMaW1pdCAqLworCS8qbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gMHhGQzMzOworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sb25nUmV0cnlMaW1pdCApOworCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCSovCisKKwkvKiBTdXBwb3J0ZWQgUmF0ZSBTZXQgQ29udHJvbCAqLworCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMzsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19TVVBQT1JURURfUkFURV9TRVRfQ05UTDsgLy8weEZDODg7CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPnNyc2NbMF0gKTsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzFdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+c3JzY1sxXSApOworCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJLyogQmFzaWMgUmF0ZSBTZXQgQ29udHJvbCAqLworCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMzsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19CQVNJQ19SQVRFX1NFVF9DTlRMOyAvLzB4RkM4OTsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+YnJzY1swXSApOworCWxwLT5sdHZSZWNvcmQudS51MTZbMV0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5icnNjWzFdICk7CisJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkvKiBGcmFtZSBCdXJzdCBMaW1pdCAqLworCS8qIERlZmluZWQsIGJ1dCBub3QgY3VycmVudGx5IGF2YWlsYWJsZSBpbiBGaXJtd2FyZSAqLworCisjZW5kaWYgLy8gV0FSUAorCisjaWZkZWYgV0FSUAorCS8qIE11bHRpY2FzdCBSYXRlICovCisJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAzOworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9NQ0FTVF9SQVRFOworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5NdWx0aWNhc3RSYXRlWzBdICk7CisJbHAtPmx0dlJlY29yZC51LnUxNlsxXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPk11bHRpY2FzdFJhdGVbMV0gKTsKKyNlbHNlCisJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9NQ0FTVF9SQVRFOworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5NdWx0aWNhc3RSYXRlWzBdICk7CisjZW5kaWYgLy8gV0FSUAorCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJLyogT3duIE5hbWUgKFN0YXRpb24gTmlja25hbWUpICovCisJaWYgKCggbGVuID0gKCBzdHJsZW4oIGxwLT5TdGF0aW9uTmFtZSApICsgMSApICYgfjB4MDEgKSAhPSAwICkgeworCQkvL0RCR19UUkFDRSggRGJnSW5mbywgIkNGR19DTkZfT1dOX05BTUUgICAgICAgICAgICAgICAgICA6ICVzXG4iLAorCQkvLyAgICAgICAgICAgbHAtPlN0YXRpb25OYW1lICk7CisKKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyICsgKCBsZW4gLyBzaXplb2YoIGhjZl8xNiApKTsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX09XTl9OQU1FOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBzdHJsZW4oIGxwLT5TdGF0aW9uTmFtZSApKTsKKworCQltZW1jcHkoICYoIGxwLT5sdHZSZWNvcmQudS51OFsyXSApLCBscC0+U3RhdGlvbk5hbWUsIGxlbiApOworCX0gZWxzZSB7CisJCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0NORl9PV05fTkFNRSAgICAgICAgICAgICAgICAgIDogRU1QVFlcbiIgKTsKKworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9PV05fTkFNRTsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMCApOworCX0KKworCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfQ05GX09XTl9OQU1FIHJlc3VsdCAgICAgICAgICAgOiAweCUwNHhcbiIsCisJLy8gICAgICAgICAgIGhjZl9zdGF0dXMgKTsKKworCS8qIFRoZSBmb2xsb3dpbmcgYXJlIHNldCBpbiBTVEEgbW9kZSBvbmx5ICovCisJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19TVEEgICkgeworCisJCS8qIFJUUyBUaHJlc2hvbGQgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19SVFNfVEhSSDsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPlJUU1RocmVzaG9sZCApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBQb3J0IFR5cGUgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfUE9SVF9UWVBFOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+UG9ydFR5cGUgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogVHggUmF0ZSBDb250cm9sICovCisjaWZkZWYgV0FSUAorCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDM7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1RYX1JBVEVfQ05UTDsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPlR4UmF0ZUNvbnRyb2xbMF0gKTsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlsxXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPlR4UmF0ZUNvbnRyb2xbMV0gKTsKKyNlbHNlCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfVFhfUkFURV9DTlRMOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+VHhSYXRlQ29udHJvbFswXSApOworI2VuZGlmICAvLyBXQVJQCisKKy8vOz9za2lwIHRlbXBvcmFyaWx5IHRvIHNlZSB3aGV0aGVyIHRoZSBSSUQgb3Igc29tZXRoaW5nIGVsc2UgaXMgdGhlIHByb2JlbG0gaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1RYX1JBVEVfQ05UTCAyLjRHSHogICAgICAgICAgIDogMHglMDR4XG4iLAorCQkJCSAgIGxwLT5UeFJhdGVDb250cm9sWzBdICk7CisJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19UWF9SQVRFX0NOVEwgNS4wR0h6ICAgICAgICAgICA6IDB4JTA0eFxuIiwKKwkJCQkgICBscC0+VHhSYXRlQ29udHJvbFsxXSApOworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfVFhfUkFURV9DTlRMIHJlc3VsdCAgICAgICAgICAgOiAweCUwNHhcbiIsCisJCQkJICAgaGNmX3N0YXR1cyApOworCQkvKiBQb3dlciBNYW5hZ2VtZW50ICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX1BNX0VOQUJMRUQ7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5QTUVuYWJsZWQgKTsKKy8vCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAweDgwMDEgKTsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0NORl9QTV9FTkFCTEVEICAgICAgICAgICAgICAgIDogMHglMDR4XG4iLCBscC0+UE1FbmFibGVkICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCQkvKiBNdWx0aWNhc3QgUmVjZWl2ZSAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9NQ0FTVF9SWDsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPk11bHRpY2FzdFJlY2VpdmUgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogTWF4IFNsZWVwIER1cmF0aW9uICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX01BWF9TTEVFUF9EVVJBVElPTjsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPk1heFNsZWVwRHVyYXRpb24gKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogQ3JlYXRlIElCU1MgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DUkVBVEVfSUJTUzsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPkNyZWF0ZUlCU1MgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogRGVzaXJlZCBTU0lEICovCisJCWlmICgoKCBsZW4gPSAoIHN0cmxlbiggbHAtPk5ldHdvcmtOYW1lICkgKyAxICkgJiB+MHgwMSApICE9IDAgKSAmJgorCQkJICggc3RyY21wKCBscC0+TmV0d29ya05hbWUsICJBTlkiICkgIT0gMCApICYmCisJCQkgKCBzdHJjbXAoIGxwLT5OZXR3b3JrTmFtZSwgImFueSIgKSAhPSAwICkpIHsKKwkJCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0RFU0lSRURfU1NJRCAgICAgICAgICAgICAgICAgIDogJXNcbiIsCisJCQkvLyAgICAgICAgICAgbHAtPk5ldHdvcmtOYW1lICk7CisKKwkJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMiArIChsZW4gLyBzaXplb2YoaGNmXzE2KSk7CisJCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19ERVNJUkVEX1NTSUQ7CisJCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBzdHJsZW4oIGxwLT5OZXR3b3JrTmFtZSApKTsKKworCQkJbWVtY3B5KCAmKCBscC0+bHR2UmVjb3JkLnUudThbMl0gKSwgbHAtPk5ldHdvcmtOYW1lLCBsZW4gKTsKKwkJfSBlbHNlIHsKKwkJCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0RFU0lSRURfU1NJRCAgICAgICAgICAgICAgICAgIDogQU5ZXG4iICk7CisKKwkJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0RFU0lSRURfU1NJRDsKKwkJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDAgKTsKKwkJfQorCisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0RFU0lSRURfU1NJRCByZXN1bHQgICAgICAgICAgIDogMHglMDR4XG4iLAorCQkvLyAgICAgICAgICAgaGNmX3N0YXR1cyApOworCQkvKiBPd24gQVRJTSB3aW5kb3cgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfT1dOX0FUSU1fV0lORE9XOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+YXRpbVdpbmRvdyApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCisJCS8qIEhvbGRvdmVyIER1cmF0aW9uICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX0hPTERPVkVSX0RVUkFUSU9OOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+aG9sZG92ZXJEdXJhdGlvbiApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBQcm9taXNjdW91cyBNb2RlICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUFJPTUlTQ1VPVVNfTU9ERTsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPnByb21pc2N1b3VzTW9kZSApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBBdXRoZW50aWNhdGlvbiAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9BVVRIRU5USUNBVElPTjsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmF1dGhlbnRpY2F0aW9uICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworI2lmZGVmIFdBUlAKKwkJLyogQ29ubmVjdGlvbiBDb250cm9sICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX0NPTk5FQ1RJT05fQ05UTDsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmNvbm5lY3Rpb25Db250cm9sICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisKKworCQkvKiBQcm9iZSBkYXRhIHJhdGUgKi8KKwkJLypscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDM7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1BST0JFX0RBVEFfUkFURTsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPnByb2JlRGF0YVJhdGVzWzBdICk7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMV0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5wcm9iZURhdGFSYXRlc1sxXSApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfUFJPQkVfREFUQV9SQVRFIDIuNEdIeiAgICAgICAgOiAweCUwNHhcbiIsCisJCQkJICAgbHAtPnByb2JlRGF0YVJhdGVzWzBdICk7CisJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19QUk9CRV9EQVRBX1JBVEUgNS4wR0h6ICAgICAgICA6IDB4JTA0eFxuIiwKKwkJCQkgICBscC0+cHJvYmVEYXRhUmF0ZXNbMV0gKTsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1BST0JFX0RBVEFfUkFURSByZXN1bHQgICAgICAgIDogMHglMDR4XG4iLAorCQkJCSAgIGhjZl9zdGF0dXMgKTsqLworI2VuZGlmIC8vIFdBUlAKKwl9IGVsc2UgeworCQkvKiBUaGUgZm9sbG93aW5nIGFyZSBzZXQgaW4gQVAgbW9kZSBvbmx5ICovCisjaWYgMCAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorCQkvLzs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQKKworCQkvKiBEVElNIFBlcmlvZCAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9PV05fRFRJTV9QRVJJT0Q7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5EVElNUGVyaW9kICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIE11bHRpY2FzdCBQTSBCdWZmZXJpbmcgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfTUNBU1RfUE1fQlVGOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bXVsdGljYXN0UE1CdWZmZXJpbmcgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogUmVqZWN0IEFOWSAtIENsb3NlZCBTeXN0ZW0gKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfUkVKRUNUX0FOWTsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPlJlamVjdEFueSApOworCisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIEV4Y2x1ZGUgVW5lbmNyeXB0ZWQgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfRVhDTF9VTkVOQ1JZUFRFRDsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPkV4Y2x1ZGVVbmVuY3J5cHRlZCApOworCisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIEludHJhQlNTIFJlbGF5ICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX0lOVFJBX0JTU19SRUxBWTsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmludHJhQlNTUmVsYXkgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogUlRTIFRocmVzaG9sZCAwICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUlRTX1RIUkgwOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+UlRTVGhyZXNob2xkICk7CisKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogVHggUmF0ZSBDb250cm9sIDAgKi8KKyNpZmRlZiBXQVJQCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMzsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfVFhfUkFURV9DTlRMMDsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPlR4UmF0ZUNvbnRyb2xbMF0gKTsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlsxXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPlR4UmF0ZUNvbnRyb2xbMV0gKTsKKyNlbHNlCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfVFhfUkFURV9DTlRMMDsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPlR4UmF0ZUNvbnRyb2xbMF0gKTsKKyNlbmRpZiAgLy8gV0FSUAorCisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIE93biBCZWFjb24gSW50ZXJ2YWwgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IDB4RkMzMTsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPm93bkJlYWNvbkludGVydmFsICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIENvLUV4aXN0ZW5jZSBCZWhhdmlvciAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gMHhGQ0M3OworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+Y29leGlzdGVuY2UgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKyNpZmRlZiBVU0VfV0RTCisKKwkJLyogUlRTIFRocmVzaG9sZCAxICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUlRTX1RIUkgxOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+d2RzX3BvcnRbMF0ucnRzVGhyZXNob2xkICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIFJUUyBUaHJlc2hvbGQgMiAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1JUU19USFJIMjsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPndkc19wb3J0WzFdLnJ0c1RocmVzaG9sZCApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCisJCS8qIFJUUyBUaHJlc2hvbGQgMyAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1JUU19USFJIMzsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPndkc19wb3J0WzJdLnJ0c1RocmVzaG9sZCApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCisJCS8qIFJUUyBUaHJlc2hvbGQgNCAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1JUU19USFJINDsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPndkc19wb3J0WzNdLnJ0c1RocmVzaG9sZCApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCisJCS8qIFJUUyBUaHJlc2hvbGQgNSAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1JUU19USFJINTsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPndkc19wb3J0WzRdLnJ0c1RocmVzaG9sZCApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBSVFMgVGhyZXNob2xkIDYgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19SVFNfVEhSSDY7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT53ZHNfcG9ydFs1XS5ydHNUaHJlc2hvbGQgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisjaWYgMAorCQkvKiBUWCBSYXRlIENvbnRyb2wgMSAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1RYX1JBVEVfQ05UTDE7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT53ZHNfcG9ydFswXS50eFJhdGVDbnRsICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIFRYIFJhdGUgQ29udHJvbCAyICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfVFhfUkFURV9DTlRMMjsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPndkc19wb3J0WzFdLnR4UmF0ZUNudGwgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogVFggUmF0ZSBDb250cm9sIDMgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19UWF9SQVRFX0NOVEwzOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+d2RzX3BvcnRbMl0udHhSYXRlQ250bCApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBUWCBSYXRlIENvbnRyb2wgNCAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1RYX1JBVEVfQ05UTDQ7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT53ZHNfcG9ydFszXS50eFJhdGVDbnRsICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIFRYIFJhdGUgQ29udHJvbCA1ICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfVFhfUkFURV9DTlRMNTsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPndkc19wb3J0WzRdLnR4UmF0ZUNudGwgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogVFggUmF0ZSBDb250cm9sIDYgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19UWF9SQVRFX0NOVEw2OworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+d2RzX3BvcnRbNV0udHhSYXRlQ250bCApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworI2VuZGlmCisKKwkJLyogV0RTIGFkZHJlc3Nlcy4gIEl0J3Mgb2theSB0byBibGluZGx5IHNlbmQgdGhlc2UgcGFyYW1ldGVycywgYmVjYXVzZQorCQkgICB0aGUgcG9ydCBuZWVkcyB0byBiZSBlbmFibGVkLCBiZWZvcmUgYW55dGhpbmcgaXMgZG9uZSB3aXRoIGl0LiAqLworCisJCS8qIFdEUyBBZGRyZXNzIDEgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICA9IDQ7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgPSBDRkdfQ05GX1dEU19BRERSMTsKKworCQltZW1jcHkoICZscC0+bHR2UmVjb3JkLnUudThbMF0sIGxwLT53ZHNfcG9ydFswXS53ZHNBZGRyZXNzLCBFVEhfQUxFTiApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBXRFMgQWRkcmVzcyAyICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgPSA0OworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgID0gQ0ZHX0NORl9XRFNfQUREUjI7CisKKwkJbWVtY3B5KCAmbHAtPmx0dlJlY29yZC51LnU4WzBdLCBscC0+d2RzX3BvcnRbMV0ud2RzQWRkcmVzcywgRVRIX0FMRU4gKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogV0RTIEFkZHJlc3MgMyAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgID0gNDsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICA9IENGR19DTkZfV0RTX0FERFIzOworCisJCW1lbWNweSggJmxwLT5sdHZSZWNvcmQudS51OFswXSwgbHAtPndkc19wb3J0WzJdLndkc0FkZHJlc3MsIEVUSF9BTEVOICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIFdEUyBBZGRyZXNzIDQgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICA9IDQ7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgPSBDRkdfQ05GX1dEU19BRERSNDsKKworCQltZW1jcHkoICZscC0+bHR2UmVjb3JkLnUudThbMF0sIGxwLT53ZHNfcG9ydFszXS53ZHNBZGRyZXNzLCBFVEhfQUxFTiApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBXRFMgQWRkcmVzcyA1ICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgPSA0OworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgID0gQ0ZHX0NORl9XRFNfQUREUjU7CisKKwkJbWVtY3B5KCAmbHAtPmx0dlJlY29yZC51LnU4WzBdLCBscC0+d2RzX3BvcnRbNF0ud2RzQWRkcmVzcywgRVRIX0FMRU4gKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogV0RTIEFkZHJlc3MgNiAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgID0gNDsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICA9IENGR19DTkZfV0RTX0FERFI2OworCisJCW1lbWNweSggJmxwLT5sdHZSZWNvcmQudS51OFswXSwgbHAtPndkc19wb3J0WzVdLndkc0FkZHJlc3MsIEVUSF9BTEVOICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworI2VuZGlmICAvKiBVU0VfV0RTICovCisjZW5kaWYgIC8qIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUCAqLworCX0KKworCS8qIE93biBNQUMgQWRkcmVzcyAqLworCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiTUFDIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgIDogJXNcbiIsCisJLy8gICAgICAgICAgIERiZ0h3QWRkciggbHAtPk1BQ0FkZHJlc3MgKSk7CisKKwlpZiAoIFdWTEFOX1ZBTElEX01BQ19BRERSRVNTKCBscC0+TUFDQWRkcmVzcyApKSB7CisJCS8qIE1ha2UgdGhlIE1BQyBhZGRyZXNzIHZhbGlkIGJ5OgorCQkJCUNsZWFyaW5nIHRoZSBtdWx0aWNhc3QgYml0CisJCQkJU2V0dGluZyB0aGUgbG9jYWwgTUFDIGFkZHJlc3MgYml0CisJCSovCisJCS8vbHAtPk1BQ0FkZHJlc3NbMF0gJj0gfjB4MDM7ICAvLzs/d2h5IGlzIHRoaXMgY29tbWVudGVkIG91dCBhbHJlYWR5IGluIDcyMAorCQkvL2xwLT5NQUNBZGRyZXNzWzBdIHw9IDB4MDI7CisKKwkJbHAtPmx0dlJlY29yZC5sZW4gPSAxICsgKCBFVEhfQUxFTiAvIHNpemVvZiggaGNmXzE2ICkpOworCQlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX0FQICApIHsKKwkJCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX05JQ19NQUNfQUREUlxuIiApOworCQkJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfTklDX01BQ19BRERSOworCQl9IGVsc2UgeworCQkJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfQ05GX09XTl9NQUNfQUREUlxuIiApOworCQkJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ05GX09XTl9NQUNfQUREUjsKKwkJfQorCQkvKiBNQUMgYWRkcmVzcyBpcyBieXRlIGFsaWduZWQsIG5vIGVuZGlhbiBjb252ZXJzaW9uIG5lZWRlZCAqLworCQltZW1jcHkoICYoIGxwLT5sdHZSZWNvcmQudS51OFswXSApLCBscC0+TUFDQWRkcmVzcywgRVRIX0FMRU4gKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisJCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1hYWF9NQUNfQUREUiByZXN1bHQgICAgICAgICAgIDogMHglMDR4XG4iLAorCQkvLyAgICAgICAgICAgaGNmX3N0YXR1cyApOworCisJCS8qIFVwZGF0ZSB0aGUgTUFDIGFkZHJlc3MgaW4gdGhlIG5ldGRldmljZSBzdHJ1Y3QgKi8KKwkJbWVtY3B5KCBscC0+ZGV2LT5kZXZfYWRkciwgbHAtPk1BQ0FkZHJlc3MsIEVUSF9BTEVOICk7IC8vOz93aGF0IGlzIHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VlbWluZ2x5IGNvbXBsZXggbG9naWMKKwl9CisJLyogT3duIFNTSUQgKi8KKwlpZiAoKCggbGVuID0gKCBzdHJsZW4oIGxwLT5OZXR3b3JrTmFtZSApICsgMSApICYgfjB4MDEgKSAhPSAwICkgJiYKKwkJCQkgKCBzdHJjbXAoIGxwLT5OZXR3b3JrTmFtZSwgIkFOWSIgKSAhPSAwICkgJiYKKwkJCQkgKCBzdHJjbXAoIGxwLT5OZXR3b3JrTmFtZSwgImFueSIgKSAhPSAwICkpIHsKKwkJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfQ05GX09XTl9TU0lEICAgICAgICAgICAgICAgICAgOiAlc1xuIiwKKwkJLy8gICAgICAgICAgIGxwLT5OZXR3b3JrTmFtZSApOworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDIgKyAobGVuIC8gc2l6ZW9mKGhjZl8xNikpOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfT1dOX1NTSUQ7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIHN0cmxlbiggbHAtPk5ldHdvcmtOYW1lICkpOworCisJCW1lbWNweSggJiggbHAtPmx0dlJlY29yZC51LnU4WzJdICksIGxwLT5OZXR3b3JrTmFtZSwgbGVuICk7CisJfSBlbHNlIHsKKwkJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfQ05GX09XTl9TU0lEICAgICAgICAgICAgICAgICAgOiBBTllcbiIgKTsKKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfT1dOX1NTSUQ7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDAgKTsKKwl9CisKKwloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0NORl9PV05fU1NJRCByZXN1bHQgICAgICAgICAgIDogMHglMDR4XG4iLAorCS8vICAgICAgICAgICBoY2Zfc3RhdHVzICk7CisJLyogZW5hYmxlL2Rpc2FibGUgZW5jcnlwdGlvbiAqLworCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfRU5DUllQVElPTjsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+RW5hYmxlRW5jcnlwdGlvbiApOworCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJLyogU2V0IHRoZSBBdXRoZW50aWNhdGlvbiBLZXkgTWFuYWdlbWVudCBTdWl0ZSAqLworCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19TRVRfV1BBX0FVVEhfS0VZX01HTVRfU1VJVEU7CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPkF1dGhLZXlNZ210U3VpdGUgKTsKKwloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKwkvKiBXRVAgS2V5cyAqLworCXdsX3NldF93ZXBfa2V5cyggbHAgKTsKKworCS8qIENvdW50cnkgQ29kZSAqLworCS8qIGNvdW50cnlJbmZvLCBsdHZDb3VudHJ5SW5mbywgQ0ZHX0NORl9DT1VOVFJZX0lORk8gKi8KKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiBoY2Zfc3RhdHVzOworfSAvLyB3bF9wdXRfbHR2CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglpbml0X21vZHVsZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIExvYWQgdGhlIGtlcm5lbCBtb2R1bGUuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBOL0EKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBhbiBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBfX2luaXQgd2xfbW9kdWxlX2luaXQoIHZvaWQgKQoreworCWludCByZXN1bHQ7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJREJHX0ZVTkMoICJ3bF9tb2R1bGVfaW5pdCIgKTsKKworI2lmIERCRworCS8qIENvbnZlcnQgInN0YW5kYXJkIiBQQ01DSUEgcGFyYW1ldGVyIHBjX2RlYnVnIHRvIGEgcmVhc29uYWJsZSBEZWJ1Z0ZsYWcgdmFsdWUuCisJICogTk9URTogVGhlIHZhbHVlcyBhbGwgZmFsbCB0aHJvdWdoIHRvIHRoZSBsb3dlciB2YWx1ZXMuICovCisJRGJnSW5mby0+RGVidWdGbGFnID0gMDsKKwlEYmdJbmZvLT5EZWJ1Z0ZsYWcgPSBEQkdfVFJBQ0VfT047CQkvLzs/Z2V0IHRoaXMgbWVzcyByZXNvbHZlZCBvbmUgZGF5CisJaWYgKCBwY19kZWJ1ZyApIHN3aXRjaCggcGNfZGVidWcgKSB7CisJICBjYXNlIDg6CisJCURiZ0luZm8tPkRlYnVnRmxhZyB8PSBEQkdfRFNfT047CisJICBjYXNlIDc6CisJCURiZ0luZm8tPkRlYnVnRmxhZyB8PSBEQkdfUlhfT04gfCBEQkdfVFhfT047CisJICBjYXNlIDY6CisJCURiZ0luZm8tPkRlYnVnRmxhZyB8PSBEQkdfUEFSQU1fT047CisJICBjYXNlIDU6CisJCURiZ0luZm8tPkRlYnVnRmxhZyB8PSBEQkdfVFJBQ0VfT047CisJICBjYXNlIDQ6CisJCURiZ0luZm8tPkRlYnVnRmxhZyB8PSBEQkdfVkVSQk9TRV9PTjsKKwkgIGNhc2UgMToKKwkJRGJnSW5mby0+RGVidWdGbGFnIHw9IERCR19ERUZBVUxUUzsKKwkgIGRlZmF1bHQ6CisJCWJyZWFrOworCX0KKyNlbmRpZiAvKiBEQkcgKi8KKworCURCR19FTlRFUiggRGJnSW5mbyApOworCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLCBWRVJTSU9OX0lORk8pOworICAgIAlwcmludGsoS0VSTl9JTkZPICIqKiogTW9kaWZpZWQgZm9yIGtlcm5lbCAyLjYgYnkgSGVuayBkZSBHcm9vdCA8cGUxZG5uQGFtc2F0Lm9yZz5cbiIpOworICAgICAgICBwcmludGsoS0VSTl9JTkZPICIqKiogQmFzZWQgb24gNy4xOCB2ZXJzaW9uIGJ5IEFuZHJleSBCb3J6ZW5rb3YgPGFydmlkamFhckBtYWlsLnJ1PiAkUmV2aXNpb246IDM5ICRcbiIpOworCisKKy8vIDs/I2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorLy8gCURCR19QUklOVCggIkFjY2VzcyBQb2ludCBNb2RlIChBUCkgU3VwcG9ydDogWUVTXG4iICk7CisvLyAjZWxzZQorLy8gCURCR19QUklOVCggIkFjY2VzcyBQb2ludCBNb2RlIChBUCkgU3VwcG9ydDogTk9cbiIgKTsKKy8vICNlbmRpZiAvKiAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAgKi8KKworCXJlc3VsdCA9IHdsX2FkYXB0ZXJfaW5pdF9tb2R1bGUoICk7CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJlc3VsdDsKK30gLy8gaW5pdF9tb2R1bGUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCWNsZWFudXBfbW9kdWxlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVW5sb2FkIHRoZSBrZXJuZWwgbW9kdWxlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgTi9BCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX19leGl0IHdsX21vZHVsZV9leGl0KCB2b2lkICkKK3sKKwlEQkdfRlVOQyggIndsX21vZHVsZV9leGl0IiApOworCURCR19FTlRFUihEYmdJbmZvKTsKKworCXdsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUoICk7CisjaWYgMCAvL1NDVUxMX1VTRV9QUk9DIC8qIGRvbid0IHdhc3RlIHNwYWNlIGlmIHVudXNlZCAqLworCXJlbW92ZV9wcm9jX2VudHJ5KCAid2xhZ3MiLCBOVUxMICk7CQkvLzs/d2h5IHNvIGEtc3ltbWV0cmljIGNvbXBhcmVkIHRvIGxvY2F0aW9uIG9mIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkKKyNlbmRpZgorCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuOworfSAvLyBjbGVhbnVwX21vZHVsZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworbW9kdWxlX2luaXQod2xfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQod2xfbW9kdWxlX2V4aXQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfaXNyKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhlIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUgZm9yIHRoZSBkcml2ZXIuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBpcnEgICAgIC0gICB0aGUgaXJxIHRoZSBpbnRlcnJ1cHQgY2FtZSBpbiBvbgorICogICAgICBkZXZfaWQgIC0gICBhIGJ1ZmZlciBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXF1ZXN0CisgKiAgICAgIHJlZ3MgICAgLQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lycXJldHVybl90IHdsX2lzciggaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyApCit7CisJaW50ICAgICAgICAgICAgICAgICBldmVudHM7CisJc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IE5VTEw7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWlmICgoIGRldiA9PSBOVUxMICkgfHwgKCAhbmV0aWZfZGV2aWNlX3ByZXNlbnQoIGRldiApKSkgeworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJLyogU2V0IHRoZSB3bF9wcml2YXRlIHBvaW50ZXIgKGxwKSwgbm93IHRoYXQgd2Uga25vdyB0aGF0IGRldiBpcyBub24tbnVsbCAqLworCWxwID0gd2xfcHJpdihkZXYpOworCisjaWZkZWYgVVNFX1JUUworCWlmICggbHAtPnVzZVJUUyA9PSAxICkgeworCQlEQkdfUFJJTlQoICJFWElUSU5HIElTUiwgSU4gUlRTIE1PREUuLi5cbiIgKTsKKwkJcmV0dXJuOworCQl9CisjZW5kaWYgIC8qIFVTRV9SVFMgKi8KKworCS8qIElmIHdlIGhhdmUgaW50ZXJydXB0cyBwZW5kaW5nLCB0aGVuIHB1dCB0aGVtIG9uIGEgc3lzdGVtIHRhc2sKKwkgICBxdWV1ZS4gT3RoZXJ3aXNlIHR1cm4gaW50ZXJydXB0cyBiYWNrIG9uICovCisJZXZlbnRzID0gaGNmX2FjdGlvbiggJmxwLT5oY2ZDdHgsIEhDRl9BQ1RfSU5UX09GRiApOworCisJaWYgKCBldmVudHMgPT0gSENGX0lOVF9QRU5ESU5HICkgeworCQkvKiBTY2hlZHVsZSB0aGUgSVNSIGhhbmRsZXIgYXMgYSBib3R0b20taGFsZiB0YXNrIGluIHRoZQorCQkgICB0cV9pbW1lZGlhdGUgcXVldWUgKi8KKwkJdGFza2xldF9zY2hlZHVsZSgmbHAtPnRhc2spOworCX0gZWxzZSB7CisJCS8vREJHX1BSSU5UKCAiTk9UIE9VUiBJTlRFUlJVUFRcbiIgKTsKKwkJaGNmX2FjdGlvbiggJmxwLT5oY2ZDdHgsIEhDRl9BQ1RfSU5UX09OICk7CisJfQorCisJcmV0dXJuIElSUV9SRVRWQUwoZXZlbnRzID09IEhDRl9JTlRfUEVORElORyk7Cit9IC8vIHdsX2lzcgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfaXNyX2hhbmRsZXIoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGUgSVNSIGhhbmRsZXIsIHNjaGVkdWxlZCB0byBydW4gaW4gYSBkZWZlcnJlZCBjb250ZXh0IGJ5IHRoZSBJU1IuIFRoaXMKKyAqICAgICAgaXMgd2hlcmUgdGhlIElTUidzIHdvcmsgYWN0dWFsbHkgZ2V0cyBkb25lLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBXVkxBTl9NQVhfSU5UX1NFUlZJQ0VTICA1MAorCit2b2lkIHdsX2lzcl9oYW5kbGVyKCB1bnNpZ25lZCBsb25nIHAgKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICpkZXY7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgZmxhZ3M7CisJYm9vbF90ICAgICAgICAgICAgICAgICAgc3RvcCA9IFRSVUU7CisJaW50ICAgICAgICAgICAgICAgICAgICAgY291bnQ7CisJaW50ICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OworICAgICAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAqbHAgPSAoc3RydWN0IHdsX3ByaXZhdGUgKilwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWlmICggbHAgPT0gTlVMTCApIHsKKwkJREJHX1BSSU5UKCAid2xfaXNyX2hhbmRsZXIgIGxwIGFkYXB0ZXIgcG9pbnRlciBpcyBOVUxMISEhXG4iICk7CisJfSBlbHNlIHsKKwkJd2xfbG9jayggbHAsICZmbGFncyApOworCisJCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWxwLT5kZXY7CisJCWlmICggZGV2ICE9IE5VTEwgJiYgbmV0aWZfZGV2aWNlX3ByZXNlbnQoIGRldiApICkgc3RvcCA9IEZBTFNFOworCQlmb3IoIGNvdW50ID0gMDsgc3RvcCA9PSBGQUxTRSAmJiBjb3VudCA8IFdWTEFOX01BWF9JTlRfU0VSVklDRVM7IGNvdW50KysgKSB7CisJCQlzdG9wID0gVFJVRTsKKwkJCXJlc3VsdCA9IGhjZl9zZXJ2aWNlX25pYyggJmxwLT5oY2ZDdHgsCisJCQkJCQkJCQkgICh3Y2lfYnVmcClscC0+bG9va0FoZWFkQnVmLAorCQkJCQkJCQkJICBzaXplb2YoIGxwLT5sb29rQWhlYWRCdWYgKSk7CisJCQlpZiAoIHJlc3VsdCA9PSBIQ0ZfRVJSX01JQyApIHsKKwkJCQl3bF93ZXh0X2V2ZW50X21pY19mYWlsZWQoIGRldiApOyAJLyogU2VuZCBhbiBldmVudCB0aGF0IE1JQyBmYWlsZWQgKi8KKwkJCQkvLzs/dGhpcyBzZWVtcyB3cm9uZyBpZiBIQ0ZfRVJSX01JQyBjb2luY2lkZXMgd2l0aCBhbm90aGVyIGV2ZW50LCBzdG9wIGdldHMgRkFMU0UKKwkJCQkvL3NvIHdoeSBub3QgZG8gaXQgYWx3YXlzIDs/CisJCQl9CisKKyNpZm5kZWYgVVNFX01CT1hfU1lOQworCQkJaWYgKCBscC0+aGNmQ3R4LklGQl9NQkluZm9MZW4gIT0gMCApIHsJLyogYW55dGhpbmcgaW4gdGhlIG1haWxib3ggKi8KKwkJCQl3bF9tYngoIGxwICk7CisJCQkJc3RvcCA9IEZBTFNFOworCQkJfQorI2VuZGlmCisJCQkvKiBDaGVjayBmb3IgYSBMaW5rIHN0YXR1cyBldmVudCAqLworCQkJaWYgKCAoIGxwLT5oY2ZDdHguSUZCX0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9GVyApICE9IDAgKSB7CisJCQkJd2xfcHJvY2Vzc19saW5rX3N0YXR1cyggbHAgKTsKKwkJCQlzdG9wID0gRkFMU0U7CisJCQl9CisJCQkvKiBDaGVjayBmb3IgcHJvYmUgcmVzcG9uc2UgZXZlbnRzICovCisJCQlpZiAoIGxwLT5Qcm9iZVJlc3AuaW5mb1R5cGUgIT0gMCAmJgorCQkJCWxwLT5Qcm9iZVJlc3AuaW5mb1R5cGUgIT0gMHhGRkZGICkgeworCQkJCXdsX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UoIGxwICk7CisJCQkJbWVtc2V0KCAmbHAtPlByb2JlUmVzcCwgMCwgc2l6ZW9mKCBscC0+UHJvYmVSZXNwICkpOworCQkJCWxwLT5Qcm9iZVJlc3AuaW5mb1R5cGUgPSAweEZGRkY7CisJCQkJc3RvcCA9IEZBTFNFOworCQkJfQorCQkJLyogQ2hlY2sgZm9yIHVwZGF0ZWQgcmVjb3JkIGV2ZW50cyAqLworCQkJaWYgKCBscC0+dXBkYXRlZFJlY29yZC5sZW4gIT0gMHhGRkZGICkgeworCQkJCXdsX3Byb2Nlc3NfdXBkYXRlZF9yZWNvcmQoIGxwICk7CisJCQkJbHAtPnVwZGF0ZWRSZWNvcmQubGVuID0gMHhGRkZGOworCQkJCXN0b3AgPSBGQUxTRTsKKwkJCX0KKwkJCS8qIENoZWNrIGZvciBhc3NvY2lhdGlvbiBzdGF0dXMgZXZlbnRzICovCisJCQlpZiAoIGxwLT5hc3NvY19zdGF0LmxlbiAhPSAweEZGRkYgKSB7CisJCQkJd2xfcHJvY2Vzc19hc3NvY19zdGF0dXMoIGxwICk7CisJCQkJbHAtPmFzc29jX3N0YXQubGVuID0gMHhGRkZGOworCQkJCXN0b3AgPSBGQUxTRTsKKwkJCX0KKwkJCS8qIENoZWNrIGZvciBzZWN1cml0eSBzdGF0dXMgZXZlbnRzICovCisJCQlpZiAoIGxwLT5zZWNfc3RhdC5sZW4gIT0gMHhGRkZGICkgeworCQkJCXdsX3Byb2Nlc3Nfc2VjdXJpdHlfc3RhdHVzKCBscCApOworCQkJCWxwLT5zZWNfc3RhdC5sZW4gPSAweEZGRkY7CisJCQkJc3RvcCA9IEZBTFNFOworCQkJfQorCisjaWZkZWYgRU5BQkxFX0RNQQorCQkJaWYgKCBscC0+dXNlX2RtYSApIHsKKwkJCQkvKiBDaGVjayBmb3IgRE1BIFJ4IHBhY2tldHMgKi8KKwkJCQlpZiAoIGxwLT5oY2ZDdHguSUZCX0RtYVBhY2tldHMgJiBIUkVHX0VWX1JETUFEICkgeworCQkJCQl3bF9yeF9kbWEoIGRldiApOworCQkJCQlzdG9wID0gRkFMU0U7CisJCQkJfQorCQkJCS8qIFJldHVybiBUeCBETUEgZGVzY3JpcHRvcnMgdG8gaG9zdCAqLworCQkJCWlmICggbHAtPmhjZkN0eC5JRkJfRG1hUGFja2V0cyAmIEhSRUdfRVZfVERNQUQgKSB7CisJCQkJCXdsX3BjaV9kbWFfaGNmX3JlY2xhaW1fdHgoIGxwICk7CisJCQkJCXN0b3AgPSBGQUxTRTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gRU5BQkxFX0RNQQorCQkJeworCQkJCS8qIENoZWNrIGZvciBSeCBwYWNrZXRzICovCisJCQkJaWYgKCBscC0+aGNmQ3R4LklGQl9SeExlbiAhPSAwICkgeworCQkJCQl3bF9yeCggZGV2ICk7CisJCQkJCXN0b3AgPSBGQUxTRTsKKwkJCQl9CisJCQkJLyogTWFrZSBzdXJlIHRoYXQgcXVldWVkIGZyYW1lcyBnZXQgc2VudCAqLworCQkJCWlmICggd2xfc2VuZCggbHAgKSkgeworCQkJCQlzdG9wID0gRkFMU0U7CisJCQkJfQorCQkJfQorCQl9CisJCS8qIFdlJ3JlIGRvbmUsIHNvIHR1cm4gaW50ZXJydXB0cyB3aGljaCB3ZXJlIHR1cm5lZCBvZmYgaW4gd2xfaXNyLCBiYWNrIG9uICovCisJCWhjZl9hY3Rpb24oICZscC0+aGNmQ3R4LCBIQ0ZfQUNUX0lOVF9PTiApOworCQl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKwl9CisJcmV0dXJuOworfSAvLyB3bF9pc3JfaGFuZGxlcgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcmVtb3ZlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgTm90aWZ5IHRoZSBhZGFwdGVyIHRoYXQgaXQgaGFzIGJlZW4gcmVtb3ZlZC4gU2luY2UgdGhlIGFkYXB0ZXIgaXMgZ29uZSwKKyAqICB3ZSBzaG91bGQgbm8gbG9uZ2VyIHRyeSB0byB0YWxrIHRvIGl0LgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfcmVtb3ZlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid2xfcmVtb3ZlIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKwkvKiBzdG9wIGhhbmRsaW5nIGludGVycnVwdHMgKi8KKwl3bF9hY3RfaW50X29mZiggbHAgKTsKKyAgICAgICAgbHAtPmlzX2hhbmRsaW5nX2ludCA9IFdMX05PVF9IQU5ETElOR19JTlQ7CisKKwkvKgorICAgICAgICAgKiBEaXNhYmxlIHRoZSBwb3J0czoganVzdCBjaGFuZ2Ugc3RhdGU6IHNpbmNlIHRoZQorICAgICAgICAgKiBjYXJkIGlzIGdvbmUgaXQgaXMgdXNlbGVzcyB0byB0YWxrIHRvIGl0IGFuZCBhdAorICAgICAgICAgKiBkaXNjb25uZWN0IGFsbCBzdGF0ZSBpbmZvcm1hdGlvbiBpcyBsb3N0IGFueXdheS4KKyAgICAgICAgICovCisJLyogUmVzZXQgcG9ydFN0YXRlICovCisJbHAtPnBvcnRTdGF0ZSA9IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQ7CisKKyNpZiAwIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisjaWZkZWYgVVNFX1dEUworCS8vd2xfZGlzYWJsZV93ZHNfcG9ydHMoIGxwICk7CisjZW5kaWYgLy8gVVNFX1dEUworI2VuZGlmICAvKiAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAgKi8KKworCS8qIE1hcmsgdGhlIGRldmljZSBhcyB1bnJlZ2lzdGVyZWQgKi8KKwlscC0+aXNfcmVnaXN0ZXJlZCA9IEZBTFNFOworCisJLyogRGVyZWdpc3RlciB0aGUgV0RTIHBvcnRzIGFzIHdlbGwgKi8KKwlXTF9XRFNfTkVUREVWX0RFUkVHSVNURVIoIGxwICk7CisjaWZkZWYgVVNFX1JUUworCWlmICggbHAtPnVzZVJUUyA9PSAxICkgeworCQl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKworCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZiAgLyogVVNFX1JUUyAqLworCisJLyogSW5mb3JtIHRoZSBIQ0YgdGhhdCB0aGUgY2FyZCBoYXMgYmVlbiByZW1vdmVkICovCisJaGNmX2Nvbm5lY3QoICZscC0+aGNmQ3R4LCBIQ0ZfRElTQ09OTkVDVCApOworCisJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm47Cit9IC8vIHdsX3JlbW92ZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfc3VzcGVuZCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFBvd2VyLWRvd24gYW5kIGhhbHQgdGhlIGFkYXB0ZXIuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9zdXNwZW5kKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3bF9zdXNwZW5kIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CisKKwkvKiBUaGUgYWRhcHRlciBpcyBzdXNwZW5kZWQ6CisJCQlTdG9wIHRoZSBhZGFwdGVyCisJCQlQb3dlciBkb3duCisJKi8KKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdCBoYW5kbGluZyAqLworCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJLyogRGlzY29ubmVjdCAqLworCXdsX2Rpc2Nvbm5lY3QoIGxwICk7CisKKwkvKiBEaXNhYmxlICovCisJd2xfZGlzYWJsZSggbHAgKTsKKworICAgICAgICAvKiBEaXNjb25uZWN0IGZyb20gdGhlIGFkYXB0ZXIgKi8KKwloY2ZfY29ubmVjdCggJmxwLT5oY2ZDdHgsIEhDRl9ESVNDT05ORUNUICk7CisKKwkvKiBSZXNldCBwb3J0U3RhdGUgdG8gYmUgc3VyZSAoc2hvdWxkIGhhdmUgYmVlbiBkb25lIGJ5IHdsX2Rpc2FibGUgKi8KKwlscC0+cG9ydFN0YXRlID0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRDsKKworCXdsX3VubG9jayggbHAsICZmbGFncyApOworCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuOworfSAvLyB3bF9zdXNwZW5kCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9yZXN1bWUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBSZXN1bWUgYSBwcmV2aW91c2x5IHN1c3BlbmRlZCBhZGFwdGVyLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfcmVzdW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid2xfcmVzdW1lIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAgICAgLyogQ29ubmVjdCB0byB0aGUgYWRhcHRlciAqLworCWhjZl9jb25uZWN0KCAmbHAtPmhjZkN0eCwgZGV2LT5iYXNlX2FkZHIgKTsKKworCS8qIFJlc2V0IHBvcnRTdGF0ZSAqLworCWxwLT5wb3J0U3RhdGUgPSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEOworCisJLyogUG93ZXIgbWlnaHQgaGF2ZSBiZWVuIG9mZiwgYXNzdW1lIHRoZSBjYXJkIGxvc3QgdGhlIGZpcm13YXJlKi8KKwlscC0+ZmlybXdhcmVfcHJlc2VudCA9IFdMX0ZSSU1XQVJFX05PVF9QUkVTRU5UOworCisJLyogUmVsb2FkIHRoZSBmaXJtd2FyZSBhbmQgcmVzdGFydCAqLworCXdsX3Jlc2V0KCBkZXYgKTsKKworCS8qIFJlc3VtZSBpbnRlcnJ1cHQgaGFuZGxpbmcgKi8KKwl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm47Cit9IC8vIHdsX3Jlc3VtZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcmVsZWFzZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZnJvbXMgYSBjaGVjayBvbiB0aGUgZGV2aWNlIGFuZCBjYWxscyB3bF9yZW1vdmUoKSBpZgorICogIG5lY2Vzc2FyeS4gVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgYWxsIGJ1cyB0eXBlcywgYnV0IGV4aXN0cyBtb3N0bHkKKyAqICBmb3IgdGhlIGJlbmVmaXQgb2YgdGhlIENhcmQgU2VydmljZXMgZHJpdmVyLCBhcyB0aGVyZSBhcmUgdGltZXMgd2hlbgorICogIHdsX3JlbW92ZSgpIGRvZXMgbm90IGdldCBjYWxsZWQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9yZWxlYXNlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAgKmxwID0gd2xfcHJpdihkZXYpOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggIndsX3JlbGVhc2UiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKKwkvKiBJZiB3bF9yZW1vdmUoKSBoYXNuJ3QgYmVlbiBjYWxsZWQgKGkuZS4gd2hlbiBDYXJkIFNlcnZpY2VzIGlzIHNodXQKKwkgICBkb3duIHdpdGggdGhlIGNhcmQgaW4gdGhlIHNsb3QpLCB0aGVuIGNhbGwgaXQgKi8KKwlpZiAoIGxwLT5pc19yZWdpc3RlcmVkID09IFRSVUUgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIkNhbGxpbmcgdW5yZWdpc3Rlcl9uZXRkZXYoKSwgYXMgaXQgd2Fzbid0IGNhbGxlZCB5ZXRcbiIgKTsKKwkJd2xfcmVtb3ZlKCBkZXYgKTsKKworCQlscC0+aXNfcmVnaXN0ZXJlZCA9IEZBTFNFOworCX0KKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybjsKK30gLy8gd2xfcmVsZWFzZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfZ2V0X2lycV9tYXNrKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQWNjZXNzb3IgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGlycV9tYXNrIG1vZHVsZSBwYXJhbWV0ZXIKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgVGhlIGlycV9tYXNrIG1vZHVsZSBwYXJhbWV0ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcF91MTYgd2xfZ2V0X2lycV9tYXNrKCB2b2lkICkKK3sKKwlyZXR1cm4gaXJxX21hc2s7Cit9IC8vIHdsX2dldF9pcnFfbWFzaworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfZ2V0X2lycV9saXN0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQWNjZXNzb3IgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGlycV9saXN0IG1vZHVsZSBwYXJhbWV0ZXIKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgVGhlIGlycV9saXN0IG1vZHVsZSBwYXJhbWV0ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcF9zOCAqIHdsX2dldF9pcnFfbGlzdCggdm9pZCApCit7CisJcmV0dXJuIGlycV9saXN0OworfSAvLyB3bF9nZXRfaXJxX2xpc3QKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfZW5hYmxlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVXNlZCB0byBlbmFibGUgTUFDIHBvcnRzCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgICAgIC0gcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9lbmFibGUoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50IGhjZl9zdGF0dXMgPSBIQ0ZfU1VDQ0VTUzsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3bF9lbmFibGUiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZiAoIGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9FTkFCTEVEICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJObyBhY3Rpb246IENhcmQgYWxyZWFkeSBlbmFibGVkXG4iICk7CisJfSBlbHNlIGlmICggbHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0NPTk5FQ1RFRCApIHsKKwkJLy87P3N1c3BpY3VvdXMgbG9naWMsIGhvdyBjYW4geW91IGJlIGNvbm5lY3RlZCB3aXRob3V0IGJlaW5nIGVuYWJsZWQgc28gdGhpcyBpcyBwcm9iYWJseSBkZWFkIGNvZGUKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTm8gYWN0aW9uOiBDYXJkIGFscmVhZHkgY29ubmVjdGVkXG4iICk7CisJfSBlbHNlIHsKKwkJaGNmX3N0YXR1cyA9IGhjZl9jbnRsKCAmbHAtPmhjZkN0eCwgSENGX0NOVExfRU5BQkxFICk7CisJCWlmICggaGNmX3N0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJCS8qIFNldCB0aGUgc3RhdHVzIG9mIHRoZSBOSUMgdG8gZW5hYmxlZCAqLworCQkJbHAtPnBvcnRTdGF0ZSA9IFdWTEFOX1BPUlRfU1RBVEVfRU5BQkxFRDsgICAvLzs/YmFkIG1uZW1vbmljLCBOSUMgaXNvIFBPUlQKKyNpZmRlZiBFTkFCTEVfRE1BCisJCQlpZiAoIGxwLT51c2VfZG1hICkgeworCQkJCXdsX3BjaV9kbWFfaGNmX3N1cHBseSggbHAgKTsgIC8vOz9hbHdheXMgc3VjY2VzPworCQkJfQorI2VuZGlmCisJCX0KKwl9CisJaWYgKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgeyAgLy87P21ha2UgdGhpcyBhbiBhc3NlcnQKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiZmFpbGVkOiAweCV4XG4iLCBoY2Zfc3RhdHVzICk7CisJfQorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiBoY2Zfc3RhdHVzOworfSAvLyB3bF9lbmFibGUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworI2lmZGVmIFVTRV9XRFMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9lbmFibGVfd2RzX3BvcnRzKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVXNlZCB0byBlbmFibGUgdGhlIFdEUyBNQUMgcG9ydHMgMS02CisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgICAgIC0gcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfZW5hYmxlX3dkc19wb3J0cyggc3RydWN0IHdsX3ByaXZhdGUgKiBscCApCit7CisKKwlEQkdfRlVOQyggIndsX2VuYWJsZV93ZHNfcG9ydHMiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKXsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAiISEhITs/IHNvbWVvbmUgbWlzdW5kZXJzdG9vZCBzb21ldGhpbmcgISEhISFcbiIgKTsKKwl9CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuOworfSAvLyB3bF9lbmFibGVfd2RzX3BvcnRzCisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2Nvbm5lY3QoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBVc2VkIHRvIGNvbm5lY3QgYSBNQUMgcG9ydAorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfY29ubmVjdCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgaGNmX3N0YXR1czsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlEQkdfRlVOQyggIndsX2Nvbm5lY3QiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZiAoIGxwLT5wb3J0U3RhdGUgIT0gV1ZMQU5fUE9SVF9TVEFURV9FTkFCTEVEICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJObyBhY3Rpb246IE5vdCBpbiBlbmFibGVkIHN0YXRlXG4iICk7CisJCURCR19MRUFWRSggRGJnSW5mbyApOworCQlyZXR1cm4gSENGX1NVQ0NFU1M7CisJfQorCWhjZl9zdGF0dXMgPSBoY2ZfY250bCggJmxwLT5oY2ZDdHgsIEhDRl9DTlRMX0NPTk5FQ1QgKTsKKwlpZiAoIGhjZl9zdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCWxwLT5wb3J0U3RhdGUgPSBXVkxBTl9QT1JUX1NUQVRFX0NPTk5FQ1RFRDsKKwl9CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIGhjZl9zdGF0dXM7Cit9IC8vIHdsX2Nvbm5lY3QKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2Rpc2Nvbm5lY3QoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBVc2VkIHRvIGRpc2Nvbm5lY3QgYSBNQUMgcG9ydAorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfZGlzY29ubmVjdCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgaGNmX3N0YXR1czsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlEQkdfRlVOQyggIndsX2Rpc2Nvbm5lY3QiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZiAoIGxwLT5wb3J0U3RhdGUgIT0gV1ZMQU5fUE9SVF9TVEFURV9DT05ORUNURUQgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIk5vIGFjdGlvbjogTm90IGluIGNvbm5lY3RlZCBzdGF0ZVxuIiApOworCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJcmV0dXJuIEhDRl9TVUNDRVNTOworCX0KKwloY2Zfc3RhdHVzID0gaGNmX2NudGwoICZscC0+aGNmQ3R4LCBIQ0ZfQ05UTF9ESVNDT05ORUNUICk7CisJaWYgKCBoY2Zfc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworCQlscC0+cG9ydFN0YXRlID0gV1ZMQU5fUE9SVF9TVEFURV9FTkFCTEVEOworCX0KKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gaGNmX3N0YXR1czsKK30gLy8gd2xfZGlzY29ubmVjdAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfZGlzYWJsZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFVzZWQgdG8gZGlzYWJsZSBNQUMgcG9ydHMKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKiAgICAgIHBvcnQgICAgLSB0aGUgTUFDIHBvcnQgdG8gZGlzYWJsZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9kaXNhYmxlKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCBoY2Zfc3RhdHVzID0gSENGX1NVQ0NFU1M7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid2xfZGlzYWJsZSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmICggbHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJObyBhY3Rpb246IFBvcnQgc3RhdGUgaXMgZGlzYWJsZWRcbiIgKTsKKwl9IGVsc2UgeworCQloY2Zfc3RhdHVzID0gaGNmX2NudGwoICZscC0+aGNmQ3R4LCBIQ0ZfQ05UTF9ESVNBQkxFICk7CisJCWlmICggaGNmX3N0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJCS8qIFNldCB0aGUgc3RhdHVzIG9mIHRoZSBwb3J0IHRvIGRpc2FibGVkICovIC8vOz9iYWQgbW5lbW9uaWMgdXNlIE5JQyBpc28gUE9SVAorCQkJbHAtPnBvcnRTdGF0ZSA9IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQ7CisKKyNpZmRlZiBFTkFCTEVfRE1BCisJCQlpZiAoIGxwLT51c2VfZG1hICkgeworCQkJCXdsX3BjaV9kbWFfaGNmX3JlY2xhaW0oIGxwICk7CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKwlpZiAoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgImZhaWxlZDogMHgleFxuIiwgaGNmX3N0YXR1cyApOworCX0KKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gaGNmX3N0YXR1czsKK30gLy8gd2xfZGlzYWJsZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisjaWZkZWYgVVNFX1dEUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2Rpc2FibGVfd2RzX3BvcnRzKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVXNlZCB0byBkaXNhYmxlIHRoZSBXRFMgTUFDIHBvcnRzIDEtNgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX2Rpc2FibGVfd2RzX3BvcnRzKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqIGxwICkKK3sKKworCURCR19GVU5DKCAid2xfZGlzYWJsZV93ZHNfcG9ydHMiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX0FQICApeworCQlEQkdfRVJST1IoIERiZ0luZm8sICIhISEhOz8gc29tZW9uZSBtaXN1bmRlcnN0b29kIHNvbWV0aGluZyAhISEhIVxuIiApOworCX0KKy8vIAlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX0FQICApIHsKKy8vIAkJd2xfZGlzYWJsZSggbHAsIEhDRl9QT1JUXzEgKTsKKy8vIAkJd2xfZGlzYWJsZSggbHAsIEhDRl9QT1JUXzIgKTsKKy8vIAkJd2xfZGlzYWJsZSggbHAsIEhDRl9QT1JUXzMgKTsKKy8vIAkJd2xfZGlzYWJsZSggbHAsIEhDRl9QT1JUXzQgKTsKKy8vIAkJd2xfZGlzYWJsZSggbHAsIEhDRl9QT1JUXzUgKTsKKy8vIAkJd2xfZGlzYWJsZSggbHAsIEhDRl9QT1JUXzYgKTsKKy8vIAl9CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuOworfSAvLyB3bF9kaXNhYmxlX3dkc19wb3J0cworI2VuZGlmIC8vIFVTRV9XRFMKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworI2lmbmRlZiBVU0VfTUJPWF9TWU5DCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfbWJ4KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZCBhbmQgcHJvY2VzcyBhIG1haWxib3ggbWVzc2FnZS4KKyAqCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgICAgIC0gcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgYW4gSENGIHN0YXR1cyBjb2RlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9tYngoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50IGhjZl9zdGF0dXMgPSBIQ0ZfU1VDQ0VTUzsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3bF9tYngiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisJREJHX1RSQUNFKCBEYmdJbmZvLCAiTWFpbGJveCBJbmZvOiBJRkJfTUJJbmZvTGVuOiAlZFxuIiwKKwkJCSAgIGxwLT5oY2ZDdHguSUZCX01CSW5mb0xlbiApOworCisJbWVtc2V0KCAmKCBscC0+bHR2UmVjb3JkICksIDAsIHNpemVvZiggbHR2X3QgKSk7CisKKwlscC0+bHR2UmVjb3JkLmxlbiA9IE1CX1NJWkU7CisJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfTUJfSU5GTzsKKwloY2Zfc3RhdHVzID0gaGNmX2dldF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCWlmICggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAiaGNmX2dldF9pbmZvIHJldHVybmVkIDB4JXhcbiIsIGhjZl9zdGF0dXMgKTsKKworCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJcmV0dXJuIGhjZl9zdGF0dXM7CisJfQorCisJaWYgKCBscC0+bHR2UmVjb3JkLnR5cCA9PSBDRkdfTUJfSU5GTyApIHsKKwkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCXJldHVybiBoY2Zfc3RhdHVzOworCX0KKwkvKiBFbmRpYW4gdHJhbnNsYXRlIHRoZSBtYWlsYm94IGRhdGEsIHRoZW4gcHJvY2VzcyB0aGUgbWVzc2FnZSAqLworCXdsX2VuZGlhbl90cmFuc2xhdGVfbWFpbGJveCggJiggbHAtPmx0dlJlY29yZCApKTsKKwl3bF9wcm9jZXNzX21haWxib3goIGxwICk7CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIGhjZl9zdGF0dXM7Cit9IC8vIHdsX21ieAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfZW5kaWFuX3RyYW5zbGF0ZV9tYWlsYm94KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHBlcmZvcm0gdGhlIHRlZGlvdXMgdGFzayBvZiBlbmRpYW4gdHJhbnNsYXRpbmcgYWxsCisgKiAgZmllbGRzIHdpdGh0aW4gYSBtYWlsYm94IG1lc3NhZ2Ugd2hpY2ggbmVlZCB0cmFuc2xhdGluZy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGx0diAtIHBvaW50ZXIgdG8gdGhlIExUViB0byBlbmRpYW4gdHJhbnNsYXRlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBub25lCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfZW5kaWFuX3RyYW5zbGF0ZV9tYWlsYm94KCBsdHZfdCAqbHR2ICkKK3sKKworCURCR19GVU5DKCAid2xfZW5kaWFuX3RyYW5zbGF0ZV9tYWlsYm94IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCXN3aXRjaCggbHR2LT50eXAgKSB7CisJICBjYXNlIENGR19UQUxMSUVTOgorCQlicmVhazsKKworCSAgY2FzZSBDRkdfU0NBTjoKKwkJeworCQkJaW50IG51bV9hcHM7CisJCQlTQ0FOX1JTX1NUUkNUICphcHMgPSAoU0NBTl9SU19TVFJDVCAqKSZsdHYtPnUudThbMF07CisKKwkJCW51bV9hcHMgPSAoaGNmXzE2KSgoIChzaXplX3QpKGx0di0+bGVuIC0gMSApICogMiApIC8KKwkJCQkJCQkJICggc2l6ZW9mKCBTQ0FOX1JTX1NUUkNUICkpKTsKKworCQkJd2hpbGUoIG51bV9hcHMgPj0gMSApIHsKKwkJCQludW1fYXBzLS07CisKKwkJCQlhcHNbbnVtX2Fwc10uY2hhbm5lbF9pZCA9CisJCQkJCUNOVl9MSVRUTEVfVE9fSU5UKCBhcHNbbnVtX2Fwc10uY2hhbm5lbF9pZCApOworCisJCQkJYXBzW251bV9hcHNdLm5vaXNlX2xldmVsID0KKwkJCQkJQ05WX0xJVFRMRV9UT19JTlQoIGFwc1tudW1fYXBzXS5ub2lzZV9sZXZlbCApOworCisJCQkJYXBzW251bV9hcHNdLnNpZ25hbF9sZXZlbCA9CisJCQkJCUNOVl9MSVRUTEVfVE9fSU5UKCBhcHNbbnVtX2Fwc10uc2lnbmFsX2xldmVsICk7CisKKwkJCQlhcHNbbnVtX2Fwc10uYmVhY29uX2ludGVydmFsX3RpbWUgPQorCQkJCQlDTlZfTElUVExFX1RPX0lOVCggYXBzW251bV9hcHNdLmJlYWNvbl9pbnRlcnZhbF90aW1lICk7CisKKwkJCQlhcHNbbnVtX2Fwc10uY2FwYWJpbGl0eSA9CisJCQkJCUNOVl9MSVRUTEVfVE9fSU5UKCBhcHNbbnVtX2Fwc10uY2FwYWJpbGl0eSApOworCisJCQkJYXBzW251bV9hcHNdLnNzaWRfbGVuID0KKwkJCQkJQ05WX0xJVFRMRV9UT19JTlQoIGFwc1tudW1fYXBzXS5zc2lkX2xlbiApOworCisJCQkJYXBzW251bV9hcHNdLnNzaWRfdmFsW2Fwc1tudW1fYXBzXS5zc2lkX2xlbl0gPSAwOworCQkJfQorCQl9CisJCWJyZWFrOworCisJICBjYXNlIENGR19BQ1NfU0NBTjoKKwkJeworCQkJUFJPQkVfUkVTUCAqcHJvYmVfcmVzcCA9IChQUk9CRV9SRVNQICopbHR2OworCisJCQlwcm9iZV9yZXNwLT5mcmFtZUNvbnRyb2wgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5mcmFtZUNvbnRyb2wgKTsKKwkJCXByb2JlX3Jlc3AtPmR1cklEICAgICAgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmR1cklEICk7CisJCQlwcm9iZV9yZXNwLT5zZXF1ZW5jZSAgICAgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5zZXF1ZW5jZSApOworCQkJcHJvYmVfcmVzcC0+ZGF0YUxlbmd0aCAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+ZGF0YUxlbmd0aCApOworI2lmbmRlZiBXQVJQCisJCQlwcm9iZV9yZXNwLT5sZW5UeXBlICAgICAgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5sZW5UeXBlICk7CisjZW5kaWYgLy8gV0FSUAorCQkJcHJvYmVfcmVzcC0+YmVhY29uSW50ZXJ2YWwgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+YmVhY29uSW50ZXJ2YWwgKTsKKwkJCXByb2JlX3Jlc3AtPmNhcGFiaWxpdHkgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmNhcGFiaWxpdHkgKTsKKwkJCXByb2JlX3Jlc3AtPmZsYWdzICAgICAgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmZsYWdzICk7CisJCX0KKwkJYnJlYWs7CisKKwkgIGNhc2UgQ0ZHX0xJTktfU1RBVDoKKyNkZWZpbmUgbHMgKChMSU5LX1NUQVRVU19TVFJDVCAqKWx0dikKKwkJCWxzLT5saW5rU3RhdHVzID0gQ05WX0xJVFRMRV9UT19JTlQoIGxzLT5saW5rU3RhdHVzICk7CisJCWJyZWFrOworI3VuZGVmIGxzCisKKwkgIGNhc2UgQ0ZHX0FTU09DX1NUQVQ6CisJCXsKKwkJCUFTU09DX1NUQVRVU19TVFJDVCAqYXMgPSAoQVNTT0NfU1RBVFVTX1NUUkNUICopbHR2OworCisJCQlhcy0+YXNzb2NTdGF0dXMgPSBDTlZfTElUVExFX1RPX0lOVCggYXMtPmFzc29jU3RhdHVzICk7CisJCX0KKwkJYnJlYWs7CisKKwkgIGNhc2UgQ0ZHX1NFQ1VSSVRZX1NUQVQ6CisJCXsKKwkJCVNFQ1VSSVRZX1NUQVRVU19TVFJDVCAqc3MgPSAoU0VDVVJJVFlfU1RBVFVTX1NUUkNUICopbHR2OworCisJCQlzcy0+c2VjdXJpdHlTdGF0dXMgID0gQ05WX0xJVFRMRV9UT19JTlQoIHNzLT5zZWN1cml0eVN0YXR1cyApOworCQkJc3MtPnJlYXNvbiAgICAgICAgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBzcy0+cmVhc29uICk7CisJCX0KKwkJYnJlYWs7CisKKwkgIGNhc2UgQ0ZHX1dNUDoKKwkJYnJlYWs7CisKKwkgIGNhc2UgQ0ZHX05VTEw6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuOworfSAvLyB3bF9lbmRpYW5fdHJhbnNsYXRlX21haWxib3gKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wcm9jZXNzX21haWxib3goKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJvY2VzcyB0aGUgbWFpbGJveCBkYXRhLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHR2IC0gcG9pbnRlciB0byB0aGUgTFRWIHRvIGJlIHByb2Nlc3NlZC4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIG5vbmUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9wcm9jZXNzX21haWxib3goIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJbHR2X3QgICAqbHR2OworCWhjZl8xNiAgbHR2X3ZhbCA9IDB4RkZGRjsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3bF9wcm9jZXNzX21haWxib3giICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisJbHR2ID0gJiggbHAtPmx0dlJlY29yZCApOworCisJc3dpdGNoKCBsdHYtPnR5cCApIHsKKworCSAgY2FzZSBDRkdfVEFMTElFUzoKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1RBTExJRVNcbiIgKTsKKwkJYnJlYWs7CisJICBjYXNlIENGR19TQ0FOOgorCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfU0NBTlxuIiApOworCisJCXsKKwkJCWludCBudW1fYXBzOworCQkJU0NBTl9SU19TVFJDVCAqYXBzID0gKFNDQU5fUlNfU1RSQ1QgKikmbHR2LT51LnU4WzBdOworCisJCQludW1fYXBzID0gKGhjZl8xNikoKCAoc2l6ZV90KShsdHYtPmxlbiAtIDEgKSAqIDIgKSAvCisJCQkJCQkJCSAoIHNpemVvZiggU0NBTl9SU19TVFJDVCApKSk7CisKKwkJCWxwLT5zY2FuX3Jlc3VsdHMubnVtX2FwcyA9IG51bV9hcHM7CisKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIk51bWJlciBvZiBBUHM6ICVkXG4iLCBudW1fYXBzICk7CisKKwkJCXdoaWxlKCBudW1fYXBzID49IDEgKSB7CisJCQkJbnVtX2Fwcy0tOworCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQVAgICAgICAgICAgICAgIDogJWRcbiIsIG51bV9hcHMgKTsKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICI9PT09PT09PT09PT09PT09PT09PT09PT09XG4iICk7CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ2hhbm5lbCBJRCAgICAgIDogMHglMDR4XG4iLAorCQkJCQkJICAgYXBzW251bV9hcHNdLmNoYW5uZWxfaWQgKTsKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJOb2lzZSBMZXZlbCAgICAgOiAweCUwNHhcbiIsCisJCQkJCQkgICBhcHNbbnVtX2Fwc10ubm9pc2VfbGV2ZWwgKTsKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTaWduYWwgTGV2ZWwgICAgOiAweCUwNHhcbiIsCisJCQkJCQkgICBhcHNbbnVtX2Fwc10uc2lnbmFsX2xldmVsICk7CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQmVhY29uIEludGVydmFsIDogMHglMDR4XG4iLAorCQkJCQkJICAgYXBzW251bV9hcHNdLmJlYWNvbl9pbnRlcnZhbF90aW1lICk7CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ2FwYWJpbGl0eSAgICAgIDogMHglMDR4XG4iLAorCQkJCQkJICAgYXBzW251bV9hcHNdLmNhcGFiaWxpdHkgKTsKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTU0lEIExlbmd0aCAgICAgOiAweCUwNHhcbiIsCisJCQkJCQkgICBhcHNbbnVtX2Fwc10uc3NpZF9sZW4gKTsKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJCU1NJRCAgICAgICAgICAgOiAlc1xuIiwKKwkJCQkJCSAgIERiZ0h3QWRkciggYXBzW251bV9hcHNdLmJzc2lkICkpOworCisJCQkJaWYgKCBhcHNbbnVtX2Fwc10uc3NpZF9sZW4gIT0gMCApIHsKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU1NJRCAgICAgICAgICAgIDogJXMuXG4iLAorCQkJCQkJCSAgIGFwc1tudW1fYXBzXS5zc2lkX3ZhbCApOworCQkJCX0gZWxzZSB7CisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlNTSUQgICAgICAgICAgICA6ICVzLlxuIiwgIkFOWSIgKTsKKwkJCQl9CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJcbiIgKTsKKworCQkJCS8qIENvcHkgdGhlIGluZm8gdG8gdGhlIFNjYW5SZXN1bHQgc3RydWN0dXJlIGluIHRoZSBwcml2YXRlCisJCQkJICAgYWRhcHRlciBzdHJ1Y3QgKi8KKwkJCQltZW1jcHkoICYoIGxwLT5zY2FuX3Jlc3VsdHMuQVBUYWJsZVtudW1fYXBzXSksICYoIGFwc1tudW1fYXBzXSApLAorCQkJCQkJc2l6ZW9mKCBTQ0FOX1JTX1NUUkNUICkpOworCQkJfQorCisJCQkvKiBTZXQgc2NhbiByZXN1bHQgdG8gdHJ1ZSBzbyB0aGF0IGFueSBzY2FuIHJlcXVlc3RzIHdpbGwKKwkJCSAgIGNvbXBsZXRlICovCisJCQlscC0+c2Nhbl9yZXN1bHRzLnNjYW5fY29tcGxldGUgPSBUUlVFOworCQl9CisKKwkJYnJlYWs7CisJICBjYXNlIENGR19BQ1NfU0NBTjoKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0FDU19TQ0FOXG4iICk7CisKKwkJeworCQkJUFJPQkVfUkVTUCAgKnByb2JlX3JzcCA9IChQUk9CRV9SRVNQICopbHR2OworCQkJaGNmXzggICAgICAgKndwYV9pZSA9IE5VTEw7CisJCQloY2ZfMTYgICAgICB3cGFfaWVfbGVuID0gMDsKKworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSA9PT09PT09PT09PT09PT09PT09PT09PT09XG4iLAorCQkJCQkgICBscC0+ZGV2LT5uYW1lICk7CisKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgbGVuZ3RoICAgICAgOiAweCUwNHguXG4iLAorCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPmxlbmd0aCApOworCisJCQlpZiAoIHByb2JlX3JzcC0+bGVuZ3RoID4gMSApIHsKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGluZm9UeXBlICAgIDogMHglMDR4LlxuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+aW5mb1R5cGUgKTsKKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgc2lnbmFsICAgICAgOiAweCUwMnguXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5zaWduYWwgKTsKKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgc2lsZW5jZSAgICAgOiAweCUwMnguXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5zaWxlbmNlICk7CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIHJ4RmxvdyAgICAgIDogMHglMDJ4LlxuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+cnhGbG93ICk7CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIHJhdGUgICAgICAgIDogMHglMDJ4LlxuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+cmF0ZSApOworCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBmcmFtZSBjbnRsICA6IDB4JTA0eC5cbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPmZyYW1lQ29udHJvbCApOworCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBkdXJJRCAgICAgICA6IDB4JTA0eC5cbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPmR1cklEICk7CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGFkZHJlc3MxICAgIDogJXNcbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBEYmdId0FkZHIoIHByb2JlX3JzcC0+YWRkcmVzczEgKSk7CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGFkZHJlc3MyICAgIDogJXNcbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBEYmdId0FkZHIoIHByb2JlX3JzcC0+YWRkcmVzczIgKSk7CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIEJTU0lEICAgICAgIDogJXNcbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBEYmdId0FkZHIoIHByb2JlX3JzcC0+QlNTSUQgKSk7CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIHNlcXVlbmNlICAgIDogMHglMDR4LlxuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+c2VxdWVuY2UgKTsKKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgYWRkcmVzczQgICAgOiAlc1xuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIERiZ0h3QWRkciggcHJvYmVfcnNwLT5hZGRyZXNzNCApKTsKKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgZGF0YWxlbmd0aCAgOiAweCUwNHguXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5kYXRhTGVuZ3RoICk7CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIERBICAgICAgICAgIDogJXNcbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBEYmdId0FkZHIoIHByb2JlX3JzcC0+REEgKSk7CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIFNBICAgICAgICAgIDogJXNcbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBEYmdId0FkZHIoIHByb2JlX3JzcC0+U0EgKSk7CisKKwkJCQkvL0RCR19UUkFDRSggRGJnSW5mbywgIiglcykgbGVuVHlwZSAgICAgOiAweCUwNHguXG4iLAorCQkJCS8vICAgICAgICAgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPmxlblR5cGUgKTsKKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgdGltZVN0YW1wICAgOiAlc1xuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIERiZ0h3QWRkciggcHJvYmVfcnNwLT50aW1lU3RhbXAgKSk7CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGJlYWNvbkludCAgIDogMHglMDR4LlxuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+YmVhY29uSW50ZXJ2YWwgKTsKKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgY2FwYWJpbGl0eSAgOiAweCUwNHguXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5jYXBhYmlsaXR5ICk7CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIFNTSUQgbGVuICAgIDogMHglMDR4LlxuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+cmF3RGF0YVsxXSApOworCisJCQkJaWYgKCBwcm9iZV9yc3AtPnJhd0RhdGFbMV0gPiAwICkgeworCQkJCQljaGFyIHNzaWRbSENGX01BWF9OQU1FX0xFTl07CisKKwkJCQkJbWVtc2V0KCBzc2lkLCAwLCBzaXplb2YoIHNzaWQgKSk7CisJCQkJCXN0cm5jcHkoIHNzaWQsICZwcm9iZV9yc3AtPnJhd0RhdGFbMl0sCisJCQkJCQkJIHByb2JlX3JzcC0+cmF3RGF0YVsxXSApOworCisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgU1NJRCAgICAgICAgOiAlc1xuIiwKKwkJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBzc2lkICk7CisJCQkJfQorCisJCQkJLyogUGFyc2Ugb3V0IHRoZSBXUEEtSUUsIGlmIG9uZSBleGlzdHMgKi8KKwkJCQl3cGFfaWUgPSB3bF9wYXJzZV93cGFfaWUoIHByb2JlX3JzcCwgJndwYV9pZV9sZW4gKTsKKwkJCQlpZiAoIHdwYV9pZSAhPSBOVUxMICkgeworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIFdQQS1JRSAgICAgIDogJXNcbiIsCisJCQkJCWxwLT5kZXYtPm5hbWUsIHdsX3ByaW50X3dwYV9pZSggd3BhX2llLCB3cGFfaWVfbGVuICkpOworCQkJCX0KKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgZmxhZ3MgICAgICAgOiAweCUwNHguXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5mbGFncyApOworCQkJfQorCisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJcblxuIiApOworCQkJLyogSWYgcHJvYmUgcmVzcG9uc2UgbGVuZ3RoIGlzIDEsIHRoZW4gdGhlIHNjYW4gaXMgY29tcGxldGUgKi8KKwkJCWlmICggcHJvYmVfcnNwLT5sZW5ndGggPT0gMSApIHsKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTQ0FOIENPTVBMRVRFXG4iICk7CisJCQkJbHAtPnByb2JlX3Jlc3VsdHMubnVtX2FwcyA9IGxwLT5wcm9iZV9udW1fYXBzOworCQkJCWxwLT5wcm9iZV9yZXN1bHRzLnNjYW5fY29tcGxldGUgPSBUUlVFOworCisJCQkJLyogUmVzZXQgdGhlIGNvdW50ZXIgZm9yIHRoZSBuZXh0IHNjYW4gcmVxdWVzdCAqLworCQkJCWxwLT5wcm9iZV9udW1fYXBzID0gMDsKKworCQkJCS8qIFNlbmQgYSB3aXJlbGVzcyBleHRlbnNpb25zIGV2ZW50IHRoYXQgdGhlIHNjYW4gY29tcGxldGVkICovCisJCQkJd2xfd2V4dF9ldmVudF9zY2FuX2NvbXBsZXRlKCBscC0+ZGV2ICk7CisJCQl9IGVsc2UgeworCQkJCS8qIE9ubHkgY29weSB0byB0aGUgdGFibGUgaWYgdGhlIGVudHJ5IGlzIHVuaXF1ZTsgQVBzIHNvbWV0aW1lcworCQkJCSAgIHJlc3BvbmQgbW9yZSB0aGFuIG9uY2UgdG8gYSBwcm9iZSAqLworCQkJCWlmICggbHAtPnByb2JlX251bV9hcHMgPT0gMCApIHsKKwkJCQkJLyogQ29weSB0aGUgaW5mbyB0byB0aGUgU2NhblJlc3VsdCBzdHJ1Y3R1cmUgaW4gdGhlIHByaXZhdGUKKwkJCQkJYWRhcHRlciBzdHJ1Y3QgKi8KKwkJCQkJbWVtY3B5KCAmKCBscC0+cHJvYmVfcmVzdWx0cy5Qcm9iZVRhYmxlW2xwLT5wcm9iZV9udW1fYXBzXSApLAorCQkJCQkJCXByb2JlX3JzcCwgc2l6ZW9mKCBQUk9CRV9SRVNQICkpOworCisJCQkJCS8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIEFQcyBkZXRlY3RlZCAqLworCQkJCQlscC0+cHJvYmVfbnVtX2FwcysrOworCQkJCX0gZWxzZSB7CisJCQkJCWludCBjb3VudDsKKwkJCQkJaW50IHVuaXF1ZSA9IDE7CisKKwkJCQkJZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgbHAtPnByb2JlX251bV9hcHM7IGNvdW50KysgKSB7CisJCQkJCQlpZiAoIG1lbWNtcCggJiggcHJvYmVfcnNwLT5CU1NJRCApLAorCQkJCQkJCWxwLT5wcm9iZV9yZXN1bHRzLlByb2JlVGFibGVbY291bnRdLkJTU0lELAorCQkJCQkJCUVUSF9BTEVOICkgPT0gMCApIHsKKwkJCQkJCQl1bmlxdWUgPSAwOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKCB1bmlxdWUgKSB7CisJCQkJCQkvKiBDb3B5IHRoZSBpbmZvIHRvIHRoZSBTY2FuUmVzdWx0IHN0cnVjdHVyZSBpbiB0aGUKKwkJCQkJCXByaXZhdGUgYWRhcHRlciBzdHJ1Y3QuIE9ubHkgY29weSBpZiB0aGVyZSdzIHJvb20gaW4gdGhlCisJCQkJCQl0YWJsZSAqLworCQkJCQkJaWYgKCBscC0+cHJvYmVfbnVtX2FwcyA8IE1BWF9OQVBTICkKKwkJCQkJCXsKKwkJCQkJCQltZW1jcHkoICYoIGxwLT5wcm9iZV9yZXN1bHRzLlByb2JlVGFibGVbbHAtPnByb2JlX251bV9hcHNdICksCisJCQkJCQkJCQlwcm9iZV9yc3AsIHNpemVvZiggUFJPQkVfUkVTUCApKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIk51bSBvZiBzY2FuIHJlc3VsdHMgZXhjZWVkcyBzdG9yYWdlLCB0cnVuY2F0aW5nXG4iICk7CisJCQkJCQl9CisKKwkJCQkJCS8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIEFQcyBkZXRlY3RlZC4gTm90ZSBJIGRvIHRoaXMKKwkJCQkJCSAgIGhlcmUgZXZlbiB3aGVuIEkgZG9uJ3QgY29weSB0aGUgcHJvYmUgcmVzcG9uc2UgdG8gdGhlCisJCQkJCQkgICBidWZmZXIgaW4gb3JkZXIgdG8gZGV0ZWN0IHRoZSBvdmVyZmxvdyBjb25kaXRpb24gKi8KKwkJCQkJCWxwLT5wcm9iZV9udW1fYXBzKys7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlicmVhazsKKworCSAgY2FzZSBDRkdfTElOS19TVEFUOgorI2RlZmluZSBscyAoKExJTktfU1RBVFVTX1NUUkNUICopbHR2KQorCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfTElOS19TVEFUXG4iICk7CisKKwkJc3dpdGNoKCBscy0+bGlua1N0YXR1cyApIHsKKwkJICBjYXNlIDE6CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJMaW5rIFN0YXR1cyA6IENvbm5lY3RlZFxuIiApOworCQkJd2xfd2V4dF9ldmVudF9hcCggbHAtPmRldiApOworCQkJYnJlYWs7CisKKwkJICBjYXNlIDI6CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJMaW5rIFN0YXR1cyA6IERpc2Nvbm5lY3RlZFxuIiAgKTsKKwkJCWJyZWFrOworCisJCSAgY2FzZSAzOgorCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTGluayBTdGF0dXMgOiBBY2Nlc3MgUG9pbnQgQ2hhbmdlXG4iICk7CisJCQlicmVhazsKKworCQkgIGNhc2UgNDoKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogQWNjZXNzIFBvaW50IE91dCBvZiBSYW5nZVxuIiApOworCQkJYnJlYWs7CisKKwkJICBjYXNlIDU6CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJMaW5rIFN0YXR1cyA6IEFjY2VzcyBQb2ludCBJbiBSYW5nZVxuIiApOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogVU5LTk9XTiAoMHglMDR4KVxuIiwKKwkJCQkJICAgbHMtPmxpbmtTdGF0dXMgKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYnJlYWs7CisjdW5kZWYgbHMKKworCSAgY2FzZSBDRkdfQVNTT0NfU1RBVDoKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0FTU09DX1NUQVRcbiIgKTsKKworCQl7CisJCQlBU1NPQ19TVEFUVVNfU1RSQ1QgKmFzID0gKEFTU09DX1NUQVRVU19TVFJDVCAqKWx0djsKKworCQkJc3dpdGNoKCBhcy0+YXNzb2NTdGF0dXMgKSB7CisJCQkgIGNhc2UgMToKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJBc3NvY2lhdGlvbiBTdGF0dXMgOiBTVEEgQXNzb2NpYXRlZFxuIiApOworCQkJCWJyZWFrOworCisJCQkgIGNhc2UgMjoKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJBc3NvY2lhdGlvbiBTdGF0dXMgOiBTVEEgUmVhc3NvY2lhdGVkXG4iICk7CisJCQkJYnJlYWs7CisKKwkJCSAgY2FzZSAzOgorCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkFzc29jaWF0aW9uIFN0YXR1cyA6IFNUQSBEaXNhc3NvY2lhdGVkXG4iICk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQXNzb2NpYXRpb24gU3RhdHVzIDogVU5LTk9XTiAoMHglMDR4KVxuIiwKKwkJCQkJCSAgIGFzLT5hc3NvY1N0YXR1cyApOworCQkJCWJyZWFrOworCQkJfQorCisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTVEEgQWRkcmVzcyAgICAgICAgOiAlc1xuIiwKKwkJCQkJICAgRGJnSHdBZGRyKCBhcy0+c3RhQWRkciApKTsKKworCQkJaWYgKCggYXMtPmFzc29jU3RhdHVzID09IDIgKSAgJiYgKCBhcy0+bGVuID09IDggKSkgeworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIk9sZCBBUCBBZGRyZXNzICAgICA6ICVzXG4iLAorCQkJCQkJICAgRGJnSHdBZGRyKCBhcy0+b2xkQXBBZGRyICkpOworCQkJfQorCQl9CisKKwkJYnJlYWs7CisKKwkgIGNhc2UgQ0ZHX1NFQ1VSSVRZX1NUQVQ6CisJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19TRUNVUklUWV9TVEFUXG4iICk7CisKKwkJeworCQkJU0VDVVJJVFlfU1RBVFVTX1NUUkNUICpzcyA9IChTRUNVUklUWV9TVEFUVVNfU1RSQ1QgKilsdHY7CisKKwkJCXN3aXRjaCggc3MtPnNlY3VyaXR5U3RhdHVzICkgeworCQkJICBjYXNlIDE6CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU2VjdXJpdHkgU3RhdHVzIDogRGlzc2Fzc29jaWF0ZSBbQVBdXG4iICk7CisJCQkJYnJlYWs7CisKKwkJCSAgY2FzZSAyOgorCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlNlY3VyaXR5IFN0YXR1cyA6IERlYXV0aGVudGljYXRlIFtBUF1cbiIgKTsKKwkJCQlicmVhazsKKworCQkJICBjYXNlIDM6CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU2VjdXJpdHkgU3RhdHVzIDogQXV0aGVudGljYXRlIEZhaWwgW1NUQV0gb3IgW0FQXVxuIiApOworCQkJCWJyZWFrOworCisJCQkgIGNhc2UgNDoKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTZWN1cml0eSBTdGF0dXMgOiBNSUMgRmFpbFxuIiApOworCQkJCWJyZWFrOworCisJCQkgIGNhc2UgNToKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTZWN1cml0eSBTdGF0dXMgOiBBc3NvY2lhdGUgRmFpbFxuIiApOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlNlY3VyaXR5IFN0YXR1cyA6IFVOS05PV04gJWRcbiIsCisJCQkJCQkgICBzcy0+c2VjdXJpdHlTdGF0dXMgKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU1RBIEFkZHJlc3MgICAgIDogJXNcbiIsIERiZ0h3QWRkciggc3MtPnN0YUFkZHIgKSk7CisKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIlJlYXNvbiAgICAgICAgICA6IDB4JTA0eCBcbiIsIHNzLT5yZWFzb24gKTsKKwkJfQorCisJCWJyZWFrOworCisJICBjYXNlIENGR19XTVA6CisJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19XTVAsIHNpemUgaXMgJWQgYnl0ZXNcbiIsIGx0di0+bGVuICk7CisJCXsKKwkJCVdNUF9SU1BfU1RSQ1QgKndtcF9yc3AgPSAoV01QX1JTUF9TVFJDVCAqKWx0djsKKworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1dNUCwgcGR1IHR5cGUgaXMgMHgleFxuIiwKKwkJCQkJICAgd21wX3JzcC0+d21wUnNwLndtcEhkci50eXBlICk7CisKKwkJCXN3aXRjaCggd21wX3JzcC0+d21wUnNwLndtcEhkci50eXBlICkgeworCQkJICBjYXNlIFdWTEFOX1dNUF9QRFVfVFlQRV9MVF9SU1A6CisJCQkJeworI2lmIERCRworCQkJCQlMSU5LVEVTVF9SU1BfU1RSQ1QgICpsdF9yc3AgPSAoTElOS1RFU1RfUlNQX1NUUkNUICopbHR2OworI2VuZGlmIC8vIERCRworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJMSU5LIFRFU1QgUkVTVUxUXG4iICk7CisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIj09PT09PT09PT09PT09PT1cbiIgKTsKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTGVuZ3RoICAgICAgICA6ICVkLlxuIiwgICAgIGx0X3JzcC0+bGVuICk7CisKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTmFtZSAgICAgICAgICA6ICVzLlxuIiwgICAgIGx0X3JzcC0+bHRSc3AubHRSc3AubmFtZSApOworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTaWduYWwgTGV2ZWwgIDogMHglMDJ4LlxuIiwgbHRfcnNwLT5sdFJzcC5sdFJzcC5zaWduYWwgKTsKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTm9pc2UgIExldmVsICA6IDB4JTAyeC5cbiIsIGx0X3JzcC0+bHRSc3AubHRSc3Aubm9pc2UgKTsKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiUmVjZWl2ZSBGbG93ICA6IDB4JTAyeC5cbiIsIGx0X3JzcC0+bHRSc3AubHRSc3AucnhGbG93ICk7CisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkRhdGEgUmF0ZSAgICAgOiAweCUwMnguXG4iLCBsdF9yc3AtPmx0UnNwLmx0UnNwLmRhdGFSYXRlICk7CisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlByb3RvY29sICAgICAgOiAweCUwNHguXG4iLCBsdF9yc3AtPmx0UnNwLmx0UnNwLnByb3RvY29sICk7CisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlN0YXRpb24gICAgICAgOiAweCUwMnguXG4iLCBsdF9yc3AtPmx0UnNwLmx0UnNwLnN0YXRpb24gKTsKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRGF0YSBSYXRlIENhcCA6IDB4JTAyeC5cbiIsIGx0X3JzcC0+bHRSc3AubHRSc3AuZGF0YVJhdGVDYXAgKTsKKworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJQb3dlciBNZ210ICAgIDogMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4LlxuIiwKKwkJCQkJCQkJbHRfcnNwLT5sdFJzcC5sdFJzcC5wb3dlck1nbXRbMF0sCisJCQkJCQkJCWx0X3JzcC0+bHRSc3AubHRSc3AucG93ZXJNZ210WzFdLAorCQkJCQkJCQlsdF9yc3AtPmx0UnNwLmx0UnNwLnBvd2VyTWdtdFsyXSwKKwkJCQkJCQkJbHRfcnNwLT5sdFJzcC5sdFJzcC5wb3dlck1nbXRbM10gKTsKKworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJSb2J1c3RuZXNzICAgIDogMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4LlxuIiwKKwkJCQkJCQkJbHRfcnNwLT5sdFJzcC5sdFJzcC5yb2J1c3RuZXNzWzBdLAorCQkJCQkJCQlsdF9yc3AtPmx0UnNwLmx0UnNwLnJvYnVzdG5lc3NbMV0sCisJCQkJCQkJCWx0X3JzcC0+bHRSc3AubHRSc3Aucm9idXN0bmVzc1syXSwKKwkJCQkJCQkJbHRfcnNwLT5sdFJzcC5sdFJzcC5yb2J1c3RuZXNzWzNdICk7CisKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU2NhbGluZyAgICAgICA6IDB4JTAyeC5cbiIsIGx0X3JzcC0+bHRSc3AubHRSc3Auc2NhbGluZyApOworCQkJCX0KKworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJYnJlYWs7CisKKwkgIGNhc2UgQ0ZHX05VTEw6CisJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19OVUxMXG4iICk7CisJCWJyZWFrOworCisJICBjYXNlIENGR19VUERBVEVEX0lORk9fUkVDT1JEOiAgICAgICAgLy8gVXBkYXRlZCBJbmZvcm1hdGlvbiBSZWNvcmQKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiVVBEQVRFRCBJTkZPUk1BVElPTiBSRUNPUkRcbiIgKTsKKworCQlsdHZfdmFsID0gQ05WX0lOVF9UT19MSVRUTEUoIGx0di0+dS51MTZbMF0gKTsKKworCQkvKiBDaGVjayBhbmQgc2VlIHdoaWNoIFJJRCB3YXMgdXBkYXRlZCAqLworCQlzd2l0Y2goIGx0dl92YWwgKSB7CisJCSAgY2FzZSBDRkdfQ1VSX0NPVU5UUllfSU5GTzogIC8vIEluZGljYXRlIFBhc3NpdmUgU2NhbiBDb21wbGV0aW9uCisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJVcGRhdGVkIGNvdW50cnkgaW5mb1xuIiApOworCisJCQkvKiBEbyBJIG5lZWQgdG8gaG9sZCBvZmYgb24gdXBkYXRpbmcgUklEcyB1bnRpbCB0aGUgcHJvY2VzcyBpcworCQkJICAgY29tcGxldGU/ICovCisJCQl3bF9jb25uZWN0KCBscCApOworCQkJYnJlYWs7CisKKwkJICBjYXNlIENGR19QT1JUX1NUQVQ6ICAgIC8vIFdhaXQgZm9yIENvbm5lY3QgRXZlbnQKKwkJCS8vd2xfY29ubmVjdCggbHAgKTsKKworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiVW5rbm93biBSSUQ6IDB4JTA0eFxuIiwgbHR2X3ZhbCApOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJVTktOT1dOIE1FU1NBR0U6IDB4JTA0eFxuIiwgbHR2LT50eXAgKTsKKwkJYnJlYWs7CisJfQorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybjsKK30gLy8gd2xfcHJvY2Vzc19tYWlsYm94CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2VuZGlmICAvKiBpZm5kZWYgVVNFX01CT1hfU1lOQyAqLworCisjaWZkZWYgVVNFX1dEUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dkc19uZXRkZXZfcmVnaXN0ZXIoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyBuZXRfZGV2aWNlIHN0cnVjdHVyZXMgd2l0aCB0aGUgc3lzdGVtJ3MgbmV0d29yaworICogICAgICBsYXllciBmb3IgdXNlIHdpdGggdGhlIFdEUyBwb3J0cy4KKyAqCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgICAgIC0gcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfd2RzX25ldGRldl9yZWdpc3Rlciggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgY291bnQ7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid2xfd2RzX25ldGRldl9yZWdpc3RlciIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKwkvLzs/d2h5IGlzIHRoZXJlIG5vIFVTRV9XRFMgY2xhdXNlIGxpa2UgaW4gd2xfZW5hYmxlX3dkc19wb3J0cworCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVAgICkgeworCQlmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgeworCQkJaWYgKCBXVkxBTl9WQUxJRF9NQUNfQUREUkVTUyggbHAtPndkc19wb3J0W2NvdW50XS53ZHNBZGRyZXNzICkpIHsKKwkJCQlpZiAoIHJlZ2lzdGVyX25ldGRldiggbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKSAhPSAwICkgeworCQkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIm5ldCBkZXZpY2UgZm9yIFdEUyBwb3J0ICVkIGNvdWxkIG5vdCBiZSByZWdpc3RlcmVkXG4iLAorCQkJCQkJCQkoIGNvdW50ICsgMSApKTsKKwkJCQl9CisJCQkJbHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkID0gVFJVRTsKKworCQkJCS8qIEZpbGwgb3V0IHRoZSBuZXRfZGV2aWNlIHN0cnVjdHMgd2l0aCB0aGUgTUFDIGFkZHIgKi8KKwkJCQltZW1jcHkoIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2LT5kZXZfYWRkciwgbHAtPk1BQ0FkZHJlc3MsIEVUSF9BTEVOICk7CisJCQkJbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPmFkZHJfbGVuID0gRVRIX0FMRU47CisJCQl9CisJCX0KKwl9CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuOworfSAvLyB3bF93ZHNfbmV0ZGV2X3JlZ2lzdGVyCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZHNfbmV0ZGV2X2RlcmVnaXN0ZXIoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIGRlcmVnaXN0ZXJzIHRoZSBXRFMgbmV0X2RldmljZSBzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlCisgKiAgICAgIHN5c3RlbSdzIG5ldHdvcmsgbGF5ZXIuCisgKgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3dkc19uZXRkZXZfZGVyZWdpc3Rlciggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgY291bnQ7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid2xfd2RzX25ldGRldl9kZXJlZ2lzdGVyIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVAgICkgeworCQlmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgeworCQkJaWYgKCBXVkxBTl9WQUxJRF9NQUNfQUREUkVTUyggbHAtPndkc19wb3J0W2NvdW50XS53ZHNBZGRyZXNzICkpIHsKKwkJCQl1bnJlZ2lzdGVyX25ldGRldiggbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKTsKKwkJCX0KKwkJCWxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCA9IEZBTFNFOworCQl9CisJfQorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybjsKK30gLy8gd2xfd2RzX25ldGRldl9kZXJlZ2lzdGVyCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2VuZGlmICAvKiBVU0VfV0RTICovCisKKworI2lmIDAgLy9TQ1VMTF9VU0VfUFJPQyAvKiBkb24ndCB3YXN0ZSBzcGFjZSBpZiB1bnVzZWQgKi8KKy8qCisgKiBUaGUgcHJvYyBmaWxlc3lzdGVtOiBmdW5jdGlvbiB0byByZWFkIGFuZCBlbnRyeQorICovCitpbnQgcHJpbnRmX2hjZl8xNiggY2hhciAqcywgY2hhciAqYnVmLCBoY2ZfMTYqIHAsIGludCBuICk7CitpbnQgcHJpbnRmX2hjZl8xNiggY2hhciAqcywgY2hhciAqYnVmLCBoY2ZfMTYqIHAsIGludCBuICkgeworCitpbnQgaSwgbGVuOworCisJbGVuID0gc3ByaW50ZihidWYsICIlcyIsIHMgKTsKKwl3aGlsZSAoIGxlbiA8IDIwICkgbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiAiICk7CisJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiOiAiICk7CisJZm9yICggaSA9IDA7IGkgPCBuOyBpKysgKSB7CisJCWlmICggbGVuICUgODAgPiA3NSApIHsKKwkJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlxuIiApOworCQl9CisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIiUwNFggIiwgcFtpXSApOworCX0KKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJcbiIgKTsKKwlyZXR1cm4gbGVuOworfSAvLyBwcmludGZfaGNmXzE2CisKK2ludCBwcmludGZfaGNmXzgoIGNoYXIgKnMsIGNoYXIgKmJ1ZiwgaGNmXzgqIHAsIGludCBuICk7CitpbnQgcHJpbnRmX2hjZl84KCBjaGFyICpzLCBjaGFyICpidWYsIGhjZl84KiBwLCBpbnQgbiApIHsKKworaW50IGksIGxlbjsKKworCWxlbiA9IHNwcmludGYoYnVmLCAiJXMiLCBzICk7CisJd2hpbGUgKCBsZW4gPCAyMCApIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIgIiApOworCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIjogIiApOworCWZvciAoIGkgPSAwOyBpIDw9IG47IGkrKyApIHsKKwkJaWYgKCBsZW4gJSA4MCA+IDc3ICkgeworCQkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiXG4iICk7CisJCX0KKwkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiJTAyWCAiLCBwW2ldICk7CisJfQorCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlxuIiApOworCXJldHVybiBsZW47Cit9IC8vIHByaW50Zl9oY2Y4CisKK2ludCBwcmludGZfc3RyY3QoIGNoYXIgKnMsIGNoYXIgKmJ1ZiwgaGNmXzE2KiBwICk7CitpbnQgcHJpbnRmX3N0cmN0KCBjaGFyICpzLCBjaGFyICpidWYsIGhjZl8xNiogcCApIHsKKworaW50IGksIGxlbjsKKworCWxlbiA9IHNwcmludGYoYnVmLCAiJXMiLCBzICk7CisJd2hpbGUgKCBsZW4gPCAyMCApIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIgIiApOworCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIjogIiApOworCWZvciAoIGkgPSAwOyBpIDw9ICpwOyBpKysgKSB7CisJCWlmICggbGVuICUgODAgPiA3NSApIHsKKwkJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlxuIiApOworCQl9CisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIiUwNFggIiwgcFtpXSApOworCX0KKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJcbiIgKTsKKwlyZXR1cm4gbGVuOworfSAvLyBwcmludGZfc3RyY3QKKworaW50IHNjdWxsX3JlYWRfcHJvY21lbShjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSApCit7CisJc3RydWN0IHdsX3ByaXZhdGUJKmxwID0gTlVMTDsKKwlJRkJQCQkJCWlmYnA7CisgICAJQ0ZHX0hFUk1FU19UQUxMSUVTX1NUUkNUICpwOworCisgICAgI2RlZmluZSBMSU1JVCAoUEFHRV9TSVpFLTgwKSAvKiBkb24ndCBwcmludCBhbnkgbW9yZSBhZnRlciB0aGlzIHNpemUgKi8KKworICAgIGxlbj0wOworCisJaWYgKCAoIGxwID0gKChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpLT5wcml2ICkgPT0gTlVMTCApIHsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiTm8gd2xfcHJpdmF0ZSBpbiBzY3VsbF9yZWFkX3Byb2NtZW1cbiIgKTsKKwl9IGVsc2UgaWYgKCBscC0+d2xhZ3M0OV90eXBlID09IDAgKXsKKyAgIAkgICAgaWZicCA9ICZscC0+aGNmQ3R4OworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJNYWdpYzogICAgICAgICAgICAgICAweCUwNFhcbiIsIGlmYnAtPklGQl9NYWdpYyApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJJT0Jhc2U6ICAgICAgICAgICAgICAweCUwNFhcbiIsIGlmYnAtPklGQl9JT0Jhc2UgKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiTGlua1N0YXQ6ICAgICAgICAgICAgMHglMDRYXG4iLCBpZmJwLT5JRkJfTGlua1N0YXQgKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiRFNMaW5rU3RhdDogICAgICAgICAgMHglMDRYXG4iLCBpZmJwLT5JRkJfRFNMaW5rU3RhdCApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUaWNrSW5pOiAgICAgICAgIDB4JTA4bFhcbiIsIGlmYnAtPklGQl9UaWNrSW5pICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlRpY2tDbnQ6ICAgICAgICAgICAgIDB4JTA0WFxuIiwgaWZicC0+SUZCX1RpY2tDbnQgKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiSW50T2ZmQ250OiAgICAgICAgICAgMHglMDRYXG4iLCBpZmJwLT5JRkJfSW50T2ZmQ250ICk7CisJCWxlbiArPSBwcmludGZfaGNmXzE2KCAiSUZCX0ZXSWRlbnRpdHkiLCAmYnVmW2xlbl0sCisJCQkJCQkJICAmaWZicC0+SUZCX0ZXSWRlbnRpdHkubGVuLCBpZmJwLT5JRkJfRldJZGVudGl0eS5sZW4gKyAxICk7CisJfSBlbHNlIGlmICggbHAtPndsYWdzNDlfdHlwZSA9PSAxICkgeworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJDaGFubmVsOiAgICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+Q2hhbm5lbCApOworLyoqKioqKiBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJzbG9jazogICAgICAgICAgICAgICAgICAlZFxuIiwgbHAtPnNsb2NrICk7CQkqLworLy94CQlzdHJ1Y3QgdHFfc3RydWN0ICAgICAgICAgICAgInRhc2s6ICAgICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+dGFzayApOworLy94CQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAgICAgInN0YXRzOiAgICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+c3RhdHMgKTsKKyNpZmRlZiBXSVJFTEVTU19FWFQKKy8veAkJc3RydWN0IGl3X3N0YXRpc3RpY3MgICAgICAgICJ3c3RhdHM6ICAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPndzdGF0cyApOworLy94ICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJzcHlfbnVtYmVyOiAgICAgICAgICAgMHglMDRYXG4iLCBscC0+c3B5X251bWJlciApOworLy94CQl1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgc3B5X2FkZHJlc3NbSVdfTUFYX1NQWV1bRVRIX0FMRU5dOworLy94CQlzdHJ1Y3QgaXdfcXVhbGl0eSAgICAgICAgICAgc3B5X3N0YXRbSVdfTUFYX1NQWV07CisjZW5kaWYgLy8gV0lSRUxFU1NfRVhUCisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIklGQjogICAgICAgICAgICAgICAgICAweCVwXG4iLCAmbHAtPmhjZkN0eCApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJmbGFnczogICAgICAgICAgICAgICAgJSMuOGxYXG4iLCBscC0+ZmxhZ3MgKTsgIC8vOz91c2UgdGhpcyBmb3JtYXQgZnJvbSBub3cgb24KKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiRGVidWdGbGFnKHdsX3ByaXZhdGUpIDB4JTA0WFxuIiwgbHAtPkRlYnVnRmxhZyApOworI2lmIERCRworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJEZWJ1Z0ZsYWcgKERiZ0luZm8pOiAgIDB4JTA4bFhcbiIsIERiZ0luZm8tPkRlYnVnRmxhZyApOworI2VuZGlmIC8vIERCRworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJpc19yZWdpc3RlcmVkOiAgICAgICAgMHglMDRYXG4iLCBscC0+aXNfcmVnaXN0ZXJlZCApOworLy94CQlDRkdfRFJWX0lORk9fU1RSQ1QgICAgICAgICAgImRyaXZlckluZm86ICAgICAgICAgMHglMDRYXG4iLCBscC0+ZHJpdmVySW5mbyApOworCQlsZW4gKz0gcHJpbnRmX3N0cmN0KCAiZHJpdmVySW5mbyIsICZidWZbbGVuXSwgKGhjZl8xNiopJmxwLT5kcml2ZXJJbmZvICk7CisvL3gJCUNGR19JREVOVElUWV9TVFJDVCAgICAgICAgICAiZHJpdmVySWRlbnRpdHk6ICAgICAweCUwNFhcbiIsIGxwLT5kcml2ZXJJZGVudGl0eSApOworCQlsZW4gKz0gcHJpbnRmX3N0cmN0KCAiZHJpdmVySWRlbnRpdHkiLCAmYnVmW2xlbl0sIChoY2ZfMTYqKSZscC0+ZHJpdmVySWRlbnRpdHkgKTsKKy8veAkJQ0ZHX0ZXX0lERU5USVRZX1NUUkNUICAgICAgICJTdGF0aW9uSWRlbnRpdHk6ICAgIDB4JTA0WFxuIiwgbHAtPlN0YXRpb25JZGVudGl0eSApOworCQlsZW4gKz0gcHJpbnRmX3N0cmN0KCAiU3RhdGlvbklkZW50aXR5IiwgJmJ1ZltsZW5dLCAoaGNmXzE2KikmbHAtPlN0YXRpb25JZGVudGl0eSApOworLy94CQlDRkdfUFJJX0lERU5USVRZX1NUUkNUICAgICAgIlByaW1hcnlJZGVudGl0eTogICAgMHglMDRYXG4iLCBscC0+UHJpbWFyeUlkZW50aXR5ICk7CisJCWxlbiArPSBwcmludGZfc3RyY3QoICJQcmltYXJ5SWRlbnRpdHkiLCAmYnVmW2xlbl0sIChoY2ZfMTYqKSZscC0+aGNmQ3R4LklGQl9QUklJZGVudGl0eSApOworCQlsZW4gKz0gcHJpbnRmX3N0cmN0KCAiUHJpbWFyeVN1cHBsaWVyIiwgJmJ1ZltsZW5dLCAoaGNmXzE2KikmbHAtPmhjZkN0eC5JRkJfUFJJU3VwICk7CisvL3gJCUNGR19QUklfSURFTlRJVFlfU1RSQ1QgICAgICAiTklDSWRlbnRpdHk6ICAgICAgICAweCUwNFhcbiIsIGxwLT5OSUNJZGVudGl0eSApOworCQlsZW4gKz0gcHJpbnRmX3N0cmN0KCAiTklDSWRlbnRpdHkiLCAmYnVmW2xlbl0sIChoY2ZfMTYqKSZscC0+TklDSWRlbnRpdHkgKTsKKy8veAkJbHR2X3QgICAgICAgICAgICAgICAgICAgICAgICJsdHZSZWNvcmQ6ICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPmx0dlJlY29yZCApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJ0eEJ5dGVzOiAgICAgICAgICAgICAgMHglMDhsWFxuIiwgbHAtPnR4Qnl0ZXMgKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwibWF4UG9ydDogICAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPm1heFBvcnQgKTsgICAgICAgIC8qIDAgZm9yIFNUQSwgNiBmb3IgQVAgKi8KKwkvKiBFbGVtZW50cyB1c2VkIGZvciBhc3luYyBub3RpZmljYXRpb24gZnJvbSBoYXJkd2FyZSAqLworLy94CQlSSURfTE9HX1NUUkNUCQkJCVJpZExpc3RbMTBdOworLy94CQlsdHZfdCAgICAgICAgICAgICAgICAgICAgICAgInVwZGF0ZWRSZWNvcmQ6ICAgICAgMHglMDRYXG4iLCBscC0+dXBkYXRlZFJlY29yZCApOworLy94CQlQUk9CRV9SRVNQCQkJCSAgICAiUHJvYmVSZXNwOiAgICAgICAgICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+UHJvYmVSZXNwICk7CisvL3gJCUFTU09DX1NUQVRVU19TVFJDVCAgICAgICAgICAiYXNzb2Nfc3RhdDogICAgICAgICAweCUwNFhcbiIsIGxwLT5hc3NvY19zdGF0ICk7CisvL3gJCVNFQ1VSSVRZX1NUQVRVU19TVFJDVCAgICAgICAic2VjX3N0YXQ6ICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5zZWNfc3RhdCApOworLy94CQl1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgbG9va0FoZWFkQnVmW1dWTEFOX01BWF9MT09LQUhFQURdOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJQb3J0VHlwZTogICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+UG9ydFR5cGUgKTsgICAgICAgICAgIC8vIDEgLSAzICgxIFtOb3JtYWxdIHwgMyBbQWRIb2NdKQorICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJDaGFubmVsOiAgICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+Q2hhbm5lbCApOyAgICAgICAgICAgIC8vIDAgLSAxNCAoMCkKKy8veAkJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIFR4UmF0ZUNvbnRyb2xbMl07CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlR4UmF0ZUNvbnRyb2xbMl06ICAgICAweCUwNFggMHglMDRYXG4iLAorCQkJCQkJbHAtPlR4UmF0ZUNvbnRyb2xbMF0sIGxwLT5UeFJhdGVDb250cm9sWzFdICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkRpc3RhbmNlQmV0d2VlbkFQczogICAweCUwNFhcbiIsIGxwLT5EaXN0YW5jZUJldHdlZW5BUHMgKTsgLy8gMSAtIDMgKDEpCisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlJUU1RocmVzaG9sZDogICAgICAgICAweCUwNFhcbiIsIGxwLT5SVFNUaHJlc2hvbGQgKTsgICAgICAgLy8gMCAtIDIzNDcgKDIzNDcpCisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlBNRW5hYmxlZDogICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5QTUVuYWJsZWQgKTsgICAgICAgICAgLy8gMCAtIDIsIDgwMDEgLSA4MDAyICgwKQorICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJNaWNyb3dhdmVSb2J1c3RuZXNzOiAgMHglMDRYXG4iLCBscC0+TWljcm93YXZlUm9idXN0bmVzcyApOy8vIDAgLSAxICgwKQorICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJDcmVhdGVJQlNTOiAgICAgICAgICAgMHglMDRYXG4iLCBscC0+Q3JlYXRlSUJTUyApOyAgICAgICAgIC8vIDAgLSAxICgwKQorICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJNdWx0aWNhc3RSZWNlaXZlOiAgICAgMHglMDRYXG4iLCBscC0+TXVsdGljYXN0UmVjZWl2ZSApOyAgIC8vIDAgLSAxICgxKQorICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJNYXhTbGVlcER1cmF0aW9uOiAgICAgMHglMDRYXG4iLCBscC0+TWF4U2xlZXBEdXJhdGlvbiApOyAgIC8vIDAgLSA2NTUzNSAoMTAwKQorLy94CQloY2ZfOCAgICAgICAgICAgICAgICAgICAgICAgTUFDQWRkcmVzc1tFVEhfQUxFTl07CisJCWxlbiArPSBwcmludGZfaGNmXzgoICJNQUNBZGRyZXNzIiwgJmJ1ZltsZW5dLCBscC0+TUFDQWRkcmVzcywgRVRIX0FMRU4gKTsKKy8veAkJY2hhciAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtOYW1lW0hDRl9NQVhfTkFNRV9MRU4rMV07CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIk5ldHdvcmtOYW1lOiAgICAgICAgICAlLjMyc1xuIiwgbHAtPk5ldHdvcmtOYW1lICk7CisvL3gJCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBTdGF0aW9uTmFtZVtIQ0ZfTUFYX05BTUVfTEVOKzFdOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJFbmFibGVFbmNyeXB0aW9uOiAgICAgMHglMDRYXG4iLCBscC0+RW5hYmxlRW5jcnlwdGlvbiApOyAgIC8vIDAgLSAxICgwKQorLy94CQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgS2V5MVtNQVhfS0VZX0xFTisxXTsKKwkJbGVuICs9IHByaW50Zl9oY2ZfOCggIktleTEiLCAmYnVmW2xlbl0sIGxwLT5LZXkxLCBNQVhfS0VZX0xFTiApOworLy94CQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgS2V5MltNQVhfS0VZX0xFTisxXTsKKy8veAkJY2hhciAgICAgICAgICAgICAgICAgICAgICAgIEtleTNbTUFYX0tFWV9MRU4rMV07CisvL3gJCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBLZXk0W01BWF9LRVlfTEVOKzFdOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUcmFuc21pdEtleUlEOiAgICAgICAgMHglMDRYXG4iLCBscC0+VHJhbnNtaXRLZXlJRCApOyAgICAgIC8vIDEgLSA0ICgxKQorLy94CQlDRkdfREVGQVVMVF9LRVlTX1NUUkNUCSAgICAiRGVmYXVsdEtleXM6ICAgICAgICAgMHglMDRYXG4iLCBscC0+RGVmYXVsdEtleXMgKTsKKy8veAkJdV9jaGFyICAgICAgICAgICAgICAgICAgICAgIG1haWxib3hbTUJfU0laRV07CisvL3gJCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBzekVuY3J5cHRpb25bTUFYX0VOQ19MRU5dOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJkcml2ZXJFbmFibGU6ICAgICAgICAgMHglMDRYXG4iLCBscC0+ZHJpdmVyRW5hYmxlICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIndvbGFzRW5hYmxlOiAgICAgICAgICAweCUwNFhcbiIsIGxwLT53b2xhc0VuYWJsZSApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJhdGltV2luZG93OiAgICAgICAgICAgMHglMDRYXG4iLCBscC0+YXRpbVdpbmRvdyApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJob2xkb3ZlckR1cmF0aW9uOiAgICAgMHglMDRYXG4iLCBscC0+aG9sZG92ZXJEdXJhdGlvbiApOworLy94CQloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgTXVsdGljYXN0UmF0ZVsyXTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiYXV0aGVudGljYXRpb246ICAgICAgIDB4JTA0WFxuIiwgbHAtPmF1dGhlbnRpY2F0aW9uICk7IC8vIGlzIHRoaXMgQVAgc3BlY2lmaWM/CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sInByb21pc2N1b3VzTW9kZTogICAgICAweCUwNFhcbiIsIGxwLT5wcm9taXNjdW91c01vZGUgKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiRG93bmxvYWRGaXJtd2FyZTogICAgIDB4JTA0WFxuIiwgbHAtPkRvd25sb2FkRmlybXdhcmUgKTsgICAvLyAwIC0gMiAoMCBbTm9uZV0gfCAxIFtTVEFdIHwgMiBbQVBdKQorICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJBdXRoS2V5TWdtdFN1aXRlOiAgICAgMHglMDRYXG4iLCBscC0+QXV0aEtleU1nbXRTdWl0ZSApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJsb2FkQmFsYW5jaW5nOiAgICAgICAgMHglMDRYXG4iLCBscC0+bG9hZEJhbGFuY2luZyApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJtZWRpdW1EaXN0cmlidXRpb246ICAgMHglMDRYXG4iLCBscC0+bWVkaXVtRGlzdHJpYnV0aW9uICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sInR4UG93TGV2ZWw6ICAgICAgICAgICAweCUwNFhcbiIsIGxwLT50eFBvd0xldmVsICk7CisvLyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwic2hvcnRSZXRyeUxpbWl0OiAgICAweCUwNFhcbiIsIGxwLT5zaG9ydFJldHJ5TGltaXQgKTsKKy8vICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJsb25nUmV0cnlMaW1pdDogICAgIDB4JTA0WFxuIiwgbHAtPmxvbmdSZXRyeUxpbWl0ICk7CisvL3gJCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBzcnNjWzJdOworLy94CQloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgYnJzY1syXTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiY29ubmVjdGlvbkNvbnRyb2w6ICAgIDB4JTA0WFxuIiwgbHAtPmNvbm5lY3Rpb25Db250cm9sICk7CisvL3gJCS8vaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIHByb2JlRGF0YVJhdGVzWzJdOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJvd25CZWFjb25JbnRlcnZhbDogICAgMHglMDRYXG4iLCBscC0+b3duQmVhY29uSW50ZXJ2YWwgKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiY29leGlzdGVuY2U6ICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPmNvZXhpc3RlbmNlICk7CisvL3gJCVdWTEFOX0ZSQU1FICAgICAgICAgICAgICAgICAidHhGOiAgICAgICAgICAgICAgICAweCUwNFhcbiIsIGxwLT50eEYgKTsKKy8veAkJV1ZMQU5fTEZSQU1FICAgICAgICAgICAgICAgIHR4TGlzdFtERUZBVUxUX05VTV9UWF9GUkFNRVNdOworLy94CQlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgInR4RnJlZTogICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+dHhGcmVlICk7CisvL3gJCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICB0eFFbV1ZMQU5fTUFYX1RYX1FVRVVFU107CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIm5ldGlmX3F1ZXVlX29uOiAgICAgICAweCUwNFhcbiIsIGxwLT5uZXRpZl9xdWV1ZV9vbiApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJ0eFFfY291bnQ6ICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+dHhRX2NvdW50ICk7CisvL3gJCURFU0NfU1RSQ1QgICAgICAgICAgICAgICAgICAiZGVzY19yeDogICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5kZXNjX3J4ICk7CisvL3gJCURFU0NfU1RSQ1QgICAgICAgICAgICAgICAgICAiZGVzY190eDogICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5kZXNjX3R4ICk7CisvL3gJCVdWTEFOX1BPUlRfU1RBVEUgICAgICAgICAgICAicG9ydFN0YXRlOiAgICAgICAgICAweCUwNFhcbiIsIGxwLT5wb3J0U3RhdGUgKTsKKy8veAkJU2NhblJlc3VsdCAgICAgICAgICAgICAgICAgICJzY2FuX3Jlc3VsdHM6ICAgICAgIDB4JTA0WFxuIiwgbHAtPnNjYW5fcmVzdWx0cyApOworLy94CQlQcm9iZVJlc3VsdCAgICAgICAgICAgICAgICAgInByb2JlX3Jlc3VsdHM6ICAgICAgMHglMDRYXG4iLCBscC0+cHJvYmVfcmVzdWx0cyApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJwcm9iZV9udW1fYXBzOiAgICAgICAgMHglMDRYXG4iLCBscC0+cHJvYmVfbnVtX2FwcyApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJ1c2VfZG1hOiAgICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+dXNlX2RtYSApOworLy94CQlETUFfU1RSQ1QgICAgICAgICAgICAgICAgICAgImRtYTogICAgICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+ZG1hICk7CisjaWZkZWYgVVNFX1JUUworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJ1c2VSVFM6ICAgICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+dXNlUlRTICk7CisjZW5kaWYgIC8vIFVTRV9SVFMKKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisJCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAorCQkvLzs/SSBndWVzcyBub3QuIFRoaXMgc2hvdWxkIGJlIGJyb3VnaHQgdW5kZXIgRGVidWcgbW9kZSBvbmx5CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkRUSU1QZXJpb2Q6ICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5EVElNUGVyaW9kICk7ICAgICAgICAgLy8gMSAtIDI1NSAoMSkKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwibXVsdGljYXN0UE1CdWZmZXJpbmc6IDB4JTA0WFxuIiwgbHAtPm11bHRpY2FzdFBNQnVmZmVyaW5nICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlJlamVjdEFueTogICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5SZWplY3RBbnkgKTsgICAgICAgICAgLy8gMCAtIDEgKDApCisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkV4Y2x1ZGVVbmVuY3J5cHRlZDogICAweCUwNFhcbiIsIGxwLT5FeGNsdWRlVW5lbmNyeXB0ZWQgKTsgLy8gMCAtIDEgKDEpCisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sImludHJhQlNTUmVsYXk6ICAgICAgICAweCUwNFhcbiIsIGxwLT5pbnRyYUJTU1JlbGF5ICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIndsYWdzNDlfdHlwZTogICAgICAgICAgICAgMHglMDhsWFxuIiwgbHAtPndsYWdzNDlfdHlwZSApOworI2lmZGVmIFVTRV9XRFMKKy8veAkJV1ZMQU5fV0RTX0lGICAgICAgICAgICAgICAgIHdkc19wb3J0W05VTV9XRFNfUE9SVFNdOworI2VuZGlmIC8vIFVTRV9XRFMKKyNlbmRpZiAvLyBIQ0ZfQVAKKwl9IGVsc2UgaWYgKCBscC0+d2xhZ3M0OV90eXBlID09IDIgKXsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwidGFsbGllcyB0byBiZSBhZGRlZFxuIiApOworLy9IZXJtZXMgVGFsbGllcyAoSUZCIHN1YnN0cnVjdHVyZSkgeworICAgCSAgICBwID0gJmxwLT5oY2ZDdHguSUZCX05JQ19UYWxsaWVzOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUeFVuaWNhc3RGcmFtZXM6ICAgICAgICAgICUwOGxYXG4iLCBwLT5UeFVuaWNhc3RGcmFtZXMgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVHhNdWx0aWNhc3RGcmFtZXM6ICAgICAgICAlMDhsWFxuIiwgcC0+VHhNdWx0aWNhc3RGcmFtZXMgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVHhGcmFnbWVudHM6ICAgICAgICAgICAgICAlMDhsWFxuIiwgcC0+VHhGcmFnbWVudHMgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVHhVbmljYXN0T2N0ZXRzOiAgICAgICAgICAlMDhsWFxuIiwgcC0+VHhVbmljYXN0T2N0ZXRzICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlR4TXVsdGljYXN0T2N0ZXRzOiAgICAgICAgJTA4bFhcbiIsIHAtPlR4TXVsdGljYXN0T2N0ZXRzICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlR4RGVmZXJyZWRUcmFuc21pc3Npb25zOiAgJTA4bFhcbiIsIHAtPlR4RGVmZXJyZWRUcmFuc21pc3Npb25zICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlR4U2luZ2xlUmV0cnlGcmFtZXM6ICAgICAgJTA4bFhcbiIsIHAtPlR4U2luZ2xlUmV0cnlGcmFtZXMgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVHhNdWx0aXBsZVJldHJ5RnJhbWVzOiAgICAlMDhsWFxuIiwgcC0+VHhNdWx0aXBsZVJldHJ5RnJhbWVzICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlR4UmV0cnlMaW1pdEV4Y2VlZGVkOiAgICAgJTA4bFhcbiIsIHAtPlR4UmV0cnlMaW1pdEV4Y2VlZGVkICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlR4RGlzY2FyZHM6ICAgICAgICAgICAgICAgJTA4bFhcbiIsIHAtPlR4RGlzY2FyZHMgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUnhVbmljYXN0RnJhbWVzOiAgICAgICAgICAlMDhsWFxuIiwgcC0+UnhVbmljYXN0RnJhbWVzICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlJ4TXVsdGljYXN0RnJhbWVzOiAgICAgICAgJTA4bFhcbiIsIHAtPlJ4TXVsdGljYXN0RnJhbWVzICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlJ4RnJhZ21lbnRzOiAgICAgICAgICAgICAgJTA4bFhcbiIsIHAtPlJ4RnJhZ21lbnRzICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlJ4VW5pY2FzdE9jdGV0czogICAgICAgICAgJTA4bFhcbiIsIHAtPlJ4VW5pY2FzdE9jdGV0cyApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJSeE11bHRpY2FzdE9jdGV0czogICAgICAgICUwOGxYXG4iLCBwLT5SeE11bHRpY2FzdE9jdGV0cyApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJSeEZDU0Vycm9yczogICAgICAgICAgICAgICUwOGxYXG4iLCBwLT5SeEZDU0Vycm9ycyApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJSeERpc2NhcmRzTm9CdWZmZXI6ICAgICAgICUwOGxYXG4iLCBwLT5SeERpc2NhcmRzTm9CdWZmZXIgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVHhEaXNjYXJkc1dyb25nU0E6ICAgICAgICAlMDhsWFxuIiwgcC0+VHhEaXNjYXJkc1dyb25nU0EgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUnhXRVBVbmRlY3J5cHRhYmxlOiAgICAgICAlMDhsWFxuIiwgcC0+UnhXRVBVbmRlY3J5cHRhYmxlICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlJ4TXNnSW5Nc2dGcmFnbWVudHM6ICAgICAgJTA4bFhcbiIsIHAtPlJ4TXNnSW5Nc2dGcmFnbWVudHMgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUnhNc2dJbkJhZE1zZ0ZyYWdtZW50czogICAlMDhsWFxuIiwgcC0+UnhNc2dJbkJhZE1zZ0ZyYWdtZW50cyApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJSeERpc2NhcmRzV0VQSUNWRXJyb3I6ICAgICUwOGxYXG4iLCBwLT5SeERpc2NhcmRzV0VQSUNWRXJyb3IgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUnhEaXNjYXJkc1dFUEV4Y2x1ZGVkOiAgICAlMDhsWFxuIiwgcC0+UnhEaXNjYXJkc1dFUEV4Y2x1ZGVkICk7CisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9UQUxMSUVTX0ZXCisgICAgICAgIC8vdG8gYmUgYWRkZWQgOz8KKyNlbmRpZiAvLyBIQ0ZfRVhUX1RBTExJRVNfRlcKKwl9IGVsc2UgaWYgKCBscC0+d2xhZ3M0OV90eXBlICYgMHg4MDAwICkgewkvLzs/a2x1ZGd5IGJ1dCBpdCBpcyB1bmNsZWFyIHRvIG1lIHdlcmUgZWxzZSB0byBwbGFjZSB0aGlzCisjaWYgREJHCisJCURiZ0luZm8tPkRlYnVnRmxhZyA9IGxwLT53bGFnczQ5X3R5cGUgJiAweDdGRkY7CisjZW5kaWYgLy8gREJHCisJCWxwLT53bGFnczQ5X3R5cGUgPSAwOwkJCQkvL2RlZmF1bHQgdG8gSUZCIGFnYWluIDs/CisJfSBlbHNlIHsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwidW5rbm93biB2YWx1ZSBmb3Igd2xhZ3M0OV90eXBlOiAweCUwOGxYXG4iLCBscC0+d2xhZ3M0OV90eXBlICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIjB4MDAwMCAtIElGQlxuIiApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCIweDAwMDEgLSB3bF9wcml2YXRlXG4iICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIjB4MDAwMiAtIFRhbGxpZXNcbiIgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiMHg4eHh4IC0gQ2hhbmdlIGRlYnVmZmxhZ1xuIiApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJFUlJPUiAgICAwMDAxXG5XQVJOSU5HICAwMDAyXG5OT1RJQ0UgICAwMDA0XG5UUkFDRSAgICAwMDA4XG4iICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlZFUkJPU0UgIDAwMTBcblBBUkFNICAgIDAwMjBcbkJSRUFLICAgIDAwNDBcblJYICAgICAgIDAxMDBcbiIgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVFggICAgICAgMDIwMFxuRFMgICAgICAgMDQwMFxuIiApOworCX0KKyAgICByZXR1cm4gbGVuOworfSAvLyBzY3VsbF9yZWFkX3Byb2NtZW0KKworc3RhdGljIHZvaWQgcHJvY193cml0ZShjb25zdCBjaGFyICpuYW1lLCB3cml0ZV9wcm9jX3QgKncsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICogZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShuYW1lLCBTX0lGUkVHIHwgU19JV1VTUiwgTlVMTCk7CisJaWYgKGVudHJ5KSB7CisJCWVudHJ5LT53cml0ZV9wcm9jID0gdzsKKwkJZW50cnktPmRhdGEgPSBkYXRhOworCX0KK30gLy8gcHJvY193cml0ZQorCitzdGF0aWMgaW50IHdyaXRlX2ludChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCXN0YXRpYyBjaGFyCQlwcm9jX251bWJlclsxMV07CisJdW5zaWduZWQgaW50CW5yID0gMDsKKworCURCR19GVU5DKCAid3JpdGVfaW50IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYgKGNvdW50ID4gOSkgeworCQljb3VudCA9IC1FSU5WQUw7CisJfSBlbHNlIGlmICggY29weV9mcm9tX3VzZXIocHJvY19udW1iZXIsIGJ1ZmZlciwgY291bnQpICkgeworCQljb3VudCA9IC1FRkFVTFQ7CisJfQorCWlmICAoY291bnQgPiAwICkgeworCQlwcm9jX251bWJlcltjb3VudF0gPSAwOworCQluciA9IHdsX2F0b2koIHByb2NfbnVtYmVyICk7CisgCQkqKHVuc2lnbmVkIGludCAqKWRhdGEgPSBucjsKKwkJaWYgKCBuciAmIDB4ODAwMCApIHsJLy87P2tsdWRneSBidXQgaXQgaXMgdW5jbGVhciB0byBtZSB3ZXJlIGVsc2UgdG8gcGxhY2UgdGhpcworI2lmIERCRworCQkJRGJnSW5mby0+RGVidWdGbGFnID0gbnIgJiAweDdGRkY7CisjZW5kaWYgLy8gREJHCisJCX0KKwl9CisJREJHX1BSSU5UKCAidmFsdWU6ICUwOFhcbiIsIG5yICk7CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIGNvdW50OworfSAvLyB3cml0ZV9pbnQKKworI2VuZGlmIC8qIFNDVUxMX1VTRV9QUk9DICovCisKKyNpZmRlZiBETjU1NAorI2RlZmluZSBSVU5fQVQoeCkJCShqaWZmaWVzKyh4KSkJCS8vImJvcnJvd2VkIiBmcm9tIGluY2x1ZGUvcGNtY2lhL2tfY29tcGF0LmgKKyNkZWZpbmUgRFNfT09SCTB4ODAwMAkJLy9EZWVwc2xlZXAgT3V0T2ZSYW5nZSBTdGF0dXMKKworCQlscC0+dGltZXJfb29yX2NudCA9IERTX09PUjsKKwkJaW5pdF90aW1lciggJmxwLT50aW1lcl9vb3IgKTsKKwkJbHAtPnRpbWVyX29vci5mdW5jdGlvbiA9IHRpbWVyX29vcjsKKwkJbHAtPnRpbWVyX29vci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpbHA7CisJCWxwLT50aW1lcl9vb3IuZXhwaXJlcyA9IFJVTl9BVCggMyAqIEhaICk7CisJCWFkZF90aW1lciggJmxwLT50aW1lcl9vb3IgKTsKKwkJcHJpbnRrKCAiPDU+d2xfZW5hYmxlOiAlbGRcbiIsIGppZmZpZXMgKTsJCS8vOz9yZW1vdmUgbWUgMSBkYXkKKyNlbmRpZiAvL0RONTU0CisjaWZkZWYgRE41NTQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl0aW1lcl9vb3IoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgYXJnIC0gYSB1X2xvbmcgcmVwcmVzZW50aW5nIGEgcG9pbnRlciB0byBhIGRldl9saW5rX3Qgc3RydWN0dXJlIGZvciB0aGUKKyAqICAgICAgICAgICAgZGV2aWNlIHRvIGJlIHJlbGVhc2VkLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdGltZXJfb29yKCB1X2xvbmcgYXJnICkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAqbHAgPSAoc3RydWN0IHdsX3ByaXZhdGUgKilhcmc7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggInRpbWVyX29vciIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKyAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJhcmciLCAiMHglMDhseCIsIGFyZyApOworCisJcHJpbnRrKCAiPDU+dGltZXJfb29yOiAlbGQgMHglMDRYXG4iLCBqaWZmaWVzLCBscC0+dGltZXJfb29yX2NudCApOwkJLy87P3JlbW92ZSBtZSAxIGRheQorCWxwLT50aW1lcl9vb3JfY250ICs9IDEwOworICAgIGlmICggKGxwLT50aW1lcl9vb3JfY250ICYgfkRTX09PUikgPiAzMDAgKSB7CisJCWxwLT50aW1lcl9vb3JfY250ID0gMzAwOworCX0KKwlscC0+dGltZXJfb29yX2NudCB8PSBEU19PT1I7CisJaW5pdF90aW1lciggJmxwLT50aW1lcl9vb3IgKTsKKwlscC0+dGltZXJfb29yLmZ1bmN0aW9uID0gdGltZXJfb29yOworCWxwLT50aW1lcl9vb3IuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWxwOworCWxwLT50aW1lcl9vb3IuZXhwaXJlcyA9IFJVTl9BVCggKGxwLT50aW1lcl9vb3JfY250ICYgfkRTX09PUikgKiBIWiApOworCWFkZF90aW1lciggJmxwLT50aW1lcl9vb3IgKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworfSAvLyB0aW1lcl9vb3IKKyNlbmRpZiAvL0RONTU0CisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX21haW4uaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTkzYWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbWFpbi5oCkBAIC0wLDAgKzEsMTM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgSGVhZGVyIGRlc2NyaWJpbmcgZGV2aWNlIHNwZWNpZmljIHJvdXRpbmVzIGFuZCBkcml2ZXIgaW5pdC91bi1pbml0LgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19XTF9NQUlOX0hfXworI2RlZmluZSBfX1dMX01BSU5fSF9fCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZnVuY3Rpb24gcHJvdG90eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9pbnNlcnQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKwordm9pZCB3bF9zZXRfd2VwX2tleXMoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCitpbnQgd2xfcHV0X2x0dl9pbml0KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworaW50IHdsX3B1dF9sdHYoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCitwX3UxNiB3bF9nZXRfaXJxX21hc2soIHZvaWQgKTsKKworcF9zOCAqIHdsX2dldF9pcnFfbGlzdCggdm9pZCApOworCitpbnQgd2xfcmVzZXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKworaW50IHdsX2dvKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworaW50IHdsX2FwcGx5KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworaXJxcmV0dXJuX3Qgd2xfaXNyKCBpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzICk7CisKK3ZvaWQgd2xfcmVtb3ZlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK3ZvaWQgd2xfc3VzcGVuZCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCit2b2lkIHdsX3Jlc3VtZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCit2b2lkIHdsX3JlbGVhc2UoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKworaW50IHdsX2VuYWJsZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKK2ludCB3bF9jb25uZWN0KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworaW50IHdsX2Rpc2FibGUoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCitpbnQgd2xfZGlzY29ubmVjdCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKK3ZvaWQgd2xfZW5hYmxlX3dkc19wb3J0cyggc3RydWN0IHdsX3ByaXZhdGUgKiBscCApOworCit2b2lkIHdsX2Rpc2FibGVfd2RzX3BvcnRzKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqIGxwICk7CisKKyNpZm5kZWYgVVNFX01CT1hfU1lOQworCitpbnQgd2xfbWJ4KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK3ZvaWQgd2xfZW5kaWFuX3RyYW5zbGF0ZV9tYWlsYm94KCBsdHZfdCAqbHR2ICk7Cit2b2lkIHdsX3Byb2Nlc3NfbWFpbGJveCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKKyNlbmRpZiAgLyogVVNFX01CT1hfU1lOQyAqLworCisKKyNpZmRlZiBVU0VfV0RTCisKK3ZvaWQgd2xfd2RzX25ldGRldl9yZWdpc3Rlciggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7Cit2b2lkIHdsX3dkc19uZXRkZXZfZGVyZWdpc3Rlciggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKKyNlbmRpZiAgLyogVVNFX1dEUyAqLworCisKKyNpZmRlZiBVU0VfV0RTCisKKyNkZWZpbmUgV0xfV0RTX05FVERFVl9SRUdJU1RFUiggQVJHICkgICB3bF93ZHNfbmV0ZGV2X3JlZ2lzdGVyKCBBUkcgKQorI2RlZmluZSBXTF9XRFNfTkVUREVWX0RFUkVHSVNURVIoIEFSRyApIHdsX3dkc19uZXRkZXZfZGVyZWdpc3RlciggQVJHICkKKworI2Vsc2UKKworI2RlZmluZSBXTF9XRFNfTkVUREVWX1JFR0lTVEVSKCBBUkcgKQorI2RlZmluZSBXTF9XRFNfTkVUREVWX0RFUkVHSVNURVIoIEFSRyApCisKKyNlbmRpZiAgLyogVVNFX1dEUyAqLworI2VuZGlmICAvLyBfX1dMX01BSU5fSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9uZXRkZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX25ldGRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMzg5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9uZXRkZXYuYwpAQCAtMCwwICsxLDIwNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBUaGlzIGZpbGUgY29udGFpbnMgaGFuZGxlciBmdW5jdGlvbnMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBuZXRfZGV2aWNlCisgKiAgIHN0cnVjdHVyZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDx3bF92ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisvLyAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisvLyAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisvLyAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisvLyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L2luLmg+CisvLyAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKy8vICNpbmNsdWRlIDxhc20vaW8uaD4KKy8vICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisvLyAjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisvLyAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisvLyAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisvLyAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisKKyNpbmNsdWRlIDxkZWJ1Zy5oPgorCisjaW5jbHVkZSA8aGNmLmg+CisjaW5jbHVkZSA8ZGhmLmg+CisvLyAjaW5jbHVkZSA8aGNmZGVmLmg+CisKKyNpbmNsdWRlIDx3bF9pZi5oPgorI2luY2x1ZGUgPHdsX2ludGVybmFsLmg+CisjaW5jbHVkZSA8d2xfdXRpbC5oPgorI2luY2x1ZGUgPHdsX3ByaXYuaD4KKyNpbmNsdWRlIDx3bF9tYWluLmg+CisjaW5jbHVkZSA8d2xfbmV0ZGV2Lmg+CisjaW5jbHVkZSA8d2xfd2V4dC5oPgorCisjaWZkZWYgVVNFX1BST0ZJTEUKKyNpbmNsdWRlIDx3bF9wcm9maWxlLmg+CisjZW5kaWYgIC8qIFVTRV9QUk9GSUxFICovCisKKyNpZmRlZiBCVVNfUENNQ0lBCisjaW5jbHVkZSA8d2xfY3MuaD4KKyNlbmRpZiAgLyogQlVTX1BDTUNJQSAqLworCisjaWZkZWYgQlVTX1BDSQorI2luY2x1ZGUgPHdsX3BjaS5oPgorI2VuZGlmICAvKiBCVVNfUENJICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdsb2JhbCB2YXJpYWJsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgREJHCitleHRlcm4gZGJnX2luZm9fdCAqRGJnSW5mbzsKKyNlbmRpZiAgLyogREJHICovCisKKworI2lmIEhDRl9FTkNBUAorI2RlZmluZSBNVFVfTUFYIChIQ0ZfTUFYX01TRyAtIEVUSF9ITEVOIC0gOCkKKyNlbHNlCisjZGVmaW5lIE1UVV9NQVggKEhDRl9NQVhfTVNHIC0gRVRIX0hMRU4pCisjZW5kaWYKKworLy9zdGF0aWMgaW50IG10dSA9IE1UVV9NQVg7CisvL01PRFVMRV9QQVJNKG10dSwgImkiKTsKKy8vTU9EVUxFX1BBUk1fREVTQyhtdHUsICJNVFUiKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG1hY3JvcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQkxPQ0tfSU5QVVQoYnVmLCBsZW4pIFwKKyAgICBkZXNjLT5idWZfYWRkciA9IGJ1ZjsgXAorICAgIGRlc2MtPkJVRl9TSVpFID0gbGVuOyBcCisgICAgc3RhdHVzID0gaGNmX3Jjdl9tc2coJihscC0+aGNmQ3R4KSwgZGVzYywgMCkKKworI2RlZmluZSBCTE9DS19JTlBVVF9ETUEoYnVmLCBsZW4pIG1lbWNweSggYnVmLCBkZXNjX25leHQtPmJ1Zl9hZGRyLCBwa3RsZW4gKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnVuY3Rpb24gcHJvdG90eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2luaXQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBXZSBuZXZlciBuZWVkIHRvIGRvIGFueXRoaW5nIHdoZW4gYSAiV2lyZWxlc3MiIGRldmljZSBpcyAiaW5pdGlhbGl6ZWQiCisgKiAgYnkgdGhlIG5ldCBzb2Z0d2FyZSwgYmVjYXVzZSB3ZSBvbmx5IHJlZ2lzdGVyIGFscmVhZHktZm91bmQgY2FyZHMuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9pbml0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKy8vICAgIHVuc2lnbmVkIGxvbmcgICAgICAgZmxhZ3M7CisvLyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX2luaXQiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKKworICAgIC8qIE5vdGhpbmcgdG8gZG8sIGJ1dCBncmFiIHRoZSBzcGlubG9jayBhbnl3YXkganVzdCBpbiBjYXNlIHdlIGV2ZXIgbmVlZAorICAgICAgIHRoaXMgcm91dGluZSAqLworLy8gIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKy8vICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybiAwOworfSAvLyB3bF9pbml0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfY29uZmlnKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgSW1wbGVtZW50IHRoZSBTSU9DU0lGTUFQIGludGVyZmFjZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqICAgICAgbWFwIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBpZm1hcCBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2NvbmZpZyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXAgKQoreworICAgIERCR19GVU5DKCAid2xfY29uZmlnIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CisgICAgREJHX1BBUkFNKCBEYmdJbmZvLCAibWFwIiwgIjB4JXAiLCBtYXAgKTsKKworICAgIC8qIFRoZSBvbmx5IHRoaW5nIHdlIGNhcmUgYWJvdXQgaGVyZSBpcyBhIHBvcnQgY2hhbmdlLiBTaW5jZSB0aGlzIG5vdCBuZWVkZWQsCisgICAgICAgaWdub3JlIHRoZSByZXF1ZXN0LiAqLworICAgIERCR19UUkFDRSggRGJnSW5mbywgIiVzOiAlcyBjYWxsZWQuXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ19fICk7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm4gMDsKK30gLy8gd2xfY29uZmlnCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfc3RhdHMoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBSZXR1cm4gdGhlIGN1cnJlbnQgZGV2aWNlIHN0YXRpc3RpY3MuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlX3N0YXRzIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBuZXR3b3JrCisgKiAgICAgIHN0YXRpc3RpY3MuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp3bF9zdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisjaWZkZWYgVVNFX1dEUworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDsKKyNlbmRpZiAgLyogVVNFX1dEUyAqLworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICBmbGFnczsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAgICAgKnBTdGF0czsKKyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAgICAgKmxwID0gd2xfcHJpdihkZXYpOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8vREJHX0ZVTkMoICJ3bF9zdGF0cyIgKTsKKyAgICAvL0RCR19FTlRFUiggRGJnSW5mbyApOworICAgIC8vREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CisKKyAgICBwU3RhdHMgPSBOVUxMOworCisgICAgd2xfbG9jayggbHAsICZmbGFncyApOworCisjaWZkZWYgVVNFX1JUUworICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CisJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisKKwkvL0RCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiBOVUxMOworICAgIH0KKyNlbmRpZiAgLyogVVNFX1JUUyAqLworCisgICAgLyogUmV0dXJuIHRoZSBzdGF0aXN0aWNzIGZvciB0aGUgYXBwcm9wcmlhdGUgZGV2aWNlICovCisjaWZkZWYgVVNFX1dEUworCisgICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKKwlpZiggZGV2ID09IGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICkgeworCSAgICBwU3RhdHMgPSAmKCBscC0+d2RzX3BvcnRbY291bnRdLnN0YXRzICk7CisJfQorICAgIH0KKworI2VuZGlmICAvKiBVU0VfV0RTICovCisKKyAgICAvKiBJZiBwU3RhdHMgaXMgc3RpbGwgTlVMTCwgdGhlbiB0aGUgZGV2aWNlIGlzIG5vdCBhIFdEUyBwb3J0ICovCisgICAgaWYoIHBTdGF0cyA9PSBOVUxMICkgeworICAgICAgICBwU3RhdHMgPSAmKCBscC0+c3RhdHMgKTsKKyAgICB9CisKKyAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIC8vREJHX0xFQVZFKCBEYmdJbmZvICk7CisKKyAgICByZXR1cm4gcFN0YXRzOworfSAvLyB3bF9zdGF0cworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX29wZW4oKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBPcGVuIHRoZSBkZXZpY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICBzdGF0dXMgPSBIQ0ZfU1VDQ0VTUzsKKyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgIGZsYWdzOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfb3BlbiIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworI2lmZGVmIFVTRV9SVFMKKyAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgeworCURCR19UUkFDRSggRGJnSW5mbywgIlNraXBwaW5nIGRldmljZSBvcGVuLCBpbiBSVFMgbW9kZVxuIiApOworCXdsX3VubG9jayggbHAsICZmbGFncyApOworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiAtRUlPOworICAgIH0KKyNlbmRpZiAgLyogVVNFX1JUUyAqLworCisjaWZkZWYgVVNFX1BST0ZJTEUKKyAgICBwYXJzZV9jb25maWcoIGRldiApOworI2VuZGlmCisKKyAgICBpZiggbHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEICkgeworCURCR19UUkFDRSggRGJnSW5mbywgIkVuYWJsaW5nIFBvcnQgMFxuIiApOworCXN0YXR1cyA9IHdsX2VuYWJsZSggbHAgKTsKKworICAgICAgICBpZiggc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgeworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiRW5hYmxlIHBvcnQgMCBmYWlsZWQ6IDB4JXhcbiIsIHN0YXR1cyApOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMKKyAgICB3bF91bmxvY2sobHAsICZmbGFncyk7CisgICAgd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgaWYgKCBzdHJsZW4oIGxwLT5md19pbWFnZV9maWxlbmFtZSApICkgeworCURCR19UUkFDRSggRGJnSW5mbywgIjs/Pz8/IEtsdWRneSB3YXkgdG8gZm9yY2UgYSBkb3dubG9hZFxuIiApOworCXN0YXR1cyA9IHdsX2dvKCBscCApOworICAgIH0gZWxzZSB7CisJc3RhdHVzID0gd2xfYXBwbHkoIGxwICk7CisgICAgfQorCisgICAgLy8gSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMKKyAgICB3bF91bmxvY2sobHAsICZmbGFncyk7CisgICAgd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgaWYoIHN0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKKwkvLyBVbnN1Y2Nlc2Z1bGwsIHRyeSByZXNldCBvZiB0aGUgY2FyZCB0byByZWNvdmVyCisJc3RhdHVzID0gd2xfcmVzZXQoIGRldiApOworICAgIH0KKworICAgIC8vIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzCisgICAgd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIGlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisJbmV0aWZfY2Fycmllcl9vbiggZGV2ICk7CisJV0xfV0RTX05FVElGX0NBUlJJRVJfT04oIGxwICk7CisKKwlscC0+aXNfaGFuZGxpbmdfaW50ID0gV0xfSEFORExJTkdfSU5UOyAvLyBTdGFydCBoYW5kbGluZyBpbnRlcnJ1cHRzCisgICAgICAgIHdsX2FjdF9pbnRfb24oIGxwICk7CisKKwluZXRpZl9zdGFydF9xdWV1ZSggZGV2ICk7CisJV0xfV0RTX05FVElGX1NUQVJUX1FVRVVFKCBscCApOworICAgIH0gZWxzZSB7CisgICAgICAgIHdsX2hjZl9lcnJvciggZGV2LCBzdGF0dXMgKTsJCS8qIFJlcG9ydCB0aGUgZXJyb3IgKi8KKyAgICAgICAgbmV0aWZfZGV2aWNlX2RldGFjaCggZGV2ICk7CQkvKiBTdG9wIHRoZSBkZXZpY2UgYW5kIHF1ZXVlICovCisgICAgfQorCisgICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvLyB3bF9vcGVuCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfY2xvc2UoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDbG9zZSB0aGUgZGV2aWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfY2xvc2UoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOworICAgIHVuc2lnbmVkIGxvbmcgICBmbGFnczsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQygid2xfY2xvc2UiKTsKKyAgICBEQkdfRU5URVIoRGJnSW5mbyk7CisgICAgREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOworCisgICAgLyogTWFyayB0aGUgYWRhcHRlciBhcyBidXN5ICovCisgICAgbmV0aWZfc3RvcF9xdWV1ZSggZGV2ICk7CisgICAgV0xfV0RTX05FVElGX1NUT1BfUVVFVUUoIGxwICk7CisKKyAgICBuZXRpZl9jYXJyaWVyX29mZiggZGV2ICk7CisgICAgV0xfV0RTX05FVElGX0NBUlJJRVJfT0ZGKCBscCApOworCisgICAgLyogU2h1dGRvd24gdGhlIGFkYXB0ZXI6CisgICAgICAgICAgICBEaXNhYmxlIGFkYXB0ZXIgaW50ZXJydXB0cworICAgICAgICAgICAgU3RvcCBUeC9SeAorICAgICAgICAgICAgVXBkYXRlIHN0YXRpc3RpY3MKKyAgICAgICAgICAgIFNldCBsb3cgcG93ZXIgbW9kZQorICAgICovCisKKyAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICB3bF9hY3RfaW50X29mZiggbHAgKTsKKyAgICBscC0+aXNfaGFuZGxpbmdfaW50ID0gV0xfTk9UX0hBTkRMSU5HX0lOVDsgLy8gU3RvcCBoYW5kbGluZyBpbnRlcnJ1cHRzCisKKyNpZmRlZiBVU0VfUlRTCisgICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJTa2lwcGluZyBkZXZpY2UgY2xvc2UsIGluIFJUUyBtb2RlXG4iICk7CisJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIC1FSU87CisgICAgfQorI2VuZGlmICAvKiBVU0VfUlRTICovCisKKyAgICAvKiBEaXNhYmxlIHRoZSBwb3J0cyAqLworICAgIHdsX2Rpc2FibGUoIGxwICk7CisKKyAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybiAwOworfSAvLyB3bF9jbG9zZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgd2xfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKyAgICBzdHJuY3B5KGluZm8tPmRyaXZlciwgRFJJVkVSX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpIC0gMSk7CisgICAgc3RybmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTl9TVFIsIHNpemVvZihpbmZvLT52ZXJzaW9uKSAtIDEpOworLy8Jc3RybmNweShpbmZvLmZ3X3ZlcnNpb24sIHByaXYtPmZ3X25hbWUsCisvLwlzaXplb2YoaW5mby5md192ZXJzaW9uKSAtIDEpOworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCisgICAgaWYgKGRldi0+ZGV2LnBhcmVudCkgeworICAgIAlkZXZfc2V0X25hbWUoZGV2LT5kZXYucGFyZW50LCAiJXMiLCBpbmZvLT5idXNfaW5mbyk7CisJLy9zdHJuY3B5KGluZm8tPmJ1c19pbmZvLCBkZXYtPmRldi5wYXJlbnQtPmJ1c19pZCwKKwkvLwlzaXplb2YoaW5mby0+YnVzX2luZm8pIC0gMSk7CisjZWxzZQorCSAgICBpZiAoZGV2LT5jbGFzc19kZXYucGFyZW50KSB7CisJCXNpemVvZihpbmZvLT5idXNfaW5mbykgLSAxKTsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisJc25wcmludGYoaW5mby0+YnVzX2luZm8sIHNpemVvZihpbmZvLT5idXNfaW5mbykgLSAxLAorCQkiUENNQ0lBIEZJWE1FIik7CisvLwkJICAgICJQQ01DSUEgMHglbHgiLCBwcml2LT5ody5pb2Jhc2UpOworICAgIH0KK30gLy8gd2xfZ2V0X2RydmluZm8KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB3bF9ldGh0b29sX29wcyA9IHsKKyAgICAuZ2V0X2RydmluZm8gPSB3bF9nZXRfZHJ2aW5mbywKKyAgICAuZ2V0X2xpbmsgPSBldGh0b29sX29wX2dldF9saW5rLAorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfaW9jdGwoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGUgSU9DVEwgaGFuZGxlciBmb3IgdGhlIGRldmljZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3QuCisgKiAgICAgIHJxICAtIGEgcG9pbnRlciB0byB0aGUgSU9DVEwgcmVxdWVzdCBidWZmZXIuCisgKiAgICAgIGNtZCAtIHRoZSBJT0NUTCBjb21tYW5kIGNvZGUuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9pb2N0bCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCApCit7CisgICAgc3RydWN0IHdsX3ByaXZhdGUgICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBmbGFnczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICByZXQgPSAwOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfaW9jdGwiICk7CisgICAgREJHX0VOVEVSKERiZ0luZm8pOworICAgIERCR19QQVJBTShEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2KTsKKyAgICBEQkdfUEFSQU0oRGJnSW5mbywgInJxIiwgIjB4JXAiLCBycSk7CisgICAgREJHX1BBUkFNKERiZ0luZm8sICJjbWQiLCAiMHglMDR4IiwgY21kKTsKKworICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIHdsX2FjdF9pbnRfb2ZmKCBscCApOworCisjaWZkZWYgVVNFX1JUUworICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CisJLyogSGFuZGxlIGFueSBSVFMgSU9DVEwgaGVyZSAqLworCWlmKCBjbWQgPT0gV0xfSU9DVExfUlRTICkgeworCSAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJJT0NUTDogV0xfSU9DVExfUlRTXG4iICk7CisJICAgIHJldCA9IHd2bGFuX3J0cyggKHN0cnVjdCBydHNyZXEgKilycSwgZGV2LT5iYXNlX2FkZHIgKTsKKwl9IGVsc2UgeworCSAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJJT0NUTCBub3Qgc3VwcG9ydGVkIGluIFJUUyBtb2RlOiAweCVYXG4iLCBjbWQgKTsKKwkgICAgcmV0ID0gLUVPUE5PVFNVUFA7CisJfQorCisJZ290byBvdXRfYWN0X2ludF9vbl91bmxvY2s7CisgICAgfQorI2VuZGlmICAvKiBVU0VfUlRTICovCisKKyAgICAvKiBPbmx5IGhhbmRsZSBVSUwgSU9DVEwgcmVxdWVzdHMgd2hlbiB0aGUgVUlMIGhhcyB0aGUgc3lzdGVtIGJsb2NrZWQuICovCisgICAgaWYoICEoKCBscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kgKSAmJiAoIGNtZCAhPSBXVkxBTjJfSU9DVExfVUlMICkpKSB7CisjaWZkZWYgVVNFX1VJTAorCXN0cnVjdCB1aWxyZXEgICp1cnEgPSAoc3RydWN0IHVpbHJlcSAqKXJxOworI2VuZGlmIC8qIFVTRV9VSUwgKi8KKworCXN3aXRjaCggY21kICkgeworCQkvLyA9PT09PT09PT09PT09PT09PT0gUHJpdmF0ZSBJT0NUTHMgKHVwIHRvIDE2KSA9PT09PT09PT09PT09PT09PT0KKyNpZmRlZiBVU0VfVUlMCisJY2FzZSBXVkxBTjJfSU9DVExfVUlMOgorCSAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9VSUxcbiIgKTsKKwkgICAgIHJldCA9IHd2bGFuX3VpbCggdXJxLCBscCApOworCSAgICAgYnJlYWs7CisjZW5kaWYgIC8qIFVTRV9VSUwgKi8KKworCWRlZmF1bHQ6CisJICAgICBEQkdfVFJBQ0UoRGJnSW5mbywgIklPQ1RMIENPREUgTk9UIFNVUFBPUlRFRDogMHglWFxuIiwgY21kICk7CisJICAgICByZXQgPSAtRU9QTk9UU1VQUDsKKwkgICAgIGJyZWFrOworCX0KKyAgICB9IGVsc2UgeworCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiREVWSUNFIElTIEJVU1ksIENBTk5PVCBQUk9DRVNTIFJFUVVFU1RcbiIgKTsKKwlyZXQgPSAtRUJVU1k7CisgICAgfQorCisjaWZkZWYgVVNFX1JUUworb3V0X2FjdF9pbnRfb25fdW5sb2NrOgorI2VuZGlmICAvKiBVU0VfUlRTICovCisgICAgd2xfYWN0X2ludF9vbiggbHAgKTsKKworICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuIHJldDsKK30gLy8gd2xfaW9jdGwKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgordm9pZCB3bF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgc3RydWN0IHB0X3JlZ3MgcmVnczsKKworICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKyAgICB3bF9pc3IoZGV2LT5pcnEsIGRldiwgJnJlZ3MpOworICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF90eF90aW1lb3V0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhlIGhhbmRsZXIgY2FsbGVkIHdoZW4sIGZvciBzb21lIHJlYXNvbiwgYSBUeCByZXF1ZXN0IGlzIG5vdCBjb21wbGV0ZWQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0LgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfdHhfdGltZW91dCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisjaWZkZWYgVVNFX1dEUworICAgIGludCAgICAgICAgICAgICAgICAgICAgIGNvdW50OworI2VuZGlmICAvKiBVU0VfV0RTICovCisgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgZmxhZ3M7CisgICAgc3RydWN0IHdsX3ByaXZhdGUgICAgICAgKmxwID0gd2xfcHJpdihkZXYpOworICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwU3RhdHMgPSBOVUxMOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfdHhfdGltZW91dCIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXM6IFRyYW5zbWl0IHRpbWVvdXQuXG4iLCBkZXYtPm5hbWUgKTsKKworICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworI2lmZGVmIFVTRV9SVFMKKyAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgeworCURCR19UUkFDRSggRGJnSW5mbywgIlNraXBwaW5nIHR4X3RpbWVvdXQgaGFuZGxlciwgaW4gUlRTIG1vZGVcbiIgKTsKKwl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybjsKKyAgICB9CisjZW5kaWYgIC8qIFVTRV9SVFMgKi8KKworICAgIC8qIEZpZ3VyZSBvdXQgd2hpY2ggZGV2aWNlICh0aGUgInJvb3QiIGRldmljZSBvciBXRFMgcG9ydCkgdGhpcyB0aW1lb3V0CisgICAgICAgaXMgZm9yICovCisjaWZkZWYgVVNFX1dEUworCisgICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKKwlpZiggZGV2ID09IGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICkgeworCSAgICBwU3RhdHMgPSAmKCBscC0+d2RzX3BvcnRbY291bnRdLnN0YXRzICk7CisKKwkgICAgLyogQnJlYWsgdGhlIGxvb3Agc28gdGhhdCB3ZSBjYW4gdXNlIHRoZSBjb3VudGVyIHRvIGFjY2VzcyBXRFMKKwkgICAgICAgaW5mb3JtYXRpb24gaW4gdGhlIHByaXZhdGUgc3RydWN0dXJlICovCisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyNlbmRpZiAgLyogVVNFX1dEUyAqLworCisgICAgLyogSWYgcFN0YXRzIGlzIHN0aWxsIE5VTEwsIHRoZW4gdGhlIGRldmljZSBpcyBub3QgYSBXRFMgcG9ydCAqLworICAgIGlmKCBwU3RhdHMgPT0gTlVMTCApIHsKKwlwU3RhdHMgPSAmKCBscC0+c3RhdHMgKTsKKyAgICB9CisKKyAgICAvKiBBY2N1bXVsYXRlIHRoZSB0aW1lb3V0IGVycm9yICovCisgICAgcFN0YXRzLT50eF9lcnJvcnMrKzsKKworICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuOworfSAvLyB3bF90eF90aW1lb3V0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfc2VuZCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoZSByb3V0aW5lIHdoaWNoIHBlcmZvcm1zIGRhdGEgdHJhbnNtaXRzLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyB3bF9wcml2YXRlIHN0cnVjdC4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICAxIG9uIGVycm9yCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9zZW5kKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCisgICAgaW50ICAgICAgICAgICAgICAgICBzdGF0dXM7CisgICAgREVTQ19TVFJDVCAgICAgICAgICAqZGVzYzsKKyAgICBXVkxBTl9MRlJBTUUgICAgICAgICp0eEYgPSBOVUxMOworICAgIHN0cnVjdCBsaXN0X2hlYWQgICAgKmVsZW1lbnQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBsZW47CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9zZW5kIiApOworCisgICAgaWYoIGxwID09IE5VTEwgKSB7CisgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIlByaXZhdGUgYWRhcHRlciBzdHJ1Y3QgaXMgTlVMTFxuIiApOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmKCBscC0+ZGV2ID09IE5VTEwgKSB7CisgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIm5ldF9kZXZpY2Ugc3RydWN0IGluIHdsX3ByaXZhdGUgaXMgTlVMTFxuIiApOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgRklEczsgaWYgbm9uZSBhcmUgYXZhaWxhYmxlLCBkb24ndCB0YWtlIGFueQorICAgICAgIGZyYW1lcyBvZmYgdGhlIHR4USAqLworICAgIGlmKCBscC0+aGNmQ3R4LklGQl9Sc2NJbmQgPT0gMCApIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIFJlY2xhaW0gdGhlIFR4USBFbGVtZW50cyBhbmQgcGxhY2UgdGhlbSBiYWNrIG9uIHRoZSBmcmVlIHF1ZXVlICovCisgICAgaWYoICFsaXN0X2VtcHR5KCAmKCBscC0+dHhRWzBdICkpKSB7CisgICAgICAgIGVsZW1lbnQgPSBscC0+dHhRWzBdLm5leHQ7CisKKyAgICAgICAgdHhGID0gKFdWTEFOX0xGUkFNRSAqIClsaXN0X2VudHJ5KCBlbGVtZW50LCBXVkxBTl9MRlJBTUUsIG5vZGUgKTsKKyAgICAgICAgaWYoIHR4RiAhPSBOVUxMICkgeworICAgICAgICAgICAgbHAtPnR4Ri5za2IgID0gdHhGLT5mcmFtZS5za2I7CisgICAgICAgICAgICBscC0+dHhGLnBvcnQgPSB0eEYtPmZyYW1lLnBvcnQ7CisKKyAgICAgICAgICAgIHR4Ri0+ZnJhbWUuc2tiICA9IE5VTEw7CisgICAgICAgICAgICB0eEYtPmZyYW1lLnBvcnQgPSAwOworCisgICAgICAgICAgICBsaXN0X2RlbCggJiggdHhGLT5ub2RlICkpOworICAgICAgICAgICAgbGlzdF9hZGQoIGVsZW1lbnQsICYoIGxwLT50eEZyZWUgKSk7CisKKyAgICAgICAgICAgIGxwLT50eFFfY291bnQtLTsKKworICAgICAgICAgICAgaWYoIGxwLT50eFFfY291bnQgPCBUWF9RX0xPV19XQVRFUl9NQVJLICkgeworICAgICAgICAgICAgICAgIGlmKCBscC0+bmV0aWZfcXVldWVfb24gPT0gRkFMU0UgKSB7CisgICAgICAgICAgICAgICAgICAgIERCR19UWCggRGJnSW5mbywgIktpY2tzdGFydGluZyBROiAlZFxuIiwgbHAtPnR4UV9jb3VudCApOworICAgICAgICAgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKCBscC0+ZGV2ICk7CisgICAgICAgICAgICAgICAgICAgIFdMX1dEU19ORVRJRl9XQUtFX1FVRVVFKCBscCApOworICAgICAgICAgICAgICAgICAgICBscC0+bmV0aWZfcXVldWVfb24gPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBscC0+dHhGLnNrYiA9PSBOVUxMICkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLyogSWYgdGhlIGRldmljZSBoYXMgcmVzb3VyY2VzIChGSURzKSBhdmFpbGFibGUsIHRoZW4gVHggdGhlIHBhY2tldCAqLworICAgIC8qIEZvcm1hdCB0aGUgVHhSZXF1ZXN0IGFuZCBzZW5kIGl0IHRvIHRoZSBhZGFwdGVyICovCisgICAgbGVuID0gbHAtPnR4Ri5za2ItPmxlbiA8IEVUSF9aTEVOID8gRVRIX1pMRU4gOiBscC0+dHhGLnNrYi0+bGVuOworCisgICAgZGVzYyAgICAgICAgICAgICAgICAgICAgPSAmKCBscC0+ZGVzY190eCApOworICAgIGRlc2MtPmJ1Zl9hZGRyICAgICAgICAgID0gbHAtPnR4Ri5za2ItPmRhdGE7CisgICAgZGVzYy0+QlVGX0NOVCAgICAgICAgICAgPSBsZW47CisgICAgZGVzYy0+bmV4dF9kZXNjX2FkZHIgICAgPSBOVUxMOworCisgICAgc3RhdHVzID0gaGNmX3NlbmRfbXNnKCAmKCBscC0+aGNmQ3R4ICksIGRlc2MsIGxwLT50eEYucG9ydCApOworCisgICAgaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKyAgICAgICAgbHAtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisgICAgICAgIERCR19UWCggRGJnSW5mbywgIlRyYW5zbWl0Li4uXG4iICk7CisKKyAgICAgICAgaWYoIGxwLT50eEYucG9ydCA9PSBIQ0ZfUE9SVF8wICkgeworICAgICAgICAgICAgbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKyAgICAgICAgICAgIGxwLT5zdGF0cy50eF9ieXRlcyArPSBscC0+dHhGLnNrYi0+bGVuOworICAgICAgICB9CisKKyNpZmRlZiBVU0VfV0RTCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbHAtPndkc19wb3J0WygoIGxwLT50eEYucG9ydCA+PiA4ICkgLSAxKV0uc3RhdHMudHhfcGFja2V0cysrOworICAgICAgICAgICAgbHAtPndkc19wb3J0WygoIGxwLT50eEYucG9ydCA+PiA4ICkgLSAxKV0uc3RhdHMudHhfYnl0ZXMgKz0gbHAtPnR4Ri5za2ItPmxlbjsKKyAgICAgICAgfQorCisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKworICAgICAgICAvKiBGcmVlIHRoZSBza2IgYW5kIHBlcmZvcm0gcXVldWUgY2xlYW51cCwgYXMgdGhlIGJ1ZmZlciB3YXMKKyAgICAgICAgICAgIHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseSAqLworICAgICAgICBkZXZfa2ZyZWVfc2tiKCBscC0+dHhGLnNrYiApOworCisgICAgICAgIGxwLT50eEYuc2tiID0gTlVMTDsKKyAgICAgICAgbHAtPnR4Ri5wb3J0ID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30gLy8gd2xfc2VuZAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3R4KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhlIFR4IGhhbmRsZXIgZnVuY3Rpb24gZm9yIHRoZSBuZXR3b3JrIGxheWVyLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgc2tiIC0gYSBwb2ludGVyIHRvIHRoZSBza19idWZmIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBkYXRhIHRvIHRyYW5zZmVyLgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIDEgb24gZXJyb3IKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3R4KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcG9ydCApCit7CisgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgZmxhZ3M7CisgICAgc3RydWN0IHdsX3ByaXZhdGUgICAgICAgKmxwID0gd2xfcHJpdihkZXYpOworICAgIFdWTEFOX0xGUkFNRSAgICAgICAgICAgICp0eEYgPSBOVUxMOworICAgIHN0cnVjdCBsaXN0X2hlYWQgICAgICAgICplbGVtZW50OworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfdHgiICk7CisKKyAgICAvKiBHcmFiIHRoZSBzcGlubG9jayAqLworICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIGlmKCBscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kgKSB7CisgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiVUlMIGhhcyBkZXZpY2UgYmxvY2tlZFxuIiApOworICAgICAgICAvKiBTdGFydCBkcm9wcGluZyBwYWNrZXRzIGhlcmU/Pz8gKi8KKwl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisjaWZkZWYgVVNFX1JUUworICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CisgICAgICAgIERCR19QUklOVCggIlJUUzogd2UncmUgZ2V0dGluZyBhIFR4Li4uXG4iICk7CisJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZiAgLyogVVNFX1JUUyAqLworCisgICAgaWYoICFscC0+dXNlX2RtYSApIHsKKyAgICAgICAgLyogR2V0IGFuIGVsZW1lbnQgZnJvbSB0aGUgcXVldWUgKi8KKyAgICAgICAgZWxlbWVudCA9IGxwLT50eEZyZWUubmV4dDsKKyAgICAgICAgdHhGID0gKFdWTEFOX0xGUkFNRSAqKWxpc3RfZW50cnkoIGVsZW1lbnQsIFdWTEFOX0xGUkFNRSwgbm9kZSApOworICAgICAgICBpZiggdHhGID09IE5VTEwgKSB7CisgICAgICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJQcm9ibGVtIHdpdGggbGlzdF9lbnRyeVxuIiApOworCSAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIC8qIEZpbGwgb3V0IHRoZSBmcmFtZSAqLworICAgICAgICB0eEYtPmZyYW1lLnNrYiA9IHNrYjsKKyAgICAgICAgdHhGLT5mcmFtZS5wb3J0ID0gcG9ydDsKKyAgICAgICAgLyogTW92ZSB0aGUgZnJhbWUgdG8gdGhlIHR4USAqLworICAgICAgICAvKiBOT1RFOiBIZXJlJ3Mgd2hlcmUgd2Ugd291bGQgZG8gcHJpb3JpdHkgcXVldWVpbmcgKi8KKyAgICAgICAgbGlzdF9kZWwoICYoIHR4Ri0+bm9kZSApKTsKKyAgICAgICAgbGlzdF9hZGQoICYoIHR4Ri0+bm9kZSApLCAmKCBscC0+dHhRWzBdICkpOworCisgICAgICAgIGxwLT50eFFfY291bnQrKzsKKyAgICAgICAgaWYoIGxwLT50eFFfY291bnQgPj0gREVGQVVMVF9OVU1fVFhfRlJBTUVTICkgeworICAgICAgICAgICAgREJHX1RYKCBEYmdJbmZvLCAiUSBGdWxsOiAlZFxuIiwgbHAtPnR4UV9jb3VudCApOworICAgICAgICAgICAgaWYoIGxwLT5uZXRpZl9xdWV1ZV9vbiA9PSBUUlVFICkgeworICAgICAgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoIGxwLT5kZXYgKTsKKyAgICAgICAgICAgICAgICBXTF9XRFNfTkVUSUZfU1RPUF9RVUVVRSggbHAgKTsKKyAgICAgICAgICAgICAgICBscC0+bmV0aWZfcXVldWVfb24gPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB3bF9hY3RfaW50X29mZiggbHAgKTsgLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCisKKyAgICAvKiBTZW5kIHRoZSBkYXRhIHRvIHRoZSBoYXJkd2FyZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kICovCisjaWZkZWYgRU5BQkxFX0RNQQorICAgIGlmKCBscC0+dXNlX2RtYSApIHsKKyAgICAgICAgd2xfc2VuZF9kbWEoIGxwLCBza2IsIHBvcnQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICB3bF9zZW5kKCBscCApOworICAgIH0KKyAgICAvKiBSZS1lbmFibGUgSW50ZXJydXB0cywgcmVsZWFzZSB0aGUgc3BpbmxvY2sgYW5kIHJldHVybiAqLworICAgIHdsX2FjdF9pbnRfb24oIGxwICk7CisgICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisgICAgcmV0dXJuIDA7Cit9IC8vIHdsX3R4CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcngoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGUgcm91dGluZSB3aGljaCBwZXJmb3JtcyBkYXRhIHJlY2VwdGlvbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgMSBvbiBlcnJvcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBwb3J0OworICAgIHN0cnVjdCBza19idWZmICAgICAgICAgICpza2I7CisgICAgc3RydWN0IHdsX3ByaXZhdGUgICAgICAgKmxwID0gd2xfcHJpdihkZXYpOworICAgIGludCAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKyAgICBoY2ZfMTYgICAgICAgICAgICAgICAgICBwa3RsZW47CisgICAgaGNmXzE2ICAgICAgICAgICAgICAgICAgaGZzX3N0YXQ7CisgICAgREVTQ19TVFJDVCAgICAgICAgICAgICAgKmRlc2M7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoIndsX3J4IikKKyAgICBEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CisKKyAgICBpZighKCBscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kgKSkgeworCisjaWZkZWYgVVNFX1JUUworICAgICAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgeworICAgICAgICAgICAgREJHX1BSSU5UKCAiUlRTOiBXZSdyZSBnZXR0aW5nIGFuIFJ4Li4uXG4iICk7CisgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorI2VuZGlmICAvKiBVU0VfUlRTICovCisKKyAgICAgICAgLyogUmVhZCB0aGUgSEZTX1NUQVQgcmVnaXN0ZXIgZnJvbSB0aGUgbG9va2FoZWFkIGJ1ZmZlciAqLworICAgICAgICBoZnNfc3RhdCA9IChoY2ZfMTYpKCggbHAtPmxvb2tBaGVhZEJ1ZltIRlNfU1RBVF0gKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBscC0+bG9va0FoZWFkQnVmW0hGU19TVEFUICsgMV0gPDwgOCApKTsKKworICAgICAgICAvKiBNYWtlIHN1cmUgdGhlIGZyYW1lIGlzbid0IGJhZCAqLworICAgICAgICBpZigoIGhmc19zdGF0ICYgSEZTX1NUQVRfRVJSICkgIT0gSENGX1NVQ0NFU1MgKSB7CisgICAgICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIkhGU19TVEFUX0VSUk9SICgweCV4KSBpbiBSeCBQYWNrZXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPmxvb2tBaGVhZEJ1ZltIRlNfU1RBVF0gKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlPOworICAgICAgICB9CisKKyAgICAgICAgLyogRGV0ZXJtaW5lIHdoYXQgcG9ydCB0aGlzIHBhY2tldCBpcyBmb3IgKi8KKyAgICAgICAgcG9ydCA9ICggaGZzX3N0YXQgPj4gOCApICYgMHgwMDA3OworICAgICAgICBEQkdfUlgoIERiZ0luZm8sICJSeCBmcmFtZSBmb3IgcG9ydCAlZFxuIiwgcG9ydCApOworCisgICAgICAgIGlmKCggcGt0bGVuID0gbHAtPmhjZkN0eC5JRkJfUnhMZW4gKSAhPSAwICkgeworICAgICAgICAgICAgaWYoKCBza2IgPSBBTExPQ19TS0IoIHBrdGxlbiApKSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgbmV0ZGV2IGJhc2VkIG9uIHRoZSBwb3J0ICovCisgICAgICAgICAgICAgICAgc3dpdGNoKCBwb3J0ICkgeworI2lmZGVmIFVTRV9XRFMKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBscC0+d2RzX3BvcnRbcG9ydC0xXS5kZXY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmICAvKiBVU0VfV0RTICovCisKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBkZXY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlc2MgPSAmKCBscC0+ZGVzY19yeCApOworCisgICAgICAgICAgICAgICAgZGVzYy0+bmV4dF9kZXNjX2FkZHIgPSBOVUxMOworCisvKgorI2RlZmluZSBCTE9DS19JTlBVVChidWYsIGxlbikgXAorICAgIGRlc2MtPmJ1Zl9hZGRyID0gYnVmOyBcCisgICAgZGVzYy0+QlVGX1NJWkUgPSBsZW47IFwKKyAgICBzdGF0dXMgPSBoY2ZfcmN2X21zZygmKGxwLT5oY2ZDdHgpLCBkZXNjLCAwKQorKi8KKworICAgICAgICAgICAgICAgIEdFVF9QQUNLRVQoIHNrYi0+ZGV2LCBza2IsIHBrdGxlbiApOworCisgICAgICAgICAgICAgICAgaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKyAgICAgICAgICAgICAgICAgICAgbmV0aWZfcngoIHNrYiApOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBwb3J0ID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfcGFja2V0cysrOworICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdGxlbjsKKyAgICAgICAgICAgICAgICAgICAgfQorI2lmZGVmIFVTRV9XRFMKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9wYWNrZXRzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9ieXRlcyArPSBwa3RsZW47CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAgLyogVVNFX1dEUyAqLworCisgICAgICAgICAgICAgICAgICAgIGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisKKyNpZmRlZiBXSVJFTEVTU19FWFQKKyNpZmRlZiBXSVJFTEVTU19TUFkKKyAgICAgICAgICAgICAgICAgICAgaWYoIGxwLT5zcHlkYXRhLnNweV9udW1iZXIgPiAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3JjYWRkciA9IHNrYi0+bWFjLnJhdyArIE1BQ19BRERSX1NJWkU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHdsX3NweV9nYXRoZXIoIGRldiwgc3JjYWRkciApOworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogV0lSRUxFU1NfU1BZICovCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUICovCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiUnggcmVxdWVzdCB0byBjYXJkIEZBSUxFRFxuIiApOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBwb3J0ID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfZHJvcHBlZCsrOworICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgVVNFX1dEUworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtwb3J0LTFdLnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmICAvKiBVU0VfV0RTICovCisKKyAgICAgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYiggc2tiICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJDb3VsZCBub3QgYWxsb2Mgc2tiXG4iICk7CisKKyAgICAgICAgICAgICAgICBpZiggcG9ydCA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfZHJvcHBlZCsrOworICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBVU0VfV0RTCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W3BvcnQtMV0uc3RhdHMucnhfZHJvcHBlZCsrOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAgLyogVVNFX1dEUyAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9IC8vIHdsX3J4CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfbXVsdGljYXN0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgRnVuY3Rpb24gdG8gaGFuZGxlIG11bHRpY2FzdCBwYWNrZXRzCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBORVdfTVVMVElDQVNUCisKK3ZvaWQgd2xfbXVsdGljYXN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQSAvLzs/c2hvdWxkIHdlIHJldHVybiBhbiBlcnJvciBzdGF0dXMgaW4gQVAgbW9kZQorLy87P3NlZW1zIHJlYXNvbmFibGUgdGhhdCBldmVuIGFuIEFQLW9ubHkgZHJpdmVyIGNvdWxkIGFmZm9yZCB0aGlzIHNtYWxsIGFkZGl0aW9uYWwgZm9vdHByaW50CisKKyAgICBpbnQgICAgICAgICAgICAgICAgIHg7CisgICAgc3RydWN0IGRldl9tY19saXN0ICAqbWNsaXN0OworICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgZmxhZ3M7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9tdWx0aWNhc3QiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisgICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CisKKyAgICBpZiggIXdsX2FkYXB0ZXJfaXNfb3BlbiggZGV2ICkpIHsKKyAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiBEQkcKKyAgICBpZiggREJHX0ZMQUdTKCBEYmdJbmZvICkgJiBEQkdfUEFSQU1fT04gKSB7CisgICAgICAgIERCR19QUklOVCgiICBmbGFnczogJXMlcyVzXG4iLAorICAgICAgICAgICAgKCBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MgKSA/ICJQcm9taXNjb3VzICIgOiAiIiwKKyAgICAgICAgICAgICggZGV2LT5mbGFncyAmIElGRl9NVUxUSUNBU1QgKSA/ICJNdWx0aWNhc3QgIiA6ICIiLAorICAgICAgICAgICAgKCBkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJICkgPyAiQWxsLU11bHRpY2FzdCIgOiAiIiApOworCisgICAgICAgIERCR19QUklOVCggIiAgbWNfY291bnQ6ICVkXG4iLCBkZXYtPm1jX2NvdW50ICk7CisKKyAgICAgICAgZm9yKCB4ID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgeCA8IGRldi0+bWNfY291bnQ7CisgICAgICAgICAgICAgeCsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQgKSB7CisgICAgICAgICAgICBEQkdfUFJJTlQoICIgICAgJXMgKCVkKVxuIiwgRGJnSHdBZGRyKG1jbGlzdC0+ZG1pX2FkZHIpLAorICAgICAgICAgICAgICAgICAgICAgICBtY2xpc3QtPmRtaV9hZGRybGVuICk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogREJHICovCisKKyAgICBpZighKCBscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kgKSkgeworCisjaWZkZWYgVVNFX1JUUworICAgICAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgeworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiU2tpcHBpbmcgbXVsdGljYXN0LCBpbiBSVFMgbW9kZVxuIiApOworCisgICAgICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorI2VuZGlmICAvKiBVU0VfUlRTICovCisKKyAgICAgICAgd2xfbG9jayggbHAsICZmbGFncyApOworICAgICAgICB3bF9hY3RfaW50X29mZiggbHAgKTsKKworCQlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX1NUQSAgKSB7CisgICAgICAgICAgICBpZiggZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDICkgeworICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisgICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1BST01JU0NVT1VTX01PREU7CisgICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMSApOworICAgICAgICAgICAgICAgIERCR19QUklOVCggIkVuYWJsaW5nIFByb21pc2N1b3VzIG1vZGUgKElGRl9QUk9NSVNDKVxuIiApOworICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZigoIGRldi0+bWNfY291bnQgPiBIQ0ZfTUFYX01VTFRJQ0FTVCApIHx8CisgICAgICAgICAgICAgICAgICAgICggZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSApKSB7CisgICAgICAgICAgICAgICAgLyogU2h1dHRpbmcgb2ZmIHRoaXMgZmlsdGVyIHdpbGwgZW5hYmxlIGFsbCBtdWx0aWNhc3QgZnJhbWVzIHRvCisgICAgICAgICAgICAgICAgICAgYmUgc2VudCB1cCBmcm9tIHRoZSBkZXZpY2U7IGhvd2V2ZXIsIHRoaXMgaXMgYSBzdGF0aWMgUklELCBzbworICAgICAgICAgICAgICAgICAgIGEgY2FsbCB0byB3bF9hcHBseSgpIGlzIG5lZWRlZCAqLworICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKyAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfUlhfQUxMX0dST1VQX0FERFI7CisgICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMCApOworICAgICAgICAgICAgICAgIERCR19QUklOVCggIkVuYWJsaW5nIGFsbCBtdWx0aWNhc3QgbW9kZSAoSUZGX0FMTE1VTFRJKVxuIiApOworICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworICAgICAgICAgICAgICAgIHdsX2FwcGx5KCBscCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggZGV2LT5tY19jb3VudCAhPSAwICkgeworICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgbXVsdGljYXN0IGFkZHJlc3NlcyAqLworICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuID0gKCBkZXYtPm1jX2NvdW50ICogMyApICsgMTsKKyAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCA9IENGR19HUk9VUF9BRERSOworCisgICAgICAgICAgICAgICAgZm9yKCB4ID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OworICAgICAgICAgICAgICAgICggeCA8IGRldi0+bWNfY291bnQgKSAmJiAoIG1jbGlzdCAhPSBOVUxMICk7CisgICAgICAgICAgICAgICAgICAgIHgrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0ICkgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoICYoIGxwLT5sdHZSZWNvcmQudS51OFt4ICogRVRIX0FMRU5dICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWNsaXN0LT5kbWlfYWRkciwgRVRIX0FMRU4gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHX1BSSU5UKCAiU2V0dGluZyBtdWx0aWNhc3QgbGlzdFxuIiApOworICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKyAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisgICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUFJPTUlTQ1VPVVNfTU9ERTsKKyAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAwICk7CisgICAgICAgICAgICAgICAgREJHX1BSSU5UKCAiRGlzYWJsaW5nIFByb21pc2N1b3VzIG1vZGVcbiIgKTsKKyAgICAgICAgICAgICAgICBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworICAgICAgICAgICAgICAgIC8qIERpc2FibGUgbXVsdGljYXN0IG1vZGUgKi8KKyAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiA9IDI7CisgICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfR1JPVVBfQUREUjsKKyAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJEaXNhYmxpbmcgTXVsdGljYXN0IG1vZGVcbiIgKTsKKyAgICAgICAgICAgICAgICBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworICAgICAgICAgICAgICAgIC8qIFR1cm5pbmcgb24gdGhpcyBmaWx0ZXIgd2lsbCBwcmV2ZW50IGFsbCBtdWx0aWNhc3QgZnJhbWVzIGZyb20KKyAgICAgICAgICAgICAgICAgICBiZWluZyBzZW50IHVwIGZyb20gdGhlIGRldmljZTsgaG93ZXZlciwgdGhpcyBpcyBhIHN0YXRpYyBSSUQsCisgICAgICAgICAgICAgICAgICAgc28gYSBjYWxsIHRvIHdsX2FwcGx5KCkgaXMgbmVlZGVkICovCisgICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9SWF9BTExfR1JPVVBfQUREUjsKKyAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAxICk7CisgICAgICAgICAgICAgICAgREJHX1BSSU5UKCAiRGlzYWJsaW5nIGFsbCBtdWx0aWNhc3QgbW9kZSAoSUZGX0FMTE1VTFRJKVxuIiApOworICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworICAgICAgICAgICAgICAgIHdsX2FwcGx5KCBscCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdsX2FjdF9pbnRfb24oIGxwICk7CisJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisgICAgfQorICAgIERCR19MRUFWRSggRGJnSW5mbyApOworI2VuZGlmIC8qIEhDRl9TVEEgKi8KK30gLy8gd2xfbXVsdGljYXN0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZWxzZSAvKiBORVdfTVVMVElDQVNUICovCisKK3ZvaWQgd2xfbXVsdGljYXN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbnVtX2FkZHJzLCB2b2lkICphZGRycyApCit7CisgICAgREJHX0ZVTkMoICJ3bF9tdWx0aWNhc3QiKTsKKyAgICBEQkdfRU5URVIoRGJnSW5mbyk7CisKKyAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKKyAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJudW1fYWRkcnMiLCAiJWQiLCBudW1fYWRkcnMgKTsKKyAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJhZGRycyIsICIweCVwIiwgYWRkcnMgKTsKKworI2Vycm9yIE9ic29sZXRlIHNldCBtdWx0aWNhc3QgaW50ZXJmYWNlIQorCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7Cit9IC8vIHdsX211bHRpY2FzdAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2VuZGlmIC8qIE5FV19NVUxUSUNBU1QgKi8KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMzApKQorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB3bF9uZXRkZXZfb3BzID0KK3sKKyAgICAubmRvX3N0YXJ0X3htaXQgICAgICAgICA9ICZ3bF90eF9wb3J0MCwKKworICAgIC5uZG9fc2V0X2NvbmZpZyAgICAgICAgID0gJndsX2NvbmZpZywKKyAgICAubmRvX2dldF9zdGF0cyAgICAgICAgICA9ICZ3bF9zdGF0cywKKyAgICAubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9ICZ3bF9tdWx0aWNhc3QsCisKKyAgICAubmRvX2luaXQgICAgICAgICAgICAgICA9ICZ3bF9pbnNlcnQsCisgICAgLm5kb19vcGVuICAgICAgICAgICAgICAgPSAmd2xfYWRhcHRlcl9vcGVuLAorICAgIC5uZG9fc3RvcCAgICAgICAgICAgICAgID0gJndsX2FkYXB0ZXJfY2xvc2UsCisgICAgLm5kb19kb19pb2N0bCAgICAgICAgICAgPSAmd2xfaW9jdGwsCisKKyNpZmRlZiBIQVZFX1RYX1RJTUVPVVQKKyAgICAubmRvX3R4X3RpbWVvdXQgICAgICAgICA9ICZ3bF90eF90aW1lb3V0LAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorICAgIC5uZG9fcG9sbF9jb250cm9sbGVyICAgID0gd2xfcG9sbCwKKyNlbmRpZgorfTsKKyNlbmRpZiAvLyAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDMwKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2RldmljZV9hbGxvYygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENyZWF0ZSBpbnN0YW5jZXMgb2YgbmV0X2RldmljZSBhbmQgd2xfcHJpdmF0ZSBmb3IgdGhlIG5ldyBhZGFwdGVyCisgKiAgYW5kIHJlZ2lzdGVyIHRoZSBkZXZpY2UncyBlbnRyeSBwb2ludHMgaW4gdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgTi9BCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBhIHBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBuZXRfZGV2aWNlIHN0cnVjdCBmb3IgdGhpcworICogICAgICBkZXZpY2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBuZXRfZGV2aWNlICogd2xfZGV2aWNlX2FsbG9jKCB2b2lkICkKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXYgPSBOVUxMOworICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gTlVMTDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX2RldmljZV9hbGxvYyIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIC8qIEFsbG9jIGEgbmV0X2RldmljZSBzdHJ1Y3QgKi8KKyAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHdsX3ByaXZhdGUpKTsKKyAgICBpZiAoIWRldikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSAnbmV4dCcgcG9pbnRlciBpbiB0aGUgc3RydWN0LiBDdXJyZW50bHkgb25seSB1c2VkIGZvciBQQ0ksCisgICAgICAgYnV0IGRvIGl0IGhlcmUganVzdCBpbiBjYXNlIGl0J3MgdXNlZCBmb3Igb3RoZXIgYnVzZXMgaW4gdGhlIGZ1dHVyZSAqLworICAgIGxwID0gd2xfcHJpdihkZXYpOworCisKKyAgICAvKiBDaGVjayBNVFUgKi8KKyAgICBpZiggZGV2LT5tdHUgPiBNVFVfTUFYICkKKyAgICB7CisJICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXM6IE1UVSBzZXQgdG9vIGhpZ2gsIGxpbWl0aW5nIHRvICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgTVRVX01BWCApOworICAgIAlkZXYtPm10dSA9IE1UVV9NQVg7CisgICAgfQorCisgICAgLyogU2V0dXAgdGhlIGZ1bmN0aW9uIHRhYmxlIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCisgICAgZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikmd2xfaXdfaGFuZGxlcl9kZWY7CisgICAgbHAtPndpcmVsZXNzX2RhdGEuc3B5X2RhdGEgPSAmbHAtPnNweV9kYXRhOworICAgIGRldi0+d2lyZWxlc3NfZGF0YSA9ICZscC0+d2lyZWxlc3NfZGF0YTsKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMzApKQorICAgIGRldi0+bmV0ZGV2X29wcyA9ICZ3bF9uZXRkZXZfb3BzOworI2Vsc2UKKyAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCAgICA9ICZ3bF90eF9wb3J0MDsKKworICAgIGRldi0+c2V0X2NvbmZpZyAgICAgICAgID0gJndsX2NvbmZpZzsKKyAgICBkZXYtPmdldF9zdGF0cyAgICAgICAgICA9ICZ3bF9zdGF0czsKKyAgICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZ3bF9tdWx0aWNhc3Q7CisKKyAgICBkZXYtPmluaXQgICAgICAgICAgICAgICA9ICZ3bF9pbnNlcnQ7CisgICAgZGV2LT5vcGVuICAgICAgICAgICAgICAgPSAmd2xfYWRhcHRlcl9vcGVuOworICAgIGRldi0+c3RvcCAgICAgICAgICAgICAgID0gJndsX2FkYXB0ZXJfY2xvc2U7CisgICAgZGV2LT5kb19pb2N0bCAgICAgICAgICAgPSAmd2xfaW9jdGw7CisKKyNpZmRlZiBIQVZFX1RYX1RJTUVPVVQKKyAgICBkZXYtPnR4X3RpbWVvdXQgICAgICAgICA9ICZ3bF90eF90aW1lb3V0OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorICAgIGRldi0+cG9sbF9jb250cm9sbGVyID0gd2xfcG9sbDsKKyNlbmRpZgorCisjZW5kaWYgLy8gKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwzMCkpCisKKyNpZmRlZiBIQVZFX1RYX1RJTUVPVVQKKyAgICBkZXYtPndhdGNoZG9nX3RpbWVvICAgICA9IFRYX1RJTUVPVVQ7CisjZW5kaWYKKworICAgIGRldi0+ZXRodG9vbF9vcHMJICAgID0gJndsX2V0aHRvb2xfb3BzOworCisgICAgbmV0aWZfc3RvcF9xdWV1ZSggZGV2ICk7CisKKyAgICAvKiBBbGxvY2F0ZSB2aXJ1dGFsIGRldmljZXMgZm9yIFdEUyBzdXBwb3J0IGlmIG5lZWRlZCAqLworICAgIFdMX1dEU19ERVZJQ0VfQUxMT0MoIGxwICk7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm4gZGV2OworfSAvLyB3bF9kZXZpY2VfYWxsb2MKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9kZXZpY2VfZGVhbGxvYygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEZyZWUgaW5zdGFuY2VzIG9mIG5ldF9kZXZpY2UgYW5kIHdsX3ByaXZhdGUgc3RyY3V0cmVzIGZvciBhbiBhZGFwdGVyCisgKiAgYW5kIHBlcmZvcm0gYmFzaWMgY2xlYW51cC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9kZXZpY2VfZGVhbGxvYyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisvLyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX2RldmljZV9kZWFsbG9jIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgLyogRGVhbGxvYyB0aGUgV0RTIHBvcnRzICovCisgICAgV0xfV0RTX0RFVklDRV9ERUFMTE9DKCBscCApOworCisgICAgZnJlZV9uZXRkZXYoIGRldiApOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuOworfSAvLyB3bF9kZXZpY2VfZGVhbGxvYworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3R4X3BvcnQwKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhlIGhhbmRsZXIgcm91dGluZSBmb3IgVHggb3ZlciBIQ0ZfUE9SVF8wLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgc2tiIC0gYSBwb2ludGVyIHRvIHRoZSBza19idWZmIHRvIHRyYW5zbWl0LgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgSENGX1BPUlRfMC4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfdHhfcG9ydDAoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgMFxuIiApOworCisgICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfMCApOworI2lmZGVmIEVOQUJMRV9ETUEKKyAgICByZXR1cm4gd2xfdHhfZG1hKCBza2IsIGRldiwgSENGX1BPUlRfMCApOworI2VuZGlmCit9IC8vIHdsX3R4X3BvcnQwCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaWZkZWYgVVNFX1dEUworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfdHhfcG9ydDEoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGUgaGFuZGxlciByb3V0aW5lIGZvciBUeCBvdmVyIEhDRl9QT1JUXzEuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBza2IgLSBhIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgdG8gdHJhbnNtaXQuCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHJlcHJlc2VudGluZyBIQ0ZfUE9SVF8xLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF90eF9wb3J0MSggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisgICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCAxXG4iICk7CisgICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfMSApOworfSAvLyB3bF90eF9wb3J0MQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3R4X3BvcnQyKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhlIGhhbmRsZXIgcm91dGluZSBmb3IgVHggb3ZlciBIQ0ZfUE9SVF8yLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgc2tiIC0gYSBwb2ludGVyIHRvIHRoZSBza19idWZmIHRvIHRyYW5zbWl0LgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgSENGX1BPUlRfMi4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfdHhfcG9ydDIoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgMlxuIiApOworICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzIgKTsKK30gLy8gd2xfdHhfcG9ydDIKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF90eF9wb3J0MygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoZSBoYW5kbGVyIHJvdXRpbmUgZm9yIFR4IG92ZXIgSENGX1BPUlRfMy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHNrYiAtIGEgcG9pbnRlciB0byB0aGUgc2tfYnVmZiB0byB0cmFuc21pdC4KKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIEhDRl9QT1JUXzMuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3R4X3BvcnQzKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDNcbiIgKTsKKyAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF8zICk7Cit9IC8vIHdsX3R4X3BvcnQzCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfdHhfcG9ydDQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGUgaGFuZGxlciByb3V0aW5lIGZvciBUeCBvdmVyIEhDRl9QT1JUXzQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBza2IgLSBhIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgdG8gdHJhbnNtaXQuCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHJlcHJlc2VudGluZyBIQ0ZfUE9SVF80LgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF90eF9wb3J0NCggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisgICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCA0XG4iICk7CisgICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfNCApOworfSAvLyB3bF90eF9wb3J0NAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3R4X3BvcnQ1KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhlIGhhbmRsZXIgcm91dGluZSBmb3IgVHggb3ZlciBIQ0ZfUE9SVF81LgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgc2tiIC0gYSBwb2ludGVyIHRvIHRoZSBza19idWZmIHRvIHRyYW5zbWl0LgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgSENGX1BPUlRfNS4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfdHhfcG9ydDUoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgNVxuIiApOworICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzUgKTsKK30gLy8gd2xfdHhfcG9ydDUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF90eF9wb3J0NigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoZSBoYW5kbGVyIHJvdXRpbmUgZm9yIFR4IG92ZXIgSENGX1BPUlRfNi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHNrYiAtIGEgcG9pbnRlciB0byB0aGUgc2tfYnVmZiB0byB0cmFuc21pdC4KKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIEhDRl9QT1JUXzYuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3R4X3BvcnQ2KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDZcbiIgKTsKKyAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF82ICk7Cit9IC8vIHdsX3R4X3BvcnQ2CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2RzX2RldmljZV9hbGxvYygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENyZWF0ZSBpbnN0YW5jZXMgb2YgbmV0X2RldmljZSB0byByZXByZXNlbnQgdGhlIFdEUyBwb3J0cywgYW5kIHJlZ2lzdGVyCisgKiAgdGhlIGRldmljZSdzIGVudHJ5IHBvaW50cyBpbiB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQSwgYnV0IHdpbGwgcGxhY2UgcG9pbnRlcnMgdG8gdGhlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgbmV0X2RldmljZQorICogICAgICBzdHJ1Y3RzIGluIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3dkc19kZXZpY2VfYWxsb2MoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisgICAgaW50IGNvdW50OworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfd2RzX2RldmljZV9hbGxvYyIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIC8qIFdEUyBzdXBwb3J0IHJlcXVpcmVzIGFkZGl0aW9uYWwgbmV0X2RldmljZSBzdHJ1Y3RzIHRvIGJlIGFsbG9jYXRlZCwKKyAgICAgICBzbyB0aGF0IHVzZXIgc3BhY2UgYXBwcyBjYW4gdXNlIHRoZXNlIHZpcnR1YWwgZGV2aWNlcyB0byBzcGVjaWZ5IHRoZQorICAgICAgIHBvcnQgb24gd2hpY2ggdG8gVHgvUnggKi8KKyAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgeworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X3dkcyA9IE5VTEw7CisKKyAgICAgICAgZGV2X3dkcyA9IGttYWxsb2MoIHNpemVvZiggc3RydWN0IG5ldF9kZXZpY2UgKSwgR0ZQX0tFUk5FTCApOworICAgICAgICBtZW1zZXQoIGRldl93ZHMsIDAsIHNpemVvZiggc3RydWN0IG5ldF9kZXZpY2UgKSk7CisKKyAgICAgICAgZXRoZXJfc2V0dXAoIGRldl93ZHMgKTsKKworICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldiA9IGRldl93ZHM7CisKKyAgICAgICAgLyogUmUtdXNlIHdsX2luaXQgZm9yIGFsbCB0aGUgZGV2aWNlcywgYXMgaXQgY3VycmVudGx5IGRvZXMgbm90aGluZywgYnV0CisgICAgICAgICAgIGlzIHJlcXVpcmVkLiBSZS11c2UgdGhlIHN0YXRzL3R4X3RpbWVvdXQgaGFuZGxlciBmb3IgYWxsIGFzIHdlbGw7IHRoZQorICAgICAgICAgICBXRFMgcG9ydCB3aGljaCBpcyByZXF1ZXN0aW5nIHRoZXNlIG9wZXJhdGlvbnMgY2FuIGJlIGRldGVybWluZWQgYnkKKyAgICAgICAgICAgdGhlIG5ldF9kZXZpY2UgcG9pbnRlci4gU2V0IHRoZSBwcml2YXRlIG1lbWJlciBvZiBhbGwgZGV2aWNlcyB0byBwb2ludAorICAgICAgICAgICB0byB0aGUgc2FtZSBuZXRfZGV2aWNlIHN0cnVjdDsgdGhhdCB3YXksIGFsbCBpbmZvcm1hdGlvbiBnZXRzCisgICAgICAgICAgIGZ1bm5lbGxlZCB0aHJvdWdoIHRoZSBvbmUgInJlYWwiIG5ldF9kZXZpY2UuIE5hbWUgdGhlIFdEUyBwb3J0cworICAgICAgICAgICAid2RzPG4+IiAqLworICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+aW5pdCAgICAgICAgICAgPSAmd2xfaW5pdDsKKyAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPmdldF9zdGF0cyAgICAgID0gJndsX3N0YXRzOworICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+dHhfdGltZW91dCAgICAgPSAmd2xfdHhfdGltZW91dDsKKyAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKyAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPnByaXYgICAgICAgICAgID0gbHA7CisKKyAgICAgICAgc3ByaW50ZiggbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPm5hbWUsICJ3ZHMlZCIsIGNvdW50ICk7CisgICAgfQorCisgICAgLyogUmVnaXN0ZXIgdGhlIFR4IGhhbmRsZXJzICovCisgICAgbHAtPndkc19wb3J0WzBdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQxOworICAgIGxwLT53ZHNfcG9ydFsxXS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0MjsKKyAgICBscC0+d2RzX3BvcnRbMl0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDM7CisgICAgbHAtPndkc19wb3J0WzNdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQ0OworICAgIGxwLT53ZHNfcG9ydFs0XS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0NTsKKyAgICBscC0+d2RzX3BvcnRbNV0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDY7CisKKyAgICBXTF9XRFNfTkVUSUZfU1RPUF9RVUVVRSggbHAgKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybjsKK30gLy8gd2xfd2RzX2RldmljZV9hbGxvYworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dkc19kZXZpY2VfZGVhbGxvYygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEZyZWUgaW5zdGFuY2VzIG9mIG5ldF9kZXZpY2Ugc3RydWN0dXJlcyB1c2VkIHRvIHN1cHBvcnQgV0RTLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF93ZHNfZGV2aWNlX2RlYWxsb2MoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisgICAgaW50IGNvdW50OworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfd2RzX2RldmljZV9kZWFsbG9jIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldl93ZHMgPSBOVUxMOworCisgICAgICAgIGRldl93ZHMgPSBscC0+d2RzX3BvcnRbY291bnRdLmRldjsKKworICAgICAgICBpZiggZGV2X3dkcyAhPSBOVUxMICkgeworICAgICAgICAgICAgaWYoIGRldl93ZHMtPmZsYWdzICYgSUZGX1VQICkgeworICAgICAgICAgICAgICAgIGRldl9jbG9zZSggZGV2X3dkcyApOworICAgICAgICAgICAgICAgIGRldl93ZHMtPmZsYWdzICY9IH4oIElGRl9VUCB8IElGRl9SVU5OSU5HICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGtmcmVlKCBkZXZfd2RzICk7CisgICAgICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldiA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm47Cit9IC8vIHdsX3dkc19kZXZpY2VfZGVhbGxvYworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dkc19uZXRpZl9zdGFydF9xdWV1ZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFVzZWQgdG8gc3RhcnQgdGhlIG5ldGlmIHF1ZXVlcyBvZiBhbGwgdGhlICJ2aXJ0dWFsIiBuZXR3b3JrIGRldmljZXMKKyAqICAgICAgd2hpY2ggcmVwZXNlbnQgdGhlIFdEUyBwb3J0cy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfd2RzX25ldGlmX3N0YXJ0X3F1ZXVlKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworICAgIGludCBjb3VudDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBpZiggbHAgIT0gTlVMTCApIHsKKyAgICAgICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKKyAgICAgICAgICAgIGlmKCBscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgJiYKKyAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLm5ldGlmX3F1ZXVlX29uID09IEZBTFNFICkgeworICAgICAgICAgICAgICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKCBscC0+d2RzX3BvcnRbY291bnRdLmRldiApOworICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuOworfSAvLyB3bF93ZHNfbmV0aWZfc3RhcnRfcXVldWUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZHNfbmV0aWZfc3RvcF9xdWV1ZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFVzZWQgdG8gc3RvcCB0aGUgbmV0aWYgcXVldWVzIG9mIGFsbCB0aGUgInZpcnR1YWwiIG5ldHdvcmsgZGV2aWNlcworICogICAgICB3aGljaCByZXBlc2VudCB0aGUgV0RTIHBvcnRzLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF93ZHNfbmV0aWZfc3RvcF9xdWV1ZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKyAgICBpbnQgY291bnQ7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgaWYoIGxwICE9IE5VTEwgKSB7CisgICAgICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CisgICAgICAgICAgICBpZiggbHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkICYmCisgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9PSBUUlVFICkgeworICAgICAgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICk7CisgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9IEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuOworfSAvLyB3bF93ZHNfbmV0aWZfc3RvcF9xdWV1ZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dkc19uZXRpZl93YWtlX3F1ZXVlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVXNlZCB0byB3YWtlIHRoZSBuZXRpZiBxdWV1ZXMgb2YgYWxsIHRoZSAidmlydHVhbCIgbmV0d29yayBkZXZpY2VzCisgKiAgICAgIHdoaWNoIHJlcGVzZW50IHRoZSBXRFMgcG9ydHMuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3dkc19uZXRpZl93YWtlX3F1ZXVlKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworICAgIGludCBjb3VudDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBpZiggbHAgIT0gTlVMTCApIHsKKyAgICAgICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKKyAgICAgICAgICAgIGlmKCBscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgJiYKKyAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLm5ldGlmX3F1ZXVlX29uID09IEZBTFNFICkgeworICAgICAgICAgICAgICAgIG5ldGlmX3dha2VfcXVldWUoIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICk7CisgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47Cit9IC8vIHdsX3dkc19uZXRpZl93YWtlX3F1ZXVlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2RzX25ldGlmX2NhcnJpZXJfb24oKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBVc2VkIHRvIHNpZ25hbCB0aGUgbmV0d29yayBsYXllciB0aGF0IGNhcnJpZXIgaXMgcHJlc2VudCBvbiBhbGwgb2YgdGhlCisgKiAgICAgICJ2aXJ0dWFsIiBuZXR3b3JrIGRldmljZXMgd2hpY2ggcmVwZXNlbnQgdGhlIFdEUyBwb3J0cy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfd2RzX25ldGlmX2NhcnJpZXJfb24oIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisgICAgaW50IGNvdW50OworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGlmKCBscCAhPSBOVUxMICkgeworICAgICAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgeworICAgICAgICAgICAgaWYoIGxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCApIHsKKyAgICAgICAgICAgICAgICBuZXRpZl9jYXJyaWVyX29uKCBscC0+d2RzX3BvcnRbY291bnRdLmRldiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuOworfSAvLyB3bF93ZHNfbmV0aWZfY2Fycmllcl9vbgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dkc19uZXRpZl9jYXJyaWVyX29mZigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFVzZWQgdG8gc2lnbmFsIHRoZSBuZXR3b3JrIGxheWVyIHRoYXQgY2FycmllciBpcyBOT1QgcHJlc2VudCBvbiBhbGwgb2YKKyAqICAgICAgdGhlICJ2aXJ0dWFsIiBuZXR3b3JrIGRldmljZXMgd2hpY2ggcmVwZXNlbnQgdGhlIFdEUyBwb3J0cy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfd2RzX25ldGlmX2NhcnJpZXJfb2ZmKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworICAgIGludCBjb3VudDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBpZiggbHAgIT0gTlVMTCApIHsKKyAgICAgICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKKyAgICAgICAgICAgIGlmKCBscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgKSB7CisgICAgICAgICAgICAgICAgbmV0aWZfY2Fycmllcl9vZmYoIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47Cit9IC8vIHdsX3dkc19uZXRpZl9jYXJyaWVyX29mZgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2VuZGlmICAvKiBVU0VfV0RTICovCisKKyNpZmRlZiBFTkFCTEVfRE1BCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfc2VuZF9kbWEoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGUgcm91dGluZSB3aGljaCBwZXJmb3JtcyBkYXRhIHRyYW5zbWl0cyB3aGVuIHVzaW5nIGJ1c21hc3RlciBETUEuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyB3bF9wcml2YXRlIHN0cnVjdC4KKyAqICAgICAgc2tiICAtIGEgcG9pbnRlciB0byB0aGUgbmV0d29yayBsYXllcidzIGRhdGEgYnVmZmVyLgorICogICAgICBwb3J0IC0gdGhlIEhlcm1lcyBwb3J0IG9uIHdoaWNoIHRvIHRyYW5zbWl0LgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIDEgb24gZXJyb3IKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3NlbmRfZG1hKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsIHN0cnVjdCBza19idWZmICpza2IsIGludCBwb3J0ICkKK3sKKyAgICBpbnQgICAgICAgICBsZW47CisgICAgREVTQ19TVFJDVCAqZGVzYyA9IE5VTEw7CisgICAgREVTQ19TVFJDVCAqZGVzY19uZXh0ID0gTlVMTDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX3NlbmRfZG1hIiApOworCisgICAgaWYoIGxwID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiUHJpdmF0ZSBhZGFwdGVyIHN0cnVjdCBpcyBOVUxMXG4iICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiggbHAtPmRldiA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIm5ldF9kZXZpY2Ugc3RydWN0IGluIHdsX3ByaXZhdGUgaXMgTlVMTFxuIiApOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLyogQUdBSU4sIEFMTCBUSEUgUVVFVUVJTkcgRE9ORSBIRVJFIElOIEkvTyBNT0RFIElTIE5PVCBQRVJGT1JNRUQgKi8KKworICAgIGlmKCBza2IgPT0gTlVMTCApCisgICAgeworICAgICAgICBEQkdfV0FSTklORyAoRGJnSW5mbywgIk5vdGhpbmcgdG8gc2VuZC5cbiIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgbGVuID0gc2tiLT5sZW47CisKKyAgICAvKiBHZXQgYSBmcmVlIGRlc2NyaXB0b3IgKi8KKyAgICBkZXNjID0gd2xfcGNpX2RtYV9nZXRfdHhfcGFja2V0KCBscCApOworCisgICAgaWYoIGRlc2MgPT0gTlVMTCApCisgICAgeworICAgICAgICBpZiggbHAtPm5ldGlmX3F1ZXVlX29uID09IFRSVUUgKSB7CisgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKCBscC0+ZGV2ICk7CisgICAgICAgICAgICBXTF9XRFNfTkVUSUZfU1RPUF9RVUVVRSggbHAgKTsKKyAgICAgICAgICAgIGxwLT5uZXRpZl9xdWV1ZV9vbiA9IEZBTFNFOworCisgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKCBza2IgKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgU0VUX0JVRl9DTlQoIGRlc2MsIC8qSENGX0RNQV9GRF9DTlQqL0hGU19BRERSX0RFU1QgKTsKKyAgICBTRVRfQlVGX1NJWkUoIGRlc2MsIEhDRl9ETUFfVFhfQlVGMV9TSVpFICk7CisKKyAgICBkZXNjX25leHQgPSBkZXNjLT5uZXh0X2Rlc2NfYWRkcjsKKworICAgIGlmKCBkZXNjX25leHQtPmJ1Zl9hZGRyID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiRE1BIGRlc2NyaXB0b3IgYnVmX2FkZHIgaXMgTlVMTFxuIiApOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLyogQ29weSB0aGUgcGF5bG9hZCBpbnRvIHRoZSBETUEgcGFja2V0ICovCisgICAgbWVtY3B5KCBkZXNjX25leHQtPmJ1Zl9hZGRyLCBza2ItPmRhdGEsIGxlbiApOworCisgICAgU0VUX0JVRl9DTlQoIGRlc2NfbmV4dCwgbGVuICk7CisgICAgU0VUX0JVRl9TSVpFKCBkZXNjX25leHQsIEhDRl9NQVhfUEFDS0VUX1NJWkUgKTsKKworICAgIGhjZl9kbWFfdHhfcHV0KCAmKCBscC0+aGNmQ3R4ICksIGRlc2MsIDAgKTsKKworICAgIC8qIEZyZWUgdGhlIHNrYiBhbmQgcGVyZm9ybSBxdWV1ZSBjbGVhbnVwLCBhcyB0aGUgYnVmZmVyIHdhcworICAgICAgICAgICAgdHJhbnNtaXR0ZWQgc3VjY2Vzc2Z1bGx5ICovCisgICAgZGV2X2tmcmVlX3NrYiggc2tiICk7CisKKyAgICByZXR1cm4gVFJVRTsKK30gLy8gd2xfc2VuZF9kbWEKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9yeF9kbWEoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGUgcm91dGluZSB3aGljaCBwZXJmb3JtcyBkYXRhIHJlY2VwdGlvbiB3aGVuIHVzaW5nIGJ1c21hc3RlciBETUEuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIDEgb24gZXJyb3IKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3J4X2RtYSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHBvcnQ7CisgICAgaGNmXzE2ICAgICAgICAgICAgICAgICAgIHBrdGxlbjsKKyAgICBoY2ZfMTYgICAgICAgICAgICAgICAgICAgaGZzX3N0YXQ7CisgICAgc3RydWN0IHNrX2J1ZmYgICAgICAgICAgKnNrYjsKKyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAqbHAgPSBOVUxMOworICAgIERFU0NfU1RSQ1QgICAgICAgICAgICAgICpkZXNjLCAqZGVzY19uZXh0OworICAgIC8vQ0ZHX01CX0lORk9fUkFOR0UyX1NUUkNUIHg7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoIndsX3J4IikKKyAgICBEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CisKKyAgICBpZigoKCBscCA9IChzdHJ1Y3Qgd2xfcHJpdmF0ZSAqKWRldi0+cHJpdiApICE9IE5VTEwgKSAmJgorICAgICAgICAgICEoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApKSB7CisKKyNpZmRlZiBVU0VfUlRTCisgICAgICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CisgICAgICAgICAgICBEQkdfUFJJTlQoICJSVFM6IFdlJ3JlIGdldHRpbmcgYW4gUnguLi5cbiIgKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlPOworICAgICAgICB9CisjZW5kaWYgIC8qIFVTRV9SVFMgKi8KKworICAgICAgICAvL2lmKCBscC0+ZG1hLnN0YXR1cyA9PSAwICkKKyAgICAgICAgLy97CisgICAgICAgICAgICBkZXNjID0gaGNmX2RtYV9yeF9nZXQoICYoIGxwLT5oY2ZDdHggKSk7CisKKyAgICAgICAgICAgIGlmKCBkZXNjICE9IE5VTEwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIENoZWNrIGFuZCBzZWUgaWYgd2UgcmN2ZC4gYSBXTVAgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIGlmKCgoICooaGNmXzggKikmZGVzYy0+YnVmX2FkZHJbSEZTX1NUQVRdICkgJgorICAgICAgICAgICAgICAgICAgICAoIEhGU19TVEFUX01TR19UWVBFIHwgSEZTX1NUQVRfRVJSICkpID09IEhGU19TVEFUX1dNUF9NU0cgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiR290IGEgV01QIGZyYW1lXG4iICk7CisKKyAgICAgICAgICAgICAgICAgICAgeC5sZW4gPSBzaXplb2YoIENGR19NQl9JTkZPX1JBTkdFMl9TVFJDVCApIC8gc2l6ZW9mKCBoY2ZfMTYgKTsKKwkJCQkgICAgeC50eXAgPSBDRkdfTUJfSU5GTzsKKwkJCQkgICAgeC5iYXNlX3R5cCA9IENGR19XTVA7CisJCQkJICAgIHguZnJhZ19jbnQgPSAyOworCQkJCSAgICB4LmZyYWdfYnVmWzBdLmZyYWdfbGVuICA9IEdFVF9CVUZfQ05UKCBkZXNjcCApIC8gc2l6ZW9mKCBoY2ZfMTYgKTsKKwkJCQkgICAgeC5mcmFnX2J1ZlswXS5mcmFnX2FkZHIgPSAoaGNmXzggKikgZGVzY3AtPmJ1Zl9hZGRyIDsKKwkJCQkgICAgeC5mcmFnX2J1ZlsxXS5mcmFnX2xlbiAgPSAoIEdFVF9CVUZfQ05UKCBkZXNjcC0+bmV4dF9kZXNjX2FkZHIgKSArIDEgKSAvIHNpemVvZiggaGNmXzE2ICk7CisJCQkJICAgIHguZnJhZ19idWZbMV0uZnJhZ19hZGRyID0gKGhjZl84ICopIGRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+YnVmX2FkZHIgOworCisgICAgICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmeCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgZGVzY19uZXh0ID0gZGVzYy0+bmV4dF9kZXNjX2FkZHI7CisKKyAgICAgICAgICAgICAgICAvKiBNYWtlIHN1cmUgdGhlIGJ1ZmZlciBpc24ndCBlbXB0eSAqLworICAgICAgICAgICAgICAgIGlmKCBHRVRfQlVGX0NOVCggZGVzYyApID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiQnVmZmVyIGlzIGVtcHR5IVxuIiApOworCisgICAgICAgICAgICAgICAgICAgIC8qIEdpdmUgdGhlIGRlc2NyaXB0b3IgYmFjayB0byB0aGUgSENGICovCisgICAgICAgICAgICAgICAgICAgIGhjZl9kbWFfcnhfcHV0KCAmKCBscC0+aGNmQ3R4ICksIGRlc2MgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogUmVhZCB0aGUgSEZTX1NUQVQgcmVnaXN0ZXIgZnJvbSB0aGUgbG9va2FoZWFkIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIGhmc19zdGF0ID0gKGhjZl8xNikoIGRlc2MtPmJ1Zl9hZGRyW0hGU19TVEFULzJdICk7CisKKyAgICAgICAgICAgICAgICAvKiBNYWtlIHN1cmUgdGhlIGZyYW1lIGlzbid0IGJhZCAqLworICAgICAgICAgICAgICAgIGlmKCggaGZzX3N0YXQgJiBIRlNfU1RBVF9FUlIgKSAhPSBIQ0ZfU1VDQ0VTUyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIkhGU19TVEFUX0VSUk9SICgweCV4KSBpbiBSeCBQYWNrZXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmJ1Zl9hZGRyW0hGU19TVEFULzJdICk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogR2l2ZSB0aGUgZGVzY3JpcHRvciBiYWNrIHRvIHRoZSBIQ0YgKi8KKyAgICAgICAgICAgICAgICAgICAgaGNmX2RtYV9yeF9wdXQoICYoIGxwLT5oY2ZDdHggKSwgZGVzYyApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBEZXRlcm1pbmUgd2hhdCBwb3J0IHRoaXMgcGFja2V0IGlzIGZvciAqLworICAgICAgICAgICAgICAgIHBvcnQgPSAoIGhmc19zdGF0ID4+IDggKSAmIDB4MDAwNzsKKyAgICAgICAgICAgICAgICBEQkdfUlgoIERiZ0luZm8sICJSeCBmcmFtZSBmb3IgcG9ydCAlZFxuIiwgcG9ydCApOworCisgICAgICAgICAgICAgICAgaWYoKCBwa3RsZW4gPSBHRVRfQlVGX0NOVCggZGVzY19uZXh0ICkpICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCggc2tiID0gQUxMT0NfU0tCKCBwa3RsZW4gKSkgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggcG9ydCApIHsKKyNpZmRlZiBVU0VfV0RTCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBscC0+d2RzX3BvcnRbcG9ydC0xXS5kZXY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2ItPmRldiA9IGRldjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1BBQ0tFVF9ETUEoIHNrYi0+ZGV2LCBza2IsIHBrdGxlbiApOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBHaXZlIHRoZSBkZXNjcmlwdG9yIGJhY2sgdG8gdGhlIEhDRiAqLworICAgICAgICAgICAgICAgICAgICAgICAgaGNmX2RtYV9yeF9wdXQoICYoIGxwLT5oY2ZDdHggKSwgZGVzYyApOworCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRpZl9yeCggc2tiICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwb3J0ID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0bGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2lmZGVmIFVTRV9XRFMKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9wYWNrZXRzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W3BvcnQtMV0uc3RhdHMucnhfYnl0ZXMgKz0gcGt0bGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmICAvKiBVU0VfV0RTICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkNvdWxkIG5vdCBhbGxvYyBza2JcbiIgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBvcnQgPT0gMCApCisJICAgICAgICAgICAgICAgICAgICB7CisJICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBVU0VfV0RTCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W3BvcnQtMV0uc3RhdHMucnhfZHJvcHBlZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmICAvKiBVU0VfV0RTICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIC8vfQorICAgIH0KKworICAgIHJldHVybiAwOworfSAvLyB3bF9yeF9kbWEKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZW5kaWYgIC8vIEVOQUJMRV9ETUEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX25ldGRldi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbmV0ZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyYWIyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX25ldGRldi5oCkBAIC0wLDAgKzEsMTU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgSGVhZGVyIGRlc2NyaWJpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgdGhlIG5ldHdvcmsgbGF5ZXJlbnRyeSBwb2ludHMKKyAqICAgaW50byB0aGUgZHJpdmVyLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19XTF9ORVRERVZfSF9fCisjZGVmaW5lIF9fV0xfTkVUREVWX0hfXworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfaW5pdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCitpbnQgd2xfY29uZmlnKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCApOworCitzdHJ1Y3QgbmV0X2RldmljZSAqd2xfZGV2aWNlX2FsbG9jKCB2b2lkICk7CisKK3ZvaWQgd2xfZGV2aWNlX2RlYWxsb2MoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKworaW50IHdsX29wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKworaW50IHdsX2Nsb3NlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK2ludCB3bF9pb2N0bCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCApOworCitpbnQgd2xfdHgoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwb3J0ICk7CisKK2ludCB3bF9zZW5kKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworaW50IHdsX3J4KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK3ZvaWQgd2xfdHhfdGltZW91dCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqd2xfc3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKworCisjaWZkZWYgRU5BQkxFX0RNQQoraW50IHdsX3NlbmRfZG1hKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsIHN0cnVjdCBza19idWZmICpza2IsIGludCBwb3J0ICk7CitpbnQgd2xfcnhfZG1hKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisjZW5kaWYKKworI2lmZGVmIE5FV19NVUxUSUNBU1QKK3ZvaWQgd2xfbXVsdGljYXN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisjZWxzZQordm9pZCB3bF9tdWx0aWNhc3QoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBudW1fYWRkcnMsIHZvaWQgKmFkZHJzICk7CisjZW5kaWYgLy8gTkVXX01VTFRJQ0FTVAorCisKK2ludCB3bF90eF9wb3J0MCggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCisKKyNpZmRlZiBVU0VfV0RTCisKK2ludCB3bF90eF9wb3J0MSggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworaW50IHdsX3R4X3BvcnQyKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitpbnQgd2xfdHhfcG9ydDMoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK2ludCB3bF90eF9wb3J0NCggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworaW50IHdsX3R4X3BvcnQ1KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitpbnQgd2xfdHhfcG9ydDYoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKwordm9pZCB3bF93ZHNfZGV2aWNlX2FsbG9jKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK3ZvaWQgd2xfd2RzX2RldmljZV9kZWFsbG9jKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK3ZvaWQgd2xfd2RzX25ldGlmX3N0YXJ0X3F1ZXVlKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK3ZvaWQgd2xfd2RzX25ldGlmX3N0b3BfcXVldWUoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOwordm9pZCB3bF93ZHNfbmV0aWZfd2FrZV9xdWV1ZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7Cit2b2lkIHdsX3dkc19uZXRpZl9jYXJyaWVyX29uKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK3ZvaWQgd2xfd2RzX25ldGlmX2NhcnJpZXJfb2ZmKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworI2VuZGlmICAvKiBVU0VfV0RTICovCisKKworI2lmZGVmIFVTRV9XRFMKKworI2RlZmluZSBXTF9XRFNfREVWSUNFX0FMTE9DKCBBUkcgKSAgICAgIHdsX3dkc19kZXZpY2VfYWxsb2MoIEFSRyApCisjZGVmaW5lIFdMX1dEU19ERVZJQ0VfREVBTExPQyggQVJHICkgICAgd2xfd2RzX2RldmljZV9kZWFsbG9jKCBBUkcgKQorI2RlZmluZSBXTF9XRFNfTkVUSUZfU1RBUlRfUVVFVUUoIEFSRyApIHdsX3dkc19uZXRpZl9zdGFydF9xdWV1ZSggQVJHICkKKyNkZWZpbmUgV0xfV0RTX05FVElGX1NUT1BfUVVFVUUoIEFSRyApICB3bF93ZHNfbmV0aWZfc3RvcF9xdWV1ZSggQVJHICkKKyNkZWZpbmUgV0xfV0RTX05FVElGX1dBS0VfUVVFVUUoIEFSRyApICB3bF93ZHNfbmV0aWZfd2FrZV9xdWV1ZSggQVJHICkKKyNkZWZpbmUgV0xfV0RTX05FVElGX0NBUlJJRVJfT04oIEFSRyApICB3bF93ZHNfbmV0aWZfY2Fycmllcl9vbiggQVJHICkKKyNkZWZpbmUgV0xfV0RTX05FVElGX0NBUlJJRVJfT0ZGKCBBUkcgKSB3bF93ZHNfbmV0aWZfY2Fycmllcl9vZmYoIEFSRyApCisKKyNlbHNlCisKKyNkZWZpbmUgV0xfV0RTX0RFVklDRV9BTExPQyggQVJHICkKKyNkZWZpbmUgV0xfV0RTX0RFVklDRV9ERUFMTE9DKCBBUkcgKQorI2RlZmluZSBXTF9XRFNfTkVUSUZfU1RBUlRfUVVFVUUoIEFSRyApCisjZGVmaW5lIFdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKCBBUkcgKQorI2RlZmluZSBXTF9XRFNfTkVUSUZfV0FLRV9RVUVVRSggQVJHICkKKyNkZWZpbmUgV0xfV0RTX05FVElGX0NBUlJJRVJfT04oIEFSRyApCisjZGVmaW5lIFdMX1dEU19ORVRJRl9DQVJSSUVSX09GRiggQVJHICkKKworI2VuZGlmICAvKiBVU0VfV0RTICovCisKKworI2VuZGlmICAvLyBfX1dMX05FVERFVl9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkYjExMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3BjaS5jCkBAIC0wLDAgKzEsMTU4MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIFRoaXMgZmlsZSBjb250YWlucyBwcm9jZXNzaW5nIGFuZCBpbml0aWFsaXphdGlvbiBzcGVjaWZpYyB0byBQQ0kvbWluaVBDSQorICogICBkZXZpY2VzLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPHdpcmVsZXNzL3dsX3ZlcnNpb24uaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisvLyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorCisjaW5jbHVkZSA8aGNmL2RlYnVnLmg+CisKKyNpbmNsdWRlIDxoY2YuaD4KKyNpbmNsdWRlIDxkaGYuaD4KKyNpbmNsdWRlIDxoY2ZkZWYuaD4KKworI2luY2x1ZGUgPHdpcmVsZXNzL3dsX2lmLmg+CisjaW5jbHVkZSA8d2lyZWxlc3Mvd2xfaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx3aXJlbGVzcy93bF91dGlsLmg+CisjaW5jbHVkZSA8d2lyZWxlc3Mvd2xfbWFpbi5oPgorI2luY2x1ZGUgPHdpcmVsZXNzL3dsX25ldGRldi5oPgorI2luY2x1ZGUgPHdpcmVsZXNzL3dsX3BjaS5oPgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnbG9iYWwgdmFyaWFibGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIERCRworZXh0ZXJuIGRiZ19pbmZvX3QgKkRiZ0luZm87CisjZW5kaWYgIC8vIERCRworCisvKiBkZWZpbmUgdGhlIFBDSSBkZXZpY2UgVGFibGUgQ2FyZG5hbWUgYW5kIGlkIHRhYmxlcyAqLworZW51bSBoZXJtZXNfcGNpX3ZlcnNpb25zIHsKKwlDSF9BZ2VyZV9TeXN0ZW1zX01pbmlfUENJX1YxID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB3bF9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFdMX0xLTV9QQ0lfVkVORE9SX0lELCBXTF9MS01fUENJX0RFVklDRV9JRF8wLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF9BZ2VyZV9TeXN0ZW1zX01pbmlfUENJX1YxIH0sCisgICAgeyBXTF9MS01fUENJX1ZFTkRPUl9JRCwgV0xfTEtNX1BDSV9ERVZJQ0VfSURfMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfQWdlcmVfU3lzdGVtc19NaW5pX1BDSV9WMSB9LAorICAgIHsgV0xfTEtNX1BDSV9WRU5ET1JfSUQsIFdMX0xLTV9QQ0lfREVWSUNFX0lEXzIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX0FnZXJlX1N5c3RlbXNfTWluaV9QQ0lfVjEgfSwKKwl7IH0JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHdsX3BjaV90YmwpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnVuY3Rpb24gcHJvdG90eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBfX2RldmluaXQgd2xfcGNpX3Byb2JlKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCApOwordm9pZCBfX2RldmV4aXQgd2xfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CitpbnQgd2xfcGNpX3NldHVwKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiApOwordm9pZCB3bF9wY2lfZW5hYmxlX2NhcmRidXNfaW50ZXJydXB0cyggc3RydWN0IHBjaV9kZXYgKnBkZXYgKTsKKworI2lmZGVmIEVOQUJMRV9ETUEKK2ludCB3bF9wY2lfZG1hX2FsbG9jKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CitpbnQgd2xfcGNpX2RtYV9mcmVlKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CitpbnQgd2xfcGNpX2RtYV9hbGxvY190eF9wYWNrZXQoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICk7CitpbnQgd2xfcGNpX2RtYV9mcmVlX3R4X3BhY2tldCggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKTsKK2ludCB3bF9wY2lfZG1hX2FsbG9jX3J4X3BhY2tldCggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKTsKK2ludCB3bF9wY2lfZG1hX2ZyZWVfcnhfcGFja2V0KCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApOworaW50IHdsX3BjaV9kbWFfYWxsb2NfZGVzY19hbmRfYnVmKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYywgaW50IHNpemUgKTsKK2ludCB3bF9wY2lfZG1hX2ZyZWVfZGVzY19hbmRfYnVmKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApOworaW50IHdsX3BjaV9kbWFfYWxsb2NfZGVzYyggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICk7CitpbnQgd2xfcGNpX2RtYV9mcmVlX2Rlc2MoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApOworaW50IHdsX3BjaV9kbWFfYWxsb2NfYnVmKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICpkZXNjLCBpbnQgc2l6ZSApOworaW50IHdsX3BjaV9kbWFfZnJlZV9idWYoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKmRlc2MgKTsKKwordm9pZCB3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3J4KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKyNlbmRpZiAgLy8gRU5BQkxFX0RNQQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUENJIG1vZHVsZSBmdW5jdGlvbiByZWdpc3RyYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgd2xfZHJpdmVyID0KK3sKKwluYW1lOgkJTU9EVUxFX05BTUUsCisgICAgaWRfdGFibGU6CXdsX3BjaV90YmwsCisJcHJvYmU6CQl3bF9wY2lfcHJvYmUsCisJcmVtb3ZlOgkJX19kZXZleGl0X3Aod2xfcGNpX3JlbW92ZSksCisgICAgc3VzcGVuZDogICAgTlVMTCwKKyAgICByZXN1bWU6ICAgICBOVUxMLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2FkYXB0ZXJfaW5pdF9tb2R1bGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDYWxsZWQgYnkgaW5pdF9tb2R1bGUoKSB0byBwZXJmb3JtIFBDSS1zcGVjaWZpYyBkcml2ZXIgaW5pdGlhbGl6YXRpb24uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBOL0EKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2FkYXB0ZXJfaW5pdF9tb2R1bGUoIHZvaWQgKQoreworICAgIGludCByZXN1bHQ7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2luaXRfbW9kdWxlKCkiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAid2xfYWRhcHRlcl9pbml0X21vZHVsZSgpIC0tIFBDSVxuIiApOworCisgICAgcmVzdWx0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlciggJndsX2RyaXZlciApOyAvLzs/cmVwbGFjZSB3aXRoIHBjaV9tb2R1bGVfaW5pdCwgUnViaW5pIHBnIDQ5MAorCS8vOz8gd2h5IG5vdCBkbyBzb21ldGhpbmcgd2l0aCB0aGUgcmVzdWx0CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm4gMDsKK30gLy8gd2xfYWRhcHRlcl9pbml0X21vZHVsZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDYWxsZWQgYnkgY2xlYW51cF9tb2R1bGUoKSB0byBwZXJmb3JtIFBDSS1zcGVjaWZpYyBkcml2ZXIgY2xlYW51cC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSggdm9pZCApCit7CisJLy87P2hvdyBjb21lcyB3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlIGlzIGxvY2F0ZWQgaW4gYSBzZWVtaW5nbHkgcGNpIHNwZWNpZmljIG1vZHVsZQorICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCS8vOz9EQkdfVFJBQ0UgYmVsb3cgZmVlbHMgbGlrZSBuZWFybHkgcmVkdW5kYW50IGluIHRoZSBsaWdodCBvZiBEQkdfRU5URVIgYWJvdmUKKyAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJ3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlKCkgLS0gUENJXG4iICk7CisKKyAgICBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoICZ3bF9kcml2ZXIgKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybjsKK30gLy8gd2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2FkYXB0ZXJfaW5zZXJ0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ2FsbGVkIGJ5IHdsX3BjaV9wcm9iZSgpIHRvIGNvbnRpbnVlIHRoZSBwcm9jZXNzIG9mIGRldmljZSBpbnNlcnRpb24uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBUUlVFIG9yIEZBTFNFCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9hZGFwdGVyX2luc2VydCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisgICAgaW50IHJlc3VsdCA9IEZBTFNFOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9pbnNlcnQiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJ3bF9hZGFwdGVyX2luc2VydCgpIC0tIFBDSVxuIiApOworCisgICAgaWYoIGRldiA9PSBOVUxMICkgeworICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJuZXRfZGV2aWNlIHBvaW50ZXIgaXMgTlVMTCEhIVxuIiApOworICAgIH0gZWxzZSBpZiggZGV2LT5wcml2ID09IE5VTEwgKSB7CisgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIndsX3ByaXZhdGUgcG9pbnRlciBpcyBOVUxMISEhXG4iICk7CisgICAgfSBlbHNlIGlmKCB3bF9pbnNlcnQoIGRldiApICkgeyAvKiBQZXJmb3JtIHJlbWFpbmluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24gKi8KKwkJcmVzdWx0ID0gVFJVRTsKKwl9IGVsc2UgeworICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJ3bF9pbnNlcnQoKSBGQUlMRURcbiIgKTsKKyAgICB9CisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30gLy8gd2xfYWRhcHRlcl9pbnNlcnQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9hZGFwdGVyX29wZW4oKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBPcGVuIHRoZSBkZXZpY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBhbiBIQ0Ygc3RhdHVzIGNvZGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2FkYXB0ZXJfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisgICAgaW50ICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICBpbnQgICAgICAgICBoY2Zfc3RhdHVzID0gSENGX1NVQ0NFU1M7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX29wZW4iICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJ3bF9hZGFwdGVyX29wZW4oKSAtLSBQQ0lcbiIgKTsKKworICAgIGhjZl9zdGF0dXMgPSB3bF9vcGVuKCBkZXYgKTsKKworICAgIGlmKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgeworICAgICAgICByZXN1bHQgPSAtRU5PREVWOworICAgIH0KKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybiByZXN1bHQ7Cit9IC8vIHdsX2FkYXB0ZXJfb3BlbgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2FkYXB0ZXJfY2xvc2UoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDbG9zZSB0aGUgZGV2aWNlCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9hZGFwdGVyX2Nsb3NlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfY2xvc2UiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJ3bF9hZGFwdGVyX2Nsb3NlKCkgLS0gUENJXG4iICk7CisgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiJXM6IFNodXR0aW5nIGRvd24gYWRhcHRlci5cbiIsIGRldi0+bmFtZSApOworCisgICAgd2xfY2xvc2UoIGRldiApOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuIDA7Cit9IC8vIHdsX2FkYXB0ZXJfY2xvc2UKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9hZGFwdGVyX2lzX29wZW4oKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDaGVjayB3aGV0aGVyIHRoaXMgZGV2aWNlIGlzIG9wZW4uIFJldHVybnMKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIG5vbnplcm8gaWYgZGV2aWNlIGlzIG9wZW4uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9hZGFwdGVyX2lzX29wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworICAgIC8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBQQ01DSUEgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgJ29wZW4nIGZpZWxkCisgICAgICAgaW4gdGhlIGRldl9saW5rX3Qgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBhIG5ldHdvcmsgZGV2aWNlLiBUaGVyZQorICAgICAgIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbiBhbmFsb2cgdG8gdGhpcyBmb3IgUENJLCBhbmQgY2hlY2tpbmcgdGhlIHN0YXR1cworICAgICAgIGNvbnRhaW5lZCBpbiB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUgZG9lc24ndCBoYXZlIHRoZSBzYW1lIGVmZmVjdC4KKyAgICAgICBGb3Igbm93LCByZXR1cm4gVFJVRSwgYnV0IGZpbmQgb3V0IGlmIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBQQ0kuICovCisKKyAgICByZXR1cm4gVFJVRTsKK30gLy8gd2xfYWRhcHRlcl9pc19vcGVuCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX3Byb2JlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUmVnaXN0ZXJlZCBpbiB0aGUgcGNpX2RyaXZlciBzdHJ1Y3R1cmUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlCisgKiAgUENJIHN1YnN5c3RlbSBmaW5kcyBhIG5ldyBQQ0kgZGV2aWNlIHdoaWNoIG1hdGNoZXMgdGhlIGluZm9tYXRpb24gY29udGFpbmVkCisgKiAgaW4gdGhlIHBjaV9kZXZpY2VfaWQgdGFibGUuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwZGV2ICAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQorICogICAgICBlbnQgICAgIC0gdGhpcyBkZXZpY2UncyBlbnRyeSBpbiB0aGUgcGNpX2RldmljZV9pZCB0YWJsZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgX19kZXZpbml0IHdsX3BjaV9wcm9iZSggc3RydWN0IHBjaV9kZXYgKnBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQgKQoreworICAgIGludCByZXN1bHQ7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9wY2lfcHJvYmUiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisJREJHX1BSSU5UKCAiJXNcbiIsIFZFUlNJT05fSU5GTyApOworCisgICAgcmVzdWx0ID0gd2xfcGNpX3NldHVwKCBwZGV2ICk7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9IC8vIHdsX3BjaV9wcm9iZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9yZW1vdmUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBSZWdpc3RlcmVkIGluIHRoZSBwY2lfZHJpdmVyIHN0cnVjdHVyZSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUKKyAqICBQQ0kgc3Vic3lzdGVtIGRldGVjdHMgdGhhdCBhIFBDSSBkZXZpY2Ugd2hpY2ggbWF0Y2hlcyB0aGUgaW5mb21hdGlvbgorICogIGNvbnRhaW5lZCBpbiB0aGUgcGNpX2RldmljZV9pZCB0YWJsZSBoYXMgYmVlbiByZW1vdmVkLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIF9fZGV2ZXhpdCB3bF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICAgICAgICpkZXYgPSBOVUxMOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfcGNpX3JlbW92ZSIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIC8qIE1ha2Ugc3VyZSB0aGUgcGNpX2RldiBwb2ludGVyIHBhc3NlZCBpbiBpcyB2YWxpZCAqLworICAgIGlmKCBwZGV2ID09IE5VTEwgKSB7CisgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIlBDSSBzdWJzeXMgcGFzc2VkIGluIGFuIGludmFsaWQgcGNpX2RldiBwb2ludGVyXG4iICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilwY2lfZ2V0X2RydmRhdGEoIHBkZXYgKTsKKyAgICBpZiggZGV2ID09IE5VTEwgKSB7CisgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkNvdWxkIG5vdCByZXRyaWV2ZSBuZXRfZGV2aWNlIHN0cnVjdHVyZVxuIiApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogUGVyZm9ybSBkZXZpY2UgY2xlYW51cCAqLworICAgIHdsX3JlbW92ZSggZGV2ICk7CisgICAgZnJlZV9pcnEoIGRldi0+aXJxLCBkZXYgKTsKKworI2lmZGVmIEVOQUJMRV9ETUEKKyAgICB3bF9wY2lfZG1hX2ZyZWUoIHBkZXYsIChzdHJ1Y3Qgd2xfcHJpdmF0ZSAqKWRldi0+cHJpdiApOworI2VuZGlmCisKKyAgICB3bF9kZXZpY2VfZGVhbGxvYyggZGV2ICk7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm47Cit9IC8vIHdsX3BjaV9yZW1vdmUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfc2V0dXAoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDYWxsZWQgYnkgd2xfcGNpX3Byb2JlKCkgdG8gYmVnaW4gYSBkZXZpY2UncyBpbml0aWFsaXphdGlvbiBwcm9jZXNzLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3BjaV9zZXR1cCggc3RydWN0IHBjaV9kZXYgKnBkZXYgKQoreworICAgIGludCAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXYgPSBOVUxMOworICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gTlVMTDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX3BjaV9zZXR1cCIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIC8qIE1ha2Ugc3VyZSB0aGUgcGNpX2RldiBwb2ludGVyIHBhc3NlZCBpbiBpcyB2YWxpZCAqLworICAgIGlmKCBwZGV2ID09IE5VTEwgKSB7CisgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIlBDSSBzdWJzeXMgcGFzc2VkIGluIGFuIGludmFsaWQgcGNpX2RldiBwb2ludGVyXG4iICk7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIHJlc3VsdCA9IHBjaV9lbmFibGVfZGV2aWNlKCBwZGV2ICk7CisgICAgaWYoIHJlc3VsdCAhPSAwICkgeworICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJwY2lfZW5hYmxlX2RldmljZSgpIGZhaWxlZFxuIiApOworICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKiBXZSBmb3VuZCBvdXIgZGV2aWNlISBMZXQncyByZWdpc3RlciBpdCB3aXRoIHRoZSBzeXN0ZW0gKi8KKyAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJGb3VuZCBvdXIgZGV2aWNlLCBub3cgcmVnaXN0ZXJpbmdcbiIgKTsKKyAgICBkZXYgPSB3bF9kZXZpY2VfYWxsb2MoICk7CisgICAgaWYoIGRldiA9PSBOVUxMICkgeworICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJDb3VsZCBub3QgcmVnaXN0ZXIgZGV2aWNlISEhXG4iICk7CisgICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisKKyAgICAvKiBNYWtlIHN1cmUgdGhhdCBzcGFjZSB3YXMgYWxsb2NhdGVkIGZvciBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdCAqLworICAgIGlmKCBkZXYtPnByaXYgPT0gTlVMTCApIHsKKyAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiUHJpdmF0ZSBhZGFwdGVyIHN0cnVjdCB3YXMgbm90IGFsbG9jYXRlZCEhIVxuIiApOworICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgfQorCisjaWZkZWYgRU5BQkxFX0RNQQorICAgIC8qIEFsbG9jYXRlIERNQSBEZXNjcmlwdG9ycyAqLworICAgIGlmKCB3bF9wY2lfZG1hX2FsbG9jKCBwZGV2LCAoc3RydWN0IHdsX3ByaXZhdGUgKilkZXYtPnByaXYgKSA8IDAgKSB7CisgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkNvdWxkIG5vdCBhbGxvY2F0ZSBETUEgZGVzY3JpcHRvciBtZW1vcnkhISFcbiIgKTsKKyAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIH0KKyNlbmRpZgorCisgICAgLyogUmVnaXN0ZXIgb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUgd2l0aCBQQ0kgKi8KKyAgICBwY2lfc2V0X2RydmRhdGEoIHBkZXYsIGRldiApOworCisgICAgLyogRmlsbCBvdXQgYnVzIHNwZWNpZmljIGluZm9ybWF0aW9uIGluIHRoZSBuZXRfZGV2aWNlIHN0cnVjdCAqLworICAgIGRldi0+aXJxID0gcGRldi0+aXJxOworICAgIFNFVF9NT0RVTEVfT1dORVIoIGRldiApOworCisgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiRGV2aWNlIEJhc2UgQWRkcmVzczogJSMwM2x4XG4iLCBwZGV2LT5yZXNvdXJjZVswXS5zdGFydCApOworCWRldi0+YmFzZV9hZGRyID0gcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQ7CisKKyAgICAvKiBJbml0aWFsaXplIG91ciBkZXZpY2UgaGVyZSAqLworICAgIGlmKCAhd2xfYWRhcHRlcl9pbnNlcnQoIGRldiApKSB7CisgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIndsX2FkYXB0ZXJfaW5zZXJ0KCkgRkFJTEVEISEhXG4iICk7CisgICAgICAgIHdsX2RldmljZV9kZWFsbG9jKCBkZXYgKTsKKyAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8qIFJlZ2lzdGVyIG91ciBJU1IgKi8KKyAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJSZWdpc3RlcmluZyBJU1IuLi5cbiIgKTsKKworICAgIHJlc3VsdCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCB3bF9pc3IsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldik7CisgICAgaWYoIHJlc3VsdCApIHsKKyAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJDb3VsZCBub3QgcmVnaXN0ZXIgSVNSISEhXG4iICk7CisgICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgICAgICByZXR1cm4gcmVzdWx0OworCX0KKworICAgIC8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkIHByb3Blcmx5IGZvciBDYXJkQnVzICovCisgICAgbHAgPSAoc3RydWN0IHdsX3ByaXZhdGUgKilkZXYtPnByaXY7CisKKyAgICBpZiggbHAtPmhjZkN0eC5JRkJfQnVzVHlwZSA9PSBDRkdfTklDX0JVU19UWVBFX0NBUkRCVVMgfHwKKwkgICAgbHAtPmhjZkN0eC5JRkJfQnVzVHlwZSA9PSBDRkdfTklDX0JVU19UWVBFX1BDSSAJCSkgeworICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJUaGlzIGlzIGEgUENJL0NhcmRCdXMgY2FyZCwgZW5hYmxlIGludGVycnVwdHNcbiIgKTsKKyAgICAgICAgd2xfcGNpX2VuYWJsZV9jYXJkYnVzX2ludGVycnVwdHMoIHBkZXYgKTsKKyAgICB9CisKKyAgICAvKiBFbmFibGUgYnVzIG1hc3RlcmluZyAqLworICAgIHBjaV9zZXRfbWFzdGVyKCBwZGV2ICk7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm4gMDsKK30gLy8gd2xfcGNpX3NldHVwCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX2VuYWJsZV9jYXJkYnVzX2ludGVycnVwdHMoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDYWxsZWQgYnkgd2xfcGNpX3NldHVwKCkgdG8gZW5hYmxlIGludGVycnVwdHMgb24gYSBDYXJkQnVzIGRldmljZS4gVGhpcworICogIGlzIGRvbmUgYnkgd3JpdGluZyBiaXQgMTUgdG8gdGhlIGZ1bmN0aW9uIGV2ZW50IG1hc2sgcmVnaXN0ZXIuIFRoaXMKKyAqICBDYXJkQnVzLXNwZWNpZmljIHJlZ2lzdGVyIGlzIGxvY2F0ZWQgaW4gQkFSMiAoY291bnRpbmcgZnJvbSBCQVIwKSwgaW4gbWVtb3J5CisgKiAgc3BhY2UgYXQgYnl0ZSBvZmZzZXQgMWY0ICg3ZjQgZm9yIFdBUlApLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3BjaV9lbmFibGVfY2FyZGJ1c19pbnRlcnJ1cHRzKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiApCit7CisgICAgdTMyICAgICAgICAgICAgICAgICBiYXIyX3JlZzsKKyAgICB1MzIgICAgICAgICAgICAgICAgIG1lbV9hZGRyX2J1czsKKyAgICB1MzIgICAgICAgICAgICAgICAgIGZ1bmNfZXZ0X21hc2tfcmVnOworICAgIHZvaWQgICAgICAgICAgICAgICAgKm1lbV9hZGRyX2tlcm4gPSBOVUxMOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfcGNpX2VuYWJsZV9jYXJkYnVzX2ludGVycnVwdHMiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICAvKiBJbml0aWFsaXplIHRvIGtub3duIGJhZCB2YWx1ZXMgKi8KKyAgICBiYXIyX3JlZyA9IDB4ZGVhZGJlZWY7CisgICAgbWVtX2FkZHJfYnVzID0gMHhkZWFkYmVlZjsKKworICAgIC8qIFJlYWQgdGhlIEJBUjIgcmVnaXN0ZXI7IHRoaXMgcmVnaXN0ZXIgY29udGFpbnMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUKKyAgICAgICBtZW1vcnkgcmVnaW9uIHdoZXJlIHRoZSBmdW5jdGlvbiBldmVudCBtYXNrIHJlZ2lzdGVyIGxpdmVzICovCisgICAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKCBwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzIsICZiYXIyX3JlZyApOworICAgIG1lbV9hZGRyX2J1cyA9IGJhcjJfcmVnICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKworICAgIC8qIE9uY2UgdGhlIGJhc2UgYWRkcmVzcyBpcyBvYnRhaW5lZCwgcmVtYXAgdGhlIG1lbW9yeSByZWdpb24gdG8ga2VybmVsCisgICAgICAgc3BhY2Ugc28gd2UgY2FuIHJldHJpZXZlIHRoZSByZWdpc3RlciAqLworICAgIG1lbV9hZGRyX2tlcm4gPSBpb3JlbWFwKCBtZW1fYWRkcl9idXMsIDB4MjAwICk7CisKKyNpZmRlZiBIRVJNRVMyNQorI2RlZmluZSBSRUdfT0ZGU0VUICAweDA3RjQKKyNlbHNlCisjZGVmaW5lIFJFR19PRkZTRVQgIDB4MDFGNAorI2VuZGlmIC8vIEhFUk1FUzI1CisKKyNkZWZpbmUgQklUMTUgICAgICAgMHg4MDAwCisKKyAgICAvKiBSZXRyaWV2ZSB0aGUgZnVuY3Rpb25hbCBldmVudCBtYXNrIHJlZ2lzdGVyLCBlbmFibGUgaW50ZXJydXB0cyBieQorICAgICAgIHNldHRpbmcgQml0IDE1LCBhbmQgd3JpdGUgYmFjayB0aGUgdmFsdWUgKi8KKyAgICBmdW5jX2V2dF9tYXNrX3JlZyA9ICoodTMyICopKCBtZW1fYWRkcl9rZXJuICsgUkVHX09GRlNFVCApOworICAgIGZ1bmNfZXZ0X21hc2tfcmVnIHw9IEJJVDE1OworICAgICoodTMyICopKCBtZW1fYWRkcl9rZXJuICsgUkVHX09GRlNFVCApID0gZnVuY19ldnRfbWFza19yZWc7CisKKyAgICAvKiBPbmNlIGNvbXBsZXRlLCB1bm1hcCB0aGUgcmVnaW9uIGFuZCBleGl0ICovCisgICAgaW91bm1hcCggbWVtX2FkZHJfa2VybiApOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuOworfSAvLyB3bF9wY2lfZW5hYmxlX2NhcmRidXNfaW50ZXJydXB0cworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmZGVmIEVOQUJMRV9ETUEKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfZG1hX2FsbG9jKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQWxsb2NhdGVzIGFsbCByZXNvdXJjZXMgbmVlZGVkIGZvciBQQ0kvQ2FyZEJ1cyBETUEgb3BlcmF0aW9uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfcGNpX2RtYV9hbGxvYyggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisgICAgaW50IGk7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9wY2lfZG1hX2FsbG9jIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisvLyAgICAgbHAtPmRtYS50eF9yc2NfaW5kID0gbHAtPmRtYS5yeF9yc2NfaW5kID0gMDsKKy8vCisvLyAgICAgLyogQWxsb2MgZm9yIHRoZSBUeCBjaGFpbiBhbmQgaXRzIHJlY2xhaW0gZGVzY3JpcHRvciAqLworLy8gICAgIGZvciggaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrICkgeworLy8gICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2FsbG9jX3R4X3BhY2tldCggcGRldiwgbHAsICZscC0+ZG1hLnR4X3BhY2tldFtpXSApOworLy8gICAgICAgICBpZiggc3RhdHVzID09IDAgKSB7CisvLyAgICAgICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnR4X3BhY2tldFslZF0gOiAgICAgICAgICAgICAgICAgMHglcFxuIiwgaSwgbHAtPmRtYS50eF9wYWNrZXRbaV0gKTsKKy8vICAgICAgICAgICAgIERCR19QUklOVCggImxwLT5kbWEudHhfcGFja2V0WyVkXS0+bmV4dF9kZXNjX2FkZHIgOiAweCVwXG4iLCBpLCBscC0+ZG1hLnR4X3BhY2tldFtpXS0+bmV4dF9kZXNjX2FkZHIgKTsKKy8vICAgICAgICAgICAgIGxwLT5kbWEudHhfcnNjX2luZCsrOworLy8gICAgICAgICB9IGVsc2UgeworLy8gICAgICAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiQ291bGQgbm90IGFsbG9jIERNQSBUeCBQYWNrZXRcbiIgKTsKKy8vICAgICAgICAgICAgIGJyZWFrOworLy8gICAgICAgICB9CisvLyAgICAgfQorLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKy8vICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9hbGxvY19kZXNjKCBwZGV2LCBscCwgJmxwLT5kbWEudHhfcmVjbGFpbV9kZXNjICk7CisvLyAgICAgICAgIERCR19QUklOVCggImxwLT5kbWEudHhfcmVjbGFpbV9kZXNjOiAweCVwXG4iLCBscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYyApOworLy8gICAgIH0KKy8vICAgICAvKiBBbGxvYyBmb3IgdGhlIFJ4IGNoYWluIGFuZCBpdHMgcmVjbGFpbSBkZXNjcmlwdG9yICovCisvLyAgICAgaWYoIHN0YXR1cyA9PSAwICkgeworLy8gICAgICAgICBmb3IoIGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKyApIHsKKy8vICAgICAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfYWxsb2NfcnhfcGFja2V0KCBwZGV2LCBscCwgJmxwLT5kbWEucnhfcGFja2V0W2ldICk7CisvLyAgICAgICAgICAgICBpZiggc3RhdHVzID09IDAgKSB7CisvLyAgICAgICAgICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS5yeF9wYWNrZXRbJWRdICAgICAgICAgICAgICAgICA6IDB4JXBcbiIsIGksIGxwLT5kbWEucnhfcGFja2V0W2ldICk7CisvLyAgICAgICAgICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS5yeF9wYWNrZXRbJWRdLT5uZXh0X2Rlc2NfYWRkciA6IDB4JXBcbiIsIGksIGxwLT5kbWEucnhfcGFja2V0W2ldLT5uZXh0X2Rlc2NfYWRkciApOworLy8gICAgICAgICAgICAgICAgIGxwLT5kbWEucnhfcnNjX2luZCsrOworLy8gICAgICAgICAgICAgfSBlbHNlIHsKKy8vICAgICAgICAgICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJDb3VsZCBub3QgYWxsb2MgRE1BIFJ4IFBhY2tldFxuIiApOworLy8gICAgICAgICAgICAgICAgIGJyZWFrOworLy8gICAgICAgICAgICAgfQorLy8gICAgICAgICB9CisvLyAgICAgfQorLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKy8vICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9hbGxvY19kZXNjKCBwZGV2LCBscCwgJmxwLT5kbWEucnhfcmVjbGFpbV9kZXNjICk7CisvLyAgICAgICAgIERCR19QUklOVCggImxwLT5kbWEucnhfcmVjbGFpbV9kZXNjOiAweCVwXG4iLCBscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYyApOworLy8gICAgIH0KKy8vICAgICAvKiBTdG9yZSBzdGF0dXMsIGFzIGhvc3Qgc2hvdWxkIG5vdCBjYWxsIEhDRiBmdW5jdGlvbnMgaWYgdGhpcyBmYWlscyAqLworLy8gICAgIGxwLT5kbWEuc3RhdHVzID0gc3RhdHVzOyAgLy87P2FsbCB1c2VhZ2VzIG9mIGRtYS5zdGF0dXMgaGF2ZSBiZWVuIGNvbW1lbnRlZCBvdXQKKy8vICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvLyB3bF9wY2lfZG1hX2FsbG9jCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX2RtYV9mcmVlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgRGVhbGxvY2F0ZWQgYWxsIHJlc291cmNlcyBuZWVkZWQgZm9yIFBDSS9DYXJkQnVzIERNQSBvcGVyYXRpb24KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9wY2lfZG1hX2ZyZWUoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworICAgIGludCBpOworICAgIGludCBzdGF0dXMgPSAwOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfcGNpX2RtYV9mcmVlIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgLyogUmVjbGFpbSBhbGwgUnggcGFja2V0cyB0aGF0IHdlcmUgaGFuZGVkIG92ZXIgdG8gdGhlIEhDRiAqLworICAgIC8qIERvIEkgbmVlZCB0byBkbyB0aGlzPyBCZWZvcmUgdGhpcyBmcmVlIGlzIGNhbGxlZCwgSSd2ZSBhbHJlYWR5IGRpc2FibGVkCisgICAgICAgdGhlIHBvcnQgd2hpY2ggd2lsbCBjYWxsIHdsX3BjaV9kbWFfaGNmX3JlY2xhaW0gKi8KKyAgICAvL2lmKCBscC0+ZG1hLnN0YXR1cyA9PSAwICkKKyAgICAvL3sKKyAgICAvLyAgICB3bF9wY2lfZG1hX2hjZl9yZWNsYWltKCBscCApOworICAgIC8vfQorCisgICAgLyogRnJlZSBldmVyeXRoaW5nIG5lZWRlZCBmb3IgRE1BIFJ4ICovCisgICAgZm9yKCBpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKysgKSB7CisgICAgICAgIGlmKCBscC0+ZG1hLnJ4X3BhY2tldFtpXSApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfZnJlZV9yeF9wYWNrZXQoIHBkZXYsIGxwLCAmbHAtPmRtYS5yeF9wYWNrZXRbaV0gKTsKKyAgICAgICAgICAgIGlmKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIlByb2JsZW0gZnJlZWluZyBSeCBwYWNrZXRcbiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBscC0+ZG1hLnJ4X3JzY19pbmQgPSAwOworCisgICAgaWYoIGxwLT5kbWEucnhfcmVjbGFpbV9kZXNjICkgeworICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2ZyZWVfZGVzYyggcGRldiwgbHAsICZscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYyApOworICAgICAgICBpZiggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIlByb2JsZW0gZnJlZWluZyBSeCByZWNsYWltIGRlc2NyaXB0b3JcbiIgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEZyZWUgZXZlcnl0aGluZyBuZWVkZWQgZm9yIERNQSBUeCAqLworICAgIGZvciggaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrICkgeworICAgICAgICBpZiggbHAtPmRtYS50eF9wYWNrZXRbaV0gKSB7CisgICAgICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2ZyZWVfdHhfcGFja2V0KCBwZGV2LCBscCwgJmxwLT5kbWEudHhfcGFja2V0W2ldICk7CisgICAgICAgICAgICBpZiggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJQcm9ibGVtIGZyZWVpbmcgVHggcGFja2V0XG4iICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbHAtPmRtYS50eF9yc2NfaW5kID0gMDsKKworICAgIGlmKCBscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYyApIHsKKyAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9mcmVlX2Rlc2MoIHBkZXYsIGxwLCAmbHAtPmRtYS50eF9yZWNsYWltX2Rlc2MgKTsKKyAgICAgICAgaWYoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJQcm9ibGVtIGZyZWVpbmcgVHggcmVjbGFpbSBkZXNjcmlwdG9yXG4iICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvLyB3bF9wY2lfZG1hX2ZyZWUKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9kbWFfYWxsb2NfdHhfcGFja2V0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQWxsb2NhdGVzIGEgc2luZ2xlIFR4IHBhY2tldCwgY29uc2lzdGluZyBvZiBzZXZlcmFsIGRlc2NyaXB0b3JzIGFuZAorICogICAgICBidWZmZXJzLiBEYXRhIHRvIHRyYW5zbWl0IGlzIGZpcnN0IGNvcGllZCBpbnRvIHRoZSAncGF5bG9hZCcgYnVmZmVyCisgKiAgICAgIGJlZm9yZSBiZWluZyB0cmFuc21pdHRlZC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHBkZXYgICAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCisgKiAgICAgIGxwICAgICAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICogICAgICBkZXNjICAgIC0gYSBwb2ludGVyIHdoaWNoIHdpbGwgcmVmZXJlbmNlIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFsbG9jJ2QuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9wY2lfZG1hX2FsbG9jX3R4X3BhY2tldCggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKQoreworLy8gICAgIGludCBzdGF0dXMgPSAwOworLy8gICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vCisvLyAgICAgaWYoIGRlc2MgPT0gTlVMTCApIHsKKy8vICAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKKy8vICAgICB9CisvLyAgICAgaWYoIHN0YXR1cyA9PSAwICkgeworLy8gICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2FsbG9jX2Rlc2NfYW5kX2J1ZiggcGRldiwgbHAsIGRlc2MsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQ0ZfRE1BX1RYX0JVRjFfU0laRSApOworLy8KKy8vICAgICAgICAgaWYoIHN0YXR1cyA9PSAwICkgeworLy8gICAgICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9hbGxvY19kZXNjX2FuZF9idWYoIHBkZXYsIGxwLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoICgqZGVzYyktPm5leHRfZGVzY19hZGRyICksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSENGX01BWF9QQUNLRVRfU0laRSApOworLy8gICAgICAgICB9CisvLyAgICAgfQorLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKy8vICAgICAgICAgKCpkZXNjKS0+bmV4dF9kZXNjX3BoeXNfYWRkciA9ICgqZGVzYyktPm5leHRfZGVzY19hZGRyLT5kZXNjX3BoeXNfYWRkcjsKKy8vICAgICB9CisvLyAgICAgcmV0dXJuIHN0YXR1czsKK30gLy8gd2xfcGNpX2RtYV9hbGxvY190eF9wYWNrZXQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfZG1hX2ZyZWVfdHhfcGFja2V0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgRnJlZXMgYSBzaW5nbGUgVHggcGFja2V0LCBkZXNjcmliZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgYWxsb2MgZnVuY3Rpb24uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwZGV2ICAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQorICogICAgICBscCAgICAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqICAgICAgZGVzYyAgICAtIGEgcG9pbnRlciB3aGljaCB3aWxsIHJlZmVyZW5jZSB0aGUgZGVzY3JpcHRvciB0byBiZSBhbGxvYydkLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfcGNpX2RtYV9mcmVlX3R4X3BhY2tldCggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKQoreworICAgIGludCBzdGF0dXMgPSAwOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGlmKCAqZGVzYyA9PSBOVUxMICkgeworICAgICAgICBEQkdfUFJJTlQoICJOdWxsIGRlc2NyaXB0b3JcbiIgKTsKKyAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKKyAgICB9CisJLy87P3RoZSAibGltaXRlZCIgTkRJUyBzdHJhdGVneSwgYXNzdW1pbmcgYSBmcmFtZSBjb25zaXN0cyBBTFdBWVMgb3V0IG9mIDIKKwkvL2Rlc2NyaXB0b3JzLCBtYWtlIHRoaXMgcm9idXN0CisgICAgaWYoIHN0YXR1cyA9PSAwICYmICgqZGVzYyktPm5leHRfZGVzY19hZGRyICkgeworICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2ZyZWVfZGVzY19hbmRfYnVmKCBwZGV2LCBscCwgJigqZGVzYyktPm5leHRfZGVzY19hZGRyICk7CisgICAgfQorICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKyAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9mcmVlX2Rlc2NfYW5kX2J1ZiggcGRldiwgbHAsIGRlc2MgKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLy8gd2xfcGNpX2RtYV9mcmVlX3R4X3BhY2tldAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9kbWFfYWxsb2NfcnhfcGFja2V0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQWxsb2NhdGVzIGEgc2luZ2xlIFJ4IHBhY2tldCwgY29uc2lzdGluZyBvZiB0d28gZGVzY3JpcHRvcnMgYW5kIG9uZQorICogICAgICBjb250aWd1b3VzIGJ1ZmZlci4gVEhlIGJ1ZmZlciBzdGFydHMgd2l0aCB0aGUgaGVybWVzLXNwZWNpZmljIGhlYWRlci4KKyAqICAgICAgT25lIGRlc2NyaXB0b3IgcG9pbnRzIGF0IHRoZSBzdGFydCwgdGhlIG90aGVyIGF0IG9mZnNldCAweDNhIG9mIHRoZQorICogICAgICBidWZmZXIuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwZGV2ICAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQorICogICAgICBscCAgICAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqICAgICAgZGVzYyAgICAtIGEgcG9pbnRlciB3aGljaCB3aWxsIHJlZmVyZW5jZSB0aGUgZGVzY3JpcHRvciB0byBiZSBhbGxvYydkLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfcGNpX2RtYV9hbGxvY19yeF9wYWNrZXQoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICkKK3sKKyAgICBpbnQgICAgICAgICBzdGF0dXMgPSAwOworICAgIERFU0NfU1RSQ1QgICpwOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLy8gICAgIGlmKCBkZXNjID09IE5VTEwgKSB7CisvLyAgICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7CisvLyAgICAgfQorLy8gCS8vOz90aGUgImxpbWl0ZWQiIE5ESVMgc3RyYXRlZ3ksIGFzc3VtaW5nIGEgZnJhbWUgY29uc2lzdHMgQUxXQVlTIG91dCBvZiAyCisvLyAJLy9kZXNjcmlwdG9ycywgbWFrZSB0aGlzIHJvYnVzdAorLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKy8vICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9hbGxvY19kZXNjKCBwZGV2LCBscCwgZGVzYyApOworLy8gCX0KKy8vICAgICBpZiggc3RhdHVzID09IDAgKSB7CisvLyAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfYWxsb2NfYnVmKCBwZGV2LCBscCwgKmRlc2MsIEhDRl9NQVhfUEFDS0VUX1NJWkUgKTsKKy8vICAgICB9CisvLyAgICAgaWYoIHN0YXR1cyA9PSAwICkgeworLy8gICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2FsbG9jX2Rlc2MoIHBkZXYsIGxwLCAmcCApOworLy8gICAgIH0KKy8vICAgICBpZiggc3RhdHVzID09IDAgKSB7CisvLyAgICAgICAgIC8qIFNpemUgb2YgMXN0IGRlc2NyaXB0b3IgYmVjb21lcyAweDNhIGJ5dGVzICovCisvLyAgICAgICAgIFNFVF9CVUZfU0laRSggKmRlc2MsIEhDRl9ETUFfUlhfQlVGMV9TSVpFICk7CisvLworLy8gICAgICAgICAvKiBNYWtlIDJuZCBkZXNjcmlwdG9yIHBvaW50IGF0IG9mZnNldCAweDNhIG9mIHRoZSBidWZmZXIgKi8KKy8vICAgICAgICAgU0VUX0JVRl9TSVpFKCBwLCAoIEhDRl9NQVhfUEFDS0VUX1NJWkUgLSBIQ0ZfRE1BX1JYX0JVRjFfU0laRSApKTsKKy8vICAgICAgICAgcC0+YnVmX2FkZHIgICAgICAgPSAoKmRlc2MpLT5idWZfYWRkciArIEhDRl9ETUFfUlhfQlVGMV9TSVpFOworLy8gICAgICAgICBwLT5idWZfcGh5c19hZGRyICA9ICgqZGVzYyktPmJ1Zl9waHlzX2FkZHIgKyBIQ0ZfRE1BX1JYX0JVRjFfU0laRTsKKy8vICAgICAgICAgcC0+bmV4dF9kZXNjX2FkZHIgPSBOVUxMOworLy8KKy8vICAgICAgICAgLyogQ2hhaW4gMm5kIGRlc2NyaXB0b3IgdG8gMXN0IGRlc2NyaXB0b3IgKi8KKy8vICAgICAgICAgKCpkZXNjKS0+bmV4dF9kZXNjX2FkZHIgICAgICA9IHA7CisvLyAgICAgICAgICgqZGVzYyktPm5leHRfZGVzY19waHlzX2FkZHIgPSBwLT5kZXNjX3BoeXNfYWRkcjsKKy8vICAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfSAvLyB3bF9wY2lfZG1hX2FsbG9jX3J4X3BhY2tldAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9kbWFfZnJlZV9yeF9wYWNrZXQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBGcmVlcyBhIHNpbmdsZSBSeCBwYWNrZXQsIGRlc2NyaWJlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBhbGxvYyBmdW5jdGlvbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHBkZXYgICAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCisgKiAgICAgIGxwICAgICAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICogICAgICBkZXNjICAgIC0gYSBwb2ludGVyIHdoaWNoIHdpbGwgcmVmZXJlbmNlIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFsbG9jJ2QuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9wY2lfZG1hX2ZyZWVfcnhfcGFja2V0KCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApCit7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgREVTQ19TVFJDVCAqcDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBpZiggKmRlc2MgPT0gTlVMTCApIHsKKyAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKKyAgICB9CisgICAgaWYoIHN0YXR1cyA9PSAwICkgeworICAgICAgICBwID0gKCpkZXNjKS0+bmV4dF9kZXNjX2FkZHI7CisKKyAgICAgICAgLyogRnJlZSB0aGUgMm5kIGRlc2NyaXB0b3IgKi8KKyAgICAgICAgaWYoIHAgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIHAtPmJ1Zl9hZGRyICAgICAgPSBOVUxMOworICAgICAgICAgICAgcC0+YnVmX3BoeXNfYWRkciA9IDA7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfZnJlZV9kZXNjKCBwZGV2LCBscCwgJnAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEZyZWUgdGhlIGJ1ZmZlciBhbmQgMXN0IGRlc2NyaXB0b3IgKi8KKyAgICBpZiggc3RhdHVzID09IDAgKSB7CisgICAgICAgIFNFVF9CVUZfU0laRSggKmRlc2MsIEhDRl9NQVhfUEFDS0VUX1NJWkUgKTsKKyAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9mcmVlX2Rlc2NfYW5kX2J1ZiggcGRldiwgbHAsIGRlc2MgKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLy8gd2xfcGNpX2RtYV9mcmVlX3J4X3BhY2tldAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9kbWFfYWxsb2NfZGVzY19hbmRfYnVmKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQWxsb2NhdGVzIGEgRE1BIGRlc2NyaXB0b3IgYW5kIGJ1ZmZlciwgYW5kIGFzc29jaWF0ZXMgdGhlbSB3aXRoIG9uZQorICogICAgICBhbm90aGVyLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcGRldiAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCisgKiAgICAgIGxwICAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqICAgICAgZGVzYyAgLSBhIHBvaW50ZXIgd2hpY2ggd2lsbCByZWZlcmVuY2UgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYWxsb2MnZAorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfcGNpX2RtYV9hbGxvY19kZXNjX2FuZF9idWYoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjLCBpbnQgc2l6ZSApCit7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvLyAgICAgaWYoIGRlc2MgPT0gTlVMTCApIHsKKy8vICAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKKy8vICAgICB9CisvLyAgICAgaWYoIHN0YXR1cyA9PSAwICkgeworLy8gICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2FsbG9jX2Rlc2MoIHBkZXYsIGxwLCBkZXNjICk7CisvLworLy8gICAgICAgICBpZiggc3RhdHVzID09IDAgKSB7CisvLyAgICAgICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2FsbG9jX2J1ZiggcGRldiwgbHAsICpkZXNjLCBzaXplICk7CisvLyAgICAgICAgIH0KKy8vICAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLy8gd2xfcGNpX2RtYV9hbGxvY19kZXNjX2FuZF9idWYKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfZG1hX2ZyZWVfZGVzY19hbmRfYnVmKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgRnJlZXMgYSBETUEgZGVzY3JpcHRvciBhbmQgYXNzb2NpYXRlZCBidWZmZXIuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwZGV2ICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKKyAqICAgICAgbHAgICAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICogICAgICBkZXNjICAtIGEgcG9pbnRlciB3aGljaCB3aWxsIHJlZmVyZW5jZSB0aGUgZGVzY3JpcHRvciB0byBiZSBhbGxvYydkCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9wY2lfZG1hX2ZyZWVfZGVzY19hbmRfYnVmKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApCit7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgaWYoIGRlc2MgPT0gTlVMTCApIHsKKyAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKKyAgICB9CisgICAgaWYoIHN0YXR1cyA9PSAwICYmICpkZXNjID09IE5VTEwgKSB7CisgICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7CisgICAgfQorICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKyAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9mcmVlX2J1ZiggcGRldiwgbHAsICpkZXNjICk7CisKKyAgICAgICAgaWYoIHN0YXR1cyA9PSAwICkgeworICAgICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9mcmVlX2Rlc2MoIHBkZXYsIGxwLCBkZXNjICk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLy8gd2xfcGNpX2RtYV9mcmVlX2Rlc2NfYW5kX2J1ZgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9kbWFfYWxsb2NfZGVzYygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEFsbG9jYXRlcyBvbmUgRE1BIGRlc2NyaXB0b3IgaW4gY2FjaGUgY29oZXJlbnQgbWVtb3J5LgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3BjaV9kbWFfYWxsb2NfZGVzYyggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICkKK3sKKy8vICAgICBpbnQgICAgICAgICBzdGF0dXMgPSAwOworLy8gICAgIGRtYV9hZGRyX3QgIHBhOworLy8gICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vCisvLyAgICAgREJHX0ZVTkMoICJ3bF9wY2lfZG1hX2FsbG9jX2Rlc2MiICk7CisvLyAgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisvLworLy8gICAgIGlmKCBkZXNjID09IE5VTEwgKSB7CisvLyAgICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7CisvLyAgICAgfQorLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKy8vICAgICAgICAgKmRlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudCggcGRldiwgc2l6ZW9mKCBERVNDX1NUUkNUICksICZwYSApOworLy8gICAgIH0KKy8vICAgICBpZiggKmRlc2MgPT0gTlVMTCApIHsKKy8vICAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAicGNpX2FsbG9jX2NvbnNpc3RlbnQoKSBmYWlsZWRcbiIgKTsKKy8vICAgICAgICAgc3RhdHVzID0gLUVOT01FTTsKKy8vICAgICB9IGVsc2UgeworLy8gICAgICAgICBtZW1zZXQoICpkZXNjLCAwLCBzaXplb2YoIERFU0NfU1RSQ1QgKSk7CisvLyAgICAgICAgICgqZGVzYyktPmRlc2NfcGh5c19hZGRyID0gY3B1X3RvX2xlMzIoIHBhICk7CisvLyAgICAgfQorLy8gICAgIERCR19MRUFWRSggRGJnSW5mbyApOworLy8gICAgIHJldHVybiBzdGF0dXM7Cit9IC8vIHdsX3BjaV9kbWFfYWxsb2NfZGVzYworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9kbWFfZnJlZV9kZXNjKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgRnJlZXMgb25lIERNQSBkZXNjcmlwdG9yIGluIGNhY2hlIGNvaGVyZW50IG1lbW9yeS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9wY2lfZG1hX2ZyZWVfZGVzYyggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICkKK3sKKyAgICBpbnQgICAgICAgICBzdGF0dXMgPSAwOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGlmKCAqZGVzYyA9PSBOVUxMICkgeworICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOworICAgIH0KKyAgICBpZiggc3RhdHVzID09IDAgKSB7CisgICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQoIHBkZXYsIHNpemVvZiggREVTQ19TVFJDVCApLCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXNjKS0+ZGVzY19waHlzX2FkZHIgKTsKKyAgICB9CisgICAgKmRlc2MgPSBOVUxMOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8vIHdsX3BjaV9kbWFfZnJlZV9kZXNjCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX2RtYV9hbGxvY19idWYoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBBbGxvY2F0ZXMgb25lIERNQSBidWZmZXIgaW4gY2FjaGUgY29oZXJlbnQgbWVtb3J5LCBhbmQgYXNzb2NpYXRlcyBhIERNQQorICogICAgICBkZXNjcmlwdG9yIHdpdGggdGhpcyBidWZmZXIuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfcGNpX2RtYV9hbGxvY19idWYoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKmRlc2MsIGludCBzaXplICkKK3sKKyAgICBpbnQgICAgICAgICBzdGF0dXMgPSAwOworICAgIGRtYV9hZGRyX3QgIHBhOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLy8gICAgIERCR19GVU5DKCAid2xfcGNpX2RtYV9hbGxvY19idWYiICk7CisvLyAgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisvLworLy8gICAgIGlmKCBkZXNjID09IE5VTEwgKSB7CisvLyAgICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7CisvLyAgICAgfQorLy8gICAgIGlmKCBzdGF0dXMgPT0gMCAmJiBkZXNjLT5idWZfYWRkciAhPSBOVUxMICkgeworLy8gICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOworLy8gICAgIH0KKy8vICAgICBpZiggc3RhdHVzID09IDAgKSB7CisvLyAgICAgICAgIGRlc2MtPmJ1Zl9hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoIHBkZXYsIHNpemUsICZwYSApOworLy8gICAgIH0KKy8vICAgICBpZiggZGVzYy0+YnVmX2FkZHIgPT0gTlVMTCApIHsKKy8vICAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAicGNpX2FsbG9jX2NvbnNpc3RlbnQoKSBmYWlsZWRcbiIgKTsKKy8vICAgICAgICAgc3RhdHVzID0gLUVOT01FTTsKKy8vICAgICB9IGVsc2UgeworLy8gICAgICAgICBkZXNjLT5idWZfcGh5c19hZGRyID0gY3B1X3RvX2xlMzIoIHBhICk7CisvLyAgICAgICAgIFNFVF9CVUZfU0laRSggZGVzYywgc2l6ZSApOworLy8gICAgIH0KKy8vICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvLyB3bF9wY2lfZG1hX2FsbG9jX2J1ZgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9kbWFfZnJlZV9idWYoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBBbGxvY2F0ZXMgb25lIERNQSBidWZmZXIgaW4gY2FjaGUgY29oZXJlbnQgbWVtb3J5LCBhbmQgYXNzb2NpYXRlcyBhIERNQQorICogICAgICBkZXNjcmlwdG9yIHdpdGggdGhpcyBidWZmZXIuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfcGNpX2RtYV9mcmVlX2J1Ziggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICpkZXNjICkKK3sKKyAgICBpbnQgICAgICAgICBzdGF0dXMgPSAwOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGlmKCBkZXNjID09IE5VTEwgKSB7CisgICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7CisgICAgfQorICAgIGlmKCBzdGF0dXMgPT0gMCAmJiBkZXNjLT5idWZfYWRkciA9PSBOVUxMICkgeworICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOworICAgIH0KKyAgICBpZiggc3RhdHVzID09IDAgKSB7CisgICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQoIHBkZXYsIEdFVF9CVUZfU0laRSggZGVzYyApLCBkZXNjLT5idWZfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+YnVmX3BoeXNfYWRkciApOworCisgICAgICAgIGRlc2MtPmJ1Zl9hZGRyID0gMDsKKyAgICAgICAgZGVzYy0+YnVmX3BoeXNfYWRkciA9IDA7CisgICAgICAgIFNFVF9CVUZfU0laRSggZGVzYywgMCApOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvLyB3bF9wY2lfZG1hX2ZyZWVfYnVmCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX2RtYV9oY2Zfc3VwcGx5KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgU3VwcGx5IEhDRiB3aXRoIERNQS1yZWxhdGVkIHJlc291cmNlcy4gVGhlc2UgY29uc2lzdCBvZjoKKyAqICAgICAgICAgIC0gYnVmZmVycyBhbmQgZGVzY3JpcHRvcnMgZm9yIHJlY2VpdmUgcHVycG9zZXMKKyAqICAgICAgICAgIC0gb25lICdyZWNsYWltJyBkZXNjcmlwdG9yIGZvciB0aGUgdHJhbnNtaXQgcGF0aCwgdXNlZCB0byBmdWxmaWxsIGEKKyAqICAgICAgICAgICAgY2VydGFpbiBIMjUgRE1BIGVuZ2luZSByZXF1aXJlbWVudAorICogICAgICAgICAgLSBvbmUgJ3JlY2xhaW0nIGRlc2NyaXB0b3IgZm9yIHRoZSByZWNlaXZlIHBhdGgsIHVzZWQgdG8gZnVsZmlsbCBhCisgKiAgICAgICAgICAgIGNlcnRhaW4gSDI1IERNQSBlbmdpbmUgcmVxdWlyZW1lbnQKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHN0YXJ0LW9mLWRheSBvciBhdCByZS1pbml0aWFsaXphdGlvbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfcGNpX2RtYV9oY2Zfc3VwcGx5KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworICAgIGludCBpOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfcGNpX2RtYV9oY2Zfc3VwcGx5IiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgLy9pZiggbHAtPmRtYS5zdGF0dXMgPT0gMCApOworICAgIC8veworICAgICAgICAvKiBIYW5kIG92ZXIgdGhlIFJ4L1R4IHJlY2xhaW0gZGVzY3JpcHRvcnMgdG8gdGhlIEhDRiAqLworICAgICAgICBpZiggbHAtPmRtYS50eF9yZWNsYWltX2Rlc2MgKSB7CisgICAgICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYzogMHglcFxuIiwgbHAtPmRtYS50eF9yZWNsYWltX2Rlc2MgKTsKKyAgICAgICAgICAgIGhjZl9kbWFfdHhfcHV0KCAmbHAtPmhjZkN0eCwgbHAtPmRtYS50eF9yZWNsYWltX2Rlc2MsIDAgKTsKKyAgICAgICAgICAgIGxwLT5kbWEudHhfcmVjbGFpbV9kZXNjID0gTlVMTDsKKyAgICAgICAgICAgIERCR19QUklOVCggImxwLT5kbWEudHhfcmVjbGFpbV9kZXNjOiAweCVwXG4iLCBscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYyApOworICAgICAgICB9CisgICAgICAgIGlmKCBscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYyApIHsKKyAgICAgICAgICAgIERCR19QUklOVCggImxwLT5kbWEucnhfcmVjbGFpbV9kZXNjOiAweCVwXG4iLCBscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYyApOworICAgICAgICAgICAgaGNmX2RtYV9yeF9wdXQoICZscC0+aGNmQ3R4LCBscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYyApOworICAgICAgICAgICAgbHAtPmRtYS5yeF9yZWNsYWltX2Rlc2MgPSBOVUxMOworICAgICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS5yeF9yZWNsYWltX2Rlc2M6IDB4JXBcbiIsIGxwLT5kbWEucnhfcmVjbGFpbV9kZXNjICk7CisgICAgICAgIH0KKyAgICAgICAgLyogSGFuZCBvdmVyIHRoZSBSeCBkZXNjcmlwdG9yIGNoYWluIHRvIHRoZSBIQ0YgKi8KKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKysgKSB7CisgICAgICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnJ4X3BhY2tldFslZF06ICAgIDB4JXBcbiIsIGksIGxwLT5kbWEucnhfcGFja2V0W2ldICk7CisgICAgICAgICAgICBoY2ZfZG1hX3J4X3B1dCggJmxwLT5oY2ZDdHgsIGxwLT5kbWEucnhfcGFja2V0W2ldICk7CisgICAgICAgICAgICBscC0+ZG1hLnJ4X3BhY2tldFtpXSA9IE5VTEw7CisgICAgICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnJ4X3BhY2tldFslZF06ICAgIDB4JXBcbiIsIGksIGxwLT5kbWEucnhfcGFja2V0W2ldICk7CisgICAgICAgIH0KKyAgICAvL30KKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybjsKK30gLy8gd2xfcGNpX2RtYV9oY2Zfc3VwcGx5CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFJldHVybiBETUEtcmVsYXRlZCByZXNvdXJjZXMgZnJvbSB0aGUgSENGLiBUaGVzZSBjb25zaXN0IG9mOgorICogICAgICAgICAgLSBidWZmZXJzIGFuZCBkZXNjcmlwdG9ycyBmb3IgcmVjZWl2ZSBwdXJwb3NlcworICogICAgICAgICAgLSBidWZmZXJzIGFuZCBkZXNjcmlwdG9ycyBmb3IgdHJhbnNtaXQgcHVycG9zZXMKKyAqICAgICAgICAgIC0gb25lICdyZWNsYWltJyBkZXNjcmlwdG9yIGZvciB0aGUgdHJhbnNtaXQgcGF0aCwgdXNlZCB0byBmdWxmaWxsIGEKKyAqICAgICAgICAgICAgY2VydGFpbiBIMjUgRE1BIGVuZ2luZSByZXF1aXJlbWVudAorICogICAgICAgICAgLSBvbmUgJ3JlY2xhaW0nIGRlc2NyaXB0b3IgZm9yIHRoZSByZWNlaXZlIHBhdGgsIHVzZWQgdG8gZnVsZmlsbCBhCisgKiAgICAgICAgICAgIGNlcnRhaW4gSDI1IERNQSBlbmdpbmUgcmVxdWlyZW1lbnQKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IGVuZC1vZi1kYXkgb3IgYXQgcmUtaW5pdGlhbGl6YXRpb24uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3BjaV9kbWFfaGNmX3JlY2xhaW0oIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisgICAgaW50IGk7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9wY2lfZG1hX2hjZl9yZWNsYWltIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV9yeCggbHAgKTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKyApIHsKKyAgICAgICAgREJHX1BSSU5UKCAicnhfcGFja2V0WyVkXSAweCVwXG4iLCBpLCBscC0+ZG1hLnJ4X3BhY2tldFtpXSApOworLy8gICAgICAgICBpZiggbHAtPmRtYS5yeF9wYWNrZXRbaV0gPT0gTlVMTCApIHsKKy8vICAgICAgICAgICAgIERCR19QUklOVCggIndsX3BjaV9kbWFfaGNmX3JlY2xhaW06IHJ4X3BhY2tldFslZF0gTlVMTFxuIiwgaSApOworLy8gICAgICAgICB9CisgICAgfQorCisgICAgd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV90eCggbHAgKTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKyApIHsKKyAgICAgICAgREJHX1BSSU5UKCAidHhfcGFja2V0WyVkXSAweCVwXG4iLCBpLCBscC0+ZG1hLnR4X3BhY2tldFtpXSApOworLy8gICAgICAgICBpZiggbHAtPmRtYS50eF9wYWNrZXRbaV0gPT0gTlVMTCApIHsKKy8vICAgICAgICAgICAgIERCR19QUklOVCggIndsX3BjaV9kbWFfaGNmX3JlY2xhaW06IHR4X3BhY2tldFslZF0gTlVMTFxuIiwgaSApOworLy8gICAgICAgICB9CisgICAgIH0KKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybjsKK30gLy8gd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9kbWFfaGNmX3JlY2xhaW1fcngoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBSZWNsYWltIFJ4IHBhY2tldHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYnkgdGhlIEhDRi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV9yeCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKyAgICBpbnQgICAgICAgICBpOworICAgIERFU0NfU1RSQ1QgKnA7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3J4IiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgLy9pZiggbHAtPmRtYS5zdGF0dXMgPT0gMCApCisgICAgLy97CisgICAgICAgIHdoaWxlICggKCBwID0gaGNmX2RtYV9yeF9nZXQoICZscC0+aGNmQ3R4ICkgKSAhPSBOVUxMICkgeworICAgICAgICAgICAgaWYoIHAgJiYgcC0+YnVmX2FkZHIgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAvKiBBIHJlY2xhaW0gZGVzY3JpcHRvciBpcyBiZWluZyBnaXZlbiBiYWNrIGJ5IHRoZSBIQ0YuIFJlY2xhaW0KKyAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9ycyBoYXZlIGEgTlVMTCBidWZfYWRkciAqLworICAgICAgICAgICAgICAgIGxwLT5kbWEucnhfcmVjbGFpbV9kZXNjID0gcDsKKyAgICAgICAgICAgIAlEQkdfUFJJTlQoICJyZWNsYWltX2Rlc2NyaXB0b3I6IDB4JXBcbiIsIHAgKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrICkgeworICAgICAgICAgICAgICAgIGlmKCBscC0+ZG1hLnJ4X3BhY2tldFtpXSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBBbiBSeCBidWZmZXIgZGVzY3JpcHRvciBpcyBiZWluZyBnaXZlbiBiYWNrIGJ5IHRoZSBIQ0YgKi8KKyAgICAgICAgICAgIGxwLT5kbWEucnhfcGFja2V0W2ldID0gcDsKKyAgICAgICAgICAgIGxwLT5kbWEucnhfcnNjX2luZCsrOworICAgICAgICAJREJHX1BSSU5UKCAicnhfcGFja2V0WyVkXSAweCVwXG4iLCBpLCBscC0+ZG1hLnJ4X3BhY2tldFtpXSApOworICAgICAgICB9CisgICAgLy99CisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7Cit9IC8vIHdsX3BjaV9kbWFfaGNmX3JlY2xhaW1fcngKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfZG1hX2dldF90eF9wYWNrZXQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBPYnRhaW5zIGEgVHggZGVzY3JpcHRvciBmcm9tIHRoZSBjaGFpbiB0byB1c2UgZm9yIFR4LgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHdsX3ByaXZhdGUgc3RydWN0dXJlLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgQSBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgZGVzY3JpcHRvcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitERVNDX1NUUkNUICogd2xfcGNpX2RtYV9nZXRfdHhfcGFja2V0KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworICAgIGludCBpOworICAgIERFU0NfU1RSQ1QgKmRlc2MgPSBOVUxMOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGZvciggaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrICkgeworICAgICAgICBpZiggbHAtPmRtYS50eF9wYWNrZXRbaV0gKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBpICE9IE5VTV9UWF9ERVNDICkgeworICAgICAgICBkZXNjID0gbHAtPmRtYS50eF9wYWNrZXRbaV07CisKKyAgICAgICAgbHAtPmRtYS50eF9wYWNrZXRbaV0gPSBOVUxMOworICAgICAgICBscC0+ZG1hLnR4X3JzY19pbmQtLTsKKworICAgICAgICBtZW1zZXQoIGRlc2MtPmJ1Zl9hZGRyLCAwLCBIQ0ZfRE1BX1RYX0JVRjFfU0laRSApOworICAgIH0KKworICAgIHJldHVybiBkZXNjOworfSAvLyB3bF9wY2lfZG1hX2dldF90eF9wYWNrZXQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfZG1hX3B1dF90eF9wYWNrZXQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBSZXR1cm5zIGEgVHggZGVzY3JpcHRvciB0byB0aGUgY2hhaW4uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyB3bF9wcml2YXRlIHN0cnVjdHVyZS4KKyAqICAgICAgZGVzYyAtIGEgcG9pbnRlciB0byB0aGUgZGVzY3JpcHRvciB0byByZXR1cm4uCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9wY2lfZG1hX3B1dF90eF9wYWNrZXQoIHN0cnVjdCB3bF9wcml2YXRlICpscCwgREVTQ19TVFJDVCAqZGVzYyApCit7CisgICAgaW50IGk7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgZm9yKCBpID0gMDsgaSA8IE5VTV9UWF9ERVNDOyBpKysgKSB7CisgICAgICAgIGlmKCBscC0+ZG1hLnR4X3BhY2tldFtpXSA9PSBOVUxMICkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggaSAhPSBOVU1fVFhfREVTQyApIHsKKyAgICAgICAgbHAtPmRtYS50eF9wYWNrZXRbaV0gPSBkZXNjOworICAgICAgICBscC0+ZG1hLnR4X3JzY19pbmQrKzsKKyAgICB9Cit9IC8vIHdsX3BjaV9kbWFfcHV0X3R4X3BhY2tldAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9kbWFfaGNmX3JlY2xhaW1fdHgoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBSZWNsYWltIFR4IHBhY2tldHMgdGhhdCBoYXZlIGVpdGhlciBiZWVuIHByb2Nlc3NlZCBieSB0aGUgSENGIGR1ZSB0byBhCisgKiAgICAgIHBvcnQgZGlzYWJsZSBvciBhIFR4IGNvbXBsZXRpb24uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3BjaV9kbWFfaGNmX3JlY2xhaW1fdHgoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisgICAgaW50ICAgICAgICAgaTsKKyAgICBERVNDX1NUUkNUICpwOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV90eCIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIC8vaWYoIGxwLT5kbWEuc3RhdHVzID09IDAgKQorICAgIC8veworICAgICAgICB3aGlsZSAoICggcCA9IGhjZl9kbWFfdHhfZ2V0KCAmbHAtPmhjZkN0eCApICkgIT0gTlVMTCApIHsKKworICAgICAgICAgICAgaWYoIHAgIT0gTlVMTCAmJiBwLT5idWZfYWRkciA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIC8qIEEgUmVjbGFpbSBkZXNjcmlwdG9yIGlzIGJlaW5nIGdpdmVuIGJhY2sgYnkgdGhlIEhDRi4gUmVjbGFpbQorICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzIGhhdmUgYSBOVUxMIGJ1Zl9hZGRyICovCisgICAgICAgICAgICAgICAgbHAtPmRtYS50eF9yZWNsYWltX2Rlc2MgPSBwOworICAgICAgICAgICAgCURCR19QUklOVCggInJlY2xhaW1fZGVzY3JpcHRvcjogMHglcFxuIiwgcCApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IE5VTV9UWF9ERVNDOyBpKysgKSB7CisgICAgICAgICAgICAgICAgaWYoIGxwLT5kbWEudHhfcGFja2V0W2ldID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEFuIFJ4IGJ1ZmZlciBkZXNjcmlwdG9yIGlzIGJlaW5nIGdpdmVuIGJhY2sgYnkgdGhlIEhDRiAqLworICAgICAgICAgICAgbHAtPmRtYS50eF9wYWNrZXRbaV0gPSBwOworICAgICAgICAgICAgbHAtPmRtYS50eF9yc2NfaW5kKys7CisgICAgICAgIAlEQkdfUFJJTlQoICJ0eF9wYWNrZXRbJWRdIDB4JXBcbiIsIGksIGxwLT5kbWEudHhfcGFja2V0W2ldICk7CisgICAgICAgIH0KKyAgICAvL30KKworICAgIGlmKCBscC0+bmV0aWZfcXVldWVfb24gPT0gRkFMU0UgKSB7CisgICAgICAgIG5ldGlmX3dha2VfcXVldWUoIGxwLT5kZXYgKTsKKyAgICAgICAgV0xfV0RTX05FVElGX1dBS0VfUVVFVUUoIGxwICk7CisgICAgICAgIGxwLT5uZXRpZl9xdWV1ZV9vbiA9IFRSVUU7CisgICAgfQorICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybjsKK30gLy8gd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV90eAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNlbmRpZiAgLy8gRU5BQkxFX0RNQQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcGNpLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGQ3YjUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcGNpLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBIZWFkZXIgZGVzY3JpYmluZyBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgdGhlIGRyaXZlciB0byBzdXBwb3J0IFBDSS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fV0xfUENJX0hfXworI2RlZmluZSBfX1dMX1BDSV9IX18KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBjb25zdGFudCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgV0xfTEtNX1BDSV9WRU5ET1JfSUQgICAgMHgxMUMxICAvLyBMdWNlbnQgTWljcm9lbGVjdHJvbmljcworI2RlZmluZSBXTF9MS01fUENJX0RFVklDRV9JRF8wICAweEFCMzAgIC8vIE1pbmkgUENJCisjZGVmaW5lIFdMX0xLTV9QQ0lfREVWSUNFX0lEXzEgIDB4QUIzNCAgLy8gTWluaSBQQ0kKKyNkZWZpbmUgV0xfTEtNX1BDSV9ERVZJQ0VfSURfMiAgMHhBQjExICAvLyBXQVJQIENhcmRCdXMKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBmdW5jdGlvbiBwcm90b3R5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2FkYXB0ZXJfaW5pdF9tb2R1bGUoIHZvaWQgKTsKKwordm9pZCB3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlKCB2b2lkICk7CisKK2ludCB3bF9hZGFwdGVyX2luc2VydCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCitpbnQgd2xfYWRhcHRlcl9vcGVuKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK2ludCB3bF9hZGFwdGVyX2Nsb3NlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK2ludCB3bF9hZGFwdGVyX2lzX29wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKworCisjaWZkZWYgRU5BQkxFX0RNQQorCit2b2lkIHdsX3BjaV9kbWFfaGNmX3N1cHBseSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKK3ZvaWQgd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKK0RFU0NfU1RSQ1QgKiB3bF9wY2lfZG1hX2dldF90eF9wYWNrZXQoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCit2b2lkIHdsX3BjaV9kbWFfcHV0X3R4X3BhY2tldCggc3RydWN0IHdsX3ByaXZhdGUgKmxwLCBERVNDX1NUUkNUICpkZXNjICk7CisKK3ZvaWQgd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV90eCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKKyNlbmRpZiAgLy8gRU5BQkxFX0RNQQorCisKKyNlbmRpZiAgLy8gX19XTF9QQ0lfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wcml2LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wcml2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2MTBjNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3ByaXYuYwpAQCAtMCwwICsxLDIwNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBUaGlzIGZpbGUgZGVmaW5lcyBoYW5kbGluZyByb3V0aW5lcyBmb3IgdGhlIHByaXZhdGUgSU9DVExzCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8d2xfdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8ZGVidWcuaD4KKyNpbmNsdWRlIDxoY2YuaD4KKyNpbmNsdWRlIDxoY2ZkZWYuaD4KKworI2luY2x1ZGUgPHdsX2lmLmg+CisjaW5jbHVkZSA8d2xfaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx3bF9lbmMuaD4KKyNpbmNsdWRlIDx3bF9tYWluLmg+CisjaW5jbHVkZSA8d2xfcHJpdi5oPgorI2luY2x1ZGUgPHdsX3V0aWwuaD4KKyNpbmNsdWRlIDx3bF9uZXRkZXYuaD4KKworaW50IHd2bGFuX3VpbF9jb25uZWN0KCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworaW50IHd2bGFuX3VpbF9kaXNjb25uZWN0KCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworaW50IHd2bGFuX3VpbF9hY3Rpb24oIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CitpbnQgd3ZsYW5fdWlsX2Jsb2NrKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworaW50IHd2bGFuX3VpbF91bmJsb2NrKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworaW50IHd2bGFuX3VpbF9zZW5kX2RpYWdfbXNnKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworaW50IHd2bGFuX3VpbF9wdXRfaW5mbyggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK2ludCB3dmxhbl91aWxfZ2V0X2luZm8oIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKK2ludCBjZmdfZHJpdmVyX2luZm8oIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CitpbnQgY2ZnX2RyaXZlcl9pZGVudGl0eSggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2xvYmFsIHZhcmlhYmxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBEQkcKK2V4dGVybiBkYmdfaW5mb190ICpEYmdJbmZvOworI2VuZGlmICAvLyBEQkcKKworCisKKworLyogSWYgVVNFX1VJTCBpcyBub3QgZGVmaW5lZCwgdGhlbiBub25lIG9mIHRoZSBVSUwgSW50ZXJmYWNlIGNvZGUgYmVsb3cgd2lsbAorICAgYmUgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkICovCisjaWZkZWYgVVNFX1VJTAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd3ZsYW5fdWlsKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhlIGhhbmRsZXIgZnVuY3Rpb24gZm9yIHRoZSBVSUwgaW50ZXJmYWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgdXJxIC0gYSBwb2ludGVyIHRvIHRoZSBVSUwgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3dmxhbl91aWwoIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgaW9jdGxfcmV0ID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlEQkdfRlVOQyggInd2bGFuX3VpbCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCXN3aXRjaCggdXJxLT5jb21tYW5kICkgeworCSAgY2FzZSBVSUxfRlVOX0NPTk5FQ1Q6CisJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9VSUwgLS0gV1ZMQU4yX1VJTF9DT05ORUNUXG4iKTsKKwkJaW9jdGxfcmV0ID0gd3ZsYW5fdWlsX2Nvbm5lY3QoIHVycSwgbHAgKTsKKwkJYnJlYWs7CisJICBjYXNlIFVJTF9GVU5fRElTQ09OTkVDVDoKKwkJREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTDogV1ZMQU4yX0lPQ1RMX1VJTCAtLSBXVkxBTjJfVUlMX0RJU0NPTk5FQ1RcbiIpOworCQlpb2N0bF9yZXQgPSB3dmxhbl91aWxfZGlzY29ubmVjdCggdXJxLCBscCApOworCQlicmVhazsKKwkgIGNhc2UgVUlMX0ZVTl9BQ1RJT046CisJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9VSUwgLS0gV1ZMQU4yX1VJTF9BQ1RJT05cbiIgKTsKKwkJaW9jdGxfcmV0ID0gd3ZsYW5fdWlsX2FjdGlvbiggdXJxLCBscCApOworCQlicmVhazsKKwkgIGNhc2UgVUlMX0ZVTl9TRU5EX0RJQUdfTVNHOgorCQlEQkdfVFJBQ0UoRGJnSW5mbywgIklPQ1RMOiBXVkxBTjJfSU9DVExfVUlMIC0tIFdWTEFOMl9VSUxfU0VORF9ESUFHX01TR1xuIik7CisJCWlvY3RsX3JldCA9IHd2bGFuX3VpbF9zZW5kX2RpYWdfbXNnKCB1cnEsIGxwICk7CisJCWJyZWFrOworCSAgY2FzZSBVSUxfRlVOX0dFVF9JTkZPOgorCQlEQkdfVFJBQ0UoRGJnSW5mbywgIklPQ1RMOiBXVkxBTjJfSU9DVExfVUlMIC0tIFdWTEFOMl9VSUxfR0VUX0lORk9cbiIpOworCQlpb2N0bF9yZXQgPSB3dmxhbl91aWxfZ2V0X2luZm8oIHVycSwgbHAgKTsKKwkJYnJlYWs7CisJICBjYXNlIFVJTF9GVU5fUFVUX0lORk86CisJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9VSUwgLS0gV1ZMQU4yX1VJTF9QVVRfSU5GT1xuIik7CisJCWlvY3RsX3JldCA9IHd2bGFuX3VpbF9wdXRfaW5mbyggdXJxLCBscCApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEQkdfVFJBQ0UoRGJnSW5mbywgIklPQ1RMOiBXVkxBTjJfSU9DVExfVUlMIC0tIFVOU1VQUE9SVEVEIFVJTCBDT0RFOiAweCVYIiwgdXJxLT5jb21tYW5kICk7CisJCWlvY3RsX3JldCA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKwl9CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIGlvY3RsX3JldDsKK30gLy8gd3ZsYW5fdWlsCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd3ZsYW5fdWlsX2Nvbm5lY3QoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDb25uZWN0IHRvIHRoZSBVSUwgaW4gb3JkZXIgdG8gbWFrZSBhIHJlcXVlc3QuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB1cnEgLSBhIHBvaW50ZXIgdG8gdGhlIFVJTCByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIFVJTF9TVUNDRVNTCisgKiAgICAgIFVJTF9FUlJfeHh4IHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd3ZsYW5fdWlsX2Nvbm5lY3QoIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid3ZsYW5fdWlsX2Nvbm5lY3QiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKworCWlmKCAhKCBscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0NPTk5FQ1RFRCApKSB7CisJCWxwLT5mbGFncyB8PSBXVkxBTjJfVUlMX0NPTk5FQ1RFRDsKKwkJdXJxLT5oY2ZDdHggPSAmKCBscC0+aGNmQ3R4ICk7CisJCXVycS0+cmVzdWx0ID0gVUlMX1NVQ0NFU1M7CisJfSBlbHNlIHsKKwkJREJHX1dBUk5JTkcoIERiZ0luZm8sICJVSUxfRVJSX0lOX1VTRVxuIiApOworCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfSU5fVVNFOworCX0KKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXN1bHQ7Cit9IC8vIHd2bGFuX3VpbF9jb25uZWN0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd3ZsYW5fdWlsX2Rpc2Nvbm5lY3QoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBEaXNvbm5lY3QgZnJvbSB0aGUgVUlMIGFmdGVyIGEgcmVxdWVzdCBoYXMgYmVlbiBjb21wbGV0ZWQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB1cnEgLSBhIHBvaW50ZXIgdG8gdGhlIFVJTCByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIFVJTF9TVUNDRVNTCisgKiAgICAgIFVJTF9FUlJfeHh4IHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd3ZsYW5fdWlsX2Rpc2Nvbm5lY3QoIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid3ZsYW5fdWlsX2Rpc2Nvbm5lY3QiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKworCWlmKCB1cnEtPmhjZkN0eCA9PSAmKCBscC0+aGNmQ3R4ICkpIHsKKwkJaWYgKGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQ09OTkVDVEVEKSB7CisJCQlscC0+ZmxhZ3MgJj0gfldWTEFOMl9VSUxfQ09OTkVDVEVEOworCQkJLyoKKwkJCWlmIChscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kpIHsKKwkJCQlscC0+ZmxhZ3MgJj0gfldWTEFOMl9VSUxfQlVTWTsKKwkJCQluZXRpZl9zdGFydF9xdWV1ZShscC0+ZGV2KTsKKwkJCX0KKwkJCSovCisJCX0KKworCQl1cnEtPmhjZkN0eCA9IE5VTEw7CisJCXVycS0+cmVzdWx0ID0gVUlMX1NVQ0NFU1M7CisJfSBlbHNlIHsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAiVUlMX0VSUl9XUk9OR19JRkJcbiIgKTsKKwkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX1dST05HX0lGQjsKKwl9CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmVzdWx0OworfSAvLyB3dmxhbl91aWxfZGlzY29ubmVjdAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXd2bGFuX3VpbF9hY3Rpb24oKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBIYW5kbGVyIGZvciB0aGUgVUlMX0FDVF94eHggc3ViY29kZXMgYXNzb2NpYXRlZCB3aXRoIFVJTF9GVU5fQUNUSU9OCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB1cnEgLSBhIHBvaW50ZXIgdG8gdGhlIFVJTCByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIFVJTF9TVUNDRVNTCisgKiAgICAgIFVJTF9FUlJfeHh4IHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd3ZsYW5fdWlsX2FjdGlvbiggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCAgICAgcmVzdWx0ID0gMDsKKwlsdHZfdCAgICpsdHY7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggInd2bGFuX3VpbF9hY3Rpb24iICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKworCWlmKCB1cnEtPmhjZkN0eCA9PSAmKCBscC0+aGNmQ3R4ICkpIHsKKwkJLyogTWFrZSBzdXJlIHRoZXJlJ3MgYW4gTFRWIGluIHRoZSByZXF1ZXN0IGJ1ZmZlciAqLworCQlsdHYgPSAobHR2X3QgKil1cnEtPmRhdGE7CisJCWlmKCBsdHYgIT0gTlVMTCApIHsKKwkJCS8qIFN3aXRjaCBvbiB0aGUgVHlwZSBmaWVsZCBvZiB0aGUgTFRWIGNvbnRhaW5lZCBpbiB0aGUgcmVxdWVzdAorCQkJICAgYnVmZmVyICovCisJCQlzd2l0Y2goIGx0di0+dHlwICkgeworCQkJY2FzZSBVSUxfQUNUX0JMT0NLOgorCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlVJTF9BQ1RfQkxPQ0tcbiIgKTsKKwkJCQlyZXN1bHQgPSB3dmxhbl91aWxfYmxvY2soIHVycSwgbHAgKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVUlMX0FDVF9VTkJMT0NLOgorCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlVJTF9BQ1RfVU5CTE9DS1xuIiApOworCQkJCXJlc3VsdCA9IHd2bGFuX3VpbF91bmJsb2NrKCB1cnEsIGxwICk7CisJCQkJYnJlYWs7CisJCQljYXNlIFVJTF9BQ1RfU0NBTjoKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJVSUxfQUNUX1NDQU5cbiIgKTsKKwkJCQl1cnEtPnJlc3VsdCA9IGhjZl9hY3Rpb24oICYoIGxwLT5oY2ZDdHggKSwgTUREX0FDVF9TQ0FOICk7CisJCQkJYnJlYWs7CisJCQljYXNlIFVJTF9BQ1RfQVBQTFk6CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiVUlMX0FDVF9BUFBMWVxuIiApOworCQkJCXVycS0+cmVzdWx0ID0gd2xfYXBwbHkoIGxwICk7CisJCQkJYnJlYWs7CisJCQljYXNlIFVJTF9BQ1RfUkVTRVQ6CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiVUlMX0FDVF9SRVNFVFxuIiApOworCQkJCXVycS0+cmVzdWx0ID0gd2xfZ28oIGxwICk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiVW5rbm93biBhY3Rpb24gY29kZTogMHgleFxuIiwgbHR2LT50eXAgKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCURCR19FUlJPUiggRGJnSW5mbywgIkJhZCBMVFYgZm9yIHRoaXMgYWN0aW9uXG4iICk7CisJCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfTEVOOworCQl9CisJfSBlbHNlIHsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAiVUlMX0VSUl9XUk9OR19JRkJcbiIgKTsKKwkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX1dST05HX0lGQjsKKwl9CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmVzdWx0OworfSAvLyB3dmxhbl91aWxfYWN0aW9uCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd3ZsYW5fdWlsX2Jsb2NrKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgU2V0cyBhIGJsb2NrIGluIHRoZSBkcml2ZXIgdG8gcHJldmVudCBhY2Nlc3MgdG8gdGhlIGNhcmQgYnkgb3RoZXIKKyAqICBwcm9jZXNzZXMuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB1cnEgLSBhIHBvaW50ZXIgdG8gdGhlIFVJTCByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIFVJTF9TVUNDRVNTCisgKiAgICAgIFVJTF9FUlJfeHh4IHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCB3dmxhbl91aWxfYmxvY2soIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid3ZsYW5fdWlsX2Jsb2NrIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYoIHVycS0+aGNmQ3R4ID09ICYoIGxwLT5oY2ZDdHggKSkgeworCQlpZiggY2FwYWJsZSggQ0FQX05FVF9BRE1JTiApKSB7CisJCQlscC0+ZmxhZ3MgfD0gV1ZMQU4yX1VJTF9CVVNZOworCQkJbmV0aWZfc3RvcF9xdWV1ZShscC0+ZGV2KTsKKwkJCVdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKCBscCApOworCQkJdXJxLT5yZXN1bHQgPSBVSUxfU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCURCR19FUlJPUiggRGJnSW5mbywgIkVQRVJNXG4iICk7CisJCQl1cnEtPnJlc3VsdCA9IFVJTF9GQUlMVVJFOworCQkJcmVzdWx0ID0gLUVQRVJNOworCQl9CisJfSBlbHNlIHsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAiVUlMX0VSUl9XUk9OR19JRkJcbiIgKTsKKwkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX1dST05HX0lGQjsKKwl9CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmVzdWx0OworfSAvLyB3dmxhbl91aWxfYmxvY2sKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3dmxhbl91aWxfdW5ibG9jaygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFVuYmxvY2tzIHRoZSBkcml2ZXIgdG8gcmVzdG9yZSBhY2Nlc3MgdG8gdGhlIGNhcmQgYnkgb3RoZXIgcHJvY2Vzc2VzLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgdXJxIC0gYSBwb2ludGVyIHRvIHRoZSBVSUwgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBVSUxfU1VDQ0VTUworICogICAgICBVSUxfRVJSX3h4eCB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHd2bGFuX3VpbF91bmJsb2NrKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50IHJlc3VsdCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggInd2bGFuX3VpbF91bmJsb2NrIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYoIHVycS0+aGNmQ3R4ID09ICYoIGxwLT5oY2ZDdHggKSkgeworCQlpZiggY2FwYWJsZSggQ0FQX05FVF9BRE1JTiApKSB7CisJCQlpZiAobHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZKSB7CisJCQkJbHAtPmZsYWdzICY9IH5XVkxBTjJfVUlMX0JVU1k7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShscC0+ZGV2KTsKKwkJCQlXTF9XRFNfTkVUSUZfV0FLRV9RVUVVRSggbHAgKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCURCR19FUlJPUiggRGJnSW5mbywgIkVQRVJNXG4iICk7CisJCQl1cnEtPnJlc3VsdCA9IFVJTF9GQUlMVVJFOworCQkJcmVzdWx0ID0gLUVQRVJNOworCQl9CisJfSBlbHNlIHsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAiVUlMX0VSUl9XUk9OR19JRkJcbiIgKTsKKwkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX1dST05HX0lGQjsKKwl9CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmVzdWx0OworfSAvLyB3dmxhbl91aWxfdW5ibG9jaworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXd2bGFuX3VpbF9zZW5kX2RpYWdfbXNnKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgU2VuZHMgYSBkaWFnbm9zdGljIG1lc3NhZ2UgdG8gdGhlIGNhcmQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB1cnEgLSBhIHBvaW50ZXIgdG8gdGhlIFVJTCByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIFVJTF9TVUNDRVNTCisgKiAgICAgIFVJTF9FUlJfeHh4IHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd3ZsYW5fdWlsX3NlbmRfZGlhZ19tc2coIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgICAgICAgICByZXN1bHQgPSAwOworCURFU0NfU1RSQ1QgIERlc2NwWzFdOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3dmxhbl91aWxfc2VuZF9kaWFnX21zZyIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKCB1cnEtPmhjZkN0eCA9PSAmKCBscC0+aGNmQ3R4ICkpIHsKKwkJaWYoIGNhcGFibGUoIENBUF9ORVRfQURNSU4gKSkgeworCQkJaWYgKCh1cnEtPmRhdGEgIT0gTlVMTCkgJiYgKHVycS0+bGVuICE9IDApKSB7CisJCQkJaWYgKGxwLT5oY2ZDdHguSUZCX1JzY0luZCAhPSAwKSB7CisJCQkJCXVfY2hhciAqZGF0YTsKKworCQkJCQkvLyBWZXJpZnkgdGhlIHVzZXIgYnVmZmVyCisJCQkJCXJlc3VsdCA9IHZlcmlmeV9hcmVhKFZFUklGWV9SRUFELCB1cnEtPmRhdGEsIHVycS0+bGVuKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSAwKSB7CisJCQkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJ2ZXJpZnlfYXJlYSBmYWlsZWQsIHJlc3VsdDogJWRcbiIsIHJlc3VsdCApOworCQkJCQkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKKwkJCQkJCURCR19MRUFWRSggRGJnSW5mbyApOworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCisJCQkJCWlmICgoZGF0YSA9IGttYWxsb2ModXJxLT5sZW4sIEdGUF9LRVJORUwpKSAhPSBOVUxMKSB7CisJCQkJCQltZW1zZXQoIERlc2NwLCAwLCBzaXplb2YoIERFU0NfU1RSQ1QgKSk7CisJCQkJCQltZW1jcHkoIGRhdGEsIHVycS0+ZGF0YSwgdXJxLT5sZW4gKTsKKworCQkJCQkJRGVzY3BbMF0uYnVmX2FkZHIgICAgICAgPSAod2NpX2J1ZnApZGF0YTsKKwkJCQkJCURlc2NwWzBdLkJVRl9DTlQgICAgICAgID0gdXJxLT5sZW47CisJCQkJCQlEZXNjcFswXS5uZXh0X2Rlc2NfYWRkciA9IDA7ICAgIC8vIHRlcm1pbmF0ZSBsaXN0CisKKwkJCQkJCWhjZl9zZW5kX21zZyggJihscC0+aGNmQ3R4KSwgICZEZXNjcFswXSwgSENGX1BPUlRfMCApOworCQkJCQkJa2ZyZWUoIGRhdGEgKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCURCR19FUlJPUiggRGJnSW5mbywgIkVOT01FTVxuIiApOworCQkJCQkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKKwkJCQkJCXJlc3VsdCA9IC1FTk9NRU07CisJCQkJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKworCQkJCX0gZWxzZSB7CisJCQkJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9CVVNZOworCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQl1cnEtPnJlc3VsdCA9IFVJTF9GQUlMVVJFOworCQkJfQorCQl9IGVsc2UgeworCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiRVBFUk1cbiIgKTsKKwkJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CisJCQlyZXN1bHQgPSAtRVBFUk07CisJCX0KKwl9IGVsc2UgeworCQlEQkdfRVJST1IoIERiZ0luZm8sICJVSUxfRVJSX1dST05HX0lGQlxuIiApOworCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfV1JPTkdfSUZCOworCX0KKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXN1bHQ7Cit9IC8vIHd2bGFuX3VpbF9zZW5kX2RpYWdfbXNnCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3dmxhbl91aWxfcHV0X2luZm8oKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBTZW5kcyBhIHNwZWNpZmljIFJJRCBkaXJlY3RseSB0byB0aGUgZHJpdmVyIHRvIHNldCBjb25maWd1cmF0aW9uIGluZm8uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB1cnEgLSBhIHBvaW50ZXIgdG8gdGhlIFVJTCByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIFVJTF9TVUNDRVNTCisgKiAgICAgIFVJTF9FUlJfeHh4IHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd3ZsYW5fdWlsX3B1dF9pbmZvKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50ICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKKwlsdHZfdCAgICAgICAgICAgICAgICAgICAqcEx0djsKKwlib29sX3QgICAgICAgICAgICAgICAgICBsdHZBbGxvY2F0ZWQgPSBGQUxTRTsKKwlFTkNTVFJDVCAgICAgICAgICAgICAgICBzRW5jcnlwdGlvbjsKKworI2lmZGVmIFVTRV9XRFMKKwloY2ZfMTYgICAgICAgICAgICAgICAgICBoY2ZQb3J0ICA9IEhDRl9QT1JUXzA7CisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3dmxhbl91aWxfcHV0X2luZm8iICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKworCWlmKCB1cnEtPmhjZkN0eCA9PSAmKCBscC0+aGNmQ3R4ICkpIHsKKwkJaWYoIGNhcGFibGUoIENBUF9ORVRfQURNSU4gKSkgeworCQkJaWYoKCB1cnEtPmRhdGEgIT0gTlVMTCApICYmICggdXJxLT5sZW4gIT0gMCApKSB7CisJCQkJLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhdCBsZWFzdCBhIGNvbW1hbmQgYW5kIGxlbmd0aCB0byBzZW5kLiAqLworCQkJCWlmKCB1cnEtPmxlbiA8ICggc2l6ZW9mKCBoY2ZfMTYgKSAqIDIgKSkgeworCQkJCQl1cnEtPmxlbiA9IHNpemVvZiggbHAtPmx0dlJlY29yZCApOworCQkJCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfTEVOOworCQkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJObyBMZW5ndGgvVHlwZSBpbiBMVFYhISFcbiIgKTsKKwkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiVUlMX0VSUl9MRU5cbiIgKTsKKwkJCQkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCisJCQkJLyogVmVyaWZ5IHRoZSB1c2VyIGJ1ZmZlciAqLworCQkJCXJlc3VsdCA9IHZlcmlmeV9hcmVhKCBWRVJJRllfUkVBRCwgdXJxLT5kYXRhLCB1cnEtPmxlbiApOworCQkJCWlmKCByZXN1bHQgIT0gMCApIHsKKwkJCQkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKKwkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAidmVyaWZ5X2FyZWEoKSwgVkVSSUZZX1JFQUQgRkFJTEVEXG4iICk7CisJCQkJCURCR19MRUFWRSggRGJnSW5mbyApOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKworCQkJCS8qIEdldCBvbmx5IHRoZSBjb21tYW5kIGFuZCBsZW5ndGggaW5mb3JtYXRpb24uICovCisJCQkJY29weV9mcm9tX3VzZXIoICYoIGxwLT5sdHZSZWNvcmQgKSwgdXJxLT5kYXRhLCBzaXplb2YoIGhjZl8xNiApICogMiApOworCisJCQkJLyogTWFrZSBzdXJlIHRoZSBpbmNvbWluZyBMVFYgcmVjb3JkIGxlbmd0aCBpcyB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUKKwkJCQkgICBJT0NUTCBsZW5ndGggKi8KKwkJCQlpZigoKCBscC0+bHR2UmVjb3JkLmxlbiArIDEgKSAqIHNpemVvZiggaGNmXzE2ICkpID4gdXJxLT5sZW4gKSB7CisJCQkJCXVycS0+bGVuID0gc2l6ZW9mKCBscC0+bHR2UmVjb3JkICk7CisJCQkJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9MRU47CisJCQkJCURCR19FUlJPUiggRGJnSW5mbywgIlVJTF9FUlJfTEVOXG4iICk7CisJCQkJCURCR19MRUFWRSggRGJnSW5mbyApOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKworCQkJCS8qIElmIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiBvdXIgbG9jYWwKKwkJCQkgICBMVFYgcmVjb3JkLCB0cnkgdG8gYWxsb2NhdGUgaXQgZnJvbSB0aGUga2VybmVsIHN0YWNrLgorCQkJCSAgIE90aGVyd2lzZSwgd2UganVzdCB1c2Ugb3VyIGxvY2FsIExUViByZWNvcmQuICovCisJCQkJaWYoIHVycS0+bGVuID4gc2l6ZW9mKCBscC0+bHR2UmVjb3JkICkpIHsKKwkJCQkJaWYoKCBwTHR2ID0gKGx0dl90ICopa21hbGxvYyggdXJxLT5sZW4sIEdGUF9LRVJORUwgKSkgIT0gTlVMTCApIHsKKwkJCQkJCWx0dkFsbG9jYXRlZCA9IFRSVUU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJBbGxvYyBGQUlMRURcbiIgKTsKKwkJCQkJCXVycS0+bGVuID0gc2l6ZW9mKCBscC0+bHR2UmVjb3JkICk7CisJCQkJCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfTEVOOworCQkJCQkJcmVzdWx0ID0gLUVOT01FTTsKKwkJCQkJCURCR19MRUFWRSggRGJnSW5mbyApOworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXBMdHYgPSAmKCBscC0+bHR2UmVjb3JkICk7CisJCQkJfQorCisJCQkJLyogQ29weSB0aGUgZGF0YSBmcm9tIHRoZSB1c2VyJ3MgYnVmZmVyIGludG8gdGhlIGxvY2FsIExUVgorCQkJCSAgIHJlY29yZCBkYXRhIGFyZWEuICovCisJCQkJY29weV9mcm9tX3VzZXIoIHBMdHYsIHVycS0+ZGF0YSwgdXJxLT5sZW4gKTsKKworCisJCQkJLyogV2UgbmVlZCB0byBzbm9vcCB0aGUgY29tbWFuZHMgdG8gc2VlIGlmIHRoZXJlIGlzIGFueXRoaW5nIHdlCisJCQkJICAgbmVlZCB0byBzdG9yZSBmb3IgdGhlIHB1cnBvc2VzIG9mIGEgcmVzZXQgb3Igc3RhcnQvc3RvcAorCQkJCSAgIHNlcXVlbmNlLiBQZXJmb3JtIGVuZGlhbiB0cmFuc2xhdGlvbiBhcyBuZWVkZWQgKi8KKwkJCQlzd2l0Y2goIHBMdHYtPnR5cCApIHsKKwkJCQljYXNlIENGR19DTkZfUE9SVF9UWVBFOgorCQkJCQlscC0+UG9ydFR5cGUgICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9PV05fTUFDX0FERFI6CisJCQkJCS8qIFRPRE86IGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgYW55dGhpbmcgYmFzZWQgb24gdGhpcyAqLworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DTkZfT1dOX0NIQU5ORUw6CisJCQkJCWxwLT5DaGFubmVsICAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJLyogQ0ZHX0NORl9PV05fU1NJRCBjdXJyZW50bHkgc2FtZSBhcyBDTkZfREVTSVJFRF9TU0lELiBEbyB3ZQorCQkJCSAgIG5lZWQgc2VwZXJhdGUgc3RvcmFnZSBmb3IgdGhpcz8gKi8KKwkJCQkvL2Nhc2UgQ0ZHX0NORl9PV05fU1NJRDoKKwkJCQljYXNlIENGR19DTkZfT1dOX0FUSU1fV0lORE9XOgorCQkJCQlscC0+YXRpbVdpbmRvdyAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9TWVNURU1fU0NBTEU6CisJCQkJCWxwLT5EaXN0YW5jZUJldHdlZW5BUHMgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisKKwkJCQljYXNlIENGR19DTkZfTUFYX0RBVEFfTEVOOgorCQkJCQkvKiBUT0RPOiBkZXRlcm1pbmUgaWYgd2UgYXJlIGdvaW5nIHRvIHN0b3JlIGFueXRoaW5nIGJhc2VkCisJCQkJCSAgIG9uIHRoaXMgKi8KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX1BNX0VOQUJMRUQ6CisJCQkJCWxwLT5QTUVuYWJsZWQgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX01DQVNUX1JYOgorCQkJCQlscC0+TXVsdGljYXN0UmVjZWl2ZSAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DTkZfTUFYX1NMRUVQX0RVUkFUSU9OOgorCQkJCQlscC0+TWF4U2xlZXBEdXJhdGlvbiAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DTkZfSE9MRE9WRVJfRFVSQVRJT046CisJCQkJCWxwLT5ob2xkb3ZlckR1cmF0aW9uICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9PV05fTkFNRToKKwkJCQkJbWVtc2V0KCBscC0+U3RhdGlvbk5hbWUsIDAsIHNpemVvZiggbHAtPlN0YXRpb25OYW1lICkpOworCQkJCQltZW1jcHkoICh2b2lkICopbHAtPlN0YXRpb25OYW1lLCAodm9pZCAqKSZwTHR2LT51LnU4WzJdLCAoc2l6ZV90KXBMdHYtPnUudTE2WzBdKTsKKwkJCQkJcEx0di0+dS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX0xPQURfQkFMQU5DSU5HOgorCQkJCQlscC0+bG9hZEJhbGFuY2luZyAgICAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DTkZfTUVESVVNX0RJU1RSSUJVVElPTjoKKwkJCQkJbHAtPm1lZGl1bURpc3RyaWJ1dGlvbiAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisjaWZkZWYgV0FSUAorCQkJCWNhc2UgQ0ZHX0NORl9UWF9QT1dfTFZMOgorCQkJCQlscC0+dHhQb3dMZXZlbCAgICAgICAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQkvL2Nhc2UgQ0ZHX0NORl9TSE9SVF9SRVRSWV9MSU1JVDogICAgLy8gU2hvcnQgUmV0cnkgTGltaXQKKwkJCQkvL2Nhc2UgMHhGQzMzOiAgICAvLyBMb25nIFJldHJ5IExpbWl0CisJCQkJY2FzZSBDRkdfU1VQUE9SVEVEX1JBVEVfU0VUX0NOVEw6ICAgICAgICAvLyBTdXBwb3J0ZWQgUmF0ZSBTZXQgQ29udHJvbAorCQkJCQlscC0+c3JzY1swXSAgICAgICAgICAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlscC0+c3JzY1sxXSAgICAgICAgICAgICA9IHBMdHYtPnUudTE2WzFdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlwTHR2LT51LnUxNlsxXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlsxXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19CQVNJQ19SQVRFX1NFVF9DTlRMOiAgICAgICAgLy8gQmFzaWMgUmF0ZSBTZXQgQ29udHJvbAorCQkJCQlscC0+YnJzY1swXSAgICAgICAgICAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlscC0+YnJzY1sxXSAgICAgICAgICAgICA9IHBMdHYtPnUudTE2WzFdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlwTHR2LT51LnUxNlsxXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlsxXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DTkZfQ09OTkVDVElPTl9DTlRMOgorCQkJCQlscC0+Y29ubmVjdGlvbkNvbnRyb2wgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQkvL2Nhc2UgQ0ZHX1BST0JFX0RBVEFfUkFURToKKyNlbmRpZiAgLy8gSEVSTUVTMjUKKworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKwkJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CisKKwkJCQljYXNlIENGR19DTkZfT1dOX0RUSU1fUEVSSU9EOgorCQkJCQlscC0+RFRJTVBlcmlvZCAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworI2lmZGVmIFdBUlAKKwkJCQljYXNlIENGR19DTkZfT1dOX0JFQUNPTl9JTlRFUlZBTDogICAgICAgIC8vIE93biBCZWFjb24gSW50ZXJ2YWwKKwkJCQkJbHAtPm93bkJlYWNvbkludGVydmFsICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisjZW5kaWYgLy8gV0FSUAorCQkJCWNhc2UgQ0ZHX0NPRVhJU1RFTlNFX0JFSEFWSU9VUjogICAgICAgICAvLyBDb2V4aXN0ZW5jZSBiZWhhdmlvcgorCQkJCQlscC0+Y29leGlzdGVuY2UgICAgICAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKyNpZmRlZiBVU0VfV0RTCisJCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSMToKKwkJCQkJbWVtY3B5KCAmbHAtPndkc19wb3J0WzBdLndkc0FkZHJlc3MsICZwTHR2LT51LnU4WzBdLCBFVEhfQUxFTiApOworCQkJCQloY2ZQb3J0ID0gSENGX1BPUlRfMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSMjoKKwkJCQkJbWVtY3B5KCAmbHAtPndkc19wb3J0WzFdLndkc0FkZHJlc3MsICZwTHR2LT51LnU4WzBdLCBFVEhfQUxFTiApOworCQkJCQloY2ZQb3J0ID0gSENGX1BPUlRfMjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSMzoKKwkJCQkJbWVtY3B5KCAmbHAtPndkc19wb3J0WzJdLndkc0FkZHJlc3MsICZwTHR2LT51LnU4WzBdLCBFVEhfQUxFTiApOworCQkJCQloY2ZQb3J0ID0gSENGX1BPUlRfMzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSNDoKKwkJCQkJbWVtY3B5KCAmbHAtPndkc19wb3J0WzNdLndkc0FkZHJlc3MsICZwTHR2LT51LnU4WzBdLCBFVEhfQUxFTiApOworCQkJCQloY2ZQb3J0ID0gSENGX1BPUlRfNDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSNToKKwkJCQkJbWVtY3B5KCAmbHAtPndkc19wb3J0WzRdLndkc0FkZHJlc3MsICZwTHR2LT51LnU4WzBdLCBFVEhfQUxFTiApOworCQkJCQloY2ZQb3J0ID0gSENGX1BPUlRfNTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSNjoKKwkJCQkJbWVtY3B5KCAmbHAtPndkc19wb3J0WzVdLndkc0FkZHJlc3MsICZwTHR2LT51LnU4WzBdLCBFVEhfQUxFTiApOworCQkJCQloY2ZQb3J0ID0gSENGX1BPUlRfNjsKKwkJCQkJYnJlYWs7CisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKworCQkJCWNhc2UgQ0ZHX0NORl9NQ0FTVF9QTV9CVUY6CisJCQkJCWxwLT5tdWx0aWNhc3RQTUJ1ZmZlcmluZyAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX1JFSkVDVF9BTlk6CisJCQkJCWxwLT5SZWplY3RBbnkgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisjZW5kaWYKKworCQkJCWNhc2UgQ0ZHX0NORl9FTkNSWVBUSU9OOgorCQkJCQlscC0+RW5hYmxlRW5jcnlwdGlvbiAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DTkZfQVVUSEVOVElDQVRJT046CisJCQkJCWxwLT5hdXRoZW50aWNhdGlvbiAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisJCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAorCisJCQkJLy9jYXNlIENGR19DTkZfRVhDTF9VTkVOQ1JZUFRFRDoKKwkJCQkJLy9scC0+RXhjbHVkZVVuZW5jcnlwdGVkICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQkvL3BMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCS8vYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX01DQVNUX1JBVEU6CisJCQkJCS8qIFRPRE86IGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgYW55dGhpbmcgYmFzZWQgb24gdGhpcyAqLworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DTkZfSU5UUkFfQlNTX1JFTEFZOgorCQkJCQlscC0+aW50cmFCU1NSZWxheSAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisjZW5kaWYKKworCQkJCWNhc2UgQ0ZHX0NORl9NSUNST19XQVZFOgorCQkJCQkvKiBUT0RPOiBkZXRlcm1pbmUgaWYgd2UgYXJlIGdvaW5nIHRvIHN0b3JlIGFueXRoaW5nIGJhc2VkIG9uIHRoaXMgKi8KKwkJCQkJYnJlYWs7CisJCQkJLy9jYXNlIENGR19DTkZfTE9BRF9CQUxBTkNJTkc6CisJCQkJCS8qIFRPRE86IGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgYW55dGhpbmcgYmFzZWQgb24gdGhpcyAqLworCQkJCQkvL2JyZWFrOworCQkJCS8vY2FzZSBDRkdfQ05GX01FRElVTV9ESVNUUklCVVRJT046CisJCQkJCS8qIFRPRE86IGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgYW55dGhpbmcgYmFzZWQgb24gdGhpcyAqLworCQkJCQkvL2JyZWFrOworCQkJCS8vY2FzZSBDRkdfQ05GX1JYX0FMTF9HUk9VUF9BRERSRVNTOgorCQkJCQkvLyBUT0RPOiBkZXRlcm1pbmUgaWYgd2UgYXJlIGdvaW5nIHRvIHN0b3JlIGFueXRoaW5nIGJhc2VkIG9uIHRoaXMKKwkJCQkJLy9icmVhazsKKwkJCQkvL2Nhc2UgQ0ZHX0NORl9DT1VOVFJZX0lORk86CisJCQkJCS8qIFRPRE86IGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgYW55dGhpbmcgYmFzZWQgb24gdGhpcyAqLworCQkJCQkvL2JyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9PV05fU1NJRDoKKwkJCQkvL2Nhc2UgQ05GX0RFU0lSRURfU1NJRDoKKwkJCQljYXNlIENGR19ERVNJUkVEX1NTSUQ6CisJCQkJCW1lbXNldCggbHAtPk5ldHdvcmtOYW1lLCAwLCBzaXplb2YoIGxwLT5OZXR3b3JrTmFtZSApKTsKKwkJCQkJbWVtY3B5KCAodm9pZCAqKWxwLT5OZXR3b3JrTmFtZSwgKHZvaWQgKikmcEx0di0+dS51OFsyXSwgKHNpemVfdClwTHR2LT51LnUxNlswXSApOworCQkJCQlwTHR2LT51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCisJCQkJCS8qIHRha2UgY2FyZSBvZiB0aGUgc3BlY2lhbCBuZXR3b3JrIG5hbWUgIkFOWSIgY2FzZSAqLworCQkJCQlpZigoIHN0cmxlbiggJnBMdHYtPnUudThbMl0gICAgICAgICkgPT0gMCApIHx8CisJCQkJCSAgICggc3RyY21wKCAmcEx0di0+dS51OFsyXSwgIkFOWSIgKSA9PSAwICkgfHwKKwkJCQkJICAgKCBzdHJjbXAoICZwTHR2LT51LnU4WzJdLCAiYW55IiApID09IDAgKSkgeworCQkJCQkJLyogc2V0IHRoZSBTU0lEX1NUUkNUIGxsZW4gZmllbGQgKHUxNlswXSkgdG8gemVybywgYW5kIHRoZQorCQkJCQkJZWZmZWN0dWFsbHkgbnVsbCB0aGUgc3RyaW5nIHU4WzJdICovCisJCQkJCQlwTHR2LT51LnUxNlswXSA9IDA7CisJCQkJCQlwTHR2LT51LnU4WzJdICA9IDA7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfR1JPVVBfQUREUjoKKwkJCQkJLyogVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZCBvbiB0aGlzICovCisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NSRUFURV9JQlNTOgorCQkJCQlscC0+Q3JlYXRlSUJTUyAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1JUU19USFJIOgorCQkJCQlscC0+UlRTVGhyZXNob2xkICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfVFhfUkFURV9DTlRMOgorCQkJCQlscC0+VHhSYXRlQ29udHJvbFswXSAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlscC0+VHhSYXRlQ29udHJvbFsxXSAgICA9IHBMdHYtPnUudTE2WzFdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlwTHR2LT51LnUxNlsxXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlsxXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19QUk9NSVNDVU9VU19NT0RFOgorCQkJCQkvKiBUT0RPOiBkZXRlcm1pbmUgaWYgd2UgYXJlIGdvaW5nIHRvIHN0b3JlIGFueXRoaW5nIGJhc2VkIG9uIHRoaXMgKi8KKwkJCQkJYnJlYWs7CisJCQkJLy9jYXNlIENGR19XQUtFX09OX0xBTjoKKwkJCQkJLyogVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZCBvbiB0aGlzICovCisJCQkJCS8vYnJlYWs7CisjaWYgMSAvLzs/ICNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKwkJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CisJCQkJY2FzZSBDRkdfUlRTX1RIUkgwOgorCQkJCQlscC0+UlRTVGhyZXNob2xkICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfVFhfUkFURV9DTlRMMDoKKy8vOz9ubyBpZGVhIHdoYXQgdGhpcyBzaG91bGQgYmUsIGdldCBnb2luZyBzbyBjb21tZW50IGl0IG91dAkJCQkJbHAtPlR4UmF0ZUNvbnRyb2wgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworI2lmZGVmIFVTRV9XRFMKKwkJCQljYXNlIENGR19SVFNfVEhSSDE6CisJCQkJCWxwLT53ZHNfcG9ydFswXS5ydHNUaHJlc2hvbGQgICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQloY2ZQb3J0ICAgICAgICAgICAgICAgICAgICAgICAgID0gSENGX1BPUlRfMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfUlRTX1RIUkgyOgorCQkJCQlscC0+d2RzX3BvcnRbMV0ucnRzVGhyZXNob2xkICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJaGNmUG9ydCAgICAgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1JUU19USFJIMzoKKwkJCQkJbHAtPndkc19wb3J0WzJdLnJ0c1RocmVzaG9sZCAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgPSBIQ0ZfUE9SVF8zOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19SVFNfVEhSSDQ6CisJCQkJCWxwLT53ZHNfcG9ydFszXS5ydHNUaHJlc2hvbGQgICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQloY2ZQb3J0ICAgICAgICAgICAgICAgICAgICAgICAgID0gSENGX1BPUlRfNDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfUlRTX1RIUkg1OgorCQkJCQlscC0+d2RzX3BvcnRbNF0ucnRzVGhyZXNob2xkICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJaGNmUG9ydCAgICAgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1JUU19USFJINjoKKwkJCQkJbHAtPndkc19wb3J0WzVdLnJ0c1RocmVzaG9sZCAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgPSBIQ0ZfUE9SVF82OworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19UWF9SQVRFX0NOVEwxOgorCQkJCQlscC0+d2RzX3BvcnRbMF0udHhSYXRlQ250bCAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1RYX1JBVEVfQ05UTDI6CisJCQkJCWxwLT53ZHNfcG9ydFsxXS50eFJhdGVDbnRsICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJaGNmUG9ydCAgICAgICAgICAgICAgICAgICAgID0gSENGX1BPUlRfMjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfVFhfUkFURV9DTlRMMzoKKwkJCQkJbHAtPndkc19wb3J0WzJdLnR4UmF0ZUNudGwgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQloY2ZQb3J0ICAgICAgICAgICAgICAgICAgICAgPSBIQ0ZfUE9SVF8zOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19UWF9SQVRFX0NOVEw0OgorCQkJCQlscC0+d2RzX3BvcnRbM10udHhSYXRlQ250bCAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1RYX1JBVEVfQ05UTDU6CisJCQkJCWxwLT53ZHNfcG9ydFs0XS50eFJhdGVDbnRsICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJaGNmUG9ydCAgICAgICAgICAgICAgICAgICAgID0gSENGX1BPUlRfNTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfVFhfUkFURV9DTlRMNjoKKwkJCQkJbHAtPndkc19wb3J0WzVdLnR4UmF0ZUNudGwgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQloY2ZQb3J0ICAgICAgICAgICAgICAgICAgICAgPSBIQ0ZfUE9SVF82OworCQkJCQlicmVhazsKKyNlbmRpZiAgLyogVVNFX1dEUyAqLworI2VuZGlmICAvKiAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAgKi8KKworCQkJCWNhc2UgQ0ZHX0RFRkFVTFRfS0VZUzoKKwkJCQkJeworCQkJCQkJQ0ZHX0RFRkFVTFRfS0VZU19TVFJDVCAqcEtleXMgPSAoQ0ZHX0RFRkFVTFRfS0VZU19TVFJDVCAqKXBMdHY7CisKKwkJCQkJCXBLZXlzLT5rZXlbMF0ubGVuID0gQ05WX0lOVF9UT19MSVRUTEUoIHBLZXlzLT5rZXlbMF0ubGVuICk7CisJCQkJCQlwS2V5cy0+a2V5WzFdLmxlbiA9IENOVl9JTlRfVE9fTElUVExFKCBwS2V5cy0+a2V5WzFdLmxlbiApOworCQkJCQkJcEtleXMtPmtleVsyXS5sZW4gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEtleXMtPmtleVsyXS5sZW4gKTsKKwkJCQkJCXBLZXlzLT5rZXlbM10ubGVuID0gQ05WX0lOVF9UT19MSVRUTEUoIHBLZXlzLT5rZXlbM10ubGVuICk7CisKKwkJCQkJCW1lbWNweSggKHZvaWQgKikmKGxwLT5EZWZhdWx0S2V5cyksICh2b2lkICopcEtleXMsCisJCQkJCQkJCXNpemVvZiggQ0ZHX0RFRkFVTFRfS0VZU19TVFJDVCApKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19UWF9LRVlfSUQ6CisJCQkJCWxwLT5UcmFuc21pdEtleUlEICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19TQ0FOX1NTSUQ6CisJCQkJCS8qIFRPRE86IGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgYW55dGhpbmcgYmFzZWQgb24gdGhpcyAqLworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19USUNLX1RJTUU6CisJCQkJCS8qIFRPRE86IGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgYW55dGhpbmcgYmFzZWQgb24gdGhpcyAqLworCQkJCQlicmVhazsKKwkJCQkvKiB0aGVzZSBSSURTIGFyZSBJbmZvIFJJRHMsIGFuZCBzaG91bGQgdGhleSBiZSBhbGxvd2VkIGZvciBwdXRzPz8/ICovCisJCQkJY2FzZSBDRkdfTUFYX0xPQURfVElNRToKKwkJCQljYXNlIENGR19ETF9CVUY6CisJCQkJLy9jYXNlIENGR19IU0lfU1VQX1JBTkdFOgorCQkJCWNhc2UgQ0ZHX05JQ19TRVJJQUxfTlVNQkVSOgorCQkJCWNhc2UgQ0ZHX05JQ19JREVOVElUWToKKwkJCQljYXNlIENGR19OSUNfTUZJX1NVUF9SQU5HRToKKwkJCQljYXNlIENGR19OSUNfQ0ZJX1NVUF9SQU5HRToKKwkJCQljYXNlIENGR19OSUNfVEVNUF9UWVBFOgorCQkJCWNhc2UgQ0ZHX05JQ19QUk9GSUxFOgorCQkJCWNhc2UgQ0ZHX0ZXX0lERU5USVRZOgorCQkJCWNhc2UgQ0ZHX0ZXX1NVUF9SQU5HRToKKwkJCQljYXNlIENGR19NRklfQUNUX1JBTkdFU19TVEE6CisJCQkJY2FzZSBDRkdfQ0ZJX0FDVF9SQU5HRVNfU1RBOgorCQkJCWNhc2UgQ0ZHX1BPUlRfU1RBVDoKKwkJCQljYXNlIENGR19DVVJfU1NJRDoKKwkJCQljYXNlIENGR19DVVJfQlNTSUQ6CisJCQkJY2FzZSBDRkdfQ09NTVNfUVVBTElUWToKKwkJCQljYXNlIENGR19DVVJfVFhfUkFURToKKwkJCQljYXNlIENGR19DVVJfQkVBQ09OX0lOVEVSVkFMOgorCQkJCWNhc2UgQ0ZHX0NVUl9TQ0FMRV9USFJIOgorCQkJCWNhc2UgQ0ZHX1BST1RPQ09MX1JTUF9USU1FOgorCQkJCWNhc2UgQ0ZHX0NVUl9TSE9SVF9SRVRSWV9MSU1JVDoKKwkJCQljYXNlIENGR19DVVJfTE9OR19SRVRSWV9MSU1JVDoKKwkJCQljYXNlIENGR19NQVhfVFhfTElGRVRJTUU6CisJCQkJY2FzZSBDRkdfTUFYX1JYX0xJRkVUSU1FOgorCQkJCWNhc2UgQ0ZHX0NGX1BPTExBQkxFOgorCQkJCWNhc2UgQ0ZHX0FVVEhFTlRJQ0FUSU9OX0FMR09SSVRITVM6CisJCQkJY2FzZSBDRkdfUFJJVkFDWV9PUFRfSU1QTEVNRU5URUQ6CisJCQkJLy9jYXNlIENGR19DVVJSRU5UX1JFTU9URV9SQVRFUzoKKwkJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfVVNFRF9SQVRFUzoKKwkJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfU1lTVEVNX1NDQUxFOgorCQkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9UWF9SQVRFMToKKwkJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfVFhfUkFURTI6CisJCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEUzOgorCQkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9UWF9SQVRFNDoKKwkJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfVFhfUkFURTU6CisJCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEU2OgorCQkJCWNhc2UgQ0ZHX05JQ19NQUNfQUREUjoKKwkJCQljYXNlIENGR19QQ0ZfSU5GTzoKKwkJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfQ09VTlRSWV9JTkZPOgorCQkJCWNhc2UgQ0ZHX1BIWV9UWVBFOgorCQkJCWNhc2UgQ0ZHX0NVUl9DSEFOTkVMOgorCQkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9QT1dFUl9TVEFURToKKwkJCQkvL2Nhc2UgQ0ZHX0NDQU1PREU6CisJCQkJY2FzZSBDRkdfU1VQUE9SVEVEX0RBVEFfUkFURVM6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0FQX01PREU6CisvLzs/CQkJCWxwLT5Eb3dubG9hZEZpcm13YXJlID0gKCBwTHR2LT51LnUxNlswXSApICsgMTsKKwkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAic2V0IENGR19BUF9NT0RFIG5vIGxvbmdlciBzdXBwb3J0ZWRcbiIgKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfRU5DUllQVF9TVFJJTkc6CisJCQkJCS8qIFRPRE86IEVORElBTiBUUkFOU0xBVElPTiBIRVJFPz8/ICovCisJCQkJCW1lbXNldCggbHAtPnN6RW5jcnlwdGlvbiwgMCwgc2l6ZW9mKCBscC0+c3pFbmNyeXB0aW9uICkpOworCQkJCQltZW1jcHkoICh2b2lkICopbHAtPnN6RW5jcnlwdGlvbiwgICh2b2lkICopJnBMdHYtPnUudThbMF0sCisJCQkJCQkJKCBwTHR2LT5sZW4gKiBzaXplb2YoIGhjZl8xNiApKSApOworCQkJCQl3bF93ZXBfZGVjb2RlKCBDUllQVF9DT0RFLCAmc0VuY3J5cHRpb24sCisJCQkJCQkJCSAgICBscC0+c3pFbmNyeXB0aW9uICk7CisKKwkJCQkJLyogdGhlIExpbnV4IGRyaXZlciBsaWtlcyB0byB1c2UgMS00IGZvciB0aGUga2V5IElEcywgYW5kIHRoZW4KKwkJCQkJY29udmVydCB0byAwLTMgd2hlbiBzZW5kaW5nIHRvIHRoZSBjYXJkLiAgVGhlIFdpbmRvd3MgY29kZQorCQkJCQliYXNlIHVzZWQgMC0zIGluIHRoZSBBUEkgRExMLCB3aGljaCB3YXMgcG9ydGVkIHRvIExpbnV4LiAgRm9yCisJCQkJCXRoZSBzYWtlIG9mIHRoZSB1c2VyIGV4cGVyaWVuY2UsIHdlIGRlY2lkZWQgdG8ga2VlcCAwLTMgYXMgdGhlCisJCQkJCW51bWJlcnMgdXNlZCBpbiB0aGUgRExMOyBhbmQgd2lsbCBwZXJmb3JtIHRoZSArMSBjb252ZXJzaW9uIGhlcmUuCisJCQkJCVdlIGNvdWxkIGhhdmUgY29udmVydGVkICB0aGUgZW50aXJlIExpbnV4IGRyaXZlciwgYnV0IHRoaXMgaXMKKwkJCQkJbGVzcyBvYnRydXNpdmUuICBUaGlzIG1heSBiZSBhICJ0b2RvIiB0byBjb252ZXJ0IHRoZSB3aG9sZSBkcml2ZXIgKi8KKwkJCQkJbHAtPlRyYW5zbWl0S2V5SUQgICAgPSBzRW5jcnlwdGlvbi53VHhLZXlJRCArIDE7CisJCQkJCWxwLT5FbmFibGVFbmNyeXB0aW9uID0gc0VuY3J5cHRpb24ud0VuYWJsZWQ7CisKKwkJCQkJbWVtY3B5KCAmbHAtPkRlZmF1bHRLZXlzLCAmc0VuY3J5cHRpb24uRW5jU3RyLAorCQkJCQkJCXNpemVvZiggQ0ZHX0RFRkFVTFRfS0VZU19TVFJDVCApKTsKKwkJCQkJYnJlYWs7CisJCQkJLypjYXNlIENGR19DT1VOVFJZX1NUUklORzoKKwkJCQkJbWVtc2V0KCBscC0+Y291bnRyeVN0cmluZywgMCwgc2l6ZW9mKCBscC0+Y291bnRyeVN0cmluZyApKTsKKwkJCQkJbWVtY3B5KCAodm9pZCAqKWxwLT5jb3VudHJ5U3RyaW5nLCAodm9pZCAqKSZwTHR2LT51LnU4WzJdLCAoc2l6ZV90KXBMdHYtPnUudTE2WzBdKTsKKwkJCQkJYnJlYWs7CisJCQkJKi8KKworCQkJCWNhc2UgQ0ZHX0RSSVZFUl9FTkFCTEU6CisJCQkJCWxwLT5kcml2ZXJFbmFibGUgICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19XT0xBU19FTkFCTEU6CisJCQkJCWxwLT53b2xhc0VuYWJsZSA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfU0VUX1dQQV9BVVRIX0tFWV9NR01UX1NVSVRFOgorCQkJCQlscC0+QXV0aEtleU1nbXRTdWl0ZSA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfRElTQVNTT0NJQVRFX0FERFI6CisJCQkJCXBMdHYtPnUudTE2W0VUSF9BTEVOIC8gMl0gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbRVRIX0FMRU4gLyAyXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19BRERfVEtJUF9ERUZBVUxUX0tFWToKKwkJCQljYXNlIENGR19SRU1PVkVfVEtJUF9ERUZBVUxUX0tFWToKKwkJCQkJLyogRW5kaWFuIGNvbnZlcnQgdGhlIFR4IEtleSBJbmZvcm1hdGlvbiAqLworCQkJCQlwTHR2LT51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19BRERfVEtJUF9NQVBQRURfS0VZOgorCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19SRU1PVkVfVEtJUF9NQVBQRURfS0VZOgorCQkJCQlicmVhazsKKwkJCQkvKiBzb21lIFJJRHMganVzdCBjYW4ndCBiZSBwdXQgKi8KKwkJCQljYXNlIENGR19NQl9JTkZPOgorCQkJCWNhc2UgQ0ZHX0lGQjoKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvKiBUaGlzIGNvZGUgd2lsbCBwcmV2ZW50IFN0YXRpYyBDb25maWd1cmF0aW9uIEVudGl0aWVzIGZyb20KKwkJCQkgICBiZWluZyBzZW50IHRvIHRoZSBjYXJkLCBhcyB0aGV5IHJlcXVpcmUgYSBjYWxsIHRvCisJCQkJICAgVUlMX0FDVF9BUFBMWSB0byB0YWtlIGVmZmVjdC4gRHluYW1pYyBFbnRpdGllcyB3aWxsIGJlIHNlbnQKKwkJCQkgICBpbW1lZGlhdGVseSAqLworCQkJCXN3aXRjaCggcEx0di0+dHlwICkgeworCQkJCWNhc2UgQ0ZHX0NORl9QT1JUX1RZUEU6CisJCQkJY2FzZSBDRkdfQ05GX09XTl9NQUNfQUREUjoKKwkJCQljYXNlIENGR19DTkZfT1dOX0NIQU5ORUw6CisJCQkJY2FzZSBDRkdfQ05GX09XTl9TU0lEOgorCQkJCWNhc2UgQ0ZHX0NORl9PV05fQVRJTV9XSU5ET1c6CisJCQkJY2FzZSBDRkdfQ05GX1NZU1RFTV9TQ0FMRToKKwkJCQljYXNlIENGR19DTkZfTUFYX0RBVEFfTEVOOgorCQkJCWNhc2UgQ0ZHX0NORl9QTV9FTkFCTEVEOgorCQkJCWNhc2UgQ0ZHX0NORl9NQ0FTVF9SWDoKKwkJCQljYXNlIENGR19DTkZfTUFYX1NMRUVQX0RVUkFUSU9OOgorCQkJCWNhc2UgQ0ZHX0NORl9IT0xET1ZFUl9EVVJBVElPTjoKKwkJCQljYXNlIENGR19DTkZfT1dOX05BTUU6CisJCQkJY2FzZSBDRkdfQ05GX0xPQURfQkFMQU5DSU5HOgorCQkJCWNhc2UgQ0ZHX0NORl9NRURJVU1fRElTVFJJQlVUSU9OOgorI2lmZGVmIFdBUlAKKwkJCQljYXNlIENGR19DTkZfVFhfUE9XX0xWTDoKKwkJCQljYXNlIENGR19DTkZfQ09OTkVDVElPTl9DTlRMOgorCQkJCS8vY2FzZSBDRkdfUFJPQkVfREFUQV9SQVRFOgorI2VuZGlmIC8vIEhFUk1FUzI1CisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorCQkvLzs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQKKwkJCQljYXNlIENGR19DTkZfT1dOX0RUSU1fUEVSSU9EOgorI2lmZGVmIFdBUlAKKwkJCQljYXNlIENGR19DTkZfT1dOX0JFQUNPTl9JTlRFUlZBTDogICAgICAgICAgICAgICAgICAgIC8vIE93biBCZWFjb24gSW50ZXJ2YWwKKyNlbmRpZiAvLyBXQVJQCisjaWZkZWYgVVNFX1dEUworCQkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjE6CisJCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSMjoKKwkJCQljYXNlIENGR19DTkZfV0RTX0FERFIzOgorCQkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjQ6CisJCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSNToKKwkJCQljYXNlIENGR19DTkZfV0RTX0FERFI2OgorI2VuZGlmCisJCQkJY2FzZSBDRkdfQ05GX01DQVNUX1BNX0JVRjoKKwkJCQljYXNlIENGR19DTkZfUkVKRUNUX0FOWToKKyNlbmRpZgorCisJCQkJY2FzZSBDRkdfQ05GX0VOQ1JZUFRJT046CisJCQkJY2FzZSBDRkdfQ05GX0FVVEhFTlRJQ0FUSU9OOgorI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKwkJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CisKKwkJCQljYXNlIENGR19DTkZfRVhDTF9VTkVOQ1JZUFRFRDoKKwkJCQljYXNlIENGR19DTkZfTUNBU1RfUkFURToKKwkJCQljYXNlIENGR19DTkZfSU5UUkFfQlNTX1JFTEFZOgorI2VuZGlmCisKKwkJCQljYXNlIENGR19DTkZfTUlDUk9fV0FWRToKKwkJCQkvL2Nhc2UgQ0ZHX0NORl9MT0FEX0JBTEFOQ0lORzoKKwkJCQkvL2Nhc2UgQ0ZHX0NORl9NRURJVU1fRElTVFJJQlVUSU9OOgorCQkJCS8vY2FzZSBDRkdfQ05GX1JYX0FMTF9HUk9VUF9BRERSRVNTOgorCQkJCS8vY2FzZSBDRkdfQ05GX0NPVU5UUllfSU5GTzoKKwkJCQkvL2Nhc2UgQ0ZHX0NPVU5UUllfU1RSSU5HOgorCQkJCWNhc2UgQ0ZHX0FQX01PREU6CisJCQkJY2FzZSBDRkdfRU5DUllQVF9TVFJJTkc6CisJCQkJLy9jYXNlIENGR19EUklWRVJfRU5BQkxFOgorCQkJCWNhc2UgQ0ZHX1dPTEFTX0VOQUJMRToKKwkJCQljYXNlIENGR19NQl9JTkZPOgorCQkJCWNhc2UgQ0ZHX0lGQjoKKwkJCQkJYnJlYWs7CisJCQkJLyogRGVhbCB3aXRoIHRoaXMgZHluYW1pYyBNU0YgUklELCBhcyBpdCdzIHJlcXVpcmVkIGZvciBXUEEgKi8KKwkJCQljYXNlIENGR19EUklWRVJfRU5BQkxFOgorCQkJCQlpZiggbHAtPmRyaXZlckVuYWJsZSApIHsKKwkJCQkJCS8vaGNmX2NudGxfcG9ydCggJiggbHAtPmhjZkN0eCApLAorCQkJCQkJLy8gICAgICAgICAgICAgICBIQ0ZfUE9SVF9FTkFCTEUgfCBIQ0ZfUE9SVF8wICk7CisJCQkJCQkvLyAvL2hjZl9jbnRsKCAmKCBscC0+aGNmQ3R4ICksCisJCQkJCQkvLyAvLyAgICAgICAgIEhDRl9QT1JUX0VOQUJMRSB8IEhDRl9QT1JUXzAgKTsKKwkJCQkJCS8vaGNmX2NudGwoICYoIGxwLT5oY2ZDdHggKSwgSENGX0NOVExfRU5BQkxFICk7CisJCQkJCQkvLyAvL2hjZl9jbnRsKCAmKCBscC0+aGNmQ3R4ICksIEhDRl9DTlRMX0NPTk5FQ1QgKTsKKworCQkJCQkJaGNmX2NudGwoICYoIGxwLT5oY2ZDdHggKSwgSENGX0NOVExfRU5BQkxFIHwgSENGX1BPUlRfMCApOworCQkJCQkJaGNmX2NudGwoICYoIGxwLT5oY2ZDdHggKSwgSENGX0NOVExfQ09OTkVDVCApOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy9oY2ZfY250bF9wb3J0KCAmKCBscC0+aGNmQ3R4ICksCisJCQkJCQkvLyAgICAgICAgICAgICAgIEhDRl9QT1JUX0RJU0FCTEUgfCBIQ0ZfUE9SVF8wICk7CisJCQkJCQkvLyAvL2hjZl9jbnRsKCAmKCBscC0+aGNmQ3R4ICksCisJCQkJCQkvLyAvLyAgICAgICAgIEhDRl9QT1JUX0RJU0FCTEUgfCBIQ0ZfUE9SVF8wICk7CisJCQkJCQkvL2hjZl9jbnRsKCAmKCBscC0+aGNmQ3R4ICksIEhDRl9DTlRMX0RJU0FCTEUgKTsKKwkJCQkJCS8vIC8vaGNmX2NudGwoICYoIGxwLT5oY2ZDdHggKSwgSENGX0NOVExfRElTQ09OTkVDVCApOworCisJCQkJCQloY2ZfY250bCggJiggbHAtPmhjZkN0eCApLCBIQ0ZfQ05UTF9ESVNBQkxFIHwgSENGX1BPUlRfMCApOworCQkJCQkJaGNmX2NudGwoICYoIGxwLT5oY2ZDdHggKSwgSENGX0NOVExfRElTQ09OTkVDVCApOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisgICAgCQkJCQl3bF9hY3RfaW50X29mZiggbHAgKTsKKwkJCQkJdXJxLT5yZXN1bHQgPSBoY2ZfcHV0X2luZm8oJihscC0+aGNmQ3R4KSwgKExUVlApIHBMdHYpOworICAgIAkJCQkJd2xfYWN0X2ludF9vbiggbHAgKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYoIGx0dkFsbG9jYXRlZCApIHsKKwkJCQkJa2ZyZWUoIHBMdHYgKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlEQkdfRVJST1IoIERiZ0luZm8sICJFUEVSTVxuIiApOworCQkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKKwkJCXJlc3VsdCA9IC1FUEVSTTsKKwkJfQorCX0gZWxzZSB7CisJCURCR19FUlJPUiggRGJnSW5mbywgIlVJTF9FUlJfV1JPTkdfSUZCXG4iICk7CisJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9XUk9OR19JRkI7CisJfQorCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJlc3VsdDsKK30gLy8gd3ZsYW5fdWlsX3B1dF9pbmZvCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd3ZsYW5fdWlsX2dldF9pbmZvKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgU2VuZHMgYSBzcGVjaWZpYyBSSUQgZGlyZWN0bHkgdG8gdGhlIGRyaXZlciB0byByZXRyaWV2ZSBjb25maWd1cmF0aW9uCisgKiAgICAgIGluZm8uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB1cnEgLSBhIHBvaW50ZXIgdG8gdGhlIFVJTCByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIFVJTF9TVUNDRVNTCisgKiAgICAgIFVJTF9FUlJfeHh4IHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd3ZsYW5fdWlsX2dldF9pbmZvKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IGk7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJREJHX0ZVTkMoICJ3dmxhbl91aWxfZ2V0X2luZm8iICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZiggdXJxLT5oY2ZDdHggPT0gJiggbHAtPmhjZkN0eCApKSB7CisJCWlmKCggdXJxLT5kYXRhICE9IE5VTEwgKSAmJiAoIHVycS0+bGVuICE9IDAgKSkgeworCQkJbHR2X3QgICAgICAqcEx0djsKKwkJCWJvb2xfdCAgICAgIGx0dkFsbG9jYXRlZCA9IEZBTFNFOworCisJCQkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGF0IGxlYXN0IGEgY29tbWFuZCBhbmQgbGVuZ3RoICovCisJCQlpZiggdXJxLT5sZW4gPCAoIHNpemVvZiggaGNmXzE2ICkgKiAyICkpIHsKKwkJCQl1cnEtPmxlbiA9IHNpemVvZiggbHAtPmx0dlJlY29yZCApOworCQkJCURCR19FUlJPUiggRGJnSW5mbywgIk5vIExlbmd0aC9UeXBlIGluIExUViEhIVxuIiApOworCQkJCURCR19FUlJPUiggRGJnSW5mbywgIlVJTF9FUlJfTEVOXG4iICk7CisJCQkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX0xFTjsKKwkJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQkvKiBWZXJpZnkgdGhlIHVzZXIncyBMVFYgcmVjb3JkIGhlYWRlci4gKi8KKwkJCXJlc3VsdCA9IHZlcmlmeV9hcmVhKCBWRVJJRllfUkVBRCwgdXJxLT5kYXRhLCBzaXplb2YoIGhjZl8xNiApICogMiApOworCQkJaWYoIHJlc3VsdCAhPSAwICkgeworCQkJCURCR19FUlJPUiggRGJnSW5mbywgInZlcmlmeV9hcmVhKCksIFZFUklGWV9SRUFEIEZBSUxFRFxuIiApOworCQkJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CisJCQkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJLyogR2V0IG9ubHkgdGhlIGNvbW1hbmQgYW5kIGxlbmd0aCBpbmZvcm1hdGlvbi4gKi8KKwkJCXJlc3VsdCA9IGNvcHlfZnJvbV91c2VyKCAmKCBscC0+bHR2UmVjb3JkICksIHVycS0+ZGF0YSwgc2l6ZW9mKCBoY2ZfMTYgKSAqIDIgKTsKKworCQkJLyogTWFrZSBzdXJlIHRoZSBpbmNvbWluZyBMVFYgcmVjb3JkIGxlbmd0aCBpcyB3aXRoaW4gdGhlIGJvdW5kcyBvZgorCQkJICAgdGhlIElPQ1RMIGxlbmd0aC4gKi8KKwkJCWlmKCgoIGxwLT5sdHZSZWNvcmQubGVuICsgMSApICogc2l6ZW9mKCBoY2ZfMTYgKSkgPiB1cnEtPmxlbiApIHsKKwkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJJbmNvbWluZyBMVFYgdG9vIGJpZ1xuIiApOworCQkJCXVycS0+bGVuID0gc2l6ZW9mKCBscC0+bHR2UmVjb3JkICk7CisJCQkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX0xFTjsKKwkJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQkvKiBEZXRlcm1pbmUgaWYgaGNmX2dldF9pbmZvKCkgaXMgbmVlZGVkIG9yIG5vdCAqLworCQkJc3dpdGNoICggbHAtPmx0dlJlY29yZC50eXAgKSB7CisJCQljYXNlIENGR19OSUNfSURFTlRJVFk6CisJCQkJbWVtY3B5KCAmbHAtPmx0dlJlY29yZC51LnU4WzBdLCAmbHAtPk5JQ0lkZW50aXR5LCBzaXplb2YoIGxwLT5OSUNJZGVudGl0eSApKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0ZHX1BSSV9JREVOVElUWToKKwkJCQltZW1jcHkoICZscC0+bHR2UmVjb3JkLnUudThbMF0sICZscC0+UHJpbWFyeUlkZW50aXR5LCBzaXplb2YoIGxwLT5QcmltYXJ5SWRlbnRpdHkgKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIENGR19BUF9NT0RFOgorCQkJCURCR19FUlJPUiggRGJnSW5mbywgInNldCBDRkdfQVBfTU9ERSBubyBsb25nZXIgc3VwcG9ydGVkLCBzbyBpcyBnZXQgdXNlZnVsID8/Pz9cbiIgKTsKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdID0KKwkJCQkJQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVA7CisJCQkJYnJlYWs7CisJCQkvL2Nhc2UgQ0ZHX0RSVl9JTkZPOgorCQkJY2FzZSBDRkdfRU5DUllQVF9TVFJJTkc6CisJCQljYXNlIENGR19DT1VOVFJZX1NUUklORzoKKwkJCWNhc2UgQ0ZHX0RSSVZFUl9FTkFCTEU6CisJCQljYXNlIENGR19XT0xBU19FTkFCTEU6CisJCQkJLy8gVE9ETzogZGV0ZXJtaW5lIGlmIHdlJ3JlIGdvaW5nIHRvIHN1cHBvcnQgdGhlc2UKKwkJCQl1cnEtPnJlc3VsdCA9IFVJTF9GQUlMVVJFOworCQkJCWJyZWFrOworCQkJY2FzZSBDRkdfRFJWX0lORk86CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSW50ZXJjZXB0IENGR19EUlZfSU5GT1xuIiApOworCQkJCXJlc3VsdCA9IGNmZ19kcml2ZXJfaW5mbyggdXJxLCBscCApOworCQkJCWJyZWFrOworCQkJY2FzZSBDRkdfRFJWX0lERU5USVRZOgorCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkludGVyY2VwdCBDRkdfRFJWX0lERU5USVRZXG4iICk7CisJCQkJcmVzdWx0ID0gY2ZnX2RyaXZlcl9pZGVudGl0eSggdXJxLCBscCApOworCQkJCWJyZWFrOworCQkJY2FzZSBDRkdfSUZCOgorCQkJCS8qIElGQiBjYW4gYmUgYSBzZWN1cml0eSBob2xlICovCisJCQkJaWYoICFjYXBhYmxlKCBDQVBfTkVUX0FETUlOICkpIHsKKwkJCQkJcmVzdWx0ID0gLUVQRVJNOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvKiBFbHNlIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCAqLworCisJCQljYXNlIENGR19GV19JREVOVElUWTogICAvLyBGb3IgSGVybWVzLTEsIHRoaXMgaXMgY2FjaGVkCisJCQlkZWZhdWx0OgorCisJCQkJLyogVmVyaWZ5IHRoZSB1c2VyIGJ1ZmZlciAqLworCQkJCXJlc3VsdCA9IHZlcmlmeV9hcmVhKCBWRVJJRllfV1JJVEUsIHVycS0+ZGF0YSwgdXJxLT5sZW4gKTsKKwkJCQlpZiggcmVzdWx0ICE9IDAgKSB7CisJCQkJCURCR19FUlJPUiggRGJnSW5mbywgInZlcmlmeV9hcmVhKCksIFZFUklGWV9XUklURSBGQUlMRURcbiIgKTsKKwkJCQkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogSWYgdGhlIHJlcXVlc3RlZCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBzaXplIG9mIG91ciBsb2NhbAorCQkJCSAgIExUViByZWNvcmQsIHRyeSB0byBhbGxvY2F0ZSBpdCBmcm9tIHRoZSBrZXJuZWwgc3RhY2suCisJCQkJICAgT3RoZXJ3aXNlLCB3ZSBqdXN0IHVzZSBvdXIgbG9jYWwgTFRWIHJlY29yZC4gKi8KKwkJCQlpZiggdXJxLT5sZW4gPiBzaXplb2YoIGxwLT5sdHZSZWNvcmQgKSkgeworCQkJCQlpZigoIHBMdHYgPSAobHR2X3QgKilrbWFsbG9jKCB1cnEtPmxlbiwgR0ZQX0tFUk5FTCApKSAhPSBOVUxMICkgeworCQkJCQkJbHR2QWxsb2NhdGVkID0gVFJVRTsKKworCQkJCQkJLyogQ29weSB0aGUgY29tbWFuZC9sZW5ndGggaW5mb3JtYXRpb24gaW50byB0aGUgbmV3IGJ1ZmZlci4gKi8KKwkJCQkJCW1lbWNweSggcEx0diwgJiggbHAtPmx0dlJlY29yZCApLCBzaXplb2YoIGhjZl8xNiApICogMiApOworCQkJCQl9IGVsc2UgeworCQkJCQkJdXJxLT5sZW4gPSBzaXplb2YoIGxwLT5sdHZSZWNvcmQgKTsKKwkJCQkJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9MRU47CisJCQkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJrbWFsbG9jIEZBSUxFRFxuIiApOworCQkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiVUlMX0VSUl9MRU5cbiIgKTsKKwkJCQkJCXJlc3VsdCA9IC1FTk9NRU07CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXBMdHYgPSAmKCBscC0+bHR2UmVjb3JkICk7CisJCQkJfQorCisgICAgCQkJCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCQkJCXVycS0+cmVzdWx0ID0gaGNmX2dldF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSBwTHR2ICk7CisgICAgCQkJCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwkJCQkvLyBDb3B5IHRoZSBMVFYgaW50byB0aGUgdXNlcidzIGJ1ZmZlci4KKwkJCQkvL2NvcHlfdG9fdXNlciggdXJxLT5kYXRhLCBwTHR2LCB1cnEtPmxlbiApOworCisJCQkJLy9pZiggbHR2QWxsb2NhdGVkICkKKwkJCQkvL3sKKwkJCQkvLyAgICBrZnJlZSggcEx0diApOworCQkJCS8vfQorCisJCQkJLy91cnEtPnJlc3VsdCA9IFVJTF9TVUNDRVNTOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBIYW5kbGUgZW5kaWFuIGNvbnZlcnNpb24gb2Ygc3BlY2lhbCBmaWVsZHMgKi8KKwkJCXN3aXRjaCggbHAtPmx0dlJlY29yZC50eXAgKSB7CisJCQkvKiBzaW1wbGUgaW50IGdldHMganVzdCBuZWVkIHRoZSBmaXJzdCBoY2ZfMTYgYnl0ZSBmbGlwcGVkICovCisJCQljYXNlIENGR19DTkZfUE9SVF9UWVBFOgorCQkJY2FzZSBDRkdfQ05GX09XTl9DSEFOTkVMOgorCQkJY2FzZSBDRkdfQ05GX09XTl9BVElNX1dJTkRPVzoKKwkJCWNhc2UgQ0ZHX0NORl9TWVNURU1fU0NBTEU6CisJCQljYXNlIENGR19DTkZfTUFYX0RBVEFfTEVOOgorCQkJY2FzZSBDRkdfQ05GX1BNX0VOQUJMRUQ6CisJCQljYXNlIENGR19DTkZfTUNBU1RfUlg6CisJCQljYXNlIENGR19DTkZfTUFYX1NMRUVQX0RVUkFUSU9OOgorCQkJY2FzZSBDRkdfQ05GX0hPTERPVkVSX0RVUkFUSU9OOgorCQkJY2FzZSBDRkdfQ05GX09XTl9EVElNX1BFUklPRDoKKwkJCWNhc2UgQ0ZHX0NORl9NQ0FTVF9QTV9CVUY6CisJCQljYXNlIENGR19DTkZfUkVKRUNUX0FOWToKKwkJCWNhc2UgQ0ZHX0NORl9FTkNSWVBUSU9OOgorCQkJY2FzZSBDRkdfQ05GX0FVVEhFTlRJQ0FUSU9OOgorCQkJY2FzZSBDRkdfQ05GX0VYQ0xfVU5FTkNSWVBURUQ6CisJCQljYXNlIENGR19DTkZfSU5UUkFfQlNTX1JFTEFZOgorCQkJY2FzZSBDRkdfQ05GX01JQ1JPX1dBVkU6CisJCQljYXNlIENGR19DTkZfTE9BRF9CQUxBTkNJTkc6CisJCQljYXNlIENGR19DTkZfTUVESVVNX0RJU1RSSUJVVElPTjoKKyNpZmRlZiBXQVJQCisJCQljYXNlIENGR19DTkZfVFhfUE9XX0xWTDoKKwkJCWNhc2UgQ0ZHX0NORl9DT05ORUNUSU9OX0NOVEw6CisJCQljYXNlIENGR19DTkZfT1dOX0JFQUNPTl9JTlRFUlZBTDogICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE93biBCZWFjb24gSW50ZXJ2YWwKKwkJCWNhc2UgQ0ZHX0NPRVhJU1RFTlNFX0JFSEFWSU9VUjogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29leGlzdGVuY2UgQmVoYXZpb3IKKwkJCS8vY2FzZSBDRkdfQ05GX1JYX0FMTF9HUk9VUF9BRERSRVNTOgorI2VuZGlmIC8vIEhFUk1FUzI1CisJCQljYXNlIENGR19DUkVBVEVfSUJTUzoKKwkJCWNhc2UgQ0ZHX1JUU19USFJIOgorCQkJY2FzZSBDRkdfUFJPTUlTQ1VPVVNfTU9ERToKKwkJCS8vY2FzZSBDRkdfV0FLRV9PTl9MQU46CisJCQljYXNlIENGR19SVFNfVEhSSDA6CisJCQljYXNlIENGR19SVFNfVEhSSDE6CisJCQljYXNlIENGR19SVFNfVEhSSDI6CisJCQljYXNlIENGR19SVFNfVEhSSDM6CisJCQljYXNlIENGR19SVFNfVEhSSDQ6CisJCQljYXNlIENGR19SVFNfVEhSSDU6CisJCQljYXNlIENGR19SVFNfVEhSSDY6CisJCQljYXNlIENGR19UWF9SQVRFX0NOVEwwOgorCQkJY2FzZSBDRkdfVFhfUkFURV9DTlRMMToKKwkJCWNhc2UgQ0ZHX1RYX1JBVEVfQ05UTDI6CisJCQljYXNlIENGR19UWF9SQVRFX0NOVEwzOgorCQkJY2FzZSBDRkdfVFhfUkFURV9DTlRMNDoKKwkJCWNhc2UgQ0ZHX1RYX1JBVEVfQ05UTDU6CisJCQljYXNlIENGR19UWF9SQVRFX0NOVEw2OgorCQkJY2FzZSBDRkdfVFhfS0VZX0lEOgorCQkJY2FzZSBDRkdfVElDS19USU1FOgorCQkJY2FzZSBDRkdfTUFYX0xPQURfVElNRToKKwkJCWNhc2UgQ0ZHX05JQ19URU1QX1RZUEU6CisJCQljYXNlIENGR19QT1JUX1NUQVQ6CisJCQljYXNlIENGR19DVVJfVFhfUkFURToKKwkJCWNhc2UgQ0ZHX0NVUl9CRUFDT05fSU5URVJWQUw6CisJCQljYXNlIENGR19QUk9UT0NPTF9SU1BfVElNRToKKwkJCWNhc2UgQ0ZHX0NVUl9TSE9SVF9SRVRSWV9MSU1JVDoKKwkJCWNhc2UgQ0ZHX0NVUl9MT05HX1JFVFJZX0xJTUlUOgorCQkJY2FzZSBDRkdfTUFYX1RYX0xJRkVUSU1FOgorCQkJY2FzZSBDRkdfTUFYX1JYX0xJRkVUSU1FOgorCQkJY2FzZSBDRkdfQ0ZfUE9MTEFCTEU6CisJCQljYXNlIENGR19QUklWQUNZX09QVF9JTVBMRU1FTlRFRDoKKwkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9SRU1PVEVfUkFURVM6CisJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfVVNFRF9SQVRFUzoKKwkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9TWVNURU1fU0NBTEU6CisJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfVFhfUkFURTE6CisJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfVFhfUkFURTI6CisJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfVFhfUkFURTM6CisJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfVFhfUkFURTQ6CisJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfVFhfUkFURTU6CisJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfVFhfUkFURTY6CisJCQljYXNlIENGR19QSFlfVFlQRToKKwkJCWNhc2UgQ0ZHX0NVUl9DSEFOTkVMOgorCQkJLy9jYXNlIENGR19DVVJSRU5UX1BPV0VSX1NUQVRFOgorCQkJLy9jYXNlIENGR19DQ0FNT0RFOgorCQkJLy8gICAgbHAtPmx0dlJlY29yZC51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzBdICk7CisJCQkvLyAgICBicmVhazsKKwkJCS8qIG5hbWUgc3RyaW5nIGdldHMganVzdCBuZWVkIHRoZSBmaXJzdCBoY2ZfMTYgYnl0ZSBmbGlwcGVkIChsZW5ndGggb2Ygc3RyaW5nKSAqLworCQkJY2FzZSBDRkdfQ05GX09XTl9TU0lEOgorCQkJY2FzZSBDRkdfQ05GX09XTl9OQU1FOgorCQkJLy9jYXNlIENORl9ERVNJUkVEX1NTSUQ6CisJCQljYXNlIENGR19ERVNJUkVEX1NTSUQ6CisJCQljYXNlIENGR19TQ0FOX1NTSUQ6CisJCQljYXNlIENGR19DVVJfU1NJRDoKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gKTsKKwkJCQlicmVhazsKKwkJCS8qIG5vbi1sZW5ndGggY291bnRlZCBzdHJpbmdzIG5lZWQgbm8gYnl0ZSBmbGlwcGluZyAqLworCQkJY2FzZSBDRkdfQ05GX09XTl9NQUNfQUREUjoKKwkJCS8qIHRoaXMgY2FzZSBpcyBubyBsb25nZXIgdmFsaWQ6IENGR19DTkZfV0RTX0FERFIgKi8KKwkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjE6CisJCQljYXNlIENGR19DTkZfV0RTX0FERFIyOgorCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSMzoKKwkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjQ6CisJCQljYXNlIENGR19DTkZfV0RTX0FERFI1OgorCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSNjoKKwkJCWNhc2UgQ0ZHX0dST1VQX0FERFI6CisJCQljYXNlIENGR19OSUNfU0VSSUFMX05VTUJFUjoKKwkJCWNhc2UgQ0ZHX0NVUl9CU1NJRDoKKwkJCWNhc2UgQ0ZHX05JQ19NQUNfQUREUjoKKwkJCWNhc2UgQ0ZHX1NVUFBPUlRFRF9EQVRBX1JBVEVTOiAgLyogbmVlZCB0byBlbnN1cmUgd2UgY2FuIHRyZWF0IHRoaXMgYXMgYSBzdHJpbmcgKi8KKwkJCQlicmVhazsKKwkJCS8vY2FzZSBDRkdfQ05GX0NPVU5UUllfSU5GTzogICAgICAvKiBzcGVjaWFsIGNhc2UsIHNlZSBwYWdlIDc1ICBvZiAwMjI0ODYsIFJldiBDLiAqLworCQkJLy9jYXNlIENGR19DVVJSRU5UX0NPVU5UUllfSU5GTzogIC8qIHNwZWNpYWwgY2FzZSwgc2VlIHBhZ2UgMTAxIG9mIDAyMjQ4NiwgUmV2IEMuICovCisJCQkvKgorCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlswXSApOworCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbM10gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlszXSApOworCisJCQkJZm9yKCBpID0gNDsgaSA8IGxwLT5sdHZSZWNvcmQubGVuOyBpKysgKSB7CisJCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbaV0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNltpXSApOworCQkJCX0KKwkJCQlicmVhazsKKwkJCSovCisKKwkJCWNhc2UgQ0ZHX0RFRkFVTFRfS0VZUzoKKwkJCQl7CisJCQkJCUNGR19ERUZBVUxUX0tFWVNfU1RSQ1QgKnBLZXlzID0gKENGR19ERUZBVUxUX0tFWVNfU1RSQ1QgKikmbHAtPmx0dlJlY29yZC51LnU4WzBdOworCisJCQkJCXBLZXlzWzBdLmxlbiA9IENOVl9JTlRfVE9fTElUVExFKCBwS2V5c1swXS5sZW4gKTsKKwkJCQkJcEtleXNbMV0ubGVuID0gQ05WX0lOVF9UT19MSVRUTEUoIHBLZXlzWzFdLmxlbiApOworCQkJCQlwS2V5c1syXS5sZW4gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEtleXNbMl0ubGVuICk7CisJCQkJCXBLZXlzWzNdLmxlbiA9IENOVl9JTlRfVE9fTElUVExFKCBwS2V5c1szXS5sZW4gKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIENGR19DTkZfTUNBU1RfUkFURToKKwkJCWNhc2UgQ0ZHX1RYX1JBVEVfQ05UTDoKKwkJCWNhc2UgQ0ZHX1NVUFBPUlRFRF9SQVRFX1NFVF9DTlRMOiAgICAvLyBTdXBwb3J0ZWQgUmF0ZSBTZXQgQ29udHJvbAorCQkJY2FzZSBDRkdfQkFTSUNfUkFURV9TRVRfQ05UTDogICAgLy8gQmFzaWMgUmF0ZSBTZXQgQ29udHJvbAorCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlswXSApOworCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMV0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlsxXSApOworCQkJCWJyZWFrOworCQkJY2FzZSBDRkdfRExfQlVGOgorCQkJY2FzZSBDRkdfTklDX0lERU5USVRZOgorCQkJY2FzZSBDRkdfQ09NTVNfUVVBTElUWToKKwkJCWNhc2UgQ0ZHX1BDRl9JTkZPOgorCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlswXSApOworCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMV0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlsxXSApOworCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMl0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlsyXSApOworCQkJCWJyZWFrOworCQkJY2FzZSBDRkdfRldfSURFTlRJVFk6CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzBdICk7CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlsxXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzFdICk7CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlsyXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzJdICk7CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlszXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzNdICk7CisJCQkJYnJlYWs7CisJCQkvL2Nhc2UgQ0ZHX0hTSV9TVVBfUkFOR0U6CisJCQljYXNlIENGR19OSUNfTUZJX1NVUF9SQU5HRToKKwkJCWNhc2UgQ0ZHX05JQ19DRklfU1VQX1JBTkdFOgorCQkJY2FzZSBDRkdfTklDX1BST0ZJTEU6CisJCQljYXNlIENGR19GV19TVVBfUkFOR0U6CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzBdICk7CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlsxXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzFdICk7CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlsyXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzJdICk7CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlszXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzNdICk7CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNls0XSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzRdICk7CisJCQkJYnJlYWs7CisJCQljYXNlIENGR19NRklfQUNUX1JBTkdFU19TVEE6CisJCQljYXNlIENGR19DRklfQUNUX1JBTkdFU19TVEE6CisJCQljYXNlIENGR19DVVJfU0NBTEVfVEhSSDoKKwkJCWNhc2UgQ0ZHX0FVVEhFTlRJQ0FUSU9OX0FMR09SSVRITVM6CisJCQkJZm9yKCBpID0gMDsgaSA8ICggbHAtPmx0dlJlY29yZC5sZW4gLSAxICk7IGkrKyApIHsKKwkJCQkJbHAtPmx0dlJlY29yZC51LnUxNltpXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2W2ldICk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJLyogZG9uZSBhdCBpbml0IHRpbWUsIGFuZCBlbmRpYW4gaGFuZGxlZCB0aGVuICovCisJCQljYXNlIENGR19QUklfSURFTlRJVFk6CisJCQkJYnJlYWs7CisJCQljYXNlIENGR19NQl9JTkZPOgorCQkJCS8vd3ZsYW5FbmRpYW5UcmFuc2xhdGVNYWlsYm94KCBwTHR2ICk7CisJCQkJYnJlYWs7CisJCQkvKiBNU0YgYW5kIEhDRiBSSURTICovCisJCQljYXNlIENGR19JRkI6CisJCQljYXNlIENGR19EUlZfSU5GTzoKKwkJCWNhc2UgQ0ZHX0FQX01PREU6CisJCQljYXNlIENGR19FTkNSWVBUX1NUUklORzoKKwkJCWNhc2UgQ0ZHX0NPVU5UUllfU1RSSU5HOgorCQkJY2FzZSBDRkdfRFJJVkVSX0VOQUJMRToKKwkJCWNhc2UgQ0ZHX1dPTEFTX0VOQUJMRToKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8vIENvcHkgdGhlIExUViBpbnRvIHRoZSB1c2VyJ3MgYnVmZmVyLgorCQkJY29weV90b191c2VyKCB1cnEtPmRhdGEsICYoIGxwLT5sdHZSZWNvcmQgKSwgdXJxLT5sZW4gKTsKKworCQkJaWYoIGx0dkFsbG9jYXRlZCApIHsKKwkJCQlrZnJlZSggJiggbHAtPmx0dlJlY29yZCApKTsKKwkJCX0KKworCQkJdXJxLT5yZXN1bHQgPSBVSUxfU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CisJCX0KKwl9IGVsc2UgeworCQlEQkdfRVJST1IoIERiZ0luZm8sICJVSUxfRVJSX1dST05HX0lGQlxuIiApOworCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfV1JPTkdfSUZCOworCX0KKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXN1bHQ7Cit9IC8vIHd2bGFuX3VpbF9nZXRfaW5mbworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJY2ZnX2RyaXZlcl9pbmZvKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUmV0cmlldmVzIGRyaXZlciBpbmZvcm1hdGlvbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHVycSAtIGEgcG9pbnRlciB0byB0aGUgVUlMIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgVUlMX1NVQ0NFU1MKKyAqICAgICAgVUlMX0VSUl94eHggdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBjZmdfZHJpdmVyX2luZm8oIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAiY2ZnX2RyaXZlcl9pbmZvIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisKKwkvKiBNYWtlIHN1cmUgdGhhdCB1c2VyIGJ1ZmZlciBjYW4gaGFuZGxlIHRoZSBkcml2ZXIgaW5mb3JtYXRpb24gYnVmZmVyICovCisJaWYoIHVycS0+bGVuIDwgc2l6ZW9mKCBscC0+ZHJpdmVySW5mbyApKSB7CisJCXVycS0+bGVuID0gc2l6ZW9mKCBscC0+ZHJpdmVySW5mbyApOworCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfTEVOOworCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBWZXJpZnkgdGhlIHVzZXIgYnVmZmVyLiAqLworCXJlc3VsdCA9IHZlcmlmeV9hcmVhKCBWRVJJRllfV1JJVEUsIHVycS0+ZGF0YSwgc2l6ZW9mKCBscC0+ZHJpdmVySW5mbyApKTsKKwlpZiggcmVzdWx0ICE9IDAgKSB7CisJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CisJCURCR19MRUFWRSggRGJnSW5mbyApOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCWxwLT5kcml2ZXJJbmZvLmNhcmRfc3RhdCA9IGxwLT5oY2ZDdHguSUZCX0NhcmRTdGF0OworCisJLy8gQ29weSB0aGUgZHJpdmVyIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIncyBidWZmZXIuCisJdXJxLT5yZXN1bHQgPSBVSUxfU1VDQ0VTUzsKKwljb3B5X3RvX3VzZXIoIHVycS0+ZGF0YSwgJiggbHAtPmRyaXZlckluZm8gKSwgc2l6ZW9mKCBscC0+ZHJpdmVySW5mbyApKTsKKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXN1bHQ7Cit9IC8vIGNmZ19kcml2ZXJfaW5mbworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCWNmZ19kcml2ZXJfaWRlbnRpdHkoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBSZXRyaWV2ZXMgSUQgaW5mb3JtYXRpb24gZnJvbSB0aGUgY2FyZC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHVycSAtIGEgcG9pbnRlciB0byB0aGUgVUlMIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgVUlMX1NVQ0NFU1MKKyAqICAgICAgVUlMX0VSUl94eHggdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBjZmdfZHJpdmVyX2lkZW50aXR5KCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50IHJlc3VsdCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggInd2bGFuX2RyaXZlcl9pZGVudGl0eSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCisJLyogTWFrZSBzdXJlIHRoYXQgdXNlciBidWZmZXIgY2FuIGhhbmRsZSB0aGUgZHJpdmVyIGlkZW50aXR5IHN0cnVjdHVyZS4gKi8KKwlpZiggdXJxLT5sZW4gPCBzaXplb2YoIGxwLT5kcml2ZXJJZGVudGl0eSApKSB7CisJCXVycS0+bGVuID0gc2l6ZW9mKCBscC0+ZHJpdmVySWRlbnRpdHkgKTsKKwkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX0xFTjsKKwkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogVmVyaWZ5IHRoZSB1c2VyIGJ1ZmZlci4gKi8KKwlyZXN1bHQgPSB2ZXJpZnlfYXJlYSggVkVSSUZZX1dSSVRFLCB1cnEtPmRhdGEsIHNpemVvZiggbHAtPmRyaXZlcklkZW50aXR5ICkpOworCWlmKCByZXN1bHQgIT0gMCApIHsKKwkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKKwkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogQ29weSB0aGUgZHJpdmVyIGlkZW50aXR5IGludG8gdGhlIHVzZXIncyBidWZmZXIuICovCisJdXJxLT5yZXN1bHQgPSBVSUxfU1VDQ0VTUzsKKwljb3B5X3RvX3VzZXIoIHVycS0+ZGF0YSwgJiggbHAtPmRyaXZlcklkZW50aXR5ICksIHNpemVvZiggbHAtPmRyaXZlcklkZW50aXR5ICkpOworCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJlc3VsdDsKK30gLy8gY2ZnX2RyaXZlcl9pZGVudGl0eQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisjZW5kaWYgIC8qIFVTRV9VSUwgKi8KKworCisvKiBJZiBXSVJFTEVTU19FWFQgaXMgbm90IGRlZmluZWQsIHRoZW4gdGhlIGZ1bmN0aW9ucyB0aGF0IGZvbGxvdyB3aWxsIG5vdCBiZQorICAgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLiAqLworLyogTk9URTogQXJlIHRoZXNlIHN0aWxsIGV2ZW4gbmVlZGVkPyAqLworI2lmZGVmIFdJUkVMRVNTX0VYVAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3dmxhbl9zZXRfbmV0bmFtZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFNldCB0aGUgRVNTSUQgb2YgdGhlIGNhcmQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSBhIHBvaW50ZXIgdG8gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd3ZsYW5fc2V0X25ldG5hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJICAgICAgY2hhciAqZXh0cmEpCit7CisgICAgICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid3ZsYW5fc2V0X25ldG5hbWUiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICAgICAgd2xfbG9jayhscCwgJmZsYWdzKTsKKworICAgICAgICBtZW1zZXQoIGxwLT5OZXR3b3JrTmFtZSwgMCwgc2l6ZW9mKCBscC0+TmV0d29ya05hbWUgKSk7CisgICAgICAgIG1lbWNweSggbHAtPk5ldHdvcmtOYW1lLCBleHRyYSwgd3JxdS0+ZGF0YS5sZW5ndGgpOworCisJLyogQ29tbWl0IHRoZSBhZGFwdGVyIHBhcmFtZXRlcnMgKi8KKwl3bF9hcHBseShscCk7CisgICAgICAgIHdsX3VubG9jayhscCwgJmZsYWdzKTsKKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHd2bGFuX3NldF9uZXRuYW1lCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd3ZsYW5fZ2V0X25ldG5hbWUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBHZXQgdGhlIEVTU0lEIG9mIHRoZSBjYXJkLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gYSBwb2ludGVyIHRvIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHd2bGFuX2dldF9uZXRuYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCSAgICAgIGNoYXIgKmV4dHJhKQoreworICAgICAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIGludCAgICAgICAgIHJldCA9IDA7CisgICAgICAgIGludCAgICAgICAgIHN0YXR1cyA9IC0xOworICAgICAgICB3dk5hbWVfdCAgICpwTmFtZTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgICAgICBEQkdfRlVOQyggInd2bGFuX2dldF9uZXRuYW1lIiApOworICAgICAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgICAgICB3bF9sb2NrKGxwLCAmZmxhZ3MpOworCisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBuZXR3b3JrIG5hbWUgKi8KKyAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gPSAxICsgKCBzaXplb2YoICpwTmFtZSApIC8gc2l6ZW9mKCBoY2ZfMTYgKSk7CisgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NVUl9TU0lEOworCisgICAgICAgIHN0YXR1cyA9IGhjZl9nZXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisgICAgICAgIGlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisgICAgICAgICAgICAgICAgcE5hbWUgPSAod3ZOYW1lX3QgKikmKCBscC0+bHR2UmVjb3JkLnUudTMyICk7CisKKwkJbWVtc2V0KGV4dHJhLCAnXDAnLCBIQ0ZfTUFYX05BTUVfTEVOKTsKKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSBwTmFtZS0+bGVuZ3RoOworCisgICAgICAgICAgICAgICAgbWVtY3B5KGV4dHJhLCBwTmFtZS0+bmFtZSwgcE5hbWUtPmxlbmd0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ID0gLUVGQVVMVDsKKwl9CisKKyAgICAgICAgd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCisgICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgICAgICByZXR1cm4gcmV0OworfSAvLyB3dmxhbl9nZXRfbmV0bmFtZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXd2bGFuX3NldF9zdGF0aW9uX25pY2tuYW1lKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgU2V0IHRoZSBjYXJkJ3Mgc3RhdGlvbiBuaWNrbmFtZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIGEgcG9pbnRlciB0byB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3dmxhbl9zZXRfc3RhdGlvbl9uaWNrbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkgICAgICBjaGFyICpleHRyYSkKK3sKKyAgICAgICAgc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICBpbnQgICAgICAgICByZXQgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgICAgIERCR19GVU5DKCAid3ZsYW5fc2V0X3N0YXRpb25fbmlja25hbWUiICk7CisgICAgICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgICAgIHdsX2xvY2sobHAsICZmbGFncyk7CisKKyAgICAgICAgbWVtc2V0KCBscC0+U3RhdGlvbk5hbWUsIDAsIHNpemVvZiggbHAtPlN0YXRpb25OYW1lICkpOworCisgICAgICAgIG1lbWNweSggbHAtPlN0YXRpb25OYW1lLCBleHRyYSwgd3JxdS0+ZGF0YS5sZW5ndGgpOworCisgICAgICAgIC8qIENvbW1pdCB0aGUgYWRhcHRlciBwYXJhbWV0ZXJzICovCisgICAgICAgIHdsX2FwcGx5KCBscCApOworICAgICAgICB3bF91bmxvY2sobHAsICZmbGFncyk7CisKKyAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgICAgIHJldHVybiByZXQ7Cit9IC8vIHd2bGFuX3NldF9zdGF0aW9uX25pY2tuYW1lCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd3ZsYW5fZ2V0X3N0YXRpb25fbmlja25hbWUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBHZXQgdGhlIGNhcmQncyBzdGF0aW9uIG5pY2tuYW1lLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gYSBwb2ludGVyIHRvIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHd2bGFuX2dldF9zdGF0aW9uX25pY2tuYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCSAgICAgIGNoYXIgKmV4dHJhKQoreworICAgICAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50ICAgICAgICAgcmV0ID0gMDsKKwlpbnQgICAgICAgICBzdGF0dXMgPSAtMTsKKwl3dk5hbWVfdCAgICpwTmFtZTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgICAgICBEQkdfRlVOQyggInd2bGFuX2dldF9zdGF0aW9uX25pY2tuYW1lIiApOworICAgICAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgICAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHN0YXRpb24gbmFtZSAqLworICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiA9IDEgKyAoIHNpemVvZiggKnBOYW1lICkgLyBzaXplb2YoIGhjZl8xNiApKTsKKyAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ05GX09XTl9OQU1FOworCisgICAgICAgIHN0YXR1cyA9IGhjZl9nZXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisgICAgICAgIGlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisgICAgICAgICAgICAgICAgcE5hbWUgPSAod3ZOYW1lX3QgKikmKCBscC0+bHR2UmVjb3JkLnUudTMyICk7CisKKwkJbWVtc2V0KGV4dHJhLCAnXDAnLCBIQ0ZfTUFYX05BTUVfTEVOKTsKKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSBwTmFtZS0+bGVuZ3RoOworCQltZW1jcHkoZXh0cmEsIHBOYW1lLT5uYW1lLCBwTmFtZS0+bGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSAtRUZBVUxUOworICAgICAgICB9CisKKyAgICAgICAgd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCisvL291dDoKKyAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd3ZsYW5fZ2V0X3N0YXRpb25fbmlja25hbWUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3dmxhbl9zZXRfcG9ydHR5cGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBTZXQgdGhlIGNhcmQncyBwb3J0dHlwZQorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gYSBwb2ludGVyIHRvIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHd2bGFuX3NldF9wb3J0dHlwZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkgICAgICBjaGFyICpleHRyYSkKK3sKKyAgICAgICAgc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICBpbnQgICAgIHJldCA9IDA7CisJaGNmXzE2ICBwb3J0VHlwZTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgICAgICBEQkdfRlVOQyggInd2bGFuX3NldF9wb3J0dHlwZSIgKTsKKyAgICAgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICAgICAgd2xfbG9jayhscCwgJmZsYWdzKTsKKworICAgICAgICAvKiBWYWxpZGF0ZSB0aGUgbmV3IHZhbHVlICovCisgICAgICAgIHBvcnRUeXBlID0gKigoX191MzIgKilleHRyYSk7CisKKyAgICAgICAgaWYoICEoKCBwb3J0VHlwZSA9PSAxICkgfHwgKCBwb3J0VHlwZSA9PSAzICkpKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfdW5sb2NrOworICAgICAgICB9CisKKyAgICAgICAgbHAtPlBvcnRUeXBlID0gcG9ydFR5cGU7CisKKyAgICAgICAgLyogQ29tbWl0IHRoZSBhZGFwdGVyIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgd2xfYXBwbHkoIGxwICk7CisKK291dF91bmxvY2s6CisgICAgICAgIHdsX3VubG9jayhscCwgJmZsYWdzKTsKKworLy9vdXQ6CisgICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgICAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3dmxhbl9nZXRfcG9ydHR5cGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBHZXQgdGhlIGNhcmQncyBwb3J0dHlwZQorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gYSBwb2ludGVyIHRvIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHd2bGFuX2dldF9wb3J0dHlwZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkgICAgICBjaGFyICpleHRyYSkKK3sKKyAgICAgICAgc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICBpbnQgICAgIHJldCA9IDA7CisgICAgICAgIGludCAgICAgc3RhdHVzID0gLTE7CisgICAgICAgIGhjZl8xNiAgKnBQb3J0VHlwZTsKKyAgICAgICAgX191MzIgKnBEYXRhID0gKF9fdTMyICopZXh0cmE7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICAgICAgREJHX0ZVTkMoICJ3dmxhbl9nZXRfcG9ydHR5cGUiICk7CisgICAgICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgcG9ydCB0eXBlICovCisgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuID0gMSArICggc2l6ZW9mKCAqcFBvcnRUeXBlICkgLyBzaXplb2YoIGhjZl8xNiApKTsKKyAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ05GX1BPUlRfVFlQRTsKKworICAgICAgICBzdGF0dXMgPSBoY2ZfZ2V0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworICAgICAgICBpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworICAgICAgICAgICAgICAgIHBQb3J0VHlwZSA9IChoY2ZfMTYgKikmKCBscC0+bHR2UmVjb3JkLnUudTMyICk7CisKKyAgICAgICAgICAgICAgICAqcERhdGEgPSBDTlZfTElUVExFX1RPX0lOVCggKnBQb3J0VHlwZSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gLUVGQVVMVDsKKwl9CisKKyAgICAgICAgd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCisvL291dDoKKyAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgICAgIHJldHVybiByZXQ7Cit9IC8vIHd2bGFuX2dldF9wb3J0dHlwZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2VuZGlmICAvLyBXSVJFTEVTU19FWFQKKworCisKKworI2lmZGVmIFVTRV9SVFMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3dmxhbl9ydHMoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBJT0NUTCBoYW5kbGVyIGZvciBSVFMgY29tbWFuZHMKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHJycSAtIGEgcG9pbnRlciB0byB0aGUgcnRzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd3ZsYW5fcnRzKCBzdHJ1Y3QgcnRzcmVxICpycnEsIF9fdTMyIGlvX2Jhc2UgKQoreworCWludCBpb2N0bF9yZXQgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3dmxhbl9ydHMiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKworCURCR19QUklOVCggImlvX2Jhc2U6IDB4JTA4eFxuIiwgaW9fYmFzZSApOworCisJc3dpdGNoKCBycnEtPnR5cCApIHsKKwkgIGNhc2UgV0xfSU9DVExfUlRTX1JFQUQ6CisJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9SVFMgLS0gV0xfSU9DVExfUlRTX1JFQURcbiIpOworCQlycnEtPmRhdGFbMF0gPSBJTl9QT1JUX1dPUkQoIGlvX2Jhc2UgKyBycnEtPnJlZyApOworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIgIHJlZyAweCUwNHggPT0+IDB4JTA0eFxuIiwgcnJxLT5yZWcsIENOVl9MSVRUTEVfVE9fU0hPUlQoIHJycS0+ZGF0YVswXSApICk7CisJCWJyZWFrOworCSAgY2FzZSBXTF9JT0NUTF9SVFNfV1JJVEU6CisJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9SVFMgLS0gV0xfSU9DVExfUlRTX1dSSVRFXG4iKTsKKwkJT1VUX1BPUlRfV09SRCggaW9fYmFzZSArIHJycS0+cmVnLCBycnEtPmRhdGFbMF0gKTsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiICByZWcgMHglMDR4IDw9PSAweCUwNHhcbiIsIHJycS0+cmVnLCBDTlZfTElUVExFX1RPX1NIT1JUKCBycnEtPmRhdGFbMF0gKSApOworCQlicmVhazsKKwkgIGNhc2UgV0xfSU9DVExfUlRTX0JBVENIX1JFQUQ6CisJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9SVFMgLS0gV0xfSU9DVExfUlRTX0JBVENIX1JFQURcbiIpOworCQlJTl9QT1JUX1NUUklOR18xNiggaW9fYmFzZSArIHJycS0+cmVnLCBycnEtPmRhdGEsIHJycS0+bGVuICk7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiAgcmVnIDB4JTA0eCA9PT4gJWQgYnl0ZXNcbiIsIHJycS0+cmVnLCBycnEtPmxlbiAqIHNpemVvZiAoX191MTYgKSApOworCQlicmVhazsKKwkgIGNhc2UgV0xfSU9DVExfUlRTX0JBVENIX1dSSVRFOgorCQlEQkdfVFJBQ0UoRGJnSW5mbywgIklPQ1RMOiBXVkxBTjJfSU9DVExfUlRTIC0tIFdMX0lPQ1RMX1JUU19CQVRDSF9XUklURVxuIik7CisJCU9VVF9QT1JUX1NUUklOR18xNiggaW9fYmFzZSArIHJycS0+cmVnLCBycnEtPmRhdGEsIHJycS0+bGVuICk7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiAgcmVnIDB4JTA0eCA8PT0gJWQgYnl0ZXNcbiIsIHJycS0+cmVnLCBycnEtPmxlbiAqIHNpemVvZiAoX191MTYpICk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisKKwkJREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTDogV1ZMQU4yX0lPQ1RMX1JUUyAtLSBVTlNVUFBPUlRFRCBSVFMgQ09ERTogMHglWCIsIHJycS0+dHlwICk7CisJCWlvY3RsX3JldCA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKwl9CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gaW9jdGxfcmV0OworfSAvLyB3dmxhbl9ydHMKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNlbmRpZiAgLyogVVNFX1JUUyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcHJpdi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMDI1NDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wcml2LmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBIZWFkZXIgZGVzY3JpYmluZyBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgdGhlIHByaXZhdGUgSU9DVEwgaGFuZGxlcnMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1dMX1BSSVZfSF9fCisjZGVmaW5lIF9fV0xfUFJJVl9IX18KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBmdW5jdGlvbiBwcm90b3R5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJUkVMRVNTX0VYVAorCisKK2ludCB3dmxhbl9zZXRfbmV0bmFtZSggc3RydWN0IG5ldF9kZXZpY2UgKiwgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKiwgdW5pb24gaXdyZXFfZGF0YSAqLCBjaGFyICpleHRyYSApOworCitpbnQgd3ZsYW5fZ2V0X25ldG5hbWUoIHN0cnVjdCBuZXRfZGV2aWNlICosICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICosIHVuaW9uIGl3cmVxX2RhdGEgKiwgY2hhciAqZXh0cmEgKTsKKworaW50IHd2bGFuX3NldF9zdGF0aW9uX25pY2tuYW1lKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqLCB1bmlvbiBpd3JlcV9kYXRhICosIGNoYXIgKmV4dHJhICk7CisKK2ludCB3dmxhbl9nZXRfc3RhdGlvbl9uaWNrbmFtZSggc3RydWN0IG5ldF9kZXZpY2UgKiwgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKiwgdW5pb24gaXdyZXFfZGF0YSAqLCBjaGFyICpleHRyYSApOworCitpbnQgd3ZsYW5fc2V0X3BvcnR0eXBlKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqLCB1bmlvbiBpd3JlcV9kYXRhICosIGNoYXIgKmV4dHJhICk7CisKK2ludCB3dmxhbl9nZXRfcG9ydHR5cGUoIHN0cnVjdCBuZXRfZGV2aWNlICosICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICosIHVuaW9uIGl3cmVxX2RhdGEgKiwgY2hhciAqZXh0cmEgKTsKKworCisjZW5kaWYgIC8vIFdJUkVMRVNTX0VYVAorCisKKworCisjaWZkZWYgVVNFX1VJTAorCitpbnQgd3ZsYW5fdWlsKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCisvLyBpbnQgd3ZsYW5fdWlsX2Nvbm5lY3QoIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisvLyBpbnQgd3ZsYW5fdWlsX2Rpc2Nvbm5lY3QoIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisvLyBpbnQgd3ZsYW5fdWlsX2FjdGlvbiggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKy8vIGludCB3dmxhbl91aWxfYmxvY2soIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisvLyBpbnQgd3ZsYW5fdWlsX3VuYmxvY2soIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisvLyBpbnQgd3ZsYW5fdWlsX3NlbmRfZGlhZ19tc2coIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisvLyBpbnQgd3ZsYW5fdWlsX3B1dF9pbmZvKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworLy8gaW50IHd2bGFuX3VpbF9nZXRfaW5mbyggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworLy9pbnQgY2ZnX2RyaXZlcl9pbmZvKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworLy9pbnQgY2ZnX2RyaXZlcl9pZGVudGl0eSggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworI2VuZGlmICAvLyBVU0VfVUlMCisKKworI2lmZGVmIFVTRV9SVFMKKworaW50IHd2bGFuX3J0cyggc3RydWN0IHJ0c3JlcSAqcnJxLCBfX3UzMiBpb19iYXNlICk7CitpbnQgd3ZsYW5fcnRzX3JlYWQoIF9fdTE2IHJlZywgX191MTYgKnZhbCwgX191MzIgaW9fYmFzZSApOworaW50IHd2bGFuX3J0c193cml0ZSggX191MTYgcmVnLCBfX3UxNiB2YWwsIF9fdTMyIGlvX2Jhc2UgKTsKK2ludCB3dmxhbl9ydHNfYmF0Y2hfcmVhZCggc3RydWN0IHJ0c3JlcSAqcnJxLCBfX3UzMiBpb19iYXNlICk7CitpbnQgd3ZsYW5fcnRzX2JhdGNoX3dyaXRlKCBzdHJ1Y3QgcnRzcmVxICpycnEsIF9fdTMyIGlvX2Jhc2UgKTsKKworI2VuZGlmICAvLyBVU0VfUlRTCisKKworI2VuZGlmICAvLyBfX1dMX1BSSVZfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wcm9maWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wcm9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE1ZjAyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3Byb2ZpbGUuYwpAQCAtMCwwICsxLDExMTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBUaGlzIGZpbGUgZGVmaW5lcyByb3V0aW5lcyByZXF1aXJlZCB0byBwYXJzZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAqICAgbGlzdGVkIGluIGEgY29uZmlnIGZpbGUsIGlmIHRoYXQgY29uZmlnIGZpbGUgZXhpc3RzLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE9ubHkgaW5jbHVkZSB0aGlzIGZpbGUgaWYgVVNFX1BST0ZJTEUgaXMgZGVmaW5lZCAqLworI2lmZGVmIFVTRV9QUk9GSUxFCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgY29uc3RhbnQgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogQWxsb3cgc3VwcG9ydCBmb3IgY2FsbGluZyBzeXN0ZW0gZmNucyB0byBwYXJzZSBjb25maWcgZmlsZSAqLworI2RlZmluZSBfX0tFUk5FTF9TWVNDQUxMU19fCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPHdsX3ZlcnNpb24uaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2RlZmluZSBCSU5fREwgMQorCisjaW5jbHVkZSA8ZGVidWcuaD4KKyNpbmNsdWRlIDxoY2YuaD4KKy8vI2luY2x1ZGUgPGhjZmRlZi5oPgorCisjaW5jbHVkZSA8d2xfaWYuaD4KKyNpbmNsdWRlIDx3bF9pbnRlcm5hbC5oPgorI2luY2x1ZGUgPHdsX3V0aWwuaD4KKyNpbmNsdWRlIDx3bF9lbmMuaD4KKyNpbmNsdWRlIDx3bF9tYWluLmg+CisjaW5jbHVkZSA8d2xfcHJvZmlsZS5oPgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnbG9iYWwgdmFyaWFibGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEZWZpbml0aW9uIG5lZWRlZCB0byBwcmV2ZW50IHVucmVzb2x2ZWQgZXh0ZXJuYWwgaW4gdW5pc3RkLmggKi8KK3N0YXRpYyBpbnQgZXJybm87CisKKyNpZiBEQkcKK2V4dGVybiBwX3UzMiAgICBEZWJ1Z0ZsYWc7CitleHRlcm4gZGJnX2luZm9fdCAqRGJnSW5mbzsKKyNlbmRpZgorCitpbnQgcGFyc2VfeWVzX25vKCBjaGFyKiB2YWx1ZSApOworCisKK2ludCBwYXJzZV95ZXNfbm8oIGNoYXIqIHZhbHVlICkgeworaW50IHJjID0gMDsJCQkJCQkJCQkJLy9kZWZhdWx0IHRvIE5PIGZvciBpbnZhbGlkIHBhcmFtZXRlcnMKKworCWlmICggc3RybGVuKCB2YWx1ZSApID09IDEgKSB7CisJCWlmICggKCB2YWx1ZVswXSB8ICgnWSdeJ3knKSApID09ICd5JyApIHJjID0gMTsKKy8vCX0gZWxzZSB7CisvLwkJdGhpcyBzaG91bGQgbm90IGJlIGRlYnVnIHRpbWUgaW5mbywgaXQgaXMgYW4gZW5kdXNlciBkYXRhIGVudHJ5IGVycm9yIDs/CisvLwkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9NSUNST1dBVkVfUk9CVVNUTkVTUyApOworCX0KKwlyZXR1cm4gcmM7Cit9IC8vIHBhcnNlX3llc19ubworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglwYXJzZV9jb25maWcoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBkZXZpY2UncyBjb25maWcgZmlsZSBhbmQgcGFyc2VzIHRoZSBvcHRpb25zIGZyb20KKyAqICAgaXQsIHNvIHRoYXQgaXQgY2FuIHByb3Blcmx5IGNvbmZpZ3VyZSBpdHNlbGYuIElmIG5vIGNvbmZpZ3VyYXRpb24gZmlsZQorICogICBvciBjb25maWd1cmF0aW9uIGlzIHByZXNlbnQsIHRoZW4gY29udGludWUgdG8gdXNlIHRoZSBvcHRpb25zIGFscmVhZHkKKyAqICAgcGFyc2VkIGZyb20gY29uZmlnLm9wdHMgb3Igd2lyZWxlc3Mub3B0cy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBhcnNlX2NvbmZpZyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJaW50CQkJCSAgICBmaWxlX2Rlc2M7CisjaWYgMCAvLyBCSU5fREwKKwlpbnQgCSAJCQlyYzsKKwljaGFyCQkJCSpjcCA9IE5VTEw7CisjZW5kaWYgLy8gQklOX0RMCisJY2hhciAgICAgICAgICAgICAgICBidWZmZXJbTUFYX0xJTkVfU0laRV07CisJY2hhciAgICAgICAgICAgICAgICBmaWxlbmFtZVtNQVhfTElORV9TSVpFXTsKKwltbV9zZWdtZW50X3QJICAgIGZzOworCXN0cnVjdCB3bF9wcml2YXRlICAgKnd2bGFuX2NvbmZpZyA9IE5VTEw7CisJRU5DU1RSQ1QgICAgICAgICAgICBzRW5jcnlwdGlvbjsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlEQkdfRlVOQyggInBhcnNlX2NvbmZpZyIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCS8qIEdldCB0aGUgd2F2ZWxhbiBzcGVjaWZpYyBpbmZvIGZvciB0aGlzIGRldmljZSAqLworCXd2bGFuX2NvbmZpZyA9IChzdHJ1Y3Qgd2xfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwlpZiAoIHd2bGFuX2NvbmZpZyA9PSBOVUxMICkgeworCQlEQkdfRVJST1IoIERiZ0luZm8sICJXYXZlbGFuIHNwZWNpZmljIGluZm8gc3RydWN0IG5vdCBwcmVzZW50P1xuIiApOworCQlyZXR1cm47CisJfQorCisJLyogc2V0dXAgdGhlIGRlZmF1bHQgZW5jcnlwdGlvbiBzdHJpbmcgKi8KKwlzdHJjcHkoIHd2bGFuX2NvbmZpZy0+c3pFbmNyeXB0aW9uLCBERUZfQ1JZUFRfU1RSICk7CisKKwkvKiBPYnRhaW4gYSB1c2VyLXNwYWNlIHByb2Nlc3MgY29udGV4dCwgc3RvcmluZyB0aGUgb3JpZ2luYWwgY29udGV4dCAqLworCWZzID0gZ2V0X2ZzKCApOworCXNldF9mcyggZ2V0X2RzKCApKTsKKworCS8qIERldGVybWluZSB0aGUgZmlsZW5hbWUgZm9yIHRoaXMgZGV2aWNlIGFuZCBhdHRlbXB0IHRvIG9wZW4gaXQgKi8KKwlzcHJpbnRmKCBmaWxlbmFtZSwgIiVzJXMiLCBST09UX0NPTkZJR19GSUxFTkFNRSwgZGV2LT5uYW1lICk7CisJZmlsZV9kZXNjID0gb3BlbiggZmlsZW5hbWUsIE9fUkRPTkxZLCAwICk7CisJaWYgKCBmaWxlX2Rlc2MgIT0gLTEgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIldpcmVsZXNzIGNvbmZpZyBmaWxlIGZvdW5kLiBQYXJzaW5nIG9wdGlvbnMuLi5cbiIgKTsKKworCQkvKiBSZWFkIG91dCB0aGUgb3B0aW9ucyAqLworCQl3aGlsZSggcmVhZGxpbmUoIGZpbGVfZGVzYywgYnVmZmVyICkpIHsKKwkJCXRyYW5zbGF0ZV9vcHRpb24oIGJ1ZmZlciwgd3ZsYW5fY29uZmlnICk7CisJCX0KKwkJLyogQ2xvc2UgdGhlIGZpbGUgKi8KKwkJY2xvc2UoIGZpbGVfZGVzYyApOwkvLzs/ZXZlbiBpZiBmaWxlX2Rlc2MgPT0gLTEgPz8/CisJfSBlbHNlIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTm8gaXdjb25maWcgZmlsZSBmb3VuZCBmb3IgdGhpcyBkZXZpY2U7ICIKKwkJCQkgICAiY29uZmlnLm9wdHMgb3Igd2lyZWxlc3Mub3B0cyB3aWxsIGJlIHVzZWRcbiIgKTsKKwl9CisJLyogUmV0dXJuIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0ICovCisJc2V0X2ZzKCBmcyApOworCisJLyogY29udmVydCB0aGUgV0VQIGtleXMsIGlmIHJlYWQgaW4gYXMga2V5MSwga2V5MiwgdHlwZSBvZiBkYXRhICovCisJaWYgKCB3dmxhbl9jb25maWctPkVuYWJsZUVuY3J5cHRpb24gKSB7CisJCW1lbXNldCggJnNFbmNyeXB0aW9uLCAwLCBzaXplb2YoIHNFbmNyeXB0aW9uICkpOworCisJCXdsX3dlcF9kZWNvZGUoIENSWVBUX0NPREUsICZzRW5jcnlwdGlvbiwKKwkJCQkJCSAgIHd2bGFuX2NvbmZpZy0+c3pFbmNyeXB0aW9uICk7CisKKwkJLyogdGhlIExpbnV4IGRyaXZlciBsaWtlcyB0byB1c2UgMS00IGZvciB0aGUga2V5IElEcywgYW5kIHRoZW4KKwkJICAgY29udmVydCB0byAwLTMgd2hlbiBzZW5kaW5nIHRvIHRoZSBjYXJkLiAgVGhlIFdpbmRvd3MgY29kZQorCQkgICBiYXNlIHVzZWQgMC0zIGluIHRoZSBBUEkgRExMLCB3aGljaCB3YXMgcG9ydGVkIHRvIExpbnV4LiAgRm9yCisJCSAgIHRoZSBzYWtlIG9mIHRoZSB1c2VyIGV4cGVyaWVuY2UsIHdlIGRlY2lkZWQgdG8ga2VlcCAwLTMgYXMgdGhlCisJCSAgIG51bWJlcnMgdXNlZCBpbiB0aGUgRExMOyBhbmQgd2lsbCBwZXJmb3JtIHRoZSArMSBjb252ZXJzaW9uIGhlcmUuCisJCSAgIFdlIGNvdWxkIGhhdmUgY29udmVydGVkICB0aGUgZW50aXJlIExpbnV4IGRyaXZlciwgYnV0IHRoaXMgaXMKKwkJICAgbGVzcyBvYnRydXNpdmUuICBUaGlzIG1heSBiZSBhICJ0b2RvIiB0byBjb252ZXJ0IHRoZSB3aG9sZSBkcml2ZXIgKi8KKwkJc0VuY3J5cHRpb24ud0VuYWJsZWQgPSB3dmxhbl9jb25maWctPkVuYWJsZUVuY3J5cHRpb247CisJCXNFbmNyeXB0aW9uLndUeEtleUlEID0gd3ZsYW5fY29uZmlnLT5UcmFuc21pdEtleUlEIC0gMTsKKworCQltZW1jcHkoICZzRW5jcnlwdGlvbi5FbmNTdHIsICZ3dmxhbl9jb25maWctPkRlZmF1bHRLZXlzLAorCQkJCXNpemVvZiggQ0ZHX0RFRkFVTFRfS0VZU19TVFJDVCApKTsKKworCQltZW1zZXQoIHd2bGFuX2NvbmZpZy0+c3pFbmNyeXB0aW9uLCAwLCBzaXplb2YoIHd2bGFuX2NvbmZpZy0+c3pFbmNyeXB0aW9uICkpOworCisJCXdsX3dlcF9jb2RlKCBDUllQVF9DT0RFLCB3dmxhbl9jb25maWctPnN6RW5jcnlwdGlvbiwgJnNFbmNyeXB0aW9uLAorCQkJCQkJIHNpemVvZiggc0VuY3J5cHRpb24gKSk7CisJfQorCisJLyogZGVjb2RlIHRoZSBlbmNyeXB0aW9uIHN0cmluZyBmb3IgdGhlIGNhbGwgdG8gd2xfY29tbWl0KCkgKi8KKwl3bF93ZXBfZGVjb2RlKCBDUllQVF9DT0RFLCAmc0VuY3J5cHRpb24sIHd2bGFuX2NvbmZpZy0+c3pFbmNyeXB0aW9uICk7CisKKwl3dmxhbl9jb25maWctPlRyYW5zbWl0S2V5SUQgICAgPSBzRW5jcnlwdGlvbi53VHhLZXlJRCArIDE7CisJd3ZsYW5fY29uZmlnLT5FbmFibGVFbmNyeXB0aW9uID0gc0VuY3J5cHRpb24ud0VuYWJsZWQ7CisKKwltZW1jcHkoICZ3dmxhbl9jb25maWctPkRlZmF1bHRLZXlzLCAmc0VuY3J5cHRpb24uRW5jU3RyLAorCQkJc2l6ZW9mKCBDRkdfREVGQVVMVF9LRVlTX1NUUkNUICkpOworCisjaWYgMCAvL0JJTl9ETAorCQkvKiBPYnRhaW4gYSB1c2VyLXNwYWNlIHByb2Nlc3MgY29udGV4dCwgc3RvcmluZyB0aGUgb3JpZ2luYWwgY29udGV4dCAqLworCQlmcyA9IGdldF9mcyggKTsKKwkJc2V0X2ZzKCBnZXRfZHMoICkpOworCisJCS8vOz9qdXN0IHRvIGZha2Ugc29tZXRoaW5nCisJCXN0cmNweSgvKnd2bGFuX2NvbmZpZy0+ZndfaW1hZ2VfKi9maWxlbmFtZSwgIi9ldGMvYWdlcmUvZncuYmluIiApOworCQlmaWxlX2Rlc2MgPSBvcGVuKCAvKnd2bGFuX2NvbmZpZy0+ZndfaW1hZ2VfKi9maWxlbmFtZSwgMCwgMCApOworCQlpZiAoIGZpbGVfZGVzYyA9PSAtMSApIHsKKwkJCURCR19FUlJPUiggRGJnSW5mbywgIk5vIGltYWdlIGZpbGUgZm91bmRcbiIgKTsKKwkJfSBlbHNlIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIkYvVyBpbWFnZSBmaWxlIGZvdW5kXG4iICk7CisjZGVmaW5lIERIRl9BTExPQ19TSVpFIDk2MDAwCQkJLy9qdXN0IGJlbG93IDk2SywgbGV0J3MgaG9wZSBpdCBzdWZmaWNlcyBmb3Igbm93IGFuZCBmb3IgdGhlIGZ1dHVyZQorCQkJY3AgPSAoY2hhciopdm1hbGxvYyggREhGX0FMTE9DX1NJWkUgKTsKKwkJCWlmICggY3AgPT0gTlVMTCApIHsKKwkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJlcnJvciBpbiB2bWFsbG9jXG4iICk7CisJCQl9IGVsc2UgeworCQkJCXJjID0gcmVhZCggZmlsZV9kZXNjLCBjcCwgREhGX0FMTE9DX1NJWkUgKTsKKwkJCQlpZiAoIHJjID09IERIRl9BTExPQ19TSVpFICkgeworCQkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJidWZmZXIgdG9vIHNtYWxsLCAlZFxuIiwgREhGX0FMTE9DX1NJWkUgKTsKKwkJCQl9IGVsc2UgaWYgKCByYyA+IDAgKSB7CisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgInJlYWQgTy5LLjogJWQgYnl0ZXMgICUuMTJzXG4iLCByYywgY3AgKTsKKwkJCQkJcmMgPSByZWFkKCBmaWxlX2Rlc2MsICZjcFtyY10sIDEgKTsKKwkJCQkJaWYgKCByYyA9PSAwICkgeworCQkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAibm8gbW9yZSB0byByZWFkXG4iICk7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCByYyAhPSAwICkgeworCQkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJmaWxlIG5vdCByZWFkIGluIG9uZSBzd29vcCBvciBvdGhlciBlcnJvciJcCisJCQkJCQkJCQkJIiwgZ2l2ZSB1cCwgdG9vIGNvbXBsaWNhdGVkLCByYyA9ICUwWFxuIiwgcmMgKTsKKwkJCQl9CisJCQkJdmZyZWUoIGNwICk7CisJCQl9CisJCQljbG9zZSggZmlsZV9kZXNjICk7CisJCX0KKwkJc2V0X2ZzKCBmcyApOwkJCS8qIFJldHVybiB0byB0aGUgb3JpZ2luYWwgY29udGV4dCAqLworI2VuZGlmIC8vIEJJTl9ETAorCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuOworfSAvLyBwYXJzZV9jb25maWcKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXJlYWRsaW5lKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyBpbiBkYXRhIGZyb20gYSBnaXZlbiBmaWxlIG9uZSBsaW5lIGF0IGEgdGltZSwKKyAqICAgY29udmVydGluZyB0aGUgZGV0ZWN0ZWQgbmV3bGluZSBjaGFyYWN0ZXIgJ1xuJyB0byBhIG51bGwgJ1wwJy4gTm90ZSB0aGF0CisgKiAgIHRoZSBmaWxlIGRlc2NyaXB0b3IgbXVzdCBiZSB2YWxpZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZmlsZWRlc2MgICAgLSB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgb3BlbiBjb25maWd1cmF0aW9uIGZpbGUKKyAqICAgICAgYnVmZmVyICAgICAgLSBhIGJ1ZmZlciBwb2ludGVyLCBwYXNzZWQgaW4gYnkgdGhlIGNhbGxlciwgdG8gd2hpY2ggdGhlCisgKiAgICAgICAgICAgICAgICAgICAgbGluZSB3aWxsIGJlIHN0b3JlZC4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAorICogICAgICAtMSBvbiBlcnJvcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgcmVhZGxpbmUoIGludCBmaWxlZGVzYywgY2hhciAqYnVmZmVyICkKK3sKKwlpbnQgcmVzdWx0ID0gLTE7CisJaW50IGJ5dGVzX3JlYWQgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCS8qIE1ha2Ugc3VyZSB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIGdvb2QgKi8KKwlpZiAoIGZpbGVkZXNjICE9IC0xICkgeworCQkvKiBSZWFkIGluIGZyb20gdGhlIGZpbGUgYnl0ZSBieSBieXRlIHVudGlsIGEgbmV3bGluZSBpcyByZWFjaGVkICovCisJCXdoaWxlKCggcmVzdWx0ID0gcmVhZCggZmlsZWRlc2MsICZidWZmZXJbYnl0ZXNfcmVhZF0sIDEgKSkgPT0gMSApIHsKKwkJCWlmICggYnVmZmVyW2J5dGVzX3JlYWRdID09ICdcbicgKSB7CisJCQkJYnVmZmVyW2J5dGVzX3JlYWRdID0gJ1wwJzsKKwkJCQlieXRlc19yZWFkKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlieXRlc19yZWFkKys7CisJCX0KKwl9CisKKwkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkICovCisJaWYgKCByZXN1bHQgPT0gLTEgKSB7CisJCXJldHVybiByZXN1bHQ7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGJ5dGVzX3JlYWQ7CisJfQorfSAvLyByZWFkbGluZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXRyYW5zbGF0ZV9vcHRpb24oKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgbGluZSByZWFkIGluIGZyb20gdGhlIGNvbmZpZyBmaWxlIGFuZCBwYXJzZXMgb3V0CisgKiAgIHRoZSBrZXkvdmFsdWUgcGFpcnMuIEl0IHRoZW4gZGV0ZXJtaW5lcyB3aGljaCBrZXkgaGFzIGJlZW4gcGFyc2VkIGFuZCBzZXRzCisgKiAgIHRoZSBjYXJkJ3MgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGUgdmFsdWUgZ2l2ZW4uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBidWZmZXIgLSBhIGJ1ZmZlciBjb250YWluaW5nIGEgbGluZSB0byB0cmFuc2xhdGUKKyAqICAgICAgY29uZmlnIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0cmFuc2xhdGVfb3B0aW9uKCBjaGFyICpidWZmZXIsIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJdW5zaWduZWQgaW50IHZhbHVlX2NvbnZlcnQgPSAwOworCWludCBzdHJpbmdfbGVuZ3RoID0gMDsKKwljaGFyICprZXkgPSBOVUxMOworCWNoYXIgKnZhbHVlID0gTlVMTDsKKwl1X2NoYXIgbWFjX3ZhbHVlW0VUSF9BTEVOXTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlEQkdfRlVOQyggInRyYW5zbGF0ZV9vcHRpb24iICk7CisKKwlpZiAoIGJ1ZmZlciA9PSBOVUxMIHx8IGxwID09IE5VTEwgKSB7CisJCURCR19FUlJPUiggRGJnSW5mbywgIkNvbmZpZyBmaWxlIGJ1ZmZlciBhbmQvb3Igd2F2ZWxhbiBidWZmZXIgcHRyIE5VTExcbiIgKTsKKwkJcmV0dXJuOworCX0KKworCVBhcnNlQ29uZmlnTGluZSggYnVmZmVyLCAma2V5LCAmdmFsdWUgKTsKKworCWlmICgga2V5ID09IE5VTEwgfHwgdmFsdWUgPT0gTlVMTCApIHsKKwkJcmV0dXJuOworCX0KKworCS8qIERldGVybWluZSB3aGljaCBrZXkgaXQgaXMgYW5kIHBlcmZvcm0gdGhlIGFwcHJvcHJpYXRlIGFjdGlvbiAqLworCisJLyogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHVzZWQgaW4gYWxsIHNjZW5hcmlvcyAqLworI2lmIERCRworCS8qIGhhbmRsZSBEZWJ1Z0ZsYWcgYXMgZWFybHkgYXMgcG9zc2libGUgc28gaXQgc3RhcnRzIGl0cyBpbmZsdWVuY2UgYXMgZWFybHkKKwkgKiBhcyBwb3NzaWJsZQorCSAqLworCWlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9ERUJVR19GTEFHICkgPT0gMCApIHsKKwkJaWYgKCBEZWJ1Z0ZsYWcgPT0gfjAgKSB7CQkJLy9pZiBEZWJ1Z0ZsYWcgaXMgbm90IHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lCisJCQlpZiAoIERiZ0luZm8tPkRlYnVnRmxhZyA9PSAwICkgewkvKiBpZiBwY19kZWJ1ZyBkaWQgbm90IHNldCBEZWJ1Z0ZsYWcgKGkuZS5wY19kZWJ1ZyBpcworCQkJCQkJCQkJCQkgKiBub3Qgc3BlY2lmaWVkIG9yIHNwZWNpZmllZCBvdXRzaWRlIHRoZSA0LTggcmFuZ2UKKwkJCQkJCQkJCQkJICovCisJCQkJRGJnSW5mby0+RGVidWdGbGFnIHw9IERCR19ERUZBVUxUUzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCURiZ0luZm8tPkRlYnVnRmxhZyA9IHdsX2F0b2koIHZhbHVlICk7IC8vOz9EZWJ1Z0ZsYWc7CisJCX0KKwkJRGJnSW5mby0+RGVidWdGbGFnID0gd2xfYXRvaSggdmFsdWUgKTsgLy87P0RlbGV0ZSBBU0FQCisJfQorI2VuZGlmIC8qIERCRyAqLworCWlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9BVVRIX0tFWV9NR01UX1NVSVRFICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0FVVEhfS0VZX01HTVRfU1VJVEUsIHZhbHVlICk7CisKKwkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fQVVUSF9LRVlfTUdNVF9TVUlURSApIHx8ICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9BVVRIX0tFWV9NR01UX1NVSVRFICkpIHsKKwkJCWxwLT5BdXRoS2V5TWdtdFN1aXRlID0gdmFsdWVfY29udmVydDsKKwkJfSBlbHNlIHsKKwkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfQVVUSF9LRVlfTUdNVF9TVUlURSApOworCQl9CisJfQorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0JSU0NfMkdIWiApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9CUlNDXzJHSFosIHZhbHVlICk7CisKKwkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fQlJTQyApIHx8ICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9CUlNDICkpIHsKKwkJCWxwLT5icnNjWzBdID0gdmFsdWVfY29udmVydDsKKwkJfSBlbHNlIHsKKwkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9CUlNDXzJHSFogKTsKKwkJfQorCX0KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9CUlNDXzVHSFogKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfQlJTQ181R0haLCB2YWx1ZSApOworCisJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX0JSU0MgKSB8fCAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfQlJTQyApKSB7CisJCQlscC0+YnJzY1sxXSA9IHZhbHVlX2NvbnZlcnQ7CisJCX0gZWxzZSB7CisJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfQlJTQ181R0haICk7CisJCX0KKwl9CisJZWxzZSBpZiAoKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0RFU0lSRURfU1NJRCApID09IDAgKSB8fCAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfT1dOX1NTSUQgKSA9PSAwICkpIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU1NJRCwgdmFsdWU6ICVzXG4iLCB2YWx1ZSApOworCisJCW1lbXNldCggbHAtPk5ldHdvcmtOYW1lLCAwLCAoIFBBUk1fTUFYX05BTUVfTEVOICsgMSApKTsKKworCQkvKiBNYWtlIHN1cmUgdGhlIHZhbHVlIGlzbid0IHRvbyBsb25nICovCisJCXN0cmluZ19sZW5ndGggPSBzdHJsZW4oIHZhbHVlICk7CisJCWlmICggc3RyaW5nX2xlbmd0aCA+IFBBUk1fTUFYX05BTUVfTEVOICkgeworCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICJTU0lEIHRvbyBsb25nOyB3aWxsIGJlIHRydW5jYXRlZFxuIiApOworCQkJc3RyaW5nX2xlbmd0aCA9IFBBUk1fTUFYX05BTUVfTEVOOworCQl9CisKKwkJbWVtY3B5KCBscC0+TmV0d29ya05hbWUsIHZhbHVlLCBzdHJpbmdfbGVuZ3RoICk7CisJfQorI2lmIDAKKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9ET1dOTE9BRF9GSVJNV0FSRSApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIkRPV05MT0FEX0ZJUk1XQVJFLCB2YWx1ZTogJXNcbiIsIHZhbHVlICk7CisJCW1lbXNldCggbHAtPmZ3X2ltYWdlX2ZpbGVuYW1lLCAwLCAoIE1BWF9MSU5FX1NJWkUgKyAxICkpOworCQkvKiBNYWtlIHN1cmUgdGhlIHZhbHVlIGlzbid0IHRvbyBsb25nICovCisJCXN0cmluZ19sZW5ndGggPSBzdHJsZW4oIHZhbHVlICk7CisJCWlmICggc3RyaW5nX2xlbmd0aCA+IE1BWF9MSU5FX1NJWkUgKSB7CisJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIkYvVyBpbWFnZSBmaWxlIG5hbWUgdG9vIGxvbmc7IHdpbGwgYmUgaWdub3JlZFxuIiApOworCQl9IGVsc2UgeworCQkJbWVtY3B5KCBscC0+ZndfaW1hZ2VfZmlsZW5hbWUsIHZhbHVlLCBzdHJpbmdfbGVuZ3RoICk7CisJCX0KKwl9CisjZW5kaWYKKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9FTkFCTEVfRU5DUllQVElPTiApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9FTkFCTEVfRU5DUllQVElPTiwgdmFsdWUgKTsKKworCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9FTkFCTEVfRU5DUllQVElPTiApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9FTkFCTEVfRU5DUllQVElPTiApKSB7CisJCQlscC0+RW5hYmxlRW5jcnlwdGlvbiA9IHZhbHVlX2NvbnZlcnQ7CisJCX0gZWxzZSB7CisJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0VOQUJMRV9FTkNSWVBUSU9OICk7CisJCX0KKwl9CisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfRU5DUllQVElPTiApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9FTkNSWVBUSU9OLCB2YWx1ZSApOworCisJCW1lbXNldCggbHAtPnN6RW5jcnlwdGlvbiwgMCwgc2l6ZW9mKCBscC0+c3pFbmNyeXB0aW9uICkpOworCisJCS8qIE1ha2Ugc3VyZSB0aGUgdmFsdWUgaXNuJ3QgdG9vIGxvbmcgKi8KKwkJc3RyaW5nX2xlbmd0aCA9IHN0cmxlbiggdmFsdWUgKTsKKwkJaWYgKCBzdHJpbmdfbGVuZ3RoID4gc2l6ZW9mKCBscC0+c3pFbmNyeXB0aW9uICkgKSB7CisJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIHRvbyBsb25nOyB3aWxsIGJlIHRydW5jYXRlZFxuIiwgUEFSTV9OQU1FX0VOQ1JZUFRJT04gKTsKKwkJCXN0cmluZ19sZW5ndGggPSBzaXplb2YoIGxwLT5zekVuY3J5cHRpb24gKTsKKwkJfQorCisJCW1lbWNweSggbHAtPnN6RW5jcnlwdGlvbiwgdmFsdWUsIHN0cmluZ19sZW5ndGggKTsKKwl9CisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfS0VZMSApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9LRVkxLCB2YWx1ZSApOworCisJCWlmICggaXNfdmFsaWRfa2V5X3N0cmluZyggdmFsdWUgKSkgeworCQkJbWVtc2V0KCBscC0+RGVmYXVsdEtleXMua2V5WzBdLmtleSwgMCwgTUFYX0tFWV9TSVpFICk7CisKKwkJCWtleV9zdHJpbmcya2V5KCB2YWx1ZSwgJmxwLT5EZWZhdWx0S2V5cy5rZXlbMF0gKTsKKwkJfSBlbHNlIHsKKwkJCSBEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0tFWTEgKTsKKwkJfQorCX0KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9LRVkyICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0tFWTIsIHZhbHVlICk7CisKKwkJaWYgKCBpc192YWxpZF9rZXlfc3RyaW5nKCB2YWx1ZSApKSB7CisJCQltZW1zZXQoIGxwLT5EZWZhdWx0S2V5cy5rZXlbMV0ua2V5LCAwLCBNQVhfS0VZX1NJWkUgKTsKKworCQkJa2V5X3N0cmluZzJrZXkoIHZhbHVlLCAmbHAtPkRlZmF1bHRLZXlzLmtleVsxXSApOworCQl9IGVsc2UgeworCQkJIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfS0VZMiApOworCQl9CisJfQorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0tFWTMgKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfS0VZMywgdmFsdWUgKTsKKworCQlpZiAoIGlzX3ZhbGlkX2tleV9zdHJpbmcoIHZhbHVlICkpIHsKKwkJCW1lbXNldCggbHAtPkRlZmF1bHRLZXlzLmtleVsyXS5rZXksIDAsIE1BWF9LRVlfU0laRSApOworCisJCQlrZXlfc3RyaW5nMmtleSggdmFsdWUsICZscC0+RGVmYXVsdEtleXMua2V5WzJdICk7CisJCX0gZWxzZSB7CisJCQkgREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9LRVkzICk7CisJCX0KKwl9CisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfS0VZNCApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9LRVk0LCB2YWx1ZSApOworCisJCWlmICggaXNfdmFsaWRfa2V5X3N0cmluZyggdmFsdWUgKSkgeworCQkJbWVtc2V0KCBscC0+RGVmYXVsdEtleXMua2V5WzNdLmtleSwgMCwgTUFYX0tFWV9TSVpFICk7CisKKwkJCWtleV9zdHJpbmcya2V5KCB2YWx1ZSwgJmxwLT5EZWZhdWx0S2V5cy5rZXlbM10gKTsKKwkJfSBlbHNlIHsKKwkJCSBEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0tFWTQgKTsKKwkJfQorCX0KKwkvKiBOZXcgUGFyYW1ldGVycyBmb3IgV0FSUCAqLworCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0xPQURfQkFMQU5DSU5HICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0xPQURfQkFMQU5DSU5HLCB2YWx1ZSApOworCQlscC0+bG9hZEJhbGFuY2luZyA9IHBhcnNlX3llc19ubyh2YWx1ZSk7CisJfQorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX01FRElVTV9ESVNUUklCVVRJT04gKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfTUVESVVNX0RJU1RSSUJVVElPTiwgdmFsdWUgKTsKKwkJbHAtPm1lZGl1bURpc3RyaWJ1dGlvbiA9IHBhcnNlX3llc19ubyh2YWx1ZSk7CisJfQorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX01JQ1JPV0FWRV9ST0JVU1RORVNTKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfTUlDUk9XQVZFX1JPQlVTVE5FU1MsIHZhbHVlICk7CisJCWxwLT5NaWNyb3dhdmVSb2J1c3RuZXNzID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKKwl9CisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfTVVMVElDQVNUX1JBVEUgKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfTVVMVElDQVNUX1JBVEUsIHZhbHVlICk7CisKKwkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisKKwkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9NVUxUSUNBU1RfUkFURSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9NVUxUSUNBU1RfUkFURSApKSB7CisJCQlscC0+TXVsdGljYXN0UmF0ZVswXSA9IHZhbHVlX2NvbnZlcnQ7CisJCX0gZWxzZSB7CisJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX01VTFRJQ0FTVF9SQVRFICk7CisJCX0KKwl9CisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfT1dOX0NIQU5ORUwgKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfT1dOX0NIQU5ORUwsIHZhbHVlICk7CisKKwkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCWlmICggd2xfaXNfYV92YWxpZF9jaGFuKCB2YWx1ZV9jb252ZXJ0ICkpIHsKKwkJCWlmICggdmFsdWVfY29udmVydCA+IDE0ICkgeworCQkJCXZhbHVlX2NvbnZlcnQgPSB2YWx1ZV9jb252ZXJ0IHwgMHgxMDA7CisJCQl9CisJCQlscC0+Q2hhbm5lbCA9IHZhbHVlX2NvbnZlcnQ7CisJCX0gZWxzZSB7CisJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX09XTl9DSEFOTkVMICk7CisJCX0KKwl9CisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfT1dOX05BTUUgKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfT1dOX05BTUUsIHZhbHVlICk7CisKKwkJbWVtc2V0KCBscC0+U3RhdGlvbk5hbWUsIDAsICggUEFSTV9NQVhfTkFNRV9MRU4gKyAxICkpOworCisJCS8qIE1ha2Ugc3VyZSB0aGUgdmFsdWUgaXNuJ3QgdG9vIGxvbmcgKi8KKwkJc3RyaW5nX2xlbmd0aCA9IHN0cmxlbiggdmFsdWUgKTsKKwkJaWYgKCBzdHJpbmdfbGVuZ3RoID4gUEFSTV9NQVhfTkFNRV9MRU4gKSB7CisJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIHRvbyBsb25nOyB3aWxsIGJlIHRydW5jYXRlZFxuIiwgUEFSTV9OQU1FX09XTl9OQU1FICk7CisJCQlzdHJpbmdfbGVuZ3RoID0gUEFSTV9NQVhfTkFNRV9MRU47CisJCX0KKworCQltZW1jcHkoIGxwLT5TdGF0aW9uTmFtZSwgdmFsdWUsIHN0cmluZ19sZW5ndGggKTsKKwl9CisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRCApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xELCB2YWx1ZSApOworCisJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1JUU19USFJFU0hPTEQgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKSB7CisJCQlscC0+UlRTVGhyZXNob2xkID0gdmFsdWVfY29udmVydDsKKwkJfSBlbHNlIHsKKwkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRCApOworCQl9CisJfQorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1NSU0NfMkdIWiApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9TUlNDXzJHSFosIHZhbHVlICk7CisKKwkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fU1JTQyApIHx8ICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9TUlNDICkpIHsKKwkJCWxwLT5zcnNjWzBdID0gdmFsdWVfY29udmVydDsKKwkJfSBlbHNlIHsKKwkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9TUlNDXzJHSFogKTsKKwkJfQorCX0KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9TUlNDXzVHSFogKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfU1JTQ181R0haLCB2YWx1ZSApOworCisJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1NSU0MgKSB8fCAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfU1JTQyApKSB7CisJCQlscC0+c3JzY1sxXSA9IHZhbHVlX2NvbnZlcnQ7CisJCX0gZWxzZSB7CisJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfU1JTQ181R0haICk7CisJCX0KKwl9CisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfU1lTVEVNX1NDQUxFICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1NZU1RFTV9TQ0FMRSwgdmFsdWUgKTsKKworCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9TWVNURU1fU0NBTEUgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfU1lTVEVNX1NDQUxFICkpIHsKKwkJCWxwLT5EaXN0YW5jZUJldHdlZW5BUHMgPSB2YWx1ZV9jb252ZXJ0OworCQl9IGVsc2UgeworCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9TWVNURU1fU0NBTEUgKTsKKwkJfQorCX0KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9UWF9LRVkgKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfVFhfS0VZLCB2YWx1ZSApOworCisJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1RYX0tFWSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9LRVkgKSkgeworCQkJbHAtPlRyYW5zbWl0S2V5SUQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQl9IGVsc2UgeworCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9UWF9LRVkgKTsKKwkJfQorCX0KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9UWF9SQVRFICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX1JBVEUsIHZhbHVlICk7CisKKwkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFICkpIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sWzBdID0gdmFsdWVfY29udmVydDsKKwkJfSBlbHNlIHsKKwkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURSApOworCQl9CisJfQorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1RYX1BPV19MRVZFTCApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9QT1dfTEVWRUwsIHZhbHVlICk7CisKKwkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUE9XX0xFVkVMICkgfHwgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1RYX1BPV19MRVZFTCApKSB7CisJCQlscC0+dHhQb3dMZXZlbCA9IHZhbHVlX2NvbnZlcnQ7CisJCX0gZWxzZSB7CisJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1RYX1BPV19MRVZFTCApOworCQl9CisJfQorCisJLyogTmVlZCB0byBhZGQ/IDogQ291bnRyeSBjb2RlLCBTaG9ydC9Mb25nIHJldHJ5ICovCisKKwkvKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgc3BlY2lmaWMgdG8gU1RBIG1vZGUgKi8KKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQQorLy87P3NlZW1zIHJlYXNvbmFibGUgdGhhdCBldmVuIGFuIEFQLW9ubHkgZHJpdmVyIGNvdWxkIGFmZm9yZCB0aGlzIHNtYWxsIGFkZGl0aW9uYWwgZm9vdHByaW50CisJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19TVEEgICkgeworCQkJCQkvLzs/c2hvdWxkIHdlIHJldHVybiBhbiBlcnJvciBzdGF0dXMgaW4gQVAgbW9kZQorCQlpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfUE9SVF9UWVBFICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9QT1JUX1RZUEUsIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCggdmFsdWVfY29udmVydCA9PSBQQVJNX01JTl9QT1JUX1RZUEUgKSB8fCAoIHZhbHVlX2NvbnZlcnQgPT0gUEFSTV9NQVhfUE9SVF9UWVBFICkpIHsKKwkJCQlscC0+UG9ydFR5cGUgPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1BPUlRfVFlQRSApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1BNX0VOQUJMRUQgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1BNX0VOQUJMRUQsIHZhbHVlICk7CisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkvKiA7PyBob3cgYWJvdXQgd2xfbWFpbi5jIGNvbnRhaW5pbmcKKwkgKiBWQUxJRF9QQVJBTSggUEFSTV9QTV9FTkFCTEVEIDw9IFdWTEFOX1BNX1NUQVRFX1NUQU5EQVJEIHx8CisJICoJCQkJCSAoIFBBUk1fUE1fRU5BQkxFRCAmIDB4N0ZGRiApIDw9IFdWTEFOX1BNX1NUQVRFX1NUQU5EQVJEICk7CisJICovCisJCQlpZiAoICggdmFsdWVfY29udmVydCAmIDB4N0ZGRiApIDw9IFBBUk1fTUFYX1BNX0VOQUJMRUQpIHsKKwkJCQlscC0+UE1FbmFibGVkID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9QTV9FTkFCTEVEICk7CisJCQkJLy87P3RoaXMgaXMgYSBkYXRhIGVudHJ5IGVycm9yLCBoZW5jZSBub3QgYSBEQkdfV0FSTklORworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0NSRUFURV9JQlNTICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9DUkVBVEVfSUJTUywgdmFsdWUgKTsKKwkJCWxwLT5DcmVhdGVJQlNTID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9NVUxUSUNBU1RfUlggKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX01VTFRJQ0FTVF9SWCwgdmFsdWUgKTsKKwkJCWxwLT5NdWx0aWNhc3RSZWNlaXZlID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9NQVhfU0xFRVAgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX01BWF9TTEVFUCwgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IDAgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gNjU1MzUgKSkgeworCQkJCWxwLT5NYXhTbGVlcER1cmF0aW9uID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9NQVhfU0xFRVAgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9ORVRXT1JLX0FERFIgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX05FVFdPUktfQUREUiwgdmFsdWUgKTsKKworCQkJaWYgKCBwYXJzZV9tYWNfYWRkcmVzcyggdmFsdWUsIG1hY192YWx1ZSApID09IEVUSF9BTEVOICkgeworCQkJCW1lbWNweSggbHAtPk1BQ0FkZHJlc3MsIG1hY192YWx1ZSwgRVRIX0FMRU4gKTsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9ORVRXT1JLX0FERFIgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9BVVRIRU5USUNBVElPTiApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfQVVUSEVOVElDQVRJT04sIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9BVVRIRU5USUNBVElPTiApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9BVVRIRU5USUNBVElPTiApKSB7CisJCQkJbHAtPmF1dGhlbnRpY2F0aW9uID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9BVVRIRU5USUNBVElPTiApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX09XTl9BVElNX1dJTkRPVyApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfT1dOX0FUSU1fV0lORE9XLCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fT1dOX0FUSU1fV0lORE9XICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX09XTl9BVElNX1dJTkRPVyApKSB7CisJCQkJbHAtPmF0aW1XaW5kb3cgPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX09XTl9BVElNX1dJTkRPVyApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1BNX0hPTERPVkVSX0RVUkFUSU9OICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9QTV9IT0xET1ZFUl9EVVJBVElPTiwgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1BNX0hPTERPVkVSX0RVUkFUSU9OICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1BNX0hPTERPVkVSX0RVUkFUSU9OICkpIHsKKwkJCQlscC0+aG9sZG92ZXJEdXJhdGlvbiA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUE1fSE9MRE9WRVJfRFVSQVRJT04gKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9QUk9NSVNDVU9VU19NT0RFICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9QUk9NSVNDVU9VU19NT0RFLCB2YWx1ZSApOworCQkJbHAtPnByb21pc2N1b3VzTW9kZSA9IHBhcnNlX3llc19ubyh2YWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfQ09OTkVDVElPTl9DT05UUk9MICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9DT05ORUNUSU9OX0NPTlRST0wsIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9DT05ORUNUSU9OX0NPTlRST0wgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfQ09OTkVDVElPTl9DT05UUk9MICkpIHsKKwkJCQlscC0+Y29ubmVjdGlvbkNvbnRyb2wgPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0NPTk5FQ1RJT05fQ09OVFJPTCApOworCQkJfQorCQl9CisKKwkJLyogTmVlZCB0byBhZGQ/IDogUHJvYmUgRGF0YSBSYXRlICovCisJfQorI2VuZGlmICAvKiAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBICovCisKKwkvKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgc3BlY2lmaWMgdG8gQVAgbW9kZSAqLworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKwkJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CisJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKSB7CisJCWlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9PV05fRFRJTV9QRVJJT0QgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX09XTl9EVElNX1BFUklPRCwgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fT1dOX0RUSU1fUEVSSU9EICkgeworCQkJCWxwLT5EVElNUGVyaW9kID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9PV05fRFRJTV9QRVJJT0QgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9SRUpFQ1RfQU5ZICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9SRUpFQ1RfQU5ZLCB2YWx1ZSApOworCQkJbHAtPlJlamVjdEFueSA9IHBhcnNlX3llc19ubyh2YWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfRVhDTFVERV9VTkVOQ1JZUFRFRCApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfRVhDTFVERV9VTkVOQ1JZUFRFRCwgdmFsdWUgKTsKKwkJCWxwLT5FeGNsdWRlVW5lbmNyeXB0ZWQgPSBwYXJzZV95ZXNfbm8odmFsdWUpOworCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcsIHZhbHVlICk7CisJCQlscC0+RXhjbHVkZVVuZW5jcnlwdGVkID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9JTlRSQV9CU1NfUkVMQVkgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0lOVFJBX0JTU19SRUxBWSwgdmFsdWUgKTsKKwkJCWxwLT5FeGNsdWRlVW5lbmNyeXB0ZWQgPSBwYXJzZV95ZXNfbm8odmFsdWUpOworCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX09XTl9CRUFDT05fSU5URVJWQUwgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX09XTl9CRUFDT05fSU5URVJWQUwsIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX09XTl9CRUFDT05fSU5URVJWQUwgKSB7CisJCQkJbHAtPm93bkJlYWNvbkludGVydmFsID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9PV05fQkVBQ09OX0lOVEVSVkFMICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfQ09FWElTVEVOQ0UgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0NPRVhJU1RFTkNFLCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9DT0VYSVNURU5DRSApIHsKKwkJCQlscC0+Y29leGlzdGVuY2UgPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0NPRVhJU1RFTkNFICk7CisJCQl9CisJCX0KKworI2lmZGVmIFVTRV9XRFMKKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDEgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQxLCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpIHsKKwkJCQlscC0+d2RzX3BvcnRbMF0ucnRzVGhyZXNob2xkID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMSApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQyICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMiwgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1JUU19USFJFU0hPTEQgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKSB7CisJCQkJbHAtPndkc19wb3J0WzFdLnJ0c1RocmVzaG9sZCA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDIgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMyApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDMsIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9SVFNfVEhSRVNIT0xEICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQgKSkgeworCQkJCWxwLT53ZHNfcG9ydFsyXS5ydHNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQzICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDQgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ0LCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpIHsKKwkJCQlscC0+d2RzX3BvcnRbM10ucnRzVGhyZXNob2xkID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENCApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ1ICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENSwgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1JUU19USFJFU0hPTEQgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKSB7CisJCQkJbHAtPndkc19wb3J0WzRdLnJ0c1RocmVzaG9sZCA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDUgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENiApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDYsIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9SVFNfVEhSRVNIT0xEICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQgKSkgeworCQkJCWxwLT53ZHNfcG9ydFs1XS5ydHNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ2ICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfVFhfUkFURTEgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX1JBVEUxLCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFICkpIHsKKwkJCQlscC0+d2RzX3BvcnRbMF0udHhSYXRlQ250bCA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURTEgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9UWF9SQVRFMiApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfVFhfUkFURTIsIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9SQVRFICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1RYX1JBVEUgKSkgeworCQkJCWxwLT53ZHNfcG9ydFsxXS50eFJhdGVDbnRsID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9UWF9SQVRFMiApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1RYX1JBVEUzICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFMywgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1RYX1JBVEUgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfVFhfUkFURSApKSB7CisJCQkJbHAtPndkc19wb3J0WzJdLnR4UmF0ZUNudGwgPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1RYX1JBVEUzICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfVFhfUkFURTQgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX1JBVEU0LCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFICkpIHsKKwkJCQlscC0+d2RzX3BvcnRbM10udHhSYXRlQ250bCA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURTQgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9UWF9SQVRFNSApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfVFhfUkFURTUsIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9SQVRFICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1RYX1JBVEUgKSkgeworCQkJCWxwLT53ZHNfcG9ydFs0XS50eFJhdGVDbnRsID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9UWF9SQVRFNSApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1RYX1JBVEU2ICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFNiwgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1RYX1JBVEUgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfVFhfUkFURSApKSB7CisJCQkJbHAtPndkc19wb3J0WzVdLnR4UmF0ZUNudGwgPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1RYX1JBVEU2ICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfV0RTX0FERFJFU1MxICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzEsIHZhbHVlICk7CisKKwkJCWlmICggcGFyc2VfbWFjX2FkZHJlc3MoIHZhbHVlLCBtYWNfdmFsdWUgKSA9PSBFVEhfQUxFTiApIHsKKwkJCQltZW1jcHkoIGxwLT53ZHNfcG9ydFswXS53ZHNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOICk7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1MxICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfV0RTX0FERFJFU1MyICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzIsIHZhbHVlICk7CisKKwkJCWlmICggcGFyc2VfbWFjX2FkZHJlc3MoIHZhbHVlLCBtYWNfdmFsdWUgKSA9PSBFVEhfQUxFTiApIHsKKwkJCQltZW1jcHkoIGxwLT53ZHNfcG9ydFsxXS53ZHNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOICk7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1MyICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfV0RTX0FERFJFU1MzICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzMsIHZhbHVlICk7CisKKwkJCWlmICggcGFyc2VfbWFjX2FkZHJlc3MoIHZhbHVlLCBtYWNfdmFsdWUgKSA9PSBFVEhfQUxFTiApIHsKKwkJCQltZW1jcHkoIGxwLT53ZHNfcG9ydFsyXS53ZHNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOICk7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1MzICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfV0RTX0FERFJFU1M0ICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzQsIHZhbHVlICk7CisKKwkJCWlmICggcGFyc2VfbWFjX2FkZHJlc3MoIHZhbHVlLCBtYWNfdmFsdWUgKSA9PSBFVEhfQUxFTiApIHsKKwkJCQltZW1jcHkoIGxwLT53ZHNfcG9ydFszXS53ZHNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOICk7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1M0ICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfV0RTX0FERFJFU1M1ICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzUsIHZhbHVlICk7CisKKwkJCWlmICggcGFyc2VfbWFjX2FkZHJlc3MoIHZhbHVlLCBtYWNfdmFsdWUgKSA9PSBFVEhfQUxFTiApIHsKKwkJCQltZW1jcHkoIGxwLT53ZHNfcG9ydFs0XS53ZHNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOICk7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1M1ICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfV0RTX0FERFJFU1M2ICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzYsIHZhbHVlICk7CisKKwkJCWlmICggcGFyc2VfbWFjX2FkZHJlc3MoIHZhbHVlLCBtYWNfdmFsdWUgKSA9PSBFVEhfQUxFTiApIHsKKwkJCQltZW1jcHkoIGxwLT53ZHNfcG9ydFs1XS53ZHNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOICk7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1M2ICk7CisJCQl9CisJCX0KKyNlbmRpZiAgLyogVVNFX1dEUyAqLworCX0KKyNlbmRpZiAgLyogKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQICovCisKKwlyZXR1cm47Cit9IC8vIHRyYW5zbGF0ZV9vcHRpb24KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglwYXJzZV9tYWNfYWRkcmVzcygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBwYXJzZSBhIG1hYyBhZGRyZXNzIHN0cmluZyBhbmQgY29udmVydCBpdCB0byBhIGJ5dGUKKyAqICAgYXJyYXkuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB2YWx1ZSAgICAgICAtIHRoZSBNQUMgYWRkcmVzcywgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcKKyAqICAgICAgYnl0ZV9hcnJheSAgLSB0aGUgTUFDIGFkZHJlc3MsIHJlcHJlc2VudGVkIGFzIGEgYnl0ZSBhcnJheSBvZiBsZW5ndGgKKyAqICAgICAgICAgICAgICAgICAgICBFVEhfQUxFTgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgZmluYWwgTUFDIGFkZHJlc3MsIHNob3VsZCBlcXVhbCB0byBFVEhfQUxFTi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHBhcnNlX21hY19hZGRyZXNzKCBjaGFyICp2YWx1ZSwgdV9jaGFyICpieXRlX2FycmF5ICkKK3sKKwlpbnQgICAgIHZhbHVlX29mZnNldCA9IDA7CisJaW50ICAgICBhcnJheV9vZmZzZXQgPSAwOworCWludCAgICAgZmllbGRfb2Zmc2V0ID0gMDsKKwljaGFyICAgIGJ5dGVfZmllbGRbM107CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJbWVtc2V0KCBieXRlX2ZpZWxkLCAnXDAnLCAzICk7CisKKwl3aGlsZSggdmFsdWVbdmFsdWVfb2Zmc2V0XSAhPSAnXDAnICkgeworCQkvKiBTa2lwIG92ZXIgdGhlIGNvbG9uIGNoYXJzIHNlcGVyYXRpbmcgdGhlIGJ5dGVzLCBpZiB0aGV5IGV4aXN0ICovCisJCWlmICggdmFsdWVbdmFsdWVfb2Zmc2V0XSA9PSAnOicgKSB7CisJCQl2YWx1ZV9vZmZzZXQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYnl0ZV9maWVsZFtmaWVsZF9vZmZzZXRdID0gdmFsdWVbdmFsdWVfb2Zmc2V0XTsKKwkJZmllbGRfb2Zmc2V0Kys7CisJCXZhbHVlX29mZnNldCsrOworCisJCS8qIE9uY2UgdGhlIGJ5dGVfZmllbGQgaXMgZmlsbGVkLCBjb252ZXJ0IGl0IGFuZCBzdG9yZSBpdCAqLworCQlpZiAoIGZpZWxkX29mZnNldCA9PSAyICkgeworCQkJYnl0ZV9maWVsZFtmaWVsZF9vZmZzZXRdID0gJ1wwJzsKKwkJCWJ5dGVfYXJyYXlbYXJyYXlfb2Zmc2V0XSA9IHNpbXBsZV9zdHJ0b3VsKCBieXRlX2ZpZWxkLCBOVUxMLCAxNiApOworCQkJZmllbGRfb2Zmc2V0ID0gMDsKKwkJCWFycmF5X29mZnNldCsrOworCQl9CisJfQorCisJLyogVXNlIHRoZSBhcnJheV9vZmZzZXQgYXMgYSBjaGVjazsgNiBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiB0byB0aGUKKwkgICBieXRlX2FycmF5ICovCisJcmV0dXJuIGFycmF5X29mZnNldDsKK30gLy8gcGFyc2VfbWFjX2FkZHJlc3MKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglQYXJzZUNvbmZpZ0xpbmUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBQYXJzZXMgYSBsaW5lIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpbnRvIGFuIEwtdmFsIGFuZCBhbiBSLXZhbCwKKyAqICByZXByZXNlbnRpbmcgYSBrZXkvdmFsdWUgcGFpci4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHBzekxpbmUgICAgIC0gdGhlIGxpbmUgZnJvbSB0aGUgY29uZmlnIGZpbGUgdG8gcGFyc2UKKyAqICAgICAgcHBzekxWYWwgICAgLSB0aGUgcmVzdWx0aW5nIEwtdmFsIChLZXkpCisgKiAgICAgIHBwc3pSVmFsICAgIC0gdGhlIHJlc3VsdGluZyBSLXZhbCAoVmFsdWUpCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQYXJzZUNvbmZpZ0xpbmUoIGNoYXIgKnBzekxpbmUsIGNoYXIgKipwcHN6TFZhbCwgY2hhciAqKnBwc3pSVmFsICkKK3sKKwlpbnQgaTsKKwlpbnQgc2l6ZTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlEQkdfRlVOQyggIlBhcnNlQ29uZmlnTGluZSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCS8qIGdldCBhIHNuYXBzaG90IG9mIG91ciBzdHJpbmcgc2l6ZSAqLworCXNpemUgICAgICA9IHN0cmxlbiggcHN6TGluZSApOworCSpwcHN6TFZhbCA9IE5VTEw7CisJKnBwc3pSVmFsID0gTlVMTDsKKworCWlmICggcHN6TGluZVswXSAhPSAnIycgJiYJCQkJCQkJLyogc2tpcCB0aGUgbGluZSBpZiBpdCBpcyBhIGNvbW1lbnQgKi8KKwkJIHBzekxpbmVbMF0gIT0gJ1xuJyYmCQkJCQkJCS8qIGlmIGl0J3MgYW4gZW1wdHkgVU5JWCBsaW5lLCBkbyBub3RoaW5nICovCisJCSAhKCBwc3pMaW5lWzBdID09ICdccicgJiYgcHN6TGluZVsxXSA9PSAnXG4nICkJLyogaWYgaXQncyBhbiBlbXB0eSBNUy1ET1MgbGluZSwgZG8gbm90aGluZyAqLworCSAgICApIHsKKwkJLyogYWR2YW5jZSBwYXN0IGFueSB3aGl0ZXNwYWNlLCBhbmQgYXNzaWduIHRoZSBMLXZhbHVlICovCisJCWZvciggaSA9IDA7IGkgPCBzaXplOyBpKysgKSB7CisJCQlpZiAoIHBzekxpbmVbaV0gIT0gJyAnICkgeworCQkJCSpwcHN6TFZhbCA9ICZwc3pMaW5lW2ldOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qIGFkdmFuY2UgdG8gdGhlIGVuZCBvZiB0aGUgbC12YWx1ZSovCisJCWZvciggaSsrOyBpIDwgc2l6ZTsgaSsrICkgeworCQkJaWYgKCBwc3pMaW5lW2ldID09ICcgJyB8fCBwc3pMaW5lW2ldID09ICc9JyApIHsKKwkJCQlwc3pMaW5lW2ldID0gJ1wwJzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiBtYWtlIGFueSB3aGl0ZXNwYWNlIGFuZCB0aGUgZXF1YWwgc2lnbiBhIE5VTEwgY2hhcmFjdGVyLCBhbmQKKwkJICAgYWR2YW5jZSB0byB0aGUgUi1WYWx1ZSAqLworCQlmb3IoIGkrKzsgaSA8IHNpemU7IGkrKyApIHsKKwkJCWlmICggcHN6TGluZVtpXSA9PSAnICcgfHwgcHN6TGluZVtpXSA9PSAnPScgKSB7CisJCQkJcHN6TGluZVtpXSA9ICdcMCc7CisJCQkJY29udGludWU7CisJCQl9CisJCQkqcHBzelJWYWwgPSAmcHN6TGluZVtpXTsKKwkJCWJyZWFrOworCQl9CisJCS8qIG1ha2UgdGhlIGxpbmUgZW5kaW5nIGNoYXJhY3RlcihzKSBhIE5VTEwgKi8KKwkJZm9yKCBpKys7IGkgPCBzaXplOyBpKysgKSB7CisJCQlpZiAoIHBzekxpbmVbaV0gPT0gJ1xuJyApIHsKKwkJCQlwc3pMaW5lW2ldID0gJ1wwJzsKKwkJCX0KKwkJCWlmICgoIHBzekxpbmVbaV0gPT0gJ1xyJyApICYmICggcHN6TGluZVtpKzFdID09ICdcbicgKSkgeworCQkJCXBzekxpbmVbaV0gPSAnXDAnOworCQkJfQorCQl9CisJfQorCURCR19MRUFWRSggRGJnSW5mbyApOworfSAvLyBQYXJzZUNvbmZpZ0xpbmUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNlbmRpZiAgLy8gVVNFX1BST0ZJTEUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3Byb2ZpbGUuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3Byb2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWRiOGU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcHJvZmlsZS5oCkBAIC0wLDAgKzEsODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBIZWFkZXIgZGVzY3JpYmluZyBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgdGhlIGNvbmZpZyBwYXJzaW5nIHJvdXRpbmVzLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19XTF9QUk9GSUxFX0hfXworI2RlZmluZSBfX1dMX1BST0ZJTEVfSF9fCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgY29uc3RhbnQgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFJPT1RfQ09ORklHX0ZJTEVOQU1FICIvZXRjL2FnZXJlL2l3Y29uZmlnLSIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBhcnNlX2NvbmZpZyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCitpbnQgcmVhZGxpbmUoIGludCBmaWxlZGVzYywgY2hhciAqYnVmZmVyICk7CisKK3ZvaWQgdHJhbnNsYXRlX29wdGlvbiggY2hhciAqYnVmZmVyLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworaW50IHBhcnNlX21hY19hZGRyZXNzKCBjaGFyICp2YWx1ZSwgdV9jaGFyICpieXRlX2FycmF5ICk7CisKK3ZvaWQgUGFyc2VDb25maWdMaW5lKCBjaGFyICpwc3pMaW5lLCBjaGFyICoqcHBzekxWYWwsIGNoYXIgKipwcHN6UlZhbCApOworCisKKyNlbmRpZiAgLy8gX19XTF9QUk9GSUxFX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfc3lzZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY0ZTAxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3N5c2ZzLmMKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBleDogc3c9NAorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorCisjaW5jbHVkZSA8ZGVidWcuaD4KKyNpbmNsdWRlIDxoY2YuaD4KKyNpbmNsdWRlIDxoY2ZkZWYuaD4KKworI2luY2x1ZGUgPHdsX2lmLmg+CisjaW5jbHVkZSA8d2xfaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx3bF91dGlsLmg+CisjaW5jbHVkZSA8d2xfbWFpbi5oPgorI2luY2x1ZGUgPHdsX3dleHQuaD4KKyNpbmNsdWRlIDx3bF9wcml2Lmg+CisKK3N0YXRpYyBpbmxpbmUgaW50IGRldl9pc2FsaXZlKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgICAgICByZXR1cm4gZGV2LT5yZWdfc3RhdGUgPT0gTkVUUkVHX1JFR0lTVEVSRUQ7Cit9CisKKy8qCisgKiBlbXBpcmljYWxseSBldmVuIGlmIHRhbGxpZXMgYXJlIGRlZmluZWQgYXMgMzIgYml0cyBlbnRpdGllcywgb25seQorICogaGlnaCAxNiBiaXRzIGFyZSByZWxldmFudDsgbG93IGhhbGYgaXMgYWx3YXlzIHplcm8uIEl0IG1lYW5zIHRhbGxpZXMKKyAqIGFyZSBwcmV0dHkgbXVjaCB1c2VsZXNzIGZvciB0cmFmZmljIGNvdW50aW5nIGJ1dCBhdCBsZWFzdCBnaXZlIG92ZXJ2aWV3CisgKiBhYm91dCB3aGVyZSBlcnJvciBjb21lIGZyb20KKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd190YWxsaWVzKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNoYXIgKmJ1ZikKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdG9fbmV0X2RldihkKTsKKyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBDRkdfSEVSTUVTX1RBTExJRVNfU1RSQ1QgdGFsbGllczsKKyAgICBzc2l6ZV90IHJldCA9IC1FSU5WQUw7CisKKyAgICByZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworICAgIGlmIChkZXZfaXNhbGl2ZShkZXYpKSB7CisJd2xfbG9jayhscCwgJmZsYWdzKTsKKworCWlmICgocmV0ID0gd2xfZ2V0X3RhbGxpZXMobHAsICZ0YWxsaWVzKSkgPT0gMCkgeworCQl3bF91bmxvY2sobHAsICZmbGFncyk7CisJCXJldCA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLAorCQkgICAgIlR4VW5pY2FzdEZyYW1lczogICAgICAgICAgICV1XG4iCisJCSAgICAiVHhNdWx0aWNhc3RGcmFtZXM6ICAgICAgICAgJXVcbiIKKwkJICAgICJUeEZyYWdtZW50czogICAgICAgICAgICAgICAldVxuIgorCQkgICAgIlR4VW5pY2FzdE9jdGV0czogICAgICAgICAgICV1XG4iCisJCSAgICAiVHhNdWx0aWNhc3RPY3RldHM6ICAgICAgICAgJXVcbiIKKwkJICAgICJUeERlZmVycmVkVHJhbnNtaXNzaW9uczogICAldVxuIgorCQkgICAgIlR4U2luZ2xlUmV0cnlGcmFtZXM6ICAgICAgICV1XG4iCisJCSAgICAiVHhNdWx0aXBsZVJldHJ5RnJhbWVzOiAgICAgJXVcbiIKKwkJICAgICJUeFJldHJ5TGltaXRFeGNlZWRlZDogICAgICAldVxuIgorCQkgICAgIlR4RGlzY2FyZHM6ICAgICAgICAgICAgICAgICV1XG4iCisJCSAgICAiUnhVbmljYXN0RnJhbWVzOiAgICAgICAgICAgJXVcbiIKKwkJICAgICJSeE11bHRpY2FzdEZyYW1lczogICAgICAgICAldVxuIgorCQkgICAgIlJ4RnJhZ21lbnRzOiAgICAgICAgICAgICAgICV1XG4iCisJCSAgICAiUnhVbmljYXN0T2N0ZXRzOiAgICAgICAgICAgJXVcbiIKKwkJICAgICJSeE11bHRpY2FzdE9jdGV0czogICAgICAgICAldVxuIgorCQkgICAgIlJ4RkNTRXJyb3JzOiAgICAgICAgICAgICAgICV1XG4iCisJCSAgICAiUnhEaXNjYXJkc05vQnVmZmVyOiAgICAgICAgJXVcbiIKKwkJICAgICJUeERpc2NhcmRzV3JvbmdTQTogICAgICAgICAldVxuIgorCQkgICAgIlJ4V0VQVW5kZWNyeXB0YWJsZTogICAgICAgICV1XG4iCisJCSAgICAiUnhNc2dJbk1zZ0ZyYWdtZW50czogICAgICAgJXVcbiIKKwkJICAgICJSeE1zZ0luQmFkTXNnRnJhZ21lbnRzOiAgICAldVxuIgorCQkgICAgIlJ4RGlzY2FyZHNXRVBJQ1ZFcnJvcjogICAgICV1XG4iCisJCSAgICAiUnhEaXNjYXJkc1dFUEV4Y2x1ZGVkOiAgICAgJXVcbiIKKwkJICAgICwKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5UeFVuaWNhc3RGcmFtZXMsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuVHhNdWx0aWNhc3RGcmFtZXMsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuVHhGcmFnbWVudHMsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuVHhVbmljYXN0T2N0ZXRzLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlR4TXVsdGljYXN0T2N0ZXRzLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlR4RGVmZXJyZWRUcmFuc21pc3Npb25zLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlR4U2luZ2xlUmV0cnlGcmFtZXMsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuVHhNdWx0aXBsZVJldHJ5RnJhbWVzLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlR4UmV0cnlMaW1pdEV4Y2VlZGVkLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlR4RGlzY2FyZHMsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuUnhVbmljYXN0RnJhbWVzLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlJ4TXVsdGljYXN0RnJhbWVzLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlJ4RnJhZ21lbnRzLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlJ4VW5pY2FzdE9jdGV0cywKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5SeE11bHRpY2FzdE9jdGV0cywKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5SeEZDU0Vycm9ycywKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5SeERpc2NhcmRzTm9CdWZmZXIsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuVHhEaXNjYXJkc1dyb25nU0EsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuUnhXRVBVbmRlY3J5cHRhYmxlLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlJ4TXNnSW5Nc2dGcmFnbWVudHMsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuUnhNc2dJbkJhZE1zZ0ZyYWdtZW50cywKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5SeERpc2NhcmRzV0VQSUNWRXJyb3IsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuUnhEaXNjYXJkc1dFUEV4Y2x1ZGVkKTsKKwkgICAgfSBlbHNlIHsKKwkJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisJICAgIH0KKyAgICB9CisKKyAgICByZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHRhbGxpZXMsIFNfSVJVR08sIHNob3dfdGFsbGllcywgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp3bGFnc19hdHRyc1tdID0geworICAgICZkZXZfYXR0cl90YWxsaWVzLmF0dHIsCisgICAgTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgd2xhZ3NfZ3JvdXAgPSB7CisgICAgLm5hbWUgPSAid2xhZ3MiLAorICAgIC5hdHRycyA9IHdsYWdzX2F0dHJzLAorfTsKKwordm9pZCByZWdpc3Rlcl93bGFnc19zeXNmcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQoreworICAgIHN0cnVjdCBkZXZpY2UgKmRldiA9ICYobmV0LT5kZXYpOworICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYobmV0KTsKKworICAgIGxwLT5zeXNmc0NyZWF0ZWQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJndsYWdzX2dyb3VwKTsKK30KKwordm9pZCB1bnJlZ2lzdGVyX3dsYWdzX3N5c2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCit7CisgICAgc3RydWN0IGRldmljZSAqZGV2ID0gJihuZXQtPmRldik7CisgICAgc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihuZXQpOworCisgICAgaWYgKGxwLT5zeXNmc0NyZWF0ZWQpCisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmtvYmosICZ3bGFnc19ncm91cCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9zeXNmcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfc3lzZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk2ZDAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfc3lzZnMuaApAQCAtMCwwICsxLDcgQEAKKyNpZmRlZiBDT05GSUdfU1lTRlMKK2V4dGVybiB2b2lkIHJlZ2lzdGVyX3dsYWdzX3N5c2ZzKHN0cnVjdCBuZXRfZGV2aWNlICopOworZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl93bGFnc19zeXNmcyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKyNlbHNlCitzdGF0aWMgdm9pZCByZWdpc3Rlcl93bGFnc19zeXNmcyhzdHJ1Y3QgbmV0X2RldmljZSAqKSB7IHJldHVybjsgfTsKK3N0YXRpYyB2b2lkIHVucmVnaXN0ZXJfd2xhZ3Nfc3lzZnMoc3RydWN0IG5ldF9kZXZpY2UgKikgeyByZXR1cm47IH07CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3V0aWwuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzFlN2YzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfdXRpbC5jCkBAIC0wLDAgKzEsMTU4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIFRoaXMgZmlsZSBkZWZpbmVzIG1pc2MgdXRpbGl0eSBmdW5jdGlvbnMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPHdsX3ZlcnNpb24uaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisvLyAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKy8vICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L2luLmg+CisvLyAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKy8vICNpbmNsdWRlIDxhc20vaW8uaD4KKy8vICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisvLyAjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2luY2x1ZGUgPGRlYnVnLmg+CisjaW5jbHVkZSA8aGNmLmg+CisvLyAjaW5jbHVkZSA8aGNmZGVmLmg+CisKKyNpbmNsdWRlIDx3bF9pZi5oPgorI2luY2x1ZGUgPHdsX2ludGVybmFsLmg+CisjaW5jbHVkZSA8d2xfdXRpbC5oPgorI2luY2x1ZGUgPHdsX3dleHQuaD4KKyNpbmNsdWRlIDx3bF9tYWluLmg+CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2xvYmFsIHZhcmlhYmxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQSBtYXRyaXggd2hpY2ggbWFwcyBjaGFubmVscyB0byBmcmVxdWVuY2llcyAqLworI2RlZmluZSBNQVhfQ0hBTl9GUkVRX01BUF9FTlRSSUVTICAgNTAKK3N0YXRpYyBjb25zdCBsb25nIGNoYW5fZnJlcV9saXN0W11bTUFYX0NIQU5fRlJFUV9NQVBfRU5UUklFU10gPQoreworICAgIHsxLDI0MTJ9LAorICAgIHsyLDI0MTd9LAorICAgIHszLDI0MjJ9LAorICAgIHs0LDI0Mjd9LAorICAgIHs1LDI0MzJ9LAorICAgIHs2LDI0Mzd9LAorICAgIHs3LDI0NDJ9LAorICAgIHs4LDI0NDd9LAorICAgIHs5LDI0NTJ9LAorICAgIHsxMCwyNDU3fSwKKyAgICB7MTEsMjQ2Mn0sCisgICAgezEyLDI0Njd9LAorICAgIHsxMywyNDcyfSwKKyAgICB7MTQsMjQ4NH0sCisgICAgezM2LDUxODB9LAorICAgIHs0MCw1MjAwfSwKKyAgICB7NDQsNTIyMH0sCisgICAgezQ4LDUyNDB9LAorICAgIHs1Miw1MjYwfSwKKyAgICB7NTYsNTI4MH0sCisgICAgezYwLDUzMDB9LAorICAgIHs2NCw1MzIwfSwKKyAgICB7MTQ5LDU3NDV9LAorICAgIHsxNTMsNTc2NX0sCisgICAgezE1Nyw1Nzg1fSwKKyAgICB7MTYxLDU4MDV9Cit9OworCisjaWYgREJHCitleHRlcm4gZGJnX2luZm9fdCAqRGJnSW5mbzsKKyNlbmRpZiAgLyogREJHICovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglkYm0oKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBSZXR1cm4gYW4gZW5lcmd5IHZhbHVlIGluIGRCbS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHZhbHVlIC0gdGhlIGVuZXJneSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIHRoZSB2YWx1ZSBpbiBkQm0KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRibSggaW50IHZhbHVlICkKK3sKKyAgICAvKiBUcnVuY2F0ZSB0aGUgdmFsdWUgdG8gYmUgYmV0d2VlbiBtaW4gYW5kIG1heC4gKi8KKyAgICBpZiggdmFsdWUgPCBIQ0ZfTUlOX1NJR05BTF9MRVZFTCApCisgICAgICAgIHZhbHVlID0gSENGX01JTl9TSUdOQUxfTEVWRUw7CisKKyAgICBpZiggdmFsdWUgPiBIQ0ZfTUFYX1NJR05BTF9MRVZFTCApCisgICAgICAgIHZhbHVlID0gSENGX01BWF9TSUdOQUxfTEVWRUw7CisKKyAgICAvKiBSZXR1cm4gdGhlIGVuZXJneSB2YWx1ZSBpbiBkQm0uICovCisgICAgcmV0dXJuICggdmFsdWUgLSBIQ0ZfMERCTV9PRkZTRVQgKTsKK30gLy8gZGJtCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJcGVyY2VudCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFJldHVybiBhIHZhbHVlIGFzIGEgcGVyY2VudGFnZSBvZiBtaW4gdG8gbWF4LgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgdmFsdWUgICAtIHRoZSB2YWx1ZSBpbiBxdWVzdGlvbgorICogICAgICBtaW4gICAgIC0gdGhlIG1pbmltdW0gcmFuZ2UgdmFsdWUKKyAqICAgICAgbWF4ICAgICAtIHRoZSBtYXhpbXVtIHJhbmdlIHZhbHVlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICB0aGUgcGVyY2VudGFnZSB2YWx1ZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgcGVyY2VudCggaW50IHZhbHVlLCBpbnQgbWluLCBpbnQgbWF4ICkKK3sKKyAgICAvKiBUcnVuY2F0ZSB0aGUgdmFsdWUgdG8gYmUgYmV0d2VlbiBtaW4gYW5kIG1heC4gKi8KKyAgICBpZiggdmFsdWUgPCBtaW4gKQorICAgICAgICB2YWx1ZSA9IG1pbjsKKworICAgIGlmKCB2YWx1ZSA+IG1heCApCisgICAgICAgIHZhbHVlID0gbWF4OworCisgICAgLyogUmV0dXJuIHRoZSB2YWx1ZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgbWluIHRvIG1heC4gKi8KKyAgICByZXR1cm4gKCgoIHZhbHVlIC0gbWluICkgKiAxMDAgKSAvICggbWF4IC0gbWluICkpOworfSAvLyBwZXJjZW50CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJaXNfdmFsaWRfa2V5X3N0cmluZygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENoZWNrcyB0byBkZXRlcm1pbmUgaWYgdGhlIFdFUCBrZXkgc3RyaW5nIGlzIHZhbGlkCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBzIC0gdGhlIHN0cmluZyBpbiBxdWVzdGlvbgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgbm9uLXplcm8gaWYgdGhlIHN0cmluZyBjb250YWlucyBhIHZhbGlkIGtleQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgaXNfdmFsaWRfa2V5X3N0cmluZyggY2hhciAqcyApCit7CisgICAgaW50IGw7CisgICAgaW50IGk7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICBsID0gc3RybGVuKCBzICk7CisKKyAgICAvKiAweCBmb2xsb3dlZCBieSA1IG9yIDEzIGhleGFkZWNpbWFsIGRpZ2l0IHBhaXJzIGlzIHZhbGlkICovCisgICAgaWYoIHNbMF0gPT0gJzAnICYmICggc1sxXSA9PSAneCcgfHwgc1sxXSA9PSAnWCcgKSkgeworICAgICAgICBpZiggbCA9PSAxMiB8fCBsID09IDI4ICkgeworICAgICAgICAgICAgZm9yKCBpID0gMjsgaSA8IGw7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCBzW2ldICkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogc3RyaW5nIHdpdGggMCwgNSwgb3IgMTMgY2hhcmFjdGVycyBpcyB2YWxpZCAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiggbCA9PSAwIHx8IGwgPT0gNSB8fCBsID09IDEzICk7CisgICAgfQorfSAvLyBpc192YWxpZF9rZXlfc3RyaW5nCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJaGV4ZGlnaXQyaW50KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ29udmVydHMgYSBoZXhhZGVjaW1hbCBkaWdpdCBjaGFyYWN0ZXIgdG8gYW4gaW50ZWdlcgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgYyAgIC0gdGhlIGhleGFkZWNpbWFsIGRpZ2l0IGNoYXJhY3RlcgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBoZXhkaWdpdDJpbnQoIGNoYXIgYyApCit7CisgICBpZiggYyA+PSAnMCcgJiYgYyA8PSAnOScgKQorICAgICAgIHJldHVybiBjIC0gJzAnOworCisgICBpZiggYyA+PSAnQScgJiYgYyA8PSAnRicgKQorICAgICAgIHJldHVybiBjIC0gJ0EnICsgMTA7CisKKyAgIGlmKCBjID49ICdhJyAmJiBjIDw9ICdmJyApCisgICAgICAgcmV0dXJuIGMgLSAnYScgKyAxMDsKKworICAgcmV0dXJuIDA7Cit9IC8vIGhleGRpZ2l0MmludAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCWtleV9zdHJpbmcya2V5KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ29udmVydHMgYSBrZXlfc3RyaW5nIHRvIGEga2V5LCBBc3N1bWVzIHRoZSBrZXlfc3RyaW5nIGlzIHZhbGlkYXRlZCB3aXRoCisgKiAgaXNfdmFsaWRfa2V5X3N0cmluZygpLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAga3MgIC0gdGhlIHZhbGlkIGtleSBzdHJpbmcKKyAqICAgICAga2V5IC0gYSBwb2ludGVyIHRvIGEgS0VZX1NUUlVDVCB3aGVyZSB0aGUgY29udmVydGVkIGtleSBpbmZvcm1hdGlvbiB3aWxsCisgKiAgICAgICAgICAgIGJlIHN0b3JlZC4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGtleV9zdHJpbmcya2V5KCBjaGFyICprcywgS0VZX1NUUkNUICprZXkgKQoreworICAgIGludCBsLGksbjsKKyAgICBjaGFyICpwOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgbCA9IHN0cmxlbigga3MgKTsKKworICAgIC8qIDB4IGZvbGxvd2VkIGJ5IGhleGFkZWNpbWFsIGRpZ2l0IHBhaXJzICovCisgICAgaWYoIGtzWzBdID09ICcwJyAmJiAoIGtzWzFdID09ICd4JyB8fCBrc1sxXSA9PSAnWCcgKSkgeworICAgICAgICBuID0gMDsKKyAgICAgICAgcCA9IChjaGFyICopa2V5LT5rZXk7CisKKyAgICAgICAgZm9yKCBpID0gMjsgaSA8IGw7IGkrPTIgKSB7CisgICAgICAgICAgICpwKysgPSAoIGhleGRpZ2l0MmludCgga3NbaV0gKSA8PCA0ICkgKyBoZXhkaWdpdDJpbnQgKGtzW2krMV0gKTsKKyAgICAgICAgICAgbisrOworICAgICAgICB9CisKKyAgICAgICAgLyogTm90ZSB0aGF0IGVuZGlhbiB0cmFuc2xhdGlvbiBvZiB0aGUgbGVuZ3RoIGZpZWxkIGlzIG5vdCBuZWVkZWQgaGVyZQorICAgICAgICAgIGJlY2F1c2UgaXQncyBwZXJmb3JtZWQgaW4gd2xfcHV0X2x0digpICovCisgICAgICAgIGtleS0+bGVuID0gbjsKKyAgICB9CisgICAgLyogY2hhcmFjdGVyIHN0cmluZyAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0cmNweSggKGNoYXIgKilrZXktPmtleSwga3MgKTsKKyAgICAgICAga2V5LT5sZW4gPSBsOworICAgIH0KKworICAgIHJldHVybjsKK30gLy8ga2V5X3N0cmluZzJrZXkKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKyNpZiBEQkcKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglEYmdId0FkZHIoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDb252ZXJ0IGEgaGFyZHdhcmUgZXRoZXJuZXQgYWRkcmVzcyB0byBhIGNoYXJhY3RlciBzdHJpbmcKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGh3QWRkciAgLSBhbiBldGhlcm5ldCBhZGRyZXNzCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBldGhlcm5ldCBhZGRyZXNzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NvbnN0IGNoYXIgKkRiZ0h3QWRkcih1bnNpZ25lZCBjaGFyICpod0FkZHIpCit7CisgICAgc3RhdGljIGNoYXIgICAgIGJ1ZmZlclsxOF07CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICBzcHJpbnRmKCBidWZmZXIsICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCisgICAgICAgICAgICAgaHdBZGRyWzBdLCBod0FkZHJbMV0sIGh3QWRkclsyXSwgaHdBZGRyWzNdLCBod0FkZHJbNF0sIGh3QWRkcls1XSApOworCisgICAgcmV0dXJuIGJ1ZmZlcjsKK30gLy8gRGJnSHdBZGRyCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZW5kaWYgLyogREJHICovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9oYXNfd2VwKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZGV2aWNlIHN1cHBvcnRzIFdFUAorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgaWZicCAgICAtIHRoZSBJRkIgcG9pbnRlciBvZiB0aGUgZGV2aWNlIGluIHF1ZXN0aW9uCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAxIGlmIFdFUCBpcyBrbm93biBlbmFibGVkLCBlbHNlIDAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2hhc193ZXAgKElGQlAgaWZicCkKK3sKKyAgICBDRkdfUFJJVkFDWV9PUFRfSU1QTEVNRU5URURfU1RSQ1QgbHR2OworCWludCByYywgcHJpdmFjeTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCS8qIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHVzIHRvIGRpc3RpZ3Vpc2ggYnJvbnplIGNhcmRzIGZyb20gb3RoZXIgdHlwZXMsIHRvCisgICAgICAga25vdyBpZiBXRVAgZXhpc3RzLiBEb2VzIG5vdCBkaXN0aW5ndWlzaCAoYmVjYXVzZSB0aGVyZSdzIG5vIHdheSB0bykKKyAgICAgICBiZXR3ZWVuIHNpbHZlciBhbmQgZ29sZCBjYXJkcy4gKi8KKyAgICBsdHYubGVuID0gMjsKKyAgICBsdHYudHlwID0gQ0ZHX1BSSVZBQ1lfT1BUX0lNUExFTUVOVEVEOworCisJcmMgPSBoY2ZfZ2V0X2luZm8oIGlmYnAsIChMVFZQKSAmbHR2ICk7CisKKwlwcml2YWN5ID0gQ05WX0xJVFRMRV9UT19JTlQoIGx0di5wcml2YWN5X29wdF9pbXBsZW1lbnRlZCApOworCisJLy9yZXR1cm4gcmMgPyAwIDogcHJpdmFjeTsKKyAgICByZXR1cm4gMTsKK30gLy8gd2xfaGFzX3dlcAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2hjZl9lcnJvcigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFJlcG9ydCB0aGUgdHlwZSBvZiBIQ0YgZXJyb3IgbWVzc2FnZQorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbm9uZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgQSBkZXNjcmlwdGl2ZSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgZXJyb3IsIHF1aWV0IG90aGVyd2lzZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9oY2ZfZXJyb3IoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBoY2ZTdGF0dXMgKQoreworICAgIGNoYXIgICAgIGJ1ZmZlcls2NF0sICpwTXNnOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgaWYoIGhjZlN0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKKyAgICAgICAgc3dpdGNoKCBoY2ZTdGF0dXMgKSB7CisKKyAgICAgICAgY2FzZSBIQ0ZfRVJSX1RJTUVfT1VUOgorCisgICAgICAgICAgICBwTXNnID0gIkV4cGVjdGVkIGFkYXB0ZXIgZXZlbnQgZGlkIG5vdCBvY2N1ciBpbiBleHBlY3RlZCB0aW1lIjsKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBIQ0ZfRVJSX05PX05JQzoKKworICAgICAgICAgICAgcE1zZyA9ICJDYXJkIG5vdCBmb3VuZCAoZWplY3RlZCB1bmV4cGVjdGVkbHkpIjsKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBIQ0ZfRVJSX0xFTjoKKworICAgICAgICAgICAgcE1zZyA9ICJDb21tYW5kIGJ1ZmZlciBzaXplIGluc3VmZmljaWVudCI7CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgSENGX0VSUl9JTkNPTVBfUFJJOgorCisgICAgICAgICAgICBwTXNnID0gIlByaW1hcnkgZnVuY3Rpb25zIGFyZSBub3QgY29tcGF0aWJsZSI7CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgSENGX0VSUl9JTkNPTVBfRlc6CisKKyAgICAgICAgICAgIHBNc2cgPSAiUHJpbWFyeSBmdW5jdGlvbnMgYXJlIGNvbXBhdGlibGUsICIKKyAgICAgICAgICAgICAgICAic3RhdGlvbi9hcCBmdW5jdGlvbnMgYXJlIG5vdCI7CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgSENGX0VSUl9CVVNZOgorCisgICAgICAgICAgICBwTXNnID0gIklucXVpcmUgY21kIHdoaWxlIGFub3RoZXIgSW5xdWlyZSBpbiBwcm9ncmVzcyI7CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIC8vY2FzZSBIQ0ZfRVJSX1NFUV9CVUc6CisKKyAgICAgICAgLy8gICAgcE1zZyA9ICJVbmV4cGVjdGVkIGNvbW1hbmQgY29tcGxldGVkIjsKKyAgICAgICAgLy8gICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIEhDRl9FUlJfREVGVU5DVF9BVVg6CisKKyAgICAgICAgICAgIHBNc2cgPSAiVGltZW91dCBvbiBhY2sgZm9yIGVuYWJsZS9kaXNhYmxlIG9mIEFVWCByZWdpc3RlcnMiOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIEhDRl9FUlJfREVGVU5DVF9USU1FUjoKKyAgICAgICAgICAgIHBNc2cgPSAiVGltZW91dCBvbiB0aW1lciBjYWxpYnJhdGlvbiBkdXJpbmcgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyI7CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgSENGX0VSUl9ERUZVTkNUX1RJTUVfT1VUOgorICAgICAgICAgICAgcE1zZyA9ICJUaW1lb3V0IG9uIEJ1c3kgYml0IGRyb3AgZHVyaW5nIEJBUCBzZXR1cCI7CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgSENGX0VSUl9ERUZVTkNUX0NNRF9TRVE6CisgICAgICAgICAgICBwTXNnID0gIkhlcm1lcyBhbmQgSENGIGFyZSBvdXQgb2Ygc3luYyI7CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGRlZmF1bHQ6CisKKyAgICAgICAgICAgIHNwcmludGYoIGJ1ZmZlciwgIkVycm9yIGNvZGUgJWQiLCBoY2ZTdGF0dXMgKTsKKyAgICAgICAgICAgIHBNc2cgPSBidWZmZXI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHByaW50ayggS0VSTl9JTkZPICIlczogV2lyZWxlc3MsIEhDRiBmYWlsdXJlOiBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBwTXNnICk7CisgICAgfQorfSAvLyB3bF9oY2ZfZXJyb3IKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9lbmRpYW5fdHJhbnNsYXRlX2V2ZW50KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgRGV0ZXJtaW5lcyB3aGF0IHR5cGUgb2YgZGF0YSBpcyBpbiB0aGUgbWFpbGJveCBhbmQgcGVyZm9ybXMgdGhlIHByb3BlcgorICogIGVuZGlhbiB0cmFuc2xhdGlvbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHBMdHYgLSBhbiBMVFYgcG9pbnRlcgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfZW5kaWFuX3RyYW5zbGF0ZV9ldmVudCggbHR2X3QgKnBMdHYgKQoreworICAgIERCR19GVU5DKCAid2xfZW5kaWFuX3RyYW5zbGF0ZV9ldmVudCIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCisgICAgc3dpdGNoKCBwTHR2LT50eXAgKSB7CisgICAgY2FzZSBDRkdfVEFMTElFUzoKKyAgICAgICAgYnJlYWs7CisKKworICAgIGNhc2UgQ0ZHX1NDQU46CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBudW1BUHM7CisgICAgICAgICAgICBTQ0FOX1JTX1NUUkNUICpwQXBzID0gKFNDQU5fUlNfU1RSQ1QqKSZwTHR2LT51LnU4WzBdOworCisgICAgICAgICAgICBudW1BUHMgPSAoaGNmXzE2KSgoIChzaXplX3QpKCBwTHR2LT5sZW4gLSAxICkgKiAyICkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKCBTQ0FOX1JTX1NUUkNUICkpKTsKKworICAgICAgICAgICAgd2hpbGUoIG51bUFQcyA+PSAxICkgeworICAgICAgICAgICAgICAgIG51bUFQcy0tOworCisgICAgICAgICAgICAgICAgcEFwc1tudW1BUHNdLmNoYW5uZWxfaWQgICAgICAgICAgID0KKyAgICAgICAgICAgICAgICAgICAgQ05WX0xJVFRMRV9UT19JTlQoIHBBcHNbbnVtQVBzXS5jaGFubmVsX2lkICk7CisKKyAgICAgICAgICAgICAgICBwQXBzW251bUFQc10ubm9pc2VfbGV2ZWwgICAgICAgICAgPQorICAgICAgICAgICAgICAgICAgICBDTlZfTElUVExFX1RPX0lOVCggcEFwc1tudW1BUHNdLm5vaXNlX2xldmVsICk7CisKKyAgICAgICAgICAgICAgICBwQXBzW251bUFQc10uc2lnbmFsX2xldmVsICAgICAgICAgPQorICAgICAgICAgICAgICAgICAgICBDTlZfTElUVExFX1RPX0lOVCggcEFwc1tudW1BUHNdLnNpZ25hbF9sZXZlbCApOworCisgICAgICAgICAgICAgICAgcEFwc1tudW1BUHNdLmJlYWNvbl9pbnRlcnZhbF90aW1lID0KKyAgICAgICAgICAgICAgICAgICAgQ05WX0xJVFRMRV9UT19JTlQoIHBBcHNbbnVtQVBzXS5iZWFjb25faW50ZXJ2YWxfdGltZSApOworCisgICAgICAgICAgICAgICAgcEFwc1tudW1BUHNdLmNhcGFiaWxpdHkgICAgICAgICAgID0KKyAgICAgICAgICAgICAgICAgICAgQ05WX0xJVFRMRV9UT19JTlQoIHBBcHNbbnVtQVBzXS5jYXBhYmlsaXR5ICk7CisKKyAgICAgICAgICAgICAgICBwQXBzW251bUFQc10uc3NpZF9sZW4gICAgICAgICAgICAgPQorICAgICAgICAgICAgICAgICAgICBDTlZfTElUVExFX1RPX0lOVCggcEFwc1tudW1BUHNdLnNzaWRfbGVuICk7CisKKyAgICAgICAgICAgICAgICBwQXBzW251bUFQc10uc3NpZF92YWxbcEFwc1tudW1BUHNdLnNzaWRfbGVuXSA9IDA7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworCisgICAgY2FzZSBDRkdfQUNTX1NDQU46CisgICAgICAgIHsKKyAgICAgICAgICAgIFBST0JFX1JFU1AgKnByb2JlX3Jlc3AgPSAoUFJPQkVfUkVTUCAqKXBMdHY7CisKKyAgICAgICAgICAgIHByb2JlX3Jlc3AtPmZyYW1lQ29udHJvbCAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmZyYW1lQ29udHJvbCApOworICAgICAgICAgICAgcHJvYmVfcmVzcC0+ZHVySUQgICAgICAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+ZHVySUQgKTsKKyAgICAgICAgICAgIHByb2JlX3Jlc3AtPnNlcXVlbmNlICAgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPnNlcXVlbmNlICk7CisgICAgICAgICAgICBwcm9iZV9yZXNwLT5kYXRhTGVuZ3RoICAgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5kYXRhTGVuZ3RoICk7CisKKyNpZm5kZWYgV0FSUAorICAgICAgICAgICAgcHJvYmVfcmVzcC0+bGVuVHlwZSAgICAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+bGVuVHlwZSApOworI2VuZGlmIC8vIFdBUlAKKworICAgICAgICAgICAgcHJvYmVfcmVzcC0+YmVhY29uSW50ZXJ2YWwgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+YmVhY29uSW50ZXJ2YWwgKTsKKyAgICAgICAgICAgIHByb2JlX3Jlc3AtPmNhcGFiaWxpdHkgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmNhcGFiaWxpdHkgKTsKKyAgICAgICAgICAgIHByb2JlX3Jlc3AtPmZsYWdzICAgICAgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmZsYWdzICk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKworICAgIGNhc2UgQ0ZHX0xJTktfU1RBVDoKKyNkZWZpbmUgbHMgKChMSU5LX1NUQVRVU19TVFJDVCAqKXBMdHYpCisgICAgICAgICAgICBscy0+bGlua1N0YXR1cyA9IENOVl9MSVRUTEVfVE9fSU5UKCBscy0+bGlua1N0YXR1cyApOworICAgICAgICBicmVhazsKKyN1bmRlZiBscworCisgICAgY2FzZSBDRkdfQVNTT0NfU1RBVDoKKyAgICAgICAgeworICAgICAgICAgICAgQVNTT0NfU1RBVFVTX1NUUkNUICpwQXMgPSAoQVNTT0NfU1RBVFVTX1NUUkNUICopcEx0djsKKworICAgICAgICAgICAgcEFzLT5hc3NvY1N0YXR1cyA9IENOVl9MSVRUTEVfVE9fSU5UKCBwQXMtPmFzc29jU3RhdHVzICk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKworICAgIGNhc2UgQ0ZHX1NFQ1VSSVRZX1NUQVQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIFNFQ1VSSVRZX1NUQVRVU19TVFJDVCAqcFNzID0gKFNFQ1VSSVRZX1NUQVRVU19TVFJDVCAqKXBMdHY7CisKKyAgICAgICAgICAgIHBTcy0+c2VjdXJpdHlTdGF0dXMgPSBDTlZfTElUVExFX1RPX0lOVCggcFNzLT5zZWN1cml0eVN0YXR1cyApOworICAgICAgICAgICAgcFNzLT5yZWFzb24gICAgICAgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBwU3MtPnJlYXNvbiApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisKKyAgICBjYXNlIENGR19XTVA6CisgICAgICAgIGJyZWFrOworCisKKyAgICBjYXNlIENGR19OVUxMOgorICAgICAgICBicmVhazsKKworCisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuOworfSAvLyB3bF9lbmRpYW5fdHJhbnNsYXRlX2V2ZW50CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgltc2ZfYXNzZXJ0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUHJpbnQgc3RhdGVtZW50IHVzZWQgdG8gZGlzcGxheSBhc3NlcnRzIGZyb20gd2l0aGluIHRoZSBIQ0YuIE9ubHkgY2FsbGVkCisgKiAgd2hlbiBhc3NlcnRzIGluIHRoZSBIQ0YgYXJlIHR1cm5lZCBvbi4gU2VlIGhjZmNmZy5oIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZmlsZV9uYW1lcCAgLSB0aGUgZmlsZW5hbWUgaW4gd2hpY2ggdGhlIGFzc2VydCBvY2N1cnJlZC4KKyAqICAgICAgbGluZV9udW1iZXIgLSB0aGUgbGluZSBudW1iZXIgb24gd2hpY2ggdGhlIGFzc2VydCBvY2N1cnJlZC4KKyAqICAgICAgdHJhY2UgICAgICAgLSBhIGNvbW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NlcnQuCisgKiAgICAgIHF1YWwgICAgICAgIC0gcmV0dXJuIGNvZGUgb3Igb3RoZXIgdmFsdWUgcmVsYXRlZCB0byB0aGUgYXNzZXJ0CisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtc2ZfYXNzZXJ0KCB1bnNpZ25lZCBpbnQgbGluZV9udW1iZXIsIGhjZl8xNiB0cmFjZSwgaGNmXzMyIHF1YWwgKQoreworICAgIERCR19QUklOVCggIkhDRiBBU1NFUlQ6IExpbmUgJWQsIFZBTDogMHglLjh4XG4iLCBsaW5lX251bWJlciwgLyo7PyovKHUzMilxdWFsICk7Cit9IC8vIG1zZl9hc3NlcnQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wYXJzZV9kc19pZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSBEaXJlY3QgU2VxdWVuY2UgUGFyYW1ldGVyIFNldCBJRSwgdXNlZCB0bworICogICAgICBkZXRlcm1pbmUgY2hhbm5lbC9mcmVxdWVuY3kgaW5mb3JtYXRpb24uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwcm9iZV9yc3AgLSBhIHBvaW50ZXIgdG8gYSBQUk9CRV9SRVNQIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBwcm9iZQorICogICAgICAgICAgICAgICAgICByZXNwb25zZS4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIFRoZSBjaGFubmVsIG9uIHdoaWNoIHRoZSBCU1MgcmVwcmVzZW50ZWQgYnkgdGhpcyBwcm9iZSByZXNwb25zZSBpcworICogICAgICB0cmFuc21pdHRpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2hjZl84IHdsX3BhcnNlX2RzX2llKCBQUk9CRV9SRVNQICpwcm9iZV9yc3AgKQoreworICAgIGludCAgICAgaTsKKyAgICBpbnQgICAgIGllX2xlbmd0aCA9IDA7CisgICAgaGNmXzggICAqYnVmOworICAgIGhjZl84ICAgYnVmX3NpemU7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICBpZiggcHJvYmVfcnNwID09IE5VTEwgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGJ1ZiAgICAgID0gcHJvYmVfcnNwLT5yYXdEYXRhOworICAgIGJ1Zl9zaXplID0gc2l6ZW9mKCBwcm9iZV9yc3AtPnJhd0RhdGEgKTsKKworCisgICAgZm9yKCBpID0gMDsgaSA8IGJ1Zl9zaXplOyBpKysgKSB7CisgICAgICAgIGlmKCBidWZbaV0gPT0gRFNfSU5GT19FTEVNICkgeworICAgICAgICAgICAgLyogSW5jcmVtZW50IGJ5IDEgdG8gZ2V0IHRoZSBsZW5ndGgsIGFuZCB0ZXN0IGl0OyBpbiBhIERTIGVsZW1lbnQsCisgICAgICAgICAgICAgICBsZW5ndGggc2hvdWxkIGFsd2F5cyBiZSAxICovCisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBpZV9sZW5ndGggPSBidWZbaV07CisKKyAgICAgICAgICAgIGlmKCBidWZbaV0gPT0gMSApIHsKKyAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIGNoYW5uZWwgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIElmIHdlIGdldCBoZXJlLCB3ZSBkaWRuJ3QgZmluZCBhIERTLUlFLCB3aGljaCBpcyBzdHJhbmdlICovCisgICAgcmV0dXJuIDA7Cit9IC8vIHdsX3BhcnNlX2RzX2llCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BhcnNlX3dwYV9pZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSBQcm9iZSBSZXNwb25zZSBmb3IgYSB2YWxpZCBXUEEtSUUuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwcm9iZV9yc3AgLSBhIHBvaW50ZXIgdG8gYSBQUk9CRV9SRVNQIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBwcm9iZQorICogICAgICAgICAgICAgICAgICByZXNwb25zZQorICogICAgICBsZW5ndGggICAgLSBhIHBvaW50ZXIgdG8gYW4gaGNmXzE2IGluIHdoaWNoIHRoZSBzaXplIG9mIHRoZSBXUEEtSUUgd2lsbAorICogICAgICAgICAgICAgICAgICBiZSBzdG9yZWQgKGlmIGZvdW5kKS4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIEEgcG9pbnRlciB0byB0aGUgbG9jYXRpb24gaW4gdGhlIHByb2JlIHJlc3BvbnNlIGJ1ZmZlciB3aGVyZSBhIHZhbGlkCisgKiAgICAgIFdQQS1JRSBsaXZlcy4gVGhlIGxlbmd0aCBvZiB0aGlzIElFIGlzIHdyaXR0ZW4gYmFjayB0byB0aGUgJ2xlbmd0aCcKKyAqICAgICAgYXJndW1lbnQgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaGNmXzggKiB3bF9wYXJzZV93cGFfaWUoIFBST0JFX1JFU1AgKnByb2JlX3JzcCwgaGNmXzE2ICpsZW5ndGggKQoreworICAgIGludCAgICAgaTsKKyAgICBpbnQgICAgIGllX2xlbmd0aCA9IDA7CisgICAgaGNmXzggICAqYnVmOworICAgIGhjZl84ICAgYnVmX3NpemU7CisgICAgaGNmXzggICB3cGFfb3VpW10gPSBXUEFfT1VJX1RZUEU7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICBpZiggcHJvYmVfcnNwID09IE5VTEwgfHwgbGVuZ3RoID09IE5VTEwgKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGJ1ZiAgICAgID0gcHJvYmVfcnNwLT5yYXdEYXRhOworICAgIGJ1Zl9zaXplID0gc2l6ZW9mKCBwcm9iZV9yc3AtPnJhd0RhdGEgKTsKKyAgICAqbGVuZ3RoICA9IDA7CisKKworICAgIGZvciggaSA9IDA7IGkgPCBidWZfc2l6ZTsgaSsrICkgeworICAgICAgICBpZiggYnVmW2ldID09IEdFTkVSSUNfSU5GT19FTEVNICkgeworICAgICAgICAgICAgLyogSW5jcmVtZW50IGJ5IG9uZSB0byBnZXQgdGhlIElFIGxlbmd0aCAqLworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgaWVfbGVuZ3RoID0gcHJvYmVfcnNwLT5yYXdEYXRhW2ldOworCisgICAgICAgICAgICAvKiBJbmNyZW1lbnQgYnkgb25lIHRvIHBvaW50IHRvIHRoZSBJRSBwYXlsb2FkICovCisgICAgICAgICAgICBpKys7CisKKyAgICAgICAgICAgIC8qIERvZXMgdGhlIElFIGNvbnRhaW4gYSBXUEEgT1VJPyBJZiBub3QsIGl0J3MgYSBwcm9wcmlldGFyeSBJRSAqLworICAgICAgICAgICAgaWYoIG1lbWNtcCggJmJ1ZltpXSwgJndwYV9vdWksIFdQQV9TRUxFQ1RPUl9MRU4gKSA9PSAwICkgeworICAgICAgICAgICAgICAgIC8qIFBhc3MgYmFjayBsZW5ndGggYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIFdQQS1JRSAqLworICAgICAgICAgICAgICAgIC8qIE5PVEU6IExlbmd0aCBjb250YWluZWQgaW4gdGhlIFdQQS1JRSBpcyBvbmx5IHRoZSBsZW5ndGggb2YKKyAgICAgICAgICAgICAgICAgICB0aGUgcGF5bG9hZC4gVGhlIGVudGlyZSBXUEEtSUUsIGluY2x1ZGluZyB0aGUgSUUgaWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgbGVuZ3RoLCBpcyAyIGJ5dGVzIGxhcmdlciAqLworICAgICAgICAgICAgICAgICpsZW5ndGggPSBpZV9sZW5ndGggKyAyOworCisgICAgICAgICAgICAgICAgLyogQmFjayB1cCB0aGUgcG9pbnRlciAyIGJ5dGVzIHRvIGluY2x1ZGUgdGhlIElFIGlkZW50aWZpZXIgYW5kCisgICAgICAgICAgICAgICAgICAgdGhlIGxlbmd0aCBpbiB0aGUgYnVmZmVyIHJldHVybmVkICovCisgICAgICAgICAgICAgICAgaSAtPSAyOworICAgICAgICAgICAgICAgIHJldHVybiAmYnVmW2ldOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJbmNyZW1lbnQgcGFzdCB0aGlzIG5vbi1XUEEgSUUgYW5kIGNvbnRpbnVlIGxvb2tpbmcgKi8KKyAgICAgICAgICAgIGkgKz0gKCBpZV9sZW5ndGggLSAxICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiB3ZSdyZSBoZXJlLCB3ZSBkaWRuJ3QgZmluZCBhIFdQQS1JRSBpbiB0aGUgYnVmZmVyICovCisgICAgcmV0dXJuIE5VTEw7Cit9IC8vIHdsX3BhcnNlX3dwYV9pZQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wcmludF93cGFfaWUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBGdW5jdGlvbiB1c2VkIHRvIHRha2UgYSBXUEEgSW5mb3JtYXRpb24gRWxlbWVudCAoV1BBLUlFKSBidWZmZXIgYW5kCisgKiAgICAgIGRpc3BsYXkgaXQgaW4gYSByZWFkYWJsZSBmb3JtYXQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBidWZmZXIgLSB0aGUgYnl0ZSBidWZmZXIgY29udGFpbmluZyB0aGUgV1BBLUlFCisgKiAgICAgIGxlbmd0aCAtIHRoZSBsZW5ndGggb2YgdGhlIGFib3ZlIGJ1ZmZlcgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgQSBwb2ludGVyIHRvIHRoZSBmb3JtYXR0ZWQgV1BBLUlFIHN0cmluZy4gTm90ZSB0aGF0IHRoZSBmb3JtYXQgdXNlZCBpcworICogICAgICBieXRlLWJ5LWJ5dGUgcHJpbnRpbmcgYXMgJTAyeCBoZXggdmFsdWVzIHdpdGggbm8gc3BhY2VzLiBUaGlzIGlzCisgKiAgICAgIHJlcXVpcmVkIGZvciBwcm9wZXIgb3BlcmF0aW9uIHdpdGggc29tZSBXUEEgc3VwcGxpY2FudHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2hjZl84ICogd2xfcHJpbnRfd3BhX2llKCBoY2ZfOCAqYnVmZmVyLCBpbnQgbGVuZ3RoICkKK3sKKyAgICBpbnQgY291bnQ7CisgICAgaW50IHJvd3M7CisgICAgaW50IHJlbWFpbmRlcjsKKyAgICBpbnQgcm93c2l6ZSA9IDQ7CisgICAgaGNmXzggcm93X2J1Zls2NF07CisgICAgc3RhdGljIGhjZl84IG91dHB1dFs1MTJdOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgbWVtc2V0KCBvdXRwdXQsIDAsIHNpemVvZiggb3V0cHV0ICkpOworICAgIG1lbXNldCggcm93X2J1ZiwgMCwgc2l6ZW9mKCByb3dfYnVmICkpOworCisKKyAgICAvKiBEZXRlcm1pbmUgaG93IG1hbnkgcm93cyB3aWxsIGJlIG5lZWRlZCwgYW5kIHRoZSByZW1haW5kZXIgKi8KKyAgICByb3dzID0gbGVuZ3RoIC8gcm93c2l6ZTsKKyAgICByZW1haW5kZXIgPSBsZW5ndGggJSByb3dzaXplOworCisKKyAgICAvKiBGb3JtYXQgdGhlIHJvd3MgKi8KKyAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCByb3dzOyBjb3VudCsrICkgeworICAgICAgICBzcHJpbnRmKCByb3dfYnVmLCAiJTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICAgICAgIGJ1ZmZlcltjb3VudCpyb3dzaXplXSwgYnVmZmVyW2NvdW50KnJvd3NpemUrMV0sCisgICAgICAgICAgICAgICAgIGJ1ZmZlcltjb3VudCpyb3dzaXplKzJdLCBidWZmZXJbY291bnQqcm93c2l6ZSszXSk7CisgICAgICAgIHN0cmNhdCggb3V0cHV0LCByb3dfYnVmICk7CisgICAgfQorCisgICAgbWVtc2V0KCByb3dfYnVmLCAwLCBzaXplb2YoIHJvd19idWYgKSk7CisKKworICAgIC8qIEZvcm1hdCB0aGUgcmVtYWluZGVyICovCisgICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgcmVtYWluZGVyOyBjb3VudCsrICkgeworICAgICAgICBzcHJpbnRmKCByb3dfYnVmLCAiJTAyeCIsIGJ1ZmZlclsocm93cypyb3dzaXplKStjb3VudF0pOworICAgICAgICBzdHJjYXQoIG91dHB1dCwgcm93X2J1ZiApOworICAgIH0KKworICAgIHJldHVybiBvdXRwdXQ7Cit9IC8vIHdsX3ByaW50X3dwYV9pZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2lzX2FfdmFsaWRfY2hhbigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENoZWNrcyBpZiBhIGdpdmVuIGNoYW5uZWwgaXMgdmFsaWQKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGNoYW5uZWwgLSB0aGUgY2hhbm5lbAorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMSBpZiBUUlVFCisgKiAgICAgIDAgaWYgRkFMU0UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2lzX2FfdmFsaWRfY2hhbiggaW50IGNoYW5uZWwgKQoreworICAgIGludCBpOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgLyogU3RyaXAgb3V0IHRoZSBoaWdoIGJpdCBzZXQgYnkgdGhlIEZXIGZvciA4MDIuMTFhIGNoYW5uZWxzICovCisgICAgaWYoIGNoYW5uZWwgJiAweDEwMCApIHsKKyAgICAgICAgY2hhbm5lbCA9IGNoYW5uZWwgJiAweDBGRjsKKyAgICB9CisKKyAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIG1hdHJpeCBhbmQgcmV0cmlldmUgdGhlIGZyZXF1ZW5jeSAqLworICAgIGZvciggaSA9IDA7IGkgPCBNQVhfQ0hBTl9GUkVRX01BUF9FTlRSSUVTOyBpKysgKSB7CisgICAgICAgIGlmKCBjaGFuX2ZyZXFfbGlzdFtpXVswXSA9PSBjaGFubmVsICkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30gLy8gd2xfaXNfYV92YWxpZF9jaGFuCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfZ2V0X2NoYW5fZnJvbV9mcmVxKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ2hlY2tzIGlmIGEgZ2l2ZW4gZnJlcXVlbmN5IGlzIHZhbGlkCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBmcmVxIC0gdGhlIGZyZXF1ZW5jeQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMSBpZiBUUlVFCisgKiAgICAgIDAgaWYgRkFMU0UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2lzX2FfdmFsaWRfZnJlcSggbG9uZyBmcmVxdWVuY3kgKQoreworICAgIGludCBpOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBtYXRyaXggYW5kIHJldHJpZXZlIHRoZSBjaGFubmVsICovCisgICAgZm9yKCBpID0gMDsgaSA8IE1BWF9DSEFOX0ZSRVFfTUFQX0VOVFJJRVM7IGkrKyApIHsKKyAgICAgICAgaWYoIGNoYW5fZnJlcV9saXN0W2ldWzFdID09IGZyZXF1ZW5jeSApIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9IC8vIHdsX2lzX2FfdmFsaWRfZnJlcQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2dldF9mcmVxX2Zyb21fY2hhbigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIHVzZWQgdG8gbG9vayB1cCB0aGUgZnJlcXVlbmN5IGZvciBhIGdpdmVuIGNoYW5uZWwgb24gd2hpY2ggdGhlCisgKiAgICAgIGFkYXB0ZXIgaXMgVHgvUnguCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBjaGFubmVsIC0gdGhlIGNoYW5uZWwKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIFRoZSBjb3JyZXNwb25kaW5nIGZyZXF1ZW5jeQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitsb25nIHdsX2dldF9mcmVxX2Zyb21fY2hhbiggaW50IGNoYW5uZWwgKQoreworICAgIGludCBpOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgLyogU3RyaXAgb3V0IHRoZSBoaWdoIGJpdCBzZXQgYnkgdGhlIEZXIGZvciA4MDIuMTFhIGNoYW5uZWxzICovCisgICAgaWYoIGNoYW5uZWwgJiAweDEwMCApIHsKKyAgICAgICAgY2hhbm5lbCA9IGNoYW5uZWwgJiAweDBGRjsKKyAgICB9CisKKyAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIG1hdHJpeCBhbmQgcmV0cmlldmUgdGhlIGZyZXF1ZW5jeSAqLworICAgIGZvciggaSA9IDA7IGkgPCBNQVhfQ0hBTl9GUkVRX01BUF9FTlRSSUVTOyBpKysgKSB7CisgICAgICAgIGlmKCBjaGFuX2ZyZXFfbGlzdFtpXVswXSA9PSBjaGFubmVsICkgeworICAgICAgICAgICAgcmV0dXJuIGNoYW5fZnJlcV9saXN0W2ldWzFdOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9IC8vIHdsX2dldF9mcmVxX2Zyb21fY2hhbgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2dldF9jaGFuX2Zyb21fZnJlcSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIHVzZWQgdG8gbG9vayB1cCB0aGUgY2hhbm5lbCBmb3IgYSBnaXZlbiBmcmVxdWVuY3kgb24gd2hpY2ggdGhlCisgKiAgICAgIGFkYXB0ZXIgaXMgVHgvUnguCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBmcmVxdWVuY3kgLSB0aGUgZnJlcXVlbmN5CisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBUaGUgY29ycmVzcG9uZGluZyBjaGFubmVsCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9nZXRfY2hhbl9mcm9tX2ZyZXEoIGxvbmcgZnJlcXVlbmN5ICkKK3sKKyAgICBpbnQgaTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbWF0cml4IGFuZCByZXRyaWV2ZSB0aGUgY2hhbm5lbCAqLworICAgIGZvciggaSA9IDA7IGkgPCBNQVhfQ0hBTl9GUkVRX01BUF9FTlRSSUVTOyBpKysgKSB7CisgICAgICAgIGlmKCBjaGFuX2ZyZXFfbGlzdFtpXVsxXSA9PSBmcmVxdWVuY3kgKSB7CisgICAgICAgICAgICByZXR1cm4gY2hhbl9mcmVxX2xpc3RbaV1bMF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30gLy8gd2xfZ2V0X2NoYW5fZnJvbV9mcmVxCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcHJvY2Vzc19saW5rX3N0YXR1cygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFByb2Nlc3MgdGhlIGxpbmsgc3RhdHVzIG1lc3NhZ2Ugc2lnbmFsZWQgYnkgdGhlIGRldmljZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfcHJvY2Vzc19saW5rX3N0YXR1cyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKyAgICBoY2ZfMTYgbGlua19zdGF0OworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfcHJvY2Vzc19saW5rX3N0YXR1cyIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIGlmKCBscCAhPSBOVUxMICkgeworICAgICAgICAvL2xpbmtfc3RhdCA9IGxwLT5oY2ZDdHguSUZCX0RTTGlua1N0YXQgJiBDRkdfTElOS19TVEFUX0ZXOworICAgICAgICBsaW5rX3N0YXQgPSBscC0+aGNmQ3R4LklGQl9MaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfRlc7CisgICAgICAgIHN3aXRjaCggbGlua19zdGF0ICkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJMaW5rIFN0YXR1cyA6IENvbm5lY3RlZFxuIiApOworICAgICAgICAgICAgd2xfd2V4dF9ldmVudF9hcCggbHAtPmRldiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogRGlzY29ubmVjdGVkXG4iICApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogQWNjZXNzIFBvaW50IENoYW5nZVxuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogQWNjZXNzIFBvaW50IE91dCBvZiBSYW5nZVxuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogQWNjZXNzIFBvaW50IEluIFJhbmdlXG4iICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogVU5LTk9XTiAoMHglMDR4KVxuIiwgbGlua19zdGF0ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm47Cit9IC8vIHdsX3Byb2Nlc3NfbGlua19zdGF0dXMKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUHJvY2VzcyB0aGUgcHJvYmUgcmVzcG9uc2VzIHJldHVucmVkIGJ5IHRoZSBkZXZpY2UgYXMgYSByZXN1bHQgb2YgYW4KKyAqICAgICAgYWN0aXZlIHNjYW4uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisgICAgUFJPQkVfUkVTUCAgKnByb2JlX3JzcDsKKyAgICBoY2ZfOCAgICAgICAqd3BhX2llID0gTlVMTDsKKyAgICBoY2ZfMTYgICAgICB3cGFfaWVfbGVuID0gMDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIERCR19GVU5DKCAid2xfcHJvY2Vzc19wcm9iZV9yZXNwb25zZSIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCisgICAgaWYoIGxwICE9IE5VTEwgKSB7CisgICAgICAgIHByb2JlX3JzcCA9IChQUk9CRV9SRVNQICopJmxwLT5Qcm9iZVJlc3A7CisKKyAgICAgICAgd2xfZW5kaWFuX3RyYW5zbGF0ZV9ldmVudCggKGx0dl90ICopcHJvYmVfcnNwICk7CisKKyAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSA9PT09PT09PT09PT09PT09PT09PT09PT09XG4iLCBscC0+ZGV2LT5uYW1lICk7CisgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgbGVuZ3RoICAgICAgOiAweCUwNHguXG4iLCAgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPmxlbmd0aCApOworCisgICAgICAgIGlmKCBwcm9iZV9yc3AtPmxlbmd0aCA+IDEgKSB7CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGluZm9UeXBlICAgIDogMHglMDR4LlxuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5pbmZvVHlwZSApOworCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIHNpZ25hbCAgICAgIDogMHglMDJ4LlxuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5zaWduYWwgKTsKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBzaWxlbmNlICAgICA6IDB4JTAyeC5cbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+c2lsZW5jZSApOworCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIHJ4RmxvdyAgICAgIDogMHglMDJ4LlxuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5yeEZsb3cgKTsKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSByYXRlICAgICAgICA6IDB4JTAyeC5cbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+cmF0ZSApOworCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGZyYW1lIGNudGwgIDogMHglMDR4LlxuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5mcmFtZUNvbnRyb2wgKTsKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBkdXJJRCAgICAgICA6IDB4JTA0eC5cbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+ZHVySUQgKTsKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBhZGRyZXNzMSAgICA6ICVzXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBEYmdId0FkZHIoIHByb2JlX3JzcC0+YWRkcmVzczEgKSk7CisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgYWRkcmVzczIgICAgOiAlc1xuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPmFkZHJlc3MyICkpOworCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIEJTU0lEICAgICAgIDogJXNcbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIERiZ0h3QWRkciggcHJvYmVfcnNwLT5CU1NJRCApKTsKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBzZXF1ZW5jZSAgICA6IDB4JTA0eC5cbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+c2VxdWVuY2UgKTsKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBhZGRyZXNzNCAgICA6ICVzXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBEYmdId0FkZHIoIHByb2JlX3JzcC0+YWRkcmVzczQgKSk7CisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgZGF0YWxlbmd0aCAgOiAweCUwNHguXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPmRhdGFMZW5ndGggKTsKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBEQSAgICAgICAgICA6ICVzXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBEYmdId0FkZHIoIHByb2JlX3JzcC0+REEgKSk7CisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgU0EgICAgICAgICAgOiAlc1xuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPlNBICkpOworCisjaWZkZWYgV0FSUAorCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGNoYW5uZWwgICAgIDogJWRcbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+Y2hhbm5lbCApOworCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGJhbmQgICAgICAgIDogJWRcbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+YmFuZCApOworI2Vsc2UKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgbGVuVHlwZSAgICAgOiAweCUwNHguXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPmxlblR5cGUgKTsKKyNlbmRpZiAgLy8gV0FSUAorCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIHRpbWVTdGFtcCAgIDogJWQuJWQuJWQuJWQuJWQuJWQuJWQuJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+dGltZVN0YW1wWzBdLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnRpbWVTdGFtcFsxXSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT50aW1lU3RhbXBbMl0sCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+dGltZVN0YW1wWzNdLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnRpbWVTdGFtcFs0XSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT50aW1lU3RhbXBbNV0sCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+dGltZVN0YW1wWzZdLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnRpbWVTdGFtcFs3XSk7CisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgYmVhY29uSW50ICAgOiAweCUwNHguXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPmJlYWNvbkludGVydmFsICk7CisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgY2FwYWJpbGl0eSAgOiAweCUwNHguXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPmNhcGFiaWxpdHkgKTsKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBTU0lEIGxlbiAgICA6IDB4JTA0eC5cbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+cmF3RGF0YVsxXSApOworCisKKyAgICAgICAgICAgIGlmKCBwcm9iZV9yc3AtPnJhd0RhdGFbMV0gPiAwICkgeworICAgICAgICAgICAgICAgIGNoYXIgc3NpZFtIQ0ZfTUFYX05BTUVfTEVOXTsKKworICAgICAgICAgICAgICAgIG1lbXNldCggc3NpZCwgMCwgc2l6ZW9mKCBzc2lkICkpOworICAgICAgICAgICAgICAgIHN0cm5jcHkoIHNzaWQsICZwcm9iZV9yc3AtPnJhd0RhdGFbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5yYXdEYXRhWzFdICk7CisKKyAgICAgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIFNTSUQgICAgICAgIDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPmRldi0+bmFtZSwgc3NpZCApOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8qIFBhcnNlIG91dCB0aGUgV1BBLUlFLCBpZiBvbmUgZXhpc3RzICovCisgICAgICAgICAgICB3cGFfaWUgPSB3bF9wYXJzZV93cGFfaWUoIHByb2JlX3JzcCwgJndwYV9pZV9sZW4gKTsKKyAgICAgICAgICAgIGlmKCB3cGFfaWUgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIFdQQS1JRSAgICAgIDogJXNcbiIsCisgICAgICAgICAgICAgICAgbHAtPmRldi0+bmFtZSwgd2xfcHJpbnRfd3BhX2llKCB3cGFfaWUsIHdwYV9pZV9sZW4gKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgZmxhZ3MgICAgICAgOiAweCUwNHguXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5mbGFncyApOworICAgICAgICB9CisKKyAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiXG4iICk7CisKKworICAgICAgICAvKiBJZiBwcm9iZSByZXNwb25zZSBsZW5ndGggaXMgMSwgdGhlbiB0aGUgc2NhbiBpcyBjb21wbGV0ZSAqLworICAgICAgICBpZiggcHJvYmVfcnNwLT5sZW5ndGggPT0gMSApIHsKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlNDQU4gQ09NUExFVEVcbiIgKTsKKyAgICAgICAgICAgIGxwLT5wcm9iZV9yZXN1bHRzLm51bV9hcHMgPSBscC0+cHJvYmVfbnVtX2FwczsKKyAgICAgICAgICAgIGxwLT5wcm9iZV9yZXN1bHRzLnNjYW5fY29tcGxldGUgPSBUUlVFOworCisgICAgICAgICAgICAvKiBSZXNldCB0aGUgY291bnRlciBmb3IgdGhlIG5leHQgc2NhbiByZXF1ZXN0ICovCisgICAgICAgICAgICBscC0+cHJvYmVfbnVtX2FwcyA9IDA7CisKKyAgICAgICAgICAgIC8qIFNlbmQgYSB3aXJlbGVzcyBleHRlbnNpb25zIGV2ZW50IHRoYXQgdGhlIHNjYW4gY29tcGxldGVkICovCisgICAgICAgICAgICB3bF93ZXh0X2V2ZW50X3NjYW5fY29tcGxldGUoIGxwLT5kZXYgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIE9ubHkgY29weSB0byB0aGUgdGFibGUgaWYgdGhlIGVudHJ5IGlzIHVuaXF1ZTsgQVBzIHNvbWV0aW1lcworICAgICAgICAgICAgICAgIHJlc3BvbmQgbW9yZSB0aGFuIG9uY2UgdG8gYSBwcm9iZSAqLworICAgICAgICAgICAgaWYoIGxwLT5wcm9iZV9udW1fYXBzID09IDAgKSB7CisgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgaW5mbyB0byB0aGUgU2NhblJlc3VsdCBzdHJ1Y3R1cmUgaW4gdGhlIHByaXZhdGUKKyAgICAgICAgICAgICAgICBhZGFwdGVyIHN0cnVjdCAqLworICAgICAgICAgICAgICAgIG1lbWNweSggJiggbHAtPnByb2JlX3Jlc3VsdHMuUHJvYmVUYWJsZVtscC0+cHJvYmVfbnVtX2Fwc10gKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcCwgc2l6ZW9mKCBQUk9CRV9SRVNQICkpOworCisgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IHRoZSBudW1iZXIgb2YgQVBzIGRldGVjdGVkICovCisgICAgICAgICAgICAgICAgbHAtPnByb2JlX251bV9hcHMrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGNvdW50OworICAgICAgICAgICAgICAgIGludCB1bmlxdWUgPSAxOworCisgICAgICAgICAgICAgICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgbHAtPnByb2JlX251bV9hcHM7IGNvdW50KysgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBtZW1jbXAoICYoIHByb2JlX3JzcC0+QlNTSUQgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5wcm9iZV9yZXN1bHRzLlByb2JlVGFibGVbY291bnRdLkJTU0lELAorICAgICAgICAgICAgICAgICAgICAgICAgRVRIX0FMRU4gKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCB1bmlxdWUgKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIGluZm8gdG8gdGhlIFNjYW5SZXN1bHQgc3RydWN0dXJlIGluIHRoZQorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGFkYXB0ZXIgc3RydWN0LiBPbmx5IGNvcHkgaWYgdGhlcmUncyByb29tIGluIHRoZQorICAgICAgICAgICAgICAgICAgICB0YWJsZSAqLworICAgICAgICAgICAgICAgICAgICBpZiggbHAtPnByb2JlX251bV9hcHMgPCBNQVhfTkFQUyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSggJiggbHAtPnByb2JlX3Jlc3VsdHMuUHJvYmVUYWJsZVtscC0+cHJvYmVfbnVtX2Fwc10gKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLCBzaXplb2YoIFBST0JFX1JFU1AgKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIk51bSBvZiBzY2FuIHJlc3VsdHMgZXhjZWVkcyBzdG9yYWdlLCB0cnVuY2F0aW5nXG4iICk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBBUHMgZGV0ZWN0ZWQuIE5vdGUgSSBkbyB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICBoZXJlIGV2ZW4gd2hlbiBJIGRvbid0IGNvcHkgdGhlIHByb2JlIHJlc3BvbnNlIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGluIG9yZGVyIHRvIGRldGVjdCB0aGUgb3ZlcmZsb3cgY29uZGl0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGxwLT5wcm9iZV9udW1fYXBzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuOworfSAvLyB3bF9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcHJvY2Vzc191cGRhdGVkX3JlY29yZCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFByb2Nlc3MgdGhlIHVwZGF0ZWQgaW5mb3JtYXRpb24gcmVjb3JkIG1lc3NhZ2Ugc2lnbmFsZWQgYnkgdGhlIGRldmljZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfcHJvY2Vzc191cGRhdGVkX3JlY29yZCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKyAgICBEQkdfRlVOQyggIndsX3Byb2Nlc3NfdXBkYXRlZF9yZWNvcmQiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKworICAgIGlmKCBscCAhPSBOVUxMICkgeworICAgICAgICBscC0+dXBkYXRlZFJlY29yZC51LnUxNlswXSA9IENOVl9MSVRUTEVfVE9fSU5UKCBscC0+dXBkYXRlZFJlY29yZC51LnUxNlswXSApOworCisgICAgICAgIHN3aXRjaCggbHAtPnVwZGF0ZWRSZWNvcmQudS51MTZbMF0gKSB7CisgICAgICAgIGNhc2UgQ0ZHX0NVUl9DT1VOVFJZX0lORk86CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJVcGRhdGVkIFJlY29yZDogQ0ZHX0NVUl9DT1VOVFJZX0lORk9cbiIgKTsKKyAgICAgICAgICAgIHdsX2Nvbm5lY3QoIGxwICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENGR19QT1JUX1NUQVQ6CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJVcGRhdGVkIFJlY29yZDogV0FJVF9GT1JfQ09OTkVDVCAoMHhGRDQwKVxuIiApOworICAgICAgICAgICAgLy93bF9jb25uZWN0KCBscCApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlVOS05PV046IDB4JTA0eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbHAtPnVwZGF0ZWRSZWNvcmQudS51MTZbMF0gKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybjsKK30gLy8gd2xfcHJvY2Vzc191cGRhdGVkX3JlY29yZAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3Byb2Nlc3NfYXNzb2Nfc3RhdHVzKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUHJvY2VzcyB0aGUgYXNzb2NpYXRpb24gc3RhdHVzIGV2ZW50IHNpZ25hbGVkIGJ5IHRoZSBkZXZpY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3Byb2Nlc3NfYXNzb2Nfc3RhdHVzKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworICAgIEFTU09DX1NUQVRVU19TVFJDVCAqYXNzb2Nfc3RhdDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIERCR19GVU5DKCAid2xfcHJvY2Vzc19hc3NvY19zdGF0dXMiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKworICAgIGlmKCBscCAhPSBOVUxMICkgeworICAgICAgICBhc3NvY19zdGF0ID0gKEFTU09DX1NUQVRVU19TVFJDVCAqKSZscC0+YXNzb2Nfc3RhdDsKKworICAgICAgICB3bF9lbmRpYW5fdHJhbnNsYXRlX2V2ZW50KCAobHR2X3QgKilhc3NvY19zdGF0ICk7CisKKyAgICAgICAgc3dpdGNoKCBhc3NvY19zdGF0LT5hc3NvY1N0YXR1cyApIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiQXNzb2NpYXRpb24gU3RhdHVzIDogU1RBIEFzc29jaWF0ZWRcbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkFzc29jaWF0aW9uIFN0YXR1cyA6IFNUQSBSZWFzc29jaWF0ZWRcbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkFzc29jaWF0aW9uIFN0YXR1cyA6IFNUQSBEaXNhc3NvY2lhdGVkXG4iICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiQXNzb2NpYXRpb24gU3RhdHVzIDogVU5LTk9XTiAoMHglMDR4KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jX3N0YXQtPmFzc29jU3RhdHVzICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlNUQSBBZGRyZXNzICAgICAgICA6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBEYmdId0FkZHIoIGFzc29jX3N0YXQtPnN0YUFkZHIgKSk7CisKKyAgICAgICAgaWYoKCBhc3NvY19zdGF0LT5hc3NvY1N0YXR1cyA9PSAyICkgICYmICggYXNzb2Nfc3RhdC0+bGVuID09IDggKSkgeworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiT2xkIEFQIEFkZHJlc3MgICAgIDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBEYmdId0FkZHIoIGFzc29jX3N0YXQtPm9sZEFwQWRkciApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybjsKK30gLy8gd2xfcHJvY2Vzc19hc3NvY19zdGF0dXMKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wcm9jZXNzX3NlY3VyaXR5X3N0YXR1cygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFByb2Nlc3MgdGhlIHNlY3VyaXR5IHN0YXR1cyBtZXNzYWdlIHNpZ25hbGVkIGJ5IHRoZSBkZXZpY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3Byb2Nlc3Nfc2VjdXJpdHlfc3RhdHVzKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworICAgIFNFQ1VSSVRZX1NUQVRVU19TVFJDVCAqc2VjX3N0YXQ7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICBEQkdfRlVOQyggIndsX3Byb2Nlc3Nfc2VjdXJpdHlfc3RhdHVzIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisKKyAgICBpZiggbHAgIT0gTlVMTCApIHsKKyAgICAgICAgc2VjX3N0YXQgPSAoU0VDVVJJVFlfU1RBVFVTX1NUUkNUICopJmxwLT5zZWNfc3RhdDsKKworICAgICAgICB3bF9lbmRpYW5fdHJhbnNsYXRlX2V2ZW50KCAobHR2X3QgKilzZWNfc3RhdCApOworCisgICAgICAgIHN3aXRjaCggc2VjX3N0YXQtPnNlY3VyaXR5U3RhdHVzICkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJTZWN1cml0eSBTdGF0dXMgOiBEaXNzYXNzb2NpYXRlIFtBUF1cbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlNlY3VyaXR5IFN0YXR1cyA6IERlYXV0aGVudGljYXRlIFtBUF1cbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlNlY3VyaXR5IFN0YXR1cyA6IEF1dGhlbnRpY2F0ZSBGYWlsIFtTVEFdIG9yIFtBUF1cbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlNlY3VyaXR5IFN0YXR1cyA6IE1JQyBGYWlsXG4iICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJTZWN1cml0eSBTdGF0dXMgOiBBc3NvY2lhdGUgRmFpbFxuIiApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlNlY3VyaXR5IFN0YXR1cyA6IFVOS05PV04gKDB4JTA0eClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWNfc3RhdC0+c2VjdXJpdHlTdGF0dXMgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiU1RBIEFkZHJlc3MgICAgIDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgRGJnSHdBZGRyKCBzZWNfc3RhdC0+c3RhQWRkciApKTsKKyAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiUmVhc29uICAgICAgICAgIDogMHglMDR4IFxuIiwgc2VjX3N0YXQtPnJlYXNvbiApOworCisgICAgfQorCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuOworfSAvLyB3bF9wcm9jZXNzX3NlY3VyaXR5X3N0YXR1cworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworaW50IHdsX2dldF90YWxsaWVzKHN0cnVjdCB3bF9wcml2YXRlICpscCwKKwkJICAgQ0ZHX0hFUk1FU19UQUxMSUVTX1NUUkNUICp0YWxsaWVzKQoreworICAgIGludCByZXQgPSAwOworICAgIGludCBzdGF0dXM7CisgICAgQ0ZHX0hFUk1FU19UQUxMSUVTX1NUUkNUICpwVGFsbGllczsKKworICAgIERCR19GVU5DKCAid2xfZ2V0X3RhbGxpZXMiICk7CisgICAgREJHX0VOVEVSKERiZ0luZm8pOworCisgICAgLyogR2V0IHRoZSBjdXJyZW50IHRhbGxpZXMgZnJvbSB0aGUgYWRhcHRlciAqLworICAgIGxwLT5sdHZSZWNvcmQubGVuID0gMSArIEhDRl9UT1RfVEFMX0NOVCAqIHNpemVvZihoY2ZfMTYpOworICAgIGxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX1RBTExJRVM7CisKKyAgICBzdGF0dXMgPSBoY2ZfZ2V0X2luZm8oJihscC0+aGNmQ3R4KSwgKExUVlApJihscC0+bHR2UmVjb3JkKSk7CisKKyAgICBpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworCXBUYWxsaWVzID0gKENGR19IRVJNRVNfVEFMTElFU19TVFJDVCAqKSYobHAtPmx0dlJlY29yZC51LnUzMik7CisJbWVtY3B5KHRhbGxpZXMsIHBUYWxsaWVzLCBzaXplb2YoKnRhbGxpZXMpKTsKKyAgICAJREJHX1RSQUNFKCBEYmdJbmZvLCAiR2V0IHRhbGxpZXMgb2theSwgZGl4ZTogJWRcbiIsIHNpemVvZigqdGFsbGllcykgKTsKKyAgICB9IGVsc2UgeworICAgIAlEQkdfVFJBQ0UoIERiZ0luZm8sICJHZXQgdGFsbGllcyBmYWlsZWRcbiIgKTsKKwlyZXQgPSAtRUZBVUxUOworICAgIH0KKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2F0b2koKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBCZWxpZXZlIGl0IG9yIG5vdCwgd2UgbmVlZCBvdXIgb3duIGltcGxlbWVudGF0aW9uIG9mIGF0b2kgaW4gdGhlIGtlcm5lbC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHN0cmluZyAgLSB0aGUgQVNDSUkgc3RyaW5nIHRvIGNvbnZlcnQgdG8gYW4gaW50ZWdlcgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgdW5zaWduZWQgaW50ZWdlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBpbnQgd2xfYXRvaSggY2hhciAqc3RyaW5nICkKK3sKK3Vuc2lnbmVkIGludCBiYXNlID0gMTA7CQkJCS8vZGVmYXVsdCB0byBkZWNpbWFsCit1bnNpZ25lZCBpbnQgdmFsdWUgPSAwOwordW5zaWduZWQgaW50IGM7CitpbnQgaSA9IHN0cmxlbiggc3RyaW5nICk7CisKKwlpZiAoIGkgPiAyICYmIHN0cmluZ1swXSA9PSAnMCcgJiYgKCBzdHJpbmdbMV0gfCAoJ1gnXid4JykgKSA9PSAneCcgKSB7CisJCWJhc2UgPSAxNjsKKwkJc3RyaW5nICs9MjsKKwl9CisJd2hpbGUgKCAoIGMgPSAqc3RyaW5nKysgKSAhPSAnXDAnICkgeworCQlpZiAoIHZhbHVlID4gVUlOVF9NQVggLyBiYXNlICkgewkvL3Rlc3QgZm9yIG92ZXJydW4KKwkJCURCR19GVU5DKCAid2xfYXRvaSIgKTsJLy9kb24ndCBvdmVybG9hZCB0aGUgbG9nIGZpbGUgd2l0aCBnb29kIG1lc3NhZ2VzCisJCQlEQkdfRU5URVIoIERiZ0luZm8gKTsKKwkJCURCR19FUlJPUiggRGJnSW5mbywgInN0cmluZyBcIiVzXCIsIGxlbmdodCBleGNlZWRzIGV4cGVjdGF0aW9uc1xuIiwgc3RyaW5nICk7CisJCQlwcmludGsoICI8MT5zdHJpbmcgXCIlc1wiLCBsZW5naHQgZXhjZWVkcyBleHBlY3RhdGlvbnNcbiIsIHN0cmluZyApOworCQkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCQlicmVhazsKKwkJfQorCQljIC09ICcwJzsKKwkJaWYgKCAwIDw9IGMgJiYgYyA8PSA5ICkgdmFsdWUgPSBiYXNlICogdmFsdWUgKyBjOworCQllbHNlIGlmICggYmFzZSA9PSAxNiApIHsKKwkJCWMgKz0gJzAnOworCQkJYyB8PSAnQSdeJ2EnOworCQkJYyA9IGMgLSAnYScrIDEwOworCQkJaWYgKCAxMCA8PSBjICYmIGMgPD0gMTUgKSB2YWx1ZSA9IGJhc2UgKiB2YWx1ZSArIGM7CisJCX0KKwl9CisJcmV0dXJuIHZhbHVlOworfSAvLyB3bF9hdG9pCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3V0aWwuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmNkNmM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfdXRpbC5oCkBAIC0wLDAgKzEsMTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgSGVhZGVyIGRlc2NyaWJpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgZm9yIHV0aWxpdHkgZnVuY3Rpb25zIHVzZWQKKyAqICAgdGhyb3VnaG91dCB0aGUgZHJpdmVyLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19XTF9VVElMX0hfXworI2RlZmluZSBfX1dMX1VUSUxfSF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZnVuY3Rpb24gcHJvdG90eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkYm0oIGludCB2YWx1ZSApOworCitpbnQgaXNfdmFsaWRfa2V5X3N0cmluZyggY2hhciAqcyApOworCit2b2lkIGtleV9zdHJpbmcya2V5KCBjaGFyICprcywgS0VZX1NUUkNUICprZXkgKTsKKworaW50IGhleGRpZ2l0MmludCggY2hhciBjICk7CisKK3ZvaWQgd2xfaGNmX2Vycm9yKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaGNmU3RhdHVzICk7CisKK3ZvaWQgd2xfZW5kaWFuX3RyYW5zbGF0ZV9ldmVudCggbHR2X3QgKnBMdHYgKTsKKworaW50IHdsX2hhc193ZXAoIElGQlAgaWZicCApOworCisKKyNpZiBEQkcKK2NvbnN0IGNoYXIgKkRiZ0h3QWRkciggdW5zaWduZWQgY2hhciAqaHdBZGRyICk7CisjZW5kaWYgLy8gREJHCisKK2hjZl84ICAgd2xfcGFyc2VfZHNfaWUoIFBST0JFX1JFU1AgKnByb2JlX3JzcCApOworaGNmXzggKiB3bF9wYXJzZV93cGFfaWUoIFBST0JFX1JFU1AgKnByb2JlX3JzcCwgaGNmXzE2ICpsZW5ndGggKTsKK2hjZl84ICogd2xfcHJpbnRfd3BhX2llKCBoY2ZfOCAqYnVmZmVyLCBpbnQgbGVuZ3RoICk7CisKK2ludCB3bF9nZXRfdGFsbGllcyhzdHJ1Y3Qgd2xfcHJpdmF0ZSAqLCBDRkdfSEVSTUVTX1RBTExJRVNfU1RSQ1QgKik7CitpbnQgd2xfaXNfYV92YWxpZF9jaGFuKCBpbnQgY2hhbm5lbCApOworaW50IHdsX2lzX2FfdmFsaWRfZnJlcSggbG9uZyBmcmVxdWVuY3kgKTsKK2xvbmcgd2xfZ2V0X2ZyZXFfZnJvbV9jaGFuKCBpbnQgY2hhbm5lbCApOworaW50IHdsX2dldF9jaGFuX2Zyb21fZnJlcSggbG9uZyBmcmVxdWVuY3kgKTsKKwordm9pZCB3bF9wcm9jZXNzX2xpbmtfc3RhdHVzKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK3ZvaWQgd2xfcHJvY2Vzc19wcm9iZV9yZXNwb25zZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7Cit2b2lkIHdsX3Byb2Nlc3NfdXBkYXRlZF9yZWNvcmQoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOwordm9pZCB3bF9wcm9jZXNzX2Fzc29jX3N0YXR1cyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7Cit2b2lkIHdsX3Byb2Nlc3Nfc2VjdXJpdHlfc3RhdHVzKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKwordW5zaWduZWQgaW50IHdsX2F0b2koIGNoYXIgKnN0cmluZyApOworCisjZW5kaWYgIC8vIF9fV0xfVVRJTF9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3ZlcnNpb24uaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWU2MDRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfdmVyc2lvbi5oCkBAIC0wLDAgKzEsMTc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciB0aGUgY29kZSBiYXNlLCBhcyB3ZWxsIGFzCisgKiAgIHNwZWNpYWwgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBuZWVkZWQgYnkgY2VydGFpbiB2ZXJzaW9ucyBvZiB0aGUgY29kZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fV0xfVkVSU0lPTl9IX18KKyNkZWZpbmUgX19XTF9WRVJTSU9OX0hfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpZm5kZWYgQ09ORklHX01PRFZFUlNJT05TCisjZGVmaW5lIF9fTk9fVkVSU0lPTl9fCisjZW5kaWYgIC8vIENPTkZJR19NT0RWRVJTSU9OUworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGNvbnN0YW50IGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFZFTkRPUl9OQU1FICAgICAgICAgIkFnZXJlIFN5c3RlbXMsIGh0dHA6Ly93d3cuYWdlcmUuY29tIgorCisjZGVmaW5lIERSSVZFUl9OQU1FICAgICAgICAgIndsYWdzNDkiCisjZGVmaW5lIERSVl9JREVOVElUWSAgICAgICAgNDkKKworI2RlZmluZSBEUlZfTUFKT1JfVkVSU0lPTiAgIDcKKyNkZWZpbmUgRFJWX01JTk9SX1ZFUlNJT04gICAyMgorI2RlZmluZSBEUlZfVkVSU0lPTl9TVFIgICAgICI3LjIyIgorCisKKyNpZiBkZWZpbmVkIEJVU19QQ01DSUEKKyNkZWZpbmUgQlVTX1RZUEUgICAgICAgICAgICAiUENNQ0lBIgorI2VsaWYgZGVmaW5lZCBCVVNfUENJCisjZGVmaW5lIEJVU19UWVBFICAgICAgICAgICAgIlBDSSIKKyNlbHNlCitlcnI6IGRlZmluZSBidXMgdHlwZTsKKyNlbmRpZiAgLy8gQlVTX1hYWAorCisjaWYgZGVmaW5lZCBIRVJNRVMyNQorI2RlZmluZSBIV19UWVBFCQkJCSJISUkuNSIKKyNlbHNlCisjZGVmaW5lIEhXX1RZUEUJCQkJIkhJSSIKKyNlbmRpZiAvLyBIRVJNRVMyNQorCisjaWYgZGVmaW5lZCBXQVJQCisjZGVmaW5lIEZXX1RZUEUJCQkJIldBUlAiCisjZWxzZQorI2RlZmluZSBGV19UWVBFCQkJCSJCRUFHTEUiCisjZW5kaWYgLy8gV0FSUAorCisjaWYgZGVmaW5lZCBIRVJNRVMyNQorI2lmIGRlZmluZWQgV0FSUAorI2RlZmluZSBEUlZfVkFSSUFOVCAgICAgICAgIDMKKyNlbHNlCisjZGVmaW5lIERSVl9WQVJJQU5UICAgICAgICAgNAorI2VuZGlmIC8vIFdBUlAKKyNlbHNlCisjZGVmaW5lIERSVl9WQVJJQU5UICAgICAgICAgMgorI2VuZGlmIC8vIEhFUk1FUzI1CisKKyNpZmRlZiBCVVNfUENNQ0lBCisjaWYgZGVmaW5lZCBIRVJNRVMyNQorI2RlZmluZSBNT0RVTEVfTkFNRSAgICAgICAgIERSSVZFUl9OQU1FICJfaDI1X2NzIgorI2Vsc2UKKyNkZWZpbmUgTU9EVUxFX05BTUUgICAgICAgICBEUklWRVJfTkFNRSAiX2gyX2NzIgorI2VuZGlmICAvKiBIRVJNRVMyNSAqLworI2VsaWYgZGVmaW5lZCBCVVNfUENJCisjaWYgZGVmaW5lZCBIRVJNRVMyNQorI2RlZmluZSBNT0RVTEVfTkFNRSAgICAgICAgIERSSVZFUl9OQU1FICJfaDI1IgorI2Vsc2UKKyNkZWZpbmUgTU9EVUxFX05BTUUgICAgICAgICBEUklWRVJfTkFNRSAiX2gyIgorI2VuZGlmICAvKiBIRVJNRVMyNSAqLworI2VuZGlmICAvKiBCVVNfWFhYICovCisKKyNpZmRlZiBEQkcKKyNkZWZpbmUgTU9EVUxFX0RBVEUgICAgICAgICBfX0RBVEVfXyAiICIgX19USU1FX18KKyNlbHNlCisjZGVmaW5lIE1PRFVMRV9EQVRFICAgICAgICAgIjA3LzE4LzIwMDQgMTM6MzA6MDAiCisjZW5kaWYgLy8gREJHCisKKy8vI2RlZmluZSBTVFIyKG0pICNtCisvLyNkZWZpbmUgU1RSMShtKSBTVFIyKG0pCisvLyNkZWZpbmUgTU9EVUxFX05BTUUJCQlTVFIxKCBNT0RfTkFNRSApCisKKyNkZWZpbmUgVkVSU0lPTl9JTkZPICAgICAgICBNT0RVTEVfTkFNRSAiIHYiIERSVl9WRVJTSU9OX1NUUiBcCisJCQkJCQkJIiBmb3IgIiBCVVNfVFlQRSAiLCAiIAkJCQkJCQkJCQkJICAgCSBcCisJCQkJCQkJTU9EVUxFX0RBVEUgIiBieSAiIFZFTkRPUl9OQU1FCisKKyNkZWZpbmUgV0lSRUxFU1NfU1VQUE9SVCAgICAxNSAgLy8gVGhlIHZlcnNpb24gb2Ygd2lyZWxlc3MgZXh0ZW5zaW9ucyB3ZSBzdXBwb3J0CisKKy8vI2RlZmluZSBEQkdfTU9EX05BTUUgICAgICAgICBEUklWRVJfTkFNRSAiOiIgQlVTX1RZUEUgIjoiIEhXX1RZUEUgIjoiIEZXX1RZUEUKKyNkZWZpbmUgREJHX01PRF9OQU1FICAgICAgICBNT0RVTEVfTkFNRQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBidXMgYXJjaGl0ZWNodHVyZSBzcGVjaWZpYyBkZWZpbmVzLCBpbmNsdWRlcywgZXRjLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBkaWZmZXJlbmNlIGZvciBQQ01DSUEgYW5kIFBDSSBhbnltb3JlLCBhdCBsZWFzdAorICogZm9yIFBDTUNJQSB0aGUgc2FtZSBkZWZpbmVzIGFyZSBuZWVkZWQgbm93IGFzIHByZXZpb3VzbHkgb25seSB1c2VkIGZvciBQQ0kKKyAqLworI2lmIFVTRV9XRVhUCisjZGVmaW5lIEhBU19XSVJFTEVTU19FWFRFTlNJT05TCisjZW5kaWYgIC8vIFVTRV9XRVhUCisKKyNkZWZpbmUgTkVXX01VTFRJQ0FTVAorI2RlZmluZSBBTExPQ19TS0IobGVuKSAgIGRldl9hbGxvY19za2IobGVuKzIpCisjZGVmaW5lIEdFVF9QQUNLRVQoZGV2LCBza2IsIGNvdW50KVwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrYl9yZXNlcnZlKChza2IpLCAyKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgQkxPQ0tfSU5QVVQoc2tiX3B1dCgoc2tiKSwgKGNvdW50KSksIChjb3VudCkpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAoc2tiKS0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucygoc2tiKSwgKGRldikpCisjZGVmaW5lIEdFVF9QQUNLRVRfRE1BKGRldiwgc2tiLCBjb3VudClcCisgICAgICAgICAgICAgICAgICAgICAgICBza2JfcmVzZXJ2ZSgoc2tiKSwgMik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJMT0NLX0lOUFVUX0RNQShza2JfcHV0KChza2IpLCAoY291bnQpKSwgKGNvdW50KSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChza2IpLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKChza2IpLCAoZGV2KSkKKworCisKKworI2VuZGlmICAvLyBfX1dMX1ZFUlNJT05fSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF93ZXh0LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF93ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQzNGUwMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3dleHQuYwpAQCAtMCwwICsxLDQxMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDx3bF92ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxkZWJ1Zy5oPgorI2luY2x1ZGUgPGhjZi5oPgorI2luY2x1ZGUgPGhjZmRlZi5oPgorCisjaW5jbHVkZSA8d2xfaWYuaD4KKyNpbmNsdWRlIDx3bF9pbnRlcm5hbC5oPgorI2luY2x1ZGUgPHdsX3V0aWwuaD4KKyNpbmNsdWRlIDx3bF9tYWluLmg+CisjaW5jbHVkZSA8d2xfd2V4dC5oPgorI2luY2x1ZGUgPHdsX3ByaXYuaD4KKworCisKKy8qIElmIFdJUkVMRVNTX0VYVCBpcyBub3QgZGVmaW5lZCAoYXMgYSByZXN1bHQgb2YgSEFTX1dJUkVMRVNTX0VYVEVOU0lPTlMKKyAgICNpbmNsdWRpbmcgbGludXgvd2lyZWxlc3MuaCksIHRoZW4gdGhlc2UgZnVuY3Rpb25zIGRvIG5vdCBuZWVkIHRvIGJlIGluY2x1ZGVkCisgICBpbiB0aGUgYnVpbGQuICovCisjaWZkZWYgV0lSRUxFU1NfRVhUCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjcpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGJ1ZiwgZW5kLCBpd2UsIGxlbikgXAorICAgIGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGJ1ZiwgZW5kLCBpd2UsIGxlbikKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgYnVmLCBlbmQsIGl3ZSwgbXNnKSBcCisgICAgaXdlX3N0cmVhbV9hZGRfcG9pbnQoYnVmLCBlbmQsIGl3ZSwgbXNnKQorI2Vsc2UKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgYnVmLCBlbmQsIGl3ZSwgbGVuKSBcCisgICAgaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgYnVmLCBlbmQsIGl3ZSwgbGVuKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBidWYsIGVuZCwgaXdlLCBtc2cpIFwKKyAgICBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBidWYsIGVuZCwgaXdlLCBtc2cpCisjZW5kaWYKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnbG9iYWwgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgREJHCitleHRlcm4gZGJnX2luZm9fdCAqRGJnSW5mbzsKKyNlbmRpZiAgLy8gREJHCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19jb21taXQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDb21taXQKKyAqICBwcm90b2NvbCB1c2VkLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICpycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCURCR19GVU5DKCAid2lyZWxlc3NfY29tbWl0IiApOworCURCR19FTlRFUihEYmdJbmZvKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCXdsX2FwcGx5KGxwKTsKKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3NfY29tbWl0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3NfZ2V0X3Byb3RvY29sKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUmV0dXJucyBhIHZlbmRvci1kZWZpbmVkIHN0cmluZyB0aGF0IHNob3VsZCBpZGVudGlmeSB0aGUgd2lyZWxlc3MKKyAqICBwcm90b2NvbCB1c2VkLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19nZXRfcHJvdG9jb2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCit7CisJREJHX0ZVTkMoICJ3aXJlbGVzc19nZXRfcHJvdG9jb2wiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwkvKiBPcmlnaW5hbGx5LCB0aGUgZHJpdmVyIHdhcyBwbGFjaW5nIHRoZSBzdHJpbmcgIldpcmVsZXNzIiBoZXJlLiBIb3dldmVyLAorCSAgIHRoZSB3aXJlbGVzcyBleHRlbnNpb25zICgvbGludXgvd2lyZWxlc3MuaCkgaW5kaWNhdGUgdGhpcyBzdHJpbmcgc2hvdWxkCisJICAgZGVzY3JpYmUgdGhlIHdpcmVsZXNzIHByb3RvY29sLiAqLworCisJc3RyY3B5KG5hbWUsICJJRUVFIDgwMi4xMWIiKTsKKworCURCR19MRUFWRShEYmdJbmZvKTsKKwlyZXR1cm4gMDsKK30gLy8gd2lyZWxlc3NfZ2V0X3Byb3RvY29sCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3Nfc2V0X2ZyZXF1ZW5jeSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFNldHMgdGhlIGZyZXF1ZW5jeSAoY2hhbm5lbCkgb24gd2hpY2ggdGhlIGNhcmQgc2hvdWxkIFR4L1J4LgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3Nfc2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNoYW5uZWwgPSAwOworCWludCByZXQgICAgID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid2lyZWxlc3Nfc2V0X2ZyZXF1ZW5jeSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWlmKCAhY2FwYWJsZSggQ0FQX05FVF9BRE1JTiApKSB7CisJCXJldCA9IC1FUEVSTTsKKwkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCXJldHVybiByZXQ7CisJfQorCisKKwkvKiBJZiBmcmVxdWVuY3kgc3BlY2lmaWVkLCBsb29rIHVwIGNoYW5uZWwgKi8KKwlpZiggZnJlcS0+ZSA9PSAxICkgeworCQlpbnQgZiA9IGZyZXEtPm0gLyAxMDAwMDA7CisJCWNoYW5uZWwgPSB3bF9nZXRfY2hhbl9mcm9tX2ZyZXEoIGYgKTsKKwl9CisKKworCS8qIENoYW5uZWwgc3BlY2lmaWVkICovCisJaWYoIGZyZXEtPmUgPT0gMCApIHsKKwkJY2hhbm5lbCA9IGZyZXEtPm07CisJfQorCisKKwkvKiBJZiB0aGUgY2hhbm5lbCBpcyBhbiA4MDIuMTFhIGNoYW5uZWwsIHNldCBCaXQgOCAqLworCWlmKCBjaGFubmVsID4gMTQgKSB7CisJCWNoYW5uZWwgPSBjaGFubmVsIHwgMHgxMDA7CisJfQorCisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwlscC0+Q2hhbm5lbCA9IGNoYW5uZWw7CisKKworCS8qIENvbW1pdCB0aGUgYWRhcHRlciBwYXJhbWV0ZXJzICovCisJd2xfYXBwbHkoIGxwICk7CisKKwkvKiBTZW5kIGFuIGV2ZW50IHRoYXQgY2hhbm5lbC9mcmVxIGhhcyBiZWVuIHNldCAqLworCXdsX3dleHRfZXZlbnRfZnJlcSggbHAtPmRldiApOworCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19zZXRfZnJlcXVlbmN5CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3NfZ2V0X2ZyZXF1ZW5jeSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEdldHMgdGhlIGZyZXF1ZW5jeSAoY2hhbm5lbCkgb24gd2hpY2ggdGhlIGNhcmQgaXMgVHgvUnguCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX2dldF9mcmVxdWVuY3koc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQorCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IC0xOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19nZXRfZnJlcXVlbmN5IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJbHAtPmx0dlJlY29yZC5sZW4gPSAyOworCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NVUl9DSEFOTkVMOworCisJcmV0ID0gaGNmX2dldF9pbmZvKCAmKGxwLT5oY2ZDdHgpLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCWlmKCByZXQgPT0gSENGX1NVQ0NFU1MgKSB7CisJCWhjZl8xNiBjaGFubmVsID0gQ05WX0xJVFRMRV9UT19JTlQoIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gKTsKKworI2lmZGVmIFVTRV9GUkVRVUVOQ1kKKworCQlmcmVxLT5tID0gd2xfZ2V0X2ZyZXFfZnJvbV9jaGFuKCBjaGFubmVsICkgKiAxMDAwMDA7CisJCWZyZXEtPmUgPSAxOworI2Vsc2UKKworCQlmcmVxLT5tID0gY2hhbm5lbDsKKwkJZnJlcS0+ZSA9IDA7CisKKyNlbmRpZiAvKiBVU0VfRlJFUVVFTkNZICovCisJfQorCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKKwlyZXQgPSAocmV0ID09IEhDRl9TVUNDRVNTID8gMCA6IC1FRkFVTFQpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3NfZ2V0X2ZyZXF1ZW5jeQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX2dldF9yYW5nZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwcm92aWRlIG1pc2MgaW5mbyBhbmQgc3RhdGlzdGljcyBhYm91dCB0aGUKKyAqICB3aXJlbGVzcyBkZXZpY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19nZXRfcmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyAgICAgIGZsYWdzOworCXN0cnVjdCBpd19yYW5nZSAgICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKikgZXh0cmE7CisJaW50ICAgICAgICAgICAgICAgIHJldCA9IDA7CisJaW50ICAgICAgICAgICAgICAgIHN0YXR1cyA9IC0xOworCWludCAgICAgICAgICAgICAgICBjb3VudDsKKwlfX3UxNiAgICAgICAgICAgICAqcFR4UmF0ZTsKKwlpbnQgICAgICAgICAgICAgICAgcmV0cmllcyA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX2dldF9yYW5nZSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCS8qIFNldCByYW5nZSBpbmZvcm1hdGlvbiAqLworCWRhdGEtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkpOworCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJLyogU2V0IHJhbmdlIGluZm9ybWF0aW9uICovCisJbWVtc2V0KCByYW5nZSwgMCwgc2l6ZW9mKCBzdHJ1Y3QgaXdfcmFuZ2UgKSk7CisKK3JldHJ5OgorCS8qIEdldCB0aGUgY3VycmVudCB0cmFuc21pdCByYXRlIGZyb20gdGhlIGFkYXB0ZXIgKi8KKwlscC0+bHR2UmVjb3JkLmxlbiA9IDEgKyAoc2l6ZW9mKCpwVHhSYXRlKSAvIHNpemVvZihoY2ZfMTYpKTsKKwlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DVVJfVFhfUkFURTsKKworCXN0YXR1cyA9IGhjZl9nZXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCWlmKCBzdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CisJCS8qIFJlY292ZXJ5IGFjdGlvbjogcmVzZXQgYW5kIHJldHJ5IHVwIHRvIDEwIHRpbWVzICovCisJCURCR19UUkFDRSggRGJnSW5mbywgIkdldCBDRkdfQ1VSX1RYX1JBVEUgZmFpbGVkOiAweCV4XG4iLCBzdGF0dXMgKTsKKworCQlpZiAocmV0cmllcyA8IDEwKSB7CisJCQlyZXRyaWVzKys7CisKKwkJCS8qIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzICovCisJCQl3bF91bmxvY2sobHAsICZmbGFncyk7CisJCQl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKwkJCXN0YXR1cyA9IHdsX3Jlc2V0KCBkZXYgKTsKKwkJCWlmICggc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgeworCQkJCURCR19UUkFDRSggRGJnSW5mbywgInJlc2V0IGZhaWxlZDogMHgleFxuIiwgc3RhdHVzICk7CisKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWdvdG8gb3V0X3VubG9jazsKKwkJCX0KKworCQkJLyogSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMgKi8KKwkJCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwkJCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworCQkJZ290byByZXRyeTsKKworCQl9IGVsc2UgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiR2V0IENGR19DVVJfVFhfUkFURSBmYWlsZWQ6ICVkIHJldHJpZXNcbiIsIHJldHJpZXMgKTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwl9CisKKwkvKiBIb2xkaW5nIHRoZSBsb2NrIHRvbyBsb25nLCBtYWtlIGEgZ2FwIHRvIGFsbG93IG90aGVyIHByb2Nlc3NlcyAqLworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKwlwVHhSYXRlID0gKF9fdTE2ICopJiggbHAtPmx0dlJlY29yZC51LnUzMiApOworCisJcmFuZ2UtPnRocm91Z2hwdXQgPSBDTlZfTElUVExFX1RPX0lOVCggKnBUeFJhdGUgKSAqIE1FR0FCSVQ7CisKKwlpZiAocmV0cmllcyA+IDApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiR2V0IENGR19DVVJfVFhfUkFURSBzdWNjZXM6ICVkIHJldHJpZXNcbiIsIHJldHJpZXMgKTsKKwl9CisKKwkvLyBOV0lEIC0gTk9UIFNVUFBPUlRFRAorCisKKwkvKiBDaGFubmVsL0ZyZXF1ZW5jeSBJbmZvICovCisJcmFuZ2UtPm51bV9jaGFubmVscyA9IFJBRElPX0NIQU5ORUxTOworCisKKwkvKiBTaWduYWwgTGV2ZWwgVGhyZXNob2xkcyAqLworCXJhbmdlLT5zZW5zaXRpdml0eSA9IFJBRElPX1NFTlNJVElWSVRZX0xFVkVMUzsKKworCisJLyogTGluayBxdWFsaXR5ICovCisjaWZkZWYgVVNFX0RCTQorCisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgICAgID0gKHVfY2hhcilIQ0ZfTUFYX0NPTU1fUVVBTElUWTsKKworCS8qIElmIHRoZSB2YWx1ZSByZXR1cm5lZCBpbiAvcHJvYy9uZXQvd2lyZWxlc3MgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIHJhbmdlLAorCSAgIGl3Y29uZmlnIGFzc3VtZXMgdGhhdCB0aGUgdmFsdWUgaXMgaW4gZEJtLiBCZWNhdXNlIGFuIHVuc2lnbmVkIGNoYXIgaXMgdXNlZCwKKwkgICBpdCByZXF1aXJlcyBhIGJpdCBvZiBjb250b3JzaW9uLi4uICovCisKKwlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgICA9ICh1X2NoYXIpKCBkYm0oIEhDRl9NSU5fU0lHTkFMX0xFVkVMICkgLSAxICk7CisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlICAgPSAodV9jaGFyKSggZGJtKCBIQ0ZfTUlOX05PSVNFX0xFVkVMICkgLSAxICk7CisjZWxzZQorCisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgICAgPSAxMDA7CisJcmFuZ2UtPm1heF9xdWFsLmxldmVsICAgPSAxMDA7CisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlICAgPSAxMDA7CisKKyNlbmRpZiAvKiBVU0VfREJNICovCisKKworCS8qIFNldCBhdmFpbGFibGUgcmF0ZXMgKi8KKwlyYW5nZS0+bnVtX2JpdHJhdGVzID0gMDsKKworCWxwLT5sdHZSZWNvcmQubGVuID0gNjsKKwlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19TVVBQT1JURURfREFUQV9SQVRFUzsKKworCXN0YXR1cyA9IGhjZl9nZXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCWlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCWZvciggY291bnQgPSAwOyBjb3VudCA8IE1BWF9SQVRFUzsgY291bnQrKyApCisJCQlpZiggbHAtPmx0dlJlY29yZC51LnU4W2NvdW50KzJdICE9IDAgKSB7CisJCQkJcmFuZ2UtPmJpdHJhdGVbY291bnRdID0gbHAtPmx0dlJlY29yZC51LnU4W2NvdW50KzJdICogTUVHQUJJVCAvIDI7CisJCQkJcmFuZ2UtPm51bV9iaXRyYXRlcysrOworCQkJfQorCX0gZWxzZSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19TVVBQT1JURURfREFUQV9SQVRFUzogMHgleFxuIiwgc3RhdHVzICk7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBSVFMgVGhyZXNob2xkIGluZm8gKi8KKwlyYW5nZS0+bWluX3J0cyAgID0gTUlOX1JUU19CWVRFUzsKKwlyYW5nZS0+bWF4X3J0cyAgID0gTUFYX1JUU19CWVRFUzsKKworCS8vIEZyYWcgVGhyZXNob2xkIGluZm8gLSBOT1QgU1VQUE9SVEVECisKKwkvLyBQb3dlciBNYW5hZ2VtZW50IGluZm8gLSBOT1QgU1VQUE9SVEVECisKKwkvKiBFbmNyeXB0aW9uICovCisKKyNpZiBXSVJFTEVTU19FWFQgPiA4CisKKwkvKiBIb2xkaW5nIHRoZSBsb2NrIHRvbyBsb25nLCBtYWtlIGEgZ2FwIHRvIGFsbG93IG90aGVyIHByb2Nlc3NlcyAqLworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKwkvKiBJcyBXRVAgc3VwcG9ydGVkPyAqLworCisJaWYoIHdsX2hhc193ZXAoICYoIGxwLT5oY2ZDdHggKSkpIHsKKwkJLyogV0VQOiBSQzQgNDAgYml0cyAqLworCQlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSAgICAgID0gTUlOX0tFWV9TSVpFOworCisJCS8qIFJDNCB+MTI4IGJpdHMgKi8KKwkJcmFuZ2UtPmVuY29kaW5nX3NpemVbMV0gICAgICA9IE1BWF9LRVlfU0laRTsKKwkJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyAgICA9IDI7CisJCXJhbmdlLT5tYXhfZW5jb2RpbmdfdG9rZW5zICAgPSBNQVhfS0VZUzsKKwl9CisKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCisKKwkvKiBUeCBQb3dlciBJbmZvICovCisJcmFuZ2UtPnR4cG93ZXJfY2FwYSAgPSBJV19UWFBPV19NV0FUVDsKKwlyYW5nZS0+bnVtX3R4cG93ZXIgICA9IDE7CisJcmFuZ2UtPnR4cG93ZXJbMF0gICAgPSBSQURJT19UWF9QT1dFUl9NV0FUVDsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDEwCisKKwkvKiBXaXJlbGVzcyBFeHRlbnNpb24gSW5mbyAqLworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkICAgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlICAgICA9IFdJUkVMRVNTX1NVUFBPUlQ7CisKKwkvLyBSZXRyeSBMaW1pdHMgYW5kIExpZmV0aW1lIC0gTk9UIFNVUFBPUlRFRAorCisjZW5kaWYKKworCisjaWYgV0lSRUxFU1NfRVhUID4gMTEKKworCS8qIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzICovCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworCURCR19UUkFDRSggRGJnSW5mbywgImNhbGxpbmcgd2xfd2lyZWxlc3Nfc3RhdHNcbiIgKTsKKwl3bF93aXJlbGVzc19zdGF0cyggbHAtPmRldiApOworCXJhbmdlLT5hdmdfcXVhbCA9IGxwLT53c3RhdHMucXVhbDsKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJ3bF93aXJlbGVzc19zdGF0cyBkb25lXG4iICk7CisKKyNlbmRpZgorCisJLyogRXZlbnQgY2FwYWJpbGl0eSAoa2VybmVsICsgZHJpdmVyKSAqLworCXJhbmdlLT5ldmVudF9jYXBhWzBdID0gKElXX0VWRU5UX0NBUEFfS18wIHwKKwkJCQlJV19FVkVOVF9DQVBBX01BU0soU0lPQ0dJV0FQKSB8CisJCQkJSVdfRVZFTlRfQ0FQQV9NQVNLKFNJT0NHSVdTQ0FOKSk7CisJcmFuZ2UtPmV2ZW50X2NhcGFbMV0gPSBJV19FVkVOVF9DQVBBX0tfMTsKKwlyYW5nZS0+ZXZlbnRfY2FwYVs0XSA9IChJV19FVkVOVF9DQVBBX01BU0soSVdFVlJFR0lTVEVSRUQpIHwKKwkJCQlJV19FVkVOVF9DQVBBX01BU0soSVdFVkNVU1RPTSkgfAorCQkJCUlXX0VWRU5UX0NBUEFfTUFTSyhJV0VWRVhQSVJFRCkpOworCisJcmFuZ2UtPmVuY19jYXBhID0gSVdfRU5DX0NBUEFfV1BBIHwgSVdfRU5DX0NBUEFfQ0lQSEVSX1RLSVA7CisKK291dF91bmxvY2s6CisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKKwlEQkdfTEVBVkUoRGJnSW5mbyk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3NfZ2V0X3JhbmdlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19nZXRfYnNzaWQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBHZXRzIHRoZSBCU1NJRCB0aGUgd2lyZWxlc3MgZGV2aWNlIGlzIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGguCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19nZXRfYnNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQQorCWludCBzdGF0dXMgPSAtMTsKKyNlbmRpZiAvKiAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBICovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX2dldF9ic3NpZCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCW1lbXNldCggJmFwX2FkZHItPnNhX2RhdGEsIDAsIEVUSF9BTEVOICk7CisKKwlhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisKKwkvKiBBc3N1bWUgQVAgbW9kZSBoZXJlLCB3aGljaCBtZWFucyB0aGUgQlNTSUQgaXMgb3VyIG93biBNQUMgYWRkcmVzcy4gSW4KKwkgICBTVEEgbW9kZSwgdGhpcyBhZGRyZXNzIHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgYWN0dWFsIEJTU0lEIHVzaW5nCisJICAgdGhlIGNvZGUgYmVsb3cuICovCisJbWVtY3B5KCZhcF9hZGRyLT5zYV9kYXRhLCBscC0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCisKKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQQorCQkJCQkvLzs/c2hvdWxkIHdlIHJldHVybiBhbiBlcnJvciBzdGF0dXMgaW4gQVAgbW9kZQorCisJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19TVEEgICkgeworCQkvKiBHZXQgQ3VycmVudCBCU1NJRCAqLworCQlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DVVJfQlNTSUQ7CisJCWxwLT5sdHZSZWNvcmQubGVuID0gNDsKKwkJc3RhdHVzID0gaGNmX2dldF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJCS8qIENvcHkgaW5mbyBpbnRvIHNvY2thZGRyIHN0cnVjdCAqLworCQkJbWVtY3B5KCZhcF9hZGRyLT5zYV9kYXRhLCBscC0+bHR2UmVjb3JkLnUudTgsIEVUSF9BTEVOKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCX0KKwl9CisKKyNlbmRpZiAvLyAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBCisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRShEYmdJbmZvKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19nZXRfYnNzaWQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19nZXRfYXBfbGlzdCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEdldHMgdGhlIHJlc3VsdHMgb2YgYSBuZXR3b3JrIHNjYW4uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKiAgTk9URTogU0lPQ0dJV0FQTElTVCBoYXMgYmVlbiBkZXByZWNhdGVkIGJ5IFNJT0NTSVdTQ0FOLiBUaGlzIGZ1bmN0aW9uCisgKiAgICAgICBpbXBsZW1lbnRzIFNJT0NHSVdBUExJU1Qgb25seSB0byBwcm92aWRlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBGb3IKKyAqICAgICAgIGFsbCBzeXN0ZW1zIHVzaW5nIFdJUkVMRVNTX0VYVCB2MTQgYW5kIGhpZ2hlciwgdXNlIFNJT0NTSVdTQ0FOIQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX2dldF9hcF9saXN0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nCSAgZmxhZ3M7CisJaW50ICAgICAgICAgICAgICAgICByZXQ7CisJaW50ICAgICAgICAgICAgICAgICBudW1fYXBzID0gLTE7CisJaW50ICAgICAgICAgICAgICAgICBzZWNfY291bnQgPSAwOworCWhjZl8zMiAgICAgICAgICAgICAgY291bnQ7CisJc3RydWN0IHNvY2thZGRyICAgICAqaHdhID0gTlVMTDsKKwlzdHJ1Y3QgaXdfcXVhbGl0eSAgICpxdWFsID0gTlVMTDsKKyNpZmRlZiBXQVJQCisJU2NhblJlc3VsdAkJCSpwID0gJmxwLT5zY2FuX3Jlc3VsdHM7CisjZWxzZQorCVByb2JlUmVzdWx0ICAgICAgICAgKnAgPSAmbHAtPnByb2JlX3Jlc3VsdHM7CisjZW5kaWYgIC8vIFdBUlAKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX2dldF9hcF9saXN0IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJLyogU2V0IHRoZSBjb21wbGV0aW9uIHN0YXRlIHRvIEZBTFNFICovCisJbHAtPnNjYW5fcmVzdWx0cy5zY2FuX2NvbXBsZXRlID0gRkFMU0U7CisJbHAtPnByb2JlX3Jlc3VsdHMuc2Nhbl9jb21wbGV0ZSA9IEZBTFNFOworCS8qIENoYW5uZWxzIHRvIHNjYW4gKi8KKwlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfU0NBTl9DSEFOTkVMU18yR0haOworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDB4N0ZGRiApOworCXJldCA9IGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19TQ0FOX0NIQU5ORUxTXzJHSFogcmVzdWx0OiAweCV4XG4iLCByZXQgKTsKKworCS8qIFNldCB0aGUgU0NBTl9TU0lEIHRvICJBTlkiLiBVc2luZyB0aGlzIFJJRCBmb3Igc2NhbiBwcmV2ZW50cyB0aGUgbmVlZCB0bworCSAgIGRpc2Fzc29jaWF0ZSBmcm9tIHRoZSBuZXR3b3JrIHdlIGFyZSBjdXJyZW50bHkgb24gKi8KKwlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfU0NBTl9TU0lEOworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDAgKTsKKwlyZXQgPSBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfU0NBTl9TU0lEIHRvICdhbnknIHJldDogMHgleFxuIiwgcmV0ICk7CisKKwkvKiBJbml0aWF0ZSB0aGUgc2NhbiAqLworI2lmZGVmIFdBUlAKKwlyZXQgPSBoY2ZfYWN0aW9uKCAmKCBscC0+aGNmQ3R4ICksIE1ERF9BQ1RfU0NBTiApOworI2Vsc2UKKwlyZXQgPSBoY2ZfYWN0aW9uKCAmKCBscC0+aGNmQ3R4ICksIEhDRl9BQ1RfQUNTX1NDQU4gKTsKKyNlbmRpZiAgLy8gV0FSUAorCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwkvLzs/IHVubG9jaz8gd2hhdCBhYm91dCB0aGUgYWNjZXNzIHRvIGxwIGJlbG93PyBpcyBpdCBicm9rZW4/CisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCisJaWYoIHJldCA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU1VDQ0VTU0ZVTExZIElOSVRJQVRFRCBTQ0FOLi4uXG4iICk7CisJCXdoaWxlKCAoKnApLnNjYW5fY29tcGxldGUgPT0gRkFMU0UgJiYgcmV0ID09IEhDRl9TVUNDRVNTICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiV2FpdGluZyBmb3Igc2NhbiByZXN1bHRzLi4uXG4iICk7CisJCQkvKiBBYm9ydCB0aGUgc2NhbiBpZiB3ZSd2ZSB3YWl0ZWQgZm9yIG1vcmUgdGhhbiBNQVhfU0NBTl9USU1FX1NFQyAqLworCQkJaWYoIHNlY19jb3VudCsrID4gTUFYX1NDQU5fVElNRV9TRUMgKSB7CisJCQkJcmV0ID0gLUVJTzsKKwkJCX0gZWxzZSB7CisJCQkJLyogV2FpdCBmb3IgMSBzZWMgaW4gMTBtcyBpbnRlcnZhbHMsIHNjaGVkdWxpbmcgdGhlIGtlcm5lbCB0byBkbworCQkJCSAgIG90aGVyIHRoaW5ncyBpbiB0aGUgbWVhbnRpbWUsIFRoaXMgcHJldmVudHMgc3lzdGVtIGxvY2t1cHMgYnkKKwkJCQkgICBnaXZpbmcgc29tZSB0aW1lIGJhY2sgdG8gdGhlIGtlcm5lbCAqLworCQkJCWZvciggY291bnQgPSAwOyBjb3VudCA8IDEwMDsgY291bnQgKysgKSB7CisJCQkJCW1kZWxheSggMTAgKTsKKwkJCQkJc2NoZWR1bGUoICk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcm1iKCk7CisKKwkJaWYgKCByZXQgIT0gSENGX1NVQ0NFU1MgKSB7CisJCQlEQkdfRVJST1IoIERiZ0luZm8sICJ0aW1lb3V0IHdhaXRpbmcgZm9yIHNjYW4gcmVzdWx0c1xuIiApOworCQl9IGVsc2UgeworCQkJbnVtX2FwcyAgICAgICAgICAgICA9ICgqcCkvKmxwLT5wcm9iZV9yZXN1bHRzKi8ubnVtX2FwczsKKwkJCWlmIChudW1fYXBzID4gSVdfTUFYX0FQKSB7CisJCQkJbnVtX2FwcyA9IElXX01BWF9BUDsKKwkJCX0KKwkJCWRhdGEtPmxlbmd0aCA9IG51bV9hcHM7CisJCQlod2EgPSAoc3RydWN0IHNvY2thZGRyICopZXh0cmE7CisJCQlxdWFsID0gKHN0cnVjdCBpd19xdWFsaXR5ICopIGV4dHJhICsKKwkJCQkJKCBzaXplb2YoIHN0cnVjdCBzb2NrYWRkciApICogbnVtX2FwcyApOworCisJCQkvKiBUaGlzIGZsYWcgaXMgdXNlZCB0byB0ZWxsIHRoZSB1c2VyIGlmIHdlIHByb3ZpZGUgcXVhbGl0eQorCQkJICAgaW5mb3JtYXRpb24uIFNpbmNlIHdlIHByb3ZpZGUgc2lnbmFsL25vaXNlIGxldmVscyBidXQgbm8KKwkJCSAgIHF1YWxpdHkgaW5mbyBvbiBhIHNjYW4sIHRoaXMgaXMgc2V0IHRvIDAuIFNldHRpbmcgdG8gMSBhbmQKKwkJCSAgIHByb3ZpZGluZyBhIHF1YWxpdHkgb2YgMCBwcm9kdWNlcyB3ZWlyZCByZXN1bHRzLiBJZiB3ZSBldmVyCisJCQkgICBwcm92aWRlIHF1YWxpdHkgKG9yIGNhbiBjYWxjdWxhdGUgaXQpLCB0aGlzIGNhbiBiZSBjaGFuZ2VkICovCisJCQlkYXRhLT5mbGFncyA9IDA7CisKKwkJCWZvciggY291bnQgPSAwOyBjb3VudCA8IG51bV9hcHM7IGNvdW50KysgKSB7CisjaWZkZWYgV0FSUAorCQkJCW1lbWNweSggaHdhW2NvdW50XS5zYV9kYXRhLAorCQkJCQkJKCpwKS8qbHAtPnNjYW5fcmVzdWx0cyovLkFQVGFibGVbY291bnRdLmJzc2lkLCBFVEhfQUxFTiApOworI2Vsc2UgIC8vOz93aHkgdXNlIEJTU0lEIGFuZCBic3NpZCBhcyBuYW1lcyBpbiBzZWVtaW5nbHkgdmVyeSBjb21wYXJhYmxlIHNpdHVhdGlvbnMKKwkJCQlEQkdfUFJJTlQoICJCU1NJRDogJXNcbiIsIERiZ0h3QWRkciggKCpwKS8qbHAtPnByb2JlX3Jlc3VsdHMqLy5Qcm9iZVRhYmxlW2NvdW50XS5CU1NJRCApKTsKKwkJCQltZW1jcHkoIGh3YVtjb3VudF0uc2FfZGF0YSwKKwkJCQkJCSgqcCkvKmxwLT5wcm9iZV9yZXN1bHRzKi8uUHJvYmVUYWJsZVtjb3VudF0uQlNTSUQsIEVUSF9BTEVOICk7CisjZW5kaWYgLy8gV0FSUAorCQkJfQorCQkJLyogT25jZSB0aGUgZGF0YSBpcyBjb3BpZWQgdG8gdGhlIHdpcmVsZXNzIHN0cnVjdCwgaW52YWxpZGF0ZSB0aGUKKwkJCSAgIHNjYW4gcmVzdWx0IHRvIGluaXRpYXRlIGEgcmVzY2FuIG9uIHRoZSBuZXh0IHJlcXVlc3QgKi8KKwkJCSgqcCkvKmxwLT5wcm9iZV9yZXN1bHRzKi8uc2Nhbl9jb21wbGV0ZSA9IEZBTFNFOworCQkJLyogU2VuZCB0aGUgd2lyZWxlc3MgZXZlbnQgdGhhdCB0aGUgc2NhbiBoYXMgY29tcGxldGVkLCBqdXN0IGluIGNhc2UKKwkJCSAgIGl0J3MgbmVlZGVkICovCisJCQl3bF93ZXh0X2V2ZW50X3NjYW5fY29tcGxldGUoIGxwLT5kZXYgKTsKKwkJfQorCX0KK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19nZXRfYXBfbGlzdAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX3NldF9zZW5zaXRpdml0eSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFNldHMgdGhlIHNlbnNpdGl2aXR5IChkaXN0YW5jZSBiZXR3ZWVuIEFQcykgb2YgdGhlIHdpcmVsZXNzIGNhcmQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19zZXRfc2Vuc2l0aXZpdHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BhcmFtICpzZW5zLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgZGVucyA9IHNlbnMtPnZhbHVlOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19zZXRfc2Vuc2l0aXZpdHkiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlpZigoIGRlbnMgPCAxICkgfHwgKCBkZW5zID4gMyApKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCWxwLT5EaXN0YW5jZUJldHdlZW5BUHMgPSBkZW5zOworCXdsX2FwcGx5KCBscCApOworCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19zZXRfc2Vuc2l0aXZpdHkKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19nZXRfc2Vuc2l0aXZpdHkoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBHZXRzIHRoZSBzZW5zaXRpdml0eSAoZGlzdGFuY2UgYmV0d2VlbiBBUHMpIG9mIHRoZSB3aXJlbGVzcyBjYXJkLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3NfZ2V0X3NlbnNpdGl2aXR5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wYXJhbSAqc2VucywgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCWludCByZXQgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid2lyZWxlc3NfZ2V0X3NlbnNpdGl2aXR5IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogbm90IHdvcnRoIGxvY2tpbmcgLi4uICovCisJc2Vucy0+dmFsdWUgPSBscC0+RGlzdGFuY2VCZXR3ZWVuQVBzOworCXNlbnMtPmZpeGVkID0gMDsJLyogYXV0byAqLworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX2dldF9zZW5zaXRpdml0eQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX3NldF9lc3NpZCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFNldHMgdGhlIEVTU0lEIChuZXR3b3JrIG5hbWUpIHRoYXQgdGhlIHdpcmVsZXNzIGRldmljZSBzaG91bGQgYXNzb2NpYXRlCisgKiAgd2l0aC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX3NldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKnNzaWQpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlEQkdfRlVOQyggIndpcmVsZXNzX3NldF9lc3NpZCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChkYXRhLT5mbGFncyAhPSAwICYmIGRhdGEtPmxlbmd0aCA+IEhDRl9NQVhfTkFNRV9MRU4gKyAxKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCW1lbXNldCggbHAtPk5ldHdvcmtOYW1lLCAwLCBzaXplb2YoIGxwLT5OZXR3b3JrTmFtZSApKTsKKworCS8qIGRhdGEtPmZsYWdzIGlzIHplcm8gdG8gYXNrIGZvciAiYW55IiAqLworCWlmKCBkYXRhLT5mbGFncyA9PSAwICkgeworCQkvKiBOZWVkIHRoaXMgYmVjYXVzZSBpbiBTVEFQIGJ1aWxkIFBBUk1fREVGQVVMVF9TU0lEIGlzICJMaW51eEFQIgorCQkgKiA7P2J1dCB0aGVyZSBhaW4ndCBubyBTVEFQIGFueW1vcmUqLworCQlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX1NUQSAgKSB7CisJCQlzdHJjcHkoIGxwLT5OZXR3b3JrTmFtZSwgIkFOWSIgKTsKKwkJfSBlbHNlIHsKKwkJCS8vc3RyY3B5KCBscC0+TmV0d29ya05hbWUsICJBTlkiICk7CisJCQlzdHJjcHkoIGxwLT5OZXR3b3JrTmFtZSwgUEFSTV9ERUZBVUxUX1NTSUQgKTsKKwkJfQorCX0gZWxzZSB7CisJCW1lbWNweSggbHAtPk5ldHdvcmtOYW1lLCBzc2lkLCBkYXRhLT5sZW5ndGggKTsKKwl9CisKKwlEQkdfTk9USUNFKCBEYmdJbmZvLCAic2V0IE5ldHdvcmtOYW1lOiAlc1xuIiwgc3NpZCApOworCisJLyogQ29tbWl0IHRoZSBhZGFwdGVyIHBhcmFtZXRlcnMgKi8KKwl3bF9hcHBseSggbHAgKTsKKworCS8qIFNlbmQgYW4gZXZlbnQgdGhhdCBFU1NJRCBoYXMgYmVlbiBzZXQgKi8KKwl3bF93ZXh0X2V2ZW50X2Vzc2lkKCBscC0+ZGV2ICk7CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX3NldF9lc3NpZAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX2dldF9lc3NpZCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEdldHMgdGhlIEVTU0lEIChuZXR3b3JrIG5hbWUpIHRoYXQgdGhlIHdpcmVsZXNzIGRldmljZSBpcyBhc3NvY2lhdGVkCisgKiAgd2l0aC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX2dldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKQorCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50ICAgICAgICAgcmV0ID0gMDsKKwlpbnQgICAgICAgICBzdGF0dXMgPSAtMTsKKwl3dk5hbWVfdCAgICAqcE5hbWU7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX2dldF9lc3NpZCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCS8qIEdldCB0aGUgZGVzaXJlZCBuZXR3b3JrIG5hbWUgKi8KKwlscC0+bHR2UmVjb3JkLmxlbiA9IDEgKyAoIHNpemVvZiggKnBOYW1lICkgLyBzaXplb2YoIGhjZl8xNiApKTsKKworCisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEKKwkJCQkJLy87P3Nob3VsZCB3ZSByZXR1cm4gYW4gZXJyb3Igc3RhdHVzIGluIEFQIG1vZGUKKworCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0RFU0lSRURfU1NJRDsKKworI2VuZGlmCisKKworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKwkJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CisKKwlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX0FQICApIHsKKwkJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ05GX09XTl9TU0lEOworCX0KKworI2VuZGlmIC8vIEhDRl9BUAorCisKKwlzdGF0dXMgPSBoY2ZfZ2V0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKwlpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworCQlwTmFtZSA9ICh3dk5hbWVfdCAqKSYoIGxwLT5sdHZSZWNvcmQudS51MzIgKTsKKworCQkvKiBFbmRpYW4gdHJhbnNsYXRlIHRoZSBzdHJpbmcgbGVuZ3RoICovCisJCXBOYW1lLT5sZW5ndGggPSBDTlZfTElUVExFX1RPX0lOVCggcE5hbWUtPmxlbmd0aCApOworCisJCS8qIENvcHkgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIgYnVmZmVyICovCisJCWRhdGEtPmxlbmd0aCA9IHBOYW1lLT5sZW5ndGg7CisKKwkJLyogTk9URTogTnVsbCB0ZXJtaW5hdGluZyBpcyBuZWNlc3NhcnkgZm9yIHByb3BlciBkaXNwbGF5IG9mIHRoZSBTU0lEIGluCisJCSAgIHRoZSB3aXJlbGVzcyB0b29scyAqLworCQlkYXRhLT5sZW5ndGggPSBwTmFtZS0+bGVuZ3RoICsgMTsKKwkJaWYoIHBOYW1lLT5sZW5ndGggPCBIQ0ZfTUFYX05BTUVfTEVOICkgeworCQkJcE5hbWUtPm5hbWVbcE5hbWUtPmxlbmd0aF0gPSAnXDAnOworCQl9CisKKwkJZGF0YS0+ZmxhZ3MgPSAxOworCisKKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQQorCQkJCQkvLzs/c2hvdWxkIHdlIHJldHVybiBhbiBlcnJvciBzdGF0dXMgaW4gQVAgbW9kZQorI2lmZGVmIFJFVFVSTl9DVVJSRU5UX05FVFdPUktOQU1FCisKKwkJLyogaWYgZGVzaXJlZCBpcyBudWxsICgiYW55IiksIHJldHVybiBjdXJyZW50IG9yICJhbnkiICovCisJCWlmKCBwTmFtZS0+bmFtZVswXSA9PSAnXDAnICkgeworCQkJLyogR2V0IHRoZSBjdXJyZW50IG5ldHdvcmsgbmFtZSAqLworCQkJbHAtPmx0dlJlY29yZC5sZW4gPSAxICsgKCBzaXplb2YoKnBOYW1lICkgLyBzaXplb2YoIGhjZl8xNiApKTsKKwkJCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NVUl9TU0lEOworCisJCQlzdGF0dXMgPSBoY2ZfZ2V0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkJaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJCQlwTmFtZSA9ICh3dk5hbWVfdCAqKSYoIGxwLT5sdHZSZWNvcmQudS51MzIgKTsKKworCQkJCS8qIEVuZGlhbiB0cmFuc2xhdGUgdGhlIHN0cmluZyBsZW5ndGggKi8KKwkJCQlwTmFtZS0+bGVuZ3RoID0gQ05WX0xJVFRMRV9UT19JTlQoIHBOYW1lLT5sZW5ndGggKTsKKworCQkJCS8qIENvcHkgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIgYnVmZmVyICovCisJCQkJZGF0YS0+bGVuZ3RoID0gcE5hbWUtPmxlbmd0aCArIDE7CisJCQkJaWYoIHBOYW1lLT5sZW5ndGggPCBIQ0ZfTUFYX05BTUVfTEVOICkgeworCQkJCQlwTmFtZS0+bmFtZVtwTmFtZS0+bGVuZ3RoXSA9ICdcMCc7CisJCQkJfQorCisJCQkJZGF0YS0+ZmxhZ3MgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWdvdG8gb3V0X3VubG9jazsKKwkJCX0KKwkJfQorCisjZW5kaWYgLy8gUkVUVVJOX0NVUlJFTlRfTkVUV09SS05BTUUKKyNlbmRpZiAvLyBIQ0ZfU1RBCisKKwkJZGF0YS0+bGVuZ3RoLS07CisKKwkJaWYgKHBOYW1lLT5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCW1lbWNweShlc3NpZCwgcE5hbWUtPm5hbWUsIHBOYW1lLT5sZW5ndGgpOworCX0gZWxzZSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKK291dF91bmxvY2s6CisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19nZXRfZXNzaWQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19zZXRfZW5jb2RlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICBTZXRzIHRoZSBlbmNyeXB0aW9uIGtleXMgYW5kIHN0YXR1cyAoZW5hYmxlIG9yIGRpc2FibGUpLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3Nfc2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqa2V5YnVmKQoreworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCAgICAgcmV0ID0gMDsKKworI2lmIDEgLy87PyAjaWYgV0lSRUxFU1NfRVhUID4gOCAtIHVzZWQgdW5jb25kaXRpb25hbGx5IGluIHRoZSByZXN0IG9mIHRoZSBjb2RlLi4uCisJaGNmXzggICBlbmNyeXB0aW9uX3N0YXRlOworI2VuZGlmIC8vIFdJUkVMRVNTX0VYVCA+IDgKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid2lyZWxlc3Nfc2V0X2VuY29kZSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCS8qIElzIGVuY3J5cHRpb24gc3VwcG9ydGVkPyAqLworCWlmKCAhd2xfaGFzX3dlcCggJiggbHAtPmhjZkN0eCApKSkgeworCQlEQkdfV0FSTklORyggRGJnSW5mbywgIldFUCBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlXG4iICk7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJREJHX05PVElDRSggRGJnSW5mbywgInBvaW50ZXI6ICVwLCBsZW5ndGg6ICVkLCBmbGFnczogJSN4XG4iLAorCQkJCWtleWJ1ZiwgZXJxLT5sZW5ndGgsCisJCQkJZXJxLT5mbGFncyk7CisKKwkvKiBTYXZlIHN0YXRlIG9mIEVuY3J5cHRpb24gc3dpdGNoICovCisJZW5jcnlwdGlvbl9zdGF0ZSA9IGxwLT5FbmFibGVFbmNyeXB0aW9uOworCisJLyogQmFzaWMgY2hlY2tpbmc6IGRvIHdlIGhhdmUgYSBrZXkgdG8gc2V0PyAqLworCWlmKChlcnEtPmxlbmd0aCkgIT0gMCkgeworCQlpbnQgaW5kZXggICA9ICggZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCApIC0gMTsKKwkJaW50IHRrICAgICAgPSBscC0+VHJhbnNtaXRLZXlJRCAtIDE7CQkvLyBjdXJyZW50IGtleQorCisKKwkJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIGtleSAqLworCQlzd2l0Y2goZXJxLT5sZW5ndGgpIHsKKwkJY2FzZSAwOgorCQkJYnJlYWs7CisKKwkJY2FzZSBNSU5fS0VZX1NJWkU6CisJCWNhc2UgTUFYX0tFWV9TSVpFOgorCisJCQkvKiBDaGVjayB0aGUgaW5kZXggKi8KKwkJCWlmKCggaW5kZXggPCAwICkgfHwgKCBpbmRleCA+PSBNQVhfS0VZUyApKSB7CisJCQkJaW5kZXggPSB0azsKKwkJCX0KKworCQkJLyogQ2xlYW51cCAqLworCQkJbWVtc2V0KCBscC0+RGVmYXVsdEtleXMua2V5W2luZGV4XS5rZXksIDAsIE1BWF9LRVlfU0laRSApOworCisJCQkvKiBDb3B5IHRoZSBrZXkgaW4gdGhlIGRyaXZlciAqLworCQkJbWVtY3B5KCBscC0+RGVmYXVsdEtleXMua2V5W2luZGV4XS5rZXksIGtleWJ1ZiwgZXJxLT5sZW5ndGgpOworCisJCQkvKiBTZXQgdGhlIGxlbmd0aCAqLworCQkJbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ubGVuID0gZXJxLT5sZW5ndGg7CisKKwkJCURCR19OT1RJQ0UoIERiZ0luZm8sICJlbmNvZGluZy5sZW5ndGg6ICVkXG4iLCBlcnEtPmxlbmd0aCApOworCQkJREJHX05PVElDRSggRGJnSW5mbywgInNldCBrZXk6ICVzKCVkKSBbJWRdXG4iLCBscC0+RGVmYXVsdEtleXMua2V5W2luZGV4XS5rZXksCisJCQkJCQlscC0+RGVmYXVsdEtleXMua2V5W2luZGV4XS5sZW4sIGluZGV4ICk7CisKKwkJCS8qIEVuYWJsZSBXRVAgKGlmIHBvc3NpYmxlKSAqLworCQkJaWYoKCBpbmRleCA9PSB0ayApICYmICggbHAtPkRlZmF1bHRLZXlzLmtleVt0a10ubGVuID4gMCApKSB7CisJCQkJbHAtPkVuYWJsZUVuY3J5cHRpb24gPSAxOworCQkJfQorCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICJJbnZhbGlkIEtleSBsZW5ndGhcbiIgKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwl9IGVsc2UgeworCQlpbnQgaW5kZXggPSAoIGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVggKSAtIDE7CisKKworCQkvKiBEbyB3ZSB3YW50IHRvIGp1c3Qgc2V0IHRoZSBjdXJyZW50IHRyYW5zbWl0IGtleT8gKi8KKwkJaWYoKCBpbmRleCA+PSAwICkgJiYgKCBpbmRleCA8IE1BWF9LRVlTICkpIHsKKwkJCURCR19OT1RJQ0UoIERiZ0luZm8sICJpbmRleDogJWQ7IGxlbjogJWRcbiIsIGluZGV4LAorCQkJCQkJbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ubGVuICk7CisKKwkJCWlmKCBscC0+RGVmYXVsdEtleXMua2V5W2luZGV4XS5sZW4gPiAwICkgeworCQkJCWxwLT5UcmFuc21pdEtleUlEICAgICAgID0gaW5kZXggKyAxOworCQkJCWxwLT5FbmFibGVFbmNyeXB0aW9uICAgID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICJQcm9ibGVtIHNldHRpbmcgdGhlIGN1cnJlbnQgVHhLZXlcbiIgKTsKKwkJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJfQorCQl9CisJfQorCisJLyogUmVhZCB0aGUgZmxhZ3MgKi8KKwlpZiggZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCApIHsKKwkJbHAtPkVuYWJsZUVuY3J5cHRpb24gPSAwOwkvLyBkaXNhYmxlIGVuY3J5cHRpb24KKwl9IGVsc2UgeworCQlscC0+RW5hYmxlRW5jcnlwdGlvbiA9IDE7CisJfQorCisJaWYoIGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCApIHsKKwkJREJHX1dBUk5JTkcoIERiZ0luZm8sICJJV19FTkNPREVfUkVTVFJJQ1RFRCBpbnZhbGlkXG4iICk7CisJCXJldCA9IC1FSU5WQUw7CQkvLyBJbnZhbGlkCisJfQorCisJREJHX1RSQUNFKCBEYmdJbmZvLCAiZW5jcnlwdGlvbl9zdGF0ZSA6ICAgICAgICVkXG4iLCBlbmNyeXB0aW9uX3N0YXRlICk7CisJREJHX1RSQUNFKCBEYmdJbmZvLCAibHAtPkVuYWJsZUVuY3J5cHRpb24gOiAgICVkXG4iLCBscC0+RW5hYmxlRW5jcnlwdGlvbiApOworCURCR19UUkFDRSggRGJnSW5mbywgImVycS0+bGVuZ3RoICAgICAgICAgICAgOiAlZFxuIiwKKwkJCSAgIGVycS0+bGVuZ3RoKTsKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJlcnEtPmZsYWdzICAgICAgICAgICAgIDogMHgleFxuIiwKKwkJCSAgIGVycS0+ZmxhZ3MpOworCisJLyogV3JpdGUgdGhlIGNoYW5nZXMgdG8gdGhlIGNhcmQgKi8KKwlpZiggcmV0ID09IDAgKSB7CisJCURCR19OT1RJQ0UoIERiZ0luZm8sICJlbmNyeXB0OiAlZCwgSUQ6ICVkXG4iLCBscC0+RW5hYmxlRW5jcnlwdGlvbiwKKwkJCQkJbHAtPlRyYW5zbWl0S2V5SUQgKTsKKworCQlpZiggbHAtPkVuYWJsZUVuY3J5cHRpb24gPT0gZW5jcnlwdGlvbl9zdGF0ZSApIHsKKwkJCWlmKCBlcnEtPmxlbmd0aCAhPSAwICkgeworCQkJCS8qIER5bmFtaWMgV0VQIGtleSB1cGRhdGUgKi8KKwkJCQl3bF9zZXRfd2VwX2tleXMoIGxwICk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBUbyBzd2l0Y2ggZW5jcnlwdGlvbiBvbi9vZmYsIHNvZnQgcmVzZXQgaXMgcmVxdWlyZWQgKi8KKwkJCXdsX2FwcGx5KCBscCApOworCQl9CisJfQorCisJLyogU2VuZCBhbiBldmVudCB0aGF0IEVuY3J5cHRpb24gaGFzIGJlZW4gc2V0ICovCisJd2xfd2V4dF9ldmVudF9lbmNvZGUoIGRldiApOworCitvdXRfdW5sb2NrOgorCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19zZXRfZW5jb2RlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3NfZ2V0X2VuY29kZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgR2V0cyB0aGUgZW5jcnlwdGlvbiBrZXlzIGFuZCBzdGF0dXMuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19nZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXkpCisKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaW5kZXg7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX2dldF9lbmNvZGUiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisJREJHX05PVElDRShEYmdJbmZvLCAiR0lXRU5DT0RFOiBlbmNyeXB0OiAlZCwgSUQ6ICVkXG4iLCBscC0+RW5hYmxlRW5jcnlwdGlvbiwgbHAtPlRyYW5zbWl0S2V5SUQpOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogT25seSBzdXBlci11c2VyIGNhbiBzZWUgV0VQIGtleSAqLworCWlmKCAhY2FwYWJsZSggQ0FQX05FVF9BRE1JTiApKSB7CisJCXJldCA9IC1FUEVSTTsKKwkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCXJldHVybiByZXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJLyogSXMgaXQgc3VwcG9ydGVkPyAqLworCWlmKCAhd2xfaGFzX3dlcCggJiggbHAtPmhjZkN0eCApKSkgeworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCS8qIEJhc2ljIGNoZWNraW5nICovCisJaW5kZXggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCApIC0gMTsKKworCisJLyogU2V0IHRoZSBmbGFncyAqLworCWVycS0+ZmxhZ3MgPSAwOworCisJaWYoIGxwLT5FbmFibGVFbmNyeXB0aW9uID09IDAgKSB7CisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOworCX0KKworCS8qIFdoaWNoIGtleSBkbyB3ZSB3YW50ICovCisJaWYoKCBpbmRleCA8IDAgKSB8fCAoIGluZGV4ID49IE1BWF9LRVlTICkpIHsKKwkJaW5kZXggPSBscC0+VHJhbnNtaXRLZXlJRCAtIDE7CisJfQorCisJZXJxLT5mbGFncyB8PSBpbmRleCArIDE7CisKKwkvKiBDb3B5IHRoZSBrZXkgdG8gdGhlIHVzZXIgYnVmZmVyICovCisJZXJxLT5sZW5ndGggPSBscC0+RGVmYXVsdEtleXMua2V5W2luZGV4XS5sZW47CisKKwltZW1jcHkoa2V5LCBscC0+RGVmYXVsdEtleXMua2V5W2luZGV4XS5rZXksIGVycS0+bGVuZ3RoKTsKKworb3V0X3VubG9jazoKKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3NfZ2V0X2VuY29kZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX3NldF9uaWNrbmFtZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgU2V0cyB0aGUgbmlja25hbWUsIG9yIHN0YXRpb24gbmFtZSwgb2YgdGhlIHdpcmVsZXNzIGRldmljZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX3NldF9uaWNrbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQoreworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19zZXRfbmlja25hbWUiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKyNpZiAwIC8vOz8gTmVlZGVkLCB3YXMgcHJlc2VudCBpbiBvcmlnaW5hbCBjb2RlIGJ1dCBub3QgaW4gNy4xOCBMaW51eCAyLjYga2VybmVsIHZlcnNpb24KKwlpZiggIWNhcGFibGUoQ0FQX05FVF9BRE1JTiApKSB7CisJCXJldCA9IC1FUEVSTTsKKwkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCXJldHVybiByZXQ7CisJfQorI2VuZGlmCisKKwkvKiBWYWxpZGF0ZSB0aGUgbmV3IHZhbHVlICovCisJaWYoZGF0YS0+bGVuZ3RoID4gSENGX01BWF9OQU1FX0xFTikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwltZW1zZXQoIGxwLT5TdGF0aW9uTmFtZSwgMCwgc2l6ZW9mKCBscC0+U3RhdGlvbk5hbWUgKSk7CisKKwltZW1jcHkoIGxwLT5TdGF0aW9uTmFtZSwgbmlja25hbWUsIGRhdGEtPmxlbmd0aCApOworCisJLyogQ29tbWl0IHRoZSBhZGFwdGVyIHBhcmFtZXRlcnMgKi8KKwl3bF9hcHBseSggbHAgKTsKKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3Nfc2V0X25pY2tuYW1lCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3NfZ2V0X25pY2tuYW1lKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICBHZXRzIHRoZSBuaWNrbmFtZSwgb3Igc3RhdGlvbiBuYW1lLCBvZiB0aGUgd2lyZWxlc3MgZGV2aWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3NfZ2V0X25pY2tuYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50ICAgICAgICAgcmV0ID0gMDsKKwlpbnQgICAgICAgICBzdGF0dXMgPSAtMTsKKwl3dk5hbWVfdCAgICAqcE5hbWU7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX2dldF9uaWNrbmFtZSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCS8qIEdldCB0aGUgY3VycmVudCBzdGF0aW9uIG5hbWUgKi8KKwlscC0+bHR2UmVjb3JkLmxlbiA9IDEgKyAoIHNpemVvZiggKnBOYW1lICkgLyBzaXplb2YoIGhjZl8xNiApKTsKKwlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DTkZfT1dOX05BTUU7CisKKwlzdGF0dXMgPSBoY2ZfZ2V0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCWlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCXBOYW1lID0gKHd2TmFtZV90ICopJiggbHAtPmx0dlJlY29yZC51LnUzMiApOworCisJCS8qIEVuZGlhbiB0cmFuc2xhdGUgdGhlIGxlbmd0aCAqLworCQlwTmFtZS0+bGVuZ3RoID0gQ05WX0xJVFRMRV9UT19JTlQoIHBOYW1lLT5sZW5ndGggKTsKKworCQlpZiAoIHBOYW1lLT5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSApIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCX0gZWxzZSB7CisJCQkvKiBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlciAqLworCQkJZGF0YS0+bGVuZ3RoID0gcE5hbWUtPmxlbmd0aDsKKwkJCW1lbWNweShuaWNrbmFtZSwgcE5hbWUtPm5hbWUsIHBOYW1lLT5sZW5ndGgpOworCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwl9CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRShEYmdJbmZvKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19nZXRfbmlja25hbWUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19zZXRfcG9ydHR5cGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgIFNldHMgdGhlIHBvcnQgdHlwZSBvZiB0aGUgd2lyZWxlc3MgZGV2aWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3Nfc2V0X3BvcnR0eXBlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKwloY2ZfMTYgIHBvcnRUeXBlOworCWhjZl8xNgljcmVhdGVJQlNTOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCURCR19GVU5DKCAid2lyZWxlc3Nfc2V0X3BvcnR0eXBlIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJLyogVmFsaWRhdGUgdGhlIG5ldyB2YWx1ZSAqLworCXN3aXRjaCggKm1vZGUgKSB7CisJY2FzZSBJV19NT0RFX0FESE9DOgorCisJCS8qIFdoZW4gdXNlciByZXF1ZXN0cyBhZC1ob2MsIHNldCBJQlNTIG1vZGUhICovCisJCXBvcnRUeXBlICAgICAgICAgPSAxOworCQljcmVhdGVJQlNTICAgICAgID0gMTsKKworCQlscC0+RG93bmxvYWRGaXJtd2FyZSA9IFdWTEFOX0RSVl9NT0RFX1NUQTsgLy8xOworCisJCWJyZWFrOworCisKKwljYXNlIElXX01PREVfQVVUTzoKKwljYXNlIElXX01PREVfSU5GUkE6CisKKwkJLyogQm90aCBhdXRvbWF0aWMgYW5kIGluZnJhc3RydWN0dXJlIHNldCBwb3J0IHRvIEJTUy9TVEEgbW9kZSAqLworCQlwb3J0VHlwZSAgICAgICAgID0gMTsKKwkJY3JlYXRlSUJTUyAgICAgICA9IDA7CisKKwkJbHAtPkRvd25sb2FkRmlybXdhcmUgPSBXVkxBTl9EUlZfTU9ERV9TVEE7IC8vMTsKKworCQlicmVhazsKKworCisjaWYgMCAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorCisJY2FzZSBJV19NT0RFX01BU1RFUjoKKworCQkvKiBTZXQgQlNTL0FQIG1vZGUgKi8KKwkJcG9ydFR5cGUgICAgICAgICAgICAgPSAxOworCisJCWxwLT5DcmVhdGVJQlNTICAgICAgID0gMDsKKwkJbHAtPkRvd25sb2FkRmlybXdhcmUgPSBXVkxBTl9EUlZfTU9ERV9BUDsgLy8yOworCisJCWJyZWFrOworCisjZW5kaWYgLyogKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQICovCisKKworCWRlZmF1bHQ6CisKKwkJcG9ydFR5cGUgICA9IDA7CisJCWNyZWF0ZUlCU1MgPSAwOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCWlmKCBwb3J0VHlwZSAhPSAwICkgeworCQkvKiBPbmx5IGRvIHNvbWV0aGluZyBpZiB0aGVyZSBpcyBhIG1vZGUgY2hhbmdlICovCisJCWlmKCAoIGxwLT5Qb3J0VHlwZSAhPSBwb3J0VHlwZSApIHx8IChscC0+Q3JlYXRlSUJTUyAhPSBjcmVhdGVJQlNTKSkgeworCQkJbHAtPlBvcnRUeXBlICAgPSBwb3J0VHlwZTsKKwkJCWxwLT5DcmVhdGVJQlNTID0gY3JlYXRlSUJTUzsKKworCQkJLyogQ29tbWl0IHRoZSBhZGFwdGVyIHBhcmFtZXRlcnMgKi8KKwkJCXdsX2dvKCBscCApOworCisJCQkvKiBTZW5kIGFuIGV2ZW50IHRoYXQgbW9kZSBoYXMgYmVlbiBzZXQgKi8KKwkJCXdsX3dleHRfZXZlbnRfbW9kZSggbHAtPmRldiApOworCQl9CisJfQorCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19zZXRfcG9ydHR5cGUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19nZXRfcG9ydHR5cGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgIEdldHMgdGhlIHBvcnQgdHlwZSBvZiB0aGUgd2lyZWxlc3MgZGV2aWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3NfZ2V0X3BvcnR0eXBlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKKworeworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCAgICAgcmV0ID0gMDsKKwlpbnQgICAgIHN0YXR1cyA9IC0xOworCWhjZl8xNiAgKnBQb3J0VHlwZTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid2lyZWxlc3NfZ2V0X3BvcnR0eXBlIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJLyogR2V0IHRoZSBjdXJyZW50IHBvcnQgdHlwZSAqLworCWxwLT5sdHZSZWNvcmQubGVuID0gMSArICggc2l6ZW9mKCAqcFBvcnRUeXBlICkgLyBzaXplb2YoIGhjZl8xNiApKTsKKwlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DTkZfUE9SVF9UWVBFOworCisJc3RhdHVzID0gaGNmX2dldF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwlpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworCQlwUG9ydFR5cGUgPSAoaGNmXzE2ICopJiggbHAtPmx0dlJlY29yZC51LnUzMiApOworCisJCSpwUG9ydFR5cGUgPSBDTlZfTElUVExFX1RPX0lOVCggKnBQb3J0VHlwZSApOworCisJCXN3aXRjaCggKnBQb3J0VHlwZSApIHsKKwkJY2FzZSAxOgorCisjaWYgMAorI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorCisJCQlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX0FQICApIHsKKwkJCQkqbW9kZSA9IElXX01PREVfTUFTVEVSOworCQkJfSBlbHNlIHsKKwkJCQkqbW9kZSA9IElXX01PREVfSU5GUkE7CisJCQl9CisKKyNlbHNlCisKKwkJCSptb2RlID0gSVdfTU9ERV9JTkZSQTsKKworI2VuZGlmICAvKiAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAgKi8KKyNlbmRpZgorCisJCQlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX0FQICApIHsKKwkJCQkqbW9kZSA9ICBJV19NT0RFX01BU1RFUjsKKwkJCX0gZWxzZSB7CisJCQkJaWYoIGxwLT5DcmVhdGVJQlNTICkgeworCQkJCQkqbW9kZSA9IElXX01PREVfQURIT0M7CisJCQkJfSBlbHNlIHsKKwkJCQkJKm1vZGUgPSBJV19NT0RFX0lORlJBOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisKKworCQljYXNlIDM6CisJCQkqbW9kZSA9IElXX01PREVfQURIT0M7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwl9CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX2dldF9wb3J0dHlwZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX3NldF9wb3dlcigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgU2V0cyB0aGUgcG93ZXIgbWFuYWdlbWVudCBzZXR0aW5ncyBvZiB0aGUgd2lyZWxlc3MgZGV2aWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3Nfc2V0X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wYXJhbSAqd3JxLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid2lyZWxlc3Nfc2V0X3Bvd2VyIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJREJHX1BSSU5UKCAiVEhJUyBDT1JSVVBUUyBQTUVuYWJsZWQgOz8hISEhISEhISEhISEhISEhISEhISEhISEhISEhIVxuIiApOworCisjaWYgMCAvLzs/IE5lZWRlZCwgd2FzIHByZXNlbnQgaW4gb3JpZ2luYWwgY29kZSBidXQgbm90IGluIDcuMTggTGludXggMi42IGtlcm5lbCB2ZXJzaW9uCisJaWYoICFjYXBhYmxlKCBDQVBfTkVUX0FETUlOICkpIHsKKwkJcmV0ID0gLUVQRVJNOworCisJCURCR19MRUFWRSggRGJnSW5mbyApOworCQlyZXR1cm4gcmV0OworCX0KKyNlbmRpZgorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJLyogU2V0IHRoZSBwb3dlciBtYW5hZ2VtZW50IHN0YXRlIGJhc2VkIG9uIHRoZSAnZGlzYWJsZWQnIHZhbHVlICovCisJaWYoIHdycS0+ZGlzYWJsZWQgKSB7CisJCWxwLT5QTUVuYWJsZWQgPSAwOworCX0gZWxzZSB7CisJCWxwLT5QTUVuYWJsZWQgPSAxOworCX0KKworCS8qIENvbW1pdCB0aGUgYWRhcHRlciBwYXJhbWV0ZXJzICovCisJd2xfYXBwbHkoIGxwICk7CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX3NldF9wb3dlcgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX2dldF9wb3dlcigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgR2V0cyB0aGUgcG93ZXIgbWFuYWdlbWVudCBzZXR0aW5ncyBvZiB0aGUgd2lyZWxlc3MgZGV2aWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3NfZ2V0X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSkKKworeworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggIndpcmVsZXNzX2dldF9wb3dlciIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCURCR19QUklOVCggIlRISVMgSVMgUFJPQkFCTFkgQU4gT1ZFUi1TSU1QTElGSUNBVElPTiA7PyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhXG4iICk7CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwlycnEtPmZsYWdzID0gMDsKKwlycnEtPnZhbHVlID0gMDsKKworCWlmKCBscC0+UE1FbmFibGVkICkgeworCQlycnEtPmRpc2FibGVkID0gMDsKKwl9IGVsc2UgeworCQlycnEtPmRpc2FibGVkID0gMTsKKwl9CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX2dldF9wb3dlcgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX2dldF90eF9wb3dlcigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgR2V0cyB0aGUgdHJhbnNtaXQgcG93ZXIgb2YgdGhlIHdpcmVsZXNzIGRldmljZSdzIHJhZGlvLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3NfZ2V0X3R4X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3aXJlbGVzc19nZXRfdHhfcG93ZXIiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKyNpZmRlZiBVU0VfUE9XRVJfREJNCisJcnJxLT52YWx1ZSA9IFJBRElPX1RYX1BPV0VSX0RCTTsKKwlycnEtPmZsYWdzID0gSVdfVFhQT1dfREJNOworI2Vsc2UKKwlycnEtPnZhbHVlID0gUkFESU9fVFhfUE9XRVJfTVdBVFQ7CisJcnJxLT5mbGFncyA9IElXX1RYUE9XX01XQVRUOworI2VuZGlmCisJcnJxLT5maXhlZCA9IDE7CisJcnJxLT5kaXNhYmxlZCA9IDA7CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX2dldF90eF9wb3dlcgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX3NldF9ydHNfdGhyZXNob2xkKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICBTZXRzIHRoZSBSVFMgdGhyZXNob2xkIGZvciB0aGUgd2lyZWxlc3MgY2FyZC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX3NldF9ydHNfdGhyZXNob2xkIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJ0aHIgPSBydHMtPnZhbHVlOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19zZXRfcnRzX3RocmVzaG9sZCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWlmKHJ0cy0+Zml4ZWQgPT0gMCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKyNpZiBXSVJFTEVTU19FWFQgPiA4CisJaWYoIHJ0cy0+ZGlzYWJsZWQgKSB7CisJCXJ0aHIgPSAyMzQ3OworCX0KKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCisKKwlpZigoIHJ0aHIgPCAyNTYgKSB8fCAoIHJ0aHIgPiAyMzQ3ICkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJbHAtPlJUU1RocmVzaG9sZCA9IHJ0aHI7CisKKwl3bF9hcHBseSggbHAgKTsKKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3Nfc2V0X3J0c190aHJlc2hvbGQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19nZXRfcnRzX3RocmVzaG9sZCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgR2V0cyB0aGUgUlRTIHRocmVzaG9sZCBmb3IgdGhlIHdpcmVsZXNzIGNhcmQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19nZXRfcnRzX3RocmVzaG9sZCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCURCR19GVU5DKCAid2lyZWxlc3NfZ2V0X3J0c190aHJlc2hvbGQiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwlydHMtPnZhbHVlID0gbHAtPlJUU1RocmVzaG9sZDsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDgKKworCXJ0cy0+ZGlzYWJsZWQgPSAoIHJ0cy0+dmFsdWUgPT0gMjM0NyApOworCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gOCAqLworCisJcnRzLT5maXhlZCA9IDE7CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX2dldF9ydHNfdGhyZXNob2xkCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19zZXRfcmF0ZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFNldCB0aGUgZGVmYXVsdCBkYXRhIHJhdGUgc2V0dGluZyB1c2VkIGJ5IHRoZSB3aXJlbGVzcyBkZXZpY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19zZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisjaWZkZWYgV0FSUAorCWludCBzdGF0dXMgPSAtMTsKKwlpbnQgaW5kZXggPSAwOworI2VuZGlmICAvLyBXQVJQCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX3NldF9yYXRlIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisjaWZkZWYgV0FSUAorCisJLyogRGV0ZXJtaW5lIGlmIHRoZSBjYXJkIGlzIG9wZXJhdGluZyBpbiB0aGUgMi40IG9yIDUuMCBHSHogYmFuZDsgY2hlY2sKKwkgICBpZiBCaXQgOSBpcyBzZXQgaW4gdGhlIGN1cnJlbnQgY2hhbm5lbCBSSUQgKi8KKwlscC0+bHR2UmVjb3JkLmxlbiA9IDI7CisJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ1VSX0NIQU5ORUw7CisKKwlzdGF0dXMgPSBoY2ZfZ2V0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCWlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCWluZGV4ID0gKCBDTlZfTElUVExFX1RPX0lOVCggbHAtPmx0dlJlY29yZC51LnUxNlswXSApICYgMHgxMDAgKSA/IDEgOiAwOworCisJCURCR19QUklOVCggIkluZGV4OiAlZFxuIiwgaW5kZXggKTsKKwl9IGVsc2UgeworCQlEQkdfRVJST1IoIERiZ0luZm8sICJDb3VsZCBub3QgZGV0ZXJtaW5lIHJhZGlvIGZyZXF1ZW5jeVxuIiApOworCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWlmKCBycnEtPnZhbHVlID4gMCAmJgorCQlycnEtPnZhbHVlIDw9IDEgKiBNRUdBQklUICkgeworCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDAwMDE7CisJfQorCWVsc2UgaWYoIHJycS0+dmFsdWUgPiAxICogTUVHQUJJVCAmJgorCQkJcnJxLT52YWx1ZSA8PSAyICogTUVHQUJJVCApIHsKKwkJaWYoIHJycS0+Zml4ZWQgPT0gMSApIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDAwMjsKKwkJfSBlbHNlIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDAwMzsKKwkJfQorCX0KKwllbHNlIGlmKCBycnEtPnZhbHVlID4gMiAqIE1FR0FCSVQgJiYKKwkJCXJycS0+dmFsdWUgPD0gNSAqIE1FR0FCSVQgKSB7CisJCWlmKCBycnEtPmZpeGVkID09IDEgKSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDAwMDQ7CisJCX0gZWxzZSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDAwMDc7CisJCX0KKwl9CisJZWxzZSBpZiggcnJxLT52YWx1ZSA+IDUgKiBNRUdBQklUICYmCisJCQlycnEtPnZhbHVlIDw9IDYgKiBNRUdBQklUICkgeworCQlpZiggcnJxLT5maXhlZCA9PSAxICkgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwMDEwOworCQl9IGVsc2UgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwMDE3OworCQl9CisJfQorCWVsc2UgaWYoIHJycS0+dmFsdWUgPiA2ICogTUVHQUJJVCAmJgorCQkJcnJxLT52YWx1ZSA8PSA5ICogTUVHQUJJVCApIHsKKwkJaWYoIHJycS0+Zml4ZWQgPT0gMSApIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDAyMDsKKwkJfSBlbHNlIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDAzNzsKKwkJfQorCX0KKwllbHNlIGlmKCBycnEtPnZhbHVlID4gOSAqIE1FR0FCSVQgJiYKKwkJCXJycS0+dmFsdWUgPD0gMTEgKiBNRUdBQklUICkgeworCQlpZiggcnJxLT5maXhlZCA9PSAxICkgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwMDA4OworCQl9IGVsc2UgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwMDNGOworCQl9CisJfQorCWVsc2UgaWYoIHJycS0+dmFsdWUgPiAxMSAqIE1FR0FCSVQgJiYKKwkJCXJycS0+dmFsdWUgPD0gMTIgKiBNRUdBQklUICkgeworCQlpZiggcnJxLT5maXhlZCA9PSAxICkgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwMDQwOworCQl9IGVsc2UgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwMDdGOworCQl9CisJfQorCWVsc2UgaWYoIHJycS0+dmFsdWUgPiAxMiAqIE1FR0FCSVQgJiYKKwkJCXJycS0+dmFsdWUgPD0gMTggKiBNRUdBQklUICkgeworCQlpZiggcnJxLT5maXhlZCA9PSAxICkgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwMDgwOworCQl9IGVsc2UgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwMEZGOworCQl9CisJfQorCWVsc2UgaWYoIHJycS0+dmFsdWUgPiAxOCAqIE1FR0FCSVQgJiYKKwkJCXJycS0+dmFsdWUgPD0gMjQgKiBNRUdBQklUICkgeworCQlpZiggcnJxLT5maXhlZCA9PSAxICkgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwMTAwOworCQl9IGVsc2UgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwMUZGOworCQl9CisJfQorCWVsc2UgaWYoIHJycS0+dmFsdWUgPiAyNCAqIE1FR0FCSVQgJiYKKwkJCXJycS0+dmFsdWUgPD0gMzYgKiBNRUdBQklUICkgeworCQlpZiggcnJxLT5maXhlZCA9PSAxICkgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwMjAwOworCQl9IGVsc2UgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwM0ZGOworCQl9CisJfQorCWVsc2UgaWYoIHJycS0+dmFsdWUgPiAzNiAqIE1FR0FCSVQgJiYKKwkJCXJycS0+dmFsdWUgPD0gNDggKiBNRUdBQklUICkgeworCQlpZiggcnJxLT5maXhlZCA9PSAxICkgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwNDAwOworCQl9IGVsc2UgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwN0ZGOworCQl9CisJfQorCWVsc2UgaWYoIHJycS0+dmFsdWUgPiA0OCAqIE1FR0FCSVQgJiYKKwkJCXJycS0+dmFsdWUgPD0gNTQgKiBNRUdBQklUICkgeworCQlpZiggcnJxLT5maXhlZCA9PSAxICkgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwODAwOworCQl9IGVsc2UgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwRkZGOworCQl9CisJfQorCWVsc2UgaWYoIHJycS0+Zml4ZWQgPT0gMCApIHsKKwkJLyogSW4gdGhpcyBjYXNlLCB0aGUgdXNlciBoYXMgbm90IHNwZWNpZmllZCBhIGJpdHJhdGUsIG9ubHkgdGhlICJhdXRvIgorCQkgICBtb25pa2VyLiBTbywgc2V0IHRvIGFsbCBzdXBwb3J0ZWQgcmF0ZXMgKi8KKwkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gUEFSTV9NQVhfVFhfUkFURTsKKwl9IGVsc2UgeworCQlycnEtPnZhbHVlID0gMDsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCisjZWxzZQorCisJaWYoIHJycS0+dmFsdWUgPiAwICYmCisJCQlycnEtPnZhbHVlIDw9IDEgKiBNRUdBQklUICkgeworCQlscC0+VHhSYXRlQ29udHJvbFswXSA9IDE7CisJfQorCWVsc2UgaWYoIHJycS0+dmFsdWUgPiAxICogTUVHQUJJVCAmJgorCQkJcnJxLT52YWx1ZSA8PSAyICogTUVHQUJJVCApIHsKKwkJaWYoIHJycS0+Zml4ZWQgKSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFswXSA9IDI7CisJCX0gZWxzZSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFswXSA9IDY7CisJCX0KKwl9CisJZWxzZSBpZiggcnJxLT52YWx1ZSA+IDIgKiBNRUdBQklUICYmCisJCQlycnEtPnZhbHVlIDw9IDUgKiBNRUdBQklUICkgeworCQlpZiggcnJxLT5maXhlZCApIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sWzBdID0gNDsKKwkJfSBlbHNlIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sWzBdID0gNzsKKwkJfQorCX0KKwllbHNlIGlmKCBycnEtPnZhbHVlID4gNSAqIE1FR0FCSVQgJiYKKwkJCXJycS0+dmFsdWUgPD0gMTEgKiBNRUdBQklUICkgeworCQlpZiggcnJxLT5maXhlZCkgIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sWzBdID0gNTsKKwkJfSBlbHNlIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sWzBdID0gMzsKKwkJfQorCX0KKwllbHNlIGlmKCBycnEtPmZpeGVkID09IDAgKSB7CisJCS8qIEluIHRoaXMgY2FzZSwgdGhlIHVzZXIgaGFzIG5vdCBzcGVjaWZpZWQgYSBiaXRyYXRlLCBvbmx5IHRoZSAiYXV0byIKKwkJICAgbW9uaWtlci4gU28sIHNldCB0aGUgcmF0ZSB0byAxMU1iIGF1dG8gKi8KKwkJbHAtPlR4UmF0ZUNvbnRyb2xbMF0gPSAzOworCX0gZWxzZSB7CisJCXJycS0+dmFsdWUgPSAwOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisjZW5kaWYgIC8vIFdBUlAKKworCisJLyogQ29tbWl0IHRoZSBhZGFwdGVyIHBhcmFtZXRlcnMgKi8KKwl3bF9hcHBseSggbHAgKTsKKworb3V0X3VubG9jazoKKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3Nfc2V0X3JhdGUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19nZXRfcmF0ZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEdldCB0aGUgZGVmYXVsdCBkYXRhIHJhdGUgc2V0dGluZyB1c2VkIGJ5IHRoZSB3aXJlbGVzcyBkZXZpY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19nZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpCisKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgICAgIHJldCA9IDA7CisJaW50ICAgICBzdGF0dXMgPSAtMTsKKwloY2ZfMTYgIHR4UmF0ZTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid2lyZWxlc3NfZ2V0X3JhdGUiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwkvKiBHZXQgdGhlIGN1cnJlbnQgdHJhbnNtaXQgcmF0ZSBmcm9tIHRoZSBhZGFwdGVyICovCisJbHAtPmx0dlJlY29yZC5sZW4gPSAxICsgKCBzaXplb2YodHhSYXRlKS9zaXplb2YoaGNmXzE2KSk7CisJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ1VSX1RYX1JBVEU7CisKKwlzdGF0dXMgPSBoY2ZfZ2V0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCWlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisjaWZkZWYgV0FSUAorCisJCXR4UmF0ZSA9IENOVl9MSVRUTEVfVE9fSU5UKCBscC0+bHR2UmVjb3JkLnUudTE2WzBdICk7CisKKwkJaWYoIHR4UmF0ZSAmIDB4MDAwMSApIHsKKwkJCXR4UmF0ZSA9IDE7CisJCX0KKwkJZWxzZSBpZiggdHhSYXRlICYgMHgwMDAyICkgeworCQkJdHhSYXRlID0gMjsKKwkJfQorCQllbHNlIGlmKCB0eFJhdGUgJiAweDAwMDQgKSB7CisJCQl0eFJhdGUgPSA1OworCQl9CisJCWVsc2UgaWYoIHR4UmF0ZSAmIDB4MDAwOCApIHsKKwkJCXR4UmF0ZSA9IDExOworCQl9CisJCWVsc2UgaWYoIHR4UmF0ZSAmIDB4MDAwMTAgKSB7CisJCQl0eFJhdGUgPSA2OworCQl9CisJCWVsc2UgaWYoIHR4UmF0ZSAmIDB4MDAwMjAgKSB7CisJCQl0eFJhdGUgPSA5OworCQl9CisJCWVsc2UgaWYoIHR4UmF0ZSAmIDB4MDAwNDAgKSB7CisJCQl0eFJhdGUgPSAxMjsKKwkJfQorCQllbHNlIGlmKCB0eFJhdGUgJiAweDAwMDgwICkgeworCQkJdHhSYXRlID0gMTg7CisJCX0KKwkJZWxzZSBpZiggdHhSYXRlICYgMHgwMDEwMCApIHsKKwkJCXR4UmF0ZSA9IDI0OworCQl9CisJCWVsc2UgaWYoIHR4UmF0ZSAmIDB4MDAyMDAgKSB7CisJCQl0eFJhdGUgPSAzNjsKKwkJfQorCQllbHNlIGlmKCB0eFJhdGUgJiAweDAwNDAwICkgeworCQkJdHhSYXRlID0gNDg7CisJCX0KKwkJZWxzZSBpZiggdHhSYXRlICYgMHgwMDgwMCApIHsKKwkJCXR4UmF0ZSA9IDU0OworCQl9CisKKyNlbHNlCisKKwkJdHhSYXRlID0gKGhjZl8xNilDTlZfTElUVExFX1RPX0xPTkcoIGxwLT5sdHZSZWNvcmQudS51MzJbMF0gKTsKKworI2VuZGlmICAvLyBXQVJQCisKKwkJcnJxLT52YWx1ZSA9IHR4UmF0ZSAqIE1FR0FCSVQ7CisJfSBlbHNlIHsKKwkJcnJxLT52YWx1ZSA9IDA7CisJCXJldCA9IC1FRkFVTFQ7CisJfQorCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19nZXRfcmF0ZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworI2lmIDAgLy87PyBOb3QgdXNlZCBhbnltb3JlCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3NfZ2V0X3ByaXZhdGVfaW50ZXJmYWNlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUmV0dXJucyB0aGUgTGludXggV2lyZWxlc3MgRXh0ZW5zaW9ucycgY29tcGF0aWJsZSBwcml2YXRlIGludGVyZmFjZSBvZgorICogIHRoZSBkcml2ZXIuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdpcmVsZXNzX2dldF9wcml2YXRlX2ludGVyZmFjZSggc3RydWN0IGl3cmVxICp3cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50IHJldCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX2dldF9wcml2YXRlX2ludGVyZmFjZSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWlmKCB3cnEtPnUuZGF0YS5wb2ludGVyICE9IE5VTEwgKSB7CisJCXN0cnVjdCBpd19wcml2X2FyZ3MgcHJpdltdID0KKwkJeworCQkJeyBTSU9DU0lXTkVUTkFNRSwgSVdfUFJJVl9UWVBFX0NIQVIgfCBIQ0ZfTUFYX05BTUVfTEVOLCAwLCAic25ldHdvcmtfbmFtZSIgfSwKKwkJCXsgU0lPQ0dJV05FVE5BTUUsIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSENGX01BWF9OQU1FX0xFTiwgImduZXR3b3JrX25hbWUiIH0sCisJCQl7IFNJT0NTSVdTVEFOQU1FLCBJV19QUklWX1RZUEVfQ0hBUiB8IEhDRl9NQVhfTkFNRV9MRU4sIDAsICJzc3RhdGlvbl9uYW1lIiB9LAorCQkJeyBTSU9DR0lXU1RBTkFNRSwgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBIQ0ZfTUFYX05BTUVfTEVOLCAiZ3N0YXRpb25fbmFtZSIgfSwKKwkJCXsgU0lPQ1NJV1BPUlRUWVBFLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzcG9ydF90eXBlIiB9LAorCQkJeyBTSU9DR0lXUE9SVFRZUEUsIDAsIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdwb3J0X3R5cGUiIH0sCisJCX07CisKKwkJLyogVmVyaWZ5IHRoZSB1c2VyIGJ1ZmZlciAqLworCQlyZXQgPSB2ZXJpZnlfYXJlYSggVkVSSUZZX1dSSVRFLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoIHByaXYgKSk7CisKKwkJaWYoIHJldCAhPSAwICkgeworCQkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJLyogQ29weSB0aGUgZGF0YSBpbnRvIHRoZSB1c2VyJ3MgYnVmZmVyICovCisJCXdycS0+dS5kYXRhLmxlbmd0aCA9IE5FTEVNKCBwcml2ICk7CisJCWNvcHlfdG9fdXNlciggd3JxLT51LmRhdGEucG9pbnRlciwgJnByaXYsIHNpemVvZiggcHJpdiApKTsKKwl9CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19nZXRfcHJpdmF0ZV9pbnRlcmZhY2UKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZW5kaWYKKworCisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3Nfc2V0X3NjYW4oKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBJbnN0cnVjdHMgdGhlIGRyaXZlciB0byBpbml0aWF0ZSBhIG5ldHdvcmsgc2Nhbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX3NldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50ICAgICAgICAgICAgICAgICByZXQgPSAwOworCWludCAgICAgICAgICAgICAgICAgc3RhdHVzID0gLTE7CisJaW50CQkgICAgcmV0cmllcyA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJLy87PyBOb3RlOiBzaG93cyByZXN1bHRzIGFzIHRyYWNlLCByZXRydW5zIGFsd2F5cyAwIHVubGVzcyBCVVNZCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX3NldF9zY2FuIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJLyoKKyAgICAgICAgICogVGhpcyBsb29rcyBsaWtlIGEgbmljZSBwbGFjZSB0byB0ZXN0IGlmIHRoZSBIQ0YgaXMgc3RpbGwKKyAgICAgICAgICogY29tbXVuaWNhdGluZyB3aXRoIHRoZSBjYXJkLiBJdCBzZWVtcyB0aGF0IHNvbWV0aW1lcyBCQVBfMQorICAgICAgICAgKiBnZXRzIGNvcnJ1cHRlZC4gQnkgbG9va2luZyBhdCB0aGUgY29tbWVudHMgaW4gSENGIHRoZQorICAgICAgICAgKiBjYXVzZSBpcyBzdGlsbCBhIG1pc3RlcnkuIE9rYXksIHRoZSBjb21tdW5pY2F0aW9uIHRvIHRoZQorICAgICAgICAgKiBjYXJkIGlzIGRlYWQsIHJlc2V0IHRoZSBjYXJkIHRvIHJldml2ZS4KKyAgICAgICAgICovCisJaWYoKGxwLT5oY2ZDdHguSUZCX0NhcmRTdGF0ICYgQ0FSRF9TVEFUX0RFRlVOQ1QpICE9IDApCisJeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDQVJEIGlzIGluIERFRlVOQ1QgbW9kZSwgcmVzZXQgaXQgdG8gYnJpbmcgaXQgYmFjayB0byBsaWZlXG4iICk7CisJCXdsX3Jlc2V0KCBkZXYgKTsKKwl9CisKK3JldHJ5OgorCS8qIFNldCB0aGUgY29tcGxldGlvbiBzdGF0ZSB0byBGQUxTRSAqLworCWxwLT5wcm9iZV9yZXN1bHRzLnNjYW5fY29tcGxldGUgPSBGQUxTRTsKKworCisJLyogQ2hhbm5lbHMgdG8gc2NhbiAqLworI2lmZGVmIFdBUlAKKwlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDU7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfU0NBTl9DSEFOTkVMOworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDB4M0ZGRiApOyAgLy8gMi40IEdIeiBCYW5kCisJbHAtPmx0dlJlY29yZC51LnUxNlsxXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMHhGRkZGICk7ICAvLyA1LjAgR0h6IEJhbmQKKwlscC0+bHR2UmVjb3JkLnUudTE2WzJdICA9IENOVl9JTlRfVE9fTElUVExFKCAweEZGRkYgKTsgIC8vICAgICAgLi4KKwlscC0+bHR2UmVjb3JkLnUudTE2WzNdICA9IENOVl9JTlRfVE9fTElUVExFKCAweDAwMDcgKTsgIC8vICAgICAgLi4KKyNlbHNlCisJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1NDQU5fQ0hBTk5FTDsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAweDdGRkYgKTsKKyNlbmRpZiAgLy8gV0FSUAorCisJc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfU0NBTl9DSEFOTkVMIHJlc3VsdCAgICAgIDogMHgleFxuIiwgc3RhdHVzICk7CisKKwkvLyBIb2xkaW5nIHRoZSBsb2NrIHRvbyBsb25nLCBtYWtlIGEgZ2FwIHRvIGFsbG93IG90aGVyIHByb2Nlc3NlcworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKwlpZiggc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgeworCQkvL1JlY292ZXJ5CisJCXJldHJpZXMrKzsKKwkJaWYocmV0cmllcyA8PSAxMCkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiUmVzZXQgY2FyZCB0byByZWNvdmVyLCBhdHRlbXB0OiAlZFxuIiwgcmV0cmllcyApOworCQkJd2xfcmVzZXQoIGRldiApOworCisJCQkvLyBIb2xkaW5nIHRoZSBsb2NrIHRvbyBsb25nLCBtYWtlIGEgZ2FwIHRvIGFsbG93IG90aGVyIHByb2Nlc3NlcworCQkJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCQkJd2xfbG9jayggbHAsICZmbGFncyApOworCisJCQlnb3RvIHJldHJ5OworCQl9CisJfQorCisJLyogU2V0IHRoZSBTQ0FOX1NTSUQgdG8gIkFOWSIuIFVzaW5nIHRoaXMgUklEIGZvciBzY2FuIHByZXZlbnRzIHRoZSBuZWVkIHRvCisJICAgZGlzYXNzb2NpYXRlIGZyb20gdGhlIG5ldHdvcmsgd2UgYXJlIGN1cnJlbnRseSBvbiAqLworCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMTg7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfU0NBTl9TU0lEOworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDAgKTsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzFdICA9IENOVl9JTlRfVE9fTElUVExFKCAwICk7CisKKwlzdGF0dXMgPSBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCS8vIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19TQ0FOX1NTSUQgdG8gJ2FueScgc3RhdHVzOiAweCV4XG4iLCBzdGF0dXMgKTsKKworCS8qIEluaXRpYXRlIHRoZSBzY2FuICovCisJLyogTk9URTogVXNpbmcgSENGX0FDVF9TQ0FOIGhhcyBiZWVuIHJlbW92ZWQsIGFzIHVzaW5nIEhDRl9BQ1RfQUNTX1NDQU4gdG8KKwkgICByZXRyaWV2ZSBwcm9iZSByZXNwb25zZXMgbXVzdCBhbHdheXMgYmUgdXNlZCB0byBzdXBwb3J0IFdQQSAqLworCXN0YXR1cyA9IGhjZl9hY3Rpb24oICYoIGxwLT5oY2ZDdHggKSwgSENGX0FDVF9BQ1NfU0NBTiApOworCisJaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU1VDQ0VTU0ZVTExZIElOSVRJQVRFRCBTQ0FOLi4uXG4iICk7CisJfSBlbHNlIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSU5JVElBVEUgU0NBTiBGQUlMRUQuLi5cbiIgKTsKKwl9CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRShEYmdJbmZvKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19zZXRfc2NhbgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX2dldF9zY2FuKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgSW5zdHJ1Y3RzIHRoZSBkcml2ZXIgdG8gZ2F0aGVyIGFuZCByZXR1cm4gdGhlIHJlc3VsdHMgb2YgYSBuZXR3b3JrIHNjYW4uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCAgICAgICAgICAgICAgICAgcmV0ID0gMDsKKwlpbnQgICAgICAgICAgICAgICAgIGNvdW50OworCWNoYXIgICAgICAgICAgICAgICAgKmJ1ZjsKKwljaGFyICAgICAgICAgICAgICAgICpidWZfZW5kOworCXN0cnVjdCBpd19ldmVudCAgICAgaXdlOworCVBST0JFX1JFU1AgICAgICAgICAgKnByb2JlX3Jlc3A7CisJaGNmXzggICAgICAgICAgICAgICBtc2dbNTEyXTsKKwloY2ZfOCAgICAgICAgICAgICAgICp3cGFfaWU7CisJaGNmXzE2ICAgICAgICAgICAgICB3cGFfaWVfbGVuOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19nZXRfc2NhbiIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCS8qIElmIHRoZSBzY2FuIGlzIG5vdCBkb25lLCB0ZWxsIHRoZSBjYWxsaW5nIHByb2Nlc3MgdG8gdHJ5IGFnYWluIGxhdGVyICovCisJaWYoICFscC0+cHJvYmVfcmVzdWx0cy5zY2FuX2NvbXBsZXRlICkgeworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJREJHX1RSQUNFKCBEYmdJbmZvLCAiU0NBTiBDT01QTEVURSwgTnVtIG9mIEFQczogJWRcbiIsCisJCQkgICBscC0+cHJvYmVfcmVzdWx0cy5udW1fYXBzICk7CisKKwlidWYgICAgID0gZXh0cmE7CisJYnVmX2VuZCA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKKworCWZvciggY291bnQgPSAwOyBjb3VudCA8IGxwLT5wcm9iZV9yZXN1bHRzLm51bV9hcHM7IGNvdW50KysgKSB7CisJCS8qIFJlZmVyZW5jZSB0aGUgcHJvYmUgcmVzcG9uc2UgZnJvbSB0aGUgdGFibGUgKi8KKwkJcHJvYmVfcmVzcCA9IChQUk9CRV9SRVNQICopJmxwLT5wcm9iZV9yZXN1bHRzLlByb2JlVGFibGVbY291bnRdOworCisKKwkJLyogRmlyc3QgZW50cnkgTVVTVCBiZSB0aGUgTUFDIGFkZHJlc3MgKi8KKwkJbWVtc2V0KCAmaXdlLCAwLCBzaXplb2YoIGl3ZSApKTsKKworCQlpd2UuY21kICAgICAgICAgICAgICAgICA9IFNJT0NHSVdBUDsKKwkJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCW1lbWNweSggaXdlLnUuYXBfYWRkci5zYV9kYXRhLCBwcm9iZV9yZXNwLT5CU1NJRCwgRVRIX0FMRU4pOworCQlpd2UubGVuICAgICAgICAgICAgICAgICA9IElXX0VWX0FERFJfTEVOOworCisJCWJ1ZiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGJ1ZiwgYnVmX2VuZCwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOworCisKKwkJLyogVXNlIHRoZSBtb2RlIHRvIGluZGljYXRlIGlmIGl0J3MgYSBzdGF0aW9uIG9yIEFQICovCisJCS8qIFdvbid0IGFsd2F5cyBiZSBhbiBBUCBpZiBpbiBJQlNTIG1vZGUgKi8KKwkJbWVtc2V0KCAmaXdlLCAwLCBzaXplb2YoIGl3ZSApKTsKKworCQlpd2UuY21kID0gU0lPQ0dJV01PREU7CisKKwkJaWYoIHByb2JlX3Jlc3AtPmNhcGFiaWxpdHkgJiBDQVBBQklMSVRZX0lCU1MgKSB7CisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkJfSBlbHNlIHsKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX01BU1RFUjsKKwkJfQorCisJCWl3ZS5sZW4gPSBJV19FVl9VSU5UX0xFTjsKKworCQlidWYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBidWYsIGJ1Zl9lbmQsICZpd2UsIElXX0VWX1VJTlRfTEVOKTsKKworCisJCS8qIEFueSBxdWFsaXR5IGluZm9ybWF0aW9uICovCisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisKKwkJaXdlLmNtZCAgICAgICAgICAgICA9IElXRVZRVUFMOworCQlpd2UudS5xdWFsLmxldmVsICAgID0gZGJtKHByb2JlX3Jlc3AtPnNpZ25hbCk7CisJCWl3ZS51LnF1YWwubm9pc2UgICAgPSBkYm0ocHJvYmVfcmVzcC0+c2lsZW5jZSk7CisJCWl3ZS51LnF1YWwucXVhbCAgICAgPSBpd2UudS5xdWFsLmxldmVsIC0gaXdlLnUucXVhbC5ub2lzZTsKKwkJaXdlLnUucXVhbC51cGRhdGVkICA9IGxwLT5wcm9iZV9yZXN1bHRzLnNjYW5fY29tcGxldGUgfCBJV19RVUFMX0RCTTsKKwkJaXdlLmxlbiAgICAgICAgICAgICA9IElXX0VWX1FVQUxfTEVOOworCisJCWJ1ZiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGJ1ZiwgYnVmX2VuZCwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworCisKKwkJLyogRVNTSUQgaW5mb3JtYXRpb24gKi8KKwkJaWYoIHByb2JlX3Jlc3AtPnJhd0RhdGFbMV0gPiAwICkgeworCQkJbWVtc2V0KCAmaXdlLCAwLCBzaXplb2YoIGl3ZSApKTsKKworCQkJaXdlLmNtZCA9IFNJT0NHSVdFU1NJRDsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gcHJvYmVfcmVzcC0+cmF3RGF0YVsxXTsKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOworCisJCQlidWYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBidWYsIGJ1Zl9lbmQsICZpd2UsICZwcm9iZV9yZXNwLT5yYXdEYXRhWzJdKTsKKwkJfQorCisKKwkJLyogRW5jcnlwdGlvbiBJbmZvcm1hdGlvbiAqLworCQltZW1zZXQoICZpd2UsIDAsIHNpemVvZiggaXdlICkpOworCisJCWl3ZS5jbWQgICAgICAgICAgICAgPSBTSU9DR0lXRU5DT0RFOworCQlpd2UudS5kYXRhLmxlbmd0aCAgID0gMDsKKworCQkvKiBDaGVjayB0aGUgY2FwYWJpbGl0aWVzIGZpZWxkIG9mIHRoZSBQcm9iZSBSZXNwb25zZSB0byBzZWUgaWYKKwkJICAgJ3ByaXZhY3knIGlzIHN1cHBvcnRlZCBvbiB0aGUgQVAgaW4gcXVlc3Rpb24gKi8KKwkJaWYoIHByb2JlX3Jlc3AtPmNhcGFiaWxpdHkgJiBDQVBBQklMSVRZX1BSSVZBQ1kgKSB7CisJCQlpd2UudS5kYXRhLmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOworCQl9IGVsc2UgeworCQkJaXdlLnUuZGF0YS5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CisJCX0KKworCQlidWYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBidWYsIGJ1Zl9lbmQsICZpd2UsIE5VTEwpOworCisKKwkJLyogRnJlcXVlbmN5IEluZm8gKi8KKwkJbWVtc2V0KCAmaXdlLCAwLCBzaXplb2YoIGl3ZSApKTsKKworCQlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CisJCWl3ZS5sZW4gPSBJV19FVl9GUkVRX0xFTjsKKwkJaXdlLnUuZnJlcS5tID0gd2xfcGFyc2VfZHNfaWUoIHByb2JlX3Jlc3AgKTsKKwkJaXdlLnUuZnJlcS5lID0gMDsKKworCQlidWYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBidWYsIGJ1Zl9lbmQsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKKworCisjaWYgV0lSRUxFU1NfRVhUID4gMTQKKwkJLyogQ3VzdG9tIGluZm8gKEJlYWNvbiBJbnRlcnZhbCkgKi8KKwkJbWVtc2V0KCAmaXdlLCAwLCBzaXplb2YoIGl3ZSApKTsKKwkJbWVtc2V0KCBtc2csIDAsIHNpemVvZiggbXNnICkpOworCisJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCQlzcHJpbnRmKCBtc2csICJiZWFjb25faW50ZXJ2YWw9JWQiLCBwcm9iZV9yZXNwLT5iZWFjb25JbnRlcnZhbCApOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbiggbXNnICk7CisKKwkJYnVmID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgYnVmLCBidWZfZW5kLCAmaXdlLCBtc2cpOworCisKKwkJLyogQ3VzdG9tIGluZm8gKFdQQS1JRSkgKi8KKwkJd3BhX2llID0gTlVMTDsKKwkJd3BhX2llX2xlbiA9IDA7CisKKwkJd3BhX2llID0gd2xfcGFyc2Vfd3BhX2llKCBwcm9iZV9yZXNwLCAmd3BhX2llX2xlbiApOworCQlpZiggd3BhX2llICE9IE5VTEwgKSB7CisJCQltZW1zZXQoICZpd2UsIDAsIHNpemVvZiggaXdlICkpOworCQkJbWVtc2V0KCBtc2csIDAsIHNpemVvZiggbXNnICkpOworCisJCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKKwkJCXNwcmludGYoIG1zZywgIndwYV9pZT0lcyIsIHdsX3ByaW50X3dwYV9pZSggd3BhX2llLCB3cGFfaWVfbGVuICkpOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oIG1zZyApOworCisJCQlidWYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBidWYsIGJ1Zl9lbmQsICZpd2UsIG1zZyk7CisJCX0KKworCQkvKiBBZGQgb3RoZXIgY3VzdG9tIGluZm8gaW4gZm9ybWF0dGVkIHN0cmluZyBmb3JtYXQgYXMgbmVlZGVkLi4uICovCisjZW5kaWYKKwl9CisKKwlkYXRhLT5sZW5ndGggPSBidWYgLSBleHRyYTsKKworb3V0X3VubG9jazoKKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3NfZ2V0X3NjYW4KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNlbmRpZiAgLy8gV0lSRUxFU1NfRVhUID4gMTMKKworCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKKworc3RhdGljIGludCB3aXJlbGVzc19zZXRfYXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludAkJCSAgICAgIHJldDsKKwlpbnQJCQkgICAgICBpd2FfaWR4ID0gZGF0YS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYOworCWludAkJCSAgICAgIGl3YV92YWwgPSBkYXRhLT52YWx1ZTsKKworCURCR19GVU5DKCAid2lyZWxlc3Nfc2V0X2F1dGgiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwlzd2l0Y2ggKGl3YV9pZHgpIHsKKwkJY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgorCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfQVVUSF9XUEFfVkVSU0lPTlxuIik7CisJCQkvKiBXZSBkbyBzdXBwb3J0IFdQQSBvbmx5OyBob3cgc2hvdWxkIERJU0FCTEVEIGJlIHRyZWF0ZWQ/ICovCisJCQlpZiAoaXdhX3ZhbCA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQSkKKwkJCQlyZXQgPSAwOworCQkJZWxzZQorCQkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKworCQljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19BVVRIX1dQQV9FTkFCTEVEOiB2YWwgPSAlZFxuIiwgaXdhX3ZhbCk7CisJCQlpZiAoaXdhX3ZhbCkKKwkJCQlscC0+RW5hYmxlRW5jcnlwdGlvbiA9IDI7CisJCQllbHNlCisJCQkJbHAtPkVuYWJsZUVuY3J5cHRpb24gPSAwOworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgSVdfQVVUSF9US0lQX0NPVU5URVJNRUFTVVJFUzoKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0FVVEhfVEtJUF9DT1VOVEVSTUVBU1VSRVNcbiIpOworCQkJbHAtPmRyaXZlckVuYWJsZSA9ICFpd2FfdmFsOworCQkJaWYobHAtPmRyaXZlckVuYWJsZSkKKwkJCQloY2ZfY250bCgmKGxwLT5oY2ZDdHgpLCBIQ0ZfQ05UTF9FTkFCTEUgfCBIQ0ZfUE9SVF8wKTsKKwkJCWVsc2UKKwkJCQloY2ZfY250bCgmKGxwLT5oY2ZDdHgpLCBIQ0ZfQ05UTF9ESVNBQkxFIHwgSENGX1BPUlRfMCk7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19BVVRIX0RST1BfVU5FTkNSWVBURURcbiIpOworCQkJLyogV2UgZG8gbm90IGFjdHVhbGx5IGRvIGFueXRoaW5nIGhlcmUsIGp1c3QgdG8gc2lsZW5jZQorCQkJICogd3BhX3N1cHBsaWNhbnQgKi8KKwkJCXJldCA9IDA7CisJCQlicmVhazsKKworCQljYXNlIElXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFOgorCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfQVVUSF9DSVBIRVJfUEFJUldJU0VcbiIpOworCQkJLyogbm90IGltcGxlbWVudGVkLCByZXR1cm4gYW4gZXJyb3IgKi8KKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKworCQljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgorCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfQVVUSF9DSVBIRVJfR1JPVVBcbiIpOworCQkJLyogbm90IGltcGxlbWVudGVkLCByZXR1cm4gYW4gZXJyb3IgKi8KKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKworCQljYXNlIElXX0FVVEhfS0VZX01HTVQ6CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19BVVRIX0tFWV9NR01UXG4iKTsKKwkJCS8qIG5vdCBpbXBsZW1lbnRlZCwgcmV0dXJuIGFuIGVycm9yICovCisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisKKwkJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfQVVUSF84MDIxMV9BVVRIX0FMR1xuIik7CisJCQkvKiBub3QgaW1wbGVtZW50ZWQsIHJldHVybiBhbiBlcnJvciAqLworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCisJCWNhc2UgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTDoKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0xcbiIpOworCQkJLyogbm90IGltcGxlbWVudGVkLCByZXR1cm4gYW4gZXJyb3IgKi8KKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKworCQljYXNlIElXX0FVVEhfUk9BTUlOR19DT05UUk9MOgorCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfQVVUSF9ST0FNSU5HX0NPTlRST0xcbiIpOworCQkJLyogbm90IGltcGxlbWVudGVkLCByZXR1cm4gYW4gZXJyb3IgKi8KKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKworCQljYXNlIElXX0FVVEhfUFJJVkFDWV9JTlZPS0VEOgorCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfQVVUSF9QUklWQUNZX0lOVk9LRURcbiIpOworCQkJLyogbm90IGltcGxlbWVudGVkLCByZXR1cm4gYW4gZXJyb3IgKi8KKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfQVVUSF8/PyAoJWQpIHVua25vd25cbiIsIGl3YV9pZHgpOworCQkJLyogcmV0dXJuIGFuIGVycm9yICovCisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJfQorCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19zZXRfYXV0aAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKK3N0YXRpYyBpbnQgaGVybWVzX3NldF9rZXkobHR2X3QgKmx0diwgaW50IGFsZywgaW50IGtleV9pZHgsIHU4ICphZGRyLAorCQkJICBpbnQgc2V0X3R4LCB1OCAqc2VxLCB1OCAqa2V5LCBzaXplX3Qga2V5X2xlbikKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwkvLyBpbnQgICBjb3VudCA9IDA7CisJaW50ICAgYnVmX2lkeCA9IDA7CisJaGNmXzggdHNjW0lXX0VOQ09ERV9TRVFfTUFYX1NJWkVdID0KKwkJeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwIH07CisKKwlEQkdfRlVOQyggImhlcm1lc19zZXRfa2V5IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJLyoKKyAgICAgICAgICogQ2hlY2sgdGhlIGtleSBpbmRleCBoZXJlOyBpZiAwLCBsb2FkIGFzIFBhaXJ3aXNlIEtleSwgb3RoZXJ3aXNlLAorICAgICAgICAgKiBsb2FkIGFzIGEgZ3JvdXAga2V5LiBOb3RlIHRoYXQgZm9yIHRoZSBIZXJtZXMsIHRoZSBSSURzIGZvcgorICAgICAgICAgKiBncm91cC9wYXJpd2lzZSBrZXlzIGFyZSBkaWZmZXJlbnQgZnJvbSBlYWNoIG90aGVyIGFuZCBkaWZmZXJlbnQKKyAgICAgICAgICogdGhhbiB0aGUgZGVmYXVsdCBXRVAga2V5cyBhcyB3ZWxsLgorICAgICAgICAgKi8KKwlzd2l0Y2ggKGFsZykKKwl7CisJY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6CisJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0VOQ09ERV9BTEdfVEtJUDoga2V5KCVkKVxuIiwga2V5X2lkeCk7CisjaWYgMAorCQkvKgorICAgICAgICAgICAgICAgICAqIE1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzIG5vIGRhdGEgcXVldWVkIHVwIGluIHRoZSBmaXJtd2FyZQorICAgICAgICAgICAgICAgICAqIGJlZm9yZSBzZXR0aW5nIHRoZSBUS0lQIGtleXMuIElmIHRoaXMgY2hlY2sgaXMgbm90CisgICAgICAgICAgICAgICAgICogcGVyZm9ybWVkLCBzb21lIGRhdGEgbWF5IGJlIHNlbnQgb3V0IHdpdGggaW5jb3JyZWN0IE1JQworICAgICAgICAgICAgICAgICAqIGFuZCBjYXVzZSBzeW5jaHJvbml6YXJpb24gZXJyb3JzIHdpdGggdGhlIEFQCisgICAgICAgICAgICAgICAgICovCisJCS8qIENoZWNrIGV2ZXJ5IDFtcyBmb3IgMTAwbXMgKi8KKwkJZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgMTAwOyBjb3VudCsrICkKKwkJeworCQkJdXNsZWVwKCAxMDAwICk7CisKKwkJCWx0di5sZW4gPSAyOworCQkJbHR2LnR5cCA9IDB4RkQ5MTsgIC8vIFRoaXMgUklEIG5vdCBkZWZpbmVkIGluIEhDRiB5ZXQhISEKKwkJCWx0di51LnUxNlswXSA9IDA7CisKKwkJCXdsX2dldF9pbmZvKCBzb2NrLCAmbHR2LCBpZm5hbWUgKTsKKworCQkJaWYoIGx0di51LnUxNlswXSA9PSAwICkKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmKCBjb3VudCA9PSAxMDAgKQorCQl7CisJCQl3cGFfcHJpbnRmKCBNU0dfREVCVUcsICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgVHhRISIgKTsKKwkJfQorI2VuZGlmCisKKwkJc3dpdGNoIChrZXlfaWR4KSB7CisJCWNhc2UgMDoKKwkJCWx0di0+bGVuID0gMjg7CisJCQlsdHYtPnR5cCA9IENGR19BRERfVEtJUF9NQVBQRURfS0VZOworCisJCQkvKiBMb2FkIHRoZSBCU1NJRCAqLworCQkJbWVtY3B5KCZsdHYtPnUudThbYnVmX2lkeF0sIGFkZHIsIEVUSF9BTEVOKTsKKwkJCWJ1Zl9pZHggKz0gRVRIX0FMRU47CisKKwkJCS8qIExvYWQgdGhlIFRLSVAga2V5ICovCisJCQltZW1jcHkoJmx0di0+dS51OFtidWZfaWR4XSwgJmtleVswXSwgMTYpOworCQkJYnVmX2lkeCArPSAxNjsKKworCQkJLyogTG9hZCB0aGUgVFNDICovCisJCQltZW1jcHkoJmx0di0+dS51OFtidWZfaWR4XSwgdHNjLCBJV19FTkNPREVfU0VRX01BWF9TSVpFKTsKKwkJCWJ1Zl9pZHggKz0gSVdfRU5DT0RFX1NFUV9NQVhfU0laRTsKKworCQkJLyogTG9hZCB0aGUgUlNDICovCisJCQltZW1jcHkoJmx0di0+dS51OFtidWZfaWR4XSwgc2VxLCBJV19FTkNPREVfU0VRX01BWF9TSVpFKTsKKwkJCWJ1Zl9pZHggKz0gSVdfRU5DT0RFX1NFUV9NQVhfU0laRTsKKworCQkJLyogTG9hZCB0aGUgVHhNSUMga2V5ICovCisJCQltZW1jcHkoJmx0di0+dS51OFtidWZfaWR4XSwgJmtleVsxNl0sIDgpOworCQkJYnVmX2lkeCArPSA4OworCisJCQkvKiBMb2FkIHRoZSBSeE1JQyBrZXkgKi8KKwkJCW1lbWNweSgmbHR2LT51LnU4W2J1Zl9pZHhdLCAma2V5WzI0XSwgOCk7CisKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQljYXNlIDI6CisJCWNhc2UgMzoKKwkJCWx0di0+bGVuID0gMjY7CisJCQlsdHYtPnR5cCA9IENGR19BRERfVEtJUF9ERUZBVUxUX0tFWTsKKworCQkJLyogTG9hZCB0aGUga2V5IEluZGV4ICovCisJCQlsdHYtPnUudTE2W2J1Zl9pZHhdID0ga2V5X2lkeDsKKwkJCS8qIElmIHRoaXMgaXMgYSBUeCBLZXksIHNldCBiaXQgODAwMCAqLworCQkJaWYoc2V0X3R4KQorCQkJCWx0di0+dS51MTZbYnVmX2lkeF0gfD0gMHg4MDAwOworCQkJYnVmX2lkeCArPSAyOworCisJCQkvKiBMb2FkIHRoZSBSU0MgKi8KKwkJCW1lbWNweSgmbHR2LT51LnU4W2J1Zl9pZHhdLCBzZXEsIElXX0VOQ09ERV9TRVFfTUFYX1NJWkUpOworCQkJYnVmX2lkeCArPSBJV19FTkNPREVfU0VRX01BWF9TSVpFOworCisJCQkvKiBMb2FkIHRoZSBUS0lQLCBUeE1JQywgYW5kIFJ4TUlDIGtleXMgaW4gb25lIHNob3QsIGJlY2F1c2UgaW4KKwkJCSAgIENGR19BRERfVEtJUF9ERUZBVUxUX0tFWSB0aGV5IGFyZSBiYWNrLXRvLWJhY2sgKi8KKwkJCW1lbWNweSgmbHR2LT51LnU4W2J1Zl9pZHhdLCBrZXksIGtleV9sZW4pOworCQkJYnVmX2lkeCArPSBrZXlfbGVuOworCisJCQkvKiBMb2FkIHRoZSBUU0MgKi8KKwkJCW1lbWNweSgmbHR2LT51LnU4W2J1Zl9pZHhdLCB0c2MsIElXX0VOQ09ERV9TRVFfTUFYX1NJWkUpOworCisJCQlsdHYtPnUudTE2WzBdID0gQ05WX0lOVF9UT19MSVRUTEUobHR2LT51LnUxNlswXSk7CisKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIElXX0VOQ09ERV9BTEdfV0VQOgorCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19FTkNPREVfQUxHX1dFUDoga2V5KCVkKVxuIiwga2V5X2lkeCk7CisJCWJyZWFrOworCisJY2FzZSBJV19FTkNPREVfQUxHX0NDTVA6CisJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0VOQ09ERV9BTEdfQ0NNUDoga2V5KCVkKVxuIiwga2V5X2lkeCk7CisJCWJyZWFrOworCisJY2FzZSBJV19FTkNPREVfQUxHX05PTkU6CisJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0VOQ09ERV9BTEdfTk9ORToga2V5KCVkKVxuIiwga2V5X2lkeCk7CisJCXN3aXRjaCAoa2V5X2lkeCkgeworCQljYXNlIDA6CisJCQlpZiAobWVtY21wKGFkZHIsICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiLCBFVEhfQUxFTikgIT0gMCkgeworCQkJLy9pZiAoYWRkciAhPSBOVUxMKSB7CisJCQkJbHR2LT5sZW4gPSA3OworCQkJCWx0di0+dHlwID0gQ0ZHX1JFTU9WRV9US0lQX01BUFBFRF9LRVk7CisJCQkJbWVtY3B5KCZsdHYtPnUudThbMF0sIGFkZHIsIEVUSF9BTEVOKTsKKwkJCQlyZXQgPSAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJY2FzZSAyOgorCQljYXNlIDM6CisJCQkvKiBDbGVhciB0aGUgR3JvdXAgVEtJUCBrZXlzIGJ5IGluZGV4ICovCisJCQlsdHYtPmxlbiA9IDI7CisJCQlsdHYtPnR5cCA9IENGR19SRU1PVkVfVEtJUF9ERUZBVUxUX0tFWTsKKwkJCWx0di0+dS51MTZbMF0gPSBrZXlfaWR4OworCisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19FTkNPREVfPz86IGtleSglZClcbiIsIGtleV9pZHgpOworCQlicmVhazsKKwl9CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyBoZXJtZXNfc2V0X2tleQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKK3N0YXRpYyBpbnQgd2lyZWxlc3Nfc2V0X2VuY29kZWV4dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkJc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleWJ1ZikKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQJCQkgICAgICByZXQ7CisJaW50IGtleV9pZHggPSAoZXJxLT5mbGFncyZJV19FTkNPREVfSU5ERVgpIC0gMTsKKwlsdHZfdCBsdHY7CisJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWtleWJ1ZjsKKworCURCR19GVU5DKCAid2lyZWxlc3Nfc2V0X2VuY29kZWV4dCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChzaXplb2YoZXh0LT5yeF9zZXEpICE9IDgpIHsKKwkJREJHX1RSQUNFKERiZ0luZm8sICJyel9zZXEgc2l6ZSBtaXNtYXRjaFxuIik7CisJCURCR19MRUFWRShEYmdJbmZvKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSGFuZGxlIFdFUCBrZXlzIHZpYSB0aGUgb2xkIHNldCBlbmNvZGUgcHJvY2VkdXJlICovCisJaWYoZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19XRVApIHsKKwkJc3RydWN0IGl3X3BvaW50ICB3ZXBfZXJxOworCQljaGFyICAgICAgICAgICAgKndlcF9rZXlidWY7CisKKwkJLyogQnVpbGQgcmVxdWVzdCBzdHJ1Y3R1cmUgKi8KKwkJd2VwX2VycS5mbGFncyAgPSBlcnEtPmZsYWdzOyAgIC8vIHRha2Ugb3ZlciBmbGFncyB3aXRoIGtleSBpbmRleAorCQl3ZXBfZXJxLmxlbmd0aCA9IGV4dC0+a2V5X2xlbjsgLy8gdGFrZSBsZW5ndGggZnJvbSBleHRlbmRlZCBrZXkgaW5mbworCQl3ZXBfa2V5YnVmICAgICA9IGV4dC0+a2V5OyAgICAgLy8gcG9pbnRlciB0byB0aGUga2V5IHRleHQKKworCQkvKiBDYWxsIHdpcmVsZXNzX3NldF9lbmNvZGUgdG90IGhhbmRsZSB0aGUgV0VQIGtleSAqLworCQlyZXQgPSB3aXJlbGVzc19zZXRfZW5jb2RlKGRldiwgaW5mbywgJndlcF9lcnEsIHdlcF9rZXlidWYpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBQcm9jZWVkIGZvciBleHRlbmRlZCBlbmNvZGUgZnVuY3Rpb25zIGZvciBXQVAgYW5kIE5PTkUgKi8KKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwltZW1zZXQoJmx0diwgMCwgc2l6ZW9mKGx0dikpOworCXJldCA9IGhlcm1lc19zZXRfa2V5KCZsdHYsIGV4dC0+YWxnLCBrZXlfaWR4LCBleHQtPmFkZHIuc2FfZGF0YSwKKwkJCQlleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSwKKwkJCQlleHQtPnJ4X3NlcSwgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7CisKKwlpZiAocmV0ICE9IDApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiaGVybWVzX3NldF9rZXkgcmV0dXJuZWQgIT0gMCwga2V5IG5vdCBzZXRcbiIpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJLyogUHV0IHRoZSBrZXkgaW4gSENGICovCisJcmV0ID0gaGNmX3B1dF9pbmZvKCYobHAtPmhjZkN0eCksIChMVFZQKSZsdHYpOworCitvdXRfdW5sb2NrOgorCWlmKHJldCA9PSBIQ0ZfU1VDQ0VTUykgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJQdXQga2V5IGluZm8gc3VjY2VzXG4iKTsKKwl9IGVsc2UgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJQdXQga2V5IGluZm8gZmFpbGVkLCBrZXkgbm90IHNldFxuIik7CisJfQorCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19zZXRfZW5jb2RlZXh0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworc3RhdGljIGludCB3aXJlbGVzc19nZXRfZ2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkJICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKKworeworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCAgIHJldCA9IDA7CisJbHR2X3QgbHR2OworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19nZXRfZ2VuaWUiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwltZW1zZXQoJmx0diwgMCwgc2l6ZW9mKGx0dikpOworCWx0di5sZW4gPSAyOworCWx0di50eXAgPSBDRkdfU0VUX1dQQV9BVVRIX0tFWV9NR01UX1NVSVRFOworCWxwLT5BdXRoS2V5TWdtdFN1aXRlID0gbHR2LnUudTE2WzBdID0gNDsKKwlsdHYudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUobHR2LnUudTE2WzBdKTsKKworCXJldCA9IGhjZl9wdXRfaW5mbygmKGxwLT5oY2ZDdHgpLCAoTFRWUCkmbHR2KTsKKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworI2VuZGlmIC8vIFdJUkVMRVNTX0VYVCA+IDE3CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93aXJlbGVzc19zdGF0cygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFJldHVybiB0aGUgY3VycmVudCBkZXZpY2Ugd2lyZWxlc3Mgc3RhdGlzdGljcy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqIHdsX3dpcmVsZXNzX3N0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyAgICAqcFN0YXRzOworCXN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IHdsX3ByaXYoZGV2KTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid2xfd2lyZWxlc3Nfc3RhdHMiICk7CisJREJHX0VOVEVSKERiZ0luZm8pOworCURCR19QQVJBTShEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2KTsKKworCXBTdGF0cyA9IE5VTEw7CisKKwkvKiBJbml0aWFsaXplIHRoZSBzdGF0aXN0aWNzICovCisJcFN0YXRzCQkJPSAmKCBscC0+d3N0YXRzICk7CisJcFN0YXRzLT5xdWFsLnVwZGF0ZWQgICAgPSAweDAwOworCisJaWYoICEoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApKQorCXsKKwkJQ0ZHX0NPTU1TX1FVQUxJVFlfU1RSQ1QgKnBRdWFsOworCQlDRkdfSEVSTUVTX1RBTExJRVNfU1RSQ1QgdGFsbGllczsKKwkJaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKworCQkvKiBVcGRhdGUgZHJpdmVyIHN0YXR1cyAqLworCQlwU3RhdHMtPnN0YXR1cyA9IDA7CisKKwkJLyogR2V0IHRoZSBjdXJyZW50IGxpbmsgcXVhbGl0eSBpbmZvcm1hdGlvbiAqLworCQlscC0+bHR2UmVjb3JkLmxlbiA9IDEgKyAoIHNpemVvZiggKnBRdWFsICkgLyBzaXplb2YoIGhjZl8xNiApKTsKKwkJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ09NTVNfUVVBTElUWTsKKwkJc3RhdHVzID0gaGNmX2dldF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJCXBRdWFsID0gKENGR19DT01NU19RVUFMSVRZX1NUUkNUICopJiggbHAtPmx0dlJlY29yZCApOworCisjaWZkZWYgVVNFX0RCTQorCQkJcFN0YXRzLT5xdWFsLnF1YWwgID0gKHVfY2hhcikgQ05WX0xJVFRMRV9UT19JTlQoIHBRdWFsLT5jb21zX3F1YWwgKTsKKwkJCXBTdGF0cy0+cXVhbC5sZXZlbCA9ICh1X2NoYXIpIGRibSggQ05WX0xJVFRMRV9UT19JTlQoIHBRdWFsLT5zaWduYWxfbHZsICkpOworCQkJcFN0YXRzLT5xdWFsLm5vaXNlID0gKHVfY2hhcikgZGJtKCBDTlZfTElUVExFX1RPX0lOVCggcFF1YWwtPm5vaXNlX2x2bCApKTsKKworCQkJcFN0YXRzLT5xdWFsLnVwZGF0ZWQgfD0gKElXX1FVQUxfUVVBTF9VUERBVEVEICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdfUVVBTF9MRVZFTF9VUERBVEVEIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJV19RVUFMX05PSVNFX1VQREFURUQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElXX1FVQUxfREJNKTsKKyNlbHNlCisJCQlwU3RhdHMtPnF1YWwucXVhbCA9IHBlcmNlbnQoIENOVl9MSVRUTEVfVE9fSU5UKCBwUXVhbC0+Y29tc19xdWFsICksCisJCQkJCQkgICAgIEhDRl9NSU5fQ09NTV9RVUFMSVRZLAorCQkJCQkJICAgICBIQ0ZfTUFYX0NPTU1fUVVBTElUWSApOworCisJCQlwU3RhdHMtPnF1YWwubGV2ZWwgPSBwZXJjZW50KCBDTlZfTElUVExFX1RPX0lOVCggcFF1YWwtPnNpZ25hbF9sdmwgKSwKKwkJCQkJCSAgICAgIEhDRl9NSU5fU0lHTkFMX0xFVkVMLAorCQkJCQkJICAgICAgSENGX01BWF9TSUdOQUxfTEVWRUwgKTsKKworCQkJcFN0YXRzLT5xdWFsLm5vaXNlID0gcGVyY2VudCggQ05WX0xJVFRMRV9UT19JTlQoIHBRdWFsLT5ub2lzZV9sdmwgKSwKKwkJCQkJCSAgICAgIEhDRl9NSU5fTk9JU0VfTEVWRUwsCisJCQkJCQkgICAgICBIQ0ZfTUFYX05PSVNFX0xFVkVMICk7CisKKwkJCXBTdGF0cy0+cXVhbC51cGRhdGVkIHw9IChJV19RVUFMX1FVQUxfVVBEQVRFRCAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElXX1FVQUxfTEVWRUxfVVBEQVRFRCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdfUVVBTF9OT0lTRV9VUERBVEVEKTsKKyNlbmRpZiAvKiBVU0VfREJNICovCisJCX0gZWxzZSB7CisJCQltZW1zZXQoICYoIHBTdGF0cy0+cXVhbCApLCAwLCBzaXplb2YoIHBTdGF0cy0+cXVhbCApKTsKKwkJfQorCisJCS8qIEdldCB0aGUgY3VycmVudCB0YWxsaWVzIGZyb20gdGhlIGFkYXB0ZXIgKi8KKyAgICAgICAgICAgICAgICAvKiBPbmx5IHBvc3NpYmxlIHdoZW4gdGhlIGRldmljZSBpcyBvcGVuICovCisJCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQkJaWYoIHdsX2dldF90YWxsaWVzKCBscCwgJnRhbGxpZXMgKSA9PSAwICkgeworCQkJCS8qIE5vIGVuZGlhbiB0cmFuc2xhdGlvbiBpcyBuZWVkZWQgaGVyZSwgYXMgQ0ZHX1RBTExJRVMgaXMgYW4KKwkJCQkgICBNU0YgUklEOyBhbGwgcHJvY2Vzc2luZyBpcyBkb25lIG9uIHRoZSBob3N0LCBub3QgdGhlIGNhcmQhICovCisJCQkJcFN0YXRzLT5kaXNjYXJkLm53aWQgPSAwTDsKKwkJCQlwU3RhdHMtPmRpc2NhcmQuY29kZSA9IHRhbGxpZXMuUnhXRVBVbmRlY3J5cHRhYmxlOworCQkJCXBTdGF0cy0+ZGlzY2FyZC5taXNjID0gdGFsbGllcy5UeERpc2NhcmRzICsKKwkJCQkJCSAgICAgICB0YWxsaWVzLlJ4RkNTRXJyb3JzICsKKwkJCQkJCSAgICAgICAvL3RhbGxpZXMuUnhEaXNjYXJkc05vQnVmZmVyICsKKwkJCQkJCSAgICAgICB0YWxsaWVzLlR4RGlzY2FyZHNXcm9uZ1NBOworCQkJCS8vOz8gRXh0cmEgdGFrZW4gb3ZlciBmcm9tIExpbnV4IGRyaXZlciBiYXNlZCBvbiA3LjE4IHZlcnNpb24KKwkJCQlwU3RhdHMtPmRpc2NhcmQucmV0cmllcyA9IHRhbGxpZXMuVHhSZXRyeUxpbWl0RXhjZWVkZWQ7CisJCQkJcFN0YXRzLT5kaXNjYXJkLmZyYWdtZW50ID0gdGFsbGllcy5SeE1zZ0luQmFkTXNnRnJhZ21lbnRzOworCQkJfSBlbHNlIHsKKwkJCQltZW1zZXQoICYoIHBTdGF0cy0+ZGlzY2FyZCApLCAwLCBzaXplb2YoIHBTdGF0cy0+ZGlzY2FyZCApKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW1lbXNldCggJiggcFN0YXRzLT5kaXNjYXJkICksIDAsIHNpemVvZiggcFN0YXRzLT5kaXNjYXJkICkpOworCQl9CisJfQorCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHBTdGF0czsKK30gLy8gd2xfd2lyZWxlc3Nfc3RhdHMKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9nZXRfd2lyZWxlc3Nfc3RhdHMoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBSZXR1cm4gdGhlIGN1cnJlbnQgZGV2aWNlIHdpcmVsZXNzIHN0YXRpc3RpY3MuIFRoaXMgZnVuY3Rpb24gY2FsbHMKKyAqICAgICAgd2xfd2lyZWxlc3Nfc3RhdHMsIGJ1dCBhY3F1aXJlcyBzcGlubG9ja3MgZmlyc3QgYXMgaXQgY2FuIGJlIGNhbGxlZAorICogICAgICBkaXJlY3RseSBieSB0aGUgbmV0d29yayBsYXllci4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqIHdsX2dldF93aXJlbGVzc19zdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgZmxhZ3M7CisJc3RydWN0IHdsX3ByaXZhdGUgICAgICAgKmxwID0gd2xfcHJpdihkZXYpOworCXN0cnVjdCBpd19zdGF0aXN0aWNzICAgICpwU3RhdHMgPSBOVUxMOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCURCR19GVU5DKCAid2xfZ2V0X3dpcmVsZXNzX3N0YXRzIiApOworCURCR19FTlRFUihEYmdJbmZvKTsKKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworI2lmZGVmIFVTRV9SVFMKKwlpZiggbHAtPnVzZVJUUyA9PSAxICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTa2lwcGluZyB3aXJlbGVzcyBzdGF0cywgaW4gUlRTIG1vZGVcbiIgKTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJcFN0YXRzID0gd2xfd2lyZWxlc3Nfc3RhdHMoIGRldiApOworCX0KKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiBwU3RhdHM7Cit9IC8vIHdsX2dldF93aXJlbGVzc19zdGF0cworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9zcHlfZ2F0aGVyKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgR2F0aGVyIHdpcmVsZXNzIHNweSBzdGF0aXN0aWNzLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lubGluZSB2b2lkIHdsX3NweV9nYXRoZXIoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciAqbWFjICkKK3sKKwlzdHJ1Y3QgaXdfcXVhbGl0eSB3c3RhdHM7CisJaW50ICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXVfY2hhciAgICAgICAgICAgICAgICAgIHN0YXRzWzJdOworCURFU0NfU1RSQ1QgICAgICAgICAgICAgIGRlc2NbMV07CisJc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSB3bF9wcml2KGRldik7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJLyogc2hvcnRjdXQgKi8KKwlpZiAoIWxwLT5zcHlfZGF0YS5zcHlfbnVtYmVyKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiBHYXRoZXIgd2lyZWxlc3Mgc3B5IHN0YXRpc3RpY3M6IGZvciBlYWNoIHBhY2tldCwgY29tcGFyZSB0aGUgc291cmNlCisJICAgYWRkcmVzcyB3aXRoIG91dCBsaXN0LCBhbmQgaWYgbWF0Y2gsIGdldCB0aGUgc3RhdHMuICovCisJbWVtc2V0KCBzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7CisJbWVtc2V0KCBkZXNjLCAwLCBzaXplb2YoREVTQ19TVFJDVCkpOworCisJZGVzY1swXS5idWZfYWRkcgk9IHN0YXRzOworCWRlc2NbMF0uQlVGX1NJWkUJPSBzaXplb2Yoc3RhdHMpOworCWRlc2NbMF0ubmV4dF9kZXNjX2FkZHIgID0gMDsJCS8vIHRlcm1pbmF0ZSBsaXN0CisKKwlzdGF0dXMgPSBoY2ZfcmN2X21zZyggJiggbHAtPmhjZkN0eCApLCAmZGVzY1swXSwgMCApOworCisJaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJd3N0YXRzLmxldmVsID0gKHVfY2hhcikgZGJtKHN0YXRzWzFdKTsKKwkJd3N0YXRzLm5vaXNlID0gKHVfY2hhcikgZGJtKHN0YXRzWzBdKTsKKwkJd3N0YXRzLnF1YWwgID0gd3N0YXRzLmxldmVsID4gd3N0YXRzLm5vaXNlID8gd3N0YXRzLmxldmVsIC0gd3N0YXRzLm5vaXNlIDogMDsKKworCQl3c3RhdHMudXBkYXRlZCA9IChJV19RVUFMX1FVQUxfVVBEQVRFRCAgfAorCQkJCSAgSVdfUVVBTF9MRVZFTF9VUERBVEVEIHwKKwkJCQkgIElXX1FVQUxfTk9JU0VfVVBEQVRFRCB8CisJCQkJICBJV19RVUFMX0RCTSk7CisKKwkJd2lyZWxlc3Nfc3B5X3VwZGF0ZSggZGV2LCBtYWMsICZ3c3RhdHMgKTsKKwl9Cit9IC8vIHdsX3NweV9nYXRoZXIKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZXh0X2V2ZW50X2ZyZXEoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhbiBldmVudCB0aGF0IHRoZSBjaGFubmVsL2ZyZXEKKyAqICAgICAgY29uZmlndXJhdGlvbiBmb3IgYSBzcGVjaWZpYyBkZXZpY2UgaGFzIGNoYW5nZWQuCisgKgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gdGhlIG5ldHdvcmsgZGV2aWNlIGZvciB3aGljaCB0aGlzIGV2ZW50IGlzIHRvIGJlIGlzc3VlZAorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfd2V4dF9ldmVudF9mcmVxKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyNpZiBXSVJFTEVTU19FWFQgPiAxMworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwltZW1zZXQoICZ3cnF1LCAwLCBzaXplb2YoIHdycXUgKSk7CisKKwl3cnF1LmZyZXEubSA9IGxwLT5DaGFubmVsOworCXdycXUuZnJlcS5lID0gMDsKKworCXdpcmVsZXNzX3NlbmRfZXZlbnQoIGRldiwgU0lPQ1NJV0ZSRVEsICZ3cnF1LCBOVUxMICk7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTMgKi8KKworCXJldHVybjsKK30gLy8gd2xfd2V4dF9ldmVudF9mcmVxCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2V4dF9ldmVudF9tb2RlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgYW4gZXZlbnQgdGhhdCB0aGUgbW9kZSBvZiBvcGVyYXRpb24KKyAqICAgICAgZm9yIGEgc3BlY2lmaWMgZGV2aWNlIGhhcyBjaGFuZ2VkLgorICoKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIHRoZSBuZXR3b3JrIGRldmljZSBmb3Igd2hpY2ggdGhpcyBldmVudCBpcyB0byBiZSBpc3N1ZWQKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3dleHRfZXZlbnRfbW9kZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisjaWYgV0lSRUxFU1NfRVhUID4gMTMKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJbWVtc2V0KCAmd3JxdSwgMCwgc2l6ZW9mKCB3cnF1ICkpOworCisJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19TVEEgICkgeworCQl3cnF1Lm1vZGUgPSBJV19NT0RFX0lORlJBOworCX0gZWxzZSB7CisJCXdycXUubW9kZSA9IElXX01PREVfTUFTVEVSOworCX0KKworCXdpcmVsZXNzX3NlbmRfZXZlbnQoIGRldiwgU0lPQ1NJV01PREUsICZ3cnF1LCBOVUxMICk7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTMgKi8KKworCXJldHVybjsKK30gLy8gd2xfd2V4dF9ldmVudF9tb2RlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2V4dF9ldmVudF9lc3NpZCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIGFuIGV2ZW50IHRoYXQgdGhlIEVTU0lEIGNvbmZpZ3VyYXRpb24gZm9yCisgKiAgICAgIGEgc3BlY2lmaWMgZGV2aWNlIGhhcyBjaGFuZ2VkLgorICoKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIHRoZSBuZXR3b3JrIGRldmljZSBmb3Igd2hpY2ggdGhpcyBldmVudCBpcyB0byBiZSBpc3N1ZWQKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3dleHRfZXZlbnRfZXNzaWQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworI2lmIFdJUkVMRVNTX0VYVCA+IDEzCisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCW1lbXNldCggJndycXUsIDAsIHNpemVvZiggd3JxdSApKTsKKworCS8qIEZpbGwgb3V0IHRoZSBidWZmZXIuIE5vdGUgdGhhdCB0aGUgYnVmZmVyIGRvZXNuJ3QgYWN0dWFsbHkgY29udGFpbiB0aGUKKwkgICBFU1NJRCwgYnV0IGEgcG9pbnRlciB0byB0aGUgY29udGVudHMuIEluIGFkZGl0aW9uLCB0aGUgJ2V4dHJhJyBmaWVsZCBvZgorCSAgIHRoZSBjYWxsIHRvIHdpcmVsZXNzX3NlbmRfZXZlbnQoKSBtdXN0IGFsc28gcG9pbnQgdG8gd2hlcmUgdGhlIEVTU0lECisJICAgbGl2ZXMgKi8KKwl3cnF1LmVzc2lkLmxlbmd0aCAgPSBzdHJsZW4oIGxwLT5OZXR3b3JrTmFtZSApOworCXdycXUuZXNzaWQucG9pbnRlciA9IChjYWRkcl90KWxwLT5OZXR3b3JrTmFtZTsKKwl3cnF1LmVzc2lkLmZsYWdzICAgPSAxOworCisJd2lyZWxlc3Nfc2VuZF9ldmVudCggZGV2LCBTSU9DU0lXRVNTSUQsICZ3cnF1LCBscC0+TmV0d29ya05hbWUgKTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMyAqLworCisJcmV0dXJuOworfSAvLyB3bF93ZXh0X2V2ZW50X2Vzc2lkCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2V4dF9ldmVudF9lbmNvZGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhbiBldmVudCB0aGF0IHRoZSBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24KKyAqICAgICAgZm9yIGEgc3BlY2lmaWMgZGV2aWNlIGhhcyBjaGFuZ2VkLgorICoKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIHRoZSBuZXR3b3JrIGRldmljZSBmb3Igd2hpY2ggdGhpcyBldmVudCBpcyB0byBiZSBpc3N1ZWQKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3dleHRfZXZlbnRfZW5jb2RlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyNpZiBXSVJFTEVTU19FWFQgPiAxMworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJaW50IGluZGV4ID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCW1lbXNldCggJndycXUsIDAsIHNpemVvZiggd3JxdSApKTsKKworCWlmKCBscC0+RW5hYmxlRW5jcnlwdGlvbiA9PSAwICkgeworCQl3cnF1LmVuY29kaW5nLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCX0gZWxzZSB7CisJCXdycXUuZW5jb2RpbmcuZmxhZ3MgfD0gbHAtPlRyYW5zbWl0S2V5SUQ7CisKKwkJaW5kZXggPSBscC0+VHJhbnNtaXRLZXlJRCAtIDE7CisKKwkJLyogT25seSBzZXQgSVdfRU5DT0RFX1JFU1RSSUNURUQvT1BFTiBmbGFnIHVzaW5nIGxwLT5FeGNsdWRlVW5lbmNyeXB0ZWQKKwkJICAgaWYgd2UncmUgaW4gQVAgbW9kZSAqLworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKwkJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CisKKwkJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKSB7CisJCQlpZiggbHAtPkV4Y2x1ZGVVbmVuY3J5cHRlZCApIHsKKwkJCQl3cnF1LmVuY29kaW5nLmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOworCQkJfSBlbHNlIHsKKwkJCQl3cnF1LmVuY29kaW5nLmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOworCQkJfQorCQl9CisKKyNlbmRpZiAgLy8gSENGX1RZUEVfQVAKKworCQkvKiBPbmx5IHByb3ZpZGUgdGhlIGtleSBpZiBwZXJtaXNzaW9ucyBhbGxvdyAqLworCQlpZiggY2FwYWJsZSggQ0FQX05FVF9BRE1JTiApKSB7CisJCQl3cnF1LmVuY29kaW5nLnBvaW50ZXIgPSAoY2FkZHJfdClscC0+RGVmYXVsdEtleXMua2V5W2luZGV4XS5rZXk7CisJCQl3cnF1LmVuY29kaW5nLmxlbmd0aCAgPSBscC0+RGVmYXVsdEtleXMua2V5W2luZGV4XS5sZW47CisJCX0gZWxzZSB7CisJCQl3cnF1LmVuY29kaW5nLmZsYWdzIHw9IElXX0VOQ09ERV9OT0tFWTsKKwkJfQorCX0KKworCXdpcmVsZXNzX3NlbmRfZXZlbnQoIGRldiwgU0lPQ1NJV0VOQ09ERSwgJndycXUsCisJCQkJCQkgbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ua2V5ICk7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTMgKi8KKworCXJldHVybjsKK30gLy8gd2xfd2V4dF9ldmVudF9lbmNvZGUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZXh0X2V2ZW50X2FwKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgYW4gZXZlbnQgdGhhdCB0aGUgZGV2aWNlIGhhcyBiZWVuCisgKiAgICAgIGFzc29jaWF0ZWQgdG8gYSBuZXcgQVAuCisgKgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gdGhlIG5ldHdvcmsgZGV2aWNlIGZvciB3aGljaCB0aGlzIGV2ZW50IGlzIHRvIGJlIGlzc3VlZAorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfd2V4dF9ldmVudF9hcCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisjaWYgV0lSRUxFU1NfRVhUID4gMTMKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCWludCBzdGF0dXM7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwkvKiBSZXRyaWV2ZSB0aGUgV1BBLUlFcyB1c2VkIGJ5IHRoZSBmaXJtd2FyZSBhbmQgc2VuZCBhbiBldmVudC4gV2UgbXVzdCBzZW5kCisJICAgdGhpcyBldmVudCBCRUZPUkUgc2VuZGluZyB0aGUgYXNzb2NpYXRpb24gZXZlbnQsIGFzIHRoZXJlIGFyZSB0aW1pbmcKKwkgICBpc3N1ZXMgd2l0aCB0aGUgaG9zdGFwIHN1cHBsaWNhbnQuIFRoZSBzdXBwbGljYW50IHdpbGwgYXR0ZW1wdCB0byBwcm9jZXNzCisJICAgYW4gRUFQT0wtS2V5IGZyYW1lIGZyb20gYW4gQVAgYmVmb3JlIHJlY2VpdmluZyB0aGlzIGluZm9ybWF0aW9uLCB3aGljaAorCSAgIGlzIHJlcXVpcmVkIHByb3Blcmx5IHByb2Nlc3MgdGhlIHNhaWQgZnJhbWUuICovCisJd2xfd2V4dF9ldmVudF9hc3NvY19pZSggZGV2ICk7CisKKwkvKiBHZXQgdGhlIEJTU0lEICovCisJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ1VSX0JTU0lEOworCWxwLT5sdHZSZWNvcmQubGVuID0gNDsKKworCXN0YXR1cyA9IGhjZl9nZXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCWlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCW1lbXNldCggJndycXUsIDAsIHNpemVvZiggd3JxdSApKTsKKworCQltZW1jcHkoIHdycXUuYWRkci5zYV9kYXRhLCBscC0+bHR2UmVjb3JkLnUudTgsIEVUSF9BTEVOICk7CisKKwkJd3JxdS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKworCQl3aXJlbGVzc19zZW5kX2V2ZW50KCBkZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwgKTsKKwl9CisKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMyAqLworCisJcmV0dXJuOworfSAvLyB3bF93ZXh0X2V2ZW50X2FwCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dleHRfZXZlbnRfc2Nhbl9jb21wbGV0ZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIGFuIGV2ZW50IHRoYXQgYSByZXF1ZXN0IGZvciBhIG5ldHdvcmsgc2NhbgorICogICAgICBoYXMgY29tcGxldGVkLgorICoKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIHRoZSBuZXR3b3JrIGRldmljZSBmb3Igd2hpY2ggdGhpcyBldmVudCBpcyB0byBiZSBpc3N1ZWQKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3dleHRfZXZlbnRfc2Nhbl9jb21wbGV0ZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisjaWYgV0lSRUxFU1NfRVhUID4gMTMKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwltZW1zZXQoICZ3cnF1LCAwLCBzaXplb2YoIHdycXUgKSk7CisKKwl3cnF1LmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCXdpcmVsZXNzX3NlbmRfZXZlbnQoIGRldiwgU0lPQ0dJV1NDQU4sICZ3cnF1LCBOVUxMICk7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTMgKi8KKworCXJldHVybjsKK30gLy8gd2xfd2V4dF9ldmVudF9zY2FuX2NvbXBsZXRlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2V4dF9ldmVudF9uZXdfc3RhKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgYW4gZXZlbnQgdGhhdCBhbiBBUCBoYXMgcmVnaXN0ZXJlZCBhIG5ldworICogICAgICBzdGF0aW9uLgorICoKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIHRoZSBuZXR3b3JrIGRldmljZSBmb3Igd2hpY2ggdGhpcyBldmVudCBpcyB0byBiZSBpc3N1ZWQKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3dleHRfZXZlbnRfbmV3X3N0YSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisjaWYgV0lSRUxFU1NfRVhUID4gMTQKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwltZW1zZXQoICZ3cnF1LCAwLCBzaXplb2YoIHdycXUgKSk7CisKKwkvKiBTZW5kIHRoZSBzdGF0aW9uJ3MgbWFjIGFkZHJlc3MgaGVyZSAqLworCW1lbWNweSggd3JxdS5hZGRyLnNhX2RhdGEsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOICk7CisJd3JxdS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KCBkZXYsIElXRVZSRUdJU1RFUkVELCAmd3JxdSwgTlVMTCApOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDE0ICovCisKKwlyZXR1cm47Cit9IC8vIHdsX3dleHRfZXZlbnRfbmV3X3N0YQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dleHRfZXZlbnRfZXhwaXJlZF9zdGEoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhbiBldmVudCB0aGF0IGFuIEFQIGhhcyBkZXJlZ2lzdGVyZWQgYQorICogICAgICBzdGF0aW9uLgorICoKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIHRoZSBuZXR3b3JrIGRldmljZSBmb3Igd2hpY2ggdGhpcyBldmVudCBpcyB0byBiZSBpc3N1ZWQKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3dleHRfZXZlbnRfZXhwaXJlZF9zdGEoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworI2lmIFdJUkVMRVNTX0VYVCA+IDE0CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJbWVtc2V0KCAmd3JxdSwgMCwgc2l6ZW9mKCB3cnF1ICkpOworCisJbWVtY3B5KCB3cnF1LmFkZHIuc2FfZGF0YSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4gKTsKKwl3cnF1LmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCXdpcmVsZXNzX3NlbmRfZXZlbnQoIGRldiwgSVdFVkVYUElSRUQsICZ3cnF1LCBOVUxMICk7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTQgKi8KKworCXJldHVybjsKK30gLy8gd2xfd2V4dF9ldmVudF9leHBpcmVkX3N0YQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dleHRfZXZlbnRfbWljX2ZhaWxlZCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIGFuIGV2ZW50IHRoYXQgTUlDIGNhbGN1bGF0aW9ucyBmYWlsZWQuCisgKgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gdGhlIG5ldHdvcmsgZGV2aWNlIGZvciB3aGljaCB0aGlzIGV2ZW50IGlzIHRvIGJlIGlzc3VlZAorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfd2V4dF9ldmVudF9taWNfZmFpbGVkKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyNpZiBXSVJFTEVTU19FWFQgPiAxNAorCWNoYXIgICAgICAgICAgICAgICBtc2dbNTEyXTsKKwl1bmlvbiBpd3JlcV9kYXRhICAgd3JxdTsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJaW50ICAgICAgICAgICAgICAgIGtleV9pZHg7CisJY2hhciAgICAgICAgICAgICAgKmFkZHIxOworCWNoYXIgICAgICAgICAgICAgICphZGRyMjsKKwlXVkxBTl9SWF9XTVBfSERSICAqaGRyOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJa2V5X2lkeCA9IGxwLT5sb29rQWhlYWRCdWZbSEZTX1NUQVQrMV0gPj4gMzsKKwlrZXlfaWR4ICY9IDB4MDM7CisKKwkvKiBDYXN0IHRoZSBsb29rYWhlYWQgYnVmZmVyIGludG8gYSBSRlMgZm9ybWF0ICovCisJaGRyID0gKFdWTEFOX1JYX1dNUF9IRFIgKikmbHAtPmxvb2tBaGVhZEJ1ZltIRlNfU1RBVF07CisKKwkvKiBDYXN0IHRoZSBhZGRyZXNzZXMgdG8gYnl0ZSBidWZmZXJzLCBhcyBpbiB0aGUgYWJvdmUgUkZTIHRoZXkgYXJlIHdvcmQKKwkgICBsZW5ndGggKi8KKwlhZGRyMSA9IChjaGFyICopaGRyLT5hZGRyZXNzMTsKKwlhZGRyMiA9IChjaGFyICopaGRyLT5hZGRyZXNzMjsKKworCURCR19QUklOVCggIk1JQyBGQUlMIC0gS0VZIFVTRUQgOiAlZCwgU1RBVFVTIDogMHglMDR4XG4iLCBrZXlfaWR4LAorCQkJICAgaGRyLT5zdGF0dXMgKTsKKworCW1lbXNldCggJndycXUsIDAsIHNpemVvZiggd3JxdSApKTsKKwltZW1zZXQoIG1zZywgMCwgc2l6ZW9mKCBtc2cgKSk7CisKKworCS8qIEJlY3Vhc2UgTUlDIGZhaWx1cmVzIGFyZSBub3QgcGFydCBvZiB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9ucyB5ZXQsIHRoZXkKKwkgICBtdXN0IGJlIHBhc3NlZCBhcyBhIHN0cmluZyB1c2luZyBhbiBJV0VWQ1VTVE9NIGV2ZW50LiBJbiBvcmRlciBmb3IgdGhlCisJICAgZXZlbnQgdG8gYmUgZWZmZWN0aXZlLCB0aGUgc3RyaW5nIGZvcm1hdCBtdXN0IGJlIGtub3duIGJ5IGJvdGggdGhlCisJICAgZHJpdmVyIGFuZCB0aGUgc3VwcGxpY2FudC4gVGhlIGZvbGxvd2luZyBpcyB0aGUgc3RyaW5nIGZvcm1hdCB1c2VkIGJ5IHRoZQorCSAgIGhvc3RhcCBwcm9qZWN0J3MgV1BBIHN1cHBsaWNhbnQsIGFuZCB3aWxsIGJlIHVzZWQgaGVyZSB1bnRpbCB0aGUgV2lyZWxlc3MKKwkgICBFeHRlbnNpb25zIGludGVyZmFjZSBhZGRzIHRoaXMgc3VwcG9ydDoKKworCSAgIE1MTUUtTUlDSEFFTE1JQ0ZBSUxVUkUuaW5kaWNhdGlvbihrZXlpZD0jIGJyb2FkY2FzdC91bmljYXN0IGFkZHI9YWRkcjIpCisgICAqLworCisJLyogTk9URTogRm9ybWF0IG9mIE1BQyBhZGRyZXNzICh1c2luZyBjb2xvbnMgdG8gc2VwZXJhdGUgYnl0ZXMpIG1heSBjYXVzZQorCQkJIGEgcHJvYmxlbSBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIHN1cHBsaWNhbnQsIGlmIHRoZXkgZXZlcgorCQkJIGFjdHVhbGx5IHBhcnNlIHRoZXNlIHBhcmFtZXRlcnMgKi8KKyNpZiBEQkcKKwlzcHJpbnRmKCBtc2csICJNTE1FLU1JQ0hBRUxNSUNGQUlMVVJFLmluZGljYXRpb24oa2V5aWQ9JWQgJXNjYXN0IGFkZHI9IgorCQkJICIlcykiLCBrZXlfaWR4LCBhZGRyMVswXSAmIDB4MDEgPyAiYnJvYWQiIDogInVuaSIsCisJCQkgRGJnSHdBZGRyKCBhZGRyMiApKTsKKyNlbmRpZgorCXdycXUuZGF0YS5sZW5ndGggPSBzdHJsZW4oIG1zZyApOworCXdpcmVsZXNzX3NlbmRfZXZlbnQoIGRldiwgSVdFVkNVU1RPTSwgJndycXUsIG1zZyApOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDE0ICovCisKKwlyZXR1cm47Cit9IC8vIHdsX3dleHRfZXZlbnRfbWljX2ZhaWxlZAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dleHRfZXZlbnRfYXNzb2NfaWUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhbiBldmVudCBjb250YWluaW5nIHRoZSBXUEEtSUUgZ2VuZXJhdGVkCisgKiAgICAgIGJ5IHRoZSBmaXJtd2FyZSBpbiBhbiBhc3NvY2lhdGlvbiByZXF1ZXN0LgorICoKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIHRoZSBuZXR3b3JrIGRldmljZSBmb3Igd2hpY2ggdGhpcyBldmVudCBpcyB0byBiZSBpc3N1ZWQKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3dleHRfZXZlbnRfYXNzb2NfaWUoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworI2lmIFdJUkVMRVNTX0VYVCA+IDE0CisJY2hhciAgICAgICAgICAgICAgIG1zZ1s1MTJdOworCXVuaW9uIGl3cmVxX2RhdGEgICB3cnF1OworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwlpbnQgc3RhdHVzOworCVBST0JFX1JFU1AgICAgICAgICBkYXRhOworCWhjZl8xNiAgICAgICAgICAgICBsZW5ndGg7CisJaGNmXzggICAgICAgICAgICAgICp3cGFfaWU7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwltZW1zZXQoICZ3cnF1LCAwLCBzaXplb2YoIHdycXUgKSk7CisJbWVtc2V0KCBtc2csIDAsIHNpemVvZiggbXNnICkpOworCisJLyogUmV0cmlldmUgdGhlIEFzc29jaWF0aW9uIFJlcXVlc3QgSUUgKi8KKwlscC0+bHR2UmVjb3JkLmxlbiA9IDQ1OworCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NVUl9BU1NPQ19SRVFfSU5GTzsKKworCXN0YXR1cyA9IGhjZl9nZXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCWlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKQorCXsKKwkJbGVuZ3RoID0gMDsKKwkJbWVtY3B5KCAmZGF0YS5yYXdEYXRhLCAmKCBscC0+bHR2UmVjb3JkLnUudThbMV0gKSwgODggKTsKKwkJd3BhX2llID0gd2xfcGFyc2Vfd3BhX2llKCAmZGF0YSwgJmxlbmd0aCApOworCisJCS8qIEJlY3Vhc2UgdGhpcyBldmVudCAoQXNzb2NpYXRpb24gV1BBLUlFKSBpcyBub3QgcGFydCBvZiB0aGUgV2lyZWxlc3MKKwkJRXh0ZW5zaW9ucyB5ZXQsIGl0IG11c3QgYmUgcGFzc2VkIGFzIGEgc3RyaW5nIHVzaW5nIGFuIElXRVZDVVNUT00gZXZlbnQuCisJCUluIG9yZGVyIGZvciB0aGUgZXZlbnQgdG8gYmUgZWZmZWN0aXZlLCB0aGUgc3RyaW5nIGZvcm1hdCBtdXN0IGJlIGtub3duCisJCWJ5IGJvdGggdGhlIGRyaXZlciBhbmQgdGhlIHN1cHBsaWNhbnQuIFRoZSBmb2xsb3dpbmcgaXMgdGhlIHN0cmluZyBmb3JtYXQKKwkJdXNlZCBieSB0aGUgaG9zdGFwIHByb2plY3QncyBXUEEgc3VwcGxpY2FudCwgYW5kIHdpbGwgYmUgdXNlZCBoZXJlIHVudGlsCisJCXRoZSBXaXJlbGVzcyBFeHRlbnNpb25zIGludGVyZmFjZSBhZGRzIHRoaXMgc3VwcG9ydDoKKworCQlBU1NPQ0lORk8oUmVxSUVzPVdQQS1JRSBSZXNwSUVzPVdQQS1JRSkKKwkJKi8KKworCQlpZiggbGVuZ3RoICE9IDAgKQorCQl7CisJCQlzcHJpbnRmKCBtc2csICJBU1NPQ0lORk8oUmVxSUVzPSVzKSIsIHdsX3ByaW50X3dwYV9pZSggd3BhX2llLCBsZW5ndGggKSk7CisJCQl3cnF1LmRhdGEubGVuZ3RoID0gc3RybGVuKCBtc2cgKTsKKwkJCXdpcmVsZXNzX3NlbmRfZXZlbnQoIGRldiwgSVdFVkNVU1RPTSwgJndycXUsIG1zZyApOworCQl9CisJfQorI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDE0ICovCisKKwlyZXR1cm47Cit9ICAvLyB3bF93ZXh0X2V2ZW50X2Fzc29jX2llCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogU3RydWN0dXJlcyB0byBleHBvcnQgdGhlIFdpcmVsZXNzIEhhbmRsZXJzICovCisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyIHdsX2hhbmRsZXJbXSA9Cit7CisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2NvbW1pdCwgICAgICAgICAgIC8qIFNJT0NTSVdDT01NSVQgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X3Byb3RvY29sLCAgICAgLyogU0lPQ0dJV05BTUUgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV05XSUQgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV05XSUQgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X2ZyZXF1ZW5jeSwgICAgLyogU0lPQ1NJV0ZSRVEgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X2ZyZXF1ZW5jeSwgICAgLyogU0lPQ0dJV0ZSRVEgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X3BvcnR0eXBlLCAgICAgLyogU0lPQ1NJV01PREUgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X3BvcnR0eXBlLCAgICAgLyogU0lPQ0dJV01PREUgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X3NlbnNpdGl2aXR5LCAgLyogU0lPQ1NJV1NFTlMgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X3NlbnNpdGl2aXR5LCAgLyogU0lPQ0dJV1NFTlMgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCAsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1JBTkdFICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9yYW5nZSwgICAgICAgIC8qIFNJT0NHSVdSQU5HRSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMICwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUFJJViAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMIC8qIGtlcm5lbCBjb2RlICovLCAgICAvKiBTSU9DR0lXUFJJViAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMICwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1RBVFMgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCAvKiBrZXJuZWwgY29kZSAqLywgICAgLyogU0lPQ0dJV1NUQVRTICovCisgICAgICAgICAgICAgICAgaXdfaGFuZGxlcl9zZXRfc3B5LCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTUFkgKi8KKyAgICAgICAgICAgICAgICBpd19oYW5kbGVyX2dldF9zcHksICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NQWSAqLworICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXVEhSU1BZICovCisgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdUSFJTUFkgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV0FQICovCisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEKKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X2Jzc2lkLCAgICAgICAgLyogU0lPQ0dJV0FQICovCisjZWxzZQorICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXQVAgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXTUxNRSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfYXBfbGlzdCwgICAgICAvKiBTSU9DR0lXQVBMSVNUICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX3NldF9zY2FuLCAgICAgICAgIC8qIFNJT0NTSVdTQ0FOICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9zY2FuLCAgICAgICAgIC8qIFNJT0NHSVdTQ0FOICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX3NldF9lc3NpZCwgICAgICAgIC8qIFNJT0NTSVdFU1NJRCAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfZXNzaWQsICAgICAgICAvKiBTSU9DR0lXRVNTSUQgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X25pY2tuYW1lLCAgICAgLyogU0lPQ1NJV05JQ0tOICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9uaWNrbmFtZSwgICAgIC8qIFNJT0NHSVdOSUNLTiAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X3JhdGUsICAgICAgICAgLyogU0lPQ1NJV1JBVEUgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X3JhdGUsICAgICAgICAgLyogU0lPQ0dJV1JBVEUgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X3J0c190aHJlc2hvbGQsLyogU0lPQ1NJV1JUUyAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfcnRzX3RocmVzaG9sZCwvKiBTSU9DR0lXUlRTICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdGUkFHICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdGUkFHICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdUWFBPVyAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfdHhfcG93ZXIsICAgICAvKiBTSU9DR0lXVFhQT1cgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1JFVFJZICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdSRVRSWSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfZW5jb2RlLCAgICAgICAvKiBTSU9DU0lXRU5DT0RFICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9lbmNvZGUsICAgICAgIC8qIFNJT0NHSVdFTkNPREUgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X3Bvd2VyLCAgICAgICAgLyogU0lPQ1NJV1BPV0VSICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9wb3dlciwgICAgICAgIC8qIFNJT0NHSVdQT1dFUiAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X2dlbmllLCAgICAgICAgLyogU0lPQ1NJV0dFTklFICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdHRU5JRSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfYXV0aCwgICAgICAgICAvKiBTSU9DU0lXQVVUSCAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXQVVUSCAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfZW5jb2RlZXh0LCAgICAvKiBTSU9DU0lXRU5DT0RFRVhUICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdFTkNPREVFWFQgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1BNS1NBICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KK307CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyIHdsX3ByaXZhdGVfaGFuZGxlcltdID0KK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0lXRklSU1RQUklWICsgKi8KKyAgICAgICAgICAgICAgICB3dmxhbl9zZXRfbmV0bmFtZSwgICAgICAgICAgICAgICAgICAgICAgLyogMDogU0lPQ1NJV05FVE5BTUUgKi8KKyAgICAgICAgICAgICAgICB3dmxhbl9nZXRfbmV0bmFtZSwgICAgICAgICAgICAgICAgICAgICAgLyogMTogU0lPQ0dJV05FVE5BTUUgKi8KKyAgICAgICAgICAgICAgICB3dmxhbl9zZXRfc3RhdGlvbl9uaWNrbmFtZSwgICAgICAgICAgICAgLyogMjogU0lPQ1NJV1NUQU5BTUUgKi8KKyAgICAgICAgICAgICAgICB3dmxhbl9nZXRfc3RhdGlvbl9uaWNrbmFtZSwgICAgICAgICAgICAgLyogMzogU0lPQ0dJV1NUQU5BTUUgKi8KKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQQorICAgICAgICAgICAgICAgIHd2bGFuX3NldF9wb3J0dHlwZSwgICAgICAgICAgICAgICAgICAgICAvKiA0OiBTSU9DU0lXUE9SVFRZUEUgKi8KKyAgICAgICAgICAgICAgICB3dmxhbl9nZXRfcG9ydHR5cGUsICAgICAgICAgICAgICAgICAgICAgLyogNTogU0lPQ0dJV1BPUlRUWVBFICovCisjZW5kaWYKK307CisKK3N0cnVjdCBpd19wcml2X2FyZ3Mgd2xfcHJpdl9hcmdzW10gPSB7CisgICAgICAgIHtTSU9DU0lXTkVUTkFNRSwgICAgSVdfUFJJVl9UWVBFX0NIQVIgfCBIQ0ZfTUFYX05BTUVfTEVOLCAwLCAic25ldHdvcmtfbmFtZSIgfSwKKyAgICAgICAge1NJT0NHSVdORVROQU1FLCAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IEhDRl9NQVhfTkFNRV9MRU4sICAgICJnbmV0d29ya19uYW1lIiB9LAorICAgICAgICB7U0lPQ1NJV1NUQU5BTUUsICAgIElXX1BSSVZfVFlQRV9DSEFSIHwgSENGX01BWF9OQU1FX0xFTiwgMCwgInNzdGF0aW9uX25hbWUiIH0sCisgICAgICAgIHtTSU9DR0lXU1RBTkFNRSwgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBIQ0ZfTUFYX05BTUVfTEVOLCAgICAiZ3N0YXRpb25fbmFtZSIgfSwKKyNpZiAxIC8vOz8gI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEKKyAgICAgICAge1NJT0NTSVdQT1JUVFlQRSwgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzcG9ydF90eXBlIiB9LAorICAgICAgICB7U0lPQ0dJV1BPUlRUWVBFLCAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgICAgImdwb3J0X3R5cGUiIH0sCisjZW5kaWYKK307CisKK2NvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiB3bF9pd19oYW5kbGVyX2RlZiA9Cit7CisgICAgICAgIC5udW1fcHJpdmF0ZSAgICAgICAgPSBzaXplb2Yod2xfcHJpdmF0ZV9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKKyAgICAgICAgLnByaXZhdGUgICAgICAgICAgICA9IChpd19oYW5kbGVyICopIHdsX3ByaXZhdGVfaGFuZGxlciwKKyAgICAgICAgLnByaXZhdGVfYXJncyAgICAgICA9IChzdHJ1Y3QgaXdfcHJpdl9hcmdzICopIHdsX3ByaXZfYXJncywKKyAgICAgICAgLm51bV9wcml2YXRlX2FyZ3MgICA9IHNpemVvZih3bF9wcml2X2FyZ3MpIC8gc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpLAorICAgICAgICAubnVtX3N0YW5kYXJkICAgICAgID0gc2l6ZW9mKHdsX2hhbmRsZXIpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAorICAgICAgICAuc3RhbmRhcmQgICAgICAgICAgID0gKGl3X2hhbmRsZXIgKikgd2xfaGFuZGxlciwKKyAgICAgICAgLmdldF93aXJlbGVzc19zdGF0cyA9IHdsX2dldF93aXJlbGVzc19zdGF0cywKK307CisKKyNlbmRpZiAvLyBXSVJFTEVTU19FWFQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3dleHQuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3dleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWQzOWE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfd2V4dC5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBIZWFkZXIgZGVzY3JpYmluZyBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgdGhlIHdpcmVsZXNzIElPQ1RMIGhhbmRsZXJzLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19XTF9XRVhUX0hfXworI2RlZmluZSBfX1dMX1dFWFRfSF9fCisKKworI2lmZGVmIFdJUkVMRVNTX0VYVAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZnVuY3Rpb24gcHJvdG95cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqd2xfd2lyZWxlc3Nfc3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKworc3RydWN0IGl3X3N0YXRpc3RpY3MgKiB3bF9nZXRfd2lyZWxlc3Nfc3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKworaW5saW5lIHZvaWQgd2xfc3B5X2dhdGhlciAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyICptYWMpOworCit2b2lkIHdsX3dleHRfZXZlbnRfZnJlcSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOwordm9pZCB3bF93ZXh0X2V2ZW50X21vZGUoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3ZvaWQgd2xfd2V4dF9ldmVudF9lc3NpZCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOwordm9pZCB3bF93ZXh0X2V2ZW50X2VuY29kZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOwordm9pZCB3bF93ZXh0X2V2ZW50X2FwKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7Cit2b2lkIHdsX3dleHRfZXZlbnRfc2Nhbl9jb21wbGV0ZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOwordm9pZCB3bF93ZXh0X2V2ZW50X25ld19zdGEoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3ZvaWQgd2xfd2V4dF9ldmVudF9leHBpcmVkX3N0YSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOwordm9pZCB3bF93ZXh0X2V2ZW50X21pY19mYWlsZWQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3ZvaWQgd2xfd2V4dF9ldmVudF9hc3NvY19pZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCitleHRlcm4gY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHdsX2l3X2hhbmRsZXJfZGVmOworCisjZWxzZQorI2Vycm9yIFdJUkVMRVNTX0VYVAorI2VuZGlmIC8vIFdJUkVMRVNTX0VYVAorCisKKyNlbmRpZiAgLy8gX19XTF9XRVhUX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRhOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L0tjb25maWcKQEAgLTAsMCArMSw5IEBACitjb25maWcgV0xBR1M0OV9IMjUKKwl0cmlzdGF0ZSAiTGlua3N5cyBIRVJNRVMgSUkuNSBXQ0Y1NEdfV2lyZWxlc3MtR19Db21wYWN0Rmxhc2hfQ2FyZCIKKwlkZXBlbmRzIG9uIFdMQU5fODAyMTEgJiYgV0lSRUxFU1NfRVhUICYmIFBDTUNJQQorCXNlbGVjdCBXRVhUX1NQWQorCS0tLWhlbHAtLS0KKwkgIERyaXZlciBmb3Igd2lyZWxlc3MgY2FyZHMgdXNpbmcgQWdlcmUncyBIRVJNRVMgSUkuNSBjaGlwc2V0CisJICB3aGljaCBhcmUgaWRlbnRpZmllZCB3aXRoIE1hbnVmYWN0dXJlIElEOiAwMTU2LDAwMDQKKwkgIFRoZSBzb2Z0d2FyZSBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2Ygd2xfbGttXzcyMl9hYmcudGFyLmd6CisJICBmcm9tIHRoZSBBZ2VyZSBTeXN0ZW1zIHdlYnNpdGUsIGFkZGFwdGVkIGZvciBVYnVudHUgOS4wNC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGIyM2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L01ha2VmaWxlCkBAIC0wLDAgKzEsODEgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHdsYWdzNDlfaDJfY3Mua28gYW5kIHdsYWdzNDlfaDI1X2NzLmtvCisjCisjIERlZmF1bHQgYnVpbGQgZm9yIEhlcm1lcy1JSSBiYXNlIGNhcmRzIChwb3NzaWJseSBpZGVudGlmaWVkIHdpdGgKKyMgIm1hbmZpZDogMHgwMTU2LCAweDAwMDMiIGluICJwY2NhcmRjdGwgaWRlbnQiIG91dHB1dCksIGNvbW1lbnQKKyMgLURIRVJNRVMyNSBiZWxvdworIworIyBJZiB5b3Ugd2FudCB0byBidWlsZCBmb3IgSGVybWVzLUlJLjUgYmFzZSBjYXJkcyAocG9zc2libHkgaWRlbnRpZmllZCB3aXRoCisjICJtYW5maWQ6IDB4MDE1NiwgMHgwMDA0IiBpbiAicGNjYXJkY3RsIGlkZW50IiBvdXRwdXQpLCB1bmNvbW1lbnQKKyMgLURIRVJNRVMyNSBiZWxvdworIworIyAgSWYgeW91IHdhbnQgdG8gYnVpbGQgQVAgc3VwcG9ydCAodW50ZXN0ZWQpLCBjb21tZW50IG91dCAtRFNUQV9PTkxZCisKK0lOU1RBTExESVIgOj0gL2xpYi9tb2R1bGVzLyQoc2hlbGwgdW5hbWUgLXIpL2tlcm5lbC9kcml2ZXJzL25ldC93aXJlbGVzcworRVhUUkFfQ0ZMQUdTICs9IC1JJChLRVJORUxESVIpL2luY2x1ZGUKK0VYVFJBX0NGTEFHUyArPSAtSSQoc3JjKSBcCisJCS1EQlVTX1BDTUNJQSBcCisJCS1EVVNFX1dQQSBcCisJCS1EVVNFX1dFWFQgXAorCQktRFNUQV9PTkxZIFwKKwkJLURXVkxBTl80OSBcCisJCS1ESEVSTUVTMjUgXAorIwkJLUREQkcgXAorIwkJLUREQkdfTFZMPTUgXAorIwkJLURVU0VfVUlMIFwKKyMJCS1EVVNFX1BST0ZJTEUgXAorCitpZmVxICgkKGZpbmRzdHJpbmcgSEVSTUVTMjUsJChFWFRSQV9DRkxBR1MpKSwpCitXTE5BTUUgOj0gd2xhZ3M0OV9oMl9jcworJChXTE5BTUUpLXkgOj0gc3RhX2gyLm8KK2lmZXEgKCQoZmluZHN0cmluZyBTVEFfT05MWSwkKEVYVFJBX0NGTEFHUykpLCkKKyQoV0xOQU1FKS15ICs9IGFwX2gyLm8KK2VuZGlmCitlbHNlCitXTE5BTUU9d2xhZ3M0OV9oMjVfY3MKKyQoV0xOQU1FKS15IDo9IHN0YV9oMjUubworaWZlcSAoJChmaW5kc3RyaW5nIFNUQV9PTkxZLCQoRVhUUkFfQ0ZMQUdTKSksKQorJChXTE5BTUUpLXkgKz0gYXBfaDI1Lm8KK2VuZGlmCitlbmRpZgorCisjIElmIEtFUk5FTFJFTEVBU0UgaXMgZGVmaW5lZCwgd2UndmUgYmVlbiBpbnZva2VkIGZyb20gdGhlCisjIGtlcm5lbCBidWlsZCBzeXN0ZW0gYW5kIGNhbiB1c2UgaXRzIGxhbmd1YWdlLgoraWZuZXEgKCQoS0VSTkVMUkVMRUFTRSksKQorCitvYmotbQkJKz0gJChXTE5BTUUpLm8KKworJChXTE5BTUUpLXkgKz0Jd2xfcHJvZmlsZS5vIFwKKwkJd2xfd2V4dC5vIFwKKwkJd2xfcHJpdi5vIFwKKwkJd2xfbWFpbi5vIFwKKwkJd2xfZW5jLm8gXAorCQl3bF91dGlsLm8gXAorCQl3bF9uZXRkZXYubyBcCisJCXdsX2NzLm8gXAorCQltbWQubyBcCisJCWhjZi5vIFwKKwkJZGhmLm8KKworJChXTE5BTUUpLSQoQ09ORklHX1NZU0ZTKQkrPSB3bF9zeXNmcy5vCisKKyMgT3RoZXJ3aXNlIHdlIHdlcmUgY2FsbGVkIGRpcmVjdGx5IGZyb20gdGhlIGNvbW1hbmQKKyMgbGluZTsgaW52b2tlIHRoZSBrZXJuZWwgYnVpbGQgc3lzdGVtLgorZWxzZQorCUtFUk5FTERJUiA/PSAvbGliL21vZHVsZXMvJChzaGVsbCB1bmFtZSAtcikvYnVpbGQKKwlQV0QgOj0gJChzaGVsbCBwd2QpCisKK2RlZmF1bHQ6CisJJChNQUtFKSAtQyAkKEtFUk5FTERJUikgTT0kKFBXRCkgbW9kdWxlcworZW5kaWYKKworY2xlYW46CisJcm0gLWZyICoubyAqLmtvICoubW9kLmMgKi5tb2QubyAuKi4qLmNtZCBNb2R1bGUuc3ltdmVycyBcCisJCU1vZHVsZS5tYXJrZXJzIG1vZHVsZXMub3JkZXIgLnRtcF92ZXJzaW9ucworCitpbnN0YWxsOiBkZWZhdWx0CisJLXJtbW9kICQoV0xOQU1FKQorCWluc3RhbGwgLWQgJChJTlNUQUxMRElSKQorCWluc3RhbGwgLW0gMDY0NCAtbyByb290IC1nIHJvb3QgJChXTE5BTUUpLmtvICQoSU5TVEFMTERJUikKKwkvc2Jpbi9kZXBtb2QgLWFxCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9SRUFETUUudHh0IGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM3YTgzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9SRUFETUUudHh0CkBAIC0wLDAgKzEsMzAgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitXTEFOIGRyaXZlciBmb3IgY2FyZHMgdXNpbmcgdGhlIEhFUk1FUyBJSSBhbmQgSEVSTUVTIElJLjUgY2hpcHNldAorCitIRVJNRVMgSUkgQ2FyZAorCitQQ01DSUEgSW5mbzogIkFnZXJlIFN5c3RlbXMiICJXaXJlbGVzcyBQQyBDYXJkIE1vZGVsIDAxMTAiCisgICAgICAgICAgICAgTWFudWZhY3R1cmUgSUQ6IDAxNTYsMDAwMworCitIRVJNRVMgSUkuNSBDYXJkCisKK1BDTUNJQSBJbmZvOiAiTGlua3N5cyIgIldDRjU0R19XaXJlbGVzcy1HX0NvbXBhY3RGbGFzaF9DYXJkIgorICAgICAgICAgICAgIE1hbnVmYWN0dXJlIElEOiAwMTU2LDAwMDQKKworQmFzZWQgb24gQWdlcmUgU3lzdGVtcyBMaW51eCBMS00gV2lyZWxlc3MgRHJpdmVyIFNvdXJjZSBDb2RlLAorVmVyc2lvbiA3LjIyOyBjb21wbGllcyB3aXRoIE9wZW4gU291cmNlIEJTRCBMaWNlbnNlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworREVTQ1JJUFRJT04KKworVGhpcyBkaXJlY3Rvcnkgb25seSBjb250YWlucyBmaWxlcyB0aGF0IHJlZmVyIHRvIHRoZSBzb3VyY2UgaW4gd2xhZ3M0OV9oMi4KK09ubHkgcmVhbCBzb3VyY2VmaWxlcyBhcmUgdGhlIE1ha2VmaWxlIHdoaWNoIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gYnVpbGQKK3RoZSBkcml2ZXIgZm9yIHRoZSBIRVJNRVMgSUkuNSBjaGlwc2V0IGFuZCBLY29uZmlnIHRvIGRlc2NyaWJlIHRoZSBkcml2ZXIuCisKK1RoZSB3bGFnczQ5X2gyIGRpcmVjdG9yeSBjb250YWlucyB0aGUgZnVsbCBzb3VyY2UsIGluY2x1ZGluZyB0aGUgZmlsZXMKK2V4Y2x1c2l2ZWx5IHVzZWQgYnkgdGhpcyBkcml2ZXIuCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkcml2ZXIgbG9vayBhdCB0aGUgd2xhZ3M0OV9oMiBkaXJlY29yeS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGFhNDE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L1RPRE8KQEAgLTAsMCArMSwzMyBAQAorRmlyc3Qgb2YgYWxsLCB0aGUgYmVzdCB0aGluZyB3b3VsZCBiZSB0aGF0IHRoaXMgZHJpdmVyIGJlY29tZXMgb2Jzb2x0ZSBieQorYWRkaW5nIHN1cHBvcnQgZm9yIEhlcm1lcyBJSSBhbmQgSGVybWVzIElJLjUgY2FyZHMgdG8gdGhlIGV4aXN0aW5nIG9yaW5vY28KK2RyaXZlci4gVGhlIG9yaW5vY28gZHJpdmVyIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIEhlcm1lcyBJIGJhc2VkIGNhcmRzLgorU2luY2UgdGhpcyB3aWxsIG5vdCBoYXBwZW4gYnkgbWFnaWMgYW5kIGhhcyBub3QgaGFwcGVuZCB1bnRpbCBub3cgdGhpcworZHJpdmVyIHByb3ZpZGVzIGEgc3RvcC1nYXAgc29sdXRpb24gZm9yIHRoZXNlIHR5cGUgb2YgY2FyZHMuCisKK0hhdmluZyBzYWlkIHRoYXQsIHRoZSBmb2xsb3dpbmcgd2lzaGxpc3QgY29tZXMgdG8gbWluZCB0byBtYWtlIHRoZSBkcml2ZXIKK3N1aXRhYmxlIGFzIGZ1bGx5IHN1cHBvcnRlZCBrZXJuZWwgZHJpdmVyLiBGZWVsIGZyZWUgdG8gZXhwYW5kL2VuaGFuY2UgdGhlCitsaXN0LgorCitUT0RPOgorCS0gdmVyaWZ5IGFnYWluc3QgYSBIZXJtZXMgSUkuNSBjYXJkCisJLSB2ZXJpZnkgd2l0aCBXUEEgZW5jcmlwdGlvbiAoYm90aCB3aXRoIEgyIGFuZCBIMi41IGNhcmRzKQorCS0gc29tZXRpbWVzIHRoZSBjYXJkIGRvZXMgbm90IGluaXRpYWxpemUgY29ycmVjdGx5LCByZXRyeSBtZWNoYW5pc21zCisJICBhcmUgYnVpbGQgaW4gdG8gY2F0Y2ggbW9zdCBjYXNlcyBidXQgbm90IGFsbAorCS0gb25jZSB0aGUgZHJpdmVyIHJ1bnMgaXQgaXMgdmVyeSBzdGFibGUsIGJ1dCBJIGhhdmUgdGhlIGltcHJlc3Npb24KKwkgIHNvbWUgdGhlIGNyaXR0aWNhbCBzZWN0aW9ucyB0YWtlIHRvIGxvbmcKKwktIHRoZSBkcml2ZXIgaXMgc3BsaXQgaW50byBhIEhlcm1lcyBJSSBhbmQgYSBIZXJtZXMgSUkuNSBwYXJ0LCBpdAorCSAgd291bGQgYmUgbmljZSB0byBoYW5kbGUgYm90aCB3aXRoIG9uZSBtb2R1bGUgaW5zdGVhZCBvZiB0d28KKwktIHJldmlldyBieSB0aGUgd2lyZWxlc3MgZGV2ZWxvcGVyIGNvbW11bml0eQorCS0gdmVyaWZ5IHRoZSBjb2RlIGFnYWluc3QgdGhlIGNvZGluZyBzdGFuZGFyZHMgZm9yIGEgcHJvcHBlciBsaW51eAorCSAgZHJpdmVyCisJLSByZXNvbHZlIGxpY2Vuc2UgaXNzdWVzICg/KQorCitET05FOgorCS0gdmVyaWZpZWQgYWdhaW5zdCBhIEhlcm1lcyBJSSBjYXJkIChUaG9tc29uIFNwZWVkdG91Y2ggMTEwIFBDTUNJQQorCSAgY2FyZCkKKwktIHZlcmlmaWVkIHdpdGggV0VQIGVuY3JpcHRpb24KKworUGxlYXNlIHNlbmQgYW55IHBhdGNoZXMgb3IgY29tcGxhaW50cyBhYm91dCB0aGlzIGRyaXZlciB0byBHcmVnCitLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4gYW5kIENjOiBIZW5rIGRlIEdyb290IDxwZTFkbm5AYW1zYXQub3JnPgorRG9uJ3QgYm90aGVyIHRoZSB1cHN0cmVhbSB3aXJlbGVzcyBrZXJuZWwgZGV2ZWxvcGVycyBhYm91dCBpdCwgdGhleQord2FudCBub3RoaW5nIHRvIGRvIHdpdGggaXQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvYXBfaDI1LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvYXBfaDI1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM0NGZhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9hcF9oMjUuYwpAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvYXBfaDI1LmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZmIxMzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvZGVidWcuaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvZGVidWcuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9kaGYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9kaGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTc2MmM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2RoZi5jCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi9kaGYuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9kaGYuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9kaGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDE4MWRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2RoZi5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi9kaGYuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9kaGZjZmcuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9kaGZjZmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTg2ZTM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2RoZmNmZy5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi9kaGZjZmcuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9oY2YuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9oY2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWViYTFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2hjZi5jCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi9oY2YuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9oY2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9oY2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTE0M2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2hjZi5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi9oY2YuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9oY2ZjZmcuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9oY2ZjZmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODhjNGJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2hjZmNmZy5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi9oY2ZjZmcuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9oY2ZkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9oY2ZkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmEwMDYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2hjZmRlZi5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi9oY2ZkZWYuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9tZGQuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9tZGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDhlMTQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L21kZC5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi9tZGQuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9tbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9tbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjA3ODJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L21tZC5jCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi9tbWQuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9tbWQuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9tbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjg0ZGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L21tZC5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi9tbWQuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9zdGFfaDI1LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvc3RhX2gyNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYzc2YmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvc3RhX2gyNS5jCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi9zdGFfaDI1LmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZTFmMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfY3MuYwpAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfY3MuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9jcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX2NzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3YWNlZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9jcy5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF9jcy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX2VuYy5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNTlkZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfZW5jLmMKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX2VuYy5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX2VuYy5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX2VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZTg2MGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfZW5jLmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX2VuYy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX2lmLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGQ4NmYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX2lmLmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX2lmLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNjg3YTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfaW50ZXJuYWwuaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfaW50ZXJuYWwuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYzA2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfbWFpbi5jCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF9tYWluLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfbWFpbi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTgzNzZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX21haW4uaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfbWFpbi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX25ldGRldi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX25ldGRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NTEyYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfbmV0ZGV2LmMKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX25ldGRldi5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX25ldGRldi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX25ldGRldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOWNkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfbmV0ZGV2LmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX25ldGRldi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3ByaXYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9wcml2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwYzgwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9wcml2LmMKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX3ByaXYuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9wcml2LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NDkyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfcHJpdi5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF9wcml2LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfcHJvZmlsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3Byb2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmFhMjAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3Byb2ZpbGUuYwpAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfcHJvZmlsZS5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3Byb2ZpbGUuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9wcm9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyNTNhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9wcm9maWxlLmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX3Byb2ZpbGUuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9zeXNmcy5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ1OGVlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9zeXNmcy5jCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF9zeXNmcy5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3N5c2ZzLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfc3lzZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjgxOWE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3N5c2ZzLmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX3N5c2ZzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfdXRpbC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzFiZWJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3V0aWwuYwpAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfdXRpbC5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3V0aWwuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkNzRlNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF91dGlsLmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX3V0aWwuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF92ZXJzaW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMzhlOGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfdmVyc2lvbi5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF92ZXJzaW9uLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfd2V4dC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3dleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjYwZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3dleHQuYwpAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfd2V4dC5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3dleHQuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF93ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFkNjM4NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF93ZXh0LmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX3dleHQuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL0tjb25maWcgYi9kcml2ZXJzL3VzYi9LY29uZmlnCmluZGV4IDI0MDc1MDguLjgxYWFjN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvS2NvbmZpZwpAQCAtNjAsNiArNjAsOCBAQAogCWRlZmF1bHQgeSBpZiBBUkNIX0lYUDRYWAogCWRlZmF1bHQgeSBpZiBBUkNIX1c5MFg5MDAKIAlkZWZhdWx0IHkgaWYgQVJDSF9BVDkxU0FNOUc0NQorCWRlZmF1bHQgeSBpZiBBUkNIX01YQworCWRlZmF1bHQgeSBpZiBBUkNIX09NQVAzNFhYCiAJZGVmYXVsdCBQQ0kKIAogIyBBUk0gU0ExMTExIGNoaXBzIGhhdmUgYSBub24tUENJIGJhc2VkICJPSENJLWNvbXBhdGlibGUiIFVTQiBob3N0IGludGVyZmFjZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL01ha2VmaWxlIGIvZHJpdmVycy91c2IvTWFrZWZpbGUKaW5kZXggYmUzYzliOC4uNDczYWExYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvTWFrZWZpbGUKQEAgLTQ0LDMgKzQ0LDUgQEAKIAogb2JqLSQoQ09ORklHX1VTQl9BVE0pCQkrPSBhdG0vCiBvYmotJChDT05GSUdfVVNCX1NQRUVEVE9VQ0gpCSs9IGF0bS8KKworb2JqLSQoQ09ORklHX1VTQl9VTFBJKQkJKz0gb3RnLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYyBiL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKaW5kZXggYmJhNGQzZS4uYzUzOTUyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYworKysgYi9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jCkBAIC02NjcsMTIgKzY2NywxMiBAQAogCWVsc2UKIAkJdWVhX2luZm8odXNiLCAiZmlybXdhcmUgdXBsb2FkZWRcbiIpOwogCi0JdWVhX2xlYXZlcyh1c2IpOwotCXJldHVybjsKKwlnb3RvIGVycjsKIAogZXJyX2Z3X2NvcnJ1cHRlZDoKIAl1ZWFfZXJyKHVzYiwgImZpcm13YXJlIGlzIGNvcnJ1cHRlZFxuIik7CiBlcnI6CisJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CiAJdWVhX2xlYXZlcyh1c2IpOwogfQogCkBAIC03MDUsNyArNzA1LDggQEAKIAkJYnJlYWs7CiAJfQogCi0JcmV0ID0gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsIDEsIGZ3X25hbWUsICZ1c2ItPmRldiwgdXNiLCB1ZWFfdXBsb2FkX3ByZV9maXJtd2FyZSk7CisJcmV0ID0gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsIDEsIGZ3X25hbWUsICZ1c2ItPmRldiwKKwkJCQkgICAgICBHRlBfS0VSTkVMLCB1c2IsIHVlYV91cGxvYWRfcHJlX2Zpcm13YXJlKTsKIAlpZiAocmV0KQogCQl1ZWFfZXJyKHVzYiwgImZpcm13YXJlICVzIGlzIG5vdCBhdmFpbGFibGVcbiIsIGZ3X25hbWUpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYwppbmRleCBlNGVjYTc4Li4zNGQ0ZWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCkBAIC0xNDYxLDYgKzE0NjEsMTIgQEAKIH0KIAogI2VuZGlmIC8qIENPTkZJR19QTSAqLworCisjZGVmaW5lIE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oeCkgXAorCQlVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTygweDA0MjEsIHgsIFwKKwkJVVNCX0NMQVNTX0NPTU0sIFVTQl9DRENfU1VCQ0xBU1NfQUNNLCBcCisJCVVTQl9DRENfQUNNX1BST1RPX1ZFTkRPUikKKwogLyoKICAqIFVTQiBkcml2ZXIgc3RydWN0dXJlLgogICovCkBAIC0xNTE5LDYgKzE1MjUsNTcgQEAKIAkuZHJpdmVyX2luZm8gPSBOT19VTklPTl9OT1JNQUwsIC8qIHJlcG9ydHMgemVybyBsZW5ndGggZGVzY3JpcHRvciAqLwogCX0sCiAKKwkvKiBOb2tpYSBTNjAgcGhvbmVzIGV4cG9zZSB0d28gQUNNIGNoYW5uZWxzLiBUaGUgZmlyc3QgaXMKKwkgKiBhIG1vZGVtIGFuZCBpcyBwaWNrZWQgdXAgYnkgdGhlIHN0YW5kYXJkIEFULWNvbW1hbmQKKwkgKiBpbmZvcm1hdGlvbiBiZWxvdy4gVGhlIHNlY29uZCBpcyAndmVuZG9yLXNwZWNpZmljJyBidXQKKwkgKiBpcyB0cmVhdGVkIGFzIGEgc2VyaWFsIGRldmljZSBhdCB0aGUgUzYwIGVuZCwgc28gd2Ugd2FudAorCSAqIHRvIGV4cG9zZSBpdCBvbiBMaW51eCB0b28uICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDQyRCksIH0sIC8qIE5va2lhIDMyNTAgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwNEQ4KSwgfSwgLyogTm9raWEgNTUwMCBTcG9ydCAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDA0QzkpLCB9LCAvKiBOb2tpYSBFNTAgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwNDE5KSwgfSwgLyogTm9raWEgRTYwICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDQ0RCksIH0sIC8qIE5va2lhIEU2MSAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAwMDEpLCB9LCAvKiBOb2tpYSBFNjFpICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDQ3NSksIH0sIC8qIE5va2lhIEU2MiAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDA1MDgpLCB9LCAvKiBOb2tpYSBFNjUgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwNDE4KSwgfSwgLyogTm9raWEgRTcwICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDQyNSksIH0sIC8qIE5va2lhIE43MSAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDA0ODYpLCB9LCAvKiBOb2tpYSBONzMgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwNERGKSwgfSwgLyogTm9raWEgTjc1ICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDAwZSksIH0sIC8qIE5va2lhIE43NyAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDA0NDUpLCB9LCAvKiBOb2tpYSBOODAgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwNDJGKSwgfSwgLyogTm9raWEgTjkxICYgTjkxIDhHQiAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDA0OEUpLCB9LCAvKiBOb2tpYSBOOTIgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwNDIwKSwgfSwgLyogTm9raWEgTjkzICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDRFNiksIH0sIC8qIE5va2lhIE45M2kgICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDRCMiksIH0sIC8qIE5va2lhIDU3MDAgWHByZXNzTXVzaWMgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwMTM0KSwgfSwgLyogTm9raWEgNjExMCBOYXZpZ2F0b3IgKENoaW5hKSAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDA0NkUpLCB9LCAvKiBOb2tpYSA2MTEwIE5hdmlnYXRvciAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAwMmYpLCB9LCAvKiBOb2tpYSA2MTIwIGNsYXNzaWMgJiAgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwMDg4KSwgfSwgLyogTm9raWEgNjEyMSBjbGFzc2ljICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDBmYyksIH0sIC8qIE5va2lhIDYxMjQgY2xhc3NpYyAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAwNDIpLCB9LCAvKiBOb2tpYSBFNTEgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwMGIwKSwgfSwgLyogTm9raWEgRTY2ICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDBhYiksIH0sIC8qIE5va2lhIEU3MSAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDA0ODEpLCB9LCAvKiBOb2tpYSBONzYgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwMDA3KSwgfSwgLyogTm9raWEgTjgxICYgTjgxIDhHQiAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAwNzEpLCB9LCAvKiBOb2tpYSBOODIgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwNEYwKSwgfSwgLyogTm9raWEgTjk1ICYgTjk1LTMgTkFNICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDA3MCksIH0sIC8qIE5va2lhIE45NSA4R0IgICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDBlOSksIH0sIC8qIE5va2lhIDUzMjAgWHByZXNzTXVzaWMgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwMDk5KSwgfSwgLyogTm9raWEgNjIxMCBOYXZpZ2F0b3IsIFJNLTM2NyAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAxMjgpLCB9LCAvKiBOb2tpYSA2MjEwIE5hdmlnYXRvciwgUk0tNDE5ICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDA4ZiksIH0sIC8qIE5va2lhIDYyMjAgQ2xhc3NpYyAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAwYTApLCB9LCAvKiBOb2tpYSA2NjUwICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDA3YiksIH0sIC8qIE5va2lhIE43OCAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAwOTQpLCB9LCAvKiBOb2tpYSBOODUgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwMDNhKSwgfSwgLyogTm9raWEgTjk2ICYgTjk2LTMgICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDBlOSksIH0sIC8qIE5va2lhIDUzMjAgWHByZXNzTXVzaWMgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwMTA4KSwgfSwgLyogTm9raWEgNTMyMCBYcHJlc3NNdXNpYyAyRyAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAxZjUpLCB9LCAvKiBOb2tpYSBOOTcsIFJNLTUwNSAqLworCisJLyogTk9URTogbm9uLU5va2lhIENPTU0vQUNNLzB4ZmYgaXMgbGlrZWx5IE1TRlQgUk5ESVMuLi4gTk9UIGEgbW9kZW0hICovCisKIAkvKiBjb250cm9sIGludGVyZmFjZXMgd2l0aCB2YXJpb3VzIEFULWNvbW1hbmQgc2V0cyAqLwogCXsgVVNCX0lOVEVSRkFDRV9JTkZPKFVTQl9DTEFTU19DT01NLCBVU0JfQ0RDX1NVQkNMQVNTX0FDTSwKIAkJVVNCX0NEQ19BQ01fUFJPVE9fQVRfVjI1VEVSKSB9LApAQCAtMTUzMyw3ICsxNTkwLDYgQEAKIAl7IFVTQl9JTlRFUkZBQ0VfSU5GTyhVU0JfQ0xBU1NfQ09NTSwgVVNCX0NEQ19TVUJDTEFTU19BQ00sCiAJCVVTQl9DRENfQUNNX1BST1RPX0FUX0NETUEpIH0sCiAKLQkvKiBOT1RFOiAgQ09NTS9BQ00vMHhmZiBpcyBsaWtlbHkgTVNGVCBSTkRJUyAuLi4gTk9UIGEgbW9kZW0hISAqLwogCXsgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvdXNidG1jLmMgYi9kcml2ZXJzL3VzYi9jbGFzcy91c2J0bWMuYwppbmRleCBiNGJkMjQxLi43YzVmNGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy91c2J0bWMuYworKysgYi9kcml2ZXJzL3VzYi9jbGFzcy91c2J0bWMuYwpAQCAtMzQ3LDEzICszNDcsOCBAQAogCWdvdG8gZXhpdDsKIAogdXNidG1jX2Fib3J0X2J1bGtfb3V0X2NsZWFyX2hhbHQ6Ci0JcnYgPSB1c2JfY29udHJvbF9tc2coZGF0YS0+dXNiX2RldiwKLQkJCSAgICAgdXNiX3NuZGN0cmxwaXBlKGRhdGEtPnVzYl9kZXYsIDApLAotCQkJICAgICBVU0JfUkVRX0NMRUFSX0ZFQVRVUkUsCi0JCQkgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfU1RBTkRBUkQgfAotCQkJICAgICBVU0JfUkVDSVBfRU5EUE9JTlQsCi0JCQkgICAgIFVTQl9FTkRQT0lOVF9IQUxULCBkYXRhLT5idWxrX291dCwgYnVmZmVyLAotCQkJICAgICAwLCBVU0JUTUNfVElNRU9VVCk7CisJcnYgPSB1c2JfY2xlYXJfaGFsdChkYXRhLT51c2JfZGV2LAorCQkJICAgIHVzYl9zbmRidWxrcGlwZShkYXRhLT51c2JfZGV2LCBkYXRhLT5idWxrX291dCkpOwogCiAJaWYgKHJ2IDwgMCkgewogCQlkZXZfZXJyKGRldiwgInVzYl9jb250cm9sX21zZyByZXR1cm5lZCAlZFxuIiwgcnYpOwpAQCAtNTYyLDEwICs1NTcsMTYgQEAKIAkJbl9ieXRlcyA9IHJvdW5kdXAoMTIgKyB0aGlzX3BhcnQsIDQpOwogCQltZW1zZXQoYnVmZmVyICsgMTIgKyB0aGlzX3BhcnQsIDAsIG5fYnl0ZXMgLSAoMTIgKyB0aGlzX3BhcnQpKTsKIAotCQlyZXR2YWwgPSB1c2JfYnVsa19tc2coZGF0YS0+dXNiX2RldiwKLQkJCQkgICAgICB1c2Jfc25kYnVsa3BpcGUoZGF0YS0+dXNiX2RldiwKLQkJCQkJCSAgICAgIGRhdGEtPmJ1bGtfb3V0KSwKLQkJCQkgICAgICBidWZmZXIsIG5fYnl0ZXMsICZhY3R1YWwsIFVTQlRNQ19USU1FT1VUKTsKKwkJZG8geworCQkJcmV0dmFsID0gdXNiX2J1bGtfbXNnKGRhdGEtPnVzYl9kZXYsCisJCQkJCSAgICAgIHVzYl9zbmRidWxrcGlwZShkYXRhLT51c2JfZGV2LAorCQkJCQkJCSAgICAgIGRhdGEtPmJ1bGtfb3V0KSwKKwkJCQkJICAgICAgYnVmZmVyLCBuX2J5dGVzLAorCQkJCQkgICAgICAmYWN0dWFsLCBVU0JUTUNfVElNRU9VVCk7CisJCQlpZiAocmV0dmFsICE9IDApCisJCQkJYnJlYWs7CisJCQluX2J5dGVzIC09IGFjdHVhbDsKKwkJfSB3aGlsZSAobl9ieXRlcyk7CiAKIAkJZGF0YS0+YlRhZ19sYXN0X3dyaXRlID0gZGF0YS0+YlRhZzsKIAkJZGF0YS0+YlRhZysrOwpAQCAtNzAyLDE0ICs3MDMsOCBAQAogCiB1c2J0bWNfY2xlYXJfYnVsa19vdXRfaGFsdDoKIAotCXJ2ID0gdXNiX2NvbnRyb2xfbXNnKGRhdGEtPnVzYl9kZXYsCi0JCQkgICAgIHVzYl9zbmRjdHJscGlwZShkYXRhLT51c2JfZGV2LCAwKSwKLQkJCSAgICAgVVNCX1JFUV9DTEVBUl9GRUFUVVJFLAotCQkJICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1NUQU5EQVJEIHwKLQkJCSAgICAgVVNCX1JFQ0lQX0VORFBPSU5ULAotCQkJICAgICBVU0JfRU5EUE9JTlRfSEFMVCwKLQkJCSAgICAgZGF0YS0+YnVsa19vdXQsIGJ1ZmZlciwgMCwKLQkJCSAgICAgVVNCVE1DX1RJTUVPVVQpOworCXJ2ID0gdXNiX2NsZWFyX2hhbHQoZGF0YS0+dXNiX2RldiwKKwkJCSAgICB1c2Jfc25kYnVsa3BpcGUoZGF0YS0+dXNiX2RldiwgZGF0YS0+YnVsa19vdXQpKTsKIAlpZiAocnYgPCAwKSB7CiAJCWRldl9lcnIoZGV2LCAidXNiX2NvbnRyb2xfbXNnIHJldHVybmVkICVkXG4iLCBydik7CiAJCWdvdG8gZXhpdDsKQEAgLTczMCwxMyArNzI1LDggQEAKIAlpZiAoIWJ1ZmZlcikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlydiA9IHVzYl9jb250cm9sX21zZyhkYXRhLT51c2JfZGV2LAotCQkJICAgICB1c2Jfc25kY3RybHBpcGUoZGF0YS0+dXNiX2RldiwgMCksCi0JCQkgICAgIFVTQl9SRVFfQ0xFQVJfRkVBVFVSRSwKLQkJCSAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9TVEFOREFSRCB8Ci0JCQkgICAgIFVTQl9SRUNJUF9FTkRQT0lOVCwKLQkJCSAgICAgVVNCX0VORFBPSU5UX0hBTFQsIGRhdGEtPmJ1bGtfb3V0LAotCQkJICAgICBidWZmZXIsIDAsIFVTQlRNQ19USU1FT1VUKTsKKwlydiA9IHVzYl9jbGVhcl9oYWx0KGRhdGEtPnVzYl9kZXYsCisJCQkgICAgdXNiX3NuZGJ1bGtwaXBlKGRhdGEtPnVzYl9kZXYsIGRhdGEtPmJ1bGtfb3V0KSk7CiAKIAlpZiAocnYgPCAwKSB7CiAJCWRldl9lcnIoJmRhdGEtPnVzYl9kZXYtPmRldiwgInVzYl9jb250cm9sX21zZyByZXR1cm5lZCAlZFxuIiwKQEAgLTc1OSwxMiArNzQ5LDggQEAKIAlpZiAoIWJ1ZmZlcikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlydiA9IHVzYl9jb250cm9sX21zZyhkYXRhLT51c2JfZGV2LCB1c2Jfc25kY3RybHBpcGUoZGF0YS0+dXNiX2RldiwgMCksCi0JCQkgICAgIFVTQl9SRVFfQ0xFQVJfRkVBVFVSRSwKLQkJCSAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9TVEFOREFSRCB8Ci0JCQkgICAgIFVTQl9SRUNJUF9FTkRQT0lOVCwKLQkJCSAgICAgVVNCX0VORFBPSU5UX0hBTFQsIGRhdGEtPmJ1bGtfaW4sIGJ1ZmZlciwgMCwKLQkJCSAgICAgVVNCVE1DX1RJTUVPVVQpOworCXJ2ID0gdXNiX2NsZWFyX2hhbHQoZGF0YS0+dXNiX2RldiwKKwkJCSAgICB1c2JfcmN2YnVsa3BpcGUoZGF0YS0+dXNiX2RldiwgZGF0YS0+YnVsa19pbikpOwogCiAJaWYgKHJ2IDwgMCkgewogCQlkZXZfZXJyKCZkYXRhLT51c2JfZGV2LT5kZXYsICJ1c2JfY29udHJvbF9tc2cgcmV0dXJuZWQgJWRcbiIsCkBAIC0xMTA5LDEzICsxMDk1LDEzIEBACiAJa3JlZl9wdXQoJmRhdGEtPmtyZWYsIHVzYnRtY19kZWxldGUpOwogfQogCi1zdGF0aWMgaW50IHVzYnRtY19zdXNwZW5kIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCitzdGF0aWMgaW50IHVzYnRtY19zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKIHsKIAkvKiB0aGlzIGRyaXZlciBkb2VzIG5vdCBoYXZlIHBlbmRpbmcgVVJCcyAqLwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHVzYnRtY19yZXN1bWUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIGludCB1c2J0bWNfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYyBiL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKaW5kZXggNGY4NjQ0Ny4uNjBhNDVmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCkBAIC04Myw2ICs4Myw0NyBAQAogfQogc3RhdGljIERSSVZFUl9BVFRSKG5ld19pZCwgU19JV1VTUiwgTlVMTCwgc3RvcmVfbmV3X2lkKTsKIAorLyoqCisgKiBzdG9yZV9yZW1vdmVfaWQgLSByZW1vdmUgYSBVU0IgZGV2aWNlIElEIGZyb20gdGhpcyBkcml2ZXIKKyAqIEBkcml2ZXI6IHRhcmdldCBkZXZpY2UgZHJpdmVyCisgKiBAYnVmOiBidWZmZXIgZm9yIHNjYW5uaW5nIGRldmljZSBJRCBkYXRhCisgKiBAY291bnQ6IGlucHV0IHNpemUKKyAqCisgKiBSZW1vdmVzIGEgZHluYW1pYyB1c2IgZGV2aWNlIElEIGZyb20gdGhpcyBkcml2ZXIuCisgKi8KK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9yZW1vdmVfaWQoc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHVzYl9keW5pZCAqZHluaWQsICpuOworCXN0cnVjdCB1c2JfZHJpdmVyICp1c2JfZHJpdmVyID0gdG9fdXNiX2RyaXZlcihkcml2ZXIpOworCXUzMiBpZFZlbmRvciA9IDA7CisJdTMyIGlkUHJvZHVjdCA9IDA7CisJaW50IGZpZWxkcyA9IDA7CisJaW50IHJldHZhbCA9IDA7CisKKwlmaWVsZHMgPSBzc2NhbmYoYnVmLCAiJXggJXgiLCAmaWRWZW5kb3IsICZpZFByb2R1Y3QpOworCWlmIChmaWVsZHMgPCAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9jaygmdXNiX2RyaXZlci0+ZHluaWRzLmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkeW5pZCwgbiwgJnVzYl9kcml2ZXItPmR5bmlkcy5saXN0LCBub2RlKSB7CisJCXN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCA9ICZkeW5pZC0+aWQ7CisJCWlmICgoaWQtPmlkVmVuZG9yID09IGlkVmVuZG9yKSAmJgorCQkgICAgKGlkLT5pZFByb2R1Y3QgPT0gaWRQcm9kdWN0KSkgeworCQkJbGlzdF9kZWwoJmR5bmlkLT5ub2RlKTsKKwkJCWtmcmVlKGR5bmlkKTsKKwkJCXJldHZhbCA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmdXNiX2RyaXZlci0+ZHluaWRzLmxvY2spOworCisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgRFJJVkVSX0FUVFIocmVtb3ZlX2lkLCBTX0lXVVNSLCBOVUxMLCBzdG9yZV9yZW1vdmVfaWQpOworCiBzdGF0aWMgaW50IHVzYl9jcmVhdGVfbmV3aWRfZmlsZShzdHJ1Y3QgdXNiX2RyaXZlciAqdXNiX2RydikKIHsKIAlpbnQgZXJyb3IgPSAwOwpAQCAtMTA3LDYgKzE0OCwyMSBAQAogCQkJCSAgICZkcml2ZXJfYXR0cl9uZXdfaWQpOwogfQogCitzdGF0aWMgaW50Cit1c2JfY3JlYXRlX3JlbW92ZWlkX2ZpbGUoc3RydWN0IHVzYl9kcml2ZXIgKmRydikKK3sKKwlpbnQgZXJyb3IgPSAwOworCWlmIChkcnYtPnByb2JlICE9IE5VTEwpCisJCWVycm9yID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZkcnYtPmRydndyYXAuZHJpdmVyLAorCQkJCSZkcml2ZXJfYXR0cl9yZW1vdmVfaWQpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgdXNiX3JlbW92ZV9yZW1vdmVpZF9maWxlKHN0cnVjdCB1c2JfZHJpdmVyICpkcnYpCit7CisJZHJpdmVyX3JlbW92ZV9maWxlKCZkcnYtPmRydndyYXAuZHJpdmVyLCAmZHJpdmVyX2F0dHJfcmVtb3ZlX2lkKTsKK30KKwogc3RhdGljIHZvaWQgdXNiX2ZyZWVfZHluaWRzKHN0cnVjdCB1c2JfZHJpdmVyICp1c2JfZHJ2KQogewogCXN0cnVjdCB1c2JfZHluaWQgKmR5bmlkLCAqbjsKQEAgLTEyOCw2ICsxODQsMTYgQEAKIHsKIH0KIAorc3RhdGljIGludAordXNiX2NyZWF0ZV9yZW1vdmVpZF9maWxlKHN0cnVjdCB1c2JfZHJpdmVyICpkcnYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVzYl9yZW1vdmVfcmVtb3ZlaWRfZmlsZShzdHJ1Y3QgdXNiX2RyaXZlciAqZHJ2KQoreworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgdXNiX2ZyZWVfZHluaWRzKHN0cnVjdCB1c2JfZHJpdmVyICp1c2JfZHJ2KQogewogfQpAQCAtNzc0LDE5ICs4NDAsMzQgQEAKIAlJTklUX0xJU1RfSEVBRCgmbmV3X2RyaXZlci0+ZHluaWRzLmxpc3QpOwogCiAJcmV0dmFsID0gZHJpdmVyX3JlZ2lzdGVyKCZuZXdfZHJpdmVyLT5kcnZ3cmFwLmRyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CiAKLQlpZiAoIXJldHZhbCkgewotCQlwcl9pbmZvKCIlczogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciAlc1xuIiwKKwl1c2Jmc191cGRhdGVfc3BlY2lhbCgpOworCisJcmV0dmFsID0gdXNiX2NyZWF0ZV9uZXdpZF9maWxlKG5ld19kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X25ld2lkOworCisJcmV0dmFsID0gdXNiX2NyZWF0ZV9yZW1vdmVpZF9maWxlKG5ld19kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X3JlbW92ZWlkOworCisJcHJfaW5mbygiJXM6IHJlZ2lzdGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgJXNcbiIsCiAJCQl1c2Jjb3JlX25hbWUsIG5ld19kcml2ZXItPm5hbWUpOwotCQl1c2Jmc191cGRhdGVfc3BlY2lhbCgpOwotCQl1c2JfY3JlYXRlX25ld2lkX2ZpbGUobmV3X2RyaXZlcik7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWQgcmVnaXN0ZXJpbmcgaW50ZXJmYWNlICIKKworb3V0OgorCXJldHVybiByZXR2YWw7CisKK291dF9yZW1vdmVpZDoKKwl1c2JfcmVtb3ZlX25ld2lkX2ZpbGUobmV3X2RyaXZlcik7CitvdXRfbmV3aWQ6CisJZHJpdmVyX3VucmVnaXN0ZXIoJm5ld19kcml2ZXItPmRydndyYXAuZHJpdmVyKTsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHJlZ2lzdGVyaW5nIGludGVyZmFjZSAiCiAJCQkiCWRyaXZlciAlc1xuIiwKIAkJCXVzYmNvcmVfbmFtZSwgcmV0dmFsLCBuZXdfZHJpdmVyLT5uYW1lKTsKLQl9Ci0KLQlyZXR1cm4gcmV0dmFsOworCWdvdG8gb3V0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX3JlZ2lzdGVyX2RyaXZlcik7CiAKQEAgLTgwNiw2ICs4ODcsNyBAQAogCXByX2luZm8oIiVzOiBkZXJlZ2lzdGVyaW5nIGludGVyZmFjZSBkcml2ZXIgJXNcbiIsCiAJCQl1c2Jjb3JlX25hbWUsIGRyaXZlci0+bmFtZSk7CiAKKwl1c2JfcmVtb3ZlX3JlbW92ZWlkX2ZpbGUoZHJpdmVyKTsKIAl1c2JfcmVtb3ZlX25ld2lkX2ZpbGUoZHJpdmVyKTsKIAl1c2JfZnJlZV9keW5pZHMoZHJpdmVyKTsKIAlkcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyLT5kcnZ3cmFwLmRyaXZlcik7CkBAIC05NDgsOCArMTAzMCw2IEBACiAKICBkb25lOgogCWRldl92ZGJnKCZ1ZGV2LT5kZXYsICIlczogc3RhdHVzICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKLQlpZiAoc3RhdHVzID09IDApCi0JCXVkZXYtPmF1dG9yZXN1bWVfZGlzYWJsZWQgPSAwOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTEyODAsMTEgKzEzNjAsNiBAQAogCiAJLyogUHJvcGFnYXRlIHRoZSByZXN1bWUgdXAgdGhlIHRyZWUsIGlmIG5lY2Vzc2FyeSAqLwogCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfU1VTUEVOREVEKSB7Ci0JCWlmICgobXNnLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykgJiYKLQkJCQl1ZGV2LT5hdXRvcmVzdW1lX2Rpc2FibGVkKSB7Ci0JCQlzdGF0dXMgPSAtRVBFUk07Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KIAkJaWYgKHBhcmVudCkgewogCQkJc3RhdHVzID0gdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHBhcmVudCk7CiAJCQlpZiAoc3RhdHVzID09IDApIHsKQEAgLTEzNDEsNyArMTQxNiw2IEBACiAJaW50CXN0YXR1cyA9IDA7CiAKIAl1c2JfcG1fbG9jayh1ZGV2KTsKLQl1ZGV2LT5hdXRvX3BtID0gMTsKIAl1ZGV2LT5wbV91c2FnZV9jbnQgKz0gaW5jX3VzYWdlX2NudDsKIAlXQVJOX09OKHVkZXYtPnBtX3VzYWdlX2NudCA8IDApOwogCWlmIChpbmNfdXNhZ2VfY250KQpAQCAtMTQ3Myw3ICsxNTQ3LDYgQEAKIAlpZiAoaW50Zi0+Y29uZGl0aW9uID09IFVTQl9JTlRFUkZBQ0VfVU5CT1VORCkKIAkJc3RhdHVzID0gLUVOT0RFVjsKIAllbHNlIHsKLQkJdWRldi0+YXV0b19wbSA9IDE7CiAJCWF0b21pY19hZGQoaW5jX3VzYWdlX2NudCwgJmludGYtPnBtX3VzYWdlX2NudCk7CiAJCXVkZXYtPmxhc3RfYnVzeSA9IGppZmZpZXM7CiAJCWlmIChpbmNfdXNhZ2VfY250ID49IDAgJiYKQEAgLTE2NDAsOCArMTcxMyw2IEBACiAKIAlpZiAoaW50Zi0+Y29uZGl0aW9uID09IFVTQl9JTlRFUkZBQ0VfVU5CT1VORCkKIAkJc3RhdHVzID0gLUVOT0RFVjsKLQllbHNlIGlmICh1ZGV2LT5hdXRvcmVzdW1lX2Rpc2FibGVkKQotCQlzdGF0dXMgPSAtRVBFUk07CiAJZWxzZSB7CiAJCWF0b21pY19pbmMoJmludGYtPnBtX3VzYWdlX2NudCk7CiAJCWlmIChhdG9taWNfcmVhZCgmaW50Zi0+cG1fdXNhZ2VfY250KSA+IDAgJiYKQEAgLTE2NTQsMjggKzE3MjUsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jKTsKIAotLyoqCi0gKiB1c2JfYXV0b3BtX3NldF9pbnRlcmZhY2UgLSBzZXQgYSBVU0IgaW50ZXJmYWNlJ3MgYXV0b3N1c3BlbmQgc3RhdGUKLSAqIEBpbnRmOiB0aGUgdXNiX2ludGVyZmFjZSB3aG9zZSBzdGF0ZSBzaG91bGQgYmUgc2V0Ci0gKgotICogVGhpcyByb3V0aW5lIHNldHMgdGhlIGF1dG9zdXNwZW5kIHN0YXRlIG9mIEBpbnRmJ3MgZGV2aWNlIGFjY29yZGluZwotICogdG8gQGludGYncyB1c2FnZSBjb3VudGVyLCB3aGljaCB0aGUgY2FsbGVyIG11c3QgaGF2ZSBzZXQgcHJldmlvdXNseS4KLSAqIElmIHRoZSBjb3VudGVyIGlzIDw9IDAsIHRoZSBkZXZpY2UgaXMgYXV0b3N1c3BlbmRlZCAoaWYgaXQgaXNuJ3QKLSAqIGFscmVhZHkgc3VzcGVuZGVkIGFuZCBpZiBub3RoaW5nIGVsc2UgcHJldmVudHMgdGhlIGF1dG9zdXNwZW5kKS4gIElmCi0gKiB0aGUgY291bnRlciBpcyA+IDAsIHRoZSBkZXZpY2UgaXMgYXV0b3Jlc3VtZWQgKGlmIGl0IGlzbid0IGFscmVhZHkKLSAqIGF3YWtlKS4KLSAqLwotaW50IHVzYl9hdXRvcG1fc2V0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQlpbnQJc3RhdHVzOwotCi0Jc3RhdHVzID0gdXNiX2F1dG9wbV9kb19pbnRlcmZhY2UoaW50ZiwgMCk7Ci0JZGV2X3ZkYmcoJmludGYtPmRldiwgIiVzOiBzdGF0dXMgJWQgY250ICVkXG4iLAotCQkJX19mdW5jX18sIHN0YXR1cywgYXRvbWljX3JlYWQoJmludGYtPnBtX3VzYWdlX2NudCkpOwotCXJldHVybiBzdGF0dXM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh1c2JfYXV0b3BtX3NldF9pbnRlcmZhY2UpOwotCiAjZWxzZQogCiB2b2lkIHVzYl9hdXRvc3VzcGVuZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTE3MDcsNyArMTc1Niw2IEBACiAKIAlkb191bmJpbmRfcmViaW5kKHVkZXYsIERPX1VOQklORCk7CiAJdXNiX3BtX2xvY2sodWRldik7Ci0JdWRldi0+YXV0b19wbSA9IDA7CiAJc3RhdHVzID0gdXNiX3N1c3BlbmRfYm90aCh1ZGV2LCBtc2cpOwogCXVzYl9wbV91bmxvY2sodWRldik7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTE3MzAsNyArMTc3OCw2IEBACiAJaW50CXN0YXR1czsKIAogCXVzYl9wbV9sb2NrKHVkZXYpOwotCXVkZXYtPmF1dG9fcG0gPSAwOwogCXN0YXR1cyA9IHVzYl9yZXN1bWVfYm90aCh1ZGV2LCBtc2cpOwogCXVkZXYtPmxhc3RfYnVzeSA9IGppZmZpZXM7CiAJdXNiX3BtX3VubG9jayh1ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZmlsZS5jIGIvZHJpdmVycy91c2IvY29yZS9maWxlLmMKaW5kZXggMjIyZWUwNy4uYmZjNmMyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9maWxlLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9maWxlLmMKQEAgLTk5LDYgKzk5LDcgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJjbGFzc19jcmVhdGUgZmFpbGVkIGZvciB1c2IgZGV2aWNlc1xuIik7CiAJCWtmcmVlKHVzYl9jbGFzcyk7CiAJCXVzYl9jbGFzcyA9IE5VTEw7CisJCWdvdG8gZXhpdDsKIAl9CiAJdXNiX2NsYXNzLT5jbGFzcy0+ZGV2bm9kZSA9IHVzYl9kZXZub2RlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2dlbmVyaWMuYyBiL2RyaXZlcnMvdXNiL2NvcmUvZ2VuZXJpYy5jCmluZGV4IDA1ZTZkMzEuLmJkZjg3YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZ2VuZXJpYy5jCkBAIC0xMzksNyArMTM5LDcgQEAKIAogCWlmIChiZXN0KSB7CiAJCWkgPSBiZXN0LT5kZXNjLmJDb25maWd1cmF0aW9uVmFsdWU7Ci0JCWRldl9pbmZvKCZ1ZGV2LT5kZXYsCisJCWRldl9kYmcoJnVkZXYtPmRldiwKIAkJCSJjb25maWd1cmF0aW9uICMlZCBjaG9zZW4gZnJvbSAlZCBjaG9pY2Ulc1xuIiwKIAkJCWksIG51bV9jb25maWdzLCBwbHVyYWwobnVtX2NvbmZpZ3MpKTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKaW5kZXggMzRkZTQ3NS4uNmRhYzNiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KIApAQCAtMTI3NSwxMyArMTI3NiwxNiBAQAogCiAJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2NvbnRyb2woJnVyYi0+ZXAtPmRlc2MpCiAJICAgICYmICEodXJiLT50cmFuc2Zlcl9mbGFncyAmIFVSQl9OT19TRVRVUF9ETUFfTUFQKSkgewotCQlpZiAoaGNkLT5zZWxmLnVzZXNfZG1hKQorCQlpZiAoaGNkLT5zZWxmLnVzZXNfZG1hKSB7CiAJCQl1cmItPnNldHVwX2RtYSA9IGRtYV9tYXBfc2luZ2xlKAogCQkJCQloY2QtPnNlbGYuY29udHJvbGxlciwKIAkJCQkJdXJiLT5zZXR1cF9wYWNrZXQsCiAJCQkJCXNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KSwKIAkJCQkJRE1BX1RPX0RFVklDRSk7Ci0JCWVsc2UgaWYgKGhjZC0+ZHJpdmVyLT5mbGFncyAmIEhDRF9MT0NBTF9NRU0pCisJCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoaGNkLT5zZWxmLmNvbnRyb2xsZXIsCisJCQkJCQl1cmItPnNldHVwX2RtYSkpCisJCQkJcmV0dXJuIC1FQUdBSU47CisJCX0gZWxzZSBpZiAoaGNkLT5kcml2ZXItPmZsYWdzICYgSENEX0xPQ0FMX01FTSkKIAkJCXJldCA9IGhjZF9hbGxvY19jb2hlcmVudCgKIAkJCQkJdXJiLT5kZXYtPmJ1cywgbWVtX2ZsYWdzLAogCQkJCQkmdXJiLT5zZXR1cF9kbWEsCkBAIC0xMjkzLDEzICsxMjk3LDE2IEBACiAJZGlyID0gdXNiX3VyYl9kaXJfaW4odXJiKSA/IERNQV9GUk9NX0RFVklDRSA6IERNQV9UT19ERVZJQ0U7CiAJaWYgKHJldCA9PSAwICYmIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAhPSAwCiAJICAgICYmICEodXJiLT50cmFuc2Zlcl9mbGFncyAmIFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQKSkgewotCQlpZiAoaGNkLT5zZWxmLnVzZXNfZG1hKQorCQlpZiAoaGNkLT5zZWxmLnVzZXNfZG1hKSB7CiAJCQl1cmItPnRyYW5zZmVyX2RtYSA9IGRtYV9tYXBfc2luZ2xlICgKIAkJCQkJaGNkLT5zZWxmLmNvbnRyb2xsZXIsCiAJCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyLAogCQkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCiAJCQkJCWRpcik7Ci0JCWVsc2UgaWYgKGhjZC0+ZHJpdmVyLT5mbGFncyAmIEhDRF9MT0NBTF9NRU0pIHsKKwkJCWlmIChkbWFfbWFwcGluZ19lcnJvcihoY2QtPnNlbGYuY29udHJvbGxlciwKKwkJCQkJCXVyYi0+dHJhbnNmZXJfZG1hKSkKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfSBlbHNlIGlmIChoY2QtPmRyaXZlci0+ZmxhZ3MgJiBIQ0RfTE9DQUxfTUVNKSB7CiAJCQlyZXQgPSBoY2RfYWxsb2NfY29oZXJlbnQoCiAJCQkJCXVyYi0+ZGV2LT5idXMsIG1lbV9mbGFncywKIAkJCQkJJnVyYi0+dHJhbnNmZXJfZG1hLApAQCAtMTU4OSwxOSArMTU5NiwzMiBAQAogCX0KIH0KIAotLyogQ2hlY2sgd2hldGhlciBhIG5ldyBjb25maWd1cmF0aW9uIG9yIGFsdCBzZXR0aW5nIGZvciBhbiBpbnRlcmZhY2UKLSAqIHdpbGwgZXhjZWVkIHRoZSBiYW5kd2lkdGggZm9yIHRoZSBidXMgKG9yIHRoZSBob3N0IGNvbnRyb2xsZXIgcmVzb3VyY2VzKS4KLSAqIE9ubHkgcGFzcyBpbiBhIG5vbi1OVUxMIGNvbmZpZyBvciBpbnRlcmZhY2UsIG5vdCBib3RoIQotICogUGFzc2luZyBOVUxMIGZvciBib3RoIG5ld19jb25maWcgYW5kIG5ld19pbnRmIG1lYW5zIHRoZSBkZXZpY2Ugd2lsbCBiZQotICogZGUtY29uZmlndXJlZCBieSBpc3N1aW5nIGEgc2V0IGNvbmZpZ3VyYXRpb24gMCBjb21tYW5kLgorLyoqCisgKiBDaGVjayB3aGV0aGVyIGEgbmV3IGJhbmR3aWR0aCBzZXR0aW5nIGV4Y2VlZHMgdGhlIGJ1cyBiYW5kd2lkdGguCisgKiBAbmV3X2NvbmZpZzogbmV3IGNvbmZpZ3VyYXRpb24gdG8gaW5zdGFsbAorICogQGN1cl9hbHQ6IHRoZSBjdXJyZW50IGFsdGVybmF0ZSBpbnRlcmZhY2Ugc2V0dGluZworICogQG5ld19hbHQ6IGFsdGVybmF0ZSBpbnRlcmZhY2Ugc2V0dGluZyB0aGF0IGlzIGJlaW5nIGluc3RhbGxlZAorICoKKyAqIFRvIGNoYW5nZSBjb25maWd1cmF0aW9ucywgcGFzcyBpbiB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gaW4gbmV3X2NvbmZpZywKKyAqIGFuZCBwYXNzIE5VTEwgZm9yIGN1cl9hbHQgYW5kIG5ld19hbHQuCisgKgorICogVG8gcmVzZXQgYSBkZXZpY2UncyBjb25maWd1cmF0aW9uIChwdXQgdGhlIGRldmljZSBpbiB0aGUgQUREUkVTU0VEIHN0YXRlKSwKKyAqIHBhc3MgaW4gTlVMTCBmb3IgbmV3X2NvbmZpZywgY3VyX2FsdCwgYW5kIG5ld19hbHQuCisgKgorICogVG8gY2hhbmdlIGFsdGVybmF0ZSBpbnRlcmZhY2Ugc2V0dGluZ3MsIHBhc3MgaW4gTlVMTCBmb3IgbmV3X2NvbmZpZywKKyAqIHBhc3MgaW4gdGhlIGN1cnJlbnQgYWx0ZXJuYXRlIGludGVyZmFjZSBzZXR0aW5nIGluIGN1cl9hbHQsCisgKiBhbmQgcGFzcyBpbiB0aGUgbmV3IGFsdGVybmF0ZSBpbnRlcmZhY2Ugc2V0dGluZyBpbiBuZXdfYWx0LgorICoKKyAqIFJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHJlcXVlc3RlZCBiYW5kd2lkdGggY2hhbmdlIGV4Y2VlZHMgdGhlCisgKiBidXMgYmFuZHdpZHRoIG9yIGhvc3QgY29udHJvbGxlciBpbnRlcm5hbCByZXNvdXJjZXMuCiAgKi8KLWludCB1c2JfaGNkX2NoZWNrX2JhbmR3aWR0aChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKK2ludCB1c2JfaGNkX2FsbG9jX2JhbmR3aWR0aChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKIAkJc3RydWN0IHVzYl9ob3N0X2NvbmZpZyAqbmV3X2NvbmZpZywKLQkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKm5ld19pbnRmKQorCQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICpjdXJfYWx0LAorCQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICpuZXdfYWx0KQogewogCWludCBudW1faW50ZnMsIGksIGo7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2VfY2FjaGUgKmludGZfY2FjaGU7Ci0Jc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0ID0gMDsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHQgPSBOVUxMOwogCWludCByZXQgPSAwOwogCXN0cnVjdCB1c2JfaGNkICpoY2Q7CiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcDsKQEAgLTE2MTEsNyArMTYzMSw3IEBACiAJCXJldHVybiAwOwogCiAJLyogQ29uZmlndXJhdGlvbiBpcyBiZWluZyByZW1vdmVkIC0gc2V0IGNvbmZpZ3VyYXRpb24gMCAqLwotCWlmICghbmV3X2NvbmZpZyAmJiAhbmV3X2ludGYpIHsKKwlpZiAoIW5ld19jb25maWcgJiYgIWN1cl9hbHQpIHsKIAkJZm9yIChpID0gMTsgaSA8IDE2OyArK2kpIHsKIAkJCWVwID0gdWRldi0+ZXBfb3V0W2ldOwogCQkJaWYgKGVwKQpAQCAtMTY0OCwxOSArMTY2OCwxMiBAQAogCQkJfQogCQl9CiAJCWZvciAoaSA9IDA7IGkgPCBudW1faW50ZnM7ICsraSkgeworCQkJLyogU2V0IHVwIGVuZHBvaW50cyBmb3IgYWx0ZXJuYXRlIGludGVyZmFjZSBzZXR0aW5nIDAgKi8KKwkJCWFsdCA9IHVzYl9maW5kX2FsdF9zZXR0aW5nKG5ld19jb25maWcsIGksIDApOworCQkJaWYgKCFhbHQpCisJCQkJLyogTm8gYWx0IHNldHRpbmcgMD8gUGljayB0aGUgZmlyc3Qgc2V0dGluZy4gKi8KKwkJCQlhbHQgPSAmbmV3X2NvbmZpZy0+aW50Zl9jYWNoZVtpXS0+YWx0c2V0dGluZ1swXTsKIAotCQkJLyogRGlnIHRoZSBlbmRwb2ludHMgZm9yIGFsdCBzZXR0aW5nIDAgb3V0IG9mIHRoZQotCQkJICogaW50ZXJmYWNlIGNhY2hlIGZvciB0aGlzIGludGVyZmFjZQotCQkJICovCi0JCQlpbnRmX2NhY2hlID0gbmV3X2NvbmZpZy0+aW50Zl9jYWNoZVtpXTsKLQkJCWZvciAoaiA9IDA7IGogPCBpbnRmX2NhY2hlLT5udW1fYWx0c2V0dGluZzsgaisrKSB7Ci0JCQkJaWYgKGludGZfY2FjaGUtPmFsdHNldHRpbmdbal0uZGVzYy5iQWx0ZXJuYXRlU2V0dGluZyA9PSAwKQotCQkJCQlhbHQgPSAmaW50Zl9jYWNoZS0+YWx0c2V0dGluZ1tqXTsKLQkJCX0KLQkJCWlmICghYWx0KSB7Ci0JCQkJcHJpbnRrKEtFUk5fREVCVUcgIkRpZCBub3QgZmluZCBhbHQgc2V0dGluZyAwIGZvciBpbnRmICVkXG4iLCBpKTsKLQkJCQljb250aW51ZTsKLQkJCX0KIAkJCWZvciAoaiA9IDA7IGogPCBhbHQtPmRlc2MuYk51bUVuZHBvaW50czsgaisrKSB7CiAJCQkJcmV0ID0gaGNkLT5kcml2ZXItPmFkZF9lbmRwb2ludChoY2QsIHVkZXYsICZhbHQtPmVuZHBvaW50W2pdKTsKIAkJCQlpZiAocmV0IDwgMCkKQEAgLTE2NjgsNiArMTY4MSwyMiBAQAogCQkJfQogCQl9CiAJfQorCWlmIChjdXJfYWx0ICYmIG5ld19hbHQpIHsKKwkJLyogRHJvcCBhbGwgdGhlIGVuZHBvaW50cyBpbiB0aGUgY3VycmVudCBhbHQgc2V0dGluZyAqLworCQlmb3IgKGkgPSAwOyBpIDwgY3VyX2FsdC0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBpKyspIHsKKwkJCXJldCA9IGhjZC0+ZHJpdmVyLT5kcm9wX2VuZHBvaW50KGhjZCwgdWRldiwKKwkJCQkJJmN1cl9hbHQtPmVuZHBvaW50W2ldKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gcmVzZXQ7CisJCX0KKwkJLyogQWRkIGFsbCB0aGUgZW5kcG9pbnRzIGluIHRoZSBuZXcgYWx0IHNldHRpbmcgKi8KKwkJZm9yIChpID0gMDsgaSA8IG5ld19hbHQtPmRlc2MuYk51bUVuZHBvaW50czsgaSsrKSB7CisJCQlyZXQgPSBoY2QtPmRyaXZlci0+YWRkX2VuZHBvaW50KGhjZCwgdWRldiwKKwkJCQkJJm5ld19hbHQtPmVuZHBvaW50W2ldKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gcmVzZXQ7CisJCX0KKwl9CiAJcmV0ID0gaGNkLT5kcml2ZXItPmNoZWNrX2JhbmR3aWR0aChoY2QsIHVkZXYpOwogcmVzZXQ6CiAJaWYgKHJldCA8IDApCkBAIC0xOTg0LDYgKzIwMTMsNyBAQAogI2lmZGVmIENPTkZJR19QTQogCUlOSVRfV09SSygmaGNkLT53YWtldXBfd29yaywgaGNkX3Jlc3VtZV93b3JrKTsKICNlbmRpZgorCW11dGV4X2luaXQoJmhjZC0+YmFuZHdpZHRoX211dGV4KTsKIAogCWhjZC0+ZHJpdmVyID0gZHJpdmVyOwogCWhjZC0+cHJvZHVjdF9kZXNjID0gKGRyaXZlci0+cHJvZHVjdF9kZXNjKSA/IGRyaXZlci0+cHJvZHVjdF9kZXNjIDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmggYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oCmluZGV4IDc5NzgyYTEuLmQ4YjQzYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmgKKysrIGIvZHJpdmVycy91c2IvY29yZS9oY2QuaApAQCAtMTExLDYgKzExMSwyMCBAQAogCXU2NAkJCXJzcmNfbGVuOwkvKiBtZW1vcnkvaW8gcmVzb3VyY2UgbGVuZ3RoICovCiAJdW5zaWduZWQJCXBvd2VyX2J1ZGdldDsJLyogaW4gbUEsIDAgPSBubyBsaW1pdCAqLwogCisJLyogYmFuZHdpZHRoX211dGV4IHNob3VsZCBiZSB0YWtlbiBiZWZvcmUgYWRkaW5nIG9yIHJlbW92aW5nCisJICogYW55IG5ldyBidXMgYmFuZHdpZHRoIGNvbnN0cmFpbnRzOgorCSAqICAgMS4gQmVmb3JlIGFkZGluZyBhIGNvbmZpZ3VyYXRpb24gZm9yIGEgbmV3IGRldmljZS4KKwkgKiAgIDIuIEJlZm9yZSByZW1vdmluZyB0aGUgY29uZmlndXJhdGlvbiB0byBwdXQgdGhlIGRldmljZSBpbnRvCisJICogICAgICB0aGUgYWRkcmVzc2VkIHN0YXRlLgorCSAqICAgMy4gQmVmb3JlIHNlbGVjdGluZyBhIGRpZmZlcmVudCBjb25maWd1cmF0aW9uLgorCSAqICAgNC4gQmVmb3JlIHNlbGVjdGluZyBhbiBhbHRlcm5hdGUgaW50ZXJmYWNlIHNldHRpbmcuCisJICoKKwkgKiBiYW5kd2lkdGhfbXV0ZXggc2hvdWxkIGJlIGRyb3BwZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNvbnRyb2wgbWVzc2FnZQorCSAqIHRvIHRoZSBkZXZpY2UsIG9yIHJlc2V0dGluZyB0aGUgYmFuZHdpZHRoIGFmdGVyIGEgZmFpbGVkIGF0dGVtcHQuCisJICovCisJc3RydWN0IG11dGV4CQliYW5kd2lkdGhfbXV0ZXg7CisKKwogI2RlZmluZSBIQ0RfQlVGRkVSX1BPT0xTCTQKIAlzdHJ1Y3QgZG1hX3Bvb2wJCSpwb29sIFtIQ0RfQlVGRkVSX1BPT0xTXTsKIApAQCAtMjkwLDkgKzMwNCwxMCBAQAogZXh0ZXJuIHZvaWQgdXNiX2hjZF9yZXNldF9lbmRwb2ludChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKIAkJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCk7CiBleHRlcm4gdm9pZCB1c2JfaGNkX3N5bmNocm9uaXplX3VubGlua3Moc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOwotZXh0ZXJuIGludCB1c2JfaGNkX2NoZWNrX2JhbmR3aWR0aChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKK2V4dGVybiBpbnQgdXNiX2hjZF9hbGxvY19iYW5kd2lkdGgoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCiAJCXN0cnVjdCB1c2JfaG9zdF9jb25maWcgKm5ld19jb25maWcsCi0JCXN0cnVjdCB1c2JfaW50ZXJmYWNlICpuZXdfaW50Zik7CisJCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKm9sZF9hbHQsCisJCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKm5ld19hbHQpOwogZXh0ZXJuIGludCB1c2JfaGNkX2dldF9mcmFtZV9udW1iZXIoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOwogCiBleHRlcm4gc3RydWN0IHVzYl9oY2QgKnVzYl9jcmVhdGVfaGNkKGNvbnN0IHN0cnVjdCBoY19kcml2ZXIgKmRyaXZlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCmluZGV4IDBmODU3ZTYuLjA2YWY5NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwpAQCAtNDUsNyArNDUsNiBAQAogCiAJLyogYnVmZmVyIGZvciB1cmIgLi4uIHdpdGggZXh0cmEgc3BhY2UgaW4gY2FzZSBvZiBiYWJibGUgKi8KIAljaGFyCQkJKCpidWZmZXIpWzhdOwotCWRtYV9hZGRyX3QJCWJ1ZmZlcl9kbWE7CS8qIERNQSBhZGRyZXNzIGZvciBidWZmZXIgKi8KIAl1bmlvbiB7CiAJCXN0cnVjdCB1c2JfaHViX3N0YXR1cwlodWI7CiAJCXN0cnVjdCB1c2JfcG9ydF9zdGF0dXMJcG9ydDsKQEAgLTYxLDYgKzYwLDggQEAKIAkJCQkJCQlzdGF0dXMgY2hhbmdlICovCiAJdW5zaWduZWQgbG9uZwkJYnVzeV9iaXRzWzFdOwkvKiBwb3J0cyBiZWluZyByZXNldCBvcgogCQkJCQkJCXJlc3VtZWQgKi8KKwl1bnNpZ25lZCBsb25nCQlyZW1vdmVkX2JpdHNbMV07IC8qIHBvcnRzIHdpdGggYSAicmVtb3ZlZCIKKwkJCQkJCQlkZXZpY2UgcHJlc2VudCAqLwogI2lmIFVTQl9NQVhDSElMRFJFTiA+IDMxIC8qIDgqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIC0gMSAqLwogI2Vycm9yIGV2ZW50X2JpdHNbXSBpcyB0b28gc2hvcnQhCiAjZW5kaWYKQEAgLTcwLDYgKzcxLDcgQEAKIAogCXVuc2lnbmVkCQltQV9wZXJfcG9ydDsJLyogY3VycmVudCBmb3IgZWFjaCBjaGlsZCAqLwogCisJdW5zaWduZWQJCWluaXRfZG9uZToxOwogCXVuc2lnbmVkCQlsaW1pdGVkX3Bvd2VyOjE7CiAJdW5zaWduZWQJCXF1aWVzY2luZzoxOwogCXVuc2lnbmVkCQlkaXNjb25uZWN0ZWQ6MTsKQEAgLTM3NCwxMiArMzc2LDEzIEBACiB7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAotCS8qIFN1cHByZXNzIGF1dG9zdXNwZW5kIHVudGlsIGtodWJkIHJ1bnMgKi8KLQlhdG9taWNfc2V0KCZ0b191c2JfaW50ZXJmYWNlKGh1Yi0+aW50ZmRldiktPnBtX3VzYWdlX2NudCwgMSk7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaHViX2V2ZW50X2xvY2ssIGZsYWdzKTsKIAlpZiAoIWh1Yi0+ZGlzY29ubmVjdGVkICYmIGxpc3RfZW1wdHkoJmh1Yi0+ZXZlbnRfbGlzdCkpIHsKIAkJbGlzdF9hZGRfdGFpbCgmaHViLT5ldmVudF9saXN0LCAmaHViX2V2ZW50X2xpc3QpOworCisJCS8qIFN1cHByZXNzIGF1dG9zdXNwZW5kIHVudGlsIGtodWJkIHJ1bnMgKi8KKwkJdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX25vX3Jlc3VtZSgKKwkJCQl0b191c2JfaW50ZXJmYWNlKGh1Yi0+aW50ZmRldikpOwogCQl3YWtlX3VwKCZraHViZF93YWl0KTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHViX2V2ZW50X2xvY2ssIGZsYWdzKTsKQEAgLTYzNiw4ICs2MzksMzUgQEAKICAJa2lja19raHViZChodWIpOwogfQogCisvKioKKyAqIHVzYl9yZW1vdmVfZGV2aWNlIC0gZGlzYWJsZSBhIGRldmljZSdzIHBvcnQgb24gaXRzIHBhcmVudCBodWIKKyAqIEB1ZGV2OiBkZXZpY2UgdG8gYmUgZGlzYWJsZWQgYW5kIHJlbW92ZWQKKyAqIENvbnRleHQ6IEB1ZGV2IGxvY2tlZCwgbXVzdCBiZSBhYmxlIHRvIHNsZWVwLgorICoKKyAqIEFmdGVyIEB1ZGV2J3MgcG9ydCBoYXMgYmVlbiBkaXNhYmxlZCwga2h1YmQgaXMgbm90aWZpZWQgYW5kIGl0IHdpbGwKKyAqIHNlZSB0aGF0IHRoZSBkZXZpY2UgaGFzIGJlZW4gZGlzY29ubmVjdGVkLiAgV2hlbiB0aGUgZGV2aWNlIGlzCisgKiBwaHlzaWNhbGx5IHVucGx1Z2dlZCBhbmQgc29tZXRoaW5nIGlzIHBsdWdnZWQgaW4sIHRoZSBldmVudHMgd2lsbAorICogYmUgcmVjZWl2ZWQgYW5kIHByb2Nlc3NlZCBub3JtYWxseS4KKyAqLworaW50IHVzYl9yZW1vdmVfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQoreworCXN0cnVjdCB1c2JfaHViICpodWI7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CisKKwlpZiAoIXVkZXYtPnBhcmVudCkJLyogQ2FuJ3QgcmVtb3ZlIGEgcm9vdCBodWIgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJaHViID0gaGRldl90b19odWIodWRldi0+cGFyZW50KTsKKwlpbnRmID0gdG9fdXNiX2ludGVyZmFjZShodWItPmludGZkZXYpOworCisJdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKGludGYpOworCXNldF9iaXQodWRldi0+cG9ydG51bSwgaHViLT5yZW1vdmVkX2JpdHMpOworCWh1Yl9wb3J0X2xvZ2ljYWxfZGlzY29ubmVjdChodWIsIHVkZXYtPnBvcnRudW0pOworCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShpbnRmKTsKKwlyZXR1cm4gMDsKK30KKwogZW51bSBodWJfYWN0aXZhdGlvbl90eXBlIHsKLQlIVUJfSU5JVCwgSFVCX0lOSVQyLCBIVUJfSU5JVDMsCisJSFVCX0lOSVQsIEhVQl9JTklUMiwgSFVCX0lOSVQzLAkJLyogSU5JVHMgbXVzdCBjb21lIGZpcnN0ICovCiAJSFVCX1BPU1RfUkVTRVQsIEhVQl9SRVNVTUUsIEhVQl9SRVNFVF9SRVNVTUUsCiB9OwogCkBAIC02ODIsOCArNzEyLDggQEAKIAkJCQkJbXNlY3NfdG9famlmZmllcyhkZWxheSkpOwogCiAJCQkvKiBTdXBwcmVzcyBhdXRvc3VzcGVuZCB1bnRpbCBpbml0IGlzIGRvbmUgKi8KLQkJCWF0b21pY19zZXQoJnRvX3VzYl9pbnRlcmZhY2UoaHViLT5pbnRmZGV2KS0+Ci0JCQkJCXBtX3VzYWdlX2NudCwgMSk7CisJCQl1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2Vfbm9fcmVzdW1lKAorCQkJCQl0b191c2JfaW50ZXJmYWNlKGh1Yi0+aW50ZmRldikpOwogCQkJcmV0dXJuOwkJLyogQ29udGludWVzIGF0IGluaXQyOiBiZWxvdyAqLwogCQl9IGVsc2UgewogCQkJaHViX3Bvd2VyX29uKGh1YiwgdHJ1ZSk7CkBAIC03MzEsNiArNzYxLDEzIEBACiAJCQkJCVVTQl9QT1JUX0ZFQVRfQ19FTkFCTEUpOwogCQl9CiAKKwkJLyogV2UgY2FuIGZvcmdldCBhYm91dCBhICJyZW1vdmVkIiBkZXZpY2Ugd2hlbiB0aGVyZSdzIGEKKwkJICogcGh5c2ljYWwgZGlzY29ubmVjdCBvciB0aGUgY29ubmVjdCBzdGF0dXMgY2hhbmdlcy4KKwkJICovCisJCWlmICghKHBvcnRzdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04pIHx8CisJCQkJKHBvcnRjaGFuZ2UgJiBVU0JfUE9SVF9TVEFUX0NfQ09OTkVDVElPTikpCisJCQljbGVhcl9iaXQocG9ydDEsIGh1Yi0+cmVtb3ZlZF9iaXRzKTsKKwogCQlpZiAoIXVkZXYgfHwgdWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEKSB7CiAJCQkvKiBUZWxsIGtodWJkIHRvIGRpc2Nvbm5lY3QgdGhlIGRldmljZSBvcgogCQkJICogY2hlY2sgZm9yIGEgbmV3IGNvbm5lY3Rpb24KQEAgLTc4Myw2ICs4MjAsNyBAQAogCX0KICBpbml0MzoKIAlodWItPnF1aWVzY2luZyA9IDA7CisJaHViLT5pbml0X2RvbmUgPSAxOwogCiAJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIoaHViLT51cmIsIEdGUF9OT0lPKTsKIAlpZiAoc3RhdHVzIDwgMCkKQEAgLTc5Miw2ICs4MzAsMTAgQEAKIAogCS8qIFNjYW4gYWxsIHBvcnRzIHRoYXQgbmVlZCBhdHRlbnRpb24gKi8KIAlraWNrX2todWJkKGh1Yik7CisKKwkvKiBBbGxvdyBhdXRvc3VzcGVuZCBpZiBpdCB3YXMgc3VwcHJlc3NlZCAqLworCWlmICh0eXBlIDw9IEhVQl9JTklUMykKKwkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jKHRvX3VzYl9pbnRlcmZhY2UoaHViLT5pbnRmZGV2KSk7CiB9CiAKIC8qIEltcGxlbWVudCB0aGUgY29udGludWF0aW9ucyBmb3IgdGhlIGRlbGF5cyBhYm92ZSAqLwpAQCAtODE5LDYgKzg2MSwxMSBAQAogCWludCBpOwogCiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZodWItPmluaXRfd29yayk7CisJaWYgKCFodWItPmluaXRfZG9uZSkgeworCQlodWItPmluaXRfZG9uZSA9IDE7CisJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9ub19zdXNwZW5kKAorCQkJCXRvX3VzYl9pbnRlcmZhY2UoaHViLT5pbnRmZGV2KSk7CisJfQogCiAJLyoga2h1YmQgYW5kIHJlbGF0ZWQgYWN0aXZpdHkgd29uJ3QgcmUtdHJpZ2dlciAqLwogCWh1Yi0+cXVpZXNjaW5nID0gMTsKQEAgLTg2OSw4ICs5MTYsNyBAQAogCWludCBtYXhwLCByZXQ7CiAJY2hhciAqbWVzc2FnZSA9ICJvdXQgb2YgbWVtb3J5IjsKIAotCWh1Yi0+YnVmZmVyID0gdXNiX2J1ZmZlcl9hbGxvYyhoZGV2LCBzaXplb2YoKmh1Yi0+YnVmZmVyKSwgR0ZQX0tFUk5FTCwKLQkJCSZodWItPmJ1ZmZlcl9kbWEpOworCWh1Yi0+YnVmZmVyID0ga21hbGxvYyhzaXplb2YoKmh1Yi0+YnVmZmVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFodWItPmJ1ZmZlcikgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWw7CkBAIC0xMTExLDggKzExNTcsNiBAQAogCiAJdXNiX2ZpbGxfaW50X3VyYihodWItPnVyYiwgaGRldiwgcGlwZSwgKmh1Yi0+YnVmZmVyLCBtYXhwLCBodWJfaXJxLAogCQlodWIsIGVuZHBvaW50LT5iSW50ZXJ2YWwpOwotCWh1Yi0+dXJiLT50cmFuc2Zlcl9kbWEgPSBodWItPmJ1ZmZlcl9kbWE7Ci0JaHViLT51cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwogCiAJLyogbWF5YmUgY3ljbGUgdGhlIGh1YiBsZWRzICovCiAJaWYgKGh1Yi0+aGFzX2luZGljYXRvcnMgJiYgYmxpbmtlbmxpZ2h0cykKQEAgLTExNDQsNyArMTE4OCwxMCBAQAogCiAJLyogVGFrZSB0aGUgaHViIG9mZiB0aGUgZXZlbnQgbGlzdCBhbmQgZG9uJ3QgbGV0IGl0IGJlIGFkZGVkIGFnYWluICovCiAJc3Bpbl9sb2NrX2lycSgmaHViX2V2ZW50X2xvY2spOwotCWxpc3RfZGVsX2luaXQoJmh1Yi0+ZXZlbnRfbGlzdCk7CisJaWYgKCFsaXN0X2VtcHR5KCZodWItPmV2ZW50X2xpc3QpKSB7CisJCWxpc3RfZGVsX2luaXQoJmh1Yi0+ZXZlbnRfbGlzdCk7CisJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9ub19zdXNwZW5kKGludGYpOworCX0KIAlodWItPmRpc2Nvbm5lY3RlZCA9IDE7CiAJc3Bpbl91bmxvY2tfaXJxKCZodWJfZXZlbnRfbG9jayk7CiAKQEAgLTExNjIsOCArMTIwOSw3IEBACiAJa2ZyZWUoaHViLT5wb3J0X293bmVycyk7CiAJa2ZyZWUoaHViLT5kZXNjcmlwdG9yKTsKIAlrZnJlZShodWItPnN0YXR1cyk7Ci0JdXNiX2J1ZmZlcl9mcmVlKGh1Yi0+aGRldiwgc2l6ZW9mKCpodWItPmJ1ZmZlciksIGh1Yi0+YnVmZmVyLAotCQkJaHViLT5idWZmZXJfZG1hKTsKKwlrZnJlZShodWItPmJ1ZmZlcik7CiAKIAlrcmVmX3B1dCgmaHViLT5rcmVmLCBodWJfcmVsZWFzZSk7CiB9CkBAIC0xNjMwLDcgKzE2NzYsNyBAQAogCWlmICghdWRldi0+YnVzLT5pc19iX2hvc3QKIAkJCSYmIHVkZXYtPmNvbmZpZwogCQkJJiYgdWRldi0+cGFyZW50ID09IHVkZXYtPmJ1cy0+cm9vdF9odWIpIHsKLQkJc3RydWN0IHVzYl9vdGdfZGVzY3JpcHRvcgkqZGVzYyA9IDA7CisJCXN0cnVjdCB1c2Jfb3RnX2Rlc2NyaXB0b3IJKmRlc2MgPSBOVUxMOwogCQlzdHJ1Y3QgdXNiX2J1cwkJCSpidXMgPSB1ZGV2LT5idXM7CiAKIAkJLyogZGVzY3JpcHRvciBtYXkgYXBwZWFyIGFueXdoZXJlIGluIGNvbmZpZyAqLwpAQCAtMjEyMyw5ICsyMTY5LDEzIEBACiAJCQkJVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQLCAwLAogCQkJCU5VTEwsIDAsCiAJCQkJVVNCX0NUUkxfU0VUX1RJTUVPVVQpOwotCQlpZiAoc3RhdHVzKQorCQlpZiAoc3RhdHVzKSB7CiAJCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJ3b24ndCByZW1vdGUgd2FrZXVwLCBzdGF0dXMgJWRcbiIsCiAJCQkJCXN0YXR1cyk7CisJCQkvKiBiYWlsIGlmIGF1dG9zdXNwZW5kIGlzIHJlcXVlc3RlZCAqLworCQkJaWYgKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8pCisJCQkJcmV0dXJuIHN0YXR1czsKKwkJfQogCX0KIAogCS8qIHNlZSA3LjEuNy42ICovCkBAIC0yMTM0LDcgKzIxODQsOCBAQAogCQlkZXZfZGJnKGh1Yi0+aW50ZmRldiwgImNhbid0IHN1c3BlbmQgcG9ydCAlZCwgc3RhdHVzICVkXG4iLAogCQkJCXBvcnQxLCBzdGF0dXMpOwogCQkvKiBwYXJhbm9pYTogICJzaG91bGQgbm90IGhhcHBlbiIgKi8KLQkJKHZvaWQpIHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCWlmICh1ZGV2LT5kb19yZW1vdGVfd2FrZXVwKQorCQkJKHZvaWQpIHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCiAJCQkJVVNCX1JFUV9DTEVBUl9GRUFUVVJFLCBVU0JfUkVDSVBfREVWSUNFLAogCQkJCVVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUCwgMCwKIAkJCQlOVUxMLCAwLApAQCAtMjk2NSw2ICszMDE2LDEzIEBACiAJCXVzYl9kaXNjb25uZWN0KCZoZGV2LT5jaGlsZHJlbltwb3J0MS0xXSk7CiAJY2xlYXJfYml0KHBvcnQxLCBodWItPmNoYW5nZV9iaXRzKTsKIAorCS8qIFdlIGNhbiBmb3JnZXQgYWJvdXQgYSAicmVtb3ZlZCIgZGV2aWNlIHdoZW4gdGhlcmUncyBhIHBoeXNpY2FsCisJICogZGlzY29ubmVjdCBvciB0aGUgY29ubmVjdCBzdGF0dXMgY2hhbmdlcy4KKwkgKi8KKwlpZiAoIShwb3J0c3RhdHVzICYgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OKSB8fAorCQkJKHBvcnRjaGFuZ2UgJiBVU0JfUE9SVF9TVEFUX0NfQ09OTkVDVElPTikpCisJCWNsZWFyX2JpdChwb3J0MSwgaHViLT5yZW1vdmVkX2JpdHMpOworCiAJaWYgKHBvcnRjaGFuZ2UgJiAoVVNCX1BPUlRfU1RBVF9DX0NPTk5FQ1RJT04gfAogCQkJCVVTQl9QT1JUX1NUQVRfQ19FTkFCTEUpKSB7CiAJCXN0YXR1cyA9IGh1Yl9wb3J0X2RlYm91bmNlKGh1YiwgcG9ydDEpOwpAQCAtMjk3OCw4ICszMDM2LDExIEBACiAJCX0KIAl9CiAKLQkvKiBSZXR1cm4gbm93IGlmIGRlYm91bmNpbmcgZmFpbGVkIG9yIG5vdGhpbmcgaXMgY29ubmVjdGVkICovCi0JaWYgKCEocG9ydHN0YXR1cyAmIFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTikpIHsKKwkvKiBSZXR1cm4gbm93IGlmIGRlYm91bmNpbmcgZmFpbGVkIG9yIG5vdGhpbmcgaXMgY29ubmVjdGVkIG9yCisJICogdGhlIGRldmljZSB3YXMgInJlbW92ZWQiLgorCSAqLworCWlmICghKHBvcnRzdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04pIHx8CisJCQl0ZXN0X2JpdChwb3J0MSwgaHViLT5yZW1vdmVkX2JpdHMpKSB7CiAKIAkJLyogbWF5YmUgc3dpdGNoIHBvd2VyIGJhY2sgb24gKGUuZy4gcm9vdCBodWIgd2FzIHJlc2V0KSAqLwogCQlpZiAoKHdIdWJDaGFyYWN0ZXJpc3RpY3MgJiBIVUJfQ0hBUl9MUFNNKSA8IDIKQEAgLTMxODksNyArMzI1MCw3IEBACiAJCSAqIGRpc2Nvbm5lY3RlZCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgbG9jayB0byBzdWNjZWVkLiAqLwogCQl1c2JfbG9ja19kZXZpY2UoaGRldik7CiAJCWlmICh1bmxpa2VseShodWItPmRpc2Nvbm5lY3RlZCkpCi0JCQlnb3RvIGxvb3A7CisJCQlnb3RvIGxvb3AyOwogCiAJCS8qIElmIHRoZSBodWIgaGFzIGRpZWQsIGNsZWFuIHVwIGFmdGVyIGl0ICovCiAJCWlmIChoZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpIHsKQEAgLTMzMzgsMTEgKzMzOTksMTUgQEAKIAkJCX0KIAkJfQogCi1sb29wX2F1dG9wbToKLQkJLyogQWxsb3cgYXV0b3N1c3BlbmQgaWYgd2UncmUgbm90IGdvaW5nIHRvIHJ1biBhZ2FpbiAqLwotCQlpZiAobGlzdF9lbXB0eSgmaHViLT5ldmVudF9saXN0KSkKLQkJCXVzYl9hdXRvcG1fZW5hYmxlKGludGYpOwotbG9vcDoKKyBsb29wX2F1dG9wbToKKwkJLyogQmFsYW5jZSB0aGUgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKCkgYWJvdmUgKi8KKwkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX25vX3N1c3BlbmQoaW50Zik7CisgbG9vcDoKKwkJLyogQmFsYW5jZSB0aGUgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX25vX3Jlc3VtZSgpIGluCisJCSAqIGtpY2tfa2h1YmQoKSBhbmQgYWxsb3cgYXV0b3N1c3BlbmQuCisJCSAqLworCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoaW50Zik7CisgbG9vcDI6CiAJCXVzYl91bmxvY2tfZGV2aWNlKGhkZXYpOwogCQlrcmVmX3B1dCgmaHViLT5rcmVmLCBodWJfcmVsZWFzZSk7CiAKQEAgLTM1MzQsNiArMzU5OSw3IEBACiB7CiAJc3RydWN0IHVzYl9kZXZpY2UJCSpwYXJlbnRfaGRldiA9IHVkZXYtPnBhcmVudDsKIAlzdHJ1Y3QgdXNiX2h1YgkJCSpwYXJlbnRfaHViOworCXN0cnVjdCB1c2JfaGNkCQkJKmhjZCA9IGJ1c190b19oY2QodWRldi0+YnVzKTsKIAlzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yCWRlc2NyaXB0b3IgPSB1ZGV2LT5kZXNjcmlwdG9yOwogCWludCAJCQkJaSwgcmV0ID0gMDsKIAlpbnQJCQkJcG9ydDEgPSB1ZGV2LT5wb3J0bnVtOwpAQCAtMzU3Nyw2ICszNjQzLDE2IEBACiAJLyogUmVzdG9yZSB0aGUgZGV2aWNlJ3MgcHJldmlvdXMgY29uZmlndXJhdGlvbiAqLwogCWlmICghdWRldi0+YWN0Y29uZmlnKQogCQlnb3RvIGRvbmU7CisKKwltdXRleF9sb2NrKCZoY2QtPmJhbmR3aWR0aF9tdXRleCk7CisJcmV0ID0gdXNiX2hjZF9hbGxvY19iYW5kd2lkdGgodWRldiwgdWRldi0+YWN0Y29uZmlnLCBOVUxMLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfd2FybigmdWRldi0+ZGV2LAorCQkJCSJCdXN0ZWQgSEM/ICBOb3QgZW5vdWdoIEhDRCByZXNvdXJjZXMgZm9yICIKKwkJCQkib2xkIGNvbmZpZ3VyYXRpb24uXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZoY2QtPmJhbmR3aWR0aF9tdXRleCk7CisJCWdvdG8gcmVfZW51bWVyYXRlOworCX0KIAlyZXQgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAogCQkJVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTiwgMCwKIAkJCXVkZXYtPmFjdGNvbmZpZy0+ZGVzYy5iQ29uZmlndXJhdGlvblZhbHVlLCAwLApAQCAtMzU4NSw4ICszNjYxLDEwIEBACiAJCWRldl9lcnIoJnVkZXYtPmRldiwKIAkJCSJjYW4ndCByZXN0b3JlIGNvbmZpZ3VyYXRpb24gIyVkIChlcnJvcj0lZClcbiIsCiAJCQl1ZGV2LT5hY3Rjb25maWctPmRlc2MuYkNvbmZpZ3VyYXRpb25WYWx1ZSwgcmV0KTsKKwkJbXV0ZXhfdW5sb2NrKCZoY2QtPmJhbmR3aWR0aF9tdXRleCk7CiAJCWdvdG8gcmVfZW51bWVyYXRlOwogICAJfQorCW11dGV4X3VubG9jaygmaGNkLT5iYW5kd2lkdGhfbXV0ZXgpOwogCXVzYl9zZXRfZGV2aWNlX3N0YXRlKHVkZXYsIFVTQl9TVEFURV9DT05GSUdVUkVEKTsKIAogCS8qIFB1dCBpbnRlcmZhY2VzIGJhY2sgaW50byB0aGUgc2FtZSBhbHRzZXR0aW5ncyBhcyBiZWZvcmUuCkBAIC0zNTk2LDcgKzM2NzQsOCBAQAogCSAqIGVuZHBvaW50IHN0YXRlLgogCSAqLwogCWZvciAoaSA9IDA7IGkgPCB1ZGV2LT5hY3Rjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykgewotCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHVkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlW2ldOworCQlzdHJ1Y3QgdXNiX2hvc3RfY29uZmlnICpjb25maWcgPSB1ZGV2LT5hY3Rjb25maWc7CisJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gY29uZmlnLT5pbnRlcmZhY2VbaV07CiAJCXN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKmRlc2M7CiAKIAkJZGVzYyA9ICZpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYzsKQEAgLTM2MDUsNiArMzY4NCwxNyBAQAogCQkJdXNiX2VuYWJsZV9pbnRlcmZhY2UodWRldiwgaW50ZiwgdHJ1ZSk7CiAJCQlyZXQgPSAwOwogCQl9IGVsc2UgeworCQkJLyogV2UndmUganVzdCByZXNldCB0aGUgZGV2aWNlLCBzbyBpdCB3aWxsIHRoaW5rIGFsdAorCQkJICogc2V0dGluZyAwIGlzIGluc3RhbGxlZC4gIEZvciB1c2Jfc2V0X2ludGVyZmFjZSgpIHRvCisJCQkgKiB3b3JrIHByb3Blcmx5LCB3ZSBuZWVkIHRvIHNldCB0aGUgY3VycmVudCBhbHRlcm5hdGUKKwkJCSAqIGludGVyZmFjZSBzZXR0aW5nIHRvIDAgKG9yIHRoZSBmaXJzdCBhbHQgc2V0dGluZywgaWYKKwkJCSAqIHRoZSBkZXZpY2UgZG9lc24ndCBoYXZlIGFsdCBzZXR0aW5nIDApLgorCQkJICovCisJCQlpbnRmLT5jdXJfYWx0c2V0dGluZyA9CisJCQkJdXNiX2ZpbmRfYWx0X3NldHRpbmcoY29uZmlnLCBpLCAwKTsKKwkJCWlmICghaW50Zi0+Y3VyX2FsdHNldHRpbmcpCisJCQkJaW50Zi0+Y3VyX2FsdHNldHRpbmcgPQorCQkJCQkmY29uZmlnLT5pbnRmX2NhY2hlW2ldLT5hbHRzZXR0aW5nWzBdOwogCQkJcmV0ID0gdXNiX3NldF9pbnRlcmZhY2UodWRldiwgZGVzYy0+YkludGVyZmFjZU51bWJlciwKIAkJCQkJZGVzYy0+YkFsdGVybmF0ZVNldHRpbmcpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCmluZGV4IGU4MGYxYWYuLjFiOTk0ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCkBAIC0zOTMsMTMgKzM5Myw3IEBACiAJaWYgKGlvLT5lbnRyaWVzIDw9IDApCiAJCXJldHVybiBpby0+ZW50cmllczsKIAotCS8qIElmIHdlJ3JlIHJ1bm5pbmcgb24gYW4geEhDSSBob3N0IGNvbnRyb2xsZXIsIHF1ZXVlIHRoZSB3aG9sZSBzY2F0dGVyCi0JICogZ2F0aGVyIGxpc3Qgd2l0aCBvbmUgY2FsbCB0byB1cmJfZW5xdWV1ZSgpLiAgVGhpcyBpcyBvbmx5IGZvciBidWxrLAotCSAqIGFzIHRoYXQgZW5kcG9pbnQgdHlwZSBkb2VzIG5vdCBjYXJlIGhvdyB0aGUgZGF0YSBnZXRzIGJyb2tlbiB1cAotCSAqIGFjcm9zcyBmcmFtZXMuCi0JICovCi0JaWYgKHVzYl9waXBlYnVsayhwaXBlKSAmJgotCQkJYnVzX3RvX2hjZChkZXYtPmJ1cyktPmRyaXZlci0+ZmxhZ3MgJiBIQ0RfVVNCMykgeworCWlmIChkZXYtPmJ1cy0+c2dfdGFibGVzaXplID4gMCkgewogCQlpby0+dXJicyA9IGttYWxsb2Moc2l6ZW9mICppby0+dXJicywgbWVtX2ZsYWdzKTsKIAkJdXNlX3NnID0gdHJ1ZTsKIAl9IGVsc2UgewpAQCAtNDA5LDcgKzQwMyw3IEBACiAJaWYgKCFpby0+dXJicykKIAkJZ290byBub21lbTsKIAotCXVyYl9mbGFncyA9IFVSQl9OT19JTlRFUlJVUFQ7CisJdXJiX2ZsYWdzID0gMDsKIAlpZiAoZG1hKQogCQl1cmJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CiAJaWYgKHVzYl9waXBlaW4ocGlwZSkpCkBAIC00NDEsNiArNDM1LDcgQEAKIAkJaW8tPnVyYnNbMF0tPm51bV9zZ3MgPSBpby0+ZW50cmllczsKIAkJaW8tPmVudHJpZXMgPSAxOwogCX0gZWxzZSB7CisJCXVyYl9mbGFncyB8PSBVUkJfTk9fSU5URVJSVVBUOwogCQlmb3JfZWFjaF9zZyhzZywgc2csIGlvLT5lbnRyaWVzLCBpKSB7CiAJCQl1bnNpZ25lZCBsZW47CiAKQEAgLTEzMDMsNiArMTI5OCw3IEBACiB7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlOwogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdDsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gYnVzX3RvX2hjZChkZXYtPmJ1cyk7CiAJaW50IHJldDsKIAlpbnQgbWFudWFsID0gMDsKIAl1bnNpZ25lZCBpbnQgZXBhZGRyOwpAQCAtMTMyNSw2ICsxMzIxLDE4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBiYW5kd2lkdGggZm9yIHRoaXMgYWx0ZXJuYXRlIGludGVyZmFjZS4KKwkgKiBSZW1vdmUgdGhlIGN1cnJlbnQgYWx0IHNldHRpbmcgYW5kIGFkZCB0aGUgbmV3IGFsdCBzZXR0aW5nLgorCSAqLworCW11dGV4X2xvY2soJmhjZC0+YmFuZHdpZHRoX211dGV4KTsKKwlyZXQgPSB1c2JfaGNkX2FsbG9jX2JhbmR3aWR0aChkZXYsIE5VTEwsIGlmYWNlLT5jdXJfYWx0c2V0dGluZywgYWx0KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfaW5mbygmZGV2LT5kZXYsICJOb3QgZW5vdWdoIGJhbmR3aWR0aCBmb3IgYWx0c2V0dGluZyAlZFxuIiwKKwkJCQlhbHRlcm5hdGUpOworCQltdXRleF91bmxvY2soJmhjZC0+YmFuZHdpZHRoX211dGV4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAlpZiAoZGV2LT5xdWlya3MgJiBVU0JfUVVJUktfTk9fU0VUX0lOVEYpCiAJCXJldCA9IC1FUElQRTsKIAllbHNlCkBAIC0xMzQwLDggKzEzNDgsMTMgQEAKIAkJCSJtYW51YWwgc2V0X2ludGVyZmFjZSBmb3IgaWZhY2UgJWQsIGFsdCAlZFxuIiwKIAkJCWludGVyZmFjZSwgYWx0ZXJuYXRlKTsKIAkJbWFudWFsID0gMTsKLQl9IGVsc2UgaWYgKHJldCA8IDApCisJfSBlbHNlIGlmIChyZXQgPCAwKSB7CisJCS8qIFJlLWluc3RhdGUgdGhlIG9sZCBhbHQgc2V0dGluZyAqLworCQl1c2JfaGNkX2FsbG9jX2JhbmR3aWR0aChkZXYsIE5VTEwsIGFsdCwgaWZhY2UtPmN1cl9hbHRzZXR0aW5nKTsKKwkJbXV0ZXhfdW5sb2NrKCZoY2QtPmJhbmR3aWR0aF9tdXRleCk7CiAJCXJldHVybiByZXQ7CisJfQorCW11dGV4X3VubG9jaygmaGNkLT5iYW5kd2lkdGhfbXV0ZXgpOwogCiAJLyogRklYTUUgZHJpdmVycyBzaG91bGRuJ3QgbmVlZCB0byByZXBsaWNhdGUvYnVnZml4IHRoZSBsb2dpYyBoZXJlCiAJICogd2hlbiB0aGV5IGltcGxlbWVudCBhc3luYyBvciBlYXNpbHkta2lsbGFibGUgdmVyc2lvbnMgb2YgdGhpcyBvcgpAQCAtMTQyMyw2ICsxNDM2LDcgQEAKIHsKIAlpbnQJCQlpLCByZXR2YWw7CiAJc3RydWN0IHVzYl9ob3N0X2NvbmZpZwkqY29uZmlnOworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBidXNfdG9faGNkKGRldi0+YnVzKTsKIAogCWlmIChkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpCiAJCXJldHVybiAtRUhPU1RVTlJFQUNIOwpAQCAtMTQzOCwxMiArMTQ1Miw0NiBAQAogCX0KIAogCWNvbmZpZyA9IGRldi0+YWN0Y29uZmlnOworCXJldHZhbCA9IDA7CisJbXV0ZXhfbG9jaygmaGNkLT5iYW5kd2lkdGhfbXV0ZXgpOworCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBiYW5kd2lkdGggZm9yIGVhY2ggYWx0ZXJuYXRlIHNldHRpbmcgMCAqLworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykgeworCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IGNvbmZpZy0+aW50ZXJmYWNlW2ldOworCQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHQ7CisKKwkJYWx0ID0gdXNiX2FsdG51bV90b19hbHRzZXR0aW5nKGludGYsIDApOworCQlpZiAoIWFsdCkKKwkJCWFsdCA9ICZpbnRmLT5hbHRzZXR0aW5nWzBdOworCQlpZiAoYWx0ICE9IGludGYtPmN1cl9hbHRzZXR0aW5nKQorCQkJcmV0dmFsID0gdXNiX2hjZF9hbGxvY19iYW5kd2lkdGgoZGV2LCBOVUxMLAorCQkJCQlpbnRmLT5jdXJfYWx0c2V0dGluZywgYWx0KTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlicmVhazsKKwl9CisJLyogSWYgbm90LCByZWluc3RhdGUgdGhlIG9sZCBhbHRlcm5hdGUgc2V0dGluZ3MgKi8KKwlpZiAocmV0dmFsIDwgMCkgeworcmVzZXRfb2xkX2FsdHM6CisJCWZvciAoOyBpID49IDA7IGktLSkgeworCQkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSBjb25maWctPmludGVyZmFjZVtpXTsKKwkJCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdDsKKworCQkJYWx0ID0gdXNiX2FsdG51bV90b19hbHRzZXR0aW5nKGludGYsIDApOworCQkJaWYgKCFhbHQpCisJCQkJYWx0ID0gJmludGYtPmFsdHNldHRpbmdbMF07CisJCQlpZiAoYWx0ICE9IGludGYtPmN1cl9hbHRzZXR0aW5nKQorCQkJCXVzYl9oY2RfYWxsb2NfYmFuZHdpZHRoKGRldiwgTlVMTCwKKwkJCQkJCWFsdCwgaW50Zi0+Y3VyX2FsdHNldHRpbmcpOworCQl9CisJCW11dGV4X3VubG9jaygmaGNkLT5iYW5kd2lkdGhfbXV0ZXgpOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKIAkJCVVTQl9SRVFfU0VUX0NPTkZJR1VSQVRJT04sIDAsCiAJCQljb25maWctPmRlc2MuYkNvbmZpZ3VyYXRpb25WYWx1ZSwgMCwKIAkJCU5VTEwsIDAsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKIAlpZiAocmV0dmFsIDwgMCkKLQkJcmV0dXJuIHJldHZhbDsKKwkJZ290byByZXNldF9vbGRfYWx0czsKKwltdXRleF91bmxvY2soJmhjZC0+YmFuZHdpZHRoX211dGV4KTsKIAogCS8qIHJlLWluaXQgaGMvaGNkIGludGVyZmFjZS9lbmRwb2ludCBzdGF0ZSAqLwogCWZvciAoaSA9IDA7IGkgPCBjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykgewpAQCAtMTU4NSw3ICsxNjMzLDcgQEAKICAqCiAgKiBTZWUgdXNiX3F1ZXVlX3Jlc2V0X2RldmljZSgpIGZvciBtb3JlIGRldGFpbHMKICAqLwotdm9pZCBfX3VzYl9xdWV1ZV9yZXNldF9kZXZpY2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3cykKK3N0YXRpYyB2b2lkIF9fdXNiX3F1ZXVlX3Jlc2V0X2RldmljZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndzKQogewogCWludCByYzsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UgPQpAQCAtMTY1Miw2ICsxNzAwLDcgQEAKIAlpbnQgaSwgcmV0OwogCXN0cnVjdCB1c2JfaG9zdF9jb25maWcgKmNwID0gTlVMTDsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKm5ld19pbnRlcmZhY2VzID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gYnVzX3RvX2hjZChkZXYtPmJ1cyk7CiAJaW50IG4sIG5pbnRmOwogCiAJaWYgKGRldi0+YXV0aG9yaXplZCA9PSAwIHx8IGNvbmZpZ3VyYXRpb24gPT0gLTEpCkBAIC0xNzIxLDEyICsxNzcwLDExIEBACiAJICogaG9zdCBjb250cm9sbGVyIHdpbGwgbm90IGFsbG93IHN1Ym1pc3Npb25zIHRvIGRyb3BwZWQgZW5kcG9pbnRzLiAgSWYKIAkgKiB0aGlzIGNhbGwgZmFpbHMsIHRoZSBkZXZpY2Ugc3RhdGUgaXMgdW5jaGFuZ2VkLgogCSAqLwotCWlmIChjcCkKLQkJcmV0ID0gdXNiX2hjZF9jaGVja19iYW5kd2lkdGgoZGV2LCBjcCwgTlVMTCk7Ci0JZWxzZQotCQlyZXQgPSB1c2JfaGNkX2NoZWNrX2JhbmR3aWR0aChkZXYsIE5VTEwsIE5VTEwpOworCW11dGV4X2xvY2soJmhjZC0+YmFuZHdpZHRoX211dGV4KTsKKwlyZXQgPSB1c2JfaGNkX2FsbG9jX2JhbmR3aWR0aChkZXYsIGNwLCBOVUxMLCBOVUxMKTsKIAlpZiAocmV0IDwgMCkgewogCQl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKGRldik7CisJCW11dGV4X3VubG9jaygmaGNkLT5iYW5kd2lkdGhfbXV0ZXgpOwogCQlnb3RvIGZyZWVfaW50ZXJmYWNlczsKIAl9CiAKQEAgLTE3NTIsMTAgKzE4MDAsMTIgQEAKIAlkZXYtPmFjdGNvbmZpZyA9IGNwOwogCWlmICghY3ApIHsKIAkJdXNiX3NldF9kZXZpY2Vfc3RhdGUoZGV2LCBVU0JfU1RBVEVfQUREUkVTUyk7Ci0JCXVzYl9oY2RfY2hlY2tfYmFuZHdpZHRoKGRldiwgTlVMTCwgTlVMTCk7CisJCXVzYl9oY2RfYWxsb2NfYmFuZHdpZHRoKGRldiwgTlVMTCwgTlVMTCwgTlVMTCk7CiAJCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UoZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZoY2QtPmJhbmR3aWR0aF9tdXRleCk7CiAJCWdvdG8gZnJlZV9pbnRlcmZhY2VzOwogCX0KKwltdXRleF91bmxvY2soJmhjZC0+YmFuZHdpZHRoX211dGV4KTsKIAl1c2Jfc2V0X2RldmljZV9zdGF0ZShkZXYsIFVTQl9TVEFURV9DT05GSUdVUkVEKTsKIAogCS8qIEluaXRpYWxpemUgdGhlIG5ldyBpbnRlcmZhY2Ugc3RydWN0dXJlcyBhbmQgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMgYi9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMKaW5kZXggN2VjMzA0MWEuLjE1NDc3MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvc3lzZnMuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMKQEAgLTEzOSw2ICsxMzksMTYgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihkZXZudW0sIFNfSVJVR08sIHNob3dfZGV2bnVtLCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QKK3Nob3dfZGV2cGF0aChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisKKwl1ZGV2ID0gdG9fdXNiX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCB1ZGV2LT5kZXZwYXRoKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihkZXZwYXRoLCBTX0lSVUdPLCBzaG93X2RldnBhdGgsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdAogc2hvd192ZXJzaW9uKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKQEAgLTMxNyw3ICszMjcsNiBAQAogCiBzdGF0aWMgY29uc3QgY2hhciBvbl9zdHJpbmdbXSA9ICJvbiI7CiBzdGF0aWMgY29uc3QgY2hhciBhdXRvX3N0cmluZ1tdID0gImF1dG8iOwotc3RhdGljIGNvbnN0IGNoYXIgc3VzcGVuZF9zdHJpbmdbXSA9ICJzdXNwZW5kIjsKIAogc3RhdGljIHNzaXplX3QKIHNob3dfbGV2ZWwoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQpAQCAtMzI1LDEzICszMzQsOCBAQAogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gdG9fdXNiX2RldmljZShkZXYpOwogCWNvbnN0IGNoYXIgKnAgPSBhdXRvX3N0cmluZzsKIAotCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfU1VTUEVOREVEKSB7Ci0JCWlmICh1ZGV2LT5hdXRvcmVzdW1lX2Rpc2FibGVkKQotCQkJcCA9IHN1c3BlbmRfc3RyaW5nOwotCX0gZWxzZSB7Ci0JCWlmICh1ZGV2LT5hdXRvc3VzcGVuZF9kaXNhYmxlZCkKLQkJCXAgPSBvbl9zdHJpbmc7Ci0JfQorCWlmICh1ZGV2LT5zdGF0ZSAhPSBVU0JfU1RBVEVfU1VTUEVOREVEICYmIHVkZXYtPmF1dG9zdXNwZW5kX2Rpc2FibGVkKQorCQlwID0gb25fc3RyaW5nOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBwKTsKIH0KIApAQCAtMzQzLDcgKzM0Nyw3IEBACiAJaW50IGxlbiA9IGNvdW50OwogCWNoYXIgKmNwOwogCWludCByYyA9IDA7Ci0JaW50IG9sZF9hdXRvc3VzcGVuZF9kaXNhYmxlZCwgb2xkX2F1dG9yZXN1bWVfZGlzYWJsZWQ7CisJaW50IG9sZF9hdXRvc3VzcGVuZF9kaXNhYmxlZDsKIAogCWNwID0gbWVtY2hyKGJ1ZiwgJ1xuJywgY291bnQpOwogCWlmIChjcCkKQEAgLTM1MSw3ICszNTUsNiBAQAogCiAJdXNiX2xvY2tfZGV2aWNlKHVkZXYpOwogCW9sZF9hdXRvc3VzcGVuZF9kaXNhYmxlZCA9IHVkZXYtPmF1dG9zdXNwZW5kX2Rpc2FibGVkOwotCW9sZF9hdXRvcmVzdW1lX2Rpc2FibGVkID0gdWRldi0+YXV0b3Jlc3VtZV9kaXNhYmxlZDsKIAogCS8qIFNldHRpbmcgdGhlIGZsYWdzIHdpdGhvdXQgY2FsbGluZyB1c2JfcG1fbG9jayBpcyBhIHN1YmplY3QgdG8KIAkgKiByYWNlcywgYnV0IHdobyBjYXJlcy4uLgpAQCAtMzU5LDI4ICszNjIsMTggQEAKIAlpZiAobGVuID09IHNpemVvZiBvbl9zdHJpbmcgLSAxICYmCiAJCQlzdHJuY21wKGJ1Ziwgb25fc3RyaW5nLCBsZW4pID09IDApIHsKIAkJdWRldi0+YXV0b3N1c3BlbmRfZGlzYWJsZWQgPSAxOwotCQl1ZGV2LT5hdXRvcmVzdW1lX2Rpc2FibGVkID0gMDsKIAkJcmMgPSB1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZSh1ZGV2LCBQTVNHX1VTRVJfUkVTVU1FKTsKIAogCX0gZWxzZSBpZiAobGVuID09IHNpemVvZiBhdXRvX3N0cmluZyAtIDEgJiYKIAkJCXN0cm5jbXAoYnVmLCBhdXRvX3N0cmluZywgbGVuKSA9PSAwKSB7CiAJCXVkZXYtPmF1dG9zdXNwZW5kX2Rpc2FibGVkID0gMDsKLQkJdWRldi0+YXV0b3Jlc3VtZV9kaXNhYmxlZCA9IDA7CiAJCXJjID0gdXNiX2V4dGVybmFsX3Jlc3VtZV9kZXZpY2UodWRldiwgUE1TR19VU0VSX1JFU1VNRSk7CiAKLQl9IGVsc2UgaWYgKGxlbiA9PSBzaXplb2Ygc3VzcGVuZF9zdHJpbmcgLSAxICYmCi0JCQlzdHJuY21wKGJ1Ziwgc3VzcGVuZF9zdHJpbmcsIGxlbikgPT0gMCkgewotCQl1ZGV2LT5hdXRvc3VzcGVuZF9kaXNhYmxlZCA9IDA7Ci0JCXVkZXYtPmF1dG9yZXN1bWVfZGlzYWJsZWQgPSAxOwotCQlyYyA9IHVzYl9leHRlcm5hbF9zdXNwZW5kX2RldmljZSh1ZGV2LCBQTVNHX1VTRVJfU1VTUEVORCk7Ci0KIAl9IGVsc2UKIAkJcmMgPSAtRUlOVkFMOwogCi0JaWYgKHJjKSB7CisJaWYgKHJjKQogCQl1ZGV2LT5hdXRvc3VzcGVuZF9kaXNhYmxlZCA9IG9sZF9hdXRvc3VzcGVuZF9kaXNhYmxlZDsKLQkJdWRldi0+YXV0b3Jlc3VtZV9kaXNhYmxlZCA9IG9sZF9hdXRvcmVzdW1lX2Rpc2FibGVkOwotCX0KIAl1c2JfdW5sb2NrX2RldmljZSh1ZGV2KTsKIAlyZXR1cm4gKHJjIDwgMCA/IHJjIDogY291bnQpOwogfQpAQCAtNTA4LDYgKzUwMSwyOCBAQAogc3RhdGljIERFVklDRV9BVFRSKGF1dGhvcml6ZWQsIDA2NDQsCiAJICAgIHVzYl9kZXZfYXV0aG9yaXplZF9zaG93LCB1c2JfZGV2X2F1dGhvcml6ZWRfc3RvcmUpOwogCisvKiAiU2FmZWx5IHJlbW92ZSBhIGRldmljZSIgKi8KK3N0YXRpYyBzc2l6ZV90IHVzYl9yZW1vdmVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSB0b191c2JfZGV2aWNlKGRldik7CisJaW50IHJjID0gMDsKKworCXVzYl9sb2NrX2RldmljZSh1ZGV2KTsKKwlpZiAodWRldi0+c3RhdGUgIT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEKSB7CisKKwkJLyogVG8gYXZvaWQgcmFjZXMsIGZpcnN0IHVuY29uZmlndXJlIGFuZCB0aGVuIHJlbW92ZSAqLworCQl1c2Jfc2V0X2NvbmZpZ3VyYXRpb24odWRldiwgLTEpOworCQlyYyA9IHVzYl9yZW1vdmVfZGV2aWNlKHVkZXYpOworCX0KKwlpZiAocmMgPT0gMCkKKwkJcmMgPSBjb3VudDsKKwl1c2JfdW5sb2NrX2RldmljZSh1ZGV2KTsKKwlyZXR1cm4gcmM7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocmVtb3ZlLCAwMjAwLCBOVUxMLCB1c2JfcmVtb3ZlX3N0b3JlKTsKKwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZGV2X2F0dHJzW10gPSB7CiAJLyogY3VycmVudCBjb25maWd1cmF0aW9uJ3MgYXR0cmlidXRlcyAqLwpAQCAtNTE2LDggKzUzMSw4IEBACiAJJmRldl9hdHRyX2JDb25maWd1cmF0aW9uVmFsdWUuYXR0ciwKIAkmZGV2X2F0dHJfYm1BdHRyaWJ1dGVzLmF0dHIsCiAJJmRldl9hdHRyX2JNYXhQb3dlci5hdHRyLAotCSZkZXZfYXR0cl91cmJudW0uYXR0ciwKIAkvKiBkZXZpY2UgYXR0cmlidXRlcyAqLworCSZkZXZfYXR0cl91cmJudW0uYXR0ciwKIAkmZGV2X2F0dHJfaWRWZW5kb3IuYXR0ciwKIAkmZGV2X2F0dHJfaWRQcm9kdWN0LmF0dHIsCiAJJmRldl9hdHRyX2JjZERldmljZS5hdHRyLApAQCAtNTI5LDEwICs1NDQsMTIgQEAKIAkmZGV2X2F0dHJfc3BlZWQuYXR0ciwKIAkmZGV2X2F0dHJfYnVzbnVtLmF0dHIsCiAJJmRldl9hdHRyX2Rldm51bS5hdHRyLAorCSZkZXZfYXR0cl9kZXZwYXRoLmF0dHIsCiAJJmRldl9hdHRyX3ZlcnNpb24uYXR0ciwKIAkmZGV2X2F0dHJfbWF4Y2hpbGQuYXR0ciwKIAkmZGV2X2F0dHJfcXVpcmtzLmF0dHIsCiAJJmRldl9hdHRyX2F1dGhvcml6ZWQuYXR0ciwKKwkmZGV2X2F0dHJfcmVtb3ZlLmF0dHIsCiAJTlVMTCwKIH07CiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBkZXZfYXR0cl9ncnAgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jIGIvZHJpdmVycy91c2IvY29yZS91cmIuYwppbmRleCAwODg1ZDRhLi5lN2NhZTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMKQEAgLTQyOSw4ICs0MjksMTYgQEAKIAljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M6CiAJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQ6CiAJCS8qIHRvbyBzbWFsbD8gKi8KLQkJaWYgKHVyYi0+aW50ZXJ2YWwgPD0gMCkKLQkJCXJldHVybiAtRUlOVkFMOworCQlzd2l0Y2ggKGRldi0+c3BlZWQpIHsKKwkJY2FzZSBVU0JfU1BFRURfVkFSSUFCTEU6CisJCQlpZiAodXJiLT5pbnRlcnZhbCA8IDYpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmICh1cmItPmludGVydmFsIDw9IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQogCQkvKiB0b28gYmlnPyAqLwogCQlzd2l0Y2ggKGRldi0+c3BlZWQpIHsKIAkJY2FzZSBVU0JfU1BFRURfU1VQRVI6CS8qIHVuaXRzIGFyZSAxMjV1cyAqLwpAQCAtNDM4LDYgKzQ0NiwxMCBAQAogCQkJaWYgKHVyYi0+aW50ZXJ2YWwgPiAoMSA8PCAxNSkpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQltYXggPSAxIDw8IDE1OworCQljYXNlIFVTQl9TUEVFRF9WQVJJQUJMRToKKwkJCWlmICh1cmItPmludGVydmFsID4gMTYpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKIAkJY2FzZSBVU0JfU1BFRURfSElHSDoJLyogdW5pdHMgYXJlIG1pY3JvZnJhbWVzICovCiAJCQkvKiBOT1RFIHVzYiBoYW5kbGVzIDJeMTUgKi8KIAkJCWlmICh1cmItPmludGVydmFsID4gKDEwMjQgKiA4KSkKQEAgLTQ2MSw4ICs0NzMsMTAgQEAKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCS8qIFJvdW5kIGRvd24gdG8gYSBwb3dlciBvZiAyLCBubyBtb3JlIHRoYW4gbWF4ICovCi0JCXVyYi0+aW50ZXJ2YWwgPSBtaW4obWF4LCAxIDw8IGlsb2cyKHVyYi0+aW50ZXJ2YWwpKTsKKwkJaWYgKGRldi0+c3BlZWQgIT0gVVNCX1NQRUVEX1ZBUklBQkxFKSB7CisJCQkvKiBSb3VuZCBkb3duIHRvIGEgcG93ZXIgb2YgMiwgbm8gbW9yZSB0aGFuIG1heCAqLworCQkJdXJiLT5pbnRlcnZhbCA9IG1pbihtYXgsIDEgPDwgaWxvZzIodXJiLT5pbnRlcnZhbCkpOworCQl9CiAJfQogCiAJcmV0dXJuIHVzYl9oY2Rfc3VibWl0X3VyYih1cmIsIG1lbV9mbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jIGIvZHJpdmVycy91c2IvY29yZS91c2IuYwppbmRleCBiMWI4NWFiLi40ZTJjNmRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKQEAgLTY0LDYgKzY0LDQzIEBACiAKIAogLyoqCisgKiB1c2JfZmluZF9hbHRfc2V0dGluZygpIC0gR2l2ZW4gYSBjb25maWd1cmF0aW9uLCBmaW5kIHRoZSBhbHRlcm5hdGUgc2V0dGluZworICogZm9yIHRoZSBnaXZlbiBpbnRlcmZhY2UuCisgKiBAY29uZmlnIC0gdGhlIGNvbmZpZ3VyYXRpb24gdG8gc2VhcmNoIChub3QgbmVjZXNzYXJpbHkgdGhlIGN1cnJlbnQgY29uZmlnKS4KKyAqIEBpZmFjZV9udW0gLSBpbnRlcmZhY2UgbnVtYmVyIHRvIHNlYXJjaCBpbgorICogQGFsdF9udW0gLSBhbHRlcm5hdGUgaW50ZXJmYWNlIHNldHRpbmcgbnVtYmVyIHRvIHNlYXJjaCBmb3IuCisgKgorICogU2VhcmNoIHRoZSBjb25maWd1cmF0aW9uJ3MgaW50ZXJmYWNlIGNhY2hlIGZvciB0aGUgZ2l2ZW4gYWx0IHNldHRpbmcuCisgKi8KK3N0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKnVzYl9maW5kX2FsdF9zZXR0aW5nKAorCQlzdHJ1Y3QgdXNiX2hvc3RfY29uZmlnICpjb25maWcsCisJCXVuc2lnbmVkIGludCBpZmFjZV9udW0sCisJCXVuc2lnbmVkIGludCBhbHRfbnVtKQoreworCXN0cnVjdCB1c2JfaW50ZXJmYWNlX2NhY2hlICppbnRmX2NhY2hlID0gTlVMTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykgeworCQlpZiAoY29uZmlnLT5pbnRmX2NhY2hlW2ldLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlcgorCQkJCT09IGlmYWNlX251bSkgeworCQkJaW50Zl9jYWNoZSA9IGNvbmZpZy0+aW50Zl9jYWNoZVtpXTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghaW50Zl9jYWNoZSkKKwkJcmV0dXJuIE5VTEw7CisJZm9yIChpID0gMDsgaSA8IGludGZfY2FjaGUtPm51bV9hbHRzZXR0aW5nOyBpKyspCisJCWlmIChpbnRmX2NhY2hlLT5hbHRzZXR0aW5nW2ldLmRlc2MuYkFsdGVybmF0ZVNldHRpbmcgPT0gYWx0X251bSkKKwkJCXJldHVybiAmaW50Zl9jYWNoZS0+YWx0c2V0dGluZ1tpXTsKKworCXByaW50ayhLRVJOX0RFQlVHICJEaWQgbm90IGZpbmQgYWx0IHNldHRpbmcgJXUgZm9yIGludGYgJXUsICIKKwkJCSJjb25maWcgJXVcbiIsIGFsdF9udW0sIGlmYWNlX251bSwKKwkJCWNvbmZpZy0+ZGVzYy5iQ29uZmlndXJhdGlvblZhbHVlKTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9maW5kX2FsdF9zZXR0aW5nKTsKKworLyoqCiAgKiB1c2JfaWZudW1fdG9faWYgLSBnZXQgdGhlIGludGVyZmFjZSBvYmplY3Qgd2l0aCBhIGdpdmVuIGludGVyZmFjZSBudW1iZXIKICAqIEBkZXY6IHRoZSBkZXZpY2Ugd2hvc2UgY3VycmVudCBjb25maWd1cmF0aW9uIGlzIGNvbnNpZGVyZWQKICAqIEBpZm51bTogdGhlIGRlc2lyZWQgaW50ZXJmYWNlCkBAIC0xMzAsMjQgKzE2NywxNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2FsdG51bV90b19hbHRzZXR0aW5nKTsKIAotc3RydWN0IGZpbmRfaW50ZXJmYWNlX2FyZyB7Ci0JaW50IG1pbm9yOwotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7Ci19OwotCiBzdGF0aWMgaW50IF9fZmluZF9pbnRlcmZhY2Uoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBmaW5kX2ludGVyZmFjZV9hcmcgKmFyZyA9IGRhdGE7CisJaW50ICptaW5vciA9IGRhdGE7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CiAKIAlpZiAoIWlzX3VzYl9pbnRlcmZhY2UoZGV2KSkKIAkJcmV0dXJuIDA7CiAKIAlpbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwotCWlmIChpbnRmLT5taW5vciAhPSAtMSAmJiBpbnRmLT5taW5vciA9PSBhcmctPm1pbm9yKSB7Ci0JCWFyZy0+aW50ZXJmYWNlID0gaW50ZjsKKwlpZiAoaW50Zi0+bWlub3IgIT0gLTEgJiYgaW50Zi0+bWlub3IgPT0gKm1pbm9yKQogCQlyZXR1cm4gMTsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1NiwyMSArMTg2LDIwIEBACiAgKiBAZHJ2OiB0aGUgZHJpdmVyIHdob3NlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBpcyBjb25zaWRlcmVkCiAgKiBAbWlub3I6IHRoZSBtaW5vciBudW1iZXIgb2YgdGhlIGRlc2lyZWQgZGV2aWNlCiAgKgotICogVGhpcyB3YWxrcyB0aGUgZHJpdmVyIGRldmljZSBsaXN0IGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW50ZXJmYWNlCisgKiBUaGlzIHdhbGtzIHRoZSBidXMgZGV2aWNlIGxpc3QgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpbnRlcmZhY2UKICAqIHdpdGggdGhlIG1hdGNoaW5nIG1pbm9yLiAgTm90ZSwgdGhpcyBvbmx5IHdvcmtzIGZvciBkZXZpY2VzIHRoYXQgc2hhcmUgdGhlCiAgKiBVU0IgbWFqb3IgbnVtYmVyLgogICovCiBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdXNiX2ZpbmRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfZHJpdmVyICpkcnYsIGludCBtaW5vcikKIHsKLQlzdHJ1Y3QgZmluZF9pbnRlcmZhY2VfYXJnIGFyZ2I7Ci0JaW50IHJldHZhbDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKLQlhcmdiLm1pbm9yID0gbWlub3I7Ci0JYXJnYi5pbnRlcmZhY2UgPSBOVUxMOwotCS8qIGVhdCB0aGUgZXJyb3IsIGl0IHdpbGwgYmUgaW4gYXJnYi5pbnRlcmZhY2UgKi8KLQlyZXR2YWwgPSBkcml2ZXJfZm9yX2VhY2hfZGV2aWNlKCZkcnYtPmRydndyYXAuZHJpdmVyLCBOVUxMLCAmYXJnYiwKLQkJCQkJX19maW5kX2ludGVyZmFjZSk7Ci0JcmV0dXJuIGFyZ2IuaW50ZXJmYWNlOworCWRldiA9IGJ1c19maW5kX2RldmljZSgmdXNiX2J1c190eXBlLCBOVUxMLCAmbWlub3IsIF9fZmluZF9pbnRlcmZhY2UpOworCisJLyogRHJvcCByZWZlcmVuY2UgY291bnQgZnJvbSBidXNfZmluZF9kZXZpY2UgKi8KKwlwdXRfZGV2aWNlKGRldik7CisKKwlyZXR1cm4gZGV2ID8gdG9fdXNiX2ludGVyZmFjZShkZXYpIDogTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9maW5kX2ludGVyZmFjZSk7CiAKQEAgLTEwMzgsNyArMTA2Nyw3IEBACiBzdHJ1Y3QgZGVudHJ5ICp1c2JfZGVidWdfcm9vdDsKIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9kZWJ1Z19yb290KTsKIAotc3RydWN0IGRlbnRyeSAqdXNiX2RlYnVnX2RldmljZXM7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqdXNiX2RlYnVnX2RldmljZXM7CiAKIHN0YXRpYyBpbnQgdXNiX2RlYnVnZnNfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS91c2IuaCBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmgKaW5kZXggOWE4YjE1ZS4uNGMzNmM3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS91c2IuaAorKysgYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oCkBAIC0yNCw2ICsyNCw3IEBACiBleHRlcm4gaW50IHVzYl9kZWF1dGhvcml6ZV9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKik7CiBleHRlcm4gaW50IHVzYl9hdXRob3JpemVfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgdXNiX2RldGVjdF9xdWlya3Moc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOworZXh0ZXJuIGludCB1c2JfcmVtb3ZlX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldik7CiAKIGV4dGVybiBpbnQgdXNiX2dldF9kZXZpY2VfZGVzY3JpcHRvcihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAogCQl1bnNpZ25lZCBpbnQgc2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCmluZGV4IGExOGUzYzUuLmVlNDExMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCkBAIC03MzIsNiArNzMyLDI0IEBACiAJICBiZWhhdmlvciBvZiBVU0IgTWFzcyBTdG9yYWdlIGhvc3RzLiAgTm90IG5lZWRlZCBmb3IKIAkgIG5vcm1hbCBvcGVyYXRpb24uCiAKK2NvbmZpZyBVU0JfTUFTU19TVE9SQUdFCisJdHJpc3RhdGUgIk1hc3MgU3RvcmFnZSBHYWRnZXQiCisJZGVwZW5kcyBvbiBCTE9DSworCWhlbHAKKwkgIFRoZSBNYXNzIFN0b3JhZ2UgR2FkZ2V0IGFjdHMgYXMgYSBVU0IgTWFzcyBTdG9yYWdlIGRpc2sgZHJpdmUuCisJICBBcyBpdHMgc3RvcmFnZSByZXBvc2l0b3J5IGl0IGNhbiB1c2UgYSByZWd1bGFyIGZpbGUgb3IgYSBibG9jaworCSAgZGV2aWNlIChpbiBtdWNoIHRoZSBzYW1lIHdheSBhcyB0aGUgImxvb3AiIGRldmljZSBkcml2ZXIpLAorCSAgc3BlY2lmaWVkIGFzIGEgbW9kdWxlIHBhcmFtZXRlciBvciBzeXNmcyBvcHRpb24uCisKKwkgIFRoaXMgaXMgaGVhdmlseSBiYXNlZCBvbiBGaWxlLWJhY2tlZCBTdG9yYWdlIEdhZGdldCBhbmQgaW4gbW9zdAorCSAgY2FzZXMgeW91IHdpbGwgd2FudCB0byB1c2UgRlNHIGluc3RlYWQuICBUaGlzIGdhZGdldCBpcyBtb3N0bHkKKwkgIGhlcmUgdG8gdGVzdCB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgTWFzcyBTdG9yYWdlIEZ1bmN0aW9uCisJICB3aGljaCBtYXkgYmUgdXNlZCB3aXRoIGNvbXBvc2l0ZSBmcmFtZXdvcmsuCisKKwkgIFNheSAieSIgdG8gbGluayB0aGUgZHJpdmVyIHN0YXRpY2FsbHksIG9yICJtIiB0byBidWlsZAorCSAgYSBkeW5hbWljYWxseSBsaW5rZWQgbW9kdWxlIGNhbGxlZCAiZ19maWxlX3N0b3JhZ2UiLiAgSWYgdW5zdXJlLAorCSAgY29uc2lkZXIgRmlsZS1iYWNrZWQgU3RvcmFnZSBHYWRnZXQuCisKIGNvbmZpZyBVU0JfR19TRVJJQUwKIAl0cmlzdGF0ZSAiU2VyaWFsIEdhZGdldCAod2l0aCBDREMgQUNNIGFuZCBDREMgT0JFWCBzdXBwb3J0KSIKIAloZWxwCkBAIC03OTQsNiArODEyLDQ4IEBACiAJICBTYXkgInkiIHRvIGxpbmsgdGhlIGRyaXZlciBzdGF0aWNhbGx5LCBvciAibSIgdG8gYnVpbGQgYQogCSAgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZS4KIAorY29uZmlnIFVTQl9HX01VTFRJCisJdHJpc3RhdGUgIk11bHRpZnVuY3Rpb24gQ29tcG9zaXRlIEdhZGdldCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEJMT0NLICYmIE5FVAorCWhlbHAKKwkgIFRoZSBNdWx0aWZ1bmN0aW9uIENvbXBvc2l0ZSBHYWRnZXQgcHJvdmlkZXMgRXRoZXJuZXQgKFJORElTCisJICBhbmQvb3IgQ0RDIEV0aGVybmV0KSwgbWFzcyBzdG9yYWdlIGFuZCBBQ00gc2VyaWFsIGxpbmsKKwkgIGludGVyZmFjZXMuCisKKwkgIFlvdSB3aWxsIGJlIGFza2VkIHRvIGNob29zZSB3aGljaCBvZiB0aGUgdHdvIGNvbmZpZ3VyYXRpb25zIGlzCisJICB0byBiZSBhdmFpbGFibGUgaW4gdGhlIGdhZGdldC4gIEF0IGxlYXN0IG9uZSBjb25maWd1cmF0aW9uIG11c3QKKwkgIGJlIGNob3NlbiB0byBtYWtlIHRoZSBnYWRnZXQgdXNhYmxlLiAgU2VsZWN0aW5nIG1vcmUgdGhhbiBvbmUKKwkgIGNvbmZpZ3VyYXRpb24gd2lsbCBwcmV2ZW50IFdpbmRvd3MgZnJvbSBhdXRvbWF0aWNhbGx5IGRldGVjdGluZworCSAgdGhlIGdhZGdldCBhcyBhIGNvbXBvc2l0ZSBnYWRnZXQsIHNvIGFuIElORiBmaWxlIHdpbGwgYmUgbmVlZGVkIHRvCisJICB1c2UgdGhlIGdhZGdldC4KKworCSAgU2F5ICJ5IiB0byBsaW5rIHRoZSBkcml2ZXIgc3RhdGljYWxseSwgb3IgIm0iIHRvIGJ1aWxkIGEKKwkgIGR5bmFtaWNhbGx5IGxpbmtlZCBtb2R1bGUgY2FsbGVkICJnX211bHRpIi4KKworY29uZmlnIFVTQl9HX01VTFRJX1JORElTCisJYm9vbCAiUk5ESVMgKyBDREMgU2VyaWFsICsgU3RvcmFnZSBjb25maWd1cmF0aW9uIgorCWRlcGVuZHMgb24gVVNCX0dfTVVMVEkKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGEgY29uZmlndXJhdGlvbiB3aXRoIFJORElTLCBDREMgU2VyaWFsIGFuZAorCSAgTWFzcyBTdG9yYWdlIGZ1bmN0aW9ucyBhdmFpbGFibGUgaW4gdGhlIE11bHRpZnVuY3Rpb24gQ29tcG9zaXRlCisJICBHYWRnZXQuICBUaGlzIGlzIHRoZSBjb25maWd1cmF0aW9uIGRlZGljYXRlZCBmb3IgV2luZG93cyBzaW5jZSBSTkRJUworCSAgaXMgTWljcm9zb2Z0J3MgcHJvdG9jb2wuCisKKwkgIElmIHVuc3VyZSwgc2F5ICJ5Ii4KKworY29uZmlnIFVTQl9HX01VTFRJX0NEQworCWJvb2wgIkNEQyBFdGhlcm5ldCArIENEQyBTZXJpYWwgKyBTdG9yYWdlIGNvbmZpZ3VyYXRpb24iCisJZGVwZW5kcyBvbiBVU0JfR19NVUxUSQorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgYSBjb25maWd1cmF0aW9uIHdpdGggQ0RDIEV0aGVybmV0IChFQ00pLCBDREMKKwkgIFNlcmlhbCBhbmQgTWFzcyBTdG9yYWdlIGZ1bmN0aW9ucyBhdmFpbGFibGUgaW4gdGhlIE11bHRpZnVuY3Rpb24KKwkgIENvbXBvc2l0ZSBHYWRnZXQuCisKKwkgIElmIHVuc3VyZSwgc2F5ICJ5Ii4KKworCiAjIHB1dCBkcml2ZXJzIHRoYXQgbmVlZCBpc29jaHJvbm91cyB0cmFuc2ZlciBzdXBwb3J0IChmb3IgYXVkaW8KICMgb3IgdmlkZW8gY2xhc3MgZ2FkZ2V0IGRyaXZlcnMpLCBvciBzcGVjaWZpYyBoYXJkd2FyZSwgaGVyZS4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L01ha2VmaWxlIGIvZHJpdmVycy91c2IvZ2FkZ2V0L01ha2VmaWxlCmluZGV4IDlkN2I4N2MuLjJlMmMwNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvTWFrZWZpbGUKQEAgLTM5LDE2ICszOSwyMCBAQAogZ19taWRpLW9ianMJCQk6PSBnbWlkaS5vCiBnYWRnZXRmcy1vYmpzCQkJOj0gaW5vZGUubwogZ19maWxlX3N0b3JhZ2Utb2JqcwkJOj0gZmlsZV9zdG9yYWdlLm8KK2dfbWFzc19zdG9yYWdlLW9ianMJCTo9IG1hc3Nfc3RvcmFnZS5vCiBnX3ByaW50ZXItb2JqcwkJCTo9IHByaW50ZXIubwogZ19jZGMtb2JqcwkJCTo9IGNkYzIubworZ19tdWx0aS1vYmpzCQkJOj0gbXVsdGkubwogCiBvYmotJChDT05GSUdfVVNCX1pFUk8pCQkrPSBnX3plcm8ubwogb2JqLSQoQ09ORklHX1VTQl9BVURJTykJCSs9IGdfYXVkaW8ubwogb2JqLSQoQ09ORklHX1VTQl9FVEgpCQkrPSBnX2V0aGVyLm8KIG9iai0kKENPTkZJR19VU0JfR0FER0VURlMpCSs9IGdhZGdldGZzLm8KIG9iai0kKENPTkZJR19VU0JfRklMRV9TVE9SQUdFKQkrPSBnX2ZpbGVfc3RvcmFnZS5vCitvYmotJChDT05GSUdfVVNCX01BU1NfU1RPUkFHRSkJKz0gZ19tYXNzX3N0b3JhZ2Uubwogb2JqLSQoQ09ORklHX1VTQl9HX1NFUklBTCkJKz0gZ19zZXJpYWwubwogb2JqLSQoQ09ORklHX1VTQl9HX1BSSU5URVIpCSs9IGdfcHJpbnRlci5vCiBvYmotJChDT05GSUdfVVNCX01JRElfR0FER0VUKQkrPSBnX21pZGkubwogb2JqLSQoQ09ORklHX1VTQl9DRENfQ09NUE9TSVRFKSArPSBnX2NkYy5vCitvYmotJChDT05GSUdfVVNCX0dfTVVMVEkpCSs9IGdfbXVsdGkubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCmluZGV4IDY2NDUwYTEuLjA0M2UwNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCkBAIC04OTIsNyArODkyLDcgQEAKIAogCQkJdHh2YyB8PSBBVDkxX1VEUF9UWFZDX1BVT047CiAJCQlhdDkxX3VkcF93cml0ZSh1ZGMsIEFUOTFfVURQX1RYVkMsIHR4dmMpOwotCQl9IGVsc2UgaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpKSB7CisJCX0gZWxzZSBpZiAoY3B1X2lzX2F0OTFzYW05MjYxKCkgfHwgY3B1X2lzX2F0OTFzYW05ZzEwKCkpIHsKIAkJCXUzMgl1c2JwdWNyOwogCiAJCQl1c2JwdWNyID0gYXQ5MV9zeXNfcmVhZChBVDkxX01BVFJJWF9VU0JQVUNSKTsKQEAgLTkxMCw3ICs5MTAsNyBAQAogCiAJCQl0eHZjICY9IH5BVDkxX1VEUF9UWFZDX1BVT047CiAJCQlhdDkxX3VkcF93cml0ZSh1ZGMsIEFUOTFfVURQX1RYVkMsIHR4dmMpOwotCQl9IGVsc2UgaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpKSB7CisJCX0gZWxzZSBpZiAoY3B1X2lzX2F0OTFzYW05MjYxKCkgfHwgY3B1X2lzX2F0OTFzYW05ZzEwKCkpIHsKIAkJCXUzMgl1c2JwdWNyOwogCiAJCQl1c2JwdWNyID0gYXQ5MV9zeXNfcmVhZChBVDkxX01BVFJJWF9VU0JQVUNSKTsKQEAgLTE2OTIsNyArMTY5Miw3IEBACiAJCXVkYy0+ZXBbM10ubWF4cGFja2V0ID0gNjQ7CiAJCXVkYy0+ZXBbNF0ubWF4cGFja2V0ID0gNTEyOwogCQl1ZGMtPmVwWzVdLm1heHBhY2tldCA9IDUxMjsKLQl9IGVsc2UgaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpKSB7CisJfSBlbHNlIGlmIChjcHVfaXNfYXQ5MXNhbTkyNjEoKSB8fCBjcHVfaXNfYXQ5MXNhbTlnMTAoKSkgewogCQl1ZGMtPmVwWzNdLm1heHBhY2tldCA9IDY0OwogCX0gZWxzZSBpZiAoY3B1X2lzX2F0OTFzYW05MjYzKCkpIHsKIAkJdWRjLT5lcFswXS5tYXhwYWNrZXQgPSA2NDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdWRpby5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F1ZGlvLmMKaW5kZXggYTNhMGY0YS4uNThmMjIwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F1ZGlvLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F1ZGlvLmMKQEAgLTg5LDEyMCArODksNiBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0vKioKLSAqIEhhbmRsZSBVU0IgYXVkaW8gZW5kcG9pbnQgc2V0L2dldCBjb21tYW5kIGluIHNldHVwIGNsYXNzIHJlcXVlc3QKLSAqLwotCi1zdGF0aWMgaW50IGF1ZGlvX3NldF9lbmRwb2ludF9yZXEoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uICpjLAotCQljb25zdCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdHJsKQotewotCXN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldiA9IGMtPmNkZXY7Ci0JaW50CQkJdmFsdWUgPSAtRU9QTk9UU1VQUDsKLQl1MTYJCQllcCA9IGxlMTZfdG9fY3B1KGN0cmwtPndJbmRleCk7Ci0JdTE2CQkJbGVuID0gbGUxNl90b19jcHUoY3RybC0+d0xlbmd0aCk7Ci0JdTE2CQkJd192YWx1ZSA9IGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSk7Ci0KLQlEQkcoY2RldiwgImJSZXF1ZXN0IDB4JXgsIHdfdmFsdWUgMHglMDR4LCBsZW4gJWQsIGVuZHBvaW50ICVkXG4iLAotCQkJY3RybC0+YlJlcXVlc3QsIHdfdmFsdWUsIGxlbiwgZXApOwotCi0Jc3dpdGNoIChjdHJsLT5iUmVxdWVzdCkgewotCWNhc2UgVUFDX1NFVF9DVVI6Ci0JCXZhbHVlID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIFVBQ19TRVRfTUlOOgotCQlicmVhazsKLQotCWNhc2UgVUFDX1NFVF9NQVg6Ci0JCWJyZWFrOwotCi0JY2FzZSBVQUNfU0VUX1JFUzoKLQkJYnJlYWs7Ci0KLQljYXNlIFVBQ19TRVRfTUVNOgotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIGludCBhdWRpb19nZXRfZW5kcG9pbnRfcmVxKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbiAqYywKLQkJY29uc3Qgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3RybCkKLXsKLQlzdHJ1Y3QgdXNiX2NvbXBvc2l0ZV9kZXYgKmNkZXYgPSBjLT5jZGV2OwotCWludCB2YWx1ZSA9IC1FT1BOT1RTVVBQOwotCXU4IGVwID0gKChsZTE2X3RvX2NwdShjdHJsLT53SW5kZXgpID4+IDgpICYgMHhGRik7Ci0JdTE2IGxlbiA9IGxlMTZfdG9fY3B1KGN0cmwtPndMZW5ndGgpOwotCXUxNiB3X3ZhbHVlID0gbGUxNl90b19jcHUoY3RybC0+d1ZhbHVlKTsKLQotCURCRyhjZGV2LCAiYlJlcXVlc3QgMHgleCwgd192YWx1ZSAweCUwNHgsIGxlbiAlZCwgZW5kcG9pbnQgJWRcbiIsCi0JCQljdHJsLT5iUmVxdWVzdCwgd192YWx1ZSwgbGVuLCBlcCk7Ci0KLQlzd2l0Y2ggKGN0cmwtPmJSZXF1ZXN0KSB7Ci0JY2FzZSBVQUNfR0VUX0NVUjoKLQljYXNlIFVBQ19HRVRfTUlOOgotCWNhc2UgVUFDX0dFVF9NQVg6Ci0JY2FzZSBVQUNfR0VUX1JFUzoKLQkJdmFsdWUgPSAzOwotCQlicmVhazsKLQljYXNlIFVBQ19HRVRfTUVNOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyBpbnQKLWF1ZGlvX3NldHVwKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbiAqYywgY29uc3Qgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3RybCkKLXsKLQlzdHJ1Y3QgdXNiX2NvbXBvc2l0ZV9kZXYgKmNkZXYgPSBjLT5jZGV2OwotCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxID0gY2Rldi0+cmVxOwotCWludCB2YWx1ZSA9IC1FT1BOT1RTVVBQOwotCXUxNiB3X2luZGV4ID0gbGUxNl90b19jcHUoY3RybC0+d0luZGV4KTsKLQl1MTYgd192YWx1ZSA9IGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSk7Ci0JdTE2IHdfbGVuZ3RoID0gbGUxNl90b19jcHUoY3RybC0+d0xlbmd0aCk7Ci0KLQkvKiBjb21wb3NpdGUgZHJpdmVyIGluZnJhc3RydWN0dXJlIGhhbmRsZXMgZXZlcnl0aGluZyBleGNlcHQKLQkgKiBBdWRpbyBjbGFzcyBtZXNzYWdlczsgaW50ZXJmYWNlIGFjdGl2YXRpb24gdXNlcyBzZXRfYWx0KCkuCi0JICovCi0Jc3dpdGNoIChjdHJsLT5iUmVxdWVzdFR5cGUpIHsKLQljYXNlIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfRU5EUE9JTlQ6Ci0JCXZhbHVlID0gYXVkaW9fc2V0X2VuZHBvaW50X3JlcShjLCBjdHJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9FTkRQT0lOVDoKLQkJdmFsdWUgPSBhdWRpb19nZXRfZW5kcG9pbnRfcmVxKGMsIGN0cmwpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCUVSUk9SKGNkZXYsICJJbnZhbGlkIGNvbnRyb2wgcmVxJTAyeC4lMDJ4IHYlMDR4IGklMDR4IGwlZFxuIiwKLQkJCWN0cmwtPmJSZXF1ZXN0VHlwZSwgY3RybC0+YlJlcXVlc3QsCi0JCQl3X3ZhbHVlLCB3X2luZGV4LCB3X2xlbmd0aCk7Ci0JfQotCi0JLyogcmVzcG9uZCB3aXRoIGRhdGEgdHJhbnNmZXIgb3Igc3RhdHVzIHBoYXNlPyAqLwotCWlmICh2YWx1ZSA+PSAwKSB7Ci0JCURCRyhjZGV2LCAiQXVkaW8gcmVxJTAyeC4lMDJ4IHYlMDR4IGklMDR4IGwlZFxuIiwKLQkJCWN0cmwtPmJSZXF1ZXN0VHlwZSwgY3RybC0+YlJlcXVlc3QsCi0JCQl3X3ZhbHVlLCB3X2luZGV4LCB3X2xlbmd0aCk7Ci0JCXJlcS0+emVybyA9IDA7Ci0JCXJlcS0+bGVuZ3RoID0gdmFsdWU7Ci0JCXZhbHVlID0gdXNiX2VwX3F1ZXVlKGNkZXYtPmdhZGdldC0+ZXAwLCByZXEsIEdGUF9BVE9NSUMpOwotCQlpZiAodmFsdWUgPCAwKQotCQkJRVJST1IoY2RldiwgIkF1ZGlvIHJlc3BvbnNlIG9uIGVyciAlZFxuIiwgdmFsdWUpOwotCX0KLQotCS8qIGRldmljZSBlaXRoZXIgc3RhbGxzICh2YWx1ZSA8IDApIG9yIHJlcG9ydHMgc3VjY2VzcyAqLwotCXJldHVybiB2YWx1ZTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQogc3RhdGljIGludCBfX2luaXQgYXVkaW9fZG9fY29uZmlnKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbiAqYykKIHsKIAkvKiBGSVhNRSBhbGxvYyBpQ29uZmlndXJhdGlvbiBzdHJpbmcsIHNldCBpdCBpbiBjLT5zdHJpbmdzICovCkBAIC0yMjAsNyArMTA2LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb24gYXVkaW9fY29uZmlnX2RyaXZlciA9IHsKIAkubGFiZWwJCQk9IERSSVZFUl9ERVNDLAogCS5iaW5kCQkJPSBhdWRpb19kb19jb25maWcsCi0JLnNldHVwCQkJPSBhdWRpb19zZXR1cCwKIAkuYkNvbmZpZ3VyYXRpb25WYWx1ZQk9IDEsCiAJLyogLmlDb25maWd1cmF0aW9uID0gRFlOQU1JQyAqLwogCS5ibUF0dHJpYnV0ZXMJCT0gVVNCX0NPTkZJR19BVFRfU0VMRlBPV0VSLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jCmluZGV4IGQwNTM5N2UuLjA5Mjg5YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9jb21wb3NpdGUuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvY29tcG9zaXRlLmMKQEAgLTM3Myw2ICszNzMsOCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZiwgJmNkZXYtPmNvbmZpZy0+ZnVuY3Rpb25zLCBsaXN0KSB7CiAJCWlmIChmLT5kaXNhYmxlKQogCQkJZi0+ZGlzYWJsZShmKTsKKworCQliaXRtYXBfemVybyhmLT5lbmRwb2ludHMsIDMyKTsKIAl9CiAJY2Rldi0+Y29uZmlnID0gTlVMTDsKIH0KQEAgLTQxOCwxMCArNDIwLDM1IEBACiAJLyogSW5pdGlhbGl6ZSBhbGwgaW50ZXJmYWNlcyBieSBzZXR0aW5nIHRoZW0gdG8gYWx0c2V0dGluZyB6ZXJvLiAqLwogCWZvciAodG1wID0gMDsgdG1wIDwgTUFYX0NPTkZJR19JTlRFUkZBQ0VTOyB0bXArKykgewogCQlzdHJ1Y3QgdXNiX2Z1bmN0aW9uCSpmID0gYy0+aW50ZXJmYWNlW3RtcF07CisJCXN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKipkZXNjcmlwdG9yczsKIAogCQlpZiAoIWYpCiAJCQlicmVhazsKIAorCQkvKgorCQkgKiBSZWNvcmQgd2hpY2ggZW5kcG9pbnRzIGFyZSB1c2VkIGJ5IHRoZSBmdW5jdGlvbi4gVGhpcyBpcyB1c2VkCisJCSAqIHRvIGRpc3BhdGNoIGNvbnRyb2wgcmVxdWVzdHMgdGFyZ2V0ZWQgYXQgdGhhdCBlbmRwb2ludCB0byB0aGUKKwkJICogZnVuY3Rpb24ncyBzZXR1cCBjYWxsYmFjayBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50CisJCSAqIGNvbmZpZ3VyYXRpb24ncyBzZXR1cCBjYWxsYmFjay4KKwkJICovCisJCWlmIChnYWRnZXQtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQorCQkJZGVzY3JpcHRvcnMgPSBmLT5oc19kZXNjcmlwdG9yczsKKwkJZWxzZQorCQkJZGVzY3JpcHRvcnMgPSBmLT5kZXNjcmlwdG9yczsKKworCQlmb3IgKDsgKmRlc2NyaXB0b3JzOyArK2Rlc2NyaXB0b3JzKSB7CisJCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwOworCQkJaW50IGFkZHI7CisKKwkJCWlmICgoKmRlc2NyaXB0b3JzKS0+YkRlc2NyaXB0b3JUeXBlICE9IFVTQl9EVF9FTkRQT0lOVCkKKwkJCQljb250aW51ZTsKKworCQkJZXAgPSAoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICopKmRlc2NyaXB0b3JzOworCQkJYWRkciA9ICgoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiAweDgwKSA+PiAzKQorCQkJICAgICB8ICAoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiAweDBmKTsKKwkJCXNldF9iaXQoYWRkciwgZi0+ZW5kcG9pbnRzKTsKKwkJfQorCiAJCXJlc3VsdCA9IGYtPnNldF9hbHQoZiwgdG1wLCAwKTsKIAkJaWYgKHJlc3VsdCA8IDApIHsKIAkJCURCRyhjZGV2LCAiaW50ZXJmYWNlICVkICglcy8lcCkgYWx0IDAgLS0+ICVkXG4iLApAQCAtNjg4LDYgKzcxNSw3IEBACiAJdTE2CQkJCXdfdmFsdWUgPSBsZTE2X3RvX2NwdShjdHJsLT53VmFsdWUpOwogCXUxNgkJCQl3X2xlbmd0aCA9IGxlMTZfdG9fY3B1KGN0cmwtPndMZW5ndGgpOwogCXN0cnVjdCB1c2JfZnVuY3Rpb24JCSpmID0gTlVMTDsKKwl1OAkJCQllbmRwOwogCiAJLyogcGFydGlhbCByZS1pbml0IG9mIHRoZSByZXNwb25zZSBtZXNzYWdlOyB0aGUgZnVuY3Rpb24gb3IgdGhlCiAJICogZ2FkZ2V0IG1pZ2h0IG5lZWQgdG8gaW50ZXJjZXB0IGUuZy4gYSBjb250cm9sLU9VVCBjb21wbGV0aW9uCkBAIC04MDAsMjMgKzgyOCwzMyBAQAogCQkJY3RybC0+YlJlcXVlc3RUeXBlLCBjdHJsLT5iUmVxdWVzdCwKIAkJCXdfdmFsdWUsIHdfaW5kZXgsIHdfbGVuZ3RoKTsKIAotCQkvKiBmdW5jdGlvbnMgYWx3YXlzIGhhbmRsZSB0aGVpciBpbnRlcmZhY2VzIC4uLiBwdW50IG90aGVyCi0JCSAqIHJlY2lwaWVudHMgKGVuZHBvaW50LCBvdGhlciwgV1VTQiwgLi4uKSB0byB0aGUgY3VycmVudAorCQkvKiBmdW5jdGlvbnMgYWx3YXlzIGhhbmRsZSB0aGVpciBpbnRlcmZhY2VzIGFuZCBlbmRwb2ludHMuLi4KKwkJICogcHVudCBvdGhlciByZWNpcGllbnRzIChvdGhlciwgV1VTQiwgLi4uKSB0byB0aGUgY3VycmVudAogCQkgKiBjb25maWd1cmF0aW9uIGNvZGUuCiAJCSAqCiAJCSAqIFJFVklTSVQgaXQgY291bGQgbWFrZSBzZW5zZSB0byBsZXQgdGhlIGNvbXBvc2l0ZSBkZXZpY2UKIAkJICogdGFrZSBzdWNoIHJlcXVlc3RzIHRvbywgaWYgdGhhdCdzIGV2ZXIgbmVlZGVkOiAgdG8gd29yawogCQkgKiBpbiBjb25maWcgMCwgZXRjLgogCQkgKi8KLQkJaWYgKChjdHJsLT5iUmVxdWVzdFR5cGUgJiBVU0JfUkVDSVBfTUFTSykKLQkJCQk9PSBVU0JfUkVDSVBfSU5URVJGQUNFKSB7CisJCXN3aXRjaCAoY3RybC0+YlJlcXVlc3RUeXBlICYgVVNCX1JFQ0lQX01BU0spIHsKKwkJY2FzZSBVU0JfUkVDSVBfSU5URVJGQUNFOgogCQkJZiA9IGNkZXYtPmNvbmZpZy0+aW50ZXJmYWNlW2ludGZdOwotCQkJaWYgKGYgJiYgZi0+c2V0dXApCi0JCQkJdmFsdWUgPSBmLT5zZXR1cChmLCBjdHJsKTsKLQkJCWVsc2UKKwkJCWJyZWFrOworCisJCWNhc2UgVVNCX1JFQ0lQX0VORFBPSU5UOgorCQkJZW5kcCA9ICgod19pbmRleCAmIDB4ODApID4+IDMpIHwgKHdfaW5kZXggJiAweDBmKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZiwgJmNkZXYtPmNvbmZpZy0+ZnVuY3Rpb25zLCBsaXN0KSB7CisJCQkJaWYgKHRlc3RfYml0KGVuZHAsIGYtPmVuZHBvaW50cykpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCZmLT5saXN0ID09ICZjZGV2LT5jb25maWctPmZ1bmN0aW9ucykKIAkJCQlmID0gTlVMTDsKKwkJCWJyZWFrOwogCQl9Ci0JCWlmICh2YWx1ZSA8IDAgJiYgIWYpIHsKKworCQlpZiAoZiAmJiBmLT5zZXR1cCkKKwkJCXZhbHVlID0gZi0+c2V0dXAoZiwgY3RybCk7CisJCWVsc2UgewogCQkJc3RydWN0IHVzYl9jb25maWd1cmF0aW9uCSpjOwogCiAJCQljID0gY2Rldi0+Y29uZmlnOwpAQCAtMTA1NCw3ICsxMDkyLDggQEAKIAkuc3BlZWQJCT0gVVNCX1NQRUVEX0hJR0gsCiAKIAkuYmluZAkJPSBjb21wb3NpdGVfYmluZCwKLQkudW5iaW5kCQk9IF9fZXhpdF9wKGNvbXBvc2l0ZV91bmJpbmQpLAorCS8qIC51bmJpbmQJCT0gX19leGl0X3AoY29tcG9zaXRlX3VuYmluZCksICovCisJLnVuYmluZAkJPSBjb21wb3NpdGVfdW5iaW5kLAogCiAJLnNldHVwCQk9IGNvbXBvc2l0ZV9zZXR1cCwKIAkuZGlzY29ubmVjdAk9IGNvbXBvc2l0ZV9kaXNjb25uZWN0LApAQCAtMTEwMyw3ICsxMTQyLDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB1bnJlZ2lzdGVyIGRyaXZlcnMgdXNpbmcgdGhlIGNvbXBvc2l0ZQogICogZHJpdmVyIGZyYW1ld29yay4KICAqLwotdm9pZCBfX2V4aXQgdXNiX2NvbXBvc2l0ZV91bnJlZ2lzdGVyKHN0cnVjdCB1c2JfY29tcG9zaXRlX2RyaXZlciAqZHJpdmVyKQordm9pZCAvKiBfX2V4aXQgKi8gdXNiX2NvbXBvc2l0ZV91bnJlZ2lzdGVyKHN0cnVjdCB1c2JfY29tcG9zaXRlX2RyaXZlciAqZHJpdmVyKQogewogCWlmIChjb21wb3NpdGUgIT0gZHJpdmVyKQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCmluZGV4IDE2N2NiMmEuLjE0MTM3MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCkBAIC0yNSw2ICsyNSwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KIAorCisjaWYgZGVmaW5lZCBVU0JfRVRIX1JORElTCisjICB1bmRlZiBVU0JfRVRIX1JORElTCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVVNCX0VUSF9STkRJUworIyAgZGVmaW5lIFVTQl9FVEhfUk5ESVMgeQorI2VuZGlmCisKICNpbmNsdWRlICJ1X2V0aGVyLmgiCiAKIApAQCAtNjYsNyArNzQsNyBAQAogI2RlZmluZSBEUklWRVJfREVTQwkJIkV0aGVybmV0IEdhZGdldCIKICNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCSJNZW1vcmlhbCBEYXkgMjAwOCIKIAotI2lmZGVmIENPTkZJR19VU0JfRVRIX1JORElTCisjaWZkZWYgVVNCX0VUSF9STkRJUwogI2RlZmluZSBQUkVGSVgJCQkiUk5ESVMvIgogI2Vsc2UKICNkZWZpbmUgUFJFRklYCQkJIiIKQEAgLTg3LDcgKzk1LDcgQEAKIAogc3RhdGljIGlubGluZSBib29sIGhhc19ybmRpcyh2b2lkKQogewotI2lmZGVmCUNPTkZJR19VU0JfRVRIX1JORElTCisjaWZkZWYJVVNCX0VUSF9STkRJUwogCXJldHVybiB0cnVlOwogI2Vsc2UKIAlyZXR1cm4gZmFsc2U7CkBAIC0xMTAsNyArMTE4LDcgQEAKIAogI2luY2x1ZGUgImZfZWNtLmMiCiAjaW5jbHVkZSAiZl9zdWJzZXQuYyIKLSNpZmRlZglDT05GSUdfVVNCX0VUSF9STkRJUworI2lmZGVmCVVTQl9FVEhfUk5ESVMKICNpbmNsdWRlICJmX3JuZGlzLmMiCiAjaW5jbHVkZSAicm5kaXMuYyIKICNlbmRpZgpAQCAtMjUxLDcgKzI1OSw3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNpZmRlZiBDT05GSUdfVVNCX0VUSF9FRU0KKyNpZmRlZiBVU0JfRVRIX0VFTQogc3RhdGljIGludCB1c2VfZWVtID0gMTsKICNlbHNlCiBzdGF0aWMgaW50IHVzZV9lZW07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9hY20uYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX2FjbS5jCmluZGV4IDRlMzY1NzguLmQxMDM1M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX2FjbS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX2FjbS5jCkBAIC00LDYgKzQsOCBAQAogICogQ29weXJpZ2h0IChDKSAyMDAzIEFsIEJvcmNoZXJzIChhbGJvcmNoZXJzQHN0ZWluZXJwb2ludC5jb20pCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgRGF2aWQgQnJvd25lbGwKICAqIENvcHlyaWdodCAoQykgMjAwOCBieSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA5IGJ5IFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqIEF1dGhvcjogTWljaGFsIE5hemFyZXdpY3ogKG0ubmF6YXJld2ljekBzYW1zdW5nLmNvbSkKICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwKICAqIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCkBAIC05OSw2ICsxMDEsMjAgQEAKIAogLyogaW50ZXJmYWNlIGFuZCBjbGFzcyBkZXNjcmlwdG9yczogKi8KIAorc3RhdGljIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Fzc29jX2Rlc2NyaXB0b3IKK2FjbV9pYWRfZGVzY3JpcHRvciA9IHsKKwkuYkxlbmd0aCA9CQlzaXplb2YgYWNtX2lhZF9kZXNjcmlwdG9yLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfSU5URVJGQUNFX0FTU09DSUFUSU9OLAorCisJLyogLmJGaXJzdEludGVyZmFjZSA9CURZTkFNSUMsICovCisJLmJJbnRlcmZhY2VDb3VudCA9IAkyLAkvLyBjb250cm9sICsgZGF0YQorCS5iRnVuY3Rpb25DbGFzcyA9CVVTQl9DTEFTU19DT01NLAorCS5iRnVuY3Rpb25TdWJDbGFzcyA9CVVTQl9DRENfU1VCQ0xBU1NfQUNNLAorCS5iRnVuY3Rpb25Qcm90b2NvbCA9CVVTQl9DRENfUFJPVE9fTk9ORSwKKwkvKiAuaUZ1bmN0aW9uID0JCURZTkFNSUMgKi8KK307CisKKwogc3RhdGljIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgYWNtX2NvbnRyb2xfaW50ZXJmYWNlX2Rlc2MgX19pbml0ZGF0YSA9IHsKIAkuYkxlbmd0aCA9CQlVU0JfRFRfSU5URVJGQUNFX1NJWkUsCiAJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9JTlRFUkZBQ0UsCkBAIC0xNzgsNiArMTk0LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICphY21fZnNfZnVuY3Rpb25bXSBfX2luaXRkYXRhID0geworCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZhY21faWFkX2Rlc2NyaXB0b3IsCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmFjbV9jb250cm9sX2ludGVyZmFjZV9kZXNjLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZhY21faGVhZGVyX2Rlc2MsCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmFjbV9jYWxsX21nbXRfZGVzY3JpcHRvciwKQEAgLTIxNiw2ICsyMzMsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKmFjbV9oc19mdW5jdGlvbltdIF9faW5pdGRhdGEgPSB7CisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmFjbV9pYWRfZGVzY3JpcHRvciwKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmYWNtX2NvbnRyb2xfaW50ZXJmYWNlX2Rlc2MsCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmFjbV9oZWFkZXJfZGVzYywKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmYWNtX2NhbGxfbWdtdF9kZXNjcmlwdG9yLApAQCAtMjMyLDExICsyNTAsMTMgQEAKIAogI2RlZmluZSBBQ01fQ1RSTF9JRFgJMAogI2RlZmluZSBBQ01fREFUQV9JRFgJMQorI2RlZmluZSBBQ01fSUFEX0lEWAkyCiAKIC8qIHN0YXRpYyBzdHJpbmdzLCBpbiBVVEYtOCAqLwogc3RhdGljIHN0cnVjdCB1c2Jfc3RyaW5nIGFjbV9zdHJpbmdfZGVmc1tdID0gewogCVtBQ01fQ1RSTF9JRFhdLnMgPSAiQ0RDIEFic3RyYWN0IENvbnRyb2wgTW9kZWwgKEFDTSkiLAogCVtBQ01fREFUQV9JRFhdLnMgPSAiQ0RDIEFDTSBEYXRhIiwKKwlbQUNNX0lBRF9JRFggXS5zID0gIkNEQyBTZXJpYWwiLAogCXsgIC8qIFpFUk9FUyBFTkQgTElTVCAqLyB9LAogfTsKIApAQCAtNTYzLDYgKzU4Myw3IEBACiAJaWYgKHN0YXR1cyA8IDApCiAJCWdvdG8gZmFpbDsKIAlhY20tPmN0cmxfaWQgPSBzdGF0dXM7CisJYWNtX2lhZF9kZXNjcmlwdG9yLmJGaXJzdEludGVyZmFjZSA9IHN0YXR1czsKIAogCWFjbV9jb250cm9sX2ludGVyZmFjZV9kZXNjLmJJbnRlcmZhY2VOdW1iZXIgPSBzdGF0dXM7CiAJYWNtX3VuaW9uX2Rlc2MgLmJNYXN0ZXJJbnRlcmZhY2UwID0gc3RhdHVzOwpAQCAtNzMyLDYgKzc1MywxMyBAQAogCQlhY21fc3RyaW5nX2RlZnNbQUNNX0RBVEFfSURYXS5pZCA9IHN0YXR1czsKIAogCQlhY21fZGF0YV9pbnRlcmZhY2VfZGVzYy5pSW50ZXJmYWNlID0gc3RhdHVzOworCisJCXN0YXR1cyA9IHVzYl9zdHJpbmdfaWQoYy0+Y2Rldik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJYWNtX3N0cmluZ19kZWZzW0FDTV9JQURfSURYXS5pZCA9IHN0YXR1czsKKworCQlhY21faWFkX2Rlc2NyaXB0b3IuaUZ1bmN0aW9uID0gc3RhdHVzOwogCX0KIAogCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIG9uZSBuZXcgaW5zdGFuY2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX2F1ZGlvLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9hdWRpby5jCmluZGV4IDk4ZTliYjkuLmM0M2M4OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX2F1ZGlvLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfYXVkaW8uYwpAQCAtNDQ1LDYgKzQ0NSw3MCBAQAogCXJldHVybiBsZW47CiB9CiAKK3N0YXRpYyBpbnQgYXVkaW9fc2V0X2VuZHBvaW50X3JlcShzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmLAorCQljb25zdCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdHJsKQoreworCXN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldiA9IGYtPmNvbmZpZy0+Y2RldjsKKwlpbnQJCQl2YWx1ZSA9IC1FT1BOT1RTVVBQOworCXUxNgkJCWVwID0gbGUxNl90b19jcHUoY3RybC0+d0luZGV4KTsKKwl1MTYJCQlsZW4gPSBsZTE2X3RvX2NwdShjdHJsLT53TGVuZ3RoKTsKKwl1MTYJCQl3X3ZhbHVlID0gbGUxNl90b19jcHUoY3RybC0+d1ZhbHVlKTsKKworCURCRyhjZGV2LCAiYlJlcXVlc3QgMHgleCwgd192YWx1ZSAweCUwNHgsIGxlbiAlZCwgZW5kcG9pbnQgJWRcbiIsCisJCQljdHJsLT5iUmVxdWVzdCwgd192YWx1ZSwgbGVuLCBlcCk7CisKKwlzd2l0Y2ggKGN0cmwtPmJSZXF1ZXN0KSB7CisJY2FzZSBVQUNfU0VUX0NVUjoKKwkJdmFsdWUgPSAwOworCQlicmVhazsKKworCWNhc2UgVUFDX1NFVF9NSU46CisJCWJyZWFrOworCisJY2FzZSBVQUNfU0VUX01BWDoKKwkJYnJlYWs7CisKKwljYXNlIFVBQ19TRVRfUkVTOgorCQlicmVhazsKKworCWNhc2UgVUFDX1NFVF9NRU06CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgaW50IGF1ZGlvX2dldF9lbmRwb2ludF9yZXEoc3RydWN0IHVzYl9mdW5jdGlvbiAqZiwKKwkJY29uc3Qgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3RybCkKK3sKKwlzdHJ1Y3QgdXNiX2NvbXBvc2l0ZV9kZXYgKmNkZXYgPSBmLT5jb25maWctPmNkZXY7CisJaW50IHZhbHVlID0gLUVPUE5PVFNVUFA7CisJdTggZXAgPSAoKGxlMTZfdG9fY3B1KGN0cmwtPndJbmRleCkgPj4gOCkgJiAweEZGKTsKKwl1MTYgbGVuID0gbGUxNl90b19jcHUoY3RybC0+d0xlbmd0aCk7CisJdTE2IHdfdmFsdWUgPSBsZTE2X3RvX2NwdShjdHJsLT53VmFsdWUpOworCisJREJHKGNkZXYsICJiUmVxdWVzdCAweCV4LCB3X3ZhbHVlIDB4JTA0eCwgbGVuICVkLCBlbmRwb2ludCAlZFxuIiwKKwkJCWN0cmwtPmJSZXF1ZXN0LCB3X3ZhbHVlLCBsZW4sIGVwKTsKKworCXN3aXRjaCAoY3RybC0+YlJlcXVlc3QpIHsKKwljYXNlIFVBQ19HRVRfQ1VSOgorCWNhc2UgVUFDX0dFVF9NSU46CisJY2FzZSBVQUNfR0VUX01BWDoKKwljYXNlIFVBQ19HRVRfUkVTOgorCQl2YWx1ZSA9IDM7CisJCWJyZWFrOworCWNhc2UgVUFDX0dFVF9NRU06CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiB2YWx1ZTsKK30KKwogc3RhdGljIGludAogZl9hdWRpb19zZXR1cChzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmLCBjb25zdCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdHJsKQogewpAQCAtNDU1LDggKzUxOSw4IEBACiAJdTE2CQkJd192YWx1ZSA9IGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSk7CiAJdTE2CQkJd19sZW5ndGggPSBsZTE2X3RvX2NwdShjdHJsLT53TGVuZ3RoKTsKIAotCS8qIGNvbXBvc2l0ZSBkcml2ZXIgaW5mcmFzdHJ1Y3R1cmUgaGFuZGxlcyBldmVyeXRoaW5nIGV4Y2VwdAotCSAqIEF1ZGlvIGNsYXNzIG1lc3NhZ2VzOyBpbnRlcmZhY2UgYWN0aXZhdGlvbiB1c2VzIHNldF9hbHQoKS4KKwkvKiBjb21wb3NpdGUgZHJpdmVyIGluZnJhc3RydWN0dXJlIGhhbmRsZXMgZXZlcnl0aGluZzsgaW50ZXJmYWNlCisJICogYWN0aXZhdGlvbiB1c2VzIHNldF9hbHQoKS4KIAkgKi8KIAlzd2l0Y2ggKGN0cmwtPmJSZXF1ZXN0VHlwZSkgewogCWNhc2UgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0U6CkBAIC00NjcsNiArNTMxLDE0IEBACiAJCXZhbHVlID0gYXVkaW9fZ2V0X2ludGZfcmVxKGYsIGN0cmwpOwogCQlicmVhazsKIAorCWNhc2UgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9FTkRQT0lOVDoKKwkJdmFsdWUgPSBhdWRpb19zZXRfZW5kcG9pbnRfcmVxKGYsIGN0cmwpOworCQlicmVhazsKKworCWNhc2UgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0VORFBPSU5UOgorCQl2YWx1ZSA9IGF1ZGlvX2dldF9lbmRwb2ludF9yZXEoZiwgY3RybCk7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJRVJST1IoY2RldiwgImludmFsaWQgY29udHJvbCByZXElMDJ4LiUwMnggdiUwNHggaSUwNHggbCVkXG4iLAogCQkJY3RybC0+YlJlcXVlc3RUeXBlLCBjdHJsLT5iUmVxdWVzdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX21hc3Nfc3RvcmFnZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfbWFzc19zdG9yYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM3NjQwZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX21hc3Nfc3RvcmFnZS5jCkBAIC0wLDAgKzEsMzA5MSBAQAorLyoKKyAqIGZfbWFzc19zdG9yYWdlLmMgLS0gTWFzcyBTdG9yYWdlIFVTQiBDb21wb3NpdGUgRnVuY3Rpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBBbGFuIFN0ZXJuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcworICogICAgICAgICAgICAgICAgICAgIEF1dGhvcjogTWljaGFsIE5hemFyZXdpY3ogPG0ubmF6YXJld2ljekBzYW1zdW5nLmNvbT4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworCisvKgorICogVGhlIE1hc3MgU3RvcmFnZSBGdW5jdGlvbiBhY3RzIGFzIGEgVVNCIE1hc3MgU3RvcmFnZSBkZXZpY2UsCisgKiBhcHBlYXJpbmcgdG8gdGhlIGhvc3QgYXMgYSBkaXNrIGRyaXZlIG9yIGFzIGEgQ0QtUk9NIGRyaXZlLiAgSW4KKyAqIGFkZGl0aW9uIHRvIHByb3ZpZGluZyBhbiBleGFtcGxlIG9mIGEgZ2VudWluZWx5IHVzZWZ1bCBjb21wb3NpdGUKKyAqIGZ1bmN0aW9uIGZvciBhIFVTQiBkZXZpY2UsIGl0IGFsc28gaWxsdXN0cmF0ZXMgYSB0ZWNobmlxdWUgb2YKKyAqIGRvdWJsZS1idWZmZXJpbmcgZm9yIGluY3JlYXNlZCB0aHJvdWdocHV0LgorICoKKyAqIEZ1bmN0aW9uIHN1cHBvcnRzIG11bHRpcGxlIGxvZ2ljYWwgdW5pdHMgKExVTnMpLiAgQmFja2luZyBzdG9yYWdlCisgKiBmb3IgZWFjaCBMVU4gaXMgcHJvdmlkZWQgYnkgYSByZWd1bGFyIGZpbGUgb3IgYSBibG9jayBkZXZpY2UuCisgKiBBY2Nlc3MgZm9yIGVhY2ggTFVOIGNhbiBiZSBsaW1pdGVkIHRvIHJlYWQtb25seS4gIE1vcmVvdmVyLCB0aGUKKyAqIGZ1bmN0aW9uIGNhbiBpbmRpY2F0ZSB0aGF0IExVTiBpcyByZW1vdmFibGUgYW5kL29yIENELVJPTS4gIChUaGUKKyAqIGxhdGVyIGltcGxpZXMgcmVhZC1vbmx5IGFjY2Vzcy4pCisgKgorICogTVNGIGlzIGNvbmZpZ3VyZWQgYnkgc3BlY2lmeWluZyBhIGZzZ19jb25maWcgc3RydWN0dXJlLiAgSXQgaGFzIHRoZQorICogZm9sbG93aW5nIGZpZWxkczoKKyAqCisgKglubHVucwkJTnVtYmVyIG9mIExVTnMgZnVuY3Rpb24gaGF2ZSAoYW55d2hlcmUgZnJvbSAxCisgKgkJCQl0byBGU0dfTUFYX0xVTlMgd2hpY2ggaXMgOCkuCisgKglsdW5zCQlBbiBhcnJheSBvZiBMVU4gY29uZmlndXJhdGlvbiB2YWx1ZXMuICBUaGlzCisgKgkJCQlzaG91bGQgYmUgZmlsbGVkIGZvciBlYWNoIExVTiB0aGF0CisgKgkJCQlmdW5jdGlvbiB3aWxsIGluY2x1ZGUgKGllLiBmb3IgIm5sdW5zIgorICoJCQkJTFVOcykuICBFYWNoIGVsZW1lbnQgb2YgdGhlIGFycmF5IGhhcworICoJCQkJdGhlIGZvbGxvd2luZyBmaWVsZHM6CisgKgktPmZpbGVuYW1lCVRoZSBwYXRoIHRvIHRoZSBiYWNraW5nIGZpbGUgZm9yIHRoZSBMVU4uCisgKgkJCQlSZXF1aXJlZCBpZiBMVU4gaXMgbm90IG1hcmtlZCBhcworICoJCQkJcmVtb3ZhYmxlLgorICoJLT5ybwkJRmxhZyBzcGVjaWZ5aW5nIGFjY2VzcyB0byB0aGUgTFVOIHNoYWxsIGJlCisgKgkJCQlyZWFkLW9ubHkuICBUaGlzIGlzIGltcGxpZWQgaWYgQ0QtUk9NCisgKgkJCQllbXVsYXRpb24gaXMgZW5hYmxlZCBhcyB3ZWxsIGFzIHdoZW4KKyAqCQkJCWl0IHdhcyBpbXBvc3NpYmxlIHRvIG9wZW4gImZpbGVuYW1lIgorICoJCQkJaW4gUi9XIG1vZGUuCisgKgktPnJlbW92YWJsZQlGbGFnIHNwZWNpZnlpbmcgdGhhdCBMVU4gc2hhbGwgYmUgaW5kaWNhdGVkIGFzCisgKgkJCQliZWluZyByZW1vdmFibGUuCisgKgktPmNkcm9tCQlGbGFnIHNwZWNpZnlpbmcgdGhhdCBMVU4gc2hhbGwgYmUgcmVwb3J0ZWQgYXMKKyAqCQkJCWJlaW5nIGEgQ0QtUk9NLgorICoKKyAqCWx1bl9uYW1lX2Zvcm1hdAlBIHByaW50Zi1saWtlIGZvcm1hdCBmb3IgbmFtZXMgb2YgdGhlIExVTgorICoJCQkJZGV2aWNlcy4gIFRoaXMgZGV0ZXJtaW5lcyBob3cgdGhlCisgKgkJCQlkaXJlY3RvcnkgaW4gc3lzZnMgd2lsbCBiZSBuYW1lZC4KKyAqCQkJCVVubGVzcyB5b3UgYXJlIHVzaW5nIHNldmVyYWwgTVNGcyBpbgorICoJCQkJYSBzaW5nbGUgZ2FkZ2V0IChhcyBvcHBvc2VkIHRvIHNpbmdsZQorICoJCQkJTVNGIGluIG1hbnkgY29uZmlndXJhdGlvbnMpIHlvdSBtYXkKKyAqCQkJCWxlYXZlIGl0IGFzIE5VTEwgKGluIHdoaWNoIGNhc2UKKyAqCQkJCSJsdW4lZCIgd2lsbCBiZSB1c2VkKS4gIEluIHRoZSBmb3JtYXQKKyAqCQkJCXlvdSBjYW4gdXNlICIlZCIgdG8gaW5kZXggTFVOcyBmb3IKKyAqCQkJCU1TRidzIHdpdGggbW9yZSB0aGFuIG9uZSBMVU4uICAoQmV3YXJlCisgKgkJCQl0aGF0IHRoZXJlIGlzIG9ubHkgb25lIGludGVnZXIgZ2l2ZW4KKyAqCQkJCWFzIGFuIGFyZ3VtZW50IGZvciB0aGUgZm9ybWF0IGFuZAorICoJCQkJc3BlY2lmeWluZyBpbnZhbGlkIGZvcm1hdCBtYXkgY2F1c2UKKyAqCQkJCXVuc3BlY2lmaWVkIGJlaGF2aW91ci4pCisgKgl0aHJlYWRfbmFtZQlOYW1lIG9mIHRoZSBrZXJuZWwgdGhyZWFkIHByb2Nlc3MgdXNlZCBieSB0aGUKKyAqCQkJCU1TRi4gIFlvdSBjYW4gc2FmZWx5IHNldCBpdCB0byBOVUxMCisgKgkJCQkoaW4gd2hpY2ggY2FzZSBkZWZhdWx0ICJmaWxlLXN0b3JhZ2UiCisgKgkJCQl3aWxsIGJlIHVzZWQpLgorICoKKyAqCXZlbmRvcl9uYW1lCisgKglwcm9kdWN0X25hbWUKKyAqCXJlbGVhc2UJCUluZm9ybWF0aW9uIHVzZWQgYXMgYSByZXBseSB0byBJTlFVSVJZCisgKgkJCQlyZXF1ZXN0LiAgVG8gdXNlIGRlZmF1bHQgc2V0IHRvIE5VTEwsCisgKgkJCQlOVUxMLCAweGZmZmYgcmVzcGVjdGl2ZWx5LiAgVGhlIGZpcnN0CisgKgkJCQlmaWVsZCBzaG91bGQgYmUgOCBhbmQgdGhlIHNlY29uZCAxNgorICoJCQkJY2hhcmFjdGVycyBvciBsZXNzLgorICoKKyAqCWNhbl9zdGFsbAlTZXQgdG8gcGVybWl0IGZ1bmN0aW9uIHRvIGhhbHQgYnVsayBlbmRwb2ludHMuCisgKgkJCQlEaXNhYmxlZCBvbiBzb21lIFVTQiBkZXZpY2VzIGtub3duIG5vdAorICoJCQkJdG8gd29yayBjb3JyZWN0bHkuICBZb3Ugc2hvdWxkIHNldCBpdAorICoJCQkJdG8gdHJ1ZS4KKyAqCisgKiBJZiAicmVtb3ZhYmxlIiBpcyBub3Qgc2V0IGZvciBhIExVTiB0aGVuIGEgYmFja2luZyBmaWxlIG11c3QgYmUKKyAqIHNwZWNpZmllZC4gIElmIGl0IGlzIHNldCwgdGhlbiBOVUxMIGZpbGVuYW1lIG1lYW5zIHRoZSBMVU4ncyBtZWRpdW0KKyAqIGlzIG5vdCBsb2FkZWQgKGFuIGVtcHR5IHN0cmluZyBhcyAiZmlsZW5hbWUiIGluIHRoZSBmc2dfY29uZmlnCisgKiBzdHJ1Y3R1cmUgY2F1c2VzIGVycm9yKS4gIFRoZSBDRC1ST00gZW11bGF0aW9uIGluY2x1ZGVzIGEgc2luZ2xlCisgKiBkYXRhIHRyYWNrIGFuZCBubyBhdWRpbyB0cmFja3M7IGhlbmNlIHRoZXJlIG5lZWQgYmUgb25seSBvbmUKKyAqIGJhY2tpbmcgZmlsZSBwZXIgTFVOLiAgTm90ZSBhbHNvIHRoYXQgdGhlIENELVJPTSBibG9jayBsZW5ndGggaXMKKyAqIHNldCB0byA1MTIgcmF0aGVyIHRoYW4gdGhlIG1vcmUgY29tbW9uIHZhbHVlIDIwNDguCisgKgorICoKKyAqIE1TRiBpbmNsdWRlcyBzdXBwb3J0IGZvciBtb2R1bGUgcGFyYW1ldGVycy4gIElmIGdhZGdldCB1c2luZyBpdAorICogZGVjaWRlcyB0byB1c2UgaXQsIHRoZSBmb2xsb3dpbmcgbW9kdWxlIHBhcmFtZXRlcnMgd2lsbCBiZQorICogYXZhaWxhYmxlOgorICoKKyAqCWZpbGU9ZmlsZW5hbWVbLGZpbGVuYW1lLi4uXQorICoJCQlOYW1lcyBvZiB0aGUgZmlsZXMgb3IgYmxvY2sgZGV2aWNlcyB1c2VkIGZvcgorICoJCQkJYmFja2luZyBzdG9yYWdlLgorICoJcm89YlssYi4uLl0JRGVmYXVsdCBmYWxzZSwgYm9vbGVhbiBmb3IgcmVhZC1vbmx5IGFjY2Vzcy4KKyAqCXJlbW92YWJsZT1iWyxiLi4uXQorICoJCQlEZWZhdWx0IHRydWUsIGJvb2xlYW4gZm9yIHJlbW92YWJsZSBtZWRpYS4KKyAqCWNkcm9tPWJbLGIuLi5dCURlZmF1bHQgZmFsc2UsIGJvb2xlYW4gZm9yIHdoZXRoZXIgdG8gZW11bGF0ZQorICoJCQkJYSBDRC1ST00gZHJpdmUuCisgKglsdW5zPU4JCURlZmF1bHQgTiA9IG51bWJlciBvZiBmaWxlbmFtZXMsIG51bWJlciBvZgorICoJCQkJTFVOcyB0byBzdXBwb3J0LgorICoJc3RhbGwJCURlZmF1bHQgZGV0ZXJtaW5lZCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YKKyAqCQkJCVVTQiBkZXZpY2UgY29udHJvbGxlciAodXN1YWxseSB0cnVlKSwKKyAqCQkJCWJvb2xlYW4gdG8gcGVybWl0IHRoZSBkcml2ZXIgdG8gaGFsdAorICoJCQkJYnVsayBlbmRwb2ludHMuCisgKgorICogVGhlIG1vZHVsZSBwYXJhbWV0ZXJzIG1heSBiZSBwcmVmaXhlZCB3aXRoIHNvbWUgc3RyaW5nLiAgWW91IG5lZWQKKyAqIHRvIGNvbnN1bHQgZ2FkZ2V0J3MgZG9jdW1lbnRhdGlvbiBvciBzb3VyY2UgdG8gdmVyaWZ5IHdoZXRoZXIgaXQgaXMKKyAqIHVzaW5nIHRob3NlIG1vZHVsZSBwYXJhbWV0ZXJzIGFuZCBpZiBpdCBkb2VzIHdoYXQgYXJlIHRoZSBwcmVmaXhlcworICogKGxvb2sgZm9yIEZTR19NT0RVTEVfUEFSQU1FVEVSUygpIG1hY3JvIHVzYWdlLCB3aGF0J3MgaW5zaWRlIGl0IGlzCisgKiB0aGUgcHJlZml4KS4KKyAqCisgKgorICogUmVxdWlyZW1lbnRzIGFyZSBtb2Rlc3Q7IG9ubHkgYSBidWxrLWluIGFuZCBhIGJ1bGstb3V0IGVuZHBvaW50IGFyZQorICogbmVlZGVkLiAgVGhlIG1lbW9yeSByZXF1aXJlbWVudCBhbW91bnRzIHRvIHR3byAxNksgYnVmZmVycywgc2l6ZQorICogY29uZmlndXJhYmxlIGJ5IGEgcGFyYW1ldGVyLiAgU3VwcG9ydCBpcyBpbmNsdWRlZCBmb3IgYm90aAorICogZnVsbC1zcGVlZCBhbmQgaGlnaC1zcGVlZCBvcGVyYXRpb24uCisgKgorICogTm90ZSB0aGF0IHRoZSBkcml2ZXIgaXMgc2xpZ2h0bHkgbm9uLXBvcnRhYmxlIGluIHRoYXQgaXQgYXNzdW1lcyBhCisgKiBzaW5nbGUgbWVtb3J5L0RNQSBidWZmZXIgd2lsbCBiZSB1c2VhYmxlIGZvciBidWxrLWluLCBidWxrLW91dCwgYW5kCisgKiBpbnRlcnJ1cHQtaW4gZW5kcG9pbnRzLiAgV2l0aCBtb3N0IGRldmljZSBjb250cm9sbGVycyB0aGlzIGlzbid0IGFuCisgKiBpc3N1ZSwgYnV0IHRoZXJlIG1heSBiZSBzb21lIHdpdGggaGFyZHdhcmUgcmVzdHJpY3Rpb25zIHRoYXQgcHJldmVudAorICogYSBidWZmZXIgZnJvbSBiZWluZyB1c2VkIGJ5IG1vcmUgdGhhbiBvbmUgZW5kcG9pbnQuCisgKgorICoKKyAqIFRoZSBwYXRobmFtZXMgb2YgdGhlIGJhY2tpbmcgZmlsZXMgYW5kIHRoZSBybyBzZXR0aW5ncyBhcmUKKyAqIGF2YWlsYWJsZSBpbiB0aGUgYXR0cmlidXRlIGZpbGVzICJmaWxlIiBhbmQgInJvIiBpbiB0aGUgbHVuPG4+IChvcgorICogdG8gYmUgbW9yZSBwcmVjaXNlIGluIGEgZGlyZWN0b3J5IHdoaWNoIG5hbWUgY29tZXMgZnJvbQorICogImx1bl9uYW1lX2Zvcm1hdCIgb3B0aW9uISkgc3ViZGlyZWN0b3J5IG9mIHRoZSBnYWRnZXQncyBzeXNmcworICogZGlyZWN0b3J5LiAgSWYgdGhlICJyZW1vdmFibGUiIG9wdGlvbiBpcyBzZXQsIHdyaXRpbmcgdG8gdGhlc2UKKyAqIGZpbGVzIHdpbGwgc2ltdWxhdGUgZWplY3RpbmcvbG9hZGluZyB0aGUgbWVkaXVtICh3cml0aW5nIGFuIGVtcHR5CisgKiBsaW5lIG1lYW5zIGVqZWN0KSBhbmQgYWRqdXN0aW5nIGEgd3JpdGUtZW5hYmxlIHRhYi4gIENoYW5nZXMgdG8gdGhlCisgKiBybyBzZXR0aW5nIGFyZSBub3QgYWxsb3dlZCB3aGVuIHRoZSBtZWRpdW0gaXMgbG9hZGVkIG9yIGlmIENELVJPTQorICogZW11bGF0aW9uIGlzIGJlaW5nIHVzZWQuCisgKgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaGVhdmlseSBiYXNlZCBvbiAiRmlsZS1iYWNrZWQgU3RvcmFnZSBHYWRnZXQiIGJ5CisgKiBBbGFuIFN0ZXJuIHdoaWNoIGluIHR1cm4gaXMgaGVhdmlseSBiYXNlZCBvbiAiR2FkZ2V0IFplcm8iIGJ5IERhdmlkCisgKiBCcm93bmVsbC4gIFRoZSBkcml2ZXIncyBTQ1NJIGNvbW1hbmQgaW50ZXJmYWNlIHdhcyBiYXNlZCBvbiB0aGUKKyAqICJJbmZvcm1hdGlvbiB0ZWNobm9sb2d5IC0gU21hbGwgQ29tcHV0ZXIgU3lzdGVtIEludGVyZmFjZSAtIDIiCisgKiBkb2N1bWVudCBmcm9tIFgzVDkuMiBQcm9qZWN0IDM3NUQsIFJldmlzaW9uIDEwTCwgNy1TRVAtOTMsCisgKiBhdmFpbGFibGUgYXQgPGh0dHA6Ly93d3cudDEwLm9yZy9mdHAvdDEwL2RyYWZ0cy9zMi9zMi1yMTBsLnBkZj4uCisgKiBUaGUgc2luZ2xlIGV4Y2VwdGlvbiBpcyBvcGNvZGUgMHgyMyAoUkVBRCBGT1JNQVQgQ0FQQUNJVElFUyksIHdoaWNoCisgKiB3YXMgYmFzZWQgb24gdGhlICJVbml2ZXJzYWwgU2VyaWFsIEJ1cyBNYXNzIFN0b3JhZ2UgQ2xhc3MgVUZJCisgKiBDb21tYW5kIFNwZWNpZmljYXRpb24iIGRvY3VtZW50LCBSZXZpc2lvbiAxLjAsIERlY2VtYmVyIDE0LCAxOTk4LAorICogYXZhaWxhYmxlIGF0CisgKiA8aHR0cDovL3d3dy51c2Iub3JnL2RldmVsb3BlcnMvZGV2Y2xhc3NfZG9jcy91c2JtYXNzLXVmaTEwLnBkZj4uCisgKi8KKworCisvKgorICoJCQkJRHJpdmVyIERlc2lnbgorICoKKyAqIFRoZSBNU0YgaXMgZmFpcmx5IHN0cmFpZ2h0Zm9yd2FyZC4gIFRoZXJlIGlzIGEgbWFpbiBrZXJuZWwKKyAqIHRocmVhZCB0aGF0IGhhbmRsZXMgbW9zdCBvZiB0aGUgd29yay4gIEludGVycnVwdCByb3V0aW5lcyBmaWVsZAorICogY2FsbGJhY2tzIGZyb20gdGhlIGNvbnRyb2xsZXIgZHJpdmVyOiBidWxrLSBhbmQgaW50ZXJydXB0LXJlcXVlc3QKKyAqIGNvbXBsZXRpb24gbm90aWZpY2F0aW9ucywgZW5kcG9pbnQtMCBldmVudHMsIGFuZCBkaXNjb25uZWN0IGV2ZW50cy4KKyAqIENvbXBsZXRpb24gZXZlbnRzIGFyZSBwYXNzZWQgdG8gdGhlIG1haW4gdGhyZWFkIGJ5IHdha2V1cCBjYWxscy4gIE1hbnkKKyAqIGVwMCByZXF1ZXN0cyBhcmUgaGFuZGxlZCBhdCBpbnRlcnJ1cHQgdGltZSwgYnV0IFNldEludGVyZmFjZSwKKyAqIFNldENvbmZpZ3VyYXRpb24sIGFuZCBkZXZpY2UgcmVzZXQgcmVxdWVzdHMgYXJlIGZvcndhcmRlZCB0byB0aGUKKyAqIHRocmVhZCBpbiB0aGUgZm9ybSBvZiAiZXhjZXB0aW9ucyIgdXNpbmcgU0lHVVNSMSBzaWduYWxzIChzaW5jZSB0aGV5CisgKiBzaG91bGQgaW50ZXJydXB0IGFueSBvbmdvaW5nIGZpbGUgSS9PIG9wZXJhdGlvbnMpLgorICoKKyAqIFRoZSB0aHJlYWQncyBtYWluIHJvdXRpbmUgaW1wbGVtZW50cyB0aGUgc3RhbmRhcmQgY29tbWFuZC9kYXRhL3N0YXR1cworICogcGFydHMgb2YgYSBTQ1NJIGludGVyYWN0aW9uLiAgSXQgYW5kIGl0cyBzdWJyb3V0aW5lcyBhcmUgZnVsbCBvZiB0ZXN0cworICogZm9yIHBlbmRpbmcgc2lnbmFscy9leGNlcHRpb25zIC0tIGFsbCB0aGlzIHBvbGxpbmcgaXMgbmVjZXNzYXJ5IHNpbmNlCisgKiB0aGUga2VybmVsIGhhcyBubyBzZXRqbXAvbG9uZ2ptcCBlcXVpdmFsZW50cy4gIChNYXliZSB0aGlzIGlzIGFuCisgKiBpbmRpY2F0aW9uIHRoYXQgdGhlIGRyaXZlciByZWFsbHkgd2FudHMgdG8gYmUgcnVubmluZyBpbiB1c2Vyc3BhY2UuKQorICogQW4gaW1wb3J0YW50IHBvaW50IGlzIHRoYXQgc28gbG9uZyBhcyB0aGUgdGhyZWFkIGlzIGFsaXZlIGl0IGtlZXBzIGFuCisgKiBvcGVuIHJlZmVyZW5jZSB0byB0aGUgYmFja2luZyBmaWxlLiAgVGhpcyB3aWxsIHByZXZlbnQgdW5tb3VudGluZworICogdGhlIGJhY2tpbmcgZmlsZSdzIHVuZGVybHlpbmcgZmlsZXN5c3RlbSBhbmQgY291bGQgY2F1c2UgcHJvYmxlbXMKKyAqIGR1cmluZyBzeXN0ZW0gc2h1dGRvd24sIGZvciBleGFtcGxlLiAgVG8gcHJldmVudCBzdWNoIHByb2JsZW1zLCB0aGUKKyAqIHRocmVhZCBjYXRjaGVzIElOVCwgVEVSTSwgYW5kIEtJTEwgc2lnbmFscyBhbmQgY29udmVydHMgdGhlbSBpbnRvCisgKiBhbiBFWElUIGV4Y2VwdGlvbi4KKyAqCisgKiBJbiBub3JtYWwgb3BlcmF0aW9uIHRoZSBtYWluIHRocmVhZCBpcyBzdGFydGVkIGR1cmluZyB0aGUgZ2FkZ2V0J3MKKyAqIGZzZ19iaW5kKCkgY2FsbGJhY2sgYW5kIHN0b3BwZWQgZHVyaW5nIGZzZ191bmJpbmQoKS4gIEJ1dCBpdCBjYW4KKyAqIGFsc28gZXhpdCB3aGVuIGl0IHJlY2VpdmVzIGEgc2lnbmFsLCBhbmQgdGhlcmUncyBubyBwb2ludCBsZWF2aW5nCisgKiB0aGUgZ2FkZ2V0IHJ1bm5pbmcgd2hlbiB0aGUgdGhyZWFkIGlzIGRlYWQuICBBdCBvZiB0aGlzIG1vbWVudCwgTVNGCisgKiBwcm92aWRlcyBubyB3YXkgdG8gZGVyZWdpc3RlciB0aGUgZ2FkZ2V0IHdoZW4gdGhyZWFkIGRpZXMgLS0gbWF5YmUKKyAqIGEgY2FsbGJhY2sgZnVuY3Rpb25zIGlzIG5lZWRlZC4KKyAqCisgKiBUbyBwcm92aWRlIG1heGltdW0gdGhyb3VnaHB1dCwgdGhlIGRyaXZlciB1c2VzIGEgY2lyY3VsYXIgcGlwZWxpbmUgb2YKKyAqIGJ1ZmZlciBoZWFkcyAoc3RydWN0IGZzZ19idWZmaGQpLiAgSW4gcHJpbmNpcGxlIHRoZSBwaXBlbGluZSBjYW4gYmUKKyAqIGFyYml0cmFyaWx5IGxvbmc7IGluIHByYWN0aWNlIHRoZSBiZW5lZml0cyBkb24ndCBqdXN0aWZ5IGhhdmluZyBtb3JlCisgKiB0aGFuIDIgc3RhZ2VzIChpLmUuLCBkb3VibGUgYnVmZmVyaW5nKS4gIEJ1dCBpdCBoZWxwcyB0byB0aGluayBvZiB0aGUKKyAqIHBpcGVsaW5lIGFzIGJlaW5nIGEgbG9uZyBvbmUuICBFYWNoIGJ1ZmZlciBoZWFkIGNvbnRhaW5zIGEgYnVsay1pbiBhbmQKKyAqIGEgYnVsay1vdXQgcmVxdWVzdCBwb2ludGVyIChzaW5jZSB0aGUgYnVmZmVyIGNhbiBiZSB1c2VkIGZvciBib3RoCisgKiBvdXRwdXQgYW5kIGlucHV0IC0tIGRpcmVjdGlvbnMgYWx3YXlzIGFyZSBnaXZlbiBmcm9tIHRoZSBob3N0J3MKKyAqIHBvaW50IG9mIHZpZXcpIGFzIHdlbGwgYXMgYSBwb2ludGVyIHRvIHRoZSBidWZmZXIgYW5kIHZhcmlvdXMgc3RhdGUKKyAqIHZhcmlhYmxlcy4KKyAqCisgKiBVc2Ugb2YgdGhlIHBpcGVsaW5lIGZvbGxvd3MgYSBzaW1wbGUgcHJvdG9jb2wuICBUaGVyZSBpcyBhIHZhcmlhYmxlCisgKiAoZnNnLT5uZXh0X2J1ZmZoZF90b19maWxsKSB0aGF0IHBvaW50cyB0byB0aGUgbmV4dCBidWZmZXIgaGVhZCB0byB1c2UuCisgKiBBdCBhbnkgdGltZSB0aGF0IGJ1ZmZlciBoZWFkIG1heSBzdGlsbCBiZSBpbiB1c2UgZnJvbSBhbiBlYXJsaWVyCisgKiByZXF1ZXN0LCBzbyBlYWNoIGJ1ZmZlciBoZWFkIGhhcyBhIHN0YXRlIHZhcmlhYmxlIGluZGljYXRpbmcgd2hldGhlcgorICogaXQgaXMgRU1QVFksIEZVTEwsIG9yIEJVU1kuICBUeXBpY2FsIHVzZSBpbnZvbHZlcyB3YWl0aW5nIGZvciB0aGUKKyAqIGJ1ZmZlciBoZWFkIHRvIGJlIEVNUFRZLCBmaWxsaW5nIHRoZSBidWZmZXIgZWl0aGVyIGJ5IGZpbGUgSS9PIG9yIGJ5CisgKiBVU0IgSS9PIChkdXJpbmcgd2hpY2ggdGhlIGJ1ZmZlciBoZWFkIGlzIEJVU1kpLCBhbmQgbWFya2luZyB0aGUgYnVmZmVyCisgKiBoZWFkIEZVTEwgd2hlbiB0aGUgSS9PIGlzIGNvbXBsZXRlLiAgVGhlbiB0aGUgYnVmZmVyIHdpbGwgYmUgZW1wdGllZAorICogKGFnYWluIHBvc3NpYmx5IGJ5IFVTQiBJL08sIGR1cmluZyB3aGljaCBpdCBpcyBtYXJrZWQgQlVTWSkgYW5kCisgKiBmaW5hbGx5IG1hcmtlZCBFTVBUWSBhZ2FpbiAocG9zc2libHkgYnkgYSBjb21wbGV0aW9uIHJvdXRpbmUpLgorICoKKyAqIEEgbW9kdWxlIHBhcmFtZXRlciB0ZWxscyB0aGUgZHJpdmVyIHRvIGF2b2lkIHN0YWxsaW5nIHRoZSBidWxrCisgKiBlbmRwb2ludHMgd2hlcmV2ZXIgdGhlIHRyYW5zcG9ydCBzcGVjaWZpY2F0aW9uIGFsbG93cy4gIFRoaXMgaXMKKyAqIG5lY2Vzc2FyeSBmb3Igc29tZSBVRENzIGxpa2UgdGhlIFN1cGVySCwgd2hpY2ggY2Fubm90IHJlbGlhYmx5IGNsZWFyIGEKKyAqIGhhbHQgb24gYSBidWxrIGVuZHBvaW50LiAgSG93ZXZlciwgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzIHRoZQorICogQnVsay1vbmx5IHNwZWNpZmljYXRpb24gcmVxdWlyZXMgYSBzdGFsbC4gIEluIHN1Y2ggY2FzZXMgdGhlIGRyaXZlcgorICogd2lsbCBoYWx0IHRoZSBlbmRwb2ludCBhbmQgc2V0IGEgZmxhZyBpbmRpY2F0aW5nIHRoYXQgaXQgc2hvdWxkIGNsZWFyCisgKiB0aGUgaGFsdCBpbiBzb2Z0d2FyZSBkdXJpbmcgdGhlIG5leHQgZGV2aWNlIHJlc2V0LiAgSG9wZWZ1bGx5IHRoaXMKKyAqIHdpbGwgcGVybWl0IGV2ZXJ5dGhpbmcgdG8gd29yayBjb3JyZWN0bHkuICBGdXJ0aGVybW9yZSwgYWx0aG91Z2ggdGhlCisgKiBzcGVjaWZpY2F0aW9uIGFsbG93cyB0aGUgYnVsay1vdXQgZW5kcG9pbnQgdG8gaGFsdCB3aGVuIHRoZSBob3N0IHNlbmRzCisgKiB0b28gbXVjaCBkYXRhLCBpbXBsZW1lbnRpbmcgdGhpcyB3b3VsZCBjYXVzZSBhbiB1bmF2b2lkYWJsZSByYWNlLgorICogVGhlIGRyaXZlciB3aWxsIGFsd2F5cyB1c2UgdGhlICJuby1zdGFsbCIgYXBwcm9hY2ggZm9yIE9VVCB0cmFuc2ZlcnMuCisgKgorICogT25lIHN1YnRsZSBwb2ludCBjb25jZXJucyBzZW5kaW5nIHN0YXR1cy1zdGFnZSByZXNwb25zZXMgZm9yIGVwMAorICogcmVxdWVzdHMuICBTb21lIG9mIHRoZXNlIHJlcXVlc3RzLCBzdWNoIGFzIGRldmljZSByZXNldCwgY2FuIGludm9sdmUKKyAqIGludGVycnVwdGluZyBhbiBvbmdvaW5nIGZpbGUgSS9PIG9wZXJhdGlvbiwgd2hpY2ggbWlnaHQgdGFrZSBhbgorICogYXJiaXRyYXJpbHkgbG9uZyB0aW1lLiAgRHVyaW5nIHRoYXQgZGVsYXkgdGhlIGhvc3QgbWlnaHQgZ2l2ZSB1cCBvbgorICogdGhlIG9yaWdpbmFsIGVwMCByZXF1ZXN0IGFuZCBpc3N1ZSBhIG5ldyBvbmUuICBXaGVuIHRoYXQgaGFwcGVucyB0aGUKKyAqIGRyaXZlciBzaG91bGQgbm90IG5vdGlmeSB0aGUgaG9zdCBhYm91dCBjb21wbGV0aW9uIG9mIHRoZSBvcmlnaW5hbAorICogcmVxdWVzdCwgYXMgdGhlIGhvc3Qgd2lsbCBubyBsb25nZXIgYmUgd2FpdGluZyBmb3IgaXQuICBTbyB0aGUgZHJpdmVyCisgKiBhc3NpZ25zIHRvIGVhY2ggZXAwIHJlcXVlc3QgYSB1bmlxdWUgdGFnLCBhbmQgaXQga2VlcHMgdHJhY2sgb2YgdGhlCisgKiB0YWcgdmFsdWUgb2YgdGhlIHJlcXVlc3QgYXNzb2NpYXRlZCB3aXRoIGEgbG9uZy1ydW5uaW5nIGV4Y2VwdGlvbgorICogKGRldmljZS1yZXNldCwgaW50ZXJmYWNlLWNoYW5nZSwgb3IgY29uZmlndXJhdGlvbi1jaGFuZ2UpLiAgV2hlbiB0aGUKKyAqIGV4Y2VwdGlvbiBoYW5kbGVyIGlzIGZpbmlzaGVkLCB0aGUgc3RhdHVzLXN0YWdlIHJlc3BvbnNlIGlzIHN1Ym1pdHRlZAorICogb25seSBpZiB0aGUgY3VycmVudCBlcDAgcmVxdWVzdCB0YWcgaXMgZXF1YWwgdG8gdGhlIGV4Y2VwdGlvbiByZXF1ZXN0CisgKiB0YWcuICBUaHVzIG9ubHkgdGhlIG1vc3QgcmVjZW50bHkgcmVjZWl2ZWQgZXAwIHJlcXVlc3Qgd2lsbCBnZXQgYQorICogc3RhdHVzLXN0YWdlIHJlc3BvbnNlLgorICoKKyAqIFdhcm5pbmc6IFRoaXMgZHJpdmVyIHNvdXJjZSBmaWxlIGlzIHRvbyBsb25nLiAgSXQgb3VnaHQgdG8gYmUgc3BsaXQgdXAKKyAqIGludG8gYSBoZWFkZXIgZmlsZSBwbHVzIGFib3V0IDMgc2VwYXJhdGUgLmMgZmlsZXMsIHRvIGhhbmRsZSB0aGUgZGV0YWlscworICogb2YgdGhlIEdhZGdldCwgVVNCIE1hc3MgU3RvcmFnZSwgYW5kIFNDU0kgcHJvdG9jb2xzLgorICovCisKKworLyogI2RlZmluZSBWRVJCT1NFX0RFQlVHICovCisvKiAjZGVmaW5lIERVTVBfTVNHUyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorCisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KKworI2luY2x1ZGUgImdhZGdldF9jaGlwcy5oIgorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIEZTR19EUklWRVJfREVTQwkJIk1hc3MgU3RvcmFnZSBGdW5jdGlvbiIKKyNkZWZpbmUgRlNHX0RSSVZFUl9WRVJTSU9OCSIyMDA5LzA5LzExIgorCitzdGF0aWMgY29uc3QgY2hhciBmc2dfc3RyaW5nX2ludGVyZmFjZVtdID0gIk1hc3MgU3RvcmFnZSI7CisKKworI2RlZmluZSBGU0dfTk9fSU5UUl9FUCAxCisjZGVmaW5lIEZTR19CVUZGSERfU1RBVElDX0JVRkZFUiAxCisjZGVmaW5lIEZTR19OT19ERVZJQ0VfU1RSSU5HUyAgICAxCisjZGVmaW5lIEZTR19OT19PVEcgICAgICAgICAgICAgICAxCisjZGVmaW5lIEZTR19OT19JTlRSX0VQICAgICAgICAgICAxCisKKyNpbmNsdWRlICJzdG9yYWdlX2NvbW1vbi5jIgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0cnVjdCBmc2dfZGV2OworCisKKy8qIERhdGEgc2hhcmVkIGJ5IGFsbCB0aGUgRlNHIGluc3RhbmNlcy4gKi8KK3N0cnVjdCBmc2dfY29tbW9uIHsKKwlzdHJ1Y3QgdXNiX2dhZGdldAkqZ2FkZ2V0OworCXN0cnVjdCBmc2dfZGV2CQkqZnNnOworCXN0cnVjdCBmc2dfZGV2CQkqcHJldl9mc2c7CisKKwkvKiBmaWxlc2VtIHByb3RlY3RzOiBiYWNraW5nIGZpbGVzIGluIHVzZSAqLworCXN0cnVjdCByd19zZW1hcGhvcmUJZmlsZXNlbTsKKworCS8qIGxvY2sgcHJvdGVjdHM6IHN0YXRlLCBhbGwgdGhlIHJlcV9idXN5J3MgKi8KKwlzcGlubG9ja190CQlsb2NrOworCisJc3RydWN0IHVzYl9lcAkJKmVwMDsJCS8qIENvcHkgb2YgZ2FkZ2V0LT5lcDAgKi8KKwlzdHJ1Y3QgdXNiX3JlcXVlc3QJKmVwMHJlcTsJLyogQ29weSBvZiBjZGV2LT5yZXEgKi8KKwl1bnNpZ25lZCBpbnQJCWVwMF9yZXFfdGFnOworCWNvbnN0IGNoYXIJCSplcDByZXFfbmFtZTsKKworCXN0cnVjdCBmc2dfYnVmZmhkCSpuZXh0X2J1ZmZoZF90b19maWxsOworCXN0cnVjdCBmc2dfYnVmZmhkCSpuZXh0X2J1ZmZoZF90b19kcmFpbjsKKwlzdHJ1Y3QgZnNnX2J1ZmZoZAlidWZmaGRzW0ZTR19OVU1fQlVGRkVSU107CisKKwlpbnQJCQljbW5kX3NpemU7CisJdTgJCQljbW5kW01BWF9DT01NQU5EX1NJWkVdOworCisJdW5zaWduZWQgaW50CQlubHVuczsKKwl1bnNpZ25lZCBpbnQJCWx1bjsKKwlzdHJ1Y3QgZnNnX2x1bgkJKmx1bnM7CisJc3RydWN0IGZzZ19sdW4JCSpjdXJsdW47CisKKwl1bnNpZ25lZCBpbnQJCWJ1bGtfb3V0X21heHBhY2tldDsKKwllbnVtIGZzZ19zdGF0ZQkJc3RhdGU7CQkvKiBGb3IgZXhjZXB0aW9uIGhhbmRsaW5nICovCisJdW5zaWduZWQgaW50CQlleGNlcHRpb25fcmVxX3RhZzsKKworCXU4CQkJY29uZmlnLCBuZXdfY29uZmlnOworCWVudW0gZGF0YV9kaXJlY3Rpb24JZGF0YV9kaXI7CisJdTMyCQkJZGF0YV9zaXplOworCXUzMgkJCWRhdGFfc2l6ZV9mcm9tX2NtbmQ7CisJdTMyCQkJdGFnOworCXUzMgkJCXJlc2lkdWU7CisJdTMyCQkJdXNiX2Ftb3VudF9sZWZ0OworCisJdW5zaWduZWQgaW50CQljYW5fc3RhbGw6MTsKKwl1bnNpZ25lZCBpbnQJCWZyZWVfc3RvcmFnZV9vbl9yZWxlYXNlOjE7CisJdW5zaWduZWQgaW50CQlwaGFzZV9lcnJvcjoxOworCXVuc2lnbmVkIGludAkJc2hvcnRfcGFja2V0X3JlY2VpdmVkOjE7CisJdW5zaWduZWQgaW50CQliYWRfbHVuX29rYXk6MTsKKwl1bnNpZ25lZCBpbnQJCXJ1bm5pbmc6MTsKKworCWludAkJCXRocmVhZF93YWtldXBfbmVlZGVkOworCXN0cnVjdCBjb21wbGV0aW9uCXRocmVhZF9ub3RpZmllcjsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRocmVhZF90YXNrOworCisJLyogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRocmVhZCBleGl0cy4gKi8KKwl2b2lkCQkJKCp0aHJlYWRfZXhpdHMpKHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24pOworCS8qIEdhZGdldCdzIHByaXZhdGUgZGF0YS4gKi8KKwl2b2lkCQkJKnByaXZhdGVfZGF0YTsKKworCS8qIFZlbmRvciAoOCBjaGFycyksIHByb2R1Y3QgKDE2IGNoYXJzKSwgcmVsZWFzZSAoNAorCSAqIGhleGFkZWNpbWFsIGRpZ2l0cykgYW5kIE5VTCBieXRlICovCisJY2hhciBpbnF1aXJ5X3N0cmluZ1s4ICsgMTYgKyA0ICsgMV07CisKKwlzdHJ1Y3Qga3JlZgkJcmVmOworfTsKKworCitzdHJ1Y3QgZnNnX2NvbmZpZyB7CisJdW5zaWduZWQgbmx1bnM7CisJc3RydWN0IGZzZ19sdW5fY29uZmlnIHsKKwkJY29uc3QgY2hhciAqZmlsZW5hbWU7CisJCWNoYXIgcm87CisJCWNoYXIgcmVtb3ZhYmxlOworCQljaGFyIGNkcm9tOworCX0gbHVuc1tGU0dfTUFYX0xVTlNdOworCisJY29uc3QgY2hhcgkJKmx1bl9uYW1lX2Zvcm1hdDsKKwljb25zdCBjaGFyCQkqdGhyZWFkX25hbWU7CisKKwkvKiBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhyZWFkIGV4aXRzLiAqLworCXZvaWQJCQkoKnRocmVhZF9leGl0cykoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbik7CisJLyogR2FkZ2V0J3MgcHJpdmF0ZSBkYXRhLiAqLworCXZvaWQJCQkqcHJpdmF0ZV9kYXRhOworCisJY29uc3QgY2hhciAqdmVuZG9yX25hbWU7CQkvKiAgOCBjaGFyYWN0ZXJzIG9yIGxlc3MgKi8KKwljb25zdCBjaGFyICpwcm9kdWN0X25hbWU7CQkvKiAxNiBjaGFyYWN0ZXJzIG9yIGxlc3MgKi8KKwl1MTYgcmVsZWFzZTsKKworCWNoYXIJCQljYW5fc3RhbGw7Cit9OworCisKK3N0cnVjdCBmc2dfZGV2IHsKKwlzdHJ1Y3QgdXNiX2Z1bmN0aW9uCWZ1bmN0aW9uOworCXN0cnVjdCB1c2JfZ2FkZ2V0CSpnYWRnZXQ7CS8qIENvcHkgb2YgY2Rldi0+Z2FkZ2V0ICovCisJc3RydWN0IGZzZ19jb21tb24JKmNvbW1vbjsKKworCXUxNgkJCWludGVyZmFjZV9udW1iZXI7CisKKwl1bnNpZ25lZCBpbnQJCWJ1bGtfaW5fZW5hYmxlZDoxOworCXVuc2lnbmVkIGludAkJYnVsa19vdXRfZW5hYmxlZDoxOworCisJdW5zaWduZWQgbG9uZwkJYXRvbWljX2JpdGZsYWdzOworI2RlZmluZSBJR05PUkVfQlVMS19PVVQJCTAKKworCXN0cnVjdCB1c2JfZXAJCSpidWxrX2luOworCXN0cnVjdCB1c2JfZXAJCSpidWxrX291dDsKK307CisKKworc3RhdGljIGlubGluZSBpbnQgX19mc2dfaXNfc2V0KHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24sCisJCQkgICAgICAgY29uc3QgY2hhciAqZnVuYywgdW5zaWduZWQgbGluZSkKK3sKKwlpZiAoY29tbW9uLT5mc2cpCisJCXJldHVybiAxOworCUVSUk9SKGNvbW1vbiwgImNvbW1vbi0+ZnNnIGlzIE5VTEwgaW4gJXMgYXQgJXVcbiIsIGZ1bmMsIGxpbmUpOworCXJldHVybiAwOworfQorCisjZGVmaW5lIGZzZ19pc19zZXQoY29tbW9uKSBsaWtlbHkoX19mc2dfaXNfc2V0KGNvbW1vbiwgX19mdW5jX18sIF9fTElORV9fKSkKKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBmc2dfZGV2ICpmc2dfZnJvbV9mdW5jKHN0cnVjdCB1c2JfZnVuY3Rpb24gKmYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihmLCBzdHJ1Y3QgZnNnX2RldiwgZnVuY3Rpb24pOworfQorCisKK3R5cGVkZWYgdm9pZCAoKmZzZ19yb3V0aW5lX3QpKHN0cnVjdCBmc2dfZGV2ICopOworCitzdGF0aWMgaW50IGV4Y2VwdGlvbl9pbl9wcm9ncmVzcyhzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uKQoreworCXJldHVybiBjb21tb24tPnN0YXRlID4gRlNHX1NUQVRFX0lETEU7Cit9CisKKy8qIE1ha2UgYnVsay1vdXQgcmVxdWVzdHMgYmUgZGl2aXNpYmxlIGJ5IHRoZSBtYXhwYWNrZXQgc2l6ZSAqLworc3RhdGljIHZvaWQgc2V0X2J1bGtfb3V0X3JlcV9sZW5ndGgoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbiwKKwkJc3RydWN0IGZzZ19idWZmaGQgKmJoLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCXVuc2lnbmVkIGludAlyZW07CisKKwliaC0+YnVsa19vdXRfaW50ZW5kZWRfbGVuZ3RoID0gbGVuZ3RoOworCXJlbSA9IGxlbmd0aCAlIGNvbW1vbi0+YnVsa19vdXRfbWF4cGFja2V0OworCWlmIChyZW0gPiAwKQorCQlsZW5ndGggKz0gY29tbW9uLT5idWxrX291dF9tYXhwYWNrZXQgLSByZW07CisJYmgtPm91dHJlcS0+bGVuZ3RoID0gbGVuZ3RoOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IGZzZ19zZXRfaGFsdChzdHJ1Y3QgZnNnX2RldiAqZnNnLCBzdHJ1Y3QgdXNiX2VwICplcCkKK3sKKwljb25zdCBjaGFyCSpuYW1lOworCisJaWYgKGVwID09IGZzZy0+YnVsa19pbikKKwkJbmFtZSA9ICJidWxrLWluIjsKKwllbHNlIGlmIChlcCA9PSBmc2ctPmJ1bGtfb3V0KQorCQluYW1lID0gImJ1bGstb3V0IjsKKwllbHNlCisJCW5hbWUgPSBlcC0+bmFtZTsKKwlEQkcoZnNnLCAiJXMgc2V0IGhhbHRcbiIsIG5hbWUpOworCXJldHVybiB1c2JfZXBfc2V0X2hhbHQoZXApOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRoZXNlIHJvdXRpbmVzIG1heSBiZSBjYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0IG9yIGluX2lycSAqLworCisvKiBDYWxsZXIgbXVzdCBob2xkIGZzZy0+bG9jayAqLworc3RhdGljIHZvaWQgd2FrZXVwX3RocmVhZChzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uKQoreworCS8qIFRlbGwgdGhlIG1haW4gdGhyZWFkIHRoYXQgc29tZXRoaW5nIGhhcyBoYXBwZW5lZCAqLworCWNvbW1vbi0+dGhyZWFkX3dha2V1cF9uZWVkZWQgPSAxOworCWlmIChjb21tb24tPnRocmVhZF90YXNrKQorCQl3YWtlX3VwX3Byb2Nlc3MoY29tbW9uLT50aHJlYWRfdGFzayk7Cit9CisKKworc3RhdGljIHZvaWQgcmFpc2VfZXhjZXB0aW9uKHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24sIGVudW0gZnNnX3N0YXRlIG5ld19zdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworCS8qIERvIG5vdGhpbmcgaWYgYSBoaWdoZXItcHJpb3JpdHkgZXhjZXB0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MuCisJICogSWYgYSBsb3dlci1vci1lcXVhbCBwcmlvcml0eSBleGNlcHRpb24gaXMgaW4gcHJvZ3Jlc3MsIHByZWVtcHQgaXQKKwkgKiBhbmQgbm90aWZ5IHRoZSBtYWluIHRocmVhZCBieSBzZW5kaW5nIGl0IGEgc2lnbmFsLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjb21tb24tPmxvY2ssIGZsYWdzKTsKKwlpZiAoY29tbW9uLT5zdGF0ZSA8PSBuZXdfc3RhdGUpIHsKKwkJY29tbW9uLT5leGNlcHRpb25fcmVxX3RhZyA9IGNvbW1vbi0+ZXAwX3JlcV90YWc7CisJCWNvbW1vbi0+c3RhdGUgPSBuZXdfc3RhdGU7CisJCWlmIChjb21tb24tPnRocmVhZF90YXNrKQorCQkJc2VuZF9zaWdfaW5mbyhTSUdVU1IxLCBTRU5EX1NJR19GT1JDRUQsCisJCQkJICAgICAgY29tbW9uLT50aHJlYWRfdGFzayk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbW1vbi0+bG9jaywgZmxhZ3MpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgZXAwX3F1ZXVlKHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24pCit7CisJaW50CXJjOworCisJcmMgPSB1c2JfZXBfcXVldWUoY29tbW9uLT5lcDAsIGNvbW1vbi0+ZXAwcmVxLCBHRlBfQVRPTUlDKTsKKwljb21tb24tPmVwMC0+ZHJpdmVyX2RhdGEgPSBjb21tb247CisJaWYgKHJjICE9IDAgJiYgcmMgIT0gLUVTSFVURE9XTikgeworCQkvKiBXZSBjYW4ndCBkbyBtdWNoIG1vcmUgdGhhbiB3YWl0IGZvciBhIHJlc2V0ICovCisJCVdBUk5JTkcoY29tbW9uLCAiZXJyb3IgaW4gc3VibWlzc2lvbjogJXMgLS0+ICVkXG4iLAorCQkJY29tbW9uLT5lcDAtPm5hbWUsIHJjKTsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBCdWxrIGFuZCBpbnRlcnJ1cHQgZW5kcG9pbnQgY29tcGxldGlvbiBoYW5kbGVycy4KKyAqIFRoZXNlIGFsd2F5cyBydW4gaW5faXJxLiAqLworCitzdGF0aWMgdm9pZCBidWxrX2luX2NvbXBsZXRlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgZnNnX2NvbW1vbgkqY29tbW9uID0gZXAtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBmc2dfYnVmZmhkCSpiaCA9IHJlcS0+Y29udGV4dDsKKworCWlmIChyZXEtPnN0YXR1cyB8fCByZXEtPmFjdHVhbCAhPSByZXEtPmxlbmd0aCkKKwkJREJHKGNvbW1vbiwgIiVzIC0tPiAlZCwgJXUvJXVcbiIsIF9fZnVuY19fLAorCQkJCXJlcS0+c3RhdHVzLCByZXEtPmFjdHVhbCwgcmVxLT5sZW5ndGgpOworCWlmIChyZXEtPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCkJCS8qIFJlcXVlc3Qgd2FzIGNhbmNlbGxlZCAqLworCQl1c2JfZXBfZmlmb19mbHVzaChlcCk7CisKKwkvKiBIb2xkIHRoZSBsb2NrIHdoaWxlIHdlIHVwZGF0ZSB0aGUgcmVxdWVzdCBhbmQgYnVmZmVyIHN0YXRlcyAqLworCXNtcF93bWIoKTsKKwlzcGluX2xvY2soJmNvbW1vbi0+bG9jayk7CisJYmgtPmlucmVxX2J1c3kgPSAwOworCWJoLT5zdGF0ZSA9IEJVRl9TVEFURV9FTVBUWTsKKwl3YWtldXBfdGhyZWFkKGNvbW1vbik7CisJc3Bpbl91bmxvY2soJmNvbW1vbi0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1bGtfb3V0X2NvbXBsZXRlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgZnNnX2NvbW1vbgkqY29tbW9uID0gZXAtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBmc2dfYnVmZmhkCSpiaCA9IHJlcS0+Y29udGV4dDsKKworCWR1bXBfbXNnKGNvbW1vbiwgImJ1bGstb3V0IiwgcmVxLT5idWYsIHJlcS0+YWN0dWFsKTsKKwlpZiAocmVxLT5zdGF0dXMgfHwgcmVxLT5hY3R1YWwgIT0gYmgtPmJ1bGtfb3V0X2ludGVuZGVkX2xlbmd0aCkKKwkJREJHKGNvbW1vbiwgIiVzIC0tPiAlZCwgJXUvJXVcbiIsIF9fZnVuY19fLAorCQkJCXJlcS0+c3RhdHVzLCByZXEtPmFjdHVhbCwKKwkJCQliaC0+YnVsa19vdXRfaW50ZW5kZWRfbGVuZ3RoKTsKKwlpZiAocmVxLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQpCQkvKiBSZXF1ZXN0IHdhcyBjYW5jZWxsZWQgKi8KKwkJdXNiX2VwX2ZpZm9fZmx1c2goZXApOworCisJLyogSG9sZCB0aGUgbG9jayB3aGlsZSB3ZSB1cGRhdGUgdGhlIHJlcXVlc3QgYW5kIGJ1ZmZlciBzdGF0ZXMgKi8KKwlzbXBfd21iKCk7CisJc3Bpbl9sb2NrKCZjb21tb24tPmxvY2spOworCWJoLT5vdXRyZXFfYnVzeSA9IDA7CisJYmgtPnN0YXRlID0gQlVGX1NUQVRFX0ZVTEw7CisJd2FrZXVwX3RocmVhZChjb21tb24pOworCXNwaW5fdW5sb2NrKCZjb21tb24tPmxvY2spOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEVwMCBjbGFzcy1zcGVjaWZpYyBoYW5kbGVycy4gIFRoZXNlIGFsd2F5cyBydW4gaW5faXJxLiAqLworCitzdGF0aWMgaW50IGZzZ19zZXR1cChzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmLAorCQljb25zdCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdHJsKQoreworCXN0cnVjdCBmc2dfZGV2CQkqZnNnID0gZnNnX2Zyb21fZnVuYyhmKTsKKwlzdHJ1Y3QgdXNiX3JlcXVlc3QJKnJlcSA9IGZzZy0+Y29tbW9uLT5lcDByZXE7CisJdTE2CQkJd19pbmRleCA9IGxlMTZfdG9fY3B1KGN0cmwtPndJbmRleCk7CisJdTE2CQkJd192YWx1ZSA9IGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSk7CisJdTE2CQkJd19sZW5ndGggPSBsZTE2X3RvX2NwdShjdHJsLT53TGVuZ3RoKTsKKworCWlmICghZnNnLT5jb21tb24tPmNvbmZpZykKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJc3dpdGNoIChjdHJsLT5iUmVxdWVzdCkgeworCisJY2FzZSBVU0JfQlVMS19SRVNFVF9SRVFVRVNUOgorCQlpZiAoY3RybC0+YlJlcXVlc3RUeXBlICE9CisJCSAgICAoVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UpKQorCQkJYnJlYWs7CisJCWlmICh3X2luZGV4ICE9IGZzZy0+aW50ZXJmYWNlX251bWJlciB8fCB3X3ZhbHVlICE9IDApCisJCQlyZXR1cm4gLUVET007CisKKwkJLyogUmFpc2UgYW4gZXhjZXB0aW9uIHRvIHN0b3AgdGhlIGN1cnJlbnQgb3BlcmF0aW9uCisJCSAqIGFuZCByZWluaXRpYWxpemUgb3VyIHN0YXRlLiAqLworCQlEQkcoZnNnLCAiYnVsayByZXNldCByZXF1ZXN0XG4iKTsKKwkJcmFpc2VfZXhjZXB0aW9uKGZzZy0+Y29tbW9uLCBGU0dfU1RBVEVfUkVTRVQpOworCQlyZXR1cm4gREVMQVlFRF9TVEFUVVM7CisKKwljYXNlIFVTQl9CVUxLX0dFVF9NQVhfTFVOX1JFUVVFU1Q6CisJCWlmIChjdHJsLT5iUmVxdWVzdFR5cGUgIT0KKwkJICAgIChVU0JfRElSX0lOIHwgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFKSkKKwkJCWJyZWFrOworCQlpZiAod19pbmRleCAhPSBmc2ctPmludGVyZmFjZV9udW1iZXIgfHwgd192YWx1ZSAhPSAwKQorCQkJcmV0dXJuIC1FRE9NOworCQlWREJHKGZzZywgImdldCBtYXggTFVOXG4iKTsKKwkJKih1OCAqKSByZXEtPmJ1ZiA9IGZzZy0+Y29tbW9uLT5ubHVucyAtIDE7CisJCXJldHVybiAxOworCX0KKworCVZEQkcoZnNnLAorCSAgICAgInVua25vd24gY2xhc3Mtc3BlY2lmaWMgY29udHJvbCByZXEgIgorCSAgICAgIiUwMnguJTAyeCB2JTA0eCBpJTA0eCBsJXVcbiIsCisJICAgICBjdHJsLT5iUmVxdWVzdFR5cGUsIGN0cmwtPmJSZXF1ZXN0LAorCSAgICAgbGUxNl90b19jcHUoY3RybC0+d1ZhbHVlKSwgd19pbmRleCwgd19sZW5ndGgpOworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBBbGwgdGhlIGZvbGxvd2luZyByb3V0aW5lcyBydW4gaW4gcHJvY2VzcyBjb250ZXh0ICovCisKKworLyogVXNlIHRoaXMgZm9yIGJ1bGsgb3IgaW50ZXJydXB0IHRyYW5zZmVycywgbm90IGVwMCAqLworc3RhdGljIHZvaWQgc3RhcnRfdHJhbnNmZXIoc3RydWN0IGZzZ19kZXYgKmZzZywgc3RydWN0IHVzYl9lcCAqZXAsCisJCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxLCBpbnQgKnBidXN5LAorCQllbnVtIGZzZ19idWZmZXJfc3RhdGUgKnN0YXRlKQoreworCWludAlyYzsKKworCWlmIChlcCA9PSBmc2ctPmJ1bGtfaW4pCisJCWR1bXBfbXNnKGZzZywgImJ1bGstaW4iLCByZXEtPmJ1ZiwgcmVxLT5sZW5ndGgpOworCisJc3Bpbl9sb2NrX2lycSgmZnNnLT5jb21tb24tPmxvY2spOworCSpwYnVzeSA9IDE7CisJKnN0YXRlID0gQlVGX1NUQVRFX0JVU1k7CisJc3Bpbl91bmxvY2tfaXJxKCZmc2ctPmNvbW1vbi0+bG9jayk7CisJcmMgPSB1c2JfZXBfcXVldWUoZXAsIHJlcSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJjICE9IDApIHsKKwkJKnBidXN5ID0gMDsKKwkJKnN0YXRlID0gQlVGX1NUQVRFX0VNUFRZOworCisJCS8qIFdlIGNhbid0IGRvIG11Y2ggbW9yZSB0aGFuIHdhaXQgZm9yIGEgcmVzZXQgKi8KKworCQkvKiBOb3RlOiBjdXJyZW50bHkgdGhlIG5ldDIyODAgZHJpdmVyIGZhaWxzIHplcm8tbGVuZ3RoCisJCSAqIHN1Ym1pc3Npb25zIGlmIERNQSBpcyBlbmFibGVkLiAqLworCQlpZiAocmMgIT0gLUVTSFVURE9XTiAmJiAhKHJjID09IC1FT1BOT1RTVVBQICYmCisJCQkJCQlyZXEtPmxlbmd0aCA9PSAwKSkKKwkJCVdBUk5JTkcoZnNnLCAiZXJyb3IgaW4gc3VibWlzc2lvbjogJXMgLS0+ICVkXG4iLAorCQkJCQllcC0+bmFtZSwgcmMpOworCX0KK30KKworI2RlZmluZSBTVEFSVF9UUkFOU0ZFUl9PUihjb21tb24sIGVwX25hbWUsIHJlcSwgcGJ1c3ksIHN0YXRlKQkJXAorCWlmIChmc2dfaXNfc2V0KGNvbW1vbikpCQkJCQkJXAorCQlzdGFydF90cmFuc2ZlcigoY29tbW9uKS0+ZnNnLCAoY29tbW9uKS0+ZnNnLT5lcF9uYW1lLAlcCisJCQkgICAgICAgcmVxLCBwYnVzeSwgc3RhdGUpOwkJCVwKKwllbHNlCisKKyNkZWZpbmUgU1RBUlRfVFJBTlNGRVIoY29tbW9uLCBlcF9uYW1lLCByZXEsIHBidXN5LCBzdGF0ZSkJCVwKKwlTVEFSVF9UUkFOU0ZFUl9PUihjb21tb24sIGVwX25hbWUsIHJlcSwgcGJ1c3ksIHN0YXRlKSAodm9pZCkwCisKKworCitzdGF0aWMgaW50IHNsZWVwX3RocmVhZChzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uKQoreworCWludAlyYyA9IDA7CisKKwkvKiBXYWl0IHVudGlsIGEgc2lnbmFsIGFycml2ZXMgb3Igd2UgYXJlIHdva2VuIHVwICovCisJZm9yICg7OykgeworCQl0cnlfdG9fZnJlZXplKCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmMgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCQlpZiAoY29tbW9uLT50aHJlYWRfd2FrZXVwX25lZWRlZCkKKwkJCWJyZWFrOworCQlzY2hlZHVsZSgpOworCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJY29tbW9uLT50aHJlYWRfd2FrZXVwX25lZWRlZCA9IDA7CisJcmV0dXJuIHJjOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgZG9fcmVhZChzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uKQoreworCXN0cnVjdCBmc2dfbHVuCQkqY3VybHVuID0gY29tbW9uLT5jdXJsdW47CisJdTMyCQkJbGJhOworCXN0cnVjdCBmc2dfYnVmZmhkCSpiaDsKKwlpbnQJCQlyYzsKKwl1MzIJCQlhbW91bnRfbGVmdDsKKwlsb2ZmX3QJCQlmaWxlX29mZnNldCwgZmlsZV9vZmZzZXRfdG1wOworCXVuc2lnbmVkIGludAkJYW1vdW50OworCXVuc2lnbmVkIGludAkJcGFydGlhbF9wYWdlOworCXNzaXplX3QJCQlucmVhZDsKKworCS8qIEdldCB0aGUgc3RhcnRpbmcgTG9naWNhbCBCbG9jayBBZGRyZXNzIGFuZCBjaGVjayB0aGF0IGl0J3MKKwkgKiBub3QgdG9vIGJpZyAqLworCWlmIChjb21tb24tPmNtbmRbMF0gPT0gU0NfUkVBRF82KQorCQlsYmEgPSBnZXRfdW5hbGlnbmVkX2JlMjQoJmNvbW1vbi0+Y21uZFsxXSk7CisJZWxzZSB7CisJCWxiYSA9IGdldF91bmFsaWduZWRfYmUzMigmY29tbW9uLT5jbW5kWzJdKTsKKworCQkvKiBXZSBhbGxvdyBEUE8gKERpc2FibGUgUGFnZSBPdXQgPSBkb24ndCBzYXZlIGRhdGEgaW4gdGhlCisJCSAqIGNhY2hlKSBhbmQgRlVBIChGb3JjZSBVbml0IEFjY2VzcyA9IGRvbid0IHJlYWQgZnJvbSB0aGUKKwkJICogY2FjaGUpLCBidXQgd2UgZG9uJ3QgaW1wbGVtZW50IHRoZW0uICovCisJCWlmICgoY29tbW9uLT5jbW5kWzFdICYgfjB4MTgpICE9IDApIHsKKwkJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX0lOVkFMSURfRklFTERfSU5fQ0RCOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJaWYgKGxiYSA+PSBjdXJsdW4tPm51bV9zZWN0b3JzKSB7CisJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX0xPR0lDQUxfQkxPQ0tfQUREUkVTU19PVVRfT0ZfUkFOR0U7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlmaWxlX29mZnNldCA9ICgobG9mZl90KSBsYmEpIDw8IDk7CisKKwkvKiBDYXJyeSBvdXQgdGhlIGZpbGUgcmVhZHMgKi8KKwlhbW91bnRfbGVmdCA9IGNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZDsKKwlpZiAodW5saWtlbHkoYW1vdW50X2xlZnQgPT0gMCkpCisJCXJldHVybiAtRUlPOwkJLyogTm8gZGVmYXVsdCByZXBseSAqLworCisJZm9yICg7OykgeworCisJCS8qIEZpZ3VyZSBvdXQgaG93IG11Y2ggd2UgbmVlZCB0byByZWFkOgorCQkgKiBUcnkgdG8gcmVhZCB0aGUgcmVtYWluaW5nIGFtb3VudC4KKwkJICogQnV0IGRvbid0IHJlYWQgbW9yZSB0aGFuIHRoZSBidWZmZXIgc2l6ZS4KKwkJICogQW5kIGRvbid0IHRyeSB0byByZWFkIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKwkJICogRmluYWxseSwgaWYgd2UncmUgbm90IGF0IGEgcGFnZSBib3VuZGFyeSwgZG9uJ3QgcmVhZCBwYXN0CisJCSAqCXRoZSBuZXh0IHBhZ2UuCisJCSAqIElmIHRoaXMgbWVhbnMgcmVhZGluZyAwIHRoZW4gd2Ugd2VyZSBhc2tlZCB0byByZWFkIHBhc3QKKwkJICoJdGhlIGVuZCBvZiBmaWxlLiAqLworCQlhbW91bnQgPSBtaW4oYW1vdW50X2xlZnQsIEZTR19CVUZMRU4pOworCQlhbW91bnQgPSBtaW4oKGxvZmZfdCkgYW1vdW50LAorCQkJCWN1cmx1bi0+ZmlsZV9sZW5ndGggLSBmaWxlX29mZnNldCk7CisJCXBhcnRpYWxfcGFnZSA9IGZpbGVfb2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCQlpZiAocGFydGlhbF9wYWdlID4gMCkKKwkJCWFtb3VudCA9IG1pbihhbW91bnQsICh1bnNpZ25lZCBpbnQpIFBBR0VfQ0FDSEVfU0laRSAtCisJCQkJCXBhcnRpYWxfcGFnZSk7CisKKwkJLyogV2FpdCBmb3IgdGhlIG5leHQgYnVmZmVyIHRvIGJlY29tZSBhdmFpbGFibGUgKi8KKwkJYmggPSBjb21tb24tPm5leHRfYnVmZmhkX3RvX2ZpbGw7CisJCXdoaWxlIChiaC0+c3RhdGUgIT0gQlVGX1NUQVRFX0VNUFRZKSB7CisJCQlyYyA9IHNsZWVwX3RocmVhZChjb21tb24pOworCQkJaWYgKHJjKQorCQkJCXJldHVybiByYzsKKwkJfQorCisJCS8qIElmIHdlIHdlcmUgYXNrZWQgdG8gcmVhZCBwYXN0IHRoZSBlbmQgb2YgZmlsZSwKKwkJICogZW5kIHdpdGggYW4gZW1wdHkgYnVmZmVyLiAqLworCQlpZiAoYW1vdW50ID09IDApIHsKKwkJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9CisJCQkJCVNTX0xPR0lDQUxfQkxPQ0tfQUREUkVTU19PVVRfT0ZfUkFOR0U7CisJCQljdXJsdW4tPnNlbnNlX2RhdGFfaW5mbyA9IGZpbGVfb2Zmc2V0ID4+IDk7CisJCQljdXJsdW4tPmluZm9fdmFsaWQgPSAxOworCQkJYmgtPmlucmVxLT5sZW5ndGggPSAwOworCQkJYmgtPnN0YXRlID0gQlVGX1NUQVRFX0ZVTEw7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFBlcmZvcm0gdGhlIHJlYWQgKi8KKwkJZmlsZV9vZmZzZXRfdG1wID0gZmlsZV9vZmZzZXQ7CisJCW5yZWFkID0gdmZzX3JlYWQoY3VybHVuLT5maWxwLAorCQkJCShjaGFyIF9fdXNlciAqKSBiaC0+YnVmLAorCQkJCWFtb3VudCwgJmZpbGVfb2Zmc2V0X3RtcCk7CisJCVZMREJHKGN1cmx1biwgImZpbGUgcmVhZCAldSBAICVsbHUgLT4gJWRcbiIsIGFtb3VudCwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBmaWxlX29mZnNldCwKKwkJCQkoaW50KSBucmVhZCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRUlOVFI7CisKKwkJaWYgKG5yZWFkIDwgMCkgeworCQkJTERCRyhjdXJsdW4sICJlcnJvciBpbiBmaWxlIHJlYWQ6ICVkXG4iLAorCQkJCQkoaW50KSBucmVhZCk7CisJCQlucmVhZCA9IDA7CisJCX0gZWxzZSBpZiAobnJlYWQgPCBhbW91bnQpIHsKKwkJCUxEQkcoY3VybHVuLCAicGFydGlhbCBmaWxlIHJlYWQ6ICVkLyV1XG4iLAorCQkJCQkoaW50KSBucmVhZCwgYW1vdW50KTsKKwkJCW5yZWFkIC09IChucmVhZCAmIDUxMSk7CS8qIFJvdW5kIGRvd24gdG8gYSBibG9jayAqLworCQl9CisJCWZpbGVfb2Zmc2V0ICArPSBucmVhZDsKKwkJYW1vdW50X2xlZnQgIC09IG5yZWFkOworCQljb21tb24tPnJlc2lkdWUgLT0gbnJlYWQ7CisJCWJoLT5pbnJlcS0+bGVuZ3RoID0gbnJlYWQ7CisJCWJoLT5zdGF0ZSA9IEJVRl9TVEFURV9GVUxMOworCisJCS8qIElmIGFuIGVycm9yIG9jY3VycmVkLCByZXBvcnQgaXQgYW5kIGl0cyBwb3NpdGlvbiAqLworCQlpZiAobnJlYWQgPCBhbW91bnQpIHsKKwkJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX1VOUkVDT1ZFUkVEX1JFQURfRVJST1I7CisJCQljdXJsdW4tPnNlbnNlX2RhdGFfaW5mbyA9IGZpbGVfb2Zmc2V0ID4+IDk7CisJCQljdXJsdW4tPmluZm9fdmFsaWQgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoYW1vdW50X2xlZnQgPT0gMCkKKwkJCWJyZWFrOwkJLyogTm8gbW9yZSBsZWZ0IHRvIHJlYWQgKi8KKworCQkvKiBTZW5kIHRoaXMgYnVmZmVyIGFuZCBnbyByZWFkIHNvbWUgbW9yZSAqLworCQliaC0+aW5yZXEtPnplcm8gPSAwOworCQlTVEFSVF9UUkFOU0ZFUl9PUihjb21tb24sIGJ1bGtfaW4sIGJoLT5pbnJlcSwKKwkJCSAgICAgICAmYmgtPmlucmVxX2J1c3ksICZiaC0+c3RhdGUpCisJCQkvKiBEb24ndCBrbm93IHdoYXQgdG8gZG8gaWYKKwkJCSAqIGNvbW1vbi0+ZnNnIGlzIE5VTEwgKi8KKwkJCXJldHVybiAtRUlPOworCQljb21tb24tPm5leHRfYnVmZmhkX3RvX2ZpbGwgPSBiaC0+bmV4dDsKKwl9CisKKwlyZXR1cm4gLUVJTzsJCS8qIE5vIGRlZmF1bHQgcmVwbHkgKi8KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IGRvX3dyaXRlKHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24pCit7CisJc3RydWN0IGZzZ19sdW4JCSpjdXJsdW4gPSBjb21tb24tPmN1cmx1bjsKKwl1MzIJCQlsYmE7CisJc3RydWN0IGZzZ19idWZmaGQJKmJoOworCWludAkJCWdldF9zb21lX21vcmU7CisJdTMyCQkJYW1vdW50X2xlZnRfdG9fcmVxLCBhbW91bnRfbGVmdF90b193cml0ZTsKKwlsb2ZmX3QJCQl1c2Jfb2Zmc2V0LCBmaWxlX29mZnNldCwgZmlsZV9vZmZzZXRfdG1wOworCXVuc2lnbmVkIGludAkJYW1vdW50OworCXVuc2lnbmVkIGludAkJcGFydGlhbF9wYWdlOworCXNzaXplX3QJCQlud3JpdHRlbjsKKwlpbnQJCQlyYzsKKworCWlmIChjdXJsdW4tPnJvKSB7CisJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX1dSSVRFX1BST1RFQ1RFRDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXNwaW5fbG9jaygmY3VybHVuLT5maWxwLT5mX2xvY2spOworCWN1cmx1bi0+ZmlscC0+Zl9mbGFncyAmPSB+T19TWU5DOwkvKiBEZWZhdWx0IGlzIG5vdCB0byB3YWl0ICovCisJc3Bpbl91bmxvY2soJmN1cmx1bi0+ZmlscC0+Zl9sb2NrKTsKKworCS8qIEdldCB0aGUgc3RhcnRpbmcgTG9naWNhbCBCbG9jayBBZGRyZXNzIGFuZCBjaGVjayB0aGF0IGl0J3MKKwkgKiBub3QgdG9vIGJpZyAqLworCWlmIChjb21tb24tPmNtbmRbMF0gPT0gU0NfV1JJVEVfNikKKwkJbGJhID0gZ2V0X3VuYWxpZ25lZF9iZTI0KCZjb21tb24tPmNtbmRbMV0pOworCWVsc2UgeworCQlsYmEgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJmNvbW1vbi0+Y21uZFsyXSk7CisKKwkJLyogV2UgYWxsb3cgRFBPIChEaXNhYmxlIFBhZ2UgT3V0ID0gZG9uJ3Qgc2F2ZSBkYXRhIGluIHRoZQorCQkgKiBjYWNoZSkgYW5kIEZVQSAoRm9yY2UgVW5pdCBBY2Nlc3MgPSB3cml0ZSBkaXJlY3RseSB0byB0aGUKKwkJICogbWVkaXVtKS4gIFdlIGRvbid0IGltcGxlbWVudCBEUE87IHdlIGltcGxlbWVudCBGVUEgYnkKKwkJICogcGVyZm9ybWluZyBzeW5jaHJvbm91cyBvdXRwdXQuICovCisJCWlmIChjb21tb24tPmNtbmRbMV0gJiB+MHgxOCkgeworCQkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfSU5WQUxJRF9GSUVMRF9JTl9DREI7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoY29tbW9uLT5jbW5kWzFdICYgMHgwOCkgewkvKiBGVUEgKi8KKwkJCXNwaW5fbG9jaygmY3VybHVuLT5maWxwLT5mX2xvY2spOworCQkJY3VybHVuLT5maWxwLT5mX2ZsYWdzIHw9IE9fU1lOQzsKKwkJCXNwaW5fdW5sb2NrKCZjdXJsdW4tPmZpbHAtPmZfbG9jayk7CisJCX0KKwl9CisJaWYgKGxiYSA+PSBjdXJsdW4tPm51bV9zZWN0b3JzKSB7CisJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX0xPR0lDQUxfQkxPQ0tfQUREUkVTU19PVVRfT0ZfUkFOR0U7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENhcnJ5IG91dCB0aGUgZmlsZSB3cml0ZXMgKi8KKwlnZXRfc29tZV9tb3JlID0gMTsKKwlmaWxlX29mZnNldCA9IHVzYl9vZmZzZXQgPSAoKGxvZmZfdCkgbGJhKSA8PCA5OworCWFtb3VudF9sZWZ0X3RvX3JlcSA9IGNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZDsKKwlhbW91bnRfbGVmdF90b193cml0ZSA9IGNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZDsKKworCXdoaWxlIChhbW91bnRfbGVmdF90b193cml0ZSA+IDApIHsKKworCQkvKiBRdWV1ZSBhIHJlcXVlc3QgZm9yIG1vcmUgZGF0YSBmcm9tIHRoZSBob3N0ICovCisJCWJoID0gY29tbW9uLT5uZXh0X2J1ZmZoZF90b19maWxsOworCQlpZiAoYmgtPnN0YXRlID09IEJVRl9TVEFURV9FTVBUWSAmJiBnZXRfc29tZV9tb3JlKSB7CisKKwkJCS8qIEZpZ3VyZSBvdXQgaG93IG11Y2ggd2Ugd2FudCB0byBnZXQ6CisJCQkgKiBUcnkgdG8gZ2V0IHRoZSByZW1haW5pbmcgYW1vdW50LgorCQkJICogQnV0IGRvbid0IGdldCBtb3JlIHRoYW4gdGhlIGJ1ZmZlciBzaXplLgorCQkJICogQW5kIGRvbid0IHRyeSB0byBnbyBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisJCQkgKiBJZiB3ZSdyZSBub3QgYXQgYSBwYWdlIGJvdW5kYXJ5LAorCQkJICoJZG9uJ3QgZ28gcGFzdCB0aGUgbmV4dCBwYWdlLgorCQkJICogSWYgdGhpcyBtZWFucyBnZXR0aW5nIDAsIHRoZW4gd2Ugd2VyZSBhc2tlZAorCQkJICoJdG8gd3JpdGUgcGFzdCB0aGUgZW5kIG9mIGZpbGUuCisJCQkgKiBGaW5hbGx5LCByb3VuZCBkb3duIHRvIGEgYmxvY2sgYm91bmRhcnkuICovCisJCQlhbW91bnQgPSBtaW4oYW1vdW50X2xlZnRfdG9fcmVxLCBGU0dfQlVGTEVOKTsKKwkJCWFtb3VudCA9IG1pbigobG9mZl90KSBhbW91bnQsIGN1cmx1bi0+ZmlsZV9sZW5ndGggLQorCQkJCQl1c2Jfb2Zmc2V0KTsKKwkJCXBhcnRpYWxfcGFnZSA9IHVzYl9vZmZzZXQgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJCQlpZiAocGFydGlhbF9wYWdlID4gMCkKKwkJCQlhbW91bnQgPSBtaW4oYW1vdW50LAorCSh1bnNpZ25lZCBpbnQpIFBBR0VfQ0FDSEVfU0laRSAtIHBhcnRpYWxfcGFnZSk7CisKKwkJCWlmIChhbW91bnQgPT0gMCkgeworCQkJCWdldF9zb21lX21vcmUgPSAwOworCQkJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9CisJCQkJCVNTX0xPR0lDQUxfQkxPQ0tfQUREUkVTU19PVVRfT0ZfUkFOR0U7CisJCQkJY3VybHVuLT5zZW5zZV9kYXRhX2luZm8gPSB1c2Jfb2Zmc2V0ID4+IDk7CisJCQkJY3VybHVuLT5pbmZvX3ZhbGlkID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWFtb3VudCAtPSAoYW1vdW50ICYgNTExKTsKKwkJCWlmIChhbW91bnQgPT0gMCkgeworCisJCQkJLyogV2h5IHdlcmUgd2Ugd2VyZSBhc2tlZCB0byB0cmFuc2ZlciBhCisJCQkJICogcGFydGlhbCBibG9jaz8gKi8KKwkJCQlnZXRfc29tZV9tb3JlID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogR2V0IHRoZSBuZXh0IGJ1ZmZlciAqLworCQkJdXNiX29mZnNldCArPSBhbW91bnQ7CisJCQljb21tb24tPnVzYl9hbW91bnRfbGVmdCAtPSBhbW91bnQ7CisJCQlhbW91bnRfbGVmdF90b19yZXEgLT0gYW1vdW50OworCQkJaWYgKGFtb3VudF9sZWZ0X3RvX3JlcSA9PSAwKQorCQkJCWdldF9zb21lX21vcmUgPSAwOworCisJCQkvKiBhbW91bnQgaXMgYWx3YXlzIGRpdmlzaWJsZSBieSA1MTIsIGhlbmNlIGJ5CisJCQkgKiB0aGUgYnVsay1vdXQgbWF4cGFja2V0IHNpemUgKi8KKwkJCWJoLT5vdXRyZXEtPmxlbmd0aCA9IGFtb3VudDsKKwkJCWJoLT5idWxrX291dF9pbnRlbmRlZF9sZW5ndGggPSBhbW91bnQ7CisJCQliaC0+b3V0cmVxLT5zaG9ydF9ub3Rfb2sgPSAxOworCQkJU1RBUlRfVFJBTlNGRVJfT1IoY29tbW9uLCBidWxrX291dCwgYmgtPm91dHJlcSwKKwkJCQkJICAmYmgtPm91dHJlcV9idXN5LCAmYmgtPnN0YXRlKQorCQkJCS8qIERvbid0IGtub3cgd2hhdCB0byBkbyBpZgorCQkJCSAqIGNvbW1vbi0+ZnNnIGlzIE5VTEwgKi8KKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWNvbW1vbi0+bmV4dF9idWZmaGRfdG9fZmlsbCA9IGJoLT5uZXh0OworCQkJY29udGludWU7CisJCX0KKworCQkvKiBXcml0ZSB0aGUgcmVjZWl2ZWQgZGF0YSB0byB0aGUgYmFja2luZyBmaWxlICovCisJCWJoID0gY29tbW9uLT5uZXh0X2J1ZmZoZF90b19kcmFpbjsKKwkJaWYgKGJoLT5zdGF0ZSA9PSBCVUZfU1RBVEVfRU1QVFkgJiYgIWdldF9zb21lX21vcmUpCisJCQlicmVhazsJCQkvKiBXZSBzdG9wcGVkIGVhcmx5ICovCisJCWlmIChiaC0+c3RhdGUgPT0gQlVGX1NUQVRFX0ZVTEwpIHsKKwkJCXNtcF9ybWIoKTsKKwkJCWNvbW1vbi0+bmV4dF9idWZmaGRfdG9fZHJhaW4gPSBiaC0+bmV4dDsKKwkJCWJoLT5zdGF0ZSA9IEJVRl9TVEFURV9FTVBUWTsKKworCQkJLyogRGlkIHNvbWV0aGluZyBnbyB3cm9uZyB3aXRoIHRoZSB0cmFuc2Zlcj8gKi8KKwkJCWlmIChiaC0+b3V0cmVxLT5zdGF0dXMgIT0gMCkgeworCQkJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX0NPTU1VTklDQVRJT05fRkFJTFVSRTsKKwkJCQljdXJsdW4tPnNlbnNlX2RhdGFfaW5mbyA9IGZpbGVfb2Zmc2V0ID4+IDk7CisJCQkJY3VybHVuLT5pbmZvX3ZhbGlkID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJYW1vdW50ID0gYmgtPm91dHJlcS0+YWN0dWFsOworCQkJaWYgKGN1cmx1bi0+ZmlsZV9sZW5ndGggLSBmaWxlX29mZnNldCA8IGFtb3VudCkgeworCQkJCUxFUlJPUihjdXJsdW4sCisJIndyaXRlICV1IEAgJWxsdSBiZXlvbmQgZW5kICVsbHVcbiIsCisJYW1vdW50LCAodW5zaWduZWQgbG9uZyBsb25nKSBmaWxlX29mZnNldCwKKwkodW5zaWduZWQgbG9uZyBsb25nKSBjdXJsdW4tPmZpbGVfbGVuZ3RoKTsKKwkJCQlhbW91bnQgPSBjdXJsdW4tPmZpbGVfbGVuZ3RoIC0gZmlsZV9vZmZzZXQ7CisJCQl9CisKKwkJCS8qIFBlcmZvcm0gdGhlIHdyaXRlICovCisJCQlmaWxlX29mZnNldF90bXAgPSBmaWxlX29mZnNldDsKKwkJCW53cml0dGVuID0gdmZzX3dyaXRlKGN1cmx1bi0+ZmlscCwKKwkJCQkJKGNoYXIgX191c2VyICopIGJoLT5idWYsCisJCQkJCWFtb3VudCwgJmZpbGVfb2Zmc2V0X3RtcCk7CisJCQlWTERCRyhjdXJsdW4sICJmaWxlIHdyaXRlICV1IEAgJWxsdSAtPiAlZFxuIiwgYW1vdW50LAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBmaWxlX29mZnNldCwKKwkJCQkJKGludCkgbndyaXR0ZW4pOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiAtRUlOVFI7CQkvKiBJbnRlcnJ1cHRlZCEgKi8KKworCQkJaWYgKG53cml0dGVuIDwgMCkgeworCQkJCUxEQkcoY3VybHVuLCAiZXJyb3IgaW4gZmlsZSB3cml0ZTogJWRcbiIsCisJCQkJCQkoaW50KSBud3JpdHRlbik7CisJCQkJbndyaXR0ZW4gPSAwOworCQkJfSBlbHNlIGlmIChud3JpdHRlbiA8IGFtb3VudCkgeworCQkJCUxEQkcoY3VybHVuLCAicGFydGlhbCBmaWxlIHdyaXRlOiAlZC8ldVxuIiwKKwkJCQkJCShpbnQpIG53cml0dGVuLCBhbW91bnQpOworCQkJCW53cml0dGVuIC09IChud3JpdHRlbiAmIDUxMSk7CisJCQkJLyogUm91bmQgZG93biB0byBhIGJsb2NrICovCisJCQl9CisJCQlmaWxlX29mZnNldCArPSBud3JpdHRlbjsKKwkJCWFtb3VudF9sZWZ0X3RvX3dyaXRlIC09IG53cml0dGVuOworCQkJY29tbW9uLT5yZXNpZHVlIC09IG53cml0dGVuOworCisJCQkvKiBJZiBhbiBlcnJvciBvY2N1cnJlZCwgcmVwb3J0IGl0IGFuZCBpdHMgcG9zaXRpb24gKi8KKwkJCWlmIChud3JpdHRlbiA8IGFtb3VudCkgeworCQkJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX1dSSVRFX0VSUk9SOworCQkJCWN1cmx1bi0+c2Vuc2VfZGF0YV9pbmZvID0gZmlsZV9vZmZzZXQgPj4gOTsKKwkJCQljdXJsdW4tPmluZm9fdmFsaWQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBEaWQgdGhlIGhvc3QgZGVjaWRlIHRvIHN0b3AgZWFybHk/ICovCisJCQlpZiAoYmgtPm91dHJlcS0+YWN0dWFsICE9IGJoLT5vdXRyZXEtPmxlbmd0aCkgeworCQkJCWNvbW1vbi0+c2hvcnRfcGFja2V0X3JlY2VpdmVkID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogV2FpdCBmb3Igc29tZXRoaW5nIHRvIGhhcHBlbiAqLworCQlyYyA9IHNsZWVwX3RocmVhZChjb21tb24pOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIC1FSU87CQkvKiBObyBkZWZhdWx0IHJlcGx5ICovCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBkb19zeW5jaHJvbml6ZV9jYWNoZShzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uKQoreworCXN0cnVjdCBmc2dfbHVuCSpjdXJsdW4gPSBjb21tb24tPmN1cmx1bjsKKwlpbnQJCXJjOworCisJLyogV2UgaWdub3JlIHRoZSByZXF1ZXN0ZWQgTEJBIGFuZCB3cml0ZSBvdXQgYWxsIGZpbGUncworCSAqIGRpcnR5IGRhdGEgYnVmZmVycy4gKi8KKwlyYyA9IGZzZ19sdW5fZnN5bmNfc3ViKGN1cmx1bik7CisJaWYgKHJjKQorCQljdXJsdW4tPnNlbnNlX2RhdGEgPSBTU19XUklURV9FUlJPUjsKKwlyZXR1cm4gMDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBpbnZhbGlkYXRlX3N1YihzdHJ1Y3QgZnNnX2x1biAqY3VybHVuKQoreworCXN0cnVjdCBmaWxlCSpmaWxwID0gY3VybHVuLT5maWxwOworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCXVuc2lnbmVkIGxvbmcJcmM7CisKKwlyYyA9IGludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhpbm9kZS0+aV9tYXBwaW5nLCAwLCAtMSk7CisJVkxEQkcoY3VybHVuLCAiaW52YWxpZGF0ZV9pbm9kZV9wYWdlcyAtPiAlbGRcbiIsIHJjKTsKK30KKworc3RhdGljIGludCBkb192ZXJpZnkoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbikKK3sKKwlzdHJ1Y3QgZnNnX2x1bgkJKmN1cmx1biA9IGNvbW1vbi0+Y3VybHVuOworCXUzMgkJCWxiYTsKKwl1MzIJCQl2ZXJpZmljYXRpb25fbGVuZ3RoOworCXN0cnVjdCBmc2dfYnVmZmhkCSpiaCA9IGNvbW1vbi0+bmV4dF9idWZmaGRfdG9fZmlsbDsKKwlsb2ZmX3QJCQlmaWxlX29mZnNldCwgZmlsZV9vZmZzZXRfdG1wOworCXUzMgkJCWFtb3VudF9sZWZ0OworCXVuc2lnbmVkIGludAkJYW1vdW50OworCXNzaXplX3QJCQlucmVhZDsKKworCS8qIEdldCB0aGUgc3RhcnRpbmcgTG9naWNhbCBCbG9jayBBZGRyZXNzIGFuZCBjaGVjayB0aGF0IGl0J3MKKwkgKiBub3QgdG9vIGJpZyAqLworCWxiYSA9IGdldF91bmFsaWduZWRfYmUzMigmY29tbW9uLT5jbW5kWzJdKTsKKwlpZiAobGJhID49IGN1cmx1bi0+bnVtX3NlY3RvcnMpIHsKKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfTE9HSUNBTF9CTE9DS19BRERSRVNTX09VVF9PRl9SQU5HRTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogV2UgYWxsb3cgRFBPIChEaXNhYmxlIFBhZ2UgT3V0ID0gZG9uJ3Qgc2F2ZSBkYXRhIGluIHRoZQorCSAqIGNhY2hlKSBidXQgd2UgZG9uJ3QgaW1wbGVtZW50IGl0LiAqLworCWlmIChjb21tb24tPmNtbmRbMV0gJiB+MHgxMCkgeworCQljdXJsdW4tPnNlbnNlX2RhdGEgPSBTU19JTlZBTElEX0ZJRUxEX0lOX0NEQjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdmVyaWZpY2F0aW9uX2xlbmd0aCA9IGdldF91bmFsaWduZWRfYmUxNigmY29tbW9uLT5jbW5kWzddKTsKKwlpZiAodW5saWtlbHkodmVyaWZpY2F0aW9uX2xlbmd0aCA9PSAwKSkKKwkJcmV0dXJuIC1FSU87CQkvKiBObyBkZWZhdWx0IHJlcGx5ICovCisKKwkvKiBQcmVwYXJlIHRvIGNhcnJ5IG91dCB0aGUgZmlsZSB2ZXJpZnkgKi8KKwlhbW91bnRfbGVmdCA9IHZlcmlmaWNhdGlvbl9sZW5ndGggPDwgOTsKKwlmaWxlX29mZnNldCA9ICgobG9mZl90KSBsYmEpIDw8IDk7CisKKwkvKiBXcml0ZSBvdXQgYWxsIHRoZSBkaXJ0eSBidWZmZXJzIGJlZm9yZSBpbnZhbGlkYXRpbmcgdGhlbSAqLworCWZzZ19sdW5fZnN5bmNfc3ViKGN1cmx1bik7CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVJTlRSOworCisJaW52YWxpZGF0ZV9zdWIoY3VybHVuKTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJldHVybiAtRUlOVFI7CisKKwkvKiBKdXN0IHRyeSB0byByZWFkIHRoZSByZXF1ZXN0ZWQgYmxvY2tzICovCisJd2hpbGUgKGFtb3VudF9sZWZ0ID4gMCkgeworCisJCS8qIEZpZ3VyZSBvdXQgaG93IG11Y2ggd2UgbmVlZCB0byByZWFkOgorCQkgKiBUcnkgdG8gcmVhZCB0aGUgcmVtYWluaW5nIGFtb3VudCwgYnV0IG5vdCBtb3JlIHRoYW4KKwkJICogdGhlIGJ1ZmZlciBzaXplLgorCQkgKiBBbmQgZG9uJ3QgdHJ5IHRvIHJlYWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgorCQkgKiBJZiB0aGlzIG1lYW5zIHJlYWRpbmcgMCB0aGVuIHdlIHdlcmUgYXNrZWQgdG8gcmVhZAorCQkgKiBwYXN0IHRoZSBlbmQgb2YgZmlsZS4gKi8KKwkJYW1vdW50ID0gbWluKGFtb3VudF9sZWZ0LCBGU0dfQlVGTEVOKTsKKwkJYW1vdW50ID0gbWluKChsb2ZmX3QpIGFtb3VudCwKKwkJCQljdXJsdW4tPmZpbGVfbGVuZ3RoIC0gZmlsZV9vZmZzZXQpOworCQlpZiAoYW1vdW50ID09IDApIHsKKwkJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9CisJCQkJCVNTX0xPR0lDQUxfQkxPQ0tfQUREUkVTU19PVVRfT0ZfUkFOR0U7CisJCQljdXJsdW4tPnNlbnNlX2RhdGFfaW5mbyA9IGZpbGVfb2Zmc2V0ID4+IDk7CisJCQljdXJsdW4tPmluZm9fdmFsaWQgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBQZXJmb3JtIHRoZSByZWFkICovCisJCWZpbGVfb2Zmc2V0X3RtcCA9IGZpbGVfb2Zmc2V0OworCQlucmVhZCA9IHZmc19yZWFkKGN1cmx1bi0+ZmlscCwKKwkJCQkoY2hhciBfX3VzZXIgKikgYmgtPmJ1ZiwKKwkJCQlhbW91bnQsICZmaWxlX29mZnNldF90bXApOworCQlWTERCRyhjdXJsdW4sICJmaWxlIHJlYWQgJXUgQCAlbGx1IC0+ICVkXG4iLCBhbW91bnQsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgZmlsZV9vZmZzZXQsCisJCQkJKGludCkgbnJlYWQpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVJTlRSOworCisJCWlmIChucmVhZCA8IDApIHsKKwkJCUxEQkcoY3VybHVuLCAiZXJyb3IgaW4gZmlsZSB2ZXJpZnk6ICVkXG4iLAorCQkJCQkoaW50KSBucmVhZCk7CisJCQlucmVhZCA9IDA7CisJCX0gZWxzZSBpZiAobnJlYWQgPCBhbW91bnQpIHsKKwkJCUxEQkcoY3VybHVuLCAicGFydGlhbCBmaWxlIHZlcmlmeTogJWQvJXVcbiIsCisJCQkJCShpbnQpIG5yZWFkLCBhbW91bnQpOworCQkJbnJlYWQgLT0gKG5yZWFkICYgNTExKTsJLyogUm91bmQgZG93biB0byBhIHNlY3RvciAqLworCQl9CisJCWlmIChucmVhZCA9PSAwKSB7CisJCQljdXJsdW4tPnNlbnNlX2RhdGEgPSBTU19VTlJFQ09WRVJFRF9SRUFEX0VSUk9SOworCQkJY3VybHVuLT5zZW5zZV9kYXRhX2luZm8gPSBmaWxlX29mZnNldCA+PiA5OworCQkJY3VybHVuLT5pbmZvX3ZhbGlkID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWZpbGVfb2Zmc2V0ICs9IG5yZWFkOworCQlhbW91bnRfbGVmdCAtPSBucmVhZDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBkb19pbnF1aXJ5KHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24sIHN0cnVjdCBmc2dfYnVmZmhkICpiaCkKK3sKKwlzdHJ1Y3QgZnNnX2x1biAqY3VybHVuID0gY29tbW9uLT5jdXJsdW47CisJdTgJKmJ1ZiA9ICh1OCAqKSBiaC0+YnVmOworCisJaWYgKCFjdXJsdW4pIHsJCS8qIFVuc3VwcG9ydGVkIExVTnMgYXJlIG9rYXkgKi8KKwkJY29tbW9uLT5iYWRfbHVuX29rYXkgPSAxOworCQltZW1zZXQoYnVmLCAwLCAzNik7CisJCWJ1ZlswXSA9IDB4N2Y7CQkvKiBVbnN1cHBvcnRlZCwgbm8gZGV2aWNlLXR5cGUgKi8KKwkJYnVmWzRdID0gMzE7CQkvKiBBZGRpdGlvbmFsIGxlbmd0aCAqLworCQlyZXR1cm4gMzY7CisJfQorCisJYnVmWzBdID0gY3VybHVuLT5jZHJvbSA/IFRZUEVfQ0RST00gOiBUWVBFX0RJU0s7CisJYnVmWzFdID0gY3VybHVuLT5yZW1vdmFibGUgPyAweDgwIDogMDsKKwlidWZbMl0gPSAyOwkJLyogQU5TSSBTQ1NJIGxldmVsIDIgKi8KKwlidWZbM10gPSAyOwkJLyogU0NTSS0yIElOUVVJUlkgZGF0YSBmb3JtYXQgKi8KKwlidWZbNF0gPSAzMTsJCS8qIEFkZGl0aW9uYWwgbGVuZ3RoICovCisJYnVmWzVdID0gMDsJCS8qIE5vIHNwZWNpYWwgb3B0aW9ucyAqLworCWJ1Zls2XSA9IDA7CisJYnVmWzddID0gMDsKKwltZW1jcHkoYnVmICsgOCwgY29tbW9uLT5pbnF1aXJ5X3N0cmluZywgc2l6ZW9mIGNvbW1vbi0+aW5xdWlyeV9zdHJpbmcpOworCXJldHVybiAzNjsKK30KKworCitzdGF0aWMgaW50IGRvX3JlcXVlc3Rfc2Vuc2Uoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbiwgc3RydWN0IGZzZ19idWZmaGQgKmJoKQoreworCXN0cnVjdCBmc2dfbHVuCSpjdXJsdW4gPSBjb21tb24tPmN1cmx1bjsKKwl1OAkJKmJ1ZiA9ICh1OCAqKSBiaC0+YnVmOworCXUzMgkJc2QsIHNkaW5mbzsKKwlpbnQJCXZhbGlkOworCisJLyoKKwkgKiBGcm9tIHRoZSBTQ1NJLTIgc3BlYy4sIHNlY3Rpb24gNy45IChVbml0IGF0dGVudGlvbiBjb25kaXRpb24pOgorCSAqCisJICogSWYgYSBSRVFVRVNUIFNFTlNFIGNvbW1hbmQgaXMgcmVjZWl2ZWQgZnJvbSBhbiBpbml0aWF0b3IKKwkgKiB3aXRoIGEgcGVuZGluZyB1bml0IGF0dGVudGlvbiBjb25kaXRpb24gKGJlZm9yZSB0aGUgdGFyZ2V0CisJICogZ2VuZXJhdGVzIHRoZSBjb250aW5nZW50IGFsbGVnaWFuY2UgY29uZGl0aW9uKSwgdGhlbiB0aGUKKwkgKiB0YXJnZXQgc2hhbGwgZWl0aGVyOgorCSAqICAgYSkgcmVwb3J0IGFueSBwZW5kaW5nIHNlbnNlIGRhdGEgYW5kIHByZXNlcnZlIHRoZSB1bml0CisJICoJYXR0ZW50aW9uIGNvbmRpdGlvbiBvbiB0aGUgbG9naWNhbCB1bml0LCBvciwKKwkgKiAgIGIpIHJlcG9ydCB0aGUgdW5pdCBhdHRlbnRpb24gY29uZGl0aW9uLCBtYXkgZGlzY2FyZCBhbnkKKwkgKglwZW5kaW5nIHNlbnNlIGRhdGEsIGFuZCBjbGVhciB0aGUgdW5pdCBhdHRlbnRpb24KKwkgKgljb25kaXRpb24gb24gdGhlIGxvZ2ljYWwgdW5pdCBmb3IgdGhhdCBpbml0aWF0b3IuCisJICoKKwkgKiBGU0cgbm9ybWFsbHkgdXNlcyBvcHRpb24gYSk7IGVuYWJsZSB0aGlzIGNvZGUgdG8gdXNlIG9wdGlvbiBiKS4KKwkgKi8KKyNpZiAwCisJaWYgKGN1cmx1biAmJiBjdXJsdW4tPnVuaXRfYXR0ZW50aW9uX2RhdGEgIT0gU1NfTk9fU0VOU0UpIHsKKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gY3VybHVuLT51bml0X2F0dGVudGlvbl9kYXRhOworCQljdXJsdW4tPnVuaXRfYXR0ZW50aW9uX2RhdGEgPSBTU19OT19TRU5TRTsKKwl9CisjZW5kaWYKKworCWlmICghY3VybHVuKSB7CQkvKiBVbnN1cHBvcnRlZCBMVU5zIGFyZSBva2F5ICovCisJCWNvbW1vbi0+YmFkX2x1bl9va2F5ID0gMTsKKwkJc2QgPSBTU19MT0dJQ0FMX1VOSVRfTk9UX1NVUFBPUlRFRDsKKwkJc2RpbmZvID0gMDsKKwkJdmFsaWQgPSAwOworCX0gZWxzZSB7CisJCXNkID0gY3VybHVuLT5zZW5zZV9kYXRhOworCQlzZGluZm8gPSBjdXJsdW4tPnNlbnNlX2RhdGFfaW5mbzsKKwkJdmFsaWQgPSBjdXJsdW4tPmluZm9fdmFsaWQgPDwgNzsKKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfTk9fU0VOU0U7CisJCWN1cmx1bi0+c2Vuc2VfZGF0YV9pbmZvID0gMDsKKwkJY3VybHVuLT5pbmZvX3ZhbGlkID0gMDsKKwl9CisKKwltZW1zZXQoYnVmLCAwLCAxOCk7CisJYnVmWzBdID0gdmFsaWQgfCAweDcwOwkJCS8qIFZhbGlkLCBjdXJyZW50IGVycm9yICovCisJYnVmWzJdID0gU0soc2QpOworCXB1dF91bmFsaWduZWRfYmUzMihzZGluZm8sICZidWZbM10pOwkvKiBTZW5zZSBpbmZvcm1hdGlvbiAqLworCWJ1Zls3XSA9IDE4IC0gODsJCQkvKiBBZGRpdGlvbmFsIHNlbnNlIGxlbmd0aCAqLworCWJ1ZlsxMl0gPSBBU0Moc2QpOworCWJ1ZlsxM10gPSBBU0NRKHNkKTsKKwlyZXR1cm4gMTg7Cit9CisKKworc3RhdGljIGludCBkb19yZWFkX2NhcGFjaXR5KHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24sIHN0cnVjdCBmc2dfYnVmZmhkICpiaCkKK3sKKwlzdHJ1Y3QgZnNnX2x1bgkqY3VybHVuID0gY29tbW9uLT5jdXJsdW47CisJdTMyCQlsYmEgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJmNvbW1vbi0+Y21uZFsyXSk7CisJaW50CQlwbWkgPSBjb21tb24tPmNtbmRbOF07CisJdTgJCSpidWYgPSAodTggKikgYmgtPmJ1ZjsKKworCS8qIENoZWNrIHRoZSBQTUkgYW5kIExCQSBmaWVsZHMgKi8KKwlpZiAocG1pID4gMSB8fCAocG1pID09IDAgJiYgbGJhICE9IDApKSB7CisJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX0lOVkFMSURfRklFTERfSU5fQ0RCOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwdXRfdW5hbGlnbmVkX2JlMzIoY3VybHVuLT5udW1fc2VjdG9ycyAtIDEsICZidWZbMF0pOworCQkJCQkJLyogTWF4IGxvZ2ljYWwgYmxvY2sgKi8KKwlwdXRfdW5hbGlnbmVkX2JlMzIoNTEyLCAmYnVmWzRdKTsJLyogQmxvY2sgbGVuZ3RoICovCisJcmV0dXJuIDg7Cit9CisKKworc3RhdGljIGludCBkb19yZWFkX2hlYWRlcihzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uLCBzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmgpCit7CisJc3RydWN0IGZzZ19sdW4JKmN1cmx1biA9IGNvbW1vbi0+Y3VybHVuOworCWludAkJbXNmID0gY29tbW9uLT5jbW5kWzFdICYgMHgwMjsKKwl1MzIJCWxiYSA9IGdldF91bmFsaWduZWRfYmUzMigmY29tbW9uLT5jbW5kWzJdKTsKKwl1OAkJKmJ1ZiA9ICh1OCAqKSBiaC0+YnVmOworCisJaWYgKGNvbW1vbi0+Y21uZFsxXSAmIH4weDAyKSB7CQkvKiBNYXNrIGF3YXkgTVNGICovCisJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX0lOVkFMSURfRklFTERfSU5fQ0RCOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGxiYSA+PSBjdXJsdW4tPm51bV9zZWN0b3JzKSB7CisJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX0xPR0lDQUxfQkxPQ0tfQUREUkVTU19PVVRfT0ZfUkFOR0U7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1lbXNldChidWYsIDAsIDgpOworCWJ1ZlswXSA9IDB4MDE7CQkvKiAyMDQ4IGJ5dGVzIG9mIHVzZXIgZGF0YSwgcmVzdCBpcyBFQyAqLworCXN0b3JlX2Nkcm9tX2FkZHJlc3MoJmJ1Zls0XSwgbXNmLCBsYmEpOworCXJldHVybiA4OworfQorCisKK3N0YXRpYyBpbnQgZG9fcmVhZF90b2Moc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbiwgc3RydWN0IGZzZ19idWZmaGQgKmJoKQoreworCXN0cnVjdCBmc2dfbHVuCSpjdXJsdW4gPSBjb21tb24tPmN1cmx1bjsKKwlpbnQJCW1zZiA9IGNvbW1vbi0+Y21uZFsxXSAmIDB4MDI7CisJaW50CQlzdGFydF90cmFjayA9IGNvbW1vbi0+Y21uZFs2XTsKKwl1OAkJKmJ1ZiA9ICh1OCAqKSBiaC0+YnVmOworCisJaWYgKChjb21tb24tPmNtbmRbMV0gJiB+MHgwMikgIT0gMCB8fAkvKiBNYXNrIGF3YXkgTVNGICovCisJCQlzdGFydF90cmFjayA+IDEpIHsKKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfSU5WQUxJRF9GSUVMRF9JTl9DREI7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1lbXNldChidWYsIDAsIDIwKTsKKwlidWZbMV0gPSAoMjAtMik7CQkvKiBUT0MgZGF0YSBsZW5ndGggKi8KKwlidWZbMl0gPSAxOwkJCS8qIEZpcnN0IHRyYWNrIG51bWJlciAqLworCWJ1ZlszXSA9IDE7CQkJLyogTGFzdCB0cmFjayBudW1iZXIgKi8KKwlidWZbNV0gPSAweDE2OwkJCS8qIERhdGEgdHJhY2ssIGNvcHlpbmcgYWxsb3dlZCAqLworCWJ1Zls2XSA9IDB4MDE7CQkJLyogT25seSB0cmFjayBpcyBudW1iZXIgMSAqLworCXN0b3JlX2Nkcm9tX2FkZHJlc3MoJmJ1Zls4XSwgbXNmLCAwKTsKKworCWJ1ZlsxM10gPSAweDE2OwkJCS8qIExlYWQtb3V0IHRyYWNrIGlzIGRhdGEgKi8KKwlidWZbMTRdID0gMHhBQTsJCQkvKiBMZWFkLW91dCB0cmFjayBudW1iZXIgKi8KKwlzdG9yZV9jZHJvbV9hZGRyZXNzKCZidWZbMTZdLCBtc2YsIGN1cmx1bi0+bnVtX3NlY3RvcnMpOworCXJldHVybiAyMDsKK30KKworCitzdGF0aWMgaW50IGRvX21vZGVfc2Vuc2Uoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbiwgc3RydWN0IGZzZ19idWZmaGQgKmJoKQoreworCXN0cnVjdCBmc2dfbHVuCSpjdXJsdW4gPSBjb21tb24tPmN1cmx1bjsKKwlpbnQJCW1zY21uZCA9IGNvbW1vbi0+Y21uZFswXTsKKwl1OAkJKmJ1ZiA9ICh1OCAqKSBiaC0+YnVmOworCXU4CQkqYnVmMCA9IGJ1ZjsKKwlpbnQJCXBjLCBwYWdlX2NvZGU7CisJaW50CQljaGFuZ2VhYmxlX3ZhbHVlcywgYWxsX3BhZ2VzOworCWludAkJdmFsaWRfcGFnZSA9IDA7CisJaW50CQlsZW4sIGxpbWl0OworCisJaWYgKChjb21tb24tPmNtbmRbMV0gJiB+MHgwOCkgIT0gMCkgewkvKiBNYXNrIGF3YXkgREJEICovCisJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX0lOVkFMSURfRklFTERfSU5fQ0RCOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcGMgPSBjb21tb24tPmNtbmRbMl0gPj4gNjsKKwlwYWdlX2NvZGUgPSBjb21tb24tPmNtbmRbMl0gJiAweDNmOworCWlmIChwYyA9PSAzKSB7CisJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX1NBVklOR19QQVJBTUVURVJTX05PVF9TVVBQT1JURUQ7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljaGFuZ2VhYmxlX3ZhbHVlcyA9IChwYyA9PSAxKTsKKwlhbGxfcGFnZXMgPSAocGFnZV9jb2RlID09IDB4M2YpOworCisJLyogV3JpdGUgdGhlIG1vZGUgcGFyYW1ldGVyIGhlYWRlci4gIEZpeGVkIHZhbHVlcyBhcmU6IGRlZmF1bHQKKwkgKiBtZWRpdW0gdHlwZSwgbm8gY2FjaGUgY29udHJvbCAoRFBPRlVBKSwgYW5kIG5vIGJsb2NrIGRlc2NyaXB0b3JzLgorCSAqIFRoZSBvbmx5IHZhcmlhYmxlIHZhbHVlIGlzIHRoZSBXcml0ZVByb3RlY3QgYml0LiAgV2Ugd2lsbCBmaWxsIGluCisJICogdGhlIG1vZGUgZGF0YSBsZW5ndGggbGF0ZXIuICovCisJbWVtc2V0KGJ1ZiwgMCwgOCk7CisJaWYgKG1zY21uZCA9PSBTQ19NT0RFX1NFTlNFXzYpIHsKKwkJYnVmWzJdID0gKGN1cmx1bi0+cm8gPyAweDgwIDogMHgwMCk7CQkvKiBXUCwgRFBPRlVBICovCisJCWJ1ZiArPSA0OworCQlsaW1pdCA9IDI1NTsKKwl9IGVsc2UgewkJCS8qIFNDX01PREVfU0VOU0VfMTAgKi8KKwkJYnVmWzNdID0gKGN1cmx1bi0+cm8gPyAweDgwIDogMHgwMCk7CQkvKiBXUCwgRFBPRlVBICovCisJCWJ1ZiArPSA4OworCQlsaW1pdCA9IDY1NTM1OwkJLyogU2hvdWxkIHJlYWxseSBiZSBGU0dfQlVGTEVOICovCisJfQorCisJLyogTm8gYmxvY2sgZGVzY3JpcHRvcnMgKi8KKworCS8qIFRoZSBtb2RlIHBhZ2VzLCBpbiBudW1lcmljYWwgb3JkZXIuICBUaGUgb25seSBwYWdlIHdlIHN1cHBvcnQKKwkgKiBpcyB0aGUgQ2FjaGluZyBwYWdlLiAqLworCWlmIChwYWdlX2NvZGUgPT0gMHgwOCB8fCBhbGxfcGFnZXMpIHsKKwkJdmFsaWRfcGFnZSA9IDE7CisJCWJ1ZlswXSA9IDB4MDg7CQkvKiBQYWdlIGNvZGUgKi8KKwkJYnVmWzFdID0gMTA7CQkvKiBQYWdlIGxlbmd0aCAqLworCQltZW1zZXQoYnVmKzIsIDAsIDEwKTsJLyogTm9uZSBvZiB0aGUgZmllbGRzIGFyZSBjaGFuZ2VhYmxlICovCisKKwkJaWYgKCFjaGFuZ2VhYmxlX3ZhbHVlcykgeworCQkJYnVmWzJdID0gMHgwNDsJLyogV3JpdGUgY2FjaGUgZW5hYmxlLCAqLworCQkJCQkvKiBSZWFkIGNhY2hlIG5vdCBkaXNhYmxlZCAqLworCQkJCQkvKiBObyBjYWNoZSByZXRlbnRpb24gcHJpb3JpdGllcyAqLworCQkJcHV0X3VuYWxpZ25lZF9iZTE2KDB4ZmZmZiwgJmJ1Zls0XSk7CisJCQkJCS8qIERvbid0IGRpc2FibGUgcHJlZmV0Y2ggKi8KKwkJCQkJLyogTWluaW11bSBwcmVmZXRjaCA9IDAgKi8KKwkJCXB1dF91bmFsaWduZWRfYmUxNigweGZmZmYsICZidWZbOF0pOworCQkJCQkvKiBNYXhpbXVtIHByZWZldGNoICovCisJCQlwdXRfdW5hbGlnbmVkX2JlMTYoMHhmZmZmLCAmYnVmWzEwXSk7CisJCQkJCS8qIE1heGltdW0gcHJlZmV0Y2ggY2VpbGluZyAqLworCQl9CisJCWJ1ZiArPSAxMjsKKwl9CisKKwkvKiBDaGVjayB0aGF0IGEgdmFsaWQgcGFnZSB3YXMgcmVxdWVzdGVkIGFuZCB0aGUgbW9kZSBkYXRhIGxlbmd0aAorCSAqIGlzbid0IHRvbyBsb25nLiAqLworCWxlbiA9IGJ1ZiAtIGJ1ZjA7CisJaWYgKCF2YWxpZF9wYWdlIHx8IGxlbiA+IGxpbWl0KSB7CisJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX0lOVkFMSURfRklFTERfSU5fQ0RCOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiAgU3RvcmUgdGhlIG1vZGUgZGF0YSBsZW5ndGggKi8KKwlpZiAobXNjbW5kID09IFNDX01PREVfU0VOU0VfNikKKwkJYnVmMFswXSA9IGxlbiAtIDE7CisJZWxzZQorCQlwdXRfdW5hbGlnbmVkX2JlMTYobGVuIC0gMiwgYnVmMCk7CisJcmV0dXJuIGxlbjsKK30KKworCitzdGF0aWMgaW50IGRvX3N0YXJ0X3N0b3Aoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbikKK3sKKwlpZiAoIWNvbW1vbi0+Y3VybHVuKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoIWNvbW1vbi0+Y3VybHVuLT5yZW1vdmFibGUpIHsKKwkJY29tbW9uLT5jdXJsdW4tPnNlbnNlX2RhdGEgPSBTU19JTlZBTElEX0NPTU1BTkQ7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGRvX3ByZXZlbnRfYWxsb3coc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbikKK3sKKwlzdHJ1Y3QgZnNnX2x1bgkqY3VybHVuID0gY29tbW9uLT5jdXJsdW47CisJaW50CQlwcmV2ZW50OworCisJaWYgKCFjb21tb24tPmN1cmx1bikgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKCFjb21tb24tPmN1cmx1bi0+cmVtb3ZhYmxlKSB7CisJCWNvbW1vbi0+Y3VybHVuLT5zZW5zZV9kYXRhID0gU1NfSU5WQUxJRF9DT01NQU5EOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcmV2ZW50ID0gY29tbW9uLT5jbW5kWzRdICYgMHgwMTsKKwlpZiAoKGNvbW1vbi0+Y21uZFs0XSAmIH4weDAxKSAhPSAwKSB7CS8qIE1hc2sgYXdheSBQcmV2ZW50ICovCisJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX0lOVkFMSURfRklFTERfSU5fQ0RCOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY3VybHVuLT5wcmV2ZW50X21lZGl1bV9yZW1vdmFsICYmICFwcmV2ZW50KQorCQlmc2dfbHVuX2ZzeW5jX3N1YihjdXJsdW4pOworCWN1cmx1bi0+cHJldmVudF9tZWRpdW1fcmVtb3ZhbCA9IHByZXZlbnQ7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBkb19yZWFkX2Zvcm1hdF9jYXBhY2l0aWVzKHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24sCisJCQlzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmgpCit7CisJc3RydWN0IGZzZ19sdW4JKmN1cmx1biA9IGNvbW1vbi0+Y3VybHVuOworCXU4CQkqYnVmID0gKHU4ICopIGJoLT5idWY7CisKKwlidWZbMF0gPSBidWZbMV0gPSBidWZbMl0gPSAwOworCWJ1ZlszXSA9IDg7CS8qIE9ubHkgdGhlIEN1cnJlbnQvTWF4aW11bSBDYXBhY2l0eSBEZXNjcmlwdG9yICovCisJYnVmICs9IDQ7CisKKwlwdXRfdW5hbGlnbmVkX2JlMzIoY3VybHVuLT5udW1fc2VjdG9ycywgJmJ1ZlswXSk7CisJCQkJCQkvKiBOdW1iZXIgb2YgYmxvY2tzICovCisJcHV0X3VuYWxpZ25lZF9iZTMyKDUxMiwgJmJ1Zls0XSk7CS8qIEJsb2NrIGxlbmd0aCAqLworCWJ1Zls0XSA9IDB4MDI7CQkJCS8qIEN1cnJlbnQgY2FwYWNpdHkgKi8KKwlyZXR1cm4gMTI7Cit9CisKKworc3RhdGljIGludCBkb19tb2RlX3NlbGVjdChzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uLCBzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmgpCit7CisJc3RydWN0IGZzZ19sdW4JKmN1cmx1biA9IGNvbW1vbi0+Y3VybHVuOworCisJLyogV2UgZG9uJ3Qgc3VwcG9ydCBNT0RFIFNFTEVDVCAqLworCWlmIChjdXJsdW4pCisJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX0lOVkFMSURfQ09NTUFORDsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IGhhbHRfYnVsa19pbl9lbmRwb2ludChzdHJ1Y3QgZnNnX2RldiAqZnNnKQoreworCWludAlyYzsKKworCXJjID0gZnNnX3NldF9oYWx0KGZzZywgZnNnLT5idWxrX2luKTsKKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJVkRCRyhmc2csICJkZWxheWVkIGJ1bGstaW4gZW5kcG9pbnQgaGFsdFxuIik7CisJd2hpbGUgKHJjICE9IDApIHsKKwkJaWYgKHJjICE9IC1FQUdBSU4pIHsKKwkJCVdBUk5JTkcoZnNnLCAidXNiX2VwX3NldF9oYWx0IC0+ICVkXG4iLCByYyk7CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFdhaXQgZm9yIGEgc2hvcnQgdGltZSBhbmQgdGhlbiB0cnkgYWdhaW4gKi8KKwkJaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMCkgIT0gMCkKKwkJCXJldHVybiAtRUlOVFI7CisJCXJjID0gdXNiX2VwX3NldF9oYWx0KGZzZy0+YnVsa19pbik7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3ZWRnZV9idWxrX2luX2VuZHBvaW50KHN0cnVjdCBmc2dfZGV2ICpmc2cpCit7CisJaW50CXJjOworCisJREJHKGZzZywgImJ1bGstaW4gc2V0IHdlZGdlXG4iKTsKKwlyYyA9IHVzYl9lcF9zZXRfd2VkZ2UoZnNnLT5idWxrX2luKTsKKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJVkRCRyhmc2csICJkZWxheWVkIGJ1bGstaW4gZW5kcG9pbnQgd2VkZ2VcbiIpOworCXdoaWxlIChyYyAhPSAwKSB7CisJCWlmIChyYyAhPSAtRUFHQUlOKSB7CisJCQlXQVJOSU5HKGZzZywgInVzYl9lcF9zZXRfd2VkZ2UgLT4gJWRcbiIsIHJjKTsKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogV2FpdCBmb3IgYSBzaG9ydCB0aW1lIGFuZCB0aGVuIHRyeSBhZ2FpbiAqLworCQlpZiAobXNsZWVwX2ludGVycnVwdGlibGUoMTAwKSAhPSAwKQorCQkJcmV0dXJuIC1FSU5UUjsKKwkJcmMgPSB1c2JfZXBfc2V0X3dlZGdlKGZzZy0+YnVsa19pbik7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwYWRfd2l0aF96ZXJvcyhzdHJ1Y3QgZnNnX2RldiAqZnNnKQoreworCXN0cnVjdCBmc2dfYnVmZmhkCSpiaCA9IGZzZy0+Y29tbW9uLT5uZXh0X2J1ZmZoZF90b19maWxsOworCXUzMgkJCW5rZWVwID0gYmgtPmlucmVxLT5sZW5ndGg7CisJdTMyCQkJbnNlbmQ7CisJaW50CQkJcmM7CisKKwliaC0+c3RhdGUgPSBCVUZfU1RBVEVfRU1QVFk7CQkvKiBGb3IgdGhlIGZpcnN0IGl0ZXJhdGlvbiAqLworCWZzZy0+Y29tbW9uLT51c2JfYW1vdW50X2xlZnQgPSBua2VlcCArIGZzZy0+Y29tbW9uLT5yZXNpZHVlOworCXdoaWxlIChmc2ctPmNvbW1vbi0+dXNiX2Ftb3VudF9sZWZ0ID4gMCkgeworCisJCS8qIFdhaXQgZm9yIHRoZSBuZXh0IGJ1ZmZlciB0byBiZSBmcmVlICovCisJCXdoaWxlIChiaC0+c3RhdGUgIT0gQlVGX1NUQVRFX0VNUFRZKSB7CisJCQlyYyA9IHNsZWVwX3RocmVhZChmc2ctPmNvbW1vbik7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCQl9CisKKwkJbnNlbmQgPSBtaW4oZnNnLT5jb21tb24tPnVzYl9hbW91bnRfbGVmdCwgRlNHX0JVRkxFTik7CisJCW1lbXNldChiaC0+YnVmICsgbmtlZXAsIDAsIG5zZW5kIC0gbmtlZXApOworCQliaC0+aW5yZXEtPmxlbmd0aCA9IG5zZW5kOworCQliaC0+aW5yZXEtPnplcm8gPSAwOworCQlzdGFydF90cmFuc2Zlcihmc2csIGZzZy0+YnVsa19pbiwgYmgtPmlucmVxLAorCQkJCSZiaC0+aW5yZXFfYnVzeSwgJmJoLT5zdGF0ZSk7CisJCWJoID0gZnNnLT5jb21tb24tPm5leHRfYnVmZmhkX3RvX2ZpbGwgPSBiaC0+bmV4dDsKKwkJZnNnLT5jb21tb24tPnVzYl9hbW91bnRfbGVmdCAtPSBuc2VuZDsKKwkJbmtlZXAgPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aHJvd19hd2F5X2RhdGEoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbikKK3sKKwlzdHJ1Y3QgZnNnX2J1ZmZoZAkqYmg7CisJdTMyCQkJYW1vdW50OworCWludAkJCXJjOworCisJZm9yIChiaCA9IGNvbW1vbi0+bmV4dF9idWZmaGRfdG9fZHJhaW47CisJICAgICBiaC0+c3RhdGUgIT0gQlVGX1NUQVRFX0VNUFRZIHx8IGNvbW1vbi0+dXNiX2Ftb3VudF9sZWZ0ID4gMDsKKwkgICAgIGJoID0gY29tbW9uLT5uZXh0X2J1ZmZoZF90b19kcmFpbikgeworCisJCS8qIFRocm93IGF3YXkgdGhlIGRhdGEgaW4gYSBmaWxsZWQgYnVmZmVyICovCisJCWlmIChiaC0+c3RhdGUgPT0gQlVGX1NUQVRFX0ZVTEwpIHsKKwkJCXNtcF9ybWIoKTsKKwkJCWJoLT5zdGF0ZSA9IEJVRl9TVEFURV9FTVBUWTsKKwkJCWNvbW1vbi0+bmV4dF9idWZmaGRfdG9fZHJhaW4gPSBiaC0+bmV4dDsKKworCQkJLyogQSBzaG9ydCBwYWNrZXQgb3IgYW4gZXJyb3IgZW5kcyBldmVyeXRoaW5nICovCisJCQlpZiAoYmgtPm91dHJlcS0+YWN0dWFsICE9IGJoLT5vdXRyZXEtPmxlbmd0aCB8fAorCQkJCQliaC0+b3V0cmVxLT5zdGF0dXMgIT0gMCkgeworCQkJCXJhaXNlX2V4Y2VwdGlvbihjb21tb24sCisJCQkJCQlGU0dfU1RBVEVfQUJPUlRfQlVMS19PVVQpOworCQkJCXJldHVybiAtRUlOVFI7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFRyeSB0byBzdWJtaXQgYW5vdGhlciByZXF1ZXN0IGlmIHdlIG5lZWQgb25lICovCisJCWJoID0gY29tbW9uLT5uZXh0X2J1ZmZoZF90b19maWxsOworCQlpZiAoYmgtPnN0YXRlID09IEJVRl9TVEFURV9FTVBUWQorCQkgJiYgY29tbW9uLT51c2JfYW1vdW50X2xlZnQgPiAwKSB7CisJCQlhbW91bnQgPSBtaW4oY29tbW9uLT51c2JfYW1vdW50X2xlZnQsIEZTR19CVUZMRU4pOworCisJCQkvKiBhbW91bnQgaXMgYWx3YXlzIGRpdmlzaWJsZSBieSA1MTIsIGhlbmNlIGJ5CisJCQkgKiB0aGUgYnVsay1vdXQgbWF4cGFja2V0IHNpemUgKi8KKwkJCWJoLT5vdXRyZXEtPmxlbmd0aCA9IGFtb3VudDsKKwkJCWJoLT5idWxrX291dF9pbnRlbmRlZF9sZW5ndGggPSBhbW91bnQ7CisJCQliaC0+b3V0cmVxLT5zaG9ydF9ub3Rfb2sgPSAxOworCQkJU1RBUlRfVFJBTlNGRVJfT1IoY29tbW9uLCBidWxrX291dCwgYmgtPm91dHJlcSwKKwkJCQkJICAmYmgtPm91dHJlcV9idXN5LCAmYmgtPnN0YXRlKQorCQkJCS8qIERvbid0IGtub3cgd2hhdCB0byBkbyBpZgorCQkJCSAqIGNvbW1vbi0+ZnNnIGlzIE5VTEwgKi8KKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWNvbW1vbi0+bmV4dF9idWZmaGRfdG9fZmlsbCA9IGJoLT5uZXh0OworCQkJY29tbW9uLT51c2JfYW1vdW50X2xlZnQgLT0gYW1vdW50OworCQkJY29udGludWU7CisJCX0KKworCQkvKiBPdGhlcndpc2Ugd2FpdCBmb3Igc29tZXRoaW5nIHRvIGhhcHBlbiAqLworCQlyYyA9IHNsZWVwX3RocmVhZChjb21tb24pOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZmluaXNoX3JlcGx5KHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24pCit7CisJc3RydWN0IGZzZ19idWZmaGQJKmJoID0gY29tbW9uLT5uZXh0X2J1ZmZoZF90b19maWxsOworCWludAkJCXJjID0gMDsKKworCXN3aXRjaCAoY29tbW9uLT5kYXRhX2RpcikgeworCWNhc2UgREFUQV9ESVJfTk9ORToKKwkJYnJlYWs7CQkJLyogTm90aGluZyB0byBzZW5kICovCisKKwkvKiBJZiB3ZSBkb24ndCBrbm93IHdoZXRoZXIgdGhlIGhvc3Qgd2FudHMgdG8gcmVhZCBvciB3cml0ZSwKKwkgKiB0aGlzIG11c3QgYmUgQ0Igb3IgQ0JJIHdpdGggYW4gdW5rbm93biBjb21tYW5kLiAgV2UgbXVzdG4ndAorCSAqIHRyeSB0byBzZW5kIG9yIHJlY2VpdmUgYW55IGRhdGEuICBTbyBzdGFsbCBib3RoIGJ1bGsgcGlwZXMKKwkgKiBpZiB3ZSBjYW4gYW5kIHdhaXQgZm9yIGEgcmVzZXQuICovCisJY2FzZSBEQVRBX0RJUl9VTktOT1dOOgorCQlpZiAoIWNvbW1vbi0+Y2FuX3N0YWxsKSB7CisJCQkvKiBOb3RoaW5nICovCisJCX0gZWxzZSBpZiAoZnNnX2lzX3NldChjb21tb24pKSB7CisJCQlmc2dfc2V0X2hhbHQoY29tbW9uLT5mc2csIGNvbW1vbi0+ZnNnLT5idWxrX291dCk7CisJCQlyYyA9IGhhbHRfYnVsa19pbl9lbmRwb2ludChjb21tb24tPmZzZyk7CisJCX0gZWxzZSB7CisJCQkvKiBEb24ndCBrbm93IHdoYXQgdG8gZG8gaWYgY29tbW9uLT5mc2cgaXMgTlVMTCAqLworCQkJcmMgPSAtRUlPOworCQl9CisJCWJyZWFrOworCisJLyogQWxsIGJ1dCB0aGUgbGFzdCBidWZmZXIgb2YgZGF0YSBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIHNlbnQgKi8KKwljYXNlIERBVEFfRElSX1RPX0hPU1Q6CisJCWlmIChjb21tb24tPmRhdGFfc2l6ZSA9PSAwKSB7CisJCQkvKiBOb3RoaW5nIHRvIHNlbmQgKi8KKworCQkvKiBJZiB0aGVyZSdzIG5vIHJlc2lkdWUsIHNpbXBseSBzZW5kIHRoZSBsYXN0IGJ1ZmZlciAqLworCQl9IGVsc2UgaWYgKGNvbW1vbi0+cmVzaWR1ZSA9PSAwKSB7CisJCQliaC0+aW5yZXEtPnplcm8gPSAwOworCQkJU1RBUlRfVFJBTlNGRVJfT1IoY29tbW9uLCBidWxrX2luLCBiaC0+aW5yZXEsCisJCQkJCSAgJmJoLT5pbnJlcV9idXN5LCAmYmgtPnN0YXRlKQorCQkJCXJldHVybiAtRUlPOworCQkJY29tbW9uLT5uZXh0X2J1ZmZoZF90b19maWxsID0gYmgtPm5leHQ7CisKKwkJLyogRm9yIEJ1bGstb25seSwgaWYgd2UncmUgYWxsb3dlZCB0byBzdGFsbCB0aGVuIHNlbmQgdGhlCisJCSAqIHNob3J0IHBhY2tldCBhbmQgaGFsdCB0aGUgYnVsay1pbiBlbmRwb2ludC4gIElmIHdlIGNhbid0CisJCSAqIHN0YWxsLCBwYWQgb3V0IHRoZSByZW1haW5pbmcgZGF0YSB3aXRoIDAncy4gKi8KKwkJfSBlbHNlIGlmIChjb21tb24tPmNhbl9zdGFsbCkgeworCQkJYmgtPmlucmVxLT56ZXJvID0gMTsKKwkJCVNUQVJUX1RSQU5TRkVSX09SKGNvbW1vbiwgYnVsa19pbiwgYmgtPmlucmVxLAorCQkJCQkgICZiaC0+aW5yZXFfYnVzeSwgJmJoLT5zdGF0ZSkKKwkJCQkvKiBEb24ndCBrbm93IHdoYXQgdG8gZG8gaWYKKwkJCQkgKiBjb21tb24tPmZzZyBpcyBOVUxMICovCisJCQkJcmMgPSAtRUlPOworCQkJY29tbW9uLT5uZXh0X2J1ZmZoZF90b19maWxsID0gYmgtPm5leHQ7CisJCQlpZiAoY29tbW9uLT5mc2cpCisJCQkJcmMgPSBoYWx0X2J1bGtfaW5fZW5kcG9pbnQoY29tbW9uLT5mc2cpOworCQl9IGVsc2UgaWYgKGZzZ19pc19zZXQoY29tbW9uKSkgeworCQkJcmMgPSBwYWRfd2l0aF96ZXJvcyhjb21tb24tPmZzZyk7CisJCX0gZWxzZSB7CisJCQkvKiBEb24ndCBrbm93IHdoYXQgdG8gZG8gaWYgY29tbW9uLT5mc2cgaXMgTlVMTCAqLworCQkJcmMgPSAtRUlPOworCQl9CisJCWJyZWFrOworCisJLyogV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIHdlIHdhbnQgZnJvbSB0aGUgZGF0YSB0aGUgaG9zdCBoYXMgc2VudC4KKwkgKiBUaGVyZSBtYXkgc3RpbGwgYmUgb3V0c3RhbmRpbmcgYnVsay1vdXQgcmVxdWVzdHMuICovCisJY2FzZSBEQVRBX0RJUl9GUk9NX0hPU1Q6CisJCWlmIChjb21tb24tPnJlc2lkdWUgPT0gMCkgeworCQkJLyogTm90aGluZyB0byByZWNlaXZlICovCisKKwkJLyogRGlkIHRoZSBob3N0IHN0b3Agc2VuZGluZyB1bmV4cGVjdGVkbHkgZWFybHk/ICovCisJCX0gZWxzZSBpZiAoY29tbW9uLT5zaG9ydF9wYWNrZXRfcmVjZWl2ZWQpIHsKKwkJCXJhaXNlX2V4Y2VwdGlvbihjb21tb24sIEZTR19TVEFURV9BQk9SVF9CVUxLX09VVCk7CisJCQlyYyA9IC1FSU5UUjsKKworCQkvKiBXZSBoYXZlbid0IHByb2Nlc3NlZCBhbGwgdGhlIGluY29taW5nIGRhdGEuICBFdmVuIHRob3VnaAorCQkgKiB3ZSBtYXkgYmUgYWxsb3dlZCB0byBzdGFsbCwgZG9pbmcgc28gd291bGQgY2F1c2UgYSByYWNlLgorCQkgKiBUaGUgY29udHJvbGxlciBtYXkgYWxyZWFkeSBoYXZlIEFDSydlZCBhbGwgdGhlIHJlbWFpbmluZworCQkgKiBidWxrLW91dCBwYWNrZXRzLCBpbiB3aGljaCBjYXNlIHRoZSBob3N0IHdvdWxkbid0IHNlZSBhCisJCSAqIFNUQUxMLiAgTm90IHJlYWxpemluZyB0aGUgZW5kcG9pbnQgd2FzIGhhbHRlZCwgaXQgd291bGRuJ3QKKwkJICogY2xlYXIgdGhlIGhhbHQgLS0gbGVhZGluZyB0byBwcm9ibGVtcyBsYXRlciBvbi4gKi8KKyNpZiAwCisJCX0gZWxzZSBpZiAoY29tbW9uLT5jYW5fc3RhbGwpIHsKKwkJCWlmIChmc2dfaXNfc2V0KGNvbW1vbikpCisJCQkJZnNnX3NldF9oYWx0KGNvbW1vbi0+ZnNnLAorCQkJCQkgICAgIGNvbW1vbi0+ZnNnLT5idWxrX291dCk7CisJCQlyYWlzZV9leGNlcHRpb24oY29tbW9uLCBGU0dfU1RBVEVfQUJPUlRfQlVMS19PVVQpOworCQkJcmMgPSAtRUlOVFI7CisjZW5kaWYKKworCQkvKiBXZSBjYW4ndCBzdGFsbC4gIFJlYWQgaW4gdGhlIGV4Y2VzcyBkYXRhIGFuZCB0aHJvdyBpdAorCQkgKiBhbGwgYXdheS4gKi8KKwkJfSBlbHNlIHsKKwkJCXJjID0gdGhyb3dfYXdheV9kYXRhKGNvbW1vbik7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KKworCitzdGF0aWMgaW50IHNlbmRfc3RhdHVzKHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24pCit7CisJc3RydWN0IGZzZ19sdW4JCSpjdXJsdW4gPSBjb21tb24tPmN1cmx1bjsKKwlzdHJ1Y3QgZnNnX2J1ZmZoZAkqYmg7CisJc3RydWN0IGJ1bGtfY3Nfd3JhcAkqY3N3OworCWludAkJCXJjOworCXU4CQkJc3RhdHVzID0gVVNCX1NUQVRVU19QQVNTOworCXUzMgkJCXNkLCBzZGluZm8gPSAwOworCisJLyogV2FpdCBmb3IgdGhlIG5leHQgYnVmZmVyIHRvIGJlY29tZSBhdmFpbGFibGUgKi8KKwliaCA9IGNvbW1vbi0+bmV4dF9idWZmaGRfdG9fZmlsbDsKKwl3aGlsZSAoYmgtPnN0YXRlICE9IEJVRl9TVEFURV9FTVBUWSkgeworCQlyYyA9IHNsZWVwX3RocmVhZChjb21tb24pOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKGN1cmx1bikgeworCQlzZCA9IGN1cmx1bi0+c2Vuc2VfZGF0YTsKKwkJc2RpbmZvID0gY3VybHVuLT5zZW5zZV9kYXRhX2luZm87CisJfSBlbHNlIGlmIChjb21tb24tPmJhZF9sdW5fb2theSkKKwkJc2QgPSBTU19OT19TRU5TRTsKKwllbHNlCisJCXNkID0gU1NfTE9HSUNBTF9VTklUX05PVF9TVVBQT1JURUQ7CisKKwlpZiAoY29tbW9uLT5waGFzZV9lcnJvcikgeworCQlEQkcoY29tbW9uLCAic2VuZGluZyBwaGFzZS1lcnJvciBzdGF0dXNcbiIpOworCQlzdGF0dXMgPSBVU0JfU1RBVFVTX1BIQVNFX0VSUk9SOworCQlzZCA9IFNTX0lOVkFMSURfQ09NTUFORDsKKwl9IGVsc2UgaWYgKHNkICE9IFNTX05PX1NFTlNFKSB7CisJCURCRyhjb21tb24sICJzZW5kaW5nIGNvbW1hbmQtZmFpbHVyZSBzdGF0dXNcbiIpOworCQlzdGF0dXMgPSBVU0JfU1RBVFVTX0ZBSUw7CisJCVZEQkcoY29tbW9uLCAiICBzZW5zZSBkYXRhOiBTSyB4JTAyeCwgQVNDIHglMDJ4LCBBU0NRIHglMDJ4OyIKKwkJCQkiICBpbmZvIHgleFxuIiwKKwkJCQlTSyhzZCksIEFTQyhzZCksIEFTQ1Eoc2QpLCBzZGluZm8pOworCX0KKworCS8qIFN0b3JlIGFuZCBzZW5kIHRoZSBCdWxrLW9ubHkgQ1NXICovCisJY3N3ID0gKHZvaWQgKiliaC0+YnVmOworCisJY3N3LT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU0JfQlVMS19DU19TSUcpOworCWNzdy0+VGFnID0gY29tbW9uLT50YWc7CisJY3N3LT5SZXNpZHVlID0gY3B1X3RvX2xlMzIoY29tbW9uLT5yZXNpZHVlKTsKKwljc3ctPlN0YXR1cyA9IHN0YXR1czsKKworCWJoLT5pbnJlcS0+bGVuZ3RoID0gVVNCX0JVTEtfQ1NfV1JBUF9MRU47CisJYmgtPmlucmVxLT56ZXJvID0gMDsKKwlTVEFSVF9UUkFOU0ZFUl9PUihjb21tb24sIGJ1bGtfaW4sIGJoLT5pbnJlcSwKKwkJCSAgJmJoLT5pbnJlcV9idXN5LCAmYmgtPnN0YXRlKQorCQkvKiBEb24ndCBrbm93IHdoYXQgdG8gZG8gaWYgY29tbW9uLT5mc2cgaXMgTlVMTCAqLworCQlyZXR1cm4gLUVJTzsKKworCWNvbW1vbi0+bmV4dF9idWZmaGRfdG9fZmlsbCA9IGJoLT5uZXh0OworCXJldHVybiAwOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIENoZWNrIHdoZXRoZXIgdGhlIGNvbW1hbmQgaXMgcHJvcGVybHkgZm9ybWVkIGFuZCB3aGV0aGVyIGl0cyBkYXRhIHNpemUKKyAqIGFuZCBkaXJlY3Rpb24gYWdyZWUgd2l0aCB0aGUgdmFsdWVzIHdlIGFscmVhZHkgaGF2ZS4gKi8KK3N0YXRpYyBpbnQgY2hlY2tfY29tbWFuZChzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uLCBpbnQgY21uZF9zaXplLAorCQllbnVtIGRhdGFfZGlyZWN0aW9uIGRhdGFfZGlyLCB1bnNpZ25lZCBpbnQgbWFzaywKKwkJaW50IG5lZWRzX21lZGl1bSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQJCQlpOworCWludAkJCWx1biA9IGNvbW1vbi0+Y21uZFsxXSA+PiA1OworCXN0YXRpYyBjb25zdCBjaGFyCWRpcmxldHRlcls0XSA9IHsndScsICdvJywgJ2knLCAnbid9OworCWNoYXIJCQloZGxlblsyMF07CisJc3RydWN0IGZzZ19sdW4JCSpjdXJsdW47CisKKwloZGxlblswXSA9IDA7CisJaWYgKGNvbW1vbi0+ZGF0YV9kaXIgIT0gREFUQV9ESVJfVU5LTk9XTikKKwkJc3ByaW50ZihoZGxlbiwgIiwgSCVjPSV1IiwgZGlybGV0dGVyWyhpbnQpIGNvbW1vbi0+ZGF0YV9kaXJdLAorCQkJCWNvbW1vbi0+ZGF0YV9zaXplKTsKKwlWREJHKGNvbW1vbiwgIlNDU0kgY29tbWFuZDogJXM7ICBEYz0lZCwgRCVjPSV1OyAgSGM9JWQlc1xuIiwKKwkgICAgIG5hbWUsIGNtbmRfc2l6ZSwgZGlybGV0dGVyWyhpbnQpIGRhdGFfZGlyXSwKKwkgICAgIGNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCwgY29tbW9uLT5jbW5kX3NpemUsIGhkbGVuKTsKKworCS8qIFdlIGNhbid0IHJlcGx5IGF0IGFsbCB1bnRpbCB3ZSBrbm93IHRoZSBjb3JyZWN0IGRhdGEgZGlyZWN0aW9uCisJICogYW5kIHNpemUuICovCisJaWYgKGNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCA9PSAwKQorCQlkYXRhX2RpciA9IERBVEFfRElSX05PTkU7CisJaWYgKGNvbW1vbi0+ZGF0YV9zaXplIDwgY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kKSB7CisJCS8qIEhvc3QgZGF0YSBzaXplIDwgRGV2aWNlIGRhdGEgc2l6ZSBpcyBhIHBoYXNlIGVycm9yLgorCQkgKiBDYXJyeSBvdXQgdGhlIGNvbW1hbmQsIGJ1dCBvbmx5IHRyYW5zZmVyIGFzIG11Y2ggYXMKKwkJICogd2UgYXJlIGFsbG93ZWQuICovCisJCWNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCA9IGNvbW1vbi0+ZGF0YV9zaXplOworCQljb21tb24tPnBoYXNlX2Vycm9yID0gMTsKKwl9CisJY29tbW9uLT5yZXNpZHVlID0gY29tbW9uLT5kYXRhX3NpemU7CisJY29tbW9uLT51c2JfYW1vdW50X2xlZnQgPSBjb21tb24tPmRhdGFfc2l6ZTsKKworCS8qIENvbmZsaWN0aW5nIGRhdGEgZGlyZWN0aW9ucyBpcyBhIHBoYXNlIGVycm9yICovCisJaWYgKGNvbW1vbi0+ZGF0YV9kaXIgIT0gZGF0YV9kaXIKKwkgJiYgY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kID4gMCkgeworCQljb21tb24tPnBoYXNlX2Vycm9yID0gMTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVmVyaWZ5IHRoZSBsZW5ndGggb2YgdGhlIGNvbW1hbmQgaXRzZWxmICovCisJaWYgKGNtbmRfc2l6ZSAhPSBjb21tb24tPmNtbmRfc2l6ZSkgeworCisJCS8qIFNwZWNpYWwgY2FzZSB3b3JrYXJvdW5kOiBUaGVyZSBhcmUgcGxlbnR5IG9mIGJ1Z2d5IFNDU0kKKwkJICogaW1wbGVtZW50YXRpb25zLiBNYW55IGhhdmUgaXNzdWVzIHdpdGggY2J3LT5MZW5ndGgKKwkJICogZmllbGQgcGFzc2luZyBhIHdyb25nIGNvbW1hbmQgc2l6ZS4gRm9yIHRob3NlIGNhc2VzIHdlCisJCSAqIGFsd2F5cyB0cnkgdG8gd29yayBhcm91bmQgdGhlIHByb2JsZW0gYnkgdXNpbmcgdGhlIGxlbmd0aAorCQkgKiBzZW50IGJ5IHRoZSBob3N0IHNpZGUgcHJvdmlkZWQgaXQgaXMgYXQgbGVhc3QgYXMgbGFyZ2UKKwkJICogYXMgdGhlIGNvcnJlY3QgY29tbWFuZCBsZW5ndGguCisJCSAqIEV4YW1wbGVzIG9mIHN1Y2ggY2FzZXMgd291bGQgYmUgTVMtV2luZG93cywgd2hpY2ggaXNzdWVzCisJCSAqIFJFUVVFU1QgU0VOU0Ugd2l0aCBjYnctPkxlbmd0aCA9PSAxMiB3aGVyZSBpdCBzaG91bGQKKwkJICogYmUgNiwgYW5kIHhib3gzNjAgaXNzdWluZyBJTlFVSVJZLCBURVNUIFVOSVQgUkVBRFkgYW5kCisJCSAqIFJFUVVFU1QgU0VOU0Ugd2l0aCBjYnctPkxlbmd0aCA9PSAxMCB3aGVyZSBpdCBzaG91bGQKKwkJICogYmUgNiBhcyB3ZWxsLgorCQkgKi8KKwkJaWYgKGNtbmRfc2l6ZSA8PSBjb21tb24tPmNtbmRfc2l6ZSkgeworCQkJREJHKGNvbW1vbiwgIiVzIGlzIGJ1Z2d5ISBFeHBlY3RlZCBsZW5ndGggJWQgIgorCQkJICAgICJidXQgd2UgZ290ICVkXG4iLCBuYW1lLAorCQkJICAgIGNtbmRfc2l6ZSwgY29tbW9uLT5jbW5kX3NpemUpOworCQkJY21uZF9zaXplID0gY29tbW9uLT5jbW5kX3NpemU7CisJCX0gZWxzZSB7CisJCQljb21tb24tPnBoYXNlX2Vycm9yID0gMTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJLyogQ2hlY2sgdGhhdCB0aGUgTFVOIHZhbHVlcyBhcmUgY29uc2lzdGVudCAqLworCWlmIChjb21tb24tPmx1biAhPSBsdW4pCisJCURCRyhjb21tb24sICJ1c2luZyBMVU4gJWQgZnJvbSBDQlcsIG5vdCBMVU4gJWQgZnJvbSBDREJcbiIsCisJCSAgICBjb21tb24tPmx1biwgbHVuKTsKKworCS8qIENoZWNrIHRoZSBMVU4gKi8KKwlpZiAoY29tbW9uLT5sdW4gPj0gMCAmJiBjb21tb24tPmx1biA8IGNvbW1vbi0+bmx1bnMpIHsKKwkJY3VybHVuID0gJmNvbW1vbi0+bHVuc1tjb21tb24tPmx1bl07CisJCWNvbW1vbi0+Y3VybHVuID0gY3VybHVuOworCQlpZiAoY29tbW9uLT5jbW5kWzBdICE9IFNDX1JFUVVFU1RfU0VOU0UpIHsKKwkJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX05PX1NFTlNFOworCQkJY3VybHVuLT5zZW5zZV9kYXRhX2luZm8gPSAwOworCQkJY3VybHVuLT5pbmZvX3ZhbGlkID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCWNvbW1vbi0+Y3VybHVuID0gTlVMTDsKKwkJY3VybHVuID0gTlVMTDsKKwkJY29tbW9uLT5iYWRfbHVuX29rYXkgPSAwOworCisJCS8qIElOUVVJUlkgYW5kIFJFUVVFU1QgU0VOU0UgY29tbWFuZHMgYXJlIGV4cGxpY2l0bHkgYWxsb3dlZAorCQkgKiB0byB1c2UgdW5zdXBwb3J0ZWQgTFVOczsgYWxsIG90aGVycyBtYXkgbm90LiAqLworCQlpZiAoY29tbW9uLT5jbW5kWzBdICE9IFNDX0lOUVVJUlkgJiYKKwkJICAgIGNvbW1vbi0+Y21uZFswXSAhPSBTQ19SRVFVRVNUX1NFTlNFKSB7CisJCQlEQkcoY29tbW9uLCAidW5zdXBwb3J0ZWQgTFVOICVkXG4iLCBjb21tb24tPmx1bik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qIElmIGEgdW5pdCBhdHRlbnRpb24gY29uZGl0aW9uIGV4aXN0cywgb25seSBJTlFVSVJZIGFuZAorCSAqIFJFUVVFU1QgU0VOU0UgY29tbWFuZHMgYXJlIGFsbG93ZWQ7IGFueXRoaW5nIGVsc2UgbXVzdCBmYWlsLiAqLworCWlmIChjdXJsdW4gJiYgY3VybHVuLT51bml0X2F0dGVudGlvbl9kYXRhICE9IFNTX05PX1NFTlNFICYmCisJCQljb21tb24tPmNtbmRbMF0gIT0gU0NfSU5RVUlSWSAmJgorCQkJY29tbW9uLT5jbW5kWzBdICE9IFNDX1JFUVVFU1RfU0VOU0UpIHsKKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gY3VybHVuLT51bml0X2F0dGVudGlvbl9kYXRhOworCQljdXJsdW4tPnVuaXRfYXR0ZW50aW9uX2RhdGEgPSBTU19OT19TRU5TRTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2hlY2sgdGhhdCBvbmx5IGNvbW1hbmQgYnl0ZXMgbGlzdGVkIGluIHRoZSBtYXNrIGFyZSBub24temVybyAqLworCWNvbW1vbi0+Y21uZFsxXSAmPSAweDFmOwkJCS8qIE1hc2sgYXdheSB0aGUgTFVOICovCisJZm9yIChpID0gMTsgaSA8IGNtbmRfc2l6ZTsgKytpKSB7CisJCWlmIChjb21tb24tPmNtbmRbaV0gJiYgIShtYXNrICYgKDEgPDwgaSkpKSB7CisJCQlpZiAoY3VybHVuKQorCQkJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX0lOVkFMSURfRklFTERfSU5fQ0RCOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBJZiB0aGUgbWVkaXVtIGlzbid0IG1vdW50ZWQgYW5kIHRoZSBjb21tYW5kIG5lZWRzIHRvIGFjY2VzcworCSAqIGl0LCByZXR1cm4gYW4gZXJyb3IuICovCisJaWYgKGN1cmx1biAmJiAhZnNnX2x1bl9pc19vcGVuKGN1cmx1bikgJiYgbmVlZHNfbWVkaXVtKSB7CisJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX01FRElVTV9OT1RfUFJFU0VOVDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBkb19zY3NpX2NvbW1hbmQoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbikKK3sKKwlzdHJ1Y3QgZnNnX2J1ZmZoZAkqYmg7CisJaW50CQkJcmM7CisJaW50CQkJcmVwbHkgPSAtRUlOVkFMOworCWludAkJCWk7CisJc3RhdGljIGNoYXIJCXVua25vd25bMTZdOworCisJZHVtcF9jZGIoY29tbW9uKTsKKworCS8qIFdhaXQgZm9yIHRoZSBuZXh0IGJ1ZmZlciB0byBiZWNvbWUgYXZhaWxhYmxlIGZvciBkYXRhIG9yIHN0YXR1cyAqLworCWJoID0gY29tbW9uLT5uZXh0X2J1ZmZoZF90b19maWxsOworCWNvbW1vbi0+bmV4dF9idWZmaGRfdG9fZHJhaW4gPSBiaDsKKwl3aGlsZSAoYmgtPnN0YXRlICE9IEJVRl9TVEFURV9FTVBUWSkgeworCQlyYyA9IHNsZWVwX3RocmVhZChjb21tb24pOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCWNvbW1vbi0+cGhhc2VfZXJyb3IgPSAwOworCWNvbW1vbi0+c2hvcnRfcGFja2V0X3JlY2VpdmVkID0gMDsKKworCWRvd25fcmVhZCgmY29tbW9uLT5maWxlc2VtKTsJLyogV2UncmUgdXNpbmcgdGhlIGJhY2tpbmcgZmlsZSAqLworCXN3aXRjaCAoY29tbW9uLT5jbW5kWzBdKSB7CisKKwljYXNlIFNDX0lOUVVJUlk6CisJCWNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCA9IGNvbW1vbi0+Y21uZFs0XTsKKwkJcmVwbHkgPSBjaGVja19jb21tYW5kKGNvbW1vbiwgNiwgREFUQV9ESVJfVE9fSE9TVCwKKwkJCQkgICAgICAoMTw8NCksIDAsCisJCQkJICAgICAgIklOUVVJUlkiKTsKKwkJaWYgKHJlcGx5ID09IDApCisJCQlyZXBseSA9IGRvX2lucXVpcnkoY29tbW9uLCBiaCk7CisJCWJyZWFrOworCisJY2FzZSBTQ19NT0RFX1NFTEVDVF82OgorCQljb21tb24tPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPSBjb21tb24tPmNtbmRbNF07CisJCXJlcGx5ID0gY2hlY2tfY29tbWFuZChjb21tb24sIDYsIERBVEFfRElSX0ZST01fSE9TVCwKKwkJCQkgICAgICAoMTw8MSkgfCAoMTw8NCksIDAsCisJCQkJICAgICAgIk1PREUgU0VMRUNUKDYpIik7CisJCWlmIChyZXBseSA9PSAwKQorCQkJcmVwbHkgPSBkb19tb2RlX3NlbGVjdChjb21tb24sIGJoKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDX01PREVfU0VMRUNUXzEwOgorCQljb21tb24tPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPQorCQkJZ2V0X3VuYWxpZ25lZF9iZTE2KCZjb21tb24tPmNtbmRbN10pOworCQlyZXBseSA9IGNoZWNrX2NvbW1hbmQoY29tbW9uLCAxMCwgREFUQV9ESVJfRlJPTV9IT1NULAorCQkJCSAgICAgICgxPDwxKSB8ICgzPDw3KSwgMCwKKwkJCQkgICAgICAiTU9ERSBTRUxFQ1QoMTApIik7CisJCWlmIChyZXBseSA9PSAwKQorCQkJcmVwbHkgPSBkb19tb2RlX3NlbGVjdChjb21tb24sIGJoKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDX01PREVfU0VOU0VfNjoKKwkJY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kID0gY29tbW9uLT5jbW5kWzRdOworCQlyZXBseSA9IGNoZWNrX2NvbW1hbmQoY29tbW9uLCA2LCBEQVRBX0RJUl9UT19IT1NULAorCQkJCSAgICAgICgxPDwxKSB8ICgxPDwyKSB8ICgxPDw0KSwgMCwKKwkJCQkgICAgICAiTU9ERSBTRU5TRSg2KSIpOworCQlpZiAocmVwbHkgPT0gMCkKKwkJCXJlcGx5ID0gZG9fbW9kZV9zZW5zZShjb21tb24sIGJoKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDX01PREVfU0VOU0VfMTA6CisJCWNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCA9CisJCQlnZXRfdW5hbGlnbmVkX2JlMTYoJmNvbW1vbi0+Y21uZFs3XSk7CisJCXJlcGx5ID0gY2hlY2tfY29tbWFuZChjb21tb24sIDEwLCBEQVRBX0RJUl9UT19IT1NULAorCQkJCSAgICAgICgxPDwxKSB8ICgxPDwyKSB8ICgzPDw3KSwgMCwKKwkJCQkgICAgICAiTU9ERSBTRU5TRSgxMCkiKTsKKwkJaWYgKHJlcGx5ID09IDApCisJCQlyZXBseSA9IGRvX21vZGVfc2Vuc2UoY29tbW9uLCBiaCk7CisJCWJyZWFrOworCisJY2FzZSBTQ19QUkVWRU5UX0FMTE9XX01FRElVTV9SRU1PVkFMOgorCQljb21tb24tPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPSAwOworCQlyZXBseSA9IGNoZWNrX2NvbW1hbmQoY29tbW9uLCA2LCBEQVRBX0RJUl9OT05FLAorCQkJCSAgICAgICgxPDw0KSwgMCwKKwkJCQkgICAgICAiUFJFVkVOVC1BTExPVyBNRURJVU0gUkVNT1ZBTCIpOworCQlpZiAocmVwbHkgPT0gMCkKKwkJCXJlcGx5ID0gZG9fcHJldmVudF9hbGxvdyhjb21tb24pOworCQlicmVhazsKKworCWNhc2UgU0NfUkVBRF82OgorCQlpID0gY29tbW9uLT5jbW5kWzRdOworCQljb21tb24tPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPSAoaSA9PSAwID8gMjU2IDogaSkgPDwgOTsKKwkJcmVwbHkgPSBjaGVja19jb21tYW5kKGNvbW1vbiwgNiwgREFUQV9ESVJfVE9fSE9TVCwKKwkJCQkgICAgICAoNzw8MSkgfCAoMTw8NCksIDEsCisJCQkJICAgICAgIlJFQUQoNikiKTsKKwkJaWYgKHJlcGx5ID09IDApCisJCQlyZXBseSA9IGRvX3JlYWQoY29tbW9uKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDX1JFQURfMTA6CisJCWNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCA9CisJCQkJZ2V0X3VuYWxpZ25lZF9iZTE2KCZjb21tb24tPmNtbmRbN10pIDw8IDk7CisJCXJlcGx5ID0gY2hlY2tfY29tbWFuZChjb21tb24sIDEwLCBEQVRBX0RJUl9UT19IT1NULAorCQkJCSAgICAgICgxPDwxKSB8ICgweGY8PDIpIHwgKDM8PDcpLCAxLAorCQkJCSAgICAgICJSRUFEKDEwKSIpOworCQlpZiAocmVwbHkgPT0gMCkKKwkJCXJlcGx5ID0gZG9fcmVhZChjb21tb24pOworCQlicmVhazsKKworCWNhc2UgU0NfUkVBRF8xMjoKKwkJY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kID0KKwkJCQlnZXRfdW5hbGlnbmVkX2JlMzIoJmNvbW1vbi0+Y21uZFs2XSkgPDwgOTsKKwkJcmVwbHkgPSBjaGVja19jb21tYW5kKGNvbW1vbiwgMTIsIERBVEFfRElSX1RPX0hPU1QsCisJCQkJICAgICAgKDE8PDEpIHwgKDB4Zjw8MikgfCAoMHhmPDw2KSwgMSwKKwkJCQkgICAgICAiUkVBRCgxMikiKTsKKwkJaWYgKHJlcGx5ID09IDApCisJCQlyZXBseSA9IGRvX3JlYWQoY29tbW9uKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDX1JFQURfQ0FQQUNJVFk6CisJCWNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCA9IDg7CisJCXJlcGx5ID0gY2hlY2tfY29tbWFuZChjb21tb24sIDEwLCBEQVRBX0RJUl9UT19IT1NULAorCQkJCSAgICAgICgweGY8PDIpIHwgKDE8PDgpLCAxLAorCQkJCSAgICAgICJSRUFEIENBUEFDSVRZIik7CisJCWlmIChyZXBseSA9PSAwKQorCQkJcmVwbHkgPSBkb19yZWFkX2NhcGFjaXR5KGNvbW1vbiwgYmgpOworCQlicmVhazsKKworCWNhc2UgU0NfUkVBRF9IRUFERVI6CisJCWlmICghY29tbW9uLT5jdXJsdW4gfHwgIWNvbW1vbi0+Y3VybHVuLT5jZHJvbSkKKwkJCWdvdG8gdW5rbm93bl9jbW5kOworCQljb21tb24tPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPQorCQkJZ2V0X3VuYWxpZ25lZF9iZTE2KCZjb21tb24tPmNtbmRbN10pOworCQlyZXBseSA9IGNoZWNrX2NvbW1hbmQoY29tbW9uLCAxMCwgREFUQV9ESVJfVE9fSE9TVCwKKwkJCQkgICAgICAoMzw8NykgfCAoMHgxZjw8MSksIDEsCisJCQkJICAgICAgIlJFQUQgSEVBREVSIik7CisJCWlmIChyZXBseSA9PSAwKQorCQkJcmVwbHkgPSBkb19yZWFkX2hlYWRlcihjb21tb24sIGJoKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDX1JFQURfVE9DOgorCQlpZiAoIWNvbW1vbi0+Y3VybHVuIHx8ICFjb21tb24tPmN1cmx1bi0+Y2Ryb20pCisJCQlnb3RvIHVua25vd25fY21uZDsKKwkJY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kID0KKwkJCWdldF91bmFsaWduZWRfYmUxNigmY29tbW9uLT5jbW5kWzddKTsKKwkJcmVwbHkgPSBjaGVja19jb21tYW5kKGNvbW1vbiwgMTAsIERBVEFfRElSX1RPX0hPU1QsCisJCQkJICAgICAgKDc8PDYpIHwgKDE8PDEpLCAxLAorCQkJCSAgICAgICJSRUFEIFRPQyIpOworCQlpZiAocmVwbHkgPT0gMCkKKwkJCXJlcGx5ID0gZG9fcmVhZF90b2MoY29tbW9uLCBiaCk7CisJCWJyZWFrOworCisJY2FzZSBTQ19SRUFEX0ZPUk1BVF9DQVBBQ0lUSUVTOgorCQljb21tb24tPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPQorCQkJZ2V0X3VuYWxpZ25lZF9iZTE2KCZjb21tb24tPmNtbmRbN10pOworCQlyZXBseSA9IGNoZWNrX2NvbW1hbmQoY29tbW9uLCAxMCwgREFUQV9ESVJfVE9fSE9TVCwKKwkJCQkgICAgICAoMzw8NyksIDEsCisJCQkJICAgICAgIlJFQUQgRk9STUFUIENBUEFDSVRJRVMiKTsKKwkJaWYgKHJlcGx5ID09IDApCisJCQlyZXBseSA9IGRvX3JlYWRfZm9ybWF0X2NhcGFjaXRpZXMoY29tbW9uLCBiaCk7CisJCWJyZWFrOworCisJY2FzZSBTQ19SRVFVRVNUX1NFTlNFOgorCQljb21tb24tPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPSBjb21tb24tPmNtbmRbNF07CisJCXJlcGx5ID0gY2hlY2tfY29tbWFuZChjb21tb24sIDYsIERBVEFfRElSX1RPX0hPU1QsCisJCQkJICAgICAgKDE8PDQpLCAwLAorCQkJCSAgICAgICJSRVFVRVNUIFNFTlNFIik7CisJCWlmIChyZXBseSA9PSAwKQorCQkJcmVwbHkgPSBkb19yZXF1ZXN0X3NlbnNlKGNvbW1vbiwgYmgpOworCQlicmVhazsKKworCWNhc2UgU0NfU1RBUlRfU1RPUF9VTklUOgorCQljb21tb24tPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPSAwOworCQlyZXBseSA9IGNoZWNrX2NvbW1hbmQoY29tbW9uLCA2LCBEQVRBX0RJUl9OT05FLAorCQkJCSAgICAgICgxPDwxKSB8ICgxPDw0KSwgMCwKKwkJCQkgICAgICAiU1RBUlQtU1RPUCBVTklUIik7CisJCWlmIChyZXBseSA9PSAwKQorCQkJcmVwbHkgPSBkb19zdGFydF9zdG9wKGNvbW1vbik7CisJCWJyZWFrOworCisJY2FzZSBTQ19TWU5DSFJPTklaRV9DQUNIRToKKwkJY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kID0gMDsKKwkJcmVwbHkgPSBjaGVja19jb21tYW5kKGNvbW1vbiwgMTAsIERBVEFfRElSX05PTkUsCisJCQkJICAgICAgKDB4Zjw8MikgfCAoMzw8NyksIDEsCisJCQkJICAgICAgIlNZTkNIUk9OSVpFIENBQ0hFIik7CisJCWlmIChyZXBseSA9PSAwKQorCQkJcmVwbHkgPSBkb19zeW5jaHJvbml6ZV9jYWNoZShjb21tb24pOworCQlicmVhazsKKworCWNhc2UgU0NfVEVTVF9VTklUX1JFQURZOgorCQljb21tb24tPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPSAwOworCQlyZXBseSA9IGNoZWNrX2NvbW1hbmQoY29tbW9uLCA2LCBEQVRBX0RJUl9OT05FLAorCQkJCTAsIDEsCisJCQkJIlRFU1QgVU5JVCBSRUFEWSIpOworCQlicmVhazsKKworCS8qIEFsdGhvdWdoIG9wdGlvbmFsLCB0aGlzIGNvbW1hbmQgaXMgdXNlZCBieSBNUy1XaW5kb3dzLiAgV2UKKwkgKiBzdXBwb3J0IGEgbWluaW1hbCB2ZXJzaW9uOiBCeXRDaGsgbXVzdCBiZSAwLiAqLworCWNhc2UgU0NfVkVSSUZZOgorCQljb21tb24tPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPSAwOworCQlyZXBseSA9IGNoZWNrX2NvbW1hbmQoY29tbW9uLCAxMCwgREFUQV9ESVJfTk9ORSwKKwkJCQkgICAgICAoMTw8MSkgfCAoMHhmPDwyKSB8ICgzPDw3KSwgMSwKKwkJCQkgICAgICAiVkVSSUZZIik7CisJCWlmIChyZXBseSA9PSAwKQorCQkJcmVwbHkgPSBkb192ZXJpZnkoY29tbW9uKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDX1dSSVRFXzY6CisJCWkgPSBjb21tb24tPmNtbmRbNF07CisJCWNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCA9IChpID09IDAgPyAyNTYgOiBpKSA8PCA5OworCQlyZXBseSA9IGNoZWNrX2NvbW1hbmQoY29tbW9uLCA2LCBEQVRBX0RJUl9GUk9NX0hPU1QsCisJCQkJICAgICAgKDc8PDEpIHwgKDE8PDQpLCAxLAorCQkJCSAgICAgICJXUklURSg2KSIpOworCQlpZiAocmVwbHkgPT0gMCkKKwkJCXJlcGx5ID0gZG9fd3JpdGUoY29tbW9uKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDX1dSSVRFXzEwOgorCQljb21tb24tPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPQorCQkJCWdldF91bmFsaWduZWRfYmUxNigmY29tbW9uLT5jbW5kWzddKSA8PCA5OworCQlyZXBseSA9IGNoZWNrX2NvbW1hbmQoY29tbW9uLCAxMCwgREFUQV9ESVJfRlJPTV9IT1NULAorCQkJCSAgICAgICgxPDwxKSB8ICgweGY8PDIpIHwgKDM8PDcpLCAxLAorCQkJCSAgICAgICJXUklURSgxMCkiKTsKKwkJaWYgKHJlcGx5ID09IDApCisJCQlyZXBseSA9IGRvX3dyaXRlKGNvbW1vbik7CisJCWJyZWFrOworCisJY2FzZSBTQ19XUklURV8xMjoKKwkJY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kID0KKwkJCQlnZXRfdW5hbGlnbmVkX2JlMzIoJmNvbW1vbi0+Y21uZFs2XSkgPDwgOTsKKwkJcmVwbHkgPSBjaGVja19jb21tYW5kKGNvbW1vbiwgMTIsIERBVEFfRElSX0ZST01fSE9TVCwKKwkJCQkgICAgICAoMTw8MSkgfCAoMHhmPDwyKSB8ICgweGY8PDYpLCAxLAorCQkJCSAgICAgICJXUklURSgxMikiKTsKKwkJaWYgKHJlcGx5ID09IDApCisJCQlyZXBseSA9IGRvX3dyaXRlKGNvbW1vbik7CisJCWJyZWFrOworCisJLyogU29tZSBtYW5kYXRvcnkgY29tbWFuZHMgdGhhdCB3ZSByZWNvZ25pemUgYnV0IGRvbid0IGltcGxlbWVudC4KKwkgKiBUaGV5IGRvbid0IG1lYW4gbXVjaCBpbiB0aGlzIHNldHRpbmcuICBJdCdzIGxlZnQgYXMgYW4gZXhlcmNpc2UKKwkgKiBmb3IgYW55b25lIGludGVyZXN0ZWQgdG8gaW1wbGVtZW50IFJFU0VSVkUgYW5kIFJFTEVBU0UgaW4gdGVybXMKKwkgKiBvZiBQb3NpeCBsb2Nrcy4gKi8KKwljYXNlIFNDX0ZPUk1BVF9VTklUOgorCWNhc2UgU0NfUkVMRUFTRToKKwljYXNlIFNDX1JFU0VSVkU6CisJY2FzZSBTQ19TRU5EX0RJQUdOT1NUSUM6CisJCS8qIEZhbGwgdGhyb3VnaCAqLworCisJZGVmYXVsdDoKK3Vua25vd25fY21uZDoKKwkJY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kID0gMDsKKwkJc3ByaW50Zih1bmtub3duLCAiVW5rbm93biB4JTAyeCIsIGNvbW1vbi0+Y21uZFswXSk7CisJCXJlcGx5ID0gY2hlY2tfY29tbWFuZChjb21tb24sIGNvbW1vbi0+Y21uZF9zaXplLAorCQkJCSAgICAgIERBVEFfRElSX1VOS05PV04sIDB4ZmYsIDAsIHVua25vd24pOworCQlpZiAocmVwbHkgPT0gMCkgeworCQkJY29tbW9uLT5jdXJsdW4tPnNlbnNlX2RhdGEgPSBTU19JTlZBTElEX0NPTU1BTkQ7CisJCQlyZXBseSA9IC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJfQorCXVwX3JlYWQoJmNvbW1vbi0+ZmlsZXNlbSk7CisKKwlpZiAocmVwbHkgPT0gLUVJTlRSIHx8IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVJTlRSOworCisJLyogU2V0IHVwIHRoZSBzaW5nbGUgcmVwbHkgYnVmZmVyIGZvciBmaW5pc2hfcmVwbHkoKSAqLworCWlmIChyZXBseSA9PSAtRUlOVkFMKQorCQlyZXBseSA9IDA7CQkvKiBFcnJvciByZXBseSBsZW5ndGggKi8KKwlpZiAocmVwbHkgPj0gMCAmJiBjb21tb24tPmRhdGFfZGlyID09IERBVEFfRElSX1RPX0hPU1QpIHsKKwkJcmVwbHkgPSBtaW4oKHUzMikgcmVwbHksIGNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCk7CisJCWJoLT5pbnJlcS0+bGVuZ3RoID0gcmVwbHk7CisJCWJoLT5zdGF0ZSA9IEJVRl9TVEFURV9GVUxMOworCQljb21tb24tPnJlc2lkdWUgLT0gcmVwbHk7CisJfQkJCQkvKiBPdGhlcndpc2UgaXQncyBhbHJlYWR5IHNldCAqLworCisJcmV0dXJuIDA7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCByZWNlaXZlZF9jYncoc3RydWN0IGZzZ19kZXYgKmZzZywgc3RydWN0IGZzZ19idWZmaGQgKmJoKQoreworCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxID0gYmgtPm91dHJlcTsKKwlzdHJ1Y3QgZnNnX2J1bGtfY2Jfd3JhcAkqY2J3ID0gcmVxLT5idWY7CisJc3RydWN0IGZzZ19jb21tb24JKmNvbW1vbiA9IGZzZy0+Y29tbW9uOworCisJLyogV2FzIHRoaXMgYSByZWFsIHBhY2tldD8gIFNob3VsZCBpdCBiZSBpZ25vcmVkPyAqLworCWlmIChyZXEtPnN0YXR1cyB8fCB0ZXN0X2JpdChJR05PUkVfQlVMS19PVVQsICZmc2ctPmF0b21pY19iaXRmbGFncykpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogSXMgdGhlIENCVyB2YWxpZD8gKi8KKwlpZiAocmVxLT5hY3R1YWwgIT0gVVNCX0JVTEtfQ0JfV1JBUF9MRU4gfHwKKwkJCWNidy0+U2lnbmF0dXJlICE9IGNwdV90b19sZTMyKAorCQkJCVVTQl9CVUxLX0NCX1NJRykpIHsKKwkJREJHKGZzZywgImludmFsaWQgQ0JXOiBsZW4gJXUgc2lnIDB4JXhcbiIsCisJCQkJcmVxLT5hY3R1YWwsCisJCQkJbGUzMl90b19jcHUoY2J3LT5TaWduYXR1cmUpKTsKKworCQkvKiBUaGUgQnVsay1vbmx5IHNwZWMgc2F5cyB3ZSBNVVNUIHN0YWxsIHRoZSBJTiBlbmRwb2ludAorCQkgKiAoNi42LjEpLCBzbyBpdCdzIHVuYXZvaWRhYmxlLiAgSXQgYWxzbyBzYXlzIHdlIG11c3QKKwkJICogcmV0YWluIHRoaXMgc3RhdGUgdW50aWwgdGhlIG5leHQgcmVzZXQsIGJ1dCB0aGVyZSdzCisJCSAqIG5vIHdheSB0byB0ZWxsIHRoZSBjb250cm9sbGVyIGRyaXZlciBpdCBzaG91bGQgaWdub3JlCisJCSAqIENsZWFyLUZlYXR1cmUoSEFMVCkgcmVxdWVzdHMuCisJCSAqCisJCSAqIFdlIGFyZW4ndCByZXF1aXJlZCB0byBoYWx0IHRoZSBPVVQgZW5kcG9pbnQ7IGluc3RlYWQKKwkJICogd2UgY2FuIHNpbXBseSBhY2NlcHQgYW5kIGRpc2NhcmQgYW55IGRhdGEgcmVjZWl2ZWQKKwkJICogdW50aWwgdGhlIG5leHQgcmVzZXQuICovCisJCXdlZGdlX2J1bGtfaW5fZW5kcG9pbnQoZnNnKTsKKwkJc2V0X2JpdChJR05PUkVfQlVMS19PVVQsICZmc2ctPmF0b21pY19iaXRmbGFncyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIElzIHRoZSBDQlcgbWVhbmluZ2Z1bD8gKi8KKwlpZiAoY2J3LT5MdW4gPj0gRlNHX01BWF9MVU5TIHx8IGNidy0+RmxhZ3MgJiB+VVNCX0JVTEtfSU5fRkxBRyB8fAorCQkJY2J3LT5MZW5ndGggPD0gMCB8fCBjYnctPkxlbmd0aCA+IE1BWF9DT01NQU5EX1NJWkUpIHsKKwkJREJHKGZzZywgIm5vbi1tZWFuaW5nZnVsIENCVzogbHVuID0gJXUsIGZsYWdzID0gMHgleCwgIgorCQkJCSJjbWRsZW4gJXVcbiIsCisJCQkJY2J3LT5MdW4sIGNidy0+RmxhZ3MsIGNidy0+TGVuZ3RoKTsKKworCQkvKiBXZSBjYW4gZG8gYW55dGhpbmcgd2Ugd2FudCBoZXJlLCBzbyBsZXQncyBzdGFsbCB0aGUKKwkJICogYnVsayBwaXBlcyBpZiB3ZSBhcmUgYWxsb3dlZCB0by4gKi8KKwkJaWYgKGNvbW1vbi0+Y2FuX3N0YWxsKSB7CisJCQlmc2dfc2V0X2hhbHQoZnNnLCBmc2ctPmJ1bGtfb3V0KTsKKwkJCWhhbHRfYnVsa19pbl9lbmRwb2ludChmc2cpOworCQl9CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFNhdmUgdGhlIGNvbW1hbmQgZm9yIGxhdGVyICovCisJY29tbW9uLT5jbW5kX3NpemUgPSBjYnctPkxlbmd0aDsKKwltZW1jcHkoY29tbW9uLT5jbW5kLCBjYnctPkNEQiwgY29tbW9uLT5jbW5kX3NpemUpOworCWlmIChjYnctPkZsYWdzICYgVVNCX0JVTEtfSU5fRkxBRykKKwkJY29tbW9uLT5kYXRhX2RpciA9IERBVEFfRElSX1RPX0hPU1Q7CisJZWxzZQorCQljb21tb24tPmRhdGFfZGlyID0gREFUQV9ESVJfRlJPTV9IT1NUOworCWNvbW1vbi0+ZGF0YV9zaXplID0gbGUzMl90b19jcHUoY2J3LT5EYXRhVHJhbnNmZXJMZW5ndGgpOworCWlmIChjb21tb24tPmRhdGFfc2l6ZSA9PSAwKQorCQljb21tb24tPmRhdGFfZGlyID0gREFUQV9ESVJfTk9ORTsKKwljb21tb24tPmx1biA9IGNidy0+THVuOworCWNvbW1vbi0+dGFnID0gY2J3LT5UYWc7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBnZXRfbmV4dF9jb21tYW5kKHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24pCit7CisJc3RydWN0IGZzZ19idWZmaGQJKmJoOworCWludAkJCXJjID0gMDsKKworCS8qIFdhaXQgZm9yIHRoZSBuZXh0IGJ1ZmZlciB0byBiZWNvbWUgYXZhaWxhYmxlICovCisJYmggPSBjb21tb24tPm5leHRfYnVmZmhkX3RvX2ZpbGw7CisJd2hpbGUgKGJoLT5zdGF0ZSAhPSBCVUZfU1RBVEVfRU1QVFkpIHsKKwkJcmMgPSBzbGVlcF90aHJlYWQoY29tbW9uKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0KKworCS8qIFF1ZXVlIGEgcmVxdWVzdCB0byByZWFkIGEgQnVsay1vbmx5IENCVyAqLworCXNldF9idWxrX291dF9yZXFfbGVuZ3RoKGNvbW1vbiwgYmgsIFVTQl9CVUxLX0NCX1dSQVBfTEVOKTsKKwliaC0+b3V0cmVxLT5zaG9ydF9ub3Rfb2sgPSAxOworCVNUQVJUX1RSQU5TRkVSX09SKGNvbW1vbiwgYnVsa19vdXQsIGJoLT5vdXRyZXEsCisJCQkgICZiaC0+b3V0cmVxX2J1c3ksICZiaC0+c3RhdGUpCisJCS8qIERvbid0IGtub3cgd2hhdCB0byBkbyBpZiBjb21tb24tPmZzZyBpcyBOVUxMICovCisJCXJldHVybiAtRUlPOworCisJLyogV2Ugd2lsbCBkcmFpbiB0aGUgYnVmZmVyIGluIHNvZnR3YXJlLCB3aGljaCBtZWFucyB3ZQorCSAqIGNhbiByZXVzZSBpdCBmb3IgdGhlIG5leHQgZmlsbGluZy4gIE5vIG5lZWQgdG8gYWR2YW5jZQorCSAqIG5leHRfYnVmZmhkX3RvX2ZpbGwuICovCisKKwkvKiBXYWl0IGZvciB0aGUgQ0JXIHRvIGFycml2ZSAqLworCXdoaWxlIChiaC0+c3RhdGUgIT0gQlVGX1NUQVRFX0ZVTEwpIHsKKwkJcmMgPSBzbGVlcF90aHJlYWQoY29tbW9uKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0KKwlzbXBfcm1iKCk7CisJcmMgPSBmc2dfaXNfc2V0KGNvbW1vbikgPyByZWNlaXZlZF9jYncoY29tbW9uLT5mc2csIGJoKSA6IC1FSU87CisJYmgtPnN0YXRlID0gQlVGX1NUQVRFX0VNUFRZOworCisJcmV0dXJuIHJjOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgZW5hYmxlX2VuZHBvaW50KHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24sIHN0cnVjdCB1c2JfZXAgKmVwLAorCQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmQpCit7CisJaW50CXJjOworCisJZXAtPmRyaXZlcl9kYXRhID0gY29tbW9uOworCXJjID0gdXNiX2VwX2VuYWJsZShlcCwgZCk7CisJaWYgKHJjKQorCQlFUlJPUihjb21tb24sICJjYW4ndCBlbmFibGUgJXMsIHJlc3VsdCAlZFxuIiwgZXAtPm5hbWUsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfcmVxdWVzdChzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uLCBzdHJ1Y3QgdXNiX2VwICplcCwKKwkJc3RydWN0IHVzYl9yZXF1ZXN0ICoqcHJlcSkKK3sKKwkqcHJlcSA9IHVzYl9lcF9hbGxvY19yZXF1ZXN0KGVwLCBHRlBfQVRPTUlDKTsKKwlpZiAoKnByZXEpCisJCXJldHVybiAwOworCUVSUk9SKGNvbW1vbiwgImNhbid0IGFsbG9jYXRlIHJlcXVlc3QgZm9yICVzXG4iLCBlcC0+bmFtZSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qCisgKiBSZXNldCBpbnRlcmZhY2Ugc2V0dGluZyBhbmQgcmUtaW5pdCBlbmRwb2ludCBzdGF0ZSAodG9nZ2xlIGV0YykuCisgKiBDYWxsIHdpdGggYWx0c2V0dGluZyA8IDAgdG8gZGlzYWJsZSB0aGUgaW50ZXJmYWNlLiAgVGhlIG9ubHkgb3RoZXIKKyAqIGF2YWlsYWJsZSBhbHRzZXR0aW5nIGlzIDAsIHdoaWNoIGVuYWJsZXMgdGhlIGludGVyZmFjZS4KKyAqLworc3RhdGljIGludCBkb19zZXRfaW50ZXJmYWNlKHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24sIGludCBhbHRzZXR0aW5nKQoreworCWludAlyYyA9IDA7CisJaW50CWk7CisJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSpkOworCisJaWYgKGNvbW1vbi0+cnVubmluZykKKwkJREJHKGNvbW1vbiwgInJlc2V0IGludGVyZmFjZVxuIik7CisKK3Jlc2V0OgorCS8qIERlYWxsb2NhdGUgdGhlIHJlcXVlc3RzICovCisJaWYgKGNvbW1vbi0+cHJldl9mc2cpIHsKKwkJc3RydWN0IGZzZ19kZXYgKmZzZyA9IGNvbW1vbi0+cHJldl9mc2c7CisKKwkJZm9yIChpID0gMDsgaSA8IEZTR19OVU1fQlVGRkVSUzsgKytpKSB7CisJCQlzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmggPSAmY29tbW9uLT5idWZmaGRzW2ldOworCisJCQlpZiAoYmgtPmlucmVxKSB7CisJCQkJdXNiX2VwX2ZyZWVfcmVxdWVzdChmc2ctPmJ1bGtfaW4sIGJoLT5pbnJlcSk7CisJCQkJYmgtPmlucmVxID0gTlVMTDsKKwkJCX0KKwkJCWlmIChiaC0+b3V0cmVxKSB7CisJCQkJdXNiX2VwX2ZyZWVfcmVxdWVzdChmc2ctPmJ1bGtfb3V0LCBiaC0+b3V0cmVxKTsKKwkJCQliaC0+b3V0cmVxID0gTlVMTDsKKwkJCX0KKwkJfQorCisJCS8qIERpc2FibGUgdGhlIGVuZHBvaW50cyAqLworCQlpZiAoZnNnLT5idWxrX2luX2VuYWJsZWQpIHsKKwkJCXVzYl9lcF9kaXNhYmxlKGZzZy0+YnVsa19pbik7CisJCQlmc2ctPmJ1bGtfaW5fZW5hYmxlZCA9IDA7CisJCX0KKwkJaWYgKGZzZy0+YnVsa19vdXRfZW5hYmxlZCkgeworCQkJdXNiX2VwX2Rpc2FibGUoZnNnLT5idWxrX291dCk7CisJCQlmc2ctPmJ1bGtfb3V0X2VuYWJsZWQgPSAwOworCQl9CisKKwkJY29tbW9uLT5wcmV2X2ZzZyA9IDA7CisJfQorCisJY29tbW9uLT5ydW5uaW5nID0gMDsKKwlpZiAoYWx0c2V0dGluZyA8IDAgfHwgcmMgIT0gMCkKKwkJcmV0dXJuIHJjOworCisJREJHKGNvbW1vbiwgInNldCBpbnRlcmZhY2UgJWRcbiIsIGFsdHNldHRpbmcpOworCisJaWYgKGZzZ19pc19zZXQoY29tbW9uKSkgeworCQlzdHJ1Y3QgZnNnX2RldiAqZnNnID0gY29tbW9uLT5mc2c7CisJCWNvbW1vbi0+cHJldl9mc2cgPSBjb21tb24tPmZzZzsKKworCQkvKiBFbmFibGUgdGhlIGVuZHBvaW50cyAqLworCQlkID0gZnNnX2VwX2Rlc2MoY29tbW9uLT5nYWRnZXQsCisJCQkJJmZzZ19mc19idWxrX2luX2Rlc2MsICZmc2dfaHNfYnVsa19pbl9kZXNjKTsKKwkJcmMgPSBlbmFibGVfZW5kcG9pbnQoY29tbW9uLCBmc2ctPmJ1bGtfaW4sIGQpOworCQlpZiAocmMpCisJCQlnb3RvIHJlc2V0OworCQlmc2ctPmJ1bGtfaW5fZW5hYmxlZCA9IDE7CisKKwkJZCA9IGZzZ19lcF9kZXNjKGNvbW1vbi0+Z2FkZ2V0LAorCQkJCSZmc2dfZnNfYnVsa19vdXRfZGVzYywgJmZzZ19oc19idWxrX291dF9kZXNjKTsKKwkJcmMgPSBlbmFibGVfZW5kcG9pbnQoY29tbW9uLCBmc2ctPmJ1bGtfb3V0LCBkKTsKKwkJaWYgKHJjKQorCQkJZ290byByZXNldDsKKwkJZnNnLT5idWxrX291dF9lbmFibGVkID0gMTsKKwkJY29tbW9uLT5idWxrX291dF9tYXhwYWNrZXQgPSBsZTE2X3RvX2NwdShkLT53TWF4UGFja2V0U2l6ZSk7CisJCWNsZWFyX2JpdChJR05PUkVfQlVMS19PVVQsICZmc2ctPmF0b21pY19iaXRmbGFncyk7CisKKwkJLyogQWxsb2NhdGUgdGhlIHJlcXVlc3RzICovCisJCWZvciAoaSA9IDA7IGkgPCBGU0dfTlVNX0JVRkZFUlM7ICsraSkgeworCQkJc3RydWN0IGZzZ19idWZmaGQJKmJoID0gJmNvbW1vbi0+YnVmZmhkc1tpXTsKKworCQkJcmMgPSBhbGxvY19yZXF1ZXN0KGNvbW1vbiwgZnNnLT5idWxrX2luLCAmYmgtPmlucmVxKTsKKwkJCWlmIChyYykKKwkJCQlnb3RvIHJlc2V0OworCQkJcmMgPSBhbGxvY19yZXF1ZXN0KGNvbW1vbiwgZnNnLT5idWxrX291dCwgJmJoLT5vdXRyZXEpOworCQkJaWYgKHJjKQorCQkJCWdvdG8gcmVzZXQ7CisJCQliaC0+aW5yZXEtPmJ1ZiA9IGJoLT5vdXRyZXEtPmJ1ZiA9IGJoLT5idWY7CisJCQliaC0+aW5yZXEtPmNvbnRleHQgPSBiaC0+b3V0cmVxLT5jb250ZXh0ID0gYmg7CisJCQliaC0+aW5yZXEtPmNvbXBsZXRlID0gYnVsa19pbl9jb21wbGV0ZTsKKwkJCWJoLT5vdXRyZXEtPmNvbXBsZXRlID0gYnVsa19vdXRfY29tcGxldGU7CisJCX0KKworCQljb21tb24tPnJ1bm5pbmcgPSAxOworCQlmb3IgKGkgPSAwOyBpIDwgY29tbW9uLT5ubHVuczsgKytpKQorCQkJY29tbW9uLT5sdW5zW2ldLnVuaXRfYXR0ZW50aW9uX2RhdGEgPSBTU19SRVNFVF9PQ0NVUlJFRDsKKwkJcmV0dXJuIHJjOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlPOworCX0KK30KKworCisvKgorICogQ2hhbmdlIG91ciBvcGVyYXRpb25hbCBjb25maWd1cmF0aW9uLiAgVGhpcyBjb2RlIG11c3QgYWdyZWUgd2l0aCB0aGUgY29kZQorICogdGhhdCByZXR1cm5zIGNvbmZpZyBkZXNjcmlwdG9ycywgYW5kIHdpdGggaW50ZXJmYWNlIGFsdHNldHRpbmcgY29kZS4KKyAqCisgKiBJdCdzIGFsc28gcmVzcG9uc2libGUgZm9yIHBvd2VyIG1hbmFnZW1lbnQgaW50ZXJhY3Rpb25zLiAgU29tZQorICogY29uZmlndXJhdGlvbnMgbWlnaHQgbm90IHdvcmsgd2l0aCBvdXIgY3VycmVudCBwb3dlciBzb3VyY2VzLgorICogRm9yIG5vdyB3ZSBqdXN0IGFzc3VtZSB0aGUgZ2FkZ2V0IGlzIGFsd2F5cyBzZWxmLXBvd2VyZWQuCisgKi8KK3N0YXRpYyBpbnQgZG9fc2V0X2NvbmZpZyhzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uLCB1OCBuZXdfY29uZmlnKQoreworCWludAlyYyA9IDA7CisKKwkvKiBEaXNhYmxlIHRoZSBzaW5nbGUgaW50ZXJmYWNlICovCisJaWYgKGNvbW1vbi0+Y29uZmlnICE9IDApIHsKKwkJREJHKGNvbW1vbiwgInJlc2V0IGNvbmZpZ1xuIik7CisJCWNvbW1vbi0+Y29uZmlnID0gMDsKKwkJcmMgPSBkb19zZXRfaW50ZXJmYWNlKGNvbW1vbiwgLTEpOworCX0KKworCS8qIEVuYWJsZSB0aGUgaW50ZXJmYWNlICovCisJaWYgKG5ld19jb25maWcgIT0gMCkgeworCQljb21tb24tPmNvbmZpZyA9IG5ld19jb25maWc7CisJCXJjID0gZG9fc2V0X2ludGVyZmFjZShjb21tb24sIDApOworCQlpZiAocmMgIT0gMCkKKwkJCWNvbW1vbi0+Y29uZmlnID0gMDsJLyogUmVzZXQgb24gZXJyb3JzICovCisJfQorCXJldHVybiByYzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFMVCBDT05GSUdTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgaW50IGZzZ19zZXRfYWx0KHN0cnVjdCB1c2JfZnVuY3Rpb24gKmYsIHVuc2lnbmVkIGludGYsIHVuc2lnbmVkIGFsdCkKK3sKKwlzdHJ1Y3QgZnNnX2RldiAqZnNnID0gZnNnX2Zyb21fZnVuYyhmKTsKKwlmc2ctPmNvbW1vbi0+cHJldl9mc2cgPSBmc2ctPmNvbW1vbi0+ZnNnOworCWZzZy0+Y29tbW9uLT5mc2cgPSBmc2c7CisJZnNnLT5jb21tb24tPm5ld19jb25maWcgPSAxOworCXJhaXNlX2V4Y2VwdGlvbihmc2ctPmNvbW1vbiwgRlNHX1NUQVRFX0NPTkZJR19DSEFOR0UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmc2dfZGlzYWJsZShzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmKQoreworCXN0cnVjdCBmc2dfZGV2ICpmc2cgPSBmc2dfZnJvbV9mdW5jKGYpOworCWZzZy0+Y29tbW9uLT5wcmV2X2ZzZyA9IGZzZy0+Y29tbW9uLT5mc2c7CisJZnNnLT5jb21tb24tPmZzZyA9IGZzZzsKKwlmc2ctPmNvbW1vbi0+bmV3X2NvbmZpZyA9IDA7CisJcmFpc2VfZXhjZXB0aW9uKGZzZy0+Y29tbW9uLCBGU0dfU1RBVEVfQ09ORklHX0NIQU5HRSk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgaGFuZGxlX2V4Y2VwdGlvbihzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uKQoreworCXNpZ2luZm9fdAkJaW5mbzsKKwlpbnQJCQlzaWc7CisJaW50CQkJaTsKKwlzdHJ1Y3QgZnNnX2J1ZmZoZAkqYmg7CisJZW51bSBmc2dfc3RhdGUJCW9sZF9zdGF0ZTsKKwl1OAkJCW5ld19jb25maWc7CisJc3RydWN0IGZzZ19sdW4JCSpjdXJsdW47CisJdW5zaWduZWQgaW50CQlleGNlcHRpb25fcmVxX3RhZzsKKwlpbnQJCQlyYzsKKworCS8qIENsZWFyIHRoZSBleGlzdGluZyBzaWduYWxzLiAgQW55dGhpbmcgYnV0IFNJR1VTUjEgaXMgY29udmVydGVkCisJICogaW50byBhIGhpZ2gtcHJpb3JpdHkgRVhJVCBleGNlcHRpb24uICovCisJZm9yICg7OykgeworCQlzaWcgPSBkZXF1ZXVlX3NpZ25hbF9sb2NrKGN1cnJlbnQsICZjdXJyZW50LT5ibG9ja2VkLCAmaW5mbyk7CisJCWlmICghc2lnKQorCQkJYnJlYWs7CisJCWlmIChzaWcgIT0gU0lHVVNSMSkgeworCQkJaWYgKGNvbW1vbi0+c3RhdGUgPCBGU0dfU1RBVEVfRVhJVCkKKwkJCQlEQkcoY29tbW9uLCAiTWFpbiB0aHJlYWQgZXhpdGluZyBvbiBzaWduYWxcbiIpOworCQkJcmFpc2VfZXhjZXB0aW9uKGNvbW1vbiwgRlNHX1NUQVRFX0VYSVQpOworCQl9CisJfQorCisJLyogQ2FuY2VsIGFsbCB0aGUgcGVuZGluZyB0cmFuc2ZlcnMgKi8KKwlpZiAoZnNnX2lzX3NldChjb21tb24pKSB7CisJCWZvciAoaSA9IDA7IGkgPCBGU0dfTlVNX0JVRkZFUlM7ICsraSkgeworCQkJYmggPSAmY29tbW9uLT5idWZmaGRzW2ldOworCQkJaWYgKGJoLT5pbnJlcV9idXN5KQorCQkJCXVzYl9lcF9kZXF1ZXVlKGNvbW1vbi0+ZnNnLT5idWxrX2luLCBiaC0+aW5yZXEpOworCQkJaWYgKGJoLT5vdXRyZXFfYnVzeSkKKwkJCQl1c2JfZXBfZGVxdWV1ZShjb21tb24tPmZzZy0+YnVsa19vdXQsCisJCQkJCSAgICAgICBiaC0+b3V0cmVxKTsKKwkJfQorCisJCS8qIFdhaXQgdW50aWwgZXZlcnl0aGluZyBpcyBpZGxlICovCisJCWZvciAoOzspIHsKKwkJCWludCBudW1fYWN0aXZlID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCBGU0dfTlVNX0JVRkZFUlM7ICsraSkgeworCQkJCWJoID0gJmNvbW1vbi0+YnVmZmhkc1tpXTsKKwkJCQludW1fYWN0aXZlICs9IGJoLT5pbnJlcV9idXN5ICsgYmgtPm91dHJlcV9idXN5OworCQkJfQorCQkJaWYgKG51bV9hY3RpdmUgPT0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChzbGVlcF90aHJlYWQoY29tbW9uKSkKKwkJCQlyZXR1cm47CisJCX0KKworCQkvKiBDbGVhciBvdXQgdGhlIGNvbnRyb2xsZXIncyBmaWZvcyAqLworCQlpZiAoY29tbW9uLT5mc2ctPmJ1bGtfaW5fZW5hYmxlZCkKKwkJCXVzYl9lcF9maWZvX2ZsdXNoKGNvbW1vbi0+ZnNnLT5idWxrX2luKTsKKwkJaWYgKGNvbW1vbi0+ZnNnLT5idWxrX291dF9lbmFibGVkKQorCQkJdXNiX2VwX2ZpZm9fZmx1c2goY29tbW9uLT5mc2ctPmJ1bGtfb3V0KTsKKwl9CisKKwkvKiBSZXNldCB0aGUgSS9PIGJ1ZmZlciBzdGF0ZXMgYW5kIHBvaW50ZXJzLCB0aGUgU0NTSQorCSAqIHN0YXRlLCBhbmQgdGhlIGV4Y2VwdGlvbi4gIFRoZW4gaW52b2tlIHRoZSBoYW5kbGVyLiAqLworCXNwaW5fbG9ja19pcnEoJmNvbW1vbi0+bG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRlNHX05VTV9CVUZGRVJTOyArK2kpIHsKKwkJYmggPSAmY29tbW9uLT5idWZmaGRzW2ldOworCQliaC0+c3RhdGUgPSBCVUZfU1RBVEVfRU1QVFk7CisJfQorCWNvbW1vbi0+bmV4dF9idWZmaGRfdG9fZmlsbCA9ICZjb21tb24tPmJ1ZmZoZHNbMF07CisJY29tbW9uLT5uZXh0X2J1ZmZoZF90b19kcmFpbiA9ICZjb21tb24tPmJ1ZmZoZHNbMF07CisJZXhjZXB0aW9uX3JlcV90YWcgPSBjb21tb24tPmV4Y2VwdGlvbl9yZXFfdGFnOworCW5ld19jb25maWcgPSBjb21tb24tPm5ld19jb25maWc7CisJb2xkX3N0YXRlID0gY29tbW9uLT5zdGF0ZTsKKworCWlmIChvbGRfc3RhdGUgPT0gRlNHX1NUQVRFX0FCT1JUX0JVTEtfT1VUKQorCQljb21tb24tPnN0YXRlID0gRlNHX1NUQVRFX1NUQVRVU19QSEFTRTsKKwllbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IGNvbW1vbi0+bmx1bnM7ICsraSkgeworCQkJY3VybHVuID0gJmNvbW1vbi0+bHVuc1tpXTsKKwkJCWN1cmx1bi0+cHJldmVudF9tZWRpdW1fcmVtb3ZhbCA9IDA7CisJCQljdXJsdW4tPnNlbnNlX2RhdGEgPSBTU19OT19TRU5TRTsKKwkJCWN1cmx1bi0+dW5pdF9hdHRlbnRpb25fZGF0YSA9IFNTX05PX1NFTlNFOworCQkJY3VybHVuLT5zZW5zZV9kYXRhX2luZm8gPSAwOworCQkJY3VybHVuLT5pbmZvX3ZhbGlkID0gMDsKKwkJfQorCQljb21tb24tPnN0YXRlID0gRlNHX1NUQVRFX0lETEU7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmY29tbW9uLT5sb2NrKTsKKworCS8qIENhcnJ5IG91dCBhbnkgZXh0cmEgYWN0aW9ucyByZXF1aXJlZCBmb3IgdGhlIGV4Y2VwdGlvbiAqLworCXN3aXRjaCAob2xkX3N0YXRlKSB7CisJY2FzZSBGU0dfU1RBVEVfQUJPUlRfQlVMS19PVVQ6CisJCXNlbmRfc3RhdHVzKGNvbW1vbik7CisJCXNwaW5fbG9ja19pcnEoJmNvbW1vbi0+bG9jayk7CisJCWlmIChjb21tb24tPnN0YXRlID09IEZTR19TVEFURV9TVEFUVVNfUEhBU0UpCisJCQljb21tb24tPnN0YXRlID0gRlNHX1NUQVRFX0lETEU7CisJCXNwaW5fdW5sb2NrX2lycSgmY29tbW9uLT5sb2NrKTsKKwkJYnJlYWs7CisKKwljYXNlIEZTR19TVEFURV9SRVNFVDoKKwkJLyogSW4gY2FzZSB3ZSB3ZXJlIGZvcmNlZCBhZ2FpbnN0IG91ciB3aWxsIHRvIGhhbHQgYQorCQkgKiBidWxrIGVuZHBvaW50LCBjbGVhciB0aGUgaGFsdCBub3cuICAoVGhlIFN1cGVySCBVREMKKwkJICogcmVxdWlyZXMgdGhpcy4pICovCisJCWlmICghZnNnX2lzX3NldChjb21tb24pKQorCQkJYnJlYWs7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSUdOT1JFX0JVTEtfT1VULAorCQkJCSAgICAgICAmY29tbW9uLT5mc2ctPmF0b21pY19iaXRmbGFncykpCisJCQl1c2JfZXBfY2xlYXJfaGFsdChjb21tb24tPmZzZy0+YnVsa19pbik7CisKKwkJaWYgKGNvbW1vbi0+ZXAwX3JlcV90YWcgPT0gZXhjZXB0aW9uX3JlcV90YWcpCisJCQllcDBfcXVldWUoY29tbW9uKTsJLyogQ29tcGxldGUgdGhlIHN0YXR1cyBzdGFnZSAqLworCisJCS8qIFRlY2huaWNhbGx5IHRoaXMgc2hvdWxkIGdvIGhlcmUsIGJ1dCBpdCB3b3VsZCBvbmx5IGJlCisJCSAqIGEgd2FzdGUgb2YgdGltZS4gIERpdHRvIGZvciB0aGUgSU5URVJGQUNFX0NIQU5HRSBhbmQKKwkJICogQ09ORklHX0NIQU5HRSBjYXNlcy4gKi8KKwkJLyogZm9yIChpID0gMDsgaSA8IGNvbW1vbi0+bmx1bnM7ICsraSkgKi8KKwkJLyoJY29tbW9uLT5sdW5zW2ldLnVuaXRfYXR0ZW50aW9uX2RhdGEgPSAqLworCQkvKgkJU1NfUkVTRVRfT0NDVVJSRUQ7ICAqLworCQlicmVhazsKKworCWNhc2UgRlNHX1NUQVRFX0NPTkZJR19DSEFOR0U6CisJCXJjID0gZG9fc2V0X2NvbmZpZyhjb21tb24sIG5ld19jb25maWcpOworCQlpZiAoY29tbW9uLT5lcDBfcmVxX3RhZyAhPSBleGNlcHRpb25fcmVxX3RhZykKKwkJCWJyZWFrOworCQlpZiAocmMgIT0gMCkgewkJCS8qIFNUQUxMIG9uIGVycm9ycyAqLworCQkJREJHKGNvbW1vbiwgImVwMCBzZXQgaGFsdFxuIik7CisJCQl1c2JfZXBfc2V0X2hhbHQoY29tbW9uLT5lcDApOworCQl9IGVsc2UgewkJCS8qIENvbXBsZXRlIHRoZSBzdGF0dXMgc3RhZ2UgKi8KKwkJCWVwMF9xdWV1ZShjb21tb24pOworCQl9CisJCWJyZWFrOworCisJY2FzZSBGU0dfU1RBVEVfRVhJVDoKKwljYXNlIEZTR19TVEFURV9URVJNSU5BVEVEOgorCQlkb19zZXRfY29uZmlnKGNvbW1vbiwgMCk7CQkvKiBGcmVlIHJlc291cmNlcyAqLworCQlzcGluX2xvY2tfaXJxKCZjb21tb24tPmxvY2spOworCQljb21tb24tPnN0YXRlID0gRlNHX1NUQVRFX1RFUk1JTkFURUQ7CS8qIFN0b3AgdGhlIHRocmVhZCAqLworCQlzcGluX3VubG9ja19pcnEoJmNvbW1vbi0+bG9jayk7CisJCWJyZWFrOworCisJY2FzZSBGU0dfU1RBVEVfSU5URVJGQUNFX0NIQU5HRToKKwljYXNlIEZTR19TVEFURV9ESVNDT05ORUNUOgorCWNhc2UgRlNHX1NUQVRFX0NPTU1BTkRfUEhBU0U6CisJY2FzZSBGU0dfU1RBVEVfREFUQV9QSEFTRToKKwljYXNlIEZTR19TVEFURV9TVEFUVVNfUEhBU0U6CisJY2FzZSBGU0dfU1RBVEVfSURMRToKKwkJYnJlYWs7CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgZnNnX21haW5fdGhyZWFkKHZvaWQgKmNvbW1vbl8pCit7CisJc3RydWN0IGZzZ19jb21tb24JKmNvbW1vbiA9IGNvbW1vbl87CisKKwkvKiBBbGxvdyB0aGUgdGhyZWFkIHRvIGJlIGtpbGxlZCBieSBhIHNpZ25hbCwgYnV0IHNldCB0aGUgc2lnbmFsIG1hc2sKKwkgKiB0byBibG9jayBldmVyeXRoaW5nIGJ1dCBJTlQsIFRFUk0sIEtJTEwsIGFuZCBVU1IxLiAqLworCWFsbG93X3NpZ25hbChTSUdJTlQpOworCWFsbG93X3NpZ25hbChTSUdURVJNKTsKKwlhbGxvd19zaWduYWwoU0lHS0lMTCk7CisJYWxsb3dfc2lnbmFsKFNJR1VTUjEpOworCisJLyogQWxsb3cgdGhlIHRocmVhZCB0byBiZSBmcm96ZW4gKi8KKwlzZXRfZnJlZXphYmxlKCk7CisKKwkvKiBBcnJhbmdlIGZvciB1c2Vyc3BhY2UgcmVmZXJlbmNlcyB0byBiZSBpbnRlcnByZXRlZCBhcyBrZXJuZWwKKwkgKiBwb2ludGVycy4gIFRoYXQgd2F5IHdlIGNhbiBwYXNzIGEga2VybmVsIHBvaW50ZXIgdG8gYSByb3V0aW5lCisJICogdGhhdCBleHBlY3RzIGEgX191c2VyIHBvaW50ZXIgYW5kIGl0IHdpbGwgd29yayBva2F5LiAqLworCXNldF9mcyhnZXRfZHMoKSk7CisKKwkvKiBUaGUgbWFpbiBsb29wICovCisJd2hpbGUgKGNvbW1vbi0+c3RhdGUgIT0gRlNHX1NUQVRFX1RFUk1JTkFURUQpIHsKKwkJaWYgKGV4Y2VwdGlvbl9pbl9wcm9ncmVzcyhjb21tb24pIHx8IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQloYW5kbGVfZXhjZXB0aW9uKGNvbW1vbik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghY29tbW9uLT5ydW5uaW5nKSB7CisJCQlzbGVlcF90aHJlYWQoY29tbW9uKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGdldF9uZXh0X2NvbW1hbmQoY29tbW9uKSkKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fbG9ja19pcnEoJmNvbW1vbi0+bG9jayk7CisJCWlmICghZXhjZXB0aW9uX2luX3Byb2dyZXNzKGNvbW1vbikpCisJCQljb21tb24tPnN0YXRlID0gRlNHX1NUQVRFX0RBVEFfUEhBU0U7CisJCXNwaW5fdW5sb2NrX2lycSgmY29tbW9uLT5sb2NrKTsKKworCQlpZiAoZG9fc2NzaV9jb21tYW5kKGNvbW1vbikgfHwgZmluaXNoX3JlcGx5KGNvbW1vbikpCisJCQljb250aW51ZTsKKworCQlzcGluX2xvY2tfaXJxKCZjb21tb24tPmxvY2spOworCQlpZiAoIWV4Y2VwdGlvbl9pbl9wcm9ncmVzcyhjb21tb24pKQorCQkJY29tbW9uLT5zdGF0ZSA9IEZTR19TVEFURV9TVEFUVVNfUEhBU0U7CisJCXNwaW5fdW5sb2NrX2lycSgmY29tbW9uLT5sb2NrKTsKKworCQlpZiAoc2VuZF9zdGF0dXMoY29tbW9uKSkKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fbG9ja19pcnEoJmNvbW1vbi0+bG9jayk7CisJCWlmICghZXhjZXB0aW9uX2luX3Byb2dyZXNzKGNvbW1vbikpCisJCQljb21tb24tPnN0YXRlID0gRlNHX1NUQVRFX0lETEU7CisJCXNwaW5fdW5sb2NrX2lycSgmY29tbW9uLT5sb2NrKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZjb21tb24tPmxvY2spOworCWNvbW1vbi0+dGhyZWFkX3Rhc2sgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycSgmY29tbW9uLT5sb2NrKTsKKworCWlmIChjb21tb24tPnRocmVhZF9leGl0cykKKwkJY29tbW9uLT50aHJlYWRfZXhpdHMoY29tbW9uKTsKKworCS8qIExldCB0aGUgdW5iaW5kIGFuZCBjbGVhbnVwIHJvdXRpbmVzIGtub3cgdGhlIHRocmVhZCBoYXMgZXhpdGVkICovCisJY29tcGxldGVfYW5kX2V4aXQoJmNvbW1vbi0+dGhyZWFkX25vdGlmaWVyLCAwKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIERFVklDRSBBVFRSSUJVVEVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogV3JpdGUgcGVybWlzc2lvbiBpcyBjaGVja2VkIHBlciBMVU4gaW4gc3RvcmVfKigpIGZ1bmN0aW9ucy4gKi8KK3N0YXRpYyBERVZJQ0VfQVRUUihybywgMDY0NCwgZnNnX3Nob3dfcm8sIGZzZ19zdG9yZV9ybyk7CitzdGF0aWMgREVWSUNFX0FUVFIoZmlsZSwgMDY0NCwgZnNnX3Nob3dfZmlsZSwgZnNnX3N0b3JlX2ZpbGUpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRlNHIENPTU1PTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGZzZ19jb21tb25fcmVsZWFzZShzdHJ1Y3Qga3JlZiAqcmVmKTsKKworc3RhdGljIHZvaWQgZnNnX2x1bl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwkvKiBOb3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIGZzZ19jb21tb25fZ2V0KHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24pCit7CisJa3JlZl9nZXQoJmNvbW1vbi0+cmVmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZzZ19jb21tb25fcHV0KHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24pCit7CisJa3JlZl9wdXQoJmNvbW1vbi0+cmVmLCBmc2dfY29tbW9uX3JlbGVhc2UpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZnNnX2NvbW1vbiAqZnNnX2NvbW1vbl9pbml0KHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24sCisJCQkJCSAgc3RydWN0IHVzYl9jb21wb3NpdGVfZGV2ICpjZGV2LAorCQkJCQkgIHN0cnVjdCBmc2dfY29uZmlnICpjZmcpCit7CisJc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCA9IGNkZXYtPmdhZGdldDsKKwlzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmg7CisJc3RydWN0IGZzZ19sdW4gKmN1cmx1bjsKKwlzdHJ1Y3QgZnNnX2x1bl9jb25maWcgKmxjZmc7CisJaW50IG5sdW5zLCBpLCByYzsKKwljaGFyICpwYXRoYnVmOworCisJLyogRmluZCBvdXQgaG93IG1hbnkgTFVOcyB0aGVyZSBzaG91bGQgYmUgKi8KKwlubHVucyA9IGNmZy0+bmx1bnM7CisJaWYgKG5sdW5zIDwgMSB8fCBubHVucyA+IEZTR19NQVhfTFVOUykgeworCQlkZXZfZXJyKCZnYWRnZXQtPmRldiwgImludmFsaWQgbnVtYmVyIG9mIExVTnM6ICV1XG4iLCBubHVucyk7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCS8qIEFsbG9jYXRlPyAqLworCWlmICghY29tbW9uKSB7CisJCWNvbW1vbiA9IGt6YWxsb2Moc2l6ZW9mICpjb21tb24sIEdGUF9LRVJORUwpOworCQlpZiAoIWNvbW1vbikKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCQljb21tb24tPmZyZWVfc3RvcmFnZV9vbl9yZWxlYXNlID0gMTsKKwl9IGVsc2UgeworCQltZW1zZXQoY29tbW9uLCAwLCBzaXplb2YgY29tbW9uKTsKKwkJY29tbW9uLT5mcmVlX3N0b3JhZ2Vfb25fcmVsZWFzZSA9IDA7CisJfQorCisJY29tbW9uLT5wcml2YXRlX2RhdGEgPSBjZmctPnByaXZhdGVfZGF0YTsKKworCWNvbW1vbi0+Z2FkZ2V0ID0gZ2FkZ2V0OworCWNvbW1vbi0+ZXAwID0gZ2FkZ2V0LT5lcDA7CisJY29tbW9uLT5lcDByZXEgPSBjZGV2LT5yZXE7CisKKwkvKiBNYXliZSBhbGxvY2F0ZSBkZXZpY2UtZ2xvYmFsIHN0cmluZyBJRHMsIGFuZCBwYXRjaCBkZXNjcmlwdG9ycyAqLworCWlmIChmc2dfc3RyaW5nc1tGU0dfU1RSSU5HX0lOVEVSRkFDRV0uaWQgPT0gMCkgeworCQlyYyA9IHVzYl9zdHJpbmdfaWQoY2Rldik7CisJCWlmIChyYyA8IDApIHsKKwkJCWtmcmVlKGNvbW1vbik7CisJCQlyZXR1cm4gRVJSX1BUUihyYyk7CisJCX0KKwkJZnNnX3N0cmluZ3NbRlNHX1NUUklOR19JTlRFUkZBQ0VdLmlkID0gcmM7CisJCWZzZ19pbnRmX2Rlc2MuaUludGVyZmFjZSA9IHJjOworCX0KKworCS8qIENyZWF0ZSB0aGUgTFVOcywgb3BlbiB0aGVpciBiYWNraW5nIGZpbGVzLCBhbmQgcmVnaXN0ZXIgdGhlCisJICogTFVOIGRldmljZXMgaW4gc3lzZnMuICovCisJY3VybHVuID0ga3phbGxvYyhubHVucyAqIHNpemVvZiAqY3VybHVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN1cmx1bikgeworCQlrZnJlZShjb21tb24pOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJY29tbW9uLT5sdW5zID0gY3VybHVuOworCisJaW5pdF9yd3NlbSgmY29tbW9uLT5maWxlc2VtKTsKKworCWZvciAoaSA9IDAsIGxjZmcgPSBjZmctPmx1bnM7IGkgPCBubHVuczsgKytpLCArK2N1cmx1biwgKytsY2ZnKSB7CisJCWN1cmx1bi0+Y2Ryb20gPSAhIWxjZmctPmNkcm9tOworCQljdXJsdW4tPnJvID0gbGNmZy0+Y2Ryb20gfHwgbGNmZy0+cm87CisJCWN1cmx1bi0+cmVtb3ZhYmxlID0gbGNmZy0+cmVtb3ZhYmxlOworCQljdXJsdW4tPmRldi5yZWxlYXNlID0gZnNnX2x1bl9yZWxlYXNlOworCQljdXJsdW4tPmRldi5wYXJlbnQgPSAmZ2FkZ2V0LT5kZXY7CisJCS8qIGN1cmx1bi0+ZGV2LmRyaXZlciA9ICZmc2dfZHJpdmVyLmRyaXZlcjsgWFhYICovCisJCWRldl9zZXRfZHJ2ZGF0YSgmY3VybHVuLT5kZXYsICZjb21tb24tPmZpbGVzZW0pOworCQlkZXZfc2V0X25hbWUoJmN1cmx1bi0+ZGV2LAorCQkJICAgICBjZmctPmx1bl9uYW1lX2Zvcm1hdAorCQkJICAgPyBjZmctPmx1bl9uYW1lX2Zvcm1hdAorCQkJICAgOiAibHVuJWQiLAorCQkJICAgICBpKTsKKworCQlyYyA9IGRldmljZV9yZWdpc3RlcigmY3VybHVuLT5kZXYpOworCQlpZiAocmMpIHsKKwkJCUlORk8oY29tbW9uLCAiZmFpbGVkIHRvIHJlZ2lzdGVyIExVTiVkOiAlZFxuIiwgaSwgcmMpOworCQkJY29tbW9uLT5ubHVucyA9IGk7CisJCQlnb3RvIGVycm9yX3JlbGVhc2U7CisJCX0KKworCQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmY3VybHVuLT5kZXYsICZkZXZfYXR0cl9ybyk7CisJCWlmIChyYykKKwkJCWdvdG8gZXJyb3JfbHVuczsKKwkJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmN1cmx1bi0+ZGV2LCAmZGV2X2F0dHJfZmlsZSk7CisJCWlmIChyYykKKwkJCWdvdG8gZXJyb3JfbHVuczsKKworCQlpZiAobGNmZy0+ZmlsZW5hbWUpIHsKKwkJCXJjID0gZnNnX2x1bl9vcGVuKGN1cmx1biwgbGNmZy0+ZmlsZW5hbWUpOworCQkJaWYgKHJjKQorCQkJCWdvdG8gZXJyb3JfbHVuczsKKwkJfSBlbHNlIGlmICghY3VybHVuLT5yZW1vdmFibGUpIHsKKwkJCUVSUk9SKGNvbW1vbiwgIm5vIGZpbGUgZ2l2ZW4gZm9yIExVTiVkXG4iLCBpKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3JfbHVuczsKKwkJfQorCX0KKwljb21tb24tPm5sdW5zID0gbmx1bnM7CisKKworCS8qIERhdGEgYnVmZmVycyBjeWNsaWMgbGlzdCAqLworCS8qIEJ1ZmZlcnMgaW4gYnVmZmhkcyBhcmUgc3RhdGljIC0tIG5vIG5lZWQgZm9yIGFkZGl0aW9uYWwKKwkgKiBhbGxvY2F0aW9uLiAqLworCWJoID0gY29tbW9uLT5idWZmaGRzOworCWkgPSBGU0dfTlVNX0JVRkZFUlMgLSAxOworCWRvIHsKKwkJYmgtPm5leHQgPSBiaCArIDE7CisJfSB3aGlsZSAoKytiaCwgLS1pKTsKKwliaC0+bmV4dCA9IGNvbW1vbi0+YnVmZmhkczsKKworCisJLyogUHJlcGFyZSBpbnF1aXJ5U3RyaW5nICovCisJaWYgKGNmZy0+cmVsZWFzZSAhPSAweGZmZmYpIHsKKwkJaSA9IGNmZy0+cmVsZWFzZTsKKwl9IGVsc2UgeworCQkvKiBUaGUgc2ExMTAwIGNvbnRyb2xsZXIgaXMgbm90IHN1cHBvcnRlZCAqLworCQlpID0gZ2FkZ2V0X2lzX3NhMTEwMChnYWRnZXQpCisJCQk/IC0xCisJCQk6IHVzYl9nYWRnZXRfY29udHJvbGxlcl9udW1iZXIoZ2FkZ2V0KTsKKwkJaWYgKGkgPj0gMCkgeworCQkJaSA9IDB4MDMwMCArIGk7CisJCX0gZWxzZSB7CisJCQlXQVJOSU5HKGNvbW1vbiwgImNvbnRyb2xsZXIgJyVzJyBub3QgcmVjb2duaXplZFxuIiwKKwkJCQlnYWRnZXQtPm5hbWUpOworCQkJaSA9IDB4MDM5OTsKKwkJfQorCX0KKyNkZWZpbmUgT1IoeCwgeSkgKCh4KSA/ICh4KSA6ICh5KSkKKwlzbnByaW50Zihjb21tb24tPmlucXVpcnlfc3RyaW5nLCBzaXplb2YgY29tbW9uLT5pbnF1aXJ5X3N0cmluZywKKwkJICIlLThzJS0xNnMlMDR4IiwKKwkJIE9SKGNmZy0+dmVuZG9yX25hbWUsICJMaW51eCAgICIpLAorCQkgLyogQXNzdW1lIHByb2R1Y3QgbmFtZSBkZXBlbmRlbnQgb24gdGhlIGZpcnN0IExVTiAqLworCQkgT1IoY2ZnLT5wcm9kdWN0X25hbWUsIGNvbW1vbi0+bHVucy0+Y2Ryb20KKwkJCQkgICAgID8gIkZpbGUtU3RvciBHYWRnZXQiCisJCQkJICAgICA6ICJGaWxlLUNEIEdhZGdldCAgIiksCisJCSBpKTsKKworCisJLyogU29tZSBwZXJpcGhlcmFsIGNvbnRyb2xsZXJzIGFyZSBrbm93biBub3QgdG8gYmUgYWJsZSB0bworCSAqIGhhbHQgYnVsayBlbmRwb2ludHMgY29ycmVjdGx5LiAgSWYgb25lIG9mIHRoZW0gaXMgcHJlc2VudCwKKwkgKiBkaXNhYmxlIHN0YWxscy4KKwkgKi8KKwljb21tb24tPmNhbl9zdGFsbCA9IGNmZy0+Y2FuX3N0YWxsICYmCisJCSEoZ2FkZ2V0X2lzX3NoKGNvbW1vbi0+Z2FkZ2V0KSB8fAorCQkgIGdhZGdldF9pc19hdDkxKGNvbW1vbi0+Z2FkZ2V0KSk7CisKKworCXNwaW5fbG9ja19pbml0KCZjb21tb24tPmxvY2spOworCWtyZWZfaW5pdCgmY29tbW9uLT5yZWYpOworCisKKwkvKiBUZWxsIHRoZSB0aHJlYWQgdG8gc3RhcnQgd29ya2luZyAqLworCWNvbW1vbi0+dGhyZWFkX2V4aXRzID0gY2ZnLT50aHJlYWRfZXhpdHM7CisJY29tbW9uLT50aHJlYWRfdGFzayA9CisJCWt0aHJlYWRfY3JlYXRlKGZzZ19tYWluX3RocmVhZCwgY29tbW9uLAorCQkJICAgICAgIE9SKGNmZy0+dGhyZWFkX25hbWUsICJmaWxlLXN0b3JhZ2UiKSk7CisJaWYgKElTX0VSUihjb21tb24tPnRocmVhZF90YXNrKSkgeworCQlyYyA9IFBUUl9FUlIoY29tbW9uLT50aHJlYWRfdGFzayk7CisJCWdvdG8gZXJyb3JfcmVsZWFzZTsKKwl9CisJaW5pdF9jb21wbGV0aW9uKCZjb21tb24tPnRocmVhZF9ub3RpZmllcik7CisjdW5kZWYgT1IKKworCisJLyogSW5mb3JtYXRpb24gKi8KKwlJTkZPKGNvbW1vbiwgRlNHX0RSSVZFUl9ERVNDICIsIHZlcnNpb246ICIgRlNHX0RSSVZFUl9WRVJTSU9OICJcbiIpOworCUlORk8oY29tbW9uLCAiTnVtYmVyIG9mIExVTnM9JWRcbiIsIGNvbW1vbi0+bmx1bnMpOworCisJcGF0aGJ1ZiA9IGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpOworCWZvciAoaSA9IDAsIG5sdW5zID0gY29tbW9uLT5ubHVucywgY3VybHVuID0gY29tbW9uLT5sdW5zOworCSAgICAgaSA8IG5sdW5zOworCSAgICAgKytjdXJsdW4sICsraSkgeworCQljaGFyICpwID0gIihubyBtZWRpdW0pIjsKKwkJaWYgKGZzZ19sdW5faXNfb3BlbihjdXJsdW4pKSB7CisJCQlwID0gIihlcnJvcikiOworCQkJaWYgKHBhdGhidWYpIHsKKwkJCQlwID0gZF9wYXRoKCZjdXJsdW4tPmZpbHAtPmZfcGF0aCwKKwkJCQkJICAgcGF0aGJ1ZiwgUEFUSF9NQVgpOworCQkJCWlmIChJU19FUlIocCkpCisJCQkJCXAgPSAiKGVycm9yKSI7CisJCQl9CisJCX0KKwkJTElORk8oY3VybHVuLCAiTFVOOiAlcyVzJXNmaWxlOiAlc1xuIiwKKwkJICAgICAgY3VybHVuLT5yZW1vdmFibGUgPyAicmVtb3ZhYmxlICIgOiAiIiwKKwkJICAgICAgY3VybHVuLT5ybyA/ICJyZWFkIG9ubHkgIiA6ICIiLAorCQkgICAgICBjdXJsdW4tPmNkcm9tID8gIkNELVJPTSAiIDogIiIsCisJCSAgICAgIHApOworCX0KKwlrZnJlZShwYXRoYnVmKTsKKworCURCRyhjb21tb24sICJJL08gdGhyZWFkIHBpZDogJWRcbiIsIHRhc2tfcGlkX25yKGNvbW1vbi0+dGhyZWFkX3Rhc2spKTsKKworCXdha2VfdXBfcHJvY2Vzcyhjb21tb24tPnRocmVhZF90YXNrKTsKKworCXJldHVybiBjb21tb247CisKKworZXJyb3JfbHVuczoKKwljb21tb24tPm5sdW5zID0gaSArIDE7CitlcnJvcl9yZWxlYXNlOgorCWNvbW1vbi0+c3RhdGUgPSBGU0dfU1RBVEVfVEVSTUlOQVRFRDsJLyogVGhlIHRocmVhZCBpcyBkZWFkICovCisJLyogQ2FsbCBmc2dfY29tbW9uX3JlbGVhc2UoKSBkaXJlY3RseSwgcmVmIG1pZ2h0IGJlIG5vdAorCSAqIGluaXRpYWxpc2VkICovCisJZnNnX2NvbW1vbl9yZWxlYXNlKCZjb21tb24tPnJlZik7CisJY29tcGxldGUoJmNvbW1vbi0+dGhyZWFkX25vdGlmaWVyKTsKKwlyZXR1cm4gRVJSX1BUUihyYyk7Cit9CisKKworc3RhdGljIHZvaWQgZnNnX2NvbW1vbl9yZWxlYXNlKHN0cnVjdCBrcmVmICpyZWYpCit7CisJc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbiA9CisJCWNvbnRhaW5lcl9vZihyZWYsIHN0cnVjdCBmc2dfY29tbW9uLCByZWYpOworCXVuc2lnbmVkIGkgPSBjb21tb24tPm5sdW5zOworCXN0cnVjdCBmc2dfbHVuICpsdW4gPSBjb21tb24tPmx1bnM7CisKKwkvKiBJZiB0aGUgdGhyZWFkIGlzbid0IGFscmVhZHkgZGVhZCwgdGVsbCBpdCB0byBleGl0IG5vdyAqLworCWlmIChjb21tb24tPnN0YXRlICE9IEZTR19TVEFURV9URVJNSU5BVEVEKSB7CisJCXJhaXNlX2V4Y2VwdGlvbihjb21tb24sIEZTR19TVEFURV9FWElUKTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmY29tbW9uLT50aHJlYWRfbm90aWZpZXIpOworCisJCS8qIFRoZSBjbGVhbnVwIHJvdXRpbmUgd2FpdHMgZm9yIHRoaXMgY29tcGxldGlvbiBhbHNvICovCisJCWNvbXBsZXRlKCZjb21tb24tPnRocmVhZF9ub3RpZmllcik7CisJfQorCisJLyogQmV3YXJlIHRlbXB0aW5nIGZvciAtPiBkby13aGlsZSBvcHRpbWl6YXRpb246IHdoZW4gaW4gZXJyb3IKKwkgKiByZWNvdmVyeSBubHVucyBtYXkgYmUgemVyby4gKi8KKworCWZvciAoOyBpOyAtLWksICsrbHVuKSB7CisJCWRldmljZV9yZW1vdmVfZmlsZSgmbHVuLT5kZXYsICZkZXZfYXR0cl9ybyk7CisJCWRldmljZV9yZW1vdmVfZmlsZSgmbHVuLT5kZXYsICZkZXZfYXR0cl9maWxlKTsKKwkJZnNnX2x1bl9jbG9zZShsdW4pOworCQlkZXZpY2VfdW5yZWdpc3RlcigmbHVuLT5kZXYpOworCX0KKworCWtmcmVlKGNvbW1vbi0+bHVucyk7CisJaWYgKGNvbW1vbi0+ZnJlZV9zdG9yYWdlX29uX3JlbGVhc2UpCisJCWtmcmVlKGNvbW1vbik7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCitzdGF0aWMgdm9pZCBmc2dfdW5iaW5kKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbiAqYywgc3RydWN0IHVzYl9mdW5jdGlvbiAqZikKK3sKKwlzdHJ1Y3QgZnNnX2RldgkJKmZzZyA9IGZzZ19mcm9tX2Z1bmMoZik7CisKKwlEQkcoZnNnLCAidW5iaW5kXG4iKTsKKwlmc2dfY29tbW9uX3B1dChmc2ctPmNvbW1vbik7CisJa2ZyZWUoZnNnKTsKK30KKworCitzdGF0aWMgaW50IGZzZ19iaW5kKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbiAqYywgc3RydWN0IHVzYl9mdW5jdGlvbiAqZikKK3sKKwlzdHJ1Y3QgZnNnX2RldgkJKmZzZyA9IGZzZ19mcm9tX2Z1bmMoZik7CisJc3RydWN0IHVzYl9nYWRnZXQJKmdhZGdldCA9IGMtPmNkZXYtPmdhZGdldDsKKwlpbnQJCQlyYzsKKwlpbnQJCQlpOworCXN0cnVjdCB1c2JfZXAJCSplcDsKKworCWZzZy0+Z2FkZ2V0ID0gZ2FkZ2V0OworCisJLyogTmV3IGludGVyZmFjZSAqLworCWkgPSB1c2JfaW50ZXJmYWNlX2lkKGMsIGYpOworCWlmIChpIDwgMCkKKwkJcmV0dXJuIGk7CisJZnNnX2ludGZfZGVzYy5iSW50ZXJmYWNlTnVtYmVyID0gaTsKKwlmc2ctPmludGVyZmFjZV9udW1iZXIgPSBpOworCisJLyogRmluZCBhbGwgdGhlIGVuZHBvaW50cyB3ZSB3aWxsIHVzZSAqLworCWVwID0gdXNiX2VwX2F1dG9jb25maWcoZ2FkZ2V0LCAmZnNnX2ZzX2J1bGtfaW5fZGVzYyk7CisJaWYgKCFlcCkKKwkJZ290byBhdXRvY29uZl9mYWlsOworCWVwLT5kcml2ZXJfZGF0YSA9IGZzZy0+Y29tbW9uOwkvKiBjbGFpbSB0aGUgZW5kcG9pbnQgKi8KKwlmc2ctPmJ1bGtfaW4gPSBlcDsKKworCWVwID0gdXNiX2VwX2F1dG9jb25maWcoZ2FkZ2V0LCAmZnNnX2ZzX2J1bGtfb3V0X2Rlc2MpOworCWlmICghZXApCisJCWdvdG8gYXV0b2NvbmZfZmFpbDsKKwllcC0+ZHJpdmVyX2RhdGEgPSBmc2ctPmNvbW1vbjsJLyogY2xhaW0gdGhlIGVuZHBvaW50ICovCisJZnNnLT5idWxrX291dCA9IGVwOworCisJaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoZ2FkZ2V0KSkgeworCQkvKiBBc3N1bWUgZW5kcG9pbnQgYWRkcmVzc2VzIGFyZSB0aGUgc2FtZSBmb3IgYm90aCBzcGVlZHMgKi8KKwkJZnNnX2hzX2J1bGtfaW5fZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0KKwkJCWZzZ19mc19idWxrX2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKKwkJZnNnX2hzX2J1bGtfb3V0X2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9CisJCQlmc2dfZnNfYnVsa19vdXRfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCQlmLT5oc19kZXNjcmlwdG9ycyA9IGZzZ19oc19mdW5jdGlvbjsKKwl9CisKKwlyZXR1cm4gMDsKKworYXV0b2NvbmZfZmFpbDoKKwlFUlJPUihmc2csICJ1bmFibGUgdG8gYXV0b2NvbmZpZ3VyZSBhbGwgZW5kcG9pbnRzXG4iKTsKKwlyYyA9IC1FTk9UU1VQUDsKKwlmc2dfdW5iaW5kKGMsIGYpOworCXJldHVybiByYzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFERCBGVU5DVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2dhZGdldF9zdHJpbmdzICpmc2dfc3RyaW5nc19hcnJheVtdID0geworCSZmc2dfc3RyaW5ndGFiLAorCU5VTEwsCit9OworCitzdGF0aWMgaW50IGZzZ19hZGQoc3RydWN0IHVzYl9jb21wb3NpdGVfZGV2ICpjZGV2LAorCQkgICBzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb24gKmMsCisJCSAgIHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24pCit7CisJc3RydWN0IGZzZ19kZXYgKmZzZzsKKwlpbnQgcmM7CisKKwlmc2cgPSBremFsbG9jKHNpemVvZiAqZnNnLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIWZzZykpCisJCXJldHVybiAtRU5PTUVNOworCisJZnNnLT5mdW5jdGlvbi5uYW1lICAgICAgICA9IEZTR19EUklWRVJfREVTQzsKKwlmc2ctPmZ1bmN0aW9uLnN0cmluZ3MgICAgID0gZnNnX3N0cmluZ3NfYXJyYXk7CisJZnNnLT5mdW5jdGlvbi5kZXNjcmlwdG9ycyA9IGZzZ19mc19mdW5jdGlvbjsKKwlmc2ctPmZ1bmN0aW9uLmJpbmQgICAgICAgID0gZnNnX2JpbmQ7CisJZnNnLT5mdW5jdGlvbi51bmJpbmQgICAgICA9IGZzZ191bmJpbmQ7CisJZnNnLT5mdW5jdGlvbi5zZXR1cCAgICAgICA9IGZzZ19zZXR1cDsKKwlmc2ctPmZ1bmN0aW9uLnNldF9hbHQgICAgID0gZnNnX3NldF9hbHQ7CisJZnNnLT5mdW5jdGlvbi5kaXNhYmxlICAgICA9IGZzZ19kaXNhYmxlOworCisJZnNnLT5jb21tb24gICAgICAgICAgICAgICA9IGNvbW1vbjsKKwkvKiBPdXIgY2FsbGVyIGhvbGRzIGEgcmVmZXJlbmNlIHRvIGNvbW1vbiBzdHJ1Y3R1cmUgc28gd2UKKwkgKiBkb24ndCBoYXZlIHRvIGJlIHdvcnJ5IGFib3V0IGl0IGJlaW5nIGZyZWVkIHVudGlsIHdlIHJldHVybgorCSAqIGZyb20gdGhpcyBmdW5jdGlvbi4gIFNvIGluc3RlYWQgb2YgaW5jcmVtZW50aW5nIGNvdW50ZXIgbm93CisJICogYW5kIGRlY3JlbWVudCBpbiBlcnJvciByZWNvdmVyeSB3ZSBpbmNyZW1lbnQgaXQgb25seSB3aGVuCisJICogY2FsbCB0byB1c2JfYWRkX2Z1bmN0aW9uKCkgd2FzIHN1Y2Nlc3NmdWwuICovCisKKwlyYyA9IHVzYl9hZGRfZnVuY3Rpb24oYywgJmZzZy0+ZnVuY3Rpb24pOworCisJaWYgKGxpa2VseShyYyA9PSAwKSkKKwkJZnNnX2NvbW1vbl9nZXQoZnNnLT5jb21tb24pOworCWVsc2UKKwkJa2ZyZWUoZnNnKTsKKworCXJldHVybiByYzsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIE1vZHVsZSBwYXJhbWV0ZXJzICoqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RydWN0IGZzZ19tb2R1bGVfcGFyYW1ldGVycyB7CisJY2hhcgkJKmZpbGVbRlNHX01BWF9MVU5TXTsKKwlpbnQJCXJvW0ZTR19NQVhfTFVOU107CisJaW50CQlyZW1vdmFibGVbRlNHX01BWF9MVU5TXTsKKwlpbnQJCWNkcm9tW0ZTR19NQVhfTFVOU107CisKKwl1bnNpZ25lZCBpbnQJZmlsZV9jb3VudCwgcm9fY291bnQsIHJlbW92YWJsZV9jb3VudCwgY2Ryb21fY291bnQ7CisJdW5zaWduZWQgaW50CWx1bnM7CS8qIG5sdW5zICovCisJaW50CQlzdGFsbDsJLyogY2FuX3N0YWxsICovCit9OworCisKKyNkZWZpbmUgX0ZTR19NT0RVTEVfUEFSQU1fQVJSQVkocHJlZml4LCBwYXJhbXMsIG5hbWUsIHR5cGUsIGRlc2MpCVwKKwltb2R1bGVfcGFyYW1fYXJyYXlfbmFtZWQocHJlZml4ICMjIG5hbWUsIHBhcmFtcy5uYW1lLCB0eXBlLAlcCisJCQkJICZwcmVmaXggIyMgcGFyYW1zLm5hbWUgIyMgX2NvdW50LAlcCisJCQkJIFNfSVJVR08pOwkJCQlcCisJTU9EVUxFX1BBUk1fREVTQyhwcmVmaXggIyMgbmFtZSwgZGVzYykKKworI2RlZmluZSBfRlNHX01PRFVMRV9QQVJBTShwcmVmaXgsIHBhcmFtcywgbmFtZSwgdHlwZSwgZGVzYykJCVwKKwltb2R1bGVfcGFyYW1fbmFtZWQocHJlZml4ICMjIG5hbWUsIHBhcmFtcy5uYW1lLCB0eXBlLAkJXAorCQkJICAgU19JUlVHTyk7CQkJCQlcCisJTU9EVUxFX1BBUk1fREVTQyhwcmVmaXggIyMgbmFtZSwgZGVzYykKKworI2RlZmluZSBGU0dfTU9EVUxFX1BBUkFNRVRFUlMocHJlZml4LCBwYXJhbXMpCQkJCVwKKwlfRlNHX01PRFVMRV9QQVJBTV9BUlJBWShwcmVmaXgsIHBhcmFtcywgZmlsZSwgY2hhcnAsCQlcCisJCQkJIm5hbWVzIG9mIGJhY2tpbmcgZmlsZXMgb3IgZGV2aWNlcyIpOwlcCisJX0ZTR19NT0RVTEVfUEFSQU1fQVJSQVkocHJlZml4LCBwYXJhbXMsIHJvLCBib29sLAkJXAorCQkJCSJ0cnVlIHRvIGZvcmNlIHJlYWQtb25seSIpOwkJXAorCV9GU0dfTU9EVUxFX1BBUkFNX0FSUkFZKHByZWZpeCwgcGFyYW1zLCByZW1vdmFibGUsIGJvb2wsCVwKKwkJCQkidHJ1ZSB0byBzaW11bGF0ZSByZW1vdmFibGUgbWVkaWEiKTsJXAorCV9GU0dfTU9EVUxFX1BBUkFNX0FSUkFZKHByZWZpeCwgcGFyYW1zLCBjZHJvbSwgYm9vbCwJCVwKKwkJCQkidHJ1ZSB0byBzaW11bGF0ZSBDRC1ST00gaW5zdGVhZCBvZiBkaXNrIik7IFwKKwlfRlNHX01PRFVMRV9QQVJBTShwcmVmaXgsIHBhcmFtcywgbHVucywgdWludCwJCQlcCisJCQkgICJudW1iZXIgb2YgTFVOcyIpOwkJCQlcCisJX0ZTR19NT0RVTEVfUEFSQU0ocHJlZml4LCBwYXJhbXMsIHN0YWxsLCBib29sLAkJCVwKKwkJCSAgImZhbHNlIHRvIHByZXZlbnQgYnVsayBzdGFsbHMiKQorCisKK3N0YXRpYyB2b2lkCitmc2dfY29uZmlnX2Zyb21fcGFyYW1zKHN0cnVjdCBmc2dfY29uZmlnICpjZmcsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgZnNnX21vZHVsZV9wYXJhbWV0ZXJzICpwYXJhbXMpCit7CisJc3RydWN0IGZzZ19sdW5fY29uZmlnICpsdW47CisJdW5zaWduZWQgaTsKKworCS8qIENvbmZpZ3VyZSBMVU5zICovCisJY2ZnLT5ubHVucyA9CisJCW1pbihwYXJhbXMtPmx1bnMgPzogKHBhcmFtcy0+ZmlsZV9jb3VudCA/OiAxdSksCisJCSAgICAodW5zaWduZWQpRlNHX01BWF9MVU5TKTsKKwlmb3IgKGkgPSAwLCBsdW4gPSBjZmctPmx1bnM7IGkgPCBjZmctPm5sdW5zOyArK2ksICsrbHVuKSB7CisJCWx1bi0+cm8gPSAhIXBhcmFtcy0+cm9baV07CisJCWx1bi0+Y2Ryb20gPSAhIXBhcmFtcy0+Y2Ryb21baV07CisJCWx1bi0+cmVtb3ZhYmxlID0gLyogUmVtb3ZhYmxlIGJ5IGRlZmF1bHQgKi8KKwkJCXBhcmFtcy0+cmVtb3ZhYmxlX2NvdW50IDw9IGkgfHwgcGFyYW1zLT5yZW1vdmFibGVbaV07CisJCWx1bi0+ZmlsZW5hbWUgPQorCQkJcGFyYW1zLT5maWxlX2NvdW50ID4gaSAmJiBwYXJhbXMtPmZpbGVbaV1bMF0KKwkJCT8gcGFyYW1zLT5maWxlW2ldCisJCQk6IDA7CisJfQorCisJLyogTGV0IE1TRiB1c2UgZGVmYXVsdHMgKi8KKwljZmctPmx1bl9uYW1lX2Zvcm1hdCA9IDA7CisJY2ZnLT50aHJlYWRfbmFtZSA9IDA7CisJY2ZnLT52ZW5kb3JfbmFtZSA9IDA7CisJY2ZnLT5wcm9kdWN0X25hbWUgPSAwOworCWNmZy0+cmVsZWFzZSA9IDB4ZmZmZjsKKworCWNmZy0+dGhyZWFkX2V4aXRzID0gMDsKKwljZmctPnByaXZhdGVfZGF0YSA9IDA7CisKKwkvKiBGaW5hbGlzZSAqLworCWNmZy0+Y2FuX3N0YWxsID0gcGFyYW1zLT5zdGFsbDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZnNnX2NvbW1vbiAqCitmc2dfY29tbW9uX2Zyb21fcGFyYW1zKHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24sCisJCSAgICAgICBzdHJ1Y3QgdXNiX2NvbXBvc2l0ZV9kZXYgKmNkZXYsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgZnNnX21vZHVsZV9wYXJhbWV0ZXJzICpwYXJhbXMpCisJX19hdHRyaWJ1dGVfXygodW51c2VkKSk7CitzdGF0aWMgaW5saW5lIHN0cnVjdCBmc2dfY29tbW9uICoKK2ZzZ19jb21tb25fZnJvbV9wYXJhbXMoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbiwKKwkJICAgICAgIHN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBmc2dfbW9kdWxlX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgZnNnX2NvbmZpZyBjZmc7CisJZnNnX2NvbmZpZ19mcm9tX3BhcmFtcygmY2ZnLCBwYXJhbXMpOworCXJldHVybiBmc2dfY29tbW9uX2luaXQoY29tbW9uLCBjZGV2LCAmY2ZnKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfcm5kaXMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3JuZGlzLmMKaW5kZXggYzk5NjZjYy4uOTVkYWU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfcm5kaXMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9ybmRpcy5jCkBAIC00LDYgKzQsOCBAQAogICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUsMjAwOCBEYXZpZCBCcm93bmVsbAogICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUm9iZXJ0IFNjaHdlYmVsLCBCZW5lZGlrdCBTcHJhbmdlcgogICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcworICogICAgICAgICAgICAgICAgICAgIEF1dGhvcjogTWljaGFsIE5hemFyZXdpY3ogKG0ubmF6YXJld2ljekBzYW1zdW5nLmNvbSkKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTE0OSw4ICsxNTEsOCBAQAogCS5iRGF0YUludGVyZmFjZSA9CTB4MDEsCiB9OwogCi1zdGF0aWMgc3RydWN0IHVzYl9jZGNfYWNtX2Rlc2NyaXB0b3IgYWNtX2Rlc2NyaXB0b3IgX19pbml0ZGF0YSA9IHsKLQkuYkxlbmd0aCA9CQlzaXplb2YgYWNtX2Rlc2NyaXB0b3IsCitzdGF0aWMgc3RydWN0IHVzYl9jZGNfYWNtX2Rlc2NyaXB0b3Igcm5kaXNfYWNtX2Rlc2NyaXB0b3IgX19pbml0ZGF0YSA9IHsKKwkuYkxlbmd0aCA9CQlzaXplb2Ygcm5kaXNfYWNtX2Rlc2NyaXB0b3IsCiAJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9DU19JTlRFUkZBQ0UsCiAJLmJEZXNjcmlwdG9yU3ViVHlwZSA9CVVTQl9DRENfQUNNX1RZUEUsCiAKQEAgLTE3OSw2ICsxODEsMjAgQEAKIAkvKiAuaUludGVyZmFjZSA9IERZTkFNSUMgKi8KIH07CiAKKworc3RhdGljIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Fzc29jX2Rlc2NyaXB0b3IKK3JuZGlzX2lhZF9kZXNjcmlwdG9yID0geworCS5iTGVuZ3RoID0JCXNpemVvZiBybmRpc19pYWRfZGVzY3JpcHRvciwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0lOVEVSRkFDRV9BU1NPQ0lBVElPTiwKKworCS5iRmlyc3RJbnRlcmZhY2UgPQkwLCAvKiBYWFgsIGhhcmRjb2RlZCAqLworCS5iSW50ZXJmYWNlQ291bnQgPSAJMiwJLy8gY29udHJvbCArIGRhdGEKKwkuYkZ1bmN0aW9uQ2xhc3MgPQlVU0JfQ0xBU1NfQ09NTSwKKwkuYkZ1bmN0aW9uU3ViQ2xhc3MgPQlVU0JfQ0RDX1NVQkNMQVNTX0VUSEVSTkVULAorCS5iRnVuY3Rpb25Qcm90b2NvbCA9CVVTQl9DRENfUFJPVE9fTk9ORSwKKwkvKiAuaUZ1bmN0aW9uID0gRFlOQU1JQyAqLworfTsKKwogLyogZnVsbCBzcGVlZCBzdXBwb3J0OiAqLwogCiBzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIGZzX25vdGlmeV9kZXNjIF9faW5pdGRhdGEgPSB7CkBAIC0yMDgsMTEgKzIyNCwxMiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKmV0aF9mc19mdW5jdGlvbltdIF9faW5pdGRhdGEgPSB7CisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnJuZGlzX2lhZF9kZXNjcmlwdG9yLAogCS8qIGNvbnRyb2wgaW50ZXJmYWNlIG1hdGNoZXMgQUNNLCBub3QgRXRoZXJuZXQgKi8KIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmcm5kaXNfY29udHJvbF9pbnRmLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZoZWFkZXJfZGVzYywKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmY2FsbF9tZ210X2Rlc2NyaXB0b3IsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmFjbV9kZXNjcmlwdG9yLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZybmRpc19hY21fZGVzY3JpcHRvciwKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmcm5kaXNfdW5pb25fZGVzYywKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZnNfbm90aWZ5X2Rlc2MsCiAJLyogZGF0YSBpbnRlcmZhY2UgaGFzIG5vIGFsdHNldHRpbmcgKi8KQEAgLTI1MiwxMSArMjY5LDEyIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqZXRoX2hzX2Z1bmN0aW9uW10gX19pbml0ZGF0YSA9IHsKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmcm5kaXNfaWFkX2Rlc2NyaXB0b3IsCiAJLyogY29udHJvbCBpbnRlcmZhY2UgbWF0Y2hlcyBBQ00sIG5vdCBFdGhlcm5ldCAqLwogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZybmRpc19jb250cm9sX2ludGYsCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmhlYWRlcl9kZXNjLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZjYWxsX21nbXRfZGVzY3JpcHRvciwKLQkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmYWNtX2Rlc2NyaXB0b3IsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnJuZGlzX2FjbV9kZXNjcmlwdG9yLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZybmRpc191bmlvbl9kZXNjLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZoc19ub3RpZnlfZGVzYywKIAkvKiBkYXRhIGludGVyZmFjZSBoYXMgbm8gYWx0c2V0dGluZyAqLwpAQCAtMjcxLDYgKzI4OSw3IEBACiBzdGF0aWMgc3RydWN0IHVzYl9zdHJpbmcgcm5kaXNfc3RyaW5nX2RlZnNbXSA9IHsKIAlbMF0ucyA9ICJSTkRJUyBDb21tdW5pY2F0aW9ucyBDb250cm9sIiwKIAlbMV0ucyA9ICJSTkRJUyBFdGhlcm5ldCBEYXRhIiwKKwlbMl0ucyA9ICJSTkRJUyIsCiAJeyAgfSAvKiBlbmQgb2YgbGlzdCAqLwogfTsKIApAQCAtNTg3LDYgKzYwNiw3IEBACiAJaWYgKHN0YXR1cyA8IDApCiAJCWdvdG8gZmFpbDsKIAlybmRpcy0+Y3RybF9pZCA9IHN0YXR1czsKKwlybmRpc19pYWRfZGVzY3JpcHRvci5iRmlyc3RJbnRlcmZhY2UgPSBzdGF0dXM7CiAKIAlybmRpc19jb250cm9sX2ludGYuYkludGVyZmFjZU51bWJlciA9IHN0YXR1czsKIAlybmRpc191bmlvbl9kZXNjLmJNYXN0ZXJJbnRlcmZhY2UwID0gc3RhdHVzOwpAQCAtNzk4LDYgKzgxOCwxMyBAQAogCQkJcmV0dXJuIHN0YXR1czsKIAkJcm5kaXNfc3RyaW5nX2RlZnNbMV0uaWQgPSBzdGF0dXM7CiAJCXJuZGlzX2RhdGFfaW50Zi5pSW50ZXJmYWNlID0gc3RhdHVzOworCisJCS8qIElBRCBpRnVuY3Rpb24gbGFiZWwgKi8KKwkJc3RhdHVzID0gdXNiX3N0cmluZ19pZChjLT5jZGV2KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCQlybmRpc19zdHJpbmdfZGVmc1syXS5pZCA9IHN0YXR1czsKKwkJcm5kaXNfaWFkX2Rlc2NyaXB0b3IuaUZ1bmN0aW9uID0gc3RhdHVzOwogCX0KIAogCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIG9uZSBuZXcgaW5zdGFuY2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYwppbmRleCAxZTZhYTUwLi4yOWRmYjAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCkBAIC0yNDgsOCArMjQ4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogCi0jaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgotCiAjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KIApAQCAtMjc0LDIxICsyNzIsMjAgQEAKICNkZWZpbmUgRFJJVkVSX05BTUUJCSJnX2ZpbGVfc3RvcmFnZSIKICNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCSIyMCBOb3ZlbWJlciAyMDA4IgogCi1zdGF0aWMgY29uc3QgY2hhciBsb25nbmFtZVtdID0gRFJJVkVSX0RFU0M7Ci1zdGF0aWMgY29uc3QgY2hhciBzaG9ydG5hbWVbXSA9IERSSVZFUl9OQU1FOworc3RhdGljICAgICAgIGNoYXIgZnNnX3N0cmluZ19tYW51ZmFjdHVyZXJbNjRdOworc3RhdGljIGNvbnN0IGNoYXIgZnNnX3N0cmluZ19wcm9kdWN0W10gPSBEUklWRVJfREVTQzsKK3N0YXRpYyAgICAgICBjaGFyIGZzZ19zdHJpbmdfc2VyaWFsWzEzXTsKK3N0YXRpYyBjb25zdCBjaGFyIGZzZ19zdHJpbmdfY29uZmlnW10gPSAiU2VsZi1wb3dlcmVkIjsKK3N0YXRpYyBjb25zdCBjaGFyIGZzZ19zdHJpbmdfaW50ZXJmYWNlW10gPSAiTWFzcyBTdG9yYWdlIjsKKworCisjaW5jbHVkZSAic3RvcmFnZV9jb21tb24uYyIKKwogCiBNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwogTU9EVUxFX0FVVEhPUigiQWxhbiBTdGVybiIpOwogTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwogCi0vKiBUaGFua3MgdG8gTmV0Q2hpcCBUZWNobm9sb2dpZXMgZm9yIGRvbmF0aW5nIHRoaXMgcHJvZHVjdCBJRC4KLSAqCi0gKiBETyBOT1QgUkVVU0UgVEhFU0UgSURzIHdpdGggYW55IG90aGVyIGRyaXZlciEhICBFdmVyISEKLSAqIEluc3RlYWQ6ICBhbGxvY2F0ZSB5b3VyIG93biwgdXNpbmcgbm9ybWFsIFVTQi1JRiBwcm9jZWR1cmVzLiAqLwotI2RlZmluZSBEUklWRVJfVkVORE9SX0lECTB4MDUyNQkvLyBOZXRDaGlwCi0jZGVmaW5lIERSSVZFUl9QUk9EVUNUX0lECTB4YTRhNQkvLyBMaW51eC1VU0IgRmlsZS1iYWNrZWQgU3RvcmFnZSBHYWRnZXQKLQotCiAvKgogICogVGhpcyBkcml2ZXIgYXNzdW1lcyBzZWxmLXBvd2VyZWQgaGFyZHdhcmUgYW5kIGhhcyBubyB3YXkgZm9yIHVzZXJzIHRvCiAgKiB0cmlnZ2VyIHJlbW90ZSB3YWtldXAuICBJdCB1c2VzIGF1dG9jb25maWd1cmF0aW9uIHRvIHNlbGVjdCBlbmRwb2ludHMKQEAgLTI5OCw1NCArMjk1LDEyIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNkZWZpbmUgTERCRyhsdW4sZm10LGFyZ3MuLi4pIFwKLQlkZXZfZGJnKCYobHVuKS0+ZGV2ICwgZm10ICwgIyMgYXJncykKLSNkZWZpbmUgTURCRyhmbXQsYXJncy4uLikgXAotCXByX2RlYnVnKERSSVZFUl9OQU1FICI6ICIgZm10ICwgIyMgYXJncykKLQotI2lmbmRlZiBERUJVRwotI3VuZGVmIFZFUkJPU0VfREVCVUcKLSN1bmRlZiBEVU1QX01TR1MKLSNlbmRpZiAvKiAhREVCVUcgKi8KLQotI2lmZGVmIFZFUkJPU0VfREVCVUcKLSNkZWZpbmUgVkxEQkcJTERCRwotI2Vsc2UKLSNkZWZpbmUgVkxEQkcobHVuLGZtdCxhcmdzLi4uKSBcCi0JZG8geyB9IHdoaWxlICgwKQotI2VuZGlmIC8qIFZFUkJPU0VfREVCVUcgKi8KLQotI2RlZmluZSBMRVJST1IobHVuLGZtdCxhcmdzLi4uKSBcCi0JZGV2X2VycigmKGx1biktPmRldiAsIGZtdCAsICMjIGFyZ3MpCi0jZGVmaW5lIExXQVJOKGx1bixmbXQsYXJncy4uLikgXAotCWRldl93YXJuKCYobHVuKS0+ZGV2ICwgZm10ICwgIyMgYXJncykKLSNkZWZpbmUgTElORk8obHVuLGZtdCxhcmdzLi4uKSBcCi0JZGV2X2luZm8oJihsdW4pLT5kZXYgLCBmbXQgLCAjIyBhcmdzKQotCi0jZGVmaW5lIE1JTkZPKGZtdCxhcmdzLi4uKSBcCi0JcHJfaW5mbyhEUklWRVJfTkFNRSAiOiAiIGZtdCAsICMjIGFyZ3MpCi0KLSNkZWZpbmUgREJHKGQsIGZtdCwgYXJncy4uLikgXAotCWRldl9kYmcoJihkKS0+Z2FkZ2V0LT5kZXYgLCBmbXQgLCAjIyBhcmdzKQotI2RlZmluZSBWREJHKGQsIGZtdCwgYXJncy4uLikgXAotCWRldl92ZGJnKCYoZCktPmdhZGdldC0+ZGV2ICwgZm10ICwgIyMgYXJncykKLSNkZWZpbmUgRVJST1IoZCwgZm10LCBhcmdzLi4uKSBcCi0JZGV2X2VycigmKGQpLT5nYWRnZXQtPmRldiAsIGZtdCAsICMjIGFyZ3MpCi0jZGVmaW5lIFdBUk5JTkcoZCwgZm10LCBhcmdzLi4uKSBcCi0JZGV2X3dhcm4oJihkKS0+Z2FkZ2V0LT5kZXYgLCBmbXQgLCAjIyBhcmdzKQotI2RlZmluZSBJTkZPKGQsIGZtdCwgYXJncy4uLikgXAotCWRldl9pbmZvKCYoZCktPmdhZGdldC0+ZGV2ICwgZm10ICwgIyMgYXJncykKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKiBFbmNhcHN1bGF0ZSB0aGUgbW9kdWxlIHBhcmFtZXRlciBzZXR0aW5ncyAqLwogCi0jZGVmaW5lIE1BWF9MVU5TCTgKLQogc3RhdGljIHN0cnVjdCB7Ci0JY2hhcgkJKmZpbGVbTUFYX0xVTlNdOwotCWludAkJcm9bTUFYX0xVTlNdOworCWNoYXIJCSpmaWxlW0ZTR19NQVhfTFVOU107CisJaW50CQlyb1tGU0dfTUFYX0xVTlNdOwogCXVuc2lnbmVkIGludAludW1fZmlsZW5hbWVzOwogCXVuc2lnbmVkIGludAludW1fcm9zOwogCXVuc2lnbmVkIGludAlubHVuczsKQEAgLTM3Miw4ICszMjcsOCBAQAogCS5yZW1vdmFibGUJCT0gMCwKIAkuY2FuX3N0YWxsCQk9IDEsCiAJLmNkcm9tCQkJPSAwLAotCS52ZW5kb3IJCQk9IERSSVZFUl9WRU5ET1JfSUQsCi0JLnByb2R1Y3QJCT0gRFJJVkVSX1BST0RVQ1RfSUQsCisJLnZlbmRvcgkJCT0gRlNHX1ZFTkRPUl9JRCwKKwkucHJvZHVjdAkJPSBGU0dfUFJPRFVDVF9JRCwKIAkucmVsZWFzZQkJPSAweGZmZmYsCS8vIFVzZSBjb250cm9sbGVyIGNoaXAgdHlwZQogCS5idWZsZW4JCQk9IDE2Mzg0LAogCX07CkBAIC00MjUsMTI1ICszODAsNiBAQAogI2VuZGlmIC8qIENPTkZJR19VU0JfRklMRV9TVE9SQUdFX1RFU1QgKi8KIAogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBTQ1NJIGRldmljZSB0eXBlcyAqLwotI2RlZmluZSBUWVBFX0RJU0sJMHgwMAotI2RlZmluZSBUWVBFX0NEUk9NCTB4MDUKLQotLyogVVNCIHByb3RvY29sIHZhbHVlID0gdGhlIHRyYW5zcG9ydCBtZXRob2QgKi8KLSNkZWZpbmUgVVNCX1BSX0NCSQkweDAwCQkvLyBDb250cm9sL0J1bGsvSW50ZXJydXB0Ci0jZGVmaW5lIFVTQl9QUl9DQgkweDAxCQkvLyBDb250cm9sL0J1bGsgdy9vIGludGVycnVwdAotI2RlZmluZSBVU0JfUFJfQlVMSwkweDUwCQkvLyBCdWxrLW9ubHkKLQotLyogVVNCIHN1YmNsYXNzIHZhbHVlID0gdGhlIHByb3RvY29sIGVuY2Fwc3VsYXRpb24gKi8KLSNkZWZpbmUgVVNCX1NDX1JCQwkweDAxCQkvLyBSZWR1Y2VkIEJsb2NrIENvbW1hbmRzIChmbGFzaCkKLSNkZWZpbmUgVVNCX1NDXzgwMjAJMHgwMgkJLy8gU0ZGLTgwMjBpLCBNTUMtMiwgQVRBUEkgKENELVJPTSkKLSNkZWZpbmUgVVNCX1NDX1FJQwkweDAzCQkvLyBRSUMtMTU3ICh0YXBlKQotI2RlZmluZSBVU0JfU0NfVUZJCTB4MDQJCS8vIFVGSSAoZmxvcHB5KQotI2RlZmluZSBVU0JfU0NfODA3MAkweDA1CQkvLyBTRkYtODA3MGkgKHJlbW92YWJsZSkKLSNkZWZpbmUgVVNCX1NDX1NDU0kJMHgwNgkJLy8gVHJhbnNwYXJlbnQgU0NTSQotCi0vKiBCdWxrLW9ubHkgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLS8qIENvbW1hbmQgQmxvY2sgV3JhcHBlciAqLwotc3RydWN0IGJ1bGtfY2Jfd3JhcCB7Ci0JX19sZTMyCVNpZ25hdHVyZTsJCS8vIENvbnRhaW5zICdVU0JDJwotCXUzMglUYWc7CQkJLy8gVW5pcXVlIHBlciBjb21tYW5kIGlkCi0JX19sZTMyCURhdGFUcmFuc2Zlckxlbmd0aDsJLy8gU2l6ZSBvZiB0aGUgZGF0YQotCXU4CUZsYWdzOwkJCS8vIERpcmVjdGlvbiBpbiBiaXQgNwotCXU4CUx1bjsJCQkvLyBMVU4gKG5vcm1hbGx5IDApCi0JdTgJTGVuZ3RoOwkJCS8vIE9mIHRoZSBDREIsIDw9IE1BWF9DT01NQU5EX1NJWkUKLQl1OAlDREJbMTZdOwkJLy8gQ29tbWFuZCBEYXRhIEJsb2NrCi19OwotCi0jZGVmaW5lIFVTQl9CVUxLX0NCX1dSQVBfTEVOCTMxCi0jZGVmaW5lIFVTQl9CVUxLX0NCX1NJRwkJMHg0MzQyNTM1NQkvLyBTcGVsbHMgb3V0IFVTQkMKLSNkZWZpbmUgVVNCX0JVTEtfSU5fRkxBRwkweDgwCi0KLS8qIENvbW1hbmQgU3RhdHVzIFdyYXBwZXIgKi8KLXN0cnVjdCBidWxrX2NzX3dyYXAgewotCV9fbGUzMglTaWduYXR1cmU7CQkvLyBTaG91bGQgPSAnVVNCUycKLQl1MzIJVGFnOwkJCS8vIFNhbWUgYXMgb3JpZ2luYWwgY29tbWFuZAotCV9fbGUzMglSZXNpZHVlOwkJLy8gQW1vdW50IG5vdCB0cmFuc2ZlcnJlZAotCXU4CVN0YXR1czsJCQkvLyBTZWUgYmVsb3cKLX07Ci0KLSNkZWZpbmUgVVNCX0JVTEtfQ1NfV1JBUF9MRU4JMTMKLSNkZWZpbmUgVVNCX0JVTEtfQ1NfU0lHCQkweDUzNDI1MzU1CS8vIFNwZWxscyBvdXQgJ1VTQlMnCi0jZGVmaW5lIFVTQl9TVEFUVVNfUEFTUwkJMAotI2RlZmluZSBVU0JfU1RBVFVTX0ZBSUwJCTEKLSNkZWZpbmUgVVNCX1NUQVRVU19QSEFTRV9FUlJPUgkyCi0KLS8qIEJ1bGstb25seSBjbGFzcyBzcGVjaWZpYyByZXF1ZXN0cyAqLwotI2RlZmluZSBVU0JfQlVMS19SRVNFVF9SRVFVRVNUCQkweGZmCi0jZGVmaW5lIFVTQl9CVUxLX0dFVF9NQVhfTFVOX1JFUVVFU1QJMHhmZQotCi0KLS8qIENCSSBJbnRlcnJ1cHQgZGF0YSBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCBpbnRlcnJ1cHRfZGF0YSB7Ci0JdTgJYlR5cGU7Ci0JdTgJYlZhbHVlOwotfTsKLQotI2RlZmluZSBDQklfSU5URVJSVVBUX0RBVEFfTEVOCQkyCi0KLS8qIENCSSBBY2NlcHQgRGV2aWNlLVNwZWNpZmljIENvbW1hbmQgcmVxdWVzdCAqLwotI2RlZmluZSBVU0JfQ0JJX0FEU0NfUkVRVUVTVAkJMHgwMAotCi0KLSNkZWZpbmUgTUFYX0NPTU1BTkRfU0laRQkxNgkvLyBMZW5ndGggb2YgYSBTQ1NJIENvbW1hbmQgRGF0YSBCbG9jawotCi0vKiBTQ1NJIGNvbW1hbmRzIHRoYXQgd2UgcmVjb2duaXplICovCi0jZGVmaW5lIFNDX0ZPUk1BVF9VTklUCQkJMHgwNAotI2RlZmluZSBTQ19JTlFVSVJZCQkJMHgxMgotI2RlZmluZSBTQ19NT0RFX1NFTEVDVF82CQkweDE1Ci0jZGVmaW5lIFNDX01PREVfU0VMRUNUXzEwCQkweDU1Ci0jZGVmaW5lIFNDX01PREVfU0VOU0VfNgkJCTB4MWEKLSNkZWZpbmUgU0NfTU9ERV9TRU5TRV8xMAkJMHg1YQotI2RlZmluZSBTQ19QUkVWRU5UX0FMTE9XX01FRElVTV9SRU1PVkFMCTB4MWUKLSNkZWZpbmUgU0NfUkVBRF82CQkJMHgwOAotI2RlZmluZSBTQ19SRUFEXzEwCQkJMHgyOAotI2RlZmluZSBTQ19SRUFEXzEyCQkJMHhhOAotI2RlZmluZSBTQ19SRUFEX0NBUEFDSVRZCQkweDI1Ci0jZGVmaW5lIFNDX1JFQURfRk9STUFUX0NBUEFDSVRJRVMJMHgyMwotI2RlZmluZSBTQ19SRUFEX0hFQURFUgkJCTB4NDQKLSNkZWZpbmUgU0NfUkVBRF9UT0MJCQkweDQzCi0jZGVmaW5lIFNDX1JFTEVBU0UJCQkweDE3Ci0jZGVmaW5lIFNDX1JFUVVFU1RfU0VOU0UJCTB4MDMKLSNkZWZpbmUgU0NfUkVTRVJWRQkJCTB4MTYKLSNkZWZpbmUgU0NfU0VORF9ESUFHTk9TVElDCQkweDFkCi0jZGVmaW5lIFNDX1NUQVJUX1NUT1BfVU5JVAkJMHgxYgotI2RlZmluZSBTQ19TWU5DSFJPTklaRV9DQUNIRQkJMHgzNQotI2RlZmluZSBTQ19URVNUX1VOSVRfUkVBRFkJCTB4MDAKLSNkZWZpbmUgU0NfVkVSSUZZCQkJMHgyZgotI2RlZmluZSBTQ19XUklURV82CQkJMHgwYQotI2RlZmluZSBTQ19XUklURV8xMAkJCTB4MmEKLSNkZWZpbmUgU0NfV1JJVEVfMTIJCQkweGFhCi0KLS8qIFNDU0kgU2Vuc2UgS2V5L0FkZGl0aW9uYWwgU2Vuc2UgQ29kZS9BU0MgUXVhbGlmaWVyIHZhbHVlcyAqLwotI2RlZmluZSBTU19OT19TRU5TRQkJCQkwCi0jZGVmaW5lIFNTX0NPTU1VTklDQVRJT05fRkFJTFVSRQkJMHgwNDA4MDAKLSNkZWZpbmUgU1NfSU5WQUxJRF9DT01NQU5ECQkJMHgwNTIwMDAKLSNkZWZpbmUgU1NfSU5WQUxJRF9GSUVMRF9JTl9DREIJCQkweDA1MjQwMAotI2RlZmluZSBTU19MT0dJQ0FMX0JMT0NLX0FERFJFU1NfT1VUX09GX1JBTkdFCTB4MDUyMTAwCi0jZGVmaW5lIFNTX0xPR0lDQUxfVU5JVF9OT1RfU1VQUE9SVEVECQkweDA1MjUwMAotI2RlZmluZSBTU19NRURJVU1fTk9UX1BSRVNFTlQJCQkweDAyM2EwMAotI2RlZmluZSBTU19NRURJVU1fUkVNT1ZBTF9QUkVWRU5URUQJCTB4MDU1MzAyCi0jZGVmaW5lIFNTX05PVF9SRUFEWV9UT19SRUFEWV9UUkFOU0lUSU9OCTB4MDYyODAwCi0jZGVmaW5lIFNTX1JFU0VUX09DQ1VSUkVECQkJMHgwNjI5MDAKLSNkZWZpbmUgU1NfU0FWSU5HX1BBUkFNRVRFUlNfTk9UX1NVUFBPUlRFRAkweDA1MzkwMAotI2RlZmluZSBTU19VTlJFQ09WRVJFRF9SRUFEX0VSUk9SCQkweDAzMTEwMAotI2RlZmluZSBTU19XUklURV9FUlJPUgkJCQkweDAzMGMwMgotI2RlZmluZSBTU19XUklURV9QUk9URUNURUQJCQkweDA3MjcwMAotCi0jZGVmaW5lIFNLKHgpCQkoKHU4KSAoKHgpID4+IDE2KSkJLy8gU2Vuc2UgS2V5IGJ5dGUsIGV0Yy4KLSNkZWZpbmUgQVNDKHgpCQkoKHU4KSAoKHgpID4+IDgpKQotI2RlZmluZSBBU0NRKHgpCQkoKHU4KSAoeCkpCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQogLyoKICAqIFRoZXNlIGRlZmluaXRpb25zIHdpbGwgcGVybWl0IHRoZSBjb21waWxlciB0byBhdm9pZCBnZW5lcmF0aW5nIGNvZGUgZm9yCiAgKiBwYXJ0cyBvZiB0aGUgZHJpdmVyIHRoYXQgYXJlbid0IHVzZWQgaW4gdGhlIG5vbi1URVNUIHZlcnNpb24uICBFdmVuIGdjYwpAQCAtNTY2LDgxICs0MDIsOCBAQAogI2VuZGlmIC8qIENPTkZJR19VU0JfRklMRV9TVE9SQUdFX1RFU1QgKi8KIAogCi1zdHJ1Y3QgbHVuIHsKLQlzdHJ1Y3QgZmlsZQkqZmlscDsKLQlsb2ZmX3QJCWZpbGVfbGVuZ3RoOwotCWxvZmZfdAkJbnVtX3NlY3RvcnM7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0JdW5zaWduZWQgaW50CXJvIDogMTsKLQl1bnNpZ25lZCBpbnQJcHJldmVudF9tZWRpdW1fcmVtb3ZhbCA6IDE7Ci0JdW5zaWduZWQgaW50CXJlZ2lzdGVyZWQgOiAxOwotCXVuc2lnbmVkIGludAlpbmZvX3ZhbGlkIDogMTsKLQotCXUzMgkJc2Vuc2VfZGF0YTsKLQl1MzIJCXNlbnNlX2RhdGFfaW5mbzsKLQl1MzIJCXVuaXRfYXR0ZW50aW9uX2RhdGE7Ci0KLQlzdHJ1Y3QgZGV2aWNlCWRldjsKLX07Ci0KLSNkZWZpbmUgYmFja2luZ19maWxlX2lzX29wZW4oY3VybHVuKQkoKGN1cmx1biktPmZpbHAgIT0gTlVMTCkKLQotc3RhdGljIHN0cnVjdCBsdW4gKmRldl90b19sdW4oc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgbHVuLCBkZXYpOwotfQotCi0KLS8qIEJpZyBlbm91Z2ggdG8gaG9sZCBvdXIgYmlnZ2VzdCBkZXNjcmlwdG9yICovCi0jZGVmaW5lIEVQMF9CVUZTSVpFCTI1NgotI2RlZmluZSBERUxBWUVEX1NUQVRVUwkoRVAwX0JVRlNJWkUgKyA5OTkpCS8vIEFuIGltcG9zc2libHkgbGFyZ2UgdmFsdWUKLQotLyogTnVtYmVyIG9mIGJ1ZmZlcnMgd2Ugd2lsbCB1c2UuICAyIGlzIGVub3VnaCBmb3IgZG91YmxlLWJ1ZmZlcmluZyAqLwotI2RlZmluZSBOVU1fQlVGRkVSUwkyCi0KLWVudW0gZnNnX2J1ZmZlcl9zdGF0ZSB7Ci0JQlVGX1NUQVRFX0VNUFRZID0gMCwKLQlCVUZfU1RBVEVfRlVMTCwKLQlCVUZfU1RBVEVfQlVTWQotfTsKLQotc3RydWN0IGZzZ19idWZmaGQgewotCXZvaWQJCQkJKmJ1ZjsKLQllbnVtIGZzZ19idWZmZXJfc3RhdGUJCXN0YXRlOwotCXN0cnVjdCBmc2dfYnVmZmhkCQkqbmV4dDsKLQotCS8qIFRoZSBOZXRDaGlwIDIyODAgaXMgZmFzdGVyLCBhbmQgaGFuZGxlcyBzb21lIHByb3RvY29sIGZhdWx0cwotCSAqIGJldHRlciwgaWYgd2UgZG9uJ3Qgc3VibWl0IGFueSBzaG9ydCBidWxrLW91dCByZWFkIHJlcXVlc3RzLgotCSAqIFNvIHdlIHdpbGwgcmVjb3JkIHRoZSBpbnRlbmRlZCByZXF1ZXN0IGxlbmd0aCBoZXJlLiAqLwotCXVuc2lnbmVkIGludAkJCWJ1bGtfb3V0X2ludGVuZGVkX2xlbmd0aDsKLQotCXN0cnVjdCB1c2JfcmVxdWVzdAkJKmlucmVxOwotCWludAkJCQlpbnJlcV9idXN5OwotCXN0cnVjdCB1c2JfcmVxdWVzdAkJKm91dHJlcTsKLQlpbnQJCQkJb3V0cmVxX2J1c3k7Ci19OwotCi1lbnVtIGZzZ19zdGF0ZSB7Ci0JRlNHX1NUQVRFX0NPTU1BTkRfUEhBU0UgPSAtMTAsCQkvLyBUaGlzIG9uZSBpc24ndCB1c2VkIGFueXdoZXJlCi0JRlNHX1NUQVRFX0RBVEFfUEhBU0UsCi0JRlNHX1NUQVRFX1NUQVRVU19QSEFTRSwKLQotCUZTR19TVEFURV9JRExFID0gMCwKLQlGU0dfU1RBVEVfQUJPUlRfQlVMS19PVVQsCi0JRlNHX1NUQVRFX1JFU0VULAotCUZTR19TVEFURV9JTlRFUkZBQ0VfQ0hBTkdFLAotCUZTR19TVEFURV9DT05GSUdfQ0hBTkdFLAotCUZTR19TVEFURV9ESVNDT05ORUNULAotCUZTR19TVEFURV9FWElULAotCUZTR19TVEFURV9URVJNSU5BVEVECi19OwotCi1lbnVtIGRhdGFfZGlyZWN0aW9uIHsKLQlEQVRBX0RJUl9VTktOT1dOID0gMCwKLQlEQVRBX0RJUl9GUk9NX0hPU1QsCi0JREFUQV9ESVJfVE9fSE9TVCwKLQlEQVRBX0RJUl9OT05FCi19OwogCiBzdHJ1Y3QgZnNnX2RldiB7CiAJLyogbG9jayBwcm90ZWN0czogc3RhdGUsIGFsbCB0aGUgcmVxX2J1c3kncywgYW5kIGNiYnVmX2NtbmQgKi8KQEAgLTY2Miw3ICs0MjUsNyBAQAogCWludAkJCWludHJlcV9idXN5OwogCXN0cnVjdCBmc2dfYnVmZmhkCSppbnRyX2J1ZmZoZDsKIAotIAl1bnNpZ25lZCBpbnQJCWJ1bGtfb3V0X21heHBhY2tldDsKKwl1bnNpZ25lZCBpbnQJCWJ1bGtfb3V0X21heHBhY2tldDsKIAllbnVtIGZzZ19zdGF0ZQkJc3RhdGU7CQkvLyBGb3IgZXhjZXB0aW9uIGhhbmRsaW5nCiAJdW5zaWduZWQgaW50CQlleGNlcHRpb25fcmVxX3RhZzsKIApAQCAtNjg3LDcgKzQ1MCw3IEBACiAKIAlzdHJ1Y3QgZnNnX2J1ZmZoZAkqbmV4dF9idWZmaGRfdG9fZmlsbDsKIAlzdHJ1Y3QgZnNnX2J1ZmZoZAkqbmV4dF9idWZmaGRfdG9fZHJhaW47Ci0Jc3RydWN0IGZzZ19idWZmaGQJYnVmZmhkc1tOVU1fQlVGRkVSU107CisJc3RydWN0IGZzZ19idWZmaGQJYnVmZmhkc1tGU0dfTlVNX0JVRkZFUlNdOwogCiAJaW50CQkJdGhyZWFkX3dha2V1cF9uZWVkZWQ7CiAJc3RydWN0IGNvbXBsZXRpb24JdGhyZWFkX25vdGlmaWVyOwpAQCAtNzEyLDggKzQ3NSw4IEBACiAJdTgJCQljYmJ1Zl9jbW5kW01BWF9DT01NQU5EX1NJWkVdOwogCiAJdW5zaWduZWQgaW50CQlubHVuczsKLQlzdHJ1Y3QgbHVuCQkqbHVuczsKLQlzdHJ1Y3QgbHVuCQkqY3VybHVuOworCXN0cnVjdCBmc2dfbHVuCQkqbHVuczsKKwlzdHJ1Y3QgZnNnX2x1bgkJKmN1cmx1bjsKIH07CiAKIHR5cGVkZWYgdm9pZCAoKmZzZ19yb3V0aW5lX3QpKHN0cnVjdCBmc2dfZGV2ICopOwpAQCAtNzM5LDQ5ICs1MDIsOSBAQAogc3RhdGljIHN0cnVjdCBmc2dfZGV2CQkJKnRoZV9mc2c7CiBzdGF0aWMgc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyCQlmc2dfZHJpdmVyOwogCi1zdGF0aWMgdm9pZAljbG9zZV9iYWNraW5nX2ZpbGUoc3RydWN0IGx1biAqY3VybHVuKTsKLQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jaWZkZWYgRFVNUF9NU0dTCi0KLXN0YXRpYyB2b2lkIGR1bXBfbXNnKHN0cnVjdCBmc2dfZGV2ICpmc2csIGNvbnN0IGNoYXIgKmxhYmVsLAotCQljb25zdCB1OCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQotewotCWlmIChsZW5ndGggPCA1MTIpIHsKLQkJREJHKGZzZywgIiVzLCBsZW5ndGggJXU6XG4iLCBsYWJlbCwgbGVuZ3RoKTsKLQkJcHJpbnRfaGV4X2R1bXAoS0VSTl9ERUJVRywgIiIsIERVTVBfUFJFRklYX09GRlNFVCwKLQkJCQkxNiwgMSwgYnVmLCBsZW5ndGgsIDApOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZHVtcF9jZGIoc3RydWN0IGZzZ19kZXYgKmZzZykKLXt9Ci0KLSNlbHNlCi0KLXN0YXRpYyB2b2lkIGR1bXBfbXNnKHN0cnVjdCBmc2dfZGV2ICpmc2csIGNvbnN0IGNoYXIgKmxhYmVsLAotCQljb25zdCB1OCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQote30KLQotI2lmZGVmIFZFUkJPU0VfREVCVUcKLQotc3RhdGljIHZvaWQgZHVtcF9jZGIoc3RydWN0IGZzZ19kZXYgKmZzZykKLXsKLQlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCAiU0NTSSBDREI6ICIsIERVTVBfUFJFRklYX05PTkUsCi0JCQkxNiwgMSwgZnNnLT5jbW5kLCBmc2ctPmNtbmRfc2l6ZSwgMCk7Ci19Ci0KLSNlbHNlCi0KLXN0YXRpYyB2b2lkIGR1bXBfY2RiKHN0cnVjdCBmc2dfZGV2ICpmc2cpCi17fQotCi0jZW5kaWYgLyogVkVSQk9TRV9ERUJVRyAqLwotI2VuZGlmIC8qIERVTVBfTVNHUyAqLwotCi0KIHN0YXRpYyBpbnQgZnNnX3NldF9oYWx0KHN0cnVjdCBmc2dfZGV2ICpmc2csIHN0cnVjdCB1c2JfZXAgKmVwKQogewogCWNvbnN0IGNoYXIJKm5hbWU7CkBAIC03OTksMjYgKzUyMiwxMSBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0vKiBSb3V0aW5lcyBmb3IgdW5hbGlnbmVkIGRhdGEgYWNjZXNzICovCi0KLXN0YXRpYyB1MzIgZ2V0X3VuYWxpZ25lZF9iZTI0KHU4ICpidWYpCi17Ci0JcmV0dXJuIDB4ZmZmZmZmICYgKHUzMikgZ2V0X3VuYWxpZ25lZF9iZTMyKGJ1ZiAtIDEpOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KIC8qCiAgKiBERVNDUklQVE9SUyAuLi4gbW9zdCBhcmUgc3RhdGljLCBidXQgc3RyaW5ncyBhbmQgKGZ1bGwpIGNvbmZpZ3VyYXRpb24KICAqIGRlc2NyaXB0b3JzIGFyZSBidWlsdCBvbiBkZW1hbmQuICBBbHNvIHRoZSAoc3RhdGljKSBjb25maWcgYW5kIGludGVyZmFjZQogICogZGVzY3JpcHRvcnMgYXJlIGFkanVzdGVkIGR1cmluZyBmc2dfYmluZCgpLgogICovCi0jZGVmaW5lIFNUUklOR19NQU5VRkFDVFVSRVIJMQotI2RlZmluZSBTVFJJTkdfUFJPRFVDVAkJMgotI2RlZmluZSBTVFJJTkdfU0VSSUFMCQkzCi0jZGVmaW5lIFNUUklOR19DT05GSUcJCTQKLSNkZWZpbmUgU1RSSU5HX0lOVEVSRkFDRQk1CiAKIC8qIFRoZXJlIGlzIG9ubHkgb25lIGNvbmZpZ3VyYXRpb24uICovCiAjZGVmaW5lCUNPTkZJR19WQUxVRQkJMQpAQCAtODMyLDEzICs1NDAsMTMgQEAKIAkuYkRldmljZUNsYXNzID0JCVVTQl9DTEFTU19QRVJfSU5URVJGQUNFLAogCiAJLyogVGhlIG5leHQgdGhyZWUgdmFsdWVzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IG1vZHVsZSBwYXJhbWV0ZXJzICovCi0JLmlkVmVuZG9yID0JCWNwdV90b19sZTE2KERSSVZFUl9WRU5ET1JfSUQpLAotCS5pZFByb2R1Y3QgPQkJY3B1X3RvX2xlMTYoRFJJVkVSX1BST0RVQ1RfSUQpLAorCS5pZFZlbmRvciA9CQljcHVfdG9fbGUxNihGU0dfVkVORE9SX0lEKSwKKwkuaWRQcm9kdWN0ID0JCWNwdV90b19sZTE2KEZTR19QUk9EVUNUX0lEKSwKIAkuYmNkRGV2aWNlID0JCWNwdV90b19sZTE2KDB4ZmZmZiksCiAKLQkuaU1hbnVmYWN0dXJlciA9CVNUUklOR19NQU5VRkFDVFVSRVIsCi0JLmlQcm9kdWN0ID0JCVNUUklOR19QUk9EVUNULAotCS5pU2VyaWFsTnVtYmVyID0JU1RSSU5HX1NFUklBTCwKKwkuaU1hbnVmYWN0dXJlciA9CUZTR19TVFJJTkdfTUFOVUZBQ1RVUkVSLAorCS5pUHJvZHVjdCA9CQlGU0dfU1RSSU5HX1BST0RVQ1QsCisJLmlTZXJpYWxOdW1iZXIgPQlGU0dfU1RSSU5HX1NFUklBTCwKIAkuYk51bUNvbmZpZ3VyYXRpb25zID0JMSwKIH07CiAKQEAgLTg1MCw4NiArNTU4LDEyIEBACiAJLyogd1RvdGFsTGVuZ3RoIGNvbXB1dGVkIGJ5IHVzYl9nYWRnZXRfY29uZmlnX2J1ZigpICovCiAJLmJOdW1JbnRlcmZhY2VzID0JMSwKIAkuYkNvbmZpZ3VyYXRpb25WYWx1ZSA9CUNPTkZJR19WQUxVRSwKLQkuaUNvbmZpZ3VyYXRpb24gPQlTVFJJTkdfQ09ORklHLAorCS5pQ29uZmlndXJhdGlvbiA9CUZTR19TVFJJTkdfQ09ORklHLAogCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0NPTkZJR19BVFRfT05FIHwgVVNCX0NPTkZJR19BVFRfU0VMRlBPV0VSLAogCS5iTWF4UG93ZXIgPQkJQ09ORklHX1VTQl9HQURHRVRfVkJVU19EUkFXIC8gMiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX290Z19kZXNjcmlwdG9yCi1vdGdfZGVzYyA9IHsKLQkuYkxlbmd0aCA9CQlzaXplb2Yob3RnX2Rlc2MpLAotCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfT1RHLAogCi0JLmJtQXR0cmlidXRlcyA9CQlVU0JfT1RHX1NSUCwKLX07Ci0KLS8qIFRoZXJlIGlzIG9ubHkgb25lIGludGVyZmFjZS4gKi8KLQotc3RhdGljIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IKLWludGZfZGVzYyA9IHsKLQkuYkxlbmd0aCA9CQlzaXplb2YgaW50Zl9kZXNjLAotCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfSU5URVJGQUNFLAotCi0JLmJOdW1FbmRwb2ludHMgPQkyLAkJLy8gQWRqdXN0ZWQgZHVyaW5nIGZzZ19iaW5kKCkKLQkuYkludGVyZmFjZUNsYXNzID0JVVNCX0NMQVNTX01BU1NfU1RPUkFHRSwKLQkuYkludGVyZmFjZVN1YkNsYXNzID0JVVNCX1NDX1NDU0ksCS8vIEFkanVzdGVkIGR1cmluZyBmc2dfYmluZCgpCi0JLmJJbnRlcmZhY2VQcm90b2NvbCA9CVVTQl9QUl9CVUxLLAkvLyBBZGp1c3RlZCBkdXJpbmcgZnNnX2JpbmQoKQotCS5pSW50ZXJmYWNlID0JCVNUUklOR19JTlRFUkZBQ0UsCi19OwotCi0vKiBUaHJlZSBmdWxsLXNwZWVkIGVuZHBvaW50IGRlc2NyaXB0b3JzOiBidWxrLWluLCBidWxrLW91dCwKLSAqIGFuZCBpbnRlcnJ1cHQtaW4uICovCi0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IKLWZzX2J1bGtfaW5fZGVzYyA9IHsKLQkuYkxlbmd0aCA9CQlVU0JfRFRfRU5EUE9JTlRfU0laRSwKLQkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0VORFBPSU5ULAotCi0JLmJFbmRwb2ludEFkZHJlc3MgPQlVU0JfRElSX0lOLAotCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKLQkvKiB3TWF4UGFja2V0U2l6ZSBzZXQgYnkgYXV0b2NvbmZpZ3VyYXRpb24gKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IKLWZzX2J1bGtfb3V0X2Rlc2MgPSB7Ci0JLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCi0JLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKLQotCS5iRW5kcG9pbnRBZGRyZXNzID0JVVNCX0RJUl9PVVQsCi0JLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAotCS8qIHdNYXhQYWNrZXRTaXplIHNldCBieSBhdXRvY29uZmlndXJhdGlvbiAqLwotfTsKLQotc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgotZnNfaW50cl9pbl9kZXNjID0gewotCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAotCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCi0KLQkuYkVuZHBvaW50QWRkcmVzcyA9CVVTQl9ESVJfSU4sCi0JLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCi0JLndNYXhQYWNrZXRTaXplID0JY3B1X3RvX2xlMTYoMiksCi0JLmJJbnRlcnZhbCA9CQkzMiwJLy8gZnJhbWVzIC0+IDMyIG1zCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqZnNfZnVuY3Rpb25bXSA9IHsKLQkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmb3RnX2Rlc2MsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmludGZfZGVzYywKLQkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZnNfYnVsa19pbl9kZXNjLAotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZmc19idWxrX291dF9kZXNjLAotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZmc19pbnRyX2luX2Rlc2MsCi0JTlVMTCwKLX07Ci0jZGVmaW5lIEZTX0ZVTkNUSU9OX1BSRV9FUF9FTlRSSUVTCTIKLQotCi0vKgotICogVVNCIDIuMCBkZXZpY2VzIG5lZWQgdG8gZXhwb3NlIGJvdGggaGlnaCBzcGVlZCBhbmQgZnVsbCBzcGVlZAotICogZGVzY3JpcHRvcnMsIHVubGVzcyB0aGV5IG9ubHkgcnVuIGF0IGZ1bGwgc3BlZWQuCi0gKgotICogVGhhdCBtZWFucyBhbHRlcm5hdGUgZW5kcG9pbnQgZGVzY3JpcHRvcnMgKGJpZ2dlciBwYWNrZXRzKQotICogYW5kIGEgImRldmljZSBxdWFsaWZpZXIiIC4uLiBwbHVzIG1vcmUgY29uc3RydWN0aW9uIG9wdGlvbnMKLSAqIGZvciB0aGUgY29uZmlnIGRlc2NyaXB0b3IuCi0gKi8KIHN0YXRpYyBzdHJ1Y3QgdXNiX3F1YWxpZmllcl9kZXNjcmlwdG9yCiBkZXZfcXVhbGlmaWVyID0gewogCS5iTGVuZ3RoID0JCXNpemVvZiBkZXZfcXVhbGlmaWVyLApAQCAtOTQxLDc4ICs1NzUsNiBAQAogCS5iTnVtQ29uZmlndXJhdGlvbnMgPQkxLAogfTsKIAotc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgotaHNfYnVsa19pbl9kZXNjID0gewotCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAotCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCi0KLQkvKiBiRW5kcG9pbnRBZGRyZXNzIGNvcGllZCBmcm9tIGZzX2J1bGtfaW5fZGVzYyBkdXJpbmcgZnNnX2JpbmQoKSAqLwotCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKLQkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNig1MTIpLAotfTsKLQotc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgotaHNfYnVsa19vdXRfZGVzYyA9IHsKLQkuYkxlbmd0aCA9CQlVU0JfRFRfRU5EUE9JTlRfU0laRSwKLQkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0VORFBPSU5ULAotCi0JLyogYkVuZHBvaW50QWRkcmVzcyBjb3BpZWQgZnJvbSBmc19idWxrX291dF9kZXNjIGR1cmluZyBmc2dfYmluZCgpICovCi0JLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAotCS53TWF4UGFja2V0U2l6ZSA9CWNwdV90b19sZTE2KDUxMiksCi0JLmJJbnRlcnZhbCA9CQkxLAkvLyBOQUsgZXZlcnkgMSB1ZnJhbWUKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IKLWhzX2ludHJfaW5fZGVzYyA9IHsKLQkuYkxlbmd0aCA9CQlVU0JfRFRfRU5EUE9JTlRfU0laRSwKLQkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0VORFBPSU5ULAotCi0JLyogYkVuZHBvaW50QWRkcmVzcyBjb3BpZWQgZnJvbSBmc19pbnRyX2luX2Rlc2MgZHVyaW5nIGZzZ19iaW5kKCkgKi8KLQkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0lOVCwKLQkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNigyKSwKLQkuYkludGVydmFsID0JCTksCS8vIDIqKig5LTEpID0gMjU2IHVmcmFtZXMgLT4gMzIgbXMKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICpoc19mdW5jdGlvbltdID0gewotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZvdGdfZGVzYywKLQkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmaW50Zl9kZXNjLAotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZoc19idWxrX2luX2Rlc2MsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmhzX2J1bGtfb3V0X2Rlc2MsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmhzX2ludHJfaW5fZGVzYywKLQlOVUxMLAotfTsKLSNkZWZpbmUgSFNfRlVOQ1RJT05fUFJFX0VQX0VOVFJJRVMJMgotCi0vKiBNYXhwYWNrZXQgYW5kIG90aGVyIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljcyB2YXJ5IGJ5IHNwZWVkLiAqLwotc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqCi1lcF9kZXNjKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnLCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmZzLAotCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmhzKQotewotCWlmIChnYWRnZXRfaXNfZHVhbHNwZWVkKGcpICYmIGctPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQotCQlyZXR1cm4gaHM7Ci0JcmV0dXJuIGZzOwotfQotCi0KLS8qIFRoZSBDQkkgc3BlY2lmaWNhdGlvbiBsaW1pdHMgdGhlIHNlcmlhbCBzdHJpbmcgdG8gMTIgdXBwZXJjYXNlIGhleGFkZWNpbWFsCi0gKiBjaGFyYWN0ZXJzLiAqLwotc3RhdGljIGNoYXIJCQkJbWFudWZhY3R1cmVyWzY0XTsKLXN0YXRpYyBjaGFyCQkJCXNlcmlhbFsxM107Ci0KLS8qIFN0YXRpYyBzdHJpbmdzLCBpbiBVVEYtOCAoZm9yIHNpbXBsaWNpdHkgd2UgdXNlIG9ubHkgQVNDSUkgY2hhcmFjdGVycykgKi8KLXN0YXRpYyBzdHJ1Y3QgdXNiX3N0cmluZwkJc3RyaW5nc1tdID0gewotCXtTVFJJTkdfTUFOVUZBQ1RVUkVSLAltYW51ZmFjdHVyZXJ9LAotCXtTVFJJTkdfUFJPRFVDVCwJbG9uZ25hbWV9LAotCXtTVFJJTkdfU0VSSUFMLAkJc2VyaWFsfSwKLQl7U1RSSU5HX0NPTkZJRywJCSJTZWxmLXBvd2VyZWQifSwKLQl7U1RSSU5HX0lOVEVSRkFDRSwJIk1hc3MgU3RvcmFnZSJ9LAotCXt9Ci19OwotCi1zdGF0aWMgc3RydWN0IHVzYl9nYWRnZXRfc3RyaW5ncwlzdHJpbmd0YWIgPSB7Ci0JLmxhbmd1YWdlCT0gMHgwNDA5LAkJLy8gZW4tdXMKLQkuc3RyaW5ncwk9IHN0cmluZ3MsCi19OwogCiAKIC8qCkBAIC0xMDMyLDEwICs1OTQsOSBAQAogCiAJaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoZ2FkZ2V0KSAmJiB0eXBlID09IFVTQl9EVF9PVEhFUl9TUEVFRF9DT05GSUcpCiAJCXNwZWVkID0gKFVTQl9TUEVFRF9GVUxMICsgVVNCX1NQRUVEX0hJR0gpIC0gc3BlZWQ7Ci0JaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoZ2FkZ2V0KSAmJiBzcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKLQkJZnVuY3Rpb24gPSBoc19mdW5jdGlvbjsKLQllbHNlCi0JCWZ1bmN0aW9uID0gZnNfZnVuY3Rpb247CisJZnVuY3Rpb24gPSBnYWRnZXRfaXNfZHVhbHNwZWVkKGdhZGdldCkgJiYgc3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gKKwkJPyAoY29uc3Qgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKilmc2dfaHNfZnVuY3Rpb24KKwkJOiAoY29uc3Qgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKilmc2dfZnNfZnVuY3Rpb247CiAKIAkvKiBmb3Igbm93LCBkb24ndCBhZHZlcnRpc2Ugc3JwLW9ubHkgZGV2aWNlcyAqLwogCWlmICghZ2FkZ2V0X2lzX290ZyhnYWRnZXQpKQpAQCAtMTM4Niw3ICs5NDcsNyBAQAogCQkJVkRCRyhmc2csICJnZXQgc3RyaW5nIGRlc2NyaXB0b3JcbiIpOwogCiAJCQkvKiB3SW5kZXggPT0gbGFuZ3VhZ2UgY29kZSAqLwotCQkJdmFsdWUgPSB1c2JfZ2FkZ2V0X2dldF9zdHJpbmcoJnN0cmluZ3RhYiwKKwkJCXZhbHVlID0gdXNiX2dhZGdldF9nZXRfc3RyaW5nKCZmc2dfc3RyaW5ndGFiLAogCQkJCQl3X3ZhbHVlICYgMHhmZiwgcmVxLT5idWYpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTE1NTEsNyArMTExMiw3IEBACiAKIHN0YXRpYyBpbnQgZG9fcmVhZChzdHJ1Y3QgZnNnX2RldiAqZnNnKQogewotCXN0cnVjdCBsdW4JCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKKwlzdHJ1Y3QgZnNnX2x1bgkJKmN1cmx1biA9IGZzZy0+Y3VybHVuOwogCXUzMgkJCWxiYTsKIAlzdHJ1Y3QgZnNnX2J1ZmZoZAkqYmg7CiAJaW50CQkJcmM7CkBAIC0xNjc3LDcgKzEyMzgsNyBAQAogCiBzdGF0aWMgaW50IGRvX3dyaXRlKHN0cnVjdCBmc2dfZGV2ICpmc2cpCiB7Ci0Jc3RydWN0IGx1bgkJKmN1cmx1biA9IGZzZy0+Y3VybHVuOworCXN0cnVjdCBmc2dfbHVuCQkqY3VybHVuID0gZnNnLT5jdXJsdW47CiAJdTMyCQkJbGJhOwogCXN0cnVjdCBmc2dfYnVmZmhkCSpiaDsKIAlpbnQJCQlnZXRfc29tZV9tb3JlOwpAQCAtMTcxMyw3ICsxMjc0LDcgQEAKIAkJfQogCQlpZiAoZnNnLT5jbW5kWzFdICYgMHgwOCkgewkvLyBGVUEKIAkJCXNwaW5fbG9jaygmY3VybHVuLT5maWxwLT5mX2xvY2spOwotCQkJY3VybHVuLT5maWxwLT5mX2ZsYWdzIHw9IE9fU1lOQzsKKwkJCWN1cmx1bi0+ZmlscC0+Zl9mbGFncyB8PSBPX0RTWU5DOwogCQkJc3Bpbl91bmxvY2soJmN1cmx1bi0+ZmlscC0+Zl9sb2NrKTsKIAkJfQogCX0KQEAgLTE4NjQsMzMgKzE0MjUsMTQgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotLyogU3luYyB0aGUgZmlsZSBkYXRhLCBkb24ndCBib3RoZXIgd2l0aCB0aGUgbWV0YWRhdGEuCi0gKiBUaGlzIGNvZGUgd2FzIGNvcGllZCBmcm9tIGZzL2J1ZmZlci5jOnN5c19mZGF0YXN5bmMoKS4gKi8KLXN0YXRpYyBpbnQgZnN5bmNfc3ViKHN0cnVjdCBsdW4gKmN1cmx1bikKLXsKLQlzdHJ1Y3QgZmlsZQkqZmlscCA9IGN1cmx1bi0+ZmlscDsKLQotCWlmIChjdXJsdW4tPnJvIHx8ICFmaWxwKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gdmZzX2ZzeW5jKGZpbHAsIGZpbHAtPmZfcGF0aC5kZW50cnksIDEpOwotfQotCi1zdGF0aWMgdm9pZCBmc3luY19hbGwoc3RydWN0IGZzZ19kZXYgKmZzZykKLXsKLQlpbnQJaTsKLQotCWZvciAoaSA9IDA7IGkgPCBmc2ctPm5sdW5zOyArK2kpCi0JCWZzeW5jX3N1YigmZnNnLT5sdW5zW2ldKTsKLX0KLQogc3RhdGljIGludCBkb19zeW5jaHJvbml6ZV9jYWNoZShzdHJ1Y3QgZnNnX2RldiAqZnNnKQogewotCXN0cnVjdCBsdW4JKmN1cmx1biA9IGZzZy0+Y3VybHVuOworCXN0cnVjdCBmc2dfbHVuCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKIAlpbnQJCXJjOwogCiAJLyogV2UgaWdub3JlIHRoZSByZXF1ZXN0ZWQgTEJBIGFuZCB3cml0ZSBvdXQgYWxsIGZpbGUncwogCSAqIGRpcnR5IGRhdGEgYnVmZmVycy4gKi8KLQlyYyA9IGZzeW5jX3N1YihjdXJsdW4pOworCXJjID0gZnNnX2x1bl9mc3luY19zdWIoY3VybHVuKTsKIAlpZiAocmMpCiAJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX1dSSVRFX0VSUk9SOwogCXJldHVybiAwOwpAQCAtMTg5OSw3ICsxNDQxLDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIHZvaWQgaW52YWxpZGF0ZV9zdWIoc3RydWN0IGx1biAqY3VybHVuKQorc3RhdGljIHZvaWQgaW52YWxpZGF0ZV9zdWIoc3RydWN0IGZzZ19sdW4gKmN1cmx1bikKIHsKIAlzdHJ1Y3QgZmlsZQkqZmlscCA9IGN1cmx1bi0+ZmlscDsKIAlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKQEAgLTE5MTEsNyArMTQ1Myw3IEBACiAKIHN0YXRpYyBpbnQgZG9fdmVyaWZ5KHN0cnVjdCBmc2dfZGV2ICpmc2cpCiB7Ci0Jc3RydWN0IGx1bgkJKmN1cmx1biA9IGZzZy0+Y3VybHVuOworCXN0cnVjdCBmc2dfbHVuCQkqY3VybHVuID0gZnNnLT5jdXJsdW47CiAJdTMyCQkJbGJhOwogCXUzMgkJCXZlcmlmaWNhdGlvbl9sZW5ndGg7CiAJc3RydWN0IGZzZ19idWZmaGQJKmJoID0gZnNnLT5uZXh0X2J1ZmZoZF90b19maWxsOwpAQCAtMTk0NCw3ICsxNDg2LDcgQEAKIAlmaWxlX29mZnNldCA9ICgobG9mZl90KSBsYmEpIDw8IDk7CiAKIAkvKiBXcml0ZSBvdXQgYWxsIHRoZSBkaXJ0eSBidWZmZXJzIGJlZm9yZSBpbnZhbGlkYXRpbmcgdGhlbSAqLwotCWZzeW5jX3N1YihjdXJsdW4pOworCWZzZ19sdW5fZnN5bmNfc3ViKGN1cmx1bik7CiAJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQlyZXR1cm4gLUVJTlRSOwogCkBAIC0yMDQxLDcgKzE1ODMsNyBAQAogCiBzdGF0aWMgaW50IGRvX3JlcXVlc3Rfc2Vuc2Uoc3RydWN0IGZzZ19kZXYgKmZzZywgc3RydWN0IGZzZ19idWZmaGQgKmJoKQogewotCXN0cnVjdCBsdW4JKmN1cmx1biA9IGZzZy0+Y3VybHVuOworCXN0cnVjdCBmc2dfbHVuCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKIAl1OAkJKmJ1ZiA9ICh1OCAqKSBiaC0+YnVmOwogCXUzMgkJc2QsIHNkaW5mbzsKIAlpbnQJCXZhbGlkOwpAQCAtMjA5NSw3ICsxNjM3LDcgQEAKIAogc3RhdGljIGludCBkb19yZWFkX2NhcGFjaXR5KHN0cnVjdCBmc2dfZGV2ICpmc2csIHN0cnVjdCBmc2dfYnVmZmhkICpiaCkKIHsKLQlzdHJ1Y3QgbHVuCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKKwlzdHJ1Y3QgZnNnX2x1bgkqY3VybHVuID0gZnNnLT5jdXJsdW47CiAJdTMyCQlsYmEgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJmZzZy0+Y21uZFsyXSk7CiAJaW50CQlwbWkgPSBmc2ctPmNtbmRbOF07CiAJdTgJCSpidWYgPSAodTggKikgYmgtPmJ1ZjsKQEAgLTIxMTMsMjcgKzE2NTUsOSBAQAogfQogCiAKLXN0YXRpYyB2b2lkIHN0b3JlX2Nkcm9tX2FkZHJlc3ModTggKmRlc3QsIGludCBtc2YsIHUzMiBhZGRyKQotewotCWlmIChtc2YpIHsKLQkJLyogQ29udmVydCB0byBNaW51dGVzLVNlY29uZHMtRnJhbWVzICovCi0JCWFkZHIgPj49IDI7CQkvKiBDb252ZXJ0IHRvIDIwNDgtYnl0ZSBmcmFtZXMgKi8KLQkJYWRkciArPSAyKjc1OwkJLyogTGVhZC1pbiBvY2N1cGllcyAyIHNlY29uZHMgKi8KLQkJZGVzdFszXSA9IGFkZHIgJSA3NTsJLyogRnJhbWVzICovCi0JCWFkZHIgLz0gNzU7Ci0JCWRlc3RbMl0gPSBhZGRyICUgNjA7CS8qIFNlY29uZHMgKi8KLQkJYWRkciAvPSA2MDsKLQkJZGVzdFsxXSA9IGFkZHI7CQkvKiBNaW51dGVzICovCi0JCWRlc3RbMF0gPSAwOwkJLyogUmVzZXJ2ZWQgKi8KLQl9IGVsc2UgewotCQkvKiBBYnNvbHV0ZSBzZWN0b3IgKi8KLQkJcHV0X3VuYWxpZ25lZF9iZTMyKGFkZHIsIGRlc3QpOwotCX0KLX0KLQogc3RhdGljIGludCBkb19yZWFkX2hlYWRlcihzdHJ1Y3QgZnNnX2RldiAqZnNnLCBzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmgpCiB7Ci0Jc3RydWN0IGx1bgkqY3VybHVuID0gZnNnLT5jdXJsdW47CisJc3RydWN0IGZzZ19sdW4JKmN1cmx1biA9IGZzZy0+Y3VybHVuOwogCWludAkJbXNmID0gZnNnLT5jbW5kWzFdICYgMHgwMjsKIAl1MzIJCWxiYSA9IGdldF91bmFsaWduZWRfYmUzMigmZnNnLT5jbW5kWzJdKTsKIAl1OAkJKmJ1ZiA9ICh1OCAqKSBiaC0+YnVmOwpAQCAtMjE1Niw3ICsxNjgwLDcgQEAKIAogc3RhdGljIGludCBkb19yZWFkX3RvYyhzdHJ1Y3QgZnNnX2RldiAqZnNnLCBzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmgpCiB7Ci0Jc3RydWN0IGx1bgkqY3VybHVuID0gZnNnLT5jdXJsdW47CisJc3RydWN0IGZzZ19sdW4JKmN1cmx1biA9IGZzZy0+Y3VybHVuOwogCWludAkJbXNmID0gZnNnLT5jbW5kWzFdICYgMHgwMjsKIAlpbnQJCXN0YXJ0X3RyYWNrID0gZnNnLT5jbW5kWzZdOwogCXU4CQkqYnVmID0gKHU4ICopIGJoLT5idWY7CkBAIC0yMTg0LDcgKzE3MDgsNyBAQAogCiBzdGF0aWMgaW50IGRvX21vZGVfc2Vuc2Uoc3RydWN0IGZzZ19kZXYgKmZzZywgc3RydWN0IGZzZ19idWZmaGQgKmJoKQogewotCXN0cnVjdCBsdW4JKmN1cmx1biA9IGZzZy0+Y3VybHVuOworCXN0cnVjdCBmc2dfbHVuCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKIAlpbnQJCW1zY21uZCA9IGZzZy0+Y21uZFswXTsKIAl1OAkJKmJ1ZiA9ICh1OCAqKSBiaC0+YnVmOwogCXU4CQkqYnVmMCA9IGJ1ZjsKQEAgLTIyNjUsNyArMTc4OSw3IEBACiAKIHN0YXRpYyBpbnQgZG9fc3RhcnRfc3RvcChzdHJ1Y3QgZnNnX2RldiAqZnNnKQogewotCXN0cnVjdCBsdW4JKmN1cmx1biA9IGZzZy0+Y3VybHVuOworCXN0cnVjdCBmc2dfbHVuCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKIAlpbnQJCWxvZWosIHN0YXJ0OwogCiAJaWYgKCFtb2RfZGF0YS5yZW1vdmFibGUpIHsKQEAgLTIyOTUsNyArMTgxOSw3IEBACiAJCWlmIChsb2VqKSB7CQkvLyBTaW11bGF0ZSBhbiB1bmxvYWQvZWplY3QKIAkJCXVwX3JlYWQoJmZzZy0+ZmlsZXNlbSk7CiAJCQlkb3duX3dyaXRlKCZmc2ctPmZpbGVzZW0pOwotCQkJY2xvc2VfYmFja2luZ19maWxlKGN1cmx1bik7CisJCQlmc2dfbHVuX2Nsb3NlKGN1cmx1bik7CiAJCQl1cF93cml0ZSgmZnNnLT5maWxlc2VtKTsKIAkJCWRvd25fcmVhZCgmZnNnLT5maWxlc2VtKTsKIAkJfQpAQCAtMjMwMyw3ICsxODI3LDcgQEAKIAogCQkvKiBPdXIgZW11bGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCBtb3VudGluZzsgdGhlIG1lZGl1bSBpcwogCQkgKiBhdmFpbGFibGUgZm9yIHVzZSBhcyBzb29uIGFzIGl0IGlzIGxvYWRlZC4gKi8KLQkJaWYgKCFiYWNraW5nX2ZpbGVfaXNfb3BlbihjdXJsdW4pKSB7CisJCWlmICghZnNnX2x1bl9pc19vcGVuKGN1cmx1bikpIHsKIAkJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX01FRElVTV9OT1RfUFJFU0VOVDsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC0yMzE1LDcgKzE4MzksNyBAQAogCiBzdGF0aWMgaW50IGRvX3ByZXZlbnRfYWxsb3coc3RydWN0IGZzZ19kZXYgKmZzZykKIHsKLQlzdHJ1Y3QgbHVuCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKKwlzdHJ1Y3QgZnNnX2x1bgkqY3VybHVuID0gZnNnLT5jdXJsdW47CiAJaW50CQlwcmV2ZW50OwogCiAJaWYgKCFtb2RfZGF0YS5yZW1vdmFibGUpIHsKQEAgLTIzMzAsNyArMTg1NCw3IEBACiAJfQogCiAJaWYgKGN1cmx1bi0+cHJldmVudF9tZWRpdW1fcmVtb3ZhbCAmJiAhcHJldmVudCkKLQkJZnN5bmNfc3ViKGN1cmx1bik7CisJCWZzZ19sdW5fZnN5bmNfc3ViKGN1cmx1bik7CiAJY3VybHVuLT5wcmV2ZW50X21lZGl1bV9yZW1vdmFsID0gcHJldmVudDsKIAlyZXR1cm4gMDsKIH0KQEAgLTIzMzksNyArMTg2Myw3IEBACiBzdGF0aWMgaW50IGRvX3JlYWRfZm9ybWF0X2NhcGFjaXRpZXMoc3RydWN0IGZzZ19kZXYgKmZzZywKIAkJCXN0cnVjdCBmc2dfYnVmZmhkICpiaCkKIHsKLQlzdHJ1Y3QgbHVuCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKKwlzdHJ1Y3QgZnNnX2x1bgkqY3VybHVuID0gZnNnLT5jdXJsdW47CiAJdTgJCSpidWYgPSAodTggKikgYmgtPmJ1ZjsKIAogCWJ1ZlswXSA9IGJ1ZlsxXSA9IGJ1ZlsyXSA9IDA7CkBAIC0yMzU2LDcgKzE4ODAsNyBAQAogCiBzdGF0aWMgaW50IGRvX21vZGVfc2VsZWN0KHN0cnVjdCBmc2dfZGV2ICpmc2csIHN0cnVjdCBmc2dfYnVmZmhkICpiaCkKIHsKLQlzdHJ1Y3QgbHVuCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKKwlzdHJ1Y3QgZnNnX2x1bgkqY3VybHVuID0gZnNnLT5jdXJsdW47CiAKIAkvKiBXZSBkb24ndCBzdXBwb3J0IE1PREUgU0VMRUNUICovCiAJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfSU5WQUxJRF9DT01NQU5EOwpAQCAtMjU5OSw3ICsyMTIzLDcgQEAKIAogc3RhdGljIGludCBzZW5kX3N0YXR1cyhzdHJ1Y3QgZnNnX2RldiAqZnNnKQogewotCXN0cnVjdCBsdW4JCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKKwlzdHJ1Y3QgZnNnX2x1bgkJKmN1cmx1biA9IGZzZy0+Y3VybHVuOwogCXN0cnVjdCBmc2dfYnVmZmhkCSpiaDsKIAlpbnQJCQlyYzsKIAl1OAkJCXN0YXR1cyA9IFVTQl9TVEFUVVNfUEFTUzsKQEAgLTI2OTEsNyArMjIxNSw3IEBACiAJaW50CQkJbHVuID0gZnNnLT5jbW5kWzFdID4+IDU7CiAJc3RhdGljIGNvbnN0IGNoYXIJZGlybGV0dGVyWzRdID0geyd1JywgJ28nLCAnaScsICduJ307CiAJY2hhcgkJCWhkbGVuWzIwXTsKLQlzdHJ1Y3QgbHVuCQkqY3VybHVuOworCXN0cnVjdCBmc2dfbHVuCQkqY3VybHVuOwogCiAJLyogQWRqdXN0IHRoZSBleHBlY3RlZCBjbW5kX3NpemUgZm9yIHByb3RvY29sIGVuY2Fwc3VsYXRpb24gcGFkZGluZy4KIAkgKiBUcmFuc3BhcmVudCBTQ1NJIGRvZXNuJ3QgcGFkLiAqLwpAQCAtMjgyMCw3ICsyMzQ0LDcgQEAKIAogCS8qIElmIHRoZSBtZWRpdW0gaXNuJ3QgbW91bnRlZCBhbmQgdGhlIGNvbW1hbmQgbmVlZHMgdG8gYWNjZXNzCiAJICogaXQsIHJldHVybiBhbiBlcnJvci4gKi8KLQlpZiAoY3VybHVuICYmICFiYWNraW5nX2ZpbGVfaXNfb3BlbihjdXJsdW4pICYmIG5lZWRzX21lZGl1bSkgeworCWlmIChjdXJsdW4gJiYgIWZzZ19sdW5faXNfb3BlbihjdXJsdW4pICYmIG5lZWRzX21lZGl1bSkgewogCQljdXJsdW4tPnNlbnNlX2RhdGEgPSBTU19NRURJVU1fTk9UX1BSRVNFTlQ7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTMwNzUsOCArMjU5OSw4IEBACiAKIHN0YXRpYyBpbnQgcmVjZWl2ZWRfY2J3KHN0cnVjdCBmc2dfZGV2ICpmc2csIHN0cnVjdCBmc2dfYnVmZmhkICpiaCkKIHsKLQlzdHJ1Y3QgdXNiX3JlcXVlc3QJKnJlcSA9IGJoLT5vdXRyZXE7Ci0Jc3RydWN0IGJ1bGtfY2Jfd3JhcAkqY2J3ID0gcmVxLT5idWY7CisJc3RydWN0IHVzYl9yZXF1ZXN0CQkqcmVxID0gYmgtPm91dHJlcTsKKwlzdHJ1Y3QgZnNnX2J1bGtfY2Jfd3JhcAkqY2J3ID0gcmVxLT5idWY7CiAKIAkvKiBXYXMgdGhpcyBhIHJlYWwgcGFja2V0PyAgU2hvdWxkIGl0IGJlIGlnbm9yZWQ/ICovCiAJaWYgKHJlcS0+c3RhdHVzIHx8IHRlc3RfYml0KElHTk9SRV9CVUxLX09VVCwgJmZzZy0+YXRvbWljX2JpdGZsYWdzKSkKQEAgLTMxMDUsNyArMjYyOSw3IEBACiAJfQogCiAJLyogSXMgdGhlIENCVyBtZWFuaW5nZnVsPyAqLwotCWlmIChjYnctPkx1biA+PSBNQVhfTFVOUyB8fCBjYnctPkZsYWdzICYgflVTQl9CVUxLX0lOX0ZMQUcgfHwKKwlpZiAoY2J3LT5MdW4gPj0gRlNHX01BWF9MVU5TIHx8IGNidy0+RmxhZ3MgJiB+VVNCX0JVTEtfSU5fRkxBRyB8fAogCQkJY2J3LT5MZW5ndGggPD0gMCB8fCBjYnctPkxlbmd0aCA+IE1BWF9DT01NQU5EX1NJWkUpIHsKIAkJREJHKGZzZywgIm5vbi1tZWFuaW5nZnVsIENCVzogbHVuID0gJXUsIGZsYWdzID0gMHgleCwgIgogCQkJCSJjbWRsZW4gJXVcbiIsCkBAIC0zMjM4LDcgKzI3NjIsNyBAQAogCiByZXNldDoKIAkvKiBEZWFsbG9jYXRlIHRoZSByZXF1ZXN0cyAqLwotCWZvciAoaSA9IDA7IGkgPCBOVU1fQlVGRkVSUzsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IEZTR19OVU1fQlVGRkVSUzsgKytpKSB7CiAJCXN0cnVjdCBmc2dfYnVmZmhkICpiaCA9ICZmc2ctPmJ1ZmZoZHNbaV07CiAKIAkJaWYgKGJoLT5pbnJlcSkgewpAQCAtMzI3NiwxMiArMjgwMCwxNCBAQAogCURCRyhmc2csICJzZXQgaW50ZXJmYWNlICVkXG4iLCBhbHRzZXR0aW5nKTsKIAogCS8qIEVuYWJsZSB0aGUgZW5kcG9pbnRzICovCi0JZCA9IGVwX2Rlc2MoZnNnLT5nYWRnZXQsICZmc19idWxrX2luX2Rlc2MsICZoc19idWxrX2luX2Rlc2MpOworCWQgPSBmc2dfZXBfZGVzYyhmc2ctPmdhZGdldCwKKwkJCSZmc2dfZnNfYnVsa19pbl9kZXNjLCAmZnNnX2hzX2J1bGtfaW5fZGVzYyk7CiAJaWYgKChyYyA9IGVuYWJsZV9lbmRwb2ludChmc2csIGZzZy0+YnVsa19pbiwgZCkpICE9IDApCiAJCWdvdG8gcmVzZXQ7CiAJZnNnLT5idWxrX2luX2VuYWJsZWQgPSAxOwogCi0JZCA9IGVwX2Rlc2MoZnNnLT5nYWRnZXQsICZmc19idWxrX291dF9kZXNjLCAmaHNfYnVsa19vdXRfZGVzYyk7CisJZCA9IGZzZ19lcF9kZXNjKGZzZy0+Z2FkZ2V0LAorCQkJJmZzZ19mc19idWxrX291dF9kZXNjLCAmZnNnX2hzX2J1bGtfb3V0X2Rlc2MpOwogCWlmICgocmMgPSBlbmFibGVfZW5kcG9pbnQoZnNnLCBmc2ctPmJ1bGtfb3V0LCBkKSkgIT0gMCkKIAkJZ290byByZXNldDsKIAlmc2ctPmJ1bGtfb3V0X2VuYWJsZWQgPSAxOwpAQCAtMzI4OSwxNCArMjgxNSwxNSBAQAogCWNsZWFyX2JpdChJR05PUkVfQlVMS19PVVQsICZmc2ctPmF0b21pY19iaXRmbGFncyk7CiAKIAlpZiAodHJhbnNwb3J0X2lzX2NiaSgpKSB7Ci0JCWQgPSBlcF9kZXNjKGZzZy0+Z2FkZ2V0LCAmZnNfaW50cl9pbl9kZXNjLCAmaHNfaW50cl9pbl9kZXNjKTsKKwkJZCA9IGZzZ19lcF9kZXNjKGZzZy0+Z2FkZ2V0LAorCQkJCSZmc2dfZnNfaW50cl9pbl9kZXNjLCAmZnNnX2hzX2ludHJfaW5fZGVzYyk7CiAJCWlmICgocmMgPSBlbmFibGVfZW5kcG9pbnQoZnNnLCBmc2ctPmludHJfaW4sIGQpKSAhPSAwKQogCQkJZ290byByZXNldDsKIAkJZnNnLT5pbnRyX2luX2VuYWJsZWQgPSAxOwogCX0KIAogCS8qIEFsbG9jYXRlIHRoZSByZXF1ZXN0cyAqLwotCWZvciAoaSA9IDA7IGkgPCBOVU1fQlVGRkVSUzsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IEZTR19OVU1fQlVGRkVSUzsgKytpKSB7CiAJCXN0cnVjdCBmc2dfYnVmZmhkCSpiaCA9ICZmc2ctPmJ1ZmZoZHNbaV07CiAKIAkJaWYgKChyYyA9IGFsbG9jX3JlcXVlc3QoZnNnLCBmc2ctPmJ1bGtfaW4sICZiaC0+aW5yZXEpKSAhPSAwKQpAQCAtMzM3Miw3ICsyODk5LDcgQEAKIAlzdHJ1Y3QgZnNnX2J1ZmZoZAkqYmg7CiAJZW51bSBmc2dfc3RhdGUJCW9sZF9zdGF0ZTsKIAl1OAkJCW5ld19jb25maWc7Ci0Jc3RydWN0IGx1bgkJKmN1cmx1bjsKKwlzdHJ1Y3QgZnNnX2x1bgkJKmN1cmx1bjsKIAl1bnNpZ25lZCBpbnQJCWV4Y2VwdGlvbl9yZXFfdGFnOwogCWludAkJCXJjOwogCkBAIC0zMzkyLDcgKzI5MTksNyBAQAogCS8qIENhbmNlbCBhbGwgdGhlIHBlbmRpbmcgdHJhbnNmZXJzICovCiAJaWYgKGZzZy0+aW50cmVxX2J1c3kpCiAJCXVzYl9lcF9kZXF1ZXVlKGZzZy0+aW50cl9pbiwgZnNnLT5pbnRyZXEpOwotCWZvciAoaSA9IDA7IGkgPCBOVU1fQlVGRkVSUzsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IEZTR19OVU1fQlVGRkVSUzsgKytpKSB7CiAJCWJoID0gJmZzZy0+YnVmZmhkc1tpXTsKIAkJaWYgKGJoLT5pbnJlcV9idXN5KQogCQkJdXNiX2VwX2RlcXVldWUoZnNnLT5idWxrX2luLCBiaC0+aW5yZXEpOwpAQCAtMzQwMyw3ICsyOTMwLDcgQEAKIAkvKiBXYWl0IHVudGlsIGV2ZXJ5dGhpbmcgaXMgaWRsZSAqLwogCWZvciAoOzspIHsKIAkJbnVtX2FjdGl2ZSA9IGZzZy0+aW50cmVxX2J1c3k7Ci0JCWZvciAoaSA9IDA7IGkgPCBOVU1fQlVGRkVSUzsgKytpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBGU0dfTlVNX0JVRkZFUlM7ICsraSkgewogCQkJYmggPSAmZnNnLT5idWZmaGRzW2ldOwogCQkJbnVtX2FjdGl2ZSArPSBiaC0+aW5yZXFfYnVzeSArIGJoLT5vdXRyZXFfYnVzeTsKIAkJfQpAQCAtMzQyNSw3ICsyOTUyLDcgQEAKIAkgKiBzdGF0ZSwgYW5kIHRoZSBleGNlcHRpb24uICBUaGVuIGludm9rZSB0aGUgaGFuZGxlci4gKi8KIAlzcGluX2xvY2tfaXJxKCZmc2ctPmxvY2spOwogCi0JZm9yIChpID0gMDsgaSA8IE5VTV9CVUZGRVJTOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgRlNHX05VTV9CVUZGRVJTOyArK2kpIHsKIAkJYmggPSAmZnNnLT5idWZmaGRzW2ldOwogCQliaC0+c3RhdGUgPSBCVUZfU1RBVEVfRU1QVFk7CiAJfQpAQCAtMzUwNiw3ICszMDMzLDggQEAKIAkJYnJlYWs7CiAKIAljYXNlIEZTR19TVEFURV9ESVNDT05ORUNUOgotCQlmc3luY19hbGwoZnNnKTsKKwkJZm9yIChpID0gMDsgaSA8IGZzZy0+bmx1bnM7ICsraSkKKwkJCWZzZ19sdW5fZnN5bmNfc3ViKGZzZy0+bHVucyArIGkpOwogCQlkb19zZXRfY29uZmlnKGZzZywgMCk7CQkvLyBVbmNvbmZpZ3VyZWQgc3RhdGUKIAkJYnJlYWs7CiAKQEAgLTM1OTUsMjAxICszMTIzLDEwIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLS8qIElmIHRoZSBuZXh0IHR3byByb3V0aW5lcyBhcmUgY2FsbGVkIHdoaWxlIHRoZSBnYWRnZXQgaXMgcmVnaXN0ZXJlZCwKLSAqIHRoZSBjYWxsZXIgbXVzdCBvd24gZnNnLT5maWxlc2VtIGZvciB3cml0aW5nLiAqLwotCi1zdGF0aWMgaW50IG9wZW5fYmFja2luZ19maWxlKHN0cnVjdCBsdW4gKmN1cmx1biwgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0JaW50CQkJCXJvOwotCXN0cnVjdCBmaWxlCQkJKmZpbHAgPSBOVUxMOwotCWludAkJCQlyYyA9IC1FSU5WQUw7Ci0Jc3RydWN0IGlub2RlCQkJKmlub2RlID0gTlVMTDsKLQlsb2ZmX3QJCQkJc2l6ZTsKLQlsb2ZmX3QJCQkJbnVtX3NlY3RvcnM7Ci0JbG9mZl90CQkJCW1pbl9zZWN0b3JzOwotCi0JLyogUi9XIGlmIHdlIGNhbiwgUi9PIGlmIHdlIG11c3QgKi8KLQlybyA9IGN1cmx1bi0+cm87Ci0JaWYgKCFybykgewotCQlmaWxwID0gZmlscF9vcGVuKGZpbGVuYW1lLCBPX1JEV1IgfCBPX0xBUkdFRklMRSwgMCk7Ci0JCWlmICgtRVJPRlMgPT0gUFRSX0VSUihmaWxwKSkKLQkJCXJvID0gMTsKLQl9Ci0JaWYgKHJvKQotCQlmaWxwID0gZmlscF9vcGVuKGZpbGVuYW1lLCBPX1JET05MWSB8IE9fTEFSR0VGSUxFLCAwKTsKLQlpZiAoSVNfRVJSKGZpbHApKSB7Ci0JCUxJTkZPKGN1cmx1biwgInVuYWJsZSB0byBvcGVuIGJhY2tpbmcgZmlsZTogJXNcbiIsIGZpbGVuYW1lKTsKLQkJcmV0dXJuIFBUUl9FUlIoZmlscCk7Ci0JfQotCi0JaWYgKCEoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQotCQlybyA9IDE7Ci0KLQlpZiAoZmlscC0+Zl9wYXRoLmRlbnRyeSkKLQkJaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwotCWlmIChpbm9kZSAmJiBTX0lTQkxLKGlub2RlLT5pX21vZGUpKSB7Ci0JCWlmIChiZGV2X3JlYWRfb25seShpbm9kZS0+aV9iZGV2KSkKLQkJCXJvID0gMTsKLQl9IGVsc2UgaWYgKCFpbm9kZSB8fCAhU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewotCQlMSU5GTyhjdXJsdW4sICJpbnZhbGlkIGZpbGUgdHlwZTogJXNcbiIsIGZpbGVuYW1lKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogSWYgd2UgY2FuJ3QgcmVhZCB0aGUgZmlsZSwgaXQncyBubyBnb29kLgotCSAqIElmIHdlIGNhbid0IHdyaXRlIHRoZSBmaWxlLCB1c2UgaXQgcmVhZC1vbmx5LiAqLwotCWlmICghZmlscC0+Zl9vcCB8fCAhKGZpbHAtPmZfb3AtPnJlYWQgfHwgZmlscC0+Zl9vcC0+YWlvX3JlYWQpKSB7Ci0JCUxJTkZPKGN1cmx1biwgImZpbGUgbm90IHJlYWRhYmxlOiAlc1xuIiwgZmlsZW5hbWUpOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKCEoZmlscC0+Zl9vcC0+d3JpdGUgfHwgZmlscC0+Zl9vcC0+YWlvX3dyaXRlKSkKLQkJcm8gPSAxOwotCi0Jc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlLT5pX21hcHBpbmctPmhvc3QpOwotCWlmIChzaXplIDwgMCkgewotCQlMSU5GTyhjdXJsdW4sICJ1bmFibGUgdG8gZmluZCBmaWxlIHNpemU6ICVzXG4iLCBmaWxlbmFtZSk7Ci0JCXJjID0gKGludCkgc2l6ZTsKLQkJZ290byBvdXQ7Ci0JfQotCW51bV9zZWN0b3JzID0gc2l6ZSA+PiA5OwkvLyBGaWxlIHNpemUgaW4gNTEyLWJ5dGUgYmxvY2tzCi0JbWluX3NlY3RvcnMgPSAxOwotCWlmIChtb2RfZGF0YS5jZHJvbSkgewotCQludW1fc2VjdG9ycyAmPSB+MzsJLy8gUmVkdWNlIHRvIGEgbXVsdGlwbGUgb2YgMjA0OAotCQltaW5fc2VjdG9ycyA9IDMwMCo0OwkvLyBTbWFsbGVzdCB0cmFjayBpcyAzMDAgZnJhbWVzCi0JCWlmIChudW1fc2VjdG9ycyA+PSAyNTYqNjAqNzUqNCkgewotCQkJbnVtX3NlY3RvcnMgPSAoMjU2KjYwKjc1IC0gMSkgKiA0OwotCQkJTElORk8oY3VybHVuLCAiZmlsZSB0b28gYmlnOiAlc1xuIiwgZmlsZW5hbWUpOwotCQkJTElORk8oY3VybHVuLCAidXNpbmcgb25seSBmaXJzdCAlZCBibG9ja3NcbiIsCi0JCQkJCShpbnQpIG51bV9zZWN0b3JzKTsKLQkJfQotCX0KLQlpZiAobnVtX3NlY3RvcnMgPCBtaW5fc2VjdG9ycykgewotCQlMSU5GTyhjdXJsdW4sICJmaWxlIHRvbyBzbWFsbDogJXNcbiIsIGZpbGVuYW1lKTsKLQkJcmMgPSAtRVRPT1NNQUxMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlnZXRfZmlsZShmaWxwKTsKLQljdXJsdW4tPnJvID0gcm87Ci0JY3VybHVuLT5maWxwID0gZmlscDsKLQljdXJsdW4tPmZpbGVfbGVuZ3RoID0gc2l6ZTsKLQljdXJsdW4tPm51bV9zZWN0b3JzID0gbnVtX3NlY3RvcnM7Ci0JTERCRyhjdXJsdW4sICJvcGVuIGJhY2tpbmcgZmlsZTogJXNcbiIsIGZpbGVuYW1lKTsKLQlyYyA9IDA7Ci0KLW91dDoKLQlmaWxwX2Nsb3NlKGZpbHAsIGN1cnJlbnQtPmZpbGVzKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLQotc3RhdGljIHZvaWQgY2xvc2VfYmFja2luZ19maWxlKHN0cnVjdCBsdW4gKmN1cmx1bikKLXsKLQlpZiAoY3VybHVuLT5maWxwKSB7Ci0JCUxEQkcoY3VybHVuLCAiY2xvc2UgYmFja2luZyBmaWxlXG4iKTsKLQkJZnB1dChjdXJsdW4tPmZpbHApOwotCQljdXJsdW4tPmZpbHAgPSBOVUxMOwotCX0KLX0KLQotCi1zdGF0aWMgc3NpemVfdCBzaG93X3JvKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgbHVuCSpjdXJsdW4gPSBkZXZfdG9fbHVuKGRldik7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY3VybHVuLT5ybyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfZmlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IGx1bgkqY3VybHVuID0gZGV2X3RvX2x1bihkZXYpOwotCXN0cnVjdCBmc2dfZGV2CSpmc2cgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQljaGFyCQkqcDsKLQlzc2l6ZV90CQlyYzsKLQotCWRvd25fcmVhZCgmZnNnLT5maWxlc2VtKTsKLQlpZiAoYmFja2luZ19maWxlX2lzX29wZW4oY3VybHVuKSkgewkvLyBHZXQgdGhlIGNvbXBsZXRlIHBhdGhuYW1lCi0JCXAgPSBkX3BhdGgoJmN1cmx1bi0+ZmlscC0+Zl9wYXRoLCBidWYsIFBBR0VfU0laRSAtIDEpOwotCQlpZiAoSVNfRVJSKHApKQotCQkJcmMgPSBQVFJfRVJSKHApOwotCQllbHNlIHsKLQkJCXJjID0gc3RybGVuKHApOwotCQkJbWVtbW92ZShidWYsIHAsIHJjKTsKLQkJCWJ1ZltyY10gPSAnXG4nOwkJLy8gQWRkIGEgbmV3bGluZQotCQkJYnVmWysrcmNdID0gMDsKLQkJfQotCX0gZWxzZSB7CQkJCS8vIE5vIGZpbGUsIHJldHVybiAwIGJ5dGVzCi0JCSpidWYgPSAwOwotCQlyYyA9IDA7Ci0JfQotCXVwX3JlYWQoJmZzZy0+ZmlsZXNlbSk7Ci0JcmV0dXJuIHJjOwotfQotCi0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX3JvKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXNzaXplX3QJCXJjID0gY291bnQ7Ci0Jc3RydWN0IGx1bgkqY3VybHVuID0gZGV2X3RvX2x1bihkZXYpOwotCXN0cnVjdCBmc2dfZGV2CSpmc2cgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQJCWk7Ci0KLQlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJmkpICE9IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogQWxsb3cgdGhlIHdyaXRlLWVuYWJsZSBzdGF0dXMgdG8gY2hhbmdlIG9ubHkgd2hpbGUgdGhlIGJhY2tpbmcgZmlsZQotCSAqIGlzIGNsb3NlZC4gKi8KLQlkb3duX3JlYWQoJmZzZy0+ZmlsZXNlbSk7Ci0JaWYgKGJhY2tpbmdfZmlsZV9pc19vcGVuKGN1cmx1bikpIHsKLQkJTERCRyhjdXJsdW4sICJyZWFkLW9ubHkgc3RhdHVzIGNoYW5nZSBwcmV2ZW50ZWRcbiIpOwotCQlyYyA9IC1FQlVTWTsKLQl9IGVsc2UgewotCQljdXJsdW4tPnJvID0gISFpOwotCQlMREJHKGN1cmx1biwgInJlYWQtb25seSBzdGF0dXMgc2V0IHRvICVkXG4iLCBjdXJsdW4tPnJvKTsKLQl9Ci0JdXBfcmVhZCgmZnNnLT5maWxlc2VtKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2ZpbGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGx1bgkqY3VybHVuID0gZGV2X3RvX2x1bihkZXYpOwotCXN0cnVjdCBmc2dfZGV2CSpmc2cgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQJCXJjID0gMDsKLQotCWlmIChjdXJsdW4tPnByZXZlbnRfbWVkaXVtX3JlbW92YWwgJiYgYmFja2luZ19maWxlX2lzX29wZW4oY3VybHVuKSkgewotCQlMREJHKGN1cmx1biwgImVqZWN0IGF0dGVtcHQgcHJldmVudGVkXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsJCQkJLy8gIkRvb3IgaXMgbG9ja2VkIgotCX0KLQotCS8qIFJlbW92ZSBhIHRyYWlsaW5nIG5ld2xpbmUgKi8KLQlpZiAoY291bnQgPiAwICYmIGJ1Zltjb3VudC0xXSA9PSAnXG4nKQotCQkoKGNoYXIgKikgYnVmKVtjb3VudC0xXSA9IDA7CQkvLyBVZ2ghCi0KLQkvKiBFamVjdCBjdXJyZW50IG1lZGl1bSAqLwotCWRvd25fd3JpdGUoJmZzZy0+ZmlsZXNlbSk7Ci0JaWYgKGJhY2tpbmdfZmlsZV9pc19vcGVuKGN1cmx1bikpIHsKLQkJY2xvc2VfYmFja2luZ19maWxlKGN1cmx1bik7Ci0JCWN1cmx1bi0+dW5pdF9hdHRlbnRpb25fZGF0YSA9IFNTX01FRElVTV9OT1RfUFJFU0VOVDsKLQl9Ci0KLQkvKiBMb2FkIG5ldyBtZWRpdW0gKi8KLQlpZiAoY291bnQgPiAwICYmIGJ1ZlswXSkgewotCQlyYyA9IG9wZW5fYmFja2luZ19maWxlKGN1cmx1biwgYnVmKTsKLQkJaWYgKHJjID09IDApCi0JCQljdXJsdW4tPnVuaXRfYXR0ZW50aW9uX2RhdGEgPQotCQkJCQlTU19OT1RfUkVBRFlfVE9fUkVBRFlfVFJBTlNJVElPTjsKLQl9Ci0JdXBfd3JpdGUoJmZzZy0+ZmlsZXNlbSk7Ci0JcmV0dXJuIChyYyA8IDAgPyByYyA6IGNvdW50KTsKLX0KLQogCiAvKiBUaGUgd3JpdGUgcGVybWlzc2lvbnMgYW5kIHN0b3JlX3h4eCBwb2ludGVycyBhcmUgc2V0IGluIGZzZ19iaW5kKCkgKi8KLXN0YXRpYyBERVZJQ0VfQVRUUihybywgMDQ0NCwgc2hvd19ybywgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZmlsZSwgMDQ0NCwgc2hvd19maWxlLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihybywgMDQ0NCwgZnNnX3Nob3dfcm8sIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGZpbGUsIDA0NDQsIGZzZ19zaG93X2ZpbGUsIE5VTEwpOwogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0zODA0LDcgKzMxNDEsOSBAQAogCiBzdGF0aWMgdm9pZCBsdW5fcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGZzZ19kZXYJKmZzZyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCByd19zZW1hcGhvcmUJKmZpbGVzZW0gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgZnNnX2RldgkJKmZzZyA9CisJCWNvbnRhaW5lcl9vZihmaWxlc2VtLCBzdHJ1Y3QgZnNnX2RldiwgZmlsZXNlbSk7CiAKIAlrcmVmX3B1dCgmZnNnLT5yZWYsIGZzZ19yZWxlYXNlKTsKIH0KQEAgLTM4MTMsNyArMzE1Miw3IEBACiB7CiAJc3RydWN0IGZzZ19kZXYJCSpmc2cgPSBnZXRfZ2FkZ2V0X2RhdGEoZ2FkZ2V0KTsKIAlpbnQJCQlpOwotCXN0cnVjdCBsdW4JCSpjdXJsdW47CisJc3RydWN0IGZzZ19sdW4JCSpjdXJsdW47CiAJc3RydWN0IHVzYl9yZXF1ZXN0CSpyZXEgPSBmc2ctPmVwMHJlcTsKIAogCURCRyhmc2csICJ1bmJpbmRcbiIpOwpAQCAtMzgyNSw3ICszMTY0LDcgQEAKIAkJaWYgKGN1cmx1bi0+cmVnaXN0ZXJlZCkgewogCQkJZGV2aWNlX3JlbW92ZV9maWxlKCZjdXJsdW4tPmRldiwgJmRldl9hdHRyX3JvKTsKIAkJCWRldmljZV9yZW1vdmVfZmlsZSgmY3VybHVuLT5kZXYsICZkZXZfYXR0cl9maWxlKTsKLQkJCWNsb3NlX2JhY2tpbmdfZmlsZShjdXJsdW4pOworCQkJZnNnX2x1bl9jbG9zZShjdXJsdW4pOwogCQkJZGV2aWNlX3VucmVnaXN0ZXIoJmN1cmx1bi0+ZGV2KTsKIAkJCWN1cmx1bi0+cmVnaXN0ZXJlZCA9IDA7CiAJCX0KQEAgLTM4NDEsNyArMzE4MCw3IEBACiAJfQogCiAJLyogRnJlZSB0aGUgZGF0YSBidWZmZXJzICovCi0JZm9yIChpID0gMDsgaSA8IE5VTV9CVUZGRVJTOyArK2kpCisJZm9yIChpID0gMDsgaSA8IEZTR19OVU1fQlVGRkVSUzsgKytpKQogCQlrZnJlZShmc2ctPmJ1ZmZoZHNbaV0uYnVmKTsKIAogCS8qIEZyZWUgdGhlIHJlcXVlc3QgYW5kIGJ1ZmZlciBmb3IgZW5kcG9pbnQgMCAqLwpAQCAtMzk0OCw3ICszMjg3LDcgQEAKIAlzdHJ1Y3QgZnNnX2RldgkJKmZzZyA9IHRoZV9mc2c7CiAJaW50CQkJcmM7CiAJaW50CQkJaTsKLQlzdHJ1Y3QgbHVuCQkqY3VybHVuOworCXN0cnVjdCBmc2dfbHVuCQkqY3VybHVuOwogCXN0cnVjdCB1c2JfZXAJCSplcDsKIAlzdHJ1Y3QgdXNiX3JlcXVlc3QJKnJlcTsKIAljaGFyCQkJKnBhdGhidWYsICpwOwpAQCAtMzk2MywxMCArMzMwMiwxMCBAQAogCiAJaWYgKG1vZF9kYXRhLnJlbW92YWJsZSkgewkvLyBFbmFibGUgdGhlIHN0b3JlX3h4eCBhdHRyaWJ1dGVzCiAJCWRldl9hdHRyX2ZpbGUuYXR0ci5tb2RlID0gMDY0NDsKLQkJZGV2X2F0dHJfZmlsZS5zdG9yZSA9IHN0b3JlX2ZpbGU7CisJCWRldl9hdHRyX2ZpbGUuc3RvcmUgPSBmc2dfc3RvcmVfZmlsZTsKIAkJaWYgKCFtb2RfZGF0YS5jZHJvbSkgewogCQkJZGV2X2F0dHJfcm8uYXR0ci5tb2RlID0gMDY0NDsKLQkJCWRldl9hdHRyX3JvLnN0b3JlID0gc3RvcmVfcm87CisJCQlkZXZfYXR0cl9yby5zdG9yZSA9IGZzZ19zdG9yZV9ybzsKIAkJfQogCX0KIApAQCAtMzk3NCw3ICszMzEzLDcgQEAKIAlpID0gbW9kX2RhdGEubmx1bnM7CiAJaWYgKGkgPT0gMCkKIAkJaSA9IG1heChtb2RfZGF0YS5udW1fZmlsZW5hbWVzLCAxdSk7Ci0JaWYgKGkgPiBNQVhfTFVOUykgeworCWlmIChpID4gRlNHX01BWF9MVU5TKSB7CiAJCUVSUk9SKGZzZywgImludmFsaWQgbnVtYmVyIG9mIExVTnM6ICVkXG4iLCBpKTsKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKQEAgLTM5ODIsNyArMzMyMSw3IEBACiAKIAkvKiBDcmVhdGUgdGhlIExVTnMsIG9wZW4gdGhlaXIgYmFja2luZyBmaWxlcywgYW5kIHJlZ2lzdGVyIHRoZQogCSAqIExVTiBkZXZpY2VzIGluIHN5c2ZzLiAqLwotCWZzZy0+bHVucyA9IGt6YWxsb2MoaSAqIHNpemVvZihzdHJ1Y3QgbHVuKSwgR0ZQX0tFUk5FTCk7CisJZnNnLT5sdW5zID0ga3phbGxvYyhpICogc2l6ZW9mKHN0cnVjdCBmc2dfbHVuKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmc2ctPmx1bnMpIHsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKQEAgLTM5OTEsMTMgKzMzMzAsMTQgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBmc2ctPm5sdW5zOyArK2kpIHsKIAkJY3VybHVuID0gJmZzZy0+bHVuc1tpXTsKLQkJY3VybHVuLT5ybyA9IG1vZF9kYXRhLnJvW2ldOwotCQlpZiAobW9kX2RhdGEuY2Ryb20pCi0JCQljdXJsdW4tPnJvID0gMTsKKwkJY3VybHVuLT5jZHJvbSA9ICEhbW9kX2RhdGEuY2Ryb207CisJCWN1cmx1bi0+cm8gPSBtb2RfZGF0YS5jZHJvbSB8fCBtb2RfZGF0YS5yb1tpXTsKKwkJY3VybHVuLT5pbml0aWFsbHlfcm8gPSBjdXJsdW4tPnJvOworCQljdXJsdW4tPnJlbW92YWJsZSA9IG1vZF9kYXRhLnJlbW92YWJsZTsKIAkJY3VybHVuLT5kZXYucmVsZWFzZSA9IGx1bl9yZWxlYXNlOwogCQljdXJsdW4tPmRldi5wYXJlbnQgPSAmZ2FkZ2V0LT5kZXY7CiAJCWN1cmx1bi0+ZGV2LmRyaXZlciA9ICZmc2dfZHJpdmVyLmRyaXZlcjsKLQkJZGV2X3NldF9kcnZkYXRhKCZjdXJsdW4tPmRldiwgZnNnKTsKKwkJZGV2X3NldF9kcnZkYXRhKCZjdXJsdW4tPmRldiwgJmZzZy0+ZmlsZXNlbSk7CiAJCWRldl9zZXRfbmFtZSgmY3VybHVuLT5kZXYsIiVzLWx1biVkIiwKIAkJCSAgICAgZGV2X25hbWUoJmdhZGdldC0+ZGV2KSwgaSk7CiAKQEAgLTQwMTYsNyArMzM1Niw3IEBACiAJCWtyZWZfZ2V0KCZmc2ctPnJlZik7CiAKIAkJaWYgKG1vZF9kYXRhLmZpbGVbaV0gJiYgKm1vZF9kYXRhLmZpbGVbaV0pIHsKLQkJCWlmICgocmMgPSBvcGVuX2JhY2tpbmdfZmlsZShjdXJsdW4sCisJCQlpZiAoKHJjID0gZnNnX2x1bl9vcGVuKGN1cmx1biwKIAkJCQkJbW9kX2RhdGEuZmlsZVtpXSkpICE9IDApCiAJCQkJZ290byBvdXQ7CiAJCX0gZWxzZSBpZiAoIW1vZF9kYXRhLnJlbW92YWJsZSkgewpAQCAtNDAyOCwyMCArMzM2OCwyMCBAQAogCiAJLyogRmluZCBhbGwgdGhlIGVuZHBvaW50cyB3ZSB3aWxsIHVzZSAqLwogCXVzYl9lcF9hdXRvY29uZmlnX3Jlc2V0KGdhZGdldCk7Ci0JZXAgPSB1c2JfZXBfYXV0b2NvbmZpZyhnYWRnZXQsICZmc19idWxrX2luX2Rlc2MpOworCWVwID0gdXNiX2VwX2F1dG9jb25maWcoZ2FkZ2V0LCAmZnNnX2ZzX2J1bGtfaW5fZGVzYyk7CiAJaWYgKCFlcCkKIAkJZ290byBhdXRvY29uZl9mYWlsOwogCWVwLT5kcml2ZXJfZGF0YSA9IGZzZzsJCS8vIGNsYWltIHRoZSBlbmRwb2ludAogCWZzZy0+YnVsa19pbiA9IGVwOwogCi0JZXAgPSB1c2JfZXBfYXV0b2NvbmZpZyhnYWRnZXQsICZmc19idWxrX291dF9kZXNjKTsKKwllcCA9IHVzYl9lcF9hdXRvY29uZmlnKGdhZGdldCwgJmZzZ19mc19idWxrX291dF9kZXNjKTsKIAlpZiAoIWVwKQogCQlnb3RvIGF1dG9jb25mX2ZhaWw7CiAJZXAtPmRyaXZlcl9kYXRhID0gZnNnOwkJLy8gY2xhaW0gdGhlIGVuZHBvaW50CiAJZnNnLT5idWxrX291dCA9IGVwOwogCiAJaWYgKHRyYW5zcG9ydF9pc19jYmkoKSkgewotCQllcCA9IHVzYl9lcF9hdXRvY29uZmlnKGdhZGdldCwgJmZzX2ludHJfaW5fZGVzYyk7CisJCWVwID0gdXNiX2VwX2F1dG9jb25maWcoZ2FkZ2V0LCAmZnNnX2ZzX2ludHJfaW5fZGVzYyk7CiAJCWlmICghZXApCiAJCQlnb3RvIGF1dG9jb25mX2ZhaWw7CiAJCWVwLT5kcml2ZXJfZGF0YSA9IGZzZzsJCS8vIGNsYWltIHRoZSBlbmRwb2ludApAQCAtNDA1NSwyOCArMzM5NSwyOCBAQAogCWRldmljZV9kZXNjLmJjZERldmljZSA9IGNwdV90b19sZTE2KG1vZF9kYXRhLnJlbGVhc2UpOwogCiAJaSA9ICh0cmFuc3BvcnRfaXNfY2JpKCkgPyAzIDogMik7CS8vIE51bWJlciBvZiBlbmRwb2ludHMKLQlpbnRmX2Rlc2MuYk51bUVuZHBvaW50cyA9IGk7Ci0JaW50Zl9kZXNjLmJJbnRlcmZhY2VTdWJDbGFzcyA9IG1vZF9kYXRhLnByb3RvY29sX3R5cGU7Ci0JaW50Zl9kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCA9IG1vZF9kYXRhLnRyYW5zcG9ydF90eXBlOwotCWZzX2Z1bmN0aW9uW2kgKyBGU19GVU5DVElPTl9QUkVfRVBfRU5UUklFU10gPSBOVUxMOworCWZzZ19pbnRmX2Rlc2MuYk51bUVuZHBvaW50cyA9IGk7CisJZnNnX2ludGZfZGVzYy5iSW50ZXJmYWNlU3ViQ2xhc3MgPSBtb2RfZGF0YS5wcm90b2NvbF90eXBlOworCWZzZ19pbnRmX2Rlc2MuYkludGVyZmFjZVByb3RvY29sID0gbW9kX2RhdGEudHJhbnNwb3J0X3R5cGU7CisJZnNnX2ZzX2Z1bmN0aW9uW2kgKyBGU0dfRlNfRlVOQ1RJT05fUFJFX0VQX0VOVFJJRVNdID0gTlVMTDsKIAogCWlmIChnYWRnZXRfaXNfZHVhbHNwZWVkKGdhZGdldCkpIHsKLQkJaHNfZnVuY3Rpb25baSArIEhTX0ZVTkNUSU9OX1BSRV9FUF9FTlRSSUVTXSA9IE5VTEw7CisJCWZzZ19oc19mdW5jdGlvbltpICsgRlNHX0hTX0ZVTkNUSU9OX1BSRV9FUF9FTlRSSUVTXSA9IE5VTEw7CiAKIAkJLyogQXNzdW1lIGVwMCB1c2VzIHRoZSBzYW1lIG1heHBhY2tldCB2YWx1ZSBmb3IgYm90aCBzcGVlZHMgKi8KIAkJZGV2X3F1YWxpZmllci5iTWF4UGFja2V0U2l6ZTAgPSBmc2ctPmVwMC0+bWF4cGFja2V0OwogCiAJCS8qIEFzc3VtZSBlbmRwb2ludCBhZGRyZXNzZXMgYXJlIHRoZSBzYW1lIGZvciBib3RoIHNwZWVkcyAqLwotCQloc19idWxrX2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9Ci0JCQkJZnNfYnVsa19pbl9kZXNjLmJFbmRwb2ludEFkZHJlc3M7Ci0JCWhzX2J1bGtfb3V0X2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9Ci0JCQkJZnNfYnVsa19vdXRfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOwotCQloc19pbnRyX2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9Ci0JCQkJZnNfaW50cl9pbl9kZXNjLmJFbmRwb2ludEFkZHJlc3M7CisJCWZzZ19oc19idWxrX2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9CisJCQlmc2dfZnNfYnVsa19pbl9kZXNjLmJFbmRwb2ludEFkZHJlc3M7CisJCWZzZ19oc19idWxrX291dF9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQorCQkJZnNnX2ZzX2J1bGtfb3V0X2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKKwkJZnNnX2hzX2ludHJfaW5fZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0KKwkJCWZzZ19mc19pbnRyX2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKIAl9CiAKIAlpZiAoZ2FkZ2V0X2lzX290ZyhnYWRnZXQpKQotCQlvdGdfZGVzYy5ibUF0dHJpYnV0ZXMgfD0gVVNCX09UR19ITlA7CisJCWZzZ19vdGdfZGVzYy5ibUF0dHJpYnV0ZXMgfD0gVVNCX09UR19ITlA7CiAKIAlyYyA9IC1FTk9NRU07CiAKQEAgLTQwOTAsNyArMzQzMCw3IEBACiAJcmVxLT5jb21wbGV0ZSA9IGVwMF9jb21wbGV0ZTsKIAogCS8qIEFsbG9jYXRlIHRoZSBkYXRhIGJ1ZmZlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0JVRkZFUlM7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBGU0dfTlVNX0JVRkZFUlM7ICsraSkgewogCQlzdHJ1Y3QgZnNnX2J1ZmZoZAkqYmggPSAmZnNnLT5idWZmaGRzW2ldOwogCiAJCS8qIEFsbG9jYXRlIGZvciB0aGUgYnVsay1pbiBlbmRwb2ludC4gIFdlIGFzc3VtZSB0aGF0CkBAIC00MTAxLDIzICszNDQxLDI0IEBACiAJCQlnb3RvIG91dDsKIAkJYmgtPm5leHQgPSBiaCArIDE7CiAJfQotCWZzZy0+YnVmZmhkc1tOVU1fQlVGRkVSUyAtIDFdLm5leHQgPSAmZnNnLT5idWZmaGRzWzBdOworCWZzZy0+YnVmZmhkc1tGU0dfTlVNX0JVRkZFUlMgLSAxXS5uZXh0ID0gJmZzZy0+YnVmZmhkc1swXTsKIAogCS8qIFRoaXMgc2hvdWxkIHJlZmxlY3QgdGhlIGFjdHVhbCBnYWRnZXQgcG93ZXIgc291cmNlICovCiAJdXNiX2dhZGdldF9zZXRfc2VsZnBvd2VyZWQoZ2FkZ2V0KTsKIAotCXNucHJpbnRmKG1hbnVmYWN0dXJlciwgc2l6ZW9mIG1hbnVmYWN0dXJlciwgIiVzICVzIHdpdGggJXMiLAorCXNucHJpbnRmKGZzZ19zdHJpbmdfbWFudWZhY3R1cmVyLCBzaXplb2YgZnNnX3N0cmluZ19tYW51ZmFjdHVyZXIsCisJCQkiJXMgJXMgd2l0aCAlcyIsCiAJCQlpbml0X3V0c25hbWUoKS0+c3lzbmFtZSwgaW5pdF91dHNuYW1lKCktPnJlbGVhc2UsCiAJCQlnYWRnZXQtPm5hbWUpOwogCiAJLyogT24gYSByZWFsIGRldmljZSwgc2VyaWFsW10gd291bGQgYmUgbG9hZGVkIGZyb20gcGVybWFuZW50CiAJICogc3RvcmFnZS4gIFdlIGp1c3QgZW5jb2RlIGl0IGZyb20gdGhlIGRyaXZlciB2ZXJzaW9uIHN0cmluZy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNlcmlhbCkgLSAyOyBpICs9IDIpIHsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIGZzZ19zdHJpbmdfc2VyaWFsIC0gMjsgaSArPSAyKSB7CiAJCXVuc2lnbmVkIGNoYXIJCWMgPSBEUklWRVJfVkVSU0lPTltpIC8gMl07CiAKIAkJaWYgKCFjKQogCQkJYnJlYWs7Ci0JCXNwcmludGYoJnNlcmlhbFtpXSwgIiUwMlgiLCBjKTsKKwkJc3ByaW50ZigmZnNnX3N0cmluZ19zZXJpYWxbaV0sICIlMDJYIiwgYyk7CiAJfQogCiAJZnNnLT50aHJlYWRfdGFzayA9IGt0aHJlYWRfY3JlYXRlKGZzZ19tYWluX3RocmVhZCwgZnNnLApAQCAtNDEzMyw3ICszNDc0LDcgQEAKIAlwYXRoYnVmID0ga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTCk7CiAJZm9yIChpID0gMDsgaSA8IGZzZy0+bmx1bnM7ICsraSkgewogCQljdXJsdW4gPSAmZnNnLT5sdW5zW2ldOwotCQlpZiAoYmFja2luZ19maWxlX2lzX29wZW4oY3VybHVuKSkgeworCQlpZiAoZnNnX2x1bl9pc19vcGVuKGN1cmx1bikpIHsKIAkJCXAgPSBOVUxMOwogCQkJaWYgKHBhdGhidWYpIHsKIAkJCQlwID0gZF9wYXRoKCZjdXJsdW4tPmZpbHAtPmZfcGF0aCwKQEAgLTQyMDMsNyArMzU0NCw3IEBACiAjZWxzZQogCS5zcGVlZAkJPSBVU0JfU1BFRURfRlVMTCwKICNlbmRpZgotCS5mdW5jdGlvbgk9IChjaGFyICopIGxvbmduYW1lLAorCS5mdW5jdGlvbgk9IChjaGFyICopIGZzZ19zdHJpbmdfcHJvZHVjdCwKIAkuYmluZAkJPSBmc2dfYmluZCwKIAkudW5iaW5kCQk9IGZzZ191bmJpbmQsCiAJLmRpc2Nvbm5lY3QJPSBmc2dfZGlzY29ubmVjdCwKQEAgLTQyMTIsNyArMzU1Myw3IEBACiAJLnJlc3VtZQkJPSBmc2dfcmVzdW1lLAogCiAJLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCQk9IChjaGFyICopIHNob3J0bmFtZSwKKwkJLm5hbWUJCT0gRFJJVkVSX05BTUUsCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLy8gLnJlbGVhc2UgPSAuLi4KIAkJLy8gLnN1c3BlbmQgPSAuLi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9tYXNzX3N0b3JhZ2UuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9tYXNzX3N0b3JhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTYxOWZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L21hc3Nfc3RvcmFnZS5jCkBAIC0wLDAgKzEsMjQwIEBACisvKgorICogbWFzc19zdG9yYWdlLmMgLS0gTWFzcyBTdG9yYWdlIFVTQiBHYWRnZXQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBBbGFuIFN0ZXJuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcworICogICAgICAgICAgICAgICAgICAgIEF1dGhvcjogTWljaGFsIE5hemFyZXdpY3ogPG0ubmF6YXJld2ljekBzYW1zdW5nLmNvbT4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKworLyoKKyAqIFRoZSBNYXNzIFN0b3JhZ2UgR2FkZ2V0IGFjdHMgYXMgYSBVU0IgTWFzcyBTdG9yYWdlIGRldmljZSwKKyAqIGFwcGVhcmluZyB0byB0aGUgaG9zdCBhcyBhIGRpc2sgZHJpdmUgb3IgYXMgYSBDRC1ST00gZHJpdmUuICBJbgorICogYWRkaXRpb24gdG8gcHJvdmlkaW5nIGFuIGV4YW1wbGUgb2YgYSBnZW51aW5lbHkgdXNlZnVsIGdhZGdldAorICogZHJpdmVyIGZvciBhIFVTQiBkZXZpY2UsIGl0IGFsc28gaWxsdXN0cmF0ZXMgYSB0ZWNobmlxdWUgb2YKKyAqIGRvdWJsZS1idWZmZXJpbmcgZm9yIGluY3JlYXNlZCB0aHJvdWdocHV0LiAgTGFzdCBidXQgbm90IGxlYXN0LCBpdAorICogZ2l2ZXMgYW4gZWFzeSB3YXkgdG8gcHJvYmUgdGhlIGJlaGF2aW9yIG9mIHRoZSBNYXNzIFN0b3JhZ2UgZHJpdmVycworICogaW4gYSBVU0IgaG9zdC4KKyAqCisgKiBTaW5jZSB0aGlzIGZpbGUgc2VydmVzIG9ubHkgYWRtaW5pc3RyYXRpdmUgcHVycG9zZXMgYW5kIGFsbCB0aGUKKyAqIGJ1c2luZXNzIGxvZ2ljIGlzIGltcGxlbWVudGVkIGluIGZfbWFzc19zdG9yYWdlLiogZmlsZS4gIFJlYWQKKyAqIGNvbW1lbnRzIGluIHRoaXMgZmlsZSBmb3IgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbi4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgRFJJVkVSX0RFU0MJCSJNYXNzIFN0b3JhZ2UgR2FkZ2V0IgorI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJIjIwMDkvMDkvMTEiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBrYnVpbGQgaXMgbm90IHZlcnkgY29vcGVyYXRpdmUgd2l0aCByZXNwZWN0IHRvIGxpbmtpbmcgc2VwYXJhdGVseQorICogY29tcGlsZWQgbGlicmFyeSBvYmplY3RzIGludG8gb25lIG1vZHVsZS4gIFNvIGZvciBub3cgd2Ugd29uJ3QgdXNlCisgKiBzZXBhcmF0ZSBjb21waWxhdGlvbiAuLi4gZW5zdXJpbmcgaW5pdC9leGl0IHNlY3Rpb25zIHdvcmsgdG8gc2hyaW5rCisgKiB0aGUgcnVudGltZSBmb290cHJpbnQsIGFuZCBnaXZpbmcgdXMgYXQgbGVhc3Qgc29tZSBwYXJ0cyBvZiB3aGF0CisgKiBhICJnY2MgLS1jb21iaW5lIC4uLiBwYXJ0MS5jIHBhcnQyLmMgcGFydDMuYyAuLi4gIiBidWlsZCB3b3VsZC4KKyAqLworCisjaW5jbHVkZSAiY29tcG9zaXRlLmMiCisjaW5jbHVkZSAidXNic3RyaW5nLmMiCisjaW5jbHVkZSAiY29uZmlnLmMiCisjaW5jbHVkZSAiZXBhdXRvY29uZi5jIgorI2luY2x1ZGUgImZfbWFzc19zdG9yYWdlLmMiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yIG1zZ19kZXZpY2VfZGVzYyA9IHsKKwkuYkxlbmd0aCA9CQlzaXplb2YgbXNnX2RldmljZV9kZXNjLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfREVWSUNFLAorCisJLmJjZFVTQiA9CQljcHVfdG9fbGUxNigweDAyMDApLAorCS5iRGV2aWNlQ2xhc3MgPQkJVVNCX0NMQVNTX1BFUl9JTlRFUkZBQ0UsCisKKwkvKiBWZW5kb3IgYW5kIHByb2R1Y3QgaWQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgbW9kdWxlIHBhcmFtZXRlcnMuICAqLworCS5pZFZlbmRvciA9CQljcHVfdG9fbGUxNihGU0dfVkVORE9SX0lEKSwKKwkuaWRQcm9kdWN0ID0JCWNwdV90b19sZTE2KEZTR19QUk9EVUNUX0lEKSwKKwkvKiAuYmNkRGV2aWNlID0gZihoYXJkd2FyZSkgKi8KKwkvKiAuaU1hbnVmYWN0dXJlciA9IERZTkFNSUMgKi8KKwkvKiAuaVByb2R1Y3QgPSBEWU5BTUlDICovCisJLyogTk8gU0VSSUFMIE5VTUJFUiAqLworCS5iTnVtQ29uZmlndXJhdGlvbnMgPQkxLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2Jfb3RnX2Rlc2NyaXB0b3Igb3RnX2Rlc2NyaXB0b3IgPSB7CisJLmJMZW5ndGggPQkJc2l6ZW9mIG90Z19kZXNjcmlwdG9yLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfT1RHLAorCisJLyogUkVWSVNJVCBTUlAtb25seSBoYXJkd2FyZSBpcyBwb3NzaWJsZSwgYWx0aG91Z2gKKwkgKiBpdCB3b3VsZCBub3QgYmUgY2FsbGVkICJPVEciIC4uLgorCSAqLworCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX09UR19TUlAgfCBVU0JfT1RHX0hOUCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICpvdGdfZGVzY1tdID0geworCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZvdGdfZGVzY3JpcHRvciwKKwlOVUxMLAorfTsKKworCisvKiBzdHJpbmcgSURzIGFyZSBhc3NpZ25lZCBkeW5hbWljYWxseSAqLworCisjZGVmaW5lIFNUUklOR19NQU5VRkFDVFVSRVJfSURYCQkwCisjZGVmaW5lIFNUUklOR19QUk9EVUNUX0lEWAkJMQorI2RlZmluZSBTVFJJTkdfQ09ORklHVVJBVElPTl9JRFgJMgorCitzdGF0aWMgY2hhciBtYW51ZmFjdHVyZXJbNTBdOworCitzdGF0aWMgc3RydWN0IHVzYl9zdHJpbmcgc3RyaW5nc19kZXZbXSA9IHsKKwlbU1RSSU5HX01BTlVGQUNUVVJFUl9JRFhdLnMgPSBtYW51ZmFjdHVyZXIsCisJW1NUUklOR19QUk9EVUNUX0lEWF0ucyA9IERSSVZFUl9ERVNDLAorCVtTVFJJTkdfQ09ORklHVVJBVElPTl9JRFhdLnMgPSAiU2VsZiBQb3dlcmVkIiwKKwl7ICB9IC8qIGVuZCBvZiBsaXN0ICovCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9nYWRnZXRfc3RyaW5ncyBzdHJpbmd0YWJfZGV2ID0geworCS5sYW5ndWFnZQk9IDB4MDQwOSwJLyogZW4tdXMgKi8KKwkuc3RyaW5ncwk9IHN0cmluZ3NfZGV2LAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZ2FkZ2V0X3N0cmluZ3MgKmRldl9zdHJpbmdzW10gPSB7CisJJnN0cmluZ3RhYl9kZXYsCisJTlVMTCwKK307CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENvbmZpZ3VyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBmc2dfbW9kdWxlX3BhcmFtZXRlcnMgbW9kX2RhdGEgPSB7CisJLnN0YWxsID0gMQorfTsKK0ZTR19NT0RVTEVfUEFSQU1FVEVSUygvKiBubyBwcmVmaXggKi8sIG1vZF9kYXRhKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbXNnX3JlZ2lzdGVyZWQgPSAwOworc3RhdGljIHZvaWQgbXNnX2NsZWFudXAodm9pZCk7CisKK3N0YXRpYyBpbnQgX19pbml0IG1zZ19kb19jb25maWcoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uICpjKQoreworCXN0cnVjdCBmc2dfY29tbW9uICpjb21tb247CisJc3RydWN0IGZzZ19jb25maWcgY29uZmlnOworCWludCByZXQ7CisKKwlpZiAoZ2FkZ2V0X2lzX290ZyhjLT5jZGV2LT5nYWRnZXQpKSB7CisJCWMtPmRlc2NyaXB0b3JzID0gb3RnX2Rlc2M7CisJCWMtPmJtQXR0cmlidXRlcyB8PSBVU0JfQ09ORklHX0FUVF9XQUtFVVA7CisJfQorCisJZnNnX2NvbmZpZ19mcm9tX3BhcmFtcygmY29uZmlnLCAmbW9kX2RhdGEpOworCWNvbmZpZy50aHJlYWRfZXhpdHMgPSAodm9pZCgqKShzdHJ1Y3QgZnNnX2NvbW1vbiopKSZtc2dfY2xlYW51cDsKKwljb21tb24gPSBmc2dfY29tbW9uX2luaXQoMCwgYy0+Y2RldiwgJmNvbmZpZyk7CisJaWYgKElTX0VSUihjb21tb24pKQorCQlyZXR1cm4gUFRSX0VSUihjb21tb24pOworCisJcmV0ID0gZnNnX2FkZChjLT5jZGV2LCBjLCBjb21tb24pOworCWZzZ19jb21tb25fcHV0KGNvbW1vbik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbiBtc2dfY29uZmlnX2RyaXZlciA9IHsKKwkubGFiZWwJCQk9ICJMaW51eCBGaWxlLUJhY2tlZCBTdG9yYWdlIiwKKwkuYmluZAkJCT0gbXNnX2RvX2NvbmZpZywKKwkuYkNvbmZpZ3VyYXRpb25WYWx1ZQk9IDEsCisJLyogLmlDb25maWd1cmF0aW9uID0gRFlOQU1JQyAqLworCS5ibUF0dHJpYnV0ZXMJCT0gVVNCX0NPTkZJR19BVFRfU0VMRlBPV0VSLAorfTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogR2FkZ2V0IEJpbmQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyBpbnQgX19pbml0IG1zZ19iaW5kKHN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldikKK3sKKwlzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0ID0gY2Rldi0+Z2FkZ2V0OworCWludCBzdGF0dXM7CisKKwkvKiBBbGxvY2F0ZSBzdHJpbmcgZGVzY3JpcHRvciBudW1iZXJzIC4uLiBub3RlIHRoYXQgc3RyaW5nCisJICogY29udGVudHMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGNvbXBvc2l0ZV9kZXYgZ2x1ZS4KKwkgKi8KKworCS8qIGRldmljZSBkZXNjcmlwdG9yIHN0cmluZ3M6IG1hbnVmYWN0dXJlciwgcHJvZHVjdCAqLworCXNucHJpbnRmKG1hbnVmYWN0dXJlciwgc2l6ZW9mIG1hbnVmYWN0dXJlciwgIiVzICVzIHdpdGggJXMiLAorCSAgICAgICAgIGluaXRfdXRzbmFtZSgpLT5zeXNuYW1lLCBpbml0X3V0c25hbWUoKS0+cmVsZWFzZSwKKwkgICAgICAgICBnYWRnZXQtPm5hbWUpOworCXN0YXR1cyA9IHVzYl9zdHJpbmdfaWQoY2Rldik7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisJc3RyaW5nc19kZXZbU1RSSU5HX01BTlVGQUNUVVJFUl9JRFhdLmlkID0gc3RhdHVzOworCW1zZ19kZXZpY2VfZGVzYy5pTWFudWZhY3R1cmVyID0gc3RhdHVzOworCisJc3RhdHVzID0gdXNiX3N0cmluZ19pZChjZGV2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKwlzdHJpbmdzX2RldltTVFJJTkdfUFJPRFVDVF9JRFhdLmlkID0gc3RhdHVzOworCW1zZ19kZXZpY2VfZGVzYy5pUHJvZHVjdCA9IHN0YXR1czsKKworCXN0YXR1cyA9IHVzYl9zdHJpbmdfaWQoY2Rldik7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisJc3RyaW5nc19kZXZbU1RSSU5HX0NPTkZJR1VSQVRJT05fSURYXS5pZCA9IHN0YXR1czsKKwltc2dfY29uZmlnX2RyaXZlci5pQ29uZmlndXJhdGlvbiA9IHN0YXR1czsKKworCS8qIHJlZ2lzdGVyIG91ciBzZWNvbmQgY29uZmlndXJhdGlvbiAqLworCXN0YXR1cyA9IHVzYl9hZGRfY29uZmlnKGNkZXYsICZtc2dfY29uZmlnX2RyaXZlcik7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwlkZXZfaW5mbygmZ2FkZ2V0LT5kZXYsIERSSVZFUl9ERVNDICIsIHZlcnNpb246ICIgRFJJVkVSX1ZFUlNJT04gIlxuIik7CisJc2V0X2JpdCgwLCAmbXNnX3JlZ2lzdGVyZWQpOworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU29tZSBub2lzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIHN0cnVjdCB1c2JfY29tcG9zaXRlX2RyaXZlciBtc2dfZHJpdmVyID0geworCS5uYW1lCQk9ICJnX21hc3Nfc3RvcmFnZSIsCisJLmRldgkJPSAmbXNnX2RldmljZV9kZXNjLAorCS5zdHJpbmdzCT0gZGV2X3N0cmluZ3MsCisJLmJpbmQJCT0gbXNnX2JpbmQsCit9OworCitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0FVVEhPUigiTWljaGFsIE5hemFyZXdpY3oiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBfX2luaXQgbXNnX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gdXNiX2NvbXBvc2l0ZV9yZWdpc3RlcigmbXNnX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChtc2dfaW5pdCk7CisKK3N0YXRpYyB2b2lkIG1zZ19jbGVhbnVwKHZvaWQpCit7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmbXNnX3JlZ2lzdGVyZWQpKQorCQl1c2JfY29tcG9zaXRlX3VucmVnaXN0ZXIoJm1zZ19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQobXNnX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L211bHRpLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbXVsdGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjk1NjAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L211bHRpLmMKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiBtdWx0aS5jIC0tIE11bHRpZnVuY3Rpb24gQ29tcG9zaXRlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBEYXZpZCBCcm93bmVsbAorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcworICogQXV0aG9yOiBNaWNoYWwgTmF6YXJld2ljeiAobS5uYXphcmV3aWN6QHNhbXN1bmcuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisKKworI2lmIGRlZmluZWQgVVNCX0VUSF9STkRJUworIyAgdW5kZWYgVVNCX0VUSF9STkRJUworI2VuZGlmCisjaWZkZWYgQ09ORklHX1VTQl9FVEhfUk5ESVMKKyMgIGRlZmluZSBVU0JfRVRIX1JORElTIHkKKyNlbmRpZgorCisKKyNkZWZpbmUgRFJJVkVSX0RFU0MJCSJNdWx0aWZ1bmN0aW9uIENvbXBvc2l0ZSBHYWRnZXQiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiMjAwOS8wNy8yMSIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBNVUxUSV9WRU5ET1JfTlVNCTB4MDUyNQkvKiBYWFggTmV0Q2hpcCAqLworI2RlZmluZSBNVUxUSV9QUk9EVUNUX05VTQkweGE0YWIJLyogWFhYICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBrYnVpbGQgaXMgbm90IHZlcnkgY29vcGVyYXRpdmUgd2l0aCByZXNwZWN0IHRvIGxpbmtpbmcgc2VwYXJhdGVseQorICogY29tcGlsZWQgbGlicmFyeSBvYmplY3RzIGludG8gb25lIG1vZHVsZS4gIFNvIGZvciBub3cgd2Ugd29uJ3QgdXNlCisgKiBzZXBhcmF0ZSBjb21waWxhdGlvbiAuLi4gZW5zdXJpbmcgaW5pdC9leGl0IHNlY3Rpb25zIHdvcmsgdG8gc2hyaW5rCisgKiB0aGUgcnVudGltZSBmb290cHJpbnQsIGFuZCBnaXZpbmcgdXMgYXQgbGVhc3Qgc29tZSBwYXJ0cyBvZiB3aGF0CisgKiBhICJnY2MgLS1jb21iaW5lIC4uLiBwYXJ0MS5jIHBhcnQyLmMgcGFydDMuYyAuLi4gIiBidWlsZCB3b3VsZC4KKyAqLworCisjaW5jbHVkZSAiY29tcG9zaXRlLmMiCisjaW5jbHVkZSAidXNic3RyaW5nLmMiCisjaW5jbHVkZSAiY29uZmlnLmMiCisjaW5jbHVkZSAiZXBhdXRvY29uZi5jIgorCisjaW5jbHVkZSAidV9zZXJpYWwuYyIKKyNpbmNsdWRlICJmX2FjbS5jIgorCisjaW5jbHVkZSAiZl9lY20uYyIKKyNpbmNsdWRlICJmX3N1YnNldC5jIgorI2lmZGVmIFVTQl9FVEhfUk5ESVMKKyMgIGluY2x1ZGUgImZfcm5kaXMuYyIKKyMgIGluY2x1ZGUgInJuZGlzLmMiCisjZW5kaWYKKyNpbmNsdWRlICJ1X2V0aGVyLmMiCisKKyN1bmRlZiBEQkcgICAgIC8qIHVfZXRoZXIuYyBoYXMgYnJva2VuIGlkZWEgYWJvdXQgbWFjcm9zICovCisjdW5kZWYgVkRCRyAgICAvKiBzbyBjbGVhbiB1cCBhZnRlciBpdCAqLworI3VuZGVmIEVSUk9SCisjdW5kZWYgSU5GTworI2luY2x1ZGUgImZfbWFzc19zdG9yYWdlLmMiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yIGRldmljZV9kZXNjID0geworCS5iTGVuZ3RoID0JCXNpemVvZiBkZXZpY2VfZGVzYywKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0RFVklDRSwKKworCS5iY2RVU0IgPQkJY3B1X3RvX2xlMTYoMHgwMjAwKSwKKworCS8qIC5iRGV2aWNlQ2xhc3MgPQkJVVNCX0NMQVNTX0NPTU0sICovCisJLyogLmJEZXZpY2VTdWJDbGFzcyA9CTAsICovCisJLyogLmJEZXZpY2VQcm90b2NvbCA9CTAsICovCisJLmJEZXZpY2VDbGFzcyA9CQkweEVGLAorCS5iRGV2aWNlU3ViQ2xhc3MgPQkyLAorCS5iRGV2aWNlUHJvdG9jb2wgPQkxLAorCS8qIC5iTWF4UGFja2V0U2l6ZTAgPSBmKGhhcmR3YXJlKSAqLworCisJLyogVmVuZG9yIGFuZCBwcm9kdWN0IGlkIGNhbiBiZSBvdmVycmlkZGVuIGJ5IG1vZHVsZSBwYXJhbWV0ZXJzLiAgKi8KKwkuaWRWZW5kb3IgPQkJY3B1X3RvX2xlMTYoTVVMVElfVkVORE9SX05VTSksCisJLmlkUHJvZHVjdCA9CQljcHVfdG9fbGUxNihNVUxUSV9QUk9EVUNUX05VTSksCisJLyogLmJjZERldmljZSA9IGYoaGFyZHdhcmUpICovCisJLyogLmlNYW51ZmFjdHVyZXIgPSBEWU5BTUlDICovCisJLyogLmlQcm9kdWN0ID0gRFlOQU1JQyAqLworCS8qIE5PIFNFUklBTCBOVU1CRVIgKi8KKwkuYk51bUNvbmZpZ3VyYXRpb25zID0JMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX290Z19kZXNjcmlwdG9yIG90Z19kZXNjcmlwdG9yID0geworCS5iTGVuZ3RoID0JCXNpemVvZiBvdGdfZGVzY3JpcHRvciwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX09URywKKworCS8qIFJFVklTSVQgU1JQLW9ubHkgaGFyZHdhcmUgaXMgcG9zc2libGUsIGFsdGhvdWdoCisJICogaXQgd291bGQgbm90IGJlIGNhbGxlZCAiT1RHIiAuLi4KKwkgKi8KKwkuYm1BdHRyaWJ1dGVzID0JCVVTQl9PVEdfU1JQIHwgVVNCX09UR19ITlAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqb3RnX2Rlc2NbXSA9IHsKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmb3RnX2Rlc2NyaXB0b3IsCisJTlVMTCwKK307CisKKworLyogc3RyaW5nIElEcyBhcmUgYXNzaWduZWQgZHluYW1pY2FsbHkgKi8KKworI2RlZmluZSBTVFJJTkdfTUFOVUZBQ1RVUkVSX0lEWAkJMAorI2RlZmluZSBTVFJJTkdfUFJPRFVDVF9JRFgJCTEKKworc3RhdGljIGNoYXIgbWFudWZhY3R1cmVyWzUwXTsKKworc3RhdGljIHN0cnVjdCB1c2Jfc3RyaW5nIHN0cmluZ3NfZGV2W10gPSB7CisJW1NUUklOR19NQU5VRkFDVFVSRVJfSURYXS5zID0gbWFudWZhY3R1cmVyLAorCVtTVFJJTkdfUFJPRFVDVF9JRFhdLnMgPSBEUklWRVJfREVTQywKKwl7ICB9IC8qIGVuZCBvZiBsaXN0ICovCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9nYWRnZXRfc3RyaW5ncyBzdHJpbmd0YWJfZGV2ID0geworCS5sYW5ndWFnZQk9IDB4MDQwOSwJLyogZW4tdXMgKi8KKwkuc3RyaW5ncwk9IHN0cmluZ3NfZGV2LAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZ2FkZ2V0X3N0cmluZ3MgKmRldl9zdHJpbmdzW10gPSB7CisJJnN0cmluZ3RhYl9kZXYsCisJTlVMTCwKK307CisKK3N0YXRpYyB1OCBob3N0YWRkcltFVEhfQUxFTl07CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENvbmZpZ3VyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBmc2dfbW9kdWxlX3BhcmFtZXRlcnMgbW9kX2RhdGEgPSB7CisJLnN0YWxsID0gMQorfTsKK0ZTR19NT0RVTEVfUEFSQU1FVEVSUygvKiBubyBwcmVmaXggKi8sIG1vZF9kYXRhKTsKKworc3RhdGljIHN0cnVjdCBmc2dfY29tbW9uICpmc2dfY29tbW9uOworCisKKyNpZmRlZiBVU0JfRVRIX1JORElTCisKK3N0YXRpYyBpbnQgX19pbml0IHJuZGlzX2RvX2NvbmZpZyhzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb24gKmMpCit7CisJaW50IHJldDsKKworCWlmIChnYWRnZXRfaXNfb3RnKGMtPmNkZXYtPmdhZGdldCkpIHsKKwkJYy0+ZGVzY3JpcHRvcnMgPSBvdGdfZGVzYzsKKwkJYy0+Ym1BdHRyaWJ1dGVzIHw9IFVTQl9DT05GSUdfQVRUX1dBS0VVUDsKKwl9CisKKwlyZXQgPSBybmRpc19iaW5kX2NvbmZpZyhjLCBob3N0YWRkcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhY21fYmluZF9jb25maWcoYywgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBmc2dfYWRkKGMtPmNkZXYsIGMsIGZzZ19jb21tb24pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb24gcm5kaXNfY29uZmlnX2RyaXZlciA9IHsKKwkubGFiZWwJCQk9ICJNdWx0aWZ1bmN0aW9uIENvbXBvc2l0ZSAoUk5ESVMgKyBNUyArIEFDTSkiLAorCS5iaW5kCQkJPSBybmRpc19kb19jb25maWcsCisJLmJDb25maWd1cmF0aW9uVmFsdWUJPSAyLAorCS8qIC5pQ29uZmlndXJhdGlvbiA9IERZTkFNSUMgKi8KKwkuYm1BdHRyaWJ1dGVzCQk9IFVTQl9DT05GSUdfQVRUX1NFTEZQT1dFUiwKK307CisKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1VTQl9HX01VTFRJX0NEQworCitzdGF0aWMgaW50IF9faW5pdCBjZGNfZG9fY29uZmlnKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbiAqYykKK3sKKwlpbnQgcmV0OworCisJaWYgKGdhZGdldF9pc19vdGcoYy0+Y2Rldi0+Z2FkZ2V0KSkgeworCQljLT5kZXNjcmlwdG9ycyA9IG90Z19kZXNjOworCQljLT5ibUF0dHJpYnV0ZXMgfD0gVVNCX0NPTkZJR19BVFRfV0FLRVVQOworCX0KKworCXJldCA9IGVjbV9iaW5kX2NvbmZpZyhjLCBob3N0YWRkcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhY21fYmluZF9jb25maWcoYywgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBmc2dfYWRkKGMtPmNkZXYsIGMsIGZzZ19jb21tb24pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb24gY2RjX2NvbmZpZ19kcml2ZXIgPSB7CisJLmxhYmVsCQkJPSAiTXVsdGlmdW5jdGlvbiBDb21wb3NpdGUgKENEQyArIE1TICsgQUNNKSIsCisJLmJpbmQJCQk9IGNkY19kb19jb25maWcsCisJLmJDb25maWd1cmF0aW9uVmFsdWUJPSAxLAorCS8qIC5pQ29uZmlndXJhdGlvbiA9IERZTkFNSUMgKi8KKwkuYm1BdHRyaWJ1dGVzCQk9IFVTQl9DT05GSUdfQVRUX1NFTEZQT1dFUiwKK307CisKKyNlbmRpZgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBHYWRnZXQgQmluZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIGludCBfX2luaXQgbXVsdGlfYmluZChzdHJ1Y3QgdXNiX2NvbXBvc2l0ZV9kZXYgKmNkZXYpCit7CisJc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCA9IGNkZXYtPmdhZGdldDsKKwlpbnQgc3RhdHVzLCBnY251bTsKKworCWlmICghY2FuX3N1cHBvcnRfZWNtKGNkZXYtPmdhZGdldCkpIHsKKwkJZGV2X2VycigmZ2FkZ2V0LT5kZXYsICJjb250cm9sbGVyICclcycgbm90IHVzYWJsZVxuIiwKKwkJICAgICAgICBnYWRnZXQtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBzZXQgdXAgbmV0d29yayBsaW5rIGxheWVyICovCisJc3RhdHVzID0gZ2V0aGVyX3NldHVwKGNkZXYtPmdhZGdldCwgaG9zdGFkZHIpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogc2V0IHVwIHNlcmlhbCBsaW5rIGxheWVyICovCisJc3RhdHVzID0gZ3NlcmlhbF9zZXR1cChjZGV2LT5nYWRnZXQsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWwwOworCisJLyogc2V0IHVwIG1hc3Mgc3RvcmFnZSBmdW5jdGlvbiAqLworCWZzZ19jb21tb24gPSBmc2dfY29tbW9uX2Zyb21fcGFyYW1zKDAsIGNkZXYsICZtb2RfZGF0YSk7CisJaWYgKElTX0VSUihmc2dfY29tbW9uKSkgeworCQlzdGF0dXMgPSBQVFJfRVJSKGZzZ19jb21tb24pOworCQlnb3RvIGZhaWwxOworCX0KKworCisJZ2NudW0gPSB1c2JfZ2FkZ2V0X2NvbnRyb2xsZXJfbnVtYmVyKGdhZGdldCk7CisJaWYgKGdjbnVtID49IDApCisJCWRldmljZV9kZXNjLmJjZERldmljZSA9IGNwdV90b19sZTE2KDB4MDMwMCB8IGdjbnVtKTsKKwllbHNlIHsKKwkJLyogV2UgYXNzdW1lIHRoYXQgY2FuX3N1cHBvcnRfZWNtKCkgdGVsbHMgdGhlIHRydXRoOworCQkgKiBidXQgaWYgdGhlIGNvbnRyb2xsZXIgaXNuJ3QgcmVjb2duaXplZCBhdCBhbGwgdGhlbgorCQkgKiB0aGF0IGFzc3VtcHRpb24gaXMgYSBiaXQgbW9yZSBsaWtlbHkgdG8gYmUgd3JvbmcuCisJCSAqLworCQlXQVJOSU5HKGNkZXYsICJjb250cm9sbGVyICclcycgbm90IHJlY29nbml6ZWRcbiIsCisJCSAgICAgICAgZ2FkZ2V0LT5uYW1lKTsKKwkJZGV2aWNlX2Rlc2MuYmNkRGV2aWNlID0gY3B1X3RvX2xlMTYoMHgwMzAwIHwgMHgwMDk5KTsKKwl9CisKKworCS8qIEFsbG9jYXRlIHN0cmluZyBkZXNjcmlwdG9yIG51bWJlcnMgLi4uIG5vdGUgdGhhdCBzdHJpbmcKKwkgKiBjb250ZW50cyBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgY29tcG9zaXRlX2RldiBnbHVlLgorCSAqLworCisJLyogZGV2aWNlIGRlc2NyaXB0b3Igc3RyaW5nczogbWFudWZhY3R1cmVyLCBwcm9kdWN0ICovCisJc25wcmludGYobWFudWZhY3R1cmVyLCBzaXplb2YgbWFudWZhY3R1cmVyLCAiJXMgJXMgd2l0aCAlcyIsCisJICAgICAgICAgaW5pdF91dHNuYW1lKCktPnN5c25hbWUsIGluaXRfdXRzbmFtZSgpLT5yZWxlYXNlLAorCSAgICAgICAgIGdhZGdldC0+bmFtZSk7CisJc3RhdHVzID0gdXNiX3N0cmluZ19pZChjZGV2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBmYWlsMjsKKwlzdHJpbmdzX2RldltTVFJJTkdfTUFOVUZBQ1RVUkVSX0lEWF0uaWQgPSBzdGF0dXM7CisJZGV2aWNlX2Rlc2MuaU1hbnVmYWN0dXJlciA9IHN0YXR1czsKKworCXN0YXR1cyA9IHVzYl9zdHJpbmdfaWQoY2Rldik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDI7CisJc3RyaW5nc19kZXZbU1RSSU5HX1BST0RVQ1RfSURYXS5pZCA9IHN0YXR1czsKKwlkZXZpY2VfZGVzYy5pUHJvZHVjdCA9IHN0YXR1czsKKworI2lmZGVmIFVTQl9FVEhfUk5ESVMKKwkvKiByZWdpc3RlciBvdXIgZmlyc3QgY29uZmlndXJhdGlvbiAqLworCXN0YXR1cyA9IHVzYl9hZGRfY29uZmlnKGNkZXYsICZybmRpc19jb25maWdfZHJpdmVyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBmYWlsMjsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1VTQl9HX01VTFRJX0NEQworCS8qIHJlZ2lzdGVyIG91ciBzZWNvbmQgY29uZmlndXJhdGlvbiAqLworCXN0YXR1cyA9IHVzYl9hZGRfY29uZmlnKGNkZXYsICZjZGNfY29uZmlnX2RyaXZlcik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDI7CisjZW5kaWYKKworCWRldl9pbmZvKCZnYWRnZXQtPmRldiwgRFJJVkVSX0RFU0MgIiwgdmVyc2lvbjogIiBEUklWRVJfVkVSU0lPTiAiXG4iKTsKKwlmc2dfY29tbW9uX3B1dChmc2dfY29tbW9uKTsKKwlyZXR1cm4gMDsKKworZmFpbDI6CisJZnNnX2NvbW1vbl9wdXQoZnNnX2NvbW1vbik7CitmYWlsMToKKwlnc2VyaWFsX2NsZWFudXAoKTsKK2ZhaWwwOgorCWdldGhlcl9jbGVhbnVwKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX2V4aXQgbXVsdGlfdW5iaW5kKHN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldikKK3sKKwlnc2VyaWFsX2NsZWFudXAoKTsKKwlnZXRoZXJfY2xlYW51cCgpOworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU29tZSBub2lzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIHN0cnVjdCB1c2JfY29tcG9zaXRlX2RyaXZlciBtdWx0aV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImdfbXVsdGkiLAorCS5kZXYJCT0gJmRldmljZV9kZXNjLAorCS5zdHJpbmdzCT0gZGV2X3N0cmluZ3MsCisJLmJpbmQJCT0gbXVsdGlfYmluZCwKKwkudW5iaW5kCQk9IF9fZXhpdF9wKG11bHRpX3VuYmluZCksCit9OworCitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0FVVEhPUigiTWljaGFsIE5hemFyZXdpY3oiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBfX2luaXQgZ19tdWx0aV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHVzYl9jb21wb3NpdGVfcmVnaXN0ZXIoJm11bHRpX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChnX211bHRpX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZ19tdWx0aV9jbGVhbnVwKHZvaWQpCit7CisJdXNiX2NvbXBvc2l0ZV91bnJlZ2lzdGVyKCZtdWx0aV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoZ19tdWx0aV9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9zdG9yYWdlX2NvbW1vbi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3N0b3JhZ2VfY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4ZDhlZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zdG9yYWdlX2NvbW1vbi5jCkBAIC0wLDAgKzEsNzc4IEBACisvKgorICogc3RvcmFnZV9jb21tb24uYyAtLSBDb21tb24gZGVmaW5pdGlvbnMgZm9yIG1hc3Mgc3RvcmFnZSBmdW5jdGlvbmFsaXR5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQWxhbiBTdGVybgorICogQ29weWVpZ2h0IChDKSAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqIEF1dGhvcjogTWljaGFsIE5hemFyZXdpY3ogKG0ubmF6YXJld2ljekBzYW1zdW5nLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworCisvKgorICogVGhpcyBmaWxlIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnMgdXNlZCBpbiBVU0Igc3RyaW5ncyB0bworICogYmUgZGVmaW5lZCAoZWFjaCBvZiB0eXBlIHBvaW50ZXIgdG8gY2hhcik6CisgKiAgLSBmc2dfc3RyaW5nX21hbnVmYWN0dXJlciAtLSBuYW1lIG9mIHRoZSBtYW51ZmFjdHVyZXIKKyAqICAtIGZzZ19zdHJpbmdfcHJvZHVjdCAgICAgIC0tIG5hbWUgb2YgdGhlIHByb2R1Y3QKKyAqICAtIGZzZ19zdHJpbmdfc2VyaWFsICAgICAgIC0tIHByb2R1Y3QncyBzZXJpYWwKKyAqICAtIGZzZ19zdHJpbmdfY29uZmlnICAgICAgIC0tIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24KKyAqICAtIGZzZ19zdHJpbmdfaW50ZXJmYWNlICAgIC0tIG5hbWUgb2YgdGhlIGludGVyZmFjZQorICogVGhlIGZpcnN0IGZvdXIgYXJlIG9ubHkgbmVlZGVkIHdoZW4gRlNHX0RFU0NSSVBUT1JTX0RFVklDRV9TVFJJTkdTCisgKiBtYWNybyBpcyBkZWZpbmVkIHByaW9yIHRvIGluY2x1ZGluZyB0aGlzIGZpbGUuCisgKi8KKworLyoKKyAqIFdoZW4gRlNHX05PX0lOVFJfRVAgaXMgZGVmaW5lZCBmc2dfZnNfaW50cl9pbl9kZXNjIGFuZAorICogZnNnX2hzX2ludHJfaW5fZGVzYyBvYmplY3RzIGFzIHdlbGwgYXMKKyAqIEZTR19GU19GVU5DVElPTl9QUkVfRVBfRU5UUklFUyBhbmQgRlNHX0hTX0ZVTkNUSU9OX1BSRV9FUF9FTlRSSUVTCisgKiBtYWNyb3MgYXJlIG5vdCBkZWZpbmVkLgorICoKKyAqIFdoZW4gRlNHX05PX0RFVklDRV9TVFJJTkdTIGlzIGRlZmluZWQgRlNHX1NUUklOR19NQU5VRkFDVFVSRVIsCisgKiBGU0dfU1RSSU5HX1BST0RVQ1QsIEZTR19TVFJJTkdfU0VSSUFMIGFuZCBGU0dfU1RSSU5HX0NPTkZJRyBhcmUgbm90CisgKiBkZWZpbmVkIChhcyB3ZWxsIGFzIGNvcnJlc3BvbmRpbmcgZW50cmllcyBpbiBzdHJpbmcgdGFibGVzIGFyZQorICogbWlzc2luZykgYW5kIEZTR19TVFJJTkdfSU5URVJGQUNFIGhhcyB2YWx1ZSBvZiB6ZXJvLgorICoKKyAqIFdoZW4gRlNHX05PX09URyBpcyBkZWZpbmVkIGZzZ19vdGdfZGVzYyB3b24ndCBiZSBkZWZpbmVkLgorICovCisKKy8qCisgKiBXaGVuIEZTR19CVUZGSERfU1RBVElDX0JVRkZFUiBpcyBkZWZpbmVkIHdoZW4gdGhpcyBmaWxlIGlzIGluY2x1ZGVkCisgKiB0aGUgZnNnX2J1ZmZoZCBzdHJ1Y3R1cmUncyBidWYgZmllbGQgd2lsbCBiZSBhbiBhcnJheSBvZiBGU0dfQlVGTEVOCisgKiBjaGFyYWN0ZXJzIHJhdGhlciB0aGVuIGEgcG9pbnRlciB0byB2b2lkLgorICovCisKKworI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworCisvKiBUaGFua3MgdG8gTmV0Q2hpcCBUZWNobm9sb2dpZXMgZm9yIGRvbmF0aW5nIHRoaXMgcHJvZHVjdCBJRC4KKyAqCisgKiBETyBOT1QgUkVVU0UgVEhFU0UgSURzIHdpdGggYW55IG90aGVyIGRyaXZlciEhICBFdmVyISEKKyAqIEluc3RlYWQ6ICBhbGxvY2F0ZSB5b3VyIG93biwgdXNpbmcgbm9ybWFsIFVTQi1JRiBwcm9jZWR1cmVzLiAqLworI2RlZmluZSBGU0dfVkVORE9SX0lECTB4MDUyNQkvKiBOZXRDaGlwICovCisjZGVmaW5lIEZTR19QUk9EVUNUX0lECTB4YTRhNQkvKiBMaW51eC1VU0IgRmlsZS1iYWNrZWQgU3RvcmFnZSBHYWRnZXQgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyNpZm5kZWYgREVCVUcKKyN1bmRlZiBWRVJCT1NFX0RFQlVHCisjdW5kZWYgRFVNUF9NU0dTCisjZW5kaWYgLyogIURFQlVHICovCisKKyNpZmRlZiBWRVJCT1NFX0RFQlVHCisjZGVmaW5lIFZMREJHCUxEQkcKKyNlbHNlCisjZGVmaW5lIFZMREJHKGx1biwgZm10LCBhcmdzLi4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogVkVSQk9TRV9ERUJVRyAqLworCisjZGVmaW5lIExEQkcobHVuLCBmbXQsIGFyZ3MuLi4pICAgZGV2X2RiZyAoJihsdW4pLT5kZXYsIGZtdCwgIyMgYXJncykKKyNkZWZpbmUgTEVSUk9SKGx1biwgZm10LCBhcmdzLi4uKSBkZXZfZXJyICgmKGx1biktPmRldiwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBMV0FSTihsdW4sIGZtdCwgYXJncy4uLikgIGRldl93YXJuKCYobHVuKS0+ZGV2LCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIExJTkZPKGx1biwgZm10LCBhcmdzLi4uKSAgZGV2X2luZm8oJihsdW4pLT5kZXYsIGZtdCwgIyMgYXJncykKKworLyogS2VlcCB0aG9zZSBtYWNyb3MgaW4gc3luYyB3aXRoIHRob3MgaW4KKyAqIGluY2x1ZGUvbGludXgvdWJzL2NvbXBvc2l0ZS5oIG9yIGVsc2UgR0NDIHdpbGwgY29tcGxhaW4uICBJZiB0aGV5CisgKiBhcmUgaWRlbnRpY2FsICh0aGUgc2FtZSBuYW1lcyBvZiBhcmd1bWVudHMsIHdoaXRlIHNwYWNlcyBpbiB0aGUKKyAqIHNhbWUgcGxhY2VzKSBHQ0Mgd2lsbCBhbGxvdyByZWRlZmluaXRpb24gb3RoZXJ3aXNlIChldmVuIGlmIHNvbWUKKyAqIHdoaXRlIHNwYWNlIGlzIHJlbW92ZWQgb3IgYWRkZWQpIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQuICBObworICogY2hlY2tpbmcgaWYgdGhvc2Ugc3ltYm9scyBpcyBkZWZpbmVkIGlzIHBlcmZvcm1lZCBiZWNhdXNlIHdhcm5pbmcKKyAqIGlzIGRlc2lyZWQgd2hlbiB0aG9zZSBtYWNyb3Mgd2VyZSBkZWZpbmVkIGJ5IHNvbWVvbmUgZWxzZSB0byBtZWFuCisgKiBzb21ldGhpbmcgZWxzZS4gKi8KKyNkZWZpbmUgREJHKGQsIGZtdCwgYXJncy4uLikgICAgIGRldl9kYmcoJihkKS0+Z2FkZ2V0LT5kZXYgLCBmbXQgLCAjIyBhcmdzKQorI2RlZmluZSBWREJHKGQsIGZtdCwgYXJncy4uLikgICAgZGV2X3ZkYmcoJihkKS0+Z2FkZ2V0LT5kZXYgLCBmbXQgLCAjIyBhcmdzKQorI2RlZmluZSBFUlJPUihkLCBmbXQsIGFyZ3MuLi4pICAgZGV2X2VycigmKGQpLT5nYWRnZXQtPmRldiAsIGZtdCAsICMjIGFyZ3MpCisjZGVmaW5lIFdBUk5JTkcoZCwgZm10LCBhcmdzLi4uKSBkZXZfd2FybigmKGQpLT5nYWRnZXQtPmRldiAsIGZtdCAsICMjIGFyZ3MpCisjZGVmaW5lIElORk8oZCwgZm10LCBhcmdzLi4uKSAgICBkZXZfaW5mbygmKGQpLT5nYWRnZXQtPmRldiAsIGZtdCAsICMjIGFyZ3MpCisKKworCisjaWZkZWYgRFVNUF9NU0dTCisKKyMgIGRlZmluZSBkdW1wX21zZyhmc2csIC8qIGNvbnN0IGNoYXIgKiAqLyBsYWJlbCwJCQlcCisJCSAgIC8qIGNvbnN0IHU4ICogKi8gYnVmLCAvKiB1bnNpZ25lZCAqLyBsZW5ndGgpIGRvIHsJXAorCWlmIChsZW5ndGggPCA1MTIpIHsJCQkJCQlcCisJCURCRyhmc2csICIlcywgbGVuZ3RoICV1OlxuIiwgbGFiZWwsIGxlbmd0aCk7CQlcCisJCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsICIiLCBEVU1QX1BSRUZJWF9PRkZTRVQsCVwKKwkJCSAgICAgICAxNiwgMSwgYnVmLCBsZW5ndGgsIDApOwkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjICBkZWZpbmUgZHVtcF9jZGIoZnNnKSBkbyB7IH0gd2hpbGUgKDApCisKKyNlbHNlCisKKyMgIGRlZmluZSBkdW1wX21zZyhmc2csIC8qIGNvbnN0IGNoYXIgKiAqLyBsYWJlbCwgXAorCQkgICAvKiBjb25zdCB1OCAqICovIGJ1ZiwgLyogdW5zaWduZWQgKi8gbGVuZ3RoKSBkbyB7IH0gd2hpbGUgKDApCisKKyMgIGlmZGVmIFZFUkJPU0VfREVCVUcKKworIyAgICBkZWZpbmUgZHVtcF9jZGIoZnNnKQkJCQkJCVwKKwlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCAiU0NTSSBDREI6ICIsIERVTVBfUFJFRklYX05PTkUsCVwKKwkJICAgICAgIDE2LCAxLCAoZnNnKS0+Y21uZCwgKGZzZyktPmNtbmRfc2l6ZSwgMCkJCVwKKworIyAgZWxzZQorCisjICAgIGRlZmluZSBkdW1wX2NkYihmc2cpIGRvIHsgfSB3aGlsZSAoMCkKKworIyAgZW5kaWYgLyogVkVSQk9TRV9ERUJVRyAqLworCisjZW5kaWYgLyogRFVNUF9NU0dTICovCisKKworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU0NTSSBkZXZpY2UgdHlwZXMgKi8KKyNkZWZpbmUgVFlQRV9ESVNLCTB4MDAKKyNkZWZpbmUgVFlQRV9DRFJPTQkweDA1CisKKy8qIFVTQiBwcm90b2NvbCB2YWx1ZSA9IHRoZSB0cmFuc3BvcnQgbWV0aG9kICovCisjZGVmaW5lIFVTQl9QUl9DQkkJMHgwMAkJLyogQ29udHJvbC9CdWxrL0ludGVycnVwdCAqLworI2RlZmluZSBVU0JfUFJfQ0IJMHgwMQkJLyogQ29udHJvbC9CdWxrIHcvbyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVVNCX1BSX0JVTEsJMHg1MAkJLyogQnVsay1vbmx5ICovCisKKy8qIFVTQiBzdWJjbGFzcyB2YWx1ZSA9IHRoZSBwcm90b2NvbCBlbmNhcHN1bGF0aW9uICovCisjZGVmaW5lIFVTQl9TQ19SQkMJMHgwMQkJLyogUmVkdWNlZCBCbG9jayBDb21tYW5kcyAoZmxhc2gpICovCisjZGVmaW5lIFVTQl9TQ184MDIwCTB4MDIJCS8qIFNGRi04MDIwaSwgTU1DLTIsIEFUQVBJIChDRC1ST00pICovCisjZGVmaW5lIFVTQl9TQ19RSUMJMHgwMwkJLyogUUlDLTE1NyAodGFwZSkgKi8KKyNkZWZpbmUgVVNCX1NDX1VGSQkweDA0CQkvKiBVRkkgKGZsb3BweSkgKi8KKyNkZWZpbmUgVVNCX1NDXzgwNzAJMHgwNQkJLyogU0ZGLTgwNzBpIChyZW1vdmFibGUpICovCisjZGVmaW5lIFVTQl9TQ19TQ1NJCTB4MDYJCS8qIFRyYW5zcGFyZW50IFNDU0kgKi8KKworLyogQnVsay1vbmx5IGRhdGEgc3RydWN0dXJlcyAqLworCisvKiBDb21tYW5kIEJsb2NrIFdyYXBwZXIgKi8KK3N0cnVjdCBmc2dfYnVsa19jYl93cmFwIHsKKwlfX2xlMzIJU2lnbmF0dXJlOwkJLyogQ29udGFpbnMgJ1VTQkMnICovCisJdTMyCVRhZzsJCQkvKiBVbmlxdWUgcGVyIGNvbW1hbmQgaWQgKi8KKwlfX2xlMzIJRGF0YVRyYW5zZmVyTGVuZ3RoOwkvKiBTaXplIG9mIHRoZSBkYXRhICovCisJdTgJRmxhZ3M7CQkJLyogRGlyZWN0aW9uIGluIGJpdCA3ICovCisJdTgJTHVuOwkJCS8qIExVTiAobm9ybWFsbHkgMCkgKi8KKwl1OAlMZW5ndGg7CQkJLyogT2YgdGhlIENEQiwgPD0gTUFYX0NPTU1BTkRfU0laRSAqLworCXU4CUNEQlsxNl07CQkvKiBDb21tYW5kIERhdGEgQmxvY2sgKi8KK307CisKKyNkZWZpbmUgVVNCX0JVTEtfQ0JfV1JBUF9MRU4JMzEKKyNkZWZpbmUgVVNCX0JVTEtfQ0JfU0lHCQkweDQzNDI1MzU1CS8qIFNwZWxscyBvdXQgVVNCQyAqLworI2RlZmluZSBVU0JfQlVMS19JTl9GTEFHCTB4ODAKKworLyogQ29tbWFuZCBTdGF0dXMgV3JhcHBlciAqLworc3RydWN0IGJ1bGtfY3Nfd3JhcCB7CisJX19sZTMyCVNpZ25hdHVyZTsJCS8qIFNob3VsZCA9ICdVU0JTJyAqLworCXUzMglUYWc7CQkJLyogU2FtZSBhcyBvcmlnaW5hbCBjb21tYW5kICovCisJX19sZTMyCVJlc2lkdWU7CQkvKiBBbW91bnQgbm90IHRyYW5zZmVycmVkICovCisJdTgJU3RhdHVzOwkJCS8qIFNlZSBiZWxvdyAqLworfTsKKworI2RlZmluZSBVU0JfQlVMS19DU19XUkFQX0xFTgkxMworI2RlZmluZSBVU0JfQlVMS19DU19TSUcJCTB4NTM0MjUzNTUJLyogU3BlbGxzIG91dCAnVVNCUycgKi8KKyNkZWZpbmUgVVNCX1NUQVRVU19QQVNTCQkwCisjZGVmaW5lIFVTQl9TVEFUVVNfRkFJTAkJMQorI2RlZmluZSBVU0JfU1RBVFVTX1BIQVNFX0VSUk9SCTIKKworLyogQnVsay1vbmx5IGNsYXNzIHNwZWNpZmljIHJlcXVlc3RzICovCisjZGVmaW5lIFVTQl9CVUxLX1JFU0VUX1JFUVVFU1QJCTB4ZmYKKyNkZWZpbmUgVVNCX0JVTEtfR0VUX01BWF9MVU5fUkVRVUVTVAkweGZlCisKKworLyogQ0JJIEludGVycnVwdCBkYXRhIHN0cnVjdHVyZSAqLworc3RydWN0IGludGVycnVwdF9kYXRhIHsKKwl1OAliVHlwZTsKKwl1OAliVmFsdWU7Cit9OworCisjZGVmaW5lIENCSV9JTlRFUlJVUFRfREFUQV9MRU4JCTIKKworLyogQ0JJIEFjY2VwdCBEZXZpY2UtU3BlY2lmaWMgQ29tbWFuZCByZXF1ZXN0ICovCisjZGVmaW5lIFVTQl9DQklfQURTQ19SRVFVRVNUCQkweDAwCisKKworLyogTGVuZ3RoIG9mIGEgU0NTSSBDb21tYW5kIERhdGEgQmxvY2sgKi8KKyNkZWZpbmUgTUFYX0NPTU1BTkRfU0laRQkxNgorCisvKiBTQ1NJIGNvbW1hbmRzIHRoYXQgd2UgcmVjb2duaXplICovCisjZGVmaW5lIFNDX0ZPUk1BVF9VTklUCQkJMHgwNAorI2RlZmluZSBTQ19JTlFVSVJZCQkJMHgxMgorI2RlZmluZSBTQ19NT0RFX1NFTEVDVF82CQkweDE1CisjZGVmaW5lIFNDX01PREVfU0VMRUNUXzEwCQkweDU1CisjZGVmaW5lIFNDX01PREVfU0VOU0VfNgkJCTB4MWEKKyNkZWZpbmUgU0NfTU9ERV9TRU5TRV8xMAkJMHg1YQorI2RlZmluZSBTQ19QUkVWRU5UX0FMTE9XX01FRElVTV9SRU1PVkFMCTB4MWUKKyNkZWZpbmUgU0NfUkVBRF82CQkJMHgwOAorI2RlZmluZSBTQ19SRUFEXzEwCQkJMHgyOAorI2RlZmluZSBTQ19SRUFEXzEyCQkJMHhhOAorI2RlZmluZSBTQ19SRUFEX0NBUEFDSVRZCQkweDI1CisjZGVmaW5lIFNDX1JFQURfRk9STUFUX0NBUEFDSVRJRVMJMHgyMworI2RlZmluZSBTQ19SRUFEX0hFQURFUgkJCTB4NDQKKyNkZWZpbmUgU0NfUkVBRF9UT0MJCQkweDQzCisjZGVmaW5lIFNDX1JFTEVBU0UJCQkweDE3CisjZGVmaW5lIFNDX1JFUVVFU1RfU0VOU0UJCTB4MDMKKyNkZWZpbmUgU0NfUkVTRVJWRQkJCTB4MTYKKyNkZWZpbmUgU0NfU0VORF9ESUFHTk9TVElDCQkweDFkCisjZGVmaW5lIFNDX1NUQVJUX1NUT1BfVU5JVAkJMHgxYgorI2RlZmluZSBTQ19TWU5DSFJPTklaRV9DQUNIRQkJMHgzNQorI2RlZmluZSBTQ19URVNUX1VOSVRfUkVBRFkJCTB4MDAKKyNkZWZpbmUgU0NfVkVSSUZZCQkJMHgyZgorI2RlZmluZSBTQ19XUklURV82CQkJMHgwYQorI2RlZmluZSBTQ19XUklURV8xMAkJCTB4MmEKKyNkZWZpbmUgU0NfV1JJVEVfMTIJCQkweGFhCisKKy8qIFNDU0kgU2Vuc2UgS2V5L0FkZGl0aW9uYWwgU2Vuc2UgQ29kZS9BU0MgUXVhbGlmaWVyIHZhbHVlcyAqLworI2RlZmluZSBTU19OT19TRU5TRQkJCQkwCisjZGVmaW5lIFNTX0NPTU1VTklDQVRJT05fRkFJTFVSRQkJMHgwNDA4MDAKKyNkZWZpbmUgU1NfSU5WQUxJRF9DT01NQU5ECQkJMHgwNTIwMDAKKyNkZWZpbmUgU1NfSU5WQUxJRF9GSUVMRF9JTl9DREIJCQkweDA1MjQwMAorI2RlZmluZSBTU19MT0dJQ0FMX0JMT0NLX0FERFJFU1NfT1VUX09GX1JBTkdFCTB4MDUyMTAwCisjZGVmaW5lIFNTX0xPR0lDQUxfVU5JVF9OT1RfU1VQUE9SVEVECQkweDA1MjUwMAorI2RlZmluZSBTU19NRURJVU1fTk9UX1BSRVNFTlQJCQkweDAyM2EwMAorI2RlZmluZSBTU19NRURJVU1fUkVNT1ZBTF9QUkVWRU5URUQJCTB4MDU1MzAyCisjZGVmaW5lIFNTX05PVF9SRUFEWV9UT19SRUFEWV9UUkFOU0lUSU9OCTB4MDYyODAwCisjZGVmaW5lIFNTX1JFU0VUX09DQ1VSUkVECQkJMHgwNjI5MDAKKyNkZWZpbmUgU1NfU0FWSU5HX1BBUkFNRVRFUlNfTk9UX1NVUFBPUlRFRAkweDA1MzkwMAorI2RlZmluZSBTU19VTlJFQ09WRVJFRF9SRUFEX0VSUk9SCQkweDAzMTEwMAorI2RlZmluZSBTU19XUklURV9FUlJPUgkJCQkweDAzMGMwMgorI2RlZmluZSBTU19XUklURV9QUk9URUNURUQJCQkweDA3MjcwMAorCisjZGVmaW5lIFNLKHgpCQkoKHU4KSAoKHgpID4+IDE2KSkJLyogU2Vuc2UgS2V5IGJ5dGUsIGV0Yy4gKi8KKyNkZWZpbmUgQVNDKHgpCQkoKHU4KSAoKHgpID4+IDgpKQorI2RlZmluZSBBU0NRKHgpCQkoKHU4KSAoeCkpCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCitzdHJ1Y3QgZnNnX2x1biB7CisJc3RydWN0IGZpbGUJKmZpbHA7CisJbG9mZl90CQlmaWxlX2xlbmd0aDsKKwlsb2ZmX3QJCW51bV9zZWN0b3JzOworCisJdW5zaWduZWQgaW50CWluaXRpYWxseV9ybzoxOworCXVuc2lnbmVkIGludAlybzoxOworCXVuc2lnbmVkIGludAlyZW1vdmFibGU6MTsKKwl1bnNpZ25lZCBpbnQJY2Ryb206MTsKKwl1bnNpZ25lZCBpbnQJcHJldmVudF9tZWRpdW1fcmVtb3ZhbDoxOworCXVuc2lnbmVkIGludAlyZWdpc3RlcmVkOjE7CisJdW5zaWduZWQgaW50CWluZm9fdmFsaWQ6MTsKKworCXUzMgkJc2Vuc2VfZGF0YTsKKwl1MzIJCXNlbnNlX2RhdGFfaW5mbzsKKwl1MzIJCXVuaXRfYXR0ZW50aW9uX2RhdGE7CisKKwlzdHJ1Y3QgZGV2aWNlCWRldjsKK307CisKKyNkZWZpbmUgZnNnX2x1bl9pc19vcGVuKGN1cmx1bikJKChjdXJsdW4pLT5maWxwICE9IE5VTEwpCisKK3N0YXRpYyBzdHJ1Y3QgZnNnX2x1biAqZnNnX2x1bl9mcm9tX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBmc2dfbHVuLCBkZXYpOworfQorCisKKy8qIEJpZyBlbm91Z2ggdG8gaG9sZCBvdXIgYmlnZ2VzdCBkZXNjcmlwdG9yICovCisjZGVmaW5lIEVQMF9CVUZTSVpFCTI1NgorI2RlZmluZSBERUxBWUVEX1NUQVRVUwkoRVAwX0JVRlNJWkUgKyA5OTkpCS8qIEFuIGltcG9zc2libHkgbGFyZ2UgdmFsdWUgKi8KKworLyogTnVtYmVyIG9mIGJ1ZmZlcnMgd2Ugd2lsbCB1c2UuICAyIGlzIGVub3VnaCBmb3IgZG91YmxlLWJ1ZmZlcmluZyAqLworI2RlZmluZSBGU0dfTlVNX0JVRkZFUlMJMgorCisvKiBEZWZhdWx0IHNpemUgb2YgYnVmZmVyIGxlbmd0aC4gKi8KKyNkZWZpbmUgRlNHX0JVRkxFTgkoKHUzMikxNjM4NCkKKworLyogTWF4aW1hbCBudW1iZXIgb2YgTFVOcyBzdXBwb3J0ZWQgaW4gbWFzcyBzdG9yYWdlIGZ1bmN0aW9uICovCisjZGVmaW5lIEZTR19NQVhfTFVOUwk4CisKK2VudW0gZnNnX2J1ZmZlcl9zdGF0ZSB7CisJQlVGX1NUQVRFX0VNUFRZID0gMCwKKwlCVUZfU1RBVEVfRlVMTCwKKwlCVUZfU1RBVEVfQlVTWQorfTsKKworc3RydWN0IGZzZ19idWZmaGQgeworI2lmZGVmIEZTR19CVUZGSERfU1RBVElDX0JVRkZFUgorCWNoYXIJCQkJYnVmW0ZTR19CVUZMRU5dOworI2Vsc2UKKwl2b2lkCQkJCSpidWY7CisjZW5kaWYKKwllbnVtIGZzZ19idWZmZXJfc3RhdGUJCXN0YXRlOworCXN0cnVjdCBmc2dfYnVmZmhkCQkqbmV4dDsKKworCS8qIFRoZSBOZXRDaGlwIDIyODAgaXMgZmFzdGVyLCBhbmQgaGFuZGxlcyBzb21lIHByb3RvY29sIGZhdWx0cworCSAqIGJldHRlciwgaWYgd2UgZG9uJ3Qgc3VibWl0IGFueSBzaG9ydCBidWxrLW91dCByZWFkIHJlcXVlc3RzLgorCSAqIFNvIHdlIHdpbGwgcmVjb3JkIHRoZSBpbnRlbmRlZCByZXF1ZXN0IGxlbmd0aCBoZXJlLiAqLworCXVuc2lnbmVkIGludAkJCWJ1bGtfb3V0X2ludGVuZGVkX2xlbmd0aDsKKworCXN0cnVjdCB1c2JfcmVxdWVzdAkJKmlucmVxOworCWludAkJCQlpbnJlcV9idXN5OworCXN0cnVjdCB1c2JfcmVxdWVzdAkJKm91dHJlcTsKKwlpbnQJCQkJb3V0cmVxX2J1c3k7Cit9OworCitlbnVtIGZzZ19zdGF0ZSB7CisJLyogVGhpcyBvbmUgaXNuJ3QgdXNlZCBhbnl3aGVyZSAqLworCUZTR19TVEFURV9DT01NQU5EX1BIQVNFID0gLTEwLAorCUZTR19TVEFURV9EQVRBX1BIQVNFLAorCUZTR19TVEFURV9TVEFUVVNfUEhBU0UsCisKKwlGU0dfU1RBVEVfSURMRSA9IDAsCisJRlNHX1NUQVRFX0FCT1JUX0JVTEtfT1VULAorCUZTR19TVEFURV9SRVNFVCwKKwlGU0dfU1RBVEVfSU5URVJGQUNFX0NIQU5HRSwKKwlGU0dfU1RBVEVfQ09ORklHX0NIQU5HRSwKKwlGU0dfU1RBVEVfRElTQ09OTkVDVCwKKwlGU0dfU1RBVEVfRVhJVCwKKwlGU0dfU1RBVEVfVEVSTUlOQVRFRAorfTsKKworZW51bSBkYXRhX2RpcmVjdGlvbiB7CisJREFUQV9ESVJfVU5LTk9XTiA9IDAsCisJREFUQV9ESVJfRlJPTV9IT1NULAorCURBVEFfRElSX1RPX0hPU1QsCisJREFUQV9ESVJfTk9ORQorfTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKK3N0YXRpYyBpbmxpbmUgdTMyIGdldF91bmFsaWduZWRfYmUyNCh1OCAqYnVmKQoreworCXJldHVybiAweGZmZmZmZiAmICh1MzIpIGdldF91bmFsaWduZWRfYmUzMihidWYgLSAxKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKK2VudW0geworI2lmbmRlZiBGU0dfTk9fREVWSUNFX1NUUklOR1MKKwlGU0dfU1RSSU5HX01BTlVGQUNUVVJFUgk9IDEsCisJRlNHX1NUUklOR19QUk9EVUNULAorCUZTR19TVFJJTkdfU0VSSUFMLAorCUZTR19TVFJJTkdfQ09ORklHLAorI2VuZGlmCisJRlNHX1NUUklOR19JTlRFUkZBQ0UKK307CisKKworI2lmbmRlZiBGU0dfTk9fT1RHCitzdGF0aWMgc3RydWN0IHVzYl9vdGdfZGVzY3JpcHRvcgorZnNnX290Z19kZXNjID0geworCS5iTGVuZ3RoID0JCXNpemVvZiBmc2dfb3RnX2Rlc2MsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9PVEcsCisKKwkuYm1BdHRyaWJ1dGVzID0JCVVTQl9PVEdfU1JQLAorfTsKKyNlbmRpZgorCisvKiBUaGVyZSBpcyBvbmx5IG9uZSBpbnRlcmZhY2UuICovCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yCitmc2dfaW50Zl9kZXNjID0geworCS5iTGVuZ3RoID0JCXNpemVvZiBmc2dfaW50Zl9kZXNjLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfSU5URVJGQUNFLAorCisJLmJOdW1FbmRwb2ludHMgPQkyLAkJLyogQWRqdXN0ZWQgZHVyaW5nIGZzZ19iaW5kKCkgKi8KKwkuYkludGVyZmFjZUNsYXNzID0JVVNCX0NMQVNTX01BU1NfU1RPUkFHRSwKKwkuYkludGVyZmFjZVN1YkNsYXNzID0JVVNCX1NDX1NDU0ksCS8qIEFkanVzdGVkIGR1cmluZyBmc2dfYmluZCgpICovCisJLmJJbnRlcmZhY2VQcm90b2NvbCA9CVVTQl9QUl9CVUxLLAkvKiBBZGp1c3RlZCBkdXJpbmcgZnNnX2JpbmQoKSAqLworCS5pSW50ZXJmYWNlID0JCUZTR19TVFJJTkdfSU5URVJGQUNFLAorfTsKKworLyogVGhyZWUgZnVsbC1zcGVlZCBlbmRwb2ludCBkZXNjcmlwdG9yczogYnVsay1pbiwgYnVsay1vdXQsCisgKiBhbmQgaW50ZXJydXB0LWluLiAqLworCitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCitmc2dfZnNfYnVsa19pbl9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisKKwkuYkVuZHBvaW50QWRkcmVzcyA9CVVTQl9ESVJfSU4sCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCS8qIHdNYXhQYWNrZXRTaXplIHNldCBieSBhdXRvY29uZmlndXJhdGlvbiAqLworfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgorZnNnX2ZzX2J1bGtfb3V0X2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKKworCS5iRW5kcG9pbnRBZGRyZXNzID0JVVNCX0RJUl9PVVQsCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCS8qIHdNYXhQYWNrZXRTaXplIHNldCBieSBhdXRvY29uZmlndXJhdGlvbiAqLworfTsKKworI2lmbmRlZiBGU0dfTk9fSU5UUl9FUAorCitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCitmc2dfZnNfaW50cl9pbl9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisKKwkuYkVuZHBvaW50QWRkcmVzcyA9CVVTQl9ESVJfSU4sCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCisJLndNYXhQYWNrZXRTaXplID0JY3B1X3RvX2xlMTYoMiksCisJLmJJbnRlcnZhbCA9CQkzMiwJLyogZnJhbWVzIC0+IDMyIG1zICovCit9OworCisjaWZuZGVmIEZTR19OT19PVEcKKyMgIGRlZmluZSBGU0dfRlNfRlVOQ1RJT05fUFJFX0VQX0VOVFJJRVMJMgorI2Vsc2UKKyMgIGRlZmluZSBGU0dfRlNfRlVOQ1RJT05fUFJFX0VQX0VOVFJJRVMJMQorI2VuZGlmCisKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqZnNnX2ZzX2Z1bmN0aW9uW10gPSB7CisjaWZuZGVmIEZTR19OT19PVEcKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZnNnX290Z19kZXNjLAorI2VuZGlmCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzZ19pbnRmX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzZ19mc19idWxrX2luX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzZ19mc19idWxrX291dF9kZXNjLAorI2lmbmRlZiBGU0dfTk9fSU5UUl9FUAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZmc2dfZnNfaW50cl9pbl9kZXNjLAorI2VuZGlmCisJTlVMTCwKK307CisKKworLyoKKyAqIFVTQiAyLjAgZGV2aWNlcyBuZWVkIHRvIGV4cG9zZSBib3RoIGhpZ2ggc3BlZWQgYW5kIGZ1bGwgc3BlZWQKKyAqIGRlc2NyaXB0b3JzLCB1bmxlc3MgdGhleSBvbmx5IHJ1biBhdCBmdWxsIHNwZWVkLgorICoKKyAqIFRoYXQgbWVhbnMgYWx0ZXJuYXRlIGVuZHBvaW50IGRlc2NyaXB0b3JzIChiaWdnZXIgcGFja2V0cykKKyAqIGFuZCBhICJkZXZpY2UgcXVhbGlmaWVyIiAuLi4gcGx1cyBtb3JlIGNvbnN0cnVjdGlvbiBvcHRpb25zCisgKiBmb3IgdGhlIGNvbmZpZyBkZXNjcmlwdG9yLgorICovCitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCitmc2dfaHNfYnVsa19pbl9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisKKwkvKiBiRW5kcG9pbnRBZGRyZXNzIGNvcGllZCBmcm9tIGZzX2J1bGtfaW5fZGVzYyBkdXJpbmcgZnNnX2JpbmQoKSAqLworCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKKwkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNig1MTIpLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgorZnNnX2hzX2J1bGtfb3V0X2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKKworCS8qIGJFbmRwb2ludEFkZHJlc3MgY29waWVkIGZyb20gZnNfYnVsa19vdXRfZGVzYyBkdXJpbmcgZnNnX2JpbmQoKSAqLworCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKKwkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNig1MTIpLAorCS5iSW50ZXJ2YWwgPQkJMSwJLyogTkFLIGV2ZXJ5IDEgdWZyYW1lICovCit9OworCisjaWZuZGVmIEZTR19OT19JTlRSX0VQCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IKK2ZzZ19oc19pbnRyX2luX2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKKworCS8qIGJFbmRwb2ludEFkZHJlc3MgY29waWVkIGZyb20gZnNfaW50cl9pbl9kZXNjIGR1cmluZyBmc2dfYmluZCgpICovCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCisJLndNYXhQYWNrZXRTaXplID0JY3B1X3RvX2xlMTYoMiksCisJLmJJbnRlcnZhbCA9CQk5LAkvKiAyKiooOS0xKSA9IDI1NiB1ZnJhbWVzIC0+IDMyIG1zICovCit9OworCisjaWZuZGVmIEZTR19OT19PVEcKKyMgIGRlZmluZSBGU0dfSFNfRlVOQ1RJT05fUFJFX0VQX0VOVFJJRVMJMgorI2Vsc2UKKyMgIGRlZmluZSBGU0dfSFNfRlVOQ1RJT05fUFJFX0VQX0VOVFJJRVMJMQorI2VuZGlmCisKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqZnNnX2hzX2Z1bmN0aW9uW10gPSB7CisjaWZuZGVmIEZTR19OT19PVEcKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZnNnX290Z19kZXNjLAorI2VuZGlmCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzZ19pbnRmX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzZ19oc19idWxrX2luX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzZ19oc19idWxrX291dF9kZXNjLAorI2lmbmRlZiBGU0dfTk9fSU5UUl9FUAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZmc2dfaHNfaW50cl9pbl9kZXNjLAorI2VuZGlmCisJTlVMTCwKK307CisKKy8qIE1heHBhY2tldCBhbmQgb3RoZXIgdHJhbnNmZXIgY2hhcmFjdGVyaXN0aWNzIHZhcnkgYnkgc3BlZWQuICovCitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICoKK2ZzZ19lcF9kZXNjKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnLCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmZzLAorCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmhzKQoreworCWlmIChnYWRnZXRfaXNfZHVhbHNwZWVkKGcpICYmIGctPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQorCQlyZXR1cm4gaHM7CisJcmV0dXJuIGZzOworfQorCisKKy8qIFN0YXRpYyBzdHJpbmdzLCBpbiBVVEYtOCAoZm9yIHNpbXBsaWNpdHkgd2UgdXNlIG9ubHkgQVNDSUkgY2hhcmFjdGVycykgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX3N0cmluZwkJZnNnX3N0cmluZ3NbXSA9IHsKKyNpZm5kZWYgRlNHX05PX0RFVklDRV9TVFJJTkdTCisJe0ZTR19TVFJJTkdfTUFOVUZBQ1RVUkVSLAlmc2dfc3RyaW5nX21hbnVmYWN0dXJlcn0sCisJe0ZTR19TVFJJTkdfUFJPRFVDVCwJCWZzZ19zdHJpbmdfcHJvZHVjdH0sCisJe0ZTR19TVFJJTkdfU0VSSUFMLAkJZnNnX3N0cmluZ19zZXJpYWx9LAorCXtGU0dfU1RSSU5HX0NPTkZJRywJCWZzZ19zdHJpbmdfY29uZmlnfSwKKyNlbmRpZgorCXtGU0dfU1RSSU5HX0lOVEVSRkFDRSwJCWZzZ19zdHJpbmdfaW50ZXJmYWNlfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZ2FkZ2V0X3N0cmluZ3MJZnNnX3N0cmluZ3RhYiA9IHsKKwkubGFuZ3VhZ2UJPSAweDA0MDksCQkvKiBlbi11cyAqLworCS5zdHJpbmdzCT0gZnNnX3N0cmluZ3MsCit9OworCisKKyAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBJZiB0aGUgbmV4dCB0d28gcm91dGluZXMgYXJlIGNhbGxlZCB3aGlsZSB0aGUgZ2FkZ2V0IGlzIHJlZ2lzdGVyZWQsCisgKiB0aGUgY2FsbGVyIG11c3Qgb3duIGZzZy0+ZmlsZXNlbSBmb3Igd3JpdGluZy4gKi8KKworc3RhdGljIGludCBmc2dfbHVuX29wZW4oc3RydWN0IGZzZ19sdW4gKmN1cmx1biwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaW50CQkJCXJvOworCXN0cnVjdCBmaWxlCQkJKmZpbHAgPSBOVUxMOworCWludAkJCQlyYyA9IC1FSU5WQUw7CisJc3RydWN0IGlub2RlCQkJKmlub2RlID0gTlVMTDsKKwlsb2ZmX3QJCQkJc2l6ZTsKKwlsb2ZmX3QJCQkJbnVtX3NlY3RvcnM7CisJbG9mZl90CQkJCW1pbl9zZWN0b3JzOworCisJLyogUi9XIGlmIHdlIGNhbiwgUi9PIGlmIHdlIG11c3QgKi8KKwlybyA9IGN1cmx1bi0+aW5pdGlhbGx5X3JvOworCWlmICghcm8pIHsKKwkJZmlscCA9IGZpbHBfb3BlbihmaWxlbmFtZSwgT19SRFdSIHwgT19MQVJHRUZJTEUsIDApOworCQlpZiAoLUVST0ZTID09IFBUUl9FUlIoZmlscCkpCisJCQlybyA9IDE7CisJfQorCWlmIChybykKKwkJZmlscCA9IGZpbHBfb3BlbihmaWxlbmFtZSwgT19SRE9OTFkgfCBPX0xBUkdFRklMRSwgMCk7CisJaWYgKElTX0VSUihmaWxwKSkgeworCQlMSU5GTyhjdXJsdW4sICJ1bmFibGUgdG8gb3BlbiBiYWNraW5nIGZpbGU6ICVzXG4iLCBmaWxlbmFtZSk7CisJCXJldHVybiBQVFJfRVJSKGZpbHApOworCX0KKworCWlmICghKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJcm8gPSAxOworCisJaWYgKGZpbHAtPmZfcGF0aC5kZW50cnkpCisJCWlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlpZiAoaW5vZGUgJiYgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkgeworCQlpZiAoYmRldl9yZWFkX29ubHkoaW5vZGUtPmlfYmRldikpCisJCQlybyA9IDE7CisJfSBlbHNlIGlmICghaW5vZGUgfHwgIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJTElORk8oY3VybHVuLCAiaW52YWxpZCBmaWxlIHR5cGU6ICVzXG4iLCBmaWxlbmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIElmIHdlIGNhbid0IHJlYWQgdGhlIGZpbGUsIGl0J3Mgbm8gZ29vZC4KKwkgKiBJZiB3ZSBjYW4ndCB3cml0ZSB0aGUgZmlsZSwgdXNlIGl0IHJlYWQtb25seS4gKi8KKwlpZiAoIWZpbHAtPmZfb3AgfHwgIShmaWxwLT5mX29wLT5yZWFkIHx8IGZpbHAtPmZfb3AtPmFpb19yZWFkKSkgeworCQlMSU5GTyhjdXJsdW4sICJmaWxlIG5vdCByZWFkYWJsZTogJXNcbiIsIGZpbGVuYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCWlmICghKGZpbHAtPmZfb3AtPndyaXRlIHx8IGZpbHAtPmZfb3AtPmFpb193cml0ZSkpCisJCXJvID0gMTsKKworCXNpemUgPSBpX3NpemVfcmVhZChpbm9kZS0+aV9tYXBwaW5nLT5ob3N0KTsKKwlpZiAoc2l6ZSA8IDApIHsKKwkJTElORk8oY3VybHVuLCAidW5hYmxlIHRvIGZpbmQgZmlsZSBzaXplOiAlc1xuIiwgZmlsZW5hbWUpOworCQlyYyA9IChpbnQpIHNpemU7CisJCWdvdG8gb3V0OworCX0KKwludW1fc2VjdG9ycyA9IHNpemUgPj4gOTsJLyogRmlsZSBzaXplIGluIDUxMi1ieXRlIGJsb2NrcyAqLworCW1pbl9zZWN0b3JzID0gMTsKKwlpZiAoY3VybHVuLT5jZHJvbSkgeworCQludW1fc2VjdG9ycyAmPSB+MzsJLyogUmVkdWNlIHRvIGEgbXVsdGlwbGUgb2YgMjA0OCAqLworCQltaW5fc2VjdG9ycyA9IDMwMCo0OwkvKiBTbWFsbGVzdCB0cmFjayBpcyAzMDAgZnJhbWVzICovCisJCWlmIChudW1fc2VjdG9ycyA+PSAyNTYqNjAqNzUqNCkgeworCQkJbnVtX3NlY3RvcnMgPSAoMjU2KjYwKjc1IC0gMSkgKiA0OworCQkJTElORk8oY3VybHVuLCAiZmlsZSB0b28gYmlnOiAlc1xuIiwgZmlsZW5hbWUpOworCQkJTElORk8oY3VybHVuLCAidXNpbmcgb25seSBmaXJzdCAlZCBibG9ja3NcbiIsCisJCQkJCShpbnQpIG51bV9zZWN0b3JzKTsKKwkJfQorCX0KKwlpZiAobnVtX3NlY3RvcnMgPCBtaW5fc2VjdG9ycykgeworCQlMSU5GTyhjdXJsdW4sICJmaWxlIHRvbyBzbWFsbDogJXNcbiIsIGZpbGVuYW1lKTsKKwkJcmMgPSAtRVRPT1NNQUxMOworCQlnb3RvIG91dDsKKwl9CisKKwlnZXRfZmlsZShmaWxwKTsKKwljdXJsdW4tPnJvID0gcm87CisJY3VybHVuLT5maWxwID0gZmlscDsKKwljdXJsdW4tPmZpbGVfbGVuZ3RoID0gc2l6ZTsKKwljdXJsdW4tPm51bV9zZWN0b3JzID0gbnVtX3NlY3RvcnM7CisJTERCRyhjdXJsdW4sICJvcGVuIGJhY2tpbmcgZmlsZTogJXNcbiIsIGZpbGVuYW1lKTsKKwlyYyA9IDA7CisKK291dDoKKwlmaWxwX2Nsb3NlKGZpbHAsIGN1cnJlbnQtPmZpbGVzKTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHZvaWQgZnNnX2x1bl9jbG9zZShzdHJ1Y3QgZnNnX2x1biAqY3VybHVuKQoreworCWlmIChjdXJsdW4tPmZpbHApIHsKKwkJTERCRyhjdXJsdW4sICJjbG9zZSBiYWNraW5nIGZpbGVcbiIpOworCQlmcHV0KGN1cmx1bi0+ZmlscCk7CisJCWN1cmx1bi0+ZmlscCA9IE5VTEw7CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFN5bmMgdGhlIGZpbGUgZGF0YSwgZG9uJ3QgYm90aGVyIHdpdGggdGhlIG1ldGFkYXRhLgorICogVGhpcyBjb2RlIHdhcyBjb3BpZWQgZnJvbSBmcy9idWZmZXIuYzpzeXNfZmRhdGFzeW5jKCkuICovCitzdGF0aWMgaW50IGZzZ19sdW5fZnN5bmNfc3ViKHN0cnVjdCBmc2dfbHVuICpjdXJsdW4pCit7CisJc3RydWN0IGZpbGUJKmZpbHAgPSBjdXJsdW4tPmZpbHA7CisKKwlpZiAoY3VybHVuLT5ybyB8fCAhZmlscCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHZmc19mc3luYyhmaWxwLCBmaWxwLT5mX3BhdGguZGVudHJ5LCAxKTsKK30KKworc3RhdGljIHZvaWQgc3RvcmVfY2Ryb21fYWRkcmVzcyh1OCAqZGVzdCwgaW50IG1zZiwgdTMyIGFkZHIpCit7CisJaWYgKG1zZikgeworCQkvKiBDb252ZXJ0IHRvIE1pbnV0ZXMtU2Vjb25kcy1GcmFtZXMgKi8KKwkJYWRkciA+Pj0gMjsJCS8qIENvbnZlcnQgdG8gMjA0OC1ieXRlIGZyYW1lcyAqLworCQlhZGRyICs9IDIqNzU7CQkvKiBMZWFkLWluIG9jY3VwaWVzIDIgc2Vjb25kcyAqLworCQlkZXN0WzNdID0gYWRkciAlIDc1OwkvKiBGcmFtZXMgKi8KKwkJYWRkciAvPSA3NTsKKwkJZGVzdFsyXSA9IGFkZHIgJSA2MDsJLyogU2Vjb25kcyAqLworCQlhZGRyIC89IDYwOworCQlkZXN0WzFdID0gYWRkcjsJCS8qIE1pbnV0ZXMgKi8KKwkJZGVzdFswXSA9IDA7CQkvKiBSZXNlcnZlZCAqLworCX0gZWxzZSB7CisJCS8qIEFic29sdXRlIHNlY3RvciAqLworCQlwdXRfdW5hbGlnbmVkX2JlMzIoYWRkciwgZGVzdCk7CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworc3RhdGljIHNzaXplX3QgZnNnX3Nob3dfcm8oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZnNnX2x1bgkqY3VybHVuID0gZnNnX2x1bl9mcm9tX2RldihkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGZzZ19sdW5faXNfb3BlbihjdXJsdW4pCisJCQkJICA/IGN1cmx1bi0+cm8KKwkJCQkgIDogY3VybHVuLT5pbml0aWFsbHlfcm8pOworfQorCitzdGF0aWMgc3NpemVfdCBmc2dfc2hvd19maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZnNnX2x1bgkqY3VybHVuID0gZnNnX2x1bl9mcm9tX2RldihkZXYpOworCXN0cnVjdCByd19zZW1hcGhvcmUJKmZpbGVzZW0gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwljaGFyCQkqcDsKKwlzc2l6ZV90CQlyYzsKKworCWRvd25fcmVhZChmaWxlc2VtKTsKKwlpZiAoZnNnX2x1bl9pc19vcGVuKGN1cmx1bikpIHsJLyogR2V0IHRoZSBjb21wbGV0ZSBwYXRobmFtZSAqLworCQlwID0gZF9wYXRoKCZjdXJsdW4tPmZpbHAtPmZfcGF0aCwgYnVmLCBQQUdFX1NJWkUgLSAxKTsKKwkJaWYgKElTX0VSUihwKSkKKwkJCXJjID0gUFRSX0VSUihwKTsKKwkJZWxzZSB7CisJCQlyYyA9IHN0cmxlbihwKTsKKwkJCW1lbW1vdmUoYnVmLCBwLCByYyk7CisJCQlidWZbcmNdID0gJ1xuJzsJCS8qIEFkZCBhIG5ld2xpbmUgKi8KKwkJCWJ1ZlsrK3JjXSA9IDA7CisJCX0KKwl9IGVsc2UgewkJCQkvKiBObyBmaWxlLCByZXR1cm4gMCBieXRlcyAqLworCQkqYnVmID0gMDsKKwkJcmMgPSAwOworCX0KKwl1cF9yZWFkKGZpbGVzZW0pOworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgc3NpemVfdCBmc2dfc3RvcmVfcm8oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzc2l6ZV90CQlyYyA9IGNvdW50OworCXN0cnVjdCBmc2dfbHVuCSpjdXJsdW4gPSBmc2dfbHVuX2Zyb21fZGV2KGRldik7CisJc3RydWN0IHJ3X3NlbWFwaG9yZQkqZmlsZXNlbSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludAkJaTsKKworCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmaSkgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBBbGxvdyB0aGUgd3JpdGUtZW5hYmxlIHN0YXR1cyB0byBjaGFuZ2Ugb25seSB3aGlsZSB0aGUgYmFja2luZyBmaWxlCisJICogaXMgY2xvc2VkLiAqLworCWRvd25fcmVhZChmaWxlc2VtKTsKKwlpZiAoZnNnX2x1bl9pc19vcGVuKGN1cmx1bikpIHsKKwkJTERCRyhjdXJsdW4sICJyZWFkLW9ubHkgc3RhdHVzIGNoYW5nZSBwcmV2ZW50ZWRcbiIpOworCQlyYyA9IC1FQlVTWTsKKwl9IGVsc2UgeworCQljdXJsdW4tPnJvID0gISFpOworCQljdXJsdW4tPmluaXRpYWxseV9ybyA9ICEhaTsKKwkJTERCRyhjdXJsdW4sICJyZWFkLW9ubHkgc3RhdHVzIHNldCB0byAlZFxuIiwgY3VybHVuLT5ybyk7CisJfQorCXVwX3JlYWQoZmlsZXNlbSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3NpemVfdCBmc2dfc3RvcmVfZmlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGZzZ19sdW4JKmN1cmx1biA9IGZzZ19sdW5fZnJvbV9kZXYoZGV2KTsKKwlzdHJ1Y3Qgcndfc2VtYXBob3JlCSpmaWxlc2VtID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50CQlyYyA9IDA7CisKKwlpZiAoY3VybHVuLT5wcmV2ZW50X21lZGl1bV9yZW1vdmFsICYmIGZzZ19sdW5faXNfb3BlbihjdXJsdW4pKSB7CisJCUxEQkcoY3VybHVuLCAiZWplY3QgYXR0ZW1wdCBwcmV2ZW50ZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOwkJCQkvKiAiRG9vciBpcyBsb2NrZWQiICovCisJfQorCisJLyogUmVtb3ZlIGEgdHJhaWxpbmcgbmV3bGluZSAqLworCWlmIChjb3VudCA+IDAgJiYgYnVmW2NvdW50LTFdID09ICdcbicpCisJCSgoY2hhciAqKSBidWYpW2NvdW50LTFdID0gMDsJCS8qIFVnaCEgKi8KKworCS8qIEVqZWN0IGN1cnJlbnQgbWVkaXVtICovCisJZG93bl93cml0ZShmaWxlc2VtKTsKKwlpZiAoZnNnX2x1bl9pc19vcGVuKGN1cmx1bikpIHsKKwkJZnNnX2x1bl9jbG9zZShjdXJsdW4pOworCQljdXJsdW4tPnVuaXRfYXR0ZW50aW9uX2RhdGEgPSBTU19NRURJVU1fTk9UX1BSRVNFTlQ7CisJfQorCisJLyogTG9hZCBuZXcgbWVkaXVtICovCisJaWYgKGNvdW50ID4gMCAmJiBidWZbMF0pIHsKKwkJcmMgPSBmc2dfbHVuX29wZW4oY3VybHVuLCBidWYpOworCQlpZiAocmMgPT0gMCkKKwkJCWN1cmx1bi0+dW5pdF9hdHRlbnRpb25fZGF0YSA9CisJCQkJCVNTX05PVF9SRUFEWV9UT19SRUFEWV9UUkFOU0lUSU9OOworCX0KKwl1cF93cml0ZShmaWxlc2VtKTsKKwlyZXR1cm4gKHJjIDwgMCA/IHJjIDogY291bnQpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZXRoZXIuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC91X2V0aGVyLmgKaW5kZXggOTFiMzlmZi4uZmQ1NWY0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZXRoZXIuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9ldGhlci5oCkBAIC0xMTIsNyArMTEyLDcgQEAKIGludCBlY21fYmluZF9jb25maWcoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uICpjLCB1OCBldGhhZGRyW0VUSF9BTEVOXSk7CiBpbnQgZWVtX2JpbmRfY29uZmlnKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbiAqYyk7CiAKLSNpZmRlZiBDT05GSUdfVVNCX0VUSF9STkRJUworI2lmZGVmIFVTQl9FVEhfUk5ESVMKIAogaW50IHJuZGlzX2JpbmRfY29uZmlnKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbiAqYywgdTggZXRoYWRkcltFVEhfQUxFTl0pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKaW5kZXggOWI0M2IyMi4uMjY3OGExNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZwpAQCAtOTAsMTQgKzkwLDI1IEBACiAKIGNvbmZpZyBVU0JfRUhDSV9CSUdfRU5ESUFOX01NSU8KIAlib29sCi0JZGVwZW5kcyBvbiBVU0JfRUhDSV9IQ0QgJiYgKFBQQ19DRUxMRUIgfHwgUFBDX1BTMyB8fCA0NDBFUFggfHwgQVJDSF9JWFA0WFgpCisJZGVwZW5kcyBvbiBVU0JfRUhDSV9IQ0QgJiYgKFBQQ19DRUxMRUIgfHwgUFBDX1BTMyB8fCA0NDBFUFggfHwgQVJDSF9JWFA0WFggfHwgWFBTX1VTQl9IQ0RfWElMSU5YKQogCWRlZmF1bHQgeQogCiBjb25maWcgVVNCX0VIQ0lfQklHX0VORElBTl9ERVNDCiAJYm9vbAotCWRlcGVuZHMgb24gVVNCX0VIQ0lfSENEICYmICg0NDBFUFggfHwgQVJDSF9JWFA0WFgpCisJZGVwZW5kcyBvbiBVU0JfRUhDSV9IQ0QgJiYgKDQ0MEVQWCB8fCBBUkNIX0lYUDRYWCB8fCBYUFNfVVNCX0hDRF9YSUxJTlgpCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBYUFNfVVNCX0hDRF9YSUxJTlgKKwlib29sICJVc2UgWGlsaW54IHVzYiBob3N0IEVIQ0kgY29udHJvbGxlciBjb3JlIgorCWRlcGVuZHMgb24gVVNCX0VIQ0lfSENEICYmIChQUEMzMiB8fCBNSUNST0JMQVpFKQorCXNlbGVjdCBVU0JfRUhDSV9CSUdfRU5ESUFOX0RFU0MKKwlzZWxlY3QgVVNCX0VIQ0lfQklHX0VORElBTl9NTUlPCisJLS0taGVscC0tLQorCQlYaWxpbnggeHBzIFVTQiBob3N0IGNvbnRyb2xsZXIgY29yZSBpcyBFSENJIGNvbXBpbGFudCBhbmQgaGFzCisJCXRyYW5zYWN0aW9uIHRyYW5zbGF0b3IgYnVpbHQtaW4uIEl0IGNhbiBiZSBjb25maWd1cmVkIHRvIGVpdGhlcgorCQlzdXBwb3J0IGJvdGggaGlnaCBzcGVlZCBhbmQgZnVsbCBzcGVlZCBkZXZpY2VzLCBvciBoaWdoIHNwZWVkCisJCWRldmljZXMgb25seS4KKwogY29uZmlnIFVTQl9FSENJX0ZTTAogCWJvb2wgIlN1cHBvcnQgZm9yIEZyZWVzY2FsZSBvbi1jaGlwIEVIQ0kgVVNCIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBVU0JfRUhDSV9IQ0QgJiYgRlNMX1NPQwpAQCAtMTA1LDYgKzExNiwxMyBAQAogCS0tLWhlbHAtLS0KIAkgIFZhcmlhdGlvbiBvZiBBUkMgVVNCIGJsb2NrIHVzZWQgaW4gc29tZSBGcmVlc2NhbGUgY2hpcHMuCiAKK2NvbmZpZyBVU0JfRUhDSV9NWEMKKwlib29sICJTdXBwb3J0IGZvciBGcmVlc2NhbGUgb24tY2hpcCBFSENJIFVTQiBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gVVNCX0VIQ0lfSENEICYmIEFSQ0hfTVhDCisJc2VsZWN0IFVTQl9FSENJX1JPT1RfSFVCX1RUCisJLS0taGVscC0tLQorCSAgVmFyaWF0aW9uIG9mIEFSQyBVU0IgYmxvY2sgdXNlZCBpbiBzb21lIEZyZWVzY2FsZSBjaGlwcy4KKwogY29uZmlnIFVTQl9FSENJX0hDRF9QUENfT0YKIAlib29sICJFSENJIHN1cHBvcnQgZm9yIFBQQyBVU0IgY29udHJvbGxlciBvbiBPRiBwbGF0Zm9ybSBidXMiCiAJZGVwZW5kcyBvbiBVU0JfRUhDSV9IQ0QgJiYgUFBDX09GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKaW5kZXggZDhmNGFhYS4uNTg1OTUyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYwpAQCAtNTQ5LDcgKzU0OSw3IEBACiAJLyogY29udHJvbGxlcnMgbWF5IGNhY2hlIHNvbWUgb2YgdGhlIHBlcmlvZGljIHNjaGVkdWxlIC4uLiAqLwogCWhjY19wYXJhbXMgPSBlaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5jYXBzLT5oY2NfcGFyYW1zKTsKIAlpZiAoSENDX0lTT0NfQ0FDSEUoaGNjX3BhcmFtcykpCQkvLyBmdWxsIGZyYW1lIGNhY2hlCi0JCWVoY2ktPmlfdGhyZXNoID0gODsKKwkJZWhjaS0+aV90aHJlc2ggPSAyICsgODsKIAllbHNlCQkJCQkvLyBOIG1pY3JvZnJhbWVzIGNhY2hlZAogCQllaGNpLT5pX3RocmVzaCA9IDIgKyBIQ0NfSVNPQ19USFJFUyhoY2NfcGFyYW1zKTsKIApAQCAtNjA1LDYgKzYwNSw4IEBACiAJfQogCWVoY2ktPmNvbW1hbmQgPSB0ZW1wOwogCisJLyogQWNjZXB0IGFyYml0cmFyaWx5IGxvbmcgc2NhdHRlci1nYXRoZXIgbGlzdHMgKi8KKwloY2QtPnNlbGYuc2dfdGFibGVzaXplID0gfjA7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExMDUsMTEgKzExMDcsMjEgQEAKICNkZWZpbmUJUExBVEZPUk1fRFJJVkVSCQllaGNpX2ZzbF9kcml2ZXIKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1VTQl9FSENJX01YQworI2luY2x1ZGUgImVoY2ktbXhjLmMiCisjZGVmaW5lIFBMQVRGT1JNX0RSSVZFUgkJZWhjaV9teGNfZHJpdmVyCisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19TT0NfQVUxMjAwCiAjaW5jbHVkZSAiZWhjaS1hdTF4eHguYyIKICNkZWZpbmUJUExBVEZPUk1fRFJJVkVSCQllaGNpX2hjZF9hdTF4eHhfZHJpdmVyCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19BUkNIX09NQVAzNFhYCisjaW5jbHVkZSAiZWhjaS1vbWFwLmMiCisjZGVmaW5lICAgICAgICBQTEFURk9STV9EUklWRVIgICAgICAgICBlaGNpX2hjZF9vbWFwX2RyaXZlcgorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfUFBDX1BTMwogI2luY2x1ZGUgImVoY2ktcHMzLmMiCiAjZGVmaW5lCVBTM19TWVNURU1fQlVTX0RSSVZFUglwczNfZWhjaV9kcml2ZXIKQEAgLTExMjAsNiArMTEzMiwxMSBAQAogI2RlZmluZSBPRl9QTEFURk9STV9EUklWRVIJZWhjaV9oY2RfcHBjX29mX2RyaXZlcgogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfWFBTX1VTQl9IQ0RfWElMSU5YCisjaW5jbHVkZSAiZWhjaS14aWxpbngtb2YuYyIKKyNkZWZpbmUgT0ZfUExBVEZPUk1fRFJJVkVSCWVoY2lfaGNkX3hpbGlueF9vZl9kcml2ZXIKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1BMQVRfT1JJT04KICNpbmNsdWRlICJlaGNpLW9yaW9uLmMiCiAjZGVmaW5lCVBMQVRGT1JNX0RSSVZFUgkJZWhjaV9vcmlvbl9kcml2ZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYwppbmRleCAxYjZmMWMwLi4yYzY1NzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jCkBAIC0yMzYsNyArMjM2LDcgQEAKIAl9CiAKIAlpZiAodW5saWtlbHkoZWhjaS0+ZGVidWcpKSB7Ci0JCWlmIChlaGNpLT5kZWJ1ZyAmJiAhZGJncF9yZXNldF9wcmVwKCkpCisJCWlmICghZGJncF9yZXNldF9wcmVwKCkpCiAJCQllaGNpLT5kZWJ1ZyA9IE5VTEw7CiAJCWVsc2UKIAkJCWRiZ3BfZXh0ZXJuYWxfc3RhcnR1cCgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLW14Yy5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLW14Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YzU2ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktbXhjLmMKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2FzY2hhIEhhdWVyIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRlPiwgUGVuZ3V0cm9uaXgKKyAqIENvcHlyaWdodCAoYykgMjAwOSBEYW5pZWwgTWFjayA8ZGFuaWVsQGNhaWFxLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKKyAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KKworI2luY2x1ZGUgPG1hY2gvbXhjX2VoY2kuaD4KKworI2RlZmluZSBVTFBJX1ZJRVdQT1JUX09GRlNFVAkweDE3MAorI2RlZmluZSBQT1JUU0NfT0ZGU0VUCQkweDE4NAorI2RlZmluZSBVU0JNT0RFX09GRlNFVAkJMHgxYTgKKyNkZWZpbmUgVVNCTU9ERV9DTV9IT1NUCQkzCisKK3N0cnVjdCBlaGNpX214Y19wcml2IHsKKwlzdHJ1Y3QgY2xrICp1c2JjbGssICphaGJjbGs7CisJc3RydWN0IHVzYl9oY2QgKmhjZDsKK307CisKKy8qIGNhbGxlZCBkdXJpbmcgcHJvYmUoKSBhZnRlciBjaGlwIHJlc2V0IGNvbXBsZXRlcyAqLworc3RhdGljIGludCBlaGNpX214Y19zZXR1cChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXN0cnVjdCBlaGNpX2hjZCAqZWhjaSA9IGhjZF90b19laGNpKGhjZCk7CisJaW50IHJldHZhbDsKKworCS8qIEVIQ0kgcmVnaXN0ZXJzIHN0YXJ0IGF0IG9mZnNldCAweDEwMCAqLworCWVoY2ktPmNhcHMgPSBoY2QtPnJlZ3MgKyAweDEwMDsKKwllaGNpLT5yZWdzID0gaGNkLT5yZWdzICsgMHgxMDAgKworCSAgICBIQ19MRU5HVEgoZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+Y2Fwcy0+aGNfY2FwYmFzZSkpOworCWRiZ19oY3NfcGFyYW1zKGVoY2ksICJyZXNldCIpOworCWRiZ19oY2NfcGFyYW1zKGVoY2ksICJyZXNldCIpOworCisJLyogY2FjaGUgdGhpcyByZWFkb25seSBkYXRhOyBtaW5pbWl6ZSBjaGlwIHJlYWRzICovCisJZWhjaS0+aGNzX3BhcmFtcyA9IGVoY2lfcmVhZGwoZWhjaSwgJmVoY2ktPmNhcHMtPmhjc19wYXJhbXMpOworCisJcmV0dmFsID0gZWhjaV9oYWx0KGVoY2kpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwkvKiBkYXRhIHN0cnVjdHVyZSBpbml0ICovCisJcmV0dmFsID0gZWhjaV9pbml0KGhjZCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWhjZC0+aGFzX3R0ID0gMTsKKworCWVoY2ktPnNicm4gPSAweDIwOworCisJZWhjaV9yZXNldChlaGNpKTsKKworCWVoY2lfcG9ydF9wb3dlcihlaGNpLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoY19kcml2ZXIgZWhjaV9teGNfaGNfZHJpdmVyID0geworCS5kZXNjcmlwdGlvbiA9IGhjZF9uYW1lLAorCS5wcm9kdWN0X2Rlc2MgPSAiRnJlZXNjYWxlIE9uLUNoaXAgRUhDSSBIb3N0IENvbnRyb2xsZXIiLAorCS5oY2RfcHJpdl9zaXplID0gc2l6ZW9mKHN0cnVjdCBlaGNpX2hjZCksCisKKwkvKgorCSAqIGdlbmVyaWMgaGFyZHdhcmUgbGlua2FnZQorCSAqLworCS5pcnEgPSBlaGNpX2lycSwKKwkuZmxhZ3MgPSBIQ0RfVVNCMiB8IEhDRF9NRU1PUlksCisKKwkvKgorCSAqIGJhc2ljIGxpZmVjeWNsZSBvcGVyYXRpb25zCisJICovCisJLnJlc2V0ID0gZWhjaV9teGNfc2V0dXAsCisJLnN0YXJ0ID0gZWhjaV9ydW4sCisJLnN0b3AgPSBlaGNpX3N0b3AsCisJLnNodXRkb3duID0gZWhjaV9zaHV0ZG93biwKKworCS8qCisJICogbWFuYWdpbmcgaS9vIHJlcXVlc3RzIGFuZCBhc3NvY2lhdGVkIGRldmljZSByZXNvdXJjZXMKKwkgKi8KKwkudXJiX2VucXVldWUgPSBlaGNpX3VyYl9lbnF1ZXVlLAorCS51cmJfZGVxdWV1ZSA9IGVoY2lfdXJiX2RlcXVldWUsCisJLmVuZHBvaW50X2Rpc2FibGUgPSBlaGNpX2VuZHBvaW50X2Rpc2FibGUsCisKKwkvKgorCSAqIHNjaGVkdWxpbmcgc3VwcG9ydAorCSAqLworCS5nZXRfZnJhbWVfbnVtYmVyID0gZWhjaV9nZXRfZnJhbWUsCisKKwkvKgorCSAqIHJvb3QgaHViIHN1cHBvcnQKKwkgKi8KKwkuaHViX3N0YXR1c19kYXRhID0gZWhjaV9odWJfc3RhdHVzX2RhdGEsCisJLmh1Yl9jb250cm9sID0gZWhjaV9odWJfY29udHJvbCwKKwkuYnVzX3N1c3BlbmQgPSBlaGNpX2J1c19zdXNwZW5kLAorCS5idXNfcmVzdW1lID0gZWhjaV9idXNfcmVzdW1lLAorCS5yZWxpbnF1aXNoX3BvcnQgPSBlaGNpX3JlbGlucXVpc2hfcG9ydCwKKwkucG9ydF9oYW5kZWRfb3ZlciA9IGVoY2lfcG9ydF9oYW5kZWRfb3ZlciwKK307CisKK3N0YXRpYyBpbnQgZWhjaV9teGNfZHJ2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHVzYl9oY2QgKmhjZDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaXJxLCByZXQsIHRlbXA7CisJc3RydWN0IGVoY2lfbXhjX3ByaXYgKnByaXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJpbml0aWFsaXppbmcgaS5NWCBVU0IgQ29udHJvbGxlclxuIik7CisKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIoZGV2LCAiTm8gcGxhdGZvcm0gZGF0YSBnaXZlbiwgYmFpbGluZyBvdXQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKworCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZlaGNpX214Y19oY19kcml2ZXIsIGRldiwgZGV2X25hbWUoZGV2KSk7CisJaWYgKCFoY2QpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycihkZXYsICJGb3VuZCBIQyB3aXRoIG5vIHJlZ2lzdGVyIGFkZHIuIENoZWNrIHNldHVwIVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2dldF9yZXNvdXJjZTsKKwl9CisKKwloY2QtPnJzcmNfc3RhcnQgPSByZXMtPnN0YXJ0OworCWhjZC0+cnNyY19sZW4gPSByZXNvdXJjZV9zaXplKHJlcyk7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4sIGhjZF9uYW1lKSkgeworCQlkZXZfZGJnKGRldiwgImNvbnRyb2xsZXIgYWxyZWFkeSBpbiB1c2VcbiIpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyX3JlcXVlc3RfbWVtOworCX0KKworCWhjZC0+cmVncyA9IGlvcmVtYXAoaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKKwlpZiAoIWhjZC0+cmVncykgeworCQlkZXZfZXJyKGRldiwgImVycm9yIG1hcHBpbmcgbWVtb3J5XG4iKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJfaW9yZW1hcDsKKwl9CisKKwkvKiBlbmFibGUgY2xvY2tzICovCisJcHJpdi0+dXNiY2xrID0gY2xrX2dldChkZXYsICJ1c2IiKTsKKwlpZiAoSVNfRVJSKHByaXYtPnVzYmNsaykpIHsKKwkJcmV0ID0gUFRSX0VSUihwcml2LT51c2JjbGspOworCQlnb3RvIGVycl9jbGs7CisJfQorCWNsa19lbmFibGUocHJpdi0+dXNiY2xrKTsKKworCWlmICghY3B1X2lzX214MzUoKSkgeworCQlwcml2LT5haGJjbGsgPSBjbGtfZ2V0KGRldiwgInVzYl9haGIiKTsKKwkJaWYgKElTX0VSUihwcml2LT5haGJjbGspKSB7CisJCQlyZXQgPSBQVFJfRVJSKHByaXYtPmFoYmNsayk7CisJCQlnb3RvIGVycl9jbGtfYWhiOworCQl9CisJCWNsa19lbmFibGUocHJpdi0+YWhiY2xrKTsKKwl9CisKKwkvKiBzZXQgVVNCTU9ERSB0byBob3N0IG1vZGUgKi8KKwl0ZW1wID0gcmVhZGwoaGNkLT5yZWdzICsgVVNCTU9ERV9PRkZTRVQpOworCXdyaXRlbCh0ZW1wIHwgVVNCTU9ERV9DTV9IT1NULCBoY2QtPnJlZ3MgKyBVU0JNT0RFX09GRlNFVCk7CisKKwkvKiBzZXQgdXAgdGhlIFBPUlRTQ3ggcmVnaXN0ZXIgKi8KKwl3cml0ZWwocGRhdGEtPnBvcnRzYywgaGNkLT5yZWdzICsgUE9SVFNDX09GRlNFVCk7CisJbWRlbGF5KDEwKTsKKworCS8qIHNldHVwIFVTQkNPTlRST0wuICovCisJcmV0ID0gbXhjX3NldF91c2Jjb250cm9sKHBkZXYtPmlkLCBwZGF0YS0+ZmxhZ3MpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9pbml0OworCisJLyogY2FsbCBwbGF0Zm9ybSBzcGVjaWZpYyBpbml0IGZ1bmN0aW9uICovCisJaWYgKHBkYXRhLT5pbml0KSB7CisJCXJldCA9IHBkYXRhLT5pbml0KHBkZXYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgInBsYXRmb3JtIGluaXQgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZXJyX2luaXQ7CisJCX0KKwl9CisKKwkvKiBtb3N0IHBsYXRmb3JtcyBuZWVkIHNvbWUgdGltZSB0byBzZXR0bGUgY2hhbmdlZCBJTyBzZXR0aW5ncyAqLworCW1kZWxheSgxMCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSB0cmFuc2NlaXZlciAqLworCWlmIChwZGF0YS0+b3RnKSB7CisJCXBkYXRhLT5vdGctPmlvX3ByaXYgPSBoY2QtPnJlZ3MgKyBVTFBJX1ZJRVdQT1JUX09GRlNFVDsKKwkJaWYgKG90Z19pbml0KHBkYXRhLT5vdGcpICE9IDApCisJCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBpbml0IHRyYW5zY2VpdmVyXG4iKTsKKwkJZWxzZSBpZiAob3RnX3NldF92YnVzKHBkYXRhLT5vdGcsIDEpICE9IDApCisJCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBlbmFibGUgdmJ1cyBvbiB0cmFuc2NlaXZlclxuIik7CisJfQorCisJcHJpdi0+aGNkID0gaGNkOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOworCisJcmV0ID0gdXNiX2FkZF9oY2QoaGNkLCBpcnEsIElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfYWRkOworCisJcmV0dXJuIDA7CisKK2Vycl9hZGQ6CisJaWYgKHBkYXRhICYmIHBkYXRhLT5leGl0KQorCQlwZGF0YS0+ZXhpdChwZGV2KTsKK2Vycl9pbml0OgorCWlmIChwcml2LT5haGJjbGspIHsKKwkJY2xrX2Rpc2FibGUocHJpdi0+YWhiY2xrKTsKKwkJY2xrX3B1dChwcml2LT5haGJjbGspOworCX0KK2Vycl9jbGtfYWhiOgorCWNsa19kaXNhYmxlKHByaXYtPnVzYmNsayk7CisJY2xrX3B1dChwcml2LT51c2JjbGspOworZXJyX2NsazoKKwlpb3VubWFwKGhjZC0+cmVncyk7CitlcnJfaW9yZW1hcDoKKwlyZWxlYXNlX21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKK2Vycl9yZXF1ZXN0X21lbToKK2Vycl9nZXRfcmVzb3VyY2U6CisJa2ZyZWUocHJpdik7CitlcnJfYWxsb2M6CisJdXNiX3B1dF9oY2QoaGNkKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCBlaGNpX214Y19kcnZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGVoY2lfbXhjX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcHJpdi0+aGNkOworCisJaWYgKHBkYXRhICYmIHBkYXRhLT5leGl0KQorCQlwZGF0YS0+ZXhpdChwZGV2KTsKKworCWlmIChwZGF0YS0+b3RnKQorCQlvdGdfc2h1dGRvd24ocGRhdGEtPm90Zyk7CisKKwl1c2JfcmVtb3ZlX2hjZChoY2QpOworCWlvdW5tYXAoaGNkLT5yZWdzKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKKwl1c2JfcHV0X2hjZChoY2QpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJY2xrX2Rpc2FibGUocHJpdi0+dXNiY2xrKTsKKwljbGtfcHV0KHByaXYtPnVzYmNsayk7CisJaWYgKHByaXYtPmFoYmNsaykgeworCQljbGtfZGlzYWJsZShwcml2LT5haGJjbGspOworCQljbGtfcHV0KHByaXYtPmFoYmNsayk7CisJfQorCisJa2ZyZWUocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZWhjaV9teGNfZHJ2X3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGVoY2lfbXhjX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcHJpdi0+aGNkOworCisJaWYgKGhjZC0+ZHJpdmVyLT5zaHV0ZG93bikKKwkJaGNkLT5kcml2ZXItPnNodXRkb3duKGhjZCk7Cit9CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06bXhjLWVoY2kiKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZWhjaV9teGNfZHJpdmVyID0geworCS5wcm9iZSA9IGVoY2lfbXhjX2Rydl9wcm9iZSwKKwkucmVtb3ZlID0gX19leGl0X3AoZWhjaV9teGNfZHJ2X3JlbW92ZSksCisJLnNodXRkb3duID0gZWhjaV9teGNfZHJ2X3NodXRkb3duLAorCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gIm14Yy1laGNpIiwKKwl9LAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1vbWFwLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktb21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZjFhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktb21hcC5jCkBAIC0wLDAgKzEsNzU2IEBACisvKgorICogZWhjaS1vbWFwLmMgLSBkcml2ZXIgZm9yIFVTQkhPU1Qgb24gT01BUCAzNHh4IHByb2Nlc3NvcgorICoKKyAqIEJ1cyBHbHVlIGZvciBPTUFQMzR4eCBVU0JIT1NUIDMgcG9ydCBFSENJIGNvbnRyb2xsZXIKKyAqIFRlc3RlZCBvbiBPTUFQMzQzMCBFUzIuMCBTRFAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoJQXV0aG9yOiBWaWtyYW0gUGFuZGl0YSA8dmlrcmFtLnBhbmRpdGFAdGkuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgorICoJQ29udGFjdDogRmVsaXBlIEJhbGJpIDxmZWxpcGUuYmFsYmlAbm9raWEuY29tPgorICoKKyAqIEJhc2VkIG9uICJlaGNpLWZzbC5jIiBhbmQgImVoY2ktYXUxeHh4LmMiIGVoY2kgZ2x1ZSBsYXllcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBUT0RPIChsYXN0IHVwZGF0ZWQgRmViIDIzcmQsIDIwMDkpOgorICoJLSBhZGQga2VybmVsLWRvYworICoJLSBlbmFibGUgQVVUT0lETEUKKyAqCS0gbW92ZSBEUExMNSBwcm9ncmFtbWluZyB0byBjbG9jayBmdworICoJLSBhZGQgc3VzcGVuZC9yZXN1bWUKKyAqCS0gbW92ZSB3b3JrYXJvdW5kcyB0byBib2FyZC1maWxlcworICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC91c2IuaD4KKworLyoKKyAqIE9NQVAgVVNCSE9TVCBSZWdpc3RlciBhZGRyZXNzZXM6IFZJUlRVQUwgQUREUkVTU0VTCisgKglVc2UgZWhjaV9vbWFwX3JlYWRsKCkvZWhjaV9vbWFwX3dyaXRlbCgpIGZ1bmN0aW9ucworICovCisKKy8qIFRMTCBSZWdpc3RlciBTZXQgKi8KKyNkZWZpbmUJT01BUF9VU0JUTExfUkVWSVNJT04JCQkJKDB4MDApCisjZGVmaW5lCU9NQVBfVVNCVExMX1NZU0NPTkZJRwkJCQkoMHgxMCkKKyNkZWZpbmUJT01BUF9VU0JUTExfU1lTQ09ORklHX0NBQ1RJVklUWQkJCSgxIDw8IDgpCisjZGVmaW5lCU9NQVBfVVNCVExMX1NZU0NPTkZJR19TSURMRU1PREUJCQkoMSA8PCAzKQorI2RlZmluZQlPTUFQX1VTQlRMTF9TWVNDT05GSUdfRU5BV0FLRVVQCQkJKDEgPDwgMikKKyNkZWZpbmUJT01BUF9VU0JUTExfU1lTQ09ORklHX1NPRlRSRVNFVAkJCSgxIDw8IDEpCisjZGVmaW5lCU9NQVBfVVNCVExMX1NZU0NPTkZJR19BVVRPSURMRQkJCSgxIDw8IDApCisKKyNkZWZpbmUJT01BUF9VU0JUTExfU1lTU1RBVFVTCQkJCSgweDE0KQorI2RlZmluZQlPTUFQX1VTQlRMTF9TWVNTVEFUVVNfUkVTRVRET05FCQkJKDEgPDwgMCkKKworI2RlZmluZQlPTUFQX1VTQlRMTF9JUlFTVEFUVVMJCQkJKDB4MTgpCisjZGVmaW5lCU9NQVBfVVNCVExMX0lSUUVOQUJMRQkJCQkoMHgxQykKKworI2RlZmluZQlPTUFQX1RMTF9TSEFSRURfQ09ORgkJCQkoMHgzMCkKKyNkZWZpbmUJT01BUF9UTExfU0hBUkVEX0NPTkZfVVNCXzkwRF9ERFJfRU4JCSgxIDw8IDYpCisjZGVmaW5lCU9NQVBfVExMX1NIQVJFRF9DT05GX1VTQl8xODBEX1NEUl9FTgkJKDEgPDwgNSkKKyNkZWZpbmUJT01BUF9UTExfU0hBUkVEX0NPTkZfVVNCX0RJVlJBVElPTgkJKDEgPDwgMikKKyNkZWZpbmUJT01BUF9UTExfU0hBUkVEX0NPTkZfRkNMS19SRVEJCQkoMSA8PCAxKQorI2RlZmluZQlPTUFQX1RMTF9TSEFSRURfQ09ORl9GQ0xLX0lTX09OCQkJKDEgPDwgMCkKKworI2RlZmluZQlPTUFQX1RMTF9DSEFOTkVMX0NPTkYobnVtKQkJCSgweDA0MCArIDB4MDA0ICogbnVtKQorI2RlZmluZQlPTUFQX1RMTF9DSEFOTkVMX0NPTkZfVUxQSU5PQklUU1RVRkYJCSgxIDw8IDExKQorI2RlZmluZQlPTUFQX1RMTF9DSEFOTkVMX0NPTkZfVUxQSV9VTFBJQVVUT0lETEUJCSgxIDw8IDEwKQorI2RlZmluZQlPTUFQX1RMTF9DSEFOTkVMX0NPTkZfVVRNSUFVVE9JRExFCQkoMSA8PCA5KQorI2RlZmluZQlPTUFQX1RMTF9DSEFOTkVMX0NPTkZfVUxQSUREUk1PREUJCSgxIDw8IDgpCisjZGVmaW5lCU9NQVBfVExMX0NIQU5ORUxfQ09ORl9DSEFORU4JCQkoMSA8PCAwKQorCisjZGVmaW5lCU9NQVBfVExMX1VMUElfRlVOQ1RJT05fQ1RSTChudW0pCQkoMHg4MDQgKyAweDEwMCAqIG51bSkKKyNkZWZpbmUJT01BUF9UTExfVUxQSV9JTlRFUkZBQ0VfQ1RSTChudW0pCQkoMHg4MDcgKyAweDEwMCAqIG51bSkKKyNkZWZpbmUJT01BUF9UTExfVUxQSV9PVEdfQ1RSTChudW0pCQkJKDB4ODBBICsgMHgxMDAgKiBudW0pCisjZGVmaW5lCU9NQVBfVExMX1VMUElfSU5UX0VOX1JJU0UobnVtKQkJCSgweDgwRCArIDB4MTAwICogbnVtKQorI2RlZmluZQlPTUFQX1RMTF9VTFBJX0lOVF9FTl9GQUxMKG51bSkJCQkoMHg4MTAgKyAweDEwMCAqIG51bSkKKyNkZWZpbmUJT01BUF9UTExfVUxQSV9JTlRfU1RBVFVTKG51bSkJCQkoMHg4MTMgKyAweDEwMCAqIG51bSkKKyNkZWZpbmUJT01BUF9UTExfVUxQSV9JTlRfTEFUQ0gobnVtKQkJCSgweDgxNCArIDB4MTAwICogbnVtKQorI2RlZmluZQlPTUFQX1RMTF9VTFBJX0RFQlVHKG51bSkJCQkoMHg4MTUgKyAweDEwMCAqIG51bSkKKyNkZWZpbmUJT01BUF9UTExfVUxQSV9TQ1JBVENIX1JFR0lTVEVSKG51bSkJCSgweDgxNiArIDB4MTAwICogbnVtKQorCisjZGVmaW5lIE9NQVBfVExMX0NIQU5ORUxfQ09VTlQJCQkJMworI2RlZmluZSBPTUFQX1RMTF9DSEFOTkVMXzFfRU5fTUFTSwkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVBfVExMX0NIQU5ORUxfMl9FTl9NQVNLCQkJKDEgPDwgMikKKyNkZWZpbmUgT01BUF9UTExfQ0hBTk5FTF8zX0VOX01BU0sJCQkoMSA8PCA0KQorCisvKiBVSEggUmVnaXN0ZXIgU2V0ICovCisjZGVmaW5lCU9NQVBfVUhIX1JFVklTSU9OCQkJCSgweDAwKQorI2RlZmluZQlPTUFQX1VISF9TWVNDT05GSUcJCQkJKDB4MTApCisjZGVmaW5lCU9NQVBfVUhIX1NZU0NPTkZJR19NSURMRU1PREUJCQkoMSA8PCAxMikKKyNkZWZpbmUJT01BUF9VSEhfU1lTQ09ORklHX0NBQ1RJVklUWQkJCSgxIDw8IDgpCisjZGVmaW5lCU9NQVBfVUhIX1NZU0NPTkZJR19TSURMRU1PREUJCQkoMSA8PCAzKQorI2RlZmluZQlPTUFQX1VISF9TWVNDT05GSUdfRU5BV0FLRVVQCQkJKDEgPDwgMikKKyNkZWZpbmUJT01BUF9VSEhfU1lTQ09ORklHX1NPRlRSRVNFVAkJCSgxIDw8IDEpCisjZGVmaW5lCU9NQVBfVUhIX1NZU0NPTkZJR19BVVRPSURMRQkJCSgxIDw8IDApCisKKyNkZWZpbmUJT01BUF9VSEhfU1lTU1RBVFVTCQkJCSgweDE0KQorI2RlZmluZQlPTUFQX1VISF9IT1NUQ09ORklHCQkJCSgweDQwKQorI2RlZmluZQlPTUFQX1VISF9IT1NUQ09ORklHX1VMUElfQllQQVNTCQkJKDEgPDwgMCkKKyNkZWZpbmUJT01BUF9VSEhfSE9TVENPTkZJR19VTFBJX1AxX0JZUEFTUwkJKDEgPDwgMCkKKyNkZWZpbmUJT01BUF9VSEhfSE9TVENPTkZJR19VTFBJX1AyX0JZUEFTUwkJKDEgPDwgMTEpCisjZGVmaW5lCU9NQVBfVUhIX0hPU1RDT05GSUdfVUxQSV9QM19CWVBBU1MJCSgxIDw8IDEyKQorI2RlZmluZSBPTUFQX1VISF9IT1NUQ09ORklHX0lOQ1I0X0JVUlNUX0VOCQkoMSA8PCAyKQorI2RlZmluZSBPTUFQX1VISF9IT1NUQ09ORklHX0lOQ1I4X0JVUlNUX0VOCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQX1VISF9IT1NUQ09ORklHX0lOQ1IxNl9CVVJTVF9FTgkJKDEgPDwgNCkKKyNkZWZpbmUgT01BUF9VSEhfSE9TVENPTkZJR19JTkNSWF9BTElHTl9FTgkJKDEgPDwgNSkKKyNkZWZpbmUgT01BUF9VSEhfSE9TVENPTkZJR19QMV9DT05ORUNUX1NUQVRVUwkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUF9VSEhfSE9TVENPTkZJR19QMl9DT05ORUNUX1NUQVRVUwkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUF9VSEhfSE9TVENPTkZJR19QM19DT05ORUNUX1NUQVRVUwkJKDEgPDwgMTApCisKKyNkZWZpbmUJT01BUF9VSEhfREVCVUdfQ1NSCQkJCSgweDQ0KQorCisvKiBFSENJIFJlZ2lzdGVyIFNldCAqLworI2RlZmluZQlFSENJX0lOU05SRUcwNV9VTFBJCQkJCSgweEE0KQorI2RlZmluZQlFSENJX0lOU05SRUcwNV9VTFBJX0NPTlRST0xfU0hJRlQJCTMxCisjZGVmaW5lCUVIQ0lfSU5TTlJFRzA1X1VMUElfUE9SVFNFTF9TSElGVAkJMjQKKyNkZWZpbmUJRUhDSV9JTlNOUkVHMDVfVUxQSV9PUFNFTF9TSElGVAkJCTIyCisjZGVmaW5lCUVIQ0lfSU5TTlJFRzA1X1VMUElfUkVHQUREX1NISUZUCQkxNgorI2RlZmluZQlFSENJX0lOU05SRUcwNV9VTFBJX0VYVFJFR0FERF9TSElGVAkJOAorI2RlZmluZQlFSENJX0lOU05SRUcwNV9VTFBJX1dSREFUQV9TSElGVAkJMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIHZvaWQgZWhjaV9vbWFwX3dyaXRlbCh2b2lkIF9faW9tZW0gKmJhc2UsIHUzMiByZWcsIHUzMiB2YWwpCit7CisJX19yYXdfd3JpdGVsKHZhbCwgYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGVoY2lfb21hcF9yZWFkbCh2b2lkIF9faW9tZW0gKmJhc2UsIHUzMiByZWcpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKGJhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZWhjaV9vbWFwX3dyaXRlYih2b2lkIF9faW9tZW0gKmJhc2UsIHU4IHJlZywgdTggdmFsKQoreworCV9fcmF3X3dyaXRlYih2YWwsIGJhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHU4IGVoY2lfb21hcF9yZWFkYih2b2lkIF9faW9tZW0gKmJhc2UsIHU4IHJlZykKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGIoYmFzZSArIHJlZyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0cnVjdCBlaGNpX2hjZF9vbWFwIHsKKwlzdHJ1Y3QgZWhjaV9oY2QJCSplaGNpOworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisKKwlzdHJ1Y3QgY2xrCQkqdXNiaG9zdF9pY2s7CisJc3RydWN0IGNsawkJKnVzYmhvc3QyXzEyMG1fZmNrOworCXN0cnVjdCBjbGsJCSp1c2Job3N0MV80OG1fZmNrOworCXN0cnVjdCBjbGsJCSp1c2J0bGxfZmNrOworCXN0cnVjdCBjbGsJCSp1c2J0bGxfaWNrOworCisJLyogRklYTUUgdGhlIGZvbGxvd2luZyB0d28gd29ya2Fyb3VuZHMgYXJlCisJICogYm9hcmQgc3BlY2lmaWMgbm90IHNpbGljb24tc3BlY2lmaWMgc28gdGhlc2UKKwkgKiBzaG91bGQgYmUgbW92ZWQgdG8gYm9hcmQtZmlsZSBpbnN0ZWFkLgorCSAqCisJICogTWF5YmUgc29tZW9uZSBmcm9tIFRJIHdpbGwga25vdyBiZXR0ZXIgd2hpY2gKKwkgKiBib2FyZCBpcyBhZmZlY3RlZCBhbmQgbmVlZHMgdGhlIHdvcmthcm91bmRzCisJICogdG8gYmUgYXBwbGllZAorCSAqLworCisJLyogZ3BpbyBmb3IgcmVzZXR0aW5nIHBoeSAqLworCWludAkJCXJlc2V0X2dwaW9fcG9ydFtPTUFQM19IU19VU0JfUE9SVFNdOworCisJLyogcGh5IHJlc2V0IHdvcmthcm91bmQgKi8KKwlpbnQJCQlwaHlfcmVzZXQ7CisKKwkvKiBkZXNpcmVkIHBoeV9tb2RlOiBUTEwsIFBIWSAqLworCWVudW0gZWhjaV9oY2Rfb21hcF9tb2RlCXBvcnRfbW9kZVtPTUFQM19IU19VU0JfUE9SVFNdOworCisJdm9pZCBfX2lvbWVtCQkqdWhoX2Jhc2U7CisJdm9pZCBfX2lvbWVtCQkqdGxsX2Jhc2U7CisJdm9pZCBfX2lvbWVtCQkqZWhjaV9iYXNlOworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgb21hcF91c2JfdXRtaV9pbml0KHN0cnVjdCBlaGNpX2hjZF9vbWFwICpvbWFwLCB1OCB0bGxfY2hhbm5lbF9tYXNrKQoreworCXVuc2lnbmVkIHJlZzsKKwlpbnQgaTsKKworCS8qIFByb2dyYW0gdGhlIDMgVExMIGNoYW5uZWxzIHVwZnJvbnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgT01BUF9UTExfQ0hBTk5FTF9DT1VOVDsgaSsrKSB7CisJCXJlZyA9IGVoY2lfb21hcF9yZWFkbChvbWFwLT50bGxfYmFzZSwgT01BUF9UTExfQ0hBTk5FTF9DT05GKGkpKTsKKworCQkvKiBEaXNhYmxlIEF1dG9JZGxlLCBCaXRTdHVmZmluZyBhbmQgdXNlIFNEUiBNb2RlICovCisJCXJlZyAmPSB+KE9NQVBfVExMX0NIQU5ORUxfQ09ORl9VVE1JQVVUT0lETEUKKwkJCQl8IE9NQVBfVExMX0NIQU5ORUxfQ09ORl9VTFBJTk9CSVRTVFVGRgorCQkJCXwgT01BUF9UTExfQ0hBTk5FTF9DT05GX1VMUElERFJNT0RFKTsKKwkJZWhjaV9vbWFwX3dyaXRlbChvbWFwLT50bGxfYmFzZSwgT01BUF9UTExfQ0hBTk5FTF9DT05GKGkpLCByZWcpOworCX0KKworCS8qIFByb2dyYW0gQ29tbW9uIFRMTCByZWdpc3RlciAqLworCXJlZyA9IGVoY2lfb21hcF9yZWFkbChvbWFwLT50bGxfYmFzZSwgT01BUF9UTExfU0hBUkVEX0NPTkYpOworCXJlZyB8PSAoT01BUF9UTExfU0hBUkVEX0NPTkZfRkNMS19JU19PTgorCQkJfCBPTUFQX1RMTF9TSEFSRURfQ09ORl9VU0JfRElWUkFUSU9OCisJCQl8IE9NQVBfVExMX1NIQVJFRF9DT05GX1VTQl8xODBEX1NEUl9FTik7CisJcmVnICY9IH5PTUFQX1RMTF9TSEFSRURfQ09ORl9VU0JfOTBEX0REUl9FTjsKKworCWVoY2lfb21hcF93cml0ZWwob21hcC0+dGxsX2Jhc2UsIE9NQVBfVExMX1NIQVJFRF9DT05GLCByZWcpOworCisJLyogRW5hYmxlIGNoYW5uZWxzIG5vdyAqLworCWZvciAoaSA9IDA7IGkgPCBPTUFQX1RMTF9DSEFOTkVMX0NPVU5UOyBpKyspIHsKKwkJcmVnID0gZWhjaV9vbWFwX3JlYWRsKG9tYXAtPnRsbF9iYXNlLCBPTUFQX1RMTF9DSEFOTkVMX0NPTkYoaSkpOworCisJCS8qIEVuYWJsZSBvbmx5IHRoZSByZWcgdGhhdCBpcyBuZWVkZWQgKi8KKwkJaWYgKCEodGxsX2NoYW5uZWxfbWFzayAmIDE8PGkpKQorCQkJY29udGludWU7CisKKwkJcmVnIHw9IE9NQVBfVExMX0NIQU5ORUxfQ09ORl9DSEFORU47CisJCWVoY2lfb21hcF93cml0ZWwob21hcC0+dGxsX2Jhc2UsIE9NQVBfVExMX0NIQU5ORUxfQ09ORihpKSwgcmVnKTsKKworCQllaGNpX29tYXBfd3JpdGViKG9tYXAtPnRsbF9iYXNlLAorCQkJCU9NQVBfVExMX1VMUElfU0NSQVRDSF9SRUdJU1RFUihpKSwgMHhiZSk7CisJCWRldl9kYmcob21hcC0+ZGV2LCAiVUxQSV9TQ1JBVENIX1JFR1tjaD0lZF09IDB4JTAyeFxuIiwKKwkJCQlpKzEsIGVoY2lfb21hcF9yZWFkYihvbWFwLT50bGxfYmFzZSwKKwkJCQlPTUFQX1RMTF9VTFBJX1NDUkFUQ0hfUkVHSVNURVIoaSkpKTsKKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIG9tYXBfc3RhcnRfZWhjCisgKgktIFN0YXJ0IHRoZSBUSSBVU0JIT1NUIGNvbnRyb2xsZXIKKyAqLworc3RhdGljIGludCBvbWFwX3N0YXJ0X2VoYyhzdHJ1Y3QgZWhjaV9oY2Rfb21hcCAqb21hcCwgc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAwKTsKKwl1OCB0bGxfY2hfbWFzayA9IDA7CisJdW5zaWduZWQgcmVnID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCWRldl9kYmcob21hcC0+ZGV2LCAic3RhcnRpbmcgVEkgRUhDSSBVU0IgQ29udHJvbGxlclxuIik7CisKKwkvKiBFbmFibGUgQ2xvY2tzIGZvciBVU0JIT1NUICovCisJb21hcC0+dXNiaG9zdF9pY2sgPSBjbGtfZ2V0KG9tYXAtPmRldiwgInVzYmhvc3RfaWNrIik7CisJaWYgKElTX0VSUihvbWFwLT51c2Job3N0X2ljaykpIHsKKwkJcmV0ID0gIFBUUl9FUlIob21hcC0+dXNiaG9zdF9pY2spOworCQlnb3RvIGVycl9ob3N0X2ljazsKKwl9CisJY2xrX2VuYWJsZShvbWFwLT51c2Job3N0X2ljayk7CisKKwlvbWFwLT51c2Job3N0Ml8xMjBtX2ZjayA9IGNsa19nZXQob21hcC0+ZGV2LCAidXNiaG9zdF8xMjBtX2ZjayIpOworCWlmIChJU19FUlIob21hcC0+dXNiaG9zdDJfMTIwbV9mY2spKSB7CisJCXJldCA9IFBUUl9FUlIob21hcC0+dXNiaG9zdDJfMTIwbV9mY2spOworCQlnb3RvIGVycl9ob3N0XzEyMG1fZmNrOworCX0KKwljbGtfZW5hYmxlKG9tYXAtPnVzYmhvc3QyXzEyMG1fZmNrKTsKKworCW9tYXAtPnVzYmhvc3QxXzQ4bV9mY2sgPSBjbGtfZ2V0KG9tYXAtPmRldiwgInVzYmhvc3RfNDhtX2ZjayIpOworCWlmIChJU19FUlIob21hcC0+dXNiaG9zdDFfNDhtX2ZjaykpIHsKKwkJcmV0ID0gUFRSX0VSUihvbWFwLT51c2Job3N0MV80OG1fZmNrKTsKKwkJZ290byBlcnJfaG9zdF80OG1fZmNrOworCX0KKwljbGtfZW5hYmxlKG9tYXAtPnVzYmhvc3QxXzQ4bV9mY2spOworCisJaWYgKG9tYXAtPnBoeV9yZXNldCkgeworCQkvKiBSZWZlcjogSVNTVUUxICovCisJCWlmIChncGlvX2lzX3ZhbGlkKG9tYXAtPnJlc2V0X2dwaW9fcG9ydFswXSkpIHsKKwkJCWdwaW9fcmVxdWVzdChvbWFwLT5yZXNldF9ncGlvX3BvcnRbMF0sCisJCQkJCQkiVVNCMSBQSFkgcmVzZXQiKTsKKwkJCWdwaW9fZGlyZWN0aW9uX291dHB1dChvbWFwLT5yZXNldF9ncGlvX3BvcnRbMF0sIDApOworCQl9CisKKwkJaWYgKGdwaW9faXNfdmFsaWQob21hcC0+cmVzZXRfZ3Bpb19wb3J0WzFdKSkgeworCQkJZ3Bpb19yZXF1ZXN0KG9tYXAtPnJlc2V0X2dwaW9fcG9ydFsxXSwKKwkJCQkJCSJVU0IyIFBIWSByZXNldCIpOworCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KG9tYXAtPnJlc2V0X2dwaW9fcG9ydFsxXSwgMCk7CisJCX0KKworCQkvKiBIb2xkIHRoZSBQSFkgaW4gUkVTRVQgZm9yIGVub3VnaCB0aW1lIHRpbGwgRElSIGlzIGhpZ2ggKi8KKwkJdWRlbGF5KDEwKTsKKwl9CisKKwkvKiBDb25maWd1cmUgVExMIGZvciA2ME1oeiBjbGsgZm9yIFVMUEkgKi8KKwlvbWFwLT51c2J0bGxfZmNrID0gY2xrX2dldChvbWFwLT5kZXYsICJ1c2J0bGxfZmNrIik7CisJaWYgKElTX0VSUihvbWFwLT51c2J0bGxfZmNrKSkgeworCQlyZXQgPSBQVFJfRVJSKG9tYXAtPnVzYnRsbF9mY2spOworCQlnb3RvIGVycl90bGxfZmNrOworCX0KKwljbGtfZW5hYmxlKG9tYXAtPnVzYnRsbF9mY2spOworCisJb21hcC0+dXNidGxsX2ljayA9IGNsa19nZXQob21hcC0+ZGV2LCAidXNidGxsX2ljayIpOworCWlmIChJU19FUlIob21hcC0+dXNidGxsX2ljaykpIHsKKwkJcmV0ID0gUFRSX0VSUihvbWFwLT51c2J0bGxfaWNrKTsKKwkJZ290byBlcnJfdGxsX2ljazsKKwl9CisJY2xrX2VuYWJsZShvbWFwLT51c2J0bGxfaWNrKTsKKworCS8qIHBlcmZvcm0gVExMIHNvZnQgcmVzZXQsIGFuZCB3YWl0IHVudGlsIHJlc2V0IGlzIGNvbXBsZXRlICovCisJZWhjaV9vbWFwX3dyaXRlbChvbWFwLT50bGxfYmFzZSwgT01BUF9VU0JUTExfU1lTQ09ORklHLAorCQkJT01BUF9VU0JUTExfU1lTQ09ORklHX1NPRlRSRVNFVCk7CisKKwkvKiBXYWl0IGZvciBUTEwgcmVzZXQgdG8gY29tcGxldGUgKi8KKwl3aGlsZSAoIShlaGNpX29tYXBfcmVhZGwob21hcC0+dGxsX2Jhc2UsIE9NQVBfVVNCVExMX1NZU1NUQVRVUykKKwkJCSYgT01BUF9VU0JUTExfU1lTU1RBVFVTX1JFU0VURE9ORSkpIHsKKwkJY3B1X3JlbGF4KCk7CisKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCWRldl9kYmcob21hcC0+ZGV2LCAib3BlcmF0aW9uIHRpbWVkIG91dFxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfc3lzX3N0YXR1czsKKwkJfQorCX0KKworCWRldl9kYmcob21hcC0+ZGV2LCAiVExMIFJFU0VUIERPTkVcbiIpOworCisJLyogKDE8PDMpID0gbm8gaWRsZSBtb2RlIG9ubHkgZm9yIGluaXRpYWwgZGVidWdnaW5nICovCisJZWhjaV9vbWFwX3dyaXRlbChvbWFwLT50bGxfYmFzZSwgT01BUF9VU0JUTExfU1lTQ09ORklHLAorCQkJT01BUF9VU0JUTExfU1lTQ09ORklHX0VOQVdBS0VVUCB8CisJCQlPTUFQX1VTQlRMTF9TWVNDT05GSUdfU0lETEVNT0RFIHwKKwkJCU9NQVBfVVNCVExMX1NZU0NPTkZJR19DQUNUSVZJVFkpOworCisKKwkvKiBQdXQgVUhIIGluIE5vSWRsZS9Ob1N0YW5kYnkgbW9kZSAqLworCXJlZyA9IGVoY2lfb21hcF9yZWFkbChvbWFwLT51aGhfYmFzZSwgT01BUF9VSEhfU1lTQ09ORklHKTsKKwlyZWcgfD0gKE9NQVBfVUhIX1NZU0NPTkZJR19FTkFXQUtFVVAKKwkJCXwgT01BUF9VSEhfU1lTQ09ORklHX1NJRExFTU9ERQorCQkJfCBPTUFQX1VISF9TWVNDT05GSUdfQ0FDVElWSVRZCisJCQl8IE9NQVBfVUhIX1NZU0NPTkZJR19NSURMRU1PREUpOworCXJlZyAmPSB+T01BUF9VSEhfU1lTQ09ORklHX0FVVE9JRExFOworCisJZWhjaV9vbWFwX3dyaXRlbChvbWFwLT51aGhfYmFzZSwgT01BUF9VSEhfU1lTQ09ORklHLCByZWcpOworCisJcmVnID0gZWhjaV9vbWFwX3JlYWRsKG9tYXAtPnVoaF9iYXNlLCBPTUFQX1VISF9IT1NUQ09ORklHKTsKKworCS8qIHNldHVwIFVMUEkgYnlwYXNzIGFuZCBidXJzdCBjb25maWd1cmF0aW9ucyAqLworCXJlZyB8PSAoT01BUF9VSEhfSE9TVENPTkZJR19JTkNSNF9CVVJTVF9FTgorCQkJfCBPTUFQX1VISF9IT1NUQ09ORklHX0lOQ1I4X0JVUlNUX0VOCisJCQl8IE9NQVBfVUhIX0hPU1RDT05GSUdfSU5DUjE2X0JVUlNUX0VOKTsKKwlyZWcgJj0gfk9NQVBfVUhIX0hPU1RDT05GSUdfSU5DUlhfQUxJR05fRU47CisKKwlpZiAob21hcC0+cG9ydF9tb2RlWzBdID09IEVIQ0lfSENEX09NQVBfTU9ERV9VTktOT1dOKQorCQlyZWcgJj0gfk9NQVBfVUhIX0hPU1RDT05GSUdfUDFfQ09OTkVDVF9TVEFUVVM7CisJaWYgKG9tYXAtPnBvcnRfbW9kZVsxXSA9PSBFSENJX0hDRF9PTUFQX01PREVfVU5LTk9XTikKKwkJcmVnICY9IH5PTUFQX1VISF9IT1NUQ09ORklHX1AyX0NPTk5FQ1RfU1RBVFVTOworCWlmIChvbWFwLT5wb3J0X21vZGVbMl0gPT0gRUhDSV9IQ0RfT01BUF9NT0RFX1VOS05PV04pCisJCXJlZyAmPSB+T01BUF9VSEhfSE9TVENPTkZJR19QM19DT05ORUNUX1NUQVRVUzsKKworCS8qIEJ5cGFzcyB0aGUgVExMIG1vZHVsZSBmb3IgUEhZIG1vZGUgb3BlcmF0aW9uICovCisJIGlmIChvbWFwX3JldigpIDw9IE9NQVAzNDMwX1JFVl9FUzJfMSkgeworCQlkZXZfZGJnKG9tYXAtPmRldiwgIk9NQVAzIEVTIHZlcnNpb24gPD0gRVMyLjEgXG4iKTsKKwkJaWYgKChvbWFwLT5wb3J0X21vZGVbMF0gPT0gRUhDSV9IQ0RfT01BUF9NT0RFX1BIWSkgfHwKKwkJCShvbWFwLT5wb3J0X21vZGVbMV0gPT0gRUhDSV9IQ0RfT01BUF9NT0RFX1BIWSkgfHwKKwkJCQkob21hcC0+cG9ydF9tb2RlWzJdID09IEVIQ0lfSENEX09NQVBfTU9ERV9QSFkpKQorCQkJcmVnICY9IH5PTUFQX1VISF9IT1NUQ09ORklHX1VMUElfQllQQVNTOworCQllbHNlCisJCQlyZWcgfD0gT01BUF9VSEhfSE9TVENPTkZJR19VTFBJX0JZUEFTUzsKKwl9IGVsc2UgeworCQlkZXZfZGJnKG9tYXAtPmRldiwgIk9NQVAzIEVTIHZlcnNpb24gPiBFUzIuMVxuIik7CisJCWlmIChvbWFwLT5wb3J0X21vZGVbMF0gPT0gRUhDSV9IQ0RfT01BUF9NT0RFX1BIWSkKKwkJCXJlZyAmPSB+T01BUF9VSEhfSE9TVENPTkZJR19VTFBJX1AxX0JZUEFTUzsKKwkJZWxzZSBpZiAob21hcC0+cG9ydF9tb2RlWzBdID09IEVIQ0lfSENEX09NQVBfTU9ERV9UTEwpCisJCQlyZWcgfD0gT01BUF9VSEhfSE9TVENPTkZJR19VTFBJX1AxX0JZUEFTUzsKKworCQlpZiAob21hcC0+cG9ydF9tb2RlWzFdID09IEVIQ0lfSENEX09NQVBfTU9ERV9QSFkpCisJCQlyZWcgJj0gfk9NQVBfVUhIX0hPU1RDT05GSUdfVUxQSV9QMl9CWVBBU1M7CisJCWVsc2UgaWYgKG9tYXAtPnBvcnRfbW9kZVsxXSA9PSBFSENJX0hDRF9PTUFQX01PREVfVExMKQorCQkJcmVnIHw9IE9NQVBfVUhIX0hPU1RDT05GSUdfVUxQSV9QMl9CWVBBU1M7CisKKwkJaWYgKG9tYXAtPnBvcnRfbW9kZVsyXSA9PSBFSENJX0hDRF9PTUFQX01PREVfUEhZKQorCQkJcmVnICY9IH5PTUFQX1VISF9IT1NUQ09ORklHX1VMUElfUDNfQllQQVNTOworCQllbHNlIGlmIChvbWFwLT5wb3J0X21vZGVbMl0gPT0gRUhDSV9IQ0RfT01BUF9NT0RFX1RMTCkKKwkJCXJlZyB8PSBPTUFQX1VISF9IT1NUQ09ORklHX1VMUElfUDNfQllQQVNTOworCisJfQorCWVoY2lfb21hcF93cml0ZWwob21hcC0+dWhoX2Jhc2UsIE9NQVBfVUhIX0hPU1RDT05GSUcsIHJlZyk7CisJZGV2X2RiZyhvbWFwLT5kZXYsICJVSEggc2V0dXAgZG9uZSwgdWhoX2hvc3Rjb25maWc9JXhcbiIsIHJlZyk7CisKKworCWlmICgob21hcC0+cG9ydF9tb2RlWzBdID09IEVIQ0lfSENEX09NQVBfTU9ERV9UTEwpIHx8CisJCShvbWFwLT5wb3J0X21vZGVbMV0gPT0gRUhDSV9IQ0RfT01BUF9NT0RFX1RMTCkgfHwKKwkJCShvbWFwLT5wb3J0X21vZGVbMl0gPT0gRUhDSV9IQ0RfT01BUF9NT0RFX1RMTCkpIHsKKworCQlpZiAob21hcC0+cG9ydF9tb2RlWzBdID09IEVIQ0lfSENEX09NQVBfTU9ERV9UTEwpCisJCQl0bGxfY2hfbWFzayB8PSBPTUFQX1RMTF9DSEFOTkVMXzFfRU5fTUFTSzsKKwkJaWYgKG9tYXAtPnBvcnRfbW9kZVsxXSA9PSBFSENJX0hDRF9PTUFQX01PREVfVExMKQorCQkJdGxsX2NoX21hc2sgfD0gT01BUF9UTExfQ0hBTk5FTF8yX0VOX01BU0s7CisJCWlmIChvbWFwLT5wb3J0X21vZGVbMl0gPT0gRUhDSV9IQ0RfT01BUF9NT0RFX1RMTCkKKwkJCXRsbF9jaF9tYXNrIHw9IE9NQVBfVExMX0NIQU5ORUxfM19FTl9NQVNLOworCisJCS8qIEVuYWJsZSBVVE1JIG1vZGUgZm9yIHJlcXVpcmVkIFRMTCBjaGFubmVscyAqLworCQlvbWFwX3VzYl91dG1pX2luaXQob21hcCwgdGxsX2NoX21hc2spOworCX0KKworCWlmIChvbWFwLT5waHlfcmVzZXQpIHsKKwkJLyogUmVmZXIgSVNTVUUxOgorCQkgKiBIb2xkIHRoZSBQSFkgaW4gUkVTRVQgZm9yIGVub3VnaCB0aW1lIHRpbGwKKwkJICogUEhZIGlzIHNldHRsZWQgYW5kIHJlYWR5CisJCSAqLworCQl1ZGVsYXkoMTApOworCisJCWlmIChncGlvX2lzX3ZhbGlkKG9tYXAtPnJlc2V0X2dwaW9fcG9ydFswXSkpCisJCQlncGlvX3NldF92YWx1ZShvbWFwLT5yZXNldF9ncGlvX3BvcnRbMF0sIDEpOworCisJCWlmIChncGlvX2lzX3ZhbGlkKG9tYXAtPnJlc2V0X2dwaW9fcG9ydFsxXSkpCisJCQlncGlvX3NldF92YWx1ZShvbWFwLT5yZXNldF9ncGlvX3BvcnRbMV0sIDEpOworCX0KKworCXJldHVybiAwOworCitlcnJfc3lzX3N0YXR1czoKKwljbGtfZGlzYWJsZShvbWFwLT51c2J0bGxfaWNrKTsKKwljbGtfcHV0KG9tYXAtPnVzYnRsbF9pY2spOworCitlcnJfdGxsX2ljazoKKwljbGtfZGlzYWJsZShvbWFwLT51c2J0bGxfZmNrKTsKKwljbGtfcHV0KG9tYXAtPnVzYnRsbF9mY2spOworCitlcnJfdGxsX2ZjazoKKwljbGtfZGlzYWJsZShvbWFwLT51c2Job3N0MV80OG1fZmNrKTsKKwljbGtfcHV0KG9tYXAtPnVzYmhvc3QxXzQ4bV9mY2spOworCisJaWYgKG9tYXAtPnBoeV9yZXNldCkgeworCQlpZiAoZ3Bpb19pc192YWxpZChvbWFwLT5yZXNldF9ncGlvX3BvcnRbMF0pKQorCQkJZ3Bpb19mcmVlKG9tYXAtPnJlc2V0X2dwaW9fcG9ydFswXSk7CisKKwkJaWYgKGdwaW9faXNfdmFsaWQob21hcC0+cmVzZXRfZ3Bpb19wb3J0WzFdKSkKKwkJCWdwaW9fZnJlZShvbWFwLT5yZXNldF9ncGlvX3BvcnRbMV0pOworCX0KKworZXJyX2hvc3RfNDhtX2ZjazoKKwljbGtfZGlzYWJsZShvbWFwLT51c2Job3N0Ml8xMjBtX2Zjayk7CisJY2xrX3B1dChvbWFwLT51c2Job3N0Ml8xMjBtX2Zjayk7CisKK2Vycl9ob3N0XzEyMG1fZmNrOgorCWNsa19kaXNhYmxlKG9tYXAtPnVzYmhvc3RfaWNrKTsKKwljbGtfcHV0KG9tYXAtPnVzYmhvc3RfaWNrKTsKKworZXJyX2hvc3RfaWNrOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfc3RvcF9laGMoc3RydWN0IGVoY2lfaGNkX29tYXAgKm9tYXAsIHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKworCWRldl9kYmcob21hcC0+ZGV2LCAic3RvcHBpbmcgVEkgRUhDSSBVU0IgQ29udHJvbGxlclxuIik7CisKKwkvKiBSZXNldCBPTUFQIG1vZHVsZXMgZm9yIGluc21vZC9ybW1vZCB0byB3b3JrICovCisJZWhjaV9vbWFwX3dyaXRlbChvbWFwLT51aGhfYmFzZSwgT01BUF9VSEhfU1lTQ09ORklHLAorCQkJT01BUF9VSEhfU1lTQ09ORklHX1NPRlRSRVNFVCk7CisJd2hpbGUgKCEoZWhjaV9vbWFwX3JlYWRsKG9tYXAtPnVoaF9iYXNlLCBPTUFQX1VISF9TWVNTVEFUVVMpCisJCQkJJiAoMSA8PCAwKSkpIHsKKwkJY3B1X3JlbGF4KCk7CisKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQlkZXZfZGJnKG9tYXAtPmRldiwgIm9wZXJhdGlvbiB0aW1lZCBvdXRcbiIpOworCX0KKworCXdoaWxlICghKGVoY2lfb21hcF9yZWFkbChvbWFwLT51aGhfYmFzZSwgT01BUF9VSEhfU1lTU1RBVFVTKQorCQkJCSYgKDEgPDwgMSkpKSB7CisJCWNwdV9yZWxheCgpOworCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJZGV2X2RiZyhvbWFwLT5kZXYsICJvcGVyYXRpb24gdGltZWQgb3V0XG4iKTsKKwl9CisKKwl3aGlsZSAoIShlaGNpX29tYXBfcmVhZGwob21hcC0+dWhoX2Jhc2UsIE9NQVBfVUhIX1NZU1NUQVRVUykKKwkJCQkmICgxIDw8IDIpKSkgeworCQljcHVfcmVsYXgoKTsKKworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCWRldl9kYmcob21hcC0+ZGV2LCAib3BlcmF0aW9uIHRpbWVkIG91dFxuIik7CisJfQorCisJZWhjaV9vbWFwX3dyaXRlbChvbWFwLT50bGxfYmFzZSwgT01BUF9VU0JUTExfU1lTQ09ORklHLCAoMSA8PCAxKSk7CisKKwl3aGlsZSAoIShlaGNpX29tYXBfcmVhZGwob21hcC0+dGxsX2Jhc2UsIE9NQVBfVVNCVExMX1NZU1NUQVRVUykKKwkJCQkmICgxIDw8IDApKSkgeworCQljcHVfcmVsYXgoKTsKKworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCWRldl9kYmcob21hcC0+ZGV2LCAib3BlcmF0aW9uIHRpbWVkIG91dFxuIik7CisJfQorCisJaWYgKG9tYXAtPnVzYnRsbF9mY2sgIT0gTlVMTCkgeworCQljbGtfZGlzYWJsZShvbWFwLT51c2J0bGxfZmNrKTsKKwkJY2xrX3B1dChvbWFwLT51c2J0bGxfZmNrKTsKKwkJb21hcC0+dXNidGxsX2ZjayA9IE5VTEw7CisJfQorCisJaWYgKG9tYXAtPnVzYmhvc3RfaWNrICE9IE5VTEwpIHsKKwkJY2xrX2Rpc2FibGUob21hcC0+dXNiaG9zdF9pY2spOworCQljbGtfcHV0KG9tYXAtPnVzYmhvc3RfaWNrKTsKKwkJb21hcC0+dXNiaG9zdF9pY2sgPSBOVUxMOworCX0KKworCWlmIChvbWFwLT51c2Job3N0MV80OG1fZmNrICE9IE5VTEwpIHsKKwkJY2xrX2Rpc2FibGUob21hcC0+dXNiaG9zdDFfNDhtX2Zjayk7CisJCWNsa19wdXQob21hcC0+dXNiaG9zdDFfNDhtX2Zjayk7CisJCW9tYXAtPnVzYmhvc3QxXzQ4bV9mY2sgPSBOVUxMOworCX0KKworCWlmIChvbWFwLT51c2Job3N0Ml8xMjBtX2ZjayAhPSBOVUxMKSB7CisJCWNsa19kaXNhYmxlKG9tYXAtPnVzYmhvc3QyXzEyMG1fZmNrKTsKKwkJY2xrX3B1dChvbWFwLT51c2Job3N0Ml8xMjBtX2Zjayk7CisJCW9tYXAtPnVzYmhvc3QyXzEyMG1fZmNrID0gTlVMTDsKKwl9CisKKwlpZiAob21hcC0+dXNidGxsX2ljayAhPSBOVUxMKSB7CisJCWNsa19kaXNhYmxlKG9tYXAtPnVzYnRsbF9pY2spOworCQljbGtfcHV0KG9tYXAtPnVzYnRsbF9pY2spOworCQlvbWFwLT51c2J0bGxfaWNrID0gTlVMTDsKKwl9CisKKwlpZiAob21hcC0+cGh5X3Jlc2V0KSB7CisJCWlmIChncGlvX2lzX3ZhbGlkKG9tYXAtPnJlc2V0X2dwaW9fcG9ydFswXSkpCisJCQlncGlvX2ZyZWUob21hcC0+cmVzZXRfZ3Bpb19wb3J0WzBdKTsKKworCQlpZiAoZ3Bpb19pc192YWxpZChvbWFwLT5yZXNldF9ncGlvX3BvcnRbMV0pKQorCQkJZ3Bpb19mcmVlKG9tYXAtPnJlc2V0X2dwaW9fcG9ydFsxXSk7CisJfQorCisJZGV2X2RiZyhvbWFwLT5kZXYsICJDbG9jayB0byBVU0IgaG9zdCBoYXMgYmVlbiBkaXNhYmxlZFxuIik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGNfZHJpdmVyIGVoY2lfb21hcF9oY19kcml2ZXI7CisKKy8qIGNvbmZpZ3VyZSBzbyBhbiBIQyBkZXZpY2UgYW5kIGlkIGFyZSBhbHdheXMgcHJvdmlkZWQgKi8KKy8qIGFsd2F5cyBjYWxsZWQgd2l0aCBwcm9jZXNzIGNvbnRleHQ7IHNsZWVwaW5nIGlzIE9LICovCisKKy8qKgorICogZWhjaV9oY2Rfb21hcF9wcm9iZSAtIGluaXRpYWxpemUgVEktYmFzZWQgSENEcworICoKKyAqIEFsbG9jYXRlcyBiYXNpYyByZXNvdXJjZXMgZm9yIHRoaXMgVVNCIGhvc3QgY29udHJvbGxlciwgYW5kCisgKiB0aGVuIGludm9rZXMgdGhlIHN0YXJ0KCkgbWV0aG9kIGZvciB0aGUgSENEIGFzc29jaWF0ZWQgd2l0aCBpdAorICogdGhyb3VnaCB0aGUgaG90cGx1ZyBlbnRyeSdzIGRyaXZlcl9kYXRhLgorICovCitzdGF0aWMgaW50IGVoY2lfaGNkX29tYXBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZWhjaV9oY2Rfb21hcF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBlaGNpX2hjZF9vbWFwICpvbWFwOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCB1c2JfaGNkICpoY2Q7CisKKwlpbnQgaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKworCWlmICghcGRhdGEpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAibWlzc2luZyBwbGF0Zm9ybV9kYXRhXG4iKTsKKwkJZ290byBlcnJfcGRhdGE7CisJfQorCisJaWYgKHVzYl9kaXNhYmxlZCgpKQorCQlnb3RvIGVycl9kaXNhYmxlZDsKKworCW9tYXAgPSBremFsbG9jKHNpemVvZigqb21hcCksIEdGUF9LRVJORUwpOworCWlmICghb21hcCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9kaXNhYmxlZDsKKwl9CisKKwloY2QgPSB1c2JfY3JlYXRlX2hjZCgmZWhjaV9vbWFwX2hjX2RyaXZlciwgJnBkZXYtPmRldiwKKwkJCWRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKwlpZiAoIWhjZCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIGhjZCB3aXRoIGVyciAlZFxuIiwgcmV0KTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfY3JlYXRlX2hjZDsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBvbWFwKTsKKwlvbWFwLT5kZXYJCT0gJnBkZXYtPmRldjsKKwlvbWFwLT5waHlfcmVzZXQJCT0gcGRhdGEtPnBoeV9yZXNldDsKKwlvbWFwLT5yZXNldF9ncGlvX3BvcnRbMF0JPSBwZGF0YS0+cmVzZXRfZ3Bpb19wb3J0WzBdOworCW9tYXAtPnJlc2V0X2dwaW9fcG9ydFsxXQk9IHBkYXRhLT5yZXNldF9ncGlvX3BvcnRbMV07CisJb21hcC0+cmVzZXRfZ3Bpb19wb3J0WzJdCT0gcGRhdGEtPnJlc2V0X2dwaW9fcG9ydFsyXTsKKwlvbWFwLT5wb3J0X21vZGVbMF0JCT0gcGRhdGEtPnBvcnRfbW9kZVswXTsKKwlvbWFwLT5wb3J0X21vZGVbMV0JCT0gcGRhdGEtPnBvcnRfbW9kZVsxXTsKKwlvbWFwLT5wb3J0X21vZGVbMl0JCT0gcGRhdGEtPnBvcnRfbW9kZVsyXTsKKwlvbWFwLT5laGNpCQk9IGhjZF90b19laGNpKGhjZCk7CisJb21hcC0+ZWhjaS0+c2Jybgk9IDB4MjA7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCisJaGNkLT5yc3JjX3N0YXJ0ID0gcmVzLT5zdGFydDsKKwloY2QtPnJzcmNfbGVuID0gcmVzb3VyY2Vfc2l6ZShyZXMpOworCisJaGNkLT5yZWdzID0gaW9yZW1hcChoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4pOworCWlmICghaGNkLT5yZWdzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkVIQ0kgaW9yZW1hcCBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9pb3JlbWFwOworCX0KKworCS8qIHdlIGtub3cgdGhpcyBpcyB0aGUgbWVtb3J5IHdlIHdhbnQsIG5vIG5lZWQgdG8gaW9yZW1hcCBhZ2FpbiAqLworCW9tYXAtPmVoY2ktPmNhcHMgPSBoY2QtPnJlZ3M7CisJb21hcC0+ZWhjaV9iYXNlID0gaGNkLT5yZWdzOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwlvbWFwLT51aGhfYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoIW9tYXAtPnVoaF9iYXNlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVISCBpb3JlbWFwIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3VoaF9pb3JlbWFwOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMik7CisJb21hcC0+dGxsX2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFvbWFwLT50bGxfYmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJUTEwgaW9yZW1hcCBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl90bGxfaW9yZW1hcDsKKwl9CisKKwlyZXQgPSBvbWFwX3N0YXJ0X2VoYyhvbWFwLCBoY2QpOworCWlmIChyZXQpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHN0YXJ0IGVoY2lcbiIpOworCQlnb3RvIGVycl9zdGFydDsKKwl9CisKKwlvbWFwLT5laGNpLT5yZWdzID0gaGNkLT5yZWdzCisJCSsgSENfTEVOR1RIKHJlYWRsKCZvbWFwLT5laGNpLT5jYXBzLT5oY19jYXBiYXNlKSk7CisKKwkvKiBjYWNoZSB0aGlzIHJlYWRvbmx5IGRhdGE7IG1pbmltaXplIGNoaXAgcmVhZHMgKi8KKwlvbWFwLT5laGNpLT5oY3NfcGFyYW1zID0gcmVhZGwoJm9tYXAtPmVoY2ktPmNhcHMtPmhjc19wYXJhbXMpOworCisJLyogU0VUIDEgbWljcm8tZnJhbWUgSW50ZXJydXB0IGludGVydmFsICovCisJd3JpdGVsKHJlYWRsKCZvbWFwLT5laGNpLT5yZWdzLT5jb21tYW5kKSB8ICgxIDw8IDE2KSwKKwkJCSZvbWFwLT5laGNpLT5yZWdzLT5jb21tYW5kKTsKKworCXJldCA9IHVzYl9hZGRfaGNkKGhjZCwgaXJxLCBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQpOworCWlmIChyZXQpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFkZCBoY2Qgd2l0aCBlcnIgJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2FkZF9oY2Q7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9hZGRfaGNkOgorCW9tYXBfc3RvcF9laGMob21hcCwgaGNkKTsKKworZXJyX3N0YXJ0OgorCWlvdW5tYXAob21hcC0+dGxsX2Jhc2UpOworCitlcnJfdGxsX2lvcmVtYXA6CisJaW91bm1hcChvbWFwLT51aGhfYmFzZSk7CisKK2Vycl91aGhfaW9yZW1hcDoKKwlpb3VubWFwKGhjZC0+cmVncyk7CisKK2Vycl9pb3JlbWFwOgorCXVzYl9wdXRfaGNkKGhjZCk7CisKK2Vycl9jcmVhdGVfaGNkOgorCWtmcmVlKG9tYXApOworZXJyX2Rpc2FibGVkOgorZXJyX3BkYXRhOgorCXJldHVybiByZXQ7Cit9CisKKy8qIG1heSBiZSBjYWxsZWQgd2l0aG91dCBjb250cm9sbGVyIGVsZWN0cmljYWxseSBwcmVzZW50ICovCisvKiBtYXkgYmUgY2FsbGVkIHdpdGggY29udHJvbGxlciwgYnVzLCBhbmQgZGV2aWNlcyBhY3RpdmUgKi8KKworLyoqCisgKiBlaGNpX2hjZF9vbWFwX3JlbW92ZSAtIHNodXRkb3duIHByb2Nlc3NpbmcgZm9yIEVIQ0kgSENEcworICogQHBkZXY6IFVTQiBIb3N0IENvbnRyb2xsZXIgYmVpbmcgcmVtb3ZlZAorICoKKyAqIFJldmVyc2VzIHRoZSBlZmZlY3Qgb2YgdXNiX2VoY2lfaGNkX29tYXBfcHJvYmUoKSwgZmlyc3QgaW52b2tpbmcKKyAqIHRoZSBIQ0QncyBzdG9wKCkgbWV0aG9kLiAgSXQgaXMgYWx3YXlzIGNhbGxlZCBmcm9tIGEgdGhyZWFkCisgKiBjb250ZXh0LCBub3JtYWxseSAicm1tb2QiLCAiYXBtZCIsIG9yIHNvbWV0aGluZyBzaW1pbGFyLgorICovCitzdGF0aWMgaW50IGVoY2lfaGNkX29tYXBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGVoY2lfaGNkX29tYXAgKm9tYXAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gZWhjaV90b19oY2Qob21hcC0+ZWhjaSk7CisKKwl1c2JfcmVtb3ZlX2hjZChoY2QpOworCW9tYXBfc3RvcF9laGMob21hcCwgaGNkKTsKKwlpb3VubWFwKGhjZC0+cmVncyk7CisJaW91bm1hcChvbWFwLT50bGxfYmFzZSk7CisJaW91bm1hcChvbWFwLT51aGhfYmFzZSk7CisJdXNiX3B1dF9oY2QoaGNkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlaGNpX2hjZF9vbWFwX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGVoY2lfaGNkX29tYXAgKm9tYXAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gZWhjaV90b19oY2Qob21hcC0+ZWhjaSk7CisKKwlpZiAoaGNkLT5kcml2ZXItPnNodXRkb3duKQorCQloY2QtPmRyaXZlci0+c2h1dGRvd24oaGNkKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZWhjaV9oY2Rfb21hcF9kcml2ZXIgPSB7CisJLnByb2JlCQkJPSBlaGNpX2hjZF9vbWFwX3Byb2JlLAorCS5yZW1vdmUJCQk9IGVoY2lfaGNkX29tYXBfcmVtb3ZlLAorCS5zaHV0ZG93bgkJPSBlaGNpX2hjZF9vbWFwX3NodXRkb3duLAorCS8qLnN1c3BlbmQJCT0gZWhjaV9oY2Rfb21hcF9zdXNwZW5kLCAqLworCS8qLnJlc3VtZQkJPSBlaGNpX2hjZF9vbWFwX3Jlc3VtZSwgKi8KKwkuZHJpdmVyID0geworCQkubmFtZQkJPSAiZWhjaS1vbWFwIiwKKwl9Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhjX2RyaXZlciBlaGNpX29tYXBfaGNfZHJpdmVyID0geworCS5kZXNjcmlwdGlvbgkJPSBoY2RfbmFtZSwKKwkucHJvZHVjdF9kZXNjCQk9ICJPTUFQLUVIQ0kgSG9zdCBDb250cm9sbGVyIiwKKwkuaGNkX3ByaXZfc2l6ZQkJPSBzaXplb2Yoc3RydWN0IGVoY2lfaGNkKSwKKworCS8qCisJICogZ2VuZXJpYyBoYXJkd2FyZSBsaW5rYWdlCisJICovCisJLmlycQkJCT0gZWhjaV9pcnEsCisJLmZsYWdzCQkJPSBIQ0RfTUVNT1JZIHwgSENEX1VTQjIsCisKKwkvKgorCSAqIGJhc2ljIGxpZmVjeWNsZSBvcGVyYXRpb25zCisJICovCisJLnJlc2V0CQkJPSBlaGNpX2luaXQsCisJLnN0YXJ0CQkJPSBlaGNpX3J1biwKKwkuc3RvcAkJCT0gZWhjaV9zdG9wLAorCS5zaHV0ZG93bgkJPSBlaGNpX3NodXRkb3duLAorCisJLyoKKwkgKiBtYW5hZ2luZyBpL28gcmVxdWVzdHMgYW5kIGFzc29jaWF0ZWQgZGV2aWNlIHJlc291cmNlcworCSAqLworCS51cmJfZW5xdWV1ZQkJPSBlaGNpX3VyYl9lbnF1ZXVlLAorCS51cmJfZGVxdWV1ZQkJPSBlaGNpX3VyYl9kZXF1ZXVlLAorCS5lbmRwb2ludF9kaXNhYmxlCT0gZWhjaV9lbmRwb2ludF9kaXNhYmxlLAorCS5lbmRwb2ludF9yZXNldAkJPSBlaGNpX2VuZHBvaW50X3Jlc2V0LAorCisJLyoKKwkgKiBzY2hlZHVsaW5nIHN1cHBvcnQKKwkgKi8KKwkuZ2V0X2ZyYW1lX251bWJlcgk9IGVoY2lfZ2V0X2ZyYW1lLAorCisJLyoKKwkgKiByb290IGh1YiBzdXBwb3J0CisJICovCisJLmh1Yl9zdGF0dXNfZGF0YQk9IGVoY2lfaHViX3N0YXR1c19kYXRhLAorCS5odWJfY29udHJvbAkJPSBlaGNpX2h1Yl9jb250cm9sLAorCS5idXNfc3VzcGVuZAkJPSBlaGNpX2J1c19zdXNwZW5kLAorCS5idXNfcmVzdW1lCQk9IGVoY2lfYnVzX3Jlc3VtZSwKKworCS5jbGVhcl90dF9idWZmZXJfY29tcGxldGUgPSBlaGNpX2NsZWFyX3R0X2J1ZmZlcl9jb21wbGV0ZSwKK307CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06b21hcC1laGNpIik7CitNT0RVTEVfQVVUSE9SKCJUZXhhcyBJbnN0cnVtZW50cywgSW5jLiIpOworTU9EVUxFX0FVVEhPUigiRmVsaXBlIEJhbGJpIDxmZWxpcGUuYmFsYmlAbm9raWEuY29tPiIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcS5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXEuYwppbmRleCAxMzlhMmNjLi5hNDI3ZDNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1xLmMKQEAgLTYxNiw5ICs2MTYsMTEgQEAKICkgewogCXN0cnVjdCBlaGNpX3F0ZAkJKnF0ZCwgKnF0ZF9wcmV2OwogCWRtYV9hZGRyX3QJCWJ1ZjsKLQlpbnQJCQlsZW4sIG1heHBhY2tldDsKKwlpbnQJCQlsZW4sIHRoaXNfc2dfbGVuLCBtYXhwYWNrZXQ7CiAJaW50CQkJaXNfaW5wdXQ7CiAJdTMyCQkJdG9rZW47CisJaW50CQkJaTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnOwogCiAJLyoKIAkgKiBVUkJzIG1hcCB0byBzZXF1ZW5jZXMgb2YgUVREczogIG9uZSBsb2dpY2FsIHRyYW5zYWN0aW9uCkBAIC02NTksNyArNjYxLDIwIEBACiAJLyoKIAkgKiBkYXRhIHRyYW5zZmVyIHN0YWdlOiAgYnVmZmVyIHNldHVwCiAJICovCi0JYnVmID0gdXJiLT50cmFuc2Zlcl9kbWE7CisJaSA9IHVyYi0+bnVtX3NnczsKKwlpZiAobGVuID4gMCAmJiBpID4gMCkgeworCQlzZyA9IHVyYi0+c2ctPnNnOworCQlidWYgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisKKwkJLyogdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoIG1heSBiZSBzbWFsbGVyIHRoYW4gdGhlCisJCSAqIHNpemUgb2YgdGhlIHNjYXR0ZXJsaXN0IChvciB2aWNlIHZlcnNhKQorCQkgKi8KKwkJdGhpc19zZ19sZW4gPSBtaW5fdChpbnQsIHNnX2RtYV9sZW4oc2cpLCBsZW4pOworCX0gZWxzZSB7CisJCXNnID0gTlVMTDsKKwkJYnVmID0gdXJiLT50cmFuc2Zlcl9kbWE7CisJCXRoaXNfc2dfbGVuID0gbGVuOworCX0KIAogCWlmIChpc19pbnB1dCkKIAkJdG9rZW4gfD0gKDEgLyogImluIiAqLyA8PCA4KTsKQEAgLTY3NSw3ICs2OTAsOSBAQAogCWZvciAoOzspIHsKIAkJaW50IHRoaXNfcXRkX2xlbjsKIAotCQl0aGlzX3F0ZF9sZW4gPSBxdGRfZmlsbChlaGNpLCBxdGQsIGJ1ZiwgbGVuLCB0b2tlbiwgbWF4cGFja2V0KTsKKwkJdGhpc19xdGRfbGVuID0gcXRkX2ZpbGwoZWhjaSwgcXRkLCBidWYsIHRoaXNfc2dfbGVuLCB0b2tlbiwKKwkJCQltYXhwYWNrZXQpOworCQl0aGlzX3NnX2xlbiAtPSB0aGlzX3F0ZF9sZW47CiAJCWxlbiAtPSB0aGlzX3F0ZF9sZW47CiAJCWJ1ZiArPSB0aGlzX3F0ZF9sZW47CiAKQEAgLTY5MSw4ICs3MDgsMTMgQEAKIAkJaWYgKChtYXhwYWNrZXQgJiAodGhpc19xdGRfbGVuICsgKG1heHBhY2tldCAtIDEpKSkgPT0gMCkKIAkJCXRva2VuIF49IFFURF9UT0dHTEU7CiAKLQkJaWYgKGxpa2VseSAobGVuIDw9IDApKQotCQkJYnJlYWs7CisJCWlmIChsaWtlbHkodGhpc19zZ19sZW4gPD0gMCkpIHsKKwkJCWlmICgtLWkgPD0gMCB8fCBsZW4gPD0gMCkKKwkJCQlicmVhazsKKwkJCXNnID0gc2dfbmV4dChzZyk7CisJCQlidWYgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCQl0aGlzX3NnX2xlbiA9IG1pbl90KGludCwgc2dfZG1hX2xlbihzZyksIGxlbik7CisJCX0KIAogCQlxdGRfcHJldiA9IHF0ZDsKIAkJcXRkID0gZWhjaV9xdGRfYWxsb2MgKGVoY2ksIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKaW5kZXggYTU1MzViNS4uMWUzOTFlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKQEAgLTEzODUsNyArMTM4NSw3IEBACiAgKiBnaXZlbiBFSENJX1RVTkVfRkxTIGFuZCB0aGUgc2xvcCkuICBPciwgd3JpdGUgYSBzbWFydGVyIHNjaGVkdWxlciEKICAqLwogCi0jZGVmaW5lIFNDSEVEVUxFX1NMT1AJMTAJLyogZnJhbWVzICovCisjZGVmaW5lIFNDSEVEVUxFX1NMT1AJODAJLyogbWljcm9mcmFtZXMgKi8KIAogc3RhdGljIGludAogaXNvX3N0cmVhbV9zY2hlZHVsZSAoCkBAIC0xMzk0LDEyICsxMzk0LDEzIEBACiAJc3RydWN0IGVoY2lfaXNvX3N0cmVhbQkqc3RyZWFtCiApCiB7Ci0JdTMyCQkJbm93LCBzdGFydCwgbWF4LCBwZXJpb2Q7CisJdTMyCQkJbm93LCBuZXh0LCBzdGFydCwgcGVyaW9kOwogCWludAkJCXN0YXR1czsKIAl1bnNpZ25lZAkJbW9kID0gZWhjaS0+cGVyaW9kaWNfc2l6ZSA8PCAzOwogCXN0cnVjdCBlaGNpX2lzb19zY2hlZAkqc2NoZWQgPSB1cmItPmhjcHJpdjsKKwlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CiAKLQlpZiAoc2NoZWQtPnNwYW4gPiAobW9kIC0gOCAqIFNDSEVEVUxFX1NMT1ApKSB7CisJaWYgKHNjaGVkLT5zcGFuID4gKG1vZCAtIFNDSEVEVUxFX1NMT1ApKSB7CiAJCWVoY2lfZGJnIChlaGNpLCAiaXNvIHJlcXVlc3QgJXAgdG9vIGxvbmdcbiIsIHVyYik7CiAJCXN0YXR1cyA9IC1FRkJJRzsKIAkJZ290byBmYWlsOwpAQCAtMTQxOCwyNiArMTQxOSwzNSBAQAogCiAJbm93ID0gZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+cmVncy0+ZnJhbWVfaW5kZXgpICUgbW9kOwogCi0JLyogd2hlbidzIHRoZSBsYXN0IHVmcmFtZSB0aGlzIHVyYiBjb3VsZCBzdGFydD8gKi8KLQltYXggPSBub3cgKyBtb2Q7Ci0KIAkvKiBUeXBpY2FsIGNhc2U6IHJldXNlIGN1cnJlbnQgc2NoZWR1bGUsIHN0cmVhbSBpcyBzdGlsbCBhY3RpdmUuCiAJICogSG9wZWZ1bGx5IHRoZXJlIGFyZSBubyBnYXBzIGZyb20gdGhlIGhvc3QgZmFsbGluZyBiZWhpbmQKIAkgKiAoaXJxIGRlbGF5cyBldGMpLCBidXQgaWYgdGhlcmUgYXJlIHdlJ2xsIHRha2UgdGhlIG5leHQKIAkgKiBzbG90IGluIHRoZSBzY2hlZHVsZSwgaW1wbGljaXRseSBhc3N1bWluZyBVUkJfSVNPX0FTQVAuCiAJICovCiAJaWYgKGxpa2VseSAoIWxpc3RfZW1wdHkgKCZzdHJlYW0tPnRkX2xpc3QpKSkgeworCQlwZGV2ID0gdG9fcGNpX2RldihlaGNpX3RvX2hjZChlaGNpKS0+c2VsZi5jb250cm9sbGVyKTsKIAkJc3RhcnQgPSBzdHJlYW0tPm5leHRfdWZyYW1lOwotCQlpZiAoc3RhcnQgPCBub3cpCi0JCQlzdGFydCArPSBtb2Q7CisKKwkJLyogRm9yIGhpZ2ggc3BlZWQgZGV2aWNlcywgYWxsb3cgc2NoZWR1bGluZyB3aXRoaW4gdGhlCisJCSAqIGlzb2Nocm9ub3VzIHNjaGVkdWxpbmcgdGhyZXNob2xkLiAgRm9yIGZ1bGwgc3BlZWQgZGV2aWNlcywKKwkJICogZG9uJ3QuIChXb3JrIGFyb3VuZCBmb3IgSW50ZWwgSUNIOSBidWcuKQorCQkgKi8KKwkJaWYgKCFzdHJlYW0tPmhpZ2hzcGVlZCAmJgorCQkJCXBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lOVEVMKQorCQkJbmV4dCA9IG5vdyArIGVoY2ktPmlfdGhyZXNoOworCQllbHNlCisJCQluZXh0ID0gbm93OwogCiAJCS8qIEZlbGwgYmVoaW5kIChieSB1cCB0byB0d2ljZSB0aGUgc2xvcCBhbW91bnQpPyAqLwotCQlpZiAoc3RhcnQgPj0gbWF4IC0gMiAqIDggKiBTQ0hFRFVMRV9TTE9QKQorCQlpZiAoKChzdGFydCAtIG5leHQpICYgKG1vZCAtIDEpKSA+PQorCQkJCW1vZCAtIDIgKiBTQ0hFRFVMRV9TTE9QKQogCQkJc3RhcnQgKz0gcGVyaW9kICogRElWX1JPVU5EX1VQKAotCQkJCQltYXggLSBzdGFydCwgcGVyaW9kKSAtIG1vZDsKKwkJCQkJKG5leHQgLSBzdGFydCkgJiAobW9kIC0gMSksCisJCQkJCXBlcmlvZCk7CiAKIAkJLyogVHJpZWQgdG8gc2NoZWR1bGUgdG9vIGZhciBpbnRvIHRoZSBmdXR1cmU/ICovCi0JCWlmICh1bmxpa2VseSgoc3RhcnQgKyBzY2hlZC0+c3BhbikgPj0gbWF4KSkgeworCQlpZiAodW5saWtlbHkoKChzdGFydCAtIG5vdykgJiAobW9kIC0gMSkpICsgc2NoZWQtPnNwYW4KKwkJCQkJPj0gbW9kIC0gMiAqIFNDSEVEVUxFX1NMT1ApKSB7CiAJCQlzdGF0dXMgPSAtRUZCSUc7CiAJCQlnb3RvIGZhaWw7CiAJCX0KQEAgLTE0NTEsNyArMTQ2MSw3IEBACiAJICogY2FuIGFsc28gaGVscCBoaWdoIGJhbmR3aWR0aCBpZiB0aGUgZG1hIGFuZCBpcnEgbG9hZHMgZG9uJ3QKIAkgKiBqdW1wIHVudGlsIGFmdGVyIHRoZSBxdWV1ZSBpcyBwcmltZWQuCiAJICovCi0Jc3RhcnQgPSBTQ0hFRFVMRV9TTE9QICogOCArIChub3cgJiB+MHgwNyk7CisJc3RhcnQgPSBTQ0hFRFVMRV9TTE9QICsgKG5vdyAmIH4weDA3KTsKIAlzdGFydCAlPSBtb2Q7CiAJc3RyZWFtLT5uZXh0X3VmcmFtZSA9IHN0YXJ0OwogCkBAIC0xNDgyLDcgKzE0OTIsNyBAQAogCS8qIG5vIHJvb20gaW4gdGhlIHNjaGVkdWxlICovCiAJZWhjaV9kYmcgKGVoY2ksICJpc28gJXNzY2hlZCBmdWxsICVwIChub3cgJWQgbWF4ICVkKVxuIiwKIAkJbGlzdF9lbXB0eSAoJnN0cmVhbS0+dGRfbGlzdCkgPyAiIiA6ICJyZSIsCi0JCXVyYiwgbm93LCBtYXgpOworCQl1cmIsIG5vdywgbm93ICsgbW9kKTsKIAlzdGF0dXMgPSAtRU5PU1BDOwogCiBmYWlsOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXhpbGlueC1vZi5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXhpbGlueC1vZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODYxNTMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXhpbGlueC1vZi5jCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogRUhDSSBIQ0QgKEhvc3QgQ29udHJvbGxlciBEcml2ZXIpIGZvciBVU0IuCisgKgorICogQnVzIEdsdWUgZm9yIFhpbGlueCBFSENJIGNvcmUgb24gdGhlIG9mX3BsYXRmb3JtIGJ1cworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBYaWxpbngsIEluYy4KKyAqCisgKiBCYXNlZCBvbiAiZWhjaS1wcGMtb2YuYyIgYnkgVmFsZW50aW5lIEJhcnNoYWsgPHZiYXJzaGFrQHJ1Lm12aXN0YS5jb20+CisgKiBhbmQgImVoY2ktcHBjLXNvYy5jIiBieSBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisgKiBhbmQgIm9oY2ktcHBjLW9mLmMiIGJ5IFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCisgKiBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorCisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorCisvKioKKyAqIGVoY2lfeGlsaW54X29mX3NldHVwIC0gSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIGZvciBlaGNpX3Jlc2V0KCkKKyAqIEBoY2Q6CVBvaW50ZXIgdG8gdGhlIHVzYl9oY2QgZGV2aWNlIHRvIHdoaWNoIHRoZSBob3N0IGNvbnRyb2xsZXIgYm91bmQKKyAqCisgKiBjYWxsZWQgZHVyaW5nIHByb2JlKCkgYWZ0ZXIgY2hpcCByZXNldCBjb21wbGV0ZXMuCisgKi8KK3N0YXRpYyBpbnQgZWhjaV94aWxpbnhfb2Zfc2V0dXAoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3QgZWhjaV9oY2QJKmVoY2kgPSBoY2RfdG9fZWhjaShoY2QpOworCWludAkJcmV0dmFsOworCisJcmV0dmFsID0gZWhjaV9oYWx0KGVoY2kpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR2YWwgPSBlaGNpX2luaXQoaGNkKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJZWhjaS0+c2JybiA9IDB4MjA7CisKKwlyZXR1cm4gZWhjaV9yZXNldChlaGNpKTsKK30KKworLyoqCisgKiBlaGNpX3hpbGlueF9wb3J0X2hhbmRlZF9vdmVyIC0gaGFuZCB0aGUgcG9ydCBvdXQgaWYgZmFpbGVkIHRvIGVuYWJsZSBpdAorICogQGhjZDoJUG9pbnRlciB0byB0aGUgdXNiX2hjZCBkZXZpY2UgdG8gd2hpY2ggdGhlIGhvc3QgY29udHJvbGxlciBib3VuZAorICogQHBvcnRudW06UG9ydCBudW1iZXIgdG8gd2hpY2ggdGhlIGRldmljZSBpcyBhdHRhY2hlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBwbGFjZSB0byB0ZWxsIHRoZSB1c2VyIHRoYXQgdGhlIFhpbGlueCBVU0IgaG9zdAorICogY29udHJvbGxlciBkb2VzIHN1cHBvcnQgTFMgZGV2aWNlcy4gQW5kIGluIGFuIEhTIG9ubHkgY29uZmlndXJhdGlvbiwgaXQKKyAqIGRvZXMgbm90IHN1cHBvcnQgRlMgZGV2aWNlcyBlaXRoZXIuIEl0IGlzIGhvcGVkIHRoYXQgdGhpcyBjYW4gaGVscCBhCisgKiBjb25mdXNlZCB1c2VyLgorICoKKyAqIFRoZXJlIGFyZSBjYXNlcyB3aGVuIHRoZSBob3N0IGNvbnRyb2xsZXIgZmFpbHMgdG8gZW5hYmxlIHRoZSBwb3J0IGR1ZSB0bywKKyAqIGZvciBleGFtcGxlLCBpbnN1ZmZpY2llbnQgcG93ZXIgdGhhdCBjYW4gYmUgc3VwcGxpZWQgdG8gdGhlIGRldmljZSBmcm9tCisgKiB0aGUgVVNCIGJ1cy4gSW4gdGhvc2UgY2FzZXMsIHRoZSBtZXNzYWdlcyBwcmludGVkIGhlcmUgYXJlIG5vdCBoZWxwZnVsLgorICovCitzdGF0aWMgaW50IGVoY2lfeGlsaW54X3BvcnRfaGFuZGVkX292ZXIoc3RydWN0IHVzYl9oY2QgKmhjZCwgaW50IHBvcnRudW0pCit7CisJZGV2X3dhcm4oaGNkLT5zZWxmLmNvbnRyb2xsZXIsICJwb3J0ICVkIGNhbm5vdCBiZSBlbmFibGVkXG4iLCBwb3J0bnVtKTsKKwlpZiAoaGNkLT5oYXNfdHQpIHsKKwkJZGV2X3dhcm4oaGNkLT5zZWxmLmNvbnRyb2xsZXIsCisJCQkiTWF5YmUgeW91IGhhdmUgY29ubmVjdGVkIGEgbG93IHNwZWVkIGRldmljZT9cbiIpOworCisJCWRldl93YXJuKGhjZC0+c2VsZi5jb250cm9sbGVyLAorCQkJIldlIGRvIG5vdCBzdXBwb3J0IGxvdyBzcGVlZCBkZXZpY2VzXG4iKTsKKwl9IGVsc2UgeworCQlkZXZfd2FybihoY2QtPnNlbGYuY29udHJvbGxlciwKKwkJCSJNYXliZSB5b3VyIGRldmljZSBpcyBub3QgYSBoaWdoIHNwZWVkIGRldmljZT9cbiIpOworCQlkZXZfd2FybihoY2QtPnNlbGYuY29udHJvbGxlciwKKwkJCSJUaGUgVVNCIGhvc3QgY29udHJvbGxlciBkb2VzIG5vdCBzdXBwb3J0IGZ1bGwgc3BlZWQgIgorCQkJIm5vciBsb3cgc3BlZWQgZGV2aWNlc1xuIik7CisJCWRldl93YXJuKGhjZC0+c2VsZi5jb250cm9sbGVyLAorCQkJIllvdSBjYW4gcmVjb25maWd1cmUgdGhlIGhvc3QgY29udHJvbGxlciB0byBoYXZlICIKKwkJCSJmdWxsIHNwZWVkIHN1cHBvcnRcbiIpOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGNfZHJpdmVyIGVoY2lfeGlsaW54X29mX2hjX2RyaXZlciA9IHsKKwkuZGVzY3JpcHRpb24JCT0gaGNkX25hbWUsCisJLnByb2R1Y3RfZGVzYwkJPSAiT0YgRUhDSSIsCisJLmhjZF9wcml2X3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBlaGNpX2hjZCksCisKKwkvKgorCSAqIGdlbmVyaWMgaGFyZHdhcmUgbGlua2FnZQorCSAqLworCS5pcnEJCQk9IGVoY2lfaXJxLAorCS5mbGFncwkJCT0gSENEX01FTU9SWSB8IEhDRF9VU0IyLAorCisJLyoKKwkgKiBiYXNpYyBsaWZlY3ljbGUgb3BlcmF0aW9ucworCSAqLworCS5yZXNldAkJCT0gZWhjaV94aWxpbnhfb2Zfc2V0dXAsCisJLnN0YXJ0CQkJPSBlaGNpX3J1biwKKwkuc3RvcAkJCT0gZWhjaV9zdG9wLAorCS5zaHV0ZG93bgkJPSBlaGNpX3NodXRkb3duLAorCisJLyoKKwkgKiBtYW5hZ2luZyBpL28gcmVxdWVzdHMgYW5kIGFzc29jaWF0ZWQgZGV2aWNlIHJlc291cmNlcworCSAqLworCS51cmJfZW5xdWV1ZQkJPSBlaGNpX3VyYl9lbnF1ZXVlLAorCS51cmJfZGVxdWV1ZQkJPSBlaGNpX3VyYl9kZXF1ZXVlLAorCS5lbmRwb2ludF9kaXNhYmxlCT0gZWhjaV9lbmRwb2ludF9kaXNhYmxlLAorCisJLyoKKwkgKiBzY2hlZHVsaW5nIHN1cHBvcnQKKwkgKi8KKwkuZ2V0X2ZyYW1lX251bWJlcgk9IGVoY2lfZ2V0X2ZyYW1lLAorCisJLyoKKwkgKiByb290IGh1YiBzdXBwb3J0CisJICovCisJLmh1Yl9zdGF0dXNfZGF0YQk9IGVoY2lfaHViX3N0YXR1c19kYXRhLAorCS5odWJfY29udHJvbAkJPSBlaGNpX2h1Yl9jb250cm9sLAorI2lmZGVmCUNPTkZJR19QTQorCS5idXNfc3VzcGVuZAkJPSBlaGNpX2J1c19zdXNwZW5kLAorCS5idXNfcmVzdW1lCQk9IGVoY2lfYnVzX3Jlc3VtZSwKKyNlbmRpZgorCS5yZWxpbnF1aXNoX3BvcnQJPSBOVUxMLAorCS5wb3J0X2hhbmRlZF9vdmVyCT0gZWhjaV94aWxpbnhfcG9ydF9oYW5kZWRfb3ZlciwKKworCS5jbGVhcl90dF9idWZmZXJfY29tcGxldGUgPSBlaGNpX2NsZWFyX3R0X2J1ZmZlcl9jb21wbGV0ZSwKK307CisKKy8qKgorICogZWhjaV9oY2RfeGlsaW54X29mX3Byb2JlIC0gUHJvYmUgbWV0aG9kIGZvciB0aGUgVVNCIGhvc3QgY29udHJvbGxlcgorICogQG9wOgkJcG9pbnRlciB0byB0aGUgb2ZfZGV2aWNlIHRvIHdoaWNoIHRoZSBob3N0IGNvbnRyb2xsZXIgYm91bmQKKyAqIEBtYXRjaDoJcG9pbnRlciB0byBvZl9kZXZpY2VfaWQgc3RydWN0dXJlLCBub3QgdXNlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVxdWVzdHMgcmVzb3VyY2VzIGFuZCBzZXRzIHVwIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgZm9yIHRoZQorICogaG9zdCBjb250cm9sbGVyLiBCZWNhdXNlIHRoZSBYaWxpbnggVVNCIGhvc3QgY29udHJvbGxlciBjYW4gYmUgY29uZmlndXJlZAorICogYXMgSFMgb25seSBvciBIUy9GUyBvbmx5LCBpdCBjaGVja3MgdGhlIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGRldmljZSB0cmVlCisgKiBlbnRyeSwgYW5kIHNldHMgYW4gYXBwcm9wcmlhdGUgdmFsdWUgZm9yIGhjZC0+aGFzX3R0LgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdAorZWhjaV9oY2RfeGlsaW54X29mX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gb3AtPm5vZGU7CisJc3RydWN0IHVzYl9oY2QgKmhjZDsKKwlzdHJ1Y3QgZWhjaV9oY2QJKmVoY2k7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwlpbnQgaXJxOworCWludCBydjsKKwlpbnQgKnZhbHVlOworCisJaWYgKHVzYl9kaXNhYmxlZCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldl9kYmcoJm9wLT5kZXYsICJpbml0aWFsaXppbmcgWElMSU5YLU9GIFVTQiBDb250cm9sbGVyXG4iKTsKKworCXJ2ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShkbiwgMCwgJnJlcyk7CisJaWYgKHJ2KQorCQlyZXR1cm4gcnY7CisKKwloY2QgPSB1c2JfY3JlYXRlX2hjZCgmZWhjaV94aWxpbnhfb2ZfaGNfZHJpdmVyLCAmb3AtPmRldiwKKwkJCQkiWElMSU5YLU9GIFVTQiIpOworCWlmICghaGNkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhjZC0+cnNyY19zdGFydCA9IHJlcy5zdGFydDsKKwloY2QtPnJzcmNfbGVuID0gcmVzLmVuZCAtIHJlcy5zdGFydCArIDE7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4sIGhjZF9uYW1lKSkgeworCQlwcmludGsoS0VSTl9FUlIgX19GSUxFX18gIjogcmVxdWVzdF9tZW1fcmVnaW9uIGZhaWxlZFxuIik7CisJCXJ2ID0gLUVCVVNZOworCQlnb3RvIGVycl9ybXI7CisJfQorCisJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZG4sIDApOworCWlmIChpcnEgPT0gTk9fSVJRKSB7CisJCXByaW50ayhLRVJOX0VSUiBfX0ZJTEVfXyAiOiBpcnFfb2ZfcGFyc2VfYW5kX21hcCBmYWlsZWRcbiIpOworCQlydiA9IC1FQlVTWTsKKwkJZ290byBlcnJfaXJxOworCX0KKworCWhjZC0+cmVncyA9IGlvcmVtYXAoaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKKwlpZiAoIWhjZC0+cmVncykgeworCQlwcmludGsoS0VSTl9FUlIgX19GSUxFX18gIjogaW9yZW1hcCBmYWlsZWRcbiIpOworCQlydiA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2lvcmVtYXA7CisJfQorCisJZWhjaSA9IGhjZF90b19laGNpKGhjZCk7CisKKwkvKiBUaGlzIGNvcmUgYWx3YXlzIGhhcyBiaWctZW5kaWFuIHJlZ2lzdGVyIGludGVyZmFjZSBhbmQgdXNlcworCSAqIGJpZy1lbmRpYW4gbWVtb3J5IGRlc2NyaXB0b3JzLgorCSAqLworCWVoY2ktPmJpZ19lbmRpYW5fbW1pbyA9IDE7CisJZWhjaS0+YmlnX2VuZGlhbl9kZXNjID0gMTsKKworCS8qIENoZWNrIHdoZXRoZXIgdGhlIEZTIHN1cHBvcnQgb3B0aW9uIGlzIHNlbGVjdGVkIGluIHRoZSBoYXJkd2FyZS4KKwkgKi8KKwl2YWx1ZSA9IChpbnQgKilvZl9nZXRfcHJvcGVydHkoZG4sICJ4bG54LHN1cHBvcnQtdXNiLWZzIiwgTlVMTCk7CisJaWYgKHZhbHVlICYmICgqdmFsdWUgPT0gMSkpIHsKKwkJZWhjaV9kYmcoZWhjaSwgIlVTQiBob3N0IGNvbnRyb2xsZXIgc3VwcG9ydHMgRlMgZGV2aWNlc1xuIik7CisJCWhjZC0+aGFzX3R0ID0gMTsKKwl9IGVsc2UgeworCQllaGNpX2RiZyhlaGNpLAorCQkJIlVTQiBob3N0IGNvbnRyb2xsZXIgaXMgSFMgb25seVxuIik7CisJCWhjZC0+aGFzX3R0ID0gMDsKKwl9CisKKwkvKiBEZWJ1ZyByZWdpc3RlcnMgYXJlIGF0IHRoZSBmaXJzdCAweDEwMCByZWdpb24KKwkgKi8KKwllaGNpLT5jYXBzID0gaGNkLT5yZWdzICsgMHgxMDA7CisJZWhjaS0+cmVncyA9IGhjZC0+cmVncyArIDB4MTAwICsKKwkJCUhDX0xFTkdUSChlaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5jYXBzLT5oY19jYXBiYXNlKSk7CisKKwkvKiBjYWNoZSB0aGlzIHJlYWRvbmx5IGRhdGE7IG1pbmltaXplIGNoaXAgcmVhZHMgKi8KKwllaGNpLT5oY3NfcGFyYW1zID0gZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+Y2Fwcy0+aGNzX3BhcmFtcyk7CisKKwlydiA9IHVzYl9hZGRfaGNkKGhjZCwgaXJxLCAwKTsKKwlpZiAocnYgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpb3VubWFwKGhjZC0+cmVncyk7CisKK2Vycl9pb3JlbWFwOgorZXJyX2lycToKKwlyZWxlYXNlX21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKK2Vycl9ybXI6CisJdXNiX3B1dF9oY2QoaGNkKTsKKworCXJldHVybiBydjsKK30KKworLyoqCisgKiBlaGNpX2hjZF94aWxpbnhfb2ZfcmVtb3ZlIC0gc2h1dGRvd24gaGNkIGFuZCByZWxlYXNlIHJlc291cmNlcworICogQG9wOgkJcG9pbnRlciB0byBvZl9kZXZpY2Ugc3RydWN0dXJlIHRoYXQgaXMgdG8gYmUgcmVtb3ZlZAorICoKKyAqIFJlbW92ZSB0aGUgaGNkIHN0cnVjdHVyZSwgYW5kIHJlbGVhc2UgcmVzb3VyY2VzIHRoYXQgaGFzIGJlZW4gcmVxdWVzdGVkCisgKiBkdXJpbmcgcHJvYmUuCisgKi8KK3N0YXRpYyBpbnQgZWhjaV9oY2RfeGlsaW54X29mX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKK3sKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKKwlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIE5VTEwpOworCisJZGV2X2RiZygmb3AtPmRldiwgInN0b3BwaW5nIFhJTElOWC1PRiBVU0IgQ29udHJvbGxlclxuIik7CisKKwl1c2JfcmVtb3ZlX2hjZChoY2QpOworCisJaW91bm1hcChoY2QtPnJlZ3MpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4pOworCisJdXNiX3B1dF9oY2QoaGNkKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGVoY2lfaGNkX3hpbGlueF9vZl9zaHV0ZG93biAtIHNodXRkb3duIHRoZSBoY2QKKyAqIEBvcDoJCXBvaW50ZXIgdG8gb2ZfZGV2aWNlIHN0cnVjdHVyZSB0aGF0IGlzIHRvIGJlIHJlbW92ZWQKKyAqCisgKiBQcm9wZXJseSBzaHV0ZG93biB0aGUgaGNkLCBjYWxsIGRyaXZlcidzIHNodXRkb3duIHJvdXRpbmUuCisgKi8KK3N0YXRpYyBpbnQgZWhjaV9oY2RfeGlsaW54X29mX3NodXRkb3duKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQoreworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOworCisJaWYgKGhjZC0+ZHJpdmVyLT5zaHV0ZG93bikKKwkJaGNkLT5kcml2ZXItPnNodXRkb3duKGhjZCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBlaGNpX2hjZF94aWxpbnhfb2ZfbWF0Y2hbXSA9IHsKKwkJey5jb21wYXRpYmxlID0gInhsbngseHBzLXVzYi1ob3N0LTEuMDAuYSIsfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBlaGNpX2hjZF94aWxpbnhfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBlaGNpX2hjZF94aWxpbnhfb2ZfZHJpdmVyID0geworCS5uYW1lCQk9ICJ4aWxpbngtb2YtZWhjaSIsCisJLm1hdGNoX3RhYmxlCT0gZWhjaV9oY2RfeGlsaW54X29mX21hdGNoLAorCS5wcm9iZQkJPSBlaGNpX2hjZF94aWxpbnhfb2ZfcHJvYmUsCisJLnJlbW92ZQkJPSBlaGNpX2hjZF94aWxpbnhfb2ZfcmVtb3ZlLAorCS5zaHV0ZG93bgk9IGVoY2lfaGNkX3hpbGlueF9vZl9zaHV0ZG93biwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAieGlsaW54LW9mLWVoY2kiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTM2Mi5oIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxMzYyLmgKaW5kZXggMWEyNTNlYi4uNTE1MTUxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9pc3AxMzYyLmgKKysrIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxMzYyLmgKQEAgLTUzNCw4ICs1MzQsOCBAQAogCiAJLyogcGVyaW9kaWMgc2NoZWR1bGU6IGlzb2Nocm9ub3VzICovCiAJc3RydWN0IGxpc3RfaGVhZAlpc29jOwotCWludAkJCWlzdGxfZmxpcDoxOwotCWludAkJCWlycV9hY3RpdmU6MTsKKwl1bnNpZ25lZCBpbnQJCWlzdGxfZmxpcDoxOworCXVuc2lnbmVkIGludAkJaXJxX2FjdGl2ZToxOwogCiAJLyogU2NoZWR1bGVzIGZvciB0aGUgY3VycmVudCBmcmFtZSAqLwogCXN0cnVjdCBpc3AxMzYyX2VwX3F1ZXVlIGF0bF9xdWV1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdDkxLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXQ5MS5jCmluZGV4IDdjY2ZmY2IuLjY4YjgzYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdDkxLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF0OTEuYwpAQCAtMzUsNyArMzUsNyBAQAogCiBzdGF0aWMgdm9pZCBhdDkxX3N0YXJ0X2Nsb2NrKHZvaWQpCiB7Ci0JaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpKQorCWlmIChjcHVfaXNfYXQ5MXNhbTkyNjEoKSB8fCBjcHVfaXNfYXQ5MXNhbTlnMTAoKSkKIAkJY2xrX2VuYWJsZShoY2xrKTsKIAljbGtfZW5hYmxlKGljbGspOwogCWNsa19lbmFibGUoZmNsayk7CkBAIC00Niw3ICs0Niw3IEBACiB7CiAJY2xrX2Rpc2FibGUoZmNsayk7CiAJY2xrX2Rpc2FibGUoaWNsayk7Ci0JaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpKQorCWlmIChjcHVfaXNfYXQ5MXNhbTkyNjEoKSB8fCBjcHVfaXNfYXQ5MXNhbTlnMTAoKSkKIAkJY2xrX2Rpc2FibGUoaGNsayk7CiAJY2xvY2tlZCA9IDA7CiB9CkBAIC0xNDIsNyArMTQyLDcgQEAKIAogCWljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJvaGNpX2NsayIpOwogCWZjbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJ1aHBjayIpOwotCWlmIChjcHVfaXNfYXQ5MXNhbTkyNjEoKSkKKwlpZiAoY3B1X2lzX2F0OTFzYW05MjYxKCkgfHwgY3B1X2lzX2F0OTFzYW05ZzEwKCkpCiAJCWhjbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJoY2swIik7CiAKIAlhdDkxX3N0YXJ0X2hjKHBkZXYpOwpAQCAtMTU1LDcgKzE1NSw3IEBACiAJLyogRXJyb3IgaGFuZGxpbmcgKi8KIAlhdDkxX3N0b3BfaGMocGRldik7CiAKLQlpZiAoY3B1X2lzX2F0OTFzYW05MjYxKCkpCisJaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpIHx8IGNwdV9pc19hdDkxc2FtOWcxMCgpKQogCQljbGtfcHV0KGhjbGspOwogCWNsa19wdXQoZmNsayk7CiAJY2xrX3B1dChpY2xrKTsKQEAgLTE5Miw3ICsxOTIsNyBAQAogCXJlbGVhc2VfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4pOwogCXVzYl9wdXRfaGNkKGhjZCk7CiAKLQlpZiAoY3B1X2lzX2F0OTFzYW05MjYxKCkpCisJaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpIHx8IGNwdV9pc19hdDkxc2FtOWcxMCgpKQogCQljbGtfcHV0KGhjbGspOwogCWNsa19wdXQoZmNsayk7CiAJY2xrX3B1dChpY2xrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng0MDA4LmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcG54NDAwOC5jCmluZGV4IDEwMGJmM2QuLjI3NjkzMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng0MDA4LmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBueDQwMDguYwpAQCAtOTgsOCArOTgsOCBAQAogI2RlZmluZSBJU1AxMzAxX0kyQ19JTlRFUlJVUFRfUklTSU5HIDB4RQogI2RlZmluZSBJU1AxMzAxX0kyQ19SRUdfQ0xFQVJfQUREUiAxCiAKLXN0cnVjdCBpMmNfZHJpdmVyIGlzcDEzMDFfZHJpdmVyOwotc3RydWN0IGkyY19jbGllbnQgKmlzcDEzMDFfaTJjX2NsaWVudDsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpc3AxMzAxX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqaXNwMTMwMV9pMmNfY2xpZW50OwogCiBleHRlcm4gaW50IHVzYl9kaXNhYmxlZCh2b2lkKTsKIGV4dGVybiBpbnQgb2NwaV9lbmFibGUodm9pZCk7CkBAIC0xMjAsMTIgKzEyMCwxMiBAQAogCXJldHVybiAwOwogfQogCi1jb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBpc3AxMzAxX2lkW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgaXNwMTMwMV9pZFtdID0gewogCXsgImlzcDEzMDFfcG54IiwgMCB9LAogCXsgfQogfTsKIAotc3RydWN0IGkyY19kcml2ZXIgaXNwMTMwMV9kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaXNwMTMwMV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiaXNwMTMwMV9wbngiLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny1oY2QuYwppbmRleCBlMzNkMzYyLi40MWRiYzcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvcjhhNjY1OTctaGNkLmMKQEAgLTgyMiw4ICs4MjIsNiBAQAogCQlyZXR1cm47CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGQsIG5leHQsIGxpc3QsIHF1ZXVlKSB7Ci0JCWlmICghdGQpCi0JCQljb250aW51ZTsKIAkJaWYgKHRkLT5hZGRyZXNzICE9IGFkZHJlc3MpCiAJCQljb250aW51ZTsKIApAQCAtMjAyNSw4ICsyMDIzLDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0ID0gJnI4YTY2NTk3LT5jaGlsZF9kZXZpY2U7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgbGlzdCwgZGV2aWNlX2xpc3QpIHsKLQkJaWYgKCFkZXYpCi0JCQljb250aW51ZTsKIAkJaWYgKGRldi0+dXNiX2FkZHJlc3MgIT0gYWRkcikKIAkJCWNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3doY2kvZGVidWcuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9kZWJ1Zy5jCmluZGV4IDIyNzNjODEuLjhjMWM2MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9kZWJ1Zy5jCkBAIC0zMSwxNyArMzEsMjkgQEAKIAogdm9pZCBxc2V0X3ByaW50KHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IHdoY19xc2V0ICpxc2V0KQogeworCXN0YXRpYyBjb25zdCBjaGFyICpxaF90eXBlW10gPSB7CisJCSJjdHJsIiwgImlzb2MiLCAiYnVsayIsICJpbnRyIiwgInJzdmQiLCAicnN2ZCIsICJyc3ZkIiwgImxwaW50ciIsIH07CiAJc3RydWN0IHdoY19zdGQgKnN0ZDsKIAlzdHJ1Y3QgdXJiICp1cmIgPSBOVUxMOwogCWludCBpOwogCi0Jc2VxX3ByaW50ZihzLCAicXNldCAlMDh4XG4iLCAodTMyKXFzZXQtPnFzZXRfZG1hKTsKKwlzZXFfcHJpbnRmKHMsICJxc2V0ICUwOHgiLCAodTMyKXFzZXQtPnFzZXRfZG1hKTsKKwlpZiAoJnFzZXQtPmxpc3Rfbm9kZSA9PSBxc2V0LT53aGMtPmFzeW5jX2xpc3QucHJldikgeworCQlzZXFfcHJpbnRmKHMsICIgKGR1bW15KVxuIik7CisJfSBlbHNlIHsKKwkJc2VxX3ByaW50ZihzLCAiIGVwJWQlcy0lcyBtYXhwa3Q6ICVkXG4iLAorCQkJICAgcXNldC0+cWguaW5mbzEgJiAweDBmLAorCQkJICAgKHFzZXQtPnFoLmluZm8xID4+IDQpICYgMHgxID8gImluIiA6ICJvdXQiLAorCQkJICAgcWhfdHlwZVsocXNldC0+cWguaW5mbzEgPj4gNSkgJiAweDddLAorCQkJICAgKHFzZXQtPnFoLmluZm8xID4+IDE2KSAmIDB4ZmZmZik7CisJfQogCXNlcV9wcmludGYocywgIiAgLT4gJTA4eFxuIiwgKHUzMilxc2V0LT5xaC5saW5rKTsKIAlzZXFfcHJpbnRmKHMsICIgIGluZm86ICUwOHggJTA4eCAlMDh4XG4iLAotCQlxc2V0LT5xaC5pbmZvMSwgcXNldC0+cWguaW5mbzIsICBxc2V0LT5xaC5pbmZvMyk7Ci0Jc2VxX3ByaW50ZihzLCAiICBzdHM6ICUwNHggZXJyczogJWRcbiIsIHFzZXQtPnFoLnN0YXR1cywgcXNldC0+cWguZXJyX2NvdW50KTsKKwkJICAgcXNldC0+cWguaW5mbzEsIHFzZXQtPnFoLmluZm8yLCAgcXNldC0+cWguaW5mbzMpOworCXNlcV9wcmludGYocywgIiAgc3RzOiAlMDR4IGVycnM6ICVkIGN1cndpbjogJTA4eFxuIiwKKwkJICAgcXNldC0+cWguc3RhdHVzLCBxc2V0LT5xaC5lcnJfY291bnQsIHFzZXQtPnFoLmN1cl93aW5kb3cpOwogCXNlcV9wcmludGYocywgIiAgVEQ6IHN0czogJTA4eCBvcHRzOiAlMDh4XG4iLAotCQlxc2V0LT5xaC5vdmVybGF5LnF0ZC5zdGF0dXMsIHFzZXQtPnFoLm92ZXJsYXkucXRkLm9wdGlvbnMpOworCQkgICBxc2V0LT5xaC5vdmVybGF5LnF0ZC5zdGF0dXMsIHFzZXQtPnFoLm92ZXJsYXkucXRkLm9wdGlvbnMpOwogCiAJZm9yIChpID0gMDsgaSA8IFdIQ0lfUVNFVF9URF9NQVg7IGkrKykgewogCQlzZXFfcHJpbnRmKHMsICIgICVjJWMgVERbJWRdOiBzdHM6ICUwOHggb3B0czogJTA4eCBwdHI6ICUwOHhcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3doY2kvaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3doY2kvaGNkLmMKaW5kZXggNjg3YjYyMi4uZTBkMzQwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC93aGNpL2hjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9oY2QuYwpAQCAtMjUwLDYgKzI1MCw3IEBACiAJfQogCiAJdXNiX2hjZC0+d2lyZWxlc3MgPSAxOworCXVzYl9oY2QtPnNlbGYuc2dfdGFibGVzaXplID0gMjA0ODsgLyogc29tZXdoYXQgYXJiaXRyYXJ5ICovCiAKIAl3dXNiaGMgPSB1c2JfaGNkX3RvX3d1c2JoYyh1c2JfaGNkKTsKIAl3aGMgPSB3dXNiaGNfdG9fd2hjKHd1c2JoYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3doY2kvcXNldC5jIGIvZHJpdmVycy91c2IvaG9zdC93aGNpL3FzZXQuYwppbmRleCAxYjlkYzE1Li43ZDQyMDRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3doY2kvcXNldC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9xc2V0LmMKQEAgLTQ5LDE2ICs0OSwxOSBAQAogICogICAgICAgIHN0YXRlCiAgKiBAdXJiOiAgYW4gdXJiIGZvciBhIHRyYW5zZmVyIHRvIHRoaXMgZW5kcG9pbnQKICAqLwotc3RhdGljIHZvaWQgcXNldF9maWxsX3FoKHN0cnVjdCB3aGNfcXNldCAqcXNldCwgc3RydWN0IHVyYiAqdXJiKQorc3RhdGljIHZvaWQgcXNldF9maWxsX3FoKHN0cnVjdCB3aGMgKndoYywgc3RydWN0IHdoY19xc2V0ICpxc2V0LCBzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSB1cmItPmRldjsKKwlzdHJ1Y3Qgd3VzYl9kZXYgKnd1c2JfZGV2ID0gdXNiX2Rldi0+d3VzYl9kZXY7CiAJc3RydWN0IHVzYl93aXJlbGVzc19lcF9jb21wX2Rlc2NyaXB0b3IgKmVwY2Q7CiAJYm9vbCBpc19vdXQ7CisJdWludDhfdCBwaHlfcmF0ZTsKIAogCWlzX291dCA9IHVzYl9waXBlb3V0KHVyYi0+cGlwZSk7CiAKLQllcGNkID0gKHN0cnVjdCB1c2Jfd2lyZWxlc3NfZXBfY29tcF9kZXNjcmlwdG9yICopcXNldC0+ZXAtPmV4dHJhOworCXFzZXQtPm1heF9wYWNrZXQgPSBsZTE2X3RvX2NwdSh1cmItPmVwLT5kZXNjLndNYXhQYWNrZXRTaXplKTsKIAorCWVwY2QgPSAoc3RydWN0IHVzYl93aXJlbGVzc19lcF9jb21wX2Rlc2NyaXB0b3IgKilxc2V0LT5lcC0+ZXh0cmE7CiAJaWYgKGVwY2QpIHsKIAkJcXNldC0+bWF4X3NlcSA9IGVwY2QtPmJNYXhTZXF1ZW5jZTsKIAkJcXNldC0+bWF4X2J1cnN0ID0gZXBjZC0+Yk1heEJ1cnN0OwpAQCAtNjcsMTIgKzcwLDI4IEBACiAJCXFzZXQtPm1heF9idXJzdCA9IDE7CiAJfQogCisJLyoKKwkgKiBJbml0aWFsIFBIWSByYXRlIGlzIDUzLjMgTWJpdC9zIGZvciBjb250cm9sIGVuZHBvaW50cyBvcgorCSAqIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIGZvciBvdGhlciBlbmRwb2ludHMKKwkgKiAodW5sZXNzIGxpbWl0ZWQgYnkgdGhlIHVzZXIpLgorCSAqLworCWlmICh1c2JfcGlwZWNvbnRyb2wodXJiLT5waXBlKSkKKwkJcGh5X3JhdGUgPSBVV0JfUEhZX1JBVEVfNTM7CisJZWxzZSB7CisJCXVpbnQxNl90IHBoeV9yYXRlczsKKworCQlwaHlfcmF0ZXMgPSBsZTE2X3RvX2NwdSh3dXNiX2Rldi0+d3VzYl9jYXBfZGVzY3ItPndQSFlSYXRlcyk7CisJCXBoeV9yYXRlID0gZmxzKHBoeV9yYXRlcykgLSAxOworCQlpZiAocGh5X3JhdGUgPiB3aGMtPnd1c2JoYy5waHlfcmF0ZSkKKwkJCXBoeV9yYXRlID0gd2hjLT53dXNiaGMucGh5X3JhdGU7CisJfQorCiAJcXNldC0+cWguaW5mbzEgPSBjcHVfdG9fbGUzMigKIAkJUUhfSU5GTzFfRVAodXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpKQogCQl8IChpc19vdXQgPyBRSF9JTkZPMV9ESVJfT1VUIDogUUhfSU5GTzFfRElSX0lOKQogCQl8IHVzYl9waXBlX3RvX3FoX3R5cGUodXJiLT5waXBlKQogCQl8IFFIX0lORk8xX0RFVl9JTkZPX0lEWCh3dXNiX3BvcnRfbm9fdG9faWR4KHVzYl9kZXYtPnBvcnRudW0pKQotCQl8IFFIX0lORk8xX01BWF9QS1RfTEVOKHVzYl9tYXhwYWNrZXQodXJiLT5kZXYsIHVyYi0+cGlwZSwgaXNfb3V0KSkKKwkJfCBRSF9JTkZPMV9NQVhfUEtUX0xFTihxc2V0LT5tYXhfcGFja2V0KQogCQkpOwogCXFzZXQtPnFoLmluZm8yID0gY3B1X3RvX2xlMzIoCiAJCVFIX0lORk8yX0JVUlNUKHFzZXQtPm1heF9idXJzdCkKQEAgLTg2LDcgKzEwNSw3IEBACiAJICogc3RyZW5ndGggYW5kIGNhbiBwcmVzdW1hYmx5IGd1ZXNzIHRoZSBUeCBwb3dlciByZXF1aXJlZAogCSAqIGZyb20gdGhhdD8gKi8KIAlxc2V0LT5xaC5pbmZvMyA9IGNwdV90b19sZTMyKAotCQlRSF9JTkZPM19UWF9SQVRFXzUzXzMKKwkJUUhfSU5GTzNfVFhfUkFURShwaHlfcmF0ZSkKIAkJfCBRSF9JTkZPM19UWF9QV1IoMCkgLyogMCA9PSBtYXggcG93ZXIgKi8KIAkJKTsKIApAQCAtMTQ4LDcgKzE2Nyw3IEBACiAKIAkJcXNldC0+ZXAgPSB1cmItPmVwOwogCQl1cmItPmVwLT5oY3ByaXYgPSBxc2V0OwotCQlxc2V0X2ZpbGxfcWgocXNldCwgdXJiKTsKKwkJcXNldF9maWxsX3FoKHdoYywgcXNldCwgdXJiKTsKIAl9CiAJcmV0dXJuIHFzZXQ7CiB9CkBAIC0yNDEsNiArMjYwLDM2IEBACiAJcXNldC0+bnRkcy0tOwogfQogCitzdGF0aWMgdm9pZCBxc2V0X2NvcHlfYm91bmNlX3RvX3NnKHN0cnVjdCB3aGMgKndoYywgc3RydWN0IHdoY19zdGQgKnN0ZCkKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXZvaWQgKmJvdW5jZTsKKwlzaXplX3QgcmVtYWluaW5nLCBvZmZzZXQ7CisKKwlib3VuY2UgPSBzdGQtPmJvdW5jZV9idWY7CisJcmVtYWluaW5nID0gc3RkLT5sZW47CisKKwlzZyA9IHN0ZC0+Ym91bmNlX3NnOworCW9mZnNldCA9IHN0ZC0+Ym91bmNlX29mZnNldDsKKworCXdoaWxlIChyZW1haW5pbmcpIHsKKwkJc2l6ZV90IGxlbjsKKworCQlsZW4gPSBtaW4oc2ctPmxlbmd0aCAtIG9mZnNldCwgcmVtYWluaW5nKTsKKwkJbWVtY3B5KHNnX3ZpcnQoc2cpICsgb2Zmc2V0LCBib3VuY2UsIGxlbik7CisKKwkJYm91bmNlICs9IGxlbjsKKwkJcmVtYWluaW5nIC09IGxlbjsKKworCQlvZmZzZXQgKz0gbGVuOworCQlpZiAob2Zmc2V0ID49IHNnLT5sZW5ndGgpIHsKKwkJCXNnID0gc2dfbmV4dChzZyk7CisJCQlvZmZzZXQgPSAwOworCQl9CisJfQorCit9CisKIC8qKgogICogcXNldF9mcmVlX3N0ZCAtIHJlbW92ZSBhbiBzVEQgYW5kIGZyZWUgaXQuCiAgKiBAd2hjOiB0aGUgV0hDSSBob3N0IGNvbnRyb2xsZXIKQEAgLTI0OSwxMyArMjk4LDI5IEBACiB2b2lkIHFzZXRfZnJlZV9zdGQoc3RydWN0IHdoYyAqd2hjLCBzdHJ1Y3Qgd2hjX3N0ZCAqc3RkKQogewogCWxpc3RfZGVsKCZzdGQtPmxpc3Rfbm9kZSk7Ci0JaWYgKHN0ZC0+bnVtX3BvaW50ZXJzKSB7Ci0JCWRtYV91bm1hcF9zaW5nbGUod2hjLT53dXNiaGMuZGV2LCBzdGQtPmRtYV9hZGRyLAotCQkJCSBzdGQtPm51bV9wb2ludGVycyAqIHNpemVvZihzdHJ1Y3Qgd2hjX3BhZ2VfbGlzdF9lbnRyeSksCi0JCQkJIERNQV9UT19ERVZJQ0UpOwotCQlrZnJlZShzdGQtPnBsX3ZpcnQpOwotCX0KKwlpZiAoc3RkLT5ib3VuY2VfYnVmKSB7CisJCWJvb2wgaXNfb3V0ID0gdXNiX3BpcGVvdXQoc3RkLT51cmItPnBpcGUpOworCQlkbWFfYWRkcl90IGRtYV9hZGRyOwogCisJCWlmIChzdGQtPm51bV9wb2ludGVycykKKwkJCWRtYV9hZGRyID0gbGU2NF90b19jcHUoc3RkLT5wbF92aXJ0WzBdLmJ1Zl9wdHIpOworCQllbHNlCisJCQlkbWFfYWRkciA9IHN0ZC0+ZG1hX2FkZHI7CisKKwkJZG1hX3VubWFwX3NpbmdsZSh3aGMtPnd1c2JoYy5kZXYsIGRtYV9hZGRyLAorCQkJCSBzdGQtPmxlbiwgaXNfb3V0ID8gRE1BX1RPX0RFVklDRSA6IERNQV9GUk9NX0RFVklDRSk7CisJCWlmICghaXNfb3V0KQorCQkJcXNldF9jb3B5X2JvdW5jZV90b19zZyh3aGMsIHN0ZCk7CisJCWtmcmVlKHN0ZC0+Ym91bmNlX2J1Zik7CisJfQorCWlmIChzdGQtPnBsX3ZpcnQpIHsKKwkJaWYgKHN0ZC0+ZG1hX2FkZHIpCisJCQlkbWFfdW5tYXBfc2luZ2xlKHdoYy0+d3VzYmhjLmRldiwgc3RkLT5kbWFfYWRkciwKKwkJCQkJIHN0ZC0+bnVtX3BvaW50ZXJzICogc2l6ZW9mKHN0cnVjdCB3aGNfcGFnZV9saXN0X2VudHJ5KSwKKwkJCQkJIERNQV9UT19ERVZJQ0UpOworCQlrZnJlZShzdGQtPnBsX3ZpcnQpOworCQlzdGQtPnBsX3ZpcnQgPSBOVUxMOworCX0KIAlrZnJlZShzdGQpOwogfQogCkBAIC0yOTMsMTIgKzM1OCwxNyBAQAogewogCWRtYV9hZGRyX3QgZG1hX2FkZHIgPSBzdGQtPmRtYV9hZGRyOwogCWRtYV9hZGRyX3Qgc3AsIGVwOwotCXNpemVfdCBzdGRfbGVuID0gc3RkLT5sZW47CiAJc2l6ZV90IHBsX2xlbjsKIAlpbnQgcDsKIAotCXNwID0gQUxJR04oZG1hX2FkZHIsIFdIQ0lfUEFHRV9TSVpFKTsKLQllcCA9IGRtYV9hZGRyICsgc3RkX2xlbjsKKwkvKiBTaG9ydCBidWZmZXJzIGRvbid0IG5lZWQgYSBwYWdlIGxpc3QuICovCisJaWYgKHN0ZC0+bGVuIDw9IFdIQ0lfUEFHRV9TSVpFKSB7CisJCXN0ZC0+bnVtX3BvaW50ZXJzID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJc3AgPSBkbWFfYWRkciAmIH4oV0hDSV9QQUdFX1NJWkUtMSk7CisJZXAgPSBkbWFfYWRkciArIHN0ZC0+bGVuOwogCXN0ZC0+bnVtX3BvaW50ZXJzID0gRElWX1JPVU5EX1VQKGVwIC0gc3AsIFdIQ0lfUEFHRV9TSVpFKTsKIAogCXBsX2xlbiA9IHN0ZC0+bnVtX3BvaW50ZXJzICogc2l6ZW9mKHN0cnVjdCB3aGNfcGFnZV9saXN0X2VudHJ5KTsKQEAgLTMwOSw3ICszNzksNyBAQAogCiAJZm9yIChwID0gMDsgcCA8IHN0ZC0+bnVtX3BvaW50ZXJzOyBwKyspIHsKIAkJc3RkLT5wbF92aXJ0W3BdLmJ1Zl9wdHIgPSBjcHVfdG9fbGU2NChkbWFfYWRkcik7Ci0JCWRtYV9hZGRyID0gQUxJR04oZG1hX2FkZHIgKyBXSENJX1BBR0VfU0laRSwgV0hDSV9QQUdFX1NJWkUpOworCQlkbWFfYWRkciA9IChkbWFfYWRkciArIFdIQ0lfUEFHRV9TSVpFKSAmIH4oV0hDSV9QQUdFX1NJWkUtMSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zMzksNiArNDA5LDIxOCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndoYy0+bG9jaywgZmxhZ3MpOwogfQogCitzdGF0aWMgc3RydWN0IHdoY19zdGQgKnFzZXRfbmV3X3N0ZChzdHJ1Y3Qgd2hjICp3aGMsIHN0cnVjdCB3aGNfcXNldCAqcXNldCwKKwkJCQkgICAgc3RydWN0IHVyYiAqdXJiLCBnZnBfdCBtZW1fZmxhZ3MpCit7CisJc3RydWN0IHdoY19zdGQgKnN0ZDsKKworCXN0ZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3aGNfc3RkKSwgbWVtX2ZsYWdzKTsKKwlpZiAoc3RkID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJc3RkLT51cmIgPSB1cmI7CisJc3RkLT5xdGQgPSBOVUxMOworCisJSU5JVF9MSVNUX0hFQUQoJnN0ZC0+bGlzdF9ub2RlKTsKKwlsaXN0X2FkZF90YWlsKCZzdGQtPmxpc3Rfbm9kZSwgJnFzZXQtPnN0ZHMpOworCisJcmV0dXJuIHN0ZDsKK30KKworc3RhdGljIGludCBxc2V0X2FkZF91cmJfc2coc3RydWN0IHdoYyAqd2hjLCBzdHJ1Y3Qgd2hjX3FzZXQgKnFzZXQsIHN0cnVjdCB1cmIgKnVyYiwKKwkJCSAgIGdmcF90IG1lbV9mbGFncykKK3sKKwlzaXplX3QgcmVtYWluaW5nOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJaW50IGk7CisJaW50IG50ZHMgPSAwOworCXN0cnVjdCB3aGNfc3RkICpzdGQgPSBOVUxMOworCXN0cnVjdCB3aGNfcGFnZV9saXN0X2VudHJ5ICplbnRyeTsKKwlkbWFfYWRkcl90IHByZXZfZW5kID0gMDsKKwlzaXplX3QgcGxfbGVuOworCWludCBwID0gMDsKKworCXJlbWFpbmluZyA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aDsKKworCWZvcl9lYWNoX3NnKHVyYi0+c2ctPnNnLCBzZywgdXJiLT5udW1fc2dzLCBpKSB7CisJCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJCXNpemVfdCBkbWFfcmVtYWluaW5nOworCQlkbWFfYWRkcl90IHNwLCBlcDsKKwkJaW50IG51bV9wb2ludGVyczsKKworCQlpZiAocmVtYWluaW5nID09IDApIHsKKwkJCWJyZWFrOworCQl9CisKKwkJZG1hX2FkZHIgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCWRtYV9yZW1haW5pbmcgPSBtaW5fdChzaXplX3QsIHNnX2RtYV9sZW4oc2cpLCByZW1haW5pbmcpOworCisJCXdoaWxlIChkbWFfcmVtYWluaW5nKSB7CisJCQlzaXplX3QgZG1hX2xlbjsKKworCQkJLyoKKwkJCSAqIFdlIGNhbiB1c2UgdGhlIHByZXZpb3VzIHN0ZCAoaWYgaXQgZXhpc3RzKSBwcm92aWRlZCB0aGF0OgorCQkJICogLSB0aGUgcHJldmlvdXMgb25lIGVuZGVkIG9uIGEgcGFnZSBib3VuZGFyeS4KKwkJCSAqIC0gdGhlIGN1cnJlbnQgb25lIGJlZ2lucyBvbiBhIHBhZ2UgYm91bmRhcnkuCisJCQkgKiAtIHRoZSBwcmV2aW91cyBvbmUgaXNuJ3QgZnVsbC4KKwkJCSAqCisJCQkgKiBJZiBhIG5ldyBzdGQgaXMgbmVlZGVkIGJ1dCB0aGUgcHJldmlvdXMgb25lCisJCQkgKiB3YXMgbm90IGEgd2hvbGUgbnVtYmVyIG9mIHBhY2tldHMgdGhlbiB0aGlzCisJCQkgKiBzZyBsaXN0IGNhbm5vdCBiZSBtYXBwZWQgb250byBtdWx0aXBsZQorCQkJICogcVREcy4gIFJldHVybiBhbiBlcnJvciBhbmQgbGV0IHRoZSBjYWxsZXIKKwkJCSAqIHNvcnQgaXQgb3V0LgorCQkJICovCisJCQlpZiAoIXN0ZAorCQkJICAgIHx8IChwcmV2X2VuZCAmIChXSENJX1BBR0VfU0laRS0xKSkKKwkJCSAgICB8fCAoZG1hX2FkZHIgJiAoV0hDSV9QQUdFX1NJWkUtMSkpCisJCQkgICAgfHwgc3RkLT5sZW4gKyBXSENJX1BBR0VfU0laRSA+IFFURF9NQVhfWEZFUl9TSVpFKSB7CisJCQkJaWYgKHN0ZC0+bGVuICUgcXNldC0+bWF4X3BhY2tldCAhPSAwKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlzdGQgPSBxc2V0X25ld19zdGQod2hjLCBxc2V0LCB1cmIsIG1lbV9mbGFncyk7CisJCQkJaWYgKHN0ZCA9PSBOVUxMKSB7CisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCX0KKwkJCQludGRzKys7CisJCQkJcCA9IDA7CisJCQl9CisKKwkJCWRtYV9sZW4gPSBkbWFfcmVtYWluaW5nOworCisJCQkvKgorCQkJICogSWYgdGhlIHJlbWFpbmRlciBvZiB0aGlzIGVsZW1lbnQgZG9lc24ndAorCQkJICogZml0IGluIGEgc2luZ2xlIHFURCwgbGltaXQgdGhlIHFURCB0byBhCisJCQkgKiB3aG9sZSBudW1iZXIgb2YgcGFja2V0cy4gIFRoaXMgYWxsb3dzIHRoZQorCQkJICogcmVtYWluZGVyIHRvIGdvIGludG8gdGhlIG5leHQgcVRELgorCQkJICovCisJCQlpZiAoc3RkLT5sZW4gKyBkbWFfbGVuID4gUVREX01BWF9YRkVSX1NJWkUpIHsKKwkJCQlkbWFfbGVuID0gKFFURF9NQVhfWEZFUl9TSVpFIC8gcXNldC0+bWF4X3BhY2tldCkKKwkJCQkJKiBxc2V0LT5tYXhfcGFja2V0IC0gc3RkLT5sZW47CisJCQl9CisKKwkJCXN0ZC0+bGVuICs9IGRtYV9sZW47CisJCQlzdGQtPm50ZHNfcmVtYWluaW5nID0gLTE7IC8qIGZpbGxlZCBpbiBsYXRlciAqLworCisJCQlzcCA9IGRtYV9hZGRyICYgfihXSENJX1BBR0VfU0laRS0xKTsKKwkJCWVwID0gZG1hX2FkZHIgKyBkbWFfbGVuOworCQkJbnVtX3BvaW50ZXJzID0gRElWX1JPVU5EX1VQKGVwIC0gc3AsIFdIQ0lfUEFHRV9TSVpFKTsKKwkJCXN0ZC0+bnVtX3BvaW50ZXJzICs9IG51bV9wb2ludGVyczsKKworCQkJcGxfbGVuID0gc3RkLT5udW1fcG9pbnRlcnMgKiBzaXplb2Yoc3RydWN0IHdoY19wYWdlX2xpc3RfZW50cnkpOworCisJCQlzdGQtPnBsX3ZpcnQgPSBrcmVhbGxvYyhzdGQtPnBsX3ZpcnQsIHBsX2xlbiwgbWVtX2ZsYWdzKTsKKwkJCWlmIChzdGQtPnBsX3ZpcnQgPT0gTlVMTCkgeworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCisJCQlmb3IgKDtwIDwgc3RkLT5udW1fcG9pbnRlcnM7IHArKywgZW50cnkrKykgeworCQkJCXN0ZC0+cGxfdmlydFtwXS5idWZfcHRyID0gY3B1X3RvX2xlNjQoZG1hX2FkZHIpOworCQkJCWRtYV9hZGRyID0gKGRtYV9hZGRyICsgV0hDSV9QQUdFX1NJWkUpICYgfihXSENJX1BBR0VfU0laRS0xKTsKKwkJCX0KKworCQkJcHJldl9lbmQgPSBkbWFfYWRkciA9IGVwOworCQkJZG1hX3JlbWFpbmluZyAtPSBkbWFfbGVuOworCQkJcmVtYWluaW5nIC09IGRtYV9sZW47CisJCX0KKwl9CisKKwkvKiBOb3cgdGhlIG51bWJlciBvZiBzdGRzIGlzIGtub3csIGdvIGJhY2sgYW5kIGZpbGwgaW4KKwkgICBzdGQtPm50ZHNfcmVtYWluaW5nLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3RkLCAmcXNldC0+c3RkcywgbGlzdF9ub2RlKSB7CisJCWlmIChzdGQtPm50ZHNfcmVtYWluaW5nID09IC0xKSB7CisJCQlwbF9sZW4gPSBzdGQtPm51bV9wb2ludGVycyAqIHNpemVvZihzdHJ1Y3Qgd2hjX3BhZ2VfbGlzdF9lbnRyeSk7CisJCQlzdGQtPm50ZHNfcmVtYWluaW5nID0gbnRkcy0tOworCQkJc3RkLT5kbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKHdoYy0+d3VzYmhjLmRldiwgc3RkLT5wbF92aXJ0LAorCQkJCQkJICAgICAgIHBsX2xlbiwgRE1BX1RPX0RFVklDRSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcXNldF9hZGRfdXJiX3NnX2xpbmVhcml6ZSAtIGFkZCBhbiB1cmIgd2l0aCBzZyBsaXN0LCBjb3B5aW5nIHRoZSBkYXRhCisgKgorICogSWYgdGhlIFVSQiBjb250YWlucyBhbiBzZyBsaXN0IHdob3NlIGVsZW1lbnRzIGNhbm5vdCBiZSBkaXJlY3RseQorICogbWFwcGVkIHRvIHFURHMgdGhlbiB0aGUgZGF0YSBtdXN0IGJlIHRyYW5zZmVycmVkIHZpYSBib3VuY2UKKyAqIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyBpbnQgcXNldF9hZGRfdXJiX3NnX2xpbmVhcml6ZShzdHJ1Y3Qgd2hjICp3aGMsIHN0cnVjdCB3aGNfcXNldCAqcXNldCwKKwkJCQkgICAgIHN0cnVjdCB1cmIgKnVyYiwgZ2ZwX3QgbWVtX2ZsYWdzKQoreworCWJvb2wgaXNfb3V0ID0gdXNiX3BpcGVvdXQodXJiLT5waXBlKTsKKwlzaXplX3QgbWF4X3N0ZF9sZW47CisJc2l6ZV90IHJlbWFpbmluZzsKKwlpbnQgbnRkcyA9IDA7CisJc3RydWN0IHdoY19zdGQgKnN0ZCA9IE5VTEw7CisJdm9pZCAqYm91bmNlID0gTlVMTDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCBpOworCisJLyogbGltaXQgbWF4aW11bSBib3VuY2UgYnVmZmVyIHRvIDE2ICogMy41IEtpQiB+PSAyOCBrICovCisJbWF4X3N0ZF9sZW4gPSBxc2V0LT5tYXhfYnVyc3QgKiBxc2V0LT5tYXhfcGFja2V0OworCisJcmVtYWluaW5nID0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOworCisJZm9yX2VhY2hfc2codXJiLT5zZy0+c2csIHNnLCB1cmItPnNnLT5uZW50cywgaSkgeworCQlzaXplX3QgbGVuOworCQlzaXplX3Qgc2dfcmVtYWluaW5nOworCQl2b2lkICpvcmlnOworCisJCWlmIChyZW1haW5pbmcgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKworCQlzZ19yZW1haW5pbmcgPSBtaW5fdChzaXplX3QsIHJlbWFpbmluZywgc2ctPmxlbmd0aCk7CisJCW9yaWcgPSBzZ192aXJ0KHNnKTsKKworCQl3aGlsZSAoc2dfcmVtYWluaW5nKSB7CisJCQlpZiAoIXN0ZCB8fCBzdGQtPmxlbiA9PSBtYXhfc3RkX2xlbikgeworCQkJCXN0ZCA9IHFzZXRfbmV3X3N0ZCh3aGMsIHFzZXQsIHVyYiwgbWVtX2ZsYWdzKTsKKwkJCQlpZiAoc3RkID09IE5VTEwpCisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCXN0ZC0+Ym91bmNlX2J1ZiA9IGttYWxsb2MobWF4X3N0ZF9sZW4sIG1lbV9mbGFncyk7CisJCQkJaWYgKHN0ZC0+Ym91bmNlX2J1ZiA9PSBOVUxMKQorCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQlzdGQtPmJvdW5jZV9zZyA9IHNnOworCQkJCXN0ZC0+Ym91bmNlX29mZnNldCA9IG9yaWcgLSBzZ192aXJ0KHNnKTsKKwkJCQlib3VuY2UgPSBzdGQtPmJvdW5jZV9idWY7CisJCQkJbnRkcysrOworCQkJfQorCisJCQlsZW4gPSBtaW4oc2dfcmVtYWluaW5nLCBtYXhfc3RkX2xlbiAtIHN0ZC0+bGVuKTsKKworCQkJaWYgKGlzX291dCkKKwkJCQltZW1jcHkoYm91bmNlLCBvcmlnLCBsZW4pOworCisJCQlzdGQtPmxlbiArPSBsZW47CisJCQlzdGQtPm50ZHNfcmVtYWluaW5nID0gLTE7IC8qIGZpbGxlZCBpbiBsYXRlciAqLworCisJCQlib3VuY2UgKz0gbGVuOworCQkJb3JpZyArPSBsZW47CisJCQlzZ19yZW1haW5pbmcgLT0gbGVuOworCQkJcmVtYWluaW5nIC09IGxlbjsKKwkJfQorCX0KKworCS8qCisJICogRm9yIGVhY2ggb2YgdGhlIG5ldyBzVERzLCBtYXAgdGhlIGJvdW5jZSBidWZmZXJzLCBjcmVhdGUKKwkgKiBwYWdlIGxpc3RzIChpZiBuZWNlc3NhcnkpLCBhbmQgZmlsbCBpbiBzdGQtPm50ZHNfcmVtYWluaW5nLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3RkLCAmcXNldC0+c3RkcywgbGlzdF9ub2RlKSB7CisJCWlmIChzdGQtPm50ZHNfcmVtYWluaW5nICE9IC0xKQorCQkJY29udGludWU7CisKKwkJc3RkLT5kbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKCZ3aGMtPnVtYy0+ZGV2LCBzdGQtPmJvdW5jZV9idWYsIHN0ZC0+bGVuLAorCQkJCQkgICAgICAgaXNfb3V0ID8gRE1BX1RPX0RFVklDRSA6IERNQV9GUk9NX0RFVklDRSk7CisKKwkJaWYgKHFzZXRfZmlsbF9wYWdlX2xpc3Qod2hjLCBzdGQsIG1lbV9mbGFncykgPCAwKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJc3RkLT5udGRzX3JlbWFpbmluZyA9IG50ZHMtLTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBxc2V0X2FkZF91cmIgLSBhZGQgYW4gdXJiIHRvIHRoZSBxc2V0J3MgcXVldWUuCiAgKgpAQCAtMzUzLDEwICs2MzUsNyBAQAogCWludCByZW1haW5pbmcgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGg7CiAJdTY0IHRyYW5zZmVyX2RtYSA9IHVyYi0+dHJhbnNmZXJfZG1hOwogCWludCBudGRzX3JlbWFpbmluZzsKLQotCW50ZHNfcmVtYWluaW5nID0gRElWX1JPVU5EX1VQKHJlbWFpbmluZywgUVREX01BWF9YRkVSX1NJWkUpOwotCWlmIChudGRzX3JlbWFpbmluZyA9PSAwKQotCQludGRzX3JlbWFpbmluZyA9IDE7CisJaW50IHJldDsKIAogCXd1cmIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd2hjX3VyYiksIG1lbV9mbGFncyk7CiAJaWYgKHd1cmIgPT0gTlVMTCkKQEAgLTM2NiwzMiArNjQ1LDM5IEBACiAJd3VyYi0+dXJiID0gdXJiOwogCUlOSVRfV09SSygmd3VyYi0+ZGVxdWV1ZV93b3JrLCB1cmJfZGVxdWV1ZV93b3JrKTsKIAorCWlmICh1cmItPnNnKSB7CisJCXJldCA9IHFzZXRfYWRkX3VyYl9zZyh3aGMsIHFzZXQsIHVyYiwgbWVtX2ZsYWdzKTsKKwkJaWYgKHJldCA9PSAtRUlOVkFMKSB7CisJCQlxc2V0X2ZyZWVfc3Rkcyhxc2V0LCB1cmIpOworCQkJcmV0ID0gcXNldF9hZGRfdXJiX3NnX2xpbmVhcml6ZSh3aGMsIHFzZXQsIHVyYiwgbWVtX2ZsYWdzKTsKKwkJfQorCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyX25vX21lbTsKKwkJcmV0dXJuIDA7CisJfQorCisJbnRkc19yZW1haW5pbmcgPSBESVZfUk9VTkRfVVAocmVtYWluaW5nLCBRVERfTUFYX1hGRVJfU0laRSk7CisJaWYgKG50ZHNfcmVtYWluaW5nID09IDApCisJCW50ZHNfcmVtYWluaW5nID0gMTsKKwogCXdoaWxlIChudGRzX3JlbWFpbmluZykgewogCQlzdHJ1Y3Qgd2hjX3N0ZCAqc3RkOwogCQlzaXplX3Qgc3RkX2xlbjsKIAotCQlzdGQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgd2hjX3N0ZCksIG1lbV9mbGFncyk7Ci0JCWlmIChzdGQgPT0gTlVMTCkKLQkJCWdvdG8gZXJyX25vX21lbTsKLQogCQlzdGRfbGVuID0gcmVtYWluaW5nOwogCQlpZiAoc3RkX2xlbiA+IFFURF9NQVhfWEZFUl9TSVpFKQogCQkJc3RkX2xlbiA9IFFURF9NQVhfWEZFUl9TSVpFOwogCi0JCXN0ZC0+dXJiID0gdXJiOworCQlzdGQgPSBxc2V0X25ld19zdGQod2hjLCBxc2V0LCB1cmIsIG1lbV9mbGFncyk7CisJCWlmIChzdGQgPT0gTlVMTCkKKwkJCWdvdG8gZXJyX25vX21lbTsKKwogCQlzdGQtPmRtYV9hZGRyID0gdHJhbnNmZXJfZG1hOwogCQlzdGQtPmxlbiA9IHN0ZF9sZW47CiAJCXN0ZC0+bnRkc19yZW1haW5pbmcgPSBudGRzX3JlbWFpbmluZzsKLQkJc3RkLT5xdGQgPSBOVUxMOwogCi0JCUlOSVRfTElTVF9IRUFEKCZzdGQtPmxpc3Rfbm9kZSk7Ci0JCWxpc3RfYWRkX3RhaWwoJnN0ZC0+bGlzdF9ub2RlLCAmcXNldC0+c3Rkcyk7Ci0KLQkJaWYgKHN0ZF9sZW4gPiBXSENJX1BBR0VfU0laRSkgewotCQkJaWYgKHFzZXRfZmlsbF9wYWdlX2xpc3Qod2hjLCBzdGQsIG1lbV9mbGFncykgPCAwKQotCQkJCWdvdG8gZXJyX25vX21lbTsKLQkJfSBlbHNlCi0JCQlzdGQtPm51bV9wb2ludGVycyA9IDA7CisJCWlmIChxc2V0X2ZpbGxfcGFnZV9saXN0KHdoYywgc3RkLCBtZW1fZmxhZ3MpIDwgMCkKKwkJCWdvdG8gZXJyX25vX21lbTsKIAogCQludGRzX3JlbWFpbmluZy0tOwogCQlyZW1haW5pbmcgLT0gc3RkX2xlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS93aGNkLmggYi9kcml2ZXJzL3VzYi9ob3N0L3doY2kvd2hjZC5oCmluZGV4IDI0ZTk0ZDkuLmM4MGM3ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS93aGNkLmgKKysrIGIvZHJpdmVycy91c2IvaG9zdC93aGNpL3doY2QuaApAQCAtODQsNiArODQsMTEgQEAKICAqIEBsZW46IHRoZSBsZW5ndGggb2YgZGF0YSBpbiB0aGUgYXNzb2NpYXRlZCBURC4KICAqIEBudGRzX3JlbWFpbmluZzogbnVtYmVyIG9mIFREcyAoc3RhcnRpbmcgZnJvbSB0aGlzIG9uZSkgaW4gdGhpcyB0cmFuc2Zlci4KICAqCisgKiBAYm91bmNlX2J1ZjogYSBib3VuY2UgYnVmZmVyIGlmIHRoZSBzdGQgd2FzIGZyb20gYW4gdXJiIHdpdGggYSBzZworICogbGlzdCB0aGF0IGNvdWxkIG5vdCBiZSBtYXBwZWQgdG8gcVREcyBkaXJlY3RseS4KKyAqIEBib3VuY2Vfc2c6IHRoZSBmaXJzdCBzY2F0dGVybGlzdCBlbGVtZW50IGJvdW5jZV9idWYgaXMgZm9yLgorICogQGJvdW5jZV9vZmZzZXQ6IHRoZSBvZmZzZXQgaW50byBib3VuY2Vfc2cgZm9yIHRoZSBzdGFydCBvZiBib3VuY2VfYnVmLgorICoKICAqIFF1ZXVlZCBVUkJzIG1heSByZXF1aXJlIG1vcmUgVERzIHRoYW4gYXJlIGF2YWlsYWJsZSBpbiBhIHFzZXQgc28gd2UKICAqIHVzZSBhIGxpc3Qgb2YgdGhlc2UgInNvZnR3YXJlIFREcyIgKHNURHMpIHRvIGhvbGQgcGVyLVREIGRhdGEuCiAgKi8KQEAgLTk3LDYgKzEwMiwxMCBAQAogCWludCBudW1fcG9pbnRlcnM7CiAJZG1hX2FkZHJfdCBkbWFfYWRkcjsKIAlzdHJ1Y3Qgd2hjX3BhZ2VfbGlzdF9lbnRyeSAqcGxfdmlydDsKKworCXZvaWQgKmJvdW5jZV9idWY7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpib3VuY2Vfc2c7CisJdW5zaWduZWQgYm91bmNlX29mZnNldDsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC93aGNpL3doY2ktaGMuaCBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS93aGNpLWhjLmgKaW5kZXggZThkMDAwMS4uNGQ0Y2JjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC93aGNpL3doY2ktaGMuaAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L3doY2kvd2hjaS1oYy5oCkBAIC0xNzIsMTQgKzE3Miw3IEBACiAjZGVmaW5lIFFIX0lORk8zX01BWF9ERUxBWShkKSAgICAoKGQpIDw8IDApICAvKiBtYXhpbXVtIHN0cmVhbSBkZWxheSBpbiAxMjUgdXMgdW5pdHMgKGlzb2Mgb25seSkgKi8KICNkZWZpbmUgUUhfSU5GTzNfSU5URVJWQUwoaSkgICAgICgoaSkgPDwgMTYpIC8qIHNlZ21lbnQgaW50ZXJ2YWwgaW4gMTI1IHVzIHVuaXRzIChpc29jIG9ubHkpICovCiAKLSNkZWZpbmUgUUhfSU5GTzNfVFhfUkFURV81M18zICAgICgwIDw8IDI0KQotI2RlZmluZSBRSF9JTkZPM19UWF9SQVRFXzgwICAgICAgKDEgPDwgMjQpCi0jZGVmaW5lIFFIX0lORk8zX1RYX1JBVEVfMTA2XzcgICAoMiA8PCAyNCkKLSNkZWZpbmUgUUhfSU5GTzNfVFhfUkFURV8xNjAgICAgICgzIDw8IDI0KQotI2RlZmluZSBRSF9JTkZPM19UWF9SQVRFXzIwMCAgICAgKDQgPDwgMjQpCi0jZGVmaW5lIFFIX0lORk8zX1RYX1JBVEVfMzIwICAgICAoNSA8PCAyNCkKLSNkZWZpbmUgUUhfSU5GTzNfVFhfUkFURV80MDAgICAgICg2IDw8IDI0KQotI2RlZmluZSBRSF9JTkZPM19UWF9SQVRFXzQ4MCAgICAgKDcgPDwgMjQpCisjZGVmaW5lIFFIX0lORk8zX1RYX1JBVEUocikgICAgICAoKHIpIDw8IDI0KSAvKiBQSFkgcmF0ZSAoc2VlIFtFQ01BLTM2OF0gc2VjdGlvbiAxMC4zLjEuMSkgKi8KICNkZWZpbmUgUUhfSU5GTzNfVFhfUFdSKHApICAgICAgICgocCkgPDwgMjkpIC8qIHRyYW5zbWl0IHBvd2VyIChzZWUgW1dVU0JdIHNlY3Rpb24gNS4yLjEuMikgKi8KIAogI2RlZmluZSBRSF9TVEFUVVNfRkxPV19DVFJMICAgICAgKDEgPDwgMTUpCkBAIC0yNjcsOCArMjYwLDkgQEAKIAl1bnNpZ25lZCByZXNldDoxOwogCXN0cnVjdCB1cmIgKnBhdXNlX2FmdGVyX3VyYjsKIAlzdHJ1Y3QgY29tcGxldGlvbiByZW1vdmVfY29tcGxldGU7Ci0JaW50IG1heF9idXJzdDsKLQlpbnQgbWF4X3NlcTsKKwl1aW50MTZfdCBtYXhfcGFja2V0OworCXVpbnQ4X3QgbWF4X2J1cnN0OworCXVpbnQ4X3QgbWF4X3NlcTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3aGNfcXNldF9zZXRfbGlua19wdHIodTY0ICpwdHIsIHU2NCB0YXJnZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktaGNkLmMKaW5kZXggOTMyZjk5OS4uNWU5MmM3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1oY2QuYwpAQCAtNjcsNiArNjcsMjUgQEAKIH0KIAogLyoKKyAqIERpc2FibGUgaW50ZXJydXB0cyBhbmQgYmVnaW4gdGhlIHhIQ0kgaGFsdGluZyBwcm9jZXNzLgorICovCit2b2lkIHhoY2lfcXVpZXNjZShzdHJ1Y3QgeGhjaV9oY2QgKnhoY2kpCit7CisJdTMyIGhhbHRlZDsKKwl1MzIgY21kOworCXUzMiBtYXNrOworCisJbWFzayA9IH4oWEhDSV9JUlFTKTsKKwloYWx0ZWQgPSB4aGNpX3JlYWRsKHhoY2ksICZ4aGNpLT5vcF9yZWdzLT5zdGF0dXMpICYgU1RTX0hBTFQ7CisJaWYgKCFoYWx0ZWQpCisJCW1hc2sgJj0gfkNNRF9SVU47CisKKwljbWQgPSB4aGNpX3JlYWRsKHhoY2ksICZ4aGNpLT5vcF9yZWdzLT5jb21tYW5kKTsKKwljbWQgJj0gbWFzazsKKwl4aGNpX3dyaXRlbCh4aGNpLCBjbWQsICZ4aGNpLT5vcF9yZWdzLT5jb21tYW5kKTsKK30KKworLyoKICAqIEZvcmNlIEhDIGludG8gaGFsdCBzdGF0ZS4KICAqCiAgKiBEaXNhYmxlIGFueSBJUlFzIGFuZCBjbGVhciB0aGUgcnVuL3N0b3AgYml0LgpAQCAtNzcsMjAgKzk2LDggQEAKICAqLwogaW50IHhoY2lfaGFsdChzdHJ1Y3QgeGhjaV9oY2QgKnhoY2kpCiB7Ci0JdTMyIGhhbHRlZDsKLQl1MzIgY21kOwotCXUzMiBtYXNrOwotCiAJeGhjaV9kYmcoeGhjaSwgIi8vIEhhbHQgdGhlIEhDXG4iKTsKLQkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGZyb20gdGhlIGhvc3QgY29udHJvbGxlciAqLwotCW1hc2sgPSB+KFhIQ0lfSVJRUyk7Ci0JaGFsdGVkID0geGhjaV9yZWFkbCh4aGNpLCAmeGhjaS0+b3BfcmVncy0+c3RhdHVzKSAmIFNUU19IQUxUOwotCWlmICghaGFsdGVkKQotCQltYXNrICY9IH5DTURfUlVOOwotCi0JY21kID0geGhjaV9yZWFkbCh4aGNpLCAmeGhjaS0+b3BfcmVncy0+Y29tbWFuZCk7Ci0JY21kICY9IG1hc2s7Ci0JeGhjaV93cml0ZWwoeGhjaSwgY21kLCAmeGhjaS0+b3BfcmVncy0+Y29tbWFuZCk7CisJeGhjaV9xdWllc2NlKHhoY2kpOwogCiAJcmV0dXJuIGhhbmRzaGFrZSh4aGNpLCAmeGhjaS0+b3BfcmVncy0+c3RhdHVzLAogCQkJU1RTX0hBTFQsIFNUU19IQUxULCBYSENJX01BWF9IQUxUX1VTRUMpOwpAQCAtMTI0LDI4ICsxMzEsNiBAQAogCXJldHVybiBoYW5kc2hha2UoeGhjaSwgJnhoY2ktPm9wX3JlZ3MtPmNvbW1hbmQsIENNRF9SRVNFVCwgMCwgMjUwICogMTAwMCk7CiB9CiAKLS8qCi0gKiBTdG9wIHRoZSBIQyBmcm9tIHByb2Nlc3NpbmcgdGhlIGVuZHBvaW50IHF1ZXVlcy4KLSAqLwotc3RhdGljIHZvaWQgeGhjaV9xdWllc2NlKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSkKLXsKLQkvKgotCSAqIFF1ZXVlcyBhcmUgcGVyIGVuZHBvaW50LCBzbyB3ZSBuZWVkIHRvIGRpc2FibGUgYW4gZW5kcG9pbnQgb3Igc2xvdC4KLQkgKgotCSAqIFRvIGRpc2FibGUgYSBzbG90LCB3ZSBuZWVkIHRvIGluc2VydCBhIGRpc2FibGUgc2xvdCBjb21tYW5kIG9uIHRoZQotCSAqIGNvbW1hbmQgcmluZyBhbmQgcmluZyB0aGUgZG9vcmJlbGwuICBUaGlzIHdpbGwgYWxzbyBmcmVlIGFueSBpbnRlcm5hbAotCSAqIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNsb3QgKHdoaWNoIG1pZ2h0IG5vdCBiZSB3aGF0IHdlIHdhbnQpLgotCSAqCi0JICogQSBSZWxlYXNlIEVuZHBvaW50IGNvbW1hbmQgc291bmRzIGJldHRlciAtIGRvZXNuJ3QgZnJlZSBpbnRlcm5hbCBIQwotCSAqIG1lbW9yeSwgYnV0IHJlbW92ZXMgdGhlIGVuZHBvaW50cyBmcm9tIHRoZSBzY2hlZHVsZSBhbmQgcmVsZWFzZXMgdGhlCi0JICogYmFuZHdpZHRoLCBkaXNhYmxlcyB0aGUgZG9vcmJlbGxzLCBhbmQgY2xlYXJzIHRoZSBlbmRwb2ludCBlbmFibGUKLQkgKiBmbGFnLiAgVXN1YWxseSB1c2VkIHByaW9yIHRvIGEgc2V0IGludGVyZmFjZSBjb21tYW5kLgotCSAqCi0JICogVE9ETzogSW1wbGVtZW50IGFmdGVyIGNvbW1hbmQgcmluZyBjb2RlIGlzIGRvbmUuCi0JICovCi0JQlVHX09OKCFIQ19JU19SVU5OSU5HKHhoY2lfdG9faGNkKHhoY2kpLT5zdGF0ZSkpOwotCXhoY2lfZGJnKHhoY2ksICJGaW5pc2hlZCBxdWllc2NpbmcgLS0gY29kZSBub3Qgd3JpdHRlbiB5ZXRcbiIpOwotfQogCiAjaWYgMAogLyogU2V0IHVwIE1TSS1YIHRhYmxlIGZvciBlbnRyeSAwIChtYXkgY2xhaW0gb3RoZXIgZW50cmllcyBsYXRlcikgKi8KQEAgLTI2MSw4ICsyNDYsMTQgQEAKIAkvKiBGbHVzaCBwb3N0ZWQgd3JpdGVzICovCiAJeGhjaV9yZWFkbCh4aGNpLCAmeGhjaS0+aXJfc2V0LT5pcnFfcGVuZGluZyk7CiAKLQkvKiBGSVhNRSB0aGlzIHNob3VsZCBiZSBhIGRlbGF5ZWQgc2VydmljZSByb3V0aW5lIHRoYXQgY2xlYXJzIHRoZSBFSEIgKi8KLQl4aGNpX2hhbmRsZV9ldmVudCh4aGNpKTsKKwlpZiAoeGhjaS0+eGhjX3N0YXRlICYgWEhDSV9TVEFURV9EWUlORykKKwkJeGhjaV9kYmcoeGhjaSwgInhIQ0kgZHlpbmcsIGlnbm9yaW5nIGludGVycnVwdC4gIgorCQkJCSJTaG91bGRuJ3QgSVJRcyBiZSBkaXNhYmxlZD9cbiIpOworCWVsc2UKKwkJLyogRklYTUUgdGhpcyBzaG91bGQgYmUgYSBkZWxheWVkIHNlcnZpY2Ugcm91dGluZQorCQkgKiB0aGF0IGNsZWFycyB0aGUgRUhCLgorCQkgKi8KKwkJeGhjaV9oYW5kbGVfZXZlbnQoeGhjaSk7CiAKIAkvKiBDbGVhciB0aGUgZXZlbnQgaGFuZGxlciBidXN5IGZsYWcgKFJXMUMpOyB0aGUgZXZlbnQgcmluZyBzaG91bGQgYmUgZW1wdHkuICovCiAJdGVtcF82NCA9IHhoY2lfcmVhZF82NCh4aGNpLCAmeGhjaS0+aXJfc2V0LT5lcnN0X2RlcXVldWUpOwpAQCAtMzM1LDcgKzMyNiw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnhoY2ktPmxvY2ssIGZsYWdzKTsKIAl0ZW1wID0geGhjaV9yZWFkbCh4aGNpLCAmeGhjaS0+b3BfcmVncy0+c3RhdHVzKTsKIAl4aGNpX2RiZyh4aGNpLCAib3AgcmVnIHN0YXR1cyA9IDB4JXhcbiIsIHRlbXApOwotCWlmICh0ZW1wID09IDB4ZmZmZmZmZmYpIHsKKwlpZiAodGVtcCA9PSAweGZmZmZmZmZmIHx8ICh4aGNpLT54aGNfc3RhdGUgJiBYSENJX1NUQVRFX0RZSU5HKSkgewogCQl4aGNpX2RiZyh4aGNpLCAiSFcgZGllZCwgcG9sbGluZyBzdG9wcGVkLlxuIik7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhoY2ktPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwpAQCAtNDkwLDggKzQ4MSw2IEBACiAJc3RydWN0IHhoY2lfaGNkICp4aGNpID0gaGNkX3RvX3hoY2koaGNkKTsKIAogCXNwaW5fbG9ja19pcnEoJnhoY2ktPmxvY2spOwotCWlmIChIQ19JU19SVU5OSU5HKGhjZC0+c3RhdGUpKQotCQl4aGNpX3F1aWVzY2UoeGhjaSk7CiAJeGhjaV9oYWx0KHhoY2kpOwogCXhoY2lfcmVzZXQoeGhjaSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZ4aGNpLT5sb2NrKTsKQEAgLTcyNywxNiArNzE2LDIyIEBACiAJCSAqIGF0b21pYyBjb250ZXh0IHRvIHRoaXMgZnVuY3Rpb24sIHdoaWNoIG1heSBhbGxvY2F0ZSBtZW1vcnkuCiAJCSAqLwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmeGhjaS0+bG9jaywgZmxhZ3MpOworCQlpZiAoeGhjaS0+eGhjX3N0YXRlICYgWEhDSV9TVEFURV9EWUlORykKKwkJCWdvdG8gZHlpbmc7CiAJCXJldCA9IHhoY2lfcXVldWVfY3RybF90eCh4aGNpLCBHRlBfQVRPTUlDLCB1cmIsCiAJCQkJc2xvdF9pZCwgZXBfaW5kZXgpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4aGNpLT5sb2NrLCBmbGFncyk7CiAJfSBlbHNlIGlmICh1c2JfZW5kcG9pbnRfeGZlcl9idWxrKCZ1cmItPmVwLT5kZXNjKSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmeGhjaS0+bG9jaywgZmxhZ3MpOworCQlpZiAoeGhjaS0+eGhjX3N0YXRlICYgWEhDSV9TVEFURV9EWUlORykKKwkJCWdvdG8gZHlpbmc7CiAJCXJldCA9IHhoY2lfcXVldWVfYnVsa190eCh4aGNpLCBHRlBfQVRPTUlDLCB1cmIsCiAJCQkJc2xvdF9pZCwgZXBfaW5kZXgpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4aGNpLT5sb2NrLCBmbGFncyk7CiAJfSBlbHNlIGlmICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoJnVyYi0+ZXAtPmRlc2MpKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZ4aGNpLT5sb2NrLCBmbGFncyk7CisJCWlmICh4aGNpLT54aGNfc3RhdGUgJiBYSENJX1NUQVRFX0RZSU5HKQorCQkJZ290byBkeWluZzsKIAkJcmV0ID0geGhjaV9xdWV1ZV9pbnRyX3R4KHhoY2ksIEdGUF9BVE9NSUMsIHVyYiwKIAkJCQlzbG90X2lkLCBlcF9pbmRleCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhoY2ktPmxvY2ssIGZsYWdzKTsKQEAgLTc0NSw2ICs3NDAsMTIgQEAKIAl9CiBleGl0OgogCXJldHVybiByZXQ7CitkeWluZzoKKwl4aGNpX2RiZyh4aGNpLCAiRXAgMHgleDogVVJCICVwIHN1Ym1pdHRlZCBmb3IgIgorCQkJIm5vbi1yZXNwb25zaXZlIHhIQ0kgaG9zdC5cbiIsCisJCQl1cmItPmVwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MsIHVyYik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGhjaS0+bG9jaywgZmxhZ3MpOworCXJldHVybiAtRVNIVVRET1dOOwogfQogCiAvKgpAQCAtODA2LDYgKzgwNywxNyBAQAogCQlrZnJlZSh0ZCk7CiAJCXJldHVybiByZXQ7CiAJfQorCWlmICh4aGNpLT54aGNfc3RhdGUgJiBYSENJX1NUQVRFX0RZSU5HKSB7CisJCXhoY2lfZGJnKHhoY2ksICJFcCAweCV4OiBVUkIgJXAgdG8gYmUgY2FuY2VsZWQgb24gIgorCQkJCSJub24tcmVzcG9uc2l2ZSB4SENJIGhvc3QuXG4iLAorCQkJCXVyYi0+ZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcywgdXJiKTsKKwkJLyogTGV0IHRoZSBzdG9wIGVuZHBvaW50IGNvbW1hbmQgd2F0Y2hkb2cgdGltZXIgKHdoaWNoIHNldCB0aGlzCisJCSAqIHN0YXRlKSBmaW5pc2ggY2xlYW5pbmcgdXAgdGhlIGVuZHBvaW50IFREIGxpc3RzLiAgV2UgbXVzdAorCQkgKiBoYXZlIGNhdWdodCBpdCBpbiB0aGUgbWlkZGxlIG9mIGRyb3BwaW5nIGEgbG9jayBhbmQgZ2l2aW5nCisJCSAqIGJhY2sgYW4gVVJCLgorCQkgKi8KKwkJZ290byBkb25lOworCX0KIAogCXhoY2lfZGJnKHhoY2ksICJDYW5jZWwgVVJCICVwXG4iLCB1cmIpOwogCXhoY2lfZGJnKHhoY2ksICJFdmVudCByaW5nOlxuIik7CkBAIC04MTcsMTIgKzgyOSwxNiBAQAogCXhoY2lfZGVidWdfcmluZyh4aGNpLCBlcF9yaW5nKTsKIAl0ZCA9IChzdHJ1Y3QgeGhjaV90ZCAqKSB1cmItPmhjcHJpdjsKIAotCWVwLT5jYW5jZWxzX3BlbmRpbmcrKzsKIAlsaXN0X2FkZF90YWlsKCZ0ZC0+Y2FuY2VsbGVkX3RkX2xpc3QsICZlcC0+Y2FuY2VsbGVkX3RkX2xpc3QpOwogCS8qIFF1ZXVlIGEgc3RvcCBlbmRwb2ludCBjb21tYW5kLCBidXQgb25seSBpZiB0aGlzIGlzCiAJICogdGhlIGZpcnN0IGNhbmNlbGxhdGlvbiB0byBiZSBoYW5kbGVkLgogCSAqLwotCWlmIChlcC0+Y2FuY2Vsc19wZW5kaW5nID09IDEpIHsKKwlpZiAoIShlcC0+ZXBfc3RhdGUgJiBFUF9IQUxUX1BFTkRJTkcpKSB7CisJCWVwLT5lcF9zdGF0ZSB8PSBFUF9IQUxUX1BFTkRJTkc7CisJCWVwLT5zdG9wX2NtZHNfcGVuZGluZysrOworCQllcC0+c3RvcF9jbWRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKworCQkJWEhDSV9TVE9QX0VQX0NNRF9USU1FT1VUICogSFo7CisJCWFkZF90aW1lcigmZXAtPnN0b3BfY21kX3RpbWVyKTsKIAkJeGhjaV9xdWV1ZV9zdG9wX2VuZHBvaW50KHhoY2ksIHVyYi0+ZGV2LT5zbG90X2lkLCBlcF9pbmRleCk7CiAJCXhoY2lfcmluZ19jbWRfZGIoeGhjaSk7CiAJfQpAQCAtMTI0NiwxMyArMTI2MiwzNSBAQAogCQkJTEFTVF9DVFhfVE9fRVBfTlVNKHNsb3RfY3R4LT5kZXZfaW5mbykpOwogCiAJeGhjaV96ZXJvX2luX2N0eCh4aGNpLCB2aXJ0X2Rldik7Ci0JLyogRnJlZSBhbnkgb2xkIHJpbmdzICovCisJLyogSW5zdGFsbCBuZXcgcmluZ3MgYW5kIGZyZWUgb3IgY2FjaGUgYW55IG9sZCByaW5ncyAqLwogCWZvciAoaSA9IDE7IGkgPCAzMTsgKytpKSB7Ci0JCWlmICh2aXJ0X2Rldi0+ZXBzW2ldLm5ld19yaW5nKSB7Ci0JCQl4aGNpX3JpbmdfZnJlZSh4aGNpLCB2aXJ0X2Rldi0+ZXBzW2ldLnJpbmcpOwotCQkJdmlydF9kZXYtPmVwc1tpXS5yaW5nID0gdmlydF9kZXYtPmVwc1tpXS5uZXdfcmluZzsKLQkJCXZpcnRfZGV2LT5lcHNbaV0ubmV3X3JpbmcgPSBOVUxMOworCQlpbnQgcmluZ3NfY2FjaGVkOworCisJCWlmICghdmlydF9kZXYtPmVwc1tpXS5uZXdfcmluZykKKwkJCWNvbnRpbnVlOworCQkvKiBPbmx5IGNhY2hlIG9yIGZyZWUgdGhlIG9sZCByaW5nIGlmIGl0IGV4aXN0cy4KKwkJICogSXQgbWF5IG5vdCBpZiB0aGlzIGlzIHRoZSBmaXJzdCBhZGQgb2YgYW4gZW5kcG9pbnQuCisJCSAqLworCQlpZiAodmlydF9kZXYtPmVwc1tpXS5yaW5nKSB7CisJCQlyaW5nc19jYWNoZWQgPSB2aXJ0X2Rldi0+bnVtX3JpbmdzX2NhY2hlZDsKKwkJCWlmIChyaW5nc19jYWNoZWQgPCBYSENJX01BWF9SSU5HU19DQUNIRUQpIHsKKwkJCQl2aXJ0X2Rldi0+bnVtX3JpbmdzX2NhY2hlZCsrOworCQkJCXJpbmdzX2NhY2hlZCA9IHZpcnRfZGV2LT5udW1fcmluZ3NfY2FjaGVkOworCQkJCXZpcnRfZGV2LT5yaW5nX2NhY2hlW3JpbmdzX2NhY2hlZF0gPQorCQkJCQl2aXJ0X2Rldi0+ZXBzW2ldLnJpbmc7CisJCQkJeGhjaV9kYmcoeGhjaSwgIkNhY2hlZCBvbGQgcmluZywgIgorCQkJCQkJIiVkIHJpbmclcyBjYWNoZWRcbiIsCisJCQkJCQlyaW5nc19jYWNoZWQsCisJCQkJCQkocmluZ3NfY2FjaGVkID4gMSkgPyAicyIgOiAiIik7CisJCQl9IGVsc2UgeworCQkJCXhoY2lfcmluZ19mcmVlKHhoY2ksIHZpcnRfZGV2LT5lcHNbaV0ucmluZyk7CisJCQkJeGhjaV9kYmcoeGhjaSwgIlJpbmcgY2FjaGUgZnVsbCAoJWQgcmluZ3MpLCAiCisJCQkJCQkiZnJlZWluZyByaW5nXG4iLAorCQkJCQkJdmlydF9kZXYtPm51bV9yaW5nc19jYWNoZWQpOworCQkJfQogCQl9CisJCXZpcnRfZGV2LT5lcHNbaV0ucmluZyA9IHZpcnRfZGV2LT5lcHNbaV0ubmV3X3Jpbmc7CisJCXZpcnRfZGV2LT5lcHNbaV0ubmV3X3JpbmcgPSBOVUxMOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0xNDI3LDE2ICsxNDY1LDI3IEBACiB2b2lkIHhoY2lfZnJlZV9kZXYoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7CiAJc3RydWN0IHhoY2lfaGNkICp4aGNpID0gaGNkX3RvX3hoY2koaGNkKTsKKwlzdHJ1Y3QgeGhjaV92aXJ0X2RldmljZSAqdmlydF9kZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgc3RhdGU7CisJaW50IGk7CiAKIAlpZiAodWRldi0+c2xvdF9pZCA9PSAwKQogCQlyZXR1cm47CisJdmlydF9kZXYgPSB4aGNpLT5kZXZzW3VkZXYtPnNsb3RfaWRdOworCWlmICghdmlydF9kZXYpCisJCXJldHVybjsKKworCS8qIFN0b3AgYW55IHdheXdhcmQgdGltZXIgZnVuY3Rpb25zICh3aGljaCBtYXkgZ3JhYiB0aGUgbG9jaykgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzE7ICsraSkgeworCQl2aXJ0X2Rldi0+ZXBzW2ldLmVwX3N0YXRlICY9IH5FUF9IQUxUX1BFTkRJTkc7CisJCWRlbF90aW1lcl9zeW5jKCZ2aXJ0X2Rldi0+ZXBzW2ldLnN0b3BfY21kX3RpbWVyKTsKKwl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmeGhjaS0+bG9jaywgZmxhZ3MpOwogCS8qIERvbid0IGRpc2FibGUgdGhlIHNsb3QgaWYgdGhlIGhvc3QgY29udHJvbGxlciBpcyBkZWFkLiAqLwogCXN0YXRlID0geGhjaV9yZWFkbCh4aGNpLCAmeGhjaS0+b3BfcmVncy0+c3RhdHVzKTsKLQlpZiAoc3RhdGUgPT0gMHhmZmZmZmZmZikgeworCWlmIChzdGF0ZSA9PSAweGZmZmZmZmZmIHx8ICh4aGNpLT54aGNfc3RhdGUgJiBYSENJX1NUQVRFX0RZSU5HKSkgewogCQl4aGNpX2ZyZWVfdmlydF9kZXZpY2UoeGhjaSwgdWRldi0+c2xvdF9pZCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhoY2ktPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLW1lbS5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLW1lbS5jCmluZGV4IGI4ZmQyNzAuLmJmZmNlZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1tZW0uYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktbWVtLmMKQEAgLTEyNSw2ICsxMjUsMjMgQEAKIAlrZnJlZShyaW5nKTsKIH0KIAorc3RhdGljIHZvaWQgeGhjaV9pbml0aWFsaXplX3JpbmdfaW5mbyhzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nKQoreworCS8qIFRoZSByaW5nIGlzIGVtcHR5LCBzbyB0aGUgZW5xdWV1ZSBwb2ludGVyID09IGRlcXVldWUgcG9pbnRlciAqLworCXJpbmctPmVucXVldWUgPSByaW5nLT5maXJzdF9zZWctPnRyYnM7CisJcmluZy0+ZW5xX3NlZyA9IHJpbmctPmZpcnN0X3NlZzsKKwlyaW5nLT5kZXF1ZXVlID0gcmluZy0+ZW5xdWV1ZTsKKwlyaW5nLT5kZXFfc2VnID0gcmluZy0+Zmlyc3Rfc2VnOworCS8qIFRoZSByaW5nIGlzIGluaXRpYWxpemVkIHRvIDAuIFRoZSBwcm9kdWNlciBtdXN0IHdyaXRlIDEgdG8gdGhlIGN5Y2xlCisJICogYml0IHRvIGhhbmRvdmVyIG93bmVyc2hpcCBvZiB0aGUgVFJCLCBzbyBQQ1MgPSAxLiAgVGhlIGNvbnN1bWVyIG11c3QKKwkgKiBjb21wYXJlIENDUyB0byB0aGUgY3ljbGUgYml0IHRvIGNoZWNrIG93bmVyc2hpcCwgc28gQ0NTID0gMS4KKwkgKi8KKwlyaW5nLT5jeWNsZV9zdGF0ZSA9IDE7CisJLyogTm90IG5lY2Vzc2FyeSBmb3IgbmV3IHJpbmdzLCBidXQgbmVlZGVkIGZvciByZS1pbml0aWFsaXplZCByaW5ncyAqLworCXJpbmctPmVucV91cGRhdGVzID0gMDsKKwlyaW5nLT5kZXFfdXBkYXRlcyA9IDA7Cit9CisKIC8qKgogICogQ3JlYXRlIGEgbmV3IHJpbmcgd2l0aCB6ZXJvIG9yIG1vcmUgc2VnbWVudHMuCiAgKgpAQCAtMTczLDE3ICsxOTAsNyBAQAogCQkJCSIgc2VnbWVudCAlcCAodmlydHVhbCksIDB4JWxseCAoRE1BKVxuIiwKIAkJCQlwcmV2LCAodW5zaWduZWQgbG9uZyBsb25nKXByZXYtPmRtYSk7CiAJfQotCS8qIFRoZSByaW5nIGlzIGVtcHR5LCBzbyB0aGUgZW5xdWV1ZSBwb2ludGVyID09IGRlcXVldWUgcG9pbnRlciAqLwotCXJpbmctPmVucXVldWUgPSByaW5nLT5maXJzdF9zZWctPnRyYnM7Ci0JcmluZy0+ZW5xX3NlZyA9IHJpbmctPmZpcnN0X3NlZzsKLQlyaW5nLT5kZXF1ZXVlID0gcmluZy0+ZW5xdWV1ZTsKLQlyaW5nLT5kZXFfc2VnID0gcmluZy0+Zmlyc3Rfc2VnOwotCS8qIFRoZSByaW5nIGlzIGluaXRpYWxpemVkIHRvIDAuIFRoZSBwcm9kdWNlciBtdXN0IHdyaXRlIDEgdG8gdGhlIGN5Y2xlCi0JICogYml0IHRvIGhhbmRvdmVyIG93bmVyc2hpcCBvZiB0aGUgVFJCLCBzbyBQQ1MgPSAxLiAgVGhlIGNvbnN1bWVyIG11c3QKLQkgKiBjb21wYXJlIENDUyB0byB0aGUgY3ljbGUgYml0IHRvIGNoZWNrIG93bmVyc2hpcCwgc28gQ0NTID0gMS4KLQkgKi8KLQlyaW5nLT5jeWNsZV9zdGF0ZSA9IDE7Ci0KKwl4aGNpX2luaXRpYWxpemVfcmluZ19pbmZvKHJpbmcpOwogCXJldHVybiByaW5nOwogCiBmYWlsOgpAQCAtMTkxLDYgKzE5OCwyNyBAQAogCXJldHVybiAwOwogfQogCisvKiBaZXJvIGFuIGVuZHBvaW50IHJpbmcgKGV4Y2VwdCBmb3IgbGluayBUUkJzKSBhbmQgbW92ZSB0aGUgZW5xdWV1ZSBhbmQgZGVxdWV1ZQorICogcG9pbnRlcnMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcmluZy4KKyAqLworc3RhdGljIHZvaWQgeGhjaV9yZWluaXRfY2FjaGVkX3Jpbmcoc3RydWN0IHhoY2lfaGNkICp4aGNpLAorCQlzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nKQoreworCXN0cnVjdCB4aGNpX3NlZ21lbnQJKnNlZyA9IHJpbmctPmZpcnN0X3NlZzsKKwlkbyB7CisJCW1lbXNldChzZWctPnRyYnMsIDAsCisJCQkJc2l6ZW9mKHVuaW9uIHhoY2lfdHJiKSpUUkJTX1BFUl9TRUdNRU5UKTsKKwkJLyogQWxsIGVuZHBvaW50IHJpbmdzIGhhdmUgbGluayBUUkJzICovCisJCXhoY2lfbGlua19zZWdtZW50cyh4aGNpLCBzZWcsIHNlZy0+bmV4dCwgMSk7CisJCXNlZyA9IHNlZy0+bmV4dDsKKwl9IHdoaWxlIChzZWcgIT0gcmluZy0+Zmlyc3Rfc2VnKTsKKwl4aGNpX2luaXRpYWxpemVfcmluZ19pbmZvKHJpbmcpOworCS8qIHRkIGxpc3Qgc2hvdWxkIGJlIGVtcHR5IHNpbmNlIGFsbCBVUkJzIGhhdmUgYmVlbiBjYW5jZWxsZWQsCisJICogYnV0IGp1c3QgaW4gY2FzZS4uLgorCSAqLworCUlOSVRfTElTVF9IRUFEKCZyaW5nLT50ZF9saXN0KTsKK30KKwogI2RlZmluZSBDVFhfU0laRShfaGNjKSAoSENDXzY0QllURV9DT05URVhUKF9oY2MpID8gNjQgOiAzMikKIAogc3RydWN0IHhoY2lfY29udGFpbmVyX2N0eCAqeGhjaV9hbGxvY19jb250YWluZXJfY3R4KHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwKQEAgLTI0OCw2ICsyNzYsMTUgQEAKIAkJKGN0eC0+Ynl0ZXMgKyAoZXBfaW5kZXggKiBDVFhfU0laRSh4aGNpLT5oY2NfcGFyYW1zKSkpOwogfQogCitzdGF0aWMgdm9pZCB4aGNpX2luaXRfZW5kcG9pbnRfdGltZXIoc3RydWN0IHhoY2lfaGNkICp4aGNpLAorCQlzdHJ1Y3QgeGhjaV92aXJ0X2VwICplcCkKK3sKKwlpbml0X3RpbWVyKCZlcC0+c3RvcF9jbWRfdGltZXIpOworCWVwLT5zdG9wX2NtZF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGVwOworCWVwLT5zdG9wX2NtZF90aW1lci5mdW5jdGlvbiA9IHhoY2lfc3RvcF9lbmRwb2ludF9jb21tYW5kX3dhdGNoZG9nOworCWVwLT54aGNpID0geGhjaTsKK30KKwogLyogQWxsIHRoZSB4aGNpX3RkcyBpbiB0aGUgcmluZydzIFREIGxpc3Qgc2hvdWxkIGJlIGZyZWVkIGF0IHRoaXMgcG9pbnQgKi8KIHZvaWQgeGhjaV9mcmVlX3ZpcnRfZGV2aWNlKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwgaW50IHNsb3RfaWQpCiB7CkBAIC0yNjcsNiArMzA0LDEyIEBACiAJCWlmIChkZXYtPmVwc1tpXS5yaW5nKQogCQkJeGhjaV9yaW5nX2ZyZWUoeGhjaSwgZGV2LT5lcHNbaV0ucmluZyk7CiAKKwlpZiAoZGV2LT5yaW5nX2NhY2hlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9yaW5nc19jYWNoZWQ7IGkrKykKKwkJCXhoY2lfcmluZ19mcmVlKHhoY2ksIGRldi0+cmluZ19jYWNoZVtpXSk7CisJCWtmcmVlKGRldi0+cmluZ19jYWNoZSk7CisJfQorCiAJaWYgKGRldi0+aW5fY3R4KQogCQl4aGNpX2ZyZWVfY29udGFpbmVyX2N0eCh4aGNpLCBkZXYtPmluX2N0eCk7CiAJaWYgKGRldi0+b3V0X2N0eCkKQEAgLTMwOSwxNSArMzUyLDI1IEBACiAJeGhjaV9kYmcoeGhjaSwgIlNsb3QgJWQgaW5wdXQgY3R4ID0gMHglbGx4IChkbWEpXG4iLCBzbG90X2lkLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkZXYtPmluX2N0eC0+ZG1hKTsKIAotCS8qIEluaXRpYWxpemUgdGhlIGNhbmNlbGxhdGlvbiBsaXN0IGZvciBlYWNoIGVuZHBvaW50ICovCi0JZm9yIChpID0gMDsgaSA8IDMxOyBpKyspCisJLyogSW5pdGlhbGl6ZSB0aGUgY2FuY2VsbGF0aW9uIGxpc3QgYW5kIHdhdGNoZG9nIHRpbWVycyBmb3IgZWFjaCBlcCAqLworCWZvciAoaSA9IDA7IGkgPCAzMTsgaSsrKSB7CisJCXhoY2lfaW5pdF9lbmRwb2ludF90aW1lcih4aGNpLCAmZGV2LT5lcHNbaV0pOwogCQlJTklUX0xJU1RfSEVBRCgmZGV2LT5lcHNbaV0uY2FuY2VsbGVkX3RkX2xpc3QpOworCX0KIAogCS8qIEFsbG9jYXRlIGVuZHBvaW50IDAgcmluZyAqLwogCWRldi0+ZXBzWzBdLnJpbmcgPSB4aGNpX3JpbmdfYWxsb2MoeGhjaSwgMSwgdHJ1ZSwgZmxhZ3MpOwogCWlmICghZGV2LT5lcHNbMF0ucmluZykKIAkJZ290byBmYWlsOwogCisJLyogQWxsb2NhdGUgcG9pbnRlcnMgdG8gdGhlIHJpbmcgY2FjaGUgKi8KKwlkZXYtPnJpbmdfY2FjaGUgPSBremFsbG9jKAorCQkJc2l6ZW9mKHN0cnVjdCB4aGNpX3JpbmcgKikqWEhDSV9NQVhfUklOR1NfQ0FDSEVELAorCQkJZmxhZ3MpOworCWlmICghZGV2LT5yaW5nX2NhY2hlKQorCQlnb3RvIGZhaWw7CisJZGV2LT5udW1fcmluZ3NfY2FjaGVkID0gMDsKKwogCWluaXRfY29tcGxldGlvbigmZGV2LT5jbWRfY29tcGxldGlvbik7CiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+Y21kX2xpc3QpOwogCkBAIC01NDQsOCArNTk3LDE2IEBACiAJLyogU2V0IHVwIHRoZSBlbmRwb2ludCByaW5nICovCiAJdmlydF9kZXYtPmVwc1tlcF9pbmRleF0ubmV3X3JpbmcgPQogCQl4aGNpX3JpbmdfYWxsb2MoeGhjaSwgMSwgdHJ1ZSwgbWVtX2ZsYWdzKTsKLQlpZiAoIXZpcnRfZGV2LT5lcHNbZXBfaW5kZXhdLm5ld19yaW5nKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIXZpcnRfZGV2LT5lcHNbZXBfaW5kZXhdLm5ld19yaW5nKSB7CisJCS8qIEF0dGVtcHQgdG8gdXNlIHRoZSByaW5nIGNhY2hlICovCisJCWlmICh2aXJ0X2Rldi0+bnVtX3JpbmdzX2NhY2hlZCA9PSAwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXZpcnRfZGV2LT5lcHNbZXBfaW5kZXhdLm5ld19yaW5nID0KKwkJCXZpcnRfZGV2LT5yaW5nX2NhY2hlW3ZpcnRfZGV2LT5udW1fcmluZ3NfY2FjaGVkXTsKKwkJdmlydF9kZXYtPnJpbmdfY2FjaGVbdmlydF9kZXYtPm51bV9yaW5nc19jYWNoZWRdID0gTlVMTDsKKwkJdmlydF9kZXYtPm51bV9yaW5nc19jYWNoZWQtLTsKKwkJeGhjaV9yZWluaXRfY2FjaGVkX3JpbmcoeGhjaSwgdmlydF9kZXYtPmVwc1tlcF9pbmRleF0ubmV3X3JpbmcpOworCX0KIAllcF9yaW5nID0gdmlydF9kZXYtPmVwc1tlcF9pbmRleF0ubmV3X3Jpbmc7CiAJZXBfY3R4LT5kZXEgPSBlcF9yaW5nLT5maXJzdF9zZWctPmRtYSB8IGVwX3JpbmctPmN5Y2xlX3N0YXRlOwogCkBAIC03NjgsMTQgKzgyOSwxNyBAQAogCiAJY29tbWFuZC0+aW5fY3R4ID0KIAkJeGhjaV9hbGxvY19jb250YWluZXJfY3R4KHhoY2ksIFhIQ0lfQ1RYX1RZUEVfSU5QVVQsIG1lbV9mbGFncyk7Ci0JaWYgKCFjb21tYW5kLT5pbl9jdHgpCisJaWYgKCFjb21tYW5kLT5pbl9jdHgpIHsKKwkJa2ZyZWUoY29tbWFuZCk7CiAJCXJldHVybiBOVUxMOworCX0KIAogCWlmIChhbGxvY2F0ZV9jb21wbGV0aW9uKSB7CiAJCWNvbW1hbmQtPmNvbXBsZXRpb24gPQogCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGNvbXBsZXRpb24pLCBtZW1fZmxhZ3MpOwogCQlpZiAoIWNvbW1hbmQtPmNvbXBsZXRpb24pIHsKIAkJCXhoY2lfZnJlZV9jb250YWluZXJfY3R4KHhoY2ksIGNvbW1hbmQtPmluX2N0eCk7CisJCQlrZnJlZShjb21tYW5kKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCWluaXRfY29tcGxldGlvbihjb21tYW5kLT5jb21wbGV0aW9uKTsKQEAgLTg0OCw2ICs5MTIsMTYzIEBACiAJeGhjaS0+cGFnZV9zaGlmdCA9IDA7CiB9CiAKK3N0YXRpYyBpbnQgeGhjaV90ZXN0X3RyYl9pbl90ZChzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksCisJCXN0cnVjdCB4aGNpX3NlZ21lbnQgKmlucHV0X3NlZywKKwkJdW5pb24geGhjaV90cmIgKnN0YXJ0X3RyYiwKKwkJdW5pb24geGhjaV90cmIgKmVuZF90cmIsCisJCWRtYV9hZGRyX3QgaW5wdXRfZG1hLAorCQlzdHJ1Y3QgeGhjaV9zZWdtZW50ICpyZXN1bHRfc2VnLAorCQljaGFyICp0ZXN0X25hbWUsIGludCB0ZXN0X251bWJlcikKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnRfZG1hOworCXVuc2lnbmVkIGxvbmcgbG9uZyBlbmRfZG1hOworCXN0cnVjdCB4aGNpX3NlZ21lbnQgKnNlZzsKKworCXN0YXJ0X2RtYSA9IHhoY2lfdHJiX3ZpcnRfdG9fZG1hKGlucHV0X3NlZywgc3RhcnRfdHJiKTsKKwllbmRfZG1hID0geGhjaV90cmJfdmlydF90b19kbWEoaW5wdXRfc2VnLCBlbmRfdHJiKTsKKworCXNlZyA9IHRyYl9pbl90ZChpbnB1dF9zZWcsIHN0YXJ0X3RyYiwgZW5kX3RyYiwgaW5wdXRfZG1hKTsKKwlpZiAoc2VnICE9IHJlc3VsdF9zZWcpIHsKKwkJeGhjaV93YXJuKHhoY2ksICJXQVJOOiAlcyBUUkIgbWF0aCB0ZXN0ICVkIGZhaWxlZCFcbiIsCisJCQkJdGVzdF9uYW1lLCB0ZXN0X251bWJlcik7CisJCXhoY2lfd2Fybih4aGNpLCAiVGVzdGVkIFRSQiBtYXRoIHcvIHNlZyAlcCBhbmQgIgorCQkJCSJpbnB1dCBETUEgMHglbGx4XG4iLAorCQkJCWlucHV0X3NlZywKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBpbnB1dF9kbWEpOworCQl4aGNpX3dhcm4oeGhjaSwgInN0YXJ0aW5nIFRSQiAlcCAoMHglbGx4IERNQSksICIKKwkJCQkiZW5kaW5nIFRSQiAlcCAoMHglbGx4IERNQSlcbiIsCisJCQkJc3RhcnRfdHJiLCBzdGFydF9kbWEsCisJCQkJZW5kX3RyYiwgZW5kX2RtYSk7CisJCXhoY2lfd2Fybih4aGNpLCAiRXhwZWN0ZWQgc2VnICVwLCBnb3Qgc2VnICVwXG4iLAorCQkJCXJlc3VsdF9zZWcsIHNlZyk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFRSQiBtYXRoIGNoZWNrcyBmb3IgeGhjaV90cmJfaW5fdGQoKSwgdXNpbmcgdGhlIGNvbW1hbmQgYW5kIGV2ZW50IHJpbmdzLiAqLworc3RhdGljIGludCB4aGNpX2NoZWNrX3RyYl9pbl90ZF9tYXRoKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwgZ2ZwX3QgbWVtX2ZsYWdzKQoreworCXN0cnVjdCB7CisJCWRtYV9hZGRyX3QJCWlucHV0X2RtYTsKKwkJc3RydWN0IHhoY2lfc2VnbWVudAkqcmVzdWx0X3NlZzsKKwl9IHNpbXBsZV90ZXN0X3ZlY3RvciBbXSA9IHsKKwkJLyogQSB6ZXJvZWQgRE1BIGZpZWxkIHNob3VsZCBmYWlsICovCisJCXsgMCwgTlVMTCB9LAorCQkvKiBPbmUgVFJCIGJlZm9yZSB0aGUgcmluZyBzdGFydCBzaG91bGQgZmFpbCAqLworCQl7IHhoY2ktPmV2ZW50X3JpbmctPmZpcnN0X3NlZy0+ZG1hIC0gMTYsIE5VTEwgfSwKKwkJLyogT25lIGJ5dGUgYmVmb3JlIHRoZSByaW5nIHN0YXJ0IHNob3VsZCBmYWlsICovCisJCXsgeGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT5kbWEgLSAxLCBOVUxMIH0sCisJCS8qIFN0YXJ0aW5nIFRSQiBzaG91bGQgc3VjY2VlZCAqLworCQl7IHhoY2ktPmV2ZW50X3JpbmctPmZpcnN0X3NlZy0+ZG1hLCB4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWcgfSwKKwkJLyogRW5kaW5nIFRSQiBzaG91bGQgc3VjY2VlZCAqLworCQl7IHhoY2ktPmV2ZW50X3JpbmctPmZpcnN0X3NlZy0+ZG1hICsgKFRSQlNfUEVSX1NFR01FTlQgLSAxKSoxNiwKKwkJCXhoY2ktPmV2ZW50X3JpbmctPmZpcnN0X3NlZyB9LAorCQkvKiBPbmUgYnl0ZSBhZnRlciB0aGUgcmluZyBlbmQgc2hvdWxkIGZhaWwgKi8KKwkJeyB4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPmRtYSArIChUUkJTX1BFUl9TRUdNRU5UIC0gMSkqMTYgKyAxLCBOVUxMIH0sCisJCS8qIE9uZSBUUkIgYWZ0ZXIgdGhlIHJpbmcgZW5kIHNob3VsZCBmYWlsICovCisJCXsgeGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT5kbWEgKyAoVFJCU19QRVJfU0VHTUVOVCkqMTYsIE5VTEwgfSwKKwkJLyogQW4gYWRkcmVzcyBvZiBhbGwgb25lcyBzaG91bGQgZmFpbCAqLworCQl7IChkbWFfYWRkcl90KSAofjApLCBOVUxMIH0sCisJfTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgeGhjaV9zZWdtZW50CSppbnB1dF9zZWc7CisJCXVuaW9uIHhoY2lfdHJiCQkqc3RhcnRfdHJiOworCQl1bmlvbiB4aGNpX3RyYgkJKmVuZF90cmI7CisJCWRtYV9hZGRyX3QJCWlucHV0X2RtYTsKKwkJc3RydWN0IHhoY2lfc2VnbWVudAkqcmVzdWx0X3NlZzsKKwl9IGNvbXBsZXhfdGVzdF92ZWN0b3IgW10gPSB7CisJCS8qIFRlc3QgZmVlZGluZyBhIHZhbGlkIERNQSBhZGRyZXNzIGZyb20gYSBkaWZmZXJlbnQgcmluZyAqLworCQl7CS5pbnB1dF9zZWcgPSB4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWcsCisJCQkuc3RhcnRfdHJiID0geGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT50cmJzLAorCQkJLmVuZF90cmIgPSAmeGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT50cmJzW1RSQlNfUEVSX1NFR01FTlQgLSAxXSwKKwkJCS5pbnB1dF9kbWEgPSB4aGNpLT5jbWRfcmluZy0+Zmlyc3Rfc2VnLT5kbWEsCisJCQkucmVzdWx0X3NlZyA9IE5VTEwsCisJCX0sCisJCS8qIFRlc3QgZmVlZGluZyBhIHZhbGlkIGVuZCBUUkIgZnJvbSBhIGRpZmZlcmVudCByaW5nICovCisJCXsJLmlucHV0X3NlZyA9IHhoY2ktPmV2ZW50X3JpbmctPmZpcnN0X3NlZywKKwkJCS5zdGFydF90cmIgPSB4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPnRyYnMsCisJCQkuZW5kX3RyYiA9ICZ4aGNpLT5jbWRfcmluZy0+Zmlyc3Rfc2VnLT50cmJzW1RSQlNfUEVSX1NFR01FTlQgLSAxXSwKKwkJCS5pbnB1dF9kbWEgPSB4aGNpLT5jbWRfcmluZy0+Zmlyc3Rfc2VnLT5kbWEsCisJCQkucmVzdWx0X3NlZyA9IE5VTEwsCisJCX0sCisJCS8qIFRlc3QgZmVlZGluZyBhIHZhbGlkIHN0YXJ0IGFuZCBlbmQgVFJCIGZyb20gYSBkaWZmZXJlbnQgcmluZyAqLworCQl7CS5pbnB1dF9zZWcgPSB4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWcsCisJCQkuc3RhcnRfdHJiID0geGhjaS0+Y21kX3JpbmctPmZpcnN0X3NlZy0+dHJicywKKwkJCS5lbmRfdHJiID0gJnhoY2ktPmNtZF9yaW5nLT5maXJzdF9zZWctPnRyYnNbVFJCU19QRVJfU0VHTUVOVCAtIDFdLAorCQkJLmlucHV0X2RtYSA9IHhoY2ktPmNtZF9yaW5nLT5maXJzdF9zZWctPmRtYSwKKwkJCS5yZXN1bHRfc2VnID0gTlVMTCwKKwkJfSwKKwkJLyogVFJCIGluIHRoaXMgcmluZywgYnV0IGFmdGVyIHRoaXMgVEQgKi8KKwkJewkuaW5wdXRfc2VnID0geGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLAorCQkJLnN0YXJ0X3RyYiA9ICZ4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPnRyYnNbMF0sCisJCQkuZW5kX3RyYiA9ICZ4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPnRyYnNbM10sCisJCQkuaW5wdXRfZG1hID0geGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT5kbWEgKyA0KjE2LAorCQkJLnJlc3VsdF9zZWcgPSBOVUxMLAorCQl9LAorCQkvKiBUUkIgaW4gdGhpcyByaW5nLCBidXQgYmVmb3JlIHRoaXMgVEQgKi8KKwkJewkuaW5wdXRfc2VnID0geGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLAorCQkJLnN0YXJ0X3RyYiA9ICZ4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPnRyYnNbM10sCisJCQkuZW5kX3RyYiA9ICZ4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPnRyYnNbNl0sCisJCQkuaW5wdXRfZG1hID0geGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT5kbWEgKyAyKjE2LAorCQkJLnJlc3VsdF9zZWcgPSBOVUxMLAorCQl9LAorCQkvKiBUUkIgaW4gdGhpcyByaW5nLCBidXQgYWZ0ZXIgdGhpcyB3cmFwcGVkIFREICovCisJCXsJLmlucHV0X3NlZyA9IHhoY2ktPmV2ZW50X3JpbmctPmZpcnN0X3NlZywKKwkJCS5zdGFydF90cmIgPSAmeGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT50cmJzW1RSQlNfUEVSX1NFR01FTlQgLSAzXSwKKwkJCS5lbmRfdHJiID0gJnhoY2ktPmV2ZW50X3JpbmctPmZpcnN0X3NlZy0+dHJic1sxXSwKKwkJCS5pbnB1dF9kbWEgPSB4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPmRtYSArIDIqMTYsCisJCQkucmVzdWx0X3NlZyA9IE5VTEwsCisJCX0sCisJCS8qIFRSQiBpbiB0aGlzIHJpbmcsIGJ1dCBiZWZvcmUgdGhpcyB3cmFwcGVkIFREICovCisJCXsJLmlucHV0X3NlZyA9IHhoY2ktPmV2ZW50X3JpbmctPmZpcnN0X3NlZywKKwkJCS5zdGFydF90cmIgPSAmeGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT50cmJzW1RSQlNfUEVSX1NFR01FTlQgLSAzXSwKKwkJCS5lbmRfdHJiID0gJnhoY2ktPmV2ZW50X3JpbmctPmZpcnN0X3NlZy0+dHJic1sxXSwKKwkJCS5pbnB1dF9kbWEgPSB4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPmRtYSArIChUUkJTX1BFUl9TRUdNRU5UIC0gNCkqMTYsCisJCQkucmVzdWx0X3NlZyA9IE5VTEwsCisJCX0sCisJCS8qIFRSQiBub3QgaW4gdGhpcyByaW5nLCBhbmQgd2UgaGF2ZSBhIHdyYXBwZWQgVEQgKi8KKwkJewkuaW5wdXRfc2VnID0geGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLAorCQkJLnN0YXJ0X3RyYiA9ICZ4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPnRyYnNbVFJCU19QRVJfU0VHTUVOVCAtIDNdLAorCQkJLmVuZF90cmIgPSAmeGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT50cmJzWzFdLAorCQkJLmlucHV0X2RtYSA9IHhoY2ktPmNtZF9yaW5nLT5maXJzdF9zZWctPmRtYSArIDIqMTYsCisJCQkucmVzdWx0X3NlZyA9IE5VTEwsCisJCX0sCisJfTsKKworCXVuc2lnbmVkIGludCBudW1fdGVzdHM7CisJaW50IGksIHJldDsKKworCW51bV90ZXN0cyA9IHNpemVvZihzaW1wbGVfdGVzdF92ZWN0b3IpIC8gc2l6ZW9mKHNpbXBsZV90ZXN0X3ZlY3RvclswXSk7CisJZm9yIChpID0gMDsgaSA8IG51bV90ZXN0czsgaSsrKSB7CisJCXJldCA9IHhoY2lfdGVzdF90cmJfaW5fdGQoeGhjaSwKKwkJCQl4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWcsCisJCQkJeGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT50cmJzLAorCQkJCSZ4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPnRyYnNbVFJCU19QRVJfU0VHTUVOVCAtIDFdLAorCQkJCXNpbXBsZV90ZXN0X3ZlY3RvcltpXS5pbnB1dF9kbWEsCisJCQkJc2ltcGxlX3Rlc3RfdmVjdG9yW2ldLnJlc3VsdF9zZWcsCisJCQkJIlNpbXBsZSIsIGkpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJbnVtX3Rlc3RzID0gc2l6ZW9mKGNvbXBsZXhfdGVzdF92ZWN0b3IpIC8gc2l6ZW9mKGNvbXBsZXhfdGVzdF92ZWN0b3JbMF0pOworCWZvciAoaSA9IDA7IGkgPCBudW1fdGVzdHM7IGkrKykgeworCQlyZXQgPSB4aGNpX3Rlc3RfdHJiX2luX3RkKHhoY2ksCisJCQkJY29tcGxleF90ZXN0X3ZlY3RvcltpXS5pbnB1dF9zZWcsCisJCQkJY29tcGxleF90ZXN0X3ZlY3RvcltpXS5zdGFydF90cmIsCisJCQkJY29tcGxleF90ZXN0X3ZlY3RvcltpXS5lbmRfdHJiLAorCQkJCWNvbXBsZXhfdGVzdF92ZWN0b3JbaV0uaW5wdXRfZG1hLAorCQkJCWNvbXBsZXhfdGVzdF92ZWN0b3JbaV0ucmVzdWx0X3NlZywKKwkJCQkiQ29tcGxleCIsIGkpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCXhoY2lfZGJnKHhoY2ksICJUUkIgbWF0aCB0ZXN0cyBwYXNzZWQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCiBpbnQgeGhjaV9tZW1faW5pdChzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksIGdmcF90IGZsYWdzKQogewogCWRtYV9hZGRyX3QJZG1hOwpAQCAtOTUxLDYgKzExNzIsOCBAQAogCXhoY2ktPmV2ZW50X3JpbmcgPSB4aGNpX3JpbmdfYWxsb2MoeGhjaSwgRVJTVF9OVU1fU0VHUywgZmFsc2UsIGZsYWdzKTsKIAlpZiAoIXhoY2ktPmV2ZW50X3JpbmcpCiAJCWdvdG8gZmFpbDsKKwlpZiAoeGhjaV9jaGVja190cmJfaW5fdGRfbWF0aCh4aGNpLCBmbGFncykgPCAwKQorCQlnb3RvIGZhaWw7CiAKIAl4aGNpLT5lcnN0LmVudHJpZXMgPSBwY2lfYWxsb2NfY29uc2lzdGVudCh0b19wY2lfZGV2KGRldiksCiAJCQlzaXplb2Yoc3RydWN0IHhoY2lfZXJzdF9lbnRyeSkqRVJTVF9OVU1fU0VHUywgJmRtYSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMKaW5kZXggMDY1OTVlYy4uZTA5NzAwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYwpAQCAtNTQsNiArNTQsOCBAQAogCXN0cnVjdCBwY2lfZGV2CQkqcGRldiA9IHRvX3BjaV9kZXYoaGNkLT5zZWxmLmNvbnRyb2xsZXIpOwogCWludAkJCXJldHZhbDsKIAorCWhjZC0+c2VsZi5zZ190YWJsZXNpemUgPSBUUkJTX1BFUl9TRUdNRU5UIC0gMTsKKwogCXhoY2ktPmNhcF9yZWdzID0gaGNkLT5yZWdzOwogCXhoY2ktPm9wX3JlZ3MgPSBoY2QtPnJlZ3MgKwogCQlIQ19MRU5HVEgoeGhjaV9yZWFkbCh4aGNpLCAmeGhjaS0+Y2FwX3JlZ3MtPmhjX2NhcGJhc2UpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jCmluZGV4IDgyMWI3YjQuLmVlN2JjN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXJpbmcuYwpAQCAtMzA2LDcgKzMwNiw3IEBACiAJLyogRG9uJ3QgcmluZyB0aGUgZG9vcmJlbGwgZm9yIHRoaXMgZW5kcG9pbnQgaWYgdGhlcmUgYXJlIHBlbmRpbmcKIAkgKiBjYW5jZWxsYXRpb25zIGJlY2F1c2UgdGhlIHdlIGRvbid0IHdhbnQgdG8gaW50ZXJydXB0IHByb2Nlc3NpbmcuCiAJICovCi0JaWYgKCFlcC0+Y2FuY2Vsc19wZW5kaW5nICYmICEoZXBfc3RhdGUgJiBTRVRfREVRX1BFTkRJTkcpCisJaWYgKCEoZXBfc3RhdGUgJiBFUF9IQUxUX1BFTkRJTkcpICYmICEoZXBfc3RhdGUgJiBTRVRfREVRX1BFTkRJTkcpCiAJCQkmJiAhKGVwX3N0YXRlICYgRVBfSEFMVEVEKSkgewogCQlmaWVsZCA9IHhoY2lfcmVhZGwoeGhjaSwgZGJfYWRkcikgJiBEQl9NQVNLOwogCQl4aGNpX3dyaXRlbCh4aGNpLCBmaWVsZCB8IEVQSV9UT19EQihlcF9pbmRleCksIGRiX2FkZHIpOwpAQCAtNDc1LDYgKzQ3NSwzNSBAQAogCWVwLT5lcF9zdGF0ZSB8PSBTRVRfREVRX1BFTkRJTkc7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCB4aGNpX3N0b3Bfd2F0Y2hkb2dfdGltZXJfaW5faXJxKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwKKwkJc3RydWN0IHhoY2lfdmlydF9lcCAqZXApCit7CisJZXAtPmVwX3N0YXRlICY9IH5FUF9IQUxUX1BFTkRJTkc7CisJLyogQ2FuJ3QgZGVsX3RpbWVyX3N5bmMgaW4gaW50ZXJydXB0LCBzbyB3ZSBhdHRlbXB0IHRvIGNhbmNlbC4gIElmIHRoZQorCSAqIHRpbWVyIGlzIHJ1bm5pbmcgb24gYW5vdGhlciBDUFUsIHdlIGRvbid0IGRlY3JlbWVudCBzdG9wX2NtZHNfcGVuZGluZworCSAqIChzaW5jZSB3ZSBkaWRuJ3Qgc3VjY2Vzc2Z1bGx5IHN0b3AgdGhlIHdhdGNoZG9nIHRpbWVyKS4KKwkgKi8KKwlpZiAoZGVsX3RpbWVyKCZlcC0+c3RvcF9jbWRfdGltZXIpKQorCQllcC0+c3RvcF9jbWRzX3BlbmRpbmctLTsKK30KKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCB4aGNpLT5sb2NrIGhlbGQgaW4gaW50ZXJydXB0IGNvbnRleHQgKi8KK3N0YXRpYyB2b2lkIHhoY2lfZ2l2ZWJhY2tfdXJiX2luX2lycShzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksCisJCXN0cnVjdCB4aGNpX3RkICpjdXJfdGQsIGludCBzdGF0dXMsIGNoYXIgKmFkamVjdGl2ZSkKK3sKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0geGhjaV90b19oY2QoeGhjaSk7CisKKwljdXJfdGQtPnVyYi0+aGNwcml2ID0gTlVMTDsKKwl1c2JfaGNkX3VubGlua191cmJfZnJvbV9lcChoY2QsIGN1cl90ZC0+dXJiKTsKKwl4aGNpX2RiZyh4aGNpLCAiR2l2ZWJhY2sgJXMgVVJCICVwXG4iLCBhZGplY3RpdmUsIGN1cl90ZC0+dXJiKTsKKworCXNwaW5fdW5sb2NrKCZ4aGNpLT5sb2NrKTsKKwl1c2JfaGNkX2dpdmViYWNrX3VyYihoY2QsIGN1cl90ZC0+dXJiLCBzdGF0dXMpOworCWtmcmVlKGN1cl90ZCk7CisJc3Bpbl9sb2NrKCZ4aGNpLT5sb2NrKTsKKwl4aGNpX2RiZyh4aGNpLCAiJXMgVVJCIGdpdmVuIGJhY2tcbiIsIGFkamVjdGl2ZSk7Cit9CisKIC8qCiAgKiBXaGVuIHdlIGdldCBhIGNvbW1hbmQgY29tcGxldGlvbiBmb3IgYSBTdG9wIEVuZHBvaW50IENvbW1hbmQsIHdlIG5lZWQgdG8KICAqIHVubGluayBhbnkgY2FuY2VsbGVkIFREcyBmcm9tIHRoZSByaW5nLiAgVGhlcmUgYXJlIHR3byB3YXlzIHRvIGRvIHRoYXQ6CkBAIC00OTcsOSArNTI2LDYgQEAKIAlzdHJ1Y3QgeGhjaV90ZCAqbGFzdF91bmxpbmtlZF90ZDsKIAogCXN0cnVjdCB4aGNpX2RlcXVldWVfc3RhdGUgZGVxX3N0YXRlOwotI2lmZGVmIENPTkZJR19VU0JfSENEX1NUQVQKLQlrdGltZV90IHN0b3BfdGltZSA9IGt0aW1lX2dldCgpOwotI2VuZGlmCiAKIAltZW1zZXQoJmRlcV9zdGF0ZSwgMCwgc2l6ZW9mKGRlcV9zdGF0ZSkpOwogCXNsb3RfaWQgPSBUUkJfVE9fU0xPVF9JRCh0cmItPmdlbmVyaWMuZmllbGRbM10pOwpAQCAtNTA3LDggKzUzMywxMSBAQAogCWVwID0gJnhoY2ktPmRldnNbc2xvdF9pZF0tPmVwc1tlcF9pbmRleF07CiAJZXBfcmluZyA9IGVwLT5yaW5nOwogCi0JaWYgKGxpc3RfZW1wdHkoJmVwLT5jYW5jZWxsZWRfdGRfbGlzdCkpCisJaWYgKGxpc3RfZW1wdHkoJmVwLT5jYW5jZWxsZWRfdGRfbGlzdCkpIHsKKwkJeGhjaV9zdG9wX3dhdGNoZG9nX3RpbWVyX2luX2lycSh4aGNpLCBlcCk7CisJCXJpbmdfZXBfZG9vcmJlbGwoeGhjaSwgc2xvdF9pZCwgZXBfaW5kZXgpOwogCQlyZXR1cm47CisJfQogCiAJLyogRml4IHVwIHRoZSBlcCByaW5nIGZpcnN0LCBzbyBIVyBzdG9wcyBleGVjdXRpbmcgY2FuY2VsbGVkIFREcy4KIAkgKiBXZSBoYXZlIHRoZSB4SENJIGxvY2ssIHNvIG5vdGhpbmcgY2FuIG1vZGlmeSB0aGlzIGxpc3QgdW50aWwgd2UgZHJvcApAQCAtNTM1LDkgKzU2NCw5IEBACiAJCSAqIHRoZSBjYW5jZWxsZWQgVEQgbGlzdCBmb3IgVVJCIGNvbXBsZXRpb24gbGF0ZXIuCiAJCSAqLwogCQlsaXN0X2RlbCgmY3VyX3RkLT50ZF9saXN0KTsKLQkJZXAtPmNhbmNlbHNfcGVuZGluZy0tOwogCX0KIAlsYXN0X3VubGlua2VkX3RkID0gY3VyX3RkOworCXhoY2lfc3RvcF93YXRjaGRvZ190aW1lcl9pbl9pcnEoeGhjaSwgZXApOwogCiAJLyogSWYgbmVjZXNzYXJ5LCBxdWV1ZSBhIFNldCBUcmFuc2ZlciBSaW5nIERlcXVldWUgUG9pbnRlciBjb21tYW5kICovCiAJaWYgKGRlcV9zdGF0ZS5uZXdfZGVxX3B0ciAmJiBkZXFfc3RhdGUubmV3X2RlcV9zZWcpIHsKQEAgLTU2MSwyNyArNTkwLDEzNiBAQAogCQlsaXN0X2RlbCgmY3VyX3RkLT5jYW5jZWxsZWRfdGRfbGlzdCk7CiAKIAkJLyogQ2xlYW4gdXAgdGhlIGNhbmNlbGxlZCBVUkIgKi8KLSNpZmRlZiBDT05GSUdfVVNCX0hDRF9TVEFUCi0JCWhjZF9zdGF0X3VwZGF0ZSh4aGNpLT50cF9zdGF0LCBjdXJfdGQtPnVyYi0+YWN0dWFsX2xlbmd0aCwKLQkJCQlrdGltZV9zdWIoc3RvcF90aW1lLCBjdXJfdGQtPnN0YXJ0X3RpbWUpKTsKLSNlbmRpZgotCQljdXJfdGQtPnVyYi0+aGNwcml2ID0gTlVMTDsKLQkJdXNiX2hjZF91bmxpbmtfdXJiX2Zyb21fZXAoeGhjaV90b19oY2QoeGhjaSksIGN1cl90ZC0+dXJiKTsKLQotCQl4aGNpX2RiZyh4aGNpLCAiR2l2ZWJhY2sgY2FuY2VsbGVkIFVSQiAlcFxuIiwgY3VyX3RkLT51cmIpOwotCQlzcGluX3VubG9jaygmeGhjaS0+bG9jayk7CiAJCS8qIERvZXNuJ3QgbWF0dGVyIHdoYXQgd2UgcGFzcyBmb3Igc3RhdHVzLCBzaW5jZSB0aGUgY29yZSB3aWxsCiAJCSAqIGp1c3Qgb3ZlcndyaXRlIGl0IChiZWNhdXNlIHRoZSBVUkIgaGFzIGJlZW4gdW5saW5rZWQpLgogCQkgKi8KLQkJdXNiX2hjZF9naXZlYmFja191cmIoeGhjaV90b19oY2QoeGhjaSksIGN1cl90ZC0+dXJiLCAwKTsKLQkJa2ZyZWUoY3VyX3RkKTsKKwkJeGhjaV9naXZlYmFja191cmJfaW5faXJxKHhoY2ksIGN1cl90ZCwgMCwgImNhbmNlbGxlZCIpOwogCi0JCXNwaW5fbG9jaygmeGhjaS0+bG9jayk7CisJCS8qIFN0b3AgcHJvY2Vzc2luZyB0aGUgY2FuY2VsbGVkIGxpc3QgaWYgdGhlIHdhdGNoZG9nIHRpbWVyIGlzCisJCSAqIHJ1bm5pbmcuCisJCSAqLworCQlpZiAoeGhjaS0+eGhjX3N0YXRlICYgWEhDSV9TVEFURV9EWUlORykKKwkJCXJldHVybjsKIAl9IHdoaWxlIChjdXJfdGQgIT0gbGFzdF91bmxpbmtlZF90ZCk7CiAKIAkvKiBSZXR1cm4gdG8gdGhlIGV2ZW50IGhhbmRsZXIgd2l0aCB4aGNpLT5sb2NrIHJlLWFjcXVpcmVkICovCiB9CiAKKy8qIFdhdGNoZG9nIHRpbWVyIGZ1bmN0aW9uIGZvciB3aGVuIGEgc3RvcCBlbmRwb2ludCBjb21tYW5kIGZhaWxzIHRvIGNvbXBsZXRlLgorICogSW4gdGhpcyBjYXNlLCB3ZSBhc3N1bWUgdGhlIGhvc3QgY29udHJvbGxlciBpcyBicm9rZW4gb3IgZHlpbmcgb3IgZGVhZC4gIFRoZQorICogaG9zdCBtYXkgc3RpbGwgYmUgY29tcGxldGluZyBzb21lIG90aGVyIGV2ZW50cywgc28gd2UgaGF2ZSB0byBiZSBjYXJlZnVsIHRvCisgKiBsZXQgdGhlIGV2ZW50IHJpbmcgaGFuZGxlciBhbmQgdGhlIFVSQiBkZXF1ZXVlaW5nL2VucXVldWVpbmcgZnVuY3Rpb25zIGtub3cKKyAqIHRocm91Z2ggeGhjaS0+c3RhdGUuCisgKgorICogVGhlIHRpbWVyIG1heSBhbHNvIGZpcmUgaWYgdGhlIGhvc3QgdGFrZXMgYSB2ZXJ5IGxvbmcgdGltZSB0byByZXNwb25kIHRvIHRoZQorICogY29tbWFuZCwgYW5kIHRoZSBzdG9wIGVuZHBvaW50IGNvbW1hbmQgY29tcGxldGlvbiBoYW5kbGVyIGNhbm5vdCBkZWxldGUgdGhlCisgKiB0aW1lciBiZWZvcmUgdGhlIHRpbWVyIGZ1bmN0aW9uIGlzIGNhbGxlZC4gIEFub3RoZXIgZW5kcG9pbnQgY2FuY2VsbGF0aW9uIG1heQorICogc25lYWsgaW4gYmVmb3JlIHRoZSB0aW1lciBmdW5jdGlvbiBjYW4gZ3JhYiB0aGUgbG9jaywgYW5kIHRoYXQgbWF5IHF1ZXVlCisgKiBhbm90aGVyIHN0b3AgZW5kcG9pbnQgY29tbWFuZCBhbmQgYWRkIHRoZSB0aW1lciBiYWNrLiAgU28gd2UgY2Fubm90IHVzZSBhCisgKiBzaW1wbGUgZmxhZyB0byBzYXkgd2hldGhlciB0aGVyZSBpcyBhIHBlbmRpbmcgc3RvcCBlbmRwb2ludCBjb21tYW5kIGZvciBhCisgKiBwYXJ0aWN1bGFyIGVuZHBvaW50LgorICoKKyAqIEluc3RlYWQgd2UgdXNlIGEgY29tYmluYXRpb24gb2YgdGhhdCBmbGFnIGFuZCBhIGNvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2YKKyAqIHBlbmRpbmcgc3RvcCBlbmRwb2ludCBjb21tYW5kcy4gIElmIHRoZSB0aW1lciBpcyB0aGUgdGFpbCBlbmQgb2YgdGhlIGxhc3QKKyAqIHN0b3AgZW5kcG9pbnQgY29tbWFuZCwgYW5kIHRoZSBlbmRwb2ludCdzIGNvbW1hbmQgaXMgc3RpbGwgcGVuZGluZywgd2UgYXNzdW1lCisgKiB0aGUgaG9zdCBpcyBkeWluZy4KKyAqLwordm9pZCB4aGNpX3N0b3BfZW5kcG9pbnRfY29tbWFuZF93YXRjaGRvZyh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgeGhjaV9oY2QgKnhoY2k7CisJc3RydWN0IHhoY2lfdmlydF9lcCAqZXA7CisJc3RydWN0IHhoY2lfdmlydF9lcCAqdGVtcF9lcDsKKwlzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nOworCXN0cnVjdCB4aGNpX3RkICpjdXJfdGQ7CisJaW50IHJldCwgaSwgajsKKworCWVwID0gKHN0cnVjdCB4aGNpX3ZpcnRfZXAgKikgYXJnOworCXhoY2kgPSBlcC0+eGhjaTsKKworCXNwaW5fbG9jaygmeGhjaS0+bG9jayk7CisKKwllcC0+c3RvcF9jbWRzX3BlbmRpbmctLTsKKwlpZiAoeGhjaS0+eGhjX3N0YXRlICYgWEhDSV9TVEFURV9EWUlORykgeworCQl4aGNpX2RiZyh4aGNpLCAiU3RvcCBFUCB0aW1lciByYW4sIGJ1dCBhbm90aGVyIHRpbWVyIG1hcmtlZCAiCisJCQkJInhIQ0kgYXMgRFlJTkcsIGV4aXRpbmcuXG4iKTsKKwkJc3Bpbl91bmxvY2soJnhoY2ktPmxvY2spOworCQlyZXR1cm47CisJfQorCWlmICghKGVwLT5zdG9wX2NtZHNfcGVuZGluZyA9PSAwICYmIChlcC0+ZXBfc3RhdGUgJiBFUF9IQUxUX1BFTkRJTkcpKSkgeworCQl4aGNpX2RiZyh4aGNpLCAiU3RvcCBFUCB0aW1lciByYW4sIGJ1dCBubyBjb21tYW5kIHBlbmRpbmcsICIKKwkJCQkiZXhpdGluZy5cbiIpOworCQlzcGluX3VubG9jaygmeGhjaS0+bG9jayk7CisJCXJldHVybjsKKwl9CisKKwl4aGNpX3dhcm4oeGhjaSwgInhIQ0kgaG9zdCBub3QgcmVzcG9uZGluZyB0byBzdG9wIGVuZHBvaW50IGNvbW1hbmQuXG4iKTsKKwl4aGNpX3dhcm4oeGhjaSwgIkFzc3VtaW5nIGhvc3QgaXMgZHlpbmcsIGhhbHRpbmcgaG9zdC5cbiIpOworCS8qIE9vcHMsIEhDIGlzIGRlYWQgb3IgZHlpbmcgb3IgYXQgbGVhc3Qgbm90IHJlc3BvbmRpbmcgdG8gdGhlIHN0b3AKKwkgKiBlbmRwb2ludCBjb21tYW5kLgorCSAqLworCXhoY2ktPnhoY19zdGF0ZSB8PSBYSENJX1NUQVRFX0RZSU5HOworCS8qIERpc2FibGUgaW50ZXJydXB0cyBmcm9tIHRoZSBob3N0IGNvbnRyb2xsZXIgYW5kIHN0YXJ0IGhhbHRpbmcgaXQgKi8KKwl4aGNpX3F1aWVzY2UoeGhjaSk7CisJc3Bpbl91bmxvY2soJnhoY2ktPmxvY2spOworCisJcmV0ID0geGhjaV9oYWx0KHhoY2kpOworCisJc3Bpbl9sb2NrKCZ4aGNpLT5sb2NrKTsKKwlpZiAocmV0IDwgMCkgeworCQkvKiBUaGlzIGlzIGJhZDsgdGhlIGhvc3QgaXMgbm90IHJlc3BvbmRpbmcgdG8gY29tbWFuZHMgYW5kIGl0J3MKKwkJICogbm90IGFsbG93aW5nIGl0c2VsZiB0byBiZSBoYWx0ZWQuICBBdCBsZWFzdCBpbnRlcnJ1cHRzIGFyZQorCQkgKiBkaXNhYmxlZCwgc28gd2UgY2FuIHNldCBIQ19TVEFURV9IQUxUIGFuZCBub3RpZnkgdGhlCisJCSAqIFVTQiBjb3JlLiAgQnV0IGlmIHdlIGNhbGwgdXNiX2hjX2RpZWQoKSwgaXQgd2lsbCBhdHRlbXB0IHRvCisJCSAqIGRpc2Nvbm5lY3QgYWxsIGRldmljZSBkcml2ZXJzIHVuZGVyIHRoaXMgaG9zdC4gIFRob3NlCisJCSAqIGRpc2Nvbm5lY3QoKSBtZXRob2RzIHdpbGwgd2FpdCBmb3IgYWxsIFVSQnMgdG8gYmUgdW5saW5rZWQsCisJCSAqIHNvIHdlIG11c3QgY29tcGxldGUgdGhlbS4KKwkJICovCisJCXhoY2lfd2Fybih4aGNpLCAiTm9uLXJlc3BvbnNpdmUgeEhDSSBob3N0IGlzIG5vdCBoYWx0aW5nLlxuIik7CisJCXhoY2lfd2Fybih4aGNpLCAiQ29tcGxldGluZyBhY3RpdmUgVVJCcyBhbnl3YXkuXG4iKTsKKwkJLyogV2UgY291bGQgdHVybiBhbGwgVERzIG9uIHRoZSByaW5ncyB0byBuby1vcHMuICBUaGlzIHdvbid0CisJCSAqIGhlbHAgaWYgdGhlIGhvc3QgaGFzIGNhY2hlZCBwYXJ0IG9mIHRoZSByaW5nLCBhbmQgaXMgc2xvdyBpZgorCQkgKiB3ZSB3YW50IHRvIHByZXNlcnZlIHRoZSBjeWNsZSBiaXQuICBTa2lwIGl0IGFuZCBob3BlIHRoZSBob3N0CisJCSAqIGRvZXNuJ3QgdG91Y2ggdGhlIG1lbW9yeS4KKwkJICovCisJfQorCWZvciAoaSA9IDA7IGkgPCBNQVhfSENfU0xPVFM7IGkrKykgeworCQlpZiAoIXhoY2ktPmRldnNbaV0pCisJCQljb250aW51ZTsKKwkJZm9yIChqID0gMDsgaiA8IDMxOyBqKyspIHsKKwkJCXRlbXBfZXAgPSAmeGhjaS0+ZGV2c1tpXS0+ZXBzW2pdOworCQkJcmluZyA9IHRlbXBfZXAtPnJpbmc7CisJCQlpZiAoIXJpbmcpCisJCQkJY29udGludWU7CisJCQl4aGNpX2RiZyh4aGNpLCAiS2lsbGluZyBVUkJzIGZvciBzbG90IElEICV1LCAiCisJCQkJCSJlcCBpbmRleCAldVxuIiwgaSwgaik7CisJCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnJpbmctPnRkX2xpc3QpKSB7CisJCQkJY3VyX3RkID0gbGlzdF9maXJzdF9lbnRyeSgmcmluZy0+dGRfbGlzdCwKKwkJCQkJCXN0cnVjdCB4aGNpX3RkLAorCQkJCQkJdGRfbGlzdCk7CisJCQkJbGlzdF9kZWwoJmN1cl90ZC0+dGRfbGlzdCk7CisJCQkJaWYgKCFsaXN0X2VtcHR5KCZjdXJfdGQtPmNhbmNlbGxlZF90ZF9saXN0KSkKKwkJCQkJbGlzdF9kZWwoJmN1cl90ZC0+Y2FuY2VsbGVkX3RkX2xpc3QpOworCQkJCXhoY2lfZ2l2ZWJhY2tfdXJiX2luX2lycSh4aGNpLCBjdXJfdGQsCisJCQkJCQktRVNIVVRET1dOLCAia2lsbGVkIik7CisJCQl9CisJCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnRlbXBfZXAtPmNhbmNlbGxlZF90ZF9saXN0KSkgeworCQkJCWN1cl90ZCA9IGxpc3RfZmlyc3RfZW50cnkoCisJCQkJCQkmdGVtcF9lcC0+Y2FuY2VsbGVkX3RkX2xpc3QsCisJCQkJCQlzdHJ1Y3QgeGhjaV90ZCwKKwkJCQkJCWNhbmNlbGxlZF90ZF9saXN0KTsKKwkJCQlsaXN0X2RlbCgmY3VyX3RkLT5jYW5jZWxsZWRfdGRfbGlzdCk7CisJCQkJeGhjaV9naXZlYmFja191cmJfaW5faXJxKHhoY2ksIGN1cl90ZCwKKwkJCQkJCS1FU0hVVERPV04sICJraWxsZWQiKTsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9jaygmeGhjaS0+bG9jayk7CisJeGhjaV90b19oY2QoeGhjaSktPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKKwl4aGNpX2RiZyh4aGNpLCAiQ2FsbGluZyB1c2JfaGNfZGllZCgpXG4iKTsKKwl1c2JfaGNfZGllZCh4aGNpX3RvX2hjZCh4aGNpKSk7CisJeGhjaV9kYmcoeGhjaSwgInhIQ0kgaG9zdCBjb250cm9sbGVyIGlzIGRlYWQuXG4iKTsKK30KKwogLyoKICAqIFdoZW4gd2UgZ2V0IGEgY29tcGxldGlvbiBmb3IgYSBTZXQgVHJhbnNmZXIgUmluZyBEZXF1ZXVlIFBvaW50ZXIgY29tbWFuZCwKICAqIHdlIG5lZWQgdG8gY2xlYXIgdGhlIHNldCBkZXEgcGVuZGluZyBmbGFnIGluIHRoZSBlbmRwb2ludCByaW5nIHN0YXRlLCBzbyB0aGF0CkBAIC03NjUsMjggKzkwMywzMiBAQAogCQkJCXZpcnRfZGV2LT5pbl9jdHgpOwogCQkvKiBJbnB1dCBjdHggYWRkX2ZsYWdzIGFyZSB0aGUgZW5kcG9pbnQgaW5kZXggcGx1cyBvbmUgKi8KIAkJZXBfaW5kZXggPSB4aGNpX2xhc3RfdmFsaWRfZW5kcG9pbnQoY3RybF9jdHgtPmFkZF9mbGFncykgLSAxOwotCQllcF9yaW5nID0geGhjaS0+ZGV2c1tzbG90X2lkXS0+ZXBzW2VwX2luZGV4XS5yaW5nOwotCQlpZiAoIWVwX3JpbmcpIHsKLQkJCS8qIFRoaXMgbXVzdCBoYXZlIGJlZW4gYW4gaW5pdGlhbCBjb25maWd1cmUgZW5kcG9pbnQgKi8KLQkJCXhoY2ktPmRldnNbc2xvdF9pZF0tPmNtZF9zdGF0dXMgPQotCQkJCUdFVF9DT01QX0NPREUoZXZlbnQtPnN0YXR1cyk7Ci0JCQljb21wbGV0ZSgmeGhjaS0+ZGV2c1tzbG90X2lkXS0+Y21kX2NvbXBsZXRpb24pOwotCQkJYnJlYWs7Ci0JCX0KLQkJZXBfc3RhdGUgPSB4aGNpLT5kZXZzW3Nsb3RfaWRdLT5lcHNbZXBfaW5kZXhdLmVwX3N0YXRlOwotCQl4aGNpX2RiZyh4aGNpLCAiQ29tcGxldGVkIGNvbmZpZyBlcCBjbWQgLSBsYXN0IGVwIGluZGV4ID0gJWQsICIKLQkJCQkic3RhdGUgPSAlZFxuIiwgZXBfaW5kZXgsIGVwX3N0YXRlKTsKKwkJLyogQSB1c2Jfc2V0X2ludGVyZmFjZSgpIGNhbGwgZGlyZWN0bHkgYWZ0ZXIgY2xlYXJpbmcgYSBoYWx0ZWQKKwkJICogY29uZGl0aW9uIG1heSByYWNlIG9uIHRoaXMgcXVpcmt5IGhhcmR3YXJlLgorCQkgKiBOb3Qgd29ydGggd29ycnlpbmcgYWJvdXQsIHNpbmNlIHRoaXMgaXMgcHJvdG90eXBlIGhhcmR3YXJlLgorCQkgKi8KIAkJaWYgKHhoY2ktPnF1aXJrcyAmIFhIQ0lfUkVTRVRfRVBfUVVJUksgJiYKLQkJCQllcF9zdGF0ZSAmIEVQX0hBTFRFRCkgeworCQkJCWVwX2luZGV4ICE9ICh1bnNpZ25lZCBpbnQpIC0xICYmCisJCQkJY3RybF9jdHgtPmFkZF9mbGFncyAtIFNMT1RfRkxBRyA9PQorCQkJCQljdHJsX2N0eC0+ZHJvcF9mbGFncykgeworCQkJZXBfcmluZyA9IHhoY2ktPmRldnNbc2xvdF9pZF0tPmVwc1tlcF9pbmRleF0ucmluZzsKKwkJCWVwX3N0YXRlID0geGhjaS0+ZGV2c1tzbG90X2lkXS0+ZXBzW2VwX2luZGV4XS5lcF9zdGF0ZTsKKwkJCWlmICghKGVwX3N0YXRlICYgRVBfSEFMVEVEKSkKKwkJCQlnb3RvIGJhbmR3aWR0aF9jaGFuZ2U7CisJCQl4aGNpX2RiZyh4aGNpLCAiQ29tcGxldGVkIGNvbmZpZyBlcCBjbWQgLSAiCisJCQkJCSJsYXN0IGVwIGluZGV4ID0gJWQsIHN0YXRlID0gJWRcbiIsCisJCQkJCWVwX2luZGV4LCBlcF9zdGF0ZSk7CiAJCQkvKiBDbGVhciBvdXIgaW50ZXJuYWwgaGFsdGVkIHN0YXRlIGFuZCByZXN0YXJ0IHJpbmcgKi8KIAkJCXhoY2ktPmRldnNbc2xvdF9pZF0tPmVwc1tlcF9pbmRleF0uZXBfc3RhdGUgJj0KIAkJCQl+RVBfSEFMVEVEOwogCQkJcmluZ19lcF9kb29yYmVsbCh4aGNpLCBzbG90X2lkLCBlcF9pbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQl4aGNpLT5kZXZzW3Nsb3RfaWRdLT5jbWRfc3RhdHVzID0KLQkJCQlHRVRfQ09NUF9DT0RFKGV2ZW50LT5zdGF0dXMpOwotCQkJY29tcGxldGUoJnhoY2ktPmRldnNbc2xvdF9pZF0tPmNtZF9jb21wbGV0aW9uKTsKKwkJCWJyZWFrOwogCQl9CitiYW5kd2lkdGhfY2hhbmdlOgorCQl4aGNpX2RiZyh4aGNpLCAiQ29tcGxldGVkIGNvbmZpZyBlcCBjbWRcbiIpOworCQl4aGNpLT5kZXZzW3Nsb3RfaWRdLT5jbWRfc3RhdHVzID0KKwkJCUdFVF9DT01QX0NPREUoZXZlbnQtPnN0YXR1cyk7CisJCWNvbXBsZXRlKCZ4aGNpLT5kZXZzW3Nsb3RfaWRdLT5jbWRfY29tcGxldGlvbik7CiAJCWJyZWFrOwogCWNhc2UgVFJCX1RZUEUoVFJCX0VWQUxfQ09OVEVYVCk6CiAJCXZpcnRfZGV2ID0geGhjaS0+ZGV2c1tzbG90X2lkXTsKQEAgLTg0OSw4ICs5OTEsNyBAQAogICogVFJCIGluIHRoaXMgVEQsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGF0IFRSQidzIHNlZ21lbnQuICBPdGhlcndpc2UgaXQKICAqIHJldHVybnMgMC4KICAqLwotc3RhdGljIHN0cnVjdCB4aGNpX3NlZ21lbnQgKnRyYl9pbl90ZCgKLQkJc3RydWN0IHhoY2lfc2VnbWVudCAqc3RhcnRfc2VnLAorc3RydWN0IHhoY2lfc2VnbWVudCAqdHJiX2luX3RkKHN0cnVjdCB4aGNpX3NlZ21lbnQgKnN0YXJ0X3NlZywKIAkJdW5pb24geGhjaV90cmIJKnN0YXJ0X3RyYiwKIAkJdW5pb24geGhjaV90cmIJKmVuZF90cmIsCiAJCWRtYV9hZGRyX3QJc3VzcGVjdF9kbWEpCkBAIC05MDAsNiArMTA0MSw0NSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCB4aGNpX2NsZWFudXBfaGFsdGVkX2VuZHBvaW50KHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwKKwkJdW5zaWduZWQgaW50IHNsb3RfaWQsIHVuc2lnbmVkIGludCBlcF9pbmRleCwKKwkJc3RydWN0IHhoY2lfdGQgKnRkLCB1bmlvbiB4aGNpX3RyYiAqZXZlbnRfdHJiKQoreworCXN0cnVjdCB4aGNpX3ZpcnRfZXAgKmVwID0gJnhoY2ktPmRldnNbc2xvdF9pZF0tPmVwc1tlcF9pbmRleF07CisJZXAtPmVwX3N0YXRlIHw9IEVQX0hBTFRFRDsKKwllcC0+c3RvcHBlZF90ZCA9IHRkOworCWVwLT5zdG9wcGVkX3RyYiA9IGV2ZW50X3RyYjsKKwl4aGNpX3F1ZXVlX3Jlc2V0X2VwKHhoY2ksIHNsb3RfaWQsIGVwX2luZGV4KTsKKwl4aGNpX2NsZWFudXBfc3RhbGxlZF9yaW5nKHhoY2ksIHRkLT51cmItPmRldiwgZXBfaW5kZXgpOworCXhoY2lfcmluZ19jbWRfZGIoeGhjaSk7Cit9CisKKy8qIENoZWNrIGlmIGFuIGVycm9yIGhhcyBoYWx0ZWQgdGhlIGVuZHBvaW50IHJpbmcuICBUaGUgY2xhc3MgZHJpdmVyIHdpbGwKKyAqIGNsZWFudXAgdGhlIGhhbHQgZm9yIGEgbm9uLWRlZmF1bHQgY29udHJvbCBlbmRwb2ludCBpZiB3ZSBpbmRpY2F0ZSBhIHN0YWxsLgorICogSG93ZXZlciwgYSBiYWJibGUgYW5kIG90aGVyIGVycm9ycyBhbHNvIGhhbHQgdGhlIGVuZHBvaW50IHJpbmcsIGFuZCB0aGUgY2xhc3MKKyAqIGRyaXZlciB3b24ndCBjbGVhciB0aGUgaGFsdCBpbiB0aGF0IGNhc2UsIHNvIHdlIG5lZWQgdG8gaXNzdWUgYSBTZXQgVHJhbnNmZXIKKyAqIFJpbmcgRGVxdWV1ZSBQb2ludGVyIGNvbW1hbmQgbWFudWFsbHkuCisgKi8KK3N0YXRpYyBpbnQgeGhjaV9yZXF1aXJlc19tYW51YWxfaGFsdF9jbGVhbnVwKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwKKwkJc3RydWN0IHhoY2lfZXBfY3R4ICplcF9jdHgsCisJCXVuc2lnbmVkIGludCB0cmJfY29tcF9jb2RlKQoreworCS8qIFRSQiBjb21wbGV0aW9uIGNvZGVzIHRoYXQgbWF5IHJlcXVpcmUgYSBtYW51YWwgaGFsdCBjbGVhbnVwICovCisJaWYgKHRyYl9jb21wX2NvZGUgPT0gQ09NUF9UWF9FUlIgfHwKKwkJCXRyYl9jb21wX2NvZGUgPT0gQ09NUF9CQUJCTEUgfHwKKwkJCXRyYl9jb21wX2NvZGUgPT0gQ09NUF9TUExJVF9FUlIpCisJCS8qIFRoZSAwLjk2IHNwZWMgc2F5cyBhIGJhYmJsaW5nIGNvbnRyb2wgZW5kcG9pbnQKKwkJICogaXMgbm90IGhhbHRlZC4gVGhlIDAuOTYgc3BlYyBzYXlzIGl0IGlzLiAgU29tZSBIVworCQkgKiBjbGFpbXMgdG8gYmUgMC45NSBjb21wbGlhbnQsIGJ1dCBpdCBoYWx0cyB0aGUgY29udHJvbAorCQkgKiBlbmRwb2ludCBhbnl3YXkuICBDaGVjayBpZiBhIGJhYmJsZSBoYWx0ZWQgdGhlCisJCSAqIGVuZHBvaW50LgorCQkgKi8KKwkJaWYgKChlcF9jdHgtPmVwX2luZm8gJiBFUF9TVEFURV9NQVNLKSA9PSBFUF9TVEFURV9IQUxURUQpCisJCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCiAvKgogICogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvbmRpdGlvbiwgaXQgbWVhbnMgaXQgZ290IGEgVHJhbnNmZXIKICAqIGV2ZW50IHdpdGggYSBjb3JydXB0ZWQgU2xvdCBJRCwgRW5kcG9pbnQgSUQsIG9yIFRSQiBETUEgYWRkcmVzcy4KQEAgLTEwMDIsNiArMTE4Miw3IEBACiAJCXhoY2lfd2Fybih4aGNpLCAiV0FSTjogVFJCIGVycm9yIG9uIGVuZHBvaW50XG4iKTsKIAkJc3RhdHVzID0gLUVJTFNFUTsKIAkJYnJlYWs7CisJY2FzZSBDT01QX1NQTElUX0VSUjoKIAljYXNlIENPTVBfVFhfRVJSOgogCQl4aGNpX3dhcm4oeGhjaSwgIldBUk46IHRyYW5zZmVyIGVycm9yIG9uIGVuZHBvaW50XG4iKTsKIAkJc3RhdHVzID0gLUVQUk9UTzsKQEAgLTEwMTUsNiArMTE5NiwxNiBAQAogCQlzdGF0dXMgPSAtRU5PU1I7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CisJCWlmICh0cmJfY29tcF9jb2RlID49IDIyNCAmJiB0cmJfY29tcF9jb2RlIDw9IDI1NSkgeworCQkJLyogVmVuZG9yIGRlZmluZWQgImluZm9ybWF0aW9uYWwiIGNvbXBsZXRpb24gY29kZSwKKwkJCSAqIHRyZWF0IGFzIG5vdC1hbi1lcnJvci4KKwkJCSAqLworCQkJeGhjaV9kYmcoeGhjaSwgIlZlbmRvciBkZWZpbmVkIGluZm8gY29tcGxldGlvbiBjb2RlICV1XG4iLAorCQkJCQl0cmJfY29tcF9jb2RlKTsKKwkJCXhoY2lfZGJnKHhoY2ksICJUcmVhdGluZyBjb2RlIGFzIHN1Y2Nlc3MuXG4iKTsKKwkJCXN0YXR1cyA9IDA7CisJCQlicmVhazsKKwkJfQogCQl4aGNpX3dhcm4oeGhjaSwgIkVSUk9SIFVua25vd24gZXZlbnQgY29uZGl0aW9uLCBIQyBwcm9iYWJseSBidXN0ZWRcbiIpOwogCQl1cmIgPSBOVUxMOwogCQlnb3RvIGNsZWFudXA7CkBAIC0xMDQzLDE1ICsxMjM0LDE0IEBACiAJCQllbHNlCiAJCQkJc3RhdHVzID0gMDsKIAkJCWJyZWFrOwotCQljYXNlIENPTVBfQkFCQkxFOgotCQkJLyogVGhlIDAuOTYgc3BlYyBzYXlzIGEgYmFiYmxpbmcgY29udHJvbCBlbmRwb2ludAotCQkJICogaXMgbm90IGhhbHRlZC4gVGhlIDAuOTYgc3BlYyBzYXlzIGl0IGlzLiAgU29tZSBIVwotCQkJICogY2xhaW1zIHRvIGJlIDAuOTUgY29tcGxpYW50LCBidXQgaXQgaGFsdHMgdGhlIGNvbnRyb2wKLQkJCSAqIGVuZHBvaW50IGFueXdheS4gIENoZWNrIGlmIGEgYmFiYmxlIGhhbHRlZCB0aGUKLQkJCSAqIGVuZHBvaW50LgotCQkJICovCi0JCQlpZiAoZXBfY3R4LT5lcF9pbmZvICE9IEVQX1NUQVRFX0hBTFRFRCkKKworCQlkZWZhdWx0OgorCQkJaWYgKCF4aGNpX3JlcXVpcmVzX21hbnVhbF9oYWx0X2NsZWFudXAoeGhjaSwKKwkJCQkJCWVwX2N0eCwgdHJiX2NvbXBfY29kZSkpCiAJCQkJYnJlYWs7CisJCQl4aGNpX2RiZyh4aGNpLCAiVFJCIGVycm9yIGNvZGUgJXUsICIKKwkJCQkJImhhbHRlZCBlbmRwb2ludCBpbmRleCA9ICV1XG4iLAorCQkJCQl0cmJfY29tcF9jb2RlLCBlcF9pbmRleCk7CiAJCQkvKiBlbHNlIGZhbGwgdGhyb3VnaCAqLwogCQljYXNlIENPTVBfU1RBTEw6CiAJCQkvKiBEaWQgd2UgdHJhbnNmZXIgcGFydCBvZiB0aGUgZGF0YSAobWlkZGxlKSBwaGFzZT8gKi8KQEAgLTEwNjMsMTUgKzEyNTMsOSBAQAogCQkJZWxzZQogCQkJCXRkLT51cmItPmFjdHVhbF9sZW5ndGggPSAwOwogCi0JCQllcC0+c3RvcHBlZF90ZCA9IHRkOwotCQkJZXAtPnN0b3BwZWRfdHJiID0gZXZlbnRfdHJiOwotCQkJeGhjaV9xdWV1ZV9yZXNldF9lcCh4aGNpLCBzbG90X2lkLCBlcF9pbmRleCk7Ci0JCQl4aGNpX2NsZWFudXBfc3RhbGxlZF9yaW5nKHhoY2ksIHRkLT51cmItPmRldiwgZXBfaW5kZXgpOwotCQkJeGhjaV9yaW5nX2NtZF9kYih4aGNpKTsKKwkJCXhoY2lfY2xlYW51cF9oYWx0ZWRfZW5kcG9pbnQoeGhjaSwKKwkJCQkJc2xvdF9pZCwgZXBfaW5kZXgsIHRkLCBldmVudF90cmIpOwogCQkJZ290byB0ZF9jbGVhbnVwOwotCQlkZWZhdWx0OgotCQkJLyogT3RoZXJzIGFscmVhZHkgaGFuZGxlZCBhYm92ZSAqLwotCQkJYnJlYWs7CiAJCX0KIAkJLyoKIAkJICogRGlkIHdlIHRyYW5zZmVyIGFueSBkYXRhLCBkZXNwaXRlIHRoZSBlcnJvcnMgdGhhdCBtaWdodCBoYXZlCkBAIC0xMjA5LDE2ICsxMzkzLDI1IEBACiAJCWVwLT5zdG9wcGVkX3RkID0gdGQ7CiAJCWVwLT5zdG9wcGVkX3RyYiA9IGV2ZW50X3RyYjsKIAl9IGVsc2UgewotCQlpZiAodHJiX2NvbXBfY29kZSA9PSBDT01QX1NUQUxMIHx8Ci0JCQkJdHJiX2NvbXBfY29kZSA9PSBDT01QX0JBQkJMRSkgeworCQlpZiAodHJiX2NvbXBfY29kZSA9PSBDT01QX1NUQUxMKSB7CiAJCQkvKiBUaGUgdHJhbnNmZXIgaXMgY29tcGxldGVkIGZyb20gdGhlIGRyaXZlcidzCiAJCQkgKiBwZXJzcGVjdGl2ZSwgYnV0IHdlIG5lZWQgdG8gaXNzdWUgYSBzZXQgZGVxdWV1ZQogCQkJICogY29tbWFuZCBmb3IgdGhpcyBzdGFsbGVkIGVuZHBvaW50IHRvIG1vdmUgdGhlIGRlcXVldWUKIAkJCSAqIHBvaW50ZXIgcGFzdCB0aGUgVEQuICBXZSBjYW4ndCBkbyB0aGF0IGhlcmUgYmVjYXVzZQotCQkJICogdGhlIGhhbHQgY29uZGl0aW9uIG11c3QgYmUgY2xlYXJlZCBmaXJzdC4KKwkJCSAqIHRoZSBoYWx0IGNvbmRpdGlvbiBtdXN0IGJlIGNsZWFyZWQgZmlyc3QuICBMZXQgdGhlCisJCQkgKiBVU0IgY2xhc3MgZHJpdmVyIGNsZWFyIHRoZSBzdGFsbCBsYXRlci4KIAkJCSAqLwogCQkJZXAtPnN0b3BwZWRfdGQgPSB0ZDsKIAkJCWVwLT5zdG9wcGVkX3RyYiA9IGV2ZW50X3RyYjsKKwkJfSBlbHNlIGlmICh4aGNpX3JlcXVpcmVzX21hbnVhbF9oYWx0X2NsZWFudXAoeGhjaSwKKwkJCQkJZXBfY3R4LCB0cmJfY29tcF9jb2RlKSkgeworCQkJLyogT3RoZXIgdHlwZXMgb2YgZXJyb3JzIGhhbHQgdGhlIGVuZHBvaW50LCBidXQgdGhlCisJCQkgKiBjbGFzcyBkcml2ZXIgZG9lc24ndCBjYWxsIHVzYl9yZXNldF9lbmRwb2ludCgpIHVubGVzcworCQkJICogdGhlIGVycm9yIGlzIC1FUElQRS4gIENsZWFyIHRoZSBoYWx0ZWQgc3RhdHVzIGluIHRoZQorCQkJICogeEhDSSBoYXJkd2FyZSBtYW51YWxseS4KKwkJCSAqLworCQkJeGhjaV9jbGVhbnVwX2hhbHRlZF9lbmRwb2ludCh4aGNpLAorCQkJCQlzbG90X2lkLCBlcF9pbmRleCwgdGQsIGV2ZW50X3RyYik7CiAJCX0gZWxzZSB7CiAJCQkvKiBVcGRhdGUgcmluZyBkZXF1ZXVlIHBvaW50ZXIgKi8KIAkJCXdoaWxlIChlcF9yaW5nLT5kZXF1ZXVlICE9IHRkLT5sYXN0X3RyYikKQEAgLTEyNDksMTAgKzE0NDIsOSBAQAogCQl9CiAJCWxpc3RfZGVsKCZ0ZC0+dGRfbGlzdCk7CiAJCS8qIFdhcyB0aGlzIFREIHNsYXRlZCB0byBiZSBjYW5jZWxsZWQgYnV0IGNvbXBsZXRlZCBhbnl3YXk/ICovCi0JCWlmICghbGlzdF9lbXB0eSgmdGQtPmNhbmNlbGxlZF90ZF9saXN0KSkgeworCQlpZiAoIWxpc3RfZW1wdHkoJnRkLT5jYW5jZWxsZWRfdGRfbGlzdCkpCiAJCQlsaXN0X2RlbCgmdGQtPmNhbmNlbGxlZF90ZF9saXN0KTsKLQkJCWVwLT5jYW5jZWxzX3BlbmRpbmctLTsKLQkJfQorCiAJCS8qIExlYXZlIHRoZSBURCBhcm91bmQgZm9yIHRoZSByZXNldCBlbmRwb2ludCBmdW5jdGlvbiB0byB1c2UKIAkJICogKGJ1dCBvbmx5IGlmIGl0J3Mgbm90IGEgY29udHJvbCBlbmRwb2ludCwgc2luY2Ugd2UgYWxyZWFkeQogCQkgKiBxdWV1ZWQgdGhlIFNldCBUUiBkZXF1ZXVlIHBvaW50ZXIgY29tbWFuZCBmb3Igc3RhbGxlZApAQCAtMTMzMSw2ICsxNTIzLDE0IEBACiAJZGVmYXVsdDoKIAkJeGhjaS0+ZXJyb3JfYml0bWFzayB8PSAxIDw8IDM7CiAJfQorCS8qIEFueSBvZiB0aGUgYWJvdmUgZnVuY3Rpb25zIG1heSBkcm9wIGFuZCByZS1hY3F1aXJlIHRoZSBsb2NrLCBzbyBjaGVjaworCSAqIHRvIG1ha2Ugc3VyZSBhIHdhdGNoZG9nIHRpbWVyIGRpZG4ndCBtYXJrIHRoZSBob3N0IGFzIG5vbi1yZXNwb25zaXZlLgorCSAqLworCWlmICh4aGNpLT54aGNfc3RhdGUgJiBYSENJX1NUQVRFX0RZSU5HKSB7CisJCXhoY2lfZGJnKHhoY2ksICJ4SENJIGhvc3QgZHlpbmcsIHJldHVybmluZyBmcm9tICIKKwkJCQkiZXZlbnQgaGFuZGxlci5cbiIpOworCQlyZXR1cm47CisJfQogCiAJaWYgKHVwZGF0ZV9wdHJzKSB7CiAJCS8qIFVwZGF0ZSBTVyBhbmQgSEMgZXZlbnQgcmluZyBkZXF1ZXVlIHBvaW50ZXIgKi8KQEAgLTE1NTUsNiArMTc1NSwyMSBAQAogCXJldHVybiB4aGNpX3F1ZXVlX2J1bGtfdHgoeGhjaSwgR0ZQX0FUT01JQywgdXJiLCBzbG90X2lkLCBlcF9pbmRleCk7CiB9CiAKKy8qCisgKiBUaGUgVEQgc2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgVEQgKGluY2x1ZGluZyB0aGlzIFRSQiksCisgKiByaWdodCBzaGlmdGVkIGJ5IDEwLgorICogSXQgbXVzdCBmaXQgaW4gYml0cyAyMToxNywgc28gaXQgY2FuJ3QgYmUgYmlnZ2VyIHRoYW4gMzEuCisgKi8KK3N0YXRpYyB1MzIgeGhjaV90ZF9yZW1haW5kZXIodW5zaWduZWQgaW50IHJlbWFpbmRlcikKK3sKKwl1MzIgbWF4ID0gKDEgPDwgKDIxIC0gMTcgKyAxKSkgLSAxOworCisJaWYgKChyZW1haW5kZXIgPj4gMTApID49IG1heCkKKwkJcmV0dXJuIG1heCA8PCAxNzsKKwllbHNlCisJCXJldHVybiAocmVtYWluZGVyID4+IDEwKSA8PCAxNzsKK30KKwogc3RhdGljIGludCBxdWV1ZV9idWxrX3NnX3R4KHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwgZ2ZwX3QgbWVtX2ZsYWdzLAogCQlzdHJ1Y3QgdXJiICp1cmIsIGludCBzbG90X2lkLCB1bnNpZ25lZCBpbnQgZXBfaW5kZXgpCiB7CkBAIC0xNjEyLDYgKzE4MjcsNyBAQAogCWRvIHsKIAkJdTMyIGZpZWxkID0gMDsKIAkJdTMyIGxlbmd0aF9maWVsZCA9IDA7CisJCXUzMiByZW1haW5kZXIgPSAwOwogCiAJCS8qIERvbid0IGNoYW5nZSB0aGUgY3ljbGUgYml0IG9mIHRoZSBmaXJzdCBUUkIgdW50aWwgbGF0ZXIgKi8KIAkJaWYgKGZpcnN0X3RyYikKQEAgLTE2NDEsOCArMTg1NywxMCBAQAogCQkJCQkodW5zaWduZWQgaW50KSAoYWRkciArIFRSQl9NQVhfQlVGRl9TSVpFKSAmIH4oVFJCX01BWF9CVUZGX1NJWkUgLSAxKSwKIAkJCQkJKHVuc2lnbmVkIGludCkgYWRkciArIHRyYl9idWZmX2xlbik7CiAJCX0KKwkJcmVtYWluZGVyID0geGhjaV90ZF9yZW1haW5kZXIodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoIC0KKwkJCQlydW5uaW5nX3RvdGFsKSA7CiAJCWxlbmd0aF9maWVsZCA9IFRSQl9MRU4odHJiX2J1ZmZfbGVuKSB8Ci0JCQlURF9SRU1BSU5ERVIodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoIC0gcnVubmluZ190b3RhbCkgfAorCQkJcmVtYWluZGVyIHwKIAkJCVRSQl9JTlRSX1RBUkdFVCgwKTsKIAkJcXVldWVfdHJiKHhoY2ksIGVwX3JpbmcsIGZhbHNlLAogCQkJCWxvd2VyXzMyX2JpdHMoYWRkciksCkBAIC0xNzU1LDYgKzE5NzMsNyBAQAogCiAJLyogUXVldWUgdGhlIGZpcnN0IFRSQiwgZXZlbiBpZiBpdCdzIHplcm8tbGVuZ3RoICovCiAJZG8geworCQl1MzIgcmVtYWluZGVyID0gMDsKIAkJZmllbGQgPSAwOwogCiAJCS8qIERvbid0IGNoYW5nZSB0aGUgY3ljbGUgYml0IG9mIHRoZSBmaXJzdCBUUkIgdW50aWwgbGF0ZXIgKi8KQEAgLTE3NzMsOCArMTk5MiwxMCBAQAogCQkJdGQtPmxhc3RfdHJiID0gZXBfcmluZy0+ZW5xdWV1ZTsKIAkJCWZpZWxkIHw9IFRSQl9JT0M7CiAJCX0KKwkJcmVtYWluZGVyID0geGhjaV90ZF9yZW1haW5kZXIodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoIC0KKwkJCQlydW5uaW5nX3RvdGFsKTsKIAkJbGVuZ3RoX2ZpZWxkID0gVFJCX0xFTih0cmJfYnVmZl9sZW4pIHwKLQkJCVREX1JFTUFJTkRFUih1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggLSBydW5uaW5nX3RvdGFsKSB8CisJCQlyZW1haW5kZXIgfAogCQkJVFJCX0lOVFJfVEFSR0VUKDApOwogCQlxdWV1ZV90cmIoeGhjaSwgZXBfcmluZywgZmFsc2UsCiAJCQkJbG93ZXJfMzJfYml0cyhhZGRyKSwKQEAgLTE4NjIsNyArMjA4Myw3IEBACiAJLyogSWYgdGhlcmUncyBkYXRhLCBxdWV1ZSBkYXRhIFRSQnMgKi8KIAlmaWVsZCA9IDA7CiAJbGVuZ3RoX2ZpZWxkID0gVFJCX0xFTih1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpIHwKLQkJVERfUkVNQUlOREVSKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCkgfAorCQl4aGNpX3RkX3JlbWFpbmRlcih1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpIHwKIAkJVFJCX0lOVFJfVEFSR0VUKDApOwogCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPiAwKSB7CiAJCWlmIChzZXR1cC0+YlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmgKaW5kZXggNGIyNTRiNi4uODc3ODEzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLmgKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmgKQEAgLTY1MiwxMyArNjUyLDE3IEBACiAJc3RydWN0IHhoY2lfcmluZwkJKm5ld19yaW5nOwogCXVuc2lnbmVkIGludAkJCWVwX3N0YXRlOwogI2RlZmluZSBTRVRfREVRX1BFTkRJTkcJCSgxIDw8IDApCi0jZGVmaW5lIEVQX0hBTFRFRAkJKDEgPDwgMSkKKyNkZWZpbmUgRVBfSEFMVEVECQkoMSA8PCAxKQkvKiBGb3Igc3RhbGwgaGFuZGxpbmcgKi8KKyNkZWZpbmUgRVBfSEFMVF9QRU5ESU5HCQkoMSA8PCAyKQkvKiBGb3IgVVJCIGNhbmNlbGxhdGlvbiAqLwogCS8qIC0tLS0gIFJlbGF0ZWQgdG8gVVJCIGNhbmNlbGxhdGlvbiAtLS0tICovCiAJc3RydWN0IGxpc3RfaGVhZAljYW5jZWxsZWRfdGRfbGlzdDsKLQl1bnNpZ25lZCBpbnQJCWNhbmNlbHNfcGVuZGluZzsKIAkvKiBUaGUgVFJCIHRoYXQgd2FzIGxhc3QgcmVwb3J0ZWQgaW4gYSBzdG9wcGVkIGVuZHBvaW50IHJpbmcgKi8KIAl1bmlvbiB4aGNpX3RyYgkJKnN0b3BwZWRfdHJiOwogCXN0cnVjdCB4aGNpX3RkCQkqc3RvcHBlZF90ZDsKKwkvKiBXYXRjaGRvZyB0aW1lciBmb3Igc3RvcCBlbmRwb2ludCBjb21tYW5kIHRvIGNhbmNlbCBVUkJzICovCisJc3RydWN0IHRpbWVyX2xpc3QJc3RvcF9jbWRfdGltZXI7CisJaW50CQkJc3RvcF9jbWRzX3BlbmRpbmc7CisJc3RydWN0IHhoY2lfaGNkCQkqeGhjaTsKIH07CiAKIHN0cnVjdCB4aGNpX3ZpcnRfZGV2aWNlIHsKQEAgLTY3Myw2ICs2NzcsMTAgQEAKIAlzdHJ1Y3QgeGhjaV9jb250YWluZXJfY3R4ICAgICAgICpvdXRfY3R4OwogCS8qIFVzZWQgZm9yIGFkZHJlc3NpbmcgZGV2aWNlcyBhbmQgY29uZmlndXJhdGlvbiBjaGFuZ2VzICovCiAJc3RydWN0IHhoY2lfY29udGFpbmVyX2N0eCAgICAgICAqaW5fY3R4OworCS8qIFJpbmdzIHNhdmVkIHRvIGVuc3VyZSBvbGQgYWx0IHNldHRpbmdzIGNhbiBiZSByZS1pbnN0YXRlZCAqLworCXN0cnVjdCB4aGNpX3JpbmcJCSoqcmluZ19jYWNoZTsKKwlpbnQJCQkJbnVtX3JpbmdzX2NhY2hlZDsKKyNkZWZpbmUJWEhDSV9NQVhfUklOR1NfQ0FDSEVECTMxCiAJc3RydWN0IHhoY2lfdmlydF9lcAkJZXBzWzMxXTsKIAlzdHJ1Y3QgY29tcGxldGlvbgkJY21kX2NvbXBsZXRpb247CiAJLyogU3RhdHVzIG9mIHRoZSBsYXN0IGNvbW1hbmQgaXNzdWVkIGZvciB0aGlzIGRldmljZSAqLwpAQCAtODI0LDkgKzgzMiw2IEBACiAvKiBOb3JtYWwgVFJCIGZpZWxkcyAqLwogLyogdHJhbnNmZXJfbGVuIGJpdG1hc2tzIC0gYml0cyAwOjE2ICovCiAjZGVmaW5lCVRSQl9MRU4ocCkJCSgocCkgJiAweDFmZmZmKQotLyogVEQgc2l6ZSAtIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgaW4gdGhlIFREIChpbmNsdWRpbmcgdGhpcyBUUkIpOgotICogYml0cyAxNyAtIDIxLiAgU2hpZnQgdGhlIG51bWJlciBvZiBieXRlcyBieSAxMC4gKi8KLSNkZWZpbmUgVERfUkVNQUlOREVSKHApCQkoKCgocCkgPj4gMTApICYgMHgxZikgPDwgMTcpCiAvKiBJbnRlcnJ1cHRlciBUYXJnZXQgLSB3aGljaCBNU0ktWCB2ZWN0b3IgdG8gdGFyZ2V0IHRoZSBjb21wbGV0aW9uIGV2ZW50IGF0ICovCiAjZGVmaW5lIFRSQl9JTlRSX1RBUkdFVChwKQkoKChwKSAmIDB4M2ZmKSA8PCAyMikKICNkZWZpbmUgR0VUX0lOVFJfVEFSR0VUKHApCSgoKHApID4+IDIyKSAmIDB4M2ZmKQpAQCAtMTAyMiw2ICsxMDI3LDggQEAKICNkZWZpbmUJRVJTVF9FTlRSSUVTCTEKIC8qIFBvbGwgZXZlcnkgNjAgc2Vjb25kcyAqLwogI2RlZmluZQlQT0xMX1RJTUVPVVQJNjAKKy8qIFN0b3AgZW5kcG9pbnQgY29tbWFuZCB0aW1lb3V0IChzZWNzKSBmb3IgVVJCIGNhbmNlbGxhdGlvbiB3YXRjaGRvZyB0aW1lciAqLworI2RlZmluZSBYSENJX1NUT1BfRVBfQ01EX1RJTUVPVVQJNQogLyogWFhYOiBNYWtlIHRoZXNlIG1vZHVsZSBwYXJhbWV0ZXJzICovCiAKIApAQCAtMTA4Myw2ICsxMDkwLDIxIEBACiAJc3RydWN0IHRpbWVyX2xpc3QJZXZlbnRfcmluZ190aW1lcjsKIAlpbnQJCQl6b21iaWU7CiAjZW5kaWYKKwkvKiBIb3N0IGNvbnRyb2xsZXIgd2F0Y2hkb2cgdGltZXIgc3RydWN0dXJlcyAqLworCXVuc2lnbmVkIGludAkJeGhjX3N0YXRlOworLyogSG9zdCBjb250cm9sbGVyIGlzIGR5aW5nIC0gbm90IHJlc3BvbmRpbmcgdG8gY29tbWFuZHMuICJJJ20gbm90IGRlYWQgeWV0ISIKKyAqCisgKiB4SEMgaW50ZXJydXB0cyBoYXZlIGJlZW4gZGlzYWJsZWQgYW5kIGEgd2F0Y2hkb2cgdGltZXIgd2lsbCAob3IgaGFzIGFscmVhZHkpCisgKiBoYWx0IHRoZSB4SENJIGhvc3QsIGFuZCBjb21wbGV0ZSBhbGwgVVJCcyB3aXRoIGFuIC1FU0hVVERPV04gY29kZS4gIEFueSBjb2RlCisgKiB0aGF0IHNlZXMgdGhpcyBzdGF0dXMgKG90aGVyIHRoYW4gdGhlIHRpbWVyIHRoYXQgc2V0IGl0KSBzaG91bGQgc3RvcCB0b3VjaGluZworICogaGFyZHdhcmUgaW1tZWRpYXRlbHkuICBJbnRlcnJ1cHQgaGFuZGxlcnMgc2hvdWxkIHJldHVybiBpbW1lZGlhdGVseSB3aGVuCisgKiB0aGV5IHNlZSB0aGlzIHN0YXR1cyAoYW55IHRpbWUgdGhleSBkcm9wIGFuZCByZS1hY3F1aXJlIHhoY2ktPmxvY2spLgorICogeGhjaV91cmJfZGVxdWV1ZSgpIHNob3VsZCBjYWxsIHVzYl9oY2RfY2hlY2tfdW5saW5rX3VyYigpIGFuZCByZXR1cm4gd2l0aG91dAorICogcHV0dGluZyB0aGUgVEQgb24gdGhlIGNhbmNlbGVkIGxpc3QsIGV0Yy4KKyAqCisgKiBUaGVyZSBhcmUgbm8gcmVwb3J0cyBvZiB4SENJIGhvc3QgY29udHJvbGxlcnMgdGhhdCBkaXNwbGF5IHRoaXMgaXNzdWUuCisgKi8KKyNkZWZpbmUgWEhDSV9TVEFURV9EWUlORwkoMSA8PCAwKQogCS8qIFN0YXRpc3RpY3MgKi8KIAlpbnQJCQlub29wc19zdWJtaXR0ZWQ7CiAJaW50CQkJbm9vcHNfaGFuZGxlZDsKQEAgLTEyMjMsNiArMTI0NSw3IEBACiAjZW5kaWYKIAogLyogeEhDSSBob3N0IGNvbnRyb2xsZXIgZ2x1ZSAqLwordm9pZCB4aGNpX3F1aWVzY2Uoc3RydWN0IHhoY2lfaGNkICp4aGNpKTsKIGludCB4aGNpX2hhbHQoc3RydWN0IHhoY2lfaGNkICp4aGNpKTsKIGludCB4aGNpX3Jlc2V0KHN0cnVjdCB4aGNpX2hjZCAqeGhjaSk7CiBpbnQgeGhjaV9pbml0KHN0cnVjdCB1c2JfaGNkICpoY2QpOwpAQCAtMTI0Niw2ICsxMjY5LDkgQEAKIAogLyogeEhDSSByaW5nLCBzZWdtZW50LCBUUkIsIGFuZCBURCBmdW5jdGlvbnMgKi8KIGRtYV9hZGRyX3QgeGhjaV90cmJfdmlydF90b19kbWEoc3RydWN0IHhoY2lfc2VnbWVudCAqc2VnLCB1bmlvbiB4aGNpX3RyYiAqdHJiKTsKK3N0cnVjdCB4aGNpX3NlZ21lbnQgKnRyYl9pbl90ZChzdHJ1Y3QgeGhjaV9zZWdtZW50ICpzdGFydF9zZWcsCisJCXVuaW9uIHhoY2lfdHJiICpzdGFydF90cmIsIHVuaW9uIHhoY2lfdHJiICplbmRfdHJiLAorCQlkbWFfYWRkcl90IHN1c3BlY3RfZG1hKTsKIHZvaWQgeGhjaV9yaW5nX2NtZF9kYihzdHJ1Y3QgeGhjaV9oY2QgKnhoY2kpOwogdm9pZCAqeGhjaV9zZXR1cF9vbmVfbm9vcChzdHJ1Y3QgeGhjaV9oY2QgKnhoY2kpOwogdm9pZCB4aGNpX2hhbmRsZV9ldmVudChzdHJ1Y3QgeGhjaV9oY2QgKnhoY2kpOwpAQCAtMTI3OCw2ICsxMzA0LDcgQEAKIHZvaWQgeGhjaV9xdWV1ZV9jb25maWdfZXBfcXVpcmsoc3RydWN0IHhoY2lfaGNkICp4aGNpLAogCQl1bnNpZ25lZCBpbnQgc2xvdF9pZCwgdW5zaWduZWQgaW50IGVwX2luZGV4LAogCQlzdHJ1Y3QgeGhjaV9kZXF1ZXVlX3N0YXRlICpkZXFfc3RhdGUpOwordm9pZCB4aGNpX3N0b3BfZW5kcG9pbnRfY29tbWFuZF93YXRjaGRvZyh1bnNpZ25lZCBsb25nIGFyZyk7CiAKIC8qIHhIQ0kgcm9vdGh1YiBjb2RlICovCiBpbnQgeGhjaV9odWJfY29udHJvbChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCB1MTYgdHlwZVJlcSwgdTE2IHdWYWx1ZSwgdTE2IHdJbmRleCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jIGIvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMKaW5kZXggYTlmMDZkNy4uM2RhYjBjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMKQEAgLTIxMyw4ICsyMTMsOSBAQAogfQogCiBzdGF0aWMgdW5zaWduZWQgcGF0dGVybiA9IDA7Ci1tb2R1bGVfcGFyYW0gKHBhdHRlcm4sIHVpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhwYXR0ZXJuLCAiaS9vIHBhdHRlcm4gKDAgPT0gemVyb2VzKSIpOworc3RhdGljIHVuc2lnbmVkIG1vZF9wYXR0ZXJuOworbW9kdWxlX3BhcmFtX25hbWVkKHBhdHRlcm4sIG1vZF9wYXR0ZXJuLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKG1vZF9wYXR0ZXJuLCAiaS9vIHBhdHRlcm4gKDAgPT0gemVyb2VzKSIpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2ltcGxlX2ZpbGxfYnVmIChzdHJ1Y3QgdXJiICp1cmIpCiB7CkBAIC0xNTY3LDYgKzE1NjgsOCBAQAogCiAJLy8gRklYTUUgVVNCREVWRlNfQ09OTkVDVElORk8gZG9lc24ndCBzYXkgaG93IGZhc3QgdGhlIGRldmljZSBpcy4KIAorCXBhdHRlcm4gPSBtb2RfcGF0dGVybjsKKwogCWlmIChjb2RlICE9IFVTQlRFU1RfUkVRVUVTVCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tb24vbW9uX2Jpbi5jIGIvZHJpdmVycy91c2IvbW9uL21vbl9iaW4uYwppbmRleCAxMGYzMjA1Li4zODVlYzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tb24vbW9uX2Jpbi5jCisrKyBiL2RyaXZlcnMvdXNiL21vbi9tb25fYmluLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTIyMSw3ICsyMjIsNyBAQAogLyoKICAqIFRoaXMgaXMgYSAiY2h1bmtlZCBtZW1jcHkiLiBJdCBkb2VzIG5vdCBtYW5pcHVsYXRlIGFueSBjb3VudGVycy4KICAqLwotc3RhdGljIHZvaWQgbW9uX2NvcHlfdG9fYnVmZihjb25zdCBzdHJ1Y3QgbW9uX3JlYWRlcl9iaW4gKnRoaXMsCitzdGF0aWMgdW5zaWduZWQgaW50IG1vbl9jb3B5X3RvX2J1ZmYoY29uc3Qgc3RydWN0IG1vbl9yZWFkZXJfYmluICp0aGlzLAogICAgIHVuc2lnbmVkIGludCBvZmYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZyb20sIHVuc2lnbmVkIGludCBsZW5ndGgpCiB7CiAJdW5zaWduZWQgaW50IHN0ZXBfbGVuOwpAQCAtMjQ2LDYgKzI0Nyw3IEBACiAJCWZyb20gKz0gc3RlcF9sZW47CiAJCWxlbmd0aCAtPSBzdGVwX2xlbjsKIAl9CisJcmV0dXJuIG9mZjsKIH0KIAogLyoKQEAgLTM5NCwxNCArMzk2LDQ0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjaGFyIG1vbl9iaW5fZ2V0X2RhdGEoY29uc3Qgc3RydWN0IG1vbl9yZWFkZXJfYmluICpycCwKLSAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBzdHJ1Y3QgdXJiICp1cmIsIHVuc2lnbmVkIGludCBsZW5ndGgpCitzdGF0aWMgdW5zaWduZWQgaW50IG1vbl9iaW5fZ2V0X2RhdGEoY29uc3Qgc3RydWN0IG1vbl9yZWFkZXJfYmluICpycCwKKyAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBzdHJ1Y3QgdXJiICp1cmIsIHVuc2lnbmVkIGludCBsZW5ndGgsCisgICAgY2hhciAqZmxhZykKIHsKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXVuc2lnbmVkIGludCB0aGlzX2xlbjsKIAotCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm4gJ1onOwotCW1vbl9jb3B5X3RvX2J1ZmYocnAsIG9mZnNldCwgdXJiLT50cmFuc2Zlcl9idWZmZXIsIGxlbmd0aCk7Ci0JcmV0dXJuIDA7CisJKmZsYWcgPSAwOworCWlmICh1cmItPm51bV9zZ3MgPT0gMCkgeworCQlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgeworCQkJKmZsYWcgPSAnWic7CisJCQlyZXR1cm4gbGVuZ3RoOworCQl9CisJCW1vbl9jb3B5X3RvX2J1ZmYocnAsIG9mZnNldCwgdXJiLT50cmFuc2Zlcl9idWZmZXIsIGxlbmd0aCk7CisJCWxlbmd0aCA9IDA7CisKKwl9IGVsc2UgeworCQkvKiBJZiBJT01NVSBjb2FsZXNjaW5nIG9jY3VycmVkLCB3ZSBjYW5ub3QgdHJ1c3Qgc2dfcGFnZSAqLworCQlpZiAodXJiLT5zZy0+bmVudHMgIT0gdXJiLT5udW1fc2dzKSB7CisJCQkqZmxhZyA9ICdEJzsKKwkJCXJldHVybiBsZW5ndGg7CisJCX0KKworCQkvKiBDb3B5IHVwIHRvIHRoZSBmaXJzdCBub24tYWRkcmVzc2FibGUgc2VnbWVudCAqLworCQlmb3JfZWFjaF9zZyh1cmItPnNnLT5zZywgc2csIHVyYi0+bnVtX3NncywgaSkgeworCQkJaWYgKGxlbmd0aCA9PSAwIHx8IFBhZ2VIaWdoTWVtKHNnX3BhZ2Uoc2cpKSkKKwkJCQlicmVhazsKKwkJCXRoaXNfbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBzZy0+bGVuZ3RoLCBsZW5ndGgpOworCQkJb2Zmc2V0ID0gbW9uX2NvcHlfdG9fYnVmZihycCwgb2Zmc2V0LCBzZ192aXJ0KHNnKSwKKwkJCQkJdGhpc19sZW4pOworCQkJbGVuZ3RoIC09IHRoaXNfbGVuOworCQl9CisJCWlmIChpID09IDApCisJCQkqZmxhZyA9ICdEJzsKKwl9CisKKwlyZXR1cm4gbGVuZ3RoOwogfQogCiBzdGF0aWMgdm9pZCBtb25fYmluX2dldF9pc29kZXNjKGNvbnN0IHN0cnVjdCBtb25fcmVhZGVyX2JpbiAqcnAsCkBAIC01MzYsOCArNTY4LDkgQEAKIAl9CiAKIAlpZiAobGVuZ3RoICE9IDApIHsKLQkJZXAtPmZsYWdfZGF0YSA9IG1vbl9iaW5fZ2V0X2RhdGEocnAsIG9mZnNldCwgdXJiLCBsZW5ndGgpOwotCQlpZiAoZXAtPmZsYWdfZGF0YSAhPSAwKSB7CS8qIFllcywgaXQncyAweDAwLCBub3QgJzAnICovCisJCWxlbmd0aCA9IG1vbl9iaW5fZ2V0X2RhdGEocnAsIG9mZnNldCwgdXJiLCBsZW5ndGgsCisJCQkJJmVwLT5mbGFnX2RhdGEpOworCQlpZiAobGVuZ3RoID4gMCkgewogCQkJZGVsdGEgPSAoZXAtPmxlbl9jYXAgKyBQS1RfQUxJR04tMSkgJiB+KFBLVF9BTElHTi0xKTsKIAkJCWVwLT5sZW5fY2FwIC09IGxlbmd0aDsKIAkJCWRlbHRhIC09IChlcC0+bGVuX2NhcCArIFBLVF9BTElHTi0xKSAmIH4oUEtUX0FMSUdOLTEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMgYi9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYwppbmRleCA5ZjFhOTIyLi4wNDc1NjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYworKysgYi9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNpbmNsdWRlICJ1c2JfbW9uLmgiCkBAIC0xMzcsNiArMTM4LDggQEAKIHN0YXRpYyBpbmxpbmUgY2hhciBtb25fdGV4dF9nZXRfZGF0YShzdHJ1Y3QgbW9uX2V2ZW50X3RleHQgKmVwLCBzdHJ1Y3QgdXJiICp1cmIsCiAgICAgaW50IGxlbiwgY2hhciBldl90eXBlLCBzdHJ1Y3QgbW9uX2J1cyAqbWJ1cykKIHsKKwl2b2lkICpzcmM7CisKIAlpZiAobGVuIDw9IDApCiAJCXJldHVybiAnTCc7CiAJaWYgKGxlbiA+PSBEQVRBX01BWCkKQEAgLTE1MCwxMCArMTUzLDI0IEBACiAJCQlyZXR1cm4gJz4nOwogCX0KIAotCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm4gJ1onOwkvKiAnMCcgd291bGQgYmUgbm90IGFzIHByZXR0eS4gKi8KKwlpZiAodXJiLT5udW1fc2dzID09IDApIHsKKwkJc3JjID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJCWlmIChzcmMgPT0gTlVMTCkKKwkJCXJldHVybiAnWic7CS8qICcwJyB3b3VsZCBiZSBub3QgYXMgcHJldHR5LiAqLworCX0gZWxzZSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSB1cmItPnNnLT5zZzsKIAotCW1lbWNweShlcC0+ZGF0YSwgdXJiLT50cmFuc2Zlcl9idWZmZXIsIGxlbik7CisJCS8qIElmIElPTU1VIGNvYWxlc2Npbmcgb2NjdXJyZWQsIHdlIGNhbm5vdCB0cnVzdCBzZ19wYWdlICovCisJCWlmICh1cmItPnNnLT5uZW50cyAhPSB1cmItPm51bV9zZ3MgfHwKKwkJCQlQYWdlSGlnaE1lbShzZ19wYWdlKHNnKSkpCisJCQlyZXR1cm4gJ0QnOworCisJCS8qIEZvciB0aGUgdGV4dCBpbnRlcmZhY2Ugd2UgY29weSBvbmx5IHRoZSBmaXJzdCBzZyBidWZmZXIgKi8KKwkJbGVuID0gbWluX3QoaW50LCBzZy0+bGVuZ3RoLCBsZW4pOworCQlzcmMgPSBzZ192aXJ0KHNnKTsKKwl9CisKKwltZW1jcHkoZXAtPmRhdGEsIHNyYywgbGVuKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnIGIvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnCmluZGV4IGI4NGFiZDguLmQ5ZGI4NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKQEAgLTksMTAgKzksOSBAQAogIyAoTSlIRFJDID0gKE11bHRpcG9pbnQpIEhpZ2hzcGVlZCBEdWFsLVJvbGUgQ29udHJvbGxlcgogY29uZmlnIFVTQl9NVVNCX0hEUkMKIAlkZXBlbmRzIG9uIChVU0IgfHwgVVNCX0dBREdFVCkKLQlkZXBlbmRzIG9uIChBUk0gfHwgQkxBQ0tGSU4pCi0Jc2VsZWN0IE5PUF9VU0JfWENFSVYgaWYgQVJDSF9EQVZJTkNJCisJZGVwZW5kcyBvbiAoQVJNIHx8IChCRjU0eCAmJiAhQkY1NDQpIHx8IChCRjUyeCAmJiAhQkY1MjIgJiYgIUJGNTIzKSkKKwlzZWxlY3QgTk9QX1VTQl9YQ0VJViBpZiAoQVJDSF9EQVZJTkNJIHx8IE1BQ0hfT01BUDNFVk0gfHwgQkxBQ0tGSU4pCiAJc2VsZWN0IFRXTDQwMzBfVVNCIGlmIE1BQ0hfT01BUF8zNDMwU0RQCi0Jc2VsZWN0IE5PUF9VU0JfWENFSVYgaWYgTUFDSF9PTUFQM0VWTQogCXNlbGVjdCBVU0JfT1RHX1VUSUxTCiAJdHJpc3RhdGUgJ0ludmVudHJhIEhpZ2hzcGVlZCBEdWFsIFJvbGUgQ29udHJvbGxlciAoVEksIEFESSwgLi4uKScKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL2JsYWNrZmluLmMgYi9kcml2ZXJzL3VzYi9tdXNiL2JsYWNrZmluLmMKaW5kZXggZmNlYzg3ZS4uZmU0OTM0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9ibGFja2Zpbi5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvYmxhY2tmaW4uYwpAQCAtNTMsMTMgKzUzLDExIEBACiB2b2lkIG11c2JfcmVhZF9maWZvKHN0cnVjdCBtdXNiX2h3X2VwICpod19lcCwgdTE2IGxlbiwgdTggKmRzdCkKIHsKIAl2b2lkIF9faW9tZW0gKmZpZm8gPSBod19lcC0+ZmlmbzsKKworI2lmZGVmIENPTkZJR19CRjUyeAogCXU4IGVwbnVtID0gaHdfZXAtPmVwbnVtOwogCXUxNiBkbWFfcmVnID0gMDsKIAotCURCRyg0LCAiJWNYIGVwJWQgZmlmbyAlcCBjb3VudCAlZCBidWYgJXBcbiIsCi0JCQknUicsIGh3X2VwLT5lcG51bSwgZmlmbywgbGVuLCBkc3QpOwotCi0jaWZkZWYgQ09ORklHX0JGNTJ4CiAJaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGludClkc3QsCiAJCSh1bnNpZ25lZCBpbnQpKGRzdCArIGxlbikpOwogCkBAIC0xMDIsNiArMTAwLDkgQEAKIAkJCWxlbiAmIDB4MDEgPyAobGVuID4+IDEpICsgMSA6IGxlbiA+PiAxKTsKICNlbmRpZgogCisJREJHKDQsICIlY1ggZXAlZCBmaWZvICVwIGNvdW50ICVkIGJ1ZiAlcFxuIiwKKwkJCSdSJywgaHdfZXAtPmVwbnVtLCBmaWZvLCBsZW4sIGRzdCk7CisKIAlkdW1wX2ZpZm9fZGF0YShkc3QsIGxlbik7CiB9CiAKQEAgLTIyNSw4ICsyMjYsOSBAQAogCXJldHVybiAwOwogfQogCi12b2lkIG11c2JfcGxhdGZvcm1fc2V0X21vZGUoc3RydWN0IG11c2IgKm11c2IsIHU4IG11c2JfbW9kZSkKK2ludCBtdXNiX3BsYXRmb3JtX3NldF9tb2RlKHN0cnVjdCBtdXNiICptdXNiLCB1OCBtdXNiX21vZGUpCiB7CisJcmV0dXJuIC1FSU87CiB9CiAKIGludCBfX2luaXQgbXVzYl9wbGF0Zm9ybV9pbml0KHN0cnVjdCBtdXNiICptdXNiKQpAQCAtMjYxLDEwICsyNjMsNiBAQAogCQlTU1lOQygpOwogCX0KIAotCS8qIFRPRE8KLQkgKiBTZXQgU0lDLUlWRyByZWdpc3RlcgotCSAqLwotCiAJLyogQ29uZmlndXJlIFBMTCBvc2NpbGxhdG9yIHJlZ2lzdGVyICovCiAJYmZpbl93cml0ZV9VU0JfUExMT1NDX0NUUkwoMHgzMGE4KTsKIAlTU1lOQygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9ibGFja2Zpbi5oIGIvZHJpdmVycy91c2IvbXVzYi9ibGFja2Zpbi5oCmluZGV4IGEyNDBjMWUuLjEwYjdkNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvYmxhY2tmaW4uaAorKysgYi9kcml2ZXJzL3VzYi9tdXNiL2JsYWNrZmluLmgKQEAgLTE0LDYgKzE0LDQzIEBACiAgKiBCbGFja2ZpbiBzcGVjaWZpYyBkZWZpbml0aW9ucwogICovCiAKKy8qIEFub21hbGllcyBub3RlczoKKyAqCisgKiAgMDUwMDA0NTAgLSBVU0IgRE1BIE1vZGUgMSBTaG9ydCBQYWNrZXQgRGF0YSBDb3JydXB0aW9uOgorICogICAgICAgICAgICAgTVVTQiBkcml2ZXIgaXMgZGVzaWduZWQgdG8gdHJhbnNmZXIgYnVmZmVyIG9mIE4gKiBtYXhwYWNrZXQgc2l6ZQorICogICAgICAgICAgICAgaW4gRE1BIG1vZGUgMSBhbmQgbGVhdmUgdGhlIHJlc3Qgb2YgdGhlIGRhdGEgdG8gdGhlIG5leHQKKyAqICAgICAgICAgICAgIHRyYW5zZmVyIGluIERNQSBtb2RlIDAsIHNvIHdlIG5ldmVyIHRyYW5zbWl0IGEgc2hvcnQgcGFja2V0IGluCisgKiAgICAgICAgICAgICBETUEgbW9kZSAxLgorICoKKyAqICAwNTAwMDQ2MyAtIFRoaXMgYW5vbWFseSBkb2Vzbid0IGFmZmVjdCB0aGlzIGRyaXZlciBzaW5jZSBpdAorICogICAgICAgICAgICAgbmV2ZXIgdXNlcyBMMSBvciBMMiBtZW1vcnkgYXMgZGF0YSBkZXN0aW5hdGlvbi4KKyAqCisgKiAgMDUwMDA0NjQgLSBUaGlzIGFub21hbHkgZG9lc24ndCBhZmZlY3QgdGhpcyBkcml2ZXIgc2luY2UgaXQKKyAqICAgICAgICAgICAgIG5ldmVyIHVzZXMgTDEgb3IgTDIgbWVtb3J5IGFzIGRhdGEgc291cmNlLgorICoKKyAqICAwNTAwMDQ2NSAtIFRoZSBhbm9tYWx5IGNhbiBiZSBzZWVuIHdoZW4gU0NMSyBpcyBvdmVyIDEwMCBNSHosIGFuZCB0aGVyZSBpcworICogICAgICAgICAgICAgbm8gd2F5IHRvIHdvcmthcm91bmQgZm9yIGJ1bGsgZW5kcG9pbnRzLiAgU2luY2UgdGhlIHdNYXhQYWNrU2l6ZQorICogICAgICAgICAgICAgb2YgYnVsayBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNTEyLCB3aGlsZSB0aGUgZmlmbyBzaXplIG9mCisgKiAgICAgICAgICAgICBlbmRwb2ludCA1LCA2LCA3IGlzIDEwMjQsIHRoZSBkb3VibGUgYnVmZmVyIG1vZGUgaXMgZW5hYmxlZAorICogICAgICAgICAgICAgYXV0b21hdGljYWxseSB3aGVuIHRoZXNlIGVuZHBvaW50cyBhcmUgdXNlZCBmb3IgYnVsayBPVVQuCisgKgorICogIDA1MDAwNDY2IC0gVGhpcyBhbm9tYWx5IGRvZXNuJ3QgYWZmZWN0IHRoaXMgZHJpdmVyIHNpbmNlIGl0IG5ldmVyIG1peGVzCisgKiAgICAgICAgICAgICBjb25jdXJyZW50IERNQSBhbmQgY29yZSBhY2Nlc3NlcyB0byB0aGUgVFggZW5kcG9pbnQgRklGT3MuCisgKgorICogIDA1MDAwNDY3IC0gVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgYW5vbWFseSB3aWxsIGludHJvZHVjZSBhbm90aGVyCisgKiAgICAgICAgICAgICBhbm9tYWx5IC0gMDUwMDA0NjUuCisgKi8KKworLyogVGhlIE1lbnRvciBVU0IgRE1BIGVuZ2luZSBvbiBCRjUyeCAoc2lsaWNvbiB2MC4wIGFuZCB2MC4xKSBzZWVtcyB0byBiZQorICogdW5zdGFibGUgaW4gaG9zdCBtb2RlLiAgVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IEFub21hbHkgMDUwMDAzODAuICBBZnRlcgorICogZGlnZ2luZyBvdXQgdGhlIHJvb3QgY2F1c2UsIHdlIHdpbGwgY2hhbmdlIHRoaXMgbnVtYmVyIGFjY29yZGluZ2x5LgorICogU28sIG5lZWQgdG8gZWl0aGVyIHVzZSBzaWxpY29uIHYwLjIrIG9yIGRpc2FibGUgRE1BIG1vZGUgaW4gTVVTQi4KKyAqLworI2lmIEFOT01BTFlfMDUwMDAzODAgJiYgZGVmaW5lZChDT05GSUdfQkY1MngpICYmIFwKKyAgICBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDKSAmJiAhZGVmaW5lZChDT05GSUdfTVVTQl9QSU9fT05MWSkKKyMgZXJyb3IgIlBsZWFzZSB1c2UgUElPIG1vZGUgaW4gTVVTQiBkcml2ZXIgb24gYmY1MnggY2hpcCB2MC4wIGFuZCB2MC4xIgorI2VuZGlmCisKICN1bmRlZiBEVU1QX0ZJRk9fREFUQQogI2lmZGVmIERVTVBfRklGT19EQVRBCiBzdGF0aWMgdm9pZCBkdW1wX2ZpZm9fZGF0YSh1OCAqYnVmLCB1MTYgbGVuKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKaW5kZXggNTQ3ZTBlMy4uNDlmMjM0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCkBAIC0xMzE5LDcgKzEzMTksNiBAQAogI2VuZGlmCiAJdTggcmVnOwogCWNoYXIgKnR5cGU7Ci0JdTE2IGh3dmVycywgcmV2X21ham9yLCByZXZfbWlub3I7CiAJY2hhciBhSW5mb1s3OF0sIGFSZXZpc2lvblszMl0sIGFEYXRlWzEyXTsKIAl2b2lkIF9faW9tZW0JKm1iYXNlID0gbXVzYi0+bXJlZ3M7CiAJaW50CQlzdGF0dXMgPSAwOwpAQCAtMTM5MSwxMSArMTM5MCwxMCBAQAogCX0KIAogCS8qIGxvZyByZWxlYXNlIGluZm8gKi8KLQlod3ZlcnMgPSBtdXNiX3JlYWRfaHd2ZXJzKG1iYXNlKTsKLQlyZXZfbWFqb3IgPSAoaHd2ZXJzID4+IDEwKSAmIDB4MWY7Ci0JcmV2X21pbm9yID0gaHd2ZXJzICYgMHgzZmY7Ci0Jc25wcmludGYoYVJldmlzaW9uLCAzMiwgIiVkLiVkJXMiLCByZXZfbWFqb3IsCi0JCXJldl9taW5vciwgKGh3dmVycyAmIDB4ODAwMCkgPyAiUkMiIDogIiIpOworCW11c2ItPmh3dmVycyA9IG11c2JfcmVhZF9od3ZlcnMobWJhc2UpOworCXNucHJpbnRmKGFSZXZpc2lvbiwgMzIsICIlZC4lZCVzIiwgTVVTQl9IV1ZFUlNfTUFKT1IobXVzYi0+aHd2ZXJzKSwKKwkJTVVTQl9IV1ZFUlNfTUlOT1IobXVzYi0+aHd2ZXJzKSwKKwkJKG11c2ItPmh3dmVycyAmIE1VU0JfSFdWRVJTX1JDKSA/ICJSQyIgOiAiIik7CiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlc0hEUkMgUlRMIHZlcnNpb24gJXMgJXNcbiIsCiAJCQltdXNiX2RyaXZlcl9uYW1lLCB0eXBlLCBhUmV2aXNpb24sIGFEYXRlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaCBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmgKaW5kZXggNmFhNWYyMi4uMDNkNTA5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaAorKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5oCkBAIC0zMjIsNiArMzIyLDE0IEBACiAJc3RydWN0IGNsawkJKmNsb2NrOwogCWlycXJldHVybl90CQkoKmlzcikoaW50LCB2b2lkICopOwogCXN0cnVjdCB3b3JrX3N0cnVjdAlpcnFfd29yazsKKyNkZWZpbmUgTVVTQl9IV1ZFUlNfTUFKT1IoeCkJKCh4ID4+IDEwKSAmIDB4MWYpCisjZGVmaW5lIE1VU0JfSFdWRVJTX01JTk9SKHgpCSh4ICYgMHgzZmYpCisjZGVmaW5lIE1VU0JfSFdWRVJTX1JDCQkweDgwMDAKKyNkZWZpbmUgTVVTQl9IV1ZFUlNfMTMwMAkweDUyQworI2RlZmluZSBNVVNCX0hXVkVSU18xNDAwCTB4NTkwCisjZGVmaW5lIE1VU0JfSFdWRVJTXzE4MDAJMHg3MjAKKyNkZWZpbmUgTVVTQl9IV1ZFUlNfMjAwMAkweDgwMAorCXUxNgkJCWh3dmVyczsKIAogLyogdGhpcyBodWIgc3RhdHVzIGJpdCBpcyByZXNlcnZlZCBieSBVU0IgMi4wIGFuZCBub3Qgc2VlbiBieSB1c2Jjb3JlICovCiAjZGVmaW5lIE1VU0JfUE9SVF9TVEFUX1JFU1VNRQkoMSA8PCAzMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kbWEuaCBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kbWEuaAppbmRleCAwYTJjNGUzLi45MTYwNjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZG1hLmgKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2RtYS5oCkBAIC04MCw2ICs4MCwxNyBAQAogI2RlZmluZSB0dXNiX2RtYV9vbWFwKCkJCQkwCiAjZW5kaWYKIAorLyogQW5vbWFseSAwNTAwMDQ1NiAtIFVTQiBSZWNlaXZlIEludGVycnVwdCBJcyBOb3QgR2VuZXJhdGVkIGluIERNQSBNb2RlIDEKKyAqCU9ubHkgYWxsb3cgRE1BIG1vZGUgMSB0byBiZSB1c2VkIHdoZW4gdGhlIFVTQiB3aWxsIGFjdHVhbGx5IGdlbmVyYXRlIHRoZQorICoJaW50ZXJydXB0cyB3ZSBleHBlY3QuCisgKi8KKyNpZmRlZiBDT05GSUdfQkxBQ0tGSU4KKyMgdW5kZWYgVVNFX01PREUxCisjIGlmICFBTk9NQUxZXzA1MDAwNDU2CisjICBkZWZpbmUgVVNFX01PREUxCisjIGVuZGlmCisjZW5kaWYKKwogLyoKICAqIERNQSBjaGFubmVsIHN0YXR1cyAuLi4gdXBkYXRlZCBieSB0aGUgZG1hIGNvbnRyb2xsZXIgZHJpdmVyIHdoZW5ldmVyIHRoYXQKICAqIHN0YXR1cyBjaGFuZ2VzLCBhbmQgcHJvdGVjdGVkIGJ5IHRoZSBvdmVyYWxsIGNvbnRyb2xsZXIgc3BpbmxvY2suCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMKaW5kZXggNzQwNzNmOS4uYzQ5YjliYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXQuYwpAQCAtNDI5LDExMiArNDI5LDEwMiBAQAogCURCRyg0LCAiPD09ICVzLCB0eGNzciAlMDR4XG4iLCBtdXNiX2VwLT5lbmRfcG9pbnQubmFtZSwgY3NyKTsKIAogCWRtYSA9IGlzX2RtYV9jYXBhYmxlKCkgPyBtdXNiX2VwLT5kbWEgOiBOVUxMOwotCWRvIHsKLQkJLyogUkVWSVNJVCBmb3IgaGlnaCBiYW5kd2lkdGgsIE1VU0JfVFhDU1JfUF9JTkNPTVBUWAotCQkgKiBwcm9iYWJseSByYXRlcyByZXBvcnRpbmcgYXMgYSBob3N0IGVycm9yCisKKwkvKgorCSAqIFJFVklTSVQ6IGZvciBoaWdoIGJhbmR3aWR0aCwgTVVTQl9UWENTUl9QX0lOQ09NUFRYCisJICogcHJvYmFibHkgcmF0ZXMgcmVwb3J0aW5nIGFzIGEgaG9zdCBlcnJvci4KKwkgKi8KKwlpZiAoY3NyICYgTVVTQl9UWENTUl9QX1NFTlRTVEFMTCkgeworCQljc3IgfD0JTVVTQl9UWENTUl9QX1daQ19CSVRTOworCQljc3IgJj0gfk1VU0JfVFhDU1JfUF9TRU5UU1RBTEw7CisJCW11c2Jfd3JpdGV3KGVwaW8sIE1VU0JfVFhDU1IsIGNzcik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY3NyICYgTVVTQl9UWENTUl9QX1VOREVSUlVOKSB7CisJCS8qIFdlIE5BS2VkLCBubyBiaWcgZGVhbC4uLiBsaXR0bGUgcmVhc29uIHRvIGNhcmUuICovCisJCWNzciB8PQkgTVVTQl9UWENTUl9QX1daQ19CSVRTOworCQljc3IgJj0gfihNVVNCX1RYQ1NSX1BfVU5ERVJSVU4gfCBNVVNCX1RYQ1NSX1RYUEtUUkRZKTsKKwkJbXVzYl93cml0ZXcoZXBpbywgTVVTQl9UWENTUiwgY3NyKTsKKwkJREJHKDIwLCAidW5kZXJydW4gb24gZXAlZCwgcmVxICVwXG4iLCBlcG51bSwgcmVxdWVzdCk7CisJfQorCisJaWYgKGRtYV9jaGFubmVsX3N0YXR1cyhkbWEpID09IE1VU0JfRE1BX1NUQVRVU19CVVNZKSB7CisJCS8qCisJCSAqIFNIT1VMRCBOT1QgSEFQUEVOLi4uIGhhcyB3aXRoIENQUEkgdGhvdWdoLCBhZnRlcgorCQkgKiBjaGFuZ2luZyBTRU5EU1RBTEwgKGFuZCBvdGhlciBjYXNlcyk7IGhhcm1sZXNzPwogCQkgKi8KLQkJaWYgKGNzciAmIE1VU0JfVFhDU1JfUF9TRU5UU1RBTEwpIHsKKwkJREJHKDUsICIlcyBkbWEgc3RpbGwgYnVzeT9cbiIsIG11c2JfZXAtPmVuZF9wb2ludC5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChyZXF1ZXN0KSB7CisJCXU4CWlzX2RtYSA9IDA7CisKKwkJaWYgKGRtYSAmJiAoY3NyICYgTVVTQl9UWENTUl9ETUFFTkFCKSkgeworCQkJaXNfZG1hID0gMTsKIAkJCWNzciB8PSBNVVNCX1RYQ1NSX1BfV1pDX0JJVFM7Ci0JCQljc3IgJj0gfk1VU0JfVFhDU1JfUF9TRU5UU1RBTEw7CisJCQljc3IgJj0gfihNVVNCX1RYQ1NSX0RNQUVOQUIgfCBNVVNCX1RYQ1NSX1BfVU5ERVJSVU4gfAorCQkJCSBNVVNCX1RYQ1NSX1RYUEtUUkRZKTsKIAkJCW11c2Jfd3JpdGV3KGVwaW8sIE1VU0JfVFhDU1IsIGNzcik7Ci0JCQlicmVhazsKKwkJCS8qIEVuc3VyZSB3cml0ZWJ1ZmZlciBpcyBlbXB0eS4gKi8KKwkJCWNzciA9IG11c2JfcmVhZHcoZXBpbywgTVVTQl9UWENTUik7CisJCQlyZXF1ZXN0LT5hY3R1YWwgKz0gbXVzYl9lcC0+ZG1hLT5hY3R1YWxfbGVuOworCQkJREJHKDQsICJUWENTUiVkICUwNHgsIERNQSBvZmYsIGxlbiAlenUsIHJlcSAlcFxuIiwKKwkJCQllcG51bSwgY3NyLCBtdXNiX2VwLT5kbWEtPmFjdHVhbF9sZW4sIHJlcXVlc3QpOwogCQl9CiAKLQkJaWYgKGNzciAmIE1VU0JfVFhDU1JfUF9VTkRFUlJVTikgewotCQkJLyogd2UgTkFLZWQsIG5vIGJpZyBkZWFsIC4uLiBsaXR0bGUgcmVhc29uIHRvIGNhcmUgKi8KLQkJCWNzciB8PSBNVVNCX1RYQ1NSX1BfV1pDX0JJVFM7Ci0JCQljc3IgJj0gfihNVVNCX1RYQ1NSX1BfVU5ERVJSVU4KLQkJCQkJfCBNVVNCX1RYQ1NSX1RYUEtUUkRZKTsKLQkJCW11c2Jfd3JpdGV3KGVwaW8sIE1VU0JfVFhDU1IsIGNzcik7Ci0JCQlEQkcoMjAsICJ1bmRlcnJ1biBvbiBlcCVkLCByZXEgJXBcbiIsIGVwbnVtLCByZXF1ZXN0KTsKLQkJfQotCi0JCWlmIChkbWFfY2hhbm5lbF9zdGF0dXMoZG1hKSA9PSBNVVNCX0RNQV9TVEFUVVNfQlVTWSkgewotCQkJLyogU0hPVUxEIE5PVCBIQVBQRU4gLi4uIGhhcyB3aXRoIGNwcGkgdGhvdWdoLCBhZnRlcgotCQkJICogY2hhbmdpbmcgU0VORFNUQUxMIChhbmQgb3RoZXIgY2FzZXMpOyBoYXJtbGVzcz8KKwkJaWYgKGlzX2RtYSB8fCByZXF1ZXN0LT5hY3R1YWwgPT0gcmVxdWVzdC0+bGVuZ3RoKSB7CisJCQkvKgorCQkJICogRmlyc3QsIG1heWJlIGEgdGVybWluYXRpbmcgc2hvcnQgcGFja2V0LiBTb21lIERNQQorCQkJICogZW5naW5lcyBtaWdodCBoYW5kbGUgdGhpcyBieSB0aGVtc2VsdmVzLgogCQkJICovCi0JCQlEQkcoNSwgIiVzIGRtYSBzdGlsbCBidXN5P1xuIiwgbXVzYl9lcC0+ZW5kX3BvaW50Lm5hbWUpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAocmVxdWVzdCkgewotCQkJdTgJaXNfZG1hID0gMDsKLQotCQkJaWYgKGRtYSAmJiAoY3NyICYgTVVTQl9UWENTUl9ETUFFTkFCKSkgewotCQkJCWlzX2RtYSA9IDE7Ci0JCQkJY3NyIHw9IE1VU0JfVFhDU1JfUF9XWkNfQklUUzsKLQkJCQljc3IgJj0gfihNVVNCX1RYQ1NSX0RNQUVOQUIKLQkJCQkJCXwgTVVTQl9UWENTUl9QX1VOREVSUlVOCi0JCQkJCQl8IE1VU0JfVFhDU1JfVFhQS1RSRFkpOwotCQkJCW11c2Jfd3JpdGV3KGVwaW8sIE1VU0JfVFhDU1IsIGNzcik7Ci0JCQkJLyogZW5zdXJlIHdyaXRlYnVmZmVyIGlzIGVtcHR5ICovCi0JCQkJY3NyID0gbXVzYl9yZWFkdyhlcGlvLCBNVVNCX1RYQ1NSKTsKLQkJCQlyZXF1ZXN0LT5hY3R1YWwgKz0gbXVzYl9lcC0+ZG1hLT5hY3R1YWxfbGVuOwotCQkJCURCRyg0LCAiVFhDU1IlZCAlMDR4LCBkbWEgb2ZmLCAiCi0JCQkJCQkibGVuICV6dSwgcmVxICVwXG4iLAotCQkJCQllcG51bSwgY3NyLAotCQkJCQltdXNiX2VwLT5kbWEtPmFjdHVhbF9sZW4sCi0JCQkJCXJlcXVlc3QpOwotCQkJfQotCi0JCQlpZiAoaXNfZG1hIHx8IHJlcXVlc3QtPmFjdHVhbCA9PSByZXF1ZXN0LT5sZW5ndGgpIHsKLQotCQkJCS8qIEZpcnN0LCBtYXliZSBhIHRlcm1pbmF0aW5nIHNob3J0IHBhY2tldC4KLQkJCQkgKiBTb21lIERNQSBlbmdpbmVzIG1pZ2h0IGhhbmRsZSB0aGlzIGJ5Ci0JCQkJICogdGhlbXNlbHZlcy4KLQkJCQkgKi8KLQkJCQlpZiAoKHJlcXVlc3QtPnplcm8KLQkJCQkJCSYmIHJlcXVlc3QtPmxlbmd0aAotCQkJCQkJJiYgKHJlcXVlc3QtPmxlbmd0aAotCQkJCQkJCSUgbXVzYl9lcC0+cGFja2V0X3N6KQotCQkJCQkJCT09IDApCisJCQlpZiAoKHJlcXVlc3QtPnplcm8gJiYgcmVxdWVzdC0+bGVuZ3RoCisJCQkJJiYgcmVxdWVzdC0+bGVuZ3RoICUgbXVzYl9lcC0+cGFja2V0X3N6ID09IDApCiAjaWZkZWYgQ09ORklHX1VTQl9JTlZFTlRSQV9ETUEKLQkJCQkJfHwgKGlzX2RtYSAmJgotCQkJCQkJKCghZG1hLT5kZXNpcmVkX21vZGUpIHx8Ci0JCQkJCQkgICAgKHJlcXVlc3QtPmFjdHVhbCAmCi0JCQkJCQkgICAgKG11c2JfZXAtPnBhY2tldF9zeiAtIDEpKSkpCisJCQkJfHwgKGlzX2RtYSAmJiAoIWRtYS0+ZGVzaXJlZF9tb2RlIHx8CisJCQkJCShyZXF1ZXN0LT5hY3R1YWwgJgorCQkJCQkJKG11c2JfZXAtPnBhY2tldF9zeiAtIDEpKSkpCiAjZW5kaWYKLQkJCQkpIHsKLQkJCQkJLyogb24gZG1hIGNvbXBsZXRpb24sIGZpZm8gbWF5IG5vdAotCQkJCQkgKiBiZSBhdmFpbGFibGUgeWV0IC4uLgotCQkJCQkgKi8KLQkJCQkJaWYgKGNzciAmIE1VU0JfVFhDU1JfVFhQS1RSRFkpCi0JCQkJCQlicmVhazsKLQotCQkJCQlEQkcoNCwgInNlbmRpbmcgemVybyBwa3RcbiIpOwotCQkJCQltdXNiX3dyaXRldyhlcGlvLCBNVVNCX1RYQ1NSLAotCQkJCQkJCU1VU0JfVFhDU1JfTU9ERQotCQkJCQkJCXwgTVVTQl9UWENTUl9UWFBLVFJEWSk7Ci0JCQkJCXJlcXVlc3QtPnplcm8gPSAwOwotCQkJCX0KLQotCQkJCS8qIC4uLiBvciBpZiBub3QsIHRoZW4gY29tcGxldGUgaXQgKi8KLQkJCQltdXNiX2dfZ2l2ZWJhY2sobXVzYl9lcCwgcmVxdWVzdCwgMCk7Ci0KLQkJCQkvKiBraWNrc3RhcnQgbmV4dCB0cmFuc2ZlciBpZiBhcHByb3ByaWF0ZTsKLQkJCQkgKiB0aGUgcGFja2V0IHRoYXQganVzdCBjb21wbGV0ZWQgbWlnaHQgbm90Ci0JCQkJICogYmUgdHJhbnNtaXR0ZWQgZm9yIGhvdXJzIG9yIGRheXMuCi0JCQkJICogUkVWSVNJVCBmb3IgZG91YmxlIGJ1ZmZlcmluZy4uLgotCQkJCSAqIEZJWE1FIHJldmlzaXQgZm9yIHN0YWxscyB0b28uLi4KKwkJCSkgeworCQkJCS8qCisJCQkJICogT24gRE1BIGNvbXBsZXRpb24sIEZJRk8gbWF5IG5vdCBiZQorCQkJCSAqIGF2YWlsYWJsZSB5ZXQuLi4KIAkJCQkgKi8KLQkJCQltdXNiX2VwX3NlbGVjdChtYmFzZSwgZXBudW0pOwotCQkJCWNzciA9IG11c2JfcmVhZHcoZXBpbywgTVVTQl9UWENTUik7Ci0JCQkJaWYgKGNzciAmIE1VU0JfVFhDU1JfRklGT05PVEVNUFRZKQotCQkJCQlicmVhazsKLQkJCQlyZXF1ZXN0ID0gbXVzYl9lcC0+ZGVzYwotCQkJCQkJPyBuZXh0X3JlcXVlc3QobXVzYl9lcCkKLQkJCQkJCTogTlVMTDsKLQkJCQlpZiAoIXJlcXVlc3QpIHsKLQkJCQkJREJHKDQsICIlcyBpZGxlIG5vd1xuIiwKLQkJCQkJCW11c2JfZXAtPmVuZF9wb2ludC5uYW1lKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQorCQkJCWlmIChjc3IgJiBNVVNCX1RYQ1NSX1RYUEtUUkRZKQorCQkJCQlyZXR1cm47CisKKwkJCQlEQkcoNCwgInNlbmRpbmcgemVybyBwa3RcbiIpOworCQkJCW11c2Jfd3JpdGV3KGVwaW8sIE1VU0JfVFhDU1IsIE1VU0JfVFhDU1JfTU9ERQorCQkJCQkJfCBNVVNCX1RYQ1NSX1RYUEtUUkRZKTsKKwkJCQlyZXF1ZXN0LT56ZXJvID0gMDsKIAkJCX0KIAotCQkJdHhzdGF0ZShtdXNiLCB0b19tdXNiX3JlcXVlc3QocmVxdWVzdCkpOworCQkJLyogLi4uIG9yIGlmIG5vdCwgdGhlbiBjb21wbGV0ZSBpdC4gKi8KKwkJCW11c2JfZ19naXZlYmFjayhtdXNiX2VwLCByZXF1ZXN0LCAwKTsKKworCQkJLyoKKwkJCSAqIEtpY2tzdGFydCBuZXh0IHRyYW5zZmVyIGlmIGFwcHJvcHJpYXRlOworCQkJICogdGhlIHBhY2tldCB0aGF0IGp1c3QgY29tcGxldGVkIG1pZ2h0IG5vdAorCQkJICogYmUgdHJhbnNtaXR0ZWQgZm9yIGhvdXJzIG9yIGRheXMuCisJCQkgKiBSRVZJU0lUIGZvciBkb3VibGUgYnVmZmVyaW5nLi4uCisJCQkgKiBGSVhNRSByZXZpc2l0IGZvciBzdGFsbHMgdG9vLi4uCisJCQkgKi8KKwkJCW11c2JfZXBfc2VsZWN0KG1iYXNlLCBlcG51bSk7CisJCQljc3IgPSBtdXNiX3JlYWR3KGVwaW8sIE1VU0JfVFhDU1IpOworCQkJaWYgKGNzciAmIE1VU0JfVFhDU1JfRklGT05PVEVNUFRZKQorCQkJCXJldHVybjsKKworCQkJaWYgKCFtdXNiX2VwLT5kZXNjKSB7CisJCQkJREJHKDQsICIlcyBpZGxlIG5vd1xuIiwKKwkJCQkJbXVzYl9lcC0+ZW5kX3BvaW50Lm5hbWUpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZQorCQkJCXJlcXVlc3QgPSBuZXh0X3JlcXVlc3QobXVzYl9lcCk7CiAJCX0KIAotCX0gd2hpbGUgKDApOworCQl0eHN0YXRlKG11c2IsIHRvX211c2JfcmVxdWVzdChyZXF1ZXN0KSk7CisJfQogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTk2Niw2ICs5NTYsNyBAQAogCiAJbXVzYl9lcC0+ZGVzYyA9IGRlc2M7CiAJbXVzYl9lcC0+YnVzeSA9IDA7CisJbXVzYl9lcC0+d2VkZ2VkID0gMDsKIAlzdGF0dXMgPSAwOwogCiAJcHJfZGVidWcoIiVzIHBlcmlwaDogZW5hYmxlZCAlcyBmb3IgJXMgJXMsICVzbWF4cGFja2V0ICVkXG4iLApAQCAtMTIyMCw3ICsxMjExLDcgQEAKICAqCiAgKiBleHBvcnRlZCB0byBlcDAgY29kZQogICovCi1pbnQgbXVzYl9nYWRnZXRfc2V0X2hhbHQoc3RydWN0IHVzYl9lcCAqZXAsIGludCB2YWx1ZSkKK3N0YXRpYyBpbnQgbXVzYl9nYWRnZXRfc2V0X2hhbHQoc3RydWN0IHVzYl9lcCAqZXAsIGludCB2YWx1ZSkKIHsKIAlzdHJ1Y3QgbXVzYl9lcAkJKm11c2JfZXAgPSB0b19tdXNiX2VwKGVwKTsKIAl1OAkJCWVwbnVtID0gbXVzYl9lcC0+Y3VycmVudF9lcG51bTsKQEAgLTEyNjIsNyArMTI1Myw4IEBACiAJCQkJZ290byBkb25lOwogCQkJfQogCQl9Ci0JfQorCX0gZWxzZQorCQltdXNiX2VwLT53ZWRnZWQgPSAwOwogCiAJLyogc2V0L2NsZWFyIHRoZSBzdGFsbCBhbmQgdG9nZ2xlIGJpdHMgKi8KIAlEQkcoMiwgIiVzOiAlcyBzdGFsbFxuIiwgZXAtPm5hbWUsIHZhbHVlID8gInNldCIgOiAiY2xlYXIiKTsKQEAgLTEzMDEsNiArMTI5MywyMSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKKy8qCisgKiBTZXRzIHRoZSBoYWx0IGZlYXR1cmUgd2l0aCB0aGUgY2xlYXIgcmVxdWVzdHMgaWdub3JlZAorICovCitzdGF0aWMgaW50IG11c2JfZ2FkZ2V0X3NldF93ZWRnZShzdHJ1Y3QgdXNiX2VwICplcCkKK3sKKwlzdHJ1Y3QgbXVzYl9lcAkJKm11c2JfZXAgPSB0b19tdXNiX2VwKGVwKTsKKworCWlmICghZXApCisJCXJldHVybiAtRUlOVkFMOworCisJbXVzYl9lcC0+d2VkZ2VkID0gMTsKKworCXJldHVybiB1c2JfZXBfc2V0X2hhbHQoZXApOworfQorCiBzdGF0aWMgaW50IG11c2JfZ2FkZ2V0X2ZpZm9fc3RhdHVzKHN0cnVjdCB1c2JfZXAgKmVwKQogewogCXN0cnVjdCBtdXNiX2VwCQkqbXVzYl9lcCA9IHRvX211c2JfZXAoZXApOwpAQCAtMTM3MSw2ICsxMzc4LDcgQEAKIAkucXVldWUJCT0gbXVzYl9nYWRnZXRfcXVldWUsCiAJLmRlcXVldWUJPSBtdXNiX2dhZGdldF9kZXF1ZXVlLAogCS5zZXRfaGFsdAk9IG11c2JfZ2FkZ2V0X3NldF9oYWx0LAorCS5zZXRfd2VkZ2UJPSBtdXNiX2dhZGdldF9zZXRfd2VkZ2UsCiAJLmZpZm9fc3RhdHVzCT0gbXVzYl9nYWRnZXRfZmlmb19zdGF0dXMsCiAJLmZpZm9fZmx1c2gJPSBtdXNiX2dhZGdldF9maWZvX2ZsdXNoCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5oIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5oCmluZGV4IDU5NTAyZGEuLmM4YjE0MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXQuaAorKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmgKQEAgLTc1LDYgKzc1LDggQEAKIAkvKiBsYXRlciB0aGluZ3MgYXJlIG1vZGlmaWVkIGJhc2VkIG9uIHVzYWdlICovCiAJc3RydWN0IGxpc3RfaGVhZAkJcmVxX2xpc3Q7CiAKKwl1OAkJCQl3ZWRnZWQ7CisKIAkvKiB0cnVlIGlmIGxvY2sgbXVzdCBiZSBkcm9wcGVkIGJ1dCByZXFfbGlzdCBtYXkgbm90IGJlIGFkdmFuY2VkICovCiAJdTgJCQkJYnVzeTsKIH07CkBAIC0xMDMsNiArMTA1LDQgQEAKIAogZXh0ZXJuIHZvaWQgbXVzYl9nX2dpdmViYWNrKHN0cnVjdCBtdXNiX2VwICosIHN0cnVjdCB1c2JfcmVxdWVzdCAqLCBpbnQpOwogCi1leHRlcm4gaW50IG11c2JfZ2FkZ2V0X3NldF9oYWx0KHN0cnVjdCB1c2JfZXAgKmVwLCBpbnQgdmFsdWUpOwotCiAjZW5kaWYJCS8qIF9fTVVTQl9HQURHRVRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldF9lcDAuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXRfZXAwLmMKaW5kZXggNTIyZWZiMy4uOGZiYTNmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldF9lcDAuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0X2VwMC5jCkBAIC0xOTksNyArMTk5LDYgQEAKIHN0YXRpYyB2b2lkIG11c2JfZ19lcDBfZ2l2ZWJhY2soc3RydWN0IG11c2IgKm11c2IsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQogewogCW11c2JfZ19naXZlYmFjaygmbXVzYi0+ZW5kcG9pbnRzWzBdLmVwX2luLCByZXEsIDApOwotCW11c2ItPmVwMF9zdGF0ZSA9IE1VU0JfRVAwX1NUQUdFX1NFVFVQOwogfQogCiAvKgpAQCAtMjU4LDMwICsyNTcsNTMgQEAKIAkJCWNhc2UgVVNCX1JFQ0lQX0lOVEVSRkFDRToKIAkJCQlicmVhazsKIAkJCWNhc2UgVVNCX1JFQ0lQX0VORFBPSU5UOnsKLQkJCQljb25zdCB1OCBudW0gPSBjdHJscmVxdWVzdC0+d0luZGV4ICYgMHgwZjsKLQkJCQlzdHJ1Y3QgbXVzYl9lcCAqbXVzYl9lcDsKKwkJCQljb25zdCB1OAkJZXBudW0gPQorCQkJCQljdHJscmVxdWVzdC0+d0luZGV4ICYgMHgwZjsKKwkJCQlzdHJ1Y3QgbXVzYl9lcAkJKm11c2JfZXA7CisJCQkJc3RydWN0IG11c2JfaHdfZXAJKmVwOworCQkJCXZvaWQgX19pb21lbQkJKnJlZ3M7CisJCQkJaW50CQkJaXNfaW47CisJCQkJdTE2CQkJY3NyOwogCi0JCQkJaWYgKG51bSA9PSAwCi0JCQkJCQl8fCBudW0gPj0gTVVTQl9DX05VTV9FUFMKLQkJCQkJCXx8IGN0cmxyZXF1ZXN0LT53VmFsdWUKLQkJCQkJCQkhPSBVU0JfRU5EUE9JTlRfSEFMVCkKKwkJCQlpZiAoZXBudW0gPT0gMCB8fCBlcG51bSA+PSBNVVNCX0NfTlVNX0VQUyB8fAorCQkJCSAgICBjdHJscmVxdWVzdC0+d1ZhbHVlICE9IFVTQl9FTkRQT0lOVF9IQUxUKQogCQkJCQlicmVhazsKIAotCQkJCWlmIChjdHJscmVxdWVzdC0+d0luZGV4ICYgVVNCX0RJUl9JTikKLQkJCQkJbXVzYl9lcCA9ICZtdXNiLT5lbmRwb2ludHNbbnVtXS5lcF9pbjsKKwkJCQllcCA9IG11c2ItPmVuZHBvaW50cyArIGVwbnVtOworCQkJCXJlZ3MgPSBlcC0+cmVnczsKKwkJCQlpc19pbiA9IGN0cmxyZXF1ZXN0LT53SW5kZXggJiBVU0JfRElSX0lOOworCQkJCWlmIChpc19pbikKKwkJCQkJbXVzYl9lcCA9ICZlcC0+ZXBfaW47CiAJCQkJZWxzZQotCQkJCQltdXNiX2VwID0gJm11c2ItPmVuZHBvaW50c1tudW1dLmVwX291dDsKKwkJCQkJbXVzYl9lcCA9ICZlcC0+ZXBfb3V0OwogCQkJCWlmICghbXVzYl9lcC0+ZGVzYykKIAkJCQkJYnJlYWs7CiAKLQkJCQkvKiBSRVZJU0lUIGRvIGl0IGRpcmVjdGx5LCBubyBsb2NraW5nIGdhbWVzICovCi0JCQkJc3Bpbl91bmxvY2soJm11c2ItPmxvY2spOwotCQkJCW11c2JfZ2FkZ2V0X3NldF9oYWx0KCZtdXNiX2VwLT5lbmRfcG9pbnQsIDApOwotCQkJCXNwaW5fbG9jaygmbXVzYi0+bG9jayk7CisJCQkJaGFuZGxlZCA9IDE7CisJCQkJLyogSWdub3JlIHJlcXVlc3QgaWYgZW5kcG9pbnQgaXMgd2VkZ2VkICovCisJCQkJaWYgKG11c2JfZXAtPndlZGdlZCkKKwkJCQkJYnJlYWs7CisKKwkJCQltdXNiX2VwX3NlbGVjdChtYmFzZSwgZXBudW0pOworCQkJCWlmIChpc19pbikgeworCQkJCQljc3IgID0gbXVzYl9yZWFkdyhyZWdzLCBNVVNCX1RYQ1NSKTsKKwkJCQkJY3NyIHw9IE1VU0JfVFhDU1JfQ0xSREFUQVRPRyB8CisJCQkJCSAgICAgICBNVVNCX1RYQ1NSX1BfV1pDX0JJVFM7CisJCQkJCWNzciAmPSB+KE1VU0JfVFhDU1JfUF9TRU5EU1RBTEwgfAorCQkJCQkJIE1VU0JfVFhDU1JfUF9TRU5UU1RBTEwgfAorCQkJCQkJIE1VU0JfVFhDU1JfVFhQS1RSRFkpOworCQkJCQltdXNiX3dyaXRldyhyZWdzLCBNVVNCX1RYQ1NSLCBjc3IpOworCQkJCX0gZWxzZSB7CisJCQkJCWNzciAgPSBtdXNiX3JlYWR3KHJlZ3MsIE1VU0JfUlhDU1IpOworCQkJCQljc3IgfD0gTVVTQl9SWENTUl9DTFJEQVRBVE9HIHwKKwkJCQkJICAgICAgIE1VU0JfUlhDU1JfUF9XWkNfQklUUzsKKwkJCQkJY3NyICY9IH4oTVVTQl9SWENTUl9QX1NFTkRTVEFMTCB8CisJCQkJCQkgTVVTQl9SWENTUl9QX1NFTlRTVEFMTCk7CisJCQkJCW11c2Jfd3JpdGV3KHJlZ3MsIE1VU0JfUlhDU1IsIGNzcik7CisJCQkJfQogCiAJCQkJLyogc2VsZWN0IGVwMCBhZ2FpbiAqLwogCQkJCW11c2JfZXBfc2VsZWN0KG1iYXNlLCAwKTsKLQkJCQloYW5kbGVkID0gMTsKIAkJCQl9IGJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQkvKiBjbGFzcywgdmVuZG9yLCBldGMgLi4uIGRlbGVnYXRlICovCkBAIC0zNzQsMTAgKzM5Niw4IEBACiAJCQkJaW50CQkJaXNfaW47CiAJCQkJdTE2CQkJY3NyOwogCi0JCQkJaWYgKGVwbnVtID09IDAKLQkJCQkJCXx8IGVwbnVtID49IE1VU0JfQ19OVU1fRVBTCi0JCQkJCQl8fCBjdHJscmVxdWVzdC0+d1ZhbHVlCi0JCQkJCQkJIT0gVVNCX0VORFBPSU5UX0hBTFQpCisJCQkJaWYgKGVwbnVtID09IDAgfHwgZXBudW0gPj0gTVVTQl9DX05VTV9FUFMgfHwKKwkJCQkgICAgY3RybHJlcXVlc3QtPndWYWx1ZQkhPSBVU0JfRU5EUE9JTlRfSEFMVCkKIAkJCQkJYnJlYWs7CiAKIAkJCQllcCA9IG11c2ItPmVuZHBvaW50cyArIGVwbnVtOwpAQCAtMzkyLDI0ICs0MTIsMjAgQEAKIAogCQkJCW11c2JfZXBfc2VsZWN0KG1iYXNlLCBlcG51bSk7CiAJCQkJaWYgKGlzX2luKSB7Ci0JCQkJCWNzciA9IG11c2JfcmVhZHcocmVncywKLQkJCQkJCQlNVVNCX1RYQ1NSKTsKKwkJCQkJY3NyID0gbXVzYl9yZWFkdyhyZWdzLCBNVVNCX1RYQ1NSKTsKIAkJCQkJaWYgKGNzciAmIE1VU0JfVFhDU1JfRklGT05PVEVNUFRZKQogCQkJCQkJY3NyIHw9IE1VU0JfVFhDU1JfRkxVU0hGSUZPOwogCQkJCQljc3IgfD0gTVVTQl9UWENTUl9QX1NFTkRTVEFMTAogCQkJCQkJfCBNVVNCX1RYQ1NSX0NMUkRBVEFUT0cKIAkJCQkJCXwgTVVTQl9UWENTUl9QX1daQ19CSVRTOwotCQkJCQltdXNiX3dyaXRldyhyZWdzLCBNVVNCX1RYQ1NSLAotCQkJCQkJCWNzcik7CisJCQkJCW11c2Jfd3JpdGV3KHJlZ3MsIE1VU0JfVFhDU1IsIGNzcik7CiAJCQkJfSBlbHNlIHsKLQkJCQkJY3NyID0gbXVzYl9yZWFkdyhyZWdzLAotCQkJCQkJCU1VU0JfUlhDU1IpOworCQkJCQljc3IgPSBtdXNiX3JlYWR3KHJlZ3MsIE1VU0JfUlhDU1IpOwogCQkJCQljc3IgfD0gTVVTQl9SWENTUl9QX1NFTkRTVEFMTAogCQkJCQkJfCBNVVNCX1JYQ1NSX0ZMVVNIRklGTwogCQkJCQkJfCBNVVNCX1JYQ1NSX0NMUkRBVEFUT0cKIAkJCQkJCXwgTVVTQl9SWENTUl9QX1daQ19CSVRTOwotCQkJCQltdXNiX3dyaXRldyhyZWdzLCBNVVNCX1JYQ1NSLAotCQkJCQkJCWNzcik7CisJCQkJCW11c2Jfd3JpdGV3KHJlZ3MsIE1VU0JfUlhDU1IsIGNzcik7CiAJCQkJfQogCiAJCQkJLyogc2VsZWN0IGVwMCBhZ2FpbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3QuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMKaW5kZXggZTNhYjQwYS4uNzRjNGMzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3QuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5jCkBAIC0xNjQyLDE4ICsxNjQyLDE4IEBACiAJCQljID0gbXVzYi0+ZG1hX2NvbnRyb2xsZXI7CiAKIAkJCWlmICh1c2JfcGlwZWlzb2MocGlwZSkpIHsKLQkJCQlpbnQgc3RhdHVzID0gMDsKKwkJCQlpbnQgZF9zdGF0dXMgPSAwOwogCQkJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpkOwogCiAJCQkJZCA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2MgKyBxaC0+aXNvX2lkeDsKIAogCQkJCWlmIChpc29fZXJyKSB7Ci0JCQkJCXN0YXR1cyA9IC1FSUxTRVE7CisJCQkJCWRfc3RhdHVzID0gLUVJTFNFUTsKIAkJCQkJdXJiLT5lcnJvcl9jb3VudCsrOwogCQkJCX0KIAkJCQlpZiAocnhfY291bnQgPiBkLT5sZW5ndGgpIHsKLQkJCQkJaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCQkJCQlzdGF0dXMgPSAtRU9WRVJGTE9XOworCQkJCQlpZiAoZF9zdGF0dXMgPT0gMCkgeworCQkJCQkJZF9zdGF0dXMgPSAtRU9WRVJGTE9XOwogCQkJCQkJdXJiLT5lcnJvcl9jb3VudCsrOwogCQkJCQl9CiAJCQkJCURCRygyLCAiKiogT1ZFUkZMT1cgJWQgaW50byAlZFxuIixcCkBAIC0xNjYyLDcgKzE2NjIsNyBAQAogCQkJCQlsZW5ndGggPSBkLT5sZW5ndGg7CiAJCQkJfSBlbHNlCiAJCQkJCWxlbmd0aCA9IHJ4X2NvdW50OwotCQkJCWQtPnN0YXR1cyA9IHN0YXR1czsKKwkJCQlkLT5zdGF0dXMgPSBkX3N0YXR1czsKIAkJCQlidWYgPSB1cmItPnRyYW5zZmVyX2RtYSArIGQtPm9mZnNldDsKIAkJCX0gZWxzZSB7CiAJCQkJbGVuZ3RoID0gcnhfY291bnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfcmVncy5oIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX3JlZ3MuaAppbmRleCBjYzFkNzFiLi40NzNhOTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfcmVncy5oCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9yZWdzLmgKQEAgLTQ2NSw5ICs0NjUsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHUxNiBtdXNiX3JlYWRfdGFyZ2V0X3JlZ19iYXNlKHU4IGksIHZvaWQgX19pb21lbSAqbWJhc2UpCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqbXVzYl9yZWFkX3RhcmdldF9yZWdfYmFzZSh1OCBpLCB2b2lkIF9faW9tZW0gKm1iYXNlKQogewotCXJldHVybiAwOworCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZV9yeGZ1bmFkZHIodm9pZCBfX2lvbWVtICplcF90YXJnZXRfcmVncywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYmhzZG1hLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2Joc2RtYS5jCmluZGV4IDVlODNmOTYuLmEyMzc1NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYmhzZG1hLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiaHNkbWEuYwpAQCAtMjU5LDYgKzI1OSwxMSBAQAogCWlmICghaW50X2hzZG1hKQogCQlnb3RvIGRvbmU7CiAKKyNpZmRlZiBDT05GSUdfQkxBQ0tGSU4KKwkvKiBDbGVhciBETUEgaW50ZXJydXB0IGZsYWdzICovCisJbXVzYl93cml0ZWIobWJhc2UsIE1VU0JfSFNETUFfSU5UUiwgaW50X2hzZG1hKTsKKyNlbmRpZgorCiAJZm9yIChiY2hhbm5lbCA9IDA7IGJjaGFubmVsIDwgTVVTQl9IU0RNQV9DSEFOTkVMUzsgYmNoYW5uZWwrKykgewogCQlpZiAoaW50X2hzZG1hICYgKDEgPDwgYmNoYW5uZWwpKSB7CiAJCQltdXNiX2NoYW5uZWwgPSAoc3RydWN0IG11c2JfZG1hX2NoYW5uZWwgKikKQEAgLTI4MCw3ICsyODUsNyBAQAogCQkJCWNoYW5uZWwtPmFjdHVhbF9sZW4gPSBhZGRyCiAJCQkJCS0gbXVzYl9jaGFubmVsLT5zdGFydF9hZGRyOwogCi0JCQkJREJHKDIsICJjaCAlcCwgMHgleCAtPiAweCV4ICglZCAvICVkKSAlc1xuIiwKKwkJCQlEQkcoMiwgImNoICVwLCAweCV4IC0+IDB4JXggKCV6dSAvICVkKSAlc1xuIiwKIAkJCQkJY2hhbm5lbCwgbXVzYl9jaGFubmVsLT5zdGFydF9hZGRyLAogCQkJCQlhZGRyLCBjaGFubmVsLT5hY3R1YWxfbGVuLAogCQkJCQltdXNiX2NoYW5uZWwtPmxlbiwKQEAgLTMyNCwxMSArMzI5LDYgQEAKIAkJfQogCX0KIAotI2lmZGVmIENPTkZJR19CTEFDS0ZJTgotCS8qIENsZWFyIERNQSBpbnRlcnJ1cCBmbGFncyAqLwotCW11c2Jfd3JpdGViKG1iYXNlLCBNVVNCX0hTRE1BX0lOVFIsIGludF9oc2RtYSk7Ci0jZW5kaWYKLQogCXJldHZhbCA9IElSUV9IQU5ETEVEOwogZG9uZToKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdXNiLT5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmMgYi9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmMKaW5kZXggNjc2MWQyMC4uODNiZWVhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9vbWFwMjQzMC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2Ivb21hcDI0MzAuYwpAQCAtMzE1LDcgKzMxNSw3IEBACiAJbXVzYl9wbGF0Zm9ybV9zdXNwZW5kKG11c2IpOwogCiAJY2xrX3B1dChtdXNiLT5jbG9jayk7Ci0JbXVzYi0+Y2xvY2sgPSAwOworCW11c2ItPmNsb2NrID0gTlVMTDsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivb3RnL0tjb25maWcgYi9kcml2ZXJzL3VzYi9vdGcvS2NvbmZpZwppbmRleCBhYTg4NGQwLi5kZTU2YjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9vdGcvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9vdGcvS2NvbmZpZwpAQCAtNDEsNiArNDEsMTUgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGlzcDEzMDFfb21hcC4KIAorY29uZmlnIFVTQl9VTFBJCisJYm9vbCAiR2VuZXJpYyBVTFBJIFRyYW5zY2VpdmVyIERyaXZlciIKKwlkZXBlbmRzIG9uIEFSTQorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgVUxQSSBjb25uZWN0ZWQgVVNCIE9URyB0cmFuc2NlaXZlcnMgd2hpY2gKKwkgIGFyZSBsaWtlbHkgZm91bmQgb24gZW1iZWRkZWQgYm9hcmRzLgorCisJICBUaGUgb25seSBjaGlwIGN1cnJlbnRseSBzdXBwb3J0ZWQgaXMgTlhQJ3MgSVNQMTUwNAorCiBjb25maWcgVFdMNDAzMF9VU0IKIAl0cmlzdGF0ZSAiVFdMNDAzMCBVU0IgVHJhbnNjZWl2ZXIgRHJpdmVyIgogCWRlcGVuZHMgb24gVFdMNDAzMF9DT1JFICYmIFJFR1VMQVRPUl9UV0w0MDMwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9vdGcvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9vdGcvTWFrZWZpbGUKaW5kZXggMjA4MTY3OC4uYWViNDlhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivb3RnL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL290Zy9NYWtlZmlsZQpAQCAtMTAsNiArMTAsNyBAQAogb2JqLSQoQ09ORklHX0lTUDEzMDFfT01BUCkJKz0gaXNwMTMwMV9vbWFwLm8KIG9iai0kKENPTkZJR19UV0w0MDMwX1VTQikJKz0gdHdsNDAzMC11c2Iubwogb2JqLSQoQ09ORklHX05PUF9VU0JfWENFSVYpCSs9IG5vcC11c2IteGNlaXYubworb2JqLSQoQ09ORklHX1VTQl9VTFBJKQkJKz0gdWxwaS5vCiAKIGNjZmxhZ3MtJChDT05GSUdfVVNCX0RFQlVHKQkrPSAtRERFQlVHCiBjY2ZsYWdzLSQoQ09ORklHX1VTQl9HQURHRVRfREVCVUcpICs9IC1EREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL290Zy90d2w0MDMwLXVzYi5jIGIvZHJpdmVycy91c2Ivb3RnL3R3bDQwMzAtdXNiLmMKaW5kZXggOWUzZTdhNS4uYmQ5ODgzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivb3RnL3R3bDQwMzAtdXNiLmMKKysrIGIvZHJpdmVycy91c2Ivb3RnL3R3bDQwMzAtdXNiLmMKQEAgLTU5OCwxMiArNTk4LDEyIEBACiAJCSAqIFVTQl9MSU5LX1ZCVVMgc3RhdGUuICBtdXNiX2hkcmMgd29uJ3QgY2FyZSB1bnRpbCBpdAogCQkgKiBzdGFydHMgdG8gaGFuZGxlIHNvZnRjb25uZWN0IHJpZ2h0LgogCQkgKi8KLQkJdHdsNDAzMGNoYXJnZXJfdXNiX2VuKHN0YXR1cyA9PSBVU0JfTElOS19WQlVTKTsKLQogCQlpZiAoc3RhdHVzID09IFVTQl9MSU5LX05PTkUpCiAJCQl0d2w0MDMwX3BoeV9zdXNwZW5kKHR3bCwgMCk7CiAJCWVsc2UKIAkJCXR3bDQwMzBfcGh5X3Jlc3VtZSh0d2wpOworCisJCXR3bDQwMzBjaGFyZ2VyX3VzYl9lbihzdGF0dXMgPT0gVVNCX0xJTktfVkJVUyk7CiAJfQogCXN5c2ZzX25vdGlmeSgmdHdsLT5kZXYtPmtvYmosIE5VTEwsICJ2YnVzIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL290Zy91bHBpLmMgYi9kcml2ZXJzL3VzYi9vdGcvdWxwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NjUyNzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9vdGcvdWxwaS5jCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogR2VuZXJpYyBVTFBJIFVTQiB0cmFuc2NlaXZlciBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IERhbmllbCBNYWNrIDxkYW5pZWxAY2FpYXEuZGU+CisgKgorICogQmFzZWQgb24gc291cmNlcyBmcm9tCisgKgorICogICBTYXNjaGEgSGF1ZXIgPHMuaGF1ZXJAcGVuZ3V0cm9uaXguZGU+CisgKiAgIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9ycworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91c2Ivb3RnLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL3VscGkuaD4KKworLyogVUxQSSByZWdpc3RlciBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgVUxQSV9WSURfTE9XICAgICAgICAgMHgwMCAgICAvKiBWZW5kb3IgSUQgbG93ICovCisjZGVmaW5lIFVMUElfVklEX0hJR0ggICAgICAgIDB4MDEgICAgLyogVmVuZG9yIElEIGhpZ2ggKi8KKyNkZWZpbmUgVUxQSV9QSURfTE9XICAgICAgICAgMHgwMiAgICAvKiBQcm9kdWN0IElEIGxvdyAqLworI2RlZmluZSBVTFBJX1BJRF9ISUdIICAgICAgICAweDAzICAgIC8qIFByb2R1Y3QgSUQgaGlnaCAqLworI2RlZmluZSBVTFBJX0lURkNUTCAgICAgICAgICAweDA3ICAgIC8qIEludGVyZmFjZSBDb250cm9sICovCisjZGVmaW5lIFVMUElfT1RHQ1RMICAgICAgICAgIDB4MEEgICAgLyogT1RHIENvbnRyb2wgKi8KKworLyogYWRkIHRvIGFib3ZlIHJlZ2lzdGVyIGFkZHJlc3MgdG8gYWNjZXNzIFNldC9DbGVhciBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgVUxQSV9SRUdfU0VUICAgICAgICAgMHgwMQorI2RlZmluZSBVTFBJX1JFR19DTEVBUiAgICAgICAweDAyCisKKy8qIFVMUEkgT1RHIENvbnRyb2wgUmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBJRF9QVUxMX1VQICAgICAgICAgICAgICAoMSA8PCAwKSAgICAgICAgLyogZW5hYmxlIElEIFB1bGwgVXAgKi8KKyNkZWZpbmUgRFBfUFVMTF9ET1dOICAgICAgICAgICAgKDEgPDwgMSkgICAgICAgIC8qIGVuYWJsZSBEUCBQdWxsIERvd24gKi8KKyNkZWZpbmUgRE1fUFVMTF9ET1dOICAgICAgICAgICAgKDEgPDwgMikgICAgICAgIC8qIGVuYWJsZSBETSBQdWxsIERvd24gKi8KKyNkZWZpbmUgRElTQ0hSR19WQlVTICAgICAgICAgICAgKDEgPDwgMykgICAgICAgIC8qIERpc2NoYXJnZSBWYnVzICovCisjZGVmaW5lIENIUkdfVkJVUyAgICAgICAgICAgICAgICgxIDw8IDQpICAgICAgICAvKiBDaGFyZ2UgVmJ1cyAqLworI2RlZmluZSBEUlZfVkJVUyAgICAgICAgICAgICAgICAoMSA8PCA1KSAgICAgICAgLyogRHJpdmUgVmJ1cyAqLworI2RlZmluZSBEUlZfVkJVU19FWFQgICAgICAgICAgICAoMSA8PCA2KSAgICAgICAgLyogRHJpdmUgVmJ1cyBleHRlcm5hbCAqLworI2RlZmluZSBVU0VfRVhUX1ZCVVNfSU5EICAgICAgICAoMSA8PCA3KSAgICAgICAgLyogVXNlIGV4dC4gVmJ1cyBpbmRpY2F0b3IgKi8KKworI2RlZmluZSBVTFBJX0lEKHZlbmRvciwgcHJvZHVjdCkgKCgodmVuZG9yKSA8PCAxNikgfCAocHJvZHVjdCkpCisKKyNkZWZpbmUgVFJfRkxBRyhmbGFncywgYSwgYikJKCgoZmxhZ3MpICYgYSkgPyBiIDogMCkKKworLyogVUxQSSBoYXJkY29kZWQgSURzLCB1c2VkIGZvciBwcm9iaW5nICovCitzdGF0aWMgdW5zaWduZWQgaW50IHVscGlfaWRzW10gPSB7CisJVUxQSV9JRCgweDA0Y2MsIDB4MTUwNCksCS8qIE5YUCBJU1AxNTA0ICovCit9OworCitzdGF0aWMgaW50IHVscGlfc2V0X2ZsYWdzKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90ZykKK3sKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOworCisJaWYgKG90Zy0+ZmxhZ3MgJiBVU0JfT1RHX1BVTExVUF9JRCkKKwkJZmxhZ3MgfD0gSURfUFVMTF9VUDsKKworCWlmIChvdGctPmZsYWdzICYgVVNCX09UR19QVUxMRE9XTl9ETSkKKwkJZmxhZ3MgfD0gRE1fUFVMTF9ET1dOOworCisJaWYgKG90Zy0+ZmxhZ3MgJiBVU0JfT1RHX1BVTExET1dOX0RQKQorCQlmbGFncyB8PSBEUF9QVUxMX0RPV047CisKKwlpZiAob3RnLT5mbGFncyAmIFVTQl9PVEdfRVhUX1ZCVVNfSU5ESUNBVE9SKQorCQlmbGFncyB8PSBVU0VfRVhUX1ZCVVNfSU5EOworCisJcmV0dXJuIG90Z19pb193cml0ZShvdGcsIGZsYWdzLCBVTFBJX09UR0NUTCArIFVMUElfUkVHX1NFVCk7Cit9CisKK3N0YXRpYyBpbnQgdWxwaV9pbml0KHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90ZykKK3sKKwlpbnQgaSwgdmlkLCBwaWQ7CisKKwl2aWQgPSAob3RnX2lvX3JlYWQob3RnLCBVTFBJX1ZJRF9ISUdIKSA8PCA4KSB8CisJICAgICAgIG90Z19pb19yZWFkKG90ZywgVUxQSV9WSURfTE9XKTsKKwlwaWQgPSAob3RnX2lvX3JlYWQob3RnLCBVTFBJX1BJRF9ISUdIKSA8PCA4KSB8CisJICAgICAgIG90Z19pb19yZWFkKG90ZywgVUxQSV9QSURfTE9XKTsKKworCXByX2luZm8oIlVMUEkgdHJhbnNjZWl2ZXIgdmVuZG9yL3Byb2R1Y3QgSUQgMHglMDR4LzB4JTA0eFxuIiwgdmlkLCBwaWQpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodWxwaV9pZHMpOyBpKyspCisJCWlmICh1bHBpX2lkc1tpXSA9PSBVTFBJX0lEKHZpZCwgcGlkKSkKKwkJCXJldHVybiB1bHBpX3NldF9mbGFncyhvdGcpOworCisJcHJfZXJyKCJVTFBJIElEIGRvZXMgbm90IG1hdGNoIGFueSBrbm93biB0cmFuc2NlaXZlci5cbiIpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IHVscGlfc2V0X3ZidXMoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnLCBib29sIG9uKQoreworCXVuc2lnbmVkIGludCBmbGFncyA9IG90Z19pb19yZWFkKG90ZywgVUxQSV9PVEdDVEwpOworCisJZmxhZ3MgJj0gfihEUlZfVkJVUyB8IERSVl9WQlVTX0VYVCk7CisKKwlpZiAob24pIHsKKwkJaWYgKG90Zy0+ZmxhZ3MgJiBVU0JfT1RHX0RSVl9WQlVTKQorCQkJZmxhZ3MgfD0gRFJWX1ZCVVM7CisKKwkJaWYgKG90Zy0+ZmxhZ3MgJiBVU0JfT1RHX0RSVl9WQlVTX0VYVCkKKwkJCWZsYWdzIHw9IERSVl9WQlVTX0VYVDsKKwl9CisKKwlyZXR1cm4gb3RnX2lvX3dyaXRlKG90ZywgZmxhZ3MsIFVMUElfT1RHQ1RMICsgVUxQSV9SRUdfU0VUKTsKK30KKworc3RydWN0IG90Z190cmFuc2NlaXZlciAqCitvdGdfdWxwaV9jcmVhdGUoc3RydWN0IG90Z19pb19hY2Nlc3Nfb3BzICpvcHMsCisJCXVuc2lnbmVkIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICpvdGc7CisKKwlvdGcgPSBremFsbG9jKHNpemVvZigqb3RnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvdGcpCisJCXJldHVybiBOVUxMOworCisJb3RnLT5sYWJlbAk9ICJVTFBJIjsKKwlvdGctPmZsYWdzCT0gZmxhZ3M7CisJb3RnLT5pb19vcHMJPSBvcHM7CisJb3RnLT5pbml0CT0gdWxwaV9pbml0OworCW90Zy0+c2V0X3ZidXMJPSB1bHBpX3NldF92YnVzOworCisJcmV0dXJuIG90ZzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG90Z191bHBpX2NyZWF0ZSk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9hcmszMTE2LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYXJrMzExNi5jCmluZGV4IDEzMWU2MWEuLmE5YzJkZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9hcmszMTE2LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2FyazMxMTYuYwpAQCAtMSw0ICsxLDYgQEAKIC8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgYnkgQmFydCBIYXJ0Z2VycyAoYmFydC5oYXJ0Z2VycythcmszMTE2QGdtYWlsLmNvbSkKKyAqIE9yaWdpbmFsIHZlcnNpb246CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYKICAqICAgU2ltb24gU2NodWx6IChhcmszMTE2X2RyaXZlciA8YXQ+IGF1Y3Rpb25hbnQuZGUpCiAgKgpAQCAtNiwxMCArOCwxMyBAQAogICogLSBpbXBsZW1lbnRzIGEgZHJpdmVyIGZvciB0aGUgYXJrbWljcm8gYXJrMzExNiBjaGlwc2V0ICh2ZW5kb3I9MHg2NTQ3LAogICogICBwcm9kdWN0aWQ9MHgwMjMyKSAodXNlZCBpbiBhIGRhdGFjYWJsZSBjYWxsZWQgS1EtVThBKQogICoKLSAqIC0gYmFzZWQgb24gY29kZSBieSBrcmlzZnggLT4gdGhhbmtzICEhCi0gKiAgIChzZWUgaHR0cDovL3d3dy5saW51eHF1ZXN0aW9ucy5vcmcvcXVlc3Rpb25zL3Nob3d0aHJlYWQucGhwP3A9MjE4NDQ1NyNwb3N0MjE4NDQ1NykKKyAqIFN1cHBvcnRzIGZ1bGwgbW9kZW0gc3RhdHVzIGxpbmVzLCBicmVhaywgaGFyZHdhcmUgZmxvdyBjb250cm9sLiBEb2VzIG5vdAorICogc3VwcG9ydCBzb2Z0d2FyZSBmbG93IGNvbnRyb2wsIHNpbmNlIEkgZG8gbm90IGtub3cgaG93IHRvIGVuYWJsZSBpdCBpbiBody4KICAqCi0gKiAgLSBiYXNlZCBvbiBsb2dzIGNyZWF0ZWQgYnkgdXNic25vb3B5CisgKiBUaGlzIGRyaXZlciBpcyBhIGVzc2VudGlhbGx5IG5ldyBpbXBsZW1lbnRhdGlvbi4gSSBpbml0aWFsbHkgZHVnCisgKiBpbnRvIHRoZSBvbGQgYXJrMzExNi5jIGRyaXZlciBhbmQgc3VkZGVubHkgcmVhbGl6ZWQgdGhlIGFyazMxMTYgaXMKKyAqIGEgMTY0NTAgd2l0aCBhIFVTQiBpbnRlcmZhY2UgZ2x1ZWQgdG8gaXQuIFNlZSBjb21tZW50cyBhdCB0aGUKKyAqIGJvdHRvbSBvZiB0aGlzIGZpbGUuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQpAQCAtMTksMTUgKzI0LDMxIEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotCisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiBzdGF0aWMgaW50IGRlYnVnOworLyoKKyAqIFZlcnNpb24gaW5mb3JtYXRpb24KKyAqLworCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MC41IgorI2RlZmluZSBEUklWRVJfQVVUSE9SICJCYXJ0IEhhcnRnZXJzIDxiYXJ0LmhhcnRnZXJzK2FyazMxMTZAZ21haWwuY29tPiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiBBUkszMTE2IHNlcmlhbC9JckRBIGRyaXZlciIKKyNkZWZpbmUgRFJJVkVSX0RFVl9ERVNDICJBUkszMTE2IFJTMjMyL0lyREEiCisjZGVmaW5lIERSSVZFUl9OQU1FICJhcmszMTE2IgorCisvKiB1c2IgdGltZW91dCBvZiAxIHNlY29uZCAqLworI2RlZmluZSBBUktfVElNRU9VVCAoMSpIWikKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlIFtdID0gewogCXsgVVNCX0RFVklDRSgweDY1NDcsIDB4MDIzMikgfSwKQEAgLTQ1LDExOCArNjYsMTUyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBBUkszMTE2X1NORChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLCBpbnQgc2VxLAotCQkJICAgICAgIF9fdTggcmVxdWVzdCwgX191OCByZXF1ZXN0dHlwZSwKLQkJCSAgICAgICBfX3UxNiB2YWx1ZSwgX191MTYgaW5kZXgpCitzdHJ1Y3QgYXJrMzExNl9wcml2YXRlIHsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgICBkZWx0YV9tc3Jfd2FpdDsKKwlzdHJ1Y3QgYXN5bmNfaWNvdW50CWljb3VudDsKKwlpbnQJCQlpcmRhOwkvKiAxIGZvciBpcmRhIGRldmljZSAqLworCisJLyogcHJvdGVjdHMgaHcgcmVnaXN0ZXIgdXBkYXRlcyAqLworCXN0cnVjdCBtdXRleAkJaHdfbG9jazsKKworCWludAkJCXF1b3Q7CS8qIGJhdWRyYXRlIGRpdmlzb3IgKi8KKwlfX3UzMgkJCWxjcjsJLyogbGluZSBjb250cm9sIHJlZ2lzdGVyIHZhbHVlICovCisJX191MzIJCQloY3I7CS8qIGhhbmRzaGFrZSBjb250cm9sIHJlZ2lzdGVyICgweDgpCisJCQkJCSAqIHZhbHVlICovCisJX191MzIJCQltY3I7CS8qIG1vZGVtIGNvbnRvbCByZWdpc3RlciB2YWx1ZSAqLworCisJLyogcHJvdGVjdHMgdGhlIHN0YXR1cyB2YWx1ZXMgYmVsb3cgKi8KKwlzcGlubG9ja190CQlzdGF0dXNfbG9jazsKKwlfX3UzMgkJCW1zcjsJLyogbW9kZW0gc3RhdHVzIHJlZ2lzdGVyIHZhbHVlICovCisJX191MzIJCQlsc3I7CS8qIGxpbmUgc3RhdHVzIHJlZ2lzdGVyIHZhbHVlICovCit9OworCitzdGF0aWMgaW50IGFyazMxMTZfd3JpdGVfcmVnKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsCisJCQkgICAgIHVuc2lnbmVkIHJlZywgX191OCB2YWwpCiB7CiAJaW50IHJlc3VsdDsKKwkgLyogMHhmZSAweDQwIGFyZSBtYWdpYyB2YWx1ZXMgdGFrZW4gZnJvbSBvcmlnaW5hbCBkcml2ZXIgKi8KIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coc2VyaWFsLT5kZXYsCiAJCQkJIHVzYl9zbmRjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCi0JCQkJIHJlcXVlc3QsIHJlcXVlc3R0eXBlLCB2YWx1ZSwgaW5kZXgsCi0JCQkJIE5VTEwsIDB4MDAsIDEwMDApOwotCWRiZygiJTAzZCA+IG9rIiwgc2VxKTsKKwkJCQkgMHhmZSwgMHg0MCwgdmFsLCByZWcsCisJCQkJIE5VTEwsIDAsIEFSS19USU1FT1VUKTsKKwlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgQVJLMzExNl9SQ1Yoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwgaW50IHNlcSwKLQkJCSAgICAgICBfX3U4IHJlcXVlc3QsIF9fdTggcmVxdWVzdHR5cGUsCi0JCQkgICAgICAgX191MTYgdmFsdWUsIF9fdTE2IGluZGV4LCBfX3U4IGV4cGVjdGVkLAotCQkJICAgICAgIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgYXJrMzExNl9yZWFkX3JlZyhzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLAorCQkJICAgIHVuc2lnbmVkIHJlZywgdW5zaWduZWQgY2hhciAqYnVmKQogewogCWludCByZXN1bHQ7CisJLyogMHhmZSAweGMwIGFyZSBtYWdpYyB2YWx1ZXMgdGFrZW4gZnJvbSBvcmlnaW5hbCBkcml2ZXIgKi8KIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coc2VyaWFsLT5kZXYsCiAJCQkJIHVzYl9yY3ZjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCi0JCQkJIHJlcXVlc3QsIHJlcXVlc3R0eXBlLCB2YWx1ZSwgaW5kZXgsCi0JCQkJIGJ1ZiwgMHgwMDAwMDAxLCAxMDAwKTsKLQlpZiAocmVzdWx0KQotCQlkYmcoIiUwM2QgPCAlZCBieXRlcyBbMHglMDJYXSIsIHNlcSwgcmVzdWx0LAotCQkgICAgKCh1bnNpZ25lZCBjaGFyICopYnVmKVswXSk7CisJCQkJIDB4ZmUsIDB4YzAsIDAsIHJlZywKKwkJCQkgYnVmLCAxLCBBUktfVElNRU9VVCk7CisJaWYgKHJlc3VsdCA8IDApCisJCXJldHVybiByZXN1bHQ7CiAJZWxzZQotCQlkYmcoIiUwM2QgPCAwIGJ5dGVzIiwgc2VxKTsKKwkJcmV0dXJuIGJ1ZlswXTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIEFSSzMxMTZfUkNWX1FVSUVUKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsCi0JCQkJICAgICBfX3U4IHJlcXVlc3QsIF9fdTggcmVxdWVzdHR5cGUsCi0JCQkJICAgICBfX3UxNiB2YWx1ZSwgX191MTYgaW5kZXgsIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbmxpbmUgaW50IGNhbGNfZGl2aXNvcihpbnQgYnBzKQogewotCXVzYl9jb250cm9sX21zZyhzZXJpYWwtPmRldiwKLQkJCXVzYl9yY3ZjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCi0JCQlyZXF1ZXN0LCByZXF1ZXN0dHlwZSwgdmFsdWUsIGluZGV4LAotCQkJYnVmLCAweDAwMDAwMDEsIDEwMDApOworCS8qIE9yaWdpbmFsIGFyazMxMTYgbWFkZSBzb21lIGV4Y2VwdGlvbnMgaW4gcm91bmRpbmcgaGVyZQorCSAqIGJlY2F1c2Ugd2luZG93cyBkaWQgdGhlIHNhbWUuIEFzc3VtZSB0aGF0IGlzIG5vdCByZWFsbHkKKwkgKiBuZWNlc3NhcnkuCisJICogQ3J5c3RhbCBpcyAxMk1IeiwgcHJvYmFibHkgYmVjYXVzZSBvZiBVU0IsIGJ1dCB3ZSBkaXZpZGUgYnkgND8KKwkgKi8KKwlyZXR1cm4gKDEyMDAwMDAwICsgMipicHMpIC8gKDQqYnBzKTsKIH0KIAogc3RhdGljIGludCBhcmszMTE2X2F0dGFjaChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQogewotCWNoYXIgKmJ1ZjsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gc2VyaWFsLT5wb3J0WzBdOworCXN0cnVjdCBhcmszMTE2X3ByaXZhdGUgKnByaXY7CiAKLQlidWYgPSBrbWFsbG9jKDEsIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCWRiZygiZXJyb3Iga21hbGxvYyAtPiBvdXQgb2YgbWVtPyIpOworCS8qIG1ha2Ugc3VyZSB3ZSBoYXZlIG91ciBlbmQtcG9pbnRzICovCisJaWYgKChzZXJpYWwtPm51bV9idWxrX2luID09IDApIHx8CisJICAgIChzZXJpYWwtPm51bV9idWxrX291dCA9PSAwKSB8fAorCSAgICAoc2VyaWFsLT5udW1faW50ZXJydXB0X2luID09IDApKSB7CisJCWRldl9lcnIoJnNlcmlhbC0+ZGV2LT5kZXYsCisJCQkiJXMgLSBtaXNzaW5nIGVuZHBvaW50IC0gIgorCQkJImJ1bGsgaW46ICVkLCBidWxrIG91dDogJWQsIGludCBpbiAlZFxuIiwKKwkJCUtCVUlMRF9NT0ROQU1FLAorCQkJc2VyaWFsLT5udW1fYnVsa19pbiwKKwkJCXNlcmlhbC0+bnVtX2J1bGtfb3V0LAorCQkJc2VyaWFsLT5udW1faW50ZXJydXB0X2luKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhcmszMTE2X3ByaXZhdGUpLAorCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPmRlbHRhX21zcl93YWl0KTsKKwltdXRleF9pbml0KCZwcml2LT5od19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+c3RhdHVzX2xvY2spOworCisJcHJpdi0+aXJkYSA9IGlzX2lyZGEoc2VyaWFsKTsKKworCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0LCBwcml2KTsKKworCS8qIHNldHVwIHRoZSBoYXJkd2FyZSAqLworCWFyazMxMTZfd3JpdGVfcmVnKHNlcmlhbCwgVUFSVF9JRVIsIDApOworCS8qIGRpc2FibGUgRE1BICovCisJYXJrMzExNl93cml0ZV9yZWcoc2VyaWFsLCBVQVJUX0ZDUiwgMCk7CisJLyogaGFuZHNoYWtlIGNvbnRyb2wgKi8KKwlwcml2LT5oY3IgPSAwOworCWFyazMxMTZfd3JpdGVfcmVnKHNlcmlhbCwgMHg4ICAgICAsIDApOworCS8qIG1vZGVtIGNvbnRyb2wgKi8KKwlwcml2LT5tY3IgPSAwOworCWFyazMxMTZfd3JpdGVfcmVnKHNlcmlhbCwgVUFSVF9NQ1IsIDApOworCisJaWYgKCEocHJpdi0+aXJkYSkpIHsKKwkJYXJrMzExNl93cml0ZV9yZWcoc2VyaWFsLCAweGIgLCAwKTsKKwl9IGVsc2UgeworCQlhcmszMTE2X3dyaXRlX3JlZyhzZXJpYWwsIDB4YiAsIDEpOworCQlhcmszMTE2X3dyaXRlX3JlZyhzZXJpYWwsIDB4YyAsIDApOworCQlhcmszMTE2X3dyaXRlX3JlZyhzZXJpYWwsIDB4ZCAsIDB4NDEpOworCQlhcmszMTE2X3dyaXRlX3JlZyhzZXJpYWwsIDB4YSAsIDEpOwogCX0KIAotCWlmIChpc19pcmRhKHNlcmlhbCkpCi0JCWRiZygiSXJEQSBtb2RlIik7CisJLyogc2V0dXAgYmF1ZHJhdGUgKi8KKwlhcmszMTE2X3dyaXRlX3JlZyhzZXJpYWwsIFVBUlRfTENSLCBVQVJUX0xDUl9ETEFCKTsKIAotCS8qIDMgKi8KLQlBUkszMTE2X1NORChzZXJpYWwsIDMsIDB4RkUsIDB4NDAsIDB4MDAwOCwgMHgwMDAyKTsKLQlBUkszMTE2X1NORChzZXJpYWwsIDQsIDB4RkUsIDB4NDAsIDB4MDAwOCwgMHgwMDAxKTsKLQlBUkszMTE2X1NORChzZXJpYWwsIDUsIDB4RkUsIDB4NDAsIDB4MDAwMCwgMHgwMDA4KTsKLQlBUkszMTE2X1NORChzZXJpYWwsIDYsIDB4RkUsIDB4NDAsIGlzX2lyZGEoc2VyaWFsKSA/IDB4MDAwMSA6IDB4MDAwMCwKLQkJICAgIDB4MDAwQik7CisJLyogc2V0dXAgZm9yIDk2MDAgOE4xICovCisJcHJpdi0+cXVvdCA9IGNhbGNfZGl2aXNvcig5NjAwKTsKKwlhcmszMTE2X3dyaXRlX3JlZyhzZXJpYWwsIFVBUlRfRExMLCBwcml2LT5xdW90ICYgMHhmZik7CisJYXJrMzExNl93cml0ZV9yZWcoc2VyaWFsLCBVQVJUX0RMTSwgKHByaXYtPnF1b3Q+PjgpICYgMHhmZik7CiAKLQlpZiAoaXNfaXJkYShzZXJpYWwpKSB7Ci0JCUFSSzMxMTZfU05EKHNlcmlhbCwgMTAwMSwgMHhGRSwgMHg0MCwgMHgwMDAwLCAweDAwMEMpOwotCQlBUkszMTE2X1NORChzZXJpYWwsIDEwMDIsIDB4RkUsIDB4NDAsIDB4MDA0MSwgMHgwMDBEKTsKLQkJQVJLMzExNl9TTkQoc2VyaWFsLCAxMDAzLCAweEZFLCAweDQwLCAweDAwMDEsIDB4MDAwQSk7Ci0JfQorCXByaXYtPmxjciA9IFVBUlRfTENSX1dMRU44OworCWFyazMxMTZfd3JpdGVfcmVnKHNlcmlhbCwgVUFSVF9MQ1IsIFVBUlRfTENSX1dMRU44KTsKIAotCS8qIDwtLSBzZXE3ICovCi0JQVJLMzExNl9SQ1Yoc2VyaWFsLCAgNywgMHhGRSwgMHhDMCwgMHgwMDAwLCAweDAwMDMsIDB4MDAsIGJ1Zik7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLCAgOCwgMHhGRSwgMHg0MCwgMHgwMDgwLCAweDAwMDMpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwgIDksIDB4RkUsIDB4NDAsIDB4MDAxQSwgMHgwMDAwKTsKLQlBUkszMTE2X1NORChzZXJpYWwsIDEwLCAweEZFLCAweDQwLCAweDAwMDAsIDB4MDAwMSk7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLCAxMSwgMHhGRSwgMHg0MCwgMHgwMDAwLCAweDAwMDMpOworCWFyazMxMTZfd3JpdGVfcmVnKHNlcmlhbCwgMHhlLCAwKTsKIAotCS8qIDwtLSBzZXExMiAqLwotCUFSSzMxMTZfUkNWKHNlcmlhbCwgMTIsIDB4RkUsIDB4QzAsIDB4MDAwMCwgMHgwMDA0LCAweDAwLCBidWYpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwgMTMsIDB4RkUsIDB4NDAsIDB4MDAwMCwgMHgwMDA0KTsKKwlpZiAocHJpdi0+aXJkYSkKKwkJYXJrMzExNl93cml0ZV9yZWcoc2VyaWFsLCAweDksIDApOwogCi0JLyogMTQgKi8KLQlBUkszMTE2X1JDVihzZXJpYWwsIDE0LCAweEZFLCAweEMwLCAweDAwMDAsIDB4MDAwNCwgMHgwMCwgYnVmKTsKLQlBUkszMTE2X1NORChzZXJpYWwsIDE1LCAweEZFLCAweDQwLCAweDAwMDAsIDB4MDAwNCk7Ci0KLQkvKiAxNiAqLwotCUFSSzMxMTZfUkNWKHNlcmlhbCwgMTYsIDB4RkUsIDB4QzAsIDB4MDAwMCwgMHgwMDA0LCAweDAwLCBidWYpOwotCS8qIC0tPiBzZXExNyAqLwotCUFSSzMxMTZfU05EKHNlcmlhbCwgMTcsIDB4RkUsIDB4NDAsIDB4MDAwMSwgMHgwMDA0KTsKLQotCS8qIDwtLSBzZXExOCAqLwotCUFSSzMxMTZfUkNWKHNlcmlhbCwgMTgsIDB4RkUsIDB4QzAsIDB4MDAwMCwgMHgwMDA0LCAweDAxLCBidWYpOwotCi0JLyogLS0+IHNlcTE5ICovCi0JQVJLMzExNl9TTkQoc2VyaWFsLCAxOSwgMHhGRSwgMHg0MCwgMHgwMDAzLCAweDAwMDQpOwotCi0JLyogPC0tIHNlcTIwICovCi0JLyogc2VlbXMgbGlrZSBzZXJpYWwgcG9ydCBzdGF0dXMgaW5mbyAoUlRTLCBDVFMsIC4uLikgKi8KLQkvKiByZXR1cm5zIG1vZGVtIGNvbnRyb2wgbGluZSBzdGF0dXM/ISAqLwotCUFSSzMxMTZfUkNWKHNlcmlhbCwgMjAsIDB4RkUsIDB4QzAsIDB4MDAwMCwgMHgwMDA2LCAweEZGLCBidWYpOwotCi0JLyogc2V0IDk2MDAgYmF1ZCAmIGRvIHNvbWUgaW5pdD8hICovCi0JQVJLMzExNl9TTkQoc2VyaWFsLCAxNDcsIDB4RkUsIDB4NDAsIDB4MDA4MywgMHgwMDAzKTsKLQlBUkszMTE2X1NORChzZXJpYWwsIDE0OCwgMHhGRSwgMHg0MCwgMHgwMDM4LCAweDAwMDApOwotCUFSSzMxMTZfU05EKHNlcmlhbCwgMTQ5LCAweEZFLCAweDQwLCAweDAwMDEsIDB4MDAwMSk7Ci0JaWYgKGlzX2lyZGEoc2VyaWFsKSkKLQkJQVJLMzExNl9TTkQoc2VyaWFsLCAxMDA0LCAweEZFLCAweDQwLCAweDAwMDAsIDB4MDAwOSk7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLCAxNTAsIDB4RkUsIDB4NDAsIDB4MDAwMywgMHgwMDAzKTsKLQlBUkszMTE2X1JDVihzZXJpYWwsIDE1MSwgMHhGRSwgMHhDMCwgMHgwMDAwLCAweDAwMDQsIDB4MDMsIGJ1Zik7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLCAxNTIsIDB4RkUsIDB4NDAsIDB4MDAwMCwgMHgwMDAzKTsKLQlBUkszMTE2X1JDVihzZXJpYWwsIDE1MywgMHhGRSwgMHhDMCwgMHgwMDAwLCAweDAwMDMsIDB4MDAsIGJ1Zik7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLCAxNTQsIDB4RkUsIDB4NDAsIDB4MDAwMywgMHgwMDAzKTsKLQotCWtmcmVlKGJ1Zik7CisJZGV2X2luZm8oJnNlcmlhbC0+ZGV2LT5kZXYsCisJCSIlcyB1c2luZyAlcyBtb2RlXG4iLAorCQlLQlVJTERfTU9ETkFNRSwKKwkJcHJpdi0+aXJkYSA/ICJJckRBIiA6ICJSUzIzMiIpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBhcmszMTE2X3JlbGVhc2Uoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKK3sKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gc2VyaWFsLT5wb3J0WzBdOworCXN0cnVjdCBhcmszMTE2X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisKKwkvKiBkZXZpY2UgaXMgY2xvc2VkLCBzbyBVUkJzIGFuZCBETUEgc2hvdWxkIGJlIGRvd24gKi8KKworCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0LCBOVUxMKTsKKworCW11dGV4X2Rlc3Ryb3koJnByaXYtPmh3X2xvY2spOworCisJa2ZyZWUocHJpdik7Cit9CisKIHN0YXRpYyB2b2lkIGFyazMxMTZfaW5pdF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zID0gdHR5LT50ZXJtaW9zOwpAQCAtMTcyLDIwMCArMjI3LDE4OSBAQAogCQkJCXN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKwlzdHJ1Y3QgYXJrMzExNl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXN0cnVjdCBrdGVybWlvcyAqdGVybWlvcyA9IHR0eS0+dGVybWlvczsKIAl1bnNpZ25lZCBpbnQgY2ZsYWcgPSB0ZXJtaW9zLT5jX2NmbGFnOwotCWludCBiYXVkOwotCWludCBhcmszMTE2X2JhdWQ7Ci0JY2hhciAqYnVmOwotCWNoYXIgY29uZmlnOworCWludCBicHMgPSB0dHlfZ2V0X2JhdWRfcmF0ZSh0dHkpOworCWludCBxdW90OworCV9fdTggbGNyLCBoY3IsIGV2YWw7CiAKLQljb25maWcgPSAwOwotCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKLQotCi0JY2ZsYWcgPSB0ZXJtaW9zLT5jX2NmbGFnOwotCXRlcm1pb3MtPmNfY2ZsYWcgJj0gfihDTVNQQVJ8Q1JUU0NUUyk7Ci0KLQlidWYgPSBrbWFsbG9jKDEsIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCWRiZygiZXJyb3Iga21hbGxvYyIpOwotCQkqdGVybWlvcyA9ICpvbGRfdGVybWlvczsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHNldCBkYXRhIGJpdCBjb3VudCAoOC83LzYvNSkgKi8KLQlpZiAoY2ZsYWcgJiBDU0laRSkgewotCQlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKLQkJY2FzZSBDUzU6Ci0JCQljb25maWcgfD0gMHgwMDsKLQkJCWRiZygic2V0dGluZyBDUzUiKTsKLQkJCWJyZWFrOwotCQljYXNlIENTNjoKLQkJCWNvbmZpZyB8PSAweDAxOwotCQkJZGJnKCJzZXR0aW5nIENTNiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ1M3OgotCQkJY29uZmlnIHw9IDB4MDI7Ci0JCQlkYmcoInNldHRpbmcgQ1M3Iik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRiZygiQ1NJWkUgd2FzIHNldCBidXQgbm90IENTNS1DUzgsIHVzaW5nIENTOCEiKTsKLQkJCS8qIGZhbGwgdGhyb3VnaCAqLwotCQljYXNlIENTODoKLQkJCWNvbmZpZyB8PSAweDAzOwotCQkJZGJnKCJzZXR0aW5nIENTOCIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiBzZXQgcGFyaXR5IChOT05FL0VWRU4vT0REKSAqLwotCWlmIChjZmxhZyAmIFBBUkVOQikgewotCQlpZiAoY2ZsYWcgJiBQQVJPREQpIHsKLQkJCWNvbmZpZyB8PSAweDA4OwotCQkJZGJnKCJzZXR0aW5nIHBhcml0eSB0byBPREQiKTsKLQkJfSBlbHNlIHsKLQkJCWNvbmZpZyB8PSAweDE4OwotCQkJZGJnKCJzZXR0aW5nIHBhcml0eSB0byBFVkVOIik7Ci0JCX0KLQl9IGVsc2UgewotCQlkYmcoInNldHRpbmcgcGFyaXR5IHRvIE5PTkUiKTsKLQl9Ci0KLQkvKiBzZXQgc3RvcCBiaXQgKDEvMikgKi8KLQlpZiAoY2ZsYWcgJiBDU1RPUEIpIHsKLQkJY29uZmlnIHw9IDB4MDQ7Ci0JCWRiZygic2V0dGluZyAyIHN0b3AgYml0cyIpOwotCX0gZWxzZSB7Ci0JCWRiZygic2V0dGluZyAxIHN0b3AgYml0Iik7Ci0JfQotCi0JLyogc2V0IGJhdWRyYXRlICovCi0JYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKHR0eSk7Ci0KLQlzd2l0Y2ggKGJhdWQpIHsKLQljYXNlIDc1OgotCWNhc2UgMTUwOgotCWNhc2UgMzAwOgotCWNhc2UgNjAwOgotCWNhc2UgMTIwMDoKLQljYXNlIDE4MDA6Ci0JY2FzZSAyNDAwOgotCWNhc2UgNDgwMDoKLQljYXNlIDk2MDA6Ci0JY2FzZSAxOTIwMDoKLQljYXNlIDM4NDAwOgotCWNhc2UgNTc2MDA6Ci0JY2FzZSAxMTUyMDA6Ci0JY2FzZSAyMzA0MDA6Ci0JY2FzZSA0NjA4MDA6Ci0JCS8qIFJlcG9ydCB0aGUgcmVzdWx0aW5nIHJhdGUgYmFjayB0byB0aGUgY2FsbGVyICovCi0JCXR0eV9lbmNvZGVfYmF1ZF9yYXRlKHR0eSwgYmF1ZCwgYmF1ZCk7CisJLyogc2V0IGRhdGEgYml0IGNvdW50ICovCisJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CisJY2FzZSBDUzU6CisJCWxjciA9IFVBUlRfTENSX1dMRU41OwogCQlicmVhazsKLQkvKiBzZXQgOTYwMCBhcyBkZWZhdWx0IChpZiBnaXZlbiBiYXVkcmF0ZSBpcyBpbnZhbGlkIGZvciBleGFtcGxlKSAqLworCWNhc2UgQ1M2OgorCQlsY3IgPSBVQVJUX0xDUl9XTEVONjsKKwkJYnJlYWs7CisJY2FzZSBDUzc6CisJCWxjciA9IFVBUlRfTENSX1dMRU43OworCQlicmVhazsKIAlkZWZhdWx0OgotCQl0dHlfZW5jb2RlX2JhdWRfcmF0ZSh0dHksIDk2MDAsIDk2MDApOworCWNhc2UgQ1M4OgorCQlsY3IgPSBVQVJUX0xDUl9XTEVOODsKKwkJYnJlYWs7CisJfQorCWlmIChjZmxhZyAmIENTVE9QQikKKwkJbGNyIHw9IFVBUlRfTENSX1NUT1A7CisJaWYgKGNmbGFnICYgUEFSRU5CKQorCQlsY3IgfD0gVUFSVF9MQ1JfUEFSSVRZOworCWlmICghKGNmbGFnICYgUEFST0REKSkKKwkJbGNyIHw9IFVBUlRfTENSX0VQQVI7CisjaWZkZWYgQ01TUEFSCisJaWYgKGNmbGFnICYgQ01TUEFSKQorCQlsY3IgfD0gVUFSVF9MQ1JfU1BBUjsKKyNlbmRpZgorCS8qIGhhbmRzaGFrZSBjb250cm9sICovCisJaGNyID0gKGNmbGFnICYgQ1JUU0NUUykgPyAweDAzIDogMHgwMDsKKworCS8qIGNhbGMgYmF1ZHJhdGUgKi8KKwlkYmcoIiVzIC0gc2V0dGluZyBicHMgdG8gJWQiLCBfX2Z1bmNfXywgYnBzKTsKKwlldmFsID0gMDsKKwlzd2l0Y2ggKGJwcykgewogCWNhc2UgMDoKLQkJYmF1ZCA9IDk2MDA7CisJCXF1b3QgPSBjYWxjX2Rpdmlzb3IoOTYwMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmICgoYnBzIDwgNzUpIHx8IChicHMgPiAzMDAwMDAwKSkKKwkJCWJwcyA9IDk2MDA7CisJCXF1b3QgPSBjYWxjX2Rpdmlzb3IoYnBzKTsKKwkJYnJlYWs7CisJY2FzZSA0NjA4MDA6CisJCWV2YWwgPSAxOworCQlxdW90ID0gY2FsY19kaXZpc29yKGJwcyk7CisJCWJyZWFrOworCWNhc2UgOTIxNjAwOgorCQlldmFsID0gMjsKKwkJcXVvdCA9IGNhbGNfZGl2aXNvcihicHMpOworCQlicmVhazsKIAl9CiAKLQkvKgotCSAqIGZvdW5kIGJ5IHRyeSduJ2Vycm9yLCBiZSBjYXJlZnVsLCBtYXliZSB0aGVyZSBhcmUgb3RoZXIgb3B0aW9ucwotCSAqIGZvciBtdWx0aXBsaWNhdG9yIGV0YyEgKDMuNSBmb3IgZXhhbXBsZSkKLQkgKi8KLQlpZiAoYmF1ZCA9PSA0NjA4MDApCi0JCS8qIHN0cmFuZ2UsIGZvciA0NjA4MDAgdGhlIGZvcm11bGEgaXMgd3JvbmcKLQkJICogaWYgdXNpbmcgcm91bmQoKSB0aGVuIDk2MDBiYXVkIGlzIHdyb25nKSAqLwotCQlhcmszMTE2X2JhdWQgPSA3OwotCWVsc2UKLQkJYXJrMzExNl9iYXVkID0gMzAwMDAwMCAvIGJhdWQ7CisJLyogVXBkYXRlIHN0YXRlOiBzeW5jaHJvbml6ZSAqLworCW11dGV4X2xvY2soJnByaXYtPmh3X2xvY2spOwogCi0JLyogPyAqLwotCUFSSzMxMTZfUkNWKHNlcmlhbCwgMCwgMHhGRSwgMHhDMCwgMHgwMDAwLCAweDAwMDMsIDB4MDMsIGJ1Zik7CisJLyoga2VlcCBvbGQgTENSX1NCQyBiaXQgKi8KKwlsY3IgfD0gKHByaXYtPmxjciAmIFVBUlRfTENSX1NCQyk7CiAKLQkvKiBvZmZzZXQgPSBidWZbMF07ICovCi0JLyogb2Zmc2V0ID0gMHgwMzsgKi8KLQkvKiBkYmcoInVzaW5nIDB4JTA0WCBhcyB0YXJnZXQgZm9yIDB4MDAwMzoiLCAweDAwODAgKyBvZmZzZXQpOyAqLworCWRiZygiJXMgLSBzZXR0aW5nIGhjcjoweCUwMngsbGNyOjB4JTAyeCxxdW90OiVkIiwKKwkgICAgX19mdW5jX18sIGhjciwgbGNyLCBxdW90KTsKIAotCS8qIHNldCBiYXVkcmF0ZSAqLwotCWRiZygic2V0dGluZyBiYXVkcmF0ZSB0byAlZCAoLT5yZWc9JWQpIiwgYmF1ZCwgYXJrMzExNl9iYXVkKTsKLQlBUkszMTE2X1NORChzZXJpYWwsIDE0NywgMHhGRSwgMHg0MCwgMHgwMDgzLCAweDAwMDMpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwgMTQ4LCAweEZFLCAweDQwLAotCQkJICAgIChhcmszMTE2X2JhdWQgJiAweDAwRkYpLCAweDAwMDApOwotCUFSSzMxMTZfU05EKHNlcmlhbCwgMTQ5LCAweEZFLCAweDQwLAotCQkJICAgIChhcmszMTE2X2JhdWQgJiAweEZGMDApID4+IDgsIDB4MDAwMSk7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLCAxNTAsIDB4RkUsIDB4NDAsIDB4MDAwMywgMHgwMDAzKTsKKwkvKiBoYW5kc2hha2UgY29udHJvbCAqLworCWlmIChwcml2LT5oY3IgIT0gaGNyKSB7CisJCXByaXYtPmhjciA9IGhjcjsKKwkJYXJrMzExNl93cml0ZV9yZWcoc2VyaWFsLCAweDgsIGhjcik7CisJfQogCi0JLyogPyAqLwotCUFSSzMxMTZfUkNWKHNlcmlhbCwgMTUxLCAweEZFLCAweEMwLCAweDAwMDAsIDB4MDAwNCwgMHgwMywgYnVmKTsKLQlBUkszMTE2X1NORChzZXJpYWwsIDE1MiwgMHhGRSwgMHg0MCwgMHgwMDAwLCAweDAwMDMpOworCS8qIGJhdWRyYXRlICovCisJaWYgKHByaXYtPnF1b3QgIT0gcXVvdCkgeworCQlwcml2LT5xdW90ID0gcXVvdDsKKwkJcHJpdi0+bGNyID0gbGNyOyAvKiBuZWVkIHRvIHdyaXRlIGxjciBhbnl3YXkgKi8KIAotCS8qIHNldCBkYXRhIGJpdCBjb3VudCwgc3RvcCBiaXQgY291bnQgJiBwYXJpdHk6ICovCi0JZGJnKCJ1cGRhdGluZyBiaXQgY291bnQsIHN0b3AgYml0IG9yIHBhcml0eSAoY2ZnPTB4JTAyWCkiLCBjb25maWcpOwotCUFSSzMxMTZfUkNWKHNlcmlhbCwgMTUzLCAweEZFLCAweEMwLCAweDAwMDAsIDB4MDAwMywgMHgwMCwgYnVmKTsKLQlBUkszMTE2X1NORChzZXJpYWwsIDE1NCwgMHhGRSwgMHg0MCwgY29uZmlnLCAweDAwMDMpOworCQkvKiBkaXNhYmxlIERNQSBzaW5jZSB0cmFuc21pdC9yZWNlaXZlIGlzCisJCSAqIHNoYWRvd2VkIGJ5IFVBUlRfRExMCisJCSAqLworCQlhcmszMTE2X3dyaXRlX3JlZyhzZXJpYWwsIFVBUlRfRkNSLCAwKTsKIAotCWlmIChjZmxhZyAmIENSVFNDVFMpCi0JCWRiZygiQ1JUU0NUUyBub3Qgc3VwcG9ydGVkIGJ5IGNoaXBzZXQ/ISIpOworCQlhcmszMTE2X3dyaXRlX3JlZyhzZXJpYWwsIFVBUlRfTENSLAorCQkJCSAgbGNyfFVBUlRfTENSX0RMQUIpOworCQlhcmszMTE2X3dyaXRlX3JlZyhzZXJpYWwsIFVBUlRfRExMLCBxdW90ICYgMHhmZik7CisJCWFyazMxMTZfd3JpdGVfcmVnKHNlcmlhbCwgVUFSVF9ETE0sIChxdW90Pj44KSAmIDB4ZmYpOwogCi0JLyogVEVTVCBBUkszMTE2X1NORCgxNTQsIDB4RkUsIDB4NDAsIDB4RkZGRiwgMHgwMDA2KTsgKi8KKwkJLyogcmVzdG9yZSBsY3IgKi8KKwkJYXJrMzExNl93cml0ZV9yZWcoc2VyaWFsLCBVQVJUX0xDUiwgbGNyKTsKKwkJLyogbWFnaWMgYmF1ZHJhdGUgdGhpbmd5OiBub3Qgc3VyZSB3aGF0IGl0IGRvZXMsCisJCSAqIGJ1dCB3aW5kb3dzIGRvZXMgdGhpcyBhcyB3ZWxsLgorCQkgKi8KKwkJYXJrMzExNl93cml0ZV9yZWcoc2VyaWFsLCAweGUsIGV2YWwpOwogCi0Ja2ZyZWUoYnVmKTsKKwkJLyogZW5hYmxlIERNQSAqLworCQlhcmszMTE2X3dyaXRlX3JlZyhzZXJpYWwsIFVBUlRfRkNSLCBVQVJUX0ZDUl9ETUFfU0VMRUNUKTsKKwl9IGVsc2UgaWYgKHByaXYtPmxjciAhPSBsY3IpIHsKKwkJcHJpdi0+bGNyID0gbGNyOworCQlhcmszMTE2X3dyaXRlX3JlZyhzZXJpYWwsIFVBUlRfTENSLCBsY3IpOworCX0KIAotCXJldHVybjsKKwltdXRleF91bmxvY2soJnByaXYtPmh3X2xvY2spOworCisJLyogY2hlY2sgZm9yIHNvZnR3YXJlIGZsb3cgY29udHJvbCAqLworCWlmIChJX0lYT0ZGKHR0eSkgfHwgSV9JWE9OKHR0eSkpIHsKKwkJZGV2X3dhcm4oJnNlcmlhbC0+ZGV2LT5kZXYsCisJCQkgIiVzOiBkb24ndCBrbm93IGhvdyB0byBkbyBzb2Z0d2FyZSBmbG93IGNvbnRyb2xcbiIsCisJCQkgS0JVSUxEX01PRE5BTUUpOworCX0KKworCS8qIERvbid0IHJld3JpdGUgQjAgKi8KKwlpZiAodHR5X3Rlcm1pb3NfYmF1ZF9yYXRlKHRlcm1pb3MpKQorCQl0dHlfdGVybWlvc19lbmNvZGVfYmF1ZF9yYXRlKHRlcm1pb3MsIGJwcywgYnBzKTsKK30KKworc3RhdGljIHZvaWQgYXJrMzExNl9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CisKKwlpZiAoc2VyaWFsLT5kZXYpIHsKKwkJLyogZGlzYWJsZSBETUEgKi8KKwkJYXJrMzExNl93cml0ZV9yZWcoc2VyaWFsLCBVQVJUX0ZDUiwgMCk7CisKKwkJLyogZGVhY3RpdmF0ZSBpbnRlcnJ1cHRzICovCisJCWFyazMxMTZfd3JpdGVfcmVnKHNlcmlhbCwgVUFSVF9JRVIsIDApOworCisJCS8qIHNodXRkb3duIGFueSBidWxrIHJlYWRzIHRoYXQgbWlnaHQgYmUgZ29pbmcgb24gKi8KKwkJaWYgKHNlcmlhbC0+bnVtX2J1bGtfb3V0KQorCQkJdXNiX2tpbGxfdXJiKHBvcnQtPndyaXRlX3VyYik7CisJCWlmIChzZXJpYWwtPm51bV9idWxrX2luKQorCQkJdXNiX2tpbGxfdXJiKHBvcnQtPnJlYWRfdXJiKTsKKwkJaWYgKHNlcmlhbC0+bnVtX2ludGVycnVwdF9pbikKKwkJCXVzYl9raWxsX3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgYXJrMzExNl9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IGt0ZXJtaW9zIHRtcF90ZXJtaW9zOworCXN0cnVjdCBhcmszMTE2X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKLQljaGFyICpidWY7Ci0JaW50IHJlc3VsdCA9IDA7Ci0KLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpbnQgcmVzdWx0OwogCiAJYnVmID0ga21hbGxvYygxLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikgewotCQlkYmcoImVycm9yIGttYWxsb2MgLT4gb3V0IG9mIG1lbT8iKTsKKwlpZiAoYnVmID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXJlc3VsdCA9IHVzYl9zZXJpYWxfZ2VuZXJpY19vcGVuKHR0eSwgcG9ydCk7Ci0JaWYgKHJlc3VsdCkKKwlpZiAocmVzdWx0KSB7CisJCWRiZygiJXMgLSB1c2Jfc2VyaWFsX2dlbmVyaWNfb3BlbiBmYWlsZWQ6ICVkIiwKKwkJICAgIF9fZnVuY19fLCByZXN1bHQpOwogCQlnb3RvIGVycl9vdXQ7CisJfQogCi0JLyogb3BlbiAqLwotCUFSSzMxMTZfUkNWKHNlcmlhbCwgMTExLCAweEZFLCAweEMwLCAweDAwMDAsIDB4MDAwMywgMHgwMiwgYnVmKTsKLQotCUFSSzMxMTZfU05EKHNlcmlhbCwgMTEyLCAweEZFLCAweDQwLCAweDAwODIsIDB4MDAwMyk7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLCAxMTMsIDB4RkUsIDB4NDAsIDB4MDAxQSwgMHgwMDAwKTsKLQlBUkszMTE2X1NORChzZXJpYWwsIDExNCwgMHhGRSwgMHg0MCwgMHgwMDAwLCAweDAwMDEpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwgMTE1LCAweEZFLCAweDQwLCAweDAwMDIsIDB4MDAwMyk7Ci0KLQlBUkszMTE2X1JDVihzZXJpYWwsIDExNiwgMHhGRSwgMHhDMCwgMHgwMDAwLCAweDAwMDQsIDB4MDMsIGJ1Zik7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLCAxMTcsIDB4RkUsIDB4NDAsIDB4MDAwMiwgMHgwMDA0KTsKLQotCUFSSzMxMTZfUkNWKHNlcmlhbCwgMTE4LCAweEZFLCAweEMwLCAweDAwMDAsIDB4MDAwNCwgMHgwMiwgYnVmKTsKLQlBUkszMTE2X1NORChzZXJpYWwsIDExOSwgMHhGRSwgMHg0MCwgMHgwMDAwLCAweDAwMDQpOwotCi0JQVJLMzExNl9SQ1Yoc2VyaWFsLCAxMjAsIDB4RkUsIDB4QzAsIDB4MDAwMCwgMHgwMDA0LCAweDAwLCBidWYpOwotCi0JQVJLMzExNl9TTkQoc2VyaWFsLCAxMjEsIDB4RkUsIDB4NDAsIDB4MDAwMSwgMHgwMDA0KTsKLQotCUFSSzMxMTZfUkNWKHNlcmlhbCwgMTIyLCAweEZFLCAweEMwLCAweDAwMDAsIDB4MDAwNCwgMHgwMSwgYnVmKTsKLQotCUFSSzMxMTZfU05EKHNlcmlhbCwgMTIzLCAweEZFLCAweDQwLCAweDAwMDMsIDB4MDAwNCk7Ci0KLQkvKiByZXR1cm5zIGRpZmZlcmVudCB2YWx1ZXMgKGNvbnRyb2wgbGluZXM/ISkgKi8KLQlBUkszMTE2X1JDVihzZXJpYWwsIDEyNCwgMHhGRSwgMHhDMCwgMHgwMDAwLCAweDAwMDYsIDB4RkYsIGJ1Zik7Ci0KLQkvKiBpbml0aWFsaXNlIHRlcm1pb3MgKi8KKwkvKiBzZXR1cCB0ZXJtaW9zICovCiAJaWYgKHR0eSkKLQkJYXJrMzExNl9zZXRfdGVybWlvcyh0dHksIHBvcnQsICZ0bXBfdGVybWlvcyk7CisJCWFyazMxMTZfc2V0X3Rlcm1pb3ModHR5LCBwb3J0LCBOVUxMKTsKKworCS8qIHJlbW92ZSBhbnkgZGF0YSBzdGlsbCBsZWZ0OiBhbHNvIGNsZWFycyBlcnJvciBzdGF0ZSAqLworCWFyazMxMTZfcmVhZF9yZWcoc2VyaWFsLCBVQVJUX1JYLCBidWYpOworCisJLyogcmVhZCBtb2RlbSBzdGF0dXMgKi8KKwlwcml2LT5tc3IgPSBhcmszMTE2X3JlYWRfcmVnKHNlcmlhbCwgVUFSVF9NU1IsIGJ1Zik7CisJLyogcmVhZCBsaW5lIHN0YXR1cyAqLworCXByaXYtPmxzciA9IGFyazMxMTZfcmVhZF9yZWcoc2VyaWFsLCBVQVJUX0xTUiwgYnVmKTsKKworCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXN1bHQpIHsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAic3VibWl0IGlycV9pbiB1cmIgZmFpbGVkICVkXG4iLAorCQkJcmVzdWx0KTsKKwkJYXJrMzExNl9jbG9zZShwb3J0KTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIGFjdGl2YXRlIGludGVycnVwdHMgKi8KKwlhcmszMTE2X3dyaXRlX3JlZyhwb3J0LT5zZXJpYWwsIFVBUlRfSUVSLCBVQVJUX0lFUl9NU0l8VUFSVF9JRVJfUkxTSSk7CisKKwkvKiBlbmFibGUgRE1BICovCisJYXJrMzExNl93cml0ZV9yZWcocG9ydC0+c2VyaWFsLCBVQVJUX0ZDUiwgVUFSVF9GQ1JfRE1BX1NFTEVDVCk7CiAKIGVycl9vdXQ6CiAJa2ZyZWUoYnVmKTsKLQogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTM3Myw2ICs0MTcsNyBAQAogCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBhcmszMTE2X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJc3RydWN0IHNlcmlhbF9zdHJ1Y3Qgc2Vyc3RydWN0OwogCXZvaWQgX191c2VyICp1c2VyX2FyZyA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIApAQCAtMzk0LDkgKzQzOSw0OCBAQAogCQlpZiAoY29weV9mcm9tX3VzZXIoJnNlcnN0cnVjdCwgdXNlcl9hcmcsIHNpemVvZihzZXJzdHJ1Y3QpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlyZXR1cm4gMDsKLQlkZWZhdWx0OgotCQlkYmcoIiVzIGNtZCAweCUwNHggbm90IHN1cHBvcnRlZCIsIF9fZnVuY19fLCBjbWQpOworCWNhc2UgVElPQ01JV0FJVDoKKwkJZm9yICg7OykgeworCQkJc3RydWN0IGFzeW5jX2ljb3VudCBwcmV2ID0gcHJpdi0+aWNvdW50OworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcHJpdi0+ZGVsdGFfbXNyX3dhaXQpOworCQkJLyogc2VlIGlmIGEgc2lnbmFsIGRpZCBpdCAqLworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCQlpZiAoKHByZXYucm5nID09IHByaXYtPmljb3VudC5ybmcpICYmCisJCQkgICAgKHByZXYuZHNyID09IHByaXYtPmljb3VudC5kc3IpICYmCisJCQkgICAgKHByZXYuZGNkID09IHByaXYtPmljb3VudC5kY2QpICYmCisJCQkgICAgKHByZXYuY3RzID09IHByaXYtPmljb3VudC5jdHMpKQorCQkJCXJldHVybiAtRUlPOworCQkJaWYgKChhcmcgJiBUSU9DTV9STkcgJiYKKwkJCSAgICAgKHByZXYucm5nICE9IHByaXYtPmljb3VudC5ybmcpKSB8fAorCQkJICAgIChhcmcgJiBUSU9DTV9EU1IgJiYKKwkJCSAgICAgKHByZXYuZHNyICE9IHByaXYtPmljb3VudC5kc3IpKSB8fAorCQkJICAgIChhcmcgJiBUSU9DTV9DRCAgJiYKKwkJCSAgICAgKHByZXYuZGNkICE9IHByaXYtPmljb3VudC5kY2QpKSB8fAorCQkJICAgIChhcmcgJiBUSU9DTV9DVFMgJiYKKwkJCSAgICAgKHByZXYuY3RzICE9IHByaXYtPmljb3VudC5jdHMpKSkKKwkJCQlyZXR1cm4gMDsKKwkJfQogCQlicmVhazsKKwljYXNlIFRJT0NHSUNPVU5UOiB7CisJCXN0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0IGljb3VudDsKKwkJc3RydWN0IGFzeW5jX2ljb3VudCBjbm93ID0gcHJpdi0+aWNvdW50OworCQltZW1zZXQoJmljb3VudCwgMCwgc2l6ZW9mKGljb3VudCkpOworCQlpY291bnQuY3RzID0gY25vdy5jdHM7CisJCWljb3VudC5kc3IgPSBjbm93LmRzcjsKKwkJaWNvdW50LnJuZyA9IGNub3cucm5nOworCQlpY291bnQuZGNkID0gY25vdy5kY2Q7CisJCWljb3VudC5yeCA9IGNub3cucng7CisJCWljb3VudC50eCA9IGNub3cudHg7CisJCWljb3VudC5mcmFtZSA9IGNub3cuZnJhbWU7CisJCWljb3VudC5vdmVycnVuID0gY25vdy5vdmVycnVuOworCQlpY291bnQucGFyaXR5ID0gY25vdy5wYXJpdHk7CisJCWljb3VudC5icmsgPSBjbm93LmJyazsKKwkJaWNvdW50LmJ1Zl9vdmVycnVuID0gY25vdy5idWZfb3ZlcnJ1bjsKKwkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2FyZywgJmljb3VudCwgc2l6ZW9mKGljb3VudCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KIAl9CiAKIAlyZXR1cm4gLUVOT0lPQ1RMQ01EOwpAQCAtNDA1LDMyICs0ODksMjczIEBACiBzdGF0aWMgaW50IGFyazMxMTZfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKLQljaGFyICpidWY7Ci0JY2hhciB0ZW1wOworCXN0cnVjdCBhcmszMTE2X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJX191MzIgc3RhdHVzOworCV9fdTMyIGN0cmw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qIHNlZW1zIGxpa2Ugc2VyaWFsIHBvcnQgc3RhdHVzIGluZm8gKFJUUywgQ1RTLCAuLi4pIGlzIHN0b3JlZAotCSAqIGluIHJlZyg/KSAweDAwMDYKLQkgKiBwY2IgY29ubmVjdGlvbiBwb2ludCAxMSA9IEdORCAtPiBzZXRzIGJpdDQgb2YgcmVzcG9uc2UKLQkgKiBwY2IgY29ubmVjdGlvbiBwb2ludCAgNyA9IEdORCAtPiBzZXRzIGJpdDYgb2YgcmVzcG9uc2UKKwltdXRleF9sb2NrKCZwcml2LT5od19sb2NrKTsKKwljdHJsID0gcHJpdi0+bWNyOworCW11dGV4X3VubG9jaygmcHJpdi0+aHdfbG9jayk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhdHVzX2xvY2ssIGZsYWdzKTsKKwlzdGF0dXMgPSBwcml2LT5tc3I7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhdHVzX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAgKHN0YXR1cyAmIFVBUlRfTVNSX0RTUiAgPyBUSU9DTV9EU1IgIDogMCkgfAorCQkoc3RhdHVzICYgVUFSVF9NU1JfQ1RTICA/IFRJT0NNX0NUUyAgOiAwKSB8CisJCShzdGF0dXMgJiBVQVJUX01TUl9SSSAgID8gVElPQ01fUkkgICA6IDApIHwKKwkJKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCAgPyBUSU9DTV9DRCAgIDogMCkgfAorCQkoY3RybCAgICYgVUFSVF9NQ1JfRFRSICA/IFRJT0NNX0RUUiAgOiAwKSB8CisJCShjdHJsICAgJiBVQVJUX01DUl9SVFMgID8gVElPQ01fUlRTICA6IDApIHwKKwkJKGN0cmwgICAmIFVBUlRfTUNSX09VVDEgPyBUSU9DTV9PVVQxIDogMCkgfAorCQkoY3RybCAgICYgVUFSVF9NQ1JfT1VUMiA/IFRJT0NNX09VVDIgOiAwKTsKK30KKworc3RhdGljIGludCBhcmszMTE2X3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgc2V0LCB1bnNpZ25lZCBjbHIpCit7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGFyazMxMTZfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKworCS8qIHdlIG5lZWQgdG8gdGFrZSB0aGUgbXV0ZXggaGVyZSwgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHZhbHVlCisJICogaW4gcHJpdi0+bWNyIGlzIGFjdHVhbGx5IHRoZSBvbmUgdGhhdCBpcyBpbiB0aGUgaGFyZHdhcmUKIAkgKi8KIAotCWJ1ZiA9IGttYWxsb2MoMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpIHsKLQkJZGJnKCJlcnJvciBrbWFsbG9jIik7Ci0JCXJldHVybiAtRU5PTUVNOworCW11dGV4X2xvY2soJnByaXYtPmh3X2xvY2spOworCisJaWYgKHNldCAmIFRJT0NNX1JUUykKKwkJcHJpdi0+bWNyIHw9IFVBUlRfTUNSX1JUUzsKKwlpZiAoc2V0ICYgVElPQ01fRFRSKQorCQlwcml2LT5tY3IgfD0gVUFSVF9NQ1JfRFRSOworCWlmIChzZXQgJiBUSU9DTV9PVVQxKQorCQlwcml2LT5tY3IgfD0gVUFSVF9NQ1JfT1VUMTsKKwlpZiAoc2V0ICYgVElPQ01fT1VUMikKKwkJcHJpdi0+bWNyIHw9IFVBUlRfTUNSX09VVDI7CisJaWYgKGNsciAmIFRJT0NNX1JUUykKKwkJcHJpdi0+bWNyICY9IH5VQVJUX01DUl9SVFM7CisJaWYgKGNsciAmIFRJT0NNX0RUUikKKwkJcHJpdi0+bWNyICY9IH5VQVJUX01DUl9EVFI7CisJaWYgKGNsciAmIFRJT0NNX09VVDEpCisJCXByaXYtPm1jciAmPSB+VUFSVF9NQ1JfT1VUMTsKKwlpZiAoY2xyICYgVElPQ01fT1VUMikKKwkJcHJpdi0+bWNyICY9IH5VQVJUX01DUl9PVVQyOworCisJYXJrMzExNl93cml0ZV9yZWcocG9ydC0+c2VyaWFsLCBVQVJUX01DUiwgcHJpdi0+bWNyKTsKKworCW11dGV4X3VubG9jaygmcHJpdi0+aHdfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXJrMzExNl9icmVha19jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKQoreworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBhcmszMTE2X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisKKwkvKiBMQ1IgaXMgYWxzbyB1c2VkIGZvciBvdGhlciB0aGluZ3M6IHByb3RlY3QgYWNjZXNzICovCisJbXV0ZXhfbG9jaygmcHJpdi0+aHdfbG9jayk7CisKKwlpZiAoYnJlYWtfc3RhdGUpCisJCXByaXYtPmxjciB8PSBVQVJUX0xDUl9TQkM7CisJZWxzZQorCQlwcml2LT5sY3IgJj0gflVBUlRfTENSX1NCQzsKKworCWFyazMxMTZfd3JpdGVfcmVnKHBvcnQtPnNlcmlhbCwgVUFSVF9MQ1IsIHByaXYtPmxjcik7CisKKwltdXRleF91bmxvY2soJnByaXYtPmh3X2xvY2spOworfQorCitzdGF0aWMgdm9pZCBhcmszMTE2X3VwZGF0ZV9tc3Ioc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgX191OCBtc3IpCit7CisJc3RydWN0IGFyazMxMTZfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YXR1c19sb2NrLCBmbGFncyk7CisJcHJpdi0+bXNyID0gbXNyOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YXR1c19sb2NrLCBmbGFncyk7CisKKwlpZiAobXNyICYgVUFSVF9NU1JfQU5ZX0RFTFRBKSB7CisJCS8qIHVwZGF0ZSBpbnB1dCBsaW5lIGNvdW50ZXJzICovCisJCWlmIChtc3IgJiBVQVJUX01TUl9EQ1RTKQorCQkJcHJpdi0+aWNvdW50LmN0cysrOworCQlpZiAobXNyICYgVUFSVF9NU1JfRERTUikKKwkJCXByaXYtPmljb3VudC5kc3IrKzsKKwkJaWYgKG1zciAmIFVBUlRfTVNSX0REQ0QpCisJCQlwcml2LT5pY291bnQuZGNkKys7CisJCWlmIChtc3IgJiBVQVJUX01TUl9URVJJKQorCQkJcHJpdi0+aWNvdW50LnJuZysrOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPmRlbHRhX21zcl93YWl0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFyazMxMTZfdXBkYXRlX2xzcihzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBfX3U4IGxzcikKK3sKKwlzdHJ1Y3QgYXJrMzExNl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhdHVzX2xvY2ssIGZsYWdzKTsKKwkvKiBjb21iaW5lIGJpdHMgKi8KKwlwcml2LT5sc3IgfD0gbHNyOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YXR1c19sb2NrLCBmbGFncyk7CisKKwlpZiAobHNyJlVBUlRfTFNSX0JSS19FUlJPUl9CSVRTKSB7CisJCWlmIChsc3IgJiBVQVJUX0xTUl9CSSkKKwkJCXByaXYtPmljb3VudC5icmsrKzsKKwkJaWYgKGxzciAmIFVBUlRfTFNSX0ZFKQorCQkJcHJpdi0+aWNvdW50LmZyYW1lKys7CisJCWlmIChsc3IgJiBVQVJUX0xTUl9QRSkKKwkJCXByaXYtPmljb3VudC5wYXJpdHkrKzsKKwkJaWYgKGxzciAmIFVBUlRfTFNSX09FKQorCQkJcHJpdi0+aWNvdW50Lm92ZXJydW4rKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFyazMxMTZfcmVhZF9pbnRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CisJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOworCWNvbnN0IF9fdTggKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlpbnQgcmVzdWx0OworCisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCisJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAorCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJYnJlYWs7CisJY2FzZSAwOiAvKiBzdWNjZXNzICovCisJCS8qIGRpc2NvdmVyZWQgdGhpcyBieSB0cmFpbCBhbmQgZXJyb3IuLi4gKi8KKwkJaWYgKCh1cmItPmFjdHVhbF9sZW5ndGggPT0gNCkgJiYgKGRhdGFbMF0gPT0gMHhlOCkpIHsKKwkJCWNvbnN0IF9fdTggaWQgPSBkYXRhWzFdJlVBUlRfSUlSX0lEOworCQkJZGJnKCIlczogaWlyPSUwMngiLCBfX2Z1bmNfXywgZGF0YVsxXSk7CisJCQlpZiAoaWQgPT0gVUFSVF9JSVJfTVNJKSB7CisJCQkJZGJnKCIlczogbXNyPSUwMngiLCBfX2Z1bmNfXywgZGF0YVszXSk7CisJCQkJYXJrMzExNl91cGRhdGVfbXNyKHBvcnQsIGRhdGFbM10pOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChpZCA9PSBVQVJUX0lJUl9STFNJKSB7CisJCQkJZGJnKCIlczogbHNyPSUwMngiLCBfX2Z1bmNfXywgZGF0YVsyXSk7CisJCQkJYXJrMzExNl91cGRhdGVfbHNyKHBvcnQsIGRhdGFbMl0pOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qCisJCSAqIE5vdCBzdXJlIHdoYXQgdGhpcyBkYXRhIG1lYW50Li4uCisJCSAqLworCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsCisJCQkJICAgICAgX19mdW5jX18sCisJCQkJICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoLAorCQkJCSAgICAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJYnJlYWs7CiAJfQogCi0JLyogcmVhZCByZWdpc3RlciAqLwotCUFSSzMxMTZfUkNWX1FVSUVUKHNlcmlhbCwgMHhGRSwgMHhDMCwgMHgwMDAwLCAweDAwMDYsIGJ1Zik7Ci0JdGVtcCA9IGJ1ZlswXTsKLQlrZnJlZShidWYpOworCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJlc3VsdCkKKwkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKKwkJCSIlcyAtIEVycm9yICVkIHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYlxuIiwKKwkJCV9fZnVuY19fLCByZXN1bHQpOworfQogCi0JLyogaSBkbyBub3QgcmVhbGx5IGtub3cgaWYgYml0ND1DVFMgYW5kIGJpdDY9RFNSLi4uIGp1c3QgYQotCSAqIHF1aWNrIGd1ZXNzIQotCSAqLwotCXJldHVybiAodGVtcCAmICgxPDw0KSA/IFRJT0NNX0NUUyA6IDApCi0JICAgICAgIHwgKHRlbXAgJiAoMTw8NikgPyBUSU9DTV9EU1IgOiAwKTsKKworLyogRGF0YSBjb21lcyBpbiB2aWEgdGhlIGJ1bGsgKGRhdGEpIFVSQiwgZXJvcnMvaW50ZXJydXB0cyB2aWEgdGhlIGludCBVUkIuCisgKiBUaGlzIG1lYW5zIHRoYXQgd2UgY2Fubm90IGJlIHN1cmUgd2hpY2ggZGF0YSBieXRlIGhhcyBhbiBhc3NvY2lhdGVkIGVycm9yCisgKiBjb25kaXRpb24sIHNvIHdlIHJlcG9ydCBhbiBlcnJvciBmb3IgYWxsIGRhdGEgaW4gdGhlIG5leHQgYnVsayByZWFkLgorICoKKyAqIEFjdHVhbGx5LCB0aGVyZSBtaWdodCBldmVuIGJlIGEgd2luZG93IGJldHdlZW4gdGhlIGJ1bGsgZGF0YSBsZWF2aW5nIHRoZQorICogYXJrIGFuZCByZWFkaW5nL3Jlc2V0dGluZyB0aGUgbHNyIGluIHRoZSByZWFkX2J1bGtfY2FsbGJhY2sgd2hlcmUgYW4KKyAqIGludGVycnVwdCBmb3IgdGhlIG5leHQgZGF0YSBibG9jayBjb3VsZCBjb21lIGluLgorICogV2l0aG91dCBzb21la2luZCBvZiBvcmRlcmluZyBvbiB0aGUgYXJrLCB3ZSB3b3VsZCBoYXZlIHRvIHJlcG9ydCB0aGUKKyAqIGVycm9yIGZvciB0aGUgbmV4dCBibG9jayBvZiBkYXRhIGFzIHdlbGwuLi4KKyAqIEZvciBub3csIGxldCdzIHByZXRlbmQgdGhpcyBjYW4ndCBoYXBwZW4uCisgKi8KKworc3RhdGljIHZvaWQgc2VuZF90b190dHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNoYXJzLAorCQkJc2l6ZV90IHNpemUsIGNoYXIgZmxhZykKK3sKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm47CisJaWYgKGZsYWcgPT0gVFRZX05PUk1BTCkgeworCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgY2hhcnMsIHNpemUpOworCX0gZWxzZSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKQorCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaGFyc1tpXSwgZmxhZyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhcmszMTE2X3JlYWRfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9ICB1cmItPmNvbnRleHQ7CisJc3RydWN0IGFyazMxMTZfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwljb25zdCBfX3U4ICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVzdWx0OworCWNoYXIgZmxhZzsKKwlfX3UzMiBsc3I7CisKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KKwkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsCisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOworCQlicmVhazsKKwljYXNlIDA6IC8qIHN1Y2Nlc3MgKi8KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhdHVzX2xvY2ssIGZsYWdzKTsKKwkJbHNyID0gcHJpdi0+bHNyOworCQkvKiBjbGVhciBlcnJvciBiaXRzICovCisJCXByaXYtPmxzciAmPSB+VUFSVF9MU1JfQlJLX0VSUk9SX0JJVFM7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YXR1c19sb2NrLCBmbGFncyk7CisKKwkJaWYgKHVubGlrZWx5KGxzciAmIFVBUlRfTFNSX0JJKSkKKwkJCWZsYWcgPSBUVFlfQlJFQUs7CisJCWVsc2UgaWYgKHVubGlrZWx5KGxzciAmIFVBUlRfTFNSX1BFKSkKKwkJCWZsYWcgPSBUVFlfUEFSSVRZOworCQllbHNlIGlmICh1bmxpa2VseShsc3IgJiBVQVJUX0xTUl9GRSkpCisJCQlmbGFnID0gVFRZX0ZSQU1FOworCQllbHNlCisJCQlmbGFnID0gVFRZX05PUk1BTDsKKworCQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKKwkJaWYgKHR0eSkgeworCQkJdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCB1cmItPmFjdHVhbF9sZW5ndGggKyAxKTsKKwkJCS8qIG92ZXJydW4gaXMgc3BlY2lhbCwgbm90IGFzc29jaWF0ZWQgd2l0aCBhIGNoYXIgKi8KKwkJCWlmICh1bmxpa2VseShsc3IgJiBVQVJUX0xTUl9PRSkpCisJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTik7CisJCQlzZW5kX3RvX3R0eSh0dHksIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCwgZmxhZyk7CisJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCQkJdHR5X2tyZWZfcHV0KHR0eSk7CisJCX0KKworCQkvKiBUaHJvdHRsZSB0aGUgZGV2aWNlIGlmIHJlcXVlc3RlZCBieSB0dHkgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwkJcG9ydC0+dGhyb3R0bGVkID0gcG9ydC0+dGhyb3R0bGVfcmVxOworCQlpZiAocG9ydC0+dGhyb3R0bGVkKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm47CisJCX0gZWxzZQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCX0KKwkvKiBDb250aW51ZSByZWFkaW5nIGZyb20gZGV2aWNlICovCisJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmVzdWx0KQorCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIgorCQkJIiByZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogfQogCiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgYXJrMzExNl9kcml2ZXIgPSB7CkBAIC00NTAsMTEgKzc3NSwxNyBAQAogCS51c2JfZHJpdmVyID0JCSZhcmszMTE2X2RyaXZlciwKIAkubnVtX3BvcnRzID0JCTEsCiAJLmF0dGFjaCA9CQlhcmszMTE2X2F0dGFjaCwKKwkucmVsZWFzZSA9CQlhcmszMTE2X3JlbGVhc2UsCiAJLnNldF90ZXJtaW9zID0JCWFyazMxMTZfc2V0X3Rlcm1pb3MsCiAJLmluaXRfdGVybWlvcyA9CQlhcmszMTE2X2luaXRfdGVybWlvcywKIAkuaW9jdGwgPQkJYXJrMzExNl9pb2N0bCwKIAkudGlvY21nZXQgPQkJYXJrMzExNl90aW9jbWdldCwKKwkudGlvY21zZXQgPQkJYXJrMzExNl90aW9jbXNldCwKIAkub3BlbiA9CQkJYXJrMzExNl9vcGVuLAorCS5jbG9zZSA9CQlhcmszMTE2X2Nsb3NlLAorCS5icmVha19jdGwgPSAJCWFyazMxMTZfYnJlYWtfY3RsLAorCS5yZWFkX2ludF9jYWxsYmFjayA9IAlhcmszMTE2X3JlYWRfaW50X2NhbGxiYWNrLAorCS5yZWFkX2J1bGtfY2FsbGJhY2sgPQlhcmszMTE2X3JlYWRfYnVsa19jYWxsYmFjaywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGFyazMxMTZfaW5pdCh2b2lkKQpAQCAtNDY1LDcgKzc5NiwxMiBAQAogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZhcmszMTE2X2RyaXZlcik7Ci0JaWYgKHJldHZhbCkKKwlpZiAocmV0dmFsID09IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IgorCQkgICAgICAgRFJJVkVSX1ZFUlNJT04gIjoiCisJCSAgICAgICBEUklWRVJfREVTQyAiXG4iLAorCQkgICAgICAgS0JVSUxEX01PRE5BTUUpOworCX0gZWxzZQogCQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmFyazMxMTZfZGV2aWNlKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtNDgwLDYgKzgxNiwxMDkgQEAKIG1vZHVsZV9leGl0KGFyazMxMTZfZXhpdCk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLW1vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGVuYWJsZWQgb3Igbm90Iik7CitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKIAorbW9kdWxlX3BhcmFtKGRlYnVnLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRW5hYmxlIGRlYnVnIik7CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGRlc2NyaWJlcyB3aGF0IEkgbGVhcm5lZCBmcm9tIHN0dWR5aW5nIHRoZSBvbGQKKyAqIGFyazMxMTYuYyBkcml2ZXIsIGRpc2Fzc2VtYmxpbmcgdGhlIHdpbmRvd3MgZHJpdmVyLCBhbmQgc29tZSBsdWNreQorICogZ3Vlc3Nlcy4gU2luY2UgSSBkbyBub3QgaGF2ZSBhbnkgZGF0YXNoZWV0IG9yIG90aGVyCisgKiBkb2N1bWVudGF0aW9uLCBpbmFjY3VyYWNpZXMgYXJlIGFsbW9zdCBndWFyYW50ZWVkLgorICoKKyAqIFNvbWUgc3BlY3MgZm9yIHRoZSBBUkszMTE2IGNhbiBiZSBmb3VuZCBoZXJlOgorICogaHR0cDovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAwNjAzMTgwMDA0MzgvCisgKiAgIHd3dy5hcmttaWNyby5jb20vZW4vcHJvZHVjdHMvdmlldy5waHA/aWQ9MTAKKyAqIE9uIHRoYXQgcGFnZSwgMiBHUElPIHBpbnMgYXJlIG1lbnRpb25lZDogSSBhc3N1bWUgdGhlc2UgYXJlIHRoZQorICogT1VUMSBhbmQgT1VUMiBwaW5zIG9mIHRoZSBVQVJULCBzbyBJIGFkZGVkIHN1cHBvcnQgZm9yIHRob3NlCisgKiB0aHJvdWdoIHRoZSBNQ1IuIFNpbmNlIHRoZSBwaW5zIGFyZSBub3QgYXZhaWxhYmxlIG9uIG15IGhhcmR3YXJlLAorICogSSBjb3VsZCBub3QgdmVyaWZ5IHRoaXMuCisgKiBBbHNvLCBpdCBzdGF0ZXMgdGhlcmUgaXMgIm9uLWNoaXAgaGFyZHdhcmUgZmxvdyBjb250cm9sIi4gSSBoYXZlCisgKiBkaXNjb3ZlcmVkIGhvdyB0byBlbmFibGUgdGhhdC4gVW5mb3J0dW5hdGVseSwgSSBkbyBub3Qga25vdyBob3cgdG8KKyAqIGVuYWJsZSBYT04vWE9GRiAoc29mdHdhcmUpIGZsb3cgY29udHJvbCwgd2hpY2ggd291bGQgbmVlZCBzdXBwb3J0CisgKiBmcm9tIHRoZSBjaGlwIGFzIHdlbGwgdG8gd29yay4gQmVjYXVzZSBvZiB0aGUgd29yZGluZyBvbiB0aGUgd2ViCisgKiBwYWdlIHRoZXJlIGlzIGEgcmVhbCBwb3NzaWJpbGl0eSB0aGUgY2hpcCBzaW1wbHkgZG9lcyBub3Qgc3VwcG9ydAorICogc29mdHdhcmUgZmxvdyBjb250cm9sLgorICoKKyAqIEkgZ290IG15IGFyazMxMTYgYXMgcGFydCBvZiBhIG1vYmlsZSBwaG9uZSBhZGFwdGVyIGNhYmxlLiBPbiB0aGUKKyAqIFBDQiwgdGhlIGZvbGxvd2luZyBudW1iZXJlZCBjb250YWN0cyBhcmUgcHJlc2VudDoKKyAqCisgKiAgMTotICs1VgorICogIDI6byBEVFIKKyAqICAzOmkgUlgKKyAqICA0OmkgRENECisgKiAgNTpvIFJUUworICogIDY6byBUWAorICogIDc6aSBSSQorICogIDg6aSBEU1IKKyAqIDEwOi0gMFYKKyAqIDExOmkgQ1RTCisgKgorICogT24gbXkgY2hpcCwgYWxsIHNpZ25hbHMgc2VlbSB0byBiZSAzLjNWLCBidXQgNVYgdG9sZXJhbnQuIEJ1dCB0aGF0CisgKiBtYXkgYmUgZGlmZmVyZW50IGZvciB0aGUgb25lIHlvdSBoYXZlIDstKS4KKyAqCisgKiBUaGUgd2luZG93cyBkcml2ZXIgbGltaXRzIHRoZSByZWdpc3RlcnMgdG8gMC1GLCBzbyBJIGFzc3VtZSB0aGVyZQorICogYXJlIGFjdHVhbGx5IDE2IHByZXNlbnQgb24gdGhlIGRldmljZS4KKyAqCisgKiBPbiBhbiBVQVJUIGludGVycnVwdCwgNCBieXRlcyBvZiBkYXRhIGNvbWUgaW4gb24gdGhlIGludGVycnVwdAorICogZW5kcG9pbnQuIFRoZSBieXRlcyBhcmUgMHhlOCBJSVIgTFNSIE1TUi4KKyAqCisgKiBUaGUgYmF1ZHJhdGUgc2VlbXMgdG8gYmUgZ2VuZXJhdGVkIGZyb20gdGhlIDEyTUh6IGNyeXN0YWwsIHVzaW5nCisgKiA0LXRpbWVzIHN1YnNhbXBsaW5nLiBTbyBxdW90PTEyZTYvKDQqYmF1ZCkuIEFsc28gc2VlIGRlc2NyaXB0aW9uCisgKiBvZiByZWdpc3RlciBFLgorICoKKyAqIFJlZ2lzdGVycyAwLTc6CisgKiBUaGVzZSBzZWVtIHRvIGJlIHRoZSBzYW1lIGFzIGZvciBhIHJlZ3VsYXIgMTY0NTAuIFRoZSBGQ1IgaXMgc2V0CisgKiB0byBVQVJUX0ZDUl9ETUFfU0VMRUNUICgweDgpLCBJIGd1ZXNzIHRvIGVuYWJsZSB0cmFuc2ZlcnMgYmV0d2VlbgorICogdGhlIFVBUlQgYW5kIHRoZSBVU0IgYnJpZGdlL0RNQSBlbmdpbmUuCisgKgorICogUmVnaXN0ZXIgODoKKyAqIEJ5IHRyaWFsIGFuZCBlcnJvciwgSSBmb3VuZCBvdXQgdGhhdCBiaXQgMCBlbmFibGVzIGhhcmR3YXJlIENUUywKKyAqIHN0b3BwaW5nIFRYIHdoZW4gQ1RTIGlzICs1Vi4gQml0IDEgZG9lcyB0aGUgc2FtZSBmb3IgUlRTLCBtYWtpbmcKKyAqIFJUUyArNVYgd2hlbiB0aGUgMzExNiBjYW5ub3QgdHJhbnNmZXIgdGhlIGRhdGEgdG8gdGhlIFVTQiBidXMKKyAqICh2ZXJpZmllZCBieSBkaXNhYmxpbmcgdGhlIHJlYWRpbmcgVVJCKS4gTm90ZSB0aGF0IGFzIGZhciBhcyBJIGNhbgorICogdGVsbCwgdGhlIHdpbmRvd3MgZHJpdmVyIGRvZXMgTk9UIHVzZSB0aGlzLCBzbyB0aGVyZSBtaWdodCBiZSBzb21lCisgKiBoYXJkd2FyZSBidWcgb3Igc29tZXRoaW5nLgorICoKKyAqIEFjY29yZGluZyB0byBhIHBhdGNoIHByb3ZpZGVkIGhlcmUKKyAqIChodHRwOi8vbGttbC5vcmcvbGttbC8yMDA5LzcvMjYvNTYpLCB0aGUgQVJLMzExNiBjYW4gYWxzbyBiZSB1c2VkCisgKiBhcyBhbiBJckRBIGRvbmdsZS4gU2luY2UgSSBkbyBub3QgaGF2ZSBzdWNoIGEgdGhpbmcsIEkgY291bGQgbm90CisgKiBpbnZlc3RpZ2F0ZSB0aGF0IGFzcGVjdC4gSG93ZXZlciwgSSBjYW4gc3BlY3VsYXRlIDstKS4KKyAqCisgKiAtIElyREEgZW5jb2RlcyBkYXRhIGRpZmZlcmVudGx5IHRoYW4gUlMyMzIuIE1vc3QgbGlrZWx5LCBvbmUgb2YKKyAqICAgdGhlIGJpdHMgaW4gcmVnaXN0ZXJzIDkuLkUgZW5hYmxlcyB0aGUgSVIgRU5ERUMgKGVuY29kZXIvZGVjb2RlcikuCisgKiAtIERlcGVuZGluZyBvbiB0aGUgSVIgdHJhbnNjZWl2ZXIsIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG5lZWQgdG8gYmUKKyAqICAgaW52ZXJ0ZWQsIHNvIHRoZXJlIGFyZSBwcm9iYWJseSBiaXRzIGZvciB0aGF0IGFzIHdlbGwuCisgKiAtIElyREEgaXMgaGFsZi1kdXBsZXgsIHNvIHRoZXJlIHNob3VsZCBiZSBhIGJpdCBmb3Igc2VsZWN0aW5nIHRoYXQuCisgKgorICogVGhpcyBzdGlsbCBsZWF2ZXMgYXQgbGVhc3QgdHdvIHJlZ2lzdGVycyB1bmFjY291bnRlZCBmb3IuIFBlcmhhcHMKKyAqIFRoZSBjaGlwIGNhbiBkbyBYT04vWE9GRiBvciBDUkMgaW4gSFc/CisgKgorICogUmVnaXN0ZXIgOToKKyAqIFNldCB0byAweDAwIGZvciBJckRBLCB3aGVuIHRoZSBiYXVkcmF0ZSBpcyBpbml0aWFsaXNlZC4KKyAqCisgKiBSZWdpc3RlciBBOgorICogU2V0IHRvIDB4MDEgZm9yIElyREEsIGF0IGluaXQuCisgKgorICogUmVnaXN0ZXIgQjoKKyAqIFNldCB0byAweDAxIGZvciBJckRBLCAweDAwIGZvciBSUzIzMiwgYXQgaW5pdC4KKyAqCisgKiBSZWdpc3RlciBDOgorICogU2V0IHRvIDAwIGZvciBJckRBLCBhdCBpbml0LgorICoKKyAqIFJlZ2lzdGVyIEQ6CisgKiBTZXQgdG8gMHg0MSBmb3IgSXJEQSwgYXQgaW5pdC4KKyAqCisgKiBSZWdpc3RlciBFOgorICogU29tZWtpbmQgb2YgYmF1ZHJhdGUgb3ZlcnJpZGUuIFRoZSB3aW5kb3dzIGRyaXZlciBzZWVtcyB0byBzZXQKKyAqIHRoaXMgdG8gMHgwMCBmb3Igbm9ybWFsIGJhdWRyYXRlcywgMHgwMSBmb3IgNDYwODAwLCAweDAyIGZvciA5MjE2MDAuCisgKiBTaW5jZSA0NjA4MDAgYW5kIDkyMTYwMCBjYW5ub3QgYmUgb2J0YWluZWQgYnkgZGl2aWRpbmcgM01IeiBieSBhbiBpbnRlZ2VyLAorICogaXQgY291bGQgYmUgc29tZWtpbmQgb2Ygc3ViZGl2aXNvciB0aGluZ3kuCisgKiBIb3dldmVyLGl0IGRvZXMgbm90IHNlZW0gdG8gZG8gYW55dGhpbmc6IHNlbGVjdGluZyA5MjE2MDAgKGRpdmlzb3IgMywKKyAqIHJlZyBFPTIpLCBzdGlsbCBnZXRzIDEgTUh6LiBJIGFsc28gY2hlY2tlZCBpZiByZWdpc3RlcnMgOSwgQyBvciBGIHdvdWxkCisgKiB3b3JrLCBidXQgdGhleSBkb24ndC4KKyAqCisgKiBSZWdpc3RlciBGOiB1bmtub3duCisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKaW5kZXggZWJjYzZkMC4uZjk5NDk4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKQEAgLTU5OCw2ICs1OTgsMjAgQEAKIAl7IFVTQl9ERVZJQ0UoQkFOREJfVklELCBCQU5EQl9VU09UTDRfUElEKSB9LAogCXsgVVNCX0RFVklDRShCQU5EQl9WSUQsIEJBTkRCX1VTVEw0X1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoQkFOREJfVklELCBCQU5EQl9VU085TUwyX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoQkFOREJfVklELCBCQU5EQl9VU09QVEw0X1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoQkFOREJfVklELCBCQU5EQl9VU1BUTDRfUElEKSB9LAorCXsgVVNCX0RFVklDRShCQU5EQl9WSUQsIEJBTkRCX1VTTzlNTDJEUl8yX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoQkFOREJfVklELCBCQU5EQl9VU085TUwyRFJfUElEKSB9LAorCXsgVVNCX0RFVklDRShCQU5EQl9WSUQsIEJBTkRCX1VTT1BUTDREUjJfUElEKSB9LAorCXsgVVNCX0RFVklDRShCQU5EQl9WSUQsIEJBTkRCX1VTT1BUTDREUl9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEJBTkRCX1ZJRCwgQkFOREJfNDg1VVNCOUZfMldfUElEKSB9LAorCXsgVVNCX0RFVklDRShCQU5EQl9WSUQsIEJBTkRCXzQ4NVVTQjlGXzRXX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoQkFOREJfVklELCBCQU5EQl8yMzJVU0I5TV9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEJBTkRCX1ZJRCwgQkFOREJfNDg1VVNCVEJfMldfUElEKSB9LAorCXsgVVNCX0RFVklDRShCQU5EQl9WSUQsIEJBTkRCXzQ4NVVTQlRCXzRXX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoQkFOREJfVklELCBCQU5EQl9UVEw1VVNCOU1fUElEKSB9LAorCXsgVVNCX0RFVklDRShCQU5EQl9WSUQsIEJBTkRCX1RUTDNVU0I5TV9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEJBTkRCX1ZJRCwgQkFOREJfWlpfUFJPRzFfVVNCX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEVWRVJfRUNPX1BST19DRFMpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8xX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzJfUElEKSB9LApAQCAtMjE5NSwxNSArMjIwOSwyMSBAQAogCiAJLyogU2V0IG51bWJlciBvZiBkYXRhIGJpdHMsIHBhcml0eSwgc3RvcCBiaXRzICovCiAKLQl0ZXJtaW9zLT5jX2NmbGFnICY9IH5DTVNQQVI7Ci0KIAl1cmJfdmFsdWUgPSAwOwogCXVyYl92YWx1ZSB8PSAoY2ZsYWcgJiBDU1RPUEIgPyBGVERJX1NJT19TRVRfREFUQV9TVE9QX0JJVFNfMiA6CiAJCSAgICAgIEZURElfU0lPX1NFVF9EQVRBX1NUT1BfQklUU18xKTsKLQl1cmJfdmFsdWUgfD0gKGNmbGFnICYgUEFSRU5CID8KLQkJICAgICAgKGNmbGFnICYgUEFST0REID8gRlRESV9TSU9fU0VUX0RBVEFfUEFSSVRZX09ERCA6Ci0JCSAgICAgICBGVERJX1NJT19TRVRfREFUQV9QQVJJVFlfRVZFTikgOgotCQkgICAgICBGVERJX1NJT19TRVRfREFUQV9QQVJJVFlfTk9ORSk7CisJaWYgKGNmbGFnICYgUEFSRU5CKSB7CisJCWlmIChjZmxhZyAmIENNU1BBUikKKwkJCXVyYl92YWx1ZSB8PSBjZmxhZyAmIFBBUk9ERCA/CisJCQkJICAgICBGVERJX1NJT19TRVRfREFUQV9QQVJJVFlfTUFSSyA6CisJCQkJICAgICBGVERJX1NJT19TRVRfREFUQV9QQVJJVFlfU1BBQ0U7CisJCWVsc2UKKwkJCXVyYl92YWx1ZSB8PSBjZmxhZyAmIFBBUk9ERCA/CisJCQkJICAgICBGVERJX1NJT19TRVRfREFUQV9QQVJJVFlfT0REIDoKKwkJCQkgICAgIEZURElfU0lPX1NFVF9EQVRBX1BBUklUWV9FVkVOOworCX0gZWxzZSB7CisJCXVyYl92YWx1ZSB8PSBGVERJX1NJT19TRVRfREFUQV9QQVJJVFlfTk9ORTsKKwl9CiAJaWYgKGNmbGFnICYgQ1NJWkUpIHsKIAkJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CiAJCWNhc2UgQ1M1OiB1cmJfdmFsdWUgfD0gNTsgZGJnKCJTZXR0aW5nIENTNSIpOyBicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmgKaW5kZXggNmYzMWUwZC4uNDU4NmEyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmgKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmgKQEAgLTY2Miw2ICs2NjIsMjAgQEAKICNkZWZpbmUgQkFOREJfVVNPVEw0X1BJRAkweEFDMDEJLyogVVNPVEw0IElzb2xhdGVkIFJTLTQ4NSBDb252ZXJ0ZXIgKi8KICNkZWZpbmUgQkFOREJfVVNUTDRfUElECQkweEFDMDIJLyogVVNUTDQgUlMtNDg1IENvbnZlcnRlciAqLwogI2RlZmluZSBCQU5EQl9VU085TUwyX1BJRAkweEFDMDMJLyogVVNPOU1MMiBJc29sYXRlZCBSUy0yMzIgQ29udmVydGVyICovCisjZGVmaW5lIEJBTkRCX1VTT1BUTDRfUElECTB4QUMxMQorI2RlZmluZSBCQU5EQl9VU1BUTDRfUElECTB4QUMxMgorI2RlZmluZSBCQU5EQl9VU085TUwyRFJfMl9QSUQJMHhBQzE2CisjZGVmaW5lIEJBTkRCX1VTTzlNTDJEUl9QSUQJMHhBQzE3CisjZGVmaW5lIEJBTkRCX1VTT1BUTDREUjJfUElECTB4QUMxOAkvKiBVU09QVEw0Ui0yIDItcG9ydCBJc29sYXRlZCBSUy0yMzIgQ29udmVydGVyICovCisjZGVmaW5lIEJBTkRCX1VTT1BUTDREUl9QSUQJMHhBQzE5CisjZGVmaW5lIEJBTkRCXzQ4NVVTQjlGXzJXX1BJRAkweEFDMjUKKyNkZWZpbmUgQkFOREJfNDg1VVNCOUZfNFdfUElECTB4QUMyNgorI2RlZmluZSBCQU5EQl8yMzJVU0I5TV9QSUQJMHhBQzI3CisjZGVmaW5lIEJBTkRCXzQ4NVVTQlRCXzJXX1BJRAkweEFDMzMKKyNkZWZpbmUgQkFOREJfNDg1VVNCVEJfNFdfUElECTB4QUMzNAorI2RlZmluZSBCQU5EQl9UVEw1VVNCOU1fUElECTB4QUM0OQorI2RlZmluZSBCQU5EQl9UVEwzVVNCOU1fUElECTB4QUM1MAorI2RlZmluZSBCQU5EQl9aWl9QUk9HMV9VU0JfUElECTB4QkEwMgogCiAvKgogICogUk0gTWljaGFlbGlkZXMgQ0FOdmlldyBVU0IgKGh0dHA6Ly93d3cucm1jYW4uY29tKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKaW5kZXggZjExYWJmNS4uNDg1ZmE5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCkBAIC0xMjEsOCArMTIxLDE0IEBACiAgKiBtb3NjaGlwX2lkX3RhYmxlX2NvbWJpbmVkCiAgKi8KICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9CQU5EQiAgICAgICAgICAgICAweDA4NTYKLSNkZWZpbmUgQkFOREJfREVWSUNFX0lEX1VTT1BUTDRfNCAgICAgICAweEFDNDQKKyNkZWZpbmUgQkFOREJfREVWSUNFX0lEX1VTTzlNTDJfMgkweEFDMjIKKyNkZWZpbmUgQkFOREJfREVWSUNFX0lEX1VTTzlNTDJfNAkweEFDMjQKKyNkZWZpbmUgQkFOREJfREVWSUNFX0lEX1VTOU1MMl8yCTB4QUMyOQorI2RlZmluZSBCQU5EQl9ERVZJQ0VfSURfVVM5TUwyXzQJMHhBQzMwCisjZGVmaW5lIEJBTkRCX0RFVklDRV9JRF9VU1BUTDRfMgkweEFDMzEKKyNkZWZpbmUgQkFOREJfREVWSUNFX0lEX1VTUFRMNF80CTB4QUMzMgogI2RlZmluZSBCQU5EQl9ERVZJQ0VfSURfVVNPUFRMNF8yICAgICAgIDB4QUM0MgorI2RlZmluZSBCQU5EQl9ERVZJQ0VfSURfVVNPUFRMNF80ICAgICAgIDB4QUM0NAogCiAvKiBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzCiAgKiBBVEVOIFVDMjMyNCBkZXZpY2UgdXNpbmcgTW9zY2hpcCBNQ1M3ODQwCkBAIC0xNzcsOCArMTgzLDE0IEBACiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgbW9zY2hpcF9wb3J0X2lkX3RhYmxlW10gPSB7CiAJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NT1NDSElQLCBNT1NDSElQX0RFVklDRV9JRF83ODQwKX0sCiAJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NT1NDSElQLCBNT1NDSElQX0RFVklDRV9JRF83ODIwKX0sCi0Je1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CQU5EQiwgQkFOREJfREVWSUNFX0lEX1VTT1BUTDRfNCl9LAorCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQkFOREIsIEJBTkRCX0RFVklDRV9JRF9VU085TUwyXzIpfSwKKwl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JBTkRCLCBCQU5EQl9ERVZJQ0VfSURfVVNPOU1MMl80KX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CQU5EQiwgQkFOREJfREVWSUNFX0lEX1VTOU1MMl8yKX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CQU5EQiwgQkFOREJfREVWSUNFX0lEX1VTOU1MMl80KX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CQU5EQiwgQkFOREJfREVWSUNFX0lEX1VTUFRMNF8yKX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CQU5EQiwgQkFOREJfREVWSUNFX0lEX1VTUFRMNF80KX0sCiAJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CQU5EQiwgQkFOREJfREVWSUNFX0lEX1VTT1BUTDRfMil9LAorCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQkFOREIsIEJBTkRCX0RFVklDRV9JRF9VU09QVEw0XzQpfSwKIAl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FURU5JTlRMLCBBVEVOSU5UTF9ERVZJQ0VfSURfVUMyMzI0KX0sCiAJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BVEVOSU5UTCwgQVRFTklOVExfREVWSUNFX0lEX1VDMjMyMil9LAogCXt9CQkJLyogdGVybWluYXRpbmcgZW50cnkgKi8KQEAgLTE4Nyw4ICsxOTksMTQgQEAKIHN0YXRpYyBfX2RldmluaXRkYXRhIHN0cnVjdCB1c2JfZGV2aWNlX2lkIG1vc2NoaXBfaWRfdGFibGVfY29tYmluZWRbXSA9IHsKIAl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01PU0NISVAsIE1PU0NISVBfREVWSUNFX0lEXzc4NDApfSwKIAl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01PU0NISVAsIE1PU0NISVBfREVWSUNFX0lEXzc4MjApfSwKLQl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JBTkRCLCBCQU5EQl9ERVZJQ0VfSURfVVNPUFRMNF80KX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CQU5EQiwgQkFOREJfREVWSUNFX0lEX1VTTzlNTDJfMil9LAorCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQkFOREIsIEJBTkRCX0RFVklDRV9JRF9VU085TUwyXzQpfSwKKwl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JBTkRCLCBCQU5EQl9ERVZJQ0VfSURfVVM5TUwyXzIpfSwKKwl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JBTkRCLCBCQU5EQl9ERVZJQ0VfSURfVVM5TUwyXzQpfSwKKwl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JBTkRCLCBCQU5EQl9ERVZJQ0VfSURfVVNQVEw0XzIpfSwKKwl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JBTkRCLCBCQU5EQl9ERVZJQ0VfSURfVVNQVEw0XzQpfSwKIAl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JBTkRCLCBCQU5EQl9ERVZJQ0VfSURfVVNPUFRMNF8yKX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CQU5EQiwgQkFOREJfREVWSUNFX0lEX1VTT1BUTDRfNCl9LAogCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVRFTklOVEwsIEFURU5JTlRMX0RFVklDRV9JRF9VQzIzMjQpfSwKIAl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FURU5JTlRMLCBBVEVOSU5UTF9ERVZJQ0VfSURfVUMyMzIyKX0sCiAJe30JCQkvKiB0ZXJtaW5hdGluZyBlbnRyeSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGljb24uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpY29uLmMKaW5kZXggODBmNTliNi4uNGNkYjk3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGljb24uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aWNvbi5jCkBAIC01MDEsMTIgKzUwMSwxMyBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSBzZXJpYWwtPnBvcnRbMF07CiAJaW50IHJlc3VsdDsKIAotCW11dGV4X2xvY2soJnBvcnQtPm11dGV4KTsKLQlpZiAocG9ydC0+cG9ydC5jb3VudCkKKwltdXRleF9sb2NrKCZwb3J0LT5wb3J0Lm11dGV4KTsKKwkvKiBUaGlzIGlzIHByb3RlY3RlZCBieSB0aGUgcG9ydCBtdXRleCBhZ2FpbnN0IGNsb3NlL29wZW4gKi8KKwlpZiAodGVzdF9iaXQoQVNZTkNCX0lOSVRJQUxJWkVELCAmcG9ydC0+cG9ydC5mbGFncykpCiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHByaXYtPmJ1bGtfcmVhZF91cmIsIEdGUF9OT0lPKTsKIAllbHNlCiAJCXJlc3VsdCA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCZwb3J0LT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZwb3J0LT5wb3J0Lm11dGV4KTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKaW5kZXggMDU3N2U0Yi4uOWEyYjkwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwpAQCAtNTgwLDEyICs1ODAsNDggQEAKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDA4NiwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MjAwMiwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MjAwMywgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDEwNCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDEwNiwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDEwOCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDExMywgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDExNywgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDExOCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDEyMSwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDEyMiwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDEyMywgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDEyNCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDEyNSwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDEyNiwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDEyOCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE0MiwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE0MywgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE0NCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE0NSwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE0NiwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE0NywgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE0OCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE0OSwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE1MCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE1MSwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE1MiwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE1MywgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE1NCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE1NSwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE1NiwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE1NywgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE1OCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE1OSwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE2MCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE2MSwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE2MiwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDAxNCwgMHhmZiwgMHhmZiwgMHhmZikgfSwgLyogWlRFIENETUEgcHJvZHVjdHMgKi8KIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDAyNywgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDA1OSwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDA2MCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDA3MCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDA3MywgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDEzMCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDE0MSwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIFpURV9QUk9EVUNUX0NETUFfVEVDSCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIFpURV9QUk9EVUNUX0FDODcxMCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIFpURV9QUk9EVUNUX0FDMjcyNiwgMHhmZiwgMHhmZiwgMHhmZikgfSwKQEAgLTU5OSw2ICs2MzUsNyBAQAogCXsgVVNCX0RFVklDRShUT1NISUJBX1ZFTkRPUl9JRCwgVE9TSElCQV9QUk9EVUNUX0c0NTApIH0sCiAJeyBVU0JfREVWSUNFKFRPU0hJQkFfVkVORE9SX0lELCBUT1NISUJBX1BST0RVQ1RfSFNEUEFfTUlOSUNBUkQgKSB9LCAvKiBUb3NoaWJhIDNHIEhTRFBBID09IE5vdmF0ZWwgRXhwZWRpdGUgRVU4NzBEIE1pbmlDYXJkICovCiAJeyBVU0JfREVWSUNFKEFMSU5LX1ZFTkRPUl9JRCwgMHg5MDAwKSB9LAorCXsgVVNCX0RFVklDRShBTElOS19WRU5ET1JfSUQsIDB4Y2UxNikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKEFMSU5LX1ZFTkRPUl9JRCwgQUxJTktfUFJPRFVDVF8zR1UsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCiAJeyBVU0JfREVWSUNFKEFMQ0FURUxfVkVORE9SX0lELCBBTENBVEVMX1BST0RVQ1RfWDA2MFMpIH0sCiAJeyBVU0JfREVWSUNFKEFJUlBMVVNfVkVORE9SX0lELCBBSVJQTFVTX1BST0RVQ1RfTUNENjUwKSB9LApAQCAtMTMxMiw3ICsxMzQ5LDcgQEAKIAogCWRiZygiJXMgZW50ZXJlZCIsIF9fZnVuY19fKTsKIAotCWlmIChzZXJpYWwtPmRldi0+YXV0b19wbSkgeworCWlmIChtZXNzYWdlLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykgewogCQlzcGluX2xvY2tfaXJxKCZpbnRmZGF0YS0+c3VzcF9sb2NrKTsKIAkJYiA9IGludGZkYXRhLT5pbl9mbGlnaHQ7CiAJCXNwaW5fdW5sb2NrX2lycSgmaW50ZmRhdGEtPnN1c3BfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvc2llcnJhLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc2llcnJhLmMKaW5kZXggNTAxOTMyNS4uYWMxYjY0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3NpZXJyYS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zaWVycmEuYwpAQCAtMTYsOCArMTYsOSBAQAogICBQb3J0aW9ucyBiYXNlZCBvbiB0aGUgb3B0aW9uIGRyaXZlciBieSBNYXR0aGlhcyBVcmxpY2hzIDxzbXVyZkBzbXVyZi5ub3Jpcy5kZT4KICAgV2hvbSBiYXNlZCBoaXMgb24gdGhlIEtleXNwYW4gZHJpdmVyIGJ5IEh1Z2ggQmxlbWluZ3MgPGh1Z2hAYmxlbWluZ3Mub3JnPgogKi8KLQotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidi4xLjMuOCIKKy8qIFVuY29tbWVudCB0byBsb2cgZnVuY3Rpb24gY2FsbHMgKi8KKy8qICNkZWZpbmUgREVCVUcgKi8KKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYuMS43LjE2IgogI2RlZmluZSBEUklWRVJfQVVUSE9SICJLZXZpbiBMbG95ZCwgRWxpbmEgUGFzaGV2YSwgTWF0dGhldyBTYWZhciwgUm9yeSBGaWxlciIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiBEcml2ZXIgZm9yIFNpZXJyYSBXaXJlbGVzcyBVU0IgbW9kZW1zIgogCkBAIC0zMyw4ICszNCwxMCBAQAogI2RlZmluZSBTV0lNU19VU0JfUkVRVUVTVF9TZXRQb3dlcgkweDAwCiAjZGVmaW5lIFNXSU1TX1VTQl9SRVFVRVNUX1NldE5tZWEJMHgwNwogCi0jZGVmaW5lIE5fSU5fVVJCCTgKLSNkZWZpbmUgTl9PVVRfVVJCCTY0CisjZGVmaW5lIE5fSU5fVVJCX0hNCTgKKyNkZWZpbmUgTl9PVVRfVVJCX0hNCTY0CisjZGVmaW5lIE5fSU5fVVJCCTQKKyNkZWZpbmUgTl9PVVRfVVJCCTQKICNkZWZpbmUgSU5fQlVGTEVOCTQwOTYKIAogI2RlZmluZSBNQVhfVFJBTlNGRVIJCShQQUdFX1NJWkUgLSA1MTIpCkBAIC0xMjQsNiArMTI3LDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaXNfaGltZW1vcnkoY29uc3QgdTggaWZudW0sCisJCQkJY29uc3Qgc3RydWN0IHNpZXJyYV9pZmFjZV9pbmZvICpoaW1lbW9yeWxpc3QpCit7CisJY29uc3QgdTggICppbmZvOworCWludCBpOworCisJaWYgKGhpbWVtb3J5bGlzdCkgeworCQlpbmZvID0gaGltZW1vcnlsaXN0LT5pZmFjZWluZm87CisKKwkJZm9yIChpPTA7IGkgPCBoaW1lbW9yeWxpc3QtPmluZm9sZW47IGkrKykgeworCQkJaWYgKGluZm9baV0gPT0gaWZudW0pCisJCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgc2llcnJhX2NhbGNfaW50ZXJmYWNlKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7CiAJaW50IGludGVyZmFjZTsKQEAgLTE4Niw2ICsyMDYsMjAgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCisvKiBpbnRlcmZhY2VzIHdpdGggaGlnaGVyIG1lbW9yeSByZXF1aXJlbWVudHMgKi8KK3N0YXRpYyBjb25zdCB1OCBoaV9tZW1vcnlfdHlwZUFfaWZhY2VzW10gPSB7IDAsIDIgfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2llcnJhX2lmYWNlX2luZm8gdHlwZUFfaW50ZXJmYWNlX2xpc3QgPSB7CisJLmluZm9sZW4gPSBBUlJBWV9TSVpFKGhpX21lbW9yeV90eXBlQV9pZmFjZXMpLAorCS5pZmFjZWluZm8gPSBoaV9tZW1vcnlfdHlwZUFfaWZhY2VzLAorfTsKKworc3RhdGljIGNvbnN0IHU4IGhpX21lbW9yeV90eXBlQl9pZmFjZXNbXSA9IHsgMywgNCwgNSwgNiB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBzaWVycmFfaWZhY2VfaW5mbyB0eXBlQl9pbnRlcmZhY2VfbGlzdCA9IHsKKwkuaW5mb2xlbiA9IEFSUkFZX1NJWkUoaGlfbWVtb3J5X3R5cGVCX2lmYWNlcyksCisJLmlmYWNlaW5mbyA9IGhpX21lbW9yeV90eXBlQl9pZmFjZXMsCit9OworCisvKiAnYmxhY2tsaXN0JyBvZiBpbnRlcmZhY2VzIG5vdCBzZXJ2ZWQgYnkgdGhpcyBkcml2ZXIgKi8KIHN0YXRpYyBjb25zdCB1OCBkaXJlY3RfaXBfbm9uX3NlcmlhbF9pZmFjZXNbXSA9IHsgNywgOCwgOSwgMTAsIDExIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNpZXJyYV9pZmFjZV9pbmZvIGRpcmVjdF9pcF9pbnRlcmZhY2VfYmxhY2tsaXN0ID0gewogCS5pbmZvbGVuID0gQVJSQVlfU0laRShkaXJlY3RfaXBfbm9uX3NlcmlhbF9pZmFjZXMpLApAQCAtMjg2LDggKzMyMCwxMCBAQAogCXN0cnVjdCB1c2JfYW5jaG9yIGFjdGl2ZTsKIAlzdHJ1Y3QgdXNiX2FuY2hvciBkZWxheWVkOwogCisJaW50IG51bV9vdXRfdXJiczsKKwlpbnQgbnVtX2luX3VyYnM7CiAJLyogSW5wdXQgZW5kcG9pbnRzIGFuZCBidWZmZXJzIGZvciB0aGlzIHBvcnQgKi8KLQlzdHJ1Y3QgdXJiICppbl91cmJzW05fSU5fVVJCXTsKKwlzdHJ1Y3QgdXJiICppbl91cmJzW05fSU5fVVJCX0hNXTsKIAogCS8qIFNldHRpbmdzIGZvciB0aGUgcG9ydCAqLwogCWludCBydHNfc3RhdGU7CS8qIEhhbmRzaGFraW5nIHBpbnMgKG91dHB1dHMpICovCkBAIC00NjAsNyArNDk2LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydGRhdGEtPmxvY2ssIGZsYWdzKTsKIAlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIG91dHN0YW5kaW5nX3VyYnM6ICVkXG4iLCBfX2Z1bmNfXywKIAkJcG9ydGRhdGEtPm91dHN0YW5kaW5nX3VyYnMpOwotCWlmIChwb3J0ZGF0YS0+b3V0c3RhbmRpbmdfdXJicyA+IE5fT1VUX1VSQikgeworCWlmIChwb3J0ZGF0YS0+b3V0c3RhbmRpbmdfdXJicyA+IHBvcnRkYXRhLT5udW1fb3V0X3VyYnMpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydGRhdGEtPmxvY2ssIGZsYWdzKTsKIAkJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSB3cml0ZSBsaW1pdCBoaXRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CkBAIC02NjUsNyArNzAxLDcgQEAKIAkvKiB0cnkgdG8gZ2l2ZSBhIGdvb2QgbnVtYmVyIGJhY2sgYmFzZWQgb24gaWYgd2UgaGF2ZSBhbnkgZnJlZSB1cmJzIGF0CiAJICogdGhpcyBwb2ludCBpbiB0aW1lICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnRkYXRhLT5sb2NrLCBmbGFncyk7Ci0JaWYgKHBvcnRkYXRhLT5vdXRzdGFuZGluZ191cmJzID4gTl9PVVRfVVJCICogMiAvIDMpIHsKKwlpZiAocG9ydGRhdGEtPm91dHN0YW5kaW5nX3VyYnMgPiAocG9ydGRhdGEtPm51bV9vdXRfdXJicyAqIDIpIC8gMykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0ZGF0YS0+bG9jaywgZmxhZ3MpOwogCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIHdyaXRlIGxpbWl0IGhpdFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKQEAgLTY4MCw3ICs3MTYsNyBAQAogCWludCBpOwogCXN0cnVjdCBzaWVycmFfcG9ydF9wcml2YXRlICpwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBvcnRkYXRhLT5pbl91cmJzKTsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBwb3J0ZGF0YS0+bnVtX2luX3VyYnM7IGkrKykKIAkJdXNiX2tpbGxfdXJiKHBvcnRkYXRhLT5pbl91cmJzW2ldKTsKIAogCXVzYl9raWxsX3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKTsKQEAgLTY5NSw3ICs3MzEsNyBAQAogCXN0cnVjdCBzaWVycmFfcG9ydF9wcml2YXRlICpwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAogCW9rX2NudCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG9ydGRhdGEtPmluX3VyYnMpOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgcG9ydGRhdGEtPm51bV9pbl91cmJzOyBpKyspIHsKIAkJdXJiID0gcG9ydGRhdGEtPmluX3VyYnNbaV07CiAJCWlmICghdXJiKQogCQkJY29udGludWU7CkBAIC03OTEsNyArODI3LDcgQEAKIAkJLyogU3RvcCByZWFkaW5nIHVyYnMgKi8KIAkJc2llcnJhX3N0b3BfcnhfdXJicyhwb3J0KTsKIAkJLyogLi4gYW5kIHJlbGVhc2UgdGhlbSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgTl9JTl9VUkI7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgcG9ydGRhdGEtPm51bV9pbl91cmJzOyBpKyspIHsKIAkJCXNpZXJyYV9yZWxlYXNlX3VyYihwb3J0ZGF0YS0+aW5fdXJic1tpXSk7CiAJCQlwb3J0ZGF0YS0+aW5fdXJic1tpXSA9IE5VTEw7CiAJCX0KQEAgLTgxOCw3ICs4NTQsNyBAQAogCiAKIAllbmRwb2ludCA9IHBvcnQtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyZXNzOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBvcnRkYXRhLT5pbl91cmJzKTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHBvcnRkYXRhLT5udW1faW5fdXJiczsgaSsrKSB7CiAJCXVyYiA9IHNpZXJyYV9zZXR1cF91cmIoc2VyaWFsLCBlbmRwb2ludCwgVVNCX0RJUl9JTiwgcG9ydCwKIAkJCQkJSU5fQlVGTEVOLCBHRlBfS0VSTkVMLAogCQkJCQlzaWVycmFfaW5kYXRfY2FsbGJhY2spOwpAQCAtODY5LDcgKzkwNSw5IEBACiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKIAlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CisJc3RydWN0IHNpZXJyYV9pZmFjZV9pbmZvICpoaW1lbW9yeXAgPSBOVUxMOwogCWludCBpOworCXU4IGlmbnVtOwogCiAJZGV2X2RiZygmc2VyaWFsLT5kZXYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKQEAgLTg4NiwxMyArOTI0LDQwIEBACiAJCXBvcnRkYXRhID0ga3phbGxvYyhzaXplb2YoKnBvcnRkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcG9ydGRhdGEpIHsKIAkJCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzOiBrbWFsbG9jIGZvciAiCi0JCQkJInNpZXJyYV9wb3J0X3ByaXZhdGUgKCVkKSBmYWlsZWQhLlxuIiwKKwkJCQkic2llcnJhX3BvcnRfcHJpdmF0ZSAoJWQpIGZhaWxlZCFcbiIsCiAJCQkJX19mdW5jX18sIGkpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJc3Bpbl9sb2NrX2luaXQoJnBvcnRkYXRhLT5sb2NrKTsKIAkJaW5pdF91c2JfYW5jaG9yKCZwb3J0ZGF0YS0+YWN0aXZlKTsKIAkJaW5pdF91c2JfYW5jaG9yKCZwb3J0ZGF0YS0+ZGVsYXllZCk7CisJCWlmbnVtID0gaTsKKwkJLyogQXNzdW1lIGxvdyBtZW1vcnkgcmVxdWlyZW1lbnRzICovCisJCXBvcnRkYXRhLT5udW1fb3V0X3VyYnMgPSBOX09VVF9VUkI7CisJCXBvcnRkYXRhLT5udW1faW5fdXJicyAgPSBOX0lOX1VSQjsKKworCQkvKiBEZXRlcm1pbmUgYWN0dWFsIG1lbW9yeSByZXF1aXJlbWVudHMgKi8KKwkJaWYgKHNlcmlhbC0+bnVtX3BvcnRzID09IDEpIHsKKwkJCS8qIEdldCBpbnRlcmZhY2UgbnVtYmVyIGZvciBjb21wb3NpdGUgZGV2aWNlICovCisJCQlpZm51bSA9IHNpZXJyYV9jYWxjX2ludGVyZmFjZShzZXJpYWwpOworCQkJaGltZW1vcnlwID0KKwkJCSAgICAoc3RydWN0IHNpZXJyYV9pZmFjZV9pbmZvICopJnR5cGVCX2ludGVyZmFjZV9saXN0OworCQkJaWYgKGlzX2hpbWVtb3J5KGlmbnVtLCBoaW1lbW9yeXApKSB7CisJCQkJcG9ydGRhdGEtPm51bV9vdXRfdXJicyA9IE5fT1VUX1VSQl9ITTsKKwkJCQlwb3J0ZGF0YS0+bnVtX2luX3VyYnMgID0gTl9JTl9VUkJfSE07CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQloaW1lbW9yeXAgPQorCQkJICAgIChzdHJ1Y3Qgc2llcnJhX2lmYWNlX2luZm8gKikmdHlwZUFfaW50ZXJmYWNlX2xpc3Q7CisJCQlpZiAoaXNfaGltZW1vcnkoaSwgaGltZW1vcnlwKSkgeworCQkJCXBvcnRkYXRhLT5udW1fb3V0X3VyYnMgPSBOX09VVF9VUkJfSE07CisJCQkJcG9ydGRhdGEtPm51bV9pbl91cmJzICA9IE5fSU5fVVJCX0hNOworCQkJfQorCQl9CisJCWRldl9kYmcoJnNlcmlhbC0+ZGV2LT5kZXYsCisJCQkiTWVtb3J5IHVzYWdlICh1cmJzKSBpbnRlcmZhY2UgIyVkLCBpbj0lZCwgb3V0PSVkXG4iLAorCQkJaWZudW0scG9ydGRhdGEtPm51bV9pbl91cmJzLCBwb3J0ZGF0YS0+bnVtX291dF91cmJzICk7CiAJCS8qIFNldCB0aGUgcG9ydCBwcml2YXRlIGRhdGEgcG9pbnRlciAqLwogCQl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCwgcG9ydGRhdGEpOwogCX0KQEAgLTk0MCw3ICsxMDA1LDcgQEAKIAlzdHJ1Y3Qgc2llcnJhX2ludGZfcHJpdmF0ZSAqaW50ZmRhdGE7CiAJaW50IGI7CiAKLQlpZiAoc2VyaWFsLT5kZXYtPmF1dG9fcG0pIHsKKwlpZiAobWVzc2FnZS5ldmVudCAmIFBNX0VWRU5UX0FVVE8pIHsKIAkJaW50ZmRhdGEgPSBzZXJpYWwtPnByaXZhdGU7CiAJCXNwaW5fbG9ja19pcnEoJmludGZkYXRhLT5zdXNwX2xvY2spOwogCQliID0gaW50ZmRhdGEtPmluX2ZsaWdodDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCmluZGV4IGJkM2ZhN2YuLjQ1NDNmMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYwpAQCAtMjQ3LDk2ICsyNDcsNjYgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW50IHNlcmlhbF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIGludCBzZXJpYWxfYWN0aXZhdGUoc3RydWN0IHR0eV9wb3J0ICp0cG9ydCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0KKwkJY29udGFpbmVyX29mKHRwb3J0LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0LCBwb3J0KTsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCWludCByZXR2YWw7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwotCi0Jc3Bpbl9sb2NrX2lycSgmcG9ydC0+cG9ydC5sb2NrKTsKLQlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCi0JCSsrcG9ydC0+cG9ydC5jb3VudDsKLQlzcGluX3VubG9ja19pcnEoJnBvcnQtPnBvcnQubG9jayk7Ci0JdHR5X3BvcnRfdHR5X3NldCgmcG9ydC0+cG9ydCwgdHR5KTsKLQotCS8qIERvIHRoZSBkZXZpY2Utc3BlY2lmaWMgb3BlbiBvbmx5IGlmIHRoZSBoYXJkd2FyZSBpc24ndAotCSAqIGFscmVhZHkgaW5pdGlhbGl6ZWQuCi0JICovCi0JaWYgKCF0ZXN0X2JpdChBU1lOQ0JfSU5JVElBTElaRUQsICZwb3J0LT5wb3J0LmZsYWdzKSkgewotCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwb3J0LT5tdXRleCkpCi0JCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCQltdXRleF9sb2NrKCZzZXJpYWwtPmRpc2NfbXV0ZXgpOwotCQlpZiAoc2VyaWFsLT5kaXNjb25uZWN0ZWQpCi0JCQlyZXR2YWwgPSAtRU5PREVWOwotCQllbHNlCi0JCQlyZXR2YWwgPSBwb3J0LT5zZXJpYWwtPnR5cGUtPm9wZW4odHR5LCBwb3J0KTsKLQkJbXV0ZXhfdW5sb2NrKCZzZXJpYWwtPmRpc2NfbXV0ZXgpOwotCQltdXRleF91bmxvY2soJnBvcnQtPm11dGV4KTsKLQkJaWYgKHJldHZhbCkKLQkJCXJldHVybiByZXR2YWw7Ci0JCXNldF9iaXQoQVNZTkNCX0lOSVRJQUxJWkVELCAmcG9ydC0+cG9ydC5mbGFncyk7Ci0JfQotCi0JLyogTm93IGRvIHRoZSBjb3JyZWN0IHR0eSBsYXllciBzZW1hbnRpY3MgKi8KLQlyZXR2YWwgPSB0dHlfcG9ydF9ibG9ja190aWxfcmVhZHkoJnBvcnQtPnBvcnQsIHR0eSwgZmlscCk7CisJbXV0ZXhfbG9jaygmc2VyaWFsLT5kaXNjX211dGV4KTsKKwlpZiAoc2VyaWFsLT5kaXNjb25uZWN0ZWQpCisJCXJldHZhbCA9IC1FTk9ERVY7CisJZWxzZQorCQlyZXR2YWwgPSBwb3J0LT5zZXJpYWwtPnR5cGUtPm9wZW4odHR5LCBwb3J0KTsKKwltdXRleF91bmxvY2soJnNlcmlhbC0+ZGlzY19tdXRleCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIAorc3RhdGljIGludCBzZXJpYWxfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CisJcmV0dXJuIHR0eV9wb3J0X29wZW4oJnBvcnQtPnBvcnQsIHR0eSwgZmlscCk7Cit9CisKIC8qKgogICogc2VyaWFsX2Rvd24gLSBzaHV0IGRvd24gaGFyZHdhcmUKLSAqIEBwb3J0OiBwb3J0IHRvIHNodXQgZG93bgorICogQHRwb3J0OiB0dHkgcG9ydCB0byBzaHV0IGRvd24KICAqCiAgKiBTaHV0IGRvd24gYSBVU0Igc2VyaWFsIHBvcnQgdW5sZXNzIGl0IGlzIHRoZSBjb25zb2xlLiAgV2UgbmV2ZXIKLSAqIHNodXQgZG93biB0aGUgY29uc29sZSBoYXJkd2FyZSBhcyBpdCB3aWxsIGFsd2F5cyBiZSBpbiB1c2UuCisgKiBzaHV0IGRvd24gdGhlIGNvbnNvbGUgaGFyZHdhcmUgYXMgaXQgd2lsbCBhbHdheXMgYmUgaW4gdXNlLiBTZXJpYWxpemVkCisgKiBhZ2FpbnN0IGFjdGl2YXRlIGJ5IHRoZSB0cG9ydCBtdXRleCBhbmQga2VwdCB0byBtYXRjaGluZyBvcGVuL2Nsb3NlIHBhaXJzCisgKiBvZiBjYWxscyBieSB0aGUgQVNZTkNCX0lOSVRJQUxJWkVEIGZsYWcuCiAgKi8KLXN0YXRpYyB2b2lkIHNlcmlhbF9kb3duKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCitzdGF0aWMgdm9pZCBzZXJpYWxfZG93bihzdHJ1Y3QgdHR5X3BvcnQgKnRwb3J0KQogeworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPQorCQljb250YWluZXJfb2YodHBvcnQsIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQsIHBvcnQpOwogCXN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciAqZHJ2ID0gcG9ydC0+c2VyaWFsLT50eXBlOwotCiAJLyoKIAkgKiBUaGUgY29uc29sZSBpcyBtYWdpY2FsLiAgRG8gbm90IGhhbmcgdXAgdGhlIGNvbnNvbGUgaGFyZHdhcmUKIAkgKiBvciB0aGVyZSB3aWxsIGJlIHRlYXJzLgogCSAqLwogCWlmIChwb3J0LT5jb25zb2xlKQogCQlyZXR1cm47Ci0KLQkvKiBEb24ndCBjYWxsIHRoZSBjbG9zZSBtZXRob2QgaWYgdGhlIGhhcmR3YXJlIGhhc24ndCBiZWVuCi0JICogaW5pdGlhbGl6ZWQuCi0JICovCi0JaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoQVNZTkNCX0lOSVRJQUxJWkVELCAmcG9ydC0+cG9ydC5mbGFncykpCi0JCXJldHVybjsKLQotCW11dGV4X2xvY2soJnBvcnQtPm11dGV4KTsKIAlpZiAoZHJ2LT5jbG9zZSkKIAkJZHJ2LT5jbG9zZShwb3J0KTsKLQltdXRleF91bmxvY2soJnBvcnQtPm11dGV4KTsKIH0KIAogc3RhdGljIHZvaWQgc2VyaWFsX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwotCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKLQotCXNlcmlhbF9kb3duKHBvcnQpOwogCXR0eV9wb3J0X2hhbmd1cCgmcG9ydC0+cG9ydCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNlcmlhbF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKLQogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7Ci0KLQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkKLQkJcmV0dXJuOwotCWlmICh0dHlfcG9ydF9jbG9zZV9zdGFydCgmcG9ydC0+cG9ydCwgdHR5LCBmaWxwKSA9PSAwKQotCQlyZXR1cm47Ci0Jc2VyaWFsX2Rvd24ocG9ydCk7Ci0JdHR5X3BvcnRfY2xvc2VfZW5kKCZwb3J0LT5wb3J0LCB0dHkpOwotCXR0eV9wb3J0X3R0eV9zZXQoJnBvcnQtPnBvcnQsIE5VTEwpOworCXR0eV9wb3J0X2Nsb3NlKCZwb3J0LT5wb3J0LCB0dHksIGZpbHApOwogfQogCiAvKioKQEAgLTcyNSw2ICs2OTUsOCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfcG9ydF9vcGVyYXRpb25zIHNlcmlhbF9wb3J0X29wcyA9IHsKIAkuY2Fycmllcl9yYWlzZWQgPSBzZXJpYWxfY2Fycmllcl9yYWlzZWQsCiAJLmR0cl9ydHMgPSBzZXJpYWxfZHRyX3J0cywKKwkuYWN0aXZhdGUgPSBzZXJpYWxfYWN0aXZhdGUsCisJLnNodXRkb3duID0gc2VyaWFsX2Rvd24sCiB9OwogCiBpbnQgdXNiX3NlcmlhbF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLApAQCAtOTIzLDcgKzg5NSw4IEBACiAJCXBvcnQtPnBvcnQub3BzID0gJnNlcmlhbF9wb3J0X29wczsKIAkJcG9ydC0+c2VyaWFsID0gc2VyaWFsOwogCQlzcGluX2xvY2tfaW5pdCgmcG9ydC0+bG9jayk7Ci0JCW11dGV4X2luaXQoJnBvcnQtPm11dGV4KTsKKwkJLyogS2VlcCB0aGlzIGZvciBwcml2YXRlIGRyaXZlciB1c2UgZm9yIHRoZSBtb21lbnQgYnV0CisJCSAgIHNob3VsZCBwcm9iYWJseSBnbyBhd2F5ICovCiAJCUlOSVRfV09SSygmcG9ydC0+d29yaywgdXNiX3NlcmlhbF9wb3J0X3dvcmspOwogCQlzZXJpYWwtPnBvcnRbaV0gPSBwb3J0OwogCQlwb3J0LT5kZXYucGFyZW50ID0gJmludGVyZmFjZS0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jCmluZGV4IGNmYTI2ZDUuLmU1ZTZkZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMKQEAgLTczLDcgKzczLDggQEAKIAogc3RhdGljIGNvbnN0IGNoYXIqIGhvc3RfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQogewotCXJldHVybiAiU0NTSSBlbXVsYXRpb24gZm9yIFVTQiBNYXNzIFN0b3JhZ2UgZGV2aWNlcyI7CisJc3RydWN0IHVzX2RhdGEgKnVzID0gaG9zdF90b191cyhob3N0KTsKKwlyZXR1cm4gdXMtPnNjc2lfbmFtZTsKIH0KIAogc3RhdGljIGludCBzbGF2ZV9hbGxvYyAoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKaW5kZXggNTg5ZjZiNC4uY2MzMTNkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCkBAIC02NjYsMTAgKzY2NiwxMSBAQAogCSAqIHRvIHdhaXQgZm9yIGF0IGxlYXN0IG9uZSBDSEVDS19DT05ESVRJT04gdG8gZGV0ZXJtaW5lCiAJICogU0FORV9TRU5TRSBzdXBwb3J0CiAJICovCi0JaWYgKChzcmItPmNtbmRbMF0gPT0gQVRBXzE2IHx8IHNyYi0+Y21uZFswXSA9PSBBVEFfMTIpICYmCisJaWYgKHVubGlrZWx5KChzcmItPmNtbmRbMF0gPT0gQVRBXzE2IHx8IHNyYi0+Y21uZFswXSA9PSBBVEFfMTIpICYmCiAJICAgIHJlc3VsdCA9PSBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRCAmJgogCSAgICAhKHVzLT5mZmxhZ3MgJiBVU19GTF9TQU5FX1NFTlNFKSAmJgotCSAgICAhKHNyYi0+Y21uZFsyXSAmIDB4MjApKSB7CisJICAgICEodXMtPmZmbGFncyAmIFVTX0ZMX0JBRF9TRU5TRSkgJiYKKwkgICAgIShzcmItPmNtbmRbMl0gJiAweDIwKSkpIHsKIAkJVVNfREVCVUdQKCItLSBTQVQgc3VwcG9ydGVkLCBpbmNyZWFzaW5nIGF1dG8tc2Vuc2VcbiIpOwogCQl1cy0+ZmZsYWdzIHw9IFVTX0ZMX1NBTkVfU0VOU0U7CiAJfQpAQCAtNzE4LDYgKzcxOSwxMiBAQAogCQlpZiAodGVzdF9iaXQoVVNfRkxJRFhfVElNRURfT1VULCAmdXMtPmRmbGFncykpIHsKIAkJCVVTX0RFQlVHUCgiLS0gYXV0by1zZW5zZSBhYm9ydGVkXG4iKTsKIAkJCXNyYi0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworCisJCQkvKiBJZiBTQU5FX1NFTlNFIGNhdXNlZCB0aGlzIHByb2JsZW0sIGRpc2FibGUgaXQgKi8KKwkJCWlmIChzZW5zZV9zaXplICE9IFVTX1NFTlNFX1NJWkUpIHsKKwkJCQl1cy0+ZmZsYWdzICY9IH5VU19GTF9TQU5FX1NFTlNFOworCQkJCXVzLT5mZmxhZ3MgfD0gVVNfRkxfQkFEX1NFTlNFOworCQkJfQogCQkJZ290byBIYW5kbGVfRXJyb3JzOwogCQl9CiAKQEAgLTcyNywxMCArNzM0LDExIEBACiAJCSAqIChzbWFsbCkgc2Vuc2UgcmVxdWVzdC4gVGhpcyBmaXhlcyBzb21lIFVTQiBHU00gbW9kZW1zCiAJCSAqLwogCQlpZiAodGVtcF9yZXN1bHQgPT0gVVNCX1NUT1JfVFJBTlNQT1JUX0ZBSUxFRCAmJgotCQkgICAgKHVzLT5mZmxhZ3MgJiBVU19GTF9TQU5FX1NFTlNFKSAmJgotCQkgICAgc2Vuc2Vfc2l6ZSAhPSBVU19TRU5TRV9TSVpFKSB7CisJCQkJc2Vuc2Vfc2l6ZSAhPSBVU19TRU5TRV9TSVpFKSB7CiAJCQlVU19ERUJVR1AoIi0tIGF1dG8tc2Vuc2UgZmFpbHVyZSwgcmV0cnkgc21hbGwgc2Vuc2VcbiIpOwogCQkJc2Vuc2Vfc2l6ZSA9IFVTX1NFTlNFX1NJWkU7CisJCQl1cy0+ZmZsYWdzICY9IH5VU19GTF9TQU5FX1NFTlNFOworCQkJdXMtPmZmbGFncyB8PSBVU19GTF9CQURfU0VOU0U7CiAJCQlnb3RvIFJldHJ5X1NlbnNlOwogCQl9CiAKQEAgLTc1NCw2ICs3NjIsNyBAQAogCQkgKi8KIAkJaWYgKHNyYi0+c2Vuc2VfYnVmZmVyWzddID4gKFVTX1NFTlNFX1NJWkUgLSA4KSAmJgogCQkgICAgISh1cy0+ZmZsYWdzICYgVVNfRkxfU0FORV9TRU5TRSkgJiYKKwkJICAgICEodXMtPmZmbGFncyAmIFVTX0ZMX0JBRF9TRU5TRSkgJiYKIAkJICAgIChzcmItPnNlbnNlX2J1ZmZlclswXSAmIDB4N0MpID09IDB4NzApIHsKIAkJCVVTX0RFQlVHUCgiLS0gU0FORV9TRU5TRSBzdXBwb3J0IGVuYWJsZWRcbiIpOwogCQkJdXMtPmZmbGFncyB8PSBVU19GTF9TQU5FX1NFTlNFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKaW5kZXggZDRmMDM0ZS4uNjRhMGEyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaAorKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCkBAIC04MTgsNiArODE4LDEzIEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9GSVhfQ0FQQUNJVFkgKSwKIAorLyogUmVwb3J0ZWQgYnkgRGFuaWVsIEt1a3VsYSA8ZGFuaWVsLmt1a3VAZ21haWwuY29tPiAqLworVU5VU1VBTF9ERVYoIDB4MDY3YiwgMHgxMDYzLCAweDAxMDAsIDB4MDEwMCwKKwkJIlByb2xpZmljIFRlY2hub2xvZ3ksIEluYy4iLAorCQkiUHJvbGlmaWMgU3RvcmFnZSBHYWRnZXQiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfQkFEX1NFTlNFICksCisKIC8qIFJlcG9ydGVkIGJ5IFJvZ2VyaW8gQnJpdG8gPHJicml0b0BpbWUudXNwLmJyPiAqLwogVU5VU1VBTF9ERVYoIDB4MDY3YiwgMHgyMzE3LCAweDAwMDEsIDB4MDAxLAogCQkiUHJvbGlmaWMgVGVjaG5vbG9neSwgSW5jLiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwppbmRleCA4MDYwYjg1Li41YTUzZDRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKQEAgLTQ1LDYgKzQ1LDEwIEBACiAgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCisjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHCisjZGVmaW5lIERFQlVHCisjZW5kaWYKKwogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CkBAIC0yMjgsNiArMjMyLDcgQEAKIAlpZiAoZGF0YV9sZW48MzYpIC8vIFlvdSBsb3NlLgogCQlyZXR1cm47CiAKKwltZW1zZXQoZGF0YSs4LCAnICcsIDI4KTsKIAlpZihkYXRhWzBdJjB4MjApIHsgLyogVVNCIGRldmljZSBjdXJyZW50bHkgbm90IGNvbm5lY3RlZC4gUmV0dXJuCiAJCQkgICAgICBwZXJpcGhlcmFsIHF1YWxpZmllciAwMDFiICgiLi4uaG93ZXZlciwgdGhlCiAJCQkgICAgICBwaHlzaWNhbCBkZXZpY2UgaXMgbm90IGN1cnJlbnRseSBjb25uZWN0ZWQKQEAgLTIzNywxNSArMjQyLDE1IEBACiAJCQkgICAgICBkZXZpY2UsIGl0IG1heSByZXR1cm4gemVyb3Mgb3IgQVNDSUkgc3BhY2VzIAogCQkJICAgICAgKDIwaCkgaW4gdGhvc2UgZmllbGRzIHVudGlsIHRoZSBkYXRhIGlzCiAJCQkgICAgICBhdmFpbGFibGUgZnJvbSB0aGUgZGV2aWNlLiIpLiAqLwotCQltZW1zZXQoZGF0YSs4LDAsMjgpOwogCX0gZWxzZSB7CiAJCXUxNiBiY2REZXZpY2UgPSBsZTE2X3RvX2NwdSh1cy0+cHVzYl9kZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKLQkJbWVtY3B5KGRhdGErOCwgdXMtPnVudXN1YWxfZGV2LT52ZW5kb3JOYW1lLCAKLQkJCXN0cmxlbih1cy0+dW51c3VhbF9kZXYtPnZlbmRvck5hbWUpID4gOCA/IDggOgotCQkJc3RybGVuKHVzLT51bnVzdWFsX2Rldi0+dmVuZG9yTmFtZSkpOwotCQltZW1jcHkoZGF0YSsxNiwgdXMtPnVudXN1YWxfZGV2LT5wcm9kdWN0TmFtZSwgCi0JCQlzdHJsZW4odXMtPnVudXN1YWxfZGV2LT5wcm9kdWN0TmFtZSkgPiAxNiA/IDE2IDoKLQkJCXN0cmxlbih1cy0+dW51c3VhbF9kZXYtPnByb2R1Y3ROYW1lKSk7CisJCWludCBuOworCisJCW4gPSBzdHJsZW4odXMtPnVudXN1YWxfZGV2LT52ZW5kb3JOYW1lKTsKKwkJbWVtY3B5KGRhdGErOCwgdXMtPnVudXN1YWxfZGV2LT52ZW5kb3JOYW1lLCBtaW4oOCwgbikpOworCQluID0gc3RybGVuKHVzLT51bnVzdWFsX2Rldi0+cHJvZHVjdE5hbWUpOworCQltZW1jcHkoZGF0YSsxNiwgdXMtPnVudXN1YWxfZGV2LT5wcm9kdWN0TmFtZSwgbWluKDE2LCBuKSk7CisKIAkJZGF0YVszMl0gPSAweDMwICsgKChiY2REZXZpY2U+PjEyKSAmIDB4MEYpOwogCQlkYXRhWzMzXSA9IDB4MzAgKyAoKGJjZERldmljZT4+OCkgJiAweDBGKTsKIAkJZGF0YVszNF0gPSAweDMwICsgKChiY2REZXZpY2U+PjQpICYgMHgwRik7CkBAIC00NTksNiArNDY0LDkgQEAKIAkJY2FzZSAnYSc6CiAJCQlmIHw9IFVTX0ZMX1NBTkVfU0VOU0U7CiAJCQlicmVhazsKKwkJY2FzZSAnYic6CisJCQlmIHw9IFVTX0ZMX0JBRF9TRU5TRTsKKwkJCWJyZWFrOwogCQljYXNlICdjJzoKIAkJCWYgfD0gVVNfRkxfRklYX0NBUEFDSVRZOwogCQkJYnJlYWs7CkBAIC04MDgsMTQgKzgxNiwxMyBAQAogewogCXN0cnVjdCB1c19kYXRhICp1cyA9IChzdHJ1Y3QgdXNfZGF0YSAqKV9fdXM7CiAKLQlwcmludGsoS0VSTl9ERUJVRwotCQkidXNiLXN0b3JhZ2U6IGRldmljZSBmb3VuZCBhdCAlZFxuIiwgdXMtPnB1c2JfZGV2LT5kZXZudW0pOworCWRldl9kYmcoJnVzLT5wdXNiX2ludGYtPmRldiwgImRldmljZSBmb3VuZFxuIik7CiAKIAlzZXRfZnJlZXphYmxlKCk7CiAJLyogV2FpdCBmb3IgdGhlIHRpbWVvdXQgdG8gZXhwaXJlIG9yIGZvciBhIGRpc2Nvbm5lY3QgKi8KIAlpZiAoZGVsYXlfdXNlID4gMCkgewotCQlwcmludGsoS0VSTl9ERUJVRyAidXNiLXN0b3JhZ2U6IHdhaXRpbmcgZm9yIGRldmljZSAiCi0JCQkJInRvIHNldHRsZSBiZWZvcmUgc2Nhbm5pbmdcbiIpOworCQlkZXZfZGJnKCZ1cy0+cHVzYl9pbnRmLT5kZXYsICJ3YWl0aW5nIGZvciBkZXZpY2UgdG8gc2V0dGxlICIKKwkJCQkiYmVmb3JlIHNjYW5uaW5nXG4iKTsKIAkJd2FpdF9ldmVudF9mcmVlemFibGVfdGltZW91dCh1cy0+ZGVsYXlfd2FpdCwKIAkJCQl0ZXN0X2JpdChVU19GTElEWF9ET05UX1NDQU4sICZ1cy0+ZGZsYWdzKSwKIAkJCQlkZWxheV91c2UgKiBIWik7CkBAIC04MzIsNyArODM5LDcgQEAKIAkJCW11dGV4X3VubG9jaygmdXMtPmRldl9tdXRleCk7CiAJCX0KIAkJc2NzaV9zY2FuX2hvc3QodXNfdG9faG9zdCh1cykpOwotCQlwcmludGsoS0VSTl9ERUJVRyAidXNiLXN0b3JhZ2U6IGRldmljZSBzY2FuIGNvbXBsZXRlXG4iKTsKKwkJZGV2X2RiZygmdXMtPnB1c2JfaW50Zi0+ZGV2LCAic2NhbiBjb21wbGV0ZVxuIik7CiAKIAkJLyogU2hvdWxkIHdlIHVuYmluZCBpZiBubyBkZXZpY2VzIHdlcmUgZGV0ZWN0ZWQ/ICovCiAJfQpAQCAtODQwLDYgKzg0NywxNSBAQAogCWNvbXBsZXRlX2FuZF9leGl0KCZ1cy0+c2Nhbm5pbmdfZG9uZSwgMCk7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXNiX3N0b3Jfc2dfdGFibGVzaXplKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKworCWlmICh1c2JfZGV2LT5idXMtPnNnX3RhYmxlc2l6ZSkgeworCQlyZXR1cm4gdXNiX2Rldi0+YnVzLT5zZ190YWJsZXNpemU7CisJfQorCXJldHVybiBTR19BTEw7Cit9CiAKIC8qIEZpcnN0IHBhcnQgb2YgZ2VuZXJhbCBVU0IgbWFzcy1zdG9yYWdlIHByb2JpbmcgKi8KIGludCB1c2Jfc3Rvcl9wcm9iZTEoc3RydWN0IHVzX2RhdGEgKipwdXMsCkBAIC04NjgsNiArODg0LDcgQEAKIAkgKiBBbGxvdyAxNi1ieXRlIENEQnMgYW5kIHRodXMgPiAyVEIKIAkgKi8KIAlob3N0LT5tYXhfY21kX2xlbiA9IDE2OworCWhvc3QtPnNnX3RhYmxlc2l6ZSA9IHVzYl9zdG9yX3NnX3RhYmxlc2l6ZShpbnRmKTsKIAkqcHVzID0gdXMgPSBob3N0X3RvX3VzKGhvc3QpOwogCW1lbXNldCh1cywgMCwgc2l6ZW9mKHN0cnVjdCB1c19kYXRhKSk7CiAJbXV0ZXhfaW5pdCgmKHVzLT5kZXZfbXV0ZXgpKTsKQEAgLTkyOSw2ICs5NDYsOCBAQAogCXJlc3VsdCA9IHVzYl9zdG9yX2FjcXVpcmVfcmVzb3VyY2VzKHVzKTsKIAlpZiAocmVzdWx0KQogCQlnb3RvIEJhZERldmljZTsKKwlzbnByaW50Zih1cy0+c2NzaV9uYW1lLCBzaXplb2YodXMtPnNjc2lfbmFtZSksICJ1c2Itc3RvcmFnZSAlcyIsCisJCQkJCWRldl9uYW1lKCZ1cy0+cHVzYl9pbnRmLT5kZXYpKTsKIAlyZXN1bHQgPSBzY3NpX2FkZF9ob3N0KHVzX3RvX2hvc3QodXMpLCAmdXMtPnB1c2JfaW50Zi0+ZGV2KTsKIAlpZiAocmVzdWx0KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgVVNCX1NUT1JBR0UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5oCmluZGV4IDI2MDllZmIuLjY5NzE3MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuaApAQCAtMTMyLDYgKzEzMiw3IEBACiAJLyogU0NTSSBpbnRlcmZhY2VzICovCiAJc3RydWN0IHNjc2lfY21uZAkqc3JiOwkJIC8qIGN1cnJlbnQgc3JiCQkqLwogCXVuc2lnbmVkIGludAkJdGFnOwkJIC8qIGN1cnJlbnQgZENCV1RhZwkqLworCWNoYXIJCQlzY3NpX25hbWVbMzJdOwkgLyogc2NzaV9ob3N0IG5hbWUJKi8KIAogCS8qIGNvbnRyb2wgYW5kIGJ1bGsgY29tbXVuaWNhdGlvbnMgZGF0YSAqLwogCXN0cnVjdCB1cmIJCSpjdXJyZW50X3VyYjsJIC8qIFVTQiByZXF1ZXN0cwkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3VzYi1za2VsZXRvbi5jIGIvZHJpdmVycy91c2IvdXNiLXNrZWxldG9uLmMKaW5kZXggYjYyZjJiYy4uYjFlNTc5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvdXNiLXNrZWxldG9uLmMKKysrIGIvZHJpdmVycy91c2IvdXNiLXNrZWxldG9uLmMKQEAgLTM1OCw3ICszNTgsNyBAQAogCQlydiA9IHNrZWxfZG9fcmVhZF9pbyhkZXYsIGNvdW50KTsKIAkJaWYgKHJ2IDwgMCkKIAkJCWdvdG8gZXhpdDsKLQkJZWxzZSBpZiAoIWZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQllbHNlIGlmICghKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKIAkJCWdvdG8gcmV0cnk7CiAJCXJ2ID0gLUVBR0FJTjsKIAl9CkBAIC00MTEsNyArNDExLDcgQEAKIAkgKiBsaW1pdCB0aGUgbnVtYmVyIG9mIFVSQnMgaW4gZmxpZ2h0IHRvIHN0b3AgYSB1c2VyIGZyb20gdXNpbmcgdXAgYWxsCiAJICogUkFNCiAJICovCi0JaWYgKCFmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCWlmICghKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkgewogCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkZXYtPmxpbWl0X3NlbSkpIHsKIAkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKIAkJCWdvdG8gZXhpdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL2RldmNvbm5lY3QuYyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL2RldmNvbm5lY3QuYwppbmRleCA0YWM0MzAwLi5kY2VkNDE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS9kZXZjb25uZWN0LmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvZGV2Y29ubmVjdC5jCkBAIC0xMTksMTAgKzExOSwxMiBAQAogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVyYiA9PSBOVUxMKQogCQlnb3RvIGVycjsKKwl3dXNiX2Rldi0+c2V0X2d0a191cmIgPSB1cmI7CiAKLQlyZXEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KSwgR0ZQX0tFUk5FTCk7CisJcmVxID0ga21hbGxvYyhzaXplb2YoKnJlcSksIEdGUF9LRVJORUwpOwogCWlmIChyZXEgPT0gTlVMTCkKIAkJZ290byBlcnI7CisJd3VzYl9kZXYtPnNldF9ndGtfcmVxID0gcmVxOwogCiAJcmVxLT5iUmVxdWVzdFR5cGUgPSBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1NUQU5EQVJEIHwgVVNCX1JFQ0lQX0RFVklDRTsKIAlyZXEtPmJSZXF1ZXN0ID0gVVNCX1JFUV9TRVRfREVTQ1JJUFRPUjsKQEAgLTEzMCw5ICsxMzIsNiBAQAogCXJlcS0+d0luZGV4ID0gMDsKIAlyZXEtPndMZW5ndGggPSBjcHVfdG9fbGUxNih3dXNiaGMtPmd0ay5kZXNjci5iTGVuZ3RoKTsKIAotCXd1c2JfZGV2LT5zZXRfZ3RrX3VyYiA9IHVyYjsKLQl3dXNiX2Rldi0+c2V0X2d0a19yZXEgPSByZXE7Ci0KIAlyZXR1cm4gd3VzYl9kZXY7CiBlcnI6CiAJd3VzYl9kZXZfZnJlZSh3dXNiX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS9zZWN1cml0eS5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvc2VjdXJpdHkuYwppbmRleCA0NTE2YzM2Li5lZGNkMmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS9zZWN1cml0eS5jCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3NlY3VyaXR5LmMKQEAgLTIwNSwxNSArMjA1LDE1IEBACiAJY29uc3Qgdm9pZCAqaXRyLCAqdG9wOwogCWNoYXIgYnVmWzY0XTsKIAotCXNlY2QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiX3NlY3VyaXR5X2Rlc2NyaXB0b3IpLCBHRlBfS0VSTkVMKTsKKwlzZWNkID0ga21hbGxvYyhzaXplb2YoKnNlY2QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc2VjZCA9PSBOVUxMKSB7CiAJCXJlc3VsdCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KIAogCXJlc3VsdCA9IHVzYl9nZXRfZGVzY3JpcHRvcih1c2JfZGV2LCBVU0JfRFRfU0VDVVJJVFksCi0JCQkJICAgIDAsIHNlY2QsIHNpemVvZihzdHJ1Y3QgdXNiX3NlY3VyaXR5X2Rlc2NyaXB0b3IpKTsKLQlpZiAocmVzdWx0IDwgc2l6ZW9mKHNlY2QpKSB7CisJCQkJICAgIDAsIHNlY2QsIHNpemVvZigqc2VjZCkpOworCWlmIChyZXN1bHQgPCBzaXplb2YoKnNlY2QpKSB7CiAJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgcmVhZCBzZWN1cml0eSBkZXNjcmlwdG9yIG9yICIKIAkJCSJub3QgZW5vdWdoIGRhdGE6ICVkXG4iLCByZXN1bHQpOwogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3d1c2JoYy5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd3VzYmhjLmMKaW5kZXggZWU2MjU2Zi4uZWFiODZlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvd3VzYmhjLmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd3VzYmhjLmMKQEAgLTE0NywxMCArMTQ3LDQwIEBACiB9CiBzdGF0aWMgREVWSUNFX0FUVFIod3VzYl9jaGlkLCAwNjQ0LCB3dXNiX2NoaWRfc2hvdywgd3VzYl9jaGlkX3N0b3JlKTsKIAorCitzdGF0aWMgc3NpemVfdCB3dXNiX3BoeV9yYXRlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjaGFyICpidWYpCit7CisJc3RydWN0IHd1c2JoYyAqd3VzYmhjID0gdXNiaGNfZGV2X3RvX3d1c2JoYyhkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHd1c2JoYy0+cGh5X3JhdGUpOworfQorCitzdGF0aWMgc3NpemVfdCB3dXNiX3BoeV9yYXRlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCB3dXNiaGMgKnd1c2JoYyA9IHVzYmhjX2Rldl90b193dXNiaGMoZGV2KTsKKwl1aW50OF90IHBoeV9yYXRlOworCXNzaXplX3QgcmVzdWx0OworCisJcmVzdWx0ID0gc3NjYW5mKGJ1ZiwgIiVoaHUiLCAmcGh5X3JhdGUpOworCWlmIChyZXN1bHQgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBoeV9yYXRlID49IFVXQl9QSFlfUkFURV9JTlZBTElEKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXd1c2JoYy0+cGh5X3JhdGUgPSBwaHlfcmF0ZTsKKwlyZXR1cm4gc2l6ZTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUih3dXNiX3BoeV9yYXRlLCAwNjQ0LCB3dXNiX3BoeV9yYXRlX3Nob3csIHd1c2JfcGh5X3JhdGVfc3RvcmUpOworCiAvKiBHcm91cCBhbGwgdGhlIFdVU0JIQyBhdHRyaWJ1dGVzICovCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqd3VzYmhjX2F0dHJzW10gPSB7CiAJCSZkZXZfYXR0cl93dXNiX3RydXN0X3RpbWVvdXQuYXR0ciwKIAkJJmRldl9hdHRyX3d1c2JfY2hpZC5hdHRyLAorCQkmZGV2X2F0dHJfd3VzYl9waHlfcmF0ZS5hdHRyLAogCQlOVUxMLAogfTsKIApAQCAtMTc3LDYgKzIwNyw4IEBACiAJaW50IHJlc3VsdCA9IDA7CiAKIAl3dXNiaGMtPnRydXN0X3RpbWVvdXQgPSBXVVNCX1RSVVNUX1RJTUVPVVRfTVM7CisJd3VzYmhjLT5waHlfcmF0ZSA9IFVXQl9QSFlfUkFURV9JTlZBTElEIC0gMTsKKwogCW11dGV4X2luaXQoJnd1c2JoYy0+bXV0ZXgpOwogCXJlc3VsdCA9IHd1c2JoY19tbWNpZV9jcmVhdGUod3VzYmhjKTsKIAlpZiAocmVzdWx0IDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3d1c2JoYy5oIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd3VzYmhjLmgKaW5kZXggNzk3YzI0NS4uZmQyZmQ0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvd3VzYmhjLmgKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd3VzYmhjLmgKQEAgLTI1Myw2ICsyNTMsNyBAQAogCiAJdW5zaWduZWQgdHJ1c3RfdGltZW91dDsJCQkvKiBpbiBqaWZmaWVzICovCiAJc3RydWN0IHd1c2JfY2toZGlkIGNoaWQ7CisJdWludDhfdCBwaHlfcmF0ZTsKIAlzdHJ1Y3Qgd3VpZV9ob3N0X2luZm8gKnd1aWVfaG9zdF9pbmZvOwogCiAJc3RydWN0IG11dGV4IG11dGV4OwkJCS8qIGxvY2tzIGV2ZXJ5dGhpbmcgZWxzZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9LY29uZmlnIGIvZHJpdmVycy92aWRlby9LY29uZmlnCmluZGV4IGU5ZjE5M2UuLjk5YzBkZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKQEAgLTIxMzEsNyArMjEzMSw3IEBACiAJICB0aGUgYm9vdGxvYWRlci4KIAogY29uZmlnIEZCX01TTQotCXRyaXN0YXRlCisJdHJpc3RhdGUgIk1TTSBGcmFtZWJ1ZmZlciBzdXBwb3J0IgogCWRlcGVuZHMgb24gRkIgJiYgQVJDSF9NU00KIAlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCiAJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQpAQCAtMjE2NSw2ICsyMTY1LDcgQEAKIAkgIGEgYnJpZGdlIGFkYXB0ZXIuCiAKIHNvdXJjZSAiZHJpdmVycy92aWRlby9vbWFwL0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvdmlkZW8vb21hcDIvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL3ZpZGVvL2Rpc3BsYXkvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCmluZGV4IDgwMjMyZTEuLjBmOGRhMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy92aWRlby9NYWtlZmlsZQpAQCAtMTI0LDYgKzEyNCw3IEBACiBvYmotJChDT05GSUdfRkJfWElMSU5YKSAgICAgICAgICAgKz0geGlsaW54ZmIubwogb2JqLSQoQ09ORklHX0ZCX1NIX01PQklMRV9MQ0RDKQkgICs9IHNoX21vYmlsZV9sY2RjZmIubwogb2JqLSQoQ09ORklHX0ZCX09NQVApICAgICAgICAgICAgICs9IG9tYXAvCitvYmoteSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKz0gb21hcDIvCiBvYmotJChDT05GSUdfWEVOX0ZCREVWX0ZST05URU5EKSAgKz0geGVuLWZiZnJvbnQubwogb2JqLSQoQ09ORklHX0ZCX0NBUk1JTkUpICAgICAgICAgICs9IGNhcm1pbmVmYi5vCiBvYmotJChDT05GSUdfRkJfTUI4NjJYWCkJICArPSBtYjg2Mnh4LwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL29tYXAvS2NvbmZpZwppbmRleCA1NTFlM2U5Li40NTVjNjA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvS2NvbmZpZwpAQCAtMSw2ICsxLDcgQEAKIGNvbmZpZyBGQl9PTUFQCiAJdHJpc3RhdGUgIk9NQVAgZnJhbWUgYnVmZmVyIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBGQiAmJiBBUkNIX09NQVAKKwlkZXBlbmRzIG9uIEZCICYmIEFSQ0hfT01BUCAmJiAoT01BUDJfRFNTID0gIm4iKQorCiAJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAogCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKIAlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVApAQCAtNzIsNyArNzMsNyBAQAogCiBjb25maWcgRkJfT01BUF9CT09UTE9BREVSX0lOSVQKIAlib29sICJDaGVjayBib290bG9hZGVyIGluaXRpYWxpemF0aW9uIgotCWRlcGVuZHMgb24gRkJfT01BUAorCWRlcGVuZHMgb24gRkJfT01BUCB8fCBGQl9PTUFQMgogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGNoZWNraW5nIGlmIHRoZSBib290bG9hZGVyIGhhcwogCSAgYWxyZWFkeSBpbml0aWFsaXplZCB0aGUgZGlzcGxheSBjb250cm9sbGVyLiBJbiB0aGlzIGNhc2UgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvYmxpenphcmQuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9ibGl6emFyZC5jCmluZGV4IGY1ZDc1ZjIuLjJmZmIzNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9ibGl6emFyZC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9ibGl6emFyZC5jCkBAIC0yNyw5ICsyNyw5IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAKICNpbmNsdWRlIDxwbGF0L2RtYS5oPgotI2luY2x1ZGUgPHBsYXQvb21hcGZiLmg+CiAjaW5jbHVkZSA8cGxhdC9ibGl6emFyZC5oPgogCisjaW5jbHVkZSAib21hcGZiLmgiCiAjaW5jbHVkZSAiZGlzcGMuaCIKIAogI2RlZmluZSBNT0RVTEVfTkFNRQkJCQkiYmxpenphcmQiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9kaXNwYy5jCmluZGV4IDdjODMzZGIuLmM3YzY0NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9kaXNwYy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9kaXNwYy5jCkBAIC0yNCwxMSArMjQsMTIgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPHBsYXQvc3JhbS5oPgotI2luY2x1ZGUgPHBsYXQvb21hcGZiLmg+CiAjaW5jbHVkZSA8cGxhdC9ib2FyZC5oPgogCisjaW5jbHVkZSAib21hcGZiLmgiCiAjaW5jbHVkZSAiZGlzcGMuaCIKIAogI2RlZmluZSBNT0RVTEVfTkFNRQkJCSJkaXNwYyIKQEAgLTE4OCw2ICsxODksMTEgQEAKIAlzdHJ1Y3Qgb21hcGZiX2NvbG9yX2tleQljb2xvcl9rZXk7CiB9IGRpc3BjOwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwZHNzX2RldmljZSA9IHsKKwkubmFtZQkJPSAib21hcGRzcyIsCisJLmlkCQk9IC0xLAorfTsKKwogc3RhdGljIHZvaWQgZW5hYmxlX2xjZF9jbG9ja3MoaW50IGVuYWJsZSk7CiAKIHN0YXRpYyB2b2lkIGlubGluZSBkaXNwY193cml0ZV9yZWcoaW50IGlkeCwgdTMyIHZhbCkKQEAgLTkxNCwyMCArOTIwLDIwIEBACiAKIHN0YXRpYyBpbnQgZ2V0X2Rzc19jbG9ja3Modm9pZCkKIHsKLQlkaXNwYy5kc3NfaWNrID0gY2xrX2dldChkaXNwYy5mYmRldi0+ZGV2LCAiaWNrIik7CisJZGlzcGMuZHNzX2ljayA9IGNsa19nZXQoJm9tYXBkc3NfZGV2aWNlLmRldiwgImljayIpOwogCWlmIChJU19FUlIoZGlzcGMuZHNzX2ljaykpIHsKIAkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGlja1xuIik7CiAJCXJldHVybiBQVFJfRVJSKGRpc3BjLmRzc19pY2spOwogCX0KIAotCWRpc3BjLmRzczFfZmNrID0gY2xrX2dldChkaXNwYy5mYmRldi0+ZGV2LCAiZHNzMV9mY2siKTsKKwlkaXNwYy5kc3MxX2ZjayA9IGNsa19nZXQoJm9tYXBkc3NfZGV2aWNlLmRldiwgImRzczFfZmNrIik7CiAJaWYgKElTX0VSUihkaXNwYy5kc3MxX2ZjaykpIHsKIAkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGRzczFfZmNrXG4iKTsKIAkJY2xrX3B1dChkaXNwYy5kc3NfaWNrKTsKIAkJcmV0dXJuIFBUUl9FUlIoZGlzcGMuZHNzMV9mY2spOwogCX0KIAotCWRpc3BjLmRzc181NG1fZmNrID0gY2xrX2dldChkaXNwYy5mYmRldi0+ZGV2LCAidHZfZmNrIik7CisJZGlzcGMuZHNzXzU0bV9mY2sgPSBjbGtfZ2V0KCZvbWFwZHNzX2RldmljZS5kZXYsICJ0dl9mY2siKTsKIAlpZiAoSVNfRVJSKGRpc3BjLmRzc181NG1fZmNrKSkgewogCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsICJjYW4ndCBnZXQgdHZfZmNrXG4iKTsKIAkJY2xrX3B1dChkaXNwYy5kc3NfaWNrKTsKQEAgLTEzNzksNiArMTM4NSwxMiBAQAogCWludCBza2lwX2luaXQgPSAwOwogCWludCBpOwogCisJciA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb21hcGRzc19kZXZpY2UpOworCWlmIChyKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgImNhbid0IHJlZ2lzdGVyIG9tYXBkc3MgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIHI7CisJfQorCiAJbWVtc2V0KCZkaXNwYywgMCwgc2l6ZW9mKGRpc3BjKSk7CiAKIAlkaXNwYy5iYXNlID0gaW9yZW1hcChESVNQQ19CQVNFLCBTWl8xSyk7CkBAIC0xNTIyLDYgKzE1MzQsNyBAQAogCWZyZWVfaXJxKElOVF8yNFhYX0RTU19JUlEsIGRpc3BjLmZiZGV2KTsKIAlwdXRfZHNzX2Nsb2NrcygpOwogCWlvdW5tYXAoZGlzcGMuYmFzZSk7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJm9tYXBkc3NfZGV2aWNlKTsKIH0KIAogY29uc3Qgc3RydWN0IGxjZF9jdHJsIG9tYXAyX2ludF9jdHJsID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2h3YTc0Mi5jIGIvZHJpdmVycy92aWRlby9vbWFwL2h3YTc0Mi5jCmluZGV4IDE3YTk3NWUuLjAwMTZmNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9od2E3NDIuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvaHdhNzQyLmMKQEAgLTI1LDEwICsyNSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogI2luY2x1ZGUgPHBsYXQvZG1hLmg+Ci0jaW5jbHVkZSA8cGxhdC9vbWFwZmIuaD4KICNpbmNsdWRlIDxwbGF0L2h3YTc0Mi5oPgorI2luY2x1ZGUgIm9tYXBmYi5oIgogCiAjZGVmaW5lIEhXQTc0Ml9SRVZfQ09ERV9SRUcgICAgICAgMHgwCiAjZGVmaW5lIEhXQTc0Ml9DT05GSUdfUkVHICAgICAgICAgMHgyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkXzI0MzBzZHAuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfMjQzMHNkcC5jCmluZGV4IGZlYTdmZWUuLjc2MDY0NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfMjQzMHNkcC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfMjQzMHNkcC5jCkBAIC0yOCw5ICsyOCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy90d2w0MDMwLmg+CiAKICNpbmNsdWRlIDxwbGF0L211eC5oPgotI2luY2x1ZGUgPHBsYXQvb21hcGZiLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAorI2luY2x1ZGUgIm9tYXBmYi5oIgorCiAjZGVmaW5lIFNEUDI0MzBfTENEX1BBTkVMX0JBQ0tMSUdIVF9HUElPCTkxCiAjZGVmaW5lIFNEUDI0MzBfTENEX1BBTkVMX0VOQUJMRV9HUElPCQkxNTQKICNkZWZpbmUgU0RQMzQzMF9MQ0RfUEFORUxfQkFDS0xJR0hUX0dQSU8JMjQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfYW1zX2RlbHRhLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2Ftc19kZWx0YS5jCmluZGV4IGIzOTczZWIuLjU2N2RiNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfYW1zX2RlbHRhLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9hbXNfZGVsdGEuYwpAQCAtMjcsNyArMjcsOCBAQAogCiAjaW5jbHVkZSA8cGxhdC9ib2FyZC1hbXMtZGVsdGEuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8cGxhdC9vbWFwZmIuaD4KKworI2luY2x1ZGUgIm9tYXBmYi5oIgogCiAjZGVmaW5lIEFNU19ERUxUQV9ERUZBVUxUX0NPTlRSQVNUCTExMgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2Fwb2xsb24uYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfYXBvbGxvbi5jCmluZGV4IDRjNWNlZmMuLjJiZTk0ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfYXBvbGxvbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfYXBvbGxvbi5jCkBAIC0yNiw3ICsyNiw4IEBACiAKICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L211eC5oPgotI2luY2x1ZGUgPHBsYXQvb21hcGZiLmg+CisKKyNpbmNsdWRlICJvbWFwZmIuaCIKIAogLyogI2RlZmluZSBVU0VfMzVJTkNIX0xDRCAxICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDMuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDMuYwppbmRleCAyNDBiNGZiLi44ZGY2ODg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2gzLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9oMy5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjL3RwczY1MDEwLmg+CiAKICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLSNpbmNsdWRlIDxwbGF0L29tYXBmYi5oPgorI2luY2x1ZGUgIm9tYXBmYi5oIgogCiAjZGVmaW5lIE1PRFVMRV9OQU1FCSJvbWFwZmItbGNkX2gzIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2g0LmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2g0LmMKaW5kZXggNzIwNjI1ZC4uMDNhMDZhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9oNC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDQuYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCi0jaW5jbHVkZSA8cGxhdC9vbWFwZmIuaD4KKyNpbmNsdWRlICJvbWFwZmIuaCIKIAogc3RhdGljIGludCBoNF9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLCBzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2h0Y2hlcmFsZC5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9odGNoZXJhbGQuYwppbmRleCAyZTBjODFlLi5hOTAwN2M1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2h0Y2hlcmFsZC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaHRjaGVyYWxkLmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAotI2luY2x1ZGUgPHBsYXQvb21hcGZiLmg+CisjaW5jbHVkZSAib21hcGZiLmgiCiAKIHN0YXRpYyBpbnQgaHRjaGVyYWxkX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCiAJCQkJCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTUxMC5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9pbm4xNTEwLmMKaW5kZXggYWFmZTliNC4uMzI3MWYxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9pbm4xNTEwLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9pbm4xNTEwLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8cGxhdC9mcGdhLmg+Ci0jaW5jbHVkZSA8cGxhdC9vbWFwZmIuaD4KKyNpbmNsdWRlICJvbWFwZmIuaCIKIAogc3RhdGljIGludCBpbm5vdmF0b3IxNTEwX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCiAJCQkJICAgIHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTYxMC5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9pbm4xNjEwLmMKaW5kZXggMGRlMzM4Mi4uOWZmZjg2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9pbm4xNjEwLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9pbm4xNjEwLmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotI2luY2x1ZGUgPHBsYXQvb21hcGZiLmg+CisjaW5jbHVkZSAib21hcGZiLmgiCiAKICNkZWZpbmUgTU9EVUxFX05BTUUJIm9tYXBmYi1sY2RfaDMiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfbGRwLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2xkcC5jCmluZGV4IDZhMjYwZGYuLjViYjdmNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfbGRwLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9sZHAuYwpAQCAtMjgsOSArMjgsMTAgQEAKIAogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+Ci0jaW5jbHVkZSA8cGxhdC9vbWFwZmIuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCisjaW5jbHVkZSAib21hcGZiLmgiCisKICNkZWZpbmUgTENEX1BBTkVMX0JBQ0tMSUdIVF9HUElPCSgxNSArIE9NQVBfTUFYX0dQSU9fTElORVMpCiAjZGVmaW5lIExDRF9QQU5FTF9FTkFCTEVfR1BJTwkJKDcgKyBPTUFQX01BWF9HUElPX0xJTkVTKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX21pcGlkLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX21pcGlkLmMKaW5kZXggOGYzZTJiNC4uYWJlMWM3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9taXBpZC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfbWlwaWQuYwpAQCAtMjMsOSArMjMsMTAgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAKLSNpbmNsdWRlIDxwbGF0L29tYXBmYi5oPgogI2luY2x1ZGUgPHBsYXQvbGNkX21pcGlkLmg+CiAKKyNpbmNsdWRlICJvbWFwZmIuaCIKKwogI2RlZmluZSBNSVBJRF9NT0RVTEVfTkFNRQkJImxjZF9taXBpZCIKIAogI2RlZmluZSBNSVBJRF9DTURfUkVBRF9ESVNQX0lECQkweDA0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX29tYXAyZXZtLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX29tYXAyZXZtLmMKaW5kZXggZTFhMzhhYi4uMDA2YzJmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vbWFwMmV2bS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb21hcDJldm0uYwpAQCAtMjcsOSArMjcsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMvdHdsNDAzMC5oPgogCiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KLSNpbmNsdWRlIDxwbGF0L29tYXBmYi5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKKyNpbmNsdWRlICJvbWFwZmIuaCIKKwogI2RlZmluZSBMQ0RfUEFORUxfRU5BQkxFX0dQSU8JMTU0CiAjZGVmaW5lIExDRF9QQU5FTF9MUgkJMTI4CiAjZGVmaW5lIExDRF9QQU5FTF9VRAkJMTI5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX29tYXAzYmVhZ2xlLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX29tYXAzYmVhZ2xlLmMKaW5kZXggY2NlYzA4NC4uZmM1MDNkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vbWFwM2JlYWdsZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb21hcDNiZWFnbGUuYwpAQCAtMjYsOSArMjYsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMvdHdsNDAzMC5oPgogCiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KLSNpbmNsdWRlIDxwbGF0L29tYXBmYi5oPgorI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAorI2luY2x1ZGUgIm9tYXBmYi5oIgorCiAjZGVmaW5lIExDRF9QQU5FTF9FTkFCTEVfR1BJTyAgICAgICAxNzAKIAogc3RhdGljIGludCBvbWFwM2JlYWdsZV9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vbWFwM2V2bS5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vbWFwM2V2bS5jCmluZGV4IDU1NmViMzEuLmFlMmVkYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb21hcDNldm0uYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX29tYXAzZXZtLmMKQEAgLTI2LDkgKzI2LDEwIEBACiAjaW5jbHVkZSA8bGludXgvaTJjL3R3bDQwMzAuaD4KIAogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+Ci0jaW5jbHVkZSA8cGxhdC9vbWFwZmIuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCisjaW5jbHVkZSAib21hcGZiLmgiCisKICNkZWZpbmUgTENEX1BBTkVMX0VOQUJMRV9HUElPICAgICAgIDE1MwogI2RlZmluZSBMQ0RfUEFORUxfTFIgICAgICAgICAgICAgICAgMgogI2RlZmluZSBMQ0RfUEFORUxfVUQgICAgICAgICAgICAgICAgMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vc2suYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb3NrLmMKaW5kZXggYmIyMWQ3ZC4uYjg3ZThiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vc2suYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX29zay5jCkBAIC0yNSw3ICsyNSw3IEBACiAKICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L211eC5oPgotI2luY2x1ZGUgPHBsYXQvb21hcGZiLmg+CisjaW5jbHVkZSAib21hcGZiLmgiCiAKIHN0YXRpYyBpbnQgb3NrX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsIHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb3Zlcm8uYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb3Zlcm8uYwppbmRleCBiMGY4NmU1Li41NmVlMTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX292ZXJvLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vdmVyby5jCkBAIC0yNSw5ICsyNSwxMCBAQAogCiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KLSNpbmNsdWRlIDxwbGF0L29tYXBmYi5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKKyNpbmNsdWRlICJvbWFwZmIuaCIKKwogI2RlZmluZSBMQ0RfRU5BQkxFICAgICAgIDE0NAogCiBzdGF0aWMgaW50IG92ZXJvX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG10ZS5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtdGUuYwppbmRleCBkMzAyODk2Li40Y2IzMDE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG10ZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXRlLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8cGxhdC9mcGdhLmg+Ci0jaW5jbHVkZSA8cGxhdC9vbWFwZmIuaD4KKyNpbmNsdWRlICJvbWFwZmIuaCIKIAogc3RhdGljIGludCBwYWxtdGVfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwKIAkJCQlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG10dC5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtdHQuYwppbmRleCA1NTc0MjRmLi5mZjBlNmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG10dC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXR0LmMKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jaW5jbHVkZSA8cGxhdC9vbWFwZmIuaD4KKyNpbmNsdWRlICJvbWFwZmIuaCIKIAogc3RhdGljIGludCBwYWxtdHRfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwKIAlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG16NzEuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXo3MS5jCmluZGV4IDVmNGI1YjIuLjIzMzRlNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXo3MS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXo3MS5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgPHBsYXQvb21hcGZiLmg+CisjaW5jbHVkZSAib21hcGZiLmgiCiAKIHN0YXRpYyBpbnQgcGFsbXo3MV9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLAogCQkJICAgICAgc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZGMuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RjLmMKaW5kZXggNWYzMmNhZi4uYjgzMWUxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL2xjZGMuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkYy5jCkBAIC0zMCwxMCArMzAsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KIAogI2luY2x1ZGUgPHBsYXQvZG1hLmg+Ci0jaW5jbHVkZSA8cGxhdC9vbWFwZmIuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKKyNpbmNsdWRlICJvbWFwZmIuaCIKKwogI2luY2x1ZGUgImxjZGMuaCIKIAogI2RlZmluZSBNT0RVTEVfTkFNRQkJCSJsY2RjIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL29tYXBmYi5oIGIvZHJpdmVycy92aWRlby9vbWFwL29tYXBmYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZTQ3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvb21hcGZiLmgKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBGaWxlOiBkcml2ZXJzL3ZpZGVvL29tYXAvb21hcGZiLmgKKyAqCisgKiBGcmFtZWJ1ZmZlciBkcml2ZXIgZm9yIFRJIE9NQVAgYm9hcmRzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fT01BUEZCX0gKKyNkZWZpbmUgX19PTUFQRkJfSAorCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L29tYXBmYi5oPgorCisjZGVmaW5lIE9NQVBGQl9FVkVOVF9SRUFEWQkxCisjZGVmaW5lIE9NQVBGQl9FVkVOVF9ESVNBQkxFRAkyCisKKyNkZWZpbmUgT01BUF9MQ0RDX0lOVl9WU1lOQyAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgT01BUF9MQ0RDX0lOVl9IU1lOQyAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgT01BUF9MQ0RDX0lOVl9QSVhfQ0xPQ0sgICAgICAgICAweDAwMDQKKyNkZWZpbmUgT01BUF9MQ0RDX0lOVl9PVVRQVVRfRU4gICAgICAgICAweDAwMDgKKyNkZWZpbmUgT01BUF9MQ0RDX0hTVlNfUklTSU5HX0VER0UgICAgICAweDAwMTAKKyNkZWZpbmUgT01BUF9MQ0RDX0hTVlNfT1BQT1NJVEUgICAgICAgICAweDAwMjAKKworI2RlZmluZSBPTUFQX0xDRENfU0lHTkFMX01BU0sJCTB4MDAzZgorCisjZGVmaW5lIE9NQVBfTENEQ19QQU5FTF9URlQJCTB4MDEwMAorCisjZGVmaW5lIE9NQVBGQl9QTEFORV9YUkVTX01JTgkJOAorI2RlZmluZSBPTUFQRkJfUExBTkVfWVJFU19NSU4JCTgKKworc3RydWN0IG9tYXBmYl9kZXZpY2U7CisKK3N0cnVjdCBsY2RfcGFuZWwgeworCWNvbnN0IGNoYXIJKm5hbWU7CisJaW50CQljb25maWc7CQkvKiBURlQvU1ROLCBzaWduYWwgaW52ZXJzaW9uICovCisJaW50CQlicHA7CQkvKiBQaXhlbCBmb3JtYXQgaW4gZmIgbWVtICovCisJaW50CQlkYXRhX2xpbmVzOwkvKiBMaW5lcyBvbiBMQ0QgSFcgaW50ZXJmYWNlICovCisKKwlpbnQJCXhfcmVzLCB5X3JlczsKKwlpbnQJCXBpeGVsX2Nsb2NrOwkvKiBJbiBrSHogKi8KKwlpbnQJCWhzdzsJCS8qIEhvcml6b250YWwgc3luY2hyb25pemF0aW9uCisJCQkJCSAgIHB1bHNlIHdpZHRoICovCisJaW50CQloZnA7CQkvKiBIb3Jpem9udGFsIGZyb250IHBvcmNoICovCisJaW50CQloYnA7CQkvKiBIb3Jpem9udGFsIGJhY2sgcG9yY2ggKi8KKwlpbnQJCXZzdzsJCS8qIFZlcnRpY2FsIHN5bmNocm9uaXphdGlvbgorCQkJCQkgICBwdWxzZSB3aWR0aCAqLworCWludAkJdmZwOwkJLyogVmVydGljYWwgZnJvbnQgcG9yY2ggKi8KKwlpbnQJCXZicDsJCS8qIFZlcnRpY2FsIGJhY2sgcG9yY2ggKi8KKwlpbnQJCWFjYjsJCS8qIGFjLWJpYXMgcGluIGZyZXF1ZW5jeSAqLworCWludAkJcGNkOwkJLyogcGl4ZWwgY2xvY2sgZGl2aWRlci4KKwkJCQkJICAgT2Jzb2xldGUgdXNlIHBpeGVsX2Nsb2NrIGluc3RlYWQgKi8KKworCWludAkJKCppbml0KQkJKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLAorCQkJCQkgc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KTsKKwl2b2lkCQkoKmNsZWFudXApCShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCk7CisJaW50CQkoKmVuYWJsZSkJKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKTsKKwl2b2lkCQkoKmRpc2FibGUpCShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCk7CisJdW5zaWduZWQgbG9uZwkoKmdldF9jYXBzKQkoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpOworCWludAkJKCpzZXRfYmtsaWdodF9sZXZlbCkoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGxldmVsKTsKKwl1bnNpZ25lZCBpbnQJKCpnZXRfYmtsaWdodF9sZXZlbCkoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpOworCXVuc2lnbmVkIGludAkoKmdldF9ia2xpZ2h0X21heCkgIChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCk7CisJaW50CQkoKnJ1bl90ZXN0KQkoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsIGludCB0ZXN0X251bSk7Cit9OworCitzdHJ1Y3QgZXh0aWZfdGltaW5ncyB7CisJaW50IGNzX29uX3RpbWU7CisJaW50IGNzX29mZl90aW1lOworCWludCB3ZV9vbl90aW1lOworCWludCB3ZV9vZmZfdGltZTsKKwlpbnQgcmVfb25fdGltZTsKKwlpbnQgcmVfb2ZmX3RpbWU7CisJaW50IHdlX2N5Y2xlX3RpbWU7CisJaW50IHJlX2N5Y2xlX3RpbWU7CisJaW50IGNzX3B1bHNlX3dpZHRoOworCWludCBhY2Nlc3NfdGltZTsKKworCWludCBjbGtfZGl2OworCisJdTMyIHRpbVs1XTsJCS8qIHNldCBieSBleHRpZi0+Y29udmVydF90aW1pbmdzICovCisKKwlpbnQgY29udmVydGVkOworfTsKKworc3RydWN0IGxjZF9jdHJsX2V4dGlmIHsKKwlpbnQgICgqaW5pdCkJCShzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpOworCXZvaWQgKCpjbGVhbnVwKQkJKHZvaWQpOworCXZvaWQgKCpnZXRfY2xrX2luZm8pCSh1MzIgKmNsa19wZXJpb2QsIHUzMiAqbWF4X2Nsa19kaXYpOworCXVuc2lnbmVkIGxvbmcgKCpnZXRfbWF4X3R4X3JhdGUpKHZvaWQpOworCWludCAgKCpjb252ZXJ0X3RpbWluZ3MpCShzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdGltaW5ncyk7CisJdm9pZCAoKnNldF90aW1pbmdzKQkoY29uc3Qgc3RydWN0IGV4dGlmX3RpbWluZ3MgKnRpbWluZ3MpOworCXZvaWQgKCpzZXRfYml0c19wZXJfY3ljbGUpKGludCBicGMpOworCXZvaWQgKCp3cml0ZV9jb21tYW5kKQkoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKTsKKwl2b2lkICgqcmVhZF9kYXRhKQkodm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKTsKKwl2b2lkICgqd3JpdGVfZGF0YSkJKGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbik7CisJdm9pZCAoKnRyYW5zZmVyX2FyZWEpCShpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJCQkJIHZvaWQgKGNhbGxiYWNrKSh2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSk7CisJaW50ICAoKnNldHVwX3RlYXJzeW5jKQkodW5zaWduZWQgcGluX2NudCwKKwkJCQkgdW5zaWduZWQgaHNfcHVsc2VfdGltZSwgdW5zaWduZWQgdnNfcHVsc2VfdGltZSwKKwkJCQkgaW50IGhzX3BvbF9pbnYsIGludCB2c19wb2xfaW52LCBpbnQgZGl2KTsKKwlpbnQgICgqZW5hYmxlX3RlYXJzeW5jKSAoaW50IGVuYWJsZSwgdW5zaWduZWQgbGluZSk7CisKKwl1bnNpZ25lZCBsb25nCQltYXhfdHJhbnNtaXRfc2l6ZTsKK307CisKK3N0cnVjdCBvbWFwZmJfbm90aWZpZXJfYmxvY2sgeworCXN0cnVjdCBub3RpZmllcl9ibG9jawluYjsKKwl2b2lkCQkJKmRhdGE7CisJaW50CQkJcGxhbmVfaWR4OworfTsKKwordHlwZWRlZiBpbnQgKCpvbWFwZmJfbm90aWZpZXJfY2FsbGJhY2tfdCkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICosCisJCQkJCSAgdW5zaWduZWQgbG9uZyBldmVudCwKKwkJCQkJICB2b2lkICpmYmkpOworCitzdHJ1Y3QgbGNkX2N0cmwgeworCWNvbnN0IGNoYXIJKm5hbWU7CisJdm9pZAkJKmRhdGE7CisKKwlpbnQJCSgqaW5pdCkJCSAgKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwKKwkJCQkJICAgaW50IGV4dF9tb2RlLAorCQkJCQkgICBzdHJ1Y3Qgb21hcGZiX21lbV9kZXNjICpyZXFfbWQpOworCXZvaWQJCSgqY2xlYW51cCkJICAodm9pZCk7CisJdm9pZAkJKCpiaW5kX2NsaWVudCkJICAoc3RydWN0IG9tYXBmYl9ub3RpZmllcl9ibG9jayAqbmIpOworCXZvaWQJCSgqZ2V0X2NhcHMpCSAgKGludCBwbGFuZSwgc3RydWN0IG9tYXBmYl9jYXBzICpjYXBzKTsKKwlpbnQJCSgqc2V0X3VwZGF0ZV9tb2RlKShlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBtb2RlKTsKKwllbnVtIG9tYXBmYl91cGRhdGVfbW9kZSAoKmdldF91cGRhdGVfbW9kZSkodm9pZCk7CisJaW50CQkoKnNldHVwX3BsYW5lKQkgIChpbnQgcGxhbmUsIGludCBjaGFubmVsX291dCwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJCSAgIGludCBzY3JlZW5fd2lkdGgsCisJCQkJCSAgIGludCBwb3NfeCwgaW50IHBvc195LCBpbnQgd2lkdGgsCisJCQkJCSAgIGludCBoZWlnaHQsIGludCBjb2xvcl9tb2RlKTsKKwlpbnQJCSgqc2V0X3JvdGF0ZSkJICAoaW50IGFuZ2xlKTsKKwlpbnQJCSgqc2V0dXBfbWVtKQkgIChpbnQgcGxhbmUsIHNpemVfdCBzaXplLAorCQkJCQkgICBpbnQgbWVtX3R5cGUsIHVuc2lnbmVkIGxvbmcgKnBhZGRyKTsKKwlpbnQJCSgqbW1hcCkJCSAgKHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkJCQkgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisJaW50CQkoKnNldF9zY2FsZSkJICAoaW50IHBsYW5lLAorCQkJCQkgICBpbnQgb3JpZ193aWR0aCwgaW50IG9yaWdfaGVpZ2h0LAorCQkJCQkgICBpbnQgb3V0X3dpZHRoLCBpbnQgb3V0X2hlaWdodCk7CisJaW50CQkoKmVuYWJsZV9wbGFuZSkJICAoaW50IHBsYW5lLCBpbnQgZW5hYmxlKTsKKwlpbnQJCSgqdXBkYXRlX3dpbmRvdykgIChzdHJ1Y3QgZmJfaW5mbyAqZmJpLAorCQkJCQkgICBzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgKndpbiwKKwkJCQkJICAgdm9pZCAoKmNhbGxiYWNrKSh2b2lkICopLAorCQkJCQkgICB2b2lkICpjYWxsYmFja19kYXRhKTsKKwl2b2lkCQkoKnN5bmMpCQkgICh2b2lkKTsKKwl2b2lkCQkoKnN1c3BlbmQpCSAgKHZvaWQpOworCXZvaWQJCSgqcmVzdW1lKQkgICh2b2lkKTsKKwlpbnQJCSgqcnVuX3Rlc3QpCSAgKGludCB0ZXN0X251bSk7CisJaW50CQkoKnNldGNvbHJlZykJICAodV9pbnQgcmVnbm8sIHUxNiByZWQsIHUxNiBncmVlbiwKKwkJCQkJICAgdTE2IGJsdWUsIHUxNiB0cmFuc3AsCisJCQkJCSAgIGludCB1cGRhdGVfaHdfbWVtKTsKKwlpbnQJCSgqc2V0X2NvbG9yX2tleSkgIChzdHJ1Y3Qgb21hcGZiX2NvbG9yX2tleSAqY2spOworCWludAkJKCpnZXRfY29sb3Jfa2V5KSAgKHN0cnVjdCBvbWFwZmJfY29sb3Jfa2V5ICpjayk7Cit9OworCitlbnVtIG9tYXBmYl9zdGF0ZSB7CisJT01BUEZCX0RJU0FCTEVECQk9IDAsCisJT01BUEZCX1NVU1BFTkRFRAk9IDk5LAorCU9NQVBGQl9BQ1RJVkUJCT0gMTAwCit9OworCitzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCB7CisJaW50CQkJCWlkeDsKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX2luZm8JaW5mbzsKKwllbnVtIG9tYXBmYl9jb2xvcl9mb3JtYXQJY29sb3JfbW9kZTsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZQkJKmZiZGV2OworfTsKKworc3RydWN0IG9tYXBmYl9kZXZpY2UgeworCWludAkJCXN0YXRlOworCWludCAgICAgICAgICAgICAgICAgICAgIGV4dF9sY2RjOwkJLyogVXNpbmcgZXh0ZXJuYWwKKwkJCQkJCQkgICBMQ0QgY29udHJvbGxlciAqLworCXN0cnVjdCBtdXRleAkJcnF1ZXVlX211dGV4OworCisJaW50CQkJcGFsZXR0ZV9zaXplOworCXUzMgkJCXBzZXVkb19wYWxldHRlWzE3XTsKKworCXN0cnVjdCBsY2RfcGFuZWwJKnBhbmVsOwkJCS8qIExDRCBwYW5lbCAqLworCWNvbnN0IHN0cnVjdCBsY2RfY3RybAkqY3RybDsJCQkvKiBMQ0QgY29udHJvbGxlciAqLworCWNvbnN0IHN0cnVjdCBsY2RfY3RybAkqaW50X2N0cmw7CQkvKiBpbnRlcm5hbCBMQ0QgY3RybCAqLworCXN0cnVjdCBsY2RfY3RybF9leHRpZgkqZXh0X2lmOwkJLyogTENEIGN0cmwgZXh0ZXJuYWwKKwkJCQkJCQkgICBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbwluZXdfdmFyOwkvKiBmb3IgbW9kZSBjaGFuZ2VzICovCisKKwlzdHJ1Y3Qgb21hcGZiX21lbV9kZXNjCQltZW1fZGVzYzsKKwlzdHJ1Y3QgZmJfaW5mbwkJCSpmYl9pbmZvW09NQVBGQl9QTEFORV9OVU1dOworfTsKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxCitleHRlcm4gc3RydWN0IGxjZF9jdHJsIG9tYXAxX2xjZF9jdHJsOworI2Vsc2UKK2V4dGVybiBzdHJ1Y3QgbGNkX2N0cmwgb21hcDJfZGlzcF9jdHJsOworI2VuZGlmCisKK2V4dGVybiB2b2lkIG9tYXBmYl9yZWdpc3Rlcl9wYW5lbChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCk7CitleHRlcm4gdm9pZCBvbWFwZmJfd3JpdGVfZmlyc3RfcGl4ZWwoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCB1MTYgcGl4dmFsKTsKK2V4dGVybiB2b2lkIG9tYXBmYl9ub3RpZnlfY2xpZW50cyhzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsCisJCQkJICB1bnNpZ25lZCBsb25nIGV2ZW50KTsKK2V4dGVybiBpbnQgIG9tYXBmYl9yZWdpc3Rlcl9jbGllbnQoc3RydWN0IG9tYXBmYl9ub3RpZmllcl9ibG9jayAqbmIsCisJCQkJICAgb21hcGZiX25vdGlmaWVyX2NhbGxiYWNrX3QgY2FsbGJhY2ssCisJCQkJICAgdm9pZCAqY2FsbGJhY2tfZGF0YSk7CitleHRlcm4gaW50ICBvbWFwZmJfdW5yZWdpc3Rlcl9jbGllbnQoc3RydWN0IG9tYXBmYl9ub3RpZmllcl9ibG9jayAqbmIpOworZXh0ZXJuIGludCAgb21hcGZiX3VwZGF0ZV93aW5kb3dfYXN5bmMoc3RydWN0IGZiX2luZm8gKmZiaSwKKwkJCQkgICAgICAgc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93ICp3aW4sCisJCQkJICAgICAgIHZvaWQgKCpjYWxsYmFjaykodm9pZCAqKSwKKwkJCQkgICAgICAgdm9pZCAqY2FsbGJhY2tfZGF0YSk7CisKKyNlbmRpZiAvKiBfX09NQVBGQl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvb21hcGZiX21haW4uYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9vbWFwZmJfbWFpbi5jCmluZGV4IGY5MDBhNDMuLmM3ZjU5YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9vbWFwZmJfbWFpbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9vbWFwZmJfbWFpbi5jCkBAIC0yOSw4ICsyOSw4IEBACiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSA8cGxhdC9kbWEuaD4KLSNpbmNsdWRlIDxwbGF0L29tYXBmYi5oPgogCisjaW5jbHVkZSAib21hcGZiLmgiCiAjaW5jbHVkZSAibGNkYy5oIgogI2luY2x1ZGUgImRpc3BjLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9yZmJpLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvcmZiaS5jCmluZGV4IGM5MGZhMzkuLmZlZDdiMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9yZmJpLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL3JmYmkuYwpAQCAtMjcsOCArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxwbGF0L29tYXBmYi5oPgotCisjaW5jbHVkZSAib21hcGZiLmgiCiAjaW5jbHVkZSAiZGlzcGMuaCIKIAogLyogVG8gd29yayBhcm91bmQgYW4gUkZCSSB0cmFuc2ZlciByYXRlIGxpbWl0YXRpb24gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9zb3NzaS5jIGIvZHJpdmVycy92aWRlby9vbWFwL3Nvc3NpLmMKaW5kZXggNzlkYzg0Zi4uOGZiN2M3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL3Nvc3NpLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL3Nvc3NpLmMKQEAgLTIzLDEwICsyMywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKICNpbmNsdWRlIDxwbGF0L2RtYS5oPgotI2luY2x1ZGUgPHBsYXQvb21hcGZiLmg+CiAKKyNpbmNsdWRlICJvbWFwZmIuaCIKICNpbmNsdWRlICJsY2RjLmgiCiAKICNkZWZpbmUgTU9EVUxFX05BTUUJCSJvbWFwZmItc29zc2kiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg3N2MzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvS2NvbmZpZwpAQCAtMCwwICsxLDkgQEAKK2NvbmZpZyBPTUFQMl9WUkFNCisJYm9vbAorCitjb25maWcgT01BUDJfVlJGQgorCWJvb2wKKworc291cmNlICJkcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9vbWFwMi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODUzZDA1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKK29iai0kKENPTkZJR19PTUFQMl9WUkFNKSArPSB2cmFtLm8KK29iai0kKENPTkZJR19PTUFQMl9WUkZCKSArPSB2cmZiLm8KKworb2JqLXkgKz0gZHNzLworb2JqLXkgKz0gb21hcGZiLworb2JqLXkgKz0gZGlzcGxheXMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEyYTU5YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvS2NvbmZpZwpAQCAtMCwwICsxLDIyIEBACittZW51ICJPTUFQMi8zIERpc3BsYXkgRGV2aWNlIERyaXZlcnMiCisgICAgICAgIGRlcGVuZHMgb24gT01BUDJfRFNTCisKK2NvbmZpZyBQQU5FTF9HRU5FUklDCisgICAgICAgIHRyaXN0YXRlICJHZW5lcmljIFBhbmVsIgorICAgICAgICBoZWxwCisJICBHZW5lcmljIHBhbmVsIGRyaXZlci4KKwkgIFVzZWQgZm9yIERWSSBvdXRwdXQgZm9yIEJlYWdsZSBhbmQgT01BUDMgU0RQLgorCitjb25maWcgUEFORUxfU0hBUlBfTFMwMzdWN0RXMDEKKyAgICAgICAgdHJpc3RhdGUgIlNoYXJwIExTMDM3VjdEVzAxIExDRCBQYW5lbCIKKyAgICAgICAgZGVwZW5kcyBvbiBPTUFQMl9EU1MKKyAgICAgICAgaGVscAorICAgICAgICAgIExDRCBQYW5lbCB1c2VkIGluIFRJJ3MgU0RQMzQzMCBhbmQgRVZNIGJvYXJkcworCitjb25maWcgUEFORUxfVEFBTAorICAgICAgICB0cmlzdGF0ZSAiVGFhbCBEU0kgUGFuZWwiCisgICAgICAgIGRlcGVuZHMgb24gT01BUDJfRFNTX0RTSQorICAgICAgICBoZWxwCisgICAgICAgICAgVGFhbCBEU0kgY29tbWFuZCBtb2RlIHBhbmVsIGZyb20gVFBPLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTU2NDY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9NYWtlZmlsZQpAQCAtMCwwICsxLDQgQEAKK29iai0kKENPTkZJR19QQU5FTF9HRU5FUklDKSArPSBwYW5lbC1nZW5lcmljLm8KK29iai0kKENPTkZJR19QQU5FTF9TSEFSUF9MUzAzN1Y3RFcwMSkgKz0gcGFuZWwtc2hhcnAtbHMwMzd2N2R3MDEubworCitvYmotJChDT05GSUdfUEFORUxfVEFBTCkgKz0gcGFuZWwtdGFhbC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLWdlbmVyaWMuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtZ2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNDhkMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLWdlbmVyaWMuYwpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIEdlbmVyaWMgcGFuZWwgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBUb21pIFZhbGtlaW5lbiA8dG9taS52YWxrZWluZW5Abm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxwbGF0L2Rpc3BsYXkuaD4KKworc3RhdGljIHN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgZ2VuZXJpY19wYW5lbF90aW1pbmdzID0geworCS8qIDY0MCB4IDQ4MCBAIDYwIEh6ICBSZWR1Y2VkIGJsYW5raW5nIFZFU0EgQ1ZUIDAuMzFNMy1SICovCisJLnhfcmVzCQk9IDY0MCwKKwkueV9yZXMJCT0gNDgwLAorCS5waXhlbF9jbG9jawk9IDIzNTAwLAorCS5oZnAJCT0gNDgsCisJLmhzdwkJPSAzMiwKKwkuaGJwCQk9IDgwLAorCS52ZnAJCT0gMywKKwkudnN3CQk9IDQsCisJLnZicAkJPSA3LAorfTsKKworc3RhdGljIGludCBnZW5lcmljX3BhbmVsX3Byb2JlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlkc3NkZXYtPnBhbmVsLmNvbmZpZyA9IE9NQVBfRFNTX0xDRF9URlQ7CisJZHNzZGV2LT5wYW5lbC50aW1pbmdzID0gZ2VuZXJpY19wYW5lbF90aW1pbmdzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdlbmVyaWNfcGFuZWxfcmVtb3ZlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKK30KKworc3RhdGljIGludCBnZW5lcmljX3BhbmVsX2VuYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJaW50IHIgPSAwOworCisJaWYgKGRzc2Rldi0+cGxhdGZvcm1fZW5hYmxlKQorCQlyID0gZHNzZGV2LT5wbGF0Zm9ybV9lbmFibGUoZHNzZGV2KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBnZW5lcmljX3BhbmVsX2Rpc2FibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWlmIChkc3NkZXYtPnBsYXRmb3JtX2Rpc2FibGUpCisJCWRzc2Rldi0+cGxhdGZvcm1fZGlzYWJsZShkc3NkZXYpOworfQorCitzdGF0aWMgaW50IGdlbmVyaWNfcGFuZWxfc3VzcGVuZChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJZ2VuZXJpY19wYW5lbF9kaXNhYmxlKGRzc2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJpY19wYW5lbF9yZXN1bWUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXJldHVybiBnZW5lcmljX3BhbmVsX2VuYWJsZShkc3NkZXYpOworfQorCitzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RyaXZlciBnZW5lcmljX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gZ2VuZXJpY19wYW5lbF9wcm9iZSwKKwkucmVtb3ZlCQk9IGdlbmVyaWNfcGFuZWxfcmVtb3ZlLAorCisJLmVuYWJsZQkJPSBnZW5lcmljX3BhbmVsX2VuYWJsZSwKKwkuZGlzYWJsZQk9IGdlbmVyaWNfcGFuZWxfZGlzYWJsZSwKKwkuc3VzcGVuZAk9IGdlbmVyaWNfcGFuZWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGdlbmVyaWNfcGFuZWxfcmVzdW1lLAorCisJLmRyaXZlciAgICAgICAgID0geworCQkubmFtZSAgID0gImdlbmVyaWNfcGFuZWwiLAorCQkub3duZXIgID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGdlbmVyaWNfcGFuZWxfZHJ2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gb21hcF9kc3NfcmVnaXN0ZXJfZHJpdmVyKCZnZW5lcmljX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBnZW5lcmljX3BhbmVsX2Rydl9leGl0KHZvaWQpCit7CisJb21hcF9kc3NfdW5yZWdpc3Rlcl9kcml2ZXIoJmdlbmVyaWNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZ2VuZXJpY19wYW5lbF9kcnZfaW5pdCk7Cittb2R1bGVfZXhpdChnZW5lcmljX3BhbmVsX2Rydl9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtc2hhcnAtbHMwMzd2N2R3MDEuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtc2hhcnAtbHMwMzd2N2R3MDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmU4ODBiYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtc2hhcnAtbHMwMzd2N2R3MDEuYwpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIExDRCBwYW5lbCBkcml2ZXIgZm9yIFNoYXJwIExTMDM3VjdEVzAxCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IFRvbWkgVmFsa2VpbmVuIDx0b21pLnZhbGtlaW5lbkBub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgPHBsYXQvZGlzcGxheS5oPgorCitzdHJ1Y3Qgc2hhcnBfZGF0YSB7CisJLyogWFhYIFRoaXMgcmVndWxhdG9yIHNob3VsZCBhY3R1YWxseSBiZSBpbiBTRFAgYm9hcmQgZmlsZSwgbm90IGhlcmUsCisJICogYXMgaXQgZG9lc24ndCBhY3R1YWxseSBwb3dlciB0aGUgTENELCBidXQgc29tZXRoaW5nIGVsc2UgdGhhdAorCSAqIGFmZmVjdHMgdGhlIG91dHB1dCB0byBMQ0QgKEkgdGhpbmsuIFNvbWVib2R5IGNsYXJpZnkpLiBJdCBkb2Vzbid0IGRvCisJICogaGFybSBoZXJlLCBhcyBTRFAgaXMgdGhlIG9ubHkgYm9hcmQgdXNpbmcgdGhpcyBjdXJyZW50bHkgKi8KKwlzdHJ1Y3QgcmVndWxhdG9yICp2ZHZpX3JlZzsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzIHNoYXJwX2xzX3RpbWluZ3MgPSB7CisJLnhfcmVzID0gNDgwLAorCS55X3JlcyA9IDY0MCwKKworCS5waXhlbF9jbG9jawk9IDE5MjAwLAorCisJLmhzdwkJPSAyLAorCS5oZnAJCT0gMSwKKwkuaGJwCQk9IDI4LAorCisJLnZzdwkJPSAxLAorCS52ZnAJCT0gMSwKKwkudmJwCQk9IDEsCit9OworCitzdGF0aWMgaW50IHNoYXJwX2xzX3BhbmVsX3Byb2JlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3Qgc2hhcnBfZGF0YSAqc2Q7CisKKwlkc3NkZXYtPnBhbmVsLmNvbmZpZyA9IE9NQVBfRFNTX0xDRF9URlQgfCBPTUFQX0RTU19MQ0RfSVZTIHwKKwkJT01BUF9EU1NfTENEX0lIUzsKKwlkc3NkZXYtPnBhbmVsLmFjYiA9IDB4Mjg7CisJZHNzZGV2LT5wYW5lbC50aW1pbmdzID0gc2hhcnBfbHNfdGltaW5nczsKKworCXNkID0ga3phbGxvYyhzaXplb2YoKnNkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXZfc2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2LCBzZCk7CisKKwlzZC0+dmR2aV9yZWcgPSByZWd1bGF0b3JfZ2V0KCZkc3NkZXYtPmRldiwgInZkdmkiKTsKKwlpZiAoSVNfRVJSKHNkLT52ZHZpX3JlZykpIHsKKwkJa2ZyZWUoc2QpOworCQlwcl9lcnIoImZhaWxlZCB0byBnZXQgVkRWSSByZWd1bGF0b3JcbiIpOworCQlyZXR1cm4gUFRSX0VSUihzZC0+dmR2aV9yZWcpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzaGFycF9sc19wYW5lbF9yZW1vdmUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBzaGFycF9kYXRhICpzZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOworCisJcmVndWxhdG9yX3B1dChzZC0+dmR2aV9yZWcpOworCisJa2ZyZWUoc2QpOworfQorCitzdGF0aWMgaW50IHNoYXJwX2xzX3BhbmVsX2VuYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJc3RydWN0IHNoYXJwX2RhdGEgKnNkID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7CisJaW50IHIgPSAwOworCisJLyogd2FpdCBjb3VwbGUgb2YgdnN5bmNzIHVudGlsIGVuYWJsaW5nIHRoZSBMQ0QgKi8KKwltc2xlZXAoNTApOworCisJcmVndWxhdG9yX2VuYWJsZShzZC0+dmR2aV9yZWcpOworCisJaWYgKGRzc2Rldi0+cGxhdGZvcm1fZW5hYmxlKQorCQlyID0gZHNzZGV2LT5wbGF0Zm9ybV9lbmFibGUoZHNzZGV2KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBzaGFycF9sc19wYW5lbF9kaXNhYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3Qgc2hhcnBfZGF0YSAqc2QgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKworCWlmIChkc3NkZXYtPnBsYXRmb3JtX2Rpc2FibGUpCisJCWRzc2Rldi0+cGxhdGZvcm1fZGlzYWJsZShkc3NkZXYpOworCisJcmVndWxhdG9yX2Rpc2FibGUoc2QtPnZkdmlfcmVnKTsKKworCS8qIHdhaXQgYXQgbGVhc3QgNSB2c3luY3MgYWZ0ZXIgZGlzYWJsaW5nIHRoZSBMQ0QgKi8KKworCW1zbGVlcCgxMDApOworfQorCitzdGF0aWMgaW50IHNoYXJwX2xzX3BhbmVsX3N1c3BlbmQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXNoYXJwX2xzX3BhbmVsX2Rpc2FibGUoZHNzZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaGFycF9sc19wYW5lbF9yZXN1bWUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXJldHVybiBzaGFycF9sc19wYW5lbF9lbmFibGUoZHNzZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kcml2ZXIgc2hhcnBfbHNfZHJpdmVyID0geworCS5wcm9iZQkJPSBzaGFycF9sc19wYW5lbF9wcm9iZSwKKwkucmVtb3ZlCQk9IHNoYXJwX2xzX3BhbmVsX3JlbW92ZSwKKworCS5lbmFibGUJCT0gc2hhcnBfbHNfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gc2hhcnBfbHNfcGFuZWxfZGlzYWJsZSwKKwkuc3VzcGVuZAk9IHNoYXJwX2xzX3BhbmVsX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzaGFycF9sc19wYW5lbF9yZXN1bWUsCisKKwkuZHJpdmVyICAgICAgICAgPSB7CisJCS5uYW1lICAgPSAic2hhcnBfbHNfcGFuZWwiLAorCQkub3duZXIgID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNoYXJwX2xzX3BhbmVsX2Rydl9pbml0KHZvaWQpCit7CisJcmV0dXJuIG9tYXBfZHNzX3JlZ2lzdGVyX2RyaXZlcigmc2hhcnBfbHNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNoYXJwX2xzX3BhbmVsX2Rydl9leGl0KHZvaWQpCit7CisJb21hcF9kc3NfdW5yZWdpc3Rlcl9kcml2ZXIoJnNoYXJwX2xzX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNoYXJwX2xzX3BhbmVsX2Rydl9pbml0KTsKK21vZHVsZV9leGl0KHNoYXJwX2xzX3BhbmVsX2Rydl9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtdGFhbC5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC10YWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwMWRmYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtdGFhbC5jCkBAIC0wLDAgKzEsMTAwMyBAQAorLyoKKyAqIFRhYWwgRFNJIGNvbW1hbmQgbW9kZSBwYW5lbAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBUb21pIFZhbGtlaW5lbiA8dG9taS52YWxrZWluZW5Abm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworLyojZGVmaW5lIERFQlVHKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8cGxhdC9kaXNwbGF5Lmg+CisKKy8qIERTSSBWaXJ0dWFsIGNoYW5uZWwuIEhhcmRjb2RlZCBmb3Igbm93LiAqLworI2RlZmluZSBUQ0ggMAorCisjZGVmaW5lIERDU19SRUFEX05VTV9FUlJPUlMJMHgwNQorI2RlZmluZSBEQ1NfUkVBRF9QT1dFUl9NT0RFCTB4MGEKKyNkZWZpbmUgRENTX1JFQURfTUFEQ1RMCQkweDBiCisjZGVmaW5lIERDU19SRUFEX1BJWEVMX0ZPUk1BVAkweDBjCisjZGVmaW5lIERDU19SRERTRFIJCTB4MGYKKyNkZWZpbmUgRENTX1NMRUVQX0lOCQkweDEwCisjZGVmaW5lIERDU19TTEVFUF9PVVQJCTB4MTEKKyNkZWZpbmUgRENTX0RJU1BMQVlfT0ZGCQkweDI4CisjZGVmaW5lIERDU19ESVNQTEFZX09OCQkweDI5CisjZGVmaW5lIERDU19DT0xVTU5fQUREUgkJMHgyYQorI2RlZmluZSBEQ1NfUEFHRV9BRERSCQkweDJiCisjZGVmaW5lIERDU19NRU1PUllfV1JJVEUJMHgyYworI2RlZmluZSBEQ1NfVEVBUl9PRkYJCTB4MzQKKyNkZWZpbmUgRENTX1RFQVJfT04JCTB4MzUKKyNkZWZpbmUgRENTX01FTV9BQ0NfQ1RSTAkweDM2CisjZGVmaW5lIERDU19QSVhFTF9GT1JNQVQJMHgzYQorI2RlZmluZSBEQ1NfQlJJR0hUTkVTUwkJMHg1MQorI2RlZmluZSBEQ1NfQ1RSTF9ESVNQTEFZCTB4NTMKKyNkZWZpbmUgRENTX1dSSVRFX0NBQkMJCTB4NTUKKyNkZWZpbmUgRENTX1JFQURfQ0FCQwkJMHg1NgorI2RlZmluZSBEQ1NfR0VUX0lEMQkJMHhkYQorI2RlZmluZSBEQ1NfR0VUX0lEMgkJMHhkYgorI2RlZmluZSBEQ1NfR0VUX0lEMwkJMHhkYworCisvKiAjZGVmaW5lIFRBQUxfVVNFX0VTRF9DSEVDSyAqLworI2RlZmluZSBUQUFMX0VTRF9DSEVDS19QRVJJT0QJbXNlY3NfdG9famlmZmllcyg1MDAwKQorCitzdHJ1Y3QgdGFhbF9kYXRhIHsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmxkZXY7CisKKwl1bnNpZ25lZCBsb25nCWh3X2d1YXJkX2VuZDsJLyogbmV4dCB2YWx1ZSBvZiBqaWZmaWVzIHdoZW4gd2UgY2FuCisJCQkJCSAqIGlzc3VlIHRoZSBuZXh0IHNsZWVwIGluL291dCBjb21tYW5kCisJCQkJCSAqLworCXVuc2lnbmVkIGxvbmcJaHdfZ3VhcmRfd2FpdDsJLyogbWF4IGd1YXJkIHRpbWUgaW4gamlmZmllcyAqLworCisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2OworCisJYm9vbCBlbmFibGVkOworCXU4IHJvdGF0ZTsKKwlib29sIG1pcnJvcjsKKworCWJvb2wgdGVfZW5hYmxlZDsKKwlib29sIHVzZV9leHRfdGU7CisJc3RydWN0IGNvbXBsZXRpb24gdGVfY29tcGxldGlvbjsKKworCWJvb2wgdXNlX2RzaV9ibDsKKworCWJvb2wgY2FiY19icm9rZW47CisJdW5zaWduZWQgY2FiY19tb2RlOworCisJYm9vbCBpbnRyb19wcmludGVkOworCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmVzZF93cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGVzZF93b3JrOworfTsKKworc3RhdGljIHZvaWQgdGFhbF9lc2Rfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCitzdGF0aWMgdm9pZCBod19ndWFyZF9zdGFydChzdHJ1Y3QgdGFhbF9kYXRhICp0ZCwgaW50IGd1YXJkX21zZWMpCit7CisJdGQtPmh3X2d1YXJkX3dhaXQgPSBtc2Vjc190b19qaWZmaWVzKGd1YXJkX21zZWMpOworCXRkLT5od19ndWFyZF9lbmQgPSBqaWZmaWVzICsgdGQtPmh3X2d1YXJkX3dhaXQ7Cit9CisKK3N0YXRpYyB2b2lkIGh3X2d1YXJkX3dhaXQoc3RydWN0IHRhYWxfZGF0YSAqdGQpCit7CisJdW5zaWduZWQgbG9uZyB3YWl0ID0gdGQtPmh3X2d1YXJkX2VuZCAtIGppZmZpZXM7CisKKwlpZiAoKGxvbmcpd2FpdCA+IDAgJiYgd2FpdCA8PSB0ZC0+aHdfZ3VhcmRfd2FpdCkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQod2FpdCk7CisJfQorfQorCitzdGF0aWMgaW50IHRhYWxfZGNzX3JlYWRfMSh1OCBkY3NfY21kLCB1OCAqZGF0YSkKK3sKKwlpbnQgcjsKKwl1OCBidWZbMV07CisKKwlyID0gZHNpX3ZjX2Rjc19yZWFkKFRDSCwgZGNzX2NtZCwgYnVmLCAxKTsKKworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwkqZGF0YSA9IGJ1ZlswXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhYWxfZGNzX3dyaXRlXzAodTggZGNzX2NtZCkKK3sKKwlyZXR1cm4gZHNpX3ZjX2Rjc193cml0ZShUQ0gsICZkY3NfY21kLCAxKTsKK30KKworc3RhdGljIGludCB0YWFsX2Rjc193cml0ZV8xKHU4IGRjc19jbWQsIHU4IHBhcmFtKQoreworCXU4IGJ1ZlsyXTsKKwlidWZbMF0gPSBkY3NfY21kOworCWJ1ZlsxXSA9IHBhcmFtOworCXJldHVybiBkc2lfdmNfZGNzX3dyaXRlKFRDSCwgYnVmLCAyKTsKK30KKworc3RhdGljIGludCB0YWFsX3NsZWVwX2luKHN0cnVjdCB0YWFsX2RhdGEgKnRkKQorCit7CisJdTggY21kOworCWludCByOworCisJaHdfZ3VhcmRfd2FpdCh0ZCk7CisKKwljbWQgPSBEQ1NfU0xFRVBfSU47CisJciA9IGRzaV92Y19kY3Nfd3JpdGVfbm9zeW5jKFRDSCwgJmNtZCwgMSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJaHdfZ3VhcmRfc3RhcnQodGQsIDEyMCk7CisKKwltc2xlZXAoNSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YWFsX3NsZWVwX291dChzdHJ1Y3QgdGFhbF9kYXRhICp0ZCkKK3sKKwlpbnQgcjsKKworCWh3X2d1YXJkX3dhaXQodGQpOworCisJciA9IHRhYWxfZGNzX3dyaXRlXzAoRENTX1NMRUVQX09VVCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJaHdfZ3VhcmRfc3RhcnQodGQsIDEyMCk7CisKKwltc2xlZXAoNSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YWFsX2dldF9pZCh1OCAqaWQxLCB1OCAqaWQyLCB1OCAqaWQzKQoreworCWludCByOworCisJciA9IHRhYWxfZGNzX3JlYWRfMShEQ1NfR0VUX0lEMSwgaWQxKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJciA9IHRhYWxfZGNzX3JlYWRfMShEQ1NfR0VUX0lEMiwgaWQyKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJciA9IHRhYWxfZGNzX3JlYWRfMShEQ1NfR0VUX0lEMywgaWQzKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YWFsX3NldF9hZGRyX21vZGUodTggcm90YXRlLCBib29sIG1pcnJvcikKK3sKKwlpbnQgcjsKKwl1OCBtb2RlOworCWludCBiNSwgYjYsIGI3OworCisJciA9IHRhYWxfZGNzX3JlYWRfMShEQ1NfUkVBRF9NQURDVEwsICZtb2RlKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlzd2l0Y2ggKHJvdGF0ZSkgeworCWRlZmF1bHQ6CisJY2FzZSAwOgorCQliNyA9IDA7CisJCWI2ID0gMDsKKwkJYjUgPSAwOworCQlicmVhazsKKwljYXNlIDE6CisJCWI3ID0gMDsKKwkJYjYgPSAxOworCQliNSA9IDE7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJYjcgPSAxOworCQliNiA9IDE7CisJCWI1ID0gMDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQliNyA9IDE7CisJCWI2ID0gMDsKKwkJYjUgPSAxOworCQlicmVhazsKKwl9CisKKwlpZiAobWlycm9yKQorCQliNiA9ICFiNjsKKworCW1vZGUgJj0gfigoMTw8NykgfCAoMTw8NikgfCAoMTw8NSkpOworCW1vZGUgfD0gKGI3IDw8IDcpIHwgKGI2IDw8IDYpIHwgKGI1IDw8IDUpOworCisJcmV0dXJuIHRhYWxfZGNzX3dyaXRlXzEoRENTX01FTV9BQ0NfQ1RSTCwgbW9kZSk7Cit9CisKK3N0YXRpYyBpbnQgdGFhbF9zZXRfdXBkYXRlX3dpbmRvdyh1MTYgeCwgdTE2IHksIHUxNiB3LCB1MTYgaCkKK3sKKwlpbnQgcjsKKwl1MTYgeDEgPSB4OworCXUxNiB4MiA9IHggKyB3IC0gMTsKKwl1MTYgeTEgPSB5OworCXUxNiB5MiA9IHkgKyBoIC0gMTsKKworCXU4IGJ1Zls1XTsKKwlidWZbMF0gPSBEQ1NfQ09MVU1OX0FERFI7CisJYnVmWzFdID0gKHgxID4+IDgpICYgMHhmZjsKKwlidWZbMl0gPSAoeDEgPj4gMCkgJiAweGZmOworCWJ1ZlszXSA9ICh4MiA+PiA4KSAmIDB4ZmY7CisJYnVmWzRdID0gKHgyID4+IDApICYgMHhmZjsKKworCXIgPSBkc2lfdmNfZGNzX3dyaXRlX25vc3luYyhUQ0gsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWJ1ZlswXSA9IERDU19QQUdFX0FERFI7CisJYnVmWzFdID0gKHkxID4+IDgpICYgMHhmZjsKKwlidWZbMl0gPSAoeTEgPj4gMCkgJiAweGZmOworCWJ1ZlszXSA9ICh5MiA+PiA4KSAmIDB4ZmY7CisJYnVmWzRdID0gKHkyID4+IDApICYgMHhmZjsKKworCXIgPSBkc2lfdmNfZGNzX3dyaXRlX25vc3luYyhUQ0gsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWRzaV92Y19zZW5kX2J0YV9zeW5jKFRDSCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCB0YWFsX2JsX3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKKwlzdHJ1Y3QgdGFhbF9kYXRhICp0ZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOworCWludCByOworCWludCBsZXZlbDsKKworCWlmIChkZXYtPnByb3BzLmZiX2JsYW5rID09IEZCX0JMQU5LX1VOQkxBTksgJiYKKwkJCWRldi0+cHJvcHMucG93ZXIgPT0gRkJfQkxBTktfVU5CTEFOSykKKwkJbGV2ZWwgPSBkZXYtPnByb3BzLmJyaWdodG5lc3M7CisJZWxzZQorCQlsZXZlbCA9IDA7CisKKwlkZXZfZGJnKCZkc3NkZXYtPmRldiwgInVwZGF0ZSBicmlnaHRuZXNzIHRvICVkXG4iLCBsZXZlbCk7CisKKwlpZiAodGQtPnVzZV9kc2lfYmwpIHsKKwkJaWYgKHRkLT5lbmFibGVkKSB7CisJCQlkc2lfYnVzX2xvY2soKTsKKwkJCXIgPSB0YWFsX2Rjc193cml0ZV8xKERDU19CUklHSFRORVNTLCBsZXZlbCk7CisJCQlkc2lfYnVzX3VubG9jaygpOworCQkJaWYgKHIpCisJCQkJcmV0dXJuIHI7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIWRzc2Rldi0+c2V0X2JhY2tsaWdodCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXIgPSBkc3NkZXYtPnNldF9iYWNrbGlnaHQoZHNzZGV2LCBsZXZlbCk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFhbF9ibF9nZXRfaW50ZW5zaXR5KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+cHJvcHMuZmJfYmxhbmsgPT0gRkJfQkxBTktfVU5CTEFOSyAmJgorCQkJZGV2LT5wcm9wcy5wb3dlciA9PSBGQl9CTEFOS19VTkJMQU5LKQorCQlyZXR1cm4gZGV2LT5wcm9wcy5icmlnaHRuZXNzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X29wcyB0YWFsX2JsX29wcyA9IHsKKwkuZ2V0X2JyaWdodG5lc3MgPSB0YWFsX2JsX2dldF9pbnRlbnNpdHksCisJLnVwZGF0ZV9zdGF0dXMgID0gdGFhbF9ibF91cGRhdGVfc3RhdHVzLAorfTsKKworc3RhdGljIHZvaWQgdGFhbF9nZXRfdGltaW5ncyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCisJCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKQoreworCSp0aW1pbmdzID0gZHNzZGV2LT5wYW5lbC50aW1pbmdzOworfQorCitzdGF0aWMgdm9pZCB0YWFsX2dldF9yZXNvbHV0aW9uKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJdTE2ICp4cmVzLCB1MTYgKnlyZXMpCit7CisJc3RydWN0IHRhYWxfZGF0YSAqdGQgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKworCWlmICh0ZC0+cm90YXRlID09IDAgfHwgdGQtPnJvdGF0ZSA9PSAyKSB7CisJCSp4cmVzID0gZHNzZGV2LT5wYW5lbC50aW1pbmdzLnhfcmVzOworCQkqeXJlcyA9IGRzc2Rldi0+cGFuZWwudGltaW5ncy55X3JlczsKKwl9IGVsc2UgeworCQkqeXJlcyA9IGRzc2Rldi0+cGFuZWwudGltaW5ncy54X3JlczsKKwkJKnhyZXMgPSBkc3NkZXYtPnBhbmVsLnRpbWluZ3MueV9yZXM7CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgdGFhbF90ZV9pc3IoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSBkYXRhOworCXN0cnVjdCB0YWFsX2RhdGEgKnRkID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7CisKKwljb21wbGV0ZV9hbGwoJnRkLT50ZV9jb21wbGV0aW9uKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHNzaXplX3QgdGFhbF9udW1fZXJyb3JzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiA9IHRvX2Rzc19kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgdGFhbF9kYXRhICp0ZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOworCXU4IGVycm9yczsKKwlpbnQgcjsKKworCWlmICh0ZC0+ZW5hYmxlZCkgeworCQlkc2lfYnVzX2xvY2soKTsKKwkJciA9IHRhYWxfZGNzX3JlYWRfMShEQ1NfUkVBRF9OVU1fRVJST1JTLCAmZXJyb3JzKTsKKwkJZHNpX2J1c191bmxvY2soKTsKKwl9IGVsc2UgeworCQlyID0gLUVOT0RFVjsKKwl9CisKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgZXJyb3JzKTsKK30KKworc3RhdGljIHNzaXplX3QgdGFhbF9od19yZXZpc2lvbl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSB0b19kc3NfZGV2aWNlKGRldik7CisJc3RydWN0IHRhYWxfZGF0YSAqdGQgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKwl1OCBpZDEsIGlkMiwgaWQzOworCWludCByOworCisJaWYgKHRkLT5lbmFibGVkKSB7CisJCWRzaV9idXNfbG9jaygpOworCQlyID0gdGFhbF9nZXRfaWQoJmlkMSwgJmlkMiwgJmlkMyk7CisJCWRzaV9idXNfdW5sb2NrKCk7CisJfSBlbHNlIHsKKwkJciA9IC1FTk9ERVY7CisJfQorCisJaWYgKHIpCisJCXJldHVybiByOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJTAyeC4lMDJ4LiUwMnhcbiIsIGlkMSwgaWQyLCBpZDMpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY2FiY19tb2Rlc1tdID0geworCSJvZmYiLAkJLyogdXNlZCBhbHNvIGFsd2F5cyB3aGVuIENBQkMgaXMgbm90IHN1cHBvcnRlZCAqLworCSJ1aSIsCisJInN0aWxsLWltYWdlIiwKKwkibW92aW5nLWltYWdlIiwKK307CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfY2FiY19tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSB0b19kc3NfZGV2aWNlKGRldik7CisJc3RydWN0IHRhYWxfZGF0YSAqdGQgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKwljb25zdCBjaGFyICptb2RlX3N0cjsKKwlpbnQgbW9kZTsKKwlpbnQgbGVuOworCisJbW9kZSA9IHRkLT5jYWJjX21vZGU7CisKKwltb2RlX3N0ciA9ICJ1bmtub3duIjsKKwlpZiAobW9kZSA+PSAwICYmIG1vZGUgPCBBUlJBWV9TSVpFKGNhYmNfbW9kZXMpKQorCQltb2RlX3N0ciA9IGNhYmNfbW9kZXNbbW9kZV07CisJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgbW9kZV9zdHIpOworCisJcmV0dXJuIGxlbiA8IFBBR0VfU0laRSAtIDEgPyBsZW4gOiBQQUdFX1NJWkUgLSAxOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9jYWJjX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gdG9fZHNzX2RldmljZShkZXYpOworCXN0cnVjdCB0YWFsX2RhdGEgKnRkID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjYWJjX21vZGVzKTsgaSsrKSB7CisJCWlmIChzeXNmc19zdHJlcShjYWJjX21vZGVzW2ldLCBidWYpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gQVJSQVlfU0laRShjYWJjX21vZGVzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGQtPmVuYWJsZWQpIHsKKwkJZHNpX2J1c19sb2NrKCk7CisJCWlmICghdGQtPmNhYmNfYnJva2VuKQorCQkJdGFhbF9kY3Nfd3JpdGVfMShEQ1NfV1JJVEVfQ0FCQywgaSk7CisJCWRzaV9idXNfdW5sb2NrKCk7CisJfQorCisJdGQtPmNhYmNfbW9kZSA9IGk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfY2FiY19hdmFpbGFibGVfbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCBsZW47CisJaW50IGk7CisKKwlmb3IgKGkgPSAwLCBsZW4gPSAwOworCSAgICAgbGVuIDwgUEFHRV9TSVpFICYmIGkgPCBBUlJBWV9TSVpFKGNhYmNfbW9kZXMpOyBpKyspCisJCWxlbiArPSBzbnByaW50ZigmYnVmW2xlbl0sIFBBR0VfU0laRSAtIGxlbiwgIiVzJXMlcyIsCisJCQlpID8gIiAiIDogIiIsIGNhYmNfbW9kZXNbaV0sCisJCQlpID09IEFSUkFZX1NJWkUoY2FiY19tb2RlcykgLSAxID8gIlxuIiA6ICIiKTsKKworCXJldHVybiBsZW4gPCBQQUdFX1NJWkUgPyBsZW4gOiBQQUdFX1NJWkUgLSAxOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIobnVtX2RzaV9lcnJvcnMsIFNfSVJVR08sIHRhYWxfbnVtX2Vycm9yc19zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihod19yZXZpc2lvbiwgU19JUlVHTywgdGFhbF9od19yZXZpc2lvbl9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihjYWJjX21vZGUsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlzaG93X2NhYmNfbW9kZSwgc3RvcmVfY2FiY19tb2RlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihjYWJjX2F2YWlsYWJsZV9tb2RlcywgU19JUlVHTywKKwkJc2hvd19jYWJjX2F2YWlsYWJsZV9tb2RlcywgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0YWFsX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX251bV9kc2lfZXJyb3JzLmF0dHIsCisJJmRldl9hdHRyX2h3X3JldmlzaW9uLmF0dHIsCisJJmRldl9hdHRyX2NhYmNfbW9kZS5hdHRyLAorCSZkZXZfYXR0cl9jYWJjX2F2YWlsYWJsZV9tb2Rlcy5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB0YWFsX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gdGFhbF9hdHRycywKK307CisKK3N0YXRpYyBpbnQgdGFhbF9wcm9iZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJc3RydWN0IHRhYWxfZGF0YSAqdGQ7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsZGV2OworCWludCByOworCisJY29uc3Qgc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyB0YWFsX3BhbmVsX3RpbWluZ3MgPSB7CisJCS54X3JlcwkJPSA4NjQsCisJCS55X3JlcwkJPSA0ODAsCisJfTsKKworCWRldl9kYmcoJmRzc2Rldi0+ZGV2LCAicHJvYmVcbiIpOworCisJZHNzZGV2LT5wYW5lbC5jb25maWcgPSBPTUFQX0RTU19MQ0RfVEZUOworCWRzc2Rldi0+cGFuZWwudGltaW5ncyA9IHRhYWxfcGFuZWxfdGltaW5nczsKKwlkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZSA9IDI0OworCisJdGQgPSBremFsbG9jKHNpemVvZigqdGQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRkKSB7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGVycjA7CisJfQorCXRkLT5kc3NkZXYgPSBkc3NkZXY7CisKKwl0ZC0+ZXNkX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInRhYWxfZXNkIik7CisJaWYgKHRkLT5lc2Rfd3EgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgImNhbid0IGNyZWF0ZSBFU0Qgd29ya3F1ZXVlXG4iKTsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gZXJyMjsKKwl9CisJSU5JVF9ERUxBWUVEX1dPUktfREVGRVJSQUJMRSgmdGQtPmVzZF93b3JrLCB0YWFsX2VzZF93b3JrKTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYsIHRkKTsKKworCWRzc2Rldi0+Z2V0X3RpbWluZ3MgPSB0YWFsX2dldF90aW1pbmdzOworCWRzc2Rldi0+Z2V0X3Jlc29sdXRpb24gPSB0YWFsX2dldF9yZXNvbHV0aW9uOworCisJLyogaWYgbm8gcGxhdGZvcm0gc2V0X2JhY2tsaWdodCgpIGRlZmluZWQsIHByZXN1bWUgRFNJIGJhY2tsaWdodAorCSAqIGNvbnRyb2wgKi8KKwlpZiAoIWRzc2Rldi0+c2V0X2JhY2tsaWdodCkKKwkJdGQtPnVzZV9kc2lfYmwgPSB0cnVlOworCisJYmxkZXYgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKCJ0YWFsIiwgJmRzc2Rldi0+ZGV2LCBkc3NkZXYsCisJCQkmdGFhbF9ibF9vcHMpOworCWlmIChJU19FUlIoYmxkZXYpKSB7CisJCXIgPSBQVFJfRVJSKGJsZGV2KTsKKwkJZ290byBlcnIxOworCX0KKworCXRkLT5ibGRldiA9IGJsZGV2OworCisJYmxkZXYtPnByb3BzLmZiX2JsYW5rID0gRkJfQkxBTktfVU5CTEFOSzsKKwlibGRldi0+cHJvcHMucG93ZXIgPSBGQl9CTEFOS19VTkJMQU5LOworCWlmICh0ZC0+dXNlX2RzaV9ibCkgeworCQlibGRldi0+cHJvcHMubWF4X2JyaWdodG5lc3MgPSAyNTU7CisJCWJsZGV2LT5wcm9wcy5icmlnaHRuZXNzID0gMjU1OworCX0gZWxzZSB7CisJCWJsZGV2LT5wcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IDEyNzsKKwkJYmxkZXYtPnByb3BzLmJyaWdodG5lc3MgPSAxMjc7CisJfQorCisJdGFhbF9ibF91cGRhdGVfc3RhdHVzKGJsZGV2KTsKKworCWlmIChkc3NkZXYtPnBoeS5kc2kuZXh0X3RlKSB7CisJCWludCBncGlvID0gZHNzZGV2LT5waHkuZHNpLmV4dF90ZV9ncGlvOworCisJCXIgPSBncGlvX3JlcXVlc3QoZ3BpbywgInRhYWwgaXJxIik7CisJCWlmIChyKSB7CisJCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgIkdQSU8gcmVxdWVzdCBmYWlsZWRcbiIpOworCQkJZ290byBlcnIzOworCQl9CisKKwkJZ3Bpb19kaXJlY3Rpb25faW5wdXQoZ3Bpbyk7CisKKwkJciA9IHJlcXVlc3RfaXJxKGdwaW9fdG9faXJxKGdwaW8pLCB0YWFsX3RlX2lzciwKKwkJCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9UUklHR0VSX1JJU0lORywKKwkJCQkidGFhbCB2c3luYyIsIGRzc2Rldik7CisKKwkJaWYgKHIpIHsKKwkJCWRldl9lcnIoJmRzc2Rldi0+ZGV2LCAiSVJRIHJlcXVlc3QgZmFpbGVkXG4iKTsKKwkJCWdwaW9fZnJlZShncGlvKTsKKwkJCWdvdG8gZXJyMzsKKwkJfQorCisJCWluaXRfY29tcGxldGlvbigmdGQtPnRlX2NvbXBsZXRpb24pOworCisJCXRkLT51c2VfZXh0X3RlID0gdHJ1ZTsKKwl9CisKKwlyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkc3NkZXYtPmRldi5rb2JqLCAmdGFhbF9hdHRyX2dyb3VwKTsKKwlpZiAocikgeworCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZmlsZXNcbiIpOworCQlnb3RvIGVycjQ7CisJfQorCisJcmV0dXJuIDA7CitlcnI0OgorCWlmICh0ZC0+dXNlX2V4dF90ZSkgeworCQlpbnQgZ3BpbyA9IGRzc2Rldi0+cGh5LmRzaS5leHRfdGVfZ3BpbzsKKwkJZnJlZV9pcnEoZ3Bpb190b19pcnEoZ3BpbyksIGRzc2Rldik7CisJCWdwaW9fZnJlZShncGlvKTsKKwl9CitlcnIzOgorCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihibGRldik7CitlcnIyOgorCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdGQtPmVzZF93b3JrKTsKKwlkZXN0cm95X3dvcmtxdWV1ZSh0ZC0+ZXNkX3dxKTsKK2VycjE6CisJa2ZyZWUodGQpOworZXJyMDoKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgdGFhbF9yZW1vdmUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCB0YWFsX2RhdGEgKnRkID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsZGV2OworCisJZGV2X2RiZygmZHNzZGV2LT5kZXYsICJyZW1vdmVcbiIpOworCisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkc3NkZXYtPmRldi5rb2JqLCAmdGFhbF9hdHRyX2dyb3VwKTsKKworCWlmICh0ZC0+dXNlX2V4dF90ZSkgeworCQlpbnQgZ3BpbyA9IGRzc2Rldi0+cGh5LmRzaS5leHRfdGVfZ3BpbzsKKwkJZnJlZV9pcnEoZ3Bpb190b19pcnEoZ3BpbyksIGRzc2Rldik7CisJCWdwaW9fZnJlZShncGlvKTsKKwl9CisKKwlibGRldiA9IHRkLT5ibGRldjsKKwlibGRldi0+cHJvcHMucG93ZXIgPSBGQl9CTEFOS19QT1dFUkRPV047CisJdGFhbF9ibF91cGRhdGVfc3RhdHVzKGJsZGV2KTsKKwliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmxkZXYpOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ0ZC0+ZXNkX3dvcmspOworCWRlc3Ryb3lfd29ya3F1ZXVlKHRkLT5lc2Rfd3EpOworCisJa2ZyZWUodGQpOworfQorCitzdGF0aWMgaW50IHRhYWxfZW5hYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgdGFhbF9kYXRhICp0ZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOworCXU4IGlkMSwgaWQyLCBpZDM7CisJaW50IHI7CisKKwlkZXZfZGJnKCZkc3NkZXYtPmRldiwgImVuYWJsZVxuIik7CisKKwlpZiAoZHNzZGV2LT5wbGF0Zm9ybV9lbmFibGUpIHsKKwkJciA9IGRzc2Rldi0+cGxhdGZvcm1fZW5hYmxlKGRzc2Rldik7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJfQorCisJLyogaXQgc2VlbXMgd2UgaGF2ZSB0byB3YWl0IGEgYml0IHVudGlsIHRhYWwgaXMgcmVhZHkgKi8KKwltc2xlZXAoNSk7CisKKwlyID0gdGFhbF9zbGVlcF9vdXQodGQpOworCWlmIChyKQorCQlnb3RvIGVycjsKKworCXIgPSB0YWFsX2dldF9pZCgmaWQxLCAmaWQyLCAmaWQzKTsKKwlpZiAocikKKwkJZ290byBlcnI7CisKKwkvKiBvbiBlYXJseSByZXZpc2lvbnMgQ0FCQyBpcyBicm9rZW4gKi8KKwlpZiAoaWQyID09IDB4MDAgfHwgaWQyID09IDB4ZmYgfHwgaWQyID09IDB4ODEpCisJCXRkLT5jYWJjX2Jyb2tlbiA9IHRydWU7CisKKwl0YWFsX2Rjc193cml0ZV8xKERDU19CUklHSFRORVNTLCAweGZmKTsKKwl0YWFsX2Rjc193cml0ZV8xKERDU19DVFJMX0RJU1BMQVksICgxPDwyKSB8ICgxPDw1KSk7IC8qIEJMIHwgQkNUUkwgKi8KKworCXRhYWxfZGNzX3dyaXRlXzEoRENTX1BJWEVMX0ZPUk1BVCwgMHg3KTsgLyogMjRiaXQvcGl4ZWwgKi8KKworCXRhYWxfc2V0X2FkZHJfbW9kZSh0ZC0+cm90YXRlLCB0ZC0+bWlycm9yKTsKKwlpZiAoIXRkLT5jYWJjX2Jyb2tlbikKKwkJdGFhbF9kY3Nfd3JpdGVfMShEQ1NfV1JJVEVfQ0FCQywgdGQtPmNhYmNfbW9kZSk7CisKKwl0YWFsX2Rjc193cml0ZV8wKERDU19ESVNQTEFZX09OKTsKKworI2lmZGVmIFRBQUxfVVNFX0VTRF9DSEVDSworCXF1ZXVlX2RlbGF5ZWRfd29yayh0ZC0+ZXNkX3dxLCAmdGQtPmVzZF93b3JrLCBUQUFMX0VTRF9DSEVDS19QRVJJT0QpOworI2VuZGlmCisKKwl0ZC0+ZW5hYmxlZCA9IDE7CisKKwlpZiAoIXRkLT5pbnRyb19wcmludGVkKSB7CisJCWRldl9pbmZvKCZkc3NkZXYtPmRldiwgInJldmlzaW9uICUwMnguJTAyeC4lMDJ4XG4iLAorCQkJCWlkMSwgaWQyLCBpZDMpOworCQlpZiAodGQtPmNhYmNfYnJva2VuKQorCQkJZGV2X2luZm8oJmRzc2Rldi0+ZGV2LAorCQkJCQkib2xkIFRhYWwgdmVyc2lvbiwgQ0FCQyBkaXNhYmxlZFxuIik7CisJCXRkLT5pbnRyb19wcmludGVkID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gMDsKK2VycjoKKwlpZiAoZHNzZGV2LT5wbGF0Zm9ybV9kaXNhYmxlKQorCQlkc3NkZXYtPnBsYXRmb3JtX2Rpc2FibGUoZHNzZGV2KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCB0YWFsX2Rpc2FibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCB0YWFsX2RhdGEgKnRkID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7CisKKwlkZXZfZGJnKCZkc3NkZXYtPmRldiwgImRpc2FibGVcbiIpOworCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmdGQtPmVzZF93b3JrKTsKKworCXRhYWxfZGNzX3dyaXRlXzAoRENTX0RJU1BMQVlfT0ZGKTsKKwl0YWFsX3NsZWVwX2luKHRkKTsKKworCS8qIHdhaXQgYSBiaXQgc28gdGhhdCB0aGUgbWVzc2FnZSBnb2VzIHRocm91Z2ggKi8KKwltc2xlZXAoMTApOworCisJaWYgKGRzc2Rldi0+cGxhdGZvcm1fZGlzYWJsZSkKKwkJZHNzZGV2LT5wbGF0Zm9ybV9kaXNhYmxlKGRzc2Rldik7CisKKwl0ZC0+ZW5hYmxlZCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgdGFhbF9zdXNwZW5kKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgdGFhbF9kYXRhICp0ZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibGRldiA9IHRkLT5ibGRldjsKKworCWJsZGV2LT5wcm9wcy5wb3dlciA9IEZCX0JMQU5LX1BPV0VSRE9XTjsKKwl0YWFsX2JsX3VwZGF0ZV9zdGF0dXMoYmxkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFhbF9yZXN1bWUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCB0YWFsX2RhdGEgKnRkID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsZGV2ID0gdGQtPmJsZGV2OworCisJYmxkZXYtPnByb3BzLnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKKwl0YWFsX2JsX3VwZGF0ZV9zdGF0dXMoYmxkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRhYWxfc2V0dXBfdXBkYXRlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJCQkgICAgdTE2IHgsIHUxNiB5LCB1MTYgdywgdTE2IGgpCit7CisJdGFhbF9zZXRfdXBkYXRlX3dpbmRvdyh4LCB5LCB3LCBoKTsKK30KKworc3RhdGljIGludCB0YWFsX2VuYWJsZV90ZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCB0YWFsX2RhdGEgKnRkID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7CisJaW50IHI7CisKKwl0ZC0+dGVfZW5hYmxlZCA9IGVuYWJsZTsKKworCWlmIChlbmFibGUpCisJCXIgPSB0YWFsX2Rjc193cml0ZV8xKERDU19URUFSX09OLCAwKTsKKwllbHNlCisJCXIgPSB0YWFsX2Rjc193cml0ZV8wKERDU19URUFSX09GRik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCB0YWFsX3dhaXRfdGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCB0YWFsX2RhdGEgKnRkID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7CisJbG9uZyB3YWl0ID0gbXNlY3NfdG9famlmZmllcyg1MDApOworCisJaWYgKCF0ZC0+dXNlX2V4dF90ZSB8fCAhdGQtPnRlX2VuYWJsZWQpCisJCXJldHVybiAwOworCisJSU5JVF9DT01QTEVUSU9OKHRkLT50ZV9jb21wbGV0aW9uKTsKKwl3YWl0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ0ZC0+dGVfY29tcGxldGlvbiwgd2FpdCk7CisJaWYgKHdhaXQgPT0gMCkgeworCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgInRpbWVvdXQgd2FpdGluZyBURVxuIik7CisJCXJldHVybiAtRVRJTUU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFhbF9yb3RhdGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCB1OCByb3RhdGUpCit7CisJc3RydWN0IHRhYWxfZGF0YSAqdGQgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKwlpbnQgcjsKKworCWRldl9kYmcoJmRzc2Rldi0+ZGV2LCAicm90YXRlICVkXG4iLCByb3RhdGUpOworCisJaWYgKHRkLT5lbmFibGVkKSB7CisJCXIgPSB0YWFsX3NldF9hZGRyX21vZGUocm90YXRlLCB0ZC0+bWlycm9yKTsKKworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKworCXRkLT5yb3RhdGUgPSByb3RhdGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU4IHRhYWxfZ2V0X3JvdGF0ZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJc3RydWN0IHRhYWxfZGF0YSAqdGQgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKwlyZXR1cm4gdGQtPnJvdGF0ZTsKK30KKworc3RhdGljIGludCB0YWFsX21pcnJvcihzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCB0YWFsX2RhdGEgKnRkID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7CisJaW50IHI7CisKKwlkZXZfZGJnKCZkc3NkZXYtPmRldiwgIm1pcnJvciAlZFxuIiwgZW5hYmxlKTsKKworCWlmICh0ZC0+ZW5hYmxlZCkgeworCQlyID0gdGFhbF9zZXRfYWRkcl9tb2RlKHRkLT5yb3RhdGUsIGVuYWJsZSk7CisKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwl9CisKKwl0ZC0+bWlycm9yID0gZW5hYmxlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIHRhYWxfZ2V0X21pcnJvcihzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJc3RydWN0IHRhYWxfZGF0YSAqdGQgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKwlyZXR1cm4gdGQtPm1pcnJvcjsKK30KKworc3RhdGljIGludCB0YWFsX3J1bl90ZXN0KHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IHRlc3RfbnVtKQoreworCXU4IGlkMSwgaWQyLCBpZDM7CisJaW50IHI7CisKKwlyID0gdGFhbF9kY3NfcmVhZF8xKERDU19HRVRfSUQxLCAmaWQxKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJciA9IHRhYWxfZGNzX3JlYWRfMShEQ1NfR0VUX0lEMiwgJmlkMik7CisJaWYgKHIpCisJCXJldHVybiByOworCXIgPSB0YWFsX2Rjc19yZWFkXzEoRENTX0dFVF9JRDMsICZpZDMpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhYWxfbWVtb3J5X3JlYWQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQl2b2lkICpidWYsIHNpemVfdCBzaXplLAorCQl1MTYgeCwgdTE2IHksIHUxNiB3LCB1MTYgaCkKK3sKKwlpbnQgcjsKKwlpbnQgZmlyc3QgPSAxOworCWludCBwbGVuOworCXVuc2lnbmVkIGJ1Zl91c2VkID0gMDsKKworCWlmIChzaXplIDwgdyAqIGggKiAzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNpemUgPSBtaW4odyAqIGggKiAzLAorCQkJZHNzZGV2LT5wYW5lbC50aW1pbmdzLnhfcmVzICoKKwkJCWRzc2Rldi0+cGFuZWwudGltaW5ncy55X3JlcyAqIDMpOworCisJLyogcGxlbiAxIG9yIDIgZ29lcyBpbnRvIHNob3J0IHBhY2tldC4gdW50aWwgY2hlY2tzdW0gZXJyb3IgaXMgZml4ZWQsCisJICogdXNlIHNob3J0IHBhY2tldHMuIHBsZW4gMzIgd29ya3MsIGJ1dCBiaWdnZXIgcGFja2V0cyBzZWVtIHRvIGNhdXNlCisJICogYW4gZXJyb3IuICovCisJaWYgKHNpemUgJSAyKQorCQlwbGVuID0gMTsKKwllbHNlCisJCXBsZW4gPSAyOworCisJdGFhbF9zZXR1cF91cGRhdGUoZHNzZGV2LCB4LCB5LCB3LCBoKTsKKworCXIgPSBkc2lfdmNfc2V0X21heF9yeF9wYWNrZXRfc2l6ZShUQ0gsIHBsZW4pOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXdoaWxlIChidWZfdXNlZCA8IHNpemUpIHsKKwkJdTggZGNzX2NtZCA9IGZpcnN0ID8gMHgyZSA6IDB4M2U7CisJCWZpcnN0ID0gMDsKKworCQlyID0gZHNpX3ZjX2Rjc19yZWFkKFRDSCwgZGNzX2NtZCwKKwkJCQlidWYgKyBidWZfdXNlZCwgc2l6ZSAtIGJ1Zl91c2VkKTsKKworCQlpZiAociA8IDApIHsKKwkJCWRldl9lcnIoJmRzc2Rldi0+ZGV2LCAicmVhZCBlcnJvclxuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWJ1Zl91c2VkICs9IHI7CisKKwkJaWYgKHIgPCBwbGVuKSB7CisJCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgInNob3J0IHJlYWRcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCWRldl9lcnIoJmRzc2Rldi0+ZGV2LCAic2lnbmFsIHBlbmRpbmcsICIKKwkJCQkJImFib3J0aW5nIG1lbW9yeSByZWFkXG4iKTsKKwkJCXIgPSAtRVJFU1RBUlRTWVM7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCXIgPSBidWZfdXNlZDsKKworZXJyOgorCWRzaV92Y19zZXRfbWF4X3J4X3BhY2tldF9zaXplKFRDSCwgMSk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgdGFhbF9lc2Rfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHRhYWxfZGF0YSAqdGQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHRhYWxfZGF0YSwKKwkJCWVzZF93b3JrLndvcmspOworCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiA9IHRkLT5kc3NkZXY7CisJdTggc3RhdGUxLCBzdGF0ZTI7CisJaW50IHI7CisKKwlpZiAoIXRkLT5lbmFibGVkKQorCQlyZXR1cm47CisKKwlkc2lfYnVzX2xvY2soKTsKKworCXIgPSB0YWFsX2Rjc19yZWFkXzEoRENTX1JERFNEUiwgJnN0YXRlMSk7CisJaWYgKHIpIHsKKwkJZGV2X2VycigmZHNzZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVhZCBUYWFsIHN0YXR1c1xuIik7CisJCWdvdG8gZXJyOworCX0KKworCS8qIFJ1biBzZWxmIGRpYWdub3N0aWNzICovCisJciA9IHRhYWxfc2xlZXBfb3V0KHRkKTsKKwlpZiAocikgeworCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgImZhaWxlZCB0byBydW4gVGFhbCBzZWxmLWRpYWdub3N0aWNzXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJciA9IHRhYWxfZGNzX3JlYWRfMShEQ1NfUkREU0RSLCAmc3RhdGUyKTsKKwlpZiAocikgeworCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgImZhaWxlZCB0byByZWFkIFRhYWwgc3RhdHVzXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogRWFjaCBzbGVlcCBvdXQgY29tbWFuZCB3aWxsIHRyaWdnZXIgYSBzZWxmIGRpYWdub3N0aWMgYW5kIGZsaXAKKwkgKiBCaXQ2IGlmIHRoZSB0ZXN0IHBhc3Nlcy4KKwkgKi8KKwlpZiAoISgoc3RhdGUxIF4gc3RhdGUyKSAmICgxIDw8IDYpKSkgeworCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgIkxDRCBzZWxmIGRpYWdub3N0aWNzIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyOworCX0KKwkvKiBTZWxmLWRpYWdub3N0aWNzIHJlc3VsdCBpcyBhbHNvIHNob3duIG9uIFRFIEdQSU8gbGluZS4gV2UgbmVlZAorCSAqIHRvIHJlLWVuYWJsZSBURSBhZnRlciBzZWxmIGRpYWdub3N0aWNzICovCisJaWYgKHRkLT51c2VfZXh0X3RlICYmIHRkLT50ZV9lbmFibGVkKQorCQl0YWFsX2VuYWJsZV90ZShkc3NkZXYsIHRydWUpOworCisJZHNpX2J1c191bmxvY2soKTsKKworCXF1ZXVlX2RlbGF5ZWRfd29yayh0ZC0+ZXNkX3dxLCAmdGQtPmVzZF93b3JrLCBUQUFMX0VTRF9DSEVDS19QRVJJT0QpOworCisJcmV0dXJuOworZXJyOgorCWRldl9lcnIoJmRzc2Rldi0+ZGV2LCAicGVyZm9ybWluZyBMQ0QgcmVzZXRcbiIpOworCisJdGFhbF9kaXNhYmxlKGRzc2Rldik7CisJdGFhbF9lbmFibGUoZHNzZGV2KTsKKworCWRzaV9idXNfdW5sb2NrKCk7CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsodGQtPmVzZF93cSwgJnRkLT5lc2Rfd29yaywgVEFBTF9FU0RfQ0hFQ0tfUEVSSU9EKTsKK30KKworc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kcml2ZXIgdGFhbF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHRhYWxfcHJvYmUsCisJLnJlbW92ZQkJPSB0YWFsX3JlbW92ZSwKKworCS5lbmFibGUJCT0gdGFhbF9lbmFibGUsCisJLmRpc2FibGUJPSB0YWFsX2Rpc2FibGUsCisJLnN1c3BlbmQJPSB0YWFsX3N1c3BlbmQsCisJLnJlc3VtZQkJPSB0YWFsX3Jlc3VtZSwKKworCS5zZXR1cF91cGRhdGUJPSB0YWFsX3NldHVwX3VwZGF0ZSwKKwkuZW5hYmxlX3RlCT0gdGFhbF9lbmFibGVfdGUsCisJLndhaXRfZm9yX3RlCT0gdGFhbF93YWl0X3RlLAorCS5zZXRfcm90YXRlCT0gdGFhbF9yb3RhdGUsCisJLmdldF9yb3RhdGUJPSB0YWFsX2dldF9yb3RhdGUsCisJLnNldF9taXJyb3IJPSB0YWFsX21pcnJvciwKKwkuZ2V0X21pcnJvcgk9IHRhYWxfZ2V0X21pcnJvciwKKwkucnVuX3Rlc3QJPSB0YWFsX3J1bl90ZXN0LAorCS5tZW1vcnlfcmVhZAk9IHRhYWxfbWVtb3J5X3JlYWQsCisKKwkuZHJpdmVyICAgICAgICAgPSB7CisJCS5uYW1lICAgPSAidGFhbCIsCisJCS5vd25lciAgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGFhbF9pbml0KHZvaWQpCit7CisJb21hcF9kc3NfcmVnaXN0ZXJfZHJpdmVyKCZ0YWFsX2RyaXZlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRhYWxfZXhpdCh2b2lkKQoreworCW9tYXBfZHNzX3VucmVnaXN0ZXJfZHJpdmVyKCZ0YWFsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHRhYWxfaW5pdCk7Cittb2R1bGVfZXhpdCh0YWFsX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJUb21pIFZhbGtlaW5lbiA8dG9taS52YWxrZWluZW5Abm9raWEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUYWFsIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkOGRlYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL0tjb25maWcKQEAgLTAsMCArMSw4OSBAQAorbWVudWNvbmZpZyBPTUFQMl9EU1MKKyAgICAgICAgdHJpc3RhdGUgIk9NQVAyLzMgRGlzcGxheSBTdWJzeXN0ZW0gc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKyAgICAgICAgZGVwZW5kcyBvbiBBUkNIX09NQVAyIHx8IEFSQ0hfT01BUDMKKyAgICAgICAgaGVscAorICAgICAgICAgIE9NQVAyLzMgRGlzcGxheSBTdWJzeXN0ZW0gc3VwcG9ydC4KKworaWYgT01BUDJfRFNTCisKK2NvbmZpZyBPTUFQMl9WUkFNX1NJWkUKKwlpbnQgIlZSQU0gc2l6ZSAoTUIpIgorCXJhbmdlIDAgMzIKKwlkZWZhdWx0IDAKKwloZWxwCisJICBUaGUgYW1vdW50IG9mIFNEUkFNIHRvIHJlc2VydmUgYXQgYm9vdCB0aW1lIGZvciB2aWRlbyBSQU0gdXNlLgorCSAgVGhpcyBWUkFNIHdpbGwgYmUgdXNlZCBieSBvbWFwZmIgYW5kIG90aGVyIGRyaXZlcnMgdGhhdCBuZWVkCisJICBsYXJnZSBjb250aW51b3VzIFJBTSBhcmVhIGZvciB2aWRlbyB1c2UuCisKKwkgIFlvdSBjYW4gYWxzbyBzZXQgdGhpcyB3aXRoICJ2cmFtPTxieXRlcz4iIGtlcm5lbCBhcmd1bWVudCwgb3IKKwkgIGluIHRoZSBib2FyZCBmaWxlLgorCitjb25maWcgT01BUDJfRFNTX0RFQlVHX1NVUFBPUlQKKyAgICAgICAgYm9vbCAiRGVidWcgc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgZGVidWcgbWVzc2FnZXMuIFlvdSBuZWVkIHRvIGVuYWJsZSBwcmludGluZworCSAgd2l0aCAnZGVidWcnIG1vZHVsZSBwYXJhbWV0ZXIuCisKK2NvbmZpZyBPTUFQMl9EU1NfUkZCSQorCWJvb2wgIlJGQkkgc3VwcG9ydCIKKyAgICAgICAgZGVmYXVsdCBuCisJaGVscAorCSAgTUlQSSBEQkksIG9yIFJGQkkgKFJlbW90ZSBGcmFtZWJ1ZmZlciBJbnRlcmZhY2UpLCBzdXBwb3J0LgorCitjb25maWcgT01BUDJfRFNTX1ZFTkMKKwlib29sICJWRU5DIHN1cHBvcnQiCisgICAgICAgIGRlZmF1bHQgeQorCWhlbHAKKwkgIE9NQVAgVmlkZW8gRW5jb2RlciBzdXBwb3J0LgorCitjb25maWcgT01BUDJfRFNTX1NESQorCWJvb2wgIlNESSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMworICAgICAgICBkZWZhdWx0IG4KKwloZWxwCisJICBTREkgKFNlcmlhbCBEaXNwbGF5IEludGVyZmFjZSkgc3VwcG9ydC4KKworY29uZmlnIE9NQVAyX0RTU19EU0kKKwlib29sICJEU0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDMKKyAgICAgICAgZGVmYXVsdCBuCisJaGVscAorCSAgTUlQSSBEU0kgc3VwcG9ydC4KKworY29uZmlnIE9NQVAyX0RTU19VU0VfRFNJX1BMTAorCWJvb2wgIlVzZSBEU0kgUExMIGZvciBQQ0xLIChFWFBFUklNRU5UQUwpIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gT01BUDJfRFNTX0RTSQorCWhlbHAKKwkgIFVzZSBEU0kgUExMIHRvIGdlbmVyYXRlIHBpeGVsIGNsb2NrLiAgQ3VycmVudGx5IG9ubHkgZm9yIERQSSBvdXRwdXQuCisJICBEU0kgUExMIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGhpZ2hlciBhbmQgbW9yZSBwcmVjaXNlIHBpeGVsIGNsb2Nrcy4KKworY29uZmlnIE9NQVAyX0RTU19GQUtFX1ZTWU5DCisJYm9vbCAiRmFrZSBWU1lOQyBpcnEgZnJvbSBtYW51YWwgdXBkYXRlIGRpc3BsYXlzIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHRoaXMgaXMgc2VsZWN0ZWQsIERTSSB3aWxsIGdlbmVyYXRlIGEgZmFrZSBESVNQQyBWU1lOQyBpbnRlcnJ1cHQKKwkgIHdoZW4gRFNJIGhhcyBzZW50IGEgZnJhbWUuIFRoaXMgaXMgb25seSBuZWVkZWQgd2l0aCBEU0kgb3IgUkZCSQorCSAgZGlzcGxheXMgdXNpbmcgbWFudWFsIG1vZGUsIGFuZCB5b3Ugd2FudCBWU1lOQyB0bywgZm9yIGV4YW1wbGUsCisJICB0aW1lIGFuaW1hdGlvbi4KKworY29uZmlnIE9NQVAyX0RTU19NSU5fRkNLX1BFUl9QQ0sKKwlpbnQgIk1pbmltdW0gRkNLL1BDSyByYXRpbyAoZm9yIHNjYWxpbmcpIgorCXJhbmdlIDAgMzIKKwlkZWZhdWx0IDAKKwloZWxwCisJICBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkanVzdCB0aGUgbWluaW11bSBGQ0svUENLIHJhdGlvLgorCisJICBXaXRoIHRoaXMgeW91IGNhbiBtYWtlIHN1cmUgdGhhdCBESVNQQyBGQ0sgaXMgYXQgbGVhc3QKKwkgIG4geCBQQ0suIFZpZGVvIHBsYW5lIHNjYWxpbmcgcmVxdWlyZXMgaGlnaGVyIEZDSyB0aGFuCisJICBub3JtYWxseS4KKworCSAgSWYgdGhpcyBpcyBzZXQgdG8gMCwgdGhlcmUncyBubyBleHRyYSBjb25zdHJhaW50IG9uIHRoZQorCSAgRElTUEMgRkNLLiBIb3dldmVyLCB0aGUgRkNLIHdpbGwgYXQgbWluaW11bSBiZQorCSAgMnhQQ0sgKGlmIGFjdGl2ZSBtYXRyaXgpIG9yIDN4UENLIChpZiBwYXNzaXZlIG1hdHJpeCkuCisKKwkgIE1heCBGQ0sgaXMgMTczTUh6LCBzbyB0aGlzIGRvZXNuJ3Qgd29yayBpZiB5b3VyIFBDSworCSAgaXMgdmVyeSBoaWdoLgorCitlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvTWFrZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODBjNzJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACitvYmotJChDT05GSUdfT01BUDJfRFNTKSArPSBvbWFwZHNzLm8KK29tYXBkc3MteSA6PSBjb3JlLm8gZHNzLm8gZGlzcGMubyBkcGkubyBkaXNwbGF5Lm8gbWFuYWdlci5vIG92ZXJsYXkubworb21hcGRzcy0kKENPTkZJR19PTUFQMl9EU1NfUkZCSSkgKz0gcmZiaS5vCitvbWFwZHNzLSQoQ09ORklHX09NQVAyX0RTU19WRU5DKSArPSB2ZW5jLm8KK29tYXBkc3MtJChDT05GSUdfT01BUDJfRFNTX1NESSkgKz0gc2RpLm8KK29tYXBkc3MtJChDT05GSUdfT01BUDJfRFNTX0RTSSkgKz0gZHNpLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2NvcmUuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTQ5N2EwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvY29yZS5jCkBAIC0wLDAgKzEsOTE5IEBACisvKgorICogbGludXgvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvY29yZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IFRvbWkgVmFsa2VpbmVuIDx0b21pLnZhbGtlaW5lbkBub2tpYS5jb20+CisgKgorICogU29tZSBjb2RlIGFuZCBpZGVhcyB0YWtlbiBmcm9tIGRyaXZlcnMvdmlkZW8vb21hcC8gZHJpdmVyCisgKiBieSBJbXJlIERlYWsuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjZGVmaW5lIERTU19TVUJTWVNfTkFNRSAiQ09SRSIKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxwbGF0L2Rpc3BsYXkuaD4KKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CisKKyNpbmNsdWRlICJkc3MuaCIKKworc3RhdGljIHN0cnVjdCB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlpbnQJCWN0eF9pZDsKKworCXN0cnVjdCBjbGsgICAgICAqZHNzX2ljazsKKwlzdHJ1Y3QgY2xrCSpkc3MxX2ZjazsKKwlzdHJ1Y3QgY2xrCSpkc3MyX2ZjazsKKwlzdHJ1Y3QgY2xrICAgICAgKmRzc181NG1fZmNrOworCXN0cnVjdCBjbGsJKmRzc185Nm1fZmNrOworCXVuc2lnbmVkCW51bV9jbGtzX2VuYWJsZWQ7Cit9IGNvcmU7CisKK3N0YXRpYyB2b2lkIGRzc19jbGtfZW5hYmxlX2FsbF9ub19jdHgodm9pZCk7CitzdGF0aWMgdm9pZCBkc3NfY2xrX2Rpc2FibGVfYWxsX25vX2N0eCh2b2lkKTsKK3N0YXRpYyB2b2lkIGRzc19jbGtfZW5hYmxlX25vX2N0eChlbnVtIGRzc19jbG9jayBjbGtzKTsKK3N0YXRpYyB2b2lkIGRzc19jbGtfZGlzYWJsZV9ub19jdHgoZW51bSBkc3NfY2xvY2sgY2xrcyk7CisKK3N0YXRpYyBjaGFyICpkZWZfZGlzcF9uYW1lOworbW9kdWxlX3BhcmFtX25hbWVkKGRlZl9kaXNwLCBkZWZfZGlzcF9uYW1lLCBjaGFycCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlZl9kaXNwX25hbWUsICJkZWZhdWx0IGRpc3BsYXkgbmFtZSIpOworCisjaWZkZWYgREVCVUcKK3Vuc2lnbmVkIGludCBkc3NfZGVidWc7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGRzc19kZWJ1ZywgYm9vbCwgMDY0NCk7CisjZW5kaWYKKworLyogQ09OVEVYVCAqLworc3RhdGljIGludCBkc3NfZ2V0X2N0eF9pZCh2b2lkKQoreworCXN0cnVjdCBvbWFwX2Rzc19ib2FyZF9pbmZvICpwZGF0YSA9IGNvcmUucGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IHI7CisKKwlpZiAoIXBkYXRhLT5nZXRfbGFzdF9vZmZfb25fdHJhbnNhY3Rpb25faWQpCisJCXJldHVybiAwOworCXIgPSBwZGF0YS0+Z2V0X2xhc3Rfb2ZmX29uX3RyYW5zYWN0aW9uX2lkKCZjb3JlLnBkZXYtPmRldik7CisJaWYgKHIgPCAwKSB7CisJCWRldl9lcnIoJmNvcmUucGRldi0+ZGV2LCAiZ2V0dGluZyB0cmFuc2FjdGlvbiBJRCBmYWlsZWQsICIKKwkJCQkid2lsbCBmb3JjZSBjb250ZXh0IHJlc3RvcmVcbiIpOworCQlyID0gLTE7CisJfQorCXJldHVybiByOworfQorCitpbnQgZHNzX25lZWRfY3R4X3Jlc3RvcmUodm9pZCkKK3sKKwlpbnQgaWQgPSBkc3NfZ2V0X2N0eF9pZCgpOworCisJaWYgKGlkIDwgMCB8fCBpZCAhPSBjb3JlLmN0eF9pZCkgeworCQlEU1NEQkcoImN0eCBpZCAlZCAtPiBpZCAlZFxuIiwKKwkJCQljb3JlLmN0eF9pZCwgaWQpOworCQljb3JlLmN0eF9pZCA9IGlkOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNhdmVfYWxsX2N0eCh2b2lkKQoreworCURTU0RCRygic2F2ZSBjb250ZXh0XG4iKTsKKworCWRzc19jbGtfZW5hYmxlX25vX2N0eChEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLMSk7CisKKwlkc3Nfc2F2ZV9jb250ZXh0KCk7CisJZGlzcGNfc2F2ZV9jb250ZXh0KCk7CisjaWZkZWYgQ09ORklHX09NQVAyX0RTU19EU0kKKwlkc2lfc2F2ZV9jb250ZXh0KCk7CisjZW5kaWYKKworCWRzc19jbGtfZGlzYWJsZV9ub19jdHgoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSzEpOworfQorCitzdGF0aWMgdm9pZCByZXN0b3JlX2FsbF9jdHgodm9pZCkKK3sKKwlEU1NEQkcoInJlc3RvcmUgY29udGV4dFxuIik7CisKKwlkc3NfY2xrX2VuYWJsZV9hbGxfbm9fY3R4KCk7CisKKwlkc3NfcmVzdG9yZV9jb250ZXh0KCk7CisJZGlzcGNfcmVzdG9yZV9jb250ZXh0KCk7CisjaWZkZWYgQ09ORklHX09NQVAyX0RTU19EU0kKKwlkc2lfcmVzdG9yZV9jb250ZXh0KCk7CisjZW5kaWYKKworCWRzc19jbGtfZGlzYWJsZV9hbGxfbm9fY3R4KCk7Cit9CisKKy8qIENMT0NLUyAqLworc3RhdGljIHZvaWQgY29yZV9kdW1wX2Nsb2NrcyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCit7CisJaW50IGk7CisJc3RydWN0IGNsayAqY2xvY2tzWzVdID0geworCQljb3JlLmRzc19pY2ssCisJCWNvcmUuZHNzMV9mY2ssCisJCWNvcmUuZHNzMl9mY2ssCisJCWNvcmUuZHNzXzU0bV9mY2ssCisJCWNvcmUuZHNzXzk2bV9mY2sKKwl9OworCisJc2VxX3ByaW50ZihzLCAiLSBDT1JFIC1cbiIpOworCisJc2VxX3ByaW50ZihzLCAiaW50ZXJuYWwgY2xrIGNvdW50XHRcdCV1XG4iLCBjb3JlLm51bV9jbGtzX2VuYWJsZWQpOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlpZiAoIWNsb2Nrc1tpXSkKKwkJCWNvbnRpbnVlOworCQlzZXFfcHJpbnRmKHMsICIlLTE1c1x0JWx1XHQlZFxuIiwKKwkJCQljbG9ja3NbaV0tPm5hbWUsCisJCQkJY2xrX2dldF9yYXRlKGNsb2Nrc1tpXSksCisJCQkJY2xvY2tzW2ldLT51c2Vjb3VudCk7CisJfQorfQorCitzdGF0aWMgaW50IGRzc19nZXRfY2xvY2soc3RydWN0IGNsayAqKmNsb2NrLCBjb25zdCBjaGFyICpjbGtfbmFtZSkKK3sKKwlzdHJ1Y3QgY2xrICpjbGs7CisKKwljbGsgPSBjbGtfZ2V0KCZjb3JlLnBkZXYtPmRldiwgY2xrX25hbWUpOworCisJaWYgKElTX0VSUihjbGspKSB7CisJCURTU0VSUigiY2FuJ3QgZ2V0IGNsb2NrICVzIiwgY2xrX25hbWUpOworCQlyZXR1cm4gUFRSX0VSUihjbGspOworCX0KKworCSpjbG9jayA9IGNsazsKKworCURTU0RCRygiY2xrICVzLCByYXRlICVsZFxuIiwgY2xrX25hbWUsIGNsa19nZXRfcmF0ZShjbGspKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzc19nZXRfY2xvY2tzKHZvaWQpCit7CisJaW50IHI7CisKKwljb3JlLmRzc19pY2sgPSBOVUxMOworCWNvcmUuZHNzMV9mY2sgPSBOVUxMOworCWNvcmUuZHNzMl9mY2sgPSBOVUxMOworCWNvcmUuZHNzXzU0bV9mY2sgPSBOVUxMOworCWNvcmUuZHNzXzk2bV9mY2sgPSBOVUxMOworCisJciA9IGRzc19nZXRfY2xvY2soJmNvcmUuZHNzX2ljaywgImljayIpOworCWlmIChyKQorCQlnb3RvIGVycjsKKworCXIgPSBkc3NfZ2V0X2Nsb2NrKCZjb3JlLmRzczFfZmNrLCAiZHNzMV9mY2siKTsKKwlpZiAocikKKwkJZ290byBlcnI7CisKKwlyID0gZHNzX2dldF9jbG9jaygmY29yZS5kc3MyX2ZjaywgImRzczJfZmNrIik7CisJaWYgKHIpCisJCWdvdG8gZXJyOworCisJciA9IGRzc19nZXRfY2xvY2soJmNvcmUuZHNzXzU0bV9mY2ssICJ0dl9mY2siKTsKKwlpZiAocikKKwkJZ290byBlcnI7CisKKwlyID0gZHNzX2dldF9jbG9jaygmY29yZS5kc3NfOTZtX2ZjaywgInZpZGVvX2ZjayIpOworCWlmIChyKQorCQlnb3RvIGVycjsKKworCXJldHVybiAwOworCitlcnI6CisJaWYgKGNvcmUuZHNzX2ljaykKKwkJY2xrX3B1dChjb3JlLmRzc19pY2spOworCWlmIChjb3JlLmRzczFfZmNrKQorCQljbGtfcHV0KGNvcmUuZHNzMV9mY2spOworCWlmIChjb3JlLmRzczJfZmNrKQorCQljbGtfcHV0KGNvcmUuZHNzMl9mY2spOworCWlmIChjb3JlLmRzc181NG1fZmNrKQorCQljbGtfcHV0KGNvcmUuZHNzXzU0bV9mY2spOworCWlmIChjb3JlLmRzc185Nm1fZmNrKQorCQljbGtfcHV0KGNvcmUuZHNzXzk2bV9mY2spOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGRzc19wdXRfY2xvY2tzKHZvaWQpCit7CisJaWYgKGNvcmUuZHNzXzk2bV9mY2spCisJCWNsa19wdXQoY29yZS5kc3NfOTZtX2Zjayk7CisJY2xrX3B1dChjb3JlLmRzc181NG1fZmNrKTsKKwljbGtfcHV0KGNvcmUuZHNzMV9mY2spOworCWNsa19wdXQoY29yZS5kc3MyX2Zjayk7CisJY2xrX3B1dChjb3JlLmRzc19pY2spOworfQorCit1bnNpZ25lZCBsb25nIGRzc19jbGtfZ2V0X3JhdGUoZW51bSBkc3NfY2xvY2sgY2xrKQoreworCXN3aXRjaCAoY2xrKSB7CisJY2FzZSBEU1NfQ0xLX0lDSzoKKwkJcmV0dXJuIGNsa19nZXRfcmF0ZShjb3JlLmRzc19pY2spOworCWNhc2UgRFNTX0NMS19GQ0sxOgorCQlyZXR1cm4gY2xrX2dldF9yYXRlKGNvcmUuZHNzMV9mY2spOworCWNhc2UgRFNTX0NMS19GQ0syOgorCQlyZXR1cm4gY2xrX2dldF9yYXRlKGNvcmUuZHNzMl9mY2spOworCWNhc2UgRFNTX0NMS181NE06CisJCXJldHVybiBjbGtfZ2V0X3JhdGUoY29yZS5kc3NfNTRtX2Zjayk7CisJY2FzZSBEU1NfQ0xLXzk2TToKKwkJcmV0dXJuIGNsa19nZXRfcmF0ZShjb3JlLmRzc185Nm1fZmNrKTsKKwl9CisKKwlCVUcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNvdW50X2Nsa19iaXRzKGVudW0gZHNzX2Nsb2NrIGNsa3MpCit7CisJdW5zaWduZWQgbnVtX2Nsa3MgPSAwOworCisJaWYgKGNsa3MgJiBEU1NfQ0xLX0lDSykKKwkJKytudW1fY2xrczsKKwlpZiAoY2xrcyAmIERTU19DTEtfRkNLMSkKKwkJKytudW1fY2xrczsKKwlpZiAoY2xrcyAmIERTU19DTEtfRkNLMikKKwkJKytudW1fY2xrczsKKwlpZiAoY2xrcyAmIERTU19DTEtfNTRNKQorCQkrK251bV9jbGtzOworCWlmIChjbGtzICYgRFNTX0NMS185Nk0pCisJCSsrbnVtX2Nsa3M7CisKKwlyZXR1cm4gbnVtX2Nsa3M7Cit9CisKK3N0YXRpYyB2b2lkIGRzc19jbGtfZW5hYmxlX25vX2N0eChlbnVtIGRzc19jbG9jayBjbGtzKQoreworCXVuc2lnbmVkIG51bV9jbGtzID0gY291bnRfY2xrX2JpdHMoY2xrcyk7CisKKwlpZiAoY2xrcyAmIERTU19DTEtfSUNLKQorCQljbGtfZW5hYmxlKGNvcmUuZHNzX2ljayk7CisJaWYgKGNsa3MgJiBEU1NfQ0xLX0ZDSzEpCisJCWNsa19lbmFibGUoY29yZS5kc3MxX2Zjayk7CisJaWYgKGNsa3MgJiBEU1NfQ0xLX0ZDSzIpCisJCWNsa19lbmFibGUoY29yZS5kc3MyX2Zjayk7CisJaWYgKGNsa3MgJiBEU1NfQ0xLXzU0TSkKKwkJY2xrX2VuYWJsZShjb3JlLmRzc181NG1fZmNrKTsKKwlpZiAoY2xrcyAmIERTU19DTEtfOTZNKQorCQljbGtfZW5hYmxlKGNvcmUuZHNzXzk2bV9mY2spOworCisJY29yZS5udW1fY2xrc19lbmFibGVkICs9IG51bV9jbGtzOworfQorCit2b2lkIGRzc19jbGtfZW5hYmxlKGVudW0gZHNzX2Nsb2NrIGNsa3MpCit7CisJZHNzX2Nsa19lbmFibGVfbm9fY3R4KGNsa3MpOworCisJaWYgKGNwdV9pc19vbWFwMzR4eCgpICYmIGRzc19uZWVkX2N0eF9yZXN0b3JlKCkpCisJCXJlc3RvcmVfYWxsX2N0eCgpOworfQorCitzdGF0aWMgdm9pZCBkc3NfY2xrX2Rpc2FibGVfbm9fY3R4KGVudW0gZHNzX2Nsb2NrIGNsa3MpCit7CisJdW5zaWduZWQgbnVtX2Nsa3MgPSBjb3VudF9jbGtfYml0cyhjbGtzKTsKKworCWlmIChjbGtzICYgRFNTX0NMS19JQ0spCisJCWNsa19kaXNhYmxlKGNvcmUuZHNzX2ljayk7CisJaWYgKGNsa3MgJiBEU1NfQ0xLX0ZDSzEpCisJCWNsa19kaXNhYmxlKGNvcmUuZHNzMV9mY2spOworCWlmIChjbGtzICYgRFNTX0NMS19GQ0syKQorCQljbGtfZGlzYWJsZShjb3JlLmRzczJfZmNrKTsKKwlpZiAoY2xrcyAmIERTU19DTEtfNTRNKQorCQljbGtfZGlzYWJsZShjb3JlLmRzc181NG1fZmNrKTsKKwlpZiAoY2xrcyAmIERTU19DTEtfOTZNKQorCQljbGtfZGlzYWJsZShjb3JlLmRzc185Nm1fZmNrKTsKKworCWNvcmUubnVtX2Nsa3NfZW5hYmxlZCAtPSBudW1fY2xrczsKK30KKwordm9pZCBkc3NfY2xrX2Rpc2FibGUoZW51bSBkc3NfY2xvY2sgY2xrcykKK3sKKwlpZiAoY3B1X2lzX29tYXAzNHh4KCkpIHsKKwkJdW5zaWduZWQgbnVtX2Nsa3MgPSBjb3VudF9jbGtfYml0cyhjbGtzKTsKKworCQlCVUdfT04oY29yZS5udW1fY2xrc19lbmFibGVkIDwgbnVtX2Nsa3MpOworCisJCWlmIChjb3JlLm51bV9jbGtzX2VuYWJsZWQgPT0gbnVtX2Nsa3MpCisJCQlzYXZlX2FsbF9jdHgoKTsKKwl9CisKKwlkc3NfY2xrX2Rpc2FibGVfbm9fY3R4KGNsa3MpOworfQorCitzdGF0aWMgdm9pZCBkc3NfY2xrX2VuYWJsZV9hbGxfbm9fY3R4KHZvaWQpCit7CisJZW51bSBkc3NfY2xvY2sgY2xrczsKKworCWNsa3MgPSBEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLMSB8IERTU19DTEtfRkNLMiB8IERTU19DTEtfNTRNOworCWlmIChjcHVfaXNfb21hcDM0eHgoKSkKKwkJY2xrcyB8PSBEU1NfQ0xLXzk2TTsKKwlkc3NfY2xrX2VuYWJsZV9ub19jdHgoY2xrcyk7Cit9CisKK3N0YXRpYyB2b2lkIGRzc19jbGtfZGlzYWJsZV9hbGxfbm9fY3R4KHZvaWQpCit7CisJZW51bSBkc3NfY2xvY2sgY2xrczsKKworCWNsa3MgPSBEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLMSB8IERTU19DTEtfRkNLMiB8IERTU19DTEtfNTRNOworCWlmIChjcHVfaXNfb21hcDM0eHgoKSkKKwkJY2xrcyB8PSBEU1NfQ0xLXzk2TTsKKwlkc3NfY2xrX2Rpc2FibGVfbm9fY3R4KGNsa3MpOworfQorCitzdGF0aWMgdm9pZCBkc3NfY2xrX2Rpc2FibGVfYWxsKHZvaWQpCit7CisJZW51bSBkc3NfY2xvY2sgY2xrczsKKworCWNsa3MgPSBEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLMSB8IERTU19DTEtfRkNLMiB8IERTU19DTEtfNTRNOworCWlmIChjcHVfaXNfb21hcDM0eHgoKSkKKwkJY2xrcyB8PSBEU1NfQ0xLXzk2TTsKKwlkc3NfY2xrX2Rpc2FibGUoY2xrcyk7Cit9CisKKy8qIERFQlVHRlMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykgJiYgZGVmaW5lZChDT05GSUdfT01BUDJfRFNTX0RFQlVHX1NVUFBPUlQpCitzdGF0aWMgdm9pZCBkc3NfZGVidWdfZHVtcF9jbG9ja3Moc3RydWN0IHNlcV9maWxlICpzKQoreworCWNvcmVfZHVtcF9jbG9ja3Mocyk7CisJZHNzX2R1bXBfY2xvY2tzKHMpOworCWRpc3BjX2R1bXBfY2xvY2tzKHMpOworI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfRFNJCisJZHNpX2R1bXBfY2xvY2tzKHMpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgZHNzX2RlYnVnX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp1bnVzZWQpCit7CisJdm9pZCAoKmZ1bmMpKHN0cnVjdCBzZXFfZmlsZSAqKSA9IHMtPnByaXZhdGU7CisJZnVuYyhzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc3NfZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgZHNzX2RlYnVnX3Nob3csIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkc3NfZGVidWdfZm9wcyA9IHsKKwkub3BlbiAgICAgICAgICAgPSBkc3NfZGVidWdfb3BlbiwKKwkucmVhZCAgICAgICAgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICAgICAgICAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgICAgICAgID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZHNzX2RlYnVnZnNfZGlyOworCitzdGF0aWMgaW50IGRzc19pbml0aWFsaXplX2RlYnVnZnModm9pZCkKK3sKKwlkc3NfZGVidWdmc19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoIm9tYXBkc3MiLCBOVUxMKTsKKwlpZiAoSVNfRVJSKGRzc19kZWJ1Z2ZzX2RpcikpIHsKKwkJaW50IGVyciA9IFBUUl9FUlIoZHNzX2RlYnVnZnNfZGlyKTsKKwkJZHNzX2RlYnVnZnNfZGlyID0gTlVMTDsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJjbGsiLCBTX0lSVUdPLCBkc3NfZGVidWdmc19kaXIsCisJCQkmZHNzX2RlYnVnX2R1bXBfY2xvY2tzLCAmZHNzX2RlYnVnX2ZvcHMpOworCisJZGVidWdmc19jcmVhdGVfZmlsZSgiZHNzIiwgU19JUlVHTywgZHNzX2RlYnVnZnNfZGlyLAorCQkJJmRzc19kdW1wX3JlZ3MsICZkc3NfZGVidWdfZm9wcyk7CisJZGVidWdmc19jcmVhdGVfZmlsZSgiZGlzcGMiLCBTX0lSVUdPLCBkc3NfZGVidWdmc19kaXIsCisJCQkmZGlzcGNfZHVtcF9yZWdzLCAmZHNzX2RlYnVnX2ZvcHMpOworI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfUkZCSQorCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInJmYmkiLCBTX0lSVUdPLCBkc3NfZGVidWdmc19kaXIsCisJCQkmcmZiaV9kdW1wX3JlZ3MsICZkc3NfZGVidWdfZm9wcyk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfT01BUDJfRFNTX0RTSQorCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImRzaSIsIFNfSVJVR08sIGRzc19kZWJ1Z2ZzX2RpciwKKwkJCSZkc2lfZHVtcF9yZWdzLCAmZHNzX2RlYnVnX2ZvcHMpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX09NQVAyX0RTU19WRU5DCisJZGVidWdmc19jcmVhdGVfZmlsZSgidmVuYyIsIFNfSVJVR08sIGRzc19kZWJ1Z2ZzX2RpciwKKwkJCSZ2ZW5jX2R1bXBfcmVncywgJmRzc19kZWJ1Z19mb3BzKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkc3NfdW5pbml0aWFsaXplX2RlYnVnZnModm9pZCkKK3sKKwlpZiAoZHNzX2RlYnVnZnNfZGlyKQorCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZHNzX2RlYnVnZnNfZGlyKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgJiYgQ09ORklHX09NQVAyX0RTU19ERUJVR19TVVBQT1JUICovCisKKy8qIFBMQVRGT1JNIERFVklDRSAqLworc3RhdGljIGludCBvbWFwX2Rzc19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBvbWFwX2Rzc19ib2FyZF9pbmZvICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCBza2lwX2luaXQgPSAwOworCWludCByOworCWludCBpOworCisJY29yZS5wZGV2ID0gcGRldjsKKworCWRzc19pbml0X292ZXJsYXlfbWFuYWdlcnMocGRldik7CisJZHNzX2luaXRfb3ZlcmxheXMocGRldik7CisKKwlyID0gZHNzX2dldF9jbG9ja3MoKTsKKwlpZiAocikKKwkJZ290byBmYWlsMDsKKworCWRzc19jbGtfZW5hYmxlX2FsbF9ub19jdHgoKTsKKworCWNvcmUuY3R4X2lkID0gZHNzX2dldF9jdHhfaWQoKTsKKwlEU1NEQkcoImluaXRpYWwgY3R4IGlkICV1XG4iLCBjb3JlLmN0eF9pZCk7CisKKyNpZmRlZiBDT05GSUdfRkJfT01BUF9CT09UTE9BREVSX0lOSVQKKwkvKiBESVNQQ19DT05UUk9MICovCisJaWYgKG9tYXBfcmVhZGwoMHg0ODA1MDQ0MCkgJiAxKQkvKiBMQ0QgZW5hYmxlZD8gKi8KKwkJc2tpcF9pbml0ID0gMTsKKyNlbmRpZgorCisJciA9IGRzc19pbml0KHNraXBfaW5pdCk7CisJaWYgKHIpIHsKKwkJRFNTRVJSKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBEU1NcbiIpOworCQlnb3RvIGZhaWwwOworCX0KKworI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfUkZCSQorCXIgPSByZmJpX2luaXQoKTsKKwlpZiAocikgeworCQlEU1NFUlIoIkZhaWxlZCB0byBpbml0aWFsaXplIHJmYmlcbiIpOworCQlnb3RvIGZhaWwwOworCX0KKyNlbmRpZgorCisJciA9IGRwaV9pbml0KCk7CisJaWYgKHIpIHsKKwkJRFNTRVJSKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkcGlcbiIpOworCQlnb3RvIGZhaWwwOworCX0KKworCXIgPSBkaXNwY19pbml0KCk7CisJaWYgKHIpIHsKKwkJRFNTRVJSKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkaXNwY1xuIik7CisJCWdvdG8gZmFpbDA7CisJfQorI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfVkVOQworCXIgPSB2ZW5jX2luaXQocGRldik7CisJaWYgKHIpIHsKKwkJRFNTRVJSKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB2ZW5jXG4iKTsKKwkJZ290byBmYWlsMDsKKwl9CisjZW5kaWYKKwlpZiAoY3B1X2lzX29tYXAzNHh4KCkpIHsKKyNpZmRlZiBDT05GSUdfT01BUDJfRFNTX1NESQorCQlyID0gc2RpX2luaXQoc2tpcF9pbml0KTsKKwkJaWYgKHIpIHsKKwkJCURTU0VSUigiRmFpbGVkIHRvIGluaXRpYWxpemUgU0RJXG4iKTsKKwkJCWdvdG8gZmFpbDA7CisJCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfRFNJCisJCXIgPSBkc2lfaW5pdChwZGV2KTsKKwkJaWYgKHIpIHsKKwkJCURTU0VSUigiRmFpbGVkIHRvIGluaXRpYWxpemUgRFNJXG4iKTsKKwkJCWdvdG8gZmFpbDA7CisJCX0KKyNlbmRpZgorCX0KKworI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKSAmJiBkZWZpbmVkKENPTkZJR19PTUFQMl9EU1NfREVCVUdfU1VQUE9SVCkKKwlyID0gZHNzX2luaXRpYWxpemVfZGVidWdmcygpOworCWlmIChyKQorCQlnb3RvIGZhaWwwOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9kZXZpY2VzOyArK2kpIHsKKwkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gcGRhdGEtPmRldmljZXNbaV07CisKKwkJciA9IG9tYXBfZHNzX3JlZ2lzdGVyX2RldmljZShkc3NkZXYpOworCQlpZiAocikKKwkJCURTU0VSUigiZGV2aWNlIHJlZyBmYWlsZWQgJWRcbiIsIGkpOworCisJCWlmIChkZWZfZGlzcF9uYW1lICYmIHN0cmNtcChkZWZfZGlzcF9uYW1lLCBkc3NkZXYtPm5hbWUpID09IDApCisJCQlwZGF0YS0+ZGVmYXVsdF9kZXZpY2UgPSBkc3NkZXY7CisJfQorCisJZHNzX2Nsa19kaXNhYmxlX2FsbCgpOworCisJcmV0dXJuIDA7CisKKwkvKiBYWFggZmFpbCBjb3JyZWN0bHkgKi8KK2ZhaWwwOgorCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG9tYXBfZHNzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBvbWFwX2Rzc19ib2FyZF9pbmZvICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCBpOworCWludCBjOworCisjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpICYmIGRlZmluZWQoQ09ORklHX09NQVAyX0RTU19ERUJVR19TVVBQT1JUKQorCWRzc191bmluaXRpYWxpemVfZGVidWdmcygpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfT01BUDJfRFNTX1ZFTkMKKwl2ZW5jX2V4aXQoKTsKKyNlbmRpZgorCWRpc3BjX2V4aXQoKTsKKwlkcGlfZXhpdCgpOworI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfUkZCSQorCXJmYmlfZXhpdCgpOworI2VuZGlmCisJaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7CisjaWZkZWYgQ09ORklHX09NQVAyX0RTU19EU0kKKwkJZHNpX2V4aXQoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfU0RJCisJCXNkaV9leGl0KCk7CisjZW5kaWYKKwl9CisKKwlkc3NfZXhpdCgpOworCisJLyogdGhlc2Ugc2hvdWxkIGJlIHJlbW92ZWQgYXQgc29tZSBwb2ludCAqLworCWMgPSBjb3JlLmRzc19pY2stPnVzZWNvdW50OworCWlmIChjID4gMCkgeworCQlEU1NFUlIoIndhcm5pbmc6IGRzc19pY2sgdXNlY291bnQgJWQsIGRpc2FibGluZ1xuIiwgYyk7CisJCXdoaWxlIChjLS0gPiAwKQorCQkJY2xrX2Rpc2FibGUoY29yZS5kc3NfaWNrKTsKKwl9CisKKwljID0gY29yZS5kc3MxX2Zjay0+dXNlY291bnQ7CisJaWYgKGMgPiAwKSB7CisJCURTU0VSUigid2FybmluZzogZHNzMV9mY2sgdXNlY291bnQgJWQsIGRpc2FibGluZ1xuIiwgYyk7CisJCXdoaWxlIChjLS0gPiAwKQorCQkJY2xrX2Rpc2FibGUoY29yZS5kc3MxX2Zjayk7CisJfQorCisJYyA9IGNvcmUuZHNzMl9mY2stPnVzZWNvdW50OworCWlmIChjID4gMCkgeworCQlEU1NFUlIoIndhcm5pbmc6IGRzczJfZmNrIHVzZWNvdW50ICVkLCBkaXNhYmxpbmdcbiIsIGMpOworCQl3aGlsZSAoYy0tID4gMCkKKwkJCWNsa19kaXNhYmxlKGNvcmUuZHNzMl9mY2spOworCX0KKworCWMgPSBjb3JlLmRzc181NG1fZmNrLT51c2Vjb3VudDsKKwlpZiAoYyA+IDApIHsKKwkJRFNTRVJSKCJ3YXJuaW5nOiBkc3NfNTRtX2ZjayB1c2Vjb3VudCAlZCwgZGlzYWJsaW5nXG4iLCBjKTsKKwkJd2hpbGUgKGMtLSA+IDApCisJCQljbGtfZGlzYWJsZShjb3JlLmRzc181NG1fZmNrKTsKKwl9CisKKwlpZiAoY29yZS5kc3NfOTZtX2ZjaykgeworCQljID0gY29yZS5kc3NfOTZtX2Zjay0+dXNlY291bnQ7CisJCWlmIChjID4gMCkgeworCQkJRFNTRVJSKCJ3YXJuaW5nOiBkc3NfOTZtX2ZjayB1c2Vjb3VudCAlZCwgZGlzYWJsaW5nXG4iLAorCQkJCQljKTsKKwkJCXdoaWxlIChjLS0gPiAwKQorCQkJCWNsa19kaXNhYmxlKGNvcmUuZHNzXzk2bV9mY2spOworCQl9CisJfQorCisJZHNzX3B1dF9jbG9ja3MoKTsKKworCWRzc191bmluaXRfb3ZlcmxheXMocGRldik7CisJZHNzX3VuaW5pdF9vdmVybGF5X21hbmFnZXJzKHBkZXYpOworCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fZGV2aWNlczsgKytpKQorCQlvbWFwX2Rzc191bnJlZ2lzdGVyX2RldmljZShwZGF0YS0+ZGV2aWNlc1tpXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb21hcF9kc3Nfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlEU1NEQkcoInNodXRkb3duXG4iKTsKKwlkc3NfZGlzYWJsZV9hbGxfZGV2aWNlcygpOworfQorCitzdGF0aWMgaW50IG9tYXBfZHNzX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCURTU0RCRygic3VzcGVuZCAlZFxuIiwgc3RhdGUuZXZlbnQpOworCisJcmV0dXJuIGRzc19zdXNwZW5kX2FsbF9kZXZpY2VzKCk7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9kc3NfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJRFNTREJHKCJyZXN1bWVcbiIpOworCisJcmV0dXJuIGRzc19yZXN1bWVfYWxsX2RldmljZXMoKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcF9kc3NfZHJpdmVyID0geworCS5wcm9iZSAgICAgICAgICA9IG9tYXBfZHNzX3Byb2JlLAorCS5yZW1vdmUgICAgICAgICA9IG9tYXBfZHNzX3JlbW92ZSwKKwkuc2h1dGRvd24JPSBvbWFwX2Rzc19zaHV0ZG93biwKKwkuc3VzcGVuZAk9IG9tYXBfZHNzX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBvbWFwX2Rzc19yZXN1bWUsCisJLmRyaXZlciAgICAgICAgID0geworCQkubmFtZSAgID0gIm9tYXBkc3MiLAorCQkub3duZXIgID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKKy8qIEJVUyAqLworc3RhdGljIGludCBkc3NfYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSB0b19kc3NfZGV2aWNlKGRldik7CisKKwlEU1NEQkcoImJ1c19tYXRjaC4gZGV2ICVzLyVzLCBkcnYgJXNcbiIsCisJCQlkZXZfbmFtZShkZXYpLCBkc3NkZXYtPmRyaXZlcl9uYW1lLCBkcml2ZXItPm5hbWUpOworCisJcmV0dXJuIHN0cmNtcChkc3NkZXYtPmRyaXZlcl9uYW1lLCBkcml2ZXItPm5hbWUpID09IDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRldmljZV9uYW1lX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiA9IHRvX2Rzc19kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwKKwkJCWRzc2Rldi0+bmFtZSA/CisJCQlkc3NkZXYtPm5hbWUgOiAiIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZWZhdWx0X2Rldl9hdHRyc1tdID0geworCV9fQVRUUihuYW1lLCBTX0lSVUdPLCBkZXZpY2VfbmFtZV9zaG93LCBOVUxMKSwKKwlfX0FUVFJfTlVMTCwKK307CisKK3N0YXRpYyBzc2l6ZV90IGRyaXZlcl9uYW1lX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBvbWFwX2Rzc19kcml2ZXIgKmRzc2RydiA9IHRvX2Rzc19kcml2ZXIoZHJ2KTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwKKwkJCWRzc2Rydi0+ZHJpdmVyLm5hbWUgPworCQkJZHNzZHJ2LT5kcml2ZXIubmFtZSA6ICIiKTsKK30KK3N0YXRpYyBzdHJ1Y3QgZHJpdmVyX2F0dHJpYnV0ZSBkZWZhdWx0X2Rydl9hdHRyc1tdID0geworCV9fQVRUUihuYW1lLCBTX0lSVUdPLCBkcml2ZXJfbmFtZV9zaG93LCBOVUxMKSwKKwlfX0FUVFJfTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgZHNzX2J1c190eXBlID0geworCS5uYW1lID0gIm9tYXBkc3MiLAorCS5tYXRjaCA9IGRzc19idXNfbWF0Y2gsCisJLmRldl9hdHRycyA9IGRlZmF1bHRfZGV2X2F0dHJzLAorCS5kcnZfYXR0cnMgPSBkZWZhdWx0X2Rydl9hdHRycywKK307CisKK3N0YXRpYyB2b2lkIGRzc19idXNfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJRFNTREJHKCJidXNfcmVsZWFzZVxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlIGRzc19idXMgPSB7CisJLnJlbGVhc2UgPSBkc3NfYnVzX3JlbGVhc2UsCit9OworCitzdHJ1Y3QgYnVzX3R5cGUgKmRzc19nZXRfYnVzKHZvaWQpCit7CisJcmV0dXJuICZkc3NfYnVzX3R5cGU7Cit9CisKKy8qIERSSVZFUiAqLworc3RhdGljIGludCBkc3NfZHJpdmVyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcjsKKwlzdHJ1Y3Qgb21hcF9kc3NfZHJpdmVyICpkc3NkcnYgPSB0b19kc3NfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSB0b19kc3NfZGV2aWNlKGRldik7CisJc3RydWN0IG9tYXBfZHNzX2JvYXJkX2luZm8gKnBkYXRhID0gY29yZS5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlib29sIGZvcmNlOworCisJRFNTREJHKCJkcml2ZXJfcHJvYmU6IGRldiAlcy8lcywgZHJ2ICVzXG4iLAorCQkJCWRldl9uYW1lKGRldiksIGRzc2Rldi0+ZHJpdmVyX25hbWUsCisJCQkJZHNzZHJ2LT5kcml2ZXIubmFtZSk7CisKKwlkc3NfaW5pdF9kZXZpY2UoY29yZS5wZGV2LCBkc3NkZXYpOworCisJLyogc2tpcCB0aGlzIGlmIHRoZSBkZXZpY2UgaXMgYmVoaW5kIGEgY3RybCAqLworCWlmICghZHNzZGV2LT5wYW5lbC5jdHJsKSB7CisJCWZvcmNlID0gcGRhdGEtPmRlZmF1bHRfZGV2aWNlID09IGRzc2RldjsKKwkJZHNzX3JlY2hlY2tfY29ubmVjdGlvbnMoZHNzZGV2LCBmb3JjZSk7CisJfQorCisJciA9IGRzc2Rydi0+cHJvYmUoZHNzZGV2KTsKKworCWlmIChyKSB7CisJCURTU0VSUigiZHJpdmVyIHByb2JlIGZhaWxlZDogJWRcbiIsIHIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlEU1NEQkcoInByb2JlIGRvbmUgZm9yIGRldmljZSAlc1xuIiwgZGV2X25hbWUoZGV2KSk7CisKKwlkc3NkZXYtPmRyaXZlciA9IGRzc2RydjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzc19kcml2ZXJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb21hcF9kc3NfZHJpdmVyICpkc3NkcnYgPSB0b19kc3NfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSB0b19kc3NfZGV2aWNlKGRldik7CisKKwlEU1NEQkcoImRyaXZlcl9yZW1vdmU6IGRldiAlcy8lc1xuIiwgZGV2X25hbWUoZGV2KSwKKwkJCWRzc2Rldi0+ZHJpdmVyX25hbWUpOworCisJZHNzZHJ2LT5yZW1vdmUoZHNzZGV2KTsKKworCWRzc191bmluaXRfZGV2aWNlKGNvcmUucGRldiwgZHNzZGV2KTsKKworCWRzc2Rldi0+ZHJpdmVyID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitpbnQgb21hcF9kc3NfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBvbWFwX2Rzc19kcml2ZXIgKmRzc2RyaXZlcikKK3sKKwlkc3Nkcml2ZXItPmRyaXZlci5idXMgPSAmZHNzX2J1c190eXBlOworCWRzc2RyaXZlci0+ZHJpdmVyLnByb2JlID0gZHNzX2RyaXZlcl9wcm9iZTsKKwlkc3Nkcml2ZXItPmRyaXZlci5yZW1vdmUgPSBkc3NfZHJpdmVyX3JlbW92ZTsKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkc3Nkcml2ZXItPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZHNzX3JlZ2lzdGVyX2RyaXZlcik7CisKK3ZvaWQgb21hcF9kc3NfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IG9tYXBfZHNzX2RyaXZlciAqZHNzZHJpdmVyKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZkc3Nkcml2ZXItPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZHNzX3VucmVnaXN0ZXJfZHJpdmVyKTsKKworLyogREVWSUNFICovCitzdGF0aWMgdm9pZCByZXNldF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgY2hlY2spCit7CisJdTggKmRldl9wID0gKHU4ICopZGV2OworCXU4ICpkZXZfZW5kID0gZGV2X3AgKyBzaXplb2YoKmRldik7CisJdm9pZCAqc2F2ZWRfcGRhdGE7CisKKwlzYXZlZF9wZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlpZiAoY2hlY2spIHsKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhlcmUgaXMgYW55IG90aGVyIHNldHRpbmcgdGhhbiBwbGF0Zm9ybV9kYXRhCisJCSAqIGluIHN0cnVjdCBkZXZpY2U7IHdhcm4gdGhhdCB0aGVzZSB3aWxsIGJlIHJlc2V0IGJ5IG91cgorCQkgKiBpbml0LgorCQkgKi8KKwkJZGV2LT5wbGF0Zm9ybV9kYXRhID0gTlVMTDsKKwkJd2hpbGUgKGRldl9wIDwgZGV2X2VuZCkgeworCQkJaWYgKCpkZXZfcCkgeworCQkJCVdBUk4oIiVzOiBzdHJ1Y3QgZGV2aWNlIGZpZWxkcyB3aWxsIGJlICIKKwkJCQkJCSJkaXNjYXJkZWRcbiIsCisJCQkJICAgICBfX2Z1bmNfXyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkZXZfcCsrOworCQl9CisJfQorCW1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7CisJZGV2LT5wbGF0Zm9ybV9kYXRhID0gc2F2ZWRfcGRhdGE7Cit9CisKKworc3RhdGljIHZvaWQgb21hcF9kc3NfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJlc2V0X2RldmljZShkZXYsIDApOworfQorCitpbnQgb21hcF9kc3NfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdGF0aWMgaW50IGRldl9udW07CisJc3RhdGljIGludCBwYW5lbF9udW07CisJaW50IHI7CisKKwlXQVJOX09OKCFkc3NkZXYtPmRyaXZlcl9uYW1lKTsKKworCXJlc2V0X2RldmljZSgmZHNzZGV2LT5kZXYsIDEpOworCWRzc2Rldi0+ZGV2LmJ1cyA9ICZkc3NfYnVzX3R5cGU7CisJZHNzZGV2LT5kZXYucGFyZW50ID0gJmRzc19idXM7CisJZHNzZGV2LT5kZXYucmVsZWFzZSA9IG9tYXBfZHNzX2Rldl9yZWxlYXNlOworCWRldl9zZXRfbmFtZSgmZHNzZGV2LT5kZXYsICJkaXNwbGF5JWQiLCBkZXZfbnVtKyspOworCXIgPSBkZXZpY2VfcmVnaXN0ZXIoJmRzc2Rldi0+ZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZiAoZHNzZGV2LT5jdHJsLnBhbmVsKSB7CisJCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKnBhbmVsID0gZHNzZGV2LT5jdHJsLnBhbmVsOworCisJCXBhbmVsLT5wYW5lbC5jdHJsID0gZHNzZGV2OworCisJCXJlc2V0X2RldmljZSgmcGFuZWwtPmRldiwgMSk7CisJCXBhbmVsLT5kZXYuYnVzID0gJmRzc19idXNfdHlwZTsKKwkJcGFuZWwtPmRldi5wYXJlbnQgPSAmZHNzZGV2LT5kZXY7CisJCXBhbmVsLT5kZXYucmVsZWFzZSA9IG9tYXBfZHNzX2Rldl9yZWxlYXNlOworCQlkZXZfc2V0X25hbWUoJnBhbmVsLT5kZXYsICJwYW5lbCVkIiwgcGFuZWxfbnVtKyspOworCQlyID0gZGV2aWNlX3JlZ2lzdGVyKCZwYW5lbC0+ZGV2KTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBvbWFwX2Rzc191bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJZGV2aWNlX3VucmVnaXN0ZXIoJmRzc2Rldi0+ZGV2KTsKKworCWlmIChkc3NkZXYtPmN0cmwucGFuZWwpIHsKKwkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqcGFuZWwgPSBkc3NkZXYtPmN0cmwucGFuZWw7CisJCWRldmljZV91bnJlZ2lzdGVyKCZwYW5lbC0+ZGV2KTsKKwl9Cit9CisKKy8qIEJVUyAqLworc3RhdGljIGludCBvbWFwX2Rzc19idXNfcmVnaXN0ZXIodm9pZCkKK3sKKwlpbnQgcjsKKworCXIgPSBidXNfcmVnaXN0ZXIoJmRzc19idXNfdHlwZSk7CisJaWYgKHIpIHsKKwkJRFNTRVJSKCJidXMgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHI7CisJfQorCisJZGV2X3NldF9uYW1lKCZkc3NfYnVzLCAib21hcGRzcyIpOworCXIgPSBkZXZpY2VfcmVnaXN0ZXIoJmRzc19idXMpOworCWlmIChyKSB7CisJCURTU0VSUigiYnVzIGRyaXZlciByZWdpc3RlciBmYWlsZWRcbiIpOworCQlidXNfdW5yZWdpc3RlcigmZHNzX2J1c190eXBlKTsKKwkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIElOSVQgKi8KKworI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfTU9EVUxFCitzdGF0aWMgdm9pZCBvbWFwX2Rzc19idXNfdW5yZWdpc3Rlcih2b2lkKQoreworCWRldmljZV91bnJlZ2lzdGVyKCZkc3NfYnVzKTsKKworCWJ1c191bnJlZ2lzdGVyKCZkc3NfYnVzX3R5cGUpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX2Rzc19pbml0KHZvaWQpCit7CisJaW50IHI7CisKKwlyID0gb21hcF9kc3NfYnVzX3JlZ2lzdGVyKCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb21hcF9kc3NfZHJpdmVyKTsKKwlpZiAocikgeworCQlvbWFwX2Rzc19idXNfdW5yZWdpc3RlcigpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG9tYXBfZHNzX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb21hcF9kc3NfZHJpdmVyKTsKKworCW9tYXBfZHNzX2J1c191bnJlZ2lzdGVyKCk7Cit9CisKK21vZHVsZV9pbml0KG9tYXBfZHNzX2luaXQpOworbW9kdWxlX2V4aXQob21hcF9kc3NfZXhpdCk7CisjZWxzZQorc3RhdGljIGludCBfX2luaXQgb21hcF9kc3NfaW5pdCh2b2lkKQoreworCXJldHVybiBvbWFwX2Rzc19idXNfcmVnaXN0ZXIoKTsKK30KKworc3RhdGljIGludCBfX2luaXQgb21hcF9kc3NfaW5pdDIodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvbWFwX2Rzc19kcml2ZXIpOworfQorCitjb3JlX2luaXRjYWxsKG9tYXBfZHNzX2luaXQpOworZGV2aWNlX2luaXRjYWxsKG9tYXBfZHNzX2luaXQyKTsKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJUb21pIFZhbGtlaW5lbiA8dG9taS52YWxrZWluZW5Abm9raWEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJPTUFQMi8zIERpc3BsYXkgU3Vic3lzdGVtIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BjLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kaXNwYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYWJmNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kaXNwYy5jCkBAIC0wLDAgKzEsMzA5MSBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BjLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogVG9taSBWYWxrZWluZW4gPHRvbWkudmFsa2VpbmVuQG5va2lhLmNvbT4KKyAqCisgKiBTb21lIGNvZGUgYW5kIGlkZWFzIHRha2VuIGZyb20gZHJpdmVycy92aWRlby9vbWFwLyBkcml2ZXIKKyAqIGJ5IEltcmUgRGVhay4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNkZWZpbmUgRFNTX1NVQlNZU19OQU1FICJESVNQQyIKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgPHBsYXQvc3JhbS5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKworI2luY2x1ZGUgPHBsYXQvZGlzcGxheS5oPgorCisjaW5jbHVkZSAiZHNzLmgiCisKKy8qIERJU1BDICovCisjZGVmaW5lIERJU1BDX0JBU0UJCQkweDQ4MDUwNDAwCisKKyNkZWZpbmUgRElTUENfU1pfUkVHUwkJCVNaXzFLCisKK3N0cnVjdCBkaXNwY19yZWcgeyB1MTYgaWR4OyB9OworCisjZGVmaW5lIERJU1BDX1JFRyhpZHgpCQkJKChjb25zdCBzdHJ1Y3QgZGlzcGNfcmVnKSB7IGlkeCB9KQorCisvKiBESVNQQyBjb21tb24gKi8KKyNkZWZpbmUgRElTUENfUkVWSVNJT04JCQlESVNQQ19SRUcoMHgwMDAwKQorI2RlZmluZSBESVNQQ19TWVNDT05GSUcJCQlESVNQQ19SRUcoMHgwMDEwKQorI2RlZmluZSBESVNQQ19TWVNTVEFUVVMJCQlESVNQQ19SRUcoMHgwMDE0KQorI2RlZmluZSBESVNQQ19JUlFTVEFUVVMJCQlESVNQQ19SRUcoMHgwMDE4KQorI2RlZmluZSBESVNQQ19JUlFFTkFCTEUJCQlESVNQQ19SRUcoMHgwMDFDKQorI2RlZmluZSBESVNQQ19DT05UUk9MCQkJRElTUENfUkVHKDB4MDA0MCkKKyNkZWZpbmUgRElTUENfQ09ORklHCQkJRElTUENfUkVHKDB4MDA0NCkKKyNkZWZpbmUgRElTUENfQ0FQQUJMRQkJCURJU1BDX1JFRygweDAwNDgpCisjZGVmaW5lIERJU1BDX0RFRkFVTFRfQ09MT1IwCQlESVNQQ19SRUcoMHgwMDRDKQorI2RlZmluZSBESVNQQ19ERUZBVUxUX0NPTE9SMQkJRElTUENfUkVHKDB4MDA1MCkKKyNkZWZpbmUgRElTUENfVFJBTlNfQ09MT1IwCQlESVNQQ19SRUcoMHgwMDU0KQorI2RlZmluZSBESVNQQ19UUkFOU19DT0xPUjEJCURJU1BDX1JFRygweDAwNTgpCisjZGVmaW5lIERJU1BDX0xJTkVfU1RBVFVTCQlESVNQQ19SRUcoMHgwMDVDKQorI2RlZmluZSBESVNQQ19MSU5FX05VTUJFUgkJRElTUENfUkVHKDB4MDA2MCkKKyNkZWZpbmUgRElTUENfVElNSU5HX0gJCQlESVNQQ19SRUcoMHgwMDY0KQorI2RlZmluZSBESVNQQ19USU1JTkdfVgkJCURJU1BDX1JFRygweDAwNjgpCisjZGVmaW5lIERJU1BDX1BPTF9GUkVRCQkJRElTUENfUkVHKDB4MDA2QykKKyNkZWZpbmUgRElTUENfRElWSVNPUgkJCURJU1BDX1JFRygweDAwNzApCisjZGVmaW5lIERJU1BDX0dMT0JBTF9BTFBIQQkJRElTUENfUkVHKDB4MDA3NCkKKyNkZWZpbmUgRElTUENfU0laRV9ESUcJCQlESVNQQ19SRUcoMHgwMDc4KQorI2RlZmluZSBESVNQQ19TSVpFX0xDRAkJCURJU1BDX1JFRygweDAwN0MpCisKKy8qIERJU1BDIEdGWCBwbGFuZSAqLworI2RlZmluZSBESVNQQ19HRlhfQkEwCQkJRElTUENfUkVHKDB4MDA4MCkKKyNkZWZpbmUgRElTUENfR0ZYX0JBMQkJCURJU1BDX1JFRygweDAwODQpCisjZGVmaW5lIERJU1BDX0dGWF9QT1NJVElPTgkJRElTUENfUkVHKDB4MDA4OCkKKyNkZWZpbmUgRElTUENfR0ZYX1NJWkUJCQlESVNQQ19SRUcoMHgwMDhDKQorI2RlZmluZSBESVNQQ19HRlhfQVRUUklCVVRFUwkJRElTUENfUkVHKDB4MDBBMCkKKyNkZWZpbmUgRElTUENfR0ZYX0ZJRk9fVEhSRVNIT0xECURJU1BDX1JFRygweDAwQTQpCisjZGVmaW5lIERJU1BDX0dGWF9GSUZPX1NJWkVfU1RBVFVTCURJU1BDX1JFRygweDAwQTgpCisjZGVmaW5lIERJU1BDX0dGWF9ST1dfSU5DCQlESVNQQ19SRUcoMHgwMEFDKQorI2RlZmluZSBESVNQQ19HRlhfUElYRUxfSU5DCQlESVNQQ19SRUcoMHgwMEIwKQorI2RlZmluZSBESVNQQ19HRlhfV0lORE9XX1NLSVAJCURJU1BDX1JFRygweDAwQjQpCisjZGVmaW5lIERJU1BDX0dGWF9UQUJMRV9CQQkJRElTUENfUkVHKDB4MDBCOCkKKworI2RlZmluZSBESVNQQ19EQVRBX0NZQ0xFMQkJRElTUENfUkVHKDB4MDFENCkKKyNkZWZpbmUgRElTUENfREFUQV9DWUNMRTIJCURJU1BDX1JFRygweDAxRDgpCisjZGVmaW5lIERJU1BDX0RBVEFfQ1lDTEUzCQlESVNQQ19SRUcoMHgwMURDKQorCisjZGVmaW5lIERJU1BDX0NQUl9DT0VGX1IJCURJU1BDX1JFRygweDAyMjApCisjZGVmaW5lIERJU1BDX0NQUl9DT0VGX0cJCURJU1BDX1JFRygweDAyMjQpCisjZGVmaW5lIERJU1BDX0NQUl9DT0VGX0IJCURJU1BDX1JFRygweDAyMjgpCisKKyNkZWZpbmUgRElTUENfR0ZYX1BSRUxPQUQJCURJU1BDX1JFRygweDAyMkMpCisKKy8qIERJU1BDIFZpZGVvIHBsYW5lLCBuID0gMCBmb3IgVklEMSBhbmQgbiA9IDEgZm9yIFZJRDIgKi8KKyNkZWZpbmUgRElTUENfVklEX1JFRyhuLCBpZHgpCQlESVNQQ19SRUcoMHgwMEJDICsgKG4pKjB4OTAgKyBpZHgpCisKKyNkZWZpbmUgRElTUENfVklEX0JBMChuKQkJRElTUENfVklEX1JFRyhuLCAweDAwMDApCisjZGVmaW5lIERJU1BDX1ZJRF9CQTEobikJCURJU1BDX1ZJRF9SRUcobiwgMHgwMDA0KQorI2RlZmluZSBESVNQQ19WSURfUE9TSVRJT04obikJCURJU1BDX1ZJRF9SRUcobiwgMHgwMDA4KQorI2RlZmluZSBESVNQQ19WSURfU0laRShuKQkJRElTUENfVklEX1JFRyhuLCAweDAwMEMpCisjZGVmaW5lIERJU1BDX1ZJRF9BVFRSSUJVVEVTKG4pCQlESVNQQ19WSURfUkVHKG4sIDB4MDAxMCkKKyNkZWZpbmUgRElTUENfVklEX0ZJRk9fVEhSRVNIT0xEKG4pCURJU1BDX1ZJRF9SRUcobiwgMHgwMDE0KQorI2RlZmluZSBESVNQQ19WSURfRklGT19TSVpFX1NUQVRVUyhuKQlESVNQQ19WSURfUkVHKG4sIDB4MDAxOCkKKyNkZWZpbmUgRElTUENfVklEX1JPV19JTkMobikJCURJU1BDX1ZJRF9SRUcobiwgMHgwMDFDKQorI2RlZmluZSBESVNQQ19WSURfUElYRUxfSU5DKG4pCQlESVNQQ19WSURfUkVHKG4sIDB4MDAyMCkKKyNkZWZpbmUgRElTUENfVklEX0ZJUihuKQkJRElTUENfVklEX1JFRyhuLCAweDAwMjQpCisjZGVmaW5lIERJU1BDX1ZJRF9QSUNUVVJFX1NJWkUobikJRElTUENfVklEX1JFRyhuLCAweDAwMjgpCisjZGVmaW5lIERJU1BDX1ZJRF9BQ0NVMChuKQkJRElTUENfVklEX1JFRyhuLCAweDAwMkMpCisjZGVmaW5lIERJU1BDX1ZJRF9BQ0NVMShuKQkJRElTUENfVklEX1JFRyhuLCAweDAwMzApCisKKy8qIGNvZWYgaW5kZXggaSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3fSAqLworI2RlZmluZSBESVNQQ19WSURfRklSX0NPRUZfSChuLCBpKQlESVNQQ19SRUcoMHgwMEYwICsgKG4pKjB4OTAgKyAoaSkqMHg4KQorLyogY29lZiBpbmRleCBpID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDd9ICovCisjZGVmaW5lIERJU1BDX1ZJRF9GSVJfQ09FRl9IVihuLCBpKQlESVNQQ19SRUcoMHgwMEY0ICsgKG4pKjB4OTAgKyAoaSkqMHg4KQorLyogY29lZiBpbmRleCBpID0gezAsIDEsIDIsIDMsIDR9ICovCisjZGVmaW5lIERJU1BDX1ZJRF9DT05WX0NPRUYobiwgaSkJRElTUENfUkVHKDB4MDEzMCArIChuKSoweDkwICsgKGkpKjB4NCkKKy8qIGNvZWYgaW5kZXggaSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3fSAqLworI2RlZmluZSBESVNQQ19WSURfRklSX0NPRUZfVihuLCBpKQlESVNQQ19SRUcoMHgwMUUwICsgKG4pKjB4MjAgKyAoaSkqMHg0KQorCisjZGVmaW5lIERJU1BDX1ZJRF9QUkVMT0FEKG4pCQlESVNQQ19SRUcoMHgyMzAgKyAobikqMHgwNCkKKworCisjZGVmaW5lIERJU1BDX0lSUV9NQVNLX0VSUk9SICAgICAgICAgICAgKERJU1BDX0lSUV9HRlhfRklGT19VTkRFUkZMT1cgfCBcCisJCQkJCSBESVNQQ19JUlFfT0NQX0VSUiB8IFwKKwkJCQkJIERJU1BDX0lSUV9WSUQxX0ZJRk9fVU5ERVJGTE9XIHwgXAorCQkJCQkgRElTUENfSVJRX1ZJRDJfRklGT19VTkRFUkZMT1cgfCBcCisJCQkJCSBESVNQQ19JUlFfU1lOQ19MT1NUIHwgXAorCQkJCQkgRElTUENfSVJRX1NZTkNfTE9TVF9ESUdJVCkKKworI2RlZmluZSBESVNQQ19NQVhfTlJfSVNSUwkJOAorCitzdHJ1Y3Qgb21hcF9kaXNwY19pc3JfZGF0YSB7CisJb21hcF9kaXNwY19pc3JfdAlpc3I7CisJdm9pZAkJCSphcmc7CisJdTMyCQkJbWFzazsKK307CisKKyNkZWZpbmUgUkVHX0dFVChpZHgsIHN0YXJ0LCBlbmQpIFwKKwlGTERfR0VUKGRpc3BjX3JlYWRfcmVnKGlkeCksIHN0YXJ0LCBlbmQpCisKKyNkZWZpbmUgUkVHX0ZMRF9NT0QoaWR4LCB2YWwsIHN0YXJ0LCBlbmQpCQkJCVwKKwlkaXNwY193cml0ZV9yZWcoaWR4LCBGTERfTU9EKGRpc3BjX3JlYWRfcmVnKGlkeCksIHZhbCwgc3RhcnQsIGVuZCkpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzcGNfcmVnIGRpc3BjX3JlZ19hdHRbXSA9IHsgRElTUENfR0ZYX0FUVFJJQlVURVMsCisJRElTUENfVklEX0FUVFJJQlVURVMoMCksCisJRElTUENfVklEX0FUVFJJQlVURVMoMSkgfTsKKworc3RhdGljIHN0cnVjdCB7CisJdm9pZCBfX2lvbWVtICAgICpiYXNlOworCisJdTMyCWZpZm9fc2l6ZVszXTsKKworCXNwaW5sb2NrX3QgaXJxX2xvY2s7CisJdTMyIGlycV9lcnJvcl9tYXNrOworCXN0cnVjdCBvbWFwX2Rpc3BjX2lzcl9kYXRhIHJlZ2lzdGVyZWRfaXNyW0RJU1BDX01BWF9OUl9JU1JTXTsKKwl1MzIgZXJyb3JfaXJxczsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZXJyb3Jfd29yazsKKworCXUzMgkJY3R4W0RJU1BDX1NaX1JFR1MgLyBzaXplb2YodTMyKV07Cit9IGRpc3BjOworCitzdGF0aWMgdm9pZCBfb21hcF9kaXNwY19zZXRfaXJxcyh2b2lkKTsKKworc3RhdGljIGlubGluZSB2b2lkIGRpc3BjX3dyaXRlX3JlZyhjb25zdCBzdHJ1Y3QgZGlzcGNfcmVnIGlkeCwgdTMyIHZhbCkKK3sKKwlfX3Jhd193cml0ZWwodmFsLCBkaXNwYy5iYXNlICsgaWR4LmlkeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGRpc3BjX3JlYWRfcmVnKGNvbnN0IHN0cnVjdCBkaXNwY19yZWcgaWR4KQoreworCXJldHVybiBfX3Jhd19yZWFkbChkaXNwYy5iYXNlICsgaWR4LmlkeCk7Cit9CisKKyNkZWZpbmUgU1IocmVnKSBcCisJZGlzcGMuY3R4WyhESVNQQ18jI3JlZykuaWR4IC8gc2l6ZW9mKHUzMildID0gZGlzcGNfcmVhZF9yZWcoRElTUENfIyNyZWcpCisjZGVmaW5lIFJSKHJlZykgXAorCWRpc3BjX3dyaXRlX3JlZyhESVNQQ18jI3JlZywgZGlzcGMuY3R4WyhESVNQQ18jI3JlZykuaWR4IC8gc2l6ZW9mKHUzMildKQorCit2b2lkIGRpc3BjX3NhdmVfY29udGV4dCh2b2lkKQoreworCWlmIChjcHVfaXNfb21hcDI0eHgoKSkKKwkJcmV0dXJuOworCisJU1IoU1lTQ09ORklHKTsKKwlTUihJUlFFTkFCTEUpOworCVNSKENPTlRST0wpOworCVNSKENPTkZJRyk7CisJU1IoREVGQVVMVF9DT0xPUjApOworCVNSKERFRkFVTFRfQ09MT1IxKTsKKwlTUihUUkFOU19DT0xPUjApOworCVNSKFRSQU5TX0NPTE9SMSk7CisJU1IoTElORV9OVU1CRVIpOworCVNSKFRJTUlOR19IKTsKKwlTUihUSU1JTkdfVik7CisJU1IoUE9MX0ZSRVEpOworCVNSKERJVklTT1IpOworCVNSKEdMT0JBTF9BTFBIQSk7CisJU1IoU0laRV9ESUcpOworCVNSKFNJWkVfTENEKTsKKworCVNSKEdGWF9CQTApOworCVNSKEdGWF9CQTEpOworCVNSKEdGWF9QT1NJVElPTik7CisJU1IoR0ZYX1NJWkUpOworCVNSKEdGWF9BVFRSSUJVVEVTKTsKKwlTUihHRlhfRklGT19USFJFU0hPTEQpOworCVNSKEdGWF9ST1dfSU5DKTsKKwlTUihHRlhfUElYRUxfSU5DKTsKKwlTUihHRlhfV0lORE9XX1NLSVApOworCVNSKEdGWF9UQUJMRV9CQSk7CisKKwlTUihEQVRBX0NZQ0xFMSk7CisJU1IoREFUQV9DWUNMRTIpOworCVNSKERBVEFfQ1lDTEUzKTsKKworCVNSKENQUl9DT0VGX1IpOworCVNSKENQUl9DT0VGX0cpOworCVNSKENQUl9DT0VGX0IpOworCisJU1IoR0ZYX1BSRUxPQUQpOworCisJLyogVklEMSAqLworCVNSKFZJRF9CQTAoMCkpOworCVNSKFZJRF9CQTEoMCkpOworCVNSKFZJRF9QT1NJVElPTigwKSk7CisJU1IoVklEX1NJWkUoMCkpOworCVNSKFZJRF9BVFRSSUJVVEVTKDApKTsKKwlTUihWSURfRklGT19USFJFU0hPTEQoMCkpOworCVNSKFZJRF9ST1dfSU5DKDApKTsKKwlTUihWSURfUElYRUxfSU5DKDApKTsKKwlTUihWSURfRklSKDApKTsKKwlTUihWSURfUElDVFVSRV9TSVpFKDApKTsKKwlTUihWSURfQUNDVTAoMCkpOworCVNSKFZJRF9BQ0NVMSgwKSk7CisKKwlTUihWSURfRklSX0NPRUZfSCgwLCAwKSk7CisJU1IoVklEX0ZJUl9DT0VGX0goMCwgMSkpOworCVNSKFZJRF9GSVJfQ09FRl9IKDAsIDIpKTsKKwlTUihWSURfRklSX0NPRUZfSCgwLCAzKSk7CisJU1IoVklEX0ZJUl9DT0VGX0goMCwgNCkpOworCVNSKFZJRF9GSVJfQ09FRl9IKDAsIDUpKTsKKwlTUihWSURfRklSX0NPRUZfSCgwLCA2KSk7CisJU1IoVklEX0ZJUl9DT0VGX0goMCwgNykpOworCisJU1IoVklEX0ZJUl9DT0VGX0hWKDAsIDApKTsKKwlTUihWSURfRklSX0NPRUZfSFYoMCwgMSkpOworCVNSKFZJRF9GSVJfQ09FRl9IVigwLCAyKSk7CisJU1IoVklEX0ZJUl9DT0VGX0hWKDAsIDMpKTsKKwlTUihWSURfRklSX0NPRUZfSFYoMCwgNCkpOworCVNSKFZJRF9GSVJfQ09FRl9IVigwLCA1KSk7CisJU1IoVklEX0ZJUl9DT0VGX0hWKDAsIDYpKTsKKwlTUihWSURfRklSX0NPRUZfSFYoMCwgNykpOworCisJU1IoVklEX0NPTlZfQ09FRigwLCAwKSk7CisJU1IoVklEX0NPTlZfQ09FRigwLCAxKSk7CisJU1IoVklEX0NPTlZfQ09FRigwLCAyKSk7CisJU1IoVklEX0NPTlZfQ09FRigwLCAzKSk7CisJU1IoVklEX0NPTlZfQ09FRigwLCA0KSk7CisKKwlTUihWSURfRklSX0NPRUZfVigwLCAwKSk7CisJU1IoVklEX0ZJUl9DT0VGX1YoMCwgMSkpOworCVNSKFZJRF9GSVJfQ09FRl9WKDAsIDIpKTsKKwlTUihWSURfRklSX0NPRUZfVigwLCAzKSk7CisJU1IoVklEX0ZJUl9DT0VGX1YoMCwgNCkpOworCVNSKFZJRF9GSVJfQ09FRl9WKDAsIDUpKTsKKwlTUihWSURfRklSX0NPRUZfVigwLCA2KSk7CisJU1IoVklEX0ZJUl9DT0VGX1YoMCwgNykpOworCisJU1IoVklEX1BSRUxPQUQoMCkpOworCisJLyogVklEMiAqLworCVNSKFZJRF9CQTAoMSkpOworCVNSKFZJRF9CQTEoMSkpOworCVNSKFZJRF9QT1NJVElPTigxKSk7CisJU1IoVklEX1NJWkUoMSkpOworCVNSKFZJRF9BVFRSSUJVVEVTKDEpKTsKKwlTUihWSURfRklGT19USFJFU0hPTEQoMSkpOworCVNSKFZJRF9ST1dfSU5DKDEpKTsKKwlTUihWSURfUElYRUxfSU5DKDEpKTsKKwlTUihWSURfRklSKDEpKTsKKwlTUihWSURfUElDVFVSRV9TSVpFKDEpKTsKKwlTUihWSURfQUNDVTAoMSkpOworCVNSKFZJRF9BQ0NVMSgxKSk7CisKKwlTUihWSURfRklSX0NPRUZfSCgxLCAwKSk7CisJU1IoVklEX0ZJUl9DT0VGX0goMSwgMSkpOworCVNSKFZJRF9GSVJfQ09FRl9IKDEsIDIpKTsKKwlTUihWSURfRklSX0NPRUZfSCgxLCAzKSk7CisJU1IoVklEX0ZJUl9DT0VGX0goMSwgNCkpOworCVNSKFZJRF9GSVJfQ09FRl9IKDEsIDUpKTsKKwlTUihWSURfRklSX0NPRUZfSCgxLCA2KSk7CisJU1IoVklEX0ZJUl9DT0VGX0goMSwgNykpOworCisJU1IoVklEX0ZJUl9DT0VGX0hWKDEsIDApKTsKKwlTUihWSURfRklSX0NPRUZfSFYoMSwgMSkpOworCVNSKFZJRF9GSVJfQ09FRl9IVigxLCAyKSk7CisJU1IoVklEX0ZJUl9DT0VGX0hWKDEsIDMpKTsKKwlTUihWSURfRklSX0NPRUZfSFYoMSwgNCkpOworCVNSKFZJRF9GSVJfQ09FRl9IVigxLCA1KSk7CisJU1IoVklEX0ZJUl9DT0VGX0hWKDEsIDYpKTsKKwlTUihWSURfRklSX0NPRUZfSFYoMSwgNykpOworCisJU1IoVklEX0NPTlZfQ09FRigxLCAwKSk7CisJU1IoVklEX0NPTlZfQ09FRigxLCAxKSk7CisJU1IoVklEX0NPTlZfQ09FRigxLCAyKSk7CisJU1IoVklEX0NPTlZfQ09FRigxLCAzKSk7CisJU1IoVklEX0NPTlZfQ09FRigxLCA0KSk7CisKKwlTUihWSURfRklSX0NPRUZfVigxLCAwKSk7CisJU1IoVklEX0ZJUl9DT0VGX1YoMSwgMSkpOworCVNSKFZJRF9GSVJfQ09FRl9WKDEsIDIpKTsKKwlTUihWSURfRklSX0NPRUZfVigxLCAzKSk7CisJU1IoVklEX0ZJUl9DT0VGX1YoMSwgNCkpOworCVNSKFZJRF9GSVJfQ09FRl9WKDEsIDUpKTsKKwlTUihWSURfRklSX0NPRUZfVigxLCA2KSk7CisJU1IoVklEX0ZJUl9DT0VGX1YoMSwgNykpOworCisJU1IoVklEX1BSRUxPQUQoMSkpOworfQorCit2b2lkIGRpc3BjX3Jlc3RvcmVfY29udGV4dCh2b2lkKQoreworCVJSKFNZU0NPTkZJRyk7CisJUlIoSVJRRU5BQkxFKTsKKwkvKlJSKENPTlRST0wpOyovCisJUlIoQ09ORklHKTsKKwlSUihERUZBVUxUX0NPTE9SMCk7CisJUlIoREVGQVVMVF9DT0xPUjEpOworCVJSKFRSQU5TX0NPTE9SMCk7CisJUlIoVFJBTlNfQ09MT1IxKTsKKwlSUihMSU5FX05VTUJFUik7CisJUlIoVElNSU5HX0gpOworCVJSKFRJTUlOR19WKTsKKwlSUihQT0xfRlJFUSk7CisJUlIoRElWSVNPUik7CisJUlIoR0xPQkFMX0FMUEhBKTsKKwlSUihTSVpFX0RJRyk7CisJUlIoU0laRV9MQ0QpOworCisJUlIoR0ZYX0JBMCk7CisJUlIoR0ZYX0JBMSk7CisJUlIoR0ZYX1BPU0lUSU9OKTsKKwlSUihHRlhfU0laRSk7CisJUlIoR0ZYX0FUVFJJQlVURVMpOworCVJSKEdGWF9GSUZPX1RIUkVTSE9MRCk7CisJUlIoR0ZYX1JPV19JTkMpOworCVJSKEdGWF9QSVhFTF9JTkMpOworCVJSKEdGWF9XSU5ET1dfU0tJUCk7CisJUlIoR0ZYX1RBQkxFX0JBKTsKKworCVJSKERBVEFfQ1lDTEUxKTsKKwlSUihEQVRBX0NZQ0xFMik7CisJUlIoREFUQV9DWUNMRTMpOworCisJUlIoQ1BSX0NPRUZfUik7CisJUlIoQ1BSX0NPRUZfRyk7CisJUlIoQ1BSX0NPRUZfQik7CisKKwlSUihHRlhfUFJFTE9BRCk7CisKKwkvKiBWSUQxICovCisJUlIoVklEX0JBMCgwKSk7CisJUlIoVklEX0JBMSgwKSk7CisJUlIoVklEX1BPU0lUSU9OKDApKTsKKwlSUihWSURfU0laRSgwKSk7CisJUlIoVklEX0FUVFJJQlVURVMoMCkpOworCVJSKFZJRF9GSUZPX1RIUkVTSE9MRCgwKSk7CisJUlIoVklEX1JPV19JTkMoMCkpOworCVJSKFZJRF9QSVhFTF9JTkMoMCkpOworCVJSKFZJRF9GSVIoMCkpOworCVJSKFZJRF9QSUNUVVJFX1NJWkUoMCkpOworCVJSKFZJRF9BQ0NVMCgwKSk7CisJUlIoVklEX0FDQ1UxKDApKTsKKworCVJSKFZJRF9GSVJfQ09FRl9IKDAsIDApKTsKKwlSUihWSURfRklSX0NPRUZfSCgwLCAxKSk7CisJUlIoVklEX0ZJUl9DT0VGX0goMCwgMikpOworCVJSKFZJRF9GSVJfQ09FRl9IKDAsIDMpKTsKKwlSUihWSURfRklSX0NPRUZfSCgwLCA0KSk7CisJUlIoVklEX0ZJUl9DT0VGX0goMCwgNSkpOworCVJSKFZJRF9GSVJfQ09FRl9IKDAsIDYpKTsKKwlSUihWSURfRklSX0NPRUZfSCgwLCA3KSk7CisKKwlSUihWSURfRklSX0NPRUZfSFYoMCwgMCkpOworCVJSKFZJRF9GSVJfQ09FRl9IVigwLCAxKSk7CisJUlIoVklEX0ZJUl9DT0VGX0hWKDAsIDIpKTsKKwlSUihWSURfRklSX0NPRUZfSFYoMCwgMykpOworCVJSKFZJRF9GSVJfQ09FRl9IVigwLCA0KSk7CisJUlIoVklEX0ZJUl9DT0VGX0hWKDAsIDUpKTsKKwlSUihWSURfRklSX0NPRUZfSFYoMCwgNikpOworCVJSKFZJRF9GSVJfQ09FRl9IVigwLCA3KSk7CisKKwlSUihWSURfQ09OVl9DT0VGKDAsIDApKTsKKwlSUihWSURfQ09OVl9DT0VGKDAsIDEpKTsKKwlSUihWSURfQ09OVl9DT0VGKDAsIDIpKTsKKwlSUihWSURfQ09OVl9DT0VGKDAsIDMpKTsKKwlSUihWSURfQ09OVl9DT0VGKDAsIDQpKTsKKworCVJSKFZJRF9GSVJfQ09FRl9WKDAsIDApKTsKKwlSUihWSURfRklSX0NPRUZfVigwLCAxKSk7CisJUlIoVklEX0ZJUl9DT0VGX1YoMCwgMikpOworCVJSKFZJRF9GSVJfQ09FRl9WKDAsIDMpKTsKKwlSUihWSURfRklSX0NPRUZfVigwLCA0KSk7CisJUlIoVklEX0ZJUl9DT0VGX1YoMCwgNSkpOworCVJSKFZJRF9GSVJfQ09FRl9WKDAsIDYpKTsKKwlSUihWSURfRklSX0NPRUZfVigwLCA3KSk7CisKKwlSUihWSURfUFJFTE9BRCgwKSk7CisKKwkvKiBWSUQyICovCisJUlIoVklEX0JBMCgxKSk7CisJUlIoVklEX0JBMSgxKSk7CisJUlIoVklEX1BPU0lUSU9OKDEpKTsKKwlSUihWSURfU0laRSgxKSk7CisJUlIoVklEX0FUVFJJQlVURVMoMSkpOworCVJSKFZJRF9GSUZPX1RIUkVTSE9MRCgxKSk7CisJUlIoVklEX1JPV19JTkMoMSkpOworCVJSKFZJRF9QSVhFTF9JTkMoMSkpOworCVJSKFZJRF9GSVIoMSkpOworCVJSKFZJRF9QSUNUVVJFX1NJWkUoMSkpOworCVJSKFZJRF9BQ0NVMCgxKSk7CisJUlIoVklEX0FDQ1UxKDEpKTsKKworCVJSKFZJRF9GSVJfQ09FRl9IKDEsIDApKTsKKwlSUihWSURfRklSX0NPRUZfSCgxLCAxKSk7CisJUlIoVklEX0ZJUl9DT0VGX0goMSwgMikpOworCVJSKFZJRF9GSVJfQ09FRl9IKDEsIDMpKTsKKwlSUihWSURfRklSX0NPRUZfSCgxLCA0KSk7CisJUlIoVklEX0ZJUl9DT0VGX0goMSwgNSkpOworCVJSKFZJRF9GSVJfQ09FRl9IKDEsIDYpKTsKKwlSUihWSURfRklSX0NPRUZfSCgxLCA3KSk7CisKKwlSUihWSURfRklSX0NPRUZfSFYoMSwgMCkpOworCVJSKFZJRF9GSVJfQ09FRl9IVigxLCAxKSk7CisJUlIoVklEX0ZJUl9DT0VGX0hWKDEsIDIpKTsKKwlSUihWSURfRklSX0NPRUZfSFYoMSwgMykpOworCVJSKFZJRF9GSVJfQ09FRl9IVigxLCA0KSk7CisJUlIoVklEX0ZJUl9DT0VGX0hWKDEsIDUpKTsKKwlSUihWSURfRklSX0NPRUZfSFYoMSwgNikpOworCVJSKFZJRF9GSVJfQ09FRl9IVigxLCA3KSk7CisKKwlSUihWSURfQ09OVl9DT0VGKDEsIDApKTsKKwlSUihWSURfQ09OVl9DT0VGKDEsIDEpKTsKKwlSUihWSURfQ09OVl9DT0VGKDEsIDIpKTsKKwlSUihWSURfQ09OVl9DT0VGKDEsIDMpKTsKKwlSUihWSURfQ09OVl9DT0VGKDEsIDQpKTsKKworCVJSKFZJRF9GSVJfQ09FRl9WKDEsIDApKTsKKwlSUihWSURfRklSX0NPRUZfVigxLCAxKSk7CisJUlIoVklEX0ZJUl9DT0VGX1YoMSwgMikpOworCVJSKFZJRF9GSVJfQ09FRl9WKDEsIDMpKTsKKwlSUihWSURfRklSX0NPRUZfVigxLCA0KSk7CisJUlIoVklEX0ZJUl9DT0VGX1YoMSwgNSkpOworCVJSKFZJRF9GSVJfQ09FRl9WKDEsIDYpKTsKKwlSUihWSURfRklSX0NPRUZfVigxLCA3KSk7CisKKwlSUihWSURfUFJFTE9BRCgxKSk7CisKKwkvKiBlbmFibGUgbGFzdCwgYmVjYXVzZSBMQ0QgJiBESUdJVCBlbmFibGUgYXJlIGhlcmUgKi8KKwlSUihDT05UUk9MKTsKK30KKworI3VuZGVmIFNSCisjdW5kZWYgUlIKKworc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9jbG9ja3MoYm9vbCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkKKwkJZHNzX2Nsa19lbmFibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSzEpOworCWVsc2UKKwkJZHNzX2Nsa19kaXNhYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0sxKTsKK30KKworYm9vbCBkaXNwY19nb19idXN5KGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpCit7CisJaW50IGJpdDsKKworCWlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEKQorCQliaXQgPSA1OyAvKiBHT0xDRCAqLworCWVsc2UKKwkJYml0ID0gNjsgLyogR09ESUdJVCAqLworCisJcmV0dXJuIFJFR19HRVQoRElTUENfQ09OVFJPTCwgYml0LCBiaXQpID09IDE7Cit9CisKK3ZvaWQgZGlzcGNfZ28oZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCkKK3sKKwlpbnQgYml0OworCisJZW5hYmxlX2Nsb2NrcygxKTsKKworCWlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEKQorCQliaXQgPSAwOyAvKiBMQ0RFTkFCTEUgKi8KKwllbHNlCisJCWJpdCA9IDE7IC8qIERJR0lUQUxFTkFCTEUgKi8KKworCS8qIGlmIHRoZSBjaGFubmVsIGlzIG5vdCBlbmFibGVkLCB3ZSBkb24ndCBuZWVkIEdPICovCisJaWYgKFJFR19HRVQoRElTUENfQ09OVFJPTCwgYml0LCBiaXQpID09IDApCisJCWdvdG8gZW5kOworCisJaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpCisJCWJpdCA9IDU7IC8qIEdPTENEICovCisJZWxzZQorCQliaXQgPSA2OyAvKiBHT0RJR0lUICovCisKKwlpZiAoUkVHX0dFVChESVNQQ19DT05UUk9MLCBiaXQsIGJpdCkgPT0gMSkgeworCQlEU1NFUlIoIkdPIGJpdCBub3QgZG93biBmb3IgY2hhbm5lbCAlZFxuIiwgY2hhbm5lbCk7CisJCWdvdG8gZW5kOworCX0KKworCURTU0RCRygiR08gJXNcbiIsIGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QgPyAiTENEIiA6ICJESUdJVCIpOworCisJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgMSwgYml0LCBiaXQpOworZW5kOgorCWVuYWJsZV9jbG9ja3MoMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9kaXNwY193cml0ZV9maXJoX3JlZyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGludCByZWcsIHUzMiB2YWx1ZSkKK3sKKwlCVUdfT04ocGxhbmUgPT0gT01BUF9EU1NfR0ZYKTsKKworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19WSURfRklSX0NPRUZfSChwbGFuZS0xLCByZWcpLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9kaXNwY193cml0ZV9maXJodl9yZWcoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgcmVnLCB1MzIgdmFsdWUpCit7CisJQlVHX09OKHBsYW5lID09IE9NQVBfRFNTX0dGWCk7CisKKwlkaXNwY193cml0ZV9yZWcoRElTUENfVklEX0ZJUl9DT0VGX0hWKHBsYW5lLTEsIHJlZyksIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgX2Rpc3BjX3dyaXRlX2ZpcnZfcmVnKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IHJlZywgdTMyIHZhbHVlKQoreworCUJVR19PTihwbGFuZSA9PSBPTUFQX0RTU19HRlgpOworCisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX1ZJRF9GSVJfQ09FRl9WKHBsYW5lLTEsIHJlZyksIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9zY2FsZV9jb2VmKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IGhzY2FsZXVwLAorCQlpbnQgdnNjYWxldXAsIGludCBmaXZlX3RhcHMpCit7CisJLyogQ29lZmZpY2llbnRzIGZvciBob3Jpem9udGFsIHVwLXNhbXBsaW5nICovCisJc3RhdGljIGNvbnN0IHUzMiBjb2VmX2h1cFs4XSA9IHsKKwkJMHgwMDgwMDAwMCwKKwkJMHgwRDdDRjgwMCwKKwkJMHgxRTcwRjVGRiwKKwkJMHgzMzVGRjVGRSwKKwkJMHhGNzQ5NDlGNywKKwkJMHhGNTVGMzNGQiwKKwkJMHhGNTcwMUVGRSwKKwkJMHhGODdDMERGRiwKKwl9OworCisJLyogQ29lZmZpY2llbnRzIGZvciBob3Jpem9udGFsIGRvd24tc2FtcGxpbmcgKi8KKwlzdGF0aWMgY29uc3QgdTMyIGNvZWZfaGRvd25bOF0gPSB7CisJCTB4MjQzODI0MDAsCisJCTB4MjgzNzFGRkUsCisJCTB4MkMzNjFCRkIsCisJCTB4MzAzNTE2RjksCisJCTB4MTEzNDMzMTEsCisJCTB4MTYzNTMwMEMsCisJCTB4MUIzNjJDMDgsCisJCTB4MUYzNzI4MDQsCisJfTsKKworCS8qIENvZWZmaWNpZW50cyBmb3IgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgdXAtc2FtcGxpbmcgKi8KKwlzdGF0aWMgY29uc3QgdTMyIGNvZWZfaHZ1cFsyXVs4XSA9IHsKKwkJeworCQkweDAwODAwMDAwLAorCQkweDAzN0IwMkZGLAorCQkweDBDNkYwNUZFLAorCQkweDIwNTkwN0ZCLAorCQkweDAwNDA0MDAwLAorCQkweDA3NTkyMEZFLAorCQkweDA1NkYwQ0ZGLAorCQkweDAyN0IwMzAwLAorCQl9LAorCQl7CisJCTB4MDA4MDAwMDAsCisJCTB4MEQ3Q0Y4RkYsCisJCTB4MUU3MEY1RkUsCisJCTB4MzM1RkY1RkIsCisJCTB4Rjc0MDQwMDAsCisJCTB4RjU1RjMzRkUsCisJCTB4RjU3MDFFRkYsCisJCTB4Rjg3QzBEMDAsCisJCX0sCisJfTsKKworCS8qIENvZWZmaWNpZW50cyBmb3IgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZG93bi1zYW1wbGluZyAqLworCXN0YXRpYyBjb25zdCB1MzIgY29lZl9odmRvd25bMl1bOF0gPSB7CisJCXsKKwkJMHgyNDM4MjQwMCwKKwkJMHgyODM5MUYwNCwKKwkJMHgyRDM4MUIwOCwKKwkJMHgzMjM3MTcwQywKKwkJMHgxMjM3MzdGNywKKwkJMHgxNzM3MzJGOSwKKwkJMHgxQjM4MkRGQiwKKwkJMHgxRjM5MjhGRSwKKwkJfSwKKwkJeworCQkweDI0MzgyNDAwLAorCQkweDI4MzcxRjA0LAorCQkweDJDMzYxQjA4LAorCQkweDMwMzUxNjBDLAorCQkweDExMzQzM0Y3LAorCQkweDE2MzUzMEY5LAorCQkweDFCMzYyQ0ZCLAorCQkweDFGMzcyOEZFLAorCQl9LAorCX07CisKKwkvKiBDb2VmZmljaWVudHMgZm9yIHZlcnRpY2FsIHVwLXNhbXBsaW5nICovCisJc3RhdGljIGNvbnN0IHUzMiBjb2VmX3Z1cFs4XSA9IHsKKwkJMHgwMDAwMDAwMCwKKwkJMHgwMDAwRkYwMCwKKwkJMHgwMDAwRkVGRiwKKwkJMHgwMDAwRkJGRSwKKwkJMHgwMDAwMDBGNywKKwkJMHgwMDAwRkVGQiwKKwkJMHgwMDAwRkZGRSwKKwkJMHgwMDAwMDBGRiwKKwl9OworCisKKwkvKiBDb2VmZmljaWVudHMgZm9yIHZlcnRpY2FsIGRvd24tc2FtcGxpbmcgKi8KKwlzdGF0aWMgY29uc3QgdTMyIGNvZWZfdmRvd25bOF0gPSB7CisJCTB4MDAwMDAwMDAsCisJCTB4MDAwMDA0RkUsCisJCTB4MDAwMDA4RkIsCisJCTB4MDAwMDBDRjksCisJCTB4MDAwMEY3MTEsCisJCTB4MDAwMEY5MEMsCisJCTB4MDAwMEZCMDgsCisJCTB4MDAwMEZFMDQsCisJfTsKKworCWNvbnN0IHUzMiAqaF9jb2VmOworCWNvbnN0IHUzMiAqaHZfY29lZjsKKwljb25zdCB1MzIgKmh2X2NvZWZfbW9kOworCWNvbnN0IHUzMiAqdl9jb2VmOworCWludCBpOworCisJaWYgKGhzY2FsZXVwKQorCQloX2NvZWYgPSBjb2VmX2h1cDsKKwllbHNlCisJCWhfY29lZiA9IGNvZWZfaGRvd247CisKKwlpZiAodnNjYWxldXApIHsKKwkJaHZfY29lZiA9IGNvZWZfaHZ1cFtmaXZlX3RhcHNdOworCQl2X2NvZWYgPSBjb2VmX3Z1cDsKKworCQlpZiAoaHNjYWxldXApCisJCQlodl9jb2VmX21vZCA9IE5VTEw7CisJCWVsc2UKKwkJCWh2X2NvZWZfbW9kID0gY29lZl9odmRvd25bZml2ZV90YXBzXTsKKwl9IGVsc2UgeworCQlodl9jb2VmID0gY29lZl9odmRvd25bZml2ZV90YXBzXTsKKwkJdl9jb2VmID0gY29lZl92ZG93bjsKKworCQlpZiAoaHNjYWxldXApCisJCQlodl9jb2VmX21vZCA9IGNvZWZfaHZ1cFtmaXZlX3RhcHNdOworCQllbHNlCisJCQlodl9jb2VmX21vZCA9IE5VTEw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQl1MzIgaCwgaHY7CisKKwkJaCA9IGhfY29lZltpXTsKKworCQlodiA9IGh2X2NvZWZbaV07CisKKwkJaWYgKGh2X2NvZWZfbW9kKSB7CisJCQlodiAmPSAweGZmZmZmZjAwOworCQkJaHYgfD0gKGh2X2NvZWZfbW9kW2ldICYgMHhmZik7CisJCX0KKworCQlfZGlzcGNfd3JpdGVfZmlyaF9yZWcocGxhbmUsIGksIGgpOworCQlfZGlzcGNfd3JpdGVfZmlyaHZfcmVnKHBsYW5lLCBpLCBodik7CisJfQorCisJaWYgKCFmaXZlX3RhcHMpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJdTMyIHY7CisJCXYgPSB2X2NvZWZbaV07CisJCV9kaXNwY193cml0ZV9maXJ2X3JlZyhwbGFuZSwgaSwgdik7CisJfQorfQorCitzdGF0aWMgdm9pZCBfZGlzcGNfc2V0dXBfY29sb3JfY29udl9jb2VmKHZvaWQpCit7CisJY29uc3Qgc3RydWN0IGNvbG9yX2NvbnZfY29lZiB7CisJCWludCAgcnksICByY3IsICByY2IsICAgZ3ksICBnY3IsICBnY2IsICAgYnksICBiY3IsICBiY2I7CisJCWludCAgZnVsbF9yYW5nZTsKKwl9ICBjdGJsX2J0NjAxXzUgPSB7CisJCTI5OCwgIDQwOSwgICAgMCwgIDI5OCwgLTIwOCwgLTEwMCwgIDI5OCwgICAgMCwgIDUxNywgMCwKKwl9OworCisJY29uc3Qgc3RydWN0IGNvbG9yX2NvbnZfY29lZiAqY3Q7CisKKyNkZWZpbmUgQ1ZBTCh4LCB5KSAoRkxEX1ZBTCh4LCAyNiwgMTYpIHwgRkxEX1ZBTCh5LCAxMCwgMCkpCisKKwljdCA9ICZjdGJsX2J0NjAxXzU7CisKKwlkaXNwY193cml0ZV9yZWcoRElTUENfVklEX0NPTlZfQ09FRigwLCAwKSwgQ1ZBTChjdC0+cmNyLCBjdC0+cnkpKTsKKwlkaXNwY193cml0ZV9yZWcoRElTUENfVklEX0NPTlZfQ09FRigwLCAxKSwgQ1ZBTChjdC0+Z3ksCSBjdC0+cmNiKSk7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX1ZJRF9DT05WX0NPRUYoMCwgMiksIENWQUwoY3QtPmdjYiwgY3QtPmdjcikpOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19WSURfQ09OVl9DT0VGKDAsIDMpLCBDVkFMKGN0LT5iY3IsIGN0LT5ieSkpOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19WSURfQ09OVl9DT0VGKDAsIDQpLCBDVkFMKDAsICAgICAgIGN0LT5iY2IpKTsKKworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19WSURfQ09OVl9DT0VGKDEsIDApLCBDVkFMKGN0LT5yY3IsIGN0LT5yeSkpOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19WSURfQ09OVl9DT0VGKDEsIDEpLCBDVkFMKGN0LT5neSwJIGN0LT5yY2IpKTsKKwlkaXNwY193cml0ZV9yZWcoRElTUENfVklEX0NPTlZfQ09FRigxLCAyKSwgQ1ZBTChjdC0+Z2NiLCBjdC0+Z2NyKSk7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX1ZJRF9DT05WX0NPRUYoMSwgMyksIENWQUwoY3QtPmJjciwgY3QtPmJ5KSk7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX1ZJRF9DT05WX0NPRUYoMSwgNCksIENWQUwoMCwgICAgICAgY3QtPmJjYikpOworCisjdW5kZWYgQ1ZBTAorCisJUkVHX0ZMRF9NT0QoRElTUENfVklEX0FUVFJJQlVURVMoMCksIGN0LT5mdWxsX3JhbmdlLCAxMSwgMTEpOworCVJFR19GTERfTU9EKERJU1BDX1ZJRF9BVFRSSUJVVEVTKDEpLCBjdC0+ZnVsbF9yYW5nZSwgMTEsIDExKTsKK30KKworCitzdGF0aWMgdm9pZCBfZGlzcGNfc2V0X3BsYW5lX2JhMChlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHUzMiBwYWRkcikKK3sKKwljb25zdCBzdHJ1Y3QgZGlzcGNfcmVnIGJhMF9yZWdbXSA9IHsgRElTUENfR0ZYX0JBMCwKKwkJRElTUENfVklEX0JBMCgwKSwKKwkJRElTUENfVklEX0JBMCgxKSB9OworCisJZGlzcGNfd3JpdGVfcmVnKGJhMF9yZWdbcGxhbmVdLCBwYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIF9kaXNwY19zZXRfcGxhbmVfYmExKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgdTMyIHBhZGRyKQoreworCWNvbnN0IHN0cnVjdCBkaXNwY19yZWcgYmExX3JlZ1tdID0geyBESVNQQ19HRlhfQkExLAorCQkJCSAgICAgIERJU1BDX1ZJRF9CQTEoMCksCisJCQkJICAgICAgRElTUENfVklEX0JBMSgxKSB9OworCisJZGlzcGNfd3JpdGVfcmVnKGJhMV9yZWdbcGxhbmVdLCBwYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIF9kaXNwY19zZXRfcGxhbmVfcG9zKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IHgsIGludCB5KQoreworCWNvbnN0IHN0cnVjdCBkaXNwY19yZWcgcG9zX3JlZ1tdID0geyBESVNQQ19HRlhfUE9TSVRJT04sCisJCQkJICAgICAgRElTUENfVklEX1BPU0lUSU9OKDApLAorCQkJCSAgICAgIERJU1BDX1ZJRF9QT1NJVElPTigxKSB9OworCisJdTMyIHZhbCA9IEZMRF9WQUwoeSwgMjYsIDE2KSB8IEZMRF9WQUwoeCwgMTAsIDApOworCWRpc3BjX3dyaXRlX3JlZyhwb3NfcmVnW3BsYW5lXSwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9waWNfc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwljb25zdCBzdHJ1Y3QgZGlzcGNfcmVnIHNpel9yZWdbXSA9IHsgRElTUENfR0ZYX1NJWkUsCisJCQkJICAgICAgRElTUENfVklEX1BJQ1RVUkVfU0laRSgwKSwKKwkJCQkgICAgICBESVNQQ19WSURfUElDVFVSRV9TSVpFKDEpIH07CisJdTMyIHZhbCA9IEZMRF9WQUwoaGVpZ2h0IC0gMSwgMjYsIDE2KSB8IEZMRF9WQUwod2lkdGggLSAxLCAxMCwgMCk7CisJZGlzcGNfd3JpdGVfcmVnKHNpel9yZWdbcGxhbmVdLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBfZGlzcGNfc2V0X3ZpZF9zaXplKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCXUzMiB2YWw7CisJY29uc3Qgc3RydWN0IGRpc3BjX3JlZyB2c2lfcmVnW10gPSB7IERJU1BDX1ZJRF9TSVpFKDApLAorCQkJCSAgICAgIERJU1BDX1ZJRF9TSVpFKDEpIH07CisKKwlCVUdfT04ocGxhbmUgPT0gT01BUF9EU1NfR0ZYKTsKKworCXZhbCA9IEZMRF9WQUwoaGVpZ2h0IC0gMSwgMjYsIDE2KSB8IEZMRF9WQUwod2lkdGggLSAxLCAxMCwgMCk7CisJZGlzcGNfd3JpdGVfcmVnKHZzaV9yZWdbcGxhbmUtMV0sIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIF9kaXNwY19zZXR1cF9nbG9iYWxfYWxwaGEoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1OCBnbG9iYWxfYWxwaGEpCit7CisKKwlCVUdfT04ocGxhbmUgPT0gT01BUF9EU1NfVklERU8xKTsKKworCWlmIChjcHVfaXNfb21hcDI0eHgoKSkKKwkJcmV0dXJuOworCisJaWYgKHBsYW5lID09IE9NQVBfRFNTX0dGWCkKKwkJUkVHX0ZMRF9NT0QoRElTUENfR0xPQkFMX0FMUEhBLCBnbG9iYWxfYWxwaGEsIDcsIDApOworCWVsc2UgaWYgKHBsYW5lID09IE9NQVBfRFNTX1ZJREVPMikKKwkJUkVHX0ZMRF9NT0QoRElTUENfR0xPQkFMX0FMUEhBLCBnbG9iYWxfYWxwaGEsIDIzLCAxNik7Cit9CisKK3N0YXRpYyB2b2lkIF9kaXNwY19zZXRfcGl4X2luYyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHMzMiBpbmMpCit7CisJY29uc3Qgc3RydWN0IGRpc3BjX3JlZyByaV9yZWdbXSA9IHsgRElTUENfR0ZYX1BJWEVMX0lOQywKKwkJCQkgICAgIERJU1BDX1ZJRF9QSVhFTF9JTkMoMCksCisJCQkJICAgICBESVNQQ19WSURfUElYRUxfSU5DKDEpIH07CisKKwlkaXNwY193cml0ZV9yZWcocmlfcmVnW3BsYW5lXSwgaW5jKTsKK30KKworc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9yb3dfaW5jKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgczMyIGluYykKK3sKKwljb25zdCBzdHJ1Y3QgZGlzcGNfcmVnIHJpX3JlZ1tdID0geyBESVNQQ19HRlhfUk9XX0lOQywKKwkJCQkgICAgIERJU1BDX1ZJRF9ST1dfSU5DKDApLAorCQkJCSAgICAgRElTUENfVklEX1JPV19JTkMoMSkgfTsKKworCWRpc3BjX3dyaXRlX3JlZyhyaV9yZWdbcGxhbmVdLCBpbmMpOworfQorCitzdGF0aWMgdm9pZCBfZGlzcGNfc2V0X2NvbG9yX21vZGUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAorCQllbnVtIG9tYXBfY29sb3JfbW9kZSBjb2xvcl9tb2RlKQoreworCXUzMiBtID0gMDsKKworCXN3aXRjaCAoY29sb3JfbW9kZSkgeworCWNhc2UgT01BUF9EU1NfQ09MT1JfQ0xVVDE6CisJCW0gPSAweDA7IGJyZWFrOworCWNhc2UgT01BUF9EU1NfQ09MT1JfQ0xVVDI6CisJCW0gPSAweDE7IGJyZWFrOworCWNhc2UgT01BUF9EU1NfQ09MT1JfQ0xVVDQ6CisJCW0gPSAweDI7IGJyZWFrOworCWNhc2UgT01BUF9EU1NfQ09MT1JfQ0xVVDg6CisJCW0gPSAweDM7IGJyZWFrOworCWNhc2UgT01BUF9EU1NfQ09MT1JfUkdCMTJVOgorCQltID0gMHg0OyBicmVhazsKKwljYXNlIE9NQVBfRFNTX0NPTE9SX0FSR0IxNjoKKwkJbSA9IDB4NTsgYnJlYWs7CisJY2FzZSBPTUFQX0RTU19DT0xPUl9SR0IxNjoKKwkJbSA9IDB4NjsgYnJlYWs7CisJY2FzZSBPTUFQX0RTU19DT0xPUl9SR0IyNFU6CisJCW0gPSAweDg7IGJyZWFrOworCWNhc2UgT01BUF9EU1NfQ09MT1JfUkdCMjRQOgorCQltID0gMHg5OyBicmVhazsKKwljYXNlIE9NQVBfRFNTX0NPTE9SX1lVVjI6CisJCW0gPSAweGE7IGJyZWFrOworCWNhc2UgT01BUF9EU1NfQ09MT1JfVVlWWToKKwkJbSA9IDB4YjsgYnJlYWs7CisJY2FzZSBPTUFQX0RTU19DT0xPUl9BUkdCMzI6CisJCW0gPSAweGM7IGJyZWFrOworCWNhc2UgT01BUF9EU1NfQ09MT1JfUkdCQTMyOgorCQltID0gMHhkOyBicmVhazsKKwljYXNlIE9NQVBfRFNTX0NPTE9SX1JHQlgzMjoKKwkJbSA9IDB4ZTsgYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7IGJyZWFrOworCX0KKworCVJFR19GTERfTU9EKGRpc3BjX3JlZ19hdHRbcGxhbmVdLCBtLCA0LCAxKTsKK30KKworc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9jaGFubmVsX291dChlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCisJCWVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpCit7CisJaW50IHNoaWZ0OworCXUzMiB2YWw7CisKKwlzd2l0Y2ggKHBsYW5lKSB7CisJY2FzZSBPTUFQX0RTU19HRlg6CisJCXNoaWZ0ID0gODsKKwkJYnJlYWs7CisJY2FzZSBPTUFQX0RTU19WSURFTzE6CisJY2FzZSBPTUFQX0RTU19WSURFTzI6CisJCXNoaWZ0ID0gMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCisJdmFsID0gZGlzcGNfcmVhZF9yZWcoZGlzcGNfcmVnX2F0dFtwbGFuZV0pOworCXZhbCA9IEZMRF9NT0QodmFsLCBjaGFubmVsLCBzaGlmdCwgc2hpZnQpOworCWRpc3BjX3dyaXRlX3JlZyhkaXNwY19yZWdfYXR0W3BsYW5lXSwgdmFsKTsKK30KKwordm9pZCBkaXNwY19zZXRfYnVyc3Rfc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCisJCWVudW0gb21hcF9idXJzdF9zaXplIGJ1cnN0X3NpemUpCit7CisJaW50IHNoaWZ0OworCXUzMiB2YWw7CisKKwllbmFibGVfY2xvY2tzKDEpOworCisJc3dpdGNoIChwbGFuZSkgeworCWNhc2UgT01BUF9EU1NfR0ZYOgorCQlzaGlmdCA9IDY7CisJCWJyZWFrOworCWNhc2UgT01BUF9EU1NfVklERU8xOgorCWNhc2UgT01BUF9EU1NfVklERU8yOgorCQlzaGlmdCA9IDE0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuOworCX0KKworCXZhbCA9IGRpc3BjX3JlYWRfcmVnKGRpc3BjX3JlZ19hdHRbcGxhbmVdKTsKKwl2YWwgPSBGTERfTU9EKHZhbCwgYnVyc3Rfc2l6ZSwgc2hpZnQrMSwgc2hpZnQpOworCWRpc3BjX3dyaXRlX3JlZyhkaXNwY19yZWdfYXR0W3BsYW5lXSwgdmFsKTsKKworCWVuYWJsZV9jbG9ja3MoMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9kaXNwY19zZXRfdmlkX2NvbG9yX2NvbnYoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBib29sIGVuYWJsZSkKK3sKKwl1MzIgdmFsOworCisJQlVHX09OKHBsYW5lID09IE9NQVBfRFNTX0dGWCk7CisKKwl2YWwgPSBkaXNwY19yZWFkX3JlZyhkaXNwY19yZWdfYXR0W3BsYW5lXSk7CisJdmFsID0gRkxEX01PRCh2YWwsIGVuYWJsZSwgOSwgOSk7CisJZGlzcGNfd3JpdGVfcmVnKGRpc3BjX3JlZ19hdHRbcGxhbmVdLCB2YWwpOworfQorCit2b2lkIGRpc3BjX2VuYWJsZV9yZXBsaWNhdGlvbihlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGJvb2wgZW5hYmxlKQoreworCWludCBiaXQ7CisKKwlpZiAocGxhbmUgPT0gT01BUF9EU1NfR0ZYKQorCQliaXQgPSA1OworCWVsc2UKKwkJYml0ID0gMTA7CisKKwllbmFibGVfY2xvY2tzKDEpOworCVJFR19GTERfTU9EKGRpc3BjX3JlZ19hdHRbcGxhbmVdLCBlbmFibGUsIGJpdCwgYml0KTsKKwllbmFibGVfY2xvY2tzKDApOworfQorCit2b2lkIGRpc3BjX3NldF9sY2Rfc2l6ZSh1MTYgd2lkdGgsIHUxNiBoZWlnaHQpCit7CisJdTMyIHZhbDsKKwlCVUdfT04oKHdpZHRoID4gKDEgPDwgMTEpKSB8fCAoaGVpZ2h0ID4gKDEgPDwgMTEpKSk7CisJdmFsID0gRkxEX1ZBTChoZWlnaHQgLSAxLCAyNiwgMTYpIHwgRkxEX1ZBTCh3aWR0aCAtIDEsIDEwLCAwKTsKKwllbmFibGVfY2xvY2tzKDEpOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19TSVpFX0xDRCwgdmFsKTsKKwllbmFibGVfY2xvY2tzKDApOworfQorCit2b2lkIGRpc3BjX3NldF9kaWdpdF9zaXplKHUxNiB3aWR0aCwgdTE2IGhlaWdodCkKK3sKKwl1MzIgdmFsOworCUJVR19PTigod2lkdGggPiAoMSA8PCAxMSkpIHx8IChoZWlnaHQgPiAoMSA8PCAxMSkpKTsKKwl2YWwgPSBGTERfVkFMKGhlaWdodCAtIDEsIDI2LCAxNikgfCBGTERfVkFMKHdpZHRoIC0gMSwgMTAsIDApOworCWVuYWJsZV9jbG9ja3MoMSk7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX1NJWkVfRElHLCB2YWwpOworCWVuYWJsZV9jbG9ja3MoMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BjX3JlYWRfcGxhbmVfZmlmb19zaXplcyh2b2lkKQoreworCWNvbnN0IHN0cnVjdCBkaXNwY19yZWcgZnN6X3JlZ1tdID0geyBESVNQQ19HRlhfRklGT19TSVpFX1NUQVRVUywKKwkJCQkgICAgICBESVNQQ19WSURfRklGT19TSVpFX1NUQVRVUygwKSwKKwkJCQkgICAgICBESVNQQ19WSURfRklGT19TSVpFX1NUQVRVUygxKSB9OworCXUzMiBzaXplOworCWludCBwbGFuZTsKKworCWVuYWJsZV9jbG9ja3MoMSk7CisKKwlmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBBUlJBWV9TSVpFKGRpc3BjLmZpZm9fc2l6ZSk7ICsrcGxhbmUpIHsKKwkJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQorCQkJc2l6ZSA9IEZMRF9HRVQoZGlzcGNfcmVhZF9yZWcoZnN6X3JlZ1twbGFuZV0pLCA4LCAwKTsKKwkJZWxzZSBpZiAoY3B1X2lzX29tYXAzNHh4KCkpCisJCQlzaXplID0gRkxEX0dFVChkaXNwY19yZWFkX3JlZyhmc3pfcmVnW3BsYW5lXSksIDEwLCAwKTsKKwkJZWxzZQorCQkJQlVHKCk7CisKKwkJZGlzcGMuZmlmb19zaXplW3BsYW5lXSA9IHNpemU7CisJfQorCisJZW5hYmxlX2Nsb2NrcygwKTsKK30KKwordTMyIGRpc3BjX2dldF9wbGFuZV9maWZvX3NpemUoZW51bSBvbWFwX3BsYW5lIHBsYW5lKQoreworCXJldHVybiBkaXNwYy5maWZvX3NpemVbcGxhbmVdOworfQorCit2b2lkIGRpc3BjX3NldHVwX3BsYW5lX2ZpZm8oZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1MzIgbG93LCB1MzIgaGlnaCkKK3sKKwljb25zdCBzdHJ1Y3QgZGlzcGNfcmVnIGZ0cnNfcmVnW10gPSB7IERJU1BDX0dGWF9GSUZPX1RIUkVTSE9MRCwKKwkJCQkgICAgICAgRElTUENfVklEX0ZJRk9fVEhSRVNIT0xEKDApLAorCQkJCSAgICAgICBESVNQQ19WSURfRklGT19USFJFU0hPTEQoMSkgfTsKKwllbmFibGVfY2xvY2tzKDEpOworCisJRFNTREJHKCJmaWZvKCVkKSBsb3cvaGlnaCBvbGQgJXUvJXUsIG5ldyAldS8ldVxuIiwKKwkJCXBsYW5lLAorCQkJUkVHX0dFVChmdHJzX3JlZ1twbGFuZV0sIDExLCAwKSwKKwkJCVJFR19HRVQoZnRyc19yZWdbcGxhbmVdLCAyNywgMTYpLAorCQkJbG93LCBoaWdoKTsKKworCWlmIChjcHVfaXNfb21hcDI0eHgoKSkKKwkJZGlzcGNfd3JpdGVfcmVnKGZ0cnNfcmVnW3BsYW5lXSwKKwkJCQlGTERfVkFMKGhpZ2gsIDI0LCAxNikgfCBGTERfVkFMKGxvdywgOCwgMCkpOworCWVsc2UKKwkJZGlzcGNfd3JpdGVfcmVnKGZ0cnNfcmVnW3BsYW5lXSwKKwkJCQlGTERfVkFMKGhpZ2gsIDI3LCAxNikgfCBGTERfVkFMKGxvdywgMTEsIDApKTsKKworCWVuYWJsZV9jbG9ja3MoMCk7Cit9CisKK3ZvaWQgZGlzcGNfZW5hYmxlX2ZpZm9tZXJnZShib29sIGVuYWJsZSkKK3sKKwllbmFibGVfY2xvY2tzKDEpOworCisJRFNTREJHKCJGSUZPIG1lcmdlICVzXG4iLCBlbmFibGUgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwlSRUdfRkxEX01PRChESVNQQ19DT05GSUcsIGVuYWJsZSA/IDEgOiAwLCAxNCwgMTQpOworCisJZW5hYmxlX2Nsb2NrcygwKTsKK30KKworc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9maXIoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgaGluYywgaW50IHZpbmMpCit7CisJdTMyIHZhbDsKKwljb25zdCBzdHJ1Y3QgZGlzcGNfcmVnIGZpcl9yZWdbXSA9IHsgRElTUENfVklEX0ZJUigwKSwKKwkJCQkgICAgICBESVNQQ19WSURfRklSKDEpIH07CisKKwlCVUdfT04ocGxhbmUgPT0gT01BUF9EU1NfR0ZYKTsKKworCWlmIChjcHVfaXNfb21hcDI0eHgoKSkKKwkJdmFsID0gRkxEX1ZBTCh2aW5jLCAyNywgMTYpIHwgRkxEX1ZBTChoaW5jLCAxMSwgMCk7CisJZWxzZQorCQl2YWwgPSBGTERfVkFMKHZpbmMsIDI4LCAxNikgfCBGTERfVkFMKGhpbmMsIDEyLCAwKTsKKwlkaXNwY193cml0ZV9yZWcoZmlyX3JlZ1twbGFuZS0xXSwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgX2Rpc3BjX3NldF92aWRfYWNjdTAoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgaGFjY3UsIGludCB2YWNjdSkKK3sKKwl1MzIgdmFsOworCWNvbnN0IHN0cnVjdCBkaXNwY19yZWcgYWMwX3JlZ1tdID0geyBESVNQQ19WSURfQUNDVTAoMCksCisJCQkJICAgICAgRElTUENfVklEX0FDQ1UwKDEpIH07CisKKwlCVUdfT04ocGxhbmUgPT0gT01BUF9EU1NfR0ZYKTsKKworCXZhbCA9IEZMRF9WQUwodmFjY3UsIDI1LCAxNikgfCBGTERfVkFMKGhhY2N1LCA5LCAwKTsKKwlkaXNwY193cml0ZV9yZWcoYWMwX3JlZ1twbGFuZS0xXSwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgX2Rpc3BjX3NldF92aWRfYWNjdTEoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgaGFjY3UsIGludCB2YWNjdSkKK3sKKwl1MzIgdmFsOworCWNvbnN0IHN0cnVjdCBkaXNwY19yZWcgYWMxX3JlZ1tdID0geyBESVNQQ19WSURfQUNDVTEoMCksCisJCQkJICAgICAgRElTUENfVklEX0FDQ1UxKDEpIH07CisKKwlCVUdfT04ocGxhbmUgPT0gT01BUF9EU1NfR0ZYKTsKKworCXZhbCA9IEZMRF9WQUwodmFjY3UsIDI1LCAxNikgfCBGTERfVkFMKGhhY2N1LCA5LCAwKTsKKwlkaXNwY193cml0ZV9yZWcoYWMxX3JlZ1twbGFuZS0xXSwgdmFsKTsKK30KKworCitzdGF0aWMgdm9pZCBfZGlzcGNfc2V0X3NjYWxpbmcoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAorCQl1MTYgb3JpZ193aWR0aCwgdTE2IG9yaWdfaGVpZ2h0LAorCQl1MTYgb3V0X3dpZHRoLCB1MTYgb3V0X2hlaWdodCwKKwkJYm9vbCBpbGFjZSwgYm9vbCBmaXZlX3RhcHMsCisJCWJvb2wgZmllbGRtb2RlKQoreworCWludCBmaXJfaGluYzsKKwlpbnQgZmlyX3ZpbmM7CisJaW50IGhzY2FsZXVwLCB2c2NhbGV1cDsKKwlpbnQgYWNjdTAgPSAwOworCWludCBhY2N1MSA9IDA7CisJdTMyIGw7CisKKwlCVUdfT04ocGxhbmUgPT0gT01BUF9EU1NfR0ZYKTsKKworCWhzY2FsZXVwID0gb3JpZ193aWR0aCA8PSBvdXRfd2lkdGg7CisJdnNjYWxldXAgPSBvcmlnX2hlaWdodCA8PSBvdXRfaGVpZ2h0OworCisJX2Rpc3BjX3NldF9zY2FsZV9jb2VmKHBsYW5lLCBoc2NhbGV1cCwgdnNjYWxldXAsIGZpdmVfdGFwcyk7CisKKwlpZiAoIW9yaWdfd2lkdGggfHwgb3JpZ193aWR0aCA9PSBvdXRfd2lkdGgpCisJCWZpcl9oaW5jID0gMDsKKwllbHNlCisJCWZpcl9oaW5jID0gMTAyNCAqIG9yaWdfd2lkdGggLyBvdXRfd2lkdGg7CisKKwlpZiAoIW9yaWdfaGVpZ2h0IHx8IG9yaWdfaGVpZ2h0ID09IG91dF9oZWlnaHQpCisJCWZpcl92aW5jID0gMDsKKwllbHNlCisJCWZpcl92aW5jID0gMTAyNCAqIG9yaWdfaGVpZ2h0IC8gb3V0X2hlaWdodDsKKworCV9kaXNwY19zZXRfZmlyKHBsYW5lLCBmaXJfaGluYywgZmlyX3ZpbmMpOworCisJbCA9IGRpc3BjX3JlYWRfcmVnKGRpc3BjX3JlZ19hdHRbcGxhbmVdKTsKKwlsICY9IH4oKDB4MGYgPDwgNSkgfCAoMHgzIDw8IDIxKSk7CisKKwlsIHw9IGZpcl9oaW5jID8gKDEgPDwgNSkgOiAwOworCWwgfD0gZmlyX3ZpbmMgPyAoMSA8PCA2KSA6IDA7CisKKwlsIHw9IGhzY2FsZXVwID8gMCA6ICgxIDw8IDcpOworCWwgfD0gdnNjYWxldXAgPyAwIDogKDEgPDwgOCk7CisKKwlsIHw9IGZpdmVfdGFwcyA/ICgxIDw8IDIxKSA6IDA7CisJbCB8PSBmaXZlX3RhcHMgPyAoMSA8PCAyMikgOiAwOworCisJZGlzcGNfd3JpdGVfcmVnKGRpc3BjX3JlZ19hdHRbcGxhbmVdLCBsKTsKKworCS8qCisJICogZmllbGQgMCA9IGV2ZW4gZmllbGQgPSBib3R0b20gZmllbGQKKwkgKiBmaWVsZCAxID0gb2RkIGZpZWxkID0gdG9wIGZpZWxkCisJICovCisJaWYgKGlsYWNlICYmICFmaWVsZG1vZGUpIHsKKwkJYWNjdTEgPSAwOworCQlhY2N1MCA9IChmaXJfdmluYyAvIDIpICYgMHgzZmY7CisJCWlmIChhY2N1MCA+PSAxMDI0LzIpIHsKKwkJCWFjY3UxID0gMTAyNC8yOworCQkJYWNjdTAgLT0gYWNjdTE7CisJCX0KKwl9CisKKwlfZGlzcGNfc2V0X3ZpZF9hY2N1MChwbGFuZSwgMCwgYWNjdTApOworCV9kaXNwY19zZXRfdmlkX2FjY3UxKHBsYW5lLCAwLCBhY2N1MSk7Cit9CisKK3N0YXRpYyB2b2lkIF9kaXNwY19zZXRfcm90YXRpb25fYXR0cnMoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1OCByb3RhdGlvbiwKKwkJYm9vbCBtaXJyb3JpbmcsIGVudW0gb21hcF9jb2xvcl9tb2RlIGNvbG9yX21vZGUpCit7CisJaWYgKGNvbG9yX21vZGUgPT0gT01BUF9EU1NfQ09MT1JfWVVWMiB8fAorCQkJY29sb3JfbW9kZSA9PSBPTUFQX0RTU19DT0xPUl9VWVZZKSB7CisJCWludCB2aWRyb3QgPSAwOworCisJCWlmIChtaXJyb3JpbmcpIHsKKwkJCXN3aXRjaCAocm90YXRpb24pIHsKKwkJCWNhc2UgT01BUF9EU1NfUk9UXzA6CisJCQkJdmlkcm90ID0gMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgT01BUF9EU1NfUk9UXzkwOgorCQkJCXZpZHJvdCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIE9NQVBfRFNTX1JPVF8xODA6CisJCQkJdmlkcm90ID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgT01BUF9EU1NfUk9UXzI3MDoKKwkJCQl2aWRyb3QgPSAzOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJc3dpdGNoIChyb3RhdGlvbikgeworCQkJY2FzZSBPTUFQX0RTU19ST1RfMDoKKwkJCQl2aWRyb3QgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSBPTUFQX0RTU19ST1RfOTA6CisJCQkJdmlkcm90ID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgT01BUF9EU1NfUk9UXzE4MDoKKwkJCQl2aWRyb3QgPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSBPTUFQX0RTU19ST1RfMjcwOgorCQkJCXZpZHJvdCA9IDM7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlSRUdfRkxEX01PRChkaXNwY19yZWdfYXR0W3BsYW5lXSwgdmlkcm90LCAxMywgMTIpOworCisJCWlmIChyb3RhdGlvbiA9PSBPTUFQX0RTU19ST1RfOTAgfHwgcm90YXRpb24gPT0gT01BUF9EU1NfUk9UXzI3MCkKKwkJCVJFR19GTERfTU9EKGRpc3BjX3JlZ19hdHRbcGxhbmVdLCAweDEsIDE4LCAxOCk7CisJCWVsc2UKKwkJCVJFR19GTERfTU9EKGRpc3BjX3JlZ19hdHRbcGxhbmVdLCAweDAsIDE4LCAxOCk7CisJfSBlbHNlIHsKKwkJUkVHX0ZMRF9NT0QoZGlzcGNfcmVnX2F0dFtwbGFuZV0sIDAsIDEzLCAxMik7CisJCVJFR19GTERfTU9EKGRpc3BjX3JlZ19hdHRbcGxhbmVdLCAwLCAxOCwgMTgpOworCX0KK30KKworc3RhdGljIGludCBjb2xvcl9tb2RlX3RvX2JwcChlbnVtIG9tYXBfY29sb3JfbW9kZSBjb2xvcl9tb2RlKQoreworCXN3aXRjaCAoY29sb3JfbW9kZSkgeworCWNhc2UgT01BUF9EU1NfQ09MT1JfQ0xVVDE6CisJCXJldHVybiAxOworCWNhc2UgT01BUF9EU1NfQ09MT1JfQ0xVVDI6CisJCXJldHVybiAyOworCWNhc2UgT01BUF9EU1NfQ09MT1JfQ0xVVDQ6CisJCXJldHVybiA0OworCWNhc2UgT01BUF9EU1NfQ09MT1JfQ0xVVDg6CisJCXJldHVybiA4OworCWNhc2UgT01BUF9EU1NfQ09MT1JfUkdCMTJVOgorCWNhc2UgT01BUF9EU1NfQ09MT1JfUkdCMTY6CisJY2FzZSBPTUFQX0RTU19DT0xPUl9BUkdCMTY6CisJY2FzZSBPTUFQX0RTU19DT0xPUl9ZVVYyOgorCWNhc2UgT01BUF9EU1NfQ09MT1JfVVlWWToKKwkJcmV0dXJuIDE2OworCWNhc2UgT01BUF9EU1NfQ09MT1JfUkdCMjRQOgorCQlyZXR1cm4gMjQ7CisJY2FzZSBPTUFQX0RTU19DT0xPUl9SR0IyNFU6CisJY2FzZSBPTUFQX0RTU19DT0xPUl9BUkdCMzI6CisJY2FzZSBPTUFQX0RTU19DT0xPUl9SR0JBMzI6CisJY2FzZSBPTUFQX0RTU19DT0xPUl9SR0JYMzI6CisJCXJldHVybiAzMjsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9CisKK3N0YXRpYyBzMzIgcGl4aW5jKGludCBwaXhlbHMsIHU4IHBzKQoreworCWlmIChwaXhlbHMgPT0gMSkKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAocGl4ZWxzID4gMSkKKwkJcmV0dXJuIDEgKyAocGl4ZWxzIC0gMSkgKiBwczsKKwllbHNlIGlmIChwaXhlbHMgPCAwKQorCQlyZXR1cm4gMSAtICgtcGl4ZWxzICsgMSkgKiBwczsKKwllbHNlCisJCUJVRygpOworfQorCitzdGF0aWMgdm9pZCBjYWxjX3ZyZmJfcm90YXRpb25fb2Zmc2V0KHU4IHJvdGF0aW9uLCBib29sIG1pcnJvciwKKwkJdTE2IHNjcmVlbl93aWR0aCwKKwkJdTE2IHdpZHRoLCB1MTYgaGVpZ2h0LAorCQllbnVtIG9tYXBfY29sb3JfbW9kZSBjb2xvcl9tb2RlLCBib29sIGZpZWxkbW9kZSwKKwkJdW5zaWduZWQgaW50IGZpZWxkX29mZnNldCwKKwkJdW5zaWduZWQgKm9mZnNldDAsIHVuc2lnbmVkICpvZmZzZXQxLAorCQlzMzIgKnJvd19pbmMsIHMzMiAqcGl4X2luYykKK3sKKwl1OCBwczsKKworCS8qIEZJWE1FIENMVVQgZm9ybWF0cyAqLworCXN3aXRjaCAoY29sb3JfbW9kZSkgeworCWNhc2UgT01BUF9EU1NfQ09MT1JfQ0xVVDE6CisJY2FzZSBPTUFQX0RTU19DT0xPUl9DTFVUMjoKKwljYXNlIE9NQVBfRFNTX0NPTE9SX0NMVVQ0OgorCWNhc2UgT01BUF9EU1NfQ09MT1JfQ0xVVDg6CisJCUJVRygpOworCQlyZXR1cm47CisJY2FzZSBPTUFQX0RTU19DT0xPUl9ZVVYyOgorCWNhc2UgT01BUF9EU1NfQ09MT1JfVVlWWToKKwkJcHMgPSA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcyA9IGNvbG9yX21vZGVfdG9fYnBwKGNvbG9yX21vZGUpIC8gODsKKwkJYnJlYWs7CisJfQorCisJRFNTREJHKCJjYWxjX3JvdCglZCk6IHNjcncgJWQsICVkeCVkXG4iLCByb3RhdGlvbiwgc2NyZWVuX3dpZHRoLAorCQkJd2lkdGgsIGhlaWdodCk7CisKKwkvKgorCSAqIGZpZWxkIDAgPSBldmVuIGZpZWxkID0gYm90dG9tIGZpZWxkCisJICogZmllbGQgMSA9IG9kZCBmaWVsZCA9IHRvcCBmaWVsZAorCSAqLworCXN3aXRjaCAocm90YXRpb24gKyBtaXJyb3IgKiA0KSB7CisJY2FzZSBPTUFQX0RTU19ST1RfMDoKKwljYXNlIE9NQVBfRFNTX1JPVF8xODA6CisJCS8qCisJCSAqIElmIHRoZSBwaXhlbCBmb3JtYXQgaXMgWVVWIG9yIFVZVlkgZGl2aWRlIHRoZSB3aWR0aAorCQkgKiBvZiB0aGUgaW1hZ2UgYnkgMiBmb3IgMCBhbmQgMTgwIGRlZ3JlZSByb3RhdGlvbi4KKwkJICovCisJCWlmIChjb2xvcl9tb2RlID09IE9NQVBfRFNTX0NPTE9SX1lVVjIgfHwKKwkJCWNvbG9yX21vZGUgPT0gT01BUF9EU1NfQ09MT1JfVVlWWSkKKwkJCXdpZHRoID0gd2lkdGggPj4gMTsKKwljYXNlIE9NQVBfRFNTX1JPVF85MDoKKwljYXNlIE9NQVBfRFNTX1JPVF8yNzA6CisJCSpvZmZzZXQxID0gMDsKKwkJaWYgKGZpZWxkX29mZnNldCkKKwkJCSpvZmZzZXQwID0gZmllbGRfb2Zmc2V0ICogc2NyZWVuX3dpZHRoICogcHM7CisJCWVsc2UKKwkJCSpvZmZzZXQwID0gMDsKKworCQkqcm93X2luYyA9IHBpeGluYygxICsgKHNjcmVlbl93aWR0aCAtIHdpZHRoKSArCisJCQkJKGZpZWxkbW9kZSA/IHNjcmVlbl93aWR0aCA6IDApLAorCQkJCXBzKTsKKwkJKnBpeF9pbmMgPSBwaXhpbmMoMSwgcHMpOworCQlicmVhazsKKworCWNhc2UgT01BUF9EU1NfUk9UXzAgKyA0OgorCWNhc2UgT01BUF9EU1NfUk9UXzE4MCArIDQ6CisJCS8qIElmIHRoZSBwaXhlbCBmb3JtYXQgaXMgWVVWIG9yIFVZVlkgZGl2aWRlIHRoZSB3aWR0aAorCQkgKiBvZiB0aGUgaW1hZ2UgYnkgMiAgZm9yIDAgZGVncmVlIGFuZCAxODAgZGVncmVlCisJCSAqLworCQlpZiAoY29sb3JfbW9kZSA9PSBPTUFQX0RTU19DT0xPUl9ZVVYyIHx8CisJCQljb2xvcl9tb2RlID09IE9NQVBfRFNTX0NPTE9SX1VZVlkpCisJCQl3aWR0aCA9IHdpZHRoID4+IDE7CisJY2FzZSBPTUFQX0RTU19ST1RfOTAgKyA0OgorCWNhc2UgT01BUF9EU1NfUk9UXzI3MCArIDQ6CisJCSpvZmZzZXQxID0gMDsKKwkJaWYgKGZpZWxkX29mZnNldCkKKwkJCSpvZmZzZXQwID0gZmllbGRfb2Zmc2V0ICogc2NyZWVuX3dpZHRoICogcHM7CisJCWVsc2UKKwkJCSpvZmZzZXQwID0gMDsKKwkJKnJvd19pbmMgPSBwaXhpbmMoMSAtIChzY3JlZW5fd2lkdGggKyB3aWR0aCkgLQorCQkJCShmaWVsZG1vZGUgPyBzY3JlZW5fd2lkdGggOiAwKSwKKwkJCQlwcyk7CisJCSpwaXhfaW5jID0gcGl4aW5jKDEsIHBzKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNhbGNfZG1hX3JvdGF0aW9uX29mZnNldCh1OCByb3RhdGlvbiwgYm9vbCBtaXJyb3IsCisJCXUxNiBzY3JlZW5fd2lkdGgsCisJCXUxNiB3aWR0aCwgdTE2IGhlaWdodCwKKwkJZW51bSBvbWFwX2NvbG9yX21vZGUgY29sb3JfbW9kZSwgYm9vbCBmaWVsZG1vZGUsCisJCXVuc2lnbmVkIGludCBmaWVsZF9vZmZzZXQsCisJCXVuc2lnbmVkICpvZmZzZXQwLCB1bnNpZ25lZCAqb2Zmc2V0MSwKKwkJczMyICpyb3dfaW5jLCBzMzIgKnBpeF9pbmMpCit7CisJdTggcHM7CisJdTE2IGZidywgZmJoOworCisJLyogRklYTUUgQ0xVVCBmb3JtYXRzICovCisJc3dpdGNoIChjb2xvcl9tb2RlKSB7CisJY2FzZSBPTUFQX0RTU19DT0xPUl9DTFVUMToKKwljYXNlIE9NQVBfRFNTX0NPTE9SX0NMVVQyOgorCWNhc2UgT01BUF9EU1NfQ09MT1JfQ0xVVDQ6CisJY2FzZSBPTUFQX0RTU19DT0xPUl9DTFVUODoKKwkJQlVHKCk7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlwcyA9IGNvbG9yX21vZGVfdG9fYnBwKGNvbG9yX21vZGUpIC8gODsKKwkJYnJlYWs7CisJfQorCisJRFNTREJHKCJjYWxjX3JvdCglZCk6IHNjcncgJWQsICVkeCVkXG4iLCByb3RhdGlvbiwgc2NyZWVuX3dpZHRoLAorCQkJd2lkdGgsIGhlaWdodCk7CisKKwkvKiB3aWR0aCAmIGhlaWdodCBhcmUgb3ZlcmxheSBzaXplcywgY29udmVydCB0byBmYiBzaXplcyAqLworCisJaWYgKHJvdGF0aW9uID09IE9NQVBfRFNTX1JPVF8wIHx8IHJvdGF0aW9uID09IE9NQVBfRFNTX1JPVF8xODApIHsKKwkJZmJ3ID0gd2lkdGg7CisJCWZiaCA9IGhlaWdodDsKKwl9IGVsc2UgeworCQlmYncgPSBoZWlnaHQ7CisJCWZiaCA9IHdpZHRoOworCX0KKworCS8qCisJICogZmllbGQgMCA9IGV2ZW4gZmllbGQgPSBib3R0b20gZmllbGQKKwkgKiBmaWVsZCAxID0gb2RkIGZpZWxkID0gdG9wIGZpZWxkCisJICovCisJc3dpdGNoIChyb3RhdGlvbiArIG1pcnJvciAqIDQpIHsKKwljYXNlIE9NQVBfRFNTX1JPVF8wOgorCQkqb2Zmc2V0MSA9IDA7CisJCWlmIChmaWVsZF9vZmZzZXQpCisJCQkqb2Zmc2V0MCA9ICpvZmZzZXQxICsgZmllbGRfb2Zmc2V0ICogc2NyZWVuX3dpZHRoICogcHM7CisJCWVsc2UKKwkJCSpvZmZzZXQwID0gKm9mZnNldDE7CisJCSpyb3dfaW5jID0gcGl4aW5jKDEgKyAoc2NyZWVuX3dpZHRoIC0gZmJ3KSArCisJCQkJKGZpZWxkbW9kZSA/IHNjcmVlbl93aWR0aCA6IDApLAorCQkJCXBzKTsKKwkJKnBpeF9pbmMgPSBwaXhpbmMoMSwgcHMpOworCQlicmVhazsKKwljYXNlIE9NQVBfRFNTX1JPVF85MDoKKwkJKm9mZnNldDEgPSBzY3JlZW5fd2lkdGggKiAoZmJoIC0gMSkgKiBwczsKKwkJaWYgKGZpZWxkX29mZnNldCkKKwkJCSpvZmZzZXQwID0gKm9mZnNldDEgKyBmaWVsZF9vZmZzZXQgKiBwczsKKwkJZWxzZQorCQkJKm9mZnNldDAgPSAqb2Zmc2V0MTsKKwkJKnJvd19pbmMgPSBwaXhpbmMoc2NyZWVuX3dpZHRoICogKGZiaCAtIDEpICsgMSArCisJCQkJKGZpZWxkbW9kZSA/IDEgOiAwKSwgcHMpOworCQkqcGl4X2luYyA9IHBpeGluYygtc2NyZWVuX3dpZHRoLCBwcyk7CisJCWJyZWFrOworCWNhc2UgT01BUF9EU1NfUk9UXzE4MDoKKwkJKm9mZnNldDEgPSAoc2NyZWVuX3dpZHRoICogKGZiaCAtIDEpICsgZmJ3IC0gMSkgKiBwczsKKwkJaWYgKGZpZWxkX29mZnNldCkKKwkJCSpvZmZzZXQwID0gKm9mZnNldDEgLSBmaWVsZF9vZmZzZXQgKiBzY3JlZW5fd2lkdGggKiBwczsKKwkJZWxzZQorCQkJKm9mZnNldDAgPSAqb2Zmc2V0MTsKKwkJKnJvd19pbmMgPSBwaXhpbmMoLTEgLQorCQkJCShzY3JlZW5fd2lkdGggLSBmYncpIC0KKwkJCQkoZmllbGRtb2RlID8gc2NyZWVuX3dpZHRoIDogMCksCisJCQkJcHMpOworCQkqcGl4X2luYyA9IHBpeGluYygtMSwgcHMpOworCQlicmVhazsKKwljYXNlIE9NQVBfRFNTX1JPVF8yNzA6CisJCSpvZmZzZXQxID0gKGZidyAtIDEpICogcHM7CisJCWlmIChmaWVsZF9vZmZzZXQpCisJCQkqb2Zmc2V0MCA9ICpvZmZzZXQxIC0gZmllbGRfb2Zmc2V0ICogcHM7CisJCWVsc2UKKwkJCSpvZmZzZXQwID0gKm9mZnNldDE7CisJCSpyb3dfaW5jID0gcGl4aW5jKC1zY3JlZW5fd2lkdGggKiAoZmJoIC0gMSkgLSAxIC0KKwkJCQkoZmllbGRtb2RlID8gMSA6IDApLCBwcyk7CisJCSpwaXhfaW5jID0gcGl4aW5jKHNjcmVlbl93aWR0aCwgcHMpOworCQlicmVhazsKKworCS8qIG1pcnJvcmluZyAqLworCWNhc2UgT01BUF9EU1NfUk9UXzAgKyA0OgorCQkqb2Zmc2V0MSA9IChmYncgLSAxKSAqIHBzOworCQlpZiAoZmllbGRfb2Zmc2V0KQorCQkJKm9mZnNldDAgPSAqb2Zmc2V0MSArIGZpZWxkX29mZnNldCAqIHNjcmVlbl93aWR0aCAqIHBzOworCQllbHNlCisJCQkqb2Zmc2V0MCA9ICpvZmZzZXQxOworCQkqcm93X2luYyA9IHBpeGluYyhzY3JlZW5fd2lkdGggKiAyIC0gMSArCisJCQkJKGZpZWxkbW9kZSA/IHNjcmVlbl93aWR0aCA6IDApLAorCQkJCXBzKTsKKwkJKnBpeF9pbmMgPSBwaXhpbmMoLTEsIHBzKTsKKwkJYnJlYWs7CisKKwljYXNlIE9NQVBfRFNTX1JPVF85MCArIDQ6CisJCSpvZmZzZXQxID0gMDsKKwkJaWYgKGZpZWxkX29mZnNldCkKKwkJCSpvZmZzZXQwID0gKm9mZnNldDEgKyBmaWVsZF9vZmZzZXQgKiBwczsKKwkJZWxzZQorCQkJKm9mZnNldDAgPSAqb2Zmc2V0MTsKKwkJKnJvd19pbmMgPSBwaXhpbmMoLXNjcmVlbl93aWR0aCAqIChmYmggLSAxKSArIDEgKworCQkJCShmaWVsZG1vZGUgPyAxIDogMCksCisJCQkJcHMpOworCQkqcGl4X2luYyA9IHBpeGluYyhzY3JlZW5fd2lkdGgsIHBzKTsKKwkJYnJlYWs7CisKKwljYXNlIE9NQVBfRFNTX1JPVF8xODAgKyA0OgorCQkqb2Zmc2V0MSA9IHNjcmVlbl93aWR0aCAqIChmYmggLSAxKSAqIHBzOworCQlpZiAoZmllbGRfb2Zmc2V0KQorCQkJKm9mZnNldDAgPSAqb2Zmc2V0MSAtIGZpZWxkX29mZnNldCAqIHNjcmVlbl93aWR0aCAqIHBzOworCQllbHNlCisJCQkqb2Zmc2V0MCA9ICpvZmZzZXQxOworCQkqcm93X2luYyA9IHBpeGluYygxIC0gc2NyZWVuX3dpZHRoICogMiAtCisJCQkJKGZpZWxkbW9kZSA/IHNjcmVlbl93aWR0aCA6IDApLAorCQkJCXBzKTsKKwkJKnBpeF9pbmMgPSBwaXhpbmMoMSwgcHMpOworCQlicmVhazsKKworCWNhc2UgT01BUF9EU1NfUk9UXzI3MCArIDQ6CisJCSpvZmZzZXQxID0gKHNjcmVlbl93aWR0aCAqIChmYmggLSAxKSArIGZidyAtIDEpICogcHM7CisJCWlmIChmaWVsZF9vZmZzZXQpCisJCQkqb2Zmc2V0MCA9ICpvZmZzZXQxIC0gZmllbGRfb2Zmc2V0ICogcHM7CisJCWVsc2UKKwkJCSpvZmZzZXQwID0gKm9mZnNldDE7CisJCSpyb3dfaW5jID0gcGl4aW5jKHNjcmVlbl93aWR0aCAqIChmYmggLSAxKSAtIDEgLQorCQkJCShmaWVsZG1vZGUgPyAxIDogMCksCisJCQkJcHMpOworCQkqcGl4X2luYyA9IHBpeGluYygtc2NyZWVuX3dpZHRoLCBwcyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjYWxjX2ZjbGtfZml2ZV90YXBzKHUxNiB3aWR0aCwgdTE2IGhlaWdodCwKKwkJdTE2IG91dF93aWR0aCwgdTE2IG91dF9oZWlnaHQsIGVudW0gb21hcF9jb2xvcl9tb2RlIGNvbG9yX21vZGUpCit7CisJdTMyIGZjbGsgPSAwOworCS8qIEZJWE1FIHZlbmMgcGNsaz8gKi8KKwl1NjQgdG1wLCBwY2xrID0gZGlzcGNfcGNsa19yYXRlKCk7CisKKwlpZiAoaGVpZ2h0ID4gb3V0X2hlaWdodCkgeworCQkvKiBGSVhNRSBnZXQgcmVhbCBkaXNwbGF5IFBQTCAqLworCQl1bnNpZ25lZCBpbnQgcHBsID0gODAwOworCisJCXRtcCA9IHBjbGsgKiBoZWlnaHQgKiBvdXRfd2lkdGg7CisJCWRvX2Rpdih0bXAsIDIgKiBvdXRfaGVpZ2h0ICogcHBsKTsKKwkJZmNsayA9IHRtcDsKKworCQlpZiAoaGVpZ2h0ID4gMiAqIG91dF9oZWlnaHQgJiYgcHBsICE9IG91dF93aWR0aCkgeworCQkJdG1wID0gcGNsayAqIChoZWlnaHQgLSAyICogb3V0X2hlaWdodCkgKiBvdXRfd2lkdGg7CisJCQlkb19kaXYodG1wLCAyICogb3V0X2hlaWdodCAqIChwcGwgLSBvdXRfd2lkdGgpKTsKKwkJCWZjbGsgPSBtYXgoZmNsaywgKHUzMikgdG1wKTsKKwkJfQorCX0KKworCWlmICh3aWR0aCA+IG91dF93aWR0aCkgeworCQl0bXAgPSBwY2xrICogd2lkdGg7CisJCWRvX2Rpdih0bXAsIG91dF93aWR0aCk7CisJCWZjbGsgPSBtYXgoZmNsaywgKHUzMikgdG1wKTsKKworCQlpZiAoY29sb3JfbW9kZSA9PSBPTUFQX0RTU19DT0xPUl9SR0IyNFUpCisJCQlmY2xrIDw8PSAxOworCX0KKworCXJldHVybiBmY2xrOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjYWxjX2ZjbGsodTE2IHdpZHRoLCB1MTYgaGVpZ2h0LAorCQl1MTYgb3V0X3dpZHRoLCB1MTYgb3V0X2hlaWdodCkKK3sKKwl1bnNpZ25lZCBpbnQgaGYsIHZmOworCisJLyoKKwkgKiBGSVhNRSBob3cgdG8gZGV0ZXJtaW5lIHRoZSAnQScgZmFjdG9yCisJICogZm9yIHRoZSBubyBkb3duc2NhbGluZyBjYXNlID8KKwkgKi8KKworCWlmICh3aWR0aCA+IDMgKiBvdXRfd2lkdGgpCisJCWhmID0gNDsKKwllbHNlIGlmICh3aWR0aCA+IDIgKiBvdXRfd2lkdGgpCisJCWhmID0gMzsKKwllbHNlIGlmICh3aWR0aCA+IG91dF93aWR0aCkKKwkJaGYgPSAyOworCWVsc2UKKwkJaGYgPSAxOworCisJaWYgKGhlaWdodCA+IG91dF9oZWlnaHQpCisJCXZmID0gMjsKKwllbHNlCisJCXZmID0gMTsKKworCS8qIEZJWE1FIHZlbmMgcGNsaz8gKi8KKwlyZXR1cm4gZGlzcGNfcGNsa19yYXRlKCkgKiB2ZiAqIGhmOworfQorCit2b2lkIGRpc3BjX3NldF9jaGFubmVsX291dChlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWxfb3V0KQoreworCWVuYWJsZV9jbG9ja3MoMSk7CisJX2Rpc3BjX3NldF9jaGFubmVsX291dChwbGFuZSwgY2hhbm5lbF9vdXQpOworCWVuYWJsZV9jbG9ja3MoMCk7Cit9CisKK3N0YXRpYyBpbnQgX2Rpc3BjX3NldHVwX3BsYW5lKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKKwkJdTMyIHBhZGRyLCB1MTYgc2NyZWVuX3dpZHRoLAorCQl1MTYgcG9zX3gsIHUxNiBwb3NfeSwKKwkJdTE2IHdpZHRoLCB1MTYgaGVpZ2h0LAorCQl1MTYgb3V0X3dpZHRoLCB1MTYgb3V0X2hlaWdodCwKKwkJZW51bSBvbWFwX2NvbG9yX21vZGUgY29sb3JfbW9kZSwKKwkJYm9vbCBpbGFjZSwKKwkJZW51bSBvbWFwX2Rzc19yb3RhdGlvbl90eXBlIHJvdGF0aW9uX3R5cGUsCisJCXU4IHJvdGF0aW9uLCBpbnQgbWlycm9yLAorCQl1OCBnbG9iYWxfYWxwaGEpCit7CisJY29uc3QgaW50IG1heGRvd25zY2FsZSA9IGNwdV9pc19vbWFwMzR4eCgpID8gNCA6IDI7CisJYm9vbCBmaXZlX3RhcHMgPSAwOworCWJvb2wgZmllbGRtb2RlID0gMDsKKwlpbnQgY2NvbnYgPSAwOworCXVuc2lnbmVkIG9mZnNldDAsIG9mZnNldDE7CisJczMyIHJvd19pbmM7CisJczMyIHBpeF9pbmM7CisJdTE2IGZyYW1lX2hlaWdodCA9IGhlaWdodDsKKwl1bnNpZ25lZCBpbnQgZmllbGRfb2Zmc2V0ID0gMDsKKworCWlmIChwYWRkciA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChpbGFjZSAmJiBoZWlnaHQgPT0gb3V0X2hlaWdodCkKKwkJZmllbGRtb2RlID0gMTsKKworCWlmIChpbGFjZSkgeworCQlpZiAoZmllbGRtb2RlKQorCQkJaGVpZ2h0IC89IDI7CisJCXBvc195IC89IDI7CisJCW91dF9oZWlnaHQgLz0gMjsKKworCQlEU1NEQkcoImFkanVzdGluZyBmb3IgaWxhY2U6IGhlaWdodCAlZCwgcG9zX3kgJWQsICIKKwkJCQkib3V0X2hlaWdodCAlZFxuIiwKKwkJCQloZWlnaHQsIHBvc195LCBvdXRfaGVpZ2h0KTsKKwl9CisKKwlpZiAocGxhbmUgPT0gT01BUF9EU1NfR0ZYKSB7CisJCWlmICh3aWR0aCAhPSBvdXRfd2lkdGggfHwgaGVpZ2h0ICE9IG91dF9oZWlnaHQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzd2l0Y2ggKGNvbG9yX21vZGUpIHsKKwkJY2FzZSBPTUFQX0RTU19DT0xPUl9BUkdCMTY6CisJCWNhc2UgT01BUF9EU1NfQ09MT1JfQVJHQjMyOgorCQljYXNlIE9NQVBfRFNTX0NPTE9SX1JHQkEzMjoKKwkJY2FzZSBPTUFQX0RTU19DT0xPUl9SR0JYMzI6CisJCQlpZiAoY3B1X2lzX29tYXAyNHh4KCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBPTUFQX0RTU19DT0xPUl9SR0IxMlU6CisJCWNhc2UgT01BUF9EU1NfQ09MT1JfUkdCMTY6CisJCWNhc2UgT01BUF9EU1NfQ09MT1JfUkdCMjRQOgorCQljYXNlIE9NQVBfRFNTX0NPTE9SX1JHQjI0VToKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHZpZGVvIHBsYW5lICovCisKKwkJdW5zaWduZWQgbG9uZyBmY2xrID0gMDsKKworCQlpZiAob3V0X3dpZHRoIDwgd2lkdGggLyBtYXhkb3duc2NhbGUgfHwKKwkJICAgb3V0X3dpZHRoID4gd2lkdGggKiA4KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKG91dF9oZWlnaHQgPCBoZWlnaHQgLyBtYXhkb3duc2NhbGUgfHwKKwkJICAgb3V0X2hlaWdodCA+IGhlaWdodCAqIDgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzd2l0Y2ggKGNvbG9yX21vZGUpIHsKKwkJY2FzZSBPTUFQX0RTU19DT0xPUl9SR0JYMzI6CisJCWNhc2UgT01BUF9EU1NfQ09MT1JfUkdCMTJVOgorCQkJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgT01BUF9EU1NfQ09MT1JfUkdCMTY6CisJCWNhc2UgT01BUF9EU1NfQ09MT1JfUkdCMjRQOgorCQljYXNlIE9NQVBfRFNTX0NPTE9SX1JHQjI0VToKKwkJCWJyZWFrOworCisJCWNhc2UgT01BUF9EU1NfQ09MT1JfQVJHQjE2OgorCQljYXNlIE9NQVBfRFNTX0NPTE9SX0FSR0IzMjoKKwkJY2FzZSBPTUFQX0RTU19DT0xPUl9SR0JBMzI6CisJCQlpZiAoY3B1X2lzX29tYXAyNHh4KCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAocGxhbmUgPT0gT01BUF9EU1NfVklERU8xKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisKKwkJY2FzZSBPTUFQX0RTU19DT0xPUl9ZVVYyOgorCQljYXNlIE9NQVBfRFNTX0NPTE9SX1VZVlk6CisJCQljY29udiA9IDE7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBNdXN0IHVzZSA1LXRhcCBmaWx0ZXI/ICovCisJCWZpdmVfdGFwcyA9IGhlaWdodCA+IG91dF9oZWlnaHQgKiAyOworCisJCWlmICghZml2ZV90YXBzKSB7CisJCQlmY2xrID0gY2FsY19mY2xrKHdpZHRoLCBoZWlnaHQsCisJCQkJCW91dF93aWR0aCwgb3V0X2hlaWdodCk7CisKKwkJCS8qIFRyeSA1LXRhcCBmaWx0ZXIgaWYgMy10YXAgZmNsayBpcyB0b28gaGlnaCAqLworCQkJaWYgKGNwdV9pc19vbWFwMzR4eCgpICYmIGhlaWdodCA+IG91dF9oZWlnaHQgJiYKKwkJCQkJZmNsayA+IGRpc3BjX2ZjbGtfcmF0ZSgpKQorCQkJCWZpdmVfdGFwcyA9IHRydWU7CisJCX0KKworCQlpZiAod2lkdGggPiAoMjA0OCA+PiBmaXZlX3RhcHMpKSB7CisJCQlEU1NFUlIoImZhaWxlZCB0byBzZXQgdXAgc2NhbGluZywgZmNsayB0b28gbG93XG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGZpdmVfdGFwcykKKwkJCWZjbGsgPSBjYWxjX2ZjbGtfZml2ZV90YXBzKHdpZHRoLCBoZWlnaHQsCisJCQkJCW91dF93aWR0aCwgb3V0X2hlaWdodCwgY29sb3JfbW9kZSk7CisKKwkJRFNTREJHKCJyZXF1aXJlZCBmY2xrIHJhdGUgPSAlbHUgSHpcbiIsIGZjbGspOworCQlEU1NEQkcoImN1cnJlbnQgZmNsayByYXRlID0gJWx1IEh6XG4iLCBkaXNwY19mY2xrX3JhdGUoKSk7CisKKwkJaWYgKGZjbGsgPiBkaXNwY19mY2xrX3JhdGUoKSkgeworCQkJRFNTRVJSKCJmYWlsZWQgdG8gc2V0IHVwIHNjYWxpbmcsICIKKwkJCQkJInJlcXVpcmVkIGZjbGsgcmF0ZSA9ICVsdSBIeiwgIgorCQkJCQkiY3VycmVudCBmY2xrIHJhdGUgPSAlbHUgSHpcbiIsCisJCQkJCWZjbGssIGRpc3BjX2ZjbGtfcmF0ZSgpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJaWYgKGlsYWNlICYmICFmaWVsZG1vZGUpIHsKKwkJLyoKKwkJICogd2hlbiBkb3duc2NhbGluZyB0aGUgYm90dG9tIGZpZWxkIG1heSBoYXZlIHRvIHN0YXJ0IHNldmVyYWwKKwkJICogc291cmNlIGxpbmVzIGJlbG93IHRoZSB0b3AgZmllbGQuIFVuZm9ydHVuYXRlbHkgQUNDVUkKKwkJICogcmVnaXN0ZXJzIHdpbGwgb25seSBob2xkIHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgdGhlIG9mZnNldAorCQkgKiBzbyB0aGUgaW50ZWdlciBwYXJ0IG11c3QgYmUgYWRkZWQgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUKKwkJICogYm90dG9tIGZpZWxkLgorCQkgKi8KKwkJaWYgKCFoZWlnaHQgfHwgaGVpZ2h0ID09IG91dF9oZWlnaHQpCisJCQlmaWVsZF9vZmZzZXQgPSAwOworCQllbHNlCisJCQlmaWVsZF9vZmZzZXQgPSBoZWlnaHQgLyBvdXRfaGVpZ2h0IC8gMjsKKwl9CisKKwkvKiBGaWVsZHMgYXJlIGluZGVwZW5kZW50IGJ1dCBpbnRlcmxlYXZlZCBpbiBtZW1vcnkuICovCisJaWYgKGZpZWxkbW9kZSkKKwkJZmllbGRfb2Zmc2V0ID0gMTsKKworCWlmIChyb3RhdGlvbl90eXBlID09IE9NQVBfRFNTX1JPVF9ETUEpCisJCWNhbGNfZG1hX3JvdGF0aW9uX29mZnNldChyb3RhdGlvbiwgbWlycm9yLAorCQkJCXNjcmVlbl93aWR0aCwgd2lkdGgsIGZyYW1lX2hlaWdodCwgY29sb3JfbW9kZSwKKwkJCQlmaWVsZG1vZGUsIGZpZWxkX29mZnNldCwKKwkJCQkmb2Zmc2V0MCwgJm9mZnNldDEsICZyb3dfaW5jLCAmcGl4X2luYyk7CisJZWxzZQorCQljYWxjX3ZyZmJfcm90YXRpb25fb2Zmc2V0KHJvdGF0aW9uLCBtaXJyb3IsCisJCQkJc2NyZWVuX3dpZHRoLCB3aWR0aCwgZnJhbWVfaGVpZ2h0LCBjb2xvcl9tb2RlLAorCQkJCWZpZWxkbW9kZSwgZmllbGRfb2Zmc2V0LAorCQkJCSZvZmZzZXQwLCAmb2Zmc2V0MSwgJnJvd19pbmMsICZwaXhfaW5jKTsKKworCURTU0RCRygib2Zmc2V0MCAldSwgb2Zmc2V0MSAldSwgcm93X2luYyAlZCwgcGl4X2luYyAlZFxuIiwKKwkJCW9mZnNldDAsIG9mZnNldDEsIHJvd19pbmMsIHBpeF9pbmMpOworCisJX2Rpc3BjX3NldF9jb2xvcl9tb2RlKHBsYW5lLCBjb2xvcl9tb2RlKTsKKworCV9kaXNwY19zZXRfcGxhbmVfYmEwKHBsYW5lLCBwYWRkciArIG9mZnNldDApOworCV9kaXNwY19zZXRfcGxhbmVfYmExKHBsYW5lLCBwYWRkciArIG9mZnNldDEpOworCisJX2Rpc3BjX3NldF9yb3dfaW5jKHBsYW5lLCByb3dfaW5jKTsKKwlfZGlzcGNfc2V0X3BpeF9pbmMocGxhbmUsIHBpeF9pbmMpOworCisJRFNTREJHKCIlZCwlZCAlZHglZCAtPiAlZHglZFxuIiwgcG9zX3gsIHBvc195LCB3aWR0aCwgaGVpZ2h0LAorCQkJb3V0X3dpZHRoLCBvdXRfaGVpZ2h0KTsKKworCV9kaXNwY19zZXRfcGxhbmVfcG9zKHBsYW5lLCBwb3NfeCwgcG9zX3kpOworCisJX2Rpc3BjX3NldF9waWNfc2l6ZShwbGFuZSwgd2lkdGgsIGhlaWdodCk7CisKKwlpZiAocGxhbmUgIT0gT01BUF9EU1NfR0ZYKSB7CisJCV9kaXNwY19zZXRfc2NhbGluZyhwbGFuZSwgd2lkdGgsIGhlaWdodCwKKwkJCQkgICBvdXRfd2lkdGgsIG91dF9oZWlnaHQsCisJCQkJICAgaWxhY2UsIGZpdmVfdGFwcywgZmllbGRtb2RlKTsKKwkJX2Rpc3BjX3NldF92aWRfc2l6ZShwbGFuZSwgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0KTsKKwkJX2Rpc3BjX3NldF92aWRfY29sb3JfY29udihwbGFuZSwgY2NvbnYpOworCX0KKworCV9kaXNwY19zZXRfcm90YXRpb25fYXR0cnMocGxhbmUsIHJvdGF0aW9uLCBtaXJyb3IsIGNvbG9yX21vZGUpOworCisJaWYgKHBsYW5lICE9IE9NQVBfRFNTX1ZJREVPMSkKKwkJX2Rpc3BjX3NldHVwX2dsb2JhbF9hbHBoYShwbGFuZSwgZ2xvYmFsX2FscGhhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfZGlzcGNfZW5hYmxlX3BsYW5lKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgYm9vbCBlbmFibGUpCit7CisJUkVHX0ZMRF9NT0QoZGlzcGNfcmVnX2F0dFtwbGFuZV0sIGVuYWJsZSA/IDEgOiAwLCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgZGlzcGNfZGlzYWJsZV9pc3Iodm9pZCAqZGF0YSwgdTMyIG1hc2spCit7CisJc3RydWN0IGNvbXBsZXRpb24gKmNvbXBsID0gZGF0YTsKKwljb21wbGV0ZShjb21wbCk7Cit9CisKK3N0YXRpYyB2b2lkIF9lbmFibGVfbGNkX291dChib29sIGVuYWJsZSkKK3sKKwlSRUdfRkxEX01PRChESVNQQ19DT05UUk9MLCBlbmFibGUgPyAxIDogMCwgMCwgMCk7Cit9CisKK3ZvaWQgZGlzcGNfZW5hYmxlX2xjZF9vdXQoYm9vbCBlbmFibGUpCit7CisJc3RydWN0IGNvbXBsZXRpb24gZnJhbWVfZG9uZV9jb21wbGV0aW9uOworCWJvb2wgaXNfb247CisJaW50IHI7CisKKwllbmFibGVfY2xvY2tzKDEpOworCisJLyogV2hlbiB3ZSBkaXNhYmxlIExDRCBvdXRwdXQsIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBmcmFtZSBpcyBkb25lLgorCSAqIE90aGVyd2lzZSB0aGUgRFNTIGlzIHN0aWxsIHdvcmtpbmcsIGFuZCB0dXJuaW5nIG9mZiB0aGUgY2xvY2tzCisJICogcHJldmVudHMgRFNTIGZyb20gZ29pbmcgdG8gT0ZGIG1vZGUgKi8KKwlpc19vbiA9IFJFR19HRVQoRElTUENfQ09OVFJPTCwgMCwgMCk7CisKKwlpZiAoIWVuYWJsZSAmJiBpc19vbikgeworCQlpbml0X2NvbXBsZXRpb24oJmZyYW1lX2RvbmVfY29tcGxldGlvbik7CisKKwkJciA9IG9tYXBfZGlzcGNfcmVnaXN0ZXJfaXNyKGRpc3BjX2Rpc2FibGVfaXNyLAorCQkJCSZmcmFtZV9kb25lX2NvbXBsZXRpb24sCisJCQkJRElTUENfSVJRX0ZSQU1FRE9ORSk7CisKKwkJaWYgKHIpCisJCQlEU1NFUlIoImZhaWxlZCB0byByZWdpc3RlciBGUkFNRURPTkUgaXNyXG4iKTsKKwl9CisKKwlfZW5hYmxlX2xjZF9vdXQoZW5hYmxlKTsKKworCWlmICghZW5hYmxlICYmIGlzX29uKSB7CisJCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZmcmFtZV9kb25lX2NvbXBsZXRpb24sCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoMTAwKSkpCisJCQlEU1NFUlIoInRpbWVvdXQgd2FpdGluZyBmb3IgRlJBTUUgRE9ORVxuIik7CisKKwkJciA9IG9tYXBfZGlzcGNfdW5yZWdpc3Rlcl9pc3IoZGlzcGNfZGlzYWJsZV9pc3IsCisJCQkJJmZyYW1lX2RvbmVfY29tcGxldGlvbiwKKwkJCQlESVNQQ19JUlFfRlJBTUVET05FKTsKKworCQlpZiAocikKKwkJCURTU0VSUigiZmFpbGVkIHRvIHVucmVnaXN0ZXIgRlJBTUVET05FIGlzclxuIik7CisJfQorCisJZW5hYmxlX2Nsb2NrcygwKTsKK30KKworc3RhdGljIHZvaWQgX2VuYWJsZV9kaWdpdF9vdXQoYm9vbCBlbmFibGUpCit7CisJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgZW5hYmxlID8gMSA6IDAsIDEsIDEpOworfQorCit2b2lkIGRpc3BjX2VuYWJsZV9kaWdpdF9vdXQoYm9vbCBlbmFibGUpCit7CisJc3RydWN0IGNvbXBsZXRpb24gZnJhbWVfZG9uZV9jb21wbGV0aW9uOworCWludCByOworCisJZW5hYmxlX2Nsb2NrcygxKTsKKworCWlmIChSRUdfR0VUKERJU1BDX0NPTlRST0wsIDEsIDEpID09IGVuYWJsZSkgeworCQllbmFibGVfY2xvY2tzKDApOworCQlyZXR1cm47CisJfQorCisJaWYgKGVuYWJsZSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkvKiBXaGVuIHdlIGVuYWJsZSBkaWdpdCBvdXRwdXQsIHdlJ2xsIGdldCBhbiBleHRyYSBkaWdpdAorCQkgKiBzeW5jIGxvc3QgaW50ZXJydXB0LCB0aGF0IHdlIG5lZWQgdG8gaWdub3JlICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkaXNwYy5pcnFfbG9jaywgZmxhZ3MpOworCQlkaXNwYy5pcnFfZXJyb3JfbWFzayAmPSB+RElTUENfSVJRX1NZTkNfTE9TVF9ESUdJVDsKKwkJX29tYXBfZGlzcGNfc2V0X2lycXMoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGlzcGMuaXJxX2xvY2ssIGZsYWdzKTsKKwl9CisKKwkvKiBXaGVuIHdlIGRpc2FibGUgZGlnaXQgb3V0cHV0LCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgZmllbGRzIGFyZSBkb25lLgorCSAqIE90aGVyd2lzZSB0aGUgRFNTIGlzIHN0aWxsIHdvcmtpbmcsIGFuZCB0dXJuaW5nIG9mZiB0aGUgY2xvY2tzCisJICogcHJldmVudHMgRFNTIGZyb20gZ29pbmcgdG8gT0ZGIG1vZGUuIEFuZCB3aGVuIGVuYWJsaW5nLCB3ZSBuZWVkIHRvCisJICogd2FpdCBmb3IgdGhlIGV4dHJhIHN5bmMgbG9zdHMgKi8KKwlpbml0X2NvbXBsZXRpb24oJmZyYW1lX2RvbmVfY29tcGxldGlvbik7CisKKwlyID0gb21hcF9kaXNwY19yZWdpc3Rlcl9pc3IoZGlzcGNfZGlzYWJsZV9pc3IsICZmcmFtZV9kb25lX2NvbXBsZXRpb24sCisJCQlESVNQQ19JUlFfRVZTWU5DX0VWRU4gfCBESVNQQ19JUlFfRVZTWU5DX09ERCk7CisJaWYgKHIpCisJCURTU0VSUigiZmFpbGVkIHRvIHJlZ2lzdGVyIEVWU1lOQyBpc3JcbiIpOworCisJX2VuYWJsZV9kaWdpdF9vdXQoZW5hYmxlKTsKKworCS8qIFhYWCBJIHVuZGVyc3RhbmQgZnJvbSBUUk0gdGhhdCB3ZSBzaG91bGQgb25seSB3YWl0IGZvciB0aGUKKwkgKiBjdXJyZW50IGZpZWxkIHRvIGNvbXBsZXRlLiBCdXQgaXQgc2VlbXMgd2UgaGF2ZSB0byB3YWl0CisJICogZm9yIGJvdGggZmllbGRzICovCisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmZyYW1lX2RvbmVfY29tcGxldGlvbiwKKwkJCQltc2Vjc190b19qaWZmaWVzKDEwMCkpKQorCQlEU1NFUlIoInRpbWVvdXQgd2FpdGluZyBmb3IgRVZTWU5DXG4iKTsKKworCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZmcmFtZV9kb25lX2NvbXBsZXRpb24sCisJCQkJbXNlY3NfdG9famlmZmllcygxMDApKSkKKwkJRFNTRVJSKCJ0aW1lb3V0IHdhaXRpbmcgZm9yIEVWU1lOQ1xuIik7CisKKwlyID0gb21hcF9kaXNwY191bnJlZ2lzdGVyX2lzcihkaXNwY19kaXNhYmxlX2lzciwKKwkJCSZmcmFtZV9kb25lX2NvbXBsZXRpb24sCisJCQlESVNQQ19JUlFfRVZTWU5DX0VWRU4gfCBESVNQQ19JUlFfRVZTWU5DX09ERCk7CisJaWYgKHIpCisJCURTU0VSUigiZmFpbGVkIHRvIHVucmVnaXN0ZXIgRVZTWU5DIGlzclxuIik7CisKKwlpZiAoZW5hYmxlKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkaXNwYy5pcnFfbG9jaywgZmxhZ3MpOworCQlkaXNwYy5pcnFfZXJyb3JfbWFzayA9IERJU1BDX0lSUV9NQVNLX0VSUk9SOworCQlkaXNwY193cml0ZV9yZWcoRElTUENfSVJRU1RBVFVTLCBESVNQQ19JUlFfU1lOQ19MT1NUX0RJR0lUKTsKKwkJX29tYXBfZGlzcGNfc2V0X2lycXMoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGlzcGMuaXJxX2xvY2ssIGZsYWdzKTsKKwl9CisKKwllbmFibGVfY2xvY2tzKDApOworfQorCit2b2lkIGRpc3BjX2xjZF9lbmFibGVfc2lnbmFsX3BvbGFyaXR5KGJvb2wgYWN0X2hpZ2gpCit7CisJZW5hYmxlX2Nsb2NrcygxKTsKKwlSRUdfRkxEX01PRChESVNQQ19DT05UUk9MLCBhY3RfaGlnaCA/IDEgOiAwLCAyOSwgMjkpOworCWVuYWJsZV9jbG9ja3MoMCk7Cit9CisKK3ZvaWQgZGlzcGNfbGNkX2VuYWJsZV9zaWduYWwoYm9vbCBlbmFibGUpCit7CisJZW5hYmxlX2Nsb2NrcygxKTsKKwlSRUdfRkxEX01PRChESVNQQ19DT05UUk9MLCBlbmFibGUgPyAxIDogMCwgMjgsIDI4KTsKKwllbmFibGVfY2xvY2tzKDApOworfQorCit2b2lkIGRpc3BjX3Bja19mcmVlX2VuYWJsZShib29sIGVuYWJsZSkKK3sKKwllbmFibGVfY2xvY2tzKDEpOworCVJFR19GTERfTU9EKERJU1BDX0NPTlRST0wsIGVuYWJsZSA/IDEgOiAwLCAyNywgMjcpOworCWVuYWJsZV9jbG9ja3MoMCk7Cit9CisKK3ZvaWQgZGlzcGNfZW5hYmxlX2ZpZm9oYW5kY2hlY2soYm9vbCBlbmFibGUpCit7CisJZW5hYmxlX2Nsb2NrcygxKTsKKwlSRUdfRkxEX01PRChESVNQQ19DT05GSUcsIGVuYWJsZSA/IDEgOiAwLCAxNiwgMTYpOworCWVuYWJsZV9jbG9ja3MoMCk7Cit9CisKKwordm9pZCBkaXNwY19zZXRfbGNkX2Rpc3BsYXlfdHlwZShlbnVtIG9tYXBfbGNkX2Rpc3BsYXlfdHlwZSB0eXBlKQoreworCWludCBtb2RlOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBPTUFQX0RTU19MQ0RfRElTUExBWV9TVE46CisJCW1vZGUgPSAwOworCQlicmVhazsKKworCWNhc2UgT01BUF9EU1NfTENEX0RJU1BMQVlfVEZUOgorCQltb2RlID0gMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuOworCX0KKworCWVuYWJsZV9jbG9ja3MoMSk7CisJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgbW9kZSwgMywgMyk7CisJZW5hYmxlX2Nsb2NrcygwKTsKK30KKwordm9pZCBkaXNwY19zZXRfbG9hZG1vZGUoZW51bSBvbWFwX2Rzc19sb2FkX21vZGUgbW9kZSkKK3sKKwllbmFibGVfY2xvY2tzKDEpOworCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRywgbW9kZSwgMiwgMSk7CisJZW5hYmxlX2Nsb2NrcygwKTsKK30KKworCit2b2lkIGRpc3BjX3NldF9kZWZhdWx0X2NvbG9yKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIHUzMiBjb2xvcikKK3sKKwljb25zdCBzdHJ1Y3QgZGlzcGNfcmVnIGRlZl9yZWdbXSA9IHsgRElTUENfREVGQVVMVF9DT0xPUjAsCisJCQkJRElTUENfREVGQVVMVF9DT0xPUjEgfTsKKworCWVuYWJsZV9jbG9ja3MoMSk7CisJZGlzcGNfd3JpdGVfcmVnKGRlZl9yZWdbY2hhbm5lbF0sIGNvbG9yKTsKKwllbmFibGVfY2xvY2tzKDApOworfQorCit1MzIgZGlzcGNfZ2V0X2RlZmF1bHRfY29sb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCkKK3sKKwljb25zdCBzdHJ1Y3QgZGlzcGNfcmVnIGRlZl9yZWdbXSA9IHsgRElTUENfREVGQVVMVF9DT0xPUjAsCisJCQkJRElTUENfREVGQVVMVF9DT0xPUjEgfTsKKwl1MzIgbDsKKworCUJVR19PTihjaGFubmVsICE9IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQgJiYKKwkgICAgICAgY2hhbm5lbCAhPSBPTUFQX0RTU19DSEFOTkVMX0xDRCk7CisKKwllbmFibGVfY2xvY2tzKDEpOworCWwgPSBkaXNwY19yZWFkX3JlZyhkZWZfcmVnW2NoYW5uZWxdKTsKKwllbmFibGVfY2xvY2tzKDApOworCisJcmV0dXJuIGw7Cit9CisKK3ZvaWQgZGlzcGNfc2V0X3RyYW5zX2tleShlbnVtIG9tYXBfY2hhbm5lbCBjaCwKKwkJZW51bSBvbWFwX2Rzc190cmFuc19rZXlfdHlwZSB0eXBlLAorCQl1MzIgdHJhbnNfa2V5KQoreworCWNvbnN0IHN0cnVjdCBkaXNwY19yZWcgdHJfcmVnW10gPSB7CisJCURJU1BDX1RSQU5TX0NPTE9SMCwgRElTUENfVFJBTlNfQ09MT1IxIH07CisKKwllbmFibGVfY2xvY2tzKDEpOworCWlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkKKwkJUkVHX0ZMRF9NT0QoRElTUENfQ09ORklHLCB0eXBlLCAxMSwgMTEpOworCWVsc2UgLyogT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCAqLworCQlSRUdfRkxEX01PRChESVNQQ19DT05GSUcsIHR5cGUsIDEzLCAxMyk7CisKKwlkaXNwY193cml0ZV9yZWcodHJfcmVnW2NoXSwgdHJhbnNfa2V5KTsKKwllbmFibGVfY2xvY2tzKDApOworfQorCit2b2lkIGRpc3BjX2dldF90cmFuc19rZXkoZW51bSBvbWFwX2NoYW5uZWwgY2gsCisJCWVudW0gb21hcF9kc3NfdHJhbnNfa2V5X3R5cGUgKnR5cGUsCisJCXUzMiAqdHJhbnNfa2V5KQoreworCWNvbnN0IHN0cnVjdCBkaXNwY19yZWcgdHJfcmVnW10gPSB7CisJCURJU1BDX1RSQU5TX0NPTE9SMCwgRElTUENfVFJBTlNfQ09MT1IxIH07CisKKwllbmFibGVfY2xvY2tzKDEpOworCWlmICh0eXBlKSB7CisJCWlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkKKwkJCSp0eXBlID0gUkVHX0dFVChESVNQQ19DT05GSUcsIDExLCAxMSk7CisJCWVsc2UgaWYgKGNoID09IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpCisJCQkqdHlwZSA9IFJFR19HRVQoRElTUENfQ09ORklHLCAxMywgMTMpOworCQllbHNlCisJCQlCVUcoKTsKKwl9CisKKwlpZiAodHJhbnNfa2V5KQorCQkqdHJhbnNfa2V5ID0gZGlzcGNfcmVhZF9yZWcodHJfcmVnW2NoXSk7CisJZW5hYmxlX2Nsb2NrcygwKTsKK30KKwordm9pZCBkaXNwY19lbmFibGVfdHJhbnNfa2V5KGVudW0gb21hcF9jaGFubmVsIGNoLCBib29sIGVuYWJsZSkKK3sKKwllbmFibGVfY2xvY2tzKDEpOworCWlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkKKwkJUkVHX0ZMRF9NT0QoRElTUENfQ09ORklHLCBlbmFibGUsIDEwLCAxMCk7CisJZWxzZSAvKiBPTUFQX0RTU19DSEFOTkVMX0RJR0lUICovCisJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRywgZW5hYmxlLCAxMiwgMTIpOworCWVuYWJsZV9jbG9ja3MoMCk7Cit9Cit2b2lkIGRpc3BjX2VuYWJsZV9hbHBoYV9ibGVuZGluZyhlbnVtIG9tYXBfY2hhbm5lbCBjaCwgYm9vbCBlbmFibGUpCit7CisJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQorCQlyZXR1cm47CisKKwllbmFibGVfY2xvY2tzKDEpOworCWlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkKKwkJUkVHX0ZMRF9NT0QoRElTUENfQ09ORklHLCBlbmFibGUsIDE4LCAxOCk7CisJZWxzZSAvKiBPTUFQX0RTU19DSEFOTkVMX0RJR0lUICovCisJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRywgZW5hYmxlLCAxOSwgMTkpOworCWVuYWJsZV9jbG9ja3MoMCk7Cit9Citib29sIGRpc3BjX2FscGhhX2JsZW5kaW5nX2VuYWJsZWQoZW51bSBvbWFwX2NoYW5uZWwgY2gpCit7CisJYm9vbCBlbmFibGVkOworCisJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQorCQlyZXR1cm4gZmFsc2U7CisKKwllbmFibGVfY2xvY2tzKDEpOworCWlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkKKwkJZW5hYmxlZCA9IFJFR19HRVQoRElTUENfQ09ORklHLCAxOCwgMTgpOworCWVsc2UgaWYgKGNoID09IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpCisJCWVuYWJsZWQgPSBSRUdfR0VUKERJU1BDX0NPTkZJRywgMTgsIDE4KTsKKwllbHNlCisJCUJVRygpOworCWVuYWJsZV9jbG9ja3MoMCk7CisKKwlyZXR1cm4gZW5hYmxlZDsKKworfQorCisKK2Jvb2wgZGlzcGNfdHJhbnNfa2V5X2VuYWJsZWQoZW51bSBvbWFwX2NoYW5uZWwgY2gpCit7CisJYm9vbCBlbmFibGVkOworCisJZW5hYmxlX2Nsb2NrcygxKTsKKwlpZiAoY2ggPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpCisJCWVuYWJsZWQgPSBSRUdfR0VUKERJU1BDX0NPTkZJRywgMTAsIDEwKTsKKwllbHNlIGlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUKQorCQllbmFibGVkID0gUkVHX0dFVChESVNQQ19DT05GSUcsIDEyLCAxMik7CisJZWxzZQorCQlCVUcoKTsKKwllbmFibGVfY2xvY2tzKDApOworCisJcmV0dXJuIGVuYWJsZWQ7Cit9CisKKwordm9pZCBkaXNwY19zZXRfdGZ0X2RhdGFfbGluZXModTggZGF0YV9saW5lcykKK3sKKwlpbnQgY29kZTsKKworCXN3aXRjaCAoZGF0YV9saW5lcykgeworCWNhc2UgMTI6CisJCWNvZGUgPSAwOworCQlicmVhazsKKwljYXNlIDE2OgorCQljb2RlID0gMTsKKwkJYnJlYWs7CisJY2FzZSAxODoKKwkJY29kZSA9IDI7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCWNvZGUgPSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuOworCX0KKworCWVuYWJsZV9jbG9ja3MoMSk7CisJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgY29kZSwgOSwgOCk7CisJZW5hYmxlX2Nsb2NrcygwKTsKK30KKwordm9pZCBkaXNwY19zZXRfcGFyYWxsZWxfaW50ZXJmYWNlX21vZGUoZW51bSBvbWFwX3BhcmFsbGVsX2ludGVyZmFjZV9tb2RlIG1vZGUpCit7CisJdTMyIGw7CisJaW50IHN0YWxsbW9kZTsKKwlpbnQgZ3BvdXQwID0gMTsKKwlpbnQgZ3BvdXQxOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBPTUFQX0RTU19QQVJBTExFTE1PREVfQllQQVNTOgorCQlzdGFsbG1vZGUgPSAwOworCQlncG91dDEgPSAxOworCQlicmVhazsKKworCWNhc2UgT01BUF9EU1NfUEFSQUxMRUxNT0RFX1JGQkk6CisJCXN0YWxsbW9kZSA9IDE7CisJCWdwb3V0MSA9IDA7CisJCWJyZWFrOworCisJY2FzZSBPTUFQX0RTU19QQVJBTExFTE1PREVfRFNJOgorCQlzdGFsbG1vZGUgPSAxOworCQlncG91dDEgPSAxOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCisJZW5hYmxlX2Nsb2NrcygxKTsKKworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19DT05UUk9MKTsKKworCWwgPSBGTERfTU9EKGwsIHN0YWxsbW9kZSwgMTEsIDExKTsKKwlsID0gRkxEX01PRChsLCBncG91dDAsIDE1LCAxNSk7CisJbCA9IEZMRF9NT0QobCwgZ3BvdXQxLCAxNiwgMTYpOworCisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0NPTlRST0wsIGwpOworCisJZW5hYmxlX2Nsb2NrcygwKTsKK30KKworc3RhdGljIGJvb2wgX2Rpc3BjX2xjZF90aW1pbmdzX29rKGludCBoc3csIGludCBoZnAsIGludCBoYnAsCisJCWludCB2c3csIGludCB2ZnAsIGludCB2YnApCit7CisJaWYgKGNwdV9pc19vbWFwMjR4eCgpIHx8IG9tYXBfcmV2KCkgPCBPTUFQMzQzMF9SRVZfRVMzXzApIHsKKwkJaWYgKGhzdyA8IDEgfHwgaHN3ID4gNjQgfHwKKwkJCQloZnAgPCAxIHx8IGhmcCA+IDI1NiB8fAorCQkJCWhicCA8IDEgfHwgaGJwID4gMjU2IHx8CisJCQkJdnN3IDwgMSB8fCB2c3cgPiA2NCB8fAorCQkJCXZmcCA8IDAgfHwgdmZwID4gMjU1IHx8CisJCQkJdmJwIDwgMCB8fCB2YnAgPiAyNTUpCisJCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIHsKKwkJaWYgKGhzdyA8IDEgfHwgaHN3ID4gMjU2IHx8CisJCQkJaGZwIDwgMSB8fCBoZnAgPiA0MDk2IHx8CisJCQkJaGJwIDwgMSB8fCBoYnAgPiA0MDk2IHx8CisJCQkJdnN3IDwgMSB8fCB2c3cgPiAyNTYgfHwKKwkJCQl2ZnAgPCAwIHx8IHZmcCA+IDQwOTUgfHwKKwkJCQl2YnAgPCAwIHx8IHZicCA+IDQwOTUpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgZGlzcGNfbGNkX3RpbWluZ3Nfb2soc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKK3sKKwlyZXR1cm4gX2Rpc3BjX2xjZF90aW1pbmdzX29rKHRpbWluZ3MtPmhzdywgdGltaW5ncy0+aGZwLAorCQkJdGltaW5ncy0+aGJwLCB0aW1pbmdzLT52c3csCisJCQl0aW1pbmdzLT52ZnAsIHRpbWluZ3MtPnZicCk7Cit9CisKK3N0YXRpYyB2b2lkIF9kaXNwY19zZXRfbGNkX3RpbWluZ3MoaW50IGhzdywgaW50IGhmcCwgaW50IGhicCwKKwkJCQkgICBpbnQgdnN3LCBpbnQgdmZwLCBpbnQgdmJwKQoreworCXUzMiB0aW1pbmdfaCwgdGltaW5nX3Y7CisKKwlpZiAoY3B1X2lzX29tYXAyNHh4KCkgfHwgb21hcF9yZXYoKSA8IE9NQVAzNDMwX1JFVl9FUzNfMCkgeworCQl0aW1pbmdfaCA9IEZMRF9WQUwoaHN3LTEsIDUsIDApIHwgRkxEX1ZBTChoZnAtMSwgMTUsIDgpIHwKKwkJCUZMRF9WQUwoaGJwLTEsIDI3LCAyMCk7CisKKwkJdGltaW5nX3YgPSBGTERfVkFMKHZzdy0xLCA1LCAwKSB8IEZMRF9WQUwodmZwLCAxNSwgOCkgfAorCQkJRkxEX1ZBTCh2YnAsIDI3LCAyMCk7CisJfSBlbHNlIHsKKwkJdGltaW5nX2ggPSBGTERfVkFMKGhzdy0xLCA3LCAwKSB8IEZMRF9WQUwoaGZwLTEsIDE5LCA4KSB8CisJCQlGTERfVkFMKGhicC0xLCAzMSwgMjApOworCisJCXRpbWluZ192ID0gRkxEX1ZBTCh2c3ctMSwgNywgMCkgfCBGTERfVkFMKHZmcCwgMTksIDgpIHwKKwkJCUZMRF9WQUwodmJwLCAzMSwgMjApOworCX0KKworCWVuYWJsZV9jbG9ja3MoMSk7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX1RJTUlOR19ILCB0aW1pbmdfaCk7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX1RJTUlOR19WLCB0aW1pbmdfdik7CisJZW5hYmxlX2Nsb2NrcygwKTsKK30KKworLyogY2hhbmdlIG5hbWUgdG8gbW9kZT8gKi8KK3ZvaWQgZGlzcGNfc2V0X2xjZF90aW1pbmdzKHN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpCit7CisJdW5zaWduZWQgeHRvdCwgeXRvdDsKKwl1bnNpZ25lZCBsb25nIGh0LCB2dDsKKworCWlmICghX2Rpc3BjX2xjZF90aW1pbmdzX29rKHRpbWluZ3MtPmhzdywgdGltaW5ncy0+aGZwLAorCQkJCXRpbWluZ3MtPmhicCwgdGltaW5ncy0+dnN3LAorCQkJCXRpbWluZ3MtPnZmcCwgdGltaW5ncy0+dmJwKSkKKwkJQlVHKCk7CisKKwlfZGlzcGNfc2V0X2xjZF90aW1pbmdzKHRpbWluZ3MtPmhzdywgdGltaW5ncy0+aGZwLCB0aW1pbmdzLT5oYnAsCisJCQl0aW1pbmdzLT52c3csIHRpbWluZ3MtPnZmcCwgdGltaW5ncy0+dmJwKTsKKworCWRpc3BjX3NldF9sY2Rfc2l6ZSh0aW1pbmdzLT54X3JlcywgdGltaW5ncy0+eV9yZXMpOworCisJeHRvdCA9IHRpbWluZ3MtPnhfcmVzICsgdGltaW5ncy0+aGZwICsgdGltaW5ncy0+aHN3ICsgdGltaW5ncy0+aGJwOworCXl0b3QgPSB0aW1pbmdzLT55X3JlcyArIHRpbWluZ3MtPnZmcCArIHRpbWluZ3MtPnZzdyArIHRpbWluZ3MtPnZicDsKKworCWh0ID0gKHRpbWluZ3MtPnBpeGVsX2Nsb2NrICogMTAwMCkgLyB4dG90OworCXZ0ID0gKHRpbWluZ3MtPnBpeGVsX2Nsb2NrICogMTAwMCkgLyB4dG90IC8geXRvdDsKKworCURTU0RCRygieHJlcyAldSB5cmVzICV1XG4iLCB0aW1pbmdzLT54X3JlcywgdGltaW5ncy0+eV9yZXMpOworCURTU0RCRygicGNrICV1XG4iLCB0aW1pbmdzLT5waXhlbF9jbG9jayk7CisJRFNTREJHKCJoc3cgJWQgaGZwICVkIGhicCAlZCB2c3cgJWQgdmZwICVkIHZicCAlZFxuIiwKKwkJCXRpbWluZ3MtPmhzdywgdGltaW5ncy0+aGZwLCB0aW1pbmdzLT5oYnAsCisJCQl0aW1pbmdzLT52c3csIHRpbWluZ3MtPnZmcCwgdGltaW5ncy0+dmJwKTsKKworCURTU0RCRygiaHN5bmMgJWx1SHosIHZzeW5jICVsdUh6XG4iLCBodCwgdnQpOworfQorCitzdGF0aWMgdm9pZCBkaXNwY19zZXRfbGNkX2Rpdmlzb3IodTE2IGxja19kaXYsIHUxNiBwY2tfZGl2KQoreworCUJVR19PTihsY2tfZGl2IDwgMSk7CisJQlVHX09OKHBja19kaXYgPCAyKTsKKworCWVuYWJsZV9jbG9ja3MoMSk7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0RJVklTT1IsCisJCQlGTERfVkFMKGxja19kaXYsIDIzLCAxNikgfCBGTERfVkFMKHBja19kaXYsIDcsIDApKTsKKwllbmFibGVfY2xvY2tzKDApOworfQorCitzdGF0aWMgdm9pZCBkaXNwY19nZXRfbGNkX2Rpdmlzb3IoaW50ICpsY2tfZGl2LCBpbnQgKnBja19kaXYpCit7CisJdTMyIGw7CisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0RJVklTT1IpOworCSpsY2tfZGl2ID0gRkxEX0dFVChsLCAyMywgMTYpOworCSpwY2tfZGl2ID0gRkxEX0dFVChsLCA3LCAwKTsKK30KKwordW5zaWduZWQgbG9uZyBkaXNwY19mY2xrX3JhdGUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHIgPSAwOworCisJaWYgKGRzc19nZXRfZGlzcGNfY2xrX3NvdXJjZSgpID09IDApCisJCXIgPSBkc3NfY2xrX2dldF9yYXRlKERTU19DTEtfRkNLMSk7CisJZWxzZQorI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfRFNJCisJCXIgPSBkc2lfZ2V0X2RzaTFfcGxsX3JhdGUoKTsKKyNlbHNlCisJQlVHKCk7CisjZW5kaWYKKwlyZXR1cm4gcjsKK30KKwordW5zaWduZWQgbG9uZyBkaXNwY19sY2xrX3JhdGUodm9pZCkKK3sKKwlpbnQgbGNkOworCXVuc2lnbmVkIGxvbmcgcjsKKwl1MzIgbDsKKworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19ESVZJU09SKTsKKworCWxjZCA9IEZMRF9HRVQobCwgMjMsIDE2KTsKKworCXIgPSBkaXNwY19mY2xrX3JhdGUoKTsKKworCXJldHVybiByIC8gbGNkOworfQorCit1bnNpZ25lZCBsb25nIGRpc3BjX3BjbGtfcmF0ZSh2b2lkKQoreworCWludCBsY2QsIHBjZDsKKwl1bnNpZ25lZCBsb25nIHI7CisJdTMyIGw7CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfRElWSVNPUik7CisKKwlsY2QgPSBGTERfR0VUKGwsIDIzLCAxNik7CisJcGNkID0gRkxEX0dFVChsLCA3LCAwKTsKKworCXIgPSBkaXNwY19mY2xrX3JhdGUoKTsKKworCXJldHVybiByIC8gbGNkIC8gcGNkOworfQorCit2b2lkIGRpc3BjX2R1bXBfY2xvY2tzKHN0cnVjdCBzZXFfZmlsZSAqcykKK3sKKwlpbnQgbGNkLCBwY2Q7CisKKwllbmFibGVfY2xvY2tzKDEpOworCisJZGlzcGNfZ2V0X2xjZF9kaXZpc29yKCZsY2QsICZwY2QpOworCisJc2VxX3ByaW50ZihzLCAiLSBESVNQQyAtXG4iKTsKKworCXNlcV9wcmludGYocywgImRpc3BjIGZjbGsgc291cmNlID0gJXNcbiIsCisJCQlkc3NfZ2V0X2Rpc3BjX2Nsa19zb3VyY2UoKSA9PSAwID8KKwkJCSJkc3MxX2Fsd29uX2ZjbGsiIDogImRzaTFfcGxsX2ZjbGsiKTsKKworCXNlcV9wcmludGYocywgImZja1x0XHQlLTE2bHVcbiIsIGRpc3BjX2ZjbGtfcmF0ZSgpKTsKKwlzZXFfcHJpbnRmKHMsICJsY2tcdFx0JS0xNmx1bGNrIGRpdlx0JXVcbiIsIGRpc3BjX2xjbGtfcmF0ZSgpLCBsY2QpOworCXNlcV9wcmludGYocywgInBja1x0XHQlLTE2bHVwY2sgZGl2XHQldVxuIiwgZGlzcGNfcGNsa19yYXRlKCksIHBjZCk7CisKKwllbmFibGVfY2xvY2tzKDApOworfQorCit2b2lkIGRpc3BjX2R1bXBfcmVncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCit7CisjZGVmaW5lIERVTVBSRUcocikgc2VxX3ByaW50ZihzLCAiJS0zNXMgJTA4eFxuIiwgI3IsIGRpc3BjX3JlYWRfcmVnKHIpKQorCisJZHNzX2Nsa19lbmFibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSzEpOworCisJRFVNUFJFRyhESVNQQ19SRVZJU0lPTik7CisJRFVNUFJFRyhESVNQQ19TWVNDT05GSUcpOworCURVTVBSRUcoRElTUENfU1lTU1RBVFVTKTsKKwlEVU1QUkVHKERJU1BDX0lSUVNUQVRVUyk7CisJRFVNUFJFRyhESVNQQ19JUlFFTkFCTEUpOworCURVTVBSRUcoRElTUENfQ09OVFJPTCk7CisJRFVNUFJFRyhESVNQQ19DT05GSUcpOworCURVTVBSRUcoRElTUENfQ0FQQUJMRSk7CisJRFVNUFJFRyhESVNQQ19ERUZBVUxUX0NPTE9SMCk7CisJRFVNUFJFRyhESVNQQ19ERUZBVUxUX0NPTE9SMSk7CisJRFVNUFJFRyhESVNQQ19UUkFOU19DT0xPUjApOworCURVTVBSRUcoRElTUENfVFJBTlNfQ09MT1IxKTsKKwlEVU1QUkVHKERJU1BDX0xJTkVfU1RBVFVTKTsKKwlEVU1QUkVHKERJU1BDX0xJTkVfTlVNQkVSKTsKKwlEVU1QUkVHKERJU1BDX1RJTUlOR19IKTsKKwlEVU1QUkVHKERJU1BDX1RJTUlOR19WKTsKKwlEVU1QUkVHKERJU1BDX1BPTF9GUkVRKTsKKwlEVU1QUkVHKERJU1BDX0RJVklTT1IpOworCURVTVBSRUcoRElTUENfR0xPQkFMX0FMUEhBKTsKKwlEVU1QUkVHKERJU1BDX1NJWkVfRElHKTsKKwlEVU1QUkVHKERJU1BDX1NJWkVfTENEKTsKKworCURVTVBSRUcoRElTUENfR0ZYX0JBMCk7CisJRFVNUFJFRyhESVNQQ19HRlhfQkExKTsKKwlEVU1QUkVHKERJU1BDX0dGWF9QT1NJVElPTik7CisJRFVNUFJFRyhESVNQQ19HRlhfU0laRSk7CisJRFVNUFJFRyhESVNQQ19HRlhfQVRUUklCVVRFUyk7CisJRFVNUFJFRyhESVNQQ19HRlhfRklGT19USFJFU0hPTEQpOworCURVTVBSRUcoRElTUENfR0ZYX0ZJRk9fU0laRV9TVEFUVVMpOworCURVTVBSRUcoRElTUENfR0ZYX1JPV19JTkMpOworCURVTVBSRUcoRElTUENfR0ZYX1BJWEVMX0lOQyk7CisJRFVNUFJFRyhESVNQQ19HRlhfV0lORE9XX1NLSVApOworCURVTVBSRUcoRElTUENfR0ZYX1RBQkxFX0JBKTsKKworCURVTVBSRUcoRElTUENfREFUQV9DWUNMRTEpOworCURVTVBSRUcoRElTUENfREFUQV9DWUNMRTIpOworCURVTVBSRUcoRElTUENfREFUQV9DWUNMRTMpOworCisJRFVNUFJFRyhESVNQQ19DUFJfQ09FRl9SKTsKKwlEVU1QUkVHKERJU1BDX0NQUl9DT0VGX0cpOworCURVTVBSRUcoRElTUENfQ1BSX0NPRUZfQik7CisKKwlEVU1QUkVHKERJU1BDX0dGWF9QUkVMT0FEKTsKKworCURVTVBSRUcoRElTUENfVklEX0JBMCgwKSk7CisJRFVNUFJFRyhESVNQQ19WSURfQkExKDApKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9QT1NJVElPTigwKSk7CisJRFVNUFJFRyhESVNQQ19WSURfU0laRSgwKSk7CisJRFVNUFJFRyhESVNQQ19WSURfQVRUUklCVVRFUygwKSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklGT19USFJFU0hPTEQoMCkpOworCURVTVBSRUcoRElTUENfVklEX0ZJRk9fU0laRV9TVEFUVVMoMCkpOworCURVTVBSRUcoRElTUENfVklEX1JPV19JTkMoMCkpOworCURVTVBSRUcoRElTUENfVklEX1BJWEVMX0lOQygwKSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSKDApKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9QSUNUVVJFX1NJWkUoMCkpOworCURVTVBSRUcoRElTUENfVklEX0FDQ1UwKDApKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9BQ0NVMSgwKSk7CisKKwlEVU1QUkVHKERJU1BDX1ZJRF9CQTAoMSkpOworCURVTVBSRUcoRElTUENfVklEX0JBMSgxKSk7CisJRFVNUFJFRyhESVNQQ19WSURfUE9TSVRJT04oMSkpOworCURVTVBSRUcoRElTUENfVklEX1NJWkUoMSkpOworCURVTVBSRUcoRElTUENfVklEX0FUVFJJQlVURVMoMSkpOworCURVTVBSRUcoRElTUENfVklEX0ZJRk9fVEhSRVNIT0xEKDEpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSUZPX1NJWkVfU1RBVFVTKDEpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9ST1dfSU5DKDEpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9QSVhFTF9JTkMoMSkpOworCURVTVBSRUcoRElTUENfVklEX0ZJUigxKSk7CisJRFVNUFJFRyhESVNQQ19WSURfUElDVFVSRV9TSVpFKDEpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9BQ0NVMCgxKSk7CisJRFVNUFJFRyhESVNQQ19WSURfQUNDVTEoMSkpOworCisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfSCgwLCAwKSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfSCgwLCAxKSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfSCgwLCAyKSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfSCgwLCAzKSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfSCgwLCA0KSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfSCgwLCA1KSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfSCgwLCA2KSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfSCgwLCA3KSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfSFYoMCwgMCkpOworCURVTVBSRUcoRElTUENfVklEX0ZJUl9DT0VGX0hWKDAsIDEpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9IVigwLCAyKSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfSFYoMCwgMykpOworCURVTVBSRUcoRElTUENfVklEX0ZJUl9DT0VGX0hWKDAsIDQpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9IVigwLCA1KSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfSFYoMCwgNikpOworCURVTVBSRUcoRElTUENfVklEX0ZJUl9DT0VGX0hWKDAsIDcpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9DT05WX0NPRUYoMCwgMCkpOworCURVTVBSRUcoRElTUENfVklEX0NPTlZfQ09FRigwLCAxKSk7CisJRFVNUFJFRyhESVNQQ19WSURfQ09OVl9DT0VGKDAsIDIpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9DT05WX0NPRUYoMCwgMykpOworCURVTVBSRUcoRElTUENfVklEX0NPTlZfQ09FRigwLCA0KSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfVigwLCAwKSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfVigwLCAxKSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfVigwLCAyKSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfVigwLCAzKSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfVigwLCA0KSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfVigwLCA1KSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfVigwLCA2KSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfVigwLCA3KSk7CisKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9IKDEsIDApKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9IKDEsIDEpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9IKDEsIDIpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9IKDEsIDMpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9IKDEsIDQpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9IKDEsIDUpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9IKDEsIDYpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9IKDEsIDcpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9IVigxLCAwKSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfSFYoMSwgMSkpOworCURVTVBSRUcoRElTUENfVklEX0ZJUl9DT0VGX0hWKDEsIDIpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9IVigxLCAzKSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfSFYoMSwgNCkpOworCURVTVBSRUcoRElTUENfVklEX0ZJUl9DT0VGX0hWKDEsIDUpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9IVigxLCA2KSk7CisJRFVNUFJFRyhESVNQQ19WSURfRklSX0NPRUZfSFYoMSwgNykpOworCURVTVBSRUcoRElTUENfVklEX0NPTlZfQ09FRigxLCAwKSk7CisJRFVNUFJFRyhESVNQQ19WSURfQ09OVl9DT0VGKDEsIDEpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9DT05WX0NPRUYoMSwgMikpOworCURVTVBSRUcoRElTUENfVklEX0NPTlZfQ09FRigxLCAzKSk7CisJRFVNUFJFRyhESVNQQ19WSURfQ09OVl9DT0VGKDEsIDQpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9WKDEsIDApKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9WKDEsIDEpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9WKDEsIDIpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9WKDEsIDMpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9WKDEsIDQpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9WKDEsIDUpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9WKDEsIDYpKTsKKwlEVU1QUkVHKERJU1BDX1ZJRF9GSVJfQ09FRl9WKDEsIDcpKTsKKworCURVTVBSRUcoRElTUENfVklEX1BSRUxPQUQoMCkpOworCURVTVBSRUcoRElTUENfVklEX1BSRUxPQUQoMSkpOworCisJZHNzX2Nsa19kaXNhYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0sxKTsKKyN1bmRlZiBEVU1QUkVHCit9CisKK3N0YXRpYyB2b2lkIF9kaXNwY19zZXRfcG9sX2ZyZXEoYm9vbCBvbm9mZiwgYm9vbCByZiwgYm9vbCBpZW8sIGJvb2wgaXBjLAorCQkJCWJvb2wgaWhzLCBib29sIGl2cywgdTggYWNiaSwgdTggYWNiKQoreworCXUzMiBsID0gMDsKKworCURTU0RCRygib25vZmYgJWQgcmYgJWQgaWVvICVkIGlwYyAlZCBpaHMgJWQgaXZzICVkIGFjYmkgJWQgYWNiICVkXG4iLAorCQkJb25vZmYsIHJmLCBpZW8sIGlwYywgaWhzLCBpdnMsIGFjYmksIGFjYik7CisKKwlsIHw9IEZMRF9WQUwob25vZmYsIDE3LCAxNyk7CisJbCB8PSBGTERfVkFMKHJmLCAxNiwgMTYpOworCWwgfD0gRkxEX1ZBTChpZW8sIDE1LCAxNSk7CisJbCB8PSBGTERfVkFMKGlwYywgMTQsIDE0KTsKKwlsIHw9IEZMRF9WQUwoaWhzLCAxMywgMTMpOworCWwgfD0gRkxEX1ZBTChpdnMsIDEyLCAxMik7CisJbCB8PSBGTERfVkFMKGFjYmksIDExLCA4KTsKKwlsIHw9IEZMRF9WQUwoYWNiLCA3LCAwKTsKKworCWVuYWJsZV9jbG9ja3MoMSk7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX1BPTF9GUkVRLCBsKTsKKwllbmFibGVfY2xvY2tzKDApOworfQorCit2b2lkIGRpc3BjX3NldF9wb2xfZnJlcShlbnVtIG9tYXBfcGFuZWxfY29uZmlnIGNvbmZpZywgdTggYWNiaSwgdTggYWNiKQoreworCV9kaXNwY19zZXRfcG9sX2ZyZXEoKGNvbmZpZyAmIE9NQVBfRFNTX0xDRF9PTk9GRikgIT0gMCwKKwkJCShjb25maWcgJiBPTUFQX0RTU19MQ0RfUkYpICE9IDAsCisJCQkoY29uZmlnICYgT01BUF9EU1NfTENEX0lFTykgIT0gMCwKKwkJCShjb25maWcgJiBPTUFQX0RTU19MQ0RfSVBDKSAhPSAwLAorCQkJKGNvbmZpZyAmIE9NQVBfRFNTX0xDRF9JSFMpICE9IDAsCisJCQkoY29uZmlnICYgT01BUF9EU1NfTENEX0lWUykgIT0gMCwKKwkJCWFjYmksIGFjYik7Cit9CisKKy8qIHdpdGggZmNrIGFzIGlucHV0IGNsb2NrIHJhdGUsIGZpbmQgZGlzcGMgZGl2aWRlcnMgdGhhdCBwcm9kdWNlIHJlcV9wY2sgKi8KK3ZvaWQgZGlzcGNfZmluZF9jbGtfZGl2cyhib29sIGlzX3RmdCwgdW5zaWduZWQgbG9uZyByZXFfcGNrLCB1bnNpZ25lZCBsb25nIGZjaywKKwkJc3RydWN0IGRpc3BjX2Nsb2NrX2luZm8gKmNpbmZvKQoreworCXUxNiBwY2RfbWluID0gaXNfdGZ0ID8gMiA6IDM7CisJdW5zaWduZWQgbG9uZyBiZXN0X3BjazsKKwl1MTYgYmVzdF9sZCwgY3VyX2xkOworCXUxNiBiZXN0X3BkLCBjdXJfcGQ7CisKKwliZXN0X3BjayA9IDA7CisJYmVzdF9sZCA9IDA7CisJYmVzdF9wZCA9IDA7CisKKwlmb3IgKGN1cl9sZCA9IDE7IGN1cl9sZCA8PSAyNTU7ICsrY3VyX2xkKSB7CisJCXVuc2lnbmVkIGxvbmcgbGNrID0gZmNrIC8gY3VyX2xkOworCisJCWZvciAoY3VyX3BkID0gcGNkX21pbjsgY3VyX3BkIDw9IDI1NTsgKytjdXJfcGQpIHsKKwkJCXVuc2lnbmVkIGxvbmcgcGNrID0gbGNrIC8gY3VyX3BkOworCQkJbG9uZyBvbGRfZGVsdGEgPSBhYnMoYmVzdF9wY2sgLSByZXFfcGNrKTsKKwkJCWxvbmcgbmV3X2RlbHRhID0gYWJzKHBjayAtIHJlcV9wY2spOworCisJCQlpZiAoYmVzdF9wY2sgPT0gMCB8fCBuZXdfZGVsdGEgPCBvbGRfZGVsdGEpIHsKKwkJCQliZXN0X3BjayA9IHBjazsKKwkJCQliZXN0X2xkID0gY3VyX2xkOworCQkJCWJlc3RfcGQgPSBjdXJfcGQ7CisKKwkJCQlpZiAocGNrID09IHJlcV9wY2spCisJCQkJCWdvdG8gZm91bmQ7CisJCQl9CisKKwkJCWlmIChwY2sgPCByZXFfcGNrKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGxjayAvIHBjZF9taW4gPCByZXFfcGNrKQorCQkJYnJlYWs7CisJfQorCitmb3VuZDoKKwljaW5mby0+bGNrX2RpdiA9IGJlc3RfbGQ7CisJY2luZm8tPnBja19kaXYgPSBiZXN0X3BkOworCWNpbmZvLT5sY2sgPSBmY2sgLyBjaW5mby0+bGNrX2RpdjsKKwljaW5mby0+cGNrID0gY2luZm8tPmxjayAvIGNpbmZvLT5wY2tfZGl2OworfQorCisvKiBjYWxjdWxhdGUgY2xvY2sgcmF0ZXMgdXNpbmcgZGl2aWRlcnMgaW4gY2luZm8gKi8KK2ludCBkaXNwY19jYWxjX2Nsb2NrX3JhdGVzKHVuc2lnbmVkIGxvbmcgZGlzcGNfZmNsa19yYXRlLAorCQlzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyAqY2luZm8pCit7CisJaWYgKGNpbmZvLT5sY2tfZGl2ID4gMjU1IHx8IGNpbmZvLT5sY2tfZGl2ID09IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjaW5mby0+cGNrX2RpdiA8IDIgfHwgY2luZm8tPnBja19kaXYgPiAyNTUpCisJCXJldHVybiAtRUlOVkFMOworCisJY2luZm8tPmxjayA9IGRpc3BjX2ZjbGtfcmF0ZSAvIGNpbmZvLT5sY2tfZGl2OworCWNpbmZvLT5wY2sgPSBjaW5mby0+bGNrIC8gY2luZm8tPnBja19kaXY7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRpc3BjX3NldF9jbG9ja19kaXYoc3RydWN0IGRpc3BjX2Nsb2NrX2luZm8gKmNpbmZvKQoreworCURTU0RCRygibGNrID0gJWx1ICgldSlcbiIsIGNpbmZvLT5sY2ssIGNpbmZvLT5sY2tfZGl2KTsKKwlEU1NEQkcoInBjayA9ICVsdSAoJXUpXG4iLCBjaW5mby0+cGNrLCBjaW5mby0+cGNrX2Rpdik7CisKKwlkaXNwY19zZXRfbGNkX2Rpdmlzb3IoY2luZm8tPmxja19kaXYsIGNpbmZvLT5wY2tfZGl2KTsKKworCXJldHVybiAwOworfQorCitpbnQgZGlzcGNfZ2V0X2Nsb2NrX2RpdihzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyAqY2luZm8pCit7CisJdW5zaWduZWQgbG9uZyBmY2s7CisKKwlmY2sgPSBkaXNwY19mY2xrX3JhdGUoKTsKKworCWNpbmZvLT5sY2tfZGl2ID0gUkVHX0dFVChESVNQQ19ESVZJU09SLCAyMywgMTYpOworCWNpbmZvLT5wY2tfZGl2ID0gUkVHX0dFVChESVNQQ19ESVZJU09SLCA3LCAwKTsKKworCWNpbmZvLT5sY2sgPSBmY2sgLyBjaW5mby0+bGNrX2RpdjsKKwljaW5mby0+cGNrID0gY2luZm8tPmxjayAvIGNpbmZvLT5wY2tfZGl2OworCisJcmV0dXJuIDA7Cit9CisKKy8qIGRpc3BjLmlycV9sb2NrIGhhcyB0byBiZSBsb2NrZWQgYnkgdGhlIGNhbGxlciAqLworc3RhdGljIHZvaWQgX29tYXBfZGlzcGNfc2V0X2lycXModm9pZCkKK3sKKwl1MzIgbWFzazsKKwl1MzIgb2xkX21hc2s7CisJaW50IGk7CisJc3RydWN0IG9tYXBfZGlzcGNfaXNyX2RhdGEgKmlzcl9kYXRhOworCisJbWFzayA9IGRpc3BjLmlycV9lcnJvcl9tYXNrOworCisJZm9yIChpID0gMDsgaSA8IERJU1BDX01BWF9OUl9JU1JTOyBpKyspIHsKKwkJaXNyX2RhdGEgPSAmZGlzcGMucmVnaXN0ZXJlZF9pc3JbaV07CisKKwkJaWYgKGlzcl9kYXRhLT5pc3IgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCW1hc2sgfD0gaXNyX2RhdGEtPm1hc2s7CisJfQorCisJZW5hYmxlX2Nsb2NrcygxKTsKKworCW9sZF9tYXNrID0gZGlzcGNfcmVhZF9yZWcoRElTUENfSVJRRU5BQkxFKTsKKwkvKiBjbGVhciB0aGUgaXJxc3RhdHVzIGZvciBuZXdseSBlbmFibGVkIGlycXMgKi8KKwlkaXNwY193cml0ZV9yZWcoRElTUENfSVJRU1RBVFVTLCAobWFzayBeIG9sZF9tYXNrKSAmIG1hc2spOworCisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0lSUUVOQUJMRSwgbWFzayk7CisKKwllbmFibGVfY2xvY2tzKDApOworfQorCitpbnQgb21hcF9kaXNwY19yZWdpc3Rlcl9pc3Iob21hcF9kaXNwY19pc3JfdCBpc3IsIHZvaWQgKmFyZywgdTMyIG1hc2spCit7CisJaW50IGk7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBvbWFwX2Rpc3BjX2lzcl9kYXRhICppc3JfZGF0YTsKKworCWlmIChpc3IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGlzcGMuaXJxX2xvY2ssIGZsYWdzKTsKKworCS8qIGNoZWNrIGZvciBkdXBsaWNhdGUgZW50cnkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgRElTUENfTUFYX05SX0lTUlM7IGkrKykgeworCQlpc3JfZGF0YSA9ICZkaXNwYy5yZWdpc3RlcmVkX2lzcltpXTsKKwkJaWYgKGlzcl9kYXRhLT5pc3IgPT0gaXNyICYmIGlzcl9kYXRhLT5hcmcgPT0gYXJnICYmCisJCQkJaXNyX2RhdGEtPm1hc2sgPT0gbWFzaykgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJaXNyX2RhdGEgPSBOVUxMOworCXJldCA9IC1FQlVTWTsKKworCWZvciAoaSA9IDA7IGkgPCBESVNQQ19NQVhfTlJfSVNSUzsgaSsrKSB7CisJCWlzcl9kYXRhID0gJmRpc3BjLnJlZ2lzdGVyZWRfaXNyW2ldOworCisJCWlmIChpc3JfZGF0YS0+aXNyICE9IE5VTEwpCisJCQljb250aW51ZTsKKworCQlpc3JfZGF0YS0+aXNyID0gaXNyOworCQlpc3JfZGF0YS0+YXJnID0gYXJnOworCQlpc3JfZGF0YS0+bWFzayA9IG1hc2s7CisJCXJldCA9IDA7CisKKwkJYnJlYWs7CisJfQorCisJX29tYXBfZGlzcGNfc2V0X2lycXMoKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpc3BjLmlycV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaXNwYy5pcnFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9kaXNwY19yZWdpc3Rlcl9pc3IpOworCitpbnQgb21hcF9kaXNwY191bnJlZ2lzdGVyX2lzcihvbWFwX2Rpc3BjX2lzcl90IGlzciwgdm9pZCAqYXJnLCB1MzIgbWFzaykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAtRUlOVkFMOworCXN0cnVjdCBvbWFwX2Rpc3BjX2lzcl9kYXRhICppc3JfZGF0YTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkaXNwYy5pcnFfbG9jaywgZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IERJU1BDX01BWF9OUl9JU1JTOyBpKyspIHsKKwkJaXNyX2RhdGEgPSAmZGlzcGMucmVnaXN0ZXJlZF9pc3JbaV07CisJCWlmIChpc3JfZGF0YS0+aXNyICE9IGlzciB8fCBpc3JfZGF0YS0+YXJnICE9IGFyZyB8fAorCQkJCWlzcl9kYXRhLT5tYXNrICE9IG1hc2spCisJCQljb250aW51ZTsKKworCQkvKiBmb3VuZCB0aGUgY29ycmVjdCBpc3IgKi8KKworCQlpc3JfZGF0YS0+aXNyID0gTlVMTDsKKwkJaXNyX2RhdGEtPmFyZyA9IE5VTEw7CisJCWlzcl9kYXRhLT5tYXNrID0gMDsKKworCQlyZXQgPSAwOworCQlicmVhazsKKwl9CisKKwlpZiAocmV0ID09IDApCisJCV9vbWFwX2Rpc3BjX3NldF9pcnFzKCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaXNwYy5pcnFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9kaXNwY191bnJlZ2lzdGVyX2lzcik7CisKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgcHJpbnRfaXJxX3N0YXR1cyh1MzIgc3RhdHVzKQoreworCWlmICgoc3RhdHVzICYgZGlzcGMuaXJxX2Vycm9yX21hc2spID09IDApCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0RFQlVHICJESVNQQyBJUlE6IDB4JXg6ICIsIHN0YXR1cyk7CisKKyNkZWZpbmUgUElTKHgpIFwKKwlpZiAoc3RhdHVzICYgRElTUENfSVJRXyMjeCkgXAorCQlwcmludGsoI3ggIiAiKTsKKwlQSVMoR0ZYX0ZJRk9fVU5ERVJGTE9XKTsKKwlQSVMoT0NQX0VSUik7CisJUElTKFZJRDFfRklGT19VTkRFUkZMT1cpOworCVBJUyhWSUQyX0ZJRk9fVU5ERVJGTE9XKTsKKwlQSVMoU1lOQ19MT1NUKTsKKwlQSVMoU1lOQ19MT1NUX0RJR0lUKTsKKyN1bmRlZiBQSVMKKworCXByaW50aygiXG4iKTsKK30KKyNlbmRpZgorCisvKiBDYWxsZWQgZnJvbSBkc3MuYy4gTm90ZSB0aGF0IHdlIGRvbid0IHRvdWNoIGNsb2NrcyBoZXJlLAorICogYnV0IHdlIHByZXN1bWUgdGhleSBhcmUgb24gYmVjYXVzZSB3ZSBnb3QgYW4gSVJRLiBIb3dldmVyLAorICogYW4gaXJxIGhhbmRsZXIgbWF5IHR1cm4gdGhlIGNsb2NrcyBvZmYsIHNvIHdlIG1heSBub3QgaGF2ZQorICogY2xvY2sgbGF0ZXIgaW4gdGhlIGZ1bmN0aW9uLiAqLwordm9pZCBkaXNwY19pcnFfaGFuZGxlcih2b2lkKQoreworCWludCBpOworCXUzMiBpcnFzdGF0dXM7CisJdTMyIGhhbmRsZWRpcnFzID0gMDsKKwl1MzIgdW5oYW5kbGVkX2Vycm9yczsKKwlzdHJ1Y3Qgb21hcF9kaXNwY19pc3JfZGF0YSAqaXNyX2RhdGE7CisJc3RydWN0IG9tYXBfZGlzcGNfaXNyX2RhdGEgcmVnaXN0ZXJlZF9pc3JbRElTUENfTUFYX05SX0lTUlNdOworCisJc3Bpbl9sb2NrKCZkaXNwYy5pcnFfbG9jayk7CisKKwlpcnFzdGF0dXMgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19JUlFTVEFUVVMpOworCisjaWZkZWYgREVCVUcKKwlpZiAoZHNzX2RlYnVnKQorCQlwcmludF9pcnFfc3RhdHVzKGlycXN0YXR1cyk7CisjZW5kaWYKKwkvKiBBY2sgdGhlIGludGVycnVwdC4gRG8gaXQgaGVyZSBiZWZvcmUgY2xvY2tzIGFyZSBwb3NzaWJseSB0dXJuZWQKKwkgKiBvZmYgKi8KKwlkaXNwY193cml0ZV9yZWcoRElTUENfSVJRU1RBVFVTLCBpcnFzdGF0dXMpOworCS8qIGZsdXNoIHBvc3RlZCB3cml0ZSAqLworCWRpc3BjX3JlYWRfcmVnKERJU1BDX0lSUVNUQVRVUyk7CisKKwkvKiBtYWtlIGEgY29weSBhbmQgdW5sb2NrLCBzbyB0aGF0IGlzcnMgY2FuIHVucmVnaXN0ZXIKKwkgKiB0aGVtc2VsdmVzICovCisJbWVtY3B5KHJlZ2lzdGVyZWRfaXNyLCBkaXNwYy5yZWdpc3RlcmVkX2lzciwKKwkJCXNpemVvZihyZWdpc3RlcmVkX2lzcikpOworCisJc3Bpbl91bmxvY2soJmRpc3BjLmlycV9sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBESVNQQ19NQVhfTlJfSVNSUzsgaSsrKSB7CisJCWlzcl9kYXRhID0gJnJlZ2lzdGVyZWRfaXNyW2ldOworCisJCWlmICghaXNyX2RhdGEtPmlzcikKKwkJCWNvbnRpbnVlOworCisJCWlmIChpc3JfZGF0YS0+bWFzayAmIGlycXN0YXR1cykgeworCQkJaXNyX2RhdGEtPmlzcihpc3JfZGF0YS0+YXJnLCBpcnFzdGF0dXMpOworCQkJaGFuZGxlZGlycXMgfD0gaXNyX2RhdGEtPm1hc2s7CisJCX0KKwl9CisKKwlzcGluX2xvY2soJmRpc3BjLmlycV9sb2NrKTsKKworCXVuaGFuZGxlZF9lcnJvcnMgPSBpcnFzdGF0dXMgJiB+aGFuZGxlZGlycXMgJiBkaXNwYy5pcnFfZXJyb3JfbWFzazsKKworCWlmICh1bmhhbmRsZWRfZXJyb3JzKSB7CisJCWRpc3BjLmVycm9yX2lycXMgfD0gdW5oYW5kbGVkX2Vycm9yczsKKworCQlkaXNwYy5pcnFfZXJyb3JfbWFzayAmPSB+dW5oYW5kbGVkX2Vycm9yczsKKwkJX29tYXBfZGlzcGNfc2V0X2lycXMoKTsKKworCQlzY2hlZHVsZV93b3JrKCZkaXNwYy5lcnJvcl93b3JrKTsKKwl9CisKKwlzcGluX3VubG9jaygmZGlzcGMuaXJxX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBkaXNwY19lcnJvcl93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWludCBpOworCXUzMiBlcnJvcnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkaXNwYy5pcnFfbG9jaywgZmxhZ3MpOworCWVycm9ycyA9IGRpc3BjLmVycm9yX2lycXM7CisJZGlzcGMuZXJyb3JfaXJxcyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGlzcGMuaXJxX2xvY2ssIGZsYWdzKTsKKworCWlmIChlcnJvcnMgJiBESVNQQ19JUlFfR0ZYX0ZJRk9fVU5ERVJGTE9XKSB7CisJCURTU0VSUigiR0ZYX0ZJRk9fVU5ERVJGTE9XLCBkaXNhYmxpbmcgR0ZYXG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IG9tYXBfZHNzX2dldF9udW1fb3ZlcmxheXMoKTsgKytpKSB7CisJCQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7CisJCQlvdmwgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheShpKTsKKworCQkJaWYgKCEob3ZsLT5jYXBzICYgT01BUF9EU1NfT1ZMX0NBUF9ESVNQQykpCisJCQkJY29udGludWU7CisKKwkJCWlmIChvdmwtPmlkID09IDApIHsKKwkJCQlkaXNwY19lbmFibGVfcGxhbmUob3ZsLT5pZCwgMCk7CisJCQkJZGlzcGNfZ28ob3ZsLT5tYW5hZ2VyLT5pZCk7CisJCQkJbWRlbGF5KDUwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChlcnJvcnMgJiBESVNQQ19JUlFfVklEMV9GSUZPX1VOREVSRkxPVykgeworCQlEU1NFUlIoIlZJRDFfRklGT19VTkRFUkZMT1csIGRpc2FibGluZyBWSUQxXG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IG9tYXBfZHNzX2dldF9udW1fb3ZlcmxheXMoKTsgKytpKSB7CisJCQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7CisJCQlvdmwgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheShpKTsKKworCQkJaWYgKCEob3ZsLT5jYXBzICYgT01BUF9EU1NfT1ZMX0NBUF9ESVNQQykpCisJCQkJY29udGludWU7CisKKwkJCWlmIChvdmwtPmlkID09IDEpIHsKKwkJCQlkaXNwY19lbmFibGVfcGxhbmUob3ZsLT5pZCwgMCk7CisJCQkJZGlzcGNfZ28ob3ZsLT5tYW5hZ2VyLT5pZCk7CisJCQkJbWRlbGF5KDUwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChlcnJvcnMgJiBESVNQQ19JUlFfVklEMl9GSUZPX1VOREVSRkxPVykgeworCQlEU1NFUlIoIlZJRDJfRklGT19VTkRFUkZMT1csIGRpc2FibGluZyBWSUQyXG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IG9tYXBfZHNzX2dldF9udW1fb3ZlcmxheXMoKTsgKytpKSB7CisJCQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7CisJCQlvdmwgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheShpKTsKKworCQkJaWYgKCEob3ZsLT5jYXBzICYgT01BUF9EU1NfT1ZMX0NBUF9ESVNQQykpCisJCQkJY29udGludWU7CisKKwkJCWlmIChvdmwtPmlkID09IDIpIHsKKwkJCQlkaXNwY19lbmFibGVfcGxhbmUob3ZsLT5pZCwgMCk7CisJCQkJZGlzcGNfZ28ob3ZsLT5tYW5hZ2VyLT5pZCk7CisJCQkJbWRlbGF5KDUwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChlcnJvcnMgJiBESVNQQ19JUlFfU1lOQ19MT1NUKSB7CisJCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWFuYWdlciA9IE5VTEw7CisJCWJvb2wgZW5hYmxlID0gZmFsc2U7CisKKwkJRFNTRVJSKCJTWU5DX0xPU1QsIGRpc2FibGluZyBMQ0RcbiIpOworCisJCWZvciAoaSA9IDA7IGkgPCBvbWFwX2Rzc19nZXRfbnVtX292ZXJsYXlfbWFuYWdlcnMoKTsgKytpKSB7CisJCQlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncjsKKwkJCW1nciA9IG9tYXBfZHNzX2dldF9vdmVybGF5X21hbmFnZXIoaSk7CisKKwkJCWlmIChtZ3ItPmlkID09IE9NQVBfRFNTX0NIQU5ORUxfTENEKSB7CisJCQkJbWFuYWdlciA9IG1ncjsKKwkJCQllbmFibGUgPSBtZ3ItPmRldmljZS0+c3RhdGUgPT0KKwkJCQkJCU9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFOworCQkJCW1nci0+ZGV2aWNlLT5kaXNhYmxlKG1nci0+ZGV2aWNlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChtYW5hZ2VyKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgb21hcF9kc3NfZ2V0X251bV9vdmVybGF5cygpOyArK2kpIHsKKwkJCQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7CisJCQkJb3ZsID0gb21hcF9kc3NfZ2V0X292ZXJsYXkoaSk7CisKKwkJCQlpZiAoIShvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX0RJU1BDKSkKKwkJCQkJY29udGludWU7CisKKwkJCQlpZiAob3ZsLT5pZCAhPSAwICYmIG92bC0+bWFuYWdlciA9PSBtYW5hZ2VyKQorCQkJCQlkaXNwY19lbmFibGVfcGxhbmUob3ZsLT5pZCwgMCk7CisJCQl9CisKKwkJCWRpc3BjX2dvKG1hbmFnZXItPmlkKTsKKwkJCW1kZWxheSg1MCk7CisJCQlpZiAoZW5hYmxlKQorCQkJCW1hbmFnZXItPmRldmljZS0+ZW5hYmxlKG1hbmFnZXItPmRldmljZSk7CisJCX0KKwl9CisKKwlpZiAoZXJyb3JzICYgRElTUENfSVJRX1NZTkNfTE9TVF9ESUdJVCkgeworCQlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1hbmFnZXIgPSBOVUxMOworCQlib29sIGVuYWJsZSA9IGZhbHNlOworCisJCURTU0VSUigiU1lOQ19MT1NUX0RJR0lULCBkaXNhYmxpbmcgVFZcbiIpOworCisJCWZvciAoaSA9IDA7IGkgPCBvbWFwX2Rzc19nZXRfbnVtX292ZXJsYXlfbWFuYWdlcnMoKTsgKytpKSB7CisJCQlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncjsKKwkJCW1nciA9IG9tYXBfZHNzX2dldF9vdmVybGF5X21hbmFnZXIoaSk7CisKKwkJCWlmIChtZ3ItPmlkID09IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpIHsKKwkJCQltYW5hZ2VyID0gbWdyOworCQkJCWVuYWJsZSA9IG1nci0+ZGV2aWNlLT5zdGF0ZSA9PQorCQkJCQkJT01BUF9EU1NfRElTUExBWV9BQ1RJVkU7CisJCQkJbWdyLT5kZXZpY2UtPmRpc2FibGUobWdyLT5kZXZpY2UpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKG1hbmFnZXIpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBvbWFwX2Rzc19nZXRfbnVtX292ZXJsYXlzKCk7ICsraSkgeworCQkJCXN0cnVjdCBvbWFwX292ZXJsYXkgKm92bDsKKwkJCQlvdmwgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheShpKTsKKworCQkJCWlmICghKG92bC0+Y2FwcyAmIE9NQVBfRFNTX09WTF9DQVBfRElTUEMpKQorCQkJCQljb250aW51ZTsKKworCQkJCWlmIChvdmwtPmlkICE9IDAgJiYgb3ZsLT5tYW5hZ2VyID09IG1hbmFnZXIpCisJCQkJCWRpc3BjX2VuYWJsZV9wbGFuZShvdmwtPmlkLCAwKTsKKwkJCX0KKworCQkJZGlzcGNfZ28obWFuYWdlci0+aWQpOworCQkJbWRlbGF5KDUwKTsKKwkJCWlmIChlbmFibGUpCisJCQkJbWFuYWdlci0+ZGV2aWNlLT5lbmFibGUobWFuYWdlci0+ZGV2aWNlKTsKKwkJfQorCX0KKworCWlmIChlcnJvcnMgJiBESVNQQ19JUlFfT0NQX0VSUikgeworCQlEU1NFUlIoIk9DUF9FUlJcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgb21hcF9kc3NfZ2V0X251bV9vdmVybGF5X21hbmFnZXJzKCk7ICsraSkgeworCQkJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3I7CisJCQltZ3IgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheV9tYW5hZ2VyKGkpOworCisJCQlpZiAobWdyLT5jYXBzICYgT01BUF9EU1NfT1ZMX0NBUF9ESVNQQykKKwkJCQltZ3ItPmRldmljZS0+ZGlzYWJsZShtZ3ItPmRldmljZSk7CisJCX0KKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGlzcGMuaXJxX2xvY2ssIGZsYWdzKTsKKwlkaXNwYy5pcnFfZXJyb3JfbWFzayB8PSBlcnJvcnM7CisJX29tYXBfZGlzcGNfc2V0X2lycXMoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaXNwYy5pcnFfbG9jaywgZmxhZ3MpOworfQorCitpbnQgb21hcF9kaXNwY193YWl0X2Zvcl9pcnFfdGltZW91dCh1MzIgaXJxbWFzaywgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCXZvaWQgZGlzcGNfaXJxX3dhaXRfaGFuZGxlcih2b2lkICpkYXRhLCB1MzIgbWFzaykKKwl7CisJCWNvbXBsZXRlKChzdHJ1Y3QgY29tcGxldGlvbiAqKWRhdGEpOworCX0KKworCWludCByOworCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGNvbXBsZXRpb24pOworCisJciA9IG9tYXBfZGlzcGNfcmVnaXN0ZXJfaXNyKGRpc3BjX2lycV93YWl0X2hhbmRsZXIsICZjb21wbGV0aW9uLAorCQkJaXJxbWFzayk7CisKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjb21wbGV0aW9uLCB0aW1lb3V0KTsKKworCW9tYXBfZGlzcGNfdW5yZWdpc3Rlcl9pc3IoZGlzcGNfaXJxX3dhaXRfaGFuZGxlciwgJmNvbXBsZXRpb24sIGlycW1hc2spOworCisJaWYgKHRpbWVvdXQgPT0gMCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlpZiAodGltZW91dCA9PSAtRVJFU1RBUlRTWVMpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG9tYXBfZGlzcGNfd2FpdF9mb3JfaXJxX2ludGVycnVwdGlibGVfdGltZW91dCh1MzIgaXJxbWFzaywKKwkJdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCXZvaWQgZGlzcGNfaXJxX3dhaXRfaGFuZGxlcih2b2lkICpkYXRhLCB1MzIgbWFzaykKKwl7CisJCWNvbXBsZXRlKChzdHJ1Y3QgY29tcGxldGlvbiAqKWRhdGEpOworCX0KKworCWludCByOworCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGNvbXBsZXRpb24pOworCisJciA9IG9tYXBfZGlzcGNfcmVnaXN0ZXJfaXNyKGRpc3BjX2lycV93YWl0X2hhbmRsZXIsICZjb21wbGV0aW9uLAorCQkJaXJxbWFzayk7CisKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJmNvbXBsZXRpb24sCisJCQl0aW1lb3V0KTsKKworCW9tYXBfZGlzcGNfdW5yZWdpc3Rlcl9pc3IoZGlzcGNfaXJxX3dhaXRfaGFuZGxlciwgJmNvbXBsZXRpb24sIGlycW1hc2spOworCisJaWYgKHRpbWVvdXQgPT0gMCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlpZiAodGltZW91dCA9PSAtRVJFU1RBUlRTWVMpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfRkFLRV9WU1lOQwordm9pZCBkaXNwY19mYWtlX3ZzeW5jX2lycSh2b2lkKQoreworCXUzMiBpcnFzdGF0dXMgPSBESVNQQ19JUlFfVlNZTkM7CisJaW50IGk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJZm9yIChpID0gMDsgaSA8IERJU1BDX01BWF9OUl9JU1JTOyBpKyspIHsKKwkJc3RydWN0IG9tYXBfZGlzcGNfaXNyX2RhdGEgKmlzcl9kYXRhOworCQlpc3JfZGF0YSA9ICZkaXNwYy5yZWdpc3RlcmVkX2lzcltpXTsKKworCQlpZiAoIWlzcl9kYXRhLT5pc3IpCisJCQljb250aW51ZTsKKworCQlpZiAoaXNyX2RhdGEtPm1hc2sgJiBpcnFzdGF0dXMpCisJCQlpc3JfZGF0YS0+aXNyKGlzcl9kYXRhLT5hcmcsIGlycXN0YXR1cyk7CisJfQorCisJbG9jYWxfaXJxX2VuYWJsZSgpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIF9vbWFwX2Rpc3BjX2luaXRpYWxpemVfaXJxKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkaXNwYy5pcnFfbG9jaywgZmxhZ3MpOworCisJbWVtc2V0KGRpc3BjLnJlZ2lzdGVyZWRfaXNyLCAwLCBzaXplb2YoZGlzcGMucmVnaXN0ZXJlZF9pc3IpKTsKKworCWRpc3BjLmlycV9lcnJvcl9tYXNrID0gRElTUENfSVJRX01BU0tfRVJST1I7CisKKwkvKiB0aGVyZSdzIFNZTkNfTE9TVF9ESUdJVCB3YWl0aW5nIGFmdGVyIGVuYWJsaW5nIHRoZSBEU1MsCisJICogc28gY2xlYXIgaXQgKi8KKwlkaXNwY193cml0ZV9yZWcoRElTUENfSVJRU1RBVFVTLCBkaXNwY19yZWFkX3JlZyhESVNQQ19JUlFTVEFUVVMpKTsKKworCV9vbWFwX2Rpc3BjX3NldF9pcnFzKCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaXNwYy5pcnFfbG9jaywgZmxhZ3MpOworfQorCit2b2lkIGRpc3BjX2VuYWJsZV9zaWRsZSh2b2lkKQoreworCVJFR19GTERfTU9EKERJU1BDX1NZU0NPTkZJRywgMiwgNCwgMyk7CS8qIFNJRExFTU9ERTogc21hcnQgaWRsZSAqLworfQorCit2b2lkIGRpc3BjX2Rpc2FibGVfc2lkbGUodm9pZCkKK3sKKwlSRUdfRkxEX01PRChESVNQQ19TWVNDT05GSUcsIDEsIDQsIDMpOwkvKiBTSURMRU1PREU6IG5vIGlkbGUgKi8KK30KKworc3RhdGljIHZvaWQgX29tYXBfZGlzcGNfaW5pdGlhbF9jb25maWcodm9pZCkKK3sKKwl1MzIgbDsKKworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19TWVNDT05GSUcpOworCWwgPSBGTERfTU9EKGwsIDIsIDEzLCAxMik7CS8qIE1JRExFTU9ERTogc21hcnQgc3RhbmRieSAqLworCWwgPSBGTERfTU9EKGwsIDIsIDQsIDMpOwkvKiBTSURMRU1PREU6IHNtYXJ0IGlkbGUgKi8KKwlsID0gRkxEX01PRChsLCAxLCAyLCAyKTsJLyogRU5XQUtFVVAgKi8KKwlsID0gRkxEX01PRChsLCAxLCAwLCAwKTsJLyogQVVUT0lETEUgKi8KKwlkaXNwY193cml0ZV9yZWcoRElTUENfU1lTQ09ORklHLCBsKTsKKworCS8qIEZVTkNHQVRFRCAqLworCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRywgMSwgOSwgOSk7CisKKwkvKiBMMyBmaXJld2FsbCBzZXR0aW5nOiBlbmFibGUgYWNjZXNzIHRvIE9DTSBSQU0gKi8KKwkvKiBYWFggdGhpcyBzaG91bGQgYmUgc29tZXdoZXJlIGluIHBsYXQtb21hcCAqLworCWlmIChjcHVfaXNfb21hcDI0eHgoKSkKKwkJX19yYXdfd3JpdGVsKDB4NDAyMDAwYjAsIE9NQVAyX0wzX0lPX0FERFJFU1MoMHg2ODAwNTBhMCkpOworCisJX2Rpc3BjX3NldHVwX2NvbG9yX2NvbnZfY29lZigpOworCisJZGlzcGNfc2V0X2xvYWRtb2RlKE9NQVBfRFNTX0xPQURfRlJBTUVfT05MWSk7CisKKwlkaXNwY19yZWFkX3BsYW5lX2ZpZm9fc2l6ZXMoKTsKK30KKworaW50IGRpc3BjX2luaXQodm9pZCkKK3sKKwl1MzIgcmV2OworCisJc3Bpbl9sb2NrX2luaXQoJmRpc3BjLmlycV9sb2NrKTsKKworCUlOSVRfV09SSygmZGlzcGMuZXJyb3Jfd29yaywgZGlzcGNfZXJyb3Jfd29ya2VyKTsKKworCWRpc3BjLmJhc2UgPSBpb3JlbWFwKERJU1BDX0JBU0UsIERJU1BDX1NaX1JFR1MpOworCWlmICghZGlzcGMuYmFzZSkgeworCQlEU1NFUlIoImNhbid0IGlvcmVtYXAgRElTUENcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwllbmFibGVfY2xvY2tzKDEpOworCisJX29tYXBfZGlzcGNfaW5pdGlhbF9jb25maWcoKTsKKworCV9vbWFwX2Rpc3BjX2luaXRpYWxpemVfaXJxKCk7CisKKwlkaXNwY19zYXZlX2NvbnRleHQoKTsKKworCXJldiA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX1JFVklTSU9OKTsKKwlwcmludGsoS0VSTl9JTkZPICJPTUFQIERJU1BDIHJldiAlZC4lZFxuIiwKKwkgICAgICAgRkxEX0dFVChyZXYsIDcsIDQpLCBGTERfR0VUKHJldiwgMywgMCkpOworCisJZW5hYmxlX2Nsb2NrcygwKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGRpc3BjX2V4aXQodm9pZCkKK3sKKwlpb3VubWFwKGRpc3BjLmJhc2UpOworfQorCitpbnQgZGlzcGNfZW5hYmxlX3BsYW5lKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgYm9vbCBlbmFibGUpCit7CisJRFNTREJHKCJkaXNwY19lbmFibGVfcGxhbmUgJWQsICVkXG4iLCBwbGFuZSwgZW5hYmxlKTsKKworCWVuYWJsZV9jbG9ja3MoMSk7CisJX2Rpc3BjX2VuYWJsZV9wbGFuZShwbGFuZSwgZW5hYmxlKTsKKwllbmFibGVfY2xvY2tzKDApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkaXNwY19zZXR1cF9wbGFuZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCisJCSAgICAgICB1MzIgcGFkZHIsIHUxNiBzY3JlZW5fd2lkdGgsCisJCSAgICAgICB1MTYgcG9zX3gsIHUxNiBwb3NfeSwKKwkJICAgICAgIHUxNiB3aWR0aCwgdTE2IGhlaWdodCwKKwkJICAgICAgIHUxNiBvdXRfd2lkdGgsIHUxNiBvdXRfaGVpZ2h0LAorCQkgICAgICAgZW51bSBvbWFwX2NvbG9yX21vZGUgY29sb3JfbW9kZSwKKwkJICAgICAgIGJvb2wgaWxhY2UsCisJCSAgICAgICBlbnVtIG9tYXBfZHNzX3JvdGF0aW9uX3R5cGUgcm90YXRpb25fdHlwZSwKKwkJICAgICAgIHU4IHJvdGF0aW9uLCBib29sIG1pcnJvciwgdTggZ2xvYmFsX2FscGhhKQoreworCWludCByID0gMDsKKworCURTU0RCRygiZGlzcGNfc2V0dXBfcGxhbmUgJWQsIHBhICV4LCBzdyAlZCwgJWQsJWQsICVkeCVkIC0+ICIKKwkgICAgICAgIiVkeCVkLCBpbGFjZSAlZCwgY21vZGUgJXgsIHJvdCAlZCwgbWlyICVkXG4iLAorCSAgICAgICBwbGFuZSwgcGFkZHIsIHNjcmVlbl93aWR0aCwgcG9zX3gsIHBvc195LAorCSAgICAgICB3aWR0aCwgaGVpZ2h0LAorCSAgICAgICBvdXRfd2lkdGgsIG91dF9oZWlnaHQsCisJICAgICAgIGlsYWNlLCBjb2xvcl9tb2RlLAorCSAgICAgICByb3RhdGlvbiwgbWlycm9yKTsKKworCWVuYWJsZV9jbG9ja3MoMSk7CisKKwlyID0gX2Rpc3BjX3NldHVwX3BsYW5lKHBsYW5lLAorCQkJICAgcGFkZHIsIHNjcmVlbl93aWR0aCwKKwkJCSAgIHBvc194LCBwb3NfeSwKKwkJCSAgIHdpZHRoLCBoZWlnaHQsCisJCQkgICBvdXRfd2lkdGgsIG91dF9oZWlnaHQsCisJCQkgICBjb2xvcl9tb2RlLCBpbGFjZSwKKwkJCSAgIHJvdGF0aW9uX3R5cGUsCisJCQkgICByb3RhdGlvbiwgbWlycm9yLAorCQkJICAgZ2xvYmFsX2FscGhhKTsKKworCWVuYWJsZV9jbG9ja3MoMCk7CisKKwlyZXR1cm4gcjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BsYXkuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjkyYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZGlzcGxheS5jCkBAIC0wLDAgKzEsNjcxIEBACisvKgorICogbGludXgvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZGlzcGxheS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IFRvbWkgVmFsa2VpbmVuIDx0b21pLnZhbGtlaW5lbkBub2tpYS5jb20+CisgKgorICogU29tZSBjb2RlIGFuZCBpZGVhcyB0YWtlbiBmcm9tIGRyaXZlcnMvdmlkZW8vb21hcC8gZHJpdmVyCisgKiBieSBJbXJlIERlYWsuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjZGVmaW5lIERTU19TVUJTWVNfTkFNRSAiRElTUExBWSIKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxwbGF0L2Rpc3BsYXkuaD4KKyNpbmNsdWRlICJkc3MuaCIKKworc3RhdGljIExJU1RfSEVBRChkaXNwbGF5X2xpc3QpOworCitzdGF0aWMgc3NpemVfdCBkaXNwbGF5X2VuYWJsZWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gdG9fZHNzX2RldmljZShkZXYpOworCWJvb2wgZW5hYmxlZCA9IGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9ESVNBQkxFRDsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBlbmFibGVkKTsKK30KKworc3RhdGljIHNzaXplX3QgZGlzcGxheV9lbmFibGVkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gdG9fZHNzX2RldmljZShkZXYpOworCWJvb2wgZW5hYmxlZCwgcjsKKworCWVuYWJsZWQgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWlmIChlbmFibGVkICE9IChkc3NkZXYtPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfRElTQUJMRUQpKSB7CisJCWlmIChlbmFibGVkKSB7CisJCQlyID0gZHNzZGV2LT5lbmFibGUoZHNzZGV2KTsKKwkJCWlmIChyKQorCQkJCXJldHVybiByOworCQl9IGVsc2UgeworCQkJZHNzZGV2LT5kaXNhYmxlKGRzc2Rldik7CisJCX0KKwl9CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3QgZGlzcGxheV91cGRfbW9kZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSB0b19kc3NfZGV2aWNlKGRldik7CisJZW51bSBvbWFwX2Rzc191cGRhdGVfbW9kZSBtb2RlID0gT01BUF9EU1NfVVBEQVRFX0FVVE87CisJaWYgKGRzc2Rldi0+Z2V0X3VwZGF0ZV9tb2RlKQorCQltb2RlID0gZHNzZGV2LT5nZXRfdXBkYXRlX21vZGUoZHNzZGV2KTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgbW9kZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRpc3BsYXlfdXBkX21vZGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSB0b19kc3NfZGV2aWNlKGRldik7CisJaW50IHZhbCwgcjsKKwllbnVtIG9tYXBfZHNzX3VwZGF0ZV9tb2RlIG1vZGU7CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCXN3aXRjaCAodmFsKSB7CisJY2FzZSBPTUFQX0RTU19VUERBVEVfRElTQUJMRUQ6CisJY2FzZSBPTUFQX0RTU19VUERBVEVfQVVUTzoKKwljYXNlIE9NQVBfRFNTX1VQREFURV9NQU5VQUw6CisJCW1vZGUgPSAoZW51bSBvbWFwX2Rzc191cGRhdGVfbW9kZSl2YWw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXIgPSBkc3NkZXYtPnNldF91cGRhdGVfbW9kZShkc3NkZXYsIG1vZGUpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBkaXNwbGF5X3RlYXJfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gdG9fZHNzX2RldmljZShkZXYpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLAorCQkJZHNzZGV2LT5nZXRfdGUgPyBkc3NkZXYtPmdldF90ZShkc3NkZXYpIDogMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRpc3BsYXlfdGVhcl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiA9IHRvX2Rzc19kZXZpY2UoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHRlOworCWludCByOworCisJaWYgKCFkc3NkZXYtPmVuYWJsZV90ZSB8fCAhZHNzZGV2LT5nZXRfdGUpCisJCXJldHVybiAtRU5PRU5UOworCisJdGUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOworCisJciA9IGRzc2Rldi0+ZW5hYmxlX3RlKGRzc2RldiwgdGUpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBkaXNwbGF5X3RpbWluZ3Nfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gdG9fZHNzX2RldmljZShkZXYpOworCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgdDsKKworCWlmICghZHNzZGV2LT5nZXRfdGltaW5ncykKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlkc3NkZXYtPmdldF90aW1pbmdzKGRzc2RldiwgJnQpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXUsJXUvJXUvJXUvJXUsJXUvJXUvJXUvJXVcbiIsCisJCQl0LnBpeGVsX2Nsb2NrLAorCQkJdC54X3JlcywgdC5oZnAsIHQuaGJwLCB0LmhzdywKKwkJCXQueV9yZXMsIHQudmZwLCB0LnZicCwgdC52c3cpOworfQorCitzdGF0aWMgc3NpemVfdCBkaXNwbGF5X3RpbWluZ3Nfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSB0b19kc3NfZGV2aWNlKGRldik7CisJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyB0OworCWludCByLCBmb3VuZDsKKworCWlmICghZHNzZGV2LT5zZXRfdGltaW5ncyB8fCAhZHNzZGV2LT5jaGVja190aW1pbmdzKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWZvdW5kID0gMDsKKyNpZmRlZiBDT05GSUdfT01BUDJfRFNTX1ZFTkMKKwlpZiAoc3RybmNtcCgicGFsIiwgYnVmLCAzKSA9PSAwKSB7CisJCXQgPSBvbWFwX2Rzc19wYWxfdGltaW5nczsKKwkJZm91bmQgPSAxOworCX0gZWxzZSBpZiAoc3RybmNtcCgibnRzYyIsIGJ1ZiwgNCkgPT0gMCkgeworCQl0ID0gb21hcF9kc3NfbnRzY190aW1pbmdzOworCQlmb3VuZCA9IDE7CisJfQorI2VuZGlmCisJaWYgKCFmb3VuZCAmJiBzc2NhbmYoYnVmLCAiJXUsJWh1LyVodS8laHUvJWh1LCVodS8laHUvJWh1LyVodSIsCisJCQkJJnQucGl4ZWxfY2xvY2ssCisJCQkJJnQueF9yZXMsICZ0LmhmcCwgJnQuaGJwLCAmdC5oc3csCisJCQkJJnQueV9yZXMsICZ0LnZmcCwgJnQudmJwLCAmdC52c3cpICE9IDkpCisJCXJldHVybiAtRUlOVkFMOworCisJciA9IGRzc2Rldi0+Y2hlY2tfdGltaW5ncyhkc3NkZXYsICZ0KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlkc3NkZXYtPnNldF90aW1pbmdzKGRzc2RldiwgJnQpOworCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRpc3BsYXlfcm90YXRlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiA9IHRvX2Rzc19kZXZpY2UoZGV2KTsKKwlpbnQgcm90YXRlOworCWlmICghZHNzZGV2LT5nZXRfcm90YXRlKQorCQlyZXR1cm4gLUVOT0VOVDsKKwlyb3RhdGUgPSBkc3NkZXYtPmdldF9yb3RhdGUoZHNzZGV2KTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgcm90YXRlKTsKK30KKworc3RhdGljIHNzaXplX3QgZGlzcGxheV9yb3RhdGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSB0b19kc3NfZGV2aWNlKGRldik7CisJdW5zaWduZWQgbG9uZyByb3Q7CisJaW50IHI7CisKKwlpZiAoIWRzc2Rldi0+c2V0X3JvdGF0ZSB8fCAhZHNzZGV2LT5nZXRfcm90YXRlKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJvdCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisKKwlyID0gZHNzZGV2LT5zZXRfcm90YXRlKGRzc2Rldiwgcm90KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3QgZGlzcGxheV9taXJyb3Jfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gdG9fZHNzX2RldmljZShkZXYpOworCWludCBtaXJyb3I7CisJaWYgKCFkc3NkZXYtPmdldF9taXJyb3IpCisJCXJldHVybiAtRU5PRU5UOworCW1pcnJvciA9IGRzc2Rldi0+Z2V0X21pcnJvcihkc3NkZXYpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCBtaXJyb3IpOworfQorCitzdGF0aWMgc3NpemVfdCBkaXNwbGF5X21pcnJvcl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiA9IHRvX2Rzc19kZXZpY2UoZGV2KTsKKwl1bnNpZ25lZCBsb25nIG1pcnJvcjsKKwlpbnQgcjsKKworCWlmICghZHNzZGV2LT5zZXRfbWlycm9yIHx8ICFkc3NkZXYtPmdldF9taXJyb3IpCisJCXJldHVybiAtRU5PRU5UOworCisJbWlycm9yID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKKworCXIgPSBkc3NkZXYtPnNldF9taXJyb3IoZHNzZGV2LCBtaXJyb3IpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBkaXNwbGF5X3dzc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSB0b19kc3NfZGV2aWNlKGRldik7CisJdW5zaWduZWQgaW50IHdzczsKKworCWlmICghZHNzZGV2LT5nZXRfd3NzKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXdzcyA9IGRzc2Rldi0+Z2V0X3dzcyhkc3NkZXYpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHglMDV4XG4iLCB3c3MpOworfQorCitzdGF0aWMgc3NpemVfdCBkaXNwbGF5X3dzc19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiA9IHRvX2Rzc19kZXZpY2UoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHdzczsKKwlpbnQgcjsKKworCWlmICghZHNzZGV2LT5nZXRfd3NzIHx8ICFkc3NkZXYtPnNldF93c3MpCisJCXJldHVybiAtRU5PRU5UOworCisJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJndzcykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdzcyA+IDB4ZmZmZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJciA9IGRzc2Rldi0+c2V0X3dzcyhkc3NkZXYsIHdzcyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihlbmFibGVkLCBTX0lSVUdPfFNfSVdVU1IsCisJCWRpc3BsYXlfZW5hYmxlZF9zaG93LCBkaXNwbGF5X2VuYWJsZWRfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHVwZGF0ZV9tb2RlLCBTX0lSVUdPfFNfSVdVU1IsCisJCWRpc3BsYXlfdXBkX21vZGVfc2hvdywgZGlzcGxheV91cGRfbW9kZV9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVhcl9lbGltLCBTX0lSVUdPfFNfSVdVU1IsCisJCWRpc3BsYXlfdGVhcl9zaG93LCBkaXNwbGF5X3RlYXJfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHRpbWluZ3MsIFNfSVJVR098U19JV1VTUiwKKwkJZGlzcGxheV90aW1pbmdzX3Nob3csIGRpc3BsYXlfdGltaW5nc19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocm90YXRlLCBTX0lSVUdPfFNfSVdVU1IsCisJCWRpc3BsYXlfcm90YXRlX3Nob3csIGRpc3BsYXlfcm90YXRlX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihtaXJyb3IsIFNfSVJVR098U19JV1VTUiwKKwkJZGlzcGxheV9taXJyb3Jfc2hvdywgZGlzcGxheV9taXJyb3Jfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHdzcywgU19JUlVHT3xTX0lXVVNSLAorCQlkaXNwbGF5X3dzc19zaG93LCBkaXNwbGF5X3dzc19zdG9yZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGlzcGxheV9zeXNmc19hdHRyc1tdID0geworCSZkZXZfYXR0cl9lbmFibGVkLAorCSZkZXZfYXR0cl91cGRhdGVfbW9kZSwKKwkmZGV2X2F0dHJfdGVhcl9lbGltLAorCSZkZXZfYXR0cl90aW1pbmdzLAorCSZkZXZfYXR0cl9yb3RhdGUsCisJJmRldl9hdHRyX21pcnJvciwKKwkmZGV2X2F0dHJfd3NzLAorCU5VTEwKK307CisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfZ2V0X3Jlc29sdXRpb24oc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQkJdTE2ICp4cmVzLCB1MTYgKnlyZXMpCit7CisJKnhyZXMgPSBkc3NkZXYtPnBhbmVsLnRpbWluZ3MueF9yZXM7CisJKnlyZXMgPSBkc3NkZXYtPnBhbmVsLnRpbWluZ3MueV9yZXM7Cit9CisKK3ZvaWQgZGVmYXVsdF9nZXRfb3ZlcmxheV9maWZvX3RocmVzaG9sZHMoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAorCQl1MzIgZmlmb19zaXplLCBlbnVtIG9tYXBfYnVyc3Rfc2l6ZSAqYnVyc3Rfc2l6ZSwKKwkJdTMyICpmaWZvX2xvdywgdTMyICpmaWZvX2hpZ2gpCit7CisJdW5zaWduZWQgYnVyc3Rfc2l6ZV9ieXRlczsKKworCSpidXJzdF9zaXplID0gT01BUF9EU1NfQlVSU1RfMTZ4MzI7CisJYnVyc3Rfc2l6ZV9ieXRlcyA9IDE2ICogMzIgLyA4OworCisJKmZpZm9faGlnaCA9IGZpZm9fc2l6ZSAtIDE7CisJKmZpZm9fbG93ID0gZmlmb19zaXplIC0gYnVyc3Rfc2l6ZV9ieXRlczsKK30KKworc3RhdGljIGludCBkZWZhdWx0X3dhaXRfdnN5bmMoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoNTAwKTsKKwl1MzIgaXJxOworCisJaWYgKGRzc2Rldi0+dHlwZSA9PSBPTUFQX0RJU1BMQVlfVFlQRV9WRU5DKQorCQlpcnEgPSBESVNQQ19JUlFfRVZTWU5DX09ERDsKKwllbHNlCisJCWlycSA9IERJU1BDX0lSUV9WU1lOQzsKKworCXJldHVybiBvbWFwX2Rpc3BjX3dhaXRfZm9yX2lycV9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaXJxLCB0aW1lb3V0KTsKK30KKworc3RhdGljIGludCBkZWZhdWx0X2dldF9yZWNvbW1lbmRlZF9icHAoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWlmIChkc3NkZXYtPnBhbmVsLnJlY29tbWVuZGVkX2JwcCkKKwkJcmV0dXJuIGRzc2Rldi0+cGFuZWwucmVjb21tZW5kZWRfYnBwOworCisJc3dpdGNoIChkc3NkZXYtPnR5cGUpIHsKKwljYXNlIE9NQVBfRElTUExBWV9UWVBFX0RQSToKKwkJaWYgKGRzc2Rldi0+cGh5LmRwaS5kYXRhX2xpbmVzID09IDI0KQorCQkJcmV0dXJuIDI0OworCQllbHNlCisJCQlyZXR1cm4gMTY7CisKKwljYXNlIE9NQVBfRElTUExBWV9UWVBFX0RCSToKKwljYXNlIE9NQVBfRElTUExBWV9UWVBFX0RTSToKKwkJaWYgKGRzc2Rldi0+Y3RybC5waXhlbF9zaXplID09IDI0KQorCQkJcmV0dXJuIDI0OworCQllbHNlCisJCQlyZXR1cm4gMTY7CisJY2FzZSBPTUFQX0RJU1BMQVlfVFlQRV9WRU5DOgorCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfU0RJOgorCQlyZXR1cm4gMjQ7CisJCXJldHVybiAyNDsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9CisKKy8qIENoZWNrcyBpZiByZXBsaWNhdGlvbiBsb2dpYyBzaG91bGQgYmUgdXNlZC4gT25seSB1c2UgZm9yIGFjdGl2ZSBtYXRyaXgsCisgKiB3aGVuIG92ZXJsYXkgaXMgaW4gUkdCMTJVIG9yIFJHQjE2IG1vZGUsIGFuZCBMQ0QgaW50ZXJmYWNlIGlzCisgKiAxOGJwcCBvciAyNGJwcCAqLworYm9vbCBkc3NfdXNlX3JlcGxpY2F0aW9uKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJZW51bSBvbWFwX2NvbG9yX21vZGUgbW9kZSkKK3sKKwlpbnQgYnBwOworCisJaWYgKG1vZGUgIT0gT01BUF9EU1NfQ09MT1JfUkdCMTJVICYmIG1vZGUgIT0gT01BUF9EU1NfQ09MT1JfUkdCMTYpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChkc3NkZXYtPnR5cGUgPT0gT01BUF9ESVNQTEFZX1RZUEVfRFBJICYmCisJCQkoZHNzZGV2LT5wYW5lbC5jb25maWcgJiBPTUFQX0RTU19MQ0RfVEZUKSA9PSAwKQorCQlyZXR1cm4gZmFsc2U7CisKKwlzd2l0Y2ggKGRzc2Rldi0+dHlwZSkgeworCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfRFBJOgorCQlicHAgPSBkc3NkZXYtPnBoeS5kcGkuZGF0YV9saW5lczsKKwkJYnJlYWs7CisJY2FzZSBPTUFQX0RJU1BMQVlfVFlQRV9WRU5DOgorCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfU0RJOgorCQlicHAgPSAyNDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQX0RJU1BMQVlfVFlQRV9EQkk6CisJY2FzZSBPTUFQX0RJU1BMQVlfVFlQRV9EU0k6CisJCWJwcCA9IGRzc2Rldi0+Y3RybC5waXhlbF9zaXplOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlyZXR1cm4gYnBwID4gMTY7Cit9CisKK3ZvaWQgZHNzX2luaXRfZGV2aWNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cjsKKwlpbnQgaTsKKwlpbnQgcjsKKworCXN3aXRjaCAoZHNzZGV2LT50eXBlKSB7CisJY2FzZSBPTUFQX0RJU1BMQVlfVFlQRV9EUEk6CisjaWZkZWYgQ09ORklHX09NQVAyX0RTU19SRkJJCisJY2FzZSBPTUFQX0RJU1BMQVlfVFlQRV9EQkk6CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfT01BUDJfRFNTX1NESQorCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfU0RJOgorI2VuZGlmCisjaWZkZWYgQ09ORklHX09NQVAyX0RTU19EU0kKKwljYXNlIE9NQVBfRElTUExBWV9UWVBFX0RTSToKKyNlbmRpZgorI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfVkVOQworCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfVkVOQzoKKyNlbmRpZgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlEU1NFUlIoIlN1cHBvcnQgZm9yIGRpc3BsYXkgJyVzJyBub3QgY29tcGlsZWQgaW4uXG4iLAorCQkJCWRzc2Rldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlkc3NkZXYtPmdldF9yZXNvbHV0aW9uID0gZGVmYXVsdF9nZXRfcmVzb2x1dGlvbjsKKwlkc3NkZXYtPmdldF9yZWNvbW1lbmRlZF9icHAgPSBkZWZhdWx0X2dldF9yZWNvbW1lbmRlZF9icHA7CisJZHNzZGV2LT53YWl0X3ZzeW5jID0gZGVmYXVsdF93YWl0X3ZzeW5jOworCisJc3dpdGNoIChkc3NkZXYtPnR5cGUpIHsKKwljYXNlIE9NQVBfRElTUExBWV9UWVBFX0RQSToKKwkJciA9IGRwaV9pbml0X2Rpc3BsYXkoZHNzZGV2KTsKKwkJYnJlYWs7CisjaWZkZWYgQ09ORklHX09NQVAyX0RTU19SRkJJCisJY2FzZSBPTUFQX0RJU1BMQVlfVFlQRV9EQkk6CisJCXIgPSByZmJpX2luaXRfZGlzcGxheShkc3NkZXYpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfVkVOQworCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfVkVOQzoKKwkJciA9IHZlbmNfaW5pdF9kaXNwbGF5KGRzc2Rldik7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX09NQVAyX0RTU19TREkKKwljYXNlIE9NQVBfRElTUExBWV9UWVBFX1NESToKKwkJciA9IHNkaV9pbml0X2Rpc3BsYXkoZHNzZGV2KTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfT01BUDJfRFNTX0RTSQorCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfRFNJOgorCQlyID0gZHNpX2luaXRfZGlzcGxheShkc3NkZXYpOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCWlmIChyKSB7CisJCURTU0VSUigiZmFpbGVkIHRvIGluaXQgZGlzcGxheSAlc1xuIiwgZHNzZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGNyZWF0ZSBkZXZpY2Ugc3lzZnMgZmlsZXMgKi8KKwlpID0gMDsKKwl3aGlsZSAoKGF0dHIgPSBkaXNwbGF5X3N5c2ZzX2F0dHJzW2krK10pICE9IE5VTEwpIHsKKwkJciA9IGRldmljZV9jcmVhdGVfZmlsZSgmZHNzZGV2LT5kZXYsIGF0dHIpOworCQlpZiAocikKKwkJCURTU0VSUigiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBmaWxlXG4iKTsKKwl9CisKKwkvKiBjcmVhdGUgZGlzcGxheT8gc3lzZnMgbGlua3MgKi8KKwlyID0gc3lzZnNfY3JlYXRlX2xpbmsoJnBkZXYtPmRldi5rb2JqLCAmZHNzZGV2LT5kZXYua29iaiwKKwkJCWRldl9uYW1lKCZkc3NkZXYtPmRldikpOworCWlmIChyKQorCQlEU1NFUlIoImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZGlzcGxheSBsaW5rXG4iKTsKK30KKwordm9pZCBkc3NfdW5pbml0X2RldmljZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHI7CisJaW50IGkgPSAwOworCisJc3lzZnNfcmVtb3ZlX2xpbmsoJnBkZXYtPmRldi5rb2JqLCBkZXZfbmFtZSgmZHNzZGV2LT5kZXYpKTsKKworCXdoaWxlICgoYXR0ciA9IGRpc3BsYXlfc3lzZnNfYXR0cnNbaSsrXSkgIT0gTlVMTCkKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZkc3NkZXYtPmRldiwgYXR0cik7CisKKwlpZiAoZHNzZGV2LT5tYW5hZ2VyKQorCQlkc3NkZXYtPm1hbmFnZXItPnVuc2V0X2RldmljZShkc3NkZXYtPm1hbmFnZXIpOworfQorCitzdGF0aWMgaW50IGRzc19zdXNwZW5kX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJaW50IHI7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gdG9fZHNzX2RldmljZShkZXYpOworCisJaWYgKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpIHsKKwkJZHNzZGV2LT5hY3RpdmF0ZV9hZnRlcl9yZXN1bWUgPSBmYWxzZTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFkc3NkZXYtPnN1c3BlbmQpIHsKKwkJRFNTRVJSKCJkaXNwbGF5ICclcycgZG9lc24ndCBpbXBsZW1lbnQgc3VzcGVuZFxuIiwKKwkJCQlkc3NkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKKwlyID0gZHNzZGV2LT5zdXNwZW5kKGRzc2Rldik7CisJaWYgKHIpCisJCXJldHVybiByOworCisJZHNzZGV2LT5hY3RpdmF0ZV9hZnRlcl9yZXN1bWUgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkc3Nfc3VzcGVuZF9hbGxfZGV2aWNlcyh2b2lkKQoreworCWludCByOworCXN0cnVjdCBidXNfdHlwZSAqYnVzID0gZHNzX2dldF9idXMoKTsKKworCXIgPSBidXNfZm9yX2VhY2hfZGV2KGJ1cywgTlVMTCwgTlVMTCwgZHNzX3N1c3BlbmRfZGV2aWNlKTsKKwlpZiAocikgeworCQkvKiByZXN1bWUgYWxsIGRpc3BsYXlzIHRoYXQgd2VyZSBzdXNwZW5kZWQgKi8KKwkJZHNzX3Jlc3VtZV9hbGxfZGV2aWNlcygpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc3NfcmVzdW1lX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJaW50IHI7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gdG9fZHNzX2RldmljZShkZXYpOworCisJaWYgKGRzc2Rldi0+YWN0aXZhdGVfYWZ0ZXJfcmVzdW1lICYmIGRzc2Rldi0+cmVzdW1lKSB7CisJCXIgPSBkc3NkZXYtPnJlc3VtZShkc3NkZXYpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKworCWRzc2Rldi0+YWN0aXZhdGVfYWZ0ZXJfcmVzdW1lID0gZmFsc2U7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRzc19yZXN1bWVfYWxsX2RldmljZXModm9pZCkKK3sKKwlzdHJ1Y3QgYnVzX3R5cGUgKmJ1cyA9IGRzc19nZXRfYnVzKCk7CisKKwlyZXR1cm4gYnVzX2Zvcl9lYWNoX2RldihidXMsIE5VTEwsIE5VTEwsIGRzc19yZXN1bWVfZGV2aWNlKTsKK30KKworc3RhdGljIGludCBkc3NfZGlzYWJsZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiA9IHRvX2Rzc19kZXZpY2UoZGV2KTsKKwlkc3NkZXYtPmRpc2FibGUoZHNzZGV2KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkc3NfZGlzYWJsZV9hbGxfZGV2aWNlcyh2b2lkKQoreworCXN0cnVjdCBidXNfdHlwZSAqYnVzID0gZHNzX2dldF9idXMoKTsKKwlidXNfZm9yX2VhY2hfZGV2KGJ1cywgTlVMTCwgTlVMTCwgZHNzX2Rpc2FibGVfZGV2aWNlKTsKK30KKworCit2b2lkIG9tYXBfZHNzX2dldF9kZXZpY2Uoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWdldF9kZXZpY2UoJmRzc2Rldi0+ZGV2KTsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9kc3NfZ2V0X2RldmljZSk7CisKK3ZvaWQgb21hcF9kc3NfcHV0X2RldmljZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJcHV0X2RldmljZSgmZHNzZGV2LT5kZXYpOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2Rzc19wdXRfZGV2aWNlKTsKKworLyogcmVmIGNvdW50IG9mIHRoZSBmb3VuZCBkZXZpY2UgaXMgaW5jcmVtZW50ZWQuIHJlZiBjb3VudAorICogb2YgZnJvbS1kZXZpY2UgaXMgZGVjcmVtZW50ZWQuICovCitzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpvbWFwX2Rzc19nZXRfbmV4dF9kZXZpY2Uoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZnJvbSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGRldmljZSAqZGV2X3N0YXJ0ID0gTlVMTDsKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSBOVUxMOworCisJaW50IG1hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKKwl7CisJCS8qIHNraXAgcGFuZWxzIGNvbm5lY3RlZCB0byBjb250cm9sbGVycyAqLworCQlpZiAodG9fZHNzX2RldmljZShkZXYpLT5wYW5lbC5jdHJsKQorCQkJcmV0dXJuIDA7CisKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGZyb20pCisJCWRldl9zdGFydCA9ICZmcm9tLT5kZXY7CisJZGV2ID0gYnVzX2ZpbmRfZGV2aWNlKGRzc19nZXRfYnVzKCksIGRldl9zdGFydCwgTlVMTCwgbWF0Y2gpOworCWlmIChkZXYpCisJCWRzc2RldiA9IHRvX2Rzc19kZXZpY2UoZGV2KTsKKwlpZiAoZnJvbSkKKwkJcHV0X2RldmljZSgmZnJvbS0+ZGV2KTsKKworCXJldHVybiBkc3NkZXY7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZHNzX2dldF9uZXh0X2RldmljZSk7CisKK3N0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKm9tYXBfZHNzX2ZpbmRfZGV2aWNlKHZvaWQgKmRhdGEsCisJCWludCAoKm1hdGNoKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIHZvaWQgKmRhdGEpKQoreworCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiA9IE5VTEw7CisKKwl3aGlsZSAoKGRzc2RldiA9IG9tYXBfZHNzX2dldF9uZXh0X2RldmljZShkc3NkZXYpKSAhPSBOVUxMKSB7CisJCWlmIChtYXRjaChkc3NkZXYsIGRhdGEpKQorCQkJcmV0dXJuIGRzc2RldjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9kc3NfZmluZF9kZXZpY2UpOworCitpbnQgb21hcF9kc3Nfc3RhcnRfZGV2aWNlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlpbnQgcjsKKworCWlmICghZHNzZGV2LT5kcml2ZXIpIHsKKwkJRFNTREJHKCJubyBkcml2ZXJcbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBlcnIwOworCX0KKworCWlmIChkc3NkZXYtPmN0cmwucGFuZWwgJiYgIWRzc2Rldi0+Y3RybC5wYW5lbC0+ZHJpdmVyKSB7CisJCURTU0RCRygibm8gcGFuZWwgZHJpdmVyXG4iKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyMDsKKwl9CisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRzc2Rldi0+ZGV2LmRyaXZlci0+b3duZXIpKSB7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIGVycjA7CisJfQorCisJaWYgKGRzc2Rldi0+Y3RybC5wYW5lbCkgeworCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRzc2Rldi0+Y3RybC5wYW5lbC0+ZGV2LmRyaXZlci0+b3duZXIpKSB7CisJCQlyID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyMTsKKwkJfQorCX0KKworCXJldHVybiAwOworZXJyMToKKwltb2R1bGVfcHV0KGRzc2Rldi0+ZGV2LmRyaXZlci0+b3duZXIpOworZXJyMDoKKwlyZXR1cm4gcjsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9kc3Nfc3RhcnRfZGV2aWNlKTsKKwordm9pZCBvbWFwX2Rzc19zdG9wX2RldmljZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJaWYgKGRzc2Rldi0+Y3RybC5wYW5lbCkKKwkJbW9kdWxlX3B1dChkc3NkZXYtPmN0cmwucGFuZWwtPmRldi5kcml2ZXItPm93bmVyKTsKKworCW1vZHVsZV9wdXQoZHNzZGV2LT5kZXYuZHJpdmVyLT5vd25lcik7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZHNzX3N0b3BfZGV2aWNlKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHBpLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDcxMDMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHBpLmMKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kcGkuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBUb21pIFZhbGtlaW5lbiA8dG9taS52YWxrZWluZW5Abm9raWEuY29tPgorICoKKyAqIFNvbWUgY29kZSBhbmQgaWRlYXMgdGFrZW4gZnJvbSBkcml2ZXJzL3ZpZGVvL29tYXAvIGRyaXZlcgorICogYnkgSW1yZSBEZWFrLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2RlZmluZSBEU1NfU1VCU1lTX05BTUUgIkRQSSIKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworI2luY2x1ZGUgPHBsYXQvZGlzcGxheS5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisKKyNpbmNsdWRlICJkc3MuaCIKKworc3RhdGljIHN0cnVjdCB7CisJaW50IHVwZGF0ZV9lbmFibGVkOworfSBkcGk7CisKKyNpZmRlZiBDT05GSUdfT01BUDJfRFNTX1VTRV9EU0lfUExMCitzdGF0aWMgaW50IGRwaV9zZXRfZHNpX2Nsayhib29sIGlzX3RmdCwgdW5zaWduZWQgbG9uZyBwY2tfcmVxLAorCQl1bnNpZ25lZCBsb25nICpmY2ssIGludCAqbGNrX2RpdiwgaW50ICpwY2tfZGl2KQoreworCXN0cnVjdCBkc2lfY2xvY2tfaW5mbyBkc2lfY2luZm87CisJc3RydWN0IGRpc3BjX2Nsb2NrX2luZm8gZGlzcGNfY2luZm87CisJaW50IHI7CisKKwlyID0gZHNpX3BsbF9jYWxjX2Nsb2NrX2Rpdl9wY2soaXNfdGZ0LCBwY2tfcmVxLCAmZHNpX2NpbmZvLAorCQkJJmRpc3BjX2NpbmZvKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gZHNpX3BsbF9zZXRfY2xvY2tfZGl2KCZkc2lfY2luZm8pOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWRzc19zZWxlY3RfY2xrX3NvdXJjZSgwLCAxKTsKKworCXIgPSBkaXNwY19zZXRfY2xvY2tfZGl2KCZkaXNwY19jaW5mbyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJKmZjayA9IGRzaV9jaW5mby5kc2kxX3BsbF9mY2xrOworCSpsY2tfZGl2ID0gZGlzcGNfY2luZm8ubGNrX2RpdjsKKwkqcGNrX2RpdiA9IGRpc3BjX2NpbmZvLnBja19kaXY7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW50IGRwaV9zZXRfZGlzcGNfY2xrKGJvb2wgaXNfdGZ0LCB1bnNpZ25lZCBsb25nIHBja19yZXEsCisJCXVuc2lnbmVkIGxvbmcgKmZjaywgaW50ICpsY2tfZGl2LCBpbnQgKnBja19kaXYpCit7CisJc3RydWN0IGRzc19jbG9ja19pbmZvIGRzc19jaW5mbzsKKwlzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyBkaXNwY19jaW5mbzsKKwlpbnQgcjsKKworCXIgPSBkc3NfY2FsY19jbG9ja19kaXYoaXNfdGZ0LCBwY2tfcmVxLCAmZHNzX2NpbmZvLCAmZGlzcGNfY2luZm8pOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBkc3Nfc2V0X2Nsb2NrX2RpdigmZHNzX2NpbmZvKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gZGlzcGNfc2V0X2Nsb2NrX2RpdigmZGlzcGNfY2luZm8pOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCSpmY2sgPSBkc3NfY2luZm8uZmNrOworCSpsY2tfZGl2ID0gZGlzcGNfY2luZm8ubGNrX2RpdjsKKwkqcGNrX2RpdiA9IGRpc3BjX2NpbmZvLnBja19kaXY7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGRwaV9zZXRfbW9kZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdCA9ICZkc3NkZXYtPnBhbmVsLnRpbWluZ3M7CisJaW50IGxja19kaXYsIHBja19kaXY7CisJdW5zaWduZWQgbG9uZyBmY2s7CisJdW5zaWduZWQgbG9uZyBwY2s7CisJYm9vbCBpc190ZnQ7CisJaW50IHIgPSAwOworCisJZHNzX2Nsa19lbmFibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSzEpOworCisJZGlzcGNfc2V0X3BvbF9mcmVxKGRzc2Rldi0+cGFuZWwuY29uZmlnLCBkc3NkZXYtPnBhbmVsLmFjYmksCisJCQlkc3NkZXYtPnBhbmVsLmFjYik7CisKKwlpc190ZnQgPSAoZHNzZGV2LT5wYW5lbC5jb25maWcgJiBPTUFQX0RTU19MQ0RfVEZUKSAhPSAwOworCisjaWZkZWYgQ09ORklHX09NQVAyX0RTU19VU0VfRFNJX1BMTAorCXIgPSBkcGlfc2V0X2RzaV9jbGsoaXNfdGZ0LCB0LT5waXhlbF9jbG9jayAqIDEwMDAsCisJCQkmZmNrLCAmbGNrX2RpdiwgJnBja19kaXYpOworI2Vsc2UKKwlyID0gZHBpX3NldF9kaXNwY19jbGsoaXNfdGZ0LCB0LT5waXhlbF9jbG9jayAqIDEwMDAsCisJCQkmZmNrLCAmbGNrX2RpdiwgJnBja19kaXYpOworI2VuZGlmCisJaWYgKHIpCisJCWdvdG8gZXJyMDsKKworCXBjayA9IGZjayAvIGxja19kaXYgLyBwY2tfZGl2IC8gMTAwMDsKKworCWlmIChwY2sgIT0gdC0+cGl4ZWxfY2xvY2spIHsKKwkJRFNTV0FSTigiQ291bGQgbm90IGZpbmQgZXhhY3QgcGl4ZWwgY2xvY2suICIKKwkJCQkiUmVxdWVzdGVkICVkIGtIeiwgZ290ICVsdSBrSHpcbiIsCisJCQkJdC0+cGl4ZWxfY2xvY2ssIHBjayk7CisKKwkJdC0+cGl4ZWxfY2xvY2sgPSBwY2s7CisJfQorCisJZGlzcGNfc2V0X2xjZF90aW1pbmdzKHQpOworCitlcnIwOgorCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLMSk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgZHBpX2Jhc2ljX2luaXQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWJvb2wgaXNfdGZ0OworCisJaXNfdGZ0ID0gKGRzc2Rldi0+cGFuZWwuY29uZmlnICYgT01BUF9EU1NfTENEX1RGVCkgIT0gMDsKKworCWRpc3BjX3NldF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZShPTUFQX0RTU19QQVJBTExFTE1PREVfQllQQVNTKTsKKwlkaXNwY19zZXRfbGNkX2Rpc3BsYXlfdHlwZShpc190ZnQgPyBPTUFQX0RTU19MQ0RfRElTUExBWV9URlQgOgorCQkJT01BUF9EU1NfTENEX0RJU1BMQVlfU1ROKTsKKwlkaXNwY19zZXRfdGZ0X2RhdGFfbGluZXMoZHNzZGV2LT5waHkuZHBpLmRhdGFfbGluZXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHBpX2Rpc3BsYXlfZW5hYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlpbnQgcjsKKworCXIgPSBvbWFwX2Rzc19zdGFydF9kZXZpY2UoZHNzZGV2KTsKKwlpZiAocikgeworCQlEU1NFUlIoImZhaWxlZCB0byBzdGFydCBkZXZpY2VcbiIpOworCQlnb3RvIGVycjA7CisJfQorCisJaWYgKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9ESVNBQkxFRCkgeworCQlEU1NFUlIoImRpc3BsYXkgYWxyZWFkeSBlbmFibGVkXG4iKTsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlkc3NfY2xrX2VuYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLMSk7CisKKwlyID0gZHBpX2Jhc2ljX2luaXQoZHNzZGV2KTsKKwlpZiAocikKKwkJZ290byBlcnIyOworCisjaWZkZWYgQ09ORklHX09NQVAyX0RTU19VU0VfRFNJX1BMTAorCWRzc19jbGtfZW5hYmxlKERTU19DTEtfRkNLMik7CisJciA9IGRzaV9wbGxfaW5pdChkc3NkZXYsIDAsIDEpOworCWlmIChyKQorCQlnb3RvIGVycjM7CisjZW5kaWYKKwlyID0gZHBpX3NldF9tb2RlKGRzc2Rldik7CisJaWYgKHIpCisJCWdvdG8gZXJyNDsKKworCW1kZWxheSgyKTsKKworCWRpc3BjX2VuYWJsZV9sY2Rfb3V0KDEpOworCisJciA9IGRzc2Rldi0+ZHJpdmVyLT5lbmFibGUoZHNzZGV2KTsKKwlpZiAocikKKwkJZ290byBlcnI1OworCisJZHNzZGV2LT5zdGF0ZSA9IE9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFOworCisJcmV0dXJuIDA7CisKK2VycjU6CisJZGlzcGNfZW5hYmxlX2xjZF9vdXQoMCk7CitlcnI0OgorI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfVVNFX0RTSV9QTEwKKwlkc2lfcGxsX3VuaW5pdCgpOworZXJyMzoKKwlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19GQ0syKTsKKyNlbmRpZgorZXJyMjoKKwlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSzEpOworZXJyMToKKwlvbWFwX2Rzc19zdG9wX2RldmljZShkc3NkZXYpOworZXJyMDoKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBkcGlfZGlzcGxheV9yZXN1bWUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KTsKKworc3RhdGljIHZvaWQgZHBpX2Rpc3BsYXlfZGlzYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJaWYgKGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9ESVNBQkxFRCkKKwkJcmV0dXJuOworCisJaWYgKGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9TVVNQRU5ERUQpCisJCWRwaV9kaXNwbGF5X3Jlc3VtZShkc3NkZXYpOworCisJZHNzZGV2LT5kcml2ZXItPmRpc2FibGUoZHNzZGV2KTsKKworCWRpc3BjX2VuYWJsZV9sY2Rfb3V0KDApOworCisjaWZkZWYgQ09ORklHX09NQVAyX0RTU19VU0VfRFNJX1BMTAorCWRzc19zZWxlY3RfY2xrX3NvdXJjZSgwLCAwKTsKKwlkc2lfcGxsX3VuaW5pdCgpOworCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0ZDSzIpOworI2VuZGlmCisKKwlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSzEpOworCisJZHNzZGV2LT5zdGF0ZSA9IE9NQVBfRFNTX0RJU1BMQVlfRElTQUJMRUQ7CisKKwlvbWFwX2Rzc19zdG9wX2RldmljZShkc3NkZXYpOworfQorCitzdGF0aWMgaW50IGRwaV9kaXNwbGF5X3N1c3BlbmQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWlmIChkc3NkZXYtPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCURTU0RCRygiZHBpX2Rpc3BsYXlfc3VzcGVuZFxuIik7CisKKwlpZiAoZHNzZGV2LT5kcml2ZXItPnN1c3BlbmQpCisJCWRzc2Rldi0+ZHJpdmVyLT5zdXNwZW5kKGRzc2Rldik7CisKKwlkaXNwY19lbmFibGVfbGNkX291dCgwKTsKKworCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLMSk7CisKKwlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9TVVNQRU5ERUQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcGlfZGlzcGxheV9yZXN1bWUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWlmIChkc3NkZXYtPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCURTU0RCRygiZHBpX2Rpc3BsYXlfcmVzdW1lXG4iKTsKKworCWRzc19jbGtfZW5hYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0sxKTsKKworCWRpc3BjX2VuYWJsZV9sY2Rfb3V0KDEpOworCisJaWYgKGRzc2Rldi0+ZHJpdmVyLT5yZXN1bWUpCisJCWRzc2Rldi0+ZHJpdmVyLT5yZXN1bWUoZHNzZGV2KTsKKworCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkcGlfc2V0X3RpbWluZ3Moc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKK3sKKwlEU1NEQkcoImRwaV9zZXRfdGltaW5nc1xuIik7CisJZHNzZGV2LT5wYW5lbC50aW1pbmdzID0gKnRpbWluZ3M7CisJaWYgKGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpIHsKKwkJZHBpX3NldF9tb2RlKGRzc2Rldik7CisJCWRpc3BjX2dvKE9NQVBfRFNTX0NIQU5ORUxfTENEKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHBpX2NoZWNrX3RpbWluZ3Moc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKK3sKKwlib29sIGlzX3RmdDsKKwlpbnQgcjsKKwlpbnQgbGNrX2RpdiwgcGNrX2RpdjsKKwl1bnNpZ25lZCBsb25nIGZjazsKKwl1bnNpZ25lZCBsb25nIHBjazsKKworCWlmICghZGlzcGNfbGNkX3RpbWluZ3Nfb2sodGltaW5ncykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRpbWluZ3MtPnBpeGVsX2Nsb2NrID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaXNfdGZ0ID0gKGRzc2Rldi0+cGFuZWwuY29uZmlnICYgT01BUF9EU1NfTENEX1RGVCkgIT0gMDsKKworI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfVVNFX0RTSV9QTEwKKwl7CisJCXN0cnVjdCBkc2lfY2xvY2tfaW5mbyBkc2lfY2luZm87CisJCXN0cnVjdCBkaXNwY19jbG9ja19pbmZvIGRpc3BjX2NpbmZvOworCQlyID0gZHNpX3BsbF9jYWxjX2Nsb2NrX2Rpdl9wY2soaXNfdGZ0LAorCQkJCXRpbWluZ3MtPnBpeGVsX2Nsb2NrICogMTAwMCwKKwkJCQkmZHNpX2NpbmZvLCAmZGlzcGNfY2luZm8pOworCisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisKKwkJZmNrID0gZHNpX2NpbmZvLmRzaTFfcGxsX2ZjbGs7CisJCWxja19kaXYgPSBkaXNwY19jaW5mby5sY2tfZGl2OworCQlwY2tfZGl2ID0gZGlzcGNfY2luZm8ucGNrX2RpdjsKKwl9CisjZWxzZQorCXsKKwkJc3RydWN0IGRzc19jbG9ja19pbmZvIGRzc19jaW5mbzsKKwkJc3RydWN0IGRpc3BjX2Nsb2NrX2luZm8gZGlzcGNfY2luZm87CisJCXIgPSBkc3NfY2FsY19jbG9ja19kaXYoaXNfdGZ0LCB0aW1pbmdzLT5waXhlbF9jbG9jayAqIDEwMDAsCisJCQkJJmRzc19jaW5mbywgJmRpc3BjX2NpbmZvKTsKKworCQlpZiAocikKKwkJCXJldHVybiByOworCisJCWZjayA9IGRzc19jaW5mby5mY2s7CisJCWxja19kaXYgPSBkaXNwY19jaW5mby5sY2tfZGl2OworCQlwY2tfZGl2ID0gZGlzcGNfY2luZm8ucGNrX2RpdjsKKwl9CisjZW5kaWYKKworCXBjayA9IGZjayAvIGxja19kaXYgLyBwY2tfZGl2IC8gMTAwMDsKKworCXRpbWluZ3MtPnBpeGVsX2Nsb2NrID0gcGNrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRwaV9nZXRfdGltaW5ncyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCisJCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKQoreworCSp0aW1pbmdzID0gZHNzZGV2LT5wYW5lbC50aW1pbmdzOworfQorCitzdGF0aWMgaW50IGRwaV9kaXNwbGF5X3NldF91cGRhdGVfbW9kZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCisJCWVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUgbW9kZSkKK3sKKwlpZiAobW9kZSA9PSBPTUFQX0RTU19VUERBVEVfTUFOVUFMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtb2RlID09IE9NQVBfRFNTX1VQREFURV9ESVNBQkxFRCkgeworCQlkaXNwY19lbmFibGVfbGNkX291dCgwKTsKKwkJZHBpLnVwZGF0ZV9lbmFibGVkID0gMDsKKwl9IGVsc2UgeworCQlkaXNwY19lbmFibGVfbGNkX291dCgxKTsKKwkJZHBpLnVwZGF0ZV9lbmFibGVkID0gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUgZHBpX2Rpc3BsYXlfZ2V0X3VwZGF0ZV9tb2RlKAorCQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJcmV0dXJuIGRwaS51cGRhdGVfZW5hYmxlZCA/IE9NQVBfRFNTX1VQREFURV9BVVRPIDoKKwkJT01BUF9EU1NfVVBEQVRFX0RJU0FCTEVEOworfQorCitpbnQgZHBpX2luaXRfZGlzcGxheShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJRFNTREJHKCJpbml0X2Rpc3BsYXlcbiIpOworCisJZHNzZGV2LT5lbmFibGUgPSBkcGlfZGlzcGxheV9lbmFibGU7CisJZHNzZGV2LT5kaXNhYmxlID0gZHBpX2Rpc3BsYXlfZGlzYWJsZTsKKwlkc3NkZXYtPnN1c3BlbmQgPSBkcGlfZGlzcGxheV9zdXNwZW5kOworCWRzc2Rldi0+cmVzdW1lID0gZHBpX2Rpc3BsYXlfcmVzdW1lOworCWRzc2Rldi0+c2V0X3RpbWluZ3MgPSBkcGlfc2V0X3RpbWluZ3M7CisJZHNzZGV2LT5jaGVja190aW1pbmdzID0gZHBpX2NoZWNrX3RpbWluZ3M7CisJZHNzZGV2LT5nZXRfdGltaW5ncyA9IGRwaV9nZXRfdGltaW5nczsKKwlkc3NkZXYtPnNldF91cGRhdGVfbW9kZSA9IGRwaV9kaXNwbGF5X3NldF91cGRhdGVfbW9kZTsKKwlkc3NkZXYtPmdldF91cGRhdGVfbW9kZSA9IGRwaV9kaXNwbGF5X2dldF91cGRhdGVfbW9kZTsKKworCXJldHVybiAwOworfQorCitpbnQgZHBpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkcGlfZXhpdCh2b2lkKQoreworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc2kuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2RzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MzY0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc2kuYwpAQCAtMCwwICsxLDM3MTAgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc2kuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBUb21pIFZhbGtlaW5lbiA8dG9taS52YWxrZWluZW5Abm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2RlZmluZSBEU1NfU1VCU1lTX05BTUUgIkRTSSIKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2luY2x1ZGUgPHBsYXQvZGlzcGxheS5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKworI2luY2x1ZGUgImRzcy5oIgorCisvKiNkZWZpbmUgVkVSQk9TRV9JUlEqLworI2RlZmluZSBEU0lfQ0FUQ0hfTUlTU0lOR19URQorCisjZGVmaW5lIERTSV9CQVNFCQkweDQ4MDRGQzAwCisKK3N0cnVjdCBkc2lfcmVnIHsgdTE2IGlkeDsgfTsKKworI2RlZmluZSBEU0lfUkVHKGlkeCkJCSgoY29uc3Qgc3RydWN0IGRzaV9yZWcpIHsgaWR4IH0pCisKKyNkZWZpbmUgRFNJX1NaX1JFR1MJCVNaXzFLCisvKiBEU0kgUHJvdG9jb2wgRW5naW5lICovCisKKyNkZWZpbmUgRFNJX1JFVklTSU9OCQkJRFNJX1JFRygweDAwMDApCisjZGVmaW5lIERTSV9TWVNDT05GSUcJCQlEU0lfUkVHKDB4MDAxMCkKKyNkZWZpbmUgRFNJX1NZU1NUQVRVUwkJCURTSV9SRUcoMHgwMDE0KQorI2RlZmluZSBEU0lfSVJRU1RBVFVTCQkJRFNJX1JFRygweDAwMTgpCisjZGVmaW5lIERTSV9JUlFFTkFCTEUJCQlEU0lfUkVHKDB4MDAxQykKKyNkZWZpbmUgRFNJX0NUUkwJCQlEU0lfUkVHKDB4MDA0MCkKKyNkZWZpbmUgRFNJX0NPTVBMRVhJT19DRkcxCQlEU0lfUkVHKDB4MDA0OCkKKyNkZWZpbmUgRFNJX0NPTVBMRVhJT19JUlFfU1RBVFVTCURTSV9SRUcoMHgwMDRDKQorI2RlZmluZSBEU0lfQ09NUExFWElPX0lSUV9FTkFCTEUJRFNJX1JFRygweDAwNTApCisjZGVmaW5lIERTSV9DTEtfQ1RSTAkJCURTSV9SRUcoMHgwMDU0KQorI2RlZmluZSBEU0lfVElNSU5HMQkJCURTSV9SRUcoMHgwMDU4KQorI2RlZmluZSBEU0lfVElNSU5HMgkJCURTSV9SRUcoMHgwMDVDKQorI2RlZmluZSBEU0lfVk1fVElNSU5HMQkJCURTSV9SRUcoMHgwMDYwKQorI2RlZmluZSBEU0lfVk1fVElNSU5HMgkJCURTSV9SRUcoMHgwMDY0KQorI2RlZmluZSBEU0lfVk1fVElNSU5HMwkJCURTSV9SRUcoMHgwMDY4KQorI2RlZmluZSBEU0lfQ0xLX1RJTUlORwkJCURTSV9SRUcoMHgwMDZDKQorI2RlZmluZSBEU0lfVFhfRklGT19WQ19TSVpFCQlEU0lfUkVHKDB4MDA3MCkKKyNkZWZpbmUgRFNJX1JYX0ZJRk9fVkNfU0laRQkJRFNJX1JFRygweDAwNzQpCisjZGVmaW5lIERTSV9DT01QTEVYSU9fQ0ZHMgkJRFNJX1JFRygweDAwNzgpCisjZGVmaW5lIERTSV9SWF9GSUZPX1ZDX0ZVTExORVNTCQlEU0lfUkVHKDB4MDA3QykKKyNkZWZpbmUgRFNJX1ZNX1RJTUlORzQJCQlEU0lfUkVHKDB4MDA4MCkKKyNkZWZpbmUgRFNJX1RYX0ZJRk9fVkNfRU1QVElORVNTCURTSV9SRUcoMHgwMDg0KQorI2RlZmluZSBEU0lfVk1fVElNSU5HNQkJCURTSV9SRUcoMHgwMDg4KQorI2RlZmluZSBEU0lfVk1fVElNSU5HNgkJCURTSV9SRUcoMHgwMDhDKQorI2RlZmluZSBEU0lfVk1fVElNSU5HNwkJCURTSV9SRUcoMHgwMDkwKQorI2RlZmluZSBEU0lfU1RPUENMS19USU1JTkcJCURTSV9SRUcoMHgwMDk0KQorI2RlZmluZSBEU0lfVkNfQ1RSTChuKQkJCURTSV9SRUcoMHgwMTAwICsgKG4gKiAweDIwKSkKKyNkZWZpbmUgRFNJX1ZDX1RFKG4pCQkJRFNJX1JFRygweDAxMDQgKyAobiAqIDB4MjApKQorI2RlZmluZSBEU0lfVkNfTE9OR19QQUNLRVRfSEVBREVSKG4pCURTSV9SRUcoMHgwMTA4ICsgKG4gKiAweDIwKSkKKyNkZWZpbmUgRFNJX1ZDX0xPTkdfUEFDS0VUX1BBWUxPQUQobikJRFNJX1JFRygweDAxMEMgKyAobiAqIDB4MjApKQorI2RlZmluZSBEU0lfVkNfU0hPUlRfUEFDS0VUX0hFQURFUihuKQlEU0lfUkVHKDB4MDExMCArIChuICogMHgyMCkpCisjZGVmaW5lIERTSV9WQ19JUlFTVEFUVVMobikJCURTSV9SRUcoMHgwMTE4ICsgKG4gKiAweDIwKSkKKyNkZWZpbmUgRFNJX1ZDX0lSUUVOQUJMRShuKQkJRFNJX1JFRygweDAxMUMgKyAobiAqIDB4MjApKQorCisvKiBEU0lQSFlfU0NQICovCisKKyNkZWZpbmUgRFNJX0RTSVBIWV9DRkcwCQkJRFNJX1JFRygweDIwMCArIDB4MDAwMCkKKyNkZWZpbmUgRFNJX0RTSVBIWV9DRkcxCQkJRFNJX1JFRygweDIwMCArIDB4MDAwNCkKKyNkZWZpbmUgRFNJX0RTSVBIWV9DRkcyCQkJRFNJX1JFRygweDIwMCArIDB4MDAwOCkKKyNkZWZpbmUgRFNJX0RTSVBIWV9DRkc1CQkJRFNJX1JFRygweDIwMCArIDB4MDAxNCkKKworLyogRFNJX1BMTF9DVFJMX1NDUCAqLworCisjZGVmaW5lIERTSV9QTExfQ09OVFJPTAkJCURTSV9SRUcoMHgzMDAgKyAweDAwMDApCisjZGVmaW5lIERTSV9QTExfU1RBVFVTCQkJRFNJX1JFRygweDMwMCArIDB4MDAwNCkKKyNkZWZpbmUgRFNJX1BMTF9HTwkJCURTSV9SRUcoMHgzMDAgKyAweDAwMDgpCisjZGVmaW5lIERTSV9QTExfQ09ORklHVVJBVElPTjEJCURTSV9SRUcoMHgzMDAgKyAweDAwMEMpCisjZGVmaW5lIERTSV9QTExfQ09ORklHVVJBVElPTjIJCURTSV9SRUcoMHgzMDAgKyAweDAwMTApCisKKyNkZWZpbmUgUkVHX0dFVChpZHgsIHN0YXJ0LCBlbmQpIFwKKwlGTERfR0VUKGRzaV9yZWFkX3JlZyhpZHgpLCBzdGFydCwgZW5kKQorCisjZGVmaW5lIFJFR19GTERfTU9EKGlkeCwgdmFsLCBzdGFydCwgZW5kKSBcCisJZHNpX3dyaXRlX3JlZyhpZHgsIEZMRF9NT0QoZHNpX3JlYWRfcmVnKGlkeCksIHZhbCwgc3RhcnQsIGVuZCkpCisKKy8qIEdsb2JhbCBpbnRlcnJ1cHRzICovCisjZGVmaW5lIERTSV9JUlFfVkMwCQkoMSA8PCAwKQorI2RlZmluZSBEU0lfSVJRX1ZDMQkJKDEgPDwgMSkKKyNkZWZpbmUgRFNJX0lSUV9WQzIJCSgxIDw8IDIpCisjZGVmaW5lIERTSV9JUlFfVkMzCQkoMSA8PCAzKQorI2RlZmluZSBEU0lfSVJRX1dBS0VVUAkJKDEgPDwgNCkKKyNkZWZpbmUgRFNJX0lSUV9SRVNZTkMJCSgxIDw8IDUpCisjZGVmaW5lIERTSV9JUlFfUExMX0xPQ0sJKDEgPDwgNykKKyNkZWZpbmUgRFNJX0lSUV9QTExfVU5MT0NLCSgxIDw8IDgpCisjZGVmaW5lIERTSV9JUlFfUExMX1JFQ0FMTAkoMSA8PCA5KQorI2RlZmluZSBEU0lfSVJRX0NPTVBMRVhJT19FUlIJKDEgPDwgMTApCisjZGVmaW5lIERTSV9JUlFfSFNfVFhfVElNRU9VVAkoMSA8PCAxNCkKKyNkZWZpbmUgRFNJX0lSUV9MUF9SWF9USU1FT1VUCSgxIDw8IDE1KQorI2RlZmluZSBEU0lfSVJRX1RFX1RSSUdHRVIJKDEgPDwgMTYpCisjZGVmaW5lIERTSV9JUlFfQUNLX1RSSUdHRVIJKDEgPDwgMTcpCisjZGVmaW5lIERTSV9JUlFfU1lOQ19MT1NUCSgxIDw8IDE4KQorI2RlZmluZSBEU0lfSVJRX0xET19QT1dFUl9HT09ECSgxIDw8IDE5KQorI2RlZmluZSBEU0lfSVJRX1RBX1RJTUVPVVQJKDEgPDwgMjApCisjZGVmaW5lIERTSV9JUlFfRVJST1JfTUFTSyBcCisJKERTSV9JUlFfSFNfVFhfVElNRU9VVCB8IERTSV9JUlFfTFBfUlhfVElNRU9VVCB8IERTSV9JUlFfU1lOQ19MT1NUIHwgXAorCURTSV9JUlFfVEFfVElNRU9VVCkKKyNkZWZpbmUgRFNJX0lSUV9DSEFOTkVMX01BU0sJMHhmCisKKy8qIFZpcnR1YWwgY2hhbm5lbCBpbnRlcnJ1cHRzICovCisjZGVmaW5lIERTSV9WQ19JUlFfQ1MJCSgxIDw8IDApCisjZGVmaW5lIERTSV9WQ19JUlFfRUNDX0NPUlIJKDEgPDwgMSkKKyNkZWZpbmUgRFNJX1ZDX0lSUV9QQUNLRVRfU0VOVAkoMSA8PCAyKQorI2RlZmluZSBEU0lfVkNfSVJRX0ZJRk9fVFhfT1ZGCSgxIDw8IDMpCisjZGVmaW5lIERTSV9WQ19JUlFfRklGT19SWF9PVkYJKDEgPDwgNCkKKyNkZWZpbmUgRFNJX1ZDX0lSUV9CVEEJCSgxIDw8IDUpCisjZGVmaW5lIERTSV9WQ19JUlFfRUNDX05PX0NPUlIJKDEgPDwgNikKKyNkZWZpbmUgRFNJX1ZDX0lSUV9GSUZPX1RYX1VERgkoMSA8PCA3KQorI2RlZmluZSBEU0lfVkNfSVJRX1BQX0JVU1lfQ0hBTkdFICgxIDw8IDgpCisjZGVmaW5lIERTSV9WQ19JUlFfRVJST1JfTUFTSyBcCisJKERTSV9WQ19JUlFfQ1MgfCBEU0lfVkNfSVJRX0VDQ19DT1JSIHwgRFNJX1ZDX0lSUV9GSUZPX1RYX09WRiB8IFwKKwlEU0lfVkNfSVJRX0ZJRk9fUlhfT1ZGIHwgRFNJX1ZDX0lSUV9FQ0NfTk9fQ09SUiB8IFwKKwlEU0lfVkNfSVJRX0ZJRk9fVFhfVURGKQorCisvKiBDb21wbGV4SU8gaW50ZXJydXB0cyAqLworI2RlZmluZSBEU0lfQ0lPX0lSUV9FUlJTWU5DRVNDMQkJKDEgPDwgMCkKKyNkZWZpbmUgRFNJX0NJT19JUlFfRVJSU1lOQ0VTQzIJCSgxIDw8IDEpCisjZGVmaW5lIERTSV9DSU9fSVJRX0VSUlNZTkNFU0MzCQkoMSA8PCAyKQorI2RlZmluZSBEU0lfQ0lPX0lSUV9FUlJFU0MxCQkoMSA8PCA1KQorI2RlZmluZSBEU0lfQ0lPX0lSUV9FUlJFU0MyCQkoMSA8PCA2KQorI2RlZmluZSBEU0lfQ0lPX0lSUV9FUlJFU0MzCQkoMSA8PCA3KQorI2RlZmluZSBEU0lfQ0lPX0lSUV9FUlJDT05UUk9MMQkJKDEgPDwgMTApCisjZGVmaW5lIERTSV9DSU9fSVJRX0VSUkNPTlRST0wyCQkoMSA8PCAxMSkKKyNkZWZpbmUgRFNJX0NJT19JUlFfRVJSQ09OVFJPTDMJCSgxIDw8IDEyKQorI2RlZmluZSBEU0lfQ0lPX0lSUV9TVEFURVVMUFMxCQkoMSA8PCAxNSkKKyNkZWZpbmUgRFNJX0NJT19JUlFfU1RBVEVVTFBTMgkJKDEgPDwgMTYpCisjZGVmaW5lIERTSV9DSU9fSVJRX1NUQVRFVUxQUzMJCSgxIDw8IDE3KQorI2RlZmluZSBEU0lfQ0lPX0lSUV9FUlJDT05URU5USU9OTFAwXzEJKDEgPDwgMjApCisjZGVmaW5lIERTSV9DSU9fSVJRX0VSUkNPTlRFTlRJT05MUDFfMQkoMSA8PCAyMSkKKyNkZWZpbmUgRFNJX0NJT19JUlFfRVJSQ09OVEVOVElPTkxQMF8yCSgxIDw8IDIyKQorI2RlZmluZSBEU0lfQ0lPX0lSUV9FUlJDT05URU5USU9OTFAxXzIJKDEgPDwgMjMpCisjZGVmaW5lIERTSV9DSU9fSVJRX0VSUkNPTlRFTlRJT05MUDBfMwkoMSA8PCAyNCkKKyNkZWZpbmUgRFNJX0NJT19JUlFfRVJSQ09OVEVOVElPTkxQMV8zCSgxIDw8IDI1KQorI2RlZmluZSBEU0lfQ0lPX0lSUV9VTFBTQUNUSVZFTk9UX0FMTDAJKDEgPDwgMzApCisjZGVmaW5lIERTSV9DSU9fSVJRX1VMUFNBQ1RJVkVOT1RfQUxMMQkoMSA8PCAzMSkKKworI2RlZmluZSBEU0lfRFRfRENTX1NIT1JUX1dSSVRFXzAJMHgwNQorI2RlZmluZSBEU0lfRFRfRENTX1NIT1JUX1dSSVRFXzEJMHgxNQorI2RlZmluZSBEU0lfRFRfRENTX1JFQUQJCQkweDA2CisjZGVmaW5lIERTSV9EVF9TRVRfTUFYX1JFVF9QS0dfU0laRQkweDM3CisjZGVmaW5lIERTSV9EVF9OVUxMX1BBQ0tFVAkJMHgwOQorI2RlZmluZSBEU0lfRFRfRENTX0xPTkdfV1JJVEUJCTB4MzkKKworI2RlZmluZSBEU0lfRFRfUlhfQUNLX1dJVEhfRVJSCQkweDAyCisjZGVmaW5lIERTSV9EVF9SWF9EQ1NfTE9OR19SRUFECQkweDFjCisjZGVmaW5lIERTSV9EVF9SWF9TSE9SVF9SRUFEXzEJCTB4MjEKKyNkZWZpbmUgRFNJX0RUX1JYX1NIT1JUX1JFQURfMgkJMHgyMgorCisjZGVmaW5lIEZJTlRfTUFYIDIxMDAwMDAKKyNkZWZpbmUgRklOVF9NSU4gNzUwMDAwCisjZGVmaW5lIFJFR05fTUFYICgxIDw8IDcpCisjZGVmaW5lIFJFR01fTUFYICgoMSA8PCAxMSkgLSAxKQorI2RlZmluZSBSRUdNM19NQVggKDEgPDwgNCkKKyNkZWZpbmUgUkVHTTRfTUFYICgxIDw8IDQpCisjZGVmaW5lIExQX0RJVl9NQVggKCgxIDw8IDEzKSAtIDEpCisKK2VudW0gZmlmb19zaXplIHsKKwlEU0lfRklGT19TSVpFXzAJCT0gMCwKKwlEU0lfRklGT19TSVpFXzMyCT0gMSwKKwlEU0lfRklGT19TSVpFXzY0CT0gMiwKKwlEU0lfRklGT19TSVpFXzk2CT0gMywKKwlEU0lfRklGT19TSVpFXzEyOAk9IDQsCit9OworCitlbnVtIGRzaV92Y19tb2RlIHsKKwlEU0lfVkNfTU9ERV9MNCA9IDAsCisJRFNJX1ZDX01PREVfVlAsCit9OworCitzdHJ1Y3QgZHNpX3VwZGF0ZV9yZWdpb24geworCWJvb2wgZGlydHk7CisJdTE2IHgsIHksIHcsIGg7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGV2aWNlOworfTsKKworc3RhdGljIHN0cnVjdAoreworCXZvaWQgX19pb21lbQkqYmFzZTsKKworCXN0cnVjdCBkc2lfY2xvY2tfaW5mbyBjdXJyZW50X2NpbmZvOworCisJc3RydWN0IHJlZ3VsYXRvciAqdmRkc19kc2lfcmVnOworCisJc3RydWN0IHsKKwkJZW51bSBkc2lfdmNfbW9kZSBtb2RlOworCQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXY7CisJCWVudW0gZmlmb19zaXplIGZpZm9fc2l6ZTsKKwkJaW50IGRlc3RfcGVyOwkvKiBkZXN0aW5hdGlvbiBwZXJpcGhlcmFsIDAtMyAqLworCX0gdmNbNF07CisKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgbXV0ZXggYnVzX2xvY2s7CisKKwl1bnNpZ25lZCBwbGxfbG9ja2VkOworCisJc3RydWN0IGNvbXBsZXRpb24gYnRhX2NvbXBsZXRpb247CisKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRocmVhZDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0cXVldWU7CisKKwlzcGlubG9ja190IHVwZGF0ZV9sb2NrOworCWJvb2wgZnJhbWVkb25lX3JlY2VpdmVkOworCXN0cnVjdCBkc2lfdXBkYXRlX3JlZ2lvbiB1cGRhdGVfcmVnaW9uOworCXN0cnVjdCBkc2lfdXBkYXRlX3JlZ2lvbiBhY3RpdmVfdXBkYXRlX3JlZ2lvbjsKKwlzdHJ1Y3QgY29tcGxldGlvbiB1cGRhdGVfY29tcGxldGlvbjsKKworCWVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUgdXNlcl91cGRhdGVfbW9kZTsKKwllbnVtIG9tYXBfZHNzX3VwZGF0ZV9tb2RlIHVwZGF0ZV9tb2RlOworCWJvb2wgdGVfZW5hYmxlZDsKKwlib29sIHVzZV9leHRfdGU7CisKKyNpZmRlZiBEU0lfQ0FUQ0hfTUlTU0lOR19URQorCXN0cnVjdCB0aW1lcl9saXN0IHRlX3RpbWVyOworI2VuZGlmCisKKwl1bnNpZ25lZCBsb25nIGNhY2hlX3JlcV9wY2s7CisJdW5zaWduZWQgbG9uZyBjYWNoZV9jbGtfZnJlcTsKKwlzdHJ1Y3QgZHNpX2Nsb2NrX2luZm8gY2FjaGVfY2luZm87CisKKwl1MzIJCWVycm9yczsKKwlzcGlubG9ja190CWVycm9yc19sb2NrOworI2lmZGVmIERFQlVHCisJa3RpbWVfdCBwZXJmX3NldHVwX3RpbWU7CisJa3RpbWVfdCBwZXJmX3N0YXJ0X3RpbWU7CisJa3RpbWVfdCBwZXJmX3N0YXJ0X3RpbWVfYXV0bzsKKwlpbnQgcGVyZl9tZWFzdXJlX2ZyYW1lczsKKyNlbmRpZgorCWludCBkZWJ1Z19yZWFkOworCWludCBkZWJ1Z193cml0ZTsKK30gZHNpOworCisjaWZkZWYgREVCVUcKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHNpX3BlcmY7Cittb2R1bGVfcGFyYW1fbmFtZWQoZHNpX3BlcmYsIGRzaV9wZXJmLCBib29sLCAwNjQ0KTsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgZHNpX3dyaXRlX3JlZyhjb25zdCBzdHJ1Y3QgZHNpX3JlZyBpZHgsIHUzMiB2YWwpCit7CisJX19yYXdfd3JpdGVsKHZhbCwgZHNpLmJhc2UgKyBpZHguaWR4KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgZHNpX3JlYWRfcmVnKGNvbnN0IHN0cnVjdCBkc2lfcmVnIGlkeCkKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwoZHNpLmJhc2UgKyBpZHguaWR4KTsKK30KKworCit2b2lkIGRzaV9zYXZlX2NvbnRleHQodm9pZCkKK3sKK30KKwordm9pZCBkc2lfcmVzdG9yZV9jb250ZXh0KHZvaWQpCit7Cit9CisKK3ZvaWQgZHNpX2J1c19sb2NrKHZvaWQpCit7CisJbXV0ZXhfbG9jaygmZHNpLmJ1c19sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0woZHNpX2J1c19sb2NrKTsKKwordm9pZCBkc2lfYnVzX3VubG9jayh2b2lkKQoreworCW11dGV4X3VubG9jaygmZHNpLmJ1c19sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0woZHNpX2J1c191bmxvY2spOworCitzdGF0aWMgaW5saW5lIGludCB3YWl0X2Zvcl9iaXRfY2hhbmdlKGNvbnN0IHN0cnVjdCBkc2lfcmVnIGlkeCwgaW50IGJpdG51bSwKKwkJaW50IHZhbHVlKQoreworCWludCB0ID0gMTAwMDAwOworCisJd2hpbGUgKFJFR19HRVQoaWR4LCBiaXRudW0sIGJpdG51bSkgIT0gdmFsdWUpIHsKKwkJaWYgKC0tdCA9PSAwKQorCQkJcmV0dXJuICF2YWx1ZTsKKwl9CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgZHNpX3BlcmZfbWFya19zZXR1cCh2b2lkKQoreworCWRzaS5wZXJmX3NldHVwX3RpbWUgPSBrdGltZV9nZXQoKTsKK30KKworc3RhdGljIHZvaWQgZHNpX3BlcmZfbWFya19zdGFydCh2b2lkKQoreworCWRzaS5wZXJmX3N0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTsKK30KKworc3RhdGljIHZvaWQgZHNpX3BlcmZfbWFya19zdGFydF9hdXRvKHZvaWQpCit7CisJZHNpLnBlcmZfbWVhc3VyZV9mcmFtZXMgPSAwOworCWRzaS5wZXJmX3N0YXJ0X3RpbWVfYXV0byA9IGt0aW1lX2dldCgpOworfQorCitzdGF0aWMgdm9pZCBkc2lfcGVyZl9zaG93KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJa3RpbWVfdCB0LCBzZXR1cF90aW1lLCB0cmFuc190aW1lOworCXUzMiB0b3RhbF9ieXRlczsKKwl1MzIgc2V0dXBfdXMsIHRyYW5zX3VzLCB0b3RhbF91czsKKworCWlmICghZHNpX3BlcmYpCisJCXJldHVybjsKKworCWlmIChkc2kudXBkYXRlX21vZGUgPT0gT01BUF9EU1NfVVBEQVRFX0RJU0FCTEVEKQorCQlyZXR1cm47CisKKwl0ID0ga3RpbWVfZ2V0KCk7CisKKwlzZXR1cF90aW1lID0ga3RpbWVfc3ViKGRzaS5wZXJmX3N0YXJ0X3RpbWUsIGRzaS5wZXJmX3NldHVwX3RpbWUpOworCXNldHVwX3VzID0gKHUzMilrdGltZV90b191cyhzZXR1cF90aW1lKTsKKwlpZiAoc2V0dXBfdXMgPT0gMCkKKwkJc2V0dXBfdXMgPSAxOworCisJdHJhbnNfdGltZSA9IGt0aW1lX3N1Yih0LCBkc2kucGVyZl9zdGFydF90aW1lKTsKKwl0cmFuc191cyA9ICh1MzIpa3RpbWVfdG9fdXModHJhbnNfdGltZSk7CisJaWYgKHRyYW5zX3VzID09IDApCisJCXRyYW5zX3VzID0gMTsKKworCXRvdGFsX3VzID0gc2V0dXBfdXMgKyB0cmFuc191czsKKworCXRvdGFsX2J5dGVzID0gZHNpLmFjdGl2ZV91cGRhdGVfcmVnaW9uLncgKgorCQlkc2kuYWN0aXZlX3VwZGF0ZV9yZWdpb24uaCAqCisJCWRzaS5hY3RpdmVfdXBkYXRlX3JlZ2lvbi5kZXZpY2UtPmN0cmwucGl4ZWxfc2l6ZSAvIDg7CisKKwlpZiAoZHNpLnVwZGF0ZV9tb2RlID09IE9NQVBfRFNTX1VQREFURV9BVVRPKSB7CisJCXN0YXRpYyB1MzIgc190b3RhbF90cmFuc191cywgc190b3RhbF9zZXR1cF91czsKKwkJc3RhdGljIHUzMiBzX21pbl90cmFuc191cyA9IDB4ZmZmZmZmZmYsIHNfbWluX3NldHVwX3VzOworCQlzdGF0aWMgdTMyIHNfbWF4X3RyYW5zX3VzLCBzX21heF9zZXR1cF91czsKKwkJY29uc3QgaW50IG51bWZyYW1lcyA9IDEwMDsKKwkJa3RpbWVfdCB0b3RhbF90aW1lX2F1dG87CisJCXUzMiB0b3RhbF90aW1lX2F1dG9fdXM7CisKKwkJZHNpLnBlcmZfbWVhc3VyZV9mcmFtZXMrKzsKKworCQlpZiAoc2V0dXBfdXMgPCBzX21pbl9zZXR1cF91cykKKwkJCXNfbWluX3NldHVwX3VzID0gc2V0dXBfdXM7CisKKwkJaWYgKHNldHVwX3VzID4gc19tYXhfc2V0dXBfdXMpCisJCQlzX21heF9zZXR1cF91cyA9IHNldHVwX3VzOworCisJCXNfdG90YWxfc2V0dXBfdXMgKz0gc2V0dXBfdXM7CisKKwkJaWYgKHRyYW5zX3VzIDwgc19taW5fdHJhbnNfdXMpCisJCQlzX21pbl90cmFuc191cyA9IHRyYW5zX3VzOworCisJCWlmICh0cmFuc191cyA+IHNfbWF4X3RyYW5zX3VzKQorCQkJc19tYXhfdHJhbnNfdXMgPSB0cmFuc191czsKKworCQlzX3RvdGFsX3RyYW5zX3VzICs9IHRyYW5zX3VzOworCisJCWlmIChkc2kucGVyZl9tZWFzdXJlX2ZyYW1lcyA8IG51bWZyYW1lcykKKwkJCXJldHVybjsKKworCQl0b3RhbF90aW1lX2F1dG8gPSBrdGltZV9zdWIodCwgZHNpLnBlcmZfc3RhcnRfdGltZV9hdXRvKTsKKwkJdG90YWxfdGltZV9hdXRvX3VzID0gKHUzMilrdGltZV90b191cyh0b3RhbF90aW1lX2F1dG8pOworCisJCXByaW50ayhLRVJOX0lORk8gIkRTSSglcyk6ICV1IGZwcywgc2V0dXAgJXUvJXUvJXUsICIKKwkJCQkidHJhbnMgJXUvJXUvJXVcbiIsCisJCQkJbmFtZSwKKwkJCQkxMDAwICogMTAwMCAqIG51bWZyYW1lcyAvIHRvdGFsX3RpbWVfYXV0b191cywKKwkJCQlzX21pbl9zZXR1cF91cywKKwkJCQlzX21heF9zZXR1cF91cywKKwkJCQlzX3RvdGFsX3NldHVwX3VzIC8gbnVtZnJhbWVzLAorCQkJCXNfbWluX3RyYW5zX3VzLAorCQkJCXNfbWF4X3RyYW5zX3VzLAorCQkJCXNfdG90YWxfdHJhbnNfdXMgLyBudW1mcmFtZXMpOworCisJCXNfdG90YWxfc2V0dXBfdXMgPSAwOworCQlzX21pbl9zZXR1cF91cyA9IDB4ZmZmZmZmZmY7CisJCXNfbWF4X3NldHVwX3VzID0gMDsKKwkJc190b3RhbF90cmFuc191cyA9IDA7CisJCXNfbWluX3RyYW5zX3VzID0gMHhmZmZmZmZmZjsKKwkJc19tYXhfdHJhbnNfdXMgPSAwOworCQlkc2lfcGVyZl9tYXJrX3N0YXJ0X2F1dG8oKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJEU0koJXMpOiAldSB1cyArICV1IHVzID0gJXUgdXMgKCV1SHopLCAiCisJCQkJIiV1IGJ5dGVzLCAldSBrYnl0ZXMvc2VjXG4iLAorCQkJCW5hbWUsCisJCQkJc2V0dXBfdXMsCisJCQkJdHJhbnNfdXMsCisJCQkJdG90YWxfdXMsCisJCQkJMTAwMCoxMDAwIC8gdG90YWxfdXMsCisJCQkJdG90YWxfYnl0ZXMsCisJCQkJdG90YWxfYnl0ZXMgKiAxMDAwIC8gdG90YWxfdXMpOworCX0KK30KKyNlbHNlCisjZGVmaW5lIGRzaV9wZXJmX21hcmtfc2V0dXAoKQorI2RlZmluZSBkc2lfcGVyZl9tYXJrX3N0YXJ0KCkKKyNkZWZpbmUgZHNpX3BlcmZfbWFya19zdGFydF9hdXRvKCkKKyNkZWZpbmUgZHNpX3BlcmZfc2hvdyh4KQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHByaW50X2lycV9zdGF0dXModTMyIHN0YXR1cykKK3sKKyNpZm5kZWYgVkVSQk9TRV9JUlEKKwlpZiAoKHN0YXR1cyAmIH5EU0lfSVJRX0NIQU5ORUxfTUFTSykgPT0gMCkKKwkJcmV0dXJuOworI2VuZGlmCisJcHJpbnRrKEtFUk5fREVCVUcgIkRTSSBJUlE6IDB4JXg6ICIsIHN0YXR1cyk7CisKKyNkZWZpbmUgUElTKHgpIFwKKwlpZiAoc3RhdHVzICYgRFNJX0lSUV8jI3gpIFwKKwkJcHJpbnRrKCN4ICIgIik7CisjaWZkZWYgVkVSQk9TRV9JUlEKKwlQSVMoVkMwKTsKKwlQSVMoVkMxKTsKKwlQSVMoVkMyKTsKKwlQSVMoVkMzKTsKKyNlbmRpZgorCVBJUyhXQUtFVVApOworCVBJUyhSRVNZTkMpOworCVBJUyhQTExfTE9DSyk7CisJUElTKFBMTF9VTkxPQ0spOworCVBJUyhQTExfUkVDQUxMKTsKKwlQSVMoQ09NUExFWElPX0VSUik7CisJUElTKEhTX1RYX1RJTUVPVVQpOworCVBJUyhMUF9SWF9USU1FT1VUKTsKKwlQSVMoVEVfVFJJR0dFUik7CisJUElTKEFDS19UUklHR0VSKTsKKwlQSVMoU1lOQ19MT1NUKTsKKwlQSVMoTERPX1BPV0VSX0dPT0QpOworCVBJUyhUQV9USU1FT1VUKTsKKyN1bmRlZiBQSVMKKworCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaXJxX3N0YXR1c192YyhpbnQgY2hhbm5lbCwgdTMyIHN0YXR1cykKK3sKKyNpZm5kZWYgVkVSQk9TRV9JUlEKKwlpZiAoKHN0YXR1cyAmIH5EU0lfVkNfSVJRX1BBQ0tFVF9TRU5UKSA9PSAwKQorCQlyZXR1cm47CisjZW5kaWYKKwlwcmludGsoS0VSTl9ERUJVRyAiRFNJIFZDKCVkKSBJUlEgMHgleDogIiwgY2hhbm5lbCwgc3RhdHVzKTsKKworI2RlZmluZSBQSVMoeCkgXAorCWlmIChzdGF0dXMgJiBEU0lfVkNfSVJRXyMjeCkgXAorCQlwcmludGsoI3ggIiAiKTsKKwlQSVMoQ1MpOworCVBJUyhFQ0NfQ09SUik7CisjaWZkZWYgVkVSQk9TRV9JUlEKKwlQSVMoUEFDS0VUX1NFTlQpOworI2VuZGlmCisJUElTKEZJRk9fVFhfT1ZGKTsKKwlQSVMoRklGT19SWF9PVkYpOworCVBJUyhCVEEpOworCVBJUyhFQ0NfTk9fQ09SUik7CisJUElTKEZJRk9fVFhfVURGKTsKKwlQSVMoUFBfQlVTWV9DSEFOR0UpOworI3VuZGVmIFBJUworCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaXJxX3N0YXR1c19jaW8odTMyIHN0YXR1cykKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiRFNJIENJTyBJUlEgMHgleDogIiwgc3RhdHVzKTsKKworI2RlZmluZSBQSVMoeCkgXAorCWlmIChzdGF0dXMgJiBEU0lfQ0lPX0lSUV8jI3gpIFwKKwkJcHJpbnRrKCN4ICIgIik7CisJUElTKEVSUlNZTkNFU0MxKTsKKwlQSVMoRVJSU1lOQ0VTQzIpOworCVBJUyhFUlJTWU5DRVNDMyk7CisJUElTKEVSUkVTQzEpOworCVBJUyhFUlJFU0MyKTsKKwlQSVMoRVJSRVNDMyk7CisJUElTKEVSUkNPTlRST0wxKTsKKwlQSVMoRVJSQ09OVFJPTDIpOworCVBJUyhFUlJDT05UUk9MMyk7CisJUElTKFNUQVRFVUxQUzEpOworCVBJUyhTVEFURVVMUFMyKTsKKwlQSVMoU1RBVEVVTFBTMyk7CisJUElTKEVSUkNPTlRFTlRJT05MUDBfMSk7CisJUElTKEVSUkNPTlRFTlRJT05MUDFfMSk7CisJUElTKEVSUkNPTlRFTlRJT05MUDBfMik7CisJUElTKEVSUkNPTlRFTlRJT05MUDFfMik7CisJUElTKEVSUkNPTlRFTlRJT05MUDBfMyk7CisJUElTKEVSUkNPTlRFTlRJT05MUDFfMyk7CisJUElTKFVMUFNBQ1RJVkVOT1RfQUxMMCk7CisJUElTKFVMUFNBQ1RJVkVOT1RfQUxMMSk7CisjdW5kZWYgUElTCisKKwlwcmludGsoIlxuIik7Cit9CisKK3N0YXRpYyBpbnQgZGVidWdfaXJxOworCisvKiBjYWxsZWQgZnJvbSBkc3MgKi8KK3ZvaWQgZHNpX2lycV9oYW5kbGVyKHZvaWQpCit7CisJdTMyIGlycXN0YXR1cywgdmNzdGF0dXMsIGNpb3N0YXR1czsKKwlpbnQgaTsKKworCWlycXN0YXR1cyA9IGRzaV9yZWFkX3JlZyhEU0lfSVJRU1RBVFVTKTsKKworCWlmIChpcnFzdGF0dXMgJiBEU0lfSVJRX0VSUk9SX01BU0spIHsKKwkJRFNTRVJSKCJEU0kgZXJyb3IsIGlycXN0YXR1cyAleFxuIiwgaXJxc3RhdHVzKTsKKwkJcHJpbnRfaXJxX3N0YXR1cyhpcnFzdGF0dXMpOworCQlzcGluX2xvY2soJmRzaS5lcnJvcnNfbG9jayk7CisJCWRzaS5lcnJvcnMgfD0gaXJxc3RhdHVzICYgRFNJX0lSUV9FUlJPUl9NQVNLOworCQlzcGluX3VubG9jaygmZHNpLmVycm9yc19sb2NrKTsKKwl9IGVsc2UgaWYgKGRlYnVnX2lycSkgeworCQlwcmludF9pcnFfc3RhdHVzKGlycXN0YXR1cyk7CisJfQorCisjaWZkZWYgRFNJX0NBVENIX01JU1NJTkdfVEUKKwlpZiAoaXJxc3RhdHVzICYgRFNJX0lSUV9URV9UUklHR0VSKQorCQlkZWxfdGltZXIoJmRzaS50ZV90aW1lcik7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKwkJaWYgKChpcnFzdGF0dXMgJiAoMTw8aSkpID09IDApCisJCQljb250aW51ZTsKKworCQl2Y3N0YXR1cyA9IGRzaV9yZWFkX3JlZyhEU0lfVkNfSVJRU1RBVFVTKGkpKTsKKworCQlpZiAodmNzdGF0dXMgJiBEU0lfVkNfSVJRX0JUQSkKKwkJCWNvbXBsZXRlKCZkc2kuYnRhX2NvbXBsZXRpb24pOworCisJCWlmICh2Y3N0YXR1cyAmIERTSV9WQ19JUlFfRVJST1JfTUFTSykgeworCQkJRFNTRVJSKCJEU0kgVkMoJWQpIGVycm9yLCB2YyBpcnFzdGF0dXMgJXhcbiIsCisJCQkJICAgICAgIGksIHZjc3RhdHVzKTsKKwkJCXByaW50X2lycV9zdGF0dXNfdmMoaSwgdmNzdGF0dXMpOworCQl9IGVsc2UgaWYgKGRlYnVnX2lycSkgeworCQkJcHJpbnRfaXJxX3N0YXR1c192YyhpLCB2Y3N0YXR1cyk7CisJCX0KKworCQlkc2lfd3JpdGVfcmVnKERTSV9WQ19JUlFTVEFUVVMoaSksIHZjc3RhdHVzKTsKKwkJLyogZmx1c2ggcG9zdGVkIHdyaXRlICovCisJCWRzaV9yZWFkX3JlZyhEU0lfVkNfSVJRU1RBVFVTKGkpKTsKKwl9CisKKwlpZiAoaXJxc3RhdHVzICYgRFNJX0lSUV9DT01QTEVYSU9fRVJSKSB7CisJCWNpb3N0YXR1cyA9IGRzaV9yZWFkX3JlZyhEU0lfQ09NUExFWElPX0lSUV9TVEFUVVMpOworCisJCWRzaV93cml0ZV9yZWcoRFNJX0NPTVBMRVhJT19JUlFfU1RBVFVTLCBjaW9zdGF0dXMpOworCQkvKiBmbHVzaCBwb3N0ZWQgd3JpdGUgKi8KKwkJZHNpX3JlYWRfcmVnKERTSV9DT01QTEVYSU9fSVJRX1NUQVRVUyk7CisKKwkJRFNTRVJSKCJEU0kgQ0lPIGVycm9yLCBjaW8gaXJxc3RhdHVzICV4XG4iLCBjaW9zdGF0dXMpOworCQlwcmludF9pcnFfc3RhdHVzX2NpbyhjaW9zdGF0dXMpOworCX0KKworCWRzaV93cml0ZV9yZWcoRFNJX0lSUVNUQVRVUywgaXJxc3RhdHVzICYgfkRTSV9JUlFfQ0hBTk5FTF9NQVNLKTsKKwkvKiBmbHVzaCBwb3N0ZWQgd3JpdGUgKi8KKwlkc2lfcmVhZF9yZWcoRFNJX0lSUVNUQVRVUyk7Cit9CisKKworc3RhdGljIHZvaWQgX2RzaV9pbml0aWFsaXplX2lycSh2b2lkKQoreworCXUzMiBsOworCWludCBpOworCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCWRzaV93cml0ZV9yZWcoRFNJX0lSUUVOQUJMRSwgMCk7CisJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKKwkJZHNpX3dyaXRlX3JlZyhEU0lfVkNfSVJRRU5BQkxFKGkpLCAwKTsKKwlkc2lfd3JpdGVfcmVnKERTSV9DT01QTEVYSU9fSVJRX0VOQUJMRSwgMCk7CisKKwkvKiBjbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCisJbCA9IGRzaV9yZWFkX3JlZyhEU0lfSVJRU1RBVFVTKTsKKwlkc2lfd3JpdGVfcmVnKERTSV9JUlFTVEFUVVMsIGwgJiB+RFNJX0lSUV9DSEFOTkVMX01BU0spOworCisJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCQlsID0gZHNpX3JlYWRfcmVnKERTSV9WQ19JUlFTVEFUVVMoaSkpOworCQlkc2lfd3JpdGVfcmVnKERTSV9WQ19JUlFTVEFUVVMoaSksIGwpOworCX0KKworCWwgPSBkc2lfcmVhZF9yZWcoRFNJX0NPTVBMRVhJT19JUlFfU1RBVFVTKTsKKwlkc2lfd3JpdGVfcmVnKERTSV9DT01QTEVYSU9fSVJRX1NUQVRVUywgbCk7CisKKwkvKiBlbmFibGUgZXJyb3IgaXJxcyAqLworCWwgPSBEU0lfSVJRX0VSUk9SX01BU0s7CisjaWZkZWYgRFNJX0NBVENIX01JU1NJTkdfVEUKKwlsIHw9IERTSV9JUlFfVEVfVFJJR0dFUjsKKyNlbmRpZgorCWRzaV93cml0ZV9yZWcoRFNJX0lSUUVOQUJMRSwgbCk7CisKKwlsID0gRFNJX1ZDX0lSUV9FUlJPUl9NQVNLOworCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpCisJCWRzaV93cml0ZV9yZWcoRFNJX1ZDX0lSUUVOQUJMRShpKSwgbCk7CisKKwkvKiBYWFggem9uZGEgcmVzcG9uZHMgaW5jb3JyZWN0bHksIGNhdXNpbmcgY29udHJvbCBlcnJvcjoKKwkgICBFeGl0IGZyb20gTFAtRVNDIG1vZGUgdG8gTFAxMSB1c2VzIHdyb25nIHRyYW5zaXRpb24gc3RhdGVzIG9uIHRoZQorCSAgIGRhdGEgbGluZXMgTFAwIGFuZCBMTjAuICovCisJZHNpX3dyaXRlX3JlZyhEU0lfQ09NUExFWElPX0lSUV9FTkFCTEUsCisJCQktMSAmICh+RFNJX0NJT19JUlFfRVJSQ09OVFJPTDIpKTsKK30KKworc3RhdGljIHUzMiBkc2lfZ2V0X2Vycm9ycyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGU7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzaS5lcnJvcnNfbG9jaywgZmxhZ3MpOworCWUgPSBkc2kuZXJyb3JzOworCWRzaS5lcnJvcnMgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzaS5lcnJvcnNfbG9jaywgZmxhZ3MpOworCXJldHVybiBlOworfQorCitzdGF0aWMgdm9pZCBkc2lfdmNfZW5hYmxlX2J0YV9pcnEoaW50IGNoYW5uZWwpCit7CisJdTMyIGw7CisKKwlkc2lfd3JpdGVfcmVnKERTSV9WQ19JUlFTVEFUVVMoY2hhbm5lbCksIERTSV9WQ19JUlFfQlRBKTsKKworCWwgPSBkc2lfcmVhZF9yZWcoRFNJX1ZDX0lSUUVOQUJMRShjaGFubmVsKSk7CisJbCB8PSBEU0lfVkNfSVJRX0JUQTsKKwlkc2lfd3JpdGVfcmVnKERTSV9WQ19JUlFFTkFCTEUoY2hhbm5lbCksIGwpOworfQorCitzdGF0aWMgdm9pZCBkc2lfdmNfZGlzYWJsZV9idGFfaXJxKGludCBjaGFubmVsKQoreworCXUzMiBsOworCisJbCA9IGRzaV9yZWFkX3JlZyhEU0lfVkNfSVJRRU5BQkxFKGNoYW5uZWwpKTsKKwlsICY9IH5EU0lfVkNfSVJRX0JUQTsKKwlkc2lfd3JpdGVfcmVnKERTSV9WQ19JUlFFTkFCTEUoY2hhbm5lbCksIGwpOworfQorCisvKiBEU0kgZnVuYyBjbG9jay4gdGhpcyBjb3VsZCBhbHNvIGJlIERTSTJfUExMX0ZDTEsgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfY2xvY2tzKGJvb2wgZW5hYmxlKQoreworCWlmIChlbmFibGUpCisJCWRzc19jbGtfZW5hYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0sxKTsKKwllbHNlCisJCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLMSk7Cit9CisKKy8qIHNvdXJjZSBjbG9jayBmb3IgRFNJIFBMTC4gdGhpcyBjb3VsZCBhbHNvIGJlIFBDTEtGUkVFICovCitzdGF0aWMgaW5saW5lIHZvaWQgZHNpX2VuYWJsZV9wbGxfY2xvY2soYm9vbCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkKKwkJZHNzX2Nsa19lbmFibGUoRFNTX0NMS19GQ0syKTsKKwllbHNlCisJCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0ZDSzIpOworCisJaWYgKGVuYWJsZSAmJiBkc2kucGxsX2xvY2tlZCkgeworCQlpZiAod2FpdF9mb3JfYml0X2NoYW5nZShEU0lfUExMX1NUQVRVUywgMSwgMSkgIT0gMSkKKwkJCURTU0VSUigiY2Fubm90IGxvY2sgUExMIHdoZW4gZW5hYmxpbmcgY2xvY2tzXG4iKTsKKwl9Cit9CisKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgX2RzaV9wcmludF9yZXNldF9zdGF0dXModm9pZCkKK3sKKwl1MzIgbDsKKworCWlmICghZHNzX2RlYnVnKQorCQlyZXR1cm47CisKKwkvKiBBIGR1bW15IHJlYWQgdXNpbmcgdGhlIFNDUCBpbnRlcmZhY2UgdG8gYW55IERTSVBIWSByZWdpc3RlciBpcworCSAqIHJlcXVpcmVkIGFmdGVyIERTSVBIWSByZXNldCB0byBjb21wbGV0ZSB0aGUgcmVzZXQgb2YgdGhlIERTSSBjb21wbGV4CisJICogSS9PLiAqLworCWwgPSBkc2lfcmVhZF9yZWcoRFNJX0RTSVBIWV9DRkc1KTsKKworCXByaW50ayhLRVJOX0RFQlVHICJEU0kgcmVzZXRzOiAiKTsKKworCWwgPSBkc2lfcmVhZF9yZWcoRFNJX1BMTF9TVEFUVVMpOworCXByaW50aygiUExMICglZCkgIiwgRkxEX0dFVChsLCAwLCAwKSk7CisKKwlsID0gZHNpX3JlYWRfcmVnKERTSV9DT01QTEVYSU9fQ0ZHMSk7CisJcHJpbnRrKCJDSU8gKCVkKSAiLCBGTERfR0VUKGwsIDI5LCAyOSkpOworCisJbCA9IGRzaV9yZWFkX3JlZyhEU0lfRFNJUEhZX0NGRzUpOworCXByaW50aygiUEhZICgleCwgJWQsICVkLCAlZClcbiIsCisJCQlGTERfR0VUKGwsIDI4LCAyNiksCisJCQlGTERfR0VUKGwsIDI5LCAyOSksCisJCQlGTERfR0VUKGwsIDMwLCAzMCksCisJCQlGTERfR0VUKGwsIDMxLCAzMSkpOworfQorI2Vsc2UKKyNkZWZpbmUgX2RzaV9wcmludF9yZXNldF9zdGF0dXMoKQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50IGRzaV9pZl9lbmFibGUoYm9vbCBlbmFibGUpCit7CisJRFNTREJHKCJkc2lfaWZfZW5hYmxlKCVkKVxuIiwgZW5hYmxlKTsKKworCWVuYWJsZSA9IGVuYWJsZSA/IDEgOiAwOworCVJFR19GTERfTU9EKERTSV9DVFJMLCBlbmFibGUsIDAsIDApOyAvKiBJRl9FTiAqLworCisJaWYgKHdhaXRfZm9yX2JpdF9jaGFuZ2UoRFNJX0NUUkwsIDAsIGVuYWJsZSkgIT0gZW5hYmxlKSB7CisJCQlEU1NFUlIoIkZhaWxlZCB0byBzZXQgZHNpX2lmX2VuYWJsZSB0byAlZFxuIiwgZW5hYmxlKTsKKwkJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBsb25nIGRzaV9nZXRfZHNpMV9wbGxfcmF0ZSh2b2lkKQoreworCXJldHVybiBkc2kuY3VycmVudF9jaW5mby5kc2kxX3BsbF9mY2xrOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkc2lfZ2V0X2RzaTJfcGxsX3JhdGUodm9pZCkKK3sKKwlyZXR1cm4gZHNpLmN1cnJlbnRfY2luZm8uZHNpMl9wbGxfZmNsazsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZHNpX2dldF90eGJ5dGVjbGtocyh2b2lkKQoreworCXJldHVybiBkc2kuY3VycmVudF9jaW5mby5jbGtpbjRkZHIgLyAxNjsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZHNpX2ZjbGtfcmF0ZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcjsKKworCWlmIChkc3NfZ2V0X2RzaV9jbGtfc291cmNlKCkgPT0gMCkgeworCQkvKiBEU0kgRkNMSyBzb3VyY2UgaXMgRFNTMV9BTFdPTl9GQ0ssIHdoaWNoIGlzIGRzczFfZmNrICovCisJCXIgPSBkc3NfY2xrX2dldF9yYXRlKERTU19DTEtfRkNLMSk7CisJfSBlbHNlIHsKKwkJLyogRFNJIEZDTEsgc291cmNlIGlzIERTSTJfUExMX0ZDTEsgKi8KKwkJciA9IGRzaV9nZXRfZHNpMl9wbGxfcmF0ZSgpOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGRzaV9zZXRfbHBfY2xrX2Rpdmlzb3Ioc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZHNpX2ZjbGs7CisJdW5zaWduZWQgbHBfY2xrX2RpdjsKKwl1bnNpZ25lZCBsb25nIGxwX2NsazsKKworCWxwX2Nsa19kaXYgPSBkc3NkZXYtPnBoeS5kc2kuZGl2LmxwX2Nsa19kaXY7CisKKwlpZiAobHBfY2xrX2RpdiA9PSAwIHx8IGxwX2Nsa19kaXYgPiBMUF9ESVZfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRzaV9mY2xrID0gZHNpX2ZjbGtfcmF0ZSgpOworCisJbHBfY2xrID0gZHNpX2ZjbGsgLyAyIC8gbHBfY2xrX2RpdjsKKworCURTU0RCRygiTFBfQ0xLX0RJViAldSwgTFBfQ0xLICVsdVxuIiwgbHBfY2xrX2RpdiwgbHBfY2xrKTsKKwlkc2kuY3VycmVudF9jaW5mby5scF9jbGsgPSBscF9jbGs7CisJZHNpLmN1cnJlbnRfY2luZm8ubHBfY2xrX2RpdiA9IGxwX2Nsa19kaXY7CisKKwlSRUdfRkxEX01PRChEU0lfQ0xLX0NUUkwsIGxwX2Nsa19kaXYsIDEyLCAwKTsgICAvKiBMUF9DTEtfRElWSVNPUiAqLworCisJUkVHX0ZMRF9NT0QoRFNJX0NMS19DVFJMLCBkc2lfZmNsayA+IDMwMDAwMDAwID8gMSA6IDAsCisJCQkyMSwgMjEpOwkJLyogTFBfUlhfU1lOQ0hST19FTkFCTEUgKi8KKworCXJldHVybiAwOworfQorCisKK2VudW0gZHNpX3BsbF9wb3dlcl9zdGF0ZSB7CisJRFNJX1BMTF9QT1dFUl9PRkYJPSAweDAsCisJRFNJX1BMTF9QT1dFUl9PTl9IU0NMSwk9IDB4MSwKKwlEU0lfUExMX1BPV0VSX09OX0FMTAk9IDB4MiwKKwlEU0lfUExMX1BPV0VSX09OX0RJVgk9IDB4MywKK307CisKK3N0YXRpYyBpbnQgZHNpX3BsbF9wb3dlcihlbnVtIGRzaV9wbGxfcG93ZXJfc3RhdGUgc3RhdGUpCit7CisJaW50IHQgPSAwOworCisJUkVHX0ZMRF9NT0QoRFNJX0NMS19DVFJMLCBzdGF0ZSwgMzEsIDMwKTsJLyogUExMX1BXUl9DTUQgKi8KKworCS8qIFBMTF9QV1JfU1RBVFVTICovCisJd2hpbGUgKEZMRF9HRVQoZHNpX3JlYWRfcmVnKERTSV9DTEtfQ1RSTCksIDI5LCAyOCkgIT0gc3RhdGUpIHsKKwkJdWRlbGF5KDEpOworCQlpZiAodCsrID4gMTAwMCkgeworCQkJRFNTRVJSKCJGYWlsZWQgdG8gc2V0IERTSSBQTEwgcG93ZXIgbW9kZSB0byAlZFxuIiwKKwkJCQkJc3RhdGUpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogY2FsY3VsYXRlIGNsb2NrIHJhdGVzIHVzaW5nIGRpdmlkZXJzIGluIGNpbmZvICovCitzdGF0aWMgaW50IGRzaV9jYWxjX2Nsb2NrX3JhdGVzKHN0cnVjdCBkc2lfY2xvY2tfaW5mbyAqY2luZm8pCit7CisJaWYgKGNpbmZvLT5yZWduID09IDAgfHwgY2luZm8tPnJlZ24gPiBSRUdOX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY2luZm8tPnJlZ20gPT0gMCB8fCBjaW5mby0+cmVnbSA+IFJFR01fTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjaW5mby0+cmVnbTMgPiBSRUdNM19NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNpbmZvLT5yZWdtNCA+IFJFR000X01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY2luZm8tPnVzZV9kc3MyX2ZjaykgeworCQljaW5mby0+Y2xraW4gPSBkc3NfY2xrX2dldF9yYXRlKERTU19DTEtfRkNLMik7CisJCS8qIFhYWCBpdCBpcyB1bmNsZWFyIGlmIGhpZ2hmcmVxIHNob3VsZCBiZSB1c2VkCisJCSAqIHdpdGggRFNTMl9GQ0sgc291cmNlIGFsc28gKi8KKwkJY2luZm8tPmhpZ2hmcmVxID0gMDsKKwl9IGVsc2UgeworCQljaW5mby0+Y2xraW4gPSBkaXNwY19wY2xrX3JhdGUoKTsKKworCQlpZiAoY2luZm8tPmNsa2luIDwgMzIwMDAwMDApCisJCQljaW5mby0+aGlnaGZyZXEgPSAwOworCQllbHNlCisJCQljaW5mby0+aGlnaGZyZXEgPSAxOworCX0KKworCWNpbmZvLT5maW50ID0gY2luZm8tPmNsa2luIC8gKGNpbmZvLT5yZWduICogKGNpbmZvLT5oaWdoZnJlcSA/IDIgOiAxKSk7CisKKwlpZiAoY2luZm8tPmZpbnQgPiBGSU5UX01BWCB8fCBjaW5mby0+ZmludCA8IEZJTlRfTUlOKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNpbmZvLT5jbGtpbjRkZHIgPSAyICogY2luZm8tPnJlZ20gKiBjaW5mby0+ZmludDsKKworCWlmIChjaW5mby0+Y2xraW40ZGRyID4gMTgwMCAqIDEwMDAgKiAxMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjaW5mby0+cmVnbTMgPiAwKQorCQljaW5mby0+ZHNpMV9wbGxfZmNsayA9IGNpbmZvLT5jbGtpbjRkZHIgLyBjaW5mby0+cmVnbTM7CisJZWxzZQorCQljaW5mby0+ZHNpMV9wbGxfZmNsayA9IDA7CisKKwlpZiAoY2luZm8tPnJlZ200ID4gMCkKKwkJY2luZm8tPmRzaTJfcGxsX2ZjbGsgPSBjaW5mby0+Y2xraW40ZGRyIC8gY2luZm8tPnJlZ200OworCWVsc2UKKwkJY2luZm8tPmRzaTJfcGxsX2ZjbGsgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkc2lfcGxsX2NhbGNfY2xvY2tfZGl2X3Bjayhib29sIGlzX3RmdCwgdW5zaWduZWQgbG9uZyByZXFfcGNrLAorCQlzdHJ1Y3QgZHNpX2Nsb2NrX2luZm8gKmRzaV9jaW5mbywKKwkJc3RydWN0IGRpc3BjX2Nsb2NrX2luZm8gKmRpc3BjX2NpbmZvKQoreworCXN0cnVjdCBkc2lfY2xvY2tfaW5mbyBjdXIsIGJlc3Q7CisJc3RydWN0IGRpc3BjX2Nsb2NrX2luZm8gYmVzdF9kaXNwYzsKKwlpbnQgbWluX2Zja19wZXJfcGNrOworCWludCBtYXRjaCA9IDA7CisJdW5zaWduZWQgbG9uZyBkc3NfY2xrX2ZjazI7CisKKwlkc3NfY2xrX2ZjazIgPSBkc3NfY2xrX2dldF9yYXRlKERTU19DTEtfRkNLMik7CisKKwlpZiAocmVxX3BjayA9PSBkc2kuY2FjaGVfcmVxX3BjayAmJgorCQkJZHNpLmNhY2hlX2NpbmZvLmNsa2luID09IGRzc19jbGtfZmNrMikgeworCQlEU1NEQkcoIkRTSSBjbG9jayBpbmZvIGZvdW5kIGZyb20gY2FjaGVcbiIpOworCQkqZHNpX2NpbmZvID0gZHNpLmNhY2hlX2NpbmZvOworCQlkaXNwY19maW5kX2Nsa19kaXZzKGlzX3RmdCwgcmVxX3BjaywgZHNpX2NpbmZvLT5kc2kxX3BsbF9mY2xrLAorCQkJCWRpc3BjX2NpbmZvKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWluX2Zja19wZXJfcGNrID0gQ09ORklHX09NQVAyX0RTU19NSU5fRkNLX1BFUl9QQ0s7CisKKwlpZiAobWluX2Zja19wZXJfcGNrICYmCisJCXJlcV9wY2sgKiBtaW5fZmNrX3Blcl9wY2sgPiBESVNQQ19NQVhfRkNLKSB7CisJCURTU0VSUigiUmVxdWVzdGVkIHBpeGVsIGNsb2NrIG5vdCBwb3NzaWJsZSB3aXRoIHRoZSBjdXJyZW50ICIKKwkJCQkiT01BUDJfRFNTX01JTl9GQ0tfUEVSX1BDSyBzZXR0aW5nLiBUdXJuaW5nICIKKwkJCQkidGhlIGNvbnN0cmFpbnQgb2ZmLlxuIik7CisJCW1pbl9mY2tfcGVyX3BjayA9IDA7CisJfQorCisJRFNTREJHKCJkc2lfcGxsX2NhbGNcbiIpOworCityZXRyeToKKwltZW1zZXQoJmJlc3QsIDAsIHNpemVvZihiZXN0KSk7CisJbWVtc2V0KCZiZXN0X2Rpc3BjLCAwLCBzaXplb2YoYmVzdF9kaXNwYykpOworCisJbWVtc2V0KCZjdXIsIDAsIHNpemVvZihjdXIpKTsKKwljdXIuY2xraW4gPSBkc3NfY2xrX2ZjazI7CisJY3VyLnVzZV9kc3MyX2ZjayA9IDE7CisJY3VyLmhpZ2hmcmVxID0gMDsKKworCS8qIG5vIGhpZ2hmcmVxOiAwLjc1TUh6IDwgRmludCA9IGNsa2luIC8gcmVnbiA8IDIuMU1IeiAqLworCS8qIGhpZ2hmcmVxOiAwLjc1TUh6IDwgRmludCA9IGNsa2luIC8gKDIqcmVnbikgPCAyLjFNSHogKi8KKwkvKiBUbyByZWR1Y2UgUExMIGxvY2sgdGltZSwga2VlcCBGaW50IGhpZ2ggKGFyb3VuZCAyIE1IeikgKi8KKwlmb3IgKGN1ci5yZWduID0gMTsgY3VyLnJlZ24gPCBSRUdOX01BWDsgKytjdXIucmVnbikgeworCQlpZiAoY3VyLmhpZ2hmcmVxID09IDApCisJCQljdXIuZmludCA9IGN1ci5jbGtpbiAvIGN1ci5yZWduOworCQllbHNlCisJCQljdXIuZmludCA9IGN1ci5jbGtpbiAvICgyICogY3VyLnJlZ24pOworCisJCWlmIChjdXIuZmludCA+IEZJTlRfTUFYIHx8IGN1ci5maW50IDwgRklOVF9NSU4pCisJCQljb250aW51ZTsKKworCQkvKiBEU0lQSFkoTUh6KSA9ICgyICogcmVnbSAvIHJlZ24pICogKGNsa2luIC8gKGhpZ2hmcmVxICsgMSkpICovCisJCWZvciAoY3VyLnJlZ20gPSAxOyBjdXIucmVnbSA8IFJFR01fTUFYOyArK2N1ci5yZWdtKSB7CisJCQl1bnNpZ25lZCBsb25nIGEsIGI7CisKKwkJCWEgPSAyICogY3VyLnJlZ20gKiAoY3VyLmNsa2luLzEwMDApOworCQkJYiA9IGN1ci5yZWduICogKGN1ci5oaWdoZnJlcSArIDEpOworCQkJY3VyLmNsa2luNGRkciA9IGEgLyBiICogMTAwMDsKKworCQkJaWYgKGN1ci5jbGtpbjRkZHIgPiAxODAwICogMTAwMCAqIDEwMDApCisJCQkJYnJlYWs7CisKKwkJCS8qIERTSTFfUExMX0ZDTEsoTUh6KSA9IERTSVBIWShNSHopIC8gcmVnbTMgIDwgMTczTUh6ICovCisJCQlmb3IgKGN1ci5yZWdtMyA9IDE7IGN1ci5yZWdtMyA8IFJFR00zX01BWDsKKwkJCQkJKytjdXIucmVnbTMpIHsKKwkJCQlzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyBjdXJfZGlzcGM7CisJCQkJY3VyLmRzaTFfcGxsX2ZjbGsgPSBjdXIuY2xraW40ZGRyIC8gY3VyLnJlZ20zOworCisJCQkJLyogdGhpcyB3aWxsIG5hcnJvdyBkb3duIHRoZSBzZWFyY2ggYSBiaXQsCisJCQkJICogYnV0IHN0aWxsIGdpdmUgcGl4Y2xvY2tzIGJlbG93IHdoYXQgd2FzCisJCQkJICogcmVxdWVzdGVkICovCisJCQkJaWYgKGN1ci5kc2kxX3BsbF9mY2xrICA8IHJlcV9wY2spCisJCQkJCWJyZWFrOworCisJCQkJaWYgKGN1ci5kc2kxX3BsbF9mY2xrID4gRElTUENfTUFYX0ZDSykKKwkJCQkJY29udGludWU7CisKKwkJCQlpZiAobWluX2Zja19wZXJfcGNrICYmCisJCQkJCWN1ci5kc2kxX3BsbF9mY2xrIDwKKwkJCQkJCXJlcV9wY2sgKiBtaW5fZmNrX3Blcl9wY2spCisJCQkJCWNvbnRpbnVlOworCisJCQkJbWF0Y2ggPSAxOworCisJCQkJZGlzcGNfZmluZF9jbGtfZGl2cyhpc190ZnQsIHJlcV9wY2ssCisJCQkJCQljdXIuZHNpMV9wbGxfZmNsaywKKwkJCQkJCSZjdXJfZGlzcGMpOworCisJCQkJaWYgKGFicyhjdXJfZGlzcGMucGNrIC0gcmVxX3BjaykgPAorCQkJCQkJYWJzKGJlc3RfZGlzcGMucGNrIC0gcmVxX3BjaykpIHsKKwkJCQkJYmVzdCA9IGN1cjsKKwkJCQkJYmVzdF9kaXNwYyA9IGN1cl9kaXNwYzsKKworCQkJCQlpZiAoY3VyX2Rpc3BjLnBjayA9PSByZXFfcGNrKQorCQkJCQkJZ290byBmb3VuZDsKKwkJCQl9CisJCQl9CisJCX0KKwl9Citmb3VuZDoKKwlpZiAoIW1hdGNoKSB7CisJCWlmIChtaW5fZmNrX3Blcl9wY2spIHsKKwkJCURTU0VSUigiQ291bGQgbm90IGZpbmQgc3VpdGFibGUgY2xvY2sgc2V0dGluZ3MuXG4iCisJCQkJCSJUdXJuaW5nIEZDSy9QQ0sgY29uc3RyYWludCBvZmYgYW5kIgorCQkJCQkidHJ5aW5nIGFnYWluLlxuIik7CisJCQltaW5fZmNrX3Blcl9wY2sgPSAwOworCQkJZ290byByZXRyeTsKKwkJfQorCisJCURTU0VSUigiQ291bGQgbm90IGZpbmQgc3VpdGFibGUgY2xvY2sgc2V0dGluZ3MuXG4iKTsKKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBEU0kyX1BMTF9GQ0xLIChyZWdtNCkgaXMgbm90IHVzZWQgKi8KKwliZXN0LnJlZ200ID0gMDsKKwliZXN0LmRzaTJfcGxsX2ZjbGsgPSAwOworCisJaWYgKGRzaV9jaW5mbykKKwkJKmRzaV9jaW5mbyA9IGJlc3Q7CisJaWYgKGRpc3BjX2NpbmZvKQorCQkqZGlzcGNfY2luZm8gPSBiZXN0X2Rpc3BjOworCisJZHNpLmNhY2hlX3JlcV9wY2sgPSByZXFfcGNrOworCWRzaS5jYWNoZV9jbGtfZnJlcSA9IDA7CisJZHNpLmNhY2hlX2NpbmZvID0gYmVzdDsKKworCXJldHVybiAwOworfQorCitpbnQgZHNpX3BsbF9zZXRfY2xvY2tfZGl2KHN0cnVjdCBkc2lfY2xvY2tfaW5mbyAqY2luZm8pCit7CisJaW50IHIgPSAwOworCXUzMiBsOworCWludCBmOworCisJRFNTREJHRigpOworCisJZHNpLmN1cnJlbnRfY2luZm8uZmludCA9IGNpbmZvLT5maW50OworCWRzaS5jdXJyZW50X2NpbmZvLmNsa2luNGRkciA9IGNpbmZvLT5jbGtpbjRkZHI7CisJZHNpLmN1cnJlbnRfY2luZm8uZHNpMV9wbGxfZmNsayA9IGNpbmZvLT5kc2kxX3BsbF9mY2xrOworCWRzaS5jdXJyZW50X2NpbmZvLmRzaTJfcGxsX2ZjbGsgPSBjaW5mby0+ZHNpMl9wbGxfZmNsazsKKworCWRzaS5jdXJyZW50X2NpbmZvLnJlZ24gPSBjaW5mby0+cmVnbjsKKwlkc2kuY3VycmVudF9jaW5mby5yZWdtID0gY2luZm8tPnJlZ207CisJZHNpLmN1cnJlbnRfY2luZm8ucmVnbTMgPSBjaW5mby0+cmVnbTM7CisJZHNpLmN1cnJlbnRfY2luZm8ucmVnbTQgPSBjaW5mby0+cmVnbTQ7CisKKwlEU1NEQkcoIkRTSSBGaW50ICVsZFxuIiwgY2luZm8tPmZpbnQpOworCisJRFNTREJHKCJjbGtpbiAoJXMpIHJhdGUgJWxkLCBoaWdoZnJlcSAlZFxuIiwKKwkJCWNpbmZvLT51c2VfZHNzMl9mY2sgPyAiZHNzMl9mY2siIDogInBjbGtmcmVlIiwKKwkJCWNpbmZvLT5jbGtpbiwKKwkJCWNpbmZvLT5oaWdoZnJlcSk7CisKKwkvKiBEU0lQSFkgPT0gQ0xLSU40RERSICovCisJRFNTREJHKCJDTEtJTjRERFIgPSAyICogJWQgLyAlZCAqICVsdSAvICVkID0gJWx1XG4iLAorCQkJY2luZm8tPnJlZ20sCisJCQljaW5mby0+cmVnbiwKKwkJCWNpbmZvLT5jbGtpbiwKKwkJCWNpbmZvLT5oaWdoZnJlcSArIDEsCisJCQljaW5mby0+Y2xraW40ZGRyKTsKKworCURTU0RCRygiRGF0YSByYXRlIG9uIDEgRFNJIGxhbmUgJWxkIE1icHNcbiIsCisJCQljaW5mby0+Y2xraW40ZGRyIC8gMTAwMCAvIDEwMDAgLyAyKTsKKworCURTU0RCRygiQ2xvY2sgbGFuZSBmcmVxICVsZCBIelxuIiwgY2luZm8tPmNsa2luNGRkciAvIDQpOworCisJRFNTREJHKCJyZWdtMyA9ICVkLCBkc2kxX3BsbF9mY2xrID0gJWx1XG4iLAorCQkJY2luZm8tPnJlZ20zLCBjaW5mby0+ZHNpMV9wbGxfZmNsayk7CisJRFNTREJHKCJyZWdtNCA9ICVkLCBkc2kyX3BsbF9mY2xrID0gJWx1XG4iLAorCQkJY2luZm8tPnJlZ200LCBjaW5mby0+ZHNpMl9wbGxfZmNsayk7CisKKwlSRUdfRkxEX01PRChEU0lfUExMX0NPTlRST0wsIDAsIDAsIDApOyAvKiBEU0lfUExMX0FVVE9NT0RFID0gbWFudWFsICovCisKKwlsID0gZHNpX3JlYWRfcmVnKERTSV9QTExfQ09ORklHVVJBVElPTjEpOworCWwgPSBGTERfTU9EKGwsIDEsIDAsIDApOwkJLyogRFNJX1BMTF9TVE9QTU9ERSAqLworCWwgPSBGTERfTU9EKGwsIGNpbmZvLT5yZWduIC0gMSwgNywgMSk7CS8qIERTSV9QTExfUkVHTiAqLworCWwgPSBGTERfTU9EKGwsIGNpbmZvLT5yZWdtLCAxOCwgOCk7CS8qIERTSV9QTExfUkVHTSAqLworCWwgPSBGTERfTU9EKGwsIGNpbmZvLT5yZWdtMyA+IDAgPyBjaW5mby0+cmVnbTMgLSAxIDogMCwKKwkJCTIyLCAxOSk7CQkvKiBEU0lfQ0xPQ0tfRElWICovCisJbCA9IEZMRF9NT0QobCwgY2luZm8tPnJlZ200ID4gMCA/IGNpbmZvLT5yZWdtNCAtIDEgOiAwLAorCQkJMjYsIDIzKTsJCS8qIERTSVBST1RPX0NMT0NLX0RJViAqLworCWRzaV93cml0ZV9yZWcoRFNJX1BMTF9DT05GSUdVUkFUSU9OMSwgbCk7CisKKwlCVUdfT04oY2luZm8tPmZpbnQgPCA3NTAwMDAgfHwgY2luZm8tPmZpbnQgPiAyMTAwMDAwKTsKKwlpZiAoY2luZm8tPmZpbnQgPCAxMDAwMDAwKQorCQlmID0gMHgzOworCWVsc2UgaWYgKGNpbmZvLT5maW50IDwgMTI1MDAwMCkKKwkJZiA9IDB4NDsKKwllbHNlIGlmIChjaW5mby0+ZmludCA8IDE1MDAwMDApCisJCWYgPSAweDU7CisJZWxzZSBpZiAoY2luZm8tPmZpbnQgPCAxNzUwMDAwKQorCQlmID0gMHg2OworCWVsc2UKKwkJZiA9IDB4NzsKKworCWwgPSBkc2lfcmVhZF9yZWcoRFNJX1BMTF9DT05GSUdVUkFUSU9OMik7CisJbCA9IEZMRF9NT0QobCwgZiwgNCwgMSk7CQkvKiBEU0lfUExMX0ZSRVFTRUwgKi8KKwlsID0gRkxEX01PRChsLCBjaW5mby0+dXNlX2RzczJfZmNrID8gMCA6IDEsCisJCQkxMSwgMTEpOwkJLyogRFNJX1BMTF9DTEtTRUwgKi8KKwlsID0gRkxEX01PRChsLCBjaW5mby0+aGlnaGZyZXEsCisJCQkxMiwgMTIpOwkJLyogRFNJX1BMTF9ISUdIRlJFUSAqLworCWwgPSBGTERfTU9EKGwsIDEsIDEzLCAxMyk7CQkvKiBEU0lfUExMX1JFRkVOICovCisJbCA9IEZMRF9NT0QobCwgMCwgMTQsIDE0KTsJCS8qIERTSVBIWV9DTEtJTkVOICovCisJbCA9IEZMRF9NT0QobCwgMSwgMjAsIDIwKTsJCS8qIERTSV9IU0RJVkJZUEFTUyAqLworCWRzaV93cml0ZV9yZWcoRFNJX1BMTF9DT05GSUdVUkFUSU9OMiwgbCk7CisKKwlSRUdfRkxEX01PRChEU0lfUExMX0dPLCAxLCAwLCAwKTsJLyogRFNJX1BMTF9HTyAqLworCisJaWYgKHdhaXRfZm9yX2JpdF9jaGFuZ2UoRFNJX1BMTF9HTywgMCwgMCkgIT0gMCkgeworCQlEU1NFUlIoImRzaSBwbGwgZ28gYml0IG5vdCBnb2luZyBkb3duLlxuIik7CisJCXIgPSAtRUlPOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAod2FpdF9mb3JfYml0X2NoYW5nZShEU0lfUExMX1NUQVRVUywgMSwgMSkgIT0gMSkgeworCQlEU1NFUlIoImNhbm5vdCBsb2NrIFBMTFxuIik7CisJCXIgPSAtRUlPOworCQlnb3RvIGVycjsKKwl9CisKKwlkc2kucGxsX2xvY2tlZCA9IDE7CisKKwlsID0gZHNpX3JlYWRfcmVnKERTSV9QTExfQ09ORklHVVJBVElPTjIpOworCWwgPSBGTERfTU9EKGwsIDAsIDAsIDApOwkvKiBEU0lfUExMX0lETEUgKi8KKwlsID0gRkxEX01PRChsLCAwLCA1LCA1KTsJLyogRFNJX1BMTF9QTExMUE1PREUgKi8KKwlsID0gRkxEX01PRChsLCAwLCA2LCA2KTsJLyogRFNJX1BMTF9MT1dDVVJSU1RCWSAqLworCWwgPSBGTERfTU9EKGwsIDAsIDcsIDcpOwkvKiBEU0lfUExMX1RJR0hUUEhBU0VMT0NLICovCisJbCA9IEZMRF9NT0QobCwgMCwgOCwgOCk7CS8qIERTSV9QTExfRFJJRlRHVUFSREVOICovCisJbCA9IEZMRF9NT0QobCwgMCwgMTAsIDkpOwkvKiBEU0lfUExMX0xPQ0tTRUwgKi8KKwlsID0gRkxEX01PRChsLCAxLCAxMywgMTMpOwkvKiBEU0lfUExMX1JFRkVOICovCisJbCA9IEZMRF9NT0QobCwgMSwgMTQsIDE0KTsJLyogRFNJUEhZX0NMS0lORU4gKi8KKwlsID0gRkxEX01PRChsLCAwLCAxNSwgMTUpOwkvKiBEU0lfQllQQVNTRU4gKi8KKwlsID0gRkxEX01PRChsLCAxLCAxNiwgMTYpOwkvKiBEU1NfQ0xPQ0tfRU4gKi8KKwlsID0gRkxEX01PRChsLCAwLCAxNywgMTcpOwkvKiBEU1NfQ0xPQ0tfUFdETiAqLworCWwgPSBGTERfTU9EKGwsIDEsIDE4LCAxOCk7CS8qIERTSV9QUk9UT19DTE9DS19FTiAqLworCWwgPSBGTERfTU9EKGwsIDAsIDE5LCAxOSk7CS8qIERTSV9QUk9UT19DTE9DS19QV0ROICovCisJbCA9IEZMRF9NT0QobCwgMCwgMjAsIDIwKTsJLyogRFNJX0hTRElWQllQQVNTICovCisJZHNpX3dyaXRlX3JlZyhEU0lfUExMX0NPTkZJR1VSQVRJT04yLCBsKTsKKworCURTU0RCRygiUExMIGNvbmZpZyBkb25lXG4iKTsKK2VycjoKKwlyZXR1cm4gcjsKK30KKworaW50IGRzaV9wbGxfaW5pdChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGJvb2wgZW5hYmxlX2hzY2xrLAorCQlib29sIGVuYWJsZV9oc2RpdikKK3sKKwlpbnQgciA9IDA7CisJZW51bSBkc2lfcGxsX3Bvd2VyX3N0YXRlIHB3c3RhdGU7CisKKwlEU1NEQkcoIlBMTCBpbml0XG4iKTsKKworCWVuYWJsZV9jbG9ja3MoMSk7CisJZHNpX2VuYWJsZV9wbGxfY2xvY2soMSk7CisKKwlyID0gcmVndWxhdG9yX2VuYWJsZShkc2kudmRkc19kc2lfcmVnKTsKKwlpZiAocikKKwkJZ290byBlcnIwOworCisJLyogWFhYIFBMTCBkb2VzIG5vdCBjb21lIG91dCBvZiByZXNldCB3aXRob3V0IHRoaXMuLi4gKi8KKwlkaXNwY19wY2tfZnJlZV9lbmFibGUoMSk7CisKKwlpZiAod2FpdF9mb3JfYml0X2NoYW5nZShEU0lfUExMX1NUQVRVUywgMCwgMSkgIT0gMSkgeworCQlEU1NFUlIoIlBMTCBub3QgY29taW5nIG91dCBvZiByZXNldC5cbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBlcnIxOworCX0KKworCS8qIFhYWCAuLi4gYnV0IGlmIGxlZnQgb24sIHdlIGdldCBwcm9ibGVtcyB3aGVuIHBsYW5lcyBkbyBub3QKKwkgKiBmaWxsIHRoZSB3aG9sZSBkaXNwbGF5LiBObyBpZGVhIGFib3V0IHRoaXMgKi8KKwlkaXNwY19wY2tfZnJlZV9lbmFibGUoMCk7CisKKwlpZiAoZW5hYmxlX2hzY2xrICYmIGVuYWJsZV9oc2RpdikKKwkJcHdzdGF0ZSA9IERTSV9QTExfUE9XRVJfT05fQUxMOworCWVsc2UgaWYgKGVuYWJsZV9oc2NsaykKKwkJcHdzdGF0ZSA9IERTSV9QTExfUE9XRVJfT05fSFNDTEs7CisJZWxzZSBpZiAoZW5hYmxlX2hzZGl2KQorCQlwd3N0YXRlID0gRFNJX1BMTF9QT1dFUl9PTl9ESVY7CisJZWxzZQorCQlwd3N0YXRlID0gRFNJX1BMTF9QT1dFUl9PRkY7CisKKwlyID0gZHNpX3BsbF9wb3dlcihwd3N0YXRlKTsKKworCWlmIChyKQorCQlnb3RvIGVycjE7CisKKwlEU1NEQkcoIlBMTCBpbml0IGRvbmVcbiIpOworCisJcmV0dXJuIDA7CitlcnIxOgorCXJlZ3VsYXRvcl9kaXNhYmxlKGRzaS52ZGRzX2RzaV9yZWcpOworZXJyMDoKKwllbmFibGVfY2xvY2tzKDApOworCWRzaV9lbmFibGVfcGxsX2Nsb2NrKDApOworCXJldHVybiByOworfQorCit2b2lkIGRzaV9wbGxfdW5pbml0KHZvaWQpCit7CisJZW5hYmxlX2Nsb2NrcygwKTsKKwlkc2lfZW5hYmxlX3BsbF9jbG9jaygwKTsKKworCWRzaS5wbGxfbG9ja2VkID0gMDsKKwlkc2lfcGxsX3Bvd2VyKERTSV9QTExfUE9XRVJfT0ZGKTsKKwlyZWd1bGF0b3JfZGlzYWJsZShkc2kudmRkc19kc2lfcmVnKTsKKwlEU1NEQkcoIlBMTCB1bmluaXQgZG9uZVxuIik7Cit9CisKK3ZvaWQgZHNpX2R1bXBfY2xvY2tzKHN0cnVjdCBzZXFfZmlsZSAqcykKK3sKKwlpbnQgY2xrc2VsOworCXN0cnVjdCBkc2lfY2xvY2tfaW5mbyAqY2luZm8gPSAmZHNpLmN1cnJlbnRfY2luZm87CisKKwllbmFibGVfY2xvY2tzKDEpOworCisJY2xrc2VsID0gUkVHX0dFVChEU0lfUExMX0NPTkZJR1VSQVRJT04yLCAxMSwgMTEpOworCisJc2VxX3ByaW50ZihzLAkiLSBEU0kgUExMIC1cbiIpOworCisJc2VxX3ByaW50ZihzLAkiZHNpIHBsbCBzb3VyY2UgPSAlc1xuIiwKKwkJCWNsa3NlbCA9PSAwID8KKwkJCSJkc3MyX2Fsd29uX2ZjbGsiIDogInBjbGtmcmVlIik7CisKKwlzZXFfcHJpbnRmKHMsCSJGaW50XHRcdCUtMTZsdXJlZ24gJXVcbiIsIGNpbmZvLT5maW50LCBjaW5mby0+cmVnbik7CisKKwlzZXFfcHJpbnRmKHMsCSJDTEtJTjRERFJcdCUtMTZsdXJlZ20gJXVcbiIsCisJCQljaW5mby0+Y2xraW40ZGRyLCBjaW5mby0+cmVnbSk7CisKKwlzZXFfcHJpbnRmKHMsCSJkc2kxX3BsbF9mY2tcdCUtMTZsdXJlZ20zICV1XHQoJXMpXG4iLAorCQkJY2luZm8tPmRzaTFfcGxsX2ZjbGssCisJCQljaW5mby0+cmVnbTMsCisJCQlkc3NfZ2V0X2Rpc3BjX2Nsa19zb3VyY2UoKSA9PSAwID8gIm9mZiIgOiAib24iKTsKKworCXNlcV9wcmludGYocywJImRzaTJfcGxsX2Zja1x0JS0xNmx1cmVnbTQgJXVcdCglcylcbiIsCisJCQljaW5mby0+ZHNpMl9wbGxfZmNsaywKKwkJCWNpbmZvLT5yZWdtNCwKKwkJCWRzc19nZXRfZHNpX2Nsa19zb3VyY2UoKSA9PSAwID8gIm9mZiIgOiAib24iKTsKKworCXNlcV9wcmludGYocywJIi0gRFNJIC1cbiIpOworCisJc2VxX3ByaW50ZihzLAkiZHNpIGZjbGsgc291cmNlID0gJXNcbiIsCisJCQlkc3NfZ2V0X2RzaV9jbGtfc291cmNlKCkgPT0gMCA/CisJCQkiZHNzMV9hbHdvbl9mY2xrIiA6ICJkc2kyX3BsbF9mY2xrIik7CisKKwlzZXFfcHJpbnRmKHMsCSJEU0lfRkNMS1x0JWx1XG4iLCBkc2lfZmNsa19yYXRlKCkpOworCisJc2VxX3ByaW50ZihzLAkiRERSX0NMS1x0XHQlbHVcbiIsCisJCQljaW5mby0+Y2xraW40ZGRyIC8gNCk7CisKKwlzZXFfcHJpbnRmKHMsCSJUeEJ5dGVDbGtIU1x0JWx1XG4iLCBkc2lfZ2V0X3R4Ynl0ZWNsa2hzKCkpOworCisJc2VxX3ByaW50ZihzLAkiTFBfQ0xLXHRcdCVsdVxuIiwgY2luZm8tPmxwX2Nsayk7CisKKwlzZXFfcHJpbnRmKHMsCSJWUF9DTEtcdFx0JWx1XG4iCisJCQkiVlBfUENMS1x0XHQlbHVcbiIsCisJCQlkaXNwY19sY2xrX3JhdGUoKSwKKwkJCWRpc3BjX3BjbGtfcmF0ZSgpKTsKKworCWVuYWJsZV9jbG9ja3MoMCk7Cit9CisKK3ZvaWQgZHNpX2R1bXBfcmVncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCit7CisjZGVmaW5lIERVTVBSRUcocikgc2VxX3ByaW50ZihzLCAiJS0zNXMgJTA4eFxuIiwgI3IsIGRzaV9yZWFkX3JlZyhyKSkKKworCWRzc19jbGtfZW5hYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0sxKTsKKworCURVTVBSRUcoRFNJX1JFVklTSU9OKTsKKwlEVU1QUkVHKERTSV9TWVNDT05GSUcpOworCURVTVBSRUcoRFNJX1NZU1NUQVRVUyk7CisJRFVNUFJFRyhEU0lfSVJRU1RBVFVTKTsKKwlEVU1QUkVHKERTSV9JUlFFTkFCTEUpOworCURVTVBSRUcoRFNJX0NUUkwpOworCURVTVBSRUcoRFNJX0NPTVBMRVhJT19DRkcxKTsKKwlEVU1QUkVHKERTSV9DT01QTEVYSU9fSVJRX1NUQVRVUyk7CisJRFVNUFJFRyhEU0lfQ09NUExFWElPX0lSUV9FTkFCTEUpOworCURVTVBSRUcoRFNJX0NMS19DVFJMKTsKKwlEVU1QUkVHKERTSV9USU1JTkcxKTsKKwlEVU1QUkVHKERTSV9USU1JTkcyKTsKKwlEVU1QUkVHKERTSV9WTV9USU1JTkcxKTsKKwlEVU1QUkVHKERTSV9WTV9USU1JTkcyKTsKKwlEVU1QUkVHKERTSV9WTV9USU1JTkczKTsKKwlEVU1QUkVHKERTSV9DTEtfVElNSU5HKTsKKwlEVU1QUkVHKERTSV9UWF9GSUZPX1ZDX1NJWkUpOworCURVTVBSRUcoRFNJX1JYX0ZJRk9fVkNfU0laRSk7CisJRFVNUFJFRyhEU0lfQ09NUExFWElPX0NGRzIpOworCURVTVBSRUcoRFNJX1JYX0ZJRk9fVkNfRlVMTE5FU1MpOworCURVTVBSRUcoRFNJX1ZNX1RJTUlORzQpOworCURVTVBSRUcoRFNJX1RYX0ZJRk9fVkNfRU1QVElORVNTKTsKKwlEVU1QUkVHKERTSV9WTV9USU1JTkc1KTsKKwlEVU1QUkVHKERTSV9WTV9USU1JTkc2KTsKKwlEVU1QUkVHKERTSV9WTV9USU1JTkc3KTsKKwlEVU1QUkVHKERTSV9TVE9QQ0xLX1RJTUlORyk7CisKKwlEVU1QUkVHKERTSV9WQ19DVFJMKDApKTsKKwlEVU1QUkVHKERTSV9WQ19URSgwKSk7CisJRFVNUFJFRyhEU0lfVkNfTE9OR19QQUNLRVRfSEVBREVSKDApKTsKKwlEVU1QUkVHKERTSV9WQ19MT05HX1BBQ0tFVF9QQVlMT0FEKDApKTsKKwlEVU1QUkVHKERTSV9WQ19TSE9SVF9QQUNLRVRfSEVBREVSKDApKTsKKwlEVU1QUkVHKERTSV9WQ19JUlFTVEFUVVMoMCkpOworCURVTVBSRUcoRFNJX1ZDX0lSUUVOQUJMRSgwKSk7CisKKwlEVU1QUkVHKERTSV9WQ19DVFJMKDEpKTsKKwlEVU1QUkVHKERTSV9WQ19URSgxKSk7CisJRFVNUFJFRyhEU0lfVkNfTE9OR19QQUNLRVRfSEVBREVSKDEpKTsKKwlEVU1QUkVHKERTSV9WQ19MT05HX1BBQ0tFVF9QQVlMT0FEKDEpKTsKKwlEVU1QUkVHKERTSV9WQ19TSE9SVF9QQUNLRVRfSEVBREVSKDEpKTsKKwlEVU1QUkVHKERTSV9WQ19JUlFTVEFUVVMoMSkpOworCURVTVBSRUcoRFNJX1ZDX0lSUUVOQUJMRSgxKSk7CisKKwlEVU1QUkVHKERTSV9WQ19DVFJMKDIpKTsKKwlEVU1QUkVHKERTSV9WQ19URSgyKSk7CisJRFVNUFJFRyhEU0lfVkNfTE9OR19QQUNLRVRfSEVBREVSKDIpKTsKKwlEVU1QUkVHKERTSV9WQ19MT05HX1BBQ0tFVF9QQVlMT0FEKDIpKTsKKwlEVU1QUkVHKERTSV9WQ19TSE9SVF9QQUNLRVRfSEVBREVSKDIpKTsKKwlEVU1QUkVHKERTSV9WQ19JUlFTVEFUVVMoMikpOworCURVTVBSRUcoRFNJX1ZDX0lSUUVOQUJMRSgyKSk7CisKKwlEVU1QUkVHKERTSV9WQ19DVFJMKDMpKTsKKwlEVU1QUkVHKERTSV9WQ19URSgzKSk7CisJRFVNUFJFRyhEU0lfVkNfTE9OR19QQUNLRVRfSEVBREVSKDMpKTsKKwlEVU1QUkVHKERTSV9WQ19MT05HX1BBQ0tFVF9QQVlMT0FEKDMpKTsKKwlEVU1QUkVHKERTSV9WQ19TSE9SVF9QQUNLRVRfSEVBREVSKDMpKTsKKwlEVU1QUkVHKERTSV9WQ19JUlFTVEFUVVMoMykpOworCURVTVBSRUcoRFNJX1ZDX0lSUUVOQUJMRSgzKSk7CisKKwlEVU1QUkVHKERTSV9EU0lQSFlfQ0ZHMCk7CisJRFVNUFJFRyhEU0lfRFNJUEhZX0NGRzEpOworCURVTVBSRUcoRFNJX0RTSVBIWV9DRkcyKTsKKwlEVU1QUkVHKERTSV9EU0lQSFlfQ0ZHNSk7CisKKwlEVU1QUkVHKERTSV9QTExfQ09OVFJPTCk7CisJRFVNUFJFRyhEU0lfUExMX1NUQVRVUyk7CisJRFVNUFJFRyhEU0lfUExMX0dPKTsKKwlEVU1QUkVHKERTSV9QTExfQ09ORklHVVJBVElPTjEpOworCURVTVBSRUcoRFNJX1BMTF9DT05GSUdVUkFUSU9OMik7CisKKwlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSzEpOworI3VuZGVmIERVTVBSRUcKK30KKworZW51bSBkc2lfY29tcGxleGlvX3Bvd2VyX3N0YXRlIHsKKwlEU0lfQ09NUExFWElPX1BPV0VSX09GRgkJPSAweDAsCisJRFNJX0NPTVBMRVhJT19QT1dFUl9PTgkJPSAweDEsCisJRFNJX0NPTVBMRVhJT19QT1dFUl9VTFBTCT0gMHgyLAorfTsKKworc3RhdGljIGludCBkc2lfY29tcGxleGlvX3Bvd2VyKGVudW0gZHNpX2NvbXBsZXhpb19wb3dlcl9zdGF0ZSBzdGF0ZSkKK3sKKwlpbnQgdCA9IDA7CisKKwkvKiBQV1JfQ01EICovCisJUkVHX0ZMRF9NT0QoRFNJX0NPTVBMRVhJT19DRkcxLCBzdGF0ZSwgMjgsIDI3KTsKKworCS8qIFBXUl9TVEFUVVMgKi8KKwl3aGlsZSAoRkxEX0dFVChkc2lfcmVhZF9yZWcoRFNJX0NPTVBMRVhJT19DRkcxKSwgMjYsIDI1KSAhPSBzdGF0ZSkgeworCQl1ZGVsYXkoMSk7CisJCWlmICh0KysgPiAxMDAwKSB7CisJCQlEU1NFUlIoImZhaWxlZCB0byBzZXQgY29tcGxleGlvIHBvd2VyIHN0YXRlIHRvICIKKwkJCQkJIiVkXG4iLCBzdGF0ZSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkc2lfY29tcGxleGlvX2NvbmZpZyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJdTMyIHI7CisKKwlpbnQgY2xrX2xhbmUgICA9IGRzc2Rldi0+cGh5LmRzaS5jbGtfbGFuZTsKKwlpbnQgZGF0YTFfbGFuZSA9IGRzc2Rldi0+cGh5LmRzaS5kYXRhMV9sYW5lOworCWludCBkYXRhMl9sYW5lID0gZHNzZGV2LT5waHkuZHNpLmRhdGEyX2xhbmU7CisJaW50IGNsa19wb2wgICAgPSBkc3NkZXYtPnBoeS5kc2kuY2xrX3BvbDsKKwlpbnQgZGF0YTFfcG9sICA9IGRzc2Rldi0+cGh5LmRzaS5kYXRhMV9wb2w7CisJaW50IGRhdGEyX3BvbCAgPSBkc3NkZXYtPnBoeS5kc2kuZGF0YTJfcG9sOworCisJciA9IGRzaV9yZWFkX3JlZyhEU0lfQ09NUExFWElPX0NGRzEpOworCXIgPSBGTERfTU9EKHIsIGNsa19sYW5lLCAyLCAwKTsKKwlyID0gRkxEX01PRChyLCBjbGtfcG9sLCAzLCAzKTsKKwlyID0gRkxEX01PRChyLCBkYXRhMV9sYW5lLCA2LCA0KTsKKwlyID0gRkxEX01PRChyLCBkYXRhMV9wb2wsIDcsIDcpOworCXIgPSBGTERfTU9EKHIsIGRhdGEyX2xhbmUsIDEwLCA4KTsKKwlyID0gRkxEX01PRChyLCBkYXRhMl9wb2wsIDExLCAxMSk7CisJZHNpX3dyaXRlX3JlZyhEU0lfQ09NUExFWElPX0NGRzEsIHIpOworCisJLyogVGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIERTSSBjb21wbGV4IEkvTyAobnVtYmVyIG9mIGRhdGEgbGFuZXMsCisJICAgcG9zaXRpb24sIGRpZmZlcmVudGlhbCBvcmRlcikgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIHdoaWxlCisJICAgRFNTLkRTSV9DTEtfQ1JUUkxbMjBdIExQX0NMS19FTkFCTEUgYml0IGlzIHNldCB0byAxLiBJbiBvcmRlciBmb3IKKwkgICB0aGUgaGFyZHdhcmUgdG8gdGFrZSBpbnRvIGFjY291bnQgYSBuZXcgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tcGxleAorCSAgIEkvTyAoZG9uZSBpbiBEU1MuRFNJX0NPTVBMRVhJT19DRkcxIHJlZ2lzdGVyKSwgaXQgaXMgcmVjb21tZW5kZWQgdG8KKwkgICBmb2xsb3cgdGhpcyBzZXF1ZW5jZTogRmlyc3Qgc2V0IHRoZSBEU1MuRFNJX0NUUkxbMF0gSUZfRU4gYml0IHRvIDEsCisJICAgdGhlbiByZXNldCB0aGUgRFNTLkRTSV9DVFJMWzBdIElGX0VOIHRvIDAsIHRoZW4gc2V0CisJICAgRFNTLkRTSV9DTEtfQ1RSTFsyMF0gTFBfQ0xLX0VOQUJMRSB0byAxIGFuZCBmaW5hbGx5IHNldCBhZ2FpbiB0aGUKKwkgICBEU1MuRFNJX0NUUkxbMF0gSUZfRU4gYml0IHRvIDEuIElmIHRoZSBzZXF1ZW5jZSBpcyBub3QgZm9sbG93ZWQsIHRoZQorCSAgIERTSSBjb21wbGV4IEkvTyBjb25maWd1cmF0aW9uIGlzIHVua25vd24uICovCisKKwkvKgorCVJFR19GTERfTU9EKERTSV9DVFJMLCAxLCAwLCAwKTsKKwlSRUdfRkxEX01PRChEU0lfQ1RSTCwgMCwgMCwgMCk7CisJUkVHX0ZMRF9NT0QoRFNJX0NMS19DVFJMLCAxLCAyMCwgMjApOworCVJFR19GTERfTU9EKERTSV9DVFJMLCAxLCAwLCAwKTsKKwkqLworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIG5zMmRkcih1bnNpZ25lZCBucykKK3sKKwkvKiBjb252ZXJ0IHRpbWUgaW4gbnMgdG8gZGRyIHRpY2tzLCByb3VuZGluZyB1cCAqLworCXVuc2lnbmVkIGxvbmcgZGRyX2NsayA9IGRzaS5jdXJyZW50X2NpbmZvLmNsa2luNGRkciAvIDQ7CisJcmV0dXJuIChucyAqIChkZHJfY2xrIC8gMTAwMCAvIDEwMDApICsgOTk5KSAvIDEwMDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZGRyMm5zKHVuc2lnbmVkIGRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGRkcl9jbGsgPSBkc2kuY3VycmVudF9jaW5mby5jbGtpbjRkZHIgLyA0OworCXJldHVybiBkZHIgKiAxMDAwICogMTAwMCAvIChkZHJfY2xrIC8gMTAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRzaV9jb21wbGV4aW9fdGltaW5ncyh2b2lkKQoreworCXUzMiByOworCXUzMiB0aHNfcHJlcGFyZSwgdGhzX3ByZXBhcmVfdGhzX3plcm8sIHRoc190cmFpbCwgdGhzX2V4aXQ7CisJdTMyIHRscHhfaGFsZiwgdGNsa190cmFpbCwgdGNsa196ZXJvOworCXUzMiB0Y2xrX3ByZXBhcmU7CisKKwkvKiBjYWxjdWxhdGUgdGltaW5ncyAqLworCisJLyogMSAqIEREUl9DTEsgPSAyICogVUkgKi8KKworCS8qIG1pbiA0MG5zICsgNCpVSQltYXggODVucyArIDYqVUkgKi8KKwl0aHNfcHJlcGFyZSA9IG5zMmRkcig3MCkgKyAyOworCisJLyogbWluIDE0NW5zICsgMTAqVUkgKi8KKwl0aHNfcHJlcGFyZV90aHNfemVybyA9IG5zMmRkcigxNzUpICsgMjsKKworCS8qIG1pbiBtYXgoOCpVSSwgNjBucys0KlVJKSAqLworCXRoc190cmFpbCA9IG5zMmRkcig2MCkgKyA1OworCisJLyogbWluIDEwMG5zICovCisJdGhzX2V4aXQgPSBuczJkZHIoMTQ1KTsKKworCS8qIHRscHggbWluIDUwbiAqLworCXRscHhfaGFsZiA9IG5zMmRkcigyNSk7CisKKwkvKiBtaW4gNjBucyAqLworCXRjbGtfdHJhaWwgPSBuczJkZHIoNjApICsgMjsKKworCS8qIG1pbiAzOG5zLCBtYXggOTVucyAqLworCXRjbGtfcHJlcGFyZSA9IG5zMmRkcig2NSk7CisKKwkvKiBtaW4gdGNsay1wcmVwYXJlICsgdGNsay16ZXJvID0gMzAwbnMgKi8KKwl0Y2xrX3plcm8gPSBuczJkZHIoMjYwKTsKKworCURTU0RCRygidGhzX3ByZXBhcmUgJXUgKCV1bnMpLCB0aHNfcHJlcGFyZV90aHNfemVybyAldSAoJXVucylcbiIsCisJCXRoc19wcmVwYXJlLCBkZHIybnModGhzX3ByZXBhcmUpLAorCQl0aHNfcHJlcGFyZV90aHNfemVybywgZGRyMm5zKHRoc19wcmVwYXJlX3Roc196ZXJvKSk7CisJRFNTREJHKCJ0aHNfdHJhaWwgJXUgKCV1bnMpLCB0aHNfZXhpdCAldSAoJXVucylcbiIsCisJCQl0aHNfdHJhaWwsIGRkcjJucyh0aHNfdHJhaWwpLAorCQkJdGhzX2V4aXQsIGRkcjJucyh0aHNfZXhpdCkpOworCisJRFNTREJHKCJ0bHB4X2hhbGYgJXUgKCV1bnMpLCB0Y2xrX3RyYWlsICV1ICgldW5zKSwgIgorCQkJInRjbGtfemVybyAldSAoJXVucylcbiIsCisJCQl0bHB4X2hhbGYsIGRkcjJucyh0bHB4X2hhbGYpLAorCQkJdGNsa190cmFpbCwgZGRyMm5zKHRjbGtfdHJhaWwpLAorCQkJdGNsa196ZXJvLCBkZHIybnModGNsa196ZXJvKSk7CisJRFNTREJHKCJ0Y2xrX3ByZXBhcmUgJXUgKCV1bnMpXG4iLAorCQkJdGNsa19wcmVwYXJlLCBkZHIybnModGNsa19wcmVwYXJlKSk7CisKKwkvKiBwcm9ncmFtIHRpbWluZ3MgKi8KKworCXIgPSBkc2lfcmVhZF9yZWcoRFNJX0RTSVBIWV9DRkcwKTsKKwlyID0gRkxEX01PRChyLCB0aHNfcHJlcGFyZSwgMzEsIDI0KTsKKwlyID0gRkxEX01PRChyLCB0aHNfcHJlcGFyZV90aHNfemVybywgMjMsIDE2KTsKKwlyID0gRkxEX01PRChyLCB0aHNfdHJhaWwsIDE1LCA4KTsKKwlyID0gRkxEX01PRChyLCB0aHNfZXhpdCwgNywgMCk7CisJZHNpX3dyaXRlX3JlZyhEU0lfRFNJUEhZX0NGRzAsIHIpOworCisJciA9IGRzaV9yZWFkX3JlZyhEU0lfRFNJUEhZX0NGRzEpOworCXIgPSBGTERfTU9EKHIsIHRscHhfaGFsZiwgMjIsIDE2KTsKKwlyID0gRkxEX01PRChyLCB0Y2xrX3RyYWlsLCAxNSwgOCk7CisJciA9IEZMRF9NT0QociwgdGNsa196ZXJvLCA3LCAwKTsKKwlkc2lfd3JpdGVfcmVnKERTSV9EU0lQSFlfQ0ZHMSwgcik7CisKKwlyID0gZHNpX3JlYWRfcmVnKERTSV9EU0lQSFlfQ0ZHMik7CisJciA9IEZMRF9NT0QociwgdGNsa19wcmVwYXJlLCA3LCAwKTsKKwlkc2lfd3JpdGVfcmVnKERTSV9EU0lQSFlfQ0ZHMiwgcik7Cit9CisKKworc3RhdGljIGludCBkc2lfY29tcGxleGlvX2luaXQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWludCByID0gMDsKKworCURTU0RCRygiZHNpX2NvbXBsZXhpb19pbml0XG4iKTsKKworCS8qIENJT19DTEtfSUNHLCBlbmFibGUgTDMgY2xrIHRvIENJTyAqLworCVJFR19GTERfTU9EKERTSV9DTEtfQ1RSTCwgMSwgMTQsIDE0KTsKKworCS8qIEEgZHVtbXkgcmVhZCB1c2luZyB0aGUgU0NQIGludGVyZmFjZSB0byBhbnkgRFNJUEhZIHJlZ2lzdGVyIGlzCisJICogcmVxdWlyZWQgYWZ0ZXIgRFNJUEhZIHJlc2V0IHRvIGNvbXBsZXRlIHRoZSByZXNldCBvZiB0aGUgRFNJIGNvbXBsZXgKKwkgKiBJL08uICovCisJZHNpX3JlYWRfcmVnKERTSV9EU0lQSFlfQ0ZHNSk7CisKKwlpZiAod2FpdF9mb3JfYml0X2NoYW5nZShEU0lfRFNJUEhZX0NGRzUsIDMwLCAxKSAhPSAxKSB7CisJCURTU0VSUigiQ29tcGxleElPIFBIWSBub3QgY29taW5nIG91dCBvZiByZXNldC5cbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJZHNpX2NvbXBsZXhpb19jb25maWcoZHNzZGV2KTsKKworCXIgPSBkc2lfY29tcGxleGlvX3Bvd2VyKERTSV9DT01QTEVYSU9fUE9XRVJfT04pOworCisJaWYgKHIpCisJCWdvdG8gZXJyOworCisJaWYgKHdhaXRfZm9yX2JpdF9jaGFuZ2UoRFNJX0NPTVBMRVhJT19DRkcxLCAyOSwgMSkgIT0gMSkgeworCQlEU1NFUlIoIkNvbXBsZXhJTyBub3QgY29taW5nIG91dCBvZiByZXNldC5cbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKHdhaXRfZm9yX2JpdF9jaGFuZ2UoRFNJX0NPTVBMRVhJT19DRkcxLCAyMSwgMSkgIT0gMSkgeworCQlEU1NFUlIoIkNvbXBsZXhJTyBMRE8gcG93ZXIgZG93bi5cbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJZHNpX2NvbXBsZXhpb190aW1pbmdzKCk7CisKKwkvKgorCSAgIFRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBEU0kgY29tcGxleCBJL08gKG51bWJlciBvZiBkYXRhIGxhbmVzLAorCSAgIHBvc2l0aW9uLCBkaWZmZXJlbnRpYWwgb3JkZXIpIHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aGlsZQorCSAgIERTUy5EU0lfQ0xLX0NSVFJMWzIwXSBMUF9DTEtfRU5BQkxFIGJpdCBpcyBzZXQgdG8gMS4gRm9yIHRoZQorCSAgIGhhcmR3YXJlIHRvIHJlY29nbml6ZSBhIG5ldyBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wbGV4IEkvTyAoZG9uZQorCSAgIGluIERTUy5EU0lfQ09NUExFWElPX0NGRzEgcmVnaXN0ZXIpLCBpdCBpcyByZWNvbW1lbmRlZCB0byBmb2xsb3cKKwkgICB0aGlzIHNlcXVlbmNlOiBGaXJzdCBzZXQgdGhlIERTUy5EU0lfQ1RSTFswXSBJRl9FTiBiaXQgdG8gMSwgbmV4dAorCSAgIHJlc2V0IHRoZSBEU1MuRFNJX0NUUkxbMF0gSUZfRU4gdG8gMCwgdGhlbiBzZXQgRFNTLkRTSV9DTEtfQ1RSTFsyMF0KKwkgICBMUF9DTEtfRU5BQkxFIHRvIDEsIGFuZCBmaW5hbGx5LCBzZXQgYWdhaW4gdGhlIERTUy5EU0lfQ1RSTFswXSBJRl9FTgorCSAgIGJpdCB0byAxLiBJZiB0aGUgc2VxdWVuY2UgaXMgbm90IGZvbGxvd2VkLCB0aGUgRFNpIGNvbXBsZXggSS9PCisJICAgY29uZmlndXJhdGlvbiBpcyB1bmRldGVybWluZWQuCisJICAgKi8KKwlkc2lfaWZfZW5hYmxlKDEpOworCWRzaV9pZl9lbmFibGUoMCk7CisJUkVHX0ZMRF9NT0QoRFNJX0NMS19DVFJMLCAxLCAyMCwgMjApOyAvKiBMUF9DTEtfRU5BQkxFICovCisJZHNpX2lmX2VuYWJsZSgxKTsKKwlkc2lfaWZfZW5hYmxlKDApOworCisJRFNTREJHKCJDSU8gaW5pdCBkb25lXG4iKTsKK2VycjoKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgZHNpX2NvbXBsZXhpb191bmluaXQodm9pZCkKK3sKKwlkc2lfY29tcGxleGlvX3Bvd2VyKERTSV9DT01QTEVYSU9fUE9XRVJfT0ZGKTsKK30KKworc3RhdGljIGludCBfZHNpX3dhaXRfcmVzZXQodm9pZCkKK3sKKwlpbnQgaSA9IDA7CisKKwl3aGlsZSAoUkVHX0dFVChEU0lfU1lTU1RBVFVTLCAwLCAwKSA9PSAwKSB7CisJCWlmIChpKysgPiA1KSB7CisJCQlEU1NFUlIoInNvZnQgcmVzZXQgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCXVkZWxheSgxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfZHNpX3Jlc2V0KHZvaWQpCit7CisJLyogU29mdCByZXNldCAqLworCVJFR19GTERfTU9EKERTSV9TWVNDT05GSUcsIDEsIDEsIDEpOworCXJldHVybiBfZHNpX3dhaXRfcmVzZXQoKTsKK30KKworc3RhdGljIHZvaWQgZHNpX3Jlc2V0X3R4X2ZpZm8oaW50IGNoYW5uZWwpCit7CisJdTMyIG1hc2s7CisJdTMyIGw7CisKKwkvKiBzZXQgZmlmb3NpemUgb2YgdGhlIGNoYW5uZWwgdG8gMCwgdGhlbiByZXR1cm4gdGhlIG9sZCBzaXplICovCisJbCA9IGRzaV9yZWFkX3JlZyhEU0lfVFhfRklGT19WQ19TSVpFKTsKKworCW1hc2sgPSBGTERfTUFTSygoOCAqIGNoYW5uZWwpICsgNywgKDggKiBjaGFubmVsKSArIDQpOworCWRzaV93cml0ZV9yZWcoRFNJX1RYX0ZJRk9fVkNfU0laRSwgbCAmIH5tYXNrKTsKKworCWRzaV93cml0ZV9yZWcoRFNJX1RYX0ZJRk9fVkNfU0laRSwgbCk7Cit9CisKK3N0YXRpYyB2b2lkIGRzaV9jb25maWdfdHhfZmlmbyhlbnVtIGZpZm9fc2l6ZSBzaXplMSwgZW51bSBmaWZvX3NpemUgc2l6ZTIsCisJCWVudW0gZmlmb19zaXplIHNpemUzLCBlbnVtIGZpZm9fc2l6ZSBzaXplNCkKK3sKKwl1MzIgciA9IDA7CisJaW50IGFkZCA9IDA7CisJaW50IGk7CisKKwlkc2kudmNbMF0uZmlmb19zaXplID0gc2l6ZTE7CisJZHNpLnZjWzFdLmZpZm9fc2l6ZSA9IHNpemUyOworCWRzaS52Y1syXS5maWZvX3NpemUgPSBzaXplMzsKKwlkc2kudmNbM10uZmlmb19zaXplID0gc2l6ZTQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXU4IHY7CisJCWludCBzaXplID0gZHNpLnZjW2ldLmZpZm9fc2l6ZTsKKworCQlpZiAoYWRkICsgc2l6ZSA+IDQpIHsKKwkJCURTU0VSUigiSWxsZWdhbCBGSUZPIGNvbmZpZ3VyYXRpb25cbiIpOworCQkJQlVHKCk7CisJCX0KKworCQl2ID0gRkxEX1ZBTChhZGQsIDIsIDApIHwgRkxEX1ZBTChzaXplLCA3LCA0KTsKKwkJciB8PSB2IDw8ICg4ICogaSk7CisJCS8qRFNTREJHKCJUWCBGSUZPIHZjICVkOiBzaXplICVkLCBhZGQgJWRcbiIsIGksIHNpemUsIGFkZCk7ICovCisJCWFkZCArPSBzaXplOworCX0KKworCWRzaV93cml0ZV9yZWcoRFNJX1RYX0ZJRk9fVkNfU0laRSwgcik7Cit9CisKK3N0YXRpYyB2b2lkIGRzaV9jb25maWdfcnhfZmlmbyhlbnVtIGZpZm9fc2l6ZSBzaXplMSwgZW51bSBmaWZvX3NpemUgc2l6ZTIsCisJCWVudW0gZmlmb19zaXplIHNpemUzLCBlbnVtIGZpZm9fc2l6ZSBzaXplNCkKK3sKKwl1MzIgciA9IDA7CisJaW50IGFkZCA9IDA7CisJaW50IGk7CisKKwlkc2kudmNbMF0uZmlmb19zaXplID0gc2l6ZTE7CisJZHNpLnZjWzFdLmZpZm9fc2l6ZSA9IHNpemUyOworCWRzaS52Y1syXS5maWZvX3NpemUgPSBzaXplMzsKKwlkc2kudmNbM10uZmlmb19zaXplID0gc2l6ZTQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXU4IHY7CisJCWludCBzaXplID0gZHNpLnZjW2ldLmZpZm9fc2l6ZTsKKworCQlpZiAoYWRkICsgc2l6ZSA+IDQpIHsKKwkJCURTU0VSUigiSWxsZWdhbCBGSUZPIGNvbmZpZ3VyYXRpb25cbiIpOworCQkJQlVHKCk7CisJCX0KKworCQl2ID0gRkxEX1ZBTChhZGQsIDIsIDApIHwgRkxEX1ZBTChzaXplLCA3LCA0KTsKKwkJciB8PSB2IDw8ICg4ICogaSk7CisJCS8qRFNTREJHKCJSWCBGSUZPIHZjICVkOiBzaXplICVkLCBhZGQgJWRcbiIsIGksIHNpemUsIGFkZCk7ICovCisJCWFkZCArPSBzaXplOworCX0KKworCWRzaV93cml0ZV9yZWcoRFNJX1JYX0ZJRk9fVkNfU0laRSwgcik7Cit9CisKK3N0YXRpYyBpbnQgZHNpX2ZvcmNlX3R4X3N0b3BfbW9kZV9pbyh2b2lkKQoreworCXUzMiByOworCisJciA9IGRzaV9yZWFkX3JlZyhEU0lfVElNSU5HMSk7CisJciA9IEZMRF9NT0QociwgMSwgMTUsIDE1KTsJLyogRk9SQ0VfVFhfU1RPUF9NT0RFX0lPICovCisJZHNpX3dyaXRlX3JlZyhEU0lfVElNSU5HMSwgcik7CisKKwlpZiAod2FpdF9mb3JfYml0X2NoYW5nZShEU0lfVElNSU5HMSwgMTUsIDApICE9IDApIHsKKwkJRFNTRVJSKCJUWF9TVE9QIGJpdCBub3QgZ29pbmcgZG93blxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkc2lfdmNfcHJpbnRfc3RhdHVzKGludCBjaGFubmVsKQoreworCXUzMiByOworCisJciA9IGRzaV9yZWFkX3JlZyhEU0lfVkNfQ1RSTChjaGFubmVsKSk7CisJRFNTREJHKCJ2YyAlZDogVFhfRklGT19OT1RfRU1QVFkgJWQsIEJUQV9FTiAlZCwgVkNfQlVTWSAlZCwgIgorCQkJIlRYX0ZJRk9fRlVMTCAlZCwgUlhfRklGT19OT1RfRU1QVFkgJWQsICIsCisJCQljaGFubmVsLAorCQkJRkxEX0dFVChyLCA1LCA1KSwKKwkJCUZMRF9HRVQociwgNiwgNiksCisJCQlGTERfR0VUKHIsIDE1LCAxNSksCisJCQlGTERfR0VUKHIsIDE2LCAxNiksCisJCQlGTERfR0VUKHIsIDIwLCAyMCkpOworCisJciA9IGRzaV9yZWFkX3JlZyhEU0lfVFhfRklGT19WQ19FTVBUSU5FU1MpOworCURTU0RCRygiRU1QVElORVNTICVkXG4iLCAociA+PiAoOCAqIGNoYW5uZWwpKSAmIDB4ZmYpOworfQorCitzdGF0aWMgaW50IGRzaV92Y19lbmFibGUoaW50IGNoYW5uZWwsIGJvb2wgZW5hYmxlKQoreworCWlmIChkc2kudXBkYXRlX21vZGUgIT0gT01BUF9EU1NfVVBEQVRFX0FVVE8pCisJCURTU0RCRygiZHNpX3ZjX2VuYWJsZSBjaGFubmVsICVkLCBlbmFibGUgJWRcbiIsCisJCQkJY2hhbm5lbCwgZW5hYmxlKTsKKworCWVuYWJsZSA9IGVuYWJsZSA/IDEgOiAwOworCisJUkVHX0ZMRF9NT0QoRFNJX1ZDX0NUUkwoY2hhbm5lbCksIGVuYWJsZSwgMCwgMCk7CisKKwlpZiAod2FpdF9mb3JfYml0X2NoYW5nZShEU0lfVkNfQ1RSTChjaGFubmVsKSwgMCwgZW5hYmxlKSAhPSBlbmFibGUpIHsKKwkJCURTU0VSUigiRmFpbGVkIHRvIHNldCBkc2lfdmNfZW5hYmxlIHRvICVkXG4iLCBlbmFibGUpOworCQkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRzaV92Y19pbml0aWFsX2NvbmZpZyhpbnQgY2hhbm5lbCkKK3sKKwl1MzIgcjsKKworCURTU0RCR0YoIiVkIiwgY2hhbm5lbCk7CisKKwlyID0gZHNpX3JlYWRfcmVnKERTSV9WQ19DVFJMKGNoYW5uZWwpKTsKKworCWlmIChGTERfR0VUKHIsIDE1LCAxNSkpIC8qIFZDX0JVU1kgKi8KKwkJRFNTRVJSKCJWQyglZCkgYnVzeSB3aGVuIHRyeWluZyB0byBjb25maWd1cmUgaXQhXG4iLAorCQkJCWNoYW5uZWwpOworCisJciA9IEZMRF9NT0QociwgMCwgMSwgMSk7IC8qIFNPVVJDRSwgMCA9IEw0ICovCisJciA9IEZMRF9NT0QociwgMCwgMiwgMik7IC8qIEJUQV9TSE9SVF9FTiAgKi8KKwlyID0gRkxEX01PRChyLCAwLCAzLCAzKTsgLyogQlRBX0xPTkdfRU4gKi8KKwlyID0gRkxEX01PRChyLCAwLCA0LCA0KTsgLyogTU9ERSwgMCA9IGNvbW1hbmQgKi8KKwlyID0gRkxEX01PRChyLCAxLCA3LCA3KTsgLyogQ1NfVFhfRU4gKi8KKwlyID0gRkxEX01PRChyLCAxLCA4LCA4KTsgLyogRUNDX1RYX0VOICovCisJciA9IEZMRF9NT0QociwgMCwgOSwgOSk7IC8qIE1PREVfU1BFRUQsIGhpZ2ggc3BlZWQgb24vb2ZmICovCisKKwlyID0gRkxEX01PRChyLCA0LCAyOSwgMjcpOyAvKiBETUFfUlhfUkVRX05CID0gbm8gZG1hICovCisJciA9IEZMRF9NT0QociwgNCwgMjMsIDIxKTsgLyogRE1BX1RYX1JFUV9OQiA9IG5vIGRtYSAqLworCisJZHNpX3dyaXRlX3JlZyhEU0lfVkNfQ1RSTChjaGFubmVsKSwgcik7CisKKwlkc2kudmNbY2hhbm5lbF0ubW9kZSA9IERTSV9WQ19NT0RFX0w0OworfQorCitzdGF0aWMgdm9pZCBkc2lfdmNfY29uZmlnX2w0KGludCBjaGFubmVsKQoreworCWlmIChkc2kudmNbY2hhbm5lbF0ubW9kZSA9PSBEU0lfVkNfTU9ERV9MNCkKKwkJcmV0dXJuOworCisJRFNTREJHRigiJWQiLCBjaGFubmVsKTsKKworCWRzaV92Y19lbmFibGUoY2hhbm5lbCwgMCk7CisKKwlpZiAoUkVHX0dFVChEU0lfVkNfQ1RSTChjaGFubmVsKSwgMTUsIDE1KSkgLyogVkNfQlVTWSAqLworCQlEU1NFUlIoInZjKCVkKSBidXN5IHdoZW4gdHJ5aW5nIHRvIGNvbmZpZyBmb3IgTDRcbiIsIGNoYW5uZWwpOworCisJUkVHX0ZMRF9NT0QoRFNJX1ZDX0NUUkwoY2hhbm5lbCksIDAsIDEsIDEpOyAvKiBTT1VSQ0UsIDAgPSBMNCAqLworCisJZHNpX3ZjX2VuYWJsZShjaGFubmVsLCAxKTsKKworCWRzaS52Y1tjaGFubmVsXS5tb2RlID0gRFNJX1ZDX01PREVfTDQ7Cit9CisKK3N0YXRpYyB2b2lkIGRzaV92Y19jb25maWdfdnAoaW50IGNoYW5uZWwpCit7CisJaWYgKGRzaS52Y1tjaGFubmVsXS5tb2RlID09IERTSV9WQ19NT0RFX1ZQKQorCQlyZXR1cm47CisKKwlEU1NEQkdGKCIlZCIsIGNoYW5uZWwpOworCisJZHNpX3ZjX2VuYWJsZShjaGFubmVsLCAwKTsKKworCWlmIChSRUdfR0VUKERTSV9WQ19DVFJMKGNoYW5uZWwpLCAxNSwgMTUpKSAvKiBWQ19CVVNZICovCisJCURTU0VSUigidmMoJWQpIGJ1c3kgd2hlbiB0cnlpbmcgdG8gY29uZmlnIGZvciBWUFxuIiwgY2hhbm5lbCk7CisKKwlSRUdfRkxEX01PRChEU0lfVkNfQ1RSTChjaGFubmVsKSwgMSwgMSwgMSk7IC8qIFNPVVJDRSwgMSA9IHZpZGVvIHBvcnQgKi8KKworCWRzaV92Y19lbmFibGUoY2hhbm5lbCwgMSk7CisKKwlkc2kudmNbY2hhbm5lbF0ubW9kZSA9IERTSV9WQ19NT0RFX1ZQOworfQorCisKK3N0YXRpYyB2b2lkIGRzaV92Y19lbmFibGVfaHMoaW50IGNoYW5uZWwsIGJvb2wgZW5hYmxlKQoreworCURTU0RCRygiZHNpX3ZjX2VuYWJsZV9ocyglZCwgJWQpXG4iLCBjaGFubmVsLCBlbmFibGUpOworCisJZHNpX3ZjX2VuYWJsZShjaGFubmVsLCAwKTsKKwlkc2lfaWZfZW5hYmxlKDApOworCisJUkVHX0ZMRF9NT0QoRFNJX1ZDX0NUUkwoY2hhbm5lbCksIGVuYWJsZSwgOSwgOSk7CisKKwlkc2lfdmNfZW5hYmxlKGNoYW5uZWwsIDEpOworCWRzaV9pZl9lbmFibGUoMSk7CisKKwlkc2lfZm9yY2VfdHhfc3RvcF9tb2RlX2lvKCk7Cit9CisKK3N0YXRpYyB2b2lkIGRzaV92Y19mbHVzaF9sb25nX2RhdGEoaW50IGNoYW5uZWwpCit7CisJd2hpbGUgKFJFR19HRVQoRFNJX1ZDX0NUUkwoY2hhbm5lbCksIDIwLCAyMCkpIHsKKwkJdTMyIHZhbDsKKwkJdmFsID0gZHNpX3JlYWRfcmVnKERTSV9WQ19TSE9SVF9QQUNLRVRfSEVBREVSKGNoYW5uZWwpKTsKKwkJRFNTREJHKCJcdFx0YjEgJSMwMnggYjIgJSMwMnggYjMgJSMwMnggYjQgJSMwMnhcbiIsCisJCQkJKHZhbCA+PiAwKSAmIDB4ZmYsCisJCQkJKHZhbCA+PiA4KSAmIDB4ZmYsCisJCQkJKHZhbCA+PiAxNikgJiAweGZmLAorCQkJCSh2YWwgPj4gMjQpICYgMHhmZik7CisJfQorfQorCitzdGF0aWMgdm9pZCBkc2lfc2hvd19yeF9hY2tfd2l0aF9lcnIodTE2IGVycikKK3sKKwlEU1NFUlIoIlx0QUNLIHdpdGggRVJST1IgKCUjeCk6XG4iLCBlcnIpOworCWlmIChlcnIgJiAoMSA8PCAwKSkKKwkJRFNTRVJSKCJcdFx0U29UIEVycm9yXG4iKTsKKwlpZiAoZXJyICYgKDEgPDwgMSkpCisJCURTU0VSUigiXHRcdFNvVCBTeW5jIEVycm9yXG4iKTsKKwlpZiAoZXJyICYgKDEgPDwgMikpCisJCURTU0VSUigiXHRcdEVvVCBTeW5jIEVycm9yXG4iKTsKKwlpZiAoZXJyICYgKDEgPDwgMykpCisJCURTU0VSUigiXHRcdEVzY2FwZSBNb2RlIEVudHJ5IENvbW1hbmQgRXJyb3JcbiIpOworCWlmIChlcnIgJiAoMSA8PCA0KSkKKwkJRFNTRVJSKCJcdFx0TFAgVHJhbnNtaXQgU3luYyBFcnJvclxuIik7CisJaWYgKGVyciAmICgxIDw8IDUpKQorCQlEU1NFUlIoIlx0XHRIUyBSZWNlaXZlIFRpbWVvdXQgRXJyb3JcbiIpOworCWlmIChlcnIgJiAoMSA8PCA2KSkKKwkJRFNTRVJSKCJcdFx0RmFsc2UgQ29udHJvbCBFcnJvclxuIik7CisJaWYgKGVyciAmICgxIDw8IDcpKQorCQlEU1NFUlIoIlx0XHQocmVzZXJ2ZWQ3KVxuIik7CisJaWYgKGVyciAmICgxIDw8IDgpKQorCQlEU1NFUlIoIlx0XHRFQ0MgRXJyb3IsIHNpbmdsZS1iaXQgKGNvcnJlY3RlZClcbiIpOworCWlmIChlcnIgJiAoMSA8PCA5KSkKKwkJRFNTRVJSKCJcdFx0RUNDIEVycm9yLCBtdWx0aS1iaXQgKG5vdCBjb3JyZWN0ZWQpXG4iKTsKKwlpZiAoZXJyICYgKDEgPDwgMTApKQorCQlEU1NFUlIoIlx0XHRDaGVja3N1bSBFcnJvclxuIik7CisJaWYgKGVyciAmICgxIDw8IDExKSkKKwkJRFNTRVJSKCJcdFx0RGF0YSB0eXBlIG5vdCByZWNvZ25pemVkXG4iKTsKKwlpZiAoZXJyICYgKDEgPDwgMTIpKQorCQlEU1NFUlIoIlx0XHRJbnZhbGlkIFZDIElEXG4iKTsKKwlpZiAoZXJyICYgKDEgPDwgMTMpKQorCQlEU1NFUlIoIlx0XHRJbnZhbGlkIFRyYW5zbWlzc2lvbiBMZW5ndGhcbiIpOworCWlmIChlcnIgJiAoMSA8PCAxNCkpCisJCURTU0VSUigiXHRcdChyZXNlcnZlZDE0KVxuIik7CisJaWYgKGVyciAmICgxIDw8IDE1KSkKKwkJRFNTRVJSKCJcdFx0RFNJIFByb3RvY29sIFZpb2xhdGlvblxuIik7Cit9CisKK3N0YXRpYyB1MTYgZHNpX3ZjX2ZsdXNoX3JlY2VpdmVfZGF0YShpbnQgY2hhbm5lbCkKK3sKKwkvKiBSWF9GSUZPX05PVF9FTVBUWSAqLworCXdoaWxlIChSRUdfR0VUKERTSV9WQ19DVFJMKGNoYW5uZWwpLCAyMCwgMjApKSB7CisJCXUzMiB2YWw7CisJCXU4IGR0OworCQl2YWwgPSBkc2lfcmVhZF9yZWcoRFNJX1ZDX1NIT1JUX1BBQ0tFVF9IRUFERVIoY2hhbm5lbCkpOworCQlEU1NEQkcoIlx0cmF3dmFsICUjMDh4XG4iLCB2YWwpOworCQlkdCA9IEZMRF9HRVQodmFsLCA1LCAwKTsKKwkJaWYgKGR0ID09IERTSV9EVF9SWF9BQ0tfV0lUSF9FUlIpIHsKKwkJCXUxNiBlcnIgPSBGTERfR0VUKHZhbCwgMjMsIDgpOworCQkJZHNpX3Nob3dfcnhfYWNrX3dpdGhfZXJyKGVycik7CisJCX0gZWxzZSBpZiAoZHQgPT0gRFNJX0RUX1JYX1NIT1JUX1JFQURfMSkgeworCQkJRFNTREJHKCJcdERDUyBzaG9ydCByZXNwb25zZSwgMSBieXRlOiAlI3hcbiIsCisJCQkJCUZMRF9HRVQodmFsLCAyMywgOCkpOworCQl9IGVsc2UgaWYgKGR0ID09IERTSV9EVF9SWF9TSE9SVF9SRUFEXzIpIHsKKwkJCURTU0RCRygiXHREQ1Mgc2hvcnQgcmVzcG9uc2UsIDIgYnl0ZTogJSN4XG4iLAorCQkJCQlGTERfR0VUKHZhbCwgMjMsIDgpKTsKKwkJfSBlbHNlIGlmIChkdCA9PSBEU0lfRFRfUlhfRENTX0xPTkdfUkVBRCkgeworCQkJRFNTREJHKCJcdERDUyBsb25nIHJlc3BvbnNlLCBsZW4gJWRcbiIsCisJCQkJCUZMRF9HRVQodmFsLCAyMywgOCkpOworCQkJZHNpX3ZjX2ZsdXNoX2xvbmdfZGF0YShjaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCURTU0VSUigiXHR1bmtub3duIGRhdGF0eXBlIDB4JTAyeFxuIiwgZHQpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzaV92Y19zZW5kX2J0YShpbnQgY2hhbm5lbCkKK3sKKwlpZiAoZHNpLnVwZGF0ZV9tb2RlICE9IE9NQVBfRFNTX1VQREFURV9BVVRPICYmCisJCQkoZHNpLmRlYnVnX3dyaXRlIHx8IGRzaS5kZWJ1Z19yZWFkKSkKKwkJRFNTREJHKCJkc2lfdmNfc2VuZF9idGEgJWRcbiIsIGNoYW5uZWwpOworCisJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZkc2kuYnVzX2xvY2spKTsKKworCWlmIChSRUdfR0VUKERTSV9WQ19DVFJMKGNoYW5uZWwpLCAyMCwgMjApKSB7CS8qIFJYX0ZJRk9fTk9UX0VNUFRZICovCisJCURTU0VSUigicnggZmlmbyBub3QgZW1wdHkgd2hlbiBzZW5kaW5nIEJUQSwgZHVtcGluZyBkYXRhOlxuIik7CisJCWRzaV92Y19mbHVzaF9yZWNlaXZlX2RhdGEoY2hhbm5lbCk7CisJfQorCisJUkVHX0ZMRF9NT0QoRFNJX1ZDX0NUUkwoY2hhbm5lbCksIDEsIDYsIDYpOyAvKiBCVEFfRU4gKi8KKworCXJldHVybiAwOworfQorCitpbnQgZHNpX3ZjX3NlbmRfYnRhX3N5bmMoaW50IGNoYW5uZWwpCit7CisJaW50IHIgPSAwOworCXUzMiBlcnI7CisKKwlJTklUX0NPTVBMRVRJT04oZHNpLmJ0YV9jb21wbGV0aW9uKTsKKworCWRzaV92Y19lbmFibGVfYnRhX2lycShjaGFubmVsKTsKKworCXIgPSBkc2lfdmNfc2VuZF9idGEoY2hhbm5lbCk7CisJaWYgKHIpCisJCWdvdG8gZXJyOworCisJaWYgKHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZHNpLmJ0YV9jb21wbGV0aW9uLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoNTAwKSkgPT0gMCkgeworCQlEU1NFUlIoIkZhaWxlZCB0byByZWNlaXZlIEJUQVxuIik7CisJCXIgPSAtRUlPOworCQlnb3RvIGVycjsKKwl9CisKKwllcnIgPSBkc2lfZ2V0X2Vycm9ycygpOworCWlmIChlcnIpIHsKKwkJRFNTRVJSKCJFcnJvciB3aGlsZSBzZW5kaW5nIEJUQTogJXhcbiIsIGVycik7CisJCXIgPSAtRUlPOworCQlnb3RvIGVycjsKKwl9CitlcnI6CisJZHNpX3ZjX2Rpc2FibGVfYnRhX2lycShjaGFubmVsKTsKKworCXJldHVybiByOworfQorRVhQT1JUX1NZTUJPTChkc2lfdmNfc2VuZF9idGFfc3luYyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkc2lfdmNfd3JpdGVfbG9uZ19oZWFkZXIoaW50IGNoYW5uZWwsIHU4IGRhdGFfdHlwZSwKKwkJdTE2IGxlbiwgdTggZWNjKQoreworCXUzMiB2YWw7CisJdTggZGF0YV9pZDsKKworCVdBUk5fT04oIW11dGV4X2lzX2xvY2tlZCgmZHNpLmJ1c19sb2NrKSk7CisKKwkvKmRhdGFfaWQgPSBkYXRhX3R5cGUgfCBjaGFubmVsIDw8IDY7ICovCisJZGF0YV9pZCA9IGRhdGFfdHlwZSB8IGRzaS52Y1tjaGFubmVsXS5kZXN0X3BlciA8PCA2OworCisJdmFsID0gRkxEX1ZBTChkYXRhX2lkLCA3LCAwKSB8IEZMRF9WQUwobGVuLCAyMywgOCkgfAorCQlGTERfVkFMKGVjYywgMzEsIDI0KTsKKworCWRzaV93cml0ZV9yZWcoRFNJX1ZDX0xPTkdfUEFDS0VUX0hFQURFUihjaGFubmVsKSwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRzaV92Y193cml0ZV9sb25nX3BheWxvYWQoaW50IGNoYW5uZWwsCisJCXU4IGIxLCB1OCBiMiwgdTggYjMsIHU4IGI0KQoreworCXUzMiB2YWw7CisKKwl2YWwgPSBiNCA8PCAyNCB8IGIzIDw8IDE2IHwgYjIgPDwgOCAgfCBiMSA8PCAwOworCisvKglEU1NEQkcoIlx0d3JpdGluZyAlMDJ4LCAlMDJ4LCAlMDJ4LCAlMDJ4ICglIzAxMHgpXG4iLAorCQkJYjEsIGIyLCBiMywgYjQsIHZhbCk7ICovCisKKwlkc2lfd3JpdGVfcmVnKERTSV9WQ19MT05HX1BBQ0tFVF9QQVlMT0FEKGNoYW5uZWwpLCB2YWwpOworfQorCitzdGF0aWMgaW50IGRzaV92Y19zZW5kX2xvbmcoaW50IGNoYW5uZWwsIHU4IGRhdGFfdHlwZSwgdTggKmRhdGEsIHUxNiBsZW4sCisJCXU4IGVjYykKK3sKKwkvKnUzMiB2YWw7ICovCisJaW50IGk7CisJdTggKnA7CisJaW50IHIgPSAwOworCXU4IGIxLCBiMiwgYjMsIGI0OworCisJaWYgKGRzaS5kZWJ1Z193cml0ZSkKKwkJRFNTREJHKCJkc2lfdmNfc2VuZF9sb25nLCAlZCBieXRlc1xuIiwgbGVuKTsKKworCS8qIGxlbiArIGhlYWRlciAqLworCWlmIChkc2kudmNbY2hhbm5lbF0uZmlmb19zaXplICogMzIgKiA0IDwgbGVuICsgNCkgeworCQlEU1NFUlIoInVuYWJsZSB0byBzZW5kIGxvbmcgcGFja2V0OiBwYWNrZXQgdG9vIGxvbmcuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZHNpX3ZjX2NvbmZpZ19sNChjaGFubmVsKTsKKworCWRzaV92Y193cml0ZV9sb25nX2hlYWRlcihjaGFubmVsLCBkYXRhX3R5cGUsIGxlbiwgZWNjKTsKKworCS8qZHNpX3ZjX3ByaW50X3N0YXR1cygwKTsgKi8KKworCXAgPSBkYXRhOworCWZvciAoaSA9IDA7IGkgPCBsZW4gPj4gMjsgaSsrKSB7CisJCWlmIChkc2kuZGVidWdfd3JpdGUpCisJCQlEU1NEQkcoIlx0c2VuZGluZyBmdWxsIHBhY2tldCAlZFxuIiwgaSk7CisJCS8qZHNpX3ZjX3ByaW50X3N0YXR1cygwKTsgKi8KKworCQliMSA9ICpwKys7CisJCWIyID0gKnArKzsKKwkJYjMgPSAqcCsrOworCQliNCA9ICpwKys7CisKKwkJZHNpX3ZjX3dyaXRlX2xvbmdfcGF5bG9hZChjaGFubmVsLCBiMSwgYjIsIGIzLCBiNCk7CisJfQorCisJaSA9IGxlbiAlIDQ7CisJaWYgKGkpIHsKKwkJYjEgPSAwOyBiMiA9IDA7IGIzID0gMDsKKworCQlpZiAoZHNpLmRlYnVnX3dyaXRlKQorCQkJRFNTREJHKCJcdHNlbmRpbmcgcmVtYWluZGVyIGJ5dGVzICVkXG4iLCBpKTsKKworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSAzOgorCQkJYjEgPSAqcCsrOworCQkJYjIgPSAqcCsrOworCQkJYjMgPSAqcCsrOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWIxID0gKnArKzsKKwkJCWIyID0gKnArKzsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQliMSA9ICpwKys7CisJCQlicmVhazsKKwkJfQorCisJCWRzaV92Y193cml0ZV9sb25nX3BheWxvYWQoY2hhbm5lbCwgYjEsIGIyLCBiMywgMCk7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgZHNpX3ZjX3NlbmRfc2hvcnQoaW50IGNoYW5uZWwsIHU4IGRhdGFfdHlwZSwgdTE2IGRhdGEsIHU4IGVjYykKK3sKKwl1MzIgcjsKKwl1OCBkYXRhX2lkOworCisJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZkc2kuYnVzX2xvY2spKTsKKworCWlmIChkc2kuZGVidWdfd3JpdGUpCisJCURTU0RCRygiZHNpX3ZjX3NlbmRfc2hvcnQoY2glZCwgZHQgJSN4LCBiMSAlI3gsIGIyICUjeClcbiIsCisJCQkJY2hhbm5lbCwKKwkJCQlkYXRhX3R5cGUsIGRhdGEgJiAweGZmLCAoZGF0YSA+PiA4KSAmIDB4ZmYpOworCisJZHNpX3ZjX2NvbmZpZ19sNChjaGFubmVsKTsKKworCWlmIChGTERfR0VUKGRzaV9yZWFkX3JlZyhEU0lfVkNfQ1RSTChjaGFubmVsKSksIDE2LCAxNikpIHsKKwkJRFNTRVJSKCJFUlJPUiBGSUZPIEZVTEwsIGFib3J0aW5nIHRyYW5zZmVyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0YV9pZCA9IGRhdGFfdHlwZSB8IGNoYW5uZWwgPDwgNjsKKworCXIgPSAoZGF0YV9pZCA8PCAwKSB8IChkYXRhIDw8IDgpIHwgKGVjYyA8PCAyNCk7CisKKwlkc2lfd3JpdGVfcmVnKERTSV9WQ19TSE9SVF9QQUNLRVRfSEVBREVSKGNoYW5uZWwpLCByKTsKKworCXJldHVybiAwOworfQorCitpbnQgZHNpX3ZjX3NlbmRfbnVsbChpbnQgY2hhbm5lbCkKK3sKKwl1OCBudWxscGtnW10gPSB7MCwgMCwgMCwgMH07CisJcmV0dXJuIGRzaV92Y19zZW5kX2xvbmcoMCwgRFNJX0RUX05VTExfUEFDS0VULCBudWxscGtnLCA0LCAwKTsKK30KK0VYUE9SVF9TWU1CT0woZHNpX3ZjX3NlbmRfbnVsbCk7CisKK2ludCBkc2lfdmNfZGNzX3dyaXRlX25vc3luYyhpbnQgY2hhbm5lbCwgdTggKmRhdGEsIGludCBsZW4pCit7CisJaW50IHI7CisKKwlCVUdfT04obGVuID09IDApOworCisJaWYgKGxlbiA9PSAxKSB7CisJCXIgPSBkc2lfdmNfc2VuZF9zaG9ydChjaGFubmVsLCBEU0lfRFRfRENTX1NIT1JUX1dSSVRFXzAsCisJCQkJZGF0YVswXSwgMCk7CisJfSBlbHNlIGlmIChsZW4gPT0gMikgeworCQlyID0gZHNpX3ZjX3NlbmRfc2hvcnQoY2hhbm5lbCwgRFNJX0RUX0RDU19TSE9SVF9XUklURV8xLAorCQkJCWRhdGFbMF0gfCAoZGF0YVsxXSA8PCA4KSwgMCk7CisJfSBlbHNlIHsKKwkJLyogMHgzOSA9IERDUyBMb25nIFdyaXRlICovCisJCXIgPSBkc2lfdmNfc2VuZF9sb25nKGNoYW5uZWwsIERTSV9EVF9EQ1NfTE9OR19XUklURSwKKwkJCQlkYXRhLCBsZW4sIDApOworCX0KKworCXJldHVybiByOworfQorRVhQT1JUX1NZTUJPTChkc2lfdmNfZGNzX3dyaXRlX25vc3luYyk7CisKK2ludCBkc2lfdmNfZGNzX3dyaXRlKGludCBjaGFubmVsLCB1OCAqZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgcjsKKworCXIgPSBkc2lfdmNfZGNzX3dyaXRlX25vc3luYyhjaGFubmVsLCBkYXRhLCBsZW4pOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBkc2lfdmNfc2VuZF9idGFfc3luYyhjaGFubmVsKTsKKworCXJldHVybiByOworfQorRVhQT1JUX1NZTUJPTChkc2lfdmNfZGNzX3dyaXRlKTsKKworaW50IGRzaV92Y19kY3NfcmVhZChpbnQgY2hhbm5lbCwgdTggZGNzX2NtZCwgdTggKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwl1MzIgdmFsOworCXU4IGR0OworCWludCByOworCisJaWYgKGRzaS5kZWJ1Z19yZWFkKQorCQlEU1NEQkcoImRzaV92Y19kY3NfcmVhZChjaCVkLCBkY3NfY21kICV1KVxuIiwgY2hhbm5lbCwgZGNzX2NtZCk7CisKKwlyID0gZHNpX3ZjX3NlbmRfc2hvcnQoY2hhbm5lbCwgRFNJX0RUX0RDU19SRUFELCBkY3NfY21kLCAwKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gZHNpX3ZjX3NlbmRfYnRhX3N5bmMoY2hhbm5lbCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJLyogUlhfRklGT19OT1RfRU1QVFkgKi8KKwlpZiAoUkVHX0dFVChEU0lfVkNfQ1RSTChjaGFubmVsKSwgMjAsIDIwKSA9PSAwKSB7CisJCURTU0VSUigiUlggZmlmbyBlbXB0eSB3aGVuIHRyeWluZyB0byByZWFkLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXZhbCA9IGRzaV9yZWFkX3JlZyhEU0lfVkNfU0hPUlRfUEFDS0VUX0hFQURFUihjaGFubmVsKSk7CisJaWYgKGRzaS5kZWJ1Z19yZWFkKQorCQlEU1NEQkcoIlx0aGVhZGVyOiAlMDh4XG4iLCB2YWwpOworCWR0ID0gRkxEX0dFVCh2YWwsIDUsIDApOworCWlmIChkdCA9PSBEU0lfRFRfUlhfQUNLX1dJVEhfRVJSKSB7CisJCXUxNiBlcnIgPSBGTERfR0VUKHZhbCwgMjMsIDgpOworCQlkc2lfc2hvd19yeF9hY2tfd2l0aF9lcnIoZXJyKTsKKwkJcmV0dXJuIC1FSU87CisKKwl9IGVsc2UgaWYgKGR0ID09IERTSV9EVF9SWF9TSE9SVF9SRUFEXzEpIHsKKwkJdTggZGF0YSA9IEZMRF9HRVQodmFsLCAxNSwgOCk7CisJCWlmIChkc2kuZGVidWdfcmVhZCkKKwkJCURTU0RCRygiXHREQ1Mgc2hvcnQgcmVzcG9uc2UsIDEgYnl0ZTogJTAyeFxuIiwgZGF0YSk7CisKKwkJaWYgKGJ1ZmxlbiA8IDEpCisJCQlyZXR1cm4gLUVJTzsKKworCQlidWZbMF0gPSBkYXRhOworCisJCXJldHVybiAxOworCX0gZWxzZSBpZiAoZHQgPT0gRFNJX0RUX1JYX1NIT1JUX1JFQURfMikgeworCQl1MTYgZGF0YSA9IEZMRF9HRVQodmFsLCAyMywgOCk7CisJCWlmIChkc2kuZGVidWdfcmVhZCkKKwkJCURTU0RCRygiXHREQ1Mgc2hvcnQgcmVzcG9uc2UsIDIgYnl0ZTogJTA0eFxuIiwgZGF0YSk7CisKKwkJaWYgKGJ1ZmxlbiA8IDIpCisJCQlyZXR1cm4gLUVJTzsKKworCQlidWZbMF0gPSBkYXRhICYgMHhmZjsKKwkJYnVmWzFdID0gKGRhdGEgPj4gOCkgJiAweGZmOworCisJCXJldHVybiAyOworCX0gZWxzZSBpZiAoZHQgPT0gRFNJX0RUX1JYX0RDU19MT05HX1JFQUQpIHsKKwkJaW50IHc7CisJCWludCBsZW4gPSBGTERfR0VUKHZhbCwgMjMsIDgpOworCQlpZiAoZHNpLmRlYnVnX3JlYWQpCisJCQlEU1NEQkcoIlx0RENTIGxvbmcgcmVzcG9uc2UsIGxlbiAlZFxuIiwgbGVuKTsKKworCQlpZiAobGVuID4gYnVmbGVuKQorCQkJcmV0dXJuIC1FSU87CisKKwkJLyogdHdvIGJ5dGUgY2hlY2tzdW0gZW5kcyB0aGUgcGFja2V0LCBub3QgaW5jbHVkZWQgaW4gbGVuICovCisJCWZvciAodyA9IDA7IHcgPCBsZW4gKyAyOykgeworCQkJaW50IGI7CisJCQl2YWwgPSBkc2lfcmVhZF9yZWcoRFNJX1ZDX1NIT1JUX1BBQ0tFVF9IRUFERVIoY2hhbm5lbCkpOworCQkJaWYgKGRzaS5kZWJ1Z19yZWFkKQorCQkJCURTU0RCRygiXHRcdCUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkJCQkodmFsID4+IDApICYgMHhmZiwKKwkJCQkJCSh2YWwgPj4gOCkgJiAweGZmLAorCQkJCQkJKHZhbCA+PiAxNikgJiAweGZmLAorCQkJCQkJKHZhbCA+PiAyNCkgJiAweGZmKTsKKworCQkJZm9yIChiID0gMDsgYiA8IDQ7ICsrYikgeworCQkJCWlmICh3IDwgbGVuKQorCQkJCQlidWZbd10gPSAodmFsID4+IChiICogOCkpICYgMHhmZjsKKwkJCQkvKiB3ZSBkaXNjYXJkIHRoZSAyIGJ5dGUgY2hlY2tzdW0gKi8KKwkJCQkrK3c7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbGVuOworCisJfSBlbHNlIHsKKwkJRFNTRVJSKCJcdHVua25vd24gZGF0YXR5cGUgMHglMDJ4XG4iLCBkdCk7CisJCXJldHVybiAtRUlPOworCX0KK30KK0VYUE9SVF9TWU1CT0woZHNpX3ZjX2Rjc19yZWFkKTsKKworCitpbnQgZHNpX3ZjX3NldF9tYXhfcnhfcGFja2V0X3NpemUoaW50IGNoYW5uZWwsIHUxNiBsZW4pCit7CisJaW50IHI7CisJciA9IGRzaV92Y19zZW5kX3Nob3J0KGNoYW5uZWwsIERTSV9EVF9TRVRfTUFYX1JFVF9QS0dfU0laRSwKKwkJCWxlbiwgMCk7CisKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gZHNpX3ZjX3NlbmRfYnRhX3N5bmMoY2hhbm5lbCk7CisKKwlyZXR1cm4gcjsKK30KK0VYUE9SVF9TWU1CT0woZHNpX3ZjX3NldF9tYXhfcnhfcGFja2V0X3NpemUpOworCitzdGF0aWMgdm9pZCBkc2lfc2V0X2xwX3J4X3RpbWVvdXQodW5zaWduZWQgbG9uZyBucykKK3sKKwl1MzIgcjsKKwl1bnNpZ25lZCB4NCwgeDE2OworCXVuc2lnbmVkIGxvbmcgZmNrOworCXVuc2lnbmVkIGxvbmcgdGlja3M7CisKKwkvKiB0aWNrcyBpbiBEU0lfRkNLICovCisKKwlmY2sgPSBkc2lfZmNsa19yYXRlKCk7CisJdGlja3MgPSAoZmNrIC8gMTAwMCAvIDEwMDApICogbnMgLyAxMDAwOworCXg0ID0gMDsKKwl4MTYgPSAwOworCisJaWYgKHRpY2tzID4gMHgxZmZmKSB7CisJCXRpY2tzID0gKGZjayAvIDEwMDAgLyAxMDAwKSAqIG5zIC8gMTAwMCAvIDQ7CisJCXg0ID0gMTsKKwkJeDE2ID0gMDsKKwl9CisKKwlpZiAodGlja3MgPiAweDFmZmYpIHsKKwkJdGlja3MgPSAoZmNrIC8gMTAwMCAvIDEwMDApICogbnMgLyAxMDAwIC8gMTY7CisJCXg0ID0gMDsKKwkJeDE2ID0gMTsKKwl9CisKKwlpZiAodGlja3MgPiAweDFmZmYpIHsKKwkJdGlja3MgPSAoZmNrIC8gMTAwMCAvIDEwMDApICogbnMgLyAxMDAwIC8gKDQgKiAxNik7CisJCXg0ID0gMTsKKwkJeDE2ID0gMTsKKwl9CisKKwlpZiAodGlja3MgPiAweDFmZmYpIHsKKwkJRFNTV0FSTigiTFBfVFhfVE8gb3ZlciBsaW1pdCwgc2V0dGluZyBpdCB0byBtYXhcbiIpOworCQl0aWNrcyA9IDB4MWZmZjsKKwkJeDQgPSAxOworCQl4MTYgPSAxOworCX0KKworCXIgPSBkc2lfcmVhZF9yZWcoRFNJX1RJTUlORzIpOworCXIgPSBGTERfTU9EKHIsIDEsIDE1LCAxNSk7CS8qIExQX1JYX1RPICovCisJciA9IEZMRF9NT0QociwgeDE2LCAxNCwgMTQpOwkvKiBMUF9SWF9UT19YMTYgKi8KKwlyID0gRkxEX01PRChyLCB4NCwgMTMsIDEzKTsJLyogTFBfUlhfVE9fWDQgKi8KKwlyID0gRkxEX01PRChyLCB0aWNrcywgMTIsIDApOwkvKiBMUF9SWF9DT1VOVEVSICovCisJZHNpX3dyaXRlX3JlZyhEU0lfVElNSU5HMiwgcik7CisKKwlEU1NEQkcoIkxQX1JYX1RPICVsdSBucyAoJSNseCB0aWNrcyVzJXMpXG4iLAorCQkJKHRpY2tzICogKHgxNiA/IDE2IDogMSkgKiAoeDQgPyA0IDogMSkgKiAxMDAwKSAvCisJCQkoZmNrIC8gMTAwMCAvIDEwMDApLAorCQkJdGlja3MsIHg0ID8gIiB4NCIgOiAiIiwgeDE2ID8gIiB4MTYiIDogIiIpOworfQorCitzdGF0aWMgdm9pZCBkc2lfc2V0X3RhX3RpbWVvdXQodW5zaWduZWQgbG9uZyBucykKK3sKKwl1MzIgcjsKKwl1bnNpZ25lZCB4OCwgeDE2OworCXVuc2lnbmVkIGxvbmcgZmNrOworCXVuc2lnbmVkIGxvbmcgdGlja3M7CisKKwkvKiB0aWNrcyBpbiBEU0lfRkNLICovCisJZmNrID0gZHNpX2ZjbGtfcmF0ZSgpOworCXRpY2tzID0gKGZjayAvIDEwMDAgLyAxMDAwKSAqIG5zIC8gMTAwMDsKKwl4OCA9IDA7CisJeDE2ID0gMDsKKworCWlmICh0aWNrcyA+IDB4MWZmZikgeworCQl0aWNrcyA9IChmY2sgLyAxMDAwIC8gMTAwMCkgKiBucyAvIDEwMDAgLyA4OworCQl4OCA9IDE7CisJCXgxNiA9IDA7CisJfQorCisJaWYgKHRpY2tzID4gMHgxZmZmKSB7CisJCXRpY2tzID0gKGZjayAvIDEwMDAgLyAxMDAwKSAqIG5zIC8gMTAwMCAvIDE2OworCQl4OCA9IDA7CisJCXgxNiA9IDE7CisJfQorCisJaWYgKHRpY2tzID4gMHgxZmZmKSB7CisJCXRpY2tzID0gKGZjayAvIDEwMDAgLyAxMDAwKSAqIG5zIC8gMTAwMCAvICg4ICogMTYpOworCQl4OCA9IDE7CisJCXgxNiA9IDE7CisJfQorCisJaWYgKHRpY2tzID4gMHgxZmZmKSB7CisJCURTU1dBUk4oIlRBX1RPIG92ZXIgbGltaXQsIHNldHRpbmcgaXQgdG8gbWF4XG4iKTsKKwkJdGlja3MgPSAweDFmZmY7CisJCXg4ID0gMTsKKwkJeDE2ID0gMTsKKwl9CisKKwlyID0gZHNpX3JlYWRfcmVnKERTSV9USU1JTkcxKTsKKwlyID0gRkxEX01PRChyLCAxLCAzMSwgMzEpOwkvKiBUQV9UTyAqLworCXIgPSBGTERfTU9EKHIsIHgxNiwgMzAsIDMwKTsJLyogVEFfVE9fWDE2ICovCisJciA9IEZMRF9NT0QociwgeDgsIDI5LCAyOSk7CS8qIFRBX1RPX1g4ICovCisJciA9IEZMRF9NT0QociwgdGlja3MsIDI4LCAxNik7CS8qIFRBX1RPX0NPVU5URVIgKi8KKwlkc2lfd3JpdGVfcmVnKERTSV9USU1JTkcxLCByKTsKKworCURTU0RCRygiVEFfVE8gJWx1IG5zICglI2x4IHRpY2tzJXMlcylcbiIsCisJCQkodGlja3MgKiAoeDE2ID8gMTYgOiAxKSAqICh4OCA/IDggOiAxKSAqIDEwMDApIC8KKwkJCShmY2sgLyAxMDAwIC8gMTAwMCksCisJCQl0aWNrcywgeDggPyAiIHg4IiA6ICIiLCB4MTYgPyAiIHgxNiIgOiAiIik7Cit9CisKK3N0YXRpYyB2b2lkIGRzaV9zZXRfc3RvcF9zdGF0ZV9jb3VudGVyKHVuc2lnbmVkIGxvbmcgbnMpCit7CisJdTMyIHI7CisJdW5zaWduZWQgeDQsIHgxNjsKKwl1bnNpZ25lZCBsb25nIGZjazsKKwl1bnNpZ25lZCBsb25nIHRpY2tzOworCisJLyogdGlja3MgaW4gRFNJX0ZDSyAqLworCisJZmNrID0gZHNpX2ZjbGtfcmF0ZSgpOworCXRpY2tzID0gKGZjayAvIDEwMDAgLyAxMDAwKSAqIG5zIC8gMTAwMDsKKwl4NCA9IDA7CisJeDE2ID0gMDsKKworCWlmICh0aWNrcyA+IDB4MWZmZikgeworCQl0aWNrcyA9IChmY2sgLyAxMDAwIC8gMTAwMCkgKiBucyAvIDEwMDAgLyA0OworCQl4NCA9IDE7CisJCXgxNiA9IDA7CisJfQorCisJaWYgKHRpY2tzID4gMHgxZmZmKSB7CisJCXRpY2tzID0gKGZjayAvIDEwMDAgLyAxMDAwKSAqIG5zIC8gMTAwMCAvIDE2OworCQl4NCA9IDA7CisJCXgxNiA9IDE7CisJfQorCisJaWYgKHRpY2tzID4gMHgxZmZmKSB7CisJCXRpY2tzID0gKGZjayAvIDEwMDAgLyAxMDAwKSAqIG5zIC8gMTAwMCAvICg0ICogMTYpOworCQl4NCA9IDE7CisJCXgxNiA9IDE7CisJfQorCisJaWYgKHRpY2tzID4gMHgxZmZmKSB7CisJCURTU1dBUk4oIlNUT1BfU1RBVEVfQ09VTlRFUl9JTyBvdmVyIGxpbWl0LCAiCisJCQkJInNldHRpbmcgaXQgdG8gbWF4XG4iKTsKKwkJdGlja3MgPSAweDFmZmY7CisJCXg0ID0gMTsKKwkJeDE2ID0gMTsKKwl9CisKKwlyID0gZHNpX3JlYWRfcmVnKERTSV9USU1JTkcxKTsKKwlyID0gRkxEX01PRChyLCAxLCAxNSwgMTUpOwkvKiBGT1JDRV9UWF9TVE9QX01PREVfSU8gKi8KKwlyID0gRkxEX01PRChyLCB4MTYsIDE0LCAxNCk7CS8qIFNUT1BfU1RBVEVfWDE2X0lPICovCisJciA9IEZMRF9NT0QociwgeDQsIDEzLCAxMyk7CS8qIFNUT1BfU1RBVEVfWDRfSU8gKi8KKwlyID0gRkxEX01PRChyLCB0aWNrcywgMTIsIDApOwkvKiBTVE9QX1NUQVRFX0NPVU5URVJfSU8gKi8KKwlkc2lfd3JpdGVfcmVnKERTSV9USU1JTkcxLCByKTsKKworCURTU0RCRygiU1RPUF9TVEFURV9DT1VOVEVSICVsdSBucyAoJSNseCB0aWNrcyVzJXMpXG4iLAorCQkJKHRpY2tzICogKHgxNiA/IDE2IDogMSkgKiAoeDQgPyA0IDogMSkgKiAxMDAwKSAvCisJCQkoZmNrIC8gMTAwMCAvIDEwMDApLAorCQkJdGlja3MsIHg0ID8gIiB4NCIgOiAiIiwgeDE2ID8gIiB4MTYiIDogIiIpOworfQorCitzdGF0aWMgdm9pZCBkc2lfc2V0X2hzX3R4X3RpbWVvdXQodW5zaWduZWQgbG9uZyBucykKK3sKKwl1MzIgcjsKKwl1bnNpZ25lZCB4NCwgeDE2OworCXVuc2lnbmVkIGxvbmcgZmNrOworCXVuc2lnbmVkIGxvbmcgdGlja3M7CisKKwkvKiB0aWNrcyBpbiBUeEJ5dGVDbGtIUyAqLworCisJZmNrID0gZHNpX2dldF90eGJ5dGVjbGtocygpOworCXRpY2tzID0gKGZjayAvIDEwMDAgLyAxMDAwKSAqIG5zIC8gMTAwMDsKKwl4NCA9IDA7CisJeDE2ID0gMDsKKworCWlmICh0aWNrcyA+IDB4MWZmZikgeworCQl0aWNrcyA9IChmY2sgLyAxMDAwIC8gMTAwMCkgKiBucyAvIDEwMDAgLyA0OworCQl4NCA9IDE7CisJCXgxNiA9IDA7CisJfQorCisJaWYgKHRpY2tzID4gMHgxZmZmKSB7CisJCXRpY2tzID0gKGZjayAvIDEwMDAgLyAxMDAwKSAqIG5zIC8gMTAwMCAvIDE2OworCQl4NCA9IDA7CisJCXgxNiA9IDE7CisJfQorCisJaWYgKHRpY2tzID4gMHgxZmZmKSB7CisJCXRpY2tzID0gKGZjayAvIDEwMDAgLyAxMDAwKSAqIG5zIC8gMTAwMCAvICg0ICogMTYpOworCQl4NCA9IDE7CisJCXgxNiA9IDE7CisJfQorCisJaWYgKHRpY2tzID4gMHgxZmZmKSB7CisJCURTU1dBUk4oIkhTX1RYX1RPIG92ZXIgbGltaXQsIHNldHRpbmcgaXQgdG8gbWF4XG4iKTsKKwkJdGlja3MgPSAweDFmZmY7CisJCXg0ID0gMTsKKwkJeDE2ID0gMTsKKwl9CisKKwlyID0gZHNpX3JlYWRfcmVnKERTSV9USU1JTkcyKTsKKwlyID0gRkxEX01PRChyLCAxLCAzMSwgMzEpOwkvKiBIU19UWF9UTyAqLworCXIgPSBGTERfTU9EKHIsIHgxNiwgMzAsIDMwKTsJLyogSFNfVFhfVE9fWDE2ICovCisJciA9IEZMRF9NT0QociwgeDQsIDI5LCAyOSk7CS8qIEhTX1RYX1RPX1g4ICg0IHJlYWxseSkgKi8KKwlyID0gRkxEX01PRChyLCB0aWNrcywgMjgsIDE2KTsJLyogSFNfVFhfVE9fQ09VTlRFUiAqLworCWRzaV93cml0ZV9yZWcoRFNJX1RJTUlORzIsIHIpOworCisJRFNTREJHKCJIU19UWF9UTyAlbHUgbnMgKCUjbHggdGlja3MlcyVzKVxuIiwKKwkJCSh0aWNrcyAqICh4MTYgPyAxNiA6IDEpICogKHg0ID8gNCA6IDEpICogMTAwMCkgLworCQkJKGZjayAvIDEwMDAgLyAxMDAwKSwKKwkJCXRpY2tzLCB4NCA/ICIgeDQiIDogIiIsIHgxNiA/ICIgeDE2IiA6ICIiKTsKK30KK3N0YXRpYyBpbnQgZHNpX3Byb3RvX2NvbmZpZyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJdTMyIHI7CisJaW50IGJ1c3dpZHRoID0gMDsKKworCWRzaV9jb25maWdfdHhfZmlmbyhEU0lfRklGT19TSVpFXzEyOCwKKwkJCURTSV9GSUZPX1NJWkVfMCwKKwkJCURTSV9GSUZPX1NJWkVfMCwKKwkJCURTSV9GSUZPX1NJWkVfMCk7CisKKwlkc2lfY29uZmlnX3J4X2ZpZm8oRFNJX0ZJRk9fU0laRV8xMjgsCisJCQlEU0lfRklGT19TSVpFXzAsCisJCQlEU0lfRklGT19TSVpFXzAsCisJCQlEU0lfRklGT19TSVpFXzApOworCisJLyogWFhYIHdoYXQgdmFsdWVzIGZvciB0aGUgdGltZW91dHM/ICovCisJZHNpX3NldF9zdG9wX3N0YXRlX2NvdW50ZXIoMTAwMCk7CisJZHNpX3NldF90YV90aW1lb3V0KDY0MDAwMDApOworCWRzaV9zZXRfbHBfcnhfdGltZW91dCg0ODAwMCk7CisJZHNpX3NldF9oc190eF90aW1lb3V0KDEwMDAwMDApOworCisJc3dpdGNoIChkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZSkgeworCWNhc2UgMTY6CisJCWJ1c3dpZHRoID0gMDsKKwkJYnJlYWs7CisJY2FzZSAxODoKKwkJYnVzd2lkdGggPSAxOworCQlicmVhazsKKwljYXNlIDI0OgorCQlidXN3aWR0aCA9IDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCXIgPSBkc2lfcmVhZF9yZWcoRFNJX0NUUkwpOworCXIgPSBGTERfTU9EKHIsIDEsIDEsIDEpOwkvKiBDU19SWF9FTiAqLworCXIgPSBGTERfTU9EKHIsIDEsIDIsIDIpOwkvKiBFQ0NfUlhfRU4gKi8KKwlyID0gRkxEX01PRChyLCAxLCAzLCAzKTsJLyogVFhfRklGT19BUkJJVFJBVElPTiAqLworCXIgPSBGTERfTU9EKHIsIDEsIDQsIDQpOwkvKiBWUF9DTEtfUkFUSU8sIGFsd2F5cyAxLCBzZWUgZXJyYXRhKi8KKwlyID0gRkxEX01PRChyLCBidXN3aWR0aCwgNywgNik7IC8qIFZQX0RBVEFfQlVTX1dJRFRIICovCisJciA9IEZMRF9NT0QociwgMCwgOCwgOCk7CS8qIFZQX0NMS19QT0wgKi8KKwlyID0gRkxEX01PRChyLCAyLCAxMywgMTIpOwkvKiBMSU5FX0JVRkZFUiwgMiBsaW5lcyAqLworCXIgPSBGTERfTU9EKHIsIDEsIDE0LCAxNCk7CS8qIFRSSUdHRVJfUkVTRVRfTU9ERSAqLworCXIgPSBGTERfTU9EKHIsIDEsIDE5LCAxOSk7CS8qIEVPVF9FTkFCTEUgKi8KKwlyID0gRkxEX01PRChyLCAxLCAyNCwgMjQpOwkvKiBEQ1NfQ01EX0VOQUJMRSAqLworCXIgPSBGTERfTU9EKHIsIDAsIDI1LCAyNSk7CS8qIERDU19DTURfQ09ERSwgMT1zdGFydCwgMD1jb250aW51ZSAqLworCisJZHNpX3dyaXRlX3JlZyhEU0lfQ1RSTCwgcik7CisKKwlkc2lfdmNfaW5pdGlhbF9jb25maWcoMCk7CisKKwkvKiBzZXQgYWxsIHZjIHRhcmdldHMgdG8gcGVyaXBoZXJhbCAwICovCisJZHNpLnZjWzBdLmRlc3RfcGVyID0gMDsKKwlkc2kudmNbMV0uZGVzdF9wZXIgPSAwOworCWRzaS52Y1syXS5kZXN0X3BlciA9IDA7CisJZHNpLnZjWzNdLmRlc3RfcGVyID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkc2lfcHJvdG9fdGltaW5ncyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJdW5zaWduZWQgdGxweCwgdGNsa196ZXJvLCB0Y2xrX3ByZXBhcmUsIHRjbGtfdHJhaWw7CisJdW5zaWduZWQgdGNsa19wcmUsIHRjbGtfcG9zdDsKKwl1bnNpZ25lZCB0aHNfcHJlcGFyZSwgdGhzX3ByZXBhcmVfdGhzX3plcm8sIHRoc196ZXJvOworCXVuc2lnbmVkIHRoc190cmFpbCwgdGhzX2V4aXQ7CisJdW5zaWduZWQgZGRyX2Nsa19wcmUsIGRkcl9jbGtfcG9zdDsKKwl1bnNpZ25lZCBlbnRlcl9oc19tb2RlX2xhdCwgZXhpdF9oc19tb2RlX2xhdDsKKwl1bnNpZ25lZCB0aHNfZW90OworCXUzMiByOworCisJciA9IGRzaV9yZWFkX3JlZyhEU0lfRFNJUEhZX0NGRzApOworCXRoc19wcmVwYXJlID0gRkxEX0dFVChyLCAzMSwgMjQpOworCXRoc19wcmVwYXJlX3Roc196ZXJvID0gRkxEX0dFVChyLCAyMywgMTYpOworCXRoc196ZXJvID0gdGhzX3ByZXBhcmVfdGhzX3plcm8gLSB0aHNfcHJlcGFyZTsKKwl0aHNfdHJhaWwgPSBGTERfR0VUKHIsIDE1LCA4KTsKKwl0aHNfZXhpdCA9IEZMRF9HRVQociwgNywgMCk7CisKKwlyID0gZHNpX3JlYWRfcmVnKERTSV9EU0lQSFlfQ0ZHMSk7CisJdGxweCA9IEZMRF9HRVQociwgMjIsIDE2KSAqIDI7CisJdGNsa190cmFpbCA9IEZMRF9HRVQociwgMTUsIDgpOworCXRjbGtfemVybyA9IEZMRF9HRVQociwgNywgMCk7CisKKwlyID0gZHNpX3JlYWRfcmVnKERTSV9EU0lQSFlfQ0ZHMik7CisJdGNsa19wcmVwYXJlID0gRkxEX0dFVChyLCA3LCAwKTsKKworCS8qIG1pbiA4KlVJICovCisJdGNsa19wcmUgPSAyMDsKKwkvKiBtaW4gNjBucyArIDUyKlVJICovCisJdGNsa19wb3N0ID0gbnMyZGRyKDYwKSArIDI2OworCisJLyogdGhzX2VvdCBpcyAyIGZvciAyIGRhdGFsYW5lcyBhbmQgNCBmb3IgMSBkYXRhbGFuZSAqLworCWlmIChkc3NkZXYtPnBoeS5kc2kuZGF0YTFfbGFuZSAhPSAwICYmCisJCQlkc3NkZXYtPnBoeS5kc2kuZGF0YTJfbGFuZSAhPSAwKQorCQl0aHNfZW90ID0gMjsKKwllbHNlCisJCXRoc19lb3QgPSA0OworCisJZGRyX2Nsa19wcmUgPSBESVZfUk9VTkRfVVAodGNsa19wcmUgKyB0bHB4ICsgdGNsa196ZXJvICsgdGNsa19wcmVwYXJlLAorCQkJNCk7CisJZGRyX2Nsa19wb3N0ID0gRElWX1JPVU5EX1VQKHRjbGtfcG9zdCArIHRoc190cmFpbCwgNCkgKyB0aHNfZW90OworCisJQlVHX09OKGRkcl9jbGtfcHJlID09IDAgfHwgZGRyX2Nsa19wcmUgPiAyNTUpOworCUJVR19PTihkZHJfY2xrX3Bvc3QgPT0gMCB8fCBkZHJfY2xrX3Bvc3QgPiAyNTUpOworCisJciA9IGRzaV9yZWFkX3JlZyhEU0lfQ0xLX1RJTUlORyk7CisJciA9IEZMRF9NT0QociwgZGRyX2Nsa19wcmUsIDE1LCA4KTsKKwlyID0gRkxEX01PRChyLCBkZHJfY2xrX3Bvc3QsIDcsIDApOworCWRzaV93cml0ZV9yZWcoRFNJX0NMS19USU1JTkcsIHIpOworCisJRFNTREJHKCJkZHJfY2xrX3ByZSAldSwgZGRyX2Nsa19wb3N0ICV1XG4iLAorCQkJZGRyX2Nsa19wcmUsCisJCQlkZHJfY2xrX3Bvc3QpOworCisJZW50ZXJfaHNfbW9kZV9sYXQgPSAxICsgRElWX1JPVU5EX1VQKHRscHgsIDQpICsKKwkJRElWX1JPVU5EX1VQKHRoc19wcmVwYXJlLCA0KSArCisJCURJVl9ST1VORF9VUCh0aHNfemVybyArIDMsIDQpOworCisJZXhpdF9oc19tb2RlX2xhdCA9IERJVl9ST1VORF9VUCh0aHNfdHJhaWwgKyB0aHNfZXhpdCwgNCkgKyAxICsgdGhzX2VvdDsKKworCXIgPSBGTERfVkFMKGVudGVyX2hzX21vZGVfbGF0LCAzMSwgMTYpIHwKKwkJRkxEX1ZBTChleGl0X2hzX21vZGVfbGF0LCAxNSwgMCk7CisJZHNpX3dyaXRlX3JlZyhEU0lfVk1fVElNSU5HNywgcik7CisKKwlEU1NEQkcoImVudGVyX2hzX21vZGVfbGF0ICV1LCBleGl0X2hzX21vZGVfbGF0ICV1XG4iLAorCQkJZW50ZXJfaHNfbW9kZV9sYXQsIGV4aXRfaHNfbW9kZV9sYXQpOworfQorCisKKyNkZWZpbmUgRFNJX0RFQ0xfVkFSUyBcCisJaW50IF9fZHNpX2NiID0gMDsgdTMyIF9fZHNpX2N2ID0gMDsKKworI2RlZmluZSBEU0lfRkxVU0goY2gpIFwKKwlpZiAoX19kc2lfY2IgPiAwKSB7IFwKKwkJLypEU1NEQkcoInNlbmRpbmcgbG9uZyBwYWNrZXQgJSMwMTB4XG4iLCBfX2RzaV9jdik7Ki8gXAorCQlkc2lfd3JpdGVfcmVnKERTSV9WQ19MT05HX1BBQ0tFVF9QQVlMT0FEKGNoKSwgX19kc2lfY3YpOyBcCisJCV9fZHNpX2NiID0gX19kc2lfY3YgPSAwOyBcCisJfQorCisjZGVmaW5lIERTSV9QVVNIKGNoLCBkYXRhKSBcCisJZG8geyBcCisJCV9fZHNpX2N2IHw9IChkYXRhKSA8PCAoX19kc2lfY2IgKiA4KTsgXAorCQkvKkRTU0RCRygiY3YgPSAlIzAxMHgsIGNiID0gJWRcbiIsIF9fZHNpX2N2LCBfX2RzaV9jYik7Ki8gXAorCQlpZiAoKytfX2RzaV9jYiA+IDMpIFwKKwkJCURTSV9GTFVTSChjaCk7IFwKKwl9IHdoaWxlICgwKQorCitzdGF0aWMgaW50IGRzaV91cGRhdGVfc2NyZWVuX2w0KHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJCWludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworCS8qIE5vdGU6IHN1cHBvcnRzIG9ubHkgMjRiaXQgY29sb3JzIGluIDMyYml0IGNvbnRhaW5lciAqLworCWludCBmaXJzdCA9IDE7CisJaW50IGZpZm9fc3RhbGxzID0gMDsKKwlpbnQgbWF4X2RzaV9wYWNrZXRfc2l6ZTsKKwlpbnQgbWF4X2RhdGFfcGVyX3BhY2tldDsKKwlpbnQgbWF4X3BpeGVsc19wZXJfcGFja2V0OworCWludCBwaXhlbHNfbGVmdDsKKwlpbnQgYnl0ZXNwcCA9IGRzc2Rldi0+Y3RybC5waXhlbF9zaXplIC8gODsKKwlpbnQgc2NyX3dpZHRoOworCXUzMiBfX2lvbWVtICpkYXRhOworCWludCBzdGFydF9vZmZzZXQ7CisJaW50IGhvcml6X2luYzsKKwlpbnQgY3VycmVudF94OworCXN0cnVjdCBvbWFwX292ZXJsYXkgKm92bDsKKworCWRlYnVnX2lycSA9IDA7CisKKwlEU1NEQkcoImRzaV91cGRhdGVfc2NyZWVuX2w0ICglZCwlZCAlZHglZClcbiIsCisJCQl4LCB5LCB3LCBoKTsKKworCW92bCA9IGRzc2Rldi0+bWFuYWdlci0+b3ZlcmxheXNbMF07CisKKwlpZiAob3ZsLT5pbmZvLmNvbG9yX21vZGUgIT0gT01BUF9EU1NfQ09MT1JfUkdCMjRVKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZSAhPSAyNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzY3Jfd2lkdGggPSBvdmwtPmluZm8uc2NyZWVuX3dpZHRoOworCWRhdGEgPSBvdmwtPmluZm8udmFkZHI7CisKKwlzdGFydF9vZmZzZXQgPSBzY3Jfd2lkdGggKiB5ICsgeDsKKwlob3Jpel9pbmMgPSBzY3Jfd2lkdGggLSB3OworCWN1cnJlbnRfeCA9IHg7CisKKwkvKiBXZSBuZWVkIGhlYWRlcig0KSArIERDU0NNRCgxKSArIHBpeGVscyhudW1waXgqYnl0ZXNwcCkgYnl0ZXMKKwkgKiBpbiBmaWZvICovCisKKwkvKiBXaGVuIHVzaW5nIENQVSwgbWF4IGxvbmcgcGFja2V0IHNpemUgaXMgVFggYnVmZmVyIHNpemUgKi8KKwltYXhfZHNpX3BhY2tldF9zaXplID0gZHNpLnZjWzBdLmZpZm9fc2l6ZSAqIDMyICogNDsKKworCS8qIHdlIHNlZW0gdG8gZ2V0IGJldHRlciBwZXJmIGlmIHdlIGRpdmlkZSB0aGUgdHggZmlmbyB0byBoYWxmLAorCSAgIGFuZCB3aGlsZSB0aGUgb3RoZXIgaGFsZiBpcyBiZWluZyBzZW50LCB3ZSBmaWxsIHRoZSBvdGhlciBoYWxmCisJICAgbWF4X2RzaV9wYWNrZXRfc2l6ZSAvPSAyOyAqLworCisJbWF4X2RhdGFfcGVyX3BhY2tldCA9IG1heF9kc2lfcGFja2V0X3NpemUgLSA0IC0gMTsKKworCW1heF9waXhlbHNfcGVyX3BhY2tldCA9IG1heF9kYXRhX3Blcl9wYWNrZXQgLyBieXRlc3BwOworCisJRFNTREJHKCJtYXhfcGl4ZWxzX3Blcl9wYWNrZXQgJWRcbiIsIG1heF9waXhlbHNfcGVyX3BhY2tldCk7CisKKwlwaXhlbHNfbGVmdCA9IHcgKiBoOworCisJRFNTREJHKCJ0b3RhbCBwaXhlbHMgJWRcbiIsIHBpeGVsc19sZWZ0KTsKKworCWRhdGEgKz0gc3RhcnRfb2Zmc2V0OworCisJd2hpbGUgKHBpeGVsc19sZWZ0ID4gMCkgeworCQkvKiAweDJjID0gd3JpdGVfbWVtb3J5X3N0YXJ0ICovCisJCS8qIDB4M2MgPSB3cml0ZV9tZW1vcnlfY29udGludWUgKi8KKwkJdTggZGNzX2NtZCA9IGZpcnN0ID8gMHgyYyA6IDB4M2M7CisJCWludCBwaXhlbHM7CisJCURTSV9ERUNMX1ZBUlM7CisJCWZpcnN0ID0gMDsKKworI2lmIDEKKwkJLyogdXNpbmcgZmlmbyBub3QgZW1wdHkgKi8KKwkJLyogVFhfRklGT19OT1RfRU1QVFkgKi8KKwkJd2hpbGUgKEZMRF9HRVQoZHNpX3JlYWRfcmVnKERTSV9WQ19DVFJMKDApKSwgNSwgNSkpIHsKKwkJCXVkZWxheSgxKTsKKwkJCWZpZm9fc3RhbGxzKys7CisJCQlpZiAoZmlmb19zdGFsbHMgPiAweGZmZmZmKSB7CisJCQkJRFNTRVJSKCJmaWZvIHN0YWxscyBvdmVyZmxvdywgcGl4ZWxzIGxlZnQgJWRcbiIsCisJCQkJCQlwaXhlbHNfbGVmdCk7CisJCQkJZHNpX2lmX2VuYWJsZSgwKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJfQorI2VsaWYgMQorCQkvKiB1c2luZyBmaWZvIGVtcHRpbmVzcyAqLworCQl3aGlsZSAoKFJFR19HRVQoRFNJX1RYX0ZJRk9fVkNfRU1QVElORVNTLCA3LCAwKSsxKSo0IDwKKwkJCQltYXhfZHNpX3BhY2tldF9zaXplKSB7CisJCQlmaWZvX3N0YWxscysrOworCQkJaWYgKGZpZm9fc3RhbGxzID4gMHhmZmZmZikgeworCQkJCURTU0VSUigiZmlmbyBzdGFsbHMgb3ZlcmZsb3csIHBpeGVscyBsZWZ0ICVkXG4iLAorCQkJCQkgICAgICAgcGl4ZWxzX2xlZnQpOworCQkJCWRzaV9pZl9lbmFibGUoMCk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0KKyNlbHNlCisJCXdoaWxlICgoUkVHX0dFVChEU0lfVFhfRklGT19WQ19FTVBUSU5FU1MsIDcsIDApKzEpKjQgPT0gMCkgeworCQkJZmlmb19zdGFsbHMrKzsKKwkJCWlmIChmaWZvX3N0YWxscyA+IDB4ZmZmZmYpIHsKKwkJCQlEU1NFUlIoImZpZm8gc3RhbGxzIG92ZXJmbG93LCBwaXhlbHMgbGVmdCAlZFxuIiwKKwkJCQkJICAgICAgIHBpeGVsc19sZWZ0KTsKKwkJCQlkc2lfaWZfZW5hYmxlKDApOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CisjZW5kaWYKKwkJcGl4ZWxzID0gbWluKG1heF9waXhlbHNfcGVyX3BhY2tldCwgcGl4ZWxzX2xlZnQpOworCisJCXBpeGVsc19sZWZ0IC09IHBpeGVsczsKKworCQlkc2lfdmNfd3JpdGVfbG9uZ19oZWFkZXIoMCwgRFNJX0RUX0RDU19MT05HX1dSSVRFLAorCQkJCTEgKyBwaXhlbHMgKiBieXRlc3BwLCAwKTsKKworCQlEU0lfUFVTSCgwLCBkY3NfY21kKTsKKworCQl3aGlsZSAocGl4ZWxzLS0gPiAwKSB7CisJCQl1MzIgcGl4ID0gX19yYXdfcmVhZGwoZGF0YSsrKTsKKworCQkJRFNJX1BVU0goMCwgKHBpeCA+PiAxNikgJiAweGZmKTsKKwkJCURTSV9QVVNIKDAsIChwaXggPj4gOCkgJiAweGZmKTsKKwkJCURTSV9QVVNIKDAsIChwaXggPj4gMCkgJiAweGZmKTsKKworCQkJY3VycmVudF94Kys7CisJCQlpZiAoY3VycmVudF94ID09IHgrdykgeworCQkJCWN1cnJlbnRfeCA9IHg7CisJCQkJZGF0YSArPSBob3Jpel9pbmM7CisJCQl9CisJCX0KKworCQlEU0lfRkxVU0goMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRzaV91cGRhdGVfc2NyZWVuX2Rpc3BjKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJdTE2IHgsIHUxNiB5LCB1MTYgdywgdTE2IGgpCit7CisJdW5zaWduZWQgYnl0ZXNwcDsKKwl1bnNpZ25lZCBieXRlc3BsOworCXVuc2lnbmVkIGJ5dGVzcGY7CisJdW5zaWduZWQgdG90YWxfbGVuOworCXVuc2lnbmVkIHBhY2tldF9wYXlsb2FkOworCXVuc2lnbmVkIHBhY2tldF9sZW47CisJdTMyIGw7CisJYm9vbCB1c2VfdGVfdHJpZ2dlcjsKKwljb25zdCB1bnNpZ25lZCBjaGFubmVsID0gMDsKKwkvKiBsaW5lIGJ1ZmZlciBpcyAxMDI0IHggMjRiaXRzICovCisJLyogWFhYOiBmb3Igc29tZSByZWFzb24gdXNpbmcgZnVsbCBidWZmZXIgc2l6ZSBjYXVzZXMgY29uc2lkZXJhYmxlIFRYCisJICogc2xvd2Rvd24gd2l0aCB1cGRhdGUgc2l6ZXMgdGhhdCBmaWxsIHRoZSB3aG9sZSBidWZmZXIgKi8KKwljb25zdCB1bnNpZ25lZCBsaW5lX2J1Zl9zaXplID0gMTAyMyAqIDM7CisKKwl1c2VfdGVfdHJpZ2dlciA9IGRzaS50ZV9lbmFibGVkICYmICFkc2kudXNlX2V4dF90ZTsKKworCWlmIChkc2kudXBkYXRlX21vZGUgIT0gT01BUF9EU1NfVVBEQVRFX0FVVE8pCisJCURTU0RCRygiZHNpX3VwZGF0ZV9zY3JlZW5fZGlzcGMoJWQsJWQgJWR4JWQpXG4iLAorCQkJCXgsIHksIHcsIGgpOworCisJYnl0ZXNwcAk9IGRzc2Rldi0+Y3RybC5waXhlbF9zaXplIC8gODsKKwlieXRlc3BsID0gdyAqIGJ5dGVzcHA7CisJYnl0ZXNwZiA9IGJ5dGVzcGwgKiBoOworCisJLyogTk9URTogcGFja2V0X3BheWxvYWQgaGFzIHRvIGJlIGVxdWFsIHRvIE4gKiBieXRlc3BsLCB3aGVyZSBOIGlzCisJICogbnVtYmVyIG9mIGxpbmVzIGluIGEgcGFja2V0LiAgU2VlIGVycmF0YSBhYm91dCBWUF9DTEtfUkFUSU8gKi8KKworCWlmIChieXRlc3BmIDwgbGluZV9idWZfc2l6ZSkKKwkJcGFja2V0X3BheWxvYWQgPSBieXRlc3BmOworCWVsc2UKKwkJcGFja2V0X3BheWxvYWQgPSAobGluZV9idWZfc2l6ZSkgLyBieXRlc3BsICogYnl0ZXNwbDsKKworCXBhY2tldF9sZW4gPSBwYWNrZXRfcGF5bG9hZCArIDE7CS8qIDEgYnl0ZSBmb3IgRENTIGNtZCAqLworCXRvdGFsX2xlbiA9IChieXRlc3BmIC8gcGFja2V0X3BheWxvYWQpICogcGFja2V0X2xlbjsKKworCWlmIChieXRlc3BmICUgcGFja2V0X3BheWxvYWQpCisJCXRvdGFsX2xlbiArPSAoYnl0ZXNwZiAlIHBhY2tldF9wYXlsb2FkKSArIDE7CisKKwlpZiAoMCkKKwkJZHNpX3ZjX3ByaW50X3N0YXR1cygxKTsKKworCWwgPSBGTERfVkFMKHRvdGFsX2xlbiwgMjMsIDApOyAvKiBURV9TSVpFICovCisJZHNpX3dyaXRlX3JlZyhEU0lfVkNfVEUoY2hhbm5lbCksIGwpOworCisJZHNpX3ZjX3dyaXRlX2xvbmdfaGVhZGVyKGNoYW5uZWwsIERTSV9EVF9EQ1NfTE9OR19XUklURSwgcGFja2V0X2xlbiwgMCk7CisKKwlpZiAodXNlX3RlX3RyaWdnZXIpCisJCWwgPSBGTERfTU9EKGwsIDEsIDMwLCAzMCk7IC8qIFRFX0VOICovCisJZWxzZQorCQlsID0gRkxEX01PRChsLCAxLCAzMSwgMzEpOyAvKiBURV9TVEFSVCAqLworCWRzaV93cml0ZV9yZWcoRFNJX1ZDX1RFKGNoYW5uZWwpLCBsKTsKKworCS8qIFdlIHB1dCBTSURMRU1PREUgdG8gbm8taWRsZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2ZlciwKKwkgKiBiZWNhdXNlIERTUyBpbnRlcnJ1cHRzIGFyZSBub3QgY2FwYWJsZSBvZiB3YWtpbmcgdXAgdGhlIENQVSBhbmQgdGhlCisJICogZnJhbWVkb25lIGludGVycnVwdCBjb3VsZCBiZSBkZWxheWVkIGZvciBxdWl0ZSBhIGxvbmcgdGltZS4gSSB0aGluaworCSAqIHRoZSBzYW1lIGdvZXMgZm9yIGFueSBEU1MgaW50ZXJydXB0cywgYnV0IGZvciBzb21lIHJlYXNvbiBJIGhhdmUgbm90CisJICogc2VlbiB0aGUgcHJvYmxlbSBhbnl3aGVyZSBlbHNlIHRoYW4gaGVyZS4KKwkgKi8KKwlkaXNwY19kaXNhYmxlX3NpZGxlKCk7CisKKwlkc3Nfc3RhcnRfdXBkYXRlKGRzc2Rldik7CisKKwlpZiAodXNlX3RlX3RyaWdnZXIpIHsKKwkJLyogZGlzYWJsZSBMUF9SWF9UTywgc28gdGhhdCB3ZSBjYW4gcmVjZWl2ZSBURS4gIFRpbWUgdG8gd2FpdAorCQkgKiBmb3IgVEUgaXMgbG9uZ2VyIHRoYW4gdGhlIHRpbWVyIGFsbG93cyAqLworCQlSRUdfRkxEX01PRChEU0lfVElNSU5HMiwgMCwgMTUsIDE1KTsgLyogTFBfUlhfVE8gKi8KKworCQlkc2lfdmNfc2VuZF9idGEoY2hhbm5lbCk7CisKKyNpZmRlZiBEU0lfQ0FUQ0hfTUlTU0lOR19URQorCQltb2RfdGltZXIoJmRzaS50ZV90aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjUwKSk7CisjZW5kaWYKKwl9Cit9CisKKyNpZmRlZiBEU0lfQ0FUQ0hfTUlTU0lOR19URQorc3RhdGljIHZvaWQgZHNpX3RlX3RpbWVvdXQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJRFNTRVJSKCJURSBub3QgcmVjZWl2ZWQgZm9yIDI1MG1zIVxuIik7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgZHNpX2ZyYW1lZG9uZV9pcnFfY2FsbGJhY2sodm9pZCAqZGF0YSwgdTMyIG1hc2spCit7CisJLyogTm90ZTogV2UgZ2V0IEZSQU1FRE9ORSB3aGVuIERJU1BDIGhhcyBmaW5pc2hlZCBzZW5kaW5nIHBpeGVscyBhbmQKKwkgKiB0dXJucyBpdHNlbGYgb2ZmLiBIb3dldmVyLCBEU0kgc3RpbGwgaGFzIHRoZSBwaXhlbHMgaW4gaXRzIGJ1ZmZlcnMsCisJICogYW5kIGlzIHNlbmRpbmcgdGhlIGRhdGEuCisJICovCisKKwkvKiBTSURMRU1PREUgYmFjayB0byBzbWFydC1pZGxlICovCisJZGlzcGNfZW5hYmxlX3NpZGxlKCk7CisKKwlkc2kuZnJhbWVkb25lX3JlY2VpdmVkID0gdHJ1ZTsKKwl3YWtlX3VwKCZkc2kud2FpdHF1ZXVlKTsKK30KKworc3RhdGljIHZvaWQgZHNpX3NldF91cGRhdGVfcmVnaW9uKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJdTE2IHgsIHUxNiB5LCB1MTYgdywgdTE2IGgpCit7CisJc3Bpbl9sb2NrKCZkc2kudXBkYXRlX2xvY2spOworCWlmIChkc2kudXBkYXRlX3JlZ2lvbi5kaXJ0eSkgeworCQlkc2kudXBkYXRlX3JlZ2lvbi54ID0gbWluKHgsIGRzaS51cGRhdGVfcmVnaW9uLngpOworCQlkc2kudXBkYXRlX3JlZ2lvbi55ID0gbWluKHksIGRzaS51cGRhdGVfcmVnaW9uLnkpOworCQlkc2kudXBkYXRlX3JlZ2lvbi53ID0gbWF4KHcsIGRzaS51cGRhdGVfcmVnaW9uLncpOworCQlkc2kudXBkYXRlX3JlZ2lvbi5oID0gbWF4KGgsIGRzaS51cGRhdGVfcmVnaW9uLmgpOworCX0gZWxzZSB7CisJCWRzaS51cGRhdGVfcmVnaW9uLnggPSB4OworCQlkc2kudXBkYXRlX3JlZ2lvbi55ID0geTsKKwkJZHNpLnVwZGF0ZV9yZWdpb24udyA9IHc7CisJCWRzaS51cGRhdGVfcmVnaW9uLmggPSBoOworCX0KKworCWRzaS51cGRhdGVfcmVnaW9uLmRldmljZSA9IGRzc2RldjsKKwlkc2kudXBkYXRlX3JlZ2lvbi5kaXJ0eSA9IHRydWU7CisKKwlzcGluX3VubG9jaygmZHNpLnVwZGF0ZV9sb2NrKTsKKworfQorCitzdGF0aWMgaW50IGRzaV9zZXRfdXBkYXRlX21vZGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQllbnVtIG9tYXBfZHNzX3VwZGF0ZV9tb2RlIG1vZGUpCit7CisJaW50IHIgPSAwOworCWludCBpOworCisJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZkc2kuYnVzX2xvY2spKTsKKworCWlmIChkc2kudXBkYXRlX21vZGUgIT0gbW9kZSkgeworCQlkc2kudXBkYXRlX21vZGUgPSBtb2RlOworCisJCS8qIE1hcmsgdGhlIG92ZXJsYXlzIGRpcnR5LCBhbmQgZG8gYXBwbHkoKSwgc28gdGhhdCB3ZSBnZXQgdGhlCisJCSAqIG92ZXJsYXlzIGNvbmZpZ3VyZWQgcHJvcGVybHkgYWZ0ZXIgdXBkYXRlIG1vZGUgY2hhbmdlLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgb21hcF9kc3NfZ2V0X251bV9vdmVybGF5cygpOyArK2kpIHsKKwkJCXN0cnVjdCBvbWFwX292ZXJsYXkgKm92bDsKKwkJCW92bCA9IG9tYXBfZHNzX2dldF9vdmVybGF5KGkpOworCQkJaWYgKG92bC0+bWFuYWdlciA9PSBkc3NkZXYtPm1hbmFnZXIpCisJCQkJb3ZsLT5pbmZvX2RpcnR5ID0gdHJ1ZTsKKwkJfQorCisJCXIgPSBkc3NkZXYtPm1hbmFnZXItPmFwcGx5KGRzc2Rldi0+bWFuYWdlcik7CisKKwkJaWYgKGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUgJiYKKwkJCQltb2RlID09IE9NQVBfRFNTX1VQREFURV9BVVRPKSB7CisJCQl1MTYgdywgaDsKKworCQkJRFNTREJHKCJzdGFydGluZyBhdXRvIHVwZGF0ZVxuIik7CisKKwkJCWRzc2Rldi0+Z2V0X3Jlc29sdXRpb24oZHNzZGV2LCAmdywgJmgpOworCisJCQlkc2lfc2V0X3VwZGF0ZV9yZWdpb24oZHNzZGV2LCAwLCAwLCB3LCBoKTsKKworCQkJZHNpX3BlcmZfbWFya19zdGFydF9hdXRvKCk7CisKKwkJCXdha2VfdXAoJmRzaS53YWl0cXVldWUpOworCQl9CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgZHNpX3NldF90ZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGJvb2wgZW5hYmxlKQoreworCWludCByOworCXIgPSBkc3NkZXYtPmRyaXZlci0+ZW5hYmxlX3RlKGRzc2RldiwgZW5hYmxlKTsKKwkvKiBYWFggZm9yIHNvbWUgcmVhc29uLCBEU0kgVEUgYnJlYWtzIGlmIHdlIGRvbid0IHdhaXQgaGVyZS4KKwkgKiBQYW5lbCBidWc/IE5lZWRzIG1vcmUgc3R1ZHlpbmcgKi8KKwltc2xlZXAoMTAwKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgZHNpX2hhbmRsZV9mcmFtZWRvbmUodm9pZCkKK3sKKwlpbnQgcjsKKwljb25zdCBpbnQgY2hhbm5lbCA9IDA7CisJYm9vbCB1c2VfdGVfdHJpZ2dlcjsKKworCXVzZV90ZV90cmlnZ2VyID0gZHNpLnRlX2VuYWJsZWQgJiYgIWRzaS51c2VfZXh0X3RlOworCisJaWYgKGRzaS51cGRhdGVfbW9kZSAhPSBPTUFQX0RTU19VUERBVEVfQVVUTykKKwkJRFNTREJHKCJGUkFNRURPTkVcbiIpOworCisJaWYgKHVzZV90ZV90cmlnZ2VyKSB7CisJCS8qIGVuYWJsZSBMUF9SWF9UTyBhZ2FpbiBhZnRlciB0aGUgVEUgKi8KKwkJUkVHX0ZMRF9NT0QoRFNJX1RJTUlORzIsIDEsIDE1LCAxNSk7IC8qIExQX1JYX1RPICovCisJfQorCisJLyogU2VuZCBCVEEgYWZ0ZXIgdGhlIGZyYW1lLiBXZSBuZWVkIHRoaXMgZm9yIHRoZSBURSB0byB3b3JrLCBhcyBURQorCSAqIHRyaWdnZXIgaXMgb25seSBzZW50IGZvciBCVEFzIHdpdGhvdXQgcHJlY2VkaW5nIHBhY2tldC4gVGh1cyB3ZSBuZWVkCisJICogdG8gQlRBIGFmdGVyIHRoZSBwaXhlbCBwYWNrZXRzIHNvIHRoYXQgbmV4dCBCVEEgd2lsbCBjYXVzZSBURQorCSAqIHRyaWdnZXIuCisJICoKKwkgKiBUaGlzIGlzIG5vdCBuZWVkZWQgd2hlbiBURSBpcyBub3QgaW4gdXNlLCBidXQgd2UgZG8gaXQgYW55d2F5IHRvCisJICogbWFrZSBzdXJlIHRoYXQgdGhlIHRyYW5zZmVyIGhhcyBiZWVuIGNvbXBsZXRlZC4gSXQgd291bGQgYmUgbW9yZQorCSAqIG9wdGltYWwsIGJ1dCBtb3JlIGNvbXBsZXgsIHRvIHdhaXQgb25seSBqdXN0IGJlZm9yZSBzdGFydGluZyBuZXh0CisJICogdHJhbnNmZXIuICovCisJciA9IGRzaV92Y19zZW5kX2J0YV9zeW5jKGNoYW5uZWwpOworCWlmIChyKQorCQlEU1NFUlIoIkJUQSBhZnRlciBmcmFtZWRvbmUgZmFpbGVkXG4iKTsKKworCS8qIFJYX0ZJRk9fTk9UX0VNUFRZICovCisJaWYgKFJFR19HRVQoRFNJX1ZDX0NUUkwoY2hhbm5lbCksIDIwLCAyMCkpIHsKKwkJRFNTRVJSKCJSZWNlaXZlZCBlcnJvciBkdXJpbmcgZnJhbWUgdHJhbnNmZXI6XG4iKTsKKwkJZHNpX3ZjX2ZsdXNoX3JlY2VpdmVfZGF0YSgwKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfT01BUDJfRFNTX0ZBS0VfVlNZTkMKKwlkaXNwY19mYWtlX3ZzeW5jX2lycSgpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgZHNpX3VwZGF0ZV90aHJlYWQodm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGV2aWNlOworCXUxNiB4LCB5LCB3LCBoOworCisJd2hpbGUgKDEpIHsKKwkJYm9vbCBzY2hlZDsKKworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZHNpLndhaXRxdWV1ZSwKKwkJCQlkc2kudXBkYXRlX21vZGUgPT0gT01BUF9EU1NfVVBEQVRFX0FVVE8gfHwKKwkJCQkoZHNpLnVwZGF0ZV9tb2RlID09IE9NQVBfRFNTX1VQREFURV9NQU5VQUwgJiYKKwkJCQkgZHNpLnVwZGF0ZV9yZWdpb24uZGlydHkgPT0gdHJ1ZSkgfHwKKwkJCQlrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOworCisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCQlicmVhazsKKworCQlkc2lfYnVzX2xvY2soKTsKKworCQlpZiAoZHNpLnVwZGF0ZV9tb2RlID09IE9NQVBfRFNTX1VQREFURV9ESVNBQkxFRCB8fAorCQkJCWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQkJZHNpX2J1c191bmxvY2soKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZHNpX3BlcmZfbWFya19zZXR1cCgpOworCisJCWlmIChkc2kudXBkYXRlX3JlZ2lvbi5kaXJ0eSkgeworCQkJc3Bpbl9sb2NrKCZkc2kudXBkYXRlX2xvY2spOworCQkJZHNpLmFjdGl2ZV91cGRhdGVfcmVnaW9uID0gZHNpLnVwZGF0ZV9yZWdpb247CisJCQlkc2kudXBkYXRlX3JlZ2lvbi5kaXJ0eSA9IGZhbHNlOworCQkJc3Bpbl91bmxvY2soJmRzaS51cGRhdGVfbG9jayk7CisJCX0KKworCQlkZXZpY2UgPSBkc2kuYWN0aXZlX3VwZGF0ZV9yZWdpb24uZGV2aWNlOworCQl4ID0gZHNpLmFjdGl2ZV91cGRhdGVfcmVnaW9uLng7CisJCXkgPSBkc2kuYWN0aXZlX3VwZGF0ZV9yZWdpb24ueTsKKwkJdyA9IGRzaS5hY3RpdmVfdXBkYXRlX3JlZ2lvbi53OworCQloID0gZHNpLmFjdGl2ZV91cGRhdGVfcmVnaW9uLmg7CisKKwkJaWYgKGRldmljZS0+bWFuYWdlci0+Y2FwcyAmIE9NQVBfRFNTX09WTF9NR1JfQ0FQX0RJU1BDKSB7CisKKwkJCWlmIChkc2kudXBkYXRlX21vZGUgPT0gT01BUF9EU1NfVVBEQVRFX01BTlVBTCkKKwkJCQlkc3Nfc2V0dXBfcGFydGlhbF9wbGFuZXMoZGV2aWNlLAorCQkJCQkJJngsICZ5LCAmdywgJmgpOworCisJCQlkaXNwY19zZXRfbGNkX3NpemUodywgaCk7CisJCX0KKworCQlpZiAoZHNpLmFjdGl2ZV91cGRhdGVfcmVnaW9uLmRpcnR5KSB7CisJCQlkc2kuYWN0aXZlX3VwZGF0ZV9yZWdpb24uZGlydHkgPSBmYWxzZTsKKwkJCS8qIFhYWCBUT0RPIHdlIGRvbid0IG5lZWQgdG8gc2VuZCB0aGUgY29vcmRzLCBpZiB0aGV5CisJCQkgKiBhcmUgdGhlIHNhbWUgdGhhdCBhcmUgYWxyZWFkeSBwcm9ncmFtbWVkIHRvIHRoZQorCQkJICogcGFuZWwuIFRoYXQgc2hvdWxkIHNwZWVkIHVwIG1hbnVhbCB1cGRhdGUgYSBiaXQgKi8KKwkJCWRldmljZS0+ZHJpdmVyLT5zZXR1cF91cGRhdGUoZGV2aWNlLCB4LCB5LCB3LCBoKTsKKwkJfQorCisJCWRzaV9wZXJmX21hcmtfc3RhcnQoKTsKKworCQlpZiAoZGV2aWNlLT5tYW5hZ2VyLT5jYXBzICYgT01BUF9EU1NfT1ZMX01HUl9DQVBfRElTUEMpIHsKKwkJCWRzaV92Y19jb25maWdfdnAoMCk7CisKKwkJCWlmIChkc2kudGVfZW5hYmxlZCAmJiBkc2kudXNlX2V4dF90ZSkKKwkJCQlkZXZpY2UtPmRyaXZlci0+d2FpdF9mb3JfdGUoZGV2aWNlKTsKKworCQkJZHNpLmZyYW1lZG9uZV9yZWNlaXZlZCA9IGZhbHNlOworCisJCQlkc2lfdXBkYXRlX3NjcmVlbl9kaXNwYyhkZXZpY2UsIHgsIHksIHcsIGgpOworCisJCQkvKiB3YWl0IGZvciBmcmFtZWRvbmUgKi8KKwkJCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCQkJd2FpdF9ldmVudF90aW1lb3V0KGRzaS53YWl0cXVldWUsCisJCQkJCWRzaS5mcmFtZWRvbmVfcmVjZWl2ZWQgPT0gdHJ1ZSwKKwkJCQkJdGltZW91dCk7CisKKwkJCWlmICghZHNpLmZyYW1lZG9uZV9yZWNlaXZlZCkgeworCQkJCURTU0VSUigiZnJhbWVkb25lIHRpbWVvdXRcbiIpOworCQkJCURTU0VSUigiZmFpbGVkIHVwZGF0ZSAlZCwlZCAlZHglZFxuIiwKKwkJCQkJCXgsIHksIHcsIGgpOworCisJCQkJZGlzcGNfZW5hYmxlX3NpZGxlKCk7CisJCQkJZGlzcGNfZW5hYmxlX2xjZF9vdXQoMCk7CisKKwkJCQlkc2lfcmVzZXRfdHhfZmlmbygwKTsKKwkJCX0gZWxzZSB7CisJCQkJZHNpX2hhbmRsZV9mcmFtZWRvbmUoKTsKKwkJCQlkc2lfcGVyZl9zaG93KCJESVNQQyIpOworCQkJfQorCQl9IGVsc2UgeworCQkJZHNpX3VwZGF0ZV9zY3JlZW5fbDQoZGV2aWNlLCB4LCB5LCB3LCBoKTsKKwkJCWRzaV9wZXJmX3Nob3coIkw0Iik7CisJCX0KKworCQlzY2hlZCA9IGF0b21pY19yZWFkKCZkc2kuYnVzX2xvY2suY291bnQpIDwgMDsKKworCQljb21wbGV0ZV9hbGwoJmRzaS51cGRhdGVfY29tcGxldGlvbik7CisKKwkJZHNpX2J1c191bmxvY2soKTsKKworCQkvKiBYWFggV2UgbmVlZCB0byBnaXZlIG90aGVycyBjaGFuY2UgdG8gZ2V0IHRoZSBidXMgbG9jay4gSXMKKwkJICogdGhlcmUgYSBiZXR0ZXIgd2F5IGZvciB0aGlzPyAqLworCQlpZiAoZHNpLnVwZGF0ZV9tb2RlID09IE9NQVBfRFNTX1VQREFURV9BVVRPICYmIHNjaGVkKQorCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOworCX0KKworCURTU0RCRygidXBkYXRlIHRocmVhZCBleGl0aW5nXG4iKTsKKworCXJldHVybiAwOworfQorCisKKworLyogRGlzcGxheSBmdW5jcyAqLworCitzdGF0aWMgaW50IGRzaV9kaXNwbGF5X2luaXRfZGlzcGMoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWludCByOworCisJciA9IG9tYXBfZGlzcGNfcmVnaXN0ZXJfaXNyKGRzaV9mcmFtZWRvbmVfaXJxX2NhbGxiYWNrLCBOVUxMLAorCQkJRElTUENfSVJRX0ZSQU1FRE9ORSk7CisJaWYgKHIpIHsKKwkJRFNTRVJSKCJjYW4ndCBnZXQgRlJBTUVET05FIGlycVxuIik7CisJCXJldHVybiByOworCX0KKworCWRpc3BjX3NldF9sY2RfZGlzcGxheV90eXBlKE9NQVBfRFNTX0xDRF9ESVNQTEFZX1RGVCk7CisKKwlkaXNwY19zZXRfcGFyYWxsZWxfaW50ZXJmYWNlX21vZGUoT01BUF9EU1NfUEFSQUxMRUxNT0RFX0RTSSk7CisJZGlzcGNfZW5hYmxlX2ZpZm9oYW5kY2hlY2soMSk7CisKKwlkaXNwY19zZXRfdGZ0X2RhdGFfbGluZXMoZHNzZGV2LT5jdHJsLnBpeGVsX3NpemUpOworCisJeworCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzIHRpbWluZ3MgPSB7CisJCQkuaHN3CQk9IDEsCisJCQkuaGZwCQk9IDEsCisJCQkuaGJwCQk9IDEsCisJCQkudnN3CQk9IDEsCisJCQkudmZwCQk9IDAsCisJCQkudmJwCQk9IDAsCisJCX07CisKKwkJZGlzcGNfc2V0X2xjZF90aW1pbmdzKCZ0aW1pbmdzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHNpX2Rpc3BsYXlfdW5pbml0X2Rpc3BjKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlvbWFwX2Rpc3BjX3VucmVnaXN0ZXJfaXNyKGRzaV9mcmFtZWRvbmVfaXJxX2NhbGxiYWNrLCBOVUxMLAorCQkJRElTUENfSVJRX0ZSQU1FRE9ORSk7Cit9CisKK3N0YXRpYyBpbnQgZHNpX2NvbmZpZ3VyZV9kc2lfY2xvY2tzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgZHNpX2Nsb2NrX2luZm8gY2luZm87CisJaW50IHI7CisKKwkvKiB3ZSBhbHdheXMgdXNlIERTUzJfRkNLIGFzIGlucHV0IGNsb2NrICovCisJY2luZm8udXNlX2RzczJfZmNrID0gdHJ1ZTsKKwljaW5mby5yZWduICA9IGRzc2Rldi0+cGh5LmRzaS5kaXYucmVnbjsKKwljaW5mby5yZWdtICA9IGRzc2Rldi0+cGh5LmRzaS5kaXYucmVnbTsKKwljaW5mby5yZWdtMyA9IGRzc2Rldi0+cGh5LmRzaS5kaXYucmVnbTM7CisJY2luZm8ucmVnbTQgPSBkc3NkZXYtPnBoeS5kc2kuZGl2LnJlZ200OworCXIgPSBkc2lfY2FsY19jbG9ja19yYXRlcygmY2luZm8pOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBkc2lfcGxsX3NldF9jbG9ja19kaXYoJmNpbmZvKTsKKwlpZiAocikgeworCQlEU1NFUlIoIkZhaWxlZCB0byBzZXQgZHNpIGNsb2Nrc1xuIik7CisJCXJldHVybiByOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzaV9jb25maWd1cmVfZGlzcGNfY2xvY2tzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyBkaXNwY19jaW5mbzsKKwlpbnQgcjsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZmNrOworCisJZmNrID0gZHNpX2dldF9kc2kxX3BsbF9yYXRlKCk7CisKKwlkaXNwY19jaW5mby5sY2tfZGl2ID0gZHNzZGV2LT5waHkuZHNpLmRpdi5sY2tfZGl2OworCWRpc3BjX2NpbmZvLnBja19kaXYgPSBkc3NkZXYtPnBoeS5kc2kuZGl2LnBja19kaXY7CisKKwlyID0gZGlzcGNfY2FsY19jbG9ja19yYXRlcyhmY2ssICZkaXNwY19jaW5mbyk7CisJaWYgKHIpIHsKKwkJRFNTRVJSKCJGYWlsZWQgdG8gY2FsYyBkaXNwYyBjbG9ja3NcbiIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyID0gZGlzcGNfc2V0X2Nsb2NrX2RpdigmZGlzcGNfY2luZm8pOworCWlmIChyKSB7CisJCURTU0VSUigiRmFpbGVkIHRvIHNldCBkaXNwYyBjbG9ja3NcbiIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc2lfZGlzcGxheV9pbml0X2RzaShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJaW50IHI7CisKKwlfZHNpX3ByaW50X3Jlc2V0X3N0YXR1cygpOworCisJciA9IGRzaV9wbGxfaW5pdChkc3NkZXYsIHRydWUsIHRydWUpOworCWlmIChyKQorCQlnb3RvIGVycjA7CisKKwlyID0gZHNpX2NvbmZpZ3VyZV9kc2lfY2xvY2tzKGRzc2Rldik7CisJaWYgKHIpCisJCWdvdG8gZXJyMTsKKworCWRzc19zZWxlY3RfY2xrX3NvdXJjZSh0cnVlLCB0cnVlKTsKKworCURTU0RCRygiUExMIE9LXG4iKTsKKworCXIgPSBkc2lfY29uZmlndXJlX2Rpc3BjX2Nsb2Nrcyhkc3NkZXYpOworCWlmIChyKQorCQlnb3RvIGVycjI7CisKKwlyID0gZHNpX2NvbXBsZXhpb19pbml0KGRzc2Rldik7CisJaWYgKHIpCisJCWdvdG8gZXJyMjsKKworCV9kc2lfcHJpbnRfcmVzZXRfc3RhdHVzKCk7CisKKwlkc2lfcHJvdG9fdGltaW5ncyhkc3NkZXYpOworCWRzaV9zZXRfbHBfY2xrX2Rpdmlzb3IoZHNzZGV2KTsKKworCWlmICgxKQorCQlfZHNpX3ByaW50X3Jlc2V0X3N0YXR1cygpOworCisJciA9IGRzaV9wcm90b19jb25maWcoZHNzZGV2KTsKKwlpZiAocikKKwkJZ290byBlcnIzOworCisJLyogZW5hYmxlIGludGVyZmFjZSAqLworCWRzaV92Y19lbmFibGUoMCwgMSk7CisJZHNpX2lmX2VuYWJsZSgxKTsKKwlkc2lfZm9yY2VfdHhfc3RvcF9tb2RlX2lvKCk7CisKKwlpZiAoZHNzZGV2LT5kcml2ZXItPmVuYWJsZSkgeworCQlyID0gZHNzZGV2LT5kcml2ZXItPmVuYWJsZShkc3NkZXYpOworCQlpZiAocikKKwkJCWdvdG8gZXJyNDsKKwl9CisKKwkvKiBlbmFibGUgaGlnaC1zcGVlZCBhZnRlciBpbml0aWFsIGNvbmZpZyAqLworCWRzaV92Y19lbmFibGVfaHMoMCwgMSk7CisKKwlyZXR1cm4gMDsKK2VycjQ6CisJZHNpX2lmX2VuYWJsZSgwKTsKK2VycjM6CisJZHNpX2NvbXBsZXhpb191bmluaXQoKTsKK2VycjI6CisJZHNzX3NlbGVjdF9jbGtfc291cmNlKGZhbHNlLCBmYWxzZSk7CitlcnIxOgorCWRzaV9wbGxfdW5pbml0KCk7CitlcnIwOgorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBkc2lfZGlzcGxheV91bmluaXRfZHNpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlpZiAoZHNzZGV2LT5kcml2ZXItPmRpc2FibGUpCisJCWRzc2Rldi0+ZHJpdmVyLT5kaXNhYmxlKGRzc2Rldik7CisKKwlkc3Nfc2VsZWN0X2Nsa19zb3VyY2UoZmFsc2UsIGZhbHNlKTsKKwlkc2lfY29tcGxleGlvX3VuaW5pdCgpOworCWRzaV9wbGxfdW5pbml0KCk7Cit9CisKK3N0YXRpYyBpbnQgZHNpX2NvcmVfaW5pdCh2b2lkKQoreworCS8qIEF1dG9pZGxlICovCisJUkVHX0ZMRF9NT0QoRFNJX1NZU0NPTkZJRywgMSwgMCwgMCk7CisKKwkvKiBFTldBS0VVUCAqLworCVJFR19GTERfTU9EKERTSV9TWVNDT05GSUcsIDEsIDIsIDIpOworCisJLyogU0lETEVNT0RFIHNtYXJ0LWlkbGUgKi8KKwlSRUdfRkxEX01PRChEU0lfU1lTQ09ORklHLCAyLCA0LCAzKTsKKworCV9kc2lfaW5pdGlhbGl6ZV9pcnEoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzaV9kaXNwbGF5X2VuYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJaW50IHIgPSAwOworCisJRFNTREJHKCJkc2lfZGlzcGxheV9lbmFibGVcbiIpOworCisJbXV0ZXhfbG9jaygmZHNpLmxvY2spOworCWRzaV9idXNfbG9jaygpOworCisJciA9IG9tYXBfZHNzX3N0YXJ0X2RldmljZShkc3NkZXYpOworCWlmIChyKSB7CisJCURTU0VSUigiZmFpbGVkIHRvIHN0YXJ0IGRldmljZVxuIik7CisJCWdvdG8gZXJyMDsKKwl9CisKKwlpZiAoZHNzZGV2LT5zdGF0ZSAhPSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEKSB7CisJCURTU0VSUigiZHNzZGV2IGFscmVhZHkgZW5hYmxlZFxuIik7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIGVycjE7CisJfQorCisJZW5hYmxlX2Nsb2NrcygxKTsKKwlkc2lfZW5hYmxlX3BsbF9jbG9jaygxKTsKKworCXIgPSBfZHNpX3Jlc2V0KCk7CisJaWYgKHIpCisJCWdvdG8gZXJyMjsKKworCWRzaV9jb3JlX2luaXQoKTsKKworCXIgPSBkc2lfZGlzcGxheV9pbml0X2Rpc3BjKGRzc2Rldik7CisJaWYgKHIpCisJCWdvdG8gZXJyMjsKKworCXIgPSBkc2lfZGlzcGxheV9pbml0X2RzaShkc3NkZXYpOworCWlmIChyKQorCQlnb3RvIGVycjM7CisKKwlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkU7CisKKwlkc2kudXNlX2V4dF90ZSA9IGRzc2Rldi0+cGh5LmRzaS5leHRfdGU7CisJciA9IGRzaV9zZXRfdGUoZHNzZGV2LCBkc2kudGVfZW5hYmxlZCk7CisJaWYgKHIpCisJCWdvdG8gZXJyNDsKKworCWRzaV9zZXRfdXBkYXRlX21vZGUoZHNzZGV2LCBkc2kudXNlcl91cGRhdGVfbW9kZSk7CisKKwlkc2lfYnVzX3VubG9jaygpOworCW11dGV4X3VubG9jaygmZHNpLmxvY2spOworCisJcmV0dXJuIDA7CisKK2VycjQ6CisKKwlkc2lfZGlzcGxheV91bmluaXRfZHNpKGRzc2Rldik7CitlcnIzOgorCWRzaV9kaXNwbGF5X3VuaW5pdF9kaXNwYyhkc3NkZXYpOworZXJyMjoKKwllbmFibGVfY2xvY2tzKDApOworCWRzaV9lbmFibGVfcGxsX2Nsb2NrKDApOworZXJyMToKKwlvbWFwX2Rzc19zdG9wX2RldmljZShkc3NkZXYpOworZXJyMDoKKwlkc2lfYnVzX3VubG9jaygpOworCW11dGV4X3VubG9jaygmZHNpLmxvY2spOworCURTU0RCRygiZHNpX2Rpc3BsYXlfZW5hYmxlIEZBSUxFRFxuIik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGRzaV9kaXNwbGF5X2Rpc2FibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCURTU0RCRygiZHNpX2Rpc3BsYXlfZGlzYWJsZVxuIik7CisKKwltdXRleF9sb2NrKCZkc2kubG9jayk7CisJZHNpX2J1c19sb2NrKCk7CisKKwlpZiAoZHNzZGV2LT5zdGF0ZSA9PSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEIHx8CisJCQlkc3NkZXYtPnN0YXRlID09IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEKQorCQlnb3RvIGVuZDsKKworCWRzaS51cGRhdGVfbW9kZSA9IE9NQVBfRFNTX1VQREFURV9ESVNBQkxFRDsKKwlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9ESVNBQkxFRDsKKworCWRzaV9kaXNwbGF5X3VuaW5pdF9kaXNwYyhkc3NkZXYpOworCisJZHNpX2Rpc3BsYXlfdW5pbml0X2RzaShkc3NkZXYpOworCisJZW5hYmxlX2Nsb2NrcygwKTsKKwlkc2lfZW5hYmxlX3BsbF9jbG9jaygwKTsKKworCW9tYXBfZHNzX3N0b3BfZGV2aWNlKGRzc2Rldik7CitlbmQ6CisJZHNpX2J1c191bmxvY2soKTsKKwltdXRleF91bmxvY2soJmRzaS5sb2NrKTsKK30KKworc3RhdGljIGludCBkc2lfZGlzcGxheV9zdXNwZW5kKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlEU1NEQkcoImRzaV9kaXNwbGF5X3N1c3BlbmRcbiIpOworCisJbXV0ZXhfbG9jaygmZHNpLmxvY2spOworCWRzaV9idXNfbG9jaygpOworCisJaWYgKGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9ESVNBQkxFRCB8fAorCQkJZHNzZGV2LT5zdGF0ZSA9PSBPTUFQX0RTU19ESVNQTEFZX1NVU1BFTkRFRCkKKwkJZ290byBlbmQ7CisKKwlkc2kudXBkYXRlX21vZGUgPSBPTUFQX0RTU19VUERBVEVfRElTQUJMRUQ7CisJZHNzZGV2LT5zdGF0ZSA9IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEOworCisJZHNpX2Rpc3BsYXlfdW5pbml0X2Rpc3BjKGRzc2Rldik7CisKKwlkc2lfZGlzcGxheV91bmluaXRfZHNpKGRzc2Rldik7CisKKwllbmFibGVfY2xvY2tzKDApOworCWRzaV9lbmFibGVfcGxsX2Nsb2NrKDApOworZW5kOgorCWRzaV9idXNfdW5sb2NrKCk7CisJbXV0ZXhfdW5sb2NrKCZkc2kubG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc2lfZGlzcGxheV9yZXN1bWUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWludCByOworCisJRFNTREJHKCJkc2lfZGlzcGxheV9yZXN1bWVcbiIpOworCisJbXV0ZXhfbG9jaygmZHNpLmxvY2spOworCWRzaV9idXNfbG9jaygpOworCisJaWYgKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9TVVNQRU5ERUQpIHsKKwkJRFNTRVJSKCJkc3NkZXYgbm90IHN1c3BlbmRlZFxuIik7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIGVycjA7CisJfQorCisJZW5hYmxlX2Nsb2NrcygxKTsKKwlkc2lfZW5hYmxlX3BsbF9jbG9jaygxKTsKKworCXIgPSBfZHNpX3Jlc2V0KCk7CisJaWYgKHIpCisJCWdvdG8gZXJyMTsKKworCWRzaV9jb3JlX2luaXQoKTsKKworCXIgPSBkc2lfZGlzcGxheV9pbml0X2Rpc3BjKGRzc2Rldik7CisJaWYgKHIpCisJCWdvdG8gZXJyMTsKKworCXIgPSBkc2lfZGlzcGxheV9pbml0X2RzaShkc3NkZXYpOworCWlmIChyKQorCQlnb3RvIGVycjI7CisKKwlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkU7CisKKwlyID0gZHNpX3NldF90ZShkc3NkZXYsIGRzaS50ZV9lbmFibGVkKTsKKwlpZiAocikKKwkJZ290byBlcnIyOworCisJZHNpX3NldF91cGRhdGVfbW9kZShkc3NkZXYsIGRzaS51c2VyX3VwZGF0ZV9tb2RlKTsKKworCWRzaV9idXNfdW5sb2NrKCk7CisJbXV0ZXhfdW5sb2NrKCZkc2kubG9jayk7CisKKwlyZXR1cm4gMDsKKworZXJyMjoKKwlkc2lfZGlzcGxheV91bmluaXRfZGlzcGMoZHNzZGV2KTsKK2VycjE6CisJZW5hYmxlX2Nsb2NrcygwKTsKKwlkc2lfZW5hYmxlX3BsbF9jbG9jaygwKTsKK2VycjA6CisJZHNpX2J1c191bmxvY2soKTsKKwltdXRleF91bmxvY2soJmRzaS5sb2NrKTsKKwlEU1NEQkcoImRzaV9kaXNwbGF5X3Jlc3VtZSBGQUlMRURcbiIpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGRzaV9kaXNwbGF5X3VwZGF0ZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCisJCQl1MTYgeCwgdTE2IHksIHUxNiB3LCB1MTYgaCkKK3sKKwlpbnQgciA9IDA7CisJdTE2IGR3LCBkaDsKKworCURTU0RCRygiZHNpX2Rpc3BsYXlfdXBkYXRlKCVkLCVkICVkeCVkKVxuIiwgeCwgeSwgdywgaCk7CisKKwltdXRleF9sb2NrKCZkc2kubG9jayk7CisKKwlpZiAoZHNpLnVwZGF0ZV9tb2RlICE9IE9NQVBfRFNTX1VQREFURV9NQU5VQUwpCisJCWdvdG8gZW5kOworCisJaWYgKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpCisJCWdvdG8gZW5kOworCisJZHNzZGV2LT5nZXRfcmVzb2x1dGlvbihkc3NkZXYsICZkdywgJmRoKTsKKworCWlmICAoeCA+IGR3IHx8IHkgPiBkaCkKKwkJZ290byBlbmQ7CisKKwlpZiAoeCArIHcgPiBkdykKKwkJdyA9IGR3IC0geDsKKworCWlmICh5ICsgaCA+IGRoKQorCQloID0gZGggLSB5OworCisJaWYgKHcgPT0gMCB8fCBoID09IDApCisJCWdvdG8gZW5kOworCisJaWYgKHcgPT0gMSkgeworCQlyID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJZHNpX3NldF91cGRhdGVfcmVnaW9uKGRzc2RldiwgeCwgeSwgdywgaCk7CisKKwl3YWtlX3VwKCZkc2kud2FpdHF1ZXVlKTsKKworZW5kOgorCW11dGV4X3VubG9jaygmZHNpLmxvY2spOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgZHNpX2Rpc3BsYXlfc3luYyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJYm9vbCB3YWl0OworCisJRFNTREJHKCJkc2lfZGlzcGxheV9zeW5jKClcbiIpOworCisJbXV0ZXhfbG9jaygmZHNpLmxvY2spOworCWRzaV9idXNfbG9jaygpOworCisJaWYgKGRzaS51cGRhdGVfbW9kZSA9PSBPTUFQX0RTU19VUERBVEVfTUFOVUFMICYmCisJCQlkc2kudXBkYXRlX3JlZ2lvbi5kaXJ0eSkgeworCQlJTklUX0NPTVBMRVRJT04oZHNpLnVwZGF0ZV9jb21wbGV0aW9uKTsKKwkJd2FpdCA9IHRydWU7CisJfSBlbHNlIHsKKwkJd2FpdCA9IGZhbHNlOworCX0KKworCWRzaV9idXNfdW5sb2NrKCk7CisJbXV0ZXhfdW5sb2NrKCZkc2kubG9jayk7CisKKwlpZiAod2FpdCkKKwkJd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZkc2kudXBkYXRlX2NvbXBsZXRpb24pOworCisJRFNTREJHKCJkc2lfZGlzcGxheV9zeW5jKCkgZG9uZVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNpX2Rpc3BsYXlfc2V0X3VwZGF0ZV9tb2RlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJZW51bSBvbWFwX2Rzc191cGRhdGVfbW9kZSBtb2RlKQoreworCWludCByID0gMDsKKworCURTU0RCR0YoIiVkIiwgbW9kZSk7CisKKwltdXRleF9sb2NrKCZkc2kubG9jayk7CisJZHNpX2J1c19sb2NrKCk7CisKKwlkc2kudXNlcl91cGRhdGVfbW9kZSA9IG1vZGU7CisJciA9IGRzaV9zZXRfdXBkYXRlX21vZGUoZHNzZGV2LCBtb2RlKTsKKworCWRzaV9idXNfdW5sb2NrKCk7CisJbXV0ZXhfdW5sb2NrKCZkc2kubG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUgZHNpX2Rpc3BsYXlfZ2V0X3VwZGF0ZV9tb2RlKAorCQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJcmV0dXJuIGRzaS51cGRhdGVfbW9kZTsKK30KKworCitzdGF0aWMgaW50IGRzaV9kaXNwbGF5X2VuYWJsZV90ZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGJvb2wgZW5hYmxlKQoreworCWludCByID0gMDsKKworCURTU0RCR0YoIiVkIiwgZW5hYmxlKTsKKworCWlmICghZHNzZGV2LT5kcml2ZXItPmVuYWJsZV90ZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlkc2lfYnVzX2xvY2soKTsKKworCWRzaS50ZV9lbmFibGVkID0gZW5hYmxlOworCisJaWYgKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpCisJCWdvdG8gZW5kOworCisJciA9IGRzaV9zZXRfdGUoZHNzZGV2LCBlbmFibGUpOworZW5kOgorCWRzaV9idXNfdW5sb2NrKCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBkc2lfZGlzcGxheV9nZXRfdGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXJldHVybiBkc2kudGVfZW5hYmxlZDsKK30KKworc3RhdGljIGludCBkc2lfZGlzcGxheV9zZXRfcm90YXRlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgdTggcm90YXRlKQoreworCisJRFNTREJHRigiJWQiLCByb3RhdGUpOworCisJaWYgKCFkc3NkZXYtPmRyaXZlci0+c2V0X3JvdGF0ZSB8fCAhZHNzZGV2LT5kcml2ZXItPmdldF9yb3RhdGUpCisJCXJldHVybiAtRUlOVkFMOworCisJZHNpX2J1c19sb2NrKCk7CisJZHNzZGV2LT5kcml2ZXItPnNldF9yb3RhdGUoZHNzZGV2LCByb3RhdGUpOworCWlmIChkc2kudXBkYXRlX21vZGUgPT0gT01BUF9EU1NfVVBEQVRFX0FVVE8pIHsKKwkJdTE2IHcsIGg7CisJCS8qIHRoZSBkaXNwbGF5IGRpbWVuc2lvbnMgbWF5IGhhdmUgY2hhbmdlZCwgc28gc2V0IGEgbmV3CisJCSAqIHVwZGF0ZSByZWdpb24gKi8KKwkJZHNzZGV2LT5nZXRfcmVzb2x1dGlvbihkc3NkZXYsICZ3LCAmaCk7CisJCWRzaV9zZXRfdXBkYXRlX3JlZ2lvbihkc3NkZXYsIDAsIDAsIHcsIGgpOworCX0KKwlkc2lfYnVzX3VubG9jaygpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCBkc2lfZGlzcGxheV9nZXRfcm90YXRlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlpZiAoIWRzc2Rldi0+ZHJpdmVyLT5zZXRfcm90YXRlIHx8ICFkc3NkZXYtPmRyaXZlci0+Z2V0X3JvdGF0ZSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZHNzZGV2LT5kcml2ZXItPmdldF9yb3RhdGUoZHNzZGV2KTsKK30KKworc3RhdGljIGludCBkc2lfZGlzcGxheV9zZXRfbWlycm9yKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgYm9vbCBtaXJyb3IpCit7CisJRFNTREJHRigiJWQiLCBtaXJyb3IpOworCisJaWYgKCFkc3NkZXYtPmRyaXZlci0+c2V0X21pcnJvciB8fCAhZHNzZGV2LT5kcml2ZXItPmdldF9taXJyb3IpCisJCXJldHVybiAtRUlOVkFMOworCisJZHNpX2J1c19sb2NrKCk7CisJZHNzZGV2LT5kcml2ZXItPnNldF9taXJyb3IoZHNzZGV2LCBtaXJyb3IpOworCWRzaV9idXNfdW5sb2NrKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgZHNpX2Rpc3BsYXlfZ2V0X21pcnJvcihzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJaWYgKCFkc3NkZXYtPmRyaXZlci0+c2V0X21pcnJvciB8fCAhZHNzZGV2LT5kcml2ZXItPmdldF9taXJyb3IpCisJCXJldHVybiAwOworCisJcmV0dXJuIGRzc2Rldi0+ZHJpdmVyLT5nZXRfbWlycm9yKGRzc2Rldik7Cit9CisKK3N0YXRpYyBpbnQgZHNpX2Rpc3BsYXlfcnVuX3Rlc3Qoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgdGVzdF9udW0pCit7CisJaW50IHI7CisKKwlpZiAoZHNzZGV2LT5zdGF0ZSAhPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkKKwkJcmV0dXJuIC1FSU87CisKKwlEU1NEQkdGKCIlZCIsIHRlc3RfbnVtKTsKKworCWRzaV9idXNfbG9jaygpOworCisJLyogcnVuIHRlc3QgZmlyc3QgaW4gbG93IHNwZWVkIG1vZGUgKi8KKwlkc2lfdmNfZW5hYmxlX2hzKDAsIDApOworCisJaWYgKGRzc2Rldi0+ZHJpdmVyLT5ydW5fdGVzdCkgeworCQlyID0gZHNzZGV2LT5kcml2ZXItPnJ1bl90ZXN0KGRzc2RldiwgdGVzdF9udW0pOworCQlpZiAocikKKwkJCWdvdG8gZW5kOworCX0KKworCS8qIHRoZW4gaW4gaGlnaCBzcGVlZCAqLworCWRzaV92Y19lbmFibGVfaHMoMCwgMSk7CisKKwlpZiAoZHNzZGV2LT5kcml2ZXItPnJ1bl90ZXN0KSB7CisJCXIgPSBkc3NkZXYtPmRyaXZlci0+cnVuX3Rlc3QoZHNzZGV2LCB0ZXN0X251bSk7CisJCWlmIChyKQorCQkJZ290byBlbmQ7CisJfQorCitlbmQ6CisJZHNpX3ZjX2VuYWJsZV9ocygwLCAxKTsKKworCWRzaV9idXNfdW5sb2NrKCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBkc2lfZGlzcGxheV9tZW1vcnlfcmVhZChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCisJCXZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUsCisJCXUxNiB4LCB1MTYgeSwgdTE2IHcsIHUxNiBoKQoreworCWludCByOworCisJRFNTREJHRigiIik7CisKKwlpZiAoIWRzc2Rldi0+ZHJpdmVyLT5tZW1vcnlfcmVhZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZHNzZGV2LT5zdGF0ZSAhPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkKKwkJcmV0dXJuIC1FSU87CisKKwlkc2lfYnVzX2xvY2soKTsKKworCXIgPSBkc3NkZXYtPmRyaXZlci0+bWVtb3J5X3JlYWQoZHNzZGV2LCBidWYsIHNpemUsCisJCQl4LCB5LCB3LCBoKTsKKworCS8qIE1lbW9yeSByZWFkIHVzdWFsbHkgY2hhbmdlcyB0aGUgdXBkYXRlIGFyZWEuIFRoaXMgd2lsbAorCSAqIGZvcmNlIHRoZSBuZXh0IHVwZGF0ZSB0byByZS1zZXQgdGhlIHVwZGF0ZSBhcmVhICovCisJZHNpLmFjdGl2ZV91cGRhdGVfcmVnaW9uLmRpcnR5ID0gdHJ1ZTsKKworCWRzaV9idXNfdW5sb2NrKCk7CisKKwlyZXR1cm4gcjsKK30KKwordm9pZCBkc2lfZ2V0X292ZXJsYXlfZmlmb190aHJlc2hvbGRzKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKKwkJdTMyIGZpZm9fc2l6ZSwgZW51bSBvbWFwX2J1cnN0X3NpemUgKmJ1cnN0X3NpemUsCisJCXUzMiAqZmlmb19sb3csIHUzMiAqZmlmb19oaWdoKQoreworCXVuc2lnbmVkIGJ1cnN0X3NpemVfYnl0ZXM7CisKKwkqYnVyc3Rfc2l6ZSA9IE9NQVBfRFNTX0JVUlNUXzE2eDMyOworCWJ1cnN0X3NpemVfYnl0ZXMgPSAxNiAqIDMyIC8gODsKKworCSpmaWZvX2hpZ2ggPSBmaWZvX3NpemUgLSBidXJzdF9zaXplX2J5dGVzOworCSpmaWZvX2xvdyA9IGZpZm9fc2l6ZSAtIGJ1cnN0X3NpemVfYnl0ZXMgKiA4OworfQorCitpbnQgZHNpX2luaXRfZGlzcGxheShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJRFNTREJHKCJEU0kgaW5pdFxuIik7CisKKwlkc3NkZXYtPmVuYWJsZSA9IGRzaV9kaXNwbGF5X2VuYWJsZTsKKwlkc3NkZXYtPmRpc2FibGUgPSBkc2lfZGlzcGxheV9kaXNhYmxlOworCWRzc2Rldi0+c3VzcGVuZCA9IGRzaV9kaXNwbGF5X3N1c3BlbmQ7CisJZHNzZGV2LT5yZXN1bWUgPSBkc2lfZGlzcGxheV9yZXN1bWU7CisJZHNzZGV2LT51cGRhdGUgPSBkc2lfZGlzcGxheV91cGRhdGU7CisJZHNzZGV2LT5zeW5jID0gZHNpX2Rpc3BsYXlfc3luYzsKKwlkc3NkZXYtPnNldF91cGRhdGVfbW9kZSA9IGRzaV9kaXNwbGF5X3NldF91cGRhdGVfbW9kZTsKKwlkc3NkZXYtPmdldF91cGRhdGVfbW9kZSA9IGRzaV9kaXNwbGF5X2dldF91cGRhdGVfbW9kZTsKKwlkc3NkZXYtPmVuYWJsZV90ZSA9IGRzaV9kaXNwbGF5X2VuYWJsZV90ZTsKKwlkc3NkZXYtPmdldF90ZSA9IGRzaV9kaXNwbGF5X2dldF90ZTsKKworCWRzc2Rldi0+Z2V0X3JvdGF0ZSA9IGRzaV9kaXNwbGF5X2dldF9yb3RhdGU7CisJZHNzZGV2LT5zZXRfcm90YXRlID0gZHNpX2Rpc3BsYXlfc2V0X3JvdGF0ZTsKKworCWRzc2Rldi0+Z2V0X21pcnJvciA9IGRzaV9kaXNwbGF5X2dldF9taXJyb3I7CisJZHNzZGV2LT5zZXRfbWlycm9yID0gZHNpX2Rpc3BsYXlfc2V0X21pcnJvcjsKKworCWRzc2Rldi0+cnVuX3Rlc3QgPSBkc2lfZGlzcGxheV9ydW5fdGVzdDsKKwlkc3NkZXYtPm1lbW9yeV9yZWFkID0gZHNpX2Rpc3BsYXlfbWVtb3J5X3JlYWQ7CisKKwkvKiBYWFggdGhlc2Ugc2hvdWxkIGJlIGZpZ3VyZWQgb3V0IGR5bmFtaWNhbGx5ICovCisJZHNzZGV2LT5jYXBzID0gT01BUF9EU1NfRElTUExBWV9DQVBfTUFOVUFMX1VQREFURSB8CisJCU9NQVBfRFNTX0RJU1BMQVlfQ0FQX1RFQVJfRUxJTTsKKworCWRzaS52Y1swXS5kc3NkZXYgPSBkc3NkZXY7CisJZHNpLnZjWzFdLmRzc2RldiA9IGRzc2RldjsKKworCXJldHVybiAwOworfQorCitpbnQgZHNpX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwl1MzIgcmV2OworCWludCByOworCXN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbSA9IHsKKwkJLnNjaGVkX3ByaW9yaXR5ID0gTUFYX1VTRVJfUlRfUFJJTy0xCisJfTsKKworCXNwaW5fbG9ja19pbml0KCZkc2kuZXJyb3JzX2xvY2spOworCWRzaS5lcnJvcnMgPSAwOworCisJaW5pdF9jb21wbGV0aW9uKCZkc2kuYnRhX2NvbXBsZXRpb24pOworCWluaXRfY29tcGxldGlvbigmZHNpLnVwZGF0ZV9jb21wbGV0aW9uKTsKKworCWRzaS50aHJlYWQgPSBrdGhyZWFkX2NyZWF0ZShkc2lfdXBkYXRlX3RocmVhZCwgTlVMTCwgImRzaSIpOworCWlmIChJU19FUlIoZHNpLnRocmVhZCkpIHsKKwkJRFNTRVJSKCJjYW5ub3QgY3JlYXRlIGt0aHJlYWRcbiIpOworCQlyID0gUFRSX0VSUihkc2kudGhyZWFkKTsKKwkJZ290byBlcnIwOworCX0KKwlzY2hlZF9zZXRzY2hlZHVsZXIoZHNpLnRocmVhZCwgU0NIRURfRklGTywgJnBhcmFtKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRzaS53YWl0cXVldWUpOworCXNwaW5fbG9ja19pbml0KCZkc2kudXBkYXRlX2xvY2spOworCisJbXV0ZXhfaW5pdCgmZHNpLmxvY2spOworCW11dGV4X2luaXQoJmRzaS5idXNfbG9jayk7CisKKyNpZmRlZiBEU0lfQ0FUQ0hfTUlTU0lOR19URQorCWluaXRfdGltZXIoJmRzaS50ZV90aW1lcik7CisJZHNpLnRlX3RpbWVyLmZ1bmN0aW9uID0gZHNpX3RlX3RpbWVvdXQ7CisJZHNpLnRlX3RpbWVyLmRhdGEgPSAwOworI2VuZGlmCisKKwlkc2kudXBkYXRlX21vZGUgPSBPTUFQX0RTU19VUERBVEVfRElTQUJMRUQ7CisJZHNpLnVzZXJfdXBkYXRlX21vZGUgPSBPTUFQX0RTU19VUERBVEVfRElTQUJMRUQ7CisKKwlkc2kuYmFzZSA9IGlvcmVtYXAoRFNJX0JBU0UsIERTSV9TWl9SRUdTKTsKKwlpZiAoIWRzaS5iYXNlKSB7CisJCURTU0VSUigiY2FuJ3QgaW9yZW1hcCBEU0lcbiIpOworCQlyID0gLUVOT01FTTsKKwkJZ290byBlcnIxOworCX0KKworCWRzaS52ZGRzX2RzaV9yZWcgPSByZWd1bGF0b3JfZ2V0KCZwZGV2LT5kZXYsICJ2ZGRzX2RzaSIpOworCWlmIChJU19FUlIoZHNpLnZkZHNfZHNpX3JlZykpIHsKKwkJaW91bm1hcChkc2kuYmFzZSk7CisJCURTU0VSUigiY2FuJ3QgZ2V0IFZERFNfRFNJIHJlZ3VsYXRvclxuIik7CisJCXIgPSBQVFJfRVJSKGRzaS52ZGRzX2RzaV9yZWcpOworCQlnb3RvIGVycjI7CisJfQorCisJZW5hYmxlX2Nsb2NrcygxKTsKKworCXJldiA9IGRzaV9yZWFkX3JlZyhEU0lfUkVWSVNJT04pOworCXByaW50ayhLRVJOX0lORk8gIk9NQVAgRFNJIHJldiAlZC4lZFxuIiwKKwkgICAgICAgRkxEX0dFVChyZXYsIDcsIDQpLCBGTERfR0VUKHJldiwgMywgMCkpOworCisJZW5hYmxlX2Nsb2NrcygwKTsKKworCXdha2VfdXBfcHJvY2Vzcyhkc2kudGhyZWFkKTsKKworCXJldHVybiAwOworZXJyMjoKKwlpb3VubWFwKGRzaS5iYXNlKTsKK2VycjE6CisJa3RocmVhZF9zdG9wKGRzaS50aHJlYWQpOworZXJyMDoKKwlyZXR1cm4gcjsKK30KKwordm9pZCBkc2lfZXhpdCh2b2lkKQoreworCWt0aHJlYWRfc3RvcChkc2kudGhyZWFkKTsKKworCXJlZ3VsYXRvcl9wdXQoZHNpLnZkZHNfZHNpX3JlZyk7CisKKwlpb3VubWFwKGRzaS5iYXNlKTsKKworCURTU0RCRygib21hcF9kc2lfZXhpdFxuIik7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwNWVlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5jCkBAIC0wLDAgKzEsNTk2IEBACisvKgorICogbGludXgvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogVG9taSBWYWxrZWluZW4gPHRvbWkudmFsa2VpbmVuQG5va2lhLmNvbT4KKyAqCisgKiBTb21lIGNvZGUgYW5kIGlkZWFzIHRha2VuIGZyb20gZHJpdmVycy92aWRlby9vbWFwLyBkcml2ZXIKKyAqIGJ5IEltcmUgRGVhay4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNkZWZpbmUgRFNTX1NVQlNZU19OQU1FICJEU1MiCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKworI2luY2x1ZGUgPHBsYXQvZGlzcGxheS5oPgorI2luY2x1ZGUgImRzcy5oIgorCisjZGVmaW5lIERTU19CQVNFCQkJMHg0ODA1MDAwMAorCisjZGVmaW5lIERTU19TWl9SRUdTCQkJU1pfNTEyCisKK3N0cnVjdCBkc3NfcmVnIHsKKwl1MTYgaWR4OworfTsKKworI2RlZmluZSBEU1NfUkVHKGlkeCkJCQkoKGNvbnN0IHN0cnVjdCBkc3NfcmVnKSB7IGlkeCB9KQorCisjZGVmaW5lIERTU19SRVZJU0lPTgkJCURTU19SRUcoMHgwMDAwKQorI2RlZmluZSBEU1NfU1lTQ09ORklHCQkJRFNTX1JFRygweDAwMTApCisjZGVmaW5lIERTU19TWVNTVEFUVVMJCQlEU1NfUkVHKDB4MDAxNCkKKyNkZWZpbmUgRFNTX0lSUVNUQVRVUwkJCURTU19SRUcoMHgwMDE4KQorI2RlZmluZSBEU1NfQ09OVFJPTAkJCURTU19SRUcoMHgwMDQwKQorI2RlZmluZSBEU1NfU0RJX0NPTlRST0wJCQlEU1NfUkVHKDB4MDA0NCkKKyNkZWZpbmUgRFNTX1BMTF9DT05UUk9MCQkJRFNTX1JFRygweDAwNDgpCisjZGVmaW5lIERTU19TRElfU1RBVFVTCQkJRFNTX1JFRygweDAwNUMpCisKKyNkZWZpbmUgUkVHX0dFVChpZHgsIHN0YXJ0LCBlbmQpIFwKKwlGTERfR0VUKGRzc19yZWFkX3JlZyhpZHgpLCBzdGFydCwgZW5kKQorCisjZGVmaW5lIFJFR19GTERfTU9EKGlkeCwgdmFsLCBzdGFydCwgZW5kKSBcCisJZHNzX3dyaXRlX3JlZyhpZHgsIEZMRF9NT0QoZHNzX3JlYWRfcmVnKGlkeCksIHZhbCwgc3RhcnQsIGVuZCkpCisKK3N0YXRpYyBzdHJ1Y3QgeworCXZvaWQgX19pb21lbSAgICAqYmFzZTsKKworCXN0cnVjdCBjbGsJKmRwbGw0X200X2NrOworCisJdW5zaWduZWQgbG9uZwljYWNoZV9yZXFfcGNrOworCXVuc2lnbmVkIGxvbmcJY2FjaGVfcHJhdGU7CisJc3RydWN0IGRzc19jbG9ja19pbmZvIGNhY2hlX2Rzc19jaW5mbzsKKwlzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyBjYWNoZV9kaXNwY19jaW5mbzsKKworCXUzMgkJY3R4W0RTU19TWl9SRUdTIC8gc2l6ZW9mKHUzMildOworfSBkc3M7CisKK3N0YXRpYyBpbnQgX29tYXBfZHNzX3dhaXRfcmVzZXQodm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkc3Nfd3JpdGVfcmVnKGNvbnN0IHN0cnVjdCBkc3NfcmVnIGlkeCwgdTMyIHZhbCkKK3sKKwlfX3Jhd193cml0ZWwodmFsLCBkc3MuYmFzZSArIGlkeC5pZHgpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBkc3NfcmVhZF9yZWcoY29uc3Qgc3RydWN0IGRzc19yZWcgaWR4KQoreworCXJldHVybiBfX3Jhd19yZWFkbChkc3MuYmFzZSArIGlkeC5pZHgpOworfQorCisjZGVmaW5lIFNSKHJlZykgXAorCWRzcy5jdHhbKERTU18jI3JlZykuaWR4IC8gc2l6ZW9mKHUzMildID0gZHNzX3JlYWRfcmVnKERTU18jI3JlZykKKyNkZWZpbmUgUlIocmVnKSBcCisJZHNzX3dyaXRlX3JlZyhEU1NfIyNyZWcsIGRzcy5jdHhbKERTU18jI3JlZykuaWR4IC8gc2l6ZW9mKHUzMildKQorCit2b2lkIGRzc19zYXZlX2NvbnRleHQodm9pZCkKK3sKKwlpZiAoY3B1X2lzX29tYXAyNHh4KCkpCisJCXJldHVybjsKKworCVNSKFNZU0NPTkZJRyk7CisJU1IoQ09OVFJPTCk7CisKKyNpZmRlZiBDT05GSUdfT01BUDJfRFNTX1NESQorCVNSKFNESV9DT05UUk9MKTsKKwlTUihQTExfQ09OVFJPTCk7CisjZW5kaWYKK30KKwordm9pZCBkc3NfcmVzdG9yZV9jb250ZXh0KHZvaWQpCit7CisJaWYgKF9vbWFwX2Rzc193YWl0X3Jlc2V0KCkpCisJCURTU0VSUigiRFNTIG5vdCBjb21pbmcgb3V0IG9mIHJlc2V0IGFmdGVyIHNsZWVwXG4iKTsKKworCVJSKFNZU0NPTkZJRyk7CisJUlIoQ09OVFJPTCk7CisKKyNpZmRlZiBDT05GSUdfT01BUDJfRFNTX1NESQorCVJSKFNESV9DT05UUk9MKTsKKwlSUihQTExfQ09OVFJPTCk7CisjZW5kaWYKK30KKworI3VuZGVmIFNSCisjdW5kZWYgUlIKKwordm9pZCBkc3Nfc2RpX2luaXQodTggZGF0YXBhaXJzKQoreworCXUzMiBsOworCisJQlVHX09OKGRhdGFwYWlycyA+IDMgfHwgZGF0YXBhaXJzIDwgMSk7CisKKwlsID0gZHNzX3JlYWRfcmVnKERTU19TRElfQ09OVFJPTCk7CisJbCA9IEZMRF9NT0QobCwgMHhmLCAxOSwgMTUpOwkJLyogU0RJX1BESVYgKi8KKwlsID0gRkxEX01PRChsLCBkYXRhcGFpcnMtMSwgMywgMik7CS8qIFNESV9QUlNFTCAqLworCWwgPSBGTERfTU9EKGwsIDIsIDEsIDApOwkJLyogU0RJX0JXU0VMICovCisJZHNzX3dyaXRlX3JlZyhEU1NfU0RJX0NPTlRST0wsIGwpOworCisJbCA9IGRzc19yZWFkX3JlZyhEU1NfUExMX0NPTlRST0wpOworCWwgPSBGTERfTU9EKGwsIDB4NywgMjUsIDIyKTsJLyogU0RJX1BMTF9GUkVRU0VMICovCisJbCA9IEZMRF9NT0QobCwgMHhiLCAxNiwgMTEpOwkvKiBTRElfUExMX1JFR04gKi8KKwlsID0gRkxEX01PRChsLCAweGI0LCAxMCwgMSk7CS8qIFNESV9QTExfUkVHTSAqLworCWRzc193cml0ZV9yZWcoRFNTX1BMTF9DT05UUk9MLCBsKTsKK30KKworaW50IGRzc19zZGlfZW5hYmxlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJZGlzcGNfcGNrX2ZyZWVfZW5hYmxlKDEpOworCisJLyogUmVzZXQgU0RJIFBMTCAqLworCVJFR19GTERfTU9EKERTU19QTExfQ09OVFJPTCwgMSwgMTgsIDE4KTsgLyogU0RJX1BMTF9TWVNSRVNFVCAqLworCXVkZWxheSgxKTsJLyogd2FpdCAyeCBQQ0xLICovCisKKwkvKiBMb2NrIFNESSBQTEwgKi8KKwlSRUdfRkxEX01PRChEU1NfUExMX0NPTlRST0wsIDEsIDI4LCAyOCk7IC8qIFNESV9QTExfR09CSVQgKi8KKworCS8qIFdhaXRpbmcgZm9yIFBMTCBsb2NrIHJlcXVlc3QgdG8gY29tcGxldGUgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTAwKTsKKwl3aGlsZSAoZHNzX3JlYWRfcmVnKERTU19TRElfU1RBVFVTKSAmICgxIDw8IDYpKSB7CisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlEU1NFUlIoIlBMTCBsb2NrIHJlcXVlc3QgdGltZWQgb3V0XG4iKTsKKwkJCWdvdG8gZXJyMTsKKwkJfQorCX0KKworCS8qIENsZWFyaW5nIFBMTF9HTyBiaXQgKi8KKwlSRUdfRkxEX01PRChEU1NfUExMX0NPTlRST0wsIDAsIDI4LCAyOCk7CisKKwkvKiBXYWl0aW5nIGZvciBQTEwgdG8gbG9jayAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDApOworCXdoaWxlICghKGRzc19yZWFkX3JlZyhEU1NfU0RJX1NUQVRVUykgJiAoMSA8PCA1KSkpIHsKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZW91dCkpIHsKKwkJCURTU0VSUigiUExMIGxvY2sgdGltZWQgb3V0XG4iKTsKKwkJCWdvdG8gZXJyMTsKKwkJfQorCX0KKworCWRpc3BjX2xjZF9lbmFibGVfc2lnbmFsKDEpOworCisJLyogV2FpdGluZyBmb3IgU0RJIHJlc2V0IHRvIGNvbXBsZXRlICovCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwMCk7CisJd2hpbGUgKCEoZHNzX3JlYWRfcmVnKERTU19TRElfU1RBVFVTKSAmICgxIDw8IDIpKSkgeworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJRFNTRVJSKCJTREkgcmVzZXQgdGltZWQgb3V0XG4iKTsKKwkJCWdvdG8gZXJyMjsKKwkJfQorCX0KKworCXJldHVybiAwOworCisgZXJyMjoKKwlkaXNwY19sY2RfZW5hYmxlX3NpZ25hbCgwKTsKKyBlcnIxOgorCS8qIFJlc2V0IFNESSBQTEwgKi8KKwlSRUdfRkxEX01PRChEU1NfUExMX0NPTlRST0wsIDAsIDE4LCAxOCk7IC8qIFNESV9QTExfU1lTUkVTRVQgKi8KKworCWRpc3BjX3Bja19mcmVlX2VuYWJsZSgwKTsKKworCXJldHVybiAtRVRJTUVET1VUOworfQorCit2b2lkIGRzc19zZGlfZGlzYWJsZSh2b2lkKQoreworCWRpc3BjX2xjZF9lbmFibGVfc2lnbmFsKDApOworCisJZGlzcGNfcGNrX2ZyZWVfZW5hYmxlKDApOworCisJLyogUmVzZXQgU0RJIFBMTCAqLworCVJFR19GTERfTU9EKERTU19QTExfQ09OVFJPTCwgMCwgMTgsIDE4KTsgLyogU0RJX1BMTF9TWVNSRVNFVCAqLworfQorCit2b2lkIGRzc19kdW1wX2Nsb2NrcyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBkcGxsNF9ja19yYXRlOworCXVuc2lnbmVkIGxvbmcgZHBsbDRfbTRfY2tfcmF0ZTsKKworCWRzc19jbGtfZW5hYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0sxKTsKKworCWRwbGw0X2NrX3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrX2dldF9wYXJlbnQoZHNzLmRwbGw0X200X2NrKSk7CisJZHBsbDRfbTRfY2tfcmF0ZSA9IGNsa19nZXRfcmF0ZShkc3MuZHBsbDRfbTRfY2spOworCisJc2VxX3ByaW50ZihzLCAiLSBEU1MgLVxuIik7CisKKwlzZXFfcHJpbnRmKHMsICJkcGxsNF9jayAlbHVcbiIsIGRwbGw0X2NrX3JhdGUpOworCisJc2VxX3ByaW50ZihzLCAiZHNzMV9hbHdvbl9mY2xrID0gJWx1IC8gJWx1ICogMiA9ICVsdVxuIiwKKwkJCWRwbGw0X2NrX3JhdGUsCisJCQlkcGxsNF9ja19yYXRlIC8gZHBsbDRfbTRfY2tfcmF0ZSwKKwkJCWRzc19jbGtfZ2V0X3JhdGUoRFNTX0NMS19GQ0sxKSk7CisKKwlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSzEpOworfQorCit2b2lkIGRzc19kdW1wX3JlZ3Moc3RydWN0IHNlcV9maWxlICpzKQoreworI2RlZmluZSBEVU1QUkVHKHIpIHNlcV9wcmludGYocywgIiUtMzVzICUwOHhcbiIsICNyLCBkc3NfcmVhZF9yZWcocikpCisKKwlkc3NfY2xrX2VuYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLMSk7CisKKwlEVU1QUkVHKERTU19SRVZJU0lPTik7CisJRFVNUFJFRyhEU1NfU1lTQ09ORklHKTsKKwlEVU1QUkVHKERTU19TWVNTVEFUVVMpOworCURVTVBSRUcoRFNTX0lSUVNUQVRVUyk7CisJRFVNUFJFRyhEU1NfQ09OVFJPTCk7CisJRFVNUFJFRyhEU1NfU0RJX0NPTlRST0wpOworCURVTVBSRUcoRFNTX1BMTF9DT05UUk9MKTsKKwlEVU1QUkVHKERTU19TRElfU1RBVFVTKTsKKworCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLMSk7CisjdW5kZWYgRFVNUFJFRworfQorCit2b2lkIGRzc19zZWxlY3RfY2xrX3NvdXJjZShib29sIGRzaSwgYm9vbCBkaXNwYykKK3sKKwl1MzIgcjsKKwlyID0gZHNzX3JlYWRfcmVnKERTU19DT05UUk9MKTsKKwlyID0gRkxEX01PRChyLCBkc2ksIDEsIDEpOwkvKiBEU0lfQ0xLX1NXSVRDSCAqLworCXIgPSBGTERfTU9EKHIsIGRpc3BjLCAwLCAwKTsJLyogRElTUENfQ0xLX1NXSVRDSCAqLworCWRzc193cml0ZV9yZWcoRFNTX0NPTlRST0wsIHIpOworfQorCitpbnQgZHNzX2dldF9kc2lfY2xrX3NvdXJjZSh2b2lkKQoreworCXJldHVybiBGTERfR0VUKGRzc19yZWFkX3JlZyhEU1NfQ09OVFJPTCksIDEsIDEpOworfQorCitpbnQgZHNzX2dldF9kaXNwY19jbGtfc291cmNlKHZvaWQpCit7CisJcmV0dXJuIEZMRF9HRVQoZHNzX3JlYWRfcmVnKERTU19DT05UUk9MKSwgMCwgMCk7Cit9CisKKy8qIGNhbGN1bGF0ZSBjbG9jayByYXRlcyB1c2luZyBkaXZpZGVycyBpbiBjaW5mbyAqLworaW50IGRzc19jYWxjX2Nsb2NrX3JhdGVzKHN0cnVjdCBkc3NfY2xvY2tfaW5mbyAqY2luZm8pCit7CisJdW5zaWduZWQgbG9uZyBwcmF0ZTsKKworCWlmIChjaW5mby0+ZmNrX2RpdiA+IDE2IHx8IGNpbmZvLT5mY2tfZGl2ID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcHJhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrX2dldF9wYXJlbnQoZHNzLmRwbGw0X200X2NrKSk7CisKKwljaW5mby0+ZmNrID0gcHJhdGUgLyBjaW5mby0+ZmNrX2RpdjsKKworCXJldHVybiAwOworfQorCitpbnQgZHNzX3NldF9jbG9ja19kaXYoc3RydWN0IGRzc19jbG9ja19pbmZvICpjaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIHByYXRlOworCWludCByOworCisJaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7CisJCXByYXRlID0gY2xrX2dldF9yYXRlKGNsa19nZXRfcGFyZW50KGRzcy5kcGxsNF9tNF9jaykpOworCQlEU1NEQkcoImRwbGw0X200ID0gJWxkXG4iLCBwcmF0ZSk7CisKKwkJciA9IGNsa19zZXRfcmF0ZShkc3MuZHBsbDRfbTRfY2ssIHByYXRlIC8gY2luZm8tPmZja19kaXYpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKworCURTU0RCRygiZmNrID0gJWxkICglZClcbiIsIGNpbmZvLT5mY2ssIGNpbmZvLT5mY2tfZGl2KTsKKworCXJldHVybiAwOworfQorCitpbnQgZHNzX2dldF9jbG9ja19kaXYoc3RydWN0IGRzc19jbG9ja19pbmZvICpjaW5mbykKK3sKKwljaW5mby0+ZmNrID0gZHNzX2Nsa19nZXRfcmF0ZShEU1NfQ0xLX0ZDSzEpOworCisJaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7CisJCXVuc2lnbmVkIGxvbmcgcHJhdGU7CisJCXByYXRlID0gY2xrX2dldF9yYXRlKGNsa19nZXRfcGFyZW50KGRzcy5kcGxsNF9tNF9jaykpOworCQljaW5mby0+ZmNrX2RpdiA9IHByYXRlIC8gKGNpbmZvLT5mY2sgLyAyKTsKKwl9IGVsc2UgeworCQljaW5mby0+ZmNrX2RpdiA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZHNzX2dldF9kcGxsNF9yYXRlKHZvaWQpCit7CisJaWYgKGNwdV9pc19vbWFwMzR4eCgpKQorCQlyZXR1cm4gY2xrX2dldF9yYXRlKGNsa19nZXRfcGFyZW50KGRzcy5kcGxsNF9tNF9jaykpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK2ludCBkc3NfY2FsY19jbG9ja19kaXYoYm9vbCBpc190ZnQsIHVuc2lnbmVkIGxvbmcgcmVxX3BjaywKKwkJc3RydWN0IGRzc19jbG9ja19pbmZvICpkc3NfY2luZm8sCisJCXN0cnVjdCBkaXNwY19jbG9ja19pbmZvICpkaXNwY19jaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIHByYXRlOworCXN0cnVjdCBkc3NfY2xvY2tfaW5mbyBiZXN0X2RzczsKKwlzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyBiZXN0X2Rpc3BjOworCisJdW5zaWduZWQgbG9uZyBmY2s7CisKKwl1MTYgZmNrX2RpdjsKKworCWludCBtYXRjaCA9IDA7CisJaW50IG1pbl9mY2tfcGVyX3BjazsKKworCXByYXRlID0gZHNzX2dldF9kcGxsNF9yYXRlKCk7CisKKwlmY2sgPSBkc3NfY2xrX2dldF9yYXRlKERTU19DTEtfRkNLMSk7CisJaWYgKHJlcV9wY2sgPT0gZHNzLmNhY2hlX3JlcV9wY2sgJiYKKwkJCSgoY3B1X2lzX29tYXAzNHh4KCkgJiYgcHJhdGUgPT0gZHNzLmNhY2hlX3ByYXRlKSB8fAorCQkJIGRzcy5jYWNoZV9kc3NfY2luZm8uZmNrID09IGZjaykpIHsKKwkJRFNTREJHKCJkaXNwYyBjbG9jayBpbmZvIGZvdW5kIGZyb20gY2FjaGUuXG4iKTsKKwkJKmRzc19jaW5mbyA9IGRzcy5jYWNoZV9kc3NfY2luZm87CisJCSpkaXNwY19jaW5mbyA9IGRzcy5jYWNoZV9kaXNwY19jaW5mbzsKKwkJcmV0dXJuIDA7CisJfQorCisJbWluX2Zja19wZXJfcGNrID0gQ09ORklHX09NQVAyX0RTU19NSU5fRkNLX1BFUl9QQ0s7CisKKwlpZiAobWluX2Zja19wZXJfcGNrICYmCisJCXJlcV9wY2sgKiBtaW5fZmNrX3Blcl9wY2sgPiBESVNQQ19NQVhfRkNLKSB7CisJCURTU0VSUigiUmVxdWVzdGVkIHBpeGVsIGNsb2NrIG5vdCBwb3NzaWJsZSB3aXRoIHRoZSBjdXJyZW50ICIKKwkJCQkiT01BUDJfRFNTX01JTl9GQ0tfUEVSX1BDSyBzZXR0aW5nLiBUdXJuaW5nICIKKwkJCQkidGhlIGNvbnN0cmFpbnQgb2ZmLlxuIik7CisJCW1pbl9mY2tfcGVyX3BjayA9IDA7CisJfQorCityZXRyeToKKwltZW1zZXQoJmJlc3RfZHNzLCAwLCBzaXplb2YoYmVzdF9kc3MpKTsKKwltZW1zZXQoJmJlc3RfZGlzcGMsIDAsIHNpemVvZihiZXN0X2Rpc3BjKSk7CisKKwlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKKwkJc3RydWN0IGRpc3BjX2Nsb2NrX2luZm8gY3VyX2Rpc3BjOworCQkvKiBYWFggY2FuIHdlIGNoYW5nZSB0aGUgY2xvY2sgb24gb21hcDI/ICovCisJCWZjayA9IGRzc19jbGtfZ2V0X3JhdGUoRFNTX0NMS19GQ0sxKTsKKwkJZmNrX2RpdiA9IDE7CisKKwkJZGlzcGNfZmluZF9jbGtfZGl2cyhpc190ZnQsIHJlcV9wY2ssIGZjaywgJmN1cl9kaXNwYyk7CisJCW1hdGNoID0gMTsKKworCQliZXN0X2Rzcy5mY2sgPSBmY2s7CisJCWJlc3RfZHNzLmZja19kaXYgPSBmY2tfZGl2OworCisJCWJlc3RfZGlzcGMgPSBjdXJfZGlzcGM7CisKKwkJZ290byBmb3VuZDsKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7CisJCWZvciAoZmNrX2RpdiA9IDE2OyBmY2tfZGl2ID4gMDsgLS1mY2tfZGl2KSB7CisJCQlzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyBjdXJfZGlzcGM7CisKKwkJCWZjayA9IHByYXRlIC8gZmNrX2RpdiAqIDI7CisKKwkJCWlmIChmY2sgPiBESVNQQ19NQVhfRkNLKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAobWluX2Zja19wZXJfcGNrICYmCisJCQkJCWZjayA8IHJlcV9wY2sgKiBtaW5fZmNrX3Blcl9wY2spCisJCQkJY29udGludWU7CisKKwkJCW1hdGNoID0gMTsKKworCQkJZGlzcGNfZmluZF9jbGtfZGl2cyhpc190ZnQsIHJlcV9wY2ssIGZjaywgJmN1cl9kaXNwYyk7CisKKwkJCWlmIChhYnMoY3VyX2Rpc3BjLnBjayAtIHJlcV9wY2spIDwKKwkJCQkJYWJzKGJlc3RfZGlzcGMucGNrIC0gcmVxX3BjaykpIHsKKworCQkJCWJlc3RfZHNzLmZjayA9IGZjazsKKwkJCQliZXN0X2Rzcy5mY2tfZGl2ID0gZmNrX2RpdjsKKworCQkJCWJlc3RfZGlzcGMgPSBjdXJfZGlzcGM7CisKKwkJCQlpZiAoY3VyX2Rpc3BjLnBjayA9PSByZXFfcGNrKQorCQkJCQlnb3RvIGZvdW5kOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJQlVHKCk7CisJfQorCitmb3VuZDoKKwlpZiAoIW1hdGNoKSB7CisJCWlmIChtaW5fZmNrX3Blcl9wY2spIHsKKwkJCURTU0VSUigiQ291bGQgbm90IGZpbmQgc3VpdGFibGUgY2xvY2sgc2V0dGluZ3MuXG4iCisJCQkJCSJUdXJuaW5nIEZDSy9QQ0sgY29uc3RyYWludCBvZmYgYW5kIgorCQkJCQkidHJ5aW5nIGFnYWluLlxuIik7CisJCQltaW5fZmNrX3Blcl9wY2sgPSAwOworCQkJZ290byByZXRyeTsKKwkJfQorCisJCURTU0VSUigiQ291bGQgbm90IGZpbmQgc3VpdGFibGUgY2xvY2sgc2V0dGluZ3MuXG4iKTsKKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZHNzX2NpbmZvKQorCQkqZHNzX2NpbmZvID0gYmVzdF9kc3M7CisJaWYgKGRpc3BjX2NpbmZvKQorCQkqZGlzcGNfY2luZm8gPSBiZXN0X2Rpc3BjOworCisJZHNzLmNhY2hlX3JlcV9wY2sgPSByZXFfcGNrOworCWRzcy5jYWNoZV9wcmF0ZSA9IHByYXRlOworCWRzcy5jYWNoZV9kc3NfY2luZm8gPSBiZXN0X2RzczsKKwlkc3MuY2FjaGVfZGlzcGNfY2luZm8gPSBiZXN0X2Rpc3BjOworCisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaXJxcmV0dXJuX3QgZHNzX2lycV9oYW5kbGVyX29tYXAyKGludCBpcnEsIHZvaWQgKmFyZykKK3sKKwlkaXNwY19pcnFfaGFuZGxlcigpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZHNzX2lycV9oYW5kbGVyX29tYXAzKGludCBpcnEsIHZvaWQgKmFyZykKK3sKKwl1MzIgaXJxc3RhdHVzOworCisJaXJxc3RhdHVzID0gZHNzX3JlYWRfcmVnKERTU19JUlFTVEFUVVMpOworCisJaWYgKGlycXN0YXR1cyAmICgxPDwwKSkJLyogRElTUENfSVJRICovCisJCWRpc3BjX2lycV9oYW5kbGVyKCk7CisjaWZkZWYgQ09ORklHX09NQVAyX0RTU19EU0kKKwlpZiAoaXJxc3RhdHVzICYgKDE8PDEpKQkvKiBEU0lfSVJRICovCisJCWRzaV9pcnFfaGFuZGxlcigpOworI2VuZGlmCisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgX29tYXBfZHNzX3dhaXRfcmVzZXQodm9pZCkKK3sKKwl1bnNpZ25lZCB0aW1lb3V0ID0gMTAwMDsKKworCXdoaWxlIChSRUdfR0VUKERTU19TWVNTVEFUVVMsIDAsIDApID09IDApIHsKKwkJdWRlbGF5KDEpOworCQlpZiAoIS0tdGltZW91dCkgeworCQkJRFNTRVJSKCJzb2Z0IHJlc2V0IGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9vbWFwX2Rzc19yZXNldCh2b2lkKQoreworCS8qIFNvZnQgcmVzZXQgKi8KKwlSRUdfRkxEX01PRChEU1NfU1lTQ09ORklHLCAxLCAxLCAxKTsKKwlyZXR1cm4gX29tYXBfZHNzX3dhaXRfcmVzZXQoKTsKK30KKwordm9pZCBkc3Nfc2V0X3ZlbmNfb3V0cHV0KGVudW0gb21hcF9kc3NfdmVuY190eXBlIHR5cGUpCit7CisJaW50IGwgPSAwOworCisJaWYgKHR5cGUgPT0gT01BUF9EU1NfVkVOQ19UWVBFX0NPTVBPU0lURSkKKwkJbCA9IDA7CisJZWxzZSBpZiAodHlwZSA9PSBPTUFQX0RTU19WRU5DX1RZUEVfU1ZJREVPKQorCQlsID0gMTsKKwllbHNlCisJCUJVRygpOworCisJLyogdmVuYyBvdXQgc2VsZWN0aW9uLiAwID0gY29tcCwgMSA9IHN2aWRlbyAqLworCVJFR19GTERfTU9EKERTU19DT05UUk9MLCBsLCA2LCA2KTsKK30KKwordm9pZCBkc3Nfc2V0X2RhY19wd3Jkbl9iZ3ooYm9vbCBlbmFibGUpCit7CisJUkVHX0ZMRF9NT0QoRFNTX0NPTlRST0wsIGVuYWJsZSwgNSwgNSk7CS8qIERBQyBQb3dlci1Eb3duIENvbnRyb2wgKi8KK30KKworaW50IGRzc19pbml0KGJvb2wgc2tpcF9pbml0KQoreworCWludCByOworCXUzMiByZXY7CisKKwlkc3MuYmFzZSA9IGlvcmVtYXAoRFNTX0JBU0UsIERTU19TWl9SRUdTKTsKKwlpZiAoIWRzcy5iYXNlKSB7CisJCURTU0VSUigiY2FuJ3QgaW9yZW1hcCBEU1NcbiIpOworCQlyID0gLUVOT01FTTsKKwkJZ290byBmYWlsMDsKKwl9CisKKwlpZiAoIXNraXBfaW5pdCkgeworCQkvKiBkaXNhYmxlIExDRCBhbmQgRElHSVQgb3V0cHV0LiBUaGlzIHNlZW1zIHRvIGZpeCB0aGUgc3luY2xvc3QKKwkJICogcHJvYmxlbSB0aGF0IHdlIGdldCwgaWYgdGhlIGJvb3Rsb2FkZXIgc3RhcnRzIHRoZSBEU1MgYW5kCisJCSAqIHRoZSBrZXJuZWwgcmVzZXRzIGl0ICovCisJCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoMHg0ODA1MDQ0MCkgJiB+MHgzLCAweDQ4MDUwNDQwKTsKKworCQkvKiBXZSBuZWVkIHRvIHdhaXQgaGVyZSBhIGJpdCwgb3RoZXJ3aXNlIHdlIHNvbWV0aW1lcyBzdGFydCB0bworCQkgKiBnZXQgc3luY2xvc3QgZXJyb3JzLCBhbmQgYWZ0ZXIgdGhhdCBvbmx5IHBvd2VyIGN5Y2xlIHdpbGwKKwkJICogcmVzdG9yZSBEU1MgZnVuY3Rpb25hbGl0eS4gSSBoYXZlIG5vIGlkZWEgd2h5IHRoaXMgaGFwcGVucy4KKwkJICogQW5kIHdlIGhhdmUgdG8gd2FpdCBfYmVmb3JlXyByZXNldHRpbmcgdGhlIERTUywgYnV0IGFmdGVyCisJCSAqIGVuYWJsaW5nIGNsb2Nrcy4KKwkJICovCisJCW1zbGVlcCg1MCk7CisKKwkJX29tYXBfZHNzX3Jlc2V0KCk7CisJfQorCisJLyogYXV0b2lkbGUgKi8KKwlSRUdfRkxEX01PRChEU1NfU1lTQ09ORklHLCAxLCAwLCAwKTsKKworCS8qIFNlbGVjdCBEUExMICovCisJUkVHX0ZMRF9NT0QoRFNTX0NPTlRST0wsIDAsIDAsIDApOworCisjaWZkZWYgQ09ORklHX09NQVAyX0RTU19WRU5DCisJUkVHX0ZMRF9NT0QoRFNTX0NPTlRST0wsIDEsIDQsIDQpOwkvKiB2ZW5jIGRhYyBkZW1lbiAqLworCVJFR19GTERfTU9EKERTU19DT05UUk9MLCAxLCAzLCAzKTsJLyogdmVuYyBjbG9jayA0eCBlbmFibGUgKi8KKwlSRUdfRkxEX01PRChEU1NfQ09OVFJPTCwgMCwgMiwgMik7CS8qIHZlbmMgY2xvY2sgbW9kZSA9IG5vcm1hbCAqLworI2VuZGlmCisKKwlyID0gcmVxdWVzdF9pcnEoSU5UXzI0WFhfRFNTX0lSUSwKKwkJCWNwdV9pc19vbWFwMjR4eCgpCisJCQk/IGRzc19pcnFfaGFuZGxlcl9vbWFwMgorCQkJOiBkc3NfaXJxX2hhbmRsZXJfb21hcDMsCisJCQkwLCAiT01BUCBEU1MiLCBOVUxMKTsKKworCWlmIChyIDwgMCkgeworCQlEU1NFUlIoIm9tYXAyIGRzczogcmVxdWVzdF9pcnEgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsMTsKKwl9CisKKwlpZiAoY3B1X2lzX29tYXAzNHh4KCkpIHsKKwkJZHNzLmRwbGw0X200X2NrID0gY2xrX2dldChOVUxMLCAiZHBsbDRfbTRfY2siKTsKKwkJaWYgKElTX0VSUihkc3MuZHBsbDRfbTRfY2spKSB7CisJCQlEU1NFUlIoIkZhaWxlZCB0byBnZXQgZHBsbDRfbTRfY2tcbiIpOworCQkJciA9IFBUUl9FUlIoZHNzLmRwbGw0X200X2NrKTsKKwkJCWdvdG8gZmFpbDI7CisJCX0KKwl9CisKKwlkc3Nfc2F2ZV9jb250ZXh0KCk7CisKKwlyZXYgPSBkc3NfcmVhZF9yZWcoRFNTX1JFVklTSU9OKTsKKwlwcmludGsoS0VSTl9JTkZPICJPTUFQIERTUyByZXYgJWQuJWRcbiIsCisJCQlGTERfR0VUKHJldiwgNywgNCksIEZMRF9HRVQocmV2LCAzLCAwKSk7CisKKwlyZXR1cm4gMDsKKworZmFpbDI6CisJZnJlZV9pcnEoSU5UXzI0WFhfRFNTX0lSUSwgTlVMTCk7CitmYWlsMToKKwlpb3VubWFwKGRzcy5iYXNlKTsKK2ZhaWwwOgorCXJldHVybiByOworfQorCit2b2lkIGRzc19leGl0KHZvaWQpCit7CisJaWYgKGNwdV9pc19vbWFwMzR4eCgpKQorCQljbGtfcHV0KGRzcy5kcGxsNF9tNF9jayk7CisKKwlmcmVlX2lycShJTlRfMjRYWF9EU1NfSVJRLCBOVUxMKTsKKworCWlvdW5tYXAoZHNzLmJhc2UpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc3MuaCBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYTVhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc3MuaApAQCAtMCwwICsxLDM3MCBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IFRvbWkgVmFsa2VpbmVuIDx0b21pLnZhbGtlaW5lbkBub2tpYS5jb20+CisgKgorICogU29tZSBjb2RlIGFuZCBpZGVhcyB0YWtlbiBmcm9tIGRyaXZlcnMvdmlkZW8vb21hcC8gZHJpdmVyCisgKiBieSBJbXJlIERlYWsuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fT01BUDJfRFNTX0gKKyNkZWZpbmUgX19PTUFQMl9EU1NfSAorCisjaWZkZWYgQ09ORklHX09NQVAyX0RTU19ERUJVR19TVVBQT1JUCisjZGVmaW5lIERFQlVHCisjZW5kaWYKKworI2lmZGVmIERFQlVHCitleHRlcm4gdW5zaWduZWQgaW50IGRzc19kZWJ1ZzsKKyNpZmRlZiBEU1NfU1VCU1lTX05BTUUKKyNkZWZpbmUgRFNTREJHKGZvcm1hdCwgLi4uKSBcCisJaWYgKGRzc19kZWJ1ZykgXAorCQlwcmludGsoS0VSTl9ERUJVRyAib21hcGRzcyAiIERTU19TVUJTWVNfTkFNRSAiOiAiIGZvcm1hdCwgXAorCQkjIyBfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIERTU0RCRyhmb3JtYXQsIC4uLikgXAorCWlmIChkc3NfZGVidWcpIFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgIm9tYXBkc3M6ICIgZm9ybWF0LCAjIyBfX1ZBX0FSR1NfXykKKyNlbmRpZgorCisjaWZkZWYgRFNTX1NVQlNZU19OQU1FCisjZGVmaW5lIERTU0RCR0YoZm9ybWF0LCAuLi4pIFwKKwlpZiAoZHNzX2RlYnVnKSBcCisJCXByaW50ayhLRVJOX0RFQlVHICJvbWFwZHNzICIgRFNTX1NVQlNZU19OQU1FIFwKKwkJCQkiOiAlcygiIGZvcm1hdCAiKVxuIiwgXAorCQkJCV9fZnVuY19fLCBcCisJCQkJIyMgX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBEU1NEQkdGKGZvcm1hdCwgLi4uKSBcCisJaWYgKGRzc19kZWJ1ZykgXAorCQlwcmludGsoS0VSTl9ERUJVRyAib21hcGRzczogIiBcCisJCQkJIjogJXMoIiBmb3JtYXQgIilcbiIsIFwKKwkJCQlfX2Z1bmNfXywgXAorCQkJCSMjIF9fVkFfQVJHU19fKQorI2VuZGlmCisKKyNlbHNlIC8qIERFQlVHICovCisjZGVmaW5lIERTU0RCRyhmb3JtYXQsIC4uLikKKyNkZWZpbmUgRFNTREJHRihmb3JtYXQsIC4uLikKKyNlbmRpZgorCisKKyNpZmRlZiBEU1NfU1VCU1lTX05BTUUKKyNkZWZpbmUgRFNTRVJSKGZvcm1hdCwgLi4uKSBcCisJcHJpbnRrKEtFUk5fRVJSICJvbWFwZHNzICIgRFNTX1NVQlNZU19OQU1FICIgZXJyb3I6ICIgZm9ybWF0LCBcCisJIyMgX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBEU1NFUlIoZm9ybWF0LCAuLi4pIFwKKwlwcmludGsoS0VSTl9FUlIgIm9tYXBkc3MgZXJyb3I6ICIgZm9ybWF0LCAjIyBfX1ZBX0FSR1NfXykKKyNlbmRpZgorCisjaWZkZWYgRFNTX1NVQlNZU19OQU1FCisjZGVmaW5lIERTU0lORk8oZm9ybWF0LCAuLi4pIFwKKwlwcmludGsoS0VSTl9JTkZPICJvbWFwZHNzICIgRFNTX1NVQlNZU19OQU1FICI6ICIgZm9ybWF0LCBcCisJIyMgX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBEU1NJTkZPKGZvcm1hdCwgLi4uKSBcCisJcHJpbnRrKEtFUk5fSU5GTyAib21hcGRzczogIiBmb3JtYXQsICMjIF9fVkFfQVJHU19fKQorI2VuZGlmCisKKyNpZmRlZiBEU1NfU1VCU1lTX05BTUUKKyNkZWZpbmUgRFNTV0FSTihmb3JtYXQsIC4uLikgXAorCXByaW50ayhLRVJOX1dBUk5JTkcgIm9tYXBkc3MgIiBEU1NfU1VCU1lTX05BTUUgIjogIiBmb3JtYXQsIFwKKwkjIyBfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIERTU1dBUk4oZm9ybWF0LCAuLi4pIFwKKwlwcmludGsoS0VSTl9XQVJOSU5HICJvbWFwZHNzOiAiIGZvcm1hdCwgIyMgX19WQV9BUkdTX18pCisjZW5kaWYKKworLyogT01BUCBUUk0gZ2l2ZXMgYml0ZmllbGRzIGFzIHN0YXJ0OmVuZCwgd2hlcmUgc3RhcnQgaXMgdGhlIGhpZ2hlciBiaXQKKyAgIG51bWJlci4gRm9yIGV4YW1wbGUgNzowICovCisjZGVmaW5lIEZMRF9NQVNLKHN0YXJ0LCBlbmQpCSgoKDEgPDwgKChzdGFydCkgLSAoZW5kKSArIDEpKSAtIDEpIDw8IChlbmQpKQorI2RlZmluZSBGTERfVkFMKHZhbCwgc3RhcnQsIGVuZCkgKCgodmFsKSA8PCAoZW5kKSkgJiBGTERfTUFTSyhzdGFydCwgZW5kKSkKKyNkZWZpbmUgRkxEX0dFVCh2YWwsIHN0YXJ0LCBlbmQpICgoKHZhbCkgJiBGTERfTUFTSyhzdGFydCwgZW5kKSkgPj4gKGVuZCkpCisjZGVmaW5lIEZMRF9NT0Qob3JpZywgdmFsLCBzdGFydCwgZW5kKSBcCisJKCgob3JpZykgJiB+RkxEX01BU0soc3RhcnQsIGVuZCkpIHwgRkxEX1ZBTCh2YWwsIHN0YXJ0LCBlbmQpKQorCisjZGVmaW5lIERJU1BDX01BWF9GQ0sgMTczMDAwMDAwCisKK2VudW0gb21hcF9idXJzdF9zaXplIHsKKwlPTUFQX0RTU19CVVJTVF80eDMyID0gMCwKKwlPTUFQX0RTU19CVVJTVF84eDMyID0gMSwKKwlPTUFQX0RTU19CVVJTVF8xNngzMiA9IDIsCit9OworCitlbnVtIG9tYXBfcGFyYWxsZWxfaW50ZXJmYWNlX21vZGUgeworCU9NQVBfRFNTX1BBUkFMTEVMTU9ERV9CWVBBU1MsCQkvKiBNSVBJIERQSSAqLworCU9NQVBfRFNTX1BBUkFMTEVMTU9ERV9SRkJJLAkJLyogTUlQSSBEQkkgKi8KKwlPTUFQX0RTU19QQVJBTExFTE1PREVfRFNJLAorfTsKKworZW51bSBkc3NfY2xvY2sgeworCURTU19DTEtfSUNLCT0gMSA8PCAwLAorCURTU19DTEtfRkNLMQk9IDEgPDwgMSwKKwlEU1NfQ0xLX0ZDSzIJPSAxIDw8IDIsCisJRFNTX0NMS181NE0JPSAxIDw8IDMsCisJRFNTX0NMS185Nk0JPSAxIDw8IDQsCit9OworCitzdHJ1Y3QgZHNzX2Nsb2NrX2luZm8geworCS8qIHJhdGVzIHRoYXQgd2UgZ2V0IHdpdGggZGl2aWRlcnMgYmVsb3cgKi8KKwl1bnNpZ25lZCBsb25nIGZjazsKKworCS8qIGRpdmlkZXJzICovCisJdTE2IGZja19kaXY7Cit9OworCitzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyB7CisJLyogcmF0ZXMgdGhhdCB3ZSBnZXQgd2l0aCBkaXZpZGVycyBiZWxvdyAqLworCXVuc2lnbmVkIGxvbmcgbGNrOworCXVuc2lnbmVkIGxvbmcgcGNrOworCisJLyogZGl2aWRlcnMgKi8KKwl1MTYgbGNrX2RpdjsKKwl1MTYgcGNrX2RpdjsKK307CisKK3N0cnVjdCBkc2lfY2xvY2tfaW5mbyB7CisJLyogcmF0ZXMgdGhhdCB3ZSBnZXQgd2l0aCBkaXZpZGVycyBiZWxvdyAqLworCXVuc2lnbmVkIGxvbmcgZmludDsKKwl1bnNpZ25lZCBsb25nIGNsa2luNGRkcjsKKwl1bnNpZ25lZCBsb25nIGNsa2luOworCXVuc2lnbmVkIGxvbmcgZHNpMV9wbGxfZmNsazsKKwl1bnNpZ25lZCBsb25nIGRzaTJfcGxsX2ZjbGs7CisKKwl1bnNpZ25lZCBsb25nIGxwX2NsazsKKworCS8qIGRpdmlkZXJzICovCisJdTE2IHJlZ247CisJdTE2IHJlZ207CisJdTE2IHJlZ20zOworCXUxNiByZWdtNDsKKworCXUxNiBscF9jbGtfZGl2OworCisJdTggaGlnaGZyZXE7CisJYm9vbCB1c2VfZHNzMl9mY2s7Cit9OworCitzdHJ1Y3Qgc2VxX2ZpbGU7CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOworCisvKiBjb3JlICovCit2b2lkIGRzc19jbGtfZW5hYmxlKGVudW0gZHNzX2Nsb2NrIGNsa3MpOwordm9pZCBkc3NfY2xrX2Rpc2FibGUoZW51bSBkc3NfY2xvY2sgY2xrcyk7Cit1bnNpZ25lZCBsb25nIGRzc19jbGtfZ2V0X3JhdGUoZW51bSBkc3NfY2xvY2sgY2xrKTsKK2ludCBkc3NfbmVlZF9jdHhfcmVzdG9yZSh2b2lkKTsKK3ZvaWQgZHNzX2R1bXBfY2xvY2tzKHN0cnVjdCBzZXFfZmlsZSAqcyk7CitzdHJ1Y3QgYnVzX3R5cGUgKmRzc19nZXRfYnVzKHZvaWQpOworCisvKiBkaXNwbGF5ICovCitpbnQgZHNzX3N1c3BlbmRfYWxsX2RldmljZXModm9pZCk7CitpbnQgZHNzX3Jlc3VtZV9hbGxfZGV2aWNlcyh2b2lkKTsKK3ZvaWQgZHNzX2Rpc2FibGVfYWxsX2RldmljZXModm9pZCk7CisKK3ZvaWQgZHNzX2luaXRfZGV2aWNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7Cit2b2lkIGRzc191bmluaXRfZGV2aWNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7Citib29sIGRzc191c2VfcmVwbGljYXRpb24oc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQllbnVtIG9tYXBfY29sb3JfbW9kZSBtb2RlKTsKK3ZvaWQgZGVmYXVsdF9nZXRfb3ZlcmxheV9maWZvX3RocmVzaG9sZHMoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAorCQl1MzIgZmlmb19zaXplLCBlbnVtIG9tYXBfYnVyc3Rfc2l6ZSAqYnVyc3Rfc2l6ZSwKKwkJdTMyICpmaWZvX2xvdywgdTMyICpmaWZvX2hpZ2gpOworCisvKiBtYW5hZ2VyICovCitpbnQgZHNzX2luaXRfb3ZlcmxheV9tYW5hZ2VycyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKK3ZvaWQgZHNzX3VuaW5pdF9vdmVybGF5X21hbmFnZXJzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworaW50IGRzc19tZ3Jfd2FpdF9mb3JfZ29fb3ZsKHN0cnVjdCBvbWFwX292ZXJsYXkgKm92bCk7Cit2b2lkIGRzc19zZXR1cF9wYXJ0aWFsX3BsYW5lcyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCisJCQkJdTE2ICp4LCB1MTYgKnksIHUxNiAqdywgdTE2ICpoKTsKK3ZvaWQgZHNzX3N0YXJ0X3VwZGF0ZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpOworCisvKiBvdmVybGF5ICovCit2b2lkIGRzc19pbml0X292ZXJsYXlzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwordm9pZCBkc3NfdW5pbml0X292ZXJsYXlzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworaW50IGRzc19jaGVja19vdmVybGF5KHN0cnVjdCBvbWFwX292ZXJsYXkgKm92bCwgc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KTsKK3ZvaWQgZHNzX292ZXJsYXlfc2V0dXBfZGlzcGNfbWFuYWdlcihzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncik7CisjaWZkZWYgTDRfRVhBTVBMRQordm9pZCBkc3Nfb3ZlcmxheV9zZXR1cF9sNF9tYW5hZ2VyKHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyKTsKKyNlbmRpZgordm9pZCBkc3NfcmVjaGVja19jb25uZWN0aW9ucyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGJvb2wgZm9yY2UpOworCisvKiBEU1MgKi8KK2ludCBkc3NfaW5pdChib29sIHNraXBfaW5pdCk7Cit2b2lkIGRzc19leGl0KHZvaWQpOworCit2b2lkIGRzc19zYXZlX2NvbnRleHQodm9pZCk7Cit2b2lkIGRzc19yZXN0b3JlX2NvbnRleHQodm9pZCk7CisKK3ZvaWQgZHNzX2R1bXBfcmVncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpOworCit2b2lkIGRzc19zZGlfaW5pdCh1OCBkYXRhcGFpcnMpOworaW50IGRzc19zZGlfZW5hYmxlKHZvaWQpOwordm9pZCBkc3Nfc2RpX2Rpc2FibGUodm9pZCk7CisKK3ZvaWQgZHNzX3NlbGVjdF9jbGtfc291cmNlKGJvb2wgZHNpLCBib29sIGRpc3BjKTsKK2ludCBkc3NfZ2V0X2RzaV9jbGtfc291cmNlKHZvaWQpOworaW50IGRzc19nZXRfZGlzcGNfY2xrX3NvdXJjZSh2b2lkKTsKK3ZvaWQgZHNzX3NldF92ZW5jX291dHB1dChlbnVtIG9tYXBfZHNzX3ZlbmNfdHlwZSB0eXBlKTsKK3ZvaWQgZHNzX3NldF9kYWNfcHdyZG5fYmd6KGJvb2wgZW5hYmxlKTsKKwordW5zaWduZWQgbG9uZyBkc3NfZ2V0X2RwbGw0X3JhdGUodm9pZCk7CitpbnQgZHNzX2NhbGNfY2xvY2tfcmF0ZXMoc3RydWN0IGRzc19jbG9ja19pbmZvICpjaW5mbyk7CitpbnQgZHNzX3NldF9jbG9ja19kaXYoc3RydWN0IGRzc19jbG9ja19pbmZvICpjaW5mbyk7CitpbnQgZHNzX2dldF9jbG9ja19kaXYoc3RydWN0IGRzc19jbG9ja19pbmZvICpjaW5mbyk7CitpbnQgZHNzX2NhbGNfY2xvY2tfZGl2KGJvb2wgaXNfdGZ0LCB1bnNpZ25lZCBsb25nIHJlcV9wY2ssCisJCXN0cnVjdCBkc3NfY2xvY2tfaW5mbyAqZHNzX2NpbmZvLAorCQlzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyAqZGlzcGNfY2luZm8pOworCisvKiBTREkgKi8KK2ludCBzZGlfaW5pdChib29sIHNraXBfaW5pdCk7Cit2b2lkIHNkaV9leGl0KHZvaWQpOworaW50IHNkaV9pbml0X2Rpc3BsYXkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheSk7CisKKy8qIERTSSAqLworaW50IGRzaV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwordm9pZCBkc2lfZXhpdCh2b2lkKTsKKwordm9pZCBkc2lfZHVtcF9jbG9ja3Moc3RydWN0IHNlcV9maWxlICpzKTsKK3ZvaWQgZHNpX2R1bXBfcmVncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpOworCit2b2lkIGRzaV9zYXZlX2NvbnRleHQodm9pZCk7Cit2b2lkIGRzaV9yZXN0b3JlX2NvbnRleHQodm9pZCk7CisKK2ludCBkc2lfaW5pdF9kaXNwbGF5KHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRpc3BsYXkpOwordm9pZCBkc2lfaXJxX2hhbmRsZXIodm9pZCk7Cit1bnNpZ25lZCBsb25nIGRzaV9nZXRfZHNpMV9wbGxfcmF0ZSh2b2lkKTsKK2ludCBkc2lfcGxsX3NldF9jbG9ja19kaXYoc3RydWN0IGRzaV9jbG9ja19pbmZvICpjaW5mbyk7CitpbnQgZHNpX3BsbF9jYWxjX2Nsb2NrX2Rpdl9wY2soYm9vbCBpc190ZnQsIHVuc2lnbmVkIGxvbmcgcmVxX3BjaywKKwkJc3RydWN0IGRzaV9jbG9ja19pbmZvICpjaW5mbywKKwkJc3RydWN0IGRpc3BjX2Nsb2NrX2luZm8gKmRpc3BjX2NpbmZvKTsKK2ludCBkc2lfcGxsX2luaXQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBib29sIGVuYWJsZV9oc2NsaywKKwkJYm9vbCBlbmFibGVfaHNkaXYpOwordm9pZCBkc2lfcGxsX3VuaW5pdCh2b2lkKTsKK3ZvaWQgZHNpX2dldF9vdmVybGF5X2ZpZm9fdGhyZXNob2xkcyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCisJCXUzMiBmaWZvX3NpemUsIGVudW0gb21hcF9idXJzdF9zaXplICpidXJzdF9zaXplLAorCQl1MzIgKmZpZm9fbG93LCB1MzIgKmZpZm9faGlnaCk7CisKKy8qIERQSSAqLworaW50IGRwaV9pbml0KHZvaWQpOwordm9pZCBkcGlfZXhpdCh2b2lkKTsKK2ludCBkcGlfaW5pdF9kaXNwbGF5KHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CisKKy8qIERJU1BDICovCitpbnQgZGlzcGNfaW5pdCh2b2lkKTsKK3ZvaWQgZGlzcGNfZXhpdCh2b2lkKTsKK3ZvaWQgZGlzcGNfZHVtcF9jbG9ja3Moc3RydWN0IHNlcV9maWxlICpzKTsKK3ZvaWQgZGlzcGNfZHVtcF9yZWdzKHN0cnVjdCBzZXFfZmlsZSAqcyk7Cit2b2lkIGRpc3BjX2lycV9oYW5kbGVyKHZvaWQpOwordm9pZCBkaXNwY19mYWtlX3ZzeW5jX2lycSh2b2lkKTsKKwordm9pZCBkaXNwY19zYXZlX2NvbnRleHQodm9pZCk7Cit2b2lkIGRpc3BjX3Jlc3RvcmVfY29udGV4dCh2b2lkKTsKKwordm9pZCBkaXNwY19lbmFibGVfc2lkbGUodm9pZCk7Cit2b2lkIGRpc3BjX2Rpc2FibGVfc2lkbGUodm9pZCk7CisKK3ZvaWQgZGlzcGNfbGNkX2VuYWJsZV9zaWduYWxfcG9sYXJpdHkoYm9vbCBhY3RfaGlnaCk7Cit2b2lkIGRpc3BjX2xjZF9lbmFibGVfc2lnbmFsKGJvb2wgZW5hYmxlKTsKK3ZvaWQgZGlzcGNfcGNrX2ZyZWVfZW5hYmxlKGJvb2wgZW5hYmxlKTsKK3ZvaWQgZGlzcGNfZW5hYmxlX2ZpZm9oYW5kY2hlY2soYm9vbCBlbmFibGUpOworCit2b2lkIGRpc3BjX3NldF9sY2Rfc2l6ZSh1MTYgd2lkdGgsIHUxNiBoZWlnaHQpOwordm9pZCBkaXNwY19zZXRfZGlnaXRfc2l6ZSh1MTYgd2lkdGgsIHUxNiBoZWlnaHQpOwordTMyIGRpc3BjX2dldF9wbGFuZV9maWZvX3NpemUoZW51bSBvbWFwX3BsYW5lIHBsYW5lKTsKK3ZvaWQgZGlzcGNfc2V0dXBfcGxhbmVfZmlmbyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHUzMiBsb3csIHUzMiBoaWdoKTsKK3ZvaWQgZGlzcGNfZW5hYmxlX2ZpZm9tZXJnZShib29sIGVuYWJsZSk7Cit2b2lkIGRpc3BjX3NldF9idXJzdF9zaXplKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKKwkJZW51bSBvbWFwX2J1cnN0X3NpemUgYnVyc3Rfc2l6ZSk7CisKK3ZvaWQgZGlzcGNfc2V0X3BsYW5lX2JhMChlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHUzMiBwYWRkcik7Cit2b2lkIGRpc3BjX3NldF9wbGFuZV9iYTEoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1MzIgcGFkZHIpOwordm9pZCBkaXNwY19zZXRfcGxhbmVfcG9zKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgdTE2IHgsIHUxNiB5KTsKK3ZvaWQgZGlzcGNfc2V0X3BsYW5lX3NpemUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1MTYgd2lkdGgsIHUxNiBoZWlnaHQpOwordm9pZCBkaXNwY19zZXRfY2hhbm5lbF9vdXQoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAorCQllbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsX291dCk7CisKK2ludCBkaXNwY19zZXR1cF9wbGFuZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCisJCSAgICAgIHUzMiBwYWRkciwgdTE2IHNjcmVlbl93aWR0aCwKKwkJICAgICAgdTE2IHBvc194LCB1MTYgcG9zX3ksCisJCSAgICAgIHUxNiB3aWR0aCwgdTE2IGhlaWdodCwKKwkJICAgICAgdTE2IG91dF93aWR0aCwgdTE2IG91dF9oZWlnaHQsCisJCSAgICAgIGVudW0gb21hcF9jb2xvcl9tb2RlIGNvbG9yX21vZGUsCisJCSAgICAgIGJvb2wgaWxhY2UsCisJCSAgICAgIGVudW0gb21hcF9kc3Nfcm90YXRpb25fdHlwZSByb3RhdGlvbl90eXBlLAorCQkgICAgICB1OCByb3RhdGlvbiwgYm9vbCBtaXJyb3IsCisJCSAgICAgIHU4IGdsb2JhbF9hbHBoYSk7CisKK2Jvb2wgZGlzcGNfZ29fYnVzeShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKTsKK3ZvaWQgZGlzcGNfZ28oZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCk7Cit2b2lkIGRpc3BjX2VuYWJsZV9sY2Rfb3V0KGJvb2wgZW5hYmxlKTsKK3ZvaWQgZGlzcGNfZW5hYmxlX2RpZ2l0X291dChib29sIGVuYWJsZSk7CitpbnQgZGlzcGNfZW5hYmxlX3BsYW5lKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgYm9vbCBlbmFibGUpOwordm9pZCBkaXNwY19lbmFibGVfcmVwbGljYXRpb24oZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBib29sIGVuYWJsZSk7CisKK3ZvaWQgZGlzcGNfc2V0X3BhcmFsbGVsX2ludGVyZmFjZV9tb2RlKGVudW0gb21hcF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZSBtb2RlKTsKK3ZvaWQgZGlzcGNfc2V0X3RmdF9kYXRhX2xpbmVzKHU4IGRhdGFfbGluZXMpOwordm9pZCBkaXNwY19zZXRfbGNkX2Rpc3BsYXlfdHlwZShlbnVtIG9tYXBfbGNkX2Rpc3BsYXlfdHlwZSB0eXBlKTsKK3ZvaWQgZGlzcGNfc2V0X2xvYWRtb2RlKGVudW0gb21hcF9kc3NfbG9hZF9tb2RlIG1vZGUpOworCit2b2lkIGRpc3BjX3NldF9kZWZhdWx0X2NvbG9yKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIHUzMiBjb2xvcik7Cit1MzIgZGlzcGNfZ2V0X2RlZmF1bHRfY29sb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCk7Cit2b2lkIGRpc3BjX3NldF90cmFuc19rZXkoZW51bSBvbWFwX2NoYW5uZWwgY2gsCisJCWVudW0gb21hcF9kc3NfdHJhbnNfa2V5X3R5cGUgdHlwZSwKKwkJdTMyIHRyYW5zX2tleSk7Cit2b2lkIGRpc3BjX2dldF90cmFuc19rZXkoZW51bSBvbWFwX2NoYW5uZWwgY2gsCisJCWVudW0gb21hcF9kc3NfdHJhbnNfa2V5X3R5cGUgKnR5cGUsCisJCXUzMiAqdHJhbnNfa2V5KTsKK3ZvaWQgZGlzcGNfZW5hYmxlX3RyYW5zX2tleShlbnVtIG9tYXBfY2hhbm5lbCBjaCwgYm9vbCBlbmFibGUpOwordm9pZCBkaXNwY19lbmFibGVfYWxwaGFfYmxlbmRpbmcoZW51bSBvbWFwX2NoYW5uZWwgY2gsIGJvb2wgZW5hYmxlKTsKK2Jvb2wgZGlzcGNfdHJhbnNfa2V5X2VuYWJsZWQoZW51bSBvbWFwX2NoYW5uZWwgY2gpOworYm9vbCBkaXNwY19hbHBoYV9ibGVuZGluZ19lbmFibGVkKGVudW0gb21hcF9jaGFubmVsIGNoKTsKKworYm9vbCBkaXNwY19sY2RfdGltaW5nc19vayhzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKTsKK3ZvaWQgZGlzcGNfc2V0X2xjZF90aW1pbmdzKHN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpOwordW5zaWduZWQgbG9uZyBkaXNwY19mY2xrX3JhdGUodm9pZCk7Cit1bnNpZ25lZCBsb25nIGRpc3BjX2xjbGtfcmF0ZSh2b2lkKTsKK3Vuc2lnbmVkIGxvbmcgZGlzcGNfcGNsa19yYXRlKHZvaWQpOwordm9pZCBkaXNwY19zZXRfcG9sX2ZyZXEoZW51bSBvbWFwX3BhbmVsX2NvbmZpZyBjb25maWcsIHU4IGFjYmksIHU4IGFjYik7Cit2b2lkIGRpc3BjX2ZpbmRfY2xrX2RpdnMoYm9vbCBpc190ZnQsIHVuc2lnbmVkIGxvbmcgcmVxX3BjaywgdW5zaWduZWQgbG9uZyBmY2ssCisJCXN0cnVjdCBkaXNwY19jbG9ja19pbmZvICpjaW5mbyk7CitpbnQgZGlzcGNfY2FsY19jbG9ja19yYXRlcyh1bnNpZ25lZCBsb25nIGRpc3BjX2ZjbGtfcmF0ZSwKKwkJc3RydWN0IGRpc3BjX2Nsb2NrX2luZm8gKmNpbmZvKTsKK2ludCBkaXNwY19zZXRfY2xvY2tfZGl2KHN0cnVjdCBkaXNwY19jbG9ja19pbmZvICpjaW5mbyk7CitpbnQgZGlzcGNfZ2V0X2Nsb2NrX2RpdihzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyAqY2luZm8pOworCisKKy8qIFZFTkMgKi8KK2ludCB2ZW5jX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7Cit2b2lkIHZlbmNfZXhpdCh2b2lkKTsKK3ZvaWQgdmVuY19kdW1wX3JlZ3Moc3RydWN0IHNlcV9maWxlICpzKTsKK2ludCB2ZW5jX2luaXRfZGlzcGxheShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5KTsKKworLyogUkZCSSAqLworaW50IHJmYmlfaW5pdCh2b2lkKTsKK3ZvaWQgcmZiaV9leGl0KHZvaWQpOwordm9pZCByZmJpX2R1bXBfcmVncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpOworCitpbnQgcmZiaV9jb25maWd1cmUoaW50IHJmYmlfbW9kdWxlLCBpbnQgYnBwLCBpbnQgbGluZXMpOwordm9pZCByZmJpX2VuYWJsZV9yZmJpKGJvb2wgZW5hYmxlKTsKK3ZvaWQgcmZiaV90cmFuc2Zlcl9hcmVhKHUxNiB3aWR0aCwgdTE2IGhlaWdodCwKKwkJCSAgICAgdm9pZCAoY2FsbGJhY2spKHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKTsKK3ZvaWQgcmZiaV9zZXRfdGltaW5ncyhpbnQgcmZiaV9tb2R1bGUsIHN0cnVjdCByZmJpX3RpbWluZ3MgKnQpOwordW5zaWduZWQgbG9uZyByZmJpX2dldF9tYXhfdHhfcmF0ZSh2b2lkKTsKK2ludCByZmJpX2luaXRfZGlzcGxheShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9tYW5hZ2VyLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9tYW5hZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdkOWM0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL21hbmFnZXIuYwpAQCAtMCwwICsxLDE0ODcgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9tYW5hZ2VyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogVG9taSBWYWxrZWluZW4gPHRvbWkudmFsa2VpbmVuQG5va2lhLmNvbT4KKyAqCisgKiBTb21lIGNvZGUgYW5kIGlkZWFzIHRha2VuIGZyb20gZHJpdmVycy92aWRlby9vbWFwLyBkcml2ZXIKKyAqIGJ5IEltcmUgRGVhay4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNkZWZpbmUgRFNTX1NVQlNZU19OQU1FICJNQU5BR0VSIgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisKKyNpbmNsdWRlIDxwbGF0L2Rpc3BsYXkuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorCisjaW5jbHVkZSAiZHNzLmgiCisKK3N0YXRpYyBpbnQgbnVtX21hbmFnZXJzOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgbWFuYWdlcl9saXN0OworCitzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX25hbWVfc2hvdyhzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1nciwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBtZ3ItPm5hbWUpOworfQorCitzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX2Rpc3BsYXlfc2hvdyhzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1nciwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLAorCQkJbWdyLT5kZXZpY2UgPyBtZ3ItPmRldmljZS0+bmFtZSA6ICI8bm9uZT4iKTsKK30KKworc3RhdGljIHNzaXplX3QgbWFuYWdlcl9kaXNwbGF5X3N0b3JlKHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCWludCByID0gMDsKKwlzaXplX3QgbGVuID0gc2l6ZTsKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSBOVUxMOworCisJaW50IG1hdGNoKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldiwgdm9pZCAqZGF0YSkKKwl7CisJCWNvbnN0IGNoYXIgKnN0ciA9IGRhdGE7CisJCXJldHVybiBzeXNmc19zdHJlcShkc3NkZXYtPm5hbWUsIHN0cik7CisJfQorCisJaWYgKGJ1ZltzaXplLTFdID09ICdcbicpCisJCS0tbGVuOworCisJaWYgKGxlbiA+IDApCisJCWRzc2RldiA9IG9tYXBfZHNzX2ZpbmRfZGV2aWNlKCh2b2lkICopYnVmLCBtYXRjaCk7CisKKwlpZiAobGVuID4gMCAmJiBkc3NkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZHNzZGV2KQorCQlEU1NEQkcoImRpc3BsYXkgJXMgZm91bmRcbiIsIGRzc2Rldi0+bmFtZSk7CisKKwlpZiAobWdyLT5kZXZpY2UpIHsKKwkJciA9IG1nci0+dW5zZXRfZGV2aWNlKG1ncik7CisJCWlmIChyKSB7CisJCQlEU1NFUlIoImZhaWxlZCB0byB1bnNldCBkaXNwbGF5XG4iKTsKKwkJCWdvdG8gcHV0X2RldmljZTsKKwkJfQorCX0KKworCWlmIChkc3NkZXYpIHsKKwkJciA9IG1nci0+c2V0X2RldmljZShtZ3IsIGRzc2Rldik7CisJCWlmIChyKSB7CisJCQlEU1NFUlIoImZhaWxlZCB0byBzZXQgbWFuYWdlclxuIik7CisJCQlnb3RvIHB1dF9kZXZpY2U7CisJCX0KKworCQlyID0gbWdyLT5hcHBseShtZ3IpOworCQlpZiAocikgeworCQkJRFNTRVJSKCJmYWlsZWQgdG8gYXBwbHkgZGlzcGMgY29uZmlnXG4iKTsKKwkJCWdvdG8gcHV0X2RldmljZTsKKwkJfQorCX0KKworcHV0X2RldmljZToKKwlpZiAoZHNzZGV2KQorCQlvbWFwX2Rzc19wdXRfZGV2aWNlKGRzc2Rldik7CisKKwlyZXR1cm4gciA/IHIgOiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX2RlZmF1bHRfY29sb3Jfc2hvdyhzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1nciwKKwkJCQkJICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIG1nci0+aW5mby5kZWZhdWx0X2NvbG9yKTsKK30KKworc3RhdGljIHNzaXplX3QgbWFuYWdlcl9kZWZhdWx0X2NvbG9yX3N0b3JlKHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyLAorCQkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlcl9pbmZvIGluZm87CisJdTMyIGNvbG9yOworCWludCByOworCisJaWYgKHNzY2FuZihidWYsICIlZCIsICZjb2xvcikgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZ3ItPmdldF9tYW5hZ2VyX2luZm8obWdyLCAmaW5mbyk7CisKKwlpbmZvLmRlZmF1bHRfY29sb3IgPSBjb2xvcjsKKworCXIgPSBtZ3ItPnNldF9tYW5hZ2VyX2luZm8obWdyLCAmaW5mbyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IG1nci0+YXBwbHkobWdyKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnRyYW5zX2tleV90eXBlX3N0cltdID0geworCSJnZngtZGVzdGluYXRpb24iLAorCSJ2aWRlby1zb3VyY2UiLAorfTsKKworc3RhdGljIHNzaXplX3QgbWFuYWdlcl90cmFuc19rZXlfdHlwZV9zaG93KHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyLAorCQkJCQkgICBjaGFyICpidWYpCit7CisJZW51bSBvbWFwX2Rzc190cmFuc19rZXlfdHlwZSBrZXlfdHlwZTsKKworCWtleV90eXBlID0gbWdyLT5pbmZvLnRyYW5zX2tleV90eXBlOworCUJVR19PTihrZXlfdHlwZSA+PSBBUlJBWV9TSVpFKHRyYW5zX2tleV90eXBlX3N0cikpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIHRyYW5zX2tleV90eXBlX3N0cltrZXlfdHlwZV0pOworfQorCitzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX3RyYW5zX2tleV90eXBlX3N0b3JlKHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyLAorCQkJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwllbnVtIG9tYXBfZHNzX3RyYW5zX2tleV90eXBlIGtleV90eXBlOworCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlcl9pbmZvIGluZm87CisJaW50IHI7CisKKwlmb3IgKGtleV90eXBlID0gT01BUF9EU1NfQ09MT1JfS0VZX0dGWF9EU1Q7CisJCQlrZXlfdHlwZSA8IEFSUkFZX1NJWkUodHJhbnNfa2V5X3R5cGVfc3RyKTsga2V5X3R5cGUrKykgeworCQlpZiAoc3lzZnNfc3RyZXEoYnVmLCB0cmFuc19rZXlfdHlwZV9zdHJba2V5X3R5cGVdKSkKKwkJCWJyZWFrOworCX0KKworCWlmIChrZXlfdHlwZSA9PSBBUlJBWV9TSVpFKHRyYW5zX2tleV90eXBlX3N0cikpCisJCXJldHVybiAtRUlOVkFMOworCisJbWdyLT5nZXRfbWFuYWdlcl9pbmZvKG1nciwgJmluZm8pOworCisJaW5mby50cmFuc19rZXlfdHlwZSA9IGtleV90eXBlOworCisJciA9IG1nci0+c2V0X21hbmFnZXJfaW5mbyhtZ3IsICZpbmZvKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gbWdyLT5hcHBseShtZ3IpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX3RyYW5zX2tleV92YWx1ZV9zaG93KHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyLAorCQkJCQkgICAgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBtZ3ItPmluZm8udHJhbnNfa2V5KTsKK30KKworc3RhdGljIHNzaXplX3QgbWFuYWdlcl90cmFuc19rZXlfdmFsdWVfc3RvcmUoc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IsCisJCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXJfaW5mbyBpbmZvOworCXUzMiBrZXlfdmFsdWU7CisJaW50IHI7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJmtleV92YWx1ZSkgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZ3ItPmdldF9tYW5hZ2VyX2luZm8obWdyLCAmaW5mbyk7CisKKwlpbmZvLnRyYW5zX2tleSA9IGtleV92YWx1ZTsKKworCXIgPSBtZ3ItPnNldF9tYW5hZ2VyX2luZm8obWdyLCAmaW5mbyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IG1nci0+YXBwbHkobWdyKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3QgbWFuYWdlcl90cmFuc19rZXlfZW5hYmxlZF9zaG93KHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyLAorCQkJCQkgICAgICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIG1nci0+aW5mby50cmFuc19lbmFibGVkKTsKK30KKworc3RhdGljIHNzaXplX3QgbWFuYWdlcl90cmFuc19rZXlfZW5hYmxlZF9zdG9yZShzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1nciwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyX2luZm8gaW5mbzsKKwlpbnQgZW5hYmxlOworCWludCByOworCisJaWYgKHNzY2FuZihidWYsICIlZCIsICZlbmFibGUpICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJbWdyLT5nZXRfbWFuYWdlcl9pbmZvKG1nciwgJmluZm8pOworCisJaW5mby50cmFuc19lbmFibGVkID0gZW5hYmxlID8gdHJ1ZSA6IGZhbHNlOworCisJciA9IG1nci0+c2V0X21hbmFnZXJfaW5mbyhtZ3IsICZpbmZvKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gbWdyLT5hcHBseShtZ3IpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX2FscGhhX2JsZW5kaW5nX2VuYWJsZWRfc2hvdygKKwkJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgbWdyLT5pbmZvLmFscGhhX2VuYWJsZWQpOworfQorCitzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX2FscGhhX2JsZW5kaW5nX2VuYWJsZWRfc3RvcmUoCisJCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlcl9pbmZvIGluZm87CisJaW50IGVuYWJsZTsKKwlpbnQgcjsKKworCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmZW5hYmxlKSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1nci0+Z2V0X21hbmFnZXJfaW5mbyhtZ3IsICZpbmZvKTsKKworCWluZm8uYWxwaGFfZW5hYmxlZCA9IGVuYWJsZSA/IHRydWUgOiBmYWxzZTsKKworCXIgPSBtZ3ItPnNldF9tYW5hZ2VyX2luZm8obWdyLCAmaW5mbyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IG1nci0+YXBwbHkobWdyKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RydWN0IG1hbmFnZXJfYXR0cmlidXRlIHsKKwlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisJc3NpemVfdCAoKnNob3cpKHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqLCBjaGFyICopOworCXNzaXplX3QJKCpzdG9yZSkoc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK307CisKKyNkZWZpbmUgTUFOQUdFUl9BVFRSKF9uYW1lLCBfbW9kZSwgX3Nob3csIF9zdG9yZSkgXAorCXN0cnVjdCBtYW5hZ2VyX2F0dHJpYnV0ZSBtYW5hZ2VyX2F0dHJfIyNfbmFtZSA9IFwKKwlfX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKQorCitzdGF0aWMgTUFOQUdFUl9BVFRSKG5hbWUsIFNfSVJVR08sIG1hbmFnZXJfbmFtZV9zaG93LCBOVUxMKTsKK3N0YXRpYyBNQU5BR0VSX0FUVFIoZGlzcGxheSwgU19JUlVHT3xTX0lXVVNSLAorCQltYW5hZ2VyX2Rpc3BsYXlfc2hvdywgbWFuYWdlcl9kaXNwbGF5X3N0b3JlKTsKK3N0YXRpYyBNQU5BR0VSX0FUVFIoZGVmYXVsdF9jb2xvciwgU19JUlVHT3xTX0lXVVNSLAorCQltYW5hZ2VyX2RlZmF1bHRfY29sb3Jfc2hvdywgbWFuYWdlcl9kZWZhdWx0X2NvbG9yX3N0b3JlKTsKK3N0YXRpYyBNQU5BR0VSX0FUVFIodHJhbnNfa2V5X3R5cGUsIFNfSVJVR098U19JV1VTUiwKKwkJbWFuYWdlcl90cmFuc19rZXlfdHlwZV9zaG93LCBtYW5hZ2VyX3RyYW5zX2tleV90eXBlX3N0b3JlKTsKK3N0YXRpYyBNQU5BR0VSX0FUVFIodHJhbnNfa2V5X3ZhbHVlLCBTX0lSVUdPfFNfSVdVU1IsCisJCW1hbmFnZXJfdHJhbnNfa2V5X3ZhbHVlX3Nob3csIG1hbmFnZXJfdHJhbnNfa2V5X3ZhbHVlX3N0b3JlKTsKK3N0YXRpYyBNQU5BR0VSX0FUVFIodHJhbnNfa2V5X2VuYWJsZWQsIFNfSVJVR098U19JV1VTUiwKKwkJbWFuYWdlcl90cmFuc19rZXlfZW5hYmxlZF9zaG93LAorCQltYW5hZ2VyX3RyYW5zX2tleV9lbmFibGVkX3N0b3JlKTsKK3N0YXRpYyBNQU5BR0VSX0FUVFIoYWxwaGFfYmxlbmRpbmdfZW5hYmxlZCwgU19JUlVHT3xTX0lXVVNSLAorCQltYW5hZ2VyX2FscGhhX2JsZW5kaW5nX2VuYWJsZWRfc2hvdywKKwkJbWFuYWdlcl9hbHBoYV9ibGVuZGluZ19lbmFibGVkX3N0b3JlKTsKKworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbWFuYWdlcl9zeXNmc19hdHRyc1tdID0geworCSZtYW5hZ2VyX2F0dHJfbmFtZS5hdHRyLAorCSZtYW5hZ2VyX2F0dHJfZGlzcGxheS5hdHRyLAorCSZtYW5hZ2VyX2F0dHJfZGVmYXVsdF9jb2xvci5hdHRyLAorCSZtYW5hZ2VyX2F0dHJfdHJhbnNfa2V5X3R5cGUuYXR0ciwKKwkmbWFuYWdlcl9hdHRyX3RyYW5zX2tleV92YWx1ZS5hdHRyLAorCSZtYW5hZ2VyX2F0dHJfdHJhbnNfa2V5X2VuYWJsZWQuYXR0ciwKKwkmbWFuYWdlcl9hdHRyX2FscGhhX2JsZW5kaW5nX2VuYWJsZWQuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWFuYWdlcjsKKwlzdHJ1Y3QgbWFuYWdlcl9hdHRyaWJ1dGUgKm1hbmFnZXJfYXR0cjsKKworCW1hbmFnZXIgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyLCBrb2JqKTsKKwltYW5hZ2VyX2F0dHIgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IG1hbmFnZXJfYXR0cmlidXRlLCBhdHRyKTsKKworCWlmICghbWFuYWdlcl9hdHRyLT5zaG93KQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJldHVybiBtYW5hZ2VyX2F0dHItPnNob3cobWFuYWdlciwgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3QgbWFuYWdlcl9hdHRyX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWFuYWdlcjsKKwlzdHJ1Y3QgbWFuYWdlcl9hdHRyaWJ1dGUgKm1hbmFnZXJfYXR0cjsKKworCW1hbmFnZXIgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyLCBrb2JqKTsKKwltYW5hZ2VyX2F0dHIgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IG1hbmFnZXJfYXR0cmlidXRlLCBhdHRyKTsKKworCWlmICghbWFuYWdlcl9hdHRyLT5zdG9yZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlyZXR1cm4gbWFuYWdlcl9hdHRyLT5zdG9yZShtYW5hZ2VyLCBidWYsIHNpemUpOworfQorCitzdGF0aWMgc3RydWN0IHN5c2ZzX29wcyBtYW5hZ2VyX3N5c2ZzX29wcyA9IHsKKwkuc2hvdyA9IG1hbmFnZXJfYXR0cl9zaG93LAorCS5zdG9yZSA9IG1hbmFnZXJfYXR0cl9zdG9yZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIG1hbmFnZXJfa3R5cGUgPSB7CisJLnN5c2ZzX29wcyA9ICZtYW5hZ2VyX3N5c2ZzX29wcywKKwkuZGVmYXVsdF9hdHRycyA9IG1hbmFnZXJfc3lzZnNfYXR0cnMsCit9OworCisvKgorICogV2UgaGF2ZSA0IGxldmVscyBvZiBjYWNoZSBmb3IgdGhlIGRpc3BjIHNldHRpbmdzLiBGaXJzdCB0d28gYXJlIGluIFNXIGFuZAorICogdGhlIGxhdHRlciB0d28gaW4gSFcuCisgKgorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogfG92ZXJsYXkvbWFuYWdlcl9pbmZvfAorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgICAgICAgdgorICogICAgICAgIGFwcGx5KCkKKyAqICAgICAgICAgIHYKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgIGRzc19jYWNoZSAgICAgIHwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgICAgICAgIHYKKyAqICAgICAgY29uZmlndXJlKCkKKyAqICAgICAgICAgIHYKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgIHNoYWRvdyByZWdpc3RlcnMgIHwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgICAgICAgIHYKKyAqIFZGUCBvciBsY2QvZGlnaXRfZW5hYmxlCisgKiAgICAgICAgICB2CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgcmVnaXN0ZXJzICAgICB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKi8KKworc3RydWN0IG92ZXJsYXlfY2FjaGVfZGF0YSB7CisJLyogSWYgdHJ1ZSwgY2FjaGUgY2hhbmdlZCwgYnV0IG5vdCB3cml0dGVuIHRvIHNoYWRvdyByZWdpc3RlcnMuIFNldAorCSAqIGluIGFwcGx5KCksIGNsZWFyZWQgd2hlbiByZWdpc3RlcnMgd3JpdHRlbi4gKi8KKwlib29sIGRpcnR5OworCS8qIElmIHRydWUsIHNoYWRvdyByZWdpc3RlcnMgY29udGFpbiBjaGFuZ2VkIHZhbHVlcyBub3QgeWV0IGluIHJlYWwKKwkgKiByZWdpc3RlcnMuIFNldCB3aGVuIHdyaXRpbmcgdG8gc2hhZG93IHJlZ2lzdGVycywgY2xlYXJlZCBhdAorCSAqIFZTWU5DL0VWU1lOQyAqLworCWJvb2wgc2hhZG93X2RpcnR5OworCisJYm9vbCBlbmFibGVkOworCisJdTMyIHBhZGRyOworCXZvaWQgX19pb21lbSAqdmFkZHI7CisJdTE2IHNjcmVlbl93aWR0aDsKKwl1MTYgd2lkdGg7CisJdTE2IGhlaWdodDsKKwllbnVtIG9tYXBfY29sb3JfbW9kZSBjb2xvcl9tb2RlOworCXU4IHJvdGF0aW9uOworCWVudW0gb21hcF9kc3Nfcm90YXRpb25fdHlwZSByb3RhdGlvbl90eXBlOworCWJvb2wgbWlycm9yOworCisJdTE2IHBvc194OworCXUxNiBwb3NfeTsKKwl1MTYgb3V0X3dpZHRoOwkvKiBpZiAwLCBvdXRfd2lkdGggPT0gd2lkdGggKi8KKwl1MTYgb3V0X2hlaWdodDsJLyogaWYgMCwgb3V0X2hlaWdodCA9PSBoZWlnaHQgKi8KKwl1OCBnbG9iYWxfYWxwaGE7CisKKwllbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsOworCWJvb2wgcmVwbGljYXRpb247CisJYm9vbCBpbGFjZTsKKworCWVudW0gb21hcF9idXJzdF9zaXplIGJ1cnN0X3NpemU7CisJdTMyIGZpZm9fbG93OworCXUzMiBmaWZvX2hpZ2g7CisKKwlib29sIG1hbnVhbF91cGRhdGU7Cit9OworCitzdHJ1Y3QgbWFuYWdlcl9jYWNoZV9kYXRhIHsKKwkvKiBJZiB0cnVlLCBjYWNoZSBjaGFuZ2VkLCBidXQgbm90IHdyaXR0ZW4gdG8gc2hhZG93IHJlZ2lzdGVycy4gU2V0CisJICogaW4gYXBwbHkoKSwgY2xlYXJlZCB3aGVuIHJlZ2lzdGVycyB3cml0dGVuLiAqLworCWJvb2wgZGlydHk7CisJLyogSWYgdHJ1ZSwgc2hhZG93IHJlZ2lzdGVycyBjb250YWluIGNoYW5nZWQgdmFsdWVzIG5vdCB5ZXQgaW4gcmVhbAorCSAqIHJlZ2lzdGVycy4gU2V0IHdoZW4gd3JpdGluZyB0byBzaGFkb3cgcmVnaXN0ZXJzLCBjbGVhcmVkIGF0CisJICogVlNZTkMvRVZTWU5DICovCisJYm9vbCBzaGFkb3dfZGlydHk7CisKKwl1MzIgZGVmYXVsdF9jb2xvcjsKKworCWVudW0gb21hcF9kc3NfdHJhbnNfa2V5X3R5cGUgdHJhbnNfa2V5X3R5cGU7CisJdTMyIHRyYW5zX2tleTsKKwlib29sIHRyYW5zX2VuYWJsZWQ7CisKKwlib29sIGFscGhhX2VuYWJsZWQ7CisKKwlib29sIG1hbnVhbF91cGRfZGlzcGxheTsKKwlib29sIG1hbnVhbF91cGRhdGU7CisJYm9vbCBkb19tYW51YWxfdXBkYXRlOworCisJLyogbWFudWFsIHVwZGF0ZSByZWdpb24gKi8KKwl1MTYgeCwgeSwgdywgaDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgeworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgb3ZlcmxheV9jYWNoZV9kYXRhIG92ZXJsYXlfY2FjaGVbM107CisJc3RydWN0IG1hbmFnZXJfY2FjaGVfZGF0YSBtYW5hZ2VyX2NhY2hlWzJdOworCisJYm9vbCBpcnFfZW5hYmxlZDsKK30gZHNzX2NhY2hlOworCisKKworc3RhdGljIGludCBvbWFwX2Rzc19zZXRfZGV2aWNlKHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyLAorCQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJaW50IGk7CisJaW50IHI7CisKKwlpZiAoZHNzZGV2LT5tYW5hZ2VyKSB7CisJCURTU0VSUigiZGlzcGxheSAnJXMnIGFscmVhZHkgaGFzIGEgbWFuYWdlciAnJXMnXG4iLAorCQkJICAgICAgIGRzc2Rldi0+bmFtZSwgZHNzZGV2LT5tYW5hZ2VyLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChtZ3ItPnN1cHBvcnRlZF9kaXNwbGF5cyAmIGRzc2Rldi0+dHlwZSkgPT0gMCkgeworCQlEU1NFUlIoImRpc3BsYXkgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IG1hbmFnZXIgJyVzJ1xuIiwKKwkJCSAgICAgICBkc3NkZXYtPm5hbWUsIG1nci0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZ3ItPm51bV9vdmVybGF5czsgaSsrKSB7CisJCXN0cnVjdCBvbWFwX292ZXJsYXkgKm92bCA9IG1nci0+b3ZlcmxheXNbaV07CisKKwkJaWYgKG92bC0+bWFuYWdlciAhPSBtZ3IgfHwgIW92bC0+aW5mby5lbmFibGVkKQorCQkJY29udGludWU7CisKKwkJciA9IGRzc19jaGVja19vdmVybGF5KG92bCwgZHNzZGV2KTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwl9CisKKwlkc3NkZXYtPm1hbmFnZXIgPSBtZ3I7CisJbWdyLT5kZXZpY2UgPSBkc3NkZXY7CisJbWdyLT5kZXZpY2VfY2hhbmdlZCA9IHRydWU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwX2Rzc191bnNldF9kZXZpY2Uoc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IpCit7CisJaWYgKCFtZ3ItPmRldmljZSkgeworCQlEU1NFUlIoImZhaWxlZCB0byB1bnNldCBkaXNwbGF5LCBkaXNwbGF5IG5vdCBzZXQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWdyLT5kZXZpY2UtPm1hbmFnZXIgPSBOVUxMOworCW1nci0+ZGV2aWNlID0gTlVMTDsKKwltZ3ItPmRldmljZV9jaGFuZ2VkID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzc19tZ3Jfd2FpdF9mb3JfZ28oc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyg1MDApOworCXN0cnVjdCBtYW5hZ2VyX2NhY2hlX2RhdGEgKm1jOworCWVudW0gb21hcF9jaGFubmVsIGNoYW5uZWw7CisJdTMyIGlycTsKKwlpbnQgcjsKKwlpbnQgaTsKKworCWlmICghbWdyLT5kZXZpY2UpCisJCXJldHVybiAwOworCisJaWYgKG1nci0+ZGV2aWNlLT50eXBlID09IE9NQVBfRElTUExBWV9UWVBFX1ZFTkMpIHsKKwkJaXJxID0gRElTUENfSVJRX0VWU1lOQ19PREQgfCBESVNQQ19JUlFfRVZTWU5DX0VWRU47CisJCWNoYW5uZWwgPSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUOworCX0gZWxzZSB7CisJCWlmIChtZ3ItPmRldmljZS0+Y2FwcyAmIE9NQVBfRFNTX0RJU1BMQVlfQ0FQX01BTlVBTF9VUERBVEUpIHsKKwkJCWVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUgbW9kZTsKKwkJCW1vZGUgPSBtZ3ItPmRldmljZS0+Z2V0X3VwZGF0ZV9tb2RlKG1nci0+ZGV2aWNlKTsKKwkJCWlmIChtb2RlICE9IE9NQVBfRFNTX1VQREFURV9BVVRPKQorCQkJCXJldHVybiAwOworCisJCQlpcnEgPSBESVNQQ19JUlFfRlJBTUVET05FOworCQl9IGVsc2UgeworCQkJaXJxID0gRElTUENfSVJRX1ZTWU5DOworCQl9CisJCWNoYW5uZWwgPSBPTUFQX0RTU19DSEFOTkVMX0xDRDsKKwl9CisKKwltYyA9ICZkc3NfY2FjaGUubWFuYWdlcl9jYWNoZVttZ3ItPmlkXTsKKwlpID0gMDsKKwl3aGlsZSAoMSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlib29sIHNoYWRvd19kaXJ0eSwgZGlydHk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRzc19jYWNoZS5sb2NrLCBmbGFncyk7CisJCWRpcnR5ID0gbWMtPmRpcnR5OworCQlzaGFkb3dfZGlydHkgPSBtYy0+c2hhZG93X2RpcnR5OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3NfY2FjaGUubG9jaywgZmxhZ3MpOworCisJCWlmICghZGlydHkgJiYgIXNoYWRvd19kaXJ0eSkgeworCQkJciA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCS8qIDQgaXRlcmF0aW9ucyBpcyB0aGUgd29yc3QgY2FzZToKKwkJICogMSAtIGluaXRpYWwgaXRlcmF0aW9uLCBkaXJ0eSA9IHRydWUgKGJldHdlZW4gVkZQIGFuZCBWU1lOQykKKwkJICogMiAtIGZpcnN0IFZTWU5DLCBkaXJ0eSA9IHRydWUKKwkJICogMyAtIGRpcnR5ID0gZmFsc2UsIHNoYWRvd19kaXJ0eSA9IHRydWUKKwkJICogNCAtIHNoYWRvd19kaXJ0eSA9IGZhbHNlICovCisJCWlmIChpKysgPT0gMykgeworCQkJRFNTRVJSKCJtZ3IoJWQpLT53YWl0X2Zvcl9nbygpIG5vdCBmaW5pc2hpbmdcbiIsCisJCQkJCW1nci0+aWQpOworCQkJciA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCXIgPSBvbWFwX2Rpc3BjX3dhaXRfZm9yX2lycV9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaXJxLCB0aW1lb3V0KTsKKwkJaWYgKHIgPT0gLUVSRVNUQVJUU1lTKQorCQkJYnJlYWs7CisKKwkJaWYgKHIpIHsKKwkJCURTU0VSUigibWdyKCVkKS0+d2FpdF9mb3JfZ28oKSB0aW1lb3V0XG4iLCBtZ3ItPmlkKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHI7Cit9CisKK2ludCBkc3NfbWdyX3dhaXRfZm9yX2dvX292bChzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyg1MDApOworCWVudW0gb21hcF9jaGFubmVsIGNoYW5uZWw7CisJc3RydWN0IG92ZXJsYXlfY2FjaGVfZGF0YSAqb2M7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2OworCXUzMiBpcnE7CisJaW50IHI7CisJaW50IGk7CisKKwlpZiAoIW92bC0+bWFuYWdlciB8fCAhb3ZsLT5tYW5hZ2VyLT5kZXZpY2UpCisJCXJldHVybiAwOworCisJZHNzZGV2ID0gb3ZsLT5tYW5hZ2VyLT5kZXZpY2U7CisKKwlpZiAoZHNzZGV2LT50eXBlID09IE9NQVBfRElTUExBWV9UWVBFX1ZFTkMpIHsKKwkJaXJxID0gRElTUENfSVJRX0VWU1lOQ19PREQgfCBESVNQQ19JUlFfRVZTWU5DX0VWRU47CisJCWNoYW5uZWwgPSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUOworCX0gZWxzZSB7CisJCWlmIChkc3NkZXYtPmNhcHMgJiBPTUFQX0RTU19ESVNQTEFZX0NBUF9NQU5VQUxfVVBEQVRFKSB7CisJCQllbnVtIG9tYXBfZHNzX3VwZGF0ZV9tb2RlIG1vZGU7CisJCQltb2RlID0gZHNzZGV2LT5nZXRfdXBkYXRlX21vZGUoZHNzZGV2KTsKKwkJCWlmIChtb2RlICE9IE9NQVBfRFNTX1VQREFURV9BVVRPKQorCQkJCXJldHVybiAwOworCisJCQlpcnEgPSBESVNQQ19JUlFfRlJBTUVET05FOworCQl9IGVsc2UgeworCQkJaXJxID0gRElTUENfSVJRX1ZTWU5DOworCQl9CisJCWNoYW5uZWwgPSBPTUFQX0RTU19DSEFOTkVMX0xDRDsKKwl9CisKKwlvYyA9ICZkc3NfY2FjaGUub3ZlcmxheV9jYWNoZVtvdmwtPmlkXTsKKwlpID0gMDsKKwl3aGlsZSAoMSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlib29sIHNoYWRvd19kaXJ0eSwgZGlydHk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRzc19jYWNoZS5sb2NrLCBmbGFncyk7CisJCWRpcnR5ID0gb2MtPmRpcnR5OworCQlzaGFkb3dfZGlydHkgPSBvYy0+c2hhZG93X2RpcnR5OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3NfY2FjaGUubG9jaywgZmxhZ3MpOworCisJCWlmICghZGlydHkgJiYgIXNoYWRvd19kaXJ0eSkgeworCQkJciA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCS8qIDQgaXRlcmF0aW9ucyBpcyB0aGUgd29yc3QgY2FzZToKKwkJICogMSAtIGluaXRpYWwgaXRlcmF0aW9uLCBkaXJ0eSA9IHRydWUgKGJldHdlZW4gVkZQIGFuZCBWU1lOQykKKwkJICogMiAtIGZpcnN0IFZTWU5DLCBkaXJ0eSA9IHRydWUKKwkJICogMyAtIGRpcnR5ID0gZmFsc2UsIHNoYWRvd19kaXJ0eSA9IHRydWUKKwkJICogNCAtIHNoYWRvd19kaXJ0eSA9IGZhbHNlICovCisJCWlmIChpKysgPT0gMykgeworCQkJRFNTRVJSKCJvdmwoJWQpLT53YWl0X2Zvcl9nbygpIG5vdCBmaW5pc2hpbmdcbiIsCisJCQkJCW92bC0+aWQpOworCQkJciA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCXIgPSBvbWFwX2Rpc3BjX3dhaXRfZm9yX2lycV9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaXJxLCB0aW1lb3V0KTsKKwkJaWYgKHIgPT0gLUVSRVNUQVJUU1lTKQorCQkJYnJlYWs7CisKKwkJaWYgKHIpIHsKKwkJCURTU0VSUigib3ZsKCVkKS0+d2FpdF9mb3JfZ28oKSB0aW1lb3V0XG4iLCBvdmwtPmlkKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb3ZlcmxheV9lbmFibGVkKHN0cnVjdCBvbWFwX292ZXJsYXkgKm92bCkKK3sKKwlyZXR1cm4gb3ZsLT5pbmZvLmVuYWJsZWQgJiYgb3ZsLT5tYW5hZ2VyICYmIG92bC0+bWFuYWdlci0+ZGV2aWNlOworfQorCisvKiBJcyByZWN0MSBhIHN1YnNldCBvZiByZWN0Mj8gKi8KK3N0YXRpYyBib29sIHJlY3RhbmdsZV9zdWJzZXQoaW50IHgxLCBpbnQgeTEsIGludCB3MSwgaW50IGgxLAorCQlpbnQgeDIsIGludCB5MiwgaW50IHcyLCBpbnQgaDIpCit7CisJaWYgKHgxIDwgeDIgfHwgeTEgPCB5MikKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKHgxICsgdzEgPiB4MiArIHcyKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoeTEgKyBoMSA+IHkyICsgaDIpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCisvKiBEbyByZWN0MSBhbmQgcmVjdDIgb3ZlcmxhcD8gKi8KK3N0YXRpYyBib29sIHJlY3RhbmdsZV9pbnRlcnNlY3RzKGludCB4MSwgaW50IHkxLCBpbnQgdzEsIGludCBoMSwKKwkJaW50IHgyLCBpbnQgeTIsIGludCB3MiwgaW50IGgyKQoreworCWlmICh4MSA+PSB4MiArIHcyKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoeDIgPj0geDEgKyB3MSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKHkxID49IHkyICsgaDIpCisJCXJldHVybiBmYWxzZTsKKworCWlmICh5MiA+PSB5MSArIGgxKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgZGlzcGNfaXNfb3ZlcmxheV9zY2FsZWQoc3RydWN0IG92ZXJsYXlfY2FjaGVfZGF0YSAqb2MpCit7CisJaWYgKG9jLT5vdXRfd2lkdGggIT0gMCAmJiBvYy0+d2lkdGggIT0gb2MtPm91dF93aWR0aCkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAob2MtPm91dF9oZWlnaHQgIT0gMCAmJiBvYy0+aGVpZ2h0ICE9IG9jLT5vdXRfaGVpZ2h0KQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludCBjb25maWd1cmVfb3ZlcmxheShlbnVtIG9tYXBfcGxhbmUgcGxhbmUpCit7CisJc3RydWN0IG92ZXJsYXlfY2FjaGVfZGF0YSAqYzsKKwlzdHJ1Y3QgbWFuYWdlcl9jYWNoZV9kYXRhICptYzsKKwl1MTYgb3V0dywgb3V0aDsKKwl1MTYgeCwgeSwgdywgaDsKKwl1MzIgcGFkZHI7CisJaW50IHI7CisKKwlEU1NEQkdGKCIlZCIsIHBsYW5lKTsKKworCWMgPSAmZHNzX2NhY2hlLm92ZXJsYXlfY2FjaGVbcGxhbmVdOworCisJaWYgKCFjLT5lbmFibGVkKSB7CisJCWRpc3BjX2VuYWJsZV9wbGFuZShwbGFuZSwgMCk7CisJCXJldHVybiAwOworCX0KKworCW1jID0gJmRzc19jYWNoZS5tYW5hZ2VyX2NhY2hlW2MtPmNoYW5uZWxdOworCisJeCA9IGMtPnBvc194OworCXkgPSBjLT5wb3NfeTsKKwl3ID0gYy0+d2lkdGg7CisJaCA9IGMtPmhlaWdodDsKKwlvdXR3ID0gYy0+b3V0X3dpZHRoID09IDAgPyBjLT53aWR0aCA6IGMtPm91dF93aWR0aDsKKwlvdXRoID0gYy0+b3V0X2hlaWdodCA9PSAwID8gYy0+aGVpZ2h0IDogYy0+b3V0X2hlaWdodDsKKwlwYWRkciA9IGMtPnBhZGRyOworCisJaWYgKGMtPm1hbnVhbF91cGRhdGUgJiYgbWMtPmRvX21hbnVhbF91cGRhdGUpIHsKKwkJdW5zaWduZWQgYnBwOworCQkvKiBJZiB0aGUgb3ZlcmxheSBpcyBvdXRzaWRlIHRoZSB1cGRhdGUgcmVnaW9uLCBkaXNhYmxlIGl0ICovCisJCWlmICghcmVjdGFuZ2xlX2ludGVyc2VjdHMobWMtPngsIG1jLT55LCBtYy0+dywgbWMtPmgsCisJCQkJCXgsIHksIG91dHcsIG91dGgpKSB7CisJCQlkaXNwY19lbmFibGVfcGxhbmUocGxhbmUsIDApOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlzd2l0Y2ggKGMtPmNvbG9yX21vZGUpIHsKKwkJY2FzZSBPTUFQX0RTU19DT0xPUl9SR0IxNjoKKwkJY2FzZSBPTUFQX0RTU19DT0xPUl9BUkdCMTY6CisJCWNhc2UgT01BUF9EU1NfQ09MT1JfWVVWMjoKKwkJY2FzZSBPTUFQX0RTU19DT0xPUl9VWVZZOgorCQkJYnBwID0gMTY7CisJCQlicmVhazsKKworCQljYXNlIE9NQVBfRFNTX0NPTE9SX1JHQjI0UDoKKwkJCWJwcCA9IDI0OworCQkJYnJlYWs7CisKKwkJY2FzZSBPTUFQX0RTU19DT0xPUl9SR0IyNFU6CisJCWNhc2UgT01BUF9EU1NfQ09MT1JfQVJHQjMyOgorCQljYXNlIE9NQVBfRFNTX0NPTE9SX1JHQkEzMjoKKwkJY2FzZSBPTUFQX0RTU19DT0xPUl9SR0JYMzI6CisJCQlicHAgPSAzMjsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJfQorCisJCWlmIChkaXNwY19pc19vdmVybGF5X3NjYWxlZChjKSkgeworCQkJLyogSWYgdGhlIG92ZXJsYXkgaXMgc2NhbGVkLCB0aGUgdXBkYXRlIGFyZWEgaGFzCisJCQkgKiBhbHJlYWR5IGJlZW4gZW5sYXJnZWQgdG8gY292ZXIgdGhlIHdob2xlIG92ZXJsYXkuIFdlCisJCQkgKiBvbmx5IG5lZWQgdG8gYWRqdXN0IHgveSBoZXJlICovCisJCQl4ID0gYy0+cG9zX3ggLSBtYy0+eDsKKwkJCXkgPSBjLT5wb3NfeSAtIG1jLT55OworCQl9IGVsc2UgeworCQkJaWYgKG1jLT54ID4gYy0+cG9zX3gpIHsKKwkJCQl4ID0gMDsKKwkJCQl3IC09IChtYy0+eCAtIGMtPnBvc194KTsKKwkJCQlwYWRkciArPSAobWMtPnggLSBjLT5wb3NfeCkgKiBicHAgLyA4OworCQkJfSBlbHNlIHsKKwkJCQl4ID0gYy0+cG9zX3ggLSBtYy0+eDsKKwkJCX0KKworCQkJaWYgKG1jLT55ID4gYy0+cG9zX3kpIHsKKwkJCQl5ID0gMDsKKwkJCQloIC09IChtYy0+eSAtIGMtPnBvc195KTsKKwkJCQlwYWRkciArPSAobWMtPnkgLSBjLT5wb3NfeSkgKiBjLT5zY3JlZW5fd2lkdGggKgorCQkJCQlicHAgLyA4OworCQkJfSBlbHNlIHsKKwkJCQl5ID0gYy0+cG9zX3kgLSBtYy0+eTsKKwkJCX0KKworCQkJaWYgKG1jLT53IDwgKHgrdykpCisJCQkJdyAtPSAoeCt3KSAtIChtYy0+dyk7CisKKwkJCWlmIChtYy0+aCA8ICh5K2gpKQorCQkJCWggLT0gKHkraCkgLSAobWMtPmgpOworCisJCQlvdXR3ID0gdzsKKwkJCW91dGggPSBoOworCQl9CisJfQorCisJciA9IGRpc3BjX3NldHVwX3BsYW5lKHBsYW5lLAorCQkJcGFkZHIsCisJCQljLT5zY3JlZW5fd2lkdGgsCisJCQl4LCB5LAorCQkJdywgaCwKKwkJCW91dHcsIG91dGgsCisJCQljLT5jb2xvcl9tb2RlLAorCQkJYy0+aWxhY2UsCisJCQljLT5yb3RhdGlvbl90eXBlLAorCQkJYy0+cm90YXRpb24sCisJCQljLT5taXJyb3IsCisJCQljLT5nbG9iYWxfYWxwaGEpOworCisJaWYgKHIpIHsKKwkJLyogdGhpcyBzaG91bGRuJ3QgaGFwcGVuICovCisJCURTU0VSUigiZGlzcGNfc2V0dXBfcGxhbmUgZmFpbGVkIGZvciBvdmwgJWRcbiIsIHBsYW5lKTsKKwkJZGlzcGNfZW5hYmxlX3BsYW5lKHBsYW5lLCAwKTsKKwkJcmV0dXJuIHI7CisJfQorCisJZGlzcGNfZW5hYmxlX3JlcGxpY2F0aW9uKHBsYW5lLCBjLT5yZXBsaWNhdGlvbik7CisKKwlkaXNwY19zZXRfYnVyc3Rfc2l6ZShwbGFuZSwgYy0+YnVyc3Rfc2l6ZSk7CisJZGlzcGNfc2V0dXBfcGxhbmVfZmlmbyhwbGFuZSwgYy0+Zmlmb19sb3csIGMtPmZpZm9faGlnaCk7CisKKwlkaXNwY19lbmFibGVfcGxhbmUocGxhbmUsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ3VyZV9tYW5hZ2VyKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpCit7CisJc3RydWN0IG1hbmFnZXJfY2FjaGVfZGF0YSAqYzsKKworCURTU0RCR0YoIiVkIiwgY2hhbm5lbCk7CisKKwljID0gJmRzc19jYWNoZS5tYW5hZ2VyX2NhY2hlW2NoYW5uZWxdOworCisJZGlzcGNfc2V0X3RyYW5zX2tleShjaGFubmVsLCBjLT50cmFuc19rZXlfdHlwZSwgYy0+dHJhbnNfa2V5KTsKKwlkaXNwY19lbmFibGVfdHJhbnNfa2V5KGNoYW5uZWwsIGMtPnRyYW5zX2VuYWJsZWQpOworCWRpc3BjX2VuYWJsZV9hbHBoYV9ibGVuZGluZyhjaGFubmVsLCBjLT5hbHBoYV9lbmFibGVkKTsKK30KKworLyogY29uZmlndXJlX2Rpc3BjKCkgdHJpZXMgdG8gd3JpdGUgdmFsdWVzIGZyb20gY2FjaGUgdG8gc2hhZG93IHJlZ2lzdGVycy4KKyAqIEl0IHdyaXRlcyBvbmx5IHRvIHRob3NlIG1hbmFnZXJzL292ZXJsYXlzIHRoYXQgYXJlIG5vdCBidXN5LgorICogcmV0dXJucyAwIGlmIGV2ZXJ5dGhpbmcgY291bGQgYmUgd3JpdHRlbiB0byBzaGFkb3cgcmVnaXN0ZXJzLgorICogcmV0dXJucyAxIGlmIG5vdCBldmVyeXRoaW5nIGNvdWxkIGJlIHdyaXR0ZW4gdG8gc2hhZG93IHJlZ2lzdGVycy4gKi8KK3N0YXRpYyBpbnQgY29uZmlndXJlX2Rpc3BjKHZvaWQpCit7CisJc3RydWN0IG92ZXJsYXlfY2FjaGVfZGF0YSAqb2M7CisJc3RydWN0IG1hbmFnZXJfY2FjaGVfZGF0YSAqbWM7CisJY29uc3QgaW50IG51bV9vdmxzID0gQVJSQVlfU0laRShkc3NfY2FjaGUub3ZlcmxheV9jYWNoZSk7CisJY29uc3QgaW50IG51bV9tZ3JzID0gQVJSQVlfU0laRShkc3NfY2FjaGUubWFuYWdlcl9jYWNoZSk7CisJaW50IGk7CisJaW50IHI7CisJYm9vbCBtZ3JfYnVzeVsyXTsKKwlib29sIG1ncl9nb1syXTsKKwlib29sIGJ1c3k7CisKKwlyID0gMDsKKwlidXN5ID0gZmFsc2U7CisKKwltZ3JfYnVzeVswXSA9IGRpc3BjX2dvX2J1c3koMCk7CisJbWdyX2J1c3lbMV0gPSBkaXNwY19nb19idXN5KDEpOworCW1ncl9nb1swXSA9IGZhbHNlOworCW1ncl9nb1sxXSA9IGZhbHNlOworCisJLyogQ29tbWl0IG92ZXJsYXkgc2V0dGluZ3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX292bHM7ICsraSkgeworCQlvYyA9ICZkc3NfY2FjaGUub3ZlcmxheV9jYWNoZVtpXTsKKwkJbWMgPSAmZHNzX2NhY2hlLm1hbmFnZXJfY2FjaGVbb2MtPmNoYW5uZWxdOworCisJCWlmICghb2MtPmRpcnR5KQorCQkJY29udGludWU7CisKKwkJaWYgKG9jLT5tYW51YWxfdXBkYXRlICYmICFtYy0+ZG9fbWFudWFsX3VwZGF0ZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChtZ3JfYnVzeVtvYy0+Y2hhbm5lbF0pIHsKKwkJCWJ1c3kgPSB0cnVlOworCQkJY29udGludWU7CisJCX0KKworCQlyID0gY29uZmlndXJlX292ZXJsYXkoaSk7CisJCWlmIChyKQorCQkJRFNTRVJSKCJjb25maWd1cmVfb3ZlcmxheSAlZCBmYWlsZWRcbiIsIGkpOworCisJCW9jLT5kaXJ0eSA9IGZhbHNlOworCQlvYy0+c2hhZG93X2RpcnR5ID0gdHJ1ZTsKKwkJbWdyX2dvW29jLT5jaGFubmVsXSA9IHRydWU7CisJfQorCisJLyogQ29tbWl0IG1hbmFnZXIgc2V0dGluZ3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX21ncnM7ICsraSkgeworCQltYyA9ICZkc3NfY2FjaGUubWFuYWdlcl9jYWNoZVtpXTsKKworCQlpZiAoIW1jLT5kaXJ0eSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChtYy0+bWFudWFsX3VwZGF0ZSAmJiAhbWMtPmRvX21hbnVhbF91cGRhdGUpCisJCQljb250aW51ZTsKKworCQlpZiAobWdyX2J1c3lbaV0pIHsKKwkJCWJ1c3kgPSB0cnVlOworCQkJY29udGludWU7CisJCX0KKworCQljb25maWd1cmVfbWFuYWdlcihpKTsKKwkJbWMtPmRpcnR5ID0gZmFsc2U7CisJCW1jLT5zaGFkb3dfZGlydHkgPSB0cnVlOworCQltZ3JfZ29baV0gPSB0cnVlOworCX0KKworCS8qIHNldCBHTyAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fbWdyczsgKytpKSB7CisJCW1jID0gJmRzc19jYWNoZS5tYW5hZ2VyX2NhY2hlW2ldOworCisJCWlmICghbWdyX2dvW2ldKQorCQkJY29udGludWU7CisKKwkJLyogV2UgZG9uJ3QgbmVlZCBHTyB3aXRoIG1hbnVhbCB1cGRhdGUgZGlzcGxheS4gTENEIGlmYWNlIHdpbGwKKwkJICogYWx3YXlzIGJlIHR1cm5lZCBvZmYgYWZ0ZXIgZnJhbWUsIGFuZCBuZXcgc2V0dGluZ3Mgd2lsbCBiZQorCQkgKiB0YWtlbiBpbiB0byB1c2UgYXQgbmV4dCB1cGRhdGUgKi8KKwkJaWYgKCFtYy0+bWFudWFsX3VwZF9kaXNwbGF5KQorCQkJZGlzcGNfZ28oaSk7CisJfQorCisJaWYgKGJ1c3kpCisJCXIgPSAxOworCWVsc2UKKwkJciA9IDA7CisKKwlyZXR1cm4gcjsKK30KKworLyogQ29uZmlndXJlIGRpc3BjIGZvciBwYXJ0aWFsIHVwZGF0ZS4gUmV0dXJuIHBvc3NpYmx5IG1vZGlmaWVkIHVwZGF0ZQorICogYXJlYSAqLwordm9pZCBkc3Nfc2V0dXBfcGFydGlhbF9wbGFuZXMoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQl1MTYgKnhpLCB1MTYgKnlpLCB1MTYgKndpLCB1MTYgKmhpKQoreworCXN0cnVjdCBvdmVybGF5X2NhY2hlX2RhdGEgKm9jOworCXN0cnVjdCBtYW5hZ2VyX2NhY2hlX2RhdGEgKm1jOworCWNvbnN0IGludCBudW1fb3ZscyA9IEFSUkFZX1NJWkUoZHNzX2NhY2hlLm92ZXJsYXlfY2FjaGUpOworCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyOworCWludCBpOworCXUxNiB4LCB5LCB3LCBoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl4ID0gKnhpOworCXkgPSAqeWk7CisJdyA9ICp3aTsKKwloID0gKmhpOworCisJRFNTREJHKCJkaXNwY19zZXR1cF9wYXJ0aWFsX3BsYW5lcyAlZCwlZCAlZHglZFxuIiwKKwkJKnhpLCAqeWksICp3aSwgKmhpKTsKKworCW1nciA9IGRzc2Rldi0+bWFuYWdlcjsKKworCWlmICghbWdyKSB7CisJCURTU0RCRygibm8gbWFuYWdlclxuIik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHNzX2NhY2hlLmxvY2ssIGZsYWdzKTsKKworCS8qIFdlIG5lZWQgdG8gc2hvdyB0aGUgd2hvbGUgb3ZlcmxheSBpZiBpdCBpcyBzY2FsZWQuIFNvIGxvb2sgZm9yCisJICogdGhvc2UsIGFuZCBtYWtlIHRoZSB1cGRhdGUgYXJlYSBsYXJnZXIgaWYgZm91bmQuCisJICogQWxzbyBtYXJrIHRoZSBvdmVybGF5IGNhY2hlIGRpcnR5ICovCisJZm9yIChpID0gMDsgaSA8IG51bV9vdmxzOyArK2kpIHsKKwkJdW5zaWduZWQgeDEsIHkxLCB4MiwgeTI7CisJCXVuc2lnbmVkIG91dHcsIG91dGg7CisKKwkJb2MgPSAmZHNzX2NhY2hlLm92ZXJsYXlfY2FjaGVbaV07CisKKwkJaWYgKG9jLT5jaGFubmVsICE9IG1nci0+aWQpCisJCQljb250aW51ZTsKKworCQlvYy0+ZGlydHkgPSB0cnVlOworCisJCWlmICghb2MtPmVuYWJsZWQpCisJCQljb250aW51ZTsKKworCQlpZiAoIWRpc3BjX2lzX292ZXJsYXlfc2NhbGVkKG9jKSkKKwkJCWNvbnRpbnVlOworCisJCW91dHcgPSBvYy0+b3V0X3dpZHRoID09IDAgPyBvYy0+d2lkdGggOiBvYy0+b3V0X3dpZHRoOworCQlvdXRoID0gb2MtPm91dF9oZWlnaHQgPT0gMCA/IG9jLT5oZWlnaHQgOiBvYy0+b3V0X2hlaWdodDsKKworCQkvKiBpcyB0aGUgb3ZlcmxheSBvdXRzaWRlIHRoZSB1cGRhdGUgcmVnaW9uPyAqLworCQlpZiAoIXJlY3RhbmdsZV9pbnRlcnNlY3RzKHgsIHksIHcsIGgsCisJCQkJCW9jLT5wb3NfeCwgb2MtPnBvc195LAorCQkJCQlvdXR3LCBvdXRoKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIGlmIHRoZSBvdmVybGF5IHRvdGFsbHkgaW5zaWRlIHRoZSB1cGRhdGUgcmVnaW9uPyAqLworCQlpZiAocmVjdGFuZ2xlX3N1YnNldChvYy0+cG9zX3gsIG9jLT5wb3NfeSwgb3V0dywgb3V0aCwKKwkJCQkJeCwgeSwgdywgaCkpCisJCQljb250aW51ZTsKKworCQlpZiAoeCA+IG9jLT5wb3NfeCkKKwkJCXgxID0gb2MtPnBvc194OworCQllbHNlCisJCQl4MSA9IHg7CisKKwkJaWYgKHkgPiBvYy0+cG9zX3kpCisJCQl5MSA9IG9jLT5wb3NfeTsKKwkJZWxzZQorCQkJeTEgPSB5OworCisJCWlmICgoeCArIHcpIDwgKG9jLT5wb3NfeCArIG91dHcpKQorCQkJeDIgPSBvYy0+cG9zX3ggKyBvdXR3OworCQllbHNlCisJCQl4MiA9IHggKyB3OworCisJCWlmICgoeSArIGgpIDwgKG9jLT5wb3NfeSArIG91dGgpKQorCQkJeTIgPSBvYy0+cG9zX3kgKyBvdXRoOworCQllbHNlCisJCQl5MiA9IHkgKyBoOworCisJCXggPSB4MTsKKwkJeSA9IHkxOworCQl3ID0geDIgLSB4MTsKKwkJaCA9IHkyIC0geTE7CisKKwkJRFNTREJHKCJjaGFuZ2luZyB1cGQgYXJlYSBkdWUgdG8gb3ZsKCVkKSBzY2FsaW5nICVkLCVkICVkeCVkXG4iLAorCQkJCWksIHgsIHksIHcsIGgpOworCX0KKworCW1jID0gJmRzc19jYWNoZS5tYW5hZ2VyX2NhY2hlW21nci0+aWRdOworCW1jLT5kb19tYW51YWxfdXBkYXRlID0gdHJ1ZTsKKwltYy0+eCA9IHg7CisJbWMtPnkgPSB5OworCW1jLT53ID0gdzsKKwltYy0+aCA9IGg7CisKKwljb25maWd1cmVfZGlzcGMoKTsKKworCW1jLT5kb19tYW51YWxfdXBkYXRlID0gZmFsc2U7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3NfY2FjaGUubG9jaywgZmxhZ3MpOworCisJKnhpID0geDsKKwkqeWkgPSB5OworCSp3aSA9IHc7CisJKmhpID0gaDsKK30KKwordm9pZCBkc3Nfc3RhcnRfdXBkYXRlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgbWFuYWdlcl9jYWNoZV9kYXRhICptYzsKKwlzdHJ1Y3Qgb3ZlcmxheV9jYWNoZV9kYXRhICpvYzsKKwljb25zdCBpbnQgbnVtX292bHMgPSBBUlJBWV9TSVpFKGRzc19jYWNoZS5vdmVybGF5X2NhY2hlKTsKKwljb25zdCBpbnQgbnVtX21ncnMgPSBBUlJBWV9TSVpFKGRzc19jYWNoZS5tYW5hZ2VyX2NhY2hlKTsKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncjsKKwlpbnQgaTsKKworCW1nciA9IGRzc2Rldi0+bWFuYWdlcjsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fb3ZsczsgKytpKSB7CisJCW9jID0gJmRzc19jYWNoZS5vdmVybGF5X2NhY2hlW2ldOworCQlpZiAob2MtPmNoYW5uZWwgIT0gbWdyLT5pZCkKKwkJCWNvbnRpbnVlOworCisJCW9jLT5zaGFkb3dfZGlydHkgPSBmYWxzZTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX21ncnM7ICsraSkgeworCQltYyA9ICZkc3NfY2FjaGUubWFuYWdlcl9jYWNoZVtpXTsKKwkJaWYgKG1nci0+aWQgIT0gaSkKKwkJCWNvbnRpbnVlOworCisJCW1jLT5zaGFkb3dfZGlydHkgPSBmYWxzZTsKKwl9CisKKwlkaXNwY19lbmFibGVfbGNkX291dCgxKTsKK30KKworc3RhdGljIHZvaWQgZHNzX2FwcGx5X2lycV9oYW5kbGVyKHZvaWQgKmRhdGEsIHUzMiBtYXNrKQoreworCXN0cnVjdCBtYW5hZ2VyX2NhY2hlX2RhdGEgKm1jOworCXN0cnVjdCBvdmVybGF5X2NhY2hlX2RhdGEgKm9jOworCWNvbnN0IGludCBudW1fb3ZscyA9IEFSUkFZX1NJWkUoZHNzX2NhY2hlLm92ZXJsYXlfY2FjaGUpOworCWNvbnN0IGludCBudW1fbWdycyA9IEFSUkFZX1NJWkUoZHNzX2NhY2hlLm1hbmFnZXJfY2FjaGUpOworCWludCBpLCByOworCWJvb2wgbWdyX2J1c3lbMl07CisKKwltZ3JfYnVzeVswXSA9IGRpc3BjX2dvX2J1c3koMCk7CisJbWdyX2J1c3lbMV0gPSBkaXNwY19nb19idXN5KDEpOworCisJc3Bpbl9sb2NrKCZkc3NfY2FjaGUubG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX292bHM7ICsraSkgeworCQlvYyA9ICZkc3NfY2FjaGUub3ZlcmxheV9jYWNoZVtpXTsKKwkJaWYgKCFtZ3JfYnVzeVtvYy0+Y2hhbm5lbF0pCisJCQlvYy0+c2hhZG93X2RpcnR5ID0gZmFsc2U7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9tZ3JzOyArK2kpIHsKKwkJbWMgPSAmZHNzX2NhY2hlLm1hbmFnZXJfY2FjaGVbaV07CisJCWlmICghbWdyX2J1c3lbaV0pCisJCQltYy0+c2hhZG93X2RpcnR5ID0gZmFsc2U7CisJfQorCisJciA9IGNvbmZpZ3VyZV9kaXNwYygpOworCWlmIChyID09IDEpCisJCWdvdG8gZW5kOworCisJLyogcmUtcmVhZCBidXN5IGZsYWdzICovCisJbWdyX2J1c3lbMF0gPSBkaXNwY19nb19idXN5KDApOworCW1ncl9idXN5WzFdID0gZGlzcGNfZ29fYnVzeSgxKTsKKworCS8qIGtlZXAgcnVubmluZyBhcyBsb25nIGFzIHRoZXJlIGFyZSBidXN5IG1hbmFnZXJzLCBzbyB0aGF0CisJICogd2UgY2FuIGNvbGxlY3Qgb3ZlcmxheS1hcHBsaWVkIGluZm9ybWF0aW9uICovCisJZm9yIChpID0gMDsgaSA8IG51bV9tZ3JzOyArK2kpIHsKKwkJaWYgKG1ncl9idXN5W2ldKQorCQkJZ290byBlbmQ7CisJfQorCisJb21hcF9kaXNwY191bnJlZ2lzdGVyX2lzcihkc3NfYXBwbHlfaXJxX2hhbmRsZXIsIE5VTEwsCisJCQlESVNQQ19JUlFfVlNZTkMJfCBESVNQQ19JUlFfRVZTWU5DX09ERCB8CisJCQlESVNQQ19JUlFfRVZTWU5DX0VWRU4pOworCWRzc19jYWNoZS5pcnFfZW5hYmxlZCA9IGZhbHNlOworCitlbmQ6CisJc3Bpbl91bmxvY2soJmRzc19jYWNoZS5sb2NrKTsKK30KKworc3RhdGljIGludCBvbWFwX2Rzc19tZ3JfYXBwbHkoc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IpCit7CisJc3RydWN0IG92ZXJsYXlfY2FjaGVfZGF0YSAqb2M7CisJc3RydWN0IG1hbmFnZXJfY2FjaGVfZGF0YSAqbWM7CisJaW50IGk7CisJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsOworCWludCBudW1fcGxhbmVzX2VuYWJsZWQgPSAwOworCWJvb2wgdXNlX2ZpZm9tZXJnZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByOworCisJRFNTREJHKCJvbWFwX2Rzc19tZ3JfYXBwbHkoJXMpXG4iLCBtZ3ItPm5hbWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzc19jYWNoZS5sb2NrLCBmbGFncyk7CisKKwkvKiBDb25maWd1cmUgb3ZlcmxheXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgb21hcF9kc3NfZ2V0X251bV9vdmVybGF5cygpOyArK2kpIHsKKwkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2OworCisJCW92bCA9IG9tYXBfZHNzX2dldF9vdmVybGF5KGkpOworCisJCWlmICghKG92bC0+Y2FwcyAmIE9NQVBfRFNTX09WTF9DQVBfRElTUEMpKQorCQkJY29udGludWU7CisKKwkJb2MgPSAmZHNzX2NhY2hlLm92ZXJsYXlfY2FjaGVbb3ZsLT5pZF07CisKKwkJaWYgKCFvdmVybGF5X2VuYWJsZWQob3ZsKSkgeworCQkJaWYgKG9jLT5lbmFibGVkKSB7CisJCQkJb2MtPmVuYWJsZWQgPSBmYWxzZTsKKwkJCQlvYy0+ZGlydHkgPSB0cnVlOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIW92bC0+aW5mb19kaXJ0eSkgeworCQkJaWYgKG9jLT5lbmFibGVkKQorCQkJCSsrbnVtX3BsYW5lc19lbmFibGVkOworCQkJY29udGludWU7CisJCX0KKworCQlkc3NkZXYgPSBvdmwtPm1hbmFnZXItPmRldmljZTsKKworCQlpZiAoZHNzX2NoZWNrX292ZXJsYXkob3ZsLCBkc3NkZXYpKSB7CisJCQlpZiAob2MtPmVuYWJsZWQpIHsKKwkJCQlvYy0+ZW5hYmxlZCA9IGZhbHNlOworCQkJCW9jLT5kaXJ0eSA9IHRydWU7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCW92bC0+aW5mb19kaXJ0eSA9IGZhbHNlOworCQlvYy0+ZGlydHkgPSB0cnVlOworCisJCW9jLT5wYWRkciA9IG92bC0+aW5mby5wYWRkcjsKKwkJb2MtPnZhZGRyID0gb3ZsLT5pbmZvLnZhZGRyOworCQlvYy0+c2NyZWVuX3dpZHRoID0gb3ZsLT5pbmZvLnNjcmVlbl93aWR0aDsKKwkJb2MtPndpZHRoID0gb3ZsLT5pbmZvLndpZHRoOworCQlvYy0+aGVpZ2h0ID0gb3ZsLT5pbmZvLmhlaWdodDsKKwkJb2MtPmNvbG9yX21vZGUgPSBvdmwtPmluZm8uY29sb3JfbW9kZTsKKwkJb2MtPnJvdGF0aW9uID0gb3ZsLT5pbmZvLnJvdGF0aW9uOworCQlvYy0+cm90YXRpb25fdHlwZSA9IG92bC0+aW5mby5yb3RhdGlvbl90eXBlOworCQlvYy0+bWlycm9yID0gb3ZsLT5pbmZvLm1pcnJvcjsKKwkJb2MtPnBvc194ID0gb3ZsLT5pbmZvLnBvc194OworCQlvYy0+cG9zX3kgPSBvdmwtPmluZm8ucG9zX3k7CisJCW9jLT5vdXRfd2lkdGggPSBvdmwtPmluZm8ub3V0X3dpZHRoOworCQlvYy0+b3V0X2hlaWdodCA9IG92bC0+aW5mby5vdXRfaGVpZ2h0OworCQlvYy0+Z2xvYmFsX2FscGhhID0gb3ZsLT5pbmZvLmdsb2JhbF9hbHBoYTsKKworCQlvYy0+cmVwbGljYXRpb24gPQorCQkJZHNzX3VzZV9yZXBsaWNhdGlvbihkc3NkZXYsIG92bC0+aW5mby5jb2xvcl9tb2RlKTsKKworCQlvYy0+aWxhY2UgPSBkc3NkZXYtPnR5cGUgPT0gT01BUF9ESVNQTEFZX1RZUEVfVkVOQzsKKworCQlvYy0+Y2hhbm5lbCA9IG92bC0+bWFuYWdlci0+aWQ7CisKKwkJb2MtPmVuYWJsZWQgPSB0cnVlOworCisJCW9jLT5tYW51YWxfdXBkYXRlID0KKwkJCWRzc2Rldi0+Y2FwcyAmIE9NQVBfRFNTX0RJU1BMQVlfQ0FQX01BTlVBTF9VUERBVEUgJiYKKwkJCWRzc2Rldi0+Z2V0X3VwZGF0ZV9tb2RlKGRzc2RldikgIT0gT01BUF9EU1NfVVBEQVRFX0FVVE87CisKKwkJKytudW1fcGxhbmVzX2VuYWJsZWQ7CisJfQorCisJLyogQ29uZmlndXJlIG1hbmFnZXJzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtZ3IsICZtYW5hZ2VyX2xpc3QsIGxpc3QpIHsKKwkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2OworCisJCWlmICghKG1nci0+Y2FwcyAmIE9NQVBfRFNTX09WTF9NR1JfQ0FQX0RJU1BDKSkKKwkJCWNvbnRpbnVlOworCisJCW1jID0gJmRzc19jYWNoZS5tYW5hZ2VyX2NhY2hlW21nci0+aWRdOworCisJCWlmIChtZ3ItPmRldmljZV9jaGFuZ2VkKSB7CisJCQltZ3ItPmRldmljZV9jaGFuZ2VkID0gZmFsc2U7CisJCQltZ3ItPmluZm9fZGlydHkgID0gdHJ1ZTsKKwkJfQorCisJCWlmICghbWdyLT5pbmZvX2RpcnR5KQorCQkJY29udGludWU7CisKKwkJaWYgKCFtZ3ItPmRldmljZSkKKwkJCWNvbnRpbnVlOworCisJCWRzc2RldiA9IG1nci0+ZGV2aWNlOworCisJCW1nci0+aW5mb19kaXJ0eSA9IGZhbHNlOworCQltYy0+ZGlydHkgPSB0cnVlOworCisJCW1jLT5kZWZhdWx0X2NvbG9yID0gbWdyLT5pbmZvLmRlZmF1bHRfY29sb3I7CisJCW1jLT50cmFuc19rZXlfdHlwZSA9IG1nci0+aW5mby50cmFuc19rZXlfdHlwZTsKKwkJbWMtPnRyYW5zX2tleSA9IG1nci0+aW5mby50cmFuc19rZXk7CisJCW1jLT50cmFuc19lbmFibGVkID0gbWdyLT5pbmZvLnRyYW5zX2VuYWJsZWQ7CisJCW1jLT5hbHBoYV9lbmFibGVkID0gbWdyLT5pbmZvLmFscGhhX2VuYWJsZWQ7CisKKwkJbWMtPm1hbnVhbF91cGRfZGlzcGxheSA9CisJCQlkc3NkZXYtPmNhcHMgJiBPTUFQX0RTU19ESVNQTEFZX0NBUF9NQU5VQUxfVVBEQVRFOworCisJCW1jLT5tYW51YWxfdXBkYXRlID0KKwkJCWRzc2Rldi0+Y2FwcyAmIE9NQVBfRFNTX0RJU1BMQVlfQ0FQX01BTlVBTF9VUERBVEUgJiYKKwkJCWRzc2Rldi0+Z2V0X3VwZGF0ZV9tb2RlKGRzc2RldikgIT0gT01BUF9EU1NfVVBEQVRFX0FVVE87CisJfQorCisJLyogWFhYIFRPRE86IFRyeSB0byBnZXQgZmlmb21lcmdlIHdvcmtpbmcuIFRoZSBwcm9ibGVtIGlzIHRoYXQgaXQKKwkgKiBhZmZlY3RzIGJvdGggbWFuYWdlcnMsIG5vdCBpbmRpdmlkdWFsbHkgYnV0IGF0IHRoZSBzYW1lIHRpbWUuIFRoaXMKKwkgKiBtZWFucyB0aGUgY2hhbmdlIGhhcyB0byBiZSB3ZWxsIHN5bmNocm9uaXplZC4gSSBndWVzcyB0aGUgcHJvcGVyIHdheQorCSAqIGlzIHRvIGhhdmUgYSB0d28gc3RlcCBwcm9jZXNzIGZvciBmaWZvIG1lcmdlOgorCSAqICAgICAgICBmaWZvbWVyZ2UgZW5hYmxlOgorCSAqICAgICAgICAgICAgIDEuIGRpc2FibGUgb3RoZXIgcGxhbmVzLCBsZWF2aW5nIG9uZSBwbGFuZSBlbmFibGVkCisJICogICAgICAgICAgICAgMi4gd2FpdCB1bnRpbCB0aGUgcGxhbmVzIGFyZSBkaXNhYmxlZCBvbiBIVworCSAqICAgICAgICAgICAgIDMuIGNvbmZpZyBtZXJnZWQgZmlmbyB0aHJlc2hvbGRzLCBlbmFibGUgZmlmb21lcmdlCisJICogICAgICAgIGZpZm9tZXJnZSBkaXNhYmxlOgorCSAqICAgICAgICAgICAgIDEuIGNvbmZpZyB1bm1lcmdlZCBmaWZvIHRocmVzaG9sZHMsIGRpc2FibGUgZmlmb21lcmdlCisJICogICAgICAgICAgICAgMi4gd2FpdCB1bnRpbCBmaWZvIGNoYW5nZXMgYXJlIGluIEhXCisJICogICAgICAgICAgICAgMy4gZW5hYmxlIHBsYW5lcworCSAqLworCXVzZV9maWZvbWVyZ2UgPSBmYWxzZTsKKworCS8qIENvbmZpZ3VyZSBvdmVybGF5IGZpZm9zICovCisJZm9yIChpID0gMDsgaSA8IG9tYXBfZHNzX2dldF9udW1fb3ZlcmxheXMoKTsgKytpKSB7CisJCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldjsKKwkJdTMyIHNpemU7CisKKwkJb3ZsID0gb21hcF9kc3NfZ2V0X292ZXJsYXkoaSk7CisKKwkJaWYgKCEob3ZsLT5jYXBzICYgT01BUF9EU1NfT1ZMX0NBUF9ESVNQQykpCisJCQljb250aW51ZTsKKworCQlvYyA9ICZkc3NfY2FjaGUub3ZlcmxheV9jYWNoZVtvdmwtPmlkXTsKKworCQlpZiAoIW9jLT5lbmFibGVkKQorCQkJY29udGludWU7CisKKwkJZHNzZGV2ID0gb3ZsLT5tYW5hZ2VyLT5kZXZpY2U7CisKKwkJc2l6ZSA9IGRpc3BjX2dldF9wbGFuZV9maWZvX3NpemUob3ZsLT5pZCk7CisJCWlmICh1c2VfZmlmb21lcmdlKQorCQkJc2l6ZSAqPSAzOworCisJCXN3aXRjaCAoZHNzZGV2LT50eXBlKSB7CisJCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfRFBJOgorCQljYXNlIE9NQVBfRElTUExBWV9UWVBFX0RCSToKKwkJY2FzZSBPTUFQX0RJU1BMQVlfVFlQRV9TREk6CisJCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfVkVOQzoKKwkJCWRlZmF1bHRfZ2V0X292ZXJsYXlfZmlmb190aHJlc2hvbGRzKG92bC0+aWQsIHNpemUsCisJCQkJCSZvYy0+YnVyc3Rfc2l6ZSwgJm9jLT5maWZvX2xvdywKKwkJCQkJJm9jLT5maWZvX2hpZ2gpOworCQkJYnJlYWs7CisjaWZkZWYgQ09ORklHX09NQVAyX0RTU19EU0kKKwkJY2FzZSBPTUFQX0RJU1BMQVlfVFlQRV9EU0k6CisJCQlkc2lfZ2V0X292ZXJsYXlfZmlmb190aHJlc2hvbGRzKG92bC0+aWQsIHNpemUsCisJCQkJCSZvYy0+YnVyc3Rfc2l6ZSwgJm9jLT5maWZvX2xvdywKKwkJCQkJJm9jLT5maWZvX2hpZ2gpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQl9CisJfQorCisJciA9IDA7CisJZHNzX2Nsa19lbmFibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSzEpOworCWlmICghZHNzX2NhY2hlLmlycV9lbmFibGVkKSB7CisJCXIgPSBvbWFwX2Rpc3BjX3JlZ2lzdGVyX2lzcihkc3NfYXBwbHlfaXJxX2hhbmRsZXIsIE5VTEwsCisJCQkJRElTUENfSVJRX1ZTWU5DCXwgRElTUENfSVJRX0VWU1lOQ19PREQgfAorCQkJCURJU1BDX0lSUV9FVlNZTkNfRVZFTik7CisJCWRzc19jYWNoZS5pcnFfZW5hYmxlZCA9IHRydWU7CisJfQorCWNvbmZpZ3VyZV9kaXNwYygpOworCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLMSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3NfY2FjaGUubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgZHNzX2NoZWNrX21hbmFnZXIoc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IpCit7CisJLyogT01BUCBzdXBwb3J0cyBvbmx5IGdyYXBoaWNzIHNvdXJjZSB0cmFuc3BhcmVuY3kgY29sb3Iga2V5IGFuZCBhbHBoYQorCSAqIGJsZW5kaW5nIHNpbXVsdGFuZW91c2x5LiBTZWUgVFJNIDE1LjQuMi40LjIuMiBBbHBoYSBNb2RlICovCisKKwlpZiAobWdyLT5pbmZvLmFscGhhX2VuYWJsZWQgJiYgbWdyLT5pbmZvLnRyYW5zX2VuYWJsZWQgJiYKKwkJCW1nci0+aW5mby50cmFuc19rZXlfdHlwZSAhPSBPTUFQX0RTU19DT0xPUl9LRVlfR0ZYX0RTVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwX2Rzc19tZ3Jfc2V0X2luZm8oc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IsCisJCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlcl9pbmZvICppbmZvKQoreworCWludCByOworCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlcl9pbmZvIG9sZF9pbmZvOworCisJb2xkX2luZm8gPSBtZ3ItPmluZm87CisJbWdyLT5pbmZvID0gKmluZm87CisKKwlyID0gZHNzX2NoZWNrX21hbmFnZXIobWdyKTsKKwlpZiAocikgeworCQltZ3ItPmluZm8gPSBvbGRfaW5mbzsKKwkJcmV0dXJuIHI7CisJfQorCisJbWdyLT5pbmZvX2RpcnR5ID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvbWFwX2Rzc19tZ3JfZ2V0X2luZm8oc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IsCisJCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlcl9pbmZvICppbmZvKQoreworCSppbmZvID0gbWdyLT5pbmZvOworfQorCitzdGF0aWMgdm9pZCBvbWFwX2Rzc19hZGRfb3ZlcmxheV9tYW5hZ2VyKHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWFuYWdlcikKK3sKKwkrK251bV9tYW5hZ2VyczsKKwlsaXN0X2FkZF90YWlsKCZtYW5hZ2VyLT5saXN0LCAmbWFuYWdlcl9saXN0KTsKK30KKworaW50IGRzc19pbml0X292ZXJsYXlfbWFuYWdlcnMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgaSwgcjsKKworCXNwaW5fbG9ja19pbml0KCZkc3NfY2FjaGUubG9jayk7CisKKwlJTklUX0xJU1RfSEVBRCgmbWFuYWdlcl9saXN0KTsKKworCW51bV9tYW5hZ2VycyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisJCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyOworCQltZ3IgPSBremFsbG9jKHNpemVvZigqbWdyKSwgR0ZQX0tFUk5FTCk7CisKKwkJQlVHX09OKG1nciA9PSBOVUxMKTsKKworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSAwOgorCQkJbWdyLT5uYW1lID0gImxjZCI7CisJCQltZ3ItPmlkID0gT01BUF9EU1NfQ0hBTk5FTF9MQ0Q7CisJCQltZ3ItPnN1cHBvcnRlZF9kaXNwbGF5cyA9CisJCQkJT01BUF9ESVNQTEFZX1RZUEVfRFBJIHwgT01BUF9ESVNQTEFZX1RZUEVfREJJIHwKKwkJCQlPTUFQX0RJU1BMQVlfVFlQRV9TREkgfCBPTUFQX0RJU1BMQVlfVFlQRV9EU0k7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJbWdyLT5uYW1lID0gInR2IjsKKwkJCW1nci0+aWQgPSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUOworCQkJbWdyLT5zdXBwb3J0ZWRfZGlzcGxheXMgPSBPTUFQX0RJU1BMQVlfVFlQRV9WRU5DOworCQkJYnJlYWs7CisJCX0KKworCQltZ3ItPnNldF9kZXZpY2UgPSAmb21hcF9kc3Nfc2V0X2RldmljZTsKKwkJbWdyLT51bnNldF9kZXZpY2UgPSAmb21hcF9kc3NfdW5zZXRfZGV2aWNlOworCQltZ3ItPmFwcGx5ID0gJm9tYXBfZHNzX21ncl9hcHBseTsKKwkJbWdyLT5zZXRfbWFuYWdlcl9pbmZvID0gJm9tYXBfZHNzX21ncl9zZXRfaW5mbzsKKwkJbWdyLT5nZXRfbWFuYWdlcl9pbmZvID0gJm9tYXBfZHNzX21ncl9nZXRfaW5mbzsKKwkJbWdyLT53YWl0X2Zvcl9nbyA9ICZkc3NfbWdyX3dhaXRfZm9yX2dvOworCisJCW1nci0+Y2FwcyA9IE9NQVBfRFNTX09WTF9NR1JfQ0FQX0RJU1BDOworCisJCWRzc19vdmVybGF5X3NldHVwX2Rpc3BjX21hbmFnZXIobWdyKTsKKworCQlvbWFwX2Rzc19hZGRfb3ZlcmxheV9tYW5hZ2VyKG1ncik7CisKKwkJciA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZtZ3ItPmtvYmosICZtYW5hZ2VyX2t0eXBlLAorCQkJCSZwZGV2LT5kZXYua29iaiwgIm1hbmFnZXIlZCIsIGkpOworCisJCWlmIChyKSB7CisJCQlEU1NFUlIoImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZmlsZVxuIik7CisJCQljb250aW51ZTsKKwkJfQorCX0KKworI2lmZGVmIEw0X0VYQU1QTEUKKwl7CisJCWludCBvbWFwX2Rzc19tZ3JfYXBwbHlfbDQoc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IpCisJCXsKKwkJCURTU0RCRygib21hcF9kc3NfbWdyX2FwcGx5X2w0KCVzKVxuIiwgbWdyLT5uYW1lKTsKKworCQkJcmV0dXJuIDA7CisJCX0KKworCQlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncjsKKwkJbWdyID0ga3phbGxvYyhzaXplb2YoKm1nciksIEdGUF9LRVJORUwpOworCisJCUJVR19PTihtZ3IgPT0gTlVMTCk7CisKKwkJbWdyLT5uYW1lID0gImw0IjsKKwkJbWdyLT5zdXBwb3J0ZWRfZGlzcGxheXMgPQorCQkJT01BUF9ESVNQTEFZX1RZUEVfREJJIHwgT01BUF9ESVNQTEFZX1RZUEVfRFNJOworCisJCW1nci0+c2V0X2RldmljZSA9ICZvbWFwX2Rzc19zZXRfZGV2aWNlOworCQltZ3ItPnVuc2V0X2RldmljZSA9ICZvbWFwX2Rzc191bnNldF9kZXZpY2U7CisJCW1nci0+YXBwbHkgPSAmb21hcF9kc3NfbWdyX2FwcGx5X2w0OworCQltZ3ItPnNldF9tYW5hZ2VyX2luZm8gPSAmb21hcF9kc3NfbWdyX3NldF9pbmZvOworCQltZ3ItPmdldF9tYW5hZ2VyX2luZm8gPSAmb21hcF9kc3NfbWdyX2dldF9pbmZvOworCisJCWRzc19vdmVybGF5X3NldHVwX2w0X21hbmFnZXIobWdyKTsKKworCQlvbWFwX2Rzc19hZGRfb3ZlcmxheV9tYW5hZ2VyKG1ncik7CisKKwkJciA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZtZ3ItPmtvYmosICZtYW5hZ2VyX2t0eXBlLAorCQkJCSZwZGV2LT5kZXYua29iaiwgIm1hbmFnZXJsNCIpOworCisJCWlmIChyKQorCQkJRFNTRVJSKCJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGZpbGVcbiIpOworCX0KKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZHNzX3VuaW5pdF9vdmVybGF5X21hbmFnZXJzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3I7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJm1hbmFnZXJfbGlzdCkpIHsKKwkJbWdyID0gbGlzdF9maXJzdF9lbnRyeSgmbWFuYWdlcl9saXN0LAorCQkJCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciwgbGlzdCk7CisJCWxpc3RfZGVsKCZtZ3ItPmxpc3QpOworCQlrb2JqZWN0X2RlbCgmbWdyLT5rb2JqKTsKKwkJa29iamVjdF9wdXQoJm1nci0+a29iaik7CisJCWtmcmVlKG1ncik7CisJfQorCisJbnVtX21hbmFnZXJzID0gMDsKK30KKworaW50IG9tYXBfZHNzX2dldF9udW1fb3ZlcmxheV9tYW5hZ2Vycyh2b2lkKQoreworCXJldHVybiBudW1fbWFuYWdlcnM7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZHNzX2dldF9udW1fb3ZlcmxheV9tYW5hZ2Vycyk7CisKK3N0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqb21hcF9kc3NfZ2V0X292ZXJsYXlfbWFuYWdlcihpbnQgbnVtKQoreworCWludCBpID0gMDsKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobWdyLCAmbWFuYWdlcl9saXN0LCBsaXN0KSB7CisJCWlmIChpKysgPT0gbnVtKQorCQkJcmV0dXJuIG1ncjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9kc3NfZ2V0X292ZXJsYXlfbWFuYWdlcik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL292ZXJsYXkuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL292ZXJsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2Y5YTczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3Mvb3ZlcmxheS5jCkBAIC0wLDAgKzEsNjgwIEBACisvKgorICogbGludXgvZHJpdmVycy92aWRlby9vbWFwMi9kc3Mvb3ZlcmxheS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IFRvbWkgVmFsa2VpbmVuIDx0b21pLnZhbGtlaW5lbkBub2tpYS5jb20+CisgKgorICogU29tZSBjb2RlIGFuZCBpZGVhcyB0YWtlbiBmcm9tIGRyaXZlcnMvdmlkZW8vb21hcC8gZHJpdmVyCisgKiBieSBJbXJlIERlYWsuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjZGVmaW5lIERTU19TVUJTWVNfTkFNRSAiT1ZFUkxBWSIKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxwbGF0L2Rpc3BsYXkuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorCisjaW5jbHVkZSAiZHNzLmgiCisKK3N0YXRpYyBpbnQgbnVtX292ZXJsYXlzOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgb3ZlcmxheV9saXN0OworCitzdGF0aWMgc3NpemVfdCBvdmVybGF5X25hbWVfc2hvdyhzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgb3ZsLT5uYW1lKTsKK30KKworc3RhdGljIHNzaXplX3Qgb3ZlcmxheV9tYW5hZ2VyX3Nob3coc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsCisJCQlvdmwtPm1hbmFnZXIgPyBvdmwtPm1hbmFnZXItPm5hbWUgOiAiPG5vbmU+Iik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG92ZXJsYXlfbWFuYWdlcl9zdG9yZShzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IHNpemUpCit7CisJaW50IGksIHI7CisJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IgPSBOVUxMOworCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqb2xkX21ncjsKKwlpbnQgbGVuID0gc2l6ZTsKKworCWlmIChidWZbc2l6ZS0xXSA9PSAnXG4nKQorCQktLWxlbjsKKworCWlmIChsZW4gPiAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBvbWFwX2Rzc19nZXRfbnVtX292ZXJsYXlfbWFuYWdlcnMoKTsgKytpKSB7CisJCQltZ3IgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheV9tYW5hZ2VyKGkpOworCisJCQlpZiAoc3RybmNtcChidWYsIG1nci0+bmFtZSwgbGVuKSA9PSAwKQorCQkJCWJyZWFrOworCisJCQltZ3IgPSBOVUxMOworCQl9CisJfQorCisJaWYgKGxlbiA+IDAgJiYgbWdyID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG1ncikKKwkJRFNTREJHKCJtYW5hZ2VyICVzIGZvdW5kXG4iLCBtZ3ItPm5hbWUpOworCisJaWYgKG1nciA9PSBvdmwtPm1hbmFnZXIpCisJCXJldHVybiBzaXplOworCisJb2xkX21nciA9IG92bC0+bWFuYWdlcjsKKworCS8qIGRldGFjaCBvbGQgbWFuYWdlciAqLworCWlmIChvbGRfbWdyKSB7CisJCXIgPSBvdmwtPnVuc2V0X21hbmFnZXIob3ZsKTsKKwkJaWYgKHIpIHsKKwkJCURTU0VSUigiZGV0YWNoIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gcjsKKwkJfQorCisJCXIgPSBvbGRfbWdyLT5hcHBseShvbGRfbWdyKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwl9CisKKwlpZiAobWdyKSB7CisJCXIgPSBvdmwtPnNldF9tYW5hZ2VyKG92bCwgbWdyKTsKKwkJaWYgKHIpIHsKKwkJCURTU0VSUigiRmFpbGVkIHRvIGF0dGFjaCBvdmVybGF5XG4iKTsKKwkJCXJldHVybiByOworCQl9CisKKwkJciA9IG1nci0+YXBwbHkobWdyKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3Qgb3ZlcmxheV9pbnB1dF9zaXplX3Nob3coc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWQsJWRcbiIsCisJCQlvdmwtPmluZm8ud2lkdGgsIG92bC0+aW5mby5oZWlnaHQpOworfQorCitzdGF0aWMgc3NpemVfdCBvdmVybGF5X3NjcmVlbl93aWR0aF9zaG93KHN0cnVjdCBvbWFwX292ZXJsYXkgKm92bCwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBvdmwtPmluZm8uc2NyZWVuX3dpZHRoKTsKK30KKworc3RhdGljIHNzaXplX3Qgb3ZlcmxheV9wb3NpdGlvbl9zaG93KHN0cnVjdCBvbWFwX292ZXJsYXkgKm92bCwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkLCVkXG4iLAorCQkJb3ZsLT5pbmZvLnBvc194LCBvdmwtPmluZm8ucG9zX3kpOworfQorCitzdGF0aWMgc3NpemVfdCBvdmVybGF5X3Bvc2l0aW9uX3N0b3JlKHN0cnVjdCBvbWFwX292ZXJsYXkgKm92bCwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgcjsKKwljaGFyICpsYXN0OworCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyBpbmZvOworCisJb3ZsLT5nZXRfb3ZlcmxheV9pbmZvKG92bCwgJmluZm8pOworCisJaW5mby5wb3NfeCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmxhc3QsIDEwKTsKKwkrK2xhc3Q7CisJaWYgKGxhc3QgLSBidWYgPj0gc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpbmZvLnBvc195ID0gc2ltcGxlX3N0cnRvdWwobGFzdCwgJmxhc3QsIDEwKTsKKworCXIgPSBvdmwtPnNldF9vdmVybGF5X2luZm8ob3ZsLCAmaW5mbyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJaWYgKG92bC0+bWFuYWdlcikgeworCQlyID0gb3ZsLT5tYW5hZ2VyLT5hcHBseShvdmwtPm1hbmFnZXIpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBvdmVybGF5X291dHB1dF9zaXplX3Nob3coc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWQsJWRcbiIsCisJCQlvdmwtPmluZm8ub3V0X3dpZHRoLCBvdmwtPmluZm8ub3V0X2hlaWdodCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG92ZXJsYXlfb3V0cHV0X3NpemVfc3RvcmUoc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCWludCByOworCWNoYXIgKmxhc3Q7CisJc3RydWN0IG9tYXBfb3ZlcmxheV9pbmZvIGluZm87CisKKwlvdmwtPmdldF9vdmVybGF5X2luZm8ob3ZsLCAmaW5mbyk7CisKKwlpbmZvLm91dF93aWR0aCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmxhc3QsIDEwKTsKKwkrK2xhc3Q7CisJaWYgKGxhc3QgLSBidWYgPj0gc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpbmZvLm91dF9oZWlnaHQgPSBzaW1wbGVfc3RydG91bChsYXN0LCAmbGFzdCwgMTApOworCisJciA9IG92bC0+c2V0X292ZXJsYXlfaW5mbyhvdmwsICZpbmZvKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZiAob3ZsLT5tYW5hZ2VyKSB7CisJCXIgPSBvdmwtPm1hbmFnZXItPmFwcGx5KG92bC0+bWFuYWdlcik7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG92ZXJsYXlfZW5hYmxlZF9zaG93KHN0cnVjdCBvbWFwX292ZXJsYXkgKm92bCwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBvdmwtPmluZm8uZW5hYmxlZCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG92ZXJsYXlfZW5hYmxlZF9zdG9yZShzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IHNpemUpCit7CisJaW50IHI7CisJc3RydWN0IG9tYXBfb3ZlcmxheV9pbmZvIGluZm87CisKKwlvdmwtPmdldF9vdmVybGF5X2luZm8ob3ZsLCAmaW5mbyk7CisKKwlpbmZvLmVuYWJsZWQgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCXIgPSBvdmwtPnNldF9vdmVybGF5X2luZm8ob3ZsLCAmaW5mbyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJaWYgKG92bC0+bWFuYWdlcikgeworCQlyID0gb3ZsLT5tYW5hZ2VyLT5hcHBseShvdmwtPm1hbmFnZXIpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBvdmVybGF5X2dsb2JhbF9hbHBoYV9zaG93KHN0cnVjdCBvbWFwX292ZXJsYXkgKm92bCwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLAorCQkJb3ZsLT5pbmZvLmdsb2JhbF9hbHBoYSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG92ZXJsYXlfZ2xvYmFsX2FscGhhX3N0b3JlKHN0cnVjdCBvbWFwX292ZXJsYXkgKm92bCwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5X2luZm8gaW5mbzsKKworCW92bC0+Z2V0X292ZXJsYXlfaW5mbyhvdmwsICZpbmZvKTsKKworCS8qIFZpZGVvMSBwbGFuZSBkb2VzIG5vdCBzdXBwb3J0IGdsb2JhbCBhbHBoYQorCSAqIHRvIGFsd2F5cyBtYWtlIGl0IDI1NSBjb21wbGV0ZWx5IG9wYXF1ZQorCSAqLworCWlmIChvdmwtPmlkID09IE9NQVBfRFNTX1ZJREVPMSkKKwkJaW5mby5nbG9iYWxfYWxwaGEgPSAyNTU7CisJZWxzZQorCQlpbmZvLmdsb2JhbF9hbHBoYSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJciA9IG92bC0+c2V0X292ZXJsYXlfaW5mbyhvdmwsICZpbmZvKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZiAob3ZsLT5tYW5hZ2VyKSB7CisJCXIgPSBvdmwtPm1hbmFnZXItPmFwcGx5KG92bC0+bWFuYWdlcik7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIHNpemU7Cit9CisKK3N0cnVjdCBvdmVybGF5X2F0dHJpYnV0ZSB7CisJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3Qgb21hcF9vdmVybGF5ICosIGNoYXIgKik7CisJc3NpemVfdAkoKnN0b3JlKShzdHJ1Y3Qgb21hcF9vdmVybGF5ICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK307CisKKyNkZWZpbmUgT1ZFUkxBWV9BVFRSKF9uYW1lLCBfbW9kZSwgX3Nob3csIF9zdG9yZSkgXAorCXN0cnVjdCBvdmVybGF5X2F0dHJpYnV0ZSBvdmVybGF5X2F0dHJfIyNfbmFtZSA9IFwKKwlfX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKQorCitzdGF0aWMgT1ZFUkxBWV9BVFRSKG5hbWUsIFNfSVJVR08sIG92ZXJsYXlfbmFtZV9zaG93LCBOVUxMKTsKK3N0YXRpYyBPVkVSTEFZX0FUVFIobWFuYWdlciwgU19JUlVHT3xTX0lXVVNSLAorCQlvdmVybGF5X21hbmFnZXJfc2hvdywgb3ZlcmxheV9tYW5hZ2VyX3N0b3JlKTsKK3N0YXRpYyBPVkVSTEFZX0FUVFIoaW5wdXRfc2l6ZSwgU19JUlVHTywgb3ZlcmxheV9pbnB1dF9zaXplX3Nob3csIE5VTEwpOworc3RhdGljIE9WRVJMQVlfQVRUUihzY3JlZW5fd2lkdGgsIFNfSVJVR08sIG92ZXJsYXlfc2NyZWVuX3dpZHRoX3Nob3csIE5VTEwpOworc3RhdGljIE9WRVJMQVlfQVRUUihwb3NpdGlvbiwgU19JUlVHT3xTX0lXVVNSLAorCQlvdmVybGF5X3Bvc2l0aW9uX3Nob3csIG92ZXJsYXlfcG9zaXRpb25fc3RvcmUpOworc3RhdGljIE9WRVJMQVlfQVRUUihvdXRwdXRfc2l6ZSwgU19JUlVHT3xTX0lXVVNSLAorCQlvdmVybGF5X291dHB1dF9zaXplX3Nob3csIG92ZXJsYXlfb3V0cHV0X3NpemVfc3RvcmUpOworc3RhdGljIE9WRVJMQVlfQVRUUihlbmFibGVkLCBTX0lSVUdPfFNfSVdVU1IsCisJCW92ZXJsYXlfZW5hYmxlZF9zaG93LCBvdmVybGF5X2VuYWJsZWRfc3RvcmUpOworc3RhdGljIE9WRVJMQVlfQVRUUihnbG9iYWxfYWxwaGEsIFNfSVJVR098U19JV1VTUiwKKwkJb3ZlcmxheV9nbG9iYWxfYWxwaGFfc2hvdywgb3ZlcmxheV9nbG9iYWxfYWxwaGFfc3RvcmUpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqb3ZlcmxheV9zeXNmc19hdHRyc1tdID0geworCSZvdmVybGF5X2F0dHJfbmFtZS5hdHRyLAorCSZvdmVybGF5X2F0dHJfbWFuYWdlci5hdHRyLAorCSZvdmVybGF5X2F0dHJfaW5wdXRfc2l6ZS5hdHRyLAorCSZvdmVybGF5X2F0dHJfc2NyZWVuX3dpZHRoLmF0dHIsCisJJm92ZXJsYXlfYXR0cl9wb3NpdGlvbi5hdHRyLAorCSZvdmVybGF5X2F0dHJfb3V0cHV0X3NpemUuYXR0ciwKKwkmb3ZlcmxheV9hdHRyX2VuYWJsZWQuYXR0ciwKKwkmb3ZlcmxheV9hdHRyX2dsb2JhbF9hbHBoYS5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzc2l6ZV90IG92ZXJsYXlfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZlcmxheTsKKwlzdHJ1Y3Qgb3ZlcmxheV9hdHRyaWJ1dGUgKm92ZXJsYXlfYXR0cjsKKworCW92ZXJsYXkgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IG9tYXBfb3ZlcmxheSwga29iaik7CisJb3ZlcmxheV9hdHRyID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBvdmVybGF5X2F0dHJpYnV0ZSwgYXR0cik7CisKKwlpZiAoIW92ZXJsYXlfYXR0ci0+c2hvdykKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlyZXR1cm4gb3ZlcmxheV9hdHRyLT5zaG93KG92ZXJsYXksIGJ1Zik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG92ZXJsYXlfYXR0cl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmVybGF5OworCXN0cnVjdCBvdmVybGF5X2F0dHJpYnV0ZSAqb3ZlcmxheV9hdHRyOworCisJb3ZlcmxheSA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3Qgb21hcF9vdmVybGF5LCBrb2JqKTsKKwlvdmVybGF5X2F0dHIgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IG92ZXJsYXlfYXR0cmlidXRlLCBhdHRyKTsKKworCWlmICghb3ZlcmxheV9hdHRyLT5zdG9yZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlyZXR1cm4gb3ZlcmxheV9hdHRyLT5zdG9yZShvdmVybGF5LCBidWYsIHNpemUpOworfQorCitzdGF0aWMgc3RydWN0IHN5c2ZzX29wcyBvdmVybGF5X3N5c2ZzX29wcyA9IHsKKwkuc2hvdyA9IG92ZXJsYXlfYXR0cl9zaG93LAorCS5zdG9yZSA9IG92ZXJsYXlfYXR0cl9zdG9yZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIG92ZXJsYXlfa3R5cGUgPSB7CisJLnN5c2ZzX29wcyA9ICZvdmVybGF5X3N5c2ZzX29wcywKKwkuZGVmYXVsdF9hdHRycyA9IG92ZXJsYXlfc3lzZnNfYXR0cnMsCit9OworCisvKiBDaGVjayBpZiBvdmVybGF5IHBhcmFtZXRlcnMgYXJlIGNvbXBhdGlibGUgd2l0aCBkaXNwbGF5ICovCitpbnQgZHNzX2NoZWNrX292ZXJsYXkoc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsLCBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJc3RydWN0IG9tYXBfb3ZlcmxheV9pbmZvICppbmZvOworCXUxNiBvdXR3LCBvdXRoOworCXUxNiBkdywgZGg7CisKKwlpZiAoIWRzc2RldikKKwkJcmV0dXJuIDA7CisKKwlpZiAoIW92bC0+aW5mby5lbmFibGVkKQorCQlyZXR1cm4gMDsKKworCWluZm8gPSAmb3ZsLT5pbmZvOworCisJaWYgKGluZm8tPnBhZGRyID09IDApIHsKKwkJRFNTREJHKCJjaGVja19vdmVybGF5IGZhaWxlZDogcGFkZHIgMFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRzc2Rldi0+Z2V0X3Jlc29sdXRpb24oZHNzZGV2LCAmZHcsICZkaCk7CisKKwlEU1NEQkcoImNoZWNrX292ZXJsYXkgJWQ6ICglZCwlZCAlZHglZCAtPiAlZHglZCkgZGlzcCAoJWR4JWQpXG4iLAorCQkJb3ZsLT5pZCwKKwkJCWluZm8tPnBvc194LCBpbmZvLT5wb3NfeSwKKwkJCWluZm8tPndpZHRoLCBpbmZvLT5oZWlnaHQsCisJCQlpbmZvLT5vdXRfd2lkdGgsIGluZm8tPm91dF9oZWlnaHQsCisJCQlkdywgZGgpOworCisJaWYgKChvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX1NDQUxFKSA9PSAwKSB7CisJCW91dHcgPSBpbmZvLT53aWR0aDsKKwkJb3V0aCA9IGluZm8tPmhlaWdodDsKKwl9IGVsc2UgeworCQlpZiAoaW5mby0+b3V0X3dpZHRoID09IDApCisJCQlvdXR3ID0gaW5mby0+d2lkdGg7CisJCWVsc2UKKwkJCW91dHcgPSBpbmZvLT5vdXRfd2lkdGg7CisKKwkJaWYgKGluZm8tPm91dF9oZWlnaHQgPT0gMCkKKwkJCW91dGggPSBpbmZvLT5oZWlnaHQ7CisJCWVsc2UKKwkJCW91dGggPSBpbmZvLT5vdXRfaGVpZ2h0OworCX0KKworCWlmIChkdyA8IGluZm8tPnBvc194ICsgb3V0dykgeworCQlEU1NEQkcoImNoZWNrX292ZXJsYXkgZmFpbGVkIDE6ICVkIDwgJWQgKyAlZFxuIiwKKwkJCQlkdywgaW5mby0+cG9zX3gsIG91dHcpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZGggPCBpbmZvLT5wb3NfeSArIG91dGgpIHsKKwkJRFNTREJHKCJjaGVja19vdmVybGF5IGZhaWxlZCAyOiAlZCA8ICVkICsgJWRcbiIsCisJCQkJZGgsIGluZm8tPnBvc195LCBvdXRoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChvdmwtPnN1cHBvcnRlZF9tb2RlcyAmIGluZm8tPmNvbG9yX21vZGUpID09IDApIHsKKwkJRFNTRVJSKCJvdmVybGF5IGRvZXNuJ3Qgc3VwcG9ydCBtb2RlICVkXG4iLCBpbmZvLT5jb2xvcl9tb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNzX292bF9zZXRfb3ZlcmxheV9pbmZvKHN0cnVjdCBvbWFwX292ZXJsYXkgKm92bCwKKwkJc3RydWN0IG9tYXBfb3ZlcmxheV9pbmZvICppbmZvKQoreworCWludCByOworCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyBvbGRfaW5mbzsKKworCW9sZF9pbmZvID0gb3ZsLT5pbmZvOworCW92bC0+aW5mbyA9ICppbmZvOworCisJaWYgKG92bC0+bWFuYWdlcikgeworCQlyID0gZHNzX2NoZWNrX292ZXJsYXkob3ZsLCBvdmwtPm1hbmFnZXItPmRldmljZSk7CisJCWlmIChyKSB7CisJCQlvdmwtPmluZm8gPSBvbGRfaW5mbzsKKwkJCXJldHVybiByOworCQl9CisJfQorCisJb3ZsLT5pbmZvX2RpcnR5ID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkc3Nfb3ZsX2dldF9vdmVybGF5X2luZm8oc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsLAorCQlzdHJ1Y3Qgb21hcF9vdmVybGF5X2luZm8gKmluZm8pCit7CisJKmluZm8gPSBvdmwtPmluZm87Cit9CisKK3N0YXRpYyBpbnQgZHNzX292bF93YWl0X2Zvcl9nbyhzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwpCit7CisJcmV0dXJuIGRzc19tZ3Jfd2FpdF9mb3JfZ29fb3ZsKG92bCk7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9kc3Nfc2V0X21hbmFnZXIoc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsLAorCQlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncikKK3sKKwlpZiAoIW1ncikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAob3ZsLT5tYW5hZ2VyKSB7CisJCURTU0VSUigib3ZlcmxheSAnJXMnIGFscmVhZHkgaGFzIGEgbWFuYWdlciAnJXMnXG4iLAorCQkJCW92bC0+bmFtZSwgb3ZsLT5tYW5hZ2VyLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG92bC0+aW5mby5lbmFibGVkKSB7CisJCURTU0VSUigib3ZlcmxheSBoYXMgdG8gYmUgZGlzYWJsZWQgdG8gY2hhbmdlIHRoZSBtYW5hZ2VyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJb3ZsLT5tYW5hZ2VyID0gbWdyOworCisJZHNzX2Nsa19lbmFibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSzEpOworCS8qIFhYWDogb24gbWFudWFsIHVwZGF0ZSBkaXNwbGF5LCBpbiBhdXRvIHVwZGF0ZSBtb2RlLCBhIGJ1ZyBoYXBwZW5zCisJICogaGVyZS4gV2hlbiBhbiBvdmVybGF5IGlzIGZpcnN0IGVuYWJsZWQgb24gTENELCB0aGVuIGl0J3MgZGlzYWJsZWQsCisJICogYW5kIHRoZSBtYW5hZ2VyIGlzIGNoYW5nZWQgdG8gVFYsIHdlIHNvbWV0aW1lcyBnZXQgU1lOQ19MT1NUX0RJR0lUCisJICogZXJyb3JzLiBXYWl0aW5nIGJlZm9yZSBjaGFuZ2luZyB0aGUgY2hhbm5lbF9vdXQgZml4ZXMgaXQuIEknbQorCSAqIGd1ZXNzaW5nIHRoYXQgdGhlIG92ZXJsYXkgaXMgc3RpbGwgc29tZWhvdyBiZWluZyB1c2VkIGZvciB0aGUgTENELAorCSAqIGJ1dCBJIGRvbid0IHVuZGVyc3RhbmQgaG93IG9yIHdoeS4gKi8KKwltc2xlZXAoNDApOworCWRpc3BjX3NldF9jaGFubmVsX291dChvdmwtPmlkLCBtZ3ItPmlkKTsKKwlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSzEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9kc3NfdW5zZXRfbWFuYWdlcihzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwpCit7CisJaW50IHI7CisKKwlpZiAoIW92bC0+bWFuYWdlcikgeworCQlEU1NFUlIoImZhaWxlZCB0byBkZXRhY2ggb3ZlcmxheTogbWFuYWdlciBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG92bC0+aW5mby5lbmFibGVkKSB7CisJCURTU0VSUigib3ZlcmxheSBoYXMgdG8gYmUgZGlzYWJsZWQgdG8gdW5zZXQgdGhlIG1hbmFnZXJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyID0gb3ZsLT53YWl0X2Zvcl9nbyhvdmwpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCW92bC0+bWFuYWdlciA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG9tYXBfZHNzX2dldF9udW1fb3ZlcmxheXModm9pZCkKK3sKKwlyZXR1cm4gbnVtX292ZXJsYXlzOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2Rzc19nZXRfbnVtX292ZXJsYXlzKTsKKworc3RydWN0IG9tYXBfb3ZlcmxheSAqb21hcF9kc3NfZ2V0X292ZXJsYXkoaW50IG51bSkKK3sKKwlpbnQgaSA9IDA7CisJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShvdmwsICZvdmVybGF5X2xpc3QsIGxpc3QpIHsKKwkJaWYgKGkrKyA9PSBudW0pCisJCQlyZXR1cm4gb3ZsOworCX0KKworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2Rzc19nZXRfb3ZlcmxheSk7CisKK3N0YXRpYyB2b2lkIG9tYXBfZHNzX2FkZF9vdmVybGF5KHN0cnVjdCBvbWFwX292ZXJsYXkgKm92ZXJsYXkpCit7CisJKytudW1fb3ZlcmxheXM7CisJbGlzdF9hZGRfdGFpbCgmb3ZlcmxheS0+bGlzdCwgJm92ZXJsYXlfbGlzdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9vdmVybGF5ICpkaXNwY19vdmVybGF5c1szXTsKKwordm9pZCBkc3Nfb3ZlcmxheV9zZXR1cF9kaXNwY19tYW5hZ2VyKHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyKQoreworCW1nci0+bnVtX292ZXJsYXlzID0gMzsKKwltZ3ItPm92ZXJsYXlzID0gZGlzcGNfb3ZlcmxheXM7Cit9CisKKyNpZmRlZiBMNF9FWEFNUExFCitzdGF0aWMgc3RydWN0IG9tYXBfb3ZlcmxheSAqbDRfb3ZlcmxheXNbMV07Cit2b2lkIGRzc19vdmVybGF5X3NldHVwX2w0X21hbmFnZXIoc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IpCit7CisJbWdyLT5udW1fb3ZlcmxheXMgPSAxOworCW1nci0+b3ZlcmxheXMgPSBsNF9vdmVybGF5czsKK30KKyNlbmRpZgorCit2b2lkIGRzc19pbml0X292ZXJsYXlzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGksIHI7CisKKwlJTklUX0xJU1RfSEVBRCgmb3ZlcmxheV9saXN0KTsKKworCW51bV9vdmVybGF5cyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7CisJCXN0cnVjdCBvbWFwX292ZXJsYXkgKm92bDsKKwkJb3ZsID0ga3phbGxvYyhzaXplb2YoKm92bCksIEdGUF9LRVJORUwpOworCisJCUJVR19PTihvdmwgPT0gTlVMTCk7CisKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJCW92bC0+bmFtZSA9ICJnZngiOworCQkJb3ZsLT5pZCA9IE9NQVBfRFNTX0dGWDsKKwkJCW92bC0+c3VwcG9ydGVkX21vZGVzID0gY3B1X2lzX29tYXAzNHh4KCkgPworCQkJCU9NQVBfRFNTX0NPTE9SX0dGWF9PTUFQMyA6CisJCQkJT01BUF9EU1NfQ09MT1JfR0ZYX09NQVAyOworCQkJb3ZsLT5jYXBzID0gT01BUF9EU1NfT1ZMX0NBUF9ESVNQQzsKKwkJCW92bC0+aW5mby5nbG9iYWxfYWxwaGEgPSAyNTU7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJb3ZsLT5uYW1lID0gInZpZDEiOworCQkJb3ZsLT5pZCA9IE9NQVBfRFNTX1ZJREVPMTsKKwkJCW92bC0+c3VwcG9ydGVkX21vZGVzID0gY3B1X2lzX29tYXAzNHh4KCkgPworCQkJCU9NQVBfRFNTX0NPTE9SX1ZJRDFfT01BUDMgOgorCQkJCU9NQVBfRFNTX0NPTE9SX1ZJRF9PTUFQMjsKKwkJCW92bC0+Y2FwcyA9IE9NQVBfRFNTX09WTF9DQVBfU0NBTEUgfAorCQkJCU9NQVBfRFNTX09WTF9DQVBfRElTUEM7CisJCQlvdmwtPmluZm8uZ2xvYmFsX2FscGhhID0gMjU1OworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCW92bC0+bmFtZSA9ICJ2aWQyIjsKKwkJCW92bC0+aWQgPSBPTUFQX0RTU19WSURFTzI7CisJCQlvdmwtPnN1cHBvcnRlZF9tb2RlcyA9IGNwdV9pc19vbWFwMzR4eCgpID8KKwkJCQlPTUFQX0RTU19DT0xPUl9WSUQyX09NQVAzIDoKKwkJCQlPTUFQX0RTU19DT0xPUl9WSURfT01BUDI7CisJCQlvdmwtPmNhcHMgPSBPTUFQX0RTU19PVkxfQ0FQX1NDQUxFIHwKKwkJCQlPTUFQX0RTU19PVkxfQ0FQX0RJU1BDOworCQkJb3ZsLT5pbmZvLmdsb2JhbF9hbHBoYSA9IDI1NTsKKwkJCWJyZWFrOworCQl9CisKKwkJb3ZsLT5zZXRfbWFuYWdlciA9ICZvbWFwX2Rzc19zZXRfbWFuYWdlcjsKKwkJb3ZsLT51bnNldF9tYW5hZ2VyID0gJm9tYXBfZHNzX3Vuc2V0X21hbmFnZXI7CisJCW92bC0+c2V0X292ZXJsYXlfaW5mbyA9ICZkc3Nfb3ZsX3NldF9vdmVybGF5X2luZm87CisJCW92bC0+Z2V0X292ZXJsYXlfaW5mbyA9ICZkc3Nfb3ZsX2dldF9vdmVybGF5X2luZm87CisJCW92bC0+d2FpdF9mb3JfZ28gPSAmZHNzX292bF93YWl0X2Zvcl9nbzsKKworCQlvbWFwX2Rzc19hZGRfb3ZlcmxheShvdmwpOworCisJCXIgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmb3ZsLT5rb2JqLCAmb3ZlcmxheV9rdHlwZSwKKwkJCQkmcGRldi0+ZGV2LmtvYmosICJvdmVybGF5JWQiLCBpKTsKKworCQlpZiAocikgeworCQkJRFNTRVJSKCJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGZpbGVcbiIpOworCQkJY29udGludWU7CisJCX0KKworCQlkaXNwY19vdmVybGF5c1tpXSA9IG92bDsKKwl9CisKKyNpZmRlZiBMNF9FWEFNUExFCisJeworCQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7CisJCW92bCA9IGt6YWxsb2Moc2l6ZW9mKCpvdmwpLCBHRlBfS0VSTkVMKTsKKworCQlCVUdfT04ob3ZsID09IE5VTEwpOworCisJCW92bC0+bmFtZSA9ICJsNCI7CisJCW92bC0+c3VwcG9ydGVkX21vZGVzID0gT01BUF9EU1NfQ09MT1JfUkdCMjRVOworCisJCW92bC0+c2V0X21hbmFnZXIgPSAmb21hcF9kc3Nfc2V0X21hbmFnZXI7CisJCW92bC0+dW5zZXRfbWFuYWdlciA9ICZvbWFwX2Rzc191bnNldF9tYW5hZ2VyOworCQlvdmwtPnNldF9vdmVybGF5X2luZm8gPSAmZHNzX292bF9zZXRfb3ZlcmxheV9pbmZvOworCQlvdmwtPmdldF9vdmVybGF5X2luZm8gPSAmZHNzX292bF9nZXRfb3ZlcmxheV9pbmZvOworCisJCW9tYXBfZHNzX2FkZF9vdmVybGF5KG92bCk7CisKKwkJciA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZvdmwtPmtvYmosICZvdmVybGF5X2t0eXBlLAorCQkJCSZwZGV2LT5kZXYua29iaiwgIm92ZXJsYXlsNCIpOworCisJCWlmIChyKQorCQkJRFNTRVJSKCJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGZpbGVcbiIpOworCisJCWw0X292ZXJsYXlzWzBdID0gb3ZsOworCX0KKyNlbmRpZgorfQorCisvKiBjb25uZWN0IG92ZXJsYXlzIHRvIHRoZSBuZXcgZGV2aWNlLCBpZiBub3QgYWxyZWFkeSBjb25uZWN0ZWQuIGlmIGZvcmNlCisgKiBzZWxlY3RlZCwgY29ubmVjdCBhbHdheXMuICovCit2b2lkIGRzc19yZWNoZWNrX2Nvbm5lY3Rpb25zKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgYm9vbCBmb3JjZSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKmxjZF9tZ3I7CisJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICp0dl9tZ3I7CisJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IgPSBOVUxMOworCisJbGNkX21nciA9IG9tYXBfZHNzX2dldF9vdmVybGF5X21hbmFnZXIoT01BUF9EU1NfT1ZMX01HUl9MQ0QpOworCXR2X21nciA9IG9tYXBfZHNzX2dldF9vdmVybGF5X21hbmFnZXIoT01BUF9EU1NfT1ZMX01HUl9UVik7CisKKwlpZiAoZHNzZGV2LT50eXBlICE9IE9NQVBfRElTUExBWV9UWVBFX1ZFTkMpIHsKKwkJaWYgKCFsY2RfbWdyLT5kZXZpY2UgfHwgZm9yY2UpIHsKKwkJCWlmIChsY2RfbWdyLT5kZXZpY2UpCisJCQkJbGNkX21nci0+dW5zZXRfZGV2aWNlKGxjZF9tZ3IpOworCQkJbGNkX21nci0+c2V0X2RldmljZShsY2RfbWdyLCBkc3NkZXYpOworCQkJbWdyID0gbGNkX21ncjsKKwkJfQorCX0KKworCWlmIChkc3NkZXYtPnR5cGUgPT0gT01BUF9ESVNQTEFZX1RZUEVfVkVOQykgeworCQlpZiAoIXR2X21nci0+ZGV2aWNlIHx8IGZvcmNlKSB7CisJCQlpZiAodHZfbWdyLT5kZXZpY2UpCisJCQkJdHZfbWdyLT51bnNldF9kZXZpY2UodHZfbWdyKTsKKwkJCXR2X21nci0+c2V0X2RldmljZSh0dl9tZ3IsIGRzc2Rldik7CisJCQltZ3IgPSB0dl9tZ3I7CisJCX0KKwl9CisKKwlpZiAobWdyKSB7CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCXN0cnVjdCBvbWFwX292ZXJsYXkgKm92bDsKKwkJCW92bCA9IG9tYXBfZHNzX2dldF9vdmVybGF5KGkpOworCQkJaWYgKCFvdmwtPm1hbmFnZXIgfHwgZm9yY2UpIHsKKwkJCQlpZiAob3ZsLT5tYW5hZ2VyKQorCQkJCQlvbWFwX2Rzc191bnNldF9tYW5hZ2VyKG92bCk7CisJCQkJb21hcF9kc3Nfc2V0X21hbmFnZXIob3ZsLCBtZ3IpOworCQkJfQorCQl9CisJfQorfQorCit2b2lkIGRzc191bmluaXRfb3ZlcmxheXMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJm92ZXJsYXlfbGlzdCkpIHsKKwkJb3ZsID0gbGlzdF9maXJzdF9lbnRyeSgmb3ZlcmxheV9saXN0LAorCQkJCXN0cnVjdCBvbWFwX292ZXJsYXksIGxpc3QpOworCQlsaXN0X2RlbCgmb3ZsLT5saXN0KTsKKwkJa29iamVjdF9kZWwoJm92bC0+a29iaik7CisJCWtvYmplY3RfcHV0KCZvdmwtPmtvYmopOworCQlrZnJlZShvdmwpOworCX0KKworCW51bV9vdmVybGF5cyA9IDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3JmYmkuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3JmYmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGIzMDA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvcmZiaS5jCkBAIC0wLDAgKzEsMTMwOSBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3JmYmkuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBUb21pIFZhbGtlaW5lbiA8dG9taS52YWxrZWluZW5Abm9raWEuY29tPgorICoKKyAqIFNvbWUgY29kZSBhbmQgaWRlYXMgdGFrZW4gZnJvbSBkcml2ZXJzL3ZpZGVvL29tYXAvIGRyaXZlcgorICogYnkgSW1yZSBEZWFrLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2RlZmluZSBEU1NfU1VCU1lTX05BTUUgIlJGQkkiCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSA8cGxhdC9kaXNwbGF5Lmg+CisjaW5jbHVkZSAiZHNzLmgiCisKKy8qI2RlZmluZSBNRUFTVVJFX1BFUkYqLworCisjZGVmaW5lIFJGQklfQkFTRSAgICAgICAgICAgICAgIDB4NDgwNTA4MDAKKworc3RydWN0IHJmYmlfcmVnIHsgdTE2IGlkeDsgfTsKKworI2RlZmluZSBSRkJJX1JFRyhpZHgpCQkoKGNvbnN0IHN0cnVjdCByZmJpX3JlZykgeyBpZHggfSkKKworI2RlZmluZSBSRkJJX1JFVklTSU9OCQlSRkJJX1JFRygweDAwMDApCisjZGVmaW5lIFJGQklfU1lTQ09ORklHCQlSRkJJX1JFRygweDAwMTApCisjZGVmaW5lIFJGQklfU1lTU1RBVFVTCQlSRkJJX1JFRygweDAwMTQpCisjZGVmaW5lIFJGQklfQ09OVFJPTAkJUkZCSV9SRUcoMHgwMDQwKQorI2RlZmluZSBSRkJJX1BJWEVMX0NOVAkJUkZCSV9SRUcoMHgwMDQ0KQorI2RlZmluZSBSRkJJX0xJTkVfTlVNQkVSCVJGQklfUkVHKDB4MDA0OCkKKyNkZWZpbmUgUkZCSV9DTUQJCVJGQklfUkVHKDB4MDA0YykKKyNkZWZpbmUgUkZCSV9QQVJBTQkJUkZCSV9SRUcoMHgwMDUwKQorI2RlZmluZSBSRkJJX0RBVEEJCVJGQklfUkVHKDB4MDA1NCkKKyNkZWZpbmUgUkZCSV9SRUFECQlSRkJJX1JFRygweDAwNTgpCisjZGVmaW5lIFJGQklfU1RBVFVTCQlSRkJJX1JFRygweDAwNWMpCisKKyNkZWZpbmUgUkZCSV9DT05GSUcobikJCVJGQklfUkVHKDB4MDA2MCArIChuKSoweDE4KQorI2RlZmluZSBSRkJJX09OT0ZGX1RJTUUobikJUkZCSV9SRUcoMHgwMDY0ICsgKG4pKjB4MTgpCisjZGVmaW5lIFJGQklfQ1lDTEVfVElNRShuKQlSRkJJX1JFRygweDAwNjggKyAobikqMHgxOCkKKyNkZWZpbmUgUkZCSV9EQVRBX0NZQ0xFMShuKQlSRkJJX1JFRygweDAwNmMgKyAobikqMHgxOCkKKyNkZWZpbmUgUkZCSV9EQVRBX0NZQ0xFMihuKQlSRkJJX1JFRygweDAwNzAgKyAobikqMHgxOCkKKyNkZWZpbmUgUkZCSV9EQVRBX0NZQ0xFMyhuKQlSRkJJX1JFRygweDAwNzQgKyAobikqMHgxOCkKKworI2RlZmluZSBSRkJJX1ZTWU5DX1dJRFRICVJGQklfUkVHKDB4MDA5MCkKKyNkZWZpbmUgUkZCSV9IU1lOQ19XSURUSAlSRkJJX1JFRygweDAwOTQpCisKKyNkZWZpbmUgUkZCSV9DTURfRklGT19MRU5fQllURVMgKDE2ICogc2l6ZW9mKHN0cnVjdCB1cGRhdGVfcGFyYW0pKQorCisjZGVmaW5lIFJFR19GTERfTU9EKGlkeCwgdmFsLCBzdGFydCwgZW5kKSBcCisJcmZiaV93cml0ZV9yZWcoaWR4LCBGTERfTU9EKHJmYmlfcmVhZF9yZWcoaWR4KSwgdmFsLCBzdGFydCwgZW5kKSkKKworLyogVG8gd29yayBhcm91bmQgYW4gUkZCSSB0cmFuc2ZlciByYXRlIGxpbWl0YXRpb24gKi8KKyNkZWZpbmUgT01BUF9SRkJJX1JBVEVfTElNSVQgICAgMQorCitlbnVtIG9tYXBfcmZiaV9jeWNsZWZvcm1hdCB7CisJT01BUF9EU1NfUkZCSV9DWUNMRUZPUk1BVF8xXzEgPSAwLAorCU9NQVBfRFNTX1JGQklfQ1lDTEVGT1JNQVRfMl8xID0gMSwKKwlPTUFQX0RTU19SRkJJX0NZQ0xFRk9STUFUXzNfMSA9IDIsCisJT01BUF9EU1NfUkZCSV9DWUNMRUZPUk1BVF8zXzIgPSAzLAorfTsKKworZW51bSBvbWFwX3JmYmlfZGF0YXR5cGUgeworCU9NQVBfRFNTX1JGQklfREFUQVRZUEVfMTIgPSAwLAorCU9NQVBfRFNTX1JGQklfREFUQVRZUEVfMTYgPSAxLAorCU9NQVBfRFNTX1JGQklfREFUQVRZUEVfMTggPSAyLAorCU9NQVBfRFNTX1JGQklfREFUQVRZUEVfMjQgPSAzLAorfTsKKworZW51bSBvbWFwX3JmYmlfcGFyYWxsZWxtb2RlIHsKKwlPTUFQX0RTU19SRkJJX1BBUkFMTEVMTU9ERV84ID0gMCwKKwlPTUFQX0RTU19SRkJJX1BBUkFMTEVMTU9ERV85ID0gMSwKKwlPTUFQX0RTU19SRkJJX1BBUkFMTEVMTU9ERV8xMiA9IDIsCisJT01BUF9EU1NfUkZCSV9QQVJBTExFTE1PREVfMTYgPSAzLAorfTsKKworZW51bSB1cGRhdGVfY21kIHsKKwlSRkJJX0NNRF9VUERBVEUgPSAwLAorCVJGQklfQ01EX1NZTkMgICA9IDEsCit9OworCitzdGF0aWMgaW50IHJmYmlfY29udmVydF90aW1pbmdzKHN0cnVjdCByZmJpX3RpbWluZ3MgKnQpOworc3RhdGljIHZvaWQgcmZiaV9nZXRfY2xrX2luZm8odTMyICpjbGtfcGVyaW9kLCB1MzIgKm1heF9jbGtfZGl2KTsKK3N0YXRpYyB2b2lkIHByb2Nlc3NfY21kX2ZpZm8odm9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgeworCXZvaWQgX19pb21lbQkqYmFzZTsKKworCXVuc2lnbmVkIGxvbmcJbDRfa2h6OworCisJZW51bSBvbWFwX3JmYmlfZGF0YXR5cGUgZGF0YXR5cGU7CisJZW51bSBvbWFwX3JmYmlfcGFyYWxsZWxtb2RlIHBhcmFsbGVsbW9kZTsKKworCWVudW0gb21hcF9yZmJpX3RlX21vZGUgdGVfbW9kZTsKKwlpbnQgdGVfZW5hYmxlZDsKKworCXZvaWQgKCpmcmFtZWRvbmVfY2FsbGJhY2spKHZvaWQgKmRhdGEpOworCXZvaWQgKmZyYW1lZG9uZV9jYWxsYmFja19kYXRhOworCisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2WzJdOworCisJc3RydWN0IGtmaWZvICAgICAgKmNtZF9maWZvOworCXNwaW5sb2NrX3QgICAgICAgIGNtZF9sb2NrOworCXN0cnVjdCBjb21wbGV0aW9uIGNtZF9kb25lOworCWF0b21pY190ICAgICAgICAgIGNtZF9maWZvX2Z1bGw7CisJYXRvbWljX3QgICAgICAgICAgY21kX3BlbmRpbmc7CisjaWZkZWYgTUVBU1VSRV9QRVJGCisJdW5zaWduZWQgcGVyZl9ieXRlczsKKwlrdGltZV90IHBlcmZfc2V0dXBfdGltZTsKKwlrdGltZV90IHBlcmZfc3RhcnRfdGltZTsKKyNlbmRpZgorfSByZmJpOworCitzdHJ1Y3QgdXBkYXRlX3JlZ2lvbiB7CisJdTE2CXg7CisJdTE2ICAgICB5OworCXUxNiAgICAgdzsKKwl1MTYgICAgIGg7Cit9OworCitzdHJ1Y3QgdXBkYXRlX3BhcmFtIHsKKwl1OCByZmJpX21vZHVsZTsKKwl1OCBjbWQ7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB1cGRhdGVfcmVnaW9uIHI7CisJCXN0cnVjdCBjb21wbGV0aW9uICpzeW5jOworCX0gcGFyOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHJmYmlfd3JpdGVfcmVnKGNvbnN0IHN0cnVjdCByZmJpX3JlZyBpZHgsIHUzMiB2YWwpCit7CisJX19yYXdfd3JpdGVsKHZhbCwgcmZiaS5iYXNlICsgaWR4LmlkeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHJmYmlfcmVhZF9yZWcoY29uc3Qgc3RydWN0IHJmYmlfcmVnIGlkeCkKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwocmZiaS5iYXNlICsgaWR4LmlkeCk7Cit9CisKK3N0YXRpYyB2b2lkIHJmYmlfZW5hYmxlX2Nsb2Nrcyhib29sIGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKQorCQlkc3NfY2xrX2VuYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLMSk7CisJZWxzZQorCQlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSzEpOworfQorCit2b2lkIG9tYXBfcmZiaV93cml0ZV9jb21tYW5kKGNvbnN0IHZvaWQgKmJ1ZiwgdTMyIGxlbikKK3sKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMSk7CisJc3dpdGNoIChyZmJpLnBhcmFsbGVsbW9kZSkgeworCWNhc2UgT01BUF9EU1NfUkZCSV9QQVJBTExFTE1PREVfODoKKwl7CisJCWNvbnN0IHU4ICpiID0gYnVmOworCQlmb3IgKDsgbGVuOyBsZW4tLSkKKwkJCXJmYmlfd3JpdGVfcmVnKFJGQklfQ01ELCAqYisrKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBPTUFQX0RTU19SRkJJX1BBUkFMTEVMTU9ERV8xNjoKKwl7CisJCWNvbnN0IHUxNiAqdyA9IGJ1ZjsKKwkJQlVHX09OKGxlbiAmIDEpOworCQlmb3IgKDsgbGVuOyBsZW4gLT0gMikKKwkJCXJmYmlfd3JpdGVfcmVnKFJGQklfQ01ELCAqdysrKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBPTUFQX0RTU19SRkJJX1BBUkFMTEVMTU9ERV85OgorCWNhc2UgT01BUF9EU1NfUkZCSV9QQVJBTExFTE1PREVfMTI6CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9yZmJpX3dyaXRlX2NvbW1hbmQpOworCit2b2lkIG9tYXBfcmZiaV9yZWFkX2RhdGEodm9pZCAqYnVmLCB1MzIgbGVuKQoreworCXJmYmlfZW5hYmxlX2Nsb2NrcygxKTsKKwlzd2l0Y2ggKHJmYmkucGFyYWxsZWxtb2RlKSB7CisJY2FzZSBPTUFQX0RTU19SRkJJX1BBUkFMTEVMTU9ERV84OgorCXsKKwkJdTggKmIgPSBidWY7CisJCWZvciAoOyBsZW47IGxlbi0tKSB7CisJCQlyZmJpX3dyaXRlX3JlZyhSRkJJX1JFQUQsIDApOworCQkJKmIrKyA9IHJmYmlfcmVhZF9yZWcoUkZCSV9SRUFEKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIE9NQVBfRFNTX1JGQklfUEFSQUxMRUxNT0RFXzE2OgorCXsKKwkJdTE2ICp3ID0gYnVmOworCQlCVUdfT04obGVuICYgfjEpOworCQlmb3IgKDsgbGVuOyBsZW4gLT0gMikgeworCQkJcmZiaV93cml0ZV9yZWcoUkZCSV9SRUFELCAwKTsKKwkJCSp3KysgPSByZmJpX3JlYWRfcmVnKFJGQklfUkVBRCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBPTUFQX0RTU19SRkJJX1BBUkFMTEVMTU9ERV85OgorCWNhc2UgT01BUF9EU1NfUkZCSV9QQVJBTExFTE1PREVfMTI6CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9yZmJpX3JlYWRfZGF0YSk7CisKK3ZvaWQgb21hcF9yZmJpX3dyaXRlX2RhdGEoY29uc3Qgdm9pZCAqYnVmLCB1MzIgbGVuKQoreworCXJmYmlfZW5hYmxlX2Nsb2NrcygxKTsKKwlzd2l0Y2ggKHJmYmkucGFyYWxsZWxtb2RlKSB7CisJY2FzZSBPTUFQX0RTU19SRkJJX1BBUkFMTEVMTU9ERV84OgorCXsKKwkJY29uc3QgdTggKmIgPSBidWY7CisJCWZvciAoOyBsZW47IGxlbi0tKQorCQkJcmZiaV93cml0ZV9yZWcoUkZCSV9QQVJBTSwgKmIrKyk7CisJCWJyZWFrOworCX0KKworCWNhc2UgT01BUF9EU1NfUkZCSV9QQVJBTExFTE1PREVfMTY6CisJeworCQljb25zdCB1MTYgKncgPSBidWY7CisJCUJVR19PTihsZW4gJiAxKTsKKwkJZm9yICg7IGxlbjsgbGVuIC09IDIpCisJCQlyZmJpX3dyaXRlX3JlZyhSRkJJX1BBUkFNLCAqdysrKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBPTUFQX0RTU19SRkJJX1BBUkFMTEVMTU9ERV85OgorCWNhc2UgT01BUF9EU1NfUkZCSV9QQVJBTExFTE1PREVfMTI6CisJZGVmYXVsdDoKKwkJQlVHKCk7CisKKwl9CisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworfQorRVhQT1JUX1NZTUJPTChvbWFwX3JmYmlfd3JpdGVfZGF0YSk7CisKK3ZvaWQgb21hcF9yZmJpX3dyaXRlX3BpeGVscyhjb25zdCB2b2lkIF9faW9tZW0gKmJ1ZiwgaW50IHNjcl93aWR0aCwKKwkJdTE2IHgsIHUxNiB5LAorCQl1MTYgdywgdTE2IGgpCit7CisJaW50IHN0YXJ0X29mZnNldCA9IHNjcl93aWR0aCAqIHkgKyB4OworCWludCBob3Jpel9vZmZzZXQgPSBzY3Jfd2lkdGggLSB3OworCWludCBpOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCisJaWYgKHJmYmkuZGF0YXR5cGUgPT0gT01BUF9EU1NfUkZCSV9EQVRBVFlQRV8xNiAmJgorCSAgIHJmYmkucGFyYWxsZWxtb2RlID09IE9NQVBfRFNTX1JGQklfUEFSQUxMRUxNT0RFXzgpIHsKKwkJY29uc3QgdTE2IF9faW9tZW0gKnBkID0gYnVmOworCQlwZCArPSBzdGFydF9vZmZzZXQ7CisKKwkJZm9yICg7IGg7IC0taCkgeworCQkJZm9yIChpID0gMDsgaSA8IHc7ICsraSkgeworCQkJCWNvbnN0IHU4IF9faW9tZW0gKmIgPSAoY29uc3QgdTggX19pb21lbSAqKXBkOworCQkJCXJmYmlfd3JpdGVfcmVnKFJGQklfUEFSQU0sIF9fcmF3X3JlYWRiKGIrMSkpOworCQkJCXJmYmlfd3JpdGVfcmVnKFJGQklfUEFSQU0sIF9fcmF3X3JlYWRiKGIrMCkpOworCQkJCSsrcGQ7CisJCQl9CisJCQlwZCArPSBob3Jpel9vZmZzZXQ7CisJCX0KKwl9IGVsc2UgaWYgKHJmYmkuZGF0YXR5cGUgPT0gT01BUF9EU1NfUkZCSV9EQVRBVFlQRV8yNCAmJgorCSAgIHJmYmkucGFyYWxsZWxtb2RlID09IE9NQVBfRFNTX1JGQklfUEFSQUxMRUxNT0RFXzgpIHsKKwkJY29uc3QgdTMyIF9faW9tZW0gKnBkID0gYnVmOworCQlwZCArPSBzdGFydF9vZmZzZXQ7CisKKwkJZm9yICg7IGg7IC0taCkgeworCQkJZm9yIChpID0gMDsgaSA8IHc7ICsraSkgeworCQkJCWNvbnN0IHU4IF9faW9tZW0gKmIgPSAoY29uc3QgdTggX19pb21lbSAqKXBkOworCQkJCXJmYmlfd3JpdGVfcmVnKFJGQklfUEFSQU0sIF9fcmF3X3JlYWRiKGIrMikpOworCQkJCXJmYmlfd3JpdGVfcmVnKFJGQklfUEFSQU0sIF9fcmF3X3JlYWRiKGIrMSkpOworCQkJCXJmYmlfd3JpdGVfcmVnKFJGQklfUEFSQU0sIF9fcmF3X3JlYWRiKGIrMCkpOworCQkJCSsrcGQ7CisJCQl9CisJCQlwZCArPSBob3Jpel9vZmZzZXQ7CisJCX0KKwl9IGVsc2UgaWYgKHJmYmkuZGF0YXR5cGUgPT0gT01BUF9EU1NfUkZCSV9EQVRBVFlQRV8xNiAmJgorCSAgIHJmYmkucGFyYWxsZWxtb2RlID09IE9NQVBfRFNTX1JGQklfUEFSQUxMRUxNT0RFXzE2KSB7CisJCWNvbnN0IHUxNiBfX2lvbWVtICpwZCA9IGJ1ZjsKKwkJcGQgKz0gc3RhcnRfb2Zmc2V0OworCisJCWZvciAoOyBoOyAtLWgpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCB3OyArK2kpIHsKKwkJCQlyZmJpX3dyaXRlX3JlZyhSRkJJX1BBUkFNLCBfX3Jhd19yZWFkdyhwZCkpOworCQkJCSsrcGQ7CisJCQl9CisJCQlwZCArPSBob3Jpel9vZmZzZXQ7CisJCX0KKwl9IGVsc2UgeworCQlCVUcoKTsKKwl9CisKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMCk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfcmZiaV93cml0ZV9waXhlbHMpOworCisjaWZkZWYgTUVBU1VSRV9QRVJGCitzdGF0aWMgdm9pZCBwZXJmX21hcmtfc2V0dXAodm9pZCkKK3sKKwlyZmJpLnBlcmZfc2V0dXBfdGltZSA9IGt0aW1lX2dldCgpOworfQorCitzdGF0aWMgdm9pZCBwZXJmX21hcmtfc3RhcnQodm9pZCkKK3sKKwlyZmJpLnBlcmZfc3RhcnRfdGltZSA9IGt0aW1lX2dldCgpOworfQorCitzdGF0aWMgdm9pZCBwZXJmX3Nob3coY29uc3QgY2hhciAqbmFtZSkKK3sKKwlrdGltZV90IHQsIHNldHVwX3RpbWUsIHRyYW5zX3RpbWU7CisJdTMyIHRvdGFsX2J5dGVzOworCXUzMiBzZXR1cF91cywgdHJhbnNfdXMsIHRvdGFsX3VzOworCisJdCA9IGt0aW1lX2dldCgpOworCisJc2V0dXBfdGltZSA9IGt0aW1lX3N1YihyZmJpLnBlcmZfc3RhcnRfdGltZSwgcmZiaS5wZXJmX3NldHVwX3RpbWUpOworCXNldHVwX3VzID0gKHUzMilrdGltZV90b191cyhzZXR1cF90aW1lKTsKKwlpZiAoc2V0dXBfdXMgPT0gMCkKKwkJc2V0dXBfdXMgPSAxOworCisJdHJhbnNfdGltZSA9IGt0aW1lX3N1Yih0LCByZmJpLnBlcmZfc3RhcnRfdGltZSk7CisJdHJhbnNfdXMgPSAodTMyKWt0aW1lX3RvX3VzKHRyYW5zX3RpbWUpOworCWlmICh0cmFuc191cyA9PSAwKQorCQl0cmFuc191cyA9IDE7CisKKwl0b3RhbF91cyA9IHNldHVwX3VzICsgdHJhbnNfdXM7CisKKwl0b3RhbF9ieXRlcyA9IHJmYmkucGVyZl9ieXRlczsKKworCURTU0lORk8oIiVzIHVwZGF0ZSAldSB1cyArICV1IHVzID0gJXUgdXMgKCV1SHopLCAldSBieXRlcywgIgorCQkJIiV1IGtieXRlcy9zZWNcbiIsCisJCQluYW1lLAorCQkJc2V0dXBfdXMsCisJCQl0cmFuc191cywKKwkJCXRvdGFsX3VzLAorCQkJMTAwMCoxMDAwIC8gdG90YWxfdXMsCisJCQl0b3RhbF9ieXRlcywKKwkJCXRvdGFsX2J5dGVzICogMTAwMCAvIHRvdGFsX3VzKTsKK30KKyNlbHNlCisjZGVmaW5lIHBlcmZfbWFya19zZXR1cCgpCisjZGVmaW5lIHBlcmZfbWFya19zdGFydCgpCisjZGVmaW5lIHBlcmZfc2hvdyh4KQorI2VuZGlmCisKK3ZvaWQgcmZiaV90cmFuc2Zlcl9hcmVhKHUxNiB3aWR0aCwgdTE2IGhlaWdodCwKKwkJCSAgICAgdm9pZCAoY2FsbGJhY2spKHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKQoreworCXUzMiBsOworCisJLypCVUdfT04oY2FsbGJhY2sgPT0gMCk7Ki8KKwlCVUdfT04ocmZiaS5mcmFtZWRvbmVfY2FsbGJhY2sgIT0gTlVMTCk7CisKKwlEU1NEQkcoInJmYmlfdHJhbnNmZXJfYXJlYSAlZHglZFxuIiwgd2lkdGgsIGhlaWdodCk7CisKKwlkaXNwY19zZXRfbGNkX3NpemUod2lkdGgsIGhlaWdodCk7CisKKwlkaXNwY19lbmFibGVfbGNkX291dCgxKTsKKworCXJmYmkuZnJhbWVkb25lX2NhbGxiYWNrID0gY2FsbGJhY2s7CisJcmZiaS5mcmFtZWRvbmVfY2FsbGJhY2tfZGF0YSA9IGRhdGE7CisKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMSk7CisKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX1BJWEVMX0NOVCwgd2lkdGggKiBoZWlnaHQpOworCisJbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9DT05UUk9MKTsKKwlsID0gRkxEX01PRChsLCAxLCAwLCAwKTsgLyogZW5hYmxlICovCisJaWYgKCFyZmJpLnRlX2VuYWJsZWQpCisJCWwgPSBGTERfTU9EKGwsIDEsIDQsIDQpOyAvKiBJVEUgKi8KKworCXBlcmZfbWFya19zdGFydCgpOworCisJcmZiaV93cml0ZV9yZWcoUkZCSV9DT05UUk9MLCBsKTsKK30KKworc3RhdGljIHZvaWQgZnJhbWVkb25lX2NhbGxiYWNrKHZvaWQgKmRhdGEsIHUzMiBtYXNrKQoreworCXZvaWQgKCpjYWxsYmFjaykodm9pZCAqZGF0YSk7CisKKwlEU1NEQkcoIkZSQU1FRE9ORVxuIik7CisKKwlwZXJmX3Nob3coIkRJU1BDIik7CisKKwlSRUdfRkxEX01PRChSRkJJX0NPTlRST0wsIDAsIDAsIDApOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworCisJY2FsbGJhY2sgPSByZmJpLmZyYW1lZG9uZV9jYWxsYmFjazsKKwlyZmJpLmZyYW1lZG9uZV9jYWxsYmFjayA9IE5VTEw7CisKKwkvKmNhbGxiYWNrKHJmYmkuZnJhbWVkb25lX2NhbGxiYWNrX2RhdGEpOyovCisKKwlhdG9taWNfc2V0KCZyZmJpLmNtZF9wZW5kaW5nLCAwKTsKKworCXByb2Nlc3NfY21kX2ZpZm8oKTsKK30KKworI2lmIDEgLyogVkVSQk9TRSAqLworc3RhdGljIHZvaWQgcmZiaV9wcmludF90aW1pbmdzKHZvaWQpCit7CisJdTMyIGw7CisJdTMyIHRpbWU7CisKKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX0NPTkZJRygwKSk7CisJdGltZSA9IDEwMDAwMDAwMDAgLyByZmJpLmw0X2toejsKKwlpZiAobCAmICgxIDw8IDQpKQorCQl0aW1lICo9IDI7CisKKwlEU1NEQkcoIlRpY2sgdGltZSAldSBwc1xuIiwgdGltZSk7CisJbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9PTk9GRl9USU1FKDApKTsKKwlEU1NEQkcoIkNTT05USU1FICVkLCBDU09GRlRJTUUgJWQsIFdFT05USU1FICVkLCBXRU9GRlRJTUUgJWQsICIKKwkJIlJFT05USU1FICVkLCBSRU9GRlRJTUUgJWRcbiIsCisJCWwgJiAweDBmLCAobCA+PiA0KSAmIDB4M2YsIChsID4+IDEwKSAmIDB4MGYsIChsID4+IDE0KSAmIDB4M2YsCisJCShsID4+IDIwKSAmIDB4MGYsIChsID4+IDI0KSAmIDB4M2YpOworCisJbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9DWUNMRV9USU1FKDApKTsKKwlEU1NEQkcoIldFQ1lDTEVUSU1FICVkLCBSRUNZQ0xFVElNRSAlZCwgQ1NQVUxTRVdJRFRIICVkLCAiCisJCSJBQ0NFU1NUSU1FICVkXG4iLAorCQkobCAmIDB4M2YpLCAobCA+PiA2KSAmIDB4M2YsIChsID4+IDEyKSAmIDB4M2YsCisJCShsID4+IDIyKSAmIDB4M2YpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHJmYmlfcHJpbnRfdGltaW5ncyh2b2lkKSB7fQorI2VuZGlmCisKKworCisKK3N0YXRpYyB1MzIgZXh0aWZfY2xrX3BlcmlvZDsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJvdW5kX3RvX2V4dGlmX3RpY2tzKHVuc2lnbmVkIGxvbmcgcHMsIGludCBkaXYpCit7CisJaW50IGJ1c190aWNrID0gZXh0aWZfY2xrX3BlcmlvZCAqIGRpdjsKKwlyZXR1cm4gKHBzICsgYnVzX3RpY2sgLSAxKSAvIGJ1c190aWNrICogYnVzX3RpY2s7Cit9CisKK3N0YXRpYyBpbnQgY2FsY19yZWdfdGltaW5nKHN0cnVjdCByZmJpX3RpbWluZ3MgKnQsIGludCBkaXYpCit7CisJdC0+Y2xrX2RpdiA9IGRpdjsKKworCXQtPmNzX29uX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5jc19vbl90aW1lLCBkaXYpOworCisJdC0+d2Vfb25fdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPndlX29uX3RpbWUsIGRpdik7CisJdC0+d2Vfb2ZmX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT53ZV9vZmZfdGltZSwgZGl2KTsKKwl0LT53ZV9jeWNsZV90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+d2VfY3ljbGVfdGltZSwgZGl2KTsKKworCXQtPnJlX29uX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vbl90aW1lLCBkaXYpOworCXQtPnJlX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb2ZmX3RpbWUsIGRpdik7CisJdC0+cmVfY3ljbGVfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX2N5Y2xlX3RpbWUsIGRpdik7CisKKwl0LT5hY2Nlc3NfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPmFjY2Vzc190aW1lLCBkaXYpOworCXQtPmNzX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+Y3Nfb2ZmX3RpbWUsIGRpdik7CisJdC0+Y3NfcHVsc2Vfd2lkdGggPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5jc19wdWxzZV93aWR0aCwgZGl2KTsKKworCURTU0RCRygiW3JlZ11jc29uICVkIGNzb2ZmICVkIHJlb24gJWQgcmVvZmYgJWRcbiIsCisJICAgICAgIHQtPmNzX29uX3RpbWUsIHQtPmNzX29mZl90aW1lLCB0LT5yZV9vbl90aW1lLCB0LT5yZV9vZmZfdGltZSk7CisJRFNTREJHKCJbcmVnXXdlb24gJWQgd2VvZmYgJWQgcmVjeWMgJWQgd2VjeWMgJWRcbiIsCisJICAgICAgIHQtPndlX29uX3RpbWUsIHQtPndlX29mZl90aW1lLCB0LT5yZV9jeWNsZV90aW1lLAorCSAgICAgICB0LT53ZV9jeWNsZV90aW1lKTsKKwlEU1NEQkcoIltyZWddcmRhY2Nlc3MgJWQgY3NwdWxzZSAlZFxuIiwKKwkgICAgICAgdC0+YWNjZXNzX3RpbWUsIHQtPmNzX3B1bHNlX3dpZHRoKTsKKworCXJldHVybiByZmJpX2NvbnZlcnRfdGltaW5ncyh0KTsKK30KKworc3RhdGljIGludCBjYWxjX2V4dGlmX3RpbWluZ3Moc3RydWN0IHJmYmlfdGltaW5ncyAqdCkKK3sKKwl1MzIgbWF4X2Nsa19kaXY7CisJaW50IGRpdjsKKworCXJmYmlfZ2V0X2Nsa19pbmZvKCZleHRpZl9jbGtfcGVyaW9kLCAmbWF4X2Nsa19kaXYpOworCWZvciAoZGl2ID0gMTsgZGl2IDw9IG1heF9jbGtfZGl2OyBkaXYrKykgeworCQlpZiAoY2FsY19yZWdfdGltaW5nKHQsIGRpdikgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChkaXYgPD0gbWF4X2Nsa19kaXYpCisJCXJldHVybiAwOworCisJRFNTRVJSKCJjYW4ndCBzZXR1cCB0aW1pbmdzXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKKwordm9pZCByZmJpX3NldF90aW1pbmdzKGludCByZmJpX21vZHVsZSwgc3RydWN0IHJmYmlfdGltaW5ncyAqdCkKK3sKKwlpbnQgcjsKKworCWlmICghdC0+Y29udmVydGVkKSB7CisJCXIgPSBjYWxjX2V4dGlmX3RpbWluZ3ModCk7CisJCWlmIChyIDwgMCkKKwkJCURTU0VSUigiRmFpbGVkIHRvIGNhbGMgdGltaW5nc1xuIik7CisJfQorCisJQlVHX09OKCF0LT5jb252ZXJ0ZWQpOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCXJmYmlfd3JpdGVfcmVnKFJGQklfT05PRkZfVElNRShyZmJpX21vZHVsZSksIHQtPnRpbVswXSk7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9DWUNMRV9USU1FKHJmYmlfbW9kdWxlKSwgdC0+dGltWzFdKTsKKworCS8qIFRJTUVHUkFOVUxBUklUWSAqLworCVJFR19GTERfTU9EKFJGQklfQ09ORklHKHJmYmlfbW9kdWxlKSwKKwkJICAgICh0LT50aW1bMl0gPyAxIDogMCksIDQsIDQpOworCisJcmZiaV9wcmludF90aW1pbmdzKCk7CisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworfQorCitzdGF0aWMgaW50IHBzX3RvX3JmYmlfdGlja3MoaW50IHRpbWUsIGludCBkaXYpCit7CisJdW5zaWduZWQgbG9uZyB0aWNrX3BzOworCWludCByZXQ7CisKKwkvKiBDYWxjdWxhdGUgaW4gcGljb3NlY3MgdG8geWllbGQgbW9yZSBleGFjdCByZXN1bHRzICovCisJdGlja19wcyA9IDEwMDAwMDAwMDAgLyAocmZiaS5sNF9raHopICogZGl2OworCisJcmV0ID0gKHRpbWUgKyB0aWNrX3BzIC0gMSkgLyB0aWNrX3BzOworCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIE9NQVBfUkZCSV9SQVRFX0xJTUlUCit1bnNpZ25lZCBsb25nIHJmYmlfZ2V0X21heF90eF9yYXRlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyAgIGw0X3JhdGUsIGRzczFfcmF0ZTsKKwlpbnQgICAgICAgICAgICAgbWluX2w0X3RpY2tzID0gMDsKKwlpbnQgICAgICAgICAgICAgaTsKKworCS8qIEFjY29yZGluZyB0byBUSSB0aGlzIGNhbid0IGJlIGNhbGN1bGF0ZWQgc28gbWFrZSB0aGUKKwkgKiBhZGp1c3RtZW50cyBmb3IgYSBjb3VwbGUgb2Yga25vd24gZnJlcXVlbmNpZXMgYW5kIHdhcm4gZm9yCisJICogb3RoZXJzLgorCSAqLworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIGw0X2NsazsgICAgICAgICAgIC8qIEhaICovCisJCXVuc2lnbmVkIGxvbmcgZHNzMV9jbGs7ICAgICAgICAgLyogSFogKi8KKwkJdW5zaWduZWQgbG9uZyBtaW5fbDRfdGlja3M7CisJfSBmdGFiW10gPSB7CisJCXsgNTUsICAgMTMyLCAgICA3LCB9LCAgICAgICAgICAgLyogNy44NiBNUGl4L3MgKi8KKwkJeyAxMTAsICAxMTAsICAgIDEyLCB9LCAgICAgICAgICAvKiA5LjE2IE1QaXgvcyAqLworCQl7IDExMCwgIDEzMiwgICAgMTAsIH0sICAgICAgICAgIC8qIDExICAgTXBpeC9zICovCisJCXsgMTIwLCAgMTIwLCAgICAxMCwgfSwgICAgICAgICAgLyogMTIgICBNcGl4L3MgKi8KKwkJeyAxMzMsICAxMzMsICAgIDEwLCB9LCAgICAgICAgICAvKiAxMy4zIE1waXgvcyAqLworCX07CisKKwlsNF9yYXRlID0gcmZiaS5sNF9raHogLyAxMDAwOworCWRzczFfcmF0ZSA9IGRzc19jbGtfZ2V0X3JhdGUoRFNTX0NMS19GQ0sxKSAvIDEwMDAwMDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmdGFiKTsgaSsrKSB7CisJCS8qIFVzZSBhIHdpbmRvdyBpbnN0ZWFkIG9mIGFuIGV4YWN0IG1hdGNoLCB0byBhY2NvdW50CisJCSAqIGZvciBkaWZmZXJlbnQgRFBMTCBtdWx0aXBsaWVyIC8gZGl2aWRlciBwYWlycy4KKwkJICovCisJCWlmIChhYnMoZnRhYltpXS5sNF9jbGsgLSBsNF9yYXRlKSA8IDMgJiYKKwkJICAgIGFicyhmdGFiW2ldLmRzczFfY2xrIC0gZHNzMV9yYXRlKSA8IDMpIHsKKwkJCW1pbl9sNF90aWNrcyA9IGZ0YWJbaV0ubWluX2w0X3RpY2tzOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGkgPT0gQVJSQVlfU0laRShmdGFiKSkgeworCQkvKiBDYW4ndCBiZSBzdXJlLCByZXR1cm4gYW55d2F5IHRoZSBtYXhpbXVtIG5vdAorCQkgKiByYXRlLWxpbWl0ZWQuIFRoaXMgbWlnaHQgY2F1c2UgYSBwcm9ibGVtIG9ubHkgZm9yIHRoZQorCQkgKiB0ZWFyaW5nIHN5bmNocm9uaXNhdGlvbi4KKwkJICovCisJCURTU0VSUigiY2FuJ3QgZGV0ZXJtaW5lIG1heGltdW0gUkZCSSB0cmFuc2ZlciByYXRlXG4iKTsKKwkJcmV0dXJuIHJmYmkubDRfa2h6ICogMTAwMDsKKwl9CisJcmV0dXJuIHJmYmkubDRfa2h6ICogMTAwMCAvIG1pbl9sNF90aWNrczsKK30KKyNlbHNlCitpbnQgcmZiaV9nZXRfbWF4X3R4X3JhdGUodm9pZCkKK3sKKwlyZXR1cm4gcmZiaS5sNF9raHogKiAxMDAwOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJmYmlfZ2V0X2Nsa19pbmZvKHUzMiAqY2xrX3BlcmlvZCwgdTMyICptYXhfY2xrX2RpdikKK3sKKwkqY2xrX3BlcmlvZCA9IDEwMDAwMDAwMDAgLyByZmJpLmw0X2toejsKKwkqbWF4X2Nsa19kaXYgPSAyOworfQorCitzdGF0aWMgaW50IHJmYmlfY29udmVydF90aW1pbmdzKHN0cnVjdCByZmJpX3RpbWluZ3MgKnQpCit7CisJdTMyIGw7CisJaW50IHJlb24sIHJlb2ZmLCB3ZW9uLCB3ZW9mZiwgY3NvbiwgY3NvZmYsIGNzX3B1bHNlOworCWludCBhY3RpbSwgcmVjeWMsIHdlY3ljOworCWludCBkaXYgPSB0LT5jbGtfZGl2OworCisJaWYgKGRpdiA8PSAwIHx8IGRpdiA+IDIpCisJCXJldHVybiAtMTsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IGFmdGVyIGNvbnZlcnNpb24gaXQgc3RpbGwgaG9sZHMgdGhhdDoKKwkgKiB3ZW9mZiA+IHdlb24sIHJlb2ZmID4gcmVvbiwgcmVjeWMgPj0gcmVvZmYsIHdlY3ljID49IHdlb2ZmLAorCSAqIGNzb2ZmID4gY3NvbiwgY3NvZmYgPj0gbWF4KHdlb2ZmLCByZW9mZiksIGFjdGltID4gcmVvbgorCSAqLworCXdlb24gPSBwc190b19yZmJpX3RpY2tzKHQtPndlX29uX3RpbWUsIGRpdik7CisJd2VvZmYgPSBwc190b19yZmJpX3RpY2tzKHQtPndlX29mZl90aW1lLCBkaXYpOworCWlmICh3ZW9mZiA8PSB3ZW9uKQorCQl3ZW9mZiA9IHdlb24gKyAxOworCWlmICh3ZW9uID4gMHgwZikKKwkJcmV0dXJuIC0xOworCWlmICh3ZW9mZiA+IDB4M2YpCisJCXJldHVybiAtMTsKKworCXJlb24gPSBwc190b19yZmJpX3RpY2tzKHQtPnJlX29uX3RpbWUsIGRpdik7CisJcmVvZmYgPSBwc190b19yZmJpX3RpY2tzKHQtPnJlX29mZl90aW1lLCBkaXYpOworCWlmIChyZW9mZiA8PSByZW9uKQorCQlyZW9mZiA9IHJlb24gKyAxOworCWlmIChyZW9uID4gMHgwZikKKwkJcmV0dXJuIC0xOworCWlmIChyZW9mZiA+IDB4M2YpCisJCXJldHVybiAtMTsKKworCWNzb24gPSBwc190b19yZmJpX3RpY2tzKHQtPmNzX29uX3RpbWUsIGRpdik7CisJY3NvZmYgPSBwc190b19yZmJpX3RpY2tzKHQtPmNzX29mZl90aW1lLCBkaXYpOworCWlmIChjc29mZiA8PSBjc29uKQorCQljc29mZiA9IGNzb24gKyAxOworCWlmIChjc29mZiA8IG1heCh3ZW9mZiwgcmVvZmYpKQorCQljc29mZiA9IG1heCh3ZW9mZiwgcmVvZmYpOworCWlmIChjc29uID4gMHgwZikKKwkJcmV0dXJuIC0xOworCWlmIChjc29mZiA+IDB4M2YpCisJCXJldHVybiAtMTsKKworCWwgPSAgY3NvbjsKKwlsIHw9IGNzb2ZmIDw8IDQ7CisJbCB8PSB3ZW9uICA8PCAxMDsKKwlsIHw9IHdlb2ZmIDw8IDE0OworCWwgfD0gcmVvbiAgPDwgMjA7CisJbCB8PSByZW9mZiA8PCAyNDsKKworCXQtPnRpbVswXSA9IGw7CisKKwlhY3RpbSA9IHBzX3RvX3JmYmlfdGlja3ModC0+YWNjZXNzX3RpbWUsIGRpdik7CisJaWYgKGFjdGltIDw9IHJlb24pCisJCWFjdGltID0gcmVvbiArIDE7CisJaWYgKGFjdGltID4gMHgzZikKKwkJcmV0dXJuIC0xOworCisJd2VjeWMgPSBwc190b19yZmJpX3RpY2tzKHQtPndlX2N5Y2xlX3RpbWUsIGRpdik7CisJaWYgKHdlY3ljIDwgd2VvZmYpCisJCXdlY3ljID0gd2VvZmY7CisJaWYgKHdlY3ljID4gMHgzZikKKwkJcmV0dXJuIC0xOworCisJcmVjeWMgPSBwc190b19yZmJpX3RpY2tzKHQtPnJlX2N5Y2xlX3RpbWUsIGRpdik7CisJaWYgKHJlY3ljIDwgcmVvZmYpCisJCXJlY3ljID0gcmVvZmY7CisJaWYgKHJlY3ljID4gMHgzZikKKwkJcmV0dXJuIC0xOworCisJY3NfcHVsc2UgPSBwc190b19yZmJpX3RpY2tzKHQtPmNzX3B1bHNlX3dpZHRoLCBkaXYpOworCWlmIChjc19wdWxzZSA+IDB4M2YpCisJCXJldHVybiAtMTsKKworCWwgPSAgd2VjeWM7CisJbCB8PSByZWN5YyAgICA8PCA2OworCWwgfD0gY3NfcHVsc2UgPDwgMTI7CisJbCB8PSBhY3RpbSAgICA8PCAyMjsKKworCXQtPnRpbVsxXSA9IGw7CisKKwl0LT50aW1bMl0gPSBkaXYgLSAxOworCisJdC0+Y29udmVydGVkID0gMTsKKworCXJldHVybiAwOworfQorCisvKiB4eHggRklYIG1vZHVsZSBzZWxlY3Rpb24gbWlzc2luZyAqLworaW50IG9tYXBfcmZiaV9zZXR1cF90ZShlbnVtIG9tYXBfcmZiaV90ZV9tb2RlIG1vZGUsCisJCQkgICAgIHVuc2lnbmVkIGhzX3B1bHNlX3RpbWUsIHVuc2lnbmVkIHZzX3B1bHNlX3RpbWUsCisJCQkgICAgIGludCBoc19wb2xfaW52LCBpbnQgdnNfcG9sX2ludiwgaW50IGV4dGlmX2RpdikKK3sKKwlpbnQgaHMsIHZzOworCWludCBtaW47CisJdTMyIGw7CisKKwlocyA9IHBzX3RvX3JmYmlfdGlja3MoaHNfcHVsc2VfdGltZSwgMSk7CisJdnMgPSBwc190b19yZmJpX3RpY2tzKHZzX3B1bHNlX3RpbWUsIDEpOworCWlmIChocyA8IDIpCisJCXJldHVybiAtRURPTTsKKwlpZiAobW9kZSA9PSBPTUFQX0RTU19SRkJJX1RFX01PREVfMikKKwkJbWluID0gMjsKKwllbHNlIC8qIE9NQVBfRFNTX1JGQklfVEVfTU9ERV8xICovCisJCW1pbiA9IDQ7CisJaWYgKHZzIDwgbWluKQorCQlyZXR1cm4gLUVET007CisJaWYgKHZzID09IGhzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZmJpLnRlX21vZGUgPSBtb2RlOworCURTU0RCRygic2V0dXBfdGU6IG1vZGUgJWQgaHMgJWQgdnMgJWQgaHNfaW52ICVkIHZzX2ludiAlZFxuIiwKKwkJbW9kZSwgaHMsIHZzLCBoc19wb2xfaW52LCB2c19wb2xfaW52KTsKKworCXJmYmlfZW5hYmxlX2Nsb2NrcygxKTsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0hTWU5DX1dJRFRILCBocyk7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9WU1lOQ19XSURUSCwgdnMpOworCisJbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9DT05GSUcoMCkpOworCWlmIChoc19wb2xfaW52KQorCQlsICY9IH4oMSA8PCAyMSk7CisJZWxzZQorCQlsIHw9IDEgPDwgMjE7CisJaWYgKHZzX3BvbF9pbnYpCisJCWwgJj0gfigxIDw8IDIwKTsKKwllbHNlCisJCWwgfD0gMSA8PCAyMDsKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9yZmJpX3NldHVwX3RlKTsKKworLyogeHh4IEZJWCBtb2R1bGUgc2VsZWN0aW9uIG1pc3NpbmcgKi8KK2ludCBvbWFwX3JmYmlfZW5hYmxlX3RlKGJvb2wgZW5hYmxlLCB1bnNpZ25lZCBsaW5lKQoreworCXUzMiBsOworCisJRFNTREJHKCJ0ZSAlZCBsaW5lICVkIG1vZGUgJWRcbiIsIGVuYWJsZSwgbGluZSwgcmZiaS50ZV9tb2RlKTsKKwlpZiAobGluZSA+ICgxIDw8IDExKSAtIDEpCisJCXJldHVybiAtRUlOVkFMOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfQ09ORklHKDApKTsKKwlsICY9IH4oMHgzIDw8IDIpOworCWlmIChlbmFibGUpIHsKKwkJcmZiaS50ZV9lbmFibGVkID0gMTsKKwkJbCB8PSByZmJpLnRlX21vZGUgPDwgMjsKKwl9IGVsc2UKKwkJcmZiaS50ZV9lbmFibGVkID0gMDsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0NPTkZJRygwKSwgbCk7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9MSU5FX05VTUJFUiwgbGluZSk7CisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfcmZiaV9lbmFibGVfdGUpOworCisjaWYgMAorc3RhdGljIHZvaWQgcmZiaV9lbmFibGVfY29uZmlnKGludCBlbmFibGUxLCBpbnQgZW5hYmxlMikKK3sKKwl1MzIgbDsKKwlpbnQgY3MgPSAwOworCisJaWYgKGVuYWJsZTEpCisJCWNzIHw9IDE8PDA7CisJaWYgKGVuYWJsZTIpCisJCWNzIHw9IDE8PDE7CisKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMSk7CisKKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX0NPTlRST0wpOworCisJbCA9IEZMRF9NT0QobCwgY3MsIDMsIDIpOworCWwgPSBGTERfTU9EKGwsIDAsIDEsIDEpOworCisJcmZiaV93cml0ZV9yZWcoUkZCSV9DT05UUk9MLCBsKTsKKworCisJbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9DT05GSUcoMCkpOworCWwgPSBGTERfTU9EKGwsIDAsIDMsIDIpOyAvKiBUUklHR0VSTU9ERTogSVRFICovCisJLypsIHw9IEZMRF9WQUwoMiwgOCwgNyk7ICovIC8qIEw0Rk9STUFULCAycGl4L0w0ICovCisJLypsIHw9IEZMRF9WQUwoMCwgOCwgNyk7ICovIC8qIEw0Rk9STUFULCAxcGl4L0w0ICovCisKKwlsID0gRkxEX01PRChsLCAwLCAxNiwgMTYpOyAvKiBBMFBPTEFSSVRZICovCisJbCA9IEZMRF9NT0QobCwgMSwgMjAsIDIwKTsgLyogVEVfVlNZTkNfUE9MQVJJVFkgKi8KKwlsID0gRkxEX01PRChsLCAxLCAyMSwgMjEpOyAvKiBIU1lOQ1BPTEFSSVRZICovCisKKwlsID0gRkxEX01PRChsLCBPTUFQX0RTU19SRkJJX1BBUkFMTEVMTU9ERV84LCAxLCAwKTsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0NPTkZJRygwKSwgbCk7CisKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMCk7Cit9CisjZW5kaWYKKworaW50IHJmYmlfY29uZmlndXJlKGludCByZmJpX21vZHVsZSwgaW50IGJwcCwgaW50IGxpbmVzKQoreworCXUzMiBsOworCWludCBjeWNsZTEgPSAwLCBjeWNsZTIgPSAwLCBjeWNsZTMgPSAwOworCWVudW0gb21hcF9yZmJpX2N5Y2xlZm9ybWF0IGN5Y2xlZm9ybWF0OworCWVudW0gb21hcF9yZmJpX2RhdGF0eXBlIGRhdGF0eXBlOworCWVudW0gb21hcF9yZmJpX3BhcmFsbGVsbW9kZSBwYXJhbGxlbG1vZGU7CisKKwlzd2l0Y2ggKGJwcCkgeworCWNhc2UgMTI6CisJCWRhdGF0eXBlID0gT01BUF9EU1NfUkZCSV9EQVRBVFlQRV8xMjsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJZGF0YXR5cGUgPSBPTUFQX0RTU19SRkJJX0RBVEFUWVBFXzE2OworCQlicmVhazsKKwljYXNlIDE4OgorCQlkYXRhdHlwZSA9IE9NQVBfRFNTX1JGQklfREFUQVRZUEVfMTg7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCWRhdGF0eXBlID0gT01BUF9EU1NfUkZCSV9EQVRBVFlQRV8yNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAxOworCX0KKwlyZmJpLmRhdGF0eXBlID0gZGF0YXR5cGU7CisKKwlzd2l0Y2ggKGxpbmVzKSB7CisJY2FzZSA4OgorCQlwYXJhbGxlbG1vZGUgPSBPTUFQX0RTU19SRkJJX1BBUkFMTEVMTU9ERV84OworCQlicmVhazsKKwljYXNlIDk6CisJCXBhcmFsbGVsbW9kZSA9IE9NQVBfRFNTX1JGQklfUEFSQUxMRUxNT0RFXzk7CisJCWJyZWFrOworCWNhc2UgMTI6CisJCXBhcmFsbGVsbW9kZSA9IE9NQVBfRFNTX1JGQklfUEFSQUxMRUxNT0RFXzEyOworCQlicmVhazsKKwljYXNlIDE2OgorCQlwYXJhbGxlbG1vZGUgPSBPTUFQX0RTU19SRkJJX1BBUkFMTEVMTU9ERV8xNjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAxOworCX0KKwlyZmJpLnBhcmFsbGVsbW9kZSA9IHBhcmFsbGVsbW9kZTsKKworCWlmICgoYnBwICUgbGluZXMpID09IDApIHsKKwkJc3dpdGNoIChicHAgLyBsaW5lcykgeworCQljYXNlIDE6CisJCQljeWNsZWZvcm1hdCA9IE9NQVBfRFNTX1JGQklfQ1lDTEVGT1JNQVRfMV8xOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWN5Y2xlZm9ybWF0ID0gT01BUF9EU1NfUkZCSV9DWUNMRUZPUk1BVF8yXzE7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJY3ljbGVmb3JtYXQgPSBPTUFQX0RTU19SRkJJX0NZQ0xFRk9STUFUXzNfMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZSBpZiAoKDIgKiBicHAgJSBsaW5lcykgPT0gMCkgeworCQlpZiAoKDIgKiBicHAgLyBsaW5lcykgPT0gMykKKwkJCWN5Y2xlZm9ybWF0ID0gT01BUF9EU1NfUkZCSV9DWUNMRUZPUk1BVF8zXzI7CisJCWVsc2UgeworCQkJQlVHKCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZSB7CisJCUJVRygpOworCQlyZXR1cm4gMTsKKwl9CisKKwlzd2l0Y2ggKGN5Y2xlZm9ybWF0KSB7CisJY2FzZSBPTUFQX0RTU19SRkJJX0NZQ0xFRk9STUFUXzFfMToKKwkJY3ljbGUxID0gbGluZXM7CisJCWJyZWFrOworCisJY2FzZSBPTUFQX0RTU19SRkJJX0NZQ0xFRk9STUFUXzJfMToKKwkJY3ljbGUxID0gbGluZXM7CisJCWN5Y2xlMiA9IGxpbmVzOworCQlicmVhazsKKworCWNhc2UgT01BUF9EU1NfUkZCSV9DWUNMRUZPUk1BVF8zXzE6CisJCWN5Y2xlMSA9IGxpbmVzOworCQljeWNsZTIgPSBsaW5lczsKKwkJY3ljbGUzID0gbGluZXM7CisJCWJyZWFrOworCisJY2FzZSBPTUFQX0RTU19SRkJJX0NZQ0xFRk9STUFUXzNfMjoKKwkJY3ljbGUxID0gbGluZXM7CisJCWN5Y2xlMiA9IChsaW5lcyAvIDIpIHwgKChsaW5lcyAvIDIpIDw8IDE2KTsKKwkJY3ljbGUzID0gKGxpbmVzIDw8IDE2KTsKKwkJYnJlYWs7CisJfQorCisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCisJUkVHX0ZMRF9NT0QoUkZCSV9DT05UUk9MLCAwLCAzLCAyKTsgLyogY2xlYXIgQ1MgKi8KKworCWwgPSAwOworCWwgfD0gRkxEX1ZBTChwYXJhbGxlbG1vZGUsIDEsIDApOworCWwgfD0gRkxEX1ZBTCgwLCAzLCAyKTsJCS8qIFRSSUdHRVJNT0RFOiBJVEUgKi8KKwlsIHw9IEZMRF9WQUwoMCwgNCwgNCk7CQkvKiBUSU1FR1JBTlVMQVJJVFkgKi8KKwlsIHw9IEZMRF9WQUwoZGF0YXR5cGUsIDYsIDUpOworCS8qIGwgfD0gRkxEX1ZBTCgyLCA4LCA3KTsgKi8JLyogTDRGT1JNQVQsIDJwaXgvTDQgKi8KKwlsIHw9IEZMRF9WQUwoMCwgOCwgNyk7CS8qIEw0Rk9STUFULCAxcGl4L0w0ICovCisJbCB8PSBGTERfVkFMKGN5Y2xlZm9ybWF0LCAxMCwgOSk7CisJbCB8PSBGTERfVkFMKDAsIDEyLCAxMSk7CS8qIFVOVVNFREJJVFMgKi8KKwlsIHw9IEZMRF9WQUwoMCwgMTYsIDE2KTsJLyogQTBQT0xBUklUWSAqLworCWwgfD0gRkxEX1ZBTCgwLCAxNywgMTcpOwkvKiBSRVBPTEFSSVRZICovCisJbCB8PSBGTERfVkFMKDAsIDE4LCAxOCk7CS8qIFdFUE9MQVJJVFkgKi8KKwlsIHw9IEZMRF9WQUwoMCwgMTksIDE5KTsJLyogQ1NQT0xBUklUWSAqLworCWwgfD0gRkxEX1ZBTCgxLCAyMCwgMjApOwkvKiBURV9WU1lOQ19QT0xBUklUWSAqLworCWwgfD0gRkxEX1ZBTCgxLCAyMSwgMjEpOwkvKiBIU1lOQ1BPTEFSSVRZICovCisJcmZiaV93cml0ZV9yZWcoUkZCSV9DT05GSUcocmZiaV9tb2R1bGUpLCBsKTsKKworCXJmYmlfd3JpdGVfcmVnKFJGQklfREFUQV9DWUNMRTEocmZiaV9tb2R1bGUpLCBjeWNsZTEpOworCXJmYmlfd3JpdGVfcmVnKFJGQklfREFUQV9DWUNMRTIocmZiaV9tb2R1bGUpLCBjeWNsZTIpOworCXJmYmlfd3JpdGVfcmVnKFJGQklfREFUQV9DWUNMRTMocmZiaV9tb2R1bGUpLCBjeWNsZTMpOworCisKKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX0NPTlRST0wpOworCWwgPSBGTERfTU9EKGwsIHJmYmlfbW9kdWxlKzEsIDMsIDIpOyAvKiBTZWxlY3QgQ1N4ICovCisJbCA9IEZMRF9NT0QobCwgMCwgMSwgMSk7IC8qIGNsZWFyIGJ5cGFzcyAqLworCXJmYmlfd3JpdGVfcmVnKFJGQklfQ09OVFJPTCwgbCk7CisKKworCURTU0RCRygiUkZCSSBjb25maWc6IGJwcCAlZCwgbGluZXMgJWQsIGN5Y2xlczogMHgleCAweCV4IDB4JXhcbiIsCisJICAgICAgIGJwcCwgbGluZXMsIGN5Y2xlMSwgY3ljbGUyLCBjeWNsZTMpOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHJmYmlfY29uZmlndXJlKTsKKworc3RhdGljIGludCByZmJpX2ZpbmRfZGlzcGxheShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJaWYgKGRzc2RldiA9PSByZmJpLmRzc2RldlswXSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZHNzZGV2ID09IHJmYmkuZHNzZGV2WzFdKQorCQlyZXR1cm4gMTsKKworCUJVRygpOworCXJldHVybiAtMTsKK30KKworCitzdGF0aWMgdm9pZCBzaWduYWxfZmlmb193YWl0ZXJzKHZvaWQpCit7CisJaWYgKGF0b21pY19yZWFkKCZyZmJpLmNtZF9maWZvX2Z1bGwpID4gMCkgeworCQkvKiBEU1NEQkcoIlNJR05BTElORzogRmlmbyBub3QgZnVsbCBmb3Igd2FpdGVyIVxuIik7ICovCisJCWNvbXBsZXRlKCZyZmJpLmNtZF9kb25lKTsKKwkJYXRvbWljX2RlYygmcmZiaS5jbWRfZmlmb19mdWxsKTsKKwl9Cit9CisKKy8qIHJldHVybnMgMSBmb3IgYXN5bmMgb3AsIGFuZCAwIGZvciBzeW5jIG9wICovCitzdGF0aWMgaW50IGRvX3VwZGF0ZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIHN0cnVjdCB1cGRhdGVfcmVnaW9uICp1cGQpCit7CisJdTE2IHggPSB1cGQtPng7CisJdTE2IHkgPSB1cGQtPnk7CisJdTE2IHcgPSB1cGQtPnc7CisJdTE2IGggPSB1cGQtPmg7CisKKwlwZXJmX21hcmtfc2V0dXAoKTsKKworCWlmIChkc3NkZXYtPm1hbmFnZXItPmNhcHMgJiBPTUFQX0RTU19PVkxfTUdSX0NBUF9ESVNQQykgeworCQkvKmRzc2Rldi0+ZHJpdmVyLT5lbmFibGVfdGUoZHNzZGV2LCAxKTsgKi8KKwkJZHNzX3NldHVwX3BhcnRpYWxfcGxhbmVzKGRzc2RldiwgJngsICZ5LCAmdywgJmgpOworCX0KKworI2lmZGVmIE1FQVNVUkVfUEVSRgorCXJmYmkucGVyZl9ieXRlcyA9IHcgKiBoICogMjsgLyogWFhYIGFsd2F5cyAxNmJpdCAqLworI2VuZGlmCisKKwlkc3NkZXYtPmRyaXZlci0+c2V0dXBfdXBkYXRlKGRzc2RldiwgeCwgeSwgdywgaCk7CisKKwlpZiAoZHNzZGV2LT5tYW5hZ2VyLT5jYXBzICYgT01BUF9EU1NfT1ZMX01HUl9DQVBfRElTUEMpIHsKKwkJcmZiaV90cmFuc2Zlcl9hcmVhKHcsIGgsIE5VTEwsIE5VTEwpOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7CisJCXZvaWQgX19pb21lbSAqYWRkcjsKKwkJaW50IHNjcl93aWR0aDsKKworCQlvdmwgPSBkc3NkZXYtPm1hbmFnZXItPm92ZXJsYXlzWzBdOworCQlzY3Jfd2lkdGggPSBvdmwtPmluZm8uc2NyZWVuX3dpZHRoOworCQlhZGRyID0gb3ZsLT5pbmZvLnZhZGRyOworCisJCW9tYXBfcmZiaV93cml0ZV9waXhlbHMoYWRkciwgc2NyX3dpZHRoLCB4LCB5LCB3LCBoKTsKKworCQlwZXJmX3Nob3coIkw0Iik7CisKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2NtZF9maWZvKHZvaWQpCit7CisJaW50IGxlbjsKKwlzdHJ1Y3QgdXBkYXRlX3BhcmFtIHA7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoYXRvbWljX2luY19yZXR1cm4oJnJmYmkuY21kX3BlbmRpbmcpICE9IDEpCisJCXJldHVybjsKKworCXdoaWxlICh0cnVlKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKHJmYmkuY21kX2ZpZm8tPmxvY2ssIGZsYWdzKTsKKworCQlsZW4gPSBfX2tmaWZvX2dldChyZmJpLmNtZF9maWZvLCAodW5zaWduZWQgY2hhciAqKSZwLAorCQkJCSAgc2l6ZW9mKHN0cnVjdCB1cGRhdGVfcGFyYW0pKTsKKwkJaWYgKGxlbiA9PSAwKSB7CisJCQlEU1NEQkcoIm5vdGhpbmcgbW9yZSBpbiBmaWZvXG4iKTsKKwkJCWF0b21pY19zZXQoJnJmYmkuY21kX3BlbmRpbmcsIDApOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShyZmJpLmNtZF9maWZvLT5sb2NrLCBmbGFncyk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIERTU0RCRygiZmlmbyBmdWxsICVkXG4iLCByZmJpLmNtZF9maWZvX2Z1bGwuY291bnRlcik7Ki8KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHJmYmkuY21kX2ZpZm8tPmxvY2ssIGZsYWdzKTsKKworCQlCVUdfT04obGVuICE9IHNpemVvZihzdHJ1Y3QgdXBkYXRlX3BhcmFtKSk7CisJCUJVR19PTihwLnJmYmlfbW9kdWxlID4gMSk7CisKKwkJZHNzZGV2ID0gcmZiaS5kc3NkZXZbcC5yZmJpX21vZHVsZV07CisKKwkJaWYgKHAuY21kID09IFJGQklfQ01EX1VQREFURSkgeworCQkJaWYgKGRvX3VwZGF0ZShkc3NkZXYsICZwLnBhci5yKSkKKwkJCQlicmVhazsgLyogYXN5bmMgb3AgKi8KKwkJfSBlbHNlIGlmIChwLmNtZCA9PSBSRkJJX0NNRF9TWU5DKSB7CisJCQlEU1NEQkcoIlNpZ25hbGluZyBTWU5DIGRvbmUhXG4iKTsKKwkJCWNvbXBsZXRlKHAucGFyLnN5bmMpOworCQl9IGVsc2UKKwkJCUJVRygpOworCX0KKworCXNpZ25hbF9maWZvX3dhaXRlcnMoKTsKK30KKworc3RhdGljIHZvaWQgcmZiaV9wdXNoX2NtZChzdHJ1Y3QgdXBkYXRlX3BhcmFtICpwKQoreworCWludCByZXQ7CisKKwl3aGlsZSAoMSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlpbnQgYXZhaWxhYmxlOworCisJCXNwaW5fbG9ja19pcnFzYXZlKHJmYmkuY21kX2ZpZm8tPmxvY2ssIGZsYWdzKTsKKwkJYXZhaWxhYmxlID0gUkZCSV9DTURfRklGT19MRU5fQllURVMgLQorCQkJX19rZmlmb19sZW4ocmZiaS5jbWRfZmlmbyk7CisKKy8qCQlEU1NEQkcoIiVkIGJ5dGVzIGxlZnQgaW4gZmlmb1xuIiwgYXZhaWxhYmxlKTsgKi8KKwkJaWYgKGF2YWlsYWJsZSA8IHNpemVvZihzdHJ1Y3QgdXBkYXRlX3BhcmFtKSkgeworCQkJRFNTREJHKCJHb2luZyB0byB3YWl0IGJlY2F1c2UgRklGTyBGVUxMLi5cbiIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShyZmJpLmNtZF9maWZvLT5sb2NrLCBmbGFncyk7CisJCQlhdG9taWNfaW5jKCZyZmJpLmNtZF9maWZvX2Z1bGwpOworCQkJd2FpdF9mb3JfY29tcGxldGlvbigmcmZiaS5jbWRfZG9uZSk7CisJCQkvKkRTU0RCRygiV29rZSB1cCBiZWNhdXNlIGZpZm8gbm90IGZ1bGwgYW55bW9yZVxuIik7Ki8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmV0ID0gX19rZmlmb19wdXQocmZiaS5jbWRfZmlmbywgKHVuc2lnbmVkIGNoYXIgKilwLAorCQkJCSAgc2l6ZW9mKHN0cnVjdCB1cGRhdGVfcGFyYW0pKTsKKy8qCQlEU1NEQkcoInB1c2hlZCAlZCBieXRlc1xuIiwgcmV0KTsqLworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocmZiaS5jbWRfZmlmby0+bG9jaywgZmxhZ3MpOworCisJCUJVR19PTihyZXQgIT0gc2l6ZW9mKHN0cnVjdCB1cGRhdGVfcGFyYW0pKTsKKworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJmYmlfcHVzaF91cGRhdGUoaW50IHJmYmlfbW9kdWxlLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKK3sKKwlzdHJ1Y3QgdXBkYXRlX3BhcmFtIHA7CisKKwlwLnJmYmlfbW9kdWxlID0gcmZiaV9tb2R1bGU7CisJcC5jbWQgPSBSRkJJX0NNRF9VUERBVEU7CisKKwlwLnBhci5yLnggPSB4OworCXAucGFyLnIueSA9IHk7CisJcC5wYXIuci53ID0gdzsKKwlwLnBhci5yLmggPSBoOworCisJRFNTREJHKCJSRkJJIHB1c2hlZCAlZCwlZCAlZHglZFxuIiwgeCwgeSwgdywgaCk7CisKKwlyZmJpX3B1c2hfY21kKCZwKTsKKworCXByb2Nlc3NfY21kX2ZpZm8oKTsKK30KKworc3RhdGljIHZvaWQgcmZiaV9wdXNoX3N5bmMoaW50IHJmYmlfbW9kdWxlLCBzdHJ1Y3QgY29tcGxldGlvbiAqc3luY19jb21wKQoreworCXN0cnVjdCB1cGRhdGVfcGFyYW0gcDsKKworCXAucmZiaV9tb2R1bGUgPSByZmJpX21vZHVsZTsKKwlwLmNtZCA9IFJGQklfQ01EX1NZTkM7CisJcC5wYXIuc3luYyA9IHN5bmNfY29tcDsKKworCXJmYmlfcHVzaF9jbWQoJnApOworCisJRFNTREJHKCJSRkJJIHN5bmMgcHVzaGVkIHRvIGNtZCBmaWZvXG4iKTsKKworCXByb2Nlc3NfY21kX2ZpZm8oKTsKK30KKwordm9pZCByZmJpX2R1bXBfcmVncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCit7CisjZGVmaW5lIERVTVBSRUcocikgc2VxX3ByaW50ZihzLCAiJS0zNXMgJTA4eFxuIiwgI3IsIHJmYmlfcmVhZF9yZWcocikpCisKKwlkc3NfY2xrX2VuYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLMSk7CisKKwlEVU1QUkVHKFJGQklfUkVWSVNJT04pOworCURVTVBSRUcoUkZCSV9TWVNDT05GSUcpOworCURVTVBSRUcoUkZCSV9TWVNTVEFUVVMpOworCURVTVBSRUcoUkZCSV9DT05UUk9MKTsKKwlEVU1QUkVHKFJGQklfUElYRUxfQ05UKTsKKwlEVU1QUkVHKFJGQklfTElORV9OVU1CRVIpOworCURVTVBSRUcoUkZCSV9DTUQpOworCURVTVBSRUcoUkZCSV9QQVJBTSk7CisJRFVNUFJFRyhSRkJJX0RBVEEpOworCURVTVBSRUcoUkZCSV9SRUFEKTsKKwlEVU1QUkVHKFJGQklfU1RBVFVTKTsKKworCURVTVBSRUcoUkZCSV9DT05GSUcoMCkpOworCURVTVBSRUcoUkZCSV9PTk9GRl9USU1FKDApKTsKKwlEVU1QUkVHKFJGQklfQ1lDTEVfVElNRSgwKSk7CisJRFVNUFJFRyhSRkJJX0RBVEFfQ1lDTEUxKDApKTsKKwlEVU1QUkVHKFJGQklfREFUQV9DWUNMRTIoMCkpOworCURVTVBSRUcoUkZCSV9EQVRBX0NZQ0xFMygwKSk7CisKKwlEVU1QUkVHKFJGQklfQ09ORklHKDEpKTsKKwlEVU1QUkVHKFJGQklfT05PRkZfVElNRSgxKSk7CisJRFVNUFJFRyhSRkJJX0NZQ0xFX1RJTUUoMSkpOworCURVTVBSRUcoUkZCSV9EQVRBX0NZQ0xFMSgxKSk7CisJRFVNUFJFRyhSRkJJX0RBVEFfQ1lDTEUyKDEpKTsKKwlEVU1QUkVHKFJGQklfREFUQV9DWUNMRTMoMSkpOworCisJRFVNUFJFRyhSRkJJX1ZTWU5DX1dJRFRIKTsKKwlEVU1QUkVHKFJGQklfSFNZTkNfV0lEVEgpOworCisJZHNzX2Nsa19kaXNhYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0sxKTsKKyN1bmRlZiBEVU1QUkVHCit9CisKK2ludCByZmJpX2luaXQodm9pZCkKK3sKKwl1MzIgcmV2OworCXUzMiBsOworCisJc3Bpbl9sb2NrX2luaXQoJnJmYmkuY21kX2xvY2spOworCXJmYmkuY21kX2ZpZm8gPSBrZmlmb19hbGxvYyhSRkJJX0NNRF9GSUZPX0xFTl9CWVRFUywgR0ZQX0tFUk5FTCwKKwkJCQkgICAgJnJmYmkuY21kX2xvY2spOworCWlmIChJU19FUlIocmZiaS5jbWRfZmlmbykpCisJCXJldHVybiAtRU5PTUVNOworCisJaW5pdF9jb21wbGV0aW9uKCZyZmJpLmNtZF9kb25lKTsKKwlhdG9taWNfc2V0KCZyZmJpLmNtZF9maWZvX2Z1bGwsIDApOworCWF0b21pY19zZXQoJnJmYmkuY21kX3BlbmRpbmcsIDApOworCisJcmZiaS5iYXNlID0gaW9yZW1hcChSRkJJX0JBU0UsIFNaXzI1Nik7CisJaWYgKCFyZmJpLmJhc2UpIHsKKwkJRFNTRVJSKCJjYW4ndCBpb3JlbWFwIFJGQklcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMSk7CisKKwltc2xlZXAoMTApOworCisJcmZiaS5sNF9raHogPSBkc3NfY2xrX2dldF9yYXRlKERTU19DTEtfSUNLKSAvIDEwMDA7CisKKwkvKiBFbmFibGUgYXV0b2lkbGUgYW5kIHNtYXJ0LWlkbGUgKi8KKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX1NZU0NPTkZJRyk7CisJbCB8PSAoMSA8PCAwKSB8ICgyIDw8IDMpOworCXJmYmlfd3JpdGVfcmVnKFJGQklfU1lTQ09ORklHLCBsKTsKKworCXJldiA9IHJmYmlfcmVhZF9yZWcoUkZCSV9SRVZJU0lPTik7CisJcHJpbnRrKEtFUk5fSU5GTyAiT01BUCBSRkJJIHJldiAlZC4lZFxuIiwKKwkgICAgICAgRkxEX0dFVChyZXYsIDcsIDQpLCBGTERfR0VUKHJldiwgMywgMCkpOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcmZiaV9leGl0KHZvaWQpCit7CisJRFNTREJHKCJyZmJpX2V4aXRcbiIpOworCisJa2ZpZm9fZnJlZShyZmJpLmNtZF9maWZvKTsKKworCWlvdW5tYXAocmZiaS5iYXNlKTsKK30KKworLyogc3RydWN0IG9tYXBfZGlzcGxheSBzdXBwb3J0ICovCitzdGF0aWMgaW50IHJmYmlfZGlzcGxheV91cGRhdGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQkJdTE2IHgsIHUxNiB5LCB1MTYgdywgdTE2IGgpCit7CisJaW50IHJmYmlfbW9kdWxlOworCisJaWYgKHcgPT0gMCB8fCBoID09IDApCisJCXJldHVybiAwOworCisJcmZiaV9tb2R1bGUgPSByZmJpX2ZpbmRfZGlzcGxheShkc3NkZXYpOworCisJcmZiaV9wdXNoX3VwZGF0ZShyZmJpX21vZHVsZSwgeCwgeSwgdywgaCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZmJpX2Rpc3BsYXlfc3luYyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJc3RydWN0IGNvbXBsZXRpb24gc3luY19jb21wOworCWludCByZmJpX21vZHVsZTsKKworCXJmYmlfbW9kdWxlID0gcmZiaV9maW5kX2Rpc3BsYXkoZHNzZGV2KTsKKworCWluaXRfY29tcGxldGlvbigmc3luY19jb21wKTsKKwlyZmJpX3B1c2hfc3luYyhyZmJpX21vZHVsZSwgJnN5bmNfY29tcCk7CisJRFNTREJHKCJXYWl0aW5nIGZvciBTWU5DIHRvIGhhcHBlbi4uLlxuIik7CisJd2FpdF9mb3JfY29tcGxldGlvbigmc3luY19jb21wKTsKKwlEU1NEQkcoIlJlbGVhc2VkIGZyb20gU1lOQ1xuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZiaV9kaXNwbGF5X2VuYWJsZV90ZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGJvb2wgZW5hYmxlKQoreworCWRzc2Rldi0+ZHJpdmVyLT5lbmFibGVfdGUoZHNzZGV2LCBlbmFibGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJmYmlfZGlzcGxheV9lbmFibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWludCByOworCisJciA9IG9tYXBfZHNzX3N0YXJ0X2RldmljZShkc3NkZXYpOworCWlmIChyKSB7CisJCURTU0VSUigiZmFpbGVkIHRvIHN0YXJ0IGRldmljZVxuIik7CisJCWdvdG8gZXJyMDsKKwl9CisKKwlyID0gb21hcF9kaXNwY19yZWdpc3Rlcl9pc3IoZnJhbWVkb25lX2NhbGxiYWNrLCBOVUxMLAorCQkJRElTUENfSVJRX0ZSQU1FRE9ORSk7CisJaWYgKHIpIHsKKwkJRFNTRVJSKCJjYW4ndCBnZXQgRlJBTUVET05FIGlycVxuIik7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlkaXNwY19zZXRfbGNkX2Rpc3BsYXlfdHlwZShPTUFQX0RTU19MQ0RfRElTUExBWV9URlQpOworCisJZGlzcGNfc2V0X3BhcmFsbGVsX2ludGVyZmFjZV9tb2RlKE9NQVBfRFNTX1BBUkFMTEVMTU9ERV9SRkJJKTsKKworCWRpc3BjX3NldF90ZnRfZGF0YV9saW5lcyhkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZSk7CisKKwlyZmJpX2NvbmZpZ3VyZShkc3NkZXYtPnBoeS5yZmJpLmNoYW5uZWwsCisJCQkgICAgICAgZHNzZGV2LT5jdHJsLnBpeGVsX3NpemUsCisJCQkgICAgICAgZHNzZGV2LT5waHkucmZiaS5kYXRhX2xpbmVzKTsKKworCXJmYmlfc2V0X3RpbWluZ3MoZHNzZGV2LT5waHkucmZiaS5jaGFubmVsLAorCQkJICZkc3NkZXYtPmN0cmwucmZiaV90aW1pbmdzKTsKKworCisJaWYgKGRzc2Rldi0+ZHJpdmVyLT5lbmFibGUpIHsKKwkJciA9IGRzc2Rldi0+ZHJpdmVyLT5lbmFibGUoZHNzZGV2KTsKKwkJaWYgKHIpCisJCQlnb3RvIGVycjI7CisJfQorCisJcmV0dXJuIDA7CitlcnIyOgorCW9tYXBfZGlzcGNfdW5yZWdpc3Rlcl9pc3IoZnJhbWVkb25lX2NhbGxiYWNrLCBOVUxMLAorCQkJRElTUENfSVJRX0ZSQU1FRE9ORSk7CitlcnIxOgorCW9tYXBfZHNzX3N0b3BfZGV2aWNlKGRzc2Rldik7CitlcnIwOgorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCByZmJpX2Rpc3BsYXlfZGlzYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJZHNzZGV2LT5kcml2ZXItPmRpc2FibGUoZHNzZGV2KTsKKwlvbWFwX2Rpc3BjX3VucmVnaXN0ZXJfaXNyKGZyYW1lZG9uZV9jYWxsYmFjaywgTlVMTCwKKwkJCURJU1BDX0lSUV9GUkFNRURPTkUpOworCW9tYXBfZHNzX3N0b3BfZGV2aWNlKGRzc2Rldik7Cit9CisKK2ludCByZmJpX2luaXRfZGlzcGxheShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJZHNzZGV2LT5lbmFibGUgPSByZmJpX2Rpc3BsYXlfZW5hYmxlOworCWRzc2Rldi0+ZGlzYWJsZSA9IHJmYmlfZGlzcGxheV9kaXNhYmxlOworCWRzc2Rldi0+dXBkYXRlID0gcmZiaV9kaXNwbGF5X3VwZGF0ZTsKKwlkc3NkZXYtPnN5bmMgPSByZmJpX2Rpc3BsYXlfc3luYzsKKwlkc3NkZXYtPmVuYWJsZV90ZSA9IHJmYmlfZGlzcGxheV9lbmFibGVfdGU7CisKKwlyZmJpLmRzc2Rldltkc3NkZXYtPnBoeS5yZmJpLmNoYW5uZWxdID0gZHNzZGV2OworCisJZHNzZGV2LT5jYXBzID0gT01BUF9EU1NfRElTUExBWV9DQVBfTUFOVUFMX1VQREFURTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3Mvc2RpLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9zZGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjRmMzA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3Mvc2RpLmMKQEAgLTAsMCArMSwyNzcgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9zZGkuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBUb21pIFZhbGtlaW5lbiA8dG9taS52YWxrZWluZW5Abm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2RlZmluZSBEU1NfU1VCU1lTX05BTUUgIlNESSIKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlIDxwbGF0L2Rpc3BsYXkuaD4KKyNpbmNsdWRlICJkc3MuaCIKKworc3RhdGljIHN0cnVjdCB7CisJYm9vbCBza2lwX2luaXQ7CisJYm9vbCB1cGRhdGVfZW5hYmxlZDsKK30gc2RpOworCitzdGF0aWMgdm9pZCBzZGlfYmFzaWNfaW5pdCh2b2lkKQoreworCWRpc3BjX3NldF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZShPTUFQX0RTU19QQVJBTExFTE1PREVfQllQQVNTKTsKKworCWRpc3BjX3NldF9sY2RfZGlzcGxheV90eXBlKE9NQVBfRFNTX0xDRF9ESVNQTEFZX1RGVCk7CisJZGlzcGNfc2V0X3RmdF9kYXRhX2xpbmVzKDI0KTsKKwlkaXNwY19sY2RfZW5hYmxlX3NpZ25hbF9wb2xhcml0eSgxKTsKK30KKworc3RhdGljIGludCBzZGlfZGlzcGxheV9lbmFibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnQgPSAmZHNzZGV2LT5wYW5lbC50aW1pbmdzOworCXN0cnVjdCBkc3NfY2xvY2tfaW5mbyBkc3NfY2luZm87CisJc3RydWN0IGRpc3BjX2Nsb2NrX2luZm8gZGlzcGNfY2luZm87CisJdTE2IGxja19kaXYsIHBja19kaXY7CisJdW5zaWduZWQgbG9uZyBmY2s7CisJdW5zaWduZWQgbG9uZyBwY2s7CisJaW50IHI7CisKKwlyID0gb21hcF9kc3Nfc3RhcnRfZGV2aWNlKGRzc2Rldik7CisJaWYgKHIpIHsKKwkJRFNTRVJSKCJmYWlsZWQgdG8gc3RhcnQgZGV2aWNlXG4iKTsKKwkJZ290byBlcnIwOworCX0KKworCWlmIChkc3NkZXYtPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfRElTQUJMRUQpIHsKKwkJRFNTRVJSKCJkc3NkZXYgYWxyZWFkeSBlbmFibGVkXG4iKTsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyMTsKKwl9CisKKwkvKiBJbiBjYXNlIG9mIHNraXBfaW5pdCBzZGlfaW5pdCBoYXMgYWxyZWFkeSBlbmFibGVkIHRoZSBjbG9ja3MgKi8KKwlpZiAoIXNkaS5za2lwX2luaXQpCisJCWRzc19jbGtfZW5hYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0sxKTsKKworCXNkaV9iYXNpY19pbml0KCk7CisKKwkvKiAxNS41LjkuMS4yICovCisJZHNzZGV2LT5wYW5lbC5jb25maWcgfD0gT01BUF9EU1NfTENEX1JGIHwgT01BUF9EU1NfTENEX09OT0ZGOworCisJZGlzcGNfc2V0X3BvbF9mcmVxKGRzc2Rldi0+cGFuZWwuY29uZmlnLCBkc3NkZXYtPnBhbmVsLmFjYmksCisJCQlkc3NkZXYtPnBhbmVsLmFjYik7CisKKwlpZiAoIXNkaS5za2lwX2luaXQpIHsKKwkJciA9IGRzc19jYWxjX2Nsb2NrX2RpdigxLCB0LT5waXhlbF9jbG9jayAqIDEwMDAsCisJCQkJJmRzc19jaW5mbywgJmRpc3BjX2NpbmZvKTsKKwl9IGVsc2UgeworCQlyID0gZHNzX2dldF9jbG9ja19kaXYoJmRzc19jaW5mbyk7CisJCXIgPSBkaXNwY19nZXRfY2xvY2tfZGl2KCZkaXNwY19jaW5mbyk7CisJfQorCisJaWYgKHIpCisJCWdvdG8gZXJyMjsKKworCWZjayA9IGRzc19jaW5mby5mY2s7CisJbGNrX2RpdiA9IGRpc3BjX2NpbmZvLmxja19kaXY7CisJcGNrX2RpdiA9IGRpc3BjX2NpbmZvLnBja19kaXY7CisKKwlwY2sgPSBmY2sgLyBsY2tfZGl2IC8gcGNrX2RpdiAvIDEwMDA7CisKKwlpZiAocGNrICE9IHQtPnBpeGVsX2Nsb2NrKSB7CisJCURTU1dBUk4oIkNvdWxkIG5vdCBmaW5kIGV4YWN0IHBpeGVsIGNsb2NrLiBSZXF1ZXN0ZWQgJWQga0h6LCAiCisJCQkJImdvdCAlbHUga0h6XG4iLAorCQkJCXQtPnBpeGVsX2Nsb2NrLCBwY2spOworCisJCXQtPnBpeGVsX2Nsb2NrID0gcGNrOworCX0KKworCisJZGlzcGNfc2V0X2xjZF90aW1pbmdzKHQpOworCisJciA9IGRzc19zZXRfY2xvY2tfZGl2KCZkc3NfY2luZm8pOworCWlmIChyKQorCQlnb3RvIGVycjI7CisKKwlyID0gZGlzcGNfc2V0X2Nsb2NrX2RpdigmZGlzcGNfY2luZm8pOworCWlmIChyKQorCQlnb3RvIGVycjI7CisKKwlpZiAoIXNkaS5za2lwX2luaXQpIHsKKwkJZHNzX3NkaV9pbml0KGRzc2Rldi0+cGh5LnNkaS5kYXRhcGFpcnMpOworCQlyID0gZHNzX3NkaV9lbmFibGUoKTsKKwkJaWYgKHIpCisJCQlnb3RvIGVycjE7CisJCW1kZWxheSgyKTsKKwl9CisKKwlkaXNwY19lbmFibGVfbGNkX291dCgxKTsKKworCWlmIChkc3NkZXYtPmRyaXZlci0+ZW5hYmxlKSB7CisJCXIgPSBkc3NkZXYtPmRyaXZlci0+ZW5hYmxlKGRzc2Rldik7CisJCWlmIChyKQorCQkJZ290byBlcnIzOworCX0KKworCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRTsKKworCXNkaS5za2lwX2luaXQgPSAwOworCisJcmV0dXJuIDA7CitlcnIzOgorCWRpc3BjX2VuYWJsZV9sY2Rfb3V0KDApOworZXJyMjoKKwlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSzEpOworZXJyMToKKwlvbWFwX2Rzc19zdG9wX2RldmljZShkc3NkZXYpOworZXJyMDoKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBzZGlfZGlzcGxheV9yZXN1bWUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KTsKKworc3RhdGljIHZvaWQgc2RpX2Rpc3BsYXlfZGlzYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJaWYgKGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9ESVNBQkxFRCkKKwkJcmV0dXJuOworCisJaWYgKGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9TVVNQRU5ERUQpCisJCWlmIChzZGlfZGlzcGxheV9yZXN1bWUoZHNzZGV2KSkKKwkJCXJldHVybjsKKworCWlmIChkc3NkZXYtPmRyaXZlci0+ZGlzYWJsZSkKKwkJZHNzZGV2LT5kcml2ZXItPmRpc2FibGUoZHNzZGV2KTsKKworCWRpc3BjX2VuYWJsZV9sY2Rfb3V0KDApOworCisJZHNzX3NkaV9kaXNhYmxlKCk7CisKKwlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSzEpOworCisJZHNzZGV2LT5zdGF0ZSA9IE9NQVBfRFNTX0RJU1BMQVlfRElTQUJMRUQ7CisKKwlvbWFwX2Rzc19zdG9wX2RldmljZShkc3NkZXYpOworfQorCitzdGF0aWMgaW50IHNkaV9kaXNwbGF5X3N1c3BlbmQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWlmIChkc3NkZXYtPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkc3NkZXYtPmRyaXZlci0+c3VzcGVuZCkKKwkJZHNzZGV2LT5kcml2ZXItPnN1c3BlbmQoZHNzZGV2KTsKKworCWRpc3BjX2VuYWJsZV9sY2Rfb3V0KDApOworCisJZHNzX3NkaV9kaXNhYmxlKCk7CisKKwlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSzEpOworCisJZHNzZGV2LT5zdGF0ZSA9IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RpX2Rpc3BsYXlfcmVzdW1lKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlpbnQgcjsKKworCWlmIChkc3NkZXYtPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRzc19jbGtfZW5hYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0sxKTsKKworCXIgPSBkc3Nfc2RpX2VuYWJsZSgpOworCWlmIChyKQorCQlnb3RvIGVycjsKKwltZGVsYXkoMik7CisKKwlkaXNwY19lbmFibGVfbGNkX291dCgxKTsKKworCWlmIChkc3NkZXYtPmRyaXZlci0+cmVzdW1lKQorCQlkc3NkZXYtPmRyaXZlci0+cmVzdW1lKGRzc2Rldik7CisKKwlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkU7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSzEpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHNkaV9kaXNwbGF5X3NldF91cGRhdGVfbW9kZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCisJCWVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUgbW9kZSkKK3sKKwlpZiAobW9kZSA9PSBPTUFQX0RTU19VUERBVEVfTUFOVUFMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtb2RlID09IE9NQVBfRFNTX1VQREFURV9ESVNBQkxFRCkgeworCQlkaXNwY19lbmFibGVfbGNkX291dCgwKTsKKwkJc2RpLnVwZGF0ZV9lbmFibGVkID0gMDsKKwl9IGVsc2UgeworCQlkaXNwY19lbmFibGVfbGNkX291dCgxKTsKKwkJc2RpLnVwZGF0ZV9lbmFibGVkID0gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUgc2RpX2Rpc3BsYXlfZ2V0X3VwZGF0ZV9tb2RlKAorCQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJcmV0dXJuIHNkaS51cGRhdGVfZW5hYmxlZCA/IE9NQVBfRFNTX1VQREFURV9BVVRPIDoKKwkJT01BUF9EU1NfVVBEQVRFX0RJU0FCTEVEOworfQorCitzdGF0aWMgdm9pZCBzZGlfZ2V0X3RpbWluZ3Moc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKK3sKKwkqdGltaW5ncyA9IGRzc2Rldi0+cGFuZWwudGltaW5nczsKK30KKworaW50IHNkaV9pbml0X2Rpc3BsYXkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCURTU0RCRygiU0RJIGluaXRcbiIpOworCisJZHNzZGV2LT5lbmFibGUgPSBzZGlfZGlzcGxheV9lbmFibGU7CisJZHNzZGV2LT5kaXNhYmxlID0gc2RpX2Rpc3BsYXlfZGlzYWJsZTsKKwlkc3NkZXYtPnN1c3BlbmQgPSBzZGlfZGlzcGxheV9zdXNwZW5kOworCWRzc2Rldi0+cmVzdW1lID0gc2RpX2Rpc3BsYXlfcmVzdW1lOworCWRzc2Rldi0+c2V0X3VwZGF0ZV9tb2RlID0gc2RpX2Rpc3BsYXlfc2V0X3VwZGF0ZV9tb2RlOworCWRzc2Rldi0+Z2V0X3VwZGF0ZV9tb2RlID0gc2RpX2Rpc3BsYXlfZ2V0X3VwZGF0ZV9tb2RlOworCWRzc2Rldi0+Z2V0X3RpbWluZ3MgPSBzZGlfZ2V0X3RpbWluZ3M7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNkaV9pbml0KGJvb2wgc2tpcF9pbml0KQoreworCS8qIHdlIHN0b3JlIHRoaXMgZm9yIGZpcnN0IGRpc3BsYXkgZW5hYmxlLCB0aGVuIGNsZWFyIGl0ICovCisJc2RpLnNraXBfaW5pdCA9IHNraXBfaW5pdDsKKworCS8qCisJICogRW5hYmxlIGNsb2NrcyBhbHJlYWR5IGhlcmUsIG90aGVyd2lzZSB0aGVyZSB3b3VsZCBiZSBhIHRvZ2dsZQorCSAqIG9mIHRoZW0gdW50aWwgc2RpX2Rpc3BsYXlfZW5hYmxlIGlzIGNhbGxlZC4KKwkgKi8KKwlpZiAoc2tpcF9pbml0KQorCQlkc3NfY2xrX2VuYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLMSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2RpX2V4aXQodm9pZCkKK3sKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3ZlbmMuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3ZlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDlhNWEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvdmVuYy5jCkBAIC0wLDAgKzEsNzk3IEBACisvKgorICogbGludXgvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvdmVuYy5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IFRvbWkgVmFsa2VpbmVuIDx0b21pLnZhbGtlaW5lbkBub2tpYS5jb20+CisgKgorICogVkVOQyBzZXR0aW5ncyBmcm9tIFRJJ3MgRFNTIGRyaXZlcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2RlZmluZSBEU1NfU1VCU1lTX05BTUUgIlZFTkMiCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKworI2luY2x1ZGUgPHBsYXQvZGlzcGxheS5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisKKyNpbmNsdWRlICJkc3MuaCIKKworI2RlZmluZSBWRU5DX0JBU0UJMHg0ODA1MEMwMAorCisvKiBWZW5jIHJlZ2lzdGVycyAqLworI2RlZmluZSBWRU5DX1JFVl9JRAkJCQkweDAwCisjZGVmaW5lIFZFTkNfU1RBVFVTCQkJCTB4MDQKKyNkZWZpbmUgVkVOQ19GX0NPTlRST0wJCQkJMHgwOAorI2RlZmluZSBWRU5DX1ZJRE9VVF9DVFJMCQkJMHgxMAorI2RlZmluZSBWRU5DX1NZTkNfQ1RSTAkJCQkweDE0CisjZGVmaW5lIFZFTkNfTExFTgkJCQkweDFDCisjZGVmaW5lIFZFTkNfRkxFTlMJCQkJMHgyMAorI2RlZmluZSBWRU5DX0hGTFRSX0NUUkwJCQkJMHgyNAorI2RlZmluZSBWRU5DX0NDX0NBUlJfV1NTX0NBUlIJCQkweDI4CisjZGVmaW5lIFZFTkNfQ19QSEFTRQkJCQkweDJDCisjZGVmaW5lIFZFTkNfR0FJTl9VCQkJCTB4MzAKKyNkZWZpbmUgVkVOQ19HQUlOX1YJCQkJMHgzNAorI2RlZmluZSBWRU5DX0dBSU5fWQkJCQkweDM4CisjZGVmaW5lIFZFTkNfQkxBQ0tfTEVWRUwJCQkweDNDCisjZGVmaW5lIFZFTkNfQkxBTktfTEVWRUwJCQkweDQwCisjZGVmaW5lIFZFTkNfWF9DT0xPUgkJCQkweDQ0CisjZGVmaW5lIFZFTkNfTV9DT05UUk9MCQkJCTB4NDgKKyNkZWZpbmUgVkVOQ19CU1RBTVBfV1NTX0RBVEEJCQkweDRDCisjZGVmaW5lIFZFTkNfU19DQVJSCQkJCTB4NTAKKyNkZWZpbmUgVkVOQ19MSU5FMjEJCQkJMHg1NAorI2RlZmluZSBWRU5DX0xOX1NFTAkJCQkweDU4CisjZGVmaW5lIFZFTkNfTDIxX19XQ19DVEwJCQkweDVDCisjZGVmaW5lIFZFTkNfSFRSSUdHRVJfVlRSSUdHRVIJCQkweDYwCisjZGVmaW5lIFZFTkNfU0FWSURfX0VBVklECQkJMHg2NAorI2RlZmluZSBWRU5DX0ZMRU5fX0ZBTAkJCQkweDY4CisjZGVmaW5lIFZFTkNfTEFMX19QSEFTRV9SRVNFVAkJCTB4NkMKKyNkZWZpbmUgVkVOQ19IU19JTlRfU1RBUlRfU1RPUF9YCQkweDcwCisjZGVmaW5lIFZFTkNfSFNfRVhUX1NUQVJUX1NUT1BfWAkJMHg3NAorI2RlZmluZSBWRU5DX1ZTX0lOVF9TVEFSVF9YCQkJMHg3OAorI2RlZmluZSBWRU5DX1ZTX0lOVF9TVE9QX1hfX1ZTX0lOVF9TVEFSVF9ZCTB4N0MKKyNkZWZpbmUgVkVOQ19WU19JTlRfU1RPUF9ZX19WU19FWFRfU1RBUlRfWAkweDgwCisjZGVmaW5lIFZFTkNfVlNfRVhUX1NUT1BfWF9fVlNfRVhUX1NUQVJUX1kJMHg4NAorI2RlZmluZSBWRU5DX1ZTX0VYVF9TVE9QX1kJCQkweDg4CisjZGVmaW5lIFZFTkNfQVZJRF9TVEFSVF9TVE9QX1gJCQkweDkwCisjZGVmaW5lIFZFTkNfQVZJRF9TVEFSVF9TVE9QX1kJCQkweDk0CisjZGVmaW5lIFZFTkNfRklEX0lOVF9TVEFSVF9YX19GSURfSU5UX1NUQVJUX1kJMHhBMAorI2RlZmluZSBWRU5DX0ZJRF9JTlRfT0ZGU0VUX1lfX0ZJRF9FWFRfU1RBUlRfWAkweEE0CisjZGVmaW5lIFZFTkNfRklEX0VYVF9TVEFSVF9ZX19GSURfRVhUX09GRlNFVF9ZCTB4QTgKKyNkZWZpbmUgVkVOQ19UVkRFVEdQX0lOVF9TVEFSVF9TVE9QX1gJCTB4QjAKKyNkZWZpbmUgVkVOQ19UVkRFVEdQX0lOVF9TVEFSVF9TVE9QX1kJCTB4QjQKKyNkZWZpbmUgVkVOQ19HRU5fQ1RSTAkJCQkweEI4CisjZGVmaW5lIFZFTkNfT1VUUFVUX0NPTlRST0wJCQkweEM0CisjZGVmaW5lIFZFTkNfT1VUUFVUX1RFU1QJCQkweEM4CisjZGVmaW5lIFZFTkNfREFDX0JfX0RBQ19DCQkJMHhDOAorCitzdHJ1Y3QgdmVuY19jb25maWcgeworCXUzMiBmX2NvbnRyb2w7CisJdTMyIHZpZG91dF9jdHJsOworCXUzMiBzeW5jX2N0cmw7CisJdTMyIGxsZW47CisJdTMyIGZsZW5zOworCXUzMiBoZmx0cl9jdHJsOworCXUzMiBjY19jYXJyX3dzc19jYXJyOworCXUzMiBjX3BoYXNlOworCXUzMiBnYWluX3U7CisJdTMyIGdhaW5fdjsKKwl1MzIgZ2Fpbl95OworCXUzMiBibGFja19sZXZlbDsKKwl1MzIgYmxhbmtfbGV2ZWw7CisJdTMyIHhfY29sb3I7CisJdTMyIG1fY29udHJvbDsKKwl1MzIgYnN0YW1wX3dzc19kYXRhOworCXUzMiBzX2NhcnI7CisJdTMyIGxpbmUyMTsKKwl1MzIgbG5fc2VsOworCXUzMiBsMjFfX3djX2N0bDsKKwl1MzIgaHRyaWdnZXJfdnRyaWdnZXI7CisJdTMyIHNhdmlkX19lYXZpZDsKKwl1MzIgZmxlbl9fZmFsOworCXUzMiBsYWxfX3BoYXNlX3Jlc2V0OworCXUzMiBoc19pbnRfc3RhcnRfc3RvcF94OworCXUzMiBoc19leHRfc3RhcnRfc3RvcF94OworCXUzMiB2c19pbnRfc3RhcnRfeDsKKwl1MzIgdnNfaW50X3N0b3BfeF9fdnNfaW50X3N0YXJ0X3k7CisJdTMyIHZzX2ludF9zdG9wX3lfX3ZzX2V4dF9zdGFydF94OworCXUzMiB2c19leHRfc3RvcF94X192c19leHRfc3RhcnRfeTsKKwl1MzIgdnNfZXh0X3N0b3BfeTsKKwl1MzIgYXZpZF9zdGFydF9zdG9wX3g7CisJdTMyIGF2aWRfc3RhcnRfc3RvcF95OworCXUzMiBmaWRfaW50X3N0YXJ0X3hfX2ZpZF9pbnRfc3RhcnRfeTsKKwl1MzIgZmlkX2ludF9vZmZzZXRfeV9fZmlkX2V4dF9zdGFydF94OworCXUzMiBmaWRfZXh0X3N0YXJ0X3lfX2ZpZF9leHRfb2Zmc2V0X3k7CisJdTMyIHR2ZGV0Z3BfaW50X3N0YXJ0X3N0b3BfeDsKKwl1MzIgdHZkZXRncF9pbnRfc3RhcnRfc3RvcF95OworCXUzMiBnZW5fY3RybDsKK307CisKKy8qIGZyb20gVFJNICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHZlbmNfY29uZmlnIHZlbmNfY29uZmlnX3BhbF90cm0gPSB7CisJLmZfY29udHJvbAkJCQk9IDAsCisJLnZpZG91dF9jdHJsCQkJCT0gMSwKKwkuc3luY19jdHJsCQkJCT0gMHg0MCwKKwkubGxlbgkJCQkJPSAweDM1RiwgLyogODYzICovCisJLmZsZW5zCQkJCQk9IDB4MjcwLCAvKiA2MjQgKi8KKwkuaGZsdHJfY3RybAkJCQk9IDAsCisJLmNjX2NhcnJfd3NzX2NhcnIJCQk9IDB4MkY3MjI1RUQsCisJLmNfcGhhc2UJCQkJPSAwLAorCS5nYWluX3UJCQkJCT0gMHgxMTEsCisJLmdhaW5fdgkJCQkJPSAweDE4MSwKKwkuZ2Fpbl95CQkJCQk9IDB4MTQwLAorCS5ibGFja19sZXZlbAkJCQk9IDB4M0IsCisJLmJsYW5rX2xldmVsCQkJCT0gMHgzQiwKKwkueF9jb2xvcgkJCQk9IDB4NywKKwkubV9jb250cm9sCQkJCT0gMHgyLAorCS5ic3RhbXBfd3NzX2RhdGEJCQk9IDB4M0YsCisJLnNfY2FycgkJCQkJPSAweDJBMDk4QUNCLAorCS5saW5lMjEJCQkJCT0gMCwKKwkubG5fc2VsCQkJCQk9IDB4MDEyOTAwMTUsCisJLmwyMV9fd2NfY3RsCQkJCT0gMHgwMDAwRjYwMywKKwkuaHRyaWdnZXJfdnRyaWdnZXIJCQk9IDAsCisKKwkuc2F2aWRfX2VhdmlkCQkJCT0gMHgwNkE3MDEwOCwKKwkuZmxlbl9fZmFsCQkJCT0gMHgwMDE4MDI3MCwKKwkubGFsX19waGFzZV9yZXNldAkJCT0gMHgwMDA0MDEzNSwKKwkuaHNfaW50X3N0YXJ0X3N0b3BfeAkJCT0gMHgwMDg4MDM1OCwKKwkuaHNfZXh0X3N0YXJ0X3N0b3BfeAkJCT0gMHgwMDBGMDM1RiwKKwkudnNfaW50X3N0YXJ0X3gJCQkJPSAweDAxQTcwMDAwLAorCS52c19pbnRfc3RvcF94X192c19pbnRfc3RhcnRfeQkJPSAweDAwMDAwMUE3LAorCS52c19pbnRfc3RvcF95X192c19leHRfc3RhcnRfeAkJPSAweDAxQUYwMDAwLAorCS52c19leHRfc3RvcF94X192c19leHRfc3RhcnRfeQkJPSAweDAwMDEwMUFGLAorCS52c19leHRfc3RvcF95CQkJCT0gMHgwMDAwMDAyNSwKKwkuYXZpZF9zdGFydF9zdG9wX3gJCQk9IDB4MDM1MzAwODMsCisJLmF2aWRfc3RhcnRfc3RvcF95CQkJPSAweDAyNkMwMDJFLAorCS5maWRfaW50X3N0YXJ0X3hfX2ZpZF9pbnRfc3RhcnRfeQk9IDB4MDAwMTAwOEEsCisJLmZpZF9pbnRfb2Zmc2V0X3lfX2ZpZF9leHRfc3RhcnRfeAk9IDB4MDAyRTAxMzgsCisJLmZpZF9leHRfc3RhcnRfeV9fZmlkX2V4dF9vZmZzZXRfeQk9IDB4MDEzODAwMDEsCisKKwkudHZkZXRncF9pbnRfc3RhcnRfc3RvcF94CQk9IDB4MDAxNDAwMDEsCisJLnR2ZGV0Z3BfaW50X3N0YXJ0X3N0b3BfeQkJPSAweDAwMDEwMDAxLAorCS5nZW5fY3RybAkJCQk9IDB4MDBGRjAwMDAsCit9OworCisvKiBmcm9tIFRSTSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2ZW5jX2NvbmZpZyB2ZW5jX2NvbmZpZ19udHNjX3RybSA9IHsKKwkuZl9jb250cm9sCQkJCT0gMCwKKwkudmlkb3V0X2N0cmwJCQkJPSAxLAorCS5zeW5jX2N0cmwJCQkJPSAweDgwNDAsCisJLmxsZW4JCQkJCT0gMHgzNTksCisJLmZsZW5zCQkJCQk9IDB4MjBDLAorCS5oZmx0cl9jdHJsCQkJCT0gMCwKKwkuY2NfY2Fycl93c3NfY2FycgkJCT0gMHgwNDNGMjYzMSwKKwkuY19waGFzZQkJCQk9IDAsCisJLmdhaW5fdQkJCQkJPSAweDEwMiwKKwkuZ2Fpbl92CQkJCQk9IDB4MTZDLAorCS5nYWluX3kJCQkJCT0gMHgxMkYsCisJLmJsYWNrX2xldmVsCQkJCT0gMHg0MywKKwkuYmxhbmtfbGV2ZWwJCQkJPSAweDM4LAorCS54X2NvbG9yCQkJCT0gMHg3LAorCS5tX2NvbnRyb2wJCQkJPSAweDEsCisJLmJzdGFtcF93c3NfZGF0YQkJCT0gMHgzOCwKKwkuc19jYXJyCQkJCQk9IDB4MjFGMDdDMUYsCisJLmxpbmUyMQkJCQkJPSAwLAorCS5sbl9zZWwJCQkJCT0gMHgwMTMxMDAxMSwKKwkubDIxX193Y19jdGwJCQkJPSAweDAwMDBGMDAzLAorCS5odHJpZ2dlcl92dHJpZ2dlcgkJCT0gMCwKKworCS5zYXZpZF9fZWF2aWQJCQkJPSAweDA2OTMwMEY0LAorCS5mbGVuX19mYWwJCQkJPSAweDAwMTYwMjBDLAorCS5sYWxfX3BoYXNlX3Jlc2V0CQkJPSAweDAwMDYwMTA3LAorCS5oc19pbnRfc3RhcnRfc3RvcF94CQkJPSAweDAwOEUwMzUwLAorCS5oc19leHRfc3RhcnRfc3RvcF94CQkJPSAweDAwMEYwMzU5LAorCS52c19pbnRfc3RhcnRfeAkJCQk9IDB4MDFBMDAwMDAsCisJLnZzX2ludF9zdG9wX3hfX3ZzX2ludF9zdGFydF95CQk9IDB4MDIwNzAxQTAsCisJLnZzX2ludF9zdG9wX3lfX3ZzX2V4dF9zdGFydF94CQk9IDB4MDFBQzAwMjQsCisJLnZzX2V4dF9zdG9wX3hfX3ZzX2V4dF9zdGFydF95CQk9IDB4MDIwRDAxQUMsCisJLnZzX2V4dF9zdG9wX3kJCQkJPSAweDAwMDAwMDA2LAorCS5hdmlkX3N0YXJ0X3N0b3BfeAkJCT0gMHgwMzQ4MDA3OCwKKwkuYXZpZF9zdGFydF9zdG9wX3kJCQk9IDB4MDIwNjAwMjQsCisJLmZpZF9pbnRfc3RhcnRfeF9fZmlkX2ludF9zdGFydF95CT0gMHgwMDAxMDA4QSwKKwkuZmlkX2ludF9vZmZzZXRfeV9fZmlkX2V4dF9zdGFydF94CT0gMHgwMUFDMDEwNiwKKwkuZmlkX2V4dF9zdGFydF95X19maWRfZXh0X29mZnNldF95CT0gMHgwMTA2MDAwNiwKKworCS50dmRldGdwX2ludF9zdGFydF9zdG9wX3gJCT0gMHgwMDE0MDAwMSwKKwkudHZkZXRncF9pbnRfc3RhcnRfc3RvcF95CQk9IDB4MDAwMTAwMDEsCisJLmdlbl9jdHJsCQkJCT0gMHgwMEY5MDAwMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmVuY19jb25maWcgdmVuY19jb25maWdfcGFsX2JkZ2hpID0geworCS5mX2NvbnRyb2wJCQkJPSAwLAorCS52aWRvdXRfY3RybAkJCQk9IDAsCisJLnN5bmNfY3RybAkJCQk9IDAsCisJLmhmbHRyX2N0cmwJCQkJPSAwLAorCS54X2NvbG9yCQkJCT0gMCwKKwkubGluZTIxCQkJCQk9IDAsCisJLmxuX3NlbAkJCQkJPSAyMSwKKwkuaHRyaWdnZXJfdnRyaWdnZXIJCQk9IDAsCisJLnR2ZGV0Z3BfaW50X3N0YXJ0X3N0b3BfeAkJPSAweDAwMTQwMDAxLAorCS50dmRldGdwX2ludF9zdGFydF9zdG9wX3kJCT0gMHgwMDAxMDAwMSwKKwkuZ2VuX2N0cmwJCQkJPSAweDAwRkIwMDAwLAorCisJLmxsZW4JCQkJCT0gODY0LTEsCisJLmZsZW5zCQkJCQk9IDYyNS0xLAorCS5jY19jYXJyX3dzc19jYXJyCQkJPSAweDJGNzYyNUVELAorCS5jX3BoYXNlCQkJCT0gMHhERiwKKwkuZ2Fpbl91CQkJCQk9IDB4MTExLAorCS5nYWluX3YJCQkJCT0gMHgxODEsCisJLmdhaW5feQkJCQkJPSAweDE0MCwKKwkuYmxhY2tfbGV2ZWwJCQkJPSAweDNlLAorCS5ibGFua19sZXZlbAkJCQk9IDB4M2UsCisJLm1fY29udHJvbAkJCQk9IDA8PDIgfCAxPDwxLAorCS5ic3RhbXBfd3NzX2RhdGEJCQk9IDB4NDIsCisJLnNfY2FycgkJCQkJPSAweDJhMDk4YWNiLAorCS5sMjFfX3djX2N0bAkJCQk9IDA8PDEzIHwgMHgxNjw8OCB8IDA8PDAsCisJLnNhdmlkX19lYXZpZAkJCQk9IDB4MDZBNzAxMDgsCisJLmZsZW5fX2ZhbAkJCQk9IDIzPDwxNiB8IDYyNDw8MCwKKwkubGFsX19waGFzZV9yZXNldAkJCT0gMjw8MTcgfCAzMTA8PDAsCisJLmhzX2ludF9zdGFydF9zdG9wX3gJCQk9IDB4MDA5MjAzNTgsCisJLmhzX2V4dF9zdGFydF9zdG9wX3gJCQk9IDB4MDAwRjAzNUYsCisJLnZzX2ludF9zdGFydF94CQkJCT0gMHgxYTc8PDE2LAorCS52c19pbnRfc3RvcF94X192c19pbnRfc3RhcnRfeQkJPSAweDAwMDYwMUE3LAorCS52c19pbnRfc3RvcF95X192c19leHRfc3RhcnRfeAkJPSAweDAxQUYwMDM2LAorCS52c19leHRfc3RvcF94X192c19leHRfc3RhcnRfeQkJPSAweDI3MTAxYWYsCisJLnZzX2V4dF9zdG9wX3kJCQkJPSAweDA1LAorCS5hdmlkX3N0YXJ0X3N0b3BfeAkJCT0gMHgwMzUzMDA4MiwKKwkuYXZpZF9zdGFydF9zdG9wX3kJCQk9IDB4MDI3MDAwMkUsCisJLmZpZF9pbnRfc3RhcnRfeF9fZmlkX2ludF9zdGFydF95CT0gMHgwMDA1MDA4QSwKKwkuZmlkX2ludF9vZmZzZXRfeV9fZmlkX2V4dF9zdGFydF94CT0gMHgwMDJFMDEzOCwKKwkuZmlkX2V4dF9zdGFydF95X19maWRfZXh0X29mZnNldF95CT0gMHgwMTM4MDAwNSwKK307CisKK2NvbnN0IHN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3Mgb21hcF9kc3NfcGFsX3RpbWluZ3MgPSB7CisJLnhfcmVzCQk9IDcyMCwKKwkueV9yZXMJCT0gNTc0LAorCS5waXhlbF9jbG9jawk9IDEzNTAwLAorCS5oc3cJCT0gNjQsCisJLmhmcAkJPSAxMiwKKwkuaGJwCQk9IDY4LAorCS52c3cJCT0gNSwKKwkudmZwCQk9IDUsCisJLnZicAkJPSA0MSwKK307CitFWFBPUlRfU1lNQk9MKG9tYXBfZHNzX3BhbF90aW1pbmdzKTsKKworY29uc3Qgc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyBvbWFwX2Rzc19udHNjX3RpbWluZ3MgPSB7CisJLnhfcmVzCQk9IDcyMCwKKwkueV9yZXMJCT0gNDgyLAorCS5waXhlbF9jbG9jawk9IDEzNTAwLAorCS5oc3cJCT0gNjQsCisJLmhmcAkJPSAxNiwKKwkuaGJwCQk9IDU4LAorCS52c3cJCT0gNiwKKwkudmZwCQk9IDYsCisJLnZicAkJPSAzMSwKK307CitFWFBPUlRfU1lNQk9MKG9tYXBfZHNzX250c2NfdGltaW5ncyk7CisKK3N0YXRpYyBzdHJ1Y3QgeworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlzdHJ1Y3QgbXV0ZXggdmVuY19sb2NrOworCXUzMiB3c3NfZGF0YTsKKwlzdHJ1Y3QgcmVndWxhdG9yICp2ZGRhX2RhY19yZWc7Cit9IHZlbmM7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZW5jX3dyaXRlX3JlZyhpbnQgaWR4LCB1MzIgdmFsKQoreworCV9fcmF3X3dyaXRlbCh2YWwsIHZlbmMuYmFzZSArIGlkeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHZlbmNfcmVhZF9yZWcoaW50IGlkeCkKK3sKKwl1MzIgbCA9IF9fcmF3X3JlYWRsKHZlbmMuYmFzZSArIGlkeCk7CisJcmV0dXJuIGw7Cit9CisKK3N0YXRpYyB2b2lkIHZlbmNfd3JpdGVfY29uZmlnKGNvbnN0IHN0cnVjdCB2ZW5jX2NvbmZpZyAqY29uZmlnKQoreworCURTU0RCRygid3JpdGUgdmVuYyBjb25mXG4iKTsKKworCXZlbmNfd3JpdGVfcmVnKFZFTkNfTExFTiwgY29uZmlnLT5sbGVuKTsKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX0ZMRU5TLCBjb25maWctPmZsZW5zKTsKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX0NDX0NBUlJfV1NTX0NBUlIsIGNvbmZpZy0+Y2NfY2Fycl93c3NfY2Fycik7CisJdmVuY193cml0ZV9yZWcoVkVOQ19DX1BIQVNFLCBjb25maWctPmNfcGhhc2UpOworCXZlbmNfd3JpdGVfcmVnKFZFTkNfR0FJTl9VLCBjb25maWctPmdhaW5fdSk7CisJdmVuY193cml0ZV9yZWcoVkVOQ19HQUlOX1YsIGNvbmZpZy0+Z2Fpbl92KTsKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX0dBSU5fWSwgY29uZmlnLT5nYWluX3kpOworCXZlbmNfd3JpdGVfcmVnKFZFTkNfQkxBQ0tfTEVWRUwsIGNvbmZpZy0+YmxhY2tfbGV2ZWwpOworCXZlbmNfd3JpdGVfcmVnKFZFTkNfQkxBTktfTEVWRUwsIGNvbmZpZy0+YmxhbmtfbGV2ZWwpOworCXZlbmNfd3JpdGVfcmVnKFZFTkNfTV9DT05UUk9MLCBjb25maWctPm1fY29udHJvbCk7CisJdmVuY193cml0ZV9yZWcoVkVOQ19CU1RBTVBfV1NTX0RBVEEsIGNvbmZpZy0+YnN0YW1wX3dzc19kYXRhIHwKKwkJCXZlbmMud3NzX2RhdGEpOworCXZlbmNfd3JpdGVfcmVnKFZFTkNfU19DQVJSLCBjb25maWctPnNfY2Fycik7CisJdmVuY193cml0ZV9yZWcoVkVOQ19MMjFfX1dDX0NUTCwgY29uZmlnLT5sMjFfX3djX2N0bCk7CisJdmVuY193cml0ZV9yZWcoVkVOQ19TQVZJRF9fRUFWSUQsIGNvbmZpZy0+c2F2aWRfX2VhdmlkKTsKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX0ZMRU5fX0ZBTCwgY29uZmlnLT5mbGVuX19mYWwpOworCXZlbmNfd3JpdGVfcmVnKFZFTkNfTEFMX19QSEFTRV9SRVNFVCwgY29uZmlnLT5sYWxfX3BoYXNlX3Jlc2V0KTsKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX0hTX0lOVF9TVEFSVF9TVE9QX1gsIGNvbmZpZy0+aHNfaW50X3N0YXJ0X3N0b3BfeCk7CisJdmVuY193cml0ZV9yZWcoVkVOQ19IU19FWFRfU1RBUlRfU1RPUF9YLCBjb25maWctPmhzX2V4dF9zdGFydF9zdG9wX3gpOworCXZlbmNfd3JpdGVfcmVnKFZFTkNfVlNfSU5UX1NUQVJUX1gsIGNvbmZpZy0+dnNfaW50X3N0YXJ0X3gpOworCXZlbmNfd3JpdGVfcmVnKFZFTkNfVlNfSU5UX1NUT1BfWF9fVlNfSU5UX1NUQVJUX1ksCisJCSAgICAgICBjb25maWctPnZzX2ludF9zdG9wX3hfX3ZzX2ludF9zdGFydF95KTsKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX1ZTX0lOVF9TVE9QX1lfX1ZTX0VYVF9TVEFSVF9YLAorCQkgICAgICAgY29uZmlnLT52c19pbnRfc3RvcF95X192c19leHRfc3RhcnRfeCk7CisJdmVuY193cml0ZV9yZWcoVkVOQ19WU19FWFRfU1RPUF9YX19WU19FWFRfU1RBUlRfWSwKKwkJICAgICAgIGNvbmZpZy0+dnNfZXh0X3N0b3BfeF9fdnNfZXh0X3N0YXJ0X3kpOworCXZlbmNfd3JpdGVfcmVnKFZFTkNfVlNfRVhUX1NUT1BfWSwgY29uZmlnLT52c19leHRfc3RvcF95KTsKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX0FWSURfU1RBUlRfU1RPUF9YLCBjb25maWctPmF2aWRfc3RhcnRfc3RvcF94KTsKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX0FWSURfU1RBUlRfU1RPUF9ZLCBjb25maWctPmF2aWRfc3RhcnRfc3RvcF95KTsKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX0ZJRF9JTlRfU1RBUlRfWF9fRklEX0lOVF9TVEFSVF9ZLAorCQkgICAgICAgY29uZmlnLT5maWRfaW50X3N0YXJ0X3hfX2ZpZF9pbnRfc3RhcnRfeSk7CisJdmVuY193cml0ZV9yZWcoVkVOQ19GSURfSU5UX09GRlNFVF9ZX19GSURfRVhUX1NUQVJUX1gsCisJCSAgICAgICBjb25maWctPmZpZF9pbnRfb2Zmc2V0X3lfX2ZpZF9leHRfc3RhcnRfeCk7CisJdmVuY193cml0ZV9yZWcoVkVOQ19GSURfRVhUX1NUQVJUX1lfX0ZJRF9FWFRfT0ZGU0VUX1ksCisJCSAgICAgICBjb25maWctPmZpZF9leHRfc3RhcnRfeV9fZmlkX2V4dF9vZmZzZXRfeSk7CisKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX0RBQ19CX19EQUNfQywgIHZlbmNfcmVhZF9yZWcoVkVOQ19EQUNfQl9fREFDX0MpKTsKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX1ZJRE9VVF9DVFJMLCBjb25maWctPnZpZG91dF9jdHJsKTsKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX0hGTFRSX0NUUkwsIGNvbmZpZy0+aGZsdHJfY3RybCk7CisJdmVuY193cml0ZV9yZWcoVkVOQ19YX0NPTE9SLCBjb25maWctPnhfY29sb3IpOworCXZlbmNfd3JpdGVfcmVnKFZFTkNfTElORTIxLCBjb25maWctPmxpbmUyMSk7CisJdmVuY193cml0ZV9yZWcoVkVOQ19MTl9TRUwsIGNvbmZpZy0+bG5fc2VsKTsKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX0hUUklHR0VSX1ZUUklHR0VSLCBjb25maWctPmh0cmlnZ2VyX3Z0cmlnZ2VyKTsKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX1RWREVUR1BfSU5UX1NUQVJUX1NUT1BfWCwKKwkJICAgICAgIGNvbmZpZy0+dHZkZXRncF9pbnRfc3RhcnRfc3RvcF94KTsKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX1RWREVUR1BfSU5UX1NUQVJUX1NUT1BfWSwKKwkJICAgICAgIGNvbmZpZy0+dHZkZXRncF9pbnRfc3RhcnRfc3RvcF95KTsKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX0dFTl9DVFJMLCBjb25maWctPmdlbl9jdHJsKTsKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX0ZfQ09OVFJPTCwgY29uZmlnLT5mX2NvbnRyb2wpOworCXZlbmNfd3JpdGVfcmVnKFZFTkNfU1lOQ19DVFJMLCBjb25maWctPnN5bmNfY3RybCk7Cit9CisKK3N0YXRpYyB2b2lkIHZlbmNfcmVzZXQodm9pZCkKK3sKKwlpbnQgdCA9IDEwMDA7CisKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX0ZfQ09OVFJPTCwgMTw8OCk7CisJd2hpbGUgKHZlbmNfcmVhZF9yZWcoVkVOQ19GX0NPTlRST0wpICYgKDE8PDgpKSB7CisJCWlmICgtLXQgPT0gMCkgeworCQkJRFNTRVJSKCJGYWlsZWQgdG8gcmVzZXQgdmVuY1xuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiB0aGUgbWFnaWNhbCBzbGVlcCB0aGF0IG1ha2VzIHRoaW5ncyB3b3JrICovCisJbXNsZWVwKDIwKTsKK30KKworc3RhdGljIHZvaWQgdmVuY19lbmFibGVfY2xvY2tzKGludCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkKKwkJZHNzX2Nsa19lbmFibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSzEgfCBEU1NfQ0xLXzU0TSB8CisJCQkJRFNTX0NMS185Nk0pOworCWVsc2UKKwkJZHNzX2Nsa19kaXNhYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0sxIHwgRFNTX0NMS181NE0gfAorCQkJCURTU19DTEtfOTZNKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2ZW5jX2NvbmZpZyAqdmVuY190aW1pbmdzX3RvX2NvbmZpZygKKwkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKK3sKKwlpZiAobWVtY21wKCZvbWFwX2Rzc19wYWxfdGltaW5ncywgdGltaW5ncywgc2l6ZW9mKCp0aW1pbmdzKSkgPT0gMCkKKwkJcmV0dXJuICZ2ZW5jX2NvbmZpZ19wYWxfdHJtOworCisJaWYgKG1lbWNtcCgmb21hcF9kc3NfbnRzY190aW1pbmdzLCB0aW1pbmdzLCBzaXplb2YoKnRpbWluZ3MpKSA9PSAwKQorCQlyZXR1cm4gJnZlbmNfY29uZmlnX250c2NfdHJtOworCisJQlVHKCk7Cit9CisKKworCisKKworLyogZHJpdmVyICovCitzdGF0aWMgaW50IHZlbmNfcGFuZWxfcHJvYmUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWRzc2Rldi0+cGFuZWwudGltaW5ncyA9IG9tYXBfZHNzX3BhbF90aW1pbmdzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZlbmNfcGFuZWxfcmVtb3ZlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKK30KKworc3RhdGljIGludCB2ZW5jX3BhbmVsX2VuYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJaW50IHIgPSAwOworCisJLyogd2FpdCBjb3VwbGUgb2YgdnN5bmNzIHVudGlsIGVuYWJsaW5nIHRoZSBMQ0QgKi8KKwltc2xlZXAoNTApOworCisJaWYgKGRzc2Rldi0+cGxhdGZvcm1fZW5hYmxlKQorCQlyID0gZHNzZGV2LT5wbGF0Zm9ybV9lbmFibGUoZHNzZGV2KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCB2ZW5jX3BhbmVsX2Rpc2FibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWlmIChkc3NkZXYtPnBsYXRmb3JtX2Rpc2FibGUpCisJCWRzc2Rldi0+cGxhdGZvcm1fZGlzYWJsZShkc3NkZXYpOworCisJLyogd2FpdCBhdCBsZWFzdCA1IHZzeW5jcyBhZnRlciBkaXNhYmxpbmcgdGhlIExDRCAqLworCisJbXNsZWVwKDEwMCk7Cit9CisKK3N0YXRpYyBpbnQgdmVuY19wYW5lbF9zdXNwZW5kKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwl2ZW5jX3BhbmVsX2Rpc2FibGUoZHNzZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZW5jX3BhbmVsX3Jlc3VtZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJcmV0dXJuIHZlbmNfcGFuZWxfZW5hYmxlKGRzc2Rldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZHJpdmVyIHZlbmNfZHJpdmVyID0geworCS5wcm9iZQkJPSB2ZW5jX3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gdmVuY19wYW5lbF9yZW1vdmUsCisKKwkuZW5hYmxlCQk9IHZlbmNfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gdmVuY19wYW5lbF9kaXNhYmxlLAorCS5zdXNwZW5kCT0gdmVuY19wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gdmVuY19wYW5lbF9yZXN1bWUsCisKKwkuZHJpdmVyICAgICAgICAgPSB7CisJCS5uYW1lICAgPSAidmVuYyIsCisJCS5vd25lciAgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKy8qIGRyaXZlciBlbmQgKi8KKworCisKK2ludCB2ZW5jX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwl1OCByZXZfaWQ7CisKKwltdXRleF9pbml0KCZ2ZW5jLnZlbmNfbG9jayk7CisKKwl2ZW5jLndzc19kYXRhID0gMDsKKworCXZlbmMuYmFzZSA9IGlvcmVtYXAoVkVOQ19CQVNFLCBTWl8xSyk7CisJaWYgKCF2ZW5jLmJhc2UpIHsKKwkJRFNTRVJSKCJjYW4ndCBpb3JlbWFwIFZFTkNcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl2ZW5jLnZkZGFfZGFjX3JlZyA9IHJlZ3VsYXRvcl9nZXQoJnBkZXYtPmRldiwgInZkZGFfZGFjIik7CisJaWYgKElTX0VSUih2ZW5jLnZkZGFfZGFjX3JlZykpIHsKKwkJaW91bm1hcCh2ZW5jLmJhc2UpOworCQlEU1NFUlIoImNhbid0IGdldCBWRERBX0RBQyByZWd1bGF0b3JcbiIpOworCQlyZXR1cm4gUFRSX0VSUih2ZW5jLnZkZGFfZGFjX3JlZyk7CisJfQorCisJdmVuY19lbmFibGVfY2xvY2tzKDEpOworCisJcmV2X2lkID0gKHU4KSh2ZW5jX3JlYWRfcmVnKFZFTkNfUkVWX0lEKSAmIDB4ZmYpOworCXByaW50ayhLRVJOX0lORk8gIk9NQVAgVkVOQyByZXYgJWRcbiIsIHJldl9pZCk7CisKKwl2ZW5jX2VuYWJsZV9jbG9ja3MoMCk7CisKKwlyZXR1cm4gb21hcF9kc3NfcmVnaXN0ZXJfZHJpdmVyKCZ2ZW5jX2RyaXZlcik7Cit9CisKK3ZvaWQgdmVuY19leGl0KHZvaWQpCit7CisJb21hcF9kc3NfdW5yZWdpc3Rlcl9kcml2ZXIoJnZlbmNfZHJpdmVyKTsKKworCXJlZ3VsYXRvcl9wdXQodmVuYy52ZGRhX2RhY19yZWcpOworCisJaW91bm1hcCh2ZW5jLmJhc2UpOworfQorCitzdGF0aWMgdm9pZCB2ZW5jX3Bvd2VyX29uKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwl1MzIgbDsKKworCXZlbmNfZW5hYmxlX2Nsb2NrcygxKTsKKworCXZlbmNfcmVzZXQoKTsKKwl2ZW5jX3dyaXRlX2NvbmZpZyh2ZW5jX3RpbWluZ3NfdG9fY29uZmlnKCZkc3NkZXYtPnBhbmVsLnRpbWluZ3MpKTsKKworCWRzc19zZXRfdmVuY19vdXRwdXQoZHNzZGV2LT5waHkudmVuYy50eXBlKTsKKwlkc3Nfc2V0X2RhY19wd3Jkbl9iZ3ooMSk7CisKKwlsID0gMDsKKworCWlmIChkc3NkZXYtPnBoeS52ZW5jLnR5cGUgPT0gT01BUF9EU1NfVkVOQ19UWVBFX0NPTVBPU0lURSkKKwkJbCB8PSAxIDw8IDE7CisJZWxzZSAvKiBTLVZpZGVvICovCisJCWwgfD0gKDEgPDwgMCkgfCAoMSA8PCAyKTsKKworCWlmIChkc3NkZXYtPnBoeS52ZW5jLmludmVydF9wb2xhcml0eSA9PSBmYWxzZSkKKwkJbCB8PSAxIDw8IDM7CisKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX09VVFBVVF9DT05UUk9MLCBsKTsKKworCWRpc3BjX3NldF9kaWdpdF9zaXplKGRzc2Rldi0+cGFuZWwudGltaW5ncy54X3JlcywKKwkJCWRzc2Rldi0+cGFuZWwudGltaW5ncy55X3Jlcy8yKTsKKworCXJlZ3VsYXRvcl9lbmFibGUodmVuYy52ZGRhX2RhY19yZWcpOworCisJaWYgKGRzc2Rldi0+cGxhdGZvcm1fZW5hYmxlKQorCQlkc3NkZXYtPnBsYXRmb3JtX2VuYWJsZShkc3NkZXYpOworCisJZGlzcGNfZW5hYmxlX2RpZ2l0X291dCgxKTsKK30KKworc3RhdGljIHZvaWQgdmVuY19wb3dlcl9vZmYoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXZlbmNfd3JpdGVfcmVnKFZFTkNfT1VUUFVUX0NPTlRST0wsIDApOworCWRzc19zZXRfZGFjX3B3cmRuX2JneigwKTsKKworCWRpc3BjX2VuYWJsZV9kaWdpdF9vdXQoMCk7CisKKwlpZiAoZHNzZGV2LT5wbGF0Zm9ybV9kaXNhYmxlKQorCQlkc3NkZXYtPnBsYXRmb3JtX2Rpc2FibGUoZHNzZGV2KTsKKworCXJlZ3VsYXRvcl9kaXNhYmxlKHZlbmMudmRkYV9kYWNfcmVnKTsKKworCXZlbmNfZW5hYmxlX2Nsb2NrcygwKTsKK30KKworc3RhdGljIGludCB2ZW5jX2VuYWJsZV9kaXNwbGF5KHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlpbnQgciA9IDA7CisKKwlEU1NEQkcoInZlbmNfZW5hYmxlX2Rpc3BsYXlcbiIpOworCisJbXV0ZXhfbG9jaygmdmVuYy52ZW5jX2xvY2spOworCisJaWYgKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9ESVNBQkxFRCkgeworCQlyID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJdmVuY19wb3dlcl9vbihkc3NkZXYpOworCisJdmVuYy53c3NfZGF0YSA9IDA7CisKKwlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkU7CitlcnI6CisJbXV0ZXhfdW5sb2NrKCZ2ZW5jLnZlbmNfbG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgdmVuY19kaXNhYmxlX2Rpc3BsYXkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCURTU0RCRygidmVuY19kaXNhYmxlX2Rpc3BsYXlcbiIpOworCisJbXV0ZXhfbG9jaygmdmVuYy52ZW5jX2xvY2spOworCisJaWYgKGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9ESVNBQkxFRCkKKwkJZ290byBlbmQ7CisKKwlpZiAoZHNzZGV2LT5zdGF0ZSA9PSBPTUFQX0RTU19ESVNQTEFZX1NVU1BFTkRFRCkgeworCQkvKiBzdXNwZW5kZWQgaXMgdGhlIHNhbWUgYXMgZGlzYWJsZWQgd2l0aCB2ZW5jICovCisJCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEOworCQlnb3RvIGVuZDsKKwl9CisKKwl2ZW5jX3Bvd2VyX29mZihkc3NkZXYpOworCisJZHNzZGV2LT5zdGF0ZSA9IE9NQVBfRFNTX0RJU1BMQVlfRElTQUJMRUQ7CitlbmQ6CisJbXV0ZXhfdW5sb2NrKCZ2ZW5jLnZlbmNfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgdmVuY19kaXNwbGF5X3N1c3BlbmQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWludCByID0gMDsKKworCURTU0RCRygidmVuY19kaXNwbGF5X3N1c3BlbmRcbiIpOworCisJbXV0ZXhfbG9jaygmdmVuYy52ZW5jX2xvY2spOworCisJaWYgKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpIHsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCXZlbmNfcG93ZXJfb2ZmKGRzc2Rldik7CisKKwlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9TVVNQRU5ERUQ7CitlcnI6CisJbXV0ZXhfdW5sb2NrKCZ2ZW5jLnZlbmNfbG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCB2ZW5jX2Rpc3BsYXlfcmVzdW1lKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlpbnQgciA9IDA7CisKKwlEU1NEQkcoInZlbmNfZGlzcGxheV9yZXN1bWVcbiIpOworCisJbXV0ZXhfbG9jaygmdmVuYy52ZW5jX2xvY2spOworCisJaWYgKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9TVVNQRU5ERUQpIHsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCXZlbmNfcG93ZXJfb24oZHNzZGV2KTsKKworCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRTsKK2VycjoKKwltdXRleF91bmxvY2soJnZlbmMudmVuY19sb2NrKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCB2ZW5jX2dldF90aW1pbmdzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpCit7CisJKnRpbWluZ3MgPSBkc3NkZXYtPnBhbmVsLnRpbWluZ3M7Cit9CisKK3N0YXRpYyB2b2lkIHZlbmNfc2V0X3RpbWluZ3Moc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKK3sKKwlEU1NEQkcoInZlbmNfc2V0X3RpbWluZ3NcbiIpOworCisJLyogUmVzZXQgV1NTIGRhdGEgd2hlbiB0aGUgVFYgc3RhbmRhcmQgY2hhbmdlcy4gKi8KKwlpZiAobWVtY21wKCZkc3NkZXYtPnBhbmVsLnRpbWluZ3MsIHRpbWluZ3MsIHNpemVvZigqdGltaW5ncykpKQorCQl2ZW5jLndzc19kYXRhID0gMDsKKworCWRzc2Rldi0+cGFuZWwudGltaW5ncyA9ICp0aW1pbmdzOworCWlmIChkc3NkZXYtPnN0YXRlID09IE9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFKSB7CisJCS8qIHR1cm4gdGhlIHZlbmMgb2ZmIGFuZCBvbiB0byBnZXQgbmV3IHRpbWluZ3MgdG8gdXNlICovCisJCXZlbmNfZGlzYWJsZV9kaXNwbGF5KGRzc2Rldik7CisJCXZlbmNfZW5hYmxlX2Rpc3BsYXkoZHNzZGV2KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdmVuY19jaGVja190aW1pbmdzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpCit7CisJRFNTREJHKCJ2ZW5jX2NoZWNrX3RpbWluZ3NcbiIpOworCisJaWYgKG1lbWNtcCgmb21hcF9kc3NfcGFsX3RpbWluZ3MsIHRpbWluZ3MsIHNpemVvZigqdGltaW5ncykpID09IDApCisJCXJldHVybiAwOworCisJaWYgKG1lbWNtcCgmb21hcF9kc3NfbnRzY190aW1pbmdzLCB0aW1pbmdzLCBzaXplb2YoKnRpbWluZ3MpKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdTMyIHZlbmNfZ2V0X3dzcyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJLyogSW52ZXJ0IGR1ZSB0byBWRU5DX0wyMV9XQ19DVEw6SU5WPTEgKi8KKwlyZXR1cm4gKHZlbmMud3NzX2RhdGEgPj4gOCkgXiAweGZmZmZmOworfQorCitzdGF0aWMgaW50IHZlbmNfc2V0X3dzcyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCXUzMiB3c3MpCit7CisJY29uc3Qgc3RydWN0IHZlbmNfY29uZmlnICpjb25maWc7CisKKwlEU1NEQkcoInZlbmNfc2V0X3dzc1xuIik7CisKKwltdXRleF9sb2NrKCZ2ZW5jLnZlbmNfbG9jayk7CisKKwljb25maWcgPSB2ZW5jX3RpbWluZ3NfdG9fY29uZmlnKCZkc3NkZXYtPnBhbmVsLnRpbWluZ3MpOworCisJLyogSW52ZXJ0IGR1ZSB0byBWRU5DX0wyMV9XQ19DVEw6SU5WPTEgKi8KKwl2ZW5jLndzc19kYXRhID0gKHdzcyBeIDB4ZmZmZmYpIDw8IDg7CisKKwl2ZW5jX2VuYWJsZV9jbG9ja3MoMSk7CisKKwl2ZW5jX3dyaXRlX3JlZyhWRU5DX0JTVEFNUF9XU1NfREFUQSwgY29uZmlnLT5ic3RhbXBfd3NzX2RhdGEgfAorCQkJdmVuYy53c3NfZGF0YSk7CisKKwl2ZW5jX2VuYWJsZV9jbG9ja3MoMCk7CisKKwltdXRleF91bmxvY2soJnZlbmMudmVuY19sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBvbWFwX2Rzc191cGRhdGVfbW9kZSB2ZW5jX2Rpc3BsYXlfZ2V0X3VwZGF0ZV9tb2RlKAorCQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJaWYgKGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpCisJCXJldHVybiBPTUFQX0RTU19VUERBVEVfQVVUTzsKKwllbHNlCisJCXJldHVybiBPTUFQX0RTU19VUERBVEVfRElTQUJMRUQ7Cit9CisKK2ludCB2ZW5jX2luaXRfZGlzcGxheShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJRFNTREJHKCJpbml0X2Rpc3BsYXlcbiIpOworCisJZHNzZGV2LT5lbmFibGUgPSB2ZW5jX2VuYWJsZV9kaXNwbGF5OworCWRzc2Rldi0+ZGlzYWJsZSA9IHZlbmNfZGlzYWJsZV9kaXNwbGF5OworCWRzc2Rldi0+c3VzcGVuZCA9IHZlbmNfZGlzcGxheV9zdXNwZW5kOworCWRzc2Rldi0+cmVzdW1lID0gdmVuY19kaXNwbGF5X3Jlc3VtZTsKKwlkc3NkZXYtPmdldF90aW1pbmdzID0gdmVuY19nZXRfdGltaW5nczsKKwlkc3NkZXYtPnNldF90aW1pbmdzID0gdmVuY19zZXRfdGltaW5nczsKKwlkc3NkZXYtPmNoZWNrX3RpbWluZ3MgPSB2ZW5jX2NoZWNrX3RpbWluZ3M7CisJZHNzZGV2LT5nZXRfd3NzID0gdmVuY19nZXRfd3NzOworCWRzc2Rldi0+c2V0X3dzcyA9IHZlbmNfc2V0X3dzczsKKwlkc3NkZXYtPmdldF91cGRhdGVfbW9kZSA9IHZlbmNfZGlzcGxheV9nZXRfdXBkYXRlX21vZGU7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCB2ZW5jX2R1bXBfcmVncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCit7CisjZGVmaW5lIERVTVBSRUcocikgc2VxX3ByaW50ZihzLCAiJS0zNXMgJTA4eFxuIiwgI3IsIHZlbmNfcmVhZF9yZWcocikpCisKKwl2ZW5jX2VuYWJsZV9jbG9ja3MoMSk7CisKKwlEVU1QUkVHKFZFTkNfRl9DT05UUk9MKTsKKwlEVU1QUkVHKFZFTkNfVklET1VUX0NUUkwpOworCURVTVBSRUcoVkVOQ19TWU5DX0NUUkwpOworCURVTVBSRUcoVkVOQ19MTEVOKTsKKwlEVU1QUkVHKFZFTkNfRkxFTlMpOworCURVTVBSRUcoVkVOQ19IRkxUUl9DVFJMKTsKKwlEVU1QUkVHKFZFTkNfQ0NfQ0FSUl9XU1NfQ0FSUik7CisJRFVNUFJFRyhWRU5DX0NfUEhBU0UpOworCURVTVBSRUcoVkVOQ19HQUlOX1UpOworCURVTVBSRUcoVkVOQ19HQUlOX1YpOworCURVTVBSRUcoVkVOQ19HQUlOX1kpOworCURVTVBSRUcoVkVOQ19CTEFDS19MRVZFTCk7CisJRFVNUFJFRyhWRU5DX0JMQU5LX0xFVkVMKTsKKwlEVU1QUkVHKFZFTkNfWF9DT0xPUik7CisJRFVNUFJFRyhWRU5DX01fQ09OVFJPTCk7CisJRFVNUFJFRyhWRU5DX0JTVEFNUF9XU1NfREFUQSk7CisJRFVNUFJFRyhWRU5DX1NfQ0FSUik7CisJRFVNUFJFRyhWRU5DX0xJTkUyMSk7CisJRFVNUFJFRyhWRU5DX0xOX1NFTCk7CisJRFVNUFJFRyhWRU5DX0wyMV9fV0NfQ1RMKTsKKwlEVU1QUkVHKFZFTkNfSFRSSUdHRVJfVlRSSUdHRVIpOworCURVTVBSRUcoVkVOQ19TQVZJRF9fRUFWSUQpOworCURVTVBSRUcoVkVOQ19GTEVOX19GQUwpOworCURVTVBSRUcoVkVOQ19MQUxfX1BIQVNFX1JFU0VUKTsKKwlEVU1QUkVHKFZFTkNfSFNfSU5UX1NUQVJUX1NUT1BfWCk7CisJRFVNUFJFRyhWRU5DX0hTX0VYVF9TVEFSVF9TVE9QX1gpOworCURVTVBSRUcoVkVOQ19WU19JTlRfU1RBUlRfWCk7CisJRFVNUFJFRyhWRU5DX1ZTX0lOVF9TVE9QX1hfX1ZTX0lOVF9TVEFSVF9ZKTsKKwlEVU1QUkVHKFZFTkNfVlNfSU5UX1NUT1BfWV9fVlNfRVhUX1NUQVJUX1gpOworCURVTVBSRUcoVkVOQ19WU19FWFRfU1RPUF9YX19WU19FWFRfU1RBUlRfWSk7CisJRFVNUFJFRyhWRU5DX1ZTX0VYVF9TVE9QX1kpOworCURVTVBSRUcoVkVOQ19BVklEX1NUQVJUX1NUT1BfWCk7CisJRFVNUFJFRyhWRU5DX0FWSURfU1RBUlRfU1RPUF9ZKTsKKwlEVU1QUkVHKFZFTkNfRklEX0lOVF9TVEFSVF9YX19GSURfSU5UX1NUQVJUX1kpOworCURVTVBSRUcoVkVOQ19GSURfSU5UX09GRlNFVF9ZX19GSURfRVhUX1NUQVJUX1gpOworCURVTVBSRUcoVkVOQ19GSURfRVhUX1NUQVJUX1lfX0ZJRF9FWFRfT0ZGU0VUX1kpOworCURVTVBSRUcoVkVOQ19UVkRFVEdQX0lOVF9TVEFSVF9TVE9QX1gpOworCURVTVBSRUcoVkVOQ19UVkRFVEdQX0lOVF9TVEFSVF9TVE9QX1kpOworCURVTVBSRUcoVkVOQ19HRU5fQ1RSTCk7CisJRFVNUFJFRyhWRU5DX09VVFBVVF9DT05UUk9MKTsKKwlEVU1QUkVHKFZFTkNfT1VUUFVUX1RFU1QpOworCisJdmVuY19lbmFibGVfY2xvY2tzKDApOworCisjdW5kZWYgRFVNUFJFRworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2OTRjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL0tjb25maWcKQEAgLTAsMCArMSwzNyBAQAorbWVudWNvbmZpZyBGQl9PTUFQMgorICAgICAgICB0cmlzdGF0ZSAiT01BUDIvMyBmcmFtZSBidWZmZXIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKyAgICAgICAgZGVwZW5kcyBvbiBGQiAmJiBPTUFQMl9EU1MKKworCXNlbGVjdCBPTUFQMl9WUkFNCisJc2VsZWN0IE9NQVAyX1ZSRkIKKyAgICAgICAgc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAorICAgICAgICBzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCisgICAgICAgIHNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCisgICAgICAgIGhlbHAKKyAgICAgICAgICBGcmFtZSBidWZmZXIgZHJpdmVyIGZvciBPTUFQMi8zIGJhc2VkIGJvYXJkcy4KKworY29uZmlnIEZCX09NQVAyX0RFQlVHX1NVUFBPUlQKKwlib29sICJEZWJ1ZyBzdXBwb3J0IGZvciBPTUFQMi8zIEZCIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkJfT01BUDIKKwloZWxwCisJICBTdXBwb3J0IGZvciBkZWJ1ZyBvdXRwdXQuIFlvdSBoYXZlIHRvIGVuYWJsZSB0aGUgYWN0dWFsIHByaW50aW5nCisJICB3aXRoIGRlYnVnIG1vZHVsZSBwYXJhbWV0ZXIuCisKK2NvbmZpZyBGQl9PTUFQMl9GT1JDRV9BVVRPX1VQREFURQorCWJvb2wgIkZvcmNlIG1haW4gZGlzcGxheSB0byBhdXRvbWF0aWMgdXBkYXRlIG1vZGUiCisJZGVwZW5kcyBvbiBGQl9PTUFQMgorCWhlbHAKKwkgIEZvcmNlcyBtYWluIGRpc3BsYXkgdG8gYXV0b21hdGljIHVwZGF0ZSBtb2RlIChpZiBwb3NzaWJsZSksCisJICBhbmQgYWxzbyBlbmFibGVzIHRlYXJzeW5jIChpZiBwb3NzaWJsZSkuIEJ5IGRlZmF1bHQKKwkgIGRpc3BsYXlzIHRoYXQgc3VwcG9ydCBtYW51YWwgdXBkYXRlIGFyZSBzdGFydGVkIGluIG1hbnVhbAorCSAgdXBkYXRlIG1vZGUuCisKK2NvbmZpZyBGQl9PTUFQMl9OVU1fRkJTCisJaW50ICJOdW1iZXIgb2YgZnJhbWVidWZmZXJzIgorCXJhbmdlIDEgMTAKKwlkZWZhdWx0IDMKKwlkZXBlbmRzIG9uIEZCX09NQVAyCisJaGVscAorCSAgU2VsZWN0IHRoZSBudW1iZXIgb2YgZnJhbWVidWZmZXJzIGNyZWF0ZWQuIE9NQVAyLzMgaGFzIDMgb3ZlcmxheXMKKwkgIHNvIG5vcm1hbGx5IHRoaXMgd291bGQgYmUgMy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjMmUwMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLSQoQ09ORklHX0ZCX09NQVAyKSArPSBvbWFwZmIubworb21hcGZiLXkgOj0gb21hcGZiLW1haW4ubyBvbWFwZmItc3lzZnMubyBvbWFwZmItaW9jdGwubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLWlvY3RsLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzRiYWZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLWlvY3RsLmMKQEAgLTAsMCArMSw3NTUgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi1pb2N0bC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IFRvbWkgVmFsa2VpbmVuIDx0b21pLnZhbGtlaW5lbkBub2tpYS5jb20+CisgKgorICogU29tZSBjb2RlIGFuZCBpZGVhcyB0YWtlbiBmcm9tIGRyaXZlcnMvdmlkZW8vb21hcC8gZHJpdmVyCisgKiBieSBJbXJlIERlYWsuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9vbWFwZmIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpbmNsdWRlIDxwbGF0L2Rpc3BsYXkuaD4KKyNpbmNsdWRlIDxwbGF0L3ZyZmIuaD4KKyNpbmNsdWRlIDxwbGF0L3ZyYW0uaD4KKworI2luY2x1ZGUgIm9tYXBmYi5oIgorCitzdGF0aWMgaW50IG9tYXBmYl9zZXR1cF9wbGFuZShzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBzdHJ1Y3Qgb21hcGZiX3BsYW5lX2luZm8gKnBpKQoreworCXN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSA9IEZCMk9GQihmYmkpOworCXN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYgPSBvZmJpLT5mYmRldjsKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7CisJc3RydWN0IG9tYXBfb3ZlcmxheV9pbmZvIGluZm87CisJaW50IHIgPSAwOworCisJREJHKCJvbWFwZmJfc2V0dXBfcGxhbmVcbiIpOworCisJaWYgKG9mYmktPm51bV9vdmVybGF5cyAhPSAxKSB7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBYWFggdXNlcyBvbmx5IHRoZSBmaXJzdCBvdmVybGF5ICovCisJb3ZsID0gb2ZiaS0+b3ZlcmxheXNbMF07CisKKwlpZiAocGktPmVuYWJsZWQgJiYgIW9mYmktPnJlZ2lvbi5zaXplKSB7CisJCS8qCisJCSAqIFRoaXMgcGxhbmUncyBtZW1vcnkgd2FzIGZyZWVkLCBjYW4ndCBlbmFibGUgaXQKKwkJICogdW50aWwgaXQncyByZWFsbG9jYXRlZC4KKwkJICovCisJCXIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlvdmwtPmdldF9vdmVybGF5X2luZm8ob3ZsLCAmaW5mbyk7CisKKwlpbmZvLnBvc194ID0gcGktPnBvc194OworCWluZm8ucG9zX3kgPSBwaS0+cG9zX3k7CisJaW5mby5vdXRfd2lkdGggPSBwaS0+b3V0X3dpZHRoOworCWluZm8ub3V0X2hlaWdodCA9IHBpLT5vdXRfaGVpZ2h0OworCWluZm8uZW5hYmxlZCA9IHBpLT5lbmFibGVkOworCisJciA9IG92bC0+c2V0X292ZXJsYXlfaW5mbyhvdmwsICZpbmZvKTsKKwlpZiAocikKKwkJZ290byBvdXQ7CisKKwlpZiAob3ZsLT5tYW5hZ2VyKSB7CisJCXIgPSBvdmwtPm1hbmFnZXItPmFwcGx5KG92bC0+bWFuYWdlcik7CisJCWlmIChyKQorCQkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJaWYgKHIpCisJCWRldl9lcnIoZmJkZXYtPmRldiwgInNldHVwX3BsYW5lIGZhaWxlZFxuIik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3F1ZXJ5X3BsYW5lKHN0cnVjdCBmYl9pbmZvICpmYmksIHN0cnVjdCBvbWFwZmJfcGxhbmVfaW5mbyAqcGkpCit7CisJc3RydWN0IG9tYXBmYl9pbmZvICpvZmJpID0gRkIyT0ZCKGZiaSk7CisKKwlpZiAob2ZiaS0+bnVtX292ZXJsYXlzICE9IDEpIHsKKwkJbWVtc2V0KHBpLCAwLCBzaXplb2YoKnBpKSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IG9tYXBfb3ZlcmxheV9pbmZvICpvdmxpOworCQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7CisKKwkJb3ZsID0gb2ZiaS0+b3ZlcmxheXNbMF07CisJCW92bGkgPSAmb3ZsLT5pbmZvOworCisJCXBpLT5wb3NfeCA9IG92bGktPnBvc194OworCQlwaS0+cG9zX3kgPSBvdmxpLT5wb3NfeTsKKwkJcGktPmVuYWJsZWQgPSBvdmxpLT5lbmFibGVkOworCQlwaS0+Y2hhbm5lbF9vdXQgPSAwOyAvKiB4eHggKi8KKwkJcGktPm1pcnJvciA9IDA7CisJCXBpLT5vdXRfd2lkdGggPSBvdmxpLT5vdXRfd2lkdGg7CisJCXBpLT5vdXRfaGVpZ2h0ID0gb3ZsaS0+b3V0X2hlaWdodDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwZmJfc2V0dXBfbWVtKHN0cnVjdCBmYl9pbmZvICpmYmksIHN0cnVjdCBvbWFwZmJfbWVtX2luZm8gKm1pKQoreworCXN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSA9IEZCMk9GQihmYmkpOworCXN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYgPSBvZmJpLT5mYmRldjsKKwlzdHJ1Y3Qgb21hcGZiMl9tZW1fcmVnaW9uICpyZzsKKwlpbnQgciwgaTsKKwlzaXplX3Qgc2l6ZTsKKworCWlmIChtaS0+dHlwZSA+IE9NQVBGQl9NRU1UWVBFX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzaXplID0gUEFHRV9BTElHTihtaS0+c2l6ZSk7CisKKwlyZyA9ICZvZmJpLT5yZWdpb247CisKKwlmb3IgKGkgPSAwOyBpIDwgb2ZiaS0+bnVtX292ZXJsYXlzOyBpKyspIHsKKwkJaWYgKG9mYmktPm92ZXJsYXlzW2ldLT5pbmZvLmVuYWJsZWQpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChyZy0+c2l6ZSAhPSBzaXplIHx8IHJnLT50eXBlICE9IG1pLT50eXBlKSB7CisJCXIgPSBvbWFwZmJfcmVhbGxvY19mYm1lbShmYmksIHNpemUsIG1pLT50eXBlKTsKKwkJaWYgKHIpIHsKKwkJCWRldl9lcnIoZmJkZXYtPmRldiwgInJlYWxsb2MgZmJtZW0gZmFpbGVkXG4iKTsKKwkJCXJldHVybiByOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3F1ZXJ5X21lbShzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBzdHJ1Y3Qgb21hcGZiX21lbV9pbmZvICptaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmkgPSBGQjJPRkIoZmJpKTsKKwlzdHJ1Y3Qgb21hcGZiMl9tZW1fcmVnaW9uICpyZzsKKworCXJnID0gJm9mYmktPnJlZ2lvbjsKKwltZW1zZXQobWksIDAsIHNpemVvZigqbWkpKTsKKworCW1pLT5zaXplID0gcmctPnNpemU7CisJbWktPnR5cGUgPSByZy0+dHlwZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBmYl91cGRhdGVfd2luZG93X25vbG9jayhzdHJ1Y3QgZmJfaW5mbyAqZmJpLAorCQl1MzIgeCwgdTMyIHksIHUzMiB3LCB1MzIgaCkKK3sKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5ID0gZmIyZGlzcGxheShmYmkpOworCXUxNiBkdywgZGg7CisKKwlpZiAoIWRpc3BsYXkpCisJCXJldHVybiAwOworCisJaWYgKHcgPT0gMCB8fCBoID09IDApCisJCXJldHVybiAwOworCisJZGlzcGxheS0+Z2V0X3Jlc29sdXRpb24oZGlzcGxheSwgJmR3LCAmZGgpOworCisJaWYgKHggKyB3ID4gZHcgfHwgeSArIGggPiBkaCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gZGlzcGxheS0+dXBkYXRlKGRpc3BsYXksIHgsIHksIHcsIGgpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGV4cG9ydGVkIGZvciBTR1ggZHJpdmVyIHVzZSAqLworaW50IG9tYXBmYl91cGRhdGVfd2luZG93KHN0cnVjdCBmYl9pbmZvICpmYmksCisJCXUzMiB4LCB1MzIgeSwgdTMyIHcsIHUzMiBoKQoreworCXN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSA9IEZCMk9GQihmYmkpOworCXN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYgPSBvZmJpLT5mYmRldjsKKwlpbnQgcjsKKworCW9tYXBmYl9sb2NrKGZiZGV2KTsKKwlsb2NrX2ZiX2luZm8oZmJpKTsKKworCXIgPSBvbWFwZmJfdXBkYXRlX3dpbmRvd19ub2xvY2soZmJpLCB4LCB5LCB3LCBoKTsKKworCXVubG9ja19mYl9pbmZvKGZiaSk7CisJb21hcGZiX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KK0VYUE9SVF9TWU1CT0wob21hcGZiX3VwZGF0ZV93aW5kb3cpOworCitzdGF0aWMgaW50IG9tYXBmYl9zZXRfdXBkYXRlX21vZGUoc3RydWN0IGZiX2luZm8gKmZiaSwKKwkJCQkgICBlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBtb2RlKQoreworCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRpc3BsYXkgPSBmYjJkaXNwbGF5KGZiaSk7CisJZW51bSBvbWFwX2Rzc191cGRhdGVfbW9kZSB1bTsKKwlpbnQgcjsKKworCWlmICghZGlzcGxheSB8fCAhZGlzcGxheS0+c2V0X3VwZGF0ZV9tb2RlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgT01BUEZCX1VQREFURV9ESVNBQkxFRDoKKwkJdW0gPSBPTUFQX0RTU19VUERBVEVfRElTQUJMRUQ7CisJCWJyZWFrOworCisJY2FzZSBPTUFQRkJfQVVUT19VUERBVEU6CisJCXVtID0gT01BUF9EU1NfVVBEQVRFX0FVVE87CisJCWJyZWFrOworCisJY2FzZSBPTUFQRkJfTUFOVUFMX1VQREFURToKKwkJdW0gPSBPTUFQX0RTU19VUERBVEVfTUFOVUFMOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXIgPSBkaXNwbGF5LT5zZXRfdXBkYXRlX21vZGUoZGlzcGxheSwgdW0pOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX2dldF91cGRhdGVfbW9kZShzdHJ1Y3QgZmJfaW5mbyAqZmJpLAorCQllbnVtIG9tYXBmYl91cGRhdGVfbW9kZSAqbW9kZSkKK3sKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5ID0gZmIyZGlzcGxheShmYmkpOworCWVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUgbTsKKworCWlmICghZGlzcGxheSB8fCAhZGlzcGxheS0+Z2V0X3VwZGF0ZV9tb2RlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW0gPSBkaXNwbGF5LT5nZXRfdXBkYXRlX21vZGUoZGlzcGxheSk7CisKKwlzd2l0Y2ggKG0pIHsKKwljYXNlIE9NQVBfRFNTX1VQREFURV9ESVNBQkxFRDoKKwkJKm1vZGUgPSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEOworCQlicmVhazsKKwljYXNlIE9NQVBfRFNTX1VQREFURV9BVVRPOgorCQkqbW9kZSA9IE9NQVBGQl9BVVRPX1VQREFURTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQX0RTU19VUERBVEVfTUFOVUFMOgorCQkqbW9kZSA9IE9NQVBGQl9NQU5VQUxfVVBEQVRFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogWFhYIHRoaXMgY29sb3Iga2V5IGhhbmRsaW5nIGlzIGEgaGFjay4uLiAqLworc3RhdGljIHN0cnVjdCBvbWFwZmJfY29sb3Jfa2V5IG9tYXBmYl9jb2xvcl9rZXlzWzJdOworCitzdGF0aWMgaW50IF9vbWFwZmJfc2V0X2NvbG9yX2tleShzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1nciwKKwkJc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkgKmNrKQoreworCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlcl9pbmZvIGluZm87CisJZW51bSBvbWFwX2Rzc190cmFuc19rZXlfdHlwZSBrdDsKKwlpbnQgcjsKKworCW1nci0+Z2V0X21hbmFnZXJfaW5mbyhtZ3IsICZpbmZvKTsKKworCWlmIChjay0+a2V5X3R5cGUgPT0gT01BUEZCX0NPTE9SX0tFWV9ESVNBQkxFRCkgeworCQlpbmZvLnRyYW5zX2VuYWJsZWQgPSBmYWxzZTsKKwkJb21hcGZiX2NvbG9yX2tleXNbbWdyLT5pZF0gPSAqY2s7CisKKwkJciA9IG1nci0+c2V0X21hbmFnZXJfaW5mbyhtZ3IsICZpbmZvKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKworCQlyID0gbWdyLT5hcHBseShtZ3IpOworCisJCXJldHVybiByOworCX0KKworCXN3aXRjaCAoY2stPmtleV90eXBlKSB7CisJY2FzZSBPTUFQRkJfQ09MT1JfS0VZX0dGWF9EU1Q6CisJCWt0ID0gT01BUF9EU1NfQ09MT1JfS0VZX0dGWF9EU1Q7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX0tFWV9WSURfU1JDOgorCQlrdCA9IE9NQVBfRFNTX0NPTE9SX0tFWV9WSURfU1JDOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpbmZvLmRlZmF1bHRfY29sb3IgPSBjay0+YmFja2dyb3VuZDsKKwlpbmZvLnRyYW5zX2tleSA9IGNrLT50cmFuc19rZXk7CisJaW5mby50cmFuc19rZXlfdHlwZSA9IGt0OworCWluZm8udHJhbnNfZW5hYmxlZCA9IHRydWU7CisKKwlvbWFwZmJfY29sb3Jfa2V5c1ttZ3ItPmlkXSA9ICpjazsKKworCXIgPSBtZ3ItPnNldF9tYW5hZ2VyX2luZm8obWdyLCAmaW5mbyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IG1nci0+YXBwbHkobWdyKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9zZXRfY29sb3Jfa2V5KHN0cnVjdCBmYl9pbmZvICpmYmksCisJCXN0cnVjdCBvbWFwZmJfY29sb3Jfa2V5ICpjaykKK3sKKwlzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmkgPSBGQjJPRkIoZmJpKTsKKwlzdHJ1Y3Qgb21hcGZiMl9kZXZpY2UgKmZiZGV2ID0gb2ZiaS0+ZmJkZXY7CisJaW50IHI7CisJaW50IGk7CisJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IgPSBOVUxMOworCisJb21hcGZiX2xvY2soZmJkZXYpOworCisJZm9yIChpID0gMDsgaSA8IG9mYmktPm51bV9vdmVybGF5czsgaSsrKSB7CisJCWlmIChvZmJpLT5vdmVybGF5c1tpXS0+bWFuYWdlcikgeworCQkJbWdyID0gb2ZiaS0+b3ZlcmxheXNbaV0tPm1hbmFnZXI7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghbWdyKSB7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwlyID0gX29tYXBmYl9zZXRfY29sb3Jfa2V5KG1nciwgY2spOworZXJyOgorCW9tYXBmYl91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX2dldF9jb2xvcl9rZXkoc3RydWN0IGZiX2luZm8gKmZiaSwKKwkJc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkgKmNrKQoreworCXN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSA9IEZCMk9GQihmYmkpOworCXN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYgPSBvZmJpLT5mYmRldjsKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1nciA9IE5VTEw7CisJaW50IHIgPSAwOworCWludCBpOworCisJb21hcGZiX2xvY2soZmJkZXYpOworCisJZm9yIChpID0gMDsgaSA8IG9mYmktPm51bV9vdmVybGF5czsgaSsrKSB7CisJCWlmIChvZmJpLT5vdmVybGF5c1tpXS0+bWFuYWdlcikgeworCQkJbWdyID0gb2ZiaS0+b3ZlcmxheXNbaV0tPm1hbmFnZXI7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghbWdyKSB7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwkqY2sgPSBvbWFwZmJfY29sb3Jfa2V5c1ttZ3ItPmlkXTsKK2VycjoKKwlvbWFwZmJfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9tZW1vcnlfcmVhZChzdHJ1Y3QgZmJfaW5mbyAqZmJpLAorCQlzdHJ1Y3Qgb21hcGZiX21lbW9yeV9yZWFkICptcikKK3sKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5ID0gZmIyZGlzcGxheShmYmkpOworCXZvaWQgKmJ1ZjsKKwlpbnQgcjsKKworCWlmICghZGlzcGxheSB8fCAhZGlzcGxheS0+bWVtb3J5X3JlYWQpCisJCXJldHVybiAtRU5PRU5UOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBtci0+YnVmZmVyLCBtci0+YnVmZmVyX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChtci0+dyAqIG1yLT5oICogMyA+IG1yLT5idWZmZXJfc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlidWYgPSB2bWFsbG9jKG1yLT5idWZmZXJfc2l6ZSk7CisJaWYgKCFidWYpIHsKKwkJREJHKCJ2bWFsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXIgPSBkaXNwbGF5LT5tZW1vcnlfcmVhZChkaXNwbGF5LCBidWYsIG1yLT5idWZmZXJfc2l6ZSwKKwkJCW1yLT54LCBtci0+eSwgbXItPncsIG1yLT5oKTsKKworCWlmIChyID4gMCkgeworCQlpZiAoY29weV90b191c2VyKG1yLT5idWZmZXIsIGJ1ZiwgbXItPmJ1ZmZlcl9zaXplKSkKKwkJCXIgPSAtRUZBVUxUOworCX0KKworCXZmcmVlKGJ1Zik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBvbWFwZmJfZ2V0X292bF9jb2xvcm1vZGUoc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldiwKKwkJCSAgICAgc3RydWN0IG9tYXBmYl9vdmxfY29sb3Jtb2RlICptb2RlKQoreworCWludCBvdmxfaWR4ID0gbW9kZS0+b3ZlcmxheV9pZHg7CisJaW50IG1vZGVfaWR4ID0gbW9kZS0+bW9kZV9pZHg7CisJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsOworCWVudW0gb21hcF9jb2xvcl9tb2RlIHN1cHBvcnRlZF9tb2RlczsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmFyOworCWludCBpOworCisJaWYgKG92bF9pZHggPj0gZmJkZXYtPm51bV9vdmVybGF5cykKKwkJcmV0dXJuIC1FTk9ERVY7CisJb3ZsID0gZmJkZXYtPm92ZXJsYXlzW292bF9pZHhdOworCXN1cHBvcnRlZF9tb2RlcyA9IG92bC0+c3VwcG9ydGVkX21vZGVzOworCisJbW9kZV9pZHggPSBtb2RlLT5tb2RlX2lkeDsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc3VwcG9ydGVkX21vZGVzKSAqIDg7IGkrKykgeworCQlpZiAoIShzdXBwb3J0ZWRfbW9kZXMgJiAoMSA8PCBpKSkpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBGQiBkb2Vzbid0IHN1cHBvcnQgYSBtb2RlCisJCSAqIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBvdmVybGF5LCBzbyBjYWxsIHRoZQorCQkgKiBmb2xsb3dpbmcgaGVyZS4KKwkJICovCisJCWlmIChkc3NfbW9kZV90b19mYl9tb2RlKDEgPDwgaSwgJnZhcikgPCAwKQorCQkJY29udGludWU7CisKKwkJbW9kZV9pZHgtLTsKKwkJaWYgKG1vZGVfaWR4IDwgMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IHNpemVvZihzdXBwb3J0ZWRfbW9kZXMpICogOCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwltb2RlLT5iaXRzX3Blcl9waXhlbCA9IHZhci5iaXRzX3Blcl9waXhlbDsKKwltb2RlLT5ub25zdGQgPSB2YXIubm9uc3RkOworCW1vZGUtPnJlZCA9IHZhci5yZWQ7CisJbW9kZS0+Z3JlZW4gPSB2YXIuZ3JlZW47CisJbW9kZS0+Ymx1ZSA9IHZhci5ibHVlOworCW1vZGUtPnRyYW5zcCA9IHZhci50cmFuc3A7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwZmJfd2FpdF9mb3JfZ28oc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmkgPSBGQjJPRkIoZmJpKTsKKwlpbnQgciA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgb2ZiaS0+bnVtX292ZXJsYXlzOyArK2kpIHsKKwkJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsID0gb2ZiaS0+b3ZlcmxheXNbaV07CisJCXIgPSBvdmwtPndhaXRfZm9yX2dvKG92bCk7CisJCWlmIChyKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK2ludCBvbWFwZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmZiaSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG9tYXBmYl9pbmZvICpvZmJpID0gRkIyT0ZCKGZiaSk7CisJc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldiA9IG9mYmktPmZiZGV2OworCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRpc3BsYXkgPSBmYjJkaXNwbGF5KGZiaSk7CisKKwl1bmlvbiB7CisJCXN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvd19vbGQJdXduZF9vOworCQlzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cJdXduZDsKKwkJc3RydWN0IG9tYXBmYl9wbGFuZV9pbmZvCXBsYW5lX2luZm87CisJCXN0cnVjdCBvbWFwZmJfY2FwcwkJY2FwczsKKwkJc3RydWN0IG9tYXBmYl9tZW1faW5mbyAgICAgICAgICBtZW1faW5mbzsKKwkJc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkJCWNvbG9yX2tleTsKKwkJc3RydWN0IG9tYXBmYl9vdmxfY29sb3Jtb2RlCW92bF9jb2xvcm1vZGU7CisJCWVudW0gb21hcGZiX3VwZGF0ZV9tb2RlCQl1cGRhdGVfbW9kZTsKKwkJaW50IHRlc3RfbnVtOworCQlzdHJ1Y3Qgb21hcGZiX21lbW9yeV9yZWFkCW1lbW9yeV9yZWFkOworCQlzdHJ1Y3Qgb21hcGZiX3ZyYW1faW5mbwkJdnJhbV9pbmZvOworCQlzdHJ1Y3Qgb21hcGZiX3RlYXJzeW5jX2luZm8JdGVhcnN5bmNfaW5mbzsKKwl9IHA7CisKKwlpbnQgciA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT01BUEZCX1NZTkNfR0ZYOgorCQlEQkcoImlvY3RsIFNZTkNfR0ZYXG4iKTsKKwkJaWYgKCFkaXNwbGF5IHx8ICFkaXNwbGF5LT5zeW5jKSB7CisJCQkvKiBEU1MxIG5ldmVyIHJldHVybnMgYW4gZXJyb3IgaGVyZSwgc28gd2UgbmVpdGhlciAqLworCQkJLypyID0gLUVJTlZBTDsqLworCQkJYnJlYWs7CisJCX0KKworCQlyID0gZGlzcGxheS0+c3luYyhkaXNwbGF5KTsKKwkJYnJlYWs7CisKKwljYXNlIE9NQVBGQl9VUERBVEVfV0lORE9XX09MRDoKKwkJREJHKCJpb2N0bCBVUERBVEVfV0lORE9XX09MRFxuIik7CisJCWlmICghZGlzcGxheSB8fCAhZGlzcGxheS0+dXBkYXRlKSB7CisJCQlyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLnV3bmRfbywKKwkJCQkJKHZvaWQgX191c2VyICopYXJnLAorCQkJCQlzaXplb2YocC51d25kX28pKSkgeworCQkJciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCXIgPSBvbWFwZmJfdXBkYXRlX3dpbmRvd19ub2xvY2soZmJpLCBwLnV3bmRfby54LCBwLnV3bmRfby55LAorCQkJCXAudXduZF9vLndpZHRoLCBwLnV3bmRfby5oZWlnaHQpOworCQlicmVhazsKKworCWNhc2UgT01BUEZCX1VQREFURV9XSU5ET1c6CisJCURCRygiaW9jdGwgVVBEQVRFX1dJTkRPV1xuIik7CisJCWlmICghZGlzcGxheSB8fCAhZGlzcGxheS0+dXBkYXRlKSB7CisJCQlyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLnV3bmQsICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJc2l6ZW9mKHAudXduZCkpKSB7CisJCQlyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJciA9IG9tYXBmYl91cGRhdGVfd2luZG93X25vbG9jayhmYmksIHAudXduZC54LCBwLnV3bmQueSwKKwkJCQlwLnV3bmQud2lkdGgsIHAudXduZC5oZWlnaHQpOworCQlicmVhazsKKworCWNhc2UgT01BUEZCX1NFVFVQX1BMQU5FOgorCQlEQkcoImlvY3RsIFNFVFVQX1BMQU5FXG4iKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLnBsYW5lX2luZm8sICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJc2l6ZW9mKHAucGxhbmVfaW5mbykpKQorCQkJciA9IC1FRkFVTFQ7CisJCWVsc2UKKwkJCXIgPSBvbWFwZmJfc2V0dXBfcGxhbmUoZmJpLCAmcC5wbGFuZV9pbmZvKTsKKwkJYnJlYWs7CisKKwljYXNlIE9NQVBGQl9RVUVSWV9QTEFORToKKwkJREJHKCJpb2N0bCBRVUVSWV9QTEFORVxuIik7CisJCXIgPSBvbWFwZmJfcXVlcnlfcGxhbmUoZmJpLCAmcC5wbGFuZV9pbmZvKTsKKwkJaWYgKHIgPCAwKQorCQkJYnJlYWs7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmcC5wbGFuZV9pbmZvLAorCQkJCQlzaXplb2YocC5wbGFuZV9pbmZvKSkpCisJCQlyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwljYXNlIE9NQVBGQl9TRVRVUF9NRU06CisJCURCRygiaW9jdGwgU0VUVVBfTUVNXG4iKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLm1lbV9pbmZvLCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJCXNpemVvZihwLm1lbV9pbmZvKSkpCisJCQlyID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJciA9IG9tYXBmYl9zZXR1cF9tZW0oZmJpLCAmcC5tZW1faW5mbyk7CisJCWJyZWFrOworCisJY2FzZSBPTUFQRkJfUVVFUllfTUVNOgorCQlEQkcoImlvY3RsIFFVRVJZX01FTVxuIik7CisJCXIgPSBvbWFwZmJfcXVlcnlfbWVtKGZiaSwgJnAubWVtX2luZm8pOworCQlpZiAociA8IDApCisJCQlicmVhazsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZwLm1lbV9pbmZvLAorCQkJCQlzaXplb2YocC5tZW1faW5mbykpKQorCQkJciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBPTUFQRkJfR0VUX0NBUFM6CisJCURCRygiaW9jdGwgR0VUX0NBUFNcbiIpOworCQlpZiAoIWRpc3BsYXkpIHsKKwkJCXIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQltZW1zZXQoJnAuY2FwcywgMCwgc2l6ZW9mKHAuY2FwcykpOworCQlpZiAoZGlzcGxheS0+Y2FwcyAmIE9NQVBfRFNTX0RJU1BMQVlfQ0FQX01BTlVBTF9VUERBVEUpCisJCQlwLmNhcHMuY3RybCB8PSBPTUFQRkJfQ0FQU19NQU5VQUxfVVBEQVRFOworCQlpZiAoZGlzcGxheS0+Y2FwcyAmIE9NQVBfRFNTX0RJU1BMQVlfQ0FQX1RFQVJfRUxJTSkKKwkJCXAuY2Fwcy5jdHJsIHw9IE9NQVBGQl9DQVBTX1RFQVJTWU5DOworCisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmcC5jYXBzLCBzaXplb2YocC5jYXBzKSkpCisJCQlyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwljYXNlIE9NQVBGQl9HRVRfT1ZFUkxBWV9DT0xPUk1PREU6CisJCURCRygiaW9jdGwgR0VUX09WRVJMQVlfQ09MT1JNT0RFXG4iKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLm92bF9jb2xvcm1vZGUsICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkgICBzaXplb2YocC5vdmxfY29sb3Jtb2RlKSkpIHsKKwkJCXIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJciA9IG9tYXBmYl9nZXRfb3ZsX2NvbG9ybW9kZShmYmRldiwgJnAub3ZsX2NvbG9ybW9kZSk7CisJCWlmIChyIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnAub3ZsX2NvbG9ybW9kZSwKKwkJCQkgc2l6ZW9mKHAub3ZsX2NvbG9ybW9kZSkpKQorCQkJciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBPTUFQRkJfU0VUX1VQREFURV9NT0RFOgorCQlEQkcoImlvY3RsIFNFVF9VUERBVEVfTU9ERVxuIik7CisJCWlmIChnZXRfdXNlcihwLnVwZGF0ZV9tb2RlLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJciA9IG9tYXBmYl9zZXRfdXBkYXRlX21vZGUoZmJpLCBwLnVwZGF0ZV9tb2RlKTsKKwkJYnJlYWs7CisKKwljYXNlIE9NQVBGQl9HRVRfVVBEQVRFX01PREU6CisJCURCRygiaW9jdGwgR0VUX1VQREFURV9NT0RFXG4iKTsKKwkJciA9IG9tYXBmYl9nZXRfdXBkYXRlX21vZGUoZmJpLCAmcC51cGRhdGVfbW9kZSk7CisJCWlmIChyKQorCQkJYnJlYWs7CisJCWlmIChwdXRfdXNlcihwLnVwZGF0ZV9tb2RlLAorCQkJCQkoZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgX191c2VyICopYXJnKSkKKwkJCXIgPSAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgT01BUEZCX1NFVF9DT0xPUl9LRVk6CisJCURCRygiaW9jdGwgU0VUX0NPTE9SX0tFWVxuIik7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcC5jb2xvcl9rZXksICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkgICBzaXplb2YocC5jb2xvcl9rZXkpKSkKKwkJCXIgPSAtRUZBVUxUOworCQllbHNlCisJCQlyID0gb21hcGZiX3NldF9jb2xvcl9rZXkoZmJpLCAmcC5jb2xvcl9rZXkpOworCQlicmVhazsKKworCWNhc2UgT01BUEZCX0dFVF9DT0xPUl9LRVk6CisJCURCRygiaW9jdGwgR0VUX0NPTE9SX0tFWVxuIik7CisJCXIgPSBvbWFwZmJfZ2V0X2NvbG9yX2tleShmYmksICZwLmNvbG9yX2tleSk7CisJCWlmIChyKQorCQkJYnJlYWs7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmcC5jb2xvcl9rZXksCisJCQkJIHNpemVvZihwLmNvbG9yX2tleSkpKQorCQkJciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBPTUFQRkJfV0FJVEZPUlZTWU5DOgorCQlEQkcoImlvY3RsIFdBSVRGT1JWU1lOQ1xuIik7CisJCWlmICghZGlzcGxheSkgeworCQkJciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCXIgPSBkaXNwbGF5LT53YWl0X3ZzeW5jKGRpc3BsYXkpOworCQlicmVhazsKKworCWNhc2UgT01BUEZCX1dBSVRGT1JHTzoKKwkJREJHKCJpb2N0bCBXQUlURk9SR09cbiIpOworCQlpZiAoIWRpc3BsYXkpIHsKKwkJCXIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlyID0gb21hcGZiX3dhaXRfZm9yX2dvKGZiaSk7CisJCWJyZWFrOworCisJLyogTENEIGFuZCBDVFJMIHRlc3RzIGRvIHRoZSBzYW1lIHRoaW5nIGZvciBiYWNrd2FyZAorCSAqIGNvbXBhdGliaWxpdHkgKi8KKwljYXNlIE9NQVBGQl9MQ0RfVEVTVDoKKwkJREJHKCJpb2N0bCBMQ0RfVEVTVFxuIik7CisJCWlmIChnZXRfdXNlcihwLnRlc3RfbnVtLCAoaW50IF9fdXNlciAqKWFyZykpIHsKKwkJCXIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFkaXNwbGF5IHx8ICFkaXNwbGF5LT5ydW5fdGVzdCkgeworCQkJciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCXIgPSBkaXNwbGF5LT5ydW5fdGVzdChkaXNwbGF5LCBwLnRlc3RfbnVtKTsKKworCQlicmVhazsKKworCWNhc2UgT01BUEZCX0NUUkxfVEVTVDoKKwkJREJHKCJpb2N0bCBDVFJMX1RFU1RcbiIpOworCQlpZiAoZ2V0X3VzZXIocC50ZXN0X251bSwgKGludCBfX3VzZXIgKilhcmcpKSB7CisJCQlyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWlmICghZGlzcGxheSB8fCAhZGlzcGxheS0+cnVuX3Rlc3QpIHsKKwkJCXIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlyID0gZGlzcGxheS0+cnVuX3Rlc3QoZGlzcGxheSwgcC50ZXN0X251bSk7CisKKwkJYnJlYWs7CisKKwljYXNlIE9NQVBGQl9NRU1PUllfUkVBRDoKKwkJREJHKCJpb2N0bCBNRU1PUllfUkVBRFxuIik7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLm1lbW9yeV9yZWFkLCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJCXNpemVvZihwLm1lbW9yeV9yZWFkKSkpIHsKKwkJCXIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlyID0gb21hcGZiX21lbW9yeV9yZWFkKGZiaSwgJnAubWVtb3J5X3JlYWQpOworCisJCWJyZWFrOworCisJY2FzZSBPTUFQRkJfR0VUX1ZSQU1fSU5GTzogeworCQl1bnNpZ25lZCBsb25nIHZyYW0sIGZyZWUsIGxhcmdlc3Q7CisKKwkJREJHKCJpb2N0bCBHRVRfVlJBTV9JTkZPXG4iKTsKKworCQlvbWFwX3ZyYW1fZ2V0X2luZm8oJnZyYW0sICZmcmVlLCAmbGFyZ2VzdCk7CisJCXAudnJhbV9pbmZvLnRvdGFsID0gdnJhbTsKKwkJcC52cmFtX2luZm8uZnJlZSA9IGZyZWU7CisJCXAudnJhbV9pbmZvLmxhcmdlc3RfZnJlZV9ibG9jayA9IGxhcmdlc3Q7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZwLnZyYW1faW5mbywKKwkJCQkJc2l6ZW9mKHAudnJhbV9pbmZvKSkpCisJCQlyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBPTUFQRkJfU0VUX1RFQVJTWU5DOiB7CisJCURCRygiaW9jdGwgU0VUX1RFQVJTWU5DXG4iKTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnAudGVhcnN5bmNfaW5mbywgKHZvaWQgX191c2VyICopYXJnLAorCQkJCQlzaXplb2YocC50ZWFyc3luY19pbmZvKSkpIHsKKwkJCXIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIWRpc3BsYXktPmVuYWJsZV90ZSkgeworCQkJciA9IC1FTk9ERVY7CisJCQlicmVhazsKKwkJfQorCisJCXIgPSBkaXNwbGF5LT5lbmFibGVfdGUoZGlzcGxheSwgISFwLnRlYXJzeW5jX2luZm8uZW5hYmxlZCk7CisKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiVW5rbm93biBpb2N0bCAweCV4XG4iLCBjbWQpOworCQlyID0gLUVJTlZBTDsKKwl9CisKKwlpZiAociA8IDApCisJCURCRygiaW9jdGwgZmFpbGVkOiAlZFxuIiwgcik7CisKKwlyZXR1cm4gcjsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItbWFpbi5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLW1haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjI5OTgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLW1haW4uYwpAQCAtMCwwICsxLDIyNjEgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi1tYWluLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogVG9taSBWYWxrZWluZW4gPHRvbWkudmFsa2VpbmVuQG5va2lhLmNvbT4KKyAqCisgKiBTb21lIGNvZGUgYW5kIGlkZWFzIHRha2VuIGZyb20gZHJpdmVycy92aWRlby9vbWFwLyBkcml2ZXIKKyAqIGJ5IEltcmUgRGVhay4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb21hcGZiLmg+CisKKyNpbmNsdWRlIDxwbGF0L2Rpc3BsYXkuaD4KKyNpbmNsdWRlIDxwbGF0L3ZyYW0uaD4KKyNpbmNsdWRlIDxwbGF0L3ZyZmIuaD4KKworI2luY2x1ZGUgIm9tYXBmYi5oIgorCisjZGVmaW5lIE1PRFVMRV9OQU1FICAgICAib21hcGZiIgorCisjZGVmaW5lIE9NQVBGQl9QTEFORV9YUkVTX01JTgkJOAorI2RlZmluZSBPTUFQRkJfUExBTkVfWVJFU19NSU4JCTgKKworc3RhdGljIGNoYXIgKmRlZl9tb2RlOworc3RhdGljIGNoYXIgKmRlZl92cmFtOworc3RhdGljIGludCBkZWZfdnJmYjsKK3N0YXRpYyBpbnQgZGVmX3JvdGF0ZTsKK3N0YXRpYyBpbnQgZGVmX21pcnJvcjsKKworI2lmZGVmIERFQlVHCit1bnNpZ25lZCBpbnQgb21hcGZiX2RlYnVnOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBvbWFwZmJfZGVidWcsIGJvb2wsIDA2NDQpOworc3RhdGljIHVuc2lnbmVkIGludCBvbWFwZmJfdGVzdF9wYXR0ZXJuOworbW9kdWxlX3BhcmFtX25hbWVkKHRlc3QsIG9tYXBmYl90ZXN0X3BhdHRlcm4sIGJvb2wsIDA2NDQpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgb21hcGZiX2ZiX2luaXQoc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldiwgc3RydWN0IGZiX2luZm8gKmZiaSk7CisKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgZHJhd19waXhlbChzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBpbnQgeCwgaW50IHksIHVuc2lnbmVkIGNvbG9yKQoreworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmZiaS0+dmFyOworCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4ID0gJmZiaS0+Zml4OworCXZvaWQgX19pb21lbSAqYWRkciA9IGZiaS0+c2NyZWVuX2Jhc2U7CisJY29uc3QgdW5zaWduZWQgYnl0ZXNwcCA9IHZhci0+Yml0c19wZXJfcGl4ZWwgPj4gMzsKKwljb25zdCB1bnNpZ25lZCBsaW5lX2xlbiA9IGZpeC0+bGluZV9sZW5ndGggLyBieXRlc3BwOworCisJaW50IHIgPSAoY29sb3IgPj4gMTYpICYgMHhmZjsKKwlpbnQgZyA9IChjb2xvciA+PiA4KSAmIDB4ZmY7CisJaW50IGIgPSAoY29sb3IgPj4gMCkgJiAweGZmOworCisJaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gMTYpIHsKKwkJdTE2IF9faW9tZW0gKnAgPSAodTE2IF9faW9tZW0gKilhZGRyOworCQlwICs9IHkgKiBsaW5lX2xlbiArIHg7CisKKwkJciA9IHIgKiAzMiAvIDI1NjsKKwkJZyA9IGcgKiA2NCAvIDI1NjsKKwkJYiA9IGIgKiAzMiAvIDI1NjsKKworCQlfX3Jhd193cml0ZXcoKHIgPDwgMTEpIHwgKGcgPDwgNSkgfCAoYiA8PCAwKSwgcCk7CisJfSBlbHNlIGlmICh2YXItPmJpdHNfcGVyX3BpeGVsID09IDI0KSB7CisJCXU4IF9faW9tZW0gKnAgPSAodTggX19pb21lbSAqKWFkZHI7CisJCXAgKz0gKHkgKiBsaW5lX2xlbiArIHgpICogMzsKKworCQlfX3Jhd193cml0ZWIoYiwgcCArIDApOworCQlfX3Jhd193cml0ZWIoZywgcCArIDEpOworCQlfX3Jhd193cml0ZWIociwgcCArIDIpOworCX0gZWxzZSBpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA9PSAzMikgeworCQl1MzIgX19pb21lbSAqcCA9ICh1MzIgX19pb21lbSAqKWFkZHI7CisJCXAgKz0geSAqIGxpbmVfbGVuICsgeDsKKwkJX19yYXdfd3JpdGVsKGNvbG9yLCBwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfZmIoc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZmYmktPnZhcjsKKwljb25zdCBzaG9ydCB3ID0gdmFyLT54cmVzX3ZpcnR1YWw7CisJY29uc3Qgc2hvcnQgaCA9IHZhci0+eXJlc192aXJ0dWFsOworCXZvaWQgX19pb21lbSAqYWRkciA9IGZiaS0+c2NyZWVuX2Jhc2U7CisJaW50IHksIHg7CisKKwlpZiAoIWFkZHIpCisJCXJldHVybjsKKworCURCRygiZmlsbF9mYiAlZHglZCwgbGluZV9sZW4gJWQgYnl0ZXNcbiIsIHcsIGgsIGZiaS0+Zml4LmxpbmVfbGVuZ3RoKTsKKworCWZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKwkJZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworCQkJaWYgKHggPCAyMCAmJiB5IDwgMjApCisJCQkJZHJhd19waXhlbChmYmksIHgsIHksIDB4ZmZmZmZmKTsKKwkJCWVsc2UgaWYgKHggPCAyMCAmJiAoeSA+IDIwICYmIHkgPCBoIC0gMjApKQorCQkJCWRyYXdfcGl4ZWwoZmJpLCB4LCB5LCAweGZmKTsKKwkJCWVsc2UgaWYgKHkgPCAyMCAmJiAoeCA+IDIwICYmIHggPCB3IC0gMjApKQorCQkJCWRyYXdfcGl4ZWwoZmJpLCB4LCB5LCAweGZmMDApOworCQkJZWxzZSBpZiAoeCA+IHcgLSAyMCAmJiAoeSA+IDIwICYmIHkgPCBoIC0gMjApKQorCQkJCWRyYXdfcGl4ZWwoZmJpLCB4LCB5LCAweGZmMDAwMCk7CisJCQllbHNlIGlmICh5ID4gaCAtIDIwICYmICh4ID4gMjAgJiYgeCA8IHcgLSAyMCkpCisJCQkJZHJhd19waXhlbChmYmksIHgsIHksIDB4ZmZmZjAwKTsKKwkJCWVsc2UgaWYgKHggPT0gMjAgfHwgeCA9PSB3IC0gMjAgfHwKKwkJCQkJeSA9PSAyMCB8fCB5ID09IGggLSAyMCkKKwkJCQlkcmF3X3BpeGVsKGZiaSwgeCwgeSwgMHhmZmZmZmYpOworCQkJZWxzZSBpZiAoeCA9PSB5IHx8IHcgLSB4ID09IGggLSB5KQorCQkJCWRyYXdfcGl4ZWwoZmJpLCB4LCB5LCAweGZmMDBmZik7CisJCQllbHNlIGlmICh3IC0geCA9PSB5IHx8IHggPT0gaCAtIHkpCisJCQkJZHJhd19waXhlbChmYmksIHgsIHksIDB4MDBmZmZmKTsKKwkJCWVsc2UgaWYgKHggPiAyMCAmJiB5ID4gMjAgJiYgeCA8IHcgLSAyMCAmJiB5IDwgaCAtIDIwKSB7CisJCQkJaW50IHQgPSB4ICogMyAvIHc7CisJCQkJdW5zaWduZWQgciA9IDAsIGcgPSAwLCBiID0gMDsKKwkJCQl1bnNpZ25lZCBjOworCQkJCWlmICh2YXItPmJpdHNfcGVyX3BpeGVsID09IDE2KSB7CisJCQkJCWlmICh0ID09IDApCisJCQkJCQliID0gKHkgJSAzMikgKiAyNTYgLyAzMjsKKwkJCQkJZWxzZSBpZiAodCA9PSAxKQorCQkJCQkJZyA9ICh5ICUgNjQpICogMjU2IC8gNjQ7CisJCQkJCWVsc2UgaWYgKHQgPT0gMikKKwkJCQkJCXIgPSAoeSAlIDMyKSAqIDI1NiAvIDMyOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICh0ID09IDApCisJCQkJCQliID0gKHkgJSAyNTYpOworCQkJCQllbHNlIGlmICh0ID09IDEpCisJCQkJCQlnID0gKHkgJSAyNTYpOworCQkJCQllbHNlIGlmICh0ID09IDIpCisJCQkJCQlyID0gKHkgJSAyNTYpOworCQkJCX0KKwkJCQljID0gKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCAoYiA8PCAwKTsKKwkJCQlkcmF3X3BpeGVsKGZiaSwgeCwgeSwgYyk7CisJCQl9IGVsc2UgeworCQkJCWRyYXdfcGl4ZWwoZmJpLCB4LCB5LCAwKTsKKwkJCX0KKwkJfQorCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgb21hcGZiX2dldF92cmZiX29mZnNldChzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmksIGludCByb3QpCit7CisJc3RydWN0IHZyZmIgKnZyZmIgPSAmb2ZiaS0+cmVnaW9uLnZyZmI7CisJdW5zaWduZWQgb2Zmc2V0OworCisJc3dpdGNoIChyb3QpIHsKKwljYXNlIEZCX1JPVEFURV9VUjoKKwkJb2Zmc2V0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBGQl9ST1RBVEVfQ1c6CisJCW9mZnNldCA9IHZyZmItPnlvZmZzZXQ7CisJCWJyZWFrOworCWNhc2UgRkJfUk9UQVRFX1VEOgorCQlvZmZzZXQgPSB2cmZiLT55b2Zmc2V0ICogT01BUF9WUkZCX0xJTkVfTEVOICsgdnJmYi0+eG9mZnNldDsKKwkJYnJlYWs7CisJY2FzZSBGQl9ST1RBVEVfQ0NXOgorCQlvZmZzZXQgPSB2cmZiLT54b2Zmc2V0ICogT01BUF9WUkZCX0xJTkVfTEVOOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlvZmZzZXQgKj0gdnJmYi0+Ynl0ZXNwcDsKKworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyB1MzIgb21hcGZiX2dldF9yZWdpb25fcm90X3BhZGRyKHN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSwgaW50IHJvdCkKK3sKKwlpZiAob2ZiaS0+cm90YXRpb25fdHlwZSA9PSBPTUFQX0RTU19ST1RfVlJGQikgeworCQlyZXR1cm4gb2ZiaS0+cmVnaW9uLnZyZmIucGFkZHJbcm90XQorCQkJKyBvbWFwZmJfZ2V0X3ZyZmJfb2Zmc2V0KG9mYmksIHJvdCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIG9mYmktPnJlZ2lvbi5wYWRkcjsKKwl9Cit9CisKK3N0YXRpYyB1MzIgb21hcGZiX2dldF9yZWdpb25fcGFkZHIoc3RydWN0IG9tYXBmYl9pbmZvICpvZmJpKQoreworCWlmIChvZmJpLT5yb3RhdGlvbl90eXBlID09IE9NQVBfRFNTX1JPVF9WUkZCKQorCQlyZXR1cm4gb2ZiaS0+cmVnaW9uLnZyZmIucGFkZHJbMF07CisJZWxzZQorCQlyZXR1cm4gb2ZiaS0+cmVnaW9uLnBhZGRyOworfQorCitzdGF0aWMgdm9pZCBfX2lvbWVtICpvbWFwZmJfZ2V0X3JlZ2lvbl92YWRkcihzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmkpCit7CisJaWYgKG9mYmktPnJvdGF0aW9uX3R5cGUgPT0gT01BUF9EU1NfUk9UX1ZSRkIpCisJCXJldHVybiBvZmJpLT5yZWdpb24udnJmYi52YWRkclswXTsKKwllbHNlCisJCXJldHVybiBvZmJpLT5yZWdpb24udmFkZHI7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcGZiX2NvbG9ybW9kZSBvbWFwZmJfY29sb3Jtb2Rlc1tdID0geworCXsKKwkJLmRzc21vZGUgPSBPTUFQX0RTU19DT0xPUl9VWVZZLAorCQkuYml0c19wZXJfcGl4ZWwgPSAxNiwKKwkJLm5vbnN0ZCA9IE9NQVBGQl9DT0xPUl9ZVVY0MjIsCisJfSwgeworCQkuZHNzbW9kZSA9IE9NQVBfRFNTX0NPTE9SX1lVVjIsCisJCS5iaXRzX3Blcl9waXhlbCA9IDE2LAorCQkubm9uc3RkID0gT01BUEZCX0NPTE9SX1lVWTQyMiwKKwl9LCB7CisJCS5kc3Ntb2RlID0gT01BUF9EU1NfQ09MT1JfQVJHQjE2LAorCQkuYml0c19wZXJfcGl4ZWwgPSAxNiwKKwkJLnJlZAk9IHsgLmxlbmd0aCA9IDQsIC5vZmZzZXQgPSA4LCAubXNiX3JpZ2h0ID0gMCB9LAorCQkuZ3JlZW4JPSB7IC5sZW5ndGggPSA0LCAub2Zmc2V0ID0gNCwgLm1zYl9yaWdodCA9IDAgfSwKKwkJLmJsdWUJPSB7IC5sZW5ndGggPSA0LCAub2Zmc2V0ID0gMCwgLm1zYl9yaWdodCA9IDAgfSwKKwkJLnRyYW5zcAk9IHsgLmxlbmd0aCA9IDQsIC5vZmZzZXQgPSAxMiwgLm1zYl9yaWdodCA9IDAgfSwKKwl9LCB7CisJCS5kc3Ntb2RlID0gT01BUF9EU1NfQ09MT1JfUkdCMTYsCisJCS5iaXRzX3Blcl9waXhlbCA9IDE2LAorCQkucmVkCT0geyAubGVuZ3RoID0gNSwgLm9mZnNldCA9IDExLCAubXNiX3JpZ2h0ID0gMCB9LAorCQkuZ3JlZW4JPSB7IC5sZW5ndGggPSA2LCAub2Zmc2V0ID0gNSwgLm1zYl9yaWdodCA9IDAgfSwKKwkJLmJsdWUJPSB7IC5sZW5ndGggPSA1LCAub2Zmc2V0ID0gMCwgLm1zYl9yaWdodCA9IDAgfSwKKwkJLnRyYW5zcAk9IHsgLmxlbmd0aCA9IDAsIC5vZmZzZXQgPSAwLCAubXNiX3JpZ2h0ID0gMCB9LAorCX0sIHsKKwkJLmRzc21vZGUgPSBPTUFQX0RTU19DT0xPUl9SR0IyNFAsCisJCS5iaXRzX3Blcl9waXhlbCA9IDI0LAorCQkucmVkCT0geyAubGVuZ3RoID0gOCwgLm9mZnNldCA9IDE2LCAubXNiX3JpZ2h0ID0gMCB9LAorCQkuZ3JlZW4JPSB7IC5sZW5ndGggPSA4LCAub2Zmc2V0ID0gOCwgLm1zYl9yaWdodCA9IDAgfSwKKwkJLmJsdWUJPSB7IC5sZW5ndGggPSA4LCAub2Zmc2V0ID0gMCwgLm1zYl9yaWdodCA9IDAgfSwKKwkJLnRyYW5zcAk9IHsgLmxlbmd0aCA9IDAsIC5vZmZzZXQgPSAwLCAubXNiX3JpZ2h0ID0gMCB9LAorCX0sIHsKKwkJLmRzc21vZGUgPSBPTUFQX0RTU19DT0xPUl9SR0IyNFUsCisJCS5iaXRzX3Blcl9waXhlbCA9IDMyLAorCQkucmVkCT0geyAubGVuZ3RoID0gOCwgLm9mZnNldCA9IDE2LCAubXNiX3JpZ2h0ID0gMCB9LAorCQkuZ3JlZW4JPSB7IC5sZW5ndGggPSA4LCAub2Zmc2V0ID0gOCwgLm1zYl9yaWdodCA9IDAgfSwKKwkJLmJsdWUJPSB7IC5sZW5ndGggPSA4LCAub2Zmc2V0ID0gMCwgLm1zYl9yaWdodCA9IDAgfSwKKwkJLnRyYW5zcAk9IHsgLmxlbmd0aCA9IDAsIC5vZmZzZXQgPSAwLCAubXNiX3JpZ2h0ID0gMCB9LAorCX0sIHsKKwkJLmRzc21vZGUgPSBPTUFQX0RTU19DT0xPUl9BUkdCMzIsCisJCS5iaXRzX3Blcl9waXhlbCA9IDMyLAorCQkucmVkCT0geyAubGVuZ3RoID0gOCwgLm9mZnNldCA9IDE2LCAubXNiX3JpZ2h0ID0gMCB9LAorCQkuZ3JlZW4JPSB7IC5sZW5ndGggPSA4LCAub2Zmc2V0ID0gOCwgLm1zYl9yaWdodCA9IDAgfSwKKwkJLmJsdWUJPSB7IC5sZW5ndGggPSA4LCAub2Zmc2V0ID0gMCwgLm1zYl9yaWdodCA9IDAgfSwKKwkJLnRyYW5zcAk9IHsgLmxlbmd0aCA9IDgsIC5vZmZzZXQgPSAyNCwgLm1zYl9yaWdodCA9IDAgfSwKKwl9LCB7CisJCS5kc3Ntb2RlID0gT01BUF9EU1NfQ09MT1JfUkdCQTMyLAorCQkuYml0c19wZXJfcGl4ZWwgPSAzMiwKKwkJLnJlZAk9IHsgLmxlbmd0aCA9IDgsIC5vZmZzZXQgPSAyNCwgLm1zYl9yaWdodCA9IDAgfSwKKwkJLmdyZWVuCT0geyAubGVuZ3RoID0gOCwgLm9mZnNldCA9IDE2LCAubXNiX3JpZ2h0ID0gMCB9LAorCQkuYmx1ZQk9IHsgLmxlbmd0aCA9IDgsIC5vZmZzZXQgPSA4LCAubXNiX3JpZ2h0ID0gMCB9LAorCQkudHJhbnNwCT0geyAubGVuZ3RoID0gOCwgLm9mZnNldCA9IDAsIC5tc2JfcmlnaHQgPSAwIH0sCisJfSwgeworCQkuZHNzbW9kZSA9IE9NQVBfRFNTX0NPTE9SX1JHQlgzMiwKKwkJLmJpdHNfcGVyX3BpeGVsID0gMzIsCisJCS5yZWQJPSB7IC5sZW5ndGggPSA4LCAub2Zmc2V0ID0gMjQsIC5tc2JfcmlnaHQgPSAwIH0sCisJCS5ncmVlbgk9IHsgLmxlbmd0aCA9IDgsIC5vZmZzZXQgPSAxNiwgLm1zYl9yaWdodCA9IDAgfSwKKwkJLmJsdWUJPSB7IC5sZW5ndGggPSA4LCAub2Zmc2V0ID0gOCwgLm1zYl9yaWdodCA9IDAgfSwKKwkJLnRyYW5zcAk9IHsgLmxlbmd0aCA9IDAsIC5vZmZzZXQgPSAwLCAubXNiX3JpZ2h0ID0gMCB9LAorCX0sCit9OworCitzdGF0aWMgYm9vbCBjbXBfdmFyX3RvX2NvbG9ybW9kZShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJc3RydWN0IG9tYXBmYl9jb2xvcm1vZGUgKmNvbG9yKQoreworCWJvb2wgY21wX2NvbXBvbmVudChzdHJ1Y3QgZmJfYml0ZmllbGQgKmYxLCBzdHJ1Y3QgZmJfYml0ZmllbGQgKmYyKQorCXsKKwkJcmV0dXJuIGYxLT5sZW5ndGggPT0gZjItPmxlbmd0aCAmJgorCQkJZjEtPm9mZnNldCA9PSBmMi0+b2Zmc2V0ICYmCisJCQlmMS0+bXNiX3JpZ2h0ID09IGYyLT5tc2JfcmlnaHQ7CisJfQorCisJaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gMCB8fAorCQkJdmFyLT5yZWQubGVuZ3RoID09IDAgfHwKKwkJCXZhci0+Ymx1ZS5sZW5ndGggPT0gMCB8fAorCQkJdmFyLT5ncmVlbi5sZW5ndGggPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gdmFyLT5iaXRzX3Blcl9waXhlbCA9PSBjb2xvci0+Yml0c19wZXJfcGl4ZWwgJiYKKwkJY21wX2NvbXBvbmVudCgmdmFyLT5yZWQsICZjb2xvci0+cmVkKSAmJgorCQljbXBfY29tcG9uZW50KCZ2YXItPmdyZWVuLCAmY29sb3ItPmdyZWVuKSAmJgorCQljbXBfY29tcG9uZW50KCZ2YXItPmJsdWUsICZjb2xvci0+Ymx1ZSkgJiYKKwkJY21wX2NvbXBvbmVudCgmdmFyLT50cmFuc3AsICZjb2xvci0+dHJhbnNwKTsKK30KKworc3RhdGljIHZvaWQgYXNzaWduX2NvbG9ybW9kZV90b192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCXN0cnVjdCBvbWFwZmJfY29sb3Jtb2RlICpjb2xvcikKK3sKKwl2YXItPmJpdHNfcGVyX3BpeGVsID0gY29sb3ItPmJpdHNfcGVyX3BpeGVsOworCXZhci0+bm9uc3RkID0gY29sb3ItPm5vbnN0ZDsKKwl2YXItPnJlZCA9IGNvbG9yLT5yZWQ7CisJdmFyLT5ncmVlbiA9IGNvbG9yLT5ncmVlbjsKKwl2YXItPmJsdWUgPSBjb2xvci0+Ymx1ZTsKKwl2YXItPnRyYW5zcCA9IGNvbG9yLT50cmFuc3A7Cit9CisKK3N0YXRpYyBpbnQgZmJfbW9kZV90b19kc3NfbW9kZShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJZW51bSBvbWFwX2NvbG9yX21vZGUgKm1vZGUpCit7CisJZW51bSBvbWFwX2NvbG9yX21vZGUgZHNzbW9kZTsKKwlpbnQgaTsKKworCS8qIGZpcnN0IG1hdGNoIHdpdGggbm9uc3RkIGZpZWxkICovCisJaWYgKHZhci0+bm9uc3RkKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9tYXBmYl9jb2xvcm1vZGVzKTsgKytpKSB7CisJCQlzdHJ1Y3Qgb21hcGZiX2NvbG9ybW9kZSAqbSA9ICZvbWFwZmJfY29sb3Jtb2Rlc1tpXTsKKwkJCWlmICh2YXItPm5vbnN0ZCA9PSBtLT5ub25zdGQpIHsKKwkJCQlhc3NpZ25fY29sb3Jtb2RlX3RvX3Zhcih2YXIsIG0pOworCQkJCSptb2RlID0gbS0+ZHNzbW9kZTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHRoZW4gdHJ5IGV4YWN0IG1hdGNoIG9mIGJwcCBhbmQgY29sb3JzICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob21hcGZiX2NvbG9ybW9kZXMpOyArK2kpIHsKKwkJc3RydWN0IG9tYXBmYl9jb2xvcm1vZGUgKm0gPSAmb21hcGZiX2NvbG9ybW9kZXNbaV07CisJCWlmIChjbXBfdmFyX3RvX2NvbG9ybW9kZSh2YXIsIG0pKSB7CisJCQlhc3NpZ25fY29sb3Jtb2RlX3RvX3Zhcih2YXIsIG0pOworCQkJKm1vZGUgPSBtLT5kc3Ntb2RlOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBtYXRjaCB3aXRoIGJwcCBpZiB1c2VyIGhhcyBub3QgZmlsbGVkIGNvbG9yIGZpZWxkcworCSAqIHByb3Blcmx5ICovCisJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSAxOgorCQlkc3Ntb2RlID0gT01BUF9EU1NfQ09MT1JfQ0xVVDE7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZHNzbW9kZSA9IE9NQVBfRFNTX0NPTE9SX0NMVVQyOworCQlicmVhazsKKwljYXNlIDQ6CisJCWRzc21vZGUgPSBPTUFQX0RTU19DT0xPUl9DTFVUNDsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlkc3Ntb2RlID0gT01BUF9EU1NfQ09MT1JfQ0xVVDg7CisJCWJyZWFrOworCWNhc2UgMTI6CisJCWRzc21vZGUgPSBPTUFQX0RTU19DT0xPUl9SR0IxMlU7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWRzc21vZGUgPSBPTUFQX0RTU19DT0xPUl9SR0IxNjsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJZHNzbW9kZSA9IE9NQVBfRFNTX0NPTE9SX1JHQjI0UDsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJZHNzbW9kZSA9IE9NQVBfRFNTX0NPTE9SX1JHQjI0VTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob21hcGZiX2NvbG9ybW9kZXMpOyArK2kpIHsKKwkJc3RydWN0IG9tYXBmYl9jb2xvcm1vZGUgKm0gPSAmb21hcGZiX2NvbG9ybW9kZXNbaV07CisJCWlmIChkc3Ntb2RlID09IG0tPmRzc21vZGUpIHsKKwkJCWFzc2lnbl9jb2xvcm1vZGVfdG9fdmFyKHZhciwgbSk7CisJCQkqbW9kZSA9IG0tPmRzc21vZGU7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGNoZWNrX2ZiX3Jlc19ib3VuZHMoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCit7CisJaW50IHhyZXNfbWluID0gT01BUEZCX1BMQU5FX1hSRVNfTUlOOworCWludCB4cmVzX21heCA9IDIwNDg7CisJaW50IHlyZXNfbWluID0gT01BUEZCX1BMQU5FX1lSRVNfTUlOOworCWludCB5cmVzX21heCA9IDIwNDg7CisKKwkvKiBYWFg6IHNvbWUgYXBwbGljYXRpb25zIHNlZW0gdG8gc2V0IHZpcnR1YWwgcmVzIHRvIDAuICovCisJaWYgKHZhci0+eHJlc192aXJ0dWFsID09IDApCisJCXZhci0+eHJlc192aXJ0dWFsID0gdmFyLT54cmVzOworCisJaWYgKHZhci0+eXJlc192aXJ0dWFsID09IDApCisJCXZhci0+eXJlc192aXJ0dWFsID0gdmFyLT55cmVzOworCisJaWYgKHZhci0+eHJlc192aXJ0dWFsIDwgeHJlc19taW4gfHwgdmFyLT55cmVzX3ZpcnR1YWwgPCB5cmVzX21pbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodmFyLT54cmVzIDwgeHJlc19taW4pCisJCXZhci0+eHJlcyA9IHhyZXNfbWluOworCWlmICh2YXItPnlyZXMgPCB5cmVzX21pbikKKwkJdmFyLT55cmVzID0geXJlc19taW47CisJaWYgKHZhci0+eHJlcyA+IHhyZXNfbWF4KQorCQl2YXItPnhyZXMgPSB4cmVzX21heDsKKwlpZiAodmFyLT55cmVzID4geXJlc19tYXgpCisJCXZhci0+eXJlcyA9IHlyZXNfbWF4OworCisJaWYgKHZhci0+eHJlcyA+IHZhci0+eHJlc192aXJ0dWFsKQorCQl2YXItPnhyZXMgPSB2YXItPnhyZXNfdmlydHVhbDsKKwlpZiAodmFyLT55cmVzID4gdmFyLT55cmVzX3ZpcnR1YWwpCisJCXZhci0+eXJlcyA9IHZhci0+eXJlc192aXJ0dWFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNocmlua19oZWlnaHQodW5zaWduZWQgbG9uZyBtYXhfZnJhbWVfc2l6ZSwKKwkJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCit7CisJREJHKCJjYW4ndCBmaXQgRkIgaW50byBtZW1vcnksIHJlZHVjaW5nIHlcbiIpOworCXZhci0+eXJlc192aXJ0dWFsID0gbWF4X2ZyYW1lX3NpemUgLworCQkodmFyLT54cmVzX3ZpcnR1YWwgKiB2YXItPmJpdHNfcGVyX3BpeGVsID4+IDMpOworCisJaWYgKHZhci0+eXJlc192aXJ0dWFsIDwgT01BUEZCX1BMQU5FX1lSRVNfTUlOKQorCQl2YXItPnlyZXNfdmlydHVhbCA9IE9NQVBGQl9QTEFORV9ZUkVTX01JTjsKKworCWlmICh2YXItPnlyZXMgPiB2YXItPnlyZXNfdmlydHVhbCkKKwkJdmFyLT55cmVzID0gdmFyLT55cmVzX3ZpcnR1YWw7Cit9CisKK3N0YXRpYyB2b2lkIHNocmlua193aWR0aCh1bnNpZ25lZCBsb25nIG1heF9mcmFtZV9zaXplLAorCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwlEQkcoImNhbid0IGZpdCBGQiBpbnRvIG1lbW9yeSwgcmVkdWNpbmcgeFxuIik7CisJdmFyLT54cmVzX3ZpcnR1YWwgPSBtYXhfZnJhbWVfc2l6ZSAvIHZhci0+eXJlc192aXJ0dWFsIC8KKwkJKHZhci0+Yml0c19wZXJfcGl4ZWwgPj4gMyk7CisKKwlpZiAodmFyLT54cmVzX3ZpcnR1YWwgPCBPTUFQRkJfUExBTkVfWFJFU19NSU4pCisJCXZhci0+eHJlc192aXJ0dWFsID0gT01BUEZCX1BMQU5FX1hSRVNfTUlOOworCisJaWYgKHZhci0+eHJlcyA+IHZhci0+eHJlc192aXJ0dWFsKQorCQl2YXItPnhyZXMgPSB2YXItPnhyZXNfdmlydHVhbDsKK30KKworc3RhdGljIGludCBjaGVja192cmZiX2ZiX3NpemUodW5zaWduZWQgbG9uZyByZWdpb25fc2l6ZSwKKwkJY29uc3Qgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCit7CisJdW5zaWduZWQgbG9uZyBtaW5fcGh5c19zaXplID0gb21hcF92cmZiX21pbl9waHlzX3NpemUodmFyLT54cmVzX3ZpcnR1YWwsCisJCXZhci0+eXJlc192aXJ0dWFsLCB2YXItPmJpdHNfcGVyX3BpeGVsID4+IDMpOworCisJcmV0dXJuIG1pbl9waHlzX3NpemUgPiByZWdpb25fc2l6ZSA/IC1FSU5WQUwgOiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX2ZiX3NpemUoY29uc3Qgc3RydWN0IG9tYXBmYl9pbmZvICpvZmJpLAorCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwl1bnNpZ25lZCBsb25nIG1heF9mcmFtZV9zaXplID0gb2ZiaS0+cmVnaW9uLnNpemU7CisJaW50IGJ5dGVzcHAgPSB2YXItPmJpdHNfcGVyX3BpeGVsID4+IDM7CisJdW5zaWduZWQgbG9uZyBsaW5lX3NpemUgPSB2YXItPnhyZXNfdmlydHVhbCAqIGJ5dGVzcHA7CisKKwlpZiAob2ZiaS0+cm90YXRpb25fdHlwZSA9PSBPTUFQX0RTU19ST1RfVlJGQikgeworCQkvKiBPbmUgbmVlZHMgdG8gY2hlY2sgZm9yIGJvdGggVlJGQiBhbmQgT01BUEZCIGxpbWl0YXRpb25zLiAqLworCQlpZiAoY2hlY2tfdnJmYl9mYl9zaXplKG1heF9mcmFtZV9zaXplLCB2YXIpKQorCQkJc2hyaW5rX2hlaWdodChvbWFwX3ZyZmJfbWF4X2hlaWdodCgKKwkJCQltYXhfZnJhbWVfc2l6ZSwgdmFyLT54cmVzX3ZpcnR1YWwsIGJ5dGVzcHApICoKKwkJCQlsaW5lX3NpemUsIHZhcik7CisKKwkJaWYgKGNoZWNrX3ZyZmJfZmJfc2l6ZShtYXhfZnJhbWVfc2l6ZSwgdmFyKSkgeworCQkJREJHKCJjYW5ub3QgZml0IEZCIHRvIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJldHVybiAwOworCX0KKworCURCRygibWF4IGZyYW1lIHNpemUgJWx1LCBsaW5lIHNpemUgJWx1XG4iLCBtYXhfZnJhbWVfc2l6ZSwgbGluZV9zaXplKTsKKworCWlmIChsaW5lX3NpemUgKiB2YXItPnlyZXNfdmlydHVhbCA+IG1heF9mcmFtZV9zaXplKQorCQlzaHJpbmtfaGVpZ2h0KG1heF9mcmFtZV9zaXplLCB2YXIpOworCisJaWYgKGxpbmVfc2l6ZSAqIHZhci0+eXJlc192aXJ0dWFsID4gbWF4X2ZyYW1lX3NpemUpIHsKKwkJc2hyaW5rX3dpZHRoKG1heF9mcmFtZV9zaXplLCB2YXIpOworCQlsaW5lX3NpemUgPSB2YXItPnhyZXNfdmlydHVhbCAqIGJ5dGVzcHA7CisJfQorCisJaWYgKGxpbmVfc2l6ZSAqIHZhci0+eXJlc192aXJ0dWFsID4gbWF4X2ZyYW1lX3NpemUpIHsKKwkJREJHKCJjYW5ub3QgZml0IEZCIHRvIG1lbW9yeVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogQ29uc2lkZXIgaWYgVlJGQiBhc3Npc3RlZCByb3RhdGlvbiBpcyBpbiB1c2UgYW5kIGlmIHRoZSB2aXJ0dWFsIHNwYWNlIGZvcgorICogdGhlIHplcm8gZGVncmVlIHZpZXcgbmVlZHMgdG8gYmUgbWFwcGVkLiBUaGUgbmVlZCBmb3IgbWFwcGluZyBhbHNvIGFjdHMgYXMKKyAqIHRoZSB0cmlnZ2VyIGZvciBzZXR0aW5nIHVwIHRoZSBoYXJkd2FyZSBvbiB0aGUgY29udGV4dCBpbiBxdWVzdGlvbi4gVGhpcworICogZW5zdXJlcyB0aGF0IG9uZSBkb2VzIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyB0aGUgdmlydHVhbCB2aWV3IGJlZm9yZSB0aGUKKyAqIGhhcmR3YXJlIGlzIHNlcnZpbmcgdGhlIGFkZHJlc3MgdHJhbnNsYXRpb25zLgorICovCitzdGF0aWMgaW50IHNldHVwX3ZyZmJfcm90YXRpb24oc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmkgPSBGQjJPRkIoZmJpKTsKKwlzdHJ1Y3Qgb21hcGZiMl9tZW1fcmVnaW9uICpyZyA9ICZvZmJpLT5yZWdpb247CisJc3RydWN0IHZyZmIgKnZyZmIgPSAmcmctPnZyZmI7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmZmJpLT52YXI7CisJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXggPSAmZmJpLT5maXg7CisJdW5zaWduZWQgYnl0ZXNwcDsKKwlib29sIHl1dl9tb2RlOworCWVudW0gb21hcF9jb2xvcl9tb2RlIG1vZGU7CisJaW50IHI7CisJYm9vbCByZWNvbmY7CisKKwlpZiAoIXJnLT5zaXplIHx8IG9mYmktPnJvdGF0aW9uX3R5cGUgIT0gT01BUF9EU1NfUk9UX1ZSRkIpCisJCXJldHVybiAwOworCisJREJHKCJzZXR1cF92cmZiX3JvdGF0aW9uXG4iKTsKKworCXIgPSBmYl9tb2RlX3RvX2Rzc19tb2RlKHZhciwgJm1vZGUpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWJ5dGVzcHAgPSB2YXItPmJpdHNfcGVyX3BpeGVsID4+IDM7CisKKwl5dXZfbW9kZSA9IG1vZGUgPT0gT01BUF9EU1NfQ09MT1JfWVVWMiB8fCBtb2RlID09IE9NQVBfRFNTX0NPTE9SX1VZVlk7CisKKwkvKiBXZSBuZWVkIHRvIHJlY29uZmlndXJlIFZSRkIgaWYgdGhlIHJlc29sdXRpb24gY2hhbmdlcywgaWYgeXV2IG1vZGUKKwkgKiBpcyBlbmFibGVkL2Rpc2FibGVkLCBvciBpZiBieXRlcyBwZXIgcGl4ZWwgY2hhbmdlcyAqLworCisJLyogWFhYIHdlIHNob3VsZG4ndCBhbGxvdyB0aGlzIHdoZW4gZnJhbWVidWZmZXIgaXMgbW1hcHBlZCAqLworCisJcmVjb25mID0gZmFsc2U7CisKKwlpZiAoeXV2X21vZGUgIT0gdnJmYi0+eXV2X21vZGUpCisJCXJlY29uZiA9IHRydWU7CisJZWxzZSBpZiAoYnl0ZXNwcCAhPSB2cmZiLT5ieXRlc3BwKQorCQlyZWNvbmYgPSB0cnVlOworCWVsc2UgaWYgKHZyZmItPnhyZXMgIT0gdmFyLT54cmVzX3ZpcnR1YWwgfHwKKwkJCXZyZmItPnlyZXMgIT0gdmFyLT55cmVzX3ZpcnR1YWwpCisJCXJlY29uZiA9IHRydWU7CisKKwlpZiAodnJmYi0+dmFkZHJbMF0gJiYgcmVjb25mKSB7CisJCWZiaS0+c2NyZWVuX2Jhc2UgPSBOVUxMOworCQlmaXgtPnNtZW1fc3RhcnQgPSAwOworCQlmaXgtPnNtZW1fbGVuID0gMDsKKwkJaW91bm1hcCh2cmZiLT52YWRkclswXSk7CisJCXZyZmItPnZhZGRyWzBdID0gTlVMTDsKKwkJREJHKCJzZXR1cF92cmZiX3JvdGF0aW9uOiByZXNldCBmYlxuIik7CisJfQorCisJaWYgKHZyZmItPnZhZGRyWzBdKQorCQlyZXR1cm4gMDsKKworCW9tYXBfdnJmYl9zZXR1cCgmcmctPnZyZmIsIHJnLT5wYWRkciwKKwkJCXZhci0+eHJlc192aXJ0dWFsLAorCQkJdmFyLT55cmVzX3ZpcnR1YWwsCisJCQlieXRlc3BwLCB5dXZfbW9kZSk7CisKKwkvKiBOb3cgb25lIGNhbiBpb3JlbWFwIHRoZSAwIGFuZ2xlIHZpZXcgKi8KKwlyID0gb21hcF92cmZiX21hcF9hbmdsZSh2cmZiLCB2YXItPnlyZXNfdmlydHVhbCwgMCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJLyogdXNlZCBieSBvcGVuL3dyaXRlIGluIGZibWVtLmMgKi8KKwlmYmktPnNjcmVlbl9iYXNlID0gb2ZiaS0+cmVnaW9uLnZyZmIudmFkZHJbMF07CisKKwlmaXgtPnNtZW1fc3RhcnQgPSBvZmJpLT5yZWdpb24udnJmYi5wYWRkclswXTsKKworCXN3aXRjaCAodmFyLT5ub25zdGQpIHsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjI6CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVZNDIyOgorCQlmaXgtPmxpbmVfbGVuZ3RoID0KKwkJCShPTUFQX1ZSRkJfTElORV9MRU4gKiB2YXItPmJpdHNfcGVyX3BpeGVsKSA+PiAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmaXgtPmxpbmVfbGVuZ3RoID0KKwkJCShPTUFQX1ZSRkJfTElORV9MRU4gKiB2YXItPmJpdHNfcGVyX3BpeGVsKSA+PiAzOworCQlicmVhazsKKwl9CisKKwlmaXgtPnNtZW1fbGVuID0gdmFyLT55cmVzX3ZpcnR1YWwgKiBmaXgtPmxpbmVfbGVuZ3RoOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkc3NfbW9kZV90b19mYl9tb2RlKGVudW0gb21hcF9jb2xvcl9tb2RlIGRzc21vZGUsCisJCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9tYXBmYl9jb2xvcm1vZGVzKTsgKytpKSB7CisJCXN0cnVjdCBvbWFwZmJfY29sb3Jtb2RlICptb2RlID0gJm9tYXBmYl9jb2xvcm1vZGVzW2ldOworCQlpZiAoZHNzbW9kZSA9PSBtb2RlLT5kc3Ntb2RlKSB7CisJCQlhc3NpZ25fY29sb3Jtb2RlX3RvX3Zhcih2YXIsIG1vZGUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKK3ZvaWQgc2V0X2ZiX2ZpeChzdHJ1Y3QgZmJfaW5mbyAqZmJpKQoreworCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4ID0gJmZiaS0+Zml4OworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmZiaS0+dmFyOworCXN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSA9IEZCMk9GQihmYmkpOworCXN0cnVjdCBvbWFwZmIyX21lbV9yZWdpb24gKnJnID0gJm9mYmktPnJlZ2lvbjsKKworCURCRygic2V0X2ZiX2ZpeFxuIik7CisKKwkvKiB1c2VkIGJ5IG9wZW4vd3JpdGUgaW4gZmJtZW0uYyAqLworCWZiaS0+c2NyZWVuX2Jhc2UgPSAoY2hhciBfX2lvbWVtICopb21hcGZiX2dldF9yZWdpb25fdmFkZHIob2ZiaSk7CisKKwkvKiB1c2VkIGJ5IG1tYXAgaW4gZmJtZW0uYyAqLworCWlmIChvZmJpLT5yb3RhdGlvbl90eXBlID09IE9NQVBfRFNTX1JPVF9WUkZCKSB7CisJCXN3aXRjaCAodmFyLT5ub25zdGQpIHsKKwkJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIyOgorCQljYXNlIE9NQVBGQl9DT0xPUl9ZVVk0MjI6CisJCQlmaXgtPmxpbmVfbGVuZ3RoID0KKwkJCQkoT01BUF9WUkZCX0xJTkVfTEVOICogdmFyLT5iaXRzX3Blcl9waXhlbCkgPj4gMjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZml4LT5saW5lX2xlbmd0aCA9CisJCQkJKE9NQVBfVlJGQl9MSU5FX0xFTiAqIHZhci0+Yml0c19wZXJfcGl4ZWwpID4+IDM7CisJCQlicmVhazsKKwkJfQorCisJCWZpeC0+c21lbV9sZW4gPSB2YXItPnlyZXNfdmlydHVhbCAqIGZpeC0+bGluZV9sZW5ndGg7CisJfSBlbHNlIHsKKwkJZml4LT5saW5lX2xlbmd0aCA9CisJCQkodmFyLT54cmVzX3ZpcnR1YWwgKiB2YXItPmJpdHNfcGVyX3BpeGVsKSA+PiAzOworCQlmaXgtPnNtZW1fbGVuID0gcmctPnNpemU7CisJfQorCisJZml4LT5zbWVtX3N0YXJ0ID0gb21hcGZiX2dldF9yZWdpb25fcGFkZHIob2ZiaSk7CisKKwlmaXgtPnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7CisKKwlpZiAodmFyLT5ub25zdGQpCisJCWZpeC0+dmlzdWFsID0gRkJfVklTVUFMX1BTRVVET0NPTE9SOworCWVsc2UgeworCQlzd2l0Y2ggKHZhci0+Yml0c19wZXJfcGl4ZWwpIHsKKwkJY2FzZSAzMjoKKwkJY2FzZSAyNDoKKwkJY2FzZSAxNjoKKwkJY2FzZSAxMjoKKwkJCWZpeC0+dmlzdWFsID0gRkJfVklTVUFMX1RSVUVDT0xPUjsKKwkJCS8qIDEyYnBwIGlzIHN0b3JlZCBpbiAxNiBiaXRzICovCisJCQlicmVhazsKKwkJY2FzZSAxOgorCQljYXNlIDI6CisJCWNhc2UgNDoKKwkJY2FzZSA4OgorCQkJZml4LT52aXN1YWwgPSBGQl9WSVNVQUxfUFNFVURPQ09MT1I7CisJCQlicmVhazsKKwkJfQorCX0KKworCWZpeC0+YWNjZWwgPSBGQl9BQ0NFTF9OT05FOworCisJZml4LT54cGFuc3RlcCA9IDE7CisJZml4LT55cGFuc3RlcCA9IDE7Cit9CisKKy8qIGNoZWNrIG5ldyB2YXIgYW5kIHBvc3NpYmx5IG1vZGlmeSBpdCB0byBiZSBvayAqLworaW50IGNoZWNrX2ZiX3ZhcihzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwlzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmkgPSBGQjJPRkIoZmJpKTsKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5ID0gZmIyZGlzcGxheShmYmkpOworCWVudW0gb21hcF9jb2xvcl9tb2RlIG1vZGUgPSAwOworCWludCBpOworCWludCByOworCisJREJHKCJjaGVja19mYl92YXIgJWRcbiIsIG9mYmktPmlkKTsKKworCWlmIChvZmJpLT5yZWdpb24uc2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKworCXIgPSBmYl9tb2RlX3RvX2Rzc19tb2RlKHZhciwgJm1vZGUpOworCWlmIChyKSB7CisJCURCRygiY2Fubm90IGNvbnZlcnQgdmFyIHRvIG9tYXAgZHNzIG1vZGVcbiIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgb2ZiaS0+bnVtX292ZXJsYXlzOyArK2kpIHsKKwkJaWYgKChvZmJpLT5vdmVybGF5c1tpXS0+c3VwcG9ydGVkX21vZGVzICYgbW9kZSkgPT0gMCkgeworCQkJREJHKCJpbnZhbGlkIG1vZGVcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAodmFyLT5yb3RhdGUgPCAwIHx8IHZhci0+cm90YXRlID4gMykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY2hlY2tfZmJfcmVzX2JvdW5kcyh2YXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjaGVja19mYl9zaXplKG9mYmksIHZhcikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZhci0+eHJlcyArIHZhci0+eG9mZnNldCA+IHZhci0+eHJlc192aXJ0dWFsKQorCQl2YXItPnhvZmZzZXQgPSB2YXItPnhyZXNfdmlydHVhbCAtIHZhci0+eHJlczsKKwlpZiAodmFyLT55cmVzICsgdmFyLT55b2Zmc2V0ID4gdmFyLT55cmVzX3ZpcnR1YWwpCisJCXZhci0+eW9mZnNldCA9IHZhci0+eXJlc192aXJ0dWFsIC0gdmFyLT55cmVzOworCisJREJHKCJ4cmVzID0gJWQsIHlyZXMgPSAlZCwgdnhyZXMgPSAlZCwgdnlyZXMgPSAlZFxuIiwKKwkJCXZhci0+eHJlcywgdmFyLT55cmVzLAorCQkJdmFyLT54cmVzX3ZpcnR1YWwsIHZhci0+eXJlc192aXJ0dWFsKTsKKworCXZhci0+aGVpZ2h0ICAgICAgICAgICAgID0gLTE7CisJdmFyLT53aWR0aCAgICAgICAgICAgICAgPSAtMTsKKwl2YXItPmdyYXlzY2FsZSAgICAgICAgICA9IDA7CisKKwlpZiAoZGlzcGxheSAmJiBkaXNwbGF5LT5nZXRfdGltaW5ncykgeworCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzIHRpbWluZ3M7CisJCWRpc3BsYXktPmdldF90aW1pbmdzKGRpc3BsYXksICZ0aW1pbmdzKTsKKworCQkvKiBwaXhjbG9jayBpbiBwcywgdGhlIHJlc3QgaW4gcGl4Y2xvY2sgKi8KKwkJdmFyLT5waXhjbG9jayA9IHRpbWluZ3MucGl4ZWxfY2xvY2sgIT0gMCA/CisJCQlLSFoyUElDT1ModGltaW5ncy5waXhlbF9jbG9jaykgOgorCQkJMDsKKwkJdmFyLT5sZWZ0X21hcmdpbiA9IHRpbWluZ3MuaGZwOworCQl2YXItPnJpZ2h0X21hcmdpbiA9IHRpbWluZ3MuaGJwOworCQl2YXItPnVwcGVyX21hcmdpbiA9IHRpbWluZ3MudmZwOworCQl2YXItPmxvd2VyX21hcmdpbiA9IHRpbWluZ3MudmJwOworCQl2YXItPmhzeW5jX2xlbiA9IHRpbWluZ3MuaHN3OworCQl2YXItPnZzeW5jX2xlbiA9IHRpbWluZ3MudnN3OworCX0gZWxzZSB7CisJCXZhci0+cGl4Y2xvY2sgPSAwOworCQl2YXItPmxlZnRfbWFyZ2luID0gMDsKKwkJdmFyLT5yaWdodF9tYXJnaW4gPSAwOworCQl2YXItPnVwcGVyX21hcmdpbiA9IDA7CisJCXZhci0+bG93ZXJfbWFyZ2luID0gMDsKKwkJdmFyLT5oc3luY19sZW4gPSAwOworCQl2YXItPnZzeW5jX2xlbiA9IDA7CisJfQorCisJLyogVE9ETzogZ2V0IHRoZXNlIGZyb20gcGFuZWwtPmNvbmZpZyAqLworCXZhci0+dm1vZGUgICAgICAgICAgICAgID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRDsKKwl2YXItPnN5bmMgICAgICAgICAgICAgICA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZmJkZXYgZnJhbWV3b3JrIGNhbGxiYWNrcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgb21hcGZiX29wZW4oc3RydWN0IGZiX2luZm8gKmZiaSwgaW50IHVzZXIpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3JlbGVhc2Uoc3RydWN0IGZiX2luZm8gKmZiaSwgaW50IHVzZXIpCit7CisjaWYgMAorCXN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSA9IEZCMk9GQihmYmkpOworCXN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYgPSBvZmJpLT5mYmRldjsKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5ID0gZmIyZGlzcGxheShmYmkpOworCisJREJHKCJDbG9zaW5nIGZiIHdpdGggcGxhbmUgaW5kZXggJWRcbiIsIG9mYmktPmlkKTsKKworCW9tYXBmYl9sb2NrKGZiZGV2KTsKKworCWlmIChkaXNwbGF5ICYmIGRpc3BsYXktPmdldF91cGRhdGVfbW9kZSAmJiBkaXNwbGF5LT51cGRhdGUpIHsKKwkJLyogWFhYIHRoaXMgdXBkYXRlIHNob3VsZCBiZSByZW1vdmVkLCBJIHRoaW5rLiBCdXQgaXQncworCQkgKiBnb29kIGZvciBkZWJ1Z2dpbmcgKi8KKwkJaWYgKGRpc3BsYXktPmdldF91cGRhdGVfbW9kZShkaXNwbGF5KSA9PQorCQkJCU9NQVBfRFNTX1VQREFURV9NQU5VQUwpIHsKKwkJCXUxNiB3LCBoOworCisJCQlpZiAoZGlzcGxheS0+c3luYykKKwkJCQlkaXNwbGF5LT5zeW5jKGRpc3BsYXkpOworCisJCQlkaXNwbGF5LT5nZXRfcmVzb2x1dGlvbihkaXNwbGF5LCAmdywgJmgpOworCQkJZGlzcGxheS0+dXBkYXRlKGRpc3BsYXksIDAsIDAsIHcsIGgpOworCQl9CisJfQorCisJaWYgKGRpc3BsYXkgJiYgZGlzcGxheS0+c3luYykKKwkJZGlzcGxheS0+c3luYyhkaXNwbGF5KTsKKworCW9tYXBmYl91bmxvY2soZmJkZXYpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjYWxjX3JvdGF0aW9uX29mZnNldF9kbWEoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4LCBpbnQgcm90YXRpb24pCit7CisJdW5zaWduZWQgb2Zmc2V0OworCisJb2Zmc2V0ID0gdmFyLT55b2Zmc2V0ICogZml4LT5saW5lX2xlbmd0aCArCisJCXZhci0+eG9mZnNldCAqICh2YXItPmJpdHNfcGVyX3BpeGVsID4+IDMpOworCisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNhbGNfcm90YXRpb25fb2Zmc2V0X3ZyZmIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4LCBpbnQgcm90YXRpb24pCit7CisJdW5zaWduZWQgb2Zmc2V0OworCisJaWYgKHJvdGF0aW9uID09IEZCX1JPVEFURV9VRCkKKwkJb2Zmc2V0ID0gKHZhci0+eXJlc192aXJ0dWFsIC0gdmFyLT55cmVzKSAqCisJCQlmaXgtPmxpbmVfbGVuZ3RoOworCWVsc2UgaWYgKHJvdGF0aW9uID09IEZCX1JPVEFURV9DVykKKwkJb2Zmc2V0ID0gKHZhci0+eXJlc192aXJ0dWFsIC0gdmFyLT55cmVzKSAqCisJCQkodmFyLT5iaXRzX3Blcl9waXhlbCA+PiAzKTsKKwllbHNlCisJCW9mZnNldCA9IDA7CisKKwlpZiAocm90YXRpb24gPT0gRkJfUk9UQVRFX1VSKQorCQlvZmZzZXQgKz0gdmFyLT55b2Zmc2V0ICogZml4LT5saW5lX2xlbmd0aCArCisJCQl2YXItPnhvZmZzZXQgKiAodmFyLT5iaXRzX3Blcl9waXhlbCA+PiAzKTsKKwllbHNlIGlmIChyb3RhdGlvbiA9PSBGQl9ST1RBVEVfVUQpCisJCW9mZnNldCAtPSB2YXItPnlvZmZzZXQgKiBmaXgtPmxpbmVfbGVuZ3RoICsKKwkJCXZhci0+eG9mZnNldCAqICh2YXItPmJpdHNfcGVyX3BpeGVsID4+IDMpOworCWVsc2UgaWYgKHJvdGF0aW9uID09IEZCX1JPVEFURV9DVykKKwkJb2Zmc2V0IC09IHZhci0+eG9mZnNldCAqIGZpeC0+bGluZV9sZW5ndGggKworCQkJdmFyLT55b2Zmc2V0ICogKHZhci0+Yml0c19wZXJfcGl4ZWwgPj4gMyk7CisJZWxzZSBpZiAocm90YXRpb24gPT0gRkJfUk9UQVRFX0NDVykKKwkJb2Zmc2V0ICs9IHZhci0+eG9mZnNldCAqIGZpeC0+bGluZV9sZW5ndGggKworCQkJdmFyLT55b2Zmc2V0ICogKHZhci0+Yml0c19wZXJfcGl4ZWwgPj4gMyk7CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCisKKy8qIHNldHVwIG92ZXJsYXkgYWNjb3JkaW5nIHRvIHRoZSBmYiAqLworc3RhdGljIGludCBvbWFwZmJfc2V0dXBfb3ZlcmxheShzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwsCisJCXUxNiBwb3N4LCB1MTYgcG9zeSwgdTE2IG91dHcsIHUxNiBvdXRoKQoreworCWludCByID0gMDsKKwlzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmkgPSBGQjJPRkIoZmJpKTsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZmYmktPnZhcjsKKwlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCA9ICZmYmktPmZpeDsKKwllbnVtIG9tYXBfY29sb3JfbW9kZSBtb2RlID0gMDsKKwlpbnQgb2Zmc2V0OworCXUzMiBkYXRhX3N0YXJ0X3A7CisJdm9pZCBfX2lvbWVtICpkYXRhX3N0YXJ0X3Y7CisJc3RydWN0IG9tYXBfb3ZlcmxheV9pbmZvIGluZm87CisJaW50IHhyZXMsIHlyZXM7CisJaW50IHNjcmVlbl93aWR0aDsKKwlpbnQgbWlycm9yOworCWludCByb3RhdGlvbiA9IHZhci0+cm90YXRlOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG9mYmktPm51bV9vdmVybGF5czsgaSsrKSB7CisJCWlmIChvdmwgIT0gb2ZiaS0+b3ZlcmxheXNbaV0pCisJCQljb250aW51ZTsKKworCQlyb3RhdGlvbiA9IChyb3RhdGlvbiArIG9mYmktPnJvdGF0aW9uW2ldKSAlIDQ7CisJCWJyZWFrOworCX0KKworCURCRygic2V0dXBfb3ZlcmxheSAlZCwgcG9zeCAlZCwgcG9zeSAlZCwgb3V0dyAlZCwgb3V0aCAlZFxuIiwgb2ZiaS0+aWQsCisJCQlwb3N4LCBwb3N5LCBvdXR3LCBvdXRoKTsKKworCWlmIChyb3RhdGlvbiA9PSBGQl9ST1RBVEVfQ1cgfHwgcm90YXRpb24gPT0gRkJfUk9UQVRFX0NDVykgeworCQl4cmVzID0gdmFyLT55cmVzOworCQl5cmVzID0gdmFyLT54cmVzOworCX0gZWxzZSB7CisJCXhyZXMgPSB2YXItPnhyZXM7CisJCXlyZXMgPSB2YXItPnlyZXM7CisJfQorCisKKwlpZiAob2ZiaS0+cm90YXRpb25fdHlwZSA9PSBPTUFQX0RTU19ST1RfVlJGQikgeworCQlkYXRhX3N0YXJ0X3AgPSBvbWFwZmJfZ2V0X3JlZ2lvbl9yb3RfcGFkZHIob2ZiaSwgcm90YXRpb24pOworCQlkYXRhX3N0YXJ0X3YgPSBOVUxMOworCX0gZWxzZSB7CisJCWRhdGFfc3RhcnRfcCA9IG9tYXBmYl9nZXRfcmVnaW9uX3BhZGRyKG9mYmkpOworCQlkYXRhX3N0YXJ0X3YgPSBvbWFwZmJfZ2V0X3JlZ2lvbl92YWRkcihvZmJpKTsKKwl9CisKKwlpZiAob2ZiaS0+cm90YXRpb25fdHlwZSA9PSBPTUFQX0RTU19ST1RfVlJGQikKKwkJb2Zmc2V0ID0gY2FsY19yb3RhdGlvbl9vZmZzZXRfdnJmYih2YXIsIGZpeCwgcm90YXRpb24pOworCWVsc2UKKwkJb2Zmc2V0ID0gY2FsY19yb3RhdGlvbl9vZmZzZXRfZG1hKHZhciwgZml4LCByb3RhdGlvbik7CisKKwlkYXRhX3N0YXJ0X3AgKz0gb2Zmc2V0OworCWRhdGFfc3RhcnRfdiArPSBvZmZzZXQ7CisKKwlpZiAob2Zmc2V0KQorCQlEQkcoIm9mZnNldCAlZCwgJWQgPSAlZFxuIiwKKwkJCQl2YXItPnhvZmZzZXQsIHZhci0+eW9mZnNldCwgb2Zmc2V0KTsKKworCURCRygicGFkZHIgJXgsIHZhZGRyICVwXG4iLCBkYXRhX3N0YXJ0X3AsIGRhdGFfc3RhcnRfdik7CisKKwlyID0gZmJfbW9kZV90b19kc3NfbW9kZSh2YXIsICZtb2RlKTsKKwlpZiAocikgeworCQlEQkcoImZiX21vZGVfdG9fZHNzX21vZGUgZmFpbGVkIik7CisJCWdvdG8gZXJyOworCX0KKworCXN3aXRjaCAodmFyLT5ub25zdGQpIHsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjI6CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVZNDIyOgorCQlpZiAob2ZiaS0+cm90YXRpb25fdHlwZSA9PSBPTUFQX0RTU19ST1RfVlJGQikgeworCQkJc2NyZWVuX3dpZHRoID0gZml4LT5saW5lX2xlbmd0aAorCQkJCS8gKHZhci0+Yml0c19wZXJfcGl4ZWwgPj4gMik7CisJCQlicmVhazsKKwkJfQorCWRlZmF1bHQ6CisJCXNjcmVlbl93aWR0aCA9IGZpeC0+bGluZV9sZW5ndGggLyAodmFyLT5iaXRzX3Blcl9waXhlbCA+PiAzKTsKKwkJYnJlYWs7CisJfQorCisJb3ZsLT5nZXRfb3ZlcmxheV9pbmZvKG92bCwgJmluZm8pOworCisJaWYgKG9mYmktPnJvdGF0aW9uX3R5cGUgPT0gT01BUF9EU1NfUk9UX1ZSRkIpCisJCW1pcnJvciA9IDA7CisJZWxzZQorCQltaXJyb3IgPSBvZmJpLT5taXJyb3I7CisKKwlpbmZvLnBhZGRyID0gZGF0YV9zdGFydF9wOworCWluZm8udmFkZHIgPSBkYXRhX3N0YXJ0X3Y7CisJaW5mby5zY3JlZW5fd2lkdGggPSBzY3JlZW5fd2lkdGg7CisJaW5mby53aWR0aCA9IHhyZXM7CisJaW5mby5oZWlnaHQgPSB5cmVzOworCWluZm8uY29sb3JfbW9kZSA9IG1vZGU7CisJaW5mby5yb3RhdGlvbl90eXBlID0gb2ZiaS0+cm90YXRpb25fdHlwZTsKKwlpbmZvLnJvdGF0aW9uID0gcm90YXRpb247CisJaW5mby5taXJyb3IgPSBtaXJyb3I7CisKKwlpbmZvLnBvc194ID0gcG9zeDsKKwlpbmZvLnBvc195ID0gcG9zeTsKKwlpbmZvLm91dF93aWR0aCA9IG91dHc7CisJaW5mby5vdXRfaGVpZ2h0ID0gb3V0aDsKKworCXIgPSBvdmwtPnNldF9vdmVybGF5X2luZm8ob3ZsLCAmaW5mbyk7CisJaWYgKHIpIHsKKwkJREJHKCJvdmwtPnNldHVwX292ZXJsYXlfaW5mbyBmYWlsZWRcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyOgorCURCRygic2V0dXBfb3ZlcmxheSBmYWlsZWRcbiIpOworCXJldHVybiByOworfQorCisvKiBhcHBseSB2YXIgdG8gdGhlIG92ZXJsYXkgKi8KK2ludCBvbWFwZmJfYXBwbHlfY2hhbmdlcyhzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBpbnQgaW5pdCkKK3sKKwlpbnQgciA9IDA7CisJc3RydWN0IG9tYXBmYl9pbmZvICpvZmJpID0gRkIyT0ZCKGZiaSk7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmZmJpLT52YXI7CisJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsOworCXUxNiBwb3N4LCBwb3N5OworCXUxNiBvdXR3LCBvdXRoOworCWludCBpOworCisjaWZkZWYgREVCVUcKKwlpZiAob21hcGZiX3Rlc3RfcGF0dGVybikKKwkJZmlsbF9mYihmYmkpOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgb2ZiaS0+bnVtX292ZXJsYXlzOyBpKyspIHsKKwkJb3ZsID0gb2ZiaS0+b3ZlcmxheXNbaV07CisKKwkJREJHKCJhcHBseV9jaGFuZ2VzLCBmYiAlZCwgb3ZsICVkXG4iLCBvZmJpLT5pZCwgb3ZsLT5pZCk7CisKKwkJaWYgKG9mYmktPnJlZ2lvbi5zaXplID09IDApIHsKKwkJCS8qIHRoZSBmYiBpcyBub3QgYXZhaWxhYmxlLiBkaXNhYmxlIHRoZSBvdmVybGF5ICovCisJCQlvbWFwZmJfb3ZlcmxheV9lbmFibGUob3ZsLCAwKTsKKwkJCWlmICghaW5pdCAmJiBvdmwtPm1hbmFnZXIpCisJCQkJb3ZsLT5tYW5hZ2VyLT5hcHBseShvdmwtPm1hbmFnZXIpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoaW5pdCB8fCAob3ZsLT5jYXBzICYgT01BUF9EU1NfT1ZMX0NBUF9TQ0FMRSkgPT0gMCkgeworCQkJaW50IHJvdGF0aW9uID0gKHZhci0+cm90YXRlICsgb2ZiaS0+cm90YXRpb25baV0pICUgNDsKKwkJCWlmIChyb3RhdGlvbiA9PSBGQl9ST1RBVEVfQ1cgfHwKKwkJCQkJcm90YXRpb24gPT0gRkJfUk9UQVRFX0NDVykgeworCQkJCW91dHcgPSB2YXItPnlyZXM7CisJCQkJb3V0aCA9IHZhci0+eHJlczsKKwkJCX0gZWxzZSB7CisJCQkJb3V0dyA9IHZhci0+eHJlczsKKwkJCQlvdXRoID0gdmFyLT55cmVzOworCQkJfQorCQl9IGVsc2UgeworCQkJb3V0dyA9IG92bC0+aW5mby5vdXRfd2lkdGg7CisJCQlvdXRoID0gb3ZsLT5pbmZvLm91dF9oZWlnaHQ7CisJCX0KKworCQlpZiAoaW5pdCkgeworCQkJcG9zeCA9IDA7CisJCQlwb3N5ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXBvc3ggPSBvdmwtPmluZm8ucG9zX3g7CisJCQlwb3N5ID0gb3ZsLT5pbmZvLnBvc195OworCQl9CisKKwkJciA9IG9tYXBmYl9zZXR1cF9vdmVybGF5KGZiaSwgb3ZsLCBwb3N4LCBwb3N5LCBvdXR3LCBvdXRoKTsKKwkJaWYgKHIpCisJCQlnb3RvIGVycjsKKworCQlpZiAoIWluaXQgJiYgb3ZsLT5tYW5hZ2VyKQorCQkJb3ZsLT5tYW5hZ2VyLT5hcHBseShvdmwtPm1hbmFnZXIpOworCX0KKwlyZXR1cm4gMDsKK2VycjoKKwlEQkcoImFwcGx5X2NoYW5nZXMgZmFpbGVkXG4iKTsKKwlyZXR1cm4gcjsKK30KKworLyogY2hlY2tzIHZhciBhbmQgZXZlbnR1YWxseSB0d2Vha3MgaXQgdG8gc29tZXRoaW5nIHN1cHBvcnRlZCwKKyAqIERPIE5PVCBNT0RJRlkgUEFSICovCitzdGF0aWMgaW50IG9tYXBmYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJaW50IHI7CisKKwlEQkcoImNoZWNrX3ZhciglZClcbiIsIEZCMk9GQihmYmkpLT5pZCk7CisKKwlyID0gY2hlY2tfZmJfdmFyKGZiaSwgdmFyKTsKKworCXJldHVybiByOworfQorCisvKiBzZXQgdGhlIHZpZGVvIG1vZGUgYWNjb3JkaW5nIHRvIGluZm8tPnZhciAqLworc3RhdGljIGludCBvbWFwZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqZmJpKQoreworCWludCByOworCisJREJHKCJzZXRfcGFyKCVkKVxuIiwgRkIyT0ZCKGZiaSktPmlkKTsKKworCXNldF9mYl9maXgoZmJpKTsKKworCXIgPSBzZXR1cF92cmZiX3JvdGF0aW9uKGZiaSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IG9tYXBmYl9hcHBseV9jaGFuZ2VzKGZiaSwgMCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBvbWFwZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCXN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIG5ld192YXI7CisJaW50IHI7CisKKwlEQkcoInBhbl9kaXNwbGF5KCVkKVxuIiwgRkIyT0ZCKGZiaSktPmlkKTsKKworCWlmICh2YXItPnhvZmZzZXQgPT0gZmJpLT52YXIueG9mZnNldCAmJgorCSAgICB2YXItPnlvZmZzZXQgPT0gZmJpLT52YXIueW9mZnNldCkKKwkJcmV0dXJuIDA7CisKKwluZXdfdmFyID0gZmJpLT52YXI7CisJbmV3X3Zhci54b2Zmc2V0ID0gdmFyLT54b2Zmc2V0OworCW5ld192YXIueW9mZnNldCA9IHZhci0+eW9mZnNldDsKKworCWZiaS0+dmFyID0gbmV3X3ZhcjsKKworCXIgPSBvbWFwZmJfYXBwbHlfY2hhbmdlcyhmYmksIDApOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIG1tYXBfdXNlcl9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSA9IChzdHJ1Y3Qgb21hcGZiX2luZm8gKil2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKworCWF0b21pY19pbmMoJm9mYmktPm1hcF9jb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIG1tYXBfdXNlcl9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmkgPSAoc3RydWN0IG9tYXBmYl9pbmZvICopdm1hLT52bV9wcml2YXRlX2RhdGE7CisKKwlhdG9taWNfZGVjKCZvZmJpLT5tYXBfY291bnQpOworfQorCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IG1tYXBfdXNlcl9vcHMgPSB7CisJLm9wZW4gPSBtbWFwX3VzZXJfb3BlbiwKKwkuY2xvc2UgPSBtbWFwX3VzZXJfY2xvc2UsCit9OworCitzdGF0aWMgaW50IG9tYXBmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICpmYmksIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSA9IEZCMk9GQihmYmkpOworCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4ID0gJmZiaS0+Zml4OworCXVuc2lnbmVkIGxvbmcgb2ZmOworCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJdTMyIGxlbjsKKworCWlmICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKHZtYS0+dm1fcGdvZmYgPiAofjBVTCA+PiBQQUdFX1NISUZUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJb2ZmID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCisJc3RhcnQgPSBvbWFwZmJfZ2V0X3JlZ2lvbl9wYWRkcihvZmJpKTsKKwlsZW4gPSBmaXgtPnNtZW1fbGVuOworCWlmIChvZmYgPj0gbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCArIG9mZikgPiBsZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJb2ZmICs9IHN0YXJ0OworCisJREJHKCJ1c2VyIG1tYXAgcmVnaW9uIHN0YXJ0ICVseCwgbGVuICVkLCBvZmYgJWx4XG4iLCBzdGFydCwgbGVuLCBvZmYpOworCisJdm1hLT52bV9wZ29mZiA9IG9mZiA+PiBQQUdFX1NISUZUOworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU8gfCBWTV9SRVNFUlZFRDsKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF93cml0ZWNvbWJpbmUodm1hLT52bV9wYWdlX3Byb3QpOworCXZtYS0+dm1fb3BzID0gJm1tYXBfdXNlcl9vcHM7CisJdm1hLT52bV9wcml2YXRlX2RhdGEgPSBvZmJpOworCWlmIChpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCBvZmYgPj4gUEFHRV9TSElGVCwKKwkJCSAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCkpCisJCXJldHVybiAtRUFHQUlOOworCS8qIHZtX29wcy5vcGVuIHdvbid0IGJlIGNhbGxlZCBmb3IgbW1hcCBpdHNlbGYuICovCisJYXRvbWljX2luYygmb2ZiaS0+bWFwX2NvdW50KTsKKwlyZXR1cm4gMDsKK30KKworLyogU3RvcmUgYSBzaW5nbGUgY29sb3IgcGFsZXR0ZSBlbnRyeSBpbnRvIGEgcHNldWRvIHBhbGV0dGUgb3IgdGhlIGhhcmR3YXJlCisgKiBwYWxldHRlIGlmIG9uZSBpcyBhdmFpbGFibGUuIEZvciBub3cgd2Ugc3VwcG9ydCBvbmx5IDE2YnBwIGFuZCB0aHVzIHN0b3JlCisgKiB0aGUgZW50cnkgb25seSB0byB0aGUgcHNldWRvIHBhbGV0dGUuCisgKi8KK3N0YXRpYyBpbnQgX3NldGNvbHJlZyhzdHJ1Y3QgZmJfaW5mbyAqZmJpLCB1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwKKwkJdV9pbnQgYmx1ZSwgdV9pbnQgdHJhbnNwLCBpbnQgdXBkYXRlX2h3X3BhbCkKK3sKKwkvKnN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSA9IEZCMk9GQihmYmkpOyovCisJLypzdHJ1Y3Qgb21hcGZiMl9kZXZpY2UgKmZiZGV2ID0gb2ZiaS0+ZmJkZXY7Ki8KKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZmYmktPnZhcjsKKwlpbnQgciA9IDA7CisKKwllbnVtIG9tYXBmYl9jb2xvcl9mb3JtYXQgbW9kZSA9IE9NQVBGQl9DT0xPUl9SR0IyNFU7IC8qIFhYWCAqLworCisJLypzd2l0Y2ggKHBsYW5lLT5jb2xvcl9tb2RlKSB7Ki8KKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjI6CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIwOgorCWNhc2UgT01BUEZCX0NPTE9SX1lVWTQyMjoKKwkJciA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX0NMVVRfOEJQUDoKKwljYXNlIE9NQVBGQl9DT0xPUl9DTFVUXzRCUFA6CisJY2FzZSBPTUFQRkJfQ09MT1JfQ0xVVF8yQlBQOgorCWNhc2UgT01BUEZCX0NPTE9SX0NMVVRfMUJQUDoKKwkJLyoKKwkJICAgaWYgKGZiZGV2LT5jdHJsLT5zZXRjb2xyZWcpCisJCSAgIHIgPSBmYmRldi0+Y3RybC0+c2V0Y29scmVnKHJlZ25vLCByZWQsIGdyZWVuLCBibHVlLAorCQkgICB0cmFuc3AsIHVwZGF0ZV9od19wYWwpOworCQkgICAqLworCQkvKiBGYWxsdGhyb3VnaCAqLworCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfUkdCNTY1OgorCWNhc2UgT01BUEZCX0NPTE9SX1JHQjQ0NDoKKwljYXNlIE9NQVBGQl9DT0xPUl9SR0IyNFA6CisJY2FzZSBPTUFQRkJfQ09MT1JfUkdCMjRVOgorCQlpZiAociAhPSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKHJlZ25vIDwgMCkgeworCQkJciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChyZWdubyA8IDE2KSB7CisJCQl1MTYgcGFsOworCQkJcGFsID0gKChyZWQgPj4gKDE2IC0gdmFyLT5yZWQubGVuZ3RoKSkgPDwKKwkJCQkJdmFyLT5yZWQub2Zmc2V0KSB8CisJCQkJKChncmVlbiA+PiAoMTYgLSB2YXItPmdyZWVuLmxlbmd0aCkpIDw8CisJCQkJIHZhci0+Z3JlZW4ub2Zmc2V0KSB8CisJCQkJKGJsdWUgPj4gKDE2IC0gdmFyLT5ibHVlLmxlbmd0aCkpOworCQkJKCh1MzIgKikoZmJpLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9IHBhbDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3NldGNvbHJlZyh1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwgdV9pbnQgYmx1ZSwKKwkJdV9pbnQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlEQkcoInNldGNvbHJlZ1xuIik7CisKKwlyZXR1cm4gX3NldGNvbHJlZyhpbmZvLCByZWdubywgcmVkLCBncmVlbiwgYmx1ZSwgdHJhbnNwLCAxKTsKK30KKworc3RhdGljIGludCBvbWFwZmJfc2V0Y21hcChzdHJ1Y3QgZmJfY21hcCAqY21hcCwgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJaW50IGNvdW50LCBpbmRleCwgcjsKKwl1MTYgKnJlZCwgKmdyZWVuLCAqYmx1ZSwgKnRyYW5zcDsKKwl1MTYgdHJhbnMgPSAweGZmZmY7CisKKwlEQkcoInNldGNtYXBcbiIpOworCisJcmVkICAgICA9IGNtYXAtPnJlZDsKKwlncmVlbiAgID0gY21hcC0+Z3JlZW47CisJYmx1ZSAgICA9IGNtYXAtPmJsdWU7CisJdHJhbnNwICA9IGNtYXAtPnRyYW5zcDsKKwlpbmRleCAgID0gY21hcC0+c3RhcnQ7CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBjbWFwLT5sZW47IGNvdW50KyspIHsKKwkJaWYgKHRyYW5zcCkKKwkJCXRyYW5zID0gKnRyYW5zcCsrOworCQlyID0gX3NldGNvbHJlZyhpbmZvLCBpbmRleCsrLCAqcmVkKyssICpncmVlbisrLCAqYmx1ZSsrLCB0cmFucywKKwkJCQljb3VudCA9PSBjbWFwLT5sZW4gLSAxKTsKKwkJaWYgKHIgIT0gMCkKKwkJCXJldHVybiByOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJc3RydWN0IG9tYXBmYl9pbmZvICpvZmJpID0gRkIyT0ZCKGZiaSk7CisJc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldiA9IG9mYmktPmZiZGV2OworCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRpc3BsYXkgPSBmYjJkaXNwbGF5KGZiaSk7CisJaW50IGRvX3VwZGF0ZSA9IDA7CisJaW50IHIgPSAwOworCisJb21hcGZiX2xvY2soZmJkZXYpOworCisJc3dpdGNoIChibGFuaykgeworCWNhc2UgRkJfQkxBTktfVU5CTEFOSzoKKwkJaWYgKGRpc3BsYXktPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEKQorCQkJZ290byBleGl0OworCisJCWlmIChkaXNwbGF5LT5yZXN1bWUpCisJCQlyID0gZGlzcGxheS0+cmVzdW1lKGRpc3BsYXkpOworCisJCWlmIChyID09IDAgJiYgZGlzcGxheS0+Z2V0X3VwZGF0ZV9tb2RlICYmCisJCQkJZGlzcGxheS0+Z2V0X3VwZGF0ZV9tb2RlKGRpc3BsYXkpID09CisJCQkJT01BUF9EU1NfVVBEQVRFX01BTlVBTCkKKwkJCWRvX3VwZGF0ZSA9IDE7CisKKwkJYnJlYWs7CisKKwljYXNlIEZCX0JMQU5LX05PUk1BTDoKKwkJLyogRkJfQkxBTktfTk9STUFMIGNvdWxkIGJlIGltcGxlbWVudGVkLgorCQkgKiBOZWVkcyBEU1MgYWRkaXRpb25zLiAqLworCWNhc2UgRkJfQkxBTktfVlNZTkNfU1VTUEVORDoKKwljYXNlIEZCX0JMQU5LX0hTWU5DX1NVU1BFTkQ6CisJY2FzZSBGQl9CTEFOS19QT1dFUkRPV046CisJCWlmIChkaXNwbGF5LT5zdGF0ZSAhPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkKKwkJCWdvdG8gZXhpdDsKKworCQlpZiAoZGlzcGxheS0+c3VzcGVuZCkKKwkJCXIgPSBkaXNwbGF5LT5zdXNwZW5kKGRpc3BsYXkpOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJciA9IC1FSU5WQUw7CisJfQorCitleGl0OgorCW9tYXBmYl91bmxvY2soZmJkZXYpOworCisJaWYgKHIgPT0gMCAmJiBkb191cGRhdGUgJiYgZGlzcGxheS0+dXBkYXRlKSB7CisJCXUxNiB3LCBoOworCQlkaXNwbGF5LT5nZXRfcmVzb2x1dGlvbihkaXNwbGF5LCAmdywgJmgpOworCisJCXIgPSBkaXNwbGF5LT51cGRhdGUoZGlzcGxheSwgMCwgMCwgdywgaCk7CisJfQorCisJcmV0dXJuIHI7Cit9CisKKyNpZiAwCisvKiBYWFggZmJfcmVhZCBhbmQgZmJfd3JpdGUgYXJlIG5lZWRlZCBmb3IgVlJGQiAqLworc3NpemVfdCBvbWFwZmJfd3JpdGUoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCURCRygib21hcGZiX3dyaXRlICVkLCAlbHVcbiIsIGNvdW50LCAodW5zaWduZWQgbG9uZykqcHBvcyk7CisJLyogWFhYIG5lZWRlZCBmb3IgVlJGQiAqLworCXJldHVybiBjb3VudDsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGZiX29wcyBvbWFwZmJfb3BzID0geworCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5mYl9vcGVuICAgICAgICA9IG9tYXBmYl9vcGVuLAorCS5mYl9yZWxlYXNlICAgICA9IG9tYXBmYl9yZWxlYXNlLAorCS5mYl9maWxscmVjdCAgICA9IGNmYl9maWxscmVjdCwKKwkuZmJfY29weWFyZWEgICAgPSBjZmJfY29weWFyZWEsCisJLmZiX2ltYWdlYmxpdCAgID0gY2ZiX2ltYWdlYmxpdCwKKwkuZmJfYmxhbmsgICAgICAgPSBvbWFwZmJfYmxhbmssCisJLmZiX2lvY3RsICAgICAgID0gb21hcGZiX2lvY3RsLAorCS5mYl9jaGVja192YXIgICA9IG9tYXBmYl9jaGVja192YXIsCisJLmZiX3NldF9wYXIgICAgID0gb21hcGZiX3NldF9wYXIsCisJLmZiX3Bhbl9kaXNwbGF5ID0gb21hcGZiX3Bhbl9kaXNwbGF5LAorCS5mYl9tbWFwCT0gb21hcGZiX21tYXAsCisJLmZiX3NldGNvbHJlZwk9IG9tYXBmYl9zZXRjb2xyZWcsCisJLmZiX3NldGNtYXAJPSBvbWFwZmJfc2V0Y21hcCwKKwkvKi5mYl93cml0ZQk9IG9tYXBmYl93cml0ZSwqLworfTsKKworc3RhdGljIHZvaWQgb21hcGZiX2ZyZWVfZmJtZW0oc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmkgPSBGQjJPRkIoZmJpKTsKKwlzdHJ1Y3Qgb21hcGZiMl9kZXZpY2UgKmZiZGV2ID0gb2ZiaS0+ZmJkZXY7CisJc3RydWN0IG9tYXBmYjJfbWVtX3JlZ2lvbiAqcmc7CisKKwlyZyA9ICZvZmJpLT5yZWdpb247CisKKwlpZiAocmctPnBhZGRyKQorCQlpZiAob21hcF92cmFtX2ZyZWUocmctPnBhZGRyLCByZy0+c2l6ZSkpCisJCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJWUkFNIEZSRUUgZmFpbGVkXG4iKTsKKworCWlmIChyZy0+dmFkZHIpCisJCWlvdW5tYXAocmctPnZhZGRyKTsKKworCWlmIChvZmJpLT5yb3RhdGlvbl90eXBlID09IE9NQVBfRFNTX1JPVF9WUkZCKSB7CisJCS8qIHVubWFwIHRoZSAwIGFuZ2xlIHJvdGF0aW9uICovCisJCWlmIChyZy0+dnJmYi52YWRkclswXSkgeworCQkJaW91bm1hcChyZy0+dnJmYi52YWRkclswXSk7CisJCQlvbWFwX3ZyZmJfcmVsZWFzZV9jdHgoJnJnLT52cmZiKTsKKwkJfQorCX0KKworCXJnLT52YWRkciA9IE5VTEw7CisJcmctPnBhZGRyID0gMDsKKwlyZy0+YWxsb2MgPSAwOworCXJnLT5zaXplID0gMDsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfZmJfaW5mbyhzdHJ1Y3QgZmJfaW5mbyAqZmJpKQoreworCW1lbXNldCgmZmJpLT52YXIsIDAsIHNpemVvZihmYmktPnZhcikpOworCW1lbXNldCgmZmJpLT5maXgsIDAsIHNpemVvZihmYmktPmZpeCkpOworCXN0cmxjcHkoZmJpLT5maXguaWQsIE1PRFVMRV9OQU1FLCBzaXplb2YoZmJpLT5maXguaWQpKTsKK30KKworc3RhdGljIGludCBvbWFwZmJfZnJlZV9hbGxfZmJtZW0oc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldikKK3sKKwlpbnQgaTsKKworCURCRygiZnJlZSBhbGwgZmJtZW1cbiIpOworCisJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5udW1fZmJzOyBpKyspIHsKKwkJc3RydWN0IGZiX2luZm8gKmZiaSA9IGZiZGV2LT5mYnNbaV07CisJCW9tYXBmYl9mcmVlX2ZibWVtKGZiaSk7CisJCWNsZWFyX2ZiX2luZm8oZmJpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwZmJfYWxsb2NfZmJtZW0oc3RydWN0IGZiX2luZm8gKmZiaSwgdW5zaWduZWQgbG9uZyBzaXplLAorCQl1bnNpZ25lZCBsb25nIHBhZGRyKQoreworCXN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSA9IEZCMk9GQihmYmkpOworCXN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYgPSBvZmJpLT5mYmRldjsKKwlzdHJ1Y3Qgb21hcGZiMl9tZW1fcmVnaW9uICpyZzsKKwl2b2lkIF9faW9tZW0gKnZhZGRyOworCWludCByOworCisJcmcgPSAmb2ZiaS0+cmVnaW9uOworCW1lbXNldChyZywgMCwgc2l6ZW9mKCpyZykpOworCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisKKwlpZiAoIXBhZGRyKSB7CisJCURCRygiYWxsb2NhdGluZyAlbHUgYnl0ZXMgZm9yIGZiICVkXG4iLCBzaXplLCBvZmJpLT5pZCk7CisJCXIgPSBvbWFwX3ZyYW1fYWxsb2MoT01BUF9WUkFNX01FTVRZUEVfU0RSQU0sIHNpemUsICZwYWRkcik7CisJfSBlbHNlIHsKKwkJREJHKCJyZXNlcnZpbmcgJWx1IGJ5dGVzIGF0ICVseCBmb3IgZmIgJWRcbiIsIHNpemUsIHBhZGRyLAorCQkJCW9mYmktPmlkKTsKKwkJciA9IG9tYXBfdnJhbV9yZXNlcnZlKHBhZGRyLCBzaXplKTsKKwl9CisKKwlpZiAocikgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgZnJhbWVidWZmZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAob2ZiaS0+cm90YXRpb25fdHlwZSAhPSBPTUFQX0RTU19ST1RfVlJGQikgeworCQl2YWRkciA9IGlvcmVtYXBfd2MocGFkZHIsIHNpemUpOworCisJCWlmICghdmFkZHIpIHsKKwkJCWRldl9lcnIoZmJkZXYtPmRldiwgImZhaWxlZCB0byBpb3JlbWFwIGZyYW1lYnVmZmVyXG4iKTsKKwkJCW9tYXBfdnJhbV9mcmVlKHBhZGRyLCBzaXplKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJREJHKCJhbGxvY2F0ZWQgVlJBTSBwYWRkciAlbHgsIHZhZGRyICVwXG4iLCBwYWRkciwgdmFkZHIpOworCX0gZWxzZSB7CisJCXIgPSBvbWFwX3ZyZmJfcmVxdWVzdF9jdHgoJnJnLT52cmZiKTsKKwkJaWYgKHIpIHsKKwkJCWRldl9lcnIoZmJkZXYtPmRldiwgInZyZmIgY3JlYXRlIGN0eCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIHI7CisJCX0KKworCQl2YWRkciA9IE5VTEw7CisJfQorCisJcmctPnBhZGRyID0gcGFkZHI7CisJcmctPnZhZGRyID0gdmFkZHI7CisJcmctPnNpemUgPSBzaXplOworCXJnLT5hbGxvYyA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogYWxsb2NhdGUgZmJtZW0gdXNpbmcgZGlzcGxheSByZXNvbHV0aW9uIGFzIHJlZmVyZW5jZSAqLworc3RhdGljIGludCBvbWFwZmJfYWxsb2NfZmJtZW1fZGlzcGxheShzdHJ1Y3QgZmJfaW5mbyAqZmJpLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCXVuc2lnbmVkIGxvbmcgcGFkZHIpCit7CisJc3RydWN0IG9tYXBmYl9pbmZvICpvZmJpID0gRkIyT0ZCKGZiaSk7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheTsKKwlpbnQgYnl0ZXNwcDsKKworCWRpc3BsYXkgPSAgZmIyZGlzcGxheShmYmkpOworCisJaWYgKCFkaXNwbGF5KQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoZGlzcGxheS0+Z2V0X3JlY29tbWVuZGVkX2JwcChkaXNwbGF5KSkgeworCWNhc2UgMTY6CisJCWJ5dGVzcHAgPSAyOworCQlicmVhazsKKwljYXNlIDI0OgorCQlieXRlc3BwID0gNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnl0ZXNwcCA9IDQ7CisJCWJyZWFrOworCX0KKworCWlmICghc2l6ZSkgeworCQl1MTYgdywgaDsKKworCQlkaXNwbGF5LT5nZXRfcmVzb2x1dGlvbihkaXNwbGF5LCAmdywgJmgpOworCisJCWlmIChvZmJpLT5yb3RhdGlvbl90eXBlID09IE9NQVBfRFNTX1JPVF9WUkZCKSB7CisJCQlzaXplID0gbWF4KG9tYXBfdnJmYl9taW5fcGh5c19zaXplKHcsIGgsIGJ5dGVzcHApLAorCQkJCQlvbWFwX3ZyZmJfbWluX3BoeXNfc2l6ZShoLCB3LCBieXRlc3BwKSk7CisKKwkJCURCRygiYWRqdXN0aW5nIGZiIG1lbSBzaXplIGZvciBWUkZCLCAldSAtPiAlbHVcbiIsCisJCQkJCXcgKiBoICogYnl0ZXNwcCwgc2l6ZSk7CisJCX0gZWxzZSB7CisJCQlzaXplID0gdyAqIGggKiBieXRlc3BwOworCQl9CisJfQorCisJaWYgKCFzaXplKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBvbWFwZmJfYWxsb2NfZmJtZW0oZmJpLCBzaXplLCBwYWRkcik7Cit9CisKK3N0YXRpYyBlbnVtIG9tYXBfY29sb3JfbW9kZSBmYl9mb3JtYXRfdG9fZHNzX21vZGUoZW51bSBvbWFwZmJfY29sb3JfZm9ybWF0IGZtdCkKK3sKKwllbnVtIG9tYXBfY29sb3JfbW9kZSBtb2RlOworCisJc3dpdGNoIChmbXQpIHsKKwljYXNlIE9NQVBGQl9DT0xPUl9SR0I1NjU6CisJCW1vZGUgPSBPTUFQX0RTU19DT0xPUl9SR0IxNjsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIyOgorCQltb2RlID0gT01BUF9EU1NfQ09MT1JfWVVWMjsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfQ0xVVF84QlBQOgorCQltb2RlID0gT01BUF9EU1NfQ09MT1JfQ0xVVDg7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX0NMVVRfNEJQUDoKKwkJbW9kZSA9IE9NQVBfRFNTX0NPTE9SX0NMVVQ0OworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9DTFVUXzJCUFA6CisJCW1vZGUgPSBPTUFQX0RTU19DT0xPUl9DTFVUMjsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfQ0xVVF8xQlBQOgorCQltb2RlID0gT01BUF9EU1NfQ09MT1JfQ0xVVDE7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX1JHQjQ0NDoKKwkJbW9kZSA9IE9NQVBfRFNTX0NPTE9SX1JHQjEyVTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVZNDIyOgorCQltb2RlID0gT01BUF9EU1NfQ09MT1JfVVlWWTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfQVJHQjE2OgorCQltb2RlID0gT01BUF9EU1NfQ09MT1JfQVJHQjE2OworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9SR0IyNFU6CisJCW1vZGUgPSBPTUFQX0RTU19DT0xPUl9SR0IyNFU7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX1JHQjI0UDoKKwkJbW9kZSA9IE9NQVBfRFNTX0NPTE9SX1JHQjI0UDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfQVJHQjMyOgorCQltb2RlID0gT01BUF9EU1NfQ09MT1JfQVJHQjMyOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9SR0JBMzI6CisJCW1vZGUgPSBPTUFQX0RTU19DT0xPUl9SR0JBMzI7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX1JHQlgzMjoKKwkJbW9kZSA9IE9NQVBfRFNTX0NPTE9SX1JHQlgzMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbW9kZSA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIG1vZGU7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3BhcnNlX3ZyYW1fcGFyYW0oY29uc3QgY2hhciAqcGFyYW0sIGludCBtYXhfZW50cmllcywKKwkJdW5zaWduZWQgbG9uZyAqc2l6ZXMsIHVuc2lnbmVkIGxvbmcgKnBhZGRycykKK3sKKwlpbnQgZmJudW07CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGxvbmcgcGFkZHIgPSAwOworCWNoYXIgKnAsICpzdGFydDsKKworCXN0YXJ0ID0gKGNoYXIgKilwYXJhbTsKKworCXdoaWxlICgxKSB7CisJCXAgPSBzdGFydDsKKworCQlmYm51bSA9IHNpbXBsZV9zdHJ0b3VsKHAsICZwLCAxMCk7CisKKwkJaWYgKHAgPT0gcGFyYW0pCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoKnAgIT0gJzonKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGZibnVtID49IG1heF9lbnRyaWVzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJc2l6ZSA9IG1lbXBhcnNlKHAgKyAxLCAmcCk7CisKKwkJaWYgKCFzaXplKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcGFkZHIgPSAwOworCisJCWlmICgqcCA9PSAnQCcpIHsKKwkJCXBhZGRyID0gc2ltcGxlX3N0cnRvdWwocCArIDEsICZwLCAxNik7CisKKwkJCWlmICghcGFkZHIpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJfQorCisJCXBhZGRyc1tmYm51bV0gPSBwYWRkcjsKKwkJc2l6ZXNbZmJudW1dID0gc2l6ZTsKKworCQlpZiAoKnAgPT0gMCkKKwkJCWJyZWFrOworCisJCWlmICgqcCAhPSAnLCcpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkrK3A7CisKKwkJc3RhcnQgPSBwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9hbGxvY2F0ZV9hbGxfZmJzKHN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYpCit7CisJaW50IGksIHI7CisJdW5zaWduZWQgbG9uZyB2cmFtX3NpemVzWzEwXTsKKwl1bnNpZ25lZCBsb25nIHZyYW1fcGFkZHJzWzEwXTsKKworCW1lbXNldCgmdnJhbV9zaXplcywgMCwgc2l6ZW9mKHZyYW1fc2l6ZXMpKTsKKwltZW1zZXQoJnZyYW1fcGFkZHJzLCAwLCBzaXplb2YodnJhbV9wYWRkcnMpKTsKKworCWlmIChkZWZfdnJhbSAmJglvbWFwZmJfcGFyc2VfdnJhbV9wYXJhbShkZWZfdnJhbSwgMTAsCisJCQkJdnJhbV9zaXplcywgdnJhbV9wYWRkcnMpKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgImZhaWxlZCB0byBwYXJzZSB2cmFtIHBhcmFtZXRlclxuIik7CisKKwkJbWVtc2V0KCZ2cmFtX3NpemVzLCAwLCBzaXplb2YodnJhbV9zaXplcykpOworCQltZW1zZXQoJnZyYW1fcGFkZHJzLCAwLCBzaXplb2YodnJhbV9wYWRkcnMpKTsKKwl9CisKKwlpZiAoZmJkZXYtPmRldi0+cGxhdGZvcm1fZGF0YSkgeworCQlzdHJ1Y3Qgb21hcGZiX3BsYXRmb3JtX2RhdGEgKm9wZDsKKwkJb3BkID0gZmJkZXYtPmRldi0+cGxhdGZvcm1fZGF0YTsKKwkJZm9yIChpID0gMDsgaSA8IG9wZC0+bWVtX2Rlc2MucmVnaW9uX2NudDsgKytpKSB7CisJCQlpZiAoIXZyYW1fc2l6ZXNbaV0pIHsKKwkJCQl1bnNpZ25lZCBsb25nIHNpemU7CisJCQkJdW5zaWduZWQgbG9uZyBwYWRkcjsKKworCQkJCXNpemUgPSBvcGQtPm1lbV9kZXNjLnJlZ2lvbltpXS5zaXplOworCQkJCXBhZGRyID0gb3BkLT5tZW1fZGVzYy5yZWdpb25baV0ucGFkZHI7CisKKwkJCQl2cmFtX3NpemVzW2ldID0gc2l6ZTsKKwkJCQl2cmFtX3BhZGRyc1tpXSA9IHBhZGRyOworCQkJfQorCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5udW1fZmJzOyBpKyspIHsKKwkJLyogYWxsb2NhdGUgbWVtb3J5IGF1dG9tYXRpY2FsbHkgb25seSBmb3IgZmIwLCBvciBpZgorCQkgKiBleGNwbGljaXRseSBkZWZpbmVkIHdpdGggdnJhbSBvciBwbGF0IGRhdGEgb3B0aW9uICovCisJCWlmIChpID09IDAgfHwgdnJhbV9zaXplc1tpXSAhPSAwKSB7CisJCQlyID0gb21hcGZiX2FsbG9jX2ZibWVtX2Rpc3BsYXkoZmJkZXYtPmZic1tpXSwKKwkJCQkJdnJhbV9zaXplc1tpXSwgdnJhbV9wYWRkcnNbaV0pOworCisJCQlpZiAocikKKwkJCQlyZXR1cm4gcjsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBmYmRldi0+bnVtX2ZiczsgaSsrKSB7CisJCXN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSA9IEZCMk9GQihmYmRldi0+ZmJzW2ldKTsKKwkJc3RydWN0IG9tYXBmYjJfbWVtX3JlZ2lvbiAqcmc7CisJCXJnID0gJm9mYmktPnJlZ2lvbjsKKworCQlEQkcoInJlZ2lvbiVkIHBoeXMgJTA4eCB2aXJ0ICVwIHNpemU9JWx1XG4iLAorCQkJCWksCisJCQkJcmctPnBhZGRyLAorCQkJCXJnLT52YWRkciwKKwkJCQlyZy0+c2l6ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBvbWFwZmJfcmVhbGxvY19mYm1lbShzdHJ1Y3QgZmJfaW5mbyAqZmJpLCB1bnNpZ25lZCBsb25nIHNpemUsIGludCB0eXBlKQoreworCXN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSA9IEZCMk9GQihmYmkpOworCXN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYgPSBvZmJpLT5mYmRldjsKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5ID0gZmIyZGlzcGxheShmYmkpOworCXN0cnVjdCBvbWFwZmIyX21lbV9yZWdpb24gKnJnID0gJm9mYmktPnJlZ2lvbjsKKwl1bnNpZ25lZCBsb25nIG9sZF9zaXplID0gcmctPnNpemU7CisJdW5zaWduZWQgbG9uZyBvbGRfcGFkZHIgPSByZy0+cGFkZHI7CisJaW50IG9sZF90eXBlID0gcmctPnR5cGU7CisJaW50IHI7CisKKwlpZiAodHlwZSA+IE9NQVBGQl9NRU1UWVBFX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzaXplID0gUEFHRV9BTElHTihzaXplKTsKKworCWlmIChvbGRfc2l6ZSA9PSBzaXplICYmIG9sZF90eXBlID09IHR5cGUpCisJCXJldHVybiAwOworCisJaWYgKGRpc3BsYXkgJiYgZGlzcGxheS0+c3luYykKKwkJCWRpc3BsYXktPnN5bmMoZGlzcGxheSk7CisKKwlvbWFwZmJfZnJlZV9mYm1lbShmYmkpOworCisJaWYgKHNpemUgPT0gMCkgeworCQljbGVhcl9mYl9pbmZvKGZiaSk7CisJCXJldHVybiAwOworCX0KKworCXIgPSBvbWFwZmJfYWxsb2NfZmJtZW0oZmJpLCBzaXplLCAwKTsKKworCWlmIChyKSB7CisJCWlmIChvbGRfc2l6ZSkKKwkJCW9tYXBmYl9hbGxvY19mYm1lbShmYmksIG9sZF9zaXplLCBvbGRfcGFkZHIpOworCisJCWlmIChyZy0+c2l6ZSA9PSAwKQorCQkJY2xlYXJfZmJfaW5mbyhmYmkpOworCisJCXJldHVybiByOworCX0KKworCWlmIChvbGRfc2l6ZSA9PSBzaXplKQorCQlyZXR1cm4gMDsKKworCWlmIChvbGRfc2l6ZSA9PSAwKSB7CisJCURCRygiaW5pdGlhbGl6aW5nIGZiICVkXG4iLCBvZmJpLT5pZCk7CisJCXIgPSBvbWFwZmJfZmJfaW5pdChmYmRldiwgZmJpKTsKKwkJaWYgKHIpIHsKKwkJCURCRygib21hcGZiX2ZiX2luaXQgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCXIgPSBvbWFwZmJfYXBwbHlfY2hhbmdlcyhmYmksIDEpOworCQlpZiAocikgeworCQkJREJHKCJvbWFwZmJfYXBwbHlfY2hhbmdlcyBmYWlsZWRcbiIpOworCQkJZ290byBlcnI7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gbmV3X3ZhcjsKKwkJbWVtY3B5KCZuZXdfdmFyLCAmZmJpLT52YXIsIHNpemVvZihuZXdfdmFyKSk7CisJCXIgPSBjaGVja19mYl92YXIoZmJpLCAmbmV3X3Zhcik7CisJCWlmIChyKQorCQkJZ290byBlcnI7CisJCW1lbWNweSgmZmJpLT52YXIsICZuZXdfdmFyLCBzaXplb2YoZmJpLT52YXIpKTsKKwkJc2V0X2ZiX2ZpeChmYmkpOworCQlyID0gc2V0dXBfdnJmYl9yb3RhdGlvbihmYmkpOworCQlpZiAocikKKwkJCWdvdG8gZXJyOworCX0KKworCXJldHVybiAwOworZXJyOgorCW9tYXBmYl9mcmVlX2ZibWVtKGZiaSk7CisJY2xlYXJfZmJfaW5mbyhmYmkpOworCXJldHVybiByOworfQorCisvKiBpbml0aWFsaXplIGZiX2luZm8sIHZhciwgZml4IHRvIHNvbWV0aGluZyBzYW5lIGJhc2VkIG9uIHRoZSBkaXNwbGF5ICovCitzdGF0aWMgaW50IG9tYXBmYl9mYl9pbml0KHN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYsIHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmZmJpLT52YXI7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheSA9IGZiMmRpc3BsYXkoZmJpKTsKKwlzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmkgPSBGQjJPRkIoZmJpKTsKKwlpbnQgciA9IDA7CisKKwlmYmktPmZib3BzID0gJm9tYXBmYl9vcHM7CisJZmJpLT5mbGFncyA9IEZCSU5GT19GTEFHX0RFRkFVTFQ7CisJZmJpLT5wc2V1ZG9fcGFsZXR0ZSA9IGZiZGV2LT5wc2V1ZG9fcGFsZXR0ZTsKKworCWlmIChvZmJpLT5yZWdpb24uc2l6ZSA9PSAwKSB7CisJCWNsZWFyX2ZiX2luZm8oZmJpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdmFyLT5ub25zdGQgPSAwOworCXZhci0+Yml0c19wZXJfcGl4ZWwgPSAwOworCisJdmFyLT5yb3RhdGUgPSBkZWZfcm90YXRlOworCisJLyoKKwkgKiBDaGVjayBpZiB0aGVyZSBpcyBhIGRlZmF1bHQgY29sb3IgZm9ybWF0IHNldCBpbiB0aGUgYm9hcmQgZmlsZSwKKwkgKiBhbmQgdXNlIHRoaXMgZm9ybWF0IGluc3RlYWQgdGhlIGRlZmF1bHQgZGVkdWN0ZWQgZnJvbSB0aGUKKwkgKiBkaXNwbGF5IGJwcC4KKwkgKi8KKwlpZiAoZmJkZXYtPmRldi0+cGxhdGZvcm1fZGF0YSkgeworCQlzdHJ1Y3Qgb21hcGZiX3BsYXRmb3JtX2RhdGEgKm9wZDsKKwkJaW50IGlkID0gb2ZiaS0+aWQ7CisKKwkJb3BkID0gZmJkZXYtPmRldi0+cGxhdGZvcm1fZGF0YTsKKwkJaWYgKG9wZC0+bWVtX2Rlc2MucmVnaW9uW2lkXS5mb3JtYXRfdXNlZCkgeworCQkJZW51bSBvbWFwX2NvbG9yX21vZGUgbW9kZTsKKwkJCWVudW0gb21hcGZiX2NvbG9yX2Zvcm1hdCBmb3JtYXQ7CisKKwkJCWZvcm1hdCA9IG9wZC0+bWVtX2Rlc2MucmVnaW9uW2lkXS5mb3JtYXQ7CisJCQltb2RlID0gZmJfZm9ybWF0X3RvX2Rzc19tb2RlKGZvcm1hdCk7CisJCQlpZiAobW9kZSA8IDApIHsKKwkJCQlyID0gbW9kZTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCXIgPSBkc3NfbW9kZV90b19mYl9tb2RlKG1vZGUsIHZhcik7CisJCQlpZiAociA8IDApCisJCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlpZiAoZGlzcGxheSkgeworCQl1MTYgdywgaDsKKwkJaW50IHJvdGF0aW9uID0gKHZhci0+cm90YXRlICsgb2ZiaS0+cm90YXRpb25bMF0pICUgNDsKKworCQlkaXNwbGF5LT5nZXRfcmVzb2x1dGlvbihkaXNwbGF5LCAmdywgJmgpOworCisJCWlmIChyb3RhdGlvbiA9PSBGQl9ST1RBVEVfQ1cgfHwKKwkJCQlyb3RhdGlvbiA9PSBGQl9ST1RBVEVfQ0NXKSB7CisJCQl2YXItPnhyZXMgPSBoOworCQkJdmFyLT55cmVzID0gdzsKKwkJfSBlbHNlIHsKKwkJCXZhci0+eHJlcyA9IHc7CisJCQl2YXItPnlyZXMgPSBoOworCQl9CisKKwkJdmFyLT54cmVzX3ZpcnR1YWwgPSB2YXItPnhyZXM7CisJCXZhci0+eXJlc192aXJ0dWFsID0gdmFyLT55cmVzOworCisJCWlmICghdmFyLT5iaXRzX3Blcl9waXhlbCkgeworCQkJc3dpdGNoIChkaXNwbGF5LT5nZXRfcmVjb21tZW5kZWRfYnBwKGRpc3BsYXkpKSB7CisJCQljYXNlIDE2OgorCQkJCXZhci0+Yml0c19wZXJfcGl4ZWwgPSAxNjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjQ6CisJCQkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDMyOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJpbGxlZ2FsIGRpc3BsYXkgIgorCQkJCQkJImJwcFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBpZiB0aGVyZSdzIG5vIGRpc3BsYXksIGxldCdzIGp1c3QgZ3Vlc3Mgc29tZSBiYXNpYyB2YWx1ZXMgKi8KKwkJdmFyLT54cmVzID0gMzIwOworCQl2YXItPnlyZXMgPSAyNDA7CisJCXZhci0+eHJlc192aXJ0dWFsID0gdmFyLT54cmVzOworCQl2YXItPnlyZXNfdmlydHVhbCA9IHZhci0+eXJlczsKKwkJaWYgKCF2YXItPmJpdHNfcGVyX3BpeGVsKQorCQkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDE2OworCX0KKworCXIgPSBjaGVja19mYl92YXIoZmJpLCB2YXIpOworCWlmIChyKQorCQlnb3RvIGVycjsKKworCXNldF9mYl9maXgoZmJpKTsKKwlyID0gc2V0dXBfdnJmYl9yb3RhdGlvbihmYmkpOworCWlmIChyKQorCQlnb3RvIGVycjsKKworCXIgPSBmYl9hbGxvY19jbWFwKCZmYmktPmNtYXAsIDI1NiwgMCk7CisJaWYgKHIpCisJCWRldl9lcnIoZmJkZXYtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBjb2xvciBtYXAgbWVtb3J5XG4iKTsKKworZXJyOgorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBmYmluZm9fY2xlYW51cChzdHJ1Y3Qgb21hcGZiMl9kZXZpY2UgKmZiZGV2LCBzdHJ1Y3QgZmJfaW5mbyAqZmJpKQoreworCWZiX2RlYWxsb2NfY21hcCgmZmJpLT5jbWFwKTsKK30KKworCitzdGF0aWMgdm9pZCBvbWFwZmJfZnJlZV9yZXNvdXJjZXMoc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldikKK3sKKwlpbnQgaTsKKworCURCRygiZnJlZV9yZXNvdXJjZXNcbiIpOworCisJaWYgKGZiZGV2ID09IE5VTEwpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBmYmRldi0+bnVtX2ZiczsgaSsrKQorCQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGZiZGV2LT5mYnNbaV0pOworCisJLyogZnJlZSB0aGUgcmVzZXJ2ZWQgZmJtZW0gKi8KKwlvbWFwZmJfZnJlZV9hbGxfZmJtZW0oZmJkZXYpOworCisJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5udW1fZmJzOyBpKyspIHsKKwkJZmJpbmZvX2NsZWFudXAoZmJkZXYsIGZiZGV2LT5mYnNbaV0pOworCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGZiZGV2LT5mYnNbaV0pOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBmYmRldi0+bnVtX2Rpc3BsYXlzOyBpKyspIHsKKwkJaWYgKGZiZGV2LT5kaXNwbGF5c1tpXS0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9ESVNBQkxFRCkKKwkJCWZiZGV2LT5kaXNwbGF5c1tpXS0+ZGlzYWJsZShmYmRldi0+ZGlzcGxheXNbaV0pOworCisJCW9tYXBfZHNzX3B1dF9kZXZpY2UoZmJkZXYtPmRpc3BsYXlzW2ldKTsKKwl9CisKKwlkZXZfc2V0X2RydmRhdGEoZmJkZXYtPmRldiwgTlVMTCk7CisJa2ZyZWUoZmJkZXYpOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9jcmVhdGVfZnJhbWVidWZmZXJzKHN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYpCit7CisJaW50IHIsIGk7CisKKwlmYmRldi0+bnVtX2ZicyA9IDA7CisKKwlEQkcoImNyZWF0ZSAlZCBmcmFtZWJ1ZmZlcnNcbiIsCUNPTkZJR19GQl9PTUFQMl9OVU1fRkJTKTsKKworCS8qIGFsbG9jYXRlIGZiX2luZm9zICovCisJZm9yIChpID0gMDsgaSA8IENPTkZJR19GQl9PTUFQMl9OVU1fRkJTOyBpKyspIHsKKwkJc3RydWN0IGZiX2luZm8gKmZiaTsKKwkJc3RydWN0IG9tYXBmYl9pbmZvICpvZmJpOworCisJCWZiaSA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcGZiX2luZm8pLAorCQkJCWZiZGV2LT5kZXYpOworCisJCWlmIChmYmkgPT0gTlVMTCkgeworCQkJZGV2X2VycihmYmRldi0+ZGV2LAorCQkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwbGFuZSBpbmZvXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJY2xlYXJfZmJfaW5mbyhmYmkpOworCisJCWZiZGV2LT5mYnNbaV0gPSBmYmk7CisKKwkJb2ZiaSA9IEZCMk9GQihmYmkpOworCQlvZmJpLT5mYmRldiA9IGZiZGV2OworCQlvZmJpLT5pZCA9IGk7CisKKwkJLyogYXNzaWduIHRoZXNlIGVhcmx5LCBzbyB0aGF0IGZiIGFsbG9jIGNhbiB1c2UgdGhlbSAqLworCQlvZmJpLT5yb3RhdGlvbl90eXBlID0gZGVmX3ZyZmIgPyBPTUFQX0RTU19ST1RfVlJGQiA6CisJCQlPTUFQX0RTU19ST1RfRE1BOworCQlvZmJpLT5taXJyb3IgPSBkZWZfbWlycm9yOworCisJCWZiZGV2LT5udW1fZmJzKys7CisJfQorCisJREJHKCJmYl9pbmZvcyBhbGxvY2F0ZWRcbiIpOworCisJLyogYXNzaWduIG92ZXJsYXlzIGZvciB0aGUgZmJzICovCisJZm9yIChpID0gMDsgaSA8IG1pbihmYmRldi0+bnVtX2ZicywgZmJkZXYtPm51bV9vdmVybGF5cyk7IGkrKykgeworCQlzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmkgPSBGQjJPRkIoZmJkZXYtPmZic1tpXSk7CisKKwkJb2ZiaS0+b3ZlcmxheXNbMF0gPSBmYmRldi0+b3ZlcmxheXNbaV07CisJCW9mYmktPm51bV9vdmVybGF5cyA9IDE7CisJfQorCisJLyogYWxsb2NhdGUgZmIgbWVtb3JpZXMgKi8KKwlyID0gb21hcGZiX2FsbG9jYXRlX2FsbF9mYnMoZmJkZXYpOworCWlmIChyKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBmYm1lbVxuIik7CisJCXJldHVybiByOworCX0KKworCURCRygiZmJtZW1zIGFsbG9jYXRlZFxuIik7CisKKwkvKiBzZXR1cCBmYl9pbmZvcyAqLworCWZvciAoaSA9IDA7IGkgPCBmYmRldi0+bnVtX2ZiczsgaSsrKSB7CisJCXIgPSBvbWFwZmJfZmJfaW5pdChmYmRldiwgZmJkZXYtPmZic1tpXSk7CisJCWlmIChyKSB7CisJCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJmYWlsZWQgdG8gc2V0dXAgZmJfaW5mb1xuIik7CisJCQlyZXR1cm4gcjsKKwkJfQorCX0KKworCURCRygiZmJfaW5mb3MgaW5pdGlhbGl6ZWRcbiIpOworCisJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5udW1fZmJzOyBpKyspIHsKKwkJciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGZiZGV2LT5mYnNbaV0pOworCQlpZiAociAhPSAwKSB7CisJCQlkZXZfZXJyKGZiZGV2LT5kZXYsCisJCQkJInJlZ2lzdGVyaW5nIGZyYW1lYnVmZmVyICVkIGZhaWxlZFxuIiwgaSk7CisJCQlyZXR1cm4gcjsKKwkJfQorCX0KKworCURCRygiZnJhbWVidWZmZXJzIHJlZ2lzdGVyZWRcbiIpOworCisJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5udW1fZmJzOyBpKyspIHsKKwkJciA9IG9tYXBmYl9hcHBseV9jaGFuZ2VzKGZiZGV2LT5mYnNbaV0sIDEpOworCQlpZiAocikgeworCQkJZGV2X2VycihmYmRldi0+ZGV2LCAiZmFpbGVkIHRvIGNoYW5nZSBtb2RlXG4iKTsKKwkJCXJldHVybiByOworCQl9CisJfQorCisJREJHKCJjcmVhdGUgc3lzZnMgZm9yIGZic1xuIik7CisJciA9IG9tYXBmYl9jcmVhdGVfc3lzZnMoZmJkZXYpOworCWlmIChyKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZW50cmllc1xuIik7CisJCXJldHVybiByOworCX0KKworCS8qIEVuYWJsZSBmYjAgKi8KKwlpZiAoZmJkZXYtPm51bV9mYnMgPiAwKSB7CisJCXN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSA9IEZCMk9GQihmYmRldi0+ZmJzWzBdKTsKKworCQlpZiAob2ZiaS0+bnVtX292ZXJsYXlzID4gMCkgeworCQkJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsID0gb2ZiaS0+b3ZlcmxheXNbMF07CisKKwkJCXIgPSBvbWFwZmJfb3ZlcmxheV9lbmFibGUob3ZsLCAxKTsKKworCQkJaWYgKHIpIHsKKwkJCQlkZXZfZXJyKGZiZGV2LT5kZXYsCisJCQkJCQkiZmFpbGVkIHRvIGVuYWJsZSBvdmVybGF5XG4iKTsKKwkJCQlyZXR1cm4gcjsKKwkJCX0KKwkJfQorCX0KKworCURCRygiY3JlYXRlX2ZyYW1lYnVmZmVycyBkb25lXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9tb2RlX3RvX3RpbWluZ3MoY29uc3QgY2hhciAqbW9kZV9zdHIsCisJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MsIHU4ICpicHApCit7CisJc3RydWN0IGZiX2luZm8gZmJpOworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXI7CisJc3RydWN0IGZiX29wcyBmYm9wczsKKwlpbnQgcjsKKworI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfVkVOQworCWlmIChzdHJjbXAobW9kZV9zdHIsICJwYWwiKSA9PSAwKSB7CisJCSp0aW1pbmdzID0gb21hcF9kc3NfcGFsX3RpbWluZ3M7CisJCSpicHAgPSAwOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKHN0cmNtcChtb2RlX3N0ciwgIm50c2MiKSA9PSAwKSB7CisJCSp0aW1pbmdzID0gb21hcF9kc3NfbnRzY190aW1pbmdzOworCQkqYnBwID0gMDsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKKwkvKiB0aGlzIGlzIHF1aXRlIGEgaGFjaywgYnV0IEkgd2FudGVkIHRvIHVzZSB0aGUgbW9kZWRiIGFuZCBmb3IKKwkgKiB0aGF0IHdlIG5lZWQgZmJfaW5mbyBhbmQgdmFyLCBzbyB3ZSBjcmVhdGUgZHVtbXkgb25lcyAqLworCisJbWVtc2V0KCZmYmksIDAsIHNpemVvZihmYmkpKTsKKwltZW1zZXQoJnZhciwgMCwgc2l6ZW9mKHZhcikpOworCW1lbXNldCgmZmJvcHMsIDAsIHNpemVvZihmYm9wcykpOworCWZiaS5mYm9wcyA9ICZmYm9wczsKKworCXIgPSBmYl9maW5kX21vZGUoJnZhciwgJmZiaSwgbW9kZV9zdHIsIE5VTEwsIDAsIE5VTEwsIDI0KTsKKworCWlmIChyICE9IDApIHsKKwkJdGltaW5ncy0+cGl4ZWxfY2xvY2sgPSBQSUNPUzJLSFoodmFyLnBpeGNsb2NrKTsKKwkJdGltaW5ncy0+aGZwID0gdmFyLmxlZnRfbWFyZ2luOworCQl0aW1pbmdzLT5oYnAgPSB2YXIucmlnaHRfbWFyZ2luOworCQl0aW1pbmdzLT52ZnAgPSB2YXIudXBwZXJfbWFyZ2luOworCQl0aW1pbmdzLT52YnAgPSB2YXIubG93ZXJfbWFyZ2luOworCQl0aW1pbmdzLT5oc3cgPSB2YXIuaHN5bmNfbGVuOworCQl0aW1pbmdzLT52c3cgPSB2YXIudnN5bmNfbGVuOworCQl0aW1pbmdzLT54X3JlcyA9IHZhci54cmVzOworCQl0aW1pbmdzLT55X3JlcyA9IHZhci55cmVzOworCisJCXN3aXRjaCAodmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJCWNhc2UgMTY6CisJCQkqYnBwID0gMTY7CisJCQlicmVhazsKKwkJY2FzZSAyNDoKKwkJY2FzZSAzMjoKKwkJZGVmYXVsdDoKKwkJCSpicHAgPSAyNDsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgaW50IG9tYXBmYl9zZXRfZGVmX21vZGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheSwgY2hhciAqbW9kZV9zdHIpCit7CisJaW50IHI7CisJdTggYnBwOworCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgdGltaW5nczsKKworCXIgPSBvbWFwZmJfbW9kZV90b190aW1pbmdzKG1vZGVfc3RyLCAmdGltaW5ncywgJmJwcCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJZGlzcGxheS0+cGFuZWwucmVjb21tZW5kZWRfYnBwID0gYnBwOworCisJaWYgKCFkaXNwbGF5LT5jaGVja190aW1pbmdzIHx8ICFkaXNwbGF5LT5zZXRfdGltaW5ncykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyID0gZGlzcGxheS0+Y2hlY2tfdGltaW5ncyhkaXNwbGF5LCAmdGltaW5ncyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJZGlzcGxheS0+c2V0X3RpbWluZ3MoZGlzcGxheSwgJnRpbWluZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3BhcnNlX2RlZl9tb2RlcyhzdHJ1Y3Qgb21hcGZiMl9kZXZpY2UgKmZiZGV2KQoreworCWNoYXIgKnN0ciwgKm9wdGlvbnMsICp0aGlzX29wdDsKKwlpbnQgciA9IDA7CisKKwlzdHIgPSBrbWFsbG9jKHN0cmxlbihkZWZfbW9kZSkgKyAxLCBHRlBfS0VSTkVMKTsKKwlzdHJjcHkoc3RyLCBkZWZfbW9kZSk7CisJb3B0aW9ucyA9IHN0cjsKKworCXdoaWxlICghciAmJiAodGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJY2hhciAqcCwgKmRpc3BsYXlfc3RyLCAqbW9kZV9zdHI7CisJCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRpc3BsYXk7CisJCWludCBpOworCisJCXAgPSBzdHJjaHIodGhpc19vcHQsICc6Jyk7CisJCWlmICghcCkgeworCQkJciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCSpwID0gMDsKKwkJZGlzcGxheV9zdHIgPSB0aGlzX29wdDsKKwkJbW9kZV9zdHIgPSBwICsgMTsKKworCQlkaXNwbGF5ID0gTlVMTDsKKwkJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5udW1fZGlzcGxheXM7ICsraSkgeworCQkJaWYgKHN0cmNtcChmYmRldi0+ZGlzcGxheXNbaV0tPm5hbWUsCisJCQkJCQlkaXNwbGF5X3N0cikgPT0gMCkgeworCQkJCWRpc3BsYXkgPSBmYmRldi0+ZGlzcGxheXNbaV07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWRpc3BsYXkpIHsKKwkJCXIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlyID0gb21hcGZiX3NldF9kZWZfbW9kZShkaXNwbGF5LCBtb2RlX3N0cik7CisJCWlmIChyKQorCQkJYnJlYWs7CisJfQorCisJa2ZyZWUoc3RyKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYgPSBOVUxMOworCWludCByID0gMDsKKwlpbnQgaTsKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGVmX2Rpc3BsYXk7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2OworCisJREJHKCJvbWFwZmJfcHJvYmVcbiIpOworCisJaWYgKHBkZXYtPm51bV9yZXNvdXJjZXMgIT0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwcm9iZWQgZm9yIGFuIHVua25vd24gZGV2aWNlXG4iKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyMDsKKwl9CisKKwlmYmRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvbWFwZmIyX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmIChmYmRldiA9PSBOVUxMKSB7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGVycjA7CisJfQorCisJbXV0ZXhfaW5pdCgmZmJkZXYtPm10eCk7CisKKwlmYmRldi0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBmYmRldik7CisKKwlmYmRldi0+bnVtX2Rpc3BsYXlzID0gMDsKKwlkc3NkZXYgPSBOVUxMOworCWZvcl9lYWNoX2Rzc19kZXYoZHNzZGV2KSB7CisJCW9tYXBfZHNzX2dldF9kZXZpY2UoZHNzZGV2KTsKKwkJZmJkZXYtPmRpc3BsYXlzW2ZiZGV2LT5udW1fZGlzcGxheXMrK10gPSBkc3NkZXY7CisJfQorCisJaWYgKGZiZGV2LT5udW1fZGlzcGxheXMgPT0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBkaXNwbGF5c1xuIik7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJZmJkZXYtPm51bV9vdmVybGF5cyA9IG9tYXBfZHNzX2dldF9udW1fb3ZlcmxheXMoKTsKKwlmb3IgKGkgPSAwOyBpIDwgZmJkZXYtPm51bV9vdmVybGF5czsgaSsrKQorCQlmYmRldi0+b3ZlcmxheXNbaV0gPSBvbWFwX2Rzc19nZXRfb3ZlcmxheShpKTsKKworCWZiZGV2LT5udW1fbWFuYWdlcnMgPSBvbWFwX2Rzc19nZXRfbnVtX292ZXJsYXlfbWFuYWdlcnMoKTsKKwlmb3IgKGkgPSAwOyBpIDwgZmJkZXYtPm51bV9tYW5hZ2VyczsgaSsrKQorCQlmYmRldi0+bWFuYWdlcnNbaV0gPSBvbWFwX2Rzc19nZXRfb3ZlcmxheV9tYW5hZ2VyKGkpOworCisJaWYgKGRlZl9tb2RlICYmIHN0cmxlbihkZWZfbW9kZSkgPiAwKSB7CisJCWlmIChvbWFwZmJfcGFyc2VfZGVmX21vZGVzKGZiZGV2KSkKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJjYW5ub3QgcGFyc2UgZGVmYXVsdCBtb2Rlc1xuIik7CisJfQorCisJciA9IG9tYXBmYl9jcmVhdGVfZnJhbWVidWZmZXJzKGZiZGV2KTsKKwlpZiAocikKKwkJZ290byBjbGVhbnVwOworCisJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5udW1fbWFuYWdlcnM7IGkrKykgeworCQlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncjsKKwkJbWdyID0gZmJkZXYtPm1hbmFnZXJzW2ldOworCQlyID0gbWdyLT5hcHBseShtZ3IpOworCQlpZiAocikKKwkJCWRldl93YXJuKGZiZGV2LT5kZXYsICJmYWlsZWQgdG8gYXBwbHkgZGlzcGMgY29uZmlnXG4iKTsKKwl9CisKKwlEQkcoIm1nci0+YXBwbHknZWRcbiIpOworCisJLyogZ2Z4IG92ZXJsYXkgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IG9uZS4gZmluZCBhIGRpc3BsYXkKKwkgKiBjb25uZWN0ZWQgdG8gdGhhdCwgYW5kIHVzZSBpdCBhcyBkZWZhdWx0IGRpc3BsYXkgKi8KKwlvdmwgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheSgwKTsKKwlpZiAob3ZsLT5tYW5hZ2VyICYmIG92bC0+bWFuYWdlci0+ZGV2aWNlKSB7CisJCWRlZl9kaXNwbGF5ID0gb3ZsLT5tYW5hZ2VyLT5kZXZpY2U7CisJfSBlbHNlIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImNhbm5vdCBmaW5kIGRlZmF1bHQgZGlzcGxheVxuIik7CisJCWRlZl9kaXNwbGF5ID0gTlVMTDsKKwl9CisKKwlpZiAoZGVmX2Rpc3BsYXkpIHsKKyNpZm5kZWYgQ09ORklHX0ZCX09NQVAyX0ZPUkNFX0FVVE9fVVBEQVRFCisJCXUxNiB3LCBoOworI2VuZGlmCisJCXIgPSBkZWZfZGlzcGxheS0+ZW5hYmxlKGRlZl9kaXNwbGF5KTsKKwkJaWYgKHIpCisJCQlkZXZfd2FybihmYmRldi0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBkaXNwbGF5ICclcydcbiIsCisJCQkJCWRlZl9kaXNwbGF5LT5uYW1lKTsKKworCQkvKiBzZXQgdGhlIHVwZGF0ZSBtb2RlICovCisJCWlmIChkZWZfZGlzcGxheS0+Y2FwcyAmIE9NQVBfRFNTX0RJU1BMQVlfQ0FQX01BTlVBTF9VUERBVEUpIHsKKyNpZmRlZiBDT05GSUdfRkJfT01BUDJfRk9SQ0VfQVVUT19VUERBVEUKKwkJCWlmIChkZWZfZGlzcGxheS0+ZW5hYmxlX3RlKQorCQkJCWRlZl9kaXNwbGF5LT5lbmFibGVfdGUoZGVmX2Rpc3BsYXksIDEpOworCQkJaWYgKGRlZl9kaXNwbGF5LT5zZXRfdXBkYXRlX21vZGUpCisJCQkJZGVmX2Rpc3BsYXktPnNldF91cGRhdGVfbW9kZShkZWZfZGlzcGxheSwKKwkJCQkJCU9NQVBfRFNTX1VQREFURV9BVVRPKTsKKyNlbHNlIC8qIE1BTlVBTF9VUERBVEUgKi8KKwkJCWlmIChkZWZfZGlzcGxheS0+ZW5hYmxlX3RlKQorCQkJCWRlZl9kaXNwbGF5LT5lbmFibGVfdGUoZGVmX2Rpc3BsYXksIDApOworCQkJaWYgKGRlZl9kaXNwbGF5LT5zZXRfdXBkYXRlX21vZGUpCisJCQkJZGVmX2Rpc3BsYXktPnNldF91cGRhdGVfbW9kZShkZWZfZGlzcGxheSwKKwkJCQkJCU9NQVBfRFNTX1VQREFURV9NQU5VQUwpOworCisJCQlkZWZfZGlzcGxheS0+Z2V0X3Jlc29sdXRpb24oZGVmX2Rpc3BsYXksICZ3LCAmaCk7CisJCQlkZWZfZGlzcGxheS0+dXBkYXRlKGRlZl9kaXNwbGF5LCAwLCAwLCB3LCBoKTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJaWYgKGRlZl9kaXNwbGF5LT5zZXRfdXBkYXRlX21vZGUpCisJCQkJZGVmX2Rpc3BsYXktPnNldF91cGRhdGVfbW9kZShkZWZfZGlzcGxheSwKKwkJCQkJCU9NQVBfRFNTX1VQREFURV9BVVRPKTsKKwkJfQorCX0KKworCXJldHVybiAwOworCitjbGVhbnVwOgorCW9tYXBmYl9mcmVlX3Jlc291cmNlcyhmYmRldik7CitlcnIwOgorCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBzZXR1cCBvbWFwZmJcbiIpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgb21hcGZiMl9kZXZpY2UgKmZiZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwkvKiBGSVhNRTogd2FpdCB0aWxsIGNvbXBsZXRpb24gb2YgcGVuZGluZyBldmVudHMgKi8KKworCW9tYXBmYl9yZW1vdmVfc3lzZnMoZmJkZXYpOworCisJb21hcGZiX2ZyZWVfcmVzb3VyY2VzKGZiZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwZmJfZHJpdmVyID0geworCS5wcm9iZSAgICAgICAgICA9IG9tYXBmYl9wcm9iZSwKKwkucmVtb3ZlICAgICAgICAgPSBvbWFwZmJfcmVtb3ZlLAorCS5kcml2ZXIgICAgICAgICA9IHsKKwkJLm5hbWUgICA9ICJvbWFwZmIiLAorCQkub3duZXIgID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBmYl9pbml0KHZvaWQpCit7CisJREJHKCJvbWFwZmJfaW5pdFxuIik7CisKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvbWFwZmJfZHJpdmVyKSkgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byByZWdpc3RlciBvbWFwZmIgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvbWFwZmJfZXhpdCh2b2lkKQoreworCURCRygib21hcGZiX2V4aXRcbiIpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZvbWFwZmJfZHJpdmVyKTsKK30KKworbW9kdWxlX3BhcmFtX25hbWVkKG1vZGUsIGRlZl9tb2RlLCBjaGFycCwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQodnJhbSwgZGVmX3ZyYW0sIGNoYXJwLCAwKTsKK21vZHVsZV9wYXJhbV9uYW1lZChyb3RhdGUsIGRlZl9yb3RhdGUsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQodnJmYiwgZGVmX3ZyZmIsIGJvb2wsIDApOworbW9kdWxlX3BhcmFtX25hbWVkKG1pcnJvciwgZGVmX21pcnJvciwgYm9vbCwgMCk7CisKKy8qIGxhdGVfaW5pdGNhbGwgdG8gbGV0IHBhbmVsL2N0cmwgZHJpdmVycyBsb2FkZWQgZmlyc3QuCisgKiBJIGd1ZXNzIGJldHRlciBvcHRpb24gd291bGQgYmUgYSBtb3JlIGR5bmFtaWMgYXBwcm9hY2gsCisgKiBzbyB0aGF0IG9tYXBmYiByZWFjdHMgdG8gbmV3IHBhbmVscyB3aGVuIHRoZXkgYXJlIGxvYWRlZCAqLworbGF0ZV9pbml0Y2FsbChvbWFwZmJfaW5pdCk7CisvKm1vZHVsZV9pbml0KG9tYXBmYl9pbml0KTsqLworbW9kdWxlX2V4aXQob21hcGZiX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJUb21pIFZhbGtlaW5lbiA8dG9taS52YWxrZWluZW5Abm9raWEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJPTUFQMi8zIEZyYW1lYnVmZmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItc3lzZnMuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL29tYXBmYi1zeXNmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYmI4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItc3lzZnMuYwpAQCAtMCwwICsxLDUwNyBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiLXN5c2ZzLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogVG9taSBWYWxrZWluZW4gPHRvbWkudmFsa2VpbmVuQG5va2lhLmNvbT4KKyAqCisgKiBTb21lIGNvZGUgYW5kIGlkZWFzIHRha2VuIGZyb20gZHJpdmVycy92aWRlby9vbWFwLyBkcml2ZXIKKyAqIGJ5IEltcmUgRGVhay4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvb21hcGZiLmg+CisKKyNpbmNsdWRlIDxwbGF0L2Rpc3BsYXkuaD4KKyNpbmNsdWRlIDxwbGF0L3ZyZmIuaD4KKworI2luY2x1ZGUgIm9tYXBmYi5oIgorCitzdGF0aWMgc3NpemVfdCBzaG93X3JvdGF0ZV90eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJpID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG9tYXBmYl9pbmZvICpvZmJpID0gRkIyT0ZCKGZiaSk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgb2ZiaS0+cm90YXRpb25fdHlwZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3JvdGF0ZV90eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmYl9pbmZvICpmYmkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmkgPSBGQjJPRkIoZmJpKTsKKwllbnVtIG9tYXBfZHNzX3JvdGF0aW9uX3R5cGUgcm90X3R5cGU7CisJaW50IHI7CisKKwlyb3RfdHlwZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisKKwlpZiAocm90X3R5cGUgIT0gT01BUF9EU1NfUk9UX0RNQSAmJiByb3RfdHlwZSAhPSBPTUFQX0RTU19ST1RfVlJGQikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NrX2ZiX2luZm8oZmJpKTsKKworCXIgPSAwOworCWlmIChyb3RfdHlwZSA9PSBvZmJpLT5yb3RhdGlvbl90eXBlKQorCQlnb3RvIG91dDsKKworCWlmIChvZmJpLT5yZWdpb24uc2l6ZSkgeworCQlyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlvZmJpLT5yb3RhdGlvbl90eXBlID0gcm90X3R5cGU7CisKKwkvKgorCSAqIFNpbmNlIHRoZSBWUkFNIGZvciB0aGlzIEZCIGlzIG5vdCBhbGxvY2F0ZWQgYXQgdGhlIG1vbWVudCB3ZSBkb24ndAorCSAqIG5lZWQgdG8gZG8gYW55IGZ1cnRoZXIgcGFyYW1ldGVyIGNoZWNraW5nIGF0IHRoaXMgcG9pbnQuCisJICovCitvdXQ6CisJdW5sb2NrX2ZiX2luZm8oZmJpKTsKKworCXJldHVybiByID8gciA6IGNvdW50OworfQorCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfbWlycm9yKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJpID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG9tYXBmYl9pbmZvICpvZmJpID0gRkIyT0ZCKGZiaSk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgb2ZiaS0+bWlycm9yKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfbWlycm9yKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmYl9pbmZvICpmYmkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmkgPSBGQjJPRkIoZmJpKTsKKwlib29sIG1pcnJvcjsKKwlpbnQgcjsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gbmV3X3ZhcjsKKworCW1pcnJvciA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisKKwlpZiAobWlycm9yICE9IDAgJiYgbWlycm9yICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJbG9ja19mYl9pbmZvKGZiaSk7CisKKwlvZmJpLT5taXJyb3IgPSBtaXJyb3I7CisKKwltZW1jcHkoJm5ld192YXIsICZmYmktPnZhciwgc2l6ZW9mKG5ld192YXIpKTsKKwlyID0gY2hlY2tfZmJfdmFyKGZiaSwgJm5ld192YXIpOworCWlmIChyKQorCQlnb3RvIG91dDsKKwltZW1jcHkoJmZiaS0+dmFyLCAmbmV3X3Zhciwgc2l6ZW9mKGZiaS0+dmFyKSk7CisKKwlzZXRfZmJfZml4KGZiaSk7CisKKwlyID0gb21hcGZiX2FwcGx5X2NoYW5nZXMoZmJpLCAwKTsKKwlpZiAocikKKwkJZ290byBvdXQ7CisKKwlyID0gY291bnQ7CitvdXQ6CisJdW5sb2NrX2ZiX2luZm8oZmJpKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X292ZXJsYXlzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJpID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG9tYXBmYl9pbmZvICpvZmJpID0gRkIyT0ZCKGZiaSk7CisJc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldiA9IG9mYmktPmZiZGV2OworCXNzaXplX3QgbCA9IDA7CisJaW50IHQ7CisKKwlvbWFwZmJfbG9jayhmYmRldik7CisJbG9ja19mYl9pbmZvKGZiaSk7CisKKwlmb3IgKHQgPSAwOyB0IDwgb2ZiaS0+bnVtX292ZXJsYXlzOyB0KyspIHsKKwkJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsID0gb2ZiaS0+b3ZlcmxheXNbdF07CisJCWludCBvdmxudW07CisKKwkJZm9yIChvdmxudW0gPSAwOyBvdmxudW0gPCBmYmRldi0+bnVtX292ZXJsYXlzOyArK292bG51bSkKKwkJCWlmIChvdmwgPT0gZmJkZXYtPm92ZXJsYXlzW292bG51bV0pCisJCQkJYnJlYWs7CisKKwkJbCArPSBzbnByaW50ZihidWYgKyBsLCBQQUdFX1NJWkUgLSBsLCAiJXMlZCIsCisJCQkJdCA9PSAwID8gIiIgOiAiLCIsIG92bG51bSk7CisJfQorCisJbCArPSBzbnByaW50ZihidWYgKyBsLCBQQUdFX1NJWkUgLSBsLCAiXG4iKTsKKworCXVubG9ja19mYl9pbmZvKGZiaSk7CisJb21hcGZiX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gbDsKK30KKworc3RhdGljIHN0cnVjdCBvbWFwZmJfaW5mbyAqZ2V0X292ZXJsYXlfZmIoc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldiwKKwkJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsKQoreworCWludCBpLCB0OworCisJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5udW1fZmJzOyBpKyspIHsKKwkJc3RydWN0IG9tYXBmYl9pbmZvICpvZmJpID0gRkIyT0ZCKGZiZGV2LT5mYnNbaV0pOworCisJCWZvciAodCA9IDA7IHQgPCBvZmJpLT5udW1fb3ZlcmxheXM7IHQrKykgeworCQkJaWYgKG9mYmktPm92ZXJsYXlzW3RdID09IG92bCkKKwkJCQlyZXR1cm4gb2ZiaTsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9vdmVybGF5cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJpID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG9tYXBmYl9pbmZvICpvZmJpID0gRkIyT0ZCKGZiaSk7CisJc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldiA9IG9mYmktPmZiZGV2OworCXN0cnVjdCBvbWFwX292ZXJsYXkgKm92bHNbT01BUEZCX01BWF9PVkxfUEVSX0ZCXTsKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7CisJaW50IG51bV9vdmxzLCByLCBpOworCWludCBsZW47CisJYm9vbCBhZGRlZCA9IGZhbHNlOworCisJbnVtX292bHMgPSAwOworCisJbGVuID0gc3RybGVuKGJ1Zik7CisJaWYgKGJ1ZltsZW4gLSAxXSA9PSAnXG4nKQorCQlsZW4gPSBsZW4gLSAxOworCisJb21hcGZiX2xvY2soZmJkZXYpOworCWxvY2tfZmJfaW5mbyhmYmkpOworCisJaWYgKGxlbiA+IDApIHsKKwkJY2hhciAqcCA9IChjaGFyICopYnVmOworCQlpbnQgb3ZsbnVtOworCisJCXdoaWxlIChwIDwgYnVmICsgbGVuKSB7CisJCQlpbnQgZm91bmQ7CisJCQlpZiAobnVtX292bHMgPT0gT01BUEZCX01BWF9PVkxfUEVSX0ZCKSB7CisJCQkJciA9IC1FSU5WQUw7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCW92bG51bSA9IHNpbXBsZV9zdHJ0b3VsKHAsICZwLCAwKTsKKwkJCWlmIChvdmxudW0gPiBmYmRldi0+bnVtX292ZXJsYXlzKSB7CisJCQkJciA9IC1FSU5WQUw7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWZvdW5kID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCBudW1fb3ZsczsgKytpKSB7CisJCQkJaWYgKG92bHNbaV0gPT0gZmJkZXYtPm92ZXJsYXlzW292bG51bV0pIHsKKwkJCQkJZm91bmQgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmICghZm91bmQpCisJCQkJb3Zsc1tudW1fb3ZscysrXSA9IGZiZGV2LT5vdmVybGF5c1tvdmxudW1dOworCisJCQlwKys7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX292bHM7ICsraSkgeworCQlzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmkyID0gZ2V0X292ZXJsYXlfZmIoZmJkZXYsIG92bHNbaV0pOworCQlpZiAob2ZiaTIgJiYgb2ZiaTIgIT0gb2ZiaSkgeworCQkJZGV2X2VycihmYmRldi0+ZGV2LCAib3ZlcmxheSBhbHJlYWR5IGluIHVzZVxuIik7CisJCQlyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyogZGV0YWNoIHVudXNlZCBvdmVybGF5cyAqLworCWZvciAoaSA9IDA7IGkgPCBvZmJpLT5udW1fb3ZlcmxheXM7ICsraSkgeworCQlpbnQgdCwgZm91bmQ7CisKKwkJb3ZsID0gb2ZiaS0+b3ZlcmxheXNbaV07CisKKwkJZm91bmQgPSAwOworCisJCWZvciAodCA9IDA7IHQgPCBudW1fb3ZsczsgKyt0KSB7CisJCQlpZiAob3ZsID09IG92bHNbdF0pIHsKKwkJCQlmb3VuZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoZm91bmQpCisJCQljb250aW51ZTsKKworCQlEQkcoImRldGFjaGluZyAlZFxuIiwgb2ZiaS0+b3ZlcmxheXNbaV0tPmlkKTsKKworCQlvbWFwZmJfb3ZlcmxheV9lbmFibGUob3ZsLCAwKTsKKworCQlpZiAob3ZsLT5tYW5hZ2VyKQorCQkJb3ZsLT5tYW5hZ2VyLT5hcHBseShvdmwtPm1hbmFnZXIpOworCisJCWZvciAodCA9IGkgKyAxOyB0IDwgb2ZiaS0+bnVtX292ZXJsYXlzOyB0KyspIHsKKwkJCW9mYmktPnJvdGF0aW9uW3QtMV0gPSBvZmJpLT5yb3RhdGlvblt0XTsKKwkJCW9mYmktPm92ZXJsYXlzW3QtMV0gPSBvZmJpLT5vdmVybGF5c1t0XTsKKwkJfQorCisJCW9mYmktPm51bV9vdmVybGF5cy0tOworCQlpLS07CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9vdmxzOyArK2kpIHsKKwkJaW50IHQsIGZvdW5kOworCisJCW92bCA9IG92bHNbaV07CisKKwkJZm91bmQgPSAwOworCisJCWZvciAodCA9IDA7IHQgPCBvZmJpLT5udW1fb3ZlcmxheXM7ICsrdCkgeworCQkJaWYgKG92bCA9PSBvZmJpLT5vdmVybGF5c1t0XSkgeworCQkJCWZvdW5kID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChmb3VuZCkKKwkJCWNvbnRpbnVlOworCQlvZmJpLT5yb3RhdGlvbltvZmJpLT5udW1fb3ZlcmxheXNdID0gMDsKKwkJb2ZiaS0+b3ZlcmxheXNbb2ZiaS0+bnVtX292ZXJsYXlzKytdID0gb3ZsOworCisJCWFkZGVkID0gdHJ1ZTsKKwl9CisKKwlpZiAoYWRkZWQpIHsKKwkJciA9IG9tYXBmYl9hcHBseV9jaGFuZ2VzKGZiaSwgMCk7CisJCWlmIChyKQorCQkJZ290byBvdXQ7CisJfQorCisJciA9IGNvdW50Oworb3V0OgorCXVubG9ja19mYl9pbmZvKGZiaSk7CisJb21hcGZiX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19vdmVybGF5c19yb3RhdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBmYl9pbmZvICpmYmkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmkgPSBGQjJPRkIoZmJpKTsKKwlzc2l6ZV90IGwgPSAwOworCWludCB0OworCisJbG9ja19mYl9pbmZvKGZiaSk7CisKKwlmb3IgKHQgPSAwOyB0IDwgb2ZiaS0+bnVtX292ZXJsYXlzOyB0KyspIHsKKwkJbCArPSBzbnByaW50ZihidWYgKyBsLCBQQUdFX1NJWkUgLSBsLCAiJXMlZCIsCisJCQkJdCA9PSAwID8gIiIgOiAiLCIsIG9mYmktPnJvdGF0aW9uW3RdKTsKKwl9CisKKwlsICs9IHNucHJpbnRmKGJ1ZiArIGwsIFBBR0VfU0laRSAtIGwsICJcbiIpOworCisJdW5sb2NrX2ZiX2luZm8oZmJpKTsKKworCXJldHVybiBsOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9vdmVybGF5c19yb3RhdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGZiX2luZm8gKmZiaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSA9IEZCMk9GQihmYmkpOworCWludCBudW1fb3ZscyA9IDAsIHIsIGk7CisJaW50IGxlbjsKKwlib29sIGNoYW5nZWQgPSBmYWxzZTsKKwl1OCByb3RhdGlvbltPTUFQRkJfTUFYX09WTF9QRVJfRkJdOworCisJbGVuID0gc3RybGVuKGJ1Zik7CisJaWYgKGJ1ZltsZW4gLSAxXSA9PSAnXG4nKQorCQlsZW4gPSBsZW4gLSAxOworCisJbG9ja19mYl9pbmZvKGZiaSk7CisKKwlpZiAobGVuID4gMCkgeworCQljaGFyICpwID0gKGNoYXIgKilidWY7CisKKwkJd2hpbGUgKHAgPCBidWYgKyBsZW4pIHsKKwkJCWludCByb3Q7CisKKwkJCWlmIChudW1fb3ZscyA9PSBvZmJpLT5udW1fb3ZlcmxheXMpIHsKKwkJCQlyID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJcm90ID0gc2ltcGxlX3N0cnRvdWwocCwgJnAsIDApOworCQkJaWYgKHJvdCA8IDAgfHwgcm90ID4gMykgeworCQkJCXIgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlpZiAob2ZiaS0+cm90YXRpb25bbnVtX292bHNdICE9IHJvdCkKKwkJCQljaGFuZ2VkID0gdHJ1ZTsKKworCQkJcm90YXRpb25bbnVtX292bHMrK10gPSByb3Q7CisKKwkJCXArKzsKKwkJfQorCX0KKworCWlmIChudW1fb3ZscyAhPSBvZmJpLT5udW1fb3ZlcmxheXMpIHsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChjaGFuZ2VkKSB7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fb3ZsczsgKytpKQorCQkJb2ZiaS0+cm90YXRpb25baV0gPSByb3RhdGlvbltpXTsKKworCQlyID0gb21hcGZiX2FwcGx5X2NoYW5nZXMoZmJpLCAwKTsKKwkJaWYgKHIpCisJCQlnb3RvIG91dDsKKworCQkvKiBGSVhNRSBlcnJvciBoYW5kbGluZz8gKi8KKwl9CisKKwlyID0gY291bnQ7CitvdXQ6CisJdW5sb2NrX2ZiX2luZm8oZmJpKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3NpemUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBmYl9pbmZvICpmYmkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmkgPSBGQjJPRkIoZmJpKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVsdVxuIiwgb2ZiaS0+cmVnaW9uLnNpemUpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9zaXplKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmYl9pbmZvICpmYmkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmkgPSBGQjJPRkIoZmJpKTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IHI7CisJaW50IGk7CisKKwlzaXplID0gUEFHRV9BTElHTihzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApKTsKKworCWxvY2tfZmJfaW5mbyhmYmkpOworCisJZm9yIChpID0gMDsgaSA8IG9mYmktPm51bV9vdmVybGF5czsgaSsrKSB7CisJCWlmIChvZmJpLT5vdmVybGF5c1tpXS0+aW5mby5lbmFibGVkKSB7CisJCQlyID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoc2l6ZSAhPSBvZmJpLT5yZWdpb24uc2l6ZSkgeworCQlyID0gb21hcGZiX3JlYWxsb2NfZmJtZW0oZmJpLCBzaXplLCBvZmJpLT5yZWdpb24udHlwZSk7CisJCWlmIChyKSB7CisJCQlkZXZfZXJyKGRldiwgInJlYWxsb2MgZmJtZW0gZmFpbGVkXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJciA9IGNvdW50Oworb3V0OgorCXVubG9ja19mYl9pbmZvKGZiaSk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19waHlzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJpID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG9tYXBmYl9pbmZvICpvZmJpID0gRkIyT0ZCKGZiaSk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlMHhcbiIsIG9mYmktPnJlZ2lvbi5wYWRkcik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdmlydChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGZiX2luZm8gKmZiaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSA9IEZCMk9GQihmYmkpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXBcbiIsIG9mYmktPnJlZ2lvbi52YWRkcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBvbWFwZmJfYXR0cnNbXSA9IHsKKwlfX0FUVFIocm90YXRlX3R5cGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3JvdGF0ZV90eXBlLAorCQkJc3RvcmVfcm90YXRlX3R5cGUpLAorCV9fQVRUUihtaXJyb3IsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X21pcnJvciwgc3RvcmVfbWlycm9yKSwKKwlfX0FUVFIoc2l6ZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfc2l6ZSwgc3RvcmVfc2l6ZSksCisJX19BVFRSKG92ZXJsYXlzLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19vdmVybGF5cywgc3RvcmVfb3ZlcmxheXMpLAorCV9fQVRUUihvdmVybGF5c19yb3RhdGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X292ZXJsYXlzX3JvdGF0ZSwKKwkJCXN0b3JlX292ZXJsYXlzX3JvdGF0ZSksCisJX19BVFRSKHBoeXNfYWRkciwgU19JUlVHTywgc2hvd19waHlzLCBOVUxMKSwKKwlfX0FUVFIodmlydF9hZGRyLCBTX0lSVUdPLCBzaG93X3ZpcnQsIE5VTEwpLAorfTsKKworaW50IG9tYXBmYl9jcmVhdGVfc3lzZnMoc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldikKK3sKKwlpbnQgaTsKKwlpbnQgcjsKKworCURCRygiY3JlYXRlIHN5c2ZzIGZvciBmYnNcbiIpOworCWZvciAoaSA9IDA7IGkgPCBmYmRldi0+bnVtX2ZiczsgaSsrKSB7CisJCWludCB0OworCQlmb3IgKHQgPSAwOyB0IDwgQVJSQVlfU0laRShvbWFwZmJfYXR0cnMpOyB0KyspIHsKKwkJCXIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZmJkZXYtPmZic1tpXS0+ZGV2LAorCQkJCQkmb21hcGZiX2F0dHJzW3RdKTsKKworCQkJaWYgKHIpIHsKKwkJCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzICIKKwkJCQkJCSJmaWxlXG4iKTsKKwkJCQlyZXR1cm4gcjsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCit2b2lkIG9tYXBmYl9yZW1vdmVfc3lzZnMoc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldikKK3sKKwlpbnQgaSwgdDsKKworCURCRygicmVtb3ZlIHN5c2ZzIGZvciBmYnNcbiIpOworCWZvciAoaSA9IDA7IGkgPCBmYmRldi0+bnVtX2ZiczsgaSsrKSB7CisJCWZvciAodCA9IDA7IHQgPCBBUlJBWV9TSVpFKG9tYXBmYl9hdHRycyk7IHQrKykKKwkJCWRldmljZV9yZW1vdmVfZmlsZShmYmRldi0+ZmJzW2ldLT5kZXYsCisJCQkJCSZvbWFwZmJfYXR0cnNbdF0pOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLmggYi9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2M5YzczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IFRvbWkgVmFsa2VpbmVuIDx0b21pLnZhbGtlaW5lbkBub2tpYS5jb20+CisgKgorICogU29tZSBjb2RlIGFuZCBpZGVhcyB0YWtlbiBmcm9tIGRyaXZlcnMvdmlkZW8vb21hcC8gZHJpdmVyCisgKiBieSBJbXJlIERlYWsuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fRFJJVkVSU19WSURFT19PTUFQMl9PTUFQRkJfSF9fCisjZGVmaW5lIF9fRFJJVkVSU19WSURFT19PTUFQMl9PTUFQRkJfSF9fCisKKyNpZmRlZiBDT05GSUdfRkJfT01BUDJfREVCVUdfU1VQUE9SVAorI2RlZmluZSBERUJVRworI2VuZGlmCisKKyNpbmNsdWRlIDxwbGF0L2Rpc3BsYXkuaD4KKworI2lmZGVmIERFQlVHCitleHRlcm4gdW5zaWduZWQgaW50IG9tYXBmYl9kZWJ1ZzsKKyNkZWZpbmUgREJHKGZvcm1hdCwgLi4uKSBcCisJaWYgKG9tYXBmYl9kZWJ1ZykgXAorCQlwcmludGsoS0VSTl9ERUJVRyAiT01BUEZCOiAiIGZvcm1hdCwgIyMgX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBEQkcoZm9ybWF0LCAuLi4pCisjZW5kaWYKKworI2RlZmluZSBGQjJPRkIoZmJfaW5mbykgKChzdHJ1Y3Qgb21hcGZiX2luZm8gKikoZmJfaW5mby0+cGFyKSkKKworLyogbWF4IG51bWJlciBvZiBvdmVybGF5cyB0byB3aGljaCBhIGZyYW1lYnVmZmVyIGRhdGEgY2FuIGJlIGRpcmVjdCAqLworI2RlZmluZSBPTUFQRkJfTUFYX09WTF9QRVJfRkIgMworCitzdHJ1Y3Qgb21hcGZiMl9tZW1fcmVnaW9uIHsKKwl1MzIJCXBhZGRyOworCXZvaWQgX19pb21lbQkqdmFkZHI7CisJc3RydWN0IHZyZmIJdnJmYjsKKwl1bnNpZ25lZCBsb25nCXNpemU7CisJdTgJCXR5cGU7CQkvKiBPTUFQRkJfUExBTkVfTUVNXyogKi8KKwlib29sCQlhbGxvYzsJCS8qIGFsbG9jYXRlZCBieSB0aGUgZHJpdmVyICovCisJYm9vbAkJbWFwOwkJLyoga2VybmVsIG1hcHBlZCBieSB0aGUgZHJpdmVyICovCit9OworCisvKiBhcHBlbmRlZCB0byBmYl9pbmZvICovCitzdHJ1Y3Qgb21hcGZiX2luZm8geworCWludCBpZDsKKwlzdHJ1Y3Qgb21hcGZiMl9tZW1fcmVnaW9uIHJlZ2lvbjsKKwlhdG9taWNfdCBtYXBfY291bnQ7CisJaW50IG51bV9vdmVybGF5czsKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmVybGF5c1tPTUFQRkJfTUFYX09WTF9QRVJfRkJdOworCXN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXY7CisJZW51bSBvbWFwX2Rzc19yb3RhdGlvbl90eXBlIHJvdGF0aW9uX3R5cGU7CisJdTggcm90YXRpb25bT01BUEZCX01BWF9PVkxfUEVSX0ZCXTsKKwlib29sIG1pcnJvcjsKK307CisKK3N0cnVjdCBvbWFwZmIyX2RldmljZSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBtdXRleCAgbXR4OworCisJdTMyIHBzZXVkb19wYWxldHRlWzE3XTsKKworCWludCBzdGF0ZTsKKworCXVuc2lnbmVkIG51bV9mYnM7CisJc3RydWN0IGZiX2luZm8gKmZic1sxMF07CisKKwl1bnNpZ25lZCBudW1fZGlzcGxheXM7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheXNbMTBdOworCXVuc2lnbmVkIG51bV9vdmVybGF5czsKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmVybGF5c1sxMF07CisJdW5zaWduZWQgbnVtX21hbmFnZXJzOworCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWFuYWdlcnNbMTBdOworfTsKKworc3RydWN0IG9tYXBmYl9jb2xvcm1vZGUgeworCWVudW0gb21hcF9jb2xvcl9tb2RlIGRzc21vZGU7CisJdTMyIGJpdHNfcGVyX3BpeGVsOworCXUzMiBub25zdGQ7CisJc3RydWN0IGZiX2JpdGZpZWxkIHJlZDsKKwlzdHJ1Y3QgZmJfYml0ZmllbGQgZ3JlZW47CisJc3RydWN0IGZiX2JpdGZpZWxkIGJsdWU7CisJc3RydWN0IGZiX2JpdGZpZWxkIHRyYW5zcDsKK307CisKK3ZvaWQgc2V0X2ZiX2ZpeChzdHJ1Y3QgZmJfaW5mbyAqZmJpKTsKK2ludCBjaGVja19mYl92YXIoc3RydWN0IGZiX2luZm8gKmZiaSwgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpOworaW50IG9tYXBmYl9yZWFsbG9jX2ZibWVtKHN0cnVjdCBmYl9pbmZvICpmYmksIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IHR5cGUpOworaW50IG9tYXBmYl9hcHBseV9jaGFuZ2VzKHN0cnVjdCBmYl9pbmZvICpmYmksIGludCBpbml0KTsKKworaW50IG9tYXBmYl9jcmVhdGVfc3lzZnMoc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldik7Cit2b2lkIG9tYXBmYl9yZW1vdmVfc3lzZnMoc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldik7CisKK2ludCBvbWFwZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmZiaSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCitpbnQgZHNzX21vZGVfdG9fZmJfbW9kZShlbnVtIG9tYXBfY29sb3JfbW9kZSBkc3Ntb2RlLAorCQkJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpOworCisvKiBmaW5kIHRoZSBkaXNwbGF5IGNvbm5lY3RlZCB0byB0aGlzIGZiLCBpZiBhbnkgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZmIyZGlzcGxheShzdHJ1Y3QgZmJfaW5mbyAqZmJpKQoreworCXN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSA9IEZCMk9GQihmYmkpOworCWludCBpOworCisJLyogWFhYOiByZXR1cm5zIHRoZSBkaXNwbGF5IGNvbm5lY3RlZCB0byBmaXJzdCBhdHRhY2hlZCBvdmVybGF5ICovCisJZm9yIChpID0gMDsgaSA8IG9mYmktPm51bV9vdmVybGF5czsgaSsrKSB7CisJCWlmIChvZmJpLT5vdmVybGF5c1tpXS0+bWFuYWdlcikKKwkJCXJldHVybiBvZmJpLT5vdmVybGF5c1tpXS0+bWFuYWdlci0+ZGV2aWNlOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcGZiX2xvY2soc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldikKK3sKKwltdXRleF9sb2NrKCZmYmRldi0+bXR4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG9tYXBmYl91bmxvY2soc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldikKK3sKKwltdXRleF91bmxvY2soJmZiZGV2LT5tdHgpOworfQorCitzdGF0aWMgaW5saW5lIGludCBvbWFwZmJfb3ZlcmxheV9lbmFibGUoc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsLAorCQlpbnQgZW5hYmxlKQoreworCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyBpbmZvOworCisJb3ZsLT5nZXRfb3ZlcmxheV9pbmZvKG92bCwgJmluZm8pOworCWluZm8uZW5hYmxlZCA9IGVuYWJsZTsKKwlyZXR1cm4gb3ZsLT5zZXRfb3ZlcmxheV9pbmZvKG92bCwgJmluZm8pOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvdnJhbS5jIGIvZHJpdmVycy92aWRlby9vbWFwMi92cmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhNGRlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvdnJhbS5jCkBAIC0wLDAgKzEsNjU1IEBACisvKgorICogVlJBTSBtYW5hZ2VyIGZvciBPTUFQCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IFRvbWkgVmFsa2VpbmVuIDx0b21pLnZhbGtlaW5lbkBub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyojZGVmaW5lIERFQlVHKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisKKyNpbmNsdWRlIDxwbGF0L3NyYW0uaD4KKyNpbmNsdWRlIDxwbGF0L3ZyYW0uaD4KKyNpbmNsdWRlIDxwbGF0L2RtYS5oPgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREJHKGZvcm1hdCwgLi4uKSBwcl9kZWJ1ZygiVlJBTTogIiBmb3JtYXQsICMjIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgREJHKGZvcm1hdCwgLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgT01BUDJfU1JBTV9TVEFSVAkJMHg0MDIwMDAwMAorLyogTWF4aW11bSBzaXplLCBpbiByZWFsaXR5IHRoaXMgaXMgc21hbGxlciBpZiBTUkFNIGlzIHBhcnRpYWxseSBsb2NrZWQuICovCisjZGVmaW5lIE9NQVAyX1NSQU1fU0laRQkJCTB4YTAwMDAJCS8qIDY0MGsgKi8KKworLyogcG9zdHBvbmVkIHJlZ2lvbnMgYXJlIHVzZWQgdG8gdGVtcG9yYXJpbHkgc3RvcmUgcmVnaW9uIGluZm9ybWF0aW9uIGF0IGJvb3QKKyAqIHRpbWUgd2hlbiB3ZSBjYW5ub3QgeWV0IGFsbG9jYXRlIHRoZSByZWdpb24gbGlzdCAqLworI2RlZmluZSBNQVhfUE9TVFBPTkVEX1JFR0lPTlMgMTAKKworc3RhdGljIGJvb2wgdnJhbV9pbml0aWFsaXplZDsKK3N0YXRpYyBpbnQgcG9zdHBvbmVkX2NudDsKK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgcGFkZHI7CisJc2l6ZV90IHNpemU7Cit9IHBvc3Rwb25lZF9yZWdpb25zW01BWF9QT1NUUE9ORURfUkVHSU9OU107CisKK3N0cnVjdCB2cmFtX2FsbG9jIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdW5zaWduZWQgbG9uZyBwYWRkcjsKKwl1bnNpZ25lZCBwYWdlczsKK307CisKK3N0cnVjdCB2cmFtX3JlZ2lvbiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBsaXN0X2hlYWQgYWxsb2NfbGlzdDsKKwl1bnNpZ25lZCBsb25nIHBhZGRyOworCXVuc2lnbmVkIHBhZ2VzOworfTsKKworc3RhdGljIERFRklORV9NVVRFWChyZWdpb25fbXV0ZXgpOworc3RhdGljIExJU1RfSEVBRChyZWdpb25fbGlzdCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlZ2lvbl9tZW1fdHlwZSh1bnNpZ25lZCBsb25nIHBhZGRyKQoreworCWlmIChwYWRkciA+PSBPTUFQMl9TUkFNX1NUQVJUICYmCisJICAgIHBhZGRyIDwgT01BUDJfU1JBTV9TVEFSVCArIE9NQVAyX1NSQU1fU0laRSkKKwkJcmV0dXJuIE9NQVBfVlJBTV9NRU1UWVBFX1NSQU07CisJZWxzZQorCQlyZXR1cm4gT01BUF9WUkFNX01FTVRZUEVfU0RSQU07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdnJhbV9yZWdpb24gKm9tYXBfdnJhbV9jcmVhdGVfcmVnaW9uKHVuc2lnbmVkIGxvbmcgcGFkZHIsCisJCXVuc2lnbmVkIHBhZ2VzKQoreworCXN0cnVjdCB2cmFtX3JlZ2lvbiAqcm07CisKKwlybSA9IGt6YWxsb2Moc2l6ZW9mKCpybSksIEdGUF9LRVJORUwpOworCisJaWYgKHJtKSB7CisJCUlOSVRfTElTVF9IRUFEKCZybS0+YWxsb2NfbGlzdCk7CisJCXJtLT5wYWRkciA9IHBhZGRyOworCQlybS0+cGFnZXMgPSBwYWdlczsKKwl9CisKKwlyZXR1cm4gcm07Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBvbWFwX3ZyYW1fZnJlZV9yZWdpb24oc3RydWN0IHZyYW1fcmVnaW9uICp2cikKK3sKKwlsaXN0X2RlbCgmdnItPmxpc3QpOworCWtmcmVlKHZyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHZyYW1fYWxsb2MgKm9tYXBfdnJhbV9jcmVhdGVfYWxsb2NhdGlvbihzdHJ1Y3QgdnJhbV9yZWdpb24gKnZyLAorCQl1bnNpZ25lZCBsb25nIHBhZGRyLCB1bnNpZ25lZCBwYWdlcykKK3sKKwlzdHJ1Y3QgdnJhbV9hbGxvYyAqdmE7CisJc3RydWN0IHZyYW1fYWxsb2MgKm5ldzsKKworCW5ldyA9IGt6YWxsb2Moc2l6ZW9mKCp2YSksIEdGUF9LRVJORUwpOworCisJaWYgKCFuZXcpCisJCXJldHVybiBOVUxMOworCisJbmV3LT5wYWRkciA9IHBhZGRyOworCW5ldy0+cGFnZXMgPSBwYWdlczsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodmEsICZ2ci0+YWxsb2NfbGlzdCwgbGlzdCkgeworCQlpZiAodmEtPnBhZGRyID4gbmV3LT5wYWRkcikKKwkJCWJyZWFrOworCX0KKworCWxpc3RfYWRkX3RhaWwoJm5ldy0+bGlzdCwgJnZhLT5saXN0KTsKKworCXJldHVybiBuZXc7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfdnJhbV9mcmVlX2FsbG9jYXRpb24oc3RydWN0IHZyYW1fYWxsb2MgKnZhKQoreworCWxpc3RfZGVsKCZ2YS0+bGlzdCk7CisJa2ZyZWUodmEpOworfQorCitpbnQgb21hcF92cmFtX2FkZF9yZWdpb24odW5zaWduZWQgbG9uZyBwYWRkciwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHZyYW1fcmVnaW9uICpybTsKKwl1bnNpZ25lZCBwYWdlczsKKworCWlmICh2cmFtX2luaXRpYWxpemVkKSB7CisJCURCRygiYWRkaW5nIHJlZ2lvbiBwYWRkciAlMDhseCBzaXplICVkXG4iLAorCQkJCXBhZGRyLCBzaXplKTsKKworCQlzaXplICY9IFBBR0VfTUFTSzsKKwkJcGFnZXMgPSBzaXplID4+IFBBR0VfU0hJRlQ7CisKKwkJcm0gPSBvbWFwX3ZyYW1fY3JlYXRlX3JlZ2lvbihwYWRkciwgcGFnZXMpOworCQlpZiAocm0gPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWxpc3RfYWRkKCZybS0+bGlzdCwgJnJlZ2lvbl9saXN0KTsKKwl9IGVsc2UgeworCQlpZiAocG9zdHBvbmVkX2NudCA9PSBNQVhfUE9TVFBPTkVEX1JFR0lPTlMpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlwb3N0cG9uZWRfcmVnaW9uc1twb3N0cG9uZWRfY250XS5wYWRkciA9IHBhZGRyOworCQlwb3N0cG9uZWRfcmVnaW9uc1twb3N0cG9uZWRfY250XS5zaXplID0gc2l6ZTsKKworCQkrK3Bvc3Rwb25lZF9jbnQ7CisJfQorCXJldHVybiAwOworfQorCitpbnQgb21hcF92cmFtX2ZyZWUodW5zaWduZWQgbG9uZyBwYWRkciwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHZyYW1fcmVnaW9uICpybTsKKwlzdHJ1Y3QgdnJhbV9hbGxvYyAqYWxsb2M7CisJdW5zaWduZWQgc3RhcnQsIGVuZDsKKworCURCRygiZnJlZSBtZW0gcGFkZHIgJTA4bHggc2l6ZSAlZFxuIiwgcGFkZHIsIHNpemUpOworCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisKKwltdXRleF9sb2NrKCZyZWdpb25fbXV0ZXgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShybSwgJnJlZ2lvbl9saXN0LCBsaXN0KSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYWxsb2MsICZybS0+YWxsb2NfbGlzdCwgbGlzdCkgeworCQkJc3RhcnQgPSBhbGxvYy0+cGFkZHI7CisJCQllbmQgPSBhbGxvYy0+cGFkZHIgKyAoYWxsb2MtPnBhZ2VzID4+IFBBR0VfU0hJRlQpOworCisJCQlpZiAoc3RhcnQgPj0gcGFkZHIgJiYgZW5kIDwgcGFkZHIgKyBzaXplKQorCQkJCWdvdG8gZm91bmQ7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJnJlZ2lvbl9tdXRleCk7CisJcmV0dXJuIC1FSU5WQUw7CisKK2ZvdW5kOgorCW9tYXBfdnJhbV9mcmVlX2FsbG9jYXRpb24oYWxsb2MpOworCisJbXV0ZXhfdW5sb2NrKCZyZWdpb25fbXV0ZXgpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChvbWFwX3ZyYW1fZnJlZSk7CisKK3N0YXRpYyBpbnQgX29tYXBfdnJhbV9yZXNlcnZlKHVuc2lnbmVkIGxvbmcgcGFkZHIsIHVuc2lnbmVkIHBhZ2VzKQoreworCXN0cnVjdCB2cmFtX3JlZ2lvbiAqcm07CisJc3RydWN0IHZyYW1fYWxsb2MgKmFsbG9jOworCXNpemVfdCBzaXplOworCisJc2l6ZSA9IHBhZ2VzIDw8IFBBR0VfU0hJRlQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJtLCAmcmVnaW9uX2xpc3QsIGxpc3QpIHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOworCisJCURCRygiY2hlY2tpbmcgcmVnaW9uICVseCAlZFxuIiwgcm0tPnBhZGRyLCBybS0+cGFnZXMpOworCisJCWlmIChyZWdpb25fbWVtX3R5cGUocm0tPnBhZGRyKSAhPSByZWdpb25fbWVtX3R5cGUocGFkZHIpKQorCQkJY29udGludWU7CisKKwkJc3RhcnQgPSBybS0+cGFkZHI7CisJCWVuZCA9IHN0YXJ0ICsgKHJtLT5wYWdlcyA8PCBQQUdFX1NISUZUKSAtIDE7CisJCWlmIChzdGFydCA+IHBhZGRyIHx8IGVuZCA8IHBhZGRyICsgc2l6ZSAtIDEpCisJCQljb250aW51ZTsKKworCQlEQkcoImJsb2NrIG9rLCBjaGVja2luZyBhbGxvY3NcbiIpOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYWxsb2MsICZybS0+YWxsb2NfbGlzdCwgbGlzdCkgeworCQkJZW5kID0gYWxsb2MtPnBhZGRyIC0gMTsKKworCQkJaWYgKHN0YXJ0IDw9IHBhZGRyICYmIGVuZCA+PSBwYWRkciArIHNpemUgLSAxKQorCQkJCWdvdG8gZm91bmQ7CisKKwkJCXN0YXJ0ID0gYWxsb2MtPnBhZGRyICsgKGFsbG9jLT5wYWdlcyA8PCBQQUdFX1NISUZUKTsKKwkJfQorCisJCWVuZCA9IHJtLT5wYWRkciArIChybS0+cGFnZXMgPDwgUEFHRV9TSElGVCkgLSAxOworCisJCWlmICghKHN0YXJ0IDw9IHBhZGRyICYmIGVuZCA+PSBwYWRkciArIHNpemUgLSAxKSkKKwkJCWNvbnRpbnVlOworZm91bmQ6CisJCURCRygiZm91bmQgYXJlYSBzdGFydCAlbHgsIGVuZCAlbHhcbiIsIHN0YXJ0LCBlbmQpOworCisJCWlmIChvbWFwX3ZyYW1fY3JlYXRlX2FsbG9jYXRpb24ocm0sIHBhZGRyLCBwYWdlcykgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRU5PTUVNOworfQorCitpbnQgb21hcF92cmFtX3Jlc2VydmUodW5zaWduZWQgbG9uZyBwYWRkciwgc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgcGFnZXM7CisJaW50IHI7CisKKwlEQkcoInJlc2VydmUgbWVtIHBhZGRyICUwOGx4IHNpemUgJWRcbiIsIHBhZGRyLCBzaXplKTsKKworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCXBhZ2VzID0gc2l6ZSA+PiBQQUdFX1NISUZUOworCisJbXV0ZXhfbG9jaygmcmVnaW9uX211dGV4KTsKKworCXIgPSBfb21hcF92cmFtX3Jlc2VydmUocGFkZHIsIHBhZ2VzKTsKKworCW11dGV4X3VubG9jaygmcmVnaW9uX211dGV4KTsKKworCXJldHVybiByOworfQorRVhQT1JUX1NZTUJPTChvbWFwX3ZyYW1fcmVzZXJ2ZSk7CisKK3N0YXRpYyB2b2lkIF9vbWFwX3ZyYW1fZG1hX2NiKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNvbXBsZXRpb24gKmNvbXBsID0gZGF0YTsKKwljb21wbGV0ZShjb21wbCk7Cit9CisKK3N0YXRpYyBpbnQgX29tYXBfdnJhbV9jbGVhcih1MzIgcGFkZHIsIHVuc2lnbmVkIHBhZ2VzKQoreworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsOworCXVuc2lnbmVkIGVsZW1fY291bnQ7CisJdW5zaWduZWQgZnJhbWVfY291bnQ7CisJaW50IHI7CisJaW50IGxjaDsKKworCWluaXRfY29tcGxldGlvbigmY29tcGwpOworCisJciA9IG9tYXBfcmVxdWVzdF9kbWEoT01BUF9ETUFfTk9fREVWSUNFLCAiVlJBTSBETUEiLAorCQkJX29tYXBfdnJhbV9kbWFfY2IsCisJCQkmY29tcGwsICZsY2gpOworCWlmIChyKSB7CisJCXByX2VycigiVlJBTTogcmVxdWVzdF9kbWEgZmFpbGVkIGZvciBtZW1vcnkgY2xlYXJcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWVsZW1fY291bnQgPSBwYWdlcyAqIFBBR0VfU0laRSAvIDQ7CisJZnJhbWVfY291bnQgPSAxOworCisJb21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyhsY2gsIE9NQVBfRE1BX0RBVEFfVFlQRV9TMzIsCisJCQllbGVtX2NvdW50LCBmcmFtZV9jb3VudCwKKwkJCU9NQVBfRE1BX1NZTkNfRUxFTUVOVCwKKwkJCTAsIDApOworCisJb21hcF9zZXRfZG1hX2Rlc3RfcGFyYW1zKGxjaCwgMCwgT01BUF9ETUFfQU1PREVfUE9TVF9JTkMsCisJCQlwYWRkciwgMCwgMCk7CisKKwlvbWFwX3NldF9kbWFfY29sb3JfbW9kZShsY2gsIE9NQVBfRE1BX0NPTlNUQU5UX0ZJTEwsIDB4MDAwMDAwKTsKKworCW9tYXBfc3RhcnRfZG1hKGxjaCk7CisKKwlpZiAod2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjb21wbCwgbXNlY3NfdG9famlmZmllcygxMDAwKSkgPT0gMCkgeworCQlvbWFwX3N0b3BfZG1hKGxjaCk7CisJCXByX2VycigiVlJBTTogZG1hIHRpbWVvdXQgd2hpbGUgY2xlYXJpbmcgbWVtb3J5XG4iKTsKKwkJciA9IC1FSU87CisJCWdvdG8gZXJyOworCX0KKworCXIgPSAwOworZXJyOgorCW9tYXBfZnJlZV9kbWEobGNoKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9vbWFwX3ZyYW1fYWxsb2MoaW50IG10eXBlLCB1bnNpZ25lZCBwYWdlcywgdW5zaWduZWQgbG9uZyAqcGFkZHIpCit7CisJc3RydWN0IHZyYW1fcmVnaW9uICpybTsKKwlzdHJ1Y3QgdnJhbV9hbGxvYyAqYWxsb2M7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJtLCAmcmVnaW9uX2xpc3QsIGxpc3QpIHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOworCisJCURCRygiY2hlY2tpbmcgcmVnaW9uICVseCAlZFxuIiwgcm0tPnBhZGRyLCBybS0+cGFnZXMpOworCisJCWlmIChyZWdpb25fbWVtX3R5cGUocm0tPnBhZGRyKSAhPSBtdHlwZSkKKwkJCWNvbnRpbnVlOworCisJCXN0YXJ0ID0gcm0tPnBhZGRyOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYWxsb2MsICZybS0+YWxsb2NfbGlzdCwgbGlzdCkgeworCQkJZW5kID0gYWxsb2MtPnBhZGRyOworCisJCQlpZiAoZW5kIC0gc3RhcnQgPj0gcGFnZXMgPDwgUEFHRV9TSElGVCkKKwkJCQlnb3RvIGZvdW5kOworCisJCQlzdGFydCA9IGFsbG9jLT5wYWRkciArIChhbGxvYy0+cGFnZXMgPDwgUEFHRV9TSElGVCk7CisJCX0KKworCQllbmQgPSBybS0+cGFkZHIgKyAocm0tPnBhZ2VzIDw8IFBBR0VfU0hJRlQpOworZm91bmQ6CisJCWlmIChlbmQgLSBzdGFydCA8IHBhZ2VzIDw8IFBBR0VfU0hJRlQpCisJCQljb250aW51ZTsKKworCQlEQkcoImZvdW5kICVseCwgZW5kICVseFxuIiwgc3RhcnQsIGVuZCk7CisKKwkJYWxsb2MgPSBvbWFwX3ZyYW1fY3JlYXRlX2FsbG9jYXRpb24ocm0sIHN0YXJ0LCBwYWdlcyk7CisJCWlmIChhbGxvYyA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJKnBhZGRyID0gc3RhcnQ7CisKKwkJX29tYXBfdnJhbV9jbGVhcihzdGFydCwgcGFnZXMpOworCisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRU5PTUVNOworfQorCitpbnQgb21hcF92cmFtX2FsbG9jKGludCBtdHlwZSwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGxvbmcgKnBhZGRyKQoreworCXVuc2lnbmVkIHBhZ2VzOworCWludCByOworCisJQlVHX09OKG10eXBlID4gT01BUF9WUkFNX01FTVRZUEVfTUFYIHx8ICFzaXplKTsKKworCURCRygiYWxsb2MgbWVtIHR5cGUgJWQgc2l6ZSAlZFxuIiwgbXR5cGUsIHNpemUpOworCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisJcGFnZXMgPSBzaXplID4+IFBBR0VfU0hJRlQ7CisKKwltdXRleF9sb2NrKCZyZWdpb25fbXV0ZXgpOworCisJciA9IF9vbWFwX3ZyYW1fYWxsb2MobXR5cGUsIHBhZ2VzLCBwYWRkcik7CisKKwltdXRleF91bmxvY2soJnJlZ2lvbl9tdXRleCk7CisKKwlyZXR1cm4gcjsKK30KK0VYUE9SVF9TWU1CT0wob21hcF92cmFtX2FsbG9jKTsKKwordm9pZCBvbWFwX3ZyYW1fZ2V0X2luZm8odW5zaWduZWQgbG9uZyAqdnJhbSwKKwkJdW5zaWduZWQgbG9uZyAqZnJlZV92cmFtLAorCQl1bnNpZ25lZCBsb25nICpsYXJnZXN0X2ZyZWVfYmxvY2spCit7CisJc3RydWN0IHZyYW1fcmVnaW9uICp2cjsKKwlzdHJ1Y3QgdnJhbV9hbGxvYyAqdmE7CisKKwkqdnJhbSA9IDA7CisJKmZyZWVfdnJhbSA9IDA7CisJKmxhcmdlc3RfZnJlZV9ibG9jayA9IDA7CisKKwltdXRleF9sb2NrKCZyZWdpb25fbXV0ZXgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2ciwgJnJlZ2lvbl9saXN0LCBsaXN0KSB7CisJCXVuc2lnbmVkIGZyZWU7CisJCXVuc2lnbmVkIGxvbmcgcGE7CisKKwkJcGEgPSB2ci0+cGFkZHI7CisJCSp2cmFtICs9IHZyLT5wYWdlcyA8PCBQQUdFX1NISUZUOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkodmEsICZ2ci0+YWxsb2NfbGlzdCwgbGlzdCkgeworCQkJZnJlZSA9IHZhLT5wYWRkciAtIHBhOworCQkJKmZyZWVfdnJhbSArPSBmcmVlOworCQkJaWYgKGZyZWUgPiAqbGFyZ2VzdF9mcmVlX2Jsb2NrKQorCQkJCSpsYXJnZXN0X2ZyZWVfYmxvY2sgPSBmcmVlOworCQkJcGEgPSB2YS0+cGFkZHIgKyAodmEtPnBhZ2VzIDw8IFBBR0VfU0hJRlQpOworCQl9CisKKwkJZnJlZSA9IHZyLT5wYWRkciArICh2ci0+cGFnZXMgPDwgUEFHRV9TSElGVCkgLSBwYTsKKwkJKmZyZWVfdnJhbSArPSBmcmVlOworCQlpZiAoZnJlZSA+ICpsYXJnZXN0X2ZyZWVfYmxvY2spCisJCQkqbGFyZ2VzdF9mcmVlX2Jsb2NrID0gZnJlZTsKKwl9CisKKwltdXRleF91bmxvY2soJnJlZ2lvbl9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfdnJhbV9nZXRfaW5mbyk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykKK3N0YXRpYyBpbnQgdnJhbV9kZWJ1Z19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdW51c2VkKQoreworCXN0cnVjdCB2cmFtX3JlZ2lvbiAqdnI7CisJc3RydWN0IHZyYW1fYWxsb2MgKnZhOworCXVuc2lnbmVkIHNpemU7CisKKwltdXRleF9sb2NrKCZyZWdpb25fbXV0ZXgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2ciwgJnJlZ2lvbl9saXN0LCBsaXN0KSB7CisJCXNpemUgPSB2ci0+cGFnZXMgPDwgUEFHRV9TSElGVDsKKwkJc2VxX3ByaW50ZihzLCAiJTA4bHgtJTA4bHggKCVkIGJ5dGVzKVxuIiwKKwkJCQl2ci0+cGFkZHIsIHZyLT5wYWRkciArIHNpemUgLSAxLAorCQkJCXNpemUpOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkodmEsICZ2ci0+YWxsb2NfbGlzdCwgbGlzdCkgeworCQkJc2l6ZSA9IHZhLT5wYWdlcyA8PCBQQUdFX1NISUZUOworCQkJc2VxX3ByaW50ZihzLCAiICAgICUwOGx4LSUwOGx4ICglZCBieXRlcylcbiIsCisJCQkJCXZhLT5wYWRkciwgdmEtPnBhZGRyICsgc2l6ZSAtIDEsCisJCQkJCXNpemUpOworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZyZWdpb25fbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnJhbV9kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCB2cmFtX2RlYnVnX3Nob3csIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2cmFtX2RlYnVnX2ZvcHMgPSB7CisJLm9wZW4gICAgICAgICAgID0gdnJhbV9kZWJ1Z19vcGVuLAorCS5yZWFkICAgICAgICAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgICAgICAgICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSAgICAgICAgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfdnJhbV9jcmVhdGVfZGVidWdmcyh2b2lkKQoreworCXN0cnVjdCBkZW50cnkgKmQ7CisKKwlkID0gZGVidWdmc19jcmVhdGVfZmlsZSgidnJhbSIsIFNfSVJVR08sIE5VTEwsCisJCQlOVUxMLCAmdnJhbV9kZWJ1Z19mb3BzKTsKKwlpZiAoSVNfRVJSKGQpKQorCQlyZXR1cm4gUFRSX0VSUihkKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBfX2luaXQgaW50IG9tYXBfdnJhbV9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwl2cmFtX2luaXRpYWxpemVkID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBwb3N0cG9uZWRfY250OyBpKyspCisJCW9tYXBfdnJhbV9hZGRfcmVnaW9uKHBvc3Rwb25lZF9yZWdpb25zW2ldLnBhZGRyLAorCQkJCXBvc3Rwb25lZF9yZWdpb25zW2ldLnNpemUpOworCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisJaWYgKG9tYXBfdnJhbV9jcmVhdGVfZGVidWdmcygpKQorCQlwcl9lcnIoIlZSQU06IEZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBmaWxlXG4iKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwob21hcF92cmFtX2luaXQpOworCisvKiBib290dGltZSB2cmFtIGFsbG9jIHN0dWZmICovCisKKy8qIHNldCBmcm9tIGJvYXJkIGZpbGUgKi8KK3N0YXRpYyB1MzIgb21hcF92cmFtX3NyYW1fc3RhcnQgX19pbml0ZGF0YTsKK3N0YXRpYyB1MzIgb21hcF92cmFtX3NyYW1fc2l6ZSBfX2luaXRkYXRhOworCisvKiBzZXQgZnJvbSBib2FyZCBmaWxlICovCitzdGF0aWMgdTMyIG9tYXBfdnJhbV9zZHJhbV9zdGFydCBfX2luaXRkYXRhOworc3RhdGljIHUzMiBvbWFwX3ZyYW1fc2RyYW1fc2l6ZSBfX2luaXRkYXRhOworCisvKiBzZXQgZnJvbSBrZXJuZWwgY21kbGluZSAqLworc3RhdGljIHUzMiBvbWFwX3ZyYW1fZGVmX3NkcmFtX3NpemUgX19pbml0ZGF0YTsKK3N0YXRpYyB1MzIgb21hcF92cmFtX2RlZl9zZHJhbV9zdGFydCBfX2luaXRkYXRhOworCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcF92cmFtX2Vhcmx5X3ZyYW0oY2hhciAqKnApCit7CisJb21hcF92cmFtX2RlZl9zZHJhbV9zaXplID0gbWVtcGFyc2UoKnAsIHApOworCWlmICgqKnAgPT0gJywnKQorCQlvbWFwX3ZyYW1fZGVmX3NkcmFtX3N0YXJ0ID0gc2ltcGxlX3N0cnRvdWwoKCpwKSArIDEsIHAsIDE2KTsKK30KK19fZWFybHlfcGFyYW0oInZyYW09Iiwgb21hcF92cmFtX2Vhcmx5X3ZyYW0pOworCisvKgorICogQ2FsbGVkIGZyb20gbWFwX2lvLiBXZSBuZWVkIHRvIGNhbGwgdG8gdGhpcyBlYXJseSBlbm91Z2ggc28gdGhhdCB3ZQorICogY2FuIHJlc2VydmUgdGhlIGZpeGVkIFNEUkFNIHJlZ2lvbnMgYmVmb3JlIFZNIGNvdWxkIGdldCBob2xkIG9mIHRoZW0uCisgKi8KK3ZvaWQgX19pbml0IG9tYXBfdnJhbV9yZXNlcnZlX3NkcmFtKHZvaWQpCit7CisJc3RydWN0IGJvb3RtZW1fZGF0YQkqYmRhdGE7CisJdW5zaWduZWQgbG9uZwkJc2RyYW1fc3RhcnQsIHNkcmFtX3NpemU7CisJdTMyIHBhZGRyOworCXUzMiBzaXplID0gMDsKKworCS8qIGNtZGxpbmUgYXJnIG92ZXJyaWRlcyB0aGUgYm9hcmQgZmlsZSBkZWZpbml0aW9uICovCisJaWYgKG9tYXBfdnJhbV9kZWZfc2RyYW1fc2l6ZSkgeworCQlzaXplID0gb21hcF92cmFtX2RlZl9zZHJhbV9zaXplOworCQlwYWRkciA9IG9tYXBfdnJhbV9kZWZfc2RyYW1fc3RhcnQ7CisJfQorCisJaWYgKCFzaXplKSB7CisJCXNpemUgPSBvbWFwX3ZyYW1fc2RyYW1fc2l6ZTsKKwkJcGFkZHIgPSBvbWFwX3ZyYW1fc2RyYW1fc3RhcnQ7CisJfQorCisjaWZkZWYgQ09ORklHX09NQVAyX1ZSQU1fU0laRQorCWlmICghc2l6ZSkgeworCQlzaXplID0gQ09ORklHX09NQVAyX1ZSQU1fU0laRSAqIDEwMjQgKiAxMDI0OworCQlwYWRkciA9IDA7CisJfQorI2VuZGlmCisKKwlpZiAoIXNpemUpCisJCXJldHVybjsKKworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCisJYmRhdGEgPSBOT0RFX0RBVEEoMCktPmJkYXRhOworCXNkcmFtX3N0YXJ0ID0gYmRhdGEtPm5vZGVfbWluX3BmbiA8PCBQQUdFX1NISUZUOworCXNkcmFtX3NpemUgPSAoYmRhdGEtPm5vZGVfbG93X3BmbiA8PCBQQUdFX1NISUZUKSAtIHNkcmFtX3N0YXJ0OworCisJaWYgKHBhZGRyKSB7CisJCWlmICgocGFkZHIgJiB+UEFHRV9NQVNLKSB8fCBwYWRkciA8IHNkcmFtX3N0YXJ0IHx8CisJCQkJcGFkZHIgKyBzaXplID4gc2RyYW1fc3RhcnQgKyBzZHJhbV9zaXplKSB7CisJCQlwcl9lcnIoIklsbGVnYWwgU0RSQU0gcmVnaW9uIGZvciBWUkFNXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChyZXNlcnZlX2Jvb3RtZW0ocGFkZHIsIHNpemUsIEJPT1RNRU1fRVhDTFVTSVZFKSA8IDApIHsKKwkJCXByX2VycigiRkI6IGZhaWxlZCB0byByZXNlcnZlIFZSQU1cbiIpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHNpemUgPiBzZHJhbV9zaXplKSB7CisJCQlwcl9lcnIoIklsbGVnYWwgU0RSQU0gc2l6ZSBmb3IgVlJBTVxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQlwYWRkciA9IHZpcnRfdG9fcGh5cyhhbGxvY19ib290bWVtX3BhZ2VzKHNpemUpKTsKKwkJQlVHX09OKHBhZGRyICYgflBBR0VfTUFTSyk7CisJfQorCisJb21hcF92cmFtX2FkZF9yZWdpb24ocGFkZHIsIHNpemUpOworCisJcHJfaW5mbygiUmVzZXJ2aW5nICV1IGJ5dGVzIFNEUkFNIGZvciBWUkFNXG4iLCBzaXplKTsKK30KKworLyoKKyAqIENhbGxlZCBhdCBzcmFtIGluaXQgdGltZSwgYmVmb3JlIGFueXRoaW5nIGlzIHB1c2hlZCB0byB0aGUgU1JBTSBzdGFjay4KKyAqIEJlY2F1c2Ugb2YgdGhlIHN0YWNrIHNjaGVtZSwgd2Ugd2lsbCBhbGxvY2F0ZSBldmVyeXRoaW5nIGZyb20gdGhlCisgKiBzdGFydCBvZiB0aGUgbG93ZXN0IGFkZHJlc3MgcmVnaW9uIHRvIHRoZSBlbmQgb2YgU1JBTS4gVGhpcyB3aWxsIGFsc28KKyAqIGluY2x1ZGUgcGFkZGluZyBmb3IgcGFnZSBhbGlnbm1lbnQgYW5kIHBvc3NpYmxlIGhvbGVzIGJldHdlZW4gcmVnaW9ucy4KKyAqCisgKiBBcyBvcHBvc2VkIHRvIHRoZSBTRFJBTSBjYXNlLCB3ZSdsbCBhbHNvIGRvIGFueSBkeW5hbWljIGFsbG9jYXRpb25zIGF0CisgKiB0aGlzIHBvaW50LCBzaW5jZSB0aGUgZHJpdmVyIGJ1aWx0IGFzIGEgbW9kdWxlIHdvdWxkIGhhdmUgcHJvYmxlbSB3aXRoCisgKiBmcmVlaW5nIC8gcmVhbGxvY2F0aW5nIHRoZSByZWdpb25zLgorICovCit1bnNpZ25lZCBsb25nIF9faW5pdCBvbWFwX3ZyYW1fcmVzZXJ2ZV9zcmFtKHVuc2lnbmVkIGxvbmcgc3JhbV9wc3RhcnQsCisJCQkJICB1bnNpZ25lZCBsb25nIHNyYW1fdnN0YXJ0LAorCQkJCSAgdW5zaWduZWQgbG9uZyBzcmFtX3NpemUsCisJCQkJICB1bnNpZ25lZCBsb25nIHBzdGFydF9hdmFpbCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgc2l6ZV9hdmFpbCkKK3sKKwl1bnNpZ25lZCBsb25nCQkJcGVuZF9hdmFpbDsKKwl1bnNpZ25lZCBsb25nCQkJcmVzZXJ2ZWQ7CisJdTMyIHBhZGRyOworCXUzMiBzaXplOworCisJcGFkZHIgPSBvbWFwX3ZyYW1fc3JhbV9zdGFydDsKKwlzaXplID0gb21hcF92cmFtX3NyYW1fc2l6ZTsKKworCWlmICghc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlyZXNlcnZlZCA9IDA7CisJcGVuZF9hdmFpbCA9IHBzdGFydF9hdmFpbCArIHNpemVfYXZhaWw7CisKKwlpZiAoIXBhZGRyKSB7CisJCS8qIER5bmFtaWMgYWxsb2NhdGlvbiAqLworCQlpZiAoKHNpemVfYXZhaWwgJiBQQUdFX01BU0spIDwgc2l6ZSkgeworCQkJcHJfZXJyKCJOb3QgZW5vdWdoIFNSQU0gZm9yIFZSQU1cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJc2l6ZV9hdmFpbCA9IChzaXplX2F2YWlsIC0gc2l6ZSkgJiBQQUdFX01BU0s7CisJCXBhZGRyID0gcHN0YXJ0X2F2YWlsICsgc2l6ZV9hdmFpbDsKKwl9CisKKwlpZiAocGFkZHIgPCBzcmFtX3BzdGFydCB8fAorCQkJcGFkZHIgKyBzaXplID4gc3JhbV9wc3RhcnQgKyBzcmFtX3NpemUpIHsKKwkJcHJfZXJyKCJJbGxlZ2FsIFNSQU0gcmVnaW9uIGZvciBWUkFNXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogUmVzZXJ2ZSBldmVyeXRoaW5nIGFib3ZlIHRoZSBzdGFydCBvZiB0aGUgcmVnaW9uLiAqLworCWlmIChwZW5kX2F2YWlsIC0gcGFkZHIgPiByZXNlcnZlZCkKKwkJcmVzZXJ2ZWQgPSBwZW5kX2F2YWlsIC0gcGFkZHI7CisJc2l6ZV9hdmFpbCA9IHBlbmRfYXZhaWwgLSByZXNlcnZlZCAtIHBzdGFydF9hdmFpbDsKKworCW9tYXBfdnJhbV9hZGRfcmVnaW9uKHBhZGRyLCBzaXplKTsKKworCWlmIChyZXNlcnZlZCkKKwkJcHJfaW5mbygiUmVzZXJ2aW5nICVsdSBieXRlcyBTUkFNIGZvciBWUkFNXG4iLCByZXNlcnZlZCk7CisKKwlyZXR1cm4gcmVzZXJ2ZWQ7Cit9CisKK3ZvaWQgX19pbml0IG9tYXBfdnJhbV9zZXRfc2RyYW1fdnJhbSh1MzIgc2l6ZSwgdTMyIHN0YXJ0KQoreworCW9tYXBfdnJhbV9zZHJhbV9zdGFydCA9IHN0YXJ0OworCW9tYXBfdnJhbV9zZHJhbV9zaXplID0gc2l6ZTsKK30KKwordm9pZCBfX2luaXQgb21hcF92cmFtX3NldF9zcmFtX3ZyYW0odTMyIHNpemUsIHUzMiBzdGFydCkKK3sKKwlvbWFwX3ZyYW1fc3JhbV9zdGFydCA9IHN0YXJ0OworCW9tYXBfdnJhbV9zcmFtX3NpemUgPSBzaXplOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi92cmZiLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL3ZyZmIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDIyNzE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi92cmZiLmMKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBWUkZCIFJvdGF0aW9uIEVuZ2luZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBUb21pIFZhbGtlaW5lbiA8dG9taS52YWxrZWluZW5Abm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qI2RlZmluZSBERUJVRyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKKyNpbmNsdWRlIDxtYWNoL2lvLmg+CisjaW5jbHVkZSA8cGxhdC92cmZiLmg+CisjaW5jbHVkZSA8cGxhdC9zZHJjLmg+CisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEQkcoZm9ybWF0LCAuLi4pIHByX2RlYnVnKCJWUkZCOiAiIGZvcm1hdCwgIyMgX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBEQkcoZm9ybWF0LCAuLi4pCisjZW5kaWYKKworI2RlZmluZSBTTVNfUk9UX1ZJUlRfQkFTRShjb250ZXh0LCByb3QpIFwKKwkoKChjb250ZXh0ID49IDQpID8gMHhEMDAwMDAwMCA6IDB4NzAwMDAwMDApIFwKKwkgKyAoMHg0MDAwMDAwICogKGNvbnRleHQpKSBcCisJICsgKDB4MTAwMDAwMCAqIChyb3QpKSkKKworI2RlZmluZSBPTUFQX1ZSRkJfU0laRQkJCSgyMDQ4ICogMjA0OCAqIDQpCisKKyNkZWZpbmUgVlJGQl9QQUdFX1dJRFRIX0VYUAk1IC8qIEFzc3VtaW5nIFNEUkFNIHBhZ2VzaXplPSAxMDI0ICovCisjZGVmaW5lIFZSRkJfUEFHRV9IRUlHSFRfRVhQCTUgLyogMTAyNCA9IDJeNSAqIDJeNSAqLworI2RlZmluZSBWUkZCX1BBR0VfV0lEVEgJCSgxIDw8IFZSRkJfUEFHRV9XSURUSF9FWFApCisjZGVmaW5lIFZSRkJfUEFHRV9IRUlHSFQJKDEgPDwgVlJGQl9QQUdFX0hFSUdIVF9FWFApCisjZGVmaW5lIFNNU19JTUFHRUhFSUdIVF9PRkZTRVQJMTYKKyNkZWZpbmUgU01TX0lNQUdFV0lEVEhfT0ZGU0VUCTAKKyNkZWZpbmUgU01TX1BIX09GRlNFVAkJOAorI2RlZmluZSBTTVNfUFdfT0ZGU0VUCQk0CisjZGVmaW5lIFNNU19QU19PRkZTRVQJCTAKKworI2RlZmluZSBWUkZCX05VTV9DVFhTIDEyCisvKiBiaXRtYXAgb2YgcmVzZXJ2ZWQgY29udGV4dHMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGN0eF9tYXA7CisKK3N0YXRpYyBERUZJTkVfTVVURVgoY3R4X2xvY2spOworCisvKgorICogQWNjZXNzIHRvIHRoaXMgaGFwcGVucyBmcm9tIGNsaWVudCBkcml2ZXJzIG9yIHRoZSBQTSBjb3JlIGFmdGVyIHdha2UtdXAuCisgKiBGb3IgdGhlIGZpcnN0IGNhc2Ugd2UgcmVxdWlyZSBsb2NraW5nIGF0IHRoZSBkcml2ZXIgbGV2ZWwsIGZvciB0aGUgc2Vjb25kCisgKiB3ZSBkb24ndCBuZWVkIGxvY2tpbmcsIHNpbmNlIG5vIGRyaXZlcnMgd2lsbCBydW4gdW50aWwgYWZ0ZXIgdGhlIHdha2UtdXAKKyAqIGhhcyBmaW5pc2hlZC4KKyAqLworc3RhdGljIHN0cnVjdCB7CisJdTMyIHBoeXNpY2FsX2JhOworCXUzMiBjb250cm9sOworCXUzMiBzaXplOworfSB2cmZiX2h3X2NvbnRleHRbVlJGQl9OVU1fQ1RYU107CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX2h3X2NvbnRleHQoaW50IGN0eCkKK3sKKwlvbWFwMl9zbXNfd3JpdGVfcm90X2NvbnRyb2wodnJmYl9od19jb250ZXh0W2N0eF0uY29udHJvbCwgY3R4KTsKKwlvbWFwMl9zbXNfd3JpdGVfcm90X3NpemUodnJmYl9od19jb250ZXh0W2N0eF0uc2l6ZSwgY3R4KTsKKwlvbWFwMl9zbXNfd3JpdGVfcm90X3BoeXNpY2FsX2JhKHZyZmJfaHdfY29udGV4dFtjdHhdLnBoeXNpY2FsX2JhLCBjdHgpOworfQorCitzdGF0aWMgdTMyIGdldF9pbWFnZV93aWR0aF9yb3VuZHVwKHUxNiB3aWR0aCwgdTggYnl0ZXNwcCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0cmlkZSA9IHdpZHRoICogYnl0ZXNwcDsKKwl1bnNpZ25lZCBsb25nIGNlaWxfcGFnZXNfcGVyX3N0cmlkZSA9IChzdHJpZGUgLyBWUkZCX1BBR0VfV0lEVEgpICsKKwkJKHN0cmlkZSAlIFZSRkJfUEFHRV9XSURUSCAhPSAwKTsKKworCXJldHVybiBjZWlsX3BhZ2VzX3Blcl9zdHJpZGUgKiBWUkZCX1BBR0VfV0lEVEggLyBieXRlc3BwOworfQorCisvKgorICogVGhpcyB0aGUgZXh0cmEgc3BhY2UgbmVlZGVkIGluIHRoZSBWUkZCIHBoeXNpY2FsIGFyZWEgZm9yIFZSRkIgdG8gc2FmZWx5IHdyYXAKKyAqIGFueSBtZW1vcnkgYWNjZXNzZXMgdG8gdGhlIGludmlzaWJsZSBwYXJ0IG9mIHRoZSB2aXJ0dWFsIHZpZXcgdG8gdGhlIHBoeXNpY2FsCisgKiBhcmVhLgorICovCitzdGF0aWMgaW5saW5lIHUzMiBnZXRfZXh0cmFfcGh5c2ljYWxfc2l6ZSh1MTYgaW1hZ2Vfd2lkdGhfcm91bmR1cCwgdTggYnl0ZXNwcCkKK3sKKwlyZXR1cm4gKE9NQVBfVlJGQl9MSU5FX0xFTiAtIGltYWdlX3dpZHRoX3JvdW5kdXApICogVlJGQl9QQUdFX0hFSUdIVCAqCisJCWJ5dGVzcHA7Cit9CisKK3ZvaWQgb21hcF92cmZiX3Jlc3RvcmVfY29udGV4dCh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgbWFwID0gY3R4X21hcDsKKworCWZvciAoaSA9IGZmcyhtYXApOyBpOyBpID0gZmZzKG1hcCkpIHsKKwkJLyogaT0xLi4zMiAqLworCQlpLS07CisJCW1hcCAmPSB+KDEgPDwgaSk7CisJCXJlc3RvcmVfaHdfY29udGV4dChpKTsKKwl9Cit9CisKK3ZvaWQgb21hcF92cmZiX2FkanVzdF9zaXplKHUxNiAqd2lkdGgsIHUxNiAqaGVpZ2h0LAorCQl1OCBieXRlc3BwKQoreworCSp3aWR0aCA9IEFMSUdOKCp3aWR0aCAqIGJ5dGVzcHAsIFZSRkJfUEFHRV9XSURUSCkgLyBieXRlc3BwOworCSpoZWlnaHQgPSBBTElHTigqaGVpZ2h0LCBWUkZCX1BBR0VfSEVJR0hUKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcF92cmZiX2FkanVzdF9zaXplKTsKKwordTMyIG9tYXBfdnJmYl9taW5fcGh5c19zaXplKHUxNiB3aWR0aCwgdTE2IGhlaWdodCwgdTggYnl0ZXNwcCkKK3sKKwl1bnNpZ25lZCBsb25nIGltYWdlX3dpZHRoX3JvdW5kdXAgPSBnZXRfaW1hZ2Vfd2lkdGhfcm91bmR1cCh3aWR0aCwKKwkJYnl0ZXNwcCk7CisKKwlpZiAoaW1hZ2Vfd2lkdGhfcm91bmR1cCA+IE9NQVBfVlJGQl9MSU5FX0xFTikKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKHdpZHRoICogaGVpZ2h0ICogYnl0ZXNwcCkgKyBnZXRfZXh0cmFfcGh5c2ljYWxfc2l6ZSgKKwkJaW1hZ2Vfd2lkdGhfcm91bmR1cCwgYnl0ZXNwcCk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfdnJmYl9taW5fcGh5c19zaXplKTsKKwordTE2IG9tYXBfdnJmYl9tYXhfaGVpZ2h0KHUzMiBwaHlzX3NpemUsIHUxNiB3aWR0aCwgdTggYnl0ZXNwcCkKK3sKKwl1bnNpZ25lZCBsb25nIGltYWdlX3dpZHRoX3JvdW5kdXAgPSBnZXRfaW1hZ2Vfd2lkdGhfcm91bmR1cCh3aWR0aCwKKwkJYnl0ZXNwcCk7CisJdW5zaWduZWQgbG9uZyBoZWlnaHQ7CisJdW5zaWduZWQgbG9uZyBleHRyYTsKKworCWlmIChpbWFnZV93aWR0aF9yb3VuZHVwID4gT01BUF9WUkZCX0xJTkVfTEVOKQorCQlyZXR1cm4gMDsKKworCWV4dHJhID0gZ2V0X2V4dHJhX3BoeXNpY2FsX3NpemUoaW1hZ2Vfd2lkdGhfcm91bmR1cCwgYnl0ZXNwcCk7CisKKwlpZiAocGh5c19zaXplIDwgZXh0cmEpCisJCXJldHVybiAwOworCisJaGVpZ2h0ID0gKHBoeXNfc2l6ZSAtIGV4dHJhKSAvICh3aWR0aCAqIGJ5dGVzcHApOworCisJLyogVmlydHVhbCB2aWV3cyBwcm92aWRlZCBieSBWUkZCIGFyZSBsaW1pdGVkIHRvIDIwNDh4MjA0OC4gKi8KKwlyZXR1cm4gbWluX3QodW5zaWduZWQgbG9uZywgaGVpZ2h0LCAyMDQ4KTsKK30KK0VYUE9SVF9TWU1CT0wob21hcF92cmZiX21heF9oZWlnaHQpOworCit2b2lkIG9tYXBfdnJmYl9zZXR1cChzdHJ1Y3QgdnJmYiAqdnJmYiwgdW5zaWduZWQgbG9uZyBwYWRkciwKKwkJdTE2IHdpZHRoLCB1MTYgaGVpZ2h0LAorCQl1bnNpZ25lZCBieXRlc3BwLCBib29sIHl1dl9tb2RlKQoreworCXVuc2lnbmVkIHBpeGVsX3NpemVfZXhwOworCXUxNiB2cmZiX3dpZHRoOworCXUxNiB2cmZiX2hlaWdodDsKKwl1OCBjdHggPSB2cmZiLT5jb250ZXh0OworCXUzMiBzaXplOworCXUzMiBjb250cm9sOworCisJREJHKCJvbWFwZmJfc2V0X3ZyZmIoJWQsICVseCwgJWR4JWQsICVkLCAlZClcbiIsIGN0eCwgcGFkZHIsCisJCQl3aWR0aCwgaGVpZ2h0LCBieXRlc3BwLCB5dXZfbW9kZSk7CisKKwkvKiBGb3IgWVVWMiBhbmQgVVlWWSBtb2RlcyBWUkZCIG5lZWRzIHRvIGhhbmRsZSBwaXhlbHMgYSBiaXQKKwkgKiBkaWZmZXJlbnRseS4gU2VlIFRSTS4gKi8KKwlpZiAoeXV2X21vZGUpIHsKKwkJYnl0ZXNwcCAqPSAyOworCQl3aWR0aCAvPSAyOworCX0KKworCWlmIChieXRlc3BwID09IDQpCisJCXBpeGVsX3NpemVfZXhwID0gMjsKKwllbHNlIGlmIChieXRlc3BwID09IDIpCisJCXBpeGVsX3NpemVfZXhwID0gMTsKKwllbHNlCisJCUJVRygpOworCisJdnJmYl93aWR0aCA9IEFMSUdOKHdpZHRoICogYnl0ZXNwcCwgVlJGQl9QQUdFX1dJRFRIKSAvIGJ5dGVzcHA7CisJdnJmYl9oZWlnaHQgPSBBTElHTihoZWlnaHQsIFZSRkJfUEFHRV9IRUlHSFQpOworCisJREJHKCJ2cmZiIHcgJXUsIGggJXUgYnl0ZXNwcCAlZFxuIiwgdnJmYl93aWR0aCwgdnJmYl9oZWlnaHQsIGJ5dGVzcHApOworCisJc2l6ZSAgPSB2cmZiX3dpZHRoIDw8IFNNU19JTUFHRVdJRFRIX09GRlNFVDsKKwlzaXplIHw9IHZyZmJfaGVpZ2h0IDw8IFNNU19JTUFHRUhFSUdIVF9PRkZTRVQ7CisKKwljb250cm9sICA9IHBpeGVsX3NpemVfZXhwIDw8IFNNU19QU19PRkZTRVQ7CisJY29udHJvbCB8PSBWUkZCX1BBR0VfV0lEVEhfRVhQICA8PCBTTVNfUFdfT0ZGU0VUOworCWNvbnRyb2wgfD0gVlJGQl9QQUdFX0hFSUdIVF9FWFAgPDwgU01TX1BIX09GRlNFVDsKKworCXZyZmJfaHdfY29udGV4dFtjdHhdLnBoeXNpY2FsX2JhID0gcGFkZHI7CisJdnJmYl9od19jb250ZXh0W2N0eF0uc2l6ZSA9IHNpemU7CisJdnJmYl9od19jb250ZXh0W2N0eF0uY29udHJvbCA9IGNvbnRyb2w7CisKKwlvbWFwMl9zbXNfd3JpdGVfcm90X3BoeXNpY2FsX2JhKHBhZGRyLCBjdHgpOworCW9tYXAyX3Ntc193cml0ZV9yb3Rfc2l6ZShzaXplLCBjdHgpOworCW9tYXAyX3Ntc193cml0ZV9yb3RfY29udHJvbChjb250cm9sLCBjdHgpOworCisJREJHKCJ2cmZiIG9mZnNldCBwaXhlbHMgJWQsICVkXG4iLAorCQkJdnJmYl93aWR0aCAtIHdpZHRoLCB2cmZiX2hlaWdodCAtIGhlaWdodCk7CisKKwl2cmZiLT54cmVzID0gd2lkdGg7CisJdnJmYi0+eXJlcyA9IGhlaWdodDsKKwl2cmZiLT54b2Zmc2V0ID0gdnJmYl93aWR0aCAtIHdpZHRoOworCXZyZmItPnlvZmZzZXQgPSB2cmZiX2hlaWdodCAtIGhlaWdodDsKKwl2cmZiLT5ieXRlc3BwID0gYnl0ZXNwcDsKKwl2cmZiLT55dXZfbW9kZSA9IHl1dl9tb2RlOworfQorRVhQT1JUX1NZTUJPTChvbWFwX3ZyZmJfc2V0dXApOworCitpbnQgb21hcF92cmZiX21hcF9hbmdsZShzdHJ1Y3QgdnJmYiAqdnJmYiwgdTE2IGhlaWdodCwgdTggcm90KQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGhlaWdodCAqIE9NQVBfVlJGQl9MSU5FX0xFTiAqIHZyZmItPmJ5dGVzcHA7CisKKwl2cmZiLT52YWRkcltyb3RdID0gaW9yZW1hcF93Yyh2cmZiLT5wYWRkcltyb3RdLCBzaXplKTsKKworCWlmICghdnJmYi0+dmFkZHJbcm90XSkgeworCQlwcmludGsoS0VSTl9FUlIgInZyZmI6IGlvcmVtYXAgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJREJHKCJpb3JlbWFwcGVkIHZyZmIgYXJlYSAlZCBvZiBzaXplICVsdSBpbnRvICVwXG4iLCByb3QsIHNpemUsCisJCXZyZmItPnZhZGRyW3JvdF0pOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfdnJmYl9tYXBfYW5nbGUpOworCit2b2lkIG9tYXBfdnJmYl9yZWxlYXNlX2N0eChzdHJ1Y3QgdnJmYiAqdnJmYikKK3sKKwlpbnQgcm90OworCWludCBjdHggPSB2cmZiLT5jb250ZXh0OworCisJaWYgKGN0eCA9PSAweGZmKQorCQlyZXR1cm47CisKKwlEQkcoInJlbGVhc2UgY3R4ICVkXG4iLCBjdHgpOworCisJbXV0ZXhfbG9jaygmY3R4X2xvY2spOworCisJQlVHX09OKCEoY3R4X21hcCAmICgxIDw8IGN0eCkpKTsKKworCWNsZWFyX2JpdChjdHgsICZjdHhfbWFwKTsKKworCWZvciAocm90ID0gMDsgcm90IDwgNDsgKytyb3QpIHsKKwkJaWYgKHZyZmItPnBhZGRyW3JvdF0pIHsKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbih2cmZiLT5wYWRkcltyb3RdLCBPTUFQX1ZSRkJfU0laRSk7CisJCQl2cmZiLT5wYWRkcltyb3RdID0gMDsKKwkJfQorCX0KKworCXZyZmItPmNvbnRleHQgPSAweGZmOworCisJbXV0ZXhfdW5sb2NrKCZjdHhfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfdnJmYl9yZWxlYXNlX2N0eCk7CisKK2ludCBvbWFwX3ZyZmJfcmVxdWVzdF9jdHgoc3RydWN0IHZyZmIgKnZyZmIpCit7CisJaW50IHJvdDsKKwl1MzIgcGFkZHI7CisJdTggY3R4OworCWludCByOworCisJREJHKCJyZXF1ZXN0IGN0eFxuIik7CisKKwltdXRleF9sb2NrKCZjdHhfbG9jayk7CisKKwlmb3IgKGN0eCA9IDA7IGN0eCA8IFZSRkJfTlVNX0NUWFM7ICsrY3R4KQorCQlpZiAoKGN0eF9tYXAgJiAoMSA8PCBjdHgpKSA9PSAwKQorCQkJYnJlYWs7CisKKwlpZiAoY3R4ID09IFZSRkJfTlVNX0NUWFMpIHsKKwkJcHJfZXJyKCJ2cmZiOiBubyBmcmVlIGNvbnRleHRzXG4iKTsKKwkJciA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJREJHKCJmb3VuZCBmcmVlIGN0eCAlZFxuIiwgY3R4KTsKKworCXNldF9iaXQoY3R4LCAmY3R4X21hcCk7CisKKwltZW1zZXQodnJmYiwgMCwgc2l6ZW9mKCp2cmZiKSk7CisKKwl2cmZiLT5jb250ZXh0ID0gY3R4OworCisJZm9yIChyb3QgPSAwOyByb3QgPCA0OyArK3JvdCkgeworCQlwYWRkciA9IFNNU19ST1RfVklSVF9CQVNFKGN0eCwgcm90KTsKKwkJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocGFkZHIsIE9NQVBfVlJGQl9TSVpFLCAidnJmYiIpKSB7CisJCQlwcl9lcnIoInZyZmI6IGZhaWxlZCB0byByZXNlcnZlIFZSRkIgIgorCQkJCQkiYXJlYSBmb3IgY3R4ICVkLCByb3RhdGlvbiAlZFxuIiwKKwkJCQkJY3R4LCByb3QgKiA5MCk7CisJCQlvbWFwX3ZyZmJfcmVsZWFzZV9jdHgodnJmYik7CisJCQlyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJdnJmYi0+cGFkZHJbcm90XSA9IHBhZGRyOworCisJCURCRygiVlJGQiAlZC8lZDogJWx4XG4iLCBjdHgsIHJvdCo5MCwgdnJmYi0+cGFkZHJbcm90XSk7CisJfQorCisJciA9IDA7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjdHhfbG9jayk7CisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfdnJmYl9yZXF1ZXN0X2N0eCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3hlbi1mYmZyb250LmMgYi9kcml2ZXJzL3ZpZGVvL3hlbi1mYmZyb250LmMKaW5kZXggOTFhNjhlOS4uNjAzNTk4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby94ZW4tZmJmcm9udC5jCisrKyBiL2RyaXZlcnMvdmlkZW8veGVuLWZiZnJvbnQuYwpAQCAtMjUsNyArMjUsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKwogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgorCisjaW5jbHVkZSA8eGVuL3hlbi5oPgogI2luY2x1ZGUgPHhlbi9ldmVudHMuaD4KICNpbmNsdWRlIDx4ZW4vcGFnZS5oPgogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvaW8vZmJpZi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vYmFsbG9vbi5jIGIvZHJpdmVycy94ZW4vYmFsbG9vbi5jCmluZGV4IDQyMDQzMzYuLmY2NzM4ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL2JhbGxvb24uYworKysgYi9kcml2ZXJzL3hlbi9iYWxsb29uLmMKQEAgLTUyLDYgKzUyLDggQEAKIAogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJjYWxsLmg+CisKKyNpbmNsdWRlIDx4ZW4veGVuLmg+CiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS94ZW4uaD4KICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL21lbW9yeS5oPgogI2luY2x1ZGUgPHhlbi94ZW5idXMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL2NwdV9ob3RwbHVnLmMgYi9kcml2ZXJzL3hlbi9jcHVfaG90cGx1Zy5jCmluZGV4IDBmNzY1YTkuLjE0ZTJkOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL2NwdV9ob3RwbHVnLmMKKysrIGIvZHJpdmVycy94ZW4vY3B1X2hvdHBsdWcuYwpAQCAtMSw1ICsxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogCisjaW5jbHVkZSA8eGVuL3hlbi5oPgogI2luY2x1ZGUgPHhlbi94ZW5idXMuaD4KIAogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZXZ0Y2huLmMgYi9kcml2ZXJzL3hlbi9ldnRjaG4uYwppbmRleCA3OWJlZGJhLi5mNzBhNGY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9ldnRjaG4uYworKysgYi9kcml2ZXJzL3hlbi9ldnRjaG4uYwpAQCAtNDgsNiArNDgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisKKyNpbmNsdWRlIDx4ZW4veGVuLmg+CiAjaW5jbHVkZSA8eGVuL2V2ZW50cy5oPgogI2luY2x1ZGUgPHhlbi9ldnRjaG4uaD4KICNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL2dyYW50LXRhYmxlLmMgYi9kcml2ZXJzL3hlbi9ncmFudC10YWJsZS5jCmluZGV4IDdkOGY1MzEuLjRjNmMwYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL2dyYW50LXRhYmxlLmMKKysrIGIvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKKyNpbmNsdWRlIDx4ZW4veGVuLmg+CiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS94ZW4uaD4KICNpbmNsdWRlIDx4ZW4vcGFnZS5oPgogI2luY2x1ZGUgPHhlbi9ncmFudF90YWJsZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vc3lzLWh5cGVydmlzb3IuYyBiL2RyaXZlcnMveGVuL3N5cy1oeXBlcnZpc29yLmMKaW5kZXggODhhNjBlMC4uYWU1Y2IwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vc3lzLWh5cGVydmlzb3IuYworKysgYi9kcml2ZXJzL3hlbi9zeXMtaHlwZXJ2aXNvci5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcnZpc29yLmg+CiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcmNhbGwuaD4KIAorI2luY2x1ZGUgPHhlbi94ZW4uaD4KICNpbmNsdWRlIDx4ZW4veGVuYnVzLmg+CiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS94ZW4uaD4KICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3ZlcnNpb24uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYwppbmRleCA2NDlmY2RmLi4yZjdhYWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jCkBAIC00OSw2ICs0OSw4IEBACiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgorCisjaW5jbHVkZSA8eGVuL3hlbi5oPgogI2luY2x1ZGUgPHhlbi94ZW5idXMuaD4KICNpbmNsdWRlIDx4ZW4vZXZlbnRzLmg+CiAjaW5jbHVkZSA8eGVuL3BhZ2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmZzL3N1cGVyLmMgYi9kcml2ZXJzL3hlbi94ZW5mcy9zdXBlci5jCmluZGV4IDY1NTllMGMuLjg5MjRkOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3hlbmZzL3N1cGVyLmMKKysrIGIvZHJpdmVycy94ZW4veGVuZnMvc3VwZXIuYwpAQCAtMTMsNiArMTMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KIAorI2luY2x1ZGUgPHhlbi94ZW4uaD4KKwogI2luY2x1ZGUgInhlbmZzLmgiCiAKICNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KZGlmZiAtLWdpdCBhL2ZzL2Fmcy93cml0ZS5jIGIvZnMvYWZzL3dyaXRlLmMKaW5kZXggYzYzYTNjOC4uNWUxNWEyMSAxMDA2NDQKLS0tIGEvZnMvYWZzL3dyaXRlLmMKKysrIGIvZnMvYWZzL3dyaXRlLmMKQEAgLTY3MSw3ICs2NzEsNiBAQAogCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gQUZTX0ZTX0koZGVudHJ5LT5kX2lub2RlKTsKIAlzc2l6ZV90IHJlc3VsdDsKIAlzaXplX3QgY291bnQgPSBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2Vncyk7Ci0JaW50IHJldDsKIAogCV9lbnRlcigieyV4LiV1fSx7JXp1fSwlbHUsIiwKIAkgICAgICAgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsIGNvdW50LCBucl9zZWdzKTsKQEAgLTY5MSwxMyArNjkwLDYgQEAKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLQkvKiByZXR1cm4gZXJyb3IgdmFsdWVzIGZvciBPX1NZTkMgYW5kIElTX1NZTkMoKSAqLwotCWlmIChJU19TWU5DKCZ2bm9kZS0+dmZzX2lub2RlKSB8fCBpb2NiLT5raV9maWxwLT5mX2ZsYWdzICYgT19TWU5DKSB7Ci0JCXJldCA9IGFmc19mc3luYyhpb2NiLT5raV9maWxwLCBkZW50cnksIDEpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJlc3VsdCA9IHJldDsKLQl9Ci0KIAlfbGVhdmUoIiA9ICV6ZCIsIHJlc3VsdCk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2ZpbGUuYyBiL2ZzL2J0cmZzL2ZpbGUuYwppbmRleCAwNjU1MGFmLi43N2Y3NTkzIDEwMDY0NAotLS0gYS9mcy9idHJmcy9maWxlLmMKKysrIGIvZnMvYnRyZnMvZmlsZS5jCkBAIC05MDksNyArOTA5LDcgQEAKIAl1bnNpZ25lZCBsb25nIGxhc3RfaW5kZXg7CiAJaW50IHdpbGxfd3JpdGU7CiAKLQl3aWxsX3dyaXRlID0gKChmaWxlLT5mX2ZsYWdzICYgT19TWU5DKSB8fCBJU19TWU5DKGlub2RlKSB8fAorCXdpbGxfd3JpdGUgPSAoKGZpbGUtPmZfZmxhZ3MgJiBPX0RTWU5DKSB8fCBJU19TWU5DKGlub2RlKSB8fAogCQkgICAgICAoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSk7CiAKIAlucnB0cnMgPSBtaW4oKGNvdW50ICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgLyBQQUdFX0NBQ0hFX1NJWkUsCkBAIC0xMDc2LDcgKzEwNzYsNyBAQAogCQlpZiAoZXJyKQogCQkJbnVtX3dyaXR0ZW4gPSBlcnI7CiAKLQkJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19TWU5DKSB8fCBJU19TWU5DKGlub2RlKSkgeworCQlpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX0RTWU5DKSB8fCBJU19TWU5DKGlub2RlKSkgewogCQkJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKIAkJCXJldCA9IGJ0cmZzX2xvZ19kZW50cnlfc2FmZSh0cmFucywgcm9vdCwKIAkJCQkJCSAgICBmaWxlLT5mX2RlbnRyeSk7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2Rpci5jIGIvZnMvY2lmcy9kaXIuYwppbmRleCAxZjQyZjc3Li42Y2NmNzI2IDEwMDY0NAotLS0gYS9mcy9jaWZzL2Rpci5jCisrKyBiL2ZzL2NpZnMvZGlyLmMKQEAgLTIxNCw3ICsyMTQsOCBAQAogCQlwb3NpeF9mbGFncyB8PSBTTUJfT19FWENMOwogCWlmIChvZmxhZ3MgJiBPX1RSVU5DKQogCQlwb3NpeF9mbGFncyB8PSBTTUJfT19UUlVOQzsKLQlpZiAob2ZsYWdzICYgT19TWU5DKQorCS8qIGJlIHNhZmUgYW5kIGltcGx5IE9fU1lOQyBmb3IgT19EU1lOQyAqLworCWlmIChvZmxhZ3MgJiBPX0RTWU5DKQogCQlwb3NpeF9mbGFncyB8PSBTTUJfT19TWU5DOwogCWlmIChvZmxhZ3MgJiBPX0RJUkVDVE9SWSkKIAkJcG9zaXhfZmxhZ3MgfD0gU01CX09fRElSRUNUT1JZOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9maWxlLmMgYi9mcy9jaWZzL2ZpbGUuYwppbmRleCA0MjkzMzdlLi4wNTdlMWRhIDEwMDY0NAotLS0gYS9mcy9jaWZzL2ZpbGUuYworKysgYi9mcy9jaWZzL2ZpbGUuYwpAQCAtNzYsOCArNzYsMTAgQEAKIAkgICByZW9wZW5pbmcgYSBmaWxlLiAgVGhleSBoYWQgdGhlaXIgZWZmZWN0IG9uIHRoZSBvcmlnaW5hbCBvcGVuICovCiAJaWYgKGZsYWdzICYgT19BUFBFTkQpCiAJCXBvc2l4X2ZsYWdzIHw9IChmbW9kZV90KU9fQVBQRU5EOwotCWlmIChmbGFncyAmIE9fU1lOQykKLQkJcG9zaXhfZmxhZ3MgfD0gKGZtb2RlX3QpT19TWU5DOworCWlmIChmbGFncyAmIE9fRFNZTkMpCisJCXBvc2l4X2ZsYWdzIHw9IChmbW9kZV90KU9fRFNZTkM7CisJaWYgKGZsYWdzICYgX19PX1NZTkMpCisJCXBvc2l4X2ZsYWdzIHw9IChmbW9kZV90KV9fT19TWU5DOwogCWlmIChmbGFncyAmIE9fRElSRUNUT1JZKQogCQlwb3NpeF9mbGFncyB8PSAoZm1vZGVfdClPX0RJUkVDVE9SWTsKIAlpZiAoZmxhZ3MgJiBPX05PRk9MTE9XKQpkaWZmIC0tZ2l0IGEvZnMvZGVidWdmcy9pbm9kZS5jIGIvZnMvZGVidWdmcy9pbm9kZS5jCmluZGV4IDBkMjNiNTIuLmI0ODYxNjkgMTAwNjQ0Ci0tLSBhL2ZzL2RlYnVnZnMvaW5vZGUuYworKysgYi9mcy9kZWJ1Z2ZzL2lub2RlLmMKQEAgLTMyLDcgKzMyLDkgQEAKIHN0YXRpYyBpbnQgZGVidWdmc19tb3VudF9jb3VudDsKIHN0YXRpYyBib29sIGRlYnVnZnNfcmVnaXN0ZXJlZDsKIAotc3RhdGljIHN0cnVjdCBpbm9kZSAqZGVidWdmc19nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vZGUsIGRldl90IGRldikKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmRlYnVnZnNfZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBtb2RlLCBkZXZfdCBkZXYsCisJCQkJICAgICAgIHZvaWQgKmRhdGEsIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMpCisKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmV3X2lub2RlKHNiKTsKIApAQCAtNDQsMTQgKzQ2LDE4IEBACiAJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIG1vZGUsIGRldik7CiAJCQlicmVhazsKIAkJY2FzZSBTX0lGUkVHOgotCQkJaW5vZGUtPmlfZm9wID0gJmRlYnVnZnNfZmlsZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfZm9wID0gZm9wcyA/IGZvcHMgOiAmZGVidWdmc19maWxlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9wcml2YXRlID0gZGF0YTsKIAkJCWJyZWFrOwogCQljYXNlIFNfSUZMTks6CiAJCQlpbm9kZS0+aV9vcCA9ICZkZWJ1Z2ZzX2xpbmtfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2ZvcCA9IGZvcHM7CisJCQlpbm9kZS0+aV9wcml2YXRlID0gZGF0YTsKIAkJCWJyZWFrOwogCQljYXNlIFNfSUZESVI6CiAJCQlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7Ci0JCQlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfZm9wID0gZm9wcyA/IGZvcHMgOiAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfcHJpdmF0ZSA9IGRhdGE7CiAKIAkJCS8qIGRpcmVjdG9yeSBpbm9kZXMgc3RhcnQgb2ZmIHdpdGggaV9ubGluayA9PSAyCiAJCQkgKiAoZm9yICIuIiBlbnRyeSkgKi8KQEAgLTY0LDcgKzcwLDggQEAKIAogLyogU01QLXNhZmUgKi8KIHN0YXRpYyBpbnQgZGVidWdmc19ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkJIGludCBtb2RlLCBkZXZfdCBkZXYpCisJCQkgaW50IG1vZGUsIGRldl90IGRldiwgdm9pZCAqZGF0YSwKKwkJCSBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJaW50IGVycm9yID0gLUVQRVJNOwpAQCAtNzIsNyArNzksNyBAQAogCWlmIChkZW50cnktPmRfaW5vZGUpCiAJCXJldHVybiAtRUVYSVNUOwogCi0JaW5vZGUgPSBkZWJ1Z2ZzX2dldF9pbm9kZShkaXItPmlfc2IsIG1vZGUsIGRldik7CisJaW5vZGUgPSBkZWJ1Z2ZzX2dldF9pbm9kZShkaXItPmlfc2IsIG1vZGUsIGRldiwgZGF0YSwgZm9wcyk7CiAJaWYgKGlub2RlKSB7CiAJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAJCWRnZXQoZGVudHJ5KTsKQEAgLTgxLDEyICs4OCwxMyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIGludCBkZWJ1Z2ZzX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQorc3RhdGljIGludCBkZWJ1Z2ZzX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQkJIHZvaWQgKmRhdGEsIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMpCiB7CiAJaW50IHJlczsKIAogCW1vZGUgPSAobW9kZSAmIChTX0lSV1hVR08gfCBTX0lTVlRYKSkgfCBTX0lGRElSOwotCXJlcyA9IGRlYnVnZnNfbWtub2QoZGlyLCBkZW50cnksIG1vZGUsIDApOworCXJlcyA9IGRlYnVnZnNfbWtub2QoZGlyLCBkZW50cnksIG1vZGUsIDAsIGRhdGEsIGZvcHMpOwogCWlmICghcmVzKSB7CiAJCWluY19ubGluayhkaXIpOwogCQlmc25vdGlmeV9ta2RpcihkaXIsIGRlbnRyeSk7CkBAIC05NCwxOCArMTAyLDIwIEBACiAJcmV0dXJuIHJlczsKIH0KIAotc3RhdGljIGludCBkZWJ1Z2ZzX2xpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCitzdGF0aWMgaW50IGRlYnVnZnNfbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJCXZvaWQgKmRhdGEsIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMpCiB7CiAJbW9kZSA9IChtb2RlICYgU19JQUxMVUdPKSB8IFNfSUZMTks7Ci0JcmV0dXJuIGRlYnVnZnNfbWtub2QoZGlyLCBkZW50cnksIG1vZGUsIDApOworCXJldHVybiBkZWJ1Z2ZzX21rbm9kKGRpciwgZGVudHJ5LCBtb2RlLCAwLCBkYXRhLCBmb3BzKTsKIH0KIAotc3RhdGljIGludCBkZWJ1Z2ZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKK3N0YXRpYyBpbnQgZGVidWdmc19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCQkgIHZvaWQgKmRhdGEsIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMpCiB7CiAJaW50IHJlczsKIAogCW1vZGUgPSAobW9kZSAmIFNfSUFMTFVHTykgfCBTX0lGUkVHOwotCXJlcyA9IGRlYnVnZnNfbWtub2QoZGlyLCBkZW50cnksIG1vZGUsIDApOworCXJlcyA9IGRlYnVnZnNfbWtub2QoZGlyLCBkZW50cnksIG1vZGUsIDAsIGRhdGEsIGZvcHMpOwogCWlmICghcmVzKQogCQlmc25vdGlmeV9jcmVhdGUoZGlyLCBkZW50cnkpOwogCXJldHVybiByZXM7CkBAIC0xMzksNyArMTQ5LDkgQEAKIAogc3RhdGljIGludCBkZWJ1Z2ZzX2NyZWF0ZV9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAogCQkJCSAgc3RydWN0IGRlbnRyeSAqcGFyZW50LAotCQkJCSAgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSkKKwkJCQkgIHN0cnVjdCBkZW50cnkgKipkZW50cnksCisJCQkJICB2b2lkICpkYXRhLAorCQkJCSAgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcykKIHsKIAlpbnQgZXJyb3IgPSAwOwogCkBAIC0xNjQsMTMgKzE3NiwxNiBAQAogCWlmICghSVNfRVJSKCpkZW50cnkpKSB7CiAJCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgewogCQljYXNlIFNfSUZESVI6Ci0JCQllcnJvciA9IGRlYnVnZnNfbWtkaXIocGFyZW50LT5kX2lub2RlLCAqZGVudHJ5LCBtb2RlKTsKKwkJCWVycm9yID0gZGVidWdmc19ta2RpcihwYXJlbnQtPmRfaW5vZGUsICpkZW50cnksIG1vZGUsCisJCQkJCSAgICAgIGRhdGEsIGZvcHMpOwogCQkJYnJlYWs7CiAJCWNhc2UgU19JRkxOSzoKLQkJCWVycm9yID0gZGVidWdmc19saW5rKHBhcmVudC0+ZF9pbm9kZSwgKmRlbnRyeSwgbW9kZSk7CisJCQllcnJvciA9IGRlYnVnZnNfbGluayhwYXJlbnQtPmRfaW5vZGUsICpkZW50cnksIG1vZGUsCisJCQkJCSAgICAgZGF0YSwgZm9wcyk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWVycm9yID0gZGVidWdmc19jcmVhdGUocGFyZW50LT5kX2lub2RlLCAqZGVudHJ5LCBtb2RlKTsKKwkJCWVycm9yID0gZGVidWdmc19jcmVhdGUocGFyZW50LT5kX2lub2RlLCAqZGVudHJ5LCBtb2RlLAorCQkJCQkgICAgICAgZGF0YSwgZm9wcyk7CiAJCQlicmVhazsKIAkJfQogCQlkcHV0KCpkZW50cnkpOwpAQCAtMjIxLDE5ICsyMzYsMTMgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXhpdDsKIAotCWVycm9yID0gZGVidWdmc19jcmVhdGVfYnlfbmFtZShuYW1lLCBtb2RlLCBwYXJlbnQsICZkZW50cnkpOworCWVycm9yID0gZGVidWdmc19jcmVhdGVfYnlfbmFtZShuYW1lLCBtb2RlLCBwYXJlbnQsICZkZW50cnksCisJCQkJICAgICAgIGRhdGEsIGZvcHMpOwogCWlmIChlcnJvcikgewogCQlkZW50cnkgPSBOVUxMOwogCQlzaW1wbGVfcmVsZWFzZV9mcygmZGVidWdmc19tb3VudCwgJmRlYnVnZnNfbW91bnRfY291bnQpOwogCQlnb3RvIGV4aXQ7CiAJfQotCi0JaWYgKGRlbnRyeS0+ZF9pbm9kZSkgewotCQlpZiAoZGF0YSkKLQkJCWRlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlID0gZGF0YTsKLQkJaWYgKGZvcHMpCi0JCQlkZW50cnktPmRfaW5vZGUtPmlfZm9wID0gZm9wczsKLQl9CiBleGl0OgogCXJldHVybiBkZW50cnk7CiB9CmRpZmYgLS1naXQgYS9mcy9kZXZwdHMvaW5vZGUuYyBiL2ZzL2RldnB0cy9pbm9kZS5jCmluZGV4IGQ1ZjhjOTYuLjg4ODJlY2MgMTAwNjQ0Ci0tLSBhL2ZzL2RldnB0cy9pbm9kZS5jCisrKyBiL2ZzL2RldnB0cy9pbm9kZS5jCkBAIC01MTcsMTEgKzUxNywyMyBAQAogCiBzdHJ1Y3QgdHR5X3N0cnVjdCAqZGV2cHRzX2dldF90dHkoc3RydWN0IGlub2RlICpwdHNfaW5vZGUsIGludCBudW1iZXIpCiB7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKIAlCVUdfT04ocHRzX2lub2RlLT5pX3JkZXYgPT0gTUtERVYoVFRZQVVYX01BSk9SLCBQVE1YX01JTk9SKSk7CiAKKwkvKiBFbnN1cmUgZGVudHJ5IGhhcyBub3QgYmVlbiBkZWxldGVkIGJ5IGRldnB0c19wdHlfa2lsbCgpICovCisJZGVudHJ5ID0gZF9maW5kX2FsaWFzKHB0c19pbm9kZSk7CisJaWYgKCFkZW50cnkpCisJCXJldHVybiBOVUxMOworCisJdHR5ID0gTlVMTDsKIAlpZiAocHRzX2lub2RlLT5pX3NiLT5zX21hZ2ljID09IERFVlBUU19TVVBFUl9NQUdJQykKLQkJcmV0dXJuIChzdHJ1Y3QgdHR5X3N0cnVjdCAqKXB0c19pbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiBOVUxMOworCQl0dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKilwdHNfaW5vZGUtPmlfcHJpdmF0ZTsKKworCWRwdXQoZGVudHJ5KTsKKworCXJldHVybiB0dHk7CiB9CiAKIHZvaWQgZGV2cHRzX3B0eV9raWxsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCmRpZmYgLS1naXQgYS9mcy9leHQyL2Rpci5jIGIvZnMvZXh0Mi9kaXIuYwppbmRleCA2Y2RlOTcwLi5mYzJiZDA1IDEwMDY0NAotLS0gYS9mcy9leHQyL2Rpci5jCisrKyBiL2ZzL2V4dDIvZGlyLmMKQEAgLTM1Myw4ICszNTMsOCBAQAogICoJZXh0Ml9maW5kX2VudHJ5KCkKICAqCiAgKiBmaW5kcyBhbiBlbnRyeSBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB3aXRoIHRoZSB3YW50ZWQgbmFtZS4gSXQKLSAqIHJldHVybnMgdGhlIHBhZ2UgaW4gd2hpY2ggdGhlIGVudHJ5IHdhcyBmb3VuZCwgYW5kIHRoZSBlbnRyeSBpdHNlbGYKLSAqIChhcyBhIHBhcmFtZXRlciAtIHJlc19kaXIpLiBQYWdlIGlzIHJldHVybmVkIG1hcHBlZCBhbmQgdW5sb2NrZWQuCisgKiByZXR1cm5zIHRoZSBwYWdlIGluIHdoaWNoIHRoZSBlbnRyeSB3YXMgZm91bmQgKGFzIGEgcGFyYW1ldGVyIC0gcmVzX3BhZ2UpLAorICogYW5kIHRoZSBlbnRyeSBpdHNlbGYuIFBhZ2UgaXMgcmV0dXJuZWQgbWFwcGVkIGFuZCB1bmxvY2tlZC4KICAqIEVudHJ5IGlzIGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQuCiAgKi8KIHN0cnVjdCBleHQyX2Rpcl9lbnRyeV8yICpleHQyX2ZpbmRfZW50cnkgKHN0cnVjdCBpbm9kZSAqIGRpciwKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvZXh0Mi5oIGIvZnMvZXh0Mi9leHQyLmgKaW5kZXggOWE4YThlMi4uZGEzMThiMCAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9leHQyLmgKKysrIGIvZnMvZXh0Mi9leHQyLmgKQEAgLTE0Miw3ICsxNDIsNyBAQAogLyogc3VwZXIuYyAqLwogZXh0ZXJuIHZvaWQgZXh0Ml9lcnJvciAoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pCiAJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwotZXh0ZXJuIHZvaWQgZXh0Ml93YXJuaW5nIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKK2V4dGVybiB2b2lkIGV4dDJfbXNnKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKQogCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKIGV4dGVybiB2b2lkIGV4dDJfdXBkYXRlX2R5bmFtaWNfcmV2IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIGV4dGVybiB2b2lkIGV4dDJfd3JpdGVfc3VwZXIgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvaW5vZGUuYyBiL2ZzL2V4dDIvaW5vZGUuYwppbmRleCBhZGU2MzQwLi43MWIwMzJjIDEwMDY0NAotLS0gYS9mcy9leHQyL2lub2RlLmMKKysrIGIvZnMvZXh0Mi9pbm9kZS5jCkBAIC0xMzcsNyArMTM3LDggQEAKIAlpbnQgZmluYWwgPSAwOwogCiAJaWYgKGlfYmxvY2sgPCAwKSB7Ci0JCWV4dDJfd2FybmluZyAoaW5vZGUtPmlfc2IsICJleHQyX2Jsb2NrX3RvX3BhdGgiLCAiYmxvY2sgPCAwIik7CisJCWV4dDJfbXNnKGlub2RlLT5pX3NiLCBLRVJOX1dBUk5JTkcsCisJCQkid2FybmluZzogJXM6IGJsb2NrIDwgMCIsIF9fZnVuY19fKTsKIAl9IGVsc2UgaWYgKGlfYmxvY2sgPCBkaXJlY3RfYmxvY2tzKSB7CiAJCW9mZnNldHNbbisrXSA9IGlfYmxvY2s7CiAJCWZpbmFsID0gZGlyZWN0X2Jsb2NrczsKQEAgLTE1Nyw3ICsxNTgsOCBAQAogCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKIAkJZmluYWwgPSBwdHJzOwogCX0gZWxzZSB7Ci0JCWV4dDJfd2FybmluZyAoaW5vZGUtPmlfc2IsICJleHQyX2Jsb2NrX3RvX3BhdGgiLCAiYmxvY2sgPiBiaWciKTsKKwkJZXh0Ml9tc2coaW5vZGUtPmlfc2IsIEtFUk5fV0FSTklORywKKwkJCSJ3YXJuaW5nOiAlczogYmxvY2sgaXMgdG9vIGJpZyIsIF9fZnVuY19fKTsKIAl9CiAJaWYgKGJvdW5kYXJ5KQogCQkqYm91bmRhcnkgPSBmaW5hbCAtIDEgLSAoaV9ibG9jayAmIChwdHJzIC0gMSkpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9zdXBlci5jIGIvZnMvZXh0Mi9zdXBlci5jCmluZGV4IDFhOWZmZWUuLjEzODg4MDIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvc3VwZXIuYworKysgYi9mcy9leHQyL3N1cGVyLmMKQEAgLTU4LDI3ICs1OCwyNyBAQAogCX0KIAogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JcHJpbnRrKEtFUk5fQ1JJVCAiRVhUMi1mcyBlcnJvciAoZGV2aWNlICVzKTogJXM6ICIsc2ItPnNfaWQsIGZ1bmN0aW9uKTsKKwlwcmludGsoS0VSTl9DUklUICJFWFQyLWZzICglcyk6IGVycm9yOiAlczogIiwgc2ItPnNfaWQsIGZ1bmN0aW9uKTsKIAl2cHJpbnRrKGZtdCwgYXJncyk7CiAJcHJpbnRrKCJcbiIpOwogCXZhX2VuZChhcmdzKTsKIAogCWlmICh0ZXN0X29wdChzYiwgRVJST1JTX1BBTklDKSkKLQkJcGFuaWMoIkVYVDItZnMgcGFuaWMgZnJvbSBwcmV2aW91cyBlcnJvclxuIik7CisJCXBhbmljKCJFWFQyLWZzOiBwYW5pYyBmcm9tIHByZXZpb3VzIGVycm9yXG4iKTsKIAlpZiAodGVzdF9vcHQoc2IsIEVSUk9SU19STykpIHsKLQkJcHJpbnRrKCJSZW1vdW50aW5nIGZpbGVzeXN0ZW0gcmVhZC1vbmx5XG4iKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fQ1JJVCwKKwkJCSAgICAgImVycm9yOiByZW1vdW50aW5nIGZpbGVzeXN0ZW0gcmVhZC1vbmx5Iik7CiAJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKIAl9CiB9CiAKLXZvaWQgZXh0Ml93YXJuaW5nIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3QgY2hhciAqIGZ1bmN0aW9uLAotCQkgICBjb25zdCBjaGFyICogZm10LCAuLi4pCit2b2lkIGV4dDJfbXNnKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJdmFfbGlzdCBhcmdzOwogCiAJdmFfc3RhcnQoYXJncywgZm10KTsKLQlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQyLWZzIHdhcm5pbmcgKGRldmljZSAlcyk6ICVzOiAiLAotCSAgICAgICBzYi0+c19pZCwgZnVuY3Rpb24pOworCXByaW50aygiJXNFWFQyLWZzICglcyk6ICIsIHByZWZpeCwgc2ItPnNfaWQpOwogCXZwcmludGsoZm10LCBhcmdzKTsKIAlwcmludGsoIlxuIik7CiAJdmFfZW5kKGFyZ3MpOwpAQCAtOTEsOSArOTEsOSBAQAogCWlmIChsZTMyX3RvX2NwdShlcy0+c19yZXZfbGV2ZWwpID4gRVhUMl9HT09EX09MRF9SRVYpCiAJCXJldHVybjsKIAotCWV4dDJfd2FybmluZyhzYiwgX19mdW5jX18sCi0JCSAgICAgInVwZGF0aW5nIHRvIHJldiAlZCBiZWNhdXNlIG9mIG5ldyBmZWF0dXJlIGZsYWcsICIKLQkJICAgICAicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWQiLAorCWV4dDJfbXNnKHNiLCBLRVJOX1dBUk5JTkcsCisJCSAgICAgIndhcm5pbmc6IHVwZGF0aW5nIHRvIHJldiAlZCBiZWNhdXNlIG9mICIKKwkJICAgICAibmV3IGZlYXR1cmUgZmxhZywgcnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWQiLAogCQkgICAgIEVYVDJfRFlOQU1JQ19SRVYpOwogCiAJZXMtPnNfZmlyc3RfaW5vID0gY3B1X3RvX2xlMzIoRVhUMl9HT09EX09MRF9GSVJTVF9JTk8pOwpAQCAtNDE5LDEwICs0MTksMTAgQEAKIAl7T3B0X2VyciwgTlVMTH0KIH07CiAKLXN0YXRpYyBpbnQgcGFyc2Vfb3B0aW9ucyAoY2hhciAqIG9wdGlvbnMsCi0JCQkgIHN0cnVjdCBleHQyX3NiX2luZm8gKnNiaSkKK3N0YXRpYyBpbnQgcGFyc2Vfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCWNoYXIgKiBwOworCWNoYXIgKnA7CisJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQihzYik7CiAJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOwogCWludCBvcHRpb247CiAKQEAgLTUwNSw3ICs1MDUsOCBAQAogI2Vsc2UKIAkJY2FzZSBPcHRfdXNlcl94YXR0cjoKIAkJY2FzZSBPcHRfbm91c2VyX3hhdHRyOgotCQkJcHJpbnRrKCJFWFQyIChubyl1c2VyX3hhdHRyIG9wdGlvbnMgbm90IHN1cHBvcnRlZFxuIik7CisJCQlleHQyX21zZyhzYiwgS0VSTl9JTkZPLCAiKG5vKXVzZXJfeGF0dHIgb3B0aW9ucyIKKwkJCQkibm90IHN1cHBvcnRlZCIpOwogCQkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0wKQEAgLTUxOCwxNCArNTE5LDE1IEBACiAjZWxzZQogCQljYXNlIE9wdF9hY2w6CiAJCWNhc2UgT3B0X25vYWNsOgotCQkJcHJpbnRrKCJFWFQyIChubylhY2wgb3B0aW9ucyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCWV4dDJfbXNnKHNiLCBLRVJOX0lORk8sCisJCQkJIihubylhY2wgb3B0aW9ucyBub3Qgc3VwcG9ydGVkIik7CiAJCQlicmVhazsKICNlbmRpZgogCQljYXNlIE9wdF94aXA6CiAjaWZkZWYgQ09ORklHX0VYVDJfRlNfWElQCiAJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBYSVApOwogI2Vsc2UKLQkJCXByaW50aygiRVhUMiB4aXAgb3B0aW9uIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJZXh0Ml9tc2coc2IsIEtFUk5fSU5GTywgInhpcCBvcHRpb24gbm90IHN1cHBvcnRlZCIpOwogI2VuZGlmCiAJCQlicmVhazsKIApAQCAtNTQyLDE5ICs1NDQsMTggQEAKIAkJY2FzZSBPcHRfcXVvdGE6CiAJCWNhc2UgT3B0X3VzcnF1b3RhOgogCQljYXNlIE9wdF9ncnBxdW90YToKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSJFWFQyLWZzOiBxdW90YSBvcGVyYXRpb25zIG5vdCBzdXBwb3J0ZWQuXG4iKTsKLQorCQkJZXh0Ml9tc2coc2IsIEtFUk5fSU5GTywKKwkJCQkicXVvdGEgb3BlcmF0aW9ucyBub3Qgc3VwcG9ydGVkIik7CiAJCQlicmVhazsKICNlbmRpZgogCiAJCWNhc2UgT3B0X3Jlc2VydmF0aW9uOgogCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBSRVNFUlZBVElPTik7Ci0JCQlwcmludGsoInJlc2VydmF0aW9ucyBPTlxuIik7CisJCQlleHQyX21zZyhzYiwgS0VSTl9JTkZPLCAicmVzZXJ2YXRpb25zIE9OIik7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfbm9yZXNlcnZhdGlvbjoKIAkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBSRVNFUlZBVElPTik7Ci0JCQlwcmludGsoInJlc2VydmF0aW9ucyBPRkZcbiIpOworCQkJZXh0Ml9tc2coc2IsIEtFUk5fSU5GTywgInJlc2VydmF0aW9ucyBPRkYiKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9pZ25vcmU6CiAJCQlicmVhazsKQEAgLTU3MywzNCArNTc0LDQwIEBACiAJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQihzYik7CiAKIAlpZiAobGUzMl90b19jcHUoZXMtPnNfcmV2X2xldmVsKSA+IEVYVDJfTUFYX1NVUFBfUkVWKSB7Ci0JCXByaW50ayAoIkVYVDItZnMgd2FybmluZzogcmV2aXNpb24gbGV2ZWwgdG9vIGhpZ2gsICIKLQkJCSJmb3JjaW5nIHJlYWQtb25seSBtb2RlXG4iKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fRVJSLAorCQkJImVycm9yOiByZXZpc2lvbiBsZXZlbCB0b28gaGlnaCwgIgorCQkJImZvcmNpbmcgcmVhZC1vbmx5IG1vZGUiKTsKIAkJcmVzID0gTVNfUkRPTkxZOwogCX0KIAlpZiAocmVhZF9vbmx5KQogCQlyZXR1cm4gcmVzOwogCWlmICghKHNiaS0+c19tb3VudF9zdGF0ZSAmIEVYVDJfVkFMSURfRlMpKQotCQlwcmludGsgKCJFWFQyLWZzIHdhcm5pbmc6IG1vdW50aW5nIHVuY2hlY2tlZCBmcywgIgotCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fV0FSTklORywKKwkJCSJ3YXJuaW5nOiBtb3VudGluZyB1bmNoZWNrZWQgZnMsICIKKwkJCSJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZCIpOwogCWVsc2UgaWYgKChzYmktPnNfbW91bnRfc3RhdGUgJiBFWFQyX0VSUk9SX0ZTKSkKLQkJcHJpbnRrICgiRVhUMi1mcyB3YXJuaW5nOiBtb3VudGluZyBmcyB3aXRoIGVycm9ycywgIgotCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fV0FSTklORywKKwkJCSJ3YXJuaW5nOiBtb3VudGluZyBmcyB3aXRoIGVycm9ycywgIgorCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkIik7CiAJZWxzZSBpZiAoKF9fczE2KSBsZTE2X3RvX2NwdShlcy0+c19tYXhfbW50X2NvdW50KSA+PSAwICYmCiAJCSBsZTE2X3RvX2NwdShlcy0+c19tbnRfY291bnQpID49CiAJCSAodW5zaWduZWQgc2hvcnQpIChfX3MxNikgbGUxNl90b19jcHUoZXMtPnNfbWF4X21udF9jb3VudCkpCi0JCXByaW50ayAoIkVYVDItZnMgd2FybmluZzogbWF4aW1hbCBtb3VudCBjb3VudCByZWFjaGVkLCAiCi0JCQkicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOworCQlleHQyX21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkJIndhcm5pbmc6IG1heGltYWwgbW91bnQgY291bnQgcmVhY2hlZCwgIgorCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkIik7CiAJZWxzZSBpZiAobGUzMl90b19jcHUoZXMtPnNfY2hlY2tpbnRlcnZhbCkgJiYKLQkJKGxlMzJfdG9fY3B1KGVzLT5zX2xhc3RjaGVjaykgKyBsZTMyX3RvX2NwdShlcy0+c19jaGVja2ludGVydmFsKSA8PSBnZXRfc2Vjb25kcygpKSkKLQkJcHJpbnRrICgiRVhUMi1mcyB3YXJuaW5nOiBjaGVja3RpbWUgcmVhY2hlZCwgIgotCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwkJKGxlMzJfdG9fY3B1KGVzLT5zX2xhc3RjaGVjaykgKworCQkJbGUzMl90b19jcHUoZXMtPnNfY2hlY2tpbnRlcnZhbCkgPD0gZ2V0X3NlY29uZHMoKSkpCisJCWV4dDJfbXNnKHNiLCBLRVJOX1dBUk5JTkcsCisJCQkid2FybmluZzogY2hlY2t0aW1lIHJlYWNoZWQsICIKKwkJCSJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZCIpOwogCWlmICghbGUxNl90b19jcHUoZXMtPnNfbWF4X21udF9jb3VudCkpCiAJCWVzLT5zX21heF9tbnRfY291bnQgPSBjcHVfdG9fbGUxNihFWFQyX0RGTF9NQVhfTU5UX0NPVU5UKTsKIAlsZTE2X2FkZF9jcHUoJmVzLT5zX21udF9jb3VudCwgMSk7CiAJZXh0Ml93cml0ZV9zdXBlcihzYik7CiAJaWYgKHRlc3Rfb3B0IChzYiwgREVCVUcpKQotCQlwcmludGsgKCJbRVhUIElJIEZTICVzLCAlcywgYnM9JWx1LCBmcz0lbHUsIGdjPSVsdSwgIgotCQkJImJwZz0lbHUsIGlwZz0lbHUsIG1vPSUwNGx4XVxuIiwKKwkJZXh0Ml9tc2coc2IsIEtFUk5fSU5GTywgIiVzLCAlcywgYnM9JWx1LCBmcz0lbHUsIGdjPSVsdSwgIgorCQkJImJwZz0lbHUsIGlwZz0lbHUsIG1vPSUwNGx4XSIsCiAJCQlFWFQyRlNfVkVSU0lPTiwgRVhUMkZTX0RBVEUsIHNiLT5zX2Jsb2Nrc2l6ZSwKIAkJCXNiaS0+c19mcmFnX3NpemUsCiAJCQlzYmktPnNfZ3JvdXBzX2NvdW50LApAQCAtNzY3LDcgKzc3NCw3IEBACiAJICovCiAJYmxvY2tzaXplID0gc2JfbWluX2Jsb2Nrc2l6ZShzYiwgQkxPQ0tfU0laRSk7CiAJaWYgKCFibG9ja3NpemUpIHsKLQkJcHJpbnRrICgiRVhUMi1mczogdW5hYmxlIHRvIHNldCBibG9ja3NpemVcbiIpOworCQlleHQyX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogdW5hYmxlIHRvIHNldCBibG9ja3NpemUiKTsKIAkJZ290byBmYWlsZWRfc2JpOwogCX0KIApAQCAtNzgzLDcgKzc5MCw3IEBACiAJfQogCiAJaWYgKCEoYmggPSBzYl9icmVhZChzYiwgbG9naWNfc2JfYmxvY2spKSkgewotCQlwcmludGsgKCJFWFQyLWZzOiB1bmFibGUgdG8gcmVhZCBzdXBlcmJsb2NrXG4iKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IHVuYWJsZSB0byByZWFkIHN1cGVyYmxvY2siKTsKIAkJZ290byBmYWlsZWRfc2JpOwogCX0KIAkvKgpAQCAtODI2LDcgKzgzMyw3IEBACiAJCiAJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBSRVNFUlZBVElPTik7CiAKLQlpZiAoIXBhcnNlX29wdGlvbnMgKChjaGFyICopIGRhdGEsIHNiaSkpCisJaWYgKCFwYXJzZV9vcHRpb25zKChjaGFyICopIGRhdGEsIHNiKSkKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAKIAlzYi0+c19mbGFncyA9IChzYi0+c19mbGFncyAmIH5NU19QT1NJWEFDTCkgfApAQCAtODQwLDggKzg0Nyw5IEBACiAJICAgIChFWFQyX0hBU19DT01QQVRfRkVBVFVSRShzYiwgfjBVKSB8fAogCSAgICAgRVhUMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsIH4wVSkgfHwKIAkgICAgIEVYVDJfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIH4wVSkpKQotCQlwcmludGsoIkVYVDItZnMgd2FybmluZzogZmVhdHVyZSBmbGFncyBzZXQgb24gcmV2IDAgZnMsICIKLQkJICAgICAgICJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZFxuIik7CisJCWV4dDJfbXNnKHNiLCBLRVJOX1dBUk5JTkcsCisJCQkid2FybmluZzogZmVhdHVyZSBmbGFncyBzZXQgb24gcmV2IDAgZnMsICIKKwkJCSJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZCIpOwogCS8qCiAJICogQ2hlY2sgZmVhdHVyZSBmbGFncyByZWdhcmRsZXNzIG9mIHRoZSByZXZpc2lvbiBsZXZlbCwgc2luY2Ugd2UKIAkgKiBwcmV2aW91c2x5IGRpZG4ndCBjaGFuZ2UgdGhlIHJldmlzaW9uIGxldmVsIHdoZW4gc2V0dGluZyB0aGUgZmxhZ3MsCkBAIC04NDksMTYgKzg1NywxNiBAQAogCSAqLwogCWZlYXR1cmVzID0gRVhUMl9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgfkVYVDJfRkVBVFVSRV9JTkNPTVBBVF9TVVBQKTsKIAlpZiAoZmVhdHVyZXMpIHsKLQkJcHJpbnRrKCJFWFQyLWZzOiAlczogY291bGRuJ3QgbW91bnQgYmVjYXVzZSBvZiAiCi0JCSAgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsCi0JCSAgICAgICBzYi0+c19pZCwgbGUzMl90b19jcHUoZmVhdHVyZXMpKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fRVJSLAkiZXJyb3I6IGNvdWxkbid0IG1vdW50IGJlY2F1c2Ugb2YgIgorCQkgICAgICAgInVuc3VwcG9ydGVkIG9wdGlvbmFsIGZlYXR1cmVzICgleCkiLAorCQkJbGUzMl90b19jcHUoZmVhdHVyZXMpKTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJgogCSAgICAoZmVhdHVyZXMgPSBFWFQyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgfkVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1VQUCkpKXsKLQkJcHJpbnRrKCJFWFQyLWZzOiAlczogY291bGRuJ3QgbW91bnQgUkRXUiBiZWNhdXNlIG9mICIKLQkJICAgICAgICJ1bnN1cHBvcnRlZCBvcHRpb25hbCBmZWF0dXJlcyAoJXgpLlxuIiwKLQkJICAgICAgIHNiLT5zX2lkLCBsZTMyX3RvX2NwdShmZWF0dXJlcykpOworCQlleHQyX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogY291bGRuJ3QgbW91bnQgUkRXUiBiZWNhdXNlIG9mICIKKwkJICAgICAgICJ1bnN1cHBvcnRlZCBvcHRpb25hbCBmZWF0dXJlcyAoJXgpIiwKKwkJICAgICAgIGxlMzJfdG9fY3B1KGZlYXR1cmVzKSk7CiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIApAQCAtODY2LDcgKzg3NCw4IEBACiAKIAlpZiAoZXh0Ml91c2VfeGlwKHNiKSAmJiBibG9ja3NpemUgIT0gUEFHRV9TSVpFKSB7CiAJCWlmICghc2lsZW50KQotCQkJcHJpbnRrKCJYSVA6IFVuc3VwcG9ydGVkIGJsb2Nrc2l6ZVxuIik7CisJCQlleHQyX21zZyhzYiwgS0VSTl9FUlIsCisJCQkJImVycm9yOiB1bnN1cHBvcnRlZCBibG9ja3NpemUgZm9yIHhpcCIpOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAKQEAgLTg3NSw3ICs4ODQsNyBAQAogCQlicmVsc2UoYmgpOwogCiAJCWlmICghc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgYmxvY2tzaXplKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQyLWZzOiBibG9ja3NpemUgdG9vIHNtYWxsIGZvciBkZXZpY2UuXG4iKTsKKwkJCWV4dDJfbXNnKHNiLCBLRVJOX0VSUiwgImVycm9yOiBibG9ja3NpemUgaXMgdG9vIHNtYWxsIik7CiAJCQlnb3RvIGZhaWxlZF9zYmk7CiAJCX0KIApAQCAtODgzLDE0ICs4OTIsMTQgQEAKIAkJb2Zmc2V0ID0gKHNiX2Jsb2NrKkJMT0NLX1NJWkUpICUgYmxvY2tzaXplOwogCQliaCA9IHNiX2JyZWFkKHNiLCBsb2dpY19zYl9ibG9jayk7CiAJCWlmKCFiaCkgewotCQkJcHJpbnRrKCJFWFQyLWZzOiBDb3VsZG4ndCByZWFkIHN1cGVyYmxvY2sgb24gIgotCQkJICAgICAgICIybmQgdHJ5LlxuIik7CisJCQlleHQyX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogY291bGRuJ3QgcmVhZCIKKwkJCQkic3VwZXJibG9jayBvbiAybmQgdHJ5Iik7CiAJCQlnb3RvIGZhaWxlZF9zYmk7CiAJCX0KIAkJZXMgPSAoc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKikgKCgoY2hhciAqKWJoLT5iX2RhdGEpICsgb2Zmc2V0KTsKIAkJc2JpLT5zX2VzID0gZXM7CiAJCWlmIChlcy0+c19tYWdpYyAhPSBjcHVfdG9fbGUxNihFWFQyX1NVUEVSX01BR0lDKSkgewotCQkJcHJpbnRrICgiRVhUMi1mczogTWFnaWMgbWlzbWF0Y2gsIHZlcnkgd2VpcmQgIVxuIik7CisJCQlleHQyX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogbWFnaWMgbWlzbWF0Y2giKTsKIAkJCWdvdG8gZmFpbGVkX21vdW50OwogCQl9CiAJfQpAQCAtOTA2LDcgKzkxNSw4IEBACiAJCWlmICgoc2JpLT5zX2lub2RlX3NpemUgPCBFWFQyX0dPT0RfT0xEX0lOT0RFX1NJWkUpIHx8CiAJCSAgICAhaXNfcG93ZXJfb2ZfMihzYmktPnNfaW5vZGVfc2l6ZSkgfHwKIAkJICAgIChzYmktPnNfaW5vZGVfc2l6ZSA+IGJsb2Nrc2l6ZSkpIHsKLQkJCXByaW50ayAoIkVYVDItZnM6IHVuc3VwcG9ydGVkIGlub2RlIHNpemU6ICVkXG4iLAorCQkJZXh0Ml9tc2coc2IsIEtFUk5fRVJSLAorCQkJCSJlcnJvcjogdW5zdXBwb3J0ZWQgaW5vZGUgc2l6ZTogJWQiLAogCQkJCXNiaS0+c19pbm9kZV9zaXplKTsKIAkJCWdvdG8gZmFpbGVkX21vdW50OwogCQl9CkBAIC05NDMsMjkgKzk1MywzMyBAQAogCiAJaWYgKHNiLT5zX2Jsb2Nrc2l6ZSAhPSBiaC0+Yl9zaXplKSB7CiAJCWlmICghc2lsZW50KQotCQkJcHJpbnRrICgiVkZTOiBVbnN1cHBvcnRlZCBibG9ja3NpemUgb24gZGV2ICIKLQkJCQkiJXMuXG4iLCBzYi0+c19pZCk7CisJCQlleHQyX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogdW5zdXBwb3J0ZWQgYmxvY2tzaXplIik7CiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIAogCWlmIChzYi0+c19ibG9ja3NpemUgIT0gc2JpLT5zX2ZyYWdfc2l6ZSkgewotCQlwcmludGsgKCJFWFQyLWZzOiBmcmFnc2l6ZSAlbHUgIT0gYmxvY2tzaXplICVsdSAobm90IHN1cHBvcnRlZCB5ZXQpXG4iLAorCQlleHQyX21zZyhzYiwgS0VSTl9FUlIsCisJCQkiZXJyb3I6IGZyYWdzaXplICVsdSAhPSBibG9ja3NpemUgJWx1IgorCQkJIihub3Qgc3VwcG9ydGVkIHlldCkiLAogCQkJc2JpLT5zX2ZyYWdfc2l6ZSwgc2ItPnNfYmxvY2tzaXplKTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQogCiAJaWYgKHNiaS0+c19ibG9ja3NfcGVyX2dyb3VwID4gc2ItPnNfYmxvY2tzaXplICogOCkgewotCQlwcmludGsgKCJFWFQyLWZzOiAjYmxvY2tzIHBlciBncm91cCB0b28gYmlnOiAlbHVcbiIsCisJCWV4dDJfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSJlcnJvcjogI2Jsb2NrcyBwZXIgZ3JvdXAgdG9vIGJpZzogJWx1IiwKIAkJCXNiaS0+c19ibG9ja3NfcGVyX2dyb3VwKTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQogCWlmIChzYmktPnNfZnJhZ3NfcGVyX2dyb3VwID4gc2ItPnNfYmxvY2tzaXplICogOCkgewotCQlwcmludGsgKCJFWFQyLWZzOiAjZnJhZ21lbnRzIHBlciBncm91cCB0b28gYmlnOiAlbHVcbiIsCisJCWV4dDJfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSJlcnJvcjogI2ZyYWdtZW50cyBwZXIgZ3JvdXAgdG9vIGJpZzogJWx1IiwKIAkJCXNiaS0+c19mcmFnc19wZXJfZ3JvdXApOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAJaWYgKHNiaS0+c19pbm9kZXNfcGVyX2dyb3VwID4gc2ItPnNfYmxvY2tzaXplICogOCkgewotCQlwcmludGsgKCJFWFQyLWZzOiAjaW5vZGVzIHBlciBncm91cCB0b28gYmlnOiAlbHVcbiIsCisJCWV4dDJfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSJlcnJvcjogI2lub2RlcyBwZXIgZ3JvdXAgdG9vIGJpZzogJWx1IiwKIAkJCXNiaS0+c19pbm9kZXNfcGVyX2dyb3VwKTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQpAQCAtOTc5LDEzICs5OTMsMTMgQEAKIAkJICAgRVhUMl9ERVNDX1BFUl9CTE9DSyhzYik7CiAJc2JpLT5zX2dyb3VwX2Rlc2MgPSBrbWFsbG9jIChkYl9jb3VudCAqIHNpemVvZiAoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBHRlBfS0VSTkVMKTsKIAlpZiAoc2JpLT5zX2dyb3VwX2Rlc2MgPT0gTlVMTCkgewotCQlwcmludGsgKCJFWFQyLWZzOiBub3QgZW5vdWdoIG1lbW9yeVxuIik7CisJCWV4dDJfbXNnKHNiLCBLRVJOX0VSUiwgImVycm9yOiBub3QgZW5vdWdoIG1lbW9yeSIpOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAJYmdsX2xvY2tfaW5pdChzYmktPnNfYmxvY2tncm91cF9sb2NrKTsKIAlzYmktPnNfZGVidHMgPSBrY2FsbG9jKHNiaS0+c19ncm91cHNfY291bnQsIHNpemVvZigqc2JpLT5zX2RlYnRzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmktPnNfZGVidHMpIHsKLQkJcHJpbnRrICgiRVhUMi1mczogbm90IGVub3VnaCBtZW1vcnlcbiIpOworCQlleHQyX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogbm90IGVub3VnaCBtZW1vcnkiKTsKIAkJZ290byBmYWlsZWRfbW91bnRfZ3JvdXBfZGVzYzsKIAl9CiAJZm9yIChpID0gMDsgaSA8IGRiX2NvdW50OyBpKyspIHsKQEAgLTk5NCwxMiArMTAwOCwxMyBAQAogCQlpZiAoIXNiaS0+c19ncm91cF9kZXNjW2ldKSB7CiAJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQogCQkJCWJyZWxzZSAoc2JpLT5zX2dyb3VwX2Rlc2Nbal0pOwotCQkJcHJpbnRrICgiRVhUMi1mczogdW5hYmxlIHRvIHJlYWQgZ3JvdXAgZGVzY3JpcHRvcnNcbiIpOworCQkJZXh0Ml9tc2coc2IsIEtFUk5fRVJSLAorCQkJCSJlcnJvcjogdW5hYmxlIHRvIHJlYWQgZ3JvdXAgZGVzY3JpcHRvcnMiKTsKIAkJCWdvdG8gZmFpbGVkX21vdW50X2dyb3VwX2Rlc2M7CiAJCX0KIAl9CiAJaWYgKCFleHQyX2NoZWNrX2Rlc2NyaXB0b3JzIChzYikpIHsKLQkJcHJpbnRrICgiRVhUMi1mczogZ3JvdXAgZGVzY3JpcHRvcnMgY29ycnVwdGVkIVxuIik7CisJCWV4dDJfbXNnKHNiLCBLRVJOX0VSUiwgImdyb3VwIGRlc2NyaXB0b3JzIGNvcnJ1cHRlZCIpOwogCQlnb3RvIGZhaWxlZF9tb3VudDI7CiAJfQogCXNiaS0+c19nZGJfY291bnQgPSBkYl9jb3VudDsKQEAgLTEwMzIsNyArMTA0Nyw3IEBACiAJCQkJZXh0Ml9jb3VudF9kaXJzKHNiKSk7CiAJfQogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQyLWZzOiBpbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IGluc3VmZmljaWVudCBtZW1vcnkiKTsKIAkJZ290byBmYWlsZWRfbW91bnQzOwogCX0KIAkvKgpAQCAtMTA0OCwyNyArMTA2MywyOCBAQAogCX0KIAlpZiAoIVNfSVNESVIocm9vdC0+aV9tb2RlKSB8fCAhcm9vdC0+aV9ibG9ja3MgfHwgIXJvb3QtPmlfc2l6ZSkgewogCQlpcHV0KHJvb3QpOwotCQlwcmludGsoS0VSTl9FUlIgIkVYVDItZnM6IGNvcnJ1cHQgcm9vdCBpbm9kZSwgcnVuIGUyZnNja1xuIik7CisJCWV4dDJfbXNnKHNiLCBLRVJOX0VSUiwgImVycm9yOiBjb3JydXB0IHJvb3QgaW5vZGUsIHJ1biBlMmZzY2siKTsKIAkJZ290byBmYWlsZWRfbW91bnQzOwogCX0KIAogCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CiAJaWYgKCFzYi0+c19yb290KSB7CiAJCWlwdXQocm9vdCk7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUMi1mczogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IGdldCByb290IGlub2RlIGZhaWxlZCIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWxlZF9tb3VudDM7CiAJfQogCWlmIChFWFQyX0hBU19DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpCi0JCWV4dDJfd2FybmluZyhzYiwgX19mdW5jX18sCi0JCQkibW91bnRpbmcgZXh0MyBmaWxlc3lzdGVtIGFzIGV4dDIiKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fV0FSTklORywKKwkJCSJ3YXJuaW5nOiBtb3VudGluZyBleHQzIGZpbGVzeXN0ZW0gYXMgZXh0MiIpOwogCWV4dDJfc2V0dXBfc3VwZXIgKHNiLCBlcywgc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpOwogCXJldHVybiAwOwogCiBjYW50ZmluZF9leHQyOgogCWlmICghc2lsZW50KQotCQlwcmludGsoIlZGUzogQ2FuJ3QgZmluZCBhbiBleHQyIGZpbGVzeXN0ZW0gb24gZGV2ICVzLlxuIiwKLQkJICAgICAgIHNiLT5zX2lkKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fRVJSLAorCQkJImVycm9yOiBjYW4ndCBmaW5kIGFuIGV4dDIgZmlsZXN5c3RlbSBvbiBkZXYgJXMuIiwKKwkJCXNiLT5zX2lkKTsKIAlnb3RvIGZhaWxlZF9tb3VudDsKIGZhaWxlZF9tb3VudDM6CiAJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CkBAIC0xMTIxLDggKzExMzcsMjQgQEAKIHN0YXRpYyBpbnQgZXh0Ml9zeW5jX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB3YWl0KQogewogCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICplcyA9IEVYVDJfU0Ioc2IpLT5zX2VzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqc2JoID0gRVhUMl9TQihzYiktPnNfc2JoOwogCiAJbG9ja19rZXJuZWwoKTsKKwlpZiAoYnVmZmVyX3dyaXRlX2lvX2Vycm9yKHNiaCkpIHsKKwkJLyoKKwkJICogT2gsIGRlYXIuICBBIHByZXZpb3VzIGF0dGVtcHQgdG8gd3JpdGUgdGhlCisJCSAqIHN1cGVyYmxvY2sgZmFpbGVkLiAgVGhpcyBjb3VsZCBoYXBwZW4gYmVjYXVzZSB0aGUKKwkJICogVVNCIGRldmljZSB3YXMgeWFua2VkIG91dC4gIE9yIGl0IGNvdWxkIGhhcHBlbiB0bworCQkgKiBiZSBhIHRyYW5zaWVudCB3cml0ZSBlcnJvciBhbmQgbWF5YmUgdGhlIGJsb2NrIHdpbGwKKwkJICogYmUgcmVtYXBwZWQuICBOb3RoaW5nIHdlIGNhbiBkbyBidXQgdG8gcmV0cnkgdGhlCisJCSAqIHdyaXRlIGFuZCBob3BlIGZvciB0aGUgYmVzdC4KKwkJICovCisJCWV4dDJfbXNnKHNiLCBLRVJOX0VSUiwKKwkJICAgICAgICJwcmV2aW91cyBJL08gZXJyb3IgdG8gc3VwZXJibG9jayBkZXRlY3RlZFxuIik7CisJCWNsZWFyX2J1ZmZlcl93cml0ZV9pb19lcnJvcihzYmgpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKHNiaCk7CisJfQorCiAJaWYgKGVzLT5zX3N0YXRlICYgY3B1X3RvX2xlMTYoRVhUMl9WQUxJRF9GUykpIHsKIAkJZXh0Ml9kZWJ1Zygic2V0dGluZyB2YWxpZCB0byAwXG4iKTsKIAkJZXMtPnNfc3RhdGUgJj0gY3B1X3RvX2xlMTYofkVYVDJfVkFMSURfRlMpOwpAQCAtMTE3MCw3ICsxMjAyLDcgQEAKIAkvKgogCSAqIEFsbG93IHRoZSAiY2hlY2siIG9wdGlvbiB0byBiZSBwYXNzZWQgYXMgYSByZW1vdW50IG9wdGlvbi4KIAkgKi8KLQlpZiAoIXBhcnNlX29wdGlvbnMgKGRhdGEsIHNiaSkpIHsKKwlpZiAoIXBhcnNlX29wdGlvbnMoZGF0YSwgc2IpKSB7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gcmVzdG9yZV9vcHRzOwogCX0KQEAgLTExODIsNyArMTIxNCw4IEBACiAJCQkJICAgIEVYVDJfTU9VTlRfWElQIGlmIG5vdCAqLwogCiAJaWYgKChleHQyX3VzZV94aXAoc2IpKSAmJiAoc2ItPnNfYmxvY2tzaXplICE9IFBBR0VfU0laRSkpIHsKLQkJcHJpbnRrKCJYSVA6IFVuc3VwcG9ydGVkIGJsb2Nrc2l6ZVxuIik7CisJCWV4dDJfbXNnKHNiLCBLRVJOX1dBUk5JTkcsCisJCQkid2FybmluZzogdW5zdXBwb3J0ZWQgYmxvY2tzaXplIGZvciB4aXAiKTsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byByZXN0b3JlX29wdHM7CiAJfQpAQCAtMTE5MSw4ICsxMjI0LDggQEAKIAlpZiAoKChzYmktPnNfbW91bnRfb3B0ICYgRVhUMl9NT1VOVF9YSVApICE9CiAJICAgIChvbGRfbW91bnRfb3B0ICYgRVhUMl9NT1VOVF9YSVApKSAmJgogCSAgICBpbnZhbGlkYXRlX2lub2RlcyhzYikpIHsKLQkJZXh0Ml93YXJuaW5nKHNiLCBfX2Z1bmNfXywgInJlZnVzaW5nIGNoYW5nZSBvZiB4aXAgZmxhZyAiCi0JCQkgICAgICJ3aXRoIGJ1c3kgaW5vZGVzIHdoaWxlIHJlbW91bnRpbmciKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fV0FSTklORywgIndhcm5pbmc6IHJlZnVzaW5nIGNoYW5nZSBvZiAiCisJCQkgInhpcCBmbGFnIHdpdGggYnVzeSBpbm9kZXMgd2hpbGUgcmVtb3VudGluZyIpOwogCQlzYmktPnNfbW91bnRfb3B0ICY9IH5FWFQyX01PVU5UX1hJUDsKIAkJc2JpLT5zX21vdW50X29wdCB8PSBvbGRfbW91bnRfb3B0ICYgRVhUMl9NT1VOVF9YSVA7CiAJfQpAQCAtMTIxNiw5ICsxMjQ5LDEwIEBACiAJCV9fbGUzMiByZXQgPSBFWFQyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKIAkJCQkJICAgICAgIH5FWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApOwogCQlpZiAocmV0KSB7Ci0JCQlwcmludGsoIkVYVDItZnM6ICVzOiBjb3VsZG4ndCByZW1vdW50IFJEV1IgYmVjYXVzZSBvZiAiCi0JCQkgICAgICAgInVuc3VwcG9ydGVkIG9wdGlvbmFsIGZlYXR1cmVzICgleCkuXG4iLAotCQkJICAgICAgIHNiLT5zX2lkLCBsZTMyX3RvX2NwdShyZXQpKTsKKwkJCWV4dDJfbXNnKHNiLCBLRVJOX1dBUk5JTkcsCisJCQkJIndhcm5pbmc6IGNvdWxkbid0IHJlbW91bnQgUkRXUiBiZWNhdXNlIG9mICIKKwkJCQkidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KS4iLAorCQkJCWxlMzJfdG9fY3B1KHJldCkpOwogCQkJZXJyID0gLUVST0ZTOwogCQkJZ290byByZXN0b3JlX29wdHM7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL2V4dDIveGlwLmMgYi9mcy9leHQyL3hpcC5jCmluZGV4IGMxOGZiZjMuLjMyMmE1NmIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIveGlwLmMKKysrIGIvZnMvZXh0Mi94aXAuYwpAQCAtNjksOCArNjksOSBAQAogCWlmICgoc2JpLT5zX21vdW50X29wdCAmIEVYVDJfTU9VTlRfWElQKSAmJgogCSAgICAhc2ItPnNfYmRldi0+YmRfZGlzay0+Zm9wcy0+ZGlyZWN0X2FjY2VzcykgewogCQlzYmktPnNfbW91bnRfb3B0ICY9ICh+RVhUMl9NT1VOVF9YSVApOwotCQlleHQyX3dhcm5pbmcoc2IsIF9fZnVuY19fLAotCQkJICAgICAiaWdub3JpbmcgeGlwIG9wdGlvbiAtIG5vdCBzdXBwb3J0ZWQgYnkgYmRldiIpOworCQlleHQyX21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkJICAgICAid2FybmluZzogaWdub3JpbmcgeGlwIG9wdGlvbiAtICIKKwkJCSAgICAgIm5vdCBzdXBwb3J0ZWQgYnkgYmRldiIpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZnMvZXh0My9pbm9kZS5jIGIvZnMvZXh0My9pbm9kZS5jCmluZGV4IDJkYjk1NzcuLmFkMTQyMjcgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaW5vZGUuYworKysgYi9mcy9leHQzL2lub2RlLmMKQEAgLTExNTEsNiArMTE1MSwxNiBAQAogCXJldHVybiBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKIH0KIAorLyoKKyAqIFRydW5jYXRlIGJsb2NrcyB0aGF0IHdlcmUgbm90IHVzZWQgYnkgd3JpdGUuIFdlIGhhdmUgdG8gdHJ1bmNhdGUgdGhlCisgKiBwYWdlY2FjaGUgYXMgd2VsbCBzbyB0aGF0IGNvcnJlc3BvbmRpbmcgYnVmZmVycyBnZXQgcHJvcGVybHkgdW5tYXBwZWQuCisgKi8KK3N0YXRpYyB2b2lkIGV4dDNfdHJ1bmNhdGVfZmFpbGVkX3dyaXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgaW5vZGUtPmlfc2l6ZSk7CisJZXh0M190cnVuY2F0ZShpbm9kZSk7Cit9CisKIHN0YXRpYyBpbnQgZXh0M193cml0ZV9iZWdpbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCQkJbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBmbGFncywKIAkJCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCB2b2lkICoqZnNkYXRhKQpAQCAtMTIwOSw3ICsxMjE5LDcgQEAKIAkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJaWYgKHBvcyArIGxlbiA+IGlub2RlLT5pX3NpemUpCi0JCQlleHQzX3RydW5jYXRlKGlub2RlKTsKKwkJCWV4dDNfdHJ1bmNhdGVfZmFpbGVkX3dyaXRlKGlub2RlKTsKIAl9CiAJaWYgKHJldCA9PSAtRU5PU1BDICYmIGV4dDNfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCiAJCWdvdG8gcmV0cnk7CkBAIC0xMzA0LDcgKzEzMTQsNyBAQAogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAogCWlmIChwb3MgKyBsZW4gPiBpbm9kZS0+aV9zaXplKQotCQlleHQzX3RydW5jYXRlKGlub2RlKTsKKwkJZXh0M190cnVuY2F0ZV9mYWlsZWRfd3JpdGUoaW5vZGUpOwogCXJldHVybiByZXQgPyByZXQgOiBjb3BpZWQ7CiB9CiAKQEAgLTEzMzAsNyArMTM0MCw3IEBACiAJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCiAJaWYgKHBvcyArIGxlbiA+IGlub2RlLT5pX3NpemUpCi0JCWV4dDNfdHJ1bmNhdGUoaW5vZGUpOworCQlleHQzX3RydW5jYXRlX2ZhaWxlZF93cml0ZShpbm9kZSk7CiAJcmV0dXJuIHJldCA/IHJldCA6IGNvcGllZDsKIH0KIApAQCAtMTM4Myw3ICsxMzkzLDcgQEAKIAlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAKIAlpZiAocG9zICsgbGVuID4gaW5vZGUtPmlfc2l6ZSkKLQkJZXh0M190cnVuY2F0ZShpbm9kZSk7CisJCWV4dDNfdHJ1bmNhdGVfZmFpbGVkX3dyaXRlKGlub2RlKTsKIAlyZXR1cm4gcmV0ID8gcmV0IDogY29waWVkOwogfQogCmRpZmYgLS1naXQgYS9mcy9leHQzL3Jlc2l6ZS5jIGIvZnMvZXh0My9yZXNpemUuYwppbmRleCA4MzU5ZTdiLi41ZjgzYjYxIDEwMDY0NAotLS0gYS9mcy9leHQzL3Jlc2l6ZS5jCisrKyBiL2ZzL2V4dDMvcmVzaXplLmMKQEAgLTI2Niw3ICsyNjYsNyBAQAogCQkJZ290byBleGl0X2JoOwogCiAJCWlmIChJU19FUlIoZ2RiID0gYmNsZWFuKGhhbmRsZSwgc2IsIGJsb2NrKSkpIHsKLQkJCWVyciA9IFBUUl9FUlIoYmgpOworCQkJZXJyID0gUFRSX0VSUihnZGIpOwogCQkJZ290byBleGl0X2JoOwogCQl9CiAJCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGdkYik7CmRpZmYgLS1naXQgYS9mcy9leHQzL3N1cGVyLmMgYi9mcy9leHQzL3N1cGVyLmMKaW5kZXggNDI3NDk2Yy4uN2FkMWU4YyAxMDA2NDQKLS0tIGEvZnMvZXh0My9zdXBlci5jCisrKyBiL2ZzL2V4dDMvc3VwZXIuYwpAQCAtMTM1LDEyICsxMzUsMjQgQEAKIAlpZiAoaXNfaGFuZGxlX2Fib3J0ZWQoaGFuZGxlKSkKIAkJcmV0dXJuOwogCi0JcHJpbnRrKEtFUk5fRVJSICIlczogYWJvcnRpbmcgdHJhbnNhY3Rpb246ICVzIGluICVzXG4iLAotCSAgICAgICBjYWxsZXIsIGVycnN0ciwgZXJyX2ZuKTsKKwlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6ICVzOiBhYm9ydGluZyB0cmFuc2FjdGlvbjogJXMgaW4gJXNcbiIsCisJCWNhbGxlciwgZXJyc3RyLCBlcnJfZm4pOwogCiAJam91cm5hbF9hYm9ydF9oYW5kbGUoaGFuZGxlKTsKIH0KIAordm9pZCBleHQzX21zZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpwcmVmaXgsCisJCWNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcHJpbnRrKCIlc0VYVDMtZnMgKCVzKTogIiwgcHJlZml4LCBzYi0+c19pZCk7CisJdnByaW50ayhmbXQsIGFyZ3MpOworCXByaW50aygiXG4iKTsKKwl2YV9lbmQoYXJncyk7Cit9CisKIC8qIERlYWwgd2l0aCB0aGUgcmVwb3J0aW5nIG9mIGZhaWx1cmUgY29uZGl0aW9ucyBvbiBhIGZpbGVzeXN0ZW0gc3VjaCBhcwogICogaW5jb25zaXN0ZW5jaWVzIGRldGVjdGVkIG9yIHJlYWQgSU8gZmFpbHVyZXMuCiAgKgpAQCAtMTc0LDEyICsxODYsMTMgQEAKIAkJCWpvdXJuYWxfYWJvcnQoam91cm5hbCwgLUVJTyk7CiAJfQogCWlmICh0ZXN0X29wdCAoc2IsIEVSUk9SU19STykpIHsKLQkJcHJpbnRrIChLRVJOX0NSSVQgIlJlbW91bnRpbmcgZmlsZXN5c3RlbSByZWFkLW9ubHlcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9DUklULAorCQkJImVycm9yOiByZW1vdW50aW5nIGZpbGVzeXN0ZW0gcmVhZC1vbmx5Iik7CiAJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKIAl9CiAJZXh0M19jb21taXRfc3VwZXIoc2IsIGVzLCAxKTsKIAlpZiAodGVzdF9vcHQoc2IsIEVSUk9SU19QQU5JQykpCi0JCXBhbmljKCJFWFQzLWZzIChkZXZpY2UgJXMpOiBwYW5pYyBmb3JjZWQgYWZ0ZXIgZXJyb3JcbiIsCisJCXBhbmljKCJFWFQzLWZzICglcyk6IHBhbmljIGZvcmNlZCBhZnRlciBlcnJvclxuIiwKIAkJCXNiLT5zX2lkKTsKIH0KIApAQCAtMjQ3LDggKzI2MCw3IEBACiAJCXJldHVybjsKIAogCWVycnN0ciA9IGV4dDNfZGVjb2RlX2Vycm9yKHNiLCBlcnJubywgbmJ1Zik7Ci0JcHJpbnRrIChLRVJOX0NSSVQgIkVYVDMtZnMgZXJyb3IgKGRldmljZSAlcykgaW4gJXM6ICVzXG4iLAotCQlzYi0+c19pZCwgZnVuY3Rpb24sIGVycnN0cik7CisJZXh0M19tc2coc2IsIEtFUk5fQ1JJVCwgImVycm9yIGluICVzOiAlcyIsIGZ1bmN0aW9uLCBlcnJzdHIpOwogCiAJZXh0M19oYW5kbGVfZXJyb3Ioc2IpOwogfQpAQCAtMjY4LDIxICsyODAsMjAgQEAKIHsKIAl2YV9saXN0IGFyZ3M7CiAKLQlwcmludGsgKEtFUk5fQ1JJVCAiZXh0M19hYm9ydCBjYWxsZWQuXG4iKTsKLQogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JcHJpbnRrKEtFUk5fQ1JJVCAiRVhUMy1mcyBlcnJvciAoZGV2aWNlICVzKTogJXM6ICIsc2ItPnNfaWQsIGZ1bmN0aW9uKTsKKwlwcmludGsoS0VSTl9DUklUICJFWFQzLWZzICglcyk6IGVycm9yOiAlczogIiwgc2ItPnNfaWQsIGZ1bmN0aW9uKTsKIAl2cHJpbnRrKGZtdCwgYXJncyk7CiAJcHJpbnRrKCJcbiIpOwogCXZhX2VuZChhcmdzKTsKIAogCWlmICh0ZXN0X29wdChzYiwgRVJST1JTX1BBTklDKSkKLQkJcGFuaWMoIkVYVDMtZnMgcGFuaWMgZnJvbSBwcmV2aW91cyBlcnJvclxuIik7CisJCXBhbmljKCJFWFQzLWZzOiBwYW5pYyBmcm9tIHByZXZpb3VzIGVycm9yXG4iKTsKIAogCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkKIAkJcmV0dXJuOwogCi0JcHJpbnRrKEtFUk5fQ1JJVCAiUmVtb3VudGluZyBmaWxlc3lzdGVtIHJlYWQtb25seVxuIik7CisJZXh0M19tc2coc2IsIEtFUk5fQ1JJVCwKKwkJImVycm9yOiByZW1vdW50aW5nIGZpbGVzeXN0ZW0gcmVhZC1vbmx5Iik7CiAJRVhUM19TQihzYiktPnNfbW91bnRfc3RhdGUgfD0gRVhUM19FUlJPUl9GUzsKIAlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CiAJRVhUM19TQihzYiktPnNfbW91bnRfb3B0IHw9IEVYVDNfTU9VTlRfQUJPUlQ7CkBAIC0yOTYsNyArMzA3LDcgQEAKIAl2YV9saXN0IGFyZ3M7CiAKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDMtZnMgd2FybmluZyAoZGV2aWNlICVzKTogJXM6ICIsCisJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUMy1mcyAoJXMpOiB3YXJuaW5nOiAlczogIiwKIAkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uKTsKIAl2cHJpbnRrKGZtdCwgYXJncyk7CiAJcHJpbnRrKCJcbiIpOwpAQCAtMzEwLDEwICszMjEsMTAgQEAKIAlpZiAobGUzMl90b19jcHUoZXMtPnNfcmV2X2xldmVsKSA+IEVYVDNfR09PRF9PTERfUkVWKQogCQlyZXR1cm47CiAKLQlleHQzX3dhcm5pbmcoc2IsIF9fZnVuY19fLAotCQkgICAgICJ1cGRhdGluZyB0byByZXYgJWQgYmVjYXVzZSBvZiBuZXcgZmVhdHVyZSBmbGFnLCAiCi0JCSAgICAgInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkIiwKLQkJICAgICBFWFQzX0RZTkFNSUNfUkVWKTsKKwlleHQzX21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkid2FybmluZzogdXBkYXRpbmcgdG8gcmV2ICVkIGJlY2F1c2Ugb2YgIgorCQkibmV3IGZlYXR1cmUgZmxhZywgcnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWQiLAorCQlFWFQzX0RZTkFNSUNfUkVWKTsKIAogCWVzLT5zX2ZpcnN0X2lubyA9IGNwdV90b19sZTMyKEVYVDNfR09PRF9PTERfRklSU1RfSU5PKTsKIAllcy0+c19pbm9kZV9zaXplID0gY3B1X3RvX2xlMTYoRVhUM19HT09EX09MRF9JTk9ERV9TSVpFKTsKQEAgLTMzMSw3ICszNDIsNyBAQAogLyoKICAqIE9wZW4gdGhlIGV4dGVybmFsIGpvdXJuYWwgZGV2aWNlCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpleHQzX2Jsa2Rldl9nZXQoZGV2X3QgZGV2KQorc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2UgKmV4dDNfYmxrZGV2X2dldChkZXZfdCBkZXYsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKIAljaGFyIGJbQkRFVk5BTUVfU0laRV07CkBAIC0zNDIsOCArMzUzLDkgQEAKIAlyZXR1cm4gYmRldjsKIAogZmFpbDoKLQlwcmludGsoS0VSTl9FUlIgIkVYVDM6IGZhaWxlZCB0byBvcGVuIGpvdXJuYWwgZGV2aWNlICVzOiAlbGRcbiIsCi0JCQlfX2JkZXZuYW1lKGRldiwgYiksIFBUUl9FUlIoYmRldikpOworCWV4dDNfbXNnKHNiLCAiZXJyb3I6IGZhaWxlZCB0byBvcGVuIGpvdXJuYWwgZGV2aWNlICVzOiAlbGQiLAorCQlfX2JkZXZuYW1lKGRldiwgYiksIFBUUl9FUlIoYmRldikpOworCiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTM3OCwxMyArMzkwLDEzIEBACiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqbDsKIAotCXByaW50ayhLRVJOX0VSUiAic2Igb3JwaGFuIGhlYWQgaXMgJWRcbiIsCisJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IHNiIG9ycGhhbiBoZWFkIGlzICVkIiwKIAkgICAgICAgbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2xhc3Rfb3JwaGFuKSk7CiAKLQlwcmludGsoS0VSTl9FUlIgInNiX2luZm8gb3JwaGFuIGxpc3Q6XG4iKTsKKwlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJzYl9pbmZvIG9ycGhhbiBsaXN0OiIpOwogCWxpc3RfZm9yX2VhY2gobCwgJnNiaS0+c19vcnBoYW4pIHsKIAkJc3RydWN0IGlub2RlICppbm9kZSA9IG9ycGhhbl9saXN0X2VudHJ5KGwpOwotCQlwcmludGsoS0VSTl9FUlIgIiAgIgorCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICIgICIKIAkJICAgICAgICJpbm9kZSAlczolbHUgYXQgJXA6IG1vZGUgJW8sIG5saW5rICVkLCBuZXh0ICVkXG4iLAogCQkgICAgICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywgaW5vZGUsCiAJCSAgICAgICBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9ubGluaywKQEAgLTUyNyw5ICs1MzksMjIgQEAKICNpZiBkZWZpbmVkKENPTkZJR19RVU9UQSkKIAlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkgPSBFWFQzX1NCKHNiKTsKIAotCWlmIChzYmktPnNfanF1b3RhX2ZtdCkKLQkJc2VxX3ByaW50ZihzZXEsICIsanFmbXQ9JXMiLAotCQkoc2JpLT5zX2pxdW90YV9mbXQgPT0gUUZNVF9WRlNfT0xEKSA/ICJ2ZnNvbGQiOiAidmZzdjAiKTsKKwlpZiAoc2JpLT5zX2pxdW90YV9mbXQpIHsKKwkJY2hhciAqZm10bmFtZSA9ICIiOworCisJCXN3aXRjaCAoc2JpLT5zX2pxdW90YV9mbXQpIHsKKwkJY2FzZSBRRk1UX1ZGU19PTEQ6CisJCQlmbXRuYW1lID0gInZmc29sZCI7CisJCQlicmVhazsKKwkJY2FzZSBRRk1UX1ZGU19WMDoKKwkJCWZtdG5hbWUgPSAidmZzdjAiOworCQkJYnJlYWs7CisJCWNhc2UgUUZNVF9WRlNfVjE6CisJCQlmbXRuYW1lID0gInZmc3YxIjsKKwkJCWJyZWFrOworCQl9CisJCXNlcV9wcmludGYoc2VxLCAiLGpxZm10PSVzIiwgZm10bmFtZSk7CisJfQogCiAJaWYgKHNiaS0+c19xZl9uYW1lc1tVU1JRVU9UQV0pCiAJCXNlcV9wcmludGYoc2VxLCAiLHVzcmpxdW90YT0lcyIsIHNiaS0+c19xZl9uYW1lc1tVU1JRVU9UQV0pOwpAQCAtNjM2LDYgKzY2MSw5IEBACiAJaWYgKHRlc3Rfb3B0KHNiLCBEQVRBX0VSUl9BQk9SVCkpCiAJCXNlcV9wdXRzKHNlcSwgIixkYXRhX2Vycj1hYm9ydCIpOwogCisJaWYgKHRlc3Rfb3B0KHNiLCBOT0xPQUQpKQorCQlzZXFfcHV0cyhzZXEsICIsbm9yZWNvdmVyeSIpOworCiAJZXh0M19zaG93X3F1b3RhX29wdGlvbnMoc2VxLCBzYik7CiAKIAlyZXR1cm4gMDsKQEAgLTc4Nyw5ICs4MTUsOSBAQAogCU9wdF9hYm9ydCwgT3B0X2RhdGFfam91cm5hbCwgT3B0X2RhdGFfb3JkZXJlZCwgT3B0X2RhdGFfd3JpdGViYWNrLAogCU9wdF9kYXRhX2Vycl9hYm9ydCwgT3B0X2RhdGFfZXJyX2lnbm9yZSwKIAlPcHRfdXNyanF1b3RhLCBPcHRfZ3JwanF1b3RhLCBPcHRfb2ZmdXNyanF1b3RhLCBPcHRfb2ZmZ3JwanF1b3RhLAotCU9wdF9qcWZtdF92ZnNvbGQsIE9wdF9qcWZtdF92ZnN2MCwgT3B0X3F1b3RhLCBPcHRfbm9xdW90YSwKLQlPcHRfaWdub3JlLCBPcHRfYmFycmllciwgT3B0X2VyciwgT3B0X3Jlc2l6ZSwgT3B0X3VzcnF1b3RhLAotCU9wdF9ncnBxdW90YQorCU9wdF9qcWZtdF92ZnNvbGQsIE9wdF9qcWZtdF92ZnN2MCwgT3B0X2pxZm10X3Zmc3YxLCBPcHRfcXVvdGEsCisJT3B0X25vcXVvdGEsIE9wdF9pZ25vcmUsIE9wdF9iYXJyaWVyLCBPcHRfZXJyLCBPcHRfcmVzaXplLAorCU9wdF91c3JxdW90YSwgT3B0X2dycHF1b3RhCiB9OwogCiBzdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CkBAIC04MTgsNiArODQ2LDcgQEAKIAl7T3B0X3Jlc2VydmF0aW9uLCAicmVzZXJ2YXRpb24ifSwKIAl7T3B0X25vcmVzZXJ2YXRpb24sICJub3Jlc2VydmF0aW9uIn0sCiAJe09wdF9ub2xvYWQsICJub2xvYWQifSwKKwl7T3B0X25vbG9hZCwgIm5vcmVjb3ZlcnkifSwKIAl7T3B0X25vYmgsICJub2JoIn0sCiAJe09wdF9iaCwgImJoIn0sCiAJe09wdF9jb21taXQsICJjb21taXQ9JXUifSwKQEAgLTgzNiw2ICs4NjUsNyBAQAogCXtPcHRfZ3JwanF1b3RhLCAiZ3JwanF1b3RhPSVzIn0sCiAJe09wdF9qcWZtdF92ZnNvbGQsICJqcWZtdD12ZnNvbGQifSwKIAl7T3B0X2pxZm10X3Zmc3YwLCAianFmbXQ9dmZzdjAifSwKKwl7T3B0X2pxZm10X3Zmc3YxLCAianFmbXQ9dmZzdjEifSwKIAl7T3B0X2dycHF1b3RhLCAiZ3JwcXVvdGEifSwKIAl7T3B0X25vcXVvdGEsICJub3F1b3RhIn0sCiAJe09wdF9xdW90YSwgInF1b3RhIn0sCkBAIC04NDUsNyArODc1LDcgQEAKIAl7T3B0X2VyciwgTlVMTH0sCiB9OwogCi1zdGF0aWMgZXh0M19mc2Jsa190IGdldF9zYl9ibG9jayh2b2lkICoqZGF0YSkKK3N0YXRpYyBleHQzX2ZzYmxrX3QgZ2V0X3NiX2Jsb2NrKHZvaWQgKipkYXRhLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCWV4dDNfZnNibGtfdAlzYl9ibG9jazsKIAljaGFyCQkqb3B0aW9ucyA9IChjaGFyICopICpkYXRhOwpAQCAtODU2LDcgKzg4Niw3IEBACiAJLyp0b2RvOiB1c2Ugc2ltcGxlX3N0cnRvbGwgd2l0aCA+MzJiaXQgZXh0MyAqLwogCXNiX2Jsb2NrID0gc2ltcGxlX3N0cnRvdWwob3B0aW9ucywgJm9wdGlvbnMsIDApOwogCWlmICgqb3B0aW9ucyAmJiAqb3B0aW9ucyAhPSAnLCcpIHsKLQkJcHJpbnRrKCJFWFQzLWZzOiBJbnZhbGlkIHNiIHNwZWNpZmljYXRpb246ICVzXG4iLAorCQlleHQzX21zZyhzYiwgImVycm9yOiBpbnZhbGlkIHNiIHNwZWNpZmljYXRpb246ICVzIiwKIAkJICAgICAgIChjaGFyICopICpkYXRhKTsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtOTU2LDcgKzk4Niw4IEBACiAjZWxzZQogCQljYXNlIE9wdF91c2VyX3hhdHRyOgogCQljYXNlIE9wdF9ub3VzZXJfeGF0dHI6Ci0JCQlwcmludGsoIkVYVDMgKG5vKXVzZXJfeGF0dHIgb3B0aW9ucyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCWV4dDNfbXNnKHNiLCBLRVJOX0lORk8sCisJCQkJIihubyl1c2VyX3hhdHRyIG9wdGlvbnMgbm90IHN1cHBvcnRlZCIpOwogCQkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wKQEAgLTk2OSw3ICsxMDAwLDggQEAKICNlbHNlCiAJCWNhc2UgT3B0X2FjbDoKIAkJY2FzZSBPcHRfbm9hY2w6Ci0JCQlwcmludGsoIkVYVDMgKG5vKWFjbCBvcHRpb25zIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJZXh0M19tc2coc2IsIEtFUk5fSU5GTywKKwkJCQkiKG5vKWFjbCBvcHRpb25zIG5vdCBzdXBwb3J0ZWQiKTsKIAkJCWJyZWFrOwogI2VuZGlmCiAJCWNhc2UgT3B0X3Jlc2VydmF0aW9uOgpAQCAtOTg1LDE2ICsxMDE3LDE2IEBACiAJCQkgICB1c2VyIHRvIHNwZWNpZnkgYW4gZXhpc3RpbmcgaW5vZGUgdG8gYmUgdGhlCiAJCQkgICBqb3VybmFsIGZpbGUuICovCiAJCQlpZiAoaXNfcmVtb3VudCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogY2Fubm90IHNwZWNpZnkgIgotCQkJCSAgICAgICAiam91cm5hbCBvbiByZW1vdW50XG4iKTsKKwkJCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogY2Fubm90IHNwZWNpZnkgIgorCQkJCQkiam91cm5hbCBvbiByZW1vdW50Iik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBVUERBVEVfSk9VUk5BTCk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfam91cm5hbF9pbnVtOgogCQkJaWYgKGlzX3JlbW91bnQpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGNhbm5vdCBzcGVjaWZ5ICIKLQkJCQkgICAgICAgImpvdXJuYWwgb24gcmVtb3VudFxuIik7CisJCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IGNhbm5vdCBzcGVjaWZ5ICIKKwkJCQkgICAgICAgImpvdXJuYWwgb24gcmVtb3VudCIpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCkBAIC0xMDAzLDggKzEwMzUsOCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2pvdXJuYWxfZGV2OgogCQkJaWYgKGlzX3JlbW91bnQpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGNhbm5vdCBzcGVjaWZ5ICIKLQkJCQkgICAgICAgImpvdXJuYWwgb24gcmVtb3VudFxuIik7CisJCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IGNhbm5vdCBzcGVjaWZ5ICIKKwkJCQkgICAgICAgImpvdXJuYWwgb24gcmVtb3VudCIpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCkBAIC0xMDM2LDEyICsxMDY4LDExIEBACiAJCQkJaWYgKChzYmktPnNfbW91bnRfb3B0ICYgRVhUM19NT1VOVF9EQVRBX0ZMQUdTKQogCQkJCQkJPT0gZGF0YV9vcHQpCiAJCQkJCWJyZWFrOwotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkiRVhUMy1mcyAoZGV2aWNlICVzKTogQ2Fubm90IGNoYW5nZSAiCisJCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJCQkiZXJyb3I6IGNhbm5vdCBjaGFuZ2UgIgogCQkJCQkiZGF0YSBtb2RlIG9uIHJlbW91bnQuIFRoZSBmaWxlc3lzdGVtICIKIAkJCQkJImlzIG1vdW50ZWQgaW4gZGF0YT0lcyBtb2RlIGFuZCB5b3UgIgotCQkJCQkidHJ5IHRvIHJlbW91bnQgaXQgaW4gZGF0YT0lcyBtb2RlLlxuIiwKLQkJCQkJc2ItPnNfaWQsCisJCQkJCSJ0cnkgdG8gcmVtb3VudCBpdCBpbiBkYXRhPSVzIG1vZGUuIiwKIAkJCQkJZGF0YV9tb2RlX3N0cmluZyhzYmktPnNfbW91bnRfb3B0ICYKIAkJCQkJCQlFWFQzX01PVU5UX0RBVEFfRkxBR1MpLAogCQkJCQlkYXRhX21vZGVfc3RyaW5nKGRhdGFfb3B0KSk7CkBAIC0xMDY2LDMxICsxMDk3LDMxIEBACiBzZXRfcWZfbmFtZToKIAkJCWlmIChzYl9hbnlfcXVvdGFfbG9hZGVkKHNiKSAmJgogCQkJICAgICFzYmktPnNfcWZfbmFtZXNbcXR5cGVdKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSJFWFQzLWZzOiBDYW5ub3QgY2hhbmdlIGpvdXJuYWxlZCAiCi0JCQkJCSJxdW90YSBvcHRpb25zIHdoZW4gcXVvdGEgdHVybmVkIG9uLlxuIik7CisJCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJCQkiZXJyb3I6IGNhbm5vdCBjaGFuZ2Ugam91cm5hbGVkICIKKwkJCQkJInF1b3RhIG9wdGlvbnMgd2hlbiBxdW90YSB0dXJuZWQgb24uIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlxbmFtZSA9IG1hdGNoX3N0cmR1cCgmYXJnc1swXSk7CiAJCQlpZiAoIXFuYW1lKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSJFWFQzLWZzOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgIgotCQkJCQkic3RvcmluZyBxdW90YWZpbGUgbmFtZS5cbiIpOworCQkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkJImVycm9yOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgIgorCQkJCQkic3RvcmluZyBxdW90YWZpbGUgbmFtZS4iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCWlmIChzYmktPnNfcWZfbmFtZXNbcXR5cGVdICYmCiAJCQkgICAgc3RyY21wKHNiaS0+c19xZl9uYW1lc1txdHlwZV0sIHFuYW1lKSkgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkiRVhUMy1mczogJXMgcXVvdGEgZmlsZSBhbHJlYWR5ICIKLQkJCQkJInNwZWNpZmllZC5cbiIsIFFUWVBFMk5BTUUocXR5cGUpKTsKKwkJCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkJCSJlcnJvcjogJXMgcXVvdGEgZmlsZSBhbHJlYWR5ICIKKwkJCQkJInNwZWNpZmllZC4iLCBRVFlQRTJOQU1FKHF0eXBlKSk7CiAJCQkJa2ZyZWUocW5hbWUpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJc2JpLT5zX3FmX25hbWVzW3F0eXBlXSA9IHFuYW1lOwogCQkJaWYgKHN0cmNocihzYmktPnNfcWZfbmFtZXNbcXR5cGVdLCAnLycpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSJFWFQzLWZzOiBxdW90YWZpbGUgbXVzdCBiZSBvbiAiCi0JCQkJCSJmaWxlc3lzdGVtIHJvb3QuXG4iKTsKKwkJCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkJCSJlcnJvcjogcXVvdGFmaWxlIG11c3QgYmUgb24gIgorCQkJCQkiZmlsZXN5c3RlbSByb290LiIpOwogCQkJCWtmcmVlKHNiaS0+c19xZl9uYW1lc1txdHlwZV0pOwogCQkJCXNiaS0+c19xZl9uYW1lc1txdHlwZV0gPSBOVUxMOwogCQkJCXJldHVybiAwOwpAQCAtMTEwNSw5ICsxMTM2LDkgQEAKIGNsZWFyX3FmX25hbWU6CiAJCQlpZiAoc2JfYW55X3F1b3RhX2xvYWRlZChzYikgJiYKIAkJCSAgICBzYmktPnNfcWZfbmFtZXNbcXR5cGVdKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBDYW5ub3QgY2hhbmdlICIKKwkJCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogY2Fubm90IGNoYW5nZSAiCiAJCQkJCSJqb3VybmFsZWQgcXVvdGEgb3B0aW9ucyB3aGVuICIKLQkJCQkJInF1b3RhIHR1cm5lZCBvbi5cbiIpOworCQkJCQkicXVvdGEgdHVybmVkIG9uLiIpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJLyoKQEAgLTExMjEsMTIgKzExNTIsMTUgQEAKIAkJCWdvdG8gc2V0X3FmX2Zvcm1hdDsKIAkJY2FzZSBPcHRfanFmbXRfdmZzdjA6CiAJCQlxZm10ID0gUUZNVF9WRlNfVjA7CisJCQlnb3RvIHNldF9xZl9mb3JtYXQ7CisJCWNhc2UgT3B0X2pxZm10X3Zmc3YxOgorCQkJcWZtdCA9IFFGTVRfVkZTX1YxOwogc2V0X3FmX2Zvcm1hdDoKIAkJCWlmIChzYl9hbnlfcXVvdGFfbG9hZGVkKHNiKSAmJgogCQkJICAgIHNiaS0+c19qcXVvdGFfZm10ICE9IHFmbXQpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IENhbm5vdCBjaGFuZ2UgIgorCQkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwgImVycm9yOiBjYW5ub3QgY2hhbmdlICIKIAkJCQkJImpvdXJuYWxlZCBxdW90YSBvcHRpb25zIHdoZW4gIgotCQkJCQkicXVvdGEgdHVybmVkIG9uLlxuIik7CisJCQkJCSJxdW90YSB0dXJuZWQgb24uIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlzYmktPnNfanF1b3RhX2ZtdCA9IHFmbXQ7CkBAIC0xMTQyLDggKzExNzYsOCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X25vcXVvdGE6CiAJCQlpZiAoc2JfYW55X3F1b3RhX2xvYWRlZChzYikpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IENhbm5vdCBjaGFuZ2UgcXVvdGEgIgotCQkJCQkib3B0aW9ucyB3aGVuIHF1b3RhIHR1cm5lZCBvbi5cbiIpOworCQkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwgImVycm9yOiBjYW5ub3QgY2hhbmdlICIKKwkJCQkJInF1b3RhIG9wdGlvbnMgd2hlbiBxdW90YSB0dXJuZWQgb24uIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgUVVPVEEpOwpAQCAtMTE1NCw4ICsxMTg4LDggQEAKIAkJY2FzZSBPcHRfcXVvdGE6CiAJCWNhc2UgT3B0X3VzcnF1b3RhOgogCQljYXNlIE9wdF9ncnBxdW90YToKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSJFWFQzLWZzOiBxdW90YSBvcHRpb25zIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKwkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkiZXJyb3I6IHF1b3RhIG9wdGlvbnMgbm90IHN1cHBvcnRlZC4iKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF91c3JqcXVvdGE6CiAJCWNhc2UgT3B0X2dycGpxdW90YToKQEAgLTExNjMsOSArMTE5NywxMCBAQAogCQljYXNlIE9wdF9vZmZncnBqcXVvdGE6CiAJCWNhc2UgT3B0X2pxZm10X3Zmc29sZDoKIAkJY2FzZSBPcHRfanFmbXRfdmZzdjA6Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCQkiRVhUMy1mczogam91cm5hbGVkIHF1b3RhIG9wdGlvbnMgbm90ICIKLQkJCQkic3VwcG9ydGVkLlxuIik7CisJCWNhc2UgT3B0X2pxZm10X3Zmc3YxOgorCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJCSJlcnJvcjogam91cm5hbGVkIHF1b3RhIG9wdGlvbnMgbm90ICIKKwkJCQkic3VwcG9ydGVkLiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X25vcXVvdGE6CiAJCQlicmVhazsKQEAgLTExODUsOCArMTIyMCw5IEBACiAJCQlicmVhazsKIAkJY2FzZSBPcHRfcmVzaXplOgogCQkJaWYgKCFpc19yZW1vdW50KSB7Ci0JCQkJcHJpbnRrKCJFWFQzLWZzOiByZXNpemUgb3B0aW9uIG9ubHkgYXZhaWxhYmxlICIKLQkJCQkJImZvciByZW1vdW50XG4iKTsKKwkJCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkJCSJlcnJvcjogcmVzaXplIG9wdGlvbiBvbmx5IGF2YWlsYWJsZSAiCisJCQkJCSJmb3IgcmVtb3VudCIpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikgIT0gMCkKQEAgLTEyMDAsOSArMTIzNiw5IEBACiAJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgTk9CSCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50ayAoS0VSTl9FUlIKLQkJCQkiRVhUMy1mczogVW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbiBcIiVzXCIgIgotCQkJCSJvciBtaXNzaW5nIHZhbHVlXG4iLCBwKTsKKwkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkiZXJyb3I6IHVucmVjb2duaXplZCBtb3VudCBvcHRpb24gXCIlc1wiICIKKwkJCQkib3IgbWlzc2luZyB2YWx1ZSIsIHApOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC0xMjIwLDIxICsxMjU2LDIxIEBACiAJCQkJKHNiaS0+c19tb3VudF9vcHQgJiBFWFQzX01PVU5UX0dSUFFVT1RBKSkgfHwKIAkJICAgIChzYmktPnNfcWZfbmFtZXNbR1JQUVVPVEFdICYmCiAJCQkJKHNiaS0+c19tb3VudF9vcHQgJiBFWFQzX01PVU5UX1VTUlFVT1RBKSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogb2xkIGFuZCBuZXcgcXVvdGEgIgotCQkJCQkiZm9ybWF0IG1peGluZy5cbiIpOworCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IG9sZCBhbmQgbmV3IHF1b3RhICIKKwkJCQkJImZvcm1hdCBtaXhpbmcuIik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCiAJCWlmICghc2JpLT5zX2pxdW90YV9mbXQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogam91cm5hbGVkIHF1b3RhIGZvcm1hdCAiCi0JCQkJCSJub3Qgc3BlY2lmaWVkLlxuIik7CisJCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogam91cm5hbGVkIHF1b3RhIGZvcm1hdCAiCisJCQkJCSJub3Qgc3BlY2lmaWVkLiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoc2JpLT5zX2pxdW90YV9mbXQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogam91cm5hbGVkIHF1b3RhIGZvcm1hdCAiCisJCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogam91cm5hbGVkIHF1b3RhIGZvcm1hdCAiCiAJCQkJCSJzcGVjaWZpZWQgd2l0aCBubyBqb3VybmFsaW5nICIKLQkJCQkJImVuYWJsZWQuXG4iKTsKKwkJCQkJImVuYWJsZWQuIik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTEyNDksMzEgKzEyODUsMzMgQEAKIAlpbnQgcmVzID0gMDsKIAogCWlmIChsZTMyX3RvX2NwdShlcy0+c19yZXZfbGV2ZWwpID4gRVhUM19NQVhfU1VQUF9SRVYpIHsKLQkJcHJpbnRrIChLRVJOX0VSUiAiRVhUMy1mcyB3YXJuaW5nOiByZXZpc2lvbiBsZXZlbCB0b28gaGlnaCwgIgotCQkJImZvcmNpbmcgcmVhZC1vbmx5IG1vZGVcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkiZXJyb3I6IHJldmlzaW9uIGxldmVsIHRvbyBoaWdoLCAiCisJCQkiZm9yY2luZyByZWFkLW9ubHkgbW9kZSIpOwogCQlyZXMgPSBNU19SRE9OTFk7CiAJfQogCWlmIChyZWFkX29ubHkpCiAJCXJldHVybiByZXM7CiAJaWYgKCEoc2JpLT5zX21vdW50X3N0YXRlICYgRVhUM19WQUxJRF9GUykpCi0JCXByaW50ayAoS0VSTl9XQVJOSU5HICJFWFQzLWZzIHdhcm5pbmc6IG1vdW50aW5nIHVuY2hlY2tlZCBmcywgIgotCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fV0FSTklORywKKwkJCSJ3YXJuaW5nOiBtb3VudGluZyB1bmNoZWNrZWQgZnMsICIKKwkJCSJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZCIpOwogCWVsc2UgaWYgKChzYmktPnNfbW91bnRfc3RhdGUgJiBFWFQzX0VSUk9SX0ZTKSkKLQkJcHJpbnRrIChLRVJOX1dBUk5JTkcKLQkJCSJFWFQzLWZzIHdhcm5pbmc6IG1vdW50aW5nIGZzIHdpdGggZXJyb3JzLCAiCi0JCQkicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkJIndhcm5pbmc6IG1vdW50aW5nIGZzIHdpdGggZXJyb3JzLCAiCisJCQkicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWQiKTsKIAllbHNlIGlmICgoX19zMTYpIGxlMTZfdG9fY3B1KGVzLT5zX21heF9tbnRfY291bnQpID49IDAgJiYKIAkJIGxlMTZfdG9fY3B1KGVzLT5zX21udF9jb3VudCkgPj0KIAkJICh1bnNpZ25lZCBzaG9ydCkgKF9fczE2KSBsZTE2X3RvX2NwdShlcy0+c19tYXhfbW50X2NvdW50KSkKLQkJcHJpbnRrIChLRVJOX1dBUk5JTkcKLQkJCSJFWFQzLWZzIHdhcm5pbmc6IG1heGltYWwgbW91bnQgY291bnQgcmVhY2hlZCwgIgotCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fV0FSTklORywKKwkJCSJ3YXJuaW5nOiBtYXhpbWFsIG1vdW50IGNvdW50IHJlYWNoZWQsICIKKwkJCSJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZCIpOwogCWVsc2UgaWYgKGxlMzJfdG9fY3B1KGVzLT5zX2NoZWNraW50ZXJ2YWwpICYmCiAJCShsZTMyX3RvX2NwdShlcy0+c19sYXN0Y2hlY2spICsKIAkJCWxlMzJfdG9fY3B1KGVzLT5zX2NoZWNraW50ZXJ2YWwpIDw9IGdldF9zZWNvbmRzKCkpKQotCQlwcmludGsgKEtFUk5fV0FSTklORwotCQkJIkVYVDMtZnMgd2FybmluZzogY2hlY2t0aW1lIHJlYWNoZWQsICIKLQkJCSJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZFxuIik7CisJCWV4dDNfbXNnKHNiLCBLRVJOX1dBUk5JTkcsCisJCQkid2FybmluZzogY2hlY2t0aW1lIHJlYWNoZWQsICIKKwkJCSJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZCIpOwogI2lmIDAKIAkJLyogQEBAIFdlIF93aWxsXyB3YW50IHRvIGNsZWFyIHRoZSB2YWxpZCBiaXQgaWYgd2UgZmluZAogICAgICAgICAgICAgICAgICAgIGluY29uc2lzdGVuY2llcywgdG8gZm9yY2UgYSBmc2NrIGF0IHJlYm9vdC4gIEJ1dCBmb3IKQEAgLTEyOTAsMjIgKzEzMjgsMjAgQEAKIAogCWV4dDNfY29tbWl0X3N1cGVyKHNiLCBlcywgMSk7CiAJaWYgKHRlc3Rfb3B0KHNiLCBERUJVRykpCi0JCXByaW50ayhLRVJOX0lORk8gIltFWFQzIEZTIGJzPSVsdSwgZ2M9JWx1LCAiCi0JCQkJImJwZz0lbHUsIGlwZz0lbHUsIG1vPSUwNGx4XVxuIiwKKwkJZXh0M19tc2coc2IsIEtFUk5fSU5GTywgIlticz0lbHUsIGdjPSVsdSwgIgorCQkJCSJicGc9JWx1LCBpcGc9JWx1LCBtbz0lMDRseF0iLAogCQkJc2ItPnNfYmxvY2tzaXplLAogCQkJc2JpLT5zX2dyb3Vwc19jb3VudCwKIAkJCUVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYiksCiAJCQlFWFQzX0lOT0RFU19QRVJfR1JPVVAoc2IpLAogCQkJc2JpLT5zX21vdW50X29wdCk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJFWFQzIEZTIG9uICVzLCAiLCBzYi0+c19pZCk7CiAJaWYgKEVYVDNfU0Ioc2IpLT5zX2pvdXJuYWwtPmpfaW5vZGUgPT0gTlVMTCkgewogCQljaGFyIGJbQkRFVk5BTUVfU0laRV07Ci0KLQkJcHJpbnRrKCJleHRlcm5hbCBqb3VybmFsIG9uICVzXG4iLAorCQlleHQzX21zZyhzYiwgS0VSTl9JTkZPLCAidXNpbmcgZXh0ZXJuYWwgam91cm5hbCBvbiAlcyIsCiAJCQliZGV2bmFtZShFWFQzX1NCKHNiKS0+c19qb3VybmFsLT5qX2RldiwgYikpOwogCX0gZWxzZSB7Ci0JCXByaW50aygiaW50ZXJuYWwgam91cm5hbFxuIik7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0lORk8sICJ1c2luZyBpbnRlcm5hbCBqb3VybmFsIik7CiAJfQogCXJldHVybiByZXM7CiB9CkBAIC0xMzk5LDggKzE0MzUsOCBAQAogCX0KIAogCWlmIChiZGV2X3JlYWRfb25seShzYi0+c19iZGV2KSkgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IHdyaXRlIGFjY2VzcyAiCi0JCQkidW5hdmFpbGFibGUsIHNraXBwaW5nIG9ycGhhbiBjbGVhbnVwLlxuIik7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwgImVycm9yOiB3cml0ZSBhY2Nlc3MgIgorCQkJInVuYXZhaWxhYmxlLCBza2lwcGluZyBvcnBoYW4gY2xlYW51cC4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTQxNCw4ICsxNDUwLDcgQEAKIAl9CiAKIAlpZiAoc19mbGFncyAmIE1TX1JET05MWSkgewotCQlwcmludGsoS0VSTl9JTkZPICJFWFQzLWZzOiAlczogb3JwaGFuIGNsZWFudXAgb24gcmVhZG9ubHkgZnNcbiIsCi0JCSAgICAgICBzYi0+c19pZCk7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0lORk8sICJvcnBoYW4gY2xlYW51cCBvbiByZWFkb25seSBmcyIpOwogCQlzYi0+c19mbGFncyAmPSB+TVNfUkRPTkxZOwogCX0KICNpZmRlZiBDT05GSUdfUVVPVEEKQEAgLTE0MjYsOSArMTQ2MSw5IEBACiAJCWlmIChFWFQzX1NCKHNiKS0+c19xZl9uYW1lc1tpXSkgewogCQkJaW50IHJldCA9IGV4dDNfcXVvdGFfb25fbW91bnQoc2IsIGkpOwogCQkJaWYgKHJldCA8IDApCi0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSJFWFQzLWZzOiBDYW5ub3QgdHVybiBvbiBqb3VybmFsZWQgIgotCQkJCQkicXVvdGE6IGVycm9yICVkXG4iLCByZXQpOworCQkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkJImVycm9yOiBjYW5ub3QgdHVybiBvbiBqb3VybmFsZWQgIgorCQkJCQkicXVvdGE6ICVkIiwgcmV0KTsKIAkJfQogCX0KICNlbmRpZgpAQCAtMTQ2NiwxMSArMTUwMSwxMSBAQAogI2RlZmluZSBQTFVSQUwoeCkgKHgpLCAoKHgpPT0xKSA/ICIiIDogInMiCiAKIAlpZiAobnJfb3JwaGFucykKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRVhUMy1mczogJXM6ICVkIG9ycGhhbiBpbm9kZSVzIGRlbGV0ZWRcbiIsCi0JCSAgICAgICBzYi0+c19pZCwgUExVUkFMKG5yX29ycGhhbnMpKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fSU5GTywgIiVkIG9ycGhhbiBpbm9kZSVzIGRlbGV0ZWQiLAorCQkgICAgICAgUExVUkFMKG5yX29ycGhhbnMpKTsKIAlpZiAobnJfdHJ1bmNhdGVzKQotCQlwcmludGsoS0VSTl9JTkZPICJFWFQzLWZzOiAlczogJWQgdHJ1bmNhdGUlcyBjbGVhbmVkIHVwXG4iLAotCQkgICAgICAgc2ItPnNfaWQsIFBMVVJBTChucl90cnVuY2F0ZXMpKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fSU5GTywgIiVkIHRydW5jYXRlJXMgY2xlYW5lZCB1cCIsCisJCSAgICAgICBQTFVSQUwobnJfdHJ1bmNhdGVzKSk7CiAjaWZkZWYgQ09ORklHX1FVT1RBCiAJLyogVHVybiBxdW90YXMgb2ZmICovCiAJZm9yIChpID0gMDsgaSA8IE1BWFFVT1RBUzsgaSsrKSB7CkBAIC0xNTU0LDcgKzE1ODksNyBAQAogCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcyA9IE5VTEw7CiAJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpOwogCWV4dDNfZnNibGtfdCBibG9jazsKLQlleHQzX2ZzYmxrX3Qgc2JfYmxvY2sgPSBnZXRfc2JfYmxvY2soJmRhdGEpOworCWV4dDNfZnNibGtfdCBzYl9ibG9jayA9IGdldF9zYl9ibG9jaygmZGF0YSwgc2IpOwogCWV4dDNfZnNibGtfdCBsb2dpY19zYl9ibG9jazsKIAl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7CiAJdW5zaWduZWQgaW50IGpvdXJuYWxfaW51bSA9IDA7CkBAIC0xNTkwLDcgKzE2MjUsNyBAQAogCiAJYmxvY2tzaXplID0gc2JfbWluX2Jsb2Nrc2l6ZShzYiwgRVhUM19NSU5fQkxPQ0tfU0laRSk7CiAJaWYgKCFibG9ja3NpemUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiB1bmFibGUgdG8gc2V0IGJsb2Nrc2l6ZVxuIik7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwgImVycm9yOiB1bmFibGUgdG8gc2V0IGJsb2Nrc2l6ZSIpOwogCQlnb3RvIG91dF9mYWlsOwogCX0KIApAQCAtMTYwNiw3ICsxNjQxLDcgQEAKIAl9CiAKIAlpZiAoIShiaCA9IHNiX2JyZWFkKHNiLCBsb2dpY19zYl9ibG9jaykpKSB7Ci0JCXByaW50ayAoS0VSTl9FUlIgIkVYVDMtZnM6IHVuYWJsZSB0byByZWFkIHN1cGVyYmxvY2tcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogdW5hYmxlIHRvIHJlYWQgc3VwZXJibG9jayIpOwogCQlnb3RvIG91dF9mYWlsOwogCX0KIAkvKgpAQCAtMTY2NSw5ICsxNzAwLDkgQEAKIAkgICAgKEVYVDNfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCB+MFUpIHx8CiAJICAgICBFWFQzX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgfjBVKSB8fAogCSAgICAgRVhUM19IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgfjBVKSkpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJFWFQzLWZzIHdhcm5pbmc6IGZlYXR1cmUgZmxhZ3Mgc2V0IG9uIHJldiAwIGZzLCAiCi0JCSAgICAgICAicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkJIndhcm5pbmc6IGZlYXR1cmUgZmxhZ3Mgc2V0IG9uIHJldiAwIGZzLCAiCisJCQkicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWQiKTsKIAkvKgogCSAqIENoZWNrIGZlYXR1cmUgZmxhZ3MgcmVnYXJkbGVzcyBvZiB0aGUgcmV2aXNpb24gbGV2ZWwsIHNpbmNlIHdlCiAJICogcHJldmlvdXNseSBkaWRuJ3QgY2hhbmdlIHRoZSByZXZpc2lvbiBsZXZlbCB3aGVuIHNldHRpbmcgdGhlIGZsYWdzLApAQCAtMTY3NSwyNSArMTcxMCwyNSBAQAogCSAqLwogCWZlYXR1cmVzID0gRVhUM19IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgfkVYVDNfRkVBVFVSRV9JTkNPTVBBVF9TVVBQKTsKIAlpZiAoZmVhdHVyZXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiAlczogY291bGRuJ3QgbW91bnQgYmVjYXVzZSBvZiAiCi0JCSAgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsCi0JCSAgICAgICBzYi0+c19pZCwgbGUzMl90b19jcHUoZmVhdHVyZXMpKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJImVycm9yOiBjb3VsZG4ndCBtb3VudCBiZWNhdXNlIG9mIHVuc3VwcG9ydGVkICIKKwkJCSJvcHRpb25hbCBmZWF0dXJlcyAoJXgpIiwgbGUzMl90b19jcHUoZmVhdHVyZXMpKTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQogCWZlYXR1cmVzID0gRVhUM19IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsIH5FWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApOwogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJiBmZWF0dXJlcykgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6ICVzOiBjb3VsZG4ndCBtb3VudCBSRFdSIGJlY2F1c2Ugb2YgIgotCQkgICAgICAgInVuc3VwcG9ydGVkIG9wdGlvbmFsIGZlYXR1cmVzICgleCkuXG4iLAotCQkgICAgICAgc2ItPnNfaWQsIGxlMzJfdG9fY3B1KGZlYXR1cmVzKSk7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSJlcnJvcjogY291bGRuJ3QgbW91bnQgUkRXUiBiZWNhdXNlIG9mIHVuc3VwcG9ydGVkICIKKwkJCSJvcHRpb25hbCBmZWF0dXJlcyAoJXgpIiwgbGUzMl90b19jcHUoZmVhdHVyZXMpKTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQogCWJsb2Nrc2l6ZSA9IEJMT0NLX1NJWkUgPDwgbGUzMl90b19jcHUoZXMtPnNfbG9nX2Jsb2NrX3NpemUpOwogCiAJaWYgKGJsb2Nrc2l6ZSA8IEVYVDNfTUlOX0JMT0NLX1NJWkUgfHwKIAkgICAgYmxvY2tzaXplID4gRVhUM19NQVhfQkxPQ0tfU0laRSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJFWFQzLWZzOiBVbnN1cHBvcnRlZCBmaWxlc3lzdGVtIGJsb2Nrc2l6ZSAlZCBvbiAlcy5cbiIsCi0JCSAgICAgICBibG9ja3NpemUsIHNiLT5zX2lkKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJImVycm9yOiBjb3VsZG4ndCBtb3VudCBiZWNhdXNlIG9mIHVuc3VwcG9ydGVkICIKKwkJCSJmaWxlc3lzdGVtIGJsb2Nrc2l6ZSAlZCIsIGJsb2Nrc2l6ZSk7CiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIApAQCAtMTcwNCwzMCArMTczOSwzMSBAQAogCQkgKiB0aGFuIHRoZSBoYXJkd2FyZSBzZWN0b3JzaXplIGZvciB0aGUgbWFjaGluZS4KIAkJICovCiAJCWlmIChibG9ja3NpemUgPCBoYmxvY2spIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogYmxvY2tzaXplICVkIHRvbyBzbWFsbCBmb3IgIgotCQkJICAgICAgICJkZXZpY2UgYmxvY2tzaXplICVkLlxuIiwgYmxvY2tzaXplLCBoYmxvY2spOworCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJCSJlcnJvcjogZnNibG9ja3NpemUgJWQgdG9vIHNtYWxsIGZvciAiCisJCQkJImhhcmR3YXJlIHNlY3RvcnNpemUgJWQiLCBibG9ja3NpemUsIGhibG9jayk7CiAJCQlnb3RvIGZhaWxlZF9tb3VudDsKIAkJfQogCiAJCWJyZWxzZSAoYmgpOwogCQlpZiAoIXNiX3NldF9ibG9ja3NpemUoc2IsIGJsb2Nrc2l6ZSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogYmFkIGJsb2Nrc2l6ZSAlZC5cbiIsCi0JCQkJYmxvY2tzaXplKTsKKwkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkiZXJyb3I6IGJhZCBibG9ja3NpemUgJWQiLCBibG9ja3NpemUpOwogCQkJZ290byBvdXRfZmFpbDsKIAkJfQogCQlsb2dpY19zYl9ibG9jayA9IChzYl9ibG9jayAqIEVYVDNfTUlOX0JMT0NLX1NJWkUpIC8gYmxvY2tzaXplOwogCQlvZmZzZXQgPSAoc2JfYmxvY2sgKiBFWFQzX01JTl9CTE9DS19TSVpFKSAlIGJsb2Nrc2l6ZTsKIAkJYmggPSBzYl9icmVhZChzYiwgbG9naWNfc2JfYmxvY2spOwogCQlpZiAoIWJoKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiRVhUMy1mczogQ2FuJ3QgcmVhZCBzdXBlcmJsb2NrIG9uIDJuZCB0cnkuXG4iKTsKKwkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSAgICAgICAiZXJyb3I6IGNhbid0IHJlYWQgc3VwZXJibG9jayBvbiAybmQgdHJ5Iik7CiAJCQlnb3RvIGZhaWxlZF9tb3VudDsKIAkJfQogCQllcyA9IChzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqKSgoKGNoYXIgKiliaC0+Yl9kYXRhKSArIG9mZnNldCk7CiAJCXNiaS0+c19lcyA9IGVzOwogCQlpZiAoZXMtPnNfbWFnaWMgIT0gY3B1X3RvX2xlMTYoRVhUM19TVVBFUl9NQUdJQykpIHsKLQkJCXByaW50ayAoS0VSTl9FUlIKLQkJCQkiRVhUMy1mczogTWFnaWMgbWlzbWF0Y2gsIHZlcnkgd2VpcmQgIVxuIik7CisJCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkJImVycm9yOiBtYWdpYyBtaXNtYXRjaCIpOwogCQkJZ290byBmYWlsZWRfbW91bnQ7CiAJCX0KIAl9CkBAIC0xNzQzLDggKzE3NzksOCBAQAogCQlpZiAoKHNiaS0+c19pbm9kZV9zaXplIDwgRVhUM19HT09EX09MRF9JTk9ERV9TSVpFKSB8fAogCQkgICAgKCFpc19wb3dlcl9vZl8yKHNiaS0+c19pbm9kZV9zaXplKSkgfHwKIAkJICAgIChzYmktPnNfaW5vZGVfc2l6ZSA+IGJsb2Nrc2l6ZSkpIHsKLQkJCXByaW50ayAoS0VSTl9FUlIKLQkJCQkiRVhUMy1mczogdW5zdXBwb3J0ZWQgaW5vZGUgc2l6ZTogJWRcbiIsCisJCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkJImVycm9yOiB1bnN1cHBvcnRlZCBpbm9kZSBzaXplOiAlZCIsCiAJCQkJc2JpLT5zX2lub2RlX3NpemUpOwogCQkJZ290byBmYWlsZWRfbW91bnQ7CiAJCX0KQEAgLTE3NTIsOCArMTc4OCw4IEBACiAJc2JpLT5zX2ZyYWdfc2l6ZSA9IEVYVDNfTUlOX0ZSQUdfU0laRSA8PAogCQkJCSAgIGxlMzJfdG9fY3B1KGVzLT5zX2xvZ19mcmFnX3NpemUpOwogCWlmIChibG9ja3NpemUgIT0gc2JpLT5zX2ZyYWdfc2l6ZSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJFWFQzLWZzOiBmcmFnc2l6ZSAlbHUgIT0gYmxvY2tzaXplICV1ICh1bnN1cHBvcnRlZClcbiIsCisJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJICAgICAgICJlcnJvcjogZnJhZ3NpemUgJWx1ICE9IGJsb2Nrc2l6ZSAldSAodW5zdXBwb3J0ZWQpIiwKIAkJICAgICAgIHNiaS0+c19mcmFnX3NpemUsIGJsb2Nrc2l6ZSk7CiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KQEAgLTE3ODksMzEgKzE4MjUsMzEgQEAKIAl9CiAKIAlpZiAoc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXAgPiBibG9ja3NpemUgKiA4KSB7Ci0JCXByaW50ayAoS0VSTl9FUlIKLQkJCSJFWFQzLWZzOiAjYmxvY2tzIHBlciBncm91cCB0b28gYmlnOiAlbHVcbiIsCisJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSIjYmxvY2tzIHBlciBncm91cCB0b28gYmlnOiAlbHUiLAogCQkJc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXApOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAJaWYgKHNiaS0+c19mcmFnc19wZXJfZ3JvdXAgPiBibG9ja3NpemUgKiA4KSB7Ci0JCXByaW50ayAoS0VSTl9FUlIKLQkJCSJFWFQzLWZzOiAjZnJhZ21lbnRzIHBlciBncm91cCB0b28gYmlnOiAlbHVcbiIsCisJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSJlcnJvcjogI2ZyYWdtZW50cyBwZXIgZ3JvdXAgdG9vIGJpZzogJWx1IiwKIAkJCXNiaS0+c19mcmFnc19wZXJfZ3JvdXApOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAJaWYgKHNiaS0+c19pbm9kZXNfcGVyX2dyb3VwID4gYmxvY2tzaXplICogOCkgewotCQlwcmludGsgKEtFUk5fRVJSCi0JCQkiRVhUMy1mczogI2lub2RlcyBwZXIgZ3JvdXAgdG9vIGJpZzogJWx1XG4iLAorCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkiZXJyb3I6ICNpbm9kZXMgcGVyIGdyb3VwIHRvbyBiaWc6ICVsdSIsCiAJCQlzYmktPnNfaW5vZGVzX3Blcl9ncm91cCk7CiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIAogCWlmIChsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpID4KIAkJICAgIChzZWN0b3JfdCkofjBVTEwpID4+IChzYi0+c19ibG9ja3NpemVfYml0cyAtIDkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogZmlsZXN5c3RlbSBvbiAlczoiCi0JCQkiIHRvbyBsYXJnZSB0byBtb3VudCBzYWZlbHlcbiIsIHNiLT5zX2lkKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJImVycm9yOiBmaWxlc3lzdGVtIGlzIHRvbyBsYXJnZSB0byBtb3VudCBzYWZlbHkiKTsKIAkJaWYgKHNpemVvZihzZWN0b3JfdCkgPCA4KQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUMy1mczogQ09ORklHX0xCREFGIG5vdCAiCi0JCQkJCSJlbmFibGVkXG4iKTsKKwkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkiZXJyb3I6IENPTkZJR19MQkRBRiBub3QgZW5hYmxlZCIpOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAKQEAgLTE4MjcsNyArMTg2Myw4IEBACiAJc2JpLT5zX2dyb3VwX2Rlc2MgPSBrbWFsbG9jKGRiX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksCiAJCQkJICAgIEdGUF9LRVJORUwpOwogCWlmIChzYmktPnNfZ3JvdXBfZGVzYyA9PSBOVUxMKSB7Ci0JCXByaW50ayAoS0VSTl9FUlIgIkVYVDMtZnM6IG5vdCBlbm91Z2ggbWVtb3J5XG4iKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJImVycm9yOiBub3QgZW5vdWdoIG1lbW9yeSIpOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAKQEAgLTE4MzcsMTQgKzE4NzQsMTUgQEAKIAkJYmxvY2sgPSBkZXNjcmlwdG9yX2xvYyhzYiwgbG9naWNfc2JfYmxvY2ssIGkpOwogCQlzYmktPnNfZ3JvdXBfZGVzY1tpXSA9IHNiX2JyZWFkKHNiLCBibG9jayk7CiAJCWlmICghc2JpLT5zX2dyb3VwX2Rlc2NbaV0pIHsKLQkJCXByaW50ayAoS0VSTl9FUlIgIkVYVDMtZnM6ICIKLQkJCQkiY2FuJ3QgcmVhZCBncm91cCBkZXNjcmlwdG9yICVkXG4iLCBpKTsKKwkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkiZXJyb3I6IGNhbid0IHJlYWQgZ3JvdXAgZGVzY3JpcHRvciAlZCIsIGkpOwogCQkJZGJfY291bnQgPSBpOwogCQkJZ290byBmYWlsZWRfbW91bnQyOwogCQl9CiAJfQogCWlmICghZXh0M19jaGVja19kZXNjcmlwdG9ycyAoc2IpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogZ3JvdXAgZGVzY3JpcHRvcnMgY29ycnVwdGVkIVxuIik7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSJlcnJvcjogZ3JvdXAgZGVzY3JpcHRvcnMgY29ycnVwdGVkIik7CiAJCWdvdG8gZmFpbGVkX21vdW50MjsKIAl9CiAJc2JpLT5zX2dkYl9jb3VudCA9IGRiX2NvdW50OwpAQCAtMTg2Miw3ICsxOTAwLDcgQEAKIAkJCQlleHQzX2NvdW50X2RpcnMoc2IpKTsKIAl9CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGluc3VmZmljaWVudCBtZW1vcnlcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogaW5zdWZmaWNpZW50IG1lbW9yeSIpOwogCQlnb3RvIGZhaWxlZF9tb3VudDM7CiAJfQogCkBAIC0xOTEwLDkgKzE5NDgsOSBAQAogCQkJZ290byBmYWlsZWRfbW91bnQzOwogCX0gZWxzZSB7CiAJCWlmICghc2lsZW50KQotCQkJcHJpbnRrIChLRVJOX0VSUgotCQkJCSJleHQzOiBObyBqb3VybmFsIG9uIGZpbGVzeXN0ZW0gb24gJXNcbiIsCi0JCQkJc2ItPnNfaWQpOworCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJCSJlcnJvcjogbm8gam91cm5hbCBmb3VuZC4gIgorCQkJCSJtb3VudGluZyBleHQzIG92ZXIgZXh0Mj8iKTsKIAkJZ290byBmYWlsZWRfbW91bnQzOwogCX0KIApAQCAtMTkzNCw4ICsxOTcyLDkgQEAKIAljYXNlIEVYVDNfTU9VTlRfV1JJVEVCQUNLX0RBVEE6CiAJCWlmICgham91cm5hbF9jaGVja19hdmFpbGFibGVfZmVhdHVyZXMKIAkJICAgIChzYmktPnNfam91cm5hbCwgMCwgMCwgSkZTX0ZFQVRVUkVfSU5DT01QQVRfUkVWT0tFKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBKb3VybmFsIGRvZXMgbm90IHN1cHBvcnQgIgotCQkJICAgICAgICJyZXF1ZXN0ZWQgZGF0YSBqb3VybmFsaW5nIG1vZGVcbiIpOworCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJCSJlcnJvcjogam91cm5hbCBkb2VzIG5vdCBzdXBwb3J0ICIKKwkJCQkicmVxdWVzdGVkIGRhdGEgam91cm5hbGluZyBtb2RlIik7CiAJCQlnb3RvIGZhaWxlZF9tb3VudDQ7CiAJCX0KIAlkZWZhdWx0OgpAQCAtMTk0NCw4ICsxOTgzLDkgQEAKIAogCWlmICh0ZXN0X29wdChzYiwgTk9CSCkpIHsKIAkJaWYgKCEodGVzdF9vcHQoc2IsIERBVEFfRkxBR1MpID09IEVYVDNfTU9VTlRfV1JJVEVCQUNLX0RBVEEpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQzLWZzOiBJZ25vcmluZyBub2JoIG9wdGlvbiAtICIKLQkJCQkiaXRzIHN1cHBvcnRlZCBvbmx5IHdpdGggd3JpdGViYWNrIG1vZGVcbiIpOworCQkJZXh0M19tc2coc2IsIEtFUk5fV0FSTklORywKKwkJCQkid2FybmluZzogaWdub3Jpbmcgbm9iaCBvcHRpb24gLSAiCisJCQkJIml0IGlzIHN1cHBvcnRlZCBvbmx5IHdpdGggd3JpdGViYWNrIG1vZGUiKTsKIAkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBOT0JIKTsKIAkJfQogCX0KQEAgLTE5NTYsMTggKzE5OTYsMTggQEAKIAogCXJvb3QgPSBleHQzX2lnZXQoc2IsIEVYVDNfUk9PVF9JTk8pOwogCWlmIChJU19FUlIocm9vdCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBnZXQgcm9vdCBpbm9kZSBmYWlsZWRcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkIik7CiAJCXJldCA9IFBUUl9FUlIocm9vdCk7CiAJCWdvdG8gZmFpbGVkX21vdW50NDsKIAl9CiAJaWYgKCFTX0lTRElSKHJvb3QtPmlfbW9kZSkgfHwgIXJvb3QtPmlfYmxvY2tzIHx8ICFyb290LT5pX3NpemUpIHsKIAkJaXB1dChyb290KTsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBjb3JydXB0IHJvb3QgaW5vZGUsIHJ1biBlMmZzY2tcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogY29ycnVwdCByb290IGlub2RlLCBydW4gZTJmc2NrIik7CiAJCWdvdG8gZmFpbGVkX21vdW50NDsKIAl9CiAJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKIAlpZiAoIXNiLT5zX3Jvb3QpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBnZXQgcm9vdCBkZW50cnkgZmFpbGVkXG4iKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IGdldCByb290IGRlbnRyeSBmYWlsZWQiKTsKIAkJaXB1dChyb290KTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBmYWlsZWRfbW91bnQ0OwpAQCAtMTk4Niw5ICsyMDI2LDkgQEAKIAlleHQzX29ycGhhbl9jbGVhbnVwKHNiLCBlcyk7CiAJRVhUM19TQihzYiktPnNfbW91bnRfc3RhdGUgJj0gfkVYVDNfT1JQSEFOX0ZTOwogCWlmIChuZWVkc19yZWNvdmVyeSkKLQkJcHJpbnRrIChLRVJOX0lORk8gIkVYVDMtZnM6IHJlY292ZXJ5IGNvbXBsZXRlLlxuIik7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0lORk8sICJyZWNvdmVyeSBjb21wbGV0ZSIpOwogCWV4dDNfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzYiwgZXMpOwotCXByaW50ayAoS0VSTl9JTkZPICJFWFQzLWZzOiBtb3VudGVkIGZpbGVzeXN0ZW0gd2l0aCAlcyBkYXRhIG1vZGUuXG4iLAorCWV4dDNfbXNnKHNiLCBLRVJOX0lORk8sICJtb3VudGVkIGZpbGVzeXN0ZW0gd2l0aCAlcyBkYXRhIG1vZGUiLAogCQl0ZXN0X29wdChzYixEQVRBX0ZMQUdTKSA9PSBFWFQzX01PVU5UX0pPVVJOQUxfREFUQSA/ICJqb3VybmFsIjoKIAkJdGVzdF9vcHQoc2IsREFUQV9GTEFHUykgPT0gRVhUM19NT1VOVF9PUkRFUkVEX0RBVEEgPyAib3JkZXJlZCI6CiAJCSJ3cml0ZWJhY2siKTsKQEAgLTE5OTgsNyArMjAzOCw4IEBACiAKIGNhbnRmaW5kX2V4dDM6CiAJaWYgKCFzaWxlbnQpCi0JCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCBmaW5kIGV4dDMgZmlsZXN5c3RlbSBvbiBkZXYgJXMuXG4iLAorCQlleHQzX21zZyhzYiwgS0VSTl9JTkZPLAorCQkJImVycm9yOiBjYW4ndCBmaW5kIGV4dDMgZmlsZXN5c3RlbSBvbiBkZXYgJXMuIiwKIAkJICAgICAgIHNiLT5zX2lkKTsKIAlnb3RvIGZhaWxlZF9tb3VudDsKIApAQCAtMjA2NiwyNyArMjEwNywyNyBAQAogCiAJam91cm5hbF9pbm9kZSA9IGV4dDNfaWdldChzYiwgam91cm5hbF9pbnVtKTsKIAlpZiAoSVNfRVJSKGpvdXJuYWxfaW5vZGUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogbm8gam91cm5hbCBmb3VuZC5cbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogbm8gam91cm5hbCBmb3VuZCIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJaWYgKCFqb3VybmFsX2lub2RlLT5pX25saW5rKSB7CiAJCW1ha2VfYmFkX2lub2RlKGpvdXJuYWxfaW5vZGUpOwogCQlpcHV0KGpvdXJuYWxfaW5vZGUpOwotCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGpvdXJuYWwgaW5vZGUgaXMgZGVsZXRlZC5cbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogam91cm5hbCBpbm9kZSBpcyBkZWxldGVkIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCWpiZF9kZWJ1ZygyLCAiSm91cm5hbCBpbm9kZSBmb3VuZCBhdCAlcDogJUxkIGJ5dGVzXG4iLAogCQkgIGpvdXJuYWxfaW5vZGUsIGpvdXJuYWxfaW5vZGUtPmlfc2l6ZSk7CiAJaWYgKCFTX0lTUkVHKGpvdXJuYWxfaW5vZGUtPmlfbW9kZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBpbnZhbGlkIGpvdXJuYWwgaW5vZGUuXG4iKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IGludmFsaWQgam91cm5hbCBpbm9kZSIpOwogCQlpcHV0KGpvdXJuYWxfaW5vZGUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlqb3VybmFsID0gam91cm5hbF9pbml0X2lub2RlKGpvdXJuYWxfaW5vZGUpOwogCWlmICgham91cm5hbCkgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IENvdWxkIG5vdCBsb2FkIGpvdXJuYWwgaW5vZGVcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogY291bGQgbm90IGxvYWQgam91cm5hbCBpbm9kZSIpOwogCQlpcHV0KGpvdXJuYWxfaW5vZGUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0yMTA4LDEzICsyMTQ5LDEzIEBACiAJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlczsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwogCi0JYmRldiA9IGV4dDNfYmxrZGV2X2dldChqX2Rldik7CisJYmRldiA9IGV4dDNfYmxrZGV2X2dldChqX2Rldiwgc2IpOwogCWlmIChiZGV2ID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCiAJaWYgKGJkX2NsYWltKGJkZXYsIHNiKSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICAiRVhUMzogZmFpbGVkIHRvIGNsYWltIGV4dGVybmFsIGpvdXJuYWwgZGV2aWNlLlxuIik7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSJlcnJvcjogZmFpbGVkIHRvIGNsYWltIGV4dGVybmFsIGpvdXJuYWwgZGV2aWNlIik7CiAJCWJsa2Rldl9wdXQoYmRldiwgRk1PREVfUkVBRHxGTU9ERV9XUklURSk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTIxMjIsOCArMjE2Myw4IEBACiAJYmxvY2tzaXplID0gc2ItPnNfYmxvY2tzaXplOwogCWhibG9jayA9IGJkZXZfbG9naWNhbF9ibG9ja19zaXplKGJkZXYpOwogCWlmIChibG9ja3NpemUgPCBoYmxvY2spIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkiRVhUMy1mczogYmxvY2tzaXplIHRvbyBzbWFsbCBmb3Igam91cm5hbCBkZXZpY2UuXG4iKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJImVycm9yOiBibG9ja3NpemUgdG9vIHNtYWxsIGZvciBqb3VybmFsIGRldmljZSIpOwogCQlnb3RvIG91dF9iZGV2OwogCX0KIApAQCAtMjEzMSw4ICsyMTcyLDggQEAKIAlvZmZzZXQgPSBFWFQzX01JTl9CTE9DS19TSVpFICUgYmxvY2tzaXplOwogCXNldF9ibG9ja3NpemUoYmRldiwgYmxvY2tzaXplKTsKIAlpZiAoIShiaCA9IF9fYnJlYWQoYmRldiwgc2JfYmxvY2ssIGJsb2Nrc2l6ZSkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogY291bGRuJ3QgcmVhZCBzdXBlcmJsb2NrIG9mICIKLQkJICAgICAgICJleHRlcm5hbCBqb3VybmFsXG4iKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IGNvdWxkbid0IHJlYWQgc3VwZXJibG9jayBvZiAiCisJCQkiZXh0ZXJuYWwgam91cm5hbCIpOwogCQlnb3RvIG91dF9iZGV2OwogCX0KIApAQCAtMjE0MCwxNCArMjE4MSwxNCBAQAogCWlmICgobGUxNl90b19jcHUoZXMtPnNfbWFnaWMpICE9IEVYVDNfU1VQRVJfTUFHSUMpIHx8CiAJICAgICEobGUzMl90b19jcHUoZXMtPnNfZmVhdHVyZV9pbmNvbXBhdCkgJgogCSAgICAgIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9KT1VSTkFMX0RFVikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBleHRlcm5hbCBqb3VybmFsIGhhcyAiCi0JCQkJCSJiYWQgc3VwZXJibG9ja1xuIik7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwgImVycm9yOiBleHRlcm5hbCBqb3VybmFsIGhhcyAiCisJCQkiYmFkIHN1cGVyYmxvY2siKTsKIAkJYnJlbHNlKGJoKTsKIAkJZ290byBvdXRfYmRldjsKIAl9CiAKIAlpZiAobWVtY21wKEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2pvdXJuYWxfdXVpZCwgZXMtPnNfdXVpZCwgMTYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogam91cm5hbCBVVUlEIGRvZXMgbm90IG1hdGNoXG4iKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IGpvdXJuYWwgVVVJRCBkb2VzIG5vdCBtYXRjaCIpOwogCQlicmVsc2UoYmgpOwogCQlnb3RvIG91dF9iZGV2OwogCX0KQEAgLTIxNTksMTkgKzIyMDAsMjEgQEAKIAlqb3VybmFsID0gam91cm5hbF9pbml0X2RldihiZGV2LCBzYi0+c19iZGV2LAogCQkJCQlzdGFydCwgbGVuLCBibG9ja3NpemUpOwogCWlmICgham91cm5hbCkgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGZhaWxlZCB0byBjcmVhdGUgZGV2aWNlIGpvdXJuYWxcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkiZXJyb3I6IGZhaWxlZCB0byBjcmVhdGUgZGV2aWNlIGpvdXJuYWwiKTsKIAkJZ290byBvdXRfYmRldjsKIAl9CiAJam91cm5hbC0+al9wcml2YXRlID0gc2I7CiAJbGxfcndfYmxvY2soUkVBRCwgMSwgJmpvdXJuYWwtPmpfc2JfYnVmZmVyKTsKIAl3YWl0X29uX2J1ZmZlcihqb3VybmFsLT5qX3NiX2J1ZmZlcik7CiAJaWYgKCFidWZmZXJfdXB0b2RhdGUoam91cm5hbC0+al9zYl9idWZmZXIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogSS9PIGVycm9yIG9uIGpvdXJuYWwgZGV2aWNlXG4iKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiSS9PIGVycm9yIG9uIGpvdXJuYWwgZGV2aWNlIik7CiAJCWdvdG8gb3V0X2pvdXJuYWw7CiAJfQogCWlmIChiZTMyX3RvX2NwdShqb3VybmFsLT5qX3N1cGVyYmxvY2stPnNfbnJfdXNlcnMpICE9IDEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBFeHRlcm5hbCBqb3VybmFsIGhhcyBtb3JlIHRoYW4gb25lICIKLQkJCQkJInVzZXIgKHVuc3VwcG9ydGVkKSAtICVkXG4iLAorCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkiZXJyb3I6IGV4dGVybmFsIGpvdXJuYWwgaGFzIG1vcmUgdGhhbiBvbmUgIgorCQkJInVzZXIgKHVuc3VwcG9ydGVkKSAtICVkIiwKIAkJCWJlMzJfdG9fY3B1KGpvdXJuYWwtPmpfc3VwZXJibG9jay0+c19ucl91c2VycykpOwogCQlnb3RvIG91dF9qb3VybmFsOwogCX0KQEAgLTIxOTcsOCArMjI0MCw4IEBACiAKIAlpZiAoam91cm5hbF9kZXZudW0gJiYKIAkgICAgam91cm5hbF9kZXZudW0gIT0gbGUzMl90b19jcHUoZXMtPnNfam91cm5hbF9kZXYpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkVYVDMtZnM6IGV4dGVybmFsIGpvdXJuYWwgZGV2aWNlIG1ham9yL21pbm9yICIKLQkJCSJudW1iZXJzIGhhdmUgY2hhbmdlZFxuIik7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0lORk8sICJleHRlcm5hbCBqb3VybmFsIGRldmljZSBtYWpvci9taW5vciAiCisJCQkibnVtYmVycyBoYXZlIGNoYW5nZWQiKTsKIAkJam91cm5hbF9kZXYgPSBuZXdfZGVjb2RlX2Rldihqb3VybmFsX2Rldm51bSk7CiAJfSBlbHNlCiAJCWpvdXJuYWxfZGV2ID0gbmV3X2RlY29kZV9kZXYobGUzMl90b19jcHUoZXMtPnNfam91cm5hbF9kZXYpKTsKQEAgLTIyMTMsMjEgKzIyNTYsMjEgQEAKIAogCWlmIChFWFQzX0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUikpIHsKIAkJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJFWFQzLWZzOiBJTkZPOiByZWNvdmVyeSAiCi0JCQkJCSJyZXF1aXJlZCBvbiByZWFkb25seSBmaWxlc3lzdGVtLlxuIik7CisJCQlleHQzX21zZyhzYiwgS0VSTl9JTkZPLAorCQkJCSJyZWNvdmVyeSByZXF1aXJlZCBvbiByZWFkb25seSBmaWxlc3lzdGVtIik7CiAJCQlpZiAocmVhbGx5X3JlYWRfb25seSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogd3JpdGUgYWNjZXNzICIKLQkJCQkJInVuYXZhaWxhYmxlLCBjYW5ub3QgcHJvY2VlZC5cbiIpOworCQkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwgImVycm9yOiB3cml0ZSBhY2Nlc3MgIgorCQkJCQkidW5hdmFpbGFibGUsIGNhbm5vdCBwcm9jZWVkIik7CiAJCQkJcmV0dXJuIC1FUk9GUzsKIAkJCX0KLQkJCXByaW50ayAoS0VSTl9JTkZPICJFWFQzLWZzOiB3cml0ZSBhY2Nlc3Mgd2lsbCAiCi0JCQkJCSJiZSBlbmFibGVkIGR1cmluZyByZWNvdmVyeS5cbiIpOworCQkJZXh0M19tc2coc2IsIEtFUk5fSU5GTywKKwkJCQkid3JpdGUgYWNjZXNzIHdpbGwgYmUgZW5hYmxlZCBkdXJpbmcgcmVjb3ZlcnkiKTsKIAkJfQogCX0KIAogCWlmIChqb3VybmFsX2ludW0gJiYgam91cm5hbF9kZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBmaWxlc3lzdGVtIGhhcyBib3RoIGpvdXJuYWwgIgotCQkgICAgICAgImFuZCBpbm9kZSBqb3VybmFscyFcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogZmlsZXN5c3RlbSBoYXMgYm90aCBqb3VybmFsICIKKwkJICAgICAgICJhbmQgaW5vZGUgam91cm5hbHMiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMjQyLDcgKzIyODUsNyBAQAogCWlmICghcmVhbGx5X3JlYWRfb25seSAmJiB0ZXN0X29wdChzYiwgVVBEQVRFX0pPVVJOQUwpKSB7CiAJCWVyciA9IGpvdXJuYWxfdXBkYXRlX2Zvcm1hdChqb3VybmFsKTsKIAkJaWYgKGVycikgIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogZXJyb3IgdXBkYXRpbmcgam91cm5hbC5cbiIpOworCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3IgdXBkYXRpbmcgam91cm5hbCIpOwogCQkJam91cm5hbF9kZXN0cm95KGpvdXJuYWwpOwogCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtMjI1NCw3ICsyMjk3LDcgQEAKIAkJZXJyID0gam91cm5hbF9sb2FkKGpvdXJuYWwpOwogCiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGVycm9yIGxvYWRpbmcgam91cm5hbC5cbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvciBsb2FkaW5nIGpvdXJuYWwiKTsKIAkJam91cm5hbF9kZXN0cm95KGpvdXJuYWwpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTIyNzMsMTYgKzIzMTYsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBleHQzX2NyZWF0ZV9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAotCQkJICAgICAgIHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICogZXMsCitzdGF0aWMgaW50IGV4dDNfY3JlYXRlX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgICAgICBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXMsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IGpvdXJuYWxfaW51bSkKIHsKIAlqb3VybmFsX3QgKmpvdXJuYWw7CiAJaW50IGVycjsKIAogCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IHJlYWRvbmx5IGZpbGVzeXN0ZW0gd2hlbiB0cnlpbmcgdG8gIgotCQkJCSJjcmVhdGUgam91cm5hbC5cbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkiZXJyb3I6IHJlYWRvbmx5IGZpbGVzeXN0ZW0gd2hlbiB0cnlpbmcgdG8gIgorCQkJImNyZWF0ZSBqb3VybmFsIik7CiAJCXJldHVybiAtRVJPRlM7CiAJfQogCkBAIC0yMjkwLDEyICsyMzM0LDEyIEBACiAJaWYgKCFqb3VybmFsKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXByaW50ayhLRVJOX0lORk8gIkVYVDMtZnM6IGNyZWF0aW5nIG5ldyBqb3VybmFsIG9uIGlub2RlICV1XG4iLAorCWV4dDNfbXNnKHNiLCBLRVJOX0lORk8sICJjcmVhdGluZyBuZXcgam91cm5hbCBvbiBpbm9kZSAldSIsCiAJICAgICAgIGpvdXJuYWxfaW51bSk7CiAKIAllcnIgPSBqb3VybmFsX2NyZWF0ZShqb3VybmFsKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogZXJyb3IgY3JlYXRpbmcgam91cm5hbC5cbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvciBjcmVhdGluZyBqb3VybmFsIik7CiAJCWpvdXJuYWxfZGVzdHJveShqb3VybmFsKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMjM3Niw4ICsyNDIwLDggQEAKICAqIGhhcyByZWNvcmRlZCBhbiBlcnJvciBmcm9tIGEgcHJldmlvdXMgbGlmZXRpbWUsIG1vdmUgdGhhdCBlcnJvciB0byB0aGUKICAqIG1haW4gZmlsZXN5c3RlbSBub3cuCiAgKi8KLXN0YXRpYyB2b2lkIGV4dDNfY2xlYXJfam91cm5hbF9lcnIoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCi0JCQkJICAgc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlcykKK3N0YXRpYyB2b2lkIGV4dDNfY2xlYXJfam91cm5hbF9lcnIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXMpCiB7CiAJam91cm5hbF90ICpqb3VybmFsOwogCWludCBqX2Vycm5vOwpAQCAtMjU2OCwxMCArMjYxMiwxMCBAQAogCQkJX19sZTMyIHJldDsKIAkJCWlmICgocmV0ID0gRVhUM19IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCiAJCQkJCX5FWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApKSkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDMtZnM6ICVzOiBjb3VsZG4ndCAiCi0JCQkJICAgICAgICJyZW1vdW50IFJEV1IgYmVjYXVzZSBvZiB1bnN1cHBvcnRlZCAiCi0JCQkJICAgICAgICJvcHRpb25hbCBmZWF0dXJlcyAoJXgpLlxuIiwKLQkJCQkgICAgICAgc2ItPnNfaWQsIGxlMzJfdG9fY3B1KHJldCkpOworCQkJCWV4dDNfbXNnKHNiLCBLRVJOX1dBUk5JTkcsCisJCQkJCSJ3YXJuaW5nOiBjb3VsZG4ndCByZW1vdW50IFJEV1IgIgorCQkJCQkiYmVjYXVzZSBvZiB1bnN1cHBvcnRlZCBvcHRpb25hbCAiCisJCQkJCSJmZWF0dXJlcyAoJXgpIiwgbGUzMl90b19jcHUocmV0KSk7CiAJCQkJZXJyID0gLUVST0ZTOwogCQkJCWdvdG8gcmVzdG9yZV9vcHRzOwogCQkJfQpAQCAtMjU4MiwxMSArMjYyNiwxMCBAQAogCQkJICogcmVxdWlyZSBhIGZ1bGwgdW1vdW50L3JlbW91bnQgZm9yIG5vdy4KIAkJCSAqLwogCQkJaWYgKGVzLT5zX2xhc3Rfb3JwaGFuKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUMy1mczogJXM6IGNvdWxkbid0ICIKKwkJCQlleHQzX21zZyhzYiwgS0VSTl9XQVJOSU5HLCAid2FybmluZzogY291bGRuJ3QgIgogCQkJCSAgICAgICAicmVtb3VudCBSRFdSIGJlY2F1c2Ugb2YgdW5wcm9jZXNzZWQgIgogCQkJCSAgICAgICAib3JwaGFuIGlub2RlIGxpc3QuICBQbGVhc2UgIgotCQkJCSAgICAgICAidW1vdW50L3JlbW91bnQgaW5zdGVhZC5cbiIsCi0JCQkJICAgICAgIHNiLT5zX2lkKTsKKwkJCQkgICAgICAgInVtb3VudC9yZW1vdW50IGluc3RlYWQuIik7CiAJCQkJZXJyID0gLUVJTlZBTDsKIAkJCQlnb3RvIHJlc3RvcmVfb3B0czsKIAkJCX0KQEAgLTI2ODYsMTMgKzI3MjksMTEgQEAKIAlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CiAJYnVmLT5mX2Jsb2NrcyA9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkgLSBzYmktPnNfb3ZlcmhlYWRfbGFzdDsKIAlidWYtPmZfYmZyZWUgPSBwZXJjcHVfY291bnRlcl9zdW1fcG9zaXRpdmUoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOwotCWVzLT5zX2ZyZWVfYmxvY2tzX2NvdW50ID0gY3B1X3RvX2xlMzIoYnVmLT5mX2JmcmVlKTsKIAlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlIC0gbGUzMl90b19jcHUoZXMtPnNfcl9ibG9ja3NfY291bnQpOwogCWlmIChidWYtPmZfYmZyZWUgPCBsZTMyX3RvX2NwdShlcy0+c19yX2Jsb2Nrc19jb3VudCkpCiAJCWJ1Zi0+Zl9iYXZhaWwgPSAwOwogCWJ1Zi0+Zl9maWxlcyA9IGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19jb3VudCk7CiAJYnVmLT5mX2ZmcmVlID0gcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKLQllcy0+c19mcmVlX2lub2Rlc19jb3VudCA9IGNwdV90b19sZTMyKGJ1Zi0+Zl9mZnJlZSk7CiAJYnVmLT5mX25hbWVsZW4gPSBFWFQzX05BTUVfTEVOOwogCWZzaWQgPSBsZTY0X3RvX2NwdXAoKHZvaWQgKillcy0+c191dWlkKSBeCiAJICAgICAgIGxlNjRfdG9fY3B1cCgodm9pZCAqKWVzLT5zX3V1aWQgKyBzaXplb2YodTY0KSk7CkBAIC0yODM3LDkgKzI4NzgsOSBAQAogCWlmIChFWFQzX1NCKHNiKS0+c19xZl9uYW1lc1t0eXBlXSkgewogCQkvKiBRdW90YWZpbGUgbm90IG9mIGZzIHJvb3Q/ICovCiAJCWlmIChwYXRoLmRlbnRyeS0+ZF9wYXJlbnQgIT0gc2ItPnNfcm9vdCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkiRVhUMy1mczogUXVvdGEgZmlsZSBub3Qgb24gZmlsZXN5c3RlbSByb290LiAiCi0JCQkJIkpvdXJuYWxlZCBxdW90YSB3aWxsIG5vdCB3b3JrLlxuIik7CisJCQlleHQzX21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkJCSJ3YXJuaW5nOiBRdW90YSBmaWxlIG5vdCBvbiBmaWxlc3lzdGVtIHJvb3QuICIKKwkJCQkiSm91cm5hbGVkIHF1b3RhIHdpbGwgbm90IHdvcmsuIik7CiAJfQogCiAJLyoKQEAgLTI5MjEsOCArMjk2Miw5IEBACiAJaGFuZGxlX3QgKmhhbmRsZSA9IGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKTsKIAogCWlmICghaGFuZGxlKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDMtZnM6IFF1b3RhIHdyaXRlIChvZmY9JUx1LCBsZW49JUx1KSIKLQkJCSIgY2FuY2VsbGVkIGJlY2F1c2UgdHJhbnNhY3Rpb24gaXMgbm90IHN0YXJ0ZWQuXG4iLAorCQlleHQzX21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkJIndhcm5pbmc6IHF1b3RhIHdyaXRlIChvZmY9JWxsdSwgbGVuPSVsbHUpIgorCQkJIiBjYW5jZWxsZWQgYmVjYXVzZSB0cmFuc2FjdGlvbiBpcyBub3Qgc3RhcnRlZC4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylvZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpbGVuKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZXh0My94YXR0ci5jIGIvZnMvZXh0My94YXR0ci5jCmluZGV4IDU0NWUzN2MuLjM4N2Q5MmQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMveGF0dHIuYworKysgYi9mcy9leHQzL3hhdHRyLmMKQEAgLTk2MCw2ICs5NjAsMTAgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gY2xlYW51cDsKIAorCWVycm9yID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBpcy5pbG9jLmJoKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cDsKKwogCWlmIChFWFQzX0koaW5vZGUpLT5pX3N0YXRlICYgRVhUM19TVEFURV9ORVcpIHsKIAkJc3RydWN0IGV4dDNfaW5vZGUgKnJhd19pbm9kZSA9IGV4dDNfcmF3X2lub2RlKCZpcy5pbG9jKTsKIAkJbWVtc2V0KHJhd19pbm9kZSwgMCwgRVhUM19TQihpbm9kZS0+aV9zYiktPnNfaW5vZGVfc2l6ZSk7CkBAIC05ODUsOSArOTg5LDYgQEAKIAkJaWYgKGZsYWdzICYgWEFUVFJfQ1JFQVRFKQogCQkJZ290byBjbGVhbnVwOwogCX0KLQllcnJvciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgaXMuaWxvYy5iaCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIGNsZWFudXA7CiAJaWYgKCF2YWx1ZSkgewogCQlpZiAoIWlzLnMubm90X2ZvdW5kKQogCQkJZXJyb3IgPSBleHQzX3hhdHRyX2lib2R5X3NldChoYW5kbGUsIGlub2RlLCAmaSwgJmlzKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvc3VwZXIuYyBiL2ZzL2V4dDQvc3VwZXIuYwppbmRleCA4YjU4YTE0Li43NjhjMTExIDEwMDY0NAotLS0gYS9mcy9leHQ0L3N1cGVyLmMKKysrIGIvZnMvZXh0NC9zdXBlci5jCkBAIC03NjksOSArNzY5LDIyIEBACiAjaWYgZGVmaW5lZChDT05GSUdfUVVPVEEpCiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CiAKLQlpZiAoc2JpLT5zX2pxdW90YV9mbXQpCi0JCXNlcV9wcmludGYoc2VxLCAiLGpxZm10PSVzIiwKLQkJKHNiaS0+c19qcXVvdGFfZm10ID09IFFGTVRfVkZTX09MRCkgPyAidmZzb2xkIiA6ICJ2ZnN2MCIpOworCWlmIChzYmktPnNfanF1b3RhX2ZtdCkgeworCQljaGFyICpmbXRuYW1lID0gIiI7CisKKwkJc3dpdGNoIChzYmktPnNfanF1b3RhX2ZtdCkgeworCQljYXNlIFFGTVRfVkZTX09MRDoKKwkJCWZtdG5hbWUgPSAidmZzb2xkIjsKKwkJCWJyZWFrOworCQljYXNlIFFGTVRfVkZTX1YwOgorCQkJZm10bmFtZSA9ICJ2ZnN2MCI7CisJCQlicmVhazsKKwkJY2FzZSBRRk1UX1ZGU19WMToKKwkJCWZtdG5hbWUgPSAidmZzdjEiOworCQkJYnJlYWs7CisJCX0KKwkJc2VxX3ByaW50ZihzZXEsICIsanFmbXQ9JXMiLCBmbXRuYW1lKTsKKwl9CiAKIAlpZiAoc2JpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSkKIAkJc2VxX3ByaW50ZihzZXEsICIsdXNyanF1b3RhPSVzIiwgc2JpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSk7CkBAIC0xMDg0LDkgKzEwOTcsOSBAQAogCU9wdF9hYm9ydCwgT3B0X2RhdGFfam91cm5hbCwgT3B0X2RhdGFfb3JkZXJlZCwgT3B0X2RhdGFfd3JpdGViYWNrLAogCU9wdF9kYXRhX2Vycl9hYm9ydCwgT3B0X2RhdGFfZXJyX2lnbm9yZSwKIAlPcHRfdXNyanF1b3RhLCBPcHRfZ3JwanF1b3RhLCBPcHRfb2ZmdXNyanF1b3RhLCBPcHRfb2ZmZ3JwanF1b3RhLAotCU9wdF9qcWZtdF92ZnNvbGQsIE9wdF9qcWZtdF92ZnN2MCwgT3B0X3F1b3RhLCBPcHRfbm9xdW90YSwKLQlPcHRfaWdub3JlLCBPcHRfYmFycmllciwgT3B0X25vYmFycmllciwgT3B0X2VyciwgT3B0X3Jlc2l6ZSwKLQlPcHRfdXNycXVvdGEsIE9wdF9ncnBxdW90YSwgT3B0X2lfdmVyc2lvbiwKKwlPcHRfanFmbXRfdmZzb2xkLCBPcHRfanFmbXRfdmZzdjAsIE9wdF9qcWZtdF92ZnN2MSwgT3B0X3F1b3RhLAorCU9wdF9ub3F1b3RhLCBPcHRfaWdub3JlLCBPcHRfYmFycmllciwgT3B0X25vYmFycmllciwgT3B0X2VyciwKKwlPcHRfcmVzaXplLCBPcHRfdXNycXVvdGEsIE9wdF9ncnBxdW90YSwgT3B0X2lfdmVyc2lvbiwKIAlPcHRfc3RyaXBlLCBPcHRfZGVsYWxsb2MsIE9wdF9ub2RlbGFsbG9jLAogCU9wdF9ibG9ja192YWxpZGl0eSwgT3B0X25vYmxvY2tfdmFsaWRpdHksCiAJT3B0X2lub2RlX3JlYWRhaGVhZF9ibGtzLCBPcHRfam91cm5hbF9pb3ByaW8sCkBAIC0xMTM3LDYgKzExNTAsNyBAQAogCXtPcHRfZ3JwanF1b3RhLCAiZ3JwanF1b3RhPSVzIn0sCiAJe09wdF9qcWZtdF92ZnNvbGQsICJqcWZtdD12ZnNvbGQifSwKIAl7T3B0X2pxZm10X3Zmc3YwLCAianFmbXQ9dmZzdjAifSwKKwl7T3B0X2pxZm10X3Zmc3YxLCAianFmbXQ9dmZzdjEifSwKIAl7T3B0X2dycHF1b3RhLCAiZ3JwcXVvdGEifSwKIAl7T3B0X25vcXVvdGEsICJub3F1b3RhIn0sCiAJe09wdF9xdW90YSwgInF1b3RhIn0sCkBAIC0xNDM5LDYgKzE0NTMsOSBAQAogCQkJZ290byBzZXRfcWZfZm9ybWF0OwogCQljYXNlIE9wdF9qcWZtdF92ZnN2MDoKIAkJCXFmbXQgPSBRRk1UX1ZGU19WMDsKKwkJCWdvdG8gc2V0X3FmX2Zvcm1hdDsKKwkJY2FzZSBPcHRfanFmbXRfdmZzdjE6CisJCQlxZm10ID0gUUZNVF9WRlNfVjE7CiBzZXRfcWZfZm9ybWF0OgogCQkJaWYgKHNiX2FueV9xdW90YV9sb2FkZWQoc2IpICYmCiAJCQkgICAgc2JpLT5zX2pxdW90YV9mbXQgIT0gcWZtdCkgewpAQCAtMTQ4MSw2ICsxNDk4LDcgQEAKIAkJY2FzZSBPcHRfb2ZmZ3JwanF1b3RhOgogCQljYXNlIE9wdF9qcWZtdF92ZnNvbGQ6CiAJCWNhc2UgT3B0X2pxZm10X3Zmc3YwOgorCQljYXNlIE9wdF9qcWZtdF92ZnN2MToKIAkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKIAkJCQkiam91cm5hbGVkIHF1b3RhIG9wdGlvbnMgbm90IHN1cHBvcnRlZCIpOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9mcy9pc29mcy9jb21wcmVzcy5jIGIvZnMvaXNvZnMvY29tcHJlc3MuYwppbmRleCBkZWZiOTMyLi4wYjNmYTc5IDEwMDY0NAotLS0gYS9mcy9pc29mcy9jb21wcmVzcy5jCisrKyBiL2ZzL2lzb2ZzL2NvbXByZXNzLmMKQEAgLTM2LDYgKzM2LDI2MCBAQAogc3RhdGljIERFRklORV9NVVRFWCh6aXNvZnNfemxpYl9sb2NrKTsKIAogLyoKKyAqIFJlYWQgZGF0YSBvZiBAaW5vZGUgZnJvbSBAYmxvY2tfc3RhcnQgdG8gQGJsb2NrX2VuZCBhbmQgdW5jb21wcmVzcworICogdG8gb25lIHppc29mcyBibG9jay4gU3RvcmUgdGhlIGRhdGEgaW4gdGhlIEBwYWdlcyBhcnJheSB3aXRoIEBwY291bnQKKyAqIGVudHJpZXMuIFN0YXJ0IHN0b3JpbmcgYXQgb2Zmc2V0IEBwb2Zmc2V0IG9mIHRoZSBmaXJzdCBwYWdlLgorICovCitzdGF0aWMgbG9mZl90IHppc29mc191bmNvbXByZXNzX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBibG9ja19zdGFydCwKKwkJCQkgICAgICBsb2ZmX3QgYmxvY2tfZW5kLCBpbnQgcGNvdW50LAorCQkJCSAgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIHBvZmZzZXQsCisJCQkJICAgICAgaW50ICplcnJwKQoreworCXVuc2lnbmVkIGludCB6aXNvZnNfYmxvY2tfc2hpZnQgPSBJU09GU19JKGlub2RlKS0+aV9mb3JtYXRfcGFybVsxXTsKKwl1bnNpZ25lZCBpbnQgYnVmc2l6ZSA9IElTT0ZTX0JVRkZFUl9TSVpFKGlub2RlKTsKKwl1bnNpZ25lZCBpbnQgYnVmc2hpZnQgPSBJU09GU19CVUZGRVJfQklUUyhpbm9kZSk7CisJdW5zaWduZWQgaW50IGJ1Zm1hc2sgPSBidWZzaXplIC0gMTsKKwlpbnQgaSwgYmxvY2tfc2l6ZSA9IGJsb2NrX2VuZCAtIGJsb2NrX3N0YXJ0OworCXpfc3RyZWFtIHN0cmVhbSA9IHsgLnRvdGFsX291dCA9IDAsCisJCQkgICAgLmF2YWlsX2luID0gMCwKKwkJCSAgICAuYXZhaWxfb3V0ID0gMCwgfTsKKwlpbnQgemVycjsKKwlpbnQgbmVlZGJsb2NrcyA9IChibG9ja19zaXplICsgKGJsb2NrX3N0YXJ0ICYgYnVmbWFzaykgKyBidWZtYXNrKQorCQkJCT4+IGJ1ZnNoaWZ0OworCWludCBoYXZlYmxvY2tzOworCWJsa2NudF90IGJsb2NrbnVtOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW25lZWRibG9ja3MgKyAxXTsKKwlpbnQgY3VyYmgsIGN1cnBhZ2U7CisKKwlpZiAoYmxvY2tfc2l6ZSA+IGRlZmxhdGVCb3VuZCgxVUwgPDwgemlzb2ZzX2Jsb2NrX3NoaWZ0KSkgeworCQkqZXJycCA9IC1FSU87CisJCXJldHVybiAwOworCX0KKwkvKiBFbXB0eSBibG9jaz8gKi8KKwlpZiAoYmxvY2tfc2l6ZSA9PSAwKSB7CisJCWZvciAoIGkgPSAwIDsgaSA8IHBjb3VudCA7IGkrKyApIHsKKwkJCWlmICghcGFnZXNbaV0pCisJCQkJY29udGludWU7CisJCQltZW1zZXQocGFnZV9hZGRyZXNzKHBhZ2VzW2ldKSwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2VzW2ldKTsKKwkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlc1tpXSk7CisJCX0KKwkJcmV0dXJuICgobG9mZl90KXBjb3VudCkgPDwgUEFHRV9DQUNIRV9TSElGVDsKKwl9CisKKwkvKiBCZWNhdXNlIHpsaWIgaXMgbm90IHRocmVhZC1zYWZlLCBkbyBhbGwgdGhlIEkvTyBhdCB0aGUgdG9wLiAqLworCWJsb2NrbnVtID0gYmxvY2tfc3RhcnQgPj4gYnVmc2hpZnQ7CisJbWVtc2V0KGJocywgMCwgKG5lZWRibG9ja3MgKyAxKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKikpOworCWhhdmVibG9ja3MgPSBpc29mc19nZXRfYmxvY2tzKGlub2RlLCBibG9ja251bSwgYmhzLCBuZWVkYmxvY2tzKTsKKwlsbF9yd19ibG9jayhSRUFELCBoYXZlYmxvY2tzLCBiaHMpOworCisJY3VyYmggPSAwOworCWN1cnBhZ2UgPSAwOworCS8qCisJICogRmlyc3QgYmxvY2sgaXMgc3BlY2lhbCBzaW5jZSBpdCBtYXkgYmUgZnJhY3Rpb25hbC4gIFdlIGFsc28gd2FpdCBmb3IKKwkgKiBpdCBiZWZvcmUgZ3JhYmJpbmcgdGhlIHpsaWIgbXV0ZXg7IG9kZHMgYXJlIHRoYXQgdGhlIHN1YnNlcXVlbnQKKwkgKiBibG9ja3MgYXJlIGdvaW5nIHRvIGNvbWUgaW4gaW4gc2hvcnQgb3JkZXIgc28gd2UgZG9uJ3QgaG9sZCB0aGUgemxpYgorCSAqIG11dGV4IGxvbmdlciB0aGFuIG5lY2Vzc2FyeS4KKwkgKi8KKworCWlmICghYmhzWzBdKQorCQlnb3RvIGJfZWlvOworCisJd2FpdF9vbl9idWZmZXIoYmhzWzBdKTsKKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaHNbMF0pKSB7CisJCSplcnJwID0gLUVJTzsKKwkJZ290byBiX2VpbzsKKwl9CisKKwlzdHJlYW0ud29ya3NwYWNlID0gemlzb2ZzX3psaWJfd29ya3NwYWNlOworCW11dGV4X2xvY2soJnppc29mc196bGliX2xvY2spOworCQkKKwl6ZXJyID0gemxpYl9pbmZsYXRlSW5pdCgmc3RyZWFtKTsKKwlpZiAoemVyciAhPSBaX09LKSB7CisJCWlmICh6ZXJyID09IFpfTUVNX0VSUk9SKQorCQkJKmVycnAgPSAtRU5PTUVNOworCQllbHNlCisJCQkqZXJycCA9IC1FSU87CisJCXByaW50ayhLRVJOX0RFQlVHICJ6aXNvZnM6IHppc29mc19pbmZsYXRlSW5pdCByZXR1cm5lZCAlZFxuIiwKKwkJCSAgICAgICB6ZXJyKTsKKwkJZ290byB6X2VpbzsKKwl9CisKKwl3aGlsZSAoY3VycGFnZSA8IHBjb3VudCAmJiBjdXJiaCA8IGhhdmVibG9ja3MgJiYKKwkgICAgICAgemVyciAhPSBaX1NUUkVBTV9FTkQpIHsKKwkJaWYgKCFzdHJlYW0uYXZhaWxfb3V0KSB7CisJCQlpZiAocGFnZXNbY3VycGFnZV0pIHsKKwkJCQlzdHJlYW0ubmV4dF9vdXQgPSBwYWdlX2FkZHJlc3MocGFnZXNbY3VycGFnZV0pCisJCQkJCQkrIHBvZmZzZXQ7CisJCQkJc3RyZWFtLmF2YWlsX291dCA9IFBBR0VfQ0FDSEVfU0laRSAtIHBvZmZzZXQ7CisJCQkJcG9mZnNldCA9IDA7CisJCQl9IGVsc2UgeworCQkJCXN0cmVhbS5uZXh0X291dCA9ICh2b2lkICopJnppc29mc19zaW5rX3BhZ2U7CisJCQkJc3RyZWFtLmF2YWlsX291dCA9IFBBR0VfQ0FDSEVfU0laRTsKKwkJCX0KKwkJfQorCQlpZiAoIXN0cmVhbS5hdmFpbF9pbikgeworCQkJd2FpdF9vbl9idWZmZXIoYmhzW2N1cmJoXSk7CisJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaHNbY3VyYmhdKSkgeworCQkJCSplcnJwID0gLUVJTzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXN0cmVhbS5uZXh0X2luICA9IGJoc1tjdXJiaF0tPmJfZGF0YSArCisJCQkJCQkoYmxvY2tfc3RhcnQgJiBidWZtYXNrKTsKKwkJCXN0cmVhbS5hdmFpbF9pbiA9IG1pbl90KHVuc2lnbmVkLCBidWZzaXplIC0KKwkJCQkJCShibG9ja19zdGFydCAmIGJ1Zm1hc2spLAorCQkJCQkJYmxvY2tfc2l6ZSk7CisJCQlibG9ja19zaXplIC09IHN0cmVhbS5hdmFpbF9pbjsKKwkJCWJsb2NrX3N0YXJ0ID0gMDsKKwkJfQorCisJCXdoaWxlIChzdHJlYW0uYXZhaWxfb3V0ICYmIHN0cmVhbS5hdmFpbF9pbikgeworCQkJemVyciA9IHpsaWJfaW5mbGF0ZSgmc3RyZWFtLCBaX1NZTkNfRkxVU0gpOworCQkJaWYgKHplcnIgPT0gWl9CVUZfRVJST1IgJiYgc3RyZWFtLmF2YWlsX2luID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAoemVyciA9PSBaX1NUUkVBTV9FTkQpCisJCQkJYnJlYWs7CisJCQlpZiAoemVyciAhPSBaX09LKSB7CisJCQkJLyogRU9GLCBlcnJvciwgb3IgdHJ5aW5nIHRvIHJlYWQgYmV5b25kIGVuZCBvZiBpbnB1dCAqLworCQkJCWlmICh6ZXJyID09IFpfTUVNX0VSUk9SKQorCQkJCQkqZXJycCA9IC1FTk9NRU07CisJCQkJZWxzZSB7CisJCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJCSAgICAgICAiemlzb2ZzOiB6aXNvZnNfaW5mbGF0ZSByZXR1cm5lZCIKKwkJCQkJICAgICAgICIgJWQsIGlub2RlID0gJWx1LCIKKwkJCQkJICAgICAgICIgcGFnZSBpZHggPSAlZCwgYmggaWR4ID0gJWQsIgorCQkJCQkgICAgICAgIiBhdmFpbF9pbiA9ICVkLCIKKwkJCQkJICAgICAgICIgYXZhaWxfb3V0ID0gJWRcbiIsCisJCQkJCSAgICAgICB6ZXJyLCBpbm9kZS0+aV9pbm8sIGN1cnBhZ2UsCisJCQkJCSAgICAgICBjdXJiaCwgc3RyZWFtLmF2YWlsX2luLAorCQkJCQkgICAgICAgc3RyZWFtLmF2YWlsX291dCk7CisJCQkJCSplcnJwID0gLUVJTzsKKwkJCQl9CisJCQkJZ290byBpbmZsYXRlX291dDsKKwkJCX0KKwkJfQorCisJCWlmICghc3RyZWFtLmF2YWlsX291dCkgeworCQkJLyogVGhpcyBwYWdlIGNvbXBsZXRlZCAqLworCQkJaWYgKHBhZ2VzW2N1cnBhZ2VdKSB7CisJCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZXNbY3VycGFnZV0pOworCQkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlc1tjdXJwYWdlXSk7CisJCQl9CisJCQljdXJwYWdlKys7CisJCX0KKwkJaWYgKCFzdHJlYW0uYXZhaWxfaW4pCisJCQljdXJiaCsrOworCX0KK2luZmxhdGVfb3V0OgorCXpsaWJfaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKworel9laW86CisJbXV0ZXhfdW5sb2NrKCZ6aXNvZnNfemxpYl9sb2NrKTsKKworYl9laW86CisJZm9yIChpID0gMDsgaSA8IGhhdmVibG9ja3M7IGkrKykKKwkJYnJlbHNlKGJoc1tpXSk7CisJcmV0dXJuIHN0cmVhbS50b3RhbF9vdXQ7Cit9CisKKy8qCisgKiBVbmNvbXByZXNzIGRhdGEgc28gdGhhdCBwYWdlc1tmdWxsX3BhZ2VdIGlzIGZ1bGx5IHVwdG9kYXRlIGFuZCBwb3NzaWJseQorICogZmlsbHMgaW4gb3RoZXIgcGFnZXMgaWYgd2UgaGF2ZSBkYXRhIGZvciB0aGVtLgorICovCitzdGF0aWMgaW50IHppc29mc19maWxsX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmdWxsX3BhZ2UsIGludCBwY291bnQsCisJCQkgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMpCit7CisJbG9mZl90IHN0YXJ0X29mZiwgZW5kX29mZjsKKwlsb2ZmX3QgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZDsKKwl1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBJU09GU19JKGlub2RlKS0+aV9mb3JtYXRfcGFybVswXTsKKwl1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktPmlfZm9ybWF0X3Bhcm1bMV07CisJdW5zaWduZWQgaW50IGJsb2NrcHRyOworCWxvZmZfdCBwb2Zmc2V0ID0gMDsKKwlibGtjbnRfdCBjc3RhcnRfYmxvY2ssIGNlbmRfYmxvY2s7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwl1bnNpZ25lZCBpbnQgYmxrYml0cyA9IElTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKTsKKwl1bnNpZ25lZCBpbnQgYmxrc2l6ZSA9IDEgPDwgYmxrYml0czsKKwlpbnQgZXJyOworCWxvZmZfdCByZXQ7CisKKwlCVUdfT04oIXBhZ2VzW2Z1bGxfcGFnZV0pOworCisJLyoKKwkgKiBXZSB3YW50IHRvIHJlYWQgYXQgbGVhc3QgJ2Z1bGxfcGFnZScgcGFnZS4gQmVjYXVzZSB3ZSBoYXZlIHRvCisJICogdW5jb21wcmVzcyB0aGUgd2hvbGUgY29tcHJlc3Npb24gYmxvY2sgYW55d2F5LCBmaWxsIHRoZSBzdXJyb3VuZGluZworCSAqIHBhZ2VzIHdpdGggdGhlIGRhdGEgd2UgaGF2ZSBhbnl3YXkuLi4KKwkgKi8KKwlzdGFydF9vZmYgPSBwYWdlX29mZnNldChwYWdlc1tmdWxsX3BhZ2VdKTsKKwllbmRfb2ZmID0gbWluX3QobG9mZl90LCBzdGFydF9vZmYgKyBQQUdFX0NBQ0hFX1NJWkUsIGlub2RlLT5pX3NpemUpOworCisJY3N0YXJ0X2Jsb2NrID0gc3RhcnRfb2ZmID4+IHppc29mc19ibG9ja19zaGlmdDsKKwljZW5kX2Jsb2NrID0gKGVuZF9vZmYgKyAoMSA8PCB6aXNvZnNfYmxvY2tfc2hpZnQpIC0gMSkKKwkJCT4+IHppc29mc19ibG9ja19zaGlmdDsKKworCVdBUk5fT04oc3RhcnRfb2ZmIC0gKGZ1bGxfcGFnZSA8PCBQQUdFX0NBQ0hFX1NISUZUKSAhPQorCQkoKGNzdGFydF9ibG9jayA8PCB6aXNvZnNfYmxvY2tfc2hpZnQpICYgUEFHRV9DQUNIRV9NQVNLKSk7CisKKwkvKiBGaW5kIHRoZSBwb2ludGVyIHRvIHRoaXMgc3BlY2lmaWMgY2h1bmsgKi8KKwkvKiBOb3RlOiB3ZSdyZSBub3QgdXNpbmcgaXNvbnVtXzczMSgpIGhlcmUgYmVjYXVzZSB0aGUgZGF0YSBpcyBrbm93biBhbGlnbmVkICovCisJLyogTm90ZTogaGVhZGVyX3NpemUgaXMgaW4gMzItYml0IHdvcmRzICg0IGJ5dGVzKSAqLworCWJsb2NrcHRyID0gKGhlYWRlcl9zaXplICsgY3N0YXJ0X2Jsb2NrKSA8PCAyOworCWJoID0gaXNvZnNfYnJlYWQoaW5vZGUsIGJsb2NrcHRyID4+IGJsa2JpdHMpOworCWlmICghYmgpCisJCXJldHVybiAtRUlPOworCWJsb2NrX3N0YXJ0ID0gbGUzMl90b19jcHUoKihfX2xlMzIgKikKKwkJCQkoYmgtPmJfZGF0YSArIChibG9ja3B0ciAmIChibGtzaXplIC0gMSkpKSk7CisKKwl3aGlsZSAoY3N0YXJ0X2Jsb2NrIDwgY2VuZF9ibG9jayAmJiBwY291bnQgPiAwKSB7CisJCS8qIExvYWQgZW5kIG9mIHRoZSBjb21wcmVzc2VkIGJsb2NrIGluIHRoZSBmaWxlICovCisJCWJsb2NrcHRyICs9IDQ7CisJCS8qIFRyYXZlcnNlZCB0byBuZXh0IGJsb2NrPyAqLworCQlpZiAoIShibG9ja3B0ciAmIChibGtzaXplIC0gMSkpKSB7CisJCQlicmVsc2UoYmgpOworCisJCQliaCA9IGlzb2ZzX2JyZWFkKGlub2RlLCBibG9ja3B0ciA+PiBibGtiaXRzKTsKKwkJCWlmICghYmgpCisJCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJYmxvY2tfZW5kID0gbGUzMl90b19jcHUoKihfX2xlMzIgKikKKwkJCQkoYmgtPmJfZGF0YSArIChibG9ja3B0ciAmIChibGtzaXplIC0gMSkpKSk7CisJCWlmIChibG9ja19zdGFydCA+IGJsb2NrX2VuZCkgeworCQkJYnJlbHNlKGJoKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWVyciA9IDA7CisJCXJldCA9IHppc29mc191bmNvbXByZXNzX2Jsb2NrKGlub2RlLCBibG9ja19zdGFydCwgYmxvY2tfZW5kLAorCQkJCQkgICAgICBwY291bnQsIHBhZ2VzLCBwb2Zmc2V0LCAmZXJyKTsKKwkJcG9mZnNldCArPSByZXQ7CisJCXBhZ2VzICs9IHBvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJcGNvdW50IC09IHBvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJZnVsbF9wYWdlIC09IHBvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJcG9mZnNldCAmPSB+UEFHRV9DQUNIRV9NQVNLOworCisJCWlmIChlcnIpIHsKKwkJCWJyZWxzZShiaCk7CisJCQkvKgorCQkJICogRGlkIHdlIGZpbmlzaCByZWFkaW5nIHRoZSBwYWdlIHdlIHJlYWxseSB3YW50ZWQKKwkJCSAqIHRvIHJlYWQ/CisJCQkgKi8KKwkJCWlmIChmdWxsX3BhZ2UgPCAwKQorCQkJCXJldHVybiAwOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWJsb2NrX3N0YXJ0ID0gYmxvY2tfZW5kOworCQljc3RhcnRfYmxvY2srKzsKKwl9CisKKwlpZiAocG9mZnNldCAmJiAqcGFnZXMpIHsKKwkJbWVtc2V0KHBhZ2VfYWRkcmVzcygqcGFnZXMpICsgcG9mZnNldCwgMCwKKwkJICAgICAgIFBBR0VfQ0FDSEVfU0laRSAtIHBvZmZzZXQpOworCQlmbHVzaF9kY2FjaGVfcGFnZSgqcGFnZXMpOworCQlTZXRQYWdlVXB0b2RhdGUoKnBhZ2VzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiBXaGVuIGRlY29tcHJlc3NpbmcsIHdlIHR5cGljYWxseSBvYnRhaW4gbW9yZSB0aGFuIG9uZSBwYWdlCiAgKiBwZXIgcmVmZXJlbmNlLiAgV2UgaW5qZWN0IHRoZSBhZGRpdGlvbmFsIHBhZ2VzIGludG8gdGhlIHBhZ2UKICAqIGNhY2hlIGFzIGEgZm9ybSBvZiByZWFkYWhlYWQuCkBAIC00NCwyNzggKzI5OCw2MSBAQAogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKLQl1bnNpZ25lZCBpbnQgbWF4cGFnZSwgeHBhZ2UsIGZwYWdlLCBibG9ja2luZGV4OwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgYmxvY2twdHIsIGJsb2NrZW5kcHRyLCBjc3RhcnQsIGNlbmQsIGNzaXplOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpwdHJiaFsyXTsKLQl1bnNpZ25lZCBsb25nIGJ1ZnNpemUgPSBJU09GU19CVUZGRVJfU0laRShpbm9kZSk7Ci0JdW5zaWduZWQgaW50IGJ1ZnNoaWZ0ID0gSVNPRlNfQlVGRkVSX0JJVFMoaW5vZGUpOwotCXVuc2lnbmVkIGxvbmcgYnVmbWFzayAgPSBidWZzaXplIC0gMTsKLQlpbnQgZXJyID0gLUVJTzsKLQlpbnQgaTsKLQl1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBJU09GU19JKGlub2RlKS0+aV9mb3JtYXRfcGFybVswXTsKKwlpbnQgZXJyOworCWludCBpLCBwY291bnQsIGZ1bGxfcGFnZTsKIAl1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3NoaWZ0ID0gSVNPRlNfSShpbm9kZSktPmlfZm9ybWF0X3Bhcm1bMV07Ci0JLyogdW5zaWduZWQgbG9uZyB6aXNvZnNfYmxvY2tfc2l6ZSA9IDFVTCA8PCB6aXNvZnNfYmxvY2tfc2hpZnQ7ICovCi0JdW5zaWduZWQgaW50IHppc29mc19ibG9ja19wYWdlX3NoaWZ0ID0gemlzb2ZzX2Jsb2NrX3NoaWZ0LVBBR0VfQ0FDSEVfU0hJRlQ7Ci0JdW5zaWduZWQgbG9uZyB6aXNvZnNfYmxvY2tfcGFnZXMgPSAxVUwgPDwgemlzb2ZzX2Jsb2NrX3BhZ2Vfc2hpZnQ7Ci0JdW5zaWduZWQgbG9uZyB6aXNvZnNfYmxvY2tfcGFnZV9tYXNrID0gemlzb2ZzX2Jsb2NrX3BhZ2VzLTE7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2VzW3ppc29mc19ibG9ja19wYWdlc107Ci0JdW5zaWduZWQgbG9uZyBpbmRleCA9IHBhZ2UtPmluZGV4OwotCWludCBpbmRleGJsb2NrczsKKwl1bnNpZ25lZCBpbnQgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgPQorCQlQQUdFX0NBQ0hFX1NISUZUIDw9IHppc29mc19ibG9ja19zaGlmdCA/CisJCSgxIDw8ICh6aXNvZnNfYmxvY2tfc2hpZnQgLSBQQUdFX0NBQ0hFX1NISUZUKSkgOiAwOworCXN0cnVjdCBwYWdlICpwYWdlc1ttYXhfdCh1bnNpZ25lZCwgemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2ssIDEpXTsKKwlwZ29mZl90IGluZGV4ID0gcGFnZS0+aW5kZXgsIGVuZF9pbmRleDsKIAotCS8qIFdlIGhhdmUgYWxyZWFkeSBiZWVuIGdpdmVuIG9uZSBwYWdlLCB0aGlzIGlzIHRoZSBvbmUKLQkgICB3ZSBtdXN0IGRvLiAqLwotCXhwYWdlID0gaW5kZXggJiB6aXNvZnNfYmxvY2tfcGFnZV9tYXNrOwotCXBhZ2VzW3hwYWdlXSA9IHBhZ2U7Ci0gCi0JLyogVGhlIHJlbWFpbmluZyBwYWdlcyBuZWVkIHRvIGJlIGFsbG9jYXRlZCBhbmQgaW5zZXJ0ZWQgKi8KLQlvZmZzZXQgPSBpbmRleCAmIH56aXNvZnNfYmxvY2tfcGFnZV9tYXNrOwotCWJsb2NraW5kZXggPSBvZmZzZXQgPj4gemlzb2ZzX2Jsb2NrX3BhZ2Vfc2hpZnQ7Ci0JbWF4cGFnZSA9IChpbm9kZS0+aV9zaXplICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQorCWVuZF9pbmRleCA9IChpbm9kZS0+aV9zaXplICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAkvKgogCSAqIElmIHRoaXMgcGFnZSBpcyB3aG9sbHkgb3V0c2lkZSBpX3NpemUgd2UganVzdCByZXR1cm4gemVybzsKIAkgKiBkb19nZW5lcmljX2ZpbGVfcmVhZCgpIHdpbGwgaGFuZGxlIHRoaXMgZm9yIHVzCiAJICovCi0JaWYgKHBhZ2UtPmluZGV4ID49IG1heHBhZ2UpIHsKKwlpZiAoaW5kZXggPj0gZW5kX2luZGV4KSB7CiAJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCXJldHVybiAwOwogCX0KIAotCW1heHBhZ2UgPSBtaW4oemlzb2ZzX2Jsb2NrX3BhZ2VzLCBtYXhwYWdlLW9mZnNldCk7Ci0KLQlmb3IgKCBpID0gMCA7IGkgPCBtYXhwYWdlIDsgaSsrLCBvZmZzZXQrKyApIHsKLQkJaWYgKCBpICE9IHhwYWdlICkgewotCQkJcGFnZXNbaV0gPSBncmFiX2NhY2hlX3BhZ2Vfbm93YWl0KG1hcHBpbmcsIG9mZnNldCk7Ci0JCX0KLQkJcGFnZSA9IHBhZ2VzW2ldOwotCQlpZiAoIHBhZ2UgKSB7Ci0JCQlDbGVhclBhZ2VFcnJvcihwYWdlKTsKLQkJCWttYXAocGFnZSk7Ci0JCX0KLQl9Ci0KLQkvKiBUaGlzIGlzIHRoZSBsYXN0IHBhZ2UgZmlsbGVkLCBwbHVzIG9uZTsgdXNlZCBpbiBjYXNlIG9mIGFib3J0LiAqLwotCWZwYWdlID0gMDsKLQotCS8qIEZpbmQgdGhlIHBvaW50ZXIgdG8gdGhpcyBzcGVjaWZpYyBjaHVuayAqLwotCS8qIE5vdGU6IHdlJ3JlIG5vdCB1c2luZyBpc29udW1fNzMxKCkgaGVyZSBiZWNhdXNlIHRoZSBkYXRhIGlzIGtub3duIGFsaWduZWQgKi8KLQkvKiBOb3RlOiBoZWFkZXJfc2l6ZSBpcyBpbiAzMi1iaXQgd29yZHMgKDQgYnl0ZXMpICovCi0JYmxvY2twdHIgPSAoaGVhZGVyX3NpemUgKyBibG9ja2luZGV4KSA8PCAyOwotCWJsb2NrZW5kcHRyID0gYmxvY2twdHIgKyA0OwotCi0JaW5kZXhibG9ja3MgPSAoKGJsb2NrcHRyXmJsb2NrZW5kcHRyKSA+PiBidWZzaGlmdCkgPyAyIDogMTsKLQlwdHJiaFswXSA9IHB0cmJoWzFdID0gTlVMTDsKLQotCWlmICggaXNvZnNfZ2V0X2Jsb2Nrcyhpbm9kZSwgYmxvY2twdHIgPj4gYnVmc2hpZnQsIHB0cmJoLCBpbmRleGJsb2NrcykgIT0gaW5kZXhibG9ja3MgKSB7Ci0JCWlmICggcHRyYmhbMF0gKSBicmVsc2UocHRyYmhbMF0pOwotCQlwcmludGsoS0VSTl9ERUJVRyAiemlzb2ZzOiBOdWxsIGJ1ZmZlciBvbiByZWFkaW5nIGJsb2NrIHRhYmxlLCBpbm9kZSA9ICVsdSwgYmxvY2sgPSAlbHVcbiIsCi0JCSAgICAgICBpbm9kZS0+aV9pbm8sIGJsb2NrcHRyID4+IGJ1ZnNoaWZ0KTsKLQkJZ290byBlaW87Ci0JfQotCWxsX3J3X2Jsb2NrKFJFQUQsIGluZGV4YmxvY2tzLCBwdHJiaCk7Ci0KLQliaCA9IHB0cmJoWzBdOwotCWlmICggIWJoIHx8ICh3YWl0X29uX2J1ZmZlcihiaCksICFidWZmZXJfdXB0b2RhdGUoYmgpKSApIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgInppc29mczogRmFpbGVkIHRvIHJlYWQgYmxvY2sgdGFibGUsIGlub2RlID0gJWx1LCBibG9jayA9ICVsdVxuIiwKLQkJICAgICAgIGlub2RlLT5pX2lubywgYmxvY2twdHIgPj4gYnVmc2hpZnQpOwotCQlpZiAoIHB0cmJoWzFdICkKLQkJCWJyZWxzZShwdHJiaFsxXSk7Ci0JCWdvdG8gZWlvOwotCX0KLQljc3RhcnQgPSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKShiaC0+Yl9kYXRhICsgKGJsb2NrcHRyICYgYnVmbWFzaykpKTsKLQotCWlmICggaW5kZXhibG9ja3MgPT0gMiApIHsKLQkJLyogV2UganVzdCBjcm9zc2VkIGEgYmxvY2sgYm91bmRhcnkuICBTd2l0Y2ggdG8gdGhlIG5leHQgYmxvY2sgKi8KLQkJYnJlbHNlKGJoKTsKLQkJYmggPSBwdHJiaFsxXTsKLQkJaWYgKCAhYmggfHwgKHdhaXRfb25fYnVmZmVyKGJoKSwgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpICkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgInppc29mczogRmFpbGVkIHRvIHJlYWQgYmxvY2sgdGFibGUsIGlub2RlID0gJWx1LCBibG9jayA9ICVsdVxuIiwKLQkJCSAgICAgICBpbm9kZS0+aV9pbm8sIGJsb2NrZW5kcHRyID4+IGJ1ZnNoaWZ0KTsKLQkJCWdvdG8gZWlvOwotCQl9Ci0JfQotCWNlbmQgPSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKShiaC0+Yl9kYXRhICsgKGJsb2NrZW5kcHRyICYgYnVmbWFzaykpKTsKLQlicmVsc2UoYmgpOwotCi0JaWYgKGNzdGFydCA+IGNlbmQpCi0JCWdvdG8gZWlvOwotCQkKLQljc2l6ZSA9IGNlbmQtY3N0YXJ0OwotCi0JaWYgKGNzaXplID4gZGVmbGF0ZUJvdW5kKDFVTCA8PCB6aXNvZnNfYmxvY2tfc2hpZnQpKQotCQlnb3RvIGVpbzsKLQotCS8qIE5vdyBwYWdlW10gY29udGFpbnMgYW4gYXJyYXkgb2YgcGFnZXMsIGFueSBvZiB3aGljaCBjYW4gYmUgTlVMTCwKLQkgICBhbmQgdGhlIGxvY2tzIG9uIHdoaWNoIHdlIGhvbGQuICBXZSBzaG91bGQgbm93IHJlYWQgdGhlIGRhdGEgYW5kCi0JICAgcmVsZWFzZSB0aGUgcGFnZXMuICBJZiB0aGUgcGFnZXMgYXJlIE5VTEwgdGhlIGRlY29tcHJlc3NlZCBkYXRhCi0JICAgZm9yIHRoYXQgcGFydGljdWxhciBwYWdlIHNob3VsZCBiZSBkaXNjYXJkZWQuICovCi0JCi0JaWYgKCBjc2l6ZSA9PSAwICkgewotCQkvKiBUaGlzIGRhdGEgYmxvY2sgaXMgZW1wdHkuICovCi0KLQkJZm9yICggZnBhZ2UgPSAwIDsgZnBhZ2UgPCBtYXhwYWdlIDsgZnBhZ2UrKyApIHsKLQkJCWlmICggKHBhZ2UgPSBwYWdlc1tmcGFnZV0pICE9IE5VTEwgKSB7Ci0JCQkJbWVtc2V0KHBhZ2VfYWRkcmVzcyhwYWdlKSwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKLQkJCQkKLQkJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKLQkJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7Ci0JCQkJa3VubWFwKHBhZ2UpOwotCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJCWlmICggZnBhZ2UgPT0geHBhZ2UgKQotCQkJCQllcnIgPSAwOyAvKiBUaGUgY3JpdGljYWwgcGFnZSAqLwotCQkJCWVsc2UKLQkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJfQotCQl9CisJaWYgKFBBR0VfQ0FDSEVfU0hJRlQgPD0gemlzb2ZzX2Jsb2NrX3NoaWZ0KSB7CisJCS8qIFdlIGhhdmUgYWxyZWFkeSBiZWVuIGdpdmVuIG9uZSBwYWdlLCB0aGlzIGlzIHRoZSBvbmUKKwkJICAgd2UgbXVzdCBkby4gKi8KKwkJZnVsbF9wYWdlID0gaW5kZXggJiAoemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKTsKKwkJcGNvdW50ID0gbWluX3QoaW50LCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywKKwkJCWVuZF9pbmRleCAtIChpbmRleCAmIH4oemlzb2ZzX3BhZ2VzX3Blcl9jYmxvY2sgLSAxKSkpOworCQlpbmRleCAtPSBmdWxsX3BhZ2U7CiAJfSBlbHNlIHsKLQkJLyogVGhpcyBkYXRhIGJsb2NrIGlzIGNvbXByZXNzZWQuICovCi0JCXpfc3RyZWFtIHN0cmVhbTsKLQkJaW50IGJhaWwgPSAwLCBsZWZ0X291dCA9IC0xOwotCQlpbnQgemVycjsKLQkJaW50IG5lZWRibG9ja3MgPSAoY3NpemUgKyAoY3N0YXJ0ICYgYnVmbWFzaykgKyBidWZtYXNrKSA+PiBidWZzaGlmdDsKLQkJaW50IGhhdmVibG9ja3M7Ci0JCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW25lZWRibG9ja3MrMV07Ci0JCXN0cnVjdCBidWZmZXJfaGVhZCAqKmJocHRyOworCQlmdWxsX3BhZ2UgPSAwOworCQlwY291bnQgPSAxOworCX0KKwlwYWdlc1tmdWxsX3BhZ2VdID0gcGFnZTsKIAotCQkvKiBCZWNhdXNlIHpsaWIgaXMgbm90IHRocmVhZC1zYWZlLCBkbyBhbGwgdGhlIEkvTyBhdCB0aGUgdG9wLiAqLwotCi0JCWJsb2NrcHRyID0gY3N0YXJ0ID4+IGJ1ZnNoaWZ0OwotCQltZW1zZXQoYmhzLCAwLCAobmVlZGJsb2NrcysxKSpzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopKTsKLQkJaGF2ZWJsb2NrcyA9IGlzb2ZzX2dldF9ibG9ja3MoaW5vZGUsIGJsb2NrcHRyLCBiaHMsIG5lZWRibG9ja3MpOwotCQlsbF9yd19ibG9jayhSRUFELCBoYXZlYmxvY2tzLCBiaHMpOwotCi0JCWJocHRyID0gJmJoc1swXTsKLQkJYmggPSAqYmhwdHIrKzsKLQotCQkvKiBGaXJzdCBibG9jayBpcyBzcGVjaWFsIHNpbmNlIGl0IG1heSBiZSBmcmFjdGlvbmFsLgotCQkgICBXZSBhbHNvIHdhaXQgZm9yIGl0IGJlZm9yZSBncmFiYmluZyB0aGUgemxpYgotCQkgICBtdXRleDsgb2RkcyBhcmUgdGhhdCB0aGUgc3Vic2VxdWVudCBibG9ja3MgYXJlCi0JCSAgIGdvaW5nIHRvIGNvbWUgaW4gaW4gc2hvcnQgb3JkZXIgc28gd2UgZG9uJ3QgaG9sZAotCQkgICB0aGUgemxpYiBtdXRleCBsb25nZXIgdGhhbiBuZWNlc3NhcnkuICovCi0KLQkJaWYgKCAhYmggfHwgKHdhaXRfb25fYnVmZmVyKGJoKSwgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpICkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgInppc29mczogSGl0IG51bGwgYnVmZmVyLCBmcGFnZSA9ICVkLCB4cGFnZSA9ICVkLCBjc2l6ZSA9ICVsZFxuIiwKLQkJCSAgICAgICBmcGFnZSwgeHBhZ2UsIGNzaXplKTsKLQkJCWdvdG8gYl9laW87Ci0JCX0KLQkJc3RyZWFtLm5leHRfaW4gID0gYmgtPmJfZGF0YSArIChjc3RhcnQgJiBidWZtYXNrKTsKLQkJc3RyZWFtLmF2YWlsX2luID0gbWluKGJ1ZnNpemUtKGNzdGFydCAmIGJ1Zm1hc2spLCBjc2l6ZSk7Ci0JCWNzaXplIC09IHN0cmVhbS5hdmFpbF9pbjsKLQotCQlzdHJlYW0ud29ya3NwYWNlID0gemlzb2ZzX3psaWJfd29ya3NwYWNlOwotCQltdXRleF9sb2NrKCZ6aXNvZnNfemxpYl9sb2NrKTsKLQkJCi0JCXplcnIgPSB6bGliX2luZmxhdGVJbml0KCZzdHJlYW0pOwotCQlpZiAoIHplcnIgIT0gWl9PSyApIHsKLQkJCWlmICggZXJyICYmIHplcnIgPT0gWl9NRU1fRVJST1IgKQotCQkJCWVyciA9IC1FTk9NRU07Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiemlzb2ZzOiB6aXNvZnNfaW5mbGF0ZUluaXQgcmV0dXJuZWQgJWRcbiIsCi0JCQkgICAgICAgemVycik7Ci0JCQlnb3RvIHpfZWlvOwotCQl9Ci0KLQkJd2hpbGUgKCAhYmFpbCAmJiBmcGFnZSA8IG1heHBhZ2UgKSB7Ci0JCQlwYWdlID0gcGFnZXNbZnBhZ2VdOwotCQkJaWYgKCBwYWdlICkKLQkJCQlzdHJlYW0ubmV4dF9vdXQgPSBwYWdlX2FkZHJlc3MocGFnZSk7Ci0JCQllbHNlCi0JCQkJc3RyZWFtLm5leHRfb3V0ID0gKHZvaWQgKikmemlzb2ZzX3NpbmtfcGFnZTsKLQkJCXN0cmVhbS5hdmFpbF9vdXQgPSBQQUdFX0NBQ0hFX1NJWkU7Ci0KLQkJCXdoaWxlICggc3RyZWFtLmF2YWlsX291dCApIHsKLQkJCQlpbnQgYW8sIGFpOwotCQkJCWlmICggc3RyZWFtLmF2YWlsX2luID09IDAgJiYgbGVmdF9vdXQgKSB7Ci0JCQkJCWlmICggIWNzaXplICkgewotCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiemlzb2ZzOiBaRiByZWFkIGJleW9uZCBlbmQgb2YgaW5wdXRcbiIpOwotCQkJCQkJYmFpbCA9IDE7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWJoID0gKmJocHRyKys7Ci0JCQkJCQlpZiAoICFiaCB8fAotCQkJCQkJICAgICAod2FpdF9vbl9idWZmZXIoYmgpLCAhYnVmZmVyX3VwdG9kYXRlKGJoKSkgKSB7Ci0JCQkJCQkJLyogUmVhY2hlZCBhbiBFSU8gKi8KLSAJCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgInppc29mczogSGl0IG51bGwgYnVmZmVyLCBmcGFnZSA9ICVkLCB4cGFnZSA9ICVkLCBjc2l6ZSA9ICVsZFxuIiwKLQkJCQkJCQkgICAgICAgZnBhZ2UsIHhwYWdlLCBjc2l6ZSk7Ci0JCQkJCQkJICAgICAgIAotCQkJCQkJCWJhaWwgPSAxOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJc3RyZWFtLm5leHRfaW4gPSBiaC0+Yl9kYXRhOwotCQkJCQkJc3RyZWFtLmF2YWlsX2luID0gbWluKGNzaXplLGJ1ZnNpemUpOwotCQkJCQkJY3NpemUgLT0gc3RyZWFtLmF2YWlsX2luOwotCQkJCQl9Ci0JCQkJfQotCQkJCWFvID0gc3RyZWFtLmF2YWlsX291dDsgIGFpID0gc3RyZWFtLmF2YWlsX2luOwotCQkJCXplcnIgPSB6bGliX2luZmxhdGUoJnN0cmVhbSwgWl9TWU5DX0ZMVVNIKTsKLQkJCQlsZWZ0X291dCA9IHN0cmVhbS5hdmFpbF9vdXQ7Ci0JCQkJaWYgKCB6ZXJyID09IFpfQlVGX0VSUk9SICYmIHN0cmVhbS5hdmFpbF9pbiA9PSAwICkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKCB6ZXJyICE9IFpfT0sgKSB7Ci0JCQkJCS8qIEVPRiwgZXJyb3IsIG9yIHRyeWluZyB0byByZWFkIGJleW9uZCBlbmQgb2YgaW5wdXQgKi8KLQkJCQkJaWYgKCBlcnIgJiYgemVyciA9PSBaX01FTV9FUlJPUiApCi0JCQkJCQllcnIgPSAtRU5PTUVNOwotCQkJCQlpZiAoIHplcnIgIT0gWl9TVFJFQU1fRU5EICkKLQkJCQkJCXByaW50ayhLRVJOX0RFQlVHICJ6aXNvZnM6IHppc29mc19pbmZsYXRlIHJldHVybmVkICVkLCBpbm9kZSA9ICVsdSwgaW5kZXggPSAlbHUsIGZwYWdlID0gJWQsIHhwYWdlID0gJWQsIGF2YWlsX2luID0gJWQsIGF2YWlsX291dCA9ICVkLCBhaSA9ICVkLCBhbyA9ICVkXG4iLAotCQkJCQkJICAgICAgIHplcnIsIGlub2RlLT5pX2lubywgaW5kZXgsCi0JCQkJCQkgICAgICAgZnBhZ2UsIHhwYWdlLAotCQkJCQkJICAgICAgIHN0cmVhbS5hdmFpbF9pbiwgc3RyZWFtLmF2YWlsX291dCwKLQkJCQkJCSAgICAgICBhaSwgYW8pOwotCQkJCQliYWlsID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIHN0cmVhbS5hdmFpbF9vdXQgJiYgemVyciA9PSBaX1NUUkVBTV9FTkQgKSB7Ci0JCQkJLyogRnJhY3Rpb25hbCBwYWdlIHdyaXR0ZW4gYmVmb3JlIEVPRi4gIFRoaXMgbWF5Ci0JCQkJICAgYmUgdGhlIGxhc3QgcGFnZSBpbiB0aGUgZmlsZS4gKi8KLQkJCQltZW1zZXQoc3RyZWFtLm5leHRfb3V0LCAwLCBzdHJlYW0uYXZhaWxfb3V0KTsKLQkJCQlzdHJlYW0uYXZhaWxfb3V0ID0gMDsKLQkJCX0KLQotCQkJaWYgKCAhc3RyZWFtLmF2YWlsX291dCApIHsKLQkJCQkvKiBUaGlzIHBhZ2UgY29tcGxldGVkICovCi0JCQkJaWYgKCBwYWdlICkgewotCQkJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKLQkJCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwotCQkJCQlrdW5tYXAocGFnZSk7Ci0JCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJCQlpZiAoIGZwYWdlID09IHhwYWdlICkKLQkJCQkJCWVyciA9IDA7IC8qIFRoZSBjcml0aWNhbCBwYWdlICovCi0JCQkJCWVsc2UKLQkJCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJCQl9Ci0JCQkJZnBhZ2UrKzsKLQkJCX0KLQkJfQotCQl6bGliX2luZmxhdGVFbmQoJnN0cmVhbSk7Ci0KLQl6X2VpbzoKLQkJbXV0ZXhfdW5sb2NrKCZ6aXNvZnNfemxpYl9sb2NrKTsKLQotCWJfZWlvOgotCQlmb3IgKCBpID0gMCA7IGkgPCBoYXZlYmxvY2tzIDsgaSsrICkgewotCQkJaWYgKCBiaHNbaV0gKQotCQkJCWJyZWxzZShiaHNbaV0pOworCWZvciAoaSA9IDA7IGkgPCBwY291bnQ7IGkrKywgaW5kZXgrKykgeworCQlpZiAoaSAhPSBmdWxsX3BhZ2UpCisJCQlwYWdlc1tpXSA9IGdyYWJfY2FjaGVfcGFnZV9ub3dhaXQobWFwcGluZywgaW5kZXgpOworCQlpZiAocGFnZXNbaV0pIHsKKwkJCUNsZWFyUGFnZUVycm9yKHBhZ2VzW2ldKTsKKwkJCWttYXAocGFnZXNbaV0pOwogCQl9CiAJfQogCi1laW86CisJZXJyID0gemlzb2ZzX2ZpbGxfcGFnZXMoaW5vZGUsIGZ1bGxfcGFnZSwgcGNvdW50LCBwYWdlcyk7CiAKIAkvKiBSZWxlYXNlIGFueSByZXNpZHVhbCBwYWdlcywgZG8gbm90IFNldFBhZ2VVcHRvZGF0ZSAqLwotCXdoaWxlICggZnBhZ2UgPCBtYXhwYWdlICkgewotCQlwYWdlID0gcGFnZXNbZnBhZ2VdOwotCQlpZiAoIHBhZ2UgKSB7Ci0JCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKLQkJCWlmICggZnBhZ2UgPT0geHBhZ2UgKQotCQkJCVNldFBhZ2VFcnJvcihwYWdlKTsKLQkJCWt1bm1hcChwYWdlKTsKLQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJaWYgKCBmcGFnZSAhPSB4cGFnZSApCi0JCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCWZvciAoaSA9IDA7IGkgPCBwY291bnQ7IGkrKykgeworCQlpZiAocGFnZXNbaV0pIHsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2VzW2ldKTsKKwkJCWlmIChpID09IGZ1bGxfcGFnZSAmJiBlcnIpCisJCQkJU2V0UGFnZUVycm9yKHBhZ2VzW2ldKTsKKwkJCWt1bm1hcChwYWdlc1tpXSk7CisJCQl1bmxvY2tfcGFnZShwYWdlc1tpXSk7CisJCQlpZiAoaSAhPSBmdWxsX3BhZ2UpCisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2VzW2ldKTsKIAkJfQotCQlmcGFnZSsrOwogCX0JCQkKIAogCS8qIEF0IHRoaXMgcG9pbnQsIGVyciBjb250YWlucyAwIG9yIC1FSU8gZGVwZW5kaW5nIG9uIHRoZSAiY3JpdGljYWwiIHBhZ2UgKi8KZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL3JvY2suYyBiL2ZzL2lzb2ZzL3JvY2suYwppbmRleCBjMmZiMmRkLi45NmE2ODVjIDEwMDY0NAotLS0gYS9mcy9pc29mcy9yb2NrLmMKKysrIGIvZnMvaXNvZnMvcm9jay5jCkBAIC01MTgsOCArNTE4LDcgQEAKIAkJCWlmIChhbGdvID09IFNJRygncCcsICd6JykpIHsKIAkJCQlpbnQgYmxvY2tfc2hpZnQgPQogCQkJCQlpc29udW1fNzExKCZyci0+dS5aRi5wYXJtc1sxXSk7Ci0JCQkJaWYgKGJsb2NrX3NoaWZ0IDwgUEFHRV9DQUNIRV9TSElGVAotCQkJCQkJfHwgYmxvY2tfc2hpZnQgPiAxNykgeworCQkJCWlmIChibG9ja19zaGlmdCA+IDE3KSB7CiAJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImlzb2ZzOiAiCiAJCQkJCQkiQ2FuJ3QgaGFuZGxlIFpGIGJsb2NrICIKIAkJCQkJCSJzaXplIG9mIDJeJWRcbiIsCmRpZmYgLS1naXQgYS9mcy9qYmQyL2NvbW1pdC5jIGIvZnMvamJkMi9jb21taXQuYwppbmRleCA4ODk2YzFkLi42YTEwMjM4IDEwMDY0NAotLS0gYS9mcy9qYmQyL2NvbW1pdC5jCisrKyBiL2ZzL2piZDIvY29tbWl0LmMKQEAgLTI4Niw3ICsyODYsNyBAQAogCQlpZiAoZXJyKSB7CiAJCQkvKgogCQkJICogQmVjYXVzZSBBU19FSU8gaXMgY2xlYXJlZCBieQotCQkJICogd2FpdF9vbl9wYWdlX3dyaXRlYmFja19yYW5nZSgpLCBzZXQgaXQgYWdhaW4gc28KKwkJCSAqIGZpbGVtYXBfZmRhdGF3YWl0X3JhbmdlKCksIHNldCBpdCBhZ2FpbiBzbwogCQkJICogdGhhdCB1c2VyIHByb2Nlc3MgY2FuIGdldCAtRUlPIGZyb20gZnN5bmMoKS4KIAkJCSAqLwogCQkJc2V0X2JpdChBU19FSU8sCmRpZmYgLS1naXQgYS9mcy9uYW1laS5jIGIvZnMvbmFtZWkuYwppbmRleCBkMTFmNDA0Li44N2Y5N2JhIDEwMDY0NAotLS0gYS9mcy9uYW1laS5jCisrKyBiL2ZzL25hbWVpLmMKQEAgLTEyNzksMjggKzEyNzksNiBAQAogCXJldHVybiBfX2xvb2t1cF9oYXNoKCZ0aGlzLCBiYXNlLCBOVUxMKTsKIH0KIAotLyoqCi0gKiBsb29rdXBfb25lX25vcGVybSAtIGJhZCBoYWNrIGZvciBzeXNmcwotICogQG5hbWU6CXBhdGhuYW1lIGNvbXBvbmVudCB0byBsb29rdXAKLSAqIEBiYXNlOgliYXNlIGRpcmVjdG9yeSB0byBsb29rdXAgZnJvbQotICoKLSAqIFRoaXMgaXMgYSB2YXJpYW50IG9mIGxvb2t1cF9vbmVfbGVuIHRoYXQgZG9lc24ndCBwZXJmb3JtIGFueSBwZXJtaXNzaW9uCi0gKiBjaGVja3MuICAgSXQncyBhIGhvcnJpYmxlIGhhY2sgdG8gd29yayBhcm91bmQgdGhlIGJyYWluZGVhZCBzeXNmcwotICogYXJjaGl0ZWN0dXJlIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYW55d2hlcmUgZWxzZS4KLSAqCi0gKiBET04nVCBVU0UgVEhJUyBGVU5DVElPTiBFVkVSLCB0aGFua3MuCi0gKi8KLXN0cnVjdCBkZW50cnkgKmxvb2t1cF9vbmVfbm9wZXJtKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKmJhc2UpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgcXN0ciB0aGlzOwotCi0JZXJyID0gX19sb29rdXBfb25lX2xlbihuYW1lLCAmdGhpcywgYmFzZSwgc3RybGVuKG5hbWUpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gRVJSX1BUUihlcnIpOwotCXJldHVybiBfX2xvb2t1cF9oYXNoKCZ0aGlzLCBiYXNlLCBOVUxMKTsKLX0KLQogaW50IHVzZXJfcGF0aF9hdChpbnQgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqbmFtZSwgdW5zaWduZWQgZmxhZ3MsCiAJCSBzdHJ1Y3QgcGF0aCAqcGF0aCkKIHsKQEAgLTE2NzgsNiArMTY1NiwxNSBAQAogCWludCB3aWxsX3dyaXRlOwogCWludCBmbGFnID0gb3Blbl90b19uYW1laV9mbGFncyhvcGVuX2ZsYWcpOwogCisJLyoKKwkgKiBPX1NZTkMgaXMgaW1wbGVtZW50ZWQgYXMgX19PX1NZTkN8T19EU1lOQy4gIEFzIG1hbnkgcGxhY2VzIG9ubHkKKwkgKiBjaGVjayBmb3IgT19EU1lOQyBpZiB0aGUgbmVlZCBhbnkgc3luY2luZyBhdCBhbGwgd2UgZW5mb3JjZSBpdCdzCisJICogYWx3YXlzIHNldCBpbnN0ZWFkIG9mIGhhdmluZyB0byBkZWFsIHdpdGggcG9zc2libHkgd2VpcmQgYmVoYXZpb3VyCisJICogZm9yIG1hbGljaW91cyBhcHBsaWNhdGlvbnMgc2V0dGluZyBvbmx5IF9fT19TWU5DLgorCSAqLworCWlmIChvcGVuX2ZsYWcgJiBfX09fU1lOQykKKwkJb3Blbl9mbGFnIHw9IE9fRFNZTkM7CisKIAlpZiAoIWFjY19tb2RlKQogCQlhY2NfbW9kZSA9IE1BWV9PUEVOIHwgQUNDX01PREUoZmxhZyk7CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9maWxlLmMgYi9mcy9uZnMvZmlsZS5jCmluZGV4IGY1ZmRkMzkuLjZiODkxMzIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9maWxlLmMKKysrIGIvZnMvbmZzL2ZpbGUuYwpAQCAtNTgxLDcgKzU4MSw3IEBACiB7CiAJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eDsKIAotCWlmIChJU19TWU5DKGlub2RlKSB8fCAoZmlscC0+Zl9mbGFncyAmIE9fU1lOQykpCisJaWYgKElTX1NZTkMoaW5vZGUpIHx8IChmaWxwLT5mX2ZsYWdzICYgT19EU1lOQykpCiAJCXJldHVybiAxOwogCWN0eCA9IG5mc19maWxlX29wZW5fY29udGV4dChmaWxwKTsKIAlpZiAodGVzdF9iaXQoTkZTX0NPTlRFWFRfRVJST1JfV1JJVEUsICZjdHgtPmZsYWdzKSkKQEAgLTYyMiw3ICs2MjIsNyBAQAogCiAJbmZzX2FkZF9zdGF0cyhpbm9kZSwgTkZTSU9TX05PUk1BTFdSSVRURU5CWVRFUywgY291bnQpOwogCXJlc3VsdCA9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MpOwotCS8qIFJldHVybiBlcnJvciB2YWx1ZXMgZm9yIE9fU1lOQyBhbmQgSVNfU1lOQygpICovCisJLyogUmV0dXJuIGVycm9yIHZhbHVlcyBmb3IgT19EU1lOQyBhbmQgSVNfU1lOQygpICovCiAJaWYgKHJlc3VsdCA+PSAwICYmIG5mc19uZWVkX3N5bmNfd3JpdGUoaW9jYi0+a2lfZmlscCwgaW5vZGUpKSB7CiAJCWludCBlcnIgPSBuZnNfZG9fZnN5bmMobmZzX2ZpbGVfb3Blbl9jb250ZXh0KGlvY2ItPmtpX2ZpbHApLCBpbm9kZSk7CiAJCWlmIChlcnIgPCAwKQpkaWZmIC0tZ2l0IGEvZnMvbmZzL3dyaXRlLmMgYi9mcy9uZnMvd3JpdGUuYwppbmRleCBjODRiNWNjLi5iMWNlMmVhIDEwMDY0NAotLS0gYS9mcy9uZnMvd3JpdGUuYworKysgYi9mcy9uZnMvd3JpdGUuYwpAQCAtNzc0LDcgKzc3NCw3IEBACiAJICovCiAJaWYgKG5mc193cml0ZV9wYWdldXB0b2RhdGUocGFnZSwgaW5vZGUpICYmCiAJCQlpbm9kZS0+aV9mbG9jayA9PSBOVUxMICYmCi0JCQkhKGZpbGUtPmZfZmxhZ3MgJiBPX1NZTkMpKSB7CisJCQkhKGZpbGUtPmZfZmxhZ3MgJiBPX0RTWU5DKSkgewogCQljb3VudCA9IG1heChjb3VudCArIG9mZnNldCwgbmZzX3BhZ2VfbGVuZ3RoKHBhZ2UpKTsKIAkJb2Zmc2V0ID0gMDsKIAl9CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvYWxsb2MuYyBiL2ZzL25pbGZzMi9hbGxvYy5jCmluZGV4IGQ2OWU2YWUuLjNmOTU5ZjEgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9hbGxvYy5jCisrKyBiL2ZzL25pbGZzMi9hbGxvYy5jCkBAIC0xNDIsMjkgKzE0Miw3NSBAQAogCX0KIH0KIAorc3RhdGljIGludCBuaWxmc19wYWxsb2NfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgYmxrb2ZmLAorCQkJCSAgaW50IGNyZWF0ZSwKKwkJCQkgIHZvaWQgKCppbml0X2Jsb2NrKShzdHJ1Y3QgaW5vZGUgKiwKKwkJCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICosCisJCQkJCQkgICAgIHZvaWQgKiksCisJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHAsCisJCQkJICBzdHJ1Y3QgbmlsZnNfYmhfYXNzb2MgKnByZXYsCisJCQkJICBzcGlubG9ja190ICpsb2NrKQoreworCWludCByZXQ7CisKKwlzcGluX2xvY2sobG9jayk7CisJaWYgKHByZXYtPmJoICYmIGJsa29mZiA9PSBwcmV2LT5ibGtvZmYpIHsKKwkJZ2V0X2JoKHByZXYtPmJoKTsKKwkJKmJocCA9IHByZXYtPmJoOworCQlzcGluX3VubG9jayhsb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCXNwaW5fdW5sb2NrKGxvY2spOworCisJcmV0ID0gbmlsZnNfbWR0X2dldF9ibG9jayhpbm9kZSwgYmxrb2ZmLCBjcmVhdGUsIGluaXRfYmxvY2ssIGJocCk7CisJaWYgKCFyZXQpIHsKKwkJc3Bpbl9sb2NrKGxvY2spOworCQkvKgorCQkgKiBUaGUgZm9sbG93aW5nIGNvZGUgbXVzdCBiZSBzYWZlIGZvciBjaGFuZ2Ugb2YgdGhlCisJCSAqIGNhY2hlIGNvbnRlbnRzIGR1cmluZyB0aGUgZ2V0IGJsb2NrIGNhbGwuCisJCSAqLworCQlicmVsc2UocHJldi0+YmgpOworCQlnZXRfYmgoKmJocCk7CisJCXByZXYtPmJoID0gKmJocDsKKwkJcHJldi0+Ymxrb2ZmID0gYmxrb2ZmOworCQlzcGluX3VubG9jayhsb2NrKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBuaWxmc19wYWxsb2NfZ2V0X2Rlc2NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBncm91cCwKIAkJCQkgICAgICAgaW50IGNyZWF0ZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhwKQogewotCXJldHVybiBuaWxmc19tZHRfZ2V0X2Jsb2NrKGlub2RlLAotCQkJCSAgIG5pbGZzX3BhbGxvY19kZXNjX2Jsa29mZihpbm9kZSwgZ3JvdXApLAotCQkJCSAgIGNyZWF0ZSwgbmlsZnNfcGFsbG9jX2Rlc2NfYmxvY2tfaW5pdCwgYmhwKTsKKwlzdHJ1Y3QgbmlsZnNfcGFsbG9jX2NhY2hlICpjYWNoZSA9IE5JTEZTX01EVChpbm9kZSktPm1pX3BhbGxvY19jYWNoZTsKKworCXJldHVybiBuaWxmc19wYWxsb2NfZ2V0X2Jsb2NrKGlub2RlLAorCQkJCSAgICAgIG5pbGZzX3BhbGxvY19kZXNjX2Jsa29mZihpbm9kZSwgZ3JvdXApLAorCQkJCSAgICAgIGNyZWF0ZSwgbmlsZnNfcGFsbG9jX2Rlc2NfYmxvY2tfaW5pdCwKKwkJCQkgICAgICBiaHAsICZjYWNoZS0+cHJldl9kZXNjLCAmY2FjaGUtPmxvY2spOwogfQogCiBzdGF0aWMgaW50IG5pbGZzX3BhbGxvY19nZXRfYml0bWFwX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCSB1bnNpZ25lZCBsb25nIGdyb3VwLAogCQkJCQkgaW50IGNyZWF0ZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhwKQogewotCXJldHVybiBuaWxmc19tZHRfZ2V0X2Jsb2NrKGlub2RlLAotCQkJCSAgIG5pbGZzX3BhbGxvY19iaXRtYXBfYmxrb2ZmKGlub2RlLCBncm91cCksCi0JCQkJICAgY3JlYXRlLCBOVUxMLCBiaHApOworCXN0cnVjdCBuaWxmc19wYWxsb2NfY2FjaGUgKmNhY2hlID0gTklMRlNfTURUKGlub2RlKS0+bWlfcGFsbG9jX2NhY2hlOworCisJcmV0dXJuIG5pbGZzX3BhbGxvY19nZXRfYmxvY2soaW5vZGUsCisJCQkJICAgICAgbmlsZnNfcGFsbG9jX2JpdG1hcF9ibGtvZmYoaW5vZGUsIGdyb3VwKSwKKwkJCQkgICAgICBjcmVhdGUsIE5VTEwsIGJocCwKKwkJCQkgICAgICAmY2FjaGUtPnByZXZfYml0bWFwLCAmY2FjaGUtPmxvY2spOwogfQogCiBpbnQgbmlsZnNfcGFsbG9jX2dldF9lbnRyeV9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX3U2NCBuciwKIAkJCQkgaW50IGNyZWF0ZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhwKQogewotCXJldHVybiBuaWxmc19tZHRfZ2V0X2Jsb2NrKGlub2RlLCBuaWxmc19wYWxsb2NfZW50cnlfYmxrb2ZmKGlub2RlLCBuciksCi0JCQkJICAgY3JlYXRlLCBOVUxMLCBiaHApOworCXN0cnVjdCBuaWxmc19wYWxsb2NfY2FjaGUgKmNhY2hlID0gTklMRlNfTURUKGlub2RlKS0+bWlfcGFsbG9jX2NhY2hlOworCisJcmV0dXJuIG5pbGZzX3BhbGxvY19nZXRfYmxvY2soaW5vZGUsCisJCQkJICAgICAgbmlsZnNfcGFsbG9jX2VudHJ5X2Jsa29mZihpbm9kZSwgbnIpLAorCQkJCSAgICAgIGNyZWF0ZSwgTlVMTCwgYmhwLAorCQkJCSAgICAgICZjYWNoZS0+cHJldl9lbnRyeSwgJmNhY2hlLT5sb2NrKTsKIH0KIAogc3RhdGljIHN0cnVjdCBuaWxmc19wYWxsb2NfZ3JvdXBfZGVzYyAqCkBAIC0xNzYsMTMgKzIyMiw2IEBACiAJCWdyb3VwICUgbmlsZnNfcGFsbG9jX2dyb3Vwc19wZXJfZGVzY19ibG9jayhpbm9kZSk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLW5pbGZzX3BhbGxvY19ibG9ja19nZXRfYml0bWFwKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB2b2lkICprYWRkcikKLXsKLQlyZXR1cm4gKHVuc2lnbmVkIGNoYXIgKikoa2FkZHIgKyBiaF9vZmZzZXQoYmgpKTsKLX0KLQogdm9pZCAqbmlsZnNfcGFsbG9jX2Jsb2NrX2dldF9lbnRyeShjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX3U2NCBuciwKIAkJCQkgICBjb25zdCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB2b2lkICprYWRkcikKIHsKQEAgLTI4OSw4ICszMjgsNyBAQAogCQkJCWlmIChyZXQgPCAwKQogCQkJCQlnb3RvIG91dF9kZXNjOwogCQkJCWJpdG1hcF9rYWRkciA9IGttYXAoYml0bWFwX2JoLT5iX3BhZ2UpOwotCQkJCWJpdG1hcCA9IG5pbGZzX3BhbGxvY19ibG9ja19nZXRfYml0bWFwKAotCQkJCQlpbm9kZSwgYml0bWFwX2JoLCBiaXRtYXBfa2FkZHIpOworCQkJCWJpdG1hcCA9IGJpdG1hcF9rYWRkciArIGJoX29mZnNldChiaXRtYXBfYmgpOwogCQkJCXBvcyA9IG5pbGZzX3BhbGxvY19maW5kX2F2YWlsYWJsZV9zbG90KAogCQkJCQlpbm9kZSwgZ3JvdXAsIGdyb3VwX29mZnNldCwgYml0bWFwLAogCQkJCQllbnRyaWVzX3Blcl9ncm91cCk7CkBAIC0zNTEsOCArMzg5LDcgQEAKIAlkZXNjID0gbmlsZnNfcGFsbG9jX2Jsb2NrX2dldF9ncm91cF9kZXNjKGlub2RlLCBncm91cCwKIAkJCQkJCSByZXEtPnByX2Rlc2NfYmgsIGRlc2Nfa2FkZHIpOwogCWJpdG1hcF9rYWRkciA9IGttYXAocmVxLT5wcl9iaXRtYXBfYmgtPmJfcGFnZSk7Ci0JYml0bWFwID0gbmlsZnNfcGFsbG9jX2Jsb2NrX2dldF9iaXRtYXAoaW5vZGUsIHJlcS0+cHJfYml0bWFwX2JoLAotCQkJCQkgICAgICAgYml0bWFwX2thZGRyKTsKKwliaXRtYXAgPSBiaXRtYXBfa2FkZHIgKyBiaF9vZmZzZXQocmVxLT5wcl9iaXRtYXBfYmgpOwogCiAJaWYgKCFuaWxmc19jbGVhcl9iaXRfYXRvbWljKG5pbGZzX21kdF9iZ2xfbG9jayhpbm9kZSwgZ3JvdXApLAogCQkJCSAgICBncm91cF9vZmZzZXQsIGJpdG1hcCkpCkBAIC0zODUsOCArNDIyLDcgQEAKIAlkZXNjID0gbmlsZnNfcGFsbG9jX2Jsb2NrX2dldF9ncm91cF9kZXNjKGlub2RlLCBncm91cCwKIAkJCQkJCSByZXEtPnByX2Rlc2NfYmgsIGRlc2Nfa2FkZHIpOwogCWJpdG1hcF9rYWRkciA9IGttYXAocmVxLT5wcl9iaXRtYXBfYmgtPmJfcGFnZSk7Ci0JYml0bWFwID0gbmlsZnNfcGFsbG9jX2Jsb2NrX2dldF9iaXRtYXAoaW5vZGUsIHJlcS0+cHJfYml0bWFwX2JoLAotCQkJCQkgICAgICAgYml0bWFwX2thZGRyKTsKKwliaXRtYXAgPSBiaXRtYXBfa2FkZHIgKyBiaF9vZmZzZXQocmVxLT5wcl9iaXRtYXBfYmgpOwogCWlmICghbmlsZnNfY2xlYXJfYml0X2F0b21pYyhuaWxmc19tZHRfYmdsX2xvY2soaW5vZGUsIGdyb3VwKSwKIAkJCQkgICAgZ3JvdXBfb2Zmc2V0LCBiaXRtYXApKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZW50cnkgbnVtZXIgJWxsdSBhbHJlYWR5IGZyZWVkXG4iLApAQCAtNDcyLDggKzUwOCw3IEBACiAJCWRlc2MgPSBuaWxmc19wYWxsb2NfYmxvY2tfZ2V0X2dyb3VwX2Rlc2MoCiAJCQlpbm9kZSwgZ3JvdXAsIGRlc2NfYmgsIGRlc2Nfa2FkZHIpOwogCQliaXRtYXBfa2FkZHIgPSBrbWFwKGJpdG1hcF9iaC0+Yl9wYWdlKTsKLQkJYml0bWFwID0gbmlsZnNfcGFsbG9jX2Jsb2NrX2dldF9iaXRtYXAoCi0JCQlpbm9kZSwgYml0bWFwX2JoLCBiaXRtYXBfa2FkZHIpOworCQliaXRtYXAgPSBiaXRtYXBfa2FkZHIgKyBiaF9vZmZzZXQoYml0bWFwX2JoKTsKIAkJZm9yIChqID0gaSwgbiA9IDA7CiAJCSAgICAgKGogPCBuaXRlbXMpICYmIG5pbGZzX3BhbGxvY19ncm91cF9pc19pbihpbm9kZSwgZ3JvdXAsCiAJCQkJCQkJICAgICAgZW50cnlfbnJzW2pdKTsKQEAgLTUwMiwzICs1MzcsMzAgQEAKIAl9CiAJcmV0dXJuIDA7CiB9CisKK3ZvaWQgbmlsZnNfcGFsbG9jX3NldHVwX2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICBzdHJ1Y3QgbmlsZnNfcGFsbG9jX2NhY2hlICpjYWNoZSkKK3sKKwlOSUxGU19NRFQoaW5vZGUpLT5taV9wYWxsb2NfY2FjaGUgPSBjYWNoZTsKKwlzcGluX2xvY2tfaW5pdCgmY2FjaGUtPmxvY2spOworfQorCit2b2lkIG5pbGZzX3BhbGxvY19jbGVhcl9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBuaWxmc19wYWxsb2NfY2FjaGUgKmNhY2hlID0gTklMRlNfTURUKGlub2RlKS0+bWlfcGFsbG9jX2NhY2hlOworCisJc3Bpbl9sb2NrKCZjYWNoZS0+bG9jayk7CisJYnJlbHNlKGNhY2hlLT5wcmV2X2Rlc2MuYmgpOworCWJyZWxzZShjYWNoZS0+cHJldl9iaXRtYXAuYmgpOworCWJyZWxzZShjYWNoZS0+cHJldl9lbnRyeS5iaCk7CisJY2FjaGUtPnByZXZfZGVzYy5iaCA9IE5VTEw7CisJY2FjaGUtPnByZXZfYml0bWFwLmJoID0gTlVMTDsKKwljYWNoZS0+cHJldl9lbnRyeS5iaCA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmNhY2hlLT5sb2NrKTsKK30KKwordm9pZCBuaWxmc19wYWxsb2NfZGVzdHJveV9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCW5pbGZzX3BhbGxvY19jbGVhcl9jYWNoZShpbm9kZSk7CisJTklMRlNfTURUKGlub2RlKS0+bWlfcGFsbG9jX2NhY2hlID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9hbGxvYy5oIGIvZnMvbmlsZnMyL2FsbG9jLmgKaW5kZXggNGFjZTU0Ny4uZjQ1NDNhYyAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2FsbG9jLmgKKysrIGIvZnMvbmlsZnMyL2FsbG9jLmgKQEAgLTY5LDQgKzY5LDI1IEBACiAjZGVmaW5lIG5pbGZzX2NsZWFyX2JpdF9hdG9taWMJCWV4dDJfY2xlYXJfYml0X2F0b21pYwogI2RlZmluZSBuaWxmc19maW5kX25leHRfemVyb19iaXQJZXh0Ml9maW5kX25leHRfemVyb19iaXQKIAorLyoKKyAqIHBlcnNpc3RlbnQgb2JqZWN0IGFsbG9jYXRvciBjYWNoZQorICovCisKK3N0cnVjdCBuaWxmc19iaF9hc3NvYyB7CisJdW5zaWduZWQgbG9uZyBibGtvZmY7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKK307CisKK3N0cnVjdCBuaWxmc19wYWxsb2NfY2FjaGUgeworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbmlsZnNfYmhfYXNzb2MgcHJldl9kZXNjOworCXN0cnVjdCBuaWxmc19iaF9hc3NvYyBwcmV2X2JpdG1hcDsKKwlzdHJ1Y3QgbmlsZnNfYmhfYXNzb2MgcHJldl9lbnRyeTsKK307CisKK3ZvaWQgbmlsZnNfcGFsbG9jX3NldHVwX2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICBzdHJ1Y3QgbmlsZnNfcGFsbG9jX2NhY2hlICpjYWNoZSk7Cit2b2lkIG5pbGZzX3BhbGxvY19jbGVhcl9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK3ZvaWQgbmlsZnNfcGFsbG9jX2Rlc3Ryb3lfY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSk7CisKICNlbmRpZgkvKiBfTklMRlNfQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2JtYXAuYyBiL2ZzL25pbGZzMi9ibWFwLmMKaW5kZXggMDg4MzRkZi4uZjRhMTRlYSAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2JtYXAuYworKysgYi9mcy9uaWxmczIvYm1hcC5jCkBAIC00MDIsMTkgKzQwMiwxMSBAQAogdm9pZCBuaWxmc19ibWFwX2FkZF9ibG9ja3MoY29uc3Qgc3RydWN0IG5pbGZzX2JtYXAgKmJtYXAsIGludCBuKQogewogCWlub2RlX2FkZF9ieXRlcyhibWFwLT5iX2lub2RlLCAoMSA8PCBibWFwLT5iX2lub2RlLT5pX2Jsa2JpdHMpICogbik7Ci0JaWYgKE5JTEZTX01EVChibWFwLT5iX2lub2RlKSkKLQkJbmlsZnNfbWR0X21hcmtfZGlydHkoYm1hcC0+Yl9pbm9kZSk7Ci0JZWxzZQotCQltYXJrX2lub2RlX2RpcnR5KGJtYXAtPmJfaW5vZGUpOwogfQogCiB2b2lkIG5pbGZzX2JtYXBfc3ViX2Jsb2Nrcyhjb25zdCBzdHJ1Y3QgbmlsZnNfYm1hcCAqYm1hcCwgaW50IG4pCiB7CiAJaW5vZGVfc3ViX2J5dGVzKGJtYXAtPmJfaW5vZGUsICgxIDw8IGJtYXAtPmJfaW5vZGUtPmlfYmxrYml0cykgKiBuKTsKLQlpZiAoTklMRlNfTURUKGJtYXAtPmJfaW5vZGUpKQotCQluaWxmc19tZHRfbWFya19kaXJ0eShibWFwLT5iX2lub2RlKTsKLQllbHNlCi0JCW1hcmtfaW5vZGVfZGlydHkoYm1hcC0+Yl9pbm9kZSk7CiB9CiAKIF9fdTY0IG5pbGZzX2JtYXBfZGF0YV9nZXRfa2V5KGNvbnN0IHN0cnVjdCBuaWxmc19ibWFwICpibWFwLApkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2J0bm9kZS5jIGIvZnMvbmlsZnMyL2J0bm9kZS5jCmluZGV4IDg0YzI1MzguLjQ3MWUyNjkgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9idG5vZGUuYworKysgYi9mcy9uaWxmczIvYnRub2RlLmMKQEAgLTY4LDkgKzY4LDM0IEBACiAJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoYnRuYywgMCk7CiB9CiAKK3N0cnVjdCBidWZmZXJfaGVhZCAqCituaWxmc19idG5vZGVfY3JlYXRlX2Jsb2NrKHN0cnVjdCBhZGRyZXNzX3NwYWNlICpidG5jLCBfX3U2NCBibG9ja25yKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOSUxGU19CVE5DX0koYnRuYyk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCWJoID0gbmlsZnNfZ3JhYl9idWZmZXIoaW5vZGUsIGJ0bmMsIGJsb2NrbnIsIDEgPDwgQkhfTklMRlNfTm9kZSk7CisJaWYgKHVubGlrZWx5KCFiaCkpCisJCXJldHVybiBOVUxMOworCisJaWYgKHVubGlrZWx5KGJ1ZmZlcl9tYXBwZWQoYmgpIHx8IGJ1ZmZlcl91cHRvZGF0ZShiaCkgfHwKKwkJICAgICBidWZmZXJfZGlydHkoYmgpKSkgeworCQlicmVsc2UoYmgpOworCQlCVUcoKTsKKwl9CisJbWVtc2V0KGJoLT5iX2RhdGEsIDAsIDEgPDwgaW5vZGUtPmlfYmxrYml0cyk7CisJYmgtPmJfYmRldiA9IE5JTEZTX0lfTklMRlMoaW5vZGUpLT5uc19iZGV2OworCWJoLT5iX2Jsb2NrbnIgPSBibG9ja25yOworCXNldF9idWZmZXJfbWFwcGVkKGJoKTsKKwlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKworCXVubG9ja19wYWdlKGJoLT5iX3BhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShiaC0+Yl9wYWdlKTsKKwlyZXR1cm4gYmg7Cit9CisKIGludCBuaWxmc19idG5vZGVfc3VibWl0X2Jsb2NrKHN0cnVjdCBhZGRyZXNzX3NwYWNlICpidG5jLCBfX3U2NCBibG9ja25yLAotCQkJICAgICAgc2VjdG9yX3QgcGJsb2NrbnIsIHN0cnVjdCBidWZmZXJfaGVhZCAqKnBiaCwKLQkJCSAgICAgIGludCBuZXdibGspCisJCQkgICAgICBzZWN0b3JfdCBwYmxvY2tuciwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqcGJoKQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IE5JTEZTX0JUTkNfSShidG5jKTsKQEAgLTgxLDE5ICsxMDYsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWVyciA9IC1FRVhJU1Q7IC8qIGludGVybmFsIGNvZGUgKi8KLQlpZiAobmV3YmxrKSB7Ci0JCWlmICh1bmxpa2VseShidWZmZXJfbWFwcGVkKGJoKSB8fCBidWZmZXJfdXB0b2RhdGUoYmgpIHx8Ci0JCQkgICAgIGJ1ZmZlcl9kaXJ0eShiaCkpKSB7Ci0JCQlicmVsc2UoYmgpOwotCQkJQlVHKCk7Ci0JCX0KLQkJbWVtc2V0KGJoLT5iX2RhdGEsIDAsIDEgPDwgaW5vZGUtPmlfYmxrYml0cyk7Ci0JCWJoLT5iX2JkZXYgPSBOSUxGU19JX05JTEZTKGlub2RlKS0+bnNfYmRldjsKLQkJYmgtPmJfYmxvY2tuciA9IGJsb2NrbnI7Ci0JCXNldF9idWZmZXJfbWFwcGVkKGJoKTsKLQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7Ci0JCWdvdG8gZm91bmQ7Ci0JfQogCiAJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaCkgfHwgYnVmZmVyX2RpcnR5KGJoKSkKIAkJZ290byBmb3VuZDsKQEAgLTEzNSwyNyArMTQ3LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgbmlsZnNfYnRub2RlX2dldChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqYnRuYywgX191NjQgYmxvY2tuciwKLQkJICAgICBzZWN0b3JfdCBwYmxvY2tuciwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqcGJoLCBpbnQgbmV3YmxrKQotewotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7Ci0JaW50IGVycjsKLQotCWVyciA9IG5pbGZzX2J0bm9kZV9zdWJtaXRfYmxvY2soYnRuYywgYmxvY2tuciwgcGJsb2NrbnIsIHBiaCwgbmV3YmxrKTsKLQlpZiAoZXJyID09IC1FRVhJU1QpIC8qIGludGVybmFsIGNvZGUgKGNhY2hlIGhpdCkgKi8KLQkJcmV0dXJuIDA7Ci0JaWYgKHVubGlrZWx5KGVycikpCi0JCXJldHVybiBlcnI7Ci0KLQliaCA9ICpwYmg7Ci0Jd2FpdF9vbl9idWZmZXIoYmgpOwotCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgewotCQlicmVsc2UoYmgpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KIC8qKgogICogbmlsZnNfYnRub2RlX2RlbGV0ZSAtIGRlbGV0ZSBCLXRyZWUgbm9kZSBidWZmZXIKICAqIEBiaDogYnVmZmVyIHRvIGJlIGRlbGV0ZWQKQEAgLTI0NCwxMiArMjM1LDEzIEBACiAJCXVubG9ja19wYWdlKG9iaC0+Yl9wYWdlKTsKIAl9CiAKLQllcnIgPSBuaWxmc19idG5vZGVfZ2V0KGJ0bmMsIG5ld2tleSwgMCwgJm5iaCwgMSk7Ci0JaWYgKGxpa2VseSghZXJyKSkgewotCQlCVUdfT04obmJoID09IG9iaCk7Ci0JCWN0eHQtPm5ld2JoID0gbmJoOwotCX0KLQlyZXR1cm4gZXJyOworCW5iaCA9IG5pbGZzX2J0bm9kZV9jcmVhdGVfYmxvY2soYnRuYywgbmV3a2V5KTsKKwlpZiAoIW5iaCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlCVUdfT04obmJoID09IG9iaCk7CisJY3R4dC0+bmV3YmggPSBuYmg7CisJcmV0dXJuIDA7CiAKICBmYWlsZWRfdW5sb2NrOgogCXVubG9ja19wYWdlKG9iaC0+Yl9wYWdlKTsKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9idG5vZGUuaCBiL2ZzL25pbGZzMi9idG5vZGUuaAppbmRleCAzZTIyNzUxLi4wN2RhODNmIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvYnRub2RlLmgKKysrIGIvZnMvbmlsZnMyL2J0bm9kZS5oCkBAIC00MCwxMCArNDAsMTAgQEAKIHZvaWQgbmlsZnNfYnRub2RlX2NhY2hlX2luaXRfb25jZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqKTsKIHZvaWQgbmlsZnNfYnRub2RlX2NhY2hlX2luaXQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwgc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKik7CiB2b2lkIG5pbGZzX2J0bm9kZV9jYWNoZV9jbGVhcihzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqKTsKK3N0cnVjdCBidWZmZXJfaGVhZCAqbmlsZnNfYnRub2RlX2NyZWF0ZV9ibG9jayhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqYnRuYywKKwkJCQkJICAgICAgX191NjQgYmxvY2tucik7CiBpbnQgbmlsZnNfYnRub2RlX3N1Ym1pdF9ibG9jayhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBfX3U2NCwgc2VjdG9yX3QsCi0JCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiosIGludCk7Ci1pbnQgbmlsZnNfYnRub2RlX2dldChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBfX3U2NCwgc2VjdG9yX3QsCi0JCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqLCBpbnQpOworCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqKTsKIHZvaWQgbmlsZnNfYnRub2RlX2RlbGV0ZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7CiBpbnQgbmlsZnNfYnRub2RlX3ByZXBhcmVfY2hhbmdlX2tleShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLAogCQkJCSAgICBzdHJ1Y3QgbmlsZnNfYnRub2RlX2Noa2V5X2N0eHQgKik7CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvYnRyZWUuYyBiL2ZzL25pbGZzMi9idHJlZS5jCmluZGV4IGUyNWI1MDcuLjdjZGQ5OGIgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9idHJlZS5jCisrKyBiL2ZzL25pbGZzMi9idHJlZS5jCkBAIC0xMTQsNyArMTE0LDE4IEBACiB7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmJ0bmMgPQogCQkmTklMRlNfQk1BUF9JKChzdHJ1Y3QgbmlsZnNfYm1hcCAqKWJ0cmVlKS0+aV9idG5vZGVfY2FjaGU7Ci0JcmV0dXJuIG5pbGZzX2J0bm9kZV9nZXQoYnRuYywgcHRyLCAwLCBiaHAsIDApOworCWludCBlcnI7CisKKwllcnIgPSBuaWxmc19idG5vZGVfc3VibWl0X2Jsb2NrKGJ0bmMsIHB0ciwgMCwgYmhwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyID09IC1FRVhJU1QgPyAwIDogZXJyOworCisJd2FpdF9vbl9idWZmZXIoKmJocCk7CisJaWYgKCFidWZmZXJfdXB0b2RhdGUoKmJocCkpIHsKKwkJYnJlbHNlKCpiaHApOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbmlsZnNfYnRyZWVfZ2V0X25ld19ibG9jayhjb25zdCBzdHJ1Y3QgbmlsZnNfYnRyZWUgKmJ0cmVlLApAQCAtMTIyLDEyICsxMzMsMTUgQEAKIHsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqYnRuYyA9CiAJCSZOSUxGU19CTUFQX0koKHN0cnVjdCBuaWxmc19ibWFwICopYnRyZWUpLT5pX2J0bm9kZV9jYWNoZTsKLQlpbnQgcmV0OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKLQlyZXQgPSBuaWxmc19idG5vZGVfZ2V0KGJ0bmMsIHB0ciwgMCwgYmhwLCAxKTsKLQlpZiAoIXJldCkKLQkJc2V0X2J1ZmZlcl9uaWxmc192b2xhdGlsZSgqYmhwKTsKLQlyZXR1cm4gcmV0OworCWJoID0gbmlsZnNfYnRub2RlX2NyZWF0ZV9ibG9jayhidG5jLCBwdHIpOworCWlmICghYmgpCisJCXJldHVybiAtRU5PTUVNOworCisJc2V0X2J1ZmZlcl9uaWxmc192b2xhdGlsZShiaCk7CisJKmJocCA9IGJoOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludApAQCAtNDQ0LDYgKzQ1OCwxOCBAQAogCQluaWxmc19idHJlZV9nZXRfbm9ucm9vdF9ub2RlKHBhdGgsIGxldmVsKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQKK25pbGZzX2J0cmVlX2JhZF9ub2RlKHN0cnVjdCBuaWxmc19idHJlZV9ub2RlICpub2RlLCBpbnQgbGV2ZWwpCit7CisJaWYgKHVubGlrZWx5KG5pbGZzX2J0cmVlX25vZGVfZ2V0X2xldmVsKG5vZGUpICE9IGxldmVsKSkgeworCQlkdW1wX3N0YWNrKCk7CisJCXByaW50ayhLRVJOX0NSSVQgIk5JTEZTOiBidHJlZSBsZXZlbCBtaXNtYXRjaDogJWQgIT0gJWRcbiIsCisJCSAgICAgICBuaWxmc19idHJlZV9ub2RlX2dldF9sZXZlbChub2RlKSwgbGV2ZWwpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbmlsZnNfYnRyZWVfZG9fbG9va3VwKGNvbnN0IHN0cnVjdCBuaWxmc19idHJlZSAqYnRyZWUsCiAJCQkJIHN0cnVjdCBuaWxmc19idHJlZV9wYXRoICpwYXRoLAogCQkJCSBfX3U2NCBrZXksIF9fdTY0ICpwdHJwLCBpbnQgbWlubGV2ZWwpCkBAIC00NjcsNyArNDkzLDggQEAKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCQlub2RlID0gbmlsZnNfYnRyZWVfZ2V0X25vbnJvb3Rfbm9kZShwYXRoLCBsZXZlbCk7Ci0JCUJVR19PTihsZXZlbCAhPSBuaWxmc19idHJlZV9ub2RlX2dldF9sZXZlbChub2RlKSk7CisJCWlmIChuaWxmc19idHJlZV9iYWRfbm9kZShub2RlLCBsZXZlbCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKCFmb3VuZCkKIAkJCWZvdW5kID0gbmlsZnNfYnRyZWVfbm9kZV9sb29rdXAobm9kZSwga2V5LCAmaW5kZXgpOwogCQllbHNlCkBAIC01MTIsNyArNTM5LDggQEAKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCQlub2RlID0gbmlsZnNfYnRyZWVfZ2V0X25vbnJvb3Rfbm9kZShwYXRoLCBsZXZlbCk7Ci0JCUJVR19PTihsZXZlbCAhPSBuaWxmc19idHJlZV9ub2RlX2dldF9sZXZlbChub2RlKSk7CisJCWlmIChuaWxmc19idHJlZV9iYWRfbm9kZShub2RlLCBsZXZlbCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaW5kZXggPSBuaWxmc19idHJlZV9ub2RlX2dldF9uY2hpbGRyZW4obm9kZSkgLSAxOwogCQlwdHIgPSBuaWxmc19idHJlZV9ub2RlX2dldF9wdHIoYnRyZWUsIG5vZGUsIGluZGV4KTsKIAkJcGF0aFtsZXZlbF0uYnBfaW5kZXggPSBpbmRleDsKQEAgLTYzOCwxMyArNjY2LDExIEBACiB7CiAJaWYgKGxldmVsIDwgbmlsZnNfYnRyZWVfaGVpZ2h0KGJ0cmVlKSAtIDEpIHsKIAkJZG8gewotCQkJbG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfYmgpOwogCQkJbmlsZnNfYnRyZWVfbm9kZV9zZXRfa2V5KAogCQkJCW5pbGZzX2J0cmVlX2dldF9ub25yb290X25vZGUocGF0aCwgbGV2ZWwpLAogCQkJCXBhdGhbbGV2ZWxdLmJwX2luZGV4LCBrZXkpOwogCQkJaWYgKCFidWZmZXJfZGlydHkocGF0aFtsZXZlbF0uYnBfYmgpKQogCQkJCW5pbGZzX2J0bm9kZV9tYXJrX2RpcnR5KHBhdGhbbGV2ZWxdLmJwX2JoKTsKLQkJCXVubG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfYmgpOwogCQl9IHdoaWxlICgocGF0aFtsZXZlbF0uYnBfaW5kZXggPT0gMCkgJiYKIAkJCSAoKytsZXZlbCA8IG5pbGZzX2J0cmVlX2hlaWdodChidHJlZSkgLSAxKSk7CiAJfQpAQCAtNjYzLDEzICs2ODksMTEgQEAKIAlzdHJ1Y3QgbmlsZnNfYnRyZWVfbm9kZSAqbm9kZTsKIAogCWlmIChsZXZlbCA8IG5pbGZzX2J0cmVlX2hlaWdodChidHJlZSkgLSAxKSB7Ci0JCWxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX2JoKTsKIAkJbm9kZSA9IG5pbGZzX2J0cmVlX2dldF9ub25yb290X25vZGUocGF0aCwgbGV2ZWwpOwogCQluaWxmc19idHJlZV9ub2RlX2luc2VydChidHJlZSwgbm9kZSwgKmtleXAsICpwdHJwLAogCQkJCQlwYXRoW2xldmVsXS5icF9pbmRleCk7CiAJCWlmICghYnVmZmVyX2RpcnR5KHBhdGhbbGV2ZWxdLmJwX2JoKSkKIAkJCW5pbGZzX2J0bm9kZV9tYXJrX2RpcnR5KHBhdGhbbGV2ZWxdLmJwX2JoKTsKLQkJdW5sb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9iaCk7CiAKIAkJaWYgKHBhdGhbbGV2ZWxdLmJwX2luZGV4ID09IDApCiAJCQluaWxmc19idHJlZV9wcm9tb3RlX2tleShidHJlZSwgcGF0aCwgbGV2ZWwgKyAxLApAQCAtNjg5LDkgKzcxMyw2IEBACiAJc3RydWN0IG5pbGZzX2J0cmVlX25vZGUgKm5vZGUsICpsZWZ0OwogCWludCBuY2hpbGRyZW4sIGxuY2hpbGRyZW4sIG4sIG1vdmU7CiAKLQlsb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9iaCk7Ci0JbG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfc2liX2JoKTsKLQogCW5vZGUgPSBuaWxmc19idHJlZV9nZXRfbm9ucm9vdF9ub2RlKHBhdGgsIGxldmVsKTsKIAlsZWZ0ID0gbmlsZnNfYnRyZWVfZ2V0X3NpYl9ub2RlKHBhdGgsIGxldmVsKTsKIAluY2hpbGRyZW4gPSBuaWxmc19idHJlZV9ub2RlX2dldF9uY2hpbGRyZW4obm9kZSk7CkBAIC03MTIsOSArNzMzLDYgQEAKIAlpZiAoIWJ1ZmZlcl9kaXJ0eShwYXRoW2xldmVsXS5icF9zaWJfYmgpKQogCQluaWxmc19idG5vZGVfbWFya19kaXJ0eShwYXRoW2xldmVsXS5icF9zaWJfYmgpOwogCi0JdW5sb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9iaCk7Ci0JdW5sb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9zaWJfYmgpOwotCiAJbmlsZnNfYnRyZWVfcHJvbW90ZV9rZXkoYnRyZWUsIHBhdGgsIGxldmVsICsgMSwKIAkJCQluaWxmc19idHJlZV9ub2RlX2dldF9rZXkobm9kZSwgMCkpOwogCkBAIC03NDAsOSArNzU4LDYgQEAKIAlzdHJ1Y3QgbmlsZnNfYnRyZWVfbm9kZSAqbm9kZSwgKnJpZ2h0OwogCWludCBuY2hpbGRyZW4sIHJuY2hpbGRyZW4sIG4sIG1vdmU7CiAKLQlsb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9iaCk7Ci0JbG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfc2liX2JoKTsKLQogCW5vZGUgPSBuaWxmc19idHJlZV9nZXRfbm9ucm9vdF9ub2RlKHBhdGgsIGxldmVsKTsKIAlyaWdodCA9IG5pbGZzX2J0cmVlX2dldF9zaWJfbm9kZShwYXRoLCBsZXZlbCk7CiAJbmNoaWxkcmVuID0gbmlsZnNfYnRyZWVfbm9kZV9nZXRfbmNoaWxkcmVuKG5vZGUpOwpAQCAtNzYzLDkgKzc3OCw2IEBACiAJaWYgKCFidWZmZXJfZGlydHkocGF0aFtsZXZlbF0uYnBfc2liX2JoKSkKIAkJbmlsZnNfYnRub2RlX21hcmtfZGlydHkocGF0aFtsZXZlbF0uYnBfc2liX2JoKTsKIAotCXVubG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfYmgpOwotCXVubG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfc2liX2JoKTsKLQogCXBhdGhbbGV2ZWwgKyAxXS5icF9pbmRleCsrOwogCW5pbGZzX2J0cmVlX3Byb21vdGVfa2V5KGJ0cmVlLCBwYXRoLCBsZXZlbCArIDEsCiAJCQkJbmlsZnNfYnRyZWVfbm9kZV9nZXRfa2V5KHJpZ2h0LCAwKSk7CkBAIC03OTQsOSArODA2LDYgQEAKIAlfX3U2NCBuZXdwdHI7CiAJaW50IG5jaGlsZHJlbiwgbiwgbW92ZTsKIAotCWxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX2JoKTsKLQlsb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9zaWJfYmgpOwotCiAJbm9kZSA9IG5pbGZzX2J0cmVlX2dldF9ub25yb290X25vZGUocGF0aCwgbGV2ZWwpOwogCXJpZ2h0ID0gbmlsZnNfYnRyZWVfZ2V0X3NpYl9ub2RlKHBhdGgsIGxldmVsKTsKIAluY2hpbGRyZW4gPSBuaWxmc19idHJlZV9ub2RlX2dldF9uY2hpbGRyZW4obm9kZSk7CkBAIC04MTUsOSArODI0LDYgQEAKIAlpZiAoIWJ1ZmZlcl9kaXJ0eShwYXRoW2xldmVsXS5icF9zaWJfYmgpKQogCQluaWxmc19idG5vZGVfbWFya19kaXJ0eShwYXRoW2xldmVsXS5icF9zaWJfYmgpOwogCi0JdW5sb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9iaCk7Ci0JdW5sb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9zaWJfYmgpOwotCiAJbmV3a2V5ID0gbmlsZnNfYnRyZWVfbm9kZV9nZXRfa2V5KHJpZ2h0LCAwKTsKIAluZXdwdHIgPSBwYXRoW2xldmVsXS5icF9uZXdyZXEuYnByX3B0cjsKIApAQCAtODUyLDggKzg1OCw2IEBACiAJc3RydWN0IG5pbGZzX2J0cmVlX25vZGUgKnJvb3QsICpjaGlsZDsKIAlpbnQgbjsKIAotCWxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCk7Ci0KIAlyb290ID0gbmlsZnNfYnRyZWVfZ2V0X3Jvb3QoYnRyZWUpOwogCWNoaWxkID0gbmlsZnNfYnRyZWVfZ2V0X3NpYl9ub2RlKHBhdGgsIGxldmVsKTsKIApAQCAtODY1LDggKzg2OSw2IEBACiAJaWYgKCFidWZmZXJfZGlydHkocGF0aFtsZXZlbF0uYnBfc2liX2JoKSkKIAkJbmlsZnNfYnRub2RlX21hcmtfZGlydHkocGF0aFtsZXZlbF0uYnBfc2liX2JoKTsKIAotCXVubG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfc2liX2JoKTsKLQogCXBhdGhbbGV2ZWxdLmJwX2JoID0gcGF0aFtsZXZlbF0uYnBfc2liX2JoOwogCXBhdGhbbGV2ZWxdLmJwX3NpYl9iaCA9IE5VTEw7CiAKQEAgLTEwMjMsMTEgKzEwMjUsOSBAQAogCiAJCXN0YXRzLT5ic19uYmxvY2tzKys7CiAKLQkJbG9ja19idWZmZXIoYmgpOwogCQluaWxmc19idHJlZV9ub2RlX2luaXQoYnRyZWUsCiAJCQkJICAgICAgKHN0cnVjdCBuaWxmc19idHJlZV9ub2RlICopYmgtPmJfZGF0YSwKIAkJCQkgICAgICAwLCBsZXZlbCwgMCwgTlVMTCwgTlVMTCk7Ci0JCXVubG9ja19idWZmZXIoYmgpOwogCQlwYXRoW2xldmVsXS5icF9zaWJfYmggPSBiaDsKIAkJcGF0aFtsZXZlbF0uYnBfb3AgPSBuaWxmc19idHJlZV9zcGxpdDsKIAl9CkBAIC0xMDUyLDEwICsxMDUyLDggQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJfb3V0X2N1cnJfbm9kZTsKIAotCWxvY2tfYnVmZmVyKGJoKTsKIAluaWxmc19idHJlZV9ub2RlX2luaXQoYnRyZWUsIChzdHJ1Y3QgbmlsZnNfYnRyZWVfbm9kZSAqKWJoLT5iX2RhdGEsCiAJCQkgICAgICAwLCBsZXZlbCwgMCwgTlVMTCwgTlVMTCk7Ci0JdW5sb2NrX2J1ZmZlcihiaCk7CiAJcGF0aFtsZXZlbF0uYnBfc2liX2JoID0gYmg7CiAJcGF0aFtsZXZlbF0uYnBfb3AgPSBuaWxmc19idHJlZV9ncm93OwogCkBAIC0xMTU0LDEzICsxMTUyLDExIEBACiAJc3RydWN0IG5pbGZzX2J0cmVlX25vZGUgKm5vZGU7CiAKIAlpZiAobGV2ZWwgPCBuaWxmc19idHJlZV9oZWlnaHQoYnRyZWUpIC0gMSkgewotCQlsb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9iaCk7CiAJCW5vZGUgPSBuaWxmc19idHJlZV9nZXRfbm9ucm9vdF9ub2RlKHBhdGgsIGxldmVsKTsKIAkJbmlsZnNfYnRyZWVfbm9kZV9kZWxldGUoYnRyZWUsIG5vZGUsIGtleXAsIHB0cnAsCiAJCQkJCXBhdGhbbGV2ZWxdLmJwX2luZGV4KTsKIAkJaWYgKCFidWZmZXJfZGlydHkocGF0aFtsZXZlbF0uYnBfYmgpKQogCQkJbmlsZnNfYnRub2RlX21hcmtfZGlydHkocGF0aFtsZXZlbF0uYnBfYmgpOwotCQl1bmxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX2JoKTsKIAkJaWYgKHBhdGhbbGV2ZWxdLmJwX2luZGV4ID09IDApCiAJCQluaWxmc19idHJlZV9wcm9tb3RlX2tleShidHJlZSwgcGF0aCwgbGV2ZWwgKyAxLAogCQkJCW5pbGZzX2J0cmVlX25vZGVfZ2V0X2tleShub2RlLCAwKSk7CkBAIC0xMTgwLDkgKzExNzYsNiBAQAogCiAJbmlsZnNfYnRyZWVfZG9fZGVsZXRlKGJ0cmVlLCBwYXRoLCBsZXZlbCwga2V5cCwgcHRycCk7CiAKLQlsb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9iaCk7Ci0JbG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfc2liX2JoKTsKLQogCW5vZGUgPSBuaWxmc19idHJlZV9nZXRfbm9ucm9vdF9ub2RlKHBhdGgsIGxldmVsKTsKIAlsZWZ0ID0gbmlsZnNfYnRyZWVfZ2V0X3NpYl9ub2RlKHBhdGgsIGxldmVsKTsKIAluY2hpbGRyZW4gPSBuaWxmc19idHJlZV9ub2RlX2dldF9uY2hpbGRyZW4obm9kZSk7CkBAIC0xMTk3LDkgKzExOTAsNiBAQAogCWlmICghYnVmZmVyX2RpcnR5KHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCkpCiAJCW5pbGZzX2J0bm9kZV9tYXJrX2RpcnR5KHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCk7CiAKLQl1bmxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX2JoKTsKLQl1bmxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCk7Ci0KIAluaWxmc19idHJlZV9wcm9tb3RlX2tleShidHJlZSwgcGF0aCwgbGV2ZWwgKyAxLAogCQkJCW5pbGZzX2J0cmVlX25vZGVfZ2V0X2tleShub2RlLCAwKSk7CiAKQEAgLTEyMTcsOSArMTIwNyw2IEBACiAKIAluaWxmc19idHJlZV9kb19kZWxldGUoYnRyZWUsIHBhdGgsIGxldmVsLCBrZXlwLCBwdHJwKTsKIAotCWxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX2JoKTsKLQlsb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9zaWJfYmgpOwotCiAJbm9kZSA9IG5pbGZzX2J0cmVlX2dldF9ub25yb290X25vZGUocGF0aCwgbGV2ZWwpOwogCXJpZ2h0ID0gbmlsZnNfYnRyZWVfZ2V0X3NpYl9ub2RlKHBhdGgsIGxldmVsKTsKIAluY2hpbGRyZW4gPSBuaWxmc19idHJlZV9ub2RlX2dldF9uY2hpbGRyZW4obm9kZSk7CkBAIC0xMjM0LDkgKzEyMjEsNiBAQAogCWlmICghYnVmZmVyX2RpcnR5KHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCkpCiAJCW5pbGZzX2J0bm9kZV9tYXJrX2RpcnR5KHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCk7CiAKLQl1bmxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX2JoKTsKLQl1bmxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCk7Ci0KIAlwYXRoW2xldmVsICsgMV0uYnBfaW5kZXgrKzsKIAluaWxmc19idHJlZV9wcm9tb3RlX2tleShidHJlZSwgcGF0aCwgbGV2ZWwgKyAxLAogCQkJCW5pbGZzX2J0cmVlX25vZGVfZ2V0X2tleShyaWdodCwgMCkpOwpAQCAtMTI1NSw5ICsxMjM5LDYgQEAKIAogCW5pbGZzX2J0cmVlX2RvX2RlbGV0ZShidHJlZSwgcGF0aCwgbGV2ZWwsIGtleXAsIHB0cnApOwogCi0JbG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfYmgpOwotCWxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCk7Ci0KIAlub2RlID0gbmlsZnNfYnRyZWVfZ2V0X25vbnJvb3Rfbm9kZShwYXRoLCBsZXZlbCk7CiAJbGVmdCA9IG5pbGZzX2J0cmVlX2dldF9zaWJfbm9kZShwYXRoLCBsZXZlbCk7CiAKQEAgLTEyNjgsOSArMTI0OSw2IEBACiAJaWYgKCFidWZmZXJfZGlydHkocGF0aFtsZXZlbF0uYnBfc2liX2JoKSkKIAkJbmlsZnNfYnRub2RlX21hcmtfZGlydHkocGF0aFtsZXZlbF0uYnBfc2liX2JoKTsKIAotCXVubG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfYmgpOwotCXVubG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfc2liX2JoKTsKLQogCW5pbGZzX2J0bm9kZV9kZWxldGUocGF0aFtsZXZlbF0uYnBfYmgpOwogCXBhdGhbbGV2ZWxdLmJwX2JoID0gcGF0aFtsZXZlbF0uYnBfc2liX2JoOwogCXBhdGhbbGV2ZWxdLmJwX3NpYl9iaCA9IE5VTEw7CkBAIC0xMjg2LDkgKzEyNjQsNiBAQAogCiAJbmlsZnNfYnRyZWVfZG9fZGVsZXRlKGJ0cmVlLCBwYXRoLCBsZXZlbCwga2V5cCwgcHRycCk7CiAKLQlsb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9iaCk7Ci0JbG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfc2liX2JoKTsKLQogCW5vZGUgPSBuaWxmc19idHJlZV9nZXRfbm9ucm9vdF9ub2RlKHBhdGgsIGxldmVsKTsKIAlyaWdodCA9IG5pbGZzX2J0cmVlX2dldF9zaWJfbm9kZShwYXRoLCBsZXZlbCk7CiAKQEAgLTEyOTksOSArMTI3NCw2IEBACiAJaWYgKCFidWZmZXJfZGlydHkocGF0aFtsZXZlbF0uYnBfYmgpKQogCQluaWxmc19idG5vZGVfbWFya19kaXJ0eShwYXRoW2xldmVsXS5icF9iaCk7CiAKLQl1bmxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX2JoKTsKLQl1bmxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCk7Ci0KIAluaWxmc19idG5vZGVfZGVsZXRlKHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCk7CiAJcGF0aFtsZXZlbF0uYnBfc2liX2JoID0gTlVMTDsKIAlwYXRoW2xldmVsICsgMV0uYnBfaW5kZXgrKzsKQEAgLTEzMTYsNyArMTI4OCw2IEBACiAKIAluaWxmc19idHJlZV9kb19kZWxldGUoYnRyZWUsIHBhdGgsIGxldmVsLCBrZXlwLCBwdHJwKTsKIAotCWxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX2JoKTsKIAlyb290ID0gbmlsZnNfYnRyZWVfZ2V0X3Jvb3QoYnRyZWUpOwogCWNoaWxkID0gbmlsZnNfYnRyZWVfZ2V0X25vbnJvb3Rfbm9kZShwYXRoLCBsZXZlbCk7CiAKQEAgLTEzMjQsNyArMTI5NSw2IEBACiAJbmlsZnNfYnRyZWVfbm9kZV9zZXRfbGV2ZWwocm9vdCwgbGV2ZWwpOwogCW4gPSBuaWxmc19idHJlZV9ub2RlX2dldF9uY2hpbGRyZW4oY2hpbGQpOwogCW5pbGZzX2J0cmVlX25vZGVfbW92ZV9sZWZ0KGJ0cmVlLCByb290LCBjaGlsZCwgbik7Ci0JdW5sb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9iaCk7CiAKIAluaWxmc19idG5vZGVfZGVsZXRlKHBhdGhbbGV2ZWxdLmJwX2JoKTsKIAlwYXRoW2xldmVsXS5icF9iaCA9IE5VTEw7CkBAIC0xNjk5LDcgKzE2NjksNiBAQAogCQluaWxmc19ibWFwX2NvbW1pdF9hbGxvY19wdHIoYm1hcCwgbnJlcSwgZGF0KTsKIAogCQkvKiBjcmVhdGUgY2hpbGQgbm9kZSBhdCBsZXZlbCAxICovCi0JCWxvY2tfYnVmZmVyKGJoKTsKIAkJbm9kZSA9IChzdHJ1Y3QgbmlsZnNfYnRyZWVfbm9kZSAqKWJoLT5iX2RhdGE7CiAJCW5pbGZzX2J0cmVlX25vZGVfaW5pdChidHJlZSwgbm9kZSwgMCwgMSwgbiwga2V5cywgcHRycyk7CiAJCW5pbGZzX2J0cmVlX25vZGVfaW5zZXJ0KGJ0cmVlLCBub2RlLApAQCAtMTcwOSw3ICsxNjc4LDYgQEAKIAkJaWYgKCFuaWxmc19ibWFwX2RpcnR5KGJtYXApKQogCQkJbmlsZnNfYm1hcF9zZXRfZGlydHkoYm1hcCk7CiAKLQkJdW5sb2NrX2J1ZmZlcihiaCk7CiAJCWJyZWxzZShiaCk7CiAKIAkJLyogY3JlYXRlIHJvb3Qgbm9kZSBhdCBsZXZlbCAyICovCkBAIC0yMDUwLDcgKzIwMTgsNyBAQAogCWZvciAobGV2ZWwgPSBOSUxGU19CVFJFRV9MRVZFTF9OT0RFX01JTjsKIAkgICAgIGxldmVsIDwgTklMRlNfQlRSRUVfTEVWRUxfTUFYOwogCSAgICAgbGV2ZWwrKykKLQkJbGlzdF9zcGxpY2UoJmxpc3RzW2xldmVsXSwgbGlzdHAtPnByZXYpOworCQlsaXN0X3NwbGljZV90YWlsKCZsaXN0c1tsZXZlbF0sIGxpc3RwKTsKIH0KIAogc3RhdGljIGludCBuaWxmc19idHJlZV9hc3NpZ25fcChzdHJ1Y3QgbmlsZnNfYnRyZWUgKmJ0cmVlLApkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2J0cmVlLmggYi9mcy9uaWxmczIvYnRyZWUuaAppbmRleCAwZTcyYmJiLi40YjgyZDg0IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvYnRyZWUuaAorKysgYi9mcy9uaWxmczIvYnRyZWUuaApAQCAtMzQsMjggKzM0LDYgQEAKIHN0cnVjdCBuaWxmc19idHJlZV9wYXRoOwogCiAvKioKLSAqIHN0cnVjdCBuaWxmc19idHJlZV9ub2RlIC0gQi10cmVlIG5vZGUKLSAqIEBibl9mbGFnczogZmxhZ3MKLSAqIEBibl9sZXZlbDogbGV2ZWwKLSAqIEBibl9uY2hpbGRyZW46IG51bWJlciBvZiBjaGlsZHJlbgotICogQGJuX3BhZDogcGFkZGluZwotICovCi1zdHJ1Y3QgbmlsZnNfYnRyZWVfbm9kZSB7Ci0JX191OCBibl9mbGFnczsKLQlfX3U4IGJuX2xldmVsOwotCV9fbGUxNiBibl9uY2hpbGRyZW47Ci0JX19sZTMyIGJuX3BhZDsKLX07Ci0KLS8qIGZsYWdzICovCi0jZGVmaW5lIE5JTEZTX0JUUkVFX05PREVfUk9PVAkweDAxCi0KLS8qIGxldmVsICovCi0jZGVmaW5lIE5JTEZTX0JUUkVFX0xFVkVMX0RBVEEJCTAKLSNkZWZpbmUgTklMRlNfQlRSRUVfTEVWRUxfTk9ERV9NSU4JKE5JTEZTX0JUUkVFX0xFVkVMX0RBVEEgKyAxKQotI2RlZmluZSBOSUxGU19CVFJFRV9MRVZFTF9NQVgJCTE0Ci0KLS8qKgogICogc3RydWN0IG5pbGZzX2J0cmVlIC0gQi10cmVlIHN0cnVjdHVyZQogICogQGJ0X2JtYXA6IGJtYXAgYmFzZSBzdHJ1Y3R1cmUKICAqLwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2NwZmlsZS5jIGIvZnMvbmlsZnMyL2NwZmlsZS5jCmluZGV4IDNmNWQ1ZDAuLmQ1YWQ1NGUgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9jcGZpbGUuYworKysgYi9mcy9uaWxmczIvY3BmaWxlLmMKQEAgLTkyNiwzICs5MjYsMjkgQEAKIAl1cF9yZWFkKCZOSUxGU19NRFQoY3BmaWxlKS0+bWlfc2VtKTsKIAlyZXR1cm4gcmV0OwogfQorCisvKioKKyAqIG5pbGZzX2NwZmlsZV9yZWFkIC0gcmVhZCBjcGZpbGUgaW5vZGUKKyAqIEBjcGZpbGU6IGNwZmlsZSBpbm9kZQorICogQHJhd19pbm9kZTogb24tZGlzayBjcGZpbGUgaW5vZGUKKyAqLworaW50IG5pbGZzX2NwZmlsZV9yZWFkKHN0cnVjdCBpbm9kZSAqY3BmaWxlLCBzdHJ1Y3QgbmlsZnNfaW5vZGUgKnJhd19pbm9kZSkKK3sKKwlyZXR1cm4gbmlsZnNfcmVhZF9pbm9kZV9jb21tb24oY3BmaWxlLCByYXdfaW5vZGUpOworfQorCisvKioKKyAqIG5pbGZzX2NwZmlsZV9uZXcgLSBjcmVhdGUgY3BmaWxlCisgKiBAbmlsZnM6IG5pbGZzIG9iamVjdAorICogQGNwc2l6ZTogc2l6ZSBvZiBhIGNoZWNrcG9pbnQgZW50cnkKKyAqLworc3RydWN0IGlub2RlICpuaWxmc19jcGZpbGVfbmV3KHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzLCBzaXplX3QgY3BzaXplKQoreworCXN0cnVjdCBpbm9kZSAqY3BmaWxlOworCisJY3BmaWxlID0gbmlsZnNfbWR0X25ldyhuaWxmcywgTlVMTCwgTklMRlNfQ1BGSUxFX0lOTywgMCk7CisJaWYgKGNwZmlsZSkKKwkJbmlsZnNfbWR0X3NldF9lbnRyeV9zaXplKGNwZmlsZSwgY3BzaXplLAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBuaWxmc19jcGZpbGVfaGVhZGVyKSk7CisJcmV0dXJuIGNwZmlsZTsKK30KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9jcGZpbGUuaCBiL2ZzL25pbGZzMi9jcGZpbGUuaAppbmRleCBkZWJlYTg5Li5iYzA4MDllIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvY3BmaWxlLmgKKysrIGIvZnMvbmlsZnMyL2NwZmlsZS5oCkBAIC00MCw0ICs0MCw3IEBACiBzc2l6ZV90IG5pbGZzX2NwZmlsZV9nZXRfY3BpbmZvKHN0cnVjdCBpbm9kZSAqLCBfX3U2NCAqLCBpbnQsIHZvaWQgKiwgdW5zaWduZWQsCiAJCQkJc2l6ZV90KTsKIAoraW50IG5pbGZzX2NwZmlsZV9yZWFkKHN0cnVjdCBpbm9kZSAqY3BmaWxlLCBzdHJ1Y3QgbmlsZnNfaW5vZGUgKnJhd19pbm9kZSk7CitzdHJ1Y3QgaW5vZGUgKm5pbGZzX2NwZmlsZV9uZXcoc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMsIHNpemVfdCBjcHNpemUpOworCiAjZW5kaWYJLyogX05JTEZTX0NQRklMRV9IICovCmRpZmYgLS1naXQgYS9mcy9uaWxmczIvZGF0LmMgYi9mcy9uaWxmczIvZGF0LmMKaW5kZXggMWZmOGUxNS4uMTg3ZGQwNyAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2RhdC5jCisrKyBiL2ZzL25pbGZzMi9kYXQuYwpAQCAtMzMsNiArMzMsMTYgQEAKICNkZWZpbmUgTklMRlNfQ05PX01JTgkoKF9fdTY0KTEpCiAjZGVmaW5lIE5JTEZTX0NOT19NQVgJKH4oX191NjQpMCkKIAorc3RydWN0IG5pbGZzX2RhdF9pbmZvIHsKKwlzdHJ1Y3QgbmlsZnNfbWR0X2luZm8gbWk7CisJc3RydWN0IG5pbGZzX3BhbGxvY19jYWNoZSBwYWxsb2NfY2FjaGU7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuaWxmc19kYXRfaW5mbyAqTklMRlNfREFUX0koc3RydWN0IGlub2RlICpkYXQpCit7CisJcmV0dXJuIChzdHJ1Y3QgbmlsZnNfZGF0X2luZm8gKilOSUxGU19NRFQoZGF0KTsKK30KKwogc3RhdGljIGludCBuaWxmc19kYXRfcHJlcGFyZV9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRhdCwKIAkJCQkgICBzdHJ1Y3QgbmlsZnNfcGFsbG9jX3JlcSAqcmVxLCBpbnQgY3JlYXRlKQogewpAQCAtNDI1LDMgKzQzNSw0MCBAQAogCiAJcmV0dXJuIG52aTsKIH0KKworLyoqCisgKiBuaWxmc19kYXRfcmVhZCAtIHJlYWQgZGF0IGlub2RlCisgKiBAZGF0OiBkYXQgaW5vZGUKKyAqIEByYXdfaW5vZGU6IG9uLWRpc2sgZGF0IGlub2RlCisgKi8KK2ludCBuaWxmc19kYXRfcmVhZChzdHJ1Y3QgaW5vZGUgKmRhdCwgc3RydWN0IG5pbGZzX2lub2RlICpyYXdfaW5vZGUpCit7CisJcmV0dXJuIG5pbGZzX3JlYWRfaW5vZGVfY29tbW9uKGRhdCwgcmF3X2lub2RlKTsKK30KKworLyoqCisgKiBuaWxmc19kYXRfbmV3IC0gY3JlYXRlIGRhdCBmaWxlCisgKiBAbmlsZnM6IG5pbGZzIG9iamVjdAorICogQGVudHJ5X3NpemU6IHNpemUgb2YgYSBkYXQgZW50cnkKKyAqLworc3RydWN0IGlub2RlICpuaWxmc19kYXRfbmV3KHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzLCBzaXplX3QgZW50cnlfc2l6ZSkKK3sKKwlzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGRhdF9sb2NrX2tleTsKKwlzdHJ1Y3QgaW5vZGUgKmRhdDsKKwlzdHJ1Y3QgbmlsZnNfZGF0X2luZm8gKmRpOworCWludCBlcnI7CisKKwlkYXQgPSBuaWxmc19tZHRfbmV3KG5pbGZzLCBOVUxMLCBOSUxGU19EQVRfSU5PLCBzaXplb2YoKmRpKSk7CisJaWYgKGRhdCkgeworCQllcnIgPSBuaWxmc19wYWxsb2NfaW5pdF9ibG9ja2dyb3VwKGRhdCwgZW50cnlfc2l6ZSk7CisJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQluaWxmc19tZHRfZGVzdHJveShkYXQpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlkaSA9IE5JTEZTX0RBVF9JKGRhdCk7CisJCWxvY2tkZXBfc2V0X2NsYXNzKCZkaS0+bWkubWlfc2VtLCAmZGF0X2xvY2tfa2V5KTsKKwkJbmlsZnNfcGFsbG9jX3NldHVwX2NhY2hlKGRhdCwgJmRpLT5wYWxsb2NfY2FjaGUpOworCX0KKwlyZXR1cm4gZGF0OworfQpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2RhdC5oIGIvZnMvbmlsZnMyL2RhdC5oCmluZGV4IDQwNjA3MGQuLmQzMWMzYWEgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9kYXQuaAorKysgYi9mcy9uaWxmczIvZGF0LmgKQEAgLTUzLDQgKzUzLDcgQEAKIGludCBuaWxmc19kYXRfbW92ZShzdHJ1Y3QgaW5vZGUgKiwgX191NjQsIHNlY3Rvcl90KTsKIHNzaXplX3QgbmlsZnNfZGF0X2dldF92aW5mbyhzdHJ1Y3QgaW5vZGUgKiwgdm9pZCAqLCB1bnNpZ25lZCwgc2l6ZV90KTsKIAoraW50IG5pbGZzX2RhdF9yZWFkKHN0cnVjdCBpbm9kZSAqZGF0LCBzdHJ1Y3QgbmlsZnNfaW5vZGUgKnJhd19pbm9kZSk7CitzdHJ1Y3QgaW5vZGUgKm5pbGZzX2RhdF9uZXcoc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMsIHNpemVfdCBlbnRyeV9zaXplKTsKKwogI2VuZGlmCS8qIF9OSUxGU19EQVRfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2Rpci5jIGIvZnMvbmlsZnMyL2Rpci5jCmluZGV4IGUwOTcwOTkuLjc2ZDgwM2UgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9kaXIuYworKysgYi9mcy9uaWxmczIvZGlyLmMKQEAgLTk5LDkgKzk5LDkgQEAKIAkJCQkgTlVMTCwgbmlsZnNfZ2V0X2Jsb2NrKTsKIH0KIAotc3RhdGljIGludCBuaWxmc19jb21taXRfY2h1bmsoc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQkgICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKLQkJCSAgICAgIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQorc3RhdGljIHZvaWQgbmlsZnNfY29tbWl0X2NodW5rKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJICAgICAgIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQogewogCXN0cnVjdCBpbm9kZSAqZGlyID0gbWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3QgbmlsZnNfc2JfaW5mbyAqc2JpID0gTklMRlNfU0IoZGlyLT5pX3NiKTsKQEAgLTExMiwxNSArMTEyLDEzIEBACiAKIAlucl9kaXJ0eSA9IG5pbGZzX3BhZ2VfY291bnRfY2xlYW5fYnVmZmVycyhwYWdlLCBmcm9tLCB0byk7CiAJY29waWVkID0gYmxvY2tfd3JpdGVfZW5kKE5VTEwsIG1hcHBpbmcsIHBvcywgbGVuLCBsZW4sIHBhZ2UsIE5VTEwpOwotCWlmIChwb3MgKyBjb3BpZWQgPiBkaXItPmlfc2l6ZSkgeworCWlmIChwb3MgKyBjb3BpZWQgPiBkaXItPmlfc2l6ZSkKIAkJaV9zaXplX3dyaXRlKGRpciwgcG9zICsgY29waWVkKTsKLQkJbWFya19pbm9kZV9kaXJ0eShkaXIpOwotCX0KIAlpZiAoSVNfRElSU1lOQyhkaXIpKQogCQluaWxmc19zZXRfdHJhbnNhY3Rpb25fZmxhZyhOSUxGU19USV9TWU5DKTsKIAllcnIgPSBuaWxmc19zZXRfZmlsZV9kaXJ0eShzYmksIGRpciwgbnJfZGlydHkpOworCVdBUk5fT04oZXJyKTsgLyogZG8gbm90IGhhcHBlbiAqLwogCXVubG9ja19wYWdlKHBhZ2UpOwotCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIG5pbGZzX2NoZWNrX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCkBAIC00NTUsMTEgKzQ1MywxMCBAQAogCUJVR19PTihlcnIpOwogCWRlLT5pbm9kZSA9IGNwdV90b19sZTY0KGlub2RlLT5pX2lubyk7CiAJbmlsZnNfc2V0X2RlX3R5cGUoZGUsIGlub2RlKTsKLQllcnIgPSBuaWxmc19jb21taXRfY2h1bmsocGFnZSwgbWFwcGluZywgZnJvbSwgdG8pOworCW5pbGZzX2NvbW1pdF9jaHVuayhwYWdlLCBtYXBwaW5nLCBmcm9tLCB0byk7CiAJbmlsZnNfcHV0X3BhZ2UocGFnZSk7CiAJZGlyLT5pX210aW1lID0gZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogLyoJTklMRlNfSShkaXIpLT5pX2ZsYWdzICY9IH5OSUxGU19CVFJFRV9GTDsgKi8KLQltYXJrX2lub2RlX2RpcnR5KGRpcik7CiB9CiAKIC8qCkBAIC01NDgsMTAgKzU0NSwxMCBAQAogCW1lbWNweShkZS0+bmFtZSwgbmFtZSwgbmFtZWxlbik7CiAJZGUtPmlub2RlID0gY3B1X3RvX2xlNjQoaW5vZGUtPmlfaW5vKTsKIAluaWxmc19zZXRfZGVfdHlwZShkZSwgaW5vZGUpOwotCWVyciA9IG5pbGZzX2NvbW1pdF9jaHVuayhwYWdlLCBwYWdlLT5tYXBwaW5nLCBmcm9tLCB0byk7CisJbmlsZnNfY29tbWl0X2NodW5rKHBhZ2UsIHBhZ2UtPm1hcHBpbmcsIGZyb20sIHRvKTsKIAlkaXItPmlfbXRpbWUgPSBkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAvKglOSUxGU19JKGRpciktPmlfZmxhZ3MgJj0gfk5JTEZTX0JUUkVFX0ZMOyAqLwotCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKKwluaWxmc19tYXJrX2lub2RlX2RpcnR5KGRpcik7CiAJLyogT0ZGU0VUX0NBQ0hFICovCiBvdXRfcHV0OgogCW5pbGZzX3B1dF9wYWdlKHBhZ2UpOwpAQCAtNTk1LDEwICs1OTIsOSBAQAogCWlmIChwZGUpCiAJCXBkZS0+cmVjX2xlbiA9IGNwdV90b19sZTE2KHRvIC0gZnJvbSk7CiAJZGlyLT5pbm9kZSA9IDA7Ci0JZXJyID0gbmlsZnNfY29tbWl0X2NodW5rKHBhZ2UsIG1hcHBpbmcsIGZyb20sIHRvKTsKKwluaWxmc19jb21taXRfY2h1bmsocGFnZSwgbWFwcGluZywgZnJvbSwgdG8pOwogCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CiAvKglOSUxGU19JKGlub2RlKS0+aV9mbGFncyAmPSB+TklMRlNfQlRSRUVfRkw7ICovCi0JbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiBvdXQ6CiAJbmlsZnNfcHV0X3BhZ2UocGFnZSk7CiAJcmV0dXJuIGVycjsKQEAgLTY0MCw3ICs2MzYsNyBAQAogCW1lbWNweShkZS0+bmFtZSwgIi4uXDAiLCA0KTsKIAluaWxmc19zZXRfZGVfdHlwZShkZSwgaW5vZGUpOwogCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKLQllcnIgPSBuaWxmc19jb21taXRfY2h1bmsocGFnZSwgbWFwcGluZywgMCwgY2h1bmtfc2l6ZSk7CisJbmlsZnNfY29tbWl0X2NodW5rKHBhZ2UsIG1hcHBpbmcsIDAsIGNodW5rX3NpemUpOwogZmFpbDoKIAlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9nY2RhdC5jIGIvZnMvbmlsZnMyL2djZGF0LmMKaW5kZXggOTMzODNjNS4uZGQ1ZjdlMCAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2djZGF0LmMKKysrIGIvZnMvbmlsZnMyL2djZGF0LmMKQEAgLTYxLDYgKzYxLDggQEAKIAogCW5pbGZzX2JtYXBfY29tbWl0X2djZGF0KGdpaS0+aV9ibWFwLCBkaWktPmlfYm1hcCk7CiAKKwluaWxmc19wYWxsb2NfY2xlYXJfY2FjaGUoZGF0KTsKKwluaWxmc19wYWxsb2NfY2xlYXJfY2FjaGUoZ2NkYXQpOwogCW5pbGZzX2NsZWFyX2RpcnR5X3BhZ2VzKG1hcHBpbmcpOwogCW5pbGZzX2NvcHlfYmFja19wYWdlcyhtYXBwaW5nLCBnbWFwcGluZyk7CiAJLyogbm90ZTogbWR0IGRpcnR5IGZsYWdzIHNob3VsZCBiZSBjbGVhcmVkIGJ5IHNlZ2N0b3IuICovCkBAIC03OSw2ICs4MSw3IEBACiAJZ2NkYXQtPmlfc3RhdGUgPSBJX0NMRUFSOwogCWdpaS0+aV9mbGFncyA9IDA7CiAKKwluaWxmc19wYWxsb2NfY2xlYXJfY2FjaGUoZ2NkYXQpOwogCXRydW5jYXRlX2lub2RlX3BhZ2VzKGdjZGF0LT5pX21hcHBpbmcsIDApOwogCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZnaWktPmlfYnRub2RlX2NhY2hlLCAwKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9nY2lub2RlLmMgYi9mcy9uaWxmczIvZ2Npbm9kZS5jCmluZGV4IGU2ZGUwYTIuLmUxNmE2NjYgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9nY2lub2RlLmMKKysrIGIvZnMvbmlsZnMyL2djaW5vZGUuYwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAJCQkJICAgX191NjQgdmJuLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipvdXRfYmgpCiB7CiAJaW50IHJldCA9IG5pbGZzX2J0bm9kZV9zdWJtaXRfYmxvY2soJk5JTEZTX0koaW5vZGUpLT5pX2J0bm9kZV9jYWNoZSwKLQkJCQkJICAgIHZibiA/IDogcGJuLCBwYm4sIG91dF9iaCwgMCk7CisJCQkJCSAgICB2Ym4gPyA6IHBibiwgcGJuLCBvdXRfYmgpOwogCWlmIChyZXQgPT0gLUVFWElTVCkgLyogaW50ZXJuYWwgY29kZSAoY2FjaGUgaGl0KSAqLwogCQlyZXQgPSAwOwogCXJldHVybiByZXQ7CkBAIC0yMTIsOSArMjEyLDEwIEBACiBzdGF0aWMgc3RydWN0IGlub2RlICphbGxvY19nY2lub2RlKHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzLCBpbm9fdCBpbm8sCiAJCQkJICAgX191NjQgY25vKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBuaWxmc19tZHRfbmV3X2NvbW1vbihuaWxmcywgTlVMTCwgaW5vLCBHRlBfTk9GUyk7CisJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgbmlsZnNfaW5vZGVfaW5mbyAqaWk7CiAKKwlpbm9kZSA9IG5pbGZzX21kdF9uZXdfY29tbW9uKG5pbGZzLCBOVUxMLCBpbm8sIEdGUF9OT0ZTLCAwKTsKIAlpZiAoIWlub2RlKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMjY1LDcgKzI2Niw2IEBACiAgKi8KIHZvaWQgbmlsZnNfY2xlYXJfZ2Npbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCW5pbGZzX21kdF9jbGVhcihpbm9kZSk7CiAJbmlsZnNfbWR0X2Rlc3Ryb3koaW5vZGUpOwogfQogCmRpZmYgLS1naXQgYS9mcy9uaWxmczIvaWZpbGUuYyBiL2ZzL25pbGZzMi9pZmlsZS5jCmluZGV4IGRlODY0MDEuLjkyMmQ5ZGQgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9pZmlsZS5jCisrKyBiL2ZzL25pbGZzMi9pZmlsZS5jCkBAIC0yOSw2ICsyOSwxNyBAQAogI2luY2x1ZGUgImFsbG9jLmgiCiAjaW5jbHVkZSAiaWZpbGUuaCIKIAorCitzdHJ1Y3QgbmlsZnNfaWZpbGVfaW5mbyB7CisJc3RydWN0IG5pbGZzX21kdF9pbmZvIG1pOworCXN0cnVjdCBuaWxmc19wYWxsb2NfY2FjaGUgcGFsbG9jX2NhY2hlOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmlsZnNfaWZpbGVfaW5mbyAqTklMRlNfSUZJTEVfSShzdHJ1Y3QgaW5vZGUgKmlmaWxlKQoreworCXJldHVybiAoc3RydWN0IG5pbGZzX2lmaWxlX2luZm8gKilOSUxGU19NRFQoaWZpbGUpOworfQorCiAvKioKICAqIG5pbGZzX2lmaWxlX2NyZWF0ZV9pbm9kZSAtIGNyZWF0ZSBhIG5ldyBkaXNrIGlub2RlCiAgKiBAaWZpbGU6IGlmaWxlIGlub2RlCkBAIC0xNDgsMyArMTU5LDI3IEBACiAJfQogCXJldHVybiBlcnI7CiB9CisKKy8qKgorICogbmlsZnNfaWZpbGVfbmV3IC0gY3JlYXRlIGlub2RlIGZpbGUKKyAqIEBzYmk6IG5pbGZzX3NiX2luZm8gc3RydWN0CisgKiBAaW5vZGVfc2l6ZTogc2l6ZSBvZiBhbiBpbm9kZQorICovCitzdHJ1Y3QgaW5vZGUgKm5pbGZzX2lmaWxlX25ldyhzdHJ1Y3QgbmlsZnNfc2JfaW5mbyAqc2JpLCBzaXplX3QgaW5vZGVfc2l6ZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlmaWxlOworCWludCBlcnI7CisKKwlpZmlsZSA9IG5pbGZzX21kdF9uZXcoc2JpLT5zX25pbGZzLCBzYmktPnNfc3VwZXIsIE5JTEZTX0lGSUxFX0lOTywKKwkJCSAgICAgIHNpemVvZihzdHJ1Y3QgbmlsZnNfaWZpbGVfaW5mbykpOworCWlmIChpZmlsZSkgeworCQllcnIgPSBuaWxmc19wYWxsb2NfaW5pdF9ibG9ja2dyb3VwKGlmaWxlLCBpbm9kZV9zaXplKTsKKwkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCW5pbGZzX21kdF9kZXN0cm95KGlmaWxlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCW5pbGZzX3BhbGxvY19zZXR1cF9jYWNoZShpZmlsZSwKKwkJCQkJICZOSUxGU19JRklMRV9JKGlmaWxlKS0+cGFsbG9jX2NhY2hlKTsKKwl9CisJcmV0dXJuIGlmaWxlOworfQpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2lmaWxlLmggYi9mcy9uaWxmczIvaWZpbGUuaAppbmRleCBlY2MzYmE3Ni4uY2JjYTMyZSAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2lmaWxlLmgKKysrIGIvZnMvbmlsZnMyL2lmaWxlLmgKQEAgLTQ5LDQgKzQ5LDYgQEAKIGludCBuaWxmc19pZmlsZV9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICosIGlub190KTsKIGludCBuaWxmc19pZmlsZV9nZXRfaW5vZGVfYmxvY2soc3RydWN0IGlub2RlICosIGlub190LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiopOwogCitzdHJ1Y3QgaW5vZGUgKm5pbGZzX2lmaWxlX25ldyhzdHJ1Y3QgbmlsZnNfc2JfaW5mbyAqc2JpLCBzaXplX3QgaW5vZGVfc2l6ZSk7CisKICNlbmRpZgkvKiBfTklMRlNfSUZJTEVfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2lub2RlLmMgYi9mcy9uaWxmczIvaW5vZGUuYwppbmRleCAyYTBhNWEzLi43ODY4Y2MxIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvaW5vZGUuYworKysgYi9mcy9uaWxmczIvaW5vZGUuYwpAQCAtOTcsNiArOTcsNyBAQAogCQkJbmlsZnNfdHJhbnNhY3Rpb25fYWJvcnQoaW5vZGUtPmlfc2IpOwogCQkJZ290byBvdXQ7CiAJCX0KKwkJbmlsZnNfbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJCW5pbGZzX3RyYW5zYWN0aW9uX2NvbW1pdChpbm9kZS0+aV9zYik7IC8qIG5ldmVyIGZhaWxzICovCiAJCS8qIEVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkZXRhaWxlZCAqLwogCQlzZXRfYnVmZmVyX25ldyhiaF9yZXN1bHQpOwpAQCAtMzIyLDcgKzMyMyw2IEBACiAJCQkJICAgIG5pbGZzX2luaXRfYWNsKCksIHByb3BlciBjYW5jZWxsYXRpb24gb2YKIAkJCQkgICAgYWJvdmUgam9icyBzaG91bGQgYmUgY29uc2lkZXJlZCAqLwogCi0JbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJcmV0dXJuIGlub2RlOwogCiAgZmFpbGVkX2FjbDoKQEAgLTUyNSw3ICs1MjUsNiBAQAogCiAJcmF3X2lub2RlID0gbmlsZnNfaWZpbGVfbWFwX2lub2RlKHNiaS0+c19pZmlsZSwgaW5vLCBpYmgpOwogCi0JLyogVGhlIGJ1ZmZlciBpcyBndWFyZGVkIHdpdGggbG9ja19idWZmZXIoKSBieSB0aGUgY2FsbGVyICovCiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChOSUxGU19JX05FVywgJmlpLT5pX3N0YXRlKSkKIAkJbWVtc2V0KHJhd19pbm9kZSwgMCwgTklMRlNfTURUKHNiaS0+c19pZmlsZSktPm1pX2VudHJ5X3NpemUpOwogCXNldF9iaXQoTklMRlNfSV9JTk9ERV9ESVJUWSwgJmlpLT5pX3N0YXRlKTsKQEAgLTU5OSw2ICs1OTgsNyBAQAogCWlmIChJU19TWU5DKGlub2RlKSkKIAkJbmlsZnNfc2V0X3RyYW5zYWN0aW9uX2ZsYWcoTklMRlNfVElfU1lOQyk7CiAKKwluaWxmc19tYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAluaWxmc19zZXRfZmlsZV9kaXJ0eShOSUxGU19TQihzYiksIGlub2RlLCAwKTsKIAluaWxmc190cmFuc2FjdGlvbl9jb21taXQoc2IpOwogCS8qIE1heSBjb25zdHJ1Y3QgYSBsb2dpY2FsIHNlZ21lbnQgYW5kIG1heSBmYWlsIGluIHN5bmMgbW9kZS4KQEAgLTYyMyw2ICs2MjMsNyBAQAogCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CiAKIAluaWxmc190cnVuY2F0ZV9ibWFwKGlpLCAwKTsKKwluaWxmc19tYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAluaWxmc19mcmVlX2lub2RlKGlub2RlKTsKIAkvKiBuaWxmc19mcmVlX2lub2RlKCkgbWFya3MgaW5vZGUgYnVmZmVyIGRpcnR5ICovCiAJaWYgKElTX1NZTkMoaW5vZGUpKQpAQCAtNzQ1LDkgKzc0Niw3IEBACiAJCQkgICAgICAiZmFpbGVkIHRvIHJlZ2V0IGlub2RlIGJsb2NrLlxuIik7CiAJCXJldHVybiBlcnI7CiAJfQotCWxvY2tfYnVmZmVyKGliaCk7CiAJbmlsZnNfdXBkYXRlX2lub2RlKGlub2RlLCBpYmgpOwotCXVubG9ja19idWZmZXIoaWJoKTsKIAluaWxmc19tZHRfbWFya19idWZmZXJfZGlydHkoaWJoKTsKIAluaWxmc19tZHRfbWFya19kaXJ0eShzYmktPnNfaWZpbGUpOwogCWJyZWxzZShpYmgpOwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL21kdC5jIGIvZnMvbmlsZnMyL21kdC5jCmluZGV4IGY2MzI2MTEuLjA2NzEzZmYgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9tZHQuYworKysgYi9mcy9uaWxmczIvbWR0LmMKQEAgLTE4Niw3ICsxODYsNyBAQAogfQogCiBzdGF0aWMgaW50IG5pbGZzX21kdF9yZWFkX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgYmxvY2ssCi0JCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqb3V0X2JoKQorCQkJCWludCByZWFkYWhlYWQsIHN0cnVjdCBidWZmZXJfaGVhZCAqKm91dF9iaCkKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZpcnN0X2JoLCAqYmg7CiAJdW5zaWduZWQgbG9uZyBibGtvZmY7CkBAIC0yMDAsMTYgKzIwMCwxOCBAQAogCWlmICh1bmxpa2VseShlcnIpKQogCQlnb3RvIGZhaWxlZDsKIAotCWJsa29mZiA9IGJsb2NrICsgMTsKLQlmb3IgKGkgPSAwOyBpIDwgbnJfcmFfYmxvY2tzOyBpKyssIGJsa29mZisrKSB7Ci0JCWVyciA9IG5pbGZzX21kdF9zdWJtaXRfYmxvY2soaW5vZGUsIGJsa29mZiwgUkVBREEsICZiaCk7Ci0JCWlmIChsaWtlbHkoIWVyciB8fCBlcnIgPT0gLUVFWElTVCkpCi0JCQlicmVsc2UoYmgpOwotCQllbHNlIGlmIChlcnIgIT0gLUVCVVNZKQotCQkJYnJlYWs7IC8qIGFib3J0IHJlYWRhaGVhZCBpZiBibWFwIGxvb2t1cCBmYWlsZWQgKi8KLQotCQlpZiAoIWJ1ZmZlcl9sb2NrZWQoZmlyc3RfYmgpKQotCQkJZ290byBvdXRfbm9fd2FpdDsKKwlpZiAocmVhZGFoZWFkKSB7CisJCWJsa29mZiA9IGJsb2NrICsgMTsKKwkJZm9yIChpID0gMDsgaSA8IG5yX3JhX2Jsb2NrczsgaSsrLCBibGtvZmYrKykgeworCQkJZXJyID0gbmlsZnNfbWR0X3N1Ym1pdF9ibG9jayhpbm9kZSwgYmxrb2ZmLCBSRUFEQSwgJmJoKTsKKwkJCWlmIChsaWtlbHkoIWVyciB8fCBlcnIgPT0gLUVFWElTVCkpCisJCQkJYnJlbHNlKGJoKTsKKwkJCWVsc2UgaWYgKGVyciAhPSAtRUJVU1kpCisJCQkJYnJlYWs7CisJCQkJLyogYWJvcnQgcmVhZGFoZWFkIGlmIGJtYXAgbG9va3VwIGZhaWxlZCAqLworCQkJaWYgKCFidWZmZXJfbG9ja2VkKGZpcnN0X2JoKSkKKwkJCQlnb3RvIG91dF9ub193YWl0OworCQl9CiAJfQogCiAJd2FpdF9vbl9idWZmZXIoZmlyc3RfYmgpOwpAQCAtMjYzLDcgKzI2NSw3IEBACiAKIAkvKiBTaG91bGQgYmUgcmV3cml0dGVuIHdpdGggbWVyZ2luZyBuaWxmc19tZHRfcmVhZF9ibG9jaygpICovCiAgcmV0cnk6Ci0JcmV0ID0gbmlsZnNfbWR0X3JlYWRfYmxvY2soaW5vZGUsIGJsa29mZiwgb3V0X2JoKTsKKwlyZXQgPSBuaWxmc19tZHRfcmVhZF9ibG9jayhpbm9kZSwgYmxrb2ZmLCAhY3JlYXRlLCBvdXRfYmgpOwogCWlmICghY3JlYXRlIHx8IHJldCAhPSAtRU5PRU5UKQogCQlyZXR1cm4gcmV0OwogCkBAIC0zNzEsNyArMzczLDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCWludCBlcnI7CiAKLQllcnIgPSBuaWxmc19tZHRfcmVhZF9ibG9jayhpbm9kZSwgYmxvY2ssICZiaCk7CisJZXJyID0gbmlsZnNfbWR0X3JlYWRfYmxvY2soaW5vZGUsIGJsb2NrLCAwLCAmYmgpOwogCWlmICh1bmxpa2VseShlcnIpKQogCQlyZXR1cm4gZXJyOwogCW5pbGZzX21hcmtfYnVmZmVyX2RpcnR5KGJoKTsKQEAgLTQ0NSw5ICs0NDcsMTcgQEAKICAqIGxvbmdlciB0aGFuIHRob3NlIG9mIHRoZSBzdXBlciBibG9jayBzdHJ1Y3RzOyB0aGV5IG1heSBjb250aW51ZSBmb3IKICAqIHNldmVyYWwgY29uc2VjdXRpdmUgbW91bnRzL3Vtb3VudHMuICBUaGlzIHdvdWxkIG5lZWQgZGlzY3Vzc2lvbnMuCiAgKi8KKy8qKgorICogbmlsZnNfbWR0X25ld19jb21tb24gLSBhbGxvY2F0ZSBhIHBzZXVkbyBpbm9kZSBmb3IgbWV0YWRhdGEgZmlsZQorICogQG5pbGZzOiBuaWxmcyBvYmplY3QKKyAqIEBzYjogc3VwZXIgYmxvY2sgaW5zdGFuY2UgdGhlIG1ldGFkYXRhIGZpbGUgYmVsb25ncyB0bworICogQGlubzogaW5vZGUgbnVtYmVyCisgKiBAZ2ZwX21hc2s6IGdmcCBtYXNrIGZvciBkYXRhIHBhZ2VzCisgKiBAb2Jqc3o6IHNpemUgb2YgdGhlIHByaXZhdGUgb2JqZWN0IGF0dGFjaGVkIHRvIGlub2RlLT5pX3ByaXZhdGUKKyAqLwogc3RydWN0IGlub2RlICoKIG5pbGZzX21kdF9uZXdfY29tbW9uKHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkgICAgIGlub190IGlubywgZ2ZwX3QgZ2ZwX21hc2spCisJCSAgICAgaW5vX3QgaW5vLCBnZnBfdCBnZnBfbWFzaywgc2l6ZV90IG9ianN6KQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBuaWxmc19hbGxvY19pbm9kZV9jb21tb24obmlsZnMpOwogCkBAIC00NTUsOCArNDY1LDkgQEAKIAkJcmV0dXJuIE5VTEw7CiAJZWxzZSB7CiAJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICogY29uc3QgbWFwcGluZyA9ICZpbm9kZS0+aV9kYXRhOwotCQlzdHJ1Y3QgbmlsZnNfbWR0X2luZm8gKm1pID0ga3phbGxvYyhzaXplb2YoKm1pKSwgR0ZQX05PRlMpOworCQlzdHJ1Y3QgbmlsZnNfbWR0X2luZm8gKm1pOwogCisJCW1pID0ga3phbGxvYyhtYXgoc2l6ZW9mKCptaSksIG9ianN6KSwgR0ZQX05PRlMpOwogCQlpZiAoIW1pKSB7CiAJCQluaWxmc19kZXN0cm95X2lub2RlKGlub2RlKTsKIAkJCXJldHVybiBOVUxMOwpAQCAtNTEzLDExICs1MjQsMTEgQEAKIH0KIAogc3RydWN0IGlub2RlICpuaWxmc19tZHRfbmV3KHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJICAgIGlub190IGlubykKKwkJCSAgICBpbm9fdCBpbm8sIHNpemVfdCBvYmpzeikKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmlsZnNfbWR0X25ld19jb21tb24obmlsZnMsIHNiLCBpbm8sCi0JCQkJCQkgICBOSUxGU19NRFRfR0ZQKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCisJaW5vZGUgPSBuaWxmc19tZHRfbmV3X2NvbW1vbihuaWxmcywgc2IsIGlubywgTklMRlNfTURUX0dGUCwgb2Jqc3opOwogCWlmICghaW5vZGUpCiAJCXJldHVybiBOVUxMOwogCkBAIC01NDQsMTQgKzU1NSwxNSBAQAogCQkmTklMRlNfSShvcmlnKS0+aV9idG5vZGVfY2FjaGU7CiB9CiAKLXZvaWQgbmlsZnNfbWR0X2NsZWFyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgdm9pZCBuaWxmc19tZHRfY2xlYXIoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlzdHJ1Y3QgbmlsZnNfaW5vZGVfaW5mbyAqaWkgPSBOSUxGU19JKGlub2RlKTsKIAogCWludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhpbm9kZS0+aV9tYXBwaW5nLCAwLCAtMSk7CiAJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgMCk7CiAKLQluaWxmc19ibWFwX2NsZWFyKGlpLT5pX2JtYXApOworCWlmICh0ZXN0X2JpdChOSUxGU19JX0JNQVAsICZpaS0+aV9zdGF0ZSkpCisJCW5pbGZzX2JtYXBfY2xlYXIoaWktPmlfYm1hcCk7CiAJbmlsZnNfYnRub2RlX2NhY2hlX2NsZWFyKCZpaS0+aV9idG5vZGVfY2FjaGUpOwogfQogCkBAIC01NTksNiArNTcxLDEwIEBACiB7CiAJc3RydWN0IG5pbGZzX21kdF9pbmZvICptZGkgPSBOSUxGU19NRFQoaW5vZGUpOwogCisJaWYgKG1kaS0+bWlfcGFsbG9jX2NhY2hlKQorCQluaWxmc19wYWxsb2NfZGVzdHJveV9jYWNoZShpbm9kZSk7CisJbmlsZnNfbWR0X2NsZWFyKGlub2RlKTsKKwogCWtmcmVlKG1kaS0+bWlfYmdsKTsgLyoga2ZyZWUoTlVMTCkgaXMgc2FmZSAqLwogCWtmcmVlKG1kaSk7CiAJbmlsZnNfZGVzdHJveV9pbm9kZShpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvbWR0LmggYi9mcy9uaWxmczIvbWR0LmgKaW5kZXggNDMxNTk5Ny4uNmM0YmJiMCAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL21kdC5oCisrKyBiL2ZzL25pbGZzMi9tZHQuaApAQCAtMzYsNiArMzYsNyBAQAogICogQG1pX2VudHJ5X3NpemU6IHNpemUgb2YgYW4gZW50cnkKICAqIEBtaV9maXJzdF9lbnRyeV9vZmZzZXQ6IG9mZnNldCB0byB0aGUgZmlyc3QgZW50cnkKICAqIEBtaV9lbnRyaWVzX3Blcl9ibG9jazogbnVtYmVyIG9mIGVudHJpZXMgaW4gYSBibG9jaworICogQG1pX3BhbGxvY19jYWNoZTogcGVyc2lzdGVudCBvYmplY3QgYWxsb2NhdG9yIGNhY2hlCiAgKiBAbWlfYmxvY2tzX3Blcl9ncm91cDogbnVtYmVyIG9mIGJsb2NrcyBpbiBhIGdyb3VwCiAgKiBAbWlfYmxvY2tzX3Blcl9kZXNjX2Jsb2NrOiBudW1iZXIgb2YgYmxvY2tzIHBlciBkZXNjcmlwdG9yIGJsb2NrCiAgKi8KQEAgLTQ2LDYgKzQ3LDcgQEAKIAl1bnNpZ25lZAkJbWlfZW50cnlfc2l6ZTsKIAl1bnNpZ25lZAkJbWlfZmlyc3RfZW50cnlfb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcJCW1pX2VudHJpZXNfcGVyX2Jsb2NrOworCXN0cnVjdCBuaWxmc19wYWxsb2NfY2FjaGUgKm1pX3BhbGxvY19jYWNoZTsKIAl1bnNpZ25lZCBsb25nCQltaV9ibG9ja3NfcGVyX2dyb3VwOwogCXVuc2lnbmVkIGxvbmcJCW1pX2Jsb2Nrc19wZXJfZGVzY19ibG9jazsKIH07CkBAIC03NCwxMSArNzYsMTEgQEAKIGludCBuaWxmc19tZHRfbWFya19ibG9ja19kaXJ0eShzdHJ1Y3QgaW5vZGUgKiwgdW5zaWduZWQgbG9uZyk7CiBpbnQgbmlsZnNfbWR0X2ZldGNoX2RpcnR5KHN0cnVjdCBpbm9kZSAqKTsKIAotc3RydWN0IGlub2RlICpuaWxmc19tZHRfbmV3KHN0cnVjdCB0aGVfbmlsZnMgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICosIGlub190KTsKK3N0cnVjdCBpbm9kZSAqbmlsZnNfbWR0X25ldyhzdHJ1Y3QgdGhlX25pbGZzICosIHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbm9fdCwKKwkJCSAgICBzaXplX3QpOwogc3RydWN0IGlub2RlICpuaWxmc19tZHRfbmV3X2NvbW1vbihzdHJ1Y3QgdGhlX25pbGZzICosIHN0cnVjdCBzdXBlcl9ibG9jayAqLAotCQkJCSAgIGlub190LCBnZnBfdCk7CisJCQkJICAgaW5vX3QsIGdmcF90LCBzaXplX3QpOwogdm9pZCBuaWxmc19tZHRfZGVzdHJveShzdHJ1Y3QgaW5vZGUgKik7Ci12b2lkIG5pbGZzX21kdF9jbGVhcihzdHJ1Y3QgaW5vZGUgKik7CiB2b2lkIG5pbGZzX21kdF9zZXRfZW50cnlfc2l6ZShzdHJ1Y3QgaW5vZGUgKiwgdW5zaWduZWQsIHVuc2lnbmVkKTsKIHZvaWQgbmlsZnNfbWR0X3NldF9zaGFkb3coc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqKTsKIApAQCAtMTA0LDIxICsxMDYsNCBAQAogI2RlZmluZSBuaWxmc19tZHRfYmdsX2xvY2soaW5vZGUsIGJnKSBcCiAJKCZOSUxGU19NRFQoaW5vZGUpLT5taV9iZ2wtPmxvY2tzWyhiZykgJiAoTlJfQkdfTE9DS1MtMSldLmxvY2spCiAKLQotc3RhdGljIGlubGluZSBpbnQKLW5pbGZzX21kdF9yZWFkX2lub2RlX2RpcmVjdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAotCQkJICAgIHVuc2lnbmVkIG4pCi17Ci0JcmV0dXJuIG5pbGZzX3JlYWRfaW5vZGVfY29tbW9uKAotCQlpbm9kZSwgKHN0cnVjdCBuaWxmc19pbm9kZSAqKShiaC0+Yl9kYXRhICsgbikpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLW5pbGZzX21kdF93cml0ZV9pbm9kZV9kaXJlY3Qoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKLQkJCSAgICAgdW5zaWduZWQgbikKLXsKLQluaWxmc193cml0ZV9pbm9kZV9jb21tb24oCi0JCWlub2RlLCAoc3RydWN0IG5pbGZzX2lub2RlICopKGJoLT5iX2RhdGEgKyBuKSwgMSk7Ci19Ci0KICNlbmRpZiAvKiBfTklMRlNfTURUX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9uYW1laS5jIGIvZnMvbmlsZnMyL25hbWVpLmMKaW5kZXggZWQwMmU4OC4uMDdiYTgzOCAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL25hbWVpLmMKKysrIGIvZnMvbmlsZnMyL25hbWVpLmMKQEAgLTEyMCw3ICsxMjAsNyBAQAogCQlpbm9kZS0+aV9vcCA9ICZuaWxmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX2ZvcCA9ICZuaWxmc19maWxlX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJm5pbGZzX2FvcHM7Ci0JCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQluaWxmc19tYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAkJZXJyID0gbmlsZnNfYWRkX25vbmRpcihkZW50cnksIGlub2RlKTsKIAl9CiAJaWYgKCFlcnIpCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAllcnIgPSBQVFJfRVJSKGlub2RlKTsKIAlpZiAoIUlTX0VSUihpbm9kZSkpIHsKIAkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCByZGV2KTsKLQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCW5pbGZzX21hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCQllcnIgPSBuaWxmc19hZGRfbm9uZGlyKGRlbnRyeSwgaW5vZGUpOwogCX0KIAlpZiAoIWVycikKQEAgLTE4OCw3ICsxODgsNyBAQAogCQlnb3RvIG91dF9mYWlsOwogCiAJLyogbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7ICovCi0JLyogbmlsZnNfbmV3X2lub2RlKCkgYW5kIHBhZ2Vfc3ltbGluaygpIGRvIHRoaXMgKi8KKwkvKiBwYWdlX3N5bWxpbmsoKSBkbyB0aGlzICovCiAKIAllcnIgPSBuaWxmc19hZGRfbm9uZGlyKGRlbnRyeSwgaW5vZGUpOwogb3V0OgpAQCAtMjAwLDcgKzIwMCw4IEBACiAJcmV0dXJuIGVycjsKIAogb3V0X2ZhaWw6Ci0JaW5vZGVfZGVjX2xpbmtfY291bnQoaW5vZGUpOworCWRyb3BfbmxpbmsoaW5vZGUpOworCW5pbGZzX21hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCWlwdXQoaW5vZGUpOwogCWdvdG8gb3V0OwogfQpAQCAtMjQ1LDcgKzI0Niw3IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlub2RlX2luY19saW5rX2NvdW50KGRpcik7CisJaW5jX25saW5rKGRpcik7CiAKIAlpbm9kZSA9IG5pbGZzX25ld19pbm9kZShkaXIsIFNfSUZESVIgfCBtb2RlKTsKIAllcnIgPSBQVFJfRVJSKGlub2RlKTsKQEAgLTI1Niw3ICsyNTcsNyBAQAogCWlub2RlLT5pX2ZvcCA9ICZuaWxmc19kaXJfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZuaWxmc19hb3BzOwogCi0JaW5vZGVfaW5jX2xpbmtfY291bnQoaW5vZGUpOworCWluY19ubGluayhpbm9kZSk7CiAKIAllcnIgPSBuaWxmc19tYWtlX2VtcHR5KGlub2RlLCBkaXIpOwogCWlmIChlcnIpCkBAIC0yNjYsNiArMjY3LDcgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9mYWlsOwogCisJbmlsZnNfbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKIG91dDoKIAlpZiAoIWVycikKQEAgLTI3NiwyNiArMjc4LDIzIEBACiAJcmV0dXJuIGVycjsKIAogb3V0X2ZhaWw6Ci0JaW5vZGVfZGVjX2xpbmtfY291bnQoaW5vZGUpOwotCWlub2RlX2RlY19saW5rX2NvdW50KGlub2RlKTsKKwlkcm9wX25saW5rKGlub2RlKTsKKwlkcm9wX25saW5rKGlub2RlKTsKKwluaWxmc19tYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAlpcHV0KGlub2RlKTsKIG91dF9kaXI6Ci0JaW5vZGVfZGVjX2xpbmtfY291bnQoZGlyKTsKKwlkcm9wX25saW5rKGRpcik7CisJbmlsZnNfbWFya19pbm9kZV9kaXJ0eShkaXIpOwogCWdvdG8gb3V0OwogfQogCi1zdGF0aWMgaW50IG5pbGZzX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQorc3RhdGljIGludCBuaWxmc19kb191bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBuaWxmc19kaXJfZW50cnkgKmRlOwogCXN0cnVjdCBwYWdlICpwYWdlOwotCXN0cnVjdCBuaWxmc190cmFuc2FjdGlvbl9pbmZvIHRpOwogCWludCBlcnI7CiAKLQllcnIgPSBuaWxmc190cmFuc2FjdGlvbl9iZWdpbihkaXItPmlfc2IsICZ0aSwgMCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQogCWVyciA9IC1FTk9FTlQ7CiAJZGUgPSBuaWxmc19maW5kX2VudHJ5KGRpciwgZGVudHJ5LCAmcGFnZSk7CiAJaWYgKCFkZSkKQEAgLTMxNywxMiArMzE2LDI4IEBACiAJCWdvdG8gb3V0OwogCiAJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWU7Ci0JaW5vZGVfZGVjX2xpbmtfY291bnQoaW5vZGUpOworCWRyb3BfbmxpbmsoaW5vZGUpOwogCWVyciA9IDA7CiBvdXQ6Ci0JaWYgKCFlcnIpCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBuaWxmc191bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgbmlsZnNfdHJhbnNhY3Rpb25faW5mbyB0aTsKKwlpbnQgZXJyOworCisJZXJyID0gbmlsZnNfdHJhbnNhY3Rpb25fYmVnaW4oZGlyLT5pX3NiLCAmdGksIDApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBuaWxmc19kb191bmxpbmsoZGlyLCBkZW50cnkpOworCisJaWYgKCFlcnIpIHsKKwkJbmlsZnNfbWFya19pbm9kZV9kaXJ0eShkaXIpOworCQluaWxmc19tYXJrX2lub2RlX2RpcnR5KGRlbnRyeS0+ZF9pbm9kZSk7CiAJCWVyciA9IG5pbGZzX3RyYW5zYWN0aW9uX2NvbW1pdChkaXItPmlfc2IpOwotCWVsc2UKKwl9IGVsc2UKIAkJbmlsZnNfdHJhbnNhY3Rpb25fYWJvcnQoZGlyLT5pX3NiKTsKIAogCXJldHVybiBlcnI7CkBAIC0zNDAsMTEgKzM1NSwxMyBAQAogCiAJZXJyID0gLUVOT1RFTVBUWTsKIAlpZiAobmlsZnNfZW1wdHlfZGlyKGlub2RlKSkgewotCQllcnIgPSBuaWxmc191bmxpbmsoZGlyLCBkZW50cnkpOworCQllcnIgPSBuaWxmc19kb191bmxpbmsoZGlyLCBkZW50cnkpOwogCQlpZiAoIWVycikgewogCQkJaW5vZGUtPmlfc2l6ZSA9IDA7Ci0JCQlpbm9kZV9kZWNfbGlua19jb3VudChpbm9kZSk7Ci0JCQlpbm9kZV9kZWNfbGlua19jb3VudChkaXIpOworCQkJZHJvcF9ubGluayhpbm9kZSk7CisJCQluaWxmc19tYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJCWRyb3BfbmxpbmsoZGlyKTsKKwkJCW5pbGZzX21hcmtfaW5vZGVfZGlydHkoZGlyKTsKIAkJfQogCX0KIAlpZiAoIWVycikKQEAgLTM5NSw0MiArNDEyLDQ4IEBACiAJCW5ld19kZSA9IG5pbGZzX2ZpbmRfZW50cnkobmV3X2RpciwgbmV3X2RlbnRyeSwgJm5ld19wYWdlKTsKIAkJaWYgKCFuZXdfZGUpCiAJCQlnb3RvIG91dF9kaXI7Ci0JCWlub2RlX2luY19saW5rX2NvdW50KG9sZF9pbm9kZSk7CisJCWluY19ubGluayhvbGRfaW5vZGUpOwogCQluaWxmc19zZXRfbGluayhuZXdfZGlyLCBuZXdfZGUsIG5ld19wYWdlLCBvbGRfaW5vZGUpOworCQluaWxmc19tYXJrX2lub2RlX2RpcnR5KG5ld19kaXIpOwogCQluZXdfaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJCWlmIChkaXJfZGUpCiAJCQlkcm9wX25saW5rKG5ld19pbm9kZSk7Ci0JCWlub2RlX2RlY19saW5rX2NvdW50KG5ld19pbm9kZSk7CisJCWRyb3BfbmxpbmsobmV3X2lub2RlKTsKKwkJbmlsZnNfbWFya19pbm9kZV9kaXJ0eShuZXdfaW5vZGUpOwogCX0gZWxzZSB7CiAJCWlmIChkaXJfZGUpIHsKIAkJCWVyciA9IC1FTUxJTks7CiAJCQlpZiAobmV3X2Rpci0+aV9ubGluayA+PSBOSUxGU19MSU5LX01BWCkKIAkJCQlnb3RvIG91dF9kaXI7CiAJCX0KLQkJaW5vZGVfaW5jX2xpbmtfY291bnQob2xkX2lub2RlKTsKKwkJaW5jX25saW5rKG9sZF9pbm9kZSk7CiAJCWVyciA9IG5pbGZzX2FkZF9saW5rKG5ld19kZW50cnksIG9sZF9pbm9kZSk7CiAJCWlmIChlcnIpIHsKLQkJCWlub2RlX2RlY19saW5rX2NvdW50KG9sZF9pbm9kZSk7CisJCQlkcm9wX25saW5rKG9sZF9pbm9kZSk7CisJCQluaWxmc19tYXJrX2lub2RlX2RpcnR5KG9sZF9pbm9kZSk7CiAJCQlnb3RvIG91dF9kaXI7CiAJCX0KLQkJaWYgKGRpcl9kZSkKLQkJCWlub2RlX2luY19saW5rX2NvdW50KG5ld19kaXIpOworCQlpZiAoZGlyX2RlKSB7CisJCQlpbmNfbmxpbmsobmV3X2Rpcik7CisJCQluaWxmc19tYXJrX2lub2RlX2RpcnR5KG5ld19kaXIpOworCQl9CiAJfQogCiAJLyoKIAkgKiBMaWtlIG1vc3Qgb3RoZXIgVW5peCBzeXN0ZW1zLCBzZXQgdGhlIGN0aW1lIGZvciBpbm9kZXMgb24gYQogCSAqIHJlbmFtZS4KLQkgKiBpbm9kZV9kZWNfbGlua19jb3VudCgpIHdpbGwgbWFyayB0aGUgaW5vZGUgZGlydHkuCiAJICovCiAJb2xkX2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCiAJbmlsZnNfZGVsZXRlX2VudHJ5KG9sZF9kZSwgb2xkX3BhZ2UpOwotCWlub2RlX2RlY19saW5rX2NvdW50KG9sZF9pbm9kZSk7CisJZHJvcF9ubGluayhvbGRfaW5vZGUpOwogCiAJaWYgKGRpcl9kZSkgewogCQluaWxmc19zZXRfbGluayhvbGRfaW5vZGUsIGRpcl9kZSwgZGlyX3BhZ2UsIG5ld19kaXIpOwotCQlpbm9kZV9kZWNfbGlua19jb3VudChvbGRfZGlyKTsKKwkJZHJvcF9ubGluayhvbGRfZGlyKTsKIAl9CisJbmlsZnNfbWFya19pbm9kZV9kaXJ0eShvbGRfZGlyKTsKKwluaWxmc19tYXJrX2lub2RlX2RpcnR5KG9sZF9pbm9kZSk7CiAKIAllcnIgPSBuaWxmc190cmFuc2FjdGlvbl9jb21taXQob2xkX2Rpci0+aV9zYik7CiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9yZWNvdmVyeS5jIGIvZnMvbmlsZnMyL3JlY292ZXJ5LmMKaW5kZXggNmRjODM1OS4uYzljOTZjNyAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL3JlY292ZXJ5LmMKKysrIGIvZnMvbmlsZnMyL3JlY292ZXJ5LmMKQEAgLTc3MCwxNCArNzcwLDggQEAKIAkJbmlsZnNfZmluaXNoX3JvbGxfZm9yd2FyZChuaWxmcywgc2JpLCByaSk7CiAJfQogCi0JbmlsZnNfZGV0YWNoX2NoZWNrcG9pbnQoc2JpKTsKLQlyZXR1cm4gMDsKLQogIGZhaWxlZDoKIAluaWxmc19kZXRhY2hfY2hlY2twb2ludChzYmkpOwotCW5pbGZzX21kdF9jbGVhcihuaWxmcy0+bnNfY3BmaWxlKTsKLQluaWxmc19tZHRfY2xlYXIobmlsZnMtPm5zX3N1ZmlsZSk7Ci0JbmlsZnNfbWR0X2NsZWFyKG5pbGZzLT5uc19kYXQpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTgwNCw2ICs3OTgsNyBAQAogCXN0cnVjdCBuaWxmc19zZWdzdW1faW5mbyBzc2k7CiAJc2VjdG9yX3QgcHNlZ19zdGFydCwgcHNlZ19lbmQsIHNyX3BzZWdfc3RhcnQgPSAwOwogCXNlY3Rvcl90IHNlZ19zdGFydCwgc2VnX2VuZDsgLyogcmFuZ2Ugb2YgZnVsbCBzZWdtZW50IChibG9jayBudW1iZXIpICovCisJc2VjdG9yX3QgYiwgZW5kOwogCXU2NCBzZWdfc2VxOwogCV9fdTY0IHNlZ251bSwgbmV4dG51bSA9IDA7CiAJX191NjQgY25vOwpAQCAtODE5LDYgKzgxNCwxMSBAQAogCS8qIENhbGN1bGF0ZSByYW5nZSBvZiBzZWdtZW50ICovCiAJbmlsZnNfZ2V0X3NlZ21lbnRfcmFuZ2UobmlsZnMsIHNlZ251bSwgJnNlZ19zdGFydCwgJnNlZ19lbmQpOwogCisJLyogUmVhZCBhaGVhZCBzZWdtZW50ICovCisJYiA9IHNlZ19zdGFydDsKKwl3aGlsZSAoYiA8PSBzZWdfZW5kKQorCQlzYl9icmVhZGFoZWFkKHNiaS0+c19zdXBlciwgYisrKTsKKwogCWZvciAoOzspIHsKIAkJLyogTG9hZCBzZWdtZW50IHN1bW1hcnkgKi8KIAkJcmV0ID0gbG9hZF9zZWdtZW50X3N1bW1hcnkoc2JpLCBwc2VnX3N0YXJ0LCBzZWdfc2VxLCAmc3NpLCAxKTsKQEAgLTg0MSwxNCArODQxLDIwIEBACiAJCXJpLT5yaV9uZXh0bnVtID0gbmV4dG51bTsKIAkJZW1wdHlfc2VnID0gMDsKIAorCQlpZiAoIU5JTEZTX1NFR19IQVNfU1IoJnNzaSkgJiYgIXNjYW5fbmV3ZXIpIHsKKwkJCS8qIFRoaXMgd2lsbCBuZXZlciBoYXBwZW4gYmVjYXVzZSBhIHN1cGVyYmxvY2sKKwkJCSAgIChsYXN0X3NlZ21lbnQpIGFsd2F5cyBwb2ludHMgdG8gYSBwc2VnCisJCQkgICBoYXZpbmcgYSBzdXBlciByb290LiAqLworCQkJcmV0ID0gTklMRlNfU0VHX0ZBSUxfQ09OU0lTVEVOQ1k7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCisJCWlmIChwc2VnX3N0YXJ0ID09IHNlZ19zdGFydCkgeworCQkJbmlsZnNfZ2V0X3NlZ21lbnRfcmFuZ2UobmlsZnMsIG5leHRudW0sICZiLCAmZW5kKTsKKwkJCXdoaWxlIChiIDw9IGVuZCkKKwkJCQlzYl9icmVhZGFoZWFkKHNiaS0+c19zdXBlciwgYisrKTsKKwkJfQogCQlpZiAoIU5JTEZTX1NFR19IQVNfU1IoJnNzaSkpIHsKLQkJCWlmICghc2Nhbl9uZXdlcikgewotCQkJCS8qIFRoaXMgd2lsbCBuZXZlciBoYXBwZW4gYmVjYXVzZSBhIHN1cGVyYmxvY2sKLQkJCQkgICAobGFzdF9zZWdtZW50KSBhbHdheXMgcG9pbnRzIHRvIGEgcHNlZwotCQkJCSAgIGhhdmluZyBhIHN1cGVyIHJvb3QuICovCi0JCQkJcmV0ID0gTklMRlNfU0VHX0ZBSUxfQ09OU0lTVEVOQ1k7Ci0JCQkJZ290byBmYWlsZWQ7Ci0JCQl9CiAJCQlpZiAoIXJpLT5yaV9sc2Vnc19zdGFydCAmJiBOSUxGU19TRUdfTE9HQkdOKCZzc2kpKSB7CiAJCQkJcmktPnJpX2xzZWdzX3N0YXJ0ID0gcHNlZ19zdGFydDsKIAkJCQlyaS0+cmlfbHNlZ3Nfc3RhcnRfc2VxID0gc2VnX3NlcTsKQEAgLTkxOSw3ICs5MjUsNyBAQAogCiAgc3VwZXJfcm9vdF9mb3VuZDoKIAkvKiBVcGRhdGluZyBwb2ludGVycyByZWxhdGluZyB0byB0aGUgbGF0ZXN0IGNoZWNrcG9pbnQgKi8KLQlsaXN0X3NwbGljZSgmc2VnbWVudHMsIHJpLT5yaV91c2VkX3NlZ21lbnRzLnByZXYpOworCWxpc3Rfc3BsaWNlX3RhaWwoJnNlZ21lbnRzLCAmcmktPnJpX3VzZWRfc2VnbWVudHMpOwogCW5pbGZzLT5uc19sYXN0X3BzZWcgPSBzcl9wc2VnX3N0YXJ0OwogCW5pbGZzLT5uc19sYXN0X3NlcSA9IG5pbGZzLT5uc19zZWdfc2VxOwogCW5pbGZzLT5uc19sYXN0X2NubyA9IHJpLT5yaV9jbm87CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvc2VnYnVmLmMgYi9mcy9uaWxmczIvc2VnYnVmLmMKaW5kZXggZTZkOWUzNy4uNjQ1Yzc4NiAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL3NlZ2J1Zi5jCisrKyBiL2ZzL25pbGZzMi9zZWdidWYuYwpAQCAtMjQsMTAgKzI0LDIyIEBACiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CiAjaW5jbHVkZSAicGFnZS5oIgogI2luY2x1ZGUgInNlZ2J1Zi5oIgogCiAKK3N0cnVjdCBuaWxmc193cml0ZV9pbmZvIHsKKwlzdHJ1Y3QgdGhlX25pbGZzICAgICAgICpuaWxmczsKKwlzdHJ1Y3QgYmlvCSAgICAgICAqYmlvOworCWludCAJCQlzdGFydCwgZW5kOyAvKiBUaGUgcmVnaW9uIHRvIGJlIHN1Ym1pdHRlZCAqLworCWludAkJCXJlc3RfYmxvY2tzOworCWludAkJCW1heF9wYWdlczsKKwlpbnQJCQlucl92ZWNzOworCXNlY3Rvcl90CQlibG9ja25yOworfTsKKworCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKm5pbGZzX3NlZ2J1Zl9jYWNoZXA7CiAKIHN0YXRpYyB2b2lkIG5pbGZzX3NlZ2J1Zl9pbml0X29uY2Uodm9pZCAqb2JqKQpAQCAtNjMsNiArNzUsMTEgQEAKIAlJTklUX0xJU1RfSEVBRCgmc2VnYnVmLT5zYl9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmc2VnYnVmLT5zYl9zZWdzdW1fYnVmZmVycyk7CiAJSU5JVF9MSVNUX0hFQUQoJnNlZ2J1Zi0+c2JfcGF5bG9hZF9idWZmZXJzKTsKKworCWluaXRfY29tcGxldGlvbigmc2VnYnVmLT5zYl9iaW9fZXZlbnQpOworCWF0b21pY19zZXQoJnNlZ2J1Zi0+c2JfZXJyLCAwKTsKKwlzZWdidWYtPnNiX25iaW8gPSAwOworCiAJcmV0dXJuIHNlZ2J1ZjsKIH0KIApAQCAtODMsNiArMTAwLDIyIEBACiAJCXNlZ2J1Zi0+c2JfZnNlZ19lbmQgLSBzZWdidWYtPnNiX3BzZWdfc3RhcnQgKyAxOwogfQogCisvKioKKyAqIG5pbGZzX3NlZ2J1Zl9tYXBfY29udCAtIG1hcCBhIG5ldyBsb2cgYmVoaW5kIGEgZ2l2ZW4gbG9nCisgKiBAc2VnYnVmOiBuZXcgc2VnbWVudCBidWZmZXIKKyAqIEBwcmV2OiBzZWdtZW50IGJ1ZmZlciBjb250YWluaW5nIGEgbG9nIHRvIGJlIGNvbnRpbnVlZAorICovCit2b2lkIG5pbGZzX3NlZ2J1Zl9tYXBfY29udChzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZiwKKwkJCSAgIHN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqcHJldikKK3sKKwlzZWdidWYtPnNiX3NlZ251bSA9IHByZXYtPnNiX3NlZ251bTsKKwlzZWdidWYtPnNiX2ZzZWdfc3RhcnQgPSBwcmV2LT5zYl9mc2VnX3N0YXJ0OworCXNlZ2J1Zi0+c2JfZnNlZ19lbmQgPSBwcmV2LT5zYl9mc2VnX2VuZDsKKwlzZWdidWYtPnNiX3BzZWdfc3RhcnQgPSBwcmV2LT5zYl9wc2VnX3N0YXJ0ICsgcHJldi0+c2Jfc3VtLm5ibG9ja3M7CisJc2VnYnVmLT5zYl9yZXN0X2Jsb2NrcyA9CisJCXNlZ2J1Zi0+c2JfZnNlZ19lbmQgLSBzZWdidWYtPnNiX3BzZWdfc3RhcnQgKyAxOworfQorCiB2b2lkIG5pbGZzX3NlZ2J1Zl9zZXRfbmV4dF9zZWdudW0oc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpzZWdidWYsCiAJCQkJICBfX3U2NCBuZXh0bnVtLCBzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcykKIHsKQEAgLTEzMiw4ICsxNjUsNiBAQAogCXNlZ2J1Zi0+c2Jfc3VtLnN1bWJ5dGVzID0gc2l6ZW9mKHN0cnVjdCBuaWxmc19zZWdtZW50X3N1bW1hcnkpOwogCXNlZ2J1Zi0+c2Jfc3VtLm5maW5mbyA9IHNlZ2J1Zi0+c2Jfc3VtLm5maWxlYmxrID0gMDsKIAlzZWdidWYtPnNiX3N1bS5jdGltZSA9IGN0aW1lOwotCi0Jc2VnYnVmLT5zYl9pb19lcnJvciA9IDA7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxOSw3ICsyNTAsNyBAQAogCXJhd19zdW0tPnNzX2RhdGFzdW0gPSBjcHVfdG9fbGUzMihjcmMpOwogfQogCi12b2lkIG5pbGZzX3JlbGVhc2VfYnVmZmVycyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQorc3RhdGljIHZvaWQgbmlsZnNfcmVsZWFzZV9idWZmZXJzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKm47CiAKQEAgLTI0MSwxMyArMjcyLDU2IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBuaWxmc19zZWdidWZfY2xlYXIoc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpzZWdidWYpCit7CisJbmlsZnNfcmVsZWFzZV9idWZmZXJzKCZzZWdidWYtPnNiX3NlZ3N1bV9idWZmZXJzKTsKKwluaWxmc19yZWxlYXNlX2J1ZmZlcnMoJnNlZ2J1Zi0+c2JfcGF5bG9hZF9idWZmZXJzKTsKK30KKworLyoKKyAqIEl0ZXJhdG9ycyBmb3Igc2VnbWVudCBidWZmZXJzCisgKi8KK3ZvaWQgbmlsZnNfY2xlYXJfbG9ncyhzdHJ1Y3QgbGlzdF9oZWFkICpsb2dzKQoreworCXN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZWdidWYsIGxvZ3MsIHNiX2xpc3QpCisJCW5pbGZzX3NlZ2J1Zl9jbGVhcihzZWdidWYpOworfQorCit2b2lkIG5pbGZzX3RydW5jYXRlX2xvZ3Moc3RydWN0IGxpc3RfaGVhZCAqbG9ncywKKwkJCSBzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKmxhc3QpCit7CisJc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpuLCAqc2VnYnVmOworCisJc2VnYnVmID0gbGlzdF9wcmVwYXJlX2VudHJ5KGxhc3QsIGxvZ3MsIHNiX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9jb250aW51ZShzZWdidWYsIG4sIGxvZ3MsIHNiX2xpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmc2VnYnVmLT5zYl9saXN0KTsKKwkJbmlsZnNfc2VnYnVmX2NsZWFyKHNlZ2J1Zik7CisJCW5pbGZzX3NlZ2J1Zl9mcmVlKHNlZ2J1Zik7CisJfQorfQorCitpbnQgbmlsZnNfd2FpdF9vbl9sb2dzKHN0cnVjdCBsaXN0X2hlYWQgKmxvZ3MpCit7CisJc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpzZWdidWY7CisJaW50IGVycjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VnYnVmLCBsb2dzLCBzYl9saXN0KSB7CisJCWVyciA9IG5pbGZzX3NlZ2J1Zl93YWl0KHNlZ2J1Zik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIEJJTyBvcGVyYXRpb25zCiAgKi8KIHN0YXRpYyB2b2lkIG5pbGZzX2VuZF9iaW9fd3JpdGUoc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyKQogewogCWNvbnN0IGludCB1cHRvZGF0ZSA9IHRlc3RfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpOwotCXN0cnVjdCBuaWxmc193cml0ZV9pbmZvICp3aSA9IGJpby0+YmlfcHJpdmF0ZTsKKwlzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZiA9IGJpby0+YmlfcHJpdmF0ZTsKIAogCWlmIChlcnIgPT0gLUVPUE5PVFNVUFApIHsKIAkJc2V0X2JpdChCSU9fRU9QTk9UU1VQUCwgJmJpby0+YmlfZmxhZ3MpOwpAQCAtMjU2LDIxICszMzAsMjIgQEAKIAl9CiAKIAlpZiAoIXVwdG9kYXRlKQotCQlhdG9taWNfaW5jKCZ3aS0+ZXJyKTsKKwkJYXRvbWljX2luYygmc2VnYnVmLT5zYl9lcnIpOwogCiAJYmlvX3B1dChiaW8pOwotCWNvbXBsZXRlKCZ3aS0+YmlvX2V2ZW50KTsKKwljb21wbGV0ZSgmc2VnYnVmLT5zYl9iaW9fZXZlbnQpOwogfQogCi1zdGF0aWMgaW50IG5pbGZzX3N1Ym1pdF9zZWdfYmlvKHN0cnVjdCBuaWxmc193cml0ZV9pbmZvICp3aSwgaW50IG1vZGUpCitzdGF0aWMgaW50IG5pbGZzX3NlZ2J1Zl9zdWJtaXRfYmlvKHN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmLAorCQkJCSAgIHN0cnVjdCBuaWxmc193cml0ZV9pbmZvICp3aSwgaW50IG1vZGUpCiB7CiAJc3RydWN0IGJpbyAqYmlvID0gd2ktPmJpbzsKIAlpbnQgZXJyOwogCi0JaWYgKHdpLT5uYmlvID4gMCAmJiBiZGlfd3JpdGVfY29uZ2VzdGVkKHdpLT5iZGkpKSB7Ci0JCXdhaXRfZm9yX2NvbXBsZXRpb24oJndpLT5iaW9fZXZlbnQpOwotCQl3aS0+bmJpby0tOwotCQlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJndpLT5lcnIpKSkgeworCWlmIChzZWdidWYtPnNiX25iaW8gPiAwICYmIGJkaV93cml0ZV9jb25nZXN0ZWQod2ktPm5pbGZzLT5uc19iZGkpKSB7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnNlZ2J1Zi0+c2JfYmlvX2V2ZW50KTsKKwkJc2VnYnVmLT5zYl9uYmlvLS07CisJCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmc2VnYnVmLT5zYl9lcnIpKSkgewogCQkJYmlvX3B1dChiaW8pOwogCQkJZXJyID0gLUVJTzsKIAkJCWdvdG8gZmFpbGVkOwpAQCAtMjc4LDcgKzM1Myw3IEBACiAJfQogCiAJYmlvLT5iaV9lbmRfaW8gPSBuaWxmc19lbmRfYmlvX3dyaXRlOwotCWJpby0+YmlfcHJpdmF0ZSA9IHdpOworCWJpby0+YmlfcHJpdmF0ZSA9IHNlZ2J1ZjsKIAliaW9fZ2V0KGJpbyk7CiAJc3VibWl0X2Jpbyhtb2RlLCBiaW8pOwogCWlmIChiaW9fZmxhZ2dlZChiaW8sIEJJT19FT1BOT1RTVVBQKSkgewpAQCAtMjg2LDcgKzM2MSw3IEBACiAJCWVyciA9IC1FT1BOT1RTVVBQOwogCQlnb3RvIGZhaWxlZDsKIAl9Ci0Jd2ktPm5iaW8rKzsKKwlzZWdidWYtPnNiX25iaW8rKzsKIAliaW9fcHV0KGJpbyk7CiAKIAl3aS0+YmlvID0gTlVMTDsKQEAgLTMwMSwxNyArMzc2LDE1IEBACiB9CiAKIC8qKgotICogbmlsZnNfYWxsb2Nfc2VnX2JpbyAtIGFsbG9jYXRlIGEgYmlvIGZvciB3cml0aW5nIHNlZ21lbnQuCi0gKiBAc2I6IHN1cGVyIGJsb2NrCi0gKiBAc3RhcnQ6IGJlZ2lubmluZyBkaXNrIGJsb2NrIG51bWJlciBvZiB0aGlzIEJJTy4KKyAqIG5pbGZzX2FsbG9jX3NlZ19iaW8gLSBhbGxvY2F0ZSBhIG5ldyBiaW8gZm9yIHdyaXRpbmcgbG9nCisgKiBAbmlsZnM6IG5pbGZzIG9iamVjdAorICogQHN0YXJ0OiBzdGFydCBibG9jayBudW1iZXIgb2YgdGhlIGJpbwogICogQG5yX3ZlY3M6IHJlcXVlc3Qgc2l6ZSBvZiBwYWdlIHZlY3Rvci4KICAqCi0gKiBhbGxvY19zZWdfYmlvKCkgYWxsb2NhdGVzIGEgbmV3IEJJTyBzdHJ1Y3R1cmUgYW5kIGluaXRpYWxpemUgaXQuCi0gKgogICogUmV0dXJuIFZhbHVlOiBPbiBzdWNjZXNzLCBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgYmlvIGlzIHJldHVybmVkLgogICogT24gZXJyb3IsIE5VTEwgaXMgcmV0dXJuZWQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYmlvICpuaWxmc19hbGxvY19zZWdfYmlvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHNlY3Rvcl90IHN0YXJ0LAorc3RhdGljIHN0cnVjdCBiaW8gKm5pbGZzX2FsbG9jX3NlZ19iaW8oc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMsIHNlY3Rvcl90IHN0YXJ0LAogCQkJCSAgICAgICBpbnQgbnJfdmVjcykKIHsKIAlzdHJ1Y3QgYmlvICpiaW87CkBAIC0zMjIsMzYgKzM5NSwzMyBAQAogCQkJYmlvID0gYmlvX2FsbG9jKEdGUF9OT0lPLCBucl92ZWNzKTsKIAl9CiAJaWYgKGxpa2VseShiaW8pKSB7Ci0JCWJpby0+YmlfYmRldiA9IHNiLT5zX2JkZXY7Ci0JCWJpby0+Ymlfc2VjdG9yID0gKHNlY3Rvcl90KXN0YXJ0IDw8IChzYi0+c19ibG9ja3NpemVfYml0cyAtIDkpOworCQliaW8tPmJpX2JkZXYgPSBuaWxmcy0+bnNfYmRldjsKKwkJYmlvLT5iaV9zZWN0b3IgPSBzdGFydCA8PCAobmlsZnMtPm5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSk7CiAJfQogCXJldHVybiBiaW87CiB9CiAKLXZvaWQgbmlsZnNfc2VnYnVmX3ByZXBhcmVfd3JpdGUoc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpzZWdidWYsCi0JCQkJc3RydWN0IG5pbGZzX3dyaXRlX2luZm8gKndpKQorc3RhdGljIHZvaWQgbmlsZnNfc2VnYnVmX3ByZXBhcmVfd3JpdGUoc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpzZWdidWYsCisJCQkJICAgICAgIHN0cnVjdCBuaWxmc193cml0ZV9pbmZvICp3aSkKIHsKIAl3aS0+YmlvID0gTlVMTDsKIAl3aS0+cmVzdF9ibG9ja3MgPSBzZWdidWYtPnNiX3N1bS5uYmxvY2tzOwotCXdpLT5tYXhfcGFnZXMgPSBiaW9fZ2V0X25yX3ZlY3Mod2ktPnNiLT5zX2JkZXYpOworCXdpLT5tYXhfcGFnZXMgPSBiaW9fZ2V0X25yX3ZlY3Mod2ktPm5pbGZzLT5uc19iZGV2KTsKIAl3aS0+bnJfdmVjcyA9IG1pbih3aS0+bWF4X3BhZ2VzLCB3aS0+cmVzdF9ibG9ja3MpOwogCXdpLT5zdGFydCA9IHdpLT5lbmQgPSAwOwotCXdpLT5uYmlvID0gMDsKIAl3aS0+YmxvY2tuciA9IHNlZ2J1Zi0+c2JfcHNlZ19zdGFydDsKLQotCWF0b21pY19zZXQoJndpLT5lcnIsIDApOwotCWluaXRfY29tcGxldGlvbigmd2ktPmJpb19ldmVudCk7CiB9CiAKLXN0YXRpYyBpbnQgbmlsZnNfc3VibWl0X2JoKHN0cnVjdCBuaWxmc193cml0ZV9pbmZvICp3aSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKLQkJCSAgIGludCBtb2RlKQorc3RhdGljIGludCBuaWxmc19zZWdidWZfc3VibWl0X2JoKHN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmLAorCQkJCSAgc3RydWN0IG5pbGZzX3dyaXRlX2luZm8gKndpLAorCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IG1vZGUpCiB7CiAJaW50IGxlbiwgZXJyOwogCiAJQlVHX09OKHdpLT5ucl92ZWNzIDw9IDApOwogIHJlcGVhdDoKIAlpZiAoIXdpLT5iaW8pIHsKLQkJd2ktPmJpbyA9IG5pbGZzX2FsbG9jX3NlZ19iaW8od2ktPnNiLCB3aS0+YmxvY2tuciArIHdpLT5lbmQsCisJCXdpLT5iaW8gPSBuaWxmc19hbGxvY19zZWdfYmlvKHdpLT5uaWxmcywgd2ktPmJsb2NrbnIgKyB3aS0+ZW5kLAogCQkJCQkgICAgICB3aS0+bnJfdmVjcyk7CiAJCWlmICh1bmxpa2VseSghd2ktPmJpbykpCiAJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTM2Myw3NiArNDMzLDgzIEBACiAJCXJldHVybiAwOwogCX0KIAkvKiBiaW8gaXMgRlVMTCAqLwotCWVyciA9IG5pbGZzX3N1Ym1pdF9zZWdfYmlvKHdpLCBtb2RlKTsKKwllcnIgPSBuaWxmc19zZWdidWZfc3VibWl0X2JpbyhzZWdidWYsIHdpLCBtb2RlKTsKIAkvKiBuZXZlciBzdWJtaXQgY3VycmVudCBiaCAqLwogCWlmIChsaWtlbHkoIWVycikpCiAJCWdvdG8gcmVwZWF0OwogCXJldHVybiBlcnI7CiB9CiAKKy8qKgorICogbmlsZnNfc2VnYnVmX3dyaXRlIC0gc3VibWl0IHdyaXRlIHJlcXVlc3RzIG9mIGEgbG9nCisgKiBAc2VnYnVmOiBidWZmZXIgc3RvcmluZyBhIGxvZyB0byBiZSB3cml0dGVuCisgKiBAbmlsZnM6IG5pbGZzIG9iamVjdAorICoKKyAqIFJldHVybiBWYWx1ZTogT24gU3VjY2VzcywgMCBpcyByZXR1cm5lZC4gT24gRXJyb3IsIG9uZSBvZiB0aGUgZm9sbG93aW5nCisgKiBuZWdhdGl2ZSBlcnJvciBjb2RlIGlzIHJldHVybmVkLgorICoKKyAqICUtRUlPIC0gSS9PIGVycm9yCisgKgorICogJS1FTk9NRU0gLSBJbnN1ZmZpY2llbnQgbWVtb3J5IGF2YWlsYWJsZS4KKyAqLwogaW50IG5pbGZzX3NlZ2J1Zl93cml0ZShzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZiwKLQkJICAgICAgIHN0cnVjdCBuaWxmc193cml0ZV9pbmZvICp3aSkKKwkJICAgICAgIHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzKQogeworCXN0cnVjdCBuaWxmc193cml0ZV9pbmZvIHdpOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7Ci0JaW50IHJlcywgcncgPSBXUklURTsKKwlpbnQgcmVzID0gMCwgcncgPSBXUklURTsKKworCXdpLm5pbGZzID0gbmlsZnM7CisJbmlsZnNfc2VnYnVmX3ByZXBhcmVfd3JpdGUoc2VnYnVmLCAmd2kpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShiaCwgJnNlZ2J1Zi0+c2Jfc2Vnc3VtX2J1ZmZlcnMsIGJfYXNzb2NfYnVmZmVycykgewotCQlyZXMgPSBuaWxmc19zdWJtaXRfYmgod2ksIGJoLCBydyk7CisJCXJlcyA9IG5pbGZzX3NlZ2J1Zl9zdWJtaXRfYmgoc2VnYnVmLCAmd2ksIGJoLCBydyk7CiAJCWlmICh1bmxpa2VseShyZXMpKQogCQkJZ290byBmYWlsZWRfYmlvOwogCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoYmgsICZzZWdidWYtPnNiX3BheWxvYWRfYnVmZmVycywgYl9hc3NvY19idWZmZXJzKSB7Ci0JCXJlcyA9IG5pbGZzX3N1Ym1pdF9iaCh3aSwgYmgsIHJ3KTsKKwkJcmVzID0gbmlsZnNfc2VnYnVmX3N1Ym1pdF9iaChzZWdidWYsICZ3aSwgYmgsIHJ3KTsKIAkJaWYgKHVubGlrZWx5KHJlcykpCiAJCQlnb3RvIGZhaWxlZF9iaW87CiAJfQogCi0JaWYgKHdpLT5iaW8pIHsKKwlpZiAod2kuYmlvKSB7CiAJCS8qCiAJCSAqIExhc3QgQklPIGlzIGFsd2F5cyBzZW50IHRocm91Z2ggdGhlIGZvbGxvd2luZwogCQkgKiBzdWJtaXNzaW9uLgogCQkgKi8KIAkJcncgfD0gKDEgPDwgQklPX1JXX1NZTkNJTykgfCAoMSA8PCBCSU9fUldfVU5QTFVHKTsKLQkJcmVzID0gbmlsZnNfc3VibWl0X3NlZ19iaW8od2ksIHJ3KTsKLQkJaWYgKHVubGlrZWx5KHJlcykpCi0JCQlnb3RvIGZhaWxlZF9iaW87CisJCXJlcyA9IG5pbGZzX3NlZ2J1Zl9zdWJtaXRfYmlvKHNlZ2J1ZiwgJndpLCBydyk7CiAJfQogCi0JcmVzID0gMDsKLSBvdXQ6Ci0JcmV0dXJuIHJlczsKLQogIGZhaWxlZF9iaW86Ci0JYXRvbWljX2luYygmd2ktPmVycik7Ci0JZ290byBvdXQ7CisJcmV0dXJuIHJlczsKIH0KIAogLyoqCiAgKiBuaWxmc19zZWdidWZfd2FpdCAtIHdhaXQgZm9yIGNvbXBsZXRpb24gb2YgcmVxdWVzdGVkIEJJT3MKLSAqIEB3aTogbmlsZnNfd3JpdGVfaW5mbworICogQHNlZ2J1Zjogc2VnbWVudCBidWZmZXIKICAqCiAgKiBSZXR1cm4gVmFsdWU6IE9uIFN1Y2Nlc3MsIDAgaXMgcmV0dXJuZWQuIE9uIEVycm9yLCBvbmUgb2YgdGhlIGZvbGxvd2luZwogICogbmVnYXRpdmUgZXJyb3IgY29kZSBpcyByZXR1cm5lZC4KICAqCiAgKiAlLUVJTyAtIEkvTyBlcnJvcgogICovCi1pbnQgbmlsZnNfc2VnYnVmX3dhaXQoc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpzZWdidWYsCi0JCSAgICAgIHN0cnVjdCBuaWxmc193cml0ZV9pbmZvICp3aSkKK2ludCBuaWxmc19zZWdidWZfd2FpdChzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZikKIHsKIAlpbnQgZXJyID0gMDsKIAotCWlmICghd2ktPm5iaW8pCisJaWYgKCFzZWdidWYtPnNiX25iaW8pCiAJCXJldHVybiAwOwogCiAJZG8gewotCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ3aS0+YmlvX2V2ZW50KTsKLQl9IHdoaWxlICgtLXdpLT5uYmlvID4gMCk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnNlZ2J1Zi0+c2JfYmlvX2V2ZW50KTsKKwl9IHdoaWxlICgtLXNlZ2J1Zi0+c2JfbmJpbyA+IDApOwogCi0JaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZ3aS0+ZXJyKSA+IDApKSB7CisJaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZzZWdidWYtPnNiX2VycikgPiAwKSkgewogCQlwcmludGsoS0VSTl9FUlIgIk5JTEZTOiBJTyBlcnJvciB3cml0aW5nIHNlZ21lbnRcbiIpOwogCQllcnIgPSAtRUlPOwotCQlzZWdidWYtPnNiX2lvX2Vycm9yID0gMTsKIAl9CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9zZWdidWYuaCBiL2ZzL25pbGZzMi9zZWdidWYuaAppbmRleCAwYzMwNzZmLi42YWYxNjMwIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvc2VnYnVmLmgKKysrIGIvZnMvbmlsZnMyL3NlZ2J1Zi5oCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9iaW8uaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KIAogLyoqCiAgKiBzdHJ1Y3QgbmlsZnNfc2Vnc3VtX2luZm8gLSBPbi1tZW1vcnkgc2VnbWVudCBzdW1tYXJ5CkBAIC03Nyw3ICs3Niw5IEBACiAgKiBAc2JfcmVzdF9ibG9ja3M6IE51bWJlciBvZiByZXNpZHVhbCBibG9ja3MgaW4gdGhlIGN1cnJlbnQgc2VnbWVudAogICogQHNiX3NlZ3N1bV9idWZmZXJzOiBMaXN0IG9mIGJ1ZmZlcnMgZm9yIHNlZ21lbnQgc3VtbWFyaWVzCiAgKiBAc2JfcGF5bG9hZF9idWZmZXJzOiBMaXN0IG9mIGJ1ZmZlcnMgZm9yIHNlZ21lbnQgcGF5bG9hZAotICogQHNiX2lvX2Vycm9yOiBJL08gZXJyb3Igc3RhdHVzCisgKiBAc2JfbmJpbzogTnVtYmVyIG9mIGZseWluZyBiaW8gcmVxdWVzdHMKKyAqIEBzYl9lcnI6IEkvTyBlcnJvciBzdGF0dXMKKyAqIEBzYl9iaW9fZXZlbnQ6IENvbXBsZXRpb24gZXZlbnQgb2YgbG9nIHdyaXRpbmcKICAqLwogc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgICAgICpzYl9zdXBlcjsKQEAgLTk2LDcgKzk3LDkgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCXNiX3BheWxvYWRfYnVmZmVyczsgLyogaW5jbHVkaW5nIHN1cGVyIHJvb3QgKi8KIAogCS8qIGlvIHN0YXR1cyAqLwotCWludAkJCXNiX2lvX2Vycm9yOworCWludAkJCXNiX25iaW87CisJYXRvbWljX3QJCXNiX2VycjsKKwlzdHJ1Y3QgY29tcGxldGlvbglzYl9iaW9fZXZlbnQ7CiB9OwogCiAjZGVmaW5lIE5JTEZTX0xJU1RfU0VHQlVGKGhlYWQpICBcCkBAIC0xMjUsNiArMTI4LDggQEAKIHZvaWQgbmlsZnNfc2VnYnVmX2ZyZWUoc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICopOwogdm9pZCBuaWxmc19zZWdidWZfbWFwKHN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqLCBfX3U2NCwgdW5zaWduZWQgbG9uZywKIAkJICAgICAgc3RydWN0IHRoZV9uaWxmcyAqKTsKK3ZvaWQgbmlsZnNfc2VnYnVmX21hcF9jb250KHN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmLAorCQkJICAgc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpwcmV2KTsKIHZvaWQgbmlsZnNfc2VnYnVmX3NldF9uZXh0X3NlZ251bShzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKiwgX191NjQsCiAJCQkJICBzdHJ1Y3QgdGhlX25pbGZzICopOwogaW50IG5pbGZzX3NlZ2J1Zl9yZXNldChzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKiwgdW5zaWduZWQsIHRpbWVfdCk7CkBAIC0xNjEsNDEgKzE2NiwxOCBAQAogCXNlZ2J1Zi0+c2Jfc3VtLm5maWxlYmxrKys7CiB9CiAKLXZvaWQgbmlsZnNfcmVsZWFzZV9idWZmZXJzKHN0cnVjdCBsaXN0X2hlYWQgKik7CitpbnQgbmlsZnNfc2VnYnVmX3dyaXRlKHN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmLAorCQkgICAgICAgc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMpOworaW50IG5pbGZzX3NlZ2J1Zl93YWl0KHN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmKTsKIAotc3RhdGljIGlubGluZSB2b2lkIG5pbGZzX3NlZ2J1Zl9jbGVhcihzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZikKK3ZvaWQgbmlsZnNfY2xlYXJfbG9ncyhzdHJ1Y3QgbGlzdF9oZWFkICpsb2dzKTsKK3ZvaWQgbmlsZnNfdHJ1bmNhdGVfbG9ncyhzdHJ1Y3QgbGlzdF9oZWFkICpsb2dzLAorCQkJIHN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqbGFzdCk7CitpbnQgbmlsZnNfd2FpdF9vbl9sb2dzKHN0cnVjdCBsaXN0X2hlYWQgKmxvZ3MpOworCitzdGF0aWMgaW5saW5lIHZvaWQgbmlsZnNfZGVzdHJveV9sb2dzKHN0cnVjdCBsaXN0X2hlYWQgKmxvZ3MpCiB7Ci0JbmlsZnNfcmVsZWFzZV9idWZmZXJzKCZzZWdidWYtPnNiX3NlZ3N1bV9idWZmZXJzKTsKLQluaWxmc19yZWxlYXNlX2J1ZmZlcnMoJnNlZ2J1Zi0+c2JfcGF5bG9hZF9idWZmZXJzKTsKKwluaWxmc190cnVuY2F0ZV9sb2dzKGxvZ3MsIE5VTEwpOwogfQogCi1zdHJ1Y3QgbmlsZnNfd3JpdGVfaW5mbyB7Ci0Jc3RydWN0IGJpbwkgICAgICAgKmJpbzsKLQlpbnQgCQkJc3RhcnQsIGVuZDsgLyogVGhlIHJlZ2lvbiB0byBiZSBzdWJtaXR0ZWQgKi8KLQlpbnQJCQlyZXN0X2Jsb2NrczsKLQlpbnQJCQltYXhfcGFnZXM7Ci0JaW50CQkJbnJfdmVjczsKLQlzZWN0b3JfdAkJYmxvY2tucjsKLQotCWludAkJCW5iaW87Ci0JYXRvbWljX3QJCWVycjsKLQlzdHJ1Y3QgY29tcGxldGlvbgliaW9fZXZlbnQ7Ci0JCQkJLyogY29tcGxldGlvbiBldmVudCBvZiBzZWdtZW50IHdyaXRlICovCi0KLQkvKgotCSAqIFRoZSBmb2xsb3dpbmcgZmllbGRzIG11c3QgYmUgc2V0IGV4cGxpY2l0bHkKLQkgKi8KLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgICAgICpzYjsKLQlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpOyAvKiBiYWNraW5nIGRldiBpbmZvICovCi0Jc3RydWN0IGJ1ZmZlcl9oZWFkICAgICAqYmhfc3I7Ci19OwotCi0KLXZvaWQgbmlsZnNfc2VnYnVmX3ByZXBhcmVfd3JpdGUoc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICosCi0JCQkJc3RydWN0IG5pbGZzX3dyaXRlX2luZm8gKik7Ci1pbnQgbmlsZnNfc2VnYnVmX3dyaXRlKHN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqLAotCQkgICAgICAgc3RydWN0IG5pbGZzX3dyaXRlX2luZm8gKik7Ci1pbnQgbmlsZnNfc2VnYnVmX3dhaXQoc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICosCi0JCSAgICAgIHN0cnVjdCBuaWxmc193cml0ZV9pbmZvICopOwotCiAjZW5kaWYgLyogX05JTEZTX1NFR0JVRl9IICovCmRpZmYgLS1naXQgYS9mcy9uaWxmczIvc2VnbWVudC5jIGIvZnMvbmlsZnMyL3NlZ21lbnQuYwppbmRleCA2ZWZmNjZhLi4xNzU4NGM1IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvc2VnbWVudC5jCisrKyBiL2ZzL25pbGZzMi9zZWdtZW50LmMKQEAgLTk3NCwxMiArOTc0LDEyIEBACiAJCQkgICAgICBuaWxmcy0+bnNfbm9uZ2NfY3RpbWUgOiBzY2ktPnNjX3NlZ19jdGltZSk7CiAJcmF3X3NyLT5zcl9mbGFncyA9IDA7CiAKLQluaWxmc19tZHRfd3JpdGVfaW5vZGVfZGlyZWN0KAotCQluaWxmc19kYXRfaW5vZGUobmlsZnMpLCBiaF9zciwgTklMRlNfU1JfREFUX09GRlNFVChpc3opKTsKLQluaWxmc19tZHRfd3JpdGVfaW5vZGVfZGlyZWN0KAotCQluaWxmcy0+bnNfY3BmaWxlLCBiaF9zciwgTklMRlNfU1JfQ1BGSUxFX09GRlNFVChpc3opKTsKLQluaWxmc19tZHRfd3JpdGVfaW5vZGVfZGlyZWN0KAotCQluaWxmcy0+bnNfc3VmaWxlLCBiaF9zciwgTklMRlNfU1JfU1VGSUxFX09GRlNFVChpc3opKTsKKwluaWxmc193cml0ZV9pbm9kZV9jb21tb24obmlsZnNfZGF0X2lub2RlKG5pbGZzKSwgKHZvaWQgKilyYXdfc3IgKworCQkJCSBOSUxGU19TUl9EQVRfT0ZGU0VUKGlzeiksIDEpOworCW5pbGZzX3dyaXRlX2lub2RlX2NvbW1vbihuaWxmcy0+bnNfY3BmaWxlLCAodm9pZCAqKXJhd19zciArCisJCQkJIE5JTEZTX1NSX0NQRklMRV9PRkZTRVQoaXN6KSwgMSk7CisJbmlsZnNfd3JpdGVfaW5vZGVfY29tbW9uKG5pbGZzLT5uc19zdWZpbGUsICh2b2lkICopcmF3X3NyICsKKwkJCQkgTklMRlNfU1JfU1VGSUxFX09GRlNFVChpc3opLCAxKTsKIH0KIAogc3RhdGljIHZvaWQgbmlsZnNfcmVkaXJ0eV9pbm9kZXMoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKQEAgLTEyNzMsNzMgKzEyNzMsNzUgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG5pbGZzX3RvdWNoX3NlZ3VzYWdlKHN0cnVjdCBpbm9kZSAqc3VmaWxlLCBfX3U2NCBzZWdudW0pCi17Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9zdTsKLQlzdHJ1Y3QgbmlsZnNfc2VnbWVudF91c2FnZSAqcmF3X3N1OwotCWludCBlcnI7Ci0KLQllcnIgPSBuaWxmc19zdWZpbGVfZ2V0X3NlZ21lbnRfdXNhZ2Uoc3VmaWxlLCBzZWdudW0sICZyYXdfc3UsICZiaF9zdSk7Ci0JaWYgKHVubGlrZWx5KGVycikpCi0JCXJldHVybiBlcnI7Ci0JbmlsZnNfbWR0X21hcmtfYnVmZmVyX2RpcnR5KGJoX3N1KTsKLQluaWxmc19tZHRfbWFya19kaXJ0eShzdWZpbGUpOwotCW5pbGZzX3N1ZmlsZV9wdXRfc2VnbWVudF91c2FnZShzdWZpbGUsIHNlZ251bSwgYmhfc3UpOwotCXJldHVybiAwOwotfQotCisvKioKKyAqIG5pbGZzX3NlZ2N0b3JfYmVnaW5fY29uc3RydWN0aW9uIC0gc2V0dXAgc2VnbWVudCBidWZmZXIgdG8gbWFrZSBhIG5ldyBsb2cKKyAqIEBzY2k6IG5pbGZzX3NjX2luZm8KKyAqIEBuaWxmczogbmlsZnMgb2JqZWN0CisgKi8KIHN0YXRpYyBpbnQgbmlsZnNfc2VnY3Rvcl9iZWdpbl9jb25zdHJ1Y3Rpb24oc3RydWN0IG5pbGZzX3NjX2luZm8gKnNjaSwKIAkJCQkJICAgIHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzKQogewotCXN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmLCAqbjsKKwlzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZiwgKnByZXY7CiAJX191NjQgbmV4dG51bTsKLQlpbnQgZXJyOworCWludCBlcnIsIGFsbG9jID0gMDsKIAotCWlmIChsaXN0X2VtcHR5KCZzY2ktPnNjX3NlZ2J1ZnMpKSB7Ci0JCXNlZ2J1ZiA9IG5pbGZzX3NlZ2J1Zl9uZXcoc2NpLT5zY19zdXBlcik7Ci0JCWlmICh1bmxpa2VseSghc2VnYnVmKSkKLQkJCXJldHVybiAtRU5PTUVNOwotCQlsaXN0X2FkZCgmc2VnYnVmLT5zYl9saXN0LCAmc2NpLT5zY19zZWdidWZzKTsKLQl9IGVsc2UKLQkJc2VnYnVmID0gTklMRlNfRklSU1RfU0VHQlVGKCZzY2ktPnNjX3NlZ2J1ZnMpOworCXNlZ2J1ZiA9IG5pbGZzX3NlZ2J1Zl9uZXcoc2NpLT5zY19zdXBlcik7CisJaWYgKHVubGlrZWx5KCFzZWdidWYpKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCW5pbGZzX3NlZ2J1Zl9tYXAoc2VnYnVmLCBuaWxmcy0+bnNfc2VnbnVtLCBuaWxmcy0+bnNfcHNlZ19vZmZzZXQsCi0JCQkgbmlsZnMpOworCWlmIChsaXN0X2VtcHR5KCZzY2ktPnNjX3dyaXRlX2xvZ3MpKSB7CisJCW5pbGZzX3NlZ2J1Zl9tYXAoc2VnYnVmLCBuaWxmcy0+bnNfc2VnbnVtLAorCQkJCSBuaWxmcy0+bnNfcHNlZ19vZmZzZXQsIG5pbGZzKTsKKwkJaWYgKHNlZ2J1Zi0+c2JfcmVzdF9ibG9ja3MgPCBOSUxGU19QU0VHX01JTl9CTE9DS1MpIHsKKwkJCW5pbGZzX3NoaWZ0X3RvX25leHRfc2VnbWVudChuaWxmcyk7CisJCQluaWxmc19zZWdidWZfbWFwKHNlZ2J1ZiwgbmlsZnMtPm5zX3NlZ251bSwgMCwgbmlsZnMpOworCQl9CiAKLQlpZiAoc2VnYnVmLT5zYl9yZXN0X2Jsb2NrcyA8IE5JTEZTX1BTRUdfTUlOX0JMT0NLUykgewotCQluaWxmc19zaGlmdF90b19uZXh0X3NlZ21lbnQobmlsZnMpOwotCQluaWxmc19zZWdidWZfbWFwKHNlZ2J1ZiwgbmlsZnMtPm5zX3NlZ251bSwgMCwgbmlsZnMpOwotCX0KLQlzY2ktPnNjX3NlZ2J1Zl9uYmxvY2tzID0gc2VnYnVmLT5zYl9yZXN0X2Jsb2NrczsKLQotCWVyciA9IG5pbGZzX3RvdWNoX3NlZ3VzYWdlKG5pbGZzLT5uc19zdWZpbGUsIHNlZ2J1Zi0+c2Jfc2VnbnVtKTsKLQlpZiAodW5saWtlbHkoZXJyKSkKLQkJcmV0dXJuIGVycjsKLQotCWlmIChuaWxmcy0+bnNfc2VnbnVtID09IG5pbGZzLT5uc19uZXh0bnVtKSB7Ci0JCS8qIFN0YXJ0IGZyb20gdGhlIGhlYWQgb2YgYSBuZXcgZnVsbCBzZWdtZW50ICovCi0JCWVyciA9IG5pbGZzX3N1ZmlsZV9hbGxvYyhuaWxmcy0+bnNfc3VmaWxlLCAmbmV4dG51bSk7Ci0JCWlmICh1bmxpa2VseShlcnIpKQotCQkJcmV0dXJuIGVycjsKLQl9IGVsc2UKKwkJc2VnYnVmLT5zYl9zdW0uc2VnX3NlcSA9IG5pbGZzLT5uc19zZWdfc2VxOwogCQluZXh0bnVtID0gbmlsZnMtPm5zX25leHRudW07CiAKLQlzZWdidWYtPnNiX3N1bS5zZWdfc2VxID0gbmlsZnMtPm5zX3NlZ19zZXE7CisJCWlmIChuaWxmcy0+bnNfc2VnbnVtID09IG5pbGZzLT5uc19uZXh0bnVtKQorCQkJLyogU3RhcnQgZnJvbSB0aGUgaGVhZCBvZiBhIG5ldyBmdWxsIHNlZ21lbnQgKi8KKwkJCWFsbG9jKys7CisJfSBlbHNlIHsKKwkJLyogQ29udGludWUgbG9ncyAqLworCQlwcmV2ID0gTklMRlNfTEFTVF9TRUdCVUYoJnNjaS0+c2Nfd3JpdGVfbG9ncyk7CisJCW5pbGZzX3NlZ2J1Zl9tYXBfY29udChzZWdidWYsIHByZXYpOworCQlzZWdidWYtPnNiX3N1bS5zZWdfc2VxID0gcHJldi0+c2Jfc3VtLnNlZ19zZXE7CisJCW5leHRudW0gPSBwcmV2LT5zYl9uZXh0bnVtOworCisJCWlmIChzZWdidWYtPnNiX3Jlc3RfYmxvY2tzIDwgTklMRlNfUFNFR19NSU5fQkxPQ0tTKSB7CisJCQluaWxmc19zZWdidWZfbWFwKHNlZ2J1ZiwgcHJldi0+c2JfbmV4dG51bSwgMCwgbmlsZnMpOworCQkJc2VnYnVmLT5zYl9zdW0uc2VnX3NlcSsrOworCQkJYWxsb2MrKzsKKwkJfQorCX0KKworCWVyciA9IG5pbGZzX3N1ZmlsZV9tYXJrX2RpcnR5KG5pbGZzLT5uc19zdWZpbGUsIHNlZ2J1Zi0+c2Jfc2VnbnVtKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWxlZDsKKworCWlmIChhbGxvYykgeworCQllcnIgPSBuaWxmc19zdWZpbGVfYWxsb2MobmlsZnMtPm5zX3N1ZmlsZSwgJm5leHRudW0pOworCQlpZiAoZXJyKQorCQkJZ290byBmYWlsZWQ7CisJfQogCW5pbGZzX3NlZ2J1Zl9zZXRfbmV4dF9zZWdudW0oc2VnYnVmLCBuZXh0bnVtLCBuaWxmcyk7CiAKLQkvKiB0cnVuY2F0aW5nIHNlZ21lbnQgYnVmZmVycyAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9jb250aW51ZShzZWdidWYsIG4sICZzY2ktPnNjX3NlZ2J1ZnMsCi0JCQkJCSAgc2JfbGlzdCkgewotCQlsaXN0X2RlbF9pbml0KCZzZWdidWYtPnNiX2xpc3QpOwotCQluaWxmc19zZWdidWZfZnJlZShzZWdidWYpOwotCX0KKwlCVUdfT04oIWxpc3RfZW1wdHkoJnNjaS0+c2Nfc2VnYnVmcykpOworCWxpc3RfYWRkX3RhaWwoJnNlZ2J1Zi0+c2JfbGlzdCwgJnNjaS0+c2Nfc2VnYnVmcyk7CisJc2NpLT5zY19zZWdidWZfbmJsb2NrcyA9IHNlZ2J1Zi0+c2JfcmVzdF9ibG9ja3M7CiAJcmV0dXJuIDA7CisKKyBmYWlsZWQ6CisJbmlsZnNfc2VnYnVmX2ZyZWUoc2VnYnVmKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IG5pbGZzX3NlZ2N0b3JfZXh0ZW5kX3NlZ21lbnRzKHN0cnVjdCBuaWxmc19zY19pbmZvICpzY2ksCiAJCQkJCSBzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcywgaW50IG5hZGQpCiB7Ci0Jc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpzZWdidWYsICpwcmV2LCAqbjsKKwlzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZiwgKnByZXY7CiAJc3RydWN0IGlub2RlICpzdWZpbGUgPSBuaWxmcy0+bnNfc3VmaWxlOwogCV9fdTY0IG5leHRuZXh0bnVtOwogCUxJU1RfSEVBRChsaXN0KTsKQEAgLTEzNTIsNyArMTM1NCw3IEBACiAJICogbm90IGJlIGRpcnR5LiAgVGhlIGZvbGxvd2luZyBjYWxsIGVuc3VyZXMgdGhhdCB0aGUgYnVmZmVyIGlzIGRpcnR5CiAJICogYW5kIHdpbGwgcGluIHRoZSBidWZmZXIgb24gbWVtb3J5IHVudGlsIHRoZSBzdWZpbGUgaXMgd3JpdHRlbi4KIAkgKi8KLQllcnIgPSBuaWxmc190b3VjaF9zZWd1c2FnZShzdWZpbGUsIHByZXYtPnNiX25leHRudW0pOworCWVyciA9IG5pbGZzX3N1ZmlsZV9tYXJrX2RpcnR5KHN1ZmlsZSwgcHJldi0+c2JfbmV4dG51bSk7CiAJaWYgKHVubGlrZWx5KGVycikpCiAJCXJldHVybiBlcnI7CiAKQEAgLTEzNzgsMzMgKzEzODAsMzMgQEAKIAkJbGlzdF9hZGRfdGFpbCgmc2VnYnVmLT5zYl9saXN0LCAmbGlzdCk7CiAJCXByZXYgPSBzZWdidWY7CiAJfQotCWxpc3Rfc3BsaWNlKCZsaXN0LCBzY2ktPnNjX3NlZ2J1ZnMucHJldik7CisJbGlzdF9zcGxpY2VfdGFpbCgmbGlzdCwgJnNjaS0+c2Nfc2VnYnVmcyk7CiAJcmV0dXJuIDA7CiAKICBmYWlsZWRfc2VnYnVmOgogCW5pbGZzX3NlZ2J1Zl9mcmVlKHNlZ2J1Zik7CiAgZmFpbGVkOgotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzZWdidWYsIG4sICZsaXN0LCBzYl9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZWdidWYsICZsaXN0LCBzYl9saXN0KSB7CiAJCXJldCA9IG5pbGZzX3N1ZmlsZV9mcmVlKHN1ZmlsZSwgc2VnYnVmLT5zYl9uZXh0bnVtKTsKIAkJV0FSTl9PTihyZXQpOyAvKiBuZXZlciBmYWlscyAqLwotCQlsaXN0X2RlbF9pbml0KCZzZWdidWYtPnNiX2xpc3QpOwotCQluaWxmc19zZWdidWZfZnJlZShzZWdidWYpOwogCX0KKwluaWxmc19kZXN0cm95X2xvZ3MoJmxpc3QpOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIG5pbGZzX3NlZ2N0b3JfZnJlZV9pbmNvbXBsZXRlX3NlZ21lbnRzKHN0cnVjdCBuaWxmc19zY19pbmZvICpzY2ksCi0JCQkJCQkgICBzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcykKK3N0YXRpYyB2b2lkIG5pbGZzX2ZyZWVfaW5jb21wbGV0ZV9sb2dzKHN0cnVjdCBsaXN0X2hlYWQgKmxvZ3MsCisJCQkJICAgICAgIHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzKQogewotCXN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmOwotCWludCByZXQsIGRvbmUgPSAwOworCXN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmLCAqcHJldjsKKwlzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSA9IG5pbGZzLT5uc19zdWZpbGU7CisJaW50IHJldDsKIAotCXNlZ2J1ZiA9IE5JTEZTX0ZJUlNUX1NFR0JVRigmc2NpLT5zY19zZWdidWZzKTsKKwlzZWdidWYgPSBOSUxGU19GSVJTVF9TRUdCVUYobG9ncyk7CiAJaWYgKG5pbGZzLT5uc19uZXh0bnVtICE9IHNlZ2J1Zi0+c2JfbmV4dG51bSkgewotCQlyZXQgPSBuaWxmc19zdWZpbGVfZnJlZShuaWxmcy0+bnNfc3VmaWxlLCBzZWdidWYtPnNiX25leHRudW0pOworCQlyZXQgPSBuaWxmc19zdWZpbGVfZnJlZShzdWZpbGUsIHNlZ2J1Zi0+c2JfbmV4dG51bSk7CiAJCVdBUk5fT04ocmV0KTsgLyogbmV2ZXIgZmFpbHMgKi8KIAl9Ci0JaWYgKHNlZ2J1Zi0+c2JfaW9fZXJyb3IpIHsKKwlpZiAoYXRvbWljX3JlYWQoJnNlZ2J1Zi0+c2JfZXJyKSkgewogCQkvKiBDYXNlIDE6IFRoZSBmaXJzdCBzZWdtZW50IGZhaWxlZCAqLwogCQlpZiAoc2VnYnVmLT5zYl9wc2VnX3N0YXJ0ICE9IHNlZ2J1Zi0+c2JfZnNlZ19zdGFydCkKIAkJCS8qIENhc2UgMWE6ICBQYXJ0aWFsIHNlZ21lbnQgYXBwZW5kZWQgaW50byBhbiBleGlzdGluZwpAQCAtMTQxMywxMDYgKzE0MTUsNTQgQEAKIAkJCQkJCXNlZ2J1Zi0+c2JfZnNlZ19lbmQpOwogCQllbHNlIC8qIENhc2UgMWI6ICBOZXcgZnVsbCBzZWdtZW50ICovCiAJCQlzZXRfbmlsZnNfZGlzY29udGludWVkKG5pbGZzKTsKLQkJZG9uZSsrOwogCX0KIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUoc2VnYnVmLCAmc2NpLT5zY19zZWdidWZzLCBzYl9saXN0KSB7Ci0JCXJldCA9IG5pbGZzX3N1ZmlsZV9mcmVlKG5pbGZzLT5uc19zdWZpbGUsIHNlZ2J1Zi0+c2JfbmV4dG51bSk7Ci0JCVdBUk5fT04ocmV0KTsgLyogbmV2ZXIgZmFpbHMgKi8KLQkJaWYgKCFkb25lICYmIHNlZ2J1Zi0+c2JfaW9fZXJyb3IpIHsKLQkJCWlmIChzZWdidWYtPnNiX3NlZ251bSAhPSBuaWxmcy0+bnNfbmV4dG51bSkKLQkJCQkvKiBDYXNlIDI6IGV4dGVuZGVkIHNlZ21lbnQgKCE9IG5leHQpIGZhaWxlZCAqLwotCQkJCW5pbGZzX3N1ZmlsZV9zZXRfZXJyb3IobmlsZnMtPm5zX3N1ZmlsZSwKLQkJCQkJCSAgICAgICBzZWdidWYtPnNiX3NlZ251bSk7Ci0JCQlkb25lKys7CisJcHJldiA9IHNlZ2J1ZjsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKHNlZ2J1ZiwgbG9ncywgc2JfbGlzdCkgeworCQlpZiAocHJldi0+c2JfbmV4dG51bSAhPSBzZWdidWYtPnNiX25leHRudW0pIHsKKwkJCXJldCA9IG5pbGZzX3N1ZmlsZV9mcmVlKHN1ZmlsZSwgc2VnYnVmLT5zYl9uZXh0bnVtKTsKKwkJCVdBUk5fT04ocmV0KTsgLyogbmV2ZXIgZmFpbHMgKi8KIAkJfQorCQlpZiAoYXRvbWljX3JlYWQoJnNlZ2J1Zi0+c2JfZXJyKSAmJgorCQkgICAgc2VnYnVmLT5zYl9zZWdudW0gIT0gbmlsZnMtPm5zX25leHRudW0pCisJCQkvKiBDYXNlIDI6IGV4dGVuZGVkIHNlZ21lbnQgKCE9IG5leHQpIGZhaWxlZCAqLworCQkJbmlsZnNfc3VmaWxlX3NldF9lcnJvcihzdWZpbGUsIHNlZ2J1Zi0+c2Jfc2VnbnVtKTsKKwkJcHJldiA9IHNlZ2J1ZjsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIG5pbGZzX3NlZ2N0b3JfY2xlYXJfc2VnbWVudF9idWZmZXJzKHN0cnVjdCBuaWxmc19zY19pbmZvICpzY2kpCi17Ci0Jc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpzZWdidWY7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlZ2J1ZiwgJnNjaS0+c2Nfc2VnYnVmcywgc2JfbGlzdCkKLQkJbmlsZnNfc2VnYnVmX2NsZWFyKHNlZ2J1Zik7Ci0Jc2NpLT5zY19zdXBlcl9yb290ID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgbmlsZnNfc2VnY3Rvcl9kZXN0cm95X3NlZ21lbnRfYnVmZmVycyhzdHJ1Y3QgbmlsZnNfc2NfaW5mbyAqc2NpKQotewotCXN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmOwotCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZzY2ktPnNjX3NlZ2J1ZnMpKSB7Ci0JCXNlZ2J1ZiA9IE5JTEZTX0ZJUlNUX1NFR0JVRigmc2NpLT5zY19zZWdidWZzKTsKLQkJbGlzdF9kZWxfaW5pdCgmc2VnYnVmLT5zYl9saXN0KTsKLQkJbmlsZnNfc2VnYnVmX2ZyZWUoc2VnYnVmKTsKLQl9Ci0JLyogc2NpLT5zY19jdXJzZWcgPSBOVUxMOyAqLwotfQotCi1zdGF0aWMgdm9pZCBuaWxmc19zZWdjdG9yX2VuZF9jb25zdHJ1Y3Rpb24oc3RydWN0IG5pbGZzX3NjX2luZm8gKnNjaSwKLQkJCQkJICAgc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMsIGludCBlcnIpCi17Ci0JaWYgKHVubGlrZWx5KGVycikpIHsKLQkJbmlsZnNfc2VnY3Rvcl9mcmVlX2luY29tcGxldGVfc2VnbWVudHMoc2NpLCBuaWxmcyk7Ci0JCWlmIChzY2ktPnNjX3N0YWdlLmZsYWdzICYgTklMRlNfQ0ZfU1VGUkVFRCkgewotCQkJaW50IHJldDsKLQotCQkJcmV0ID0gbmlsZnNfc3VmaWxlX2NhbmNlbF9mcmVldihuaWxmcy0+bnNfc3VmaWxlLAotCQkJCQkJCXNjaS0+c2NfZnJlZXNlZ3MsCi0JCQkJCQkJc2NpLT5zY19uZnJlZXNlZ3MsCi0JCQkJCQkJTlVMTCk7Ci0JCQlXQVJOX09OKHJldCk7IC8qIGRvIG5vdCBoYXBwZW4gKi8KLQkJfQotCX0KLQluaWxmc19zZWdjdG9yX2NsZWFyX3NlZ21lbnRfYnVmZmVycyhzY2kpOwotfQotCiBzdGF0aWMgdm9pZCBuaWxmc19zZWdjdG9yX3VwZGF0ZV9zZWd1c2FnZShzdHJ1Y3QgbmlsZnNfc2NfaW5mbyAqc2NpLAogCQkJCQkgIHN0cnVjdCBpbm9kZSAqc3VmaWxlKQogewogCXN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhfc3U7Ci0Jc3RydWN0IG5pbGZzX3NlZ21lbnRfdXNhZ2UgKnJhd19zdTsKIAl1bnNpZ25lZCBsb25nIGxpdmVfYmxvY2tzOwogCWludCByZXQ7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlZ2J1ZiwgJnNjaS0+c2Nfc2VnYnVmcywgc2JfbGlzdCkgewotCQlyZXQgPSBuaWxmc19zdWZpbGVfZ2V0X3NlZ21lbnRfdXNhZ2Uoc3VmaWxlLCBzZWdidWYtPnNiX3NlZ251bSwKLQkJCQkJCSAgICAgJnJhd19zdSwgJmJoX3N1KTsKLQkJV0FSTl9PTihyZXQpOyAvKiBhbHdheXMgc3VjY2VlZCBiZWNhdXNlIGJoX3N1IGlzIGRpcnR5ICovCiAJCWxpdmVfYmxvY2tzID0gc2VnYnVmLT5zYl9zdW0ubmJsb2NrcyArCiAJCQkoc2VnYnVmLT5zYl9wc2VnX3N0YXJ0IC0gc2VnYnVmLT5zYl9mc2VnX3N0YXJ0KTsKLQkJcmF3X3N1LT5zdV9sYXN0bW9kID0gY3B1X3RvX2xlNjQoc2NpLT5zY19zZWdfY3RpbWUpOwotCQlyYXdfc3UtPnN1X25ibG9ja3MgPSBjcHVfdG9fbGUzMihsaXZlX2Jsb2Nrcyk7Ci0JCW5pbGZzX3N1ZmlsZV9wdXRfc2VnbWVudF91c2FnZShzdWZpbGUsIHNlZ2J1Zi0+c2Jfc2VnbnVtLAotCQkJCQkgICAgICAgYmhfc3UpOworCQlyZXQgPSBuaWxmc19zdWZpbGVfc2V0X3NlZ21lbnRfdXNhZ2Uoc3VmaWxlLCBzZWdidWYtPnNiX3NlZ251bSwKKwkJCQkJCSAgICAgbGl2ZV9ibG9ja3MsCisJCQkJCQkgICAgIHNjaS0+c2Nfc2VnX2N0aW1lKTsKKwkJV0FSTl9PTihyZXQpOyAvKiBhbHdheXMgc3VjY2VlZCBiZWNhdXNlIHRoZSBzZWd1c2FnZSBpcyBkaXJ0eSAqLwogCX0KIH0KIAotc3RhdGljIHZvaWQgbmlsZnNfc2VnY3Rvcl9jYW5jZWxfc2VndXNhZ2Uoc3RydWN0IG5pbGZzX3NjX2luZm8gKnNjaSwKLQkJCQkJICBzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSkKK3N0YXRpYyB2b2lkIG5pbGZzX2NhbmNlbF9zZWd1c2FnZShzdHJ1Y3QgbGlzdF9oZWFkICpsb2dzLCBzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSkKIHsKIAlzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZjsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3N1OwotCXN0cnVjdCBuaWxmc19zZWdtZW50X3VzYWdlICpyYXdfc3U7CiAJaW50IHJldDsKIAotCXNlZ2J1ZiA9IE5JTEZTX0ZJUlNUX1NFR0JVRigmc2NpLT5zY19zZWdidWZzKTsKLQlyZXQgPSBuaWxmc19zdWZpbGVfZ2V0X3NlZ21lbnRfdXNhZ2Uoc3VmaWxlLCBzZWdidWYtPnNiX3NlZ251bSwKLQkJCQkJICAgICAmcmF3X3N1LCAmYmhfc3UpOwotCVdBUk5fT04ocmV0KTsgLyogYWx3YXlzIHN1Y2NlZWQgYmVjYXVzZSBiaF9zdSBpcyBkaXJ0eSAqLwotCXJhd19zdS0+c3VfbmJsb2NrcyA9IGNwdV90b19sZTMyKHNlZ2J1Zi0+c2JfcHNlZ19zdGFydCAtCi0JCQkJCSBzZWdidWYtPnNiX2ZzZWdfc3RhcnQpOwotCW5pbGZzX3N1ZmlsZV9wdXRfc2VnbWVudF91c2FnZShzdWZpbGUsIHNlZ2J1Zi0+c2Jfc2VnbnVtLCBiaF9zdSk7CisJc2VnYnVmID0gTklMRlNfRklSU1RfU0VHQlVGKGxvZ3MpOworCXJldCA9IG5pbGZzX3N1ZmlsZV9zZXRfc2VnbWVudF91c2FnZShzdWZpbGUsIHNlZ2J1Zi0+c2Jfc2VnbnVtLAorCQkJCQkgICAgIHNlZ2J1Zi0+c2JfcHNlZ19zdGFydCAtCisJCQkJCSAgICAgc2VnYnVmLT5zYl9mc2VnX3N0YXJ0LCAwKTsKKwlXQVJOX09OKHJldCk7IC8qIGFsd2F5cyBzdWNjZWVkIGJlY2F1c2UgdGhlIHNlZ3VzYWdlIGlzIGRpcnR5ICovCiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKHNlZ2J1ZiwgJnNjaS0+c2Nfc2VnYnVmcywgc2JfbGlzdCkgewotCQlyZXQgPSBuaWxmc19zdWZpbGVfZ2V0X3NlZ21lbnRfdXNhZ2Uoc3VmaWxlLCBzZWdidWYtPnNiX3NlZ251bSwKLQkJCQkJCSAgICAgJnJhd19zdSwgJmJoX3N1KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKHNlZ2J1ZiwgbG9ncywgc2JfbGlzdCkgeworCQlyZXQgPSBuaWxmc19zdWZpbGVfc2V0X3NlZ21lbnRfdXNhZ2Uoc3VmaWxlLCBzZWdidWYtPnNiX3NlZ251bSwKKwkJCQkJCSAgICAgMCwgMCk7CiAJCVdBUk5fT04ocmV0KTsgLyogYWx3YXlzIHN1Y2NlZWQgKi8KLQkJcmF3X3N1LT5zdV9uYmxvY2tzID0gMDsKLQkJbmlsZnNfc3VmaWxlX3B1dF9zZWdtZW50X3VzYWdlKHN1ZmlsZSwgc2VnYnVmLT5zYl9zZWdudW0sCi0JCQkJCSAgICAgICBiaF9zdSk7CiAJfQogfQogCkBAIC0xNTIwLDE3ICsxNDcwLDE1IEBACiAJCQkJCSAgICBzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKmxhc3QsCiAJCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSkKIHsKLQlzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZiA9IGxhc3QsICpuOworCXN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmID0gbGFzdDsKIAlpbnQgcmV0OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX2NvbnRpbnVlKHNlZ2J1ZiwgbiwgJnNjaS0+c2Nfc2VnYnVmcywKLQkJCQkJICBzYl9saXN0KSB7Ci0JCWxpc3RfZGVsX2luaXQoJnNlZ2J1Zi0+c2JfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShzZWdidWYsICZzY2ktPnNjX3NlZ2J1ZnMsIHNiX2xpc3QpIHsKIAkJc2NpLT5zY19zZWdidWZfbmJsb2NrcyAtPSBzZWdidWYtPnNiX3Jlc3RfYmxvY2tzOwogCQlyZXQgPSBuaWxmc19zdWZpbGVfZnJlZShzdWZpbGUsIHNlZ2J1Zi0+c2JfbmV4dG51bSk7CiAJCVdBUk5fT04ocmV0KTsKLQkJbmlsZnNfc2VnYnVmX2ZyZWUoc2VnYnVmKTsKIAl9CisJbmlsZnNfdHJ1bmNhdGVfbG9ncygmc2NpLT5zY19zZWdidWZzLCBsYXN0KTsKIH0KIAogCkBAIC0xNTY5LDcgKzE1MTcsNyBAQAogCQkJCQkJCU5VTEwpOwogCQkJV0FSTl9PTihlcnIpOyAvKiBkbyBub3QgaGFwcGVuICovCiAJCX0KLQkJbmlsZnNfc2VnY3Rvcl9jbGVhcl9zZWdtZW50X2J1ZmZlcnMoc2NpKTsKKwkJbmlsZnNfY2xlYXJfbG9ncygmc2NpLT5zY19zZWdidWZzKTsKIAogCQllcnIgPSBuaWxmc19zZWdjdG9yX2V4dGVuZF9zZWdtZW50cyhzY2ksIG5pbGZzLCBuYWRkKTsKIAkJaWYgKHVubGlrZWx5KGVycikpCkBAIC0xODE0LDI2ICsxNzYyLDE4IEBACiB9CiAKIHN0YXRpYyBpbnQgbmlsZnNfc2VnY3Rvcl93cml0ZShzdHJ1Y3QgbmlsZnNfc2NfaW5mbyAqc2NpLAotCQkJICAgICAgIHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkpCisJCQkgICAgICAgc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMpCiB7CiAJc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpzZWdidWY7Ci0Jc3RydWN0IG5pbGZzX3dyaXRlX2luZm8gd2k7Ci0JaW50IGVyciwgcmVzOwotCi0Jd2kuc2IgPSBzY2ktPnNjX3N1cGVyOwotCXdpLmJoX3NyID0gc2NpLT5zY19zdXBlcl9yb290OwotCXdpLmJkaSA9IGJkaTsKKwlpbnQgcmV0ID0gMDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VnYnVmLCAmc2NpLT5zY19zZWdidWZzLCBzYl9saXN0KSB7Ci0JCW5pbGZzX3NlZ2J1Zl9wcmVwYXJlX3dyaXRlKHNlZ2J1ZiwgJndpKTsKLQkJZXJyID0gbmlsZnNfc2VnYnVmX3dyaXRlKHNlZ2J1ZiwgJndpKTsKLQotCQlyZXMgPSBuaWxmc19zZWdidWZfd2FpdChzZWdidWYsICZ3aSk7Ci0JCWVyciA9IGVyciA/IDogcmVzOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKKwkJcmV0ID0gbmlsZnNfc2VnYnVmX3dyaXRlKHNlZ2J1ZiwgbmlsZnMpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CiAJfQotCXJldHVybiAwOworCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmc2NpLT5zY19zZWdidWZzLCAmc2NpLT5zY193cml0ZV9sb2dzKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX25pbGZzX2VuZF9wYWdlX2lvKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgZXJyKQpAQCAtMTkxMSwxNSArMTg1MSwxNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgbmlsZnNfc2VnY3Rvcl9hYm9ydF93cml0ZShzdHJ1Y3QgbmlsZnNfc2NfaW5mbyAqc2NpLAotCQkJCSAgICAgIHN0cnVjdCBwYWdlICpmYWlsZWRfcGFnZSwgaW50IGVycikKK3N0YXRpYyB2b2lkIG5pbGZzX2Fib3J0X2xvZ3Moc3RydWN0IGxpc3RfaGVhZCAqbG9ncywgc3RydWN0IHBhZ2UgKmZhaWxlZF9wYWdlLAorCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3NyLCBpbnQgZXJyKQogewogCXN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmOwogCXN0cnVjdCBwYWdlICpiZF9wYWdlID0gTlVMTCwgKmZzX3BhZ2UgPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlZ2J1ZiwgJnNjaS0+c2Nfc2VnYnVmcywgc2JfbGlzdCkgewotCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWlmIChsaXN0X2VtcHR5KGxvZ3MpKQorCQlyZXR1cm47CiAKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlZ2J1ZiwgbG9ncywgc2JfbGlzdCkgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJoLCAmc2VnYnVmLT5zYl9zZWdzdW1fYnVmZmVycywKIAkJCQkgICAgYl9hc3NvY19idWZmZXJzKSB7CiAJCQlpZiAoYmgtPmJfcGFnZSAhPSBiZF9wYWdlKSB7CkBAIC0xOTMxLDcgKzE4NzMsNyBAQAogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoYmgsICZzZWdidWYtPnNiX3BheWxvYWRfYnVmZmVycywKIAkJCQkgICAgYl9hc3NvY19idWZmZXJzKSB7Ci0JCQlpZiAoYmggPT0gc2NpLT5zY19zdXBlcl9yb290KSB7CisJCQlpZiAoYmggPT0gYmhfc3IpIHsKIAkJCQlpZiAoYmgtPmJfcGFnZSAhPSBiZF9wYWdlKSB7CiAJCQkJCWVuZF9wYWdlX3dyaXRlYmFjayhiZF9wYWdlKTsKIAkJCQkJYmRfcGFnZSA9IGJoLT5iX3BhZ2U7CkBAIC0xOTQxLDcgKzE4ODMsNyBAQAogCQkJaWYgKGJoLT5iX3BhZ2UgIT0gZnNfcGFnZSkgewogCQkJCW5pbGZzX2VuZF9wYWdlX2lvKGZzX3BhZ2UsIGVycik7CiAJCQkJaWYgKGZzX3BhZ2UgJiYgZnNfcGFnZSA9PSBmYWlsZWRfcGFnZSkKLQkJCQkJZ290byBkb25lOworCQkJCQlyZXR1cm47CiAJCQkJZnNfcGFnZSA9IGJoLT5iX3BhZ2U7CiAJCQl9CiAJCX0KQEAgLTE5NTAsOCArMTg5MiwzNCBAQAogCQllbmRfcGFnZV93cml0ZWJhY2soYmRfcGFnZSk7CiAKIAluaWxmc19lbmRfcGFnZV9pbyhmc19wYWdlLCBlcnIpOwotIGRvbmU6Cit9CisKK3N0YXRpYyB2b2lkIG5pbGZzX3NlZ2N0b3JfYWJvcnRfY29uc3RydWN0aW9uKHN0cnVjdCBuaWxmc19zY19pbmZvICpzY2ksCisJCQkJCSAgICAgc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMsIGludCBlcnIpCit7CisJTElTVF9IRUFEKGxvZ3MpOworCWludCByZXQ7CisKKwlsaXN0X3NwbGljZV90YWlsX2luaXQoJnNjaS0+c2Nfd3JpdGVfbG9ncywgJmxvZ3MpOworCXJldCA9IG5pbGZzX3dhaXRfb25fbG9ncygmbG9ncyk7CisJaWYgKHJldCkKKwkJbmlsZnNfYWJvcnRfbG9ncygmbG9ncywgTlVMTCwgc2NpLT5zY19zdXBlcl9yb290LCByZXQpOworCisJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZzY2ktPnNjX3NlZ2J1ZnMsICZsb2dzKTsKKwluaWxmc19jYW5jZWxfc2VndXNhZ2UoJmxvZ3MsIG5pbGZzLT5uc19zdWZpbGUpOworCW5pbGZzX2ZyZWVfaW5jb21wbGV0ZV9sb2dzKCZsb2dzLCBuaWxmcyk7CiAJbmlsZnNfY2xlYXJfY29waWVkX2J1ZmZlcnMoJnNjaS0+c2NfY29waWVkX2J1ZmZlcnMsIGVycik7CisKKwlpZiAoc2NpLT5zY19zdGFnZS5mbGFncyAmIE5JTEZTX0NGX1NVRlJFRUQpIHsKKwkJcmV0ID0gbmlsZnNfc3VmaWxlX2NhbmNlbF9mcmVldihuaWxmcy0+bnNfc3VmaWxlLAorCQkJCQkJc2NpLT5zY19mcmVlc2VncywKKwkJCQkJCXNjaS0+c2NfbmZyZWVzZWdzLAorCQkJCQkJTlVMTCk7CisJCVdBUk5fT04ocmV0KTsgLyogZG8gbm90IGhhcHBlbiAqLworCX0KKworCW5pbGZzX2Rlc3Ryb3lfbG9ncygmbG9ncyk7CisJc2NpLT5zY19zdXBlcl9yb290ID0gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgbmlsZnNfc2V0X25leHRfc2VnbWVudChzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcywKQEAgLTE5NzMsNyArMTk0MSw3IEBACiAJc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMgPSBzYmktPnNfbmlsZnM7CiAJaW50IHVwZGF0ZV9zciA9IChzY2ktPnNjX3N1cGVyX3Jvb3QgIT0gTlVMTCk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlZ2J1ZiwgJnNjaS0+c2Nfc2VnYnVmcywgc2JfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VnYnVmLCAmc2NpLT5zY193cml0ZV9sb2dzLCBzYl9saXN0KSB7CiAJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShiaCwgJnNlZ2J1Zi0+c2Jfc2Vnc3VtX2J1ZmZlcnMsCkBAIC0yMDQ2LDcgKzIwMTQsNyBAQAogCiAJc2NpLT5zY19uYmxrX2luYyArPSBzY2ktPnNjX25ibGtfdGhpc19pbmM7CiAKLQlzZWdidWYgPSBOSUxGU19MQVNUX1NFR0JVRigmc2NpLT5zY19zZWdidWZzKTsKKwlzZWdidWYgPSBOSUxGU19MQVNUX1NFR0JVRigmc2NpLT5zY193cml0ZV9sb2dzKTsKIAluaWxmc19zZXRfbmV4dF9zZWdtZW50KG5pbGZzLCBzZWdidWYpOwogCiAJaWYgKHVwZGF0ZV9zcikgewpAQCAtMjA1NywxMCArMjAyNSwyMyBAQAogCQljbGVhcl9iaXQoTklMRlNfU0NfSEFWRV9ERUxUQSwgJnNjaS0+c2NfZmxhZ3MpOwogCQljbGVhcl9iaXQoTklMRlNfU0NfRElSVFksICZzY2ktPnNjX2ZsYWdzKTsKIAkJc2V0X2JpdChOSUxGU19TQ19TVVBFUl9ST09ULCAmc2NpLT5zY19mbGFncyk7CisJCW5pbGZzX3NlZ2N0b3JfY2xlYXJfbWV0YWRhdGFfZGlydHkoc2NpKTsKIAl9IGVsc2UKIAkJY2xlYXJfYml0KE5JTEZTX1NDX1NVUEVSX1JPT1QsICZzY2ktPnNjX2ZsYWdzKTsKIH0KIAorc3RhdGljIGludCBuaWxmc19zZWdjdG9yX3dhaXQoc3RydWN0IG5pbGZzX3NjX2luZm8gKnNjaSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gbmlsZnNfd2FpdF9vbl9sb2dzKCZzY2ktPnNjX3dyaXRlX2xvZ3MpOworCWlmICghcmV0KSB7CisJCW5pbGZzX3NlZ2N0b3JfY29tcGxldGVfd3JpdGUoc2NpKTsKKwkJbmlsZnNfZGVzdHJveV9sb2dzKCZzY2ktPnNjX3dyaXRlX2xvZ3MpOworCX0KKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IG5pbGZzX3NlZ2N0b3JfY2hlY2tfaW5fZmlsZXMoc3RydWN0IG5pbGZzX3NjX2luZm8gKnNjaSwKIAkJCQkJc3RydWN0IG5pbGZzX3NiX2luZm8gKnNiaSkKIHsKQEAgLTIxNzMsNyArMjE1NCw3IEBACiAJCS8qIEF2b2lkIGVtcHR5IHNlZ21lbnQgKi8KIAkJaWYgKHNjaS0+c2Nfc3RhZ2Uuc2NudCA9PSBOSUxGU19TVF9ET05FICYmCiAJCSAgICBOSUxGU19TRUdfRU1QVFkoJnNjaS0+c2NfY3Vyc2VnLT5zYl9zdW0pKSB7Ci0JCQluaWxmc19zZWdjdG9yX2VuZF9jb25zdHJ1Y3Rpb24oc2NpLCBuaWxmcywgMSk7CisJCQluaWxmc19zZWdjdG9yX2Fib3J0X2NvbnN0cnVjdGlvbihzY2ksIG5pbGZzLCAxKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKQEAgLTIxODcsNyArMjE2OCw3IEBACiAJCWlmIChoYXNfc3IpIHsKIAkJCWVyciA9IG5pbGZzX3NlZ2N0b3JfZmlsbF9pbl9jaGVja3BvaW50KHNjaSk7CiAJCQlpZiAodW5saWtlbHkoZXJyKSkKLQkJCQlnb3RvIGZhaWxlZF90b19tYWtlX3VwOworCQkJCWdvdG8gZmFpbGVkX3RvX3dyaXRlOwogCiAJCQluaWxmc19zZWdjdG9yX2ZpbGxfaW5fc3VwZXJfcm9vdChzY2ksIG5pbGZzKTsKIAkJfQpAQCAtMjE5NSw0MiArMjE3Niw0NiBAQAogCiAJCS8qIFdyaXRlIHBhcnRpYWwgc2VnbWVudHMgKi8KIAkJZXJyID0gbmlsZnNfc2VnY3Rvcl9wcmVwYXJlX3dyaXRlKHNjaSwgJmZhaWxlZF9wYWdlKTsKLQkJaWYgKHVubGlrZWx5KGVycikpCisJCWlmIChlcnIpIHsKKwkJCW5pbGZzX2Fib3J0X2xvZ3MoJnNjaS0+c2Nfc2VnYnVmcywgZmFpbGVkX3BhZ2UsCisJCQkJCSBzY2ktPnNjX3N1cGVyX3Jvb3QsIGVycik7CiAJCQlnb3RvIGZhaWxlZF90b193cml0ZTsKLQorCQl9CiAJCW5pbGZzX3NlZ2N0b3JfZmlsbF9pbl9jaGVja3N1bXMoc2NpLCBuaWxmcy0+bnNfY3JjX3NlZWQpOwogCi0JCWVyciA9IG5pbGZzX3NlZ2N0b3Jfd3JpdGUoc2NpLCBuaWxmcy0+bnNfYmRpKTsKKwkJZXJyID0gbmlsZnNfc2VnY3Rvcl93cml0ZShzY2ksIG5pbGZzKTsKIAkJaWYgKHVubGlrZWx5KGVycikpCiAJCQlnb3RvIGZhaWxlZF90b193cml0ZTsKIAotCQluaWxmc19zZWdjdG9yX2NvbXBsZXRlX3dyaXRlKHNjaSk7Ci0KLQkJLyogQ29tbWl0IHNlZ21lbnRzICovCi0JCWlmIChoYXNfc3IpCi0JCQluaWxmc19zZWdjdG9yX2NsZWFyX21ldGFkYXRhX2RpcnR5KHNjaSk7Ci0KLQkJbmlsZnNfc2VnY3Rvcl9lbmRfY29uc3RydWN0aW9uKHNjaSwgbmlsZnMsIDApOwotCisJCWlmIChzY2ktPnNjX3N0YWdlLnNjbnQgPT0gTklMRlNfU1RfRE9ORSB8fAorCQkgICAgbmlsZnMtPm5zX2Jsb2Nrc2l6ZV9iaXRzICE9IFBBR0VfQ0FDSEVfU0hJRlQpIHsKKwkJCS8qCisJCQkgKiBBdCB0aGlzIHBvaW50LCB3ZSBhdm9pZCBkb3VibGUgYnVmZmVyaW5nCisJCQkgKiBmb3IgYmxvY2tzaXplIDwgcGFnZXNpemUgYmVjYXVzZSBwYWdlIGRpcnR5CisJCQkgKiBmbGFnIGlzIHR1cm5lZCBvZmYgZHVyaW5nIHdyaXRlIGFuZCBkaXJ0eQorCQkJICogYnVmZmVycyBhcmUgbm90IHByb3Blcmx5IGNvbGxlY3RlZCBmb3IKKwkJCSAqIHBhZ2VzIGNyb3NzaW5nIG92ZXIgc2VnbWVudHMuCisJCQkgKi8KKwkJCWVyciA9IG5pbGZzX3NlZ2N0b3Jfd2FpdChzY2kpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGZhaWxlZF90b193cml0ZTsKKwkJfQogCX0gd2hpbGUgKHNjaS0+c2Nfc3RhZ2Uuc2NudCAhPSBOSUxGU19TVF9ET05FKTsKIAorCXNjaS0+c2Nfc3VwZXJfcm9vdCA9IE5VTEw7CisKICBvdXQ6Ci0JbmlsZnNfc2VnY3Rvcl9kZXN0cm95X3NlZ21lbnRfYnVmZmVycyhzY2kpOwogCW5pbGZzX3NlZ2N0b3JfY2hlY2tfb3V0X2ZpbGVzKHNjaSwgc2JpKTsKIAlyZXR1cm4gZXJyOwogCiAgZmFpbGVkX3RvX3dyaXRlOgotCW5pbGZzX3NlZ2N0b3JfYWJvcnRfd3JpdGUoc2NpLCBmYWlsZWRfcGFnZSwgZXJyKTsKLQluaWxmc19zZWdjdG9yX2NhbmNlbF9zZWd1c2FnZShzY2ksIG5pbGZzLT5uc19zdWZpbGUpOwotCi0gZmFpbGVkX3RvX21ha2VfdXA6CiAJaWYgKHNjaS0+c2Nfc3RhZ2UuZmxhZ3MgJiBOSUxGU19DRl9JRklMRV9TVEFSVEVEKQogCQluaWxmc19yZWRpcnR5X2lub2Rlcygmc2NpLT5zY19kaXJ0eV9maWxlcyk7CiAKICBmYWlsZWQ6CiAJaWYgKG5pbGZzX2RvaW5nX2djKCkpCiAJCW5pbGZzX3JlZGlydHlfaW5vZGVzKCZzY2ktPnNjX2djX2lub2Rlcyk7Ci0JbmlsZnNfc2VnY3Rvcl9lbmRfY29uc3RydWN0aW9uKHNjaSwgbmlsZnMsIGVycik7CisJbmlsZnNfc2VnY3Rvcl9hYm9ydF9jb25zdHJ1Y3Rpb24oc2NpLCBuaWxmcywgZXJyKTsKIAlnb3RvIG91dDsKIH0KIApAQCAtMjU1OSw3ICsyNTQ0LDcgQEAKIAogCXNjaS0+c2NfZnJlZXNlZ3MgPSBrYnVmc1s0XTsKIAlzY2ktPnNjX25mcmVlc2VncyA9IGFyZ3ZbNF0udl9ubWVtYnM7Ci0JbGlzdF9zcGxpY2VfaW5pdCgmbmlsZnMtPm5zX2djX2lub2Rlcywgc2NpLT5zY19nY19pbm9kZXMucHJldik7CisJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZuaWxmcy0+bnNfZ2NfaW5vZGVzLCAmc2NpLT5zY19nY19pbm9kZXMpOwogCiAJZm9yICg7OykgewogCQluaWxmc19zZWdjdG9yX2FjY2VwdChzY2ksICZyZXEpOwpAQCAtMjc4OCw2ICsyNzczLDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmc2NpLT5zY19zdGF0ZV9sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmc2NpLT5zY19kaXJ0eV9maWxlcyk7CiAJSU5JVF9MSVNUX0hFQUQoJnNjaS0+c2Nfc2VnYnVmcyk7CisJSU5JVF9MSVNUX0hFQUQoJnNjaS0+c2Nfd3JpdGVfbG9ncyk7CiAJSU5JVF9MSVNUX0hFQUQoJnNjaS0+c2NfZ2NfaW5vZGVzKTsKIAlJTklUX0xJU1RfSEVBRCgmc2NpLT5zY19jb3BpZWRfYnVmZmVycyk7CiAKQEAgLTI4NTUsNiArMjg0MSw3IEBACiAJfQogCiAJV0FSTl9PTighbGlzdF9lbXB0eSgmc2NpLT5zY19zZWdidWZzKSk7CisJV0FSTl9PTighbGlzdF9lbXB0eSgmc2NpLT5zY193cml0ZV9sb2dzKSk7CiAKIAlkb3duX3dyaXRlKCZzYmktPnNfbmlsZnMtPm5zX3NlZ2N0b3Jfc2VtKTsKIApkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3NlZ21lbnQuaCBiL2ZzL25pbGZzMi9zZWdtZW50LmgKaW5kZXggMGQyYTQ3NS4uM2QzYWIyZiAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL3NlZ21lbnQuaAorKysgYi9mcy9uaWxmczIvc2VnbWVudC5oCkBAIC05Nyw2ICs5Nyw3IEBACiAgKiBAc2NfZHN5bmNfc3RhcnQ6IHN0YXJ0IGJ5dGUgb2Zmc2V0IG9mIGRhdGEgcGFnZXMKICAqIEBzY19kc3luY19lbmQ6IGVuZCBieXRlIG9mZnNldCBvZiBkYXRhIHBhZ2VzIChpbmNsdXNpdmUpCiAgKiBAc2Nfc2VnYnVmczogTGlzdCBvZiBzZWdtZW50IGJ1ZmZlcnMKKyAqIEBzY193cml0ZV9sb2dzOiBMaXN0IG9mIHNlZ21lbnQgYnVmZmVycyB0byBob2xkIGxvZ3MgdW5kZXIgd3JpdGluZwogICogQHNjX3NlZ2J1Zl9uYmxvY2tzOiBOdW1iZXIgb2YgYXZhaWxhYmxlIGJsb2NrcyBpbiBzZWdtZW50IGJ1ZmZlcnMuCiAgKiBAc2NfY3Vyc2VnOiBDdXJyZW50IHNlZ21lbnQgYnVmZmVyCiAgKiBAc2Nfc3VwZXJfcm9vdDogUG9pbnRlciB0byB0aGUgc3VwZXIgcm9vdCBidWZmZXIKQEAgLTE0Myw2ICsxNDQsNyBAQAogCiAJLyogU2VnbWVudCBidWZmZXJzICovCiAJc3RydWN0IGxpc3RfaGVhZAlzY19zZWdidWZzOworCXN0cnVjdCBsaXN0X2hlYWQJc2Nfd3JpdGVfbG9nczsKIAl1bnNpZ25lZCBsb25nCQlzY19zZWdidWZfbmJsb2NrczsKIAlzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNjX2N1cnNlZzsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgICAgICpzY19zdXBlcl9yb290OwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3N1ZmlsZS5jIGIvZnMvbmlsZnMyL3N1ZmlsZS5jCmluZGV4IDM3OTk0ZDQuLmI2YzM2ZDAgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9zdWZpbGUuYworKysgYi9mcy9uaWxmczIvc3VmaWxlLmMKQEAgLTMxLDYgKzMxLDE2IEBACiAjaW5jbHVkZSAic3VmaWxlLmgiCiAKIAorc3RydWN0IG5pbGZzX3N1ZmlsZV9pbmZvIHsKKwlzdHJ1Y3QgbmlsZnNfbWR0X2luZm8gbWk7CisJdW5zaWduZWQgbG9uZyBuY2xlYW5zZWdzOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmlsZnNfc3VmaWxlX2luZm8gKk5JTEZTX1NVSShzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSkKK3sKKwlyZXR1cm4gKHN0cnVjdCBuaWxmc19zdWZpbGVfaW5mbyAqKU5JTEZTX01EVChzdWZpbGUpOworfQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKIG5pbGZzX3N1ZmlsZV9zZWdtZW50X3VzYWdlc19wZXJfYmxvY2soY29uc3Qgc3RydWN0IGlub2RlICpzdWZpbGUpCiB7CkBAIC02MiwxNCArNzIsNiBAQAogCQkgICAgIG1heCAtIGN1cnIgKyAxKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgbmlsZnNfc3VmaWxlX2hlYWRlciAqCi1uaWxmc19zdWZpbGVfYmxvY2tfZ2V0X2hlYWRlcihjb25zdCBzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSwKLQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCi0JCQkgICAgICB2b2lkICprYWRkcikKLXsKLQlyZXR1cm4ga2FkZHIgKyBiaF9vZmZzZXQoYmgpOwotfQotCiBzdGF0aWMgc3RydWN0IG5pbGZzX3NlZ21lbnRfdXNhZ2UgKgogbmlsZnNfc3VmaWxlX2Jsb2NrX2dldF9zZWdtZW50X3VzYWdlKGNvbnN0IHN0cnVjdCBpbm9kZSAqc3VmaWxlLCBfX3U2NCBzZWdudW0sCiAJCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB2b2lkICprYWRkcikKQEAgLTExMCw2ICsxMTIsMTUgQEAKIH0KIAogLyoqCisgKiBuaWxmc19zdWZpbGVfZ2V0X25jbGVhbnNlZ3MgLSByZXR1cm4gdGhlIG51bWJlciBvZiBjbGVhbiBzZWdtZW50cworICogQHN1ZmlsZTogaW5vZGUgb2Ygc2VnbWVudCB1c2FnZSBmaWxlCisgKi8KK3Vuc2lnbmVkIGxvbmcgbmlsZnNfc3VmaWxlX2dldF9uY2xlYW5zZWdzKHN0cnVjdCBpbm9kZSAqc3VmaWxlKQoreworCXJldHVybiBOSUxGU19TVUkoc3VmaWxlKS0+bmNsZWFuc2VnczsKK30KKworLyoqCiAgKiBuaWxmc19zdWZpbGVfdXBkYXRldiAtIG1vZGlmeSBtdWx0aXBsZSBzZWdtZW50IHVzYWdlcyBhdCBhIHRpbWUKICAqIEBzdWZpbGU6IGlub2RlIG9mIHNlZ21lbnQgdXNhZ2UgZmlsZQogICogQHNlZ251bXY6IGFycmF5IG9mIHNlZ21lbnQgbnVtYmVycwpAQCAtMjcwLDcgKzI4MSw3IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X3NlbTsKIAlrYWRkciA9IGttYXBfYXRvbWljKGhlYWRlcl9iaC0+Yl9wYWdlLCBLTV9VU0VSMCk7Ci0JaGVhZGVyID0gbmlsZnNfc3VmaWxlX2Jsb2NrX2dldF9oZWFkZXIoc3VmaWxlLCBoZWFkZXJfYmgsIGthZGRyKTsKKwloZWFkZXIgPSBrYWRkciArIGJoX29mZnNldChoZWFkZXJfYmgpOwogCW5jbGVhbnNlZ3MgPSBsZTY0X3RvX2NwdShoZWFkZXItPnNoX25jbGVhbnNlZ3MpOwogCWxhc3RfYWxsb2MgPSBsZTY0X3RvX2NwdShoZWFkZXItPnNoX2xhc3RfYWxsb2MpOwogCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKQEAgLTMwMiwxMyArMzEzLDEzIEBACiAJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CiAKIAkJCWthZGRyID0ga21hcF9hdG9taWMoaGVhZGVyX2JoLT5iX3BhZ2UsIEtNX1VTRVIwKTsKLQkJCWhlYWRlciA9IG5pbGZzX3N1ZmlsZV9ibG9ja19nZXRfaGVhZGVyKAotCQkJCXN1ZmlsZSwgaGVhZGVyX2JoLCBrYWRkcik7CisJCQloZWFkZXIgPSBrYWRkciArIGJoX29mZnNldChoZWFkZXJfYmgpOwogCQkJbGU2NF9hZGRfY3B1KCZoZWFkZXItPnNoX25jbGVhbnNlZ3MsIC0xKTsKIAkJCWxlNjRfYWRkX2NwdSgmaGVhZGVyLT5zaF9uZGlydHlzZWdzLCAxKTsKIAkJCWhlYWRlci0+c2hfbGFzdF9hbGxvYyA9IGNwdV90b19sZTY0KHNlZ251bSk7CiAJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CiAKKwkJCU5JTEZTX1NVSShzdWZpbGUpLT5uY2xlYW5zZWdzLS07CiAJCQluaWxmc19tZHRfbWFya19idWZmZXJfZGlydHkoaGVhZGVyX2JoKTsKIAkJCW5pbGZzX21kdF9tYXJrX2J1ZmZlcl9kaXJ0eShzdV9iaCk7CiAJCQluaWxmc19tZHRfbWFya19kaXJ0eShzdWZpbGUpOwpAQCAtMzUxLDYgKzM2Miw4IEBACiAJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOwogCiAJbmlsZnNfc3VmaWxlX21vZF9jb3VudGVyKGhlYWRlcl9iaCwgLTEsIDEpOworCU5JTEZTX1NVSShzdWZpbGUpLT5uY2xlYW5zZWdzLS07CisKIAluaWxmc19tZHRfbWFya19idWZmZXJfZGlydHkoc3VfYmgpOwogCW5pbGZzX21kdF9tYXJrX2RpcnR5KHN1ZmlsZSk7CiB9CkBAIC0zODAsNiArMzkzLDggQEAKIAlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CiAKIAluaWxmc19zdWZpbGVfbW9kX2NvdW50ZXIoaGVhZGVyX2JoLCBjbGVhbiA/ICh1NjQpLTEgOiAwLCBkaXJ0eSA/IDAgOiAxKTsKKwlOSUxGU19TVUkoc3VmaWxlKS0+bmNsZWFuc2VncyAtPSBjbGVhbjsKKwogCW5pbGZzX21kdF9tYXJrX2J1ZmZlcl9kaXJ0eShzdV9iaCk7CiAJbmlsZnNfbWR0X21hcmtfZGlydHkoc3VmaWxlKTsKIH0KQEAgLTQwOSw1OCArNDI0LDYxIEBACiAJbmlsZnNfbWR0X21hcmtfYnVmZmVyX2RpcnR5KHN1X2JoKTsKIAogCW5pbGZzX3N1ZmlsZV9tb2RfY291bnRlcihoZWFkZXJfYmgsIDEsIHN1ZGlydHkgPyAodTY0KS0xIDogMCk7CisJTklMRlNfU1VJKHN1ZmlsZSktPm5jbGVhbnNlZ3MrKzsKKwogCW5pbGZzX21kdF9tYXJrX2RpcnR5KHN1ZmlsZSk7CiB9CiAKIC8qKgotICogbmlsZnNfc3VmaWxlX2dldF9zZWdtZW50X3VzYWdlIC0gZ2V0IGEgc2VnbWVudCB1c2FnZQorICogbmlsZnNfc3VmaWxlX21hcmtfZGlydHkgLSBtYXJrIHRoZSBidWZmZXIgaGF2aW5nIGEgc2VnbWVudCB1c2FnZSBkaXJ0eQogICogQHN1ZmlsZTogaW5vZGUgb2Ygc2VnbWVudCB1c2FnZSBmaWxlCiAgKiBAc2VnbnVtOiBzZWdtZW50IG51bWJlcgotICogQHN1cDogcG9pbnRlciB0byBzZWdtZW50IHVzYWdlCi0gKiBAYmhwOiBwb2ludGVyIHRvIGJ1ZmZlciBoZWFkCi0gKgotICogRGVzY3JpcHRpb246IG5pbGZzX3N1ZmlsZV9nZXRfc2VnbWVudF91c2FnZSgpIGFjcXVpcmVzIHRoZSBzZWdtZW50IHVzYWdlCi0gKiBzcGVjaWZpZWQgYnkgQHNlZ251bS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6IE9uIHN1Y2Nlc3MsIDAgaXMgcmV0dXJuZWQsIGFuZCB0aGUgc2VnbWVudCB1c2FnZSBhbmQgdGhlCi0gKiBidWZmZXIgaGVhZCBvZiB0aGUgYnVmZmVyIG9uIHdoaWNoIHRoZSBzZWdtZW50IHVzYWdlIGlzIGxvY2F0ZWQgYXJlIHN0b3JlZAotICogaW4gdGhlIHBsYWNlIHBvaW50ZWQgYnkgQHN1cCBhbmQgQGJocCwgcmVzcGVjdGl2ZWx5LiBPbiBlcnJvciwgb25lIG9mIHRoZQotICogZm9sbG93aW5nIG5lZ2F0aXZlIGVycm9yIGNvZGVzIGlzIHJldHVybmVkLgotICoKLSAqICUtRUlPIC0gSS9PIGVycm9yLgotICoKLSAqICUtRU5PTUVNIC0gSW5zdWZmaWNpZW50IGFtb3VudCBvZiBtZW1vcnkgYXZhaWxhYmxlLgotICoKLSAqICUtRUlOVkFMIC0gSW52YWxpZCBzZWdtZW50IHVzYWdlIG51bWJlci4KICAqLwotaW50IG5pbGZzX3N1ZmlsZV9nZXRfc2VnbWVudF91c2FnZShzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSwgX191NjQgc2VnbnVtLAotCQkJCSAgIHN0cnVjdCBuaWxmc19zZWdtZW50X3VzYWdlICoqc3VwLAotCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocCkKK2ludCBuaWxmc19zdWZpbGVfbWFya19kaXJ0eShzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSwgX191NjQgc2VnbnVtKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IHJldDsKKworCXJldCA9IG5pbGZzX3N1ZmlsZV9nZXRfc2VnbWVudF91c2FnZV9ibG9jayhzdWZpbGUsIHNlZ251bSwgMCwgJmJoKTsKKwlpZiAoIXJldCkgeworCQluaWxmc19tZHRfbWFya19idWZmZXJfZGlydHkoYmgpOworCQluaWxmc19tZHRfbWFya19kaXJ0eShzdWZpbGUpOworCQlicmVsc2UoYmgpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG5pbGZzX3N1ZmlsZV9zZXRfc2VnbWVudF91c2FnZSAtIHNldCB1c2FnZSBvZiBhIHNlZ21lbnQKKyAqIEBzdWZpbGU6IGlub2RlIG9mIHNlZ21lbnQgdXNhZ2UgZmlsZQorICogQHNlZ251bTogc2VnbWVudCBudW1iZXIKKyAqIEBuYmxvY2tzOiBudW1iZXIgb2YgbGl2ZSBibG9ja3MgaW4gdGhlIHNlZ21lbnQKKyAqIEBtb2R0aW1lOiBtb2RpZmljYXRpb24gdGltZSAob3B0aW9uKQorICovCitpbnQgbmlsZnNfc3VmaWxlX3NldF9zZWdtZW50X3VzYWdlKHN0cnVjdCBpbm9kZSAqc3VmaWxlLCBfX3U2NCBzZWdudW0sCisJCQkJICAgdW5zaWduZWQgbG9uZyBuYmxvY2tzLCB0aW1lX3QgbW9kdGltZSkKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCXN0cnVjdCBuaWxmc19zZWdtZW50X3VzYWdlICpzdTsKIAl2b2lkICprYWRkcjsKIAlpbnQgcmV0OwogCi0JLyogc2VnbnVtIGlzIDAgb3JpZ2luICovCi0JaWYgKHNlZ251bSA+PSBuaWxmc19zdWZpbGVfZ2V0X25zZWdtZW50cyhzdWZpbGUpKQotCQlyZXR1cm4gLUVJTlZBTDsKIAlkb3duX3dyaXRlKCZOSUxGU19NRFQoc3VmaWxlKS0+bWlfc2VtKTsKLQlyZXQgPSBuaWxmc19zdWZpbGVfZ2V0X3NlZ21lbnRfdXNhZ2VfYmxvY2soc3VmaWxlLCBzZWdudW0sIDEsICZiaCk7CisJcmV0ID0gbmlsZnNfc3VmaWxlX2dldF9zZWdtZW50X3VzYWdlX2Jsb2NrKHN1ZmlsZSwgc2VnbnVtLCAwLCAmYmgpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dF9zZW07Ci0Ja2FkZHIgPSBrbWFwKGJoLT5iX3BhZ2UpOwotCXN1ID0gbmlsZnNfc3VmaWxlX2Jsb2NrX2dldF9zZWdtZW50X3VzYWdlKHN1ZmlsZSwgc2VnbnVtLCBiaCwga2FkZHIpOwotCWlmIChuaWxmc19zZWdtZW50X3VzYWdlX2Vycm9yKHN1KSkgewotCQlrdW5tYXAoYmgtPmJfcGFnZSk7Ci0JCWJyZWxzZShiaCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X3NlbTsKLQl9CiAKLQlpZiAoc3VwICE9IE5VTEwpCi0JCSpzdXAgPSBzdTsKLQkqYmhwID0gYmg7CisJa2FkZHIgPSBrbWFwX2F0b21pYyhiaC0+Yl9wYWdlLCBLTV9VU0VSMCk7CisJc3UgPSBuaWxmc19zdWZpbGVfYmxvY2tfZ2V0X3NlZ21lbnRfdXNhZ2Uoc3VmaWxlLCBzZWdudW0sIGJoLCBrYWRkcik7CisJV0FSTl9PTihuaWxmc19zZWdtZW50X3VzYWdlX2Vycm9yKHN1KSk7CisJaWYgKG1vZHRpbWUpCisJCXN1LT5zdV9sYXN0bW9kID0gY3B1X3RvX2xlNjQobW9kdGltZSk7CisJc3UtPnN1X25ibG9ja3MgPSBjcHVfdG9fbGUzMihuYmxvY2tzKTsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisKKwluaWxmc19tZHRfbWFya19idWZmZXJfZGlydHkoYmgpOworCW5pbGZzX21kdF9tYXJrX2RpcnR5KHN1ZmlsZSk7CisJYnJlbHNlKGJoKTsKIAogIG91dF9zZW06CiAJdXBfd3JpdGUoJk5JTEZTX01EVChzdWZpbGUpLT5taV9zZW0pOwpAQCAtNDY4LDIzICs0ODYsNiBAQAogfQogCiAvKioKLSAqIG5pbGZzX3N1ZmlsZV9wdXRfc2VnbWVudF91c2FnZSAtIHB1dCBhIHNlZ21lbnQgdXNhZ2UKLSAqIEBzdWZpbGU6IGlub2RlIG9mIHNlZ21lbnQgdXNhZ2UgZmlsZQotICogQHNlZ251bTogc2VnbWVudCBudW1iZXIKLSAqIEBiaDogYnVmZmVyIGhlYWQKLSAqCi0gKiBEZXNjcmlwdGlvbjogbmlsZnNfc3VmaWxlX3B1dF9zZWdtZW50X3VzYWdlKCkgcmVsZWFzZXMgdGhlIHNlZ21lbnQgdXNhZ2UKLSAqIHNwZWNpZmllZCBieSBAc2VnbnVtLiBAYmggbXVzdCBiZSB0aGUgYnVmZmVyIGhlYWQgd2hpY2ggaGF2ZSBiZWVuIHJldHVybmVkCi0gKiBieSBhIHByZXZpb3VzIGNhbGwgdG8gbmlsZnNfc3VmaWxlX2dldF9zZWdtZW50X3VzYWdlKCkgd2l0aCBAc2VnbnVtLgotICovCi12b2lkIG5pbGZzX3N1ZmlsZV9wdXRfc2VnbWVudF91c2FnZShzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSwgX191NjQgc2VnbnVtLAotCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCWt1bm1hcChiaC0+Yl9wYWdlKTsKLQlicmVsc2UoYmgpOwotfQotCi0vKioKICAqIG5pbGZzX3N1ZmlsZV9nZXRfc3RhdCAtIGdldCBzZWdtZW50IHVzYWdlIHN0YXRpc3RpY3MKICAqIEBzdWZpbGU6IGlub2RlIG9mIHNlZ21lbnQgdXNhZ2UgZmlsZQogICogQHN0YXQ6IHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgb2Ygc2VnbWVudCB1c2FnZSBzdGF0aXN0aWNzCkBAIC01MTUsNyArNTE2LDcgQEAKIAkJZ290byBvdXRfc2VtOwogCiAJa2FkZHIgPSBrbWFwX2F0b21pYyhoZWFkZXJfYmgtPmJfcGFnZSwgS01fVVNFUjApOwotCWhlYWRlciA9IG5pbGZzX3N1ZmlsZV9ibG9ja19nZXRfaGVhZGVyKHN1ZmlsZSwgaGVhZGVyX2JoLCBrYWRkcik7CisJaGVhZGVyID0ga2FkZHIgKyBiaF9vZmZzZXQoaGVhZGVyX2JoKTsKIAlzdXN0YXQtPnNzX25zZWdzID0gbmlsZnNfc3VmaWxlX2dldF9uc2VnbWVudHMoc3VmaWxlKTsKIAlzdXN0YXQtPnNzX25jbGVhbnNlZ3MgPSBsZTY0X3RvX2NwdShoZWFkZXItPnNoX25jbGVhbnNlZ3MpOwogCXN1c3RhdC0+c3NfbmRpcnR5c2VncyA9IGxlNjRfdG9fY3B1KGhlYWRlci0+c2hfbmRpcnR5c2Vncyk7CkBAIC01MzIsMzMgKzUzMyw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoqCi0gKiBuaWxmc19zdWZpbGVfZ2V0X25jbGVhbnNlZ3MgLSBnZXQgdGhlIG51bWJlciBvZiBjbGVhbiBzZWdtZW50cwotICogQHN1ZmlsZTogaW5vZGUgb2Ygc2VnbWVudCB1c2FnZSBmaWxlCi0gKiBAbnNlZ3NwOiBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgY2xlYW4gc2VnbWVudHMKLSAqCi0gKiBEZXNjcmlwdGlvbjogbmlsZnNfc3VmaWxlX2dldF9uY2xlYW5zZWdzKCkgYWNxdWlyZXMgdGhlIG51bWJlciBvZiBjbGVhbgotICogc2VnbWVudHMuCi0gKgotICogUmV0dXJuIFZhbHVlOiBPbiBzdWNjZXNzLCAwIGlzIHJldHVybmVkIGFuZCB0aGUgbnVtYmVyIG9mIGNsZWFuIHNlZ21lbnRzIGlzCi0gKiBzdG9yZWQgaW4gdGhlIHBsYWNlIHBvaW50ZWQgYnkgQG5zZWdzcC4gT24gZXJyb3IsIG9uZSBvZiB0aGUgZm9sbG93aW5nCi0gKiBuZWdhdGl2ZSBlcnJvciBjb2RlcyBpcyByZXR1cm5lZC4KLSAqCi0gKiAlLUVJTyAtIEkvTyBlcnJvci4KLSAqCi0gKiAlLUVOT01FTSAtIEluc3VmZmljaWVudCBhbW91bnQgb2YgbWVtb3J5IGF2YWlsYWJsZS4KLSAqLwotaW50IG5pbGZzX3N1ZmlsZV9nZXRfbmNsZWFuc2VncyhzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSwgdW5zaWduZWQgbG9uZyAqbnNlZ3NwKQotewotCXN0cnVjdCBuaWxmc19zdXN0YXQgc3VzdGF0OwotCWludCByZXQ7Ci0KLQlyZXQgPSBuaWxmc19zdWZpbGVfZ2V0X3N0YXQoc3VmaWxlLCAmc3VzdGF0KTsKLQlpZiAocmV0ID09IDApCi0JCSpuc2Vnc3AgPSBzdXN0YXQuc3NfbmNsZWFuc2VnczsKLQlyZXR1cm4gcmV0OwotfQotCiB2b2lkIG5pbGZzX3N1ZmlsZV9kb19zZXRfZXJyb3Ioc3RydWN0IGlub2RlICpzdWZpbGUsIF9fdTY0IHNlZ251bSwKIAkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWRlcl9iaCwKIAkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnN1X2JoKQpAQCAtNTc3LDggKzU1MSwxMCBAQAogCW5pbGZzX3NlZ21lbnRfdXNhZ2Vfc2V0X2Vycm9yKHN1KTsKIAlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CiAKLQlpZiAoc3VjbGVhbikKKwlpZiAoc3VjbGVhbikgewogCQluaWxmc19zdWZpbGVfbW9kX2NvdW50ZXIoaGVhZGVyX2JoLCAtMSwgMCk7CisJCU5JTEZTX1NVSShzdWZpbGUpLT5uY2xlYW5zZWdzLS07CisJfQogCW5pbGZzX21kdF9tYXJrX2J1ZmZlcl9kaXJ0eShzdV9iaCk7CiAJbmlsZnNfbWR0X21hcmtfZGlydHkoc3VmaWxlKTsKIH0KQEAgLTY1NywzICs2MzMsNDggQEAKIAl1cF9yZWFkKCZOSUxGU19NRFQoc3VmaWxlKS0+bWlfc2VtKTsKIAlyZXR1cm4gcmV0OwogfQorCisvKioKKyAqIG5pbGZzX3N1ZmlsZV9yZWFkIC0gcmVhZCBzdWZpbGUgaW5vZGUKKyAqIEBzdWZpbGU6IHN1ZmlsZSBpbm9kZQorICogQHJhd19pbm9kZTogb24tZGlzayBzdWZpbGUgaW5vZGUKKyAqLworaW50IG5pbGZzX3N1ZmlsZV9yZWFkKHN0cnVjdCBpbm9kZSAqc3VmaWxlLCBzdHJ1Y3QgbmlsZnNfaW5vZGUgKnJhd19pbm9kZSkKK3sKKwlzdHJ1Y3QgbmlsZnNfc3VmaWxlX2luZm8gKnN1aSA9IE5JTEZTX1NVSShzdWZpbGUpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZGVyX2JoOworCXN0cnVjdCBuaWxmc19zdWZpbGVfaGVhZGVyICpoZWFkZXI7CisJdm9pZCAqa2FkZHI7CisJaW50IHJldDsKKworCXJldCA9IG5pbGZzX3JlYWRfaW5vZGVfY29tbW9uKHN1ZmlsZSwgcmF3X2lub2RlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG5pbGZzX3N1ZmlsZV9nZXRfaGVhZGVyX2Jsb2NrKHN1ZmlsZSwgJmhlYWRlcl9iaCk7CisJaWYgKCFyZXQpIHsKKwkJa2FkZHIgPSBrbWFwX2F0b21pYyhoZWFkZXJfYmgtPmJfcGFnZSwgS01fVVNFUjApOworCQloZWFkZXIgPSBrYWRkciArIGJoX29mZnNldChoZWFkZXJfYmgpOworCQlzdWktPm5jbGVhbnNlZ3MgPSBsZTY0X3RvX2NwdShoZWFkZXItPnNoX25jbGVhbnNlZ3MpOworCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCWJyZWxzZShoZWFkZXJfYmgpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG5pbGZzX3N1ZmlsZV9uZXcgLSBjcmVhdGUgc3VmaWxlCisgKiBAbmlsZnM6IG5pbGZzIG9iamVjdAorICogQHN1c2l6ZTogc2l6ZSBvZiBhIHNlZ21lbnQgdXNhZ2UgZW50cnkKKyAqLworc3RydWN0IGlub2RlICpuaWxmc19zdWZpbGVfbmV3KHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzLCBzaXplX3Qgc3VzaXplKQoreworCXN0cnVjdCBpbm9kZSAqc3VmaWxlOworCisJc3VmaWxlID0gbmlsZnNfbWR0X25ldyhuaWxmcywgTlVMTCwgTklMRlNfU1VGSUxFX0lOTywKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IG5pbGZzX3N1ZmlsZV9pbmZvKSk7CisJaWYgKHN1ZmlsZSkKKwkJbmlsZnNfbWR0X3NldF9lbnRyeV9zaXplKHN1ZmlsZSwgc3VzaXplLAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBuaWxmc19zdWZpbGVfaGVhZGVyKSk7CisJcmV0dXJuIHN1ZmlsZTsKK30KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9zdWZpbGUuaCBiL2ZzL25pbGZzMi9zdWZpbGUuaAppbmRleCAwZTk5ZTVjLi4xNTE2M2I4IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvc3VmaWxlLmgKKysrIGIvZnMvbmlsZnMyL3N1ZmlsZS5oCkBAIC0zNCwxNCArMzQsMTMgQEAKIAlyZXR1cm4gTklMRlNfTURUKHN1ZmlsZSktPm1pX25pbGZzLT5uc19uc2VnbWVudHM7CiB9CiAKK3Vuc2lnbmVkIGxvbmcgbmlsZnNfc3VmaWxlX2dldF9uY2xlYW5zZWdzKHN0cnVjdCBpbm9kZSAqc3VmaWxlKTsKKwogaW50IG5pbGZzX3N1ZmlsZV9hbGxvYyhzdHJ1Y3QgaW5vZGUgKiwgX191NjQgKik7Ci1pbnQgbmlsZnNfc3VmaWxlX2dldF9zZWdtZW50X3VzYWdlKHN0cnVjdCBpbm9kZSAqLCBfX3U2NCwKLQkJCQkgICBzdHJ1Y3QgbmlsZnNfc2VnbWVudF91c2FnZSAqKiwKLQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiopOwotdm9pZCBuaWxmc19zdWZpbGVfcHV0X3NlZ21lbnRfdXNhZ2Uoc3RydWN0IGlub2RlICosIF9fdTY0LAotCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7CitpbnQgbmlsZnNfc3VmaWxlX21hcmtfZGlydHkoc3RydWN0IGlub2RlICpzdWZpbGUsIF9fdTY0IHNlZ251bSk7CitpbnQgbmlsZnNfc3VmaWxlX3NldF9zZWdtZW50X3VzYWdlKHN0cnVjdCBpbm9kZSAqc3VmaWxlLCBfX3U2NCBzZWdudW0sCisJCQkJICAgdW5zaWduZWQgbG9uZyBuYmxvY2tzLCB0aW1lX3QgbW9kdGltZSk7CiBpbnQgbmlsZnNfc3VmaWxlX2dldF9zdGF0KHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgbmlsZnNfc3VzdGF0ICopOwotaW50IG5pbGZzX3N1ZmlsZV9nZXRfbmNsZWFuc2VncyhzdHJ1Y3QgaW5vZGUgKiwgdW5zaWduZWQgbG9uZyAqKTsKIHNzaXplX3QgbmlsZnNfc3VmaWxlX2dldF9zdWluZm8oc3RydWN0IGlub2RlICosIF9fdTY0LCB2b2lkICosIHVuc2lnbmVkLAogCQkJCXNpemVfdCk7CiAKQEAgLTYyLDYgKzYxLDkgQEAKIHZvaWQgbmlsZnNfc3VmaWxlX2RvX3NldF9lcnJvcihzdHJ1Y3QgaW5vZGUgKiwgX191NjQsIHN0cnVjdCBidWZmZXJfaGVhZCAqLAogCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKIAoraW50IG5pbGZzX3N1ZmlsZV9yZWFkKHN0cnVjdCBpbm9kZSAqc3VmaWxlLCBzdHJ1Y3QgbmlsZnNfaW5vZGUgKnJhd19pbm9kZSk7CitzdHJ1Y3QgaW5vZGUgKm5pbGZzX3N1ZmlsZV9uZXcoc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMsIHNpemVfdCBzdXNpemUpOworCiAvKioKICAqIG5pbGZzX3N1ZmlsZV9zY3JhcCAtIG1ha2UgYSBzZWdtZW50IGdhcmJhZ2UKICAqIEBzdWZpbGU6IGlub2RlIG9mIHNlZ21lbnQgdXNhZ2UgZmlsZQpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3N1cGVyLmMgYi9mcy9uaWxmczIvc3VwZXIuYwppbmRleCA2NDRlNjY3Li41NDAzYjNlIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvc3VwZXIuYworKysgYi9mcy9uaWxmczIvc3VwZXIuYwpAQCAtMzYzLDE0ICszNjMsMTAgQEAKIAlsaXN0X2FkZCgmc2JpLT5zX2xpc3QsICZuaWxmcy0+bnNfc3VwZXJzKTsKIAl1cF93cml0ZSgmbmlsZnMtPm5zX3N1cGVyX3NlbSk7CiAKLQlzYmktPnNfaWZpbGUgPSBuaWxmc19tZHRfbmV3KG5pbGZzLCBzYmktPnNfc3VwZXIsIE5JTEZTX0lGSUxFX0lOTyk7CisJc2JpLT5zX2lmaWxlID0gbmlsZnNfaWZpbGVfbmV3KHNiaSwgbmlsZnMtPm5zX2lub2RlX3NpemUpOwogCWlmICghc2JpLT5zX2lmaWxlKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWVyciA9IG5pbGZzX3BhbGxvY19pbml0X2Jsb2NrZ3JvdXAoc2JpLT5zX2lmaWxlLCBuaWxmcy0+bnNfaW5vZGVfc2l6ZSk7Ci0JaWYgKHVubGlrZWx5KGVycikpCi0JCWdvdG8gZmFpbGVkOwotCiAJZG93bl9yZWFkKCZuaWxmcy0+bnNfc2VnY3Rvcl9zZW0pOwogCWVyciA9IG5pbGZzX2NwZmlsZV9nZXRfY2hlY2twb2ludChuaWxmcy0+bnNfY3BmaWxlLCBjbm8sIDAsICZyYXdfY3AsCiAJCQkJCSAgJmJoX2NwKTsKQEAgLTQxMSw3ICs0MDcsNiBAQAogewogCXN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzID0gc2JpLT5zX25pbGZzOwogCi0JbmlsZnNfbWR0X2NsZWFyKHNiaS0+c19pZmlsZSk7CiAJbmlsZnNfbWR0X2Rlc3Ryb3koc2JpLT5zX2lmaWxlKTsKIAlzYmktPnNfaWZpbGUgPSBOVUxMOwogCWRvd25fd3JpdGUoJm5pbGZzLT5uc19zdXBlcl9zZW0pOwpAQCAtNDE5LDIyICs0MTQsNiBAQAogCXVwX3dyaXRlKCZuaWxmcy0+bnNfc3VwZXJfc2VtKTsKIH0KIAotc3RhdGljIGludCBuaWxmc19tYXJrX3JlY292ZXJ5X2NvbXBsZXRlKHN0cnVjdCBuaWxmc19zYl9pbmZvICpzYmkpCi17Ci0Jc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMgPSBzYmktPnNfbmlsZnM7Ci0JaW50IGVyciA9IDA7Ci0KLQlkb3duX3dyaXRlKCZuaWxmcy0+bnNfc2VtKTsKLQlpZiAoIShuaWxmcy0+bnNfbW91bnRfc3RhdGUgJiBOSUxGU19WQUxJRF9GUykpIHsKLQkJbmlsZnMtPm5zX21vdW50X3N0YXRlIHw9IE5JTEZTX1ZBTElEX0ZTOwotCQllcnIgPSBuaWxmc19jb21taXRfc3VwZXIoc2JpLCAxKTsKLQkJaWYgKGxpa2VseSghZXJyKSkKLQkJCXByaW50ayhLRVJOX0lORk8gIk5JTEZTOiByZWNvdmVyeSBjb21wbGV0ZS5cbiIpOwotCX0KLQl1cF93cml0ZSgmbmlsZnMtPm5zX3NlbSk7Ci0JcmV0dXJuIGVycjsKLX0KLQogc3RhdGljIGludCBuaWxmc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CkBAIC00OTAsNyArNDY5LDcgQEAKIAlzdHJ1Y3QgbmlsZnNfc2JfaW5mbyAqc2JpID0gTklMRlNfU0Ioc2IpOwogCiAJaWYgKCFuaWxmc190ZXN0X29wdChzYmksIEJBUlJJRVIpKQotCQlzZXFfcHJpbnRmKHNlcSwgIixiYXJyaWVyPW9mZiIpOworCQlzZXFfcHJpbnRmKHNlcSwgIixub2JhcnJpZXIiKTsKIAlpZiAobmlsZnNfdGVzdF9vcHQoc2JpLCBTTkFQU0hPVCkpCiAJCXNlcV9wcmludGYoc2VxLCAiLGNwPSVsbHUiLAogCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpc2JpLT5zX3NuYXBzaG90X2Nubyk7CkBAIC01MDAsNiArNDc5LDggQEAKIAkJc2VxX3ByaW50ZihzZXEsICIsZXJyb3JzPXBhbmljIik7CiAJaWYgKG5pbGZzX3Rlc3Rfb3B0KHNiaSwgU1RSSUNUX09SREVSKSkKIAkJc2VxX3ByaW50ZihzZXEsICIsb3JkZXI9c3RyaWN0Iik7CisJaWYgKG5pbGZzX3Rlc3Rfb3B0KHNiaSwgTk9SRUNPVkVSWSkpCisJCXNlcV9wcmludGYoc2VxLCAiLG5vcmVjb3ZlcnkiKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTY4LDcgKzU0OSw3IEBACiAKIGVudW0gewogCU9wdF9lcnJfY29udCwgT3B0X2Vycl9wYW5pYywgT3B0X2Vycl9ybywKLQlPcHRfYmFycmllciwgT3B0X3NuYXBzaG90LCBPcHRfb3JkZXIsCisJT3B0X25vYmFycmllciwgT3B0X3NuYXBzaG90LCBPcHRfb3JkZXIsIE9wdF9ub3JlY292ZXJ5LAogCU9wdF9lcnIsCiB9OwogCkBAIC01NzYsMjUgKzU1NywxMyBAQAogCXtPcHRfZXJyX2NvbnQsICJlcnJvcnM9Y29udGludWUifSwKIAl7T3B0X2Vycl9wYW5pYywgImVycm9ycz1wYW5pYyJ9LAogCXtPcHRfZXJyX3JvLCAiZXJyb3JzPXJlbW91bnQtcm8ifSwKLQl7T3B0X2JhcnJpZXIsICJiYXJyaWVyPSVzIn0sCisJe09wdF9ub2JhcnJpZXIsICJub2JhcnJpZXIifSwKIAl7T3B0X3NuYXBzaG90LCAiY3A9JXUifSwKIAl7T3B0X29yZGVyLCAib3JkZXI9JXMifSwKKwl7T3B0X25vcmVjb3ZlcnksICJub3JlY292ZXJ5In0sCiAJe09wdF9lcnIsIE5VTEx9CiB9OwogCi1zdGF0aWMgaW50IG1hdGNoX2Jvb2woc3Vic3RyaW5nX3QgKnMsIGludCAqcmVzdWx0KQotewotCWludCBsZW4gPSBzLT50byAtIHMtPmZyb207Ci0KLQlpZiAoc3RybmNtcChzLT5mcm9tLCAib24iLCBsZW4pID09IDApCi0JCSpyZXN1bHQgPSAxOwotCWVsc2UgaWYgKHN0cm5jbXAocy0+ZnJvbSwgIm9mZiIsIGxlbikgPT0gMCkKLQkJKnJlc3VsdCA9IDA7Ci0JZWxzZQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBwYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IG5pbGZzX3NiX2luZm8gKnNiaSA9IE5JTEZTX1NCKHNiKTsKQEAgLTYxMiwxMyArNTgxLDggQEAKIAogCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CiAJCXN3aXRjaCAodG9rZW4pIHsKLQkJY2FzZSBPcHRfYmFycmllcjoKLQkJCWlmIChtYXRjaF9ib29sKCZhcmdzWzBdLCAmb3B0aW9uKSkKLQkJCQlyZXR1cm4gMDsKLQkJCWlmIChvcHRpb24pCi0JCQkJbmlsZnNfc2V0X29wdChzYmksIEJBUlJJRVIpOwotCQkJZWxzZQotCQkJCW5pbGZzX2NsZWFyX29wdChzYmksIEJBUlJJRVIpOworCQljYXNlIE9wdF9ub2JhcnJpZXI6CisJCQluaWxmc19jbGVhcl9vcHQoc2JpLCBCQVJSSUVSKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9vcmRlcjoKIAkJCWlmIChzdHJjbXAoYXJnc1swXS5mcm9tLCAicmVsYXhlZCIpID09IDApCkBAIC02NDcsNiArNjExLDkgQEAKIAkJCXNiaS0+c19zbmFwc2hvdF9jbm8gPSBvcHRpb247CiAJCQluaWxmc19zZXRfb3B0KHNiaSwgU05BUFNIT1QpOwogCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vcmVjb3Zlcnk6CisJCQluaWxmc19zZXRfb3B0KHNiaSwgTk9SRUNPVkVSWSk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJICAgICAgICJOSUxGUzogVW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbiBcIiVzXCJcbiIsIHApOwpAQCAtNjcyLDkgKzYzOSw3IEBACiAJaW50IG1udF9jb3VudCA9IGxlMTZfdG9fY3B1KHNicC0+c19tbnRfY291bnQpOwogCiAJLyogbmlsZnMtPnNlbSBtdXN0IGJlIGxvY2tlZCBieSB0aGUgY2FsbGVyLiAqLwotCWlmICghKG5pbGZzLT5uc19tb3VudF9zdGF0ZSAmIE5JTEZTX1ZBTElEX0ZTKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJOSUxGUyB3YXJuaW5nOiBtb3VudGluZyB1bmNoZWNrZWQgZnNcbiIpOwotCX0gZWxzZSBpZiAobmlsZnMtPm5zX21vdW50X3N0YXRlICYgTklMRlNfRVJST1JfRlMpIHsKKwlpZiAobmlsZnMtPm5zX21vdW50X3N0YXRlICYgTklMRlNfRVJST1JfRlMpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgIk5JTEZTIHdhcm5pbmc6IG1vdW50aW5nIGZzIHdpdGggZXJyb3JzXG4iKTsKICNpZiAwCkBAIC03ODIsMTEgKzc0NywxMCBAQAogCXNiLT5zX3Jvb3QgPSBOVUxMOwogCXNiLT5zX3RpbWVfZ3JhbiA9IDE7CiAKLQlpZiAoIW5pbGZzX2xvYWRlZChuaWxmcykpIHsKLQkJZXJyID0gbG9hZF9uaWxmcyhuaWxmcywgc2JpKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZmFpbGVkX3NiaTsKLQl9CisJZXJyID0gbG9hZF9uaWxmcyhuaWxmcywgc2JpKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWxlZF9zYmk7CisKIAljbm8gPSBuaWxmc19sYXN0X2NubyhuaWxmcyk7CiAKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKQEAgLTg1NCwxMiArODE4LDYgQEAKIAkJdXBfd3JpdGUoJm5pbGZzLT5uc19zZW0pOwogCX0KIAotCWVyciA9IG5pbGZzX21hcmtfcmVjb3ZlcnlfY29tcGxldGUoc2JpKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk5JTEZTOiByZWNvdmVyeSBmYWlsZWQuXG4iKTsKLQkJZ290byBmYWlsZWRfcm9vdDsKLQl9Ci0KIAlkb3duX3dyaXRlKCZuaWxmcy0+bnNfc3VwZXJfc2VtKTsKIAlpZiAoIW5pbGZzX3Rlc3Rfb3B0KHNiaSwgU05BUFNIT1QpKQogCQluaWxmcy0+bnNfY3VycmVudCA9IHNiaTsKQEAgLTg2NywxMCArODI1LDYgQEAKIAogCXJldHVybiAwOwogCi0gZmFpbGVkX3Jvb3Q6Ci0JZHB1dChzYi0+c19yb290KTsKLQlzYi0+c19yb290ID0gTlVMTDsKLQogIGZhaWxlZF9zZWdjdG9yOgogCW5pbGZzX2RldGFjaF9zZWdtZW50X2NvbnN0cnVjdG9yKHNiaSk7CiAKQEAgLTkxNSw2ICs4NjksMTQgQEAKIAkJZ290byByZXN0b3JlX29wdHM7CiAJfQogCisJaWYgKCFuaWxmc192YWxpZF9mcyhuaWxmcykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTklMRlMgKGRldmljZSAlcyk6IGNvdWxkbid0ICIKKwkJICAgICAgICJyZW1vdW50IGJlY2F1c2UgdGhlIGZpbGVzeXN0ZW0gaXMgaW4gYW4gIgorCQkgICAgICAgImluY29tcGxldGUgcmVjb3Zlcnkgc3RhdGUuXG4iLCBzYi0+c19pZCk7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gcmVzdG9yZV9vcHRzOworCX0KKwogCWlmICgoKmZsYWdzICYgTVNfUkRPTkxZKSA9PSAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQogCQlnb3RvIG91dDsKIAlpZiAoKmZsYWdzICYgTVNfUkRPTkxZKSB7CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvdGhlX25pbGZzLmMgYi9mcy9uaWxmczIvdGhlX25pbGZzLmMKaW5kZXggYWQzOTFhOC4uNjI0MWUxNyAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL3RoZV9uaWxmcy5jCisrKyBiL2ZzL25pbGZzMi90aGVfbmlsZnMuYwpAQCAtMTQ2LDEzICsxNDYsOSBAQAogCiAJbWlnaHRfc2xlZXAoKTsKIAlpZiAobmlsZnNfbG9hZGVkKG5pbGZzKSkgewotCQluaWxmc19tZHRfY2xlYXIobmlsZnMtPm5zX3N1ZmlsZSk7CiAJCW5pbGZzX21kdF9kZXN0cm95KG5pbGZzLT5uc19zdWZpbGUpOwotCQluaWxmc19tZHRfY2xlYXIobmlsZnMtPm5zX2NwZmlsZSk7CiAJCW5pbGZzX21kdF9kZXN0cm95KG5pbGZzLT5uc19jcGZpbGUpOwotCQluaWxmc19tZHRfY2xlYXIobmlsZnMtPm5zX2RhdCk7CiAJCW5pbGZzX21kdF9kZXN0cm95KG5pbGZzLT5uc19kYXQpOwotCQkvKiBYWFg6IGhvdyBhbmQgd2hlbiB0byBjbGVhciBuaWxmcy0+bnNfZ2NfZGF0PyAqLwogCQluaWxmc19tZHRfZGVzdHJveShuaWxmcy0+bnNfZ2NfZGF0KTsKIAl9CiAJaWYgKG5pbGZzX2luaXQobmlsZnMpKSB7CkBAIC0xNjYsNyArMTYyLDYgQEAKIHN0YXRpYyBpbnQgbmlsZnNfbG9hZF9zdXBlcl9yb290KHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzLAogCQkJCSBzdHJ1Y3QgbmlsZnNfc2JfaW5mbyAqc2JpLCBzZWN0b3JfdCBzcl9ibG9jaykKIHsKLQlzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGRhdF9sb2NrX2tleTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3NyOwogCXN0cnVjdCBuaWxmc19zdXBlcl9yb290ICpyYXdfc3I7CiAJc3RydWN0IG5pbGZzX3N1cGVyX2Jsb2NrICoqc2JwID0gbmlsZnMtPm5zX3NicDsKQEAgLTE4Nyw1MSArMTgyLDM2IEBACiAJaW5vZGVfc2l6ZSA9IG5pbGZzLT5uc19pbm9kZV9zaXplOwogCiAJZXJyID0gLUVOT01FTTsKLQluaWxmcy0+bnNfZGF0ID0gbmlsZnNfbWR0X25ldyhuaWxmcywgTlVMTCwgTklMRlNfREFUX0lOTyk7CisJbmlsZnMtPm5zX2RhdCA9IG5pbGZzX2RhdF9uZXcobmlsZnMsIGRhdF9lbnRyeV9zaXplKTsKIAlpZiAodW5saWtlbHkoIW5pbGZzLT5uc19kYXQpKQogCQlnb3RvIGZhaWxlZDsKIAotCW5pbGZzLT5uc19nY19kYXQgPSBuaWxmc19tZHRfbmV3KG5pbGZzLCBOVUxMLCBOSUxGU19EQVRfSU5PKTsKKwluaWxmcy0+bnNfZ2NfZGF0ID0gbmlsZnNfZGF0X25ldyhuaWxmcywgZGF0X2VudHJ5X3NpemUpOwogCWlmICh1bmxpa2VseSghbmlsZnMtPm5zX2djX2RhdCkpCiAJCWdvdG8gZmFpbGVkX2RhdDsKIAotCW5pbGZzLT5uc19jcGZpbGUgPSBuaWxmc19tZHRfbmV3KG5pbGZzLCBOVUxMLCBOSUxGU19DUEZJTEVfSU5PKTsKKwluaWxmcy0+bnNfY3BmaWxlID0gbmlsZnNfY3BmaWxlX25ldyhuaWxmcywgY2hlY2twb2ludF9zaXplKTsKIAlpZiAodW5saWtlbHkoIW5pbGZzLT5uc19jcGZpbGUpKQogCQlnb3RvIGZhaWxlZF9nY19kYXQ7CiAKLQluaWxmcy0+bnNfc3VmaWxlID0gbmlsZnNfbWR0X25ldyhuaWxmcywgTlVMTCwgTklMRlNfU1VGSUxFX0lOTyk7CisJbmlsZnMtPm5zX3N1ZmlsZSA9IG5pbGZzX3N1ZmlsZV9uZXcobmlsZnMsIHNlZ21lbnRfdXNhZ2Vfc2l6ZSk7CiAJaWYgKHVubGlrZWx5KCFuaWxmcy0+bnNfc3VmaWxlKSkKIAkJZ290byBmYWlsZWRfY3BmaWxlOwogCi0JZXJyID0gbmlsZnNfcGFsbG9jX2luaXRfYmxvY2tncm91cChuaWxmcy0+bnNfZGF0LCBkYXRfZW50cnlfc2l6ZSk7Ci0JaWYgKHVubGlrZWx5KGVycikpCi0JCWdvdG8gZmFpbGVkX3N1ZmlsZTsKLQotCWVyciA9IG5pbGZzX3BhbGxvY19pbml0X2Jsb2NrZ3JvdXAobmlsZnMtPm5zX2djX2RhdCwgZGF0X2VudHJ5X3NpemUpOwotCWlmICh1bmxpa2VseShlcnIpKQotCQlnb3RvIGZhaWxlZF9zdWZpbGU7Ci0KLQlsb2NrZGVwX3NldF9jbGFzcygmTklMRlNfTURUKG5pbGZzLT5uc19kYXQpLT5taV9zZW0sICZkYXRfbG9ja19rZXkpOwotCWxvY2tkZXBfc2V0X2NsYXNzKCZOSUxGU19NRFQobmlsZnMtPm5zX2djX2RhdCktPm1pX3NlbSwgJmRhdF9sb2NrX2tleSk7Ci0KIAluaWxmc19tZHRfc2V0X3NoYWRvdyhuaWxmcy0+bnNfZGF0LCBuaWxmcy0+bnNfZ2NfZGF0KTsKLQluaWxmc19tZHRfc2V0X2VudHJ5X3NpemUobmlsZnMtPm5zX2NwZmlsZSwgY2hlY2twb2ludF9zaXplLAotCQkJCSBzaXplb2Yoc3RydWN0IG5pbGZzX2NwZmlsZV9oZWFkZXIpKTsKLQluaWxmc19tZHRfc2V0X2VudHJ5X3NpemUobmlsZnMtPm5zX3N1ZmlsZSwgc2VnbWVudF91c2FnZV9zaXplLAotCQkJCSBzaXplb2Yoc3RydWN0IG5pbGZzX3N1ZmlsZV9oZWFkZXIpKTsKIAotCWVyciA9IG5pbGZzX21kdF9yZWFkX2lub2RlX2RpcmVjdCgKLQkJbmlsZnMtPm5zX2RhdCwgYmhfc3IsIE5JTEZTX1NSX0RBVF9PRkZTRVQoaW5vZGVfc2l6ZSkpOworCWVyciA9IG5pbGZzX2RhdF9yZWFkKG5pbGZzLT5uc19kYXQsICh2b2lkICopYmhfc3ItPmJfZGF0YSArCisJCQkgICAgIE5JTEZTX1NSX0RBVF9PRkZTRVQoaW5vZGVfc2l6ZSkpOwogCWlmICh1bmxpa2VseShlcnIpKQogCQlnb3RvIGZhaWxlZF9zdWZpbGU7CiAKLQllcnIgPSBuaWxmc19tZHRfcmVhZF9pbm9kZV9kaXJlY3QoCi0JCW5pbGZzLT5uc19jcGZpbGUsIGJoX3NyLCBOSUxGU19TUl9DUEZJTEVfT0ZGU0VUKGlub2RlX3NpemUpKTsKKwllcnIgPSBuaWxmc19jcGZpbGVfcmVhZChuaWxmcy0+bnNfY3BmaWxlLCAodm9pZCAqKWJoX3NyLT5iX2RhdGEgKworCQkJCU5JTEZTX1NSX0NQRklMRV9PRkZTRVQoaW5vZGVfc2l6ZSkpOwogCWlmICh1bmxpa2VseShlcnIpKQogCQlnb3RvIGZhaWxlZF9zdWZpbGU7CiAKLQllcnIgPSBuaWxmc19tZHRfcmVhZF9pbm9kZV9kaXJlY3QoCi0JCW5pbGZzLT5uc19zdWZpbGUsIGJoX3NyLCBOSUxGU19TUl9TVUZJTEVfT0ZGU0VUKGlub2RlX3NpemUpKTsKKwllcnIgPSBuaWxmc19zdWZpbGVfcmVhZChuaWxmcy0+bnNfc3VmaWxlLCAodm9pZCAqKWJoX3NyLT5iX2RhdGEgKworCQkJCU5JTEZTX1NSX1NVRklMRV9PRkZTRVQoaW5vZGVfc2l6ZSkpOwogCWlmICh1bmxpa2VseShlcnIpKQogCQlnb3RvIGZhaWxlZF9zdWZpbGU7CiAKQEAgLTI4MSwyOSArMjYxLDMwIEBACiAJc3RydWN0IG5pbGZzX3JlY292ZXJ5X2luZm8gcmk7CiAJdW5zaWduZWQgaW50IHNfZmxhZ3MgPSBzYmktPnNfc3VwZXItPnNfZmxhZ3M7CiAJaW50IHJlYWxseV9yZWFkX29ubHkgPSBiZGV2X3JlYWRfb25seShuaWxmcy0+bnNfYmRldik7Ci0JdW5zaWduZWQgdmFsaWRfZnM7Ci0JaW50IGVyciA9IDA7CisJaW50IHZhbGlkX2ZzID0gbmlsZnNfdmFsaWRfZnMobmlsZnMpOworCWludCBlcnI7CisKKwlpZiAobmlsZnNfbG9hZGVkKG5pbGZzKSkgeworCQlpZiAodmFsaWRfZnMgfHwKKwkJICAgICgoc19mbGFncyAmIE1TX1JET05MWSkgJiYgbmlsZnNfdGVzdF9vcHQoc2JpLCBOT1JFQ09WRVJZKSkpCisJCQlyZXR1cm4gMDsKKwkJcHJpbnRrKEtFUk5fRVJSICJOSUxGUzogdGhlIGZpbGVzeXN0ZW0gaXMgaW4gYW4gaW5jb21wbGV0ZSAiCisJCSAgICAgICAicmVjb3Zlcnkgc3RhdGUuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCF2YWxpZF9mcykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJOSUxGUyB3YXJuaW5nOiBtb3VudGluZyB1bmNoZWNrZWQgZnNcbiIpOworCQlpZiAoc19mbGFncyAmIE1TX1JET05MWSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiTklMRlM6IElORk86IHJlY292ZXJ5ICIKKwkJCSAgICAgICAicmVxdWlyZWQgZm9yIHJlYWRvbmx5IGZpbGVzeXN0ZW0uXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIk5JTEZTOiB3cml0ZSBhY2Nlc3Mgd2lsbCAiCisJCQkgICAgICAgImJlIGVuYWJsZWQgZHVyaW5nIHJlY292ZXJ5LlxuIik7CisJCX0KKwl9CiAKIAluaWxmc19pbml0X3JlY292ZXJ5X2luZm8oJnJpKTsKIAotCWRvd25fd3JpdGUoJm5pbGZzLT5uc19zZW0pOwotCXZhbGlkX2ZzID0gKG5pbGZzLT5uc19tb3VudF9zdGF0ZSAmIE5JTEZTX1ZBTElEX0ZTKTsKLQl1cF93cml0ZSgmbmlsZnMtPm5zX3NlbSk7Ci0KLQlpZiAoIXZhbGlkX2ZzICYmIChzX2ZsYWdzICYgTVNfUkRPTkxZKSkgewotCQlwcmludGsoS0VSTl9JTkZPICJOSUxGUzogSU5GTzogcmVjb3ZlcnkgIgotCQkgICAgICAgInJlcXVpcmVkIGZvciByZWFkb25seSBmaWxlc3lzdGVtLlxuIik7Ci0JCWlmIChyZWFsbHlfcmVhZF9vbmx5KSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIk5JTEZTOiB3cml0ZSBhY2Nlc3MgIgotCQkJICAgICAgICJ1bmF2YWlsYWJsZSwgY2Fubm90IHByb2NlZWQuXG4iKTsKLQkJCWVyciA9IC1FUk9GUzsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0JCXByaW50ayhLRVJOX0lORk8gIk5JTEZTOiB3cml0ZSBhY2Nlc3Mgd2lsbCAiCi0JCSAgICAgICAiYmUgZW5hYmxlZCBkdXJpbmcgcmVjb3ZlcnkuXG4iKTsKLQkJc2JpLT5zX3N1cGVyLT5zX2ZsYWdzICY9IH5NU19SRE9OTFk7Ci0JfQotCiAJZXJyID0gbmlsZnNfc2VhcmNoX3N1cGVyX3Jvb3QobmlsZnMsIHNiaSwgJnJpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewogCQlwcmludGsoS0VSTl9FUlIgIk5JTEZTOiBlcnJvciBzZWFyY2hpbmcgc3VwZXIgcm9vdC5cbiIpOwpAQCAtMzE2LDE5ICsyOTcsNTYgQEAKIAkJZ290byBmYWlsZWQ7CiAJfQogCi0JaWYgKCF2YWxpZF9mcykgewotCQllcnIgPSBuaWxmc19yZWNvdmVyX2xvZ2ljYWxfc2VnbWVudHMobmlsZnMsIHNiaSwgJnJpKTsKLQkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCW5pbGZzX21kdF9kZXN0cm95KG5pbGZzLT5uc19jcGZpbGUpOwotCQkJbmlsZnNfbWR0X2Rlc3Ryb3kobmlsZnMtPm5zX3N1ZmlsZSk7Ci0JCQluaWxmc19tZHRfZGVzdHJveShuaWxmcy0+bnNfZGF0KTsKLQkJCWdvdG8gZmFpbGVkOworCWlmICh2YWxpZF9mcykKKwkJZ290byBza2lwX3JlY292ZXJ5OworCisJaWYgKHNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKKwkJaWYgKG5pbGZzX3Rlc3Rfb3B0KHNiaSwgTk9SRUNPVkVSWSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIk5JTEZTOiBub3JlY292ZXJ5IG9wdGlvbiBzcGVjaWZpZWQuICIKKwkJCSAgICAgICAic2tpcHBpbmcgcm9sbC1mb3J3YXJkIHJlY292ZXJ5XG4iKTsKKwkJCWdvdG8gc2tpcF9yZWNvdmVyeTsKIAkJfQotCQlpZiAocmkucmlfbmVlZF9yZWNvdmVyeSA9PSBOSUxGU19SRUNPVkVSWV9TUl9VUERBVEVEKQotCQkJc2JpLT5zX3N1cGVyLT5zX2RpcnQgPSAxOworCQlpZiAocmVhbGx5X3JlYWRfb25seSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJOSUxGUzogd3JpdGUgYWNjZXNzICIKKwkJCSAgICAgICAidW5hdmFpbGFibGUsIGNhbm5vdCBwcm9jZWVkLlxuIik7CisJCQllcnIgPSAtRVJPRlM7CisJCQlnb3RvIGZhaWxlZF91bmxvYWQ7CisJCX0KKwkJc2JpLT5zX3N1cGVyLT5zX2ZsYWdzICY9IH5NU19SRE9OTFk7CisJfSBlbHNlIGlmIChuaWxmc190ZXN0X29wdChzYmksIE5PUkVDT1ZFUlkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTklMRlM6IHJlY292ZXJ5IGNhbmNlbGxlZCBiZWNhdXNlIG5vcmVjb3ZlcnkgIgorCQkgICAgICAgIm9wdGlvbiB3YXMgc3BlY2lmaWVkIGZvciBhIHJlYWQvd3JpdGUgbW91bnRcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxlZF91bmxvYWQ7CiAJfQogCisJZXJyID0gbmlsZnNfcmVjb3Zlcl9sb2dpY2FsX3NlZ21lbnRzKG5pbGZzLCBzYmksICZyaSk7CisJaWYgKGVycikKKwkJZ290byBmYWlsZWRfdW5sb2FkOworCisJZG93bl93cml0ZSgmbmlsZnMtPm5zX3NlbSk7CisJbmlsZnMtPm5zX21vdW50X3N0YXRlIHw9IE5JTEZTX1ZBTElEX0ZTOworCW5pbGZzLT5uc19zYnBbMF0tPnNfc3RhdGUgPSBjcHVfdG9fbGUxNihuaWxmcy0+bnNfbW91bnRfc3RhdGUpOworCWVyciA9IG5pbGZzX2NvbW1pdF9zdXBlcihzYmksIDEpOworCXVwX3dyaXRlKCZuaWxmcy0+bnNfc2VtKTsKKworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJOSUxGUzogZmFpbGVkIHRvIHVwZGF0ZSBzdXBlciBibG9jay4gIgorCQkgICAgICAgInJlY292ZXJ5IHVuZmluaXNoZWQuXG4iKTsKKwkJZ290byBmYWlsZWRfdW5sb2FkOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJOSUxGUzogcmVjb3ZlcnkgY29tcGxldGUuXG4iKTsKKworIHNraXBfcmVjb3Zlcnk6CiAJc2V0X25pbGZzX2xvYWRlZChuaWxmcyk7CisJbmlsZnNfY2xlYXJfcmVjb3ZlcnlfaW5mbygmcmkpOworCXNiaS0+c19zdXBlci0+c19mbGFncyA9IHNfZmxhZ3M7CisJcmV0dXJuIDA7CisKKyBmYWlsZWRfdW5sb2FkOgorCW5pbGZzX21kdF9kZXN0cm95KG5pbGZzLT5uc19jcGZpbGUpOworCW5pbGZzX21kdF9kZXN0cm95KG5pbGZzLT5uc19zdWZpbGUpOworCW5pbGZzX21kdF9kZXN0cm95KG5pbGZzLT5uc19kYXQpOwogCiAgZmFpbGVkOgogCW5pbGZzX2NsZWFyX3JlY292ZXJ5X2luZm8oJnJpKTsKQEAgLTYzMiwzMCArNjUwLDIzIEBACiB7CiAJc3RydWN0IGlub2RlICpkYXQgPSBuaWxmc19kYXRfaW5vZGUobmlsZnMpOwogCXVuc2lnbmVkIGxvbmcgbmNsZWFuc2VnczsKLQlpbnQgZXJyOwogCiAJZG93bl9yZWFkKCZOSUxGU19NRFQoZGF0KS0+bWlfc2VtKTsJLyogWFhYICovCi0JZXJyID0gbmlsZnNfc3VmaWxlX2dldF9uY2xlYW5zZWdzKG5pbGZzLT5uc19zdWZpbGUsICZuY2xlYW5zZWdzKTsKKwluY2xlYW5zZWdzID0gbmlsZnNfc3VmaWxlX2dldF9uY2xlYW5zZWdzKG5pbGZzLT5uc19zdWZpbGUpOwogCXVwX3JlYWQoJk5JTEZTX01EVChkYXQpLT5taV9zZW0pOwkvKiBYWFggKi8KLQlpZiAobGlrZWx5KCFlcnIpKQotCQkqbmJsb2NrcyA9IChzZWN0b3JfdCluY2xlYW5zZWdzICogbmlsZnMtPm5zX2Jsb2Nrc19wZXJfc2VnbWVudDsKLQlyZXR1cm4gZXJyOworCSpuYmxvY2tzID0gKHNlY3Rvcl90KW5jbGVhbnNlZ3MgKiBuaWxmcy0+bnNfYmxvY2tzX3Blcl9zZWdtZW50OworCXJldHVybiAwOwogfQogCiBpbnQgbmlsZnNfbmVhcl9kaXNrX2Z1bGwoc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMpCiB7Ci0Jc3RydWN0IGlub2RlICpzdWZpbGUgPSBuaWxmcy0+bnNfc3VmaWxlOwogCXVuc2lnbmVkIGxvbmcgbmNsZWFuc2VncywgbmluY3NlZ3M7Ci0JaW50IHJldDsKIAotCXJldCA9IG5pbGZzX3N1ZmlsZV9nZXRfbmNsZWFuc2VncyhzdWZpbGUsICZuY2xlYW5zZWdzKTsKLQlpZiAobGlrZWx5KCFyZXQpKSB7Ci0JCW5pbmNzZWdzID0gYXRvbWljX3JlYWQoJm5pbGZzLT5uc19uZGlydHlibGtzKSAvCi0JCQluaWxmcy0+bnNfYmxvY2tzX3Blcl9zZWdtZW50ICsgMTsKLQkJaWYgKG5jbGVhbnNlZ3MgPD0gbmlsZnMtPm5zX25yc3ZzZWdzICsgbmluY3NlZ3MpCi0JCQlyZXQrKzsKLQl9Ci0JcmV0dXJuIHJldDsKKwluY2xlYW5zZWdzID0gbmlsZnNfc3VmaWxlX2dldF9uY2xlYW5zZWdzKG5pbGZzLT5uc19zdWZpbGUpOworCW5pbmNzZWdzID0gYXRvbWljX3JlYWQoJm5pbGZzLT5uc19uZGlydHlibGtzKSAvCisJCW5pbGZzLT5uc19ibG9ja3NfcGVyX3NlZ21lbnQgKyAxOworCisJcmV0dXJuIG5jbGVhbnNlZ3MgPD0gbmlsZnMtPm5zX25yc3ZzZWdzICsgbmluY3NlZ3M7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3RoZV9uaWxmcy5oIGIvZnMvbmlsZnMyL3RoZV9uaWxmcy5oCmluZGV4IDIwYWJkNTUuLjU4OTc4NmUgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi90aGVfbmlsZnMuaAorKysgYi9mcy9uaWxmczIvdGhlX25pbGZzLmgKQEAgLTI1OCw2ICsyNTgsMTYgQEAKIAkJa2ZyZWUoc2JpKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgbmlsZnNfdmFsaWRfZnMoc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMpCit7CisJdW5zaWduZWQgdmFsaWRfZnM7CisKKwlkb3duX3JlYWQoJm5pbGZzLT5uc19zZW0pOworCXZhbGlkX2ZzID0gKG5pbGZzLT5uc19tb3VudF9zdGF0ZSAmIE5JTEZTX1ZBTElEX0ZTKTsKKwl1cF9yZWFkKCZuaWxmcy0+bnNfc2VtKTsKKwlyZXR1cm4gdmFsaWRfZnM7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZAogbmlsZnNfZ2V0X3NlZ21lbnRfcmFuZ2Uoc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMsIF9fdTY0IHNlZ251bSwKIAkJCXNlY3Rvcl90ICpzZWdfc3RhcnQsIHNlY3Rvcl90ICpzZWdfZW5kKQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZmlsZS5jIGIvZnMvb2NmczIvZmlsZS5jCmluZGV4IGRlMDU5ZjQuLjNkMzBhMWMgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2ZpbGUuYworKysgYi9mcy9vY2ZzMi9maWxlLmMKQEAgLTIwMDYsNyArMjAwNiw3IEBACiAJLyogYnVmZmVyZWQgYWlvIHdvdWxkbid0IGhhdmUgcHJvcGVyIGxvY2sgY292ZXJhZ2UgdG9kYXkgKi8KIAlCVUdfT04ocmV0ID09IC1FSU9DQlFVRVVFRCAmJiAhKGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkpOwogCi0JaWYgKChmaWxlLT5mX2ZsYWdzICYgT19TWU5DICYmICFkaXJlY3RfaW8pIHx8IElTX1NZTkMoaW5vZGUpKSB7CisJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19EU1lOQyAmJiAhZGlyZWN0X2lvKSB8fCBJU19TWU5DKGlub2RlKSkgewogCQlyZXQgPSBmaWxlbWFwX2ZkYXRhd3JpdGVfcmFuZ2UoZmlsZS0+Zl9tYXBwaW5nLCBwb3MsCiAJCQkJCSAgICAgICBwb3MgKyBjb3VudCAtIDEpOwogCQlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3F1b3RhLmggYi9mcy9vY2ZzMi9xdW90YS5oCmluZGV4IGU1ZGY5ZDEuLjEyM2JjNTIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3F1b3RhLmgKKysrIGIvZnMvb2NmczIvcXVvdGEuaApAQCAtMTcsMTAgKzE3LDYgQEAKIAogI2luY2x1ZGUgIm9jZnMyLmgiCiAKLS8qIENvbW1vbiBzdHVmZiAqLwotLyogaWQgbnVtYmVyIG9mIHF1b3RhIGZvcm1hdCAqLwotI2RlZmluZSBRRk1UX09DRlMyIDMKLQogLyoKICAqIEluLW1lbW9yeSBzdHJ1Y3R1cmVzCiAgKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3F1b3RhX2xvY2FsLmMgYi9mcy9vY2ZzMi9xdW90YV9sb2NhbC5jCmluZGV4IDFhMmM1MGEuLjIxZjllNzEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3F1b3RhX2xvY2FsLmMKKysrIGIvZnMvb2NmczIvcXVvdGFfbG9jYWwuYwpAQCAtMTMyNSw3ICsxMzI1LDcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgc3RydWN0IHF1b3RhX2Zvcm1hdF9vcHMgb2NmczJfZm9ybWF0X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcXVvdGFfZm9ybWF0X29wcyBvY2ZzMl9mb3JtYXRfb3BzID0gewogCS5jaGVja19xdW90YV9maWxlCT0gb2NmczJfbG9jYWxfY2hlY2tfcXVvdGFfZmlsZSwKIAkucmVhZF9maWxlX2luZm8JCT0gb2NmczJfbG9jYWxfcmVhZF9pbmZvLAogCS53cml0ZV9maWxlX2luZm8JPSBvY2ZzMl9nbG9iYWxfd3JpdGVfaW5mbywKZGlmZiAtLWdpdCBhL2ZzL3F1b3RhL0tjb25maWcgYi9mcy9xdW90YS9LY29uZmlnCmluZGV4IDM1M2U3OGEuLmVmYzAyZWIgMTAwNjQ0Ci0tLSBhL2ZzL3F1b3RhL0tjb25maWcKKysrIGIvZnMvcXVvdGEvS2NvbmZpZwpAQCAtNDYsMTIgKzQ2LDE0IEBACiAJICBmb3JtYXQgc2F5IFkgaGVyZS4KIAogY29uZmlnIFFGTVRfVjIKLQl0cmlzdGF0ZSAiUXVvdGEgZm9ybWF0IHYyIHN1cHBvcnQiCisJdHJpc3RhdGUgIlF1b3RhIGZvcm1hdCB2ZnN2MCBhbmQgdmZzdjEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFFVT1RBCiAJc2VsZWN0IFFVT1RBX1RSRUUKIAloZWxwCi0JICBUaGlzIHF1b3RhIGZvcm1hdCBhbGxvd3MgdXNpbmcgcXVvdGFzIHdpdGggMzItYml0IFVJRHMvR0lEcy4gSWYgeW91Ci0JICBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eSBzYXkgWSBoZXJlLgorCSAgVGhpcyBjb25maWcgb3B0aW9uIGVuYWJsZXMga2VybmVsIHN1cHBvcnQgZm9yIHZmc3YwIGFuZCB2ZnN2MSBxdW90YQorCSAgZm9ybWF0cy4gQm90aCB0aGVzZSBmb3JtYXRzIHN1cHBvcnQgMzItYml0IFVJRHMvR0lEcyBhbmQgdmZzdjEgZm9ybWF0CisJICBhbHNvIHN1cHBvcnRzIDY0LWJpdCBpbm9kZSBhbmQgYmxvY2sgcXVvdGEgbGltaXRzLiBJZiB5b3UgbmVlZCB0aGlzCisJICBmdW5jdGlvbmFsaXR5IHNheSBZIGhlcmUuCiAKIGNvbmZpZyBRVU9UQUNUTAogCWJvb2wKZGlmZiAtLWdpdCBhL2ZzL3F1b3RhL2RxdW90LmMgYi9mcy9xdW90YS9kcXVvdC5jCmluZGV4IGViNWE3NTUuLmNkNmJiOWEgMTAwNjQ0Ci0tLSBhL2ZzL3F1b3RhL2RxdW90LmMKKysrIGIvZnMvcXVvdGEvZHF1b3QuYwpAQCAtMjE2NCw3ICsyMTY0LDkgQEAKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CiAJaW50IGVycm9yOwogCisJbXV0ZXhfbG9jaygmc2ItPnNfcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJZGVudHJ5ID0gbG9va3VwX29uZV9sZW4ocWZfbmFtZSwgc2ItPnNfcm9vdCwgc3RybGVuKHFmX25hbWUpKTsKKwltdXRleF91bmxvY2soJnNiLT5zX3Jvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCWlmIChJU19FUlIoZGVudHJ5KSkKIAkJcmV0dXJuIFBUUl9FUlIoZGVudHJ5KTsKIApkaWZmIC0tZ2l0IGEvZnMvcXVvdGEvcXVvdGFfdjEuYyBiL2ZzL3F1b3RhL3F1b3RhX3YxLmMKaW5kZXggMGVkY2Y0Mi4uMmFlNzU3ZSAxMDA2NDQKLS0tIGEvZnMvcXVvdGEvcXVvdGFfdjEuYworKysgYi9mcy9xdW90YS9xdW90YV92MS5jCkBAIC0yMDQsNyArMjA0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHF1b3RhX2Zvcm1hdF9vcHMgdjFfZm9ybWF0X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcXVvdGFfZm9ybWF0X29wcyB2MV9mb3JtYXRfb3BzID0gewogCS5jaGVja19xdW90YV9maWxlCT0gdjFfY2hlY2tfcXVvdGFfZmlsZSwKIAkucmVhZF9maWxlX2luZm8JCT0gdjFfcmVhZF9maWxlX2luZm8sCiAJLndyaXRlX2ZpbGVfaW5mbwk9IHYxX3dyaXRlX2ZpbGVfaW5mbywKZGlmZiAtLWdpdCBhL2ZzL3F1b3RhL3F1b3RhX3YyLmMgYi9mcy9xdW90YS9xdW90YV92Mi5jCmluZGV4IGE1NDc1ZmIuLjNkZmMyM2UgMTAwNjQ0Ci0tLSBhL2ZzL3F1b3RhL3F1b3RhX3YyLmMKKysrIGIvZnMvcXVvdGEvcXVvdGFfdjIuYwpAQCAtMjMsMTQgKzIzLDIzIEBACiAKICNkZWZpbmUgX19RVU9UQV9WMl9QQVJBTk9JQQogCi1zdGF0aWMgdm9pZCB2Ml9tZW0yZGlza2RxYih2b2lkICpkcCwgc3RydWN0IGRxdW90ICpkcXVvdCk7Ci1zdGF0aWMgdm9pZCB2Ml9kaXNrMm1lbWRxYihzdHJ1Y3QgZHF1b3QgKmRxdW90LCB2b2lkICpkcCk7Ci1zdGF0aWMgaW50IHYyX2lzX2lkKHZvaWQgKmRwLCBzdHJ1Y3QgZHF1b3QgKmRxdW90KTsKK3N0YXRpYyB2b2lkIHYycjBfbWVtMmRpc2tkcWIodm9pZCAqZHAsIHN0cnVjdCBkcXVvdCAqZHF1b3QpOworc3RhdGljIHZvaWQgdjJyMF9kaXNrMm1lbWRxYihzdHJ1Y3QgZHF1b3QgKmRxdW90LCB2b2lkICpkcCk7CitzdGF0aWMgaW50IHYycjBfaXNfaWQodm9pZCAqZHAsIHN0cnVjdCBkcXVvdCAqZHF1b3QpOworc3RhdGljIHZvaWQgdjJyMV9tZW0yZGlza2RxYih2b2lkICpkcCwgc3RydWN0IGRxdW90ICpkcXVvdCk7CitzdGF0aWMgdm9pZCB2MnIxX2Rpc2sybWVtZHFiKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHZvaWQgKmRwKTsKK3N0YXRpYyBpbnQgdjJyMV9pc19pZCh2b2lkICpkcCwgc3RydWN0IGRxdW90ICpkcXVvdCk7CiAKLXN0YXRpYyBzdHJ1Y3QgcXRyZWVfZm10X29wZXJhdGlvbnMgdjJfcXRyZWVfb3BzID0gewotCS5tZW0yZGlza19kcWJsayA9IHYyX21lbTJkaXNrZHFiLAotCS5kaXNrMm1lbV9kcWJsayA9IHYyX2Rpc2sybWVtZHFiLAotCS5pc19pZCA9IHYyX2lzX2lkLAorc3RhdGljIHN0cnVjdCBxdHJlZV9mbXRfb3BlcmF0aW9ucyB2MnIwX3F0cmVlX29wcyA9IHsKKwkubWVtMmRpc2tfZHFibGsgPSB2MnIwX21lbTJkaXNrZHFiLAorCS5kaXNrMm1lbV9kcWJsayA9IHYycjBfZGlzazJtZW1kcWIsCisJLmlzX2lkID0gdjJyMF9pc19pZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcXRyZWVfZm10X29wZXJhdGlvbnMgdjJyMV9xdHJlZV9vcHMgPSB7CisJLm1lbTJkaXNrX2RxYmxrID0gdjJyMV9tZW0yZGlza2RxYiwKKwkuZGlzazJtZW1fZHFibGsgPSB2MnIxX2Rpc2sybWVtZHFiLAorCS5pc19pZCA9IHYycjFfaXNfaWQsCiB9OwogCiAjZGVmaW5lIFFVT1RBQkxPQ0tfQklUUyAxMApAQCAtNDYsMjMgKzU1LDMzIEBACiAJcmV0dXJuIGJsb2NrcyA8PCBRVU9UQUJMT0NLX0JJVFM7CiB9CiAKK3N0YXRpYyBpbnQgdjJfcmVhZF9oZWFkZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsCisJCQkgIHN0cnVjdCB2Ml9kaXNrX2RxaGVhZGVyICpkcWhlYWQpCit7CisJc3NpemVfdCBzaXplOworCisJc2l6ZSA9IHNiLT5zX29wLT5xdW90YV9yZWFkKHNiLCB0eXBlLCAoY2hhciAqKWRxaGVhZCwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxaGVhZGVyKSwgMCk7CisJaWYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxaGVhZGVyKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJxdW90YV92MjogRmFpbGVkIGhlYWRlciByZWFkOiIKKwkJICAgICAgICIgZXhwZWN0ZWQ9JXpkIGdvdD0lemRcbiIsCisJCQlzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFoZWFkZXIpLCBzaXplKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCiAvKiBDaGVjayB3aGV0aGVyIGdpdmVuIGZpbGUgaXMgcmVhbGx5IHZmc3YwIHF1b3RhZmlsZSAqLwogc3RhdGljIGludCB2Ml9jaGVja19xdW90YV9maWxlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQogewogCXN0cnVjdCB2Ml9kaXNrX2RxaGVhZGVyIGRxaGVhZDsKLQlzc2l6ZV90IHNpemU7CiAJc3RhdGljIGNvbnN0IHVpbnQgcXVvdGFfbWFnaWNzW10gPSBWMl9JTklUUU1BR0lDUzsKIAlzdGF0aWMgY29uc3QgdWludCBxdW90YV92ZXJzaW9uc1tdID0gVjJfSU5JVFFWRVJTSU9OUzsKICAKLQlzaXplID0gc2ItPnNfb3AtPnF1b3RhX3JlYWQoc2IsIHR5cGUsIChjaGFyICopJmRxaGVhZCwKLQkJCQkgICAgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxaGVhZGVyKSwgMCk7Ci0JaWYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxaGVhZGVyKSkgewotCQlwcmludGsoInF1b3RhX3YyOiBmYWlsZWQgcmVhZCBleHBlY3RlZD0lemQgZ290PSV6ZFxuIiwKLQkJCXNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWhlYWRlciksIHNpemUpOworCWlmICghdjJfcmVhZF9oZWFkZXIoc2IsIHR5cGUsICZkcWhlYWQpKQogCQlyZXR1cm4gMDsKLQl9CiAJaWYgKGxlMzJfdG9fY3B1KGRxaGVhZC5kcWhfbWFnaWMpICE9IHF1b3RhX21hZ2ljc1t0eXBlXSB8fAotCSAgICBsZTMyX3RvX2NwdShkcWhlYWQuZHFoX3ZlcnNpb24pICE9IHF1b3RhX3ZlcnNpb25zW3R5cGVdKQorCSAgICBsZTMyX3RvX2NwdShkcWhlYWQuZHFoX3ZlcnNpb24pID4gcXVvdGFfdmVyc2lvbnNbdHlwZV0pCiAJCXJldHVybiAwOwogCXJldHVybiAxOwogfQpAQCAtNzEsMTQgKzkwLDIwIEBACiBzdGF0aWMgaW50IHYyX3JlYWRfZmlsZV9pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQogewogCXN0cnVjdCB2Ml9kaXNrX2RxaW5mbyBkaW5mbzsKKwlzdHJ1Y3QgdjJfZGlza19kcWhlYWRlciBkcWhlYWQ7CiAJc3RydWN0IG1lbV9kcWluZm8gKmluZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpOwogCXN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICpxaW5mbzsKIAlzc2l6ZV90IHNpemU7CisJdW5zaWduZWQgaW50IHZlcnNpb247CisKKwlpZiAoIXYyX3JlYWRfaGVhZGVyKHNiLCB0eXBlLCAmZHFoZWFkKSkKKwkJcmV0dXJuIDA7CisJdmVyc2lvbiA9IGxlMzJfdG9fY3B1KGRxaGVhZC5kcWhfdmVyc2lvbik7CiAKIAlzaXplID0gc2ItPnNfb3AtPnF1b3RhX3JlYWQoc2IsIHR5cGUsIChjaGFyICopJmRpbmZvLAogCSAgICAgICBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFpbmZvKSwgVjJfRFFJTkZPT0ZGKTsKIAlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFpbmZvKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCByZWFkIGluZm8gc3RydWN0dXJlIG9uIGRldmljZSAlcy5cbiIsCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInF1b3RhX3YyOiBDYW4ndCByZWFkIGluZm8gc3RydWN0dXJlIG9uIGRldmljZSAlcy5cbiIsCiAJCQlzYi0+c19pZCk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC04OSw5ICsxMTQsMTUgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAlxaW5mbyA9IGluZm8tPmRxaV9wcml2OwotCS8qIGxpbWl0cyBhcmUgc3RvcmVkIGFzIHVuc2lnbmVkIDMyLWJpdCBkYXRhICovCi0JaW5mby0+ZHFpX21heGJsaW1pdCA9IDB4ZmZmZmZmZmY7Ci0JaW5mby0+ZHFpX21heGlsaW1pdCA9IDB4ZmZmZmZmZmY7CisJaWYgKHZlcnNpb24gPT0gMCkgeworCQkvKiBsaW1pdHMgYXJlIHN0b3JlZCBhcyB1bnNpZ25lZCAzMi1iaXQgZGF0YSAqLworCQlpbmZvLT5kcWlfbWF4YmxpbWl0ID0gMHhmZmZmZmZmZjsKKwkJaW5mby0+ZHFpX21heGlsaW1pdCA9IDB4ZmZmZmZmZmY7CisJfSBlbHNlIHsKKwkJLyogdXNlZCBzcGFjZSBpcyBzdG9yZWQgYXMgdW5zaWduZWQgNjQtYml0IHZhbHVlICovCisJCWluZm8tPmRxaV9tYXhibGltaXQgPSAweGZmZmZmZmZmZmZmZmZmZmY7CS8qIDJeNjQtMSAqLworCQlpbmZvLT5kcWlfbWF4aWxpbWl0ID0gMHhmZmZmZmZmZmZmZmZmZmZmOworCX0KIAlpbmZvLT5kcWlfYmdyYWNlID0gbGUzMl90b19jcHUoZGluZm8uZHFpX2JncmFjZSk7CiAJaW5mby0+ZHFpX2lncmFjZSA9IGxlMzJfdG9fY3B1KGRpbmZvLmRxaV9pZ3JhY2UpOwogCWluZm8tPmRxaV9mbGFncyA9IGxlMzJfdG9fY3B1KGRpbmZvLmRxaV9mbGFncyk7CkBAIC0xMDMsOCArMTM0LDEzIEBACiAJcWluZm8tPmRxaV9ibG9ja3NpemVfYml0cyA9IFYyX0RRQkxLU0laRV9CSVRTOwogCXFpbmZvLT5kcWlfdXNhYmxlX2JzID0gMSA8PCBWMl9EUUJMS1NJWkVfQklUUzsKIAlxaW5mby0+ZHFpX3F0cmVlX2RlcHRoID0gcXRyZWVfZGVwdGgocWluZm8pOwotCXFpbmZvLT5kcWlfZW50cnlfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWJsayk7Ci0JcWluZm8tPmRxaV9vcHMgPSAmdjJfcXRyZWVfb3BzOworCWlmICh2ZXJzaW9uID09IDApIHsKKwkJcWluZm8tPmRxaV9lbnRyeV9zaXplID0gc2l6ZW9mKHN0cnVjdCB2MnIwX2Rpc2tfZHFibGspOworCQlxaW5mby0+ZHFpX29wcyA9ICZ2MnIwX3F0cmVlX29wczsKKwl9IGVsc2UgeworCQlxaW5mby0+ZHFpX2VudHJ5X3NpemUgPSBzaXplb2Yoc3RydWN0IHYycjFfZGlza19kcWJsayk7CisJCXFpbmZvLT5kcWlfb3BzID0gJnYycjFfcXRyZWVfb3BzOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM1LDkgKzE3MSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHYyX2Rpc2sybWVtZHFiKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHZvaWQgKmRwKQorc3RhdGljIHZvaWQgdjJyMF9kaXNrMm1lbWRxYihzdHJ1Y3QgZHF1b3QgKmRxdW90LCB2b2lkICpkcCkKIHsKLQlzdHJ1Y3QgdjJfZGlza19kcWJsayAqZCA9IGRwLCBlbXB0eTsKKwlzdHJ1Y3QgdjJyMF9kaXNrX2RxYmxrICpkID0gZHAsIGVtcHR5OwogCXN0cnVjdCBtZW1fZHFibGsgKm0gPSAmZHF1b3QtPmRxX2RxYjsKIAogCW0tPmRxYl9paGFyZGxpbWl0ID0gbGUzMl90b19jcHUoZC0+ZHFiX2loYXJkbGltaXQpOwpAQCAtMTQ5LDE1ICsxODUsMTUgQEAKIAltLT5kcWJfY3Vyc3BhY2UgPSBsZTY0X3RvX2NwdShkLT5kcWJfY3Vyc3BhY2UpOwogCW0tPmRxYl9idGltZSA9IGxlNjRfdG9fY3B1KGQtPmRxYl9idGltZSk7CiAJLyogV2UgbmVlZCB0byBlc2NhcGUgYmFjayBhbGwtemVybyBzdHJ1Y3R1cmUgKi8KLQltZW1zZXQoJmVtcHR5LCAwLCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKTsKKwltZW1zZXQoJmVtcHR5LCAwLCBzaXplb2Yoc3RydWN0IHYycjBfZGlza19kcWJsaykpOwogCWVtcHR5LmRxYl9pdGltZSA9IGNwdV90b19sZTY0KDEpOwotCWlmICghbWVtY21wKCZlbXB0eSwgZHAsIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWJsaykpKQorCWlmICghbWVtY21wKCZlbXB0eSwgZHAsIHNpemVvZihzdHJ1Y3QgdjJyMF9kaXNrX2RxYmxrKSkpCiAJCW0tPmRxYl9pdGltZSA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIHYyX21lbTJkaXNrZHFiKHZvaWQgKmRwLCBzdHJ1Y3QgZHF1b3QgKmRxdW90KQorc3RhdGljIHZvaWQgdjJyMF9tZW0yZGlza2RxYih2b2lkICpkcCwgc3RydWN0IGRxdW90ICpkcXVvdCkKIHsKLQlzdHJ1Y3QgdjJfZGlza19kcWJsayAqZCA9IGRwOworCXN0cnVjdCB2MnIwX2Rpc2tfZHFibGsgKmQgPSBkcDsKIAlzdHJ1Y3QgbWVtX2RxYmxrICptID0gJmRxdW90LT5kcV9kcWI7CiAJc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8gPQogCQkJc2JfZHFpbmZvKGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUpLT5kcWlfcHJpdjsKQEAgLTE3NSw5ICsyMTEsNjAgQEAKIAkJZC0+ZHFiX2l0aW1lID0gY3B1X3RvX2xlNjQoMSk7CiB9CiAKLXN0YXRpYyBpbnQgdjJfaXNfaWQodm9pZCAqZHAsIHN0cnVjdCBkcXVvdCAqZHF1b3QpCitzdGF0aWMgaW50IHYycjBfaXNfaWQodm9pZCAqZHAsIHN0cnVjdCBkcXVvdCAqZHF1b3QpCiB7Ci0Jc3RydWN0IHYyX2Rpc2tfZHFibGsgKmQgPSBkcDsKKwlzdHJ1Y3QgdjJyMF9kaXNrX2RxYmxrICpkID0gZHA7CisJc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8gPQorCQkJc2JfZHFpbmZvKGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUpLT5kcWlfcHJpdjsKKworCWlmIChxdHJlZV9lbnRyeV91bnVzZWQoaW5mbywgZHApKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gbGUzMl90b19jcHUoZC0+ZHFiX2lkKSA9PSBkcXVvdC0+ZHFfaWQ7Cit9CisKK3N0YXRpYyB2b2lkIHYycjFfZGlzazJtZW1kcWIoc3RydWN0IGRxdW90ICpkcXVvdCwgdm9pZCAqZHApCit7CisJc3RydWN0IHYycjFfZGlza19kcWJsayAqZCA9IGRwLCBlbXB0eTsKKwlzdHJ1Y3QgbWVtX2RxYmxrICptID0gJmRxdW90LT5kcV9kcWI7CisKKwltLT5kcWJfaWhhcmRsaW1pdCA9IGxlNjRfdG9fY3B1KGQtPmRxYl9paGFyZGxpbWl0KTsKKwltLT5kcWJfaXNvZnRsaW1pdCA9IGxlNjRfdG9fY3B1KGQtPmRxYl9pc29mdGxpbWl0KTsKKwltLT5kcWJfY3VyaW5vZGVzID0gbGU2NF90b19jcHUoZC0+ZHFiX2N1cmlub2Rlcyk7CisJbS0+ZHFiX2l0aW1lID0gbGU2NF90b19jcHUoZC0+ZHFiX2l0aW1lKTsKKwltLT5kcWJfYmhhcmRsaW1pdCA9IHYyX3FidG9zKGxlNjRfdG9fY3B1KGQtPmRxYl9iaGFyZGxpbWl0KSk7CisJbS0+ZHFiX2Jzb2Z0bGltaXQgPSB2Ml9xYnRvcyhsZTY0X3RvX2NwdShkLT5kcWJfYnNvZnRsaW1pdCkpOworCW0tPmRxYl9jdXJzcGFjZSA9IGxlNjRfdG9fY3B1KGQtPmRxYl9jdXJzcGFjZSk7CisJbS0+ZHFiX2J0aW1lID0gbGU2NF90b19jcHUoZC0+ZHFiX2J0aW1lKTsKKwkvKiBXZSBuZWVkIHRvIGVzY2FwZSBiYWNrIGFsbC16ZXJvIHN0cnVjdHVyZSAqLworCW1lbXNldCgmZW1wdHksIDAsIHNpemVvZihzdHJ1Y3QgdjJyMV9kaXNrX2RxYmxrKSk7CisJZW1wdHkuZHFiX2l0aW1lID0gY3B1X3RvX2xlNjQoMSk7CisJaWYgKCFtZW1jbXAoJmVtcHR5LCBkcCwgc2l6ZW9mKHN0cnVjdCB2MnIxX2Rpc2tfZHFibGspKSkKKwkJbS0+ZHFiX2l0aW1lID0gMDsKK30KKworc3RhdGljIHZvaWQgdjJyMV9tZW0yZGlza2RxYih2b2lkICpkcCwgc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlzdHJ1Y3QgdjJyMV9kaXNrX2RxYmxrICpkID0gZHA7CisJc3RydWN0IG1lbV9kcWJsayAqbSA9ICZkcXVvdC0+ZHFfZHFiOworCXN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvID0KKwkJCXNiX2RxaW5mbyhkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlKS0+ZHFpX3ByaXY7CisKKwlkLT5kcWJfaWhhcmRsaW1pdCA9IGNwdV90b19sZTY0KG0tPmRxYl9paGFyZGxpbWl0KTsKKwlkLT5kcWJfaXNvZnRsaW1pdCA9IGNwdV90b19sZTY0KG0tPmRxYl9pc29mdGxpbWl0KTsKKwlkLT5kcWJfY3VyaW5vZGVzID0gY3B1X3RvX2xlNjQobS0+ZHFiX2N1cmlub2Rlcyk7CisJZC0+ZHFiX2l0aW1lID0gY3B1X3RvX2xlNjQobS0+ZHFiX2l0aW1lKTsKKwlkLT5kcWJfYmhhcmRsaW1pdCA9IGNwdV90b19sZTY0KHYyX3N0b3FiKG0tPmRxYl9iaGFyZGxpbWl0KSk7CisJZC0+ZHFiX2Jzb2Z0bGltaXQgPSBjcHVfdG9fbGU2NCh2Ml9zdG9xYihtLT5kcWJfYnNvZnRsaW1pdCkpOworCWQtPmRxYl9jdXJzcGFjZSA9IGNwdV90b19sZTY0KG0tPmRxYl9jdXJzcGFjZSk7CisJZC0+ZHFiX2J0aW1lID0gY3B1X3RvX2xlNjQobS0+ZHFiX2J0aW1lKTsKKwlkLT5kcWJfaWQgPSBjcHVfdG9fbGUzMihkcXVvdC0+ZHFfaWQpOworCWlmIChxdHJlZV9lbnRyeV91bnVzZWQoaW5mbywgZHApKQorCQlkLT5kcWJfaXRpbWUgPSBjcHVfdG9fbGU2NCgxKTsKK30KKworc3RhdGljIGludCB2MnIxX2lzX2lkKHZvaWQgKmRwLCBzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCXN0cnVjdCB2MnIxX2Rpc2tfZHFibGsgKmQgPSBkcDsKIAlzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbyA9CiAJCQlzYl9kcWluZm8oZHF1b3QtPmRxX3NiLCBkcXVvdC0+ZHFfdHlwZSktPmRxaV9wcml2OwogCkBAIC0yMDcsNyArMjk0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBxdW90YV9mb3JtYXRfb3BzIHYyX2Zvcm1hdF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHF1b3RhX2Zvcm1hdF9vcHMgdjJfZm9ybWF0X29wcyA9IHsKIAkuY2hlY2tfcXVvdGFfZmlsZQk9IHYyX2NoZWNrX3F1b3RhX2ZpbGUsCiAJLnJlYWRfZmlsZV9pbmZvCQk9IHYyX3JlYWRfZmlsZV9pbmZvLAogCS53cml0ZV9maWxlX2luZm8JPSB2Ml93cml0ZV9maWxlX2luZm8sCkBAIC0yMTcsMjAgKzMwNCwzMiBAQAogCS5yZWxlYXNlX2RxYmxrCQk9IHYyX3JlbGVhc2VfZHF1b3QsCiB9OwogCi1zdGF0aWMgc3RydWN0IHF1b3RhX2Zvcm1hdF90eXBlIHYyX3F1b3RhX2Zvcm1hdCA9IHsKK3N0YXRpYyBzdHJ1Y3QgcXVvdGFfZm9ybWF0X3R5cGUgdjJyMF9xdW90YV9mb3JtYXQgPSB7CiAJLnFmX2ZtdF9pZAk9IFFGTVRfVkZTX1YwLAogCS5xZl9vcHMJCT0gJnYyX2Zvcm1hdF9vcHMsCiAJLnFmX293bmVyCT0gVEhJU19NT0RVTEUKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcXVvdGFfZm9ybWF0X3R5cGUgdjJyMV9xdW90YV9mb3JtYXQgPSB7CisJLnFmX2ZtdF9pZAk9IFFGTVRfVkZTX1YxLAorCS5xZl9vcHMJCT0gJnYyX2Zvcm1hdF9vcHMsCisJLnFmX293bmVyCT0gVEhJU19NT0RVTEUKK307CisKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfdjJfcXVvdGFfZm9ybWF0KHZvaWQpCiB7Ci0JcmV0dXJuIHJlZ2lzdGVyX3F1b3RhX2Zvcm1hdCgmdjJfcXVvdGFfZm9ybWF0KTsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnaXN0ZXJfcXVvdGFfZm9ybWF0KCZ2MnIwX3F1b3RhX2Zvcm1hdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gcmVnaXN0ZXJfcXVvdGFfZm9ybWF0KCZ2MnIxX3F1b3RhX2Zvcm1hdCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3YyX3F1b3RhX2Zvcm1hdCh2b2lkKQogewotCXVucmVnaXN0ZXJfcXVvdGFfZm9ybWF0KCZ2Ml9xdW90YV9mb3JtYXQpOworCXVucmVnaXN0ZXJfcXVvdGFfZm9ybWF0KCZ2MnIwX3F1b3RhX2Zvcm1hdCk7CisJdW5yZWdpc3Rlcl9xdW90YV9mb3JtYXQoJnYycjFfcXVvdGFfZm9ybWF0KTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdF92Ml9xdW90YV9mb3JtYXQpOwpkaWZmIC0tZ2l0IGEvZnMvcXVvdGEvcXVvdGFpb192Mi5oIGIvZnMvcXVvdGEvcXVvdGFpb192Mi5oCmluZGV4IDUzMGZlNTguLmYxOTY2YjQgMTAwNjQ0Ci0tLSBhL2ZzL3F1b3RhL3F1b3RhaW9fdjIuaAorKysgYi9mcy9xdW90YS9xdW90YWlvX3YyLmgKQEAgLTE3LDggKzE3LDggQEAKIH0KIAogI2RlZmluZSBWMl9JTklUUVZFUlNJT05TIHtcCi0JMCwJCS8qIFVTUlFVT1RBICovXAotCTAJCS8qIEdSUFFVT1RBICovXAorCTEsCQkvKiBVU1JRVU9UQSAqL1wKKwkxCQkvKiBHUlBRVU9UQSAqL1wKIH0KIAogLyogRmlyc3QgZ2VuZXJpYyBoZWFkZXIgKi8KQEAgLTMyLDcgKzMyLDcgQEAKICAqIChhcyBpdCBhcHBlYXJzIG9uIGRpc2spIC0gdGhlIGZpbGUgaXMgYSByYWRpeCB0cmVlIHdob3NlIGxlYXZlcyBwb2ludAogICogdG8gYmxvY2tzIG9mIHRoZXNlIHN0cnVjdHVyZXMuCiAgKi8KLXN0cnVjdCB2Ml9kaXNrX2RxYmxrIHsKK3N0cnVjdCB2MnIwX2Rpc2tfZHFibGsgewogCV9fbGUzMiBkcWJfaWQ7CQkvKiBpZCB0aGlzIHF1b3RhIGFwcGxpZXMgdG8gKi8KIAlfX2xlMzIgZHFiX2loYXJkbGltaXQ7CS8qIGFic29sdXRlIGxpbWl0IG9uIGFsbG9jYXRlZCBpbm9kZXMgKi8KIAlfX2xlMzIgZHFiX2lzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBpbm9kZSBsaW1pdCAqLwpAQCAtNDQsNiArNDQsMTkgQEAKIAlfX2xlNjQgZHFiX2l0aW1lOwkvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgaW5vZGUgdXNlICovCiB9OwogCitzdHJ1Y3QgdjJyMV9kaXNrX2RxYmxrIHsKKwlfX2xlMzIgZHFiX2lkOwkJLyogaWQgdGhpcyBxdW90YSBhcHBsaWVzIHRvICovCisJX19sZTMyIGRxYl9wYWQ7CisJX19sZTY0IGRxYl9paGFyZGxpbWl0OwkvKiBhYnNvbHV0ZSBsaW1pdCBvbiBhbGxvY2F0ZWQgaW5vZGVzICovCisJX19sZTY0IGRxYl9pc29mdGxpbWl0OwkvKiBwcmVmZXJyZWQgaW5vZGUgbGltaXQgKi8KKwlfX2xlNjQgZHFiX2N1cmlub2RlczsJLyogY3VycmVudCAjIGFsbG9jYXRlZCBpbm9kZXMgKi8KKwlfX2xlNjQgZHFiX2JoYXJkbGltaXQ7CS8qIGFic29sdXRlIGxpbWl0IG9uIGRpc2sgc3BhY2UgKGluIFFVT1RBQkxPQ0tfU0laRSkgKi8KKwlfX2xlNjQgZHFiX2Jzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBsaW1pdCBvbiBkaXNrIHNwYWNlIChpbiBRVU9UQUJMT0NLX1NJWkUpICovCisJX19sZTY0IGRxYl9jdXJzcGFjZTsJLyogY3VycmVudCBzcGFjZSBvY2N1cGllZCAoaW4gYnl0ZXMpICovCisJX19sZTY0IGRxYl9idGltZTsJLyogdGltZSBsaW1pdCBmb3IgZXhjZXNzaXZlIGRpc2sgdXNlICovCisJX19sZTY0IGRxYl9pdGltZTsJLyogdGltZSBsaW1pdCBmb3IgZXhjZXNzaXZlIGlub2RlIHVzZSAqLworfTsKKwogLyogSGVhZGVyIHdpdGggdHlwZSBhbmQgdmVyc2lvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwogc3RydWN0IHYyX2Rpc2tfZHFpbmZvIHsKIAlfX2xlMzIgZHFpX2JncmFjZTsJLyogVGltZSBiZWZvcmUgYmxvY2sgc29mdCBsaW1pdCBiZWNvbWVzIGhhcmQgbGltaXQgKi8KZGlmZiAtLWdpdCBhL2ZzL3N5bmMuYyBiL2ZzL3N5bmMuYwppbmRleCBkMTA0NTkxLi4zNjc1MmE2IDEwMDY0NAotLS0gYS9mcy9zeW5jLmMKKysrIGIvZnMvc3luYy5jCkBAIC0yOTUsMTAgKzI5NSwxMSBAQAogICovCiBpbnQgZ2VuZXJpY193cml0ZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgcG9zLCBsb2ZmX3QgY291bnQpCiB7Ci0JaWYgKCEoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykgJiYgIUlTX1NZTkMoZmlsZS0+Zl9tYXBwaW5nLT5ob3N0KSkKKwlpZiAoIShmaWxlLT5mX2ZsYWdzICYgT19EU1lOQykgJiYgIUlTX1NZTkMoZmlsZS0+Zl9tYXBwaW5nLT5ob3N0KSkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIHZmc19mc3luY19yYW5nZShmaWxlLCBmaWxlLT5mX3BhdGguZGVudHJ5LCBwb3MsCi0JCQkgICAgICAgcG9zICsgY291bnQgLSAxLCAxKTsKKwkJCSAgICAgICBwb3MgKyBjb3VudCAtIDEsCisJCQkgICAgICAgKGZpbGUtPmZfZmxhZ3MgJiBfX09fU1lOQykgPyAwIDogMSk7CiB9CiBFWFBPUlRfU1lNQk9MKGdlbmVyaWNfd3JpdGVfc3luYyk7CiAKQEAgLTQ1Miw5ICs0NTMsNyBAQAogCiAJcmV0ID0gMDsKIAlpZiAoZmxhZ3MgJiBTWU5DX0ZJTEVfUkFOR0VfV0FJVF9CRUZPUkUpIHsKLQkJcmV0ID0gd2FpdF9vbl9wYWdlX3dyaXRlYmFja19yYW5nZShtYXBwaW5nLAotCQkJCQlvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVCwKLQkJCQkJZW5kYnl0ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJcmV0ID0gZmlsZW1hcF9mZGF0YXdhaXRfcmFuZ2UobWFwcGluZywgb2Zmc2V0LCBlbmRieXRlKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKIAl9CkBAIC00NjcsOSArNDY2LDcgQEAKIAl9CiAKIAlpZiAoZmxhZ3MgJiBTWU5DX0ZJTEVfUkFOR0VfV0FJVF9BRlRFUikgewotCQlyZXQgPSB3YWl0X29uX3BhZ2Vfd3JpdGViYWNrX3JhbmdlKG1hcHBpbmcsCi0JCQkJCW9mZnNldCA+PiBQQUdFX0NBQ0hFX1NISUZULAotCQkJCQllbmRieXRlID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCQlyZXQgPSBmaWxlbWFwX2ZkYXRhd2FpdF9yYW5nZShtYXBwaW5nLCBvZmZzZXQsIGVuZGJ5dGUpOwogCX0KIG91dDoKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZGlyLmMgYi9mcy9zeXNmcy9kaXIuYwppbmRleCBlMDIwMTgzLi5mMDVmMjMwIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9kaXIuYworKysgYi9mcy9zeXNmcy9kaXIuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgInN5c2ZzLmgiCiAKIERFRklORV9NVVRFWChzeXNmc19tdXRleCk7Ci1ERUZJTkVfTVVURVgoc3lzZnNfcmVuYW1lX211dGV4KTsKIERFRklORV9TUElOTE9DSyhzeXNmc19hc3NvY19sb2NrKTsKIAogc3RhdGljIERFRklORV9TUElOTE9DSyhzeXNmc19pbm9fbG9jayk7CkBAIC04NSw0NiArODQsNiBAQAogfQogCiAvKioKLSAqCXN5c2ZzX2dldF9kZW50cnkgLSBnZXQgZGVudHJ5IGZvciB0aGUgZ2l2ZW4gc3lzZnNfZGlyZW50Ci0gKglAc2Q6IHN5c2ZzX2RpcmVudCBvZiBpbnRlcmVzdAotICoKLSAqCUdldCBkZW50cnkgZm9yIEBzZC4gIERlbnRyeSBpcyBsb29rZWQgdXAgaWYgY3VycmVudGx5IG5vdAotICoJcHJlc2VudC4gIFRoaXMgZnVuY3Rpb24gZGVzY2VuZHMgZnJvbSB0aGUgcm9vdCBsb29raW5nIHVwCi0gKglkZW50cnkgZm9yIGVhY2ggc3RlcC4KLSAqCi0gKglMT0NLSU5HOgotICoJbXV0ZXhfbG9jayhzeXNmc19yZW5hbWVfbXV0ZXgpCi0gKgotICoJUkVUVVJOUzoKLSAqCVBvaW50ZXIgdG8gZm91bmQgZGVudHJ5IG9uIHN1Y2Nlc3MsIEVSUl9QVFIoKSB2YWx1ZSBvbiBlcnJvci4KLSAqLwotc3RydWN0IGRlbnRyeSAqc3lzZnNfZ2V0X2RlbnRyeShzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCkKLXsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBkZ2V0KHN5c2ZzX3NiLT5zX3Jvb3QpOwotCi0Jd2hpbGUgKGRlbnRyeS0+ZF9mc2RhdGEgIT0gc2QpIHsKLQkJc3RydWN0IHN5c2ZzX2RpcmVudCAqY3VyOwotCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7Ci0KLQkJLyogZmluZCB0aGUgZmlyc3QgYW5jZXN0b3Igd2hpY2ggaGFzbid0IGJlZW4gbG9va2VkIHVwICovCi0JCWN1ciA9IHNkOwotCQl3aGlsZSAoY3VyLT5zX3BhcmVudCAhPSBkZW50cnktPmRfZnNkYXRhKQotCQkJY3VyID0gY3VyLT5zX3BhcmVudDsKLQotCQkvKiBsb29rIGl0IHVwICovCi0JCXBhcmVudCA9IGRlbnRyeTsKLQkJbXV0ZXhfbG9jaygmcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKLQkJZGVudHJ5ID0gbG9va3VwX29uZV9ub3Blcm0oY3VyLT5zX25hbWUsIHBhcmVudCk7Ci0JCW11dGV4X3VubG9jaygmcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKLQkJZHB1dChwYXJlbnQpOwotCi0JCWlmIChJU19FUlIoZGVudHJ5KSkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gZGVudHJ5OwotfQotCi0vKioKICAqCXN5c2ZzX2dldF9hY3RpdmUgLSBnZXQgYW4gYWN0aXZlIHJlZmVyZW5jZSB0byBzeXNmc19kaXJlbnQKICAqCUBzZDogc3lzZnNfZGlyZW50IHRvIGdldCBhbiBhY3RpdmUgcmVmZXJlbmNlIHRvCiAgKgpAQCAtMjk4LDcgKzI1Nyw2MSBAQAogCQlnb3RvIHJlcGVhdDsKIH0KIAotc3RhdGljIHZvaWQgc3lzZnNfZF9pcHV0KHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBpbm9kZSAqIGlub2RlKQorc3RhdGljIGludCBzeXNmc19kZW50cnlfZGVsZXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCA9IGRlbnRyeS0+ZF9mc2RhdGE7CisJcmV0dXJuICEhKHNkLT5zX2ZsYWdzICYgU1lTRlNfRkxBR19SRU1PVkVEKTsKK30KKworc3RhdGljIGludCBzeXNmc19kZW50cnlfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBzeXNmc19kaXJlbnQgKnNkID0gZGVudHJ5LT5kX2ZzZGF0YTsKKwlpbnQgaXNfZGlyOworCisJbXV0ZXhfbG9jaygmc3lzZnNfbXV0ZXgpOworCisJLyogVGhlIHN5c2ZzIGRpcmVudCBoYXMgYmVlbiBkZWxldGVkICovCisJaWYgKHNkLT5zX2ZsYWdzICYgU1lTRlNfRkxBR19SRU1PVkVEKQorCQlnb3RvIG91dF9iYWQ7CisKKwkvKiBUaGUgc3lzZnMgZGlyZW50IGhhcyBiZWVuIG1vdmVkPyAqLworCWlmIChkZW50cnktPmRfcGFyZW50LT5kX2ZzZGF0YSAhPSBzZC0+c19wYXJlbnQpCisJCWdvdG8gb3V0X2JhZDsKKworCS8qIFRoZSBzeXNmcyBkaXJlbnQgaGFzIGJlZW4gcmVuYW1lZCAqLworCWlmIChzdHJjbXAoZGVudHJ5LT5kX25hbWUubmFtZSwgc2QtPnNfbmFtZSkgIT0gMCkKKwkJZ290byBvdXRfYmFkOworCisJbXV0ZXhfdW5sb2NrKCZzeXNmc19tdXRleCk7CitvdXRfdmFsaWQ6CisJcmV0dXJuIDE7CitvdXRfYmFkOgorCS8qIFJlbW92ZSB0aGUgZGVudHJ5IGZyb20gdGhlIGRjYWNoZSBoYXNoZXMuCisJICogSWYgdGhpcyBpcyBhIGRlbGV0ZWQgZGVudHJ5IHdlIHVzZSBkX2Ryb3AgaW5zdGVhZCBvZiBkX2RlbGV0ZQorCSAqIHNvIHN5c2ZzIGRvZXNuJ3QgbmVlZCB0byBjb3BlIHdpdGggbmVnYXRpdmUgZGVudHJpZXMuCisJICoKKwkgKiBJZiB0aGlzIGlzIGEgZGVudHJ5IHRoYXQgaGFzIHNpbXBseSBiZWVuIHJlbmFtZWQgd2UKKwkgKiB1c2UgZF9kcm9wIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBkY2FjaGUgbG9va3VwIG9uIGl0cworCSAqIG9sZCBwYXJlbnQuICBJZiB0aGlzIGRlbnRyeSBwZXJzaXN0cyBsYXRlciB3aGVuIGEgbG9va3VwCisJICogaXMgcGVyZm9ybWVkIGF0IGl0cyBuZXcgbmFtZSB0aGUgZGVudHJ5IHdpbGwgYmUgcmVhZGRlZAorCSAqIHRvIHRoZSBkY2FjaGUgaGFzaGVzLgorCSAqLworCWlzX2RpciA9IChzeXNmc190eXBlKHNkKSA9PSBTWVNGU19ESVIpOworCW11dGV4X3VubG9jaygmc3lzZnNfbXV0ZXgpOworCWlmIChpc19kaXIpIHsKKwkJLyogSWYgd2UgaGF2ZSBzdWJtb3VudHMgd2UgbXVzdCBhbGxvdyB0aGUgdmZzIGNhY2hlcworCQkgKiB0byBsaWUgYWJvdXQgdGhlIHN0YXRlIG9mIHRoZSBmaWxlc3lzdGVtIHRvIHByZXZlbnQKKwkJICogbGVha3MgYW5kIG90aGVyIG5hc3R5IHRoaW5ncy4KKwkJICovCisJCWlmIChoYXZlX3N1Ym1vdW50cyhkZW50cnkpKQorCQkJZ290byBvdXRfdmFsaWQ7CisJCXNocmlua19kY2FjaGVfcGFyZW50KGRlbnRyeSk7CisJfQorCWRfZHJvcChkZW50cnkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzeXNmc19kZW50cnlfaXB1dChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IHN5c2ZzX2RpcmVudCAqIHNkID0gZGVudHJ5LT5kX2ZzZGF0YTsKIApAQCAtMzA3LDcgKzMyMCw5IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgc3lzZnNfZGVudHJ5X29wcyA9IHsKLQkuZF9pcHV0CQk9IHN5c2ZzX2RfaXB1dCwKKwkuZF9yZXZhbGlkYXRlCT0gc3lzZnNfZGVudHJ5X3JldmFsaWRhdGUsCisJLmRfZGVsZXRlCT0gc3lzZnNfZGVudHJ5X2RlbGV0ZSwKKwkuZF9pcHV0CQk9IHN5c2ZzX2RlbnRyeV9pcHV0LAogfTsKIAogc3RydWN0IHN5c2ZzX2RpcmVudCAqc3lzZnNfbmV3X2RpcmVudChjb25zdCBjaGFyICpuYW1lLCB1bW9kZV90IG1vZGUsIGludCB0eXBlKQpAQCAtMzQ0LDEyICszNTksNiBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IHN5c2ZzX2lsb29rdXBfdGVzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QgPSBhcmc7Ci0JcmV0dXJuIGlub2RlLT5pX2lubyA9PSBzZC0+c19pbm87Ci19Ci0KIC8qKgogICoJc3lzZnNfYWRkcm1fc3RhcnQgLSBwcmVwYXJlIGZvciBzeXNmc19kaXJlbnQgYWRkL3JlbW92ZQogICoJQGFjeHQ6IHBvaW50ZXIgdG8gc3lzZnNfYWRkcm1fY3h0IHRvIGJlIHVzZWQKQEAgLTM1Nyw0NyArMzY2LDIwIEBACiAgKgogICoJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIGFkZCBvcgogICoJcmVtb3ZlIHN5c2ZzX2RpcmVudCB1bmRlciBAcGFyZW50X3NkLiAgVGhpcyBmdW5jdGlvbiBhY3F1aXJlcwotICoJc3lzZnNfbXV0ZXgsIGdyYWJzIGlub2RlIGZvciBAcGFyZW50X3NkIGlmIGF2YWlsYWJsZSBhbmQgbG9jawotICoJaV9tdXRleCBvZiBpdC4gIEBhY3h0IGlzIHVzZWQgdG8ga2VlcCBhbmQgcGFzcyBjb250ZXh0IHRvCisgKglzeXNmc19tdXRleC4gIEBhY3h0IGlzIHVzZWQgdG8ga2VlcCBhbmQgcGFzcyBjb250ZXh0IHRvCiAgKglvdGhlciBhZGRybSBmdW5jdGlvbnMuCiAgKgogICoJTE9DS0lORzoKICAqCUtlcm5lbCB0aHJlYWQgY29udGV4dCAobWF5IHNsZWVwKS4gIHN5c2ZzX211dGV4IGlzIGxvY2tlZCBvbgotICoJcmV0dXJuLiAgaV9tdXRleCBvZiBwYXJlbnQgaW5vZGUgaXMgbG9ja2VkIG9uIHJldHVybiBpZgotICoJYXZhaWxhYmxlLgorICoJcmV0dXJuLgogICovCiB2b2lkIHN5c2ZzX2FkZHJtX3N0YXJ0KHN0cnVjdCBzeXNmc19hZGRybV9jeHQgKmFjeHQsCiAJCSAgICAgICBzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpwYXJlbnRfc2QpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKLQogCW1lbXNldChhY3h0LCAwLCBzaXplb2YoKmFjeHQpKTsKIAlhY3h0LT5wYXJlbnRfc2QgPSBwYXJlbnRfc2Q7CiAKLQkvKiBMb29rdXAgcGFyZW50IGlub2RlLiAgaW5vZGUgaW5pdGlhbGl6YXRpb24gaXMgcHJvdGVjdGVkIGJ5Ci0JICogc3lzZnNfbXV0ZXgsIHNvIGlub2RlIGV4aXN0ZW5jZSBjYW4gYmUgZGV0ZXJtaW5lZCBieQotCSAqIGxvb2tpbmcgdXAgaW5vZGUgd2hpbGUgaG9sZGluZyBzeXNmc19tdXRleC4KLQkgKi8KIAltdXRleF9sb2NrKCZzeXNmc19tdXRleCk7Ci0KLQlpbm9kZSA9IGlsb29rdXA1KHN5c2ZzX3NiLCBwYXJlbnRfc2QtPnNfaW5vLCBzeXNmc19pbG9va3VwX3Rlc3QsCi0JCQkgcGFyZW50X3NkKTsKLQlpZiAoaW5vZGUpIHsKLQkJV0FSTl9PTihpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKTsKLQotCQkvKiBwYXJlbnQgaW5vZGUgYXZhaWxhYmxlICovCi0JCWFjeHQtPnBhcmVudF9pbm9kZSA9IGlub2RlOwotCi0JCS8qIHN5c2ZzX211dGV4IGlzIGJlbG93IGlfbXV0ZXggaW4gbG9jayBoaWVyYXJjaHkuCi0JCSAqIEZpcnN0LCB0cnlsb2NrIGlfbXV0ZXguICBJZiBmYWlscywgdW5sb2NrCi0JCSAqIHN5c2ZzX211dGV4IGFuZCBsb2NrIHRoZW0gaW4gb3JkZXIuCi0JCSAqLwotCQlpZiAoIW11dGV4X3RyeWxvY2soJmlub2RlLT5pX211dGV4KSkgewotCQkJbXV0ZXhfdW5sb2NrKCZzeXNmc19tdXRleCk7Ci0JCQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0JCQltdXRleF9sb2NrKCZzeXNmc19tdXRleCk7Ci0JCX0KLQl9CiB9CiAKIC8qKgpAQCAtNDIyLDE4ICs0MDQsMjIgQEAKICAqLwogaW50IF9fc3lzZnNfYWRkX29uZShzdHJ1Y3Qgc3lzZnNfYWRkcm1fY3h0ICphY3h0LCBzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCkKIHsKKwlzdHJ1Y3Qgc3lzZnNfaW5vZGVfYXR0cnMgKnBzX2lhdHRyOworCiAJaWYgKHN5c2ZzX2ZpbmRfZGlyZW50KGFjeHQtPnBhcmVudF9zZCwgc2QtPnNfbmFtZSkpCiAJCXJldHVybiAtRUVYSVNUOwogCiAJc2QtPnNfcGFyZW50ID0gc3lzZnNfZ2V0KGFjeHQtPnBhcmVudF9zZCk7CiAKLQlpZiAoc3lzZnNfdHlwZShzZCkgPT0gU1lTRlNfRElSICYmIGFjeHQtPnBhcmVudF9pbm9kZSkKLQkJaW5jX25saW5rKGFjeHQtPnBhcmVudF9pbm9kZSk7Ci0KLQlhY3h0LT5jbnQrKzsKLQogCXN5c2ZzX2xpbmtfc2libGluZyhzZCk7CiAKKwkvKiBVcGRhdGUgdGltZXN0YW1wcyBvbiB0aGUgcGFyZW50ICovCisJcHNfaWF0dHIgPSBhY3h0LT5wYXJlbnRfc2QtPnNfaWF0dHI7CisJaWYgKHBzX2lhdHRyKSB7CisJCXN0cnVjdCBpYXR0ciAqcHNfaWF0dHJzID0gJnBzX2lhdHRyLT5pYV9pYXR0cjsKKwkJcHNfaWF0dHJzLT5pYV9jdGltZSA9IHBzX2lhdHRycy0+aWFfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUxMiw3MCArNDk4LDIyIEBACiAgKi8KIHZvaWQgc3lzZnNfcmVtb3ZlX29uZShzdHJ1Y3Qgc3lzZnNfYWRkcm1fY3h0ICphY3h0LCBzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCkKIHsKKwlzdHJ1Y3Qgc3lzZnNfaW5vZGVfYXR0cnMgKnBzX2lhdHRyOworCiAJQlVHX09OKHNkLT5zX2ZsYWdzICYgU1lTRlNfRkxBR19SRU1PVkVEKTsKIAogCXN5c2ZzX3VubGlua19zaWJsaW5nKHNkKTsKIAorCS8qIFVwZGF0ZSB0aW1lc3RhbXBzIG9uIHRoZSBwYXJlbnQgKi8KKwlwc19pYXR0ciA9IGFjeHQtPnBhcmVudF9zZC0+c19pYXR0cjsKKwlpZiAocHNfaWF0dHIpIHsKKwkJc3RydWN0IGlhdHRyICpwc19pYXR0cnMgPSAmcHNfaWF0dHItPmlhX2lhdHRyOworCQlwc19pYXR0cnMtPmlhX2N0aW1lID0gcHNfaWF0dHJzLT5pYV9tdGltZSA9IENVUlJFTlRfVElNRTsKKwl9CisKIAlzZC0+c19mbGFncyB8PSBTWVNGU19GTEFHX1JFTU9WRUQ7CiAJc2QtPnNfc2libGluZyA9IGFjeHQtPnJlbW92ZWQ7CiAJYWN4dC0+cmVtb3ZlZCA9IHNkOwotCi0JaWYgKHN5c2ZzX3R5cGUoc2QpID09IFNZU0ZTX0RJUiAmJiBhY3h0LT5wYXJlbnRfaW5vZGUpCi0JCWRyb3BfbmxpbmsoYWN4dC0+cGFyZW50X2lub2RlKTsKLQotCWFjeHQtPmNudCsrOwotfQotCi0vKioKLSAqCXN5c2ZzX2Ryb3BfZGVudHJ5IC0gZHJvcCBkZW50cnkgZm9yIHRoZSBzcGVjaWZpZWQgc3lzZnNfZGlyZW50Ci0gKglAc2Q6IHRhcmdldCBzeXNmc19kaXJlbnQKLSAqCi0gKglEcm9wIGRlbnRyeSBmb3IgQHNkLiAgQHNkIG11c3QgaGF2ZSBiZWVuIHVubGlua2VkIGZyb20gaXRzCi0gKglwYXJlbnQgb24gZW50cnkgdG8gdGhpcyBmdW5jdGlvbiBzdWNoIHRoYXQgaXQgY2FuJ3QgYmUgbG9va2VkCi0gKgl1cCBhbnltb3JlLgotICovCi1zdGF0aWMgdm9pZCBzeXNmc19kcm9wX2RlbnRyeShzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCkKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKLQotCWlub2RlID0gaWxvb2t1cChzeXNmc19zYiwgc2QtPnNfaW5vKTsKLQlpZiAoIWlub2RlKQotCQlyZXR1cm47Ci0KLQkvKiBEcm9wIGFueSBleGlzdGluZyBkZW50cmllcyBhc3NvY2lhdGVkIHdpdGggc2QuCi0JICoKLQkgKiBGb3IgdGhlIGRlbnRyeSB0byBiZSBwcm9wZXJseSBmcmVlZCB3ZSBuZWVkIHRvIGdyYWIgYQotCSAqIHJlZmVyZW5jZSB0byB0aGUgZGVudHJ5IHVuZGVyIHRoZSBkY2FjaGUgbG9jaywgIHVuaGFzaCBpdCwKLQkgKiBhbmQgdGhlbiBwdXQgaXQuICBUaGUgcGxheWluZyB3aXRoIHRoZSBkZW50cnkgY291bnQgYWxsb3dzCi0JICogZHB1dCB0byBpbW1lZGlhdGVseSBmcmVlIHRoZSBkZW50cnkgIGlmIGl0IGlzIG5vdCBpbiB1c2UuCi0JICovCi1yZXBlYXQ6Ci0Jc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZW50cnksICZpbm9kZS0+aV9kZW50cnksIGRfYWxpYXMpIHsKLQkJaWYgKGRfdW5oYXNoZWQoZGVudHJ5KSkKLQkJCWNvbnRpbnVlOwotCQlkZ2V0X2xvY2tlZChkZW50cnkpOwotCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKLQkJX19kX2Ryb3AoZGVudHJ5KTsKLQkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKLQkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKLQkJZHB1dChkZW50cnkpOwotCQlnb3RvIHJlcGVhdDsKLQl9Ci0Jc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKLQotCS8qIGFkanVzdCBubGluayBhbmQgdXBkYXRlIHRpbWVzdGFtcCAqLwotCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKLQotCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwotCWRyb3BfbmxpbmsoaW5vZGUpOwotCWlmIChzeXNmc190eXBlKHNkKSA9PSBTWVNGU19ESVIpCi0JCWRyb3BfbmxpbmsoaW5vZGUpOwotCi0JbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0KLQlpcHV0KGlub2RlKTsKIH0KIAogLyoqCkBAIC01ODQsMjUgKzUyMiwxNSBAQAogICoKICAqCUZpbmlzaCB1cCBzeXNmc19kaXJlbnQgYWRkL3JlbW92ZS4gIFJlc291cmNlcyBhY3F1aXJlZCBieQogICoJc3lzZnNfYWRkcm1fc3RhcnQoKSBhcmUgcmVsZWFzZWQgYW5kIHJlbW92ZWQgc3lzZnNfZGlyZW50cyBhcmUKLSAqCWNsZWFuZWQgdXAuICBUaW1lc3RhbXBzIG9uIHRoZSBwYXJlbnQgaW5vZGUgYXJlIHVwZGF0ZWQuCisgKgljbGVhbmVkIHVwLgogICoKICAqCUxPQ0tJTkc6Ci0gKglBbGwgbXV0ZXhlcyBhY3F1aXJlZCBieSBzeXNmc19hZGRybV9zdGFydCgpIGFyZSByZWxlYXNlZC4KKyAqCXN5c2ZzX211dGV4IGlzIHJlbGVhc2VkLgogICovCiB2b2lkIHN5c2ZzX2FkZHJtX2ZpbmlzaChzdHJ1Y3Qgc3lzZnNfYWRkcm1fY3h0ICphY3h0KQogewogCS8qIHJlbGVhc2UgcmVzb3VyY2VzIGFjcXVpcmVkIGJ5IHN5c2ZzX2FkZHJtX3N0YXJ0KCkgKi8KIAltdXRleF91bmxvY2soJnN5c2ZzX211dGV4KTsKLQlpZiAoYWN4dC0+cGFyZW50X2lub2RlKSB7Ci0JCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBhY3h0LT5wYXJlbnRfaW5vZGU7Ci0KLQkJLyogaWYgYWRkZWQvcmVtb3ZlZCwgdXBkYXRlIHRpbWVzdGFtcHMgb24gdGhlIHBhcmVudCAqLwotCQlpZiAoYWN4dC0+Y250KQotCQkJaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKLQotCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKLQkJaXB1dChpbm9kZSk7Ci0JfQogCiAJLyoga2lsbCByZW1vdmVkIHN5c2ZzX2RpcmVudHMgKi8KIAl3aGlsZSAoYWN4dC0+cmVtb3ZlZCkgewpAQCAtNjExLDcgKzUzOSw2IEBACiAJCWFjeHQtPnJlbW92ZWQgPSBzZC0+c19zaWJsaW5nOwogCQlzZC0+c19zaWJsaW5nID0gTlVMTDsKIAotCQlzeXNmc19kcm9wX2RlbnRyeShzZCk7CiAJCXN5c2ZzX2RlYWN0aXZhdGUoc2QpOwogCQl1bm1hcF9iaW5fZmlsZShzZCk7CiAJCXN5c2ZzX3B1dChzZCk7CkBAIC03NTEsMTAgKzY3OCwxNSBAQAogCX0KIAogCS8qIGluc3RhbnRpYXRlIGFuZCBoYXNoIGRlbnRyeSAqLwotCWRlbnRyeS0+ZF9vcCA9ICZzeXNmc19kZW50cnlfb3BzOwotCWRlbnRyeS0+ZF9mc2RhdGEgPSBzeXNmc19nZXQoc2QpOwotCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0JZF9yZWhhc2goZGVudHJ5KTsKKwlyZXQgPSBkX2ZpbmRfYWxpYXMoaW5vZGUpOworCWlmICghcmV0KSB7CisJCWRlbnRyeS0+ZF9vcCA9ICZzeXNmc19kZW50cnlfb3BzOworCQlkZW50cnktPmRfZnNkYXRhID0gc3lzZnNfZ2V0KHNkKTsKKwkJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJfSBlbHNlIHsKKwkJZF9tb3ZlKHJldCwgZGVudHJ5KTsKKwkJaXB1dChpbm9kZSk7CisJfQogCiAgb3V0X3VubG9jazoKIAltdXRleF91bmxvY2soJnN5c2ZzX211dGV4KTsKQEAgLTc2Myw3ICs2OTUsOSBAQAogCiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzeXNmc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKIAkubG9va3VwCQk9IHN5c2ZzX2xvb2t1cCwKKwkucGVybWlzc2lvbgk9IHN5c2ZzX3Blcm1pc3Npb24sCiAJLnNldGF0dHIJPSBzeXNmc19zZXRhdHRyLAorCS5nZXRhdHRyCT0gc3lzZnNfZ2V0YXR0ciwKIAkuc2V0eGF0dHIJPSBzeXNmc19zZXR4YXR0ciwKIH07CiAKQEAgLTgyNiwxNDEgKzc2MCw2NSBAQAogCV9fc3lzZnNfcmVtb3ZlX2RpcihzZCk7CiB9CiAKLWludCBzeXNmc19yZW5hbWVfZGlyKHN0cnVjdCBrb2JqZWN0ICoga29iaiwgY29uc3QgY2hhciAqbmV3X25hbWUpCitpbnQgc3lzZnNfcmVuYW1lKHN0cnVjdCBzeXNmc19kaXJlbnQgKnNkLAorCXN0cnVjdCBzeXNmc19kaXJlbnQgKm5ld19wYXJlbnRfc2QsIGNvbnN0IGNoYXIgKm5ld19uYW1lKQogewotCXN0cnVjdCBzeXNmc19kaXJlbnQgKnNkID0ga29iai0+c2Q7Ci0Jc3RydWN0IGRlbnRyeSAqcGFyZW50ID0gTlVMTDsKLQlzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5ID0gTlVMTCwgKm5ld19kZW50cnkgPSBOVUxMOwogCWNvbnN0IGNoYXIgKmR1cF9uYW1lID0gTlVMTDsKIAlpbnQgZXJyb3I7CiAKLQltdXRleF9sb2NrKCZzeXNmc19yZW5hbWVfbXV0ZXgpOwotCi0JZXJyb3IgPSAwOwotCWlmIChzdHJjbXAoc2QtPnNfbmFtZSwgbmV3X25hbWUpID09IDApCi0JCWdvdG8gb3V0OwkvKiBub3RoaW5nIHRvIHJlbmFtZSAqLwotCi0JLyogZ2V0IHRoZSBvcmlnaW5hbCBkZW50cnkgKi8KLQlvbGRfZGVudHJ5ID0gc3lzZnNfZ2V0X2RlbnRyeShzZCk7Ci0JaWYgKElTX0VSUihvbGRfZGVudHJ5KSkgewotCQllcnJvciA9IFBUUl9FUlIob2xkX2RlbnRyeSk7Ci0JCW9sZF9kZW50cnkgPSBOVUxMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlwYXJlbnQgPSBvbGRfZGVudHJ5LT5kX3BhcmVudDsKLQotCS8qIGxvY2sgcGFyZW50IGFuZCBnZXQgZGVudHJ5IGZvciBuZXcgbmFtZSAqLwotCW11dGV4X2xvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJbXV0ZXhfbG9jaygmc3lzZnNfbXV0ZXgpOwogCi0JZXJyb3IgPSAtRUVYSVNUOwotCWlmIChzeXNmc19maW5kX2RpcmVudChzZC0+c19wYXJlbnQsIG5ld19uYW1lKSkKLQkJZ290byBvdXRfdW5sb2NrOworCWVycm9yID0gMDsKKwlpZiAoKHNkLT5zX3BhcmVudCA9PSBuZXdfcGFyZW50X3NkKSAmJgorCSAgICAoc3RyY21wKHNkLT5zX25hbWUsIG5ld19uYW1lKSA9PSAwKSkKKwkJZ290byBvdXQ7CS8qIG5vdGhpbmcgdG8gcmVuYW1lICovCiAKLQllcnJvciA9IC1FTk9NRU07Ci0JbmV3X2RlbnRyeSA9IGRfYWxsb2NfbmFtZShwYXJlbnQsIG5ld19uYW1lKTsKLQlpZiAoIW5ld19kZW50cnkpCi0JCWdvdG8gb3V0X3VubG9jazsKKwllcnJvciA9IC1FRVhJU1Q7CisJaWYgKHN5c2ZzX2ZpbmRfZGlyZW50KG5ld19wYXJlbnRfc2QsIG5ld19uYW1lKSkKKwkJZ290byBvdXQ7CiAKIAkvKiByZW5hbWUgc3lzZnNfZGlyZW50ICovCi0JZXJyb3IgPSAtRU5PTUVNOwotCW5ld19uYW1lID0gZHVwX25hbWUgPSBrc3RyZHVwKG5ld19uYW1lLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5ld19uYW1lKQotCQlnb3RvIG91dF91bmxvY2s7CisJaWYgKHN0cmNtcChzZC0+c19uYW1lLCBuZXdfbmFtZSkgIT0gMCkgeworCQllcnJvciA9IC1FTk9NRU07CisJCW5ld19uYW1lID0gZHVwX25hbWUgPSBrc3RyZHVwKG5ld19uYW1lLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFuZXdfbmFtZSkKKwkJCWdvdG8gb3V0OwogCi0JZHVwX25hbWUgPSBzZC0+c19uYW1lOwotCXNkLT5zX25hbWUgPSBuZXdfbmFtZTsKKwkJZHVwX25hbWUgPSBzZC0+c19uYW1lOworCQlzZC0+c19uYW1lID0gbmV3X25hbWU7CisJfQogCi0JLyogcmVuYW1lICovCi0JZF9hZGQobmV3X2RlbnRyeSwgTlVMTCk7Ci0JZF9tb3ZlKG9sZF9kZW50cnksIG5ld19kZW50cnkpOworCS8qIFJlbW92ZSBmcm9tIG9sZCBwYXJlbnQncyBsaXN0IGFuZCBpbnNlcnQgaW50byBuZXcgcGFyZW50J3MgbGlzdC4gKi8KKwlpZiAoc2QtPnNfcGFyZW50ICE9IG5ld19wYXJlbnRfc2QpIHsKKwkJc3lzZnNfdW5saW5rX3NpYmxpbmcoc2QpOworCQlzeXNmc19nZXQobmV3X3BhcmVudF9zZCk7CisJCXN5c2ZzX3B1dChzZC0+c19wYXJlbnQpOworCQlzZC0+c19wYXJlbnQgPSBuZXdfcGFyZW50X3NkOworCQlzeXNmc19saW5rX3NpYmxpbmcoc2QpOworCX0KIAogCWVycm9yID0gMDsKLSBvdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygmc3lzZnNfbXV0ZXgpOwotCW11dGV4X3VubG9jaygmcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKLQlrZnJlZShkdXBfbmFtZSk7Ci0JZHB1dChvbGRfZGVudHJ5KTsKLQlkcHV0KG5ld19kZW50cnkpOwogIG91dDoKLQltdXRleF91bmxvY2soJnN5c2ZzX3JlbmFtZV9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZzeXNmc19tdXRleCk7CisJa2ZyZWUoZHVwX25hbWUpOwogCXJldHVybiBlcnJvcjsKIH0KIAoraW50IHN5c2ZzX3JlbmFtZV9kaXIoc3RydWN0IGtvYmplY3QgKmtvYmosIGNvbnN0IGNoYXIgKm5ld19uYW1lKQoreworCXJldHVybiBzeXNmc19yZW5hbWUoa29iai0+c2QsIGtvYmotPnNkLT5zX3BhcmVudCwgbmV3X25hbWUpOworfQorCiBpbnQgc3lzZnNfbW92ZV9kaXIoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBrb2JqZWN0ICpuZXdfcGFyZW50X2tvYmopCiB7CiAJc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QgPSBrb2JqLT5zZDsKIAlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpuZXdfcGFyZW50X3NkOwotCXN0cnVjdCBkZW50cnkgKm9sZF9wYXJlbnQsICpuZXdfcGFyZW50ID0gTlVMTDsKLQlzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5ID0gTlVMTCwgKm5ld19kZW50cnkgPSBOVUxMOwotCWludCBlcnJvcjsKIAotCW11dGV4X2xvY2soJnN5c2ZzX3JlbmFtZV9tdXRleCk7CiAJQlVHX09OKCFzZC0+c19wYXJlbnQpOwotCW5ld19wYXJlbnRfc2QgPSAobmV3X3BhcmVudF9rb2JqICYmIG5ld19wYXJlbnRfa29iai0+c2QpID8KKwluZXdfcGFyZW50X3NkID0gbmV3X3BhcmVudF9rb2JqICYmIG5ld19wYXJlbnRfa29iai0+c2QgPwogCQluZXdfcGFyZW50X2tvYmotPnNkIDogJnN5c2ZzX3Jvb3Q7CiAKLQllcnJvciA9IDA7Ci0JaWYgKHNkLT5zX3BhcmVudCA9PSBuZXdfcGFyZW50X3NkKQotCQlnb3RvIG91dDsJLyogbm90aGluZyB0byBtb3ZlICovCi0KLQkvKiBnZXQgZGVudHJpZXMgKi8KLQlvbGRfZGVudHJ5ID0gc3lzZnNfZ2V0X2RlbnRyeShzZCk7Ci0JaWYgKElTX0VSUihvbGRfZGVudHJ5KSkgewotCQllcnJvciA9IFBUUl9FUlIob2xkX2RlbnRyeSk7Ci0JCW9sZF9kZW50cnkgPSBOVUxMOwotCQlnb3RvIG91dDsKLQl9Ci0Jb2xkX3BhcmVudCA9IG9sZF9kZW50cnktPmRfcGFyZW50OwotCi0JbmV3X3BhcmVudCA9IHN5c2ZzX2dldF9kZW50cnkobmV3X3BhcmVudF9zZCk7Ci0JaWYgKElTX0VSUihuZXdfcGFyZW50KSkgewotCQllcnJvciA9IFBUUl9FUlIobmV3X3BhcmVudCk7Ci0JCW5ld19wYXJlbnQgPSBOVUxMOwotCQlnb3RvIG91dDsKLQl9Ci0KLWFnYWluOgotCW11dGV4X2xvY2soJm9sZF9wYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwotCWlmICghbXV0ZXhfdHJ5bG9jaygmbmV3X3BhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCkpIHsKLQkJbXV0ZXhfdW5sb2NrKCZvbGRfcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKLQkJZ290byBhZ2FpbjsKLQl9Ci0JbXV0ZXhfbG9jaygmc3lzZnNfbXV0ZXgpOwotCi0JZXJyb3IgPSAtRUVYSVNUOwotCWlmIChzeXNmc19maW5kX2RpcmVudChuZXdfcGFyZW50X3NkLCBzZC0+c19uYW1lKSkKLQkJZ290byBvdXRfdW5sb2NrOwotCi0JZXJyb3IgPSAtRU5PTUVNOwotCW5ld19kZW50cnkgPSBkX2FsbG9jX25hbWUobmV3X3BhcmVudCwgc2QtPnNfbmFtZSk7Ci0JaWYgKCFuZXdfZGVudHJ5KQotCQlnb3RvIG91dF91bmxvY2s7Ci0KLQllcnJvciA9IDA7Ci0JZF9hZGQobmV3X2RlbnRyeSwgTlVMTCk7Ci0JZF9tb3ZlKG9sZF9kZW50cnksIG5ld19kZW50cnkpOwotCi0JLyogUmVtb3ZlIGZyb20gb2xkIHBhcmVudCdzIGxpc3QgYW5kIGluc2VydCBpbnRvIG5ldyBwYXJlbnQncyBsaXN0LiAqLwotCXN5c2ZzX3VubGlua19zaWJsaW5nKHNkKTsKLQlzeXNmc19nZXQobmV3X3BhcmVudF9zZCk7Ci0JZHJvcF9ubGluayhvbGRfcGFyZW50LT5kX2lub2RlKTsKLQlzeXNmc19wdXQoc2QtPnNfcGFyZW50KTsKLQlzZC0+c19wYXJlbnQgPSBuZXdfcGFyZW50X3NkOwotCWluY19ubGluayhuZXdfcGFyZW50LT5kX2lub2RlKTsKLQlzeXNmc19saW5rX3NpYmxpbmcoc2QpOwotCi0gb3V0X3VubG9jazoKLQltdXRleF91bmxvY2soJnN5c2ZzX211dGV4KTsKLQltdXRleF91bmxvY2soJm5ld19wYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwotCW11dGV4X3VubG9jaygmb2xkX3BhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0gb3V0OgotCWRwdXQobmV3X3BhcmVudCk7Ci0JZHB1dChvbGRfZGVudHJ5KTsKLQlkcHV0KG5ld19kZW50cnkpOwotCW11dGV4X3VubG9jaygmc3lzZnNfcmVuYW1lX211dGV4KTsKLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIHN5c2ZzX3JlbmFtZShzZCwgbmV3X3BhcmVudF9zZCwgc2QtPnNfbmFtZSk7CiB9CiAKIC8qIFJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNfbW9kZSBhbmQgdGhlIERUX3h4eCB0eXBlcyAqLwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZmlsZS5jIGIvZnMvc3lzZnMvZmlsZS5jCmluZGV4IGY1ZWE0NjguLmRjMzBkOWUgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL2ZpbGUuYworKysgYi9mcy9zeXNmcy9maWxlLmMKQEAgLTU3OSw0NiArNTc5LDIzIEBACiAgKi8KIGludCBzeXNmc19jaG1vZF9maWxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBtb2RlX3QgbW9kZSkKIHsKLQlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICp2aWN0aW1fc2QgPSBOVUxMOwotCXN0cnVjdCBkZW50cnkgKnZpY3RpbSA9IE5VTEw7Ci0Jc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IHN5c2ZzX2RpcmVudCAqc2Q7CiAJc3RydWN0IGlhdHRyIG5ld2F0dHJzOwogCWludCByYzsKIAorCW11dGV4X2xvY2soJnN5c2ZzX211dGV4KTsKKwogCXJjID0gLUVOT0VOVDsKLQl2aWN0aW1fc2QgPSBzeXNmc19nZXRfZGlyZW50KGtvYmotPnNkLCBhdHRyLT5uYW1lKTsKLQlpZiAoIXZpY3RpbV9zZCkKKwlzZCA9IHN5c2ZzX2ZpbmRfZGlyZW50KGtvYmotPnNkLCBhdHRyLT5uYW1lKTsKKwlpZiAoIXNkKQogCQlnb3RvIG91dDsKIAotCW11dGV4X2xvY2soJnN5c2ZzX3JlbmFtZV9tdXRleCk7Ci0JdmljdGltID0gc3lzZnNfZ2V0X2RlbnRyeSh2aWN0aW1fc2QpOwotCW11dGV4X3VubG9jaygmc3lzZnNfcmVuYW1lX211dGV4KTsKLQlpZiAoSVNfRVJSKHZpY3RpbSkpIHsKLQkJcmMgPSBQVFJfRVJSKHZpY3RpbSk7Ci0JCXZpY3RpbSA9IE5VTEw7Ci0JCWdvdG8gb3V0OwotCX0KKwluZXdhdHRycy5pYV9tb2RlID0gKG1vZGUgJiBTX0lBTExVR08pIHwgKHNkLT5zX21vZGUgJiB+U19JQUxMVUdPKTsKKwluZXdhdHRycy5pYV92YWxpZCA9IEFUVFJfTU9ERTsKKwlyYyA9IHN5c2ZzX3NkX3NldGF0dHIoc2QsICZuZXdhdHRycyk7CiAKLQlpbm9kZSA9IHZpY3RpbS0+ZF9pbm9kZTsKLQotCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKLQotCW5ld2F0dHJzLmlhX21vZGUgPSAobW9kZSAmIFNfSUFMTFVHTykgfCAoaW5vZGUtPmlfbW9kZSAmIH5TX0lBTExVR08pOwotCW5ld2F0dHJzLmlhX3ZhbGlkID0gQVRUUl9NT0RFIHwgQVRUUl9DVElNRTsKLQluZXdhdHRycy5pYV9jdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7Ci0JcmMgPSBzeXNmc19zZXRhdHRyKHZpY3RpbSwgJm5ld2F0dHJzKTsKLQotCWlmIChyYyA9PSAwKSB7Ci0JCWZzbm90aWZ5X2NoYW5nZSh2aWN0aW0sIG5ld2F0dHJzLmlhX3ZhbGlkKTsKLQkJbXV0ZXhfbG9jaygmc3lzZnNfbXV0ZXgpOwotCQl2aWN0aW1fc2QtPnNfbW9kZSA9IG5ld2F0dHJzLmlhX21vZGU7Ci0JCW11dGV4X3VubG9jaygmc3lzZnNfbXV0ZXgpOwotCX0KLQotCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogIG91dDoKLQlkcHV0KHZpY3RpbSk7Ci0Jc3lzZnNfcHV0KHZpY3RpbV9zZCk7CisJbXV0ZXhfdW5sb2NrKCZzeXNmc19tdXRleCk7CiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfY2htb2RfZmlsZSk7CmRpZmYgLS1naXQgYS9mcy9zeXNmcy9pbm9kZS5jIGIvZnMvc3lzZnMvaW5vZGUuYwppbmRleCBlMjhjZWNmLi4yMjBiNzU4IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9pbm9kZS5jCisrKyBiL2ZzL3N5c2ZzL2lub2RlLmMKQEAgLTM3LDcgKzM3LDkgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzeXNmc19pbm9kZV9vcGVyYXRpb25zID17CisJLnBlcm1pc3Npb24JPSBzeXNmc19wZXJtaXNzaW9uLAogCS5zZXRhdHRyCT0gc3lzZnNfc2V0YXR0ciwKKwkuZ2V0YXR0cgk9IHN5c2ZzX2dldGF0dHIsCiAJLnNldHhhdHRyCT0gc3lzZnNfc2V0eGF0dHIsCiB9OwogCkBAIC00Niw3ICs0OCw3IEBACiAJcmV0dXJuIGJkaV9pbml0KCZzeXNmc19iYWNraW5nX2Rldl9pbmZvKTsKIH0KIAotc3RydWN0IHN5c2ZzX2lub2RlX2F0dHJzICpzeXNmc19pbml0X2lub2RlX2F0dHJzKHN0cnVjdCBzeXNmc19kaXJlbnQgKnNkKQorc3RhdGljIHN0cnVjdCBzeXNmc19pbm9kZV9hdHRycyAqc3lzZnNfaW5pdF9pbm9kZV9hdHRycyhzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCkKIHsKIAlzdHJ1Y3Qgc3lzZnNfaW5vZGVfYXR0cnMgKmF0dHJzOwogCXN0cnVjdCBpYXR0ciAqaWF0dHJzOwpAQCAtNjQsMzAgKzY2LDE1IEBACiAKIAlyZXR1cm4gYXR0cnM7CiB9Ci1pbnQgc3lzZnNfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKiBpYXR0cikKKworaW50IHN5c2ZzX3NkX3NldGF0dHIoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QsIHN0cnVjdCBpYXR0ciAqIGlhdHRyKQogewotCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOwotCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBzZCA9IGRlbnRyeS0+ZF9mc2RhdGE7CiAJc3RydWN0IHN5c2ZzX2lub2RlX2F0dHJzICpzZF9hdHRyczsKIAlzdHJ1Y3QgaWF0dHIgKmlhdHRyczsKIAl1bnNpZ25lZCBpbnQgaWFfdmFsaWQgPSBpYXR0ci0+aWFfdmFsaWQ7Ci0JaW50IGVycm9yOwotCi0JaWYgKCFzZCkKLQkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzZF9hdHRycyA9IHNkLT5zX2lhdHRyOwogCi0JZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGlhdHRyKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQotCWlhdHRyLT5pYV92YWxpZCAmPSB+QVRUUl9TSVpFOyAvKiBpZ25vcmUgc2l6ZSBjaGFuZ2VzICovCi0KLQllcnJvciA9IGlub2RlX3NldGF0dHIoaW5vZGUsIGlhdHRyKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQogCWlmICghc2RfYXR0cnMpIHsKIAkJLyogc2V0dGluZyBhdHRyaWJ1dGVzIGZvciB0aGUgZmlyc3QgdGltZSwgYWxsb2NhdGUgbm93ICovCiAJCXNkX2F0dHJzID0gc3lzZnNfaW5pdF9pbm9kZV9hdHRycyhzZCk7CkBAIC0xMDMsNDIgKzkwLDc4IEBACiAJCWlmIChpYV92YWxpZCAmIEFUVFJfR0lEKQogCQkJaWF0dHJzLT5pYV9naWQgPSBpYXR0ci0+aWFfZ2lkOwogCQlpZiAoaWFfdmFsaWQgJiBBVFRSX0FUSU1FKQotCQkJaWF0dHJzLT5pYV9hdGltZSA9IHRpbWVzcGVjX3RydW5jKGlhdHRyLT5pYV9hdGltZSwKLQkJCQkJaW5vZGUtPmlfc2ItPnNfdGltZV9ncmFuKTsKKwkJCWlhdHRycy0+aWFfYXRpbWUgPSBpYXR0ci0+aWFfYXRpbWU7CiAJCWlmIChpYV92YWxpZCAmIEFUVFJfTVRJTUUpCi0JCQlpYXR0cnMtPmlhX210aW1lID0gdGltZXNwZWNfdHJ1bmMoaWF0dHItPmlhX210aW1lLAotCQkJCQlpbm9kZS0+aV9zYi0+c190aW1lX2dyYW4pOworCQkJaWF0dHJzLT5pYV9tdGltZSA9IGlhdHRyLT5pYV9tdGltZTsKIAkJaWYgKGlhX3ZhbGlkICYgQVRUUl9DVElNRSkKLQkJCWlhdHRycy0+aWFfY3RpbWUgPSB0aW1lc3BlY190cnVuYyhpYXR0ci0+aWFfY3RpbWUsCi0JCQkJCWlub2RlLT5pX3NiLT5zX3RpbWVfZ3Jhbik7CisJCQlpYXR0cnMtPmlhX2N0aW1lID0gaWF0dHItPmlhX2N0aW1lOwogCQlpZiAoaWFfdmFsaWQgJiBBVFRSX01PREUpIHsKIAkJCXVtb2RlX3QgbW9kZSA9IGlhdHRyLT5pYV9tb2RlOwotCi0JCQlpZiAoIWluX2dyb3VwX3AoaW5vZGUtPmlfZ2lkKSAmJiAhY2FwYWJsZShDQVBfRlNFVElEKSkKLQkJCQltb2RlICY9IH5TX0lTR0lEOwogCQkJaWF0dHJzLT5pYV9tb2RlID0gc2QtPnNfbW9kZSA9IG1vZGU7CiAJCX0KIAl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBzeXNmc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICppYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBzeXNmc19kaXJlbnQgKnNkID0gZGVudHJ5LT5kX2ZzZGF0YTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIXNkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVycm9yID0gaW5vZGVfY2hhbmdlX29rKGlub2RlLCBpYXR0cik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpYXR0ci0+aWFfdmFsaWQgJj0gfkFUVFJfU0laRTsgLyogaWdub3JlIHNpemUgY2hhbmdlcyAqLworCisJZXJyb3IgPSBpbm9kZV9zZXRhdHRyKGlub2RlLCBpYXR0cik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwltdXRleF9sb2NrKCZzeXNmc19tdXRleCk7CisJZXJyb3IgPSBzeXNmc19zZF9zZXRhdHRyKHNkLCBpYXR0cik7CisJbXV0ZXhfdW5sb2NrKCZzeXNmc19tdXRleCk7CisKIAlyZXR1cm4gZXJyb3I7CiB9CiAKK3N0YXRpYyBpbnQgc3lzZnNfc2Rfc2V0c2VjZGF0YShzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCwgdm9pZCAqKnNlY2RhdGEsIHUzMiAqc2VjZGF0YV9sZW4pCit7CisJc3RydWN0IHN5c2ZzX2lub2RlX2F0dHJzICppYXR0cnM7CisJdm9pZCAqb2xkX3NlY2RhdGE7CisJc2l6ZV90IG9sZF9zZWNkYXRhX2xlbjsKKworCWlhdHRycyA9IHNkLT5zX2lhdHRyOworCWlmICghaWF0dHJzKQorCQlpYXR0cnMgPSBzeXNmc19pbml0X2lub2RlX2F0dHJzKHNkKTsKKwlpZiAoIWlhdHRycykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlvbGRfc2VjZGF0YSA9IGlhdHRycy0+aWFfc2VjZGF0YTsKKwlvbGRfc2VjZGF0YV9sZW4gPSBpYXR0cnMtPmlhX3NlY2RhdGFfbGVuOworCisJaWF0dHJzLT5pYV9zZWNkYXRhID0gKnNlY2RhdGE7CisJaWF0dHJzLT5pYV9zZWNkYXRhX2xlbiA9ICpzZWNkYXRhX2xlbjsKKworCSpzZWNkYXRhID0gb2xkX3NlY2RhdGE7CisJKnNlY2RhdGFfbGVuID0gb2xkX3NlY2RhdGFfbGVuOworCXJldHVybiAwOworfQorCiBpbnQgc3lzZnNfc2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwKIAkJc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCA9IGRlbnRyeS0+ZF9mc2RhdGE7Ci0Jc3RydWN0IHN5c2ZzX2lub2RlX2F0dHJzICppYXR0cnM7CiAJdm9pZCAqc2VjZGF0YTsKIAlpbnQgZXJyb3I7CiAJdTMyIHNlY2RhdGFfbGVuID0gMDsKIAogCWlmICghc2QpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICghc2QtPnNfaWF0dHIpCi0JCXNkLT5zX2lhdHRyID0gc3lzZnNfaW5pdF9pbm9kZV9hdHRycyhzZCk7Ci0JaWYgKCFzZC0+c19pYXR0cikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpYXR0cnMgPSBzZC0+c19pYXR0cjsKIAogCWlmICghc3RybmNtcChuYW1lLCBYQVRUUl9TRUNVUklUWV9QUkVGSVgsIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWF9MRU4pKSB7CiAJCWNvbnN0IGNoYXIgKnN1ZmZpeCA9IG5hbWUgKyBYQVRUUl9TRUNVUklUWV9QUkVGSVhfTEVOOwpAQCAtMTUwLDEyICsxNzMsMTMgQEAKIAkJCQkJCSZzZWNkYXRhLCAmc2VjZGF0YV9sZW4pOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dDsKLQkJaWYgKGlhdHRycy0+aWFfc2VjZGF0YSkKLQkJCXNlY3VyaXR5X3JlbGVhc2Vfc2VjY3R4KGlhdHRycy0+aWFfc2VjZGF0YSwKLQkJCQkJCWlhdHRycy0+aWFfc2VjZGF0YV9sZW4pOwotCQlpYXR0cnMtPmlhX3NlY2RhdGEgPSBzZWNkYXRhOwotCQlpYXR0cnMtPmlhX3NlY2RhdGFfbGVuID0gc2VjZGF0YV9sZW47CiAKKwkJbXV0ZXhfbG9jaygmc3lzZnNfbXV0ZXgpOworCQllcnJvciA9IHN5c2ZzX3NkX3NldHNlY2RhdGEoc2QsICZzZWNkYXRhLCAmc2VjZGF0YV9sZW4pOworCQltdXRleF91bmxvY2soJnN5c2ZzX211dGV4KTsKKworCQlpZiAoc2VjZGF0YSkKKwkJCXNlY3VyaXR5X3JlbGVhc2Vfc2VjY3R4KHNlY2RhdGEsIHNlY2RhdGFfbGVuKTsKIAl9IGVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiBvdXQ6CkBAIC0xNzAsNyArMTk0LDYgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHNldF9pbm9kZV9hdHRyKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgaWF0dHIgKiBpYXR0cikKIHsKLQlpbm9kZS0+aV9tb2RlID0gaWF0dHItPmlhX21vZGU7CiAJaW5vZGUtPmlfdWlkID0gaWF0dHItPmlhX3VpZDsKIAlpbm9kZS0+aV9naWQgPSBpYXR0ci0+aWFfZ2lkOwogCWlub2RlLT5pX2F0aW1lID0gaWF0dHItPmlhX2F0aW1lOwpAQCAtMTc4LDE3ICsyMDEsNiBAQAogCWlub2RlLT5pX2N0aW1lID0gaWF0dHItPmlhX2N0aW1lOwogfQogCi0KLS8qCi0gKiBzeXNmcyBoYXMgYSBkaWZmZXJlbnQgaV9tdXRleCBsb2NrIG9yZGVyIGJlaGF2aW9yIGZvciBpX211dGV4IHRoYW4gb3RoZXIKLSAqIGZpbGVzeXN0ZW1zOyBzeXNmcyBpX211dGV4IGlzIGNhbGxlZCBpbiBtYW55IHBsYWNlcyB3aXRoIHN1YnN5c3RlbSBsb2NrcwotICogaGVsZC4gQXQgdGhlIHNhbWUgdGltZSwgbWFueSBvZiB0aGUgVkZTIGxvY2tpbmcgcnVsZXMgZG8gbm90IGFwcGx5IHRvCi0gKiBzeXNmcyBhdCBhbGwgKGNyb3NzIGRpcmVjdG9yeSByZW5hbWUgZm9yIGV4YW1wbGUpLiBUbyB1bnRhbmdsZSB0aGlzIG1lc3MKLSAqICh3aGljaCBnaXZlcyBmYWxzZSBwb3NpdGl2ZXMgaW4gbG9ja2RlcCksIHdlJ3JlIGdpdmluZyBzeXNmcyBpbm9kZXMgdGhlaXIKLSAqIG93biBjbGFzcyBmb3IgaV9tdXRleC4KLSAqLwotc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBzeXNmc19pbm9kZV9pbXV0ZXhfa2V5OwotCiBzdGF0aWMgaW50IHN5c2ZzX2NvdW50X25saW5rKHN0cnVjdCBzeXNmc19kaXJlbnQgKnNkKQogewogCXN0cnVjdCBzeXNmc19kaXJlbnQgKmNoaWxkOwpAQCAtMjAxLDM4ICsyMTMsNTUgQEAKIAlyZXR1cm4gbnIgKyAyOwogfQogCitzdGF0aWMgdm9pZCBzeXNmc19yZWZyZXNoX2lub2RlKHN0cnVjdCBzeXNmc19kaXJlbnQgKnNkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBzeXNmc19pbm9kZV9hdHRycyAqaWF0dHJzID0gc2QtPnNfaWF0dHI7CisKKwlpbm9kZS0+aV9tb2RlID0gc2QtPnNfbW9kZTsKKwlpZiAoaWF0dHJzKSB7CisJCS8qIHN5c2ZzX2RpcmVudCBoYXMgbm9uLWRlZmF1bHQgYXR0cmlidXRlcworCQkgKiBnZXQgdGhlbSBmcm9tIHBlcnNpc3RlbnQgY29weSBpbiBzeXNmc19kaXJlbnQKKwkJICovCisJCXNldF9pbm9kZV9hdHRyKGlub2RlLCAmaWF0dHJzLT5pYV9pYXR0cik7CisJCXNlY3VyaXR5X2lub2RlX25vdGlmeXNlY2N0eChpbm9kZSwKKwkJCQkJICAgIGlhdHRycy0+aWFfc2VjZGF0YSwKKwkJCQkJICAgIGlhdHRycy0+aWFfc2VjZGF0YV9sZW4pOworCX0KKworCWlmIChzeXNmc190eXBlKHNkKSA9PSBTWVNGU19ESVIpCisJCWlub2RlLT5pX25saW5rID0gc3lzZnNfY291bnRfbmxpbmsoc2QpOworfQorCitpbnQgc3lzZnNfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXQgKnN0YXQpCit7CisJc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QgPSBkZW50cnktPmRfZnNkYXRhOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisKKwltdXRleF9sb2NrKCZzeXNmc19tdXRleCk7CisJc3lzZnNfcmVmcmVzaF9pbm9kZShzZCwgaW5vZGUpOworCW11dGV4X3VubG9jaygmc3lzZnNfbXV0ZXgpOworCisJZ2VuZXJpY19maWxsYXR0cihpbm9kZSwgc3RhdCk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIHN5c2ZzX2luaXRfaW5vZGUoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyOwotCXN0cnVjdCBzeXNmc19pbm9kZV9hdHRycyAqaWF0dHJzOwogCiAJaW5vZGUtPmlfcHJpdmF0ZSA9IHN5c2ZzX2dldChzZCk7CiAJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmc3lzZnNfYW9wczsKIAlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJnN5c2ZzX2JhY2tpbmdfZGV2X2luZm87CiAJaW5vZGUtPmlfb3AgPSAmc3lzZnNfaW5vZGVfb3BlcmF0aW9uczsKLQlpbm9kZS0+aV9pbm8gPSBzZC0+c19pbm87Ci0JbG9ja2RlcF9zZXRfY2xhc3MoJmlub2RlLT5pX211dGV4LCAmc3lzZnNfaW5vZGVfaW11dGV4X2tleSk7CiAKLQlpYXR0cnMgPSBzZC0+c19pYXR0cjsKLQlpZiAoaWF0dHJzKSB7Ci0JCS8qIHN5c2ZzX2RpcmVudCBoYXMgbm9uLWRlZmF1bHQgYXR0cmlidXRlcwotCQkgKiBnZXQgdGhlbSBmb3IgdGhlIG5ldyBpbm9kZSBmcm9tIHBlcnNpc3RlbnQgY29weQotCQkgKiBpbiBzeXNmc19kaXJlbnQKLQkJICovCi0JCXNldF9pbm9kZV9hdHRyKGlub2RlLCAmaWF0dHJzLT5pYV9pYXR0cik7Ci0JCWlmIChpYXR0cnMtPmlhX3NlY2RhdGEpCi0JCQlzZWN1cml0eV9pbm9kZV9ub3RpZnlzZWNjdHgoaW5vZGUsCi0JCQkJCQlpYXR0cnMtPmlhX3NlY2RhdGEsCi0JCQkJCQlpYXR0cnMtPmlhX3NlY2RhdGFfbGVuKTsKLQl9IGVsc2UKLQkJc2V0X2RlZmF1bHRfaW5vZGVfYXR0cihpbm9kZSwgc2QtPnNfbW9kZSk7CisJc2V0X2RlZmF1bHRfaW5vZGVfYXR0cihpbm9kZSwgc2QtPnNfbW9kZSk7CisJc3lzZnNfcmVmcmVzaF9pbm9kZShzZCwgaW5vZGUpOwogCiAJLyogaW5pdGlhbGl6ZSBpbm9kZSBhY2NvcmRpbmcgdG8gdHlwZSAqLwogCXN3aXRjaCAoc3lzZnNfdHlwZShzZCkpIHsKIAljYXNlIFNZU0ZTX0RJUjoKIAkJaW5vZGUtPmlfb3AgPSAmc3lzZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX2ZvcCA9ICZzeXNmc19kaXJfb3BlcmF0aW9uczsKLQkJaW5vZGUtPmlfbmxpbmsgPSBzeXNmc19jb3VudF9ubGluayhzZCk7CiAJCWJyZWFrOwogCWNhc2UgU1lTRlNfS09CSl9BVFRSOgogCQlpbm9kZS0+aV9zaXplID0gUEFHRV9TSVpFOwpAQCAtMzE1LDMgKzM0NCwxNCBAQAogCWVsc2UKIAkJcmV0dXJuIC1FTk9FTlQ7CiB9CisKK2ludCBzeXNmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQoreworCXN0cnVjdCBzeXNmc19kaXJlbnQgKnNkID0gaW5vZGUtPmlfcHJpdmF0ZTsKKworCW11dGV4X2xvY2soJnN5c2ZzX211dGV4KTsKKwlzeXNmc19yZWZyZXNoX2lub2RlKHNkLCBpbm9kZSk7CisJbXV0ZXhfdW5sb2NrKCZzeXNmc19tdXRleCk7CisKKwlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL3N5bWxpbmsuYyBiL2ZzL3N5c2ZzL3N5bWxpbmsuYwppbmRleCBjNTA4MWFkLi5jNWVmZjQ5IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9zeW1saW5rLmMKKysrIGIvZnMvc3lzZnMvc3ltbGluay5jCkBAIC0yMTAsMTAgKzIxMCwxMyBAQAogfQogCiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzeXNmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7Ci0JLnNldHhhdHRyID0gc3lzZnNfc2V0eGF0dHIsCi0JLnJlYWRsaW5rID0gZ2VuZXJpY19yZWFkbGluaywKLQkuZm9sbG93X2xpbmsgPSBzeXNmc19mb2xsb3dfbGluaywKLQkucHV0X2xpbmsgPSBzeXNmc19wdXRfbGluaywKKwkuc2V0eGF0dHIJPSBzeXNmc19zZXR4YXR0ciwKKwkucmVhZGxpbmsJPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawk9IHN5c2ZzX2ZvbGxvd19saW5rLAorCS5wdXRfbGluawk9IHN5c2ZzX3B1dF9saW5rLAorCS5zZXRhdHRyCT0gc3lzZnNfc2V0YXR0ciwKKwkuZ2V0YXR0cgk9IHN5c2ZzX2dldGF0dHIsCisJLnBlcm1pc3Npb24JPSBzeXNmc19wZXJtaXNzaW9uLAogfTsKIAogCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9zeXNmcy5oIGIvZnMvc3lzZnMvc3lzZnMuaAppbmRleCBhZjRjNGU3Li5jYTUyZTdiIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9zeXNmcy5oCisrKyBiL2ZzL3N5c2ZzL3N5c2ZzLmgKQEAgLTg5LDkgKzg5LDcgQEAKICAqLwogc3RydWN0IHN5c2ZzX2FkZHJtX2N4dCB7CiAJc3RydWN0IHN5c2ZzX2RpcmVudAkqcGFyZW50X3NkOwotCXN0cnVjdCBpbm9kZQkJKnBhcmVudF9pbm9kZTsKIAlzdHJ1Y3Qgc3lzZnNfZGlyZW50CSpyZW1vdmVkOwotCWludAkJCWNudDsKIH07CiAKIC8qCkBAIC0xMDUsNyArMTAzLDYgQEAKICAqIGRpci5jCiAgKi8KIGV4dGVybiBzdHJ1Y3QgbXV0ZXggc3lzZnNfbXV0ZXg7Ci1leHRlcm4gc3RydWN0IG11dGV4IHN5c2ZzX3JlbmFtZV9tdXRleDsKIGV4dGVybiBzcGlubG9ja190IHN5c2ZzX2Fzc29jX2xvY2s7CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN5c2ZzX2Rpcl9vcGVyYXRpb25zOwpAQCAtMTMzLDYgKzEzMCw5IEBACiAJCQlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICoqcF9zZCk7CiB2b2lkIHN5c2ZzX3JlbW92ZV9zdWJkaXIoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QpOwogCitpbnQgc3lzZnNfcmVuYW1lKHN0cnVjdCBzeXNmc19kaXJlbnQgKnNkLAorCXN0cnVjdCBzeXNmc19kaXJlbnQgKm5ld19wYXJlbnRfc2QsIGNvbnN0IGNoYXIgKm5ld19uYW1lKTsKKwogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpfX3N5c2ZzX2dldChzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCkKIHsKIAlpZiAoc2QpIHsKQEAgLTE1NSw3ICsxNTUsMTAgQEAKICAqLwogc3RydWN0IGlub2RlICpzeXNmc19nZXRfaW5vZGUoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QpOwogdm9pZCBzeXNmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CitpbnQgc3lzZnNfc2Rfc2V0YXR0cihzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCwgc3RydWN0IGlhdHRyICppYXR0cik7CitpbnQgc3lzZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzayk7CiBpbnQgc3lzZnNfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqaWF0dHIpOworaW50IHN5c2ZzX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ICpzdGF0KTsKIGludCBzeXNmc19zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAogCQlzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKIGludCBzeXNmc19oYXNoX2FuZF9yZW1vdmUoc3RydWN0IHN5c2ZzX2RpcmVudCAqZGlyX3NkLCBjb25zdCBjaGFyICpuYW1lKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYwppbmRleCA3MGY5ODk4Li44NzgxM2U0IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jCkBAIC0yMzUsNzEgKzIzNSwzNiBAQAogfQogCiAvKgotICogQnVmZmVyZWQgSU8gd3JpdGUgY29tcGxldGlvbiBmb3IgZGVsYXllZCBhbGxvY2F0ZSBleHRlbnRzLgorICogSU8gd3JpdGUgY29tcGxldGlvbi4KICAqLwogU1RBVElDIHZvaWQKLXhmc19lbmRfYmlvX2RlbGFsbG9jKAotCXN0cnVjdCB3b3JrX3N0cnVjdAkqd29yaykKLXsKLQl4ZnNfaW9lbmRfdAkJKmlvZW5kID0KLQkJY29udGFpbmVyX29mKHdvcmssIHhmc19pb2VuZF90LCBpb193b3JrKTsKLQotCXhmc19zZXRmaWxlc2l6ZShpb2VuZCk7Ci0JeGZzX2Rlc3Ryb3lfaW9lbmQoaW9lbmQpOwotfQotCi0vKgotICogQnVmZmVyZWQgSU8gd3JpdGUgY29tcGxldGlvbiBmb3IgcmVndWxhciwgd3JpdHRlbiBleHRlbnRzLgotICovCi1TVEFUSUMgdm9pZAoteGZzX2VuZF9iaW9fd3JpdHRlbigKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJKndvcmspCi17Ci0JeGZzX2lvZW5kX3QJCSppb2VuZCA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCB4ZnNfaW9lbmRfdCwgaW9fd29yayk7Ci0KLQl4ZnNfc2V0ZmlsZXNpemUoaW9lbmQpOwotCXhmc19kZXN0cm95X2lvZW5kKGlvZW5kKTsKLX0KLQotLyoKLSAqIElPIHdyaXRlIGNvbXBsZXRpb24gZm9yIHVud3JpdHRlbiBleHRlbnRzLgotICoKLSAqIElzc3VlIHRyYW5zYWN0aW9ucyB0byBjb252ZXJ0IGEgYnVmZmVyIHJhbmdlIGZyb20gdW53cml0dGVuCi0gKiB0byB3cml0dGVuIGV4dGVudHMuCi0gKi8KLVNUQVRJQyB2b2lkCi14ZnNfZW5kX2Jpb191bndyaXR0ZW4oCit4ZnNfZW5kX2lvKAogCXN0cnVjdCB3b3JrX3N0cnVjdAkqd29yaykKIHsKIAl4ZnNfaW9lbmRfdAkJKmlvZW5kID0KIAkJY29udGFpbmVyX29mKHdvcmssIHhmc19pb2VuZF90LCBpb193b3JrKTsKIAlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IFhGU19JKGlvZW5kLT5pb19pbm9kZSk7Ci0JeGZzX29mZl90CQlvZmZzZXQgPSBpb2VuZC0+aW9fb2Zmc2V0OwotCXNpemVfdAkJCXNpemUgPSBpb2VuZC0+aW9fc2l6ZTsKIAotCWlmIChsaWtlbHkoIWlvZW5kLT5pb19lcnJvcikpIHsKLQkJaWYgKCFYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSkgewotCQkJaW50IGVycm9yOwotCQkJZXJyb3IgPSB4ZnNfaW9tYXBfd3JpdGVfdW53cml0dGVuKGlwLCBvZmZzZXQsIHNpemUpOwotCQkJaWYgKGVycm9yKQotCQkJCWlvZW5kLT5pb19lcnJvciA9IGVycm9yOwotCQl9Ci0JCXhmc19zZXRmaWxlc2l6ZShpb2VuZCk7CisJLyoKKwkgKiBGb3IgdW53cml0dGVuIGV4dGVudHMgd2UgbmVlZCB0byBpc3N1ZSB0cmFuc2FjdGlvbnMgdG8gY29udmVydCBhCisJICogcmFuZ2UgdG8gbm9ybWFsIHdyaXR0ZW4gZXh0ZW5zIGFmdGVyIHRoZSBkYXRhIEkvTyBoYXMgZmluaXNoZWQuCisJICovCisJaWYgKGlvZW5kLT5pb190eXBlID09IElPTUFQX1VOV1JJVFRFTiAmJgorCSAgICBsaWtlbHkoIWlvZW5kLT5pb19lcnJvciAmJiAhWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkpKSB7CisJCWludCBlcnJvcjsKKworCQllcnJvciA9IHhmc19pb21hcF93cml0ZV91bndyaXR0ZW4oaXAsIGlvZW5kLT5pb19vZmZzZXQsCisJCQkJCQkgaW9lbmQtPmlvX3NpemUpOworCQlpZiAoZXJyb3IpCisJCQlpb2VuZC0+aW9fZXJyb3IgPSBlcnJvcjsKIAl9Ci0JeGZzX2Rlc3Ryb3lfaW9lbmQoaW9lbmQpOwotfQogCi0vKgotICogSU8gcmVhZCBjb21wbGV0aW9uIGZvciByZWd1bGFyLCB3cml0dGVuIGV4dGVudHMuCi0gKi8KLVNUQVRJQyB2b2lkCi14ZnNfZW5kX2Jpb19yZWFkKAotCXN0cnVjdCB3b3JrX3N0cnVjdAkqd29yaykKLXsKLQl4ZnNfaW9lbmRfdAkJKmlvZW5kID0KLQkJY29udGFpbmVyX29mKHdvcmssIHhmc19pb2VuZF90LCBpb193b3JrKTsKLQorCS8qCisJICogV2UgbWlnaHQgaGF2ZSB0byB1cGRhdGUgdGhlIG9uLWRpc2sgZmlsZSBzaXplIGFmdGVyIGV4dGVuZGluZworCSAqIHdyaXRlcy4KKwkgKi8KKwlpZiAoaW9lbmQtPmlvX3R5cGUgIT0gSU9NQVBfUkVBRCkKKwkJeGZzX3NldGZpbGVzaXplKGlvZW5kKTsKIAl4ZnNfZGVzdHJveV9pb2VuZChpb2VuZCk7CiB9CiAKQEAgLTMxNCwxMCArMjc5LDEwIEBACiAJaW50CQl3YWl0KQogewogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZpb2VuZC0+aW9fcmVtYWluaW5nKSkgewotCQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EgPSB4ZnNkYXRhZF93b3JrcXVldWU7Ci0JCWlmIChpb2VuZC0+aW9fd29yay5mdW5jID09IHhmc19lbmRfYmlvX3Vud3JpdHRlbikKLQkJCXdxID0geGZzY29udmVydGRfd29ya3F1ZXVlOworCQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7CiAKKwkJd3EgPSAoaW9lbmQtPmlvX3R5cGUgPT0gSU9NQVBfVU5XUklUVEVOKSA/CisJCQl4ZnNjb252ZXJ0ZF93b3JrcXVldWUgOiB4ZnNkYXRhZF93b3JrcXVldWU7CiAJCXF1ZXVlX3dvcmsod3EsICZpb2VuZC0+aW9fd29yayk7CiAJCWlmICh3YWl0KQogCQkJZmx1c2hfd29ya3F1ZXVlKHdxKTsKQEAgLTM1NSwxNSArMzIwLDcgQEAKIAlpb2VuZC0+aW9fb2Zmc2V0ID0gMDsKIAlpb2VuZC0+aW9fc2l6ZSA9IDA7CiAKLQlpZiAodHlwZSA9PSBJT01BUF9VTldSSVRURU4pCi0JCUlOSVRfV09SSygmaW9lbmQtPmlvX3dvcmssIHhmc19lbmRfYmlvX3Vud3JpdHRlbik7Ci0JZWxzZSBpZiAodHlwZSA9PSBJT01BUF9ERUxBWSkKLQkJSU5JVF9XT1JLKCZpb2VuZC0+aW9fd29yaywgeGZzX2VuZF9iaW9fZGVsYWxsb2MpOwotCWVsc2UgaWYgKHR5cGUgPT0gSU9NQVBfUkVBRCkKLQkJSU5JVF9XT1JLKCZpb2VuZC0+aW9fd29yaywgeGZzX2VuZF9iaW9fcmVhZCk7Ci0JZWxzZQotCQlJTklUX1dPUksoJmlvZW5kLT5pb193b3JrLCB4ZnNfZW5kX2Jpb193cml0dGVuKTsKLQorCUlOSVRfV09SSygmaW9lbmQtPmlvX3dvcmssIHhmc19lbmRfaW8pOwogCXJldHVybiBpb2VuZDsKIH0KIApAQCAtMzgwLDcgKzMzNyw3IEBACiAJcmV0dXJuIC14ZnNfaW9tYXAoWEZTX0koaW5vZGUpLCBvZmZzZXQsIGNvdW50LCBmbGFncywgbWFwcCwgJm5tYXBzKTsKIH0KIAotU1RBVElDX0lOTElORSBpbnQKK1NUQVRJQyBpbnQKIHhmc19pb21hcF92YWxpZCgKIAl4ZnNfaW9tYXBfdAkJKmlvbWFwcCwKIAlsb2ZmX3QJCQlvZmZzZXQpCkBAIC00MTIsOCArMzY5LDkgQEAKIAogU1RBVElDIHZvaWQKIHhmc19zdWJtaXRfaW9lbmRfYmlvKAotCXhmc19pb2VuZF90CSppb2VuZCwKLQlzdHJ1Y3QgYmlvCSpiaW8pCisJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsCisJeGZzX2lvZW5kX3QJCSppb2VuZCwKKwlzdHJ1Y3QgYmlvCQkqYmlvKQogewogCWF0b21pY19pbmMoJmlvZW5kLT5pb19yZW1haW5pbmcpOwogCWJpby0+YmlfcHJpdmF0ZSA9IGlvZW5kOwpAQCAtNDI2LDcgKzM4NCw4IEBACiAJaWYgKHhmc19pb2VuZF9uZXdfZW9mKGlvZW5kKSkKIAkJeGZzX21hcmtfaW5vZGVfZGlydHlfc3luYyhYRlNfSShpb2VuZC0+aW9faW5vZGUpKTsKIAotCXN1Ym1pdF9iaW8oV1JJVEUsIGJpbyk7CisJc3VibWl0X2Jpbyh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCA/CisJCSAgIFdSSVRFX1NZTkNfUExVRyA6IFdSSVRFLCBiaW8pOwogCUFTU0VSVCghYmlvX2ZsYWdnZWQoYmlvLCBCSU9fRU9QTk9UU1VQUCkpOwogCWJpb19wdXQoYmlvKTsKIH0KQEAgLTUwNSw2ICs0NjQsNyBAQAogICovCiBTVEFUSUMgdm9pZAogeGZzX3N1Ym1pdF9pb2VuZCgKKwlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywKIAl4ZnNfaW9lbmRfdAkJKmlvZW5kKQogewogCXhmc19pb2VuZF90CQkqaGVhZCA9IGlvZW5kOwpAQCAtNTMzLDE5ICs0OTMsMTkgQEAKICByZXRyeToKIAkJCQliaW8gPSB4ZnNfYWxsb2NfaW9lbmRfYmlvKGJoKTsKIAkJCX0gZWxzZSBpZiAoYmgtPmJfYmxvY2tuciAhPSBsYXN0YmxvY2sgKyAxKSB7Ci0JCQkJeGZzX3N1Ym1pdF9pb2VuZF9iaW8oaW9lbmQsIGJpbyk7CisJCQkJeGZzX3N1Ym1pdF9pb2VuZF9iaW8od2JjLCBpb2VuZCwgYmlvKTsKIAkJCQlnb3RvIHJldHJ5OwogCQkJfQogCiAJCQlpZiAoYmlvX2FkZF9idWZmZXIoYmlvLCBiaCkgIT0gYmgtPmJfc2l6ZSkgewotCQkJCXhmc19zdWJtaXRfaW9lbmRfYmlvKGlvZW5kLCBiaW8pOworCQkJCXhmc19zdWJtaXRfaW9lbmRfYmlvKHdiYywgaW9lbmQsIGJpbyk7CiAJCQkJZ290byByZXRyeTsKIAkJCX0KIAogCQkJbGFzdGJsb2NrID0gYmgtPmJfYmxvY2tucjsKIAkJfQogCQlpZiAoYmlvKQotCQkJeGZzX3N1Ym1pdF9pb2VuZF9iaW8oaW9lbmQsIGJpbyk7CisJCQl4ZnNfc3VibWl0X2lvZW5kX2Jpbyh3YmMsIGlvZW5kLCBiaW8pOwogCQl4ZnNfZmluaXNoX2lvZW5kKGlvZW5kLCAwKTsKIAl9IHdoaWxlICgoaW9lbmQgPSBuZXh0KSAhPSBOVUxMKTsKIH0KQEAgLTExOTEsNyArMTE1MSw3IEBACiAJfQogCiAJaWYgKGlvaGVhZCkKLQkJeGZzX3N1Ym1pdF9pb2VuZChpb2hlYWQpOworCQl4ZnNfc3VibWl0X2lvZW5kKHdiYywgaW9oZWFkKTsKIAogCXJldHVybiBwYWdlX2RpcnR5OwogCkBAIC0xNTI4LDcgKzE0ODgsNyBAQAogCQkgKiBkaWRuJ3QgbWFwIGFuIHVud3JpdHRlbiBleHRlbnQgc28gc3dpdGNoIGl0J3MgY29tcGxldGlvbgogCQkgKiBoYW5kbGVyLgogCQkgKi8KLQkJSU5JVF9XT1JLKCZpb2VuZC0+aW9fd29yaywgeGZzX2VuZF9iaW9fd3JpdHRlbik7CisJCWlvZW5kLT5pb190eXBlID0gSU9NQVBfTkVXOwogCQl4ZnNfZmluaXNoX2lvZW5kKGlvZW5kLCAwKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKaW5kZXggOTY1ZGYxMi4uNGRkYzk3MyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKQEAgLTE0OSw3ICsxNDksNyBAQAogCXJldHVybiBtYXNrOwogfQogCi1TVEFUSUNfSU5MSU5FIHZvaWQKK1NUQVRJQyB2b2lkCiBzZXRfcGFnZV9yZWdpb24oCiAJc3RydWN0IHBhZ2UJKnBhZ2UsCiAJc2l6ZV90CQlvZmZzZXQsCkBAIC0xNjEsNyArMTYxLDcgQEAKIAkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwogfQogCi1TVEFUSUNfSU5MSU5FIGludAorU1RBVElDIGludAogdGVzdF9wYWdlX3JlZ2lvbigKIAlzdHJ1Y3QgcGFnZQkqcGFnZSwKIAlzaXplX3QJCW9mZnNldCwKQEAgLTU4Miw3ICs1ODIsNyBAQAogICoJYWx0aG91Z2ggYmFja2luZyBzdG9yYWdlIG1heSBub3QgYmUuCiAgKi8KIHhmc19idWZfdCAqCi14ZnNfYnVmX2dldF9mbGFncygKK3hmc19idWZfZ2V0KAogCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQsLyogdGFyZ2V0IGZvciBidWZmZXIJCSovCiAJeGZzX29mZl90CQlpb2ZmLAkvKiBzdGFydGluZyBvZmZzZXQgb2YgcmFuZ2UJKi8KIAlzaXplX3QJCQlpc2l6ZSwJLyogbGVuZ3RoIG9mIHJhbmdlCQkqLwpAQCAtNjYxLDcgKzY2MSw3IEBACiB9CiAKIHhmc19idWZfdCAqCi14ZnNfYnVmX3JlYWRfZmxhZ3MoCit4ZnNfYnVmX3JlYWQoCiAJeGZzX2J1ZnRhcmdfdAkJKnRhcmdldCwKIAl4ZnNfb2ZmX3QJCWlvZmYsCiAJc2l6ZV90CQkJaXNpemUsCkBAIC02NzEsNyArNjcxLDcgQEAKIAogCWZsYWdzIHw9IFhCRl9SRUFEOwogCi0JYnAgPSB4ZnNfYnVmX2dldF9mbGFncyh0YXJnZXQsIGlvZmYsIGlzaXplLCBmbGFncyk7CisJYnAgPSB4ZnNfYnVmX2dldCh0YXJnZXQsIGlvZmYsIGlzaXplLCBmbGFncyk7CiAJaWYgKGJwKSB7CiAJCWlmICghWEZTX0JVRl9JU0RPTkUoYnApKSB7CiAJCQlYQl9UUkFDRShicCwgInJlYWQiLCAodW5zaWduZWQgbG9uZylmbGFncyk7CkBAIC03MTgsNyArNzE4LDcgQEAKIAkJcmV0dXJuOwogCiAJZmxhZ3MgfD0gKFhCRl9UUllMT0NLfFhCRl9BU1lOQ3xYQkZfUkVBRF9BSEVBRCk7Ci0JeGZzX2J1Zl9yZWFkX2ZsYWdzKHRhcmdldCwgaW9mZiwgaXNpemUsIGZsYWdzKTsKKwl4ZnNfYnVmX3JlYWQodGFyZ2V0LCBpb2ZmLCBpc2l6ZSwgZmxhZ3MpOwogfQogCiB4ZnNfYnVmX3QgKgpAQCAtMTExMyw3ICsxMTEzLDcgQEAKIAl4ZnNfYnVmX2RlbHdyaV9xdWV1ZShicCwgMSk7CiB9CiAKLVNUQVRJQ19JTkxJTkUgdm9pZAorU1RBVElDIHZvaWQKIF94ZnNfYnVmX2lvZW5kKAogCXhmc19idWZfdAkJKmJwLAogCWludAkJCXNjaGVkdWxlKQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuaAppbmRleCA5YjRkNjY2Li41ZjA3ZGQ5IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuaApAQCAtMTg2LDE1ICsxODYsMTAgQEAKICNkZWZpbmUgeGZzX2luY29yZShidWZ0YXJnLGJsa25vLGxlbixsb2NraXQpIFwKIAlfeGZzX2J1Zl9maW5kKGJ1ZnRhcmcsIGJsa25vICxsZW4sIGxvY2tpdCwgTlVMTCkKIAotZXh0ZXJuIHhmc19idWZfdCAqeGZzX2J1Zl9nZXRfZmxhZ3MoeGZzX2J1ZnRhcmdfdCAqLCB4ZnNfb2ZmX3QsIHNpemVfdCwKK2V4dGVybiB4ZnNfYnVmX3QgKnhmc19idWZfZ2V0KHhmc19idWZ0YXJnX3QgKiwgeGZzX29mZl90LCBzaXplX3QsCiAJCQkJeGZzX2J1Zl9mbGFnc190KTsKLSNkZWZpbmUgeGZzX2J1Zl9nZXQodGFyZ2V0LCBibGtubywgbGVuLCBmbGFncykgXAotCXhmc19idWZfZ2V0X2ZsYWdzKCh0YXJnZXQpLCAoYmxrbm8pLCAobGVuKSwgWEJGX0xPQ0sgfCBYQkZfTUFQUEVEKQotCi1leHRlcm4geGZzX2J1Zl90ICp4ZnNfYnVmX3JlYWRfZmxhZ3MoeGZzX2J1ZnRhcmdfdCAqLCB4ZnNfb2ZmX3QsIHNpemVfdCwKK2V4dGVybiB4ZnNfYnVmX3QgKnhmc19idWZfcmVhZCh4ZnNfYnVmdGFyZ190ICosIHhmc19vZmZfdCwgc2l6ZV90LAogCQkJCXhmc19idWZfZmxhZ3NfdCk7Ci0jZGVmaW5lIHhmc19idWZfcmVhZCh0YXJnZXQsIGJsa25vLCBsZW4sIGZsYWdzKSBcCi0JeGZzX2J1Zl9yZWFkX2ZsYWdzKCh0YXJnZXQpLCAoYmxrbm8pLCAobGVuKSwgWEJGX0xPQ0sgfCBYQkZfTUFQUEVEKQogCiBleHRlcm4geGZzX2J1Zl90ICp4ZnNfYnVmX2dldF9lbXB0eShzaXplX3QsIHhmc19idWZ0YXJnX3QgKik7CiBleHRlcm4geGZzX2J1Zl90ICp4ZnNfYnVmX2dldF9ub2FkZHIoc2l6ZV90LCB4ZnNfYnVmdGFyZ190ICopOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jCmluZGV4IGVmZjYxZTIuLmU0Y2FlYjIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAlsb2ZmX3QJCQlwb3MpCiB7CiAJc3RydWN0IGZpbGUJCSpmaWxlID0gaW9jYi0+a2lfZmlscDsKLQlpbnQJCQlpb2ZsYWdzID0gSU9fSVNBSU87CisJaW50CQkJaW9mbGFncyA9IDA7CiAKIAlCVUdfT04oaW9jYi0+a2lfcG9zICE9IHBvcyk7CiAJaWYgKHVubGlrZWx5KGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkpCkBAIC03MSw3ICs3MSw3IEBACiAJbG9mZl90CQkJcG9zKQogewogCXN0cnVjdCBmaWxlCQkqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7Ci0JaW50CQkJaW9mbGFncyA9IElPX0lTQUlPOworCWludAkJCWlvZmxhZ3MgPSAwOwogCiAJQlVHX09OKGlvY2ItPmtpX3BvcyAhPSBwb3MpOwogCWlmICh1bmxpa2VseShmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpKQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jCmluZGV4IGNkNDJlZjcuLjFmM2I0YjggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMKQEAgLTU3Myw4ICs1NzMsOCBAQAogCWJmLmxfbGVuID0gbGVuOwogCiAJeGZzX2lsb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOwotCWVycm9yID0geGZzX2NoYW5nZV9maWxlX3NwYWNlKGlwLCBYRlNfSU9DX1JFU1ZTUCwgJmJmLAotCQkJCSAgICAgIDAsIFhGU19BVFRSX05PTE9DSyk7CisJZXJyb3IgPSAteGZzX2NoYW5nZV9maWxlX3NwYWNlKGlwLCBYRlNfSU9DX1JFU1ZTUCwgJmJmLAorCQkJCSAgICAgICAwLCBYRlNfQVRUUl9OT0xPQ0spOwogCWlmICghZXJyb3IgJiYgIShtb2RlICYgRkFMTE9DX0ZMX0tFRVBfU0laRSkgJiYKIAkgICAgb2Zmc2V0ICsgbGVuID4gaV9zaXplX3JlYWQoaW5vZGUpKQogCQluZXdfc2l6ZSA9IG9mZnNldCArIGxlbjsKQEAgLTU4NSw3ICs1ODUsNyBAQAogCiAJCWlhdHRyLmlhX3ZhbGlkID0gQVRUUl9TSVpFOwogCQlpYXR0ci5pYV9zaXplID0gbmV3X3NpemU7Ci0JCWVycm9yID0geGZzX3NldGF0dHIoaXAsICZpYXR0ciwgWEZTX0FUVFJfTk9MT0NLKTsKKwkJZXJyb3IgPSAteGZzX3NldGF0dHIoaXAsICZpYXR0ciwgWEZTX0FUVFJfTk9MT0NLKTsKIAl9CiAKIAl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMKaW5kZXggMDcyMDUwZi4uMWJmNDdmMiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMKQEAgLTI1NSw4ICsyNTUsNiBAQAogCiAJaW9jYi0+a2lfcG9zID0gKm9mZnNldDsKIAlyZXQgPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQoaW9jYiwgaW92cCwgc2VncywgKm9mZnNldCk7Ci0JaWYgKHJldCA9PSAtRUlPQ0JRVUVVRUQgJiYgIShpb2ZsYWdzICYgSU9fSVNBSU8pKQotCQlyZXQgPSB3YWl0X29uX3N5bmNfa2lvY2IoaW9jYik7CiAJaWYgKHJldCA+IDApCiAJCVhGU19TVEFUU19BREQoeHNfcmVhZF9ieXRlcywgcmV0KTsKIApAQCAtNzc0LDkgKzc3Miw2IEBACiAKIAljdXJyZW50LT5iYWNraW5nX2Rldl9pbmZvID0gTlVMTDsKIAotCWlmIChyZXQgPT0gLUVJT0NCUVVFVUVEICYmICEoaW9mbGFncyAmIElPX0lTQUlPKSkKLQkJcmV0ID0gd2FpdF9vbl9zeW5jX2tpb2NiKGlvY2IpOwotCiAJaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJaWYgKHVubGlrZWx5KHJldCA8IDAgJiYgcmV0ICE9IC1FRkFVTFQgJiYgKm9mZnNldCA+IGlzaXplKSkKIAkJKm9mZnNldCA9IGlzaXplOwpAQCAtODExLDcgKzgwNiw3IEBACiAJWEZTX1NUQVRTX0FERCh4c193cml0ZV9ieXRlcywgcmV0KTsKIAogCS8qIEhhbmRsZSB2YXJpb3VzIFNZTkMtdHlwZSB3cml0ZXMgKi8KLQlpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX1NZTkMpIHx8IElTX1NZTkMoaW5vZGUpKSB7CisJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19EU1lOQykgfHwgSVNfU1lOQyhpbm9kZSkpIHsKIAkJbG9mZl90IGVuZCA9IHBvcyArIHJldCAtIDE7CiAJCWludCBlcnJvcjI7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCmluZGV4IDE4YTRiOGUuLjFiZmIwZTkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwpAQCAtOTMwLDEzICs5MzAsMzkgQEAKICAqLwogU1RBVElDIHZvaWQKIHhmc19mc19kZXN0cm95X2lub2RlKAotCXN0cnVjdCBpbm9kZQkqaW5vZGUpCisJc3RydWN0IGlub2RlCQkqaW5vZGUpCiB7Ci0JeGZzX2lub2RlX3QJCSppcCA9IFhGU19JKGlub2RlKTsKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IFhGU19JKGlub2RlKTsKKworCXhmc19pdHJhY2VfZW50cnkoaXApOwogCiAJWEZTX1NUQVRTX0lOQyh2bl9yZWNsYWltKTsKLQlpZiAoeGZzX3JlY2xhaW0oaXApKQotCQlwYW5pYygiJXM6IGNhbm5vdCByZWNsYWltIDB4JXBcbiIsIF9fZnVuY19fLCBpbm9kZSk7CisKKwkvKiBiYWQgaW5vZGUsIGdldCBvdXQgaGVyZSBBU0FQICovCisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCisJCWdvdG8gb3V0X3JlY2xhaW07CisKKwl4ZnNfaW9lbmRfd2FpdChpcCk7CisKKwlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkgfHwgaXAtPmlfZGVsYXllZF9ibGtzID09IDApOworCisJLyoKKwkgKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgd2l0aCBvbmUgb2YgdGhlIHJlY2xhaW0gZmxhZ3MgYWxyZWFkeSBzZXQuCisJICovCisJQVNTRVJUX0FMV0FZUygheGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfSVJFQ0xBSU1BQkxFKSk7CisJQVNTRVJUX0FMV0FZUygheGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfSVJFQ0xBSU0pKTsKKworCS8qCisJICogSWYgd2UgaGF2ZSBub3RoaW5nIHRvIGZsdXNoIHdpdGggdGhpcyBpbm9kZSB0aGVuIGNvbXBsZXRlIHRoZQorCSAqIHRlYXJkb3duIG5vdywgb3RoZXJ3aXNlIGRlbGF5IHRoZSBmbHVzaCBvcGVyYXRpb24uCisJICovCisJaWYgKCF4ZnNfaW5vZGVfY2xlYW4oaXApKSB7CisJCXhmc19pbm9kZV9zZXRfcmVjbGFpbV90YWcoaXApOworCQlyZXR1cm47CisJfQorCitvdXRfcmVjbGFpbToKKwl4ZnNfaXJlY2xhaW0oaXApOwogfQogCiAvKgpAQCAtOTczLDcgKzk5OSw2IEBACiAKIAltcmxvY2tfaW5pdCgmaXAtPmlfbG9jaywgTVJMT0NLX0FMTE9XX0VRVUFMX1BSSXxNUkxPQ0tfQkFSUklFUiwKIAkJICAgICAieGZzaW5vIiwgaXAtPmlfaW5vKTsKLQltcmxvY2tfaW5pdCgmaXAtPmlfaW9sb2NrLCBNUkxPQ0tfQkFSUklFUiwgInhmc2lvIiwgaXAtPmlfaW5vKTsKIH0KIAogLyoKQEAgLTEwNzUsNiArMTEwMCwyMCBAQAogCVhGU19TVEFUU19JTkModm5fcmVtb3ZlKTsKIAlYRlNfU1RBVFNfREVDKHZuX2FjdGl2ZSk7CiAKKwkvKgorCSAqIFRoZSBpb2xvY2sgaXMgdXNlZCBieSB0aGUgZmlsZSBzeXN0ZW0gdG8gY29vcmRpbmF0ZSByZWFkcywKKwkgKiB3cml0ZXMsIGFuZCBibG9jayB0cnVuY2F0ZXMuICBVcCB0byB0aGlzIHBvaW50IHRoZSBsb2NrCisJICogcHJvdGVjdGVkIGNvbmN1cnJlbnQgYWNjZXNzZXMgYnkgdXNlcnMgb2YgdGhlIGlub2RlLiAgQnV0CisJICogZnJvbSBoZXJlIGZvcndhcmQgd2UncmUgZG9pbmcgc29tZSBmaW5hbCBwcm9jZXNzaW5nIG9mIHRoZQorCSAqIGlub2RlIGJlY2F1c2Ugd2UncmUgZG9uZSB3aXRoIGl0LCBhbmQgYWx0aG91Z2ggd2UgcmV1c2UgdGhlCisJICogaW9sb2NrIGZvciBwcm90ZWN0aW9uIGl0IGlzIHJlYWxseSBhIGRpc3RpbmN0IGxvY2sgY2xhc3MKKwkgKiAoaW4gdGhlIGxvY2tkZXAgc2Vuc2UpIGZyb20gYmVmb3JlLiAgVG8ga2VlcCBsb2NrZGVwIGhhcHB5CisJICogKGFuZCBiYXNpY2FsbHkgaW5kaWNhdGUgd2hhdCB3ZSBhcmUgZG9pbmcpLCB3ZSBleHBsaWNpdGx5CisJICogcmUtaW5pdCB0aGUgaW9sb2NrIGhlcmUuCisJICovCisJQVNTRVJUKCFyd3NlbV9pc19sb2NrZWQoJmlwLT5pX2lvbG9jay5tcl9sb2NrKSk7CisJbXJsb2NrX2luaXQoJmlwLT5pX2lvbG9jaywgTVJMT0NLX0JBUlJJRVIsICJ4ZnNpbyIsIGlwLT5pX2lubyk7CisKIAl4ZnNfaW5hY3RpdmUoaXApOwogfQogCkBAIC0xMDkyLDggKzExMzEsNiBAQAogCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IpCiB7CiAJc3RydWN0IHhmc19tb3VudAkqbXAgPSBYRlNfTShzYik7Ci0Jc3RydWN0IHhmc19pbm9kZQkqcmlwID0gbXAtPm1fcm9vdGlwOwotCWludAkJCXVubW91bnRfZXZlbnRfZmxhZ3MgPSAwOwogCiAJeGZzX3N5bmNkX3N0b3AobXApOwogCkBAIC0xMTA5LDIwICsxMTQ2LDcgQEAKIAkJeGZzX3N5bmNfYXR0cihtcCwgMCk7CiAJfQogCi0jaWZkZWYgSEFWRV9ETUFQSQotCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9ETUFQSSkgewotCQl1bm1vdW50X2V2ZW50X2ZsYWdzID0KLQkJCShtcC0+bV9kbWV2bWFzayAmICgxIDw8IERNX0VWRU5UX1VOTU9VTlQpKSA/Ci0JCQkJMCA6IERNX0ZMQUdTX1VOV0FOVEVEOwotCQkvKgotCQkgKiBJZ25vcmUgZXJyb3IgZnJvbSBkbWFwaSBoZXJlLCBmaXJzdCB1bm1vdW50IGlzIG5vdCBhbGxvd2VkCi0JCSAqIHRvIGZhaWwgYW55d2F5LCBhbmQgc2Vjb25kIHdlIHdvdWxkbid0IHdhbnQgdG8gZmFpbCBhCi0JCSAqIHVubW91bnQgYmVjYXVzZSBvZiBkbWFwaS4KLQkJICovCi0JCVhGU19TRU5EX1BSRVVOTU9VTlQobXAsIHJpcCwgRE1fUklHSFRfTlVMTCwgcmlwLCBETV9SSUdIVF9OVUxMLAotCQkJCU5VTEwsIE5VTEwsIDAsIDAsIHVubW91bnRfZXZlbnRfZmxhZ3MpOwotCX0KLSNlbmRpZgorCVhGU19TRU5EX1BSRVVOTU9VTlQobXApOwogCiAJLyoKIAkgKiBCbG93IGF3YXkgYW55IHJlZmVyZW5jZWQgaW5vZGUgaW4gdGhlIGZpbGVzdHJlYW1zIGNhY2hlLgpAQCAtMTEzMywxMCArMTE1Nyw3IEBACiAKIAlYRlNfYmZsdXNoKG1wLT5tX2RkZXZfdGFyZ3ApOwogCi0JaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0RNQVBJKSB7Ci0JCVhGU19TRU5EX1VOTU9VTlQobXAsIHJpcCwgRE1fUklHSFRfTlVMTCwgMCwgMCwKLQkJCQl1bm1vdW50X2V2ZW50X2ZsYWdzKTsKLQl9CisJWEZTX1NFTkRfVU5NT1VOVChtcCk7CiAKIAl4ZnNfdW5tb3VudGZzKG1wKTsKIAl4ZnNfZnJlZXNiKG1wKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5bmMuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5bmMuYwppbmRleCA5NjFkZjBhLi5kODk1YTNhIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zeW5jLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3luYy5jCkBAIC02NjMsMTAgKzY2Myw5IEBACiAJa3RocmVhZF9zdG9wKG1wLT5tX3N5bmNfdGFzayk7CiB9CiAKLWludAorU1RBVElDIGludAogeGZzX3JlY2xhaW1faW5vZGUoCiAJeGZzX2lub2RlX3QJKmlwLAotCWludAkJbG9ja2VkLAogCWludAkJc3luY19tb2RlKQogewogCXhmc19wZXJhZ190CSpwYWcgPSB4ZnNfZ2V0X3BlcmFnKGlwLT5pX21vdW50LCBpcC0+aV9pbm8pOwpAQCAtNjgyLDEwICs2ODEsNiBAQAogCSAgICAhX194ZnNfaWZsYWdzX3Rlc3QoaXAsIFhGU19JUkVDTEFJTUFCTEUpKSB7CiAJCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKIAkJd3JpdGVfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7Ci0JCWlmIChsb2NrZWQpIHsKLQkJCXhmc19pZnVubG9jayhpcCk7Ci0JCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQl9CiAJCXJldHVybiAtRUFHQUlOOwogCX0KIAlfX3hmc19pZmxhZ3Nfc2V0KGlwLCBYRlNfSVJFQ0xBSU0pOwpAQCAtNzA0LDEwICs2OTksOCBAQAogCSAqIFdlIGdldCB0aGUgZmx1c2ggbG9jayByZWdhcmRsZXNzLCB0aG91Z2gsIGp1c3QgdG8gbWFrZSBzdXJlCiAJICogd2UgZG9uJ3QgZnJlZSBpdCB3aGlsZSBpdCBpcyBiZWluZyBmbHVzaGVkLgogCSAqLwotCWlmICghbG9ja2VkKSB7Ci0JCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQl4ZnNfaWZsb2NrKGlwKTsKLQl9CisJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX2lmbG9jayhpcCk7CiAKIAkvKgogCSAqIEluIHRoZSBjYXNlIG9mIGEgZm9yY2VkIHNodXRkb3duIHdlIHJlbHkgb24geGZzX2lmbHVzaCgpIHRvCkBAIC03NzgsNyArNzcxLDcgQEAKIAl9CiAJcmVhZF91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKIAotCXJldHVybiB4ZnNfcmVjbGFpbV9pbm9kZShpcCwgMCwgZmxhZ3MpOworCXJldHVybiB4ZnNfcmVjbGFpbV9pbm9kZShpcCwgZmxhZ3MpOwogfQogCiBpbnQKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5bmMuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5bmMuaAppbmRleCAyNzkyMGViLi5hNTAwYjRkIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zeW5jLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3luYy5oCkBAIC00NCw3ICs0NCw2IEBACiAKIHZvaWQgeGZzX2ZsdXNoX2lub2RlcyhzdHJ1Y3QgeGZzX2lub2RlICppcCk7CiAKLWludCB4ZnNfcmVjbGFpbV9pbm9kZShzdHJ1Y3QgeGZzX2lub2RlICppcCwgaW50IGxvY2tlZCwgaW50IHN5bmNfbW9kZSk7CiBpbnQgeGZzX3JlY2xhaW1faW5vZGVzKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBpbnQgbW9kZSk7CiAKIHZvaWQgeGZzX2lub2RlX3NldF9yZWNsYWltX3RhZyhzdHJ1Y3QgeGZzX2lub2RlICppcCk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuaAppbmRleCBhZDdmYmVhLi4wMGNhYmY1IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmgKQEAgLTM2LDcgKzM2LDYgQEAKIC8qCiAgKiBGbGFncyBmb3IgcmVhZC93cml0ZSBjYWxscyAtIHNhbWUgdmFsdWVzIGFzIElSSVgKICAqLwotI2RlZmluZSBJT19JU0FJTwkweDAwMDAxCQkvKiBkb24ndCB3YWl0IGZvciBjb21wbGV0aW9uICovCiAjZGVmaW5lIElPX0lTRElSRUNUCTB4MDAwMDQJCS8qIGJ5cGFzcyBwYWdlIGNhY2hlICovCiAjZGVmaW5lIElPX0lOVklTCTB4MDAwMjAJCS8qIGRvbid0IHVwZGF0ZSBpbm9kZSB0aW1lc3RhbXBzICovCiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmggYi9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5oCmluZGV4IDZmNGZkMzcuLmQyZDIwNDYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmgKKysrIGIvZnMveGZzL3N1cHBvcnQvZGVidWcuaApAQCAtNDEsMTAgKzQxLDYgQEAKICMgZGVmaW5lIFNUQVRJQyBzdGF0aWMgbm9pbmxpbmUKICNlbmRpZgogCi0jaWZuZGVmIFNUQVRJQ19JTkxJTkUKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkUgc3RhdGljIGlubGluZQotI2VuZGlmCi0KICNlbHNlIC8qIERFQlVHICovCiAKICNkZWZpbmUgQVNTRVJUKGV4cHIpCVwKQEAgLTU0LDE5ICs1MCw1IEBACiAjIGRlZmluZSBTVEFUSUMgbm9pbmxpbmUKICNlbmRpZgogCi0vKgotICogV2Ugc3RvcCBpbmxpbmluZyBvZiBpbmxpbmUgZnVuY3Rpb25zIGluIGRlYnVnIG1vZGUuCi0gKiBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zIHN0YXRpYyBpbmxpbmUgaW4gaGVhZGVyIGZpbGVzCi0gKiBnZXQgbXVsdGlwbGUgZGVmaW5pdGlvbnMsIHNvIHRoZXkgbmVlZCB0byByZW1haW4gc3RhdGljLgotICogVGhpcyB0aGVuIGdpdmVzIHRvbm5lcyBvZiB3YXJuaW5ncyBhYm91dCB1bnVzZWQgYnV0IGRlZmluZWQKLSAqIGZ1bmN0aW9ucywgc28gd2UgbmVlZCB0byBhZGQgdGhlIHVudXNlZCBhdHRyaWJ1dGUgdG8gcHJldmVudAotICogdGhlc2Ugc3B1cmlvdXMgd2FybmluZ3MuCi0gKi8KLSNpZm5kZWYgU1RBVElDX0lOTElORQotIyBkZWZpbmUgU1RBVElDX0lOTElORSBzdGF0aWMgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIG5vaW5saW5lCi0jZW5kaWYKLQogI2VuZGlmIC8qIERFQlVHICovCi0KLQogI2VuZGlmICAvKiBfX1hGU19TVVBQT1JUX0RFQlVHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hdHRyLmMgYi9mcy94ZnMveGZzX2F0dHIuYwppbmRleCA0ZWNlMTkwLi44ZmU2ZjZiIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2F0dHIuYworKysgYi9mcy94ZnMveGZzX2F0dHIuYwpAQCAtMTIzLDkgKzEyMywxMyBAQAogICogT3ZlcmFsbCBleHRlcm5hbCBpbnRlcmZhY2Ugcm91dGluZXMuCiAgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKLWludAoteGZzX2F0dHJfZmV0Y2goeGZzX2lub2RlX3QgKmlwLCBzdHJ1Y3QgeGZzX25hbWUgKm5hbWUsCi0JCWNoYXIgKnZhbHVlLCBpbnQgKnZhbHVlbGVucCwgaW50IGZsYWdzKQorU1RBVElDIGludAoreGZzX2F0dHJfZ2V0X2ludCgKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKKwlzdHJ1Y3QgeGZzX25hbWUJCSpuYW1lLAorCWNoYXIJCQkqdmFsdWUsCisJaW50CQkJKnZhbHVlbGVucCwKKwlpbnQJCQlmbGFncykKIHsKIAl4ZnNfZGFfYXJnc190ICAgYXJnczsKIAlpbnQgICAgICAgICAgICAgZXJyb3I7CkBAIC0xODgsNyArMTkyLDcgQEAKIAkJcmV0dXJuIGVycm9yOwogCiAJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKLQllcnJvciA9IHhmc19hdHRyX2ZldGNoKGlwLCAmeG5hbWUsIHZhbHVlLCB2YWx1ZWxlbnAsIGZsYWdzKTsKKwllcnJvciA9IHhmc19hdHRyX2dldF9pbnQoaXAsICZ4bmFtZSwgdmFsdWUsIHZhbHVlbGVucCwgZmxhZ3MpOwogCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKIAlyZXR1cm4oZXJyb3IpOwogfQpAQCAtMjE0Myw4ICsyMTQ3LDggQEAKIAkJZGJsa25vID0gWEZTX0ZTQl9UT19EQUREUihtcCwgbWFwLmJyX3N0YXJ0YmxvY2spLAogCQlibGtjbnQgPSBYRlNfRlNCX1RPX0JCKG1wLCBtYXAuYnJfYmxvY2tjb3VudCk7CiAKLQkJYnAgPSB4ZnNfYnVmX2dldF9mbGFncyhtcC0+bV9kZGV2X3RhcmdwLCBkYmxrbm8sIGJsa2NudCwKLQkJCQkgICAgICAgWEZTX0JVRl9MT0NLIHwgWEJGX0RPTlRfQkxPQ0spOworCQlicCA9IHhmc19idWZfZ2V0KG1wLT5tX2RkZXZfdGFyZ3AsIGRibGtubywgYmxrY250LAorCQkJCSBYRlNfQlVGX0xPQ0sgfCBYQkZfRE9OVF9CTE9DSyk7CiAJCUFTU0VSVChicCk7CiAJCUFTU0VSVCghWEZTX0JVRl9HRVRFUlJPUihicCkpOwogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2F0dHIuaCBiL2ZzL3hmcy94ZnNfYXR0ci5oCmluZGV4IGZiM2IyYTYuLjEyZjBiZTMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYXR0ci5oCisrKyBiL2ZzL3hmcy94ZnNfYXR0ci5oCkBAIC0xMzEsNyArMTMxLDYgQEAKICAqLwogaW50IHhmc19hdHRyX2NhbGNfc2l6ZShzdHJ1Y3QgeGZzX2lub2RlICosIGludCwgaW50LCBpbnQgKik7CiBpbnQgeGZzX2F0dHJfaW5hY3RpdmUoc3RydWN0IHhmc19pbm9kZSAqZHApOwotaW50IHhmc19hdHRyX2ZldGNoKHN0cnVjdCB4ZnNfaW5vZGUgKiwgc3RydWN0IHhmc19uYW1lICosIGNoYXIgKiwgaW50ICosIGludCk7CiBpbnQgeGZzX2F0dHJfcm10dmFsX2dldChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOwogaW50IHhmc19hdHRyX2xpc3RfaW50KHN0cnVjdCB4ZnNfYXR0cl9saXN0X2NvbnRleHQgKik7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMgYi9mcy94ZnMveGZzX2F0dHJfbGVhZi5jCmluZGV4IGFmZGM4OTEuLjBiNjg3MzUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMKKysrIGIvZnMveGZzL3hmc19hdHRyX2xlYWYuYwpAQCAtOTgsNyArOTgsNyBAQAogICogSWYgbmFtZXNwYWNlIGJpdHMgZG9uJ3QgbWF0Y2ggcmV0dXJuIDAuCiAgKiBJZiBhbGwgbWF0Y2ggdGhlbiByZXR1cm4gMS4KICAqLwotU1RBVElDX0lOTElORSBpbnQKK1NUQVRJQyBpbnQKIHhmc19hdHRyX25hbWVzcF9tYXRjaChpbnQgYXJnX2ZsYWdzLCBpbnQgb25kaXNrX2ZsYWdzKQogewogCXJldHVybiBYRlNfQVRUUl9OU1BfT05ESVNLKG9uZGlza19mbGFncykgPT0gWEZTX0FUVFJfTlNQX0FSR1NfVE9fT05ESVNLKGFyZ19mbGFncyk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2JtYXBfYnRyZWUuYyBiL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5jCmluZGV4IGViN2I3MDIuLjZmNWNjZWQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5jCisrKyBiL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5jCkBAIC05OCw4ICs5OCw3IEBACiAgKiBUaGlzIGNvZGUgbXVzdCBiZSBpbiBzeW5jIHdpdGggdGhlIHJvdXRpbmVzIHhmc19ibWJ0X2dldF9zdGFydG9mZiwKICAqIHhmc19ibWJ0X2dldF9zdGFydGJsb2NrLCB4ZnNfYm1idF9nZXRfYmxvY2tjb3VudCBhbmQgeGZzX2JtYnRfZ2V0X3N0YXRlLgogICovCi0KLVNUQVRJQ19JTkxJTkUgdm9pZAorU1RBVElDIHZvaWQKIF9feGZzX2JtYnRfZ2V0X2FsbCgKIAkJX191aW50NjRfdCBsMCwKIAkJX191aW50NjRfdCBsMSwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZmlsZXN0cmVhbS5oIGIvZnMveGZzL3hmc19maWxlc3RyZWFtLmgKaW5kZXggZjY1NWY3ZC4uNGFiYTY3YyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19maWxlc3RyZWFtLmgKKysrIGIvZnMveGZzL3hmc19maWxlc3RyZWFtLmgKQEAgLTc5LDcgKzc5LDcgQEAKICAqIHRoZSBjYWNoZSB0aGF0IHJlZmVyZW5jZSBwZXItYWcgYXJyYXkgZWxlbWVudHMgdGhhdCBoYXZlIHNpbmNlIGJlZW4KICAqIHJlYWxsb2NhdGVkLgogICovCi1TVEFUSUNfSU5MSU5FIGludAorc3RhdGljIGlubGluZSBpbnQKIHhmc19maWxlc3RyZWFtX3BlZWtfYWcoCiAJeGZzX21vdW50X3QJKm1wLAogCXhmc19hZ251bWJlcl90CWFnbm8pCkBAIC04Nyw3ICs4Nyw3IEBACiAJcmV0dXJuIGF0b21pY19yZWFkKCZtcC0+bV9wZXJhZ1thZ25vXS5wYWdmX2ZzdHJtcyk7CiB9CiAKLVNUQVRJQ19JTkxJTkUgaW50CitzdGF0aWMgaW5saW5lIGludAogeGZzX2ZpbGVzdHJlYW1fZ2V0X2FnKAogCXhmc19tb3VudF90CSptcCwKIAl4ZnNfYWdudW1iZXJfdAlhZ25vKQpAQCAtOTUsNyArOTUsNyBAQAogCXJldHVybiBhdG9taWNfaW5jX3JldHVybigmbXAtPm1fcGVyYWdbYWdub10ucGFnZl9mc3RybXMpOwogfQogCi1TVEFUSUNfSU5MSU5FIGludAorc3RhdGljIGlubGluZSBpbnQKIHhmc19maWxlc3RyZWFtX3B1dF9hZygKIAl4ZnNfbW91bnRfdAkqbXAsCiAJeGZzX2FnbnVtYmVyX3QJYWdubykKQEAgLTEyMiw3ICsxMjIsNyBAQAogCiAKIC8qIGZpbGVzdHJlYW1zIGZvciB0aGUgaW5vZGU/ICovCi1TVEFUSUNfSU5MSU5FIGludAorc3RhdGljIGlubGluZSBpbnQKIHhmc19pbm9kZV9pc19maWxlc3RyZWFtKAogCXN0cnVjdCB4ZnNfaW5vZGUJKmlwKQogewpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19mc29wcy5jIGIvZnMveGZzL3hmc19mc29wcy5jCmluZGV4IDJkMGIzZTEuLjM2MDc5YWEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZnNvcHMuYworKysgYi9mcy94ZnMveGZzX2Zzb3BzLmMKQEAgLTIwMSw4ICsyMDEsOCBAQAogCQkgKiBBRyBmcmVlbGlzdCBoZWFkZXIgYmxvY2sKIAkJICovCiAJCWJwID0geGZzX2J1Zl9nZXQobXAtPm1fZGRldl90YXJncCwKLQkJCQkgIFhGU19BR19EQUREUihtcCwgYWdubywgWEZTX0FHRl9EQUREUihtcCkpLAotCQkJCSAgWEZTX0ZTU19UT19CQihtcCwgMSksIDApOworCQkJCSBYRlNfQUdfREFERFIobXAsIGFnbm8sIFhGU19BR0ZfREFERFIobXApKSwKKwkJCQkgWEZTX0ZTU19UT19CQihtcCwgMSksIFhCRl9MT0NLIHwgWEJGX01BUFBFRCk7CiAJCWFnZiA9IFhGU19CVUZfVE9fQUdGKGJwKTsKIAkJbWVtc2V0KGFnZiwgMCwgbXAtPm1fc2Iuc2Jfc2VjdHNpemUpOwogCQlhZ2YtPmFnZl9tYWdpY251bSA9IGNwdV90b19iZTMyKFhGU19BR0ZfTUFHSUMpOwpAQCAtMjMzLDggKzIzMyw4IEBACiAJCSAqIEFHIGlub2RlIGhlYWRlciBibG9jawogCQkgKi8KIAkJYnAgPSB4ZnNfYnVmX2dldChtcC0+bV9kZGV2X3RhcmdwLAotCQkJCSAgWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBYRlNfQUdJX0RBRERSKG1wKSksCi0JCQkJICBYRlNfRlNTX1RPX0JCKG1wLCAxKSwgMCk7CisJCQkJIFhGU19BR19EQUREUihtcCwgYWdubywgWEZTX0FHSV9EQUREUihtcCkpLAorCQkJCSBYRlNfRlNTX1RPX0JCKG1wLCAxKSwgWEJGX0xPQ0sgfCBYQkZfTUFQUEVEKTsKIAkJYWdpID0gWEZTX0JVRl9UT19BR0koYnApOwogCQltZW1zZXQoYWdpLCAwLCBtcC0+bV9zYi5zYl9zZWN0c2l6ZSk7CiAJCWFnaS0+YWdpX21hZ2ljbnVtID0gY3B1X3RvX2JlMzIoWEZTX0FHSV9NQUdJQyk7CkBAIC0yNTcsOCArMjU3LDkgQEAKIAkJICogQk5PIGJ0cmVlIHJvb3QgYmxvY2sKIAkJICovCiAJCWJwID0geGZzX2J1Zl9nZXQobXAtPm1fZGRldl90YXJncCwKLQkJCVhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIFhGU19CTk9fQkxPQ0sobXApKSwKLQkJCUJUT0JCKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSksIDApOworCQkJCSBYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLCBYRlNfQk5PX0JMT0NLKG1wKSksCisJCQkJIEJUT0JCKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSksCisJCQkJIFhCRl9MT0NLIHwgWEJGX01BUFBFRCk7CiAJCWJsb2NrID0gWEZTX0JVRl9UT19CTE9DSyhicCk7CiAJCW1lbXNldChibG9jaywgMCwgbXAtPm1fc2Iuc2JfYmxvY2tzaXplKTsKIAkJYmxvY2stPmJiX21hZ2ljID0gY3B1X3RvX2JlMzIoWEZTX0FCVEJfTUFHSUMpOwpAQCAtMjc4LDggKzI3OSw5IEBACiAJCSAqIENOVCBidHJlZSByb290IGJsb2NrCiAJCSAqLwogCQlicCA9IHhmc19idWZfZ2V0KG1wLT5tX2RkZXZfdGFyZ3AsCi0JCQlYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLCBYRlNfQ05UX0JMT0NLKG1wKSksCi0JCQlCVE9CQihtcC0+bV9zYi5zYl9ibG9ja3NpemUpLCAwKTsKKwkJCQkgWEZTX0FHQl9UT19EQUREUihtcCwgYWdubywgWEZTX0NOVF9CTE9DSyhtcCkpLAorCQkJCSBCVE9CQihtcC0+bV9zYi5zYl9ibG9ja3NpemUpLAorCQkJCSBYQkZfTE9DSyB8IFhCRl9NQVBQRUQpOwogCQlibG9jayA9IFhGU19CVUZfVE9fQkxPQ0soYnApOwogCQltZW1zZXQoYmxvY2ssIDAsIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSk7CiAJCWJsb2NrLT5iYl9tYWdpYyA9IGNwdV90b19iZTMyKFhGU19BQlRDX01BR0lDKTsKQEAgLTMwMCw4ICszMDIsOSBAQAogCQkgKiBJTk8gYnRyZWUgcm9vdCBibG9jawogCQkgKi8KIAkJYnAgPSB4ZnNfYnVmX2dldChtcC0+bV9kZGV2X3RhcmdwLAotCQkJWEZTX0FHQl9UT19EQUREUihtcCwgYWdubywgWEZTX0lCVF9CTE9DSyhtcCkpLAotCQkJQlRPQkIobXAtPm1fc2Iuc2JfYmxvY2tzaXplKSwgMCk7CisJCQkJIFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIFhGU19JQlRfQkxPQ0sobXApKSwKKwkJCQkgQlRPQkIobXAtPm1fc2Iuc2JfYmxvY2tzaXplKSwKKwkJCQkgWEJGX0xPQ0sgfCBYQkZfTUFQUEVEKTsKIAkJYmxvY2sgPSBYRlNfQlVGX1RPX0JMT0NLKGJwKTsKIAkJbWVtc2V0KGJsb2NrLCAwLCBtcC0+bV9zYi5zYl9ibG9ja3NpemUpOwogCQlibG9jay0+YmJfbWFnaWMgPSBjcHVfdG9fYmUzMihYRlNfSUJUX01BR0lDKTsKQEAgLTYxMSw3ICs2MTQsNyBAQAogCXhmc19pbm9kZV90CSppcDsKIAlpbnQJCWVycm9yOwogCi0JdHAgPSBfeGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfRFVNTVkxKTsKKwl0cCA9IF94ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19EVU1NWTEsIEtNX1NMRUVQKTsKIAllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLCBYRlNfSUNIQU5HRV9MT0dfUkVTKG1wKSwgMCwgMCwgMCk7CiAJaWYgKGVycm9yKSB7CiAJCXhmc190cmFuc19jYW5jZWwodHAsIDApOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pYWxsb2MuYyBiL2ZzL3hmcy94ZnNfaWFsbG9jLmMKaW5kZXggMDc4NTc5Ny4uY2I5MDdiYSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pYWxsb2MuYworKysgYi9mcy94ZnMveGZzX2lhbGxvYy5jCkBAIC00MjUsNyArNDI1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotU1RBVElDX0lOTElORSB4ZnNfYWdudW1iZXJfdAorU1RBVElDIHhmc19hZ251bWJlcl90CiB4ZnNfaWFsbG9jX25leHRfYWcoCiAJeGZzX21vdW50X3QJKm1wKQogewpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pZ2V0LmMgYi9mcy94ZnMveGZzX2lnZXQuYwppbmRleCA4MGU1MjY0Li4wNzNiYjRhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lnZXQuYworKysgYi9mcy94ZnMveGZzX2lnZXQuYwpAQCAtNzMsNiArNzMsOSBAQAogCUFTU0VSVChhdG9taWNfcmVhZCgmaXAtPmlfcGluY291bnQpID09IDApOwogCUFTU0VSVCghc3Bpbl9pc19sb2NrZWQoJmlwLT5pX2ZsYWdzX2xvY2spKTsKIAlBU1NFUlQoY29tcGxldGlvbl9kb25lKCZpcC0+aV9mbHVzaCkpOworCUFTU0VSVCghcndzZW1faXNfbG9ja2VkKCZpcC0+aV9pb2xvY2subXJfbG9jaykpOworCisJbXJsb2NrX2luaXQoJmlwLT5pX2lvbG9jaywgTVJMT0NLX0JBUlJJRVIsICJ4ZnNpbyIsIGlwLT5pX2lubyk7CiAKIAkvKiBpbml0aWFsaXNlIHRoZSB4ZnMgaW5vZGUgKi8KIAlpcC0+aV9pbm8gPSBpbm87CkBAIC0yOTAsNyArMjkzLDcgQEAKIAlzdHJ1Y3QgeGZzX2lub2RlCSoqaXBwLAogCXhmc19kYWRkcl90CQlibm8sCiAJaW50CQkJZmxhZ3MsCi0JaW50CQkJbG9ja19mbGFncykgX19yZWxlYXNlcyhwYWctPnBhZ19pY2lfbG9jaykKKwlpbnQJCQlsb2NrX2ZsYWdzKQogewogCXN0cnVjdCB4ZnNfaW5vZGUJKmlwOwogCWludAkJCWVycm9yOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pb21hcC5jIGIvZnMveGZzL3hmc19pb21hcC5jCmluZGV4IDY3YWU1NTU1Li43Mjk0YWJjIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lvbWFwLmMKKysrIGIvZnMveGZzL3hmc19pb21hcC5jCkBAIC04NjAsOCArODYwLDE1IEBACiAJCSAqIHNldCB1cCBhIHRyYW5zYWN0aW9uIHRvIGNvbnZlcnQgdGhlIHJhbmdlIG9mIGV4dGVudHMKIAkJICogZnJvbSB1bndyaXR0ZW4gdG8gcmVhbC4gRG8gYWxsb2NhdGlvbnMgaW4gYSBsb29wIHVudGlsCiAJCSAqIHdlIGhhdmUgY292ZXJlZCB0aGUgcmFuZ2UgcGFzc2VkIGluLgorCQkgKgorCQkgKiBOb3RlIHRoYXQgd2Ugb3BlbiBjb2RlIHRoZSB0cmFuc2FjdGlvbiBhbGxvY2F0aW9uIGhlcmUKKwkJICogdG8gcGFzcyBLTV9OT0ZTLS13ZSBjYW4ndCByaXNrIHRvIHJlY3Vyc2luZyBiYWNrIGludG8KKwkJICogdGhlIGZpbGVzeXN0ZW0gaGVyZSBhcyB3ZSBtaWdodCBiZSBhc2tlZCB0byB3cml0ZSBvdXQKKwkJICogdGhlIHNhbWUgaW5vZGUgdGhhdCB3ZSBjb21wbGV0ZSBoZXJlIGFuZCBtaWdodCBkZWFkbG9jaworCQkgKiBvbiB0aGUgaW9sb2NrLgogCQkgKi8KLQkJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19TVFJBVF9XUklURSk7CisJCXhmc193YWl0X2Zvcl9mcmVlemUobXAsIFNCX0ZSRUVaRV9UUkFOUyk7CisJCXRwID0gX3hmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1NUUkFUX1dSSVRFLCBLTV9OT0ZTKTsKIAkJdHAtPnRfZmxhZ3MgfD0gWEZTX1RSQU5TX1JFU0VSVkU7CiAJCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIHJlc2Jsa3MsCiAJCQkJWEZTX1dSSVRFX0xPR19SRVMobXApLCAwLApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jIGIvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCmluZGV4IGZiMTdmODIuLjFlYzk4ZWQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYworKysgYi9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMKQEAgLTIyMDYsNiArMjIwNiw3IEBACiAJeGZzX2RhZGRyX3QJCWJsa25vOwogCWludAkJCWxlbjsKIAl1c2hvcnQJCQlmbGFnczsKKwl1aW50CQkJYnVmX2ZsYWdzOwogCiAJYnVmX2YgPSAoeGZzX2J1Zl9sb2dfZm9ybWF0X3QgKilpdGVtLT5yaV9idWZbMF0uaV9hZGRyOwogCkBAIC0yMjQ2LDEyICsyMjQ3LDExIEBACiAJfQogCiAJbXAgPSBsb2ctPmxfbXA7Ci0JaWYgKGZsYWdzICYgWEZTX0JMSV9JTk9ERV9CVUYpIHsKLQkJYnAgPSB4ZnNfYnVmX3JlYWRfZmxhZ3MobXAtPm1fZGRldl90YXJncCwgYmxrbm8sIGxlbiwKLQkJCQkJCQkJWEZTX0JVRl9MT0NLKTsKLQl9IGVsc2UgewotCQlicCA9IHhmc19idWZfcmVhZChtcC0+bV9kZGV2X3RhcmdwLCBibGtubywgbGVuLCAwKTsKLQl9CisJYnVmX2ZsYWdzID0gWEZTX0JVRl9MT0NLOworCWlmICghKGZsYWdzICYgWEZTX0JMSV9JTk9ERV9CVUYpKQorCQlidWZfZmxhZ3MgfD0gWEZTX0JVRl9NQVBQRUQ7CisKKwlicCA9IHhmc19idWZfcmVhZChtcC0+bV9kZGV2X3RhcmdwLCBibGtubywgbGVuLCBidWZfZmxhZ3MpOwogCWlmIChYRlNfQlVGX0lTRVJST1IoYnApKSB7CiAJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX3JlY292ZXJfZG8uLihyZWFkIzEpIiwgbG9nLT5sX21wLAogCQkJCSAgYnAsIGJsa25vKTsKQEAgLTIzNTAsOCArMjM1MCw4IEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JYnAgPSB4ZnNfYnVmX3JlYWRfZmxhZ3MobXAtPm1fZGRldl90YXJncCwgaW5fZi0+aWxmX2Jsa25vLAotCQkJCWluX2YtPmlsZl9sZW4sIFhGU19CVUZfTE9DSyk7CisJYnAgPSB4ZnNfYnVmX3JlYWQobXAtPm1fZGRldl90YXJncCwgaW5fZi0+aWxmX2Jsa25vLCBpbl9mLT5pbGZfbGVuLAorCQkJICBYRlNfQlVGX0xPQ0spOwogCWlmIChYRlNfQlVGX0lTRVJST1IoYnApKSB7CiAJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX3JlY292ZXJfZG8uLihyZWFkIzIpIiwgbXAsCiAJCQkJICBicCwgaW5fZi0+aWxmX2Jsa25vKTsKQEAgLTM1MTcsNyArMzUxNyw3IEBACiB7CiAJeGxvZ19yZWNfaGVhZGVyX3QJKnJoZWFkOwogCXhmc19kYWRkcl90CQlibGtfbm87Ci0JeGZzX2NhZGRyX3QJCWJ1ZmFkZHIsIG9mZnNldDsKKwl4ZnNfY2FkZHJfdAkJb2Zmc2V0OwogCXhmc19idWZfdAkJKmhicCwgKmRicDsKIAlpbnQJCQllcnJvciA9IDAsIGhfc2l6ZTsKIAlpbnQJCQliYmxrcywgc3BsaXRfYmJsa3M7CkBAIC0zNjEwLDcgKzM2MTAsNyBAQAogCQkJLyoKIAkJCSAqIENoZWNrIGZvciBoZWFkZXIgd3JhcHBpbmcgYXJvdW5kIHBoeXNpY2FsIGVuZC1vZi1sb2cKIAkJCSAqLwotCQkJb2Zmc2V0ID0gTlVMTDsKKwkJCW9mZnNldCA9IFhGU19CVUZfUFRSKGhicCk7CiAJCQlzcGxpdF9oYmxrcyA9IDA7CiAJCQl3cmFwcGVkX2hibGtzID0gMDsKIAkJCWlmIChibGtfbm8gKyBoYmxrcyA8PSBsb2ctPmxfbG9nQkJzaXplKSB7CkBAIC0zNjQ2LDkgKzM2NDYsOCBAQAogCQkJCSAqICAgLSBvcmRlciBpcyBpbXBvcnRhbnQuCiAJCQkJICovCiAJCQkJd3JhcHBlZF9oYmxrcyA9IGhibGtzIC0gc3BsaXRfaGJsa3M7Ci0JCQkJYnVmYWRkciA9IFhGU19CVUZfUFRSKGhicCk7CiAJCQkJZXJyb3IgPSBYRlNfQlVGX1NFVF9QVFIoaGJwLAotCQkJCQkJYnVmYWRkciArIEJCVE9CKHNwbGl0X2hibGtzKSwKKwkJCQkJCW9mZnNldCArIEJCVE9CKHNwbGl0X2hibGtzKSwKIAkJCQkJCUJCVE9CKGhibGtzIC0gc3BsaXRfaGJsa3MpKTsKIAkJCQlpZiAoZXJyb3IpCiAJCQkJCWdvdG8gYnJlYWRfZXJyMjsKQEAgLTM2NTgsMTQgKzM2NTcsMTAgQEAKIAkJCQlpZiAoZXJyb3IpCiAJCQkJCWdvdG8gYnJlYWRfZXJyMjsKIAotCQkJCWVycm9yID0gWEZTX0JVRl9TRVRfUFRSKGhicCwgYnVmYWRkciwKKwkJCQllcnJvciA9IFhGU19CVUZfU0VUX1BUUihoYnAsIG9mZnNldCwKIAkJCQkJCQlCQlRPQihoYmxrcykpOwogCQkJCWlmIChlcnJvcikKIAkJCQkJZ290byBicmVhZF9lcnIyOwotCi0JCQkJaWYgKCFvZmZzZXQpCi0JCQkJCW9mZnNldCA9IHhsb2dfYWxpZ24obG9nLCAwLAotCQkJCQkJCXdyYXBwZWRfaGJsa3MsIGhicCk7CiAJCQl9CiAJCQlyaGVhZCA9ICh4bG9nX3JlY19oZWFkZXJfdCAqKW9mZnNldDsKIAkJCWVycm9yID0geGxvZ192YWxpZF9yZWNfaGVhZGVyKGxvZywgcmhlYWQsCkBAIC0zNjg1LDcgKzM2ODAsNyBAQAogCQkJfSBlbHNlIHsKIAkJCQkvKiBUaGlzIGxvZyByZWNvcmQgaXMgc3BsaXQgYWNyb3NzIHRoZQogCQkJCSAqIHBoeXNpY2FsIGVuZCBvZiBsb2cgKi8KLQkJCQlvZmZzZXQgPSBOVUxMOworCQkJCW9mZnNldCA9IFhGU19CVUZfUFRSKGRicCk7CiAJCQkJc3BsaXRfYmJsa3MgPSAwOwogCQkJCWlmIChibGtfbm8gIT0gbG9nLT5sX2xvZ0JCc2l6ZSkgewogCQkJCQkvKiBzb21lIGRhdGEgaXMgYmVmb3JlIHRoZSBwaHlzaWNhbApAQCAtMzcxNCw5ICszNzA5LDggQEAKIAkJCQkgKiAgIF9maXJzdF8sIHRoZW4gdGhlIGxvZyBzdGFydCAoTFIgaGVhZGVyIGVuZCkKIAkJCQkgKiAgIC0gb3JkZXIgaXMgaW1wb3J0YW50LgogCQkJCSAqLwotCQkJCWJ1ZmFkZHIgPSBYRlNfQlVGX1BUUihkYnApOwogCQkJCWVycm9yID0gWEZTX0JVRl9TRVRfUFRSKGRicCwKLQkJCQkJCWJ1ZmFkZHIgKyBCQlRPQihzcGxpdF9iYmxrcyksCisJCQkJCQlvZmZzZXQgKyBCQlRPQihzcGxpdF9iYmxrcyksCiAJCQkJCQlCQlRPQihiYmxrcyAtIHNwbGl0X2JibGtzKSk7CiAJCQkJaWYgKGVycm9yKQogCQkJCQlnb3RvIGJyZWFkX2VycjI7CkBAIC0zNzI3LDEzICszNzIxLDkgQEAKIAkJCQlpZiAoZXJyb3IpCiAJCQkJCWdvdG8gYnJlYWRfZXJyMjsKIAotCQkJCWVycm9yID0gWEZTX0JVRl9TRVRfUFRSKGRicCwgYnVmYWRkciwgaF9zaXplKTsKKwkJCQllcnJvciA9IFhGU19CVUZfU0VUX1BUUihkYnAsIG9mZnNldCwgaF9zaXplKTsKIAkJCQlpZiAoZXJyb3IpCiAJCQkJCWdvdG8gYnJlYWRfZXJyMjsKLQotCQkJCWlmICghb2Zmc2V0KQotCQkJCQlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgd3JhcHBlZF9oYmxrcywKLQkJCQkJCWJibGtzIC0gc3BsaXRfYmJsa3MsIGRicCk7CiAJCQl9CiAJCQl4bG9nX3VucGFja19kYXRhKHJoZWFkLCBvZmZzZXQsIGxvZyk7CiAJCQlpZiAoKGVycm9yID0geGxvZ19yZWNvdmVyX3Byb2Nlc3NfZGF0YShsb2csIHJoYXNoLApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19tb3VudC5jIGIvZnMveGZzL3hmc19tb3VudC5jCmluZGV4IDhiNmM5ZTguLjY2YTg4OGEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbW91bnQuYworKysgYi9mcy94ZnMveGZzX21vdW50LmMKQEAgLTU4Myw4ICs1ODMsOCBAQAogCXNlY3Rvcl9zaXplID0geGZzX2dldHNpemVfYnVmdGFyZyhtcC0+bV9kZGV2X3RhcmdwKTsKIAlleHRyYV9mbGFncyA9IFhGU19CVUZfTE9DSyB8IFhGU19CVUZfTUFOQUdFIHwgWEZTX0JVRl9NQVBQRUQ7CiAKLQlicCA9IHhmc19idWZfcmVhZF9mbGFncyhtcC0+bV9kZGV2X3RhcmdwLCBYRlNfU0JfREFERFIsCi0JCQkJQlRPQkIoc2VjdG9yX3NpemUpLCBleHRyYV9mbGFncyk7CisJYnAgPSB4ZnNfYnVmX3JlYWQobXAtPm1fZGRldl90YXJncCwgWEZTX1NCX0RBRERSLCBCVE9CQihzZWN0b3Jfc2l6ZSksCisJCQkgIGV4dHJhX2ZsYWdzKTsKIAlpZiAoIWJwIHx8IFhGU19CVUZfSVNFUlJPUihicCkpIHsKIAkJeGZzX2ZzX21vdW50X2Ntbl9lcnIoZmxhZ3MsICJTQiByZWFkIGZhaWxlZCIpOwogCQllcnJvciA9IGJwID8gWEZTX0JVRl9HRVRFUlJPUihicCkgOiBFTk9NRU07CkBAIC02MjQsOCArNjI0LDggQEAKIAkJWEZTX0JVRl9VTk1BTkFHRShicCk7CiAJCXhmc19idWZfcmVsc2UoYnApOwogCQlzZWN0b3Jfc2l6ZSA9IG1wLT5tX3NiLnNiX3NlY3RzaXplOwotCQlicCA9IHhmc19idWZfcmVhZF9mbGFncyhtcC0+bV9kZGV2X3RhcmdwLCBYRlNfU0JfREFERFIsCi0JCQkJCUJUT0JCKHNlY3Rvcl9zaXplKSwgZXh0cmFfZmxhZ3MpOworCQlicCA9IHhmc19idWZfcmVhZChtcC0+bV9kZGV2X3RhcmdwLCBYRlNfU0JfREFERFIsCisJCQkJICBCVE9CQihzZWN0b3Jfc2l6ZSksIGV4dHJhX2ZsYWdzKTsKIAkJaWYgKCFicCB8fCBYRlNfQlVGX0lTRVJST1IoYnApKSB7CiAJCQl4ZnNfZnNfbW91bnRfY21uX2VycihmbGFncywgIlNCIHJlLXJlYWQgZmFpbGVkIik7CiAJCQllcnJvciA9IGJwID8gWEZTX0JVRl9HRVRFUlJPUihicCkgOiBFTk9NRU07CkBAIC0xNDcxLDcgKzE0NzEsNyBAQAogCWlmICgheGZzX3NiX3ZlcnNpb25faGFzbGF6eXNiY291bnQoJm1wLT5tX3NiKSkKIAkJcmV0dXJuIDA7CiAKLQl0cCA9IF94ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19TQl9DT1VOVCk7CisJdHAgPSBfeGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfU0JfQ09VTlQsIEtNX1NMRUVQKTsKIAllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLCBtcC0+bV9zYi5zYl9zZWN0c2l6ZSArIDEyOCwgMCwgMCwKIAkJCQkJWEZTX0RFRkFVTFRfTE9HX0NPVU5UKTsKIAlpZiAoZXJyb3IpIHsKQEAgLTIxMjMsNyArMjEyMyw3IEBACiAJbXV0ZXhfZGVzdHJveSgmbXAtPm1faWNzYl9tdXRleCk7CiB9CiAKLVNUQVRJQ19JTkxJTkUgdm9pZAorU1RBVElDIHZvaWQKIHhmc19pY3NiX2xvY2tfY250cigKIAl4ZnNfaWNzYl9jbnRzX3QJKmljc2JwKQogewpAQCAtMjEzMiw3ICsyMTMyLDcgQEAKIAl9CiB9CiAKLVNUQVRJQ19JTkxJTkUgdm9pZAorU1RBVElDIHZvaWQKIHhmc19pY3NiX3VubG9ja19jbnRyKAogCXhmc19pY3NiX2NudHNfdAkqaWNzYnApCiB7CkBAIC0yMTQwLDcgKzIxNDAsNyBAQAogfQogCiAKLVNUQVRJQ19JTkxJTkUgdm9pZAorU1RBVElDIHZvaWQKIHhmc19pY3NiX2xvY2tfYWxsX2NvdW50ZXJzKAogCXhmc19tb3VudF90CSptcCkKIHsKQEAgLTIxNTMsNyArMjE1Myw3IEBACiAJfQogfQogCi1TVEFUSUNfSU5MSU5FIHZvaWQKK1NUQVRJQyB2b2lkCiB4ZnNfaWNzYl91bmxvY2tfYWxsX2NvdW50ZXJzKAogCXhmc19tb3VudF90CSptcCkKIHsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbW91bnQuaCBiL2ZzL3hmcy94ZnNfbW91bnQuaAppbmRleCBhNmMwMjNiLi4xZGY3ZTQ1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX21vdW50LmgKKysrIGIvZnMveGZzL3hmc19tb3VudC5oCkBAIC05Myw2ICs5Myw5IEBACiAJeGZzX3NlbmRfdW5tb3VudF90CXhmc19zZW5kX3VubW91bnQ7CiB9IHhmc19kbW9wc190OwogCisjZGVmaW5lIFhGU19ETUFQSV9VTk1PVU5UX0ZMQUdTKG1wKSBcCisJKCgobXApLT5tX2RtZXZtYXNrICYgKDEgPDwgRE1fRVZFTlRfVU5NT1VOVCkpID8gMCA6IERNX0ZMQUdTX1VOV0FOVEVEKQorCiAjZGVmaW5lIFhGU19TRU5EX0RBVEEobXAsIGV2LGlwLG9mZixsZW4sZmwsbG9jaykgXAogCSgqKG1wKS0+bV9kbV9vcHMtPnhmc19zZW5kX2RhdGEpKGV2LGlwLG9mZixsZW4sZmwsbG9jaykKICNkZWZpbmUgWEZTX1NFTkRfTU1BUChtcCwgdm1hLGZsKSBcCkBAIC0xMDEsMTIgKzEwNCwyNCBAQAogCSgqKG1wKS0+bV9kbV9vcHMtPnhmc19zZW5kX2Rlc3Ryb3kpKGlwLHJpZ2h0KQogI2RlZmluZSBYRlNfU0VORF9OQU1FU1AobXAsIGV2LGIxLHIxLGIyLHIyLG4xLG4yLG1vZGUscnZhbCxmbCkgXAogCSgqKG1wKS0+bV9kbV9vcHMtPnhmc19zZW5kX25hbWVzcCkoZXYsTlVMTCxiMSxyMSxiMixyMixuMSxuMixtb2RlLHJ2YWwsZmwpCi0jZGVmaW5lIFhGU19TRU5EX1BSRVVOTU9VTlQobXAsYjEscjEsYjIscjIsbjEsbjIsbW9kZSxydmFsLGZsKSBcCi0JKCoobXApLT5tX2RtX29wcy0+eGZzX3NlbmRfbmFtZXNwKShETV9FVkVOVF9QUkVVTk1PVU5ULG1wLGIxLHIxLGIyLHIyLG4xLG4yLG1vZGUscnZhbCxmbCkKICNkZWZpbmUgWEZTX1NFTkRfTU9VTlQobXAscmlnaHQscGF0aCxuYW1lKSBcCiAJKCoobXApLT5tX2RtX29wcy0+eGZzX3NlbmRfbW91bnQpKG1wLHJpZ2h0LHBhdGgsbmFtZSkKLSNkZWZpbmUgWEZTX1NFTkRfVU5NT1VOVChtcCwgaXAscmlnaHQsbW9kZSxydmFsLGZsKSBcCi0JKCoobXApLT5tX2RtX29wcy0+eGZzX3NlbmRfdW5tb3VudCkobXAsaXAscmlnaHQsbW9kZSxydmFsLGZsKQorI2RlZmluZSBYRlNfU0VORF9QUkVVTk1PVU5UKG1wKSBcCitkbyB7IFwKKwlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfRE1BUEkpIHsgXAorCQkoKihtcCktPm1fZG1fb3BzLT54ZnNfc2VuZF9uYW1lc3ApKERNX0VWRU5UX1BSRVVOTU9VTlQsIG1wLCBcCisJCQkobXApLT5tX3Jvb3RpcCwgRE1fUklHSFRfTlVMTCwgXAorCQkJKG1wKS0+bV9yb290aXAsIERNX1JJR0hUX05VTEwsIFwKKwkJCU5VTEwsIE5VTEwsIDAsIDAsIFhGU19ETUFQSV9VTk1PVU5UX0ZMQUdTKG1wKSk7IFwKKwl9IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFhGU19TRU5EX1VOTU9VTlQobXApIFwKK2RvIHsgXAorCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9ETUFQSSkgeyBcCisJCSgqKG1wKS0+bV9kbV9vcHMtPnhmc19zZW5kX3VubW91bnQpKG1wLCAobXApLT5tX3Jvb3RpcCwgXAorCQkJRE1fUklHSFRfTlVMTCwgMCwgMCwgWEZTX0RNQVBJX1VOTU9VTlRfRkxBR1MobXApKTsgXAorCX0gXAorfSB3aGlsZSAoMCkKIAogCiAjaWZkZWYgSEFWRV9QRVJDUFVfU0IKQEAgLTM4NywxMyArNDAyLDEzIEBACiAgKiBQZXItY3B1IHN1cGVyYmxvY2sgbG9ja2luZyBmdW5jdGlvbnMKICAqLwogI2lmZGVmIEhBVkVfUEVSQ1BVX1NCCi1TVEFUSUNfSU5MSU5FIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogeGZzX2ljc2JfbG9jayh4ZnNfbW91bnRfdCAqbXApCiB7CiAJbXV0ZXhfbG9jaygmbXAtPm1faWNzYl9tdXRleCk7CiB9CiAKLVNUQVRJQ19JTkxJTkUgdm9pZAorc3RhdGljIGlubGluZSB2b2lkCiB4ZnNfaWNzYl91bmxvY2soeGZzX21vdW50X3QgKm1wKQogewogCW11dGV4X3VubG9jaygmbXAtPm1faWNzYl9tdXRleCk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3J3LmMgYi9mcy94ZnMveGZzX3J3LmMKaW5kZXggM2Y4MTZhZC4uNGMxOTlkMSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ydy5jCisrKyBiL2ZzL3hmcy94ZnNfcncuYwpAQCAtMjc3LDEwICsyNzcsMTAgQEAKIAl4ZnNfYnVmX3QJICpicDsKIAlpbnQJCSBlcnJvcjsKIAotCWlmIChmbGFncykKLQkJYnAgPSB4ZnNfYnVmX3JlYWRfZmxhZ3ModGFyZ2V0LCBibGtubywgbGVuLCBmbGFncyk7Ci0JZWxzZQotCQlicCA9IHhmc19idWZfcmVhZCh0YXJnZXQsIGJsa25vLCBsZW4sIGZsYWdzKTsKKwlpZiAoIWZsYWdzKQorCQlmbGFncyA9IFhCRl9MT0NLIHwgWEJGX01BUFBFRDsKKworCWJwID0geGZzX2J1Zl9yZWFkKHRhcmdldCwgYmxrbm8sIGxlbiwgZmxhZ3MpOwogCWlmICghYnApCiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKIAllcnJvciA9IFhGU19CVUZfR0VURVJST1IoYnApOwpAQCAtMzM2LDMgKzMzNiwyNSBAQAogCX0KIAlyZXR1cm4gKGVycm9yKTsKIH0KKworLyoKKyAqIGhlbHBlciBmdW5jdGlvbiB0byBleHRyYWN0IGV4dGVudCBzaXplIGhpbnQgZnJvbSBpbm9kZQorICovCit4ZnNfZXh0bGVuX3QKK3hmc19nZXRfZXh0c3pfaGludCgKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCkKK3sKKwl4ZnNfZXh0bGVuX3QJCWV4dHN6OworCisJaWYgKHVubGlrZWx5KFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkpKSB7CisJCWV4dHN6ID0gKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX0VYVFNJWkUpCisJCQkJPyBpcC0+aV9kLmRpX2V4dHNpemUKKwkJCQk6IGlwLT5pX21vdW50LT5tX3NiLnNiX3JleHRzaXplOworCQlBU1NFUlQoZXh0c3opOworCX0gZWxzZSB7CisJCWV4dHN6ID0gKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX0VYVFNJWkUpCisJCQkJPyBpcC0+aV9kLmRpX2V4dHNpemUgOiAwOworCX0KKworCXJldHVybiBleHRzejsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcncuaCBiL2ZzL3hmcy94ZnNfcncuaAppbmRleCBmNWU0ODc0Li41NzFmMjE3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3J3LmgKKysrIGIvZnMveGZzL3hmc19ydy5oCkBAIC0zNywzNCArMzcsNiBAQAogfQogCiAvKgotICogRmxhZ3MgZm9yIHhmc19mcmVlX2VvZmJsb2NrcwotICovCi0jZGVmaW5lIFhGU19GUkVFX0VPRl9MT0NLCSgxPDwwKQotI2RlZmluZSBYRlNfRlJFRV9FT0ZfTk9MT0NLCSgxPDwxKQotCi0KLS8qCi0gKiBoZWxwZXIgZnVuY3Rpb24gdG8gZXh0cmFjdCBleHRlbnQgc2l6ZSBoaW50IGZyb20gaW5vZGUKLSAqLwotU1RBVElDX0lOTElORSB4ZnNfZXh0bGVuX3QKLXhmc19nZXRfZXh0c3pfaGludCgKLQl4ZnNfaW5vZGVfdAkqaXApCi17Ci0JeGZzX2V4dGxlbl90CWV4dHN6OwotCi0JaWYgKHVubGlrZWx5KFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkpKSB7Ci0JCWV4dHN6ID0gKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX0VYVFNJWkUpCi0JCQkJPyBpcC0+aV9kLmRpX2V4dHNpemUKLQkJCQk6IGlwLT5pX21vdW50LT5tX3NiLnNiX3JleHRzaXplOwotCQlBU1NFUlQoZXh0c3opOwotCX0gZWxzZSB7Ci0JCWV4dHN6ID0gKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX0VYVFNJWkUpCi0JCQkJPyBpcC0+aV9kLmRpX2V4dHNpemUgOiAwOwotCX0KLQlyZXR1cm4gZXh0c3o7Ci19Ci0KLS8qCiAgKiBQcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgaW4geGZzX3J3LmMuCiAgKi8KIGV4dGVybiBpbnQgeGZzX3dyaXRlX2NsZWFyX3NldHVpZChzdHJ1Y3QgeGZzX2lub2RlICppcCk7CkBAIC03Niw1ICs0OCw2IEBACiAJCQlzdHJ1Y3QgeGZzX2J1ZiAqKmJwcCk7CiBleHRlcm4gdm9pZCB4ZnNfaW9lcnJvcl9hbGVydChjaGFyICpmdW5jLCBzdHJ1Y3QgeGZzX21vdW50ICptcCwKIAkJCQl4ZnNfYnVmX3QgKmJwLCB4ZnNfZGFkZHJfdCBibGtubyk7CitleHRlcm4geGZzX2V4dGxlbl90IHhmc19nZXRfZXh0c3pfaGludChzdHJ1Y3QgeGZzX2lub2RlICppcCk7CiAKICNlbmRpZiAvKiBfX1hGU19SV19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnMuYyBiL2ZzL3hmcy94ZnNfdHJhbnMuYwppbmRleCA2NmI4NDkzLi4yMzdiYWRjIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zLmMKKysrIGIvZnMveGZzL3hmc190cmFucy5jCkBAIC0yMzYsMTkgKzIzNiwyMCBAQAogCXVpbnQJCXR5cGUpCiB7CiAJeGZzX3dhaXRfZm9yX2ZyZWV6ZShtcCwgU0JfRlJFRVpFX1RSQU5TKTsKLQlyZXR1cm4gX3hmc190cmFuc19hbGxvYyhtcCwgdHlwZSk7CisJcmV0dXJuIF94ZnNfdHJhbnNfYWxsb2MobXAsIHR5cGUsIEtNX1NMRUVQKTsKIH0KIAogeGZzX3RyYW5zX3QgKgogX3hmc190cmFuc19hbGxvYygKIAl4ZnNfbW91bnRfdAkqbXAsCi0JdWludAkJdHlwZSkKKwl1aW50CQl0eXBlLAorCXVpbnQJCW1lbWZsYWdzKQogewogCXhmc190cmFuc190CSp0cDsKIAogCWF0b21pY19pbmMoJm1wLT5tX2FjdGl2ZV90cmFucyk7CiAKLQl0cCA9IGttZW1fem9uZV96YWxsb2MoeGZzX3RyYW5zX3pvbmUsIEtNX1NMRUVQKTsKKwl0cCA9IGttZW1fem9uZV96YWxsb2MoeGZzX3RyYW5zX3pvbmUsIG1lbWZsYWdzKTsKIAl0cC0+dF9tYWdpYyA9IFhGU19UUkFOU19NQUdJQzsKIAl0cC0+dF90eXBlID0gdHlwZTsKIAl0cC0+dF9tb3VudHAgPSBtcDsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnMuaCBiL2ZzL3hmcy94ZnNfdHJhbnMuaAppbmRleCBlZDQ3ZmM3Li5hMDU3NGY1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zLmgKKysrIGIvZnMveGZzL3hmc190cmFucy5oCkBAIC05MjQsNyArOTI0LDcgQEAKICAqIFhGUyB0cmFuc2FjdGlvbiBtZWNoYW5pc20gZXhwb3J0ZWQgaW50ZXJmYWNlcy4KICAqLwogeGZzX3RyYW5zX3QJKnhmc190cmFuc19hbGxvYyhzdHJ1Y3QgeGZzX21vdW50ICosIHVpbnQpOwoteGZzX3RyYW5zX3QJKl94ZnNfdHJhbnNfYWxsb2Moc3RydWN0IHhmc19tb3VudCAqLCB1aW50KTsKK3hmc190cmFuc190CSpfeGZzX3RyYW5zX2FsbG9jKHN0cnVjdCB4ZnNfbW91bnQgKiwgdWludCwgdWludCk7CiB4ZnNfdHJhbnNfdAkqeGZzX3RyYW5zX2R1cCh4ZnNfdHJhbnNfdCAqKTsKIGludAkJeGZzX3RyYW5zX3Jlc2VydmUoeGZzX3RyYW5zX3QgKiwgdWludCwgdWludCwgdWludCwKIAkJCQkgIHVpbnQsIHVpbnQpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19idWYuYyBiL2ZzL3hmcy94ZnNfdHJhbnNfYnVmLmMKaW5kZXggMjE4ODI5ZS4uMDNhMWY3MCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFuc19idWYuYworKysgYi9mcy94ZnMveGZzX3RyYW5zX2J1Zi5jCkBAIC03OSwxMSArNzksOCBAQAogCS8qCiAJICogRGVmYXVsdCB0byBhIG5vcm1hbCBnZXRfYnVmKCkgY2FsbCBpZiB0aGUgdHAgaXMgTlVMTC4KIAkgKi8KLQlpZiAodHAgPT0gTlVMTCkgewotCQlicCA9IHhmc19idWZfZ2V0X2ZsYWdzKHRhcmdldF9kZXYsIGJsa25vLCBsZW4sCi0JCQkJCQkJZmxhZ3MgfCBCVUZfQlVTWSk7Ci0JCXJldHVybihicCk7Ci0JfQorCWlmICh0cCA9PSBOVUxMKQorCQlyZXR1cm4geGZzX2J1Zl9nZXQodGFyZ2V0X2RldiwgYmxrbm8sIGxlbiwgZmxhZ3MgfCBCVUZfQlVTWSk7CiAKIAkvKgogCSAqIElmIHdlIGZpbmQgdGhlIGJ1ZmZlciBpbiB0aGUgY2FjaGUgd2l0aCB0aGlzIHRyYW5zYWN0aW9uCkBAIC0xMjksNyArMTI2LDcgQEAKIAkgKiBlYXNpbHkgZGVhZGxvY2sgd2l0aCBvdXIgY3VycmVudCB0cmFuc2FjdGlvbiBhcyB3ZWxsIGFzIGNhdXNlCiAJICogdXMgdG8gcnVuIG91dCBvZiBzdGFjayBzcGFjZS4KIAkgKi8KLQlicCA9IHhmc19idWZfZ2V0X2ZsYWdzKHRhcmdldF9kZXYsIGJsa25vLCBsZW4sIGZsYWdzIHwgQlVGX0JVU1kpOworCWJwID0geGZzX2J1Zl9nZXQodGFyZ2V0X2RldiwgYmxrbm8sIGxlbiwgZmxhZ3MgfCBCVUZfQlVTWSk7CiAJaWYgKGJwID09IE5VTEwpIHsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMzAyLDcgKzI5OSw3IEBACiAJICogRGVmYXVsdCB0byBhIG5vcm1hbCBnZXRfYnVmKCkgY2FsbCBpZiB0aGUgdHAgaXMgTlVMTC4KIAkgKi8KIAlpZiAodHAgPT0gTlVMTCkgewotCQlicCA9IHhmc19idWZfcmVhZF9mbGFncyh0YXJnZXQsIGJsa25vLCBsZW4sIGZsYWdzIHwgQlVGX0JVU1kpOworCQlicCA9IHhmc19idWZfcmVhZCh0YXJnZXQsIGJsa25vLCBsZW4sIGZsYWdzIHwgQlVGX0JVU1kpOwogCQlpZiAoIWJwKQogCQkJcmV0dXJuIChmbGFncyAmIFhGU19CVUZfVFJZTE9DSykgPwogCQkJCQlFQUdBSU4gOiBYRlNfRVJST1IoRU5PTUVNKTsKQEAgLTM5OCw3ICszOTUsNyBAQAogCSAqIGVhc2lseSBkZWFkbG9jayB3aXRoIG91ciBjdXJyZW50IHRyYW5zYWN0aW9uIGFzIHdlbGwgYXMgY2F1c2UKIAkgKiB1cyB0byBydW4gb3V0IG9mIHN0YWNrIHNwYWNlLgogCSAqLwotCWJwID0geGZzX2J1Zl9yZWFkX2ZsYWdzKHRhcmdldCwgYmxrbm8sIGxlbiwgZmxhZ3MgfCBCVUZfQlVTWSk7CisJYnAgPSB4ZnNfYnVmX3JlYWQodGFyZ2V0LCBibGtubywgbGVuLCBmbGFncyB8IEJVRl9CVVNZKTsKIAlpZiAoYnAgPT0gTlVMTCkgewogCQkqYnBwID0gTlVMTDsKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3Zub2Rlb3BzLmMgYi9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKaW5kZXggYjU3MmY3ZS4uNTc4ZjNmNSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc192bm9kZW9wcy5jCisrKyBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYwpAQCAtNTM4LDkgKzUzOCw4IEBACiAJCWQgPSBYRlNfRlNCX1RPX0RBRERSKG1wLCBtdmFsW25dLmJyX3N0YXJ0YmxvY2spOwogCQlieXRlX2NudCA9IFhGU19GU0JfVE9fQihtcCwgbXZhbFtuXS5icl9ibG9ja2NvdW50KTsKIAotCQlicCA9IHhmc19idWZfcmVhZF9mbGFncyhtcC0+bV9kZGV2X3RhcmdwLCBkLCBCVE9CQihieXRlX2NudCksCi0JCQkJCVhCRl9MT0NLIHwgWEJGX01BUFBFRCB8Ci0JCQkJCVhCRl9ET05UX0JMT0NLKTsKKwkJYnAgPSB4ZnNfYnVmX3JlYWQobXAtPm1fZGRldl90YXJncCwgZCwgQlRPQkIoYnl0ZV9jbnQpLAorCQkJCSAgWEJGX0xPQ0sgfCBYQkZfTUFQUEVEIHwgWEJGX0RPTlRfQkxPQ0spOwogCQllcnJvciA9IFhGU19CVUZfR0VURVJST1IoYnApOwogCQlpZiAoZXJyb3IpIHsKIAkJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4ZnNfcmVhZGxpbmsiLApAQCAtNzA5LDYgKzcwOCwxMSBAQAogfQogCiAvKgorICogRmxhZ3MgZm9yIHhmc19mcmVlX2VvZmJsb2NrcworICovCisjZGVmaW5lIFhGU19GUkVFX0VPRl9UUllMT0NLCSgxPDwwKQorCisvKgogICogVGhpcyBpcyBjYWxsZWQgYnkgeGZzX2luYWN0aXZlIHRvIGZyZWUgYW55IGJsb2NrcyBiZXlvbmQgZW9mCiAgKiB3aGVuIHRoZSBsaW5rIGNvdW50IGlzbid0IHplcm8gYW5kIGJ5IHhmc19kbV9wdW5jaF9ob2xlKCkgd2hlbgogICogcHVuY2hpbmcgYSBob2xlIHRvIEVPRi4KQEAgLTcyNiw3ICs3MzAsNiBAQAogCXhmc19maWxibGtzX3QJbWFwX2xlbjsKIAlpbnQJCW5pbWFwczsKIAl4ZnNfYm1idF9pcmVjX3QJaW1hcDsKLQlpbnQJCXVzZV9pb2xvY2sgPSAoZmxhZ3MgJiBYRlNfRlJFRV9FT0ZfTE9DSyk7CiAKIAkvKgogCSAqIEZpZ3VyZSBvdXQgaWYgdGhlcmUgYXJlIGFueSBibG9ja3MgYmV5b25kIHRoZSBlbmQKQEAgLTc2OCwxNCArNzcxLDE5IEBACiAJCSAqIGNhY2hlIGFuZCB3ZSBjYW4ndAogCQkgKiBkbyB0aGF0IHdpdGhpbiBhIHRyYW5zYWN0aW9uLgogCQkgKi8KLQkJaWYgKHVzZV9pb2xvY2spCisJCWlmIChmbGFncyAmIFhGU19GUkVFX0VPRl9UUllMT0NLKSB7CisJCQlpZiAoIXhmc19pbG9ja19ub3dhaXQoaXAsIFhGU19JT0xPQ0tfRVhDTCkpIHsKKwkJCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSBlbHNlIHsKIAkJCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKKwkJfQogCQllcnJvciA9IHhmc19pdHJ1bmNhdGVfc3RhcnQoaXAsIFhGU19JVFJVTkNfREVGSU5JVEUsCiAJCQkJICAgIGlwLT5pX3NpemUpOwogCQlpZiAoZXJyb3IpIHsKIAkJCXhmc190cmFuc19jYW5jZWwodHAsIDApOwotCQkJaWYgKHVzZV9pb2xvY2spCi0JCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CisJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKIAkJCXJldHVybiBlcnJvcjsKIAkJfQogCkBAIC04MTIsOCArODIwLDcgQEAKIAkJCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwKIAkJCQkJCVhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMpOwogCQl9Ci0JCXhmc19pdW5sb2NrKGlwLCAodXNlX2lvbG9jayA/IChYRlNfSU9MT0NLX0VYQ0x8WEZTX0lMT0NLX0VYQ0wpCi0JCQkJCSAgICA6IFhGU19JTE9DS19FWENMKSk7CisJCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0x8WEZTX0lMT0NLX0VYQ0wpOwogCX0KIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0xMTEzLDcgKzExMjAsMTcgQEAKIAkJICAgICAoaXAtPmlfZGYuaWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSkgICYmCiAJCSAgICAoIShpcC0+aV9kLmRpX2ZsYWdzICYKIAkJCQkoWEZTX0RJRkxBR19QUkVBTExPQyB8IFhGU19ESUZMQUdfQVBQRU5EKSkpKSB7Ci0JCQllcnJvciA9IHhmc19mcmVlX2VvZmJsb2NrcyhtcCwgaXAsIFhGU19GUkVFX0VPRl9MT0NLKTsKKworCQkJLyoKKwkJCSAqIElmIHdlIGNhbid0IGdldCB0aGUgaW9sb2NrIGp1c3Qgc2tpcCB0cnVuY2F0aW5nCisJCQkgKiB0aGUgYmxvY2tzIHBhc3QgRU9GIGJlY2F1c2Ugd2UgY291bGQgZGVhZGxvY2sKKwkJCSAqIHdpdGggdGhlIG1tYXBfc2VtIG90aGVyd2lzZS4gIFdlJ2xsIGdldCBhbm90aGVyCisJCQkgKiBjaGFuY2UgdG8gZHJvcCB0aGVtIG9uY2UgdGhlIGxhc3QgcmVmZXJlbmNlIHRvCisJCQkgKiB0aGUgaW5vZGUgaXMgZHJvcHBlZCwgc28gd2UnbGwgbmV2ZXIgbGVhayBibG9ja3MKKwkJCSAqIHBlcm1hbmVudGx5LgorCQkJICovCisJCQllcnJvciA9IHhmc19mcmVlX2VvZmJsb2NrcyhtcCwgaXAsCisJCQkJCQkgICBYRlNfRlJFRV9FT0ZfVFJZTE9DSyk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJcmV0dXJuIGVycm9yOwogCQl9CkBAIC0xMTg0LDcgKzEyMDEsNyBAQAogCQkgICAgICghKGlwLT5pX2QuZGlfZmxhZ3MgJgogCQkJCShYRlNfRElGTEFHX1BSRUFMTE9DIHwgWEZTX0RJRkxBR19BUFBFTkQpKSB8fAogCQkgICAgICAoaXAtPmlfZGVsYXllZF9ibGtzICE9IDApKSkpIHsKLQkJCWVycm9yID0geGZzX2ZyZWVfZW9mYmxvY2tzKG1wLCBpcCwgWEZTX0ZSRUVfRU9GX0xPQ0spOworCQkJZXJyb3IgPSB4ZnNfZnJlZV9lb2ZibG9ja3MobXAsIGlwLCAwKTsKIAkJCWlmIChlcnJvcikKIAkJCQlyZXR1cm4gVk5fSU5BQ1RJVkVfQ0FDSEU7CiAJCX0KQEAgLTI0NTYsNDYgKzI0NzMsNiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotaW50Ci14ZnNfcmVjbGFpbSgKLQl4ZnNfaW5vZGVfdAkqaXApCi17Ci0KLQl4ZnNfaXRyYWNlX2VudHJ5KGlwKTsKLQotCUFTU0VSVCghVk5fTUFQUEVEKFZGU19JKGlwKSkpOwotCi0JLyogYmFkIGlub2RlLCBnZXQgb3V0IGhlcmUgQVNBUCAqLwotCWlmIChpc19iYWRfaW5vZGUoVkZTX0koaXApKSkgewotCQl4ZnNfaXJlY2xhaW0oaXApOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl4ZnNfaW9lbmRfd2FpdChpcCk7Ci0KLQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkgfHwgaXAtPmlfZGVsYXllZF9ibGtzID09IDApOwotCi0JLyoKLQkgKiBJZiB3ZSBoYXZlIG5vdGhpbmcgdG8gZmx1c2ggd2l0aCB0aGlzIGlub2RlIHRoZW4gY29tcGxldGUgdGhlCi0JICogdGVhcmRvd24gbm93LCBvdGhlcndpc2UgYnJlYWsgdGhlIGxpbmsgYmV0d2VlbiB0aGUgeGZzIGlub2RlIGFuZCB0aGUKLQkgKiBsaW51eCBpbm9kZSBhbmQgY2xlYW4gdXAgdGhlIHhmcyBpbm9kZSBsYXRlci4gVGhpcyBhdm9pZHMgZmx1c2hpbmcKLQkgKiB0aGUgaW5vZGUgdG8gZGlzayBkdXJpbmcgdGhlIGRlbGV0ZSBvcGVyYXRpb24gaXRzZWxmLgotCSAqCi0JICogV2hlbiBicmVha2luZyB0aGUgbGluaywgd2UgbmVlZCB0byBzZXQgdGhlIFhGU19JUkVDTEFJTUFCTEUgZmxhZwotCSAqIGZpcnN0IHRvIGVuc3VyZSB0aGF0IHhmc19pdW5waW4oKSB3aWxsIG5ldmVyIHNlZSBhbiB4ZnMgaW5vZGUKLQkgKiB0aGF0IGhhcyBhIGxpbnV4IGlub2RlIGJlaW5nIHJlY2xhaW1lZC4gU3luY2hyb25pc2F0aW9uIGlzIHByb3ZpZGVkCi0JICogYnkgdGhlIGlfZmxhZ3NfbG9jay4KLQkgKi8KLQlpZiAoIWlwLT5pX3VwZGF0ZV9jb3JlICYmIChpcC0+aV9pdGVtcCA9PSBOVUxMKSkgewotCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQkJeGZzX2lmbG9jayhpcCk7Ci0JCXhmc19pZmxhZ3Nfc2V0KGlwLCBYRlNfSVJFQ0xBSU1BQkxFKTsKLQkJcmV0dXJuIHhmc19yZWNsYWltX2lub2RlKGlwLCAxLCBYRlNfSUZMVVNIX0RFTFdSSV9FTFNFX1NZTkMpOwotCX0KLQl4ZnNfaW5vZGVfc2V0X3JlY2xhaW1fdGFnKGlwKTsKLQlyZXR1cm4gMDsKLX0KLQogLyoKICAqIHhmc19hbGxvY19maWxlX3NwYWNlKCkKICAqICAgICAgVGhpcyByb3V0aW5lIGFsbG9jYXRlcyBkaXNrIHNwYWNlIGZvciB0aGUgZ2l2ZW4gZmlsZS4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdm5vZGVvcHMuaCBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuaAppbmRleCBhOWUxMDJkLi4xNjdhNDY3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3Zub2Rlb3BzLmgKKysrIGIvZnMveGZzL3hmc192bm9kZW9wcy5oCkBAIC0zOCw3ICszOCw2IEBACiAJCWNvbnN0IGNoYXIgKnRhcmdldF9wYXRoLCBtb2RlX3QgbW9kZSwgc3RydWN0IHhmc19pbm9kZSAqKmlwcCwKIAkJY3JlZF90ICpjcmVkcCk7CiBpbnQgeGZzX3NldF9kbWF0dHJzKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCB1X2ludCBldm1hc2ssIHVfaW50MTZfdCBzdGF0ZSk7Ci1pbnQgeGZzX3JlY2xhaW0oc3RydWN0IHhmc19pbm9kZSAqaXApOwogaW50IHhmc19jaGFuZ2VfZmlsZV9zcGFjZShzdHJ1Y3QgeGZzX2lub2RlICppcCwgaW50IGNtZCwKIAkJeGZzX2Zsb2NrNjRfdCAqYmYsIHhmc19vZmZfdCBvZmZzZXQsIGludCBhdHRyX2ZsYWdzKTsKIGludCB4ZnNfcmVuYW1lKHN0cnVjdCB4ZnNfaW5vZGUgKnNyY19kcCwgc3RydWN0IHhmc19uYW1lICpzcmNfbmFtZSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpX2hlc3QuaCBiL2luY2x1ZGUvYWNwaS9hY3BpX2hlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzE5NGQwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlfaGVzdC5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX19BQ1BJX0hFU1RfSAorI2RlZmluZSBfX0FDUElfSEVTVF9ICisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2lmZGVmIENPTkZJR19BQ1BJCitleHRlcm4gaW50IGFjcGlfaGVzdF9maXJtd2FyZV9maXJzdF9wY2koc3RydWN0IHBjaV9kZXYgKnBjaSk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgYWNwaV9oZXN0X2Zpcm13YXJlX2ZpcnN0X3BjaShzdHJ1Y3QgcGNpX2RldiAqcGNpKSB7IHJldHVybiAwOyB9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKaW5kZXggNzQwYWMzYS4uOGI2NjhlYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaApAQCAtMjk1LDYgKzI5NSw3IEBACiB2b2lkIGFjcGlfcHJvY2Vzc29yX3BwY19pbml0KHZvaWQpOwogdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wcGNfZXhpdCh2b2lkKTsKIGludCBhY3BpX3Byb2Nlc3Nvcl9wcGNfaGFzX2NoYW5nZWQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcik7CitleHRlcm4gaW50IGFjcGlfcHJvY2Vzc29yX2dldF9iaW9zX2xpbWl0KGludCBjcHUsIHVuc2lnbmVkIGludCAqbGltaXQpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wcGNfaW5pdCh2b2lkKQogewpAQCAtMzE2LDYgKzMxNywxMSBAQAogCX0KIAlyZXR1cm4gMDsKIH0KK3N0YXRpYyBpbmxpbmUgaW50IGFjcGlfcHJvY2Vzc29yX2dldF9iaW9zX2xpbWl0KGludCBjcHUsIHVuc2lnbmVkIGludCAqbGltaXQpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKICNlbmRpZgkJCQkvKiBDT05GSUdfQ1BVX0ZSRVEgKi8KIAogLyogaW4gcHJvY2Vzc29yX3Rocm90dGxpbmcuYyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9mY250bC5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9mY250bC5oCmluZGV4IDQ5NWRjOGEuLjY4MWRkZjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvZmNudGwuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2ZjbnRsLmgKQEAgLTMsOCArMyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCi0vKiBvcGVuL2ZjbnRsIC0gT19TWU5DIGlzIG9ubHkgaW1wbGVtZW50ZWQgb24gYmxvY2tzIGRldmljZXMgYW5kIG9uIGZpbGVzCi0gICBsb2NhdGVkIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KICNkZWZpbmUgT19BQ0NNT0RFCTAwMDAwMDAzCiAjZGVmaW5lIE9fUkRPTkxZCTAwMDAwMDAwCiAjZGVmaW5lIE9fV1JPTkxZCTAwMDAwMDAxCkBAIC0yNyw4ICsyNSw4IEBACiAjaWZuZGVmIE9fTk9OQkxPQ0sKICNkZWZpbmUgT19OT05CTE9DSwkwMDAwNDAwMAogI2VuZGlmCi0jaWZuZGVmIE9fU1lOQwotI2RlZmluZSBPX1NZTkMJCTAwMDEwMDAwCisjaWZuZGVmIE9fRFNZTkMKKyNkZWZpbmUgT19EU1lOQwkJMDAwMTAwMDAJLyogdXNlZCB0byBiZSBPX1NZTkMsIHNlZSBiZWxvdyAqLwogI2VuZGlmCiAjaWZuZGVmIEZBU1lOQwogI2RlZmluZSBGQVNZTkMJCTAwMDIwMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KQEAgLTUxLDYgKzQ5LDI1IEBACiAjaWZuZGVmIE9fQ0xPRVhFQwogI2RlZmluZSBPX0NMT0VYRUMJMDIwMDAwMDAJLyogc2V0IGNsb3NlX29uX2V4ZWMgKi8KICNlbmRpZgorCisvKgorICogQmVmb3JlIExpbnV4IDIuNi4zMiBvbmx5IE9fRFNZTkMgc2VtYW50aWNzIHdlcmUgaW1wbGVtZW50ZWQsIGJ1dCB1c2luZworICogdGhlIE9fU1lOQyBmbGFnLiAgV2UgY29udGludWUgdG8gdXNlIHRoZSBleGlzdGluZyBudW1lcmljYWwgdmFsdWUKKyAqIGZvciBPX0RTWU5DIHNlbWFudGljcyBub3csIGJ1dCB1c2luZyB0aGUgY29ycmVjdCBzeW1ib2xpYyBuYW1lIGZvciBpdC4KKyAqIFRoaXMgbmV3IHZhbHVlIGlzIHVzZWQgdG8gcmVxdWVzdCB0cnVlIFBvc2l4IE9fU1lOQyBzZW1hbnRpY3MuICBJdCBpcworICogZGVmaW5lZCBpbiB0aGlzIHN0cmFuZ2Ugd2F5IHRvIG1ha2Ugc3VyZSBhcHBsaWNhdGlvbnMgY29tcGlsZWQgYWdhaW5zdAorICogbmV3IGhlYWRlcnMgZ2V0IGF0IGxlYXN0IE9fRFNZTkMgc2VtYW50aWNzIG9uIG9sZGVyIGtlcm5lbHMuCisgKgorICogVGhpcyBoYXMgdGhlIG5pY2Ugc2lkZS1lZmZlY3QgdGhhdCB3ZSBjYW4gc2ltcGx5IHRlc3QgZm9yIE9fRFNZTkMKKyAqIHdoZXJldmVyIHdlIGRvIG5vdCBjYXJlIGlmIE9fRFNZTkMgb3IgT19TWU5DIGlzIHVzZWQuCisgKgorICogTm90ZTogX19PX1NZTkMgbXVzdCBuZXZlciBiZSB1c2VkIGRpcmVjdGx5LgorICovCisjaWZuZGVmIE9fU1lOQworI2RlZmluZSBfX09fU1lOQwkwNDAwMDAwMAorI2RlZmluZSBPX1NZTkMJCShfX09fU1lOQ3xPX0RTWU5DKQorI2VuZGlmCisKICNpZm5kZWYgT19OREVMQVkKICNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZ3Bpby5oCmluZGV4IDY2ZDYxMDYuLjIwNGJlZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvZ3Bpby5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZ3Bpby5oCkBAIC0yOCw2ICsyOCw3IEBACiAJcmV0dXJuICgodW5zaWduZWQpbnVtYmVyKSA8IEFSQ0hfTlJfR1BJT1M7CiB9CiAKK3N0cnVjdCBkZXZpY2U7CiBzdHJ1Y3Qgc2VxX2ZpbGU7CiBzdHJ1Y3QgbW9kdWxlOwogCkBAIC0xODEsNiArMTgyLDggQEAKIAogI2lmbmRlZiBDT05GSUdfR1BJT19TWVNGUwogCitzdHJ1Y3QgZGV2aWNlOworCiAvKiBzeXNmcyBzdXBwb3J0IGlzIG9ubHkgYXZhaWxhYmxlIHdpdGggZ3Bpb2xpYiwgd2hlcmUgaXQncyBvcHRpb25hbCAqLwogCiBzdGF0aWMgaW5saW5lIGludCBncGlvX2V4cG9ydCh1bnNpZ25lZCBncGlvLCBib29sIGRpcmVjdGlvbl9tYXlfY2hhbmdlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdW5pc3RkLmgKaW5kZXggN2MzOGMxNC4uNmEwYjMwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3VuaXN0ZC5oCkBAIC02MjIsOSArNjIyLDEzIEBACiBfX1NZU0NBTEwoX19OUl9ydF90Z3NpZ3F1ZXVlaW5mbywgc3lzX3J0X3Rnc2lncXVldWVpbmZvKQogI2RlZmluZSBfX05SX3BlcmZfZXZlbnRfb3BlbiAyNDEKIF9fU1lTQ0FMTChfX05SX3BlcmZfZXZlbnRfb3Blbiwgc3lzX3BlcmZfZXZlbnRfb3BlbikKKyNkZWZpbmUgX19OUl9hY2NlcHQ0IDI0MgorX19TWVNDQUxMKF9fTlJfYWNjZXB0NCwgc3lzX2FjY2VwdDQpCisjZGVmaW5lIF9fTlJfcmVjdm1tc2cgMjQzCitfX1NZU0NBTEwoX19OUl9yZWN2bW1zZywgc3lzX3JlY3ZtbXNnKQogCiAjdW5kZWYgX19OUl9zeXNjYWxscwotI2RlZmluZSBfX05SX3N5c2NhbGxzIDI0MgorI2RlZmluZSBfX05SX3N5c2NhbGxzIDI0NAogCiAvKgogICogQWxsIHN5c2NhbGxzIGJlbG93IGhlcmUgc2hvdWxkIGdvIGF3YXkgcmVhbGx5LApAQCAtODAyLDcgKzgwNiw3IEBACiAjZGVmaW5lIF9fTlJfc3RhdGZzIF9fTlIzMjY0X3N0YXRmcwogI2RlZmluZSBfX05SX2ZzdGF0ZnMgX19OUjMyNjRfZnN0YXRmcwogI2RlZmluZSBfX05SX3RydW5jYXRlIF9fTlIzMjY0X3RydW5jYXRlCi0jZGVmaW5lIF9fTlJfZnRydW5jYXRlIF9fTlIzMjY0X3RydW5jYXRlCisjZGVmaW5lIF9fTlJfZnRydW5jYXRlIF9fTlIzMjY0X2Z0cnVuY2F0ZQogI2RlZmluZSBfX05SX2xzZWVrIF9fTlIzMjY0X2xzZWVrCiAjZGVmaW5lIF9fTlJfc2VuZGZpbGUgX19OUjMyNjRfc2VuZGZpbGUKICNkZWZpbmUgX19OUl9uZXdmc3RhdGF0IF9fTlIzMjY0X2ZzdGF0YXQKQEAgLTgxOCw3ICs4MjIsNyBAQAogI2RlZmluZSBfX05SX3N0YXRmczY0IF9fTlIzMjY0X3N0YXRmcwogI2RlZmluZSBfX05SX2ZzdGF0ZnM2NCBfX05SMzI2NF9mc3RhdGZzCiAjZGVmaW5lIF9fTlJfdHJ1bmNhdGU2NCBfX05SMzI2NF90cnVuY2F0ZQotI2RlZmluZSBfX05SX2Z0cnVuY2F0ZTY0IF9fTlIzMjY0X3RydW5jYXRlCisjZGVmaW5lIF9fTlJfZnRydW5jYXRlNjQgX19OUjMyNjRfZnRydW5jYXRlCiAjZGVmaW5lIF9fTlJfbGxzZWVrIF9fTlIzMjY0X2xzZWVrCiAjZGVmaW5lIF9fTlJfc2VuZGZpbGU2NCBfX05SMzI2NF9zZW5kZmlsZQogI2RlZmluZSBfX05SX2ZzdGF0YXQ2NCBfX05SMzI2NF9mc3RhdGF0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9LYnVpbGQgYi9pbmNsdWRlL2RybS9LYnVpbGQKaW5kZXggYjk0MGZkZi4uY2ZhNmFmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vS2J1aWxkCisrKyBiL2luY2x1ZGUvZHJtL0tidWlsZApAQCAtOCwzICs4LDQgQEAKIHVuaWZkZWYteSArPSBzaXNfZHJtLmgKIHVuaWZkZWYteSArPSBzYXZhZ2VfZHJtLmgKIHVuaWZkZWYteSArPSB2aWFfZHJtLmgKK3VuaWZkZWYteSArPSBub3V2ZWF1X2RybS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm0uaCBiL2luY2x1ZGUvZHJtL2RybS5oCmluZGV4IDdjYjUwYmQuLmUzZjQ2ZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybS5oCisrKyBiL2luY2x1ZGUvZHJtL2RybS5oCkBAIC0zNiwxNyArMzYsMjcgQEAKICNpZm5kZWYgX0RSTV9IXwogI2RlZmluZSBfRFJNX0hfCiAKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgkJLyogRm9yIF9JTyogbWFjcm9zICovCi0jZGVmaW5lIERSTV9JT0NUTF9OUihuKQkJX0lPQ19OUihuKQotI2RlZmluZSBEUk1fSU9DX1ZPSUQJCV9JT0NfTk9ORQotI2RlZmluZSBEUk1fSU9DX1JFQUQJCV9JT0NfUkVBRAotI2RlZmluZSBEUk1fSU9DX1dSSVRFCQlfSU9DX1dSSVRFCi0jZGVmaW5lIERSTV9JT0NfUkVBRFdSSVRFCV9JT0NfUkVBRHxfSU9DX1dSSVRFCi0jZGVmaW5lIERSTV9JT0MoZGlyLCBncm91cCwgbnIsIHNpemUpIF9JT0MoZGlyLCBncm91cCwgbnIsIHNpemUpCisjaWYgZGVmaW5lZChfX2xpbnV4X18pCiAKLSNkZWZpbmUgRFJNX01BSk9SICAgICAgIDIyNgotI2RlZmluZSBEUk1fTUFYX01JTk9SICAgMTUKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgordHlwZWRlZiB1bnNpZ25lZCBpbnQgZHJtX2hhbmRsZV90OworCisjZWxzZSAvKiBPbmUgb2YgdGhlIEJTRHMgKi8KKworI2luY2x1ZGUgPHN5cy9pb2Njb20uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK3R5cGVkZWYgaW50OF90ICAgX19zODsKK3R5cGVkZWYgdWludDhfdCAgX191ODsKK3R5cGVkZWYgaW50MTZfdCAgX19zMTY7Cit0eXBlZGVmIHVpbnQxNl90IF9fdTE2OwordHlwZWRlZiBpbnQzMl90ICBfX3MzMjsKK3R5cGVkZWYgdWludDMyX3QgX191MzI7Cit0eXBlZGVmIGludDY0X3QgIF9fczY0OwordHlwZWRlZiB1aW50NjRfdCBfX3U2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBkcm1faGFuZGxlX3Q7CisKKyNlbmRpZgogCiAjZGVmaW5lIERSTV9OQU1FCSJkcm0iCSAgLyoqPCBOYW1lIGluIGtlcm5lbCwgL2RldiwgYW5kIC9wcm9jICovCiAjZGVmaW5lIERSTV9NSU5fT1JERVIJNQkgIC8qKjwgQXQgbGVhc3QgMl41IGJ5dGVzID0gMzIgYnl0ZXMgKi8KQEAgLTU5LDcgKzY5LDYgQEAKICNkZWZpbmUgX0RSTV9MT0NLX0lTX0NPTlQobG9jaykJICAgKChsb2NrKSAmIF9EUk1fTE9DS19DT05UKQogI2RlZmluZSBfRFJNX0xPQ0tJTkdfQ09OVEVYVChsb2NrKSAoKGxvY2spICYgfihfRFJNX0xPQ0tfSEVMRHxfRFJNX0xPQ0tfQ09OVCkpCiAKLXR5cGVkZWYgdW5zaWduZWQgaW50IGRybV9oYW5kbGVfdDsKIHR5cGVkZWYgdW5zaWduZWQgaW50IGRybV9jb250ZXh0X3Q7CiB0eXBlZGVmIHVuc2lnbmVkIGludCBkcm1fZHJhd2FibGVfdDsKIHR5cGVkZWYgdW5zaWduZWQgaW50IGRybV9tYWdpY190OwpAQCAtNDU0LDYgKzQ2Myw3IEBACiBlbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgewogCV9EUk1fVkJMQU5LX0FCU09MVVRFID0gMHgwLAkvKio8IFdhaXQgZm9yIHNwZWNpZmljIHZibGFuayBzZXF1ZW5jZSBudW1iZXIgKi8KIAlfRFJNX1ZCTEFOS19SRUxBVElWRSA9IDB4MSwJLyoqPCBXYWl0IGZvciBnaXZlbiBudW1iZXIgb2YgdmJsYW5rcyAqLworCV9EUk1fVkJMQU5LX0VWRU5UID0gMHg0MDAwMDAwLCAgIC8qKjwgU2VuZCBldmVudCBpbnN0ZWFkIG9mIGJsb2NraW5nICovCiAJX0RSTV9WQkxBTktfRkxJUCA9IDB4ODAwMDAwMCwgICAvKio8IFNjaGVkdWxlZCBidWZmZXIgc3dhcCBzaG91bGQgZmxpcCAqLwogCV9EUk1fVkJMQU5LX05FWFRPTk1JU1MgPSAweDEwMDAwMDAwLAkvKio8IElmIG1pc3NlZCwgd2FpdCBmb3IgbmV4dCB2YmxhbmsgKi8KIAlfRFJNX1ZCTEFOS19TRUNPTkRBUlkgPSAweDIwMDAwMDAwLAkvKio8IFNlY29uZGFyeSBkaXNwbGF5IGNvbnRyb2xsZXIgKi8KQEAgLTQ2MSw4ICs0NzEsOCBAQAogfTsKIAogI2RlZmluZSBfRFJNX1ZCTEFOS19UWVBFU19NQVNLIChfRFJNX1ZCTEFOS19BQlNPTFVURSB8IF9EUk1fVkJMQU5LX1JFTEFUSVZFKQotI2RlZmluZSBfRFJNX1ZCTEFOS19GTEFHU19NQVNLIChfRFJNX1ZCTEFOS19TSUdOQUwgfCBfRFJNX1ZCTEFOS19TRUNPTkRBUlkgfCBcCi0JCQkJX0RSTV9WQkxBTktfTkVYVE9OTUlTUykKKyNkZWZpbmUgX0RSTV9WQkxBTktfRkxBR1NfTUFTSyAoX0RSTV9WQkxBTktfRVZFTlQgfCBfRFJNX1ZCTEFOS19TSUdOQUwgfCBcCisJCQkJX0RSTV9WQkxBTktfU0VDT05EQVJZIHwgX0RSTV9WQkxBTktfTkVYVE9OTUlTUykKIAogc3RydWN0IGRybV93YWl0X3ZibGFua19yZXF1ZXN0IHsKIAllbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgdHlwZTsKQEAgLTY4Niw2ICs2OTYsOCBAQAogI2RlZmluZSBEUk1fSU9DVExfTU9ERV9HRVRGQgkJRFJNX0lPV1IoMHhBRCwgc3RydWN0IGRybV9tb2RlX2ZiX2NtZCkKICNkZWZpbmUgRFJNX0lPQ1RMX01PREVfQURERkIJCURSTV9JT1dSKDB4QUUsIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQpCiAjZGVmaW5lIERSTV9JT0NUTF9NT0RFX1JNRkIJCURSTV9JT1dSKDB4QUYsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfUEFHRV9GTElQCURSTV9JT1dSKDB4QjAsIHN0cnVjdCBkcm1fbW9kZV9jcnRjX3BhZ2VfZmxpcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfRElSVFlGQgkJRFJNX0lPV1IoMHhCMSwgc3RydWN0IGRybV9tb2RlX2ZiX2RpcnR5X2NtZCkKIAogLyoqCiAgKiBEZXZpY2Ugc3BlY2lmaWMgaW9jdGxzIHNob3VsZCBvbmx5IGJlIGluIHRoZWlyIHJlc3BlY3RpdmUgaGVhZGVycwpAQCAtNjk4LDYgKzcxMCwzNSBAQAogI2RlZmluZSBEUk1fQ09NTUFORF9CQVNFICAgICAgICAgICAgICAgIDB4NDAKICNkZWZpbmUgRFJNX0NPTU1BTkRfRU5ECQkJMHhBMAogCisvKioKKyAqIEhlYWRlciBmb3IgZXZlbnRzIHdyaXR0ZW4gYmFjayB0byB1c2Vyc3BhY2Ugb24gdGhlIGRybSBmZC4gIFRoZQorICogdHlwZSBkZWZpbmVzIHRoZSB0eXBlIG9mIGV2ZW50LCB0aGUgbGVuZ3RoIHNwZWNpZmllcyB0aGUgdG90YWwKKyAqIGxlbmd0aCBvZiB0aGUgZXZlbnQgKGluY2x1ZGluZyB0aGUgaGVhZGVyKSwgYW5kIHVzZXJfZGF0YSBpcworICogdHlwaWNhbGx5IGEgNjQgYml0IHZhbHVlIHBhc3NlZCB3aXRoIHRoZSBpb2N0bCB0aGF0IHRyaWdnZXJlZCB0aGUKKyAqIGV2ZW50LiAgQSByZWFkIG9uIHRoZSBkcm0gZmQgd2lsbCBhbHdheXMgb25seSByZXR1cm4gY29tcGxldGUKKyAqIGV2ZW50cywgdGhhdCBpcywgaWYgZm9yIGV4YW1wbGUgdGhlIHJlYWQgYnVmZmVyIGlzIDEwMCBieXRlcywgYW5kCisgKiB0aGVyZSBhcmUgdHdvIDY0IGJ5dGUgZXZlbnRzIHBlbmRpbmcsIG9ubHkgb25lIHdpbGwgYmUgcmV0dXJuZWQuCisgKgorICogRXZlbnQgdHlwZXMgMCAtIDB4N2ZmZmZmZmYgYXJlIGdlbmVyaWMgZHJtIGV2ZW50cywgMHg4MDAwMDAwMCBhbmQKKyAqIHVwIGFyZSBjaGlwc2V0IHNwZWNpZmljLgorICovCitzdHJ1Y3QgZHJtX2V2ZW50IHsKKwlfX3UzMiB0eXBlOworCV9fdTMyIGxlbmd0aDsKK307CisKKyNkZWZpbmUgRFJNX0VWRU5UX1ZCTEFOSyAweDAxCisjZGVmaW5lIERSTV9FVkVOVF9GTElQX0NPTVBMRVRFIDB4MDIKKworc3RydWN0IGRybV9ldmVudF92YmxhbmsgeworCXN0cnVjdCBkcm1fZXZlbnQgYmFzZTsKKwlfX3U2NCB1c2VyX2RhdGE7CisJX191MzIgdHZfc2VjOworCV9fdTMyIHR2X3VzZWM7CisJX191MzIgc2VxdWVuY2U7CisJX191MzIgcmVzZXJ2ZWQ7Cit9OworCiAvKiB0eXBlZGVmIGFyZWEgKi8KICNpZm5kZWYgX19LRVJORUxfXwogdHlwZWRlZiBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBkcm1fY2xpcF9yZWN0X3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1QLmggYi9pbmNsdWRlL2RybS9kcm1QLmgKaW5kZXggYzhlNjRiYi4uMTllZjhlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtUC5oCisrKyBiL2luY2x1ZGUvZHJtL2RybVAuaApAQCAtMjQ1LDE2ICsyNDUsNiBAQAogCiAjZW5kaWYKIAotI2RlZmluZSBEUk1fUFJPQ19MSU1JVCAoUEFHRV9TSVpFLTgwKQotCi0jZGVmaW5lIERSTV9QUk9DX1BSSU5UKGZtdCwgYXJnLi4uKQkJCQkJXAotICAgbGVuICs9IHNwcmludGYoJmJ1ZltsZW5dLCBmbXQgLCAjI2FyZyk7CQkJCVwKLSAgIGlmIChsZW4gPiBEUk1fUFJPQ19MSU1JVCkgeyAqZW9mID0gMTsgcmV0dXJuIGxlbiAtIG9mZnNldDsgfQotCi0jZGVmaW5lIERSTV9QUk9DX1BSSU5UX1JFVChyZXQsIGZtdCwgYXJnLi4uKQkJCQlcCi0gICBsZW4gKz0gc3ByaW50ZigmYnVmW2xlbl0sIGZtdCAsICMjYXJnKTsJCQkJXAotICAgaWYgKGxlbiA+IERSTV9QUk9DX0xJTUlUKSB7IHJldDsgKmVvZiA9IDE7IHJldHVybiBsZW4gLSBvZmZzZXQ7IH0KLQogLypAfSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI2NSwxOSArMjU1LDggQEAKIAogI2RlZmluZSBEUk1fTEVGVENPVU5UKHgpICgoKHgpLT5ycCArICh4KS0+Y291bnQgLSAoeCktPndwKSAlICgoeCktPmNvdW50ICsgMSkpCiAjZGVmaW5lIERSTV9CVUZDT1VOVCh4KSAoKHgpLT5jb3VudCAtIERSTV9MRUZUQ09VTlQoeCkpCi0jZGVmaW5lIERSTV9XQUlUQ09VTlQoZGV2LGlkeCkgRFJNX0JVRkNPVU5UKCZkZXYtPnF1ZXVlbGlzdFtpZHhdLT53YWl0bGlzdCkKIAogI2RlZmluZSBEUk1fSUZfVkVSU0lPTihtYWosIG1pbikgKG1haiA8PCAxNiB8IG1pbikKLS8qKgotICogR2V0IHRoZSBwcml2YXRlIFNBUkVBIG1hcHBpbmcuCi0gKgotICogXHBhcmFtIF9kZXYgRFJNIGRldmljZS4KLSAqIFxwYXJhbSBfY3R4IGNvbnRleHQgbnVtYmVyLgotICogXHBhcmFtIF9tYXAgb3V0cHV0IG1hcHBpbmcuCi0gKi8KLSNkZWZpbmUgRFJNX0dFVF9QUklWX1NBUkVBKF9kZXYsIF9jdHgsIF9tYXApIGRvIHsJXAotCShfbWFwKSA9IChfZGV2KS0+Y29udGV4dF9zYXJlYXNbX2N0eF07CQlcCi19IHdoaWxlKDApCiAKIC8qKgogICogVGVzdCB0aGF0IHRoZSBoYXJkd2FyZSBsb2NrIGlzIGhlbGQgYnkgdGhlIGNhbGxlciwgcmV0dXJuaW5nIG90aGVyd2lzZS4KQEAgLTI5NywxOCArMjc2LDYgQEAKIH0gd2hpbGUgKDApCiAKIC8qKgotICogQ29weSBhbmQgSU9DVEwgcmV0dXJuIHN0cmluZyB0byB1c2VyIHNwYWNlCi0gKi8KLSNkZWZpbmUgRFJNX0NPUFkoIG5hbWUsIHZhbHVlICkJCQkJCQlcCi0JbGVuID0gc3RybGVuKCB2YWx1ZSApOwkJCQkJCVwKLQlpZiAoIGxlbiA+IG5hbWUjI19sZW4gKSBsZW4gPSBuYW1lIyNfbGVuOwkJCVwKLQluYW1lIyNfbGVuID0gc3RybGVuKCB2YWx1ZSApOwkJCQkJXAotCWlmICggbGVuICYmIG5hbWUgKSB7CQkJCQkJXAotCQlpZiAoIGNvcHlfdG9fdXNlciggbmFtZSwgdmFsdWUsIGxlbiApICkJCQlcCi0JCQlyZXR1cm4gLUVGQVVMVDsJCQkJCVwKLQl9Ci0KLS8qKgogICogSW9jdGwgZnVuY3Rpb24gdHlwZS4KICAqCiAgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgpAQCAtMzIyLDYgKzI4OSw5IEBACiB0eXBlZGVmIGludCBkcm1faW9jdGxfY29tcGF0X3Qoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpOwogCisjZGVmaW5lIERSTV9JT0NUTF9OUihuKSAgICAgICAgICAgICAgICBfSU9DX05SKG4pCisjZGVmaW5lIERSTV9NQUpPUiAgICAgICAyMjYKKwogI2RlZmluZSBEUk1fQVVUSAkweDEKICNkZWZpbmUJRFJNX01BU1RFUgkweDIKICNkZWZpbmUgRFJNX1JPT1RfT05MWQkweDQKQEAgLTQyNiw2ICszOTYsMTQgQEAKIAlzdHJ1Y3QgZHJtX2ZyZWVsaXN0IGZyZWVsaXN0OwogfTsKIAorLyogRXZlbnQgcXVldWVkIHVwIGZvciB1c2Vyc3BhY2UgdG8gcmVhZCAqLworc3RydWN0IGRybV9wZW5kaW5nX2V2ZW50IHsKKwlzdHJ1Y3QgZHJtX2V2ZW50ICpldmVudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CisJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXY7CisJdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBkcm1fcGVuZGluZ19ldmVudCAqZXZlbnQpOworfTsKKwogLyoqIEZpbGUgcHJpdmF0ZSBkYXRhICovCiBzdHJ1Y3QgZHJtX2ZpbGUgewogCWludCBhdXRoZW50aWNhdGVkOwpAQCAtNDQ5LDYgKzQyNywxMCBAQAogCXN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXI7IC8qIG1hc3RlciB0aGlzIG5vZGUgaXMgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aAogCQkJCSAgICAgIE4uQi4gbm90IGFsd2F5cyBtaW5vci0+bWFzdGVyICovCiAJc3RydWN0IGxpc3RfaGVhZCBmYnM7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudF93YWl0OworCXN0cnVjdCBsaXN0X2hlYWQgZXZlbnRfbGlzdDsKKwlpbnQgZXZlbnRfc3BhY2U7CiB9OwogCiAvKiogV2FpdCBxdWV1ZSAqLwpAQCAtNzk1LDYgKzc3NywxNSBAQAogCS8qIE1hc3RlciByb3V0aW5lcyAqLwogCWludCAoKm1hc3Rlcl9jcmVhdGUpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXIpOwogCXZvaWQgKCptYXN0ZXJfZGVzdHJveSkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9tYXN0ZXIgKm1hc3Rlcik7CisJLyoqCisJICogbWFzdGVyX3NldCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIG1pbm9yIG1hc3RlciBpcyBzZXQuCisJICogbWFzdGVyX2Ryb3AgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBtaW5vciBtYXN0ZXIgaXMgZHJvcHBlZC4KKwkgKi8KKworCWludCAoKm1hc3Rlcl9zZXQpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkJICBib29sIGZyb21fb3Blbik7CisJdm9pZCAoKm1hc3Rlcl9kcm9wKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJCSAgICBib29sIGZyb21fcmVsZWFzZSk7CiAKIAlpbnQgKCpwcm9jX2luaXQpKHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yKTsKIAl2b2lkICgqcHJvY19jbGVhbnVwKShzdHJ1Y3QgZHJtX21pbm9yICptaW5vcik7CkBAIC05MDAsNiArODkxLDEyIEBACiAJc3RydWN0IGRybV9tb2RlX2dyb3VwIG1vZGVfZ3JvdXA7CiB9OwogCitzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50IHsKKwlzdHJ1Y3QgZHJtX3BlbmRpbmdfZXZlbnQgYmFzZTsKKwlpbnQgcGlwZTsKKwlzdHJ1Y3QgZHJtX2V2ZW50X3ZibGFuayBldmVudDsKK307CisKIC8qKgogICogRFJNIGRldmljZSBzdHJ1Y3R1cmUuIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudCBhIGNvbXBsZXRlIGNhcmQgdGhhdAogICogbWF5IGNvbnRhaW4gbXVsdGlwbGUgaGVhZHMuCkBAIC05OTksNiArOTk2LDEyIEBACiAKIAl1MzIgbWF4X3ZibGFua19jb3VudDsgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB2YmxhbmsgY291bnRlciByZWdpc3RlciAqLwogCisJLyoqCisJICogTGlzdCBvZiBldmVudHMKKwkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHZibGFua19ldmVudF9saXN0OworCXNwaW5sb2NrX3QgZXZlbnRfbG9jazsKKwogCS8qQH0gKi8KIAljeWNsZXNfdCBjdHhfc3RhcnQ7CiAJY3ljbGVzX3QgbGNrX3N0YXJ0OwpAQCAtMTEzNSw2ICsxMTM4LDggQEAKIGV4dGVybiBpbnQgZHJtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOwogZXh0ZXJuIGludCBkcm1fc3R1Yl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKIGV4dGVybiBpbnQgZHJtX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pOworZXh0ZXJuIHNzaXplX3QgZHJtX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWZmZXIsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqb2Zmc2V0KTsKIGV4dGVybiBpbnQgZHJtX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOwogCiAJCQkJLyogTWFwcGluZyBzdXBwb3J0IChkcm1fdm0uaCkgKi8KQEAgLTEyOTUsNiArMTMwMCw3IEBACiBleHRlcm4gdm9pZCBkcm1faGFuZGxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CiBleHRlcm4gaW50IGRybV92YmxhbmtfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKIGV4dGVybiB2b2lkIGRybV92YmxhbmtfcHV0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKK2V4dGVybiB2b2lkIGRybV92Ymxhbmtfb2ZmKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKIGV4dGVybiB2b2lkIGRybV92YmxhbmtfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIC8qIE1vZGVzZXR0aW5nIHN1cHBvcnQgKi8KIGV4dGVybiB2b2lkIGRybV92YmxhbmtfcHJlX21vZGVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwpAQCAtMTUxOSwxNiArMTUyNSwyOSBAQAogCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkICpkcm1fY2FsbG9jX2xhcmdlKHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUpCiB7Ci0JaWYgKHNpemUgKiBubWVtYiA8PSBQQUdFX1NJWkUpCi0JICAgIHJldHVybiBrY2FsbG9jKG5tZW1iLCBzaXplLCBHRlBfS0VSTkVMKTsKLQogCWlmIChzaXplICE9IDAgJiYgbm1lbWIgPiBVTE9OR19NQVggLyBzaXplKQogCQlyZXR1cm4gTlVMTDsKIAorCWlmIChzaXplICogbm1lbWIgPD0gUEFHRV9TSVpFKQorCSAgICByZXR1cm4ga2NhbGxvYyhubWVtYiwgc2l6ZSwgR0ZQX0tFUk5FTCk7CisKIAlyZXR1cm4gX192bWFsbG9jKHNpemUgKiBubWVtYiwKIAkJCSBHRlBfS0VSTkVMIHwgX19HRlBfSElHSE1FTSB8IF9fR0ZQX1pFUk8sIFBBR0VfS0VSTkVMKTsKIH0KIAorLyogTW9kZWxlZCBhZnRlciBjYWlybydzIG1hbGxvY19hYiwgaXQncyBsaWtlIGNhbGxvYyBidXQgd2l0aG91dCB0aGUgemVyb2luZy4gKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgKmRybV9tYWxsb2NfYWIoc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoc2l6ZSAhPSAwICYmIG5tZW1iID4gVUxPTkdfTUFYIC8gc2l6ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoc2l6ZSAqIG5tZW1iIDw9IFBBR0VfU0laRSkKKwkgICAgcmV0dXJuIGttYWxsb2Mobm1lbWIgKiBzaXplLCBHRlBfS0VSTkVMKTsKKworCXJldHVybiBfX3ZtYWxsb2Moc2l6ZSAqIG5tZW1iLAorCQkJIEdGUF9LRVJORUwgfCBfX0dGUF9ISUdITUVNLCBQQUdFX0tFUk5FTCk7Cit9CisKIHN0YXRpYyBfX2lubGluZSB2b2lkIGRybV9mcmVlX2xhcmdlKHZvaWQgKnB0cikKIHsKIAlpZiAoIWlzX3ZtYWxsb2NfYWRkcihwdHIpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2NydGMuaCBiL2luY2x1ZGUvZHJtL2RybV9jcnRjLmgKaW5kZXggYjY5MzQ3Yi4uZmRmNDNhYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX2NydGMuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fY3J0Yy5oCkBAIC0xMjMsNyArMTIzLDcgQEAKIAlpbnQgdHlwZTsKIAogCS8qIFByb3Bvc2VkIG1vZGUgdmFsdWVzICovCi0JaW50IGNsb2NrOworCWludCBjbG9jazsJCS8qIGluIGtIeiAqLwogCWludCBoZGlzcGxheTsKIAlpbnQgaHN5bmNfc3RhcnQ7CiAJaW50IGhzeW5jX2VuZDsKQEAgLTE2NCw4ICsxNjQsOCBAQAogCWludCAqcHJpdmF0ZTsKIAlpbnQgcHJpdmF0ZV9mbGFnczsKIAotCWludCB2cmVmcmVzaDsKLQlmbG9hdCBoc3luYzsKKwlpbnQgdnJlZnJlc2g7CQkvKiBpbiBIeiAqLworCWludCBoc3luYzsJCS8qIGluIGtIeiAqLwogfTsKIAogZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyB7CkBAIC0yNDIsNiArMjQyLDIxIEBACiAJaW50ICgqY3JlYXRlX2hhbmRsZSkoc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCiAJCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAogCQkJICAgICB1bnNpZ25lZCBpbnQgKmhhbmRsZSk7CisJLyoqCisJICogT3B0aW5hbCBjYWxsYmFjayBmb3IgdGhlIGRpcnR5IGZiIGlvY3RsLgorCSAqCisJICogVXNlcnNwYWNlIGNhbiBub3RpZnkgdGhlIGRyaXZlciB2aWEgdGhpcyBjYWxsYmFjaworCSAqIHRoYXQgYSBhcmVhIG9mIHRoZSBmcmFtZWJ1ZmZlciBoYXMgY2hhbmdlZCBhbmQgc2hvdWxkCisJICogYmUgZmx1c2hlZCB0byB0aGUgZGlzcGxheSBoYXJkd2FyZS4KKwkgKgorCSAqIFNlZSBkb2N1bWVudGF0aW9uIGluIGRybV9tb2RlLmggZm9yIHRoZSBzdHJ1Y3QKKwkgKiBkcm1fbW9kZV9mYl9kaXJ0eV9jbWQgZm9yIG1vcmUgaW5mb3JtYXRpb24gYXMgYWxsCisJICogdGhlIHNlbWFudGljcyBhbmQgYXJndW1lbnRzIGhhdmUgYSBvbmUgdG8gb25lIG1hcHBpbmcKKwkgKiBvbiB0aGlzIGZ1bmN0aW9uLgorCSAqLworCWludCAoKmRpcnR5KShzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmcmFtZWJ1ZmZlciwgdW5zaWduZWQgZmxhZ3MsCisJCSAgICAgdW5zaWduZWQgY29sb3IsIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcywKKwkJICAgICB1bnNpZ25lZCBudW1fY2xpcHMpOwogfTsKIAogc3RydWN0IGRybV9mcmFtZWJ1ZmZlciB7CkBAIC0yNTYsNyArMjcxLDcgQEAKIAl1bnNpZ25lZCBpbnQgZGVwdGg7CiAJaW50IGJpdHNfcGVyX3BpeGVsOwogCWludCBmbGFnczsKLQl2b2lkICpmYmRldjsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJkZXY7CiAJdTMyIHBzZXVkb19wYWxldHRlWzE3XTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZpbHBfaGVhZDsKIAkvKiBpZiB5b3UgYXJlIHVzaW5nIHRoZSBoZWxwZXIgKi8KQEAgLTI5MCw2ICszMDUsNyBAQAogc3RydWN0IGRybV9jcnRjOwogc3RydWN0IGRybV9jb25uZWN0b3I7CiBzdHJ1Y3QgZHJtX2VuY29kZXI7CitzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50OwogCiAvKioKICAqIGRybV9jcnRjX2Z1bmNzIC0gY29udHJvbCBDUlRDcyBmb3IgYSBnaXZlbiBkZXZpY2UKQEAgLTMzMyw2ICszNDksMTkgQEAKIAl2b2lkICgqZGVzdHJveSkoc3RydWN0IGRybV9jcnRjICpjcnRjKTsKIAogCWludCAoKnNldF9jb25maWcpKHN0cnVjdCBkcm1fbW9kZV9zZXQgKnNldCk7CisKKwkvKgorCSAqIEZsaXAgdG8gdGhlIGdpdmVuIGZyYW1lYnVmZmVyLiAgVGhpcyBpbXBsZW1lbnRzIHRoZSBwYWdlCisJICogZmxpcCBpb2N0bCBkZXNjaWJlZCBpbiBkcm1fbW9kZS5oLCBzcGVjaWZpY2FsbHksIHRoZQorCSAqIGltcGxlbWVudGF0aW9uIG11c3QgcmV0dXJuIGltbWVkaWF0ZWx5IGFuZCBibG9jayBhbGwKKwkgKiByZW5kZXJpbmcgdG8gdGhlIGN1cnJlbnQgZmIgdW50aWwgdGhlIGZsaXAgaGFzIGNvbXBsZXRlZC4KKwkgKiBJZiB1c2Vyc3BhY2Ugc2V0IHRoZSBldmVudCBmbGFnIGluIHRoZSBpb2N0bCwgdGhlIGV2ZW50CisJICogYXJndW1lbnQgd2lsbCBwb2ludCB0byBhbiBldmVudCB0byBzZW5kIGJhY2sgd2hlbiB0aGUgZmxpcAorCSAqIGNvbXBsZXRlcywgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgTlVMTC4KKwkgKi8KKwlpbnQgKCpwYWdlX2ZsaXApKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCSBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJCSBzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICpldmVudCk7CiB9OwogCiAvKioKQEAgLTU5Niw2ICs2MjUsNyBAQAogCS8qIE9wdGlvbmFsIHByb3BlcnRpZXMgKi8KIAlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpzY2FsaW5nX21vZGVfcHJvcGVydHk7CiAJc3RydWN0IGRybV9wcm9wZXJ0eSAqZGl0aGVyaW5nX21vZGVfcHJvcGVydHk7CisJc3RydWN0IGRybV9wcm9wZXJ0eSAqZGlydHlfaW5mb19wcm9wZXJ0eTsKIH07CiAKICNkZWZpbmUgb2JqX3RvX2NydGMoeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBkcm1fY3J0YywgYmFzZSkKQEAgLTY2Nyw2ICs2OTcsNyBAQAogZXh0ZXJuIHZvaWQgZHJtX21vZGVfcHJ1bmVfaW52YWxpZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCSAgIHN0cnVjdCBsaXN0X2hlYWQgKm1vZGVfbGlzdCwgYm9vbCB2ZXJib3NlKTsKIGV4dGVybiB2b2lkIGRybV9tb2RlX3NvcnQoc3RydWN0IGxpc3RfaGVhZCAqbW9kZV9saXN0KTsKK2V4dGVybiBpbnQgZHJtX21vZGVfaHN5bmMoc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOwogZXh0ZXJuIGludCBkcm1fbW9kZV92cmVmcmVzaChzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSk7CiBleHRlcm4gdm9pZCBkcm1fbW9kZV9zZXRfY3J0Y2luZm8oc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnAsCiAJCQkJICBpbnQgYWRqdXN0X2ZsYWdzKTsKQEAgLTcwMyw2ICs3MzQsNyBAQAogCQkJCSAgICAgY2hhciAqZm9ybWF0c1tdKTsKIGV4dGVybiBpbnQgZHJtX21vZGVfY3JlYXRlX3NjYWxpbmdfbW9kZV9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgZHJtX21vZGVfY3JlYXRlX2RpdGhlcmluZ19wcm9wZXJ0eShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgZHJtX21vZGVfY3JlYXRlX2RpcnR5X2luZm9fcHJvcGVydHkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gY2hhciAqZHJtX2dldF9lbmNvZGVyX25hbWUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKIAogZXh0ZXJuIGludCBkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKQEAgLTcxMSw3ICs3NDMsOCBAQAogCQkJCQkgICBzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwogZXh0ZXJuIGJvb2wgZHJtX21vZGVfY3J0Y19zZXRfZ2FtbWFfc2l6ZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCQkJCSBpbnQgZ2FtbWFfc2l6ZSk7Ci1leHRlcm4gdm9pZCAqZHJtX21vZGVfb2JqZWN0X2ZpbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgaWQsIHVpbnQzMl90IHR5cGUpOworZXh0ZXJuIHN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKmRybV9tb2RlX29iamVjdF9maW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCXVpbnQzMl90IGlkLCB1aW50MzJfdCB0eXBlKTsKIC8qIElPQ1RMcyAqLwogZXh0ZXJuIGludCBkcm1fbW9kZV9nZXRyZXNvdXJjZXMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwpAQCAtNzMwLDYgKzc2Myw4IEBACiAJCQkgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwogZXh0ZXJuIGludCBkcm1fbW9kZV9nZXRmYihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJICB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CitleHRlcm4gaW50IGRybV9tb2RlX2RpcnR5ZmJfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIGV4dGVybiBpbnQgZHJtX21vZGVfYWRkbW9kZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCSAgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwogZXh0ZXJuIGludCBkcm1fbW9kZV9ybW1vZGVfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKQEAgLTc1Niw2ICs3OTEsOCBAQAogZXh0ZXJuIGludCBkcm1fbW9kZV9nYW1tYV9zZXRfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkgICAgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwogZXh0ZXJuIGJvb2wgZHJtX2RldGVjdF9oZG1pX21vbml0b3Ioc3RydWN0IGVkaWQgKmVkaWQpOworZXh0ZXJuIGludCBkcm1fbW9kZV9wYWdlX2ZsaXBfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICAgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwogZXh0ZXJuIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkcm1fY3Z0X21vZGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQlpbnQgaGRpc3BsYXksIGludCB2ZGlzcGxheSwgaW50IHZyZWZyZXNoLAogCQkJCWJvb2wgcmVkdWNlZCwgYm9vbCBpbnRlcmxhY2VkLCBib29sIG1hcmdpbnMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2RwX2hlbHBlci5oIGIvaW5jbHVkZS9kcm0vZHJtX2RwX2hlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OWU3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9kcm1fZHBfaGVscGVyLmgKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOCBLZWl0aCBQYWNrYXJkCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAorICogbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZAorICogdGhhdCB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyAqIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBjb3B5cmlnaHQgaG9sZGVycyBtYWtlIG5vIHJlcHJlc2VudGF0aW9ucworICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzCisgKiBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogVEhFIENPUFlSSUdIVCBIT0xERVJTIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRQorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9EUk1fRFBfSEVMUEVSX0hfCisjZGVmaW5lIF9EUk1fRFBfSEVMUEVSX0hfCisKKy8qIEZyb20gdGhlIFZFU0EgRGlzcGxheVBvcnQgc3BlYyAqLworCisjZGVmaW5lIEFVWF9OQVRJVkVfV1JJVEUJMHg4CisjZGVmaW5lIEFVWF9OQVRJVkVfUkVBRAkJMHg5CisjZGVmaW5lIEFVWF9JMkNfV1JJVEUJCTB4MAorI2RlZmluZSBBVVhfSTJDX1JFQUQJCTB4MQorI2RlZmluZSBBVVhfSTJDX1NUQVRVUwkJMHgyCisjZGVmaW5lIEFVWF9JMkNfTU9UCQkweDQKKworI2RlZmluZSBBVVhfTkFUSVZFX1JFUExZX0FDSwkoMHgwIDw8IDQpCisjZGVmaW5lIEFVWF9OQVRJVkVfUkVQTFlfTkFDSwkoMHgxIDw8IDQpCisjZGVmaW5lIEFVWF9OQVRJVkVfUkVQTFlfREVGRVIJKDB4MiA8PCA0KQorI2RlZmluZSBBVVhfTkFUSVZFX1JFUExZX01BU0sJKDB4MyA8PCA0KQorCisjZGVmaW5lIEFVWF9JMkNfUkVQTFlfQUNLCSgweDAgPDwgNikKKyNkZWZpbmUgQVVYX0kyQ19SRVBMWV9OQUNLCSgweDEgPDwgNikKKyNkZWZpbmUgQVVYX0kyQ19SRVBMWV9ERUZFUgkoMHgyIDw8IDYpCisjZGVmaW5lIEFVWF9JMkNfUkVQTFlfTUFTSwkoMHgzIDw8IDYpCisKKy8qIEFVWCBDSCBhZGRyZXNzZXMgKi8KKy8qIERQQ0QgKi8KKyNkZWZpbmUgRFBfRFBDRF9SRVYgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAKKworI2RlZmluZSBEUF9NQVhfTElOS19SQVRFICAgICAgICAgICAgICAgICAgICAweDAwMQorCisjZGVmaW5lIERQX01BWF9MQU5FX0NPVU5UICAgICAgICAgICAgICAgICAgIDB4MDAyCisjIGRlZmluZSBEUF9NQVhfTEFORV9DT1VOVF9NQVNLCQkgICAgMHgxZgorIyBkZWZpbmUgRFBfRU5IQU5DRURfRlJBTUVfQ0FQCQkgICAgKDEgPDwgNykKKworI2RlZmluZSBEUF9NQVhfRE9XTlNQUkVBRCAgICAgICAgICAgICAgICAgICAweDAwMworIyBkZWZpbmUgRFBfTk9fQVVYX0hBTkRTSEFLRV9MSU5LX1RSQUlOSU5HICAoMSA8PCA2KQorCisjZGVmaW5lIERQX05PUlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0CisKKyNkZWZpbmUgRFBfRE9XTlNUUkVBTVBPUlRfUFJFU0VOVCAgICAgICAgICAgMHgwMDUKKyMgZGVmaW5lIERQX0RXTl9TVFJNX1BPUlRfUFJFU0VOVCAgICAgICAgICAgKDEgPDwgMCkKKyMgZGVmaW5lIERQX0RXTl9TVFJNX1BPUlRfVFlQRV9NQVNLICAgICAgICAgMHgwNgorLyogMDBiID0gRGlzcGxheVBvcnQgKi8KKy8qIDAxYiA9IEFuYWxvZyAqLworLyogMTBiID0gVE1EUyBvciBIRE1JICovCisvKiAxMWIgPSBPdGhlciAqLworIyBkZWZpbmUgRFBfRk9STUFUX0NPTlZFUlNJT04gICAgICAgICAgICAgICAoMSA8PCAzKQorCisjZGVmaW5lIERQX01BSU5fTElOS19DSEFOTkVMX0NPRElORyAgICAgICAgIDB4MDA2CisKKy8qIGxpbmsgY29uZmlndXJhdGlvbiAqLworI2RlZmluZQlEUF9MSU5LX0JXX1NFVAkJICAgICAgICAgICAgMHgxMDAKKyMgZGVmaW5lIERQX0xJTktfQldfMV82MgkJICAgIDB4MDYKKyMgZGVmaW5lIERQX0xJTktfQldfMl83CQkJICAgIDB4MGEKKworI2RlZmluZSBEUF9MQU5FX0NPVU5UX1NFVAkgICAgICAgICAgICAweDEwMQorIyBkZWZpbmUgRFBfTEFORV9DT1VOVF9NQVNLCQkgICAgMHgwZgorIyBkZWZpbmUgRFBfTEFORV9DT1VOVF9FTkhBTkNFRF9GUkFNRV9FTiAgICAoMSA8PCA3KQorCisjZGVmaW5lIERQX1RSQUlOSU5HX1BBVFRFUk5fU0VUCSAgICAgICAgICAgIDB4MTAyCisjIGRlZmluZSBEUF9UUkFJTklOR19QQVRURVJOX0RJU0FCTEUJICAgIDAKKyMgZGVmaW5lIERQX1RSQUlOSU5HX1BBVFRFUk5fMQkJICAgIDEKKyMgZGVmaW5lIERQX1RSQUlOSU5HX1BBVFRFUk5fMgkJICAgIDIKKyMgZGVmaW5lIERQX1RSQUlOSU5HX1BBVFRFUk5fTUFTSwkgICAgMHgzCisKKyMgZGVmaW5lIERQX0xJTktfUVVBTF9QQVRURVJOX0RJU0FCTEUJICAgICgwIDw8IDIpCisjIGRlZmluZSBEUF9MSU5LX1FVQUxfUEFUVEVSTl9EMTBfMgkgICAgKDEgPDwgMikKKyMgZGVmaW5lIERQX0xJTktfUVVBTF9QQVRURVJOX0VSUk9SX1JBVEUgICAgKDIgPDwgMikKKyMgZGVmaW5lIERQX0xJTktfUVVBTF9QQVRURVJOX1BSQlM3CSAgICAoMyA8PCAyKQorIyBkZWZpbmUgRFBfTElOS19RVUFMX1BBVFRFUk5fTUFTSwkgICAgKDMgPDwgMikKKworIyBkZWZpbmUgRFBfUkVDT1ZFUkVEX0NMT0NLX09VVF9FTgkgICAgKDEgPDwgNCkKKyMgZGVmaW5lIERQX0xJTktfU0NSQU1CTElOR19ESVNBQkxFCSAgICAoMSA8PCA1KQorCisjIGRlZmluZSBEUF9TWU1CT0xfRVJST1JfQ09VTlRfQk9USAkgICAgKDAgPDwgNikKKyMgZGVmaW5lIERQX1NZTUJPTF9FUlJPUl9DT1VOVF9ESVNQQVJJVFkgICAgKDEgPDwgNikKKyMgZGVmaW5lIERQX1NZTUJPTF9FUlJPUl9DT1VOVF9TWU1CT0wJICAgICgyIDw8IDYpCisjIGRlZmluZSBEUF9TWU1CT0xfRVJST1JfQ09VTlRfTUFTSwkgICAgKDMgPDwgNikKKworI2RlZmluZSBEUF9UUkFJTklOR19MQU5FMF9TRVQJCSAgICAweDEwMworI2RlZmluZSBEUF9UUkFJTklOR19MQU5FMV9TRVQJCSAgICAweDEwNAorI2RlZmluZSBEUF9UUkFJTklOR19MQU5FMl9TRVQJCSAgICAweDEwNQorI2RlZmluZSBEUF9UUkFJTklOR19MQU5FM19TRVQJCSAgICAweDEwNgorCisjIGRlZmluZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX01BU0sJICAgIDB4MworIyBkZWZpbmUgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR19TSElGVAkgICAgMAorIyBkZWZpbmUgRFBfVFJBSU5fTUFYX1NXSU5HX1JFQUNIRUQJICAgICgxIDw8IDIpCisjIGRlZmluZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzQwMAkgICAgKDAgPDwgMCkKKyMgZGVmaW5lIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfNjAwCSAgICAoMSA8PCAwKQorIyBkZWZpbmUgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR184MDAJICAgICgyIDw8IDApCisjIGRlZmluZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzEyMDAJICAgICgzIDw8IDApCisKKyMgZGVmaW5lIERQX1RSQUlOX1BSRV9FTVBIQVNJU19NQVNLCSAgICAoMyA8PCAzKQorIyBkZWZpbmUgRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzAJICAgICgwIDw8IDMpCisjIGRlZmluZSBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfM181CSAgICAoMSA8PCAzKQorIyBkZWZpbmUgRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzYJICAgICgyIDw8IDMpCisjIGRlZmluZSBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfOV81CSAgICAoMyA8PCAzKQorCisjIGRlZmluZSBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfU0hJRlQJICAgIDMKKyMgZGVmaW5lIERQX1RSQUlOX01BWF9QUkVfRU1QSEFTSVNfUkVBQ0hFRCAgKDEgPDwgNSkKKworI2RlZmluZSBEUF9ET1dOU1BSRUFEX0NUUkwJCSAgICAweDEwNworIyBkZWZpbmUgRFBfU1BSRUFEX0FNUF8wXzUJCSAgICAoMSA8PCA0KQorCisjZGVmaW5lIERQX01BSU5fTElOS19DSEFOTkVMX0NPRElOR19TRVQJICAgIDB4MTA4CisjIGRlZmluZSBEUF9TRVRfQU5TSV84QjEwQgkJICAgICgxIDw8IDApCisKKyNkZWZpbmUgRFBfTEFORTBfMV9TVEFUVVMJCSAgICAweDIwMgorI2RlZmluZSBEUF9MQU5FMl8zX1NUQVRVUwkJICAgIDB4MjAzCisjIGRlZmluZSBEUF9MQU5FX0NSX0RPTkUJCSAgICAoMSA8PCAwKQorIyBkZWZpbmUgRFBfTEFORV9DSEFOTkVMX0VRX0RPTkUJICAgICgxIDw8IDEpCisjIGRlZmluZSBEUF9MQU5FX1NZTUJPTF9MT0NLRUQJCSAgICAoMSA8PCAyKQorCisjZGVmaW5lIERQX0NIQU5ORUxfRVFfQklUUyAoRFBfTEFORV9DUl9ET05FIHwJCVwKKwkJCSAgICBEUF9MQU5FX0NIQU5ORUxfRVFfRE9ORSB8CVwKKwkJCSAgICBEUF9MQU5FX1NZTUJPTF9MT0NLRUQpCisKKyNkZWZpbmUgRFBfTEFORV9BTElHTl9TVEFUVVNfVVBEQVRFRAkgICAgMHgyMDQKKworI2RlZmluZSBEUF9JTlRFUkxBTkVfQUxJR05fRE9ORQkJICAgICgxIDw8IDApCisjZGVmaW5lIERQX0RPV05TVFJFQU1fUE9SVF9TVEFUVVNfQ0hBTkdFRCAgICgxIDw8IDYpCisjZGVmaW5lIERQX0xJTktfU1RBVFVTX1VQREFURUQJCSAgICAoMSA8PCA3KQorCisjZGVmaW5lIERQX1NJTktfU1RBVFVTCQkJICAgIDB4MjA1CisKKyNkZWZpbmUgRFBfUkVDRUlWRV9QT1JUXzBfU1RBVFVTCSAgICAoMSA8PCAwKQorI2RlZmluZSBEUF9SRUNFSVZFX1BPUlRfMV9TVEFUVVMJICAgICgxIDw8IDEpCisKKyNkZWZpbmUgRFBfQURKVVNUX1JFUVVFU1RfTEFORTBfMQkgICAgMHgyMDYKKyNkZWZpbmUgRFBfQURKVVNUX1JFUVVFU1RfTEFORTJfMwkgICAgMHgyMDcKKyMgZGVmaW5lIERQX0FESlVTVF9WT0xUQUdFX1NXSU5HX0xBTkUwX01BU0sgIDB4MDMKKyMgZGVmaW5lIERQX0FESlVTVF9WT0xUQUdFX1NXSU5HX0xBTkUwX1NISUZUIDAKKyMgZGVmaW5lIERQX0FESlVTVF9QUkVfRU1QSEFTSVNfTEFORTBfTUFTSyAgIDB4MGMKKyMgZGVmaW5lIERQX0FESlVTVF9QUkVfRU1QSEFTSVNfTEFORTBfU0hJRlQgIDIKKyMgZGVmaW5lIERQX0FESlVTVF9WT0xUQUdFX1NXSU5HX0xBTkUxX01BU0sgIDB4MzAKKyMgZGVmaW5lIERQX0FESlVTVF9WT0xUQUdFX1NXSU5HX0xBTkUxX1NISUZUIDQKKyMgZGVmaW5lIERQX0FESlVTVF9QUkVfRU1QSEFTSVNfTEFORTFfTUFTSyAgIDB4YzAKKyMgZGVmaW5lIERQX0FESlVTVF9QUkVfRU1QSEFTSVNfTEFORTFfU0hJRlQgIDYKKworI2RlZmluZSBEUF9TRVRfUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAweDYwMAorIyBkZWZpbmUgRFBfU0VUX1BPV0VSX0QwICAgICAgICAgICAgICAgICAgICAweDEKKyMgZGVmaW5lIERQX1NFVF9QT1dFUl9EMyAgICAgICAgICAgICAgICAgICAgMHgyCisKKyNkZWZpbmUgTU9ERV9JMkNfU1RBUlQJMQorI2RlZmluZSBNT0RFX0kyQ19XUklURQkyCisjZGVmaW5lIE1PREVfSTJDX1JFQUQJNAorI2RlZmluZSBNT0RFX0kyQ19TVE9QCTgKKworc3RydWN0IGkyY19hbGdvX2RwX2F1eF9kYXRhIHsKKwlib29sIHJ1bm5pbmc7CisJdTE2IGFkZHJlc3M7CisJaW50ICgqYXV4X2NoKSAoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAorCQkgICAgICAgaW50IG1vZGUsIHVpbnQ4X3Qgd3JpdGVfYnl0ZSwKKwkJICAgICAgIHVpbnQ4X3QgKnJlYWRfYnl0ZSk7Cit9OworCitpbnQKK2kyY19kcF9hdXhfYWRkX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworCisjZW5kaWYgLyogX0RSTV9EUF9IRUxQRVJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9lZGlkLmggYi9pbmNsdWRlL2RybS9kcm1fZWRpZC5oCmluZGV4IDdkNmM5YTIuLmQzM2MzZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9lZGlkLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX2VkaWQuaApAQCAtMTA2LDYgKzEwNiwxMCBAQAogCXU4IHdwaW5kZXgyWzNdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAorc3RydWN0IGN2dF90aW1pbmcgeworCXU4IGNvZGVbM107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCiBzdHJ1Y3QgZGV0YWlsZWRfbm9uX3BpeGVsIHsKIAl1OCBwYWQxOwogCXU4IHR5cGU7IC8qIGZmPXNlcmlhbCwgZmU9c3RyaW5nLCBmZD1tb25pdG9yIHJhbmdlLCBmYz1tb25pdG9yIG5hbWUKQEAgLTExNyw5ICsxMjEsMTMgQEAKIAkJc3RydWN0IGRldGFpbGVkX2RhdGFfbW9uaXRvcl9yYW5nZSByYW5nZTsKIAkJc3RydWN0IGRldGFpbGVkX2RhdGFfd3BpbmRleCBjb2xvcjsKIAkJc3RydWN0IHN0ZF90aW1pbmcgdGltaW5nc1s1XTsKKwkJc3RydWN0IGN2dF90aW1pbmcgY3Z0WzRdOwogCX0gZGF0YTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKKyNkZWZpbmUgRURJRF9ERVRBSUxfRVNUX1RJTUlOR1MgMHhmNworI2RlZmluZSBFRElEX0RFVEFJTF9DVlRfM0JZVEUgMHhmOAorI2RlZmluZSBFRElEX0RFVEFJTF9DT0xPUl9NR01UX0RBVEEgMHhmOQogI2RlZmluZSBFRElEX0RFVEFJTF9TVERfTU9ERVMgMHhmYQogI2RlZmluZSBFRElEX0RFVEFJTF9NT05JVE9SX0NQREFUQSAweGZiCiAjZGVmaW5lIEVESURfREVUQUlMX01PTklUT1JfTkFNRSAweGZjCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fbW0uaCBiL2luY2x1ZGUvZHJtL2RybV9tbS5oCmluZGV4IDYyMzI5ZjkuLjRjMTBiZTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9tbS5oCisrKyBiL2luY2x1ZGUvZHJtL2RybV9tbS5oCkBAIC02Niw2ICs2NiwxMyBAQAogCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQkJCSAgICB1bnNpZ25lZCBhbGlnbm1lbnQsCiAJCQkJCQkgICAgaW50IGF0b21pYyk7CitleHRlcm4gc3RydWN0IGRybV9tbV9ub2RlICpkcm1fbW1fZ2V0X2Jsb2NrX3JhbmdlX2dlbmVyaWMoCisJCQkJCQlzdHJ1Y3QgZHJtX21tX25vZGUgKm5vZGUsCisJCQkJCQl1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJCQl1bnNpZ25lZCBhbGlnbm1lbnQsCisJCQkJCQl1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCQkJdW5zaWduZWQgbG9uZyBlbmQsCisJCQkJCQlpbnQgYXRvbWljKTsKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRybV9tbV9ub2RlICpkcm1fbW1fZ2V0X2Jsb2NrKHN0cnVjdCBkcm1fbW1fbm9kZSAqcGFyZW50LAogCQkJCQkJICAgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCQkJICAgdW5zaWduZWQgYWxpZ25tZW50KQpAQCAtNzgsMTEgKzg1LDM4IEBACiB7CiAJcmV0dXJuIGRybV9tbV9nZXRfYmxvY2tfZ2VuZXJpYyhwYXJlbnQsIHNpemUsIGFsaWdubWVudCwgMSk7CiB9CitzdGF0aWMgaW5saW5lIHN0cnVjdCBkcm1fbW1fbm9kZSAqZHJtX21tX2dldF9ibG9ja19yYW5nZSgKKwkJCQkJCXN0cnVjdCBkcm1fbW1fbm9kZSAqcGFyZW50LAorCQkJCQkJdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCQkJdW5zaWduZWQgYWxpZ25tZW50LAorCQkJCQkJdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgZW5kKQoreworCXJldHVybiBkcm1fbW1fZ2V0X2Jsb2NrX3JhbmdlX2dlbmVyaWMocGFyZW50LCBzaXplLCBhbGlnbm1lbnQsCisJCQkJCQlzdGFydCwgZW5kLCAwKTsKK30KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRybV9tbV9ub2RlICpkcm1fbW1fZ2V0X2Jsb2NrX2F0b21pY19yYW5nZSgKKwkJCQkJCXN0cnVjdCBkcm1fbW1fbm9kZSAqcGFyZW50LAorCQkJCQkJdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCQkJdW5zaWduZWQgYWxpZ25tZW50LAorCQkJCQkJdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgZW5kKQoreworCXJldHVybiBkcm1fbW1fZ2V0X2Jsb2NrX3JhbmdlX2dlbmVyaWMocGFyZW50LCBzaXplLCBhbGlnbm1lbnQsCisJCQkJCQlzdGFydCwgZW5kLCAxKTsKK30KIGV4dGVybiB2b2lkIGRybV9tbV9wdXRfYmxvY2soc3RydWN0IGRybV9tbV9ub2RlICpjdXIpOwogZXh0ZXJuIHN0cnVjdCBkcm1fbW1fbm9kZSAqZHJtX21tX3NlYXJjaF9mcmVlKGNvbnN0IHN0cnVjdCBkcm1fbW0gKm1tLAogCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkJCSAgICAgIHVuc2lnbmVkIGFsaWdubWVudCwKIAkJCQkJICAgICAgaW50IGJlc3RfbWF0Y2gpOworZXh0ZXJuIHN0cnVjdCBkcm1fbW1fbm9kZSAqZHJtX21tX3NlYXJjaF9mcmVlX2luX3JhbmdlKAorCQkJCQkJY29uc3Qgc3RydWN0IGRybV9tbSAqbW0sCisJCQkJCQl1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJCQl1bnNpZ25lZCBhbGlnbm1lbnQsCisJCQkJCQl1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCQkJdW5zaWduZWQgbG9uZyBlbmQsCisJCQkJCQlpbnQgYmVzdF9tYXRjaCk7CiBleHRlcm4gaW50IGRybV9tbV9pbml0KHN0cnVjdCBkcm1fbW0gKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAogCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKTsKIGV4dGVybiB2b2lkIGRybV9tbV90YWtlZG93bihzdHJ1Y3QgZHJtX21tICptbSk7CkBAIC05OSw2ICsxMzMsNyBAQAogCXJldHVybiBibG9jay0+bW07CiB9CiAKK2V4dGVybiB2b2lkIGRybV9tbV9kZWJ1Z190YWJsZShzdHJ1Y3QgZHJtX21tICptbSwgY29uc3QgY2hhciAqcHJlZml4KTsKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIGludCBkcm1fbW1fZHVtcF90YWJsZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBkcm1fbW0gKm1tKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX21vZGUuaCBiL2luY2x1ZGUvZHJtL2RybV9tb2RlLmgKaW5kZXggMWY5MDg0MS4uNDMwMDliYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX21vZGUuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fbW9kZS5oCkBAIC0yNyw5ICsyNyw2IEBACiAjaWZuZGVmIF9EUk1fTU9ERV9ICiAjZGVmaW5lIF9EUk1fTU9ERV9ICiAKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCiAjZGVmaW5lIERSTV9ESVNQTEFZX0lORk9fTEVOCTMyCiAjZGVmaW5lIERSTV9DT05ORUNUT1JfTkFNRV9MRU4JMzIKICNkZWZpbmUgRFJNX0RJU1BMQVlfTU9ERV9MRU4JMzIKQEAgLTc4LDYgKzc1LDExIEBACiAjZGVmaW5lIERSTV9NT0RFX0RJVEhFUklOR19PRkYJMAogI2RlZmluZSBEUk1fTU9ERV9ESVRIRVJJTkdfT04JMQogCisvKiBEaXJ0eSBpbmZvIG9wdGlvbnMgKi8KKyNkZWZpbmUgRFJNX01PREVfRElSVFlfT0ZGICAgICAgMAorI2RlZmluZSBEUk1fTU9ERV9ESVJUWV9PTiAgICAgICAxCisjZGVmaW5lIERSTV9NT0RFX0RJUlRZX0FOTk9UQVRFIDIKKwogc3RydWN0IGRybV9tb2RlX21vZGVpbmZvIHsKIAlfX3UzMiBjbG9jazsKIAlfX3UxNiBoZGlzcGxheSwgaHN5bmNfc3RhcnQsIGhzeW5jX2VuZCwgaHRvdGFsLCBoc2tldzsKQEAgLTIyNSw2ICsyMjcsNDUgQEAKIAlfX3UzMiBoYW5kbGU7CiB9OwogCisjZGVmaW5lIERSTV9NT0RFX0ZCX0RJUlRZX0FOTk9UQVRFX0NPUFkgMHgwMQorI2RlZmluZSBEUk1fTU9ERV9GQl9ESVJUWV9BTk5PVEFURV9GSUxMIDB4MDIKKyNkZWZpbmUgRFJNX01PREVfRkJfRElSVFlfRkxBR1MgICAgICAgICAweDAzCisKKy8qCisgKiBNYXJrIGEgcmVnaW9uIG9mIGEgZnJhbWVidWZmZXIgYXMgZGlydHkuCisgKgorICogU29tZSBoYXJkd2FyZSBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSBkaXNwbGF5IGNvbnRlbnRzCisgKiBhcyBhIGhhcmR3YXJlIG9yIHNvZnR3YXJlIGRyYXcgdG8gYSBmcmFtZWJ1ZmZlci4gVGhpcyBpb2N0bAorICogYWxsb3dzIHVzZXJzcGFjZSB0byB0ZWxsIHRoZSBrZXJuZWwgYW5kIHRoZSBoYXJkd2FyZSB3aGF0CisgKiByZWdpb25zIG9mIHRoZSBmcmFtZWJ1ZmZlciBoYXZlIGNoYW5nZWQuCisgKgorICogVGhlIGtlcm5lbCBvciBoYXJkd2FyZSBpcyBmcmVlIHRvIHVwZGF0ZSBtb3JlIHRoZW4ganVzdCB0aGUKKyAqIHJlZ2lvbiBzcGVjaWZpZWQgYnkgdGhlIGNsaXAgcmVjdHMuIFRoZSBrZXJuZWwgb3IgaGFyZHdhcmUKKyAqIG1heSBhbHNvIGRlbGF5IGFuZC9vciBjb2FsZXNjZSBzZXZlcmFsIGNhbGxzIHRvIGRpcnR5IGludG8gYQorICogc2luZ2xlIHVwZGF0ZS4KKyAqCisgKiBVc2Vyc3BhY2UgbWF5IGFubm90YXRlIHRoZSB1cGRhdGVzLCB0aGUgYW5ub3RhdGVzIGFyZSBhCisgKiBwcm9taXNlIG1hZGUgYnkgdGhlIGNhbGxlciB0aGF0IHRoZSBjaGFuZ2UgaXMgZWl0aGVyIGEgY29weQorICogb2YgcGl4ZWxzIG9yIGEgZmlsbCBvZiBhIHNpbmdsZSBjb2xvciBpbiB0aGUgcmVnaW9uIHNwZWNpZmllZC4KKyAqCisgKiBJZiB0aGUgRFJNX01PREVfRkJfRElSVFlfQU5OT1RBVEVfQ09QWSBmbGFnIGlzIGdpdmVuIHRoZW4KKyAqIHRoZSBudW1iZXIgb2YgdXBkYXRlZCByZWdpb25zIGFyZSBoYWxmIG9mIG51bV9jbGlwcyBnaXZlbiwKKyAqIHdoZXJlIHRoZSBjbGlwIHJlY3RzIGFyZSBwYWlyZWQgaW4gc3JjIGFuZCBkc3QuIFRoZSB3aWR0aCBhbmQKKyAqIGhlaWdodCBvZiBlYWNoIG9uZSBvZiB0aGUgcGFpcnMgbXVzdCBtYXRjaC4KKyAqCisgKiBJZiB0aGUgRFJNX01PREVfRkJfRElSVFlfQU5OT1RBVEVfRklMTCBmbGFnIGlzIGdpdmVuIHRoZSBjYWxsZXIKKyAqIHByb21pc2VzIHRoYXQgdGhlIHJlZ2lvbiBzcGVjaWZpZWQgb2YgdGhlIGNsaXAgcmVjdHMgaXMgZmlsbGVkCisgKiBjb21wbGV0ZWx5IHdpdGggYSBzaW5nbGUgY29sb3IgYXMgZ2l2ZW4gaW4gdGhlIGNvbG9yIGFyZ3VtZW50LgorICovCisKK3N0cnVjdCBkcm1fbW9kZV9mYl9kaXJ0eV9jbWQgeworCV9fdTMyIGZiX2lkOworCV9fdTMyIGZsYWdzOworCV9fdTMyIGNvbG9yOworCV9fdTMyIG51bV9jbGlwczsKKwlfX3U2NCBjbGlwc19wdHI7Cit9OworCiBzdHJ1Y3QgZHJtX21vZGVfbW9kZV9jbWQgewogCV9fdTMyIGNvbm5lY3Rvcl9pZDsKIAlzdHJ1Y3QgZHJtX21vZGVfbW9kZWluZm8gbW9kZTsKQEAgLTI2OCw0ICszMDksMzcgQEAKIAlfX3U2NCBibHVlOwogfTsKIAorI2RlZmluZSBEUk1fTU9ERV9QQUdFX0ZMSVBfRVZFTlQgMHgwMQorI2RlZmluZSBEUk1fTU9ERV9QQUdFX0ZMSVBfRkxBR1MgRFJNX01PREVfUEFHRV9GTElQX0VWRU5UCisKKy8qCisgKiBSZXF1ZXN0IGEgcGFnZSBmbGlwIG9uIHRoZSBzcGVjaWZpZWQgY3J0Yy4KKyAqCisgKiBUaGlzIGlvY3RsIHdpbGwgYXNrIEtNUyB0byBzY2hlZHVsZSBhIHBhZ2UgZmxpcCBmb3IgdGhlIHNwZWNpZmllZAorICogY3J0Yy4gIE9uY2UgYW55IHBlbmRpbmcgcmVuZGVyaW5nIHRhcmdldGluZyB0aGUgc3BlY2lmaWVkIGZiIChhcyBvZgorICogaW9jdGwgdGltZSkgaGFzIGNvbXBsZXRlZCwgdGhlIGNydGMgd2lsbCBiZSByZXByb2dyYW1tZWQgdG8gZGlzcGxheQorICogdGhhdCBmYiBhZnRlciB0aGUgbmV4dCB2ZXJ0aWNhbCByZWZyZXNoLiAgVGhlIGlvY3RsIHJldHVybnMKKyAqIGltbWVkaWF0ZWx5LCBidXQgc3Vic2VxdWVudCByZW5kZXJpbmcgdG8gdGhlIGN1cnJlbnQgZmIgd2lsbCBibG9jaworICogaW4gdGhlIGV4ZWNidWZmZXIgaW9jdGwgdW50aWwgdGhlIHBhZ2UgZmxpcCBoYXBwZW5zLiAgSWYgYSBwYWdlCisgKiBmbGlwIGlzIGFscmVhZHkgcGVuZGluZyBhcyB0aGUgaW9jdGwgaXMgY2FsbGVkLCBFQlVTWSB3aWxsIGJlCisgKiByZXR1cm5lZC4KKyAqCisgKiBUaGUgaW9jdGwgc3VwcG9ydHMgb25lIGZsYWcsIERSTV9NT0RFX1BBR0VfRkxJUF9FVkVOVCwgd2hpY2ggd2lsbAorICogcmVxdWVzdCB0aGF0IGRybSBzZW5kcyBiYWNrIGEgdmJsYW5rIGV2ZW50IChzZWUgZHJtLmg6IHN0cnVjdAorICogZHJtX2V2ZW50X3ZibGFuaykgd2hlbiB0aGUgcGFnZSBmbGlwIGlzIGRvbmUuICBUaGUgdXNlcl9kYXRhIGZpZWxkCisgKiBwYXNzZWQgaW4gd2l0aCB0aGlzIGlvY3RsIHdpbGwgYmUgcmV0dXJuZWQgYXMgdGhlIHVzZXJfZGF0YSBmaWVsZAorICogaW4gdGhlIHZibGFuayBldmVudCBzdHJ1Y3QuCisgKgorICogVGhlIHJlc2VydmVkIGZpZWxkIG11c3QgYmUgemVybyB1bnRpbCB3ZSBmaWd1cmUgb3V0IHNvbWV0aGluZworICogY2xldmVyIHRvIHVzZSBpdCBmb3IuCisgKi8KKworc3RydWN0IGRybV9tb2RlX2NydGNfcGFnZV9mbGlwIHsKKwlfX3UzMiBjcnRjX2lkOworCV9fdTMyIGZiX2lkOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHJlc2VydmVkOworCV9fdTY0IHVzZXJfZGF0YTsKK307CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX29zX2xpbnV4LmggYi9pbmNsdWRlL2RybS9kcm1fb3NfbGludXguaAppbmRleCAyNjY0MWU5Li4zOTMzNjkxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1fb3NfbGludXguaAorKysgYi9pbmNsdWRlL2RybS9kcm1fb3NfbGludXguaApAQCAtMTIzLDUgKzEyMyw1IEBACiAJcmVtb3ZlX3dhaXRfcXVldWUoJihxdWV1ZSksICZlbnRyeSk7CQkJXAogfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEUk1fV0FLRVVQKCBxdWV1ZSApIHdha2VfdXBfaW50ZXJydXB0aWJsZSggcXVldWUgKQorI2RlZmluZSBEUk1fV0FLRVVQKCBxdWV1ZSApIHdha2VfdXAoIHF1ZXVlICkKICNkZWZpbmUgRFJNX0lOSVRfV0FJVFFVRVVFKCBxdWV1ZSApIGluaXRfd2FpdHF1ZXVlX2hlYWQoIHF1ZXVlICkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2kyYy9jaDcwMDYuaCBiL2luY2x1ZGUvZHJtL2kyYy9jaDcwMDYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzkwYjQzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vaTJjL2NoNzAwNi5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRnJhbmNpc2NvIEplcmV6LgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0RSTV9JMkNfQ0g3MDA2X0hfXworI2RlZmluZSBfX0RSTV9JMkNfQ0g3MDA2X0hfXworCisvKioKKyAqIHN0cnVjdCBjaDcwMDZfZW5jb2Rlcl9wYXJhbXMKKyAqCisgKiBEZXNjcmliZXMgaG93IHRoZSBjaDcwMDYgaXMgd2lyZWQgdXAgd2l0aCB0aGUgR1BVLiBJdCBzaG91bGQgYmUKKyAqIHVzZWQgYXMgdGhlIEBwYXJhbXMgcGFyYW1ldGVyIG9mIGl0cyBAc2V0X2NvbmZpZyBtZXRob2QuCisgKgorICogU2VlICJodHRwOi8vd3d3LmNocm9udGVsLmNvbS9wZGYvNzAwNi5wZGYiIGZvciB0aGVpciBwcmVjaXNlCisgKiBtZWFuaW5nLgorICovCitzdHJ1Y3QgY2g3MDA2X2VuY29kZXJfcGFyYW1zIHsKKwllbnVtIHsKKwkJQ0g3MDA2X0ZPUk1BVF9SR0IxNiA9IDAsCisJCUNINzAwNl9GT1JNQVRfWUNyQ2IyNG0xNiwKKwkJQ0g3MDA2X0ZPUk1BVF9SR0IyNG0xNiwKKwkJQ0g3MDA2X0ZPUk1BVF9SR0IxNSwKKwkJQ0g3MDA2X0ZPUk1BVF9SR0IyNG0xMkMsCisJCUNINzAwNl9GT1JNQVRfUkdCMjRtMTJJLAorCQlDSDcwMDZfRk9STUFUX1JHQjI0bTgsCisJCUNINzAwNl9GT1JNQVRfUkdCMTZtOCwKKwkJQ0g3MDA2X0ZPUk1BVF9SR0IxNW04LAorCQlDSDcwMDZfRk9STUFUX1lDckNiMjRtOCwKKwl9IGlucHV0X2Zvcm1hdDsKKworCWVudW0geworCQlDSDcwMDZfQ0xPQ0tfU0xBVkUgPSAwLAorCQlDSDcwMDZfQ0xPQ0tfTUFTVEVSLAorCX0gY2xvY2tfbW9kZTsKKworCWVudW0geworCQlDSDcwMDZfQ0xPQ0tfRURHRV9ORUcgPSAwLAorCQlDSDcwMDZfQ0xPQ0tfRURHRV9QT1MsCisJfSBjbG9ja19lZGdlOworCisJaW50IHhjbSwgcGNtOworCisJZW51bSB7CisJCUNINzAwNl9TWU5DX1NMQVZFID0gMCwKKwkJQ0g3MDA2X1NZTkNfTUFTVEVSLAorCX0gc3luY19kaXJlY3Rpb247CisKKwllbnVtIHsKKwkJQ0g3MDA2X1NZTkNfU0VQQVJBVEVEID0gMCwKKwkJQ0g3MDA2X1NZTkNfRU1CRURERUQsCisJfSBzeW5jX2VuY29kaW5nOworCisJZW51bSB7CisJCUNINzAwNl9QT1VUXzFfOFYgPSAwLAorCQlDSDcwMDZfUE9VVF8zXzNWLAorCX0gcG91dF9sZXZlbDsKKworCWVudW0geworCQlDSDcwMDZfQUNUSVZFX0hTWU5DID0gMCwKKwkJQ0g3MDA2X0FDVElWRV9EU1RBUlQsCisJfSBhY3RpdmVfZGV0ZWN0OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9pOTE1X2RybS5oIGIvaW5jbHVkZS9kcm0vaTkxNV9kcm0uaAppbmRleCA3ZTBjYjFkLi5lYzNmNWU4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vaTkxNV9kcm0uaAorKysgYi9pbmNsdWRlL2RybS9pOTE1X2RybS5oCkBAIC0yNywxMSArMjcsMTEgQEAKICNpZm5kZWYgX0k5MTVfRFJNX0hfCiAjZGVmaW5lIF9JOTE1X0RSTV9IXwogCisjaW5jbHVkZSAiZHJtLmgiCisKIC8qIFBsZWFzZSBub3RlIHRoYXQgbW9kaWZpY2F0aW9ucyB0byBhbGwgc3RydWN0cyBkZWZpbmVkIGhlcmUgYXJlCiAgKiBzdWJqZWN0IHRvIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGNvbnN0cmFpbnRzLgogICovCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlICJkcm0uaCIKIAogLyogRWFjaCByZWdpb24gaXMgYSBtaW5pbXVtIG9mIDE2aywgYW5kIHRoZXJlIGFyZSBhdCBtb3N0IDI1NSBvZiB0aGVtLgogICovCkBAIC0xODYsNiArMTg2LDggQEAKICNkZWZpbmUgRFJNX0k5MTVfR0VNX01NQVBfR1RUCTB4MjQKICNkZWZpbmUgRFJNX0k5MTVfR0VUX1BJUEVfRlJPTV9DUlRDX0lECTB4MjUKICNkZWZpbmUgRFJNX0k5MTVfR0VNX01BRFZJU0UJMHgyNgorI2RlZmluZSBEUk1fSTkxNV9PVkVSTEFZX1BVVF9JTUFHRQkweDI3CisjZGVmaW5lIERSTV9JOTE1X09WRVJMQVlfQVRUUlMJMHgyOAogCiAjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0lOSVQJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9JTklULCBkcm1faTkxNV9pbml0X3QpCiAjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0ZMVVNICQlEUk1fSU8gKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfRkxVU0gpCkBAIC0yMjEsOCArMjIzLDEwIEBACiAjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9TRVRfVElMSU5HCURSTV9JT1dSIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX1NFVF9USUxJTkcsIHN0cnVjdCBkcm1faTkxNV9nZW1fc2V0X3RpbGluZykKICNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX0dFVF9USUxJTkcJRFJNX0lPV1IgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fR0VUX1RJTElORywgc3RydWN0IGRybV9pOTE1X2dlbV9nZXRfdGlsaW5nKQogI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fR0VUX0FQRVJUVVJFCURSTV9JT1IgIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0dFVF9BUEVSVFVSRSwgc3RydWN0IGRybV9pOTE1X2dlbV9nZXRfYXBlcnR1cmUpCi0jZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFVF9QSVBFX0ZST01fQ1JUQ19JRCBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VUX1BJUEVfRlJPTV9DUlRDX0lELCBzdHJ1Y3QgZHJtX2ludGVsX2dldF9waXBlX2Zyb21fY3J0Y19pZCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VUX1BJUEVfRlJPTV9DUlRDX0lEIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRVRfUElQRV9GUk9NX0NSVENfSUQsIHN0cnVjdCBkcm1faTkxNV9nZXRfcGlwZV9mcm9tX2NydGNfaWQpCiAjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9NQURWSVNFCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fTUFEVklTRSwgc3RydWN0IGRybV9pOTE1X2dlbV9tYWR2aXNlKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9PVkVSTEFZX1BVVF9JTUFHRQlEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSU9DVExfSTkxNV9PVkVSTEFZX0FUVFJTLCBzdHJ1Y3QgZHJtX2ludGVsX292ZXJsYXlfcHV0X2ltYWdlKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9PVkVSTEFZX0FUVFJTCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9PVkVSTEFZX0FUVFJTLCBzdHJ1Y3QgZHJtX2ludGVsX292ZXJsYXlfYXR0cnMpCiAKIC8qIEFsbG93IGRyaXZlcnMgdG8gc3VibWl0IGJhdGNoYnVmZmVycyBkaXJlY3RseSB0byBoYXJkd2FyZSwgcmVseWluZwogICogb24gdGhlIHNlY3VyaXR5IG1lY2hhbmlzbXMgcHJvdmlkZWQgYnkgaGFyZHdhcmUuCkBAIC0yNjYsNiArMjcwLDggQEAKICNkZWZpbmUgSTkxNV9QQVJBTV9DSElQU0VUX0lEICAgICAgICAgICAgNAogI2RlZmluZSBJOTE1X1BBUkFNX0hBU19HRU0gICAgICAgICAgICAgICA1CiAjZGVmaW5lIEk5MTVfUEFSQU1fTlVNX0ZFTkNFU19BVkFJTCAgICAgIDYKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfT1ZFUkxBWSAgICAgICAgICAgNworI2RlZmluZSBJOTE1X1BBUkFNX0hBU19QQUdFRkxJUFBJTkcJIDgKIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfZ2V0cGFyYW0gewogCWludCBwYXJhbTsKQEAgLTY4Niw0ICs2OTIsNzAgQEAKIAlfX3UzMiByZXRhaW5lZDsKIH07CiAKKy8qIGZsYWdzICovCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9UWVBFX01BU0sgCQkweGZmCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9ZVVZfUExBTkFSIAkweDAxCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9ZVVZfUEFDS0VEIAkweDAyCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9SR0IJCTB4MDMKKworI2RlZmluZSBJOTE1X09WRVJMQVlfREVQVEhfTUFTSwkJMHhmZjAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9SR0IyNAkJMHgxMDAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9SR0IxNgkJMHgyMDAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9SR0IxNQkJMHgzMDAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9ZVVY0MjIJCTB4MDEwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfWVVWNDExCQkweDAyMDAKKyNkZWZpbmUgSTkxNV9PVkVSTEFZX1lVVjQyMAkJMHgwMzAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9ZVVY0MTAJCTB4MDQwMAorCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9TV0FQX01BU0sJCTB4ZmYwMDAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9OT19TV0FQCQkweDAwMDAwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfVVZfU1dBUAkJMHgwMTAwMDAKKyNkZWZpbmUgSTkxNV9PVkVSTEFZX1lfU1dBUAkJMHgwMjAwMDAKKyNkZWZpbmUgSTkxNV9PVkVSTEFZX1lfQU5EX1VWX1NXQVAJMHgwMzAwMDAKKworI2RlZmluZSBJOTE1X09WRVJMQVlfRkxBR1NfTUFTSwkJMHhmZjAwMDAwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfRU5BQkxFCQkweDAxMDAwMDAwCisKK3N0cnVjdCBkcm1faW50ZWxfb3ZlcmxheV9wdXRfaW1hZ2UgeworCS8qIHZhcmlvdXMgZmxhZ3MgYW5kIHNyYyBmb3JtYXQgZGVzY3JpcHRpb24gKi8KKwlfX3UzMiBmbGFnczsKKwkvKiBzb3VyY2UgcGljdHVyZSBkZXNjcmlwdGlvbiAqLworCV9fdTMyIGJvX2hhbmRsZTsKKwkvKiBzdHJpZGUgdmFsdWVzIGFuZCBvZmZzZXRzIGFyZSBpbiBieXRlcywgYnVmZmVyIHJlbGF0aXZlICovCisJX191MTYgc3RyaWRlX1k7IC8qIHN0cmlkZSBmb3IgcGFja2VkIGZvcm1hdHMgKi8KKwlfX3UxNiBzdHJpZGVfVVY7CisJX191MzIgb2Zmc2V0X1k7IC8qIG9mZnNldCBmb3IgcGFja2V0IGZvcm1hdHMgKi8KKwlfX3UzMiBvZmZzZXRfVTsKKwlfX3UzMiBvZmZzZXRfVjsKKwkvKiBpbiBwaXhlbHMgKi8KKwlfX3UxNiBzcmNfd2lkdGg7CisJX191MTYgc3JjX2hlaWdodDsKKwkvKiB0byBjb21wZW5zYXRlIHRoZSBzY2FsaW5nIGZhY3RvcnMgZm9yIHBhcnRpYWxseSBjb3ZlcmVkIHN1cmZhY2VzICovCisJX191MTYgc3JjX3NjYW5fd2lkdGg7CisJX191MTYgc3JjX3NjYW5faGVpZ2h0OworCS8qIG91dHB1dCBjcnRjIGRlc2NyaXB0aW9uICovCisJX191MzIgY3J0Y19pZDsKKwlfX3UxNiBkc3RfeDsKKwlfX3UxNiBkc3RfeTsKKwlfX3UxNiBkc3Rfd2lkdGg7CisJX191MTYgZHN0X2hlaWdodDsKK307CisKKy8qIGZsYWdzICovCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9VUERBVEVfQVRUUlMJKDE8PDApCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9VUERBVEVfR0FNTUEJKDE8PDEpCitzdHJ1Y3QgZHJtX2ludGVsX292ZXJsYXlfYXR0cnMgeworCV9fdTMyIGZsYWdzOworCV9fdTMyIGNvbG9yX2tleTsKKwlfX3MzMiBicmlnaHRuZXNzOworCV9fdTMyIGNvbnRyYXN0OworCV9fdTMyIHNhdHVyYXRpb247CisJX191MzIgZ2FtbWEwOworCV9fdTMyIGdhbW1hMTsKKwlfX3UzMiBnYW1tYTI7CisJX191MzIgZ2FtbWEzOworCV9fdTMyIGdhbW1hNDsKKwlfX3UzMiBnYW1tYTU7Cit9OworCiAjZW5kaWYJCQkJLyogX0k5MTVfRFJNX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9tZ2FfZHJtLmggYi9pbmNsdWRlL2RybS9tZ2FfZHJtLmgKaW5kZXggMzI1ZmQ2Zi4uM2ZmYmM0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vbWdhX2RybS5oCisrKyBiL2luY2x1ZGUvZHJtL21nYV9kcm0uaApAQCAtMzUsNyArMzUsNyBAQAogI2lmbmRlZiBfX01HQV9EUk1fSF9fCiAjZGVmaW5lIF9fTUdBX0RSTV9IX18KIAotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSAiZHJtLmgiCiAKIC8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCiAgKiBkZWZpbmVzIGluIHRoZSBYc2VydmVyIGZpbGUgKG1nYV9zYXJlYS5oKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vbm91dmVhdV9kcm0uaCBiL2luY2x1ZGUvZHJtL25vdXZlYXVfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU2N2M0NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL25vdXZlYXVfZHJtLmgKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNSBTdGVwaGFuZSBNYXJjaGVzaW4uCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19OT1VWRUFVX0RSTV9IX18KKyNkZWZpbmUgX19OT1VWRUFVX0RSTV9IX18KKworI2RlZmluZSBOT1VWRUFVX0RSTV9IRUFERVJfUEFUQ0hMRVZFTCAxNQorCitzdHJ1Y3QgZHJtX25vdXZlYXVfY2hhbm5lbF9hbGxvYyB7CisJdWludDMyX3QgICAgIGZiX2N0eGRtYV9oYW5kbGU7CisJdWludDMyX3QgICAgIHR0X2N0eGRtYV9oYW5kbGU7CisKKwlpbnQgICAgICAgICAgY2hhbm5lbDsKKworCS8qIE5vdGlmaWVyIG1lbW9yeSAqLworCXVpbnQzMl90ICAgICBub3RpZmllcl9oYW5kbGU7CisKKwkvKiBEUk0tZW5mb3JjZWQgc3ViY2hhbm5lbCBhc3NpZ25tZW50cyAqLworCXN0cnVjdCB7CisJCXVpbnQzMl90IGhhbmRsZTsKKwkJdWludDMyX3QgZ3JjbGFzczsKKwl9IHN1YmNoYW5bOF07CisJdWludDMyX3QgbnJfc3ViY2hhbjsKK307CisKK3N0cnVjdCBkcm1fbm91dmVhdV9jaGFubmVsX2ZyZWUgeworCWludCBjaGFubmVsOworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dyb2JqX2FsbG9jIHsKKwlpbnQgICAgICBjaGFubmVsOworCXVpbnQzMl90IGhhbmRsZTsKKwlpbnQgICAgICBjbGFzczsKK307CisKK3N0cnVjdCBkcm1fbm91dmVhdV9ub3RpZmllcm9ial9hbGxvYyB7CisJdWludDMyX3QgY2hhbm5lbDsKKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3Qgc2l6ZTsKKwl1aW50MzJfdCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfZ3B1b2JqX2ZyZWUgeworCWludCAgICAgIGNoYW5uZWw7CisJdWludDMyX3QgaGFuZGxlOworfTsKKworLyogRklYTUUgOiBtYXliZSB1bmlmeSB7R0VULFNFVH1QQVJBTXMgKi8KKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9QQ0lfVkVORE9SICAgICAgMworI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX1BDSV9ERVZJQ0UgICAgICA0CisjZGVmaW5lIE5PVVZFQVVfR0VUUEFSQU1fQlVTX1RZUEUgICAgICAgIDUKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9GQl9QSFlTSUNBTCAgICAgNgorI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX0FHUF9QSFlTSUNBTCAgICA3CisjZGVmaW5lIE5PVVZFQVVfR0VUUEFSQU1fRkJfU0laRSAgICAgICAgIDgKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9BR1BfU0laRSAgICAgICAgOQorI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX1BDSV9QSFlTSUNBTCAgICAxMAorI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX0NISVBTRVRfSUQgICAgICAxMQorI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX1ZNX1ZSQU1fQkFTRSAgICAxMgorc3RydWN0IGRybV9ub3V2ZWF1X2dldHBhcmFtIHsKKwl1aW50NjRfdCBwYXJhbTsKKwl1aW50NjRfdCB2YWx1ZTsKK307CisKK3N0cnVjdCBkcm1fbm91dmVhdV9zZXRwYXJhbSB7CisJdWludDY0X3QgcGFyYW07CisJdWludDY0X3QgdmFsdWU7Cit9OworCisjZGVmaW5lIE5PVVZFQVVfR0VNX0RPTUFJTl9DUFUgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0gICAgICAoMSA8PCAxKQorI2RlZmluZSBOT1VWRUFVX0dFTV9ET01BSU5fR0FSVCAgICAgICgxIDw8IDIpCisjZGVmaW5lIE5PVVZFQVVfR0VNX0RPTUFJTl9NQVBQQUJMRSAgKDEgPDwgMykKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9pbmZvIHsKKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3QgZG9tYWluOworCXVpbnQ2NF90IHNpemU7CisJdWludDY0X3Qgb2Zmc2V0OworCXVpbnQ2NF90IG1hcF9oYW5kbGU7CisJdWludDMyX3QgdGlsZV9tb2RlOworCXVpbnQzMl90IHRpbGVfZmxhZ3M7Cit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX25ldyB7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9pbmZvIGluZm87CisJdWludDMyX3QgY2hhbm5lbF9oaW50OworCXVpbnQzMl90IGFsaWduOworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvIHsKKwl1aW50NjRfdCB1c2VyX3ByaXY7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IHJlYWRfZG9tYWluczsKKwl1aW50MzJfdCB3cml0ZV9kb21haW5zOworCXVpbnQzMl90IHZhbGlkX2RvbWFpbnM7CisJdWludDMyX3QgcHJlc3VtZWRfb2s7CisJdWludDMyX3QgcHJlc3VtZWRfZG9tYWluOworCXVpbnQ2NF90IHByZXN1bWVkX29mZnNldDsKK307CisKKyNkZWZpbmUgTk9VVkVBVV9HRU1fUkVMT0NfTE9XICAoMSA8PCAwKQorI2RlZmluZSBOT1VWRUFVX0dFTV9SRUxPQ19ISUdIICgxIDw8IDEpCisjZGVmaW5lIE5PVVZFQVVfR0VNX1JFTE9DX09SICAgKDEgPDwgMikKK3N0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9yZWxvYyB7CisJdWludDMyX3QgYm9faW5kZXg7CisJdWludDMyX3QgcmVsb2NfaW5kZXg7CisJdWludDMyX3QgZmxhZ3M7CisJdWludDMyX3QgZGF0YTsKKwl1aW50MzJfdCB2b3I7CisJdWludDMyX3QgdG9yOworfTsKKworI2RlZmluZSBOT1VWRUFVX0dFTV9NQVhfQlVGRkVSUyAxMDI0CisjZGVmaW5lIE5PVVZFQVVfR0VNX01BWF9SRUxPQ1MgMTAyNAorCitzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWYgeworCXVpbnQzMl90IGNoYW5uZWw7CisJdWludDMyX3QgbnJfZHdvcmRzOworCXVpbnQzMl90IG5yX2J1ZmZlcnM7CisJdWludDMyX3QgbnJfcmVsb2NzOworCXVpbnQ2NF90IGR3b3JkczsKKwl1aW50NjRfdCBidWZmZXJzOworCXVpbnQ2NF90IHJlbG9jczsKK307CisKK3N0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9jYWxsIHsKKwl1aW50MzJfdCBjaGFubmVsOworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBvZmZzZXQ7CisJdWludDMyX3QgbnJfYnVmZmVyczsKKwl1aW50MzJfdCBucl9yZWxvY3M7CisJdWludDMyX3QgbnJfZHdvcmRzOworCXVpbnQ2NF90IGJ1ZmZlcnM7CisJdWludDY0X3QgcmVsb2NzOworCXVpbnQzMl90IHN1ZmZpeDA7CisJdWludDMyX3Qgc3VmZml4MTsKKwkvKiBiZWxvdyBvbmx5IGFjY2Vzc2VkIGZvciBDQUxMMiAqLworCXVpbnQ2NF90IHZyYW1fYXZhaWxhYmxlOworCXVpbnQ2NF90IGdhcnRfYXZhaWxhYmxlOworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9waW4geworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBkb21haW47CisJdWludDY0X3Qgb2Zmc2V0OworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV91bnBpbiB7CisJdWludDMyX3QgaGFuZGxlOworfTsKKworI2RlZmluZSBOT1VWRUFVX0dFTV9DUFVfUFJFUF9OT1dBSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBOT1VWRUFVX0dFTV9DUFVfUFJFUF9OT0JMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBOT1VWRUFVX0dFTV9DUFVfUFJFUF9XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9jcHVfcHJlcCB7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IGZsYWdzOworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9jcHVfZmluaSB7CisJdWludDMyX3QgaGFuZGxlOworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV90aWxlIHsKKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3Qgb2Zmc2V0OworCXVpbnQzMl90IHNpemU7CisJdWludDMyX3QgdGlsZV9tb2RlOworCXVpbnQzMl90IHRpbGVfZmxhZ3M7Cit9OworCitlbnVtIG5vdXZlYXVfYnVzX3R5cGUgeworCU5WX0FHUCAgICAgPSAwLAorCU5WX1BDSSAgICAgPSAxLAorCU5WX1BDSUUgICAgPSAyLAorfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X3NhcmVhIHsKK307CisKKyNkZWZpbmUgRFJNX05PVVZFQVVfQ0FSRF9JTklUICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRFJNX05PVVZFQVVfR0VUUEFSQU0gICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRFJNX05PVVZFQVVfU0VUUEFSQU0gICAgICAgICAgIDB4MDIKKyNkZWZpbmUgRFJNX05PVVZFQVVfQ0hBTk5FTF9BTExPQyAgICAgIDB4MDMKKyNkZWZpbmUgRFJNX05PVVZFQVVfQ0hBTk5FTF9GUkVFICAgICAgIDB4MDQKKyNkZWZpbmUgRFJNX05PVVZFQVVfR1JPQkpfQUxMT0MgICAgICAgIDB4MDUKKyNkZWZpbmUgRFJNX05PVVZFQVVfTk9USUZJRVJPQkpfQUxMT0MgIDB4MDYKKyNkZWZpbmUgRFJNX05PVVZFQVVfR1BVT0JKX0ZSRUUgICAgICAgIDB4MDcKKyNkZWZpbmUgRFJNX05PVVZFQVVfR0VNX05FVyAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgRFJNX05PVVZFQVVfR0VNX1BVU0hCVUYgICAgICAgIDB4NDEKKyNkZWZpbmUgRFJNX05PVVZFQVVfR0VNX1BVU0hCVUZfQ0FMTCAgIDB4NDIKKyNkZWZpbmUgRFJNX05PVVZFQVVfR0VNX1BJTiAgICAgICAgICAgIDB4NDMgLyogIUtNUyBvbmx5ICovCisjZGVmaW5lIERSTV9OT1VWRUFVX0dFTV9VTlBJTiAgICAgICAgICAweDQ0IC8qICFLTVMgb25seSAqLworI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fQ1BVX1BSRVAgICAgICAgMHg0NQorI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fQ1BVX0ZJTkkgICAgICAgMHg0NgorI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fSU5GTyAgICAgICAgICAgMHg0NworI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fUFVTSEJVRl9DQUxMMiAgMHg0OAorCisjZW5kaWYgLyogX19OT1VWRUFVX0RSTV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL3JhZGVvbl9kcm0uaCBiL2luY2x1ZGUvZHJtL3JhZGVvbl9kcm0uaAppbmRleCAzYjk5MzJhLi4zOTUzN2YzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9yYWRlb25fZHJtLmgKKysrIGIvaW5jbHVkZS9kcm0vcmFkZW9uX2RybS5oCkBAIC0zMyw3ICszMyw3IEBACiAjaWZuZGVmIF9fUkFERU9OX0RSTV9IX18KICNkZWZpbmUgX19SQURFT05fRFJNX0hfXwogCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlICJkcm0uaCIKIAogLyogV0FSTklORzogSWYgeW91IGNoYW5nZSBhbnkgb2YgdGhlc2UgZGVmaW5lcywgbWFrZSBzdXJlIHRvIGNoYW5nZSB0aGUKICAqIGRlZmluZXMgaW4gdGhlIFggc2VydmVyIGZpbGUgKHJhZGVvbl9zYXJlYS5oKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vdHRtL3R0bV9ib19hcGkuaCBiL2luY2x1ZGUvZHJtL3R0bS90dG1fYm9fYXBpLmgKaW5kZXggNDkxMTQ2MS4uODFlYjlmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vdHRtL3R0bV9ib19hcGkuaAorKysgYi9pbmNsdWRlL2RybS90dG0vdHRtX2JvX2FwaS5oCkBAIC00NCw2ICs0NCwyOSBAQAogCiBzdHJ1Y3QgZHJtX21tX25vZGU7CiAKKworLyoqCisgKiBzdHJ1Y3QgdHRtX3BsYWNlbWVudAorICoKKyAqIEBmcGZuOgkJZmlyc3QgdmFsaWQgcGFnZSBmcmFtZSBudW1iZXIgdG8gcHV0IHRoZSBvYmplY3QKKyAqIEBscGZuOgkJbGFzdCB2YWxpZCBwYWdlIGZyYW1lIG51bWJlciB0byBwdXQgdGhlIG9iamVjdAorICogQG51bV9wbGFjZW1lbnQ6CW51bWJlciBvZiBwcmVmZXJlZCBwbGFjZW1lbnRzCisgKiBAcGxhY2VtZW50OgkJcHJlZmVyZWQgcGxhY2VtZW50cworICogQG51bV9idXN5X3BsYWNlbWVudDoJbnVtYmVyIG9mIHByZWZlcmVkIHBsYWNlbWVudHMgd2hlbiBuZWVkIHRvIGV2aWN0IGJ1ZmZlcgorICogQGJ1c3lfcGxhY2VtZW50OglwcmVmZXJlZCBwbGFjZW1lbnRzIHdoZW4gbmVlZCB0byBldmljdCBidWZmZXIKKyAqCisgKiBTdHJ1Y3R1cmUgaW5kaWNhdGluZyB0aGUgcGxhY2VtZW50IHlvdSByZXF1ZXN0IGZvciBhbiBvYmplY3QuCisgKi8KK3N0cnVjdCB0dG1fcGxhY2VtZW50IHsKKwl1bnNpZ25lZAlmcGZuOworCXVuc2lnbmVkCWxwZm47CisJdW5zaWduZWQJbnVtX3BsYWNlbWVudDsKKwljb25zdCB1aW50MzJfdAkqcGxhY2VtZW50OworCXVuc2lnbmVkCW51bV9idXN5X3BsYWNlbWVudDsKKwljb25zdCB1aW50MzJfdAkqYnVzeV9wbGFjZW1lbnQ7Cit9OworCisKIC8qKgogICogc3RydWN0IHR0bV9tZW1fcmVnCiAgKgpAQCAtMTA5LDEwICsxMzIsNiBAQAogICogdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQuCiAgKiBAZXZlbnRfcXVldWU6IFF1ZXVlIGZvciBwcm9jZXNzZXMgd2FpdGluZyBvbiBidWZmZXIgb2JqZWN0IHN0YXR1cyBjaGFuZ2UuCiAgKiBAbG9jazogc3BpbmxvY2sgcHJvdGVjdGluZyBtb3N0bHkgc3luY2hyb25pemF0aW9uIG1lbWJlcnMuCi0gKiBAcHJvcG9zZWRfcGxhY2VtZW50OiBQcm9wb3NlZCBwbGFjZW1lbnQgZm9yIHRoZSBidWZmZXIuIENoYW5nZWQgb25seSBieSB0aGUKLSAqIGNyZWF0b3IgcHJpb3IgdG8gdmFsaWRhdGlvbiBhcyBvcHBvc2VkIHRvIGJvLT5tZW0ucHJvcG9zZWRfZmxhZ3Mgd2hpY2ggaXMKLSAqIGNoYW5nZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIHByaW9yIHRvIGEgYnVmZmVyIG1vdmUgaWYgaXQgd2FudHMgdG8gb3V0c21hcnQKLSAqIHRoZSBidWZmZXIgY3JlYXRvciAvIHVzZXIuIFRoaXMgbGF0dGVyIGhhcHBlbnMsIGZvciBleGFtcGxlLCBhdCBldmljdGlvbi4KICAqIEBtZW06IHN0cnVjdHVyZSBkZXNjcmliaW5nIGN1cnJlbnQgcGxhY2VtZW50LgogICogQHBlcnNpc3RhbnRfc3dhcF9zdG9yYWdlOiBVc3VhbGx5IHRoZSBzd2FwIHN0b3JhZ2UgaXMgZGVsZXRlZCBmb3IgYnVmZmVycwogICogcGlubmVkIGluIHBoeXNpY2FsIG1lbW9yeS4gSWYgdGhpcyBiZWhhdmlvdXIgaXMgbm90IGRlc2lyZWQsIHRoaXMgbWVtYmVyCkBAIC0xNzcsNyArMTk2LDYgQEAKIAkgKiBNZW1iZXJzIHByb3RlY3RlZCBieSB0aGUgYm86OnJlc2VydmVkIGxvY2suCiAJICovCiAKLQl1aW50MzJfdCBwcm9wb3NlZF9wbGFjZW1lbnQ7CiAJc3RydWN0IHR0bV9tZW1fcmVnIG1lbTsKIAlzdHJ1Y3QgZmlsZSAqcGVyc2lzdGFudF9zd2FwX3N0b3JhZ2U7CiAJc3RydWN0IHR0bV90dCAqdHRtOwpAQCAtMjg1LDI5ICszMDMsMzAgQEAKICAqIE5vdGU6IEl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byBibG9jayB2YWxpZGF0aW9ucyBiZWZvcmUgdGhlCiAgKiB3YWl0IGJ5IHJlc2VydmluZyB0aGUgYnVmZmVyLgogICogUmV0dXJucyAtRUJVU1kgaWYgbm9fd2FpdCBpcyB0cnVlIGFuZCB0aGUgYnVmZmVyIGlzIGJ1c3kuCi0gKiBSZXR1cm5zIC1FUkVTVEFSVCBpZiBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbC4KKyAqIFJldHVybnMgLUVSRVNUQVJUU1lTIGlmIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLgogICovCiBleHRlcm4gaW50IHR0bV9ib193YWl0KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sIGJvb2wgbGF6eSwKIAkJICAgICAgIGJvb2wgaW50ZXJydXB0aWJsZSwgYm9vbCBub193YWl0KTsKIC8qKgotICogdHRtX2J1ZmZlcl9vYmplY3RfdmFsaWRhdGUKKyAqIHR0bV9ib192YWxpZGF0ZQogICoKICAqIEBibzogVGhlIGJ1ZmZlciBvYmplY3QuCi0gKiBAcHJvcG9zZWRfcGxhY2VtZW50OiBQcm9wb3NlZF9wbGFjZW1lbnQgZm9yIHRoZSBidWZmZXIgb2JqZWN0LgorICogQHBsYWNlbWVudDogUHJvcG9zZWQgcGxhY2VtZW50IGZvciB0aGUgYnVmZmVyIG9iamVjdC4KICAqIEBpbnRlcnJ1cHRpYmxlOiBTbGVlcCBpbnRlcnJ1cHRpYmxlIGlmIHNsZWVwaW5nLgogICogQG5vX3dhaXQ6IFJldHVybiBpbW1lZGlhdGVseSBpZiB0aGUgYnVmZmVyIGlzIGJ1c3kuCiAgKgogICogQ2hhbmdlcyBwbGFjZW1lbnQgYW5kIGNhY2hpbmcgcG9saWN5IG9mIHRoZSBidWZmZXIgb2JqZWN0Ci0gKiBhY2NvcmRpbmcgdG8gYm86OnByb3Bvc2VkX2ZsYWdzLgorICogYWNjb3JkaW5nIHByb3Bvc2VkIHBsYWNlbWVudC4KICAqIFJldHVybnMKLSAqIC1FSU5WQUwgb24gaW52YWxpZCBwcm9wb3NlZF9mbGFncy4KKyAqIC1FSU5WQUwgb24gaW52YWxpZCBwcm9wb3NlZCBwbGFjZW1lbnQuCiAgKiAtRU5PTUVNIG9uIG91dC1vZi1tZW1vcnkgY29uZGl0aW9uLgogICogLUVCVVNZIGlmIG5vX3dhaXQgaXMgdHJ1ZSBhbmQgYnVmZmVyIGJ1c3kuCi0gKiAtRVJFU1RBUlQgaWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwuCisgKiAtRVJFU1RBUlRTWVMgaWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwuCiAgKi8KLWV4dGVybiBpbnQgdHRtX2J1ZmZlcl9vYmplY3RfdmFsaWRhdGUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKLQkJCQkgICAgICB1aW50MzJfdCBwcm9wb3NlZF9wbGFjZW1lbnQsCi0JCQkJICAgICAgYm9vbCBpbnRlcnJ1cHRpYmxlLCBib29sIG5vX3dhaXQpOworZXh0ZXJuIGludCB0dG1fYm9fdmFsaWRhdGUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKKwkJCQlzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqcGxhY2VtZW50LAorCQkJCWJvb2wgaW50ZXJydXB0aWJsZSwgYm9vbCBub193YWl0KTsKKwogLyoqCiAgKiB0dG1fYm9fdW5yZWYKICAqCkBAIC0zMjgsNyArMzQ3LDcgQEAKICAqIHdhaXRpbmcgZm9yIGJ1ZmZlciBpZGxlLiBUaGlzIGxvY2sgaXMgcmVjdXJzaXZlLgogICogUmV0dXJucwogICogLUVCVVNZIGlmIHRoZSBidWZmZXIgaXMgYnVzeSBhbmQgbm9fd2FpdCBpcyB0cnVlLgotICogLUVSRVNUQVJUIGlmIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLgorICogLUVSRVNUQVJUU1lTIGlmIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLgogICovCiAKIGV4dGVybiBpbnQKQEAgLTM0Myw3ICszNjIsNyBAQAogZXh0ZXJuIHZvaWQgdHRtX2JvX3N5bmNjcHVfd3JpdGVfcmVsZWFzZShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKTsKIAogLyoqCi0gKiB0dG1fYnVmZmVyX29iamVjdF9pbml0CisgKiB0dG1fYm9faW5pdAogICoKICAqIEBiZGV2OiBQb2ludGVyIHRvIGEgdHRtX2JvX2RldmljZSBzdHJ1Y3QuCiAgKiBAYm86IFBvaW50ZXIgdG8gYSB0dG1fYnVmZmVyX29iamVjdCB0byBiZSBpbml0aWFsaXplZC4KQEAgLTM3MSwyMCArMzkwLDIwIEBACiAgKiBSZXR1cm5zCiAgKiAtRU5PTUVNOiBPdXQgb2YgbWVtb3J5LgogICogLUVJTlZBTDogSW52YWxpZCBwbGFjZW1lbnQgZmxhZ3MuCi0gKiAtRVJFU1RBUlQ6IEludGVycnVwdGVkIGJ5IHNpZ25hbCB3aGlsZSBzbGVlcGluZyB3YWl0aW5nIGZvciByZXNvdXJjZXMuCisgKiAtRVJFU1RBUlRTWVM6IEludGVycnVwdGVkIGJ5IHNpZ25hbCB3aGlsZSBzbGVlcGluZyB3YWl0aW5nIGZvciByZXNvdXJjZXMuCiAgKi8KIAotZXh0ZXJuIGludCB0dG1fYnVmZmVyX29iamVjdF9pbml0KHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LAotCQkJCSAgc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKLQkJCQkgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCQkgIGVudW0gdHRtX2JvX3R5cGUgdHlwZSwKLQkJCQkgIHVpbnQzMl90IGZsYWdzLAotCQkJCSAgdWludDMyX3QgcGFnZV9hbGlnbm1lbnQsCi0JCQkJICB1bnNpZ25lZCBsb25nIGJ1ZmZlcl9zdGFydCwKLQkJCQkgIGJvb2wgaW50ZXJydWJ0aWJsZSwKLQkJCQkgIHN0cnVjdCBmaWxlICpwZXJzaXN0YW50X3N3YXBfc3RvcmFnZSwKLQkJCQkgIHNpemVfdCBhY2Nfc2l6ZSwKLQkJCQkgIHZvaWQgKCpkZXN0cm95KSAoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICopKTsKK2V4dGVybiBpbnQgdHRtX2JvX2luaXQoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsCisJCQlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAorCQkJdW5zaWduZWQgbG9uZyBzaXplLAorCQkJZW51bSB0dG1fYm9fdHlwZSB0eXBlLAorCQkJc3RydWN0IHR0bV9wbGFjZW1lbnQgKnBsYWNlbWVudCwKKwkJCXVpbnQzMl90IHBhZ2VfYWxpZ25tZW50LAorCQkJdW5zaWduZWQgbG9uZyBidWZmZXJfc3RhcnQsCisJCQlib29sIGludGVycnVidGlibGUsCisJCQlzdHJ1Y3QgZmlsZSAqcGVyc2lzdGFudF9zd2FwX3N0b3JhZ2UsCisJCQlzaXplX3QgYWNjX3NpemUsCisJCQl2b2lkICgqZGVzdHJveSkgKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqKSk7CiAvKioKICAqIHR0bV9ib19zeW5jY3B1X29iamVjdF9pbml0CiAgKgpAQCAtNDA1LDQ3ICs0MjQsNDMgQEAKICAqIEdFTSB1c2VyIGludGVyZmFjZS4KICAqIEBwX2JvOiBPbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gKnBfYm8gcG9pbnRzIHRvIHRoZSBjcmVhdGVkIG9iamVjdC4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIHR0bV9idWZmZXJfb2JqZWN0LCBhbmQgdGhlbiBjYWxscwotICogdHRtX2J1ZmZlcl9vYmplY3RfaW5pdCBvbiB0aGF0IG9iamVjdC4KLSAqIFRoZSBkZXN0cm95IGZ1bmN0aW9uIGlzIHNldCB0byBrZnJlZSgpLgorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSB0dG1fYnVmZmVyX29iamVjdCwgYW5kIHRoZW4gY2FsbHMgdHRtX2JvX2luaXQKKyAqIG9uIHRoYXQgb2JqZWN0LiBUaGUgZGVzdHJveSBmdW5jdGlvbiBpcyBzZXQgdG8ga2ZyZWUoKS4KICAqIFJldHVybnMKICAqIC1FTk9NRU06IE91dCBvZiBtZW1vcnkuCiAgKiAtRUlOVkFMOiBJbnZhbGlkIHBsYWNlbWVudCBmbGFncy4KLSAqIC1FUkVTVEFSVDogSW50ZXJydXB0ZWQgYnkgc2lnbmFsIHdoaWxlIHdhaXRpbmcgZm9yIHJlc291cmNlcy4KKyAqIC1FUkVTVEFSVFNZUzogSW50ZXJydXB0ZWQgYnkgc2lnbmFsIHdoaWxlIHdhaXRpbmcgZm9yIHJlc291cmNlcy4KICAqLwogCi1leHRlcm4gaW50IHR0bV9idWZmZXJfb2JqZWN0X2NyZWF0ZShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBzaXplLAotCQkJCSAgICBlbnVtIHR0bV9ib190eXBlIHR5cGUsCi0JCQkJICAgIHVpbnQzMl90IGZsYWdzLAotCQkJCSAgICB1aW50MzJfdCBwYWdlX2FsaWdubWVudCwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBidWZmZXJfc3RhcnQsCi0JCQkJICAgIGJvb2wgaW50ZXJydXB0aWJsZSwKLQkJCQkgICAgc3RydWN0IGZpbGUgKnBlcnNpc3RhbnRfc3dhcF9zdG9yYWdlLAotCQkJCSAgICBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKipwX2JvKTsKK2V4dGVybiBpbnQgdHRtX2JvX2NyZWF0ZShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwKKwkJCQl1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJZW51bSB0dG1fYm9fdHlwZSB0eXBlLAorCQkJCXN0cnVjdCB0dG1fcGxhY2VtZW50ICpwbGFjZW1lbnQsCisJCQkJdWludDMyX3QgcGFnZV9hbGlnbm1lbnQsCisJCQkJdW5zaWduZWQgbG9uZyBidWZmZXJfc3RhcnQsCisJCQkJYm9vbCBpbnRlcnJ1cHRpYmxlLAorCQkJCXN0cnVjdCBmaWxlICpwZXJzaXN0YW50X3N3YXBfc3RvcmFnZSwKKwkJCQlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKipwX2JvKTsKIAogLyoqCiAgKiB0dG1fYm9fY2hlY2tfcGxhY2VtZW50CiAgKgotICogQGJvOiB0aGUgYnVmZmVyIG9iamVjdC4KLSAqIEBzZXRfZmxhZ3M6IHBsYWNlbWVudCBmbGFncyB0byBzZXQuCi0gKiBAY2xyX2ZsYWdzOiBwbGFjZW1lbnQgZmxhZ3MgdG8gY2xlYXIuCisgKiBAYm86CQl0aGUgYnVmZmVyIG9iamVjdC4KKyAqIEBwbGFjZW1lbnQ6CXBsYWNlbWVudHMKICAqCiAgKiBQZXJmb3JtcyBtaW5pbWFsIHZhbGlkaXR5IGNoZWNraW5nIG9uIGFuIGludGVuZGVkIGNoYW5nZSBvZgogICogcGxhY2VtZW50IGZsYWdzLgogICogUmV0dXJucwogICogLUVJTlZBTDogSW50ZW5kZWQgY2hhbmdlIGlzIGludmFsaWQgb3Igbm90IGFsbG93ZWQuCiAgKi8KLQogZXh0ZXJuIGludCB0dG1fYm9fY2hlY2tfcGxhY2VtZW50KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sCi0JCQkJICB1aW50MzJfdCBzZXRfZmxhZ3MsIHVpbnQzMl90IGNscl9mbGFncyk7CisJCQkJCXN0cnVjdCB0dG1fcGxhY2VtZW50ICpwbGFjZW1lbnQpOwogCiAvKioKICAqIHR0bV9ib19pbml0X21tCiAgKgogICogQGJkZXY6IFBvaW50ZXIgdG8gYSB0dG1fYm9fZGV2aWNlIHN0cnVjdC4KICAqIEBtZW1fdHlwZTogVGhlIG1lbW9yeSB0eXBlLgotICogQHBfb2Zmc2V0OiBvZmZzZXQgZm9yIG1hbmFnZWQgYXJlYSBpbiBwYWdlcy4KICAqIEBwX3NpemU6IHNpemUgbWFuYWdlZCBhcmVhIGluIHBhZ2VzLgogICoKICAqIEluaXRpYWxpemUgYSBtYW5hZ2VyIGZvciBhIGdpdmVuIG1lbW9yeSB0eXBlLgpAQCAtNDU4LDcgKzQ3Myw3IEBACiAgKi8KIAogZXh0ZXJuIGludCB0dG1fYm9faW5pdF9tbShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwgdW5zaWduZWQgdHlwZSwKLQkJCSAgdW5zaWduZWQgbG9uZyBwX29mZnNldCwgdW5zaWduZWQgbG9uZyBwX3NpemUpOworCQkJCXVuc2lnbmVkIGxvbmcgcF9zaXplKTsKIC8qKgogICogdHRtX2JvX2NsZWFuX21tCiAgKgpAQCAtNTAzLDcgKzUxOCw3IEBACiAgKgogICogUmV0dXJuczoKICAqIC1FSU5WQUw6IEludmFsaWQgb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdHlwZS4KLSAqIC1FUkVTVEFSVDogVGhlIGNhbGwgd2FzIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsIHdoaWxlIHdhaXRpbmcgdG8KKyAqIC1FUkVTVEFSVFNZUzogVGhlIGNhbGwgd2FzIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsIHdoaWxlIHdhaXRpbmcgdG8KICAqIGV2aWN0IGEgYnVmZmVyLgogICovCiAKQEAgLTYwNiw3ICs2MjEsNyBAQAogICogYmUgY2FsbGVkIGZyb20gdGhlIGZvcHM6OnJlYWQgYW5kIGZvcHM6OndyaXRlIG1ldGhvZC4KICAqIFJldHVybnM6CiAgKiBTZWUgbWFuICgyKSB3cml0ZSwgbWFuKDIpIHJlYWQuIEluIHBhcnRpY3VsYXIsCi0gKiB0aGUgZnVuY3Rpb24gbWF5IHJldHVybiAtRUlOVFIgaWYKKyAqIHRoZSBmdW5jdGlvbiBtYXkgcmV0dXJuIC1FUkVTVEFSVFNZUyBpZgogICogaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwuCiAgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vdHRtL3R0bV9ib19kcml2ZXIuaCBiL2luY2x1ZGUvZHJtL3R0bS90dG1fYm9fZHJpdmVyLmgKaW5kZXggZThjZDZkMi4uZmY3NjY0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vdHRtL3R0bV9ib19kcml2ZXIuaAorKysgYi9pbmNsdWRlL2RybS90dG0vdHRtX2JvX2RyaXZlci5oCkBAIC0yNDIsMTIgKzI0Miw2IEBACiAvKioKICAqIHN0cnVjdCB0dG1fYm9fZHJpdmVyCiAgKgotICogQG1lbV90eXBlX3ByaW86IFByaW9yaXR5IGFycmF5IG9mIG1lbW9yeSB0eXBlcyB0byBwbGFjZSBhIGJ1ZmZlciBvYmplY3QgaW4KLSAqIGlmIGl0IGZpdHMgd2l0aG91dCBldmljdGluZyBidWZmZXJzIGZyb20gYW55IG9mIHRoZXNlIG1lbW9yeSB0eXBlcy4KLSAqIEBtZW1fYnVzeV9wcmlvOiBQcmlvcml0eSBhcnJheSBvZiBtZW1vcnkgdHlwZXMgdG8gcGxhY2UgYSBidWZmZXIgb2JqZWN0IGluCi0gKiBpZiBpdCBuZWVkcyB0byBldmljdCBidWZmZXJzIHRvIG1ha2Ugcm9vbS4KLSAqIEBudW1fbWVtX3R5cGVfcHJpbzogTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBAbWVtX3R5cGVfcHJpbyBhcnJheS4KLSAqIEBudW1fbWVtX2J1c3lfcHJpbzogTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBAbnVtX21lbV9idXN5X3ByaW8gYXJyYXkuCiAgKiBAY3JlYXRlX3R0bV9iYWNrZW5kX2VudHJ5OiBDYWxsYmFjayB0byBjcmVhdGUgYSBzdHJ1Y3QgdHRtX2JhY2tlbmQuCiAgKiBAaW52YWxpZGF0ZV9jYWNoZXM6IENhbGxiYWNrIHRvIGludmFsaWRhdGUgcmVhZCBjYWNoZXMgd2hlbiBhIGJ1ZmZlciBvYmplY3QKICAqIGhhcyBiZWVuIGV2aWN0ZWQuCkBAIC0yNjUsMTEgKzI1OSw2IEBACiAgKi8KIAogc3RydWN0IHR0bV9ib19kcml2ZXIgewotCWNvbnN0IHVpbnQzMl90ICptZW1fdHlwZV9wcmlvOwotCWNvbnN0IHVpbnQzMl90ICptZW1fYnVzeV9wcmlvOwotCXVpbnQzMl90IG51bV9tZW1fdHlwZV9wcmlvOwotCXVpbnQzMl90IG51bV9tZW1fYnVzeV9wcmlvOwotCiAJLyoqCiAJICogc3RydWN0IHR0bV9ib19kcml2ZXIgbWVtYmVyIGNyZWF0ZV90dG1fYmFja2VuZF9lbnRyeQogCSAqCkBAIC0zMDYsNyArMjk1LDggQEAKIAkgKiBmaW5pc2hlZCwgdGhleSdsbCBlbmQgdXAgaW4gYm8tPm1lbS5mbGFncwogCSAqLwogCi0JIHVpbnQzMl90KCpldmljdF9mbGFncykgKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pOworCSB2b2lkKCpldmljdF9mbGFncykgKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sCisJCQkJc3RydWN0IHR0bV9wbGFjZW1lbnQgKnBsYWNlbWVudCk7CiAJLyoqCiAJICogc3RydWN0IHR0bV9ib19kcml2ZXIgbWVtYmVyIG1vdmU6CiAJICoKQEAgLTU0NSw2ICs1MzUsMTUgQEAKIGV4dGVybiBpbnQgdHRtX3R0X2JpbmQoc3RydWN0IHR0bV90dCAqdHRtLCBzdHJ1Y3QgdHRtX21lbV9yZWcgKmJvX21lbSk7CiAKIC8qKgorICogdHRtX3R0X3BvcHVsYXRlOgorICoKKyAqIEB0dG06IFRoZSBzdHJ1Y3QgdHRtX3R0IHRvIGNvbnRhaW4gdGhlIGJhY2tpbmcgcGFnZXMuCisgKgorICogQWRkIGJhY2tpbmcgcGFnZXMgdG8gYWxsIG9mIEB0dG0KKyAqLworZXh0ZXJuIGludCB0dG1fdHRfcG9wdWxhdGUoc3RydWN0IHR0bV90dCAqdHRtKTsKKworLyoqCiAgKiB0dG1fdHRtX2Rlc3Ryb3k6CiAgKgogICogQHR0bTogVGhlIHN0cnVjdCB0dG1fdHQuCkBAIC02MzksMTIgKzYzOCwxMiBAQAogICogLUVCVVNZOiBObyBzcGFjZSBhdmFpbGFibGUgKG9ubHkgaWYgbm9fd2FpdCA9PSAxKS4KICAqIC1FTk9NRU06IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBidWZmZXIgb2JqZWN0LCBlaXRoZXIgZHVlIHRvCiAgKiBmcmFnbWVudGF0aW9uIG9yIGNvbmN1cnJlbnQgYWxsb2NhdG9ycy4KLSAqIC1FUkVTVEFSVDogQW4gaW50ZXJydXB0aWJsZSBzbGVlcCB3YXMgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwuCisgKiAtRVJFU1RBUlRTWVM6IEFuIGludGVycnVwdGlibGUgc2xlZXAgd2FzIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLgogICovCiBleHRlcm4gaW50IHR0bV9ib19tZW1fc3BhY2Uoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKLQkJCSAgICB1aW50MzJfdCBwcm9wb3NlZF9wbGFjZW1lbnQsCi0JCQkgICAgc3RydWN0IHR0bV9tZW1fcmVnICptZW0sCi0JCQkgICAgYm9vbCBpbnRlcnJ1cHRpYmxlLCBib29sIG5vX3dhaXQpOworCQkJCXN0cnVjdCB0dG1fcGxhY2VtZW50ICpwbGFjZW1lbnQsCisJCQkJc3RydWN0IHR0bV9tZW1fcmVnICptZW0sCisJCQkJYm9vbCBpbnRlcnJ1cHRpYmxlLCBib29sIG5vX3dhaXQpOwogLyoqCiAgKiB0dG1fYm9fd2FpdF9mb3JfY3B1CiAgKgpAQCAtNjU0LDcgKzY1Myw3IEBACiAgKiBXYWl0IHVudGlsIGEgYnVmZmVyIG9iamVjdCBpcyBubyBsb25nZXIgc3luYydlZCBmb3IgQ1BVIGFjY2Vzcy4KICAqIFJldHVybnM6CiAgKiAtRUJVU1k6IEJ1ZmZlciBvYmplY3Qgd2FzIHN5bmMnZWQgZm9yIENQVSBhY2Nlc3MuIChvbmx5IGlmIG5vX3dhaXQgPT0gMSkuCi0gKiAtRVJFU1RBUlQ6IEFuIGludGVycnVwdGlibGUgc2xlZXAgd2FzIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLgorICogLUVSRVNUQVJUU1lTOiBBbiBpbnRlcnJ1cHRpYmxlIHNsZWVwIHdhcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbC4KICAqLwogCiBleHRlcm4gaW50IHR0bV9ib193YWl0X2NwdShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLCBib29sIG5vX3dhaXQpOwpAQCAtNzU4LDcgKzc1Nyw3IEBACiAgKiAtRUFHQUlOOiBUaGUgcmVzZXJ2YXRpb24gbWF5IGNhdXNlIGEgZGVhZGxvY2suCiAgKiBSZWxlYXNlIGFsbCBidWZmZXIgcmVzZXJ2YXRpb25zLCB3YWl0IGZvciBAYm8gdG8gYmVjb21lIHVucmVzZXJ2ZWQgYW5kCiAgKiB0cnkgYWdhaW4uIChvbmx5IGlmIHVzZV9zZXF1ZW5jZSA9PSAxKS4KLSAqIC1FUkVTVEFSVDogQSB3YWl0IGZvciB0aGUgYnVmZmVyIHRvIGJlY29tZSB1bnJlc2VydmVkIHdhcyBpbnRlcnJ1cHRlZCBieQorICogLUVSRVNUQVJUU1lTOiBBIHdhaXQgZm9yIHRoZSBidWZmZXIgdG8gYmVjb21lIHVucmVzZXJ2ZWQgd2FzIGludGVycnVwdGVkIGJ5CiAgKiBhIHNpZ25hbC4gUmVsZWFzZSBhbGwgYnVmZmVyIHJlc2VydmF0aW9ucyBhbmQgcmV0dXJuIHRvIHVzZXItc3BhY2UuCiAgKi8KIGV4dGVybiBpbnQgdHRtX2JvX3Jlc2VydmUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKQEAgLTc5OSw3ICs3OTgsNyBAQAogICoKICAqIFJldHVybnM6CiAgKiAtRUJVU1k6IElmIG5vX3dhaXQgPT0gMSBhbmQgdGhlIGJ1ZmZlciBpcyBhbHJlYWR5IHJlc2VydmVkLgotICogLUVSRVNUQVJUOiBJZiBpbnRlcnJ1cHRpYmxlID09IDEgYW5kIHRoZSBwcm9jZXNzIHJlY2VpdmVkIGEgc2lnbmFsCisgKiAtRVJFU1RBUlRTWVM6IElmIGludGVycnVwdGlibGUgPT0gMSBhbmQgdGhlIHByb2Nlc3MgcmVjZWl2ZWQgYSBzaWduYWwKICAqIHdoaWxlIHNsZWVwaW5nLgogICovCiBleHRlcm4gaW50IHR0bV9ib19ibG9ja19yZXNlcnZhdGlvbihzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vdHRtL3R0bV9leGVjYnVmX3V0aWwuaCBiL2luY2x1ZGUvZHJtL3R0bS90dG1fZXhlY2J1Zl91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QyYzQ3NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL3R0bS90dG1fZXhlY2J1Zl91dGlsLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA5IFZNd2FyZSwgSW5jLiwgUGFsbyBBbHRvLCBDQS4sIFVTQQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEF1dGhvcnM6IFRob21hcyBIZWxsc3Ryb20gPHRoZWxsc3Ryb20tYXQtdm13YXJlLWRvdC1jb20+CisgKi8KKworI2lmbmRlZiBfVFRNX0VYRUNCVUZfVVRJTF9IXworI2RlZmluZSBfVFRNX0VYRUNCVUZfVVRJTF9IXworCisjaW5jbHVkZSAidHRtL3R0bV9ib19hcGkuaCIKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKy8qKgorICogc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIKKyAqCisgKiBAaGVhZDogICAgICAgICAgIGxpc3QgaGVhZCBmb3IgdGhyZWFkLXByaXZhdGUgbGlzdC4KKyAqIEBibzogICAgICAgICAgICAgcmVmY291bnRlZCBidWZmZXIgb2JqZWN0IHBvaW50ZXIuCisgKiBAbmV3X3N5bmNfb2JqX2FyZzogTmV3IHN5bmNfb2JqX2FyZyBmb3IgQGJvLCB0byBiZSB1c2VkIG9uY2UKKyAqIGFkZGluZyBhIG5ldyBzeW5jIG9iamVjdC4KKyAqIEByZXNlcnZpZWQ6ICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgQGJvIGhhcyBiZWVuIHJlc2VydmVkIGZvciB2YWxpZGF0aW9uLgorICovCisKK3N0cnVjdCB0dG1fdmFsaWRhdGVfYnVmZmVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibzsKKwl2b2lkICpuZXdfc3luY19vYmpfYXJnOworCWJvb2wgcmVzZXJ2ZWQ7Cit9OworCisvKioKKyAqIGZ1bmN0aW9uIHR0bV9ldV9iYWNrb2ZmX3Jlc2VydmF0aW9uCisgKgorICogQGxpc3Q6ICAgICB0aHJlYWQgcHJpdmF0ZSBsaXN0IG9mIHR0bV92YWxpZGF0ZV9idWZmZXIgc3RydWN0cy4KKyAqCisgKiBVbmRvZXMgYWxsIGJ1ZmZlciB2YWxpZGF0aW9uIHJlc2VydmF0aW9ucyBmb3IgYm9zIHBvaW50ZWQgdG8gYnkKKyAqIHRoZSBsaXN0IGVudHJpZXMuCisgKi8KKworZXh0ZXJuIHZvaWQgdHRtX2V1X2JhY2tvZmZfcmVzZXJ2YXRpb24oc3RydWN0IGxpc3RfaGVhZCAqbGlzdCk7CisKKy8qKgorICogZnVuY3Rpb24gdHRtX2V1X3Jlc2VydmVfYnVmZmVycworICoKKyAqIEBsaXN0OiAgICB0aHJlYWQgcHJpdmF0ZSBsaXN0IG9mIHR0bV92YWxpZGF0ZV9idWZmZXIgc3RydWN0cy4KKyAqIEB2YWxfc2VxOiBBIHVuaXF1ZSBzZXF1ZW5jZSBudW1iZXIuCisgKgorICogVHJpZXMgdG8gcmVzZXJ2ZSBib3MgcG9pbnRlZCB0byBieSB0aGUgbGlzdCBlbnRyaWVzIGZvciB2YWxpZGF0aW9uLgorICogSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgMCwgYWxsIGJ1ZmZlcnMgYXJlIG1hcmtlZCBhcyAidW5mZW5jZWQiLAorICogdGFrZW4gb2ZmIHRoZSBscnUgbGlzdHMgYW5kIGFyZSBub3Qgc3luY2VkIGZvciB3cml0ZSBDUFUgdXNhZ2UuCisgKgorICogSWYgdGhlIGZ1bmN0aW9uIGRldGVjdHMgYSBkZWFkbG9jayBkdWUgdG8gbXVsdGlwbGUgdGhyZWFkcyB0cnlpbmcgdG8KKyAqIHJlc2VydmUgdGhlIHNhbWUgYnVmZmVycyBpbiByZXZlcnNlIG9yZGVyLCBhbGwgdGhyZWFkcyBleGNlcHQgb25lIHdpbGwKKyAqIGJhY2sgb2ZmIGFuZCByZXRyeS4gVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAgd2hpbGUgd2FpdGluZyBmb3IKKyAqIENQVSB3cml0ZSByZXNlcnZhdGlvbnMgdG8gYmUgY2xlYXJlZCwgYW5kIGZvciBvdGhlciB0aHJlYWRzIHRvCisgKiB1bnJlc2VydmUgdGhlaXIgYnVmZmVycy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gLUVSRVNUQVJUIG9yIC1FQUdBSU4gaWYgdGhlIGNhbGxpbmcgcHJvY2VzcworICogcmVjZWl2ZXMgYSBzaWduYWwgd2hpbGUgd2FpdGluZy4gSW4gdGhhdCBjYXNlLCBubyBidWZmZXJzIG9uIHRoZSBsaXN0CisgKiB3aWxsIGJlIHJlc2VydmVkIHVwb24gcmV0dXJuLgorICoKKyAqIEJ1ZmZlcnMgcmVzZXJ2ZWQgYnkgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdW5yZXNlcnZlZCBieQorICogYSBjYWxsIHRvIGVpdGhlciB0dG1fZXVfYmFja29mZl9yZXNlcnZhdGlvbigpIG9yCisgKiB0dG1fZXVfZmVuY2VfYnVmZmVyX29iamVjdHMoKSB3aGVuIGNvbW1hbmQgc3VibWlzc2lvbiBpcyBjb21wbGV0ZSBvcgorICogaGFzIGZhaWxlZC4KKyAqLworCitleHRlcm4gaW50IHR0bV9ldV9yZXNlcnZlX2J1ZmZlcnMoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgdWludDMyX3QgdmFsX3NlcSk7CisKKy8qKgorICogZnVuY3Rpb24gdHRtX2V1X2ZlbmNlX2J1ZmZlcl9vYmplY3RzLgorICoKKyAqIEBsaXN0OiAgICAgICAgdGhyZWFkIHByaXZhdGUgbGlzdCBvZiB0dG1fdmFsaWRhdGVfYnVmZmVyIHN0cnVjdHMuCisgKiBAc3luY19vYmo6ICAgIFRoZSBuZXcgc3luYyBvYmplY3QgZm9yIHRoZSBidWZmZXJzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGNvbW1hbmQgc3VibWlzc2lvbiBpcyBjb21wbGV0ZSwgYW5kCisgKiBpdCB3aWxsIGFkZCBhIG5ldyBzeW5jIG9iamVjdCB0byBib3MgcG9pbnRlZCB0byBieSBlbnRyaWVzIG9uIEBsaXN0LgorICogSXQgYWxzbyB1bnJlc2VydmVzIGFsbCBidWZmZXJzLCBwdXR0aW5nIHRoZW0gb24gbHJ1IGxpc3RzLgorICoKKyAqLworCitleHRlcm4gdm9pZCB0dG1fZXVfZmVuY2VfYnVmZmVyX29iamVjdHMoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgdm9pZCAqc3luY19vYmopOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL3R0bS90dG1fbG9jay5oIGIvaW5jbHVkZS9kcm0vdHRtL3R0bV9sb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFiYTBiMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL3R0bS90dG1fbG9jay5oCkBAIC0wLDAgKzEsMjQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBBdXRob3JzOiBUaG9tYXMgSGVsbHN0cm9tIDx0aGVsbHN0cm9tLWF0LXZtd2FyZS1kb3QtY29tPgorICovCisKKy8qKiBAZmlsZSB0dG1fbG9jay5oCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHNpbXBsZSByZXBsYWNlbWVudCBmb3IgdGhlIGJ1ZmZlciBtYW5hZ2VyIHVzZQorICogb2YgdGhlIERSTSBoZWF2eXdlaWdodCBoYXJkd2FyZSBsb2NrLgorICogVGhlIGxvY2sgaXMgYSByZWFkLXdyaXRlIGxvY2suIFRha2luZyBpdCBpbiByZWFkIG1vZGUgYW5kIHdyaXRlIG1vZGUKKyAqIGlzIHJlbGF0aXZlbHkgZmFzdCwgYW5kIGludGVuZGVkIGZvciBpbi1rZXJuZWwgdXNlIG9ubHkuCisgKgorICogVGhlIHZ0IG1vZGUgaXMgdXNlZCBvbmx5IHdoZW4gdGhlcmUgaXMgYSBuZWVkIHRvIGJsb2NrIGFsbAorICogdXNlci1zcGFjZSBwcm9jZXNzZXMgZnJvbSB2YWxpZGF0aW5nIGJ1ZmZlcnMuCisgKiBJdCdzIGFsbG93ZWQgdG8gbGVhdmUga2VybmVsIHNwYWNlIHdpdGggdGhlIHZ0IGxvY2sgaGVsZC4KKyAqIElmIGEgdXNlci1zcGFjZSBwcm9jZXNzIGRpZXMgd2hpbGUgaGF2aW5nIHRoZSB2dC1sb2NrLAorICogaXQgd2lsbCBiZSByZWxlYXNlZCBkdXJpbmcgdGhlIGZpbGUgZGVzY3JpcHRvciByZWxlYXNlLiBUaGUgdnQgbG9jaworICogZXhjbHVkZXMgd3JpdGUgbG9jayBhbmQgcmVhZCBsb2NrLgorICoKKyAqIFRoZSBzdXNwZW5kIG1vZGUgaXMgdXNlZCB0byBsb2NrIG91dCBhbGwgVFRNIHVzZXJzIHdoZW4gcHJlcGFyaW5nIGZvcgorICogYW5kIGV4ZWN1dGluZyBzdXNwZW5kIG9wZXJhdGlvbnMuCisgKgorICovCisKKyNpZm5kZWYgX1RUTV9MT0NLX0hfCisjZGVmaW5lIF9UVE1fTE9DS19IXworCisjaW5jbHVkZSAidHRtL3R0bV9vYmplY3QuaCIKKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisvKioKKyAqIHN0cnVjdCB0dG1fbG9jaworICoKKyAqIEBiYXNlOiB0dG0gYmFzZSBvYmplY3QgdXNlZCBzb2xlbHkgdG8gcmVsZWFzZSB0aGUgbG9jayBpZiB0aGUgY2xpZW50CisgKiBob2xkaW5nIHRoZSBsb2NrIGRpZXMuCisgKiBAcXVldWU6IFF1ZXVlIGZvciBwcm9jZXNzZXMgd2FpdGluZyBmb3IgbG9jayBjaGFuZ2Utb2Ytc3RhdHVzLgorICogQGxvY2s6IFNwaW5sb2NrIHByb3RlY3Rpbmcgc29tZSBsb2NrIG1lbWJlcnMuCisgKiBAcnc6IFJlYWQtd3JpdGUgbG9jayBjb3VudGVyLiBQcm90ZWN0ZWQgYnkgQGxvY2suCisgKiBAZmxhZ3M6IExvY2sgc3RhdGUuIFByb3RlY3RlZCBieSBAbG9jay4KKyAqIEBraWxsX3Rha2VyczogQm9vbGVhbiB3aGV0aGVyIHRvIGtpbGwgdGFrZXJzIG9mIHRoZSBsb2NrLgorICogQHNpZ25hbDogU2lnbmFsIHRvIHNlbmQgd2hlbiBraWxsX3Rha2VycyBpcyB0cnVlLgorICovCisKK3N0cnVjdCB0dG1fbG9jayB7CisJc3RydWN0IHR0bV9iYXNlX29iamVjdCBiYXNlOworCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlOworCXNwaW5sb2NrX3QgbG9jazsKKwlpbnQzMl90IHJ3OworCXVpbnQzMl90IGZsYWdzOworCWJvb2wga2lsbF90YWtlcnM7CisJaW50IHNpZ25hbDsKKwlzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp2dF9ob2xkZXI7Cit9OworCisKKy8qKgorICogdHRtX2xvY2tfaW5pdAorICoKKyAqIEBsb2NrOiBQb2ludGVyIHRvIGEgc3RydWN0IHR0bV9sb2NrCisgKiBJbml0aWFsaXplcyB0aGUgbG9jay4KKyAqLworZXh0ZXJuIHZvaWQgdHRtX2xvY2tfaW5pdChzdHJ1Y3QgdHRtX2xvY2sgKmxvY2spOworCisvKioKKyAqIHR0bV9yZWFkX3VubG9jaworICoKKyAqIEBsb2NrOiBQb2ludGVyIHRvIGEgc3RydWN0IHR0bV9sb2NrCisgKgorICogUmVsZWFzZXMgYSByZWFkIGxvY2suCisgKi8KK2V4dGVybiB2b2lkIHR0bV9yZWFkX3VubG9jayhzdHJ1Y3QgdHRtX2xvY2sgKmxvY2spOworCisvKioKKyAqIHR0bV9yZWFkX2xvY2sKKyAqCisgKiBAbG9jazogUG9pbnRlciB0byBhIHN0cnVjdCB0dG1fbG9jaworICogQGludGVycnVwdGlibGU6IEludGVycnVwdGlibGUgc2xlZXBpbmcgd2hpbGUgd2FpdGluZyBmb3IgYSBsb2NrLgorICoKKyAqIFRha2VzIHRoZSBsb2NrIGluIHJlYWQgbW9kZS4KKyAqIFJldHVybnM6CisgKiAtRVJFU1RBUlRTWVMgSWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwgYW5kIGludGVycnVwdGlibGUgaXMgdHJ1ZS4KKyAqLworZXh0ZXJuIGludCB0dG1fcmVhZF9sb2NrKHN0cnVjdCB0dG1fbG9jayAqbG9jaywgYm9vbCBpbnRlcnJ1cHRpYmxlKTsKKworLyoqCisgKiB0dG1fcmVhZF90cnlsb2NrCisgKgorICogQGxvY2s6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgdHRtX2xvY2sKKyAqIEBpbnRlcnJ1cHRpYmxlOiBJbnRlcnJ1cHRpYmxlIHNsZWVwaW5nIHdoaWxlIHdhaXRpbmcgZm9yIGEgbG9jay4KKyAqCisgKiBUcmllcyB0byB0YWtlIHRoZSBsb2NrIGluIHJlYWQgbW9kZS4gSWYgdGhlIGxvY2sgaXMgYWxyZWFkeSBoZWxkCisgKiBpbiB3cml0ZSBtb2RlLCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gLUVCVVNZLiBJZiB0aGUgbG9jayBpcyBoZWxkCisgKiBpbiB2dCBvciBzdXNwZW5kIG1vZGUsIHRoZSBmdW5jdGlvbiB3aWxsIHNsZWVwIHVudGlsIHRoZXNlIG1vZGVzCisgKiBhcmUgdW5sb2NrZWQuCisgKgorICogUmV0dXJuczoKKyAqIC1FQlVTWSBUaGUgbG9jayB3YXMgYWxyZWFkeSBoZWxkIGluIHdyaXRlIG1vZGUuCisgKiAtRVJFU1RBUlRTWVMgSWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwgYW5kIGludGVycnVwdGlibGUgaXMgdHJ1ZS4KKyAqLworZXh0ZXJuIGludCB0dG1fcmVhZF90cnlsb2NrKHN0cnVjdCB0dG1fbG9jayAqbG9jaywgYm9vbCBpbnRlcnJ1cHRpYmxlKTsKKworLyoqCisgKiB0dG1fd3JpdGVfdW5sb2NrCisgKgorICogQGxvY2s6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgdHRtX2xvY2sKKyAqCisgKiBSZWxlYXNlcyBhIHdyaXRlIGxvY2suCisgKi8KK2V4dGVybiB2b2lkIHR0bV93cml0ZV91bmxvY2soc3RydWN0IHR0bV9sb2NrICpsb2NrKTsKKworLyoqCisgKiB0dG1fd3JpdGVfbG9jaworICoKKyAqIEBsb2NrOiBQb2ludGVyIHRvIGEgc3RydWN0IHR0bV9sb2NrCisgKiBAaW50ZXJydXB0aWJsZTogSW50ZXJydXB0aWJsZSBzbGVlcGluZyB3aGlsZSB3YWl0aW5nIGZvciBhIGxvY2suCisgKgorICogVGFrZXMgdGhlIGxvY2sgaW4gd3JpdGUgbW9kZS4KKyAqIFJldHVybnM6CisgKiAtRVJFU1RBUlRTWVMgSWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwgYW5kIGludGVycnVwdGlibGUgaXMgdHJ1ZS4KKyAqLworZXh0ZXJuIGludCB0dG1fd3JpdGVfbG9jayhzdHJ1Y3QgdHRtX2xvY2sgKmxvY2ssIGJvb2wgaW50ZXJydXB0aWJsZSk7CisKKy8qKgorICogdHRtX2xvY2tfZG93bmdyYWRlCisgKgorICogQGxvY2s6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgdHRtX2xvY2sKKyAqCisgKiBEb3duZ3JhZGVzIGEgd3JpdGUgbG9jayB0byBhIHJlYWQgbG9jay4KKyAqLworZXh0ZXJuIHZvaWQgdHRtX2xvY2tfZG93bmdyYWRlKHN0cnVjdCB0dG1fbG9jayAqbG9jayk7CisKKy8qKgorICogdHRtX3N1c3BlbmRfbG9jaworICoKKyAqIEBsb2NrOiBQb2ludGVyIHRvIGEgc3RydWN0IHR0bV9sb2NrCisgKgorICogVGFrZXMgdGhlIGxvY2sgaW4gc3VzcGVuZCBtb2RlLiBFeGNsdWRlcyByZWFkIGFuZCB3cml0ZSBtb2RlLgorICovCitleHRlcm4gdm9pZCB0dG1fc3VzcGVuZF9sb2NrKHN0cnVjdCB0dG1fbG9jayAqbG9jayk7CisKKy8qKgorICogdHRtX3N1c3BlbmRfdW5sb2NrCisgKgorICogQGxvY2s6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgdHRtX2xvY2sKKyAqCisgKiBSZWxlYXNlcyBhIHN1c3BlbmQgbG9jaworICovCitleHRlcm4gdm9pZCB0dG1fc3VzcGVuZF91bmxvY2soc3RydWN0IHR0bV9sb2NrICpsb2NrKTsKKworLyoqCisgKiB0dG1fdnRfbG9jaworICoKKyAqIEBsb2NrOiBQb2ludGVyIHRvIGEgc3RydWN0IHR0bV9sb2NrCisgKiBAaW50ZXJydXB0aWJsZTogSW50ZXJydXB0aWJsZSBzbGVlcGluZyB3aGlsZSB3YWl0aW5nIGZvciBhIGxvY2suCisgKiBAdGZpbGU6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgdHRtX29iamVjdF9maWxlIHRvIHJlZ2lzdGVyIHRoZSBsb2NrIHdpdGguCisgKgorICogVGFrZXMgdGhlIGxvY2sgaW4gdnQgbW9kZS4KKyAqIFJldHVybnM6CisgKiAtRVJFU1RBUlRTWVMgSWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwgYW5kIGludGVycnVwdGlibGUgaXMgdHJ1ZS4KKyAqIC1FTk9NRU06IE91dCBvZiBtZW1vcnkgd2hlbiBsb2NraW5nLgorICovCitleHRlcm4gaW50IHR0bV92dF9sb2NrKHN0cnVjdCB0dG1fbG9jayAqbG9jaywgYm9vbCBpbnRlcnJ1cHRpYmxlLAorCQkgICAgICAgc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUpOworCisvKioKKyAqIHR0bV92dF91bmxvY2sKKyAqCisgKiBAbG9jazogUG9pbnRlciB0byBhIHN0cnVjdCB0dG1fbG9jaworICoKKyAqIFJlbGVhc2VzIGEgdnQgbG9jay4KKyAqIFJldHVybnM6CisgKiAtRUlOVkFMIElmIHRoZSBsb2NrIHdhcyBub3QgaGVsZC4KKyAqLworZXh0ZXJuIGludCB0dG1fdnRfdW5sb2NrKHN0cnVjdCB0dG1fbG9jayAqbG9jayk7CisKKy8qKgorICogdHRtX3dyaXRlX3VubG9jaworICoKKyAqIEBsb2NrOiBQb2ludGVyIHRvIGEgc3RydWN0IHR0bV9sb2NrCisgKgorICogUmVsZWFzZXMgYSB3cml0ZSBsb2NrLgorICovCitleHRlcm4gdm9pZCB0dG1fd3JpdGVfdW5sb2NrKHN0cnVjdCB0dG1fbG9jayAqbG9jayk7CisKKy8qKgorICogdHRtX3dyaXRlX2xvY2sKKyAqCisgKiBAbG9jazogUG9pbnRlciB0byBhIHN0cnVjdCB0dG1fbG9jaworICogQGludGVycnVwdGlibGU6IEludGVycnVwdGlibGUgc2xlZXBpbmcgd2hpbGUgd2FpdGluZyBmb3IgYSBsb2NrLgorICoKKyAqIFRha2VzIHRoZSBsb2NrIGluIHdyaXRlIG1vZGUuCisgKiBSZXR1cm5zOgorICogLUVSRVNUQVJUU1lTIElmIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsIGFuZCBpbnRlcnJ1cHRpYmxlIGlzIHRydWUuCisgKi8KK2V4dGVybiBpbnQgdHRtX3dyaXRlX2xvY2soc3RydWN0IHR0bV9sb2NrICpsb2NrLCBib29sIGludGVycnVwdGlibGUpOworCisvKioKKyAqIHR0bV9sb2NrX3NldF9raWxsCisgKgorICogQGxvY2s6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgdHRtX2xvY2sKKyAqIEB2YWw6IEJvb2xlYW4gd2hldGhlciB0byBraWxsIHByb2Nlc3NlcyB0YWtpbmcgdGhlIGxvY2suCisgKiBAc2lnbmFsOiBTaWduYWwgdG8gc2VuZCB0byB0aGUgcHJvY2VzcyB0YWtpbmcgdGhlIGxvY2suCisgKgorICogVGhlIGtpbGwtd2hlbi10YWtpbmctbG9jayBmdW5jdGlvbmFsaXR5IGlzIHVzZWQgdG8ga2lsbCBwcm9jZXNzZXMgdGhhdCBrZWVwCisgKiBvbiB1c2luZyB0aGUgVFRNIGZ1bmN0aW9uYWxpdHkgd2hlbiBpdHMgcmVzb3VyY2VzIGhhcyBiZWVuIHRha2VuIGRvd24sIGZvcgorICogZXhhbXBsZSB3aGVuIHRoZSBYIHNlcnZlciBleGl0cy4gQSB0eXBpY2FsIHNlcXVlbmNlIHdvdWxkIGxvb2sgbGlrZSB0aGlzOgorICogLSBYIHNlcnZlciB0YWtlcyBsb2NrIGluIHdyaXRlIG1vZGUuCisgKiAtIHR0bV9sb2NrX3NldF9raWxsKCkgaXMgY2FsbGVkIHdpdGggQHZhbCBzZXQgdG8gdHJ1ZS4KKyAqIC0gQXMgcGFydCBvZiBYIHNlcnZlciBleGl0LCBUVE0gcmVzb3VyY2VzIGFyZSB0YWtlbiBkb3duLgorICogLSBYIHNlcnZlciByZWxlYXNlcyB0aGUgbG9jayBvbiBmaWxlIHJlbGVhc2UuCisgKiAtIEFub3RoZXIgZHJpIGNsaWVudCB3YW50cyB0byByZW5kZXIsIHRha2VzIHRoZSBsb2NrIGFuZCBpcyBraWxsZWQuCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdHRtX2xvY2tfc2V0X2tpbGwoc3RydWN0IHR0bV9sb2NrICpsb2NrLCBib29sIHZhbCwKKwkJCQkgICAgIGludCBzaWduYWwpCit7CisJbG9jay0+a2lsbF90YWtlcnMgPSB2YWw7CisJaWYgKHZhbCkKKwkJbG9jay0+c2lnbmFsID0gc2lnbmFsOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL3R0bS90dG1fbWVtb3J5LmggYi9pbmNsdWRlL2RybS90dG0vdHRtX21lbW9yeS5oCmluZGV4IDY5ODNhN2MuLmIxOTkxNzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL3R0bS90dG1fbWVtb3J5LmgKKysrIGIvaW5jbHVkZS9kcm0vdHRtL3R0bV9tZW1vcnkuaApAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogCiAvKioKICAqIHN0cnVjdCB0dG1fbWVtX3NocmluayAtIGNhbGxiYWNrIHRvIHNocmluayBUVE0gbWVtb3J5IHVzYWdlLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vdHRtL3R0bV9vYmplY3QuaCBiL2luY2x1ZGUvZHJtL3R0bS90dG1fb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAzY2E0ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL3R0bS90dG1fb2JqZWN0LmgKQEAgLTAsMCArMSwyNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA5IFZNd2FyZSwgSW5jLiwgUGFsbyBBbHRvLCBDQS4sIFVTQQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEF1dGhvcnM6IFRob21hcyBIZWxsc3Ryb20gPHRoZWxsc3Ryb20tYXQtdm13YXJlLWRvdC1jb20+CisgKi8KKy8qKiBAZmlsZSB0dG1fb2JqZWN0LmgKKyAqCisgKiBCYXNlLSBhbmQgcmVmZXJlbmNlIG9iamVjdCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHZhcmlvdXMKKyAqIHR0bSBvYmplY3RzLiBJbXBsZW1lbnRzIHJlZmVyZW5jZSBjb3VudGluZywgbWluaW1hbCBzZWN1cml0eSBjaGVja3MKKyAqIGFuZCByZWxlYXNlIG9uIGZpbGUgY2xvc2UuCisgKi8KKworI2lmbmRlZiBfVFRNX09CSkVDVF9IXworI2RlZmluZSBfVFRNX09CSkVDVF9IXworCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgImRybV9oYXNodGFiLmgiCisjaW5jbHVkZSA8bGludXgva3JlZi5oPgorI2luY2x1ZGUgPHR0bS90dG1fbWVtb3J5Lmg+CisKKy8qKgorICogZW51bSB0dG1fcmVmX3R5cGUKKyAqCisgKiBEZXNjcmliZXMgd2hhdCB0eXBlIG9mIHJlZmVyZW5jZSBhIHJlZiBvYmplY3QgaG9sZHMuCisgKgorICogVFRNX1JFRl9VU0FHRSBpcyBhIHNpbXBsZSByZWZjb3VudCBvbiBhIGJhc2Ugb2JqZWN0LgorICoKKyAqIFRUTV9SRUZfU1lOQ0NQVV9SRUFEIGlzIGEgU1lOQ0NQVV9SRUFEIHJlZmVyZW5jZSBvbiBhCisgKiBidWZmZXIgb2JqZWN0LgorICoKKyAqIFRUTV9SRUZfU1lOQ0NQVV9XUklURSBpcyBhIFNZTkNDUFVfV1JJVEUgcmVmZXJlbmNlIG9uIGEKKyAqIGJ1ZmZlciBvYmplY3QuCisgKgorICovCisKK2VudW0gdHRtX3JlZl90eXBlIHsKKwlUVE1fUkVGX1VTQUdFLAorCVRUTV9SRUZfU1lOQ0NQVV9SRUFELAorCVRUTV9SRUZfU1lOQ0NQVV9XUklURSwKKwlUVE1fUkVGX05VTQorfTsKKworLyoqCisgKiBlbnVtIHR0bV9vYmplY3RfdHlwZQorICoKKyAqIE9uZSBlbnRyeSBwZXIgdHRtIG9iamVjdCB0eXBlLgorICogRGV2aWNlLXNwZWNpZmljIHR5cGVzIHNob3VsZCB1c2UgdGhlCisgKiB0dG1fZHJpdmVyX3R5cGV4IHR5cGVzLgorICovCisKK2VudW0gdHRtX29iamVjdF90eXBlIHsKKwl0dG1fZmVuY2VfdHlwZSwKKwl0dG1fYnVmZmVyX3R5cGUsCisJdHRtX2xvY2tfdHlwZSwKKwl0dG1fZHJpdmVyX3R5cGUwID0gMjU2LAorCXR0bV9kcml2ZXJfdHlwZTEKK307CisKK3N0cnVjdCB0dG1fb2JqZWN0X2ZpbGU7CitzdHJ1Y3QgdHRtX29iamVjdF9kZXZpY2U7CisKKy8qKgorICogc3RydWN0IHR0bV9iYXNlX29iamVjdAorICoKKyAqIEBoYXNoOiBoYXNoIGVudHJ5IGZvciB0aGUgcGVyLWRldmljZSBvYmplY3QgaGFzaC4KKyAqIEB0eXBlOiBkZXJpdmVkIHR5cGUgdGhpcyBvYmplY3QgaXMgYmFzZSBjbGFzcyBmb3IuCisgKiBAc2hhcmVhYmxlOiBPdGhlciB0dG1fb2JqZWN0X2ZpbGVzIGNhbiBhY2Nlc3MgdGhpcyBvYmplY3QuCisgKgorICogQHRmaWxlOiBQb2ludGVyIHRvIHR0bV9vYmplY3RfZmlsZSBvZiB0aGUgY3JlYXRvci4KKyAqIE5VTEwgaWYgdGhlIG9iamVjdCB3YXMgbm90IGNyZWF0ZWQgYnkgYSB1c2VyIHJlcXVlc3QuCisgKiAoa2VybmVsIG9iamVjdCkuCisgKgorICogQHJlZmNvdW50OiBOdW1iZXIgb2YgcmVmZXJlbmNlcyB0byB0aGlzIG9iamVjdCwgbm90CisgKiBpbmNsdWRpbmcgdGhlIGhhc2ggZW50cnkuIEEgcmVmZXJlbmNlIHRvIGEgYmFzZSBvYmplY3QgY2FuCisgKiBvbmx5IGJlIGhlbGQgYnkgYSByZWYgb2JqZWN0LgorICoKKyAqIEByZWZjb3VudF9yZWxlYXNlOiBBIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZXJlIGFyZQorICogbm8gbW9yZSByZWZlcmVuY2VzIHRvIHRoaXMgb2JqZWN0LiBUaGlzIGZ1bmN0aW9uIHNob3VsZAorICogZGVzdHJveSB0aGUgb2JqZWN0IChvciBtYWtlIHN1cmUgZGVzdHJ1Y3Rpb24gZXZlbnR1YWxseSBoYXBwZW5zKSwKKyAqIGFuZCB3aGVuIGl0IGlzIGNhbGxlZCwgdGhlIG9iamVjdCBoYXMKKyAqIGFscmVhZHkgYmVlbiB0YWtlbiBvdXQgb2YgdGhlIHBlci1kZXZpY2UgaGFzaC4gVGhlIHBhcmFtZXRlcgorICogImJhc2UiIHNob3VsZCBiZSBzZXQgdG8gTlVMTCBieSB0aGUgZnVuY3Rpb24uCisgKgorICogQHJlZl9vYmpfcmVsZWFzZTogQSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBhIHJlZmVyZW5jZSBvYmplY3QKKyAqIHdpdGggYW5vdGhlciB0dG1fcmVmX3R5cGUgdGhhbiBUVE1fUkVGX1VTQUdFIGlzIGRlbGV0ZWQuCisgKiB0aGlzIGZ1bmN0aW9uIG1heSwgZm9yIGV4YW1wbGUsIHJlbGVhc2UgYSBsb2NrIGhlbGQgYnkgYSB1c2VyLXNwYWNlCisgKiBwcm9jZXNzLgorICoKKyAqIFRoaXMgc3RydWN0IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgYSBiYXNlIHN0cnVjdCBmb3Igb2JqZWN0cyB0aGF0CisgKiBhcmUgdmlzaWJsZSB0byB1c2VyLXNwYWNlLiBJdCBwcm92aWRlcyBhIGdsb2JhbCBuYW1lLCByYWNlLXNhZmUKKyAqIGFjY2VzcyBhbmQgcmVmY291bnRpbmcsIG1pbmltYWwgYWNjZXNzIGNvbnRvbCBhbmQgaG9va3MgZm9yIHVucmVmIGFjdGlvbnMuCisgKi8KKworc3RydWN0IHR0bV9iYXNlX29iamVjdCB7CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gaGFzaDsKKwllbnVtIHR0bV9vYmplY3RfdHlwZSBvYmplY3RfdHlwZTsKKwlib29sIHNoYXJlYWJsZTsKKwlzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZTsKKwlzdHJ1Y3Qga3JlZiByZWZjb3VudDsKKwl2b2lkICgqcmVmY291bnRfcmVsZWFzZSkgKHN0cnVjdCB0dG1fYmFzZV9vYmplY3QgKipiYXNlKTsKKwl2b2lkICgqcmVmX29ial9yZWxlYXNlKSAoc3RydWN0IHR0bV9iYXNlX29iamVjdCAqYmFzZSwKKwkJCQkgZW51bSB0dG1fcmVmX3R5cGUgcmVmX3R5cGUpOworfTsKKworLyoqCisgKiB0dG1fYmFzZV9vYmplY3RfaW5pdAorICoKKyAqIEB0ZmlsZTogUG9pbnRlciB0byBhIHN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUuCisgKiBAYmFzZTogVGhlIHN0cnVjdCB0dG1fYmFzZV9vYmplY3QgdG8gaW5pdGlhbGl6ZS4KKyAqIEBzaGFyZWFibGU6IFRoaXMgb2JqZWN0IGlzIHNoYXJlYWJsZSB3aXRoIG90aGVyIGFwcGxjYXRpb25zLgorICogKGRpZmZlcmVudCBAdGZpbGUgcG9pbnRlcnMuKQorICogQHR5cGU6IFRoZSBvYmplY3QgdHlwZS4KKyAqIEByZWZjb3VudF9yZWxlYXNlOiBTZWUgdGhlIHN0cnVjdCB0dG1fYmFzZV9vYmplY3QgZGVzY3JpcHRpb24uCisgKiBAcmVmX29ial9yZWxlYXNlOiBTZWUgdGhlIHN0cnVjdCB0dG1fYmFzZV9vYmplY3QgZGVzY3JpcHRpb24uCisgKgorICogSW5pdGlhbGl6ZXMgYSBzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0LgorICovCisKK2V4dGVybiBpbnQgdHRtX2Jhc2Vfb2JqZWN0X2luaXQoc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUsCisJCQkJc3RydWN0IHR0bV9iYXNlX29iamVjdCAqYmFzZSwKKwkJCQlib29sIHNoYXJlYWJsZSwKKwkJCQllbnVtIHR0bV9vYmplY3RfdHlwZSB0eXBlLAorCQkJCXZvaWQgKCpyZWZjb3VudF9yZWxlYXNlKSAoc3RydWN0IHR0bV9iYXNlX29iamVjdAorCQkJCQkJCSAgKiopLAorCQkJCXZvaWQgKCpyZWZfb2JqX3JlbGVhc2UpIChzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0CisJCQkJCQkJICosCisJCQkJCQkJIGVudW0gdHRtX3JlZl90eXBlCisJCQkJCQkJIHJlZl90eXBlKSk7CisKKy8qKgorICogdHRtX2Jhc2Vfb2JqZWN0X2xvb2t1cAorICoKKyAqIEB0ZmlsZTogUG9pbnRlciB0byBhIHN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUuCisgKiBAa2V5OiBIYXNoIGtleQorICoKKyAqIExvb2tzIHVwIGEgc3RydWN0IHR0bV9iYXNlX29iamVjdCB3aXRoIHRoZSBrZXkgQGtleS4KKyAqIEFsc28gdmVyaWZpZXMgdGhhdCB0aGUgb2JqZWN0IGlzIHZpc2libGUgdG8gdGhlIGFwcGxpY2F0aW9uLCBieQorICogY29tcGFyaW5nIHRoZSBAdGZpbGUgYXJndW1lbnQgYW5kIGNoZWNraW5nIHRoZSBvYmplY3Qgc2hhcmVhYmxlIGZsYWcuCisgKi8KKworZXh0ZXJuIHN0cnVjdCB0dG1fYmFzZV9vYmplY3QgKnR0bV9iYXNlX29iamVjdF9sb29rdXAoc3RydWN0IHR0bV9vYmplY3RfZmlsZQorCQkJCQkJICAgICAgKnRmaWxlLCB1aW50MzJfdCBrZXkpOworCisvKioKKyAqIHR0bV9iYXNlX29iamVjdF91bnJlZgorICoKKyAqIEBwX2Jhc2U6IFBvaW50ZXIgdG8gYSBwb2ludGVyIHJlZmVybmNpbmcgYSBzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0LgorICoKKyAqIERlY3JlbWVudHMgdGhlIGJhc2Ugb2JqZWN0IHJlZmNvdW50IGFuZCBjbGVhcnMgdGhlIHBvaW50ZXIgcG9pbnRlZCB0byBieQorICogcF9iYXNlLgorICovCisKK2V4dGVybiB2b2lkIHR0bV9iYXNlX29iamVjdF91bnJlZihzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0ICoqcF9iYXNlKTsKKworLyoqCisgKiB0dG1fcmVmX29iamVjdF9hZGQuCisgKgorICogQHRmaWxlOiBBIHN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgcmVwcmVzZW50aW5nIHRoZSBhcHBsaWNhdGlvbiBvd25pbmcgdGhlCisgKiByZWZfb2JqZWN0LgorICogQGJhc2U6IFRoZSBiYXNlIG9iamVjdCB0byByZWZlcmVuY2UuCisgKiBAcmVmX3R5cGU6IFRoZSB0eXBlIG9mIHJlZmVyZW5jZS4KKyAqIEBleGlzdGVkOiBVcG9uIGNvbXBsZXRpb24sIGluZGljYXRlcyB0aGF0IGFuIGlkZW50aWNhbCByZWZlcmVuY2Ugb2JqZWN0CisgKiBhbHJlYWR5IGV4aXN0ZWQsIGFuZCB0aGUgcmVmY291bnQgd2FzIHVwcGVkIG9uIHRoYXQgb2JqZWN0IGluc3RlYWQuCisgKgorICogQWRkaW5nIGEgcmVmIG9iamVjdCB0byBhIGJhc2Ugb2JqZWN0IGlzIGJhc2ljYWxseSBsaWtlIHJlZmVyZW5jaW5nIHRoZQorICogYmFzZSBvYmplY3QsIGJ1dCBhIHVzZXItc3BhY2UgYXBwbGljYXRpb24gaG9sZHMgdGhlIHJlZmVyZW5jZS4gV2hlbiB0aGUKKyAqIGZpbGUgY29ycmVzcG9uZGluZyB0byBAdGZpbGUgaXMgY2xvc2VkLCBhbGwgaXRzIHJlZmVyZW5jZSBvYmplY3RzIGFyZQorICogZGVsZXRlZC4gQSByZWZlcmVuY2Ugb2JqZWN0IGNhbiBoYXZlIGRpZmZlcmVudCB0eXBlcyBkZXBlbmRpbmcgb24gd2hhdAorICogaXQncyBpbnRlbmRlZCBmb3IuIEl0IGNhbiBiZSByZWZjb3VudGluZyB0byBwcmV2ZW50IG9iamVjdCBkZXN0cnVjdGlvbiwKKyAqIFdoZW4gdXNlci1zcGFjZSB0YWtlcyBhIGxvY2ssIGl0IGNhbiBhZGQgYSByZWYgb2JqZWN0IHRvIHRoYXQgbG9jayB0bworICogbWFrZSBzdXJlIHRoZSBsb2NrIGlzIHJlbGVhc2VkIGlmIHRoZSBhcHBsaWNhdGlvbiBkaWVzLiBBIHJlZiBvYmplY3QKKyAqIHdpbGwgaG9sZCBhIHNpbmdsZSByZWZlcmVuY2Ugb24gYSBiYXNlIG9iamVjdC4KKyAqLworZXh0ZXJuIGludCB0dG1fcmVmX29iamVjdF9hZGQoc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUsCisJCQkgICAgICBzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0ICpiYXNlLAorCQkJICAgICAgZW51bSB0dG1fcmVmX3R5cGUgcmVmX3R5cGUsIGJvb2wgKmV4aXN0ZWQpOworLyoqCisgKiB0dG1fcmVmX29iamVjdF9iYXNlX3VucmVmCisgKgorICogQGtleTogS2V5IHJlcHJlc2VudGluZyB0aGUgYmFzZSBvYmplY3QuCisgKiBAcmVmX3R5cGU6IFJlZiB0eXBlIG9mIHRoZSByZWYgb2JqZWN0IHRvIGJlIGRlcmVmZXJlbmNlZC4KKyAqCisgKiBVbnJlZmVyZW5jZSBhIHJlZiBvYmplY3Qgd2l0aCB0eXBlIEByZWZfdHlwZQorICogb24gdGhlIGJhc2Ugb2JqZWN0IGlkZW50aWZpZWQgYnkgQGtleS4gSWYgdGhlcmUgYXJlIG5vIGR1cGxpY2F0ZQorICogcmVmZXJlbmNlcywgdGhlIHJlZiBvYmplY3Qgd2lsbCBiZSBkZXN0cm95ZWQgYW5kIHRoZSBiYXNlIG9iamVjdAorICogd2lsbCBiZSB1bnJlZmVyZW5jZWQuCisgKi8KK2V4dGVybiBpbnQgdHRtX3JlZl9vYmplY3RfYmFzZV91bnJlZihzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcga2V5LAorCQkJCSAgICAgZW51bSB0dG1fcmVmX3R5cGUgcmVmX3R5cGUpOworCisvKioKKyAqIHR0bV9vYmplY3RfZmlsZV9pbml0IC0gaW5pdGlhbGl6ZSBhIHN0cnVjdCB0dG1fb2JqZWN0IGZpbGUKKyAqCisgKiBAdGRldjogQSBzdHJ1Y3QgdHRtX29iamVjdCBkZXZpY2UgdGhpcyBmaWxlIGlzIGluaXRpYWxpemVkIG9uLgorICogQGhhc2hfb3JkZXI6IE9yZGVyIG9mIHRoZSBoYXNoIHRhYmxlIHVzZWQgdG8gaG9sZCB0aGUgcmVmZXJlbmNlIG9iamVjdHMuCisgKgorICogVGhpcyBpcyB0eXBpY2FsbHkgY2FsbGVkIGJ5IHRoZSBmaWxlX29wczo6b3BlbiBmdW5jdGlvbi4KKyAqLworCitleHRlcm4gc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdHRtX29iamVjdF9maWxlX2luaXQoc3RydWN0IHR0bV9vYmplY3RfZGV2aWNlCisJCQkJCQkgICAgKnRkZXYsCisJCQkJCQkgICAgdW5zaWduZWQgaW50IGhhc2hfb3JkZXIpOworCisvKioKKyAqIHR0bV9vYmplY3RfZmlsZV9yZWxlYXNlIC0gcmVsZWFzZSBkYXRhIGhlbGQgYnkgYSB0dG1fb2JqZWN0X2ZpbGUKKyAqCisgKiBAcF90ZmlsZTogUG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSB0dG1fb2JqZWN0X2ZpbGUgb2JqZWN0IHRvIHJlbGVhc2UuCisgKiAqcF90ZmlsZSB3aWxsIGJlIHNldCB0byBOVUxMIGJ5IHRoaXMgZnVuY3Rpb24uCisgKgorICogUmVsZWFzZXMgYWxsIGRhdGEgYXNzb2NpYXRlZCBieSBhIHR0bV9vYmplY3RfZmlsZS4KKyAqIFR5cGljYWxseSBjYWxsZWQgZnJvbSBmaWxlX29wczo6cmVsZWFzZS4gVGhlIGNhbGxlciBtdXN0CisgKiBlbnN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gY29uY3VycmVudCB1c2VycyBvZiB0ZmlsZS4KKyAqLworCitleHRlcm4gdm9pZCB0dG1fb2JqZWN0X2ZpbGVfcmVsZWFzZShzdHJ1Y3QgdHRtX29iamVjdF9maWxlICoqcF90ZmlsZSk7CisKKy8qKgorICogdHRtX29iamVjdCBkZXZpY2UgaW5pdCAtIGluaXRpYWxpemUgYSBzdHJ1Y3QgdHRtX29iamVjdF9kZXZpY2UKKyAqCisgKiBAaGFzaF9vcmRlcjogT3JkZXIgb2YgaGFzaCB0YWJsZSB1c2VkIHRvIGhhc2ggdGhlIGJhc2Ugb2JqZWN0cy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHR5cGljYWxseSBjYWxsZWQgb24gZGV2aWNlIGluaXRpYWxpemF0aW9uIHRvIHByZXBhcmUKKyAqIGRhdGEgc3RydWN0dXJlcyBuZWVkZWQgZm9yIHR0bSBiYXNlIGFuZCByZWYgb2JqZWN0cy4KKyAqLworCitleHRlcm4gc3RydWN0IHR0bV9vYmplY3RfZGV2aWNlICp0dG1fb2JqZWN0X2RldmljZV9pbml0CisgICAgKHN0cnVjdCB0dG1fbWVtX2dsb2JhbCAqbWVtX2dsb2IsIHVuc2lnbmVkIGludCBoYXNoX29yZGVyKTsKKworLyoqCisgKiB0dG1fb2JqZWN0X2RldmljZV9yZWxlYXNlIC0gcmVsZWFzZSBkYXRhIGhlbGQgYnkgYSB0dG1fb2JqZWN0X2RldmljZQorICoKKyAqIEBwX3RkZXY6IFBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgdHRtX29iamVjdF9kZXZpY2Ugb2JqZWN0IHRvIHJlbGVhc2UuCisgKiAqcF90ZGV2IHdpbGwgYmUgc2V0IHRvIE5VTEwgYnkgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBSZWxlYXNlcyBhbGwgZGF0YSBhc3NvY2lhdGVkIGJ5IGEgdHRtX29iamVjdF9kZXZpY2UuCisgKiBUeXBpY2FsbHkgY2FsbGVkIGZyb20gZHJpdmVyOjp1bmxvYWQgYmVmb3JlIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUKKyAqIGRldmljZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlLgorICovCisKK2V4dGVybiB2b2lkIHR0bV9vYmplY3RfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IHR0bV9vYmplY3RfZGV2aWNlICoqcF90ZGV2KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS92aWFfZHJtLmggYi9pbmNsdWRlL2RybS92aWFfZHJtLmgKaW5kZXggMTcwNzg2ZS4uZmQxMWE1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vdmlhX2RybS5oCisrKyBiL2luY2x1ZGUvZHJtL3ZpYV9kcm0uaApAQCAtMjQsNyArMjQsNyBAQAogI2lmbmRlZiBfVklBX0RSTV9IXwogI2RlZmluZSBfVklBX0RSTV9IXwogCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlICJkcm0uaCIKIAogLyogV0FSTklORzogVGhlc2UgZGVmaW5lcyBtdXN0IGJlIHRoZSBzYW1lIGFzIHdoYXQgdGhlIFhzZXJ2ZXIgdXNlcy4KICAqIGlmIHlvdSBjaGFuZ2UgdGhlbSwgeW91IG11c3QgY2hhbmdlIHRoZSBkZWZpbmVzIGluIHRoZSBYc2VydmVyLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L0tidWlsZAppbmRleCA1YTUzODU3Li5mNzI5MTRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L0tidWlsZAorKysgYi9pbmNsdWRlL2xpbnV4L0tidWlsZApAQCAtMjE0LDcgKzIxNCw2IEBACiB1bmlmZGVmLXkgKz0gZnMuaAogdW5pZmRlZi15ICs9IGdhbWVwb3J0LmgKIHVuaWZkZWYteSArPSBnZW5lcmljX3NlcmlhbC5oCi11bmlmZGVmLXkgKz0gaGF5ZXNlc3AuaAogdW5pZmRlZi15ICs9IGhkbGNkcnYuaAogdW5pZmRlZi15ICs9IGhkbGMuaAogdW5pZmRlZi15ICs9IGhkcmVnLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oIGIvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKaW5kZXggNzlhMjM0MC4uNGRlMDJiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKQEAgLTIzMiw2ICsyMzIsNyBAQAogCS8qIG9wdGlvbmFsICovCiAJdW5zaWduZWQgaW50ICgqZ2V0YXZnKQkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCiAJCQkJIHVuc2lnbmVkIGludCBjcHUpOworCWludAkoKmJpb3NfbGltaXQpCShpbnQgY3B1LCB1bnNpZ25lZCBpbnQgKmxpbWl0KTsKIAogCWludAkoKmV4aXQpCQkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpOwogCWludAkoKnN1c3BlbmQpCShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgcG1fbWVzc2FnZV90IHBtc2cpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKaW5kZXggMmVhM2U0OS4uMmE3M2Q5YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCkBAIC01NTgsNyArNTU4LDcgQEAKICNpZmRlZiBDT05GSUdfREVWVE1QRlMKIGV4dGVybiBpbnQgZGV2dG1wZnNfY3JlYXRlX25vZGUoc3RydWN0IGRldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgZGV2dG1wZnNfZGVsZXRlX25vZGUoc3RydWN0IGRldmljZSAqZGV2KTsKLWV4dGVybiBpbnQgZGV2dG1wZnNfbW91bnQoY29uc3QgY2hhciAqbW91bnRwb2ludCk7CitleHRlcm4gaW50IGRldnRtcGZzX21vdW50KGNvbnN0IGNoYXIgKm1udGRpcik7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgZGV2dG1wZnNfY3JlYXRlX25vZGUoc3RydWN0IGRldmljZSAqZGV2KSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCBkZXZ0bXBmc19kZWxldGVfbm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYpIHsgcmV0dXJuIDA7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oIGIvaW5jbHVkZS9saW51eC9leHQyX2ZzLmgKaW5kZXggMTIxNzIwZC4uMmRmYTcwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQyX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQyX2ZzLmgKQEAgLTU2NSwxNCArNTY1LDE0IEBACiAgKiBvdGhlciBiaXRzIGFyZSByZXNlcnZlZCBmb3Igbm93LgogICovCiBlbnVtIHsKLQlFWFQyX0ZUX1VOS05PV04sCi0JRVhUMl9GVF9SRUdfRklMRSwKLQlFWFQyX0ZUX0RJUiwKLQlFWFQyX0ZUX0NIUkRFViwKLQlFWFQyX0ZUX0JMS0RFViwKLQlFWFQyX0ZUX0ZJRk8sCi0JRVhUMl9GVF9TT0NLLAotCUVYVDJfRlRfU1lNTElOSywKKwlFWFQyX0ZUX1VOS05PV04JCT0gMCwKKwlFWFQyX0ZUX1JFR19GSUxFCT0gMSwKKwlFWFQyX0ZUX0RJUgkJPSAyLAorCUVYVDJfRlRfQ0hSREVWCQk9IDMsCisJRVhUMl9GVF9CTEtERVYJCT0gNCwKKwlFWFQyX0ZUX0ZJRk8JCT0gNSwKKwlFWFQyX0ZUX1NPQ0sJCT0gNiwKKwlFWFQyX0ZUX1NZTUxJTksJCT0gNywKIAlFWFQyX0ZUX01BWAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHQzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaAppbmRleCA3NDk5YjM2Li42YjA0OTAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaApAQCAtOTE4LDYgKzkxOCw4IEBACiAJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwogZXh0ZXJuIHZvaWQgZXh0M193YXJuaW5nIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKIAlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CitleHRlcm4gdm9pZCBleHQzX21zZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CiBleHRlcm4gdm9pZCBleHQzX3VwZGF0ZV9keW5hbWljX3JldiAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiAKICNkZWZpbmUgZXh0M19zdGRfZXJyb3Ioc2IsIGVycm5vKQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Zpcm13YXJlLmggYi9pbmNsdWRlL2xpbnV4L2Zpcm13YXJlLmgKaW5kZXggZDMxNTQ0Ni4uMDQzODExZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9maXJtd2FyZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZmlybXdhcmUuaApAQCAtNCw2ICs0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAKICNkZWZpbmUgRldfQUNUSU9OX05PSE9UUExVRyAwCiAjZGVmaW5lIEZXX0FDVElPTl9IT1RQTFVHIDEKQEAgLTM4LDcgKzM5LDcgQEAKIAkJICAgICBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOwogaW50IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KAogCXN0cnVjdCBtb2R1bGUgKm1vZHVsZSwgaW50IHVldmVudCwKLQljb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsIHZvaWQgKmNvbnRleHQsCisJY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRldmljZSAqZGV2aWNlLCBnZnBfdCBnZnAsIHZvaWQgKmNvbnRleHQsCiAJdm9pZCAoKmNvbnQpKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHZvaWQgKmNvbnRleHQpKTsKIAogdm9pZCByZWxlYXNlX2Zpcm13YXJlKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpOwpAQCAtNTEsNyArNTIsNyBAQAogfQogc3RhdGljIGlubGluZSBpbnQgcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoCiAJc3RydWN0IG1vZHVsZSAqbW9kdWxlLCBpbnQgdWV2ZW50LAotCWNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSwgdm9pZCAqY29udGV4dCwKKwljb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsIGdmcF90IGdmcCwgdm9pZCAqY29udGV4dCwKIAl2b2lkICgqY29udCkoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY29udGV4dCkpCiB7CiAJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzLmggYi9pbmNsdWRlL2xpbnV4L2ZzLmgKaW5kZXggODkxZjdkNi4uYTA1N2Y0OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZnMuaApAQCAtMjA5MSw4ICsyMDkxLDYgQEAKIGV4dGVybiBpbnQgZmlsZW1hcF93cml0ZV9hbmRfd2FpdChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyk7CiBleHRlcm4gaW50IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCQkJICAgICAgICBsb2ZmX3QgbHN0YXJ0LCBsb2ZmX3QgbGVuZCk7Ci1leHRlcm4gaW50IHdhaXRfb25fcGFnZV93cml0ZWJhY2tfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCi0JCQkJcGdvZmZfdCBzdGFydCwgcGdvZmZfdCBlbmQpOwogZXh0ZXJuIGludCBfX2ZpbGVtYXBfZmRhdGF3cml0ZV9yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJCQlsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsIGludCBzeW5jX21vZGUpOwogZXh0ZXJuIGludCBmaWxlbWFwX2ZkYXRhd3JpdGVfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Z0cmFjZV9ldmVudC5oIGIvaW5jbHVkZS9saW51eC9mdHJhY2VfZXZlbnQuaAppbmRleCA0N2JiZGY5Li4zOGY4ZDY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Z0cmFjZV9ldmVudC5oCisrKyBiL2luY2x1ZGUvbGludXgvZnRyYWNlX2V2ZW50LmgKQEAgLTU3LDYgKzU3LDcgQEAKIAkvKiBUaGUgYmVsb3cgaXMgemVyb2VkIG91dCBpbiBwaXBlX3JlYWQgKi8KIAlzdHJ1Y3QgdHJhY2Vfc2VxCXNlcTsKIAlzdHJ1Y3QgdHJhY2VfZW50cnkJKmVudDsKKwlpbnQJCQlsZWZ0b3ZlcjsKIAlpbnQJCQljcHU7CiAJdTY0CQkJdHM7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaGF5ZXNlc3AuaCBiL2luY2x1ZGUvbGludXgvaGF5ZXNlc3AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJiMDhjZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L2hheWVzZXNwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotI2lmbmRlZiBIQVlFU0VTUF9ICi0jZGVmaW5lIEhBWUVTRVNQX0gKLQotc3RydWN0IGhheWVzX2VzcF9jb25maWcgewotCXNob3J0IGZsb3dfb247Ci0Jc2hvcnQgZmxvd19vZmY7Ci0Jc2hvcnQgcnhfdHJpZ2dlcjsKLQlzaG9ydCB0eF90cmlnZ2VyOwotCXNob3J0IHBpb190aHJlc2hvbGQ7Ci0JdW5zaWduZWQgY2hhciByeF90aW1lb3V0OwotCWNoYXIgZG1hX2NoYW5uZWw7Ci19OwotCi0jaWZkZWYgX19LRVJORUxfXwotCi0jZGVmaW5lIEVTUF9ETUFfQ0hBTk5FTCAgIDAKLSNkZWZpbmUgRVNQX1JYX1RSSUdHRVIgICAgNzY4Ci0jZGVmaW5lIEVTUF9UWF9UUklHR0VSICAgIDc2OAotI2RlZmluZSBFU1BfRkxPV19PRkYgICAgICAxMDE2Ci0jZGVmaW5lIEVTUF9GTE9XX09OICAgICAgIDk0NAotI2RlZmluZSBFU1BfUlhfVE1PVVQgICAgICAxMjgKLSNkZWZpbmUgRVNQX1BJT19USFJFU0hPTEQgMzIKLQotI2RlZmluZSBFU1BfSU5fTUFKT1IJNTcJLyogbWFqb3IgZGV2ICMgZm9yIGRpYWwgaW4gKi8KLSNkZWZpbmUgRVNQX09VVF9NQUpPUgk1OAkvKiBtYWpvciBkZXYgIyBmb3IgZGlhbCBvdXQgKi8KLSNkZWZpbmUgRVNQQ19TQ0FMRSAJMwotI2RlZmluZSBVQVJUX0VTSV9CQVNFCTB4MDAKLSNkZWZpbmUgVUFSVF9FU0lfU0lECTB4MDEKLSNkZWZpbmUgVUFSVF9FU0lfUlgJMHgwMgotI2RlZmluZSBVQVJUX0VTSV9UWAkweDAyCi0jZGVmaW5lIFVBUlRfRVNJX0NNRDEJMHgwNAotI2RlZmluZSBVQVJUX0VTSV9DTUQyCTB4MDUKLSNkZWZpbmUgVUFSVF9FU0lfU1RBVDEJMHgwNAotI2RlZmluZSBVQVJUX0VTSV9TVEFUMgkweDA1Ci0jZGVmaW5lIFVBUlRfRVNJX1JXUwkweDA3Ci0KLSNkZWZpbmUgVUFSVF9JRVJfRE1BX1RNT1VUCTB4ODAKLSNkZWZpbmUgVUFSVF9JRVJfRE1BX1RDCQkweDA4Ci0KLSNkZWZpbmUgRVNJX1NFVF9JUlEJCTB4MDQKLSNkZWZpbmUgRVNJX1NFVF9ETUFfVE1PVVQJMHgwNQotI2RlZmluZSBFU0lfU0VUX1NSVl9NQVNLCTB4MDYKLSNkZWZpbmUgRVNJX1NFVF9FUlJfTUFTSwkweDA3Ci0jZGVmaW5lIEVTSV9TRVRfRkxPV19DTlRMCTB4MDgKLSNkZWZpbmUgRVNJX1NFVF9GTE9XX0NIQVJTCTB4MDkKLSNkZWZpbmUgRVNJX1NFVF9GTE9XX0xWTAkweDBhCi0jZGVmaW5lIEVTSV9TRVRfVFJJR0dFUgkJMHgwYgotI2RlZmluZSBFU0lfU0VUX1JYX1RJTUVPVVQJMHgwYwotI2RlZmluZSBFU0lfU0VUX0ZMT1dfVE1PVVQJMHgwZAotI2RlZmluZSBFU0lfV1JJVEVfVUFSVAkJMHgwZQotI2RlZmluZSBFU0lfUkVBRF9VQVJUCQkweDBmCi0jZGVmaW5lIEVTSV9TRVRfTU9ERQkJMHgxMAotI2RlZmluZSBFU0lfR0VUX0VSUl9TVEFUCTB4MTIKLSNkZWZpbmUgRVNJX0dFVF9VQVJUX1NUQVQJMHgxMwotI2RlZmluZSBFU0lfR0VUX1JYX0FWQUlMCTB4MTQKLSNkZWZpbmUgRVNJX0dFVF9UWF9BVkFJTAkweDE1Ci0jZGVmaW5lIEVTSV9TVEFSVF9ETUFfUlgJMHgxNgotI2RlZmluZSBFU0lfU1RBUlRfRE1BX1RYCTB4MTcKLSNkZWZpbmUgRVNJX0lTU1VFX0JSRUFLCQkweDFhCi0jZGVmaW5lIEVTSV9GTFVTSF9SWAkJMHgxYgotI2RlZmluZSBFU0lfRkxVU0hfVFgJCTB4MWMKLSNkZWZpbmUgRVNJX1NFVF9CQVVECQkweDFkCi0jZGVmaW5lIEVTSV9TRVRfRU5IX0lSUQkJMHgxZgotI2RlZmluZSBFU0lfU0VUX1JFSU5UUgkJMHgyMAotI2RlZmluZSBFU0lfU0VUX1BSRVNDQUxBUgkweDIzCi0jZGVmaW5lIEVTSV9OT19DT01NQU5ECQkweGZmCi0KLSNkZWZpbmUgRVNQX1NUQVRfUlhfVElNRU9VVAkweDAxCi0jZGVmaW5lIEVTUF9TVEFUX0RNQV9SWAkJMHgwMgotI2RlZmluZSBFU1BfU1RBVF9ETUFfVFgJCTB4MDQKLSNkZWZpbmUgRVNQX1NUQVRfTkVWRVJfRE1BICAgICAgMHgwOAotI2RlZmluZSBFU1BfU1RBVF9VU0VfUElPICAgICAgICAweDEwCi0KLSNkZWZpbmUgRVNQX01BR0lDCQkweDUzZWUKLSNkZWZpbmUgRVNQX1hNSVRfU0laRQkJNDA5NgotCi1zdHJ1Y3QgZXNwX3N0cnVjdCB7Ci0JaW50CQkJbWFnaWM7Ci0Jc3RydWN0IHR0eV9wb3J0CQlwb3J0OwotCXNwaW5sb2NrX3QJCWxvY2s7Ci0JaW50CQkJaW9fcG9ydDsKLQlpbnQJCQlpcnE7Ci0JaW50CQkJcmVhZF9zdGF0dXNfbWFzazsKLQlpbnQJCQlpZ25vcmVfc3RhdHVzX21hc2s7Ci0JaW50CQkJdGltZW91dDsKLQlpbnQJCQlzdGF0X2ZsYWdzOwotCWludAkJCWN1c3RvbV9kaXZpc29yOwotCWludAkJCWNsb3NlX2RlbGF5OwotCXVuc2lnbmVkIHNob3J0CQljbG9zaW5nX3dhaXQ7Ci0JdW5zaWduZWQgc2hvcnQJCWNsb3Npbmdfd2FpdDI7Ci0JaW50CQkJSUVSOyAJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLwotCWludAkJCU1DUjsgCS8qIE1vZGVtIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQl1bnNpZ25lZCBsb25nCQlsYXN0X2FjdGl2ZTsKLQlpbnQJCQlsaW5lOwotCXVuc2lnbmVkIGNoYXIgCQkqeG1pdF9idWY7Ci0JaW50CQkJeG1pdF9oZWFkOwotCWludAkJCXhtaXRfdGFpbDsKLQlpbnQJCQl4bWl0X2NudDsKLQl3YWl0X3F1ZXVlX2hlYWRfdAlicmVha193YWl0OwotCXN0cnVjdCBhc3luY19pY291bnQJaWNvdW50OwkvKiBrZXJuZWwgY291bnRlcnMgZm9yIHRoZSA0IGlucHV0IGludGVycnVwdHMgKi8KLQlzdHJ1Y3QgaGF5ZXNfZXNwX2NvbmZpZyBjb25maWc7IC8qIHBvcnQgY29uZmlndXJhdGlvbiAqLwotCXN0cnVjdCBlc3Bfc3RydWN0CSpuZXh0X3BvcnQ7IC8qIEZvciB0aGUgbGlua2VkIGxpc3QgKi8KLX07Ci0KLXN0cnVjdCBlc3BfcGlvX2J1ZmZlciB7Ci0JdW5zaWduZWQgY2hhciBkYXRhWzEwMjRdOwotCXN0cnVjdCBlc3BfcGlvX2J1ZmZlciAqbmV4dDsKLX07Ci0KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KLQotI2VuZGlmIC8qIEVTUF9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKaW5kZXggOWJhY2U0Yi4uYWY2MzRlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKQEAgLTE2MiwxMCArMTYyLDExIEBACiAgKiBAZXhwaXJlc19uZXh0OglhYnNvbHV0ZSB0aW1lIG9mIHRoZSBuZXh0IGV2ZW50IHdoaWNoIHdhcyBzY2hlZHVsZWQKICAqCQkJdmlhIGNsb2NrX3NldF9uZXh0X2V2ZW50KCkKICAqIEBocmVzX2FjdGl2ZToJU3RhdGUgb2YgaGlnaCByZXNvbHV0aW9uIG1vZGUKLSAqIEBjaGVja19jbG9ja3M6CUluZGljdGF0b3IsIHdoZW4gc2V0IGV2YWx1YXRlIHRpbWUgc291cmNlIGFuZCBjbG9jawotICoJCQlldmVudCBkZXZpY2VzIHdoZXRoZXIgaGlnaCByZXNvbHV0aW9uIG1vZGUgY2FuIGJlCi0gKgkJCWFjdGl2YXRlZC4KLSAqIEBucl9ldmVudHM6CQlUb3RhbCBudW1iZXIgb2YgdGltZXIgaW50ZXJydXB0IGV2ZW50cworICogQGhhbmdfZGV0ZWN0ZWQ6CVRoZSBsYXN0IGhydGltZXIgaW50ZXJydXB0IGRldGVjdGVkIGEgaGFuZworICogQG5yX2V2ZW50czoJCVRvdGFsIG51bWJlciBvZiBocnRpbWVyIGludGVycnVwdCBldmVudHMKKyAqIEBucl9yZXRyaWVzOgkJVG90YWwgbnVtYmVyIG9mIGhydGltZXIgaW50ZXJydXB0IHJldHJpZXMKKyAqIEBucl9oYW5nczoJCVRvdGFsIG51bWJlciBvZiBocnRpbWVyIGludGVycnVwdCBoYW5ncworICogQG1heF9oYW5nX3RpbWU6CU1heGltdW0gdGltZSBzcGVudCBpbiBocnRpbWVyX2ludGVycnVwdAogICovCiBzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSB7CiAJc3BpbmxvY2tfdAkJCWxvY2s7CkBAIC0xNzMsNyArMTc0LDExIEBACiAjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUwogCWt0aW1lX3QJCQkJZXhwaXJlc19uZXh0OwogCWludAkJCQlocmVzX2FjdGl2ZTsKKwlpbnQJCQkJaGFuZ19kZXRlY3RlZDsKIAl1bnNpZ25lZCBsb25nCQkJbnJfZXZlbnRzOworCXVuc2lnbmVkIGxvbmcJCQlucl9yZXRyaWVzOworCXVuc2lnbmVkIGxvbmcJCQlucl9oYW5nczsKKwlrdGltZV90CQkJCW1heF9oYW5nX3RpbWU7CiAjZW5kaWYKIH07CiAKQEAgLTQzNSw0NyArNDQwLDQgQEAKIC8qIFNob3cgcGVuZGluZyB0aW1lcnM6ICovCiBleHRlcm4gdm9pZCBzeXNycV90aW1lcl9saXN0X3Nob3codm9pZCk7CiAKLS8qCi0gKiBUaW1lci1zdGF0aXN0aWNzIGluZm86Ci0gKi8KLSNpZmRlZiBDT05GSUdfVElNRVJfU1RBVFMKLQotZXh0ZXJuIHZvaWQgdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzKHZvaWQgKnRpbWVyLCBwaWRfdCBwaWQsIHZvaWQgKnN0YXJ0ZiwKLQkJCQkgICAgIHZvaWQgKnRpbWVyZiwgY2hhciAqY29tbSwKLQkJCQkgICAgIHVuc2lnbmVkIGludCB0aW1lcl9mbGFnKTsKLQotc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2FjY291bnRfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCi17Ci0JaWYgKGxpa2VseSghdGltZXJfc3RhdHNfYWN0aXZlKSkKLQkJcmV0dXJuOwotCXRpbWVyX3N0YXRzX3VwZGF0ZV9zdGF0cyh0aW1lciwgdGltZXItPnN0YXJ0X3BpZCwgdGltZXItPnN0YXJ0X3NpdGUsCi0JCQkJIHRpbWVyLT5mdW5jdGlvbiwgdGltZXItPnN0YXJ0X2NvbW0sIDApOwotfQotCi1leHRlcm4gdm9pZCBfX3RpbWVyX3N0YXRzX2hydGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IGhydGltZXIgKnRpbWVyLAotCQkJCQkJIHZvaWQgKmFkZHIpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfaHJ0aW1lcl9zZXRfc3RhcnRfaW5mbyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCi17Ci0JX190aW1lcl9zdGF0c19ocnRpbWVyX3NldF9zdGFydF9pbmZvKHRpbWVyLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfaHJ0aW1lcl9jbGVhcl9zdGFydF9pbmZvKHN0cnVjdCBocnRpbWVyICp0aW1lcikKLXsKLQl0aW1lci0+c3RhcnRfc2l0ZSA9IE5VTEw7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2FjY291bnRfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c19ocnRpbWVyX3NldF9zdGFydF9pbmZvKHN0cnVjdCBocnRpbWVyICp0aW1lcikKLXsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2hydGltZXJfY2xlYXJfc3RhcnRfaW5mbyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCi17Ci19Ci0jZW5kaWYKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2h3X2JyZWFrcG9pbnQuaCBiL2luY2x1ZGUvbGludXgvaHdfYnJlYWtwb2ludC5oCmluZGV4IGEwM2RhZWQuLjY5ZjA3YTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHdfYnJlYWtwb2ludC5oCisrKyBiL2luY2x1ZGUvbGludXgvaHdfYnJlYWtwb2ludC5oCkBAIC0yMCwxOSArMjAsMTggQEAKIAogI2lmZGVmIENPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlQKIAotLyogQXMgaXQncyBmb3IgaW4ta2VybmVsIG9yIHB0cmFjZSB1c2UsIHdlIHdhbnQgaXQgdG8gYmUgcGlubmVkICovCi0jZGVmaW5lIERFRklORV9CUkVBS1BPSU5UX0FUVFIobmFtZSkJXAotc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBuYW1lID0gewkJXAotCS50eXBlID0gUEVSRl9UWVBFX0JSRUFLUE9JTlQsCVwKLQkuc2l6ZSA9IHNpemVvZihuYW1lKSwJCVwKLQkucGlubmVkID0gMSwJCQlcCi19OwotCiBzdGF0aWMgaW5saW5lIHZvaWQgaHdfYnJlYWtwb2ludF9pbml0KHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIpCiB7CisJbWVtc2V0KGF0dHIsIDAsIHNpemVvZigqYXR0cikpOworCiAJYXR0ci0+dHlwZSA9IFBFUkZfVFlQRV9CUkVBS1BPSU5UOwogCWF0dHItPnNpemUgPSBzaXplb2YoKmF0dHIpOworCS8qCisJICogQXMgaXQncyBmb3IgaW4ta2VybmVsIG9yIHB0cmFjZSB1c2UsIHdlIHdhbnQgaXQgdG8gYmUgcGlubmVkCisJICogYW5kIHRvIGNhbGwgaXRzIGNhbGxiYWNrIGV2ZXJ5IGhpdHMuCisJICovCiAJYXR0ci0+cGlubmVkID0gMTsKKwlhdHRyLT5zYW1wbGVfcGVyaW9kID0gMTsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGh3X2JyZWFrcG9pbnRfYWRkcihzdHJ1Y3QgcGVyZl9ldmVudCAqYnApCkBAIC01MiwyNyArNTEsMjQgQEAKIAogZXh0ZXJuIHN0cnVjdCBwZXJmX2V2ZW50ICoKIHJlZ2lzdGVyX3VzZXJfaHdfYnJlYWtwb2ludChzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLAotCQkJICAgIHBlcmZfY2FsbGJhY2tfdCB0cmlnZ2VyZWQsCisJCQkgICAgcGVyZl9vdmVyZmxvd19oYW5kbGVyX3QgdHJpZ2dlcmVkLAogCQkJICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKIAogLyogRklYTUU6IG9ubHkgY2hhbmdlIGZyb20gdGhlIGF0dHIsIGFuZCBkb24ndCB1bnJlZ2lzdGVyICovCi1leHRlcm4gc3RydWN0IHBlcmZfZXZlbnQgKgotbW9kaWZ5X3VzZXJfaHdfYnJlYWtwb2ludChzdHJ1Y3QgcGVyZl9ldmVudCAqYnAsCi0JCQkgIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsCi0JCQkgIHBlcmZfY2FsbGJhY2tfdCB0cmlnZ2VyZWQsCi0JCQkgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKK2V4dGVybiBpbnQKK21vZGlmeV91c2VyX2h3X2JyZWFrcG9pbnQoc3RydWN0IHBlcmZfZXZlbnQgKmJwLCBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyKTsKIAogLyoKICAqIEtlcm5lbCBicmVha3BvaW50cyBhcmUgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgcGFydGljdWxhciB0aHJlYWQuCiAgKi8KIGV4dGVybiBzdHJ1Y3QgcGVyZl9ldmVudCAqCiByZWdpc3Rlcl93aWRlX2h3X2JyZWFrcG9pbnRfY3B1KHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsCi0JCQkJcGVyZl9jYWxsYmFja190IHRyaWdnZXJlZCwKKwkJCQlwZXJmX292ZXJmbG93X2hhbmRsZXJfdAl0cmlnZ2VyZWQsCiAJCQkJaW50IGNwdSk7CiAKIGV4dGVybiBzdHJ1Y3QgcGVyZl9ldmVudCAqKgogcmVnaXN0ZXJfd2lkZV9od19icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsCi0JCQkgICAgcGVyZl9jYWxsYmFja190IHRyaWdnZXJlZCk7CisJCQkgICAgcGVyZl9vdmVyZmxvd19oYW5kbGVyX3QgdHJpZ2dlcmVkKTsKIAogZXh0ZXJuIGludCByZWdpc3Rlcl9wZXJmX2h3X2JyZWFrcG9pbnQoc3RydWN0IHBlcmZfZXZlbnQgKmJwKTsKIGV4dGVybiBpbnQgX19yZWdpc3Rlcl9wZXJmX2h3X2JyZWFrcG9pbnQoc3RydWN0IHBlcmZfZXZlbnQgKmJwKTsKQEAgLTkzLDIwICs4OSwxOCBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwZXJmX2V2ZW50ICoKIHJlZ2lzdGVyX3VzZXJfaHdfYnJlYWtwb2ludChzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLAotCQkJICAgIHBlcmZfY2FsbGJhY2tfdCB0cmlnZ2VyZWQsCisJCQkgICAgcGVyZl9vdmVyZmxvd19oYW5kbGVyX3QgdHJpZ2dlcmVkLAogCQkJICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQl7IHJldHVybiBOVUxMOyB9Ci1zdGF0aWMgaW5saW5lIHN0cnVjdCBwZXJmX2V2ZW50ICoKK3N0YXRpYyBpbmxpbmUgaW50CiBtb2RpZnlfdXNlcl9od19icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2ZW50ICpicCwKLQkJCSAgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwKLQkJCSAgcGVyZl9jYWxsYmFja190IHRyaWdnZXJlZCwKLQkJCSAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCXsgcmV0dXJuIE5VTEw7IH0KKwkJCSAgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0cikJeyByZXR1cm4gTlVMTDsgfQogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGVyZl9ldmVudCAqCiByZWdpc3Rlcl93aWRlX2h3X2JyZWFrcG9pbnRfY3B1KHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsCi0JCQkJcGVyZl9jYWxsYmFja190IHRyaWdnZXJlZCwKKwkJCQlwZXJmX292ZXJmbG93X2hhbmRsZXJfdAkgdHJpZ2dlcmVkLAogCQkJCWludCBjcHUpCQl7IHJldHVybiBOVUxMOyB9CiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwZXJmX2V2ZW50ICoqCiByZWdpc3Rlcl93aWRlX2h3X2JyZWFrcG9pbnQoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwKLQkJCSAgICBwZXJmX2NhbGxiYWNrX3QgdHJpZ2dlcmVkKQl7IHJldHVybiBOVUxMOyB9CisJCQkgICAgcGVyZl9vdmVyZmxvd19oYW5kbGVyX3QgdHJpZ2dlcmVkKQl7IHJldHVybiBOVUxMOyB9CiBzdGF0aWMgaW5saW5lIGludAogcmVnaXN0ZXJfcGVyZl9od19icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2ZW50ICpicCkJeyByZXR1cm4gLUVOT1NZUzsgfQogc3RhdGljIGlubGluZSBpbnQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXNpY29tLmggYi9pbmNsdWRlL2xpbnV4L2lzaWNvbS5oCmluZGV4IGJiZDQyMTkuLmI5MmUwNTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXNpY29tLmgKKysrIGIvaW5jbHVkZS9saW51eC9pc2ljb20uaApAQCAtNjcsNiArNjcsNyBAQAogCiAjZGVmaW5lCQlGSVJNV0FSRV9MT0FERUQJCTB4MDAwMQogI2RlZmluZQkJQk9BUkRfQUNUSVZFCQkweDAwMDIKKyNkZWZpbmUJCUJPQVJEX0lOSVQJCTB4MDAwNAogCiAgCS8qIGlzaV9wb3J0IHN0YXR1cyBiaXRtYXAgICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmFtZWkuaCBiL2luY2x1ZGUvbGludXgvbmFtZWkuaAppbmRleCBlYzBmNjA3Li4wMjg5NDY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25hbWVpLmgKKysrIGIvaW5jbHVkZS9saW51eC9uYW1laS5oCkBAIC03Niw3ICs3Niw2IEBACiBleHRlcm4gdm9pZCByZWxlYXNlX29wZW5faW50ZW50KHN0cnVjdCBuYW1laWRhdGEgKik7CiAKIGV4dGVybiBzdHJ1Y3QgZGVudHJ5ICpsb29rdXBfb25lX2xlbihjb25zdCBjaGFyICosIHN0cnVjdCBkZW50cnkgKiwgaW50KTsKLWV4dGVybiBzdHJ1Y3QgZGVudHJ5ICpsb29rdXBfb25lX25vcGVybShjb25zdCBjaGFyICosIHN0cnVjdCBkZW50cnkgKik7CiAKIGV4dGVybiBpbnQgZm9sbG93X2Rvd24oc3RydWN0IHBhdGggKik7CiBleHRlcm4gaW50IGZvbGxvd191cChzdHJ1Y3QgcGF0aCAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmlsZnMyX2ZzLmggYi9pbmNsdWRlL2xpbnV4L25pbGZzMl9mcy5oCmluZGV4IGNlNTIwNDAuLjNmZTAyY2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmlsZnMyX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uaWxmczJfZnMuaApAQCAtMTUxLDYgKzE1MSw4IEBACiAjZGVmaW5lIE5JTEZTX01PVU5UX0JBUlJJRVIJCTB4MTAwMCAgLyogVXNlIGJsb2NrIGJhcnJpZXJzICovCiAjZGVmaW5lIE5JTEZTX01PVU5UX1NUUklDVF9PUkRFUgkweDIwMDAgIC8qIEFwcGx5IHN0cmljdCBpbi1vcmRlcgogCQkJCQkJICAgc2VtYW50aWNzIGFsc28gZm9yIGRhdGEgKi8KKyNkZWZpbmUgTklMRlNfTU9VTlRfTk9SRUNPVkVSWQkJMHg0MDAwICAvKiBEaXNhYmxlIHdyaXRlIGFjY2VzcyBkdXJpbmcKKwkJCQkJCSAgIG1vdW50LXRpbWUgcmVjb3ZlcnkgKi8KIAogCiAvKioKQEAgLTQwMyw2ICs0MDUsMjggQEAKICNkZWZpbmUgTklMRlNfU1NfR0MgICAgIDB4MDAxMCAgLyogc2VnbWVudCB3cml0dGVuIGZvciBjbGVhbmVyIG9wZXJhdGlvbiAqLwogCiAvKioKKyAqIHN0cnVjdCBuaWxmc19idHJlZV9ub2RlIC0gQi10cmVlIG5vZGUKKyAqIEBibl9mbGFnczogZmxhZ3MKKyAqIEBibl9sZXZlbDogbGV2ZWwKKyAqIEBibl9uY2hpbGRyZW46IG51bWJlciBvZiBjaGlsZHJlbgorICogQGJuX3BhZDogcGFkZGluZworICovCitzdHJ1Y3QgbmlsZnNfYnRyZWVfbm9kZSB7CisJX191OCBibl9mbGFnczsKKwlfX3U4IGJuX2xldmVsOworCV9fbGUxNiBibl9uY2hpbGRyZW47CisJX19sZTMyIGJuX3BhZDsKK307CisKKy8qIGZsYWdzICovCisjZGVmaW5lIE5JTEZTX0JUUkVFX05PREVfUk9PVCAgIDB4MDEKKworLyogbGV2ZWwgKi8KKyNkZWZpbmUgTklMRlNfQlRSRUVfTEVWRUxfREFUQSAgICAgICAgICAwCisjZGVmaW5lIE5JTEZTX0JUUkVFX0xFVkVMX05PREVfTUlOICAgICAgKE5JTEZTX0JUUkVFX0xFVkVMX0RBVEEgKyAxKQorI2RlZmluZSBOSUxGU19CVFJFRV9MRVZFTF9NQVggICAgICAgICAgIDE0CisKKy8qKgogICogc3RydWN0IG5pbGZzX3BhbGxvY19ncm91cF9kZXNjIC0gYmxvY2sgZ3JvdXAgZGVzY3JpcHRvcgogICogQHBnX25mcmVlczogbnVtYmVyIG9mIGZyZWUgZW50cmllcyBpbiBibG9jayBncm91cAogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29tYXBmYi5oIGIvaW5jbHVkZS9saW51eC9vbWFwZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDZjNDBhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9vbWFwZmIuaApAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqIEZpbGU6IGluY2x1ZGUvbGludXgvb21hcGZiLmgKKyAqCisgKiBGcmFtZWJ1ZmZlciBkcml2ZXIgZm9yIFRJIE9NQVAgYm9hcmRzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfT01BUEZCX0hfXworI2RlZmluZSBfX0xJTlVYX09NQVBGQl9IX18KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBJT0NUTCBjb21tYW5kcy4gKi8KKworI2RlZmluZSBPTUFQX0lPVyhudW0sIGR0eXBlKQlfSU9XKCdPJywgbnVtLCBkdHlwZSkKKyNkZWZpbmUgT01BUF9JT1IobnVtLCBkdHlwZSkJX0lPUignTycsIG51bSwgZHR5cGUpCisjZGVmaW5lIE9NQVBfSU9XUihudW0sIGR0eXBlKQlfSU9XUignTycsIG51bSwgZHR5cGUpCisjZGVmaW5lIE9NQVBfSU8obnVtKQkJX0lPKCdPJywgbnVtKQorCisjZGVmaW5lIE9NQVBGQl9NSVJST1IJCU9NQVBfSU9XKDMxLCBpbnQpCisjZGVmaW5lIE9NQVBGQl9TWU5DX0dGWAkJT01BUF9JTygzNykKKyNkZWZpbmUgT01BUEZCX1ZTWU5DCQlPTUFQX0lPKDM4KQorI2RlZmluZSBPTUFQRkJfU0VUX1VQREFURV9NT0RFCU9NQVBfSU9XKDQwLCBpbnQpCisjZGVmaW5lIE9NQVBGQl9HRVRfQ0FQUwkJT01BUF9JT1IoNDIsIHN0cnVjdCBvbWFwZmJfY2FwcykKKyNkZWZpbmUgT01BUEZCX0dFVF9VUERBVEVfTU9ERQlPTUFQX0lPVyg0MywgaW50KQorI2RlZmluZSBPTUFQRkJfTENEX1RFU1QJCU9NQVBfSU9XKDQ1LCBpbnQpCisjZGVmaW5lIE9NQVBGQl9DVFJMX1RFU1QJT01BUF9JT1coNDYsIGludCkKKyNkZWZpbmUgT01BUEZCX1VQREFURV9XSU5ET1dfT0xEIE9NQVBfSU9XKDQ3LCBzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3dfb2xkKQorI2RlZmluZSBPTUFQRkJfU0VUX0NPTE9SX0tFWQlPTUFQX0lPVyg1MCwgc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkpCisjZGVmaW5lIE9NQVBGQl9HRVRfQ09MT1JfS0VZCU9NQVBfSU9XKDUxLCBzdHJ1Y3Qgb21hcGZiX2NvbG9yX2tleSkKKyNkZWZpbmUgT01BUEZCX1NFVFVQX1BMQU5FCU9NQVBfSU9XKDUyLCBzdHJ1Y3Qgb21hcGZiX3BsYW5lX2luZm8pCisjZGVmaW5lIE9NQVBGQl9RVUVSWV9QTEFORQlPTUFQX0lPVyg1Mywgc3RydWN0IG9tYXBmYl9wbGFuZV9pbmZvKQorI2RlZmluZSBPTUFQRkJfVVBEQVRFX1dJTkRPVwlPTUFQX0lPVyg1NCwgc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93KQorI2RlZmluZSBPTUFQRkJfU0VUVVBfTUVNCU9NQVBfSU9XKDU1LCBzdHJ1Y3Qgb21hcGZiX21lbV9pbmZvKQorI2RlZmluZSBPTUFQRkJfUVVFUllfTUVNCU9NQVBfSU9XKDU2LCBzdHJ1Y3Qgb21hcGZiX21lbV9pbmZvKQorI2RlZmluZSBPTUFQRkJfV0FJVEZPUlZTWU5DCU9NQVBfSU8oNTcpCisjZGVmaW5lIE9NQVBGQl9NRU1PUllfUkVBRAlPTUFQX0lPUig1OCwgc3RydWN0IG9tYXBmYl9tZW1vcnlfcmVhZCkKKyNkZWZpbmUgT01BUEZCX0dFVF9PVkVSTEFZX0NPTE9STU9ERSBPTUFQX0lPUig1OSwgc3RydWN0IG9tYXBmYl9vdmxfY29sb3Jtb2RlKQorI2RlZmluZSBPTUFQRkJfV0FJVEZPUkdPCU9NQVBfSU8oNjApCisjZGVmaW5lIE9NQVBGQl9HRVRfVlJBTV9JTkZPCU9NQVBfSU9SKDYxLCBzdHJ1Y3Qgb21hcGZiX3ZyYW1faW5mbykKKyNkZWZpbmUgT01BUEZCX1NFVF9URUFSU1lOQwlPTUFQX0lPVyg2Miwgc3RydWN0IG9tYXBmYl90ZWFyc3luY19pbmZvKQorCisjZGVmaW5lIE9NQVBGQl9DQVBTX0dFTkVSSUNfTUFTSwkweDAwMDAwZmZmCisjZGVmaW5lIE9NQVBGQl9DQVBTX0xDRENfTUFTSwkJMHgwMGZmZjAwMAorI2RlZmluZSBPTUFQRkJfQ0FQU19QQU5FTF9NQVNLCQkweGZmMDAwMDAwCisKKyNkZWZpbmUgT01BUEZCX0NBUFNfTUFOVUFMX1VQREFURQkweDAwMDAxMDAwCisjZGVmaW5lIE9NQVBGQl9DQVBTX1RFQVJTWU5DCQkweDAwMDAyMDAwCisjZGVmaW5lIE9NQVBGQl9DQVBTX1BMQU5FX1JFTE9DQVRFX01FTQkweDAwMDA0MDAwCisjZGVmaW5lIE9NQVBGQl9DQVBTX1BMQU5FX1NDQUxFCQkweDAwMDA4MDAwCisjZGVmaW5lIE9NQVBGQl9DQVBTX1dJTkRPV19QSVhFTF9ET1VCTEUJMHgwMDAxMDAwMAorI2RlZmluZSBPTUFQRkJfQ0FQU19XSU5ET1dfU0NBTEUJMHgwMDAyMDAwMAorI2RlZmluZSBPTUFQRkJfQ0FQU19XSU5ET1dfT1ZFUkxBWQkweDAwMDQwMDAwCisjZGVmaW5lIE9NQVBGQl9DQVBTX1dJTkRPV19ST1RBVEUJMHgwMDA4MDAwMAorI2RlZmluZSBPTUFQRkJfQ0FQU19TRVRfQkFDS0xJR0hUCTB4MDEwMDAwMDAKKworLyogVmFsdWVzIGZyb20gRFNQIG11c3QgbWFwIHRvIGxvd2VyIDE2LWJpdHMgKi8KKyNkZWZpbmUgT01BUEZCX0ZPUk1BVF9NQVNLCQkweDAwZmYKKyNkZWZpbmUgT01BUEZCX0ZPUk1BVF9GTEFHX0RPVUJMRQkweDAxMDAKKyNkZWZpbmUgT01BUEZCX0ZPUk1BVF9GTEFHX1RFQVJTWU5DCTB4MDIwMAorI2RlZmluZSBPTUFQRkJfRk9STUFUX0ZMQUdfRk9SQ0VfVlNZTkMJMHgwNDAwCisjZGVmaW5lIE9NQVBGQl9GT1JNQVRfRkxBR19FTkFCTEVfT1ZFUkxBWQkweDA4MDAKKyNkZWZpbmUgT01BUEZCX0ZPUk1BVF9GTEFHX0RJU0FCTEVfT1ZFUkxBWQkweDEwMDAKKworI2RlZmluZSBPTUFQRkJfTUVNVFlQRV9TRFJBTQkJMAorI2RlZmluZSBPTUFQRkJfTUVNVFlQRV9TUkFNCQkxCisjZGVmaW5lIE9NQVBGQl9NRU1UWVBFX01BWAkJMQorCitlbnVtIG9tYXBmYl9jb2xvcl9mb3JtYXQgeworCU9NQVBGQl9DT0xPUl9SR0I1NjUgPSAwLAorCU9NQVBGQl9DT0xPUl9ZVVY0MjIsCisJT01BUEZCX0NPTE9SX1lVVjQyMCwKKwlPTUFQRkJfQ09MT1JfQ0xVVF84QlBQLAorCU9NQVBGQl9DT0xPUl9DTFVUXzRCUFAsCisJT01BUEZCX0NPTE9SX0NMVVRfMkJQUCwKKwlPTUFQRkJfQ09MT1JfQ0xVVF8xQlBQLAorCU9NQVBGQl9DT0xPUl9SR0I0NDQsCisJT01BUEZCX0NPTE9SX1lVWTQyMiwKKworCU9NQVBGQl9DT0xPUl9BUkdCMTYsCisJT01BUEZCX0NPTE9SX1JHQjI0VSwJLyogUkdCMjQsIDMyLWJpdCBjb250YWluZXIgKi8KKwlPTUFQRkJfQ09MT1JfUkdCMjRQLAkvKiBSR0IyNCwgMjQtYml0IGNvbnRhaW5lciAqLworCU9NQVBGQl9DT0xPUl9BUkdCMzIsCisJT01BUEZCX0NPTE9SX1JHQkEzMiwKKwlPTUFQRkJfQ09MT1JfUkdCWDMyLAorfTsKKworc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93IHsKKwlfX3UzMiB4LCB5OworCV9fdTMyIHdpZHRoLCBoZWlnaHQ7CisJX191MzIgZm9ybWF0OworCV9fdTMyIG91dF94LCBvdXRfeTsKKwlfX3UzMiBvdXRfd2lkdGgsIG91dF9oZWlnaHQ7CisJX191MzIgcmVzZXJ2ZWRbOF07Cit9OworCitzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3dfb2xkIHsKKwlfX3UzMiB4LCB5OworCV9fdTMyIHdpZHRoLCBoZWlnaHQ7CisJX191MzIgZm9ybWF0OworfTsKKworZW51bSBvbWFwZmJfcGxhbmUgeworCU9NQVBGQl9QTEFORV9HRlggPSAwLAorCU9NQVBGQl9QTEFORV9WSUQxLAorCU9NQVBGQl9QTEFORV9WSUQyLAorfTsKKworZW51bSBvbWFwZmJfY2hhbm5lbF9vdXQgeworCU9NQVBGQl9DSEFOTkVMX09VVF9MQ0QgPSAwLAorCU9NQVBGQl9DSEFOTkVMX09VVF9ESUdJVCwKK307CisKK3N0cnVjdCBvbWFwZmJfcGxhbmVfaW5mbyB7CisJX191MzIgcG9zX3g7CisJX191MzIgcG9zX3k7CisJX191OCAgZW5hYmxlZDsKKwlfX3U4ICBjaGFubmVsX291dDsKKwlfX3U4ICBtaXJyb3I7CisJX191OCAgcmVzZXJ2ZWQxOworCV9fdTMyIG91dF93aWR0aDsKKwlfX3UzMiBvdXRfaGVpZ2h0OworCV9fdTMyIHJlc2VydmVkMlsxMl07Cit9OworCitzdHJ1Y3Qgb21hcGZiX21lbV9pbmZvIHsKKwlfX3UzMiBzaXplOworCV9fdTggIHR5cGU7CisJX191OCAgcmVzZXJ2ZWRbM107Cit9OworCitzdHJ1Y3Qgb21hcGZiX2NhcHMgeworCV9fdTMyIGN0cmw7CisJX191MzIgcGxhbmVfY29sb3I7CisJX191MzIgd25kX2NvbG9yOworfTsKKworZW51bSBvbWFwZmJfY29sb3Jfa2V5X3R5cGUgeworCU9NQVBGQl9DT0xPUl9LRVlfRElTQUJMRUQgPSAwLAorCU9NQVBGQl9DT0xPUl9LRVlfR0ZYX0RTVCwKKwlPTUFQRkJfQ09MT1JfS0VZX1ZJRF9TUkMsCit9OworCitzdHJ1Y3Qgb21hcGZiX2NvbG9yX2tleSB7CisJX191OCAgY2hhbm5lbF9vdXQ7CisJX191MzIgYmFja2dyb3VuZDsKKwlfX3UzMiB0cmFuc19rZXk7CisJX191OCAga2V5X3R5cGU7Cit9OworCitlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSB7CisJT01BUEZCX1VQREFURV9ESVNBQkxFRCA9IDAsCisJT01BUEZCX0FVVE9fVVBEQVRFLAorCU9NQVBGQl9NQU5VQUxfVVBEQVRFCit9OworCitzdHJ1Y3Qgb21hcGZiX21lbW9yeV9yZWFkIHsKKwlfX3UxNiB4OworCV9fdTE2IHk7CisJX191MTYgdzsKKwlfX3UxNiBoOworCXNpemVfdCBidWZmZXJfc2l6ZTsKKwl2b2lkIF9fdXNlciAqYnVmZmVyOworfTsKKworc3RydWN0IG9tYXBmYl9vdmxfY29sb3Jtb2RlIHsKKwlfX3U4IG92ZXJsYXlfaWR4OworCV9fdTggbW9kZV9pZHg7CisJX191MzIgYml0c19wZXJfcGl4ZWw7CisJX191MzIgbm9uc3RkOworCXN0cnVjdCBmYl9iaXRmaWVsZCByZWQ7CisJc3RydWN0IGZiX2JpdGZpZWxkIGdyZWVuOworCXN0cnVjdCBmYl9iaXRmaWVsZCBibHVlOworCXN0cnVjdCBmYl9iaXRmaWVsZCB0cmFuc3A7Cit9OworCitzdHJ1Y3Qgb21hcGZiX3ZyYW1faW5mbyB7CisJX191MzIgdG90YWw7CisJX191MzIgZnJlZTsKKwlfX3UzMiBsYXJnZXN0X2ZyZWVfYmxvY2s7CisJX191MzIgcmVzZXJ2ZWRbNV07Cit9OworCitzdHJ1Y3Qgb21hcGZiX3RlYXJzeW5jX2luZm8geworCV9fdTggZW5hYmxlZDsKKwlfX3U4IHJlc2VydmVkMVszXTsKKwlfX3UxNiBsaW5lOworCV9fdTE2IHJlc2VydmVkMjsKK307CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+CisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMQorI2RlZmluZSBPTUFQRkJfUExBTkVfTlVNCQkxCisjZWxzZQorI2RlZmluZSBPTUFQRkJfUExBTkVfTlVNCQkzCisjZW5kaWYKKworc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uIHsKKwl1MzIJCXBhZGRyOworCXZvaWQgX19pb21lbQkqdmFkZHI7CisJdW5zaWduZWQgbG9uZwlzaXplOworCXU4CQl0eXBlOwkJLyogT01BUEZCX1BMQU5FX01FTV8qICovCisJZW51bSBvbWFwZmJfY29sb3JfZm9ybWF0IGZvcm1hdDsvKiBPTUFQRkJfQ09MT1JfKiAqLworCXVuc2lnbmVkCWZvcm1hdF91c2VkOjE7CS8qIE11c3QgYmUgc2V0IHdoZW4gZm9ybWF0IGlzIHNldC4KKwkJCQkJICogTmVlZGVkIGIvYyBvZiB0aGUgYmFkbHkgY2hvc2VuIDAKKwkJCQkJICogYmFzZSBmb3IgT01BUEZCX0NPTE9SXyogdmFsdWVzCisJCQkJCSAqLworCXVuc2lnbmVkCWFsbG9jOjE7CS8qIGFsbG9jYXRlZCBieSB0aGUgZHJpdmVyICovCisJdW5zaWduZWQJbWFwOjE7CQkvKiBrZXJuZWwgbWFwcGVkIGJ5IHRoZSBkcml2ZXIgKi8KK307CisKK3N0cnVjdCBvbWFwZmJfbWVtX2Rlc2MgeworCWludAkJCQlyZWdpb25fY250OworCXN0cnVjdCBvbWFwZmJfbWVtX3JlZ2lvbglyZWdpb25bT01BUEZCX1BMQU5FX05VTV07Cit9OworCitzdHJ1Y3Qgb21hcGZiX3BsYXRmb3JtX2RhdGEgeworCXN0cnVjdCBvbWFwX2xjZF9jb25maWcJCWxjZDsKKwlzdHJ1Y3Qgb21hcGZiX21lbV9kZXNjCQltZW1fZGVzYzsKKwl2b2lkCQkJCSpjdHJsX3BsYXRmb3JtX2RhdGE7Cit9OworCisvKiBpbiBhcmNoL2FybS9wbGF0LW9tYXAvZmIuYyAqLworZXh0ZXJuIHZvaWQgb21hcGZiX3NldF9wbGF0Zm9ybV9kYXRhKHN0cnVjdCBvbWFwZmJfcGxhdGZvcm1fZGF0YSAqZGF0YSk7CitleHRlcm4gdm9pZCBvbWFwZmJfc2V0X2N0cmxfcGxhdGZvcm1fZGF0YSh2b2lkICpwZGF0YSk7CitleHRlcm4gdm9pZCBvbWFwZmJfcmVzZXJ2ZV9zZHJhbSh2b2lkKTsKKworI2VuZGlmCisKKyNlbmRpZiAvKiBfX09NQVBGQl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS5oIGIvaW5jbHVkZS9saW51eC9wY2kuaAppbmRleCBmNWM3Y2QzLi4wNDc3MWI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpLmgKQEAgLTIxOCw2ICsyMTgsNyBAQAogCXVuc2lnbmVkIGludAljbGFzczsJCS8qIDMgYnl0ZXM6IChiYXNlLHN1Yixwcm9nLWlmKSAqLwogCXU4CQlyZXZpc2lvbjsJLyogUENJIHJldmlzaW9uLCBsb3cgYnl0ZSBvZiBjbGFzcyB3b3JkICovCiAJdTgJCWhkcl90eXBlOwkvKiBQQ0kgaGVhZGVyIHR5cGUgKGBtdWx0aScgZmxhZyBtYXNrZWQgb3V0KSAqLworCXU4CQlwY2llX2NhcDsJLyogUENJLUUgY2FwYWJpbGl0eSBvZmZzZXQgKi8KIAl1OAkJcGNpZV90eXBlOwkvKiBQQ0ktRSBkZXZpY2UvcG9ydCB0eXBlICovCiAJdTgJCXJvbV9iYXNlX3JlZzsJLyogd2hpY2ggY29uZmlnIHJlZ2lzdGVyIGNvbnRyb2xzIHRoZSBST00gKi8KIAl1OAkJcGluOyAgCQkvKiB3aGljaCBpbnRlcnJ1cHQgcGluIHRoaXMgZGV2aWNlIHVzZXMgKi8KQEAgLTI4MCw2ICsyODEsNyBAQAogCXVuc2lnbmVkIGludAlpc192aXJ0Zm46MTsKIAl1bnNpZ25lZCBpbnQJcmVzZXRfZm46MTsKIAl1bnNpZ25lZCBpbnQgICAgaXNfaG90cGx1Z19icmlkZ2U6MTsKKwl1bnNpZ25lZCBpbnQgICAgYWVyX2Zpcm13YXJlX2ZpcnN0OjE7CiAJcGNpX2Rldl9mbGFnc190IGRldl9mbGFnczsKIAlhdG9taWNfdAllbmFibGVfY250OwkvKiBwY2lfZW5hYmxlX2RldmljZSBoYXMgYmVlbiBjYWxsZWQgKi8KIApAQCAtNjM1LDcgKzYzNywxMyBAQAogCQkJCXVuc2lnbmVkIGludCBzc192ZW5kb3IsIHVuc2lnbmVkIGludCBzc19kZXZpY2UsCiAJCQkJc3RydWN0IHBjaV9kZXYgKmZyb20pOwogc3RydWN0IHBjaV9kZXYgKnBjaV9nZXRfc2xvdChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4pOwotc3RydWN0IHBjaV9kZXYgKnBjaV9nZXRfYnVzX2FuZF9zbG90KHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZmbik7CitzdHJ1Y3QgcGNpX2RldiAqcGNpX2dldF9kb21haW5fYnVzX2FuZF9zbG90KGludCBkb21haW4sIHVuc2lnbmVkIGludCBidXMsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgZGV2Zm4pOworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGNpX2RldiAqcGNpX2dldF9idXNfYW5kX3Nsb3QodW5zaWduZWQgaW50IGJ1cywKKwkJCQkJCSAgIHVuc2lnbmVkIGludCBkZXZmbikKK3sKKwlyZXR1cm4gcGNpX2dldF9kb21haW5fYnVzX2FuZF9zbG90KDAsIGJ1cywgZGV2Zm4pOworfQogc3RydWN0IHBjaV9kZXYgKnBjaV9nZXRfY2xhc3ModW5zaWduZWQgaW50IGNsYXNzLCBzdHJ1Y3QgcGNpX2RldiAqZnJvbSk7CiBpbnQgcGNpX2Rldl9wcmVzZW50KGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZHMpOwogCkBAIC03MDEsNiArNzA5LDcgQEAKIHZvaWQgcGNpX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldik7CiB2b2lkIHBjaV9jbGVhcl9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldik7CiBpbnQgcGNpX3NldF9wY2llX3Jlc2V0X3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGVudW0gcGNpZV9yZXNldF9zdGF0ZSBzdGF0ZSk7CitpbnQgcGNpX3NldF9jYWNoZWxpbmVfc2l6ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKICNkZWZpbmUgSEFWRV9QQ0lfU0VUX01XSQogaW50IF9fbXVzdF9jaGVjayBwY2lfc2V0X213aShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGludCBwY2lfdHJ5X3NldF9td2koc3RydWN0IHBjaV9kZXYgKmRldik7CkBAIC0xMjQ2LDYgKzEyNTUsOCBAQAogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBwY2lfY2FyZGJ1c19pb19zaXplOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX2NhcmRidXNfbWVtX3NpemU7CitleHRlcm4gdTggcGNpX2RmbF9jYWNoZV9saW5lX3NpemU7CitleHRlcm4gdTggcGNpX2NhY2hlX2xpbmVfc2l6ZTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX2hvdHBsdWdfaW9fc2l6ZTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHBjaV9ob3RwbHVnX21lbV9zaXplOwpAQCAtMTI5MCw1ICsxMzAxLDM0IEBACiBleHRlcm4gdm9pZCBwY2lfaHBfcmVtb3ZlX21vZHVsZV9saW5rKHN0cnVjdCBwY2lfc2xvdCAqcGNpX3Nsb3QpOwogI2VuZGlmCiAKKy8qKgorICogcGNpX3BjaWVfY2FwIC0gZ2V0IHRoZSBzYXZlZCBQQ0llIGNhcGFiaWxpdHkgb2Zmc2V0CisgKiBAZGV2OiBQQ0kgZGV2aWNlCisgKgorICogUENJZSBjYXBhYmlsaXR5IG9mZnNldCBpcyBjYWxjdWxhdGVkIGF0IFBDSSBkZXZpY2UgaW5pdGlhbGl6YXRpb24KKyAqIHRpbWUgYW5kIHNhdmVkIGluIHRoZSBkYXRhIHN0cnVjdHVyZS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHNhdmVkCisgKiBQQ0llIGNhcGFiaWxpdHkgb2Zmc2V0LiBVc2luZyB0aGlzIGluc3RlYWQgb2YgcGNpX2ZpbmRfY2FwYWJpbGl0eSgpCisgKiByZWR1Y2VzIHVubmVjZXNzYXJ5IHNlYXJjaCBpbiB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UuIElmIHlvdQorICogbmVlZCB0byBjYWxjdWxhdGUgUENJZSBjYXBhYmlsaXR5IG9mZnNldCBmcm9tIHJhdyBkZXZpY2UgZm9yIHNvbWUKKyAqIHJlYXNvbnMsIHBsZWFzZSB1c2UgcGNpX2ZpbmRfY2FwYWJpbGl0eSgpIGluc3RlYWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHBjaV9wY2llX2NhcChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXJldHVybiBkZXYtPnBjaWVfY2FwOworfQorCisvKioKKyAqIHBjaV9pc19wY2llIC0gY2hlY2sgaWYgdGhlIFBDSSBkZXZpY2UgaXMgUENJIEV4cHJlc3MgY2FwYWJsZQorICogQGRldjogUENJIGRldmljZQorICoKKyAqIFJldHJ1biB0cnVlIGlmIHRoZSBQQ0kgZGV2aWNlIGlzIFBDSSBFeHByZXNzIGNhcGFibGUsIGZhbHNlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGlubGluZSBib29sIHBjaV9pc19wY2llKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJcmV0dXJuICEhcGNpX3BjaWVfY2FwKGRldik7Cit9CisKK3ZvaWQgcGNpX3JlcXVlc3RfYWNzKHZvaWQpOworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIExJTlVYX1BDSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmgKaW5kZXggZGQwYmVkNC4uOWYyYWQwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaApAQCAtMzY1LDYgKzM2NSwxMSBAQAogI2RlZmluZSAgUENJX1hfU1RBVFVTXzI2Nk1IWgkweDQwMDAwMDAwCS8qIDI2NiBNSHogY2FwYWJsZSAqLwogI2RlZmluZSAgUENJX1hfU1RBVFVTXzUzM01IWgkweDgwMDAwMDAwCS8qIDUzMyBNSHogY2FwYWJsZSAqLwogCisvKiBQQ0kgQnJpZGdlIFN1YnN5c3RlbSBJRCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBQQ0lfU1NWSURfVkVORE9SX0lEICAgICA0CS8qIFBDSS1CcmlkZ2Ugc3Vic3lzdGVtIHZlbmRvciBpZCByZWdpc3RlciAqLworI2RlZmluZSBQQ0lfU1NWSURfREVWSUNFX0lEICAgICA2CS8qIFBDSS1CcmlkZ2Ugc3Vic3lzdGVtIGRldmljZSBpZCByZWdpc3RlciAqLworCiAvKiBQQ0kgRXhwcmVzcyBjYXBhYmlsaXR5IHJlZ2lzdGVycyAqLwogCiAjZGVmaW5lIFBDSV9FWFBfRkxBR1MJCTIJLyogQ2FwYWJpbGl0aWVzIHJlZ2lzdGVyICovCkBAIC01MDIsNiArNTA3LDcgQEAKICNkZWZpbmUgUENJX0VYVF9DQVBfSURfVkMJMgogI2RlZmluZSBQQ0lfRVhUX0NBUF9JRF9EU04JMwogI2RlZmluZSBQQ0lfRVhUX0NBUF9JRF9QV1IJNAorI2RlZmluZSBQQ0lfRVhUX0NBUF9JRF9BQ1MJMTMKICNkZWZpbmUgUENJX0VYVF9DQVBfSURfQVJJCTE0CiAjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX0FUUwkxNQogI2RlZmluZSBQQ0lfRVhUX0NBUF9JRF9TUklPVgkxNgpAQCAtNjYyLDQgKzY2OCwxNiBAQAogI2RlZmluZSAgUENJX1NSSU9WX1ZGTV9NTwkweDIJLyogQWN0aXZlLk1pZ3JhdGVPdXQgKi8KICNkZWZpbmUgIFBDSV9TUklPVl9WRk1fQVYJMHgzCS8qIEFjdGl2ZS5BdmFpbGFibGUgKi8KIAorLyogQWNjZXNzIENvbnRyb2wgU2VydmljZSAqLworI2RlZmluZSBQQ0lfQUNTX0NBUAkJMHgwNAkvKiBBQ1MgQ2FwYWJpbGl0eSBSZWdpc3RlciAqLworI2RlZmluZSAgUENJX0FDU19TVgkJMHgwMQkvKiBTb3VyY2UgVmFsaWRhdGlvbiAqLworI2RlZmluZSAgUENJX0FDU19UQgkJMHgwMgkvKiBUcmFuc2xhdGlvbiBCbG9ja2luZyAqLworI2RlZmluZSAgUENJX0FDU19SUgkJMHgwNAkvKiBQMlAgUmVxdWVzdCBSZWRpcmVjdCAqLworI2RlZmluZSAgUENJX0FDU19DUgkJMHgwOAkvKiBQMlAgQ29tcGxldGlvbiBSZWRpcmVjdCAqLworI2RlZmluZSAgUENJX0FDU19VRgkJMHgxMAkvKiBVcHN0cmVhbSBGb3J3YXJkaW5nICovCisjZGVmaW5lICBQQ0lfQUNTX0VDCQkweDIwCS8qIFAyUCBFZ3Jlc3MgQ29udHJvbCAqLworI2RlZmluZSAgUENJX0FDU19EVAkJMHg0MAkvKiBEaXJlY3QgVHJhbnNsYXRlZCBQMlAgKi8KKyNkZWZpbmUgUENJX0FDU19DVFJMCQkweDA2CS8qIEFDUyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9BQ1NfRUdSRVNTX0NUTF9WCTB4MDgJLyogQUNTIEVncmVzcyBDb250cm9sIFZlY3RvciAqLworCiAjZW5kaWYgLyogTElOVVhfUENJX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2llcG9ydF9pZi5oIGIvaW5jbHVkZS9saW51eC9wY2llcG9ydF9pZi5oCmluZGV4IGI0Yzc5NTQuLjY3NzU1MzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpZXBvcnRfaWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaWVwb3J0X2lmLmgKQEAgLTEwLDEwICsxMCw3IEBACiAjZGVmaW5lIF9QQ0lFUE9SVF9JRl9IXwogCiAvKiBQb3J0IFR5cGUgKi8KLSNkZWZpbmUgUENJRV9SQ19QT1JUCQkJNAkvKiBSb290IHBvcnQgb2YgUkMgKi8KLSNkZWZpbmUgUENJRV9TV19VUFNUUkVBTV9QT1JUCQk1CS8qIFVwc3RyZWFtIHBvcnQgb2YgU3dpdGNoICovCi0jZGVmaW5lIFBDSUVfU1dfRE9XTlNUUkVBTV9QT1JUCQk2CS8qIERvd25zdHJlYW0gcG9ydCBvZiBTd2l0Y2ggKi8KLSNkZWZpbmUgUENJRV9BTllfUE9SVAkJCTcKKyNkZWZpbmUgUENJRV9BTllfUE9SVAkJCSh+MCkKIAogLyogU2VydmljZSBUeXBlICovCiAjZGVmaW5lIFBDSUVfUE9SVF9TRVJWSUNFX1BNRV9TSElGVAkwCS8qIFBvd2VyIE1hbmFnZW1lbnQgRXZlbnQgKi8KQEAgLTI1LDE3ICsyMiw2IEBACiAjZGVmaW5lIFBDSUVfUE9SVF9TRVJWSUNFX1ZDX1NISUZUCTMJLyogVmlydHVhbCBDaGFubmVsICovCiAjZGVmaW5lIFBDSUVfUE9SVF9TRVJWSUNFX1ZDCQkoMSA8PCBQQ0lFX1BPUlRfU0VSVklDRV9WQ19TSElGVCkKIAotLyogUm9vdC9VcHN0cmVhbS9Eb3duc3RyZWFtIFBvcnQncyBJbnRlcnJ1cHQgTW9kZSAqLwotI2RlZmluZSBQQ0lFX1BPUlRfTk9fSVJRCQkoLTEpCi0jZGVmaW5lIFBDSUVfUE9SVF9JTlR4X01PREUJCTAKLSNkZWZpbmUgUENJRV9QT1JUX01TSV9NT0RFCQkxCi0jZGVmaW5lIFBDSUVfUE9SVF9NU0lYX01PREUJCTIKLQotc3RydWN0IHBjaWVfcG9ydF9kYXRhIHsKLQlpbnQgcG9ydF90eXBlOwkJLyogVHlwZSBvZiB0aGUgcG9ydCAqLwotCWludCBwb3J0X2lycV9tb2RlOwkvKiBbMDpJTlR4IHwgMTpNU0kgfCAyOk1TSS1YXSAqLwotfTsKLQogc3RydWN0IHBjaWVfZGV2aWNlIHsKIAlpbnQgCQlpcnE7CSAgICAvKiBTZXJ2aWNlIElSUS9NU0kvTVNJLVggVmVjdG9yICovCiAJc3RydWN0IHBjaV9kZXYgKnBvcnQ7CSAgICAvKiBSb290L1Vwc3RyZWFtL0Rvd25zdHJlYW0gUG9ydCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmggYi9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaAppbmRleCA0M2FkYmQ3Li42NGE1M2Y3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaApAQCAtMTgsMTAgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAotI2lmZGVmIENPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlQKLSNpbmNsdWRlIDxhc20vaHdfYnJlYWtwb2ludC5oPgotI2VuZGlmCi0KIC8qCiAgKiBVc2VyLXNwYWNlIEFCSSBiaXRzOgogICovCkBAIC0yMTUsMTIgKzIxMSwxMiBAQAogCQlfX3UzMgkJd2FrZXVwX3dhdGVybWFyazsgLyogYnl0ZXMgYmVmb3JlIHdha2V1cCAgICovCiAJfTsKIAotCXVuaW9uIHsKLQkJc3RydWN0IHsgLyogSGFyZHdhcmUgYnJlYWtwb2ludCBpbmZvICovCi0JCQlfX3U2NAkJYnBfYWRkcjsKLQkJCV9fdTMyCQlicF90eXBlOwotCQkJX191MzIJCWJwX2xlbjsKLQkJfTsKKwlzdHJ1Y3QgeyAvKiBIYXJkd2FyZSBicmVha3BvaW50IGluZm8gKi8KKwkJX191NjQJCWJwX2FkZHI7CisJCV9fdTMyCQlicF90eXBlOworCQlfX3UzMgkJYnBfbGVuOworCQlfX3U2NAkJX19icF9yZXNlcnZlZF8xOworCQlfX3U2NAkJX19icF9yZXNlcnZlZF8yOwogCX07CiAKIAlfX3UzMgkJCV9fcmVzZXJ2ZWRfMjsKQEAgLTQ1MSw2ICs0NDcsMTAgQEAKICMgaW5jbHVkZSA8YXNtL3BlcmZfZXZlbnQuaD4KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0hBVkVfSFdfQlJFQUtQT0lOVAorI2luY2x1ZGUgPGFzbS9od19icmVha3BvaW50Lmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KQEAgLTU2NSwxMCArNTY1LDEyIEBACiAJdm9pZCAoKmZ1bmMpKHN0cnVjdCBwZXJmX3BlbmRpbmdfZW50cnkgKik7CiB9OwogCi10eXBlZGVmIHZvaWQgKCpwZXJmX2NhbGxiYWNrX3QpKHN0cnVjdCBwZXJmX2V2ZW50ICosIHZvaWQgKik7Ci0KIHN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhOwogCit0eXBlZGVmIHZvaWQgKCpwZXJmX292ZXJmbG93X2hhbmRsZXJfdCkoc3RydWN0IHBlcmZfZXZlbnQgKiwgaW50LAorCQkJCQlzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqLAorCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKIC8qKgogICogc3RydWN0IHBlcmZfZXZlbnQgLSBwZXJmb3JtYW5jZSBldmVudCBrZXJuZWwgcmVwcmVzZW50YXRpb246CiAgKi8KQEAgLTY2MCwxOCArNjYyLDEyIEBACiAJc3RydWN0IHBpZF9uYW1lc3BhY2UJCSpuczsKIAl1NjQJCQkJaWQ7CiAKLQl2b2lkICgqb3ZlcmZsb3dfaGFuZGxlcikoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LAotCQkJaW50IG5taSwgc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsCi0JCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisJcGVyZl9vdmVyZmxvd19oYW5kbGVyX3QJCW92ZXJmbG93X2hhbmRsZXI7CiAKICNpZmRlZiBDT05GSUdfRVZFTlRfUFJPRklMRQogCXN0cnVjdCBldmVudF9maWx0ZXIJCSpmaWx0ZXI7CiAjZW5kaWYKIAotCXBlcmZfY2FsbGJhY2tfdAkJCWNhbGxiYWNrOwotCi0JcGVyZl9jYWxsYmFja190CQkJZXZlbnRfY2FsbGJhY2s7Ci0KICNlbmRpZiAvKiBDT05GSUdfUEVSRl9FVkVOVFMgKi8KIH07CiAKQEAgLTc4MSw3ICs3NzcsNyBAQAogcGVyZl9ldmVudF9jcmVhdGVfa2VybmVsX2NvdW50ZXIoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwKIAkJCQlpbnQgY3B1LAogCQkJCXBpZF90IHBpZCwKLQkJCQlwZXJmX2NhbGxiYWNrX3QgY2FsbGJhY2spOworCQkJCXBlcmZfb3ZlcmZsb3dfaGFuZGxlcl90IGNhbGxiYWNrKTsKIGV4dGVybiB1NjQgcGVyZl9ldmVudF9yZWFkX3ZhbHVlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKIAkJCQkgdTY0ICplbmFibGVkLCB1NjQgKnJ1bm5pbmcpOwogCkBAIC04NzYsNiArODcyLDggQEAKIAkJCSAgICAgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKTsKIGV4dGVybiBpbnQgcGVyZl9zd2V2ZW50X2dldF9yZWN1cnNpb25fY29udGV4dCh2b2lkKTsKIGV4dGVybiB2b2lkIHBlcmZfc3dldmVudF9wdXRfcmVjdXJzaW9uX2NvbnRleHQoaW50IHJjdHgpOworZXh0ZXJuIHZvaWQgcGVyZl9ldmVudF9lbmFibGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKK2V4dGVybiB2b2lkIHBlcmZfZXZlbnRfZGlzYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZAogcGVyZl9ldmVudF90YXNrX3NjaGVkX2luKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IGNwdSkJCXsgfQpAQCAtOTA2LDcgKzkwNCw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9ldmVudF9pbml0KHZvaWQpCQkJCXsgfQogc3RhdGljIGlubGluZSBpbnQgIHBlcmZfc3dldmVudF9nZXRfcmVjdXJzaW9uX2NvbnRleHQodm9pZCkgIHsgcmV0dXJuIC0xOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9zd2V2ZW50X3B1dF9yZWN1cnNpb25fY29udGV4dChpbnQgcmN0eCkJCXsgfQotCitzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9ldmVudF9lbmFibGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQkJeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9ldmVudF9kaXNhYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkJCXsgfQogI2VuZGlmCiAKICNkZWZpbmUgcGVyZl9vdXRwdXRfcHV0KGhhbmRsZSwgeCkgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmgKaW5kZXggM2M2Njc1Yy4uNzFmZjg4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCkBAIC04Myw2ICs4Myw4IEBACiAJc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqcGRydjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJaW50IHJlcXVlc3RlZF9pZDsKKwljaGFyICpidWZmZXI7CisJaW50IGJ1ZnNpemU7CiB9OwogCiAjZGVmaW5lIEVBUkxZX1BMQVRGT1JNX0lEX1VOU0VUIC0yCkBAIC0xMDIsMjEgKzEwNCwyOSBAQAogCQkJCSAgICAgICBpbnQgbnJfcHJvYmUsIGludCB1c2VyX29ubHkpOwogZXh0ZXJuIHZvaWQgZWFybHlfcGxhdGZvcm1fY2xlYW51cCh2b2lkKTsKIAorI2RlZmluZSBlYXJseV9wbGF0Zm9ybV9pbml0KGNsYXNzX3N0cmluZywgcGxhdGRydikJCVwKKwllYXJseV9wbGF0Zm9ybV9pbml0X2J1ZmZlcihjbGFzc19zdHJpbmcsIHBsYXRkcnYsIE5VTEwsIDApCiAKICNpZm5kZWYgTU9EVUxFCi0jZGVmaW5lIGVhcmx5X3BsYXRmb3JtX2luaXQoY2xhc3Nfc3RyaW5nLCBwbGF0Zm9ybV9kcml2ZXIpCQlcCisjZGVmaW5lIGVhcmx5X3BsYXRmb3JtX2luaXRfYnVmZmVyKGNsYXNzX3N0cmluZywgcGxhdGRydiwgYnVmLCBidWZzaXopCVwKIHN0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBlYXJseV9wbGF0Zm9ybV9kcml2ZXIgZWFybHlfZHJpdmVyID0gewkJXAogCS5jbGFzc19zdHIgPSBjbGFzc19zdHJpbmcsCQkJCQlcCi0JLnBkcnYgPSBwbGF0Zm9ybV9kcml2ZXIsCQkJCQlcCisJLmJ1ZmZlciA9IGJ1ZiwJCQkJCQkJXAorCS5idWZzaXplID0gYnVmc2l6LAkJCQkJCVwKKwkucGRydiA9IHBsYXRkcnYsCQkJCQkJXAogCS5yZXF1ZXN0ZWRfaWQgPSBFQVJMWV9QTEFURk9STV9JRF9VTlNFVCwJCQlcCiB9OwkJCQkJCQkJCVwKLXN0YXRpYyBpbnQgX19pbml0IGVhcmx5X3BsYXRmb3JtX2RyaXZlcl9zZXR1cF9mdW5jKGNoYXIgKmJ1ZikJCVwKK3N0YXRpYyBpbnQgX19pbml0IGVhcmx5X3BsYXRmb3JtX2RyaXZlcl9zZXR1cF9mdW5jKGNoYXIgKmJ1ZmZlcikJXAogewkJCQkJCQkJCVwKLQlyZXR1cm4gZWFybHlfcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZlYXJseV9kcml2ZXIsIGJ1Zik7CVwKKwlyZXR1cm4gZWFybHlfcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZlYXJseV9kcml2ZXIsIGJ1ZmZlcik7CVwKIH0JCQkJCQkJCQlcCiBlYXJseV9wYXJhbShjbGFzc19zdHJpbmcsIGVhcmx5X3BsYXRmb3JtX2RyaXZlcl9zZXR1cF9mdW5jKQogI2Vsc2UgLyogTU9EVUxFICovCi0jZGVmaW5lIGVhcmx5X3BsYXRmb3JtX2luaXQoY2xhc3Nfc3RyaW5nLCBwbGF0Zm9ybV9kcml2ZXIpCisjZGVmaW5lIGVhcmx5X3BsYXRmb3JtX2luaXRfYnVmZmVyKGNsYXNzX3N0cmluZywgcGxhdGRydiwgYnVmLCBidWZzaXopCVwKK3N0YXRpYyBpbmxpbmUgY2hhciAqZWFybHlfcGxhdGZvcm1fZHJpdmVyX3NldHVwX2Z1bmModm9pZCkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIGJ1ZnNpeiA/IGJ1ZiA6IE5VTEw7CQkJCQlcCit9CiAjZW5kaWYgLyogTU9EVUxFICovCiAKICNlbmRpZiAvKiBfUExBVEZPUk1fREVWSUNFX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3F1b3RhLmggYi9pbmNsdWRlL2xpbnV4L3F1b3RhLmgKaW5kZXggY2U5YTliMi4uZTcwZTYyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9xdW90YS5oCisrKyBiL2luY2x1ZGUvbGludXgvcXVvdGEuaApAQCAtNzMsNiArNzMsOCBAQAogLyogUXVvdGEgZm9ybWF0IHR5cGUgSURzICovCiAjZGVmaW5lCVFGTVRfVkZTX09MRCAxCiAjZGVmaW5lCVFGTVRfVkZTX1YwIDIKKyNkZWZpbmUgUUZNVF9PQ0ZTMiAzCisjZGVmaW5lCVFGTVRfVkZTX1YxIDQKIAogLyogU2l6ZSBvZiBibG9jayBpbiB3aGljaCBzcGFjZSBsaW1pdHMgYXJlIHBhc3NlZCB0aHJvdWdoIHRoZSBxdW90YQogICogaW50ZXJmYWNlICovCkBAIC0zMzQsNyArMzM2LDcgQEAKIAogc3RydWN0IHF1b3RhX2Zvcm1hdF90eXBlIHsKIAlpbnQgcWZfZm10X2lkOwkvKiBRdW90YSBmb3JtYXQgaWQgKi8KLQlzdHJ1Y3QgcXVvdGFfZm9ybWF0X29wcyAqcWZfb3BzOwkvKiBPcGVyYXRpb25zIG9mIGZvcm1hdCAqLworCWNvbnN0IHN0cnVjdCBxdW90YV9mb3JtYXRfb3BzICpxZl9vcHM7CS8qIE9wZXJhdGlvbnMgb2YgZm9ybWF0ICovCiAJc3RydWN0IG1vZHVsZSAqcWZfb3duZXI7CQkvKiBNb2R1bGUgaW1wbGVtZW50aW5nIHF1b3RhIGZvcm1hdCAqLwogCXN0cnVjdCBxdW90YV9mb3JtYXRfdHlwZSAqcWZfbmV4dDsKIH07CkBAIC0zOTQsNyArMzk2LDcgQEAKIAlzdHJ1Y3Qgcndfc2VtYXBob3JlIGRxcHRyX3NlbTsJCS8qIHNlcmlhbGl6ZSBvcHMgdXNpbmcgcXVvdGFfaW5mbyBzdHJ1Y3QsIHBvaW50ZXJzIGZyb20gaW5vZGUgdG8gZHF1b3RzICovCiAJc3RydWN0IGlub2RlICpmaWxlc1tNQVhRVU9UQVNdOwkJLyogaW5vZGVzIG9mIHF1b3RhZmlsZXMgKi8KIAlzdHJ1Y3QgbWVtX2RxaW5mbyBpbmZvW01BWFFVT1RBU107CS8qIEluZm9ybWF0aW9uIGZvciBlYWNoIHF1b3RhIHR5cGUgKi8KLQlzdHJ1Y3QgcXVvdGFfZm9ybWF0X29wcyAqb3BzW01BWFFVT1RBU107CS8qIE9wZXJhdGlvbnMgZm9yIGVhY2ggdHlwZSAqLworCWNvbnN0IHN0cnVjdCBxdW90YV9mb3JtYXRfb3BzICpvcHNbTUFYUVVPVEFTXTsJLyogT3BlcmF0aW9ucyBmb3IgZWFjaCB0eXBlICovCiB9OwogCiBpbnQgcmVnaXN0ZXJfcXVvdGFfZm9ybWF0KHN0cnVjdCBxdW90YV9mb3JtYXRfdHlwZSAqZm10KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCA4OTExNWVjLi4zZjRmYTczIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC0xODQwLDcgKzE4NDAsOCBAQAogZXh0ZXJuIGludCBzY2hlZF9jbG9ja19zdGFibGU7CiAjZW5kaWYKIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBzY2hlZF9jbG9jayh2b2lkKTsKKy8qIGZ0cmFjZSBjYWxscyBzY2hlZF9jbG9jaygpIGRpcmVjdGx5ICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIG5vdHJhY2Ugc2NoZWRfY2xvY2sodm9pZCk7CiAKIGV4dGVybiB2b2lkIHNjaGVkX2Nsb2NrX2luaXQodm9pZCk7CiBleHRlcm4gdTY0IHNjaGVkX2Nsb2NrX2NwdShpbnQgY3B1KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaCBiL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaAppbmRleCBiYzcwYzU4Li45MzlhNjE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCkBAIC04MzQsNCArODM0LDggQEAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfcGVyZl9ldmVudF9vcGVuKAogCQlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIF9fdXNlciAqYXR0cl91cHRyLAogCQlwaWRfdCBwaWQsIGludCBjcHUsIGludCBncm91cF9mZCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfbW1hcF9wZ29mZih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkJdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdHJhY2Vfc2VxLmggYi9pbmNsdWRlL2xpbnV4L3RyYWNlX3NlcS5oCmluZGV4IDA5MDc3ZjYuLjVjZjM5N2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHJhY2Vfc2VxLmgKKysrIGIvaW5jbHVkZS9saW51eC90cmFjZV9zZXEuaApAQCAtMTQsNiArMTQsNyBAQAogCXVuc2lnbmVkIGNoYXIJCWJ1ZmZlcltQQUdFX1NJWkVdOwogCXVuc2lnbmVkIGludAkJbGVuOwogCXVuc2lnbmVkIGludAkJcmVhZHBvczsKKwlpbnQJCQlmdWxsOwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC0yMSw2ICsyMiw3IEBACiB7CiAJcy0+bGVuID0gMDsKIAlzLT5yZWFkcG9zID0gMDsKKwlzLT5mdWxsID0gMDsKIH0KIAogLyoKQEAgLTMzLDcgKzM1LDcgQEAKIAlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDApKSk7CiBleHRlcm4gaW50CiB0cmFjZV9zZXFfYnByaW50ZihzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpmbXQsIGNvbnN0IHUzMiAqYmluYXJ5KTsKLWV4dGVybiB2b2lkIHRyYWNlX3ByaW50X3NlcShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB0cmFjZV9zZXEgKnMpOworZXh0ZXJuIGludCB0cmFjZV9wcmludF9zZXEoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdHJhY2Vfc2VxICpzKTsKIGV4dGVybiBzc2l6ZV90IHRyYWNlX3NlcV90b191c2VyKHN0cnVjdCB0cmFjZV9zZXEgKnMsIGNoYXIgX191c2VyICp1YnVmLAogCQkJCSBzaXplX3QgY250KTsKIGV4dGVybiBpbnQgdHJhY2Vfc2VxX3B1dHMoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqc3RyKTsKQEAgLTU1LDggKzU3LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHRyYWNlX3ByaW50X3NlcShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB0cmFjZV9zZXEgKnMpCitzdGF0aWMgaW5saW5lIGludCB0cmFjZV9wcmludF9zZXEoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdHJhY2Vfc2VxICpzKQogeworCXJldHVybiAwOwogfQogc3RhdGljIGlubGluZSBzc2l6ZV90IHRyYWNlX3NlcV90b191c2VyKHN0cnVjdCB0cmFjZV9zZXEgKnMsIGNoYXIgX191c2VyICp1YnVmLAogCQkJCSBzaXplX3QgY250KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90dHkuaCBiL2luY2x1ZGUvbGludXgvdHR5LmgKaW5kZXggZjBmNDNkMC4uNDA1YTkwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90dHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3R0eS5oCkBAIC0xOTAsOSArMTkwLDE3IEBACiAJLyogQ29udHJvbCB0aGUgRFRSIGxpbmUgKi8KIAl2b2lkICgqZHRyX3J0cykoc3RydWN0IHR0eV9wb3J0ICpwb3J0LCBpbnQgcmFpc2UpOwogCS8qIENhbGxlZCB3aGVuIHRoZSBsYXN0IGNsb3NlIGNvbXBsZXRlcyBvciBhIGhhbmd1cCBmaW5pc2hlcwotCSAgIElGRiB0aGUgcG9ydCB3YXMgaW5pdGlhbGl6ZWQuIERvIG5vdCB1c2UgdG8gZnJlZSByZXNvdXJjZXMgKi8KKwkgICBJRkYgdGhlIHBvcnQgd2FzIGluaXRpYWxpemVkLiBEbyBub3QgdXNlIHRvIGZyZWUgcmVzb3VyY2VzLiBDYWxsZWQKKwkgICB1bmRlciB0aGUgcG9ydCBtdXRleCB0byBzZXJpYWxpemUgYWdhaW5zdCBhY3RpdmF0ZS9zaHV0ZG93bnMgKi8KIAl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCk7CiAJdm9pZCAoKmRyb3ApKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCk7CisJLyogQ2FsbGVkIHVuZGVyIHRoZSBwb3J0IG11dGV4IGZyb20gdHR5X3BvcnRfb3Blbiwgc2VyaWFsaXplZCB1c2luZworCSAgIHRoZSBwb3J0IG11dGV4ICovCisgICAgICAgIC8qIEZJWE1FOiBsb25nIHRlcm0gZ2V0dGluZyB0aGUgdHR5IGFyZ3VtZW50ICpvdXQqIG9mIHRoaXMgd291bGQgYmUKKyAgICAgICAgICAgZ29vZCBmb3IgY29uc29sZXMgKi8KKwlpbnQgKCphY3RpdmF0ZSkoc3RydWN0IHR0eV9wb3J0ICpwb3J0LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKKwkvKiBDYWxsZWQgb24gdGhlIGZpbmFsIHB1dCBvZiBhIHBvcnQgKi8KKwl2b2lkICgqZGVzdHJ1Y3QpKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCk7CiB9OwogCQogc3RydWN0IHR0eV9wb3J0IHsKQEAgLTIwNiwxMiArMjE0LDE0IEBACiAJd2FpdF9xdWV1ZV9oZWFkX3QJZGVsdGFfbXNyX3dhaXQ7CS8qIE1vZGVtIHN0YXR1cyBjaGFuZ2UgKi8KIAl1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIFRUWSBmbGFncyBBU1lfKi8KIAlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwkJLyogTG9ja2luZyAqLworCXN0cnVjdCBtdXRleAkJYnVmX211dGV4OwkvKiBCdWZmZXIgYWxsb2MgbG9jayAqLwogCXVuc2lnbmVkIGNoYXIJCSp4bWl0X2J1ZjsJLyogT3B0aW9uYWwgYnVmZmVyICovCiAJdW5zaWduZWQgaW50CQljbG9zZV9kZWxheTsJLyogQ2xvc2UgcG9ydCBkZWxheSAqLwogCXVuc2lnbmVkIGludAkJY2xvc2luZ193YWl0OwkvKiBEZWxheSBmb3Igb3V0cHV0ICovCiAJaW50CQkJZHJhaW5fZGVsYXk7CS8qIFNldCB0byB6ZXJvIGlmIG5vIHB1cmUgdGltZQogCQkJCQkJICAgYmFzZWQgZHJhaW4gaXMgbmVlZGVkIGVsc2UKIAkJCQkJCSAgIHNldCB0byBzaXplIG9mIGZpZm8gKi8KKwlzdHJ1Y3Qga3JlZgkJa3JlZjsJCS8qIFJlZiBjb3VudGVyICovCiB9OwogCiAvKgpAQCAtNDM5LDcgKzQ0OSw3IEBACiAJCXN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIGludCBpZHgpOwogZXh0ZXJuIHN0cnVjdCB0dHlfc3RydWN0ICp0dHlfaW5pdF9kZXYoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwgaW50IGlkeCwKIAkJCQkJCQkJaW50IGZpcnN0X29rKTsKLWV4dGVybiB2b2lkIHR0eV9yZWxlYXNlX2RldihzdHJ1Y3QgZmlsZSAqZmlscCk7CitleHRlcm4gaW50IHR0eV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKIGV4dGVybiBpbnQgdHR5X2luaXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIAogZXh0ZXJuIHN0cnVjdCB0dHlfc3RydWN0ICp0dHlfcGFpcl9nZXRfdHR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwpAQCAtNDU0LDYgKzQ2NCwxNSBAQAogZXh0ZXJuIHZvaWQgdHR5X3BvcnRfaW5pdChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpOwogZXh0ZXJuIGludCB0dHlfcG9ydF9hbGxvY194bWl0X2J1ZihzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpOwogZXh0ZXJuIHZvaWQgdHR5X3BvcnRfZnJlZV94bWl0X2J1ZihzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpOworZXh0ZXJuIHZvaWQgdHR5X3BvcnRfcHV0KHN0cnVjdCB0dHlfcG9ydCAqcG9ydCk7CisKK2V4dGVybiBpbmxpbmUgc3RydWN0IHR0eV9wb3J0ICp0dHlfcG9ydF9nZXQoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQoreworCWlmIChwb3J0KQorCQlrcmVmX2dldCgmcG9ydC0+a3JlZik7CisJcmV0dXJuIHBvcnQ7Cit9CisKIGV4dGVybiBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5X3BvcnRfdHR5X2dldChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpOwogZXh0ZXJuIHZvaWQgdHR5X3BvcnRfdHR5X3NldChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogZXh0ZXJuIGludCB0dHlfcG9ydF9jYXJyaWVyX3JhaXNlZChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpOwpAQCAtNDY3LDYgKzQ4Niw4IEBACiBleHRlcm4gdm9pZCB0dHlfcG9ydF9jbG9zZV9lbmQoc3RydWN0IHR0eV9wb3J0ICpwb3J0LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIGV4dGVybiB2b2lkIHR0eV9wb3J0X2Nsb3NlKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCwKIAkJCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitleHRlcm4gaW50IHR0eV9wb3J0X29wZW4oc3RydWN0IHR0eV9wb3J0ICpwb3J0LAorCQkJCXN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKTsKIGV4dGVybiBpbmxpbmUgaW50IHR0eV9wb3J0X3VzZXJzKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKIHsKIAlyZXR1cm4gcG9ydC0+Y291bnQgKyBwb3J0LT5ibG9ja2VkX29wZW47CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi5oIGIvaW5jbHVkZS9saW51eC91c2IuaAppbmRleCBhMzRmYTg5Li5lMTAxYTJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiLmgKQEAgLTMzMSw2ICszMzEsNyBAQAogCXU4IG90Z19wb3J0OwkJCS8qIDAsIG9yIG51bWJlciBvZiBPVEcvSE5QIHBvcnQgKi8KIAl1bnNpZ25lZCBpc19iX2hvc3Q6MTsJCS8qIHRydWUgZHVyaW5nIHNvbWUgSE5QIHJvbGVzd2l0Y2hlcyAqLwogCXVuc2lnbmVkIGJfaG5wX2VuYWJsZToxOwkvKiBPVEc6IGRpZCBBLUhvc3QgZW5hYmxlIEhOUD8gKi8KKwl1bnNpZ25lZCBzZ190YWJsZXNpemU7CQkvKiAwIG9yIGxhcmdlc3QgbnVtYmVyIG9mIHNnIGxpc3QgZW50cmllcyAqLwogCiAJaW50IGRldm51bV9uZXh0OwkJLyogTmV4dCBvcGVuIGRldmljZSBudW1iZXIgaW4KIAkJCQkJICogcm91bmQtcm9iaW4gYWxsb2NhdGlvbiAqLwpAQCAtNDI4LDExICs0MjksOSBAQAogICogQGxhc3RfYnVzeTogdGltZSBvZiBsYXN0IHVzZQogICogQGF1dG9zdXNwZW5kX2RlbGF5OiBpbiBqaWZmaWVzCiAgKiBAY29ubmVjdF90aW1lOiB0aW1lIGRldmljZSB3YXMgZmlyc3QgY29ubmVjdGVkCi0gKiBAYXV0b19wbTogYXV0b3N1c3BlbmQvcmVzdW1lIGluIHByb2dyZXNzCiAgKiBAZG9fcmVtb3RlX3dha2V1cDogIHJlbW90ZSB3YWtldXAgc2hvdWxkIGJlIGVuYWJsZWQKICAqIEByZXNldF9yZXN1bWU6IG5lZWRzIHJlc2V0IGluc3RlYWQgb2YgcmVzdW1lCiAgKiBAYXV0b3N1c3BlbmRfZGlzYWJsZWQ6IGF1dG9zdXNwZW5kIGRpc2FibGVkIGJ5IHRoZSB1c2VyCi0gKiBAYXV0b3Jlc3VtZV9kaXNhYmxlZDogYXV0b3Jlc3VtZSBkaXNhYmxlZCBieSB0aGUgdXNlcgogICogQHNraXBfc3lzX3Jlc3VtZTogc2tpcCB0aGUgbmV4dCBzeXN0ZW0gcmVzdW1lCiAgKiBAd3VzYl9kZXY6IGlmIHRoaXMgaXMgYSBXaXJlbGVzcyBVU0IgZGV2aWNlLCBsaW5rIHRvIHRoZSBXVVNCCiAgKglzcGVjaWZpYyBkYXRhIGZvciB0aGUgZGV2aWNlLgpAQCAtNTEzLDExICs1MTIsOSBAQAogCWludCBhdXRvc3VzcGVuZF9kZWxheTsKIAl1bnNpZ25lZCBsb25nIGNvbm5lY3RfdGltZTsKIAotCXVuc2lnbmVkIGF1dG9fcG06MTsKIAl1bnNpZ25lZCBkb19yZW1vdGVfd2FrZXVwOjE7CiAJdW5zaWduZWQgcmVzZXRfcmVzdW1lOjE7CiAJdW5zaWduZWQgYXV0b3N1c3BlbmRfZGlzYWJsZWQ6MTsKLQl1bnNpZ25lZCBhdXRvcmVzdW1lX2Rpc2FibGVkOjE7CiAJdW5zaWduZWQgc2tpcF9zeXNfcmVzdW1lOjE7CiAjZW5kaWYKIAlzdHJ1Y3Qgd3VzYl9kZXYgKnd1c2JfZGV2OwpAQCAtNTQzLDIyICs1NDAsMjAgQEAKIAogLyogVVNCIGF1dG9zdXNwZW5kIGFuZCBhdXRvcmVzdW1lICovCiAjaWZkZWYgQ09ORklHX1VTQl9TVVNQRU5ECi1leHRlcm4gaW50IHVzYl9hdXRvcG1fc2V0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiBleHRlcm4gaW50IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiBleHRlcm4gdm9pZCB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogZXh0ZXJuIGludCB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2VfYXN5bmMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogZXh0ZXJuIHZvaWQgdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIAotc3RhdGljIGlubGluZSB2b2lkIHVzYl9hdXRvcG1fZW5hYmxlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIGlubGluZSB2b2lkIHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZV9ub19yZXN1bWUoCisJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotCWF0b21pY19zZXQoJmludGYtPnBtX3VzYWdlX2NudCwgMCk7Ci0JdXNiX2F1dG9wbV9zZXRfaW50ZXJmYWNlKGludGYpOworCWF0b21pY19pbmMoJmludGYtPnBtX3VzYWdlX2NudCk7CiB9Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1c2JfYXV0b3BtX2Rpc2FibGUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCitzdGF0aWMgaW5saW5lIHZvaWQgdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX25vX3N1c3BlbmQoCisJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotCWF0b21pY19zZXQoJmludGYtPnBtX3VzYWdlX2NudCwgMSk7Ci0JdXNiX2F1dG9wbV9zZXRfaW50ZXJmYWNlKGludGYpOworCWF0b21pY19kZWMoJmludGYtPnBtX3VzYWdlX2NudCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1c2JfbWFya19sYXN0X2J1c3koc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCkBAIC01NjgsMTIgKzU2Myw4IEBACiAKICNlbHNlCiAKLXN0YXRpYyBpbmxpbmUgaW50IHVzYl9hdXRvcG1fc2V0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsgcmV0dXJuIDA7IH0KLQogc3RhdGljIGlubGluZSBpbnQgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogeyByZXR1cm4gMDsgfQotCiBzdGF0aWMgaW5saW5lIGludCB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2VfYXN5bmMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7IHJldHVybiAwOyB9CiAKQEAgLTU4MSw5ICs1NzIsMTEgQEAKIHsgfQogc3RhdGljIGlubGluZSB2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9hc3luYyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsgfQotc3RhdGljIGlubGluZSB2b2lkIHVzYl9hdXRvcG1fZW5hYmxlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIGlubGluZSB2b2lkIHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZV9ub19yZXN1bWUoCisJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogeyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgdXNiX2F1dG9wbV9kaXNhYmxlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIGlubGluZSB2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9ub19zdXNwZW5kKAorCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsgfQogc3RhdGljIGlubGluZSB2b2lkIHVzYl9tYXJrX2xhc3RfYnVzeShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsgfQpAQCAtNjI2LDYgKzYxOSwxMCBAQAogCQl1bnNpZ25lZCBpZm51bSk7CiBleHRlcm4gc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqdXNiX2FsdG51bV90b19hbHRzZXR0aW5nKAogCQljb25zdCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgdW5zaWduZWQgaW50IGFsdG51bSk7CitleHRlcm4gc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqdXNiX2ZpbmRfYWx0X3NldHRpbmcoCisJCXN0cnVjdCB1c2JfaG9zdF9jb25maWcgKmNvbmZpZywKKwkJdW5zaWduZWQgaW50IGlmYWNlX251bSwKKwkJdW5zaWduZWQgaW50IGFsdF9udW0pOwogCiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvY29tcG9zaXRlLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9jb21wb3NpdGUuaAppbmRleCA0ZjZiYjNkLi43MzhlYTFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9jb21wb3NpdGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9jb21wb3NpdGUuaApAQCAtMTI3LDYgKzEyNyw3IEBACiAJLyogcHJpdmF0ZTogKi8KIAkvKiBpbnRlcm5hbHMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCQlsaXN0OworCURFQ0xBUkVfQklUTUFQKGVuZHBvaW50cywgMzIpOwogfTsKIAogaW50IHVzYl9hZGRfZnVuY3Rpb24oc3RydWN0IHVzYl9jb25maWd1cmF0aW9uICosIHN0cnVjdCB1c2JfZnVuY3Rpb24gKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9vdGcuaCBiL2luY2x1ZGUvbGludXgvdXNiL290Zy5oCmluZGV4IDI0NDNjMGUuLjUyYmI5MTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL290Zy5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL290Zy5oCkBAIC0zMyw2ICszMywyMyBAQAogCU9UR19TVEFURV9BX1ZCVVNfRVJSLAogfTsKIAorI2RlZmluZSBVU0JfT1RHX1BVTExVUF9JRAkJKDEgPDwgMCkKKyNkZWZpbmUgVVNCX09UR19QVUxMRE9XTl9EUAkJKDEgPDwgMSkKKyNkZWZpbmUgVVNCX09UR19QVUxMRE9XTl9ETQkJKDEgPDwgMikKKyNkZWZpbmUgVVNCX09UR19FWFRfVkJVU19JTkRJQ0FUT1IJKDEgPDwgMykKKyNkZWZpbmUgVVNCX09UR19EUlZfVkJVUwkJKDEgPDwgNCkKKyNkZWZpbmUgVVNCX09UR19EUlZfVkJVU19FWFQJCSgxIDw8IDUpCisKK3N0cnVjdCBvdGdfdHJhbnNjZWl2ZXI7CisKKy8qIGZvciB0cmFuc2NlaXZlcnMgY29ubmVjdGVkIHRocnUgYW4gVUxQSSBpbnRlcmZhY2UsIHRoZSB1c2VyIG11c3QKKyAqIHByb3ZpZGUgYWNjZXNzIG9wcworICovCitzdHJ1Y3Qgb3RnX2lvX2FjY2Vzc19vcHMgeworCWludCAoKnJlYWQpKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90ZywgdTMyIHJlZyk7CisJaW50ICgqd3JpdGUpKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90ZywgdTMyIHZhbCwgdTMyIHJlZyk7Cit9OworCiAvKgogICogdGhlIG90ZyBkcml2ZXIgbmVlZHMgdG8gaW50ZXJhY3Qgd2l0aCBib3RoIGRldmljZSBzaWRlIGFuZCBob3N0IHNpZGUKICAqIHVzYiBjb250cm9sbGVycy4gIGl0IGRlY2lkZXMgd2hpY2ggY29udHJvbGxlciBpcyBhY3RpdmUgYXQgYSBnaXZlbgpAQCAtNDIsNiArNTksNyBAQAogc3RydWN0IG90Z190cmFuc2NlaXZlciB7CiAJc3RydWN0IGRldmljZQkJKmRldjsKIAljb25zdCBjaGFyCQkqbGFiZWw7CisJdW5zaWduZWQgaW50CQkgZmxhZ3M7CiAKIAl1OAkJCWRlZmF1bHRfYTsKIAllbnVtIHVzYl9vdGdfc3RhdGUJc3RhdGU7CkBAIC00OSwxMCArNjcsMTcgQEAKIAlzdHJ1Y3QgdXNiX2J1cwkJKmhvc3Q7CiAJc3RydWN0IHVzYl9nYWRnZXQJKmdhZGdldDsKIAorCXN0cnVjdCBvdGdfaW9fYWNjZXNzX29wcwkqaW9fb3BzOworCXZvaWQgX19pb21lbQkJCSppb19wcml2OworCiAJLyogdG8gcGFzcyBleHRyYSBwb3J0IHN0YXR1cyB0byB0aGUgcm9vdCBodWIgKi8KIAl1MTYJCQlwb3J0X3N0YXR1czsKIAl1MTYJCQlwb3J0X2NoYW5nZTsKIAorCS8qIGluaXRpYWxpemUvc2h1dGRvd24gdGhlIE9URyBjb250cm9sbGVyICovCisJaW50CSgqaW5pdCkoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnKTsKKwl2b2lkCSgqc2h1dGRvd24pKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90Zyk7CisKIAkvKiBiaW5kL3VuYmluZCB0aGUgaG9zdCBjb250cm9sbGVyICovCiAJaW50CSgqc2V0X2hvc3QpKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90ZywKIAkJCQlzdHJ1Y3QgdXNiX2J1cyAqaG9zdCk7CkBAIC02NSw2ICs5MCwxMCBAQAogCWludAkoKnNldF9wb3dlcikoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnLAogCQkJCXVuc2lnbmVkIG1BKTsKIAorCS8qIGVmZmVjdGl2ZSBmb3IgQS1wZXJpcGhlcmFsLCBpZ25vcmVkIGZvciBCIGRldmljZXMgKi8KKwlpbnQJKCpzZXRfdmJ1cykoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnLAorCQkJCWJvb2wgZW5hYmxlZCk7CisKIAkvKiBmb3Igbm9uLU9URyBCIGRldmljZXM6IHNldCB0cmFuc2NlaXZlciBpbnRvIHN1c3BlbmQgbW9kZSAqLwogCWludAkoKnNldF9zdXNwZW5kKShzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICpvdGcsCiAJCQkJaW50IHN1c3BlbmQpOwpAQCAtODUsNiArMTE0LDM4IEBACiBleHRlcm4gdm9pZCB1c2Jfbm9wX3hjZWl2X3JlZ2lzdGVyKHZvaWQpOwogZXh0ZXJuIHZvaWQgdXNiX25vcF94Y2Vpdl91bnJlZ2lzdGVyKHZvaWQpOwogCisvKiBoZWxwZXJzIGZvciBkaXJlY3QgYWNjZXNzIHRocnUgbG93LWxldmVsIGlvIGludGVyZmFjZSAqLworc3RhdGljIGlubGluZSBpbnQgb3RnX2lvX3JlYWQoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnLCB1MzIgcmVnKQoreworCWlmIChvdGctPmlvX29wcyAmJiBvdGctPmlvX29wcy0+cmVhZCkKKwkJcmV0dXJuIG90Zy0+aW9fb3BzLT5yZWFkKG90ZywgcmVnKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW5saW5lIGludCBvdGdfaW9fd3JpdGUoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnLCB1MzIgcmVnLCB1MzIgdmFsKQoreworCWlmIChvdGctPmlvX29wcyAmJiBvdGctPmlvX29wcy0+d3JpdGUpCisJCXJldHVybiBvdGctPmlvX29wcy0+d3JpdGUob3RnLCByZWcsIHZhbCk7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK290Z19pbml0KHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90ZykKK3sKKwlpZiAob3RnLT5pbml0KQorCQlyZXR1cm4gb3RnLT5pbml0KG90Zyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitvdGdfc2h1dGRvd24oc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnKQoreworCWlmIChvdGctPnNodXRkb3duKQorCQlvdGctPnNodXRkb3duKG90Zyk7Cit9CiAKIC8qIGZvciB1c2IgaG9zdCBhbmQgcGVyaXBoZXJhbCBjb250cm9sbGVyIGRyaXZlcnMgKi8KIGV4dGVybiBzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICpvdGdfZ2V0X3RyYW5zY2VpdmVyKHZvaWQpOwpAQCAtOTcsNiArMTU4LDEyIEBACiAJcmV0dXJuIG90Zy0+c3RhcnRfaG5wKG90Zyk7CiB9CiAKKy8qIENvbnRleHQ6IGNhbiBzbGVlcCAqLworc3RhdGljIGlubGluZSBpbnQKK290Z19zZXRfdmJ1cyhzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICpvdGcsIGJvb2wgZW5hYmxlZCkKK3sKKwlyZXR1cm4gb3RnLT5zZXRfdmJ1cyhvdGcsIGVuYWJsZWQpOworfQogCiAvKiBmb3IgSENEcyAqLwogc3RhdGljIGlubGluZSBpbnQKQEAgLTEwNSw3ICsxNzIsNiBAQAogCXJldHVybiBvdGctPnNldF9ob3N0KG90ZywgaG9zdCk7CiB9CiAKLQogLyogZm9yIHVzYiBwZXJpcGhlcmFsIGNvbnRyb2xsZXIgZHJpdmVycyAqLwogCiAvKiBDb250ZXh0OiBjYW4gc2xlZXAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL3NlcmlhbC5oIGIvaW5jbHVkZS9saW51eC91c2Ivc2VyaWFsLmgKaW5kZXggY2U5MTFlYi4uYWNmNmU0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2Ivc2VyaWFsLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2Ivc2VyaWFsLmgKQEAgLTM5LDggKzM5LDYgQEAKICAqIEBzZXJpYWw6IHBvaW50ZXIgYmFjayB0byB0aGUgc3RydWN0IHVzYl9zZXJpYWwgb3duZXIgb2YgdGhpcyBwb3J0LgogICogQHBvcnQ6IHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdHR5X3BvcnQgZm9yIHRoaXMgcG9ydC4KICAqIEBsb2NrOiBzcGlubG9jayB0byBncmFiIHdoZW4gdXBkYXRpbmcgcG9ydGlvbnMgb2YgdGhpcyBzdHJ1Y3R1cmUuCi0gKiBAbXV0ZXg6IG11dGV4IHVzZWQgdG8gc3luY2hyb25pemUgc2VyaWFsX29wZW4oKSBhbmQgc2VyaWFsX2Nsb3NlKCkKLSAqCWFjY2VzcyBmb3IgdGhpcyBwb3J0LgogICogQG51bWJlcjogdGhlIG51bWJlciBvZiB0aGUgcG9ydCAodGhlIG1pbm9yIG51bWJlcikuCiAgKiBAaW50ZXJydXB0X2luX2J1ZmZlcjogcG9pbnRlciB0byB0aGUgaW50ZXJydXB0IGluIGJ1ZmZlciBmb3IgdGhpcyBwb3J0LgogICogQGludGVycnVwdF9pbl91cmI6IHBvaW50ZXIgdG8gdGhlIGludGVycnVwdCBpbiBzdHJ1Y3QgdXJiIGZvciB0aGlzIHBvcnQuCkBAIC03Nyw3ICs3NSw2IEBACiAJc3RydWN0IHVzYl9zZXJpYWwJKnNlcmlhbDsKIAlzdHJ1Y3QgdHR5X3BvcnQJCXBvcnQ7CiAJc3BpbmxvY2tfdAkJbG9jazsKLQlzdHJ1Y3QgbXV0ZXggICAgICAgICAgICBtdXRleDsKIAl1bnNpZ25lZCBjaGFyCQludW1iZXI7CiAKIAl1bnNpZ25lZCBjaGFyCQkqaW50ZXJydXB0X2luX2J1ZmZlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL3VscGkuaCBiL2luY2x1ZGUvbGludXgvdXNiL3VscGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDY3NWM2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC91c2IvdWxwaS5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfX0xJTlVYX1VTQl9VTFBJX0gKKyNkZWZpbmUgX19MSU5VWF9VU0JfVUxQSV9ICisKK3N0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90Z191bHBpX2NyZWF0ZShzdHJ1Y3Qgb3RnX2lvX2FjY2Vzc19vcHMgKm9wcywKKwkJCQkJdW5zaWduZWQgaW50IGZsYWdzKTsKKworI2VuZGlmIC8qIF9fTElOVVhfVVNCX1VMUElfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaCBiL2luY2x1ZGUvbGludXgvdXNiX3VzdWFsLmgKaW5kZXggM2QxNWZiOS4uYTRiOTQ3ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oCkBAIC01Niw3ICs1Niw5IEBACiAJVVNfRkxBRyhTQU5FX1NFTlNFLCAgICAgMHgwMDAwODAwMCkJCQlcCiAJCS8qIFNhbmUgU2Vuc2UgKD4gMTggYnl0ZXMpICovCQkJXAogCVVTX0ZMQUcoQ0FQQUNJVFlfT0ssCTB4MDAwMTAwMDApCQkJXAotCQkvKiBSRUFEIENBUEFDSVRZIHJlc3BvbnNlIGlzIGNvcnJlY3QgKi8KKwkJLyogUkVBRCBDQVBBQ0lUWSByZXNwb25zZSBpcyBjb3JyZWN0ICovCQlcCisJVVNfRkxBRyhCQURfU0VOU0UsCTB4MDAwMjAwMDApCQkJXAorCQkvKiBCYWQgU2Vuc2UgKG5ldmVyIG1vcmUgdGhhbiAxOCBieXRlcykgKi8KIAogI2RlZmluZSBVU19GTEFHKG5hbWUsIHZhbHVlKQlVU19GTF8jI25hbWUgPSB2YWx1ZSAsCiBlbnVtIHsgVVNfRE9fQUxMX0ZMQUdTIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy90aW1lci5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvdGltZXIuaAppbmRleCBlNWNlODdhLi45NDk2Yjk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy90aW1lci5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3RpbWVyLmgKQEAgLTMwMSw4ICszMDEsOCBAQAogCQlfX2VudHJ5LT5pbnRlcnZhbF91c2VjCT0gdmFsdWUtPml0X2ludGVydmFsLnR2X3VzZWM7CiAJKSwKIAotCVRQX3ByaW50aygid2hpY2g9JWQgZXhwaXJlcz0lbHUgaXRfdmFsdWU9JWx1LiVsdSBpdF9pbnRlcnZhbD0lbHUuJWx1IiwKLQkJICBfX2VudHJ5LT53aGljaCwgX19lbnRyeS0+ZXhwaXJlcywKKwlUUF9wcmludGsoIndoaWNoPSVkIGV4cGlyZXM9JWxsdSBpdF92YWx1ZT0lbGQuJWxkIGl0X2ludGVydmFsPSVsZC4lbGQiLAorCQkgIF9fZW50cnktPndoaWNoLCAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPmV4cGlyZXMsCiAJCSAgX19lbnRyeS0+dmFsdWVfc2VjLCBfX2VudHJ5LT52YWx1ZV91c2VjLAogCQkgIF9fZW50cnktPmludGVydmFsX3NlYywgX19lbnRyeS0+aW50ZXJ2YWxfdXNlYykKICk7CkBAIC0zMzEsOCArMzMxLDggQEAKIAkJX19lbnRyeS0+cGlkCT0gcGlkX25yKHBpZCk7CiAJKSwKIAotCSAgICBUUF9wcmludGsoIndoaWNoPSVkIHBpZD0lZCBub3c9JWx1IiwgX19lbnRyeS0+d2hpY2gsCi0JCSAgICAgIChpbnQpIF9fZW50cnktPnBpZCwgX19lbnRyeS0+bm93KQorCVRQX3ByaW50aygid2hpY2g9JWQgcGlkPSVkIG5vdz0lbGx1IiwgX19lbnRyeS0+d2hpY2gsCisJCSAgKGludCkgX19lbnRyeS0+cGlkLCAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPm5vdykKICk7CiAKICNlbmRpZiAvKiAgX1RSQUNFX1RJTUVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL3hlbi5oIGIvaW5jbHVkZS94ZW4veGVuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2NDAyNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUveGVuL3hlbi5oCkBAIC0wLDAgKzEsMzIgQEAKKyNpZm5kZWYgX1hFTl9YRU5fSAorI2RlZmluZSBfWEVOX1hFTl9ICisKK2VudW0geGVuX2RvbWFpbl90eXBlIHsKKwlYRU5fTkFUSVZFLAkJLyogcnVubmluZyBvbiBiYXJlIGhhcmR3YXJlICAgICovCisJWEVOX1BWX0RPTUFJTiwJCS8qIHJ1bm5pbmcgaW4gYSBQViBkb21haW4gICAgICAqLworCVhFTl9IVk1fRE9NQUlOLAkJLyogcnVubmluZyBpbiBhIFhlbiBodm0gZG9tYWluICovCit9OworCisjaWZkZWYgQ09ORklHX1hFTgorZXh0ZXJuIGVudW0geGVuX2RvbWFpbl90eXBlIHhlbl9kb21haW5fdHlwZTsKKyNlbHNlCisjZGVmaW5lIHhlbl9kb21haW5fdHlwZQkJWEVOX05BVElWRQorI2VuZGlmCisKKyNkZWZpbmUgeGVuX2RvbWFpbigpCQkoeGVuX2RvbWFpbl90eXBlICE9IFhFTl9OQVRJVkUpCisjZGVmaW5lIHhlbl9wdl9kb21haW4oKQkJKHhlbl9kb21haW4oKSAmJgkJCVwKKwkJCQkgeGVuX2RvbWFpbl90eXBlID09IFhFTl9QVl9ET01BSU4pCisjZGVmaW5lIHhlbl9odm1fZG9tYWluKCkJKHhlbl9kb21haW4oKSAmJgkJCVwKKwkJCQkgeGVuX2RvbWFpbl90eXBlID09IFhFTl9IVk1fRE9NQUlOKQorCisjaWZkZWYgQ09ORklHX1hFTl9ET00wCisjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS94ZW4uaD4KKyNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KKworI2RlZmluZSB4ZW5faW5pdGlhbF9kb21haW4oKQkoeGVuX3B2X2RvbWFpbigpICYmIFwKKwkJCQkgeGVuX3N0YXJ0X2luZm8tPmZsYWdzICYgU0lGX0lOSVRET01BSU4pCisjZWxzZSAgLyogIUNPTkZJR19YRU5fRE9NMCAqLworI2RlZmluZSB4ZW5faW5pdGlhbF9kb21haW4oKQkoMCkKKyNlbmRpZgkvKiBDT05GSUdfWEVOX0RPTTAgKi8KKworI2VuZGlmCS8qIF9YRU5fWEVOX0ggKi8KZGlmZiAtLWdpdCBhL2lwYy9zaG0uYyBiL2lwYy9zaG0uYwppbmRleCA0NjQ2OTRlLi4xMWJlYzYyIDEwMDY0NAotLS0gYS9pcGMvc2htLmMKKysrIGIvaXBjL3NobS5jCkBAIC0yOTAsMjggKzI5MCwyOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IHNobV9maWxlX2RhdGEgKnNmZCA9IHNobV9maWxlX2RhdGEoZmlsZSk7Ci0JcmV0dXJuIGdldF91bm1hcHBlZF9hcmVhKHNmZC0+ZmlsZSwgYWRkciwgbGVuLCBwZ29mZiwgZmxhZ3MpOwotfQotCi1pbnQgaXNfZmlsZV9zaG1faHVnZXBhZ2VzKHN0cnVjdCBmaWxlICpmaWxlKQotewotCWludCByZXQgPSAwOwotCi0JaWYgKGZpbGUtPmZfb3AgPT0gJnNobV9maWxlX29wZXJhdGlvbnMpIHsKLQkJc3RydWN0IHNobV9maWxlX2RhdGEgKnNmZDsKLQkJc2ZkID0gc2htX2ZpbGVfZGF0YShmaWxlKTsKLQkJcmV0ID0gaXNfZmlsZV9odWdlcGFnZXMoc2ZkLT5maWxlKTsKLQl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gc2ZkLT5maWxlLT5mX29wLT5nZXRfdW5tYXBwZWRfYXJlYShzZmQtPmZpbGUsIGFkZHIsIGxlbiwKKwkJCQkJCXBnb2ZmLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNobV9maWxlX29wZXJhdGlvbnMgPSB7CiAJLm1tYXAJCT0gc2htX21tYXAsCiAJLmZzeW5jCQk9IHNobV9mc3luYywKIAkucmVsZWFzZQk9IHNobV9yZWxlYXNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2htX2ZpbGVfb3BlcmF0aW9uc19odWdlID0geworCS5tbWFwCQk9IHNobV9tbWFwLAorCS5mc3luYwkJPSBzaG1fZnN5bmMsCisJLnJlbGVhc2UJPSBzaG1fcmVsZWFzZSwKIAkuZ2V0X3VubWFwcGVkX2FyZWEJPSBzaG1fZ2V0X3VubWFwcGVkX2FyZWEsCiB9OwogCitpbnQgaXNfZmlsZV9zaG1faHVnZXBhZ2VzKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBmaWxlLT5mX29wID09ICZzaG1fZmlsZV9vcGVyYXRpb25zX2h1Z2U7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc2htX3ZtX29wcyA9IHsKIAkub3Blbgk9IHNobV9vcGVuLAkvKiBjYWxsYmFjayBmb3IgYSBuZXcgdm0tYXJlYSBvcGVuICovCiAJLmNsb3NlCT0gc2htX2Nsb3NlLAkvKiBjYWxsYmFjayBmb3Igd2hlbiB0aGUgdm0tYXJlYSBpcyByZWxlYXNlZCAqLwpAQCAtODg5LDcgKzg4OSwxMCBAQAogCWlmICghc2ZkKQogCQlnb3RvIG91dF9wdXRfZGVudHJ5OwogCi0JZmlsZSA9IGFsbG9jX2ZpbGUocGF0aC5tbnQsIHBhdGguZGVudHJ5LCBmX21vZGUsICZzaG1fZmlsZV9vcGVyYXRpb25zKTsKKwlmaWxlID0gYWxsb2NfZmlsZShwYXRoLm1udCwgcGF0aC5kZW50cnksIGZfbW9kZSwKKwkJCWlzX2ZpbGVfaHVnZXBhZ2VzKHNocC0+c2htX2ZpbGUpID8KKwkJCQkmc2htX2ZpbGVfb3BlcmF0aW9uc19odWdlIDoKKwkJCQkmc2htX2ZpbGVfb3BlcmF0aW9ucyk7CiAJaWYgKCFmaWxlKQogCQlnb3RvIG91dF9mcmVlOwogCWltYV9jb3VudHNfZ2V0KGZpbGUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2V4aXQuYyBiL2tlcm5lbC9leGl0LmMKaW5kZXggMTE0MzAxMi4uNmY1MGVmNSAxMDA2NDQKLS0tIGEva2VybmVsL2V4aXQuYworKysgYi9rZXJuZWwvZXhpdC5jCkBAIC05NzEsNyArOTcxLDcgQEAKIAlleGl0X3RocmVhZCgpOwogCWNncm91cF9leGl0KHRzaywgMSk7CiAKLQlpZiAoZ3JvdXBfZGVhZCAmJiB0c2stPnNpZ25hbC0+bGVhZGVyKQorCWlmIChncm91cF9kZWFkKQogCQlkaXNhc3NvY2lhdGVfY3R0eSgxKTsKIAogCW1vZHVsZV9wdXQodGFza190aHJlYWRfaW5mbyh0c2spLT5leGVjX2RvbWFpbi0+bW9kdWxlKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9mdXRleC5jIGIva2VybmVsL2Z1dGV4LmMKaW5kZXggZmI2NWU4Mi4uZDczZWYxZiAxMDA2NDQKLS0tIGEva2VybmVsL2Z1dGV4LmMKKysrIGIva2VybmVsL2Z1dGV4LmMKQEAgLTMwNCw4ICszMDQsMTQgQEAKICAqLwogc3RhdGljIGludCBmYXVsdF9pbl91c2VyX3dyaXRlYWJsZSh1MzIgX191c2VyICp1YWRkcikKIHsKLQlpbnQgcmV0ID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sICh1bnNpZ25lZCBsb25nKXVhZGRyLAotCQkJCSAxLCAxLCAwLCBOVUxMLCBOVUxMKTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCWludCByZXQ7CisKKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJcmV0ID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgbW0sICh1bnNpZ25lZCBsb25nKXVhZGRyLAorCQkJICAgICAxLCAxLCAwLCBOVUxMLCBOVUxMKTsKKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCiAJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAwOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvaHJ0aW1lci5jIGIva2VybmVsL2hydGltZXIuYwppbmRleCBlZGU1Mjc3Li5kMmY5MjM5IDEwMDY0NAotLS0gYS9rZXJuZWwvaHJ0aW1lci5jCisrKyBiL2tlcm5lbC9ocnRpbWVyLmMKQEAgLTU1Nyw3ICs1NTcsNyBAQAogc3RhdGljIGludCBocnRpbWVyX3JlcHJvZ3JhbShzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCiAJCQkgICAgIHN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UpCiB7Ci0Ja3RpbWVfdCAqZXhwaXJlc19uZXh0ID0gJl9fZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcykuZXhwaXJlc19uZXh0OworCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpjcHVfYmFzZSA9ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOwogCWt0aW1lX3QgZXhwaXJlcyA9IGt0aW1lX3N1YihocnRpbWVyX2dldF9leHBpcmVzKHRpbWVyKSwgYmFzZS0+b2Zmc2V0KTsKIAlpbnQgcmVzOwogCkBAIC01ODIsNyArNTgyLDE2IEBACiAJaWYgKGV4cGlyZXMudHY2NCA8IDApCiAJCXJldHVybiAtRVRJTUU7CiAKLQlpZiAoZXhwaXJlcy50djY0ID49IGV4cGlyZXNfbmV4dC0+dHY2NCkKKwlpZiAoZXhwaXJlcy50djY0ID49IGNwdV9iYXNlLT5leHBpcmVzX25leHQudHY2NCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIElmIGEgaGFuZyB3YXMgZGV0ZWN0ZWQgaW4gdGhlIGxhc3QgdGltZXIgaW50ZXJydXB0IHRoZW4gd2UKKwkgKiBkbyBub3Qgc2NoZWR1bGUgYSB0aW1lciB3aGljaCBpcyBlYXJsaWVyIHRoYW4gdGhlIGV4cGlyeQorCSAqIHdoaWNoIHdlIGVuZm9yY2VkIGluIHRoZSBoYW5nIGRldGVjdGlvbi4gV2Ugd2FudCB0aGUgc3lzdGVtCisJICogdG8gbWFrZSBwcm9ncmVzcy4KKwkgKi8KKwlpZiAoY3B1X2Jhc2UtPmhhbmdfZGV0ZWN0ZWQpCiAJCXJldHVybiAwOwogCiAJLyoKQEAgLTU5MCw3ICs1OTksNyBAQAogCSAqLwogCXJlcyA9IHRpY2tfcHJvZ3JhbV9ldmVudChleHBpcmVzLCAwKTsKIAlpZiAoIUlTX0VSUl9WQUxVRShyZXMpKQotCQkqZXhwaXJlc19uZXh0ID0gZXhwaXJlczsKKwkJY3B1X2Jhc2UtPmV4cGlyZXNfbmV4dCA9IGV4cGlyZXM7CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtNzQ3LDE3ICs3NTYsMzMgQEAKIAogI2VuZGlmIC8qIENPTkZJR19ISUdIX1JFU19USU1FUlMgKi8KIAotI2lmZGVmIENPTkZJR19USU1FUl9TVEFUUwotdm9pZCBfX3RpbWVyX3N0YXRzX2hydGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IGhydGltZXIgKnRpbWVyLCB2b2lkICphZGRyKQorc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2hydGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IGhydGltZXIgKnRpbWVyKQogeworI2lmZGVmIENPTkZJR19USU1FUl9TVEFUUwogCWlmICh0aW1lci0+c3RhcnRfc2l0ZSkKIAkJcmV0dXJuOwotCi0JdGltZXItPnN0YXJ0X3NpdGUgPSBhZGRyOworCXRpbWVyLT5zdGFydF9zaXRlID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOwogCW1lbWNweSh0aW1lci0+c3RhcnRfY29tbSwgY3VycmVudC0+Y29tbSwgVEFTS19DT01NX0xFTik7CiAJdGltZXItPnN0YXJ0X3BpZCA9IGN1cnJlbnQtPnBpZDsKLX0KICNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfaHJ0aW1lcl9jbGVhcl9zdGFydF9pbmZvKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKyNpZmRlZiBDT05GSUdfVElNRVJfU1RBVFMKKwl0aW1lci0+c3RhcnRfc2l0ZSA9IE5VTEw7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2FjY291bnRfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCisJaWYgKGxpa2VseSghdGltZXJfc3RhdHNfYWN0aXZlKSkKKwkJcmV0dXJuOworCXRpbWVyX3N0YXRzX3VwZGF0ZV9zdGF0cyh0aW1lciwgdGltZXItPnN0YXJ0X3BpZCwgdGltZXItPnN0YXJ0X3NpdGUsCisJCQkJIHRpbWVyLT5mdW5jdGlvbiwgdGltZXItPnN0YXJ0X2NvbW0sIDApOworI2VuZGlmCit9CiAKIC8qCiAgKiBDb3VudGVycGFydCB0byBsb2NrX2hydGltZXJfYmFzZSBhYm92ZToKQEAgLTEyMTcsMzAgKzEyNDIsNiBAQAogCiAjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUwogCi1zdGF0aWMgaW50IGZvcmNlX2Nsb2NrX3JlcHJvZ3JhbTsKLQotLyoKLSAqIEFmdGVyIDUgaXRlcmF0aW9uJ3MgYXR0ZW1wdHMsIHdlIGNvbnNpZGVyIHRoYXQgaHJ0aW1lcl9pbnRlcnJ1cHQoKQotICogaXMgaGFuZ2luZywgd2hpY2ggY291bGQgaGFwcGVuIHdpdGggc29tZXRoaW5nIHRoYXQgc2xvd3MgdGhlIGludGVycnVwdAotICogc3VjaCBhcyB0aGUgdHJhY2luZy4gVGhlbiB3ZSBmb3JjZSB0aGUgY2xvY2sgcmVwcm9ncmFtbWluZyBmb3IgZWFjaCBmdXR1cmUKLSAqIGhydGltZXIgaW50ZXJydXB0cyB0byBhdm9pZCBpbmZpbml0ZSBsb29wcyBhbmQgdXNlIHRoZSBtaW5fZGVsdGFfbnMKLSAqIHRocmVzaG9sZCB0aGF0IHdlIHdpbGwgb3ZlcndyaXRlLgotICogVGhlIG5leHQgdGljayBldmVudCB3aWxsIGJlIHNjaGVkdWxlZCB0byAzIHRpbWVzIHdlIGN1cnJlbnRseSBzcGVuZCBvbgotICogaHJ0aW1lcl9pbnRlcnJ1cHQoKS4gVGhpcyBnaXZlcyBhIGdvb2QgY29tcHJvbWlzZSwgdGhlIGNwdXMgd2lsbCBzcGVuZAotICogMS80IG9mIHRoZWlyIHRpbWUgdG8gcHJvY2VzcyB0aGUgaHJ0aW1lciBpbnRlcnJ1cHRzLiBUaGlzIGlzIGVub3VnaCB0bwotICogbGV0IGl0IHJ1bm5pbmcgd2l0aG91dCBzZXJpb3VzIHN0YXJ2YXRpb24uCi0gKi8KLQotc3RhdGljIGlubGluZSB2b2lkCi1ocnRpbWVyX2ludGVycnVwdF9oYW5naW5nKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwKLQkJCWt0aW1lX3QgdHJ5X3RpbWUpCi17Ci0JZm9yY2VfY2xvY2tfcmVwcm9ncmFtID0gMTsKLQlkZXYtPm1pbl9kZWx0YV9ucyA9ICh1bnNpZ25lZCBsb25nKXRyeV90aW1lLnR2NjQgKiAzOwotCXByaW50ayhLRVJOX1dBUk5JTkcgImhydGltZXI6IGludGVycnVwdCB0b28gc2xvdywgIgotCSAgICAgICAiZm9yY2luZyBjbG9jayBtaW4gZGVsdGEgdG8gJWxsdSBuc1xuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgZGV2LT5taW5fZGVsdGFfbnMpOwotfQogLyoKICAqIEhpZ2ggcmVzb2x1dGlvbiB0aW1lciBpbnRlcnJ1cHQKICAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQKQEAgLTEyNDksMjEgKzEyNTAsMTUgQEAKIHsKIAlzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqY3B1X2Jhc2UgPSAmX19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKIAlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlOwotCWt0aW1lX3QgZXhwaXJlc19uZXh0LCBub3c7Ci0JaW50IG5yX3JldHJpZXMgPSAwOwotCWludCBpOworCWt0aW1lX3QgZXhwaXJlc19uZXh0LCBub3csIGVudHJ5X3RpbWUsIGRlbHRhOworCWludCBpLCByZXRyaWVzID0gMDsKIAogCUJVR19PTighY3B1X2Jhc2UtPmhyZXNfYWN0aXZlKTsKIAljcHVfYmFzZS0+bnJfZXZlbnRzKys7CiAJZGV2LT5uZXh0X2V2ZW50LnR2NjQgPSBLVElNRV9NQVg7CiAKLSByZXRyeToKLQkvKiA1IHJldHJpZXMgaXMgZW5vdWdoIHRvIG5vdGljZSBhIGhhbmcgKi8KLQlpZiAoISgrK25yX3JldHJpZXMgJSA1KSkKLQkJaHJ0aW1lcl9pbnRlcnJ1cHRfaGFuZ2luZyhkZXYsIGt0aW1lX3N1YihrdGltZV9nZXQoKSwgbm93KSk7Ci0KLQlub3cgPSBrdGltZV9nZXQoKTsKLQorCWVudHJ5X3RpbWUgPSBub3cgPSBrdGltZV9nZXQoKTsKK3JldHJ5OgogCWV4cGlyZXNfbmV4dC50djY0ID0gS1RJTUVfTUFYOwogCiAJc3Bpbl9sb2NrKCZjcHVfYmFzZS0+bG9jayk7CkBAIC0xMzI1LDEwICsxMzIwLDQ4IEBACiAJc3Bpbl91bmxvY2soJmNwdV9iYXNlLT5sb2NrKTsKIAogCS8qIFJlcHJvZ3JhbW1pbmcgbmVjZXNzYXJ5ID8gKi8KLQlpZiAoZXhwaXJlc19uZXh0LnR2NjQgIT0gS1RJTUVfTUFYKSB7Ci0JCWlmICh0aWNrX3Byb2dyYW1fZXZlbnQoZXhwaXJlc19uZXh0LCBmb3JjZV9jbG9ja19yZXByb2dyYW0pKQotCQkJZ290byByZXRyeTsKKwlpZiAoZXhwaXJlc19uZXh0LnR2NjQgPT0gS1RJTUVfTUFYIHx8CisJICAgICF0aWNrX3Byb2dyYW1fZXZlbnQoZXhwaXJlc19uZXh0LCAwKSkgeworCQljcHVfYmFzZS0+aGFuZ19kZXRlY3RlZCA9IDA7CisJCXJldHVybjsKIAl9CisKKwkvKgorCSAqIFRoZSBuZXh0IHRpbWVyIHdhcyBhbHJlYWR5IGV4cGlyZWQgZHVlIHRvOgorCSAqIC0gdHJhY2luZworCSAqIC0gbG9uZyBsYXN0aW5nIGNhbGxiYWNrcworCSAqIC0gYmVpbmcgc2NoZWR1bGVkIGF3YXkgd2hlbiBydW5uaW5nIGluIGEgVk0KKwkgKgorCSAqIFdlIG5lZWQgdG8gcHJldmVudCB0aGF0IHdlIGxvb3AgZm9yZXZlciBpbiB0aGUgaHJ0aW1lcgorCSAqIGludGVycnVwdCByb3V0aW5lLiBXZSBnaXZlIGl0IDMgYXR0ZW1wdHMgdG8gYXZvaWQKKwkgKiBvdmVycmVhY3Rpbmcgb24gc29tZSBzcHVyaW91cyBldmVudC4KKwkgKi8KKwlub3cgPSBrdGltZV9nZXQoKTsKKwljcHVfYmFzZS0+bnJfcmV0cmllcysrOworCWlmICgrK3JldHJpZXMgPCAzKQorCQlnb3RvIHJldHJ5OworCS8qCisJICogR2l2ZSB0aGUgc3lzdGVtIGEgY2hhbmNlIHRvIGRvIHNvbWV0aGluZyBlbHNlIHRoYW4gbG9vcGluZworCSAqIGhlcmUuIFdlIHN0b3JlZCB0aGUgZW50cnkgdGltZSwgc28gd2Uga25vdyBleGFjdGx5IGhvdyBsb25nCisJICogd2Ugc3BlbnQgaGVyZS4gV2Ugc2NoZWR1bGUgdGhlIG5leHQgZXZlbnQgdGhpcyBhbW91bnQgb2YKKwkgKiB0aW1lIGF3YXkuCisJICovCisJY3B1X2Jhc2UtPm5yX2hhbmdzKys7CisJY3B1X2Jhc2UtPmhhbmdfZGV0ZWN0ZWQgPSAxOworCWRlbHRhID0ga3RpbWVfc3ViKG5vdywgZW50cnlfdGltZSk7CisJaWYgKGRlbHRhLnR2NjQgPiBjcHVfYmFzZS0+bWF4X2hhbmdfdGltZS50djY0KQorCQljcHVfYmFzZS0+bWF4X2hhbmdfdGltZSA9IGRlbHRhOworCS8qCisJICogTGltaXQgaXQgdG8gYSBzZW5zaWJsZSB2YWx1ZSBhcyB3ZSBlbmZvcmNlIGEgbG9uZ2VyCisJICogZGVsYXkuIEdpdmUgdGhlIENQVSBhdCBsZWFzdCAxMDBtcyB0byBjYXRjaCB1cC4KKwkgKi8KKwlpZiAoZGVsdGEudHY2NCA+IDEwMCAqIE5TRUNfUEVSX01TRUMpCisJCWV4cGlyZXNfbmV4dCA9IGt0aW1lX2FkZF9ucyhub3csIDEwMCAqIE5TRUNfUEVSX01TRUMpOworCWVsc2UKKwkJZXhwaXJlc19uZXh0ID0ga3RpbWVfYWRkKG5vdywgZGVsdGEpOworCXRpY2tfcHJvZ3JhbV9ldmVudChleHBpcmVzX25leHQsIDEpOworCXByaW50a19vbmNlKEtFUk5fV0FSTklORyAiaHJ0aW1lcjogaW50ZXJydXB0IHRvb2sgJWxsdSBuc1xuIiwKKwkJICAgIGt0aW1lX3RvX25zKGRlbHRhKSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9rZXJuZWwvaHdfYnJlYWtwb2ludC5jIGIva2VybmVsL2h3X2JyZWFrcG9pbnQuYwppbmRleCBjZjVlZTE2Li4zNjZlZWRmIDEwMDY0NAotLS0gYS9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCisrKyBiL2tlcm5lbC9od19icmVha3BvaW50LmMKQEAgLTUyLDcgKzUyLDcgQEAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBpbnQsIG5yX2NwdV9icF9waW5uZWQpOwogCiAvKiBOdW1iZXIgb2YgcGlubmVkIHRhc2sgYnJlYWtwb2ludHMgaW4gYSBjcHUgKi8KLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBpbnQsIHRhc2tfYnBfcGlubmVkW0hCUF9OVU1dKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBpbnQsIG5yX3Rhc2tfYnBfcGlubmVkW0hCUF9OVU1dKTsKIAogLyogTnVtYmVyIG9mIG5vbi1waW5uZWQgY3B1L3Rhc2sgYnJlYWtwb2ludHMgaW4gYSBjcHUgKi8KIHN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBpbnQsIG5yX2JwX2ZsZXhpYmxlKTsKQEAgLTczLDcgKzczLDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X3Rhc2tfYnBfcGlubmVkKGludCBjcHUpCiB7CiAJaW50IGk7Ci0JdW5zaWduZWQgaW50ICp0c2tfcGlubmVkID0gcGVyX2NwdSh0YXNrX2JwX3Bpbm5lZCwgY3B1KTsKKwl1bnNpZ25lZCBpbnQgKnRza19waW5uZWQgPSBwZXJfY3B1KG5yX3Rhc2tfYnBfcGlubmVkLCBjcHUpOwogCiAJZm9yIChpID0gSEJQX05VTSAtMTsgaSA+PSAwOyBpLS0pIHsKIAkJaWYgKHRza19waW5uZWRbaV0gPiAwKQpAQCAtODMsNTAgKzgzLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBSZXBvcnQgdGhlIG51bWJlciBvZiBwaW5uZWQvdW4tcGlubmVkIGJyZWFrcG9pbnRzIHdlIGhhdmUgaW4KLSAqIGEgZ2l2ZW4gY3B1IChjcHUgPiAtMSkgb3IgaW4gYWxsIG9mIHRoZW0gKGNwdSA9IC0xKS4KLSAqLwotc3RhdGljIHZvaWQgZmV0Y2hfYnBfYnVzeV9zbG90cyhzdHJ1Y3QgYnBfYnVzeV9zbG90cyAqc2xvdHMsIGludCBjcHUpCitzdGF0aWMgaW50IHRhc2tfYnBfcGlubmVkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewotCWlmIChjcHUgPj0gMCkgewotCQlzbG90cy0+cGlubmVkID0gcGVyX2NwdShucl9jcHVfYnBfcGlubmVkLCBjcHUpOwotCQlzbG90cy0+cGlubmVkICs9IG1heF90YXNrX2JwX3Bpbm5lZChjcHUpOwotCQlzbG90cy0+ZmxleGlibGUgPSBwZXJfY3B1KG5yX2JwX2ZsZXhpYmxlLCBjcHUpOwotCi0JCXJldHVybjsKLQl9Ci0KLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewotCQl1bnNpZ25lZCBpbnQgbnI7Ci0KLQkJbnIgPSBwZXJfY3B1KG5yX2NwdV9icF9waW5uZWQsIGNwdSk7Ci0JCW5yICs9IG1heF90YXNrX2JwX3Bpbm5lZChjcHUpOwotCi0JCWlmIChuciA+IHNsb3RzLT5waW5uZWQpCi0JCQlzbG90cy0+cGlubmVkID0gbnI7Ci0KLQkJbnIgPSBwZXJfY3B1KG5yX2JwX2ZsZXhpYmxlLCBjcHUpOwotCi0JCWlmIChuciA+IHNsb3RzLT5mbGV4aWJsZSkKLQkJCXNsb3RzLT5mbGV4aWJsZSA9IG5yOwotCX0KLX0KLQotLyoKLSAqIEFkZCBhIHBpbm5lZCBicmVha3BvaW50IGZvciB0aGUgZ2l2ZW4gdGFzayBpbiBvdXIgY29uc3RyYWludCB0YWJsZQotICovCi1zdGF0aWMgdm9pZCB0b2dnbGVfYnBfdGFza19zbG90KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgY3B1LCBib29sIGVuYWJsZSkKLXsKLQlpbnQgY291bnQgPSAwOwotCXN0cnVjdCBwZXJmX2V2ZW50ICpicDsKIAlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHggPSB0c2stPnBlcmZfZXZlbnRfY3R4cDsKLQl1bnNpZ25lZCBpbnQgKnRza19waW5uZWQ7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqYnA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQgPSAwOwogCiAJaWYgKFdBUk5fT05DRSghY3R4LCAiTm8gcGVyZiBjb250ZXh0IGZvciB0aGlzIHRhc2siKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAogCWxpc3QgPSAmY3R4LT5ldmVudF9saXN0OwogCkBAIC0xNDMsMTAgKzEwOSw2MCBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3R4LT5sb2NrLCBmbGFncyk7CiAKLQlpZiAoV0FSTl9PTkNFKGNvdW50IDwgMCwgIk5vIGJyZWFrcG9pbnQgY291bnRlciBmb3VuZCBpbiB0aGUgY291bnRlciBsaXN0IikpCi0JCXJldHVybjsKKwlyZXR1cm4gY291bnQ7Cit9CiAKLQl0c2tfcGlubmVkID0gcGVyX2NwdSh0YXNrX2JwX3Bpbm5lZCwgY3B1KTsKKy8qCisgKiBSZXBvcnQgdGhlIG51bWJlciBvZiBwaW5uZWQvdW4tcGlubmVkIGJyZWFrcG9pbnRzIHdlIGhhdmUgaW4KKyAqIGEgZ2l2ZW4gY3B1IChjcHUgPiAtMSkgb3IgaW4gYWxsIG9mIHRoZW0gKGNwdSA9IC0xKS4KKyAqLworc3RhdGljIHZvaWQKK2ZldGNoX2JwX2J1c3lfc2xvdHMoc3RydWN0IGJwX2J1c3lfc2xvdHMgKnNsb3RzLCBzdHJ1Y3QgcGVyZl9ldmVudCAqYnApCit7CisJaW50IGNwdSA9IGJwLT5jcHU7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBicC0+Y3R4LT50YXNrOworCisJaWYgKGNwdSA+PSAwKSB7CisJCXNsb3RzLT5waW5uZWQgPSBwZXJfY3B1KG5yX2NwdV9icF9waW5uZWQsIGNwdSk7CisJCWlmICghdHNrKQorCQkJc2xvdHMtPnBpbm5lZCArPSBtYXhfdGFza19icF9waW5uZWQoY3B1KTsKKwkJZWxzZQorCQkJc2xvdHMtPnBpbm5lZCArPSB0YXNrX2JwX3Bpbm5lZCh0c2spOworCQlzbG90cy0+ZmxleGlibGUgPSBwZXJfY3B1KG5yX2JwX2ZsZXhpYmxlLCBjcHUpOworCisJCXJldHVybjsKKwl9CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQl1bnNpZ25lZCBpbnQgbnI7CisKKwkJbnIgPSBwZXJfY3B1KG5yX2NwdV9icF9waW5uZWQsIGNwdSk7CisJCWlmICghdHNrKQorCQkJbnIgKz0gbWF4X3Rhc2tfYnBfcGlubmVkKGNwdSk7CisJCWVsc2UKKwkJCW5yICs9IHRhc2tfYnBfcGlubmVkKHRzayk7CisKKwkJaWYgKG5yID4gc2xvdHMtPnBpbm5lZCkKKwkJCXNsb3RzLT5waW5uZWQgPSBucjsKKworCQluciA9IHBlcl9jcHUobnJfYnBfZmxleGlibGUsIGNwdSk7CisKKwkJaWYgKG5yID4gc2xvdHMtPmZsZXhpYmxlKQorCQkJc2xvdHMtPmZsZXhpYmxlID0gbnI7CisJfQorfQorCisvKgorICogQWRkIGEgcGlubmVkIGJyZWFrcG9pbnQgZm9yIHRoZSBnaXZlbiB0YXNrIGluIG91ciBjb25zdHJhaW50IHRhYmxlCisgKi8KK3N0YXRpYyB2b2lkIHRvZ2dsZV9icF90YXNrX3Nsb3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBjcHUsIGJvb2wgZW5hYmxlKQoreworCXVuc2lnbmVkIGludCAqdHNrX3Bpbm5lZDsKKwlpbnQgY291bnQgPSAwOworCisJY291bnQgPSB0YXNrX2JwX3Bpbm5lZCh0c2spOworCisJdHNrX3Bpbm5lZCA9IHBlcl9jcHUobnJfdGFza19icF9waW5uZWQsIGNwdSk7CiAJaWYgKGVuYWJsZSkgewogCQl0c2tfcGlubmVkW2NvdW50XSsrOwogCQlpZiAoY291bnQgPiAwKQpAQCAtMTkzLDcgKzIwOSw3IEBACiAgKiAgIC0gSWYgYXR0YWNoZWQgdG8gYSBzaW5nbGUgY3B1LCBjaGVjazoKICAqCiAgKiAgICAgICAocGVyX2NwdShucl9icF9mbGV4aWJsZSwgY3B1KSB8fCAocGVyX2NwdShucl9jcHVfYnBfcGlubmVkLCBjcHUpCi0gKiAgICAgICAgICAgKyBtYXgocGVyX2NwdSh0YXNrX2JwX3Bpbm5lZCwgY3B1KSkpKSA8IEhCUF9OVU0KKyAqICAgICAgICAgICArIG1heChwZXJfY3B1KG5yX3Rhc2tfYnBfcGlubmVkLCBjcHUpKSkpIDwgSEJQX05VTQogICoKICAqICAgICAgIC0+IElmIHRoZXJlIGFyZSBhbHJlYWR5IG5vbi1waW5uZWQgY291bnRlcnMgaW4gdGhpcyBjcHUsIGl0IG1lYW5zCiAgKiAgICAgICAgICB0aGVyZSBpcyBhbHJlYWR5IGEgZnJlZSBzbG90IGZvciB0aGVtLgpAQCAtMjA0LDcgKzIyMCw3IEBACiAgKiAgIC0gSWYgYXR0YWNoZWQgdG8gZXZlcnkgY3B1cywgY2hlY2s6CiAgKgogICogICAgICAgKHBlcl9jcHUobnJfYnBfZmxleGlibGUsICopIHx8IChtYXgocGVyX2NwdShucl9jcHVfYnBfcGlubmVkLCAqKSkKLSAqICAgICAgICAgICArIG1heChwZXJfY3B1KHRhc2tfYnBfcGlubmVkLCAqKSkpKSA8IEhCUF9OVU0KKyAqICAgICAgICAgICArIG1heChwZXJfY3B1KG5yX3Rhc2tfYnBfcGlubmVkLCAqKSkpKSA8IEhCUF9OVU0KICAqCiAgKiAgICAgICAtPiBUaGlzIGlzIHJvdWdobHkgdGhlIHNhbWUsIGV4Y2VwdCB3ZSBjaGVjayB0aGUgbnVtYmVyIG9mIHBlciBjcHUKICAqICAgICAgICAgIGJwIGZvciBldmVyeSBjcHUgYW5kIHdlIGtlZXAgdGhlIG1heCBvbmUuIFNhbWUgZm9yIHRoZSBwZXIgdGFza3MKQEAgLTIxNiw3ICsyMzIsNyBAQAogICogICAtIElmIGF0dGFjaGVkIHRvIGEgc2luZ2xlIGNwdSwgY2hlY2s6CiAgKgogICogICAgICAgKChwZXJfY3B1KG5yX2JwX2ZsZXhpYmxlLCBjcHUpID4gMSkgKyBwZXJfY3B1KG5yX2NwdV9icF9waW5uZWQsIGNwdSkKLSAqICAgICAgICAgICAgKyBtYXgocGVyX2NwdSh0YXNrX2JwX3Bpbm5lZCwgY3B1KSkpIDwgSEJQX05VTQorICogICAgICAgICAgICArIG1heChwZXJfY3B1KG5yX3Rhc2tfYnBfcGlubmVkLCBjcHUpKSkgPCBIQlBfTlVNCiAgKgogICogICAgICAgLT4gU2FtZSBjaGVja3MgYXMgYmVmb3JlLiBCdXQgbm93IHRoZSBucl9icF9mbGV4aWJsZSwgaWYgYW55LCBtdXN0IGtlZXAKICAqICAgICAgICAgIG9uZSByZWdpc3RlciBhdCBsZWFzdCAob3IgdGhleSB3aWxsIG5ldmVyIGJlIGZlZCkuCkBAIC0yMjQsNyArMjQwLDcgQEAKICAqICAgLSBJZiBhdHRhY2hlZCB0byBldmVyeSBjcHVzLCBjaGVjazoKICAqCiAgKiAgICAgICAoKHBlcl9jcHUobnJfYnBfZmxleGlibGUsICopID4gMSkgKyBtYXgocGVyX2NwdShucl9jcHVfYnBfcGlubmVkLCAqKSkKLSAqICAgICAgICAgICAgKyBtYXgocGVyX2NwdSh0YXNrX2JwX3Bpbm5lZCwgKikpKSA8IEhCUF9OVU0KKyAqICAgICAgICAgICAgKyBtYXgocGVyX2NwdShucl90YXNrX2JwX3Bpbm5lZCwgKikpKSA8IEhCUF9OVU0KICAqLwogaW50IHJlc2VydmVfYnBfc2xvdChzdHJ1Y3QgcGVyZl9ldmVudCAqYnApCiB7CkBAIC0yMzMsNyArMjQ5LDcgQEAKIAogCW11dGV4X2xvY2soJm5yX2JwX211dGV4KTsKIAotCWZldGNoX2JwX2J1c3lfc2xvdHMoJnNsb3RzLCBicC0+Y3B1KTsKKwlmZXRjaF9icF9idXN5X3Nsb3RzKCZzbG90cywgYnApOwogCiAJLyogRmxleGlibGUgY291bnRlcnMgbmVlZCB0byBrZWVwIGF0IGxlYXN0IG9uZSBzbG90ICovCiAJaWYgKHNsb3RzLnBpbm5lZCArICghIXNsb3RzLmZsZXhpYmxlKSA9PSBIQlBfTlVNKSB7CkBAIC0yNTksNyArMjc1LDcgQEAKIH0KIAogCi1pbnQgX19yZWdpc3Rlcl9wZXJmX2h3X2JyZWFrcG9pbnQoc3RydWN0IHBlcmZfZXZlbnQgKmJwKQoraW50IHJlZ2lzdGVyX3BlcmZfaHdfYnJlYWtwb2ludChzdHJ1Y3QgcGVyZl9ldmVudCAqYnApCiB7CiAJaW50IHJldDsKIApAQCAtMjc2LDE5ICsyOTIsMTIgQEAKIAkgKiBUaGlzIGlzIGEgcXVpY2sgaGFjayB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBzb29uLCBvbmNlIHdlIHJlbW92ZQogCSAqIHRoZSB0bXAgYnJlYWtwb2ludHMgZnJvbSBwdHJhY2UKIAkgKi8KLQlpZiAoIWJwLT5hdHRyLmRpc2FibGVkIHx8IGJwLT5jYWxsYmFjayA9PSBwZXJmX2JwX2V2ZW50KQorCWlmICghYnAtPmF0dHIuZGlzYWJsZWQgfHwgIWJwLT5vdmVyZmxvd19oYW5kbGVyKQogCQlyZXQgPSBhcmNoX3ZhbGlkYXRlX2h3YmtwdF9zZXR0aW5ncyhicCwgYnAtPmN0eC0+dGFzayk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgcmVnaXN0ZXJfcGVyZl9od19icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2ZW50ICpicCkKLXsKLQlicC0+Y2FsbGJhY2sgPSBwZXJmX2JwX2V2ZW50OwotCi0JcmV0dXJuIF9fcmVnaXN0ZXJfcGVyZl9od19icmVha3BvaW50KGJwKTsKLX0KLQogLyoqCiAgKiByZWdpc3Rlcl91c2VyX2h3X2JyZWFrcG9pbnQgLSByZWdpc3RlciBhIGhhcmR3YXJlIGJyZWFrcG9pbnQgZm9yIHVzZXIgc3BhY2UKICAqIEBhdHRyOiBicmVha3BvaW50IGF0dHJpYnV0ZXMKQEAgLTI5Nyw3ICszMDYsNyBAQAogICovCiBzdHJ1Y3QgcGVyZl9ldmVudCAqCiByZWdpc3Rlcl91c2VyX2h3X2JyZWFrcG9pbnQoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwKLQkJCSAgICBwZXJmX2NhbGxiYWNrX3QgdHJpZ2dlcmVkLAorCQkJICAgIHBlcmZfb3ZlcmZsb3dfaGFuZGxlcl90IHRyaWdnZXJlZCwKIAkJCSAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAlyZXR1cm4gcGVyZl9ldmVudF9jcmVhdGVfa2VybmVsX2NvdW50ZXIoYXR0ciwgLTEsIHRzay0+cGlkLCB0cmlnZ2VyZWQpOwpAQCAtMzExLDE5ICszMjAsNDAgQEAKICAqIEB0cmlnZ2VyZWQ6IGNhbGxiYWNrIHRvIHRyaWdnZXIgd2hlbiB3ZSBoaXQgdGhlIGJyZWFrcG9pbnQKICAqIEB0c2s6IHBvaW50ZXIgdG8gJ3Rhc2tfc3RydWN0JyBvZiB0aGUgcHJvY2VzcyB0byB3aGljaCB0aGUgYWRkcmVzcyBiZWxvbmdzCiAgKi8KLXN0cnVjdCBwZXJmX2V2ZW50ICoKLW1vZGlmeV91c2VyX2h3X2JyZWFrcG9pbnQoc3RydWN0IHBlcmZfZXZlbnQgKmJwLCBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLAotCQkJICBwZXJmX2NhbGxiYWNrX3QgdHJpZ2dlcmVkLAotCQkJICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK2ludCBtb2RpZnlfdXNlcl9od19icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2ZW50ICpicCwgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0cikKIHsKLQkvKgotCSAqIEZJWE1FOiBkbyBpdCB3aXRob3V0IHVucmVnaXN0ZXJpbmcKLQkgKiAtIFdlIGRvbid0IHdhbnQgdG8gbG9zZSBvdXIgc2xvdAotCSAqIC0gSWYgdGhlIG5ldyBicCBpcyBpbmNvcnJlY3QsIGRvbid0IGxvc2UgdGhlIG9sZGVyIG9uZQotCSAqLwotCXVucmVnaXN0ZXJfaHdfYnJlYWtwb2ludChicCk7CisJdTY0IG9sZF9hZGRyID0gYnAtPmF0dHIuYnBfYWRkcjsKKwlpbnQgb2xkX3R5cGUgPSBicC0+YXR0ci5icF90eXBlOworCWludCBvbGRfbGVuID0gYnAtPmF0dHIuYnBfbGVuOworCWludCBlcnIgPSAwOwogCi0JcmV0dXJuIHBlcmZfZXZlbnRfY3JlYXRlX2tlcm5lbF9jb3VudGVyKGF0dHIsIC0xLCB0c2stPnBpZCwgdHJpZ2dlcmVkKTsKKwlwZXJmX2V2ZW50X2Rpc2FibGUoYnApOworCisJYnAtPmF0dHIuYnBfYWRkciA9IGF0dHItPmJwX2FkZHI7CisJYnAtPmF0dHIuYnBfdHlwZSA9IGF0dHItPmJwX3R5cGU7CisJYnAtPmF0dHIuYnBfbGVuID0gYXR0ci0+YnBfbGVuOworCisJaWYgKGF0dHItPmRpc2FibGVkKQorCQlnb3RvIGVuZDsKKworCWVyciA9IGFyY2hfdmFsaWRhdGVfaHdia3B0X3NldHRpbmdzKGJwLCBicC0+Y3R4LT50YXNrKTsKKwlpZiAoIWVycikKKwkJcGVyZl9ldmVudF9lbmFibGUoYnApOworCisJaWYgKGVycikgeworCQlicC0+YXR0ci5icF9hZGRyID0gb2xkX2FkZHI7CisJCWJwLT5hdHRyLmJwX3R5cGUgPSBvbGRfdHlwZTsKKwkJYnAtPmF0dHIuYnBfbGVuID0gb2xkX2xlbjsKKwkJaWYgKCFicC0+YXR0ci5kaXNhYmxlZCkKKwkJCXBlcmZfZXZlbnRfZW5hYmxlKGJwKTsKKworCQlyZXR1cm4gZXJyOworCX0KKworZW5kOgorCWJwLT5hdHRyLmRpc2FibGVkID0gYXR0ci0+ZGlzYWJsZWQ7CisKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1vZGlmeV91c2VyX2h3X2JyZWFrcG9pbnQpOwogCkBAIC0zNDgsNyArMzc4LDcgQEAKICAqLwogc3RydWN0IHBlcmZfZXZlbnQgKioKIHJlZ2lzdGVyX3dpZGVfaHdfYnJlYWtwb2ludChzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLAotCQkJICAgIHBlcmZfY2FsbGJhY2tfdCB0cmlnZ2VyZWQpCisJCQkgICAgcGVyZl9vdmVyZmxvd19oYW5kbGVyX3QgdHJpZ2dlcmVkKQogewogCXN0cnVjdCBwZXJmX2V2ZW50ICoqY3B1X2V2ZW50cywgKipwZXZlbnQsICpicDsKIAlsb25nIGVycjsKZGlmZiAtLWdpdCBhL2tlcm5lbC9rZ2RiLmMgYi9rZXJuZWwva2dkYi5jCmluZGV4IDdkNzAxNDYuLjJlYjUxN2UgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9rZ2RiLmMKKysrIGIva2VybmVsL2tnZGIuYwpAQCAtMTI5LDYgKzEyOSw3IEBACiBzdHJ1Y3QgdGFza19zdHJ1Y3QJCSprZ2RiX2NvbnR0aHJlYWQ7CiAKIGludAkJCQlrZ2RiX3NpbmdsZV9zdGVwOworcGlkX3QJCQkJa2dkYl9zc3RlcF9waWQ7CiAKIC8qIE91ciBJL08gYnVmZmVycy4gKi8KIHN0YXRpYyBjaGFyCQkJcmVtY29tX2luX2J1ZmZlcltCVUZNQVhdOwpAQCAtNTQxLDEyICs1NDIsMTcgQEAKIAkgKi8KIAlpZiAodGlkID09IDAgfHwgdGlkID09IC0xKQogCQl0aWQgPSAtYXRvbWljX3JlYWQoJmtnZGJfYWN0aXZlKSAtIDI7Ci0JaWYgKHRpZCA8IDApIHsKKwlpZiAodGlkIDwgLTEgJiYgdGlkID4gLU5SX0NQVVMgLSAyKSB7CiAJCWlmIChrZ2RiX2luZm9bLXRpZCAtIDJdLnRhc2spCiAJCQlyZXR1cm4ga2dkYl9pbmZvWy10aWQgLSAyXS50YXNrOwogCQllbHNlCiAJCQlyZXR1cm4gaWRsZV90YXNrKC10aWQgLSAyKTsKIAl9CisJaWYgKHRpZCA8PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiS0dEQjogSW50ZXJuYWwgdGhyZWFkIHNlbGVjdCBlcnJvclxuIik7CisJCWR1bXBfc3RhY2soKTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCiAJLyoKIAkgKiBmaW5kX3Rhc2tfYnlfcGlkX25zKCkgZG9lcyBub3QgdGFrZSB0aGUgdGFza2xpc3QgbG9jayBhbnltb3JlCkBAIC02MTksNyArNjI1LDggQEAKIHN0YXRpYyBpbnQga2dkYl9hY3RpdmF0ZV9zd19icmVha3BvaW50cyh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQlpbnQgZXJyb3IgPSAwOworCWludCBlcnJvcjsKKwlpbnQgcmV0ID0gMDsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBLR0RCX01BWF9CUkVBS1BPSU5UUzsgaSsrKSB7CkBAIC02MjksMTMgKzYzNiwxNiBAQAogCQlhZGRyID0ga2dkYl9icmVha1tpXS5icHRfYWRkcjsKIAkJZXJyb3IgPSBrZ2RiX2FyY2hfc2V0X2JyZWFrcG9pbnQoYWRkciwKIAkJCQlrZ2RiX2JyZWFrW2ldLnNhdmVkX2luc3RyKTsKLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIGVycm9yOworCQlpZiAoZXJyb3IpIHsKKwkJCXJldCA9IGVycm9yOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiS0dEQjogQlAgaW5zdGFsbCBmYWlsZWQ6ICVseCIsIGFkZHIpOworCQkJY29udGludWU7CisJCX0KIAogCQlrZ2RiX2ZsdXNoX3N3YnJlYWtfYWRkcihhZGRyKTsKIAkJa2dkYl9icmVha1tpXS5zdGF0ZSA9IEJQX0FDVElWRTsKIAl9Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBrZ2RiX3NldF9zd19icmVhayh1bnNpZ25lZCBsb25nIGFkZHIpCkBAIC02ODIsNyArNjkyLDggQEAKIHN0YXRpYyBpbnQga2dkYl9kZWFjdGl2YXRlX3N3X2JyZWFrcG9pbnRzKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwotCWludCBlcnJvciA9IDA7CisJaW50IGVycm9yOworCWludCByZXQgPSAwOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IEtHREJfTUFYX0JSRUFLUE9JTlRTOyBpKyspIHsKQEAgLTY5MSwxMyArNzAyLDE1IEBACiAJCWFkZHIgPSBrZ2RiX2JyZWFrW2ldLmJwdF9hZGRyOwogCQllcnJvciA9IGtnZGJfYXJjaF9yZW1vdmVfYnJlYWtwb2ludChhZGRyLAogCQkJCQlrZ2RiX2JyZWFrW2ldLnNhdmVkX2luc3RyKTsKLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIGVycm9yOworCQlpZiAoZXJyb3IpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIktHREI6IEJQIHJlbW92ZSBmYWlsZWQ6ICVseFxuIiwgYWRkcik7CisJCQlyZXQgPSBlcnJvcjsKKwkJfQogCiAJCWtnZGJfZmx1c2hfc3dicmVha19hZGRyKGFkZHIpOwogCQlrZ2RiX2JyZWFrW2ldLnN0YXRlID0gQlBfU0VUOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGtnZGJfcmVtb3ZlX3N3X2JyZWFrKHVuc2lnbmVkIGxvbmcgYWRkcikKQEAgLTEyMDQsOCArMTIxNywxMCBAQAogCQlyZXR1cm4gMTsKIAogCX0gZWxzZSB7Ci0JCWVycm9yX3BhY2tldChyZW1jb21fb3V0X2J1ZmZlciwgLUVJTlZBTCk7Ci0JCXJldHVybiAwOworCQlrZ2RiX21zZ193cml0ZSgiS0dEQiBvbmx5IGtub3dzIHNpZ25hbCA5IChwYXNzKSIKKwkJCSIgYW5kIDE1IChwYXNzIGFuZCBkaXNjb25uZWN0KVxuIgorCQkJIkV4ZWN1dGluZyBhIGNvbnRpbnVlIHdpdGhvdXQgc2lnbmFsIHBhc3NpbmdcbiIsIDApOworCQlyZW1jb21faW5fYnVmZmVyWzBdID0gJ2MnOwogCX0KIAogCS8qIEluZGljYXRlIGZhbGwgdGhyb3VnaCAqLwpAQCAtMTM5NSw2ICsxNDEwLDcgQEAKIAlzdHJ1Y3Qga2dkYl9zdGF0ZSBrZ2RiX3ZhcjsKIAlzdHJ1Y3Qga2dkYl9zdGF0ZSAqa3MgPSAma2dkYl92YXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3N0ZXBfdHJpZXMgPSAxMDA7CiAJaW50IGVycm9yID0gMDsKIAlpbnQgaSwgY3B1OwogCkBAIC0xNDI1LDEzICsxNDQxLDE0IEBACiAJCWNwdV9yZWxheCgpOwogCiAJLyoKLQkgKiBEbyBub3Qgc3RhcnQgdGhlIGRlYnVnZ2VyIGNvbm5lY3Rpb24gb24gdGhpcyBDUFUgaWYgdGhlIGxhc3QKLQkgKiBpbnN0YW5jZSBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgd2FudGVkIHRvIGNvbWUgaW50byB0aGUKLQkgKiBkZWJ1Z2dlciBvbiBhIGRpZmZlcmVudCBDUFUgdmlhIGEgc2luZ2xlIHN0ZXAKKwkgKiBGb3Igc2luZ2xlIHN0ZXBwaW5nLCB0cnkgdG8gb25seSBlbnRlciBvbiB0aGUgcHJvY2Vzc29yCisJICogdGhhdCB3YXMgc2luZ2xlIHN0ZXBwaW5nLiAgVG8gZ2F1cmQgYWdhaW5zdCBhIGRlYWRsb2NrLCB0aGUKKwkgKiBrZXJuZWwgd2lsbCBvbmx5IHRyeSBmb3IgdGhlIHZhbHVlIG9mIHNzdGVwX3RyaWVzIGJlZm9yZQorCSAqIGdpdmluZyB1cCBhbmQgY29udGludWluZyBvbi4KIAkgKi8KIAlpZiAoYXRvbWljX3JlYWQoJmtnZGJfY3B1X2RvaW5nX3NpbmdsZV9zdGVwKSAhPSAtMSAmJgotCSAgICBhdG9taWNfcmVhZCgma2dkYl9jcHVfZG9pbmdfc2luZ2xlX3N0ZXApICE9IGNwdSkgewotCisJICAgIChrZ2RiX2luZm9bY3B1XS50YXNrICYmCisJICAgICBrZ2RiX2luZm9bY3B1XS50YXNrLT5waWQgIT0ga2dkYl9zc3RlcF9waWQpICYmIC0tc3N0ZXBfdHJpZXMpIHsKIAkJYXRvbWljX3NldCgma2dkYl9hY3RpdmUsIC0xKTsKIAkJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwogCQljbG9ja3NvdXJjZV90b3VjaF93YXRjaGRvZygpOwpAQCAtMTUyNCw2ICsxNTQxLDEzIEBACiAJfQogCiBrZ2RiX3Jlc3RvcmU6CisJaWYgKGF0b21pY19yZWFkKCZrZ2RiX2NwdV9kb2luZ19zaW5nbGVfc3RlcCkgIT0gLTEpIHsKKwkJaW50IHNzdGVwX2NwdSA9IGF0b21pY19yZWFkKCZrZ2RiX2NwdV9kb2luZ19zaW5nbGVfc3RlcCk7CisJCWlmIChrZ2RiX2luZm9bc3N0ZXBfY3B1XS50YXNrKQorCQkJa2dkYl9zc3RlcF9waWQgPSBrZ2RiX2luZm9bc3N0ZXBfY3B1XS50YXNrLT5waWQ7CisJCWVsc2UKKwkJCWtnZGJfc3N0ZXBfcGlkID0gMDsKKwl9CiAJLyogRnJlZSBrZ2RiX2FjdGl2ZSAqLwogCWF0b21pY19zZXQoJmtnZGJfYWN0aXZlLCAtMSk7CiAJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tkZXAuYyBiL2tlcm5lbC9sb2NrZGVwLmMKaW5kZXggZjVkY2QzNi4uNGY4ZGYwMSAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tkZXAuYworKysgYi9rZXJuZWwvbG9ja2RlcC5jCkBAIC0xNjgsNyArMTY4LDcgQEAKIAlpZiAodGltZSA+IGx0LT5tYXgpCiAJCWx0LT5tYXggPSB0aW1lOwogCi0JaWYgKHRpbWUgPCBsdC0+bWluIHx8ICFsdC0+bWluKQorCWlmICh0aW1lIDwgbHQtPm1pbiB8fCAhbHQtPm5yKQogCQlsdC0+bWluID0gdGltZTsKIAogCWx0LT50b3RhbCArPSB0aW1lOwpAQCAtMTc3LDggKzE3NywxNSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgbG9ja190aW1lX2FkZChzdHJ1Y3QgbG9ja190aW1lICpzcmMsIHN0cnVjdCBsb2NrX3RpbWUgKmRzdCkKIHsKLQlkc3QtPm1pbiArPSBzcmMtPm1pbjsKLQlkc3QtPm1heCArPSBzcmMtPm1heDsKKwlpZiAoIXNyYy0+bnIpCisJCXJldHVybjsKKworCWlmIChzcmMtPm1heCA+IGRzdC0+bWF4KQorCQlkc3QtPm1heCA9IHNyYy0+bWF4OworCisJaWYgKHNyYy0+bWluIDwgZHN0LT5taW4gfHwgIWRzdC0+bnIpCisJCWRzdC0+bWluID0gc3JjLT5taW47CisKIAlkc3QtPnRvdGFsICs9IHNyYy0+dG90YWw7CiAJZHN0LT5uciArPSBzcmMtPm5yOwogfQpAQCAtMzc5LDcgKzM4Niw4IEBACiAJICogY29tcGxldGUgdHJhY2UgdGhhdCBtYXhlcyBvdXQgdGhlIGVudHJpZXMgcHJvdmlkZWQgd2lsbCBiZSByZXBvcnRlZAogCSAqIGFzIGluY29tcGxldGUsIGZyaWdnaW4gdXNlbGVzcyA8L3JhbnQ+CiAJICovCi0JaWYgKHRyYWNlLT5lbnRyaWVzW3RyYWNlLT5ucl9lbnRyaWVzLTFdID09IFVMT05HX01BWCkKKwlpZiAodHJhY2UtPm5yX2VudHJpZXMgIT0gMCAmJgorCSAgICB0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcy0xXSA9PSBVTE9OR19NQVgpCiAJCXRyYWNlLT5ucl9lbnRyaWVzLS07CiAKIAl0cmFjZS0+bWF4X2VudHJpZXMgPSB0cmFjZS0+bnJfZW50cmllczsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wZXJmX2V2ZW50LmMgYi9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IDQwYTk5NmUuLmU3M2U1M2MgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIva2VybmVsL3BlcmZfZXZlbnQuYwpAQCAtMzYsNyArMzYsNyBAQAogLyoKICAqIEVhY2ggQ1BVIGhhcyBhIGxpc3Qgb2YgcGVyIENQVSBldmVudHM6CiAgKi8KLURFRklORV9QRVJfQ1BVKHN0cnVjdCBwZXJmX2NwdV9jb250ZXh0LCBwZXJmX2NwdV9jb250ZXh0KTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCwgcGVyZl9jcHVfY29udGV4dCk7CiAKIGludCBwZXJmX21heF9ldmVudHMgX19yZWFkX21vc3RseSA9IDE7CiBzdGF0aWMgaW50IHBlcmZfcmVzZXJ2ZWRfcGVyY3B1IF9fcmVhZF9tb3N0bHk7CkBAIC01NjcsNyArNTY3LDcgQEAKICAqIGlzIHRoZSBjdXJyZW50IGNvbnRleHQgb24gdGhpcyBDUFUgYW5kIHByZWVtcHRpb24gaXMgZGlzYWJsZWQsCiAgKiBoZW5jZSB3ZSBjYW4ndCBnZXQgaW50byBwZXJmX2V2ZW50X3Rhc2tfc2NoZWRfb3V0IGZvciB0aGlzIGNvbnRleHQuCiAgKi8KLXN0YXRpYyB2b2lkIHBlcmZfZXZlbnRfZGlzYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit2b2lkIHBlcmZfZXZlbnRfZGlzYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4ID0gZXZlbnQtPmN0eDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBjdHgtPnRhc2s7CkBAIC05NzEsNyArOTcxLDcgQEAKICAqIHBlcmZfZXZlbnRfZm9yX2VhY2hfY2hpbGQgb3IgcGVyZl9ldmVudF9mb3JfZWFjaCBhcyBkZXNjcmliZWQKICAqIGZvciBwZXJmX2V2ZW50X2Rpc2FibGUuCiAgKi8KLXN0YXRpYyB2b2lkIHBlcmZfZXZlbnRfZW5hYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3ZvaWQgcGVyZl9ldmVudF9lbmFibGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewogCXN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCA9IGV2ZW50LT5jdHg7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gY3R4LT50YXNrOwpAQCAtMTU3OSw3ICsxNTc5LDYgQEAKIF9fcGVyZl9ldmVudF9pbml0X2NvbnRleHQoc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4LAogCQkJICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQltZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpOwogCXNwaW5fbG9ja19pbml0KCZjdHgtPmxvY2spOwogCW11dGV4X2luaXQoJmN0eC0+bXV0ZXgpOwogCUlOSVRfTElTVF9IRUFEKCZjdHgtPmdyb3VwX2xpc3QpOwpAQCAtMTY1NCw3ICsxNjUzLDcgQEAKIAl9CiAKIAlpZiAoIWN0eCkgewotCQljdHggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0KSwgR0ZQX0tFUk5FTCk7CisJCWN0eCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQpLCBHRlBfS0VSTkVMKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJaWYgKCFjdHgpCiAJCQlnb3RvIGVycm91dDsKQEAgLTQwMTEsNiArNDAxMCw3IEBACiAJZXZlbnQtPnBtdS0+cmVhZChldmVudCk7CiAKIAlkYXRhLmFkZHIgPSAwOworCWRhdGEucmF3ID0gTlVMTDsKIAlkYXRhLnBlcmlvZCA9IGV2ZW50LT5ody5sYXN0X3BlcmlvZDsKIAlyZWdzID0gZ2V0X2lycV9yZWdzKCk7CiAJLyoKQEAgLTQwODAsOCArNDA4MCw3IEBACiAJdTY0IG5vdzsKIAogCW5vdyA9IGNwdV9jbG9jayhjcHUpOwotCXByZXYgPSBhdG9taWM2NF9yZWFkKCZldmVudC0+aHcucHJldl9jb3VudCk7Ci0JYXRvbWljNjRfc2V0KCZldmVudC0+aHcucHJldl9jb3VudCwgbm93KTsKKwlwcmV2ID0gYXRvbWljNjRfeGNoZygmZXZlbnQtPmh3LnByZXZfY291bnQsIG5vdyk7CiAJYXRvbWljNjRfYWRkKG5vdyAtIHByZXYsICZldmVudC0+Y291bnQpOwogfQogCkBAIC00Mjg2LDE1ICs0Mjg1LDggQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcG11ICpicF9wZXJmX2V2ZW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnQgKmJwKQogewogCWludCBlcnI7Ci0JLyoKLQkgKiBUaGUgYnJlYWtwb2ludCBpcyBhbHJlYWR5IGZpbGxlZCBpZiB3ZSBoYXZlbid0IGNyZWF0ZWQgdGhlIGNvdW50ZXIKLQkgKiB0aHJvdWdoIHBlcmYgc3lzY2FsbAotCSAqIEZJWE1FOiBtYW5hZ2UgdG8gZ2V0IHRyaWdlcnJlZCB0byBOVUxMIGlmIGl0IGNvbWVzIGZyb20gc3lzY2FsbHMKLQkgKi8KLQlpZiAoIWJwLT5jYWxsYmFjaykKLQkJZXJyID0gcmVnaXN0ZXJfcGVyZl9od19icmVha3BvaW50KGJwKTsKLQllbHNlCi0JCWVyciA9IF9fcmVnaXN0ZXJfcGVyZl9od19icmVha3BvaW50KGJwKTsKKworCWVyciA9IHJlZ2lzdGVyX3BlcmZfaHdfYnJlYWtwb2ludChicCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIApAQCAtNDMwOCw2ICs0MzAwLDcgQEAKIAlzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSBzYW1wbGU7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBkYXRhOwogCisJc2FtcGxlLnJhdyA9IE5VTEw7CiAJc2FtcGxlLmFkZHIgPSBicC0+YXR0ci5icF9hZGRyOwogCiAJaWYgKCFwZXJmX2V4Y2x1ZGVfZXZlbnQoYnAsIHJlZ3MpKQpAQCAtNDM5MCw3ICs0MzgzLDcgQEAKIAkJICAgc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4LAogCQkgICBzdHJ1Y3QgcGVyZl9ldmVudCAqZ3JvdXBfbGVhZGVyLAogCQkgICBzdHJ1Y3QgcGVyZl9ldmVudCAqcGFyZW50X2V2ZW50LAotCQkgICBwZXJmX2NhbGxiYWNrX3QgY2FsbGJhY2ssCisJCSAgIHBlcmZfb3ZlcmZsb3dfaGFuZGxlcl90IG92ZXJmbG93X2hhbmRsZXIsCiAJCSAgIGdmcF90IGdmcGZsYWdzKQogewogCWNvbnN0IHN0cnVjdCBwbXUgKnBtdTsKQEAgLTQ0MzMsMTAgKzQ0MjYsMTAgQEAKIAogCWV2ZW50LT5zdGF0ZQkJPSBQRVJGX0VWRU5UX1NUQVRFX0lOQUNUSVZFOwogCi0JaWYgKCFjYWxsYmFjayAmJiBwYXJlbnRfZXZlbnQpCi0JCWNhbGxiYWNrID0gcGFyZW50X2V2ZW50LT5jYWxsYmFjazsKKwlpZiAoIW92ZXJmbG93X2hhbmRsZXIgJiYgcGFyZW50X2V2ZW50KQorCQlvdmVyZmxvd19oYW5kbGVyID0gcGFyZW50X2V2ZW50LT5vdmVyZmxvd19oYW5kbGVyOwogCQotCWV2ZW50LT5jYWxsYmFjawk9IGNhbGxiYWNrOworCWV2ZW50LT5vdmVyZmxvd19oYW5kbGVyCT0gb3ZlcmZsb3dfaGFuZGxlcjsKIAogCWlmIChhdHRyLT5kaXNhYmxlZCkKIAkJZXZlbnQtPnN0YXRlID0gUEVSRl9FVkVOVF9TVEFURV9PRkY7CkBAIC00Nzc2LDcgKzQ3NjksOCBAQAogICovCiBzdHJ1Y3QgcGVyZl9ldmVudCAqCiBwZXJmX2V2ZW50X2NyZWF0ZV9rZXJuZWxfY291bnRlcihzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLCBpbnQgY3B1LAotCQkJCSBwaWRfdCBwaWQsIHBlcmZfY2FsbGJhY2tfdCBjYWxsYmFjaykKKwkJCQkgcGlkX3QgcGlkLAorCQkJCSBwZXJmX292ZXJmbG93X2hhbmRsZXJfdCBvdmVyZmxvd19oYW5kbGVyKQogewogCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudDsKIAlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHg7CkBAIC00NzkzLDcgKzQ3ODcsNyBAQAogCX0KIAogCWV2ZW50ID0gcGVyZl9ldmVudF9hbGxvYyhhdHRyLCBjcHUsIGN0eCwgTlVMTCwKLQkJCQkgICAgIE5VTEwsIGNhbGxiYWNrLCBHRlBfS0VSTkVMKTsKKwkJCQkgTlVMTCwgb3ZlcmZsb3dfaGFuZGxlciwgR0ZQX0tFUk5FTCk7CiAJaWYgKElTX0VSUihldmVudCkpIHsKIAkJZXJyID0gUFRSX0VSUihldmVudCk7CiAJCWdvdG8gZXJyX3B1dF9jb250ZXh0OwpAQCAtNTA5MCw3ICs1MDg0LDcgQEAKICAqLwogaW50IHBlcmZfZXZlbnRfaW5pdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCiB7Ci0Jc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY2hpbGRfY3R4LCAqcGFyZW50X2N0eDsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjaGlsZF9jdHggPSBOVUxMLCAqcGFyZW50X2N0eDsKIAlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjbG9uZWRfY3R4OwogCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBhcmVudCA9IGN1cnJlbnQ7CkBAIC01MTA2LDIwICs1MTAwLDYgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKgotCSAqIFRoaXMgaXMgZXhlY3V0ZWQgZnJvbSB0aGUgcGFyZW50IHRhc2sgY29udGV4dCwgc28gaW5oZXJpdAotCSAqIGV2ZW50cyB0aGF0IGhhdmUgYmVlbiBtYXJrZWQgZm9yIGNsb25pbmcuCi0JICogRmlyc3QgYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBjb250ZXh0IGZvciB0aGUgY2hpbGQuCi0JICovCi0KLQljaGlsZF9jdHggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjaGlsZF9jdHgpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JX19wZXJmX2V2ZW50X2luaXRfY29udGV4dChjaGlsZF9jdHgsIGNoaWxkKTsKLQljaGlsZC0+cGVyZl9ldmVudF9jdHhwID0gY2hpbGRfY3R4OwotCWdldF90YXNrX3N0cnVjdChjaGlsZCk7Ci0KLQkvKgogCSAqIElmIHRoZSBwYXJlbnQncyBjb250ZXh0IGlzIGEgY2xvbmUsIHBpbiBpdCBzbyBpdCB3b24ndCBnZXQKIAkgKiBzd2FwcGVkIHVuZGVyIHVzLgogCSAqLwpAQCAtNTE0OSw2ICs1MTI5LDI2IEBACiAJCQljb250aW51ZTsKIAkJfQogCisJCWlmICghY2hpbGQtPnBlcmZfZXZlbnRfY3R4cCkgeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgZXhlY3V0ZWQgZnJvbSB0aGUgcGFyZW50IHRhc2sgY29udGV4dCwgc28KKwkJCSAqIGluaGVyaXQgZXZlbnRzIHRoYXQgaGF2ZSBiZWVuIG1hcmtlZCBmb3IgY2xvbmluZy4KKwkJCSAqIEZpcnN0IGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgY29udGV4dCBmb3IgdGhlCisJCQkgKiBjaGlsZC4KKwkJCSAqLworCisJCQljaGlsZF9jdHggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0KSwKKwkJCQkJICAgIEdGUF9LRVJORUwpOworCQkJaWYgKCFjaGlsZF9jdHgpIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKworCQkJX19wZXJmX2V2ZW50X2luaXRfY29udGV4dChjaGlsZF9jdHgsIGNoaWxkKTsKKwkJCWNoaWxkLT5wZXJmX2V2ZW50X2N0eHAgPSBjaGlsZF9jdHg7CisJCQlnZXRfdGFza19zdHJ1Y3QoY2hpbGQpOworCQl9CisKIAkJcmV0ID0gaW5oZXJpdF9ncm91cChldmVudCwgcGFyZW50LCBwYXJlbnRfY3R4LAogCQkJCQkgICAgIGNoaWxkLCBjaGlsZF9jdHgpOwogCQlpZiAocmV0KSB7CkBAIC01MTc3LDYgKzUxNzcsNyBAQAogCQlnZXRfY3R4KGNoaWxkX2N0eC0+cGFyZW50X2N0eCk7CiAJfQogCitleGl0OgogCW11dGV4X3VubG9jaygmcGFyZW50X2N0eC0+bXV0ZXgpOwogCiAJcGVyZl91bnBpbl9jb250ZXh0KHBhcmVudF9jdHgpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Jlc291cmNlLmMgYi9rZXJuZWwvcmVzb3VyY2UuYwppbmRleCBmYjExYTU4Li5kYzE1Njg2IDEwMDY0NAotLS0gYS9rZXJuZWwvcmVzb3VyY2UuYworKysgYi9rZXJuZWwvcmVzb3VyY2UuYwpAQCAtMzA4LDM1ICszMDgsMzcgQEAKIAkJCSB2b2lkICphbGlnbmZfZGF0YSkKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnRoaXMgPSByb290LT5jaGlsZDsKKwlyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIGVuZDsKIAotCW5ldy0+c3RhcnQgPSByb290LT5zdGFydDsKKwlzdGFydCA9IHJvb3QtPnN0YXJ0OwogCS8qCiAJICogU2tpcCBwYXN0IGFuIGFsbG9jYXRlZCByZXNvdXJjZSB0aGF0IHN0YXJ0cyBhdCAwLCBzaW5jZSB0aGUgYXNzaWdubWVudAogCSAqIG9mIHRoaXMtPnN0YXJ0IC0gMSB0byBuZXctPmVuZCBiZWxvdyB3b3VsZCBjYXVzZSBhbiB1bmRlcmZsb3cuCiAJICovCiAJaWYgKHRoaXMgJiYgdGhpcy0+c3RhcnQgPT0gMCkgewotCQluZXctPnN0YXJ0ID0gdGhpcy0+ZW5kICsgMTsKKwkJc3RhcnQgPSB0aGlzLT5lbmQgKyAxOwogCQl0aGlzID0gdGhpcy0+c2libGluZzsKIAl9CiAJZm9yKDs7KSB7CiAJCWlmICh0aGlzKQotCQkJbmV3LT5lbmQgPSB0aGlzLT5zdGFydCAtIDE7CisJCQllbmQgPSB0aGlzLT5zdGFydCAtIDE7CiAJCWVsc2UKLQkJCW5ldy0+ZW5kID0gcm9vdC0+ZW5kOwotCQlpZiAobmV3LT5zdGFydCA8IG1pbikKLQkJCW5ldy0+c3RhcnQgPSBtaW47Ci0JCWlmIChuZXctPmVuZCA+IG1heCkKLQkJCW5ldy0+ZW5kID0gbWF4OwotCQluZXctPnN0YXJ0ID0gQUxJR04obmV3LT5zdGFydCwgYWxpZ24pOworCQkJZW5kID0gcm9vdC0+ZW5kOworCQlpZiAoc3RhcnQgPCBtaW4pCisJCQlzdGFydCA9IG1pbjsKKwkJaWYgKGVuZCA+IG1heCkKKwkJCWVuZCA9IG1heDsKKwkJc3RhcnQgPSBBTElHTihzdGFydCwgYWxpZ24pOwogCQlpZiAoYWxpZ25mKQogCQkJYWxpZ25mKGFsaWduZl9kYXRhLCBuZXcsIHNpemUsIGFsaWduKTsKLQkJaWYgKG5ldy0+c3RhcnQgPCBuZXctPmVuZCAmJiBuZXctPmVuZCAtIG5ldy0+c3RhcnQgPj0gc2l6ZSAtIDEpIHsKLQkJCW5ldy0+ZW5kID0gbmV3LT5zdGFydCArIHNpemUgLSAxOworCQlpZiAoc3RhcnQgPCBlbmQgJiYgZW5kIC0gc3RhcnQgPj0gc2l6ZSAtIDEpIHsKKwkJCW5ldy0+c3RhcnQgPSBzdGFydDsKKwkJCW5ldy0+ZW5kID0gc3RhcnQgKyBzaXplIC0gMTsKIAkJCXJldHVybiAwOwogCQl9CiAJCWlmICghdGhpcykKIAkJCWJyZWFrOwotCQluZXctPnN0YXJ0ID0gdGhpcy0+ZW5kICsgMTsKKwkJc3RhcnQgPSB0aGlzLT5lbmQgKyAxOwogCQl0aGlzID0gdGhpcy0+c2libGluZzsKIAl9CiAJcmV0dXJuIC1FQlVTWTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpbWVyX2xpc3QuYyBiL2tlcm5lbC90aW1lL3RpbWVyX2xpc3QuYwppbmRleCA2NjVjNzZlLi45ZDgwZGI0IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aW1lcl9saXN0LmMKKysrIGIva2VybmVsL3RpbWUvdGltZXJfbGlzdC5jCkBAIC0xNTAsNiArMTUwLDkgQEAKIAlQX25zKGV4cGlyZXNfbmV4dCk7CiAJUChocmVzX2FjdGl2ZSk7CiAJUChucl9ldmVudHMpOworCVAobnJfcmV0cmllcyk7CisJUChucl9oYW5ncyk7CisJUF9ucyhtYXhfaGFuZ190aW1lKTsKICNlbmRpZgogI3VuZGVmIFAKICN1bmRlZiBQX25zCkBAIC0yNTQsNyArMjU3LDcgQEAKIAl1NjQgbm93ID0ga3RpbWVfdG9fbnMoa3RpbWVfZ2V0KCkpOwogCWludCBjcHU7CiAKLQlTRVFfcHJpbnRmKG0sICJUaW1lciBMaXN0IFZlcnNpb246IHYwLjRcbiIpOworCVNFUV9wcmludGYobSwgIlRpbWVyIExpc3QgVmVyc2lvbjogdjAuNVxuIik7CiAJU0VRX3ByaW50ZihtLCAiSFJUSU1FUl9NQVhfQ0xPQ0tfQkFTRVM6ICVkXG4iLCBIUlRJTUVSX01BWF9DTE9DS19CQVNFUyk7CiAJU0VRX3ByaW50ZihtLCAibm93IGF0ICVMZCBuc2Vjc1xuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylub3cpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2UuYyBiL2tlcm5lbC90cmFjZS90cmFjZS5jCmluZGV4IDg3NGYyODkuLjg4YmQ5YWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZS5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZS5jCkBAIC0xMzYxLDExICsxMzYxLDcgQEAKIAlwYXVzZV9ncmFwaF90cmFjaW5nKCk7CiAJcmF3X2xvY2FsX2lycV9zYXZlKGlycV9mbGFncyk7CiAJX19yYXdfc3Bpbl9sb2NrKCZ0cmFjZV9idWZfbG9jayk7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkgewotCQlzdHJuY3B5KHRyYWNlX2J1ZiwgZm10LCBUUkFDRV9CVUZfU0laRSk7Ci0JCWxlbiA9IHN0cmxlbih0cmFjZV9idWYpOwotCX0gZWxzZQotCQlsZW4gPSB2c25wcmludGYodHJhY2VfYnVmLCBUUkFDRV9CVUZfU0laRSwgZm10LCBhcmdzKTsKKwlsZW4gPSB2c25wcmludGYodHJhY2VfYnVmLCBUUkFDRV9CVUZfU0laRSwgZm10LCBhcmdzKTsKIAogCXNpemUgPSBzaXplb2YoKmVudHJ5KSArIGxlbiArIDE7CiAJYnVmZmVyID0gdHItPmJ1ZmZlcjsKQEAgLTE1MTYsNiArMTUxMiw4IEBACiAJaW50IGkgPSAoaW50KSpwb3M7CiAJdm9pZCAqZW50OwogCisJV0FSTl9PTl9PTkNFKGl0ZXItPmxlZnRvdmVyKTsKKwogCSgqcG9zKSsrOwogCiAJLyogY2FuJ3QgZ28gYmFja3dhcmRzICovCkBAIC0xNjE0LDggKzE2MTIsMTYgQEAKIAkJCTsKIAogCX0gZWxzZSB7Ci0JCWwgPSAqcG9zIC0gMTsKLQkJcCA9IHNfbmV4dChtLCBwLCAmbCk7CisJCS8qCisJCSAqIElmIHdlIG92ZXJmbG93ZWQgdGhlIHNlcV9maWxlIGJlZm9yZSwgdGhlbiB3ZSB3YW50CisJCSAqIHRvIGp1c3QgcmV1c2UgdGhlIHRyYWNlX3NlcSBidWZmZXIgYWdhaW4uCisJCSAqLworCQlpZiAoaXRlci0+bGVmdG92ZXIpCisJCQlwID0gaXRlcjsKKwkJZWxzZSB7CisJCQlsID0gKnBvcyAtIDE7CisJCQlwID0gc19uZXh0KG0sIHAsICZsKTsKKwkJfQogCX0KIAogCXRyYWNlX2V2ZW50X3JlYWRfbG9jaygpOwpAQCAtMTkyMyw2ICsxOTI5LDcgQEAKIHN0YXRpYyBpbnQgc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIgPSB2OworCWludCByZXQ7CiAKIAlpZiAoaXRlci0+ZW50ID09IE5VTEwpIHsKIAkJaWYgKGl0ZXItPnRyKSB7CkBAIC0xOTQyLDkgKzE5NDksMjcgQEAKIAkJCWlmICghKHRyYWNlX2ZsYWdzICYgVFJBQ0VfSVRFUl9WRVJCT1NFKSkKIAkJCQlwcmludF9mdW5jX2hlbHBfaGVhZGVyKG0pOwogCQl9CisJfSBlbHNlIGlmIChpdGVyLT5sZWZ0b3ZlcikgeworCQkvKgorCQkgKiBJZiB3ZSBmaWxsZWQgdGhlIHNlcV9maWxlIGJ1ZmZlciBlYXJsaWVyLCB3ZQorCQkgKiB3YW50IHRvIGp1c3Qgc2hvdyBpdCBub3cuCisJCSAqLworCQlyZXQgPSB0cmFjZV9wcmludF9zZXEobSwgJml0ZXItPnNlcSk7CisKKwkJLyogcmV0IHNob3VsZCB0aGlzIHRpbWUgYmUgemVybywgYnV0IHlvdSBuZXZlciBrbm93ICovCisJCWl0ZXItPmxlZnRvdmVyID0gcmV0OworCiAJfSBlbHNlIHsKIAkJcHJpbnRfdHJhY2VfbGluZShpdGVyKTsKLQkJdHJhY2VfcHJpbnRfc2VxKG0sICZpdGVyLT5zZXEpOworCQlyZXQgPSB0cmFjZV9wcmludF9zZXEobSwgJml0ZXItPnNlcSk7CisJCS8qCisJCSAqIElmIHdlIG92ZXJmbG93IHRoZSBzZXFfZmlsZSBidWZmZXIsIHRoZW4gaXQgd2lsbAorCQkgKiBhc2sgdXMgZm9yIHRoaXMgZGF0YSBhZ2FpbiBhdCBzdGFydCB1cC4KKwkJICogVXNlIHRoYXQgaW5zdGVhZC4KKwkJICogIHJldCBpcyAwIGlmIHNlcV9maWxlIHdyaXRlIHN1Y2NlZWRlZC4KKwkJICogICAgICAgIC0xIG90aGVyd2lzZS4KKwkJICovCisJCWl0ZXItPmxlZnRvdmVyID0gcmV0OwogCX0KIAogCXJldHVybiAwOwpAQCAtMjg5OCw2ICsyOTIzLDEwIEBACiAJZWxzZQogCQljcHVtYXNrX2NsZWFyX2NwdShpdGVyLT5jcHVfZmlsZSwgdHJhY2luZ19yZWFkZXJfY3B1bWFzayk7CiAKKworCWlmIChpdGVyLT50cmFjZS0+cGlwZV9jbG9zZSkKKwkJaXRlci0+dHJhY2UtPnBpcGVfY2xvc2UoaXRlcik7CisKIAltdXRleF91bmxvY2soJnRyYWNlX3R5cGVzX2xvY2spOwogCiAJZnJlZV9jcHVtYXNrX3ZhcihpdGVyLT5zdGFydGVkKTsKQEAgLTMzMjAsNiArMzM0OSwxNiBAQAogCXJldHVybiBjbnQ7CiB9CiAKK3N0YXRpYyBpbnQgbWFya19wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJaW50IHJldDsKKwl2YV9saXN0IGFyZ3M7CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlyZXQgPSB0cmFjZV92cHJpbnRrKDAsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90CiB0cmFjaW5nX21hcmtfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICp1YnVmLAogCQkJCQlzaXplX3QgY250LCBsb2ZmX3QgKmZwb3MpCkBAIC0zMzQ2LDcgKzMzODUsNyBAQAogCX0gZWxzZQogCQlidWZbY250XSA9ICdcMCc7CiAKLQljbnQgPSB0cmFjZV92cHJpbnRrKDAsIGJ1ZiwgTlVMTCk7CisJY250ID0gbWFya19wcmludGsoIiVzIiwgYnVmKTsKIAlrZnJlZShidWYpOwogCSpmcG9zICs9IGNudDsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlLmggYi9rZXJuZWwvdHJhY2UvdHJhY2UuaAppbmRleCAxZDdmNDgzLi43ZmEzM2NhIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2UuaAorKysgYi9rZXJuZWwvdHJhY2UvdHJhY2UuaApAQCAtMjcyLDYgKzI3Miw3IEBACiAgKiBAcGlwZV9vcGVuOiBjYWxsZWQgd2hlbiB0aGUgdHJhY2VfcGlwZSBmaWxlIGlzIG9wZW5lZAogICogQHdhaXRfcGlwZTogb3ZlcnJpZGUgaG93IHRoZSB1c2VyIHdhaXRzIGZvciB0cmFjZXMgb24gdHJhY2VfcGlwZQogICogQGNsb3NlOiBjYWxsZWQgd2hlbiB0aGUgdHJhY2UgZmlsZSBpcyByZWxlYXNlZAorICogQHBpcGVfY2xvc2U6IGNhbGxlZCB3aGVuIHRoZSB0cmFjZV9waXBlIGZpbGUgaXMgcmVsZWFzZWQKICAqIEByZWFkOiBvdmVycmlkZSB0aGUgZGVmYXVsdCByZWFkIGNhbGxiYWNrIG9uIHRyYWNlX3BpcGUKICAqIEBzcGxpY2VfcmVhZDogb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc3BsaWNlX3JlYWQgY2FsbGJhY2sgb24gdHJhY2VfcGlwZQogICogQHNlbGZ0ZXN0OiBzZWxmdGVzdCB0byBydW4gb24gYm9vdCAoc2VlIHRyYWNlX3NlbGZ0ZXN0LmMpCkBAIC0yOTAsNiArMjkxLDcgQEAKIAl2b2lkCQkJKCpwaXBlX29wZW4pKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcik7CiAJdm9pZAkJCSgqd2FpdF9waXBlKShzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpOwogCXZvaWQJCQkoKmNsb3NlKShzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpOworCXZvaWQJCQkoKnBpcGVfY2xvc2UpKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcik7CiAJc3NpemVfdAkJCSgqcmVhZCkoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyLAogCQkJCQlzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsCiAJCQkJCXNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zX2dyYXBoLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zX2dyYXBoLmMKaW5kZXggNDVlNmMwMS4uYTQzZDAwOSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2Z1bmN0aW9uc19ncmFwaC5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9mdW5jdGlvbnNfZ3JhcGguYwpAQCAtMTQsOSArMTQsMjAgQEAKICNpbmNsdWRlICJ0cmFjZS5oIgogI2luY2x1ZGUgInRyYWNlX291dHB1dC5oIgogCi1zdHJ1Y3QgZmdyYXBoX2RhdGEgeworc3RydWN0IGZncmFwaF9jcHVfZGF0YSB7CiAJcGlkX3QJCWxhc3RfcGlkOwogCWludAkJZGVwdGg7CisJaW50CQlpZ25vcmU7Cit9OworCitzdHJ1Y3QgZmdyYXBoX2RhdGEgeworCXN0cnVjdCBmZ3JhcGhfY3B1X2RhdGEJCSpjcHVfZGF0YTsKKworCS8qIFBsYWNlIHRvIHByZXNlcnZlIGxhc3QgcHJvY2Vzc2VkIGVudHJ5LiAqLworCXN0cnVjdCBmdHJhY2VfZ3JhcGhfZW50X2VudHJ5CWVudDsKKwlzdHJ1Y3QgZnRyYWNlX2dyYXBoX3JldF9lbnRyeQlyZXQ7CisJaW50CQkJCWZhaWxlZDsKKwlpbnQJCQkJY3B1OwogfTsKIAogI2RlZmluZSBUUkFDRV9HUkFQSF9JTkRFTlQJMgpAQCAtMzg0LDcgKzM5NSw3IEBACiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gVFJBQ0VfVFlQRV9IQU5ETEVEOwogCi0JbGFzdF9waWQgPSAmKHBlcl9jcHVfcHRyKGRhdGEsIGNwdSktPmxhc3RfcGlkKTsKKwlsYXN0X3BpZCA9ICYocGVyX2NwdV9wdHIoZGF0YS0+Y3B1X2RhdGEsIGNwdSktPmxhc3RfcGlkKTsKIAogCWlmICgqbGFzdF9waWQgPT0gcGlkKQogCQlyZXR1cm4gVFJBQ0VfVFlQRV9IQU5ETEVEOwpAQCAtNDM1LDI3ICs0NDYsNTAgQEAKIGdldF9yZXR1cm5fZm9yX2xlYWYoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyLAogCQlzdHJ1Y3QgZnRyYWNlX2dyYXBoX2VudF9lbnRyeSAqY3VycikKIHsKLQlzdHJ1Y3QgcmluZ19idWZmZXJfaXRlciAqcmluZ19pdGVyOworCXN0cnVjdCBmZ3JhcGhfZGF0YSAqZGF0YSA9IGl0ZXItPnByaXZhdGU7CisJc3RydWN0IHJpbmdfYnVmZmVyX2l0ZXIgKnJpbmdfaXRlciA9IE5VTEw7CiAJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKIAlzdHJ1Y3QgZnRyYWNlX2dyYXBoX3JldF9lbnRyeSAqbmV4dDsKIAotCXJpbmdfaXRlciA9IGl0ZXItPmJ1ZmZlcl9pdGVyW2l0ZXItPmNwdV07CisJLyoKKwkgKiBJZiB0aGUgcHJldmlvdXMgb3V0cHV0IGZhaWxlZCB0byB3cml0ZSB0byB0aGUgc2VxIGJ1ZmZlciwKKwkgKiB0aGVuIHdlIGp1c3QgcmV1c2UgdGhlIGRhdGEgZnJvbSBiZWZvcmUuCisJICovCisJaWYgKGRhdGEgJiYgZGF0YS0+ZmFpbGVkKSB7CisJCWN1cnIgPSAmZGF0YS0+ZW50OworCQluZXh0ID0gJmRhdGEtPnJldDsKKwl9IGVsc2UgewogCi0JLyogRmlyc3QgcGVlayB0byBjb21wYXJlIGN1cnJlbnQgZW50cnkgYW5kIHRoZSBuZXh0IG9uZSAqLwotCWlmIChyaW5nX2l0ZXIpCi0JCWV2ZW50ID0gcmluZ19idWZmZXJfaXRlcl9wZWVrKHJpbmdfaXRlciwgTlVMTCk7Ci0JZWxzZSB7Ci0JLyogV2UgbmVlZCB0byBjb25zdW1lIHRoZSBjdXJyZW50IGVudHJ5IHRvIHNlZSB0aGUgbmV4dCBvbmUgKi8KLQkJcmluZ19idWZmZXJfY29uc3VtZShpdGVyLT50ci0+YnVmZmVyLCBpdGVyLT5jcHUsIE5VTEwpOwotCQlldmVudCA9IHJpbmdfYnVmZmVyX3BlZWsoaXRlci0+dHItPmJ1ZmZlciwgaXRlci0+Y3B1LAotCQkJCQlOVUxMKTsKKwkJcmluZ19pdGVyID0gaXRlci0+YnVmZmVyX2l0ZXJbaXRlci0+Y3B1XTsKKworCQkvKiBGaXJzdCBwZWVrIHRvIGNvbXBhcmUgY3VycmVudCBlbnRyeSBhbmQgdGhlIG5leHQgb25lICovCisJCWlmIChyaW5nX2l0ZXIpCisJCQlldmVudCA9IHJpbmdfYnVmZmVyX2l0ZXJfcGVlayhyaW5nX2l0ZXIsIE5VTEwpOworCQllbHNlIHsKKwkJCS8qCisJCQkgKiBXZSBuZWVkIHRvIGNvbnN1bWUgdGhlIGN1cnJlbnQgZW50cnkgdG8gc2VlCisJCQkgKiB0aGUgbmV4dCBvbmUuCisJCQkgKi8KKwkJCXJpbmdfYnVmZmVyX2NvbnN1bWUoaXRlci0+dHItPmJ1ZmZlciwgaXRlci0+Y3B1LCBOVUxMKTsKKwkJCWV2ZW50ID0gcmluZ19idWZmZXJfcGVlayhpdGVyLT50ci0+YnVmZmVyLCBpdGVyLT5jcHUsCisJCQkJCQkgTlVMTCk7CisJCX0KKworCQlpZiAoIWV2ZW50KQorCQkJcmV0dXJuIE5VTEw7CisKKwkJbmV4dCA9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOworCisJCWlmIChkYXRhKSB7CisJCQkvKgorCQkJICogU2F2ZSBjdXJyZW50IGFuZCBuZXh0IGVudHJpZXMgZm9yIGxhdGVyIHJlZmVyZW5jZQorCQkJICogaWYgdGhlIG91dHB1dCBmYWlscy4KKwkJCSAqLworCQkJZGF0YS0+ZW50ID0gKmN1cnI7CisJCQlkYXRhLT5yZXQgPSAqbmV4dDsKKwkJfQogCX0KIAotCWlmICghZXZlbnQpCi0JCXJldHVybiBOVUxMOwotCi0JbmV4dCA9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOwotCiAJaWYgKG5leHQtPmVudC50eXBlICE9IFRSQUNFX0dSQVBIX1JFVCkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTY0MCw3ICs2NzQsNyBAQAogCiAJaWYgKGRhdGEpIHsKIAkJaW50IGNwdSA9IGl0ZXItPmNwdTsKLQkJaW50ICpkZXB0aCA9ICYocGVyX2NwdV9wdHIoZGF0YSwgY3B1KS0+ZGVwdGgpOworCQlpbnQgKmRlcHRoID0gJihwZXJfY3B1X3B0cihkYXRhLT5jcHVfZGF0YSwgY3B1KS0+ZGVwdGgpOwogCiAJCS8qCiAJCSAqIENvbW1lbnRzIGRpc3BsYXkgYXQgKyAxIHRvIGRlcHRoLiBTaW5jZQpAQCAtNjg4LDcgKzcyMiw3IEBACiAKIAlpZiAoZGF0YSkgewogCQlpbnQgY3B1ID0gaXRlci0+Y3B1OwotCQlpbnQgKmRlcHRoID0gJihwZXJfY3B1X3B0cihkYXRhLCBjcHUpLT5kZXB0aCk7CisJCWludCAqZGVwdGggPSAmKHBlcl9jcHVfcHRyKGRhdGEtPmNwdV9kYXRhLCBjcHUpLT5kZXB0aCk7CiAKIAkJKmRlcHRoID0gY2FsbC0+ZGVwdGg7CiAJfQpAQCAtNzgyLDE5ICs4MTYsMzQgQEAKIHByaW50X2dyYXBoX2VudHJ5KHN0cnVjdCBmdHJhY2VfZ3JhcGhfZW50X2VudHJ5ICpmaWVsZCwgc3RydWN0IHRyYWNlX3NlcSAqcywKIAkJCXN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcikKIHsKLQlpbnQgY3B1ID0gaXRlci0+Y3B1OworCXN0cnVjdCBmZ3JhcGhfZGF0YSAqZGF0YSA9IGl0ZXItPnByaXZhdGU7CiAJc3RydWN0IGZ0cmFjZV9ncmFwaF9lbnQgKmNhbGwgPSAmZmllbGQtPmdyYXBoX2VudDsKIAlzdHJ1Y3QgZnRyYWNlX2dyYXBoX3JldF9lbnRyeSAqbGVhZl9yZXQ7CisJc3RhdGljIGVudW0gcHJpbnRfbGluZV90IHJldDsKKwlpbnQgY3B1ID0gaXRlci0+Y3B1OwogCiAJaWYgKHByaW50X2dyYXBoX3Byb2xvZ3VlKGl0ZXIsIHMsIFRSQUNFX0dSQVBIX0VOVCwgY2FsbC0+ZnVuYykpCiAJCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKIAogCWxlYWZfcmV0ID0gZ2V0X3JldHVybl9mb3JfbGVhZihpdGVyLCBmaWVsZCk7CiAJaWYgKGxlYWZfcmV0KQotCQlyZXR1cm4gcHJpbnRfZ3JhcGhfZW50cnlfbGVhZihpdGVyLCBmaWVsZCwgbGVhZl9yZXQsIHMpOworCQlyZXQgPSBwcmludF9ncmFwaF9lbnRyeV9sZWFmKGl0ZXIsIGZpZWxkLCBsZWFmX3JldCwgcyk7CiAJZWxzZQotCQlyZXR1cm4gcHJpbnRfZ3JhcGhfZW50cnlfbmVzdGVkKGl0ZXIsIGZpZWxkLCBzLCBjcHUpOworCQlyZXQgPSBwcmludF9ncmFwaF9lbnRyeV9uZXN0ZWQoaXRlciwgZmllbGQsIHMsIGNwdSk7CiAKKwlpZiAoZGF0YSkgeworCQkvKgorCQkgKiBJZiB3ZSBmYWlsZWQgdG8gd3JpdGUgb3VyIG91dHB1dCwgdGhlbiB3ZSBuZWVkIHRvIG1ha2UKKwkJICogbm90ZSBvZiBpdC4gQmVjYXVzZSB3ZSBhbHJlYWR5IGNvbnN1bWVkIG91ciBlbnRyeS4KKwkJICovCisJCWlmIChzLT5mdWxsKSB7CisJCQlkYXRhLT5mYWlsZWQgPSAxOworCQkJZGF0YS0+Y3B1ID0gY3B1OworCQl9IGVsc2UKKwkJCWRhdGEtPmZhaWxlZCA9IDA7CisJfQorCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGVudW0gcHJpbnRfbGluZV90CkBAIC04MTAsNyArODU5LDcgQEAKIAogCWlmIChkYXRhKSB7CiAJCWludCBjcHUgPSBpdGVyLT5jcHU7Ci0JCWludCAqZGVwdGggPSAmKHBlcl9jcHVfcHRyKGRhdGEsIGNwdSktPmRlcHRoKTsKKwkJaW50ICpkZXB0aCA9ICYocGVyX2NwdV9wdHIoZGF0YS0+Y3B1X2RhdGEsIGNwdSktPmRlcHRoKTsKIAogCQkvKgogCQkgKiBDb21tZW50cyBkaXNwbGF5IGF0ICsgMSB0byBkZXB0aC4gVGhpcyBpcyB0aGUKQEAgLTg3Myw3ICs5MjIsNyBAQAogCWludCBpOwogCiAJaWYgKGRhdGEpCi0JCWRlcHRoID0gcGVyX2NwdV9wdHIoZGF0YSwgaXRlci0+Y3B1KS0+ZGVwdGg7CisJCWRlcHRoID0gcGVyX2NwdV9wdHIoZGF0YS0+Y3B1X2RhdGEsIGl0ZXItPmNwdSktPmRlcHRoOwogCiAJaWYgKHByaW50X2dyYXBoX3Byb2xvZ3VlKGl0ZXIsIHMsIDAsIDApKQogCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7CkBAIC05NDEsOCArOTkwLDMzIEBACiBlbnVtIHByaW50X2xpbmVfdAogcHJpbnRfZ3JhcGhfZnVuY3Rpb24oc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKQogeworCXN0cnVjdCBmdHJhY2VfZ3JhcGhfZW50X2VudHJ5ICpmaWVsZDsKKwlzdHJ1Y3QgZmdyYXBoX2RhdGEgKmRhdGEgPSBpdGVyLT5wcml2YXRlOwogCXN0cnVjdCB0cmFjZV9lbnRyeSAqZW50cnkgPSBpdGVyLT5lbnQ7CiAJc3RydWN0IHRyYWNlX3NlcSAqcyA9ICZpdGVyLT5zZXE7CisJaW50IGNwdSA9IGl0ZXItPmNwdTsKKwlpbnQgcmV0OworCisJaWYgKGRhdGEgJiYgcGVyX2NwdV9wdHIoZGF0YS0+Y3B1X2RhdGEsIGNwdSktPmlnbm9yZSkgeworCQlwZXJfY3B1X3B0cihkYXRhLT5jcHVfZGF0YSwgY3B1KS0+aWdub3JlID0gMDsKKwkJcmV0dXJuIFRSQUNFX1RZUEVfSEFORExFRDsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBsYXN0IG91dHB1dCBmYWlsZWQsIHRoZXJlJ3MgYSBwb3NzaWJpbGl0eSB3ZSBuZWVkCisJICogdG8gcHJpbnQgb3V0IHRoZSBtaXNzaW5nIGVudHJ5IHdoaWNoIHdvdWxkIG5ldmVyIGdvIG91dC4KKwkgKi8KKwlpZiAoZGF0YSAmJiBkYXRhLT5mYWlsZWQpIHsKKwkJZmllbGQgPSAmZGF0YS0+ZW50OworCQlpdGVyLT5jcHUgPSBkYXRhLT5jcHU7CisJCXJldCA9IHByaW50X2dyYXBoX2VudHJ5KGZpZWxkLCBzLCBpdGVyKTsKKwkJaWYgKHJldCA9PSBUUkFDRV9UWVBFX0hBTkRMRUQgJiYgaXRlci0+Y3B1ICE9IGNwdSkgeworCQkJcGVyX2NwdV9wdHIoZGF0YS0+Y3B1X2RhdGEsIGl0ZXItPmNwdSktPmlnbm9yZSA9IDE7CisJCQlyZXQgPSBUUkFDRV9UWVBFX05PX0NPTlNVTUU7CisJCX0KKwkJaXRlci0+Y3B1ID0gY3B1OworCQlyZXR1cm4gcmV0OworCX0KIAogCXN3aXRjaCAoZW50cnktPnR5cGUpIHsKIAljYXNlIFRSQUNFX0dSQVBIX0VOVDogewpAQCAtOTUyLDcgKzEwMjYsNyBAQAogCQkgKiBzaXplb2Yoc3RydWN0IGZ0cmFjZV9ncmFwaF9lbnRfZW50cnkpIGlzIHZlcnkgc21hbGwsCiAJCSAqIGl0IGNhbiBiZSBzYWZlbHkgc2F2ZWQgYXQgdGhlIHN0YWNrLgogCQkgKi8KLQkJc3RydWN0IGZ0cmFjZV9ncmFwaF9lbnRfZW50cnkgKmZpZWxkLCBzYXZlZDsKKwkJc3RydWN0IGZ0cmFjZV9ncmFwaF9lbnRfZW50cnkgc2F2ZWQ7CiAJCXRyYWNlX2Fzc2lnbl90eXBlKGZpZWxkLCBlbnRyeSk7CiAJCXNhdmVkID0gKmZpZWxkOwogCQlyZXR1cm4gcHJpbnRfZ3JhcGhfZW50cnkoJnNhdmVkLCBzLCBpdGVyKTsKQEAgLTEwMzAsMzEgKzExMDQsNTQgQEAKIHN0YXRpYyB2b2lkIGdyYXBoX3RyYWNlX29wZW4oc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKQogewogCS8qIHBpZCBhbmQgZGVwdGggb24gdGhlIGxhc3QgdHJhY2UgcHJvY2Vzc2VkICovCi0Jc3RydWN0IGZncmFwaF9kYXRhICpkYXRhID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBmZ3JhcGhfZGF0YSk7CisJc3RydWN0IGZncmFwaF9kYXRhICpkYXRhOwogCWludCBjcHU7CiAKKwlpdGVyLT5wcml2YXRlID0gTlVMTDsKKworCWRhdGEgPSBremFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZGF0YSkKLQkJcHJfd2FybmluZygiZnVuY3Rpb24gZ3JhcGggdHJhY2VyOiBub3QgZW5vdWdoIG1lbW9yeVxuIik7Ci0JZWxzZQotCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Ci0JCQlwaWRfdCAqcGlkID0gJihwZXJfY3B1X3B0cihkYXRhLCBjcHUpLT5sYXN0X3BpZCk7Ci0JCQlpbnQgKmRlcHRoID0gJihwZXJfY3B1X3B0cihkYXRhLCBjcHUpLT5kZXB0aCk7Ci0JCQkqcGlkID0gLTE7Ci0JCQkqZGVwdGggPSAwOwotCQl9CisJCWdvdG8gb3V0X2VycjsKKworCWRhdGEtPmNwdV9kYXRhID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBmZ3JhcGhfY3B1X2RhdGEpOworCWlmICghZGF0YS0+Y3B1X2RhdGEpCisJCWdvdG8gb3V0X2Vycl9mcmVlOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlwaWRfdCAqcGlkID0gJihwZXJfY3B1X3B0cihkYXRhLT5jcHVfZGF0YSwgY3B1KS0+bGFzdF9waWQpOworCQlpbnQgKmRlcHRoID0gJihwZXJfY3B1X3B0cihkYXRhLT5jcHVfZGF0YSwgY3B1KS0+ZGVwdGgpOworCQlpbnQgKmlnbm9yZSA9ICYocGVyX2NwdV9wdHIoZGF0YS0+Y3B1X2RhdGEsIGNwdSktPmlnbm9yZSk7CisJCSpwaWQgPSAtMTsKKwkJKmRlcHRoID0gMDsKKwkJKmlnbm9yZSA9IDA7CisJfQogCiAJaXRlci0+cHJpdmF0ZSA9IGRhdGE7CisKKwlyZXR1cm47CisKKyBvdXRfZXJyX2ZyZWU6CisJa2ZyZWUoZGF0YSk7Cisgb3V0X2VycjoKKwlwcl93YXJuaW5nKCJmdW5jdGlvbiBncmFwaCB0cmFjZXI6IG5vdCBlbm91Z2ggbWVtb3J5XG4iKTsKIH0KIAogc3RhdGljIHZvaWQgZ3JhcGhfdHJhY2VfY2xvc2Uoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKQogewotCWZyZWVfcGVyY3B1KGl0ZXItPnByaXZhdGUpOworCXN0cnVjdCBmZ3JhcGhfZGF0YSAqZGF0YSA9IGl0ZXItPnByaXZhdGU7CisKKwlpZiAoZGF0YSkgeworCQlmcmVlX3BlcmNwdShkYXRhLT5jcHVfZGF0YSk7CisJCWtmcmVlKGRhdGEpOworCX0KIH0KIAogc3RhdGljIHN0cnVjdCB0cmFjZXIgZ3JhcGhfdHJhY2UgX19yZWFkX21vc3RseSA9IHsKIAkubmFtZQkJPSAiZnVuY3Rpb25fZ3JhcGgiLAogCS5vcGVuCQk9IGdyYXBoX3RyYWNlX29wZW4sCisJLnBpcGVfb3Blbgk9IGdyYXBoX3RyYWNlX29wZW4sCiAJLmNsb3NlCQk9IGdyYXBoX3RyYWNlX2Nsb3NlLAorCS5waXBlX2Nsb3NlCT0gZ3JhcGhfdHJhY2VfY2xvc2UsCiAJLndhaXRfcGlwZQk9IHBvbGxfd2FpdF9waXBlLAogCS5pbml0CQk9IGdyYXBoX3RyYWNlX2luaXQsCiAJLnJlc2V0CQk9IGdyYXBoX3RyYWNlX3Jlc2V0LApkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2twcm9iZS5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2twcm9iZS5jCmluZGV4IGFmZjVmODAuLmI1MmQzOTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9rcHJvYmUuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfa3Byb2JlLmMKQEAgLTYwNiwyMyArNjA2LDIyIEBACiAJICovCiAJc3RydWN0IHRyYWNlX3Byb2JlICp0cDsKIAlpbnQgaSwgcmV0ID0gMDsKLQlpbnQgaXNfcmV0dXJuID0gMDsKKwlpbnQgaXNfcmV0dXJuID0gMCwgaXNfZGVsZXRlID0gMDsKIAljaGFyICpzeW1ib2wgPSBOVUxMLCAqZXZlbnQgPSBOVUxMLCAqYXJnID0gTlVMTCwgKmdyb3VwID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7CiAJdm9pZCAqYWRkciA9IE5VTEw7CiAJY2hhciBidWZbTUFYX0VWRU5UX05BTUVfTEVOXTsKIAotCWlmIChhcmdjIDwgMikgewotCQlwcl9pbmZvKCJQcm9iZSBwb2ludCBpcyBub3Qgc3BlY2lmaWVkLlxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQorCS8qIGFyZ2MgbXVzdCBiZSA+PSAxICovCiAJaWYgKGFyZ3ZbMF1bMF0gPT0gJ3AnKQogCQlpc19yZXR1cm4gPSAwOwogCWVsc2UgaWYgKGFyZ3ZbMF1bMF0gPT0gJ3InKQogCQlpc19yZXR1cm4gPSAxOworCWVsc2UgaWYgKGFyZ3ZbMF1bMF0gPT0gJy0nKQorCQlpc19kZWxldGUgPSAxOwogCWVsc2UgewotCQlwcl9pbmZvKCJQcm9iZSBkZWZpbml0aW9uIG11c3QgYmUgc3RhcnRlZCB3aXRoICdwJyBvciAncicuXG4iKTsKKwkJcHJfaW5mbygiUHJvYmUgZGVmaW5pdGlvbiBtdXN0IGJlIHN0YXJ0ZWQgd2l0aCAncCcsICdyJyBvciIKKwkJCSIgJy0nLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNjQyLDcgKzY0MSwyOSBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CisJaWYgKCFncm91cCkKKwkJZ3JvdXAgPSBLUFJPQkVfRVZFTlRfU1lTVEVNOwogCisJaWYgKGlzX2RlbGV0ZSkgeworCQlpZiAoIWV2ZW50KSB7CisJCQlwcl9pbmZvKCJEZWxldGUgY29tbWFuZCBuZWVkcyBhbiBldmVudCBuYW1lLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQl0cCA9IGZpbmRfcHJvYmVfZXZlbnQoZXZlbnQsIGdyb3VwKTsKKwkJaWYgKCF0cCkgeworCQkJcHJfaW5mbygiRXZlbnQgJXMvJXMgZG9lc24ndCBleGlzdC5cbiIsIGdyb3VwLCBldmVudCk7CisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJfQorCQkvKiBkZWxldGUgYW4gZXZlbnQgKi8KKwkJdW5yZWdpc3Rlcl90cmFjZV9wcm9iZSh0cCk7CisJCWZyZWVfdHJhY2VfcHJvYmUodHApOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoYXJnYyA8IDIpIHsKKwkJcHJfaW5mbygiUHJvYmUgcG9pbnQgaXMgbm90IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAJaWYgKGlzZGlnaXQoYXJndlsxXVswXSkpIHsKIAkJaWYgKGlzX3JldHVybikgewogCQkJcHJfaW5mbygiUmV0dXJuIHByb2JlIHBvaW50IG11c3QgYmUgYSBzeW1ib2wuXG4iKTsKQEAgLTY3MSw4ICs2OTIsNiBAQAogCWFyZ2MgLT0gMjsgYXJndiArPSAyOwogCiAJLyogc2V0dXAgYSBwcm9iZSAqLwotCWlmICghZ3JvdXApCi0JCWdyb3VwID0gS1BST0JFX0VWRU5UX1NZU1RFTTsKIAlpZiAoIWV2ZW50KSB7CiAJCS8qIE1ha2UgYSBuZXcgZXZlbnQgbmFtZSAqLwogCQlpZiAoc3ltYm9sKQpAQCAtMTExNCw3ICsxMTMzLDcgQEAKIAlzdHJ1Y3QgdHJhY2VfcHJvYmUgKnRwID0gKHN0cnVjdCB0cmFjZV9wcm9iZSAqKWV2ZW50X2NhbGwtPmRhdGE7CiAKIAlyZXQgPSB0cmFjZV9kZWZpbmVfY29tbW9uX2ZpZWxkcyhldmVudF9jYWxsKTsKLQlpZiAoIXJldCkKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJREVGSU5FX0ZJRUxEKHVuc2lnbmVkIGxvbmcsIGlwLCBGSUVMRF9TVFJJTkdfSVAsIDApOwpAQCAtMTEzMiw3ICsxMTUxLDcgQEAKIAlzdHJ1Y3QgdHJhY2VfcHJvYmUgKnRwID0gKHN0cnVjdCB0cmFjZV9wcm9iZSAqKWV2ZW50X2NhbGwtPmRhdGE7CiAKIAlyZXQgPSB0cmFjZV9kZWZpbmVfY29tbW9uX2ZpZWxkcyhldmVudF9jYWxsKTsKLQlpZiAoIXJldCkKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJREVGSU5FX0ZJRUxEKHVuc2lnbmVkIGxvbmcsIGZ1bmMsIEZJRUxEX1NUUklOR19GVU5DLCAwKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9rc3ltLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfa3N5bS5jCmluZGV4IGRkZmEwZmQuLmFjYjg3ZDQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9rc3ltLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2tzeW0uYwpAQCAtNzksMTEgKzc5LDEyIEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1BST0ZJTEVfS1NZTV9UUkFDRVIgKi8KIAotdm9pZCBrc3ltX2hicF9oYW5kbGVyKHN0cnVjdCBwZXJmX2V2ZW50ICpoYnAsIHZvaWQgKmRhdGEpCit2b2lkIGtzeW1faGJwX2hhbmRsZXIoc3RydWN0IHBlcmZfZXZlbnQgKmhicCwgaW50IG5taSwKKwkJICAgICAgc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsCisJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CiAJc3RydWN0IGtzeW1fdHJhY2VfZW50cnkgKmVudHJ5OwotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gZGF0YTsKIAlzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlcjsKIAlpbnQgcGM7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9vdXRwdXQuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9vdXRwdXQuYwppbmRleCBiNmMxMmM2Li44ZTQ2YjMzIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2Vfb3V0cHV0LmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX291dHB1dC5jCkBAIC0yMywxMyArMjMsMjEgQEAKIAogc3RhdGljIGludCBuZXh0X2V2ZW50X3R5cGUgPSBfX1RSQUNFX0xBU1RfVFlQRSArIDE7CiAKLXZvaWQgdHJhY2VfcHJpbnRfc2VxKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHRyYWNlX3NlcSAqcykKK2ludCB0cmFjZV9wcmludF9zZXEoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdHJhY2Vfc2VxICpzKQogewogCWludCBsZW4gPSBzLT5sZW4gPj0gUEFHRV9TSVpFID8gUEFHRV9TSVpFIC0gMSA6IHMtPmxlbjsKKwlpbnQgcmV0OwogCi0Jc2VxX3dyaXRlKG0sIHMtPmJ1ZmZlciwgbGVuKTsKKwlyZXQgPSBzZXFfd3JpdGUobSwgcy0+YnVmZmVyLCBsZW4pOwogCi0JdHJhY2Vfc2VxX2luaXQocyk7CisJLyoKKwkgKiBPbmx5IHJlc2V0IHRoaXMgYnVmZmVyIGlmIHdlIHN1Y2Nlc3NmdWxseSB3cm90ZSB0byB0aGUKKwkgKiBzZXFfZmlsZSBidWZmZXIuCisJICovCisJaWYgKCFyZXQpCisJCXRyYWNlX3NlcV9pbml0KHMpOworCisJcmV0dXJuIHJldDsKIH0KIAogZW51bSBwcmludF9saW5lX3QgdHJhY2VfcHJpbnRfYnByaW50a19tc2dfb25seShzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpCkBAIC04NSw3ICs5Myw3IEBACiAJdmFfbGlzdCBhcDsKIAlpbnQgcmV0OwogCi0JaWYgKCFsZW4pCisJaWYgKHMtPmZ1bGwgfHwgIWxlbikKIAkJcmV0dXJuIDA7CiAKIAl2YV9zdGFydChhcCwgZm10KTsKQEAgLTkzLDggKzEwMSwxMCBAQAogCXZhX2VuZChhcCk7CiAKIAkvKiBJZiB3ZSBjYW4ndCB3cml0ZSBpdCBhbGwsIGRvbid0IGJvdGhlciB3cml0aW5nIGFueXRoaW5nICovCi0JaWYgKHJldCA+PSBsZW4pCisJaWYgKHJldCA+PSBsZW4pIHsKKwkJcy0+ZnVsbCA9IDE7CiAJCXJldHVybiAwOworCX0KIAogCXMtPmxlbiArPSByZXQ7CiAKQEAgLTExOSwxNCArMTI5LDE2IEBACiAJaW50IGxlbiA9IChQQUdFX1NJWkUgLSAxKSAtIHMtPmxlbjsKIAlpbnQgcmV0OwogCi0JaWYgKCFsZW4pCisJaWYgKHMtPmZ1bGwgfHwgIWxlbikKIAkJcmV0dXJuIDA7CiAKIAlyZXQgPSB2c25wcmludGYocy0+YnVmZmVyICsgcy0+bGVuLCBsZW4sIGZtdCwgYXJncyk7CiAKIAkvKiBJZiB3ZSBjYW4ndCB3cml0ZSBpdCBhbGwsIGRvbid0IGJvdGhlciB3cml0aW5nIGFueXRoaW5nICovCi0JaWYgKHJldCA+PSBsZW4pCisJaWYgKHJldCA+PSBsZW4pIHsKKwkJcy0+ZnVsbCA9IDE7CiAJCXJldHVybiAwOworCX0KIAogCXMtPmxlbiArPSByZXQ7CiAKQEAgLTEzOSwxNCArMTUxLDE2IEBACiAJaW50IGxlbiA9IChQQUdFX1NJWkUgLSAxKSAtIHMtPmxlbjsKIAlpbnQgcmV0OwogCi0JaWYgKCFsZW4pCisJaWYgKHMtPmZ1bGwgfHwgIWxlbikKIAkJcmV0dXJuIDA7CiAKIAlyZXQgPSBic3RyX3ByaW50ZihzLT5idWZmZXIgKyBzLT5sZW4sIGxlbiwgZm10LCBiaW5hcnkpOwogCiAJLyogSWYgd2UgY2FuJ3Qgd3JpdGUgaXQgYWxsLCBkb24ndCBib3RoZXIgd3JpdGluZyBhbnl0aGluZyAqLwotCWlmIChyZXQgPj0gbGVuKQorCWlmIChyZXQgPj0gbGVuKSB7CisJCXMtPmZ1bGwgPSAxOwogCQlyZXR1cm4gMDsKKwl9CiAKIAlzLT5sZW4gKz0gcmV0OwogCkBAIC0xNjcsOSArMTgxLDE0IEBACiB7CiAJaW50IGxlbiA9IHN0cmxlbihzdHIpOwogCi0JaWYgKGxlbiA+ICgoUEFHRV9TSVpFIC0gMSkgLSBzLT5sZW4pKQorCWlmIChzLT5mdWxsKQogCQlyZXR1cm4gMDsKIAorCWlmIChsZW4gPiAoKFBBR0VfU0laRSAtIDEpIC0gcy0+bGVuKSkgeworCQlzLT5mdWxsID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCiAJbWVtY3B5KHMtPmJ1ZmZlciArIHMtPmxlbiwgc3RyLCBsZW4pOwogCXMtPmxlbiArPSBsZW47CiAKQEAgLTE3OCw5ICsxOTcsMTQgQEAKIAogaW50IHRyYWNlX3NlcV9wdXRjKHN0cnVjdCB0cmFjZV9zZXEgKnMsIHVuc2lnbmVkIGNoYXIgYykKIHsKLQlpZiAocy0+bGVuID49IChQQUdFX1NJWkUgLSAxKSkKKwlpZiAocy0+ZnVsbCkKIAkJcmV0dXJuIDA7CiAKKwlpZiAocy0+bGVuID49IChQQUdFX1NJWkUgLSAxKSkgeworCQlzLT5mdWxsID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCiAJcy0+YnVmZmVyW3MtPmxlbisrXSA9IGM7CiAKIAlyZXR1cm4gMTsKQEAgLTE4OCw5ICsyMTIsMTQgQEAKIAogaW50IHRyYWNlX3NlcV9wdXRtZW0oc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3Qgdm9pZCAqbWVtLCBzaXplX3QgbGVuKQogewotCWlmIChsZW4gPiAoKFBBR0VfU0laRSAtIDEpIC0gcy0+bGVuKSkKKwlpZiAocy0+ZnVsbCkKIAkJcmV0dXJuIDA7CiAKKwlpZiAobGVuID4gKChQQUdFX1NJWkUgLSAxKSAtIHMtPmxlbikpIHsKKwkJcy0+ZnVsbCA9IDE7CisJCXJldHVybiAwOworCX0KKwogCW1lbWNweShzLT5idWZmZXIgKyBzLT5sZW4sIG1lbSwgbGVuKTsKIAlzLT5sZW4gKz0gbGVuOwogCkBAIC0yMDMsNiArMjMyLDkgQEAKIAljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhID0gbWVtOwogCWludCBpLCBqOwogCisJaWYgKHMtPmZ1bGwpCisJCXJldHVybiAwOworCiAjaWZkZWYgX19CSUdfRU5ESUFOCiAJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsZW47IGkrKykgewogI2Vsc2UKQEAgLTIyMCw4ICsyNTIsMTMgQEAKIHsKIAl2b2lkICpyZXQ7CiAKLQlpZiAobGVuID4gKChQQUdFX1NJWkUgLSAxKSAtIHMtPmxlbikpCisJaWYgKHMtPmZ1bGwpCisJCXJldHVybiAwOworCisJaWYgKGxlbiA+ICgoUEFHRV9TSVpFIC0gMSkgLSBzLT5sZW4pKSB7CisJCXMtPmZ1bGwgPSAxOwogCQlyZXR1cm4gTlVMTDsKKwl9CiAKIAlyZXQgPSBzLT5idWZmZXIgKyBzLT5sZW47CiAJcy0+bGVuICs9IGxlbjsKQEAgLTIzMyw4ICsyNzAsMTQgQEAKIHsKIAl1bnNpZ25lZCBjaGFyICpwOwogCi0JaWYgKHMtPmxlbiA+PSAoUEFHRV9TSVpFIC0gMSkpCisJaWYgKHMtPmZ1bGwpCiAJCXJldHVybiAwOworCisJaWYgKHMtPmxlbiA+PSAoUEFHRV9TSVpFIC0gMSkpIHsKKwkJcy0+ZnVsbCA9IDE7CisJCXJldHVybiAwOworCX0KKwogCXAgPSBkX3BhdGgocGF0aCwgcy0+YnVmZmVyICsgcy0+bGVuLCBQQUdFX1NJWkUgLSBzLT5sZW4pOwogCWlmICghSVNfRVJSKHApKSB7CiAJCXAgPSBtYW5nbGVfcGF0aChzLT5idWZmZXIgKyBzLT5sZW4sIHAsICJcbiIpOwpAQCAtMjQ3LDYgKzI5MCw3IEBACiAJCXJldHVybiAxOwogCX0KIAorCXMtPmZ1bGwgPSAxOwogCXJldHVybiAwOwogfQogCkBAIC0zNzMsNiArNDE3LDkgQEAKIAl1bnNpZ25lZCBsb25nIHZtc3RhcnQgPSAwOwogCWludCByZXQgPSAxOwogCisJaWYgKHMtPmZ1bGwpCisJCXJldHVybiAwOworCiAJaWYgKG1tKSB7CiAJCWNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCmRpZmYgLS1naXQgYS9saWIvY2hlY2tzdW0uYyBiL2xpYi9jaGVja3N1bS5jCmluZGV4IGIyZTJmZDQuLjA5NzUwODcgMTAwNjQ0Ci0tLSBhL2xpYi9jaGVja3N1bS5jCisrKyBiL2xpYi9jaGVja3N1bS5jCkBAIC0zNyw3ICszNyw4IEBACiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZnJvbTMydG8xNih1bnNpZ25lZCBsb25nIHgpCisjaWZuZGVmIGRvX2NzdW0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZnJvbTMydG8xNih1bnNpZ25lZCBpbnQgeCkKIHsKIAkvKiBhZGQgdXAgMTYtYml0IGFuZCAxNi1iaXQgZm9yIDE2K2MgYml0ICovCiAJeCA9ICh4ICYgMHhmZmZmKSArICh4ID4+IDE2KTsKQEAgLTQ5LDE2ICs1MCwxNiBAQAogc3RhdGljIHVuc2lnbmVkIGludCBkb19jc3VtKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmYsIGludCBsZW4pCiB7CiAJaW50IG9kZCwgY291bnQ7Ci0JdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOworCXVuc2lnbmVkIGludCByZXN1bHQgPSAwOwogCiAJaWYgKGxlbiA8PSAwKQogCQlnb3RvIG91dDsKIAlvZGQgPSAxICYgKHVuc2lnbmVkIGxvbmcpIGJ1ZmY7CiAJaWYgKG9kZCkgewogI2lmZGVmIF9fTElUVExFX0VORElBTgotCQlyZXN1bHQgPSAqYnVmZjsKLSNlbHNlCiAJCXJlc3VsdCArPSAoKmJ1ZmYgPDwgOCk7CisjZWxzZQorCQlyZXN1bHQgPSAqYnVmZjsKICNlbmRpZgogCQlsZW4tLTsKIAkJYnVmZisrOwpAQCAtNzMsOSArNzQsOSBAQAogCQl9CiAJCWNvdW50ID4+PSAxOwkJLyogbnIgb2YgMzItYml0IHdvcmRzLi4gKi8KIAkJaWYgKGNvdW50KSB7Ci0JCQl1bnNpZ25lZCBsb25nIGNhcnJ5ID0gMDsKKwkJCXVuc2lnbmVkIGludCBjYXJyeSA9IDA7CiAJCQlkbyB7Ci0JCQkJdW5zaWduZWQgbG9uZyB3ID0gKih1bnNpZ25lZCBpbnQgKikgYnVmZjsKKwkJCQl1bnNpZ25lZCBpbnQgdyA9ICoodW5zaWduZWQgaW50ICopIGJ1ZmY7CiAJCQkJY291bnQtLTsKIAkJCQlidWZmICs9IDQ7CiAJCQkJcmVzdWx0ICs9IGNhcnJ5OwpAQCAtMTAyLDYgKzEwMyw3IEBACiBvdXQ6CiAJcmV0dXJuIHJlc3VsdDsKIH0KKyNlbmRpZgogCiAvKgogICoJVGhpcyBpcyBhIHZlcnNpb24gb2YgaXBfY29tcHV0ZV9jc3VtKCkgb3B0aW1pemVkIGZvciBJUCBoZWFkZXJzLApkaWZmIC0tZ2l0IGEvbGliL3ZzcHJpbnRmLmMgYi9saWIvdnNwcmludGYuYwppbmRleCAzM2JlZDVlLi42NDM4Y2Q1IDEwMDY0NAotLS0gYS9saWIvdnNwcmludGYuYworKysgYi9saWIvdnNwcmludGYuYwpAQCAtNTk1LDM3ICs1OTUsODkgQEAKIH0KIAogc3RhdGljIGNoYXIgKnJlc291cmNlX3N0cmluZyhjaGFyICpidWYsIGNoYXIgKmVuZCwgc3RydWN0IHJlc291cmNlICpyZXMsCi0JCQkJc3RydWN0IHByaW50Zl9zcGVjIHNwZWMpCisJCQkJc3RydWN0IHByaW50Zl9zcGVjIHNwZWMsIGNvbnN0IGNoYXIgKmZtdCkKIHsKICNpZm5kZWYgSU9fUlNSQ19QUklOVEtfU0laRQotI2RlZmluZSBJT19SU1JDX1BSSU5US19TSVpFCTQKKyNkZWZpbmUgSU9fUlNSQ19QUklOVEtfU0laRQk2CiAjZW5kaWYKIAogI2lmbmRlZiBNRU1fUlNSQ19QUklOVEtfU0laRQotI2RlZmluZSBNRU1fUlNSQ19QUklOVEtfU0laRQk4CisjZGVmaW5lIE1FTV9SU1JDX1BSSU5US19TSVpFCTEwCiAjZW5kaWYKLQlzdHJ1Y3QgcHJpbnRmX3NwZWMgbnVtX3NwZWMgPSB7CisJc3RydWN0IHByaW50Zl9zcGVjIGhleF9zcGVjID0gewogCQkuYmFzZSA9IDE2LAogCQkucHJlY2lzaW9uID0gLTEsCiAJCS5mbGFncyA9IFNQRUNJQUwgfCBTTUFMTCB8IFpFUk9QQUQsCiAJfTsKLQkvKiByb29tIGZvciB0aGUgYWN0dWFsIG51bWJlcnMsIHRoZSB0d28gIjB4IiwgLSwgWywgXSBhbmQgdGhlIGZpbmFsIHplcm8gKi8KLQljaGFyIHN5bVs0KnNpemVvZihyZXNvdXJjZV9zaXplX3QpICsgOF07Ci0JY2hhciAqcCA9IHN5bSwgKnBlbmQgPSBzeW0gKyBzaXplb2Yoc3ltKTsKLQlpbnQgc2l6ZSA9IC0xOworCXN0cnVjdCBwcmludGZfc3BlYyBkZWNfc3BlYyA9IHsKKwkJLmJhc2UgPSAxMCwKKwkJLnByZWNpc2lvbiA9IC0xLAorCQkuZmxhZ3MgPSAwLAorCX07CisJc3RydWN0IHByaW50Zl9zcGVjIHN0cl9zcGVjID0geworCQkuZmllbGRfd2lkdGggPSAtMSwKKwkJLnByZWNpc2lvbiA9IDEwLAorCQkuZmxhZ3MgPSBMRUZULAorCX07CisJc3RydWN0IHByaW50Zl9zcGVjIGZsYWdfc3BlYyA9IHsKKwkJLmJhc2UgPSAxNiwKKwkJLnByZWNpc2lvbiA9IC0xLAorCQkuZmxhZ3MgPSBTUEVDSUFMIHwgU01BTEwsCisJfTsKIAotCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkvKiAzMi1iaXQgcmVzIChzaXplb2Y9PTQpOiAxMCBjaGFycyBpbiBkZWMsIDEwIGluIGhleCAoIjB4IiArIDgpCisJICogNjQtYml0IHJlcyAoc2l6ZW9mPT04KTogMjAgY2hhcnMgaW4gZGVjLCAxOCBpbiBoZXggKCIweCIgKyAxNikgKi8KKyNkZWZpbmUgUlNSQ19CVUZfU0laRQkJKCgyICogc2l6ZW9mKHJlc291cmNlX3NpemVfdCkpICsgNCkKKyNkZWZpbmUgRkxBR19CVUZfU0laRQkJKDIgKiBzaXplb2YocmVzLT5mbGFncykpCisjZGVmaW5lIERFQ09ERURfQlVGX1NJWkUJc2l6ZW9mKCJbbWVtIC0gNjRiaXQgcHJlZiBkaXNhYmxlZF0iKQorI2RlZmluZSBSQVdfQlVGX1NJWkUJCXNpemVvZigiW21lbSAtIGZsYWdzIDB4XSIpCisJY2hhciBzeW1bbWF4KDIqUlNSQ19CVUZfU0laRSArIERFQ09ERURfQlVGX1NJWkUsCisJCSAgICAgMipSU1JDX0JVRl9TSVpFICsgRkxBR19CVUZfU0laRSArIFJBV19CVUZfU0laRSldOworCisJY2hhciAqcCA9IHN5bSwgKnBlbmQgPSBzeW0gKyBzaXplb2Yoc3ltKTsKKwlpbnQgc2l6ZSA9IC0xLCBhZGRyID0gMDsKKwlpbnQgZGVjb2RlID0gKGZtdFswXSA9PSAnUicpID8gMSA6IDA7CisKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKIAkJc2l6ZSA9IElPX1JTUkNfUFJJTlRLX1NJWkU7Ci0JZWxzZSBpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQlhZGRyID0gMTsKKwl9IGVsc2UgaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgewogCQlzaXplID0gTUVNX1JTUkNfUFJJTlRLX1NJWkU7CisJCWFkZHIgPSAxOworCX0KIAogCSpwKysgPSAnWyc7Ci0JbnVtX3NwZWMuZmllbGRfd2lkdGggPSBzaXplOwotCXAgPSBudW1iZXIocCwgcGVuZCwgcmVzLT5zdGFydCwgbnVtX3NwZWMpOwotCSpwKysgPSAnLSc7Ci0JcCA9IG51bWJlcihwLCBwZW5kLCByZXMtPmVuZCwgbnVtX3NwZWMpOworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJcCA9IHN0cmluZyhwLCBwZW5kLCAiaW8gICIsIHN0cl9zcGVjKTsKKwllbHNlIGlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCXAgPSBzdHJpbmcocCwgcGVuZCwgIm1lbSAiLCBzdHJfc3BlYyk7CisJZWxzZSBpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSVJRKQorCQlwID0gc3RyaW5nKHAsIHBlbmQsICJpcnEgIiwgc3RyX3NwZWMpOworCWVsc2UgaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0RNQSkKKwkJcCA9IHN0cmluZyhwLCBwZW5kLCAiZG1hICIsIHN0cl9zcGVjKTsKKwllbHNlIHsKKwkJcCA9IHN0cmluZyhwLCBwZW5kLCAiPz8/ICIsIHN0cl9zcGVjKTsKKwkJZGVjb2RlID0gMDsKKwl9CisJaGV4X3NwZWMuZmllbGRfd2lkdGggPSBzaXplOworCXAgPSBudW1iZXIocCwgcGVuZCwgcmVzLT5zdGFydCwgYWRkciA/IGhleF9zcGVjIDogZGVjX3NwZWMpOworCWlmIChyZXMtPnN0YXJ0ICE9IHJlcy0+ZW5kKSB7CisJCSpwKysgPSAnLSc7CisJCXAgPSBudW1iZXIocCwgcGVuZCwgcmVzLT5lbmQsIGFkZHIgPyBoZXhfc3BlYyA6IGRlY19zcGVjKTsKKwl9CisJaWYgKGRlY29kZSkgeworCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNXzY0KQorCQkJcCA9IHN0cmluZyhwLCBwZW5kLCAiIDY0Yml0Iiwgc3RyX3NwZWMpOworCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpCisJCQlwID0gc3RyaW5nKHAsIHBlbmQsICIgcHJlZiIsIHN0cl9zcGVjKTsKKwkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0RJU0FCTEVEKQorCQkJcCA9IHN0cmluZyhwLCBwZW5kLCAiIGRpc2FibGVkIiwgc3RyX3NwZWMpOworCX0gZWxzZSB7CisJCXAgPSBzdHJpbmcocCwgcGVuZCwgIiBmbGFncyAiLCBzdHJfc3BlYyk7CisJCXAgPSBudW1iZXIocCwgcGVuZCwgcmVzLT5mbGFncywgZmxhZ19zcGVjKTsKKwl9CiAJKnArKyA9ICddJzsKLQkqcCA9IDA7CisJKnAgPSAnXDAnOwogCiAJcmV0dXJuIHN0cmluZyhidWYsIGVuZCwgc3ltLCBzcGVjKTsKIH0KQEAgLTgwMSw4ICs4NTMsOCBAQAogICogLSAnZicgRm9yIHNpbXBsZSBzeW1ib2xpYyBmdW5jdGlvbiBuYW1lcyB3aXRob3V0IG9mZnNldAogICogLSAnUycgRm9yIHN5bWJvbGljIGRpcmVjdCBwb2ludGVycyB3aXRoIG9mZnNldAogICogLSAncycgRm9yIHN5bWJvbGljIGRpcmVjdCBwb2ludGVycyB3aXRob3V0IG9mZnNldAotICogLSAnUicgRm9yIGEgc3RydWN0IHJlc291cmNlIHBvaW50ZXIsIGl0IHByaW50cyB0aGUgcmFuZ2Ugb2YKLSAqICAgICAgIGFkZHJlc3NlcyAobm90IHRoZSBuYW1lIG5vciB0aGUgZmxhZ3MpCisgKiAtICdSJyBGb3IgZGVjb2RlZCBzdHJ1Y3QgcmVzb3VyY2UsIGUuZy4sIFttZW0gMHgwLTB4MWYgNjRiaXQgcHJlZl0KKyAqIC0gJ3InIEZvciByYXcgc3RydWN0IHJlc291cmNlLCBlLmcuLCBbbWVtIDB4MC0weDFmIGZsYWdzIDB4MjAxXQogICogLSAnTScgRm9yIGEgNi1ieXRlIE1BQyBhZGRyZXNzLCBpdCBwcmludHMgdGhlIGFkZHJlc3MgaW4gdGhlCiAgKiAgICAgICB1c3VhbCBjb2xvbi1zZXBhcmF0ZWQgaGV4IG5vdGF0aW9uCiAgKiAtICdtJyBGb3IgYSA2LWJ5dGUgTUFDIGFkZHJlc3MsIGl0IHByaW50cyB0aGUgaGV4IGFkZHJlc3Mgd2l0aG91dCBjb2xvbnMKQEAgLTgzMyw3ICs4ODUsOCBAQAogCWNhc2UgJ1MnOgogCQlyZXR1cm4gc3ltYm9sX3N0cmluZyhidWYsIGVuZCwgcHRyLCBzcGVjLCAqZm10KTsKIAljYXNlICdSJzoKLQkJcmV0dXJuIHJlc291cmNlX3N0cmluZyhidWYsIGVuZCwgcHRyLCBzcGVjKTsKKwljYXNlICdyJzoKKwkJcmV0dXJuIHJlc291cmNlX3N0cmluZyhidWYsIGVuZCwgcHRyLCBzcGVjLCBmbXQpOwogCWNhc2UgJ00nOgkJCS8qIENvbG9uIHNlcGFyYXRlZDogMDA6MDE6MDI6MDM6MDQ6MDUgKi8KIAljYXNlICdtJzoJCQkvKiBDb250aWd1b3VzOiAwMDAxMDIwMzA0MDUgKi8KIAkJcmV0dXJuIG1hY19hZGRyZXNzX3N0cmluZyhidWYsIGVuZCwgcHRyLCBzcGVjLCBmbXQpOwpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcC5jIGIvbW0vZmlsZW1hcC5jCmluZGV4IGMzZDM1MDYuLjhiNGQ4OGYgMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXAuYworKysgYi9tbS9maWxlbWFwLmMKQEAgLTI2MCwyNyArMjYwLDI3IEBACiBFWFBPUlRfU1lNQk9MKGZpbGVtYXBfZmx1c2gpOwogCiAvKioKLSAqIHdhaXRfb25fcGFnZV93cml0ZWJhY2tfcmFuZ2UgLSB3YWl0IGZvciB3cml0ZWJhY2sgdG8gY29tcGxldGUKLSAqIEBtYXBwaW5nOgl0YXJnZXQgYWRkcmVzc19zcGFjZQotICogQHN0YXJ0OgliZWdpbm5pbmcgcGFnZSBpbmRleAotICogQGVuZDoJZW5kaW5nIHBhZ2UgaW5kZXgKKyAqIGZpbGVtYXBfZmRhdGF3YWl0X3JhbmdlIC0gd2FpdCBmb3Igd3JpdGViYWNrIHRvIGNvbXBsZXRlCisgKiBAbWFwcGluZzoJCWFkZHJlc3Mgc3BhY2Ugc3RydWN0dXJlIHRvIHdhaXQgZm9yCisgKiBAc3RhcnRfYnl0ZToJCW9mZnNldCBpbiBieXRlcyB3aGVyZSB0aGUgcmFuZ2Ugc3RhcnRzCisgKiBAZW5kX2J5dGU6CQlvZmZzZXQgaW4gYnl0ZXMgd2hlcmUgdGhlIHJhbmdlIGVuZHMgKGluY2x1c2l2ZSkKICAqCi0gKiBXYWl0IGZvciB3cml0ZWJhY2sgdG8gY29tcGxldGUgYWdhaW5zdCBwYWdlcyBpbmRleGVkIGJ5IHN0YXJ0LT5lbmQKLSAqIGluY2x1c2l2ZQorICogV2FsayB0aGUgbGlzdCBvZiB1bmRlci13cml0ZWJhY2sgcGFnZXMgb2YgdGhlIGdpdmVuIGFkZHJlc3Mgc3BhY2UKKyAqIGluIHRoZSBnaXZlbiByYW5nZSBhbmQgd2FpdCBmb3IgYWxsIG9mIHRoZW0uCiAgKi8KLWludCB3YWl0X29uX3BhZ2Vfd3JpdGViYWNrX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAotCQkJCXBnb2ZmX3Qgc3RhcnQsIHBnb2ZmX3QgZW5kKQoraW50IGZpbGVtYXBfZmRhdGF3YWl0X3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBsb2ZmX3Qgc3RhcnRfYnl0ZSwKKwkJCSAgICBsb2ZmX3QgZW5kX2J5dGUpCiB7CisJcGdvZmZfdCBpbmRleCA9IHN0YXJ0X2J5dGUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlwZ29mZl90IGVuZCA9IGVuZF9ieXRlID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKIAlpbnQgbnJfcGFnZXM7CiAJaW50IHJldCA9IDA7Ci0JcGdvZmZfdCBpbmRleDsKIAotCWlmIChlbmQgPCBzdGFydCkKKwlpZiAoZW5kX2J5dGUgPCBzdGFydF9ieXRlKQogCQlyZXR1cm4gMDsKIAogCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7Ci0JaW5kZXggPSBzdGFydDsKIAl3aGlsZSAoKGluZGV4IDw9IGVuZCkgJiYKIAkJCShucl9wYWdlcyA9IHBhZ2V2ZWNfbG9va3VwX3RhZygmcHZlYywgbWFwcGluZywgJmluZGV4LAogCQkJUEFHRUNBQ0hFX1RBR19XUklURUJBQ0ssCkBAIC0zMTAsMjUgKzMxMCw2IEBACiAKIAlyZXR1cm4gcmV0OwogfQotCi0vKioKLSAqIGZpbGVtYXBfZmRhdGF3YWl0X3JhbmdlIC0gd2FpdCBmb3IgYWxsIHVuZGVyLXdyaXRlYmFjayBwYWdlcyB0byBjb21wbGV0ZSBpbiBhIGdpdmVuIHJhbmdlCi0gKiBAbWFwcGluZzogYWRkcmVzcyBzcGFjZSBzdHJ1Y3R1cmUgdG8gd2FpdCBmb3IKLSAqIEBzdGFydDoJb2Zmc2V0IGluIGJ5dGVzIHdoZXJlIHRoZSByYW5nZSBzdGFydHMKLSAqIEBlbmQ6CW9mZnNldCBpbiBieXRlcyB3aGVyZSB0aGUgcmFuZ2UgZW5kcyAoaW5jbHVzaXZlKQotICoKLSAqIFdhbGsgdGhlIGxpc3Qgb2YgdW5kZXItd3JpdGViYWNrIHBhZ2VzIG9mIHRoZSBnaXZlbiBhZGRyZXNzIHNwYWNlCi0gKiBpbiB0aGUgZ2l2ZW4gcmFuZ2UgYW5kIHdhaXQgZm9yIGFsbCBvZiB0aGVtLgotICoKLSAqIFRoaXMgaXMganVzdCBhIHNpbXBsZSB3cmFwcGVyIHNvIHRoYXQgY2FsbGVycyBkb24ndCBoYXZlIHRvIGNvbnZlcnQgb2Zmc2V0cwotICogdG8gcGFnZSBpbmRleGVzIHRoZW1zZWx2ZXMKLSAqLwotaW50IGZpbGVtYXBfZmRhdGF3YWl0X3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBsb2ZmX3Qgc3RhcnQsCi0JCQkgICAgbG9mZl90IGVuZCkKLXsKLQlyZXR1cm4gd2FpdF9vbl9wYWdlX3dyaXRlYmFja19yYW5nZShtYXBwaW5nLCBzdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZULAotCQkJCQkgICAgZW5kID4+IFBBR0VfQ0FDSEVfU0hJRlQpOwotfQogRVhQT1JUX1NZTUJPTChmaWxlbWFwX2ZkYXRhd2FpdF9yYW5nZSk7CiAKIC8qKgpAQCAtMzQ1LDggKzMyNiw3IEBACiAJaWYgKGlfc2l6ZSA9PSAwKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiB3YWl0X29uX3BhZ2Vfd3JpdGViYWNrX3JhbmdlKG1hcHBpbmcsIDAsCi0JCQkJKGlfc2l6ZSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCXJldHVybiBmaWxlbWFwX2ZkYXRhd2FpdF9yYW5nZShtYXBwaW5nLCAwLCBpX3NpemUgLSAxKTsKIH0KIEVYUE9SVF9TWU1CT0woZmlsZW1hcF9mZGF0YXdhaXQpOwogCkBAIC0zOTMsOSArMzczLDggQEAKIAkJCQkJCSBXQl9TWU5DX0FMTCk7CiAJCS8qIFNlZSBjb21tZW50IG9mIGZpbGVtYXBfd3JpdGVfYW5kX3dhaXQoKSAqLwogCQlpZiAoZXJyICE9IC1FSU8pIHsKLQkJCWludCBlcnIyID0gd2FpdF9vbl9wYWdlX3dyaXRlYmFja19yYW5nZShtYXBwaW5nLAotCQkJCQkJbHN0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQsCi0JCQkJCQlsZW5kID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCQkJaW50IGVycjIgPSBmaWxlbWFwX2ZkYXRhd2FpdF9yYW5nZShtYXBwaW5nLAorCQkJCQkJbHN0YXJ0LCBsZW5kKTsKIAkJCWlmICghZXJyKQogCQkJCWVyciA9IGVycjI7CiAJCX0KZGlmZiAtLWdpdCBhL21tL21tYXAuYyBiL21tL21tYXAuYwppbmRleCAyOTJkZGMzLi5lZDcwYTY4IDEwMDY0NAotLS0gYS9tbS9tbWFwLmMKKysrIGIvbW0vbW1hcC5jCkBAIC05MzEsMTMgKzkzMSw5IEBACiAJaWYgKCEoZmxhZ3MgJiBNQVBfRklYRUQpKQogCQlhZGRyID0gcm91bmRfaGludF90b19taW4oYWRkcik7CiAKLQllcnJvciA9IGFyY2hfbW1hcF9jaGVjayhhZGRyLCBsZW4sIGZsYWdzKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQogCS8qIENhcmVmdWwgYWJvdXQgb3ZlcmZsb3dzLi4gKi8KIAlsZW4gPSBQQUdFX0FMSUdOKGxlbik7Ci0JaWYgKCFsZW4gfHwgbGVuID4gVEFTS19TSVpFKQorCWlmICghbGVuKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIG9mZnNldCBvdmVyZmxvdz8gKi8KQEAgLTk0OCwyNCArOTQ0LDYgQEAKIAlpZiAobW0tPm1hcF9jb3VudCA+IHN5c2N0bF9tYXhfbWFwX2NvdW50KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmIChmbGFncyAmIE1BUF9IVUdFVExCKSB7Ci0JCXN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlciA9IE5VTEw7Ci0JCWlmIChmaWxlKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJLyoKLQkJICogVk1fTk9SRVNFUlZFIGlzIHVzZWQgYmVjYXVzZSB0aGUgcmVzZXJ2YXRpb25zIHdpbGwgYmUKLQkJICogdGFrZW4gd2hlbiB2bV9vcHMtPm1tYXAoKSBpcyBjYWxsZWQKLQkJICogQSBkdW1teSB1c2VyIHZhbHVlIGlzIHVzZWQgYmVjYXVzZSB3ZSBhcmUgbm90IGxvY2tpbmcKLQkJICogbWVtb3J5IHNvIG5vIGFjY291bnRpbmcgaXMgbmVjZXNzYXJ5Ci0JCSAqLwotCQlsZW4gPSBBTElHTihsZW4sIGh1Z2VfcGFnZV9zaXplKCZkZWZhdWx0X2hzdGF0ZSkpOwotCQlmaWxlID0gaHVnZXRsYl9maWxlX3NldHVwKEhVR0VUTEJfQU5PTl9GSUxFLCBsZW4sIFZNX05PUkVTRVJWRSwKLQkJCQkJCSZ1c2VyLCBIVUdFVExCX0FOT05IVUdFX0lOT0RFKTsKLQkJaWYgKElTX0VSUihmaWxlKSkKLQkJCXJldHVybiBQVFJfRVJSKGZpbGUpOwotCX0KLQogCS8qIE9idGFpbiB0aGUgYWRkcmVzcyB0byBtYXAgdG8uIHdlIHZlcmlmeSAob3Igc2VsZWN0KSBpdCBhbmQgZW5zdXJlCiAJICogdGhhdCBpdCByZXByZXNlbnRzIGEgdmFsaWQgc2VjdGlvbiBvZiB0aGUgYWRkcmVzcyBzcGFjZS4KIAkgKi8KQEAgLTE0NTUsNiArMTQzMywxNCBAQAogCXVuc2lnbmVkIGxvbmcgKCpnZXRfYXJlYSkoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgbG9uZywKIAkJCQkgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogCisJdW5zaWduZWQgbG9uZyBlcnJvciA9IGFyY2hfbW1hcF9jaGVjayhhZGRyLCBsZW4sIGZsYWdzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCS8qIENhcmVmdWwgYWJvdXQgb3ZlcmZsb3dzLi4gKi8KKwlpZiAobGVuID4gVEFTS19TSVpFKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCWdldF9hcmVhID0gY3VycmVudC0+bW0tPmdldF91bm1hcHBlZF9hcmVhOwogCWlmIChmaWxlICYmIGZpbGUtPmZfb3AgJiYgZmlsZS0+Zl9vcC0+Z2V0X3VubWFwcGVkX2FyZWEpCiAJCWdldF9hcmVhID0gZmlsZS0+Zl9vcC0+Z2V0X3VubWFwcGVkX2FyZWE7CkBAIC0xOTk5LDIwICsxOTg1LDE0IEBACiAJaWYgKCFsZW4pCiAJCXJldHVybiBhZGRyOwogCi0JaWYgKChhZGRyICsgbGVuKSA+IFRBU0tfU0laRSB8fCAoYWRkciArIGxlbikgPCBhZGRyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChpc19odWdlcGFnZV9vbmx5X3JhbmdlKG1tLCBhZGRyLCBsZW4pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWVycm9yID0gc2VjdXJpdHlfZmlsZV9tbWFwKE5VTEwsIDAsIDAsIDAsIGFkZHIsIDEpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCiAJZmxhZ3MgPSBWTV9EQVRBX0RFRkFVTFRfRkxBR1MgfCBWTV9BQ0NPVU5UIHwgbW0tPmRlZl9mbGFnczsKIAotCWVycm9yID0gYXJjaF9tbWFwX2NoZWNrKGFkZHIsIGxlbiwgZmxhZ3MpOwotCWlmIChlcnJvcikKKwllcnJvciA9IGdldF91bm1hcHBlZF9hcmVhKE5VTEwsIGFkZHIsIGxlbiwgMCwgTUFQX0ZJWEVEKTsKKwlpZiAoZXJyb3IgJiB+UEFHRV9NQVNLKQogCQlyZXR1cm4gZXJyb3I7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvbW0vbXJlbWFwLmMgYi9tbS9tcmVtYXAuYwppbmRleCA5N2JmZjI1Li44NDUxOTA4IDEwMDY0NAotLS0gYS9tbS9tcmVtYXAuYworKysgYi9tbS9tcmVtYXAuYwpAQCAtMjYxLDYgKzI2MSwxMzcgQEAKIAlyZXR1cm4gbmV3X2FkZHI7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYV90b19yZXNpemUodW5zaWduZWQgbG9uZyBhZGRyLAorCXVuc2lnbmVkIGxvbmcgb2xkX2xlbiwgdW5zaWduZWQgbG9uZyBuZXdfbGVuLCB1bnNpZ25lZCBsb25nICpwKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcik7CisKKwlpZiAoIXZtYSB8fCB2bWEtPnZtX3N0YXJ0ID4gYWRkcikKKwkJZ290byBFZmF1bHQ7CisKKwlpZiAoaXNfdm1faHVnZXRsYl9wYWdlKHZtYSkpCisJCWdvdG8gRWludmFsOworCisJLyogV2UgY2FuJ3QgcmVtYXAgYWNyb3NzIHZtIGFyZWEgYm91bmRhcmllcyAqLworCWlmIChvbGRfbGVuID4gdm1hLT52bV9lbmQgLSBhZGRyKQorCQlnb3RvIEVmYXVsdDsKKworCWlmICh2bWEtPnZtX2ZsYWdzICYgKFZNX0RPTlRFWFBBTkQgfCBWTV9QRk5NQVApKSB7CisJCWlmIChuZXdfbGVuID4gb2xkX2xlbikKKwkJCWdvdG8gRWZhdWx0OworCX0KKworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fTE9DS0VEKSB7CisJCXVuc2lnbmVkIGxvbmcgbG9ja2VkLCBsb2NrX2xpbWl0OworCQlsb2NrZWQgPSBtbS0+bG9ja2VkX3ZtIDw8IFBBR0VfU0hJRlQ7CisJCWxvY2tfbGltaXQgPSBjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX01FTUxPQ0tdLnJsaW1fY3VyOworCQlsb2NrZWQgKz0gbmV3X2xlbiAtIG9sZF9sZW47CisJCWlmIChsb2NrZWQgPiBsb2NrX2xpbWl0ICYmICFjYXBhYmxlKENBUF9JUENfTE9DSykpCisJCQlnb3RvIEVhZ2FpbjsKKwl9CisKKwlpZiAoIW1heV9leHBhbmRfdm0obW0sIChuZXdfbGVuIC0gb2xkX2xlbikgPj4gUEFHRV9TSElGVCkpCisJCWdvdG8gRW5vbWVtOworCisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9BQ0NPVU5UKSB7CisJCXVuc2lnbmVkIGxvbmcgY2hhcmdlZCA9IChuZXdfbGVuIC0gb2xkX2xlbikgPj4gUEFHRV9TSElGVDsKKwkJaWYgKHNlY3VyaXR5X3ZtX2Vub3VnaF9tZW1vcnkoY2hhcmdlZCkpCisJCQlnb3RvIEVmYXVsdDsKKwkJKnAgPSBjaGFyZ2VkOworCX0KKworCXJldHVybiB2bWE7CisKK0VmYXVsdDoJLyogdmVyeSBvZGQgY2hvaWNlIGZvciBtb3N0IG9mIHRoZSBjYXNlcywgYnV0Li4uICovCisJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CitFaW52YWw6CisJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CitFbm9tZW06CisJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CitFYWdhaW46CisJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1yZW1hcF90byh1bnNpZ25lZCBsb25nIGFkZHIsCisJdW5zaWduZWQgbG9uZyBvbGRfbGVuLCB1bnNpZ25lZCBsb25nIG5ld19hZGRyLAorCXVuc2lnbmVkIGxvbmcgbmV3X2xlbikKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXVuc2lnbmVkIGxvbmcgcmV0ID0gLUVJTlZBTDsKKwl1bnNpZ25lZCBsb25nIGNoYXJnZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgbWFwX2ZsYWdzOworCisJaWYgKG5ld19hZGRyICYgflBBR0VfTUFTSykKKwkJZ290byBvdXQ7CisKKwlpZiAobmV3X2xlbiA+IFRBU0tfU0laRSB8fCBuZXdfYWRkciA+IFRBU0tfU0laRSAtIG5ld19sZW4pCisJCWdvdG8gb3V0OworCisJLyogQ2hlY2sgaWYgdGhlIGxvY2F0aW9uIHdlJ3JlIG1vdmluZyBpbnRvIG92ZXJsYXBzIHRoZQorCSAqIG9sZCBsb2NhdGlvbiBhdCBhbGwsIGFuZCBmYWlsIGlmIGl0IGRvZXMuCisJICovCisJaWYgKChuZXdfYWRkciA8PSBhZGRyKSAmJiAobmV3X2FkZHIrbmV3X2xlbikgPiBhZGRyKQorCQlnb3RvIG91dDsKKworCWlmICgoYWRkciA8PSBuZXdfYWRkcikgJiYgKGFkZHIrb2xkX2xlbikgPiBuZXdfYWRkcikKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBzZWN1cml0eV9maWxlX21tYXAoTlVMTCwgMCwgMCwgMCwgbmV3X2FkZHIsIDEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gZG9fbXVubWFwKG1tLCBuZXdfYWRkciwgbmV3X2xlbik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAob2xkX2xlbiA+PSBuZXdfbGVuKSB7CisJCXJldCA9IGRvX211bm1hcChtbSwgYWRkcituZXdfbGVuLCBvbGRfbGVuIC0gbmV3X2xlbik7CisJCWlmIChyZXQgJiYgb2xkX2xlbiAhPSBuZXdfbGVuKQorCQkJZ290byBvdXQ7CisJCW9sZF9sZW4gPSBuZXdfbGVuOworCX0KKworCXZtYSA9IHZtYV90b19yZXNpemUoYWRkciwgb2xkX2xlbiwgbmV3X2xlbiwgJmNoYXJnZWQpOworCWlmIChJU19FUlIodm1hKSkgeworCQlyZXQgPSBQVFJfRVJSKHZtYSk7CisJCWdvdG8gb3V0OworCX0KKworCW1hcF9mbGFncyA9IE1BUF9GSVhFRDsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFKQorCQltYXBfZmxhZ3MgfD0gTUFQX1NIQVJFRDsKKworCXJldCA9IGdldF91bm1hcHBlZF9hcmVhKHZtYS0+dm1fZmlsZSwgbmV3X2FkZHIsIG5ld19sZW4sIHZtYS0+dm1fcGdvZmYgKworCQkJCSgoYWRkciAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQpLAorCQkJCW1hcF9mbGFncyk7CisJaWYgKHJldCAmIH5QQUdFX01BU0spCisJCWdvdG8gb3V0MTsKKworCXJldCA9IG1vdmVfdm1hKHZtYSwgYWRkciwgb2xkX2xlbiwgbmV3X2xlbiwgbmV3X2FkZHIpOworCWlmICghKHJldCAmIH5QQUdFX01BU0spKQorCQlnb3RvIG91dDsKK291dDE6CisJdm1fdW5hY2N0X21lbW9yeShjaGFyZ2VkKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm1hX2V4cGFuZGFibGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgZGVsdGEpCit7CisJdW5zaWduZWQgbG9uZyBlbmQgPSB2bWEtPnZtX2VuZCArIGRlbHRhOworCWlmIChlbmQgPCB2bWEtPnZtX2VuZCkgLyogb3ZlcmZsb3cgKi8KKwkJcmV0dXJuIDA7CisJaWYgKHZtYS0+dm1fbmV4dCAmJiB2bWEtPnZtX25leHQtPnZtX3N0YXJ0IDwgZW5kKSAvKiBpbnRlcnNlY3Rpb24gKi8KKwkJcmV0dXJuIDA7CisJaWYgKGdldF91bm1hcHBlZF9hcmVhKE5VTEwsIHZtYS0+dm1fc3RhcnQsIGVuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgICAwLCBNQVBfRklYRUQpICYgflBBR0VfTUFTSykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKIC8qCiAgKiBFeHBhbmQgKG9yIHNocmluaykgYW4gZXhpc3RpbmcgbWFwcGluZywgcG90ZW50aWFsbHkgbW92aW5nIGl0IGF0IHRoZQogICogc2FtZSB0aW1lIChjb250cm9sbGVkIGJ5IHRoZSBNUkVNQVBfTUFZTU9WRSBmbGFnIGFuZCBhdmFpbGFibGUgVk0gc3BhY2UpCkBAIC0yOTQsMzIgKzQyNSwxMCBAQAogCWlmICghbmV3X2xlbikKIAkJZ290byBvdXQ7CiAKLQkvKiBuZXdfYWRkciBpcyBvbmx5IHZhbGlkIGlmIE1SRU1BUF9GSVhFRCBpcyBzcGVjaWZpZWQgKi8KIAlpZiAoZmxhZ3MgJiBNUkVNQVBfRklYRUQpIHsKLQkJaWYgKG5ld19hZGRyICYgflBBR0VfTUFTSykKLQkJCWdvdG8gb3V0OwotCQlpZiAoIShmbGFncyAmIE1SRU1BUF9NQVlNT1ZFKSkKLQkJCWdvdG8gb3V0OwotCi0JCWlmIChuZXdfbGVuID4gVEFTS19TSVpFIHx8IG5ld19hZGRyID4gVEFTS19TSVpFIC0gbmV3X2xlbikKLQkJCWdvdG8gb3V0OwotCi0JCS8qIENoZWNrIGlmIHRoZSBsb2NhdGlvbiB3ZSdyZSBtb3ZpbmcgaW50byBvdmVybGFwcyB0aGUKLQkJICogb2xkIGxvY2F0aW9uIGF0IGFsbCwgYW5kIGZhaWwgaWYgaXQgZG9lcy4KLQkJICovCi0JCWlmICgobmV3X2FkZHIgPD0gYWRkcikgJiYgKG5ld19hZGRyK25ld19sZW4pID4gYWRkcikKLQkJCWdvdG8gb3V0OwotCi0JCWlmICgoYWRkciA8PSBuZXdfYWRkcikgJiYgKGFkZHIrb2xkX2xlbikgPiBuZXdfYWRkcikKLQkJCWdvdG8gb3V0OwotCi0JCXJldCA9IHNlY3VyaXR5X2ZpbGVfbW1hcChOVUxMLCAwLCAwLCAwLCBuZXdfYWRkciwgMSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQotCQlyZXQgPSBkb19tdW5tYXAobW0sIG5ld19hZGRyLCBuZXdfbGVuKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OworCQlpZiAoZmxhZ3MgJiBNUkVNQVBfTUFZTU9WRSkKKwkJCXJldCA9IG1yZW1hcF90byhhZGRyLCBvbGRfbGVuLCBuZXdfYWRkciwgbmV3X2xlbik7CisJCWdvdG8gb3V0OwogCX0KIAogCS8qCkBAIC0zMzIsNjAgKzQ0MSwyMyBAQAogCQlpZiAocmV0ICYmIG9sZF9sZW4gIT0gbmV3X2xlbikKIAkJCWdvdG8gb3V0OwogCQlyZXQgPSBhZGRyOwotCQlpZiAoIShmbGFncyAmIE1SRU1BUF9GSVhFRCkgfHwgKG5ld19hZGRyID09IGFkZHIpKQotCQkJZ290byBvdXQ7Ci0JCW9sZF9sZW4gPSBuZXdfbGVuOworCQlnb3RvIG91dDsKIAl9CiAKIAkvKgotCSAqIE9rLCB3ZSBuZWVkIHRvIGdyb3cuLiAgb3IgcmVsb2NhdGUuCisJICogT2ssIHdlIG5lZWQgdG8gZ3Jvdy4uCiAJICovCi0JcmV0ID0gLUVGQVVMVDsKLQl2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcik7Ci0JaWYgKCF2bWEgfHwgdm1hLT52bV9zdGFydCA+IGFkZHIpCisJdm1hID0gdm1hX3RvX3Jlc2l6ZShhZGRyLCBvbGRfbGVuLCBuZXdfbGVuLCAmY2hhcmdlZCk7CisJaWYgKElTX0VSUih2bWEpKSB7CisJCXJldCA9IFBUUl9FUlIodm1hKTsKIAkJZ290byBvdXQ7Ci0JaWYgKGlzX3ZtX2h1Z2V0bGJfcGFnZSh2bWEpKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQkvKiBXZSBjYW4ndCByZW1hcCBhY3Jvc3Mgdm0gYXJlYSBib3VuZGFyaWVzICovCi0JaWYgKG9sZF9sZW4gPiB2bWEtPnZtX2VuZCAtIGFkZHIpCi0JCWdvdG8gb3V0OwotCWlmICh2bWEtPnZtX2ZsYWdzICYgKFZNX0RPTlRFWFBBTkQgfCBWTV9QRk5NQVApKSB7Ci0JCWlmIChuZXdfbGVuID4gb2xkX2xlbikKLQkJCWdvdG8gb3V0OwotCX0KLQlpZiAodm1hLT52bV9mbGFncyAmIFZNX0xPQ0tFRCkgewotCQl1bnNpZ25lZCBsb25nIGxvY2tlZCwgbG9ja19saW1pdDsKLQkJbG9ja2VkID0gbW0tPmxvY2tlZF92bSA8PCBQQUdFX1NISUZUOwotCQlsb2NrX2xpbWl0ID0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9NRU1MT0NLXS5ybGltX2N1cjsKLQkJbG9ja2VkICs9IG5ld19sZW4gLSBvbGRfbGVuOwotCQlyZXQgPSAtRUFHQUlOOwotCQlpZiAobG9ja2VkID4gbG9ja19saW1pdCAmJiAhY2FwYWJsZShDQVBfSVBDX0xPQ0spKQotCQkJZ290byBvdXQ7Ci0JfQotCWlmICghbWF5X2V4cGFuZF92bShtbSwgKG5ld19sZW4gLSBvbGRfbGVuKSA+PiBQQUdFX1NISUZUKSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAodm1hLT52bV9mbGFncyAmIFZNX0FDQ09VTlQpIHsKLQkJY2hhcmdlZCA9IChuZXdfbGVuIC0gb2xkX2xlbikgPj4gUEFHRV9TSElGVDsKLQkJaWYgKHNlY3VyaXR5X3ZtX2Vub3VnaF9tZW1vcnkoY2hhcmdlZCkpCi0JCQlnb3RvIG91dF9uYzsKIAl9CiAKIAkvKiBvbGRfbGVuIGV4YWN0bHkgdG8gdGhlIGVuZCBvZiB0aGUgYXJlYS4uCi0JICogQW5kIHdlJ3JlIG5vdCByZWxvY2F0aW5nIHRoZSBhcmVhLgogCSAqLwotCWlmIChvbGRfbGVuID09IHZtYS0+dm1fZW5kIC0gYWRkciAmJgotCSAgICAhKChmbGFncyAmIE1SRU1BUF9GSVhFRCkgJiYgKGFkZHIgIT0gbmV3X2FkZHIpKSAmJgotCSAgICAob2xkX2xlbiAhPSBuZXdfbGVuIHx8ICEoZmxhZ3MgJiBNUkVNQVBfTUFZTU9WRSkpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbWF4X2FkZHIgPSBUQVNLX1NJWkU7Ci0JCWlmICh2bWEtPnZtX25leHQpCi0JCQltYXhfYWRkciA9IHZtYS0+dm1fbmV4dC0+dm1fc3RhcnQ7CisJaWYgKG9sZF9sZW4gPT0gdm1hLT52bV9lbmQgLSBhZGRyKSB7CiAJCS8qIGNhbiB3ZSBqdXN0IGV4cGFuZCB0aGUgY3VycmVudCBtYXBwaW5nPyAqLwotCQlpZiAobWF4X2FkZHIgLSBhZGRyID49IG5ld19sZW4pIHsKKwkJaWYgKHZtYV9leHBhbmRhYmxlKHZtYSwgbmV3X2xlbiAtIG9sZF9sZW4pKSB7CiAJCQlpbnQgcGFnZXMgPSAobmV3X2xlbiAtIG9sZF9sZW4pID4+IFBBR0VfU0hJRlQ7CiAKIAkJCXZtYV9hZGp1c3Qodm1hLCB2bWEtPnZtX3N0YXJ0LApAQCAtNDA5LDI4ICs0ODEsMjcgQEAKIAkgKi8KIAlyZXQgPSAtRU5PTUVNOwogCWlmIChmbGFncyAmIE1SRU1BUF9NQVlNT1ZFKSB7Ci0JCWlmICghKGZsYWdzICYgTVJFTUFQX0ZJWEVEKSkgewotCQkJdW5zaWduZWQgbG9uZyBtYXBfZmxhZ3MgPSAwOwotCQkJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9NQVlTSEFSRSkKLQkJCQltYXBfZmxhZ3MgfD0gTUFQX1NIQVJFRDsKKwkJdW5zaWduZWQgbG9uZyBtYXBfZmxhZ3MgPSAwOworCQlpZiAodm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFKQorCQkJbWFwX2ZsYWdzIHw9IE1BUF9TSEFSRUQ7CiAKLQkJCW5ld19hZGRyID0gZ2V0X3VubWFwcGVkX2FyZWEodm1hLT52bV9maWxlLCAwLCBuZXdfbGVuLAotCQkJCQkJdm1hLT52bV9wZ29mZiwgbWFwX2ZsYWdzKTsKLQkJCWlmIChuZXdfYWRkciAmIH5QQUdFX01BU0spIHsKLQkJCQlyZXQgPSBuZXdfYWRkcjsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQotCQkJcmV0ID0gc2VjdXJpdHlfZmlsZV9tbWFwKE5VTEwsIDAsIDAsIDAsIG5ld19hZGRyLCAxKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBvdXQ7CisJCW5ld19hZGRyID0gZ2V0X3VubWFwcGVkX2FyZWEodm1hLT52bV9maWxlLCAwLCBuZXdfbGVuLAorCQkJCQl2bWEtPnZtX3Bnb2ZmICsKKwkJCQkJKChhZGRyIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVCksCisJCQkJCW1hcF9mbGFncyk7CisJCWlmIChuZXdfYWRkciAmIH5QQUdFX01BU0spIHsKKwkJCXJldCA9IG5ld19hZGRyOworCQkJZ290byBvdXQ7CiAJCX0KKworCQlyZXQgPSBzZWN1cml0eV9maWxlX21tYXAoTlVMTCwgMCwgMCwgMCwgbmV3X2FkZHIsIDEpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CiAJCXJldCA9IG1vdmVfdm1hKHZtYSwgYWRkciwgb2xkX2xlbiwgbmV3X2xlbiwgbmV3X2FkZHIpOwogCX0KIG91dDoKIAlpZiAocmV0ICYgflBBR0VfTUFTSykKIAkJdm1fdW5hY2N0X21lbW9yeShjaGFyZ2VkKTsKLW91dF9uYzoKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9tbS91dGlsLmMgYi9tbS91dGlsLmMKaW5kZXggN2MzNWFkOS4uYjM3N2NlNCAxMDA2NDQKLS0tIGEvbW0vdXRpbC5jCisrKyBiL21tL3V0aWwuYwpAQCAtNCw2ICs0LDEwIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwpAQCAtMjY4LDYgKzI3Miw0NiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ2V0X3VzZXJfcGFnZXNfZmFzdCk7CiAKK1NZU0NBTExfREVGSU5FNihtbWFwX3Bnb2ZmLCB1bnNpZ25lZCBsb25nLCBhZGRyLCB1bnNpZ25lZCBsb25nLCBsZW4sCisJCXVuc2lnbmVkIGxvbmcsIHByb3QsIHVuc2lnbmVkIGxvbmcsIGZsYWdzLAorCQl1bnNpZ25lZCBsb25nLCBmZCwgdW5zaWduZWQgbG9uZywgcGdvZmYpCit7CisJc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHJldHZhbCA9IC1FQkFERjsKKworCWlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKKwkJaWYgKHVubGlrZWx5KGZsYWdzICYgTUFQX0hVR0VUTEIpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWZpbGUgPSBmZ2V0KGZkKTsKKwkJaWYgKCFmaWxlKQorCQkJZ290byBvdXQ7CisJfSBlbHNlIGlmIChmbGFncyAmIE1BUF9IVUdFVExCKSB7CisJCXN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlciA9IE5VTEw7CisJCS8qCisJCSAqIFZNX05PUkVTRVJWRSBpcyB1c2VkIGJlY2F1c2UgdGhlIHJlc2VydmF0aW9ucyB3aWxsIGJlCisJCSAqIHRha2VuIHdoZW4gdm1fb3BzLT5tbWFwKCkgaXMgY2FsbGVkCisJCSAqIEEgZHVtbXkgdXNlciB2YWx1ZSBpcyB1c2VkIGJlY2F1c2Ugd2UgYXJlIG5vdCBsb2NraW5nCisJCSAqIG1lbW9yeSBzbyBubyBhY2NvdW50aW5nIGlzIG5lY2Vzc2FyeQorCQkgKi8KKwkJbGVuID0gQUxJR04obGVuLCBodWdlX3BhZ2Vfc2l6ZSgmZGVmYXVsdF9oc3RhdGUpKTsKKwkJZmlsZSA9IGh1Z2V0bGJfZmlsZV9zZXR1cChIVUdFVExCX0FOT05fRklMRSwgbGVuLCBWTV9OT1JFU0VSVkUsCisJCQkJCQkmdXNlciwgSFVHRVRMQl9BTk9OSFVHRV9JTk9ERSk7CisJCWlmIChJU19FUlIoZmlsZSkpCisJCQlyZXR1cm4gUFRSX0VSUihmaWxlKTsKKwl9CisKKwlmbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7CisKKwlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCXJldHZhbCA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCisJaWYgKGZpbGUpCisJCWZwdXQoZmlsZSk7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKwogLyogVHJhY2Vwb2ludHMgZGVmaW5pdGlvbnMuICovCiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woa21hbGxvYyk7CiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvYyk7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2h3X2JyZWFrcG9pbnQvZGF0YV9icmVha3BvaW50LmMgYi9zYW1wbGVzL2h3X2JyZWFrcG9pbnQvZGF0YV9icmVha3BvaW50LmMKaW5kZXggMjk1MjU1MC4uYzY5Y2JlOSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9od19icmVha3BvaW50L2RhdGFfYnJlYWtwb2ludC5jCisrKyBiL3NhbXBsZXMvaHdfYnJlYWtwb2ludC9kYXRhX2JyZWFrcG9pbnQuYwpAQCAtNDEsNyArNDEsOSBAQAogTU9EVUxFX1BBUk1fREVTQyhrc3ltLCAiS2VybmVsIHN5bWJvbCB0byBtb25pdG9yOyB0aGlzIG1vZHVsZSB3aWxsIHJlcG9ydCBhbnkiCiAJCQkiIHdyaXRlIG9wZXJhdGlvbnMgb24gdGhlIGtlcm5lbCBzeW1ib2wiKTsKIAotc3RhdGljIHZvaWQgc2FtcGxlX2hicF9oYW5kbGVyKHN0cnVjdCBwZXJmX2V2ZW50ICp0ZW1wLCB2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgc2FtcGxlX2hicF9oYW5kbGVyKHN0cnVjdCBwZXJmX2V2ZW50ICpicCwgaW50IG5taSwKKwkJCSAgICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqZGF0YSwKKwkJCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlwcmludGsoS0VSTl9JTkZPICIlcyB2YWx1ZSBpcyBjaGFuZ2VkXG4iLCBrc3ltX25hbWUpOwogCWR1bXBfc3RhY2soKTsKQEAgLTUxLDggKzUzLDkgQEAKIHN0YXRpYyBpbnQgX19pbml0IGh3X2JyZWFrX21vZHVsZV9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKLQlERUZJTkVfQlJFQUtQT0lOVF9BVFRSKGF0dHIpOworCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgYXR0cjsKIAorCWh3X2JyZWFrcG9pbnRfaW5pdCgmYXR0cik7CiAJYXR0ci5icF9hZGRyID0ga2FsbHN5bXNfbG9va3VwX25hbWUoa3N5bV9uYW1lKTsKIAlhdHRyLmJwX2xlbiA9IEhXX0JSRUFLUE9JTlRfTEVOXzQ7CiAJYXR0ci5icF90eXBlID0gSFdfQlJFQUtQT0lOVF9XIHwgSFdfQlJFQUtQT0lOVF9SOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jIGIvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jCmluZGV4IDYyYTkwMjUuLjZmNDI2YWYgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYworKysgYi9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogc3RhdGljIHZvaWQgZG9fdXNiX2VudHJ5KHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCwKIAkJCSB1bnNpZ25lZCBpbnQgYmNkRGV2aWNlX2luaXRpYWwsIGludCBiY2REZXZpY2VfaW5pdGlhbF9kaWdpdHMsCiAJCQkgdW5zaWduZWQgY2hhciByYW5nZV9sbywgdW5zaWduZWQgY2hhciByYW5nZV9oaSwKLQkJCSBzdHJ1Y3QgbW9kdWxlICptb2QpCisJCQkgdW5zaWduZWQgY2hhciBtYXgsIHN0cnVjdCBtb2R1bGUgKm1vZCkKIHsKIAljaGFyIGFsaWFzWzUwMF07CiAJc3RyY3B5KGFsaWFzLCAidXNiOiIpOwpAQCAtMTE4LDkgKzExOCwyMiBAQAogCQlzcHJpbnRmKGFsaWFzICsgc3RybGVuKGFsaWFzKSwgIiUwKlgiLAogCQkJYmNkRGV2aWNlX2luaXRpYWxfZGlnaXRzLCBiY2REZXZpY2VfaW5pdGlhbCk7CiAJaWYgKHJhbmdlX2xvID09IHJhbmdlX2hpKQotCQlzcHJpbnRmKGFsaWFzICsgc3RybGVuKGFsaWFzKSwgIiV1IiwgcmFuZ2VfbG8pOwotCWVsc2UgaWYgKHJhbmdlX2xvID4gMCB8fCByYW5nZV9oaSA8IDkpCi0JCXNwcmludGYoYWxpYXMgKyBzdHJsZW4oYWxpYXMpLCAiWyV1LSV1XSIsIHJhbmdlX2xvLCByYW5nZV9oaSk7CisJCXNwcmludGYoYWxpYXMgKyBzdHJsZW4oYWxpYXMpLCAiJVgiLCByYW5nZV9sbyk7CisJZWxzZSBpZiAocmFuZ2VfbG8gPiAwIHx8IHJhbmdlX2hpIDwgbWF4KSB7CisJCWlmIChyYW5nZV9sbyA+IDB4OSB8fCByYW5nZV9oaSA8IDB4QSkKKwkJCXNwcmludGYoYWxpYXMgKyBzdHJsZW4oYWxpYXMpLAorCQkJCSJbJVgtJVhdIiwKKwkJCQlyYW5nZV9sbywKKwkJCQlyYW5nZV9oaSk7CisJCWVsc2UgeworCQkJc3ByaW50ZihhbGlhcyArIHN0cmxlbihhbGlhcyksCisJCQkJcmFuZ2VfbG8gPCAweDkgPyAiWyVYLTkiIDogIlslWCIsCisJCQkJcmFuZ2VfbG8pOworCQkJc3ByaW50ZihhbGlhcyArIHN0cmxlbihhbGlhcyksCisJCQkJcmFuZ2VfaGkgPiAweEEgPyAiYS0lWF0iIDogIiVYXSIsCisJCQkJcmFuZ2VfbG8pOworCQl9CisJfQogCWlmIChiY2REZXZpY2VfaW5pdGlhbF9kaWdpdHMgPCAoc2l6ZW9mKGlkLT5iY2REZXZpY2VfbG8pICogMiAtIDEpKQogCQlzdHJjYXQoYWxpYXMsICIqIik7CiAKQEAgLTE0NywxMCArMTYwLDQ5IEBACiAJCSAgICJNT0RVTEVfQUxJQVMoXCIlc1wiKTtcbiIsIGFsaWFzKTsKIH0KIAorLyogSGFuZGxlcyBpbmNyZW1lbnQvZGVjcmVtZW50IG9mIEJDRCBmb3JtYXR0ZWQgaW50ZWdlcnMgKi8KKy8qIFJldHVybnMgdGhlIHByZXZpb3VzIHZhbHVlLCBzbyBpdCB3b3JrcyBsaWtlIGkrKyBvciBpLS0gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5jYmNkKHVuc2lnbmVkIGludCAqYmNkLAorCQkJICAgaW50IGluYywKKwkJCSAgIHVuc2lnbmVkIGNoYXIgbWF4LAorCQkJICAgc2l6ZV90IGNoYXJzKQoreworCXVuc2lnbmVkIGludCBpbml0ID0gKmJjZCwgaSwgajsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYywgZGVjID0gMDsKKworCS8qIElmIGJjZCBpcyBub3QgaW4gQkNEIGZvcm1hdCwganVzdCBpbmNyZW1lbnQgKi8KKwlpZiAobWF4ID4gMHg5KSB7CisJCSpiY2QgKz0gaW5jOworCQlyZXR1cm4gaW5pdDsKKwl9CisKKwkvKiBDb252ZXJ0IEJDRCB0byBEZWNpbWFsICovCisJZm9yIChpPTAgOyBpIDwgY2hhcnMgOyBpKyspIHsKKwkJYyA9ICgqYmNkID4+IChpIDw8IDIpKSAmIDB4ZjsKKwkJYyA9IGMgPiA5ID8gOSA6IGM7IC8qIGZvcmNlIHRvIGJjZCBqdXN0IGluIGNhc2UgKi8KKwkJZm9yIChqPTAgOyBqIDwgaSA7IGorKykKKwkJCWMgPSBjICogMTA7CisJCWRlYyArPSBjOworCX0KKworCS8qIERvIG91ciBpbmNyZW1lbnQvZGVjcmVtZW50ICovCisJZGVjICs9IGluYzsKKwkqYmNkICA9IDA7CisKKwkvKiBDb252ZXJ0IGJhY2sgdG8gQkNEICovCisJZm9yIChpPTAgOyBpIDwgY2hhcnMgOyBpKyspIHsKKwkJZm9yIChjPTEsaj0wIDsgaiA8IGkgOyBqKyspCisJCQljID0gYyAqIDEwOworCQljID0gKGRlYyAvIGMpICUgMTA7CisJCSpiY2QgKz0gYyA8PCAoaSA8PCAyKTsKKwl9CisJcmV0dXJuIGluaXQ7Cit9CisKIHN0YXRpYyB2b2lkIGRvX3VzYl9lbnRyeV9tdWx0aShzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQsIHN0cnVjdCBtb2R1bGUgKm1vZCkKIHsKIAl1bnNpZ25lZCBpbnQgZGV2bG8sIGRldmhpOwotCXVuc2lnbmVkIGNoYXIgY2hpLCBjbG87CisJdW5zaWduZWQgY2hhciBjaGksIGNsbywgbWF4OwogCWludCBuZGlnaXRzOwogCiAJaWQtPm1hdGNoX2ZsYWdzID0gVE9fTkFUSVZFKGlkLT5tYXRjaF9mbGFncyk7CkBAIC0xNjIsNiArMjE0LDE3IEBACiAJZGV2aGkgPSBpZC0+bWF0Y2hfZmxhZ3MgJiBVU0JfREVWSUNFX0lEX01BVENIX0RFVl9ISSA/CiAJCVRPX05BVElWRShpZC0+YmNkRGV2aWNlX2hpKSA6IH4weDBVOwogCisJLyogRmlndXJlIG91dCBpZiB0aGlzIGVudHJ5IGlzIGluIGJjZCBvciBoZXggZm9ybWF0ICovCisJbWF4ID0gMHg5OyAvKiBEZWZhdWx0IHRvIGRlY2ltYWwgZm9ybWF0ICovCisJZm9yIChuZGlnaXRzID0gMCA7IG5kaWdpdHMgPCBzaXplb2YoaWQtPmJjZERldmljZV9sbykgKiAyIDsgbmRpZ2l0cysrKSB7CisJCWNsbyA9IChkZXZsbyA+PiAobmRpZ2l0cyA8PCAyKSkgJiAweGY7CisJCWNoaSA9ICgoZGV2aGkgPiAweDk5OTkgPyAweDk5OTkgOiBkZXZoaSkgPj4gKG5kaWdpdHMgPDwgMikpICYgMHhmOworCQlpZiAoY2xvID4gbWF4IHx8IGNoaSA+IG1heCkgeworCQkJbWF4ID0gMHhmOworCQkJYnJlYWs7CisJCX0KKwl9CisKIAkvKgogCSAqIFNvbWUgbW9kdWxlcyAodmlzb3IpIGhhdmUgZW1wdHkgc2xvdHMgYXMgcGxhY2Vob2xkZXIgZm9yCiAJICogcnVuLXRpbWUgc3BlY2lmaWNhdGlvbiB0aGF0IHJlc3VsdHMgaW4gY2F0Y2gtYWxsIGFsaWFzCkBAIC0xNzMsMjEgKzIzNiwyNyBAQAogCWZvciAobmRpZ2l0cyA9IHNpemVvZihpZC0+YmNkRGV2aWNlX2xvKSAqIDIgLSAxOyBkZXZsbyA8PSBkZXZoaTsgbmRpZ2l0cy0tKSB7CiAJCWNsbyA9IGRldmxvICYgMHhmOwogCQljaGkgPSBkZXZoaSAmIDB4ZjsKLQkJaWYgKGNoaSA+IDkpCS8qIGl0J3MgYmNkIG5vdCBoZXggKi8KLQkJCWNoaSA9IDk7CisJCWlmIChjaGkgPiBtYXgpCS8qIElmIHdlIGFyZSBpbiBiY2QgbW9kZSwgdHJ1bmNhdGUgaWYgbmVjZXNzYXJ5ICovCisJCQljaGkgPSBtYXg7CiAJCWRldmxvID4+PSA0OwogCQlkZXZoaSA+Pj0gNDsKIAogCQlpZiAoZGV2bG8gPT0gZGV2aGkgfHwgIW5kaWdpdHMpIHsKLQkJCWRvX3VzYl9lbnRyeShpZCwgZGV2bG8sIG5kaWdpdHMsIGNsbywgY2hpLCBtb2QpOworCQkJZG9fdXNiX2VudHJ5KGlkLCBkZXZsbywgbmRpZ2l0cywgY2xvLCBjaGksIG1heCwgbW9kKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKGNsbyA+IDApCi0JCQlkb191c2JfZW50cnkoaWQsIGRldmxvKyssIG5kaWdpdHMsIGNsbywgOSwgbW9kKTsKKwkJaWYgKGNsbyA+IDB4MCkKKwkJCWRvX3VzYl9lbnRyeShpZCwKKwkJCQkgICAgIGluY2JjZCgmZGV2bG8sIDEsIG1heCwKKwkJCQkJICAgIHNpemVvZihpZC0+YmNkRGV2aWNlX2xvKSAqIDIpLAorCQkJCSAgICAgbmRpZ2l0cywgY2xvLCBtYXgsIG1heCwgbW9kKTsKIAotCQlpZiAoY2hpIDwgOSkKLQkJCWRvX3VzYl9lbnRyeShpZCwgZGV2aGktLSwgbmRpZ2l0cywgMCwgY2hpLCBtb2QpOworCQlpZiAoY2hpIDwgbWF4KQorCQkJZG9fdXNiX2VudHJ5KGlkLAorCQkJCSAgICAgaW5jYmNkKCZkZXZoaSwgLTEsIG1heCwKKwkJCQkJICAgIHNpemVvZihpZC0+YmNkRGV2aWNlX2xvKSAqIDIpLAorCQkJCSAgICAgbmRpZ2l0cywgMHgwLCBjaGksIG1heCwgbW9kKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcmF3bWlkaS5jIGIvc291bmQvY29yZS9yYXdtaWRpLmMKaW5kZXggMmY3NjYxMi4uMGY1YTE5NCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9yYXdtaWRpLmMKKysrIGIvc291bmQvY29yZS9yYXdtaWRpLmMKQEAgLTEyNTcsNyArMTI1Nyw3IEBACiAJCQlicmVhazsKIAkJY291bnQgLT0gY291bnQxOwogCX0KLQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykgeworCWlmIChmaWxlLT5mX2ZsYWdzICYgT19EU1lOQykgewogCQlzcGluX2xvY2tfaXJxKCZydW50aW1lLT5sb2NrKTsKIAkJd2hpbGUgKHJ1bnRpbWUtPmF2YWlsICE9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKSB7CiAJCQl3YWl0X3F1ZXVlX3Qgd2FpdDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWttZW0udHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYta21lbS50eHQKaW5kZXggNDRiMGNlMy4uZWFjNGQ4NTJlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1rbWVtLnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1rbWVtLnR4dApAQCAtOCwxNiArOCwxNiBAQAogU1lOT1BTSVMKIC0tLS0tLS0tCiBbdmVyc2VdCi0ncGVyZiBrbWVtJyB7cmVjb3JkfSBbPG9wdGlvbnM+XQorJ3BlcmYga21lbScge3JlY29yZHxzdGF0fSBbPG9wdGlvbnM+XQogCiBERVNDUklQVElPTgogLS0tLS0tLS0tLS0KLVRoZXJlJ3MgdHdvIHZhcmlhbnRzIG9mIHBlcmYga21lbToKK1RoZXJlIGFyZSB0d28gdmFyaWFudHMgb2YgcGVyZiBrbWVtOgogCiAgICdwZXJmIGttZW0gcmVjb3JkIDxjb21tYW5kPicgdG8gcmVjb3JkIHRoZSBrbWVtIGV2ZW50cwogICBvZiBhbiBhcmJpdHJhcnkgd29ya2xvYWQuCiAKLSAgJ3BlcmYga21lbScgdG8gcmVwb3J0IGtlcm5lbCBtZW1vcnkgc3RhdGlzdGljcy4KKyAgJ3BlcmYga21lbSBzdGF0JyB0byByZXBvcnQga2VybmVsIG1lbW9yeSBzdGF0aXN0aWNzLgogCiBPUFRJT05TCiAtLS0tLS0tCkBAIC0yNSw4ICsyNSwxMSBAQAogLS1pbnB1dD08ZmlsZT46OgogCVNlbGVjdCB0aGUgaW5wdXQgZmlsZSAoZGVmYXVsdDogcGVyZi5kYXRhKQogCi0tLXN0YXQ9PGNhbGxlcnxhbGxvYz46OgotCVNlbGVjdCBwZXIgY2FsbHNpdGUgb3IgcGVyIGFsbG9jYXRpb24gc3RhdGlzdGljcworLS1jYWxsZXI6OgorCVNob3cgcGVyLWNhbGxzaXRlIHN0YXRpc3RpY3MKKworLS1hbGxvYzo6CisJU2hvdyBwZXItYWxsb2NhdGlvbiBzdGF0aXN0aWNzCiAKIC1zIDxrZXlbLGtleTIuLi5dPjo6CiAtLXNvcnQ9PGtleVssa2V5Mi4uLl0+OjoKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXByb2JlLnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXByb2JlLnR4dAppbmRleCA5MjcwNTk0Li44ZmE2YmY5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1wcm9iZS50eHQKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcHJvYmUudHh0CkBAIC04LDEwICs4LDEzIEBACiBTWU5PUFNJUwogLS0tLS0tLS0KIFt2ZXJzZV0KLSdwZXJmIHByb2JlJyBbb3B0aW9uc10gLS1hZGQgJ1BST0JFJyBbLS1hZGQgJ1BST0JFJyAuLi5dCisncGVyZiBwcm9iZScgW29wdGlvbnNdIC0tYWRkPSdQUk9CRScgWy4uLl0KIG9yCi0ncGVyZiBwcm9iZScgW29wdGlvbnNdICdQUk9CRScgWydQUk9CRScgLi4uXQotCisncGVyZiBwcm9iZScgW29wdGlvbnNdIFBST0JFCitvcgorJ3BlcmYgcHJvYmUnIFtvcHRpb25zXSAtLWRlbD0nW0dST1VQOl1FVkVOVCcgWy4uLl0KK29yCisncGVyZiBwcm9iZScgLS1saXN0CiAKIERFU0NSSVBUSU9OCiAtLS0tLS0tLS0tLQpAQCAtMzEsOCArMzQsMTYgQEAKICAgICAgICAgQmUgbW9yZSB2ZXJib3NlIChzaG93IHBhcnNlZCBhcmd1bWVudHMsIGV0YykuCiAKIC1hOjoKLS0tYWRkOjoKLQlEZWZpbmUgYSBwcm9iZSBwb2ludCAoc2VlIFBST0JFIFNZTlRBWCBmb3IgZGV0YWlsKQorLS1hZGQ9OjoKKwlEZWZpbmUgYSBwcm9iZSBldmVudCAoc2VlIFBST0JFIFNZTlRBWCBmb3IgZGV0YWlsKS4KKworLWQ6OgorLS1kZWw9OjoKKwlEZWxldGUgYSBwcm9iZSBldmVudC4KKworLWw6OgorLS1saXN0OjoKKwlMaXN0IHVwIGN1cnJlbnQgcHJvYmUgZXZlbnRzLgogCiBQUk9CRSBTWU5UQVgKIC0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWJ1aWxkaWQtbGlzdC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLWJ1aWxkaWQtbGlzdC5jCmluZGV4IDdkZWU5ZDE5Li5kY2I2MTQzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tYnVpbGRpZC1saXN0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWJ1aWxkaWQtbGlzdC5jCkBAIC0xOSw3ICsxOSw3IEBACiBzdGF0aWMgaW50IGZvcmNlOwogCiBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYnVpbGRpZF9saXN0X3VzYWdlW10gPSB7Ci0JInBlcmYgcmVwb3J0IFs8b3B0aW9ucz5dIiwKKwkicGVyZiBidWlsZGlkLWxpc3QgWzxvcHRpb25zPl0iLAogCU5VTEwKIH07CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1rbWVtLmMgYi90b29scy9wZXJmL2J1aWx0aW4ta21lbS5jCmluZGV4IDA0N2ZlZjcuLjVmMjA5NTEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1rbWVtLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWttZW0uYwpAQCAtNTcsMTEgKzU3LDYgQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRvdGFsX3JlcXVlc3RlZCwgdG90YWxfYWxsb2NhdGVkOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgbnJfYWxsb2NzLCBucl9jcm9zc19hbGxvY3M7CiAKLXN0cnVjdCByYXdfZXZlbnRfc2FtcGxlIHsKLQl1MzIgc2l6ZTsKLQljaGFyIGRhdGFbMF07Ci19OwotCiAjZGVmaW5lIFBBVEhfU1lTX05PREUJIi9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZSIKIAogc3RhdGljIHZvaWQgaW5pdF9jcHVub2RlX21hcCh2b2lkKQpAQCAtMjAxLDcgKzE5Niw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBwcm9jZXNzX2FsbG9jX2V2ZW50KHN0cnVjdCByYXdfZXZlbnRfc2FtcGxlICpyYXcsCitzdGF0aWMgdm9pZCBwcm9jZXNzX2FsbG9jX2V2ZW50KHZvaWQgKmRhdGEsCiAJCQkJc3RydWN0IGV2ZW50ICpldmVudCwKIAkJCQlpbnQgY3B1LAogCQkJCXU2NCB0aW1lc3RhbXAgX191c2VkLApAQCAtMjE0LDEwICsyMDksMTAgQEAKIAlpbnQgYnl0ZXNfYWxsb2M7CiAJaW50IG5vZGUxLCBub2RlMjsKIAotCXB0ciA9IHJhd19maWVsZF92YWx1ZShldmVudCwgInB0ciIsIHJhdy0+ZGF0YSk7Ci0JY2FsbF9zaXRlID0gcmF3X2ZpZWxkX3ZhbHVlKGV2ZW50LCAiY2FsbF9zaXRlIiwgcmF3LT5kYXRhKTsKLQlieXRlc19yZXEgPSByYXdfZmllbGRfdmFsdWUoZXZlbnQsICJieXRlc19yZXEiLCByYXctPmRhdGEpOwotCWJ5dGVzX2FsbG9jID0gcmF3X2ZpZWxkX3ZhbHVlKGV2ZW50LCAiYnl0ZXNfYWxsb2MiLCByYXctPmRhdGEpOworCXB0ciA9IHJhd19maWVsZF92YWx1ZShldmVudCwgInB0ciIsIGRhdGEpOworCWNhbGxfc2l0ZSA9IHJhd19maWVsZF92YWx1ZShldmVudCwgImNhbGxfc2l0ZSIsIGRhdGEpOworCWJ5dGVzX3JlcSA9IHJhd19maWVsZF92YWx1ZShldmVudCwgImJ5dGVzX3JlcSIsIGRhdGEpOworCWJ5dGVzX2FsbG9jID0gcmF3X2ZpZWxkX3ZhbHVlKGV2ZW50LCAiYnl0ZXNfYWxsb2MiLCBkYXRhKTsKIAogCWluc2VydF9hbGxvY19zdGF0KGNhbGxfc2l0ZSwgcHRyLCBieXRlc19yZXEsIGJ5dGVzX2FsbG9jLCBjcHUpOwogCWluc2VydF9jYWxsZXJfc3RhdChjYWxsX3NpdGUsIGJ5dGVzX3JlcSwgYnl0ZXNfYWxsb2MpOwpAQCAtMjI3LDcgKzIyMiw3IEBACiAKIAlpZiAobm9kZSkgewogCQlub2RlMSA9IGNwdW5vZGVfbWFwW2NwdV07Ci0JCW5vZGUyID0gcmF3X2ZpZWxkX3ZhbHVlKGV2ZW50LCAibm9kZSIsIHJhdy0+ZGF0YSk7CisJCW5vZGUyID0gcmF3X2ZpZWxkX3ZhbHVlKGV2ZW50LCAibm9kZSIsIGRhdGEpOwogCQlpZiAobm9kZTEgIT0gbm9kZTIpCiAJCQlucl9jcm9zc19hbGxvY3MrKzsKIAl9CkBAIC0yNjIsNyArMjU3LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgcHJvY2Vzc19mcmVlX2V2ZW50KHN0cnVjdCByYXdfZXZlbnRfc2FtcGxlICpyYXcsCitzdGF0aWMgdm9pZCBwcm9jZXNzX2ZyZWVfZXZlbnQodm9pZCAqZGF0YSwKIAkJCSAgICAgICBzdHJ1Y3QgZXZlbnQgKmV2ZW50LAogCQkJICAgICAgIGludCBjcHUsCiAJCQkgICAgICAgdTY0IHRpbWVzdGFtcCBfX3VzZWQsCkBAIC0yNzEsNyArMjY2LDcgQEAKIAl1bnNpZ25lZCBsb25nIHB0cjsKIAlzdHJ1Y3QgYWxsb2Nfc3RhdCAqc19hbGxvYywgKnNfY2FsbGVyOwogCi0JcHRyID0gcmF3X2ZpZWxkX3ZhbHVlKGV2ZW50LCAicHRyIiwgcmF3LT5kYXRhKTsKKwlwdHIgPSByYXdfZmllbGRfdmFsdWUoZXZlbnQsICJwdHIiLCBkYXRhKTsKIAogCXNfYWxsb2MgPSBzZWFyY2hfYWxsb2Nfc3RhdChwdHIsIDAsICZyb290X2FsbG9jX3N0YXQsIHB0cl9jbXApOwogCWlmICghc19hbGxvYykKQEAgLTI4OSw2NiArMjg0LDUzIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1wcm9jZXNzX3Jhd19ldmVudChldmVudF90ICpyYXdfZXZlbnQgX191c2VkLCB2b2lkICptb3JlX2RhdGEsCitwcm9jZXNzX3Jhd19ldmVudChldmVudF90ICpyYXdfZXZlbnQgX191c2VkLCB2b2lkICpkYXRhLAogCQkgIGludCBjcHUsIHU2NCB0aW1lc3RhbXAsIHN0cnVjdCB0aHJlYWQgKnRocmVhZCkKIHsKLQlzdHJ1Y3QgcmF3X2V2ZW50X3NhbXBsZSAqcmF3ID0gbW9yZV9kYXRhOwogCXN0cnVjdCBldmVudCAqZXZlbnQ7CiAJaW50IHR5cGU7CiAKLQl0eXBlID0gdHJhY2VfcGFyc2VfY29tbW9uX3R5cGUocmF3LT5kYXRhKTsKKwl0eXBlID0gdHJhY2VfcGFyc2VfY29tbW9uX3R5cGUoZGF0YSk7CiAJZXZlbnQgPSB0cmFjZV9maW5kX2V2ZW50KHR5cGUpOwogCiAJaWYgKCFzdHJjbXAoZXZlbnQtPm5hbWUsICJrbWFsbG9jIikgfHwKIAkgICAgIXN0cmNtcChldmVudC0+bmFtZSwgImttZW1fY2FjaGVfYWxsb2MiKSkgewotCQlwcm9jZXNzX2FsbG9jX2V2ZW50KHJhdywgZXZlbnQsIGNwdSwgdGltZXN0YW1wLCB0aHJlYWQsIDApOworCQlwcm9jZXNzX2FsbG9jX2V2ZW50KGRhdGEsIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkLCAwKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmICghc3RyY21wKGV2ZW50LT5uYW1lLCAia21hbGxvY19ub2RlIikgfHwKIAkgICAgIXN0cmNtcChldmVudC0+bmFtZSwgImttZW1fY2FjaGVfYWxsb2Nfbm9kZSIpKSB7Ci0JCXByb2Nlc3NfYWxsb2NfZXZlbnQocmF3LCBldmVudCwgY3B1LCB0aW1lc3RhbXAsIHRocmVhZCwgMSk7CisJCXByb2Nlc3NfYWxsb2NfZXZlbnQoZGF0YSwgZXZlbnQsIGNwdSwgdGltZXN0YW1wLCB0aHJlYWQsIDEpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKCFzdHJjbXAoZXZlbnQtPm5hbWUsICJrZnJlZSIpIHx8CiAJICAgICFzdHJjbXAoZXZlbnQtPm5hbWUsICJrbWVtX2NhY2hlX2ZyZWUiKSkgewotCQlwcm9jZXNzX2ZyZWVfZXZlbnQocmF3LCBldmVudCwgY3B1LCB0aW1lc3RhbXAsIHRocmVhZCk7CisJCXByb2Nlc3NfZnJlZV9ldmVudChkYXRhLCBldmVudCwgY3B1LCB0aW1lc3RhbXAsIHRocmVhZCk7CiAJCXJldHVybjsKIAl9CiB9CiAKIHN0YXRpYyBpbnQgcHJvY2Vzc19zYW1wbGVfZXZlbnQoZXZlbnRfdCAqZXZlbnQpCiB7Ci0JdTY0IGlwID0gZXZlbnQtPmlwLmlwOwotCXU2NCB0aW1lc3RhbXAgPSAtMTsKLQl1MzIgY3B1ID0gLTE7Ci0JdTY0IHBlcmlvZCA9IDE7Ci0Jdm9pZCAqbW9yZV9kYXRhID0gZXZlbnQtPmlwLl9fbW9yZV9kYXRhOwotCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IHRocmVhZHNfX2ZpbmRuZXcoZXZlbnQtPmlwLnBpZCk7CisJc3RydWN0IHNhbXBsZV9kYXRhIGRhdGE7CisJc3RydWN0IHRocmVhZCAqdGhyZWFkOwogCi0JaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfVElNRSkgewotCQl0aW1lc3RhbXAgPSAqKHU2NCAqKW1vcmVfZGF0YTsKLQkJbW9yZV9kYXRhICs9IHNpemVvZih1NjQpOwotCX0KKwltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisJZGF0YS50aW1lID0gLTE7CisJZGF0YS5jcHUgPSAtMTsKKwlkYXRhLnBlcmlvZCA9IDE7CiAKLQlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9DUFUpIHsKLQkJY3B1ID0gKih1MzIgKiltb3JlX2RhdGE7Ci0JCW1vcmVfZGF0YSArPSBzaXplb2YodTMyKTsKLQkJbW9yZV9kYXRhICs9IHNpemVvZih1MzIpOyAvKiByZXNlcnZlZCAqLwotCX0KLQotCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1BFUklPRCkgewotCQlwZXJpb2QgPSAqKHU2NCAqKW1vcmVfZGF0YTsKLQkJbW9yZV9kYXRhICs9IHNpemVvZih1NjQpOwotCX0KKwlldmVudF9fcGFyc2Vfc2FtcGxlKGV2ZW50LCBzYW1wbGVfdHlwZSwgJmRhdGEpOwogCiAJZHVtcF9wcmludGYoIihJUCwgJWQpOiAlZC8lZDogJXAgcGVyaW9kOiAlTGRcbiIsCiAJCWV2ZW50LT5oZWFkZXIubWlzYywKLQkJZXZlbnQtPmlwLnBpZCwgZXZlbnQtPmlwLnRpZCwKLQkJKHZvaWQgKikobG9uZylpcCwKLQkJKGxvbmcgbG9uZylwZXJpb2QpOworCQlkYXRhLnBpZCwgZGF0YS50aWQsCisJCSh2b2lkICopKGxvbmcpZGF0YS5pcCwKKwkJKGxvbmcgbG9uZylkYXRhLnBlcmlvZCk7CiAKKwl0aHJlYWQgPSB0aHJlYWRzX19maW5kbmV3KGV2ZW50LT5pcC5waWQpOwogCWlmICh0aHJlYWQgPT0gTlVMTCkgewogCQlwcl9kZWJ1ZygicHJvYmxlbSBwcm9jZXNzaW5nICVkIGV2ZW50LCBza2lwcGluZyBpdC5cbiIsCiAJCQkgZXZlbnQtPmhlYWRlci50eXBlKTsKQEAgLTM1Nyw3ICszMzksOCBAQAogCiAJZHVtcF9wcmludGYoIiAuLi4gdGhyZWFkOiAlczolZFxuIiwgdGhyZWFkLT5jb21tLCB0aHJlYWQtPnBpZCk7CiAKLQlwcm9jZXNzX3Jhd19ldmVudChldmVudCwgbW9yZV9kYXRhLCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKKwlwcm9jZXNzX3Jhd19ldmVudChldmVudCwgZGF0YS5yYXdfZGF0YSwgZGF0YS5jcHUsCisJCQkgIGRhdGEudGltZSwgdGhyZWFkKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTQzLDcgKzUyNiw3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga21lbV91c2FnZVtdID0gewotCSJwZXJmIGttZW0gWzxvcHRpb25zPl0ge3JlY29yZH0iLAorCSJwZXJmIGttZW0gWzxvcHRpb25zPl0ge3JlY29yZHxzdGF0fSIsCiAJTlVMTAogfTsKIApAQCAtNzAzLDE4ICs2ODYsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwYXJzZV9zdGF0X29wdChjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQgX191c2VkLAotCQkJICBjb25zdCBjaGFyICphcmcsIGludCB1bnNldCBfX3VzZWQpCitzdGF0aWMgaW50IHBhcnNlX2NhbGxlcl9vcHQoY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0IF9fdXNlZCwKKwkJCSAgY29uc3QgY2hhciAqYXJnIF9fdXNlZCwgaW50IHVuc2V0IF9fdXNlZCkKIHsKLQlpZiAoIWFyZykKLQkJcmV0dXJuIC0xOworCWNhbGxlcl9mbGFnID0gKGFsbG9jX2ZsYWcgKyAxKTsKKwlyZXR1cm4gMDsKK30KIAotCWlmIChzdHJjbXAoYXJnLCAiYWxsb2MiKSA9PSAwKQotCQlhbGxvY19mbGFnID0gKGNhbGxlcl9mbGFnICsgMSk7Ci0JZWxzZSBpZiAoc3RyY21wKGFyZywgImNhbGxlciIpID09IDApCi0JCWNhbGxlcl9mbGFnID0gKGFsbG9jX2ZsYWcgKyAxKTsKLQllbHNlCi0JCXJldHVybiAtMTsKK3N0YXRpYyBpbnQgcGFyc2VfYWxsb2Nfb3B0KGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCBfX3VzZWQsCisJCQkgIGNvbnN0IGNoYXIgKmFyZyBfX3VzZWQsIGludCB1bnNldCBfX3VzZWQpCit7CisJYWxsb2NfZmxhZyA9IChjYWxsZXJfZmxhZyArIDEpOwogCXJldHVybiAwOwogfQogCkBAIC03MzksMTQgKzcyMSwxNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24ga21lbV9vcHRpb25zW10gPSB7CiAJT1BUX1NUUklORygnaScsICJpbnB1dCIsICZpbnB1dF9uYW1lLCAiZmlsZSIsCiAJCSAgICJpbnB1dCBmaWxlIG5hbWUiKSwKLQlPUFRfQ0FMTEJBQ0soMCwgInN0YXQiLCBOVUxMLCAiPGFsbG9jPnw8Y2FsbGVyPiIsCi0JCSAgICAgInN0YXQgc2VsZWN0b3IsIFBhc3MgJ2FsbG9jJyBvciAnY2FsbGVyJy4iLAotCQkgICAgIHBhcnNlX3N0YXRfb3B0KSwKKwlPUFRfQ0FMTEJBQ0tfTk9PUFQoMCwgImNhbGxlciIsIE5VTEwsIE5VTEwsCisJCQkgICAic2hvdyBwZXItY2FsbHNpdGUgc3RhdGlzdGljcyIsCisJCQkgICBwYXJzZV9jYWxsZXJfb3B0KSwKKwlPUFRfQ0FMTEJBQ0tfTk9PUFQoMCwgImFsbG9jIiwgTlVMTCwgTlVMTCwKKwkJCSAgICJzaG93IHBlci1hbGxvY2F0aW9uIHN0YXRpc3RpY3MiLAorCQkJICAgcGFyc2VfYWxsb2Nfb3B0KSwKIAlPUFRfQ0FMTEJBQ0soJ3MnLCAic29ydCIsIE5VTEwsICJrZXlbLGtleTIuLi5dIiwKIAkJICAgICAic29ydCBieSBrZXlzOiBwdHIsIGNhbGxfc2l0ZSwgYnl0ZXMsIGhpdCwgcGluZ3BvbmcsIGZyYWciLAogCQkgICAgIHBhcnNlX3NvcnRfb3B0KSwKIAlPUFRfQ0FMTEJBQ0soJ2wnLCAibGluZSIsIE5VTEwsICJudW0iLAotCQkgICAgICJzaG93IG4gbGlucyIsCisJCSAgICAgInNob3cgbiBsaW5lcyIsCiAJCSAgICAgcGFyc2VfbGluZV9vcHQpLAogCU9QVF9CT09MRUFOKDAsICJyYXctaXAiLCAmcmF3X2lwLCAic2hvdyByYXcgaXAgaW5zdGVhZCBvZiBzeW1ib2wiKSwKIAlPUFRfRU5EKCkKQEAgLTc5MCwxOCArNzc1LDIyIEBACiAKIAlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBrbWVtX29wdGlvbnMsIGttZW1fdXNhZ2UsIDApOwogCi0JaWYgKGFyZ2MgJiYgIXN0cm5jbXAoYXJndlswXSwgInJlYyIsIDMpKQotCQlyZXR1cm4gX19jbWRfcmVjb3JkKGFyZ2MsIGFyZ3YpOwotCWVsc2UgaWYgKGFyZ2MpCisJaWYgKCFhcmdjKQogCQl1c2FnZV93aXRoX29wdGlvbnMoa21lbV91c2FnZSwga21lbV9vcHRpb25zKTsKIAotCWlmIChsaXN0X2VtcHR5KCZjYWxsZXJfc29ydCkpCi0JCXNldHVwX3NvcnRpbmcoJmNhbGxlcl9zb3J0LCBkZWZhdWx0X3NvcnRfb3JkZXIpOwotCWlmIChsaXN0X2VtcHR5KCZhbGxvY19zb3J0KSkKLQkJc2V0dXBfc29ydGluZygmYWxsb2Nfc29ydCwgZGVmYXVsdF9zb3J0X29yZGVyKTsKKwlpZiAoIXN0cm5jbXAoYXJndlswXSwgInJlYyIsIDMpKSB7CisJCXJldHVybiBfX2NtZF9yZWNvcmQoYXJnYywgYXJndik7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMF0sICJzdGF0IikpIHsKKwkJc2V0dXBfY3B1bm9kZV9tYXAoKTsKIAotCXNldHVwX2NwdW5vZGVfbWFwKCk7CisJCWlmIChsaXN0X2VtcHR5KCZjYWxsZXJfc29ydCkpCisJCQlzZXR1cF9zb3J0aW5nKCZjYWxsZXJfc29ydCwgZGVmYXVsdF9zb3J0X29yZGVyKTsKKwkJaWYgKGxpc3RfZW1wdHkoJmFsbG9jX3NvcnQpKQorCQkJc2V0dXBfc29ydGluZygmYWxsb2Nfc29ydCwgZGVmYXVsdF9zb3J0X29yZGVyKTsKIAotCXJldHVybiBfX2NtZF9rbWVtKCk7CisJCXJldHVybiBfX2NtZF9rbWVtKCk7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1wcm9iZS5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXByb2JlLmMKaW5kZXggYTU4ZTExYi4uNWE0N2MxZSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXByb2JlLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXByb2JlLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlICJwZXJmLmgiCiAjaW5jbHVkZSAiYnVpbHRpbi5oIgogI2luY2x1ZGUgInV0aWwvdXRpbC5oIgorI2luY2x1ZGUgInV0aWwvc3RybGlzdC5oIgogI2luY2x1ZGUgInV0aWwvZXZlbnQuaCIKICNpbmNsdWRlICJ1dGlsL2RlYnVnLmgiCiAjaW5jbHVkZSAidXRpbC9wYXJzZS1vcHRpb25zLmgiCkBAIC00MywxMSArNDQsMTIgQEAKICNpbmNsdWRlICJ1dGlsL3Byb2JlLWV2ZW50LmgiCiAKIC8qIERlZmF1bHQgdm1saW51eCBzZWFyY2ggcGF0aHMgKi8KLSNkZWZpbmUgTlJfU0VBUkNIX1BBVEggMworI2RlZmluZSBOUl9TRUFSQ0hfUEFUSCA0CiBjb25zdCBjaGFyICpkZWZhdWx0X3NlYXJjaF9wYXRoW05SX1NFQVJDSF9QQVRIXSA9IHsKICIvbGliL21vZHVsZXMvJXMvYnVpbGQvdm1saW51eCIsCQkvKiBDdXN0b20gYnVpbGQga2VybmVsICovCiAiL3Vzci9saWIvZGVidWcvbGliL21vZHVsZXMvJXMvdm1saW51eCIsCS8qIFJlZCBIYXQgZGVidWdpbmZvICovCiAiL2Jvb3Qvdm1saW51eC1kZWJ1Zy0lcyIsCQkJLyogVWJ1bnR1ICovCisiLi92bWxpbnV4IiwJCQkJCS8qIENXRCAqLwogfTsKIAogI2RlZmluZSBNQVhfUEFUSF9MRU4gMjU2CkBAIC02MCw2ICs2Miw3IEBACiAJaW50IG5lZWRfZHdhcmY7CiAJaW50IG5yX3Byb2JlOwogCXN0cnVjdCBwcm9iZV9wb2ludCBwcm9iZXNbTUFYX1BST0JFU107CisJc3RydWN0IHN0cmxpc3QgKmRlbGxpc3Q7CiB9IHNlc3Npb247CiAKIHN0YXRpYyBib29sIGxpc3Rpbmc7CkBAIC03OSw2ICs4MiwyNSBAQAogCXByX2RlYnVnKCIlZCBhcmd1bWVudHNcbiIsIHBwLT5ucl9hcmdzKTsKIH0KIAorc3RhdGljIHZvaWQgcGFyc2VfcHJvYmVfZXZlbnRfYXJndihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisJaW50IGksIGxlbjsKKwljaGFyICpidWY7CisKKwkvKiBCaW5kIHVwIHJlc3QgYXJndW1lbnRzICovCisJbGVuID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKQorCQlsZW4gKz0gc3RybGVuKGFyZ3ZbaV0pICsgMTsKKwlidWYgPSB6YWxsb2MobGVuICsgMSk7CisJaWYgKCFidWYpCisJCWRpZSgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYmluZGluZyBhcmd1bWVudHMuIik7CisJbGVuID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKQorCQlsZW4gKz0gc3ByaW50ZigmYnVmW2xlbl0sICIlcyAiLCBhcmd2W2ldKTsKKwlwYXJzZV9wcm9iZV9ldmVudChidWYpOworCWZyZWUoYnVmKTsKK30KKwogc3RhdGljIGludCBvcHRfYWRkX3Byb2JlX2V2ZW50KGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCBfX3VzZWQsCiAJCQkgICAgICBjb25zdCBjaGFyICpzdHIsIGludCB1bnNldCBfX3VzZWQpCiB7CkBAIC04Nyw2ICsxMDksMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBvcHRfZGVsX3Byb2JlX2V2ZW50KGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCBfX3VzZWQsCisJCQkgICAgICAgY29uc3QgY2hhciAqc3RyLCBpbnQgdW5zZXQgX191c2VkKQoreworCWlmIChzdHIpIHsKKwkJaWYgKCFzZXNzaW9uLmRlbGxpc3QpCisJCQlzZXNzaW9uLmRlbGxpc3QgPSBzdHJsaXN0X19uZXcodHJ1ZSwgTlVMTCk7CisJCXN0cmxpc3RfX2FkZChzZXNzaW9uLmRlbGxpc3QsIHN0cik7CisJfQorCXJldHVybiAwOworfQorCiAjaWZuZGVmIE5PX0xJQkRXQVJGCiBzdGF0aWMgaW50IG9wZW5fZGVmYXVsdF92bWxpbnV4KHZvaWQpCiB7CkBAIC0xMjEsNiArMTU0LDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHJvYmVfdXNhZ2VbXSA9IHsKIAkicGVyZiBwcm9iZSBbPG9wdGlvbnM+XSAnUFJPQkVERUYnIFsnUFJPQkVERUYnIC4uLl0iLAogCSJwZXJmIHByb2JlIFs8b3B0aW9ucz5dIC0tYWRkICdQUk9CRURFRicgWy0tYWRkICdQUk9CRURFRicgLi4uXSIsCisJInBlcmYgcHJvYmUgWzxvcHRpb25zPl0gLS1kZWwgJ1tHUk9VUDpdRVZFTlQnIC4uLiIsCiAJInBlcmYgcHJvYmUgLS1saXN0IiwKIAlOVUxMCiB9OwpAQCAtMTMyLDcgKzE2Niw5IEBACiAJT1BUX1NUUklORygnaycsICJ2bWxpbnV4IiwgJnNlc3Npb24udm1saW51eCwgImZpbGUiLAogCQkidm1saW51eC9tb2R1bGUgcGF0aG5hbWUiKSwKICNlbmRpZgotCU9QVF9CT09MRUFOKCdsJywgImxpc3QiLCAmbGlzdGluZywgImxpc3QgdXAgY3VycmVudCBwcm9iZXMiKSwKKwlPUFRfQk9PTEVBTignbCcsICJsaXN0IiwgJmxpc3RpbmcsICJsaXN0IHVwIGN1cnJlbnQgcHJvYmUgZXZlbnRzIiksCisJT1BUX0NBTExCQUNLKCdkJywgImRlbCIsIE5VTEwsICJbR1JPVVA6XUVWRU5UIiwgImRlbGV0ZSBhIHByb2JlIGV2ZW50LiIsCisJCW9wdF9kZWxfcHJvYmVfZXZlbnQpLAogCU9QVF9DQUxMQkFDSygnYScsICJhZGQiLCBOVUxMLAogI2lmZGVmIE5PX0xJQkRXQVJGCiAJCSJGVU5DWytPRkZTfCVyZXR1cm5dIFtBUkcgLi4uXSIsCkBAIC0xNjAsNyArMTk2LDcgQEAKIAogaW50IGNtZF9wcm9iZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCBfX3VzZWQpCiB7Ci0JaW50IGksIGosIHJldDsKKwlpbnQgaSwgcmV0OwogI2lmbmRlZiBOT19MSUJEV0FSRgogCWludCBmZDsKICNlbmRpZgpAQCAtMTY4LDQwICsyMDQsNTIgQEAKIAogCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIHByb2JlX3VzYWdlLAogCQkJICAgICBQQVJTRV9PUFRfU1RPUF9BVF9OT05fT1BUSU9OKTsKLQlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKQotCQlwYXJzZV9wcm9iZV9ldmVudChhcmd2W2ldKTsKKwlpZiAoYXJnYyA+IDApCisJCXBhcnNlX3Byb2JlX2V2ZW50X2FyZ3YoYXJnYywgYXJndik7CiAKLQlpZiAoKHNlc3Npb24ubnJfcHJvYmUgPT0gMCAmJiAhbGlzdGluZykgfHwKLQkgICAgKHNlc3Npb24ubnJfcHJvYmUgIT0gMCAmJiBsaXN0aW5nKSkKKwlpZiAoKHNlc3Npb24ubnJfcHJvYmUgPT0gMCAmJiAhc2Vzc2lvbi5kZWxsaXN0ICYmICFsaXN0aW5nKSkKIAkJdXNhZ2Vfd2l0aF9vcHRpb25zKHByb2JlX3VzYWdlLCBvcHRpb25zKTsKIAogCWlmIChsaXN0aW5nKSB7CisJCWlmIChzZXNzaW9uLm5yX3Byb2JlICE9IDAgfHwgc2Vzc2lvbi5kZWxsaXN0KSB7CisJCQlwcl93YXJuaW5nKCIgIEVycm9yOiBEb24ndCB1c2UgLS1saXN0IHdpdGgiCisJCQkJICAgIiAtLWFkZC8tLWRlbC5cbiIpOworCQkJdXNhZ2Vfd2l0aF9vcHRpb25zKHByb2JlX3VzYWdlLCBvcHRpb25zKTsKKwkJfQogCQlzaG93X3BlcmZfcHJvYmVfZXZlbnRzKCk7CiAJCXJldHVybiAwOwogCX0KIAorCWlmIChzZXNzaW9uLmRlbGxpc3QpIHsKKwkJZGVsX3RyYWNlX2twcm9iZV9ldmVudHMoc2Vzc2lvbi5kZWxsaXN0KTsKKwkJc3RybGlzdF9fZGVsZXRlKHNlc3Npb24uZGVsbGlzdCk7CisJCWlmIChzZXNzaW9uLm5yX3Byb2JlID09IDApCisJCQlyZXR1cm4gMDsKKwl9CisKIAlpZiAoc2Vzc2lvbi5uZWVkX2R3YXJmKQogI2lmZGVmIE5PX0xJQkRXQVJGCiAJCWRpZSgiRGVidWdpbmZvLWFuYWx5c2lzIGlzIG5vdCBzdXBwb3J0ZWQiKTsKICNlbHNlCS8qICFOT19MSUJEV0FSRiAqLwogCQlwcl9kZWJ1ZygiU29tZSBwcm9iZXMgcmVxdWlyZSBkZWJ1Z2luZm8uXG4iKTsKIAotCWlmIChzZXNzaW9uLnZtbGludXgpCisJaWYgKHNlc3Npb24udm1saW51eCkgeworCQlwcl9kZWJ1ZygiVHJ5IHRvIG9wZW4gJXMuIiwgc2Vzc2lvbi52bWxpbnV4KTsKIAkJZmQgPSBvcGVuKHNlc3Npb24udm1saW51eCwgT19SRE9OTFkpOwotCWVsc2UKKwl9IGVsc2UKIAkJZmQgPSBvcGVuX2RlZmF1bHRfdm1saW51eCgpOwogCWlmIChmZCA8IDApIHsKIAkJaWYgKHNlc3Npb24ubmVlZF9kd2FyZikKLQkJCWRpZSgiQ291bGQgbm90IG9wZW4gdm1saW51eC9tb2R1bGUgZmlsZS4iKTsKKwkJCWRpZSgiQ291bGQgbm90IG9wZW4gZGVidWdpbmZvIGZpbGUuIik7CiAKLQkJcHJfd2FybmluZygiQ291bGQgbm90IG9wZW4gdm1saW51eC9tb2R1bGUgZmlsZS4iCi0JCQkgICAiIFRyeSB0byB1c2Ugc3ltYm9scy5cbiIpOworCQlwcl9kZWJ1ZygiQ291bGQgbm90IG9wZW4gdm1saW51eC9tb2R1bGUgZmlsZS4iCisJCQkgIiBUcnkgdG8gdXNlIHN5bWJvbHMuXG4iKTsKIAkJZ290byBlbmRfZHdhcmY7CiAJfQogCiAJLyogU2VhcmNoaW5nIHByb2JlIHBvaW50cyAqLwotCWZvciAoaiA9IDA7IGogPCBzZXNzaW9uLm5yX3Byb2JlOyBqKyspIHsKLQkJcHAgPSAmc2Vzc2lvbi5wcm9iZXNbal07CisJZm9yIChpID0gMDsgaSA8IHNlc3Npb24ubnJfcHJvYmU7IGkrKykgeworCQlwcCA9ICZzZXNzaW9uLnByb2Jlc1tpXTsKIAkJaWYgKHBwLT5mb3VuZCkKIAkJCWNvbnRpbnVlOwogCkBAIC0yMjMsOCArMjcxLDggQEAKICNlbmRpZiAvKiAhTk9fTElCRFdBUkYgKi8KIAogCS8qIFN5bnRoZXNpemUgcHJvYmVzIHdpdGhvdXQgZHdhcmYgKi8KLQlmb3IgKGogPSAwOyBqIDwgc2Vzc2lvbi5ucl9wcm9iZTsgaisrKSB7Ci0JCXBwID0gJnNlc3Npb24ucHJvYmVzW2pdOworCWZvciAoaSA9IDA7IGkgPCBzZXNzaW9uLm5yX3Byb2JlOyBpKyspIHsKKwkJcHAgPSAmc2Vzc2lvbi5wcm9iZXNbaV07CiAJCWlmIChwcC0+Zm91bmQpCS8qIFRoaXMgcHJvYmUgaXMgYWxyZWFkeSBmb3VuZC4gKi8KIAkJCWNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tcmVwb3J0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tcmVwb3J0LmMKaW5kZXggMzgzYzRhYi4uMmI5ZWIzYSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXJlcG9ydC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZXBvcnQuYwpAQCAtNjA1LDQ0ICs2MDUsNDEgQEAKIAogc3RhdGljIGludCBwcm9jZXNzX3NhbXBsZV9ldmVudChldmVudF90ICpldmVudCkKIHsKLQl1NjQgaXAgPSBldmVudC0+aXAuaXA7Ci0JdTY0IHBlcmlvZCA9IDE7Ci0Jdm9pZCAqbW9yZV9kYXRhID0gZXZlbnQtPmlwLl9fbW9yZV9kYXRhOwotCXN0cnVjdCBpcF9jYWxsY2hhaW4gKmNoYWluID0gTlVMTDsKKwlzdHJ1Y3Qgc2FtcGxlX2RhdGEgZGF0YTsKIAlpbnQgY3B1bW9kZTsKIAlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiBhbDsKLQlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgPSB0aHJlYWRzX19maW5kbmV3KGV2ZW50LT5pcC5waWQpOworCXN0cnVjdCB0aHJlYWQgKnRocmVhZDsKIAotCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1BFUklPRCkgewotCQlwZXJpb2QgPSAqKHU2NCAqKW1vcmVfZGF0YTsKLQkJbW9yZV9kYXRhICs9IHNpemVvZih1NjQpOwotCX0KKwltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisJZGF0YS5wZXJpb2QgPSAxOworCisJZXZlbnRfX3BhcnNlX3NhbXBsZShldmVudCwgc2FtcGxlX3R5cGUsICZkYXRhKTsKIAogCWR1bXBfcHJpbnRmKCIoSVAsICVkKTogJWQvJWQ6ICVwIHBlcmlvZDogJUxkXG4iLAogCQlldmVudC0+aGVhZGVyLm1pc2MsCi0JCWV2ZW50LT5pcC5waWQsIGV2ZW50LT5pcC50aWQsCi0JCSh2b2lkICopKGxvbmcpaXAsCi0JCShsb25nIGxvbmcpcGVyaW9kKTsKKwkJZGF0YS5waWQsIGRhdGEudGlkLAorCQkodm9pZCAqKShsb25nKWRhdGEuaXAsCisJCShsb25nIGxvbmcpZGF0YS5wZXJpb2QpOwogCiAJaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfQ0FMTENIQUlOKSB7CiAJCXVuc2lnbmVkIGludCBpOwogCi0JCWNoYWluID0gKHZvaWQgKiltb3JlX2RhdGE7CisJCWR1bXBfcHJpbnRmKCIuLi4gY2hhaW46IG5yOiVMdVxuIiwgZGF0YS5jYWxsY2hhaW4tPm5yKTsKIAotCQlkdW1wX3ByaW50ZigiLi4uIGNoYWluOiBucjolTHVcbiIsIGNoYWluLT5ucik7Ci0KLQkJaWYgKHZhbGlkYXRlX2NoYWluKGNoYWluLCBldmVudCkgPCAwKSB7CisJCWlmICh2YWxpZGF0ZV9jaGFpbihkYXRhLmNhbGxjaGFpbiwgZXZlbnQpIDwgMCkgewogCQkJcHJfZGVidWcoImNhbGwtY2hhaW4gcHJvYmxlbSB3aXRoIGV2ZW50LCAiCiAJCQkJICJza2lwcGluZyBpdC5cbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAogCQlpZiAoZHVtcF90cmFjZSkgewotCQkJZm9yIChpID0gMDsgaSA8IGNoYWluLT5ucjsgaSsrKQotCQkJCWR1bXBfcHJpbnRmKCIuLi4uLiAlMmQ6ICUwMTZMeFxuIiwgaSwgY2hhaW4tPmlwc1tpXSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS5jYWxsY2hhaW4tPm5yOyBpKyspCisJCQkJZHVtcF9wcmludGYoIi4uLi4uICUyZDogJTAxNkx4XG4iLAorCQkJCQkgICAgaSwgZGF0YS5jYWxsY2hhaW4tPmlwc1tpXSk7CiAJCX0KIAl9CiAKKwl0aHJlYWQgPSB0aHJlYWRzX19maW5kbmV3KGRhdGEucGlkKTsKIAlpZiAodGhyZWFkID09IE5VTEwpIHsKIAkJcHJfZGVidWcoInByb2JsZW0gcHJvY2Vzc2luZyAlZCBldmVudCwgc2tpcHBpbmcgaXQuXG4iLAogCQkJZXZlbnQtPmhlYWRlci50eXBlKTsKQEAgLTY1Nyw3ICs2NTQsNyBAQAogCWNwdW1vZGUgPSBldmVudC0+aGVhZGVyLm1pc2MgJiBQRVJGX1JFQ09SRF9NSVNDX0NQVU1PREVfTUFTSzsKIAogCXRocmVhZF9fZmluZF9hZGRyX2xvY2F0aW9uKHRocmVhZCwgY3B1bW9kZSwKLQkJCQkgICBNQVBfX0ZVTkNUSU9OLCBpcCwgJmFsLCBOVUxMKTsKKwkJCQkgICBNQVBfX0ZVTkNUSU9OLCBkYXRhLmlwLCAmYWwsIE5VTEwpOwogCS8qCiAJICogV2UgaGF2ZSB0byBkbyB0aGlzIGhlcmUgYXMgd2UgbWF5IGhhdmUgYSBkc28gd2l0aCBubyBzeW1ib2wgaGl0IHRoYXQKIAkgKiBoYXMgYSBuYW1lIGxvbmdlciB0aGFuIHRoZSBvbmVzIHdpdGggc3ltYm9scyBzYW1wbGVkLgpAQCAtNjc1LDEyICs2NzIsMTIgQEAKIAlpZiAoc3ltX2xpc3QgJiYgYWwuc3ltICYmICFzdHJsaXN0X19oYXNfZW50cnkoc3ltX2xpc3QsIGFsLnN5bS0+bmFtZSkpCiAJCXJldHVybiAwOwogCi0JaWYgKGhpc3RfZW50cnlfX2FkZCgmYWwsIGNoYWluLCBwZXJpb2QpKSB7CisJaWYgKGhpc3RfZW50cnlfX2FkZCgmYWwsIGRhdGEuY2FsbGNoYWluLCBkYXRhLnBlcmlvZCkpIHsKIAkJcHJfZGVidWcoInByb2JsZW0gaW5jcmVtZW50aW5nIHN5bWJvbCBjb3VudCwgc2tpcHBpbmcgZXZlbnRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JZXZlbnRfX3N0YXRzLnRvdGFsICs9IHBlcmlvZDsKKwlldmVudF9fc3RhdHMudG90YWwgKz0gZGF0YS5wZXJpb2Q7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXNjaGVkLmMKaW5kZXggMjZiNzgyZi4uN2NjYTdjMSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXNjaGVkLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXNjaGVkLmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlICJ1dGlsL2RlYnVnLmgiCiAjaW5jbHVkZSAidXRpbC9kYXRhX21hcC5oIgogCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CiAKICNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KQEAgLTE0MSw2ICsxNDAsNyBAQAogCXN0cnVjdCB0aHJlYWQJCSp0aHJlYWQ7CiAJc3RydWN0IHJiX25vZGUJCW5vZGU7CiAJdTY0CQkJbWF4X2xhdDsKKwl1NjQJCQltYXhfbGF0X2F0OwogCXU2NAkJCXRvdGFsX2xhdDsKIAl1NjQJCQluYl9hdG9tczsKIAl1NjQJCQl0b3RhbF9ydW50aW1lOwpAQCAtNDE0LDM0ICs0MTQsMzMgQEAKIAlyZXR1cm4gc3VtOwogfQogCi1zdGF0aWMgdTY0IGdldF9jcHVfdXNhZ2VfbnNlY19zZWxmKHZvaWQpCitzdGF0aWMgaW50IHNlbGZfb3Blbl9jb3VudGVycyh2b2lkKQogewotCWNoYXIgZmlsZW5hbWUgW10gPSAiL3Byb2MvMTIzNDU2Nzg5MC9zY2hlZCI7Ci0JdW5zaWduZWQgbG9uZyBtc2VjcywgbnNlY3M7Ci0JY2hhciAqbGluZSA9IE5VTEw7Ci0JdTY0IHRvdGFsID0gMDsKLQlzaXplX3QgbGVuID0gMDsKLQlzc2l6ZV90IGNoYXJzOwotCUZJTEUgKmZpbGU7CisJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBhdHRyOworCWludCBmZDsKKworCW1lbXNldCgmYXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTsKKworCWF0dHIudHlwZSA9IFBFUkZfVFlQRV9TT0ZUV0FSRTsKKwlhdHRyLmNvbmZpZyA9IFBFUkZfQ09VTlRfU1dfVEFTS19DTE9DSzsKKworCWZkID0gc3lzX3BlcmZfZXZlbnRfb3BlbigmYXR0ciwgMCwgLTEsIC0xLCAwKTsKKworCWlmIChmZCA8IDApCisJCWRpZSgiRXJyb3I6IHN5c19wZXJmX2V2ZW50X29wZW4oKSBzeXNjYWxsIHJldHVybmVkIgorCQkgICAgIndpdGggJWQgKCVzKVxuIiwgZmQsIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIGZkOworfQorCitzdGF0aWMgdTY0IGdldF9jcHVfdXNhZ2VfbnNlY19zZWxmKGludCBmZCkKK3sKKwl1NjQgcnVudGltZTsKIAlpbnQgcmV0OwogCi0Jc3ByaW50ZihmaWxlbmFtZSwgIi9wcm9jLyVkL3NjaGVkIiwgZ2V0cGlkKCkpOwotCWZpbGUgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKLQlCVUdfT04oIWZpbGUpOworCXJldCA9IHJlYWQoZmQsICZydW50aW1lLCBzaXplb2YocnVudGltZSkpOworCUJVR19PTihyZXQgIT0gc2l6ZW9mKHJ1bnRpbWUpKTsKIAotCXdoaWxlICgoY2hhcnMgPSBnZXRsaW5lKCZsaW5lLCAmbGVuLCBmaWxlKSkgIT0gLTEpIHsKLQkJcmV0ID0gc3NjYW5mKGxpbmUsICJzZS5zdW1fZXhlY19ydW50aW1lIDogJWxkLiUwNmxkXG4iLAotCQkJJm1zZWNzLCAmbnNlY3MpOwotCQlpZiAocmV0ID09IDIpIHsKLQkJCXRvdGFsID0gbXNlY3MqMWU2ICsgbnNlY3M7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAobGluZSkKLQkJZnJlZShsaW5lKTsKLQlmY2xvc2UoZmlsZSk7Ci0KLQlyZXR1cm4gdG90YWw7CisJcmV0dXJuIHJ1bnRpbWU7CiB9CiAKIHN0YXRpYyB2b2lkICp0aHJlYWRfZnVuYyh2b2lkICpjdHgpCkBAIC00NTAsOSArNDQ5LDExIEBACiAJdTY0IGNwdV91c2FnZV8wLCBjcHVfdXNhZ2VfMTsKIAl1bnNpZ25lZCBsb25nIGksIHJldDsKIAljaGFyIGNvbW0yWzIyXTsKKwlpbnQgZmQ7CiAKIAlzcHJpbnRmKGNvbW0yLCAiOiVzIiwgdGhpc190YXNrLT5jb21tKTsKIAlwcmN0bChQUl9TRVRfTkFNRSwgY29tbTIpOworCWZkID0gc2VsZl9vcGVuX2NvdW50ZXJzKCk7CiAKIGFnYWluOgogCXJldCA9IHNlbV9wb3N0KCZ0aGlzX3Rhc2stPnJlYWR5X2Zvcl93b3JrKTsKQEAgLTQ2MiwxNiArNDYzLDE1IEBACiAJcmV0ID0gcHRocmVhZF9tdXRleF91bmxvY2soJnN0YXJ0X3dvcmtfbXV0ZXgpOwogCUJVR19PTihyZXQpOwogCi0JY3B1X3VzYWdlXzAgPSBnZXRfY3B1X3VzYWdlX25zZWNfc2VsZigpOworCWNwdV91c2FnZV8wID0gZ2V0X2NwdV91c2FnZV9uc2VjX3NlbGYoZmQpOwogCiAJZm9yIChpID0gMDsgaSA8IHRoaXNfdGFzay0+bnJfZXZlbnRzOyBpKyspIHsKIAkJdGhpc190YXNrLT5jdXJyX2V2ZW50ID0gaTsKIAkJcHJvY2Vzc19zY2hlZF9ldmVudCh0aGlzX3Rhc2ssIHRoaXNfdGFzay0+YXRvbXNbaV0pOwogCX0KIAotCWNwdV91c2FnZV8xID0gZ2V0X2NwdV91c2FnZV9uc2VjX3NlbGYoKTsKKwljcHVfdXNhZ2VfMSA9IGdldF9jcHVfdXNhZ2VfbnNlY19zZWxmKGZkKTsKIAl0aGlzX3Rhc2stPmNwdV91c2FnZSA9IGNwdV91c2FnZV8xIC0gY3B1X3VzYWdlXzA7Ci0KIAlyZXQgPSBzZW1fcG9zdCgmdGhpc190YXNrLT53b3JrX2RvbmVfc2VtKTsKIAlCVUdfT04ocmV0KTsKIApAQCAtNjI4LDExICs2MjgsNiBAQAogCXByaW50ZigidGhlIHNsZWVwIHRlc3QgdG9vayAlTGQgbnNlY3NcbiIsIFQxLVQwKTsKIH0KIAotc3RydWN0IHJhd19ldmVudF9zYW1wbGUgewotCXUzMiBzaXplOwotCWNoYXIgZGF0YVswXTsKLX07Ci0KICNkZWZpbmUgRklMTF9GSUVMRChwdHIsIGZpZWxkLCBldmVudCwgZGF0YSkJXAogCXB0ci5maWVsZCA9ICh0eXBlb2YocHRyLmZpZWxkKSkgcmF3X2ZpZWxkX3ZhbHVlKGV2ZW50LCAjZmllbGQsIGRhdGEpCiAKQEAgLTEwMTksOCArMTAxNCwxMCBAQAogCiAJZGVsdGEgPSBhdG9tLT5zY2hlZF9pbl90aW1lIC0gYXRvbS0+d2FrZV91cF90aW1lOwogCWF0b21zLT50b3RhbF9sYXQgKz0gZGVsdGE7Ci0JaWYgKGRlbHRhID4gYXRvbXMtPm1heF9sYXQpCisJaWYgKGRlbHRhID4gYXRvbXMtPm1heF9sYXQpIHsKIAkJYXRvbXMtPm1heF9sYXQgPSBkZWx0YTsKKwkJYXRvbXMtPm1heF9sYXRfYXQgPSB0aW1lc3RhbXA7CisJfQogCWF0b21zLT5uYl9hdG9tcysrOwogfQogCkBAIC0xMjE2LDEwICsxMjEzLDExIEBACiAKIAlhdmcgPSB3b3JrX2xpc3QtPnRvdGFsX2xhdCAvIHdvcmtfbGlzdC0+bmJfYXRvbXM7CiAKLQlwcmludGYoInwlMTEuM2YgbXMgfCU5bGx1IHwgYXZnOiU5LjNmIG1zIHwgbWF4OiU5LjNmIG1zIHxcbiIsCisJcHJpbnRmKCJ8JTExLjNmIG1zIHwlOWxsdSB8IGF2ZzolOS4zZiBtcyB8IG1heDolOS4zZiBtcyB8IG1heCBhdDogJTkuNmYgc1xuIiwKIAkgICAgICAoZG91YmxlKXdvcmtfbGlzdC0+dG90YWxfcnVudGltZSAvIDFlNiwKIAkJIHdvcmtfbGlzdC0+bmJfYXRvbXMsIChkb3VibGUpYXZnIC8gMWU2LAotCQkgKGRvdWJsZSl3b3JrX2xpc3QtPm1heF9sYXQgLyAxZTYpOworCQkgKGRvdWJsZSl3b3JrX2xpc3QtPm1heF9sYXQgLyAxZTYsCisJCSAoZG91YmxlKXdvcmtfbGlzdC0+bWF4X2xhdF9hdCAvIDFlOSk7CiB9CiAKIHN0YXRpYyBpbnQgcGlkX2NtcChzdHJ1Y3Qgd29ya19hdG9tcyAqbCwgc3RydWN0IHdvcmtfYXRvbXMgKnIpCkBAIC0xMzU2LDcgKzEzNTQsNyBAQAogc3RhdGljIHN0cnVjdCB0cmFjZV9zY2hlZF9oYW5kbGVyICp0cmFjZV9oYW5kbGVyOwogCiBzdGF0aWMgdm9pZAotcHJvY2Vzc19zY2hlZF93YWtldXBfZXZlbnQoc3RydWN0IHJhd19ldmVudF9zYW1wbGUgKnJhdywKK3Byb2Nlc3Nfc2NoZWRfd2FrZXVwX2V2ZW50KHZvaWQgKmRhdGEsCiAJCQkgICBzdHJ1Y3QgZXZlbnQgKmV2ZW50LAogCQkJICAgaW50IGNwdSBfX3VzZWQsCiAJCQkgICB1NjQgdGltZXN0YW1wIF9fdXNlZCwKQEAgLTEzNjQsMTMgKzEzNjIsMTMgQEAKIHsKIAlzdHJ1Y3QgdHJhY2Vfd2FrZXVwX2V2ZW50IHdha2V1cF9ldmVudDsKIAotCUZJTExfQ09NTU9OX0ZJRUxEUyh3YWtldXBfZXZlbnQsIGV2ZW50LCByYXctPmRhdGEpOworCUZJTExfQ09NTU9OX0ZJRUxEUyh3YWtldXBfZXZlbnQsIGV2ZW50LCBkYXRhKTsKIAotCUZJTExfQVJSQVkod2FrZXVwX2V2ZW50LCBjb21tLCBldmVudCwgcmF3LT5kYXRhKTsKLQlGSUxMX0ZJRUxEKHdha2V1cF9ldmVudCwgcGlkLCBldmVudCwgcmF3LT5kYXRhKTsKLQlGSUxMX0ZJRUxEKHdha2V1cF9ldmVudCwgcHJpbywgZXZlbnQsIHJhdy0+ZGF0YSk7Ci0JRklMTF9GSUVMRCh3YWtldXBfZXZlbnQsIHN1Y2Nlc3MsIGV2ZW50LCByYXctPmRhdGEpOwotCUZJTExfRklFTEQod2FrZXVwX2V2ZW50LCBjcHUsIGV2ZW50LCByYXctPmRhdGEpOworCUZJTExfQVJSQVkod2FrZXVwX2V2ZW50LCBjb21tLCBldmVudCwgZGF0YSk7CisJRklMTF9GSUVMRCh3YWtldXBfZXZlbnQsIHBpZCwgZXZlbnQsIGRhdGEpOworCUZJTExfRklFTEQod2FrZXVwX2V2ZW50LCBwcmlvLCBldmVudCwgZGF0YSk7CisJRklMTF9GSUVMRCh3YWtldXBfZXZlbnQsIHN1Y2Nlc3MsIGV2ZW50LCBkYXRhKTsKKwlGSUxMX0ZJRUxEKHdha2V1cF9ldmVudCwgY3B1LCBldmVudCwgZGF0YSk7CiAKIAlpZiAodHJhY2VfaGFuZGxlci0+d2FrZXVwX2V2ZW50KQogCQl0cmFjZV9oYW5kbGVyLT53YWtldXBfZXZlbnQoJndha2V1cF9ldmVudCwgZXZlbnQsIGNwdSwgdGltZXN0YW1wLCB0aHJlYWQpOwpAQCAtMTQ2OSw3ICsxNDY3LDcgQEAKIAogCiBzdGF0aWMgdm9pZAotcHJvY2Vzc19zY2hlZF9zd2l0Y2hfZXZlbnQoc3RydWN0IHJhd19ldmVudF9zYW1wbGUgKnJhdywKK3Byb2Nlc3Nfc2NoZWRfc3dpdGNoX2V2ZW50KHZvaWQgKmRhdGEsCiAJCQkgICBzdHJ1Y3QgZXZlbnQgKmV2ZW50LAogCQkJICAgaW50IHRoaXNfY3B1LAogCQkJICAgdTY0IHRpbWVzdGFtcCBfX3VzZWQsCkBAIC0xNDc3LDE1ICsxNDc1LDE1IEBACiB7CiAJc3RydWN0IHRyYWNlX3N3aXRjaF9ldmVudCBzd2l0Y2hfZXZlbnQ7CiAKLQlGSUxMX0NPTU1PTl9GSUVMRFMoc3dpdGNoX2V2ZW50LCBldmVudCwgcmF3LT5kYXRhKTsKKwlGSUxMX0NPTU1PTl9GSUVMRFMoc3dpdGNoX2V2ZW50LCBldmVudCwgZGF0YSk7CiAKLQlGSUxMX0FSUkFZKHN3aXRjaF9ldmVudCwgcHJldl9jb21tLCBldmVudCwgcmF3LT5kYXRhKTsKLQlGSUxMX0ZJRUxEKHN3aXRjaF9ldmVudCwgcHJldl9waWQsIGV2ZW50LCByYXctPmRhdGEpOwotCUZJTExfRklFTEQoc3dpdGNoX2V2ZW50LCBwcmV2X3ByaW8sIGV2ZW50LCByYXctPmRhdGEpOwotCUZJTExfRklFTEQoc3dpdGNoX2V2ZW50LCBwcmV2X3N0YXRlLCBldmVudCwgcmF3LT5kYXRhKTsKLQlGSUxMX0FSUkFZKHN3aXRjaF9ldmVudCwgbmV4dF9jb21tLCBldmVudCwgcmF3LT5kYXRhKTsKLQlGSUxMX0ZJRUxEKHN3aXRjaF9ldmVudCwgbmV4dF9waWQsIGV2ZW50LCByYXctPmRhdGEpOwotCUZJTExfRklFTEQoc3dpdGNoX2V2ZW50LCBuZXh0X3ByaW8sIGV2ZW50LCByYXctPmRhdGEpOworCUZJTExfQVJSQVkoc3dpdGNoX2V2ZW50LCBwcmV2X2NvbW0sIGV2ZW50LCBkYXRhKTsKKwlGSUxMX0ZJRUxEKHN3aXRjaF9ldmVudCwgcHJldl9waWQsIGV2ZW50LCBkYXRhKTsKKwlGSUxMX0ZJRUxEKHN3aXRjaF9ldmVudCwgcHJldl9wcmlvLCBldmVudCwgZGF0YSk7CisJRklMTF9GSUVMRChzd2l0Y2hfZXZlbnQsIHByZXZfc3RhdGUsIGV2ZW50LCBkYXRhKTsKKwlGSUxMX0FSUkFZKHN3aXRjaF9ldmVudCwgbmV4dF9jb21tLCBldmVudCwgZGF0YSk7CisJRklMTF9GSUVMRChzd2l0Y2hfZXZlbnQsIG5leHRfcGlkLCBldmVudCwgZGF0YSk7CisJRklMTF9GSUVMRChzd2l0Y2hfZXZlbnQsIG5leHRfcHJpbywgZXZlbnQsIGRhdGEpOwogCiAJaWYgKGN1cnJfcGlkW3RoaXNfY3B1XSAhPSAodTMyKS0xKSB7CiAJCS8qCkBAIC0xNTAyLDcgKzE1MDAsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotcHJvY2Vzc19zY2hlZF9ydW50aW1lX2V2ZW50KHN0cnVjdCByYXdfZXZlbnRfc2FtcGxlICpyYXcsCitwcm9jZXNzX3NjaGVkX3J1bnRpbWVfZXZlbnQodm9pZCAqZGF0YSwKIAkJCSAgIHN0cnVjdCBldmVudCAqZXZlbnQsCiAJCQkgICBpbnQgY3B1IF9fdXNlZCwKIAkJCSAgIHU2NCB0aW1lc3RhbXAgX191c2VkLApAQCAtMTUxMCwxNyArMTUwOCwxNyBAQAogewogCXN0cnVjdCB0cmFjZV9ydW50aW1lX2V2ZW50IHJ1bnRpbWVfZXZlbnQ7CiAKLQlGSUxMX0FSUkFZKHJ1bnRpbWVfZXZlbnQsIGNvbW0sIGV2ZW50LCByYXctPmRhdGEpOwotCUZJTExfRklFTEQocnVudGltZV9ldmVudCwgcGlkLCBldmVudCwgcmF3LT5kYXRhKTsKLQlGSUxMX0ZJRUxEKHJ1bnRpbWVfZXZlbnQsIHJ1bnRpbWUsIGV2ZW50LCByYXctPmRhdGEpOwotCUZJTExfRklFTEQocnVudGltZV9ldmVudCwgdnJ1bnRpbWUsIGV2ZW50LCByYXctPmRhdGEpOworCUZJTExfQVJSQVkocnVudGltZV9ldmVudCwgY29tbSwgZXZlbnQsIGRhdGEpOworCUZJTExfRklFTEQocnVudGltZV9ldmVudCwgcGlkLCBldmVudCwgZGF0YSk7CisJRklMTF9GSUVMRChydW50aW1lX2V2ZW50LCBydW50aW1lLCBldmVudCwgZGF0YSk7CisJRklMTF9GSUVMRChydW50aW1lX2V2ZW50LCB2cnVudGltZSwgZXZlbnQsIGRhdGEpOwogCiAJaWYgKHRyYWNlX2hhbmRsZXItPnJ1bnRpbWVfZXZlbnQpCiAJCXRyYWNlX2hhbmRsZXItPnJ1bnRpbWVfZXZlbnQoJnJ1bnRpbWVfZXZlbnQsIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKIH0KIAogc3RhdGljIHZvaWQKLXByb2Nlc3Nfc2NoZWRfZm9ya19ldmVudChzdHJ1Y3QgcmF3X2V2ZW50X3NhbXBsZSAqcmF3LAorcHJvY2Vzc19zY2hlZF9mb3JrX2V2ZW50KHZvaWQgKmRhdGEsCiAJCQkgc3RydWN0IGV2ZW50ICpldmVudCwKIAkJCSBpbnQgY3B1IF9fdXNlZCwKIAkJCSB1NjQgdGltZXN0YW1wIF9fdXNlZCwKQEAgLTE1MjgsMTIgKzE1MjYsMTIgQEAKIHsKIAlzdHJ1Y3QgdHJhY2VfZm9ya19ldmVudCBmb3JrX2V2ZW50OwogCi0JRklMTF9DT01NT05fRklFTERTKGZvcmtfZXZlbnQsIGV2ZW50LCByYXctPmRhdGEpOworCUZJTExfQ09NTU9OX0ZJRUxEUyhmb3JrX2V2ZW50LCBldmVudCwgZGF0YSk7CiAKLQlGSUxMX0FSUkFZKGZvcmtfZXZlbnQsIHBhcmVudF9jb21tLCBldmVudCwgcmF3LT5kYXRhKTsKLQlGSUxMX0ZJRUxEKGZvcmtfZXZlbnQsIHBhcmVudF9waWQsIGV2ZW50LCByYXctPmRhdGEpOwotCUZJTExfQVJSQVkoZm9ya19ldmVudCwgY2hpbGRfY29tbSwgZXZlbnQsIHJhdy0+ZGF0YSk7Ci0JRklMTF9GSUVMRChmb3JrX2V2ZW50LCBjaGlsZF9waWQsIGV2ZW50LCByYXctPmRhdGEpOworCUZJTExfQVJSQVkoZm9ya19ldmVudCwgcGFyZW50X2NvbW0sIGV2ZW50LCBkYXRhKTsKKwlGSUxMX0ZJRUxEKGZvcmtfZXZlbnQsIHBhcmVudF9waWQsIGV2ZW50LCBkYXRhKTsKKwlGSUxMX0FSUkFZKGZvcmtfZXZlbnQsIGNoaWxkX2NvbW0sIGV2ZW50LCBkYXRhKTsKKwlGSUxMX0ZJRUxEKGZvcmtfZXZlbnQsIGNoaWxkX3BpZCwgZXZlbnQsIGRhdGEpOwogCiAJaWYgKHRyYWNlX2hhbmRsZXItPmZvcmtfZXZlbnQpCiAJCXRyYWNlX2hhbmRsZXItPmZvcmtfZXZlbnQoJmZvcmtfZXZlbnQsIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKQEAgLTE1NTAsNyArMTU0OCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1wcm9jZXNzX3NjaGVkX21pZ3JhdGVfdGFza19ldmVudChzdHJ1Y3QgcmF3X2V2ZW50X3NhbXBsZSAqcmF3LAorcHJvY2Vzc19zY2hlZF9taWdyYXRlX3Rhc2tfZXZlbnQodm9pZCAqZGF0YSwKIAkJCSAgIHN0cnVjdCBldmVudCAqZXZlbnQsCiAJCQkgICBpbnQgY3B1IF9fdXNlZCwKIAkJCSAgIHU2NCB0aW1lc3RhbXAgX191c2VkLApAQCAtMTU1OCw4MCArMTU1Niw2NiBAQAogewogCXN0cnVjdCB0cmFjZV9taWdyYXRlX3Rhc2tfZXZlbnQgbWlncmF0ZV90YXNrX2V2ZW50OwogCi0JRklMTF9DT01NT05fRklFTERTKG1pZ3JhdGVfdGFza19ldmVudCwgZXZlbnQsIHJhdy0+ZGF0YSk7CisJRklMTF9DT01NT05fRklFTERTKG1pZ3JhdGVfdGFza19ldmVudCwgZXZlbnQsIGRhdGEpOwogCi0JRklMTF9BUlJBWShtaWdyYXRlX3Rhc2tfZXZlbnQsIGNvbW0sIGV2ZW50LCByYXctPmRhdGEpOwotCUZJTExfRklFTEQobWlncmF0ZV90YXNrX2V2ZW50LCBwaWQsIGV2ZW50LCByYXctPmRhdGEpOwotCUZJTExfRklFTEQobWlncmF0ZV90YXNrX2V2ZW50LCBwcmlvLCBldmVudCwgcmF3LT5kYXRhKTsKLQlGSUxMX0ZJRUxEKG1pZ3JhdGVfdGFza19ldmVudCwgY3B1LCBldmVudCwgcmF3LT5kYXRhKTsKKwlGSUxMX0FSUkFZKG1pZ3JhdGVfdGFza19ldmVudCwgY29tbSwgZXZlbnQsIGRhdGEpOworCUZJTExfRklFTEQobWlncmF0ZV90YXNrX2V2ZW50LCBwaWQsIGV2ZW50LCBkYXRhKTsKKwlGSUxMX0ZJRUxEKG1pZ3JhdGVfdGFza19ldmVudCwgcHJpbywgZXZlbnQsIGRhdGEpOworCUZJTExfRklFTEQobWlncmF0ZV90YXNrX2V2ZW50LCBjcHUsIGV2ZW50LCBkYXRhKTsKIAogCWlmICh0cmFjZV9oYW5kbGVyLT5taWdyYXRlX3Rhc2tfZXZlbnQpCiAJCXRyYWNlX2hhbmRsZXItPm1pZ3JhdGVfdGFza19ldmVudCgmbWlncmF0ZV90YXNrX2V2ZW50LCBldmVudCwgY3B1LCB0aW1lc3RhbXAsIHRocmVhZCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1wcm9jZXNzX3Jhd19ldmVudChldmVudF90ICpyYXdfZXZlbnQgX191c2VkLCB2b2lkICptb3JlX2RhdGEsCitwcm9jZXNzX3Jhd19ldmVudChldmVudF90ICpyYXdfZXZlbnQgX191c2VkLCB2b2lkICpkYXRhLAogCQkgIGludCBjcHUsIHU2NCB0aW1lc3RhbXAsIHN0cnVjdCB0aHJlYWQgKnRocmVhZCkKIHsKLQlzdHJ1Y3QgcmF3X2V2ZW50X3NhbXBsZSAqcmF3ID0gbW9yZV9kYXRhOwogCXN0cnVjdCBldmVudCAqZXZlbnQ7CiAJaW50IHR5cGU7CiAKLQl0eXBlID0gdHJhY2VfcGFyc2VfY29tbW9uX3R5cGUocmF3LT5kYXRhKTsKKworCXR5cGUgPSB0cmFjZV9wYXJzZV9jb21tb25fdHlwZShkYXRhKTsKIAlldmVudCA9IHRyYWNlX2ZpbmRfZXZlbnQodHlwZSk7CiAKIAlpZiAoIXN0cmNtcChldmVudC0+bmFtZSwgInNjaGVkX3N3aXRjaCIpKQotCQlwcm9jZXNzX3NjaGVkX3N3aXRjaF9ldmVudChyYXcsIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKKwkJcHJvY2Vzc19zY2hlZF9zd2l0Y2hfZXZlbnQoZGF0YSwgZXZlbnQsIGNwdSwgdGltZXN0YW1wLCB0aHJlYWQpOwogCWlmICghc3RyY21wKGV2ZW50LT5uYW1lLCAic2NoZWRfc3RhdF9ydW50aW1lIikpCi0JCXByb2Nlc3Nfc2NoZWRfcnVudGltZV9ldmVudChyYXcsIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKKwkJcHJvY2Vzc19zY2hlZF9ydW50aW1lX2V2ZW50KGRhdGEsIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKIAlpZiAoIXN0cmNtcChldmVudC0+bmFtZSwgInNjaGVkX3dha2V1cCIpKQotCQlwcm9jZXNzX3NjaGVkX3dha2V1cF9ldmVudChyYXcsIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKKwkJcHJvY2Vzc19zY2hlZF93YWtldXBfZXZlbnQoZGF0YSwgZXZlbnQsIGNwdSwgdGltZXN0YW1wLCB0aHJlYWQpOwogCWlmICghc3RyY21wKGV2ZW50LT5uYW1lLCAic2NoZWRfd2FrZXVwX25ldyIpKQotCQlwcm9jZXNzX3NjaGVkX3dha2V1cF9ldmVudChyYXcsIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKKwkJcHJvY2Vzc19zY2hlZF93YWtldXBfZXZlbnQoZGF0YSwgZXZlbnQsIGNwdSwgdGltZXN0YW1wLCB0aHJlYWQpOwogCWlmICghc3RyY21wKGV2ZW50LT5uYW1lLCAic2NoZWRfcHJvY2Vzc19mb3JrIikpCi0JCXByb2Nlc3Nfc2NoZWRfZm9ya19ldmVudChyYXcsIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKKwkJcHJvY2Vzc19zY2hlZF9mb3JrX2V2ZW50KGRhdGEsIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKIAlpZiAoIXN0cmNtcChldmVudC0+bmFtZSwgInNjaGVkX3Byb2Nlc3NfZXhpdCIpKQogCQlwcm9jZXNzX3NjaGVkX2V4aXRfZXZlbnQoZXZlbnQsIGNwdSwgdGltZXN0YW1wLCB0aHJlYWQpOwogCWlmICghc3RyY21wKGV2ZW50LT5uYW1lLCAic2NoZWRfbWlncmF0ZV90YXNrIikpCi0JCXByb2Nlc3Nfc2NoZWRfbWlncmF0ZV90YXNrX2V2ZW50KHJhdywgZXZlbnQsIGNwdSwgdGltZXN0YW1wLCB0aHJlYWQpOworCQlwcm9jZXNzX3NjaGVkX21pZ3JhdGVfdGFza19ldmVudChkYXRhLCBldmVudCwgY3B1LCB0aW1lc3RhbXAsIHRocmVhZCk7CiB9CiAKIHN0YXRpYyBpbnQgcHJvY2Vzc19zYW1wbGVfZXZlbnQoZXZlbnRfdCAqZXZlbnQpCiB7CisJc3RydWN0IHNhbXBsZV9kYXRhIGRhdGE7CiAJc3RydWN0IHRocmVhZCAqdGhyZWFkOwotCXU2NCBpcCA9IGV2ZW50LT5pcC5pcDsKLQl1NjQgdGltZXN0YW1wID0gLTE7Ci0JdTMyIGNwdSA9IC0xOwotCXU2NCBwZXJpb2QgPSAxOwotCXZvaWQgKm1vcmVfZGF0YSA9IGV2ZW50LT5pcC5fX21vcmVfZGF0YTsKIAogCWlmICghKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfUkFXKSkKIAkJcmV0dXJuIDA7CiAKLQl0aHJlYWQgPSB0aHJlYWRzX19maW5kbmV3KGV2ZW50LT5pcC5waWQpOworCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKwlkYXRhLnRpbWUgPSAtMTsKKwlkYXRhLmNwdSA9IC0xOworCWRhdGEucGVyaW9kID0gLTE7CiAKLQlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9USU1FKSB7Ci0JCXRpbWVzdGFtcCA9ICoodTY0ICopbW9yZV9kYXRhOwotCQltb3JlX2RhdGEgKz0gc2l6ZW9mKHU2NCk7Ci0JfQotCi0JaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfQ1BVKSB7Ci0JCWNwdSA9ICoodTMyICopbW9yZV9kYXRhOwotCQltb3JlX2RhdGEgKz0gc2l6ZW9mKHUzMik7Ci0JCW1vcmVfZGF0YSArPSBzaXplb2YodTMyKTsgLyogcmVzZXJ2ZWQgKi8KLQl9Ci0KLQlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9QRVJJT0QpIHsKLQkJcGVyaW9kID0gKih1NjQgKiltb3JlX2RhdGE7Ci0JCW1vcmVfZGF0YSArPSBzaXplb2YodTY0KTsKLQl9CisJZXZlbnRfX3BhcnNlX3NhbXBsZShldmVudCwgc2FtcGxlX3R5cGUsICZkYXRhKTsKIAogCWR1bXBfcHJpbnRmKCIoSVAsICVkKTogJWQvJWQ6ICVwIHBlcmlvZDogJUxkXG4iLAogCQlldmVudC0+aGVhZGVyLm1pc2MsCi0JCWV2ZW50LT5pcC5waWQsIGV2ZW50LT5pcC50aWQsCi0JCSh2b2lkICopKGxvbmcpaXAsCi0JCShsb25nIGxvbmcpcGVyaW9kKTsKKwkJZGF0YS5waWQsIGRhdGEudGlkLAorCQkodm9pZCAqKShsb25nKWRhdGEuaXAsCisJCShsb25nIGxvbmcpZGF0YS5wZXJpb2QpOwogCisJdGhyZWFkID0gdGhyZWFkc19fZmluZG5ldyhkYXRhLnBpZCk7CiAJaWYgKHRocmVhZCA9PSBOVUxMKSB7CiAJCXByX2RlYnVnKCJwcm9ibGVtIHByb2Nlc3NpbmcgJWQgZXZlbnQsIHNraXBwaW5nIGl0LlxuIiwKIAkJCSBldmVudC0+aGVhZGVyLnR5cGUpOwpAQCAtMTY0MCwxMCArMTYyNCwxMCBAQAogCiAJZHVtcF9wcmludGYoIiAuLi4gdGhyZWFkOiAlczolZFxuIiwgdGhyZWFkLT5jb21tLCB0aHJlYWQtPnBpZCk7CiAKLQlpZiAocHJvZmlsZV9jcHUgIT0gLTEgJiYgcHJvZmlsZV9jcHUgIT0gKGludCkgY3B1KQorCWlmIChwcm9maWxlX2NwdSAhPSAtMSAmJiBwcm9maWxlX2NwdSAhPSAoaW50KWRhdGEuY3B1KQogCQlyZXR1cm4gMDsKIAotCXByb2Nlc3NfcmF3X2V2ZW50KGV2ZW50LCBtb3JlX2RhdGEsIGNwdSwgdGltZXN0YW1wLCB0aHJlYWQpOworCXByb2Nlc3NfcmF3X2V2ZW50KGV2ZW50LCBkYXRhLnJhd19kYXRhLCBkYXRhLmNwdSwgZGF0YS50aW1lLCB0aHJlYWQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNzI0LDkgKzE3MDgsOSBAQAogCXJlYWRfZXZlbnRzKCk7CiAJc29ydF9sYXQoKTsKIAotCXByaW50ZigiXG4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCXByaW50ZigiICBUYXNrICAgICAgICAgICAgICAgICAgfCAgIFJ1bnRpbWUgbXMgIHwgU3dpdGNoZXMgfCBBdmVyYWdlIGRlbGF5IG1zIHwgTWF4aW11bSBkZWxheSBtcyB8XG4iKTsKLQlwcmludGYoIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRmKCJcbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCXByaW50ZigiICBUYXNrICAgICAgICAgICAgICAgICAgfCAgIFJ1bnRpbWUgbXMgIHwgU3dpdGNoZXMgfCBBdmVyYWdlIGRlbGF5IG1zIHwgTWF4aW11bSBkZWxheSBtcyB8IE1heGltdW0gZGVsYXkgYXQgICAgIHxcbiIpOworCXByaW50ZigiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAKIAluZXh0ID0gcmJfZmlyc3QoJnNvcnRlZF9hdG9tX3Jvb3QpOwogCkBAIC0xOTAyLDEzICsxODg2LDE4IEBACiAKIGludCBjbWRfc2NoZWQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXggX191c2VkKQogewotCXN5bWJvbF9faW5pdCgwKTsKLQogCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIHNjaGVkX29wdGlvbnMsIHNjaGVkX3VzYWdlLAogCQkJICAgICBQQVJTRV9PUFRfU1RPUF9BVF9OT05fT1BUSU9OKTsKIAlpZiAoIWFyZ2MpCiAJCXVzYWdlX3dpdGhfb3B0aW9ucyhzY2hlZF91c2FnZSwgc2NoZWRfb3B0aW9ucyk7CiAKKwkvKgorCSAqIEFsaWFzZWQgdG8gJ3BlcmYgdHJhY2UnIGZvciBub3c6CisJICovCisJaWYgKCFzdHJjbXAoYXJndlswXSwgInRyYWNlIikpCisJCXJldHVybiBjbWRfdHJhY2UoYXJnYywgYXJndiwgcHJlZml4KTsKKworCXN5bWJvbF9faW5pdCgwKTsKIAlpZiAoIXN0cm5jbXAoYXJndlswXSwgInJlYyIsIDMpKSB7CiAJCXJldHVybiBfX2NtZF9yZWNvcmQoYXJnYywgYXJndik7CiAJfSBlbHNlIGlmICghc3RybmNtcChhcmd2WzBdLCAibGF0IiwgMykpIHsKQEAgLTE5MzIsMTEgKzE5MjEsNiBAQAogCQkJCXVzYWdlX3dpdGhfb3B0aW9ucyhyZXBsYXlfdXNhZ2UsIHJlcGxheV9vcHRpb25zKTsKIAkJfQogCQlfX2NtZF9yZXBsYXkoKTsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgInRyYWNlIikpIHsKLQkJLyoKLQkJICogQWxpYXNlZCB0byAncGVyZiB0cmFjZScgZm9yIG5vdzoKLQkJICovCi0JCXJldHVybiBjbWRfdHJhY2UoYXJnYywgYXJndiwgcHJlZml4KTsKIAl9IGVsc2UgewogCQl1c2FnZV93aXRoX29wdGlvbnMoc2NoZWRfdXNhZ2UsIHNjaGVkX29wdGlvbnMpOwogCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10aW1lY2hhcnQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10aW1lY2hhcnQuYwppbmRleCBjYjU4YjY2Li5mNDcyZGY5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tdGltZWNoYXJ0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXRpbWVjaGFydC5jCkBAIC0zMDIsMTIgKzMwMiwxMSBAQAogfQogCiBzdHJ1Y3QgdHJhY2VfZW50cnkgewotCXUzMgkJCXNpemU7CiAJdW5zaWduZWQgc2hvcnQJCXR5cGU7CiAJdW5zaWduZWQgY2hhcgkJZmxhZ3M7CiAJdW5zaWduZWQgY2hhcgkJcHJlZW1wdF9jb3VudDsKIAlpbnQJCQlwaWQ7Ci0JaW50CQkJdGdpZDsKKwlpbnQJCQlsb2NrX2RlcHRoOwogfTsKIAogc3RydWN0IHBvd2VyX2VudHJ5IHsKQEAgLTQ4NCw0MyArNDgzLDIyIEBACiBzdGF0aWMgaW50CiBwcm9jZXNzX3NhbXBsZV9ldmVudChldmVudF90ICpldmVudCkKIHsKLQlpbnQgY3Vyc29yID0gMDsKLQl1NjQgYWRkciA9IDA7Ci0JdTY0IHN0YW1wID0gMDsKLQl1MzIgY3B1ID0gMDsKLQl1MzIgcGlkID0gMDsKKwlzdHJ1Y3Qgc2FtcGxlX2RhdGEgZGF0YTsKIAlzdHJ1Y3QgdHJhY2VfZW50cnkgKnRlOwogCi0JaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfSVApCi0JCWN1cnNvcisrOworCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKIAotCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1RJRCkgewotCQlwaWQgPSBldmVudC0+c2FtcGxlLmFycmF5W2N1cnNvcl0+PjMyOwotCQljdXJzb3IrKzsKLQl9CisJZXZlbnRfX3BhcnNlX3NhbXBsZShldmVudCwgc2FtcGxlX3R5cGUsICZkYXRhKTsKKwogCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1RJTUUpIHsKLQkJc3RhbXAgPSBldmVudC0+c2FtcGxlLmFycmF5W2N1cnNvcisrXTsKLQotCQlpZiAoIWZpcnN0X3RpbWUgfHwgZmlyc3RfdGltZSA+IHN0YW1wKQotCQkJZmlyc3RfdGltZSA9IHN0YW1wOwotCQlpZiAobGFzdF90aW1lIDwgc3RhbXApCi0JCQlsYXN0X3RpbWUgPSBzdGFtcDsKLQorCQlpZiAoIWZpcnN0X3RpbWUgfHwgZmlyc3RfdGltZSA+IGRhdGEudGltZSkKKwkJCWZpcnN0X3RpbWUgPSBkYXRhLnRpbWU7CisJCWlmIChsYXN0X3RpbWUgPCBkYXRhLnRpbWUpCisJCQlsYXN0X3RpbWUgPSBkYXRhLnRpbWU7CiAJfQotCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0FERFIpCi0JCWFkZHIgPSBldmVudC0+c2FtcGxlLmFycmF5W2N1cnNvcisrXTsKLQlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9JRCkKLQkJY3Vyc29yKys7Ci0JaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfU1RSRUFNX0lEKQotCQljdXJzb3IrKzsKLQlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9DUFUpCi0JCWNwdSA9IGV2ZW50LT5zYW1wbGUuYXJyYXlbY3Vyc29yKytdICYgMHhGRkZGRkZGRjsKLQlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9QRVJJT0QpCi0JCWN1cnNvcisrOwogCi0JdGUgPSAodm9pZCAqKSZldmVudC0+c2FtcGxlLmFycmF5W2N1cnNvcl07Ci0KLQlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9SQVcgJiYgdGUtPnNpemUgPiAwKSB7CisJdGUgPSAodm9pZCAqKWRhdGEucmF3X2RhdGE7CisJaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfUkFXICYmIGRhdGEucmF3X3NpemUgPiAwKSB7CiAJCWNoYXIgKmV2ZW50X3N0cjsKIAkJc3RydWN0IHBvd2VyX2VudHJ5ICpwZTsKIApAQCAtNTMyLDE5ICs1MTAsMTkgQEAKIAkJCXJldHVybiAwOwogCiAJCWlmIChzdHJjbXAoZXZlbnRfc3RyLCAicG93ZXI6cG93ZXJfc3RhcnQiKSA9PSAwKQotCQkJY19zdGF0ZV9zdGFydChjcHUsIHN0YW1wLCBwZS0+dmFsdWUpOworCQkJY19zdGF0ZV9zdGFydChkYXRhLmNwdSwgZGF0YS50aW1lLCBwZS0+dmFsdWUpOwogCiAJCWlmIChzdHJjbXAoZXZlbnRfc3RyLCAicG93ZXI6cG93ZXJfZW5kIikgPT0gMCkKLQkJCWNfc3RhdGVfZW5kKGNwdSwgc3RhbXApOworCQkJY19zdGF0ZV9lbmQoZGF0YS5jcHUsIGRhdGEudGltZSk7CiAKIAkJaWYgKHN0cmNtcChldmVudF9zdHIsICJwb3dlcjpwb3dlcl9mcmVxdWVuY3kiKSA9PSAwKQotCQkJcF9zdGF0ZV9jaGFuZ2UoY3B1LCBzdGFtcCwgcGUtPnZhbHVlKTsKKwkJCXBfc3RhdGVfY2hhbmdlKGRhdGEuY3B1LCBkYXRhLnRpbWUsIHBlLT52YWx1ZSk7CiAKIAkJaWYgKHN0cmNtcChldmVudF9zdHIsICJzY2hlZDpzY2hlZF93YWtldXAiKSA9PSAwKQotCQkJc2NoZWRfd2FrZXVwKGNwdSwgc3RhbXAsIHBpZCwgdGUpOworCQkJc2NoZWRfd2FrZXVwKGRhdGEuY3B1LCBkYXRhLnRpbWUsIGRhdGEucGlkLCB0ZSk7CiAKIAkJaWYgKHN0cmNtcChldmVudF9zdHIsICJzY2hlZDpzY2hlZF9zd2l0Y2giKSA9PSAwKQotCQkJc2NoZWRfc3dpdGNoKGNwdSwgc3RhbXAsIHRlKTsKKwkJCXNjaGVkX3N3aXRjaChkYXRhLmNwdSwgZGF0YS50aW1lLCB0ZSk7CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRyYWNlLmMgYi90b29scy9wZXJmL2J1aWx0aW4tdHJhY2UuYwppbmRleCBhYmI5MTRhLi5jMmZjYzM0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tdHJhY2UuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdHJhY2UuYwpAQCAtNjYsNTggKzY2LDQwIEBACiAKIHN0YXRpYyBpbnQgcHJvY2Vzc19zYW1wbGVfZXZlbnQoZXZlbnRfdCAqZXZlbnQpCiB7Ci0JdTY0IGlwID0gZXZlbnQtPmlwLmlwOwotCXU2NCB0aW1lc3RhbXAgPSAtMTsKLQl1MzIgY3B1ID0gLTE7Ci0JdTY0IHBlcmlvZCA9IDE7Ci0Jdm9pZCAqbW9yZV9kYXRhID0gZXZlbnQtPmlwLl9fbW9yZV9kYXRhOwotCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IHRocmVhZHNfX2ZpbmRuZXcoZXZlbnQtPmlwLnBpZCk7CisJc3RydWN0IHNhbXBsZV9kYXRhIGRhdGE7CisJc3RydWN0IHRocmVhZCAqdGhyZWFkOwogCi0JaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfVElNRSkgewotCQl0aW1lc3RhbXAgPSAqKHU2NCAqKW1vcmVfZGF0YTsKLQkJbW9yZV9kYXRhICs9IHNpemVvZih1NjQpOwotCX0KKwltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisJZGF0YS50aW1lID0gLTE7CisJZGF0YS5jcHUgPSAtMTsKKwlkYXRhLnBlcmlvZCA9IDE7CiAKLQlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9DUFUpIHsKLQkJY3B1ID0gKih1MzIgKiltb3JlX2RhdGE7Ci0JCW1vcmVfZGF0YSArPSBzaXplb2YodTMyKTsKLQkJbW9yZV9kYXRhICs9IHNpemVvZih1MzIpOyAvKiByZXNlcnZlZCAqLwotCX0KLQotCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1BFUklPRCkgewotCQlwZXJpb2QgPSAqKHU2NCAqKW1vcmVfZGF0YTsKLQkJbW9yZV9kYXRhICs9IHNpemVvZih1NjQpOwotCX0KKwlldmVudF9fcGFyc2Vfc2FtcGxlKGV2ZW50LCBzYW1wbGVfdHlwZSwgJmRhdGEpOwogCiAJZHVtcF9wcmludGYoIihJUCwgJWQpOiAlZC8lZDogJXAgcGVyaW9kOiAlTGRcbiIsCiAJCWV2ZW50LT5oZWFkZXIubWlzYywKLQkJZXZlbnQtPmlwLnBpZCwgZXZlbnQtPmlwLnRpZCwKLQkJKHZvaWQgKikobG9uZylpcCwKLQkJKGxvbmcgbG9uZylwZXJpb2QpOworCQlkYXRhLnBpZCwgZGF0YS50aWQsCisJCSh2b2lkICopKGxvbmcpZGF0YS5pcCwKKwkJKGxvbmcgbG9uZylkYXRhLnBlcmlvZCk7CiAKKwl0aHJlYWQgPSB0aHJlYWRzX19maW5kbmV3KGV2ZW50LT5pcC5waWQpOwogCWlmICh0aHJlYWQgPT0gTlVMTCkgewogCQlwcl9kZWJ1ZygicHJvYmxlbSBwcm9jZXNzaW5nICVkIGV2ZW50LCBza2lwcGluZyBpdC5cbiIsCiAJCQkgZXZlbnQtPmhlYWRlci50eXBlKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWR1bXBfcHJpbnRmKCIgLi4uIHRocmVhZDogJXM6JWRcbiIsIHRocmVhZC0+Y29tbSwgdGhyZWFkLT5waWQpOwotCiAJaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfUkFXKSB7Ci0JCXN0cnVjdCB7Ci0JCQl1MzIgc2l6ZTsKLQkJCWNoYXIgZGF0YVswXTsKLQkJfSAqcmF3ID0gbW9yZV9kYXRhOwotCiAJCS8qCiAJCSAqIEZJWE1FOiBiZXR0ZXIgcmVzb2x2ZSBmcm9tIHBpZCBmcm9tIHRoZSBzdHJ1Y3QgdHJhY2VfZW50cnkKIAkJICogZmllbGQsIGFsdGhvdWdoIGl0IHNob3VsZCBiZSB0aGUgc2FtZSB0aGFuIHRoaXMgcGVyZgogCQkgKiBldmVudCBwaWQKIAkJICovCi0JCXNjcmlwdGluZ19vcHMtPnByb2Nlc3NfZXZlbnQoY3B1LCByYXctPmRhdGEsIHJhdy0+c2l6ZSwKLQkJCQkJICAgICB0aW1lc3RhbXAsIHRocmVhZC0+Y29tbSk7CisJCXNjcmlwdGluZ19vcHMtPnByb2Nlc3NfZXZlbnQoZGF0YS5jcHUsIGRhdGEucmF3X2RhdGEsCisJCQkJCSAgICAgZGF0YS5yYXdfc2l6ZSwKKwkJCQkJICAgICBkYXRhLnRpbWUsIHRocmVhZC0+Y29tbSk7CiAJfQotCWV2ZW50X19zdGF0cy50b3RhbCArPSBwZXJpb2Q7CisJZXZlbnRfX3N0YXRzLnRvdGFsICs9IGRhdGEucGVyaW9kOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZGF0YV9tYXAuYyBiL3Rvb2xzL3BlcmYvdXRpbC9kYXRhX21hcC5jCmluZGV4IGNhMGJlZGYuLjU5YjY1ZDAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9kYXRhX21hcC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9kYXRhX21hcC5jCkBAIC0xMDAsMTEgKzEwMCwxMSBAQAogCX0KIH0KIAotaW50IHBlcmZfaGVhZGVyX19yZWFkX2J1aWxkX2lkcyhpbnQgaW5wdXQsIG9mZl90IG9mZnNldCwgb2ZmX3Qgc2l6ZSkKK2ludCBwZXJmX2hlYWRlcl9fcmVhZF9idWlsZF9pZHMoaW50IGlucHV0LCB1NjQgb2Zmc2V0LCB1NjQgc2l6ZSkKIHsKIAlzdHJ1Y3QgYnVpbGRfaWRfZXZlbnQgYmV2OwogCWNoYXIgZmlsZW5hbWVbUEFUSF9NQVhdOwotCW9mZl90IGxpbWl0ID0gb2Zmc2V0ICsgc2l6ZTsKKwl1NjQgbGltaXQgPSBvZmZzZXQgKyBzaXplOwogCWludCBlcnIgPSAtMTsKIAogCXdoaWxlIChvZmZzZXQgPCBsaW1pdCkgewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2RhdGFfbWFwLmggYi90b29scy9wZXJmL3V0aWwvZGF0YV9tYXAuaAppbmRleCAzMTgwZmY3Li4yNThhODdiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZGF0YV9tYXAuaAorKysgYi90b29scy9wZXJmL3V0aWwvZGF0YV9tYXAuaApAQCAtMjcsNiArMjcsNiBAQAogCQkJICAgIGludCBmdWxsX3BhdGhzLAogCQkJICAgIGludCAqY3dkbGVuLAogCQkJICAgIGNoYXIgKipjd2QpOwotaW50IHBlcmZfaGVhZGVyX19yZWFkX2J1aWxkX2lkcyhpbnQgaW5wdXQsIG9mZl90IG9mZnNldCwgb2ZmX3QgZmlsZV9zaXplKTsKK2ludCBwZXJmX2hlYWRlcl9fcmVhZF9idWlsZF9pZHMoaW50IGlucHV0LCB1NjQgb2Zmc2V0LCB1NjQgZmlsZV9zaXplKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZlbnQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jCmluZGV4IDQxNGI4OWQuLjRkY2VjYWYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jCkBAIC0zMTAsMyArMzEwLDcwIEBACiAJCQlhbC0+bGV2ZWwgPT0gJ0gnID8gIltoeXBlcnZpc29yXSIgOiAiPG5vdCBmb3VuZD4iKTsKIAlyZXR1cm4gMDsKIH0KKworaW50IGV2ZW50X19wYXJzZV9zYW1wbGUoZXZlbnRfdCAqZXZlbnQsIHU2NCB0eXBlLCBzdHJ1Y3Qgc2FtcGxlX2RhdGEgKmRhdGEpCit7CisJdTY0ICphcnJheSA9IGV2ZW50LT5zYW1wbGUuYXJyYXk7CisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX0lQKSB7CisJCWRhdGEtPmlwID0gZXZlbnQtPmlwLmlwOworCQlhcnJheSsrOworCX0KKworCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfVElEKSB7CisJCXUzMiAqcCA9ICh1MzIgKilhcnJheTsKKwkJZGF0YS0+cGlkID0gcFswXTsKKwkJZGF0YS0+dGlkID0gcFsxXTsKKwkJYXJyYXkrKzsKKwl9CisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX1RJTUUpIHsKKwkJZGF0YS0+dGltZSA9ICphcnJheTsKKwkJYXJyYXkrKzsKKwl9CisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX0FERFIpIHsKKwkJZGF0YS0+YWRkciA9ICphcnJheTsKKwkJYXJyYXkrKzsKKwl9CisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX0lEKSB7CisJCWRhdGEtPmlkID0gKmFycmF5OworCQlhcnJheSsrOworCX0KKworCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfU1RSRUFNX0lEKSB7CisJCWRhdGEtPnN0cmVhbV9pZCA9ICphcnJheTsKKwkJYXJyYXkrKzsKKwl9CisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX0NQVSkgeworCQl1MzIgKnAgPSAodTMyICopYXJyYXk7CisJCWRhdGEtPmNwdSA9ICpwOworCQlhcnJheSsrOworCX0KKworCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfUEVSSU9EKSB7CisJCWRhdGEtPnBlcmlvZCA9ICphcnJheTsKKwkJYXJyYXkrKzsKKwl9CisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX1JFQUQpIHsKKwkJcHJfZGVidWcoIlBFUkZfU0FNUExFX1JFQUQgaXMgdW5zdXBvcnRlZCBmb3Igbm93XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfQ0FMTENIQUlOKSB7CisJCWRhdGEtPmNhbGxjaGFpbiA9IChzdHJ1Y3QgaXBfY2FsbGNoYWluICopYXJyYXk7CisJCWFycmF5ICs9IDEgKyBkYXRhLT5jYWxsY2hhaW4tPm5yOworCX0KKworCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfUkFXKSB7CisJCXUzMiAqcCA9ICh1MzIgKilhcnJheTsKKwkJZGF0YS0+cmF3X3NpemUgPSAqcDsKKwkJcCsrOworCQlkYXRhLT5yYXdfZGF0YSA9IHA7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZlbnQuaCBiL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5oCmluZGV4IGE0Y2M4MTAuLmM3YTc4ZWVmOCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmgKQEAgLTU2LDExICs1NiwyNSBAQAogCXU2NCBpZDsKIH07CiAKLXN0cnVjdCBzYW1wbGVfZXZlbnR7CitzdHJ1Y3Qgc2FtcGxlX2V2ZW50IHsKIAlzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgICAgICAgIGhlYWRlcjsKIAl1NjQgYXJyYXlbXTsKIH07CiAKK3N0cnVjdCBzYW1wbGVfZGF0YSB7CisJdTY0IGlwOworCXUzMiBwaWQsIHRpZDsKKwl1NjQgdGltZTsKKwl1NjQgYWRkcjsKKwl1NjQgaWQ7CisJdTY0IHN0cmVhbV9pZDsKKwl1MzIgY3B1OworCXU2NCBwZXJpb2Q7CisJc3RydWN0IGlwX2NhbGxjaGFpbiAqY2FsbGNoYWluOworCXUzMiByYXdfc2l6ZTsKKwl2b2lkICpyYXdfZGF0YTsKK307CisKICNkZWZpbmUgQlVJTERfSURfU0laRSAyMAogCiBzdHJ1Y3QgYnVpbGRfaWRfZXZlbnQgewpAQCAtMTU1LDUgKzE2OSw2IEBACiBzdHJ1Y3QgYWRkcl9sb2NhdGlvbjsKIGludCBldmVudF9fcHJlcHJvY2Vzc19zYW1wbGUoY29uc3QgZXZlbnRfdCAqc2VsZiwgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsLAogCQkJICAgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKK2ludCBldmVudF9fcGFyc2Vfc2FtcGxlKGV2ZW50X3QgKmV2ZW50LCB1NjQgdHlwZSwgc3RydWN0IHNhbXBsZV9kYXRhICpkYXRhKTsKIAogI2VuZGlmIC8qIF9fUEVSRl9SRUNPUkRfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2hlYWRlci5jIGIvdG9vbHMvcGVyZi91dGlsL2hlYWRlci5jCmluZGV4IDQ4MDVlNmQuLjU5YTljMGIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9oZWFkZXIuYworKysgYi90b29scy9wZXJmL3V0aWwvaGVhZGVyLmMKQEAgLTE4Nyw3ICsxODcsOSBAQAogCiBzdGF0aWMgaW50IF9fZHNvc19fd3JpdGVfYnVpbGRpZF90YWJsZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBpbnQgZmQpCiB7CisjZGVmaW5lIE5BTUVfQUxJR04JNjQKIAlzdHJ1Y3QgZHNvICpwb3M7CisJc3RhdGljIGNvbnN0IGNoYXIgemVyb19idWZbTkFNRV9BTElHTl07CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgaGVhZCwgbm9kZSkgewogCQlpbnQgZXJyOwpAQCAtMTk3LDE0ICsxOTksMTcgQEAKIAkJaWYgKCFwb3MtPmhhc19idWlsZF9pZCkKIAkJCWNvbnRpbnVlOwogCQlsZW4gPSBwb3MtPmxvbmdfbmFtZV9sZW4gKyAxOwotCQlsZW4gPSBBTElHTihsZW4sIDY0KTsKKwkJbGVuID0gQUxJR04obGVuLCBOQU1FX0FMSUdOKTsKIAkJbWVtc2V0KCZiLCAwLCBzaXplb2YoYikpOwogCQltZW1jcHkoJmIuYnVpbGRfaWQsIHBvcy0+YnVpbGRfaWQsIHNpemVvZihwb3MtPmJ1aWxkX2lkKSk7CiAJCWIuaGVhZGVyLnNpemUgPSBzaXplb2YoYikgKyBsZW47CiAJCWVyciA9IGRvX3dyaXRlKGZkLCAmYiwgc2l6ZW9mKGIpKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwotCQllcnIgPSBkb193cml0ZShmZCwgcG9zLT5sb25nX25hbWUsIGxlbik7CisJCWVyciA9IGRvX3dyaXRlKGZkLCBwb3MtPmxvbmdfbmFtZSwgcG9zLT5sb25nX25hbWVfbGVuICsgMSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJZXJyID0gZG9fd3JpdGUoZmQsIHplcm9fYnVmLCBsZW4gLSBwb3MtPmxvbmdfbmFtZV9sZW4gLSAxKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYwppbmRleCA5ZTVkYmQ2Li5lNWJjMGZiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5jCkBAIC0xOTcsNyArMTk3LDcgQEAKIAkJCWlmIChpZCA9PSBjb25maWcpIHsKIAkJCQljbG9zZWRpcihldnRfZGlyKTsKIAkJCQljbG9zZWRpcihzeXNfZGlyKTsKLQkJCQlwYXRoID0gemFsbG9jKHNpemVvZihwYXRoKSk7CisJCQkJcGF0aCA9IHphbGxvYyhzaXplb2YoKnBhdGgpKTsKIAkJCQlwYXRoLT5zeXN0ZW0gPSBtYWxsb2MoTUFYX0VWRU5UX0xFTkdUSCk7CiAJCQkJaWYgKCFwYXRoLT5zeXN0ZW0pIHsKIAkJCQkJZnJlZShwYXRoKTsKQEAgLTQ2Nyw3ICs0NjcsNiBAQAogCXdoaWxlICgoZXZ0X2VudCA9IHJlYWRkaXIoZXZ0X2RpcikpKSB7CiAJCWNoYXIgZXZlbnRfb3B0W01BWF9FVk9QVF9MRU4gKyAxXTsKIAkJaW50IGxlbjsKLQkJdW5zaWduZWQgaW50IHJlbSA9IE1BWF9FVk9QVF9MRU47CiAKIAkJaWYgKCFzdHJjbXAoZXZ0X2VudC0+ZF9uYW1lLCAiLiIpCiAJCSAgICB8fCAhc3RyY21wKGV2dF9lbnQtPmRfbmFtZSwgIi4uIikKQEAgLTQ3NSwyMCArNDc0LDEyIEBACiAJCSAgICB8fCAhc3RyY21wKGV2dF9lbnQtPmRfbmFtZSwgImZpbHRlciIpKQogCQkJY29udGludWU7CiAKLQkJbGVuID0gc25wcmludGYoZXZlbnRfb3B0LCBNQVhfRVZPUFRfTEVOLCAiJXM6JXMiLCBzeXNfbmFtZSwKLQkJCSAgICAgICBldnRfZW50LT5kX25hbWUpOworCQlsZW4gPSBzbnByaW50ZihldmVudF9vcHQsIE1BWF9FVk9QVF9MRU4sICIlczolcyVzJXMiLCBzeXNfbmFtZSwKKwkJCSAgICAgICBldnRfZW50LT5kX25hbWUsIGZsYWdzID8gIjoiIDogIiIsCisJCQkgICAgICAgZmxhZ3MgPzogIiIpOwogCQlpZiAobGVuIDwgMCkKIAkJCXJldHVybiBFVlRfRkFJTEVEOwogCi0JCXJlbSAtPSBsZW47Ci0JCWlmIChmbGFncykgewotCQkJaWYgKHJlbSA8IHN0cmxlbihmbGFncykgKyAxKQotCQkJCXJldHVybiBFVlRfRkFJTEVEOwotCi0JCQlzdHJjYXQoZXZlbnRfb3B0LCAiOiIpOwotCQkJc3RyY2F0KGV2ZW50X29wdCwgZmxhZ3MpOwotCQl9Ci0KIAkJaWYgKHBhcnNlX2V2ZW50cyhOVUxMLCBldmVudF9vcHQsIDApKQogCQkJcmV0dXJuIEVWVF9GQUlMRUQ7CiAJfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1vcHRpb25zLmMKaW5kZXggNmQ4YWY0OC4uZWZlYmQ1YiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuYworKysgYi90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5jCkBAIC00MzAsNiArNDMwLDkgQEAKIAkJcG9zID0gZnByaW50ZihzdGRlcnIsICIgICAgIik7CiAJCWlmIChvcHRzLT5zaG9ydF9uYW1lKQogCQkJcG9zICs9IGZwcmludGYoc3RkZXJyLCAiLSVjIiwgb3B0cy0+c2hvcnRfbmFtZSk7CisJCWVsc2UKKwkJCXBvcyArPSBmcHJpbnRmKHN0ZGVyciwgIiAgICAiKTsKKwogCQlpZiAob3B0cy0+bG9uZ19uYW1lICYmIG9wdHMtPnNob3J0X25hbWUpCiAJCQlwb3MgKz0gZnByaW50ZihzdGRlcnIsICIsICIpOwogCQlpZiAob3B0cy0+bG9uZ19uYW1lKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYwppbmRleCBjZDdmYmRhLi5kMTRhNDU4IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYworKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYwpAQCAtNDgsNiArNDgsOSBAQAogCiAvKiBJZiB0aGVyZSBpcyBubyBzcGFjZSB0byB3cml0ZSwgcmV0dXJucyAtRTJCSUcuICovCiBzdGF0aWMgaW50IGVfc25wcmludGYoY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMywgNCkpKTsKKworc3RhdGljIGludCBlX3NucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewogCWludCByZXQ7CiAJdmFfbGlzdCBhcDsKQEAgLTI1OCw3ICsyNjEsNyBAQAogCQlyZXQgPSBlX3NucHJpbnRmKGJ1ZiwgTUFYX0NNRExFTiwgIiVzJXMlcyVzIiwgcHAtPmZ1bmN0aW9uLAogCQkJCSBvZmZzLCBwcC0+cmV0cHJvYmUgPyAiJXJldHVybiIgOiAiIiwgbGluZSk7CiAJZWxzZQotCQlyZXQgPSBlX3NucHJpbnRmKGJ1ZiwgTUFYX0NNRExFTiwgIiVzJXMlcyVzIiwgcHAtPmZpbGUsIGxpbmUpOworCQlyZXQgPSBlX3NucHJpbnRmKGJ1ZiwgTUFYX0NNRExFTiwgIiVzJXMiLCBwcC0+ZmlsZSwgbGluZSk7CiAJaWYgKHJldCA8PSAwKQogCQlnb3RvIGVycm9yOwogCWxlbiA9IHJldDsKQEAgLTM3MywxNCArMzc2LDMyIEBACiAJCWZyZWUocHAtPmFyZ3MpOwogCWZvciAoaSA9IDA7IGkgPCBwcC0+Zm91bmQ7IGkrKykKIAkJZnJlZShwcC0+cHJvYmVzW2ldKTsKLQltZW1zZXQocHAsIDAsIHNpemVvZihwcCkpOworCW1lbXNldChwcCwgMCwgc2l6ZW9mKCpwcCkpOworfQorCisvKiBTaG93IGFuIGV2ZW50ICovCitzdGF0aWMgdm9pZCBzaG93X3BlcmZfcHJvYmVfZXZlbnQoY29uc3QgY2hhciAqZ3JvdXAsIGNvbnN0IGNoYXIgKmV2ZW50LAorCQkJCSAgY29uc3QgY2hhciAqcGxhY2UsIHN0cnVjdCBwcm9iZV9wb2ludCAqcHApCit7CisJaW50IGk7CisJY2hhciBidWZbMTI4XTsKKworCWVfc25wcmludGYoYnVmLCAxMjgsICIlczolcyIsIGdyb3VwLCBldmVudCk7CisJcHJpbnRmKCIgICUtNDBzIChvbiAlcyIsIGJ1ZiwgcGxhY2UpOworCisJaWYgKHBwLT5ucl9hcmdzID4gMCkgeworCQlwcmludGYoIiB3aXRoIik7CisJCWZvciAoaSA9IDA7IGkgPCBwcC0+bnJfYXJnczsgaSsrKQorCQkJcHJpbnRmKCIgJXMiLCBwcC0+YXJnc1tpXSk7CisJfQorCXByaW50ZigiKVxuIik7CiB9CiAKIC8qIExpc3QgdXAgY3VycmVudCBwZXJmLXByb2JlIGV2ZW50cyAqLwogdm9pZCBzaG93X3BlcmZfcHJvYmVfZXZlbnRzKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGk7Ci0JaW50IGZkOworCWludCBmZCwgbnI7CiAJY2hhciAqZ3JvdXAsICpldmVudDsKIAlzdHJ1Y3QgcHJvYmVfcG9pbnQgcHA7CiAJc3RydWN0IHN0cmxpc3QgKnJhd2xpc3Q7CkBAIC0zOTMsOCArNDE0LDEzIEBACiAJZm9yIChpID0gMDsgaSA8IHN0cmxpc3RfX25yX2VudHJpZXMocmF3bGlzdCk7IGkrKykgewogCQllbnQgPSBzdHJsaXN0X19lbnRyeShyYXdsaXN0LCBpKTsKIAkJcGFyc2VfdHJhY2Vfa3Byb2JlX2V2ZW50KGVudC0+cywgJmdyb3VwLCAmZXZlbnQsICZwcCk7CisJCS8qIFN5bnRoZXNpemUgb25seSBldmVudCBwcm9iZSBwb2ludCAqLworCQluciA9IHBwLm5yX2FyZ3M7CisJCXBwLm5yX2FyZ3MgPSAwOwogCQlzeW50aGVzaXplX3BlcmZfcHJvYmVfZXZlbnQoJnBwKTsKLQkJcHJpbnRmKCJbJXM6JXNdXHQlc1xuIiwgZ3JvdXAsIGV2ZW50LCBwcC5wcm9iZXNbMF0pOworCQlwcC5ucl9hcmdzID0gbnI7CisJCS8qIFNob3cgYW4gZXZlbnQgKi8KKwkJc2hvd19wZXJmX3Byb2JlX2V2ZW50KGdyb3VwLCBldmVudCwgcHAucHJvYmVzWzBdLCAmcHApOwogCQlmcmVlKGdyb3VwKTsKIAkJZnJlZShldmVudCk7CiAJCWNsZWFyX3Byb2JlX3BvaW50KCZwcCk7CkBAIC00MDQsMjEgKzQzMCwyOCBAQAogfQogCiAvKiBHZXQgY3VycmVudCBwZXJmLXByb2JlIGV2ZW50IG5hbWVzICovCi1zdGF0aWMgc3RydWN0IHN0cmxpc3QgKmdldF9wZXJmX2V2ZW50X25hbWVzKGludCBmZCkKK3N0YXRpYyBzdHJ1Y3Qgc3RybGlzdCAqZ2V0X3BlcmZfZXZlbnRfbmFtZXMoaW50IGZkLCBib29sIGluY2x1ZGVfZ3JvdXApCiB7CiAJdW5zaWduZWQgaW50IGk7CiAJY2hhciAqZ3JvdXAsICpldmVudDsKKwljaGFyIGJ1ZlsxMjhdOwogCXN0cnVjdCBzdHJsaXN0ICpzbCwgKnJhd2xpc3Q7CiAJc3RydWN0IHN0cl9ub2RlICplbnQ7CiAKIAlyYXdsaXN0ID0gZ2V0X3RyYWNlX2twcm9iZV9ldmVudF9yYXdsaXN0KGZkKTsKIAotCXNsID0gc3RybGlzdF9fbmV3KGZhbHNlLCBOVUxMKTsKKwlzbCA9IHN0cmxpc3RfX25ldyh0cnVlLCBOVUxMKTsKIAlmb3IgKGkgPSAwOyBpIDwgc3RybGlzdF9fbnJfZW50cmllcyhyYXdsaXN0KTsgaSsrKSB7CiAJCWVudCA9IHN0cmxpc3RfX2VudHJ5KHJhd2xpc3QsIGkpOwogCQlwYXJzZV90cmFjZV9rcHJvYmVfZXZlbnQoZW50LT5zLCAmZ3JvdXAsICZldmVudCwgTlVMTCk7Ci0JCXN0cmxpc3RfX2FkZChzbCwgZXZlbnQpOworCQlpZiAoaW5jbHVkZV9ncm91cCkgeworCQkJaWYgKGVfc25wcmludGYoYnVmLCAxMjgsICIlczolcyIsIGdyb3VwLCBldmVudCkgPCAwKQorCQkJCWRpZSgiRmFpbGVkIHRvIGNvcHkgZ3JvdXA6ZXZlbnQgbmFtZS4iKTsKKwkJCXN0cmxpc3RfX2FkZChzbCwgYnVmKTsKKwkJfSBlbHNlCisJCQlzdHJsaXN0X19hZGQoc2wsIGV2ZW50KTsKIAkJZnJlZShncm91cCk7CisJCWZyZWUoZXZlbnQpOwogCX0KIAogCXN0cmxpc3RfX2RlbGV0ZShyYXdsaXN0KTsKQEAgLTQyNiwyNCArNDU5LDMwIEBACiAJcmV0dXJuIHNsOwogfQogCi1zdGF0aWMgaW50IHdyaXRlX3RyYWNlX2twcm9iZV9ldmVudChpbnQgZmQsIGNvbnN0IGNoYXIgKmJ1ZikKK3N0YXRpYyB2b2lkIHdyaXRlX3RyYWNlX2twcm9iZV9ldmVudChpbnQgZmQsIGNvbnN0IGNoYXIgKmJ1ZikKIHsKIAlpbnQgcmV0OwogCisJcHJfZGVidWcoIldyaXRpbmcgZXZlbnQ6ICVzXG4iLCBidWYpOwogCXJldCA9IHdyaXRlKGZkLCBidWYsIHN0cmxlbihidWYpKTsKIAlpZiAocmV0IDw9IDApCi0JCWRpZSgiRmFpbGVkIHRvIGNyZWF0ZSBldmVudC4iKTsKLQllbHNlCi0JCXByaW50ZigiQWRkZWQgbmV3IGV2ZW50OiAlc1xuIiwgYnVmKTsKLQotCXJldHVybiByZXQ7CisJCWRpZSgiRmFpbGVkIHRvIHdyaXRlIGV2ZW50OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGdldF9uZXdfZXZlbnRfbmFtZShjaGFyICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKmJhc2UsCiAJCQkgICAgICAgc3RydWN0IHN0cmxpc3QgKm5hbWVsaXN0KQogewogCWludCBpLCByZXQ7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9FVkVOVF9JTkRFWDsgaSsrKSB7CisKKwkvKiBUcnkgbm8gc3VmZml4ICovCisJcmV0ID0gZV9zbnByaW50ZihidWYsIGxlbiwgIiVzIiwgYmFzZSk7CisJaWYgKHJldCA8IDApCisJCWRpZSgic25wcmludGYoKSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoLXJldCkpOworCWlmICghc3RybGlzdF9faGFzX2VudHJ5KG5hbWVsaXN0LCBidWYpKQorCQlyZXR1cm47CisKKwkvKiBUcnkgdG8gYWRkIHN1ZmZpeCAqLworCWZvciAoaSA9IDE7IGkgPCBNQVhfRVZFTlRfSU5ERVg7IGkrKykgewogCQlyZXQgPSBlX3NucHJpbnRmKGJ1ZiwgbGVuLCAiJXNfJWQiLCBiYXNlLCBpKTsKIAkJaWYgKHJldCA8IDApCiAJCQlkaWUoInNucHJpbnRmKCkgZmFpbGVkOiAlcyIsIHN0cmVycm9yKC1yZXQpKTsKQEAgLTQ2NCw3ICs1MDMsNyBAQAogCiAJZmQgPSBvcGVuX2twcm9iZV9ldmVudHMoT19SRFdSLCBPX0FQUEVORCk7CiAJLyogR2V0IGN1cnJlbnQgZXZlbnQgbmFtZXMgKi8KLQluYW1lbGlzdCA9IGdldF9wZXJmX2V2ZW50X25hbWVzKGZkKTsKKwluYW1lbGlzdCA9IGdldF9wZXJmX2V2ZW50X25hbWVzKGZkLCBmYWxzZSk7CiAKIAlmb3IgKGogPSAwOyBqIDwgbnJfcHJvYmVzOyBqKyspIHsKIAkJcHAgPSBwcm9iZXMgKyBqOwpAQCAtNDc2LDkgKzUxNSw3MyBAQAogCQkJCSBQRVJGUFJPQkVfR1JPVVAsIGV2ZW50LAogCQkJCSBwcC0+cHJvYmVzW2ldKTsKIAkJCXdyaXRlX3RyYWNlX2twcm9iZV9ldmVudChmZCwgYnVmKTsKKwkJCXByaW50ZigiQWRkZWQgbmV3IGV2ZW50OlxuIik7CisJCQkvKiBHZXQgdGhlIGZpcnN0IHBhcmFtZXRlciAocHJvYmUtcG9pbnQpICovCisJCQlzc2NhbmYocHAtPnByb2Jlc1tpXSwgIiVzIiwgYnVmKTsKKwkJCXNob3dfcGVyZl9wcm9iZV9ldmVudChQRVJGUFJPQkVfR1JPVVAsIGV2ZW50LAorCQkJCQkgICAgICBidWYsIHBwKTsKIAkJCS8qIEFkZCBhZGRlZCBldmVudCBuYW1lIHRvIG5hbWVsaXN0ICovCiAJCQlzdHJsaXN0X19hZGQobmFtZWxpc3QsIGV2ZW50KTsKIAkJfQogCX0KKwkvKiBTaG93IGhvdyB0byB1c2UgdGhlIGV2ZW50LiAqLworCXByaW50ZigiXG5Zb3UgY2FuIG5vdyB1c2UgaXQgb24gYWxsIHBlcmYgdG9vbHMsIHN1Y2ggYXM6XG5cbiIpOworCXByaW50ZigiXHRwZXJmIHJlY29yZCAtZSAlczolcyAtYSBzbGVlcCAxXG5cbiIsIFBFUkZQUk9CRV9HUk9VUCwgZXZlbnQpOworCisJc3RybGlzdF9fZGVsZXRlKG5hbWVsaXN0KTsKIAljbG9zZShmZCk7CiB9CisKK3N0YXRpYyB2b2lkIGRlbF90cmFjZV9rcHJvYmVfZXZlbnQoaW50IGZkLCBjb25zdCBjaGFyICpncm91cCwKKwkJCQkgICBjb25zdCBjaGFyICpldmVudCwgc3RydWN0IHN0cmxpc3QgKm5hbWVsaXN0KQoreworCWNoYXIgYnVmWzEyOF07CisKKwlpZiAoZV9zbnByaW50ZihidWYsIDEyOCwgIiVzOiVzIiwgZ3JvdXAsIGV2ZW50KSA8IDApCisJCWRpZSgiRmFpbGVkIHRvIGNvcHkgZXZlbnQuIik7CisJaWYgKCFzdHJsaXN0X19oYXNfZW50cnkobmFtZWxpc3QsIGJ1ZikpIHsKKwkJcHJfd2FybmluZygiV2FybmluZzogZXZlbnQgXCIlc1wiIGlzIG5vdCBmb3VuZC5cbiIsIGJ1Zik7CisJCXJldHVybjsKKwl9CisJLyogQ29udmVydCBmcm9tIHBlcmYtcHJvYmUgZXZlbnQgdG8gdHJhY2Uta3Byb2JlIGV2ZW50ICovCisJaWYgKGVfc25wcmludGYoYnVmLCAxMjgsICItOiVzLyVzIiwgZ3JvdXAsIGV2ZW50KSA8IDApCisJCWRpZSgiRmFpbGVkIHRvIGNvcHkgZXZlbnQuIik7CisKKwl3cml0ZV90cmFjZV9rcHJvYmVfZXZlbnQoZmQsIGJ1Zik7CisJcHJpbnRmKCJSZW1vdmUgZXZlbnQ6ICVzOiVzXG4iLCBncm91cCwgZXZlbnQpOworfQorCit2b2lkIGRlbF90cmFjZV9rcHJvYmVfZXZlbnRzKHN0cnVjdCBzdHJsaXN0ICpkZWxsaXN0KQoreworCWludCBmZDsKKwl1bnNpZ25lZCBpbnQgaTsKKwljb25zdCBjaGFyICpncm91cCwgKmV2ZW50OworCWNoYXIgKnAsICpzdHI7CisJc3RydWN0IHN0cl9ub2RlICplbnQ7CisJc3RydWN0IHN0cmxpc3QgKm5hbWVsaXN0OworCisJZmQgPSBvcGVuX2twcm9iZV9ldmVudHMoT19SRFdSLCBPX0FQUEVORCk7CisJLyogR2V0IGN1cnJlbnQgZXZlbnQgbmFtZXMgKi8KKwluYW1lbGlzdCA9IGdldF9wZXJmX2V2ZW50X25hbWVzKGZkLCB0cnVlKTsKKworCWZvciAoaSA9IDA7IGkgPCBzdHJsaXN0X19ucl9lbnRyaWVzKGRlbGxpc3QpOyBpKyspIHsKKwkJZW50ID0gc3RybGlzdF9fZW50cnkoZGVsbGlzdCwgaSk7CisJCXN0ciA9IHN0cmR1cChlbnQtPnMpOworCQlpZiAoIXN0cikKKwkJCWRpZSgiRmFpbGVkIHRvIGNvcHkgZXZlbnQuIik7CisJCXAgPSBzdHJjaHIoc3RyLCAnOicpOworCQlpZiAocCkgeworCQkJZ3JvdXAgPSBzdHI7CisJCQkqcCA9ICdcMCc7CisJCQlldmVudCA9IHAgKyAxOworCQl9IGVsc2UgeworCQkJZ3JvdXAgPSBQRVJGUFJPQkVfR1JPVVA7CisJCQlldmVudCA9IHN0cjsKKwkJfQorCQlkZWxfdHJhY2Vfa3Byb2JlX2V2ZW50KGZkLCBncm91cCwgZXZlbnQsIG5hbWVsaXN0KTsKKwkJZnJlZShzdHIpOworCX0KKwlzdHJsaXN0X19kZWxldGUobmFtZWxpc3QpOworCWNsb3NlKGZkKTsKK30KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmggYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaAppbmRleCAwYzZmZTU2Li5mNzUyMTU5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaAorKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaApAQCAtMTAsNiArMTAsNyBAQAogCQkJCSAgICAgY2hhciAqKmV2ZW50LCBzdHJ1Y3QgcHJvYmVfcG9pbnQgKnBwKTsKIGV4dGVybiBpbnQgc3ludGhlc2l6ZV90cmFjZV9rcHJvYmVfZXZlbnQoc3RydWN0IHByb2JlX3BvaW50ICpwcCk7CiBleHRlcm4gdm9pZCBhZGRfdHJhY2Vfa3Byb2JlX2V2ZW50cyhzdHJ1Y3QgcHJvYmVfcG9pbnQgKnByb2JlcywgaW50IG5yX3Byb2Jlcyk7CitleHRlcm4gdm9pZCBkZWxfdHJhY2Vfa3Byb2JlX2V2ZW50cyhzdHJ1Y3Qgc3RybGlzdCAqZGVsbGlzdCk7CiBleHRlcm4gdm9pZCBzaG93X3BlcmZfcHJvYmVfZXZlbnRzKHZvaWQpOwogCiAvKiBNYXhpbXVtIGluZGV4IG51bWJlciBvZiBldmVudC1uYW1lIHBvc3RmaXggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuYwppbmRleCAyOTNjZGZjLi40NTg1ZjFkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIHsKIAlpbnQgaTEgPSBzdHJsZW4oczEpOwogCWludCBpMiA9IHN0cmxlbihzMik7Ci0Jd2hpbGUgKC0taTEgPiAwICYmIC0taTIgPiAwKSB7CisJd2hpbGUgKC0taTEgPj0gMCAmJiAtLWkyID49IDApIHsKIAkJaWYgKHMxW2kxXSAhPSBzMltpMl0pCiAJCQlyZXR1cm4gczFbaTFdIC0gczJbaTJdOwogCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYwppbmRleCBmZmZjYjkzLi5lNzUwOGFkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jCkBAIC05MzgsOCArOTM4LDkgQEAKIAogYm9vbCBkc29zX19yZWFkX2J1aWxkX2lkcyh2b2lkKQogewotCXJldHVybiBfX2Rzb3NfX3JlYWRfYnVpbGRfaWRzKCZkc29zX19rZXJuZWwpIHx8Ci0JICAgICAgIF9fZHNvc19fcmVhZF9idWlsZF9pZHMoJmRzb3NfX3VzZXIpOworCWJvb2wga2J1aWxkaWRzID0gX19kc29zX19yZWFkX2J1aWxkX2lkcygmZHNvc19fa2VybmVsKSwKKwkgICAgIHVidWlsZGlkcyA9IF9fZHNvc19fcmVhZF9idWlsZF9pZHMoJmRzb3NfX3VzZXIpOworCXJldHVybiBrYnVpbGRpZHMgfHwgdWJ1aWxkaWRzOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMgYi90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtcGFyc2UuYwppbmRleCAwMzAyNDA1Li5jNWMzMmJlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtcGFyc2UuYworKysgYi90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtcGFyc2UuYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJCWZ1bmNfY291bnQrKzsKIAl9CiAKLQlmdW5jX2xpc3QgPSBtYWxsb2Nfb3JfZGllKHNpemVvZigqZnVuY19saXN0KSAqIGZ1bmNfY291bnQgKyAxKTsKKwlmdW5jX2xpc3QgPSBtYWxsb2Nfb3JfZGllKHNpemVvZigqZnVuY19saXN0KSAqIChmdW5jX2NvdW50ICsgMSkpOwogCiAJaSA9IDA7CiAJd2hpbGUgKGxpc3QpIHsKQEAgLTE0NzcsNyArMTQ3Nyw3IEBACiAJCQlnb3RvIG91dF9mcmVlOwogCiAJCWZpZWxkID0gbWFsbG9jX29yX2RpZShzaXplb2YoKmZpZWxkKSk7Ci0JCW1lbXNldChmaWVsZCwgMCwgc2l6ZW9mKGZpZWxkKSk7CisJCW1lbXNldChmaWVsZCwgMCwgc2l6ZW9mKCpmaWVsZCkpOwogCiAJCXZhbHVlID0gYXJnX2V2YWwoYXJnKTsKIAkJZmllbGQtPnZhbHVlID0gc3RyZHVwKHZhbHVlKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wZXJsLmMgYi90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtcGVybC5jCmluZGV4IDUxZTgzM2YuLmE1ZmZlNjAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wZXJsLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBlcmwuYwpAQCAtMzIsOSArMzIsNiBAQAogCiB2b2lkIHhzX2luaXQocFRIWCk7CiAKLXZvaWQgYm9vdF9QZXJmX19UcmFjZV9fQ29udGV4dChwVEhYXyBDViAqY3YpOwotdm9pZCBib290X0R5bmFMb2FkZXIocFRIWF8gQ1YgKmN2KTsKLQogdm9pZCB4c19pbml0KHBUSFgpCiB7CiAJY29uc3QgY2hhciAqZmlsZSA9IF9fRklMRV9fOwpAQCAtNTczLDI2ICs1NzAsNzIgQEAKIAkuZ2VuZXJhdGVfc2NyaXB0ID0gcGVybF9nZW5lcmF0ZV9zY3JpcHQsCiB9OwogCi0jaWZkZWYgTk9fTElCUEVSTAotdm9pZCBzZXR1cF9wZXJsX3NjcmlwdGluZyh2b2lkKQorc3RhdGljIHZvaWQgcHJpbnRfdW5zdXBwb3J0ZWRfbXNnKHZvaWQpCiB7CiAJZnByaW50ZihzdGRlcnIsICJQZXJsIHNjcmlwdGluZyBub3Qgc3VwcG9ydGVkLiIKLQkJIiAgSW5zdGFsbCBsaWJwZXJsIGFuZCByZWJ1aWxkIHBlcmYgdG8gZW5hYmxlIGl0LiAgZS5nLiAiCi0JCSJhcHQtZ2V0IGluc3RhbGwgbGlicGVybC1kZXYgKHVidW50dSksIHl1bSBpbnN0YWxsICIKLQkJInBlcmwtRXh0VXRpbHMtRW1iZWQgKEZlZG9yYSksIGV0Yy5cbiIpOworCQkiICBJbnN0YWxsIGxpYnBlcmwgYW5kIHJlYnVpbGQgcGVyZiB0byBlbmFibGUgaXQuXG4iCisJCSJGb3IgZXhhbXBsZTpcbiAgIyBhcHQtZ2V0IGluc3RhbGwgbGlicGVybC1kZXYgKHVidW50dSkiCisJCSJcbiAgIyB5dW0gaW5zdGFsbCBwZXJsLUV4dFV0aWxzLUVtYmVkIChGZWRvcmEpIgorCQkiXG4gIGV0Yy5cbiIpOwogfQotI2Vsc2UKLXZvaWQgc2V0dXBfcGVybF9zY3JpcHRpbmcodm9pZCkKKworc3RhdGljIGludCBwZXJsX3N0YXJ0X3NjcmlwdF91bnN1cHBvcnRlZChjb25zdCBjaGFyICpzY3JpcHQgX191bnVzZWQpCit7CisJcHJpbnRfdW5zdXBwb3J0ZWRfbXNnKCk7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcGVybF9zdG9wX3NjcmlwdF91bnN1cHBvcnRlZCh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwZXJsX3Byb2Nlc3NfZXZlbnRfdW5zdXBwb3J0ZWQoaW50IGNwdSBfX3VudXNlZCwKKwkJCQkJICAgdm9pZCAqZGF0YSBfX3VudXNlZCwKKwkJCQkJICAgaW50IHNpemUgX191bnVzZWQsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgbG9uZyBuc2VjcyBfX3VudXNlZCwKKwkJCQkJICAgY2hhciAqY29tbSBfX3VudXNlZCkKK3sKK30KKworc3RhdGljIGludCBwZXJsX2dlbmVyYXRlX3NjcmlwdF91bnN1cHBvcnRlZChjb25zdCBjaGFyICpvdXRmaWxlIF9fdW51c2VkKQoreworCXByaW50X3Vuc3VwcG9ydGVkX21zZygpOworCisJcmV0dXJuIC0xOworfQorCitzdHJ1Y3Qgc2NyaXB0aW5nX29wcyBwZXJsX3NjcmlwdGluZ191bnN1cHBvcnRlZF9vcHMgPSB7CisJLm5hbWUgPSAiUGVybCIsCisJLnN0YXJ0X3NjcmlwdCA9IHBlcmxfc3RhcnRfc2NyaXB0X3Vuc3VwcG9ydGVkLAorCS5zdG9wX3NjcmlwdCA9IHBlcmxfc3RvcF9zY3JpcHRfdW5zdXBwb3J0ZWQsCisJLnByb2Nlc3NfZXZlbnQgPSBwZXJsX3Byb2Nlc3NfZXZlbnRfdW5zdXBwb3J0ZWQsCisJLmdlbmVyYXRlX3NjcmlwdCA9IHBlcmxfZ2VuZXJhdGVfc2NyaXB0X3Vuc3VwcG9ydGVkLAorfTsKKworc3RhdGljIHZvaWQgcmVnaXN0ZXJfcGVybF9zY3JpcHRpbmcoc3RydWN0IHNjcmlwdGluZ19vcHMgKnNjcmlwdGluZ19vcHMpCiB7CiAJaW50IGVycjsKLQllcnIgPSBzY3JpcHRfc3BlY19yZWdpc3RlcigiUGVybCIsICZwZXJsX3NjcmlwdGluZ19vcHMpOworCWVyciA9IHNjcmlwdF9zcGVjX3JlZ2lzdGVyKCJQZXJsIiwgc2NyaXB0aW5nX29wcyk7CiAJaWYgKGVycikKIAkJZGllKCJlcnJvciByZWdpc3RlcmluZyBQZXJsIHNjcmlwdCBleHRlbnNpb24iKTsKIAotCWVyciA9IHNjcmlwdF9zcGVjX3JlZ2lzdGVyKCJwbCIsICZwZXJsX3NjcmlwdGluZ19vcHMpOworCWVyciA9IHNjcmlwdF9zcGVjX3JlZ2lzdGVyKCJwbCIsIHNjcmlwdGluZ19vcHMpOwogCWlmIChlcnIpCiAJCWRpZSgiZXJyb3IgcmVnaXN0ZXJpbmcgcGwgc2NyaXB0IGV4dGVuc2lvbiIpOwogCiAJc2NyaXB0aW5nX2NvbnRleHQgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY3JpcHRpbmdfY29udGV4dCkpOwogfQorCisjaWZkZWYgTk9fTElCUEVSTAordm9pZCBzZXR1cF9wZXJsX3NjcmlwdGluZyh2b2lkKQoreworCXJlZ2lzdGVyX3Blcmxfc2NyaXB0aW5nKCZwZXJsX3NjcmlwdGluZ191bnN1cHBvcnRlZF9vcHMpOworfQorI2Vsc2UKK3ZvaWQgc2V0dXBfcGVybF9zY3JpcHRpbmcodm9pZCkKK3sKKwlyZWdpc3Rlcl9wZXJsX3NjcmlwdGluZygmcGVybF9zY3JpcHRpbmdfb3BzKTsKK30KICNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBlcmwuaCBiL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wZXJsLmgKaW5kZXggOGZlMGQ4Ni4uZTg4ZmIyNiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBlcmwuaAorKysgYi90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtcGVybC5oCkBAIC0zNCw5ICszNCwxMyBAQAogI2RlZmluZSBkWFNVQl9TWVMKICNkZWZpbmUgcFRIWF8KIHN0YXRpYyBpbmxpbmUgdm9pZCBuZXdYUyhjb25zdCBjaGFyICphLCB2b2lkICpiLCBjb25zdCBjaGFyICpjKSB7fQorc3RhdGljIHZvaWQgYm9vdF9QZXJmX19UcmFjZV9fQ29udGV4dChwVEhYXyBDViAqY3YpIHt9CitzdGF0aWMgdm9pZCBib290X0R5bmFMb2FkZXIocFRIWF8gQ1YgKmN2KSB7fQogI2Vsc2UKICNpbmNsdWRlIDxFWFRFUk4uaD4KICNpbmNsdWRlIDxwZXJsLmg+Cit2b2lkIGJvb3RfUGVyZl9fVHJhY2VfX0NvbnRleHQocFRIWF8gQ1YgKmN2KTsKK3ZvaWQgYm9vdF9EeW5hTG9hZGVyKHBUSFhfIENWICpjdik7CiB0eXBlZGVmIFBlcmxJbnRlcnByZXRlciAqIElOVEVSUDsKICNlbmRpZgogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtcmVhZC5jIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXJlYWQuYwppbmRleCAzNDJkZmRkLi4xNzQ0NDIyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtcmVhZC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1yZWFkLmMKQEAgLTE0NSw4ICsxNDUsOSBAQAogCWlmICghc2l6ZSkKIAkJcmV0dXJuOwogCi0JYnVmID0gbWFsbG9jX29yX2RpZShzaXplKTsKKwlidWYgPSBtYWxsb2Nfb3JfZGllKHNpemUgKyAxKTsKIAlyZWFkX29yX2RpZShidWYsIHNpemUpOworCWJ1ZltzaXplXSA9ICdcMCc7CiAKIAlwYXJzZV9wcm9jX2thbGxzeW1zKGJ1Ziwgc2l6ZSk7CiAK